Current File : /home/mmdealscpanel/yummmdeals.com/share.zip
PK�^���man/man1/php-cgi.1nu�[���.so man1/php.1
PK�^[�ga�X
X
man/man1/phpdbg.1nu�[���.TH phpdbg 1 "2024" "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 \-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 \-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 https://github.com/php/php-src/issues
.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.3.24.
.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 https://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.
PK�^^����man/man1/phpize.1nu�[���.TH phpize 1 "2024" "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.3.24.
.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 https://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.
PK�^[�Dߛ��man/man1/php-config.1nu�[���.TH php\-config 1 "2024" "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.3.24.
.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 https://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.
PK�^[�j�*�*man/man1/phar.1nu�[���.TH PHAR 1 "2024" "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 using SHA-1
.TP
.PD
.B openssl_sha256
OpenSSL using SHA-256
.TP
.PD
.B openssl_sha512
OpenSSL using SHA-512

.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 https://github.com/php/php-src/issues
.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.3.24.
.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 https://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.
PK�^[��@�&�&man/man1/php.1nu�[���.TH php 1 "2024" "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 a PHP file is provided to the command line when the
built-in web server is used, it will be used as the router script. This script
will be started at each HTTP request. The script output is returned to the
browser, unless the router script returns the
.B false
value. If so, the built-in server falls back to the default behaviour, returning
the requested resource as-is by looking up the files relative to the document
root specified by the \-t option, if provided.
.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 https://github.com/php/php-src/issues
.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.3.24.
.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 https://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.
PK�^\u-man/man1/phar.phar.1nu�[���.so man1/phar.1
PK�^[󍖁��man/man8/php-fpm.8nu�[���.TH PHP-FPM 8 "2024" "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/php83/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
.TP
.PD 0
.B \-\-prefix \fIpath\fP
.TP
.PD 1
.B \-p
Specify alternative prefix path (the default is /opt/alt/php83)
.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/php83/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 https://github.com/php/php-src/issues
.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.3.24.
.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 https://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.
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�^A��??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�^[�l�licenses/alt-php84-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-php84-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�^[
pear/.locknu�[���PK�^yv�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;
    }
}
?>
PK�^[�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);
    }
    /* }}} */
}
?>
PK�^[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);
    }
    /* }}} */
}
/* }}} */
?>
PK�^[~(�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;
    }
}
?>
PK�^[�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:
 */
PK�^[����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;
            }
        }
    }
}
PK�^[�`�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;
    }
}
PK�^[��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();
    }
}PK�^"����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();
    }
}
PK�^[��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;
    }
}PK�^֣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>PK�^[�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;
    }
}
PK�^[݄<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>PK�^[,��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;
    }
}
PK�^[
�\���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>PK�^���!�!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>PK�^[�%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;
    }
}
PK�^mi?;�;�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;
    }
}
PK�^[�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);
    }
}
PK�^[���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>PK�^[�%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>PK�^ 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>PK�^[�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>PK�^[+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;
    }
}
PK�^[
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>PK�^[�����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;
    }
}
PK�^[,_�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');
    }
}
PK�^[�%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);
    }
}
PK�^[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');
    }
}
PK�^[�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>PK�^[��#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');
        }
    }
}
PK�^[���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>PK�^[�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('.');
    }
}
PK�^[��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);
    }
}
PK�^[[
�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;
    }
}PK�^(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;
    }
}
PK�^[�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'));
?>
PK�^[(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;
    }
}
PK�^[��'����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);
        }
    }
}
PK�^�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;
    }
}
?>PK�^�����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)));
    }
}
PK�^[��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;
    }
}
?>
PK�^�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;
    }
}
PK�^[���=_�_�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']);
    }
}PK�^[�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);
        }
    }

    // }}}
}
?>
PK�^[�ɁɁ&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;
    }
}
PK�^[`�=����&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;
    }
}
?>
PK�^[��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;
    }
}PK�^[�_=�@�@#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;
        }
    }

    // }}}
}
?>PK�^��__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
            );
        }
    }
}
PK�^[�@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;
    }
}PK�^[��_�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;
    }
    // }}}
}PK�^[�ٲ�=�=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;
    }
}
PK�^[�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;
    }
}
PK�^[&%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 '';
    }
}
?>
PK�^[�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;
    }
}
PK�^[&
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,
            );
    }
}
PK�^[�-!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);
    }
}
PK�^[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);
    }
}
PK�^�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)
    {
    }
}
PK�^[\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 '';
    }
}
?>
PK�^[�����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);
    }
}
PK�^[�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;
        }
    }
}
PK�^[��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;
    }
}PK�^[,#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);
    }
}
?>
PK�^[��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;
    }
}PK�^[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';
PK�^[$���(�(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;
    }
}
PK�^[��	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;
    }
}
PK�^[��

 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 {}
?>PK�^[��/�� 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>PK�^[>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>PK�^[�?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 {}
?>PK�^[*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 {}
?>
PK�^[���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>PK�^��"" 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>PK�^&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>PK�^[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>PK�^�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>PK�^[	��
!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 {}
?>PK�^[�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>
PK�^[��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 {}
?>PK�^���!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 {}
?>PK�^[@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>PK�^�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>PK�^[?���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'];
    }
}
?>
PK�^[�^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 {}
?>PK�^[�Ƥ 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;
    }
}PK�^[��[�#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 {}
?>PK�^[��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++;
    }
}
?>PK�^�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;
    }
}PK�^[�{�	�)�) 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;
    }
}
PK�^[.�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())
    {
    }
}
PK�^[،�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');
        }
    }

    // }}}
}
PK�^[���=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;
    }
}
PK�^[��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');
    }
}
?>
PK�^[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());
    }
}
?>
PK�^[�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;
    }
}
PK�^[���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'
        );
    }
}
?>
PK�^[�-�ii+pear/test/Structures_Graph/tests/helper.incnu�[���<?php
if ('/opt/alt/php83/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';
PK�^[����.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
PK�^[��,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] => -
        )

)PK�^[���,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
FATALPK�^[��|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
        )

)
PK�^[.��
��'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";
}
PK�^[|�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';
PK�^[�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";
PK�^[�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";
}
PK�^[��̢�	�	!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';
PK�^����"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;
}
PK�^[���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";
PK�^[$]���'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';
PK�^��)))*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);
PK�^�>��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));
    }
}
PK�^[�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));
    }
}
PK�^[ی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());
    }
}PK�^[�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.");
    }
}
PK�^��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));
    }
}
PK�^[|�\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));
    }
}
PK�^[��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));
    }
}
PK�^q���*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));
    }
}
PK�^[>�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.");
    }
}
PK�^[�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));
    }
}
PK�^[ܬ$���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));
    }
}
PK�^[��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.");
    }
}
PK�^[��۩��*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.");
    }
}
PK�^��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));
    }
}
PK�^[~�$[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));
    }
}
PK�^[���!��.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();
    }
}
PK�^[�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));
    }
}
PK�^f:��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));
    }
}
PK�^�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));
    }
}
PK�^[ݑ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());
    }
}
PK�^[���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));
    }
}
PK�^[�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());
    }
}
PK�^[�'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:
 */
PK�^[�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;
    }
}
PK�^[.�Occpear/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/php83/usr/share/pear ' != '@'.'include_path'.'@ ') {
    ini_set('include_path', trim('/opt/alt/php83/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

?>
PK�^[ũ�

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>


PK�^[������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@
    /
PK�^[�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";}}PK�^[��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:1747073220;}PK�^q�++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:1747073220;}PK�^[�o/�!pear/.channels/.alias/phpdocs.txtnu�[���doc.php.netPK�^[� ��pear/.channels/.alias/pear.txtnu�[���pear.php.netPK�^i<�pear/.channels/.alias/pecl.txtnu�[���pecl.php.netPK�^[)�ȣ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:1747073220;}PK�^[d�X((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:1747073220;}PK�^[��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;
    }

}
PK�^[�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>
PK�^[/N�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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/usr/share/pear/XML/Util.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:5:{s:51:"/opt/alt/php83/usr/share/doc/pear/XML_Util/examples";b:1;s:42:"/opt/alt/php83/usr/share/doc/pear/XML_Util";b:1;s:49:"/opt/alt/php83/usr/share/pear/test/XML_Util/tests";b:1;s:43:"/opt/alt/php83/usr/share/pear/test/XML_Util";b:1;s:33:"/opt/alt/php83/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:1747073220;}PK�^[�a�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/php83/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/php83/usr/share/doc/pear/Archive_Tar/docs/Archive_Tar.txt";}}s:12:"_lastversion";N;s:7:"dirtree";a:3:{s:37:"/opt/alt/php83/usr/share/pear/Archive";b:1;s:50:"/opt/alt/php83/usr/share/doc/pear/Archive_Tar/docs";b:1;s:45:"/opt/alt/php83/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:1747073220;}PK�^[�W�)�)!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/php83/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/php83/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/php83/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/php83/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/php83/usr/share/pear/test/Console_Getopt/tests/bug13140.phpt";}}s:12:"_lastversion";N;s:7:"dirtree";a:3:{s:37:"/opt/alt/php83/usr/share/pear/Console";b:1;s:55:"/opt/alt/php83/usr/share/pear/test/Console_Getopt/tests";b:1;s:49:"/opt/alt/php83/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:1747073220;}PK�^[�U��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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/usr/share/pear/PEAR/XMLParser.php";}s:15:"scripts/pear.sh";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"d5de9f6fc29383f8f4e284627abb8714";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/php83/usr/bin/pear";}s:18:"scripts/peardev.sh";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"2f1ef2f2d9a67cff5b56058390f2dff2";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/php83/usr/bin/peardev";}s:15:"scripts/pecl.sh";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"e8b69759c986876f06d5fce0b30240e4";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/php83/usr/bin/pecl";}s:19:"scripts/pearcmd.php";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"457063996c32c6b464d553f4267708aa";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/php83/usr/share/pear/pearcmd.php";}s:19:"scripts/peclcmd.php";a:6:{s:14:"baseinstalldir";s:1:"/";s:6:"md5sum";s:32:"aa0b3f34342aad6a5f9d74567a8fc679";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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/usr/share/pear/data/PEAR/template.spec";}}s:12:"_lastversion";N;s:7:"dirtree";a:23:{s:32:"/opt/alt/php83/usr/share/pear/OS";b:1;s:46:"/opt/alt/php83/usr/share/pear/PEAR/ChannelFile";b:1;s:34:"/opt/alt/php83/usr/share/pear/PEAR";b:1;s:42:"/opt/alt/php83/usr/share/pear/PEAR/Command";b:1;s:45:"/opt/alt/php83/usr/share/pear/PEAR/Downloader";b:1;s:43:"/opt/alt/php83/usr/share/pear/PEAR/Frontend";b:1;s:49:"/opt/alt/php83/usr/share/pear/PEAR/Installer/Role";b:1;s:44:"/opt/alt/php83/usr/share/pear/PEAR/Installer";b:1;s:56:"/opt/alt/php83/usr/share/pear/PEAR/PackageFile/Generator";b:1;s:46:"/opt/alt/php83/usr/share/pear/PEAR/PackageFile";b:1;s:53:"/opt/alt/php83/usr/share/pear/PEAR/PackageFile/Parser";b:1;s:49:"/opt/alt/php83/usr/share/pear/PEAR/PackageFile/v2";b:1;s:39:"/opt/alt/php83/usr/share/pear/PEAR/REST";b:1;s:57:"/opt/alt/php83/usr/share/pear/PEAR/Task/Postinstallscript";b:1;s:39:"/opt/alt/php83/usr/share/pear/PEAR/Task";b:1;s:47:"/opt/alt/php83/usr/share/pear/PEAR/Task/Replace";b:1;s:47:"/opt/alt/php83/usr/share/pear/PEAR/Task/Unixeol";b:1;s:50:"/opt/alt/php83/usr/share/pear/PEAR/Task/Windowseol";b:1;s:44:"/opt/alt/php83/usr/share/pear/PEAR/Validator";b:1;s:22:"/opt/alt/php83/usr/bin";b:1;s:29:"/opt/alt/php83/usr/share/pear";b:1;s:38:"/opt/alt/php83/usr/share/doc/pear/PEAR";b:1;s:39:"/opt/alt/php83/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:1747073220;}PK�^C9�++#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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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:"99c4315a5abb45429c13b91f7d64e3bf";s:4:"name";s:16:"tests/helper.inc";s:4:"role";s:4:"test";s:12:"installed_as";s:68:"/opt/alt/php83/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/php83/usr/share/doc/pear/Structures_Graph/LICENSE";}}s:12:"_lastversion";N;s:7:"dirtree";a:9:{s:82:"/opt/alt/php83/usr/share/doc/pear/Structures_Graph/docs/tutorials/Structures_Graph";b:1;s:65:"/opt/alt/php83/usr/share/doc/pear/Structures_Graph/docs/tutorials";b:1;s:55:"/opt/alt/php83/usr/share/doc/pear/Structures_Graph/docs";b:1;s:50:"/opt/alt/php83/usr/share/doc/pear/Structures_Graph";b:1;s:58:"/opt/alt/php83/usr/share/pear/Structures/Graph/Manipulator";b:1;s:46:"/opt/alt/php83/usr/share/pear/Structures/Graph";b:1;s:40:"/opt/alt/php83/usr/share/pear/Structures";b:1;s:57:"/opt/alt/php83/usr/share/pear/test/Structures_Graph/tests";b:1;s:51:"/opt/alt/php83/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:1747073220;}PK�^[�1oO1{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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/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/php83/usr/share/pear/XML/RPC/Server.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:4:{s:48:"/opt/alt/php83/usr/share/pear/test/XML_RPC/tests";b:1;s:42:"/opt/alt/php83/usr/share/pear/test/XML_RPC";b:1;s:33:"/opt/alt/php83/usr/share/pear/XML";b:1;s:37:"/opt/alt/php83/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:1747073220;}PK�^�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:
 */

?>
PK�^oK��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:
 */

?>
PK�^[�/=�����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:
 */

?>
PK�^[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);
    }
}
?>
PK�^[��&��:�: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/php83/usr/share/pear ' != '@'.'include_path'.'@ ') {
    ini_set('include_path', trim('/opt/alt/php83/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
PK�^��^0,0,+doc/alt-php84-ioncube-loader/USER-GUIDE.txtnu�[���ionCube Loader 14.4 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.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. 2025
PK�^[}��6�6�+doc/alt-php84-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:20250130155421Z)
>>
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  
131.750000  0]
endobj
12 0 obj
[0 /XYZ 33  
296  0]
endobj
13 0 obj
[0 /XYZ 33  
97.2500000  0]
endobj
14 0 obj
<<
/Type /Annot
/Subtype /Link
/Rect [71.2500000  66.5000000  144.750000  75.5000000 ]
/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��][��8v~�_��FI���@w� �0l A�l���8;��Ϗ.TU�򱪾�(���H�\lR���_�ۗo��#y����|�r�RSd�I���ej�'�P�{��Ï�����s�����~�n�|���{ޡ������/�ɿ��{�_�]��.���#L�,/������Sd�Nu%���=������O�o�>���2)�T������魞�eZ	�s�e�]y��J7ߕ�5X��}�I.����/�ߟ���ㄪ�>Oʰ�WVEXx
=��12����E��?�fy���C���}�5eH��5�^���k���N��%y����׿tjJ!����َ�"�t��ӈ�Gre�s�n�L��)�s��ӈ�GL��=�FL7���,�#��u5yNկ�������|�[�k��ҎTi�=�]<>g<�
G>�#&UE���w ���D�o*D����
aϧ�����Ont)�}���o��ɻ�����/_���ɇ��Ǘ���xy��y�������sf}��6��&-��.#�wV�-�Ϡ��7��t�w�i5����Av
u٣�N5����}�i9>wQ�9�z�v-�-�Ң{��y�TM�K�պ9j
�M�0D0�p?O�|Lg��Y�����a`�9�
�����SL�I7�H˞]��
B�a�X���x�ρ��s,�WSJ�*xs�`����q���-��}���;�ۈqS7���i/ƪ@���~��S1���[^o&�'�^�/8ާ�s�B�+y�����q��6s�1��1w&8�co�����&��:���b�"��eBѷ��R�)g#�fW���x�c׌��H��s0�������ɮ�EVv�:�a�Y
�|��>2��ءӜ�ַ֊��El��|�_w�{�N��A<����v�V)a��-�ë��lr
�E
��Z��-e�`�->S��Y��xݵT�^k�;�
�1M�{�v��w��:I#�(@�(Yw\-t�9]�����4b�Tr:��9cG�<:�&� ^�CQ�j�t�U��	S|�3A�8g��M�^���c�@8Vðf���c��5;�s��@�9�>!�ٽ�5{�����%)�&ěpW7aMW�g7c�R��<����&M��o�ףO��{�Y��Ms���|�tFs�Z-��`�b|����~��z�?��^���{��G~�����o���bN�ҝ[�V���5t��8�q�f5*؈p�:H��a��K�u���–n_��99��F���] p�9��\rSݟ�LfG��Օ�6��` 1|���=ę0 <dz���#��ص�.�#��1J���*K�|�ɔU��T}���=��(��DT��?6��3��)Z���1��xG69Qp$�#�p���T�<��gbo/Į�j��2��|�#��?����������8*I�d�.6��u4r��Y&iRqC�
c���
��PF\Ƥń�<N"H�����,�U�щ�d�>L��N���L����4�шy��w�!�5a<t��k���2���g?�W�g��e�-镫��� @'-��~�7�?�$�h0W�.��-��m@$
�XL�^�3�
��ǁ��L�T(A����e�n����v�W��7����U��\KL�q,����j�^Y!��D���a�M����`p	n��$N&$0�J5��?",�~}�����3��d츮�M���rb�#�($fR��>m��~��E�ofw(n�K�ox,��ŰƄ�H�Z�)&�X�c�n�
3L]0�|�5���x� �b�X�Zڈ��׏��r�_��TK�WL$�W��p���,�9�&F�Q6ܾ����*u��կ9���?���{Z�ߙ���5� �u�_�9��L�O�!h��IH�˴{UN=K�$���ue��B&Bm?ץ��9���b$k�<Я��l���t�!:98"�D�Ah��� ���i㣗4J�r
�v�<b�x�U���9ۊ����E*��__�_ߚ�Y�a�T��[�b{h�l	������"���/MV
��L�/Y����1��1�s~�1�
��Ռ"�׿�Pu�ٰQΫ�p5ח/0oe2J�.�)�^��i�9�TM�&��cE�JkY�?��~��2/Êaeq��r4n).c<C��fD�P�L���ע��φʋc<8�½0�p��Y�k���7�х�k �Ţ7s֍�ni��;�%�҉���vF�c���ե����t��Y��oZ�Se�f��L'r18�X�.��s��K�)Y
8�\�`��v+�i+�$�RɯݗZ���BW��[^��(i���RiY�ʺ��T�V�W�a�2��Z����gԿ��$c���OA����cp�TG�_ ����7N�k����I�a��ğ�-�v)� P�H��\�0;�d��"h�2�W�� �x1��Ȓl�fpıF�âO�s�
(T;�⁀��#�L�I^�l��֯�hT�߮K��J(;�@A9ҒHKV�%Gߪ�T��<���y*��)��<��j0I�ku:OY��<eծUu��w3�d�ZK�<U�k�<��|�5�ɡ{�˯�JiCX�b��dži����~�,�җ��6<rf� �"Kr�7R#��,�(�F�7����aq4�R�.�7p��*�j��vPL��jx�ձ�M�:y9�:��Q��������T�V�:y1�:m|d�1P���`��k-�:���L���
2�g�C�w��߮T�6��5��cr3����-gtR4�7�r�J�4�9ጲZ8Y�!��(,�3Z�m���&E�KV&�n�������)�;����L�2o�2�iP�Vm~��
Jg��z������T�V�A�L�hP�M�o?T��L2v��5�ZH��i��¶8�8
��n�q)p����e!R�<i�B��*�iE�����Y���U��
;�p���� ��U~�m#���ԺS4�(b��]
&�v�Ni)�"�_۵�Q�`��L2v���#O#�MT�ՇQ6���r��֧r@��0p`/~Sj���B(��pձ��0�}�����9b��`�8/�M(��j�S�?Մ��xpx�6���|�v�E3R���.��,�Bԇ4y_�ƶ�03��؝yqY��f�Njj��豤��XǒZ^RK6U�Ϯ�ߖ�a�m�Y	�ӓ`f�ud��s�k߳�hޚ*�
�k�qo�����z�5$�����W��3�k���L*m��|�75/:QT��QS�i����T��bANx��(,~��VLW	'�;�l%�Z8��fn1WGe*^�v�3�s��ֶ�l�Uc�1�cKR��vC�u9��ܤ�;��~��M
[&��g��%_Y8P������IM5V�;��Sk�pT�3]��ϱxw6�j�SL��F��
|� S=`�=��k��T*GsT��b��i�V2T7��j&��G�	#�ln2�R�s�@�i<z����ʉ~����d�0�bB�O��m��"pC0�bN���K=���$���"m���F�{�|��C�P�	�8*��W6
����u��C�����W�2��gn����׳B�
��2_��a�*B\칺 k�@Fv�2FpL���g̼��L�C�1ta��3�Y�H���-�Ӊ��"!�*O>�9�.�[�J��c�p@���K��:u�%�ʑ]�E.j�4�WaY�W�R(�j����׃O�q)��1WF:����i*��=�ƛ��X�-��g1f޽����ύ��J
'V�%����ȓ��UO)���"�0R�s$<�O!ެx���fI3����A0	�?��^뵽�f��i��'�}���a�&lM�42,��
]ji��2�>t���ˠ��`�j�S�c)����;���&U�ݑ�2U���c�慜T���B����֡��ӉM��Y��ϱ���Y�XA�st�bނ6����s ��s?b]Gc�^?����)zLF���S��v<�|�����ݦ0��2�qc�w��왎(û/��-y�>y��~�����#y�!��!y��r0in-���D
)H� ��?�\_�سtY�b����1@ԭ_��)����($����Y3�`���D29K^˕1p�5�b����Mo����7��I~����`�ôue
�1��op��0�`�!�n3QA�V
���P!%��fxp(:�6-Æ��+E{��~���{~�W�v4 d�'pSI�o3ɳ��"�)�1I0�"pN�ΰ*�WRw!�}4�
!����9wV�4�a+d�6�u���S�x�w�1�1;���(��F�}3�s��Q&#�)�@�)LUbc���e�oQ��D���y����lQ�7"�
fQw0<�B3�yaX3�>C6�Ҭ��[fF%`�lw0D�z�fb܁��o]�G
�c� 
�a�"_��gS���`��d^����7#m^z��f��X|1}�sa�HP���,㛹W�욹W��i�^�YӀ��4soW�I�]�m�^=�̽��]��4so7�IƮ�p3��T�`��l;��~s��������n:�0��6m����f�.�,��h�>��J1�vw�x$���G�7+���G���j�ρ�ԍ��<խ��H�7���p��멡�ԍ��<ӯ���T?�/�((�'���ի}GQ�D�H��q^fv�f��
c>9����� ҃M�G0�-��gxැ�ߐ9�>�9�e�o��c�YX���*|��T��;�7�
��M�F?c*Py��ן#SA3��T��5�l�T�2�^66t>��y�_oqS��+'FSA�� �
�j�h��.��E�l�Ekѱ�sĢ�5����,�.��.�w�0c݌��<ӯ�8��}٭Ȣ7n��pBżm�!��84F����z\UjD�F��g��݅`D��Mp-u/��fNp-�N�,˱�ڌ��<խg�2�\Kk�*��ڌ��<ӯ���Z)
��z9�,��D1��Ĭ��-Eq(�8�@T�h��^.�y��$�������$D�
6��PPjG�`�������A��Ϯ'F�R;b�L��҂�&
Joc�欞�i�a"J��#8{��)�pb��:=��Q<ݴx�6:�/ة�|���jѲ��~[�&26N���ĝ>�#CnԒ�#�<;�F��&�rA1���d}5����w0���~$���
�t5�ڟ�$����r�PI��(�2U5�f��9�V7
{̰�c���q�1�v ����r�M�j��p��	�~�t�X:)�v��f1�:��=�#�3ŧp�!R�`�h��x|K�ix��"9����o�R���_ds��E6�\ds��m��{N��0
�Fy,�!{J�O��������I���ޜr�gK�Z�p���jڎ��~s�;g�;UZ���0XLM-Y�g�s�i5D��s�9ֽQ���s��Kp&����gT��nE�k�f���=���33#�7�g�����z�x�w���J�����	JR����zB�v�)�ka���
Ʒⵃ0�����X��Y����Ǟ�NL�G���9ܩ�O��e!�E�Fd�aD��X��\0�$�����S�kk�qo�"��Ҋ��q��|�5�������Yϭ��T59(j�p仼��W���=��A;�Nw<.=�A5�]�<���kF<�j��+��y�*�GT�'e���w�����7bo[&�L�.*���SN[����k#/���53c����.l9H:T96�a�=����#Bm�"T&L�`ج��T��M�p�f����)�
�L�VA���h��@����[Y�9֬SLu
�VC4ᢚVy��{��$�5.U��!�������Sl�)����ɫ��t��k��$��RzQ����x��{ʤ���3΂��������'��H�@����EaJ�%0F6c�JnJ�H�]~=���z$�K��o�=	�R�4�yp`<�k��i�R�@�u�[�ނ�@���< ��p�g��XL���Nل��ݴ>���׮�pc���_j�1�g|`LQ�L�)�Ѷ�>rS0��e�E)��*F�,�^���Y�ê����2X��j��wai�EU]�!�1~T�4^�E"�n���4��ӳ���W�1��r"�Fg&��2��oh�>#.<kU˗��ŀwP�ptk��]�s0l�Zk�����	�F��+����S�>��K~8�|z;�*�~N>�I�˙
endstream
endobj
16 0 obj
6379
endobj
20 0 obj
[1 /XYZ 33  
760.250000  0]
endobj
21 0 obj
[1 /XYZ 33  
672.500000  0]
endobj
22 0 obj
[1 /XYZ 33  
158.750000  0]
endobj
23 0 obj
<<
/Type /Annot
/Subtype /Link
/Rect [102  696.500000  175.500000  705.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��][k�H~�_��Ȫ*�.`�maaL���C�dv���d��+�JmK꯺��QIrk㶫���:��\��o>F��#����-zr?o>l�8�I�_T�{������P�}���l�G�7����7���x���h��4�p���"�����_��~�����e��<�_�l��痿�$��TeQ�=�Z���?��V�H�"I�6ڨf,��߽x��=��K�gi�آ��mZ&����&o~���JuE5�迟6�V�?w]�X]���\�؎��:)�Ĕ��]�&�vm�w]X=Q�:Iҩ�V:��k3ݬm�w�~� ���c[׏���,R:z�5j���X��2���KtYq�۫��M�L[�C]�ݶ�b�iV�5:�LRl[t\6��hɷ-YlR�k�ٶ�q���Ӣ�ۊ�ߦ�{F5C;f�ʺgt�t����Ūf�[�kɒ�tG-ۏE�xf�w�j[��768S��c�<CЁʶ-*iሱ�Pccf�W��^�d��;�z�L=���h�N��z�n�gf��ZU“Ep�RU�7�����#P7��6�{C��Y˟k�6�	c���Sg��ʡVKM���ⳍ�vݞ���·u
�֔�􆟁3U�n��h(�.�����u+�d����pl�,`���L��Cڡ�CU�Wam���@��Ң��ū����[��k�G��YQ<6QY�5֞�:�������aLT��W�je�~Ō��%xl��q�4sd���{��p>�}��ӆ��q^�9 >-�B«������lY%�IBʾ��S/��2r�s�	�Jiӌ�Ϝ9��߆׍�q?�؄W�uX�1���0(>?��Q{��P�@s<���
�,���9Ƣ �A�=���fzռ��!Y����2��68��#��`��,����5�ش,�ʌs�72#���-<Z�!��y�(���&��H��1)�3�5�H�㑍p�L��i�׎
�(���(�Ö#�_�������LM߶�I�&��X��Ԝ�Y棢t��=,�O]�`��Lg�c��~��||�Dc<c��]����+F�y����L���M���*y,+S��<�V'T���і��1��P���o������"�yZK𹓃r���;u�Z+ĩS�wwF����윪�o��g܊�=�C�������i^w�3-������-o���
��ma�s�=-�|��[k7��V]|���kty]�����Ϗ���]^EWW��Me��Ԭ[:�-�����@z�x
Yj��$�S����x%�Q��Pnj,T��	.U��9%A�itzSQ6�`֩���qf9J�ך�����!v�Ѐ���=Ϻ1#M=�*�h�ŒӠ�]K��J�^��b''�U���@/Lo�N��:�dD00�h`��]�i�c��P�t!*��IE��|1�I���a*Ɣ���Hr	v�^�ƊNmՎ�9i��lL(�:D�d0�a�ztZ�дCr��H��uW}N�_]��.f�"�=���i�zi]iӥv,�-�#'���̽��AP%n�Ex=�;=���dG���lt��ӬC���Ɣ�8�'Iq
O%,&�
%#�F(�u���u�Y���%Ťp�"_�!r�* �	k	�L��̙�i�H*�S�h�u��u�OMYf�2�5��L��Z0e����u
_�ܨ�I �F�Dcӈ��Ri���U����х���"!���S�J�T#F�I��c��>ƶ��ƒ�k���-�u��Ze7}խ���q�Ͳ
eh��E�'��QO?E{
�	����`7�8z����6`�;���f\?.�w����:�昬7��M m�z���k�۽�た��'Z��^:~z�5����6*���06{�-0��S6/+ΚD�[�vL�'SJZM��RԢ3ؒ÷�?c`�{�Ƕ+Yp�v���
?��CN�=��X���~q��cv��Q�������>;�={C{����-����kf�:�EA�2\�c�(�py� �\}E^G���̉�t\&f'��e| ��Ӣ�ZZhDiaܢ�( %Q�2XQ�h�Y_��2��s�*︨_&N���.����?ӗ
UR+�n���Ƕ͜��"�! �TD*+�H%��0&UcLy�bLnj��1ݞ���0�|��б�ɔtn�H�zI�a@?��>�w��ZO?p���P��p���h��u�?�
����׀���3�����mx>pv�){J�vDxfzD�;��8"J7Ӂ�\8��Ԧ�eo{f��ɫ�2!�TBR�[̙��P�P5��LgL;�[ô���
=�`� �G��n�w�L<
�N�g�O�^��ee�,f��w�2�eW��:���F>���QO�u<gY.N+��
N��Q��xu���g�����5�s�5�iM�2E�y�!���!ѬvFV�t��)X���9'���5�i����j%VPa����%�.����z•���4��D&
��у��PQ��WӔ�K�	D��S�%�S��7f�Dtc(z���c(8���R��#�C�YSl"��S���)�CY��n"���N�}��1o����A�pd���%IJp���T���N�(:ĈR�2��Rr���o���[Ӭ_q��8N�_!��zb��I��b.\�\W5gj��AK�� 2��P9���R�����:5]~��2֣	�)U{}r4P��9㫢!�]�	N���Q:a��H2��ZF�Jx`8c��R�B�<�������L֑��ߕ3k���
ߜߐ��D�R"��rԱ��|��	��Ռ�]�����хSC$�褲�I�59f��]�*�jq�1/�|�cN��#�xl8����*4D�,\�œ�B����6�R���I�3��'զiQI||�OQD��a8���"56,v���f`{�1f�"��)Мq��
 ������E��dZ&\;��:)�:��.�-����I�zc�#X(7��&�J�Ya�sm������5)���r���6�U
�	˘v0T��|�:Õ�3�p4AUA�QSz��l����}���PWN0�o�f&
=P��$p-ҁ$�N-꘠�F��YWa�zeyqJ(�䭭5S@`r�D$�w�eʛ ��ں��k�K��]�ʚH��s-?��eO�C|����`�ū�]��NZ|�^�%�|�f�e{���oCA�L�;%���b\p�q�@�D��Y__q>.+Y�6��dwA��REsj�p�-�Fvi�+���75���g2���t"C��@������iA/L]&&�;ZTa4/J'c¢�u(Cp��"�ra�!,Z��|*Hyx���g�|�!�K��Ҥ���Ɋe^��9��[8P0*e0�D� :ZF�O�+Yu{�4�	�Ǻ7��8,��k�

��֙���%!�F�u�"�{8�؈;N4����\���p��sL�'%�]�G��f��n`竩�ʗ$
��W3���CwӟƼ1�NDY�
<j�?ؕKd=c!�Y��8C�s% vM3��%#v�L�j�|4n��
�3̮���!Z&����C���'�u�>��a`��_E�d��dM�*Ü���C��'�)ܽHת��J�b�	#8��%g��3�e���C�ݭ��$���t��s�;���?����i��fH�MUv�4�2N�~�Y�bE[dg���y�[��u�dE
�pL\���x��5p��_����G�gZ��%-��'�~�q?��i:p>�G{�;<86Ϩ�Z�)E{�Z����Ňo�F�����~������Utu]�����I�Ļ���{��MO(l���>H"=�������.��gڿ�tJ�/~�ǯ�߆Qc�~b&�^`�`�36<S쩹{f1#��<k�;�1��(���*�mN�]*�?�5���P	@�_\!�dR�2LX��%g�$H�&�@#|��
L�B�DR�T-���e��1��r�<Ӄ�#mu}q��O*��d͇2��ZD��S�|ژʒ.mj�c:ϙ�}���Oi��T�ޗ����T����}�m����-q�vY�b0�e�e3!��*u�2bh,�m}ߎ��s�ަ,�)���Z ���w���]�g�z�
S��p"e�0.L��>w$!�S�
�T�����Ϟ�ߊ��s�y����'�Mټ����uK�y.o�7��Ow	0��7�v0����bJcȂ��0��<��Q�;���Ս�Ӎ�@7�N7����tc�W7�N7���:��vtcD7�vd�u�<�=+r��E߽;2��d�=l��S
endstream
endobj
25 0 obj
4362
endobj
29 0 obj
[2 /XYZ 33  
122.750000  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��]߯۶~�_��QDR% ����A�a�C��+��h�
۟?ɢl�G��=�$�-��k]Q$ux~~����}��?��O�>��O7E�l��u��:�B׹�������/����͇͇�߯�a��?>��y�?k�����f:�s��/����������S.�V�����_UQVyը�n�/����߾�~k�Q�uQhm�Q�\F���EcrS��u�'}�޼����)U����\U��sS4ua�F�8�:Ӯ6Y]����������L�6j�U�v��z�-˹]٣G��4�i
�w�6���L���OY?�W��Oݤ_�J�٧�7�����/�k�cd�ʷ�+-+��ck�+��^�y��rp�m�T�)���T����NSTz|��J�'s�G�y���Q��NF�g���}{�iZb)lKC�g�m���>��c��P�mYE�������.�~��J��P����Ŗ芮�G���g�G�s��	���<�|�4��wľ���{�[PO�
�Q|O��RK�����liBQ`�0��R\n{�xf�',3b5����h�>;��\#>.��3��S�˕=�G�p�X�a�7P���]1�z�w�dn{�Tǣ����;�
�
�SL!�9��8^)�~�J��M���k5�S]���&NcO	��J1+
�5���g��A9�U̩'T�نs���;�g;0L���̿o�����$��E!�-�`�_��{��4|����w��s�Ѱ·�~�	֍?����ϡ�)>��,œj��h�,���Jg|^i�]T1l�5o�9�mc
���ŋ�|���kF�3r�
����R/~�hS{?��x^������#�1��+�s���O�!��7�K5Bã�xLU�v��5���`���ю
�C�d���L��L;w�s�<�Hfn�aC�Q
"�,��)d���u�=��D�ak��Q���X�c�/���r����X�a_�����a�8�!4�
a<�8��d�\���!�nʒH�����̬3ұJ��1��v���q4·&�!�:����坨�)�	{K�g�mh|�HD,����vCx�(l�|a�/~��i�*/Ϟ�h�S	O��P��/�DL�c��o���:M&1.Ӯ��T�(m����ДݷMfl���Ƙ�nli
��1��L?^�w�'�q6���l�w�'�W��>7�����7�v�%�R
�b��� v)��:î�����e�?�	̸(0�"f��eR�9�Ue����b�sZs���DZ=�AkΉA[�b��y$�+ft����b��Ġ-�xű쮸�}nor1��ދ4"��`�F�7o^˫��&%��f=G�i��.'~u��{J��$��D�hxw�Y��-����=
����'�m?����+)=Vڙ�R��q��@=Djh����F�ר�D
��$��0f��
f,8
*�<��v�̕#��=&U�EgM�W��:�D���R�wJ���hIK��H�C�T�X�w�J�dV�@� ]SPeF�L!�i�zj_JU���g�0)��l�X�{�q�2%c�)܏�M؟�%���?NȾ1=$��Uy�X���X��-���9F�m���}��G�5�<�k���G(��7��
�M�k��-9��5�I��6L���a��t%�2�0%u���l@1Ʀ	��X5!��	�V�l�F��HuW��>ӏ煐n�	!�gu?��Pwō�s�x��vJ=�:I�'|Xc	��W�J(I��'P�a�[N[���d.��=1Hٸ06>q&��u���O�sc�W���C��J1�2����Ʀ%ƣ�H(��*S�����4Ʉ`��.�:x � 6+�l��`� R"r��k�uJdu�%ci��Ho�Ա�t�3$қ���\۵%�PJ�? �u%��Y��jb�8%]�Y�D���Dz�B�x8Z��͛bo�ԁ��JJ��;��)���Q;����N�Kn�i��o�$x�#��G�:�DG�K��D��z�R�R�BZ���C(=�x�B�����l`bс�K����K��f'�����ޛ]��\OJqN)�aJL)α��M3�CJq��g��o��~:���v����9�.믘�}�o�]�~:���֏w����F��a����ڧUvd��F+�S�İ伳X{�d'6U�F6�l���%;Vdx1�����4�k�mz�|���bF��~<���5����cF�7�;��
�M��w��,��C	��"ӞR���͠d��u��o[p���Od\�L�FYe<I�E����7�(p�xJ|�t�;3�\?��[oF�쯘�}��K�s��o�x'f��f��Q1�	e�0�����dV�;�&J�ξ��Ғ~?�c�#�����0:���=r��VE��\]��~�6�p4�4d�0�"�R|�h�3fp������q�9!��;
��"��Ce��<�յ����N�s�s��J�d��ld����P���'[l��+D�8Z-aѽ��=ӆ�rO-8�("�q��XE�0�%��i��$Yr�E{����ej����A0ώ׊��'۴���2��ފ���_��������HA�̖�hG�
5�&7t1��wZ�zO@��.1��c\�9�33P��)*%�V�ܶx=Li"\	;Zq�!Y�:Q$kՅ��z��x��n�Kkԕ*�p�
"�qkPvk0�d�2���N���iķ���)����1���$�� *���s�E��f�p��:�W�4�Z�p�^��>q��f�w�/!x�a�jD����ڬ�V�\W�Q�Np�&zΚ)6��	�������%�X���v'�a��.��4G�]^۫�Ԉ�d�����i���D���ɋ�i���d!���(`E
�S05��d���0�	�<Z�;���l>�%�Clk�T63�j��U�˥�C�-M��z�D8�8Z�=�B1uK/e�i�*�A�_�C��d��=/i�B{��B؏�W�=<�9�<"Sۮ��
���a�����|�sD�����@t����x���M�E���h��D��<�=8��R�i���X
Y�e=3�G������b5�����Z��8�mw�u�xkd=I҄��0>t&Qg��%hG[��{�|�J��?M�-�N���rs�Ө�M��ȾZ2�_D�Mh�VM1�'&1X����{�e뙊�~Y4���p�q1���l���7�
Y�-07l�0�3eO��=?z`�����pNe+�&~jsK��e�zu��H���$|?�Q7�\S�e�R6��e�D�[`w?X@b0~��9.W7�`٬M٦DK)>s�M4�� ���yͮ���,���5b�p¨�!:FP�.ք������I�{Sp��)pS{��u��|kY�1�@ٜs�$u�U��������&�Z@c�h�jA�{�h��0o�;)�e���'�-b�2�#��E#���/���~I*:gAP�T�]��t�mA�==P9��K��Pxw�zp)�K]z�f��uD{2��T�}�+�	C��~.�P�M������R�C�q�{b�K�L�����`���h�
�>A��ݡ�'�*2�*���K6�R��H&�(T9VP�1�e_� !LX_�l.C�'��OW?�2hiLЖI|`����Zp�<�!��U�uHgL!�DJ��FHe�Dʞ{��%�����e�#tsʏ 
Hf\�E�W�[p˄%�y����C6%���~��@���jx�=p�O`�5�ҿ��0>O�r����lS�/
ܣj��d�s�=�Ze�rmp�=%�G���K��LJ"��Aհ����y��~�`рl����d�쌚|�nRluE�23N�Y����sƸ�rB��+3ZٜY��jFs���Q5�9�'K6�K������qn�\��ŝr�RUc.��JL�A&�ɸ�M�q�1u2���x=Tg5�
��y�@L���ك�Tp��)��0�?��*�P+
50�UYY�)Q�n(��2��F
��s��3����>T�X��H�e�
�@D%*�π�ek��j�8��L�,�Ra,�{�Ehk���u+�Eh[����"t�G+;c�iBUu�]�qY�y��������*+(�w��dmelj�륱RyY�x�?I�Y�fl��r��'�ɟ��<�]d�?�W����y��@��m7���@���u��'�M�gpZy�	�
�?�P�8�X��>&������͛�����������y��}����S#��t�Q����/OGKX-yu'qzO��9q�uQfz]j�W�'��q��PR��8.��g�Qp�
�5~���q�#�F0��v���BLj���ui���#��u� �<Ǫ<L�Lj�x���B��$eG�}S~R��1~s�Q`����]��g�F��A\����2�|&�Ō�JL`��tL�
�c�f��I���!�Ʌ���*��h�B6�?�5�r������9S�N1�_89�-�G;2Z���ឪ���LQ��\�S{b�Q�]�u���T�T�I5,�T�J����N�z(��_�����2�'Y-�WF����6�kO��C����T�}�T���V���M�}�3c���7��ucKS�o��g��k?u���订��k�w������~޼�f�l���U�m-w�c�UG+0�,?�
�i*v�2{@(��y���.���DTIej��Տ�"����s�T��T1,���i{̘ژv���D:����y��נ�;���C�a��l��
endstream
endobj
31 0 obj
4897
endobj
35 0 obj
[3 /XYZ 33  
765.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 14.4 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��[mk�8��_��u�jIP
M��AI�>��d�X�e�����?9gc'��L��^wj'�F�g4�������MLf�/bI�ټ��w��'�g�_�Pҽ�нX��ⱸ-n��Ǣm���|(&M_E��|�{��Gh�k��I��W��%�����+_�M+�>~�����*�����~�c����e�Rk��jl�|>3��Rz]=���-C���hU}�.�W֧�(c�&j�ixO�0��F|}W��=v�a��a�:7:�Lsg��xW	S57��ߦ?��.��H��I���3M{�s��l]-I���NOI�;z�m�c1}�c���:]��J(-�E�γ沸/lHތ����<���B,>U�5u��O5����2Va;k�Q�DV�#�:�qʭ��QkZ�$��}ܚ6+�++�Bg<J�N�0�=�s6$�$��=�A�d�Z���>�X0m[���ܬ$׋Y�	��*6�
h�k/Tj��虦=
�v��uԞ�J-�=߶w�Pq����H��'���i±TU���N�X<�����i�j86���e����
+��=J۟guI�m�h����Zs$1Dt��Op�.����}�~h�w-�
�M]�E��w
�-c�"–�t��6C�@V�'~2�r� ����r���ϋw�~���BL�f�o���	�����f�s�i�9�E�/��3�h�69l�B�-%9~Hk�$��A�Ϸ�%���I�x<ж��8�C�Hە�9�'|Ɯ�<��H1尚���o����:��	ýÊ���4u,P��:r��������kF�Lɣ�2o�9�5JX8��o<ی�o��0w�5;j��V��-7q}�a�q�����U�'7�+�wr��^�t}ﵳ1A��o�qi{����"�� �LSZ�����T� ق��dž[-��
J<l-@�5�(�����l5��V(���H�Q���&��Xpu.��AI����X.�D+[K�h{A�y�4��T���8�7=����T���l�p5R�XX�Dl5&[��a	
��g�8&[X��=�$�A�2�A9[Ƒ�>/�U�F�=�l}8��l�q���kΜ���x��yo��Z�)�`Te���/m�(�%N���b(c�S|=Y
[�WN!��a�a�i�:��x‘|�����̄���.Y��3?��>r��b$�f�8�9ebNfb�-�Xqkx�F-��r=^�Y3�U74�}��GʚG{����ɚo��9��L��É�qW
�	���Ki�������i�G?X��8��3��N������돶*��)#�<��������aX�*N�{<��-2��sh�Q�aU?�T/�T2���F��a���F����g�.����13�ގS������ [�'�Y�����B֬�^:�� ��F�_�U�o��u��|˾V���-W��h�#�D���D��~3���
[�Gj�8�18��<���Lk�o�6��L?��K��]bT[^����'_0��ls��K��[��Y{XE�얞�]�^u�����H��Ȍ��d��}����jz�
endstream
endobj
51 0 obj
1581
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+Ȍ�`�P`&�7�)ry" �9ܠ� ry+(*�&��&Fr�I0�$���[s=�xd�M6	0��g0׾���ꪯ���5B�
�L8B����j�=���bI��_�y=�����Н����q!l!���';Ư������삲*���`�B`l�1-���#d~&��UE$�,�v#�U����7�	Bh;��`:Rp����$��V,�-BGb�j���!K�������eD$$S�A�e�x?�4�C��Hm�9"'���B�j��S{5�A�M3ϥ����a����F9QG�5��S��rs���R�*Z9�%M1�_��$���Wq
{��Q�87���K��0Q.�LպA��t�'�蝝���>��y?p��rqQ�r����j���G�J�����J��˴HF���t4x�o��v�\�j��b��͍s�Kv�����}{\,�'�4��Sm��MAA;��Vo���m�����3�((D���'�.�J��^�Q�Y�˱
���˰�3Q�޸* ���5k�z�f����6�~�R��]�}��ȲF�uS��F7�� U
R�)u��Ͽ�c�}��q�C�O}��2��_b��LY9ik�=��W���h:�ցCq�[�x::��ip���V=��m���@��Z��)&���p�
�>�r���ө�͐��O��A����.I�C��dg����i�D���Q�Т�5(	�c^UR�w�h�m*�����x~I™��aT�s��=52b~������Y�%���,\'	���y2�� C.���
(����*����z�����<����zy�Yï\ޒ�]�$~X��Sl�&ž]�O=�ych0���b���4�>m���Ҹ=�GG2u�_8������
��g��_<r�9%���7ȝ+�Dv��4ȡ���	�P���*�����R�t�)lk�9��
[6}s�Ͽ(- z��7-��7/GpZ��->	����W��HNJH�O]pLTĬ�����8~�r�������Ӌq�9��~�-���e�B��ՙ�%�J�ʊ/Mݶ�K/TT� *��'6�(�ˁ�Z�=Hʚu�,7eew�wsr�^@�q��!�-@�,����<��t�[�w�3�Of�05�a���Y�L�{A画�-t�3���kȽ��"C�#e��	����B�5�shk�y�;�����[�}7�K�1�v���*�-�ta@#Q�$u�����;�	�i����s����E�1g�
@5E��c7��
N���7��7�aD�w�M[n�ݱ^Z��c�@85<��k���͟s���:���e�:���d���(%���z�r栱
�o�me�Ĝɀ�Q0��l���N�b�se%��f���[�fN(-?_��a�5�!A%ً�KČi.SfL���ٺz���}zf��5ST3f��Oܓ�`��ؔ$�Gf�`��C	���e�����S��7����h�Qy��j�Fx}CϳM�Qh&����fU�A���P\t!�R��C�.����:���g�C�����R��=0i�/�f�7��96Ԓ��|�8���g
�:Gc0���:���l�ε�!��j�C����_�!Ӻ���@lx�e�@L秅���榦ܬ�C�,���*���М��Q�us�L�O��{�ȎTo��q2_�}��3��-�Ȫpu��Ip)�y�f4��xk-i�O�x�8�e	��&7��Ouv@И��g0�T���� 6�gҁR�y��^��@��7�lc;r�&
��Y7s��R p���Wh�:l�<y��ox`����Bqp�9u��zl�Ĉ�fzt'HrS��{�,6\�75X���/���Ū��C�,k2�&� Β�Y^�I9DL���-9Ē�-�	�Aa�O��⋗�L]�E���	ډ�ا�c�-Y����!�`�^q�?����C�򲑃��܀́�Z���8�\��ҁ��O&%u/\0��{%��m�ɝƧ��ص�z����N@����{�y
�i��J����t��K�4L�Yf�)�e/_2�vU�\+/*�K�8�a�PV�|DĶ����Eb�5��h��um�z��\n܋Ѹ9i�:��s�w�^*e�>�M��8Z���U�8`XG
9}�M���-v���q��q;����|I8�ֿ���28����6:���;��>$i�y��:��yj_��"=nNN�w��,~��#b���bRӱ�r���<�ďCk[��;�b㫑[F'�#��caP�5��%�����f�6GF��n���}q=�h+���X�r��:7��{�{�
������*��l��H��F8-ԞY(3R{{��I�o!m�����.q��o�~��r3p����¹vH�R�V�W��`@;�?|I�ʸ�	�Z��i���an搋�=7��ws�,�g[�C�E����
w��Do�q{��e:�x�S��zE�Ͽ�3��Xc��Ajd�a��^�/�g?6ԇE�B�s!hw$�Ò�v�Ce~V8UT�NSz���m,�&<�f[h��4W��/q�H�`��i��\ø�ܔ��lQo�0I��ѰȲ����AK����	�	����[{N�7�F��5ԟ�i�z���?���A^��73��]�u���ĸ��Wr�?�,!>���w(������w삦ъ�d��9���
{�'��pn��_�&�S��{T��j��j��C��Q��Ć(8K�e�?������2w6]��NP�~s|�3T��x����]��[fa ��_h.^��\��u��,�o��!����Z��r"�s
ӡ��.8�Ҟ�K�钘��_�>p�fK�©���C�'�w���x&�47�$����1)� �.A�X�eV5<@�Q$!��H��$ǣ�?��o�,_��b|����1q�Lv��gs��ں���kSo�]I��s�<U\�矑��.*�-0��7_��7?6��tn�?����>2j���ܹR̟����2�����Ar@�\��;M�_�i.�]����P*��{�c}�F�I��a�S�r_��F��GLs@��t�,�L��Y	��e��Ξr-�
��VUmqۓ�l������%�^}��+d}�#~� ֈ_v���@<��
HqҨm�1����-M������_��N{09���Y�1����y~4��W�:V\��Oࡺz���K�û�z�
R���nc�C��

���?�;������@�|��@��k�M�/�Q
U2m@�Z����������{<�?����v�ֱ��1F���L]���2�)
�~*��w?�׉�22�\	��\s3�ف���ѠF�1�p���a4�bW�IH~%�~c~vVn�k���6|��
v=va!�[�Ö�ԯ��w�K@��O>�Ry�/�,X�b���+���4\��k~A�b��G�$���߁|T>SG���z��@CKmd�Ⱥ�Pl��[����V-^�i�[W6m鍈ظ����{[8/(�EO��^LY�r����1k�g�� $�nS`���d�͟��z+jU�h'����b.��r�zDox�XD�Gr8�'8�;0���koG��y5A��G`�_-�A�5�^�K�������~I��\���a`���Po�,���}F�nS�����1Q
O,[q�aIuٿoK�����mz1�v@n�,
-�킁D\����x���˽/��&`�6���G]��W
��5 �Y�ꖳ�{�5�ؑ�A�kX���.޴��k7â�%k
�Be��}�����O'�au��a ~S�8�ޅ�s���+^,*����k��$&���k����H���P\�
*-


(*	F���yi�C�<�,'&Noga[±Z]��1����3��19��;.������-{�t�)�'Xt�p��qw�s�����]�0/�\��uN���c�s��J���l����G���d���ؗ\~	q4��~�*`��w-eI��Ҙ��a�.�>"l��U[�]�t۶�G����u����/!��ի�ڒV�&�FF�F)�;�S�NB��Q_d���;W���4�.�q�����*��o�����K"A�L샩5Q�!;�/����ˌ��1u՚M��b�]� $h=Ƞc����G}��R:��eŌ��'�Wԥ�}�0R��Y���4��F�_�f��ZO1��]3�m���z0Ƃ�	T��x	9q{���0��0�=�*��7��� F�
��qęat;�T��b�?�����s�ϛ���<Y?��s2�7&^���4�8�yp����P��m��'?<�G�����1CvO�<S�����E����8�PvO���+�k%�����"��\�*�I%��r�!��<�C(�h�ů$|I��a�FҍEO'�]��U$Y(%�Kē�ƶY-�H=Bl�[D��3z�52�)�X�%�!]��8#�$�N��82�{�8��=r���1�I�lߏ'6^X��.��#d}�l������$
�x��Fҁe
�D��Ä��d:�Kƾ(,EXJ���C���+I&J�Dw�F�z��Ë$���,��x�O�D:�.��t#�;�rq\%w�����Z^�g�����`/L��B���p_��"d�&�Q��Z./���$����M�M��36l�ٺ��l�m���4f՘�1c��<6�IKd�#i�/;r�A��b�3�wZ���s�:��oX�<�oY�����u����d�
g�^@�HX?��)�z�Z�Ek��5k] n䶵.#N���Ǔx��IYGJH�"٤��P��o	��F��'�
#�$����"���w�Y�R+�H���8��֕�de���<<=U!FcV~�*�0m�jQ~�*�}*U�f�f�Td��X\o-�2,$ָ�X��H.��㒩H��fd�秖����Cg��V)�k�M�-��
��?�0���c��k�����x6�����x�p��EJ�-b����8�K~��'f��|d'
{
%��bO$�8�!‰ç�Ħ-++�3���rvjQjZv�lcI֜�����Ҍ�9�aA�qA�^�q��G+�
endstream
endobj
58 0 obj
5244
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 270 745 469 564 611 548 682 866 647 707 651 589 880 339 345 492 240 503 557 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> <0034> <002E> <0055> <0073> <0047> <0054> <0068> <0063> <006D> <0074> <0076> <006C> <0070> <0066> <0067> <0050> <0048> <002C> <0032> <0049> <0077> <0079> <0045> <0052> <0046> <004F> <004D> <0041> <004E> <0044> <0053> <0057> <0028> <0029> <0078> <003A> <006B> <0035> <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 
0000038255 00000 n 
0000000187 00000 n 
0000000282 00000 n 
0000000756 00000 n 
0000029337 00000 n 
0000038121 00000 n 
0000000319 00000 n 
0000000362 00000 n 
0000000405 00000 n 
0000000449 00000 n 
0000000493 00000 n 
0000000530 00000 n 
0000000574 00000 n 
0000001080 00000 n 
0000007535 00000 n 
0000000877 00000 n 
0000001053 00000 n 
0000007863 00000 n 
0000007556 00000 n 
0000007600 00000 n 
0000007644 00000 n 
0000007688 00000 n 
0000008188 00000 n 
0000012626 00000 n 
0000007985 00000 n 
0000008161 00000 n 
0000012691 00000 n 
0000012647 00000 n 
0000013009 00000 n 
0000017982 00000 n 
0000012813 00000 n 
0000012989 00000 n 
0000020361 00000 n 
0000018003 00000 n 
0000018047 00000 n 
0000020194 00000 n 
0000020020 00000 n 
0000018298 00000 n 
0000018452 00000 n 
0000018591 00000 n 
0000018987 00000 n 
0000019859 00000 n 
0000018784 00000 n 
0000019263 00000 n 
0000019391 00000 n 
0000019554 00000 n 
0000019723 00000 n 
0000020257 00000 n 
0000020679 00000 n 
0000022336 00000 n 
0000020483 00000 n 
0000020659 00000 n 
0000022357 00000 n 
0000022621 00000 n 
0000027977 00000 n 
0000028459 00000 n 
0000027956 00000 n 
0000029477 00000 n 
0000029735 00000 n 
0000037122 00000 n 
0000037327 00000 n 
0000037101 00000 n 
trailer
<<
/Size 64
/Info 1 0 R
/Root 49 0 R
>>
startxref
38374
%%EOF
PK�^[&�**(doc/alt-php84-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
PK�^[�_Y@����.doc/alt-php84-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.73";
}

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 (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 = @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 = @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);
}
PK�^�$���'doc/alt-php84-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-2025 ionCube Ltd.           Last revised January 2025
PK�^G�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.
PK�^� ���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>
PK�^[���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!
PK�^[�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.
PK�^[�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.
PK�^[�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. 

PK�^[�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";


?>
PK�^��#�#&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";
?>
PK�^[$�u���%doc/alt-php84-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-php84-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�^[9Ύ*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 (isNaN(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>
PKN![,�C�I�Iman/man1/python3.10.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. This terminates the option list (following options
are passed as arguments to the module).
.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's warning machinery by default prints warning messages
to
.IR sys.stderr .

The simplest settings apply a particular action unconditionally to all warnings
emitted by a process (even those that are otherwise ignored by default):

  -Wdefault  # Warn once per call location
  -Werror    # Convert to exceptions
  -Walways   # Warn every time
  -Wmodule   # Warn once per calling module
  -Wonce     # Warn once per Python process
  -Wignore   # Never warn

The action names can be abbreviated as desired and the interpreter will resolve
them to the appropriate action name. For example,
.B -Wi
is the same as
.B -Wignore .

The full form of argument is:
.IB action:message:category:module:lineno

Empty fields match all values; trailing empty fields may be omitted. For
example
.B -W ignore::DeprecationWarning
ignores all DeprecationWarning warnings.

The
.I action
field is as explained above but only applies to warnings that match
the remaining fields.

The
.I message
field must match the whole printed warning message; this match is
case-insensitive.

The
.I category
field matches the warning category (ex: "DeprecationWarning"). 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
.I module
field matches the (fully-qualified) module name; this match is case-sensitive.

The
.I lineno
field matches the line number, where zero matches all line numbers and is thus
equivalent to an omitted line number.

Multiple
.B -W
options can 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 (though, a warning message is printed about invalid options
when the first warning is issued).

Warnings can also be controlled using the
.B PYTHONWARNINGS
environment variable and from within a Python program using the warnings
module.  For example, the warnings.filterwarnings() function can be used to use
a regular expression on the warning message.

.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 importtime: show how long each import takes. It shows module name,
        cumulative time (including nested imports) and self time (excluding
        nested imports). Note that its output may be broken in multi-threaded
        application. Typical usage is python3 -X importtime -c 'import asyncio'

    -X dev: enable CPython's "development mode", introducing additional runtime
        checks which are too expensive to be enabled by default. It will not be
        more verbose than the default if the code is correct: new warnings are
        only emitted when an issue is detected. Effect of the developer mode:
           * Add default warning filter, as -W default
           * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks()
             C function
           * Enable the faulthandler module to dump the Python traceback on a crash
           * Enable asyncio debug mode
           * Set the dev_mode attribute of sys.flags to True
           * io.IOBase destructor logs close() exceptions

    -X utf8: enable UTF-8 mode for operating system interfaces, overriding the default
        locale-aware mode. -X utf8=0 explicitly disables UTF-8 mode (even when it would
        otherwise activate automatically). See PYTHONUTF8 for more details

    -X pycache_prefix=PATH: enable writing .pyc files to a parallel tree rooted at the
        given directory instead of to the code tree.

    -X warn_default_encoding: enable opt-in EncodingWarning for 'encoding=None'

    -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 PYTHONPLATLIBDIR
Override sys.platlibdir.
.IP PYTHONSTARTUP
If this is the name of a readable file, the Python commands in that
file are executed before the first prompt is displayed in interactive
mode.
The file is executed in the same name space where interactive commands
are executed so that objects defined or imported in it can be used
without qualification in the interactive session.
You can also change the prompts
.I sys.ps1
and
.I sys.ps2
in this file.
.IP PYTHONOPTIMIZE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-O\fP option. If set to an integer, it is equivalent to
specifying \fB\-O\fP multiple times.
.IP PYTHONDEBUG
If this is set to a non-empty string it is equivalent to specifying
the \fB\-d\fP option. If set to an integer, it is equivalent to
specifying \fB\-d\fP multiple times.
.IP PYTHONDONTWRITEBYTECODE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-B\fP option (don't try to write
.I .pyc
files).
.IP PYTHONINSPECT
If this is set to a non-empty string it is equivalent to specifying
the \fB\-i\fP option.
.IP PYTHONIOENCODING
If this is set before running the interpreter, it overrides the encoding used
for stdin/stdout/stderr, in the syntax
.IB encodingname ":" errorhandler
The
.IB errorhandler
part is optional and has the same meaning as in str.encode. For stderr, the
.IB errorhandler
 part is ignored; the handler will always be \'backslashreplace\'.
.IP PYTHONNOUSERSITE
If this is set to a non-empty string it is equivalent to specifying the
\fB\-s\fP option (Don't add the user site directory to sys.path).
.IP PYTHONUNBUFFERED
If this is set to a non-empty string it is equivalent to specifying
the \fB\-u\fP option.
.IP PYTHONVERBOSE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-v\fP option. If set to an integer, it is equivalent to
specifying \fB\-v\fP multiple times.
.IP PYTHONWARNINGS
If this is set to a comma-separated string it is equivalent to
specifying the \fB\-W\fP option for each separate value.
.IP PYTHONHASHSEED
If this variable is set to "random", a random value is used to seed the hashes
of str and bytes objects.

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

The integer must be a decimal number in the range [0,4294967295].  Specifying
the value 0 will disable hash randomization.
.IP PYTHONINTMAXSTRDIGITS
Limit the maximum digit characters in an int value
when converting from a string and when converting an int back to a str.
A value of 0 disables the limit.  Conversions to or from bases 2, 4, 8,
16, and 32 are never limited.
.IP PYTHONMALLOC
Set the Python memory allocators and/or install debug hooks. The available
memory allocators are
.IR malloc
and
.IR pymalloc .
The available debug hooks are
.IR debug ,
.IR malloc_debug ,
and
.IR pymalloc_debug .
.IP
When Python is compiled in debug mode, the default is
.IR pymalloc_debug
and the debug hooks are automatically used. Otherwise, the default is
.IR pymalloc .
.IP PYTHONMALLOCSTATS
If set to a non-empty string, Python will print statistics of the pymalloc
memory allocator every time a new pymalloc object arena is created, and on
shutdown.
.IP
This variable is ignored if the
.RB $ PYTHONMALLOC
environment variable is used to force the
.BR malloc (3)
allocator of the C library, or if Python is configured without pymalloc support.
.IP PYTHONASYNCIODEBUG
If this environment variable is set to a non-empty string, enable the debug
mode of the asyncio module.
.IP PYTHONTRACEMALLOC
If this environment variable is set to a non-empty string, start tracing
Python memory allocations using the tracemalloc module.
.IP
The value of the variable is the maximum number of frames stored in a
traceback of a trace. For example,
.IB PYTHONTRACEMALLOC=1
stores only the most recent frame.
.IP PYTHONFAULTHANDLER
If this environment variable is set to a non-empty string,
.IR faulthandler.enable()
is called at startup: install a handler for SIGSEGV, SIGFPE, SIGABRT, SIGBUS
and SIGILL signals to dump the Python traceback.
.IP
This is equivalent to the \fB-X faulthandler\fP option.
.IP PYTHONEXECUTABLE
If this environment variable is set,
.IB sys.argv[0]
will be set to its value instead of the value got through the C runtime. Only
works on Mac OS X.
.IP PYTHONUSERBASE
Defines the user base directory, which is used to compute the path of the user
.IR site-packages
directory and Distutils installation paths for
.IR "python setup\.py install \-\-user" .
.IP PYTHONPROFILEIMPORTTIME
If this environment variable is set to a non-empty string, Python will
show how long each import takes. This is exactly equivalent to setting
\fB\-X importtime\fP on the command line.
.IP PYTHONBREAKPOINT
If this environment variable is set to 0, it disables the default debugger. It
can be set to the callable of your debugger of choice.
.SS Debug-mode variables
Setting these variables only has an effect in a debug build of Python, that is,
if Python was configured with the
\fB\--with-pydebug\fP build option.
.IP PYTHONTHREADDEBUG
If this environment variable is set, Python will print threading debug info.
The feature is deprecated in Python 3.10 and will be removed in Python 3.12.
.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.
PKN![U_c�%% 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.12}}
# pip bash completion end

PKN![&d@f�f�)python-wheels/pip-21.3.1-py3-none-any.whlnuȯ��PK�yVS�:4@�epip/__init__.py=P�J�@��W�^ta��*����o�Rf۴
�3C����v�@������ɷ@C��I�[��J��ޘ��C���%�@v��v�cjl`p�o�R\/��A����
7p�
�0�*˲ߎR;?���
�~> �~��Wh�(�	"��p�P/�G��)�X��'��k����Q/[D�T�yޒv��Va��]�4sQ���]�-��CI[���IҢW�bH��i�gv1"_�0��
.�l�?PK�yVS#�m�pip/__main__.py]S�n�0��#rXvEH�Q�R�^r�!��CS!��Z��m�l��o�&��7o޼��`] �=����wR�hs�IrCO���fC��T�αº#Tk�U��L��=�����ȝn!.ڜtC�c/��:Y]��g��!T�@��{��T�\s$b�� 3>��˩��'�|k��S��'{䚔��Zk趏|_�o��j�}�G�ei�Ò���l�}Hߊ*;d�[�屡�I9&71k6@Ir�(U�эx�jW�j�'H����ѫ�*!�vWLmw'b�"��"�,US���S��*o���Nn����,{�MY�y��m��F�L�$��K�6o69y�������~삘 Jv)+��j���f	�R�9��Z)�oEd�������F,����Ձ�}��#�����6J���Z���gL8�kG37�����*������OBȦ��f����k������1�%�e��fC������@���Xǻ�z�����ԌU�TИ�V
P��
�mA�Xc���fE�bs��%KJ��@��|�"�\=��z[���b7O"._^�;T��ĥ���	�ꊪӅx�J��(*6 ���_u���0�PK�yVS��5�pip/py.typed%��N�0E�~��X��lo@b6�i-%v�8��=N-�s�Ha��Iw$QF�vT�+>OI��H.�3��Q<���̧f,t�$���o����Ƚ9��Ÿ��X�����|�������h�dr1��h�d7����*��4�;#�)!�*��W���|�J��߱��7���g����]R915n��PK�mWb�=�_Kpip/_internal/__init__.pyu�A��0����e*
�	i9rZ�eo��(ۺ�Q��e����!A.����/σ�l��#�\�<��	�U��)��&W��Bl(���(k$���]�E�$��p\~�0l�xw�t�e��ɶzt�c�/]�{��"��]+��G�/Q���\'�&�R��
�nc�sq˹�KF�a��B���1ɨg8�x�yR�����kal��g��s?���q"��BT��N��Pr]a-A;�j
69؜VPO"o�P�;����b؋/n���^1�GK�	&���ɦ�%ven�ZS�i�������o����}Dd��W���*[����]��{D'�p�&�GY�	�PK�yVS_4	��&pip/_internal/build_env.py�Z�s۸�_�2!S���M{��z�P.���'v��j<<��l�)�@ۊ�{w�A$�$3}9�Hv��vKA�cUI�
�M���$��%�5�0�T�dMMʎ�����	I���� �o.I�Ԓ�Ɋm�H�\^"�yl�����ʡ�~%��ϟX�c]�x������ f������
+��Y�Ȏ]Z�K*3\O�yyhi�}��n��F�yܧ%��t��~�~����br$)Ϸ5�d�c����ʫ��Qx<�Z�Rb�ܖ�ivC��iA�d;f���-L�Z�+G�����c��kz�?cO��P.�}��g�8�d'�͜e$8�UM����f�^[L����T�0�ߴ������'<���~�t��h���0C��y{*�2��+��c�$�D*�m˛��^�"��l~�U�}������7�pp�	N�lv��R����Y.|f�9�3.��x�8գo��b�
&W�d���j,̲:߃��bQT9l/;U��t>f5�Y
Z�bu�DH��r��T��)R$���˟Tv-̼�+A��-���Vù{
��ئ)*LV+=DA	�F�;� �or.V��64X*�b�9#K�	D�Y+Ep��B����]�RЄ?�,5?�y
��eʂ�\�Lȼ.�
l��SCeI6`�mR���I0� q_�P��W�z.tT����%�`W""���8����1l!���#+��Ȗ�`���aȏ&���B:q�Pj5Wߢ�xA
�(����"�0�ↆ ��y�Jv�v5ֺ� ��+n�n$����*%���~nR��k�p}� X�A	�|îiu {�C���e�+�@y ���A\U+�2����(À/CM�3\�K��Y�B�q`�x;AoG`��#�hG��
�Z8��auh�R�#�,��O(�翾�%����}A.�	���!?�H�mL��lo`�#9��L�=��-��)W5Y9�k��wh�o���x���~�kaUQ\!�Xm��/�f/��^���Ko9�4TL���aYrC3���Ei.2E�(�г�rK5U1��B�,�t(�ߦB���qO�>W%cb���&�x&��f5�*/դ�>������	��U�ְ\���@�0N�����sl�H��z�D�ȱ�u�����0���+�F����`w��I!b�J+EA��(�g6�?J�*蝢��I�eXu��!�ɫ�
@���Bi�B�S��ͦ�h���B�p8찳�g�u'd�g�(s��ҙLV� ��p��������ңlq���P�
`�?�J�5����&3�T��ۆu7:���"Y�L���W�
-�b��s����m�n����sPb��e�w�E�"G��5��ʰp���U
르�@��ۮ��ք�I �7����ǧ�����X�>Vץ	�3��W��7�qn����%D(U��Ά3�%s��"35f��Y^L���֥RRFu�P��E���4��gӼ,���aଵr~O4k�Z�.3�.��H�=�-c�E3V�ʜ��fve5�.?a�e�U����ѻ�4�0݂�4Չ3<�P�B�/B)���8FgP�LG6,Z�ئB����r����G���j�c7~1�^�;�Q��i�A��}��Uw�g��-(^�L�ʡ��c�1�.�.�����(�l}�����_�ߝ�|<[8;:_c��C%k⇗8�(�Te��l�%���6@eVK���b�rA��I��AB´GΏ��c��-�q��bAi�$ê��D��3�c�.I�M�(�c�݌�R���;Uhz��]�aOlٷ�6صڼ�豾+�����^r�}ґ�+�m��d#ᶯ��V�:�bRp�^���o`cx�H���ۦ
��gO�o/V��ƒ��+Z\g�{�	��Ck[���,���3*7���x�`�QQ_�At2��?c�L���]u>�\W�%R�fGBsg��os�>e��#���=�Q1��*��\�Ul<Ǵ<�:ލZ~�S�!r20���E�FA��X

�4�.�
����#g�q�L��5�2E,Rϧ,c!�B��mL����LضG�+�@l��3�l�i��YC��.���yX��]q�48R�L�g���\
[Ҡ�҂���;�R�
'�����PW����%y�ԂakV�5����ܥb��!�u�
CT_�^������@��Y.ps��j��{��@�3:��z5�lƲ���^���#�}[�{��;�'��f���ծ!ٝI�Y��g���ٟ��7'K8�憪�!�VMq�oajuyR��M�JD���+%�*���HV��:v@���D-m���w�
�(t0Z59�63yV�ĩ�&����R��`�����K.UJ�=`������H���;�}�X��L��\��_l��W���f��Ұ�t���6n�I��u$\��Rظ9|��>׉y���-9-��Y���2����qs�	S���JVh'%�ӛp��gY�^�W���zt���&�E'���/��ɨz��]bk,���n�Nxf0��L�R��I�P�%�MSbQ�H�3��V��_d���V����Y����,І��$7��}�Tǃ7����+��t���}�&�x�5��r)y�1��B��"�T=s!��FW��#�?[�42T;	f.Q�9L��.-C�	��}��~�C4�<{�V�w�Y�+����0�p�q���&Hl` ���bZ�5�3E�NsȿY^L��h�D�'�+.X��,7��>�Ŋg���ר�|e8����K]+��Q�U#�#W�N�3��hC� )ǯ�`D¹on3��px9�(\P�D&�`N~�<��|NP&��-!Ϙݹq����`�'�N�N����o^�?9^g��΃��I

���m���X��"3��g�7�Ջ-��|ǾN+�ix�vܜ��i�x �_����/iZU}%��Wa@�JCČ9��MZ
}E[mB�{�(�u�~�n��3AaL��J�G�5�
��PK�yVS�Օ�$pip/_internal/cache.py�Zm����~�b� 0Uȼ�H]T�
$ι6�E��bE���).�]�Y	����\���M�6�>��}���yfy����J|/+�WGU���bqu���i�8H{(��{�`M�.�~��}�h�ծ1G�N5FE��:��w:w+�F[|��v�T�\���]�-����^U�i�Z�%�M��ێ�;�_	]9�ԍ�wVɣ�ܫƂ�c[�˞d.+S�\��'��bf�0�Lէ\1����=��J�/u�x뙝GS�Ҧ;���rS�Ɣ��<��>�����n��~d�1ԭe��-f�N��M�^<��;�^4��죮
{�J�ڬ�;d�d��"�P��t.��{�cIƪβ���U�v"#+�K�5;ʭu�J��n)���~��>���k�JH�m��=�gϾf�!"A�՜R�_�a�9lZ���&����:�ͻ���XU�FBh�I��J,֋�J�ʶ�ʤ͵�K���CH���Ħ��a�d���ezP�
�W�%$f^JkGY/�7�b�dG��n̽.��gR@�#p"QH'ۂ�‚0�Z�G��,�ﰷ1ƑZ~�T/��1*��-#��9�3��1�l5M�m�z�d�Y;�,K��l����C��ҩ;�vò�-��4�}�'|�鉐U!�X�6��C�x���Sw�@���.;�{m����˲�'kU�[�*d�ji���\&�3r�;&ˮ���������/��e?+�Pe���ɍM)�Rm�,I?�q�[6��t�x�$m&B�O$����U�>���y�C!�m���T�s��m� N��b����%�bs��9�x�R��9o�=�����3��({5��|I:ql��{�6�`t�z��0h�w,�|!�+� +G�W�BfQ�T��HC��Ni���HD+�H7����} ��6����7�(����@߃IL#�#o#!W�x��=W�M\NQ#��%y���ly-���b͚�|���ؓu���_�	���Ж]�ܐ�����oǴt#�#m������E�z�>K#6��*/�BŘCxr�m$�QW��Y�7tD���ZyW�e�t�Ȉ�v�z�۶����n��"��Gd
U�P�5��	����1�4`Q��>��C�n����/�S�J�Ժ�s�r�#�@ou��I2K#�j����C�v�b�u}��5@õ�y�����|�a��)�c�L�Tyakz�;�Sؽ�RR ��'��t
�'e)|Ա����	�JX�&�gU�6�Tp�xG�F&rx��)��/��5�7�8Y�Wc.��c�8�V�ZOW-S�
)򞶍�b�ю�#�X��w� �	?��$F.�tE<�o��^����	
@��=&��{rZ86���Xŀ������b���On�-���h%��a��o���u�E�]?�[1o����^?����i�cR�z�� S�J���w��`T1�!�EQ–	��1�M�qR�aA���f��8;��b��6x(�g�a�lR����,czQ����.N�=�*�/�8h��{'N�jF*I�k�Հ��ۄ~N����Ϣh�����1k��)7'I?�b�˩s
{����}��/c��A�2T���׵J̒��?��X�|����1M�=s��?E1�%����g6,2��A�e�X����ZJ|�#CT�IFF�V����<@z ����@���g|�jB��V�7���%��Z��˸���nׂr0��%z��ʯ�P>��	Ni��:ؾ�oxf��a��oC�u\�~/��I�d��`:t��i=1B^lP��T+�>x ��������Jc>Rk�(
��Fx}ZPSq�Mn8v�l5w�'����i���n�:ZU{�b��,<Op��$�&奁,�pbX�NI��?Z���t���:Df�E�'UqԹ#��C���:xځM�*�*MS����8^l,��_
�y�2!
�<�ꙿ�"&|?�l�0�
�yi?�5x_�K������W��;��K��Kpm9�n��K��!�����p�e�[���P*�F4�F���}�~;{Z��at�90N`�f~���G&���p���h5�t��G��
��4�ޥ7�j6�^�V��泗�gR��Z5��o�>.����6� ����j���,}��hy)v�L.�����Ë���MjG��j�^��m4�'�/l�/QWg	E�<;_�\<����W,?[�$�Wr�8J� �/ķ�$��E����e����?��9���;o�ۀ���)nj�u���ꗔ����A��H��B8o�Rf�v�)O%��d�h�#����nj`��Ma`�s�R�⼨�߇�_���k�&��8��� �E�f�h�)�h3z)������W77o�߼xu3��4[�Sv�׊���/��=�c��S�&oUn�>�>r��x�#c]���ul�.F�q���vL=�������gNĨi�,$� ���c^��̄��d�ܻod�v-���ޏL�����SC�fOcjy�K�H�ì��ݙ��G+������n�K;�~s}��}8w7.���"�)�bOg�f������R!c��x�1:�3���Yg�&�'�QQ����FH`r���(�����Ĉ�d,ڛ��P��Bs��!��]�tVtwۿ|
#��Ԑ�Rn�|�u�J����i<H;N=Q���!�s�F���xl 뾛�Ѹ�D�9t�ս���
ߌ�R�V�.��r�ȑ
�O��U����$����/ei'"�&~��/PK�yVS���Z�a3pip/_internal/configuration.py��o�w����QG��a5�m��w�K��>Z��Xt�E�R���߾�I��d�V3��-���oA�T�q��I%����<��+�WL�j]7Ŋ��˕ȋ��ۍG,OV|�؉b[)���L�lN��Bd\E�h�dk\���D�b.���l+�%K4�#v�w��~�խ��
Q�P�Ĝ�
͗w
	�I^!L��.�l[Ȕ�\ͥ0wl��P_r���N<"�X���x�B�A��X���̖2��K�,+�I��B�oj��U�6�O�݈��y5bg���6�#v.�����~^��R���u	�5�R�Q,r��"�0�LY�!�͘'����u��q�T���^��"Iy:��YW"��H�2R�]��ʤ��?�]�^~�ٿT�������	�vPs���j-y��z5\'[M���{�گ�3v�H�$O?�<�
Fa���S�?]^�9{�>��\��������XXB��o��`0���������7n�T �,yV�v=c�A��@Ŋ���
u46�<�%�D�����q�j���)�\,ĜV�=�|}r~�e�m��U7;U��$RNkn��O�%*��O?
Y��l�&�F�"'��i��7z����*6�zsv>���'״�K:�]��p�(�������$��>�\�Du���_H������p���|<9?;��/ON�ˋ�_k�.82REX^�e��i�4�vq�~2f��-g r*��K�
���J2�/�^!�+L�����?c�8v�W�;&�z��s�Q=�d��w�L�m�7�X�9g!w[H�C�b� ���-�4�$/�d*�NCZ	jM�T��J��
�#x�qj��~?��`�<۱R�0.+����6H2�}��O���W ��"}�~��� 
���ZZ#����Va
0
�7ľ����W��W%!-0��c��c#
8�Q���ˤTlW��"l���_h���^b �$�[�y-P�U�#�},[��:�(��2U|�WC�F����1ې���f��l���0T�m��=��i�c�"p��蟅�C�6b-/8d@�W("�"*>���
菻�s�� tF�D�{&�@��C :d����2�G�B���#|ܬj��_hdr�=�����Űe�F������n�Z�>l̦mV����º.GGm���'лy���o�lF]r��vL��\�bH��1
��BhW�|���#�~�fRJ��~)�H�"��/�@?�:��I~T��捘�a�uv����Lѹ�*$���N�* !`
�u��߃
ZˍO��.�I�W�%�9�X@9*�}[�I��uQ�{4f�vA�6�Zc�x�v�M-<j��N<��I�h�"� ��9d FȚ�␡�*�!�#X]dȡ1 ^@�AncT�Y-���ZE��K�ƛ�uIa��<��Lk��zt�M�7oL�hE�����`o�����Ԩʭ9%f�D��)����`B��a��!D`�a[��������>���گ���������k>O0�m1Q�%�d2�Gjt�����Py��D[�;��
?#���g3ԅG�2Sǁ_���o���ֻ�Z�h
�𠯄�`�}|��CWE
�1O6|�v��ƚP,dI=vf���j[/��=M&ᤂ6l�%pcH8t
-��Q,�~�)1pMY���	��"�)d/5u�?h�<C�5E?�z)���]��%W�9QHQ���ۥKY����`\�q`�J�6�;�'�Lj0D��1�J�ZnDGj�
$V��%u؅��w�&U����A�x w�
lX!|��ٶ��W�ѽ<��e*�L!�`��D�)%�g���y<v����<@�(W��'��@Șh�5	?��Q�C|���)���H�L����J�>i��ࢀ85_"���S���:���~GJS����)�V�2��Vw7p��C�v�IĈ��krH��`lv8v�v���;5�ρ��g̰�6�m^ү��4z����ѶG8�ÏY��ig�g�4��1�t�wc����X`;��U"�c������W�|�f�k�\�?V&Z���䏰������n�w@3I��{�W�]��|uk%]}�mD��mM��F��_���'x_qKwcu˅MEz�j�+(`D�C�n�wQ�ձ��Ne�JvtW%�dQ�Z�%����m����>���a��Iy�y�0���
��ֺ��Sz��������[�j}[�
���z�Э�H�">I�S��=WP�,�r�;!d Ӑ�ZĚ?@.�|�5��L�;�B5�X����V�6��-�
���L�ˮ���,�@��~�9Um?/��K,zͮ7�kq��R�i�й��j���F?�DRv"Y�K����K.��sU�0��exH�����QY��d��د�<U=a͆}�䁠c����t���(׺�5f��E�!LLб�P8��r�[�`��B"��O�y�-�:���J(���Vo ��5����(Y��cJ?����.JJ�f![՟W�������l���1P��Ŧ|���l��-�nv�)7���Q$O_��kR�n	�b�j�9� �5��-DK��G����|��Oo�Vq9���g}�����ʭ�a�{�m�7�9c^b��^f�jn�2�W�H�랼Ι�����.!7�$���z�º��\
m��c�}-����|�y���9<+l���4�~�p�[YMU��&���Y�5GI	a'
[�ضf�Kg�5t�i�_o�:A�g�py[(o����wo�nm@�8�6;���+����8ls���d��u�CO:�O&�{�|��&}Z_���^�&&�îO5��:�ia|)�k^p�d�]k��u��?I��EE
|�(����'���w��F�UW��m���[Yӑ�������p� E^�3l��M��/1��5M5j����.7���{���ݘ�\�a.g�W�N��j�<�Z�4a>�b^����=���
�lYU��|yy��N^��2yY��Pj���~�󟾤����/�{U�ǁ�AV�����/p0Q��?~�P婾(����@2�)|��Ε��!vk��Sn����lb3f���_~�z~��������r���ɝ����nYe�7TR���a�����`�+o(v�I����g�T$�8���͟K�/���?p�|�/��4j|3�p��
�S3sG�/���q~��i�T}���9��Ձ���ތ��h�RVwP���>LjWw�0�i�z����q��i�o{Gx|�k�t:�m%o��rOS�8��j{��6@n�,!}pX#x�N�]PZ�2���@` �ĺ��Ȟ��i�����J�Kbi�i+v&�3՝�@kњ&��_�ZK�?�h�5G��xݦ0�/rO��C{�ƗƯ�IS���^�uf�v�\5W�C��JG�,�k��V>���|���zV�a]�4�Z�s����:M���*�sG�W���>��Z7�*|%��)G��k���I��;�R/�	��m�
�pWz���eS�K��D_� �3�;{.2\,�DbO�_���J.�p���S9h�<�8:|:�H8�׾�%��]�V:�vc�#�=(���Ma=��Ώ��Aa�)$L�V��|�.�+U=���M|��r!r�;��3���K���WTZ겻W�z2��P|1�]=]ѨX�)}U��B8^�j8�t�h�e��{�V]�"�)�<0�0v�z��]���H���$X/=|�dK��V��굻J�\���5�-���MmN�����Qb';����1E���/�A�<�3q��h�m^��G�f_�� ��D�m5���i Ī���U	v�{����.���~N������6�m�H���E𨏈i1�#;%�>����O�`�PK�yVS�yfl�1pip/_internal/exceptions.py�Z[s۸�~���2��$��9�my�<��fr�ęS[9."!�c��!H;:.������(���Ӫ*�(�F_�n ����*�LF4F��^W�Y�uS�R&wr��(:9�6��j��b��JYU�,+�Y��Z��?d-�b"V S.�Q�R����eV����t1?��8���û�x�%�D�����Y��D|-���N/�2�߫"�U\ޭ�2��ծ���l����J��Q�6�F��c���y�/��v��37;�0��4�<[���K<�t�y���P�}�Q�Le-��_�Q=���?�Z湟~e��RU�'''I.����t5j�9�LC{�*- ��*u3�Y�M%酥�u$ީBU2�(��p��f�$�?H1m*6�`rH��!��Ѕz�u�,��,3򐇵*�L`v�G�/��ޜ]�EBW"����Շ�#�*��%S8h�qhB/�PI-d���/c�ܓ�������ꦂ�^W� LZ���I�{1�R�d�,�U�%����͌�V�%UK1�yf�|>�_�cT���O���p{�At�M����Q3�A��XL�����C�b�3CP����#�xw��J�k%��KDA��o�H�V�*m��g����8��,	*&V�)s���#zϡ��E���p����
�g+�%g�)2j�3al'!��T�1[f�l㒥�Iޤ�]al��H��<�SL�^U��LV�kK�۸�4��=>�~�`yGhk�1Ql���=�d��Hu?���ƥ��^�Y:Ī����t
U�
�F��0�����*]P,Y�y��$�x�_�ӗ��)�S���Ֆ�-t-L��H�a��]|I�H�z��
��m���B-Iӧ"�����H�m#[bA�je�ͦ?݌w����e��Z<ZzOl��LL|�F�Z���P�t��L�9�brώDb��wZC��0 a�[���� ���Y�>ұI�h&V>���$i*#2q	W6b�5�G�3��/��߭O�啒��-��=�)\��F\i�i��p��;֤�tdRҒf2����C���
4�²�9�A��$v�7\�s�C�vgG�e�pe��$9sjX��
�*u����dy�&��^�!)��qr�RR݂Hu^ك�~���T�������OD�
�;:&�ڑ�Yٔ3�`u��V�,�؉�Q3�l݋c����Q��쉃Ѕ[���3s��)�<����m�uw���}�n��v���Ѯ�����nl���5B���8�F],�-�w��f��iJU��qk�:��j�`��`��x7��}�TN�r�s�ύ'�Q93��a;vCՋ�d�#��${�<F�*�@�>�5r��C�T�25�h�!��� ��0��au@{��Hū�"G�n�%�kY�T�Ma�dͤ�E�PحDkrEhz�25�a�)I)����juz{ky9�D��D4�(��1�ԅ����M��P(a�"�0q���t��"���a���k�ڔ9%�ӝ0}n�(<�o�OJ��~���iB5Vg��n�yn<�m�4	3	$1	�>�[Vie��"y��!���E��K�=��
�]���ڌ�M�S$���'c�*+-j��YD7����)�:bTuO?�v��M�ԅ��!�ײF�'��v4�V�;l�W��ﲁ�<�����@�=w�v�)��G�0��7y�����p����_�&�F*тj,b�RG���
=�-���q'�[�.�@-�n:b�,�aO�;�����n6?�����>�[ݩ�i.7�T
ة�u���sIN�DZ���<�^`�;�ArĨ��|�*��wr;s�7b��z�g��^��N�#[PQ6�������|���•g<ft�z_h��b���Џ�X�sF��8�4��F�Œ�-_v�e�Z������f4�V��:K�%J&��L�Q�.j��m=�ư��/�YA
]{J4�ߊQ���V�
�<R�gs��je��(5�H���%[Rr�e}Qf�g�c���f�T��Z� ������_�n�"�PE��k�&UHk�bq���;0�ı��V)
��6p`Sg�RH���:_ƕ�L;v�$�-m�^�RS���@ ۶+��,�{`@Aw�kB�2Z�Q5ʆ��b�߫��� !sۉ=�j*e�BYbS�9յ��n��&A��5�.�o�,�}�{X�\ B*YU͵�9��
����N"�Q$r��-���TL��y���Һ�DFƨ�<�zAa����K
�H�6�̧�����@��d�/]���U	�B�{�q��uq��z��������|�V6�~R�U�)u�s�&�9�/�4%�I(�ac�li�{���ӏ6ۖ��E��Gall��,��Ƈ����+���S�����ܿƎJ�ER4�ʒg��օ�1������{QSp�nO���{b(=�ۨM!
���PIv��*u
EW0M�����-��fJ=�4ڤ=�xP����L_kK�!K�&迲�w�=t�)R��\����A�F�[v>�Lt��?plDxްᄍ�qh7Y�+䁙�:���������L�����O�e�!�P����KI�	h��H@�3>�{AX�R��B��ŽZ�Cr�ӟ���nNV��ө{���o��Ex�4>��������],.}#>
��M�DO����:�)��f�x�\K����uv�7�P;7'���'iꐷ?�1����lC�B�U�C�ܔ��b1�Z�dh�v�P_S��+�,��	MP6~�~�ѐpDSk�X4`;�Ŷŝ=%�
�5�6�+ޕ���4�P����7�ډ�G���d�^y�P�g�u'��?S�:�K
V�eOG!�W�N!�$������u��w��BSgT�X=��	o�~����b~y���5^��vk�a���+UB�`��Ͽ
#@��P4!a��1�C�(U����K%�à����x�l�/�ѯ
I�g��̗�{׊{�:��;�R���ã��@�/�d��<)�p�1��S���$��i�,�C�B��|H{j(.ǃiV�掹��ṿ	[D�Rֱ��	с����iv�|�K�N�w�ʤo����ݻ0�|uE����JW��Z���q�\�)J?"aR.Y�͟䛫����{=��P�nݲ�3ƙ��5
�k}(�r3{�P�o����B�anqSp���NW�cx��LK����1��|(Q)NVUV�.^����Ǡ.HmX�;����W�_����˅�tv��ٻ�/��G���xv}~)�N�Q��?������������_B�����".�^�2��*��W�D�z ���BB$��G
�*��rCCH�@$S�B����|D�ȭ�4��ޢ@i��ha��A�3���O���o77��M�.�kw��q��%~�`�0r��
�^o���0�jFW��y��V�AdE���}s��iw�}�Vth�&�ʁ*�(0�)	4{�koWX�a~����g,F0G��~��J��B�EW���Do ���b4
`�������,�3K����w�Ur� ����1�����o�D��?��o��T�� ����~��_�z�{���=�-�<��~�t�,�9̫��j��};�B�x��]|��Bv��L4U�M�l��6�ʚ>w[#&@�j��eԜE��mK��CWcj�Kc����$s8��2�/�"+��}l'�+�c_��ke�!�u�m�h�5�2������Y�@ݖw��6	�8]��#� M��c�Dխ�+�G������!�{� ��cDF�����b�]�O[���u읁�'u��i�E\Y��R�ɍ����u�޽h�q��<���_�o\���7�;����]�2ߞ��.�^�v�e�5��a[!���W�U'Ġpw�l�u��ֿ����2�r�x���[���wȷ��ʸ���rΧ��r��.ۋ�+��܅�c���L�t��?}'v�n��R��K=v3���^�j���4��C.�1���3�#G6����X�|z�>E'�PK�yVS'���Tpip/_internal/main.py=��j�0��~
��
�}llǝ�v٭��&J"pl!)y��)�HH���?H��V�<�\�����F%���q�9R~�2j{�.�59�
�J�<�ek�h��g"��,�(���PJ�+YKB�N�M��h��
j���]%��ȼۚ�*���УEJ�E�Ɍ�
a$�����x��8����^_�
p��Ńz�O�����R��l�r�S��s��ȌrE�E�}��s�PK�yVS;Ւ�@	/pip/_internal/pyproject.py�Yߏ۸~�_�*�[H�
��;\�.��%@��(�Y�TIj7B��{g��D�G�����$�pf8��7�<u�8��1��*ݶ�rR+ˤ���IԮ�Zᗸ�������� �[�w(�ۙ_�ɮ�=	Uk;}j��ײ��#?��҈��҈�Pn�N=�VֿM�V,yHw��	��k%�̋;eo[�/���l6�E�v��Z0���uf��_6�Ԓ�b{��͌���Ť��GU�J.W5݋�t�b�p���T��a��n��u���P�zguo*�����i3l�*0	��,ҶD�����V%�B�f��˶�4X0�W�l-�&ǽ�}��UŊ����㮪�VGQ=&�ȱ�a�n5����Oo!����3��a��.�U��١��8�X�j.]x�A,����Q�<@���(g��#7�R�z��\�f��T�K�������.�������i%F%��$�J��Us��׮��t�l'*�HQ���<0`�]Q�3�x��繽�ި&��
hQ	�2�v���A4)f�,�F$�`(�kqX� �E�~�dOad���u��4ڵ^
d5���b^�g	�9�8�,22���l�����C����r����q�����H02�}��#��L�'i�"�K��N�C.�xQ��=[��5�\�.�3��I��$
���M鷌EDC�N�
H�IZ̘E���Q���ry�ɐp�J��=x�[Z?%��x����xS|����j-,i�]'�A��2w�z{nXq�B	�	��@���C�U]I�c�S�Ϡ��N��Э  �!M�E��Zd�&3��<&l}�-x�r\C�����(,/�-
����
/"Z+6��	���B�X�~�2�����z�@C������E&��(��ZS��)7��K�}�s�3�a3��	��k���y�7(Y	���-�.(�]�-,�����VUo��Q(��I���$kX�$9�T$�	K��P��F:a�Eݏ�(�h�@s{�b�<�A�s/�J�P�z{�1AoY^M���
�M�/}��LJ�9��*#��UZ��q�qK�Y�yy�lta��#�ʌ��L)�8�e�M/B&��Y��!�#���k�x��l�B�|ۈ
�ַ�k��U9K,�2O�-�Pܟ��a��������Y��L�����"A6�
���Q$DZ�9�K4�N�(	;֚Y��v4P�믑�1[��þJ�y�Ew���f0�Q���YO��6w�[�-��n$]R��S�\'B���G\�����.��VV�d2伲.������2=��S�S���(�a���Bd���g��u!3�J�$�� �N[D���#?�[�',��Qx,�Pp�>�1'*����Z�ݎ���i�U
��B�8��q����4��M�\|U��"	��L��&��=�,H~b�a�)cx
&�Ag��[V��T��qR��/o�w�[ɢ�!�g��6	�~K���f��i�����U�h�&�`�M�z��p��pL5�_y�b�:K�-��O�뾁tw�����J��(4�@�zhCdq�C���p�P���qὲ�	�D(�XF���V@pFv�C,�Pľ�f)d��Êo�6�Md��ݼҠgHRA�v�0���j��,�k�(DC���3G�K7H�Q��FN-4�֔�$q�������=�߆@m�rm
CǷ��%��<�}~�e�'�L&޻�9���`�aRz�#���Άǩ��E����!$+�;4"g�,m��
��,��1=���/�Z��w3ʷ�/�G���W+4\�i2�5�@
��w$�h�	�yFK��83�l5�b]$ғE������z_��@r�U�����9.��#��:"5Ix��d^F�|5p�����9���H�zH���:��z�}�.���}n`�4�o�B�r�d��R�F\auwI;�e��ܷ�!m`�'&4�g�\��)ɹJ�J�4��)�Cc=�ۥ����W��qHtZ�9�d�6�2%j#&*!��eH�U�-�'��@���1�>Bgڗ_r�.V�L�D6�{���!e������p�V���5Y��@�o�+�������rh�4V�r\H�!�rL�
��	"����'���Ԟ��>�7 �J���n@3c"e�q:#��}�H�=�W��Z���i���S*���C�h ��\�I�I�m�6� �xG{��924+O��&���O	�FF��k��l
�̇�t^S�����B~���,�U��.�;d옫�H�*C���PK�yVS�g���$pip/_internal/self_outdated_check.py�Xm�۸��_�*X�\x�"8��{.�&��r� �mq�:�D���D���k��}�eQ�޵�`[$g8���H6�Җ��
+���y�;�w��Qm�_��{�އG�َk3R*�u��ã9�U�U���_��
{#���Q��� /8]�=
m�j���q���l��-�3ٖ�)+T]��*8�����<��@�=����[�x���Ð<�����}ms�>J��F��,�*Em2#H4(�wZT&0�	��*�ha�qi�=(�6fj�����+�z+qs%k_Y�*^~���m�崽a�^9�7W�V�
Ӣ�q�y��4E�(Z�k��R�V7��޾��w��W����oَ%?^]4W���7ۋ�7�JV�Eܰ������Z��-oD��q�f9��XD3I�6�q�2c��]��~�+�V�|�?�Q�t�6��Cdf�_��*I��^<��^;ha{�::HR���Z��,vC�[�����y�����aV2�I�T;��˜N[�2?�؆2�#D����9�;�	��j<���#�
��%�{�ē4�2�Q�e5l\}��!�OJ�it�>#�
K��R�9�.��^G\�'����%	IT'���EwIo��?&kB��В]�+T$��n�HK%�
�Y����Zk]���^��G�o����~�jYH[��;�>�.���fðPv�T�e�Z��/A�0�[�!y����LR�G^�2[Pv�Y(�4̨�qY��5N!�������j$2�Q1��^�0G�Z;tA�َ�'���m�
�ZE%�ŀ��C@{-e�t���&!1�qM�g"$���k�8.�馆?FH�rK��ல��́3
��S���׿&��D��-<���$�r��dw�=�zC�
��f�jŽ�0���\C����#S	���,����P:����I��c�#���R8���(&�a�cV@��^{�>정u�gl��8�pK�,��&�~�܃�6�T��+��.�z�d�`3}<��r��O6�L�7��8��G��!���Ꞟ G�]�l��6���|�ua`�Y���"%qƪ8���&`S�I�W���d1x���}ꍝqQ0���G�9S��E�
n�)��kC�*�`ۜK�T0=��\����3QU�y|��G�e�A
t�%Z���v��
~�T�9'I��@+� 	�9Pj��7�-�O��a4.��~G�}w�92�A�@7J\[��Y�o׈���
}-��P��H�R�C��V���Y��#9�D�3�l���iy�S�"CDM���HBt1	DN�n�v� ��͜|���b:��IG���*�v�D2Wvͬ�?0x���J<Q��N6�:3WZ��G���|��@GmD����Ύt3�F�ZH�a�:n���	����M#�\�~s�!�
`�����8��;5��צв�����:E��7�﹡l���Eߛ�\�݌"p�����4�P��9����l\�@���c�T`&)ZuHOX��W�����(��
�;�/Z�i� o�C��{���1�8����\�Y�k�?M�a����4�I#�]MdZgV��H�B��I��k��[��+|��w�k���\IY�㴝�0��8�G>A�P��Ͻuຝ:(��w���w�:��{�F��9Qj��;)�Nc�!?�k�ů2�&�q�`��!�C�/�!oU��X��`�䙺�i&En�C~��(woy
��R�S���i��� ��1��q����؝}w���R������[��C�pu��U�<�8��X��]�x�M�1v�繿�Ow�2P"K��^Ҍ~�xs��,^�����ٔ���ӥE6�4�`~r4N'N����}M�c��M�Q����-t�ɢׂ�	U�
�Y�+��U�C v���}=�*:Hp?9����7�i���s����e'�/��甛O��M�k��?]��:R��n��9��\���5��	�B5
i��B3�7Ot:����u���O5�C�uI�v���řo�K%|��"U.�
:`aB��L�.ē(zK�?���Z4%e_�9>��]����$��dF��S����ܻ�:�Rra�D��ig3Y$S&1����n��٫�vV4�"��ُ�;��\^�3��
s���͒�sI�y�$��f��=�\���vn�R�s�ݺ@�Q	����P�եSeVSnn�����R��U��PK�yVS��_���/pip/_internal/wheel_builder.py�k��6�� ��juM�ǝH���m�$�}X,�ŵՕ%U�v���73|S����8��$g83�7E��~��b苡��
�]�U]V͎��9����{ӈ���w����7��VQ�Vաk����n@�g+����g�7���^����>j�ysL�Kؤ��y����߾�Đ���P�MQ�����|%QtU��w�)�6��HD�[�w[4mSm�����Mq����`>�O-��4wZ�$GS���$U
��f�ī��}�#sK��-'&E����j.���c��\���:�(��ИZ���r:���8�B���� ���Vc���XJx=���0����`4�(�x�ų��#�e5���!�s]�w�8�L�̡�/�d8�DC;�&�͔IiЪ)ay�� �Jl�zj�s8�>e�B��
���vE/��	>��ж�ȉk��P��ܙ�ּh�߉���o�\8�Y׹^��
�~�ۂ˚�{���C�����֬������l��Z��-��9��<OV���v���{k{�m�CR��(�,.~���oyv�Ira=���W����o߽z���+@��j������{^�Ѓ�n��j�xy9U���]�	\�^���b�!y�~sfi�j�Z����۶
P�a,��D�.���+�p�j8��aB�p)jnݶ����-gE�4�lE����,���Q��g�U�� ��e��f�z�7DE�hk�,I���v[%ݍ�/�#Li��\����Q������'/��q�����Iz�x@����]sr/h� �B��Ls^� ��d
�kX"���c ��tN�ʄi8�b`h��>2.������J;�L8b2��F���x$���UG�HY9r<��yQ�m�odQ:�EJ(�y3�<���9*�*�ۗ���i���a��C?*���kJY��`]�K�w��|� �w0���P4%k���0Ė�
�d��v >E;�[�����b�\�9m�4�W?�/������F��/S�wG��?��53N��G�Ud�PjŦ8����$tQ{���A2����I���B��4H�\V
�RM�2�'��˶y�����Jr�DiB�y)�(ȣJ�O)�f�Q�xj�`�ŤT�������N@ީ��uo�)�)�8������S��7�w:�f�r_E>��d�>%�R��*,���H�g�D�����J��y��u�uI��	c��T��	hPba4���V��X(AY/b��@���b<P
����jqWT�,D��Mj&d��ԹH�C'IQ��P�5�	�(:�u���=ȧN�6RȆ��Q�Nw��^���ݎCƾi����.����A$b��"�0J�P�a�����9���MS��,Й_�3�
�L����!K@�dž9�;	�;����F�^ ��˵D,rH�Ӏ�dx2뛖��a���u�F�?��kn��`Li]5�+#dr"(>fo�|�+ܠt7[MɓF�R�%������v���!��S�<���j{p+J�K]q!rH'�Lʱe47em��}s�k�R��&�Ń���\� ��\������JC�\���ܞ�<�@�O�R�j��u�S���
6,��=��昷
1:��B�Ȗn��Z�j�Q9M�d�NP�H2q+I�b���P�i��/I�9�H�	e�m{)�0f{_AJDs�dž�@;1ヵ�23�ۣ��If��É(�;C�����9��@
�
�8h��RI�-:�A�V�o�#��8/I5;��D�E��^��(_MX(bݽ�<�@�JJ�	g��� �jo���q�]%(�N�P}]��C�8½�6�:�'C�j�
d����H�O(Y�����P'K�b_[�g�gQBU=�C
ᩥ�yOtj����#�0̴!;T�~����`�l��H�-s�8*������G����Ut�@�ڠ�^��)��K��}4X~%gwu{
��4m�u��϶q�	��΃:^eºc&#�l��(�e�
ź�u[ρ�B�#r��M�E�i�"3�-�@�hj��[z������z���I�_�
�\�$/�
���ZE����f�\�J�(gQ\:;SJ��V�N�~�͈l.��~��*<VÞ6��›;˲� l��XzV%ǵq�C��e�+_h[�&���wgg�k��f�w��	�7��rS�?�*	�F����+;!��n�ڞ/s*��4�ߖ��s�������W ��n>�۪)7�4I������ɟQ^n�����L�0:��R"�Tuj�@��6L����5-�\\H|pco�AyF
��8��ҩ�'		�O�O�I�dN{���9����y�q�ͼ��u���iϯ���f^��Q�ˍVj*7�}���Y�H&�O�1�Ţd[y*�32�.t�	%��FfL��V�
6�y���%�}��	��d�g�?rN�������NUݯ/��Ui}�T��J.}<��jb7
��}�I�t`0e�w�ڼX$�Ί^�d���]�Z"� 'o���y��l�@�6��<���u��Ͼ�r3I���eZ!��KY�����,�0'�<O��޴��Z�<&̔}�(a1B���̹^�B3I�C��e�l�(��lK�)��[!�ư��)ޘm�1+�q}�H���܌u�Z�nX/�,�
ftʛQ��;���_=z�A0�Z[L�Ν}V��hƻ�Yr�p��MyZ�nlP	��0�m�q;	�L�#x�[�S���Q�黇�5-�Pk'U �1�^��I�dU~U���fn���anf��I���d/��q��� =q����|y9W���|���ƍ�y�q��T]xBV8�����Ʌ�2D+��,.�R��Ŵ��\�l��>�I�ܶu-[��[�	�"�Q�4�~��u)MR$h8vp��"�l�������}y�$[(w�.�QRc�Ѹ�`���"k��W
��S�ӠC�uh7���A4�A��tJj��L�\�6�����h�׸��LRE����LZ��O#�c�c��Fe�-�>��f)�%z�;Oc�G2����>.�y��:4���˼�Z���ì�:�5��U�����U0m8c�6��Z�
?�AOw�b���E�0�,"m��s�lz�`�I|B5�����5"���i|�R�O��~�mg��G�PK�yVS�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�PK�yVS�p���#pip/_internal/cli/autocompletion.py�XM��6��W��a%ī69�u��]�A��"IуaH\���ȢJR����?$R�Ӥ��"9ÙǙ�%I�NxE�jҊg&���8�5�\4�7JӺf;�x!e���e�/�$Y,��R��J�w��Z�8���BԊ���Hyc����O�i.K���ǚ-�;��ܷ�/�V���"˫��'�V#d��dT�"���mv�]���
6vJ�蜂�tG5�
L;��]��<q)�k�b���f�f�G�h�jA�H�-/�A�v�2���=AW�AT��,B�aV�x���Y47�K2��CT�T����X�:��=�Yn4�@��x�������}�KH#4D�mF�#��dc^�g!�u�n�����?H��jk��l�j�$@\N'B?�T���J�fس�XA�n��zn�+���+�j�ٱ�BΉb���L̤v�qt���L�H���a���v�c�)*zb�>�7J�-Hb<��x��'@�8�g�ˆ���@5�DK��O;�>Ɗ�2�0�Sв�ӚTT�[7GV�7�V@���_�`
'���ȡ����Uvu[<R�
������ATųɡ�qӽ.���]�*�Atm�u1�è���c��&�(>
�D�'�i������m�ʜ91"�,`��I�hm]a|;7j$�т���~|����h8�k��A|q"��H���NI�ؙ�O�!��/돲c�D@0�ixu5�������“�x|^���$#T����ޕ%��/ph��h�YǸ�ɕ�c��e��9O�sc�!�֣�,m ��G1��
s�
J0u5��sL]�ͺ/�><�������<����07�(j�
���K;� ���߃�m��:�K#�PyPY���� :���쉋Nc2�s�s 17>}���zd�^(k턤9��-Y'�滭q�FY��b.�6��<eF����y�����x;�[����x�vzv�O���o�ݧ0ݜ�,��',R��c������ߕK�AKa�X^k��3�F`�YN���ayv�?�����*-$g��Y�pO�����,����/�������G���xxXLzp��J�CZ�5Ĕ�-�w6�ń*ێ9�v^z5VY�!����H����$7뛁6y>��E�?7�{P3���^m�9�}�z�5���m2e�����d��.�XtX��kSt��[���
Qް�)E�e&���f�W��Rt�����i�����֬�[�mg��٪�yB�TE�|c����I������~�#>#{N_FBpa_�q|����8�ᔍ���<�u_���f;!I�7t���<�B�.x��r{���0�����5(�]7���f�}���a�w����F�O��
��=Ih|
+'��%���R�R�WYN���a������>�� 4"�=���x����(ˡ_u�*��}�uX$>��$��#�lG��]�j���pp�F��?�׸�t5q�z{��5qw�X"憐�_�	�h4o���0�M�j�,�����1Yy�b'�*���.DM�/8pr
m.�,]�J8Y���_@>Ɇ�Of�� �,����pÊ��w�88j�O�(��^+`�3[��Z�.	U�CWt�.2�Ƶ�	(���1��X;��{"��z���(
D-]����cb�@�\zd�W�]�x�\���q�*���,�qv�blS�!��A0�5�]�OI?~Y���+�P9n���eY�b�<XI����l�S��mo��I�VX�8�|^@b��p�%��/���儩��'�2��9oZB)�)��?i/��_m%�&C���ӀAdrfil�9�.�-�moj ���2��ࢹgc��C�#��%RFC� ���e�O���}��
���9Ma��zF}�kM ��^��3�ʹ���P�-ߝ�\�F��c>�pV���/8J��	�g�5a�PK�yVSv�	n!pip/_internal/cli/base_command.py�Y[o�6~�� c/a:��zw'�Lk4u��3] �D;ܑ%-)����R�%�N;���$y���\�(�.���C�݊<eI&��2z�2��ߢ�T.ME��ږ��غΓ�(2��b�Q�f�'E�V�jQV��F��-�ٷ���\���h��m�Ú��"��q{վ��>�O��eb��)�Q���۲RE.�)[�e&G�Te�U^I��8ɔ��l��b�����C�J�T������z��(Xu��,�ļ�;S�P�&�\ɵ���(��c����SdM%��@�TO|<bx���o������|��\�=��>,~Z���.}��/��\/>����}X\MG���%��v}��"m��H6�Zڭ�s�rgy!�]���B�L{wZ>��6����+�;[�:��q��x�2���䶍�'�|奨�x���&w�M�{�K]|���*ő�q[�?3��K�O�Iz[eOl#+^�b3e9�>S��V���P��jck�o��+�~�/���T�=�o��?Nu�+�qZ�*�/ņ��/�ߥ��tU�L�Ϟ��sxm��<���G#��I�ٌ=FM�D_F#�$Ѭ�4�֍]s����|2�l:�7�Ʌ���@��Ay���v�P��5lȟ!�[!��Ȑ�,X*׌CCUq>62[�_�o���5X�}�Lasj�΄���-�\:Y�1u	M&qKx2:�GL,�O�
C�5o��&��yg�B��Y�:��R\��ѯ>FǓ�د$�oQp����դ6���D��'p��g�N}�6�_�ed�D+�e��<-�P�3�r�Zz�mMy�/0+��@�̇�a橨��cM�aU��'e�o�A�-[T,��x�n'�T��dx'���r����p}
��Dw�	�i�ۤ��{\=Id#$B�y�[�{6��o�W��[���@6tT�I]	;�	l�/=v^��7�Ɵ):��e������f�ǪDbІ۪�d���EӮ�E�_K��d��d�C���Y�)���+���-5+Gdt�~�c��d; ␙Z�
�l��z�3&@���ȼ:p��$�9��$ζ7�S��$����6C�7��>���5"*��Z(4����o��m!�tmŁ��N�.!��5|�l۽/mׂ�(�a�v�j(wh2V*S�!�jTy��"�#��h�*E����wzgc��'LJ�nt<�C
e▧���RY6 﫪y������Y��"��E�mm�(��)��\�[IXQ�8kR,k[��zG��K��'jm;;���Bm%�Hi�B�O��RU[�I&E��}Z�q?O�>�SZ�ӭ��P�ɤ�a�ܕ�lO �]R��_eш���Z�l�I�p��V�3�6��BOgO<egWH$<
3���0P�/z��#�%�\�7@8�����"ɪ08mSHdp|T�&Q�wp�P���sn�$;oWЋ��3��2�y�]٦��e�KNK~��6h*
(+����}0(��
�١��B��8c�۫��D�U��EP�J
Mt˜�h��l�{�=t�)����	�
Ǣa�y��S���x|�n�������d�.��h�2vꇷ\�@9��C�e]���A���n~�Q��wˈZ��(HJ���.�h�:���?-?���ۅ#ʢ�_�P��$Ȱ��[])u�h��=�p��$0�	+6��\6A��=�u�Y��s�-�S�N(w�)'FC[�DdcL@>�!m���)�l�ؙ��^�IM��b�%sU��p6]"�)
�?
�i$�
��#�I�(É;�v�:;����h��3瞽�μa(�
яL���لcI eQ��:��":�&���G�!f���~��#�����4fl0َL�2�N	��&��O�y�U$�`�/2�m���εuZLپ��0r�4��o;���3��S���tv~���M����wo�)�eH���o-:i�̭�;�ׂ":?�~�
�Y�
�
��.�="�3iS�4`��;�t�m@���.]��;O��%�2$Dʦ��2�ҿ��-��m�ػ��q�sP�+�W,tg�Y�t�r���-������(}��xJ�_��������^�;-J3���'� ��ɜ`�j�/�s|��{F�5��qW��ӑ;5z��D{+���U*��[fw��9�7���{I�b�9:�1�'a!�T���8������ݩPь�ָ�4[�;��9u�{J�pF=qY;|���!����y���L�Զ����o�"��81�j����r�.��c�֍���Q]�6�jI�&��-F;�'tev����MiJ�–/+D'�S�8�\j$��T�`w��UCaGe��C�n��'�-lt��T�������ak���+�"��}����Or�*�Ni*պ.	����E�v�vB�3�h^��6'�[vH���N�2��J�M����
D���*Z���ƚ�o1��q��d��s`�.�a�)�҂n�z���YZ'�DJ��PK�yVS�I�Di�npip/_internal/cli/cmdoptions.py�=�s��r�미��!�	�q�t8Q���g{��Iɛ����#��P2���u_ (�t2�T3�H�n�nwo�noE�I�Nj�Pe�feѨ�X�U]n����z�UUgE�U�Vk]k�5�-�B/�B�>e�걚o[���l����i��͒V�v�7'���'y���[�V�)5�Y���Ik�g�Z%)~9$U���@�I��z�j�O溽׺PUR7��U�U�Y�t��$���,�9��L�k��6_���J�=��u	�R)�̚V-4�sor�eY�yy�D,t����$,�<Q�-~��J��@�`�֛�0
�m�
`�����Ej�m����fW�0�:K�	���I�F��d���_�����}�T�}R0|s���
@-Ҷ,�F�k��%���f^^�rqq���j���c���6_!O�/ح�_�|�e,3m��~y��'��B�j�y|�,�N����pG�m<�6(�J�w�
���6sK�(�,M��zV$���!}��YL��M��Xf+=����M3�C3�����^����ߧZ�Ǝ��ャ�w��L���/W//g�g�_�~xs9�ngM�Ϊ��>�r��&^��&ig��m]��_��9?|�wV,�{��bw�恶mR㬪]��=$}���=��K���I��v�Wחo~5{}v����i�5����-��''' �T�d���v�i���=�,7�Z��4+�m#5�N�\zz���4��D� 5�	deBm�3��:�ի�A)ef`�Ɉ�La�s;37�n�����{.�
ԩZF�Gn8U��G��ٮ���0RQ�ȣ!���*���h4:q����`|���'�1��S��7��1n�۱]���#�{⥃z
"�pȠ&����Ӗ�xJM&
�v��%��	�*�<����wz�x+����"�����y�&�\n"/�e�F4\B^�,�[�!�8Y,�C�#d�~c!D���qJ����,_�X���7S��c�`�{��oa��N�w�Y�"[ݯ�F�T��'
̬��HbO[�Q���)�)ٸ������إ�V��~�Ό��ׁގq:`}�f[�3n�m�b���p�d�p4rܺ�'|}j��ڐ ������V���:$m[�c	G1d���DLU�<c1��'�,���%�n�I`{��v4�'��.��D�
�0:�yV$u���ȶ1H���1!�e&��v[�4ܴ�j$&
7y1�в�RQ�)�g,��D� ��ht�w�\���+�fl$X[;uO�ۇ{����T�̑���e��N��B�>�d�B0޶iQ��I����W/>s��l3Ϳ�5�ZִK̶�yL&����r �"�#]��`oê��,o\�)�yF(NP��mM��d�x�@���&�ɵa�mDL���E�CB����1�Շh
�F��Z�B������L�{Ҥcr��i0$jD���(k@�g�D�a{���/�2Y4bp��G�Fm��hp;`l-��r[�����g���'���i��Rف��4��vĀL����N`�Y���*8S8V��Y��&�sĨ'���-�.ܺ��2[� k�c�M>\���#=&�ˉ�K�~�#�A��,��3�V�IQN`yB�9)?��\0a�8%6�m:��wp�e�j �!�$(��(�|'�	d�}��|�����`�O��uFے=���^���r���"���:%B�z�%j`� lk��tmLU����w��cu�B�iq�;
�/V
<�
�
k�����T�D�1�<\7d�c�"���j'��ګ1��F�4��F#�gN������qZV��~�������&%�:䂅>q?'O,�<	���u^ͦ6�pDZ	, `	~0o
X�M֑�4A �m��4�Hh��O��uyO��!+̷���GMgB��Y8����
ڤ��ڶ'��CF�$ݞ�~�ͽ-��9Hu/ZQ�e��0nWn�&[P�\=p`����ڗ��u�@{-/W+��
ʥ�]��(rhDxɚ��^|j�;��A�ۂ����B��h�� @q��eAq�;��q)�_Q0�XJ���	[�Fj��m�H�6��hy�p�dm�,� ��`��<�rq�b�J{�ڹm`߹��j;a��1F
���esKx�0���gf�i�-��4��[�Uv�­Pm���d�ċE��{�'c�zN^�B���|,E	�a�Q�c�L��ɀ<��x��T���P�!]uĄ
��`�����'V��Z����ѯ9b�w3$ ���'��Opא�r�x�H
Ӳ2Ue� �Z���]����Wc�����%�:�|s���G#�}8��6�@����@��}>hy��*
8\�Yj��_���Ρ�����F!�#�,]\_�Ÿ�P���m�s�q����[B�{�n�P&0U�,�F>ՏD���,��o��,�\�O���1f��nP7�b�yH������D�T|������
`֣4�e1W�yG!��.��]���]&
	��T�ځe=���h�~��r�}�X��3�(�Z—���������x�x���[zÓ;|X�f`�cT�%H����2�=���������f�Q�v3Ǹ�R	��t�v�9�%G�I�j ��=��?v��H��Ky����22D��(�Nt��˼L�y`�
�m dS��4/�����p ��R�1�մ͌�}�E�WO�8+���q��o<�k��w�	�ɄG��^����ξ���8������%ѭ��u�=3����גdo"��������,������>k�X
�����(���|^(�]��\��"�Y׏e�}1�������>��UhFZ_��i���
��g
�bdݲ�}��_��|w`�/ƪIR�G���ͯ�V���չ�W]�GX�:?�2����-Y�Y��ϮS���}v	F��C�6���O`��1 }|�}�0|�u4�$�G��������Ns�_�D|I�J��϶u~�̜�#@�U�*󞈋l�2�/�?v��qC�O���l�����=�
��Iđ��gDapY'���&���y�r�{��B}���*$�ij~���7#
$rpl���ɓ��@�q�ltH��m��,�-�I�B�=j8�w@7}Bё�A!�'q�</q�OC�P��|��;�+���>7�ꊩd3�i���͡~�t%S��R�}��=�|��
��5jH���,���d�&`��I��F�Ĺ��mf��3e�2�����X���2�`b���5+X܉�Z�����i.ivdb36B�I�t
.-��-��tУ�xV��A������:䦫�̶�i@l4}��f�	�`8����#�)GS�ӑm����}4���
u(f�0����	�d�����j
��%x��!%������(�[��~{u���O/%$~J�w���!���T���y*c��4��ܮ�*k}�-J�3"i��i<�@A[�����닫.ʼ3��Xnd{�/�/�C��vn0!)s�����Q��#�؍t��*�џ
L�2lm��G��[����!�<({��G�c0''ڊ�A-���/tiPl�i>U:D������ŗ#	�����9�6hK�p�3����wb��`q�ox:��++j��V�
T#v����(D��0��@s�g��CM�����re�9f �k2o�9��&��LIF❤�H��HF����v=��3�9���}���k��d��]��c���	s~��NT73��T��G�0lfT��A�ز�0�ζ4qp�H��3%iG��11�wOm��wD�̩ZJ���n�=.X�t8�j��Sk��T����Ί�;z�I�������l�$�pU�����?���m�M���*��^��>o� �)��n�H��~��[X�0��3ll�����m3^�����[�C�3�qܲ��:�y 7��I�=v�M�"�AzTWG��ʒ����}����+m"�$9�7~�9+z��*{>�r*n@�h|�mc�G-�!cu�b�C�$WKr����s��+���Lkl����w�c>,/9H��L�e��xUJ"f����^�p�M�3/�ZS��lp-��@W��"� �+�����{��0Z�i��M�SKL�&"�9��z�Vְ�U���W��#��˙�c8�w/�.<-I���x�3�x�2��ӏ�_��D�M�]aV*߮;ȝ�O3�M'>�P��ǀ�^<?l���������B�lx�[�H���]�~p�(4�qI������x�@�_�;��F�1m#�Qsf�A�rp��	���lJNj4����/)f�"�-�v�jf�j[W%��d#�8��™�(v�'��
���'P���/ěI���M�ş�k���G��;@�<�z�MD�"z���J�-���F��d�X��3�Մ�OL�|)k����Hp�W����mi;t�L�86ū�N��$���w��c�嫪��e�Y��	Gu�L��"s,�Cbg��
�*����YKj)L܆!���ԋ�K1CT(�
ƥ�u������FD.��{z��wVZ�{M%&�&|����&rK3n(��yvk_�0�_�쟇)�f�7�:�u{�|z{�m������C.�:F������F����Y@!�s6e�a��tm�g:�*D
��ξ�|÷�i@�{�����,iz�c�-<$:,w�o������C��3���T��#��t:����T���Z�sZ
��)_�~t�P�nPU�0��Gj�����)�
r��.:���Ѿ|A��Q�_��ڝk�wJ��miO6�~��Xf3�̑F�g wtiB��T�B���1R��̝�^���^���JH��
Y�.�vb���B	���D!��E�,~6&
g|�����oe=�dEY�ێ���
��q|�ԓhc��lܸ�8�p3��޾92c<������y���r�[~}0��6��3�נ�c5�m��S��'zY5���kXB��H�I�-��wޙ�Xر"�qP��T@�T��$Y����ě|�z�CH]z�6�.���J��/G�]�����A�\�St�@�d���پg�#~<3�v�bW��~
 aWn�%+�ޟ <��܍����E���$�����u!����7�J��0�Еh{��n�w,
�ƿXo���mZ
���PK�	��
(+�^5f�+��k
�n�-3�U���{���7\��vq�Qx-7D�m�wC7�<��n��C�M��F��P�(�8�K#�ņ�JbeGtAU����
)6�=����D0�5]�<:U!L��#:7p;�SY&�TI,�H���x�6A/�[<��c�б��A������L1�_<U�6�u�s�k4M�p�D̽����" �[s�����sa���M�,J�.2�|��)�0a��
	����b~8� 6SF�����{����T��E���NIF?��A�8@���8�{�����(P�9Hr��b��[�V����p�׫���(��"wŃJ��<�	�x�b��5��@���?{.4Z���F��.l F��[�a&��R0��!��y�ѷSY���
��r8j�r�CE������]A�,X�'��
�#���

5��k�r����l�1O��K���2�71?��5	YKu
�%�K��(�Z�I�h:���G��!�$�c�6/-�xX��>�5tB����>�[I�&���!�����=�C�T��lGz|�5�G���zƾ�
��L���]�G�;G���C�t��8�2�>2��t�m�yPI9j��8ҡ$X&��#�o���>�� E	ԉ*�	��l\�/)�$�2U۱p��t��]��`��{��Bb���s�����)]b�ȿ����(,��o.�)7G�M�;�8�;�<`��Y�����k�<&<���`9̘+27�C�9ƞ�a
�^���g�v���Ƣ9ޖ1Z-���G�O�zA$��p̔���1V�Ċ��LZ�Q�,rY�]xY]�a*;q��t�nZtgӻH�D��e!;Ew0vWa�����Ҥ����'���zcZ0�c��zg��ßcc�`!��x��<B�P�{;�i{�p�)g���:|��<VvbWbq�
1������%qucC{�^%�6�:����i��[t�z�Z�#��A�엘��;R���:��|D"������X�*���C[u��>��)̬���0t'}�-�I�j�ӧۦ~JI�O%s��G��1�.$�#�R�-H��Η��eēYv��*ׁ6����F��61�l�m���jP/�8J��{L��r�K��Ry`Q6��\����ǭ0��,�[]�8Y2=^x����TKt���6\�"�aÈn��J���-`�����9[�¼���#]D�x�����\1�
~L�t>�t=����j��;ɜ1Ex!��O�VZ��4Q��.�4	̠��+S���*Xn��	�~f=8���uV.2�uH	�x1���s!O:("-�8�=
��L,"6�]�����s��]@�]y��@6�^���2/^���P����r��V/�I��[��8���Zt���5]�Z�rℐ(q0��'���w�t�[`��E���fb�4�)��'�h�j�AH0:�e���λT8'Z���,ʿ'aW�C�Ω xl�3v>m��W_��S�1��
�Ŧ��]4��0nKJ
ʩ?ni2=Z���7
1+�U�n�����a�W�	&3
zt��G����!S��v3�иQ��q2{F&L��/�F����`�#�o���Ⱥt�Cr�b�3�!��f
k%R~]��:�x�W%�A
�ϴ��8�$�`�'_�Qi��NqJ����eY$M�^�'�4'�]��X�d�x�a\��%�*.S$N��ul�]���]/�/煌f�{Q�>�]NT�*A$p|@0T�J'�ͥ�X]�Ѥ̈w*cRأA��P�$�^3���.�EAK2�>,�dС�U�0`/�X���l.����B�=�I�ƞ0����w;��\�֮?���;���iS
��*�X����xe�{��b[��2��E����ѯ��#u��%�\4:�r�? ����(]p�!�W�54��btt5�k3Ըĝ���0k`&����ܑ���pУe�l@�{.4�ʩ����=g�W@|ʱ+\z
��L�!�gK��c�}���`���1^��a�3���dW��g_=�5 ��2iZ9�d�I[k;��%�B�!+�$�'x�7f̓w�`��?�^�p�"�`]/�wV�.�
��`��h.a�L��!
�{Qi���
���\���%���K>9��,k�߶����$�0U��	��Q��^����'И��^��_��=ޯ���I��A��D�;�׼�R�M� �~�M������%Լv^���?y�\�*�ax<+����y�a'��<���IGD�/���v�hJW=�m��P�`[!�G|P:�CTxꞸ�9ތ�PK�yVS f��)�$pip/_internal/cli/command_context.py��An�0E�>��H)���R�JY���n��raH�
C
��j(n������ϓ+�5/�!�I����"�^���ski��U~��F�c?���Q��;�d�[>4�.�1��m�JV"_y߳D%
ms� e�Z��s�ݿ�`����0���"!�t��{�j
��ڮL�lҥ��\[��=~�r���n!RE�����("(!��9b�YsX�-8|��p�fvOn���/E�+-E�����2R���zp}\�.�hОU	��.�^�'��as�uh��-��R�
PK�yVSjYd|��	pip/_internal/cli/main.py}Vmo�6��_�)f��~5�E�a���OA ��IbC�I�ц��=GJvҦ3`�/w��=�B�y�ũ^�I�aЪ�AY#�7
V�Pdy�g��B�Jj���V�v�Z������^�i����o��y`RgIdPCQ�9��V���l?h����/N�g��T������+��KS������P9��5蹢�Y�>9g�[�cP�,X��(Q�eL�^x,Z
��lU�F�T��,ˮ�G+�
g"L-FO��]�E�����G��H(/dԑ��Z�ʎN�T���n��#J���/�׎��DG��ځ:yT�	�&t�mFS��x���7���������Rj��?�<h�{�z��!��c���0��Z���p�1�R�lg+�:pG�ǁa\d�x����@��:�� �Z��t!~��q�i���;2;]܁kW���iw52�[�m9��	t���}���D��{EjЀ�#T�%d֧�	,�;;�Z��{
�5$]����YN:���.�īT	���"q��ɍ8�x2���*r���I����I��Be����a`\8.�M#/����$�e��lbǖ��Q*�k�_%	�e�;�<�?�ʪ�l�.q�{�x#�V�\�4���ǚ��T+����K��+&����ĺP�9�8y�15�ٻ���3q���}v�0�
��#��!�`�az�Ft(��Y4��-{[��V�<�p�]�eGW��#��
����Y�g�h^�^6�0KGl��VpY�E���a�B��܊��_ՠ�Ld���:7/@Xy�ܘ����Tޏ�
��LE�:��I��<�����������YCk���a�1G��ı�|��O��t?��?f��J|��Q��/g+��1+����v��cۉ4v}�x�S(��ֺ�u�$�Z'k/���5v���2�N^�^�z}"#먐���!��G��'�`��?���ߋ �o�����RG���B\?�w녻;�]ȃ'=���a�SYn��b�h�95�r�|�E)>�eM�я<��<��Z�������(�o/4]���kx�H~C��TN��kj��:"�xF�VS���rQ�alW�Mkl����Ȱ�8p:���sb���V�bP�j~s�W�v�lr�p)���Gatf���eVg��?PK�yVS�o6
 pip/_internal/cli/main_parser.py�Vmk�6��_1���R�i��tJڣ��z�O��h��lI�d��w$K~��5$�</z��3�0�~#�F"���P��X=����
�W��#B�E=�u�K�J[P&���Ij�Z���E��<��d�����Y��y)Et-�J�V�/8�#����Z4��ޒ�_}��	~ÚҚ?P�o�n��47Ӫ��Ӛ	DX�(	x��0���"�n���G�3:����ƃ��0e�p{�O�	��L��VM���(�GVj�W�b$�e��[��NI�TX�}�-��ܠn�=T�;b�4�Aӑ��BH7���{9��`<�Ȟz��7x`wߺ��/�8�ڟX69�*���h;����l�ca_-{��C:���Tg.9,�Hw��.N�W��ı~���
��n���C񈅫rF�oܩ<�
v���(zg�o��v�[�E��ЧcH3��c��Ѹ���L����3��SOf��k�z@E��{M�4�L��b���w�)�BSj�qx������;8��e/�Z�~�����UnZ��+[*��6��#�U?��b�*�bN�򮰐<Y��]���{"�±�V͗:U��;�D=����-��pگ��V�FZ�+KTג����(2��h�@մ&���APW+0��{�NXAbt	ha�-���it�(��K�������#�j���:�-q��`d���hQ
���&���[����n�Ӻ����JI�9��(�l��2����s�?ɯ2gs*QP�Xoϵ�5Ui���ע�N��~.ݚ���Ο4�3]����ɥ��`�v�gag���ϟ���$�^Sy�X
�@8;e�j���	�.��"K�f����'�]�r��BC�����[��IOv����g0̀ƄY|}��1G��4n՛�s�o��%z�� �Xb�żcȒ�G����3�E
�"�,e��f���x_�ː2�AB�o;�Լ�5ߨO�>�$�h��>#��i�9�تOxMB�n�k6�'�PK�yVSñ��$*pip/_internal/cli/parser.py�Zmoܸ��_A�(,�d%�_��i��
� ��(�����<kE�H�����DJ���P!��2��7I��QɈ�-�h/YO$SC�$���w�W��-o���5�{��A�f|:Hw�ح��iw��ŞT��
�$�t躞Ii��C��o��CN��J��b=U���.�סkؑ��(90�[�U���dY��I����|<�������矣E����A=�Qo��y����Eㄪ�Ş�ʱ�YM+U�A�JP}��z%.�h��P����N�Ŗ��]Z�-ݳ�̎����JI>�L���Y�,�=U0m�R�ok���luD���&��ހ��5�/��d���n�q����lCJX'We�J�lr�[�2�z���f|���+�Q��L�ױ���k���%#��ۖ�䆫�ȿ�s��+V=�9�23��=�-�k�&��_,��0�z��;Mw� ����oƥ�%hd����ai�~qANɟDZ��`��U��2�#��g4\�`+���ҪҼ\Mz?�/�"�r�#p�[���2��<z?@7��1r����f�V(�&!?�ݿJ�ɺ�uN�q)3����l䧐�{z
(D8@�M���"+$�mM�LQ�AG#�ۏ2�9��rgsT���b�"����$''��F!'ٜ߸T;����&2�V����[2������ܭ�(��h9)̍*hױ�N���Y�.���F�9���H$3�E��v	��9�b�R���6M��3&BBpE�$�P:e��/�{aR�_4���5[�Ɯ���e�
l|%I��V��1Z�?�صO:��*��%D�	*��*g���@��om��d�tˬ��)||�ʡgD���ms��i�M���%S7�����@�%ރ��@��FF� ^�.������o�#��=,��Eg5��Q�:fƷ�	�9�Y6�0_hȓ���{󀶎!�5,yh�[z�ۥ?�(��3̋>@%쮽Y�Z��=�m2�z���̒m-���5�=2��$G8�H�g�՘_w�Nܺ8m���e��0�20v���dO�s���8��2���&�������-��q�GX~�<z焏��$w�&��w�'t�X�ǰ���S���:�8@H�����[��e��|�6�-�Q�Z��~}@vp3�TC	�Q'.D�����]!��+����G'�����t5�v��m��(��P�@�PD@� �d��0�'�	,��uI�
89��nm��,a��
n	�u�~�M�%d|���p\��}�*���H��f�׍�F!X�]�@���+
�[�dA#Hi�Vk�����~�7/O�� �$�H�h[�0�.F�G\�F�n=��T��Yl����rcܱ�H=n�l��A�Ƒ���?�V��Y1��`"�/�?$���Si�EW��k��u���x��0�2��%sr��s��&�A<
�;։6bGFU�%FF�H�3<I왠��(�]��4�=���R�G{�%�@GcN2��w�tg��W^�Eu�߶C7/�x}�:�H9?�u��~A��|�'���P��_�6�J���Z0��C���[A��ʢ>������y��ׯ�ۿv��xS�Q���S	�W�	�lN�g
���s���*v�w��lZf����;	j�1�xҬW��^ˑ�R�YB&QX#q��R)@9y�"��K�\�a��fǫݸ�a*����v�����fv�6��	��׼-vu J!�qz	��m���'��'�A����^q)lU���?S�:?f�)h�}K[��~0˄OA�1uS{f�����{:RZ�O��sr��Aš�|�wZ��Q�g�3�i
;�i
Vv[�N�'�'R�v+,i�	:()T�I^�D��@=5��6Bǁz8��P�<`P��o�a�O�5Զu0)�b{9��O�ucz�UZ����v`O�%jTb�B�Z;�r�P@��Y#���F����p�J����M�O�u�
�b�x;�1��.��M9��\�
�
�$��i�+݈7�Yn�Pl��*5᳾ЙH{;f�@���>H[nf�c36(��g[�1��V��}����1����,�u�0��M_�J�#��;��ɟ�	�&W'�̌0PR$y����A�x�o"�D��F�����Y6W�%\d������5զ�|O�7g����n�uS{�~�������5��4t���˅�Ln��1ԟ�;����:��W���+���4}�aQ�9�����lʣ���ly+�+��@���W��=uR�V@Q�P�ISưў�.��8���5$��[��!�o����X�%�%�9Zgg[,-�$d\2�����1�����d�,��������E�89==�R��X������Pu�~�>;��������&�1[T:&5�5b�cO̺:4 [�J��+���&�ÇA�]K���%XG����jl@��*�`&>�
�ьYeۋ�<I�u�h˪�xJ�JE���c�	Ş���'��
¬X�t�6�e=����p�����҆��"�5��ݻ�R���v#@��o�B�uފ?�Ü �D^G���p�a��+FL>o�;o��A
>׊ã���/�T����l������-k���A%�V%K��0v����
�z����'b�(�e�@��3b+��ȋ�'���=�q<w�.Z��$�;���	q
�{�^��st�����>�� ߀��O}̀�����,�0k��RGL5
�(���`�!O�|H������&AG�`k�q���G��.�X�wKf� {����8��Ǝ����Y�c�*�f�˵B=�1�k-�kPiDS�F��:<b���G��ȉ����
�;9s�+~�J��u��3مqʉ�"��Ϋ8 ��`���50�(
�X�S�Y��9a]t���9��3<��s��u3F@y
�b��#�	��A�I��P�A�	�P'��J�%�H-�	��U���4�{Q��P>֡=&�M�#�:���9+�HpG���M]��P�f?Z{�~����v%
�*�k�
V�����m�{��,��$}a�����t?j�xMi�!~(2�WT�;�Y�
�X�H�C�Z��@��~�����vpbey.��1Ʒ�ׇr@��5f+;f���|M�i�a2�^z绑.���d!U��b��I��>�/PK�yVSs�O�
l "pip/_internal/cli/progress_bars.py�Ymo����_�`D�)�� ��u|��h��g�"5���6����Ҳ�p����I�PI��U�-�ܙ�y�})W�ҖI+�U�4#�o��͵Z1#/Y�}}����	+Ĝ7����N��*J�'a�'��ZV�HvQmF�~-�lz/�B��j��1ٌ��
�w�,A})u^
�n]U�+QY^�/�}+����!��4k�,M��U�m\����x=��T�EO�� 
�JU
ӭ��#�\��S#��՛��gW��:W��|�G��_�5L�Y!�s��)Z+mX�+�[	��.��0Y�eS���c��--e0]9��N6��-{뾠�'n���{UA��ΦF�"�ӈ�4/�1�Z�Eq�-8�e9��Lٳ?з�+�\9��	<n��,ń%qM2q{�#G	��l-X��'��Uj��K���Hz3b��-�	n�
Oʒ}n�e�Y�����`'14M��n*	~��b�Ą]\_^]1�i��U���+F-l��V�(��*	5��d>�X+c���K�y_1�ۚèV����.�ڈO`��ѣ=g�Z)�p%HW��LN	P�$�]���vw�o�Y)�"����O�ik��!�
�%���t&#"8�cJ
�]E���B"T�w9��_+}g���F���*���ٜW�Dʠ����L�Ȗ$�3F�)�lg�6��$�g%�q�^�9��8*��@�a��w��n���awrd�{+:��o?��]��@�ngԉTP��H�\7Hpѿ��B�$�O��� �it@�•4�qJ~E�	�_0U�;��)�o�y߸!�a�Z��*/���n-xP8�ƲR�{����_��7渔w�-e����F$�������a�J�\��
��g������.��`q`8FK����J,�06�'{���xD���p���$f�Ȯ̙�yƮ��P�Ͱ��޻^�g���|:�\=f�S	�KaE��/)&�-Վu�.��rnD|��F��[�M�̗�bb	�X,j8V��|��[I�5���bA�Ϋȩ�4�p�1��Rf%��Z�<�zS>�gʼԂ�	�#J(��u�:���

���阜wžr�0.r��ݺ�tE��Q?ғ��5�A�*�*�c�1
IA����K��-������n�̨-9�7��d��7'YL��W�_��b	
7iup�w����mjq�К)-F)�j�5�pH���>�-�OѮ`�MG=�Q�A2�qMbٺ��1-k�2���./P���)<qYاjZ�[�|�R��Y��GB(�s��ZT�3�K8a��b��& �#'C�@$1W�I0�pQcl��w��M$~d4�*E	����H�7�q����?בh.Q+ٟC\u�1.�
��%͎?�끆�������n�c����<�n�9�3^@���X@�R.�z	����C��´�*j�����rզ���Y���H�H��@�švn�HH%ĢY!������V}�.���.�31'đ^�K��V
࿋w4K�]U�WYC��[��0���z�P���0�mP�~�2T-Șڐ�צ.�3�<�i��Mو�+�Y���&
U�4�|@4$�������c�	��)�Q~�nvT��oqc��������^������ۭ�WI��X}X�z����Nd˼+h�xh�vx��l�3É�a/R�ߧ�6�#�2�M�A������]q7E��m�0P󆷙�Zn��]�+Y�����"���Нe�I��c�=g���p��TH�#9��sv�2&���|��pf��ڀrQh��*i�	V�_"������a�բC����I��*=P��v��m�@{غ���yy������[$8WVQdĎ&������'�߉��f�b&�n���׎�����J��)1�Gx(���e�SS�b �+W��qMQ<Ҡ쎡H����\�.�__1:M����C<��ص
�p�#v�	��KQ\z��X�-��#!�sn�[�X�HȐ��TP��W����I7)d�2sW�h��ȯ5���N	q�o.�Kk��sBr-i�8�wE������jK�o"bvq;&�J1祦V�;�J�$�N.	����-x���P�]���L����I��\��.@�ah�T��L]74��8E���+U4����G�F�c?���XF�zfG�y�F��^����a���9���q<��4d�g�k�0�JÑ�{���FL�-�R�f��L1_�wT�;�xQl���{�|5+�кGr��z@�ߨ��l����N��:G)�6f�������'��&�[�ؚ���c�Xw7tJk��횦԰��77�V��&�Q?�h@�	���O���#A��`�.9��(�/��F洷�Lq�*��s�1��(�����ѫ&�{��xP����gꆠ�����n��5�'�Iz ��g��}�����^?qu�"4����&��cX���=v��|IL㚞ֽ!7薄�.p,���򟶮z�M��l`���<��9Ƀ�������*�9@tmUY�IEJ�o.~�����k�?kU�yr��{ya��*»�DU�b03�;}�Ȁ�\��_C��c��k�/��[HǸ�^���=�:z�^�̈ъ?�����Br�
锌.i>��[�}��p��-�>�IGp��������_��oPK�yVS%�߇�B pip/_internal/cli/req_command.py�[m��8���_�S�;�ճ9�.΀�v&��4.��%�,� K��mYҊRw|���WU$ER��%3��
�M��b�^�*RQ���.�d݁���U�f���̤� �X��]���R�U�X�l?QAW!ٱ.�����ؔ1ɛ��:nȚ���\�Uu��8/D�gE}_�uV�v��ٞ�YToY�5�V��;A��E���9𑵢<1ql�C��1����Ẳ�d����R�����U.�\1���"���B�+��2?ki�ɓ\���v}�wu]J���Y���M�A���߲��zdwjp���i��	٭؇��f���M��{#�8U�[x簬�����kl	v-�����˙�1n|�wƌ�J17D��Q���z�Zߋ�WU���s��h�e���]��NԽ��e�F��"���)K�j�Du��4Ώk�Ҥ;�5z��J���Ѽ���H�6-�
+�d�a;ނ���5�.k��K�Sw3�4n���Bc+����-�@&9p>ihP�p0Hz7d�j�G��^��ȫ�Z=	���QW�k{�����I��B��`�]�-�*���yD�S�o��LG��E��s,SoQr�VA���1#��f��H�]�d5�u���˺�q��0���G|t�K�+��]x~;�X4)=����i�L:	���9�!a�x�#�a?6i!Z_/n�L�L�6ݜX���y�t�Lz(g6V�x'ڮ�J^ݙ9[��i�ƛ��zu؊ĸ�,��-Ӵʎ<M���5��H{%�c�Z|�fAc�߫�Ȏ8��!�j¥	y�][�
xyt�K�w,�Պ.M��u�l���Ǻ�z�كA�ȡ߹}#bC|3Ė�����@rj�?{G����_"G��m)�y	�RG��j��@#�O��_�X.aIy׷�	Jx��#��2��^�vݴ��( :�)b#Te��
�/�}�@��Y׵K=tŢ�V�G+�笔��r����Æy`�����#���]�5-����lOg5j3GēIՄҟљ
�٤tƴ����8;P10-S�C�V�vDzkuU5�g}�
*�:��e���w�����l�49�w�3����O��K�9:�J���oj��sk�E��Si�d+�,��������VhE�B��d}WaTA�Č����?�B��g}�K�o@48e�b��k���b/�C�E�u�����Ԝ.�������o`�"�EL�Aσ�u,R���&x���s6��B�\�-�m��37n�v�đC{�۬��⺌!�LA	�����m�r���F��4KO�4(YN\������3���fF��SrGh��Rh9&�?R��=U����O`�D�p�A���k]�8�D��(@˲���Wz�(,����l��A�L1�N`������@#v'�'�k`�O��A��;�X&8�J��'`^��24�~��i�>8�闘nHd�:��Ch�j'�=&�s��^���G�0Cz0��D��~o|2�p7�p�_\��p��GH��{X�2�l��[��e��U���B�x�+V��%�� �и�����$^����FCCW!�8��[��A�]\�(�=�{Z�2�=N40�h�`��M
�Z��v�R�r� i�3F�@|HWR���ၰ�Gh7������V�C.y[���j��&Te*� \�;��\��qi�v1c���f��wF�T��,G��X":�29�0'�؏^�T��\U��)us����{!��
hQ���Kph���A8(��.%2��� �����a�&�|�2�'c\�~5�76��o��r��NL��`,Q������]�7���\}Lo�~}�	��i���׫wo���H(��뷗���o//ߥ����2�����De����I�gm��]
)f�ɴ��n9R|и}��.vǽA��}Q����%�Z��Zկ0-�Y*�4U�uE�5wPB�[��Vt�L��jK?T�3�\��6�)��	�`��+�*L�3���f����1�n��[W\!�)���e�X�g`��`cV��!$��×N"��\�@S�
�E/�(<��[7aw�_@�<�92�aDL�ј����qp����|)݉��'�v�-V+@F'\w�=��qZ�g��gtJu
��
�(�ÑS%����W?�������y�F���gf��I6�פ���
നs���W��o���v�ci�q�$,�տ���?M�=<�&[ah�U��/	�.�Q�`b�i��D���E��@�{�;{����Km}Y4��r*��#D8��i�t��[O��i}�z��.�+BV-&fG<*(pO����Ra6`�0ۃu���d�-z���F���ƻwi^��%�/l0$����XR*j�h6�U�-�┖D��cY,kO*�뚛0������,�4_6�@i�¾{��XR�����L��2y�b����ύ[Y0�8���_T��L��^�9I')J�E̟����6�_�"��@�~%�Q���Bm�U�-�3�䙊��3"���m��nTM�J_!^��#h1��I�`� kͿ�
U|,���J��0 ��Cq�g`m��Y�C�:�����Ce�Am�&lO��-%~-i�z����r���5)��K��t����5�G��4P�qԃV���@�YA_��ӿA'��z�$��Qݷ0�V����.kH~�� :��@����Pa��Ö�:\F������E%�g�imHE�U�=M�;��Vq���Y-F�&�]��W��9(�!�pO�R}��%��[�œ��A�6�3�<P;Β6�S�����o�V��:����1lJ�f�J������>4G�ab�Z��'���[:��괯ʹ�#��ൂ#�gz��S��a��k���χ�^��
�,�|N�f�ٍW؟RI��o���)��S�0�e�[��K�����v��)�:s?��*�jx
��3�6����\;�ȣ�f@/SUG�^o�F���!�B�I��x�,�>�G�L���B���?��X�A��z\2�P�Jl��O��3d��.z:���=�p�恍%�3޶'�7�]1�_�A�ݎ���-tV�s���B��W�8W6�:��ޭ�qM�I�i�܋��<Y&��T������J�V�E���-A�Ѵ�	^��r�`I�A	���c���l���?�^��7z�y��L�%6>E0�T�p������<m�� �>ǃOݧ.ۜ:i��~'7�%�U`ZvAk�9j��q=q���Tq<��x�p:{�T�n3���� @��~�
6p�<�o��x�!�~�f<\b���g�x�&�Ia2�fp��i��=(��4ZVJ�yF������eb��$�U�rs	,��i�i7�aR_)�#
�,�Κ�\��ٷ�S*��i�x}yW�%h�ܝ�X1��55������O�ߜ��/{�?]��||��8���}�Gѥ�@�R�j9�π}�s9���y��b�2Ӑ���)q&��k��oK�A��7T�b����
L�����0u�IU� � ]��/akSB���+�������B�{J�$Zft�إ}�?��o9�����ӣA�߀��U��U<=�[�]xt|z����]
���R�L���<����8��>�8��d�0�d�O�U~ɽtm�~�l���q�쐑/L����1�d�&�q�t��%�߳��=U=�����h�n>������d=�U:�L����,�{��=Y��{�E�K_Ne+BO�J�@��:�~�hz�K\ӻ�6���#�=-HŦሏ.P��b�n��,G�mUDx������K���UO`/����i�0SL}��(񱣿-�1E3lLg��\�|Z����N��Ox \������9p�|�#���HF�xXQhAVq�e`�H'�ŭ�{J�3�gł*���g�ϕ�A͈
�n�h��>[b��ɳ�g=Q����Y��(�3�㇛K{��O��Ȗ���e�Z?^���q��:.�	���k�&�g�h�_���ؖ�F�
�tƮv���TF將��
5霛�	� ��v��g����h�f4WU=�+wXC^�u��
��m|x:����Eu����=�G�D_|+�����K�3����=;���J�:V�_���'~)?33�/�`�`�'$�1ߥ�=�g���?�_��H%�
~^�,DN��c�D,��ە�O�?�V�ez�#4ɹԁ�FZ��˗(��b�Y��6��Q�ֱ���m&EN�{��\��S_Έ�{FƲ-^죛�ûT��|ž�7B6%��{�vf^�����[sw�\�s�y��T�u�bԨ�m���N$鲩퀗�R�8zǡ��;��G�e�L��7tq�]�_�}��*��{/�UK��i�s�@�@�T�����#�Ns�M�%���nZ�)ѡ[m�DtV�\��P1t�����'�u�@u�Q����)҉�\+�D�d�~��G�ި�4:�%�VT�ڗ����8��On
�x�齱�_����>=e�m0�*%��ںB�߼
PD\�}�S����	r�nE��'��m�M�S��靑�o���$���)�'�d�{�j�k_���e�PK�yVS$%����pip/_internal/cli/spinners.py�XYo7~ׯ d�i���Z�"4��8��@�v�a.�%�V��㱇֖��EQ?x���pf8�ˋRiKR%-�d_xX�i��0��P�����l���Z�nK���>���9�P�� 0��L�LfJ'�V+͌��_�9[�|�����\����/ݭjjIERY.L�����p5?����r?{4��_1��IK-Wr0pt��imk�7~m�XHZ��b<RA��%L�L��9M�ɀ�/c91����L_�s%#�i�
Ú��`�fٙ�J� ��s��ڋ��*:V���Tj��+JS�oYT}�7a�ڰ�g�],F�^�����
��9X�_|��G��i�R�_��`�����a�rDΊ�k�R!��TeF-33��.F�"y�ZM 4p��u���8&
�qJ�$O��!3>�1)YDS�5t�{�7=׶bp�����F�{�(��*x� ��x}�F�ߑe��
�=z�6�Z4hN�ʨ��q�S8�h�
ɐ|Ӈ�hL�<�|I��a_�
��ڹ���Eb�pT#j�5��L�������S+�Ȓ�J�%K�ޘ���V�vD [baB�&.���/3�U�2�5���ȈˏB�X�;��rوq��t�}�t��b���&����⸣��8{��J���bu�*B���JG��?3�ݙ`r���
)�O�v���l7�J����%�M3[i��nâw(Ͷ����P��k�3�'��,��ҕ~��#,�����N�x�+�yo����*�m]���^�S�V
�%��~�v<!̦	D\1�υ �Ɔ:Q��� M�NFJ��0`iK�=!1�9d³�v�x�,�#�o+�T���vH���~à<��f�r�bMS�O�~���p�$��PB\�
���p1��L&�(�澲.�x�)��W��=I��5բ=I?������7��H;`�i�N�>�3j�В%\�j4|����d�Y���D��EW���^��,ɇMm8r}8���=���{rL?�u�l?P��~L���p��ړ]md�4���m�f�v�UE��I'q�:�1a)h�cz���G�7�_�>l\W3�=�|�Ğ���O�t�ğ�@�8�d��>���	�Vp�I�cP�;X�(��JA�5K-�z��Mư�J�Č.���Ic9��#��u��}W=��:0!��
��\Ě���J� ��W�(�',�IB���R�-b�ٰc����vA�Y2�p��
�e�t4�i����
ݚZ	���[p9_U�W�p��u㪄�������ǧB��gyμVo� �؎�ΚNp�O�L��{
_����厤0�=���m�ӛ��&�EZi���5��?���Վg->����W�]*�3��J{G�$��aJ�t_���+��?�b����q�c�}�9���zdgr���{�w��+�7jc���d.&}����E\��ff��� ?�_�r35H=��r�U�4-hB.��ch��&,�ו�pWQ���mC�難����3�Z	�fOӦAd�2?��y�	&'�BK��h�9��Vqfk�^2omiNf��s1+�%����qc*ff�}��y��X�}�@�@܋=�k��%���󝫍���

�}C}�D��\6�
PK�yVS�zKXt!pip/_internal/cli/status_codes.py=��
�0��\���2@D$(iʘ���6˖�RB�0�P���v�3Z�j�Ԝ���F�
\����/V����@��\ӆ�q�PK�yVS�ACv�"pip/_internal/commands/__init__.py�Wߏ�4~�_1
��6�\i���p+qp�U�M�ƪc�i/ �wf�u�,��f~~��O�4MY~`{�V�	%���ЈEu�Ta��Q7�8)vIit�6R��	�l��j^���<���������V�^�n�c2	v�2�
�AY�K������^����J
wQ�Ei���.Zɷ
s�
rɬݒ�
l�v�K�I�|���B���
�-0ص*�@�Pqv�@���bJmP"ЭkZ��k���N��Q��Y",��Nv�~�Gh�\��/�5�{�|�Om
nHU3���K�B�F�M�Ñ+p�n�>8����c��$\�Y\6�W<�EN1�)ŗ��-[��f\�����
n`a��R�Y:8U3��C��2���/ ��c��|a��'�̒���o�'��
�2>c��L�P�*)�M�_x��O�.�Vˇ ��Lhp��lجW.�#%�R�b.��_��}/��1�^�Ѫ����1J�� ��rֽ��4����齢L�{�����A��_X��e��0����
��k�RX7���0����H<����i.����'���c��ӓd]c�+��
NQ�{L��
;X�MլbG�sj�0�&���*�*�~6H����l���St!J��
���K�ÿ��7�ņ�W����Bz�T���LJpw�VP�ՙ͕w�9"�tgľ�<-u�	C~m��H�]#X�/�59�2���6��	Iw1���q|�[�<�S��3	&�k�,=6��tkF
�P����}��?�a�@�x
q�ȡ�%�S��ơʟ����y� H'�����Zl���%�ͥ�w��&��;����"2�<6d���M!q1�I>q!�5<~�؉��W�$/!7������w~�z��pbfo74�/a��t���O�{O|h�*�mhD�jB3�e��I)Q6
�os8�x�Y�ϑ+��>��o4�(��{����1��q���C��|ݍ`�����@!ζF
�=��wkE���5��"xև� �z����-���u���N�
|�f�#w�t_G�.�?�p�b/��>�2�O�,z�vxX�ŏ*�xg�>�(��l��t�d�~�6"�1�Y+��
PK�yVS8��~dpip/_internal/commands/cache.py�Y[o�6~�� 4Djme�X����E�Nwi0��>��"K��V�$�7��9��D]�d����_>r�}-�fB�
���A��l#Ş�ZשT����eÕ��Ǻ��n��8g?JϜ���㤨4�UZƍ.Jo�����|�RźoFb�#+�x�*�db�O��i�0_O�(��FSΕc������_���8���׺��� ��svU����q�ۭ�-�?�
��YI�lխ�IR�{�$�l6��T)v�f;nu��3Z��A@��W��f�N�
9S��dJ�gDzݬm��Ҭ,X^�%�މ�;n�q
$
y�-QQm���?�>Š�t-��9�򽤬S.�'�Ć�i�����2W�y%ߋ�d铉
�I�z��L�
�Fn;��,Y�F�D~��:՘�����S�5�m)֌�%W
��i�݈���Ŷ���@Ē^=@>od�i�Qȷj3�?ok)��
�u��ad���w�v�0�_�����`{ww7`5Qd-�`�b�w%���y"L������-޳KH�-���8���;��� ���`�[O3�]T�=hL�
��d�,L�H��f�E��*t�,��	�>厗�*��%���p
Ult�t/�풑Z�U��׉�a!L�qQ�om�l�h��ݼ����l*�����/-�Bz�V�F�UZ�Q>_����rɥ�"{�'*,X��/	��`Xvc:\b^!��Rb�
HM�9b��r*FGM_qG��ŹذJh��ukٓi�5��ahhq́u<��4U$SE�9�+�J�%�� �	�\7�2Gg��-�6�V�‡�b"���������=c}o��u�:�~���oUĴ`5�X��1��!�YPgp�<tz�Ao��Y�v�|��@g��
ϼ]Z����|�|Ɩ32Ό���GrkX�B�y��_-�:��aݞ�8J�g"�c�k���nTh���[�hc���<X�ʄ�����X��7B�!D�f�+���ؾ�E�)����6�j��N�:��Jf2*��*���WQ�cn�+�@���� �4�d�Rd��l�ߥ��Fz���`8<���N��3)i�1"	'�>a�k%N��	�7;�����
���	��&����T�"�	&���^�|�'�|�<a�[_�L�l�k��aJ���͕	�Ks��?=���x>�lMe�%c
p��NS�1�0}̳e1��DVk�#g�����U��|2«��1s/V+@^PD��V�;C��)�:�O���0��C��BiDE$��{����IԷ7
o.p;,~�ณ������o�;輛[�hs�k&��#!��G�<d�W���l$��̂I���Q���Y�J�K�w8YQ]��N��E��Czۥ�ko�8�M�4+&T�n�s�������)�+怙f���4&��&�k���'>�E���H\؁��X�˟�S��ӛ}��(�ΛK���?*�0�����/e�W��L/��*9'��x(rN�5���W�J{��J�@Id�m�^m�.�j��>e���v�"`����X�G�� �NGky����Y���W=��˞��3(��}��t�rZ�ڨi�ں��0�(?��u���Sp憇q_�C*+��{�=��
�@��˵P<�a�ު`��,�^���n�%_,v�^Cy��u��UO��tEEz���EV5kz.($��s9T�
���%����KyR9�kq�{C>�9�6k�`�	F�h�C3-p����.@��-n����
��9�ێ0�7ǧ!�Y�����_���«�7�1/p&]7t'Y<B_�[�S�x\7E�?E_<�G���t]��L5�z�����Id)P`Z�G|�iY�R���X{����(a�ɩСN�����T��#��I4�J+zY:�;|Y�w<��w�,k�'h�7�������@��R�׆��~Ӄ�?��4����Z�X�C��Q`W�z�7����2o���r�@��<���ms�/0��=a�H$b��FX��炫�L;�.�Yw��s�����t�;��f��'��٪����,�R�րr�ь�x�Mg����@-���Cl�8r{����
-��y���F�__�0 ���``�M���u�A�mz�
�+PK�yVS6l�1�pip/_internal/commands/check.py�TMk�0��W��
^��@�z+�����`{�h#KZ}�����_Q�n{iE �f���{#�N+�@���M�:P�if,�OLx�C�]4�M�Gn]24�EɥC#�(*��#�XV�똬����V�u�yKE5ک�a����a�{�y��*�F�W��	��T�&@��*5�ά�Ңˇm��a�_hB%B`�'�R3︰E�m5�y1���wړAI4p?IZ�����,%�,�$I*���M�6j���ٺ�Z�����3#�Z8�g�Vӱ��F��FYq�U&=���LL���N�žj��0^�E��^���LKo��u���ʭ� �����Kjv��C��l"aCmN�����v���4zή<e����b�	r='����QI����q�sn�B�Y�K[{�,�xJ�W���;�3��s��9���N�-H它P��E���r�x���\���)���R��&�A��Z~��'6[Сt�G��p�/r��i�;��6��ƛiZ���oX�3���t���K<PX�M��x�S�Ѩ3�XNK�zI�-5���PK�yVS�qC���$pip/_internal/commands/completion.py�V�o�6~�_Axy�w�o�c�eP��Io�C[�-��ۓ�� ��(Ɏ�u~�,�ɏM�/r.A�E�R���G���|y!����D�<4�Ւ*�e-��f��,b~̨�	�~eIm�0��L��d)�(!�6�~Z,���I))����V�<�Y�OW�e�X���Y�^�>B�m[�)8�'��	0��I��3�GsZ��E-��+�����v���cc�O�\���	/lp�,9�K�(��r}�%p`�����j��6�'�c�y����d�}Ǻ�h���&����������n�`2�?�O��d\h�?���*?^	I��I�~��GUc�M��u@YZf��طcy1x�y" V����(�*6� �F,
va^ �	oS�8؛��^���8�=t��v,x��;�S�
�C%�!���-V�}m�Nu��T�]h�L̹sƸ�G�I�e2�������Ƴ���p�Q��a�Փ\u2Q0*�c�ǩ�
kѠ��ߦ��4�aе�
jq�,+f��V���S��y�~؁
¡�2�G� 	�y������I��]�sr�WI�L�glQ��$F�7�$	�٣�pa����gd~�Sm��^�	�1p:\ڞ��޴���ۉ�yl!UlXu!{z/�G��ݓ{ER`/�X��-P?�R�ﹽ�����Ԇ`o��&��B?����9��ku���	��e.������a���m�;/3}ΧP��y5�L!�;�R��6�}p�h.^�56)@>�A�y��w��t[
Qo�~ñ���DkЪ��D�;��
�̾fƬ(����$�w�4���]�4�T�;裞���$$��S����q�r:^�Ȑ�c�����zs�n��~�T�7��8&���&��㶇͉,yv��m��%@��N%&m/7��f_����P��}<�gv�
X�#���)�73��7PK�yVS�җ�	�"'pip/_internal/commands/configuration.py�Y�o�8�_�SQTd��Gc�@7���m���{0A�h[WYԑRR#�~3��H�v�.�y�mqf��gFšf�!%��j7)�O&�7Ѯk�6T�ɖ�auSg\P���ʖ��X���:��MLn�`UVN]]�IZT
��,ٔE��M7�pȪ��_���XD�5���
�rywws�����b��dնص<��pB���^��U���h�:��(�P�_��F�
�
��w��-�K��Q�MQ�D�0�tZ5)<=�r(����Y�f��<�)k��m&K9�c'@x-��iZe���d2ٔ�.����fR� �翳*�Q���J�ܕl
_����]�kmf1SO���IO!͞�l���&!�D�P �D�tSl�GZ�s	�%��/Y�
�'�}���g�XЗ	h�6E�М<͞ 2�Z �BS��dѫm%����u�r�nw���3	�$�|[T ����pP^mI�*JؖL���<�Omd�N��8%5���1��C��B�
~��n��M�
��%�
��6B�� J�7PE$����BPة,Ɂ�`�M��`��5�H�$/�Wm�>J�e֖M���R�*�i���>����_�F����'��-Y��§L�+�m/�,�S�$��9��f�k�3xTo��dB��ރNK�z�T�P.p'��<U4"��Fd�+�l9����ds�t"�ŽBJ5���rp3�K�*����M�z�GqW������r�Ke����&������?���	�]~��rsG�� ��2^dk�#�!��C��<q�����S�EN-�;�|i�~�d���#P�8������/�YU�?� ��W=\����,�s�����
~�V��st���J�z�'$�h-�gm��]�>g𶒹"&:s�t�)�����+�M���.��r	�Ʌ�o0S��T]m.2�*wT;�J.BH���̐
�SM����k(��4�_��+s��x�m�|�P���֮�-�t�xb����|��Aq�AUq	�ғ �pQC��v"�[a��)�2~H�(Yb$�e��G��f�(r�#��M�+Ur���m�F?��b��W;\f�5��d`��>Qp���@�C�M�q��8bq�q6�8D0o���cJC��9��1�:bR����P�
�ZJ?����Ɨb�ǫ���5�(	=ck�hL_c�7���2���.Ѓ��`�.�`%V�s�Fb�:z���N� y�gWxH?�>H�P8R���0����a��ܐ,�*�L*A�0[�5v�OM��eۡ�ȼ���Ț�R�^�]/�]]�'EA���.��}�G�7d|��A(��~qyם-��h�Z4����>^�,V�s�iq��g��ڳ9	�[N[�G�Z�ِ	,�GG���r�Y��&�t]�B�V��z)�� �ق�"�a�%�UGO�	���B���m$#4�

ybvF�镋�I�{���4\���!�Z��
msDd>'f�(�ɜ[�g�dv�:���]H�A�C���U"&����������Aط�f�J����� �
��)�<�X*���C���	2����*�Q��pO�e`�m�Q��P�[2-�L��㺁���k���7XI=?�����.#�Cn!3�+��փJ��=�G9�)G��V)���7���s�]Edԍ��R�/e���p�o8�N�@>��F�q��jA 'oJj9UV���㌋3��POn)�;/U��s�S��fa��%��/��ց�(���\5*C�����恒/,�^�j��a�%d�Qͩ@ET�t���I(rR�D��KI����	f&#Q��^a��V��
�
�o9@���碒��P�&8��"�{�oO�Yc=М�%glK��\-��`Ahܡ�s���*4�L���;N��^���g�J���h�~՜��[v��)bn���lґ�ϭ�@�։��1��}sB�z�������A���M�!������6}�I}���<�_h!c�ݡ̏�`=f��Z����Gf�������I~+�bD��"'��A\���e3������|+3U|`j�n�oM�͞n����,å�a���;N���i~�~�jC��ҽ��|���|ֽ���ߟ��� ��6k��U%7>.�nպ����ę��T�	�:��t����	�Ҳ�r�ȾR��Sg��cj�ϋ�����j�R|�bT:���
<MD�6�}b���3l�V�[M7�g�H�>='�7
��N�����ـl�΅� ]�ݛ�0���Y������:�h�eZO�u"{�!�A{mб�m	=�c?�36L����(|P����qHy�c����Ҽq��l̪��+���9���mI30��%{��נ��C�7|Ot6�\�7�j����\f�����ٮ`&%:���0�y����K�6�z��5œ�k�b���Z
��wp�+Ls���W�mj�/D��PK�yVSZ]����pip/_internal/commands/debug.py�]o�6�}�"�l��u�
������j�^|��(-/�������~3��(�nb�6E��m/�!�,X�W"|յ���)uX�^UJ�D��gJs��Ú��3s��rh�-l��@9�~�kr)
�&�B��?{#dǚU��}NyWJ�Dy���Ԟ�\�c��_ʓ?r��|�w0�ԟ�F
��J4�R*z��B6��Dg����)�RZq��|���B�-�ʀu�>ϡLDB˾rj���������k�̠��r���������I�U���ub/�<��r�JfX@@�x�(��ZޙS(��ν�<ѕ��ϣ�B�=h�ъH�+�
ޜĵ�K)�X�V�U�+���>��x�!ڨ5��ь��@>ˎoV~�\t�L�7zC��dM�#��B�P��(�U[�=z��7If��V��>���$�>Rd����'9Ax�� H�83�5�mY��轷��_��g��RH���Rt��D�-����8��5I���[�cH&8%�=��ŝk5�3�2@��\9���BTt�Ft\���F�5Q����"����^�J|#R=T��@JEW4C�T0�A:�(Y ��q'�B8*J�u��&�|�ݿ{ �G0�rP}i���EE��6��i>8m�Ln�4�b$IZ�~4T���9�7�r���q7 +3>,^��}CD�IH��=0��Mc5��M���+�4SU�x�ݎ
"R���8����i{�d˖����&��}Afy���M_>�^�X�{#e�PV��5́�~�_k����*�W��glI2QH&?�s��(%�J���EiZ%q�z��_�u#w���]}v+�ț�,� ��҈�:�$�����{Cl�Ӧ
�~
o���O
��#��|d��ؘ}x��;ijͷ�@��+�n#ep��lx�Ĥ:E#"�vT��er�y���C6R(�M���������#������@O�<�&^poر�M��y�Œ:Nao��͋��$	�Cb��{��v#��B�7���!�a���h��`�
�
��P!���܅N��y���`��+!+��zB�\�긢Y^i˵f���d<uy�+afH�dNkn�%��ԊMһ��1�ym����^�ACIINP�R��`��1����ב���tـ���8�#g��`I,��������/n73!h���S�ޣ_�R
���K��X�9f�r
�v�Fۖn�s���;�El~��s�`�F���6Fo�S�	�����^��>���2�֩>6~�[� ��������E�	V�y%�
pas��?��n�l�q�$Ff�`�\J��J>�2�� �wy����x���o�,"K2��pn���|����	���H��������
����8�ّ?��tz}`i�Ih�~%�mn���&����[n��|vfuU�͈��rIC�T>A��W?rO���9��?o�#9�lD��w�q�~O�����
��(Ћݾ���5y�6�27��E�
�)m�UvVg47h1�jO���O�6�@>�`?�6�v�;*j�+?�	EE:��!�,S���2o��雓䳌*�wdK1)�NJA�Q�����NP�tO{��-7����#��RKt6D�;��N(N��b�$3��C,�k��v�ɨ��1�x�d7G�rּ��\���]���ڿ��o66o�oȂ�ֶQC��G��.��)
�bM~�9�C8ps�,B��r�=G'��/ռ�E�g*t�y����n�)<��-0>���Vr��wk�
L��W�h �j��k��dP�f\|���eh�#c��}b���'��vc��� �rֹ���>C�y�H.�u�3Ұ�
F:CZl�	�6(��
�,��0Z�����(�Ƣ�)+wU`�Z*���Af�r(
�O@�ң�$|4��ί�'�4;��/XR�u���`�����y$`<�
��]!1�=��Xhai�lI������<�'&HA��h/*�Y�4[��@�$$�y��>��-W'i����:�@�����u�ﻫ��z�v���
����v��$�rw]�����u���h�ՏQ/��5��tr�H��Qbq��љ/-�q��PK�yVS���m�("pip/_internal/commands/download.py�X[o�6~�� <�[��AH7`@1Kח `i��bC�*I9U�)J"}Ik�@b[��s�s���Q���[.�3�Uf��jGTc�
��-���(o������&�\ZВ��|�)w*�J�3���1���P��,m:[+yNV�gZ�ݎ�j�>�\����)K��mMKL��9U�2��V�h��ww�ߟ����V��	� �L֓����ra�7� Ҵh��H�wL�@fktAsT��i�ymv��4���oЖ�*��f.�hk1�>Gs�g�����l6+3��Q�R(V�c`73���|��Ҡ�l�0:;of��"�w��EJ��!&+�fAZ�r*B��J��M�?�ݓF�O�	i���U%#�
�r8`P��bT�K L�5�;6χX&�"�mp�T�g��{��qf�a�yY����I�t�uĪ�JG�*�=�Jz7����$��N��5"k���WxЖ<�ry$�O�vKBV��ȟ�M+�(��F��}i�Hݾ�+��D�=ͩ�id�`CXU���Yݒ���������g�I ��P^�?�\,.�-�� ^*+���Xl+Ԛ����]s�tw�����R�Ѱ}�����]GZ3S�Š���`]3}M@Z.*ʍ�S/������oW�}�0��Ђa��0���o�9�k���˃'+��S�"�c����$<`s<�|���X�,�3�<G$�:��P�5Z�FwB�A4�x2bkQ�5�����WS�
%-n�3���?��i�U��n�j��8�^��I�G��P��;���o�^F�-.;����f�At+=4Kܹ	K�����;�����Ɂ�lFc,*D�na�@�-[7���-�����E/���n���㒬[��5��za"}j�G{�=���!�Y7/�ˏl,rax<�Le
���q{*B�K_��8�!.T���)�)��B{�1��1H�|�]��ʢ�t�Ĥ(P��0	
2�}z8't�P��'�E4��mExO��%E�-e<�8������o$�Ep7��������$Mzl�.��Dv�X(��$�S��թ���~y�M/��pEv�7�G�i���}���i�U���ϙ��!u�_��dAx����J�"�|AB�^��4QY�j-ewC�45x�,�ī�9�q���?Lp+��m�������u�upb7ߨQ6�@;?�\�79�K� �HSs��=���Ç�e���7\2���5��9�x#�FU��G8���3ή�ÓH��s/[ܤ�n�Tnp-2xc��#�\��3n{��ct5x�أ�=P��*�r0,���0k�U66��,�����l~ߖ%Ϧu�x!��u}N�'�e6Im���PK�yVS����� pip/_internal/commands/freeze.py�VM��6��W
Ȩ��l@�l6EѢ)�M.��@K#�]�dIj�m���!)ʒl�I�>�&烜7o��{��#��f�Q=Q�if,�`��g�e�$�r�(�\��d��O:uߠC����X���V}�d��n��u�
�����������%���p��5O���%��qa��f.i[�~��cg����_~�#%�Lіn	���֯D����>��eY-���M8z�37���R~�Nx��x���hV?���,���n��,i��+�`6i1D�-�
��zi��O@,��Be0�tt�3Xt�����6�#�c6�@���@���s
���+df	����&�@KX�T��܂h7d�#�MI؏��$�׳�� �4��wx�jg7Ci%D긒�Q\)�ڟQR�5��̺e�p��r�Ǟ�)i��l� t��s��;�5w���)��0?�$�K��܏����\��X���
�Ǒ[�C.Hr�Kn���18��<�{��Rms�k��I�I�f�혞K��딁ʙa�s��&,|]
~nc�<q�&@>a��̒N�xl
�nI��Tn��~Q_<����q�yZ>�vA�b��[)�Sг6�"D�;l,P�o���B�YU�q���?�7��G��չ�_Q�F�ב��k_�X���j9 ��@�-b��}o,�T\��9���{C�S-�v�p�g�(�3*UW��#z���%B�H��x1^�Sci�S��͸Ѻ�t��v���A��f;vD�'�-����ts�/�Cx�p2�=H>�%�v�l(8����#�|���/��n�A7����K�0�n�ۯ5g~f@�G����ԣxf���A��s���]���L��Ւ#��W
[Ȥ��Z��,���R���Nr�ZʹU�h&��Q�8,n��+��r{]�
�I0c�*/q�A�
6�< �=�$=���h�4��PK�yVS�����pip/_internal/commands/hash.py}UQk�0~����
��s��d렴�t}�P쳭U�<InW��N��i�����}�����h;mi�m��Gb8J]�B��Ѿڨ2�%�s7�h�粇��^;�,�ºh0t��L(FqI)�[`�n[��)�r8~bw�Š���no��}����v�E�NHK}qsԗ����
���]a����k8l���
[LxɊ�WO6#/F8`�w]�{�|b����]˜�-0�FQTHn-�¼Ʋ��#��8��o]��������b�F<����	����J�"\CV�.���-(gI%$�I���^B@
�X�!���[�ќ�g��5y��Z�G��C�J鐹��6�Ư�gP�vgz�J�Zʒ��Y�duNn�����״h���s@r��x��ܬ��5jӴ'&l ��Y�F�l�h��/|ylV���t���.
�.�Q�A�C"^�lM���1��i�[��HLj��E���1���.	
3l(jƍ����K>eK��Y.ӫ SFF���g؅5���?Xg��8@���"J��o��q>��Z,���3_�1ˢ�ިa�e&1��������s�Ax��� ���]�P� �~fQ����f�+�!91��s8�%Mk,�<�o���=��4>kc;����JQc���C�i��Š;Pc����)�v�(39'��"���䝚<�a'zv�6d2�K�=�;H��4r�
��O��PK�yVS�Ô<�lpip/_internal/commands/help.pyuS���0��#�* eQ�Qw/�J��[�^�9a�`�c�YT��;�B���Xo���$݂6���5��M�6*=�z#U�oҺh�4Y.�CR��.����b~�m+T���:�:ˤm�~�χ�=
�^�8����&�Eѥ��l�$Ӟ�"����W��JM0ٵDCEgE���+�3�GC���S�Sd�4aN������za�w�p*��Tb�)�>bo{7e�A�|�G����p���R�{�MfC��\�W@�B^�v

7�����V��
�[E͟��݊�6�o�rW�jPz����u,�܏Mp��y6���k�m�+�������C[pEPȂ��f�8�U�:��%��H�S5c�|�Ti��\�T�h���K+	:���jmŌc���o���>��_�9�8�j�j}���	c�g�ܴ�?#��r�8�X��	���/Ibx�8���JX3]��Ǜ�Y4xS:>'e�xHs�4�B�&��PK�yVS-g���pip/_internal/commands/index.py�Xmk�8���B�R����_�s���(iH�±,F����ؒ+�I����ѫ�����]I3��g^�\(���j'x�x�z,$A����@�=S���v�ѹ"ߴ$G_�T9��+�ns��e�i_Tw�5\=�o����#B�����q}�a7s�~L%P���n�窻��;��� ?��wf�g:g
����Cf��
�A{C�g�tu��*G����>]_/rZ������{U8)Hn[��Ŏ/�!�jbM������"GA��7�&���3X��Kڛ�%�T�
�-�y�n���|�s���e`������s�-_���&]��K�%���,z�IQX쉪��:����l^��%^F�=���� umw��V������*R�A��Z�t�
�O�T�b�Ҫb�#U��V���Rڀs�Kgї�W>I���s&{������0mu�!���Y~�c�����u/�����'�}�ِ�MS��J�i��y�.8#� lL�BSGN�x��2[�h�oK'R�qA*H݁
"��4�^$�,�W7�aq|)#g�q�x��#8dB��[��T{i`9A�J04yDc�2�Z��@�sU|��|�]��%���3nϑS~�G� D`��������SH��`z��L|�&k{������J�j��q��&kq��T��N �-�JT��j�3D~�D�ָE��(������$H��H�w
��	t�[�� �YK0���{
�=�����W$K�|�>�MeaS2� �!ƕ����y�5{��Gv]� !�WĀ�.؛P�ZfHqx�T$��%GI�?�P-I��{�,&΢� ��]u4�][z[�0��f�����=��v��{����ƫQJc,<�ƲlS�6l7���QgەC�EX"���p���n׏!�����M7�4����ԛ��f��4��0���0�m��u�Ѝ`�Z����ۘ�d~44��M֙ X�C�scx[pH}�m����4���j|�x�)jsY�
�t�Q^������ݒ���[i��p ��m1uT4���O����s��e�*�-0&_�X����V\�F.��ya^��Y+�S��c�(T�h5SXg����t�STݖ�Tf���ˀ��b:���|@LWV=���

T�7\�u�t�I&x�#�|��������@�q����c�+/.��]�|͈,s�XF�O'�9I�y�pW��4���9�q���yڧ���ux�n�w��p��7���`�
�Jx�B?wu����u8��qf���n��z��+te&4�3��TX�bB`�Oy6�9Mܺ�rR�f�E�M���/�M
~�	���L^�(��0ʩ��NJf�6����1)�l�֔8Y1�C��*=k�2��F΍Ma��J���H��k�����$��Y�����YlA�M<1ׇ�S`�8��u�&B���lj&��PK�yVS`�+`�l!pip/_internal/commands/install.py�=�o�ƒ����2L�It��|Upi��%F����|���P��%����~3��].e���P4����=��b������B�����ں1���&�][��W��USo�G����zs����E��٫�)�{Vv\Ȧ�n[T׺���Z�|�^���7۶���<����6Iox���d���k� B��gU]yV���*�p�kQ��0\�g��@�ۚ��9>	6-3�fY@b�aҷ�}6���Ys��t�k�u5ַ�Ӽ�l�j�;�G>o�Ǯh��W�s�~J�o��J�U�tU�����V�(�u��<����h26�h��0�p�޾}�v
��9�W�'��sw�
�����){Y��e�az�����#`6�=��6[fmf���M��b%�VU�dU7���5VmS���/��|�-IL��C��jUy���2z�h�8
���F��.��Sx1ց�B�6<"ZT��s�����\�ԯC#[%@�۬5���7��B6_�ҷH��.	��}7>ƪ(�؉�ot���6�m�e��޲���
��<ٷ�M!r��x%���D�[lA�4hB>�6u�s��N��U!�:��n�S�B�$�Ӻk�];’X�g����/`�r���n�m����R@6T������I�V��wZ��uY/�r�[��+�eOMr���*kv�ʲ����/	\�@�W���r)�H�/-�QBmrtT�f�y�qqJb<M��ђ�h7$�-h�4�3�.���\>a��#��x8tpX`���р�&��1�� �E���˺aQ41]�d�\����j\��(v��kx�5��B"7��GGV�Ъ�y�	��d|<�E��(��_՞I��i�T�7c��,F
W�k�# �O\LX'�i-���O�r����u/��)��W�LJ�f����^�8
L�D�59gY��AC3����$j&�-R��b!#��,�`a(��)�]���)��F�*�3��cm�V�c4�K�,ͅ�\Oė��%}��hA#���0�5�TF��)����R�F���I���4k���2��\7��7��JgA���Im�}b�!3g�e��ǂ�+b��u�{���h�a;���ގKl�ēɽ��
а���<^��m�]��� )փ�2-�Pgm4��̤��=��G��^��w�5�h�
�2��v�;�Y�r;w""�_��`�	�����IX�.��й�[�2A�?��BRY�dU��aC��yރ�3�u��&[rd�`x��hhʳ��2e{��m4�Q�o����s��ᰄ��C(���N��^�.Ë_��z-�ǚG$4�EM�7�kS��9@��bN�����;ԝlB>�Q؅�`�ށ�	2�ܱ�9!��<���x��ųw��������o�KX|��
ղ�;�d
0��������gg���ժ�UH�"����UU��Z�z���
�����)
�o&9Iq�-�8i���z�%��,�J��h@zK��Z&��U�)�P���.u��$��9�<�
ge���ڌ�Lk��4�aʕ�0��$�{(�^�I4�a��C�RR�8��w�T��G��ٲ��J��L��lhQ��
aV�|�T�a
�A�h���̱*#W�(�p�8j�3�EZ~�C��ܧH��)�!:m$�8��r7+V���%P��*_�E��rЌE0�DW�����)*@Ế�q
�!8��gE���@���=V߮BvƱg��of� ���&���8`��dI��kP3�����&���
�!
�և���CQk,&�x��%���(N�$���ɞ
,G������.�ݜ��0�[j���9LPDouw�ئ U+V�$��Y��l�D8k����5�^�ˡ4,�+�uf�&�j�(k�pK�ƥ���V�0�`��!�A�M�d��9?{� m=2���١Q
"���jő���1v�	�1���g�d2�w�J
��P�!�!��R��
QK���P���>����v��U�P{.��\�5�����, )�Yk�w�-$/��^ڧP1+�@)j�k9fn�N6�cp��B�����%��b?��V�	��țb��t��ˢܚ*�
T�Ǒ�*�‰rd?]+
�ϟ����<
�|�����g,�>��@J���s���+�(y`Wt��C~Xg%��u&�����HY�/
�RO�4�(�,��M�m]Zq+�@m�}$�(i׌o�|�ҙ7�;�S��}���R�a糏bf�bXS��s��
�Ӌ�TAp	��~����`#�J�D?�˫��J�R�<�O��;	�8zf�{@/��P�1
~��Ǒ�O;d�$��Ɩ,VMz|��f
�fT6��=
�Y�s��ko^�s�`�@˂�Zg���It8��hxkj�
f�W}G�.L�l[Ԃ��{J#=ƴ�����.��s ���|�&vy'��e+|3���z�6�Il>�:�������P�w|��hn;O�<�&��SS{s餠�O�c�"�32���"�~��AL�N��lk1,� I����a�����*��jn}�Z
^��������P0讅�fwf�Q���a@
��'zG�Q�M�J�-@Q+A����i��TtQu<:CIx��_��T�����^r��WSm$&Bb�"�n=D�ԌN+E�}]�.����vb��8�=P�jc���X׷���[�9��s9�4�R���>�I��+ˆb�j���(u���T�J8-7|��`����LB2w~y*���=��^�lcY�"K��V�a)zE���[Uaa׮����`�r�1�z*�	�3�K��9ɂި%�E�$�p�IRX�2ܰ��q�p��g��¦='ōƓ��TQ�T��ߘH��ހ)@�`x���^�Kv~v�~����e��y���F�rp
c,Ƞ=�RmƲ���:[N�-�^a���j�uWf
���' �*���f���q�Ɋ*D>b>1���c"��aS9�VK������)%�@���l:f�xS�FI�d��>�/)���%�P��
����aý�pN�5WT6x�Z�̯��`���%1�q7�_�
�d���
V��Z�y1��R���
��-�k?���1�0�dH��|��P�#�r�E�bVu,7u�3q�[���!�D}ґdh��b2`{))���|���o��k��j�C�K�8���m$k����l���T˺��Q��s�Ƌ�!�����[4���$6�����#���Ir'�
%�N}-��U��{�,ݍ���/o�B5���u�V�hm���Qڪ�=v9$���Fi0�*l��P�$:��U�7��j��ܥ�S�̊�Ɓ�Ѓ0�U���
)�#����j��5�Mv��{�۠��Rm�<����5�C%������&[��`��~�+�%.�K��:��`;�&Yzlh���ƒ�H���S����A�=P�x���"#��sJ�#%#(�W�.�6WN���C��tv�Su�I[o���F�W���q�,J���*_����3|: �_`]U}K��G'�8��*��L��
�y}�2��	�^Q�ܺ���5")�!"�Լ�;yH?�}� -`հ~�D������ܿ�ˏ��am�X�maTZ7��zRp���=� ��aPBgsQ�K������

B`�Q�6�q��C�-e���$V�:4�C������M���������V
����Җ1C�����UG�1��+���|��5WN�P:ϊք^��	D�@�w���٥Q��c�9���>��p��wɻT\�˫�h3~���C�aS����cX��~#�i�S�j�A�ޫ��b���*->�Yz
���ýCP��(>t��:{pW:A�����y��A�d�~S����r��-�$M���&���&\���,�/�~������jK�Ґ�BΘ7�`X����
[t��¦�o�Ѭc�U��}�}vIT����"RN�>��c�	ēH�-*�$_\Z�t�2��)���e^�?�Ho��ȪvN��o"�����4��1Ӫm@B�@���:�::b�^ty�O�^�c�#bhE���7dw��ȇq0n)��`
iE/S�E�cO�쉋#0{Ձ���?i-R8Uo��ׁ��3�h���H�J�t��f�x���ܝo�fFU�|��K�y+w}w2X��)fW~#R�,2N�q����~�~L.�bj��*z�����Ⱦ��nrd���t����Oe�v�ԼW�<zE��]�-�ECf1�����P�
�e�Q�J�g��F��~&�tAm����r�N��`�w)(�+���!C�r���+U�U�M�þ��k$�F�mq[��u�4�5��ݶ��5��zߠ=���ws{��i
�gN��Va���A2���b�r�#z���
!��a*HͶ���U�ҭ� e�{L�^K&�v��F�V`�?^��(�����ٓ��������$c$
�jK�0��m��J�5�eT�G)� ��I��}
��0!s	]�.�I�px��;�̋>}��w2b>菇�����������z!ʢ�p ���1J���;�13�,���ɺ�ހ#O��ӽw���) �	N��p����s<`�a���FZj��}�G%ͦm8�v'���2[��p��qI�SkGb(�����G�IJ�B�.�
2���!r��:���~́:��DN��`q�ӧ�d�6pzGz�k,�ϵm�Pv.�+�1�W��3�R�B�PU�lݶ[qzrr
��[`�d��f'�������z�kB���k�i��L�k�E��a��|�H2rǬV]l%x;e������	�Kެ�eA�Pُ�*���C$qdMߴ~^���_����G��4�6Z�vR巬Ô�cYs���C��*@}�ʋ`{x�\���b����O���ՙu�pUc��� ��w���H9vA������܏Bs��>py�E��u��/?�r#�YK�
�h۟�L˩y����)�mF8�e�-U"�R�SY%�r��DN��=*s'o]�Rq��W�h��f�K����ø���~d�[�|�BFB;����YG�t�N��V���t,�i��H�
s�&3���������;����y���'��P�;���C�&����o�D}�K���l��cE��]�}a��c�e�YCCZ��3�E%o�+e�x��B#�=�H/gnvd����ޱ`c@�<��Ѩ�s�5	{�=��2
���'w�r<�>C�^�"�8���O a�S��tQ��q���c{���Nhl��M6��/$;��O��P�s��Q�
��?��V��
�\�_�Ė�G>�����K7�5��WWj0��K兹|2 r�aϻPM�&\h[�S$�P�܊GɡG�*-�Ij�\�>�V��_ٛ��T�lf�|�S�C9�E�=�FQ�3WcԲ�ʹJ��;R�j���G_�\t�������
	��z�K:�M�gX�w`'@zJR%�QȾ��w�56*!�V�/-�m6�*+�*Qk4���p���
Y{��A�\��*��:���Ũu'b[Oم�.f��3h�bʵ��j��X��L�(�6SWq�w��bm
V��k	���יF�)Lg��bJ /����#�4s	�Dh�-�-��h��J8
o��Ӧ��!�غ�D���xt�H�ٖA����®��m�<XA��xZ�u}fE[ޠ�d`֤ ����i3㶄\U*|S4od�B�?���{o~�C��L�^�MJB�oT��%Jzd
��|y���Ȑ4�r+���'th�6�@�Dq���4�Z���K������(�lJ���9·�O)�f�G�!�P.��������*�5ݩw���ϯ�R�Z��%���7�3<��
�lY���e�r��t(H�C?�{�	���L��e���t�c��ž��'�yA�0�"��p��XPC���{!��S;k��F�X��Q��x��y�И�<HVΡǭT��Dv<<k�-`�c�^y�>З/)�e�,Gב��eK��^���y��KS�^��h��� ��P6@E�x^�7���ʎxw	#��q�	u����{��3���-�_F���/�RGHT#�R���E����=�ʐנ�*�;�Ϛ�Cx�Nc�(�U�:�3�j矢�xA��0�B��ǃSxf��`��^�x���w�i=Y8��ކ�3'�/��k��U�se���?F��#H�=bbl�T;����Y݆���^
8Z�hUwyk>����Z�G$��_W�Cad(`^Q]��-�t}0z�Z�N��*uJ&�Q�ϖ��Z��J�,��
�Vjɪ0]'6�ʲN��N'^l?��xH���0�Q^�O��SI��HcVz��Nٱ:�;|�k�
7�R80�xN�:
����ׁ��%c��>)��D�ƀCR����R�լ�OS�u>�/1��4���)e�-�}���Y*�y؍	z��n��%��<bۂ��6K��:�N���=N�ߡXVtL��_Ξ\����̰����UW���}��R-Y�D�0�����:��7����� ��_*�}IΞa�Z��J�zr,�|��O����
����}:4�A9eMt�e�Oo����9�^r���6(/���B�
GC#���w��<��ā�Bߗ&s(џ`�����"YE[�������^�x�,a:�F~
`���8�꽑�M���&v`���F���	��7g���a�۩'�ū�}=aO
�Fu���S�8��,�׭t:H8�y7 �A�IDN��Ӥ
�����G��Ui'�%��b:xh������݋���F^��$#��ǿ0�����O��*Nd�Y	��p7��;N�?\9���]�b�PK�yVS�X��>�/pip/_internal/commands/list.py�]o�8�ݿ�Т�tp�����溽�mq���*m�6YҒR>v�~3�)QNڴ�r~�rf8����V��l�׿�v���~�푴]�Q!1���z`R��ٝ�y�����ˋ���՚�}+��
�����z�6�^��쏁5[�&����-��J��x��7��Z�wt{M��|�y-�9[ڴ
�Қ��ʆ���8Nɷ5wǪU���\�?�m{<Ҧ�H���ݽ��]�%\��~��^1���..^�Caw[������K!Z���I�m�mA��
o�/��2�"+w��C~�WQ�1�#�iE{j~����(�f@��d��57\�͑5}�Ȥ��d�$ ��`�QHv��2�UP��V\)�]�w�JIY����bȾ�����s4ʑ˭E��f�iz+x��v�!zS��BA!��?Ү<u��`�Z��.����	��:��/�ߙPWW�5�����o8�
�,��ͮM�j��I���a�?0Ry ��|�J�-�'iw����gu%�#���[^�d�H�vJZ��q��G�Z��i��c(@‰��'p�#v���@ȍ��T��nE���d�a"�/0�R�;C�Pb9��j��5���0��T�-X�d�KR�Xu���j��X	nUؠ�Õߨ��T��,3��@h�=����~#,�
D���7�kX��C��e��U�qjI�`�|��
*��h�F�u.��`���&�7�`%Dā�7����10�=H8,��<�D�'�&�^9B�ZU��H!
�2r����6l4C\�!B#��G��A(���d=Y9��5١*����"=p>�(xe��%���D��Rw���d_�0g�O�>�[�߆�)�����þ�N��0�I��s��J�o�|x�:�N;!d�~�5�S��t����vCk8�ΚT-i�^�.I�4t}6y�=EVg�dbvo�Id���~��DgVw/����3�\�m`��ri	��!;B P��/Ev�xv&�6�̏i�nX�vXd��dN~��g�c��iQ�X�I�pʙ�	s�r��Zq��)	E�I�$�k��@�;9��ZS��>Iv��?��V&�b��+NUW���zl��91�Hj��D�]C�T-R�4I�w���Y��
^�t~�"
�W*�Ac���v�.�'��4����F��a�}ї�,/S�K�rZ�iI����T���X��m4y�&X�=)0���Q5�
�=�tC��c���Hjy�OW�15%��cE*��ڏk���KЂ�fc
Zn^We���51787�
�&u#ᵙJ�X��s�Q����A�EG=�vP�t��f߂B/��?�Qj5��8(��?ߪ�Ró�Ma�=��C#^�ޖ���f�NQȌ.��^s�/���/�-|�E�֑}��4M�s��
H���hB=X)�C��!'����g|�m��I��=�����+e7�ޏ��w)w��{�h��KA9(���[3O;"Eh�0pd�	`���q�V�'Nυ���.]�d#�ܒ�5TH�O��J��	/2�	�K"�l��6�f�`�7��qa�9I&�{�]�e�}�D�x(�,ţU�9r��0A6Y%�(]-�)��x��(�(s����3H,xC@\�ù@l���T4z�tg���*�O�5
��3(8�V!�Aj�ǎ�Cy���)��h���AƘ�0R�̶<����[(��-z������l�=�qtIk��ް-�1�
\���Sj��BJ�/������"�ߕh��\S����g�|���0u7��PvU{��(F�B�dZA�J�ec4�ٟb��z;Rw�7��$���P=����0����Æ���۪a�)�ܑCȑ�nl4���p�I^�՛�D�*�S��X��Qr	��{�bUy���O���i��D���,9��~�������4��կ�?�A����1C0lo�������Z�@	W�T�)X�f����+���:D�F�$��-$�k'�޷ܩ��i�_Pa�K�'�
Xʝ`�TU�PV����~���>/����h$J&�'L�bjxWpa���H�|�O���1D\7�c+	����
/+��"/m�>xi���tVq�8��f;ǯ2��*8�;@�{��Pmk�Җ�Q���Q0�8�E�\�f��E<s+i�\Υ�4EѯV�ev�Jui�zzG�ts����+��+ǹ�6hs�,���M��~
*��	E���L�����c`���2�<K1�<��l��n��qN D�41�2�O�I�/�!';�d��|ED���bƚ<�N�@3F�l~=��Q�h��Z�ǧ����o�CN�*X=L
��%�`�PQ�㦢&��t�h/�
ͱ�qp�����0O{�&P��i�����D��H��,�S���|ф�י�y�B� ?�
�w#��<�E�L���p ���V�$�.�ػ�1O
u7�bə��9x�������,�4b�C���?q143�r#�+k�Xlɽ~ zʫ�Ic�jdpNn��cP<b�ٴ�
BB)�O447%&}�Y�,4��ǹw��2N����~�/q��챎�s���A�h���IFU���
��H��-_?�IB��S˛�jjb�������β��=	��r���	s`|U��+��㢦R�z��rf������*�Ss�
Z���L��^�*����.��/3:����Kbh�ດb6kY-NAG��rv�O�^&���>@^M���T��88�6�靛�)����H�#i��_����@Al����c���k�_�1���+Ղ*tPmpjo��8�s�����s+��?\[_SOw£1)��?���L�$���]��T-�{��oH��;:!Y����j,��-XA��+m�nM�I�+.���jO"f��~V!��ٱU�Wx̣W���T�u�/��rm���l֓�%�d�cH�{�i��G��_&Vd�2q.E��hѺ��8��8n)�B����+��GXƶ���!�k�E37�����b7\V�>|�o�H1�-m7��c'M��_PK�yVSW��/bA pip/_internal/commands/search.py�X[o�6~�� T�V[��śti��
u�up
��i��L�$����w/�()�����s�w.ߗ��$/�[.�#n�]�y^�:(��ك������,W�*�L��F{�*�4/�"��J��d�7|�h�R�T*�	��yŔ�Ӈ,�;7_�f'����qv�ۘ��19�
>�JTB��+y�fwL���t���C��
��8��*���ݶ.4� }J?Q Z�=k/��|�E�/]�9S��1^�.��V��J��5��wy�]���̳�W��o�d~{rr:�	a+V�wjO�,�Ǟi���z�-�ٚmh�댉;.����
f�*�b�<���l�V0}_�ϩELM��f�FR�pi���R�QϊZ��`�i�=W��{�5ˊJ����&��tD��t�5��*E���B��w��&�b�tϦDiY��
B�E�@55�^��r4��L�����ܬ�Y���,2k̜Q�ڹc��xuμ(�,́�0���]	�*�9�!���0�˗��ëD�xT
�P\�=/e�%�¢p�Y<ߊB�Ҥ�3P������#t���X�I���,k‹��jo�T�0�5��t£qgeb��Y�tӳhh���Yt���d�d�LK@MV�<$ٱ��E�B!�O�
�[�]ۀ�3�;�E�����*�^��%!��S;���,�2~9�41��0�٩��cB嶍?mH�&ؐ,�Ж.pOR��+L]p��;�5�UXA�7�3�H�(�e��j�MDw\+�0^Y���n4B���ix�ZJ+�P#��Dv��z<��������X�\Q�q:ޓ`;&�iV�)�/����e���X��3V1�5�Ț�?��Y�/�S`����
��n�h ��iQa��BA'f+Ҍ��-�-� �1	  ��6�6�MU�G�n6n+��9/����1�Z�؋OW0��s&��^����f��$-͇0�d(���1�rM�f䪦_9�R![h�=�c�[��0��`L;5H�2�����I.(Y@�sH�S�_���9x�RL�ê�RΌ��|���q�ʊi���JH�|�&8�:h[[8
�xĊ�T�^I�����m�
��l���:Z�=�|���j[�AW���P�U۷���=�bV�1M��P����
��\�\��諰�#�k����D�YQݖ���^�4�y�iM�
0�~�� aE1����ew���
������
 �T��T{���젺E�o.��x�ԧ~����D�6@���}��������F�2�e	��ح��>�01���C��;�hG>�9]�:�x�P+�P �o��ϼ������!W���bm߭./�����4�8I\��N���$y�S3�p�)�z8���,6?:c�����8�| �
�J8V�O��Q��� B5�.�$M�6��.oڊ�3���
#��.�7���O�L�sEb�s] .,�}x}C�W�9냛�7#-倦��A
|���7��)��w n"Y�`�����A�W6OL&��1���k��~���X�<�<C�y͈k5�^��ƙڪȫ��Cܴ�_��-�i��q�)�Nj��<,�6-����}�	�|O�XF5g"n����pKaE�Ը)Ec��&�����N���,��P��c���=�!G
�-rH�
��v_��)�>nIP�u�&�:!?ukZ ���e?W��O��;�<ց��d�u��?6Z�'s%s�5L�#��8���M��胈�0#����}�^��$���"T�z�a�Oh=�‘ďv혴�X�4}�=!��N��������Cg��)���Y�
�Vp��O���Q�;�(?9w19�'Sc�e�n�X<��6�I2�PK�yVS�BI��	�pip/_internal/commands/show.py�Ym�۸��_A�8DJe"�G�
p��m�K7�n��i��ՕE������;3$EJ�})Ptq�%���yyf8�*������<j��˝{�D�/��d�Ձ�����%�E+k�9U@澼o���	���M���An>�U!��jrU�"a�01�U^��(ˍҼ�g�Z�ɋ�1]�R��Z��2+�cH�� ��u��e�V��(7��Ƽ^"�Ѵ5md'����C����}|�<�FlD#�_A�pb��Z<e�v��6r+ڢ�dy̵*�lƘ�a�!�׎݋������f2A�H�R�#�?�Z��=�,�L&�B�5{ܫ{����	���tJ�����V�@]�X�$�Jɔf���%��(��ȚO���6�Z,s����f��\�
;��`{)6����;����N�ta�J�[(
�����J|�8�n[�+A�L�/m�.G`�Y�ҰC3��d�KT�b��;v��[I��2_h_�=A�� eg�i2X�m�Bփe��&��}kd�N��n@�3R���N���ˢJ����m��ZLm��T�1�b�wn⁘x�?7e��B��<�i�Vћ�o��[U�%Y3aֶs��	zo���'�7Ĵ7w�e�j̾�M@��K�hJ�6g�
	i�  ��F2�N�0�16��Ӹ�L˦ե���×V���vв�װ^K���Ew��Q<T��p�̒FѴ��2rIj���-aG�W��ݲ}�^���a좃#���'��{���制�3p����B�)���M�Х�&[���\8j��cv&��η9���-�>��{u�ͯ���+=|�$"Np�|-!�� �>e��I%ͻ���>��1��(�GL�B��������������l���:�1,!�
S��bx��_L%hP
({{���Z��r0@�kj�S��
p�Q2�(�ʱ
�q
�N	{ك0�b�f�|#��Z)(��xǥ��5s�Y��?��>�	a�`�hxn��Crc�sj���g�ijm�����%��W�H�s���gX��*/���^r�^�E^>C�7{��GF�h��K���|Q�\n����`YU%~I�
Z _�~6���xs��[�~!�-��pc��i�r�9������K+
&�-����C�A�K4�r�g:��U]�B�$0QUЛa�g�����+���@n����Y�8����&�Hs��=-�<�(�g�<	�������F�>��)��S�q[BIٙvs�緒N�����!�-�md�`���^#�����qlQ�r)G�/B�~�7gA�<mF�&O���	Z̚�OX�z��I�I�	�Bp�~�S�:���Vz�5�-�F����ӎ��.)_�n�Bx`��]�#ۉx�S���ݝ 3���P�p$�����C��b7�8�aD�OL���DbZ�S���Ể�vd	��wH�k^��HB�1�;�01�Oi����-V���a�d�)��jY����+e���hd��As��ٍ��K�Ѻ��O����m�����5���o��a�1XL�U�>a~O����/���Ћ�I���Ψ��qB]Q1��۹�7�;s��j�F"��r��.l�[��(2LR0�Z�Mt�d]�ѳ]`<��=�	E05:i�����6X~]˪aw�ͽj���Z+=�[╨[��?����TVg�\���%vh���1�;���g��{l�鞉C����?���@�D���iZ���5G�bZ�?Ay�����ϒ��6�@�^6v+Na�T��f���_�jJ,����vOT�}���e�$�@r��s�re��P���h쇱�A�
�5ߦ]�.�P'nZ����~���Fqk�����d�E�}�d���JЕS��0�b�aq�ɞ��Q�FB������ۂߕ��xW���2�	{�����E�x�o��������Y]�Dx��.�v�g��C�	9^���O�`�Ю��BA�1u/�co^0M��W^�C��&�t�����K�X4�}���b�]�`ԥƏ�%�ݬ��]-��ۅ���e�O�9�8��{��1����$�pl_������g"�:�c0:I�~g %��t_��[<
,ag+=�h�hV�;���e@�wX�����(�������f�hF��H�g@��������/�yt�fh�5]�FF��[���.�C)7���REw=�A�[����As�s7��v+4���e5��t�"�*Q�צ�@w���5[�!3��w��e9{���#��t6�M�����]^(A�A���g7d��\�xt�FOa3�E�!�K�KD��q��01}�̎3�T&S.�~pCOOf��"E7�
H��%��n<<�Wڢk�ƿC���NW9 ��Al@8�L�P��h0	�!��W���mϠ��k�7�t{�f`�y�Z�p��Μm<�5Mn�fv�=���y9-z�oSÌH�(��]Q�6L�n��2F����/��
��s�J���3�{�uF�r�4Hܷ��X@s�PK�yVS/#���
#pip/_internal/commands/uninstall.py�Wێ�6}�W+2�g#��6AӢ�6��B�J#��D�$e���;��6i+��9�3�3���-T�x�)��A5��� �n�^�h�={mHn�$��t�hXvFY(����k��� �s���y%��L��BZԒW,�{��\�5�Š}߽����[�4F(�+�"^�L�µ�D��Vf�dZ)��Ic�m
Y-p������5|ɱ��p�(�DUq��Ak���(�Aޣ��B+4�(�yE�����6�J���
�#:��J攳JHLַ��b�0�l�\�2�Z�|U+���H��U�B�T\�kFAT����Q5����'�g�Y��l6yō�ϲ�/Z�&k���}ZQ��Q:��a�A1�0��+���je�
��,�E¬�\�3���Z�P�;rZ3CaOp84W{Rڶa�u8��'���=�
��O�H5Z^p�]�Rj� ip����)����zȵh,\4o��p��+�x�J5�A�_ZC�P�T�P���:(��]��{`��"���n�c�WX/��׉
V�v��W%q��p�,���a�B<J��w:JnVv�n6�@�4�x#�s�#����K�V6}|Z���N#���	�&]�죜H��	'>UD1���~�(����(4�<3��O�'�u�\TW�USآq�@�����?�
��-�����v���U�����(�j��еo8��ٱ.�B�)�SZ��{�f���IeG��&~�,��N���ቚ��}?jGzs�Z�25�9�}���S�z&e�V���J7�Uٔ]
_����CK|��hI�'BHEg&	V�Q4��H��ذ����v�&J�9���l��cp9���%A/#X��ݬan�Ӥ	stO�Q��K1?K{x�A%ѯ�]x���?�S���44�ǯxMu~nY��l�v�{��P���%$Nc��N'�a� 
>F��O
����U^�_x�X��$�����Amx�K�>�OI�.�
mܜG.�V�
WJ��Z��t=q}h��-��h4ι�_}7qQ}�M�2ʻ�݁\��Gۻ��;�����2t/t����R�3r�PYkʎ�=Iyv�=6��ظO��'��tEa�z,o�n?9F*�@
����2�z��a�����Q�tD�k&��3<V~�ē/M�8-�_#�PK�yVSwy�pip/_internal/commands/wheel.py�Xmo�6��_��(*��}6U04m��
,�!F:�\(R%)�ޯ��M-9��Hb��9�wdM+�!\n6Llf��:~���0>[+�ٚ�*
$����if�">R>1mf�в6/�0��yE�m��k����$+g��jjܛI�O0�
���l*���vLA�\{ʒ<2�-+Tt�)Q�P�i�V���n���~s3�ox�"s��RRM!PW�/�������(Z=���
�R��<%��S�
�U���fjI�T
��([j�����"��/���^��S�G���c�>��.1�d�kO,�R��98t6�щ�"�i���ֲ����\�f��S�CTyh6�����|>w���==�PUm���*����T[5� j�Ϝ�eHw�1�MO7`�4�,N�נ41���Qa,�\������M˸�!���k�H��Svv��$�LN>����d0��6��4g>R�J_��1����pk:�F.Kʙ�q��m.�Y�B�ӵFJ����/�$^�g�.��H������H ��`�a�_/���8A�dF�����l��r��m��>t���	y�*�!��Pܑ7��B�����b�����v�Ϯ�	c�N�����\b��)̛�V�E����5�T]�L_/��&\΂PB�z���2��zg���|y��rXa���@�b�suLm02wT�)�v�R�U�l�I�[�m���4���#��
b��vI�菒m:گ��Pوx��&V�V�2/:-�o��
�Y�3A�>[����	m`}y&�*�*/�����)s�l���ǟ�������#A���z��\ܰ<��ժ:�6xC��u���|�����:[_[�pS]�Se�g����+���z?Y8P�I*���b��=�Q�((�0Q:��xe�N�����V�ʰ�����?�0>[b�=Ӫ.�)�Ϸ+���m��r�QT��/*X)��;����ݫhc�E���˩�k;[��N�&�e��D�}N~�[���Z��o�m����ʍ�]��b��N��I-�4s��:�����k�
_/�-΁%6	;��L9��Du�K�s�7l���ٙ������^��k���8��{ÇtX�sk��^O;��)id�5��
b���;l&7f�	3�`��Y'.�F�
a��U"C���t@�F,Uc�W�6��¡�MN욳�]�}�"�Q,;�8u�g�*�B%�hl�����l�Tp�B���,6�Q�:�듻��\�ep�����>�۸t�#2�'u��M��'=Lؿ�z$āc�����w
�J�*��RO�G�%�ڍ�#���R3t�QO�
�nd*���'�����O�l�}��s�4���F�&�-�{�vX:]����*,ak���1��h�h�<|�lX/����k�;�~��.�R�4��%v��s����
�tX���I��|��w��L�����i�RJ�>�t%g���\$(�(��7?��}<��{�a��>��*L,{I��)�XTm]q�q��{Fd���Ȏ�_^��I�Ga�JБ�wS�s�K������8�Pj|�m��"�z�m�K'�}����p��T��7��n��c��E6��j?���[Y�Ė���{��Օ|�q���<��&��0�J�?�p�T�~<�~���3��}�����c��/��ԉ��h%��$;"�����CA^���)����s6���pxS�H|6��6OJ���_��PK�yVS�u
.;Z'pip/_internal/distributions/__init__.py�R�j�0��)DwX]���`;�4�;'QZQ�neg�o?%i6�J
9��O��5p�S��
�V��"��6��>+�G���8�K!]��腪o1���(>\�%�G��D��������n�r���A)Ua
�>b���	����9Qc� ]�<='����b��в��!n��B8 ��m�Z���Uta"w:�i����C�����y���VQ��������2�!��:�xl\%������j��dcu�H�Wg��a���n��^�B�h�ů�j���8�|@��g��L�y\�`�_�c�PK�yVSh
����#pip/_internal/distributions/base.py���n�0��Dnf� @���z�bvo��h�%U����GY�S�A @�s?�'փw�ۮ(����׍�L����U�X{��>-��w�M���1*d�[�4�n�9�vd��5a����������Q�rQ���Њv�ҭL5��i�>�~�.վ�l6�L,٠wNh��:��``݋s��I��D.Y���Oo��M�Ƹs�g9��L0�����t�(�nme���e!@)�Dܡ��й�c󔱳�:��1�J�"U�R5a>?�g�'�ģ_��]��D7��_s�D2u#�3H�@�tzhf��L@�9J�b���4�0�k�R�I�d;M�zox��Y����k�x���	EJ�غ�b3'r�C����F⧹i�H�ߦ.�W�W��#�;K����)�U�T�#���|��r�O)��]�99�0���Q/c���گ�>��Z�}�n�f�%�5'l���y���R��B~
��/�-��6����Ƞu.g���ޣ�PK�yVS��r]�(pip/_internal/distributions/installed.py}�Mj�0��>����E���)�t/��8�%U���}GV�8$T+y~���>���Bj�(X4B阂nǤ����H��B���3إ�ME��*h��Wx��H�ϟa�(��9x�y��
.
ϼ�����o6&4��6���qw��O]ן�E�)ZЋ�w�\�u����%��h'�V��"`�t"�3�ym{��;qM T�,�Y����DJ,��Q�z8R��k���D2�o C��CP��d�n{9���d2�U��W�ɂ݉Ȟb�I�v]��;K{��I��p���W�@i�h�
�.
\��RiV�,���׏i��::3���Ι�u��׾���PK�yVS�J�w�$pip/_internal/distributions/sdist.py�XQ��6~�_!
^ظ�CҲp��I�����>��h��]�l˵�,���H�,پ
i�Ѕ�[[}3��7�u+;�*y8���w�f����L�W�:��`�^�ް7}[��.lE��
��]/�2�����hnD'����Jwb�k!�������~�X�h�v��Q�W��/�NvK�DS�Ǭ��5?@����3��>��<\�\��%��{��?�_T*S���dʣ��.���+<}��=X���u���_�gi�7��<_�V���h��"‘.q�]1�$I��(dF1Δ��BB��Y����3!eJC��c���YP*�C2�`ChӒ�::�5��.:�+ʴW/^��O�e�=��xqb����������3���+a��u����j�f���qd�@�3g�!���x�B3�+�Ӄ���!⮱O�YsY�^��mX!��I�E2�a6I�qzn��;���-�IY����+���#�R�'��P�L˺�G%��h�����h�H�&�X�so0'��z�����֐j�2�u����h��L0u�=�����P�jp�.<
Ė��^ޔӠxx^lc��Xy��f0*�1-�����7�\�bb0���,Za<�]"X܃��2��X���5ϵ
D��`B)��l�]�����U��gϾ�b��=r#�ܰݷb�P�r��Fj��Ĵb��J��	`�V
&�1y�������DH=ġ�x/Ă'O̊E�0¸�
��o�𔑴��CR&fɁ
��:e�4�P3� 0^)�new�q�dO��[�M9m�&���׫���P��|Qy5F��6��F�(�C���
r�e%���.5��0����<ǨJ\R���7B��r*�f�e���	��(���C�wp���<W��^��|�2�(��]�!(��d��kQC`b��Q���*���ر{��~�3*2ra!X�u1s$ p�>s����w����AmX"�R+~J���i=��"+�T�M�h
��+QPylX-���K M"��跄K���^8%28}����<�"�&C���(A����ht��]|���[�Q���'�m�ɼ�(e�vmF��T�lfv\t�7���b�=s�+�lT-��<V�dn�)�-�TV��w+�N��]I���jpZ�6E��T��t��z���:*i����FWǙ��m���nd��-�fL���1���i�hʐ�Q��L
�$�ǵ�PE�\�/Z=���JG��x4,
� �Ş���	�(�v��V�'B�:��yN���AL�T��������=u蘼���G�g.4;���:Ā�
[�#;[ֽ':ӧ���e���{��VFR؈Nu�/�n3�*�?��Ѕ
�@�qa�	6S�O�@�q�2u�^���p��/�}$����j� �7�\u�]_���#��C�	���/��q����tZ�"c�Mݘ���F϶x�����-�Qߚ��ޚ$�����	����CS�b�ZְT�4b�����ġ��u7�~�ew%��淹�li*�qΩ5b��f�[�7@t�<�L�\L���ī7fB�Oܓ����u��=��!t�ķ�Y�b�wo�]G
7�2S��8��I�:�(���?PK�yVSP�h�[$pip/_internal/distributions/wheel.pyuS���0��+�9�R���	!H{��Ɲ�H�������I�ݖ�����{�{~�`4�j��iԈ�/�wQ��:�L�����@E�oP㘂C���L+H�j1Ҋ���	v�y�q��8M^���O�a�Tr�x F��+�,@~�d���u�>Kq�L���.�q�>}TEQtc�ܼg+o)�Ι�t:}�1P$�25�U�^M�)���H�:b��xL����&P�v��%�H��΅SS����$��l_��o�Y&a��QG�+�fm�=U1���/��̭!O���k���a���p���D��ڇ�#��I4b�������l=ISҬ���6����5�~'#�T���SHh�쬨�Ϛ�/T��20���IB:�t�.*�����|�Ni��N�\�߾��0bU��`�I�-�vm�װ������N���Do�_gh���c��;z��(��PK�yVSC?K� pip/_internal/index/__init__.pySRR��KI�P��+I-JL.���SH�OI�RRR�PK�yVS�I��~D pip/_internal/index/collector.py�[�s�v�_��g�J�L'۹�Z�f��nvf����̓�a�S�B��u�{��{> ){�<�noV����s~�`�$'W%���Į�w�(�W��FluޖJ��F�H�}(��]�*kt�f�iit[g�L��IO��N׍�օ��#]�h�V@D��AѨ:zP����?��}j�,�ҝ�M�Y�~o�i���m���V*}S����+�|���V�]C��WY�L��9����D�߅,KyW�}{lw�>��O?�
>�A�?�QnU~����v(Y�K���o�T���dzŒ�]�|PU�k�ٖͦ��΄ݫuR0n����@	��T=f��
&5��M]�z&./?Ч����6F������3U���#sn�4i	s�mO5J��fi2�󺻤g��hlf��Tc�7�c���'OMj����ea�r��idӚ��4!]�)?�0Kd�x�������dn�N��De��N��f�S��1�_>Z}��V�/�ʋ\6ʼ��?�5,�b��a3q�en
��-R�b�L3]��=�,��{��~��kd0t��������Um`|l7צ�nNNNr�˭l@�#P��L`�s1g���n�dH�>h}/@W�����*�sJ�������ېG�UTL�	����j� U�^Qi����_\�'�"�jj�d��h�i�� �i
��/�̈́�N(�\��r�n�\��<���_M|�O�'�-�-+�1b��nP3�7�H�L��
�)��rbT����U�aK��.f�+�u��:fL���xj!��Ĵ�+��@�@�5Ҁ��WU��VK��
�jR[�ͽ��q��ب�t���]!3L�B ѥ�1
�����z#n��o-`ܮm�@�g�؜#�1�z�p�̍A��$!���Pa5���Y�N��
ɭuX�+вaŞnU�����������1�8�ވ�����<T�%�,!�o^�0�*��<#������Prj����O�/����!�;'����$�lf�3���ں�0�I�ٕE���ʷ��w�)�4�����Ag��;�ֱj �!y�i	(��E
��,��V�XH�f�3ǩ�@��g��3�i�N�᭕@��wo�
�%�h����d4e
̓(��4�R�<�T��0QB41��̮�
ݚ� ��^��6�#�@WEM�t���=M���!��.r��}Uj�c*E)k�f��D�An��LV��;�R�mQ��cvۢq@e��R�:kZ�A��Eo� �
X>����_��I��|��s*���[	%�+���XU�j#�k�ʘ#Ŗ���3�	f8d3��a������qa���(��]��$�TӠ��/L2��������3��/�/>E��k��\�,r*~���e#��"Wy�v�d��L'���@.(���HKu��d���h��֪��5"��f#��f�P��ş���*�'�e	�
��zK�9�����:�|�]���t��Aj�߿�Z�[Hh{�{�@
�qw�7�[�q��j�h#v�z��h��!�Ll �> r��;��
��=�����3���k��}N�ψތ�m�c�G�4�$Z����^_J�]��	O�-�����U����P�I��{Lmi��4 ��l#�5���r�������eyԺ��:kP �R�6�a�0��ltUz�5���D��7�-��SptX���]–a�a'�G����:��\�.��5պD��J,�3|>�
l��ۧ��}ī;
��	t��o�zH_rC1̒0�-g]6��N*��8�ޑKK��	+L�D�R�;��L��ixq�x�D���*��*���j�-'H�1�<��f����q���䪡Gl�kE�>�P�8��0�PU�1����tb���[�>QJ~�b(�o�����
�
Jg�� $�G��L'9�<��Dr��b9[�
:I؉�1ɛ�܂�0_���JLj��䟮��ڒ�����\g-m.�n��\�2*���٢P&��@����j��6���oo����V4r�BD�Ҹ`��) ݃T���l�%A�,	���
��d{�6���"����J�d�d�-;ʬr��$5�A���!�ә盛	����m1��n̜Ȝ�%:ɿ��݃���	�){������a~��ؘn\�ܖ�:no]��7��ަ!���6^�Cu�&�%����!f����cX���4�b|�DP�!�
ƽ���̼�w1��K,ʖXL�?� �1N'8.!����)xjvsT�Q�N�M0�֐-���C9\[��8Å�4�RL3fحs��n�j�Yy�2*$�I\[�R���4�b���d���B��$B�*�5g�9ecP��L����m(��3���ץ�3\�W����>��ٶXo�{���5�jQB���nSd>�ot[�–kv
�S�-�Ѧf�l�ǧ��`�x�`s���b��C����A	��}��H��k�8.<�W�^��zeK��7���ޡ�ӷ#N�����0U?�|IQ�R;,��v��\2���_�z;�2+}��ǟ~~s���t�x'��\�����gwZ���U
�7�F�j3 ܅p6(s`c�D#Ui��s"G��K�=*�:j�Y���DujtW�ar�PБl~���o� $)5Z��a��Omk�n0j*���j�3ZF�9�7��7��7븧�O=&�p0�EE8�R�:��fړ�[ ��dѓN��ʴ�� ]+�"z�(��$�L ���ūb!��"^(P�a�5NG�$�M���FK۔x•��=xG:(����;�GX��G��|�x|	��3��nj
b,��0�Rf r�%/^�2�S|���z�3� �� ��\���Z�X�2O�[���n��@\�R��N����爤�E��=u��[�(KvJ9S��S��c�(J��5r�^L@n����~0�U#���х3')ӷ�B?����-߈�"�6=��K[�-���)�߂fwx��l��!�)�����8q���;?r��}�M�e��R]A��P���]ZP`�&�Q����{$|�c��Lh��c|����`9��[`$W�[��ѳ�cw�u�	��ٟ����SY�����p�#�x@�:�h���� �AeH���Y�[�a�<,<�ݐ��E��u7B�!C����$x(��ƶ�<z����E�������!�Ttҽ������	���9 �bAcO�%��~A�Os��~��V�?�=l#V`)4cFMs�1�CX�^J`Y0e�$\~#��2@+N ��8f�tv��v�]E�n�Ê_Us�����_@a{��Vxd0�O�c�|I%��k�rNNV@�*�*�.���5@���d~-�\�C�ܫD���(n��m��D��HݢnQn�q���2���CЇo�-���[�d+
D��o굷�%E��q�dȎr��D9�q	?MVU�)�%g����^���Q�[���V����'��#[�Ss\���4���VȢ�_���龖�58�x�P�2��Nb�M���	���wI����"`Ѳx:�Բ2X�&#���}�Fbdv���j���rP�����v�L����b,�c
vSl�y&9�(ǧL.-� r��q��k\N;lՠԡ�n����x�����w�Y$�g�1��A�.br<�-��ś0�r�G�(�=wڞ�}�n@�8���R�-�ٺ��0N:���u����h,�Vלg���H�$�?���{��D׵�K����v��(�����s�Mgn���u�v(��x�����G�a�/�E�W�(:e#$���S:*��RwQ)�ً�5`;��dG�ڈXC���|����OBFN��$؀�0�G%d�x`?�9���:{L�|?����>�x�؁OE�4��on`g��&+��	������ݯ�W�\�l�-b����ę0��%Lf����´�Qx���4rYl����&b�����Ů��s'�J��A�gu��q�0��b��G��u���,@Hwc�k�����+���c����À�,�]$��R��n*��!;���B��4t��\�zm�I^��^vfb�
���S�7��o\��Ÿ�K)��?���v���^ݑ��YHw�3v��W��� x�Y�e����T.�����ƚ����L=�i�VI�H���E�sH]�}*�$�<x�j�0
�,��sn=r58�i�{���^�p����ܒ����OwQj��L({Ԇ�0ia`�gZ��S�tp*d�c6X��^��d�6���m)���BNSۀ�g�
S��
s#$� �{|��<L�\��ݜ'��Ȃz��H:�'g�&V�;�t*8���^��[NMpvS��r>�KnT��C�o&~!�/��w7�Bx�ޖ�r��dHbbw��W��ﶅ�"��0�h�A�1��?�L�^?�ƅ�����n��n�X�]���:���*��=�5��0.��B�K8���d���"�^p�M;'�K��E ��b&�*�*[���)E��X�S�_�*$O��s|ڦ%<��j1�_�#�]%��-N��O0�s2��U�U�m��x����Ͷ��x�1���ea����Q�a�^S��}i�{'�zS���/1��d]GMm�zÇW�@1�~~��!z��^1vE��9w�ܽ9�
{�W��u��
���[���{����W��RT��8���A-Fo�~�
X!��Zm_R<����^皇/r-�����[DT�9��7mm#���[��&H���4_�͗��-�`�^��YVzI��D��M&>�'�*�2��
{���`�_m�s�u��Mг�J�q���\�~�m>�s0P��xE��[����4�U�e7!L�����.��7Ƿ0����(��S���I�f����]o2f�Ɗ*��4&5��Œ�������B{�ԟ�Ta��÷nl�z�� ������=3����%���>Ύlo�}�ȱg��y���x�^>9���a~y�Z��.��B4�/�=v���wwG��Ƚs������'Zνs�Ѯ���o�+�c�#q����#b`�J]\�l�Q��w�v��C���+:
z�t�,u/��]�Ù�뫝��TCw�S�C�Wd
�/�� &B"@�p/�B��/�D�u��6��=
���_�z|�k�plӋ��é�w�R	�����Ҩ/Q�o[�p�z�*K���㉘�A.622vh��Ř	 �:?���$EGo�>P��t�:#������>�����;��1o*l��o�!��ÿ{󟿼�(�(��z��*�'����ŷ
(v�.�
�>��t@�?��`>�O��{ͻ��|—�i��w�3�H̠#[Lp��6���J|
��yO�Ĉ�8��$�Uٴ�y	Tg���:��w ��ѐN��#�?PK�yVS��W_"��%pip/_internal/index/package_finder.py�=k��Fr�W�Q�x��$;W�1�Y��T��*K>�jO���p�	�P��J�=��7 WRRW�l��]`������_ӘL&?6�����ܖ�\���o�?���^�wRM&���;��F�u��6�U}%��n'�N�Msخĥ���-t/�a��b�T�E�ݡ�9����o�Bum��Λ}W5u�]<.�J��U�}�vк^vM�U�A��6x�m��
�g+��m�����O�ͯ�~!��x�˭���������~y�㻟jxxƠ��>/��zմ��\�)�<�j/�պ��i�w�2=^�WcMa	�����Z���WY��N��|H֦o�]��_��-���VIQ*���o}R�b�(��wKIԳ�fg~����?ض�\�<�UWn�r5��W����7�Z�yR��ɮ~�H�}\m%Ι�T����vv6M�D��/�;%0Nk{Z�o��3=�-<T) �f%�*ꯪ�EO�D���#�M�+�b��]�l-3�Ӈ�p�7���?�Tɲ]n
�l����>�4���V���?�����R�Q�+�+���n�8�%=|N�F�^�j�>���ƭ�%Z��/�
D
ȞT�Gy��d�����p�5�Hi���=zZ<�ϗ���x�óលRm\�?�_í��2͑i�q�Ҵ�<T�UQ�n�,�{�d�r#�o����j
�?����������A^�to��ߋ�)�e�9;+
X��q1	��d&&(;��Q�ö���i.�1R���:;;��R��YA"�(�gg�!�@��{�$�/��+-�/�>�^���^�0��7��k��Uwv`+lE�Vr-
&8���,(�͜�6�8-l���f�B����ꦕ1̹���0�#�8��ͩ���Z���㸥3���SA�N�<Px�ÒUpZ��ۈ�0���ހ�;N�����v"��E3z �>�pV�Y�tP�������-.��ٕo��]U��mc�݄ț��
�g3�F7��z3���LD��N}���4�ڛ�V��#�"�
3��0F��-|�.�?\�)�Ƈ����}a�8LyO�+yy�
�<A��,��"��Ⱦh������P��-������8٣�Z�Mt�"Py�O����}�|�l:
��i�	�zt����Y�=Q��0�`묪5����S<*0(/A�hV��	�&pHh��e	�5���BS�L�.� ��q~<�1���i�Oz�sҳ|�`�g�m���G��KP�g��T{Pui#ʒ��tI���%��]�<l�V����E9�@��F�NNk�(����Mvq���_�-���{�|�o��N4�w�
J��^n+P�kQ�Vܔ� 7�9%��Zz��ەo�P`n	Y.7`Ml��;
�L�Se
�?	�p-t�!�*���	���jP���#��ܕ��|��V��Z~8<�+���7���۽��

�K-�j0G�gҡ
���±��k�š�
�u�^Yk*��uu5w��j�A�����5�׃�c�n�p�Z6񬩵�CG8��d�aG�ѧ^8e��ayZ��Ҷ��dEP
|�ǝc������ƻZ��C��0�B��C�� r��:JX�.ؓ�^ܽ�경�+��]�ڥ��/x	LTu=�ED�����������!�v�=իm��h�����j�[�]�#7A��X��A��A}-�[���(=�c����U�5�'��]��

�a�L�����+�my�����J�Wef��?���S��	��=��u���\��=�k���ؖ��G���X*�-J ��9����p�+:�jJi/�]�i��%q+��,�+6{؜��|��E����%H�*\KS���Y*�F�k��נ���E6�5O�]�'8
ʼ��E�HQ�P4��<�Zb�~�6�caI�>�0,Mї����̞#zӳ(�3ij�H�FB�	i2��{�2`�H{�ꍉ�cS�Kɕ�;�笕��ĆR�ʮ�9�s-�)��K���k!��#���
5��x�C�^���H$d���u�ߜMKVTh���k�-����>fU�{�r3b}��N�Gn��)}���_Du�>k�[�Qxԟ[�!���`lm�};�z���陯'zd\D0�FQ�q�[��o�1X�-Æ�:��{�F>ę�E���Y��}�&���$�'= 8k�I��Q���yv�,a����A'�)L�ȡA� ,b�]
��gp� �
D�;bp���hWn֓/�֓�П��\6��{ğ
�c>��j?9�:�N��)�\��3v�f��Q4���ކ�?
=��q/�f�I$�Z/:�Q��P�Y$��!4\�
H3�Ĥ�����m� 17�	�����-RG^����,I
Đ'o�e!�iz�w`�ؚDM @�xU�Is'���
Tb�H�'�i�N��"g�)O��6$��ङ�8
�>A�`�����o��f���^z���0��=�������GL��C��3���`���lz���~�i��N^^�3
�=䢽����Ѫ;�m�`��&�L�io$������s����
�#��7G$�]�5�q��m�a���H�3M�!�c��%�`�<!�{��ݗ	���N��#�_`*O��?}`Ŗ+�7��Pf�I�7u����b��rК[Pe^��PЃ�]�ڃJ�^�ߤ�kq���L�vl[ ��jI��DGCC��<��H�U�[��p�O�c�hb!��P���d��HIVJ�`c��zS� ��R��c<�Cy����3`3�e��vfB˟g�l(���!
&_q��׫�00/��K�)��"�>�=��q�#�,��$�tX�{L���N��
�S:`
'��5�l	�)����ḡ��C��&�5&����C�ӳq��O����f���(���6KVl2���:���İVtN3��?`��Ji��v�8A�=i>����w�dѓ�!H�1>�.�Z[�p4��t�BӞ�*Zxi�%@�s�E���s]�^S�~F��ۭ�CՔVR �2Y��ٍM�zcȩ9�K)k�@gy%��jHNg�:4pP��;5hR�& �G�"�����WRU�^�iO��Fo��}���ה�ʆ�a�{�s~��#eo��Բl�;��#x֔u�^N×�NI�;�/6Bs-��q��]��vܬ��d���p�3@ѴE���J*�\�yG�d(��Źa
����݃���:�*L+�K��=C^ꔿ��C)�p�(�)>^�؄$�.�R9��z�!l[h���/����q�r!�8V���%�E��Q<T10׫�2Ҋ��H1|�a�p�s���)pg}�?�������d�P�)����p�[��9������JLe���>��V�_�۫�JF�u�]��gm����iP�@i�4y�2�: �l\�k�����z��� ��s�RZ �H9�b֛��?�R��I�C��:��
/�`��j��(&��^�{u��IH��\ۻ.DbN�'(8���УDs�tRQ��3��m�8%�4bG5��AsmO5>-<΋lQR�Źi�v��-�i�E��k@��x��M$�Y��	�hTz���p�tx��k���$�A��ς�_�T��+E$�d7%�l����yo�ѳs�d4R6}-v@�f�Ls+S�C�K�c/n�7���?�x#��<�9�r�-�K��W�-�-��l�(뇎����{�#�x��s׀dMhތ�M� ܄?���DŽs��1�>Q��$^�]���T|�����U�N"�ՃP�&5ȈV��ƣ���]^$�����\��!"��n{��I�'N5�<F�d�^Ԗ,��9\m"+�WTU8^�d�c��y��y�4�O�S�ޒG�@�tM�s�;;�<�h�S�'��N��,�$]�����[uR�W� de����\1��y�C�l[/����bZ�M���c�C�+���b��zN�zH�eb���#|�,+���W=Y��0c%�Lg�`pć�h��
6�%�1v�aI~~���n�CMvw��r<�r4de��!�f���������v_�������>�fV��0T�|Oِ:�ާ�zN���k|�g����4
Ƚ^��d}׸�}F=c 4�|)�H[:�៳�\����ɉE�W�0)+ɧa��ѳ2?1!6��V�KRn
���I�y��;��ƓE)�	}����<rY(:�ɬ,��w�,�е��LM�E�j�&���O0�t��/��q+,n;�0�L��M/�!x๨^TH5$5]�4�;�2n�E"t.��
�vմ�ls�Fy�X(�/OC��4f����qt�I��Z�UED�h��_��a!�G2�j.��;֐V�ff��>�Hًs6l�n��HL�t�Ÿ<-�3��
���e2���wG�DajR�z�w���@��,=닷M���6Zl��2�mc������m�
ƅ~KY
Lκ@?
�8�P�D��BR�GH��t#�Ԅ�(ZŮ_�B�+�p2Fw��z��63R�*%S�z��s}	��T�7WE+u��sE��Q	pt'Wg�_�78-@)�D�����f�B�ܔ�Uj6�&����k�˄��Q���K�g�!LL�`��h��BV�F�Q:�z�L�IP�w6��.�0�9��Qj=��?@��i��^�%��YI�>)V��	�q��a�ej�F�S�l�z�P3>�Ag�h���$���埱�Q�E��)i��uVřy�Ӛ�7�F����{�NZ��\I�M=q�9-�c�
��c��|
&�Ձ�}�8”
����n�%�Q�^�cҳ6���̹���p\��V��8]���
���-�U8�5ۊҼ�x���VFAx��A�"�J;1�"jv�%*��3H���qƑ@s�%]xG4�)�
�fp(��3��<�.
d�����v.4�+ʰ��ǹ$�4�.y�.����9b�m����F�^/��W}�M,��RW�z�4���4���H��BY<�O�ފ>�3*|8�����аʚ�l��~�D_=L�`��Rn���s�"(I|Ӛv�q�\gh��۪��l��[�~[�0��P�}���\gJ��{��&4 �a(,�csx4"m�K�]�|��dz�S��x�[l|Op�\UK�t�fO�|���ͬ8���r��
�L.����&
M���B��9,%�TI�Jr^�9���Y���]_�"\փ��~��}��l�s�?GS*L��\���zJ[�*�L��|# y�,/�{�΃���S�5gcY�?_:|��4�3$�m�&�B�nq�����?��+5���;�K�ph��
:j7��>�#���_n��.i�b��$S�w?��C[F63�	����2�_�v�_��V_N��w��Nf1��L쫂�}U����'�P[�9�e1��{�����,��ѝ�3�n���mx�3�|=�F��%_��U��U�~�]���)��a�!k�x��2|���C�@���x��I:op�l�#�.��S����g,�]�)6��ߵ�S�H�\��)mY�xl��ʫ�9�l�b���]v���_">����tyh�~~��D��vq"��&h����(O@R=���!1�!{7
B��b�x.�?�����A^�M�!��v[B��9��Nj{��Y��B��xOK.7u��A�,Ն‰�;�0 g�`��!{|B��5GB�
H \��oP<=�BW7l��yTa�6��!a
A/�N뇌�pa?�c*����W+�,�m��E؁JF�]�K�>x�с�)goY`��89��'U?rS�AX}Q�Wg<"�몌>��m.ꪍ&�p�,tO��L�f|�Ņ;J}��X<�י2�	��S�R����qݸ�"����i�ꗋ� ,F��P�eDM��t�۔��0��D�?�pE(�{� j}�2G�^ɔ������b�f)�+{@�̗�4�q,��rq�9Ž@�Jp����bz�>I��#*�:O�b���&N
j�3���ڞl�a�2�P�D�g�S!�P^��דX���>{����?$�#s�Od�V6��>%�%p$���hR���~%I��៳a�.��Re�40�؋�?���u_�zU7q��.,Tye��XiL��l5��%q�
��kR;�^U���j���P�#x�u:(�u<��$�գ(�1�è7y�`��N�.��:m��� ���:�'��d���Й�i@�N�1��i�!�-�������>(-W`��Xa«u��΂�ꤨq��z�=�G"%-�<���K��I��to���㏚[t'ǟ��S�眹9 pT���L��(jV������U�l�tiWb.�^�WG;Au�,�J~T2j8�"�3u����w�KH���,��>k��Q!���\s�F+N��pb���*!��*y��6�I͜ѵP�|�/Zb�~&���9z
V��r[�}ɮ^�3�__�qP
G)��=3ע��S�����:`�	R�'����D=|���E����Ԡ��b.%�a���M�tw�S����<����+1�:3N.���G��
 }G<�x1�*�wI7Y��$�����|A_�N���YX��"f�`;Q���m?Q
ª$/p��fNj�� 	#¤��?G�,iq�k��S^��xJ4��Qђ'kG��j�6
�0�ș[�k�����r����u5���$���K�U��)X�n�hEo	C��z�е>��~h'�cI��2��'l�,@��K���lqb�)L�;��:9���)�'Fu޼$��k�1�0��	~_�{5&�:�Z�#L���-%|_�x��K�(E�1V|A�U�f	���|+"^f��+�%)��X�T9SY�@\��ͯ�C��䀇u�d˦ہ��e(�f�M-2T 5���GS��˃���@�"���������>,�E<�C(�eh�Z���|���w�)Hhc�~�-߶��Ff���~�ս�����-����	�wF���������u��QyV:G��Y���^+��A�*����H 7��2�U��I�+�Qf����o*�n����r�����,��s“7|&�~`?��L����4�p1F�Ѕc4�dG���2cI��|7���F�׊���>��P�;̗���sB���b�.�'��d��(�ܘ���@c:�-*
�Κ�̌�r",��<��M>��?�~6ɘ�c#w���	UG�#r���4����'g��H��cئ��W����~��TK���Ft~t�{�O�eKJ9�/�ywW"0a���z��7G�$�)��Ұ�1w�掔���Ei{���~��
��˘O#ϕsvɾ���+��KuRe�����Y��xmd)��)�#�#�1�F��-]]adk�cyJd�$��-o����FtZ�?�K�#=̯K�����.�٫���?d�������$)�ϒ�F���'�Y�č
��Ɗ-|4��b��\�r'�����*��'�,;��U[�$��}��e{��z=i��2���ѻ=�����=|��5J���HI�M�Х�8���k���.��'�1Ck�[Ή��>{��0�y܌�}�C���o}{�[�u,�O��lcF�%c@|��Lx��F5O%H�-�k+�;��(k����ڰ�
�7�~��(X���w����)�CcFdю"e{~���
���NJZ+�x�B����S<�SgJ��Rry�֦Ļ��u/�]��ɨ���;����+���w��'/f��}{��G��w��~�J9�釾5k~�N@�V��n�~d	���e
�>k����/��͉%(�EMP�!��37=ANڛ��6�C�P���_��5�IF�f�	Z+��LQ���6YZ���v����������	"<k���h�S��#@:44!�ꂛO΍.*.f�Tzi�ӏ���X7�׉�y����J�("7�3��K���]G�?<��\Z�Gѕ_�׫G΀�8���9����{���=��po��f�m�d�3�1������B���ş4�#L22w�=���g��޷��L��)w�,��㤟<9���}��e'��V�������$�F�с�~@&\U�PdzV�k�5��f~
K|�i�qw���¨���(��l�Y��rVծ�2Y�|�
f�q��P�N�p�����Uޗ�����ܵ�<��.�~����[�1711-'X�F�»'��6���zy1�pf*�8�Rٺc~�؊���j$K�Z�ߟn'4.`j�\���oO�?��)��tП
��J�~���Ew�MS�e{~?�w׶襸a�sh�a�x�����,<�{G<��r�����it����ocᑌ�uo��raeZ�\Z����6R���Db�cjT�k�qUg�;�Zhxd��u�J�j&%���PG�k-�2Kf��k�C�A�?59�>�h�������}	!b��9Q�9��Jd��{��D�
�>K_e�0�űC�[+"����$��+��mt�����&O���i��G����U~��pH�m�u�Us�-O��L-L	�=��{��}-n�
ŗ�f�HU������-�h�9�2�������
PK�yVS�+����pip/_internal/index/sources.py�Xmo�6��_Ax*����\��̀�Y�/�!�m�E������7�J�8I�
G"��I�/��L��V�@�Ͻ�s{,��T�V�v'�:�h�g@\����J��%���r��~/�PE*#vu(%_)�8P�T�W9�&��"yjy-o^�"Q‡z�R75�އHV�AK�:%V%01��w��6a�#�s\�Y��x����$)�=O�q\�C�76 �]t=h��q�1,�V��)�r���툢/����T��C�J�e�L�!���:�Ӏ��S�Uɵ=�W�7.7c6yׄ�Is<��F�Kn�0��83��G�#䏘���oS���aթ0�}Tv��d�s�K���J���Z��J�d2�B� xub�A2�>� mP��`��v▃���ЯW�-�F�3�C�-�kF���r�o�1%�Ć<U�cX.4Ϭ<>^��H }wv/�&$� ���XM
a�*�B�"B�=pc|o�"���]����K6����w�;\e��Pri�3���eS�&�حY��
VvNNX�&��(�	�p�#��Ī	8��j;?_턁�T7.�2(�(�*����6�,��[X��A�Ք�P`�A
U0�f�6�(|�q#�|��z_o�#�dK�#l��Mp1i�櫕� ^%����Dˁ�@�!
�G(���B�I��q�
@Yu������;�<���ϸ*�s���M�9��#�!����Є��ʸ�k���ڜ.!�X�l�Ԁ�'��	*��&��˜Q�?"T<$��y=ßitcT����=�ؠ�$60�)��t:Y!�ù>a"�
Kٟ�h���RAw���X��0��{
��.vΡ-���a�+Jd�[�z"���ml���,\�^���@�
�)T1�Q�2�``�ү�>���J/�.���`� ����q�7C�C�V�ppR�Oׯ묺r/�^Y���b�z������ޣO��e��e�kB��;�o*�!����O��4����>�6�ND�����
kC��p��{�PC�B�b'OE�[��Hn-,��-{Z���زZ�21B�A�îH��y��
I[�ۜ0�!�ĝ�\%���������H>�]	�	������2��ْTG�z�����&��2���l��Z�;Iyz:��4��,��D�ڑ	k����}����$�7�>݆7�����܄�%���T[�Y�IlD{ؑ[�=|J��ޒ���*�;��*���(�Xw���-8�����l���|F�����ּA�-���|B���������Id��L��yuې1ٲ�q+�����?��!(��(�%��Ddϸ1�>%���]�u����
�g�P�̆#�ͯ����b���#Y4PF�ӡq4��!��ȵ��_
��ٓ��^��Դ��i�4t�tz�<�]�ev7����K��Sn�u��vό�#"�L�BEDŽ^�Z��g�����MFZ�/���q�R4Cw�0���ި��$Uې�DPK�yVSők��l8#pip/_internal/locations/__init__.py�;ks�Ƶ�+�p2{IВ\�քn[�u+KK��Q5H.ID ��$�������b� e�1���"�q��y?V�r�兘��ȲD��<�d�y�����N��b��c�U���q���x�3˳�(�+ ��a��w���B�Q��}q+�~�*�,����,W����x�q
ka*XfS��@Mr)
̋��>��<��/.h�koYİu�-u����黳O��O�*��13{̐�n�v�E%2�3��2M�a�NeV�YN��/�)�q��?�]}��w��46�E��~��p�����_M�|�f���*��C8ˣ����[Uq!�U4���R�P�w���vv�0J�0#qE�^��xx�8N���Q�u �N�����
\9
a\�&�\6ֲ��F,-�h��f���wvvP/dW�
���0:�!P(�����8�R\�{��yxr������"<=?~<
�N��/߾�zt�O��?:q�zw��w��"��V"���o�W�'��'��_�*s@'*��!�Ov7��dCGË/ޞ���[�k��Y&ތ�����a��T�D�d٭^��p���/^�|����aa�=ϻ\H�K�%%�V�	X=���>N1YD�\�b+��,���h;�BJ�(V�`8�s���H���a�T)	��J�I����EXF�4�SU�@�:>��<<9	ٺ\�M�<�dS2E���v��ɳ�R Xʕgy�W���5���*�?�(ϳ��ˢ�S�8��t8�8B����d�nD���l4�Ⳃ���9飰\7�W]��7/b�
��$j��.��XD�[�zխ�S�s	�&�o7�E��e�kq���/�4+L��L5�:O��ٜd���V[�ݴ���CfY�iS�����	I^�����A����,���\E�U�#\�}D.@)K�XK�?�}_dK�� ziԴ�]�:*PK)�4Y��h-��$J�e5.$�P$�C�sV�?J5�a�o�z�7l춓xۧ(FS�o�{�,�0�s�����2�u���q��{up�͋h:��g�!�`JK�
�8�{�F*�\z'J3!�l%]k~��o$KS�on�Hwnn1��D77Z��?�����;`�4@�:�����@y+�^D�4�	\���B�j%i���2�G�|���L!M��)�G�_	&F�bm��{)&��Š�@èL
�A��?�k��ACA�t-8�,��8�,p
z�_��.%;�Y�>��B��d9=��찆ị�^�,f1\�%�(�P~�,Wf�:$G3<�~�8
S����ߐ��/�5����WZ�%����x~�Y�?@ȶg�ޒ�0�)rDd���]��{	�^_08���7�+`77i«��(Z^8l�g�	b���1I�)�XЕ8���s�V"�=�esC�t�@6�#R?@x�i`�g��w_k�m��#���
��{�O0�
C���p�h*�V*��D	zH9	@�.!��{�����,��5%AIP>3��Op��<�|X�E ���;lmÖ/P}%�
�T�:�
��.kE.������k�cr͞�fZ�F'�ʉ�\��hϒh�N^��ݯl�h�|aM�:�h�?�wQ�{'�?�x9�Fڜӝ��Y�����<
�H�<R-+҆r�/�[��4G�"YК�9�&�D��^8`���vA��ĉoױL�l
�v�h�\��ݪ�,�W`<9e����Om���Q��B���ep�B�b�����G���@���@$2�nԻn\	W>���b�ESK���,���K�9��T�7���GQ%i AC���y_X�	 ��p7,�螆��*��'�j��|�����()P����QRJ�䗪#�6�d��e�(Y�����M�(����ڌՀj��+���}��I$�W��Q˪(7�Y��J�V�K�c�v�ms��V:� �����K�$�8GkQȇ�9���@u@�	���V����y���كoZ�@R4[#>V�F�@W�hц
_�� ��DD[�&���w�!�=/�	<2[�^������9}}m#LU�i�BM�.��?���,�v���pU��2�a����ݭ"3^mD4�Cx��R�Ȉ�WYZ���|����[��e�z�jp
f2��S7�������Zҏk�({v��m�v����>���M��Ua
e�j6>=�����?�uχ��i)�
Ϝh�C�t�>�ȘC-Au~L/�l��ɛ ǿ�fJl �U<�woG�W�1^�|L�pCt�|-��:���պ
qqA�u�)!{������;�L<���sø(��Z��h�j8���^��{X@�6^��C��8JB��]K� 40�k���t,i�n�����h cvǨ���#��Z���r8݊���a1�@N
֓�m�pֱ�U��r�M���Ӛ5�4��:T*A�1��HD��INp,�z!L�a0�bi5�NZ�hA����3���,`o��<�����.�k0�F����ES��W�._��Řf��o��$P_�-���<M|�ǥ�-��q)9KM}����w��=cM��+���4V�
��=7��ԔRӵq.�t5���K%�Ϻ�����kj���b,�8V�����<B��:���n�.5�V�T5ʘJ�B[f[3D�q��1�v��q��g�iԝ���1�D����N��E�7ms�U���ܦ��f9=I���^��Oܢv��R�
r���Z���Q��0��M�qv��a�r.�Z���=$Q����e�Z\`A�bG��9�zr+�"+!�dw(�ECTn]��n*��>�7H)yY�aN2�Ӧ�~o�[-���5
��w���ބ�k@!5o����!\�Z締}-��R�ػf	܀������4k���F�<��q&�<�1����-O_+#��g���>����@�
����=�C��]q^�@|M��UGԴ����θ媉�=�+�:������z5����ڼ���|�W�+V��i1��R/�:��L�]"��DD�N���T��;b���Y����c�u�hwu,�������A%����&W��+$�]v�M�x%��82U�+|���Ȣ�)X;�WP{�6)���|B���&��GV��Uc	8�ڍ%�x��F̂ڌT�ϥ�R���p��L7���l<|5��}�bw:�fÓx<�j����ݯ^
N`��
�SA������J�\��#,�V5ւo4�|�&25��f"�f��f��ʏ/Jt+���_<S2��&�Vi@��[r�����c����x�XV-�8�<�r���3beN3����a
 ���zL!2�,�a�J���(V6�|&ܧ���a)��eN7��V��~��:S��T�.�K�z������QD� �k�΢t�;�_ݒ{oT�:ON�Q����*KG�A����9�we����i���-�68`Y�Ce��צ)�/f%���3���.��s�$��\�cC�}asڇ(�:��P���:^] �.�d����4=��^��ۭ��T�0�A��l~�0�Cc��E�3e5W�ji�UGE���2�~�cp�U7�n&t�t�E�j��W��ZW���:UY�[/��j/r�ڶd_�����o)����:��Jt'�V[�V�8�~���=-&��%v��F��vj Y��k�����vpG��ue���`_�T6�j�y���5��0BXpx~9�{�Y��������]{sSѾ�ր]$US��W+���+�WB��[�H���tJ`BV�`�AL��^fk U���e���*xcN4hh��L)躹q������߅\c��e@�M��M�
S}��O@|!�ˠ�����:{��F,�6�($��^����bX�>Z�rM*��<%0/CtH�%��c��,/��r5�=f���&)^u\[`+E1�zB���#	+'�v��Q,k�Wq暝�ƞ�ؙ6��QL45����a�lR�t3�S�ϣ>�״����S8`N�}8Ђ�����>���\%1Gw���w{�	ǿYr5�#\���R?ԉ�!����E�h�k_��^�Կ�׮`����f�yq�jP�g����2q����,>W���m�ֳ"�'�F�!q�h�I����+��$�bʦX�鍨�)g]kX�4f��!Ᏻ��!yè���Q�O���o`���ۤ7[��:{�\��PK�yVS�ڝ{�%pip/_internal/locations/_distutils.py�Xkoۼ��_A("g��b�>x�ͻ�Z`��A �m��E���xA��������!��s�9����^��JU��-�^�R�g�R��ZɵI����eɌmV��	�GQ4�\�OʲT{Y�A�݊�2�QMY��`Zl�N�cQm��ľ��%��6Z��=ԇ9�k��[U�>�\��K#&�����j��!�2�9��J�-+$�4i�-X�}�x
{�.����	o�z����ow�z�I��gv�YX����
��V�Zج>؍��R.=�=���@��J�=D$�cpZ�>5u)��
�	˹��\�:�VhХ[U:6�ĥ5ս�#���@����w??\&�Im^�jײ親`A�T��Y�TL�܈������VV����Ʉ2Ah�hS"�[����[�e��dR�����x��G����\��#�-�*!�e�_ߨ@���
�Z){�*�*��99�+�r�sX�0Qd>��,�9�2e�t1$�I����R-��?�b���/\�!�Q��S�XT���:ww�z
�z
\��GJBzzzz�¯97�����\�.r#я�ɵ��KDr���J�Rhn��:z
�`k�b܉���Tʞuiw�Շ��	Mk�͘<�v$�%�%�s�;A��Vz,�x����
%�ף�˦�ɪ8�P��ܨ*	C�ml-�s�8p���v�8}��{����ўˁ��g�(�	��j���
f��ԤQr*)aQ��+��®�)�q�ͫI�3e:f��U˯���!�)�JK�A�P4�Z�,�.9�h��n��
��:V��щ�F�_����+���;����<B9�`��詡Y�[�Z�'��2DL{���:H�������h41"���mB^1�C�v}]8l�,ʜ�%�Ʃ�jR�RC�L:ty$v�P�� 5M�*���+������[t"�w$������s�/�B[�C�E&S/lQ+�[	N�N����ۥ��GP�=���)���	~�y`�>�e�`Z�� ��F�rku,Q;m�E�$!ȿjӁZ?3���JS 	��)а��Z��h���77��uc],S�2i���%x'���Q*�a5�1:��/�F>be�2���T!ӡb��^�ܐ^���h��u��RU��9�@�FGkd&s*"�T(]\��/u)si��ſa,���_+*�%ϟ�75Y�D�@݈�����he=zL��6u4�Yp�b䁤��xy�.
<��4��������R������ĽD��R���w��Q��7�3|sn�ށ�9c��B<j!���xm�����O�qtcF�"�F��{��GvÌ�RY��N,3�<���Ɨ�~��L��o�FR�3R*��f�4�~����f�!���5Z���L���f�=���V�ϫdP�Fަ���0����
ZVuc�&
;/&u�ήg{G������PG�*��+^��hz�;.K�,Epm�	7��f>�Ab��/Uz=��,~�n춼⥻�Xq;��>ns��04t*=�H@�5Њ�݀� k	�Ӄo*P4�(}��rH���gx�<���Г񊖼�i/^�O��<����>p+A�`�G;�J:/>>�g�+C��l����)jN��l�i�%��P@�~hrG�Z��@�	]�P��y{t��";����Ƶ2�W����lV��
0�
�L;Ա-���=�Iw��+m���AN�=��H\���ud��jC�y��+���Z,��S�m_�H���$$����K��ד��!	Z1��ݜ�q)���;���0��˗9{_1��i�a"4��w�v��y倃����l��s&	⌢q��F�&0�(�<�qW�R�i���m:��Ah���>��ʙv8n"�ײ�!x���^�e#�B=��]C�50�	�����O�.IE�
/H"�C��~�M�=�"d��	��E�< <�Ǭ1zV*�p2'�������"��+��N�&H�s�8�K�����Rs}�ݫ��99$~/)$(���*E�������
�7ض��ߣ��0gp�y��	{����mwj4?6:[
K��|��s���d"�_cR>w��<��?���$��(��ă[N���x��*�#ˏuoj��)���=�:��PK�yVS8�z
�%pip/_internal/locations/_sysconfig.py�Y]o�8}�� ԇس�����@�tӝ�d��i7�
��蘍,
��(��\��($��٠Ml�����s�h��Tݰ\�md�������_ϧ콪Y���Hk��d$�@���ey߽U�{�7��L��W5��dF�Z�X%�$�e#��x�D�HUj�_�����M�+�N��� f���/J��0����`W*PJ�����翞�����&f���ǣ����|���,�Fږ�����+�s�M��_U��d�ߏ��F�S���E�Wb��ш,*jvڙ6��l��%���d4�aT#4S%�Q8�lі��]�ǟ�vna,Ql�lFG�ł�E�Z;�'�<��G
O�<������c�k��G��
�k�a�b\?�sL�B>�������U-��9S�xX�Y{%��Rh<Z����kh��Z6K�K��8��4[/e!�2Ֆ
N���x~�T�-�
�l,r6߰wכf�J����I�)pβ1J�ł����z�r%,��-`U��G��Z[��l�3�������o�,�h�������������.ע{$r���O�������ҳ��b1o�z$"�a	� N)�B�K�R�E��Z��9��㿱�R�t��Eѻ��Vd��
�ì��P�����˫K��
&��r�6�;B{�˜]�R�O�P�%ז=��䅃3`�H��9x!ʩ����Ǚ?������ɥ�D#���:y����;���~w�3��fH;>�b�z��J���lQl�o�IL�|�ҎvQZ>�zm,�����k6s���΢ڦj�g|�����ef���N�G.>G�Y����)�A�������Z H31k�1�B�+��a�������[q��)5�6��f-D�A0�m�d��jѴ5�È�Z_��s���Ao�H��+J�d0.
,2�/
Ҫ�5��r�8��T��%� ��w�GȚ�V66õ�:E������Xq���'����=��ghtJ6�>�|��a!��]�t��D��Z�7��a�"��SÙ��a�곉�i���b��Bې%9s�a���UI��R�Ű���]�1)
�]o�7T?o��Zk6i7�&-��lr�8��ߋc�C	 �n�qdm�b�j%A��٢w W�*�^�@
���F�-Q��2������'�gXCwCv@n	*�SOFG���Ɲ��b]�A>Nq�T�`�D�l}C>M����������ސ�9����9^	~@�V����VΔ^�ߩ���i�e�<M�Y<Q��J�2�������}n�C����0��1�K��ּ��(j�f=�w��+2z�U��-��m�:LZb�D�~���y�i49L�ρ�1u�M�t.QT���x
Y`5p`��?�Z�w>���f�ሡU,,ͩ��3(�	�>����Hi��^=Cbh&�d��|��r��Κ�uΘch��l����d����{W��;�$���ed3a��ڗ�#�m0�I��4e
�;�U%�<\�4jF�z3�M�*�D$453��YB���8Swy�\�[^�A���1�2��y�2��"�};Yk�b�m�M<����
Dn�D'v�J�y0��s	�8%�F��S�IhZl�k*4��L��G�Q�|j�OVY��Kt�ا[W�f�h����LA+��zu�B����X��1�Gƺ�~3�hݠ�̀��Zd������8&��!@�8y_*L�f"DdUv��wx��
Zʹ,d�a�5���*f����F�nB���XK�l��/��=Q��9	O��e�!\huv�jS��Q��̆�@澬3�ƧF��� %��a���[�Е�8:>6��Yԍ�}e4	��5��PwR����bjP9\u�� b�}�w��}�|�n�Yr�ni�پ���ʚ�ba���Iq��N؍��\�2���5_.N4���f����w�wz��'?d���E�&H�4��=L���`*�/�{���0�[��>$�ݞ���V4����~� &}�<K.��&�Q >y=�
Y3vw\�2��Ih�zb<����6aײb�A���-A�@7��|m4 ��ѺC�����gv���8`
�P��>9�ݎ>����퇣��
�U�8���=����Ǫdu�Ez�+��P6�vB7�f+������|'c��z�Ӄ(�&����R�0�3���ӧ��8�o�	Oܐ�I{��.+�\D�r�]�O���Ҙ�����T����dPcJ�M�=�G��.�]�:u�MaF}$Rȩ;�{}��m-��m��u!������M� Wղjt�ކ�h�y��^w�|�3m���cr�����ņ@l�.�o	��{�1���/#�c�LPzwEl�#�k���Uw�e���2s�%��V�'�Bĝ@�臲V��يgW7����f��f���_��Zѵ,#[g<��o��s�ri��I�{E4<��^v_��^��h�e��q<CK�߇ӑ>�1���z�u�4�n���V��	"�'_�/�'S���3��G?�u�}0f�zl;\'��PK�yVS��Y�+pip/_internal/locations/base.py}Tێ9}�(�<�
3ή�a��@� ���� X!�r���n��L�����b�ė�S�NUYm�խ)���'�?���W��?Y���j9�}��2Ijg7ԨF�vFj��=
v�i*�vb�\h�f�]\k���T��}�\�M�hUʠ����1�p�}��n:/^ݼz;-^���W��,W\`��������S�,{�4�Ҷ�XG��E+�抂����;a�Y����w׃b�DbR��}��jb��a�c��DRqM�f#�[Wl��H����uB��4��Zg(��:��Ή'�uwU��1���+�JO2B��%�X��/�wJp���?Rq�q�?ŏ���,��HH�P�ڞ&�]Y4�k��wU?Z�,�M�w�r֋(��n��b��R�A�����}��5���F�P�Pu%5��2Hy,Qm
{M�=�58���G�����#F�����Jn���Yw�xA��&=��54�jh�=�P��A5�ܠ�IŚW���T��{�	�޶$���4����R�@ښ%���%{z]��`�쎞�Ʉ+1J�8۰�{p�Vofԋ���*�j�4��M��4]cN�L�8m�Q_��ݸŏ�v��}�z?�w��qc�!�����!�e��a�1z�2D����-GseTPR+�Ǭzn��<>�������7�h���wD�^���)r}yx��vm��e���_~��λ�S��~W�
;�����Ou��s�/��ī���o�7履g�wi�'�PK�yVSs�B|"pip/_internal/metadata/__init__.py��Ɏ�0��~
"�&@�`�=].].z���XY2$y���K�K�e0s�\S��(7�t�O��G�]o��o�-��4U�5aK~@G����0�]�����5�#��_�"wr���-���w�=M/�ee�J�%��]�[]���x"?��L�pb5�.^��˚�/�V5,?�d��,�X��]o���u��Qs��J|K0%��ޒ�ԡ16.��ZB��gQ�W+g��j�!1��G-"¨���G�u�ًuT���Z3��A��ZUq��}[U�[C�'xF���)�y��h)���Pc��J�|�E|���?K�� 7�]r�����4�OŬ7	�F8�+��ޅa�1��ELx
�4���<���l$q�Nܢ�VUo�
���]y-��/O��F#�9����j>y��n�&K!�vF�E�mJ�]:�x��=�Z�ȑ!�o
1�����W
�
�c����"P-�T�Ǝ
.�.h�o���O�L4ڼsM��<���.bH�^�x!2"�}y����ԍ�;WKK��n�.z��ݔ������ʽ58��\^b�j�iUӅb]��d�PK�yVS.���_+pip/_internal/metadata/base.py�ms۶��~N]��N����m�e�+���'�5�Q	I�)�@;j��=@�E:v��n��I�y��R��<�7L)�b#no��D�~�b����]�fя�\򜍖Rl�ޖ��ԏ������|_��|�<�f����ӗ��s��,�\�ДL��c�$]�̻Ң~��+m�����Ma�MF����qrÊLȸ��5E&b�Sq�6���{�޻k�*Yʗ��f�qqCs��v������	��<o��
�8?��n�]�n90�6�b+�n�ڛSR����$oD�rg�g��J桦��/f�/�7���������arzx2��=2��ȼs���������Ij�k��MI�êt��ER^�!_�˳��r"n�ؒa�5�,��V�$�ŵ����Np[���\
I4z�߉vÈ/C�=0�����Z�"�|�]�n�gD,~Y�FG`��/*d��<5&��_�W�z���v�x��+s/J�l%I��GiN�"����
-��x�
K��K)J&��\��	�˗��WP���#)W�Ro��ˌ�#@�
�������O�	�yW�#I$+e��a��Y�?��X�[#򟉽�]�g��\��~��G
�X�!!9�-x����x<����58�'�@�ˌeǣf�!��Vn��
�I�R���[B	�0���g�D�"
�`J�`>6"�I��$@��bB�kI��\�k~�TL��SQ�����a�P���Q0	‹�
����:� F<5A`�&��-�kK�|�,A����҆�
�&�yL��
<��Q�����yJ0M�-��&Z�63yc�/Y:�ѷ�
8�	-2+X����W�c��e\c~M�	��!�t	T�$K!��	x⿬�e��,�!��6�m
3�b���?ʸ�Z+MQ����>@�Bi
5�AK��~!�$d4�����S�4|�N1�U�M	Zh�o
,/�>#Ɨ�;���޺V�;�b��v��qM��^,�RX䁀��fK��Z�_3t5�D�SL�{&��%�����
��c��T!ϷTu e��Hf#�&Z��`C��AZw$�(����Ă��r���c��K8�`D��z��O�ֺT��+�˜}�d���>W�bj�wO��&C*�G77���0/�"i��>����+����ɟPEW{��I�g_�
ϩ�v?�;J��)F��%�L'Y��#�4U�� �wZj���,&�c��j-�<�,�Ć�-hj��_3 �C��?4�x�K�-��oYŦ�ϟ[1$a��9��6�>Z�=����ǯ��'�v����y�.�6CI7�.����l���Td�s���k4�ދNX�aw%ڒmT�U-C.!j��]�Y��{
u�^ny��R�`d ��*��C~p��^�36�Y�jw�Fh�RG��
��A�|}v:�b��u+&�;��vm�-�D��&#{\�b�e��u��ӝ�w���h+��E�[�A�f[W�_��kj��B�|�O›��^Q�j��I�ER)�3z��O��;�a�A#��m�����]�A4���uK璃�T#0PS�դ�L��Ւ6��DH���H����{Xj�^sg����#�a��ʄ�d$)q4�Ս߅Ó�Gi�ߢ	F�����0�c�p��)!\�p��˽��g�#3��8�ɫõ�[S��
�{.�Q�M�B�7 
�zH�W
��8�v��p�@h
�65�0�q�7h���#OgogXMn���H�Nc��k�����B����Z�z���d	��,�ٱ���ׅ�-��l|!��/������굯r�= �z`����޻���c[݀h��������.Vl�<�;lS֔�H����V:l�ȱ���>�u��)�/��sbo���{w�/��T� *�YK-�F0z[2��Yz��׶h�gf�|�jw;Lh<��*zd��H�#�����St|ny"M!�)�kX��U�@ku�:%����sx�	�+Y��"�u��ﵤPT�'M&�[�$��O�<��g����F�Aشi�P�iC�n�6�Ŗ<�ۀ�����#���,���ɍ;�fV��<��d�->�g��g)7\�X��!Ģ���Z�vе���-U�Tb��������&[�*�Q�+#�q��!�H�7�`@!����_4��S������0����-?���I�8�����aO��9�`���z��="����q�E?J�]��)��z���\|Y��ۜ�[Z��T�0
��E� �@�@�
$[0�ۘ�Qv6TV ��;�����eJn�<]���a���e�j�:����k��)�z�{Ǹ���҃O��Yݑ�T�g�nf?���)@��<��!6wv`5��a<%�R������.�&:jNPrFo��!�v'���T���8|�X㤰��J�s<.��Z���t��9:"�<Q7��P��g��O��*�]7G��3��xCu�����w�{�?���O�G�'{W�u�&�陛 ���,s�Rπ�㗧g�燯gw�G@XX���{��)~�ǫB��+��y�H�DMzx�7�B7!�]�{0�i�U��-g���㥍Wu���m�se��D�o�T,�RV�ꚗ�@�h��i��"ͫ�5�Kjf�<D����[���a��F���0Ť&Jr��,��ѧ�@:�0!$�+�ɔ������׵�i%%&L����t1
�R���.VP��D�Í0�r-�}�LM��G��𤃳G����?�)~�/���|܊]-�l���{wwC2�Ԛ.�c#+�����zz�!�e6U!��2��y��w%{h�3k�Ў��G[/�V��M]w�¾�at��a̻-��[3�w_r���m��*��yl���F�=/q�ה^4����7xE	߅�_ ��d�gj�T"8J6��էʟȁ�l�y`�p	q���3�sd�pƦ���
��ٻ�V3u�^��I��3���PK�yVS	/3:<�'pip/_internal/metadata/pkg_resources.py�Xێ�6}�Wއʁ�0�E�\��m�<���F6������w�ԅ�lokKy�>s��i��.�c�V�/�j�r���j�=�x�G/U]Ca��){kA�]
��U:e)��(?u-=���n^�<\+�,?�,�0��}���N`�������4��	

Hk��Mk��vV��J7�OP��)+�TRn)��t�ڠA��\`���+$z��S0v�>}|�q�ޫ#�*!y�@Cvc�f@ۃ�=�r�F�n���_G9�A�K�����+�s���*�q4�?��~���W��t\}-�>��Pt�vZI��_���=�|&��j�ZQN�f�Crfh�;���.fy��VE͍a��dJ���A��-Cy����.��kյ�v�
uK�v��9���<O�U�ȃ�ثYt���&��@:�9ף��r�~wz`8��Q |P��6)s���_��N�:���䝄=��7��h+QC��d~��mN�W�{�$y���RY�
�,5�NK��'����l�jA��h�pҹԙ24�/(��v89pz
Z�J�N��L��O��>'�kƞ�s����E+J�(�_Tح_uZ߁&��k!6j^��~骴��L�P�?�O�����N�zJ-4#�\�|:���yg�*ߏ?;�ښ�6
�G�,F�^/s�l�j�j��/*&�
�>���%R\�l�o�|P���d�Zk������$HP�;9PO�[jʁC�%�A�ac�m9e!G�B�ox�l2�֘df����A@=��S���ԏ
l���$��4�֍�d}��,��2I�xO_&��c߻�i�Y}ᆵ����ѣ���ߋ�]d�Z	-�������jn�t��l���k��ҟh���3�ؕDg��ߚ2��	��ď����{P�O 
��/a.�1^Ͱ���o�s�5�5s�(J(s��BB?;@�����(�q��$�d��ҏȎ�{�`��U's�\��jK�¡��Y-�'�F���<�bZnƳw���0�M8G~�I=&w${���8D4�bGՙ�� ����%�,�c
�Łx�={x ܇j;t�)�jD�t�yհ�~�c�El?b�S�]@K�U#�S����6BU�.���D��<<d�u�uLl0���%��zڶ�,�5�=���\�L��[�����l�ja�������v�r>���;#�Q�>���~O_�;��gؾD/ef���C�������*T��x�0:8����YP�C�3�u-���2����
7���`�	��Bf���F��x�Cƥ	d���$;�n�XS=b�$
�JjezE�6k��#ԪuJ9��
=n�qr�,�II��}�ur�Kf
�`�༂_�K_��4
�3Th%4�xD�%������޽W��9x��u:>J����T�b�Ĥ�qj`�(Q��{�MW`������x��EC
�)~�8���g�x)���GѸ</#̴P�J�]��G�X�Lb���3и=��-/��jQ�x�cm��Y���Z{�U| ���u���sE:���.f
��yk�,z'����e�O
O�PK�yVS{�(�;? pip/_internal/models/__init__.pySRRrT(HL�NLOU(�H,QH��+I��+V��OI�)�����(qfIfj����PK�yVS0�Oy�!pip/_internal/models/candidate.py�R�n�0��&p�A����>��E!1�%AR�A����G���T
2m��;�o[p�qq@S[ϝ���V�-?��P��>��> �p	D�Ͳf�LDo�歭Q���
�W��J�QQ�0Ծ��Q��lK��M}+��m��M�Rki��4��e�|	R�2���@�1��$8)RR�x����Zs�e^��mB@���Y	����$�}]�kl���B�uSBB� D_B��n�-���5�[���$,OP����`M57#�ż����eSf���َ�tvx��C9�ZN]�r�"���lEgU�hՄ(�W�ɢ~e�6hC�2<ƽ7���?�s	�]�'?[�&=��m�����D�OΉ�?��2�]�'�PK�yVSU�=*��"pip/_internal/models/direct_url.py��n�6��_�	}�:�h_̀�K6h�"p�0�S����⑴[/ȿ�R�HɎ�,�CB�������|:�D~z��DQ4����-�ʮ���(
~=ZS!�`)꒨ݚW7�ٟV����L%�b�^,!��+Z$d�[3��\TҔE��	���S.X�.D%�%-xN�ݙ���U��~NE��[�.3�|.��j�F�(Nߝ��:K/�ߧ�f���l�~�~8�(��S0}�N�g/���yz�ۂ���\�
E������ӓ?�ɿ�N~>I?~���A�_^��AVP)�!�g_3����!k���-Iz��P�\*p*�`��u
Y�B|�X[;�����D��)�؅����u�19y�ÍlȎߙ"[Zl��A*��UN�L������`#�)��KN�Z^���?��FTV
6"&$��’kR�+�h���F�X{l)��c����qOVT�MhO�� w�d�w�q4hIU��魝��+���q�&�b�
���Ͽg�g��:���Ơ�Wl�ah����et��I��
<�e�N�ag��4S�.9i�r(d9v
f�l�����b��kF?M�}:�z�hv�*�:�а0��䧥Xɥ�N	<I�$��Y�o�hV�L�U�IР`��=&o�맪QFԊVOU�+�����}�%/ ^ih×/o�Pq1�<ց
3۵���&	�����LzH�[�w�c��a��1�FΈ+V�a���W��5��|0�+Zb1D�L��*M[�JV,�$��N�(xށcu3�5&��Z]yU
��N}
Y�C�4��T:a=�}#0��o�۠O�.0$r\����(��v`GH����LC��ou�K�Vuކ���n�2�����"<'ݐ�h���{����n<�
�?	���Z
��(Nl��C4�K��Ğ����g�qw�Cg�(�c\4��*�jV�&��(ۍ�Y�a���ȡ`��q̫���Q�|�^�5�ћ�����"a�Z=�! ��R����9*�-����RSKp�	n�hٓ�"�r�p���.��o��G�di�.�K���9"e�K��f"7O�+�/�N�Љ0ʠ�Z;ʂc��y��kbC��AfѿZ�w��v�L��Z��\��q-vO�i�x�7�!|����<@�?�HV�З�F�L�ULu�#��
�j�� ������6��r�l�.��8�˹�aMT5Б\\
ADB^Ǿ����!.�q��o�c5������O%~���f��1�p�:���@5Mb-�5\/v.�P�T�D!I��
b�̣/\���c�9YS�z���W�9>"�%�Ҵ��rQW%��Cp�@	�"�2̗�!'���k��W^]y�,F2*���6�8?�5v뵫���ea�Ir�:�}�:���udֱW�{Em*#,��� �+���D+�j�,a��f��}�}���
�u�5UֆuO�h�i���{O����b�6о2�Z��
}��a�;�ͩ3�[]2,�I�ɣ��4�A��	#�h��s�0�mqG��5�l�@q�EӮ`�.�X,�G����7��؄��f.n����F�ެ��5� ����!nd�
P�o|�6�-۳졤\���|T�4�C�՜��چ�&�7�Zv����Jo�NNfb�<�\��Bh����SVO�#�I˸s�Q�?PK�yVSb�ch�	&pip/_internal/models/format_control.py�UKo�6�ﯘ�-�U����9�Ѓa�4�eM�
Iy���R/R�8@���7�<y����K}��pm�WԟЗ��h�J��nwʽ�+���5��E� �ɶ�TnFh�6Z6Bɯȵ�05�ڣ%�
�4����n�����n�(�\�	��ho��w@c�/T=Z8d9�i:���'ٜ@�H'�C��y����"�N�8�+�a��;��}b%0���|��[<����s^DI��c���z��
%��y{{K^�1W���w��p�=��\W ��6�CP}�OmS��>��J�J��Ҥ�gJi�$B[�����3s���=���
Ѣ�q[��}�E?XM1���^a�Ԋ�.����jd��.^�př��f�=zὝ�z���̲�1	C?Pkn����X�픞��z�=��/%<��Y5NC��ͳC��pr^n�X�*ڂ2q����eӡ?�vay��UȻ�Bq�o5��G�����
s{/���;<BT��zw��T��WH��
�c;�9L}�!�l��Q.?Ң��@\��$ː��x�v��J���l���XM�P�P_��W�F���X�oL�[W�m�	;�oQO7u���n�ˢ��m��+�K	5��e�â�3�Yh�@+]#l���ɟ–"4����}G�bu����^�:�+��"#��~��pG�3c�|#a�k��z�|3F���U~�*5���}R��r�
sJ�9c˧'j����4NHl�������'��l}��l��%�x�,�K��cx�n�\#D�m��{sb��L��gP��(�i�c!›7Z$U%�X�_�[Ws��"�olƌ�Ľ̄���.I�z��PK�yVSߗ���pip/_internal/models/index.py�SMo�0��+F�H)�G��{��Uo����P�:�����w!	[�"��7ol�1$�!9g��haQ�3Dp0ͫy�{��Ǯy�R0&$�L`�C��b
o�E4d1�i*����
NH��Mkr�Ik��_%%�
(��B�-���P����lwV��!In݆��^��8[��z�Z������v@�6��O*��
���e~h��ʪ�pU�#a��T����=U?�\��):˥�9f���*�ѓm݅���<C�W�<�o@�X �/x�-��RC�DBƼ&��1a l�ZOR�+XOl��z8�o��$=�{o�^�E`�1y����	<�%�9�֍T�C7�A�.���Q�zCZv�"�`�{���L{�ͫ�򿪟��俈�"�[��O2�blg��.��#�۬A��V���~\f%�����p���ר��8�D�?&�Qw�d*��PK�yVSZ0tT�Y&pip/_internal/models/link.py�Zmsܶ�~���ٞK�;ɵ�&U��G�H�U�!w���P������H��+_�Id�}�W�T���25Rz�ہB��y9o^e���:��Y4J4O�*��.���b4Sr�̦"�}����Yr����7���Ԍ��\��s��u]b��U&�%/��
�/�}d)Vy'yi��qm�Bdz�����F�x}v�69���՛w�W.�^t�^��٫\���p��G���&�Y$�,�鋮��P
S��&�x�Lf�h��$6�Zd�r�?�y�-�hW��#	J�I|�|֗Ȅ�� ���x�SY�D��������E(6m�&����$)A�I�F����Ż�����_�>��a��83����+�������՟�ӫ�|Ze���\kP�r��Nd�����Т4�qFʙ��٣rv��%���c~�������|�GD%It!�N@|C#D;�Ԑ�����r%4��?���:`I�1Y��6�\Y%��Hy�	�������ř�`�KP�$l�iQ�:"n´Q�H�o��
�
�cA#��p.K�-ãk��������ǝ�;�R0�Z�nbĎ��u��O ��y+�ʞ~19cf!���J�3���…��	�k4��s*/��%P�
��z!�h׳5�l&�2�΄?`Cp^4��[ܼ�y�qi8����K7���}�_	�3n8�����oD��s����{�ի�]/r�V|��7�n�#�:j`YX��uW�2���qݣ�	����/��>�+$|�G���5���;f9ɪ���qT���T~a�yq�1�����E���.	:^�j�0ҹ%0���tL�ٛ��S2��#Uʆ1�^���y�g4�W/d]d(S�'V��4�ƮD�U$�oN@C[I�„�G�d�̈�S��F����B�g����r����B(�6$��U^���UC���	�#�1�؈�)�:��,f��7�"��ig<��\�B�؀��c�0x�9�w��}
!�Q5�j_���Jy��9{~�րW�+D�v"ȟ�+)�׹Y����'�&=Hm�!��z�"�"L�;J.0���:�WF:ׇ�8[��sp��ހ�܃�0�����ր��6��$�R�����-���G���?i�ga�p�9B%&7ҧ�s\@��+ȇ����K��RVQ�\{B)��-E������5�g`��	��	�_Uv���(��=f��i��Ǩ��Ȩ�����j�0�*Y�鑅$�O�ѧ� ��)ܲ�]�x��I4�6D="�!���=��|���/Gs��͈���:���:(�ٴԚ��%�b�GC��{Ƞ?|�F�*�:��z�M	�A�MD�-�[JC��|�~�K�)5x��`��\�d��^�q���M"y�5$� �(����YK5���	N�s�,Ϭ$�s�K�!C����XK#B���mA��BŅ�9��w��xV�� �7�
�R�C��x%�=n�ijp0{U��y]���}$=No��wJ�0��wKE����E���I|ۖ��.�:��J�#M-
[Vaɳ��f�#�i��^��+�v�����I0���{����=���ǭ�!�1�X��wkO��0�UQ�6�n
?1��X�S��P���*�y���LÛ�<��C�g�G�;s�p�N���~t!ւ�t�ŋ�Ǥ�;�O/�pc4;�+YW�qsl]�e��Q������g�Nʿ�#��&��n�'��A�)]�J�����f/����c�f��4�_�"�2�jhE�^"�_�1�0��3�g�I4d��֤�1�ր�`����g�}~Ն.r1��`̎����_�����!�Duj��>��K�M!!�%��'"rm�3y
1�/�?R���fq�&��C�-��laa��)ߧz�}f����qt�y���j�Ď�(lA���K9�?��|�H��Q�'��6a�f����3{C�5J�%�펽�,���]�&���܂�r$J�S���;��g��%Ѷ�&�o�D�w�2uA��{���i�V�jÖ%53�<Bx����;�.�>��}3���A�G�wɢ��"�@�B�i����HN��)/��v7[ݍĩ,����~b)}�!�O7�9]�Yӂ��k�b#����"��m�̬%�Zu�\W�c���"_�bc��H�:|ȹ,׶G��\�	�o�gBa�il���9�S��e�i�@
��
:c�ec��C�p�ԟLm�3�<f�?����^���@���IlV�2`N)��Ƶ���ӎ��R�NLݹL
l�*Aݺr�'v�q�~�&n@T�C`���Q�
,�E����[+	���TK�<�D�:��t6�?�0�/��Ӷ�cg���!��8&��YC
}��]A��y�r���f.5���T:Q�-ʆ��
U���V
�U"�W��V����s��qa��$����E<��IM��(������|�D�<�A=�!��iR�E���Dl/�_�2C�БR/Ŧ�Kys�h�"�3�c�ԍ�������7�5W!&�o-��^���r�4Ge�P�VR��Ơ�{P��P���2�Ç^�����H�����5����\J��X��uYH�6�m�Q��qV��F�P@�|N���P�����J�߉�����"� 3P\G�q�.�D����r��;�h�+^���JH� !W_WUA}`�������dp{چꬨe��S$%l���a�qf
c!�&������_���l���I'�
�
A��i�ӄ���V�w���w_�t�:j��Ѽ[�+ pPǐ����!����6z?�L<�x�G�:������q���Kg����ѱ�
�9M������}���oƠ��i����tr�V�<�]��}x�e7�dU�$]�ТZZ6���=!����Nͼ�A�
P�����B���zoP�x^��n?X�{
��.
��Ka�=��Z�i䨲��[���C��
A�]`<k._�����t�x{��R��@�-�����J���	�o��z?�
=y�C�.
�wl�Eu�z^^́�f�j��(u�x(��.\":e��8�#/�F-Q��e���⑈��������
6uz�����"�;mZO��A�5��%���*LS�%���tS,���q�p}�
W\�:�ˡp�t�_1�d7"/��
ef� ��9���*���x�
�a�IGh��ѓh�PK�yVS��l�pip/_internal/models/scheme.pyePM��0��W,~���[���Hy�x��S)�l�u$�HF��x��kG)I���3���4Mc���>2gP�)���X0F�����'n�Ž���T��N��#���H�׀Ɂx
lNBgY/2��\�܎��sjs�u���SoG���>>a*Im-o
��Q��l�_�o�u�s��W3�öY@3
U�	� �F��C���Q��f6�2�G���È�N>XX�=!O�`�L�B!+��=�2��"a@+����cέs��Q{]kf��p�k����ѠB
�ff:LqX���=���ܰ�J���[�z`��n�����s��]}�u����A�������!�+���3�+��'��M��PK�yVS W7L�$pip/_internal/models/search_scope.py�Wm��6���Bu(�K7J�
W��G8r)����֮��%G��n[���g��-�&/ky43zf晑*+�SA�`��+�,h{8(sh_m���^=T"�B�V;^	��j�l�±�Vv�~�|X5*U��N��:�g��L�:(�[�LkT&��]�F�r�U�i��ͥ�\�\>�;��W��d�z��N����i�a/��Zac]�C��2's��TԡHIA
V+L:v�"�2\Ƶu����j�i�=���e�uf+y�Z1<I��2��|�E���BB]&����p8˔g�5{u��
����w��4������}�V�V��'[�D��o��4�?D�J
�Dž\�Y�$�X�wz2��K��<���ܛ�}ް�߳d�Ar�mkq��U4��.fwe��#^]h(���S���'��Z�|�=g��L&ܡ.�	��g�*����Jqd;9�!bX4�h�|@�ԝ�HV�R�\98iݑ�k˂;=�nar���K>&�e���0]���N:���
����N:���^��Ɲ��uu(��K���n��A�{��9���8Џ��`�9��Ő.���M�&�1�@BS��seEx�<�['���X�#��~�W�V73y(���o�]����*?I�d�G梪�e'�L�O��kΈi�w��L��2�Rh
����7�����$6�9*v{;�$�XCJz���؎�֓�1g�Pf���vv�P"��dH�/���7���
�z��`IB�G`�D��38�zQ��dN19'$��Ȓ��g�ח[��DyŊ�^3��E
�P����%��]�,4����O'C�Q�}t.��ڎ���� Ɲ�)C��St;Ҵ7��o��y>R�{�Ȥ�e,��P�������C����|M��e8����\�tn�� q��?O׾�&7�Lj�%-��+��F���Y6�݂WKS�7�O�U[L�_�^�k��8�`_i�s���*� 
z�F�P��{ש�	)#�B������zUp�)�"�<u�S���E^b��y�Oju��‚2|l�F��:�h�R�]e�>���w�l��߾��o
�Vz�*����7����8��8u쩾�5F'��z�C&���(
Х(ie�k�+�^(F|d�� ��h��]!���I�|���,}{�-C�r�N�4s5���Z癳,��O��v���X׭�Lsrٴ��H�K��g��X���?Z4�6c�n��	��;u�ՁK��M�\ ���L��d}$b�I~3's�$�1�MXwK	C�x��G"���h�mM�5{[#�2e���Bf��>|��h"��3
[��`��%
�S���:-�\
��t``��y����4�9t/�FyK�+\p�0�u��`‹����;��͘�?����Mx=�z��÷'��H<��K�\}�N��
٢֏�*�m
��x�R�x��BFO�OǛ�g��և��U��A��&���k�6钏��ItJ�:4�H��O�F��q�)v]���R�tɡ��*����S�{�'�v�����O��r:~s#y�t#ibL�~� 1�~�-|��y��4��nVPK�yVS�����s'pip/_internal/models/selection_prefs.pyuUKo�0��W�a-�z����>�[�v(
C��F�,i��4�~�d'�����}dZg:�{+�3�����h���
�Vڲ�ڣ㳲3
**[�:��h�=��m:,��V�~��:�\9lѡ����g�X��{]K�	����
���`���1;��hy�. 5y�T(��
�<��UE�x�*���x���쪽�[lW�s��8�c ���y�7	l��Z���B>k�r�����{�1z�xJ0����=WS��A����V��ËP=�7Љ-w�w(�
wO�!I�!�#٠#�m���`4��]c
lJ���|��p��o�P~#<��%68�91��W�d-ށ��@�R�┒!mP�1�Ec,�D��'¸@�Jj����;�B{��#KX��w3�3�����8'qy��c��'v�f��/��\��tO��<�%\��ˣj�[�S)NN��_>,����
'�Y�����`�\Ѐ�Q
���)|L��|���2JŢ��dp�4���s4�N��Pp�P~	�)e2H	� ���M�[��@>@b�xf�gg\�pR7���wKo�����M�S��+X�q6ex��Y�F��A�n�ߤ<'�I�dv���r�r�?��UZ5imP��T'ܥ}B!\�o9U�Q��<��"�y�#Rdc]f��&��)��h<f���?�f���8#�m����l��/��PK�yVSQGe�%pip/_internal/models/target_python.py�WKo�6��WL�Cm@K��b�r��n��fZZ�l6)�Tu���3�"���ͩ:�65Ϗ�<"��X�uIiM���>���Χ��h�Rxhj%�N��5˞�.�e5ϟ���g�����SY���h�5^*�rS��˓Tҷ�T�,|暚��"�ga�G��d�d�ƿn��.��������lj$I�\q�0@���[1z�$��f�	��t�k�(�P[S�%�4%p� 8����`���*��Ƣt���s�H檕ᘞ�9\�/Y��.���p^gg�pgu%�IG	~�n�QP��s����ȪH|��~��=#�E�����ˠ%f!��Y��P�=��v$����������D<c�HyċH�1��J���I�D��#�|�5�܏p�ԡg_s˫i�w��/qm!9�F6`�{�F���/�0�L��;��n��6�3o������|�C{��^�R��R�bf3�NN�T��(�=�:���f����ꪖ,�ը
Ii��W��.��Ə1(�c��l�wLM�
�1���X�A���.#g}����la� ;�
4N�V�3�/(�z<�?>~ٱ���� ��gJ賿�O)ܦt��z�:ȳD<)u�|� �������������mt����yȏ��Es��q�_aL����YN,]o~�S�+R�2wâ���{'V��$[A���ؿ0�F�AE(�]�Sk;�%+��7l�1Ro+^o�
ӹ��q7�Q�>�1-P$>��ǎq��Ld��5�����@˦#%�{h����b�sՄ�@!b.�1����%f�p�EǪ-���^���)ޱ�@&���/v]��$׮�E�r`�jBٷȎQ�]Rxiv�P$��v����B��
[�[n#�=�6�-���t=�k��D��d��B�[�F�/�;�ZL����ɶ�5���WL���kH��m�ó��'�8���?/m0�y80z��@�u&��EILW��O����/�p���ȟ��
ES��EX������K|�B#%ZI:š�3���{����$�yZ�o݁��@Z�w�L�<�z���{���v�PS��͢�^q�t��I�gf&���ā�E.q�@�yV������Y
�/�R��,�I����������a6Q_�q�?Ӆ�P������T���$��+u�Κ��ׂ>��W2�׹\�PK�yVS'�TA��
pip/_internal/models/wheel.py�Wk��F��_1(�ȭ-'��b���t��.ې~�݈�tmO#k��ػN���sg���l�R�aA���s�}i�(��ʐ��Y!���KU��e.*�w*'H���N�&��F��4��K>�rCx�N��Ćd��U2��h�6�6N-���� �ӟT�&�##M��ʺQP�T��;*sm�Jf��]:�������nJY$�Q�.���N*��#|��h4�
����|$�ޗ�?�G)����I2���{9����W?����<��b<�7>M����8���V��m~�nz��Z�Am-�}�
�[��6�_�&9(��r��_Ѥ�G������2��Ch9-E
�K��R�����\Xg�bz.~�%�OLK�<7RY��s��US�
9	�b�M]u���	gdI/
�F�lמ["�R��u�[�<�7^Fkw�)��"�m���I���5�5:}���E����VqĂh�BJ3��4��h��D��Ӣ��-|@�7�e-�o�;3��+�-���s�����|6[)��.�vgվ�3��L�-����/�ń��AԐ=
�;�e��e]x鱉�y�{w�Ƌq��
���$
�aC1�n�̅��
;��DV��9Bp�P�c'L�5�p1�VJ��ؙ�ثL̳�a"��a���rB����GZ]�q��m����Gy���]�ۜ��
z������&������a1^),y�h�n�`4ch�02q5�Og0�m����!Eq&��\�v�c�v��	�����0���������ơ��
S����Z)��6�D0����W�����X ���ہ�0ڹ���#D��'�T�?��<ǂ��S�~uy%���E�#C"{�2 �J��=½69�^m�cr����bX�1���t�<삷��ҥ1���k��d$~�����Ǽv�{\^\^�g�%�SG��y�q�M�l�z���A�4��6���ˆȩ��eZ�d�̀+����8�'�+��wH��ڍ���Kn�L�1S�����p��M�RyóQ�e����i;�'Oc�e҆|qr˝Vyۡ%:���5b+IlB�«�4+jB>���+ɀ�~Ț��J��D#�N�<�Z p
��G1���r}�~�7x���M�5l���� ���sh�B�b��@�N�+ģG� �m�G��B���2��$��+��Y���PK�yVS�J22!pip/_internal/network/__init__.pySRRr��+I��+V((-JͩT�K-)�/��rKRSJK2s2K2S�������PK�yVS�=.RJ
�/pip/_internal/network/auth.py�Zm��6��_�Sp��S��O����i���^����"K��[YTEj����)yw���ll��!�,�������Iy�ںR���׼�(W�W�WU�K������l��S���UɶƹV�
��u[)ްC7qV����W�(�ۦ��y�U�d�*��{�[vF��ĥ��*˲ժ=
bTl���C5J�ڏ���e@������/�Z���V����M����4t|e&
�P���o�X��*؄��ag<g_�}�����O�Qܐ���y��9��1�8sRm�x��u��Pv��a'f|щÁl�}O�x}Ʃ���^1�T�.w_`�0��sM�"�d�'q�5O%.P�"�9t�2/��N��f���Z�`Y�T�(:*�7�^�V��
�	�Z�e_�xYn�"�����j̙�s�Z���Y�w�2��V�C����_���0��}'z��34,�e�#€o'X�֑�R���RI��yq���1�'��.�J&��ai�?��a��ڲ��,��`/kx�1O6��ժ�{mRv���t��������$Q;'��ذ�O��n�^�1�j�+��N��*vh���c���B���U�W�����N΀~�o�^"�Y�����g?�"��o@f�����cu�R���M�qt�0��<~m
���ξ�J�1�JC�
U���D�p���(�.(+���s��Pt(��5"?X82���<~�0>�ۮ���	�w���s?>V�{��ܰ�{�;^�/�5��̷��q��������|}��U�{����.�m��0J��!��a[�w{��l@5n�Nt����k���0/I����ƭe��-"�9"�“���{<$�c��U#p�����`�o��	��/�rt�B;@u��A_�+�Y*�V5w^��Nu_�]��@g��mAk���@FV��8��>,V�h2'T�8��*��p��5$"<��a
ܔ��#��`B�_��
���`�<��k�/2�{d���=݀�E,k:�T�ā�Hj�&L��+qm�K'#�X�iІ��ĉF�- �����o٩R�5��,@��Q�UU�!����ߢ(._{>j�J%~�.L����W���P8j����wE�8��o���f9��#J�XA�V҇'my��l���n�Us��đ`bE=����,���	y�p��m��}�ib���A�f�3�̽��&G1Ð��{�\��Tp�x��[Xqw��QP}�\�`�$0�q~1_a��psNF�o?��.���)F��vXg�e�7����RU�����!�������.=?S�K�����_:w
������qOF8��Ƽ��� �.�Fn��Ś�\�q��Q�(����	��Y�C��yd���50#t)�~J��W%qڦr�	���
e������
� X��`k����.
ב]��^��e���r�l�<g�"��Qw���e6���9oC��g�����x��Le�>��-X����!�@a��~V�J�f�h�H,)-T��F�!�LH>$�B����L"�E)k�����MnѾ���ɏ��k�K�=6̫6�k��X'r�zF�c�N�T��?�0�6��D�l��
�Fህ���^x���if�a�GI�p�T�ЖTd��w��*h0��-�|�F��tfžYQS�'�:A��Jm0W�[9�º۷#�D����ԣ�w��z&�Y����/B!�<>�'���u��h��ݲ�Q:��ޏhݮT�H�Q���e�X� ��K��Z D�Wh{sXģ�4xcM�7�uj�X�4F�5��a?<*�j1��Vt�܌��D !&�ӑ��@7?V+W�cC�M?f���#�����Zw5p7V�kZ,Ya�rٱ�#�U>�]�Fb�[pQ恫y>�{{PD����Gb���
��/`�bL�Ao\M�}!��omȃ8���vj�Ħ�R��Q9�j2�1`o�c[C/�H˨��@���GϜ�&�S��{�Qd^�\��4�F7��6��2+teb�Ѓ�Nu~�;3�6	�o��������k��h�m<ύ:O�zq֕䁠�DZ$���H��8��@��<2/�Z�=�%�^FE��+���Q��!���O@LH��I�gB�X���L�l���g�خiMDf�j�"!�z�#�S4@\"f0�����SuDZ֣^DB�(	W63m��A�ޏpQ:f#�'��,.߉j�W3*�C0:�8QտNm)⥗ma�B���鈎����6w�[Ѡ���)�-�cR4/��t���&g��v.�ى�7��F���{6�w-�{ei��P�n�q�F����̯�$t����x�����)�<�W�p�soҹt-`|cႶ��Z�R6��ǣ�ӊ,d";tZs�g[ b����/9�"�K���!j��Ý�o ����@�������
j4���� ��Z	f~	�73������6i���4����y%/��oq0����yA	CÑTn��/�ڇm�{oג�����g��of�߷,��(�c�xBG:����}!��J���o8I_��/I� <���v�C�f~�&��������ԏJ�j����7��!��OE��tҺG�nS
-ֻ��x�N:�',���U*�.�}w"�ٻ��>�� ,�_!B�1R[U%g�~zw�ƃ��}4�;5�4�w�yA��EN�c�RZrxL�Oɪ^K�H%�W�-���J&@�>�6��d����^#�]�<W6�UP
{��5�ٞ��WI&2��g��q��%�
�7�0��/k��4S�g�9&�<1�y�xb���k֎�2i\ݐ#�����&>W�6�C"fՁ�G��I�M�I�3�<X>�_�Kֈf)�E�C 4�+�Ӷ�~3�=9�^:N�G�v�"�'4���H4�]8�vJ����Xd���X�pN���b-�P�Ҡ>����4�=�긫�|���tJ|*ӈ��"�j#�,�k���Aک��ñ:��]ǰ�iܲ�M�`F����0S��I��1Q����Q��WaJ�'`���gr��N��9�`=�4q�ڰ
6B�u$��a��#*?���z�����	�@FB�z^���B�&w��5E�j�_xH��crJ/Y$�@t��#6R���Ɣ�yP$7�C��̦ 
W��3\sX�F�@�d��ݒ5����]Ukx��-Zh���ir�?�7���Y�&�._�h��_h����MZ���d
����Hh�{@_\f@h;\=���}�ՙv���X5��9���8��U�[��‹���Pbx�tz%3$�l~ₐ�w?�\Ń��W�������̱B�^��PK�yVSG\�A84pip/_internal/network/cache.py�UMo�0��W�R߸�Tć����VU��L��mlg����o��T����3o��{v�<�|u�Z�b4GT�{���<�2������Z�<��R4�Vҗ�+~�v��G#��)�G˽�|3��l3°z��Ӗ��Ւ-��������o��)�B��,���y�Fݡ\2~�3Z9�6'������t�'Pwt�S��xK#��h�\�E#���(�p�)��,֝�Y�u؃puH�#�¦�vKw%���Fk�ˀ.�~�
n�D�v�� _Q�
.��T*��\�����D��_��ں"�:�w�U+����1��p@�zI3h[�?`2=��w���k�\u`�9��,p��_��pT��رS�x��8w��@��7�բ����S �FN����t�K��b�b1W�{P�=1���.�:�Hp�^��p����疔R[��F~�pJ{h0MJ!�V�@n��$5yF��.ʾZw།�9V�D�0�j�(�Bd�m+��z
!,_��h��-����V��p�8�O.2���G\[�������ӝwی��Xݫ
���m,
z��Y����m��Z=R3�R�c���i-I�Pgfj�h7X#�A'�k�n ;���C��!R���o��|R8_�I׻77%���f�MX;���P��AW�*��i�i������x�n���v������"���gσp��Up�e��˰���q�=���+6L�&친�.����OȬ�pq������]�Z~���C�A��~�"�{�~E�B�*R���RH�P�?L��aq��.�
PK�yVS/�P���!pip/_internal/network/download.py�Xmo�6��_��( m���d��4]�iи� h���ȢF�I���}w�HQ�7�>M@����玍��kjA+��5S��i�XJ��M�K��Ty�q�׭���K�^k�\�f�~����m˔[*ZH�&��H�z����e�S��hh��٦�Ydw��͋[�TB��aJ�|-*V+�����|V�~9�P\��q���L��Q-�����y�+�TzM.�G�{�+&ǔ������9�wB���a%~9�R��Z�s�)�w�ۋ�G�ּ�q[?�������\1����f�1)����^ڕDŽ6���8=�����ˌH�+BJS�Q���(W��F��4��5W��
�T���PCEK]Ѝ^Y�6��ښkv����$�:�K�?���(�fE�FQT�)�S�Һ-�YxF��&:)y�փ�
̼�D-����FB�m����u��j�5K���S#bAC��h�a������ż�{���9�[�Z*YQuhM"�14>3k������~B��Yd�tEx5�j���BӺ��CX%�œ��EI�S��� $]��kʛ�?�"���J�aVm�j�Fw�k��$6p@�k��=� �*��1�$�75�?i�$���$_��qn���_��I�+�Ԟ���IH`!���BN4�*�R�Y`H:����-T�'�3c% �'���-��nY��䭯���CLB|���l�9���F��+8��@nʷ$ysD~$����9:��p�B�ْ�Aр����H��Ì�
4�rǀQ��P�I‚�Ț�OHK�.�k�6\��|
�<��Ľ��7%�e����e'L4��	�������c�w�8r#����u~	��T��9UC;��c�7��&#k����M�;��O���e�6U����&N��X��2W��[���1(C_�A3Sn�'��jk�3�|�ޗԡ��ƒ������h�al�J����4��Jrݍ�B�u��h�ڑF�����<&�f��3/X�ij/)�^���^�N+��L~e�L��h�k�T�v	,ِ����S?�k��9-o ��Y�f3���@.hm)WCH�1M��h�zT��B>��7�js�àŦ��LCG'K���%�}�u��&�,7��z����X��T�"f�I?uA��>ݔף��uȸ(�M� ���	C���q6y�m��3���k���4ŏ;� q�Y�����wMt���s�{O1`�v\���b��b7�O��F\�t� ��a8�Y���D�uzut��P̘�k��KgL��_ Ì��أ;
ع;tf�!.�weM�o��ɺ�6>å��H�^��E����82#㲉
NᓁҼp�&���PG�3
,.��bch8�C�õ�u?c��_�^���wx���ͷ���"���ё�qx�	29
��qkm@�\q�/ÄB�Idp�c�#X�XI����&�Rq@���G�!jfz����\��ܢh��:�@]:b2�Cmh7:���ʾ���I\JB:�B~ݿ��gd#x��5��#Z�$����y�bF¦��3Is��������d�ٹ�?��@~�;���<�Nͽ١2O�P]��g\0��$YM��:��?��m�-,��0��PC�P���#���L���f�Y��SI��'|��	�!��z��F���n�'ݏ吡�,�ğ�T��l��3˘�=�eL=�\��>[���:�4�PK�yVS�w���	�#pip/_internal/network/lazy_wheel.py�Y�o�8�_AhVޓ�d}�����\�)��Z�l6��#�&�b���R%�iڇV���7C6������\d�7�ػ���A�fI‹"I؊�|y�˭��k�6�K��u��Ȃ���&�U�OwBI���~6�7l#�H
�{$w��B�&j(��K�V�O��������o��TF��\�����"�����[����,�-�Ey�����k#7���{�<b7��Uɋ��5u�,J�ͳ/�M��X�Z�q�M�Y�⚧|Z���Bw^�*e��,��=�T6�:�W��9/o>�]}�K.�}���������
]W��&.�{ax�
����
x��A/#���W��'f*b[a\�2�hJp)�c�b-��V�GY�o^bD���ś��OS* �+�h�M��s-IwM��g�YZp��^=��8_����3����1�K�F~�'���sg��E�j����Q%���6_��m���J�.#����xF�w;�Y*�-����3S��,,&ݑ����s�E�H��%�x���}m�a����Ad�ř�7���&���$�:g�U�\	VV�u!�^�?��(�N$��(͎!�@�������|θfϹ
+�������ق����M�����)��4����_��<Z�������e�Q�Zt�����7�V��Ҫ�;n����&�sc�D`���@
�mY)᩽ȡ�[�b��x��1$��x6�T~d��O�90�S��l�Mwk�h{�e����F��ú(�CW){^�"Â�]����2.��2��Y���&�q'�+H���V+�in�\���eJR�j��*-�� ��5�&E)����>�4��$I�$I�.1Z�w��`�hH���u�$�0�CU��!vP�����v>	�WM�}��P5D�3�Ɨ�%HR9l�b���
�ݺ`����ާ�:
���HZ!�-�
�@V�Ήupikb�H�����*p51��%@[�r#B_�X�K�k0�w��	m%'id΂��Ȓ���Чap��\ZP�i\��;E0�S�%���;e��طt'҇��}�`\
)?te�+�
궷	��v�U�'/��v���S�6�)m�D'�}�P��شM	�+��=��������{M��*����e
+�9�!M��-�y�y}��I;�}�<-�z���K��A�@�琕r2k�9{��?�c���2}'���w�ih���ŹՋu?
,`TSc	��߂�P�)�t�۽�"����,KR�)T�I�	S�Z�2��,�A���yY����4�p����"��>⽉{~�Y�ңZ�!i��F�b���9�ˢ�Y{���16z�i��5��@V����h�GU��h#�;cp>l/ː��
j��t;;�"+x1d�H�1tv;��edˆ�
J���үޖ���Up��Z�a� �ڂ>#��yج;\*��<SiI�|a}d|���1�#�j�X@�<����o=)��$*ZY�]�/�l�>Q�`�w�����Ma�P� ��]�����?=�Kv�(C�׹ W��ؒI>ӯKv~�:-G��C�2��Ai�hc��UW�4��NG~|�lWyz��������w��vP��Ric⦕=�Y�*-�x���F0�Uӎu�w��q%J]�l`��2�<����&Bm��V�a?*i^��o9 �Tv胿G�!�E��'�r�Hdb�8	D
O��ۜ�"��%^��.����tbP@;�GwR�J��C�P{ɴ�ʺ��?:*>AWV���)��*l��㦨Rw�e�Zā�U�wU�g�z0��/F�K�A�"���(���jw��Վ����!
l;v�@�gg����A�a4V�̩�Z��&U��(کq��ԞO8w4�u> ��wn�RI�m���=NH܆���'����S7]���ͻ���.�x��7`���o'������)n�C*�ӆ���Ötݻ��r���a�?l�w�S�i�5����hõ�_��Aa:+@�oT�V��k��L�����r���{�H������ys�d�����҅n�`n��%�%�X�%�_�[U��邨O���O��]@{	�ܬZ�6�^��+3h��������'��U��_��i��a��1�ZPDwwL�.�=ª��>�7ֹ��a�y�	p  9z�K�D����p�}B�\*(/�p+xM�����;�P��Ȃ�R�_��.$���Akn֔Rw��$����yۓV����+V�zy�]�X�����^�/=2��{@4ǡ2�v��pf��`�;��hLF������b$�mE5z<Q
|��azU��^�&b��5��9�/��M;F����S�����80�;#��u�/^��,�O�j�}a��1�M�ș����P�Pbb�vȽ�<�Ss�g��nS�i��g��#�.�2�/���=��L�Io=��\��1��PK�yVS�aݞYA pip/_internal/network/session.py�[�s�6����=7�Z�v�f�zF7�:I�ϥq&v�>K����"��m5���~�H�EOڛ{�r�T�@`�X�.� x�v�RkU�"�S��ݮ(+��ER�r�ϼ�UNq�����L�J%�\V�Ey/J��Z��Ժ.�ʁ[�M���2�A0��-r�,�+�i7����.N�(���u���Y�^�s�����d3�h��Z���گ�U/we�x��}�.�L-�]\j���h�'���
�I����\�RI5����r.�*��?�;�9W;�I���5+O@ڛz����O&0�F2O��A���s��7��a'IU�[vAcf�<�w@l��c3C��?�Z�Us�o77�bv��K	���y<��9z���:�j�}{-/�(תR�h<\o���L�̻£C3���W˧D�5���	��G��p@{Qn^P%	Py�Ur��Cp(�[�n�ZVQ*Wq�U��TY�[�W�K��a��{��-��M���u�qs��Ua�q�*9dz����-��W��$��dr$.���L0����b�.DE�r�P�P�H@9P2E���!I ��ϊ ��,�M��*Ӈ��qk��M��O�*��^�*K#\|D�#?+��`y��²�CDUD@{3��j��X8����4��x+�h6�\3K]�
S0�U�-.�é�[V
�؛���M��yQJ��D+-S񸑹�5�C�t%��M��p��V�R��~NŐ����/��(O�__|��:��p����3Vm��A�p�ۉ��#�ZIEGйAY�>���,S�b�O�L�`;��0���aj1���Ll�jwvr�TU��O����_��Ō�Mz�q��+�1����g�����/�O鿓����=?y���T�n�w`j��R�Ӱ���^ۃ�v�uQ4wy��Z
�H�i��*^fP�;�A��-�o��S�M*j
 �d�*�աo`4$ĵ���IU�X�}If�4�!4T�*���<ˌ��i������@Vn3\\,�z���ѯ]����t{�fg2�;���{�� !�KC&���aEUs=�T�cY|	?��FV<�:�T"�}�2^�Y����/�p5�R����B��nyQ�v+�,σ$|��[�e�ܯK��u���kUm�%鱓�~�@{�(�!L'/�����e��/������M�����߾���L-��A�LB�ë���Ǐ�o_E�y�*p�w��CJ�)������'?�B�	��%�������O��⥠�k��ܔp�4F
̋���]�l����/�G���"���(�u��{%j:���)�3�!�� a�sbs�AI���-3fV���2�@8�J�����at7EJ|A��=�%��EU��T���*L�cMg3i)�����&x�_ߐkfY��‚����Ԅ��[�
�q/y��}a
��ӧ�4"gNX��~J����-���!�rW�3�Q��ř{�Q�����m�V�")A�K}�m��5v�0كO��'�M+���ħ�0ƗWK�N���v�nR�s�чf�͞μ�0̙$�d��~�3~n7��.�!ZL>O�����ݭ���/ 9�-�
�C���`��P����Pq{oc(�}CVb9l���`Z��΄��v0.;)t|<Ȍ�[Ǚ�c�g��%2a�^�|�ًXo�4c�x"yl�������]¨���⧚��K���x�/��5n乬�#t�4�����Y�ȡ@6�y-�I3�F<��5+…��a!��g+�n��fR{N~—�G����4�'�1b�v����L<�>�����vS{��W�w�sͺ0f��7�f���XG�΄J0y_�
�N�r�әwH��苿�s]̐�yp�\���e�K��Q�]�f�6�Ǻ=��+^o��`��u��kU�
;�Yw�P���p�y
��<kewb��ֿݮ�nЀ��m�^�w�
�]���l�ظ�_�� �@��?��b?Zg��q�;�z��������/�ޙe8g���&j�!L=�1��B~�	(Ӭf
'� Z��>��da]zP�N�4$g�ǍJ���'`���ɯ�C���i���7^���M�b�!P�:�*�[���S���h1����]M�kӜ!����P��Z|!
�-4x�,��WWo�R[	h����5b2jlb��Ğ�����Ǡ�_,
�·9-a)r5�5y�C�*=���33�y��E�\LX&�'߾X.ŋ�ϏO_��0����o#�}�'��I%~��4ͤ�x3J.U�����9}v��W�C�P�a*��9�<�s�2�AH.���0$��}�}�tT&�Wڄ��P�u����Ŵj)9��6�B��۸�"�,��
�'E�d5E�`l
��Ls�H�
����!��.�ya��G�z�����Y#i2t�jRJ@֤I�IK�D19oJS�p���igh�!gj^�E:f��������(�⯯�o�[%Ӯ�'꥙�x5�&~�|�M�twK�����`ܲ��g�j$���0����>ZSO3���v���*J���sN�3J�Ut/�zA4���I�o)������^��&E��!�#
���?����� 3v��*��~�t�qe,����#��մ@@F�ڟ�:�-mdr��sډ�,�[���M�m�������Ґ�����tW4�:��?�<�����l�W�0�A�|ezB:��uD��^��v�rx`w�6rC_�́5��~]�d�4�t�9��	Bg6\�;&m����}%��(��ˤ�� @C��	TBV�7�B��랕!÷���X��y
�f���L�1��t�
>yP>��O�i�9��V�3�Tk�-R�R �¯�Zq��)_�mI&�[��ʈm�	�NDt�k*�ᚂFno�/t�*طx�p�����8���b�\7t5>
F�_pa�:�p�}4��Mg�[���
�44��C��ƺ:�ْke��?�ܚCM�mC1(�r̆s��В��,4��2���I�:yΔT&k��Ea�ibW��J�Sﻧ�I�EF���TH=�NۧPg\����/iNO�uϫ�Ed��tA\_��fa,@�ـV#�����Σ]�-2m�vt�6Y啳m-oGe£�!���5�%�V�BR�D<��D��mi�w���hD%Aq�n���Upx��D�[l�{-5c��c�kp)s�wF׶����7N�ܪ���F��S._t��u8������L�y���ݎ�;�1��.ĕ������Q`����Z�œ|�&�ʮW,3�MA,�6�V1C���	���-�r����⻸���?�*�K�%G�8��!I[[��nk-�m@�y~�ۢɁ����$��(a_�v�F4��q��b�;c��ݢ���^.��v�+ {���Yp�F\�@���
��������S�ek'^a_ތ��nյ�G$�U"[
���-�h-�X%\n��k?Ȱ3�PV��;/O��睩���Y�L�=��8�m����LӸЃ�v�uA�
�_�0)�:���>��`Y�Y�@�
<F~,U��Ҁ@��(���؉)�كV�;���"L�7�x`x��������~qJ��߉�/��Ȋ:}��8ց�zJ$����iN4�|���nps)�Bo��0�u�*���|�G��)�9c#wV���7���Aۭ,]����K�.�$Z�	B��i��e��lP
��
b��/�Rئ���0%0T�*!�ׁIk{�l�%[.B�a�>+�_A���/�ㇷ�dr�-���SβX���/�_�t�p`���/�M��'�
̑�y{m8����h�g-jʒ'�=��c��6~��P;���_I֌ގ��,26�=d
f�C������0mz�����3�D-�j�j��&�S�ux�AV(�g��Yi��A�4�4G�'�gס�2Hι~��:���b(��C/az�|gJs�NZ���eC�t{y
�+���L�j��VꩣB��:N]q�_ߘ�<�Т�58��0���C�(��f�{J#����0`���ܗ�Vhx�R�!�=\f���}��|�3OR)rNF��	�K�<p�E�D�=7xH�8M;��ǜ�(%�#�si�M�Q�HT�֕�`z.r��.~��9�����|4S�$�ll莇�9���1>�;�1l�th�; S7�br�����>2
�M������x��y]|��~6@��'N}�����
'���tw��\�v̶1͙��!�$���=�]��R��8ǯ
�b�u��:��VPf/��C�O��o��n�������k-���?�E�g]h�9�r�K<�cU�nǢ�����)��3s���gCa�ƻ���Q����ڴ��Cgo�V0_��h�Cz���ƶ=�ӟ=�sGs���w#�9�_?�Y04X�Q�g�H���7��4�˔�����3	��%?p�/���kt������5m�ӽW�m;o��W2K����VXӍ��9�@6]�f=�r;�Ѧ�ʥD���@�{k{�+���.G�)���+��nU.Mg25@��i��]�<�g�%(���(��Rå�b��&Up�˔�^�`�
�v���=5ʣ˿f�а�|�Q�.��C���_��A�|��U�n�R�����6&?�#�b�:a�6��
l����JJ��t�̏2�8Dž��N6� X��k��ϯ�F����e(ù��a�I��y~�Ǎ��o��?��#aiz���������Nޫ�5�2�M���n�X�n�䲨ל��cDh*N�^Θ)e�?��B����u�[�ٗ):�
7�G���s[�K\�Y�N#�cJb6�z�ll�*�O
w �-r�>����6oL��0
bh�����ZvI�J*�� ��woB�PR�����`�{!���O=Jt����/�v��ٱ��ɞrt�Y����%����=���eR�{�Y�޳����!�f�֓�y�}N���	�m��̻W� o���ԑ�$��p�?8�
�~���}
m}U�ޛ��{���
e�	�Ϳ1"3Z���±z~Ņ�ݮ�f����v��F��b���E;}�j��<��$�Y�L�I������� cN��;�mOm22uY�����mvHo�:K]}����*|r��&�v�Rh���� ���������Jq�jBU��0��$�M�e��T/�@��oX�`�{�����g6���P�P���2Hp�5��H���.6n�Ʀ���N�e����}Ӑ��d�v!k���!*�	_���I��"���f7��$�&��5�=*<�	�{�N�d�Qp$#�MY��!�?b֞u�
���(�w�`6�N0���ڤ��k�+O6����:n�Jz���H��鴬�գX��_WX&/"T��N��������^�RzGbi�gRQ��_!�gw%Twhs\>�=�_N�OPK�yVSӏV1��pip/_internal/network/utils.py�W�n�F}�W�ۀ$(v|����F��hKr(mEr�ݥ%�wf�w�q�����g�DZV)�M.��4W�•�n-ja�b~%��d��Y��D�?k&��01����w�w�˛w���o���{4���QdFЙH&�9��J:� �Ю�^]�,ÐO��f
��a��$Qkf�4��Y7�E��5��r!�d"�0�`CW�Epo�8� 3XH����ax|r���\�����ק�ӣs|s6=;=��ã�(:�G��+B��0�B�?��B�ȈHI�!6�"�P�kU� �X	}��@��.��5CDu/3!���@�X&+�Qh��bX��!�s�C��j
��dP?�2U�E�1"�0�{�V�(�$�)+C$3a�m,$�l��}-$��@�E��&(���ʰ<�K���Ėri)*u���	�R�M;Ft�c�,�g��"�n�����j�AE��%�m��P4��s+Vtڄ�I�5TĬǷ����B�l��%�H��
��
�riXUUe�*�1����a�Jq�rz2�D���G��4�'7*ǸH<�E

G�4\>N��^�pI?����B�N.��g�bF8U0?�C���n����ZǞ���OB	��8���Ɠq���}�[�S̉]��A"�K���UY������i2��~wu��~���Gc���'����� �`Xeb�4��AipN<��
[�}n�Y= `��Q��T��6�#�yjt�p螓K�Ȍ �Mca�S��h�9ܘ�r�C�����gTM	�eZ=в�J�D�"�_\�H
�J����Qu���n�I�nQ%B�m�pŘҨ�����9).��}U�fR?�zӸȟ����1����Ã�o��I>�ro���
��V 6��lU��L��<�e0wIy��i������x���������
|�?��:qOȄ�>
k��A�Q;~����v�7ҏP#b�[��zF1�w�F�^��/UK����V�{R=lZs�|n�h�S�/vh����J5}t�ɳ���C��
x��#M�A����f&ò�;�
�s�H�8+C���i~�0X6T�L�XSV(�i7c�o���Z��T��t�r�
�5��ڳ_
U��MT��N���Ǐ,6_`����Fθ������M�=�F�k�����ߒ�Õ)Ҟa�N��t��?��R�/m��f�r�ݬ°�~aϰ�k�X��R���_�=S/���m�7��}��ö2��*ܲ�*�o_�[��`�ôѴ,��YI�e[�o����������oI�J��(NxA�v����*7a#CDaU*�q�_ں1	V�U�Tmik�B�J��1�5���v�m��D���MA��DxgI�������"��0'�����i�4$�Y)7����-�A=�9s��>�X��ู�.ܤy֛PK�yVS-�{_��pip/_internal/network/xmlrpc.py}��o�0���WX�&�Rf�+��ic�*�B��\[�c��Z!�w���Ї-9�}}�|�.��T)[J�Xn�v���ȪVP���K�Ji�`,,)s8H}�_�Bi-��>�*2�D�doME���"�%�_��������w��-ikY3.���bp*�-���	���?��P��{k��V��L�9������F�W�x��=����X�H��~~�uB��f����q>?א�	Q�Rbp�%��+;��c)�ZT��*I�B	�B�_���T:�ntp�v��m�y�%A��8�|a5y�"�������@ܬM�C	{‘��1>�>#R�p�8k��H��z�?#
b-�/+X��1
A<���V�-y2֣xS#���J���vwJ�Pq:�_�C:t���θ+��&*�
^fv���7r���/�oG��5��\�ɒХ�r��ߙ��ܸ�vg��ld�`��l�hFc�G�8`��Njs]@��B#�i:E��6��<��M������!�n-��c��籽�D	6��
�qjo#=D������?�8��A�h���ԝI�"��%6S�)]g��2)��6�m`����{qդ}��x��u<Y�tqp�X�fF���4���n{����	s;���8�%g����
+�,�ZҦ�y�%7�q�(�}���qt�q�k�”��\8yt�PK�yVS$pip/_internal/operations/__init__.pyPK�yVS�ͯ�"�!pip/_internal/operations/check.py�Wmo�6��_A8(*�~��K��24E���@K�MX5�J�
�ﻣH���4k�$6ɻ{x��W��7��j.:"jR��u�J�~�iy�G���j�$��Ԥ�#�I-EK���n��MC
��=/uF>p?іU_��?�h�6y`�eV�QU��x�B�aМK��%kY��3�eZ{Ntм�2��l��
�d����xi���B��Lʼ�H~�W��3+�d����*8��e��éSvd��XM�F�{�Rt?�T1'�Ƥ��d�:�N���5th��e�l]�s�������TQ��$)��cd�=@g�S�כ����is')�1��h�`�<��v�J�= D��恍퓏\)��v$��|d����>'p�&3-�&���Ԟ�G�(�E�+�_�yȁ���TO������[��b�����jVؚP( .�Q�U隼������~�����d���ۘ�gY�lNr�>(���;.J��k���bf2	��ȭtm�@��`��Re�L��*m��Bt�ek�dD�y�Mז��VQ0��e�-����r �M��"�;���Y6E�����I��d�&��ߤ2#�f>�	U��x�Ƚ�^k U']c�}�<Hqf�*�K�De\LW��C���
=��ԃWj��f�ͮ?���FK�م��9Gb�u��tά
	��Nbh��;!�Ʒ���t��do9�!�$:��DRh"?�^��I�d抔�2���x�}��3=T\Ve�k�G4�������^kd&�O�!�=�h�;d���K�]eTaѧ�s���2�Ô
\�dn�����Ԑ�1�[SG�9��b�'��8N�0�ê�E������!�u�`��*z:btM5�H����$��m�&�\�t�r.���Q�	=Jl۹�UaB�4!���3L�FT�l_*��MB9{��=$]_�>J���™ӪJӑv�|�T���]��${�i���%�/��+�'�3�g%�9\APh'�/����t��-�x��뜺�]����!u�䈔ڝ]H^C���c��9����:T�H�9���-s���h[$Y�2��n�v�*��-�q9���J<���$5����b*Fr��?�'Wh�
Mh
ݙ|7z,Tq������#4��{|8��r�Ձ��}(#�]V����f�e�8��<�,o���U�+Dx4��Hݑ�0��߮r�=K�\�8�io�r�����zp�v��W���_K���!��I='C�M��zϿ&��mC�CEM�Du���֣����m�c/�nvk*��i�� ���~��M�e���yK��|���0��P$lƌ'�3�N�	�cA{�#E���-T�F�L13��j)L9C��� gD5
�(]��8ч��f|/~��N�T���H%>�7�F���������ޟ��E��`l��2��2u�{7*���~���L�k(!�3K���#��i�׷�M�~bz�@E�A���!���z��3B2�9��BK�PK�yVSľ
'
*&"pip/_internal/operations/freeze.py�mo۸��OA	����|�k��^�v݇,h�Nt�E����A����/)K��n��������7��7\(��b�*y-�Y���]Y߹�\.v��:4�J���-k&���2WK�V1A����7�J	o��=+>�
�����h�$�Z�M٤��.҆�_(������;-�5�˜V�W�Հon�q{?���ae
$){ʙ��;�o���=�`���VE��Bp1�b�-��=�~�E�mq��1�����޳Z�!�_iT(�� ���xA�)
@e�9cE����_W���"�:HÕ�T��o��~�)�~=�C�!-JV�����Yհ�D�
�Y��1����`u�4*&��YW
Ry���Lk4˒�b�WTJ�����w<��'Yk���@a�	�L/�5X�kmu7�|�
�#;��Wou�x�����
��`q��Úl9���ZI���LL�l����O(%�b�
�ͪ-X��1��lֽ/�"N@�d�K��ڷm�@!:/�]�7�e�u/ ��л
�_��-ǚ�$-��bfEVx�/��Cyn����52�A��B'�M�ɼL�;.4]���o��5�����=6������@@<i'�ژ[�ʺe=
_�7ڡ]���҄U#N8Ϸ��Q��p��=��B�Պ�p��@��N{y�۪ (2�e��Kf�s�B&��gI �ֈ�ܷ�*��<l��`�K"9yd�f���XC��L��<"�T��p�=ܧ���aA��w`�HZ�.%��[/u{-�̊h�i�Y�d*N�S�4���!�P�#˶G(�CsW>�1��-8#�T�:��h�0
��I��r�d�[��������)�.
�
����Z���=��'|K�
��`OB@?n%���<bQO@Y[�G_�Ss�ѤO=�����/J"�qt�������g�->�JD�3�V���ڰ;����E�_�����d������E�C��<O
���L�U��&���=�G+7�>V;F!���j����$�>������Nq���4<�KY��Y��)-��M��ϡd� n��qS~?�hŢd�%Qq6�F3"�B9Ͽ'�?�oO���+���?"�̇h3�Kf
��B~>*�z~�Ց�a|��y�̱�����T��8��a�_dm�P]B�S��fx�MIZb�1KX��U�{y��t�u�J�B
�S@$�Ǧ+�3���0%TD����R_�W��d���A�|������-)H������|�}:æG�A�~�?�^'��P��
,��+���˲�!��dX�j#}؎�2ADDh�;S�:�%�Җ�v�.����d��i%-�.i�+goi��s������%>��w���K�Ӽu�̸��W���o�4�|_$tO ��[�ˀ���)U����Š����k�G��^t��.��)XE�CxVp=S^�0uB��Ua3m[N��C��A�H@���3x�<j�u�A�N���HӞ�(�w�|lG�uy�9{�.eP
D��ӱ"�q�_�I�ѹ'q����^ֱ�J�G��dĹ<
��V�|����>�?bn�����pNjg�먟H�ff�
�����Z�D�$_�aS����iM��=�p6q�iG"�t<��q`��?y^cF�P��
'�zkG�zJ�>i��"|]�YV)5�:gz���/��=�'s8�"��YC
��O|�l���/�b��2�����ti2�C0g64F�9���V�)���(���/�qs������R�
��3::!����r��j���f:	��SH�BMc�f�%�)ƥ�]� ��-ЭĿ�$��z���C��\�=W�=Wox[��d�/~���-�&�>d[��<�@���n�o⎌nx������@tME�pά��a�V��� h]�����GP10��M��Z?���չ���%%\t����=��`�w��>�477��8L.~�y`͉�&�
J��ϖڗ$��i�4e�auhX�i I�
�U�0��{�Z�R��H��%	����\ҍ�������^�D.4Ӓ�ز����'�'��qmb����ۉ��}�"'8�^P �3�]��H��3{J[Q�\�d����Aa��� �b�-�j�����B�V�z.eN�Z�Rn�Թ�Յct*^��TX����=���9�7V�OJ*2P���VB$�
z{��
�#��U$�z��X��A�p�� k�ct]�IJ�7�.K�šO��CM� ��{ϼ���a����LZ\t�oƏ�#']�@R.U��DIV�z"��˶�O�`%�l>�`��ÿk�4bA&b<?�IC�h#xqƔ%��]&��Ej��yݦcap�e@_���F�Ղ�3uϋN�}ɖW�$��2:�H�>�氞�����1׵�p�[ko�M��?�p��+Þ�s��] ����_~����L��KS���F�g�r$�F��i�
��ٸ�,F.�C��S�0(�u�QK���:��w
���X0&pX4��qF�L`�Gv�v�
R0|~��G��m��w�q�	�A�����7�^�PK�yVS�:e�]#pip/_internal/operations/prepare.py�<m�ܶ��W��g����~�[L�&�/���Ks�aȜή�I5�����IQ���n�ƻ��|�ߨ�l��S��RlK�w�ЗM-vM'�Z���$>���f��ݭ�wU�<����4���{�o�C�k%:�o��VHx��h�ޗ��q�?t*0�c{��ަ_6-� ��sYiuqQ�ۦ�E���"��}�W��U�>h�o�6]]�f/`�̼y��E�:���B��3.�f��Җm^ܫz�ty+7w����p6�n�r#��gU�r���pB���Ǡ���w���������O��X|bn&z
���3o\
���Qm���B��3X{�7��}W}'��ZZ|���_�z/�����}
H���|�uMǏ�W�C��}��M���l��CY��;��?7z��y�Le�U�
�T��?;{���9=LM^�[�K;�k��cH�7[U�*�;;�%�~b�íR��#��\3��m�PW��{�?3U���T��c�̴��ݻ�od}���)ݏh��V `�]�j�v)��Fma�^�o�Ij�:�߲~��oN���w@ف�ެw�&5�D9ߕ��Gݫ���=�8��NO�fTNl���dB���?�'fg#;�}O���K���"m%�E+�ۅ�-���"Jm��j
�0G��;���¹[ia�����OO;�(a��A��Lͺ�8\�����ʪ�F�/�YV�&-�����V�D���
�6P��@���,�K��	��A�$�C���֨��R7�Ǯźi�����#�pM3f�z>f<s4�8E�5�Nζ
�>'e�6��=ok�NnP.d`�8Y����Ů#xH&;=$����`��e���&e�>��DB�M�x�8a�Ǫ�����2O7zs!�9���Z+f9�Ԣnz�7\�ٽ,����C�_�x�M��s`w�#q*Ш�"Ӫ�-�'g*D=�k�h|�w���N�q6��q/�]	��t��a��K�o@�kz�!�?}t��6����q�-��x�e�u�Y��
*�5��DZ�F��"�8Ŷ
uZZk��1�gqS5k�c��5�v��;�/v(�����B�jS�J���y����U��膃?�:�s"�-������D�n��An'��� Q�4b�Eia�|k֙�8,I��,21؍��Ý'd�KQ��J���m�o��u1X;Ϝϒ��d�K�a����Y�ؒ7u)-��
r�jC>�&6�;
�M�t`�
�Y�
ԙ�6F���U����oQ3�I[5�a��{�e�/��$��7
x���(���V(t�5�08p�Cx�l��c��!�J�B�b��P�MN�tʰ�[�������C+o�0� ,r����
�E!.
L(;L|���#���ǃ|3��ƠR��l{ T���vkv�t\����X�8�x�,�	8��jD��`��"<p��L�6j�a�	N�2K�}�pK�1�J4��=ڮÞ<���� �>zG�$�����0%���ph�f�)�ꉾ�N�]5X�r�d�o>[�&��25��}����I 0o�@�4�ߍ��C��~S��aTR�I�s�$�s��3t$��Q���Y��h�3�L�lk����5���<�k���HX��G_����2��٥x}�*b�F2Y*�Z�
*����^/�yXD�@�Ö9xH��Jbȣ��]�Y��7m�R�\���$8ZM
+��<���U�Y�9p�Z]}���
��a
��i{l�S!��pΧ��׿�)d8Ɲ�#`l���g0䳼���l��#BCJ��1jP���;t�0}�9tҲ�`(���X�\$�-�
�	��w�^?{�������ٯO�<���@���X��O""b�Ʀ��̸F�"|�ā-�4�0��o��3<��=fM���$~w�)ӳ:i1y��s)�qҥ<�i|�a��E0b�e�!ߦ���mV�Ӆm��=$��V��U�����?�b)�/
�\��vi3,,"DS���O���zp��1j�#Tp1�~�����a^�oƢ����"_
�g�ۀ�D#{
V^#���h��X�n��>y���es���Ə�|�����6Q����1>x�ʽrK���=��tC��"�Ea�dl���{�����=�XpJ��9D�v}��;�9��u+;�w���$�D�F�w�B��,n�f0hн�R���s历�:O�;�d���	h�`:�ir��ȡƕ1�'(�ǭy�!-@���7oq�����q;�M��]	z�6%�4��^�c�h26[�m��0�L�-O����=c�r@C�g��ԟY�t��C�lvK�YK�M�_UScJы�6t@�2�:�V�8�kð
NAq&�>��Fa��s��
2�'h��p�⸭V�S����p���4#�����CG:mS)Y���Y&��
xG-h
��&m!�w?<���!�[Ղ?!�v5B&�ES�?�%=7��da,-Cϊ�٘�� 4gr��휉'#��V�{1mW�i�$OuX$2o�0f*�1�]2��6�Hc�M�o����Zv`x�)2&6'ꢇb���s�-�U�4�g`��������B��21�P��n!�,q���`��K�i�Y!�O~A�ͣ$��Tv�A���y���m��D�f��0}C���D�5e�*H�z�4FW�$�"?�>�q �;ɷ���|��<78�V�-D�񿚲�B�v…1���!q�,u�@=iNߋ]"��`�h�f6h_���`5��9!�[��=[���O�<A�i����H��\���,�㵣�2��‚XK�r�F-=���,#����_
�ȜN�,&��w0�6�R��fuqyӑ�0��]���!>Ē����JN���ޡjv��ԉJ�p�3
��Q�K\{e��e�57P�2^�DѬ�KV̈́��\`.��e��C�>~S�d0:��2UT:�
w�Hcd�'7h�a~_;���{8įį|���
���Ȏ޻�z����0���Qh}Q��YPL����t��%vk`�׃�4&�ZI���+{�T`���|��<g����`U�?������=8�ु�;�+���n�
D��-��gD�:�_�=�ZŢ�C}�gF�^��E���PT�q�'�$ރd�B�+��  K�ݣ#����lvOp���i�X(�k�Yy2��3����'�/i�GS�%�7�2���/�
���g,|��.�/{�R����^�R��|a�[�>�dB�_~��M�n���uoN#ɛ0Y�D�N��u�����º�s�3/��
1����o\Y�h�Hh=2W�}�U\�����%�v$B��&���N�~4AŠ��/�������Ԃc�6$"t ��p�qḸ����:9�(t����>,��?�ێ��3��{k~�@8���[��Va
��L|�d�Ÿ7X=N�D��c��\,嘑?����F^�Х�E�m���{"+2.l@3��&>W�>�����4�7r�&�0�<Cź�8S~�����hvF��r�h9�xz�)7
v
k(].#�'��)��BA^�G��ՐL1�-�lPV
�|�%+"�N%�S��|�#��=��r�rb�a:�4�X�ǧb��6 �����6lg%�b�:��`��Amz��5�gi�W�e+�C�W2<	v�v��e׹�a|"}ëF!���u�=Jl�q8HF�9�cTr�)9���6�S�7
zIk��wy	�+�a&'*��"�E��s�[�G�}'���|�}�{�������<�ڛ��W������|�M6��@L���
�l�Y��0����gP�`��{C�p�8]G��dCv"�E�H<w�f
�`�d��/�^�f
9K����bg�W�.��_福��im8h���r0ɸ��
;̉�Z���.k��]X�5����S�^WJj���$�É(!��r�QH�E$��
�Y[��`���(er)��v�������֋�I��\P���%c��ωQ�4T��@�R�ֱ�nT�@�������cS���ʶ7kѠX���=G�Y�[��av��W���7/=(�4�D0٤�Ф�A�Eo��:�����L}w�}aK|��0T�\�`醍h,!w�
������Xb�C�\�hv�lVtA��|�Wm��ZB�;T�[�V�7����y�t>�V4�;Mƛr�-;��I� (B'h�ͧ@LU.h'�dm�
��قHMa/]s@uAj_���B`�Z��J�����4){�s�T*9I��n?Ce6�1�69�j��ժaUC�>}�O�'�
��P ��wY�	�n�S�Q���L�����RA���)�������kW/o��U^�{Q�
��.з�QJJ�1ؠ��/�(�h�1�;5��y6��Л�I�e	�=K_Sw�*X����2��x0"��s�#�{D{�ݸ���!��NaN̵�4E�.�1����a$���1�0���ݦ�%)g��٤m4��8�vj5L�$�j�?��M��U��M6{�vd{n)Q#M��%��f��餺�G�-�(}�v5�!������t�R���5�^�Daa\��>�{aS_ta-��Y;��N�.Ff4;�1s���uo���+�]1z�)���
�^�ha?���a��t$���n���f���9�1*0�
��\F�t++�y��M���Nq�=�L5`�Q�/`F�?BWӕ��R�1e�}~FOi3�
�`��v�j?��Џ�q��@m����&��*�&������ ��=ZVE��/#(��&�9x�Y+׷�iZ�j��@�|�A�q(!��܋+�����"��T��	K��4<����ws%�xg�d+�Đ)6�~��̢���2��ת��QdJ)��%">���
ق��D��&� �D�LE6mMc+p��%jي
7^�;�-����c?���~��8�m��8��~�4'��!K�;e3��v�GN�T��Rիq�Hb��N�܇*�rPJ�Q��D��hQ����ϳ�p�leo���+����M��P5J�E�Fe9��s9_q�E���:
2^�l'�����r^���>l�m�޶�Mb��,��t/s�랣l��靘��R�V+J9}��믁��ơ�;*J4�.J������k�Z���?���/��NU�^�C3�mM�������g�x��7W��q>.#�X�5��z�U��N8���ꪌ�t�(�Kjk�*���x�Q�w��w���C�PMQ�^vw�>�^�s)�o:
���G�:ƹ�q�l�-J�
[�=*Ybkr3��n�{��~7���=�S��a�D+���5��Ҍ��*���O���{��<�}��g�Y)�&Y��)��ߧ���	���z�6L���ئ�8����cT�	/�����=6��41?������~~�
L�<��f"jy�tGeԎ���z�҇?��J+z�޲��4�G�i�4>�g�*��i� �fӃ,����
���n��B��I�R�WG=��}ƴ��LF=��cBLn&��w�1��5���A�X.�Y�q"w����ItV�"���s@$�Thb	c��C�������R���|��t��2F���HS��=_]�2���o`�b�QU2�PQ��H#��FI��
�u��`R�a�r�zB�`F��i��W����7�p~�ű�f�P����݅~��˯ l�0���K�u	��`<�o^¯a=�����ʜ�����Ⱦ8�+�T�N\t�c���^�H|cen	ډ����8`C꧰60�_�]{��۱tZ�D�ԕ�}�i�T�`xeČ��g�<����V���]��^D������T�+�R��K�!��<�Mi�䘩�<���%����#�46
�_�;�%�?��
9��������l�^��rӡ����ʎ�����x�}ӻoj�l�K!����_W����q�������$?*�!_�5�� O�]�]w�ZB�[^񽥄	��:=ri�F��	�,���x�!:�KWA��#s�vѷx y�i�Z)9�_����� �W':�rvv�B�o�¤�ׅ�G{n��
� g(�FZ��<��;�"L��"���F�0G�[������O�<�o`��=�;�s�C7����>&`��)<��ad��ӿ4�sh��h/fQ��
��:Vg�
��2���el���^R�+��+�&%M��TG��-�4��l�ڽ{g_$��L.�<C�݇.��qA��qן�1�V�N�,o���Q�[�c�_ס9�;7�B��Hf��uB<�4p�9�M@
���=}����b��<n;�(q��:������#�ϚPsw(%�b	�mW��cVc蒱������N�7Ҧ��/���t�p���*���!`~�
��q�.��W�Im����PK�yVS*pip/_internal/operations/build/__init__.pyPK�yVSY0��_*pip/_internal/operations/build/metadata.py�SM�� ��+F�Eꡪ)=�v�^ZE��-l&�l0 �I��;�q>6���73�=����Ii�l�bP�������n-���5C��RE!�ޅ.
�	�O^�{������I��C�������I��:�l�`���@F�h�s�c<�=g{��OIܙ�2���x��S�J]=�����������0���l�G!����2��_y�{y����<|&w)���30�얏m�,�>��ز��,��א�#�OLC�R���J�Sȹܸ�u�}�{u;r�#�WE�4��0?.�5��)�u�,3�W/a�J�bN�oJH�R7=����1��;�ᘆԩ{�defj#(�p,�{��z.
�|]O��Y����v�}�N���o���#�dz#5d(��RG:��1f�ſD�&����`Y��&'�O"���.~e�er����9q5y���T�����a^��ݸ�s���)�<iFw�哯��ͳ�M�J�PK�yVS��j��3pip/_internal/operations/build/metadata_editable.py}T���0��+F�@"u
X�J������#'�6��ؖ���$u�nasIlϼy��8y���(���h��Hր�{j`g=�AQ���~8
"��<˨s�G�!�v�v�ȉ�FY/��>���Ρp�ݎ�?�}�*�F��$��EݓV�C�2l<�yk:4�_I�L��y�`�+��pWՑb[G��s���D�\��'�G^#�M���e��]R+Te��a'!����X��_A-�gj}+H	w���^� ��sH��2{^6�4�
C��2�}���{���1���-Ό�J��D*7��y;7Ȱ�V�x&�6yg�v���쵭��S�I��ͣ�̮1'�%������{��~Y�!��v��4����A�a��Σ���S���T��"�w��O=y�y���j@
���GU�
�j�O��R���q>����3�4���+�Y�ѣ/ۑ�`{�x�p'��'�FD��2�S�k�t��%�&��*�WE�+Ofgφ��WTL܊��g��8����O��U��^��PK�yVS��
���1pip/_internal/operations/build/metadata_legacy.py�UQk�0~����܇�n�1J�JQ��h�%#�����I�e��ڼ����w
�����Ҁ+�2���Q��%-4��g[��y��CHr,��f��zc}�4J7ӫqYV[ӑ^��+�jѲ�Z�A?�1�s\�'e��@�s��U�J#=7�L���s�SAiN���yѶ�W֚�0<Y�?�ޘ��Hx*щG��4�
�qo���5�ĥB"|���Tv��e����,�������#�rε��"�2	5��21��TdCp�Y_��&#�ñ~�d"4aXA�	C�&��`�Z]2����kk�9���Da-ݳ򻜦V���b9L���U���
��t�yM��pm<R��b/�Hm�A���|z�WJ��]��P2��
/��4��5R���E�٨\/���6J�٫Y����ӄ�ލ}��Vns�l��
�=���x��EP9�"�ܐ-��!&��u�:�ҷ��x���W}Y�_o��Uj��ì
eT��&���R8T��\,�¦��yX
&a;4��͠��9��/p��nD��z
�GW	}�����KWCX��xo�Gܮ�⾯��W�i�����Y��v�"��P2\2X��K(��W�|�S���+�kՔ�ď�Vvᬄ���ݜ�_za��id��~A"s7G+��<޷I��I�z����3�M�K.�U8����]rä=�$��y�0��a4k��K�-w�Ս�F��PK�yVS�<F�''pip/_internal/operations/build/wheel.py}RM��0��W�@!�YC�0�=lwK�;��(�:�k+������d3�-YOzz�����2=SŴ�u�@g�p�>:R�H�ʧS��_hZ�C���{~��9�aB���/���He}��GR:�03؏Ơ'EG"�d�_��X"�n'�G��}�F(D�k����t+NGD-
ϚA<)j��&�{yx��lW���$[IR��ぬ?/���k/v7f��G׏m����.1k��@1��c�
���tD�=� 2(��
g9���M'�d!���0RX7j}�H�����
��}���'�2�j���Xʐ�e�9?�)�-�Ǿ��1�225
�ބjS�i،,s���π�9:��(��)�v�ß4��P�sT�9V�d�T3��_��4�Ţ�B�.W���Y�%ՈL'�b���K�Y���ޮ]װ��<�+
������>I��-�r-Q�?��*Eكי^lx�(�l��K#�PK�yVS����A}0pip/_internal/operations/build/wheel_editable.py}SMo�0��W�"UJ�łEZ�(E �zE(r�I�ֱ��tY!�;�H��&�gf<of޼�A+�@���#<�ʒ֨�Q{/L�[�L��\��	e�ը߾yG�i�����z�ƭ� ;��o��	���K��C��qa�+mT�vA2��h�w}i}S�|�uHH�
\�c������R�˲ �4�B5rє�Q��p�*�9»=XgvѬX��gۯ�N�k�ce�
�N��I��A7�]���s?���>�ɲ�C��D�"���k�pJc 
\�pws���S�0�BID�G7iA3׃Sނ���8�LG�֣���3�}����O����^�܂T.��)���#���`5vy��㒅�ᄠ��9Y2�f���|yN����+�V�V�r}�$=��ԩAْ\,_�ȼ�����<]���ټPTR(�'������Dv��5�Wk�:�8������W��`���v��5�a�I��*��h1�4E�m��h&��)�y���mS�ݎl���'�Y�)7���\�7��}b\`�FZ�,�84�\�e��V���>(.����PK�yVS�ȇe	�.pip/_internal/operations/build/wheel_legacy.py�VMo�8��Wp�X@Ba{5��I��hѽ�� K#�-E
$���;����)���g޼74�z!5a�m)o#�^��R�F���S�&�M;����
^�ȹ��
�5H\�*F3�{8H5n=��/>�gД�L�z-S�~��ww�W(���(�V��U?�8�{)*PS&ID�{W\���͇�]�JƊ��-6Bv�.*�u%��Q�(�"H���e-�]K���zE54�!$��i��2��{��|�F1�~�[�<�\�1���%��[}t&���7��)=��֠*����Kj7i���s��?MC\c�Oˈ��<���.�e
�4E|��)�X係���p0po�*Ma������j��y���/ľ���G�{��� � ��q
�Ϧ��Ց�Cc����=߀q�Ts��g�n=?-�y�pJd��6�gBR0h����`D�eH�&���/j*=�F�����8����>�������"W�II�R��S<f���4��O�����wG9U]6���T�ub_�%S#:բw�,v�H���O�3�$�#��2P��x��bI���VR�2�|sO�c)9:���ͷ�c��+E�^�W+��^JN�$[t�$�
u���:�̭�P�t���t�ڐE[~#dK��,�"(OF�D�~��R;NN�s��7Oџ����b�\�eb_�BXE�5��դZ�,����ة��e�he��-FY��(���[�pr�T�.�&��ʸ5c�5:#wN��VJ��2ӱ�6F�ta�$
��L�!�y�:�h���w���ފ�W�ٙ=k�����fL[�
��R�Ib�S���!�w�,���T����a?�I|=�7O�-�K�����ZQ�'���N��?���:�L��W��g�0��U�krcXN��ߜ5f~�-
R
���Gƚ���ĉS�&�Ͱ��|V��|�;gCb���5��J!�j
��;d�7K�-7�=��r��?�T8s��]V�Ɯx�PK�yVS��{53,pip/_internal/operations/install/__init__.pySRRr�/R��O)�I-V(J�I,IMQ(�W��+.I����KW(HL�NLO-��RRR�PK�yVS�Z��3pip/_internal/operations/install/editable_legacy.py}Sю�0|�W��NJ$�@���P)�J�cU�X�u��&�}m�$w���gg�03β쀝�/��t��#He��{�$)Іj�6Y`�ݨ}��ؓ~.X�eL�����N����p�a.�u9��a��s���#��D�R\*��W��(���:�����ҐP���F'{[̯��j<�{��M���<n�z�|U�?���O���Y�4��b�f,�#��^E����J��1�`���ɜ%��������c���(V�$���
��_yudU:р�F����y�ѫ2�;���2j��k�N+\Z��f�z���3y�TiQ�`�-��F�H��#s����� �e��4~���St!�K�j|���:�F�a#�Г�}t'Ccw����~����`!UK��רT���ـ�<�,��xGCg�w��lM�	�_᭽�v��nRRݬ���֚T+�*ٴ��T�m�CP��@��T��D�ex��:��}yKK,�x�n��nSL��wh��T�hK߳�PK�yVS�	��s>*pip/_internal/operations/install/legacy.py�W��6���6�����
BI�?��h�c����H��!��s$�=YR��u.:��\���EqeRY'�F8��.���8�l���&��<��8�d�i�X��Z�z|�6��nY)��l,��l�g�jȍ�.��k��#�
�ێ�́���=����Ɏ�R90H�^6e�q����գ4Z���-!x*����ԟ����X�K@Wlq�F���{p|���.U�F�x�c�V�b�e{y)oZ�}n�֍�}8F�V<@� �˅��3�Ӑ�Q���_�;�3E-�E���ڎ��|��?���is�"
����5�7�,�s%Z��4���hG�琣�B6��~Lbz�~:�D�*v1��.�y%�9��ڢM�x��;o�{��h��tD�q�_�la���Q��~ci�.2�3Ё*=�N��g�����#+��+`�0���8	qi��z�t�	���`�"e:G��M�E�%����0��S��:(��rL"&o4�(g	��Ko&f��[BPs��;�*o����=l�u�&E�J�d@<D{wx��d���6�>�X���;|rl��k���K�j�l�X5_�b��5`�`g�&��"�2a�پ�2����)�l�����#��}�J���*��$b8>~��4S�PN�D����KVɝa��$��&����3\,t�d�;�4�`0]rX�%M׎r����;h��DJ�����h�VO��"�=�8�!d3�v&�(u�S&,���C%�?*M���%��theÕ�d-5p�׮QՍ>�y��?��κ���%�n�z9��ܢ7Gv¶:�\�v��a���abgT<ywͧ�ΥՈg(��T���4����?X�:Q<���7�GA(ޅ�g�8]~EtQ���5Wx8���ՔK��dq���q*�Xph˦K�r\��
��>�k��][@r*���Ge�-�^���aG^.[?��7��6�{�M,���
�w�ڎp���=y�o6����e�ѿ=iU
��iϬt�ZU��F��0{,�l��f����a����y��w�N#j��Q�m������哯�y�M�I��O��oo
}��̖�܇�s]����
�r��'�6� ,��6W^©�����S��b��J���[�;M/�{YcGeN����b�:r�Sԯ�V�9pL0�6�]<�v�Z�"4{^uش,Sڬ���a���3�����{�P.�v5�A�x�E��w��o��b#�k�=���;_j�����~>�X�}"��p���P蒰�������ȵ�5w��ag�ޒ����s���O�a��r��m��A!�+햣A|��-j6�C��a�W��JRn�F:�X�O/BK��nn��>��PK�yVS��X*� k)pip/_internal/operations/install/wheel.py�=ks�6��+���IF�Yoj6ʞc+Y�u��ɮ�b8C�ĈC2|H����~���ޭ����5C�Fw��/ A�vUU֭Z��ʊ�M�<+.TR�j�ey�?�K���K��@-�"���JVWɅ�n����� ���6jU�^�YY4��M����O�V�m�li�4��+�q����`b~�MT%�Yk���̎�l-7I]�fo]��L��KFuu�$k/~��U�jn�7I�G�48Qi��r���u[�ycޮ.����u�Ûu�7z���@��{��
	*��=��s�{������?�����ѣb�_�%�������2��I�j��	��?�_mY�Y#��뛳m%�^Tȧ$�_���H��/�q�U�����U�g<�߲
fm��~���I�.��U�UQ|�����GͪΪ֒�~>K�t��2�t��m����Xm��bY�S��YIQ�*ɳ�t\$�"��t�@�H�]i���w«$���u]�S��r�x��M�KYǛ���u�����&i�&��|2��_gˮ�L@*���z��O~�c�r�S��lr4���ְfcXf�''���ů_=���=z���Q��ѳ�9H�}]�kV�zc����q��㿟΁�j�/�'Z�9��I�K�����$X��rx��&kV=����u7mZv�\颁�@�z�.��R�VI�f��0خ@q-�UW׈`�I�+�B��7Y{�1Ӷ�e17$�m��Z@	G��2N�:�r�_\�]m�k�
k,���3��$[[��)̮�,��׾�Y�J�e]�%��=�g�4
I]h^̸+ͬ^�0ղNc����_/�G`[��i�=H�}ʳ���B-K3�^�&��a��L|�������OH����.�kud���Szƴ��x��ף-E�.����ٞ�s�>>�۫��<�[R�9��s�<�~�0A�k��ډ����U�f[m﩯�V��Ҭ8�C(<A�V_i�B��5� L@���uq�^�h��1T� �pLR���?<g�1#�K���O�9xͨ)��r�/ƛdxq�p6�RM�ԊŽ`ըw�08
f-�0���Pf0z��ge|[�E�2 �qp�c��8�͕��Kt�6�
Ֆ���J�V��B%
����Y�Qs���p�Ȁt�}�`A-�*(�
G� !	�@s�ݵ냯��2�u�6�}�g?�E��T���ڶ�e�P]��C�sؖ�����L��t�&6Mc�������h����u��\Z�H��V][�N�=��[UQ�X٘�:$Đ�"0A�f�M�$�Ÿ�jܡ
���Z')>	g�L�(۾q�6R��(�20�f�"�|�f�}z6�m�^+F"���@�����Nb�㣼�_ Y�]�+4H�U�=��׋3c��p7;']ojP��g6�������uY��MT�ˁ6�I�0�@�i�$�@N���EVv^ހ>��#�-��d��V��ܚM���jqT]��Q�͕�[9�	M	���Ի�l�t�!�B�!&$p�#��	�it^Eu�U4��؁/����.��7����:�;Gn��:3��ᄷ|�.4a��:q�#ɼ�a��e�|t��P�-���{CL5�Ĺ�{=�@�
.-�oRl��YRkR��29��L��o-rT_�?V�'[Cw�������S	����M惯/E��9˚(��D�~Ol2#-����_�
��6n4�ڌ�7����M��#��b��{���1�BC�{d��t��ĎV1�<�Aag�9�B�MϡN�E���������M��i�z��UZw���[�g"Fq�S{�l�	˘=(x�G�E~n1��#�7T���8�hjG�c\�/tq��e��
���Tyֆ�~#S8A�U�֢��mX��{��og+���H����2�-�DߏqW�Z�r
8^[���T�"d�hSq�M�&J*�b�pD�����d$8��.�|7!`#}���s�F��ܠ6�4�90¼�4��	P�)S��굳�m�~g4��z�i.b��Q���MM���	���T�}\&�3��İ�z:�<�9��i����d*�:#���f��9���<s�ax
��[�^��‰~��f8���l_��:R��ރ6�==�#�^��N�Ѯ�λ�w���V�@W�G�q�g<wx<@j�x�-��7H�j��k���	*�)�j���$�-;�F���Np�����
��^v�98rZ�>9`���R� fF�Qj,�3��7C����A�@Ԃ/+
eW�#4Y|�RpѐI��c2SD���i����7(�Г=�&k��S�B����:���=1�b��g��*� r' �d!���&J	M����;"A�X�7ɖ�5������Ƚ���Q��NN��1��-�AX�j�GF%E�?��{��1F�M��4�ͫ.o&��X��� ��f�G6$iK?�y`�=7c8<�m41>/�-ў��oHg��
-���&ܒ���֑z�P�%.Dm�R�$WLځѬfs�.�gd��`/52�,C���A�sR��G��xi�U	"�Te�R�"QB��w��J�9�����Ro���?�u�7�H�NG#m��xB���]A��Z!2G��1���4pT���h_�zb�2p��ڭ�� �Q��@��&U�[
w$P�9|5�}����"�$����
�]t�9�ö֪�83���a���Y���_�g~��1�X��K،�d�-���\��V�Mf�"����6-���R�[��D�:�X$Z��#P!��@)��`7��{�5d�i.A�f�s���"�V���+	��E��-�u���x'�-�h�I�Pnp'cgN-���oE
����4�l۪Y^�����V�a�U�Y�t�9��W�r5��?VO�N�X��������&(���Y��$�2^7�-���}��
���?�� �`�7�[kx^c�~�;�Z�Q�Af�q:�ŏj���!+R�!��%5��5*�t&�m��K����4[���E�\^^`��!W��}����_�5��q@�nM��kt4�ř�d��0|Oaiz[B{4��9��)�P��;;쨇~�����6m�
c�(L��[Sv�<���V�I���B�)���4�y�Fo/t�j��Q�M�-���s���^���L�d�b�v��3=I��DA�
���i�ʌ��DOh�BC�|׊v�§����3��z�
�x"1f���9Y+�xgn���O
;��+�?�;�0���13���yP��t�󏪲
@��Q�(�nO"ެ���)��	u79������7�ߣ*�
��s���/�$�9Lq�G��A���D@cBA��f���E���C�~=����^,�f�C��CMšs��xe��|�&�¼qS�U��� ���/fK�'�M����W7m�2�(72;a�];G����"������6]\&����(S%�B92�ꨶ�83&Z
�`��u��?�A3�ȸ+������&b�ɨ`-���	7�(t�����B�
��U]��l&:�������`3t��r0�FՖ(ZkD#�xLw��u�0�G�`G�#�W��{=��)�5W�]E�ێ�U����%x9�
	,2��|�֣�L�&<�
��&U��!m��	Р�+����J>7F�Mp$o�ʼn�`�ހ7!�-�j`���.�`3b�.@y�m��t'yihi���-:��{v��Ւ���!�4>"��@�݅��$�����	�
Ұ�dVF8Y?=2�]g�7���Ypd�0f�l+�^�ؙ�,�tE���<`��f���.L'�[tՄ]��,�Ʒz�`��YV(#�P�:4_Y,T�%8fq\gu�%�]�/ˤ��EVp��i9'TYY]�I�X��q�0�^g��8�$ݍSH�E��FhG�Wb���SR�l�"B����g���iN�f�ڌ�ƨ�1�t)`���1�5�-��+*P@���P�������󲼢e��???}������˳��O�YIDm���z��I��#]u��#��M86&g?�f9�(�[i+M(�6���N��n��~�����5���m<�Bz��'�#g�~H��KrIW��e����V���2���kzD�'��=z��̙�P�BTA�dh�4�m��3S4v��9En�!t;�ٔ��
-���o��h�I����A�b��
�<����I1p����'kK}`zR��(߀8�{OE
}�f�D�H���\��������q�4Ύ2�pF�#�w�W@��Zk5��)O�(H$��${�`i$�9+�K�F�G3]]�5"���?E?��?��@�Y����Gѹ�z~�}\a�!n�� Nt�wJ�;����c?U�-ʡ���p�ḑ��ۭB��yRz�!Y��!?(S.��৔��E�B������
�(��+�b�b�sNҚ���H�m��r2 ��[Y��I��@�$8�\�����l�b�.O�˜0嬍�^,��v>.�u#W~���1�0�z��"�h������~�� M�W��O�=W	���G=���Q��?R�Ni�ÿ�@y�Is�g'F@�����5Y����>9�']���ؐiviQ��!��|�t�� `>��~n��ℑl�[���f`W*���Pvmյ<C�R��Ik��Pd�
��<��be�R�R�K�:�NV@�r�B��9"X�b�cf��Ͱ��q�a��)쩀��/�Nb���y���4�0C�r��
A0"�T[�f��p,��K��A|�`tu�g����<��7��A�05��8��f	�6ƘZ6G)c9�Q�^yV\jy�esɘ�4�,�9ѐ�P#��U+�.Y�CVt�i����ն�4�ć������%��@�GRh��
�j�V�Y�N.���3��J_*�]�#����N�.>�;�O�QH
�b2�J]�Ӈ8,J��O��	&��ڱ+�f��=�6�.�n��X�N�{�a�r��w���v��t��
6���T��䳬��9�wڭ�S8:6�Ig�L�?0���0a��m�'�u�g�	�:����#�֗4�.*�Z�������g�?*��!ޤ�C��-��}�����6չ (�h�PI�1Z�x%X��M�FK����ԛ�RSde"���={/��;�Y���i����!�C>0�M�g�$��*�c�|w��ODp�s�KP�Y�ȸ��A�?�@K��[H"�����bcYfm��Y�Ѹ�&���
���U�>�O1����BN�j+����Ӫ;+�$b
�&��g�,�=�hh9��t�9�fԐ$d{y�@T���Ji�$d��1�R��Jv@�q�;t"�J�E��KM�����t6tÓ|V�gR����Y��P`�1��+&�)זt
;>|�If#�ÆsD�J�9��vX�#���߶�@^8I�@Ӊ�@��v�WW��qN
���_P�Lo�KM)�F+��J"�:������K��=�K�����Ϗ�T�F��7 ����T�"�sR`�t��� ���R��"y��u�5�6Cr�
��͕Sɟ}�d�c�H�D��EҖհ��7�����k3�E��]���u���'��#�#�6�O�o��� !� \+��o6����1��W�Y���,�><l����<�����6�(���U��ǠvU��}Պ�3Uh�dL�+Yl�zR����a����6�)�D|E�+f�,��*R�%)�2
�b ����Du���L)!�\��Nɳe�L<s˸3'^�8�d�ʴ�h~d�e��H��$�9Y�|�3.J���2�&�O� �l��9U1q�݇��/�ְ\��}f�����w'	��`�Hݢ	�A``�19=F�Q������Z��cTe�H�-o�/3t��ӢB�ڎ=�
�c�G�pV��e��s��L�7��3d<�ֺH�3������;�2K�wgzQ�xJ5X�߭�'L��A�BSǥ7�v<tsv�d=q�D���3RFc���Jo��$-V̲=��n��E�\��~o,�i���,�q%6D�{�S�-�3���k>��-�oXyE�z<�m�	?���D��eN\�{� ��酖�ؕ��XK,S���dT��]�0�Z�p��7�_�t���a̦t�N��g�r�Y;����Y�����ӛ)��Uow�];;���,Y�5O�#wU�7��ik]b�{Ra��kf��]�s�a'�nuK�0+1x,��e�7����G��]$�f�_����ᐿP?R����{5�P�����1�X�56W��ڽ��X�)���ȘLnO�[�����]�Bi�1����BNJ�vḻq��N�a��o;
'�0w��	Ln�T	<i�8��gp�7��ד�'�6�B'���'�Ҧ��xXщã�"^9��Q�\,q��6�9�l�=>�h.s`�)W>��x>z�|j��e��a�p`�uڈq��/gc�١uX6�5����}\xU^H���g}���z鸚���L»��z
.Ls4�ln���)2�RN��5&�<����y�	k�*7?%^|A�W�/���'�:~)�u�N��/��q�w���$i_��R�;r/�n��i����:��>����|q�eoP�);������~P��|*��#�N.
���R��g��2�yhN&T�� �n	���v�ٽ���;��џg�1��|V�n��i������N�l�͍�Iٽ�j�!E��2���r4@�]�M��+Q�DܐV�e����KT�A��o���b�
j{�K���j��;�0@e��5(N&pN�qi�A܂g.�S>b;�IU��	:i2�׺�˴[�K��sK\��(���
��6
]�R~�Hӣ�1Go���H�=�3��u������e>ʷW%`6�Dm�l��"�)�|�5TY;n3
>�<_:�Zgp��?.����=�
$� �ӑ���@� ��ږ�T{![s���qE�6�н,�6�}�X�B37�3��C!nʨ�ek'�dq �lpGh�״��s�0`
��\����MS֐�i�ц��4{�#&զ��x�4݊*t���#��^���%@կ]�[�>FDH&`���")gJ���gp��p��a����;��gpX�����7��b�g?lCN��JYް��U8slx̒
*(-mRg�N!Y$�\4��Xn�wY��ҩ�s���Ww��D��\.	+�~�Ֆ*�#4X�G'G
�
���ɩ!s�+�m�޾*��؂�ݲL�tB3��2k���J�T�B�ˍ�<��8t&`�9R�ཙ��#4�1��
9�*�;{�(n��\I�Oa|����k@��e�g�}�*�_sۑR�6�.�
d�t���*gkf��@V+�RSa��x�A��\�<�t�n�T� C�*Xg�Ϝ��TaBo��uB�y��
(LP��$Mc����9�v�|��/��w��)����H�n��P[c�Ҧ�z$����|��k�|���t�f�=����̀�*���>���مk��ͧ&���1�ƎBf�����Z��uKT�@g�Fa��_;�eq_��<?={����kv@s"Ѩ��� ���4�ij;?�pA�y���<q�x;��{w%��^�z��&4�;�,��)���]v][?��i@��\��?�I5@ʡW�4��K��k�|G����s��A_����ӳ�'�e�k�*�_y�Q�d�:Q-�Kj�'�`�91�=�—W�݃nČ�P��{�u��doY5���! t�z2�w�Ѕ/���%��oN̐]�#�;��~�_��82J�
�N�?���n�_���`�t���,��?�/fn@�qyH+i���@�-��TpE�C���Q��MY_%t��u�6�j˷e��ZYu@"n���*0F�'e�A�w�e�~����?B��E�
�Eʍ�^i7u��C���l�\Q�kL3��e8*�4ζ�Q�n��iiw�_�v������6q|Gwk�����=58�f�t�L�n��PQ.
����FǕ�S��]LkK*@�.���d������T���A��%3�P����o�^"�G�F͘aG��/�c9td�M5������=�����f�sG���h���PK�yVS��t��
pip/_internal/req/__init__.py�VѪ�8}�Wh]l����}X�셶o� {��U$U�sJ��#[��k�t��Ķ��љ��$���q�UB@븒6�ӒP�3��7�J�]�3	�攩�#��"O�{2Q���y�BE>Z@6yk�k�%z!�������|j�i�D�f��Ձ�"�&@.�cB���w8�Zp�ރ�2JыRҐ��y5�n�e+2Z�Bz�7��-�,�y�;���gp��ZA�dW��̲�����~v�0�w��I��‚�+�]�:S����J���G���[���&���Ȱ8p���ϷB
O�|���0�����7&x��:3E6Q.+������=V�(&��X]Ϩ��9��qR�+�鱶ֻ��`J����
�r�J�z8�C84�R���o����At	>���������ȡ�&�p=��B�Xb�-�@�R�:vib�(_$;m��_vM/�Hj[õo�v,�9)%&��
�C-w��UW��#M�O�)a�Oi70ww�$�dL-�ROe\8EN@���X�%C.��]:�"�b�_��f�'|�<������}��GK���t`�{�[W���ӗ����>�\
q5��*��t�x�a{��ȟq���돊�b٧�w[�傌j��Ɓw��^��$Ӹ(����\�1��,���ܯ6u�'���At��M.�r���k�0��2F?+*7?	%�fB�f�����Q��l�칹6��jW���o�Gr��:s�:�:���0^͉j��?-��o�3��_��ir4�m�7A���}�ՀiVo?�O3?m���Kڑƛp�_�q6t��!�#vh[��{��]��q�j�Kl��g�B���;@�>�rE�QQ��ø�_���M"�t���/f\ʹ�;�>�)|�?��5�PK�yVSecu˔�;!pip/_internal/req/constructors.py�]�۶�]��5U�L�I�3�(�돉g���8��Y�@$$�GA�Y�����@ ����iz3���b���]�Q��gWE�ež.�^T-oY��l��J��,ߊ_ECsSŮySȃb���搵�Q�ɻ�`E.8ۉ~S����J ���g{��f�Cu��f�*~%�l/��,@�g�ʙ:ԵlZ�7,y����R��C���K[g%Wj�e
�6`�i-�V4�P墁����h�4	�X#T���+��18l/x��k�
��7t曢������#V�-7��y�IE�	�OV���l?���5b�i䞵��H
G�U�9{Qd�P��x9g?
�|wQ��ON�R +I�E��&�A�wJ���6X����s���n��ꚗE�kΜ�s�T-�bS8$�hGF�]mS�<4�O�l�7J�l��Y���.�.�
Tؕ��� �9�!�
��e{P�R%��G�����k�<(�vfUY���E��g@A�Dia��c�pJ��n�Rt���q)���Y|h�����Q��7ٮ�D��Be�"C_�"͋Q��u����[Ѻ�>��Д�5owi+S���9���$M��4eKv9a��S�?�I�/�x�h~��Mj-u��&t��$p��h,Nӊ�E��&�
G�p��$i7�\���g��$���.�T|l�b<���Ќ=�F��K��~�V"q4�D���&�9N���?�_��_�͉�3��;���e%h�ذ�Ƅ?�J��>�6�P�Of�`�K��L80��F���
 ���ĮkѴ�%����b�S�X��T�5�zb̎J���%!��8�K���,!�D�����;�%��n�DJ�#{�H��pC9�r	
B)���CD�V�Gz�ڝE�s'+����C�3`��ڿ�Գ�-DM�1�����Ѯm��矯K��?Oq}!���+)׼�\�_WR�5����q	rT�A�;\ɥ�`+D�ʲ@+�3(��P=~�^o���FQ{0��*��ά2�AAH�Y���E>�:�ηA��M�JItj�.) ��z�\�w�R��kW:�Tg_���y�� ���9Q���k�x�`ώ0oتi��i�#��W�h��%zgA�
6��`O@��	����]��V�R�
�����ӟf�>�ay�ɡڣ1T�,h&�V��1���P\a�Y��c2�D���;O"�Ə@>�����^�"]i�(U��kzA��M=:�pf��P� 2D�YT1@$��^��u
/ ��\���l�V��,q�(��f	��[�v�P<pM`��![�m3^�����0�g�|�#z��x- 0Wh��n��fIk�1m`��.��1)zNgC,�h���&5���M!`��J�ێbupƈ�E~��v�%X��֋H3���,��{
qP�2�b��9��^mc/���]�zK3���H2<�W���ΥP&T�Ֆ��'�pp-tt�-�|�b���2J-:)��A��Ё�f
��؟fX ��m�j)��#�"QF/yq�_`�dMZ�-o��o�$A�+"�Ŧ�!�z�M�0*'��<�*p[񰦊7u�a��l��h9⻉���l���dhz�P��*v��;8F]�����0�S��΄8��i��=���f�6%��~&�?��%񒺇Y�i�&Å3kI��t����+�$��6��k���~��(�#�)��%T;�|��X�m����+���-��i`X�P��a	6�]�m�G��[�i�����NB��[���M �Sάin8������f�zƱ^��mzP9�ך�����?a�,KK�?ݥd#����<Q����w*!h�M�<W`8�#�	�X�-N{�gT`���#΁��H�Q"�^�+��w��Fc�
��F=���9���9����{?��y� �p���K���H�dA��@�ZQ3(q�;����尉CU�jeN���KkQ���_k)K�P��f��L��PVu}�ǖ��(<�����
�@
q9M�}޲߬��G�j���,bȀ���@����70_�({'FX]O�;�^J��~�;��r�!��u?<Ώ��7��bRd�T+�e��G�Q�e�k?m�diq��~mY���G�$Ĩ�Ռ+ӛE�ݶ�k~�?�dP>��Q�@�{�(n��8bXꖋ]���J�eql�,��`�Q�T�9�}��ШP���PnD��!��V/�"��Z�7I���.\�\�E	$�Ѹ��:�����|8��a�?:�»�����	d����D�7���P7�5�>�-�J`�
^�7�yol*4�V&��-�̾���u��l[7BQ�C�8����ݵ�f���;I<�[P�i���kr�I�{8���uW���oryVɰ��}rh�f]�w�|��z�����cՑ���$��xŜ�}�_J�Sݪ��V�4��u�6�b�B��2AWb�:�l��Œ�]i��Qvs�2��4$���*����L��{J�)��U`���޼|þ��j�� �ڈ�?[�Z��?��D�����5}�7#!��nK�o��T�?��aA��d-^y�%���Zf��JdB)�<����E�Sdz9j=�x)y��G�ER��F)�2��
�V��qh���Cy¾7�b��uR�a�žGGP�M���:5���*��{�ы�̂q��6#�"?���u�t��Pǻ�3�͒}I�D̅��b嵑_;��}@�M�N	��iP�P�
�oCp�f�����?g3$<���$7ME{��Z9)��a}4������baP�F}��[�A�*��h�=�>xS! R}'=v4^�i�Ɲ�8U7Շ)F�%��6�T�>L�e��A��1�g
ŊI(<��t�����%t��\߅������;��5|<@<���7}Xk{�Q��	�d'������ĺ�V�O���d�����u��J��9���!��r�Wc���<	"�h���W�`�S�5����1���v��Z7�7����1,�x�C��P�\�"�%(?u�L��
w�D��瑮���v�n���0�#n����_i�k��V�,��YZ��/:4Z��f�0�D�FJ�m�+6]<�o�[žP�c�4_��ǹ�������_̳*&�[f�*���F����m��0Q�X�bV5=THO>m���cxOb�˿����wy�n��#�>p]
�c��ܸ����K
#ws5���D
1�A$��w,����q7�zJ�> i*c-��];`Dx#�ͽ�a5������ܓ�n��NX��s�����-��ZG��h
��)�c�wrx�P��ݻo���A��=�E���W"����ߢ����}p=�*��w<H��Y(V��p���}�-5�n
hp�|��s7�����Z/��3���}��o�O�/.5�*
�PO���#��
(��x�AU[a֛q���#�L'���Æ�!��՟��n�vltN-��Qů�v.�Q�$�Րԧ4��?�
��r7����Z�h���֭�U�d�,���uN��֢����n\`�h�Mm4	9{�p��|ȵ�.L�i��٩n>U
]���>�Ö�ﻃ�
�>��?پǕ�5���XG^7-��xt3P75��ئ���Hױ��0�[�P�;�%"$�ޛ���*�KH|���BeM���"�`A�@��ر����͛OV�Z�k=��An�����^:q�ѕ�^��_��x���13gͥ�F��0~�p�E����q�](�tS���b'�<�F�ԃ��]ا�/�=��z��L�7�H�{н�����o)D7|Z.o ?�����/��R6��J��m��i�����˄��Cύ:��N��
#sI%Z(��i��K��[���
L��B��u�?��s.jJ�*T{z���u� �|$zcq�FS�@�هa�N��8
(��Q�^*� ��'Ͱ���
����
a�{A�O���%�C�5&$g��?z��t_�_�yFf�_����Y�Dl��[�Ѕ��d�8�Fé/��>&��L#�‡�pI�Q�連�c��l�ʤ{�m����Ox�dc.�3�I����e�U
�;�ۄ�jA��9+�(G���Y�y��ZF���b�S��޽��
��V��8	�|ک]�}���O��쏝�	����PK�yVS'����
Dpip/_internal/req/req_file.py�<kw۸��+p�9'TG��L�=�Գ'�8�w�����:.CK��1E�eG'�����	9�t�˲���_@�����Pr-�V�eQJ��J�h��b�Ԫu��g�޵���7�*�G��QeY\�<h�굛B�?��Fjnk�
�h[�����Gً������ҧ�Ֆ���2�*%��,�-�:n���[[+~{]h��i���K~;�48`2�4E�fEC�G:/���zQ�@�(?�%��Ǖnq���H)؆�q�
P}����ؔ�z!K�j���*��q�;�og�)6���]�n`�ְ�uZ4g��A��(*/�̖���v���������������-� ��Եl3x@W�!�e�3�֞x[���FTU���f.�S|��!}���>�U��q�-)`�
�:���?3�K��u��*ʢ݊��]��\H���W�V*M����tۮjZ��G��np�ua/����1�ɯ������+�8e�P��Cq1&�ɔ�C���/��뢒�Y	� ���5�B��zb�8��]\`딥O�`�3������P2E,�R��#Y�m������d6�b�����ɛ7Go�#����^;�K���mO�A�¶eu[��B��m�
�ؾn���ni3H�G�|z������({��]I��U�r�@ܑ(@2b�M�H5�A���$�X�(=䑕��G0O�Aă�)9I���X�e}���������y���B,$P�����H��������'S����'߉�E� ��	w�˿��	���o����������������_OOOޝ��NNϏOޞ�H�]8R�i:uj6e-wy��C��)0�@��i�E~lU��n�jn4 �a(0���<;\��l�#+��f8vqUT��Z�ֻ�%�R�j5��V���
|k�F���V�5-^����w�R���������Z��}��Gѐ�4���P�,Qf�;�.�|w3"���d!u��
��g|��ˣ�s��M�d���	)�E&:��K�� ]��l&[�9�m�������r��<l�p�]K�3�p3qU�e�)u���7�c����s).�a5
�
��m]�n��t�Qs�Bt����u@�Ki�v�n�[ح�zu/a'˱��94�}	;yPC/�Gl4Q�2ԕ=r��U=C�����k���'�v_"�.z�-T���6@W���Dj��K��}�I2ɹ��h7�C^奎t
'�]Y�p�N�f����-Ţ�A�fݤ��l�Xľ�����/�n������15!2��_O|��S��
O�p����q�xmA�>/�C���l㣋���dT@HM"�����m!��PQ�8�\�Yv{��b�9���V)��6X �G:��H�C�P.�8����5�
g�;@r0ء��5�~'��x)��S8�<�%\�W�̼��(`���/)�ƺ�y_qB=]�hx����?��'����hI4��΁{b	6� �tbb�$�:��(%͓��-0��<�Ά!�!��ZB��n�����u�?�궧��a��zZ�U�Q5p�N��:$~(�ଁ��Y��?�k����]q<�ơ��Q�ax-��r$�a���
x%�X?�Z҂�j�,�H&��=|2��#���u�#���
�\Vo�v����f6�0��>���p�q��y.�W+C"oğ�)%��o%��$�9�!`�S�N"�i�鳀���c2Na�u�v�?ޟ��c��o���@��n��'z��y0��#0��Z)n�����tO�H��
�3q�7�8��\M����g��,y�,z�ܩ���ۀ"���,އi���uس��a���~�V�=�M{:)��+"��0/MȾ[I�Y/�
�n���n�X���M���lӦ�pZ���hH�q\�BG�g2�h��Vv��*oE�4�v�z�Ⱥ0����. ng4G!`�	�qL�l�S��>~����<��q�h�F��ꢑ����Ϩ�?�y���y���Cc��ԡ���@}�$���X�x���:�Εt�;�g1ث��t �{��u	�IӦ��բ��ɥY�
�>6Z	�&6�%���/���^���"ԒDz����]���=���N��ղ5�
tN���z�����\��[����u��rM=u��r��Lbӟ�wb�z�\�ѽ��5ڒ':h2�����yu��7G X���7`T���)@끢��������&#�`ڼ%�[���}&TY���	���-�	#Ӡ;e-�wk��:>���<�Nq��P�$�=���0�Io�T���9�-(�`����U���pD��+?\�蔓�ɲ F��;�S0��f#>Xm6L�T�3˛f�

��o ��[%�>�[�c<�K|��rU^i�ЯJ&; 9�'�(n���g�ղs�����_G�~6�M�b}���*���\c�����.�<�V�o�~�T�_T���E��z/�q��,}�E�/�P	�L{�z��7�:�=�����z��j��@}���2�h��{���
��D*qfM�̓��f��OCa^e�J�Fb���	0�s�ELDPS�T�)����)� 	v� ��Bc�C^����o8�=S�yh".�k@�0OX_�,筍�8}�C3A_
�a��Ҹ��n������3"���BqV���g��b:S��v�ѵ�\��F5���ɶԑ��Z�E�p?�'���+�g�|��[��]$��,�.jr�~������ڵs��f�@�v�ܣ��:�k��r��[��e��7�+����9���aF1��\L�"�ũ�$���d}94z`�*����9�� �ٙ+,zyH�z�3�<��E���,�0rM~��>&��/R�3	eϕ��燗�v�G,4&o�Ep{���\f����0�ܮ9	N;�ŭ��J���[�l�WM�ǯ�)��YO��Ԧ��T6�o�O�lUr�ٙ����	�%�:T���('v0����_�&�SppG�a��e{�m��-�є04�U{L �IǓ�-�71��*0n2U��~�c�P���u[|���{���5kS�6��Z��\�-]�b��m���3��w[�=4x9
���.�Dȴ�C�_�?���)�����|<dJ�)���6"D1�=�حv/��AT�O?�v���b׈�������9d��q.��,@_�����y6ue<��┙��R`�&a�UΆEI��U����կ^e0@C�O��k�� y0=ӡf��ru��+�\��ĕ�.eEmp$����������"а3�c?��>��EX:�|�A����?��z�\��N�%�E�n�Z��>���6Ў��	��O;��s���_ڕ���|�t��Ty��=S��'�y�?�����
x��i����l�^���,�T;n�M� c���5�C���]����tK?��B-	���16�|�)��
_%�ZM��#7�xAddF���Lp�>��p�nԛ�3$y4�:��ڱ�(?�D� �B����&pyy2{6�䃠���#gw9(E��Ap�Ą˕;�:�K�S������SF6%]\����بޭ
`H4��Z�McR�J��߶��T�$_��<������w�Mt1��t ���妠�K�R:h��4z2�O�6@KȌD�eh�&�K��ٝL���qp��dc�33�w�ڸm�ړ#{�e	��|���X({�����l=�[�����;{���E��� ��t�&�J��ϕ,#��D931�2���/�
7��|ς8�	&�v��n��($�;\ky��h
�5�1Tt���V[tw��Gt��rX�H_�/T+�w*o�4�½n��J�MihVT�'��FV�c{�e��F;�k���oOΏfb�m�B�|�x����ŝ\�e��f?tevpp
B���#�
]�9��
��t<���?z�A�q�"lЍ��*Ve�9zx*<���8��`m��7	/���n��;x[�NA��xaw�?�.
���칬IʹYܙK �7���3r����6!v(6�=��<�Ƿ�x����C0G�/:=�`'��F?�Ϛ��?���~��A��!�,cx�Hc�ڡ�H^��[LF�5$�84*��Y/�ϷC�a���-V�=l|�I���Ӎ;"��(�F���kږ�N�ϗª��/C��ȉ������2Eףa�qj���u�x?�I���W��l������x�nrp��%0�|jT��s��+����x�0W�\7�֯��1_%��e<�ӛ�d<�Q�~?�H���!C��/F�N�>G�dS��2z�Ж�����[��E.>�C���a�mm�L&�(t�):�w[0R(r��������V��hs0�IJd�a�����rx��bk�V�"k��sb0k�OSq�˘���|sU���kDM�7�;���o���X>�L�S�?9���3��8}`�-�MY:��	������ş�����9�1����O�U��r�
���v���ɋ�7:iZl6W:�A�\�zӤ��>�	�����={����=;�Ź��0XZ�9E�/�k��֩	�ć�Cx���K��<�<��2������t�H��������18������:�_Q�SþBP,�����X��`�l�#]�NjT��r�,[�?��;�iS�ͻ������{�%~��x��]�;��P-ݹ��<h}a�T�-OM��ga'{b�w�����@[@��r�K��t:ɗ9S�'<���K�ͯ�Mcy�/�4gwC��Lҝb�KwF�N"�G���xP����E��2쎇cx�֋1�l
���{�*P(MW�Cv�ݸ��?[��A?b�ʿZ����<��a-�u�	W6��r�����Hh���O�����{�6B�W��Eb�ٌ�Y�f�8�R�Y"Y�_�>�K�Ȱl5�`��� O@�5��/PK�mWS��"J� pip/_internal/req/req_install.py�=k�۶��W���X�h�8m��6L��q�7����s=�+B�ɒԮ����<��]{n�f��888o��ɛ�HV�v�^��:Y���h�dش�m�\����JTI	۝H����IFl����NN�ݡ;�'������ƺm�m������um?B�f9��vP��z
����.6����_]��ו��kݭ�8Y��.�_���#��X�H�c�"y6���؊E��9�E�Z�k/�%��m��	��.+�DS����]��^�_�!��u���9e�������~k��j�6�_�ze�k:tbY�j�����kq�%�Y7Z�M���r[�*��܉c-��7��j���	-��DR���� �o�)��ˮ�f����m/���1��K��=��F/����@ԢR�.���*Ds�Z���4Wu�6����E�?����(L���Fm���}�ǚm�e�Z����,���k+��m�\���{�jd�<�l'Ʋ*����`
Q��O�R��q�T�g�݊u�<(���>�P�������d~G�5�L�G�SV2�.�g�ܣ��s�%��iYo��~ ��"W�'��[XAc�C׷��M4k/�B?-�v\vW^
�aW��0���7j�[��%�t9�nL-�D��F��z$�#̀�����؈��n���U��5_��A�;r���M9lg��������;�r�$�#p��Gq�v�05��ۖ�����P��5l!f�bp����QN9SeqT~��+�h�_��J@K���^��Z�İ��1�͆��z��~�;(�k�y��f5
f;ž�~?��m{P*�J�˺��,ȅq_n-1���9QW0S�q��s��''�'�>ɕ”F�ӳYA��(�'''�X%�Z��f��=�g���G
��*�i�J�2�$���dv]�{R��W����X��)��v�y*�|7kaE��,ua,�����7	�J��� ��T��s�@��=�;'<�Z$�q:Ӷg�t�N$�p`�b�֣~,`wu#I˶�I:ؖs@}U0�ꕆ���2 ���L��gu�j�9�H#r	
�?>G�qj�f->��S�����S3P$��`�����39�����_�\��,�1KCt���i�z��%y\�{6�r���ps-����Yz��C�P��£�4n���0�v��)�t��-�4'X�)���׮�)/�����R�J��
QV/��;�2���
�Z��f,�#d������D2�ue�7{�7-2`I�X��خ����6��YHyo�E)b�VU2��5,�4Di��j�d�yr�#	ٔ���U�P�綱ו�1��caM�o[Ve�9�Z-�a552%_��A#�}t�m/�Ol�zD�ڼ�c�6l�%@.��<`#�%6�4�����������i�t�G�+�>9�j��‘��POe	���l��,l�y����^	�
�B���WR��J�[I��&]�B�4�ncV��֋r	n�����D�<M��Z3��G#sk�b2X;H8��X��<���oPYU�1Y��OHy�F�
k.a�#>eA��n��w����c���^te/��7�`�qa�}�
X����S��G�6	Nb�с�fr��G=��Y��U]��f��[+%����+���[���<�V�,��fk�Qd��m@��zP^�"4����7�Q�঒3����&/��L������6Y9�fN���3�H�k���A>):8	k��]hC�r���؛�T(��xݠ	+
Rn�����YH��6�֙�T��v�Ŧ) ��JƺP�p��Y,ɽCP\�l��v��V(ُ4�q��\��
g�����b\Onzk�2��{�M9����T��\�qx�u��Ԑ�l
x%ٴۊy�;Hj�0.�BQ�&�$)')��z�niޕ���H����n�W@8��?7�Y
��j˥�(X��G�z@�ƏR6��a�m���
k'\eѝ��ݨ/@��Dm-���FC��Dy8]@���uy�c�G��Z�8�7��b�j��_""V��� �C%E�2J�	���I*8�T��e!4�����p'$�޻�\5y��$
����@8�	���}�ڑ0f�k�l�yXrW�x;\�VǞ2�A�c�P$#s���RP%��3���sT�9Q��]�m׵�ۅMd���`��fYc]ɠ�QoG8�0L�}⑌4"�V�W���G��"�01��<�)���?-�
ѵP�U�bm��f@�����
R�x�J:4��/��D��:��>I�~K�DͰ'����������D�cf�`�g��Yɼ�N���ļ_Qq���G ���S����䨏��b\۲�Q���?�,�u
<P����%I`�������X~���d%]���ޤ��Ջi��oʠ�\���\��\l�?2���1j$�_tY�_�FĆ<��-�$��1��
�r[W�?�7ay��bHY��=Z��a��(�}����FbU�cjqLi�h�Ž+�*��3�~�?�=V6;ۏ�󪆄�ն\[!��+�#�ʊ��$��`~$ʏ�q{��m3{� P��G"���ش��:J7;��6�b���⇟FCRr����8�3U:wJm�:b%_�I�.��4c��,�������}��y'�c�0@H��b?�fl�Q���Ě2h�ք��,����yЩ����n9c���=��uJ��pچhs���3Z	�n@/SS��[���ߘ��s� �=ؤ
�?M۲A��ͭ4&�au��(��]��^��P*
rHE�"@�%�׍�[���pQ���zb�i��؀�p6���Qb�k��PZ�="H�R�p��#[�����K���i7뛙�C���1��%�h�`����;����O��$/!SG1�c��77�����)v0��B!�<]$i�K[73�m�Lu��
�	��G)�2�f��B��c�2���_A������8��Ύ�2VeO�t/��?�Y���}R�B5<��ꌯl����2��Q��ϪPS���������3��q�a������9�'��St��b�(7�
�|��LQg����Y�e�G����t%�.��)H�ZM>u`�,�ҝ�$/xx3���j�x�Ҟ�@.�S�@�~P�HH�:aͬ����IM\����Q]Mц	t_K/
X���F��
�w"3�2É��W��u�B��3����׸�̟��d�df�08��'�������6��ϓ<O��`����x.{�^NnҜ�Qn�$ ����0š�rmr[�Y�P:��� ��aN$`���V�
(�5�rdu[y���H�"�9��}`8���
��I�U��W��2@7��!dj𳛔zO�y��o��Ħ�92h&��E����@4^6�us�n�*��J(�uU�5�1�C��Ĥ��X_�ʝ�I�u&A`��<	#
9�r.�Z�6�}#Q����.K���$i���2�0�F��'�P�iX1��@�B��F/�/��� �qFF�	fE�Ѭv��M&�5�z8;���"d�u�Z�b]
�
_��
���h��vvF���Ƥ8z�ԟ�j��9d�����C��3E6`^�����v���r�)���d��"���,�U�pPdS~����Ԙ��8�!.�t��F�;Z��*Z�Ԁ�벯��r�nt^Y���Ð�xE��^�5�8�h^h]�;G�vД�Ϸ\d�!�����,��/gS���~K~J0�d�TPd���['[���/̢�`�Avl��{+oR�Ck6Ց,�r�?�eY��1J�L��d���y���Me�ŝ���i7�һK�=%vwS/�U�$���h�^��8Ȅ��?�:�,�zڋ�[�^�uz�C�|K��jv��rQx�I�A��r?b��e�e
�%�H���
�&�j���y!�i=�64�F���ݕ�$���5���j�N:���됵��xG[�Y)H�OC�>��)�X����к���%������(�I05
��D�9EQ��n>n�����;I�٫'�Y�����3�@�m@3�r�Lp�i���2���� �˚��ݶ\
o��8^X��vNu���&�$y6R:
v�Y6�VJ+m�,`����h
١�6�K��d�d@�5z��զ�\�T��*��}���c�s!�V=H�wm�~_�L���'!�"�"J��%���J{ӯ��J��`����֤���붸�cf����<ۈ���R{�_r�<#|�"
�Hq	Zf�%<	����$�
e@%��,Es�M*�L����1w��ؕ�>R�V&�ŐZ\�����ʀ�v��-1M�ـjT����̹5�Ȃ>(�*LP���3gP��9N��c�������U�����(a+\cN�5�.2�3�Ҭ-2"9P��ZZ��k# X�q}B�К�;���ǔ�
d���->ʵ\*�,��ŕ�
X+,��(D�pe��N���N�D�N�w�� ��N�ܜ6��P���
��Z���%�mV�D��h�Y��x��D9�g�pߥ�pc�~�P�=�v��s��P�Ru����Tk.y��}Ⱥw�
Ҍ�gؒ�E�j�şOM?���yb�������mS��A�i
�K풢��K�<��:�s��vO�����W��%8{� �]儙�M��`��H	�P�R�Β�-����(���|����
�G�I�K'#0���]�V��E�\_�wv�[�i�19��󛟊�:���rMΆ,��Jຏ���b~�Vp�YdE	E���ߤw���nS+u?���xZ���c8Yp$�T@T�����r4;�*~��B�r*Nfh[/1Ȝ��o���eG�?�Ҵ�.��Gg�0��;���m�~�}k5�vdm���x�EDI�d�
��f����\�c���8t�Ԭ��gd�D��Y(�:��L����^P��(m���
-�δu�N)#�_)���ស��y{p�L���X;�O���;R5r�ou�]5���0�5"p�@3&J����������<VT¼H��G����p��T^���p��ݭ�pQ'�c�3�/��>LK
�=�(�;OΜ�	��s��<v�5&ܗ5���������t��I�q�`�,K���O+���j�D��H 4�2zs��L�	f�٧�^Y��*Z�>���g��L�E"�
w��ƽ��)�*V��6�ɩO���9x ����

h�C?1�;�c��k��	�-sL�u|)���D���h��vըS|_����'�O�q��S���?����P�� �0Y��LEw���1�f0�U�s+Ob�5O8��Z�V�Z��k1��E��SV��a�K�0��i�Z����>sV�rrZP65/�z��jrr4��7�lGn�8�Ix�١�f�b��r2r.��9e&�Z��I��B�	�� �d°&�ZR,��]ݔ$�B�1�\/�۲'kMC�Reu�*�u�g,��
}��i
�/��Y�&/i���0��b�o\�D^O[��ۘ�,�uMq���V*��q�S���:��� ���چB=���Ƒ�*�~�2�l���h\d���&ͣ���U��~>dF_��NbT��c+5�c��j±�4��d���S&��P6�x���Ք�&s����W�tE�LdI�����wN�&׋�&;K6�򸈨i��8��_i��5I�,u�$�QOYՑE	�g�e��E�k��X��<�L�Էd���7?����N������������]�4�Z�+F�U��P��f��l�j� ��ɒ�5�"���>�6�<�F-��ٛ���hC>Ȁ`��9j�1k)�6~$��1��K�d7�G����i>&�/;:��X�U��<UDŽ�-��[-�p��$��Z�z:��Cr�ceD)ӌ���Tw��%\\�q���L���I�H���3����︦!�0e��g�ȑ7u�^�D��ʹ���H���
|�|Ҏ<>���O�J�߸�z���?t����,l�7L�)�~�&�
կ��<a�k�=J�U��a��z�E�C�?.1A��H#���H\n�p�������Y�zؖk �p����s�'�TsO-ef��+���Yr��C����&��e����yl��me�
y,��5p�aj77�G�у�N��&�$�q�M��	����[�^�xe Bg�M^җ�͵�����9�_���m��2�2|�����R�Brv�A��fgA�� ΌI��갗��G�9D��i~�����Fᙋ���(7�!Ɂ�P�L5��4A�7㙺�՛f4��������uV�<�;��һ�����G�9����t•��1w^�y�f̓�sϓ�ӏ�d���'�A�Ŵ���Jtb���P5���R�0�i��3��'�@9gs>��c!Q���$��甆d�����|
�y�{��ls��e�z�w��	N���N�;�#���+ ��j҄J�
��($�2���	~g;3'8~���-}��a��RmLI�lN�dY��]J��8��
�j9X �EY9g��`�{��Ξ{��(�O����ʋj������y)��4>���؍R�=�l+����^ぅWD��J����^跍>���[�!x�қ��D�g��JyW���x���/_���"��jNն��V\�-���~Q"���{JC�w7G�u��,0<޾�ҹ��=m`��:t�q�Z���k���M�&
�%h�:\�fzc6�5ݵU����9�o�����;}��W�����M9�����G����ȽX�ڙ�2n��A;stRr�����6W۠���5�%��HyRG�A��e3[y�!̄�()P�Ni�̼G����i�4O�L__����3<K5*'�vMe��X?1F�;d���O�}cR`qr�y�07��k&ا��Myp;![��i��Ef6�������[�e�ڕ��H��=:��b���V�
�lt�eS�ZwRg�S��D[�X�I��G�/9�P��Xt��C�J��O���(�.{�%���7#8@d%�y�����}�����
�Cy�3kl`��>���&�R�)���P�
�w?@e����ЃqB|�c�����dj���Ln�+"����r%��[�
ۛ:�CCI��:��"Е��|�T�U���U�ꆀiU׏����P�w�(�ܞ��f� :��$nN���\���v�np�;�`��cb�@�㨽�!D4Xz�H,�g�*eɬ��A��yͮ�u'b!�tv1��*@�r~����o�q1gi������L���^��SM֥NC�j��axU^�i�����cyvBK��y�`���+�1��Ș*1�t�)�˼����D�r��?�K���Y��Q��ar��'����z��[D܅�2�ETɀ����Cw��V���q.�,��n�*�|�V��u�C���G� �;4�g/��O�>��������n����E#ih����<ƛ��+��H�q1O7ս\�����^�J��R�����,<�eA �[7F<A�N%�f�m��D[��a.���":Ws��*�r���'��	k��`�
�bf���P�p��􆔂nwʓ�>>|�8�����h�}��o��K�Ȯ�/��g�p�O\��tɀZ����˟�@
���
��z[S��0�@�gzNr,��%�zUw�����w��W/�{0���.���- ~�w�Zodh�f8^G�kQ`jX�u7j�si���
��K�e}����z��ъ���z]$Q&�]G��-G��q����D*�9�	2���ϝ�V�@p���
�&���c/}<����1x��cw�Wsw�?΢[B����������
J�?�>)�?)`>�>�><����P�l�b~�U��J#_57q��S
N{��y�ݝ�6@s#�s;�'�ޘ��!�#'W��
��Dܥ�;oD��%����Fj��OX��G���p�ܹG&�����RL�䱇�8�Z��|�����J�2���6��4y������ 8�x�P^���
�?}���kq��H�1%9J�x��`i- *U�p�'O�
�b���^v���\��o�p[$`;�=z��M�ܳo��|ճ��	�:�dI-q��[��˾��D2o�QS`�<���@�"
g�StFr���xJ�S@�����,���`0��zE�=eq���9�KTO�<�9"���$����`H���GVw����
�qݓ[�:�J��[~�Iő��狜��<n�����Ϣ�}�^H}�NB��}�o��4���U{�3��b�2C/�w��;υ����On�O8�nn�JB�׽���2m���h\��Y����V}�����X򝃜AN���+J���S����i�G���נ�S|Md��z���ð�
�ї '"�5psX�ܵAՇ��:A�ʉu%CCi�y?J�/;���"�[�M �`�&|΄N�XY�G]߂��[�d�Dz2U��P�U�m�EU�IAO��$�N���0p�6��2m���Ը?|�=]�G��:�@����Meq;��6�[��
�O������\��U_@	��$�R������BZv&Ur�2����{.�&)�K�s�Q�᭣�x�Q)���F`훪]�K��U6o8-ك`��@4��a)c��m���#�t.��?��:�m�?g�^4I�biӕ�mO��Ë�(�O�֩�f���Jy�cz��-��ï�������PK�yVS#��s�pip/_internal/req/req_set.py�Ym����_������w�$-php�]���@Kc���������!�BJ�7Ic�n-��>�̐�Vu�Iu<��9t��*%%TF�F3���w5tP�(*�K���ez���:��������-��2g��V��Q��-�Ghj�-�8	.z#�$��jDť��
?��A1ȵ�����om���^���T#;��.�Nr$��b�;�����y!��ҋ�Иqh�:���^Ha.��G�ِסc����O�]ZZ��2�l6��Z3O�G0�
�O
V�@a�2� 9�NP=��oI*ԥ�So�^)��>u=d��߱w�DŽ>I���7��BP�K�i� ���1�^�.�x�3J�R'�BFq]�&��P�o�Eu�C�w������<8�gw�,�P[-�i�>)�a��^&��g�G.{�i�ā5����tI������$?�kN��� y}a(3I<��S��]��_�hR�)28�u���|�t�_N��?���+Zt�IP�c�ߞm��S�/beϕ��⫟�l˞�~�.Yz/�Z����I���[��EYcц�Z�;	M�=�D��7En�
"��2R:8VZ���$�h |Q{�66��c���>�(��ኮ��6�����"	cV9�$ͮ�޽ό�ţ

�M���{��yc�;|�}V�v간��yd�_Mǵ�4֪�lՖ0����
�������砭|_׾�&�4fF����-���k�?��9X80��F'�y
PC�߅�Cu1��z��Pq�°�4��K#�p6�rPn�r�J>)OjhbI$9{*xY3�ݓ@�X�oٓ0'L*h�K�O��A;Z��To���r���Ɩ�u�&�Tb#�/h�h�;e��(�@"��Q�N��B0��/���6�t��2,�Q[�QG�s\Ѓ@M�[!��Gѩ�F�̻�'��a�	��a�B�������� ($8`G�,3	��q��r-B���b���L�����`a`0�\h�B���ao]r&�ZYu�U'D�c�:p��$μ�q�G3KZ��e|�m��v-0�*�{Vѷ$���8l��}��P��nВ]T��K��%���1H
7e��}��Dy�Y;t��]t��2g�2�$:4�Ǔ�e;�:��&2;��
X�lϵ-�X�bz����t�8\���$�?�/R����+2�q��AB�����{�`�&��e!���Tp۹�Q�""Ya���m���<t����4�BMo�	Hi��},f&�w��6lDW�u>�'y~�J~N��x	\m�

�E�	W^��ݖ��f~�~"�
�)��%�R^H=����K�9������ru�Ew%9�p&�pu}!�Lۢ�b?�G:1:F�o��#��6�
.�#�ln��>Yك_6��nt�(vi<`i��~��>�\���է��oK�1�%_q�B
ݘwk����E�'�
�a����/��"���0�F`�*+����{�0��Z6ч��\-R�
x`F��s�Q1��`�ަ����/�&�7�%��9�c��pr�_
jɏ�߇���#ఄP��"���Kn����7�Kv�<����D
vO^m�L�w�&�����	V8Ap����DHIc�r/V0Tg"~@�Up����
�P����0���;�,�å����N��Q����q��p��	��]�=�,����9��4D���\��DnT�6j��0yf�j�Dv���ևK�	����^���N&'��v������:��N�vu<���E���n˒5���3w�L6!I�I�� ����I�K�qNE6S�_�	�bkL.l�
���0���(����wM7�q�ηkN�+�y�O.5�*�V�����Z�QAD�W��ULW�[�b
s�q3ǖ�]�,.Z�������	�u+̲Hn���1�|c�ao<��ŧ�y.��mw,b7�o���}����I�vq#U�(����|��XD7w��|^J�;(�={GF��́~�v��R���3����^����P�-�rʌ��R��X7���������8�E�K83�>�8�$�~�m-��.��+�I��ȵ���2�Wo�ٟ�D&�_M��PK�yVS��2 pip/_internal/req/req_tracker.py�W�o�6~�_A�(&��=2�k�!h�ui�d-�6�TI*�[��w�~�r��@K�;�}w��Y�*m˵rb�J����f��v�X��F�M���lm�C%,k^�����n�;�V+�Z�.aWN�I�ߕ�Z�2aH-a�*���JVi&ᚁT�Ӆ(mZJu�Z|��S�F|�?����e+~���Z��M)�N�'vUVH�E������a6#@�a-2�F�w�]�e��D��g��=�i�u��جkVWw"�>kN��8~�,�r�v��3s�����{���b��q��f��m
3�xt�}���F�B6����`�>�ݥ^Ei������s�ԫO:�{�E�.|B����2�&���-T�~�JkmA�0%�2���ߦP�x��1�C�p|�,��Ix��>�co���m~��Dн#�+H��> <r� EY�h%��=a��"m�i#7t�f �9I;��V�m�)r��5;�X�>h�iT=���*�Z���w��E<�;	�(�ݡ:��8y����nf���X��㎉=$������V��W�����뗯�^^G�����2��K�����n�c�Dxۀ�v^s+p-�l�?�L|'Uq!��M\�|�V�mG�N�<B,G�]�'��^ ���zGWJ:�K�ElU˲`�"v��S%>�����Q:E<�b�S��B�����	3A�r����˲؊r���r�9I�Y�:�;:�y#��0���s�*ӊ�O1ze��G8��
D�����wx�Fg�$���+7�j���ȇ��o�E2$ӌ&����K���?���h��v���ȏE�L�����C#x.�y)���x'��Qg4�@k��/����B�
��h���n���Ƥ�̨֦�u��J�+����b_H��a-4�Bȁ�*4�
��E�֬����K&B���eQ`rO�3��Z3�xߐ
M�ZD1F�_Xh�e)�ʃ�P��]�8����hl�����=�6S����;<��x�-^�t�	y���5���QeÖ��W‹{ل��\�%IhDVFo����!�N뻺��	.�(z�O�
O^�*��𤵮N�'WW/p����h��7�vot�����Brz��)�C$�m\}�6�t%>����[���u�'�scr�Q��+F)B�/�Y��_�̢%Pa��
6
Gy�� ��NԜ��j̴��0A!�M��6���E`=ߡо�j�~�[4�2��x: �so�\J
J罗c�E'�@�ڣ����D�3������g��w��1�kQ
����b����Km�M�V>�-@��^��d|��ϡ܀��!j�q���݈�J+)��/M�|;Z���p�x.��=�Ͷ��[��j��i��s����2�PK�yVS����\"pip/_internal/req/req_uninstall.py�<ks��v�+6�dD:$��̝V����\O�c;u3��%���<��e7)>H �{����޳(wm�
b�ߟ�|����i�^?h�]to�M�)�g���	~Z��t?���)��Vf� �}���x8�e�Ս����}^U����\�b�������Dz�7��C��y��$�|�o+y�p۲M�{YM���w۬�<x?j�z�u�g0NW��8���9��ג�0]~�˺p��y�5]�cլs��V٪��������2
�ۧ�f�惆�����~y�j���n����t�; ��:�i U��:���O$,KY��v����׺��L���w�)�ڙ�r_�}�b?��M�˫�$͂�u��w�W?vC'�|�A�ڬ(
�|W���a.���� ��쬢y�+K�Y��Y6?;;+�Fd��+ہ��3�˥�U�4��b�����K�ћ���_ë�K�O�$�w2�n%iU�{ ����@@���f^S�B���Hk߀@� 
�^l@R�˶���!��ޥ����*���9�G�4V�q�ٌ��f=g��B�FR_y<>�SY��TS��$����Oq��ߛ���nm��鳡Q�5���Z��+)�X�ҼmAg���_��L��#��u����t��G	qɳM����A)Hq@�U�.���٦�4�:MS���A���/�j�x~k�Nz�������z�w��
�ӧw�%�D;�^J��=�u��0�TB�V�U�M����'.����X��,͋b�M���RV�9s��S�~�z�&��Rq1=�����7���@yY�X���<���_^>[���K`��uss��Cc ��)u�T�P%�Yi��4"`�ޯE^x�`#|�#CZ�<�1����aI��s1�w���Ψ�,��xdB!�@��(@�h-7;.����D�8�$�h��/W4�
��!�30苟_�������٪�n���//.�|}���t��u�tۋ��k���!���6]m�
	Y,���/�E��e>Ԓ໥��P���)j͝�"r4�`��w2�*���s3��T��U`�{@#c�2���1w�FM��k���*�GXh���TN���F8^�u0�)��)��j�~���!���#�,�
�� �11�����K���/�f��b����e�#�n;���-R����Շ�i�5���^�$��hA�ڟ��+�<�W"~k��j�[�a)Pˢh�� ͡��e~)�q�s����X.��\v�>��%L�ΝU����)㣐O����A`o�CޛeAgF������yy"�:�A�<�)& ��怺��}�P�bh�x��������.t�8u�ڣҘ%dLfX���o�r��OQ���lS__.��Y������*0�E�HH�4$v(Y��>�؍�(���'�=D��YF�uȕ
ؕu	����
/S���ZB�����턼ʆI[���/�|~�f���Cw�����
X�U���Q��Ŧ_�Q�B��ȅ:�������m�)�h"xnr#��
\0�N�*Y;��U��w%�����h%S�n`ޣ��a�C;K��:
/������=�h>�A���/���JӰ�6
=Oղ3_:��d�X(��o���>T2�?�u��*n�Hw -E��-D۵��:��(�������#�]�뽔�Wn%��/������k鳵�[	�[�M�c��K=`
���r���0��v~)Z�+\
���SSc�`���~���9�C���,d�=�G�����i��T�1�7�=❑�y�S$L���~4SOg=��
*+x��ͤ.]D�A�.sW~sE��L%��Ox���*n���zcG�X�[��
y��\V��I�����	=���v�;�����z�0�C^��t��8��}N������`�$��g>F�>
jà6�a�	�o?�8H�'I_�|����(�*M���c�B����Y|	���"(�	z�H:g�(�r��ɋ�E.��y��f#;��������p!iF��/pAQ9{A%rH���4�w��3�Fs�O4�M!l�C��h?�U){�yra�3�fl���5����ᶄXф����*'�N�P�f���z�w5�M
��BV�WJ
�k�s�&@EPw�ظ���/+P��#�*���*I�8z�]�@M�����r[��#���[�=�+k�-���g�:Р�g�����}R*h6[YhW%_aZ����0���B+��澐9�js�R��n~"�
;pä�J�"�ܱ|w�p�rp<<}<��ס�l4�t�,���\n���=�%��6�>TM.'m�^b��Q��ˬG����
D��!V��A��گ0W�Q����/ 4cy�Ϳ~I2m�̥
oh����q�c+/�Z�ɳ`9�;��\�T���.��A�Pm*���r���C�k�
1#��[��'5��mI�s/Kle�(U/2R�#�ĝ��
\JP���5ځ��#\4��[���A���攃��q9^J�#�w�Ek�p{�uYegb�O�Ij��{�%��T|W`N^�LQFI��yDt/�?�[J��](���/��
�i]������E�4��;�
PκhZ��!�#�Q��?ά���6`�6��B����(���
FՆL�� �v���r&6��èB�
8\���ɂ R���Ȏ�/�v iփy��9�=�k�U�@����`֨@~�́��l�91L)\�*��`�@�ЃهaG@����A ��/�=�����33�hy�����V�y�r�/����0��b�+�/;��|�M����
f��&�źiK��J|�Y[�ۊ���b�0ǩ���_$�Lt2H�\�JE�!(�]YW�am'���8���)�Pm�̴ө^���4�eU�l:^/�f	B_��!0��%��_TȒz�s�[��-��!j��)2�$��-�|�BUdx���	Kv�R�ܼ �D0�gW���#�
 �k�nFV@�;�b����o1Az�<:w|s�'���s�o���G�-ˁRڸ�1���g���Ũ7��U�"�ɌU+M�u\u4���3�{��P-Ѣ�!��	�BC��\~�4zb$�mR��஄
�V��"��� �?��Ǎ&�����e�5u�M5Cށ��SO0�H��:[��C~��j�$*�P�|��l2���1Ch�_G�8*щ(,����3c�� .�H&����҃<�Ș!���4�Jx�l���j#�"sm��Tz8�Mv�dt6G��9��l�������醞�U��N�U4zԠ�J�ۨE|�@�n��.�	���~a�
b�]9Ly���C1�6�qߋ���rR8�t�mOF�Q)���R���y�Hו��};�>��d��=G3ͮ��U��;1�_�'��y�f)�h��� ��ޤ�+��~���@��>�ߪm��d!���`!P�d��25BԾ�a��og�K�V����wF���AhhXe(�V�/h�����v��<����s'@>&"4�礢җ�'I*i7�!/+���G�1"��<7�
�O�5�Q��[p!4�V��:�7�卶$���៹�Q?285)ϕ�
�ԯ�$����؃��A|p"$�R�H��/�����I���
�ʏ5kё��%�p��0�P�EHW�rD3��
&"w?)k1i9�U̷���8�����D��U��'8�w�L�õ��~��,�9Z��t��w�wT�H���up6�m�M�_Ev����'`GîKgi��G��5`Ja�#c��i�m!��Лr��#¸`�J��<���C���
�ct+�n*�"'ׯ�Ձ�(C$��D�N�nG>��6.�ۏϲQ���`�����
P�Bf:�5k�|7���ط"���Թ-c�`x?�#c*�h�+�T�uͽ;;�=���p������\%�;�<���r�Y�v01֖���x
���X�寷~3?�B�Ѩj�6��JG��f��ZwA=Q_��݉h4�Oc
�:[�XY��dt��q�8�I�f!�e�jPG�����Kv�Y��X�my��;�xT������!����;����s�g�t���3�N�hI����-0<��?Oa.f+�ӛ���I�E|u�v^�yL/�gT�NU��<Os#�TJ��_�Zu1�<�W7�y�,ƃ9ʂ�ƞ�}},op�I�1�9�-�w�����◈Ȟ���GvLLэ�z
Kq��ϣ��'�}�A�'|T�E����&;c֧�<�t��#�1P��N����%�^K� ��<�^��X�Ƨ:'�FS�@�Nd]YSx� �<S���*�E�"1P��@4p��'ꄍں�bL��'k|���R=�W(�!���{����E��s��Һ���&��`��
�&(�p�G��N_�zP̥q11��_@�u	�9��
�GY]?1��r�c�����$o��T1@�p��'�#a
3S���}�rC��s1�8P@p�Fa5�4" �i�܏��:�1��H�=��n:�B����%�`���.��3K��7��O2�c�~|Rf�jBL����-� w_6�Q΁:#��K̸�5�6G�<�SV�RT޿QU�w�@�U0c�dA� $��LAJ8>X,��)b��/�8#B�������p?��Fsx��5<N��
̿ƣ� Dz��[��"���u��p�A��N�u�O�!�0�w�2w*��$TT�
 ��=fğ]�S9=Е��,����}�55&_�+F@�;y��qΪ�W���O?ʻ��S�L�������_&�����s5Dޤ��\%a�ނ~t�*�Z��_Dt<2`\�+�pE��rv��d�,����3�����63��N������D7HA>F�G���M���W�=՞�h����q.�XgMTb.5(�{L*��5p�w_�)���bqs֐N_;�~��L�T�Ɲ6�a>�[�6����Hx_�˩
C����c
Mр}�B��0!G��G�
?ht&Q!����?�I.��0�v�'j�t�����{��y�7��sZ!F�Mr��
�w�t�'A�m�������E����r�����I&8N�����9.8K"ٳXy��9&ȅv\y?��E��s�0NŎ���j���y<��r;??��_�&p�D?�R�Ǵ��=vtj��=^�%��Vr��)�����\v��b��#zھ��6(h��T�����x{j]��h��>k;�/���D�%&����÷���jZ=�=r�u|��O�����c�(04���	V�����Gqz��7�?�֏�V#+�����
u��+>��_�e1y6\��?�R�<n��=��{:��f�9�|>He���OZI�2b�.٠��u��^�!ᙍn@�I�F�}=
��YS��]`gC��Ĝ
�/˼?f�I��!����֤R�t%���gh���P�>w�V���+������2���������oP����{�q�ui��)"��6���_�Lwo��?Z���� BԟM��:	���ҦU��M/0��6��[>��)�s:|���G�,M뽀�'+�e�^��A��ie=r��T��I�p��o-��f7��
�+3<p�Nj�s�}/͗��a_��:,�s�ɣ�� ��ʞ�YS�
���A��a>�h\�s
�ǥ.$�_,9!��7�	�ljĵW���{�p/�
���G,�x��r:3�"0�Ŕ=x�5��@�Of]�0�x��U2�
�|���l��*�W�Ms>z���:����{��0�{M;��|�˽bL�+^�(&���?59b�|H�˯>���k���v.��T��rgۮٷWI�6���[�
s\��q�U�AW]���[�V\#0'�ݗ�I;�NN�i71��_6*>�=)�3�ȗѰ�j�4�T���K�j򼚘�r<U��/��j=L����K���k:��:B4O'�����d��������o���C?.�B~�߫��C��{;p�����A�����NM���|@�ɡN�I\i���~pAq���чj�|`�K�t�j�z��8���5>�#�-��AI�r30�i��[@Ϻ��ˁ5`-:*�R�B�N�C�$%0wywW��\�; ��iޮ�΁���=(���7��̶�j�_�^Q�"��>w���kr��H޾��[%o�ۼ�I��*!�绖>eA
:��m"��5M��)(U?:�a���� �����ˉ��rc���Ex�Mq�[�e$�)���d}	zh�AUm��WvJ��/�;impO�"��_��;�ą=o��?�B%�v��å��t�@�1a`C���3�:.�����it�VI4px�IU����m��>W�;~s��^�_�����c�6�SW#���KM�@�*A����� �X'z}%��	��m�4|�>��_� /iO����ȸk��_�˯nl��������$aA���@�_��ޞue�[�ҵ}�:u�b,0��pݾoM<|uU��v>��Ov>�`�����8&8x�ЁQa�c9U��c��V�3�������ZxM���砣0�`.�Ī�DŽ���P��.�٠�������0��PqD��	,��PK�yVS$pip/_internal/resolution/__init__.pyPK�yVS�˩�G pip/_internal/resolution/base.py�PAj�0��{L��顥�@iKr4�(�:����&���lc��i�ifg�fj@?�k�@��h��{�	<;�^�:j�7��>V�k9b+�Sw" y��f�n�tv�
��YPG��՘����UȰ��f�d���6�3�<�e,7Ɣފ��ܢ�� ��f�5�,z�A_'�DZD���=�ڗ@y��s��aU|}d�|�������鴈���M|���3�bi&{Ա}�E/�c;3�C��u����2���PK�yVS+pip/_internal/resolution/legacy/__init__.pyPK�mW!4�_�H+pip/_internal/resolution/legacy/resolver.py�<]��8��\��[�۽}8㼇�$��d����C���%��,iD�_���UER��tg ��H��]�R���u)���~���^6�l��(X醺q�ɚ��eR�Vt��;��q�MU5g�����v]�GQ��?ى��{d��k��?S�(Ǖ౶k~E��uޕ�P�5{V4���E_:V7}F����Gѝ���y��J�[Ι�T�V#�X�afIkw���ţ�:Y*�n���љ�	R({��^v�u�bgY�9[�-�;�%�6�u�������l>��f�Z�N�8�	wd��U�vx��$���I���0L@��:��ӥ�l��; Һ��j��WJ�f��6]Ϫ�p�M�WuQ�}ל`Ӫ����X)�|����9�]�4�8�8rY��"�f�^�R"�2<Y��R���f+�_?m��,�6]���<�('r/E�nL�|�ٕ?�g�F@D�"Y� ����Q��|��:��|A2�P��j0�B&_�Ԫ��&��Ș�ϻ�M�B#���.���w�#?�����޴_j5���(�_�cS��W�e
o	�ɐI�{�����O_������.��+�'��)E��J�v�[�=5���DӬ�D�;�`�{=��x����<��J\<��G^�2��q�seq��v#%�� ��E�nf; �OD��`|V	,�wͣ����C��v���%�a�Ƀ��Q<�0��B����%'���@��x>(��W�_zI���۠&�p����i�_�-��l�GI�Z×i�ҳE��$�|9��0�D��3��3dA>�	�8e��l6��r�&BF�#�l&�E�'�FƏp��?�<yB����8�d�A��od=��E_����2�M�5Ƀ$XQ�������/p�g	N���;��
j��(���F7�����˺�áW�h�A���(iX������'Y�ϢkF4�Fs>�F�_�3����`ܖN�����#�=6ꪑ&Tꯀ����$K٨K]�
-@,/)$�+n��6�<�Ɂ���%�Do�$U�B��;�X=���Ȭ&����
hXRoZA�fCF@�����~ H�Ѝ�t"K�@ϊ��PC	R�]6#bԶx�
c
-i�v�쵬�u��91FXd�Կ�m!��)6R�fl��[��X��rl�/nZp,eo��9B�T8\���μ���!Rs���a!G�<iĆ=W���g��+�(BP��Z�hN@�Mr��-�g��w��ʼn�2�>9/hZ��S�b7�g~�KQ���crR�L��~;R�OR𼛇���b��i��&���kv�nd��?u_�M�d��� _�������3��x��q��$1���IgE�!]���r��#2O�!Y-���X�Vl�
����w3'���̣� ���1�$�Հi„�z� 7�����YV�%7�h�Aa/:�<0$��1{]�1%>雵������
���_�繣��ޱ�D� h���M�Q�&������r�͘d}t�̽�z�b��*��[q�z9{:�p�F'��ʔ��WƓa�G��+p��㥰��	�G�K##��p+˲�{�7��4�����b���u
�w�
�2>KH��Qa#�N5�;qt����>n�r?.�d���"���b��S@ѓh�w�h��`�IO�F��AO�a��-�eB��!Ѯ�`��pzB�aI�ir�3iۉ^$Lc��@D_e������Q�����7E�5��J�Jb
l��&X��$뚆R)�z-�Z�lt�9��1@N��\�i��H O�wn$�H%��#�t�
�Z��-z�'��M�"�3:�F��Dv�'�g2:��\W
(�j\�5?Xh����İ���(����ND��.��0��VY~�-s�.0�z��bA��	��;ր�#DN��y���(�RѰj���!F�,��	��El�1<d�#�d�9�y��W*�l#N/��M?vLAr�"��vR�P�b�G�G�0~n֙�z,�Β�̽gz���{Q�%}�tF5a�mՊd�v)�q�ˌ��@*�>z���f�kA�	ģ�%I�Đx��x��i�K�c�o�$�QFy
m�vb�i��d^�υDO�<PX'��jF�C$�c�gsn[����QsAuUpE�E��T�^Lx���C�bd�!����
���ԃ�/�A560͍w��{
����L�?ob�M:Z�xԣM�[T�,X1�7'�3ox��%&2�H{q1d��'��ha�~:&%+�6}�v��o�1y��FO_����nB�	@·n���	
���R��hk���UIԑ.2@u��(by߸�	�
CM��b���s��y~�^6X&9�Q�:9XR9�cx2:8f\��-�x� �eb��	�h"�@������i��K�u�M@.U�N�����f/5�a�T�c��\�ua�$pҬ�)�]d4fA E��u�X�9�w;�X��q�%�fv�I��s#��A�J4��h��d|��C�딞���(�$ъU'*����Fcܝ��{x��HW�F8<!N��G�K�E5�r�;�EZ�gNS~7��V�E�^�.�eP]p&v���p�t��aCG���H0VF pu`pVq��#Ļ�����c���U�jx��Au�x)�Y��uE_���3�Ś�(O-PO�m��_�&����%h^�3`��t*;cѡ������D��5X�5@����w��("�;�F�S����D�`7$�x���++�+@�tںYw1�n��� �E&3��>���j1�^KW4p_V���E=.�+u`��%��q��p4�)����Ov����3�vީ��I���t�Ӆs?�a�S�CI���:��1��`X�� �T'�B[�@]:!|% 
p���ٶ��l��/��S�.Q��Bp�������֫��q��\YBl��%���ӭ�wF_��`�{�J��th�)Bv��`�j�H��	.Hm7P���Ȅ)�� 	oz2�	H��CmJ���g��k�y�/8	��_��j4ᰜ��L�	�O� Iq��4����B�įG�cT��#^XbdK�7,��
E#GVJ�]vCbG1���l�3�����\�Q��W��_���S���jRc
d��%��hkRN;��%.�~�z�o[=I���C0G�1���迅*pRX�HH֏�{���bp_4�B�w�j��ģ
2å�_��W5�Duذ;�
)�>*L�!hf�g����x{�g�':䡳A��CR��B�&�����񜜀��ͺ-�1W�C+����&�5F�y���ub��.��	���!����%\��Wv#�m(+s���/4�ѕ00x9��I�������C��VCg�MU�EK@;�ͤq�R��,
�h(�b�D@N��To"f���^D>&��*m�Ό�3�STn<Dq�+Fi�D �7�X�-=���ǻ۳�c�Bt@
����i�h'*F2�٘V��q��`�����n��xR�J��l䫃����^��N�+��j�a�N�5g�ǪIX@<IR	����:�hN`�V!���j�}4��b�x�58O�z
Py)*��Ovj�@�0�dy�jT>�H�l�N$��r�
A�;(�Bp��9�*Bv�iw��x[`�Z�M	�1����	{
l�'^�Ӕi��+~c��6h\,S�	@]S��8h˜�����B�t�x��Ŋx��7�<H��I���h��*�T�F͕u^+�H\bd=C�䣪X�'�ɸ0���5pL��y��K����b�	Q�#@���Z븻Jz��2I�m�ɸ�I��=zx�G�o~�풛�Ay�K������࡭�$�^+�9�A���c�줼fT����3i󐬸M�C��5B��>�~�\��x�c\��݀%@�(���ԯ ��]ys�^	9H�~>�����:N���������hnL�F��uXh�h��a��mɒ~��Z	)?�ׯ�����$�V�1@��!ۮف�^������$F�ܼv16.f�aM��(�te�8U��.���z�ڇ5�
n���J";�����gl���c��<�.�Ǔ�NOrS�&G}I��*Ο�5�j}�buu���
o�5�B���0ֈ��I-�?畢���9�|L.��c(��L�3|B\�b�$�VVH�LR��n&ڛ�$�Gk�=��2���K���&��&~����Ⱥv�8R�H�<ePhCN�+�؞Bջ��!ȐnB(�L�0��)
�I�M9\�|P/��}|�6��fG�oa���,Wh����p�cf�7��o&�U2�0�y=�.#*��QІI_��j�{EL�����]�Ò�T�O
C�k�g������T׿�Z��~Q��J�}�NJ��ˆ����V�p~�al{��̏�]�g&~���1J�ᢅv�
��'�.E�S#�f|i�.$E��_y��7����I���7 <��?*��_^���[Ԝ���þyC�e|zT�Z�'���+(>
��M�
^�D��i8z��֥���4u<���tA,H�A�d��c���Ǽ��tB~����h�ƨ_�5( ���dk�K{�e���>�ʹ)4K��x��E�����`�Ӽ9��2+�E���@d19͝R GÎ�	�2u�r7�8V�Eeh�1@|��`���x0�Щ��^�[”��.	P��t�A؏K5���;����Z����X;�Bz����Z���S߯5h:?�_��?s�!��-���wj��+�NP�ez�_�$)Dr�
��r%!�����4Ho����\OX$���O0�38a>9A�&���sD{�𝥲�:gPԷ�ā�����o��4��|����]c�Twl��7q�Cؿ�`���}*2�����"�v��Xh�lS�&�4��p��~xNx"����1���MSo���"hKM�Qm�A(U`��oL�v��ݎi�X	}��ŊK��>g'���E��'��ة��nL��a��{q�FA�l��8�t��y�
�:��*������k��3�$Y�1��Y��(��=4�(Y�f���*}�+����׼8JA�$�چG��'h��Gc�5HǕ0�jF�XF)���(�xE��Da��������S<p�:���m�Nk5�@ٺw��E~���>2Z
���t#�5T�ݏ��(r�7O2��Tq08n遘�uh�ٿPK�yVS/pip/_internal/resolution/resolvelib/__init__.pyPK�yVS�"�Hd+pip/_internal/resolution/resolvelib/base.py�X�n�6��� T`�M` C���鐦�Ð�*f#�
I%s���.?DQ��%��aA�ؔ��9��Rj�����#l�	�ɹ߀��
�޶��O�f��6'7}g�p��$���XW���k!��V������5�<V�1�^�6]	��-���`�r�Ye�J�K�<=bt�s�u	w���s�?�U0�%c��F�Ъ�e�>X�眘U�C�i\2��`�pAiڶ�����K�<cl�/�T�!��$(�YM5\
q�w��ѱ�Y��t9��؏�\��<�Ͳ�8�2I��B��>�
���eN�O-���
Z��rF~��\�'XC��ív�Hн���ˁ��݌�)��lO�LZ��,�ܦ�,��X���}H;'i�_��n����Z�� <I�����D��.�,��mr4?��='�ι'ҫ(Fʈki�Y����������-^4g>��
����^{o+܀^�:��No��U6�t,?ݣk����f��j>5�Fe�gGš�P�8L蜘O�;�HRC�c���bG���W�{�̎Tf��.3�t�e��ߺ���)��yv}�N.�B�(C���|߃�,fS�ge=���;���pc�`9zm�*$�&e�60^Af�䇼�VQ%WB_l�1�;�uKx��\�ž���c���aO#Zq�ΑY��2�/Eo:c�o^�L$�u��#��*�L�]uy��lUCO������;r
���
LN@���[�a
{\���|��$U�J��z�q���G`\�?2���Wi.d��!E�s݄�aIXN���(�@��POt�LD�S�i�*$ږ�:����>g�����$�zkf�S�2�D^H+�X�ۺ�D��H�#n֢^&���]dJUf�+�j-p�M��P�6Ů��.��$�,�'y\�ٍ�a�=�Fs����Ձ�۠#?���ezj	I���H�1V)
��w�U$����k�4�%׶Q���X�V�Y��V?��Qf�<�Y�F`���q�,̫բ(�%^���V-�@̍9Zja
�'S�#��V�E�f�a�i�(��Y���u���MH A�ո��g��b�8�6/�5k�搽��X�-|	�1�CAp�@$͆���(0�~���z�68i.���2�([{Vy�9D�OU�?���ae��(��ۍ��Ex�N��D/+(�cϣ�����c��9��0�CRoۺ�R��^ߺ��q}�2�c�K��Mk��t-k���a�H?�4���=����.�K|~�i��fڼz�XQKc����_G�5ᑯ��<D�᳃�8OL�K?A��TiS^���X&/QN��W��2�p8��$���PK�yVSj�k�"G1pip/_internal/resolution/resolvelib/candidates.py�\�o�F���bK#0��&Eqݩh�:�z�/q�(��ŕŚ"Y.eG5�����I�>��Zi�3����*�������e^^Nr�Ul�d�Tk�nkhf���Ǔ��ɳ�'�8~���=.�{�T���o#v��&�(x�^�m^�i��M�
�K��E*ډ�\�u�\�2���NW)�oڼz��U�N���=O�g�U�/�))�i�k�XS����.���/0�N����bu�4U��6��6=.0 -/�!"k5N��6�;���=8��x!�"/����sİE$��M~�c��7+�=��24��?���lm�A�	��:ҢH`T����-��p7�]ӱ�p����9�__�H
_��D��s���J��:O���)���z䓴�r8��QzĜu#�D��T�I��zFK���j�Wx*�N&h,�asm5�%o���0!�I2�LP'0�L�������V�
�̸@�xp��ׁ��6�O&��u�g�wY�
�&oW�]qv�=9f�*8N��*�x���_��_�JN~<}��yr�������G/�S�Ұk|���d�7jC�����d|�R��$�ch>��L��_'q��Թ<� N��fS���3m�Ւy�cG�E�E�
�#5�F7=2Cz�n�����SiK�R�r�H��4��
o7M�̐���*���uzœ!���᧙r-_���Ѯ��%C�\k���
�@���L7Z~3��⡗���䮁�⽡(I�i
I�B۠�	����6 C"6u]�<��U�f;zQ�� �v�m�&5��z�g��j��rQa���nq�D'���s��mv\%�<��Һ�X�����7벨.ҁI~�?gQ�;c�{��3�U��[���V=�;^
3���o�	h=�3�ih#�
h�ws��D�o�ٚ7�5B'M��C�T�dX?3�R�4�A�O��4��.�	Qm�7H�]��%�0�$��#��N\�(yl�;��w�v�MD�x�Dž:�lV�@Q���ِ>�X�m.�����V�PRӈh�E
��V,��ʷ|�ZjP�c����p��%{�O�͛X���
pP�k03h,58�p�Zަ
�4.8b�T�P�Z�^^�MU��a%�`mSؒ������1Cx�cڎ���eħ�1w���[W� i\��,T��_�[.���M���A�u�Tu��+e�.x��g
0@�/�:mҵ���!��j���llO�B��Z�)�r
 NEKd���]ƤSL:����)-9�X�������7��t�o� dl��ʜ^�~o�بQ���3vD�s�M���{�[�L��K^(�i�P�%�lR�*B0�XŊm����Z�';B�TN�}{|��oV�0�A'D��z��e�zX���w��.4�0hG�t|������f�~�z�c>e��������9����6N���8�b��:�t�a�����p����A����~�Ζ�ZP��y����4x8uO��𵗵BL&2���6;��K��XpKNG�������4�����:�"��:Ib]}��R�#��G6u�+E*��\�-�W��ʑ�S�"�I/b�j3ê)Ѿ�����4TՋ8���n�БR-������7��!���}��a�-���1=�#
?�Y��Z��*�GH�U�R���
�Q���;�^�7�a[���a�e9qX`_�! �R&f�u׬/�)���l=����;<qu�aLUU�	���|�;Rh��t�`�~�b`��t/^B�L�@��j���]�h8��A9���V�n�t�LAQa��c���xF�	a�o�����]b��*��\bn[�G�#�@�����9t�v�ݐ�#�t*�t�;-�,�E3����l�`:~��f�Z�?|{���^_���~�e��7��?h��z�ֽZ���UdE}Hj�Ԙ����iW����E�[�d�!x�[��ey�f�۰2�їv�T�h1vz{���)�t=��]�-��
F�����C���C�߶d*��tqB��A./0��-VՍ��%�
�?8^�A5
�ױ`{#�`bv�Cq�G��Ao;��]_��B]��&�x
����50�b]��}����=3����^��s��_m���-&]�s��
�?Î�'ۜڼ&����X�dIG�|�V7���a��H����+�th��r2z�����R?�CN^1ûn
�_�P���.��'c�U��ݦf^���\�J'���q�,F'N(!4��E��|�W�q�/6�a�Z��������^?A��}����a� /o�����w%b����
��Y���N�M�s*OU�߅���9x.�$�v0��Ԍ����#��?M_ZҼ�C%�?@����vaz j	:n]�l�VU옪�ќ������ xz��{?������ׂn���S���4%��7�	E����������3:�tG�)7��������(���5�&��t�y�Hp�U"��ou�62���k��͆[��
�q�[����&Y�3w>G=v�}d���\���2G������}d/j^c`������t�@��U%�eX�-
8��M^db�05����cß=����;��﹃�D�߹�{����F��M��"[�}ZԻq���IE;���;r��'-�}�4�\ə]��u+�ѭ^����̀}�~��n�������z �*Ȉ�f�c�WZA�����-�Zl)�T����LX��&x˼�K�nv��1��3�
o���Q* ��ӱ��c�
���9%�M}٤�"=�ݥ#����D���@]4ZƂ�a�U�(��v��;S��y�3�#.	\���e�Kunx���	T�j�|w`�@()�
L=�e�v�Ԅw�%|X��em��>��oSb�1���|b���#�'|l�}�EMȚ�B
	4S�΀f�KE;KN{��S�G=�U0�-�oq�)T�g�9M<�`[2�*[�h	1�ܭQ�2���*�b����*�̈Bj���+�UuF��nj�d�lyزt��7q�쟴��_Ll��K9t��x[-���7������@É��UzM{Q��i�e��a^g��&�q`�
�>��=�7S���9EK�U�O;�UQT7��>݂N��1�Z�6e��3����%�����!�޸�k�"a�Bo����
���Mjfx1[�e���b�Ŕ���
G�&���M��z�t��֒/��n�R�6q��D�nxQhrA�8Y�W�v#�#����C/��UŌ�|�����ɱ_�B8Ff
��%��E6��zQkq��H]��ˇY ��v)}�8!2e@�� -��O\+�V�\��q�a��Y�!�bE���Z��
�I�M��a��m��-�(�"fϤᴫ�eL+�ġ��!5�i��P+��x%��+.�2xY�k����+�IwHypg�OAl��J3�Ӵ3��绳:���	�C����zW�+���*L�^$?�hI,����mNp���ݹ[����(��r�K[S��'Bi�j~��)A��ִ���O�鈶�M+��[ l�[B�7���z�^�e2�����;A��zo�s4\�������s�(�V������Zh��)Z9�f^5-�B_w;61�a�u��q'�)u�t��e��h��c�{�^lY�r�T����+�!怅qJ|���B8� d�k�e�>{wRcyiC·'`�J>l�K1��	�`��}�bm<���E�R�NV�/�a��DS�8B^�_�����/��ty(6OT�MO�������P��<% ƬUڰ�T'R��⛴)��s���O:;�H-�>| �B�Ï�Ɵ���| ���yygw<��!����e��T�/���K{�EJwՎ�70g��=��7g��+h
2�P�
lB��h�Snfi���3���~Z�ӕCHb�'����{G���ԩN�-�O��/��|�!!�]�:�ˮ���k1�w%��O,����\�ۙ?~)���a������A���t6����3^���择|ƉF�1���Q$*�@��ǧ�NI'�s��vA~��$�Q�Щ�;nd#�i��-c��p�?/��cE�~ڳɋ�s�V] ��=�L�b-��-̍Sn�?�G
�-���X�@aOXz�S��j���H���/�;[<��{|�H��[��PK�mW�����j.pip/_internal/resolution/resolvelib/factory.py�=ko�Ƒ�+�����v�.��n���^x�8�"��GC�CN�i':����~?8��p���fuuu���i��~Y�w#�8���Y#�]=�}+􍶿�m�[})��_7�g�߲�qL=���.z��|���W߾}��9���G�כ���>pu�v�Cu�r�j�y�]#Ԩ?U;�F^���|u��闾ߍM�U�������]����<�_*5G]��3��]�+�{ޭ���U�]�D(�|˻Q蕾�Y�`� v�n�
����؛��i�K�a�����s@�뻦�[e�bH}{�a�5���I�n����7�����z�[���u7�9�q�yK7R��5�>W|
�9474�~|�ﻕ�N�U�V��0��wo��솾�B8���jU���8Rx���ϝ��pn�z7}� =����Rp�i������k���˻o�f�嶯+��|,�l�$�V-E��C%�K�9����jߎ%������oE�6ݝ���}d��A�%���;�N\T�����)#��$Q@�
ܪq؃����ȝ.�y����zYu���}
�Vo����AJ���w�
In)�d	J�O0�`����=��N�~��	f !��ow@���m�C9V�>oh������������F�z�
X��,9��Q;.bCR�o?����ԯ��H�%��ϕ��
����f���^�}��H݂�R�m�U;�juP��Wv
z���z�jF�D��0�n�8�jB��a%J\oY�ۊۊ5�2^�GF́�@�o�u� ��S�pߵM݌�$��F��q�����)�=ڬ}ӿ�Wn����}{&Ų���m^��j/x�G�$�9�\L/�G%�#
����Ы���M����K��e	�x���g����:��N�n=0�5�ӈ� �?�Ki�[GE-�ݩ�7W�ג��a����a@��D���[�#i�F�M��� ��J��f,��J�v=7W��-|g+�?,R*��Vw�t���´o�*��X���z�v(,�$�f��7�:k臚ô
��qs��A��|�6K�;�p��.�(����iǯH_Eq}
���&�����˅���/�j�����X����9W�8��o`��ʃ�H�Kˍ�.��z�ý�0�n"��;���k�g��7��]��i�0h!߫�E�]}|
�%�ŐVs�����\�)��JB1l��:b�:�#8όş�&�����!5�)���Y׏��z������76�:C'�F��&�"�����H`Az�q)�m�`
�����|S����Yj�'��C]��?!(�|<��F�H�r������Yc�bP6k�؍gθ�R��9����Mm(�)��/Sb��X%i���[7�;�v�\�4�0�"-�j@��B���<�|6;:�Vܢ���Y�X#h
3�),A��x��t���qՀ��9L1sHL�2���:3t����K�@Ҭ�	ή�ķ��Xjެr�>��,�G�7���8���ז�)+���R�Ӏ�	�7+'Q�u�t����Xpd�P�<&|��vg�m��G�E��)���m�T�S��*�枹Qj�I�#�YҜ����$5tT�=I�15��pB����K˝�mǙU�SX��k2��Q2Φ�t�)�����wŃ�-=_����̟�Jn>3[g�h��/t�X3���R
n;��mu��Xo
���U��ȼm~�~�#>��Ա�(7Բ��Z�\�r�Z���sx���Ƭ�-D]E����yx�,�
}d��Ƚ�Ny}�����zӀ�pN��̓���z�!��{r�+�ӣ������!����n�6�͢�J���R����U�%h�?�=(�[y꾮���g��2����1�_������+.����5�Gሷ���dL󩼙bV�EF�ϓ��y�0��G������,̴N�n�9��օī�;f�T�^I��I��J�{��50Б4T� �͊01�v�.�&��i=)��3�`�Z�kŜmK���3�ƞ�6�d�+P��1+�7|�쁳_�,כ�A�`�p�I�"��U���}�0�ӓ+�-���@ܻ޷큠��_x=2*g��gu?x���m#��@�F��a�܂�b��u��U��`[���,��yFl�q ��z(�~���� *��5��]� ��ψ!*��Mv`R��e&6]��Q����*<�g��4�l���jVz�����SY�p�_�J	�'�#�>K䧝[�eY�G>kX��Iw�V�Å�x��/���|�f�P��)K`A��r�Pur"B�G�Ў��!pm�L�r�a��X}%WvC���既
H�xbk2�Փ���H%BNJT]�����#��14�o�W��k�6�0�5��p��퀪���v�v�����7��G�	D�����X^{>{�:���|���ݥ�S�H�Y�ď�2Z��Y@�KOd�+v��k���P8�׌y�Un��H{�����K'v�:y�Ҵ hE��!rkN�K����ס��r�J:���-��ӿ�4V�W������t�	�x���t�5n�k$�2a]�>��C>s4��ZR����Tuw g���m�z���X��mv��$�&fY?>x:p��[^��L���h�(Ԧr���c��#>���B��'��/r|�йh��'"���`cb��P�d�WC�fP�CH�Fk��}���N��r9gB�J�㬁��
�ꩦ��^<�������]5�Mզ��i54�ᓥA4=�&��	m�'�6�>�Q[�*rՎ4�̡�MЫ�qZ�8L�0��(p����>�"��C��H�+�QS�����&I�H���M�g�b�w��לi|�v�}�����D�y�������ڦ��6o(3���.ʡ@���숻�xpl�ZB��T�\��дA;�\^x��(��XNo��v���9\���

�{�ھ���'�5�^7��^9$(�b�Ⱦ��ʀ�=�Q�/�PDb�TS��=��o�Z]SǺ�்�2�V�~�Z��A�{pL�l:�sm�ȝ>G��fK�����j:�В�
]��v�.*�o�Z"������pF?��
�T�Cm�D�#�m��h2bH�@���݅ۖ��'JY���;kp����q�蕥��
�y5��
1�naO,��Xb�A���d=[ނ��=4�Cs�@�I&�=c�ѓҨ�v1d+iT���:<>��5��H�/b�_�h+�����{zs��ԣ�Ȧ��˛�w����V��*C��u�R�(
�w������F�i�
9I��Pkձ{���}��~���E��3��=�R��`��[�54jۥ����'"ӝ^c���RiZ�L�ha�յ'p��\ٽ
�;�S)��)0T�1w%�ZT+G�d6�8�B���%ȼ��۵�簫e:���l�j�R�0�C04ZK/�,�mw�4�=lD�:�I�<><?�A\�:)��˹㪂 �Sx�K��*o�	ް����c�)�;g_�c�L�*���UB��l�W鍌-'��)h_�*�^��"XE��s���`�zc��+cUY�7�����&?�k���%����;w�I|�
,��hM���dN��C�<e%j��M�>?����pس\����c�N�0�
�D��T`�2�a[[L(�>��ʠH��+�C熬Ri��8i�C-}�=��Yc
g�|�0�Cp1���)�8�H�>T��-Ԉ�W��ΨS5�w`�m��ض�Ct��ķdo�:��3Ds�1���w����,X��F�+@��
�@�<V�(��h��R=��P<�N�;_�U��D)-M��F=��u$d�Dk`��HŐډ>�1uF����;�]	�gRk&�(H;� T���?���Y#
�ؕ�@�FcF��x�s\&/�s^��Ή���f�Ȝ�.�N�G��u5%>�LV�������fa2��+Е�y1{�p�k�`
";�L��I�r�,:������,�R��;�H�>Ӥ
"#1�F갗�$�mzNj&���|ɧ����(�t��P�����JS{׾]Q*���d:��ӽ$X���T�&�]�A�Y]�؟��k�P��t��Ŧ��S���8�C���}�[��ե<ks��ׂ�c�"� !1^�⌅$�#�n�9��cHg��l�t<ẹ�P�Fw;g���˛������X�6�Jh��p#���$�5�f�M5��
�ڌ�6���*�:�.D�Va�*6E���wA�$۪c_��p�he~�[-˹�4��m�PƚFc�2z/���"�0�h������Ƀ��I=T��9ʫ�9{|��^��iw��~��[U���I�$|�נ�d�9iUM�.y�n��zض-6�;e(V7 ]ɓLB��KI�/Qf�;1Q+t��d,���Q(����ɞ'�I��5J�*�(�S��'���|�rQ�s�-�Z!]�i�M��%�>�S�(Y5���,S)�$�U�)�d�$�`-W�)�\+��VK����=�G_i��M��ׯy��!�6I���7�F<�@�h���qs"�<���%�8-1�Ðg*�4�����C8GD����p��0�,u�d�%�!y�8�ᜃr��=C�Ht��LX������?3D9v~9�{�~pz�
a�Ks���lb��ݍs�B���x�UK��IuO������e�4����u����x>����
FMć�;F~�񻾿c��=��Z�e��PpJ�����>��M)s
?�����*�=�,�����y[�*�t<ձɁůqQ}r.[	V�z�)�/'4���U��M�L�е}��'���7���:z�`�f�dÕ��M�4{����t��ÖU#�	a�����#�M�bS�b��V{�Q
"�M�&���f;��`$�ց�Y��{_J6���͠
?	��9ű��h�Dc����L����k�q����=�����><��8��Uvw��ƅ,`����D"d�ߛ�d�7���S���Y�-�^�,���#6��Y�wa��z/��;��,U!y���=�(ͷ��kAk��Չ��f1Ӯ7��Œ��9UH_[��m����#ܼ��|<�������bRr�ӯ9�3{��Fo�:���V�:�Q7�FsQRh��������l#uKݶ�M�2��H!��u����ZP��|&��u����
,(�E	��hn�X���5�:��h�A]���Pc�"%����')b�)�0oa^�JJbY��X4!�k� ;f��}���@RR��n�\Ǐ�/;wĘ�=���Z�n0N�����-�\&6����=y��?��~��ب���I]��~9�;�G̩���3BZ��Wj}�̢@z,:f���u���Jݸh�Ysk3�"Y���8b_g�Pu��
�	ǡz(�1:uK��'X���H`�UE��U�TR��1�ˉ�q0�t��eާ�2�+��L����~H�s�.��m��CX���$�dC7�/'�^�_쟂�].'���}4��CXKr��ȫ/�ݸ��f��L�ٝ=Z��kjv���dV�7�b����Y�j�O:�h0xG9�dG�[e9ȼeg�"4��*쉐[��zJn:�Y)O��\�TJv>�+Ť�ӛ�)�9.�o�GE�k_�͏
��Y
�3i�J����u��*Jc1ϫ��O�%��YYL}֋�%�t�
S��v��^�'N�9���#\��{t��f�%��H��ĂS���Tڹ5gD�c�^VX�餽��œ
Եa��i朚V%�zhFL���͟<�]�z��U�xE��>��f�$����KMG�nj���o�\�Kŗ[��b��4�s���?�٧�d�y��r�~��d�^�vGi��DKm�]�+�sY6��a��:���m�������� ���ù�>0Q��"�(�S�L�9CQOIU����6�Xy�'�1`�>��,�@]�)i}��-�Xƕ�+O3XE����S_�tSC�bai��7/��vG?�vS���>CuJ����R-�R���q4�����Y�)�0�zʩ9
g.�-��5�o��w�3Rz�a���<p�bk3����-#��
H��{ҵ+��'���C5�
�H�U7�`�V0*ۡ09�3�d�4Jp�K&O�sA_�������'����繩v#Řg�M��T��	�k��8���[ZWt�_+��uN�
�ܤ�7phOku�D@A_��O9�盅鴤�~b����jT�ܸq����8�,�$�~�=1��`��)?���7X�w��`�,�F))�����`��ȷ�]����;�ׅ�KnJ�`�M�
ց�D���$k�������q�:�DZ$Ì�=u	��I�s@\
NQޡ�A��d�:r���K��s��:��/yn���W\��s�K�O������Ғr���r�f{]0Go�ϝ2���t���R_�";���I�6���M�DQ}z�ê��":f����9&&b�c.:�^�3Z���`C�uU'�R������"P
_u8�D����[������b��zD@pTa+}��ףg�B�r��u�Z_��R�K�`@z���||rs���66	BRYZǑ��+��v�)��ס�_a�B_>��V�u9�O���.2םm�}%5����kp��3�;X��ߟ�∌i1��r�
�
u��
��B0A��=�.ufвT6���D�O�R�pL�8i����?�:�� �_&:�2�un!��#�z����	��{�5m�ߺ,�y�ʏ�nq�����z�-�,���
K_�@������jի���LJ�GoC��Ů��o�@$���8Z��9gQv��k��b��(}�����(薰{0a�0ی�N,^��s��aWM��w/��W�/�r���e��� �L���p����PK�yVS)�Z��I7pip/_internal/resolution/resolvelib/found_candidates.py�XMo�F��W,�C�@!��
���MZ�h�n��h�Z[����R�R��.?%�ѩH]$������͌&��oN*�$Y�P�G�v"3�:i����҉e�3+
]�yEg,#˛^��E����lKf�Ld�:(�<��X�;!˭V[�QA.[��{g��ϕvT:�*<�������k�f�V�&�y0��,v�ri�����r)�IÅprM�
mN���!#`�6i��ᖨ��-wl��g86;cX��Kw"�w�6�;���N��z+�N~�ҕժv��(�ډ	�P:̓RmT>wk*;�,�O�YvH���
���dErSi�DQ���Z!��L+E���*�ԯ�WM�3�]�6�]���mr��۳���0���\���t��s���f..*V��9�����+EQPX�*N�T���U�ݦ7lgk|sO�&��{8k��W8j?kCE�eN�����$\x5���yu��
��\.�T1vq	�ڈt���=(�HY
O<��Lo*�y��[�\\t���@�N��+�Wm9�WK$���j��J���i����8*��xg:�`ٜ_��h�t���(e(-@pƥn�%�;�HL^Y�r;�̅�ߋ9�U�
�w�*�U��m���7g?�Ҟ
��fr��W63�r���c��_,�/��[���+�a_Ze"7��l��2��
b�ٜEQ�S!	M	��J��.:_�j9�O{�>�!2���7O���;1{}
Nd�K�E���\[T��i��P�(U��|��Z�dP��^�Ͼd{pLC �I%�-%�������);�x�^p���f��Yr�Y�	�n�rb2�[B��Bu�\����ipwYSw�
R�ڛ[������m;I*����&�i�O���!.�;��Ie�aQ>�Z�T,�T����#��6ѵ���?l��>ǜ;��K�nuucҜb�C���tmҫI��
1�d!�u��
�G��쁕�}Fh�VV���c��
A<�`�1����׈��U�A��k��5pـv�"Z�R���a��6%���ġ�X�n㙟smЂ�0��F�뛵/-�\+4���8
�*�tY��D�=�h�y�h�����us�(hǼ*�O�MU����ЕyZ�7�a�����tG�nCO�y�ɠ�B��[bq������!NOZ#Ʒ?�N���ٗD�D/�	{O� ZB!OC��r?�Q�e��Ӄ�p�1����v�eTFo%(c������t~L5da�	�s�u6I6)6Z�3��q����m�w5�B�m�Z9	�Nn��͆}0�2��IX˫���A��L�2s�_�y��	3p놝���N�������Ȅ
�#5^e�p��?���"]�L�$ZRż�vC.iZ�hy{��,��=�u��k:D2�_aK*j79E��m (d�Q2[����p�b�yO����d,��فޱ�^��h���m����o��Q�}1dƶ-�`�B�-vlX��ݶ�	�K��X�}6hj��D�ֵ
�x�(t��D[�F��T1-�^����,�a�S�I�%Н����$��S���d6%O>!�+!�{����t�Y�o7ǜn��&R�	d�o��3��߆�Y:^o7 ~NmÈ��w�н�9̟O�Y�cz�.�#�l�,�"�~��+S'Y
�����ʏt�b6S�0N�}4/}�r���������YZ�ѿPK�yVSU�-�#/pip/_internal/resolution/resolvelib/provider.py�Y�r�}�W`x"����M��9qO��q��x<$Bj�`�:��wm$Jr��/�H`�/ko�}�t�֪�ĺ��6#��y�m�ڳ���z��ǟ�o���ܾ����ߦ�+�n����*�?�JO�w��{S����A�k��������&/^E]*�kaT�**���^e)��ݬL�����/��|ō�μ�u)Kނ�{���T`,�؋���������?~�{��������?w_�~x����_ـ�ҧ����h$7�)�#��ߤڽ��4�x�w#����p��-
t�Wlq��S�xL��h�ݿ${/��q����HTF�������1��	�Ee�3;ٰ�h�B�����wϔ�3=�����uō&�ñLj��qV�ܺ%W�����xy:g829B�0�*b��b%��G�����6�'>6���? ��Y^���/�(�����:1�-IJH���*f�����M̭T�L)��/���AK�m���GE���C�G�ԏ\l�^fj�o҈q-��F֢dҹ��s�luh��G0����Γ���6����WĮs(�E�S%ٽf
׭\*�(X�mY ��Pbi\JSx�l�(��iI�D����V�E)��F!���9}Y0Vd���L���'�=�y��k8Y����aZ��5��F���Ò�Nq�i�z'����������>����4��j̐�.����L�))#�\�L���e�^�F�G�I>���ٽl�<'�`�C�e��L��4I����4����K���
,ۯ`��
3�=I��Y�`�lߊ�����.W�\�J�,�5HcV�=Ս����J�$j��;���1��.��Y�f8o�˔ԡ�j^���m�4�!F�g�?ĺC8\P|�(";�Z����
��+P���̡i*�HV��/Ki�{/D޹�y�ϊBֲ-�q�#�ʹ��f�u��&��'|�;�s8{��+��p�ܘD.�*0�&l��Q�{W�L^tY�����n+68wA
���tpo�.

o$�����K��5	��_l*��g�Rsx���ĩq����-j�e����@>��oNcq
.�.�
;w���.�,�#�f]_��S�)��7=.3��p-�:�_	Z/�zE����aۋEx;�;��n�@ڥ{��O�E���TVHy/�
�:@~�v�ё,؞
�V���3Cx�E�l��%N�@�$T��8�Q���їL�S4�z�qo���Z�C��juhPޢҽ=;�e�����2JH��-tD,�#lJ��)��p�S��>���k3$֏��A�l�D��Y�l@��uO����Z��LJ����
A^M���؊�������iQ[LĀ��z�b�X.����!;tQ)3ėV垾f�d@۾���\W����n����i#�icA�'��yŷj��t�-�?��a/4��F�%D�ch�/�e-.���a�#�\~�����L�D�U��Z��V.1l�����5uiu�n�JV�=M�8��ϕR/����X�T�ZR�W�CGSVPG5�)T���y-�`���lƟzF�`g:�����yw&yM��G
�!�kL��=D���V=}�\�Eg��琷~�[D��S��6��%C��U�4��m���"�LUc�Bg� ա���EB��@��I��mኌ�tvG�w�K�:�`OQ|�i����J��
t���#�^���Sl%o����d��3y�}���h�g�埝�#����8M.����8qH3Y�H�Cg�ӄ���!�#,"����_�>��Zr;�����J�<�C�Dﺁ���O��j;ƫ�,�.9�Hb�]��7�p]݉hQ̢�)vą��O�>@��+ʶS�*Y�Z��S����liJ�L��Hb�k�$J�76j�@�ܼ���H{hZ$��v�&0�P�0��^�<�̑��nG2�`F�,��`k�M��cK�j�8vSiu���I�Vs��q���B��n��S����0����&Gk���*E���<�6�N�6�w��D��#a�N
c^wsH��-bَ;�ND{�q�"�W!y0=c�sçj�:����%Ǩz����F���#!�	ӭ�2mS�M�$�q+�H��v¸%E+hG��ȍ��*�1ВU�؂c݉�~6�ឳT�JP����3��ȼX0硶K+��Ւ����"�23��Y�����\݃f�Ip-%���G�3D�G䜹�R����MmC��$��SV�ƭe�v����J#M1x���00�K���i+�8$�49>=��Z�s�{ϟ���Q��w��{N�5��`��y4�l���^��¢"t����p�p?0���g���xV>1<!�:���1;[�\+8��(D],
�(F,�Y���ۧ�=>��l!z��rM����xj�v���n�d�DG��S��Ҋ����Ҝ}y芨[���D�H�I�J2��_���`��IL�ٺ��g��n�5���'��:� �_y�,��Jf��%V��0�e�HN	�ŊV��㊓�5�q��M��Y�֤�G�XDv��!,s��4��;^�_[ؽ���Ե}F��I7q��ab3�_{��D6iE%���.�ݶlL�	�J�=5,����8���~�i��7𿌒k���Ts�r��u�u�6��6�h��H�%��hm�N��D��5Mnu7ӯNk�*�����M�-���h����ND��S5��<hh����0���H��l�,1��-z��e<!�����:k��`s�Q!��^��Ĉr�%w8��U4B{��su�
t �#
�6��!���&=Rc&732�(�N���v6:�5�(s���z:����iKy���ѐ�dw�5h�Zf ?I/�
Mѡ�r1&G^�ވ�d	�dq��bk�:x����d��s���/��!���$�L�+/�U���6��A
��E�Вl�\��a(��[�X�6�e71a2�����7����r�~:��?D�W{����"u)6�P�ðf�S��x{��_]@�挘_��_����b~äx�PK�yVS�~p_�	/pip/_internal/resolution/resolvelib/reporter.py�V�k�0�_q
1��^�!��eP��2J1�}NDmɓ��B���Mܲ��͔�H���������瘐�ʂ,JmR�D�S*Zd�\o�Rm��-�^A��ҡm��C�
¥Ch^*e�{T�6�A��=�r�_]�����x�.���׺��R�
�n�W%
��$��z��c%
�c�X$���ɲ�^���h��o�c�$���b����#\k�;{�2J���7���/b����%�TtǒF�\�뙠�Z�6���ؿ瞳���x�W��OH߻CS�2G�sZ�c�<�"�<i�R�\R!<�d��~��R��0샤h�q�g0�p(6��:��S q� r��4�&??�/F���:�������\+Wٴ
*[�<����Bnw
1u&K��2�9�l�+���C��m>���2��_	����:<�i��™J�,0�#*m�Z��.��^=�X�]���\dz6�ۊ�Y%w���m=EN�ظn'�
f� 7	\���.���Ӣo�1��$��A�&��BW`wp������X��}���h���K�!��7H�Q��6�S1q[s
�����һ���5��X��WZ��k=u�O��%n���xi�z�w�
�
����Н'���r=�OΎ$��6���-	C�)Ϝ��]'"�|�?Ɗ
g(m�Fr��<5z�sb|���qS>O8-�T�J�k�	�i1��nY���5ְ�"mdC�%�D��;\�z�ƜW2C�7��1��3b^����h�&�F���PK�yVS\����O3pip/_internal/resolution/resolvelib/requirements.py�Wmo�6��_�j_$L���V`(���>�@K��
E)$��5��{�d���,*0`�$��<w*dU���Iz"�dR��^3q��2V0������&�+AϊӒ�f�	}�dI9�
�ZBL2**�2��
\�yPLh���D­��Ҕ�=���_p�0	%�I'+�`�-9˩Fm��Ϫ�i�x�1)�m��b�q�y���,c�;z��bF�CAR���4
��^�U��Fd�z@@+e>�p�Βe/7󐕖����=��Ha��!X�#H�������p�^�]$�wB'd>���՝��J�Of5M��=�rhj�3��ZV5H�qW��ϐ���1L��F?�9ѕ�c�s���B�W�:���W�ġiOnOo���e.�� e%I�!ԁ��8נSw2�jz�Q9=�(���c3�*��B
���決YU?��U�r�Ε��g�0�]a�#u��0�D™����1	>a4�_J�FLD����i0��@ ���|ђ*�C��
B���v=���a5z})a��C�Q��<b����r���h��Ά�l�d����F��w䧳��#:lp��J>i����{M�E��2'z2ax���w�!YU�t����+'�< �Ԃ71�-&I���`���AIo@Y�s�X	+�IYI ��)���ќ�81�gz]5�ÑL��P�bٚ�kl�@�4H���h8߼�b�����W����<��g
&��[�iSc�*AW�:������+��!�t�At�$YA8��D����Ln��w���Ge�����13��� .��W��6>��<����'�D���ݰ�9Vo�y�$E�Q�j||S��fM�L3�Y�#��P��)�uZw��0}�c{6Q���s�[u�|8�)��D1���1�3���(7	�1�*��ң^]�,�����D&�x{��a�xr�^��m��$���|�*�f�L��?S�d9�_#�n$Y%4�!?�C��X%b߭�O�1��5��3��
��x��A�f�
�ρ�'�*{�y�̢��4MP�o��)�]i1x%���t�~�ߓ���u���`q��틠��v�r���;��Z����[���j:��Ec�����ɑ
�^�ol���;ڨF���?:�v�	_�#�#��٠+���ݏґ�?�u�]�̬�L��kj�e]����gM��2>E�i�dXoOd�m�#a#�e��2z)Y���x�=�މ����)��A�ߋ�:�s�̾PK�yVSWc�l%/pip/_internal/resolution/resolvelib/resolver.py�Zm��6��_�:8���jڏƩ@�Is��b�\q�[(�DۄeQ!�������D��f`�/���3�)�c'�&۾����q�Јݎ�;�(�l+ő�S�ĵ������꯯�~���MF^�Jg�-W�ﯝ梥MF�1x|�w
�HE��YI��򁵵�yG����^�Fy�mE�+�����Gv>S2%����*v��+���U��n����CRnm�$T�۷�驙�Ҳ��+.Y�Y�F�n�X&�h�g~�o{ƚ+lI
�m�>;3�r���ϼ��?���d�1I�*�$�d�.?��摵��$H�	��Ai�4~��}�<5Y1�X����ݖo���o�/��7R<�VDN�܌������H7/d1#�Q�ئ7a4��
K��h�W��yM5�șy�-�P�'?�'�8��m�k��S�u_�
`�7z=|�!������P]����l��)<��;�ߚ�EiB�,a㳪�J
�������a����;�H�2gy9��\��iŷ�����آ�J�����W���mI	��,���X�͆'r�
�q�
�uzc�#�ri�{=�����#=0W%��	T��z�J������q��|�
�ʚu�o�V`�Cܺ���/���Nz/�騭�rb��}���f�q�5b#0��D�m@��er�G`�y~��E��Nu�0����|p�r�T1��T�[��<��Y�!�
_#dFۉ�C�nR/�
��KE�=ᡈ�����x�%Ŵ!9|�"�<1Y��b�<^�NJ@�h�����8CJ<�G�0jY�Cs$Ǩ~!R�&�H����<��8ڳ�P�Mj�K�n��d��$y��P	p	�S���u�^?[-���|X��p�}+�W��YA���VŠW�&�:����	�'n+��=i�h�w�@v~s}S޾~��ۿ��-_�~���iE���\MF���`�ּg�A�`�y��d�&��l�*�'���6�NHl�sBB�_�<�
CC�EI�˱r�6.e,���,�j�0���o/?�1�]�<����Z��S$3��\�N'�X-M\Ťr�Py�4�xiF%vg��<��g�C�Ö��y���C	j�7e#��%|1!�E���t�d<��`Y?�G��	3�
��b�*C��ܶ�7qkfre�z�0U�y����3r����z��ؤm$���Ж��$�9��0���%X�fa�4AR�m��X&�,��̥H�X�aX�V�y���rI
f؎0�-��&�v�D��{o�V@<�`sa��>��p3��0�F���o�0��^J
�mpZv�5]��(�X�G��C�W�����]�B�	q�/)YT��v�n5F����yԌ���\Sd2@�d3���8��q����O�Ph��� ?�pʄ�T��m+�#��L`&{�8[��޲�����:_P�3<y��]�N�m�mSs���=��XG�����I��6��<r�Y�#2��/�s�Cm�����Hp�iB6}BXa��ɝ�g����s��e�5��_�`w���໬�Am�є��{��h{�#�HXD���fx���]]_�	�J`a@AF>��5Kʥ��$�s�#ߟ��v��4,��X!@
���X�Ƕ�˺'
��ݲ��|A\|#���_ܗ���QM��-�.���Zk�N�D�K�X;~=���v�:�kT��z�N��,Ť������ښ��B�;���Ȏ?���Dĝ���G*��-�������i]��:*�0f�Q�L���ĥ��l��⿘؈�Q�N���,��e��gջ��؝���ۘ	O�N�c8���7��d����;�� ^*�f���0���\Dc�R�����2� n�܊�1as��L��=k:���a���쎿F":�y	�06ٜ1^���}��g`�
�ײ��^����5F[k�
�nD�N��5�5��M����Dv�:&����l@���D�S�0cQ܍G`kTn8���y'� ��ߘ���rx�1���F�kLO�6̊%���а�8� H��eOӁy���ft@6u��7�d~���ȋ����rD*=�k���s�8�d3��k�>�`���,f���ϝ��dQVp
�E��E��;�-ɟ�wɻe�\�#*cIJ	�#7��񁝊�}g�9m�`)�{�Y����$]V`2O�92�3�O��2s�6��1�$s��Ƹk2�^,�
7�x�cn�
����������d��0��R|���
��jOP�7T�d/��K����.l
?Lb�HOX9�;f�	B�D���m��G�����$��8���`�l8𳃺
j���b����/93{��"���ʒ��s(Q0�av�~��ɂ�,w԰t��3L�z/E���B�c�~eb"��j��|�y��3�d����u�q��Z��_%�Ʌ����s��E�_�nU8[[鶛��@Y8'�(�V��3kk 6Ȧ��3����^�ϵ!s�{�+A;{y��U��V6:����
��b�DKC�����w �q�Z0	Cg��ǁx}��&1x;h̵@7�8ڄN|-�w3hjn�����{��)2�v��9бI9`{�	"��	��HzP�s8t��b6��'kH�ߌ��u��{r���QC�$CYzvx��ݿ����
�!v����J��0Tb��jK7`Ugy��2�2�b��:�]p��De���t�>#�C֭�HK�.
N$x�=w�q�h�ɾ|���ˮ^M
j�E؋z����	ڵ+���:�O%��ذ�?�A�~��^�.�3K���T���g n����FDU�#UTiNKQ�/}N0V�9q	+���KNÏ/T�ˏs�>���~�bE�T�Yw��PwM�츱�ԁj����8�3���X�22�J�+5��^Q?]㽍b۾1DEŜc�(���@�ݽ�_&�}����K�PK�yVSpip/_internal/utils/__init__.pyPK�yVSJx9?��pip/_internal/utils/_log.pym��N�0��~�Q��T�%\*�J���Z�i�LSk;�Py��qh�����?�e��`���'��m+T���B��+ܣ������6��x����Ŝs^l�Cw�
gL(�Q0/�#%�!�k)��� ����t�$et�څG	���b&�e	w�6nb=t���0���N%iX�؏�@�;��].G�-����;t�
��7����3{[��<���'\]3Ƣ	o1:��	5�ZYr�u	�w�s�0f�Xˀ�BL�%�D�L��I:�'�$�[��:ۮ�:ʶ�MkWь����t,`�6Za��ˠ�/�	)9�ܨ�%R�>�Ԙ\���Az����E;K�
P�P�`�㴑_��op>)/g&����L�l �l�u���7 5g%��zԃl�?���Z��U�!Jp���y%�U��U������I��[3��������n���ff�.+�?PK�yVSrB—�pip/_internal/utils/appdirs.py�TMo�0��W��R[���.;���TcӶV�D�I.������b��#��E�z�5Cn
��C��k�g�
���Ў�5E�xl�G�w<c�:R�i-z���Ҹ!(΃�v��A�DII�y9Ҧ)/ym��/����̕âǦ�/���2{b�`�y��+��c?�AጕɊ�'�qN&mB^cWQ��H�+�Z�<��xϪt���M��5{5�$�Om�^8��TȐM�)�
*�:�,Ǽ�L�^�a�--�����.<�
�7�:Óׁ�0�}m��6L�T'k17��(ӕ����g�bK��
\O�]\�&��~���93���4���0�M�7n�y8��ZҞr(��}��g<$�J���2���5�<,|UG��̫�w7�~
D�Q����8�J�?�ۄ�,DfS��"���5<T��͍�4��>;^�	bu<�B;+&J����L��8;��
+�Y���.�P�m��R9��+��O\����(4�=s�
].#˂8�
���d"�R{oy����u��)���[�O5�������ۻAӳl|y1í�?��� �P��K�0��0��(�`d�_���ߟ����W(��ׇ�����>�=�	��$[R�yXz[j���#<a�"�z�:���<F��oPK�yVS�c�k�\pip/_internal/utils/compat.py]Uێ�6}�W��G�f�u�R�pa؋u7--�$b)R%)�B�|�_L���9sf���ve	�f
^��
p9,QZx�m�$�+i��Z�l�t�X��uGi�QěViBU�ոUf\��DQ�1!���K\��Zf��E<���B�}־V�mw��f���FQ䜢&��{J�+�-�2�̲)]+�����
�L���WJ,"���}X�ߐQf����a����On�+�4B';�Et��h;-����sl-,��G��>�o�1��Ԫ���iv@Y(�vZȻ��c�m��y���nW�lv}��]�����,�6�����wkb���A�!�J%�:Re��9��m�b>����}��f�-��y�	1����
i �G���ݾ�����˱ iqe's'�-r�:�uV���S2t�a����w��,��Ԫ h;RO�vd��f�7�c�
U�]�4P|6��!grba��/#2.��^9�Z�(C��d����j����3/eAT&U-J���6���f�����h9=�q��b��4�٤,��������BtgAd��‰r`g`�dp�����X� ���W8tB�f{.��g@�J���#:�Pp�+=7F�uAy8p)7�9�X��:�4(rȍ|;�kv@x��\_����!~�ã�!�/�Xk��Jk�G��5����W�W�Isq�_��7�q!<
C�L]��M��e��`�?o(���U�'���H:nXX� ���-��`��
Zw��H�r����M���I
��(M*�s��7%qhQ7\�ў���"Wnb�B�!l�o�/^h&S������

�/�������a������فi�LV�?��&�i�P"ӧ������5�C�� 
��Qč.��p���S@"��^Z�U8��k,ݒ�jo0��?r�G��3#J�>!澁�V2l�ၡ�.3vz��89%1���nr$�W��\��{$͹�����?PK�yVS����s)pip/_internal/utils/compatibility_tags.py�Xmo�6��_qS>LB%N۴5��0��؊}���h��$
"e���wGꅴ��u�G�ȇw�=w<:�_y�k�9�2����a+�>��	^]���eQ1-�D.�>���GA�F��d���e-лJ�+hGJ��c��,Y>��M��Y�*N6��dW,�f+\kD�V�#��O;���_�V26C��}H[�r���v�2+���&RgD���U��3)Y�G7�K�*gz)���(��&au�N����1#r�A�����l�āW�2��9�R&Z&�̤�ѩ%j���!��E��A�zj�9��e��Fqh*���R�J��J(��
�b3�i�� �*E�
g�1�^,�κ��5$���1��9�/�iK�N��GFlF��Ȳ����3���W����,�
�
"��M�¨_H�����	
J4�LP�0���™�~��(S[k�A��[�S �T\�^�)Ű�����29�Y�@0�W��-�3u�z9���]�����c���R��?�Zq�36`�ktR�!ǁ]?cFɂ�5%`.�ygX�(-�$��F
wp�a%eFҩy!7�� �����L��cZd��e
L�HM��5(0{��]r{��ӡ
7c��2l�J����[H� ��C'�V����s���X4��t	����u+���)��n��W]v�\���ln��*�6�cBn�I���fIJ��oXk-�����e��f3�vk���U�����a����M��B*

��ҼP��<E�ߤ�Tv������e�Ԋ��"�߽��\=�.��M��^SY*|�H�d�T��u{�u��gg��6��B,��Y�7g�}���ag'�$�)9{�vj��w����{�˷�X
�������n��J!fQzQ;�E���� GO˜<��G�s~�p��y'�^ �3��f�T���%�f�TIL���#s�ܬ��J�3
ͷ�؞u�iW��hzX,��
���b�W���[��z)�O���f7ay.�<s���i߻�{�m3vd|�QXJ
DoWk�������(��N�ɩ��/�:+"�nd^�_`04r5$ �2hCJjPSZz\^UDةq��_�P�-n��3�a#�G� �F���Lp�`'�o;����z�A���癚�vj�ar@5�����m��I�|��i���k�#)���]/.9�~�ic��O��{��G~��n�����s�࿟\n�>���ch��܁B�@-�[ǻ�v�]�rD���K�,3�l/Yg�7�x�]�GP�҉��6u�>�G['���
��
07SJΰ{�SO�R�{Q�/��%���b�e�@��ұ׷������|P����}xp�̎�3��ފ<�ӏ)�=���[kA65��Ӈ�5��w�ڼs�쩇�l`�J
������|X�rn�r���v=�g�
[���!�>���o��Ѱ�����8��ۭ1�e~'�� =��U�ѯW��Bq��T����!�@��ܶE�`vo�#Z�J֮T4{�����s�G\"���E�UM������ߞ���F�!��!W3��`:�eF��zgΏF��<v=�c֡o3�5�~��~���}�Or�A���~#��=�PK�yVSl=���pip/_internal/utils/datetime.py]���0D��� �~��
Ra��В�J�{�J<����ۙ5�\S��9b3Ve�$�'�3'��H�ؒ1�(Lsʢ��%����jp[�n,~�ĻXm�r��)E�.�����ƆPFp��]Xu�Z�Gx�O�m9
4�&�3�+�#����PK�yVSжŎL+"pip/_internal/utils/deprecation.py�W�n7}߯l*��P0b�5��A�"-�`A�$6�%�rC��r/�,-P�H"�zf���yv[S�
�o��mnQ{�%��>�X�
��'a5;K�z���X	/�vE����l�A������^��f~߰���F�g�а�f���}���o�����Ȧ(w�kc�FT_{(vh���a�
�qYvre	�A�ZKy��������<:ʾ��&ҁ[,����77����_?�\ү��������R�9x/���O1�I�9�g@
	�Bi��T�*��<uP����hJ'{�z��z
o#�p�=�mp�ո���$�آsb��������_fA�"ĵ��y����.WR!C0g�xD}���Aj?�̇
~����>�$"�|��%�_#(rco|r�]�E�4���t�̆�gC��.�xM�IT�^:�.C�'���bO�@�z�C���Pj:�DAOI�$����5�O2`VԄ��I�W����A����YX�ѿ
g�<��J��0)R���	Z=
.���7�+��vٙ)c��ywq"��B��� �O�…�F�<�OnD�|~�f3MCf�h[�-��Y
u>Ӭoً]yܑ��I���^��%���ˉu$���}�f��	�-6JTaԟ�2ޯ)hj��w+��X��X_�t���r�z�"�is������}3$�M:�ɮZ]E3��,Mj@��NKu���h6Gb��ne=m�q��$ҹ��Q'P�qcZU�9�2�N�#�PWX�@�EH��>v�G/�E�W�@K/w#��$�=�J�jqT��)���ށ��)q&i��@�o͎Ƒ��� �#E��Ҍ���w�ܐ�5��~4��d�/Nܛ��/^6�p��l�4��x_uÏ����(�Ns�8���{;�L�P�δ�ؙ��=��n�?e�N���EL�jP�Z����_�
B��蕄��D�Mׄ��Z��u)�kv�&E�zIn��Y7�n���qx� EcP�n��:c.�^�CP�b�����rѷI�'c0�\��<���z��tz�(��zIw�JZ��!�I�M����[��|8��٨r��;G��C�V�|�{5A]aLs����*�5��"�*���t�򏒨�,����Ӽ;]��؟�!]>a�I7�*=��D�}=����Ol�a�~��`֜0�f
�#��|��q��cЁa'�ގ,̜ࠗ�:���q����vYP��;�T��`�]?^���)�-y�z����%-�"~��jq�
@8�%�L��VOߟ��	����4�M{^�y&H2QO��~$��]t�g�
���1�֎�A����lq�D�������oPK�yVS&��]��)pip/_internal/utils/direct_url_helpers.py�VM��6����)
A9�%Vm��HQrH���
����ئ;�V��T0��U��vQ��U��Zu�~�|f�땶��
%y����}ViA�,�T��*���Š���]6�O�V)��}�]�n9�>���8m�|����[����qͬ�s�VQ.������n���fK�7E��7��PC
d	�+���=3V'컷���>Q�W��/��*�bJLßJ;����M��(;�VT�B�0��D̈́t���F`%f�v��i�5w��G�wl�\k�L�~��ىȧ�X��1�1%cQ��9�Η����e�������B	�4�V�T]'l!*�*q+h��m�u�3^G�Z��ʣ�ٯ��f��AV��ɜ��ŘC��Z��h$� �u�f8�;��,��R�B�<���#�cx���D�D�J��$SW�A���z�y
���b�]��2Y~���O/]���Βt9mD:���oz�I)��"�IA�4Ƣ��1S�„g����A�YIH�v!2Qqjڢ�e��qP�E��ew�Pğl3���YN7Ł�/x�h����,qp�A��u���I�_��
��
	�]�dʊ1�l��.�Qp��۬�߅&����l17�f��y`�f�꬐%N�$@E�Y,��a���g�,��;�Rz`O5�',���Uk0������W{�:e²�4g3\�đ���Vt��Zm��_�L�}��I
mŤ��G�88�)��=I�-��᪔�v��ܗ���gᒦ��Q���f+��;��`�����5��A鐢r�TY�-u�����sgjPx�G}2پ
E#ʆK.1��q�V�FIN'�Z���!6ۙ�
�) �{�Fq��J�l�����`�<̀~
�+-�o�W�Jׇ���Y�ޮ�������t���Y��������!w��n�9�
�U���O�JV��|��B���@M���.�ٻ�D�H��VL�r����PK�yVS�#�/�%pip/_internal/utils/distutils_args.py�SM��0��WΡ	8�@
����C���"�m��$F�ݸ���#;�$�!��,ͼ�y3���4�;6mȑ�Q���>N�;�?EOR]�+eu_�����9ھ�ν7�>�Ԝ�WI�$�`��ְI@�<��'��a�f��Y� M��߸=^uX��r��m@�X�4�J�pӚ�M�o���_�M��u.7T"��H��m�$��#
�P:��G���oq��9neG�s���)r���yR<�4��O-_�]���#%V�<K��󸭆��T�X~�h$M���4M��x���M)�Hd�G�!B���IT��jnC��pȰW���<�w�����|r�#�2�_�е��{�(�����6.��t���F�L�|�r�7�o��x�诼���3�����`ɫ��X����d��� &:=��I-(X
Y����#�`�Fpݔ
Z!&�u�$�6��_x�
�TV�Qڼ��q>h�"��Xŏ�>��PK�yVS[w]�>�pip/_internal/utils/egg_link.py�UM��0��W��m{b%�		-VK�&��[ǎl���zf�8mP���I��7o��e����^�5T�mQ{pӫV[��-��3���ώ��-����p
�[Y���4Z���r�$��`\|���%�5-�C���G�d��dW�t.ZZ+��o�h�Dz�V��-�whK^;��{�\���B��E�,��^k
��uMG�E�=~�ڔkeVB-�<I�R(U��n�a��u���RT~Sr%e��Ń&112�K�����L�3+��%P���?��4
�7F�pC�Т��vB���FA�K�Z����ԁ2\Z�ή_9/}�A�p�mץEgz[�{�Ȩ�)AWlU��)�=B%�6�+¯F�J(�s�Ya%xGz���Z6
Z֟2kY��,��4=
�*Ko��^~˟O�/���t�"?9\B:���d��*g������9���R����T;k��Gr�BmY�tX����U�$�@��`�9z�w�m1�O�ʌ��S�f��b~d>y�f��ɢa~�?�E�=�ύ�0�Q�G���e�P����{
���?��4YؽtT��H�;���+pja�q�Y�r`����c���u��@:�X|���S�����FϧPp|�x�,�a�o�s����q('�c��Ym��749��2�i��g ��*�Y��xC����v|�>�c2����ixO�����԰�J�}�|S�c��� ����w8)�c�.���N$�
y��l�լX�F~�*�kf�3��fF��O�x��x�La��7�%�F	[����9;C~PK�yVS��a�pip/_internal/utils/encoding.py���k�0��Wꋵ%�I C��.��
]�� �r"�HF�	��w�7a1LO���~}u�8�J[�U�s���R9���M�O�d�R��S-�:�J;���Ƙ����؛oI���f��4�$�	ۂ��?��# �-���n�'�����㲇��V\5�ͦ4��g��ȭ.��b˗���?_~lߖ(��Q���x�i�P�$^��%Lƛc�~��AP�Xc�k`��`���E�0��t�}���=�?��^�q�V*�&l��{ך�:A�->��sಭ�<Ϭ�2�yo#�q[k^r�-�p���*�A�\�����a3>�+��è�B�_�vG��f��eښ���#�'���҃I��qu���St+n
�^
7`)��Q�8���3���r=��6�˙�f�J�0#IhOӫv���\�d��\�od8�>t�?�����C�͌��A€T^��WT��#��VMmB��fr!����7�>�,ʊ���3��o�PK�mW��_�^j"pip/_internal/utils/entrypoints.pyeT�j�@��+_�"�r����ЦP�P=�!���5t��̬���;���5��Λ7�5��sY��ُ�@�T��Ib
?B$ʑ@�y&��ִ��ѐ{iI�UUu���Mȗ��}�yL����	>��wXó�G�n{�V�+��������g�Z}F�X8�B����m������
w:�3�zbI�a0��gL0oZ@��î�OؚI|$2�d,�$I�,����N�5�ġ�q���ExX���$���i��Z3���K�x��gF�3'X�����d��A��L}�k&�DQAް��Bo�r/k�|�g2u	����g�Fl�H�,b�>�(c�dF�Q�k=s�>�W����3��6�pDPOZg�����&��q�Q2�΀vb�3��h^LϿ�+r|�I��O2Ab��͑)���������"��s���`�%-�xI���vI�#�����!��*`?ʼn�Q���^�vg
��Ia�1�v�9P�}�q�`6ڷ)Q�\_�ܔTw3��
|N�������v������(̞�S����	Z]��p
�n����"G���Zg�<���h	�]�M^�'F����|���?PK�yVS�;[��!pip/_internal/utils/filesystem.py�Xm�۸��_�:"�9�f�\���]���;d�	:Z�lfeQ%�����>3�^���v?$53�<3�Pz��EYo����~���+��l�'�n���'/}�{�&�5��ګ;_饈���F�r�l��jӔ�R��[�Q�{E����M��5�^uR?ջ��Y�����K�����ů���PkS�E.���F7iv�p�zU�\�]g�*oa�y�d����P���Vj���Nc+����R��Ks�A�:[+�3�Z���~��vy�Q�dN��&�I�J��U~��m�lB?/��'Kc�����#qY����{���JH8��#¯�Pe�r��>	SbQ;�X�+��$RGk[������y!�k7
/q4�?�V�-l�KYE����c��BL��~~>ƊڐSNzo������Yp������mqzZ��j_��\:�,�o��զub!ޚZ��vM"!�E/1l7;{��B��A"����l
A�Z����;��֪ڋ��{��|<\2�(����kY!&uQ�3a�	6���?�=Q��F�jw�����ZY���-��j�6�O�!�J��#m���?nD.�;r������U���kk�=m1���:�/�]�=!�c�Q
1�9a�ݛ������c����5@w��3:��}�z,��溺�F��4���5gs�۹(��C	r�g���M�)+BK�o�eE�ul��L~��2w����*ꔜ���`ѫ"
5s��*Xy߸��O��
G�&uj��Ʊ��/���Ϋ�P�\��¡B��!�$d����$���Q3
�a!)�q�->¨Q�V�(X%��09�s��Am'C����	S�
�`#P��\�B�jCJ������3����)%���C�����U��wr^F�Lc��#B�`�7X"�i�����ի_��ӊVBy��gS(�1��`�Md�U�藙�4|�a�����+wA����&��n����]pF2�T��h����\��@ǔ����
-qM��G���bP�)`@U;N&�U��\��Rq�Q��B��0��p��#P��!����[8�0��R1�ݎ��,�g6�ZS���.<����:��
5�x�S��'8T���j�m>�j�8��N4�^j��sJ̵%�MS�c:,w+3jR����sbl��F�~�'vZUE��
T��@2Ȥeպu��>p����<�d��$3B�#�#�\=N�#��,P.�3�n[i�UQ�sf�^�3�C��N2���r�1��i�l�Z�@��.�h�l��b���Yz���Vao*ظ���}���dH3#?;Z�@ᄴ��F�Lc�T��a�F�-Ƈ}�v��Jm�QҘ	�@h#ښ
80$ԘJ�?�zo3�{b&:�g��>P�Z0��]]_~˵Z��g���?j\	�n���W��]�{�h�3}�Ί�*�Mъ$�C��$���)���vG�Ϩ�x���� ��>̗8�
�L�?�F�nz�8�js�����+Q�8N�R#G"+�]&ŇW�
���8}7=��r��89����3*9}�7�3�5�f��&=�q���?FK�H̄�o�߰p���%��:"8
>�aB��(T�[#��.�qǒ���dլ�Ry�\��j���T��4��η�ۻ�g�Ο���/�K�"n����|��gg#DE?z���ӯ�I�Ƨ�ڠ�n�١�f�QSeց�̈́4��ZtY5T	Ya`\e��w������w�?��u���c�÷�o�bE�ߔ�ۡ�P@W��o�%�!�T�lC϶��٨�^�(�t����TSjk�Z���5�jw�\��D<=b~`M3\���m�\�
��v����w��0d�*p��m)&[�n-���O�o����Հ��`О��s^���fRGӘX�0Xf�l
�Iݸ�᠁����q�$�uw/"�Uh�<���x��s6�5|��n�c����>?}��!{% TxG�_�ҙ�����h%L�%���PZ�ةӷ�|`v�O�C���|-��'����OO��UtE���*��L��h���'
�󗾝�Lj����#͍}+��É�*�?s�N�8�f6�̯��A���V6-g�e1Z߻�G��eÁ��L���ث���<Ϲ�p5�ma���Y�%k���w�c�:
��ޙ0��}�����+`��3�,���?NN�H�Yzv�cXs��3�$b��X��ɓ��8��k�ޯf���(���������=���zB��/PK�yVS��O-X� pip/_internal/utils/filetypes.py�RQk�0~ϯ8�d��Ga7*
�
-�P�FM5�&%I����Zl��Kr����(�C����H��r/�f�RJHbM
�'�d��!�3%�?��X,�Vs�r/�c�t��2%�8zB>Ga��_Q8���&������y�+�����%;�ynٺ��.V�uA�5�UEOUz,h��o�x#�*L9&2�ߖX���h0���]Q��on��`�2�
,hˁ;h��hM��	Hs���o'��S�T����Q�j�N�ϭ���#	�J�
	���h'�Š-p�5�9��d���(�ކS�`�d���'�0���u��<�"�4�!WN�_PK�yVSR�=U/&pip/_internal/utils/glibc.py�V�o�6~�_qPXd�GV�͐k��dhھ�AI�M�5�J����Hю�8,�D�}w<~�O�ӎS��T��R��7��Nu����浺�%1,��S�����s�l�y69��o�s2V���Tk�j����I�'Q�J[Rf�dz3������o�_J��V�qR�R���k�����	�~=�����_�#��^�h�JIi�V
'QQ�,u�E��Y�w?sS���#b���M�� ��;�C����Erw�ِ:���L��FNFK$��	ˉQ.,U�X�q���!���z�ѕ�‘)�����>�Y�ؐku���Z8��� ��m�"ut	1�5%�%�r�M�V2[)]S��N�󰼳�5��V�]�#�z�v��y��R�󪨖�bq�W?W��bQ�)oV˪:-�|�\�l��-�k�����?Y/�^���ק>8f�\..(B���!�g�����q����v���f}��r���۫��(	�j��/*E;W��ll��z��Йi���s��
�Z����w���Z�nn��&�a1ya��G"�Fa�LH�KN1��"Vҽ�L�,{�Z�=l�M神��Ȝw��)�����3X�Kx�?�J�A�j��D��n=��T�[�T��P)U˛���z���F f|WP͚�m�*�7)EWUB�Ak�L�9uNC?
���к���t@C�Zm5��М�����8R4wP�R����\�Wb9'�ـ��Ŏ<WU�n�����ߪ��@��y�r7-+8h��LϏb�t�-���9��Zv�p|tO�?��m_�Jb��4S{a��6�9
�SW ��;���(�a�?"�%�qt/i(�R��^
�}�7�ܸ
>V��;�7�w���>@r���{�f|����#C�g����9u��T�i��[V�B�<��)����pv����ᶓL�S�J�L�X!�������d�>� k���� 쮳�''� ��'F�*;�YA� {�_�;4r�,�8I�!���Ӕ���&OaO�W�����ЮVwv���B�%�f�.p�n%~�s�>���e��-���^܌n����s�`ڄ�A�Y�4�d��X��a��W������
wW�{jEK��e���q���p5�7,�;�0����"n�윢��� V��*��Y�ܽ9�
��24'b&�#汸��]����E�pǂ� ���Q��'�Ɓ�}k�Klh`C1�C;	}�P2�y��~o=tn\���Rw]�ۘ�&�g5H�wZx�
�oݧ�nh@��
�8�0^�p_�����G���d�PK�yVSPg���pip/_internal/utils/hashes.py�Xmo�6��_A�*���k1xȰ,��kR�Y��dZ�l6���T\���ݑ�%K��h!Q����;-�Ji˶�ls��dZ��+Yn�t�nw��_^���_���O��z?���+�ڈͭ��*�_���P�*Nd	�J���s**+Ui�K��4��6j�l
x��<�9ο�Z�1����ą4i��_'�.��d"�>�ل��xC�e	�=��Oؕ���%�}�ZשX�#{���}�W��*�=˔F?	�nEz�V�?��Y��
lY�\�=�I�e*_�*��=m�1*c�v�h��~(����	��
��Q��Z�x�Q�e�c�����CҰ�V�6�	�h+`6��+�R�k�Z�v�|
ʨax����9����7�ۋ���%;e���g/^D��k|��4x�0��^�i�b�H%��k�\��pt���Zk0&�G0_$+h�*anY.���`��}z��E��x���5�x�
��?��[���g�ؑ����0NGA����UE~��W��׆une���h�2d�� ��
hr��K�+O6J���ka&��a-2���M�Ј<�<���oa��<|�����%Sv�=8�
b�<���Et����j#�J
^�@�^��Uk�$�]��[�@@9֌����}��ʬ�(�T��1%���ؽ�LF� �V&��'��{��A�5��9�����28s@/��O5��t��<�p@ߺ�!�9�Ũ����?�����)Ѐ���I*�P5/��o�#�d������E^�G�kW���� @���s�<cB"@SS��"�m,�Z@eE	e,b�@��J�2�`(�,�F�GW�0-�^����1fz�x6��N&����8��F�r�Q�VP�ZT�Ja=&�f�f)v}Ѷ���~�V�ڔ�\.�e_2C�
��������h< TC#s�=d�עx_�Ї�7u���
j�ݷ�u����.-ɖT
�`vf�"�E��1�2�;��tzHiN3�S��A3F�K�Pi�謔�{�͟�pƑ�P�� �NuB�7d���[s�f�}#l�Ҋ��c����u߆xK�ˬ����n�B�#�Ӡ9C�;��.�$­r<��x�7Pkny|H����m�\B��$�[gj�)1�����EX��o�~(pD^�@(i�#Ġʃ���ص�,��"��0b�Ђ���Q���A?f��%��er*��n�5�Nz�{�X�E0��j%>��⺂؈�����k��>VN�czur
���?�w�7��l^�BrX��v��G���[�������=�cz���G�A>�I�̛��q��>�i�pZ�K�
\�����9����\IB�}����Ro���x(q}��j����z�4�����xĥD�۠`-��ߪ�sj\���w;Xߜ�x	��m/>�G.H#\���h�K����@���J��H�9a�E�Gh��A��r0N�f~UH��K��Gſ�+�'76���Kɣ���3��_x���%���F/0���=�\�]}+Zp>�O�N<�V�p ��T_�Bp��T����ҝ����A�Zh����v��U�j������N�E��{�ś�;���l�*��{��2ߓ,�.O�K���M/_��w�AUk������|*��k��s@���-��oX���:y�aD�y	�����^��0�����I�Clj��i���~�]�g�}���K�ގw��o:�PK�yVS���-pip/_internal/utils/inject_securetransport.py��Qk�0��)n�K�p��A�Ƞ�٣N�j�<k�u�IN�o���dmia†;���$�gh���Q=8�ؚ��*(��l|��
ȃ��P+�mqN �4�v5y
�����9\A$@D�s��g� ��*�"`A!�=����%��4Q ����Mx2�3�T�k�O��]��Ty��S�Y/�y��(n��$Eҍ�'3������U�$J�z>�T�ͬ_��(��Kx���Y��L����3�T�ͨ�{gbC��KHj�����񁽚����Qp�>T�G��v7�įk\����by�Z�z}f
N�?6�ʟ���:�����-\]B��N�T�o���0u��^�{�5��9���+������)>mh���,_�~!��7�>R9;/��~o���PK�yVSɓ]
-pip/_internal/utils/logging.py��o��w�Fɔ��t:�.�$J*���kVA�'����H�Z��}���i�k7Tb����:�mɫ�����C��Մ�ZU7_r~wNJ���h�YN+aֹ}{1YW|k@�^��V�U�/�7󫐜���I�<Y�4$sMj^�䪬/�<$7@%���K�HQO���Q̀�
ࢦf��b8��i�x}u=��/�(C�о�oˤ6;?�/�^}��hY�4A͞����ٛ��e��}���9�b�Dj��B4�3VM&u��N|�zS�$CUЇ�� 6�>�*^u�f����$��K�
�N	�+xE'�9-����xe�<�U�M&G�ׂ�5��zM+ZH[�m��
I�a"$�H�Fz�5�JJ	�
 rh�?3�$��1ǒ3r��u�:�)�Y����I�Ѭʊ�T-�ո�!g-��P�y"y]�ϴ��3�Hp�*I�-I����<�w�0A3��z�GVR�O�䱆�zC��8��%�
˩u!�q2���L�+�-Ri,%�lbI�T��u"���6$�~J:�9���8ϵQ���A�����SѺ�
rS5 k\8"W��v�̈́(��B�Է��iJ�����.���8��}��M5�M]�bzz�j�DT��
/"^ݝ2!��o}��9��~���
n��wI.4z�	V��)E�BT���h�(�H�<0Y�˧Hq�
�A{�{-#��M�C
��N�����<䌼�*1!m��|۵�s��Ɔ��nȎ�9ȺTZ�40�,��dE�y`�k�Y{���`�G�e5�,�
u�9�������t"�5����"u�
qҡbg�����AB�(��=�y�b�@�;�F0�(L�Sh@񂨧��(���o��svy!���s��ı�}0��������f[��K��w�����8�9�qz�az|�M8��\VDZo�4_��ۋ���hג,�G��r*����l|�y��+��&���([Y�_诐�Wt/��9F��2�XL�2��ܧ�\Q
8���l�
0G�M���B�\��Y|�ٱz�4�
Ԙ�*�
H2ȣA�P�Q�S�{ڔ�� ��r��Vchbڇ�x�ڗ#k-�l�1=$9��y���K�����,URH�bZ�/������F�$�Y<Jn�$��	
�n0, ���J�U������#}�9ݽ��H�-PE�p�t���
U��͞l g$����O�d���&�&���Ôs���L�gHw�)���=�͡$f���bX�$��z�Nm#��+Ai;Q�;��@U��K�	���H�%Uf�ƶ7�Ay(H37V�؎E�<n��T%�^s��ưѴVyf�F3�X,h�M��,F#�H�"<����ݤ�	g=��v����U�o��x�S �y���H��y�/���l�ڐiZ>@��8V��Zj���+�
���p�jEYǻ*)��YȀ$��tQ�%�@�����EpOI3�e��c��q9�����%lmq]��F���&>���
:e�>̦�7����fײ �Q5�6�vV!��孌
��A�z� Ih��*T��D�MrOێE��������jq
�Z�,��J3aK,&YRv6v������a��֣6�cŽ֬!
���A8�YG�Ƕ�<�����b��O��!�oJ�T�2�]�R5ݷ�	��Vd؊�j��\�0��-]/6��y��ά+|Y�j����Yk��P��p�^�}�; N���	�4�M��:'�d�݆�.�=��Jb��G�0�&�Y҉�����a
�_h�3�V��ٞ,B���Y��zi�Ń[��`��>$�YU|J�cR6.�����ul��u<��xR���/��A��.d�����2��$��8�1��냝VӁM��tW�Q�
&���k](X!u�G��"[9�]�@�%�"�?l�pq�n�y�~0(�vR`	�Q�&����9��e�E\D��g4��Z}�f����AE�s���WZ��b{����C���
n+��ˤ�Ҥ�=��SJhh�>�bwX#�VS�3���%U�
� �
t�����$䛍�b�-Ϛ��@��¡�rF	4mDͷ��#+i�9���;ϒ�/=�\dŚ��r��g�ٕ�U��8.�r	�U��@6H}�7b��E��:��@9�\hSu���B�X�
焲�%MY�;�����^Q\J.��m�p����&�w�̻D��Q3c��;+;h���
eV��U=;XSa��6��'ƘRe�~d����	H;�kP���t�b��൜G����Ns�
�S�m�_-ϋ��c�vz�CT+�z�s�lu&X%�"f\	j|[1�SZ�?$����W\���r~;��UeH��Yu�p���w�foM/}�fy�=�U#�>C���1v�^
���/�aB�	��~_FyARp������n6U�C�O>�N@�����`��Hӕ�$��֞e=pe�	��i���{��~yBUJ+9\�)�'�MAHox�fw`�B�;���ΘA^��V㊊����GM���(����y�(�=�@�G�P��Xbz�U�e]�B�,c�{��Gn��f��7?F�og���^wC��Pa�ݭ�G���o�umc��[��Cۿ���>���b~3s~1���_��R
�B��K4\��H��܂��8�=c�J(�]�AB<��F��)r*�L}P�q�tkt����3Ni��Z�6y�Hcc�@j�αF?�׆�j�{Zq$YƔW�z['c#O��7 �a��iF�O�&Ͻa�N@���{�c)��^��x�#�6.�Dh�nI���T�R�R�D�r=����bT(��uI��Q���)V&K���ԻUE��>�z�+�
��u(DK����n1�k�*��›�>���Ӷ����P�����uZW�=8	�GC��֍V.-�ܧ��V C�"�K�-�uUI	w���|��vK��/��~���*��bS��rIk�Z���$��ޤM�����˔���	dY_���`��m��R�x�TN�$�<��n-��x��{�~,?��r��A��+�]\sW?Om/�%G�>��C�/�G����I{L�����/}�1�"#F�&�O�vx�;B�:
�q�닉@0:$p}���f���0	ܹ�=8D�͂7AjX�&j��g]KV��02\L/|/MȾ�0]��V�8ic����&���o��rȋH5�ʨ5�M�y���O����?��1[������z����C/A��/9�3C.�X���\�7pPu~o�K�h\��	�rz�VG���1�z�WT��[e*�GX�:�
4#�h�r�e#������h�h��G#�"�Pp�\�s�l��e��h�I!�������W�}��nN<�^�8h����������?PK�mW7#�݆*Qpip/_internal/utils/misc.py�<ks�F��+f�����z���U��v�Jr9�
�!�` ����~� ('w9��ģ�����_��'�r%Ţ��r�K1/�kY4B��6O�L�Z��[���k)�2��Y!l�6m-��'b�����:�7Ge�de����I��A��ʺ�E#�<��'�����,eS%J��U�Vhf��r�Z�mi[T��Y�j�6Yn��[۪�s�&��H]�����GO��x��7�n�2W�"����F�ǿ�*��b)U�m�m%-�e���,��\�S����_ې.�Ɋ��^��o�<Of��w��&E��5?�j:�kJ��M��z�g��.��ᲭLc����1�X�	b	��*���ViYG��2��*�z�
��%b�b��MY$���Z6�6�y*�8Y�q*��l���ٝL��M���
�DZ�Ȩ�a����K���[�H�뺬�Z��<�5���ɯe��>u@(D\�t��P�
(�g�����z�VE�A�M��.�~����r�Yqc���D��bC�~$�YݴI.�[;-mQ���m����q"�b*�H:�z��Rz,+^��
揺7�P��*N��<Iԍ�����/�z���[���a%�Rp��h��dl-��E�Wu�4��B
�ƪI��v,O]��5���P���S���g~c�q��R�K/88��_�㲻—W�$J���E�>�+��Y{h`:Ca>����^YX���4��Aw��k\*$� *F�@�DU?!��\��,�T�?�̄on����
/�<����~��[`%ƒ�h�Bx�	��3|�նY�\^���:�Uڇ���%�h�t"gg0@C�~��LE�Ŀ��b�z�g4<�iD"��r�@
�^��+��#�yĺGє�,��l!�jV�,#��,]kH���cUY���!�*9�[`��Ƚ`���~+ERl5m�"��	���l!~���tTa瑥�x%�&C{�%d�a[�W	��T�Y$#"?�z�ψ��D�+�l�IN����T����h�@<�IȲ.�}�_>�:|r5yv�[
h�}��
�Ć}h��4��+�\7�K䆕C��ɍP%6HAۈ��x~����F�p�A��>����k�D���K�Q$%u���Y�*q����?�_���bY�H|�x���/���ʈ�I�)��	򖎼3H;"��ص���V�]o����W3Pפ���zy{ur�4<8Ͼ���@E������.�{D&��m��=�#�ܞ�������\�_7�I�������~G��;=����		���U�/���ާJԢ�P<ӏ@_O����5�l+��I���w�\�)�(��j����"Oѯ%AM/�V��8�������i�C�'ы �)f�Q�Zx	:]�,h1o��˜����"�0O{w!*e��r~j(�em���+�jb]�+0!�`��E�͵�N��J~W�%r��X�$F�I��^��E�x)6+Y� �@7��t��:�����dP���	5~3G.,heRɦ�F�{��R�eH�uUVr���CƬh�U< ���W=3ƈ+FԄy
F(����2^���I1a�1�������ruT����f��6dj�—w�(���ؒ�\�sm��>��B8�t�b��p�^��W
N�0�&��W�"2m�������U��w?�!VW�$}�ݢ�@׺�E"��<60
c ����T�7�a#�*�ٷs�����@�️8����W�ȺQ(U
��A��E�d�S�ԓy�7Wh�����\����̨.�q
D9tEHgɍ�ø��,�@�G�YA�(>�rq�ك�I�3=h�R�$M���AH�g�s3�TK=D��@N�mV:c=�!,�ã=���*�1B#�_.��4� "�Uw	�[s��K��M����>�H�X�A� \�j�Ga�|���\�����^^�{����������3���`�$=C�?����v�6���j�d	Qϒ��0���m��;�F��:6ܷ�⋷��t�6�6��{[xoM/���o�e���&����J�(&�^���N�nV�3	�Zݐx�Ƃ��[��
װ#�FI�D�
�C�Y��|�1`�<�z�Q��\F�� ‰����g��(퓩���g�8�s����O�C@���ṫ|�se90�.��!@X�s�e6���:�������p�q�j�v�����{�q�R��N�0�ZtB;��C��ߦD��ؑ�Yr���Lt��
��[��/@*N��)%
g�#l���*���!|H�_
}~��!�`����x�!!��rX������Ƌ�i}r>�����Z{�C@yH��6+�S?XU��;�,"|A!N[L�	��~�~���O�i�[4\`��-��Cht2��d�s��_xY�d��$v|����g�Ir��m��u��IӗM �^������D<�����It�x���.nnvL�щ�p�H�M����4E�q7��Ƹ��@��d����8JBת�������']b�K�}Ж\���wL�S(���y���B�4*��^��˻d
]M&���˗�WW����%5,�3`�qur�B0�rq�3��"v .�gy��˳��x��!6;=	�s�, "r*�(�毓�'���[E%W��}W"���;jNn�#�
�
8�\�ӚBJ's�)8R�����3&E�忶�!BB�2�Z[�q´J�F��~� Ak��B�'����1�L2���"�_�yԔ�u)�8mUۿ�^,�0�bX
h	�����_��Ғb#E^�ddX��\.������E���mE�b�u�E���E6�lq̄�4_,�L�
[��*A<H*߷IF�#L�v���~�Nʣ�Or�R�g`�`)��txB���T�Q��D��\�jW�6֍����{8z�ν`#�߁���QT=buX�A[�(�O�-\��	Zw�&����_���2��ׯ�?�/�������^�n��ϙ�SQe�WAߤI��GBɜ�<�p�l-HM.�߽���/��
�j�y���Hc�a�#���7��dK����H?;�) U�2V�5nMv96$m����	���N�P��,�y�����G��<�t�6�nC���/�*��['
��z��a6� f�]�aĆ
�{i	W�v��E�9:�oΖZ2˺7$&��ۆb��_-"j���1�����5�b��ױ����͔s)�t�%F��WG�'��۷�ܼ�=�){K�][���y�e���=1��i�9��mk�kE*o3XVv�<h���Ϟ���A���E�:n��Qg�9�DZ�!�
��F��r��Ы7���T�1C�z��'�믗O�����nv�s�,��1�Xx�?f��C�bM�������"���Fbښ��_HDW�Yk�`:�vABL�P����Q���c$�&-g7����*��]��&1��� &��� �0)S�W��&r_���yc4�mq�A�4� t�� ����v~�Lq��mgL�D�_��|�~-m�꩝�u�)�n�&t�:�$[e;�;�o��l��
8P�h�|�dBo�@1�AuC��#D>2���hg$�¤���&�*X9���^b����l��{#����A	�1 Z�kܻB��h�2JWki�?6�:�V~0�Q�s�a�>��껢1�U[K�]d�~ȼ?p�9p6�Sg�~-?QQR��mя˙Α������Z���<�
�Gt�IB��T2�a�-�Sh�T��)'�E�:���fgc��%(�Ur�A���_zU����_~�ļ��FǴXc�Ͳ���q��P�K[��g�?�a�;�0RV��MBκS��w�cgh�k��K�����⸧;X�{Eú�&���Ň� S�	�
^ք�]��e0��v\��%o~�82j@4����QDШ�ʘ�#�����E�m
�����Ȋ�V��s���}T��
$�Ā8�Rtݠ�a6m�2�)ʍFDҽ\Q�&Fa��.��ͦ��)������l��I�wBL�b
�Z�ֈN+�	�tPݗ	�jG:��(��n��4���cXY�VW�	�C�������>�_FTy���spѰ�[&�ꤪ V1��R�vy�b�K��3$���5�*Y(c���F�<�ڎ],D����s"�\EN#�ӻ�!c�׮�RW ( �����W��LA�R+�c �h�@�h;����Ƴj�JM��� 3�q��8�J��|[������`>�,���e���W2_ĉ��]3B�C�$�<��D�r�e�$�FW�#1�6�|$��;�T��T�WV৬k�H��B��M�K�d�'s�$�d>u|ʋ2�'	�򆐮`u�&���Bu~���*
3��[]x	�������Բ��t�C�P����۰�<"W���e�ņ��y������.��p{Ӛ`0%\��?��o���\�Bb���ƥ��Be�=%f-��Zޚ=\�</mL�
j��'�F|�
�7�����xg�X��_��ec#��a#}c���~3%�#Q�D|�ִ��h׺�]�O8���ƍPV�OQ,�N�Sy<n�0q��*�l���*���)�����4���$Lb�鞦i"n�|B��n]Ƥ�����C���1�k`�n����ԋ�wm�P�0Ps3=�6�Ӹ�:}U�Fg�P&�s�{S�N�7�T�09a�t�Ǣ����H���@o�!�.�D�Í�
��ў�>,�Y
�l�f����/lkj1��/�{2����i|�z\j��.����VU���-������1�ݤ?�����@���3r�W��Fh��ӫ�S�w`|Z`�LB�3d�G$i
���K�޳�튝uO�C���"��l�1���n#,�{�w=ZS�'i������L�>���͋�.|��y�!lK���M�;�w��9-��{�H�x8�]�@�}O�F}0|�Y��A`��˅&�����u�
>\�!e0��G3Ӄ��}]5v[��Cs��a�.��X(�ƀs!�%YT��Xm�
��F>ob�>�5��ޣ�C�������U�<Tf\�|5C��a'�5���T��f�?�d\��.C|�z�)���d�gX5aU�L0��c����m�3����m��R����Hur�n��ߜ��N�C���*,>�e#I����
�������զ���0�[/�c�����?�S�>9V�R1�_��H�b��ŸG{	 ��2R�aGs$<�n�3�J����ӃP�=��w1$sTS����xs�j0�h`�J��M�>�ϰvZm
�\Ks��no�=�6��4
�L�.l)B?���W���C�i�SSsat���-�m��T�

�o���4��F�
]N�V�<Y<�w}0�����,�����Y_�AK��<����*�;��9H;����Cz���D�ͬ�y<��*��h_l�=�&�egrV}�gO�9�6���8u��-NxcR�a�40��ғ!�Ӿ1����֟`q�O����%r���˄���7R�*���쉅=�WX�Eo��.!V��t���%N�����o;�i�1�V�>���'��<&��cdzx\�hď�p�*�{���VA�ztz0�X�o�H}D8�����h�a�N	6��6��]��(���t���=�]u�N��o�*�.��:��ڙÞ$�'﬩�=��g�kn��Z��~��Ќnb��Ф��u�P�N%��ÊB�3{�yU��r%y�TU`���Z��eAyq�8!]���s��%�9~3#:�é���,_ВE���(Q=��tq2�Y��S���59#�Ćx�p�r+�$ӱ:�+����@�E���@�
�<p�Ƃt�u�1����#[౅��P� j�H���p�h3ϥ��ɂȞ#�dJ�����U�u�]����?p�(s�t�i�w�d����4O��]Յ�3���l�
W��:-��ZNh[�x�{��LX1�>�	;��ȣQ�Y��(����U�ʘ��:�e�c(ae��t�5e'0p1ﬗ]���]l���i���ͅ龪�����U�u�f����b���)X��ca-�r�n�{Ʀ�qcV�I]��ӵ<��i[��{�R�n�7l��Yjq��=�OI_>�>dߝ��Q���z�	��ޣ�zh��VE�_8�v�<�i493��m�A��m�*9�fO����/i
P��fj�*eN�1Cb��`=�)'Y+<e߹���#3���=���ٲ��z����9�(7�B��?���1�K����|����L�A�w������R�)!��?�"��Z������},:S�TW�U�a9\���9��V�S�����R�:���n��&̾�2�4�ַ�$Q+����xF�ƭ�>_}%�Nw���/�ho�G���u>l@e;�n�?9�Ur����������gJ��@�yX춐��y������!��`�kħv|+����~;���Ӹ��*Ń%�;��7c��w��2�m���ܺ�^�F+BH-MUD�����zۅ�`�ۂ�(�O�D�~~b�S=�A
�Iwͫ[�hr���3}��9���F�MbGJ�L��%X(?�R��W'0���������s�z�;*�Љ����ݛ6���Ej�M��j��%D�8��a�c�A�&(��.ЀM?P����$��R�y��
���yD�=���L_�|�nH �e��=�ӓJOęx.�`DJ�x!�"���i(�3��g��~>��q
��yr�PK�yVS;��w�pip/_internal/utils/models.py��MN�0��>�ȫV
=@%��BT,`E��L�l����$i�����ޓƜ�O���
�d��Ze�B��1�d=P�Vz���ԁ��w�=�!�g���k��c�1Vj����$V����Sf� �@��^��rd����]�VzP��*���+"�p���!�b���-pq�#�^�C�5��b�P�Ydn��mʒ�k!x���ؑ�1O<����½��EB�aj���=�Lr���E�c
ĞՅ�z����[�)m��q[����7��m���7���,�7���,��M�7�;�
t�[���ߙ��9\E���+.T
��S�yiʓ�k�>�M�ȿt���NJ-��.��`~��PK�yVSf=�O~� pip/_internal/utils/packaging.py�VMo�6��WZ���vы�
v�"h���#�d&��T��wHJ2e;{Y��μy�fH�RR�4R�:�~��M�E�Jv:�[ځ֬2Z\���Eϔ5\Twn�ۘm�����p)X�"�o!�6=�i��������h9���,_Y8�=�����7F��)��߁+�@=��߭9�N���(�<؜�T�0�0K
%���#7R�5V1�Ε���1t�j�q]N�*���m�M�2!�S�h�ʭ%y.Xy�FQTAM�
��������H�D?{��\�G��i�a�2�zD�+B)}�Rr�'yF�d�Y���w��
��#{�ι�ܑ��	#�ȸ>�&�4r�2����o'Ƣ!�&�PA�^�nVl��O�^�:�pߥ�3#=?$�PR警a����S�NX�A!M�Z
P�4G�ט�v&����w�;װ"�1).X����1���R���W3��I�W��l2*�gMj��g�(
�;F�v��fT_��>��J��
AI,�'��[>�)*�ˉR�5(�sy��I}�����ӉY?l����Er�t�OP�K��i�|q�9αi���nl�[�d�Vw��R�S��<��R~�n��5)�z��i1l�%hL���s�e��� @����ُ��٬��І�\r�尥6�K�q�2�OXwMFu�iv��h��E2���p�"��`��?�\�\��G|���F�^-�-}gJ�xI��sX�iAE����bH;fi+K�1� ��`���̫�u(��r{�ݩo�|��O��8� |�ײm廝�-@���D���;7;�m�����o�G/=����N�j��9^�ehU��:
��)�mA}��3��;"�˛�����}��`>]�؁r��?99�&�铽� ��(Lؖ;�k~s�V
y���)���p����ә��ְC2�E����seB��a�P���X����*l��48��+� 4�a�&|� 4�w+7
p/,�K�R��t�z�ݍ2B�!�n�����+^נ�s�������O`�`�{�
ܸC��c�+��J)�`�6�"���±ia�ÌK�q{t�/�!�v�&Џ�K?���(>�T�ɵ��E��aM����e�PK�yVS�>S��|pip/_internal/utils/parallel.py�V�o�6~�_qp���f���"s��,�f-�-6��TR���)۲�}؀a���ww��h4���	�B��Nj�Z}�AYv
��T����[S�τXT�Cm�V#4�>�=�g�f(;�g*�
I5Nɀ�&++Y<z�F�v�"[� MI��w>`�A��2�m�X`mݙ�r�l����Q��S!Π�M^�:(2U��ãP9�%��{'=<[�Z="�n|�ʳN�4�S���F��ҚW6-f"�
{����:;o��%j��b��[tr�1K��R�����&���V{(*�(�2���֫d��Z�H�{K�2Q���m	w��eߢ��n��$u�Q:!�O�$z�c
�]Aa�F#e�n��RHYr18��Q�ĵ$�{H��u&F��yNI�sx��q�F%j� ��ٚ���V+Pu,����Fnȅ(5DcWz�[����t�?_�o�N +ۺ�a��=j���|O`�3�?�&���C�ý�J�mT��ԍ�u��-��3Y�&p�����.��_-�ۛ�����3!�?oҒc�d��N>�;��
�Gw�S�,�@����F�@�@]�m`���6h&��,5�Ҧ�16��*��,3\7�J�m���N��R����1sκq���]~7��ong���E��㗯/%]qPsC�j���惪�6
�,� �{��O?�$�N�L,�׳�{&��B�rT�T�Ph����id��~�e}��<���C�ua�=�]�|.��El�]��<)2�*ڱ˟N�N##���"ܟ�%u9��)�o&	6��V�3d� �Xtx2�.:�e%�O-ezCz�0's��/��O�����l`a��y"l7�8�C;e���������m��x�fS�����0�}.�y��$�EF�*�c6�q���׏q�L���v�=3a�{�%�n�RG���W��Cd�Vz^2�EE,�wح�t圊Ź�	Q�\%U�kP6��$�N���@^pcvu�����׉���v��z�X��]�*0�5S ��1Mb��-�U;.��{�k�\ٶ4	��>0l�~�;��3_7��c��Ƨ��i�@�uL��f[,���QZ��<�i��<x���w������L�Z�Äx�ᔽ������;د_P�ld
B_�PK�yVS��>9��$pip/_internal/utils/pkg_resources.py��ϊ1���bz���؞�����KO!g�Ɋ:����C��v��ӦK}<�dI�9!
���'x�.��1!���5|!IMӗ���ү�m`�4��w(W�@�v�Q�����'Lƚd6
�ն���W�d�!����
/1��ev�6`3��7<�h*�bZ�������ףxS���x
�!��V��#<��,�*�G��Q=�_��.�q�\���DdL'�����`�0�M��	�x�63�%}[;e��V�t|�T5��90\�����{{��X�\�r�E���ɹk���*wQ����зE��$��v�]^Ð����fi��Yz�����j�(u!�V��hGb�������g>�Zҿ@�!��y��P|�Z:��.��F��3V��f��X���PK�yVS9��0Y'pip/_internal/utils/setuptools_build.py�WKo�6��W��6*�{v�E�������$hqd�I����E�{gDI�d��fQl�L~��AJ�Km�G�F�;�Rm����u�*�Ԋ[����w�=^2�*��Ȥ:��=H��N��g(�;�
�K��n>ܑ
�VrD7�`�#9�)�e��u<�d�1�VN��j��p��S��7��8��*#���Ar�ŰƮw�2~�RX�6��r]���{�d֥{�gP�7
7�,�ކ�%��+�����lƔv��
� ]_\�������:]�r�+[�y��/l�!uĴ����GB�Q݃�������7��s��d0MW�w��؂�Ιy� b3]���|,��5B2G�6�GdޞB����&kg��˫����^Қp�s��/f�ֱL@����>ʂg0��ޚ�[rnF��'Y�-̻x�l��}���I[�Q���;[,�`���Qv�'�R*�I���z'-�)EMI4Q��-���{�.�ָA��I+�H��ʂI3�r�u�A3��#SQ�M��`@��re�Ơ�����־�q�>ޟ��������=(g�>�n�V-Ax�/ç~M�Zݲ���a_�:j�M�Ҥ/=&�!��!�k�Rc�.svm*L69�`Y	��Z�<�2��=M�vʸ���S�1�e�u��iO�Sq`nn�ۨ�*G���{�!�ƽ�V�[
�*�FKY��:�I�͞�� ��ֈ�C�VjD�{��1a�,�6�t���L�lh�8Y�xoyȦ��x!p�JUW@*�i�O���tu}�d�jŋ���	ݘeL=��f�=4�#;�cT6Ш�VhT��cej$uұ
N�{�>��@��\1d
�'�2^�|t��ĺF�����%�/2�������n��J]����$�"}e���'�e5��V��ڪV�t����X�Q��=0H�k.+���W�T�|�����X�onD(t�e�P*,��e���wJ�|\v�Ȟ�N�arUyu����YD��51:��E�dv�/'��
�X
FM�GYn���W@i1��(A;�~'g��C���;5�xa5otO��n,�ئ��d�:��M�Ӷ��[_��^��ݦR�
��A��?QKӕ���}��/f�$ǭ����'9DD����>��D�E���6��m+N��0Z���4 �}.��n~�2�������H���K5s�GS;����ԃ�q�x|U��%7�xk* >�U]��сQt��oA�:��z}P�,�q>�˾oD���_`4��]!N�6��M�>����?A�����ʼn�q�"�$�r��?PK�yVSɘ��J'!pip/_internal/utils/subprocess.py�ko�8�O�"��#��=��M��n�i�l��s#�ZR���73$%RV��hm�Ù�g���iX���H��m�e7���=����BX;Y�e�C
��_�N|��wy�|��ٛ���{;�W�Ճ��W_U�=�7��O?J۸_?�Ѻ����Z��=}P�0��&�~-�|)����dna���޻�s�Y�B̙��Zz�1,�s!�f��\�Ǘ�;	��G���l�p|<�����<�A�yp(��a��,�����D�S!��h^�Q��s`]5F�m!J��.��V���r�w\_�^��+��;�>
�~b��P�4������Z���9xv&�7z��|m�,[��oH�7�1��d�����Nj�����gW��'���X�-�������6Jl�"�ng�?�'�,˜���x���WQ4y�	/���7�NP <XF���ƛ�(�	��m/�^'��T�H�H!Ѫz`�J�Aq�Au�V�q���)�@A��"
���˜��z��'�h�~�: QY�ny�.��0{i���tc���4�
AѴF%@^� �-o���4�9�о�6�N��=!d��v+TcI#��u�Ru��=ѡ�=󰁁(�%/pE䗭X�<�1әwI���z���Z��Mkt�N��HI PD��£j6 �+��1LR�R�
��bW��ր�*�"	�k�n��:U[
H�V��R�b�
���M�n�X���R�Le[#=�t�]��#���"�*8�6��V��,�UK5��2T�[�1Eq����̻֌�6ٙ��I��ۜ;��?fs�ZjyW�h�0��i��9( 1���hn`snE�_u|<�षq�R�n��m���I�؆0��]�.��I���'���Ko�g�,��5Hd��G6�e�I�K�xd[��	���d[��L��e���5w����>_���^̙��̹D_&$�b���y��X�
�����YP�㠭����H��c@��@��.B\:���;X�����96�r���%�|�8S]�8aG��G\,0Ґ[�.�<ϳ$�P9��",���T�w9���iF�g<�t�3omN�NRNhF̙{�l���/*�地Ǡ���p�!?��0�K]	�I���#��ݪ�3�Pt�_K���0_�Y�$�k)�z��w��9�G��h�glQ�`*���p�מ�ET��}t���#��8҅���v��p��8a+�+���9D���
����/k�t�U��r�&3*�lβ=7
����n��u��D��K}!��п�@��M�wz�x�IGA��4ZE��rE+�O���q���-�㉀��Q
�r�����mCE �ijR�+�8����:*�uc=�(z����"�p���Aai	i0�!Aj�o-T$QA��NϾ��^��5o+,��c3��q�C=%��1`���UW�bM���^`;Im.�첔( $��<�d1RBN�
��m`h��'�=��7��+����v��FBz��]
�	3���8��&:Y�2�{�ܕnP��A�sׄ�'�Yb$�v���A�]m�V����g�Mgo�7j���T����.��X�sR����!1n��:��;�n?d�h���P]׾�N=l�vp��o�F��&�$?ܟ.w_��4T(�A%B-k2�ȹ��A�`��)8k���8�c!RhEC",6�*�:)LA�+�Nz�p-��ð7��f:ߣ�y�Ǵ�ˎ��紬��B�H�4B�D��| �����0@���;aV:R��#ddz��:�r6��+���E����j��P�e	M������G:�}g��b�&����R�چz��ꨁ�ή�.����h�੥�P�l%p���I�����~QTA�3�ר�=�]�
����k���P
�[+��j�V8���
����
5���1�ܠĆ3H\+N4Qz�$SL`Ky��ǁ(*p�|�Tk�;.�ĥ��"�3GĮH�)/�Ԣc��b�x��=v<�("��J�0T����ٔ�s2fd������:�7��{^�Ng#05��A����h�:�ӿ�͝h��k�`&~D&�3��E�T`�s��ȋ�p�^���)���c�.��;�
�0�sg�4B�Bh n	
�$�n\Xf�d��f���*��U�/4��X(�c��Ƈ����}��]?Lgi��J���.o���4��uCQ�WP�i�� �u=E�9�mm�C�gI���4�����H�陛������Z=�]:��T�	��1'�g �^���ü�>��p��&��*?�z�Li�%�����q�"[���V�n|4�z0ot]��­	�fx����<�0P!Cu�j
?��[~�U,�Ym3�كm����ذ��~H,=aۍW�"m���d�Z40<Y��Z�*�^�*/*��ӞȊ��jP)�G�],�}���IXk�v�䅩4�>��'4�_���X'�Z�Btd�u �l�?��Y'T'L�_/�0��-a�/*�a��������nE)!�T����>P$�#}><g���un��'~G'NB~H�{.�h
�HU
��H;��Ī��T��l��JK+%�U�-'���#P�o[�P6E?�!#F�����u!u}|-�p�ȋV�Z���9�`�	��$1dP��7���fG�@���x�K�	z��(��Ak�lh6\�
,+l�8�g���Y:j�멅��Q��c�3Ynx��A�}JZ�C�G^G֮W�'|ěr�� x�7�v3�${�q�;��+G��Kɀ�-��߁�=S�=�ٜa^���`��Dl��K��D�cz��S���˷6�O�zX���Ic%C���.z;�����:�0;xsX!���S`R�s�1R)o��j�<h^�R��@`(��>
)�zcAsC,i�Ǿ�G��P�ϋ�<�݋����A�w~�	��?�픓�:;W;^��]Y��t���̗,�@�-��pmѿ��߇(���{S�M%���F7y��6��k�4o/�[�������6��x�.�@��RM��?���e�������޴v��
�G����sG��b#�����ϵ��^�eX���Xo�4�\�z�x�r�T��.(HioJҊ��*(oF3ֱRk�(�ZOF��,����3���C��Չ{�PK�yVS�E��	�pip/_internal/utils/temp_dir.py�Y�۶����'jJ�u��qSer�)�Mm�k_��\<�%�(���S=�ߞ���H]���嗣��b�}��V�2�u�f��Vh�Ti‡Rm��چ��$5���ӊ}]�R�
��,S������Ҿ�<����W|+��`5����!f2�1�1�U:fW����e̮���ç�*�2sjY'��h����${i��ST�>fzo��*#4[����/�[��ߋ4]�f�5P�Ӣyz=��F5U��_��R�D;́t���MV�a� [(���D
����<�J�\�P��Jfw�2��ߖj���t�ɓ2�-q^�ь����._\��W߯�F��RTw�֯��_��/�g�Ϟ�WsQ��~y��\f<�	O�f���8��Z�sI�`	�I���Mg��oZW��^�@���SsQx}�E���u�
�F�8zv�����u�0��n+>�̏��#f ��|�>tL�9HQ��BV�!��1”����A|�[iڃ��K�aJ-�l#v�N*
3"E;�{i�42�,Ⱥh�N@���f�)��⌢��DD�=��c���)�i��g���x��6qHvY�2�V0�݁1�Pa
��`[y'*�̜p�^ˇ7V-�=u��P��Sg{R�Uh𭰘�
�m4kOV�|K�˽�C� ���eg��Z7bZ	-l��)]0#E(gL�1�\��<	���,���4������9`�3����ٳf���u��Ϭ1@h`;���/���!�
�lx�3�Y���
�:A<EyR�h1�
J'�����iS�)#�pXr,j���[���b:˴�z.�l�H�#��Af�������q
;$.��w��}_r�i�y��+�A��� �I�;#�<��Z-7��3���Be�!�	�J��)�bۋK�Ҁ�;�=d�����P���3�hed
o����%��:d�x
�fH�)=f^��X[դ˲>o�`K�ÄC�A|�2�x�ɉ�q�(�uh����z�rS|�3���`b�Ep�p��k:��Q�y��*_�sW���^��W.����U����'X"H1l�E�J٣��'�`�P!�u�#��Rf�v��UU޵nTd�	~��OF��&��`Y��)��0
�%؅�� MSA3�J��,��N��5���\i�_�6�V��>��"�š5�����\Z�)!H ���H:��nc�4:�K�
�Ǟ���/�.�PE�­y�Anr+!m��V[#�#Z��hE��o��Ȑ�al��=4>ڸ&'����Q�㿮5wmm���]�	��D�b�;Ĭ�CV�3�+�<˄i��O:�~<�*��{��K�H�w�x�)��4M¬�џ�l?��d5g����t@z=��}mWClggn���3��
�L�Ѳ`�d6i1ԣn	D	l�]�4�]r�6'���Ҳ�2�4��IJ���|�Mu��B�yF����T���0����6�	{'���$*J(�q���(�C�`��`��M��
��%��8�þ�խ�7x����@Y�#=P�����g�iY[ө�4���`�*�H������
^+�j%/��R��{>c�K�$��k�d��{=[!Vż���z��r��P�.Rx�fyL6_g�s3����q��9`��8~{#��9b��D`�iq·b<<vٙ�,[0ı�&��bd�D�]1��ێ�<��g�Ag
~-iԝ^��=s��o�i�a���\2P��_�1G��c���x����¢P��>�8PZ���B����)�T}s?9+�[W�v��}�v\���n��C�Ŋ�*s4�P��=�L"��$�~"$[�D+D2�k�lw�
R5h~?�s�/r�@�)��2��6Ŏ��Pv����V�,
H]�k��Jr@�RV���e��ី�8�������MVP�d���[7ؽX�_\��6}����[�˗����y�����?��O>u���7Na(hG�pe���ԅW�U�.�N���?�0�Ш�w�ܟ�P�i~��ފ
/J�&�J���U��&ǝ�K&��.N]veҕQ�/�����q�.y�g�����
2i9����̹
3�+q=1�$Gɰ��6�<��p2��B�^�>A��M
NC�zI�v/��Đ�D�5��"z�zU�'-�/RB]�e�1;�Y$��o��tt�z��`{@y4�8.��g�dO���T�{r=��Ӝ�
I~T��Z��)n���v,4��g+��>�n)��%7G�-v9�W�x��o�,}Ǣ�r]�80�ő���#{�oM�˙��5��jO�R�e�^�e`�wcU��G��z��$C�09��C��� �
�)�]��ѰG��Q[v�vM�J�x��=x�QV0t��'��O���p�a�#�!��=�G�%Y��q��z�3T���ˌS=�X=|6��h��	���I��S��_ss@��L�g~~��_h�PK�yVS<�u�
�" pip/_internal/utils/unpacking.py�Zmsܶ�~���	Y�)����r�m䌦����
�#qw�x��Ni�ۻ��y���;S��:��b_��;+si�0L��[�1�ӵ�&�A0��M��e�Z�d��_���u,�7�m��r����_oeI�K�6�nK��ԩ�/r1g�Kc��ui�*x�h�š��,O�����R�q"`�I�5
�D��d0x���S��&�M@.Ѭ
g��}x���??yuv���ٜ��_����0�p��7��|#MZ�+
Si�dR�f�w��qm�x%�4&I�7"I��lv��͛�o�O��������೙��#�o��}��+�?���'��2s�g�ą���:��L,�U ���*4��M,�W\�h� ���^��-�fo�v�
�$~�ߕ3���	�3�=�$�w:�Ē��֢�I���2����l��A�|' ֢&cDƮ�2]ݕ�!�ؚ_aX��KX!P2�e��1��-<����V�"n��7���tA�����Nr�3�=*,�]A�j���#�\8�q��?qò�� j~��c�v�Kp����|��7G��Ȉ�kwyFLM�P�~%���t��΅����I$r�������҈�G���!/�&�܌�h���EJ$�.��/xK����4HE���/��@ 3��i
C���2�+�!(i<�*`Y�QDj���/���Γ��FI��Rހi_�:��࢝��L�G<UK�}(j��Xh5����Q�K*n&�R}��H(X�Pt����O��O�)��9�[W��Z�z�F�a��e���o;=C�_g���hY�0*���8SK�O�6$�f�;Xۊ�2�0���V��!��Ǵn"r��QiM��Ï�}���4Ss9�Zgaqc5OT$X[���UnH�")���H+�!4HM�C���_
FP�6�T�uz�@r�yve�>XiU��J��t
�����e����0;��6��:[�r����E��Х��z�����{X�����è�^	Y=���J@0G5�x�l�$hJH���=���
	�E��^�XU9�N78��m�8�C�T��Mײ(K�pGL�%�goO��ш�i�+\ڪ��!��I�O�R�`�u	��
xí��;��yR���Bg�O��",�H��dA;�O���b�^�K{��@��ZK�-���fk�P̻��C��M9��H`@�|�e^�,�4��]�g������.��q����e�L3DzH扜�������/�C�B 8G^�X1h�
'�w�y�5�5/V���`]�}�s8�T��؈{j�jX��%
D�%��R�C@Q�#�穁֣�b�%��c�T�0��O��+ͪ�j�*4��q�0N9��~׬F�`�aDz���%��1Y�G�,`z4
A�%�kV�k+�>^����'%�F�JEԣ&bxC�����c=�{#��+�F8��'8_A[�p���]���;���^��3L�R�5Ҍ/km1D6�5�hDsiĸ	�!b���ێo.�6WE#�-�X�A�9$��C0;V�{1(�ݧ>C+�����o|�=��*����!	�,��ȯ��(��t�~B�i]��r���t]��\ ���1d�l����la���9��'���¿�P�tY�\C�`�C�ݗ��|�]��r�ҩ�O!��l�=���",�8͕�x>���>�����^1��rc#f]�!X>_�w[X�;�-1�z�_����/��~	�ӓ7Q�R�0�$�xu���4�Z��@4�G0�6ٻ9�/�&9-nߋU��f���d�Sq=y�zy7�{�k��R����`&,����6�C�3፦k=��`ޯ�u�iF��3��Ʉ1x\ߟ����E�3�]>���ڍ�>�!tD2�wA�)^1�
��V̻	��Kg�ߋ� 1����'*�ޡ{�߈xl�}����hwcoEi���$���M�]f���챵��9:8X�Ѫ�S��x@7�k��J���O�=�d��ZW�ĉ�?��r;brU(=�@�М����.���S��Ui�0P����ZeU��B�BS�T.e���&���M.�K3
F��Z�'8u�M��>0����n��2;��3�gç���@�ӓ�E�)�J|l
$�t*���'*9aǛzӇ�[
�9{a��(�����(_ >mBv��cv����kOsK�}ڦ��O[�k[��]�{WfܺVB>�|S�]V9U�ԁF�%�W�m��篐C?N�蝁��w�;n�O[���;t�ۮ�w4Ix�a�T���Hͥ`�(�P����|���ZQ��?���|6h�j��
yN7�\���X���5 N�h�Zp'�������[6�C��@�N����m�Bs�{�q��ҁ���<�:���y̛���Ik@,�{ĄП�H��7�|Ɔ�~�1VŨ��@��~b��<}����P����Ć�d�@n!m���g��L��͈��&���w��F?����z~�����2@�A�v6���!2?��tå?�5�T��.ǭV_&������h~�PK�yVS~��9�pip/_internal/utils/urls.py}U�o�6~�_��/6r��:)0\7 @�]�`肃�km:ѕ�����|?�`~�I���#�Q1ہ|
��V!z�̻�[k��A����<~1Ģ󴅸��!r��a��v�q>}��}��kQ���5#�C��K^6¡��w��lxl
��t���	��,��8z��8��:�Ē�����C_V���ב�G)�#��(����3r:9A$^u�b�?��z�Nv�ZxB��
�~
d����^?O��q3]�
�P��J�knM-�ڑ�*��l`д�?U�\8�8mZ͛?ɸR%�\��%(��x5'�����E�&q�Rȳ.�O���
�h�]�!�$�:D)��0����t�W���4B���{H�XE��O�RD�7�|�T�@�p-��Df!��%�Ë��e'h�/��W�נ�W۞BTG-���ږ�F��I}�eo_��q��qր�!�A��'o�>x��+��c�9ſ�`�IK\��U�g�8 �L,�����1z)��)�Ȗ/��Li~�vğ�'l�|�r�.S�����9(�q�yg���؛�ձc7s[�.�9k���j�i��_�����9x0nC�������c���"s�X��Z���=k0,;"Ug�O¶��#���0�r��଺ѵR�0A��K_�NIo��g8V�#�1Ϳ��C"eQ'��Cn����K9��D��|�;nu}v�`�dxw
ߟ��߿�ۥ���i�W���ͣ��ӿ�Z�֘���t�ޛgIH/8_5?$��
V�RU�"�ڸQ,u|!�����y|;��<�\&~�cq�r���PK�yVSZ��'"�
!pip/_internal/utils/virtualenv.py�Wmo�F��_��"��
s� s�bY4)��+ԳDٷ�w��ɮ����^�(i�d����!#7�6*�ZI��dxԶ�d��d��?�mT����^_I��vR+QE{E��}�Bw��%Y���le�^_^��e��ys��-�yu�Ȯ/.�x����.^.� �\ojYa��X��j
�Q,73oV���X���~;����럶�j�3
�[���$�&QXBf�(��Q�l�j�L`��ZW�5q_�1�dA��u���`)?�P�wx����ȟ�]Kk2����~x�#p��V׈
�Fi�ڠr6m/��k���fT>�I���A(�t`yOzWM%(�p��$kPTm���E7��X2��Y��[C���YgHvǹ>����!�ԆeX;H|V�&{�C9�
>o������A*+1v
/�8���NZLO@�6_�@�A��{>���*��Bbo��=w�{�̇�TDa���')9�!���V΃#,T�t	���ۃ�k�pʕ���4UJ����s��PR+�8������p��o-U�I�Q�|ؙ}�*�rkݬ�]����q�sY�>�e#+7�
�lt�н��	ҧ��ΐ6�@�w�/f�)$�q���?���3�6�F��d3%z� 0�q���y<�2�}�B��9E2I-��k��H�VK�!+f��]���kon�h�;>8eXZ�(��*��6��t��{��J�h�O8�O��j�v�-����n�j�����`5u�-ɀӰ��V.	%?>ĘxL��0�Mc��� �=�tU�O+��{u�zh*#��E!CgU�&�P�N��%��C�v:,���z�|���ގ��2�ؐ�{�Q�b+ƞդ욘f�
r$d%�u�8A tjB���:�}"��"�h��$�܄����;�������\ښB��cWK�ʊ��-�p���@�S2���;'�</�jp_ڛLN��?P��ϐp�;xzX�@g`�����6a�}zpqȀA��6���M��~A!5��!��G5�G=x~�<�_?�9�X�Y8~�/���b�%���F6H�`
�H�+�ԑ9W�t�s�thb�d��<d�]�he���#�:nD����
i���x�L�g���7�id^�i
��E���pF�Y����i��������w�u�P$����G��e�j�_�PӮ���Ƨ�}��c�����6K�y���Cά"�/���O? ��O`�Brp7��gʒ֬�V�e�y��� �tGc��P�\��̎.cw��=4���X?}��w���PK�yVS9���pip/_internal/utils/wheel.py�X[o�6~���T�Em��!�-ۊ���u� h�����J���;琔D��e� �E��w�s!�(���V���ȶ�l�*�Ъ;�l؃4[���bkY	�-�(Z,dM{�v��U��jk&j.��Z�`n�k�8]�q���~�'���:���(��w}W���m����߲�	~I����;�e��h�V��⎣�Yod���7m#^�D��Z��y�ɕ�m�
�G��y٬[���G�R6}�� #TëL|,Dg�u��l�^�!��v����(�kax�
_,�_������޼��Ż�߿�fW,�L��d�X`��+�l#�+�-��<�eEŵfd��O�$�����:���d�-7��f�W��-1��M�
�_c�E�u,�K)�,@���X�j�
���
����}�Z��KK/v��6�Z��N�A���K@M�����a4@�fgZ���z�ڍ�Q���	����F��G�U\+I�5��G�E��Ec "��}e��Ք�s�$Ѐ�kz”�BӸ�∠q�?�Ț1Dz�=V���Ò��!
� �̀�y9I�dY!�+J��
�?�����qAq�&�@ៅa<T˦j�FB�%�/�a_2��%�
��Y��@a��u�i9�j�sg��:�XÜ�-l���$��g��{�I�/ӆ+�1��:�{��'Qr;�k�Gs�;�h����U@_h�H�|LC�"�%�]%M=�Rv�9I����@Z�/q����9�D��!w�?�-��
�}m��`�K�&57��)+I2����Ǒ�n�K�S�$�K����+�%��A�@�r��t�c�������e��շC�\4��8�`^�F
u��'�*j��	�0�����v6%W�v���$���jQ�)x�� xת���
ѯ�������,H��h>	����s��q���9���d�3n�J#@~�{�5�/#�M�b+���hk���������ʱf�ÈA�:����g�5tA�ѹ�mc�l ���9ck�
�"2��;�
b��@�M���[�&��V��1N,�؆lF�BR=BרMں�0��e0��ڰ�`O,��5{߅�����X�-`�
~X������5�wb�-��hj�|4B5�x� ��:�pxQ2ȭDr��]~VxPv�	��T���V�rJd@.�>�r�xL�$
0V��Kߣ���8L��
c���M��m8�|%\'��F����t٩_��ic:�6�&���Z�*���|T0W�2@S��H�1��J���hrΣ�؈F(87�R}g��bg�.���t�h@S:���m�Y�qu�8�P�%���i���GM�+
d%_V��Q�UI�Cg�R��VT�2F2	��xȘC�k��ge��\�<��B/�͏�'�@\���ث���caŤ2y�}`��	��ʪjA�՟�->~4<�݃��Ф�،�0"�5�Ϝ��Y��"�I|-?	Q��8ܬv�B$��j���p���;��MQ:i���;�Ԋ5PZC4���` ���!ޯxq��#�E0���RM�crӴJ �lZ��px��'���~r���K'C�l`Nβl@�CXH�ԫ�΄(����(�,ف�n�@xt��C��=ù�k}��J��3�Yr�%�3B����q�k�ń���g�,J����y�[b����vJ�u���r�8ˆ���|�X��0��IzX����^ԓlI�b��T{�XC��]�l��V0|�[�6�1�ِIp
8���Ţ�"�9DWM�5��6�Y�g��2���ڍ�j�\Bz1�|�u�@��Rm��j#���3'0(�	�.(��X������C�����P�e����:"ޘ@��
_����]��� ��~%�)r
����R~��1jx��@�	��u;����*��D�c�Q1���v'��J9W���nt�^�fH�̥�#y�,�Y#��̼�V'Q�<ok:��_PK�yVS/���/Tpip/_internal/vcs/__init__.pyuQ�NA��S4� $��ēW�b�.e����t�t�����B��$�o�L>:��G��B&^��3e��ª$��S���0�\4���[
@7{��C��5A��F!��)���BKԑ,:�ՍOJ�0Ԧ]��3|3#�ld/���Շp��V�;7���)����aU{8r[�
cZ��ϖ
�n���ן�<+]/��e��)�j��OD����^#�+�1\��8{۱�`�w�Ӈ�����";N*~�3<��W����:�ډ�?0��>7E��qK�6B�b���5`\��/PK�yVSA@\��)pip/_internal/vcs/bazaar.py�VK��8����XE�(W�^�D��(+E���F�Lc�؎m�g�����L�.����W�Eg��D�^�����#��7q�N8���Z1����H���F��
幅���B����-ꚫ{�j�d��0�^?�Gcuŝmt����:����z+��zMA�v�P���|*���r<�n<�z������i�?k�I���h����!���k4�!��2p�o����lG��=�wA�R�X�)�M%��`̦K{Y�.�I�$jaGY1	-7�N������jy��c������{��2w.t��5�gWD�RIH>� {|�u�yQuܷ����X�9N-?Pf�.���8o3r�W ��d�r�[EvɭMrX6�������S�e���c9”΢C�\�
�~֊�=�p@wv�"i6�GBhv�D�C˫o�~���{���a�D��/7�m�b��i�O��Y�}�o�Ȟ�$�ߓ�<�P�,�<YDp۫���";��������2��1	. ��Xoc�SL����5���^ʟC�x^d�6����b)8	C.��{)�]Hx�����i*κ��j߈'�[N��r7�����O�Hdlu��0@�ׯa��5~2(�A@�[��C�\o`Ff�j�X��h�D�z�r����<o�a��$���cc%����'�FL���w��<WLT]��Kp8$��k��:_�@�~b�q��J>o�m�#F�+��hK�P����g�%@�%>Am^��f6�FSOh'M*�U8�tC�(	��0˕?��<�<L�zZQ�U1z
��ݛ�U]0��R�(���1�	��s��W\̊?�<�Wb
ʨpb���^$�A���3*�L�Tȟ���K��s^-v�[��L���ݾy�	P/LCx*jʿ�lh���L��J�G��	�$I��#{v��0�p6
�=Gj���%���<�\��h��0{�m,�PK�yVS�_]�Epip/_internal/vcs/git.py�\{s�8��ߟ�L�T"Qqf�VW�I�qu�I��\��0	J�P�� ����_w ��d{*[u���D
�я_w��u^�,��-�����`�˥���S9�?a�UE
ϡm���
�[%Ty�����5Pg��OR�c�a]�<��]U�T�k�B����W��	j�l�y|��V<���]�J���E^��J��`%UdI��q,�+�&K�N�.���R�"��泥����#��	��FzJC�6�
6�P0�(��"OmO����eU.�eI>�_b���}^�Ϋ,�Eu^��S�~�ќT���z�3=�~��,�%�e�Qy^�8��~��0�����̑%;m�s`�c�*��ļ9::B�41B,D�=��0�+�0�ћwW�����>�/�ߜ�/�(D�]�Thfާ�f��<����H����o�#z�O�k^��7A��,��dּ�������Mc[�\��m�'�Q��*�a�LfQZ�(�<۱u!&�%f�\��B��+��X�DV*�@1;.Y���<��Y����ۡE{���$y9y�l������<h
��}d���*��k7/�(OGL-A��0���`�c`��@ǐ�,���<?>B��y��ÐJ�b�P>�������(6�V�j���5��O������4�Z"���D�������Fbi��g�J���mC��kXw���X���@��W,�KV�l��ʒJ�y*L��G�U4�2�R�E���԰������7�;���4�}2�_�Ǵ/A��pyN�t��?��B$.�Z�j�g��b�&�`�<Og�kY=��V(��g��	z#K���U��p̣�,쳠~HzoGi�	�\EK�
�jA��z�,˵Y`��>Tj�}��v% j��Ȱ�y��J�	�c�D��E���
/$�bdi��&�ߠ}��`z�TѼf�i#~�nͧ�d*��4=9���[%������zw�}�����W�瞞(l'��2���������+�޾�,e��2�m{V/��5��Q��t����vV3�H�5��=��H�ժ*�Dv+���W"M�h��*87�C��p̰on��)��h����+�:E��j2!�rZ�������<x��H�Z�u�2�q���>Nz�%;j�}D�֯@���/ �	H>#��N��RFK�֌�Ӡr�)�!�dh<�(���w��Q�1�%M�@#���`~����G�58+�-
g�g��������Æ�!xI�"s�J/�4$�H2ʫ���4:K6�M*X��Q*��a^��	�ZR`UmOViϾ]?�u�w�K���&�����4�/��kX��AਉEF��*�x̿��K�v��q�2U9�}�G�+̳twzUT��+�[ �C%��=}��mi�'��"�����$��43c����a�s~��%2���ш% 8n&M"Xy�V>���|ƀQ2zdvR5�9G��a@�F�ǫ�_�99��i�Q�߃A.����G��ZA����cQ����z��7Q��<Oe`+a�D���@����l0�
4j!��;�hV@�X��$`m0��0�5N~c�l
9����|�t�%T
��9�=R��1�v����:�l��j
�R�0`���A��XE��) �מ��`���ۺ5�e]!p��n�LK�fۆB�T�0�j	��S�d<j7�+[�uG��o�m|j%�y�
�+@��7B��l�1��
��{�[M��q5�F�>
Z\�"�4e�ۣ�ʡߡQ-�H�T�b2��Vi��ҭ1Y��*�8�gs�1�J4��Ȝ�Z�\��,�Fl[P�i�5,5h0��V��B
[^���,�KՔ!
�e^���o�Ӓ8ћ�>e���)�>�Y�KRV`]��%�DԨ"���K�vR
���̩'�
o�|�&��������g�D�h��S����Mo;��o����K��Pӟ*�d��o�a{�� �, �J+fD�Jw8 �#��.���5��nh�)�p�h�ڊ�$}�&�&�?��B��n
�����F�޴�ɬ�e������鋉�h`3;R��_����t�����JPf�O�������Q΀���\B|.�L.�0�Y�yI)�d�9�#1�
�G�oU�_G}m��'^���kPE�K+��w�w��/��cJ
gԵ��-�	�UM+m)Bm�mA�QӼ��M����f�~���@�Fu+D�n��0-ԅ����2
Zw��V#�}�͜F=��;���R�Թ0�EQ��~;�P0S��6�~#�`�][���FK����t���gh�K��$�+P
̶ ~�91��a�`@ؼ�FlO�|�6\��M1�3_��+�8�!��0k����ψ})��3MO?!���'����Y�w�]�Գ�T�g�-�� ��I���o�k��OLvi>Gc�Q���
��Iwl�^0�	����7�+=<�� a �E�����qbP����F�@�q�]��l��qw"ę���Y T���>��I)l�Q[�/��3ԛ���|����mt�NAZL0�~ᴖ���ˬ����9~S�6��.�(��1�R�	0B��KQ�D� ^W��c$`�r�柴Q��‰�p�9쯠���5�-C�L��'�P��즠\�PY��2����%MH��Rr��G�BG�^i|��6�D��s�Q���ij)�	��%ʩ�Ć�v́���L'��s��+)����;;~���ڂ�lk��Rx��^�l�3�(m���Jf��]:��!K;Cײ�G�n��^��	j'��\�_G��0�ș�ْgюW���bL���4'���FWov�z�ϯ�ކ������k�{|���׮�F͚�s?�C0��\J/Q���h8��Xȍ���7�*��9�%}Hi���w\*���M��P�eK��t
��S�R7�NOiM�DGo-��3�-j[[li��Im0/��152Kr�;���|�+y�S�Ze:�k�zqm�n��nvw�q��cv�AP�a�1e��b�F"�R�$��yp�NO��3Qъ�?q���<�ΝN�k!bŪ5���w,���d+L�L$�4��<qd����{F�e�zoIbua�o���ĤAN�i>�e�Z���
n��~�?mg�B_;;����6�r�����__�����2�T���Xة�IWK{u��Ն��9�ko��l^���4��9m`���mF�b1�����CwwR�q�m/%���G^�}2��bD϶�h����Z�%�0��r���7���O��C���[����e��j�WS�3�#�������.b\�Nv)u�g�X�}�_N�
�讞p�Ғ�N4��:��D�%v�ΰt[���4C��<�3O'd?Ά^ﱆ�7Л��q�kKi�{��+그�=y�>O��R�ߗ�cĖo7�t̴k7���":�}Fn4oGyV���*��T4a-�ZǼa�ڬ�=���-��v�_�g�\�3�)�@�+�cӌx@���(9�k|�pL�C�@>�ߔϏ�kY(���(J2�s�%��2&�vO@x2f��A%bS6�X*�B�]s��0
���5�	�{)�az�T���!��p|$d��\�d(WLr�/�s�e�d��4+�������<��sF�@��(�9��U�u���d�&Y�Wx�L��������MA�	P3�ä�,�*L�i�S.Jm>,:���	�ACu��(�!��s6�F��0MϣRi@<[�r���,ŝu�ƘN&�C�B,��5����7A��l��dzT�B%#:ASdu��^
�r�F�
��g
00U�wY,�T	u�n@��K(YG#��ѦBy�vm���X�P�w	�V�B�/-	>m�l
���[��u��Q[<�.�x�-	[�<G���=T�,�6��O9��Wm�bJ�����x��pU��,�R�W�'O�ܓ'�J���v�$`/YRa�C��z�j���I�sR�E�9ҡ�s�F��X36�̴��b�X���:H^�'���Ɍ86ެ�55ƨ���j"U��?g+<���\#׵
���;f[��MM��VO����
� ��uԠ������X�|�#c1i5ʭB*z��WS�u��hN���)����p�*.�,�K02�	����bix5�@�+(ΰ�6N\����n�m�.���d%і��N������b�z�`M}��3)s	(���#��pW�h�XF�C{x��]`؆=Zж�-'�īV3)��w<;�'���ǃs�ޭ�U��ysr�|z��b�����(�v`�1��-����)��ɽ��a��:��n�����h� ݞ;���s
�d3�ӫ.�����C���cO�T�A�k?��X;qXrȹ;����%�{A����[����lUK@(���J�^�E�+5�L�G����{�߈3�Ҟ��n���^��:��2�,t#!8�0�8KFW�`�(4a�x��WA��=�L$�y���s�SI�ղ~�>��MEl-�	������;h��$��LR���B:ΩY�m�k.3��6p%��Gt�}�+�h���� �F=��Gg.�����ޒ�m
yU�_-���]��w>�H��ш�\Y�1<U�:ވz��UIi^����q�k��x�+p�:�+�=��SC�>��|�С����lYMj�_��5�Y_3�����m5�NJN�Q��m�`5%�b�	��
X���.b�o��D�@��E��ߧ�׊j��|o���cn� ��k
KXO�W���N�b!�#�P=��S�
�}���\�E�OO�����왋|p�cXv	E�F�c@��؍!��tTߔ�1R!�@d����\G�d&��*�%ũ8��M�:�Fj��NA'ډ�Ll�&���<����(�9�EQ#�������'77h���ȝH�
mn�N+
���QY}�7����Z�S7��5}o���E�|ӥ�1�mvǰ��A�.�pw�C̯/0Joo�9GE�6s�
,�]�O��4W'q�Q���1]�)
t�eqQ��`���kϸf,�;��w���V��܃	���L̴��eXC�e6���v��N=w�Q��/l+�u��^��.<j��eNа��]z�T�R��A���w"��ʡS�e�t#z	�l��;�59���ӹ�A��@��OD/͟�<����Ήr0n+��c�:�������Z=��,��C��
1x��{�h̓��VO��*.$'X8WA���\�9���8�D�̔N&��Zp�|�˘�t�� ��I9���S��:�<��
��@Z�}�	2���b!���6�PK�yVS�oɩ�Qpip/_internal/vcs/mercurial.py�XQ��6~ϯ<�����=���a�tm�{��fbu��Jrr���>R�9�]n��_S$E�#)ʲi�q��j#��0�BZ��[��ë����
s�������-ٛ�I�D�,�ls.������v�Q�7�i�*��We��kA?�͜����捴Š�Y��>�=�^J���[᪇�m�n�.��f4��E0�a��ԣ��H��6߁��
�]����v!Rv���7�7�6R�|�
���Fk�iCn��5p��E�XV`�Z����RΕh�s�Z�@�StF�:����NbGMI�M�{)�@��7c��V趨����1=�蛍�!YNH�s�ɞЬ�N)������5�yVp�.��a	�0t;.�֦�gŬ3���'�-�ܭ�M��(v�|w�Q�\Qq��B���뼚%�tXM2����U����5+�k��ŠEr9��/���pΥ��c�}`n��j�^��9��Q��A;��h��B\R)y�׏�P rө��Ҹ��>/�,��R�kK����ć,�0{D�Ĥ��u'��0g�ԧb_^ӎ�'#�v/�g�k$4V�Vۜ���R��.��}u-)�M��1Jƽ9'�7����RÙ�j���
�2�l��,�4!�,�"���p�����a�*�[P�f��'��ʩ�6E[�t�F��‰��7�����~�=q8.�~(0ݧ���0Tir���dJ��c�0Y�9��Y��		�z#�j{�Mє>��/�Ή���t/Ǽ��5��l=3�6i���}���xf���K~��w�v@�rZ�(W���6��G_���
���mb+�yG���ȇ¸�vb�֕�s�?L��e�µ��L�mi�7jM9Z,ۨ���[̥��^�c��P6M��b4�x��#Ηw�ϥ�$�
O�o�$�wa'WATiW�VTBm{�3�5k�LƢ��dEu<��׀:�vRl (`Ñ�#�������SG.B񹓘�ȿ�刂ľ��F-��
H�ᄑB6#
�tG܋
� ���.��I��t	���'��UJ�I�e�0�w��Yӱ��N~�����'��P��Q��Á� �/��Z}M<����x\�&���*���hb��|��CG��n�X�a�҂��Uo�0������㉚�W��b_xH8��+��rN�3��b:���v�^��z���42L�Ҋ�MG�N�yl� ��~8�̕c.E��,~�
sV���4����%2���ki����
�&�D�i���Hx:6�p�`>��v��Д<ˣ���xp���w�!-$�l8����88�mw6X���N�%���y0�b�K�s���@�%٩�>�/ɹ�5��@\(A��-�zޱ��fsHS�8u����l�L${�PRJ��ט�M������>�з[i1�x��PK�yVSj�b�6L-pip/_internal/vcs/subversion.py�Z{o���_�bK#0y���%�����]��-�^�+�g���%%E�{g�A.v�^��h��>fgf��Y�y�EE2�^��z��\�O�MV��ڗ0O��TVS�cY���ٔ\�e�&ze��a�0�U��0Oel����K��W쾚��I*ˌV=��(����h\�[�̥��h��[�OR�ǁFZE��6���x<��&��R�Ii|�����S��;|��1"�X�[&$(��Ϻr�^.��}d9���z��"y'vb��)���5ɷ����P�	���^Z�f�5�GQAsE�*��"�ϳ�Y$,,A�4c�!�{��_���;�j������O��%3��M�gK
��S�~�_�D��<�s�?ὂ��~�U��~�@�I�Q����(��j)X(5����xƴ��A�J��x��;^WzJ�לI���S)7�T�{����,��k>�@dI�^���j��[��u�D4I"�R%)�*���,N(������5��<��iޫZ�J���P�q�0��J�5�𡥉>|
_����Lx��v��H�^��\��
�g�ߖ��y���j���ӼΉ�EV\�l�������58�1J�g���g�:��s�
�'C��![���9R����|Ҍ"��)������hv�[6�V:�VZ�+x��pw��Jy�X¡��$�����Tp�������ki2�_Hi�'�m���t1 �2�Pn�o�O_K�l�6���//�hw�{0)鷔����ş��0^@v(�(�yP��h���2�8���1��`�U2�>�8J��[C�
f� v�c �(�~��Դ�ʧ�{�t�n�2k�a'Lu����m`c��XTr�V�o2���3�Jq#�AA��Sޥ%I�	�
�%}���uЏ��Ͳ�^���8�J�~CKE=�����_�E�R�D!�k5�?Z�BX�E���r<�\m�F�+�H�1��R�D0(�\�8�e�A0����)��
�٬�L{:�_q����p��	bF������C8��
�Üӽ��}��1-+d�F�A��ѐP��䎱r\	i1dٽ����c�k����D�w��m��%���iʆ:	�1���X@����
��^]�S�x�q5g������3��<
O��/@Dx?�Q����@��A/x�(�0~h��ԃ����V�
�6X��ܢ�Ikz�D�ꗭ�:x����NZ���
uaO���f7yz�x�qo�l��i����k�[���Y|d��!�rQ�K�=�
:�H^��a.�&᳸�b?��Q�m~Gj�C	�C8@Ń[V)�J�4K��/@N%��ϹH�Q��|�v�g�����h�z��Z��[`apHK����=��C�ȟ�!jLP,# F��@}M�6S��=�Bu0B
����?�aMa���-D���<���*H�:U7ԥ�is��$>�Daeo� @@c�.@e�7]ڹ��`0"h
h���tCa�Jާ�~h�����'������k��(���1�`�1��_7.�s�`�_���0����BqP��z>��`��E�|�jpҊc����2		�DS�����(|I�4l�X(|hN:TN5�8ȵ�`nv�� |��=0~4�'P��!P���҇;4�҂�Qh*8�{��O��S�A��YZ��%�G���@�6���$og��.��T���O�ϖ��~L�m{p�I@^�3�q���s.jLy���ϳ�>��h���Q(��G"���74�?Ӭf���-M�=���ȅ$�o��w���R�Hׂץ4�e%�������\�l��QN�+T�W7ԝ셠J��2�	F�`kL�BQ(1e8�ʫ,jj�<Ö$�лe1�Cn�4A�~�[o�5 �5Ŭ�I�om��&L��X7L�;�{�hziq���5�Kr��1�pQ��	�W^��e!���!ً�L�5x=����1�2xo����5��7�٤ Ќ����ku����}�M���)7|�*M���`1,S+"��w_�b;��Z����F���kb���Б�ȣz��ֵ��np�)r���e+i2��7-�ܢ�mC�8�^9C��G �z���x�&�5�>�3]���i���yޛlG���u�4�D�T��
���&-��+�"_�l�� ��d�6jT�t�.��� ���w+ ?�p_o���ݧ�Y~^
�l �)���3P	ڨk�l\Ļ��77�)L���e�b(X���C������M������C��w��B��լ�es�aW��o�3ј�2%a.�	��M#����G��(ې���k�ޱ��6!��Do_�6��.�V�jHB�\��)-qK��7�zU77~W�v7�C0 �n�Q�j�a]:�!�����b�l6��r�Aw@����ٵ�5m�<
���s⋣ӓ��Ӡ��`�V�t%�=�%�_���ٔ�,���g������Ɍ�p�,�b�G/�y8�ԗ��	�������ç~O9>�SO�d~�89[=wN-�@�~�.�G�<��,�����c����(���������y.�����	���qC�n��L����/��z�����c�=(�9|��;�Z�ukVw9��Fm�酶�O��{T�bi*��Ŧv�.-�}L�1ߛy��V/���(V;L��WUD*f��9ŏ��-���f�{^�����yJ���b5Fe�
[H�V�{7� �;��b:�sUb��.�2ے��	����Ou.�o��ҪM��"
����,���+ŸՖ=aEU�)�e��n�gm~�=*	WaA�U
�+*m��.�Ɵ>�r9N�k"� /��Q����;8��hv+��{F����S�y)����Ԙc��|UFW�7�*/Ǥ�6tg)b���+��T���Ǘ7�7kPP@�Ь�^kCx(،�a�AwF��6z���Mo�.��g�Χb(��a�`�x_/*�MB�����-i�M}6+x1s��ݣ�w�w���{x�g�+HɧX��ǂ~�Nn�h0�ΪQ�Ƭ���s�-��z���n��9l겨$-�}=(>ӕC2q��
J����K�e�0���@n��$�?�0�>�(�h��S�!�e��v6�Y��oV`��!���K�̪"��m�vm�S]��Z�����9B�`T�=wx��T�ey2,\���w�><{&��%y9�m@P"`�_6ԃ��1NZJ�u� u�K�
��g��I�u!�7�.����0����\|E�$&�'
h[�AouqW�]����X،4%��
�v�Eo�jg[3Ulg�e�pW�����`c����H�+���ٚ}a���#�M3z�����oO�|����
6*�
{Lw�u���:i��'��z��c����r�#�ٯ��&B�%�`ȹ�+�|FZ�cL�ڷr9������2���4���AS�����L�'���40ᷙ-��PK�yVSs1!�A�W#pip/_internal/vcs/versioncontrol.py�<ks�6��+�t�2sQ��U�*��+��%N*v�u�UQ���C�)y����@$8��ة���ht7���$�&�ˊ+�W���-[��V	Y�B�]+�%S}�ȶK���H��U�Z��V*{��}'��n?��۪��[ŏ6�ܱn�f�/����/��o^����7_ѣ�^_�E��^w�����:��o�2���@�|�t0���w��~�o��O5�X-�4z�h�L���E%R�j �E����m6y�c������C�������+��V�=�/�V�1HP��*BZ}#ʒ��3�\�dM�m3�h���u^��MV
C�R����P?ي�g���6�zC��$�iw]�9Rkcկ�V\
S7�~�^�+f�ڬ�.��Y���CLx׼C�3Ul���pnB:%T�L��T�.��(�e_�.��n����R���x����Oُ|'o9�ýbw[^���$av���lĿh�Q7�e!cg�"�-Tr	�pi��5��,��g�,���2��}�}]o$�#a��~���rł[[�
2ȵ@ �^,���l-e�	���Ȼ��Y���Ի-g��7�U↳����i�K3�	�B�-�,ml#��Ys=,���U^�v��5h�uM�b�W��FT����K��S*�̤I��U��h�MM�-�8��;��
no���x�e�V��5�iH[�0N�h	��H@rҲ2��s�*,AV��ɎS7\��Nt[��{Vs^�㋦��-xz���ZtO�ej��SA�����^.�[bq�Q~}��}a��m
XV���1r!K�����&�h'��\�~z��>�a~J���D�={���C���ݟ}�w�ϗhlؽu��`'��Z)�WbFH�f%R���[��<
�r��E��f�!�P��)�����PK�[��ߑv PW������$��r�����Հ�U�Kʤ]�AgXz^��,�FT3��e(����@��:�X��җ��nsd5�76 �r�]媛�3
�I�"YR��
�aޮ�Y܍�g��R����ń<�z�!��f�2\}��F`�H��|$i�N��.okh����e_�D7��)�a-�NJ-�V��%Sp�m��z���j�,�d�zܵN��첵�P�
��b��0z�<�`@���ToM��;*����r�����+9N����2�5�p���3Pyd ��˲���fŬ]��S�x�-��#vC������Z|��^֠�U�pT�Ǫ�؈M� ?�Ѭ��Y��
:h>�L�Q�E!��JK1�|��ڒ��Q�9
⣐�b��;\�NL)��	�m��Sr�/��uq�c��r�I�m܄�&�Ҷy��At-=�1�AZ:t',}����S x�%� z�/ZBwp��:�����㟃äH��SǢ�b�zI!l�/�B�޺��`o��%���a�uҴ5nD�	���mkR�i�Ң�$_���>X���"�g-�j?}m���DX��~&
�޺!#��y C���Ё��23��x.���H{��'�qQ��
LP�3��c��-p�(ZB<I�����GC
4=S��@=9��u�8��S���Q��'�cʹ��j&F�������j�@�VJ�r�����5�3���E�d5��ﻜB�B6{�)��%,�.^�u����:d���Ao�^��
��@�T�sF#!�V��8�͙ߟ�VG�U�r
:�ݟR��\���ɋI:��<@�B��5�����?j��=u['�K4�G(��`!:C�dˇш�`�)E���[!{�F	/�v���Xi��Y�UA2�$�R3���}�e0�ԟ�Mg����Á���}9�1�yj3dS=	��b4%��b9;���ǣE�raP��<��<È_�����w��AM�S�.Ԏ�u��dyng1a{���4\k��蘢�u�"�m��6Wy׵�+��,C,G�Fr��<;8%
c@�.����ƶ�*����8"S���vE��bö��p���6�O�:�4P��G4
3\S
�:�t��W�)�nTm����B[=|�U]��.�	L<T��q9FJP H�!�0�H�5��!��J\�[LZ��1n*0Qf��il�@��S�
�al�!~�<ƙߟ�7�������B��C�-����c'j�)�3�o�/#W.��t���.�.�����+�8���VJŭ/���K�p8�I�y�dox�p�@!i�L�-�*vg�?6t�K>a:3G P�S�Ie�X`�⪉&���Ɩ��7�6��{�HyJ
� a��G^�'���ĕ^g�:�ek�X�T^��?�x=��c�,r����\�a�x�R_��v9zI���~Mהj�ٜɢ��I%���tu%��
�ǣ�͖��L:;ww�.q3��z5����#�Fp��-$�x�_�ν�b�{:x3z�<�4MQ�>vI)�PߊV�<��K��S��2�����f���Ԁ80�(D>�#xFT��n+�Ap�&���C������ �f�h�jFjT�dgl��K��� EUA���[1��-�^�}�<�Љ!d�M[2;+�)D�m�0FYl����t�,W��9��t��]�ԃ�s��uJ��{бh#�Mԡc�"�#�Gj��ltl����B�$fH0D��X[�����\G�jD
r�{����"��lU>`��a���(URʻ��y�@ &�Q�C���I=Gs6��ɡ�;B\�$4q+@_�;Q孕΍�`���N��Q��9��%1�lS[�3�ջ�:�1̵�z�^���i^�Y�1�Y�k�'n5Hv�����
�����/P,�z�wvs�"�P
���?�I��vtii�j�DY�ܣ�H`f	 G�!�j���d���C�tyt����a�u�eis��}�zv��z��yX��j�j��
7��F�V+h��XK���-(��<��C�zG���;��MP�h�<�Uw�^u+;�7��:�lki�	DH�W�>���Á!���@�Bv�gF�CW����x���Z���%�
���x:5N�e��l"ڈ�6@�̫�IB�)[����>{���$�;��!��ߺ��z�̐�ag
c���׳��`=�px�gh?g�`�,_+Y����#�N���Mr޸P�ҟ��h;hZ��]-�ʪ8��?����ӻ���B�\T^]�j*��+�“�������)������wR��=@
V���S.TvR�E�Q�6���|�u'���ӏ߂��1��KY�A��v�~e��)��aB ��U�7}@��D6�R@y��i�˾�Hs��Z�Q�2�}��rQ�^�Bo����Q��N“V�hy�vhq�����Ah��^�
��nEN`���X:�E�c�x'��.V��88���le��5p`_a���2���MY��E7��Q}��f�Մ1l�+�^�
+�4q��@�,�8,�,V�N`�<�ٞZ���
t��7����D�z�?|[�@�7�<xx�aN�qK�R���q"���@;�8f�{��Wl��׺H��Ok+R]aI
���I2l8�E:��0������d�����Q?�����%��R��
tUb�S�(�@9�^_�
���W�*:Y���ӓ����׫XW�/��	V�B��YuON��?o
3�*I������R�"���t�m��bO�O�6���1kt������ܶ�0};r�;�K���4A��;�/��3�n���	��H��<)���{�.	�9E�5㻦�;�d���g�	��V���c��p(���c@�A��j>3�FO�s��PT���֤\\lI��8nI�p(�|S
�VF���U�w\��y)��\�D��C��ش�\�?T/+�Q��jk�z{q���S������M�HT��:2OQ���p`��-�sڗ��טͶ(j�P��	�W�`��<ᱭs>�7�@g���a�)�Ũ�C;(���B�d����t�+������36ǖe��Ck�FQ�_4������}�I
rq;.o�m��C�����>��@?Q	s�6aJ��#.��l.�P7tNZ
�}׊f��Lfk�h�jp����.���@�\aݝ��e�����Nt��5P�&^���Rl6���8)�6���%V�G_}�U)lx�ՓCqِ��(�@4N=eqO��+��Jdj�J����)m�kLO@<�;s�����BzR�ܕ��jӠFk'G��n���C�/�g�0�-���x��$���a��hoM�����������C��)�a������W-D}�c:��K�(b��z������O���*�I�L���V@�"^��7 E9.5IVSyTmy̯����k�����;�+��8&���=��ڞUh�\�J���ޝ,�م,n�k�C V���j-��v
� ��C-^;�.G�K��SyA�M	51d��Q�O��sˬ�A���3��d�v���'9�9"x��`��d�h�_��rl}d�vK�:� X�A��K��6RI�*��@o3�z��Dj�>$���d��dP���.5�oNS���qd![�1}�8z�j �P��Qqߧ���l=�x�ᔶ��F�~�|D�i9�y�e�S"y��Q�ND+2(�@��
��f�~�T��p��'��FS
�i����?^)~?���7B�_�"ǰ�FP*ǝ<&ŒL��W�w�� �<�U��P>���y�)z�?�{�2��g����z(Y�%9Q+�K��!([�-E��K��K�:�s�����~fcʛ{i��?Jiy�/x��Z��5Ir~/�z�����50�_��;i�*�d�o�'B�����O��߳����!-qL�!>�A�W�z���k��)�pF��c�ʉ<��)?,W
,K�s�>v�H�A��d��+c?
y5M����\�].�^��ԁ=cI����+�E�8~z��]rP���FC���hd�����;X�1���3ӕ ��!T�3�46g����t5�0�}8&����L��N�G��eMg�=Seh"�"����s:n!�Q�e^+�F��f�c��&T�#�(kt�c�
�W�F?W����~�4t#��l��6�BU���~��{'ߍ�v'��<=�@7!�;{��9w�@�����|~N�R�j�.B�1"��w�ƅS�����Տv��F\�-/��=���
���.P��ǰ�ю�͢�k�ᣰ�����S������m��x��V�e�+eQ/�'�Am��⮼���3�6�O��E	͏��䍑��\~�e����().o<`~��-Q��E{9E��$�N��}3`(R����m��>2�����i�e�iP��&�(3�M�Κ	�����B��Q�{���ͷ��J�|˾�uJ����]��-�[:�3��7�e�l�ݘ�Lo��ս)�6Ǐ`
��t�YQl���J�-U]����N�M������Ē���t�>}	��܉/�g�],��
�Y�adpOz���Q��w+��8C*O"$��|f�N��|�F�9�>���	<�
Vd�%޶�L_����wxfG�����ͨ�����9��"�?��T�
U�EZ_���M�nc���'y�z*�������^[�i
�W�M%(:@BëOnAז���7M�<è��}�!����o���5��Z�rԜ�'�.0�@=�*�U@g\l1����G��-@�k��`M�[�
,,>j!C�X# ��؜G�Uu@W��P&��#�Z@���6z7 �H*agו\�8��t�N�K�9-*=X�,�$o9ǪQ%P>�l���y|P��"6�&O�<�	}7�;7U�]�l��/�$���`���\�c���U�R��|Q���g�^6�NQ���
\x��w1�B��e=V�4M[�L7G�3�D���2>�����}gy��w�]�k%�>n�W��WK�����<��1��k��5W֣�vE����k�5��� j�t˚��Ғ�*o�2���
;���>��Xy/�Nsg��
~�qTۊ���[�K�Գ��]�bu��5sDGk ,.�E����/P⊮�=����>��\h��1�����PK�yVS[��'dpip/_vendor/__init__.py�WM��6��Wʡv�h�i�94�
 ��!��4���D������}CJ�{�hQv-rf8|�捜�iҩ.�o�-�ʉ
��j7��ߩ-9a*c��,�Ƌ��d���DkaZ�LC��-��d[��$y�4��֩��`��]mz]�5��K�PM�{��$$�&��;�%}WJ#�sK�)��ʚF��d�%)����}o)��3��vF���$�F���ݸ�����%�#qi�m<@ G��j�{c��֪�E-o	�����H����R;�h8>�ʉ[�{��o{��_��UZ�Ym6da,�Ry\W��
�~����ZݐH��K���V*�t����߿_������C|��;�[�^����ܠ^1�RY*p�]��� 2G�m�Ej�RH��*��Y�i�ږ@��*�!#��<��|,Q�w�8 'a���`SN����KZ+���!�L"E�}�\ ��g�HY�X�}M�c�T�R��P^N.y���ջ���@q`Lv���Z��<Ny�\&�JT)�G
�H�&ݡ����B�8��' Tc�^�lW\@�'(T���)/"��>8��^����^�P�Qj�;���b�|ݯ��4�m�ϖ�����?=9�.�^닟���"C�W�c1C���e"�wr^L��_��Ͼ�pn�.���+1�M�����?�Юy>9d��],���
�_=]g�+���m���C�G�=T,��;t9
�zH*b�#+��#��I�P+�}[��@�\;���ʋ�$���ҋ��!�D��>� $�z�D���^y�=�g�O��6�M�Cq�b�*˹p#��v`W�s�HƆc�c��:��B��~�^K;�ܑ!��a��e�{��{<��6�`�R�R$$A�&gASP�(,c�)����cA"��)4��pg�l�At�6�b!_�S��W�Ƒ8��UX���>��#X=�<����y-�Z�,a|�Y�i�i��ij��8�]L#s��1��#��r21TEb0&�	�nŨG�dh�3B�̾a����ÌD�H��Z[�
Fm	j��<?ظ��`ae֕e�W`��a�+�Q�)��(A�'��N�P,�
t+����������3��ט�D��8Q>��ҳ4�,����d$�#���q@�/4�Q�\!��t62�a���=���9 �$	�O^2�X�2��,� 2���+�>���R���M��:����Q��.;��EZȢ&��_o��R��Fc�6�d��Μ]��d���~~Ξ_pά�+���d���;2��щY'�����;��R�
�Q�`wjD��g/N�o69�jV����Z�m�ٴf�Ӎq�߻����/���[�I��b@����r�HS�)��@�6z=ȩ3g��MG֛�^7���u;�{���9��;����砩3��p�ϡÂ��'c^��!Gf�t�{ܜ���׸+�'J��_�'�_M
���IhfV#[��^��,ׁSs轚C\6XS�W�t/���\'f�\�2��{�ጋ3?���^�d��鍼i���?��PK�yVS�,t�+�pip/_vendor/distro.py�}�w�6���+p�wO$Wf�t��u�n�>M��i�$+�"$3�H-I�cs����@%9q��=W�1I`0����xZ,n�tvQ�'�>�|�����8JK�x!�[ijt"�J&b�'���{�x��/C�,���œ�S��=��7�+@�-�bߊ��Ų�"��4ͤ�7��E��I1_di�O��N�jF����⼎�t��4�ˉ�&�/�z1z��:�	Ѩ(g�2.T=zv�����`���/�LV�(�?�i	�<��p���a_����.��2��|6U1���R�$��2=_��4f�_��*�Eo�D���w{'�'C������/Oů{/^�������������<}/���.~:<�
	d�f�͢D��I(�׉�ӂ�r�N�	�+�-���J�9tG,d9O+�
�KJ���:��M�S��V���:�7ggԻ��L�/l�zW��"����F�kZ�X��U��j+͡Ȝ��y��UsX%�����p*r���BĀ1� 0���=��N)��1�@5��Jq�����Q�K	�8����^d�D�SM�?��/��!�;��y�m����2��Πd��1��	,�
���^�9v`^�2q�ַ��*d5�x%it	&й��s)r9�я�[z���Q�,�\$xc#��3H������+��� A���b&��"qXW[!�6����t�{&�q$2$���z����R
>����M���J$N�4ˆ8%Li�o�b�ܥ�w�N.��	������
����9L[�4!�T3��K)�����(,*���Y-�;�*�E�9����,�ܿ�R�@�r���J����;+f�*3�XT����.2yc���?���	�'k��5+F�Ů�=���>�@���S�}�U�i_i�"琀�%t�0d�6FIY,(
��V-Xg#����"��ߟ���x���@���A':��F�&��!�g ��K`�G
�E=��@n���x�%���,!�W[~Ӳ�+l��N�>�o/����q�� h�짓�y:�λߏ<�7'�>H���ͩ�������qz���՗9NEzl�?j�b0��Jӫ�U�7�z�mQ�F bˡ����z:_�Y2Η�s�^���>+�hH�5��3Q�4Q-��S��6��RWP��W2K/eĤHd����!������������]QE2�JK�@�k���H�{$�Io��^��xv�]w5�*.��+��_<;�;9�j~p����ɢ�5(� �pb��i�UƲ���	%K�"%K��|L���~t�-���bFb����P����%�-X[�e^�49s��j#��-~��@�8���՛&>�a�3k?Yq
r���	V��A������0T�U�65;G��P�
�D[G�/~�{v�������@>�^��X��2�d���f�`뷻P�(�ѥr)�e�����tV��5-P#�5냩m5��F��Ll���A�g'�94-C��2�d�W\u�Á)�t��t�dyEҨs@��\Ԏ藩y]���>X���W~��3��P|)~m��a4������pMܞ�� }B�a�Dߏ�8�h�0��!^�.x�	u
v:��=;�c�w��MơF��������8vX�G(4�
�fĒA<�)*4�iR�8���R�%�A-�a�8=8:��_^�B�NO^:���9��e�����?o�_���u�؆w'�������I���x�_P"�'YŀH)��{�ɠ�5�Q?7X�	�^������?����+0��V��
�9͒�}Z����B�C�ۭ�	V�?��6ȝVL�^"��8�z�R=z #�2�^r�
-��0h�u�|t�����y�f�{�(`��M]��2����{Z.�`D�~
��?/�l v�a%�)h�o�m�M�Qdm�F#Az���s�	@jpF�wq��(��2�'`K4���yd�y�[O(��y�n�&�]@"ϙP8��Ұ�?j��h�~BҞ�}���"l7�,�g��A���8�쬟&4pCm����2ggL�8�ª�"YW��m��j���T<���0Wl�Lq?3TF�j��(�
�H�c�_��!�D
>�����z��UUw{m]SPUƲ).��x"�,g���2˾gl(3�mGQS�<1�+iș֕�= (U�I\�d="Ʃ�UR�ē��[Ɉ�A%%�e��@�bYNP$^Ĺ����kj�-�I:�J�LƆQF-SFE��U�k�OʢB�QV��L�Gc������	%���0hj���@�DE�=h-�%��"W�q%�l���SA}� ��a�Yy�"�
PaY�D�jGj���+x'�ܵ(�,.}��HےT�J"���ڮ��kE�%2{
�u�S�������L��`(�I�"oYqW��ڲ﫾@�_��7Д'��<���y&��긛La	�J��[�h����(��r���k�m72$�3������{�[|.��T�ĚƉ�Xj���qE�t���I1Y�EYBOu��R�\�
3fa5s�^Q�ڈ9�Vƌ�H�'j���S��{�0�:?�yŏj����,,�|oy���eOs�Kz�U@�i��Əz�0�2����>��F��L��x|Ÿ�2�����==*MtB����'jSj�bo��L[U	���񿊦+{�h#�����<:}ȊeBӏ
=�G�FwEހ�>/4�~�a̐���A槅S =���y���C���~���_~�����1��8!պRz:B��raF�gx��s�紡���?�	�C�ǟգ�'.�Y&35>����:c�<mƴ����R/ԣ?6B�z���S���1P�2I��x�F Ṇ�9l'�xJ�͜�G�z�2����<�:���1<~w���rY[�đ�ͧi)���{x4��i�㡯���z���f�UyJ���D��LgR��O��:���$d~�r�5����h2�i��k��aM��ō�E�)9����o���^`eX(S�,��>+���
��?.ey6�Z��\.�E*K�߷�2��lR���Z�Ҳ�y=ܠ�|��d��Wz^��Y�L�<�;%@�ld�ʈA^�;r��D�r�ʘ}�/�2�Z������72��6P��hK�
�;�'�	�b��*�޸�}�r_�cW���XoИ)��i�w{/X�5D�R�tUL��t��N�x;�:|~{�H��4�x�ѼyO�����M|�ɐ�J�X.Ԣ���#�e�M�[,�EQ5�;�lJ�!\
K=�f�r�d�V��Xn�T�\�GinmY}Ҷ�-�_����7��mPZ����T�'��'�e�.��]Y�7����k|�G䠕_�Ų�n-�T����(���]������q�@Ku}�K'��F���=�:,*����%���G��r��06�-�ڰ���8�S�l�lq��e4�D��:^l{�`3u�T�h`(
54�P�bA���ŗ�����~&�Oa�
tSmao��խ���J�`�#�CiS�N@f��tc��!b����F�~�T$��;E�A䈕Tx������� ��&eJ�$%���
xc�s 2��L��'�i� ���s��TAT��(�*g�w��Ė�d��a3��Uu�`���7#a~_	g\�B��"�<��ѧ�Aj#�L��BV)��xٵ�ڔ�,ѡ�ݗ�s�.��i���K�\����Cle����&Z�R�$Lsc�l�k��>�
8oE���a]lNJm���<�t��=a{V�h#��a�T�J��$AH��2a�)P}`���*zBj�Z`X��md����LR�D�7�E�J�(�v�15���g�.�`	}g�\�iY-��	�pbh��2�Z~�Ⱦ�<e�i��V#+��Ü���;kt7ZJ�4DD���j��M�{"<�=<>o�7��B.�ߞȂ�҇-�x��Y%��2���j�y�+�Nݒ�g��Jk}����
��(o��U��r��<;V:wY��[��U��z���`�Ϋ^औ�
���ѓ�q0�䤔j�=[�R��$���:�
U��]�)�+$
7i��_�߇O\�C����4w84ڄ;V�@�n�k=,`n(�@u�;��J�����m\1�p"X��')�J"���N~>�����͆:B�!�q5B��'�3��5z��9��#D��#Ǐ9@N�j|@�)�-{q�Ok�Ky��d��"�H��hܷ\���p(�>��dE%�[\ȵ}u����q�	�>��=�aPg@�9
���Q>��//2{e�֜[X� 1;lr@j8��j:Nv�b`�&]=4�i��S�"���;��a�H�p���'G��ON,�W����V�]�˺XP���{�^|�#���D�#����
cVR|�w�wvR0��f�}Y3ߙ�9�l���G��Y��n=����;*j٘܍r�n��n���׺���p�	��̡9�6�j�����^�LeN�,���1���O:h#�ȴgڧ��vY5�X�����t�W��(�]�����̩zö�nM;b�d���S���Z�E�1�m`�\��
�k���k?ӱ@��1�%E�\r|�S]3R.��[�,oi��.��\�ț��T�È"e���F����Y7|�a�<���S��
1z��0��e�i�WVʡ����VHս��ꃦ��z��:E~�AɆ�ا�GU3� �^�7�'��g�r������̠9J҈W=
���Ls�n-�ҙev�Ch;0�:�ggNګ���2����]��ދ���8E>pkۆ�a{��՛_��yn-fT�><��RmGV���FO�jw�8�o��Zbӵ���c*�&Ph�L�c�:2�l�V��a�n�L��㉢m]ޢfO�5j�6�c��E@+
��U���l�L���J�g"f���
A".��f�eẖ�m:*�?#�C>�G��{c� �m�(���H��v_�rU�ч}b�5�w��pI��MD�m�X�1��Ba)��3B��0^R��r��HM�_l�ޯ��f���T\�+���s˚�U�Ȓ���8|�-SyOqW!�����fO�~.	ţ�/{�1�f�-xM�_n�Wnh~w㋵k{��v�( d,
`��g�	ؒ�,��o�T�7+�k�s�k����,�*@�8+'�`԰�����{�a��tU6T0��1�EB��1&\��qgYe9,�`a��(G+Y[�мq6�27����t���-� ��4ˈ��֔
��=i�W8WƠ{��_�l:S5O������ի�����!��	tT�ҩ����즻��P��8T���d����:�e^����
�2�NYt�����b�8E����7�;c1Y`/�Iѷ:2pc6���WV�7�M="g�����ϙ���3��̝�:��w�'��O��`A�=膕,3�3ˊ�83�7��Z�����h^AvI'���Q�"�WŵvVk�y���E�&tƜke~�`q@�?SW	�P9���n�	��m�R���@�XZ�����mK�#�����!80'(А�U�2_�^�TT�
��܁�X\cB���z�)^SD�v4)��5��^Fw,�N�TҐ
���N��+{���(�}d��璝ͤ�Ch��4�*.�[&����R���^f���0Oi>ɖ�4J��|�v��nϊp�t��w
uiRs4�ʢ�A&��$b�%��ӐƳ��u�8�����<���*B��Y���к��X�m�\U�q@jn�FvianKQ8��	�ڮMRŠ��� �"�n�3M`z��@��T�\�E|]@��YXZ����0jXt<5Oy"ѼB�9�k�?t4NPUP�����9�
���)�:���,'M�4�0�C�.�j�T�s��E.a��᨟�{ؚ�c��m1�+�i�t�f�;��wI���y4��Jua��
���֌Ah|���>�6#G�z4	
�a�pDҝ�$�%�݆%6�©�D����bnA�Z�Y�o\3>A+�7,�A{����7-��D�crqM����,%�$�Mz��n��)���{pB҆Y��
.x�;C���e���s������K�KP�V���t9�ºy<v�˕���u�2,�3�M���cD�ʖ�5�|���0�V��+���/S�Ȟ�Wu����/i�zm�m�&��T���Dϊ81>T�f�*�TYg����k�"�\������E��,���Y�f2:;<&��و÷�T�h�9���C&F�f�$�Zd�t�z�E�X�Ty�!z�B�P��w��uW�jF�e��g��n��1���7�8��\��MP�%���b즨�*���B��O�-51����- �^Tv!z[�y_�e(ƙf`�Hj�9vA.�r���
l���l�d3�h��>6�
�ө�Is-@��W�:�1U$*���!Vl��9!]�&��-��O�p[N����@��<I+����
S�ކ)����)*h��h@+b�9:q��{~(�9�L��ޣ�d����{�V�~�����~�i:H��b�h{:�qy��-+v��N��ruCo�*���r�&3Tc�n-\�z
[*k��l�Q0zQY]C�
� �^hS�������JY;��
�=��o�y"���
�W1d�y�E��`��'�
lz�&z����ZR�����C���V8��OA����ټ�
�z�K��K��Է�bm\�1��**nm�U	^}���f��/ց���q�<���ArN1��V�ĺ��ga�!8iu��i�y�f��ܑm&�d�[�9>�@|�cY�$���6'(���lLØG� �9��iʮ3*bH�i��1���5C�D�ݩ?�ԽA����"ƽ��A�KXș?-��n��t"��q4M�Ӧ�(�p�*�
��oy{��H�~��	Va�3�g�����?B�}�B�Es ��歨F�D/NT;�LZ��jW)?��bz��qg4{W��9iE3��{Ŝ���p�^u4�5�0f�ݽji�=�S����٦&ڪ���
�lB��������V�t�$F�Yh�?����U��$��3Y4���ߺ�BD���b��g5q����
(�j��Ԥ
酴��|�7$�J�fMc��᫶�ʎ��d@+i{FX�EϛwF$���k���x�h�0��U��o���+�z��A6��2E�#s��֪I���%D�E\yа&��d|2'���
��O3���y���Ϝ.>�� � �����3��t�mc7��6XlN7��KN�]A�4(��׵����
�Ը�
%Б��
�d�7����J���c�_ͨ]��|m�����5d��K_��+r)��&z��1��}���{l�/���ff(A��/�U����{�27Ԕ����ʆvgν[-��P�_>��f�BS!8D �f�}P���u�-�����^0��=����}�j��n��m��)��ZѬ,����V��@x��@������:j����N��"��	'	8n�J~li�m����B�>}c�ɛr�tp���+�����c�N���&ê�1��}/j�}z��m���w2��z�2�
5�w��]v�&��&c�gt�o
���=79)����]�¢CM'��9G�i��#���MF~֐Tzo4)���M3|ۇ��LGSyaz�n
毚�\�UYE�$o����*���^5V�W��w�i�"?x7�$���.I7lC�k��3�!��,qn�_��v�����
XT�}�<˨�vK��Տ!r���l�*�ʷ����b���W���G4\���_5��nb����W
�@��?���h��'|�t�-=*l �}	d�r~���&%��)�d��u��4�0���i��&dTk(m��y	�z�ާTh��	%��A�J�/�~h�C��O�$��80��_|b��C|��Ѕl�a��G�1 *
,�}���w�}$�J����?��]AԄ�=�3����+�j�b:���Φ�w�����٭	�ˉ^�~�uG@�!���'0���3@�u,n�A.��G��B���䐄	6Å�eY޴���+�>�r��C�N%�[UC''��c'P�5�

詼��7���5�µ>.�*��!|�-p}Q�مXy�S�:����9�&=�ب%;�k�Eɾ<�~�+�����Z�a�s/����xM�*�7d<�.ை�σ6�[��=�G��ePW�,Šy,�e
3�*4��|��+qv]�	��Wg������NV
-X�R%{M$�U��q�?+�z-�Tb����6Dx}A�TO�/9��q��w�6+��x�V��W_}�w?��v�p���)]BB�A��?��">b�*�`_� QWb$G�!M�d���P���?kf��G�u�ޠ�x�]�`Z?�"q�����*G�`x:qJY��Zu[1��>}��O���8��b M�!Ѥ�$�W��{%D�~�����T���0�77ٰ0�=�Mv*��C�j�a.�4��4ê�e;dFj#
1�\J�ib�Rxpp���cT���sYP� z�WY\]YM��abp�D�'�Vu��}���9�`́��YX$C�ryM�؃��X`IYO������^|�~-d���>Q���&�YN]����u��RU*u;bZ6D�L�$qU#q[���ݞ���v9W0��5"iԇ
C�m�%��R;^�ir��@nP��L�HeN$�!����N���06dv�}�[�߀�2����xi��[\$�V�	8vS_����^�����1�{В��>N���"�`pkɍJֵNt����L�<T���J�k��:Ȑ�|c�d=�[)kՕ$�ӕY(���LTZm"/�'�a�.|y�)�>F>ƪKݘ��L�2���7��ҡk5�7����a>�o�Y~���'����_Wx���Io���&|Fߞ,��y<��㭂&�<ɧ~�?��(?�S�v��� cuG_��Uy04��d�ן���н��7�
u���8�!�!~<N�(��Y�
Q���U�	v�����Eo\(�SOb�9�c�{��c'0TU'xF�+�hV�����`8 �]����O��ӔzWF{̽�>wm����	�C�2�65צ��uZ��@o�>�t��)���~��K�l��}����P��m�޺5�t�{Tƒ���M.��C���ɿ�6�j�M�����)�ٯ��@kk����!��}y5@_�'+t2&ys?j���?�f�{�R/]��q�f��e;8Gk��������H���˽KA‡�_Y�.P�0%�>��bJ��lr+vJ��o[+�3'��������7�@!�z����oBv֚�W΀Bƺa�mkidH1ou�۟�~�R^!�Q���֥�B���Ϊ����7ټq���h�I���r\�Z���`�s���_a����q����Z^J��V�4έ�D@��3��1����"�HGh�1~�e&kʂC�_�oV��e=���m��븚�i������i
�y�����q�L>����"�Vݲ�zkcjB-���5/��l�S�1��:�{8+��#p�q�������x3�Fz(�iC���;�Ϯ�pM����Os˖���c���-�>�� ��S�]YP�����I�Y\��<�!M�+<���r�C�jCl6oz�P'�
�U�w����9ל*�D�O&q?+��^�dO楇,Å��cdW��<p0L��3u����X�m4�VТ�*��w�C��:z�O�2~�wzz��Hh��m���c�02Yo�˄B��Z�ծ%7��j�zV�n�H�m'��`�1ij��A�NS�b�D�x��N�A�WL�[��
�˸�9%Ef�xR��i�,��P�L/����fV�1����BF�H<��{|2�e<��x�%�[�@
�j��:����3:*j���a��0$������JM�Ƿ��L�%O�G@J�x�8آA���C��@U����n;����kښBǀNeJ��$B��:��VQ+�ʗ��͟������1�d���qp��ȭ�R��,Ov��%\�Һ2�Ժ2�^cE�*�W�+5CXźR�x&ӵ���PƗk�r��f���
��˵=)hf�+�NŮRU��碒;��.��y�lo�^`U�z��G�����pt��YtN�!�Ak��eShv��_�s��qeB�n����[��Zv����J_	{ΊN��|�u��	kE.�vg�;��~�?D�X�F�va�V��g�c�5��ܡ��*���M���I��U�0�n��?h��Ҭۛ�]4�)�ty��As�9C�Oob����<;8�9�ֲ�����`�>~!�Q�^�6����E�
B��K���:��I�e���d$/8�{sk��m�@��Q�s�z����"�j����by��ɏ����#���=��ɪɱ��A+$�=�����.sF��S����J��H��q��b��c��w�Є������Ӄ�Sx�+���u�:g��v[���g	��Αg�fD@m�"���8����?S�[V�ԓu�O+H��'��x]Ι�_�k�v��~P���f�b[[j�A�vVI}��*|������ȿ�@�������V�����Jf}]~�໗?8E�$�x��:�A��[���
eT$)�X�����#��oe���i��f��+��q�A�ړ�	o��켭P]����/d�`*��	m��<�d<��J�q].%�B��V10���R�{;���.�fb�kOg��2����]�J�W������@AQH�(:�,��>���G�ry䈈 ۹��J(�Bwݔ�ꥹ7�ì�qum9
5\tq����#��_�d9_T��_+<\�ː:c��}zCM�{G��K�g��D��K����U�W�9o�j+�w9
��2x5m�0;Z��}��&(6��S�=Ԓ��B&��,%�xd<F�3�c'�?[�PK�yVS#���+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 ����^��)�
����PK�yVS���!��pip/_vendor/six.py�=�s�6�����)�1�O�%vڻ�ԝ:���>�Nv���yh��,���a[���@�O�rnΓ�H`w��],/�Q�\%��<�7{�߼~��z�x/�?�E���$���;/�%YiđR1�����m�F��Gb�H)���nr+G"���Ē�E<�� 
�[�
Jr�́Pϲ7��7Mc/p���c/_�(s3,q�2V6�bp�0C*Ɨn�]�ՙ�!��q��D�YxHe@^��ȇ��E��@tG
�p�B=�ۑX�~0�_I�[��0H�#�H|�g��b�'#Ă��k��T����{�q�!Aa9Kl�D�b��<^Tk O�<��XIX~��R��^�)�0��0~�
zq�X����
r�i|/�J��(΀c�u�,U��ҹ�b*��h��[�U�<��A�b'Th��63��X\���r89�Kq19�u��^�`$���>��19<��]��g�����>���o���Kq>b�Ӌ��1��ώN>��"����8������9����/�����������~���3���|"����j|��p".>O.�/���@�l|�q���]�P.���_�E\~:<9�€��g���G��Oƿ|���O>C�c����1U;:9��ć���_�	��`
�y_>c"�y�����gX���	���������x$'�K���)V8�D0ώ�
����ϗ�I����]"2WT��;;���s�`q`30����}	��BK��,�����Eb��nwvf	����,O��`�v���!4.��wvT�,��,��T'�*	1���ʼn~OWEV�Z�tg�q��H��1h�<��T%��$~�8��ih���xo�7?د� �ϩ��!U`VPs7I�P��+f3p��L���;��	���$�h}}-�d�wg�c���w{��a���!�l&�ݎ�?tVѭC@�,Qz>�V&E�s��G.���3��Q2S��i��J�NWJ3N����bv�>��_rG��l�jꦒ�ڙ��;���G��d%�G�u���y�e�p���g��2t3����d)v������{!����
�U�}G*���t��T)	��e�?�(���+�9,��D��.x�\�4����.8p�_<�H�_���I��Ɇe�$�S79���4�P�5[�Y͌�DB�����ΒU�X�Y�a�(=���9X����$��*���+�P%q���rbZ?�݈��5Z��o���e���_�����i��.��`�Ʈ/ӐkYP�YIp$g��j,�^#�o�������'�s�+�I_�`;H���j�̝�JJ+r��>f�9o�4��;hN��%��d@9+
u4q���fA-�(�_1��a�sNܿVd�%5�c��h0SF7�$GH�1
��?&ޭ,р.��	�^f؈���qx/��A�K����BR����;h���bYv��cPQ�s����6��A菄{~���5��B��F%�����Qf�:/��VC�:�{=ǨD��f*6mizK�6�F�d
<�X�?e{*��F���F�|8@�7��C�lD���]P�V�췌4��G�M_���d�dX)�ɇ'bB5��jC��H%�Z��T�5�E��������{7�1_�ݜ�R��RF�:�sM��檴͝'�P�y�%%��(�+[�3��l[g���A�쪰��(G�#��5�� >���h
�p\��/�DW7��.8"�LA�O�]p)(C_z����$���jC+����7~�,�Z��퍱(x�%��IG���v�Pm�Y;]�H׹H�AP-��_��`ꢚ�Ф��N����+T@tI���ZWV��Ng�!U+�~ha�s�}Q�S.��S�p�9� ���P,��l�-�F�"�
mlD)�!��9w�L��b.�B��v������,�0"Ct�`���&;�I��a6Q�(������TB��4�Uc.��`���B]�j����D<5�*�]?D*��?��(
LCm4m5/aP"��(ݞNG�W���j�̯%�{�k\�b�C�UҠ�>�i%�e�^���5�=4/���b�0��s̡}��ra*N�f߈��8�*�V�ϩ��Z�n��J�hX��]�ZB��
R)�P�5����L~�ř�B�[2�o�U����\��4_�BŐLk]���+Y���٫��~Y#��4�p6Փ5_#b��Ι,��.6�TSD[�wi��j�5�T�x�:K׻so{4��<�M�F��`��#��UM�)E�.g+���j���yL�� Mp�I�S��,w/)9�Y9�}��.%�	o�7�LU%�nZ��Z� [7��Q"(N-��cRo�,�?� �Ք�,���Ҥo2��ڹ�������lv�^ߑZ牧�T$���r�"����H7�զ�����v`v�]�Gpp�������8E�p�m�Q��P�gr��# �Dr-�σ���]V9)š�P��p�;�R���r-�x�4�9>ǁK�%��"e8jş!T��D8�LsHoB%�z�5s�4V_j��k� Z��o<V3M����NjP^�B|Y��]��I�O	�~�G�8-��Լ|�G���O��8ϔ| j]@hJ "^&�'���'nt+׈���.R�h�-$��Ӂ8���2�8�wS�s��l��Ӆ��C����/��d�`:>pV���j���s*��G�0��8%��v���'0�Ш�yCT�O#�o�?~CC�+XӠ�t�pp-Cr�{<N
�|5i�i�
fM�`�8��K\�#'yD��ގP��q�^]��W!􂒹\�W��}t��,v�J���r��s�?]8��#x�_��1�<*�48%��;~�X��l?y��{���?R�C�\ö7ϲ%��] �p�<����̶��5R�/>֐�E>���붙��z_A�R��H'�Ҽ>]��\o���5f>��q��ӆ)n:�b \WEJ�Oǧ��+)d�B�G��(��ID����Z��&��Y��i3�h��k�Fq�A��.��5�Zr��U%�P!������K�ܳ	4SH�)���8�e\Eh$��pI��*N[�::�E��q`<.��
��\��_����e�l[a�ػ�YZ�N�݌���T=~'�� ���c��n�o�P<�<[��&���Gxk�1`�H�^�����R�k#��*p��.J��N��U�f�cW���1�+�#p����:wڠ��"+��F�ث��g��n�k@�A'�<�����0�H�4f�
��"��Wj�R����00{�W5���YF:�#e��'E ���4��9нLce=���>�X��_��ugwU���Z{ϓ�w�@ZOHМ6-i�5���@I��8�$5�&���$����p���8+�ګb�Lm�����g�@��:~��~Z��~;=�\��"Tvu׸���C��CJsZ�,�D��T�$�{���7๪�$���,P�K�S���U]�wv�u�M��H�(g�x���Rn�N3�&��y�b��6W�c�&�s�E)��N�K��Uu��������Au��au��N;_���vZN�5�r�&��, -��5�j���J��҈`B�pT�X���dۣ3���
�AH%����A�%�	�T�Ž%n=��<ں�bj��ꛣ9�0O���G[��W���mF��u�nE��A���FA�jKܬh,O��+=�Pi���H��b�^����"����5:@���\���z:v�[7�������v"�>���k��^������k��o^��	���\��1����6��lW�J�<�<99�F�{�����8����Z�U_�bqk�/���m{m7�[���n	��n�z��*c�۪���m1Pk#��n	�);��*zU�U��[/��K��.�si�&a� �a�kH�r��������V�_�P{��6��2[&�c�������mj~NB�ச.����r��P���'7��-��&�'v�K��}.x�|˺���9��\�3+r�!N���oB�K�͕�&�
[�<��Y�z�/��l��J~B��oBI��C�K�ߢ�߆���1�\����	�g�?��#כ�g���犑���<@%��V=@y�t�|�
6D���	jt#o�,
�w�`��§�
�����)Ӹ��oF�=�6���V���퍦��{j<]��uM��bj
^��2���2����&X��9u��ĩws���*��&��T�!ږn�ynwD]�w��Ym�}���k�C�Oo�zDU��[��o6	Mh}�(W�]�0V��-��ؼqL	Èr�F����†6WR���J�~������gj�����kM���nr���#e��#�A�
K�/Mҥ��id*S��?C�_��Po�G ��%m|��6O���8oC<=#�x�������ȅ �RQ�����|ϭ>��K�#�K��U
~d�蹤�{�Dc�6�
�����e��:t�p7�3���Ri�ڼZ�Dy
"�ʠ�"�w���1�.��/iT�N�'Q)��m�!���Бqi�U/s��O�(�Z�5�@Z�7'�#�]2�	��h��0?Iw�0��c�zr����F�y��y�I���|�R�3~���T��y�$�|�V��
�*���z�*zl�d�cW��/]U�$t�|�.��׿�]%������lG���g蟛M�
��32�X���u,��
CwJ���Ǟ�5~��,؍V*����w�/VN�R��w��;Et ���i���<��y�;��K%4P�l���� �iW��}a��<]c���0m��Y�>.��a�[��Vf�అ�VuԫZ����!�g��>S1�2H�ZN-Gla�d�-gkEY��
����N�%I�i���"3>R�
<�zV����b
�B����P�FCP���AB�Xnkhb)gՍ��D]���Z�L�V�d�փ5��u�i�n�	�QL�@�u'W���3��{h�w@Ƿ	� {�<ڋ�_��Qhw�:Ն�3Z���Ŀ�V˔�Z8 
0w`@s%��9�� ��(�m�RHI������M�<I!�n��I�`lC�*CC<I!��R� N��a�8��(b���:�96��u����DM:��J�n�h����i{�.'�z�����ʬ_���DS���Km��f
p�R��9h�[1(՜c��S�>�'Kr��f�lw��A��j_ҏ5��`h�Z��h������
��}��5G�|�={&� (C��g�� �7��/BĶ~�����s�K��Bw�0�$;�N5;�3wC���iT�|��͵��@�1v`3��o��[�X4��F
��N�̛˴|��uJ�z�Ȇ�m��X�w�
S��%N�܄C<�:s#�
!�S��B���VG�Z���e�z�Jv��ݑ�xҞQ�qd�K=OR4~��?&�uPnM[8�ҿ��6}~a��4��DЁ�Ͼ�Æ�_���8<��*>��/7�#��ͣ��FR6
�Xm4=
�&��4[��Ο`���0~ƺ��nH�q��S>~NW�WA��CL^��m�4>)���ScІІV�R�!��3h�+�y�lP���օh�嘝 �5c���sX���2��_"i��ʖ�K�lZ?ث1=E�	��g��>��q���
D�~"�o��|LV6m9��f�	B*�lZ%n�� �3��t5{�1AEU��9�U�L��x��á�QS:a쩗�Hǀ�g���ǻ��x�<�(�i���%�4=�`q^�ޭ7��k
n��.f�[w*���u2#Pv9#�!]�U�s�ҳ@�+X´h�`Z��4��p�x�@*�;�FRځ�m�
N��>ߵ0�E�v�*��㸹�56L��.��Y��0qY��
���\B_��z���ŢP*:��9��*
���ë4[��1���p�S+�ҩ�{����3[�L�^�K:�	W�QUi��yV9��[M�}ou��|���f���U�"��8���y�Q���c>;����p`D��7�����4� ��LYG3�p$6D�5�!�:��|7�lik����y<�G\�aD�΀S�i04�x�'��|ΠK��G~�#E���.��'%5!��+2SY7>HiT��\�kX��
-5�@���$��^�k�I$�����>�	�%*�t���!���}8���b`����K:@�Qsܰ���kN$7�9r�A͡�vۂ�A.���>���d(9��W$����U�ȻY�Z��$�C4Jo
`����@��4���h7���� 2�#���Ն�1�;�$��Z)����47n���b�Mx6r�@��"��օ�@������f?�2�`�*N*��$`c�|����RK��������f7
>����y:������ KPf�9f1$�԰k��8Ip�h���*��vn��o�Ҩ�gd���.��V�A]A��G���u�tL���w���Y��ߕs������].er��a�,o�*���KJ��=>�[f�q���Q�|ǹ�Ԋ�OH��F�u�V3�I�TV���R�d����3E
�1�]�g��>��s��ԑ��
W��)�R5�
)j��`�.Lϩ
�R�#�P�����8(�erxqq<q//ǿ��e��������/k��r�ܪ6���W��Bשv��mp�	�y1h"j�mm����B���1̚)�TIݶ�*��Zk6������6�d���x
��U�6��3��V�
�H
��2�������:�X�Ma�k-��+����5��R�J����cNaPFTMSѴ
�Y@�,|M�rKV���v���@-gʝ&|��S(�y�e�Ft-�;�CS��I�t�Cx�p�:rQ�*�=cx�{��j����Q�}I�!iz;�p��8C[�?ϒ68�<�VJ"3�bj�Ý
�cya��.�s��HBH�a@�����o-���k��$�3d}<�[|��k]CS�-TH�Y�
�����{¦�:;\8X	>N�/6��
Z�Hv�+Yl�Qɜj�����5t���K{t��u�8	n�qv�vz�56�m"���A�Vqi���z,�3I�Wxk��;sq{]�=��bm��jlmp�Y��n&q/���ݑ����ݛ�MOFk&K����+6,�Z���o��b�^�tDJ�wi�9��2x5�.cެ��)��S(�:�&�M��5���~���J>-�Q�m�Ǘ&��g�~�aS��e�["7�`���Y(TQ��O����›}wk-�~��]J)�=[i5�P#����,�b��{g#��<�)�tT�i����տ��ɘ�]���5�3�xf�˗�˗z��q���L�1E�E�Jܨ��x���=��n���
������5!MZ��hP�w�gd�S�БyMg�ro���g�C�<Wc��t�x83^Շ���~���d��7V��3��i0}Y��Gk5���5
)#�sF.��T��o���_�[U��I�~��*S�Cg4�U��Ҩ���f���&�~[�Y}d�S����V�7�hsIU0���ϰ@� כ[b��bXE��>�ql���
N�!�3	�<����C���̺�'�{���2F��H�h��8d��(x�(-9]�V���fھ�0A����5�NcI�D��{�pg?B�����H�YU&k&��
�{m��٥�R9����&΢��廒v�iַ��N��Ji?���YDѹ$>0��K�o�����4���\����觥�/����:?(҈x�q Bw1�]��睾b��,)���I�)�
�(�V3�.�s=�K���j��K�0&�	C�E�g�'�
]�oʗ:I}`JD(�7�a���H5>�S�@��D�!���~��0�����$�>J��y"�X��&�f8w����hbءk��ډf4����:C'�n��i�Q0�x?c�D#�u���x!��_�*����n�N� �O�J��-����4�F@k�iDc DS�
/UV^F"j��CM���.��4_B6��UC�x!�MA��=2J�a��Ղ�^�ʒA�r��'��ݴ(!�Q%��(��8�X,��l_��6�n�A����c;�>�2�R�Ap_�衽R�-��!ڪ7���ĠW�Ћ�C�"x�0�k�
b�)�?+Ԓ"W��0e�WT��f,
?,\�Y�v{֠ua�����,�GmDE;xM�}
�c�r���ϖJ���[7F8*'ɘ���G��Q�y�N�@�ٷ��A�;�PK�yVS=�<
�pip/_vendor/vendor.txt-PKv� �s
���O�t�*��`Ŧ��䶹}�cV�4̇k�3\q��}��Ν���_��7+h�2��6�+�M�-�B�
Q���I��������ɝ̘Xr�Uػ~��޷��3˒�}ۺ�,<�4�3���N�w:1��^��
s�]�D�5��D����������,;���VO�tO:k���c>A�Wლ�U{������F𧻓�Uu�G�O}� [Ĭ������luXCL��^�ڿ�dz���/�`�8j|�z��PK�yVSZ���.$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_PK�yVSJ�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�PK�yVSGi�#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����+ͻ�Ԅ�#�{ʅ��`��PK�yVS�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}��PK�yVS��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���yf6PK�yVS��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#��ʓ�'���PK�yVS����	'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_��,.����
PK�yVS�%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\{}��PK�yVS�Ƚ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�/PK�yVS�=����#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�PK�yVS��07V+pip/_vendor/cachecontrol/caches/__init__.pyK+��U�K��I�ONL�HU��-�/*Qp�8������*�RS2�Q���P�PK�yVS��/�	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��PK�yVS��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�PK�yVS��U�@>pip/_vendor/certifi/__init__.pyK+��U�K�/JU��-�/*QH��+I�+)�Q(�H-J�⊏/K-*��ϋ�W�UP2202�30�36P�PK�yVS/ ���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�L���pip/_vendor/certifi/core.pyuVMo�6��W�C��V=��� 
��
нiiqdsM�*I9���;CR�l8B�x3�f�n`��
+��>����ReY
��ZU����)�ם��Y9h�ap�C�!(��Ze
hۤ�B#���@OM@|��.��EQ4Zx�Z�k�ʧ������Q�
����t'�c���/��927�Z� ���F4�x��F�A@s��VQD�T~��h�"2Rhkz��OՋ�7C�Q�NP�R�(a3(-�A9k:����ckr���Vl������Ɔ�E�x�nt�a���3{���:\�`�M��Z?r��*���u�����?���~z��
���*�Xm1,�k�ʻ��ګ �r~$��7�Ř����ӹ��~W�s��]J�M��ہ����A؁�@���$�B��C���h��b�<r=.�_�׋#��X�����q�9�Ѹ��S��DʷD-�@��h�3�5CS�2�1g�nߺ�DJ"w��j�z��N�	J���A�
l����8&��5�a���*�v�/��t	�=���e/iQZjc:HUI�jز�c3����� �DS5m�Y^>���L{\��Q.8i�Uw%O?���I�����%r��h"��Flc��hf處�F�����=�,O���/.�R�҅Q<E���-9��-ELo��Wd�o^��1��OB�,��E2]�$	s�\�N��'��s�C�]gSir�,B�9��T)r��1�p��������``?y���]��&)S̅�+�W�`� M��8��%�%
��&�/9�V�F�_`�H{�`f����IVH[��p4VklH�9����K=3)R���ք�Y��P��@�uj��EI#��h�uU�X���`�R}������AWD9Ws���Q��W`���|
烳�P̺q����8�x®�aG�@D{�	�S�J����-q�������o�a�s���TwTX>��(aߡ�a�ŗ�XϢ0
)	�5�,Ȋ��l�{�j���w%�ϱA��z������'�|5��i"-괷�<�Ф�O��R�l�DGl�f1ip��ٕ���I� �`ި؁q��K{����L�>V5���&�p�nU��x^w���=�~�|n�n0YI�̖�Q/�c����!��ch����s����F�\i\��A?-G�|�Dy����PK�yVS��f�w�pip/_vendor/chardet/__init__.py�V[o�F~�W��Dܰ�J[�T"	$V�D\EQd|�53��8�����/@b�l��T꼀g���wƮV�/���x�yW�������o�m�R�Ɋk��\1��*D�24���2��0��(>O7�D�T�_ˀ�[�����A�� ���f0�jMg7(P��y���
��4�vO�0��6�um �<�J�g�Kq���~F�i>���[����ƌ�_��-�NAo!b]�t+�J��4.Rڕ�)�R�E0GH4�I� ��{or;�N�=x���h�L��֬$��3fL|G��)+ń�R�D�n	Ѿ�z��F�&��x���p�M��i�=����n8�cĢĶ�NJ�+qH�kI��0�,�j���V��������������4_��z<!M6��v�,w�X��m�'n>7Ɉ���`L�.��I�p)����6a�>5�g�͟Ϛ�1��3���ɨV*�P�5���V-,����P��R��A@���s#Oĉ]~Zh6?��|��{g4��r�,�|.��)�q�d��Y{�t�gsF�8!3�ͷ}y�UZ'''�o� ��
654W��[[��K��BZ1Sl
a���@an�&Ĕv_ؚt3������г���`�d;���2�
*�0bߥӀ&��G��]�q���(%U���T
9���ǖ�_�Xw^����+�����qi���,Ͼ������aV����=45�)�,��k7D��D���"�	w(���C�db�5�G{-���ӿ������|n/GB��w�{������>l�:���W��nӾ�b%��b��+�4?;ӯ���}wI&)BXa���랣�
����OnG���w�*5��"ؚ(HwK�HnP��԰V/TaJ���"����S&�Id�Ք7�~����f�m���6|1�|����C�lH�X2'�r.5Pm�5�k��u��r���b��p�Ύ�)�O9�����l'k��;;�C�r#r=�,�Q�oG]9E��|���"ٿ��w�˄-��N�~x�E(jy2v��\`�KA��
�xn׀�����z��-8�<f�}���]f�T�PK�yVS9���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�������oPK�yVS��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�PK�yVS�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���)�PK�yVS���w�)pip/_vendor/chardet/charsetgroupprober.py�Umk�F��_1�s���w��u;g���/���F�r�]��JP}g%Y���R*�gg�}�]]U?���a4���><�&�ߠ��q�
�D�5�L@O�������vK0�4������؇%��"��ڡ���$�1Z��r%
��;��S�3{��Ya����W1�v	]����]C�g��t��+̜��ԯf���bJ�i�!�3��a��Z�-�1�`L�Q2ϟ�|��N�j�F�"�F�� Q1L�Ɛ�����d����U!�g�eH�8����5|/a����JԔ�4^	P�(
3�s6�)�8"�����r:ww��6d�O^g[���u�Yǟ��s��D:A��H�R�2��La7�=� %�Fm+��`�!�/|.�N��_�[w6�/w�KJ�)�/C���`��f�&D�����W��>G�ŋc?.���taڝ-���;��r6���q/��J�B� ����2.L����A†�"�9@N�Fd�\TC��:͗BJA�G �m����;�}g�%���-j��k�Orb��)|�#��t����K��O�N����X��R�@��Υr�hDZm�CS/S���L�Zq��[j��<�0m�����zd�����F�f���U�ˎ�G�4�4�T�|���~Ӡ�ZԴr�G\P�ޏ����=&ޕ8�-p��^�t�q�~]"���R��5�C��0K�������XS�����6��4-+��s�,�]��� ����2��ݓ�Ϯ=9�:�3�3�?�C�"�~%�b�B���|ɶx�a6_u��9�Nk
��x�2��4/As�Fk��?��`x���%�:4f���D�A��|�W�E�>6	^�ĎzSJ�ryҝG1y�3Ը�GM�Ǧ9�+5u�����Xo0Y�����~�����}��ԕ;
M#�<P��O�s�v��c��y��9\ ���:~�ux~�?��������;�9�
�� ��no��5) ڥ�iO9����|������N��k�	q��?�40��؂�E|��������r��Ae!}0�|
�~��Ҹ�]S��K�p��aAݿ�K.�\��u:3��_PK�yVS�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�_��]�=	����PK�yVS\�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!վ@�PK�yVS�	Z�pip/_vendor/chardet/compat.py�SMo1��+�ąH[
�z)�a!��J��"N�ٝ�Z56�
��U�H�O�7��|����]2�4�g���|�Ķ[m���Vn��؎���p+4�J��h������p�iZVI%7V�|--�)���4@m�șc���O�B��e������Y����nL�w�����H�
��Fɜ�S��v������nx�PHz*���K� ���@�1��n����Xt��[�] ^q�5������#�tZ@�F�2;n�bAn�E*�
a�ܫ�8�Iv?_e�gk<��e<�����a/�$�;%Y���B��g���rtόx�L�l��$�l���̗����Y2ZM�%��b���@Jtq�{C~qɒ[Ó,��ܱ�5��q��@%�k�I�<����ڡ2���)�� Kh�#�X�oǛ��e��~#$:�F��� �*^A��,Yz������3�w��>�oz}`�2��xv����j�p�k�Q�K��n��.
��s���?�k|Gf�t2o؜�vxR����;r��񗑹)誉���7~v�
�S��Z!s�}Z��f��;�����ړ��67��圿PK�yVS�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��/PK�yVSD��}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�PK�yVS�=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��ʨ �:��=?�PK�yVS�
`�)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���PK�yVS 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�PK�yVS�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���PK�yVS&��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��PK�yVS��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�PK�yVS�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��PK�yVSE��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�PK�yVS~���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|�PK�yVS
)Ӳ�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�.�ܒ&��PK�yVS�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�����PK�yVSy%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���<��
ϝPK�mW�t��˜)pip/_vendor/chardet/langbulgarianmodel.py�]�z�u����HI(9�<ݳ`�	���,+��R�E12$F"@��D�Q>j�eE�6k��նdE�����=~>I�
}n���J���f��[���U�gΩ�����{{�֗W�N�k�ݱ�����;6��46V6�_�{����y��;����['���66�O7+g6�7G�q�Ã�G�C�OGG֗��W7Z�?Z�Z��=��+��8�r�p�|���}�[�V�_�}�����n�େo:p��G�8z�ґc7�x���qa����]^h4�n�����4���k4����
��Z� �9�C?�`�M��e�Y�E?�Z�
���;��_�֬���4�󬓾�_`W�.�E�I�/��=��`���6������`v��8d�k͆�uV%��7ؕ�N�d0�ȷX'lL~�`vݿa0���2�����&d��Y��N��o`����}h�A?b��4�Ǭ������6觬���s��\���_�>B�`v�_3�m�oؠ�[6���u�j���	_4���}l�z?���c�X�fZ�2�u����f����#fW�(�M�㟰47�1V
�����1�	։���X'�3��N.?�0ڽ��Qt|!����,Iޘ�y.F�h탼�w1�F�b�����S�
8EހS�
�y�� o���
4EހS�
x�����p��"o�)��"o�)�<I�@'�h��O�7�g���N�7�b�
8Eހ��7�yN�7`�
�y+ֽ�!];u6��s]���|�F�u�u���������Q7�bԍ��Q7Z�n�NQ7�uNQ7�u�#Sԍ�Ũp����p��񑥨}OR7�u�'�h����pݍ>
Q7��p��[�ԍ֓ԍƅ�]LRw�K�@'�h���HSԍ��t7�R��'u;�݊^/d�u����n��T�����u�T7�R�
���<u[T7Z��W��n�.D��$�;�2��Q�(���F'%T7j)���;�2��ntQLu�,'���Oݸ�uNQ7�,G�d�puG�>
��&�d��
��a"S��u[�nu;1L�w1��u��|��#u�T7�(F���B�n7OR7�Bn�?�턺񑥨���n7n7唜/�S7n�)R7:���F'�����-�
x�A�Eu[�[�u�6)Tz�n��u��ꖨn��-S�>�nKPY�V�x!C�ީۧ�
�uWGu[��-3Ld�[F�N'�ہab�E1���Zc"S��]�P��]J�NT7Z{Q�m�nƀ;�n�1�Eu˼n��Ĕ�n1���NL�֥bJ��vS�q!�m�n4.S���<�SZTw~L�Oݖ���a�*f����@��bJ���c�nFu�S���P���vb���
��Vv[���ce��0�S�gS.S��n0R	�-�g��-�-3L�w9�m�i��)����x�2�-�)e^��0�P�Eu� ��nQL�Bu��n|��&�h!��
�n��vC�M�nF^��u;����&�}P��O`1�[F�30L�W���B�
�/��;_u-F�D�)�l�XV���J&�+���	u+���a)w�)-�	��&�gS:1Ld��B�N'1�G�ۅa�u�nuW�0�Wݠ�y�M)S�>��e2:ځ�ޭ���&�[SVg�Iu���n�
�\��-��%���u;X�-Za��*�kK�Eu[���
7�I������rB��d��g@��-[a�Du��nu�nQL邺+��r���/�Ŕ>*���!�Y��i�̀�e��ύ�NT��0٥1�?��u;Y�-��@u;�)+O��Y��2��1��8�DSʨ[SV��e�gSzT�.�=�.�v��E�-Q�`�ٯ0�&��y��\�01'2ʨؖu[T����~�Iu��Ȩ���W��S7P'��Y��-ے��u��Ɂ��}l�\����Ɂfq �:���ab�)e�m1L�z��}�n1��0�_�=}��Q���|՝O��bJ��&2궨n��bL	�u�Ł�fEݖ�Rf�̀��z�g�8�)}&ӏ)��u��ݔ�;�0ɧn��
����m�)-��'u�&�dO�V�`��y�N�^���g�u;Y��0��n�a�3�tA�h\f7e�a2}��b��^� �n�;?~�b�XT7`[rd���n7��?��YŔ�3+{^wubJ'��궨n��-�E�
t�+L�&��S�&W�
��vSvLLɞ�y�/�)g�u�#}�aR����Ŕ�^�%��e[r�cJu�bJu�ǔ��-��E�Ł�1���<�W-ȼn�ab�)�[ab��V�-9�}l��Ζ���M�랽a₺E[r������Wݢ-9�Ģ�e�]�[f���nS�'rV���T�ꖩn������q����b7ee�[���Aݻ�0�uw�&�ѫ�y��Q�N�n�]�0\Ju[��V�>ޒ#�n�a"�n�%T7��>���gL�1��3V�wS:��x�Nu�_��tR�d�璉�no��ꮼ�&�ċ�6+L���]u�u�uM�	�k�{���u�V��&@g���ԍ˛�6o��O�R��0q�u˨��pM�_�bJ��a�;T7ZOq#|�,䏇�W-8Yab�)Ѻ��@tRJu[�0�8в�۲8в�DF�>�@�@�F�@g���a����vZ�
���
x�����fρ��,�[��DF��턺�x�궨nKLi��+Yu[�#Uh���)u��B1�Lu�3L,�-1L�Z�-�ntrERw���n�Y�n'�-3L|R��-3L,�-ےSSw�-92�-�n���;#|��u��;����n���_��l�&�Ptc�+ku˘���	s�E��?�fJ,)�Va�)�\h�	�Bo�a8�܀�ax���J)�0����&�ӧ��p����p������F���l�d��N���n��=�]S��n��궈nљ������[v��Et�N�ʧn�&�~���AS��r/��P���)\��6{)�ͺ�-�Kj�2sc�暹��tQ���ns�D���e��s��%D�li����h�bnpqe�;4!%�-�9ݵ�ޅ�}E��|�>��E��!�7ѝ��b����Eh�ێ|
�����/��{ީ�[�/��nu[�n�1=�-��E�uKT�%��Q�Lu��
t��}Z��v����ך�k�&s[��)-�qD!�e+��CJo�-�K�R��d��P7��j���n��Χn�_"��-~	`��-��/���.xYH)�Kd�Y��/�u�{��Kj�2����@��K�Gu�/���NN|u򊜐���$�֗Ș۲�:�mَ㓹-��}2����^�]E殼_���fn������_R�n�~�������S�!�l���-oȑ,
�%��YQ7���+�}��2�۫_bT7�w�~�e��WRSwr%sGݢ����%���eV���%�p?���B���佔NVu��n���M��Zu��n�%5u{1L*�4Pt~����7�8P�궨�X��F')�Fk/���k�L�U�0���V�S�n��S�O)-L,����|�;��Eo��Q��d��4V7��z}I��_��I'n��X�n)��W���bu{�J�Ot[RJ�薥�>E�O�6��MN����]k��=��8�dڇV~}Iu��f?��Zt��=7�-
)e�K\��"��=�%�'u;)�~Iu6�[D��E��RJ>�5s��=��]ѽ+�/��c�cF)�消���tP7ٚ�k�w��S.4wU�[b�����he�n��ǰf睹E��sWf|�ꖹ%�92p��;�h�)kꮩ�Z�3�mF)�H������(���	
u�a�UwM��N�%�b%>��g�-��q;_�m�(eg:yǂl#����J��0a�ת���+��-�=Z^";�ąab����K�n���ԍ�>�{�J�t|	/�V�5u_��]�2�-:�;_uW�n��@�I�2�[v�+���q�Q7����L궨n��%�ta�X�n�[b���<�n��T7`��Lu�u9�6��٥��]S��S7R�"�d�^���%��-�[��;����nu�4L,��+u�.x~�5u��}eR�%��P�Hu{�n�׍�)�\b+e��P�O�m1L,�[F�N��vb�Fu���cʚ�熺�k�jq .z֋��q�8�ɺn��@ˎ�&��b�mY��DuwLL�>��熺�R�@˨n�n�
tz���@PO	��+��e���0i�f���]S��P�Eu�&�ݔ��jQݲ��D1e�a�,q�h]�Lu�Ξ��n�
'���Ł����O|��{n�ۢ�]l�&�&"Ꞻab�no/ȑQ���)u�ZvS�T�O��ӧ�/Ԫ���9�n�	��&��&@'��s�����
u.��2L�'�����a�������w߻�pu<�ܺ�<�cem��8u�`spj4��j����+ˍ��Qcxnek�XYk�6+k+k��ṑ����C��͕���Gg7�4O��3'�W�l�];5:;���]�t�>����������o.�_T�����G���h3��\���C��Ƒ�Ɔ��['W��l]�o��ǖz�N��t���78~�K�~x��-ǖ�������ã��t��l&�L�A��p���I����I����I����I������b�&�^�9<B1��v��M�xx��S�[��M��"�U����d�
�d�F<�,4���IcNNh�A'�
0��d��=����N�`���z�>�T��z1�a�^�~��ʩ����JՋ�o�z����?�f�U;�`��p����?�7�U{�J��&ky
�����} �����+��Wt=@^��{7s��@�ɝ&qw�֧�$�h1wo��@ܺ�q�v��M�Yd ����}��s0�����h?@>G	���_�s�������ɷ�A`q=��6v���L�0.g1��F��{�L~����L>�&���l&����,&�}30�9����o���_�[`�Fk&t`\�bw;,���p�Q`q1��w���A$U��*���wu1�m�8���~r�'���,&}0�Iշ���%
�����o�f&H>�*���?�[MW���?�7�?�7���wڿ�wڏr6X���_�u�K��㊺�h���VK&��J�qA�d8�	��&�B_�͸�n2;��T|�L�iB���L:��и�~�t�@u��>�7B��LлU�\R�*��K
8C�"�
SgTF\�b2����.H~�PU>��	���3D�Cɋ~R�����'�� iz�Pu�ᆼ�Pu�{H�����9B���9O����6�A(��.�o��$�߁��o��"�#�~n�n����s=RY:~�,��j5ـ�? ��_:�1�Т�lX���-62�:�6��]����Iilo�~��/�?��T�M��ק�o���|@?P�`MS9�]�4��rzH��h���AՊ�i*��U������C+��*��|h�P�}��@��O�UH@��i>�	��>͇V#Uާ�Њ$��4Z�Ty��C+��*��|huP�}��PBS9͇V)����C+��TN��Jh*��Њ%4���AT塩��4����th�&#�G�*;L�#��`Ut��F����d,�	V�`z<D���O�1z�`Ul��#�R[,%X�B�	�!P�&l%=F������)�������6�!Y��7a����L��V�,�9�ja:�y�P����"4���a�J��E<Ch\au?Kh\ �$"g7PZ���#4����u�w:��U���^$4����|�PUF�eBUX���t%{��WUQ}��
��i��^%Tݡ���U�9F�uBUm��7�kk��7	U����"4�
�F��Ju�Fn���qC%�:���	UW���6*�w��u�Ż��������릍�P�f�}B�A��j���…}D��:IЏ	�J(A?!4g�a����F�PɄ��sB��/T����$TՕ^.j)��~C-�0k���k~K`\Z~G���)�BɌ��*�,����AI�d��z�C2���H� ������DI�����^fjW�(��fL�%�7T�_�d��J�,�~J�*-}j�u8`���ŵ�WB%q�uN�p��M7ik�P���I�Uy���S�P���v0K��6T�,�J����]!��9�������|4�Zɀ��/��D�#����D���?z/QMX,�W�2}�����c7�x���qbe������PY�'��#����k���5-�
���{ثz��ٳ��J���N����:xv��`se��Þԅ-�֗�7���Kg��[��5/�Q#���}��ћ��og��o���.m�o��V�.m�b�~�ߊ�&�Q�w
�K��S++K�Ñ�#��`��5�Yo�Ս;'����(�����������~==�����2z%�U�j�Z�z�F�f�V���7�o���w�w�����������O�O�Ϣϣ/�/�����o�o��ߏ/���?~`�����GƏ�2~l�����&�]X���7���R��gPG&��:2�#�ud�
֑I�h��L�Ȥ�L4ZG&s�P`<^-"�f���p�"�~ZC���d�����"yyZE�y�|�<3-$p�^�H~�������Sr"��t��w	�aA�? \gp��/ֲ��勰��#�G�ڂ�/2����{Y�2���
�lr{��X��%V��.�C��=�U��ڢ�%cU��>uNhGs�"p��N�,���e֢#񍎮�
�Bq5��u��P�ڷ��+�uc���������!�y;��Hn��?(�I�d.�����{�@��0B��I���3V�$����(�%x����դx2c�����gt���%��I��G����#�K�#X��%z�����F3�6J�,bH�1Tr�����!��K�%BJ�x��&�h2�����w�S���w�3���w�s����3}w�E�d�@���w�k�s�=���gB����G�N�ߣ�Fg!��I)�l֤��L֤4M6kR�&�5�,$�5�,$�5)e�ɚt�ɚ���t֤��L֤��L֤��L֤��L֤��L֤��L֤��L֤��L֤��L֤��L֤��L֤��L֤ÐL֤Ðl֤DN6kR*'�5)��͚����5)��͚B��ɚ���fMJ�d�&���dMz{&kR2'�5i��ɚ�L��s�&�o2Y�^�ɚZ�ʚ���dM:�dMJ�d�&�i2Y�R4��I�!	HY�NC2Y��2��I	�L֤dL&kj��&�a2YӶM���5i�$�5m��HPʚ�S�ɚ�3���I��L֤�K6kR�%�5u��6Y��-٬I��5�ku�E�=+k��l�U}�0�p��� E��W�<
����C���/PK�mW?�]��݄%pip/_vendor/chardet/langgreekmodel.py�k��u��律�$��=�sQ�I@�e�.�!%��v�&�f6�#��!����p�s
����s��싼K�w�k���O��8]��⍭�����O���S��}��Õ��܁��ѽ�ZJYZ�w}x���_�߹�7X��?{������8���Fo��><�[��/�
�G�SQ���/�z��ꍎ
Wz�KKK{*��7������_����}�����T���_���s�q��#'��s��G:�N:|��\�\�D�5�f��ʞ���ޱѿ5�������ڢ��X�5���oX��%Vw��X�7b�Q�u=��`}�N�d�����O3��~���>�Yֺ�?g���s�u3��g2��	��_�+i�򋬓v,��:a�ˬ&��� �_e}��|��f��dv�o�NX�o�dS����N·��>��X�����u��>��Xkv�29V?b}����l=��ɬ�_����O��.�Sv�5�s|v՟�����Y�:�`2��/�̂��ݫ��5�j�6��X�o�J�Ƴ��Cvq��r<��?b��WYL~�5fȠ����c	넱�g���H"C��O�̢��#?x�[7�hm�c�°�0�0��0�ax|a_�s�aoN1��DMݰ���ð�0]`Q���t�`�s�7�a����q)��j&���Î�������a;��rX�q�:.:;;���9���0�����M��H$9�;'9\'?��8�8�8<��+�aȖ�a\�$�es}��0�;���$��E>�u��5[8�P�y�����},Z^B�0�$��N�9��0�Hr����s��%���X8)CNqYN�a��0��!�89�a�)CNq���0:Iqr�ÐS���0��!/���1���aX�\.��ICMqX��a�,�a����28����c3v��a,�2�0�{�Ð�a���Ѻ?��Z?,�K@Nqr.�q	~]�������9�>�����5�0�����qX����z"~�L���;�?l�a���@'e�a��i-���%��q8�ÌF�sX�K�C��Â������9l��0�0`��ø�8yQ�0z.���;�a�#��K@N��}:��9l���0�2��\~87��:�����0:����#W�榄������Y�6�pv~X��8<��0�����/�s��c�Q/!�ӡu>~،Â��1ޮ^bg�b��z�l?<��5��%�ʙ�%I6���.s������a����&�K̀��>��a��+?l����vp�̼����%26�#��r�燅�D�.3/Q����{���2��9\�>]v^�?l�a#?l�6�pv^Vv��t��2���0C��r�����a\���Y�.p����a�]F~x����[�.f����q�c�.�p�y	�z	�� /9���pX��f����n
�W��K�����~�F�^�}n9y�8,�a!/Q��}:�Â8,�%�8���8���][��]/�8l��h��]-�?l9�����6���z��p!uk��j'���!O1?\������C���fȳ���t��B8y��p��rX�Ð':�'�0�O��B���s�8,���9�Ðg��P/!<�a�a�3��z�����uXy�Z�tf�q��N�~�,?Lo��7���A^���O7��f~��|	!?�NR��+/Qb�D����%�8��aἵ��Y~�'z��,/��S��x���y��a�~�̺�2��3�6��s����B�p6����.�ے���t¹���%���8�-�h��8,�%�Y/!p���K�q��z	����h=���q8{�.;/Q��s��8\�6�pv�p-�f�����5�)���3���K�\��뇭y��ļ�����M�F�a4���5��B^"����~?���z	���>������	�K��a|�Dy	���}:��F�a#C�m�0�9������~��o�!�q��a{�����0��׭��[+������pج^bν���p|�%�
v7��ߧC�־��?,��	y���a3?l���8\�6����x���w�9y���\��
�K�q�̼�5~�"�%��0�	�Ð'��qؚ󇽘�la�a����p��C.�Ðwc^B�06��r�z	�8��%��r��q@.�}͐����^B�0Z�89�a����^\?�V�a�a���%��5��"	F�I8,��s8�^�q8���}l��a�q�q�.p8,�aȓ�a�1Q^��FFs䇁�|F�)�%�5�&�vޅ.�����p~�FÔ��fF�28Lf�ϥ����f�q�����P.!`���0,�3ug�KL���tfi	3;l������[c���a�a[9,�I�0Z��8��$=,�%��3;^�0ZO�q���0�2���8��X�����8�8<g�����~،ÂF�/a����f�q~Xఐ��<�c�~��`�q�q�V�qL�Ð-��!/����a3C����B\z�a�Vv�'IOӕ�.�j�;���a�BZB��p�Z\��ւ�Îör�촵"N����r����Z�FY��at���^�9.�v��Ðm��ަC3�.��Tg�>쪇���z�ͮ�Îör�����O�&=���\�0��p����l�9~^�p��ð.�Z"�."=,`XH���TKL;=\�6ð`��1���lœv^h�X-a�a3;jOm��;l��0��f�t��^�T���C���8;;��`�7�{��g�a4����"��l?�͚�֤%��)>���./�8L}�y	�C�4=y������)�lM�p!y	���b;���UK8;��(7-QDz��]:���.����F϶��Zl�٨�n;�8l3�]����.��t�͞��~7]�0̆��a�a[1y�3~��p���a#;\b�Dv���?L'���N�0��ʹa�a[1l{Vb�n�,+!`x�Y	��o�3r�fY�2�%����"�!qvv�Q����0r�&5k�B���/-�
�a�Z	�J��]V�q�VY	��E͕%���h	�e$�!��Hs�0̢tv�a�V���3��5���{�0\Z����e�a�x�0�Gư�0�0��ݒ�(�
R���OpL��nXH��a��9̮��a�a[9\�6*Y+";lv��>�l;,���X+y��,a�>$!+!��x��]��㰭^(?,�%=ь��a�Nr[z6�f懅�4����KG�kqv�3���
�>YB��s�a�a�	?�8/�>�q�q�V��%��܋8*eWKd?Ñ�a�p��8��ZOt|\��zwv��� k��5�Hh��j���0�.�Ef6ڧ3��P�)?l�!��a/~��u�8�8l+�!O�zX([89�a|{L�O�����>���f3��ӕ�a��Z����w!�����K<yب^}�l�y����Y�D!���8�8��9,�a�x�������I�p�y�l?������B���%\Z��o4�wVz����������Qo}�2:�UV�+��pT�]�o�*�Ae�����s�Q��h���쮯���z�=�]\��(ʍ��W+7�]�]��-��aoc����Pu6�<0\_���ʾJ{��hAF�Q7��>�U�u�����=�ڻy�K��q�Љ{Nu��*:GN>|g��o;ٹ�D���C�OV�+�;c��܃`gdN_�V��yI�Ӳ��}-גrM��\�r��-7�rC�ͤ��r+)����2����A]����@Oyz���5$���T��BO��р'��0�^2PC:��ON��A���zu?��a��s�a�d��O�뵡���BOŋ�S�b�T�+Xz�x1��T��q.$��@�1� ֙xĀ�{ 6����L��-&�!�v,޴�&}�TY˛qCyL�"��;yD�Gt+D�>�<��yD߅8�H�`1��L�J�L�2<&b
>�5&b�u&b鎟���u4��E4���9:����?���	D>G���)D>G��џC�"j�˼
�������!��f�A�Q@m����n�h�AZe0����{��^cG<QmW�}��V���Q�O�����z����;!F�u�G�E��U��<���8�(����O�"
����~m���/!��ѿ}bMK�)hQ0
}�wAǢG�n�jn<��1
��?�hjjt�����oU���557���ȗ��A�K��i�|��=D��"�A"�?B�j���Q@M�(���їi5
���
�Q@�ԟ��:��H/@��F��#1����<�Q<
=p}������T5Cz~�#QE��UUH��.���Bj菏MF���$F!5�5��8�t�&U�9-��P梡?~��(�@wJ�Gي�ny�DuU�z?��u���2Cj�t��HT�QU��IU���Ŀ��W�&�|�+�|�=H*_|�F*�6:}�IK#� �}�=ҙ�8>��긁��
�^�@��S$���/�^K�o�^O诒$��Hod_e3��Լ�ݼ�h�?P�z5�y�˖�l��-׳�d��ѥ4��'#}��Ĵ^y��d��I�;9�O��%�gH�6H��ո��h�d�_P��i
��r���+8aCN_�ҟc+RC*�a��H�$<B*�O�^'�ߨ[o���ԭ7I���
~�n�M2wZ[�̽��P^��ɢo�/�����kp� �LJ�NCE�<�D�����ʳ�'⤻����#�q~Lr"N$�<�[���kx��D������S���&<��=e`�Z�t��,L��1R��X;�����K���1%��V"@�������o����K��'����
R\�A�
�$�Q�Tb��4utL P�����ejj���[ٚ6���(�z:9�+g��)(7�+kC��<�Qpu|��F�a�(1�+wSè�H��M�JK���P_&U��RUVP�rҾr8u|����LJ5u���'�:5V�B���Qpu|ܛ�����|��(� �����ia��!5
.�5�Kj���HV^�D�2;�������`(�'U�x��;��Dt���
�qɿ$9�3���ЂI��Tuߥ���ꤷ}^IN�㧞�E �29�[�r�����g��U���IT��
� U�����_�Z���(24��D�&��R՚�"rݾ�4z�(��+C�g�2ݾ�3�K�ݾr3z�)������UUT���c��z�T5_�_y�zz��;\��+�Ҁ�8�Q`M=�N������]-����j_#5H}�>���D>v��ᣕ�ʩ���j�ˣ��B�ꍎ
Wz�7��Fo�t/�>���ا~�Φ�������sQWG�{��n�uI�Ѱ3\_�w.tז���$Wڹ��ay�ף�?�3b7����Z�lw��6����:�j�`�����[�w�
ty_����n��;����GX�^wu�w#}uW��w��Fˑ�
���?
��
��	�
�<|.|>|!�E�b�R�r�J�j�Z�z�F�f�V�v�N�n�^�~�A�a�Q�q�����'��o�����/�/ï¯�o��n_��C�?ھ���#�?�~t���'�-�[���8u��j�N��u�����:�^���p{n���u���]��q�R�V�B��b�<D�<V�D�j�kj��I��
�I��j��Ʃդ$�S�E?HZ�V�~���K?HENV����n�z*r�E���6��"���'#o�|ԓ��i>����4�d�m��z2�6�G=y��#HFަ����i>�d�m�� y��#HEN��"��R��|��i>�T������?@rm��])e^�Uȴ)�gs�m5&vG�}�Cҧ�=��i����b�%�i������vG���q�#nw�펌���.�l�7��>���7��1����"�;�~��X؎H�!��ش�PK�mW�c��&pip/_vendor/chardet/langhebrewmodel.py�ٗ�y���@�$���j�L&��X���!�0�	�i�����d&�a��<G��]���JN"�kb[>g|N^��~�_�Fݯ?�t�(���ԼH�,�����U�C�#_9R�:�����_;ґ��ڵ��fm��}t��h�9�z�7ڌ�Gw��ۉ�ۣ�hT����Ƶ�I[����D������f����v�V?V��p�?�?%
�����&�/�՞l�O��ڹ�z/m�v����.m�y�ܓgϟ<u��^�]�%?ͤ�n�v�v�w8 ��j+Q�D��TA�f�6BR#�o��>S[�j�D�bj���KG6dm���٧�05�w̪�����z�>��^�>�I��C�w'�κ�z���v&�Zg��S�:��g�#E&�:�g2;�z�����V&��ɬ�drȎ䧬u6&����l��?c�dCu�U&�ª������@��T����a�_�d���Ď�N��e�G��L�Β�;�g&��Z�N^e�3�5֘�:k��7�(eꛬ1�-6/Y�o��Λ���v��0�M��Lf�|��͆�=֚���uv��0�U�!뤝��Q&�>>f�3���gWX�v&d�?��ΐfF��ؔ5ڬ=��F��g���llk�*}���?-b6�p3k?����-r��2[�2[xfDf����.��h]ZfC��ِ�b6�f��q��
������fv�*�>��
uE|vq�&v��gK���c����f�M6���pn�-<�&��zf�l�+��p9̖��GQ#�ù}v`��m��g��g�l��T��^q�ML��g�>#�Iט��9/-}v>��\f�>;?��A.�����g{fOT�l�왘��g7�lFF7�.*Ϟ���g���y�g���g���	��},	��ϳ���V�}�g�j\u�M�F�Yr�<)ú�l�l��홭~���$㚛��E1ۯ�̞�xf{f�N*᳉�32��k̦<��Hf�?�\����yfS�ٞ�h�<��"��XU�<;�g��_���l�l�g�gv�Sµ~u����l�,�X`���~��=�ˌ�0�X��a��mȳ,��a��m��!Oc�̆m�1�m�3a8�u��!���gz�ԙ^9���뎰-鳻>�D�C;��v`��k�@;�^{U���lQ��v��ﵭ����!���xm+h[z�%A[bfweVځ������$B�œ���
�$��˃v�iO��C{2a�e�6��j;�6ԪA�*YAhKp��ㆇ��0m�B��vr��6�F{
ړ	;@�.��N�� �m��!OC�4��jІ�A�m�3eڐ5hC��6T
�0��<�Dk
ڐ5hC�
�h=��Z�6�ihCՠ
y�P�
�&�#��j–m��;mU��Ӷ[=�iV�X9m�1O<b�v��v�z��N{D�&v~�{h�	;@N{��mp�h�;�/�3@�mp�NV��-�38�L��iWc�_�v��_�%����N��G�z.h���G\�#V�6�#VЮ[A�*�<�!��ح�6�#���#�Ц��"��Vv���ڐ����m�i[9�L��i2m+h2m+��mÒ?;h��!�F�ٜ��V�GV���j��V��0h�=�t�%8m;h�o�ihg�6�,=�ՄU:qmC<V�V���#V�GV*18m�>�~�f�G�硭&�9mȳ9m'�v�im0��%.�vY��$�жr���~�yh�	��68m��Z���x���#e�����vmyI�<�Մyh�A{���J����u��k�|a��_���0�_:�j–���o5h�
�H64hC֠�N4hC֠�N4h�g�6��AԢ�v>�
��]`<b�#�m�z�,Ю��5⡭&lY���r��d.hC�-�6�#v�vഡ����h����K��;�
ٿ{dh7(�������U�6:��D.>���\c���6v+�m�v������
�h��#V�6�#�ЮF<B�G�Y��˾#R�3r�6H�1�򍶓tĊ��~h̆�1�,�G�j̆�1��l�3����1�4��j̆<�l��!k̆�1�l�Zk̆<[:���!O3��l��̆Z��%���4��p��߶��ٓ�����l���0W��2ېh[1;�H�̆<[�m`�ak�™M�,�Cz1+?���V�e��m�r�pİ��I�mG��Œ�a�vq�.pkM�ڑ�mÂ?��l��zY��&�mC8"h;?e=�Մ�b�]���%q�v�ح�m�v��
������im�*����+�����5__f�
�v�h��C^`�mX��d��
1��t�`�K�h�mx
Y�D۔�m��|f��~���.�]�S�%�q���#>ў���|
i`��SH�eev�>���A��o�m'�HyC6����.�h6��5V�F��ՅѶzi���ȍ5�#��!K����������VV��#KHGVj��*=�,K�mpچ5�v�!˲vdY�!MkG�x��A�j�"�.�cH'�Z��!/;`�;mC<�ph�;m���<�4D��
y&h�oa/�1�+�M�f�뙭�k#m��viإ#>�����D��vvRxh�	��z?�E���m�^��C��<������`�:�v|�L����b_���_�n2����{h�	�4��iۥ#_<��H�E:RM�]�v鈓H�hh���+�����V�ǐ�Y՘�ӑ��]�t��cH'�vYC�l��"mޑ��d–�.m:y�_���@u�~?�%��C:R�����nx�_~:�$�!
�v���͜g���j,�F{���a{����60��F�d�v�mags䡭&lY[ؽ�^���_�ge�qp|9dɍ�ag��h;�YyaF�dkGD�H��m5a�1d5�Cz�]R�]�H{YN�t
����Q��VV��N�m�Ycm��5�d�oe-چH�,�v���m��5vkGN��=�C��s�,a�롭&�!���x��{�U�e���i��.�v��Tt���f"�8zh�	[V<�3�2m�u���N2m��gk�U��>
�ZcȴѺZ�6z.I<br��7����V���G����V�mxş�i���r�#��,!�N;چL[���V�,h{�]V�
u6�
���ء.�iC^�&v��F�R
�)�ְ!��V��N���E��i2��6��=�t�xd�"
�.r�����Ю���i�Z=�Մ�������]`<Rrh�g����<BNx�"3f��<��|}��|f;Y<b�l � .Y�eڐ�2m�5�6�	��=�'��7�V��mt2� �C�-Ӷ3ڸr4h�z/%�4��v�˴�mx�t��6�쵬�8=��|����������#V�v�Cf�6�ۆ#����h�i����ڢ�6>�,�i��~�r�^=��{��X�2mëG��\˴�z��#V�q�m�M����/�������s{m�K�0��a.���v��
���k /l�T��5�{k W�ڍvFm�K�-J�|�-,�-r�-<�W�����
k�^r��6Z��k;�Yj�2j�oAȧ�OH*Hm	��׆Z��.9���]$$�^j����d�og�Ԯ���M��		ԪQ���dIԦ��3z� ���+r�	I>�m�FΟ�xjW��^��]$$��
	�j�%$V�.SB�`��skk���"9֧�ѵ� ڬ]�������Nm|�7�m�7k�����k�Am<�����8�3N�}r���F������ ���۹{��p������޸?<��F;i�W����lX�=m��PF�H���!���x�t��<��S�lo{[�S�+[ѣ;�[��s'�_��!��6N�:~�ԥ���������N��P[��NFG�L�	.ಘ����i9Tr}Z�+�1-7�ܜ��JnM�-%��嶒;�rG�].�$�"J�Ph5^����s��M��F��;�Ъ�}�LA>]�����B�\t�u�y8=��NW+0��t��Nϩ����
|8]��B��
�z1��V/F?��?�k�b��Z��zZ�Z�V�Xg��@l0��M&��b��Bl3� v��������G�2d�壸���+�
D^�@�=�Wt"��(D^�W!�)��dnt��3�0�qS0�p3d"Q��D���qꦻ� �m������f"��&��c��C���A�s����C�s�'��)Ĥ�Vw�=-)��n�ǡ%��U�Вr:�xZRMW�}
�M���5hI-�D{ZRJW�wZRI�3ѾM:(���/�bRIGig��J�(���T�UW�9hI%��ǭ!�����Ф'��9Ĥ�Nk�]����V�.BKJi�ax
��$PG�4D�K��/ &�t�m�4�ӄ����*��pC��J�
�"?�"?�._��O����O����A�����!&5�$��T�V��ݤ���M� )����+����L��IAm5=t��>��('H}�
�zp�}�R��&uU�gHL*j���"Q����M2II0���%��iHbRRK��M��I���EjRSS�E\HW�P�CbRSC}<Y�'Z��-%T�ϒ���V��m�@II]u
�!1)����K��u&PM��T~���ϻ"��xϑ�ϼ&�߃.�i�y!}C��/<�_�Kp����p��It�Z{p���6����dym�yp�mғ2z��r�:��!Y���K�,����,k
��OI�7����$Y���Al R'�@̚�^B���M��>YΧ��*:q9)�C��*IRg�~{���F�$'e6h��"Y���	~%�]�I~�dy�Yq�e��*U翦�L35�����̶^f�j5I�G��|�ξ�r>žyK�F��t���Mz�:~	�r4�F��h�N��x�x�.bRGxx�=��=;�)�'��7T�ɲN\s{t�K"�h����Fk�c�ӻ:A� �I�0��
�򬅼��$�e�z���/�i��v#�IG�ߤ�U�����*�E��~Fr�!��$����diU�K
������ɲ�:R��,�2�����,��:䟒,�ą�G�H��:	�*�D��uT�3�奉b~N�܆��F6+��ibP� U���x�$�Uz`+��i��)���4���Z���:��4��Ơ�p��1uuh�
�d�j�)���`4)�
���DQ~J7SW�J�m�ӧ�2�����V(
N�t� �<�/HN'�$����~I��M]��#Yqq(�MC�Biq�F'��_I��vJ��w`���H�%��ş�,k�lj@rZ�*&�!ɲƆ~_
�Ԥ�o���D�S��f&
�a�4t��ib��1N���PZr�P:�$�.@�/�*1���B�0��ߗ�������Q�%�a�����RT������HL��R_'U���A��J|���&�ԷHM�B�o�(��7c��^n�;���0��*=��3L=
>�=R�=��>������^��*KCۏH�� )�cӛ�Rq����(~Bb�;��B��pYNr�V��:�gd���5�f�Ӿ�[ˍ�Ϟ?y�Lm�v�?���;�d}1�nF[�ʜz'oz7��÷�����#��Ó'��?[���[��I_��+���"�jc<��6������oM��:ڍ�r0�U�g�8��d����������p�?�?m��Ä��h����0}>E�������V4��ֿ��ډ�����ޕh��P.~!~1~)~9�v�����������������;����������ǟğƟ%�����~PK�mW&�QaL�)pip/_vendor/chardet/langhungarianmodel.py�m��U���,@v����'�Yr$%��HV����ci��̲;��s�`r ��8�!|BB|0/vv^�[���S������5��3��&��rM߮����k�5N|�D��hg0�y�qg�≎�ll��?����=�}�?��?u�Vo�?~������z�1��7�7����?�	_�/�v�����Ƴ���xp��˜l\��߽�}�qm��R'[������k[�N_�pzk���sۗ.�}�b�T�F#����ƃF�X���Q���tt3�UϢO���&Fϐ�͓
3�������ϐ�~?Cz�b�Hl{�D�H���,i�¶�#ߦ1z���s�D�qn[��6��L��=K�F��~��Umc�9�[�m�H���<i����~�@F�u��uҴ���m|�;$�M���8�I�x��$m�9r+�v18 M��G��z)ƃ�KN ����bp��dD�?��H�
��d�TȈcpLz�/��k|�+p��m���'Ѱ�`�9���&�����]L�B����*�$�<�7H���A:Qq�M��[�ə�M��8������kJZ�G¤�I':@Z�t>$�*�������A��;��d�?���p� 6� �,�
błX� V,��Ě�fA�XkĆ�bA�Yk��Ċ��@lX+Ċ��@� V,�bŁ����@�Y+Ċ�aA��Xq V,�Ċ�bA�Y+	�!��N��)C8b�@lxC8b�$b�@��!�1�S �<�!����4FM|	�b^K@쯈% ��(b-1��% VE�K1��% (b�`+Ěq�ļ"��.�E*b���!��(�&��S����"�	]*���˦���/��'��ľ��,��T�E��HẼز�A��+b�XbMH<bÂX��
1b͂X� �,��=�W�ք�@\�G,�&b-q�q�Az�8Cg��H�8�*�&z��� VE��A,�&$ ��&xẼX����"�Xez�F���Q���yx��L�@Fsy��݃4��/�[�1��˵&L~E\*�nM��Ma ��5���X�|��m> �(�VM(�Jb~Մ�XW�G쭈��q1�X�q ��qQ1b�)Cx� �X5�bh�x�8@ELV�"�XE\�u�E�j�WĊq��bޚ0,�Y�X���G�9�Ċ1�K�	=E<kB�"=��WMXZ=H�*ļG�oMH�Y�"V�*bĵ5Q�	�pE\q��HE�b���#��̚h�	���K@\�:b�˶|m��u�"<A,�&XE�x�X��%�D�1p��/t�@�}@l	� 
����(k��Ě(ĥ._[�u�˴jb�x�\@�E,q�G�aMdx�"k"�7�j��B_�[eE�����YK�u�G\&�}1oM�W�kW��<���s�A(�@�o���G�Rqu=b�+b��VM���񈽭	_E�[���"A,+�ɬ�6���*o��ͺ_b�U��fA�YkĚ�fA�Z�1�j"�"�,�5b�#���Uk�UY5����bc���b�A,QĪ Ẽ�(k���&x�u��X����(E\qk"��8)��EgX2E���ֳX�oM��:�5QE\��k��X`M,�X�� �N*�g,_�1��(�!���_�ص]q� 歉��X�WĬ5!1oM���X{����gY�u�z�źE���#&�y
b׶@K��Z��"���DQ�&�����IJu��qALn��#vmK_5!y�Y	@,�K-�� �_qfWM(ĺE�9+�"�b^+oK�u��*�uRp�7�!���gU�"V,�UA�XUļ"�A쯈�U��b�
x�<�Eq��XV���G��k�@7q1�I�њX
E\�yEl8ko{+b�yE\�5���ļ"��XTY�x�q�B���O%���[y� fqA �偘�&x<b�d��: �p�g(b�G,1r��x&���:�a�rX�L(�Ê�b9�;��b9�X+�Ê�b9�X��b֙�9�X�yg°�RR�q��9�8pX��ü3�8�;4`9���f9̿X�/��Y�^��Z>�5Z���A<k�� �-bĂZ���fA�Y� 6�}_�3���&xg�1+��Zb�3�YϣV�g���|��C�|�& �o�5ÃX�_�#w�ļE�bޙ�A\(���k��	S&���]4���wф��u�"��p�W����,'�e��WG��5r�Ԋص]G���)�&?�YkBbÁ��&�qA�bޚXR�1��)b���q7bz����]G� �8`9\[�A�s�8��q���"6(���P�ص]G�w&�-b�VW�E��b_gB���@�[�E9j�@�!�e �� �Ġ|�	b\4A�}
�Y�����y�X�L��h�u&xE���D��x-�������L�Įm
b��*b��J��1[�[�"ο���E�5��8�"��{M�kB����a:�k������X�<��-b��f֙(�"6�*bޙX-�X�~s� ΰ�eV"A����5�]��#]3!���	���j�"f���Xb� V,��™��8�"�p1����9�����C\�"b�1�+�YW�!6���Z��!3&d�:h��a|��L�U��^7�zx��Ģ׮�捉�/sԕ:/��@�a���̺Uq-��Q��:����8�1��U�oL��[usY21�J�̘�������d~�vmk�O�������7&x��w�Z���7&�J/�W�R7�q�1!Z���ЩTsx�V�a�
.��:o/zń�a_�X�R�����wM�b�:/ա1AfM
b׶�S��~|�	���+& �6&$��ژ�3&�|��� ��k[��~*�L�n���R]1K&$�x����x.K�d���H"3��k[s�~J��r�}�N�/���Zpx.K&��a^�1A���m�a�)pńd������&k��xz8c���
�IƷ�k�� �,��5�<��:�!�,�#��ĒRݒ:Ā�"������Ck�
�q�	2�5�]�u1��%/7T�����~xE���Tǯ��w&�YW�T��]&Ș� vm�ļ"��vM@�X+�.�4�Xb́��v�W�JbłX-'�3���!\�"�כ��� vm�ĥ*�ju��,�����Z�y�co�i��8� vmk�O�-��	��k��	��2,�(�&��^�lk�Ě%��X�$6,�5Kb͒X�$�w�1,�5Kb# �fIlX��Z@b- ��H�XK�	V+�Ċ%��$V�I�zI�8+�}�	Œ�ߛ��I�%��)C8Eb�H�{�����E�X4qM��MM�rI���:	��kb	��7�E.1 w�x�H܊51��U�Ě%�ĝ�I̻Z@b�Mb͒XWU+�Ċ%��%1�N��$V�Gb���M��kb���&�'�����X&��+H�*h�#q��X�$f}b�+'Gbv�D1�*U�H\k�H�k��U)_��M̓���bM\*�}5��Ĭ&���Ĭ;���L�ZC��C�_uw�\��%qU�	v������w�;U��$�'h�R�Z�:�yw�'qA;_M̒�w�Lךx%H��$�z=�k���5Kb��05Kb��0�='��S�$.f�	��<�5K�%]O����$��H��H��a�3�I���$��6lk��mت��OP�yM��j��%j�y�8�}bz�5�gmב�wB�!&�NHH,p'4Gb�b�3�N�k'X���K�%}�y��	kbz.5�gmבĒ?^等���(F�'q��fI,y�y�5�\�	���b��|iMb�vI�kb��*6��uH41Ob�q'xM\�kw"A����A���&��:������	��Kb͒��ر�Obv=����I�oN�kb��K�NT�'��;��A��I���$��;v�&��ر�Ob_M̒��'f��l�kbwbII�����ě�M<m_�ص�Il?�]1�I̯'hb���ľ�����!q��=H,�e$��O��}��@�{M�Yۚ�3�7;Ob֝��!p'K⪾ٱZ$��i�W66��g�ε�N����Ӹq��߻1��4Ʒz���`�1��{��qc0l��{��`x�1��G�}x�gz���������w��Q8���o_�6߻3�1��F�'\���A����v6j�<�߉�C�B�D��#��h8���O͞��W�RooϞ�s����8��������MSm���u�����Ϝ?}e���ۗ��}�J�T��X��lή���r�M'�څM2l\8H��L�7]��7]���\���]��w\�K�p+G������0�SIh�U�E����T�@[�LS�O���d�.��&�p�Mr@5\t��V�U7�l5\v�S
��$��p�M2_݅x*_��3�|��T�p�M*_��R��R���|ݳ@�	�7I�16I�[$��l��@�C��
�n|�c��Q���pCi|�4�OA�f�k�=	A��	Ҍ�� ����2r�f0��=}!3��H�qS� ��!A�F@�0{��$S��$A���_� L�f�a�6��� ��Ģc��ct
�t�~�t�~�t�~�6�N��&��z4h�������L>�l��$
�a2��#A;�e��| h[���|h�2{7�0��<�Q�m+C��@��z��m����C@�.�h&�a���@'�c�����0���w ���:6�ǁ�uf�w��@'̣�b�(бy���0����y��y�\�߅X��
�v<�9��B�έ߇ �[/�Q:���tr�!)�!H�G���x�>��l�]{���Oe���d;��3�V6�4��穕,Z�l܌���07�ɤj&��%�ٱ��v1f�~j
���k,'�dܕa�&�z�F[!�r_����?�j+"ܴ8�X�cKZt$R���� ݥ���0����e<a6-w}�aЎ���1h��R/�kC���ҹ�'���������7/�k�l���l��x��Ǹ*���h��f�^���!<��h9��=is�#\�G���9�jA�_1nG����¸}Є;��÷1n��[ݏ}�}Zn+h�ln�m�d�q�6W`ڣ���r4��\�S�5�E�������]�ӟcئ�v�N�m��v�̣Eژ�7��M�݅��0n3�`�oa<�4��;��v`�~�VO���70l3��:�m�� }��V$wa��ns�����Bwp|�q�k�M��1��r���#j�s��/�m�]xTž���]
�A����u�~���v�����
݅)�*�m�]��!�+9t�%z��m�]��!�Vx�|9�F#���
�Q�.�C�� FA�x�Y
b����dU.�CD�U"F!3z�Sӎ~,\��?ư呂a��i”;�[��� �w1l�r��#{+N����2�;Q���O1lӄ��İM�{�>�m��x�3�$����0l��.��?ǰ���ܿ������Kbu��_�#D��.�Gx�Z�b���gx$`�7{�!�m��6�[�j�&8�8a���_������?��v �*�Y	�]>B�Y1c\����MѸ�4���XEc@��
��fv}�ag"U������~����h�꽉�0G��C��D�&���6��>��6G�G_ð����� 9'�ħ���:M8�70��N_ǰ�;�[�_h�N�e����\xB������x�"��"�cت���i���)��&�>0��¨���@3��m���5��� �#����.��c�r���
���Iܱ�o�
����c4�~����D�<��Z�"a��F����		8�w0j�sѣoa4L~�'?Ĩ��N�6F�S^�"6V�8�q|�cj����D#�n�^ǰ>x����(=�E��H��/|�az��&?�h��4�>;=���Fa�ހ�P=�7�L`n���ȁ���nB~�b���C�F�A?�0uN���a��?
�,C����\l�j\o��?�[W�j|i���}����w��˃�������2����޼ӻvw���fo�~���m�Gۣ�������ީ<���o߶��T���[�fW�v=��7�����ƃ���}[j8���n�����v�R����;�1l�Ƕ�p�;�O�]ow�V�z|��Ϝ}�3��_���.^ں�앫�]��z�o��_�yk�ŗvoG{��;w�4yu��W'oL�1ys�����;�Mޛ�?�`���k�ק?	g��^��t��mS<�d�G]�x]��G]𰱵)x��u��Q<�-{�ܒ�uPC�*
����<�3�=�!U��&�2�=����Ph�&����x�EJ%�h�ZIx��:q����.)��P��
 q�xC�J q�xSΊ q�xg�� q�8�Bf���B0�.�Ǭ��wq<�bH3��xD;��1�.�Ǭ��wq<����̻8��Hxǃ�D��DU$<��(��p<����G�2��H�F�8��Hx ~ ���@����BB�󯐠!������B}�*$q�/O�$��%*$q/_�$���
	�Ό
I\i��$.)$*$q�-Q!�kcy*$q�/O�$��%*$q�.O�d:�
	D�TH�?u�d�+$�S[^���B�\�/Y!~䪐�6��8Y!��F�B�橐�HVH�RZ�&�zWHX�YT	{8a{8a>aEc~���WF�{���^)�&2׊H����PK�mW�`̖(V'pip/_vendor/chardet/langrussianmodel.py�]k�Gy��_1AIld�{vfv�(�,PЅH8���f��V���ʖ�(���l���0��������ϓ�3���%�z��[ouu�)�zn[�|���o_Μ9�ުÍ#o?Ҹ����q�h��ΓG�r�Г[��W֮<��tocus��O�l��v޾���vo�����Vc��ͭ����G���Nd��vNo���:t��<�x�����ӽ�ң�Sk�_�r���:�k�h�L��
�w����ϟ<~f���3�^>}���N5�5njd���ƍF�p�' ��;,xq�h#)�O���~Y�����hxO�K���8�=��|F$��g5�^����y�c�"�������� ��L����ťzU�-
I|���,��|E�-���&b�	Xܝ�X|�7,�����G~K�
[\o��p�����h�{�J�~_|��;?{������}]���g?�p��������៊c��@���s���(F�bgQ�/�y�b~���>6��b�T�qQ5�[��>�7*v����E�j���g���s������ȷ���������~7��ep[�]}�;�*�2x^���������}�)���8H[�/���w�(.�aS�x!Kč[9q� �7�.7��{���H�
x8��GG�ػD܀�#n�]"n�%�\"n�%�\"n�%��	�D܀�"n�L��q�q.7�q�M�a���(7`��q�%���%�l7�Q"n�l7P��QJ����0�
�1��pč�K�
x8�\"n�#7λD�`�qc�qc�q6�[��
�s���r4���#)�:�;��#�	(�:�ۡ����;��p���������qzC���v���nP�����p��q�qc��{��E�D��]M܊]oX�G��*�5k�=��G�s���X%�<��v�CqW7�)U�(�$n�Qq�J��J��a�$L܂E�Y%�vX%x҆�'��q�1Z%�]'q�y�A��7�g8�vx��<q�D��#q�-�V� n���ŗ7,��W�1�Uq� %�<�U�7j8��pҋ���H��N:�;D8�C��J���Q"n�l7f��A܀Kč#�A���ZG8	x���V��E�=�ď����cT܀�URTY�U��q��<��pҏ��J�����I�8��w5qd�ď�Q�pĭ�A�u�*9���U2g�]�URM���A�~V�t{�(q(�'�M�8Ĭ��*�#n��Y%)�`�	Y%~��X%u��A��]�U� �:�{J�q�w�����G��CY%�q;��a����JO�U�8�Mi��:��=��<�p{�d�8��	x�3j��y��ġ��č�7��Z�U8�U�Aq�5�����������U�8n�S�q!n\�Y�=_��7���0�d�V�WNu8`TI��Iq	'�J�4����KݰIʛ���a����*q(n?�b���#Y%Aw���U� � ��U�s�Nz���I���C��V����d�����%���T��C�uz�A����vw�� n������]#q{)n����I/�]N��Q%A:'��A�zT�������b��G"n�=�
8uw�p2���JB�U��x���Kq��Dq��G�t��dJ�Kͳ�\��'8���Q��<�
8@�U��grv@��IP�dgI�4�{7W�cv@dj��� ��p��*<Ɩ�	w��N����"�:g��*��pry��pV����X%8�����q�R8��[2��*	��VI��J�X%A<nǨ�	X%�b�8w�V	����A��]qϠU2��cZW��J����p5L�\%1���/v$�b�@Ӻ:p��(ӺzY%~��e��4�8F��X%Պ�|$���V	���$S�Gp��f�3�z��g�8�{�d��G�c'��Ō00��!�W�~��G����/�t)n?�𜴼�7�IqO}8� n�]C˻����%��Σ,��C�kv@�����I�b��N:<n?�'C4��
8⭮{!��Q�A�I�q���zOS�d'���^M��7Hjj���� n?��'ĭ�I�N�*<��Dq;��H��#q�s!�i!n<�%n�U��o�v��~ĭ;'�{zp�:��=F����^q;<���a�8�{�qAqW���#���u,���I�BF�"n����#�U� �	��u*nG89~�
x�;@8�C�7�d��Oq;��Oqw��św�����dV��F��G�Ӣ�q5��]m�x����}�{zft��A�ۡ�CX%mN�W��7�:��⮓��qר������1��F�V�@ǥ��0�*�#������w�!��u7��t��<q;�N��:>�:)�)4������	6ɔCq���Sq�y�U� n?ō�ԡ�'@܎q܀#q7"q�;q/j�[���qc器��kV�A��*n�U��q��7>p\-��i���1T8�J�p��{w�n�p�kPw��ۡ��qT�Cq�5�L���_,؋���A��� n�c#n��N ��p����(� �=��[���y�a�{��J���CX%�v�*	A���e>�j�v��m�Cq�V�ּ-�yw�v�=�A%u�Cp�NI���h@̞T�m�%�\�m�C�1��ۀ�Zp����
��ۀ�YG�1;37С��8�`J���K�
��ۀK�
��ۀ�8U	>��ۀM�Nu6)�Y&n?�$�������D܎�k�c�A܎9�����e�����-�j�vLX-�}��1��o�2�p������p�������"�D7N�g��w��{މ۱r���vX�^��A�^�;q�[q;�Iqnr@����#7��Qp��&�C�;��w�A%^čӛō����fu�#n���P�~��B�4U	�Y"n�q��/w$�9'n��vx���*���{�wu��(n��� n�U��&�T�^V���Y������۳�M:��w69n��1Sɜe�Ax{��[<P��#q�q�	n�`��سI�Q�^�J|�o��p�H��8�S��L~�w�S�D�:�ON$�H�sN��W���P�8�qYܠ�:����sP�W6��xD&45��v�y��=W���S2���u4)�(�����$�S�7w���y��D��/�vLT� nǘ�`@q�E�A��Op�KcJt���둸#q�q�
t(n�~��;%^�},�N�Ԍ�k�q8%�s0`�ŭכ�7�v��9�m���S�5����X��yJ�y���vn���:w���^NI���;w$n�n��Kp;�&g�����}��:�ۯm2�S~Ѥ��&[���Eގ�y�)	0�۵9�Ax�/�tnG�;�u�y[ܛ�ۑ�煷g��&)�[�=��/���!%���.D��=/��L��,Z� n�<�
ӝL�t��8M	xq֌�c�yz)y�#oGޞs����F�=v�$����b��	� ����(qn�nw^kR^ؙ�m����5��]o���>�=��%u�v�%Af�
a�����%�	ގz;�y�k$`�J�c$�oOπ�`�N���	7�+w$�9!��L&���%�z&F2Y�3����*��#q�qI&=��{��d��݁
�L�
)/�F��g2�
8��z&��p;��V�(?w$�9'n�\C���,%!�/�`���5����|���1�ۡ�k\�&�nwYg$�H�sN�A�,�j���������7Nc�nw��(q�#�犽�P���A�8�H���Hܑ�&q;�ġG�J�d��k0`�����*�0��Cq�Y%A��r(nG8� n��7w��3����`���"n�⮏��=�ć���*	b�Q�~��*��8�Hܑ�眸��w��
�$n�C)np�I��w�
�1��p7�)�\ǚe�v�M�P�-=P�K$�H��B�@�#n���_8YM�@k n�&q5��P�
����	q��v,���I񡑸#q�9q���р��8�ǍC�k�Cq�{������������Aܺ�]=w$�&� Sq���j�q(�j�v(�
8�w�5����L%~�bJWu��a"qW7޽:�	�AJ�
x$��A"qӟ��G8YM��y�����9Y=�kw���J|���q�A:'�F�8��:�I?�k�ъ[��;*�y!n����;���*q,x\��Jj�С���6�7WI�-��v�URM܉�|)w~�H��D�~VI����\%w��A�~��7����o:t8;����X�=���[m\|jek��Nok�����Ncum������][��i�m4v�V�6�6.5vz�v��g�X��Z[��{���խ
���l������\ݸ�suegms�Ⱋ�m:���:�f�ͭU���nit�?�������Vv}j�O��W�\Q'���:z��#�����s��?���9~n��g�Ϟ{�s�c��uQj��ʯ���˕�pR��	��4�f/��b�L�U�mnpDŽ;�d�Kܕ���"th���KE^ޔG�Z*��T��2��f�	�xb��']�5O��ࢧf�	�zjV�ಧ�=Mp�S��>5�M��K��/Ջ������OK����+Ջ��,Ջ�ߤzBjl
��.
�m[<�-�?��_\�_�j�m��xwĞ�J�@Y��ʊ�
���eEGʊ(+z'@���U<̋]�In-�q+ ��V*@f�����T���Z�s�jm�#@<�-y���聿c�{�7�=:Pޣ�(�������*3k�8�����b�G*�i� ����X��TR`�����l�/��N���ѹ�����~T/vs�=���V�|��"�Bu�@U��{fu�s?L��q`VP���0U�,�%T=`��T�������UT~ �ST~ �ST�~���vQ���j��@UP����jU�3@UQ����S�����|��|�x�|�
�|��$�e���`VR�(��Uu�2A�ݬ�vq�kuAU�)��hV����u���7�BVR�8�%�]�3��YM��k�ۄ�'��>u��C��'����B��Y]PYų�5�*�xv6��j� z�:Ů��hV�Di
\�mUUK��J�:ٗ�{u�QUU�QO3�����gX�����ƨz���{�Qu���{�ߌ�'����F�3x�Q��/����k~>h����(A�d&Qr���o/3���d�%QRbn��Yy K6_%&@9�$JM��zI��ٳ�(=�./�M�FUm�d�%Q���3���'o9�L��h��ʨ��^�O�\%+��ŽK�tEU|�QU[�oI�����-�����$J[���lI��Q�ג(u�*[-��`zvZ�/��l�$J`tp��2�h��Ym`{6_�1���K�D�C�zI��7:;/I[�3�(��t&Jg$8�3���FC�M��-��1�^8<
?gT�p��7�*î�`Pɧ�„�Fy��D�
��_3�
+���x~ˠ���d��F���Qő�b�{�$:�)p��;�n83i�nQ��|���G���aR ��ݿ�o��n8��C�K��?H�t���m�I���I��z�r�Kt'Q�]f"%K��{��A)�t��e.Q�$]@�w�yH�,��=�`�(�w�9�D���㇓t����w��
���=}>�^<a�{���z�8����DK�p��{J��	��K�tI������Ǹ�7��U�	��o2��M��~�qUo�����zS���c\՛��ޔ�6�ޔ��s����r��`\՛r��c\՛r��e\՛r�/3��M��O3��mr��1��mr��e\���?WՋ����'zB���^�d��o��-�U���ݿ��!3Rc���<��ݿ��xVoQ�@�J����|�A��W�fTIU��*G�Ǜ�{R�[�)y'e�7͝��KD�	>��J��̞gT�0>�FI~(_J%w�eo7%��~�Q��T�H�RrPp!�|%��i�$>Ũ*��	_5�Q��������Y)��|�a���w"�5�)�M�WV%Bl��au��#�o�+F�
��7V�p�63Sn��M�u�q�E����7���{L@-��[Yx@��%���G;�8�8��qi��������vNo���TN�vogyc�r����} R��[_ٸtu�Rv�sW���V6���Ncygsysk���|y�ʱ?f����|Y�|�<u�̻���{���W�.��/_��^�Y{�����cw;�v���y��zW�W�/��-��vT�p�]+��=�㬬_yj�Bo�X���?�T���{���{���?�\����_���j�K�/���j�k�����f�[�o���n������������I����������/������o�o�7�<;xn���G|lp{pg�����>1x){�:t�'�<z�痳ߐIA1i�$� 1�!����$� ��� lu�١��[�t��!P���],$��I��9w�7k6�Ϲ˾|sQ�����A�>�.��d���~$/���es�|��ɶį�]��If���?�0����"�dZ�K~�a�,ż�0Y��,�I&���.�<�9���圇d;��:�!�خ�oȱ�R�I&���.�A� �p�K*�p8�ln��a�{K�KT�gOb���]��I����SF���k%Mws��2���8�"]��¿1H��e;���6َ�섭�m�ɩ,
e�$OO`���}n�O���׀�\�9�j�K���Y�ɤ,��	U�l.<��&����>gTr(�*���!�������naG�>U2d��|�a�cQ'��r�P'�Ur�P�G&��Sgdtu�AGdt�NN����C�Y-��s�3+�f,O0OQ�r��τ�<�ί
�(��9��rp�/:E(���H�:��ag��;�V��N�����m�o�d[	;�V
�N��Ʊ�m%r�d��+٦��J�)+��mJJ�d�r+٦��J�)#��mJH�d��+٦t�J�)��mJF�d�r+٦T�J�)��mJD�d��+٦4�J�)��mJB�d�r+٦�J�)��mJ@�d;�#���&�SN�)���<)'۔�X�v*z�9���r�� �d��r����d��+٦���l��G9٦���l��O�M��6�V����,)9c%KJ��ɒ�2v�DR�J�H�X��+Y���d�$��,�@+Yj%U�R+�J��v��%R.V��j���M���u<������u�"�=�����m���8X���C�P�H�7}ш
�Z��4b(҈�HEb(C��1��HE���AE�9o�"����?d&""���S��\go7D�CS���DN���<��u�IG�$�R����ս'�X�k���':;�y��
�<��q�bP�*�4ϳT��
�BP%�5y�*9 ���D�5��J��B9��&�AP�N(A����!��h AP%	y�*9��3T�����@	HE{�R��A��ݢ�l��b� v+I��L"�l�P�awߐ�L:U�r[̍��N�U��R"�Ey��,DZ��|Qb�6�)ꀉ$�o��OQ�7[G�|�uD�7[G�|�uD�7[G,����)J��G�����=����#�͎=����#�͎�HI���4w��E���-�]�n�`v��.�[��J�"�`v���KJ�T����u4;E�c��)��N<��N�E�0;E�;E��;E��A�W��r���)��l�X�Jh()@v�i. +��h����7�#N6�"�]�'d����(��p*h���		�5�����R�����D�UєR:v��RU^�D��7+C,R8V��m�ab*U�y?���(uc��Tt�,US$m��A79���t �����%#V�k��lHI;����:بL�+^���36w4b�|��fꁵ�C�D��] �]��i����e��.���:�{����u4b�шQG�:b����1�QG�:�Q�A�:��ed�4;@�1�aΙ- ڜ3[@��tVF�6���{�- {�m�- ´3{@�z1{@��c6�h���S��m z
�D��f#����F��� /�鶌F�{7An����0A�p��$���� w�\�D�_�� /r����{�^��<������ ��sR�^킚� ��6zA�4��ؙ^���.ߪ���v�n�v9ؠv=�
'uy?{���
!���w���˷<o	��<�	��Y��W�_Ѽ'��e�?o
�z9'˻B�^N�(*�^6?�y_��OH�b���!\��4�:C�\iPk�5�Q������u.��-�=�'U2�C�Jf����=���!�'=2[D�uo��� R@V��mVă��� �$��u+ý��y]�xݪ	�('���SNb
&W:�y�G$�#��G�+!d����B	!+�X�k8��A� ;gX���(���T��O���'����v�����UO*gYʕP���Mv�eq�fK���ض5-�AM6�eE+)d��WR����U`�YH9��,�n�Q:Ȋ�)��fJC�6���@�4�jޡ�@��'�}�'�|��&�B6�ˊ�h2P+9S���h2P+�Rj���ֱ�&�Ԋ�h2P+AR*�Ί(�R!
B��g�2�Y�lW�+���@��E�;`���r��Фe���i��^���G�ME�����T�M_r���<w�ԩ�'bs�c��1����$� 1!0� 1��$.at�9��:���O�'� b<1!US�x��"Ӓ �ĄT-�����Ht �ӓ,��@��;�Hx ��SIQ���4��wz�1
1����,�0��N.�08���#J���p�%ܠ�{4(���u�A�#:F�y�8��Q��騌x�b�+J�pG͙�་y�(��Kʱ�lR��N���z
+���|r�%l��l�s��<{���ow/��0���H���׍e$X��ֳfQ���l��`Ng��[�������77:��UA8���#������z ��i�o<#��ܠ���8(-Z=P+������)�(|���O}��話(z+w��p"dz��p"dz��pwɮ���k�M�!���=���z�
8�Z��Jޘ���N��By���{S̈�W'5����n䠟w�G�V��7�^e"�����$΂g���Y��>��WoV��^A�镋'�o����]��f�
4	��{��c>�醝��	���5}����g���Z��8�*&�!1��yH�Cb�c��C�O~��K.�1$�����6��2ZC�
M� {C�
��A6�dZ�Av�dڼA��d:�A��d�x�l�6ty���6���"�m`�k�d�-5�D�
��]"�~Y�6�l��O�k]�F�H����)�m�a��d�~�"��F�H����-�m�a��d�~�"��F�H���G�c�����6�0ZF�
|?���l��m$۠��Ƒl��E2�2"z��:��	s�eD�=o,#�mnc��eD�ko.#�W.�ˈh��\F��yc=�����(m�eD�Ti�2"<'��:vF�Ď��*�cg�J���<vF����ҌZVF�4��Ѻ�Բ3Z%{�V�;�U���h��3Z%}쌶[5)�+vFۭ�Mъ��v��sS�bg�J�--be��l�5�Z� {�6� k��RA��J��ĕ�ǔ+d����A� {���A��O�e���5�*C_)!��'���ww�T�u�+�|�eC?�����O+�SR�2�I	 ��X�~\0YI���i���\1}��4(�C��	��b�XH��<ļ�C+����b��eK���Y��b:����8���X�X/]��L���F#?Q���J�o���g����,�&;��5�-��Q�5hpRCn26����PK�mWe�,(z�$pip/_vendor/chardet/langthaimodel.py�]m��U����cdK��ym�dٱ
z	�	(Fڱ4x5�̎	aHB^�q�6v�C�BB^��/����j�N���ݧ�t�t�L닭���u��O��u�Tp�#g�[��������3=���<?��
Fg�/�{���[wӽ����M����trs8
Fw&�YpMu�?|�lxA���pvi�7����94����f���oѹ���������[�\pyx{`��\����/?ݿt�ɧ.��Ý@�i�����o���I���E�� ��R<j�)�#�H���L��biX�+䲪���/��!����.��U�^��i���%��'&��N�7	�u��	��I���:�o�x�q~���"��E�������$��t�%�.&]
�nb�[)މ�mҞޮ�i�a}��M�/�c2���wH����!eH���M����i?�FF�~����Ǥ�P�����?H?�����7I�?#���\�A��o���^���t�$��H7�5}���!��G�7�t�����#r]2kG�@�'�|D�E��e0���>O�K��#�l�i�EҾ����<2�G��hkJxt�v��<��C��O��QB$/=n����?�:���m�?��?���I��3�<'��?�?�g��s?����?��?���I���p���<�c��G7��!~t�!~��?��c<�����}���#~t�!~����d��g��f�x��q���2�<C��s?�g�x����<���?z�C���-�Ӹ�4�$~��G7[N���L�x3ď��&~N�3��)~������<�#���/T�h^P�s��)~�!~��G��E�$~Pm�����?p?��Ky�����N�sz�Hdx�:=e�>�x3�����>���}\6��<�Ӄ�+uz�<'�}N��9=N��1��^��9����N���}N�w%�������������h��}�'%~J��ŏے!~ܖ|ďն%�_J����/��9��tSP�K-~F�b���A�?g�3N�����_J�R�Ǖ�^���S�ˈ�j�_s�%~r�%���o���?g�����G��3ď���?z)��]?�|N�ďa�S��s*~�/���W��w��0����I,~J��]����]�ď�n	�;��9����c�3��jo�$�we���|��V���z�F�n,~ߊ?L��Pg��M?kD�Bŏ�(��nňp���S����}��v9���I=\6'��9���D���Y=��z4GZ��+~����4~���ڶ�����zfsrVϚ?�Ə�����+�xN�Ƿ��?�Ə�U��m��J���n��+I�B����O�z\?�|��h^P��'~���o��UD�3���O?����1���o�Y��^i��<��M��X=qJ��ڜm��ĿVĿ曻%?�?�/�z�����.��g�_s�%~�S����$�Z�׊�ܫ%p���=�m�m�7j�7�l.�K+6�"~G�j⯠�_�:Y=D�J����	��\O�_ŏi.D�U���h�?wr�!~WY=em����j)���$��*3V�����W�Z=’
\�4��'�/�Ճն�Z=R�Vev��k�/X��ϙ�/-��*��V��ϕ�_Rqΐl��Y�V�|�_Z�yۈ��Ճ�R��̾��\i��%�"m��SR9~)�s��#��j�p��J�3�_�r�-R��P��r����jV�+����9�GH����S��/�z�\����])~G�\i�~�����#,����	��X��.S����S�TuN)��)�,U�Ҳ��s���z8ŏnr?g����e�=�l�.��9��*~i��'w9�wS�Ƿ�''w	5���)�Hۺ?���׵z�+~��|+�z8��S����<��G�����K�z�����v�{�}��1m9���Y��wX��Y����"���b{���8��?g�s�ߒ����w9������a᾿<��s���I��/A�LR���^�-�]%�p��~�����"~����F���]W^?��p��	~G{���#��\����S��D�y����V�ޮ���>C�Xm+V�Ҥ��%�pN�4��j?���/�J�v9�����M>�G�{�����`?G�R�_J���U���$ٜ��]�ﰬ��/���,~����$~W�poWj�s����]�ϙԳ&?c���W���Cj��<�u�����v��J�9�o�ޮ#��3��K��?G���_�g�����I>�E�Ey6'c��ٜ�ďxZ=�swя�//�>��F�sV����.���V�g��#~W緸�]��qu~Kj�H������m$��<s�S�����T�{>��"�u%?G����oI?�S�?g�H=~N�K�߳�g�������%���/�ܭ��V�0��,�_���j�8R�񣽧m��_��!~����%{��rW�
��vz�s��J�9rz\���u��hC�|i���.��K��*�ϗ���0�Ǖ�#Mꑦ�s{��lN��9�̅�KJ��O�%~򰜐��Y��͉�9?�W��9�_1����ٜ�����/=��������lNG�8�fsr��J=�sN��4~7�8�]�9�}�P�;��}~�� ���~r=�K���Ƿ�,~G�v1�b[�R���}���>�՞���$���W��;�� �K�v�,~�]ϼ�!9=d�Wokw�~��9���s�����;�����������?pON��%�����|[���&snjN�o��!~.�߷�/%~a��4�tk�sz��v9=��G7~?W���⯚�#U��ҕz��CV�V����ݓ��s��ޮo���z��Y=�U�AJ��J=%Y��,~��爟S��m�K6p{������!~�j�+,�"�/�z<g�y�����,M���8����w���Y=\mN��#M�,���7��:7�����?��񣽧�ݒ�pʼn_h�0����x���~��S���x��[R��?wn����o��|����%js2�ϥ�o[�N�K��sY=��V�o��x�Y=L����<~W8�f�x�z\U���y��sVG����D�g�HVYm'x�B��3�bſ.i������)~G��)~W���ܮ�tN��M����-W8��l^�7霞���!���:��d��eǷ��;��uun��}Gi��?��#=���T�sN������.��D��~..�͵��F��W[�p�-~F�����?گg��u�O��8=�+�����L�)~��fsb8F�R��S���r��U?wp�#~7w�{�R�/%~a�.��;��9=J���9����_�����a	�_��ܓՃ��4��͙�#%~N��o��z��_J���Z=���b���kſ��_h�&����m_���}N�sǷ���������C���*���J[��֮���~���;����_��ߪ��o�,~rOH�����=��ܬ�sďn�]�SX�Ǖ����.w|�!~4����������?�Ǖ�爿j��,�������_���Y��-~N�/X�SH��⯉���ܮ_��K��}|�?�_�2�n�ٜH��J=�,��J�9���M>�GJ���[��9�m�J=[F���-W�z��[~+�xV�-��K�[��G�[=����zо���Z=�����J���zo7?���pq���ƿ���$�fsV��9ſ��/=�UM��W=as���y����[����W��#<�����z��6w��z|o��X=���mժ��y��ks6�gX�|��z�����.�-�N�{.ʌհ���S�j�B��&~	�K7w�J�i?���x�tN.�xά�_q��#���J�z8����<~��D�6�緘������p5�9Ӣ�t~�e���ذ�?��9�G����(~W�h_0�x1��(��#��*6�VOM��Wu��C?��%p9J��a^䈟S�R��Q���+��QqN.��3񣽧tN���9k�?��C���O�]�3,L���}�Zw�����tS
�p��]4�HV�P񣛚�k�wD����\\��i�ඬ6�sS����V�+~���V�񣹟�oq������M�5�_���\t�����a�x}�ˁ�g��j�x��SI�?=�E����f��"~�������)�ܭ�s����W����g����-�S��E�iqN:w�ϝ�r�����)�8'���oI�v�緸lN�-���U�}�h��T�4�S�t��ËU�*��O�>�p���
�})��~Y�v��!�;��:��rz��s���m[U��I�����/��ks����?W�SZ�_j�8"~G�v��$~����9�̥��\k�o���D����I���]���vk��m��.^g���)C��3�O���o��o�����&��&�����͟�D�������%ɜ�bj�7���o�YP�}M���(~��K;;��S�������x�ܺ3�n͆��`vg0�F{�x2��G��`4f�h<�f�3�je^L�����G�g��c�;|p��d?x������`6��K��M�7����$��d�g~Q��L����ta2�MU7���/ؿ�z@�7���>vn����ѿ��g��9��J���'�����E����ܸ�h$���aG�p���y����y����y����y����y����y���1�g6d+A���x�� oY�I{�Z4���(���|�!&|>���x8hh�<��q;��

�G�цv֣�hC;��=
�G��v�x���x��kg?��kg?�Ļg�^&^;��L�v��&�D�l�Cl��	xʂ�����{�]�)���G�g�AZ>j����Y�F�҈~ς4��-H#:cA�Y҈>jAQ��v1�bڕ�n�.cS]҂v
�#�5���לx��]��6�5�
�E��Ю�6�G�,H���߷�E���,H�Ѯ�=��{����,���z�8�[P����9���ޟlt����i�����K��\�)K���%�q�^�(=mA���H޲�XPE'������e/�[���O,h��-h���K��I@�-�
�]��	P��',hJ��S��ϫTن�,���ٸn1O�ܠ�,��	��3�x�d�nAO���'-�㉓_��}��x����K�%w�E����)/�-Hy�,�B�$C�����I@��cP7�]�T:�0��=�*�n���w(Lf�ӆ�}��u�^u�dw���z�܏��J�k��>��
}�
ˮ�}��F5���B]�����K%���>��*�8	���Q6����^2T(-5��"=���2t��^h$�=���y}��*N�,��
*N��Pe��z��I�[�t�=J�����%�t�=P�j�q���a䄥��{�[FOX
Q?��2��҈��Q�W?h�:����=�m�:^���:��9�h�u��]��=�@n���A���������d�QQ:#xDM>�
O�QQ:UxR���ҩ��0
$�TŸF�D���C+���q7��a�b��Gz�p/�$��_��0�$��ƸF�D��7�ȓ��f�����02����q3�Tibc�#W���7�H�f n��-�t���ți��Dt����/O�C���֩�jӄ��9�:�f���#nY��M�=��pn�"`}�-�%�:Ҏ��X��F��B-i��ˀu�ѡ�5���Wq�櫀U�m��5�*�6Z
�����_���ܕ��9m���U���O�Z�D�?o��..�M�*�&�-��]
�m�*��|p���C�z���
C[�=�:��`d�Қ��V?ͅ�P�6��]�:H\�{��H��j��E��4��@U���ĸP��`�d�
\놅s��VD��b瑖D-�ǀ��Ž�	`�\.��EZu��VQb�~
TG��X�=���Qb�?lđ����4K�@u�5��K��pq�_֫��պ`�FƐ���
`}
�~�>Ћ[yX�]0���)6�fʤ��bZ��_,����2y�)��d�������'^8��d���H˦�BR_dt�]�0z#���;&�y#���DY���dj/ؿ����q����Kv
a�FZ+��W�� ;�_�/����X#�W��'��5�&J�n�;����_���|�����}�
���`'Z�	X���:�z�*|�o�oK�o�í�
��(-}GF���n-��p��̅���,,}��P�H}��3o^_���S����h|{�ă�P��׆�K����?�����i��g�o�>���g0�}op[����H��z�٤?��
�����]�{_nX��:�]����>�Y_��[�����p4�8�O�^�n�lu���D��0���F���p��#v?>�?�z����v��T�RIH%�2T*PI>%S�MI4�Ɣ�R*K)*���RR�H) �v��Q*F)�N�Q�CI%'�tP2AI��W�z�^W/q��V/g�V�\�~U�R��T�H�>T/?��S/5�S/+�fRo!��Qo�&Qo
��Po����*�Ud��S���C�}���)Sl��I��bE.�Gg(~P\��{����Y=��9UϤz�ԣ����vv�PK�mW���1�v'pip/_vendor/chardet/langturkishmodel.py���U�߿b��r���)`ˎ�X�����2Ҏ��V;��ȱ������
����	q^;;��ّ�/�z�ޮ�����S3Z����lOߪ��|�[��<�:��ӭ득�ލ3�;�N�mdk���vk���K�������7�ӝ��уk���f��ɵѴ5��?��Z����;�K_�<�]��v���l%gZ�OƳ�K��_�L��h�n�����ս]��:�zntc��o���K�>s����=����O<y�u�u��J�3�[�[�;�(�Y�&=�>^D�E���G�p�[D�,���O9G�r�)��:}�9Bq��Ѯ�觋�.���s����;�[�����9�"��N����h�������.;Q��+N�E�����>�Cqf��C1f�u�[�9g�δ�������9���;HO�Gw���aG�[���5���q��p�3
;o-��E����-g���[���vF��{�[���8gP�~-��>��3磊��@1�/9iw��h1�/;�-����Bq�/:�Wq%����pqOͿꄋ1��ꄋ�r���`1�7�3).�[λ�3y�ɱ��λ����3�ű��|d}�ysq�_s>����Я<���e��2Z�6�6�bX7�a-���ư`XWǰ`�@+_+�a�0�VêA+�a�0� �M +�a]���^�p5�G6�a�1L�E��D�W�:5���ց�p K�p�6�a�@�a1��c�xb8i�&��p-��Ijx@vq���W
GkJR�&R5�M�aX�b�W
�2%jP��u3%����0����6�a�!1�!�U�N��V���h�a�a�
��N�c8�V�����7�
�A
ׂa
���C
[.#��bXCk�%ް��cSB�alJh�a1�M	�
k�a
1,1%Lu+�a
1�!�5°�־j�bXACo8�)���W�2S��0�K
cSˆ0l �-��ag�K����7%L 5lƦ�`X�
K��0����0�04%��1��7�1�0�0V�:����5�06%D�p�)AL���� K��4hJ�0L���D�!;X��a�)�1��0ư�V��KtcS�l�W�D�հ��0\�S51�°
�a���a8�%:"k%�U���
;��%:5� ��7���
bX���}�D'����j�P
0�l�Z&�yaX��#/X��:\F�I�F~�'Kt�c�Jް�x���Ktc5����
CScX5�a%�0Qn���J0�0�)��a�ް��N��&��c��D��aXC'�	�p�0�@���ÒJ	hJ$�	�p"�p�a\)Q�]<&I���6���	�a#�����pjج��o`5,�0,X��y�ÒJ��ް`�.�n�`-d�D�)Aa��aY�ưaS���RB�aը�Ò���0.XkT
�%:㫆�)�1��0�S{��u��հB6á��"�N�P�u���a6%�4_)���B�a�%:\)!�pk5A���}C	0հ���0jbX�0.X�u��TJԢ�e�����ܾ�#�J�P��I԰��Ò�
o5��X+%]tJ�a�0�<1q��!0�R�Ĕ �43�`�Ov0�k릆��%ƦD o�ka��:a؄�p-����]t$���7ڄaR���jXycX�
���x놽M	\�&袋@
C{�
o���� �E۾p�N���sn�X0J
ccS¿n8��M����0��!���
C�J���.1%jQò%���%Kt"5l����|s�7p��Ĕ��}#��a�J	ؾ�1l �Mu�

1�d��A���0�����b/�E^)!3%(\M
ׁa�1L�ffưs;DzD�հ�)�Ʀ��R"^5�a����D
0H
7��O�V�kZ)Q��5,�eu�%j�����n�����.�1,�o5�1�+%6��eJ��jx�KtؔU7K��{���u�].Xsn��1%0���n֔�nԔPcSbXE�a1��c�aOc5�U�J�a�\��D	��0���S��;�97c�Kt5���á��n�nx�6�l�R{þ�D�jcxc��wWS�2T�%�mt�]t�mw����/հA�uø`M��a73c԰F����ú:����7K
ױDWҾ!RüB��`��bX��Z�z5	��5��
]"���5,���k�6XK ��AkJ��Q�w�5,��kF@�D@a�<�Kʆ)\MS�[s�Xư{/E"��%���6yg��Fw����1,��2�/�BC1l����$���+ò�1,�$0�k�`�%��&�/�J��4�bXb
K�0�0V�b���e�bXb
'�1�!��'��a�ϥ��ø^�T�0�$¨al
òa_5�!��'�ˆ��l7\�.��e�D�.�e���o ��09�K�J�����si ���W��a��Pj��j�
�0ư����06%`���ƦDu�06%B��^Sk�5Lv�S\ȵo샭aܼ�Oa,�%���aI�p(k�ۓ8���;k8
�<�h��:�$܋>k8������YR'!ø�YCCkXC��Y�PCk�ۓ01�1��76���N�^߇��7���֬'�hհú:��0��!���$�[��Г��a�'��u�$(�rO��Ws.�Mǰ�F�jXŪ���p���7�
��a
%�)1\ݔ�X�X
KV�"W��`�S�[��KVh
�Ka\�j��I��a�'�_5,�p�r5�I�U��ʭa	�#Y���I�6�(����u��a��ݹ:7G�P5�߼�l����a�Ix�Ix[Ò:�].�x��0�$�:��h��ZV�aع7�ؓ���V��`X���D��a��Ô�aC5\��`X	0�߼�k��l�B	Q�F=t�;W\H
�r�f)�֌�
+Ha�r5ܻ!)W�0�$4����p��
�B�_'q?�Е�n4/��v.�����f{7�ŰÂ��
%�^9�%t�c��
Z���0;��ew�Px�:�0��-n��[����t���3�@��0v�#�p4b���a͞�{�D�հ`X��ư�V�b�?	�a+��0�OBUǰ�V�
a�n`��n�:���B��
aX	0��1� ��Ä�u�5В�$(���x?	�[
;���]~���h�n�wûN{a0� ��'հFց0��"���a�D
�R'�t�Uˏ��S�ߓ�a�{:����0����Zy
7Y4,�0�\
Sxe+(���h���p&<g[�j���.V�v�%���Sx��ƭ+�µP��2	�>7 
;s�9��]�Z8
{WIH:7�)|_i�D@alK��:��q��3��_?�`ؿXMR&�1���0^���o�k�X� 7Z�&�c�	0�6T�a1,)�X�M}J,����	�4�L��aO�d}N\&ᭆ�'� �°����RP3�1��a�D{����p-��W]���:gj6�5���p�:�a�aU]
K0�$0�Uuc5����
aX!�2	1�wV�jX��uU�u�IP�üB�LBH�F1�oJ���Vy#��Nn'���հ��Ű�Z
b����jJ�a�����u�I��>��pGR(
��fJ��O{Á�ռw�^�l�h����jP
ǻ��
0�QKt��ag`˷6ø��@�%:\5l �
İ��N��%KtbX�B�!����6��Ʀ��^
bX��D���Kto�����j8Զ>���S����aR�^j����O2SaZ��.o���9��o��p���a�8ȕP��
rXyrX	�0t%�BV��x_WB�-�kq%(�rs�+�ܱ�gK	���P[J��0�R¿d
s/�I6�zX�a�^f%�0�e��zs8�;�w��������Ís�D��aٖ"���͆y�wwPBr�xs���0��5䰿/�f��%0��k�{J`C{X��0����U�M]H_BT:\�y�57��}	��Z(_B��ؗ���/!���-ؗl�&)Z�ao_BCk��0Ek=ܬ/Q�I�6�a�.�0��e�D	����M38Ծ�rX5�a�zc_›êAc=,��Du�
��
�0����(Y�#</���:����� ��Iٚdg�@zXAKZ��ni�zX�Ҍ9,��P���ekЗ��)�a��z����.W�'������uk���q��@�ڗ�zX�L��z�Ⱥr=,�pR�K8gX�a
9���$���^B�a�ơ��t�^¿~�q���	8,i�0���ơ!��tr8�Op@�a���q`k�a\?\�a�b����-Q�NW�aQ�p	��P��?�yo	�T��)�Pz��I��|�P�t���a�q��0�Ø���t�{��z	X�9,i���[G�K�W�NWGWs�uk�g�sX�OJcK�ۚ%�t�^BR�&�?���p�z	o_B�[H=� ��tqX�K��Ø�"=L���e���z	"n%��p��a��!뇵@K��%��p�@��X7�K8�!���%�tx�a��ؗ�C�a����t=������鈬!��K��J��J|	����eP�(��K`+o9�1�_�f��0�^c8�-!)�����%�9$���ø\�9$�C�b8��e�p�-Q��Ȗ��\�Ͷ���X䰤�NbK� ������Ð�J�al��0��-���%��`��z��ø\B�Hq����p�-Q�.�%Jʇ�6?��8>�dK8ܬ=,�%�6��ʛ�{sXA��rX`K�%�=�_.���2������=��pu[b3���%�pI�Z-���\����%^��z0������3za�7�i]�9���FӃ���p���&�����5�kͦ���x�Fk6zy��}���t:�}��hvg���ӑ:�{��d������;��x��p~��� ;����l��d������Z�[��i��&{�iz����y���.���	]^�=t��g._��;������}�����~�����/=���������k��9�Ͽ�T>dz1��Y�<�,��<�^��pg1�����p7�ý<�_���
�ݪ�$\�	�z)I��^Ȓ����$��,��z1M�����׋�jr=X�Ә��	�4�f1[M�n��4�fqN5��Y�W���|���K��טYʗF�,�K�o��/�d)_�d)_��ͷEA7ٟ����t�|��n�?KA7�������S�I�S���CtC�I=LA7�OP���(�f�݌NS���Q
�}��nFt1��ɢ+��fD�q�͈�᎛S�͈�ގ�]�7#�n;nFt�v܌�������/�܌~��nFg)�f��t3�
��*mFK?�ڵj���P�M�i�	���z��@е�zi2���������G�^�J��� �K3�$���4���C@Ϫ���#@/ͣ=X|��yY���4�vwQ���<�K�!�4�vQ���<��g��l��=
���s����yKvL?ͣ��з�.=��<����@?ͣ��oP�摏=�|������~���<E݋�(�^\�MA�v٦�{���N���,K�"{u�#�_���%CH��s��Me����/Me��/�̲9��`�#^�V6�|�_�M&��nq0M'?�.Ǭt\z��VR�G,�թ�_O8hg'��}��t�?�]���)���*"������2����x����_�e�V7t�gmEC'���9h�Y*�֙\Xz�Zᐣ��{u��W8�^n���E����![��+z��"*��{~�UT�h���,�2����~�^��.����P�Ϫ���cW��/t���^�/���3�B�_����€_����̇��ͼ[d�j6{ ����=Vu�����n�9ߚ�q�-2��\�.g>��zl�����#sr�����#3������#�s�����#��p���l�U��#�p:<$����:<$��l���C2����Kt�󑹛�bHx>2��S	�G�h�)���#[7�y�6sU�U�a3��X
y>��t��=�:�m��y��m֤'���a�3}}��6cRG��a�/}�}��~ɼx��6W�*<�6�m��M�
[͒^�y��β�c��6K�BG���2�a��n�&�u��m�������˔��M�$P���4�%��f_44�?�p?��)�#�$��s8K���.��7E��h�!
�O8�eH�_�3�P2?尝IR�G�s��$ɀ�8l����� �4���a�$}��/�m��>�ۙT�C�/VZ~�G�$�Y���i��1�c��Y��b�'�2��)��7,��o�X���gN�4�s���
��Q����_r�N"��_q��Go�k��9Tt�_ᰝCMy�
��V����k�SHm���V�t>���͐��Q;��(0��IC���i��3�.�G��Gm������,CJ�_8l�t�_9��H��5
g:���U����
Jc�1��Hc�R��~��i~}��h�}�Ͽ��4?��cc�X�D�f�
��ّ����ir}J�8m�B����Q���+G�j#�L�os�2�r�Gmn4���t��q4�;J����Ѱ�G�Ź�9��tgcE���ec	��;��������H���Q��G�U4�?�}D�C���4�e�G���O8�}��,��U:$U�?�h�����tm���v������M>�H�����S~��ɯl!����'�<�:ۺ<޻�;z��ld
�ˣم��h�!�e�f�{�ۣ��ҿ?m����������ލ;�遮ܙ��XG���=�lO�;������F�9���v��q�?��S�c�q:��?�>��ޟ�g�F�S��pV=:��c��h��=<�>o�fv������9�pw����hv��c��{��O=��3�~����.>�򕫟���׮�^�qs����{�����Kw�8����̿:����7�o�ߝ�?���k�^����w>|-�(��?PK�yVS����#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�PK�yVS6uM�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���ڿPK�yVS���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��PK�yVSi����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����滿+�PK�yVS�rs��&pip/_vendor/chardet/sbcharsetprober.py�Xmo�H�ί()ZA�X�ɞ&sY!&AG �ewrќe�Zi�L����i��Gt�4��]U]�OU��C7�]o@�^��m��;��wh�*g4Y2*��+�#}F<��¥i�_�
q�-]2M>���R�R��I�\s�ݲW&�)�s�%�A?`:��5��j�s5�A��j-U���Q���S��̧�&�X|�UF�z����j�s�h6[QJnQ[ڐF,d��%h�g쫅�W8!zp�=r�P|E?4Ԥ%=n�R1�x��?WHs/���J�
>S����cʹ~��_i##�܀�y��Oir�!�W���9���4S�0s��`J}��cSx�1�	�=��ܐ��,\�\�5��SE�+!>v�Wb��m~�Ѕ��^K%�a+�\m�G�׆�JoH \*�J]���'�b�~�@����(d�H�!��{or?�N�=x��ۣQ{0y�
Z��p"��ւC0�Rn�7P�Q��^�7y2�w{��=Sw8�6=�G�^g�o��q:z�m�e,s�qf���.�C�J“(��01�	�
���i�2��c�*�\d�z�
,b{��s�W�s
��ӛ���g!����oU�Yu�l��
^B0{��!�+�Tu���6�m�6/Z��ϭO��t���>dnO��Je�P4���:Bg
,pW���Z���J�g��J�:83���,�V�>��!;HɅT�:b,�'u��G����|)�_�TƸ�f�Y��*Y��Z�j9Q�^�>���Lj<����
��8����h�H�pV��O9��EU�Yυ��!`��91������qC�sG0���'��b�tgLW��#��pÐ
1J2����7��Ǿ�{���_>'�7�=N��w&�#{|?�߂�ռ�L�oZ��}�_ļ�ޤ��Ig:��7�/�1��k#k^Vb:���q8����B&�u�CS��e�u��MJ9I�\d�R�'��k︥NF칵}�|LJ+I(����GS�@���؀?�N��k���!���h} ?3Od��2�;`э��7�$E���h������sHZ��:�NJd�s�!��xQ���Zj$?�ޛ�,��d��k�aE#*�|H�}0ƙ��{�W�ё�+�=�����򸛞��M}��Z��V��`3ga!�r�lsf�X�0�'�.�	���SB���{�c�o&n�2�ԛ�����(�B�]�L1��He��r0������(����Q�L�ǔ�rmU�2R@�!]�{
]���+��/��@TO�?p8pސ�!��a��`�P�Of-a�Z�I9}�'oB�2"f{_��V�������id{[����{��o9�]��-��1��<�V�iV�wM	��i�8iY����
���3����U��a)?=��N�=q��[{�����c�K��������f�l��O�D�Y5p6�	�'M��ZA��`2��ġ��L�a�4#y:Ro�;�@[��+dž6g� \�@c뒙�ʬ&'�D��`\p,�X�p��S�}��+���c�:��2l��H�$l/qNjz>��Sֿb�9P ��.�v�F��ºS�2�\?6�]b�s�$N2����,��*�3��R�ux�h�q�hfyrոy�Mr����ي�������ӗ����/��[�7���]{(�%�X菧?t|��J_H_�aX6&�5�Wo���5����(TD�S�H�^:���9���芒)$�Y�!h�K���g���8L�׹-Ѻ�'vg��]fP!l���.��>�+�TM3�Nk�ei�Ǖ>xd�8�pB.��>�E�Z��0��Oa�T�GpL����"Pߓ[�g��y�w�h$NoR����DZjG����3f�.`��T=��p)��"����{��‡�j=�S����T����c0�8��Ԋc�v�;H��S%�m�P��zjLM��ZV;E	f��Yi|?�F��‹�Z��=㼠�ڪ�k�B;=�E�۬f11�|�r�fU�PK�yVS�U�Z��&pip/_vendor/chardet/sbcsgroupprober.py�W]o�8}ﯸR�J�-u�3�>MKT
(U�j�Ā�#�1�~��PSxZK���s�|}���5�g�K��t}���^녎�^^\�`ʩ��D$,���8	M��cF�D,��8	�Lin(ↇF*
!Z�X#��0b�|�c9���h�w��!�sl�fi"Bf�L4>�\���ԗ*�g�G4Ze�����X�LM
UZWt{sS�A�5�<+��㚫��HZ21J�R�W�W?�C����E<QbF�
I����$��+��X�s�o��"AHi,F�����XqNZ���?�J�������#S�X�)�g2��J��ڰW3�N�swH�
=�+�泥X�P'��4�{z�I�u�/�'	�,��έm[~��m���V V+U�����s�x�W�\j�Y;��M��$���8��t��G#N���4����ڽ��wzkx^�;x�,J�S8G�y,��K�
����Zmh4�n��[��A��}z�yԠ~���a��Q�{�SCq9_��&�P�?S<�L"�h&b�����j8G4e�2�]�
��Ϊa,�I/T6	} 1�D�*-����ܫ.P6���+�Z���b�G��Pc@?�R�*5�6V�ݛ�z���N4�sl��}<�񹼸+4M�x[&J��#�%���‰�ͳ=�g'�ʔ�_����^I,f�d���K�F<^W\����������F7x�=:��}����c���w�]��-���d���_���8/��m�o�'[`y�%�-����4=�P��-�4�mn���[��)ض}����j�o��z����o����}g��jlr���ޙp��V��s;��gj�.EIu;x�D)�����v�ݫ�I����W�G0z/��.��Q�O���E2�ysex�TE�\\�1Ӛ�f����~�a �0#>� �AP�<�v���U�L���t�)�_����Ro��r���Gb�m�Z��zb�y%6b��{?�i��8�p���������2.���n�NILY�B>�[h��M,4)��|`/���d#�o�����xbJ�5\� �A��++{�+��߯J�{t<4�`�x>��ݵ�6�`ۼJey�B���%�&�iTh�*�e�ЋlB�A"��t#�Q��
������n�A�<g�"�bpgޠ~��֒��B�aa����QX�3�u�F<d�Q�Җ����&���y.����Z+
���O�'ܫ�ǯz���D�c�D��/���L�3Tw��A��ĉ����	�%?g���Oe�u㗚�ܺ�&3��‚M�e����-#�H.���&W;h�bc�K�ƍb���Tۑ�2�=��	�gO�%q�8�[�����7��g��Ӽ�����(�7��PK�yVS֑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��PK�yVSNjƃw
�0(pip/_vendor/chardet/universaldetector.py�Zms���_1��������q��69�T��]�,�i�%;��������̾3��KR��;�=3��t���v�~��^�����Y��G�����
�]b.<�e�3!٥��p]��z�#��$ٔ��	��9 �	]O�d�����̟�� �}J�^q�Z.#O8v(|O�g����ٵ�N��O�d�$nNe$k��T��UϏX��hB���b���n�V�.ypϧz'�baUyt�7�]���<KVgXa�B�]�Å�)��b��lקq?ݯ�P� ����֤�Y�9��,|��߲�1�X��B�������~��?�5���)�K�
y�����oY�Kl���0�u4q��p�'9�%[�;��T١�ⅰ��J�o���x�ZV3�-�X�^Y�i�0�����5sa� ᴌ*�v:e�Sb0��@l���&�E��"�	�e��W�Cv��>��ܜ���ނ��(�%����]���p�lߜ��Y��~��w��~{0`��vʮOo������
������-��DŤL��S� r�C�[�Ro��+�@w��=�����2�Z?Ɇ����~��)�-3�a�=��ܰ.�d��!*��^5Ad{w.L0{G� ��~Pcg������V�٨7�M�nx��a��#����ŋ��4r9T�Ag���h�)�\$x��kK��.�� W"���8PcPl$5�DŽ[`�`�:88�#8MpR愈���Gy.֫�P�Q] ��\�S������̦
��S��F���Ԗ���rp7�e�lG&�\�I��O�``5V��V���@1�9F<|O#�j$f�^����*
!B��z�7��9��\cąI�h�+��,m����Y$�w��đ��_��6�-�ă�A��T�'?�<Л������
bx�����=.�,K;&�f��Pt)ioX���ుgq��g<�^�&U��^���xic��P�s�7�\B�
�D��LL��K��$\+yA�hɖ���$��<{gP�Q�ƚq>�J�G�5vTv\_��V
��.#7<Hu��������ᇛ���U��
��P���?��>
ۣ���}>J���[��\	�W'��>}Ө���|��ۃ���ύ����ף��c��8�?�⻃��]�^��׊�~�͛W?ԛ�V�(��� ��֫V�VPE�d�CcëCs����}ߗ��1�)1����C���>��q���7�9S>c��hT�ܝ�Pwx��Laֻ"�Y��^���5����H�}���4D?})�h�6rO��,v�#�c�<*�G��LL
�Ҍ�9U`<��D�l�)tZ�<=��:y6b}tT�wa�у�4�6x$Hͤ_�X�	��CUx�%����IX�ab;wq�#�M%�[�MZLם��@��{���k���p���箙���T��:k*P�� A�4��G�i#�%W5x��S߉��Xn�h�[~�$P''=�X%�r�kX
�rcW����c�r����˖4��0�,T�������ᗓJ%3�lk؝0`U�W	!QI�c�(�$'�O����.��`���;��HܑwG��S�+G%I���p�Bd�ȧ�����H�_��O�����xLb�[���,8y?���nēP/���T�&�$"E��HF�骮�q�2�k!���T�'((��H��������%�����x�B�u�6��='9��'�}��:����r��E�BˢPH�"�� /,5����"p���p{J�0"�7�o���[�Q��)I�˽���vp)<� e�nI��$#��XKH��2�h�D ��q(p�<�M��%Z)��.�ZL�hC}s�$j���R�(S\�!���.6�U�9ѽq���v�)0C~�	K�gUwB���=k�����Y����t�
�P�B���/��I�)v���#��ʷ9w�l����֨��;S�l�������tX��
���w�BQ%���u�M��5y�����'b��k���[��O*�0��e|��h�������/k�#�"����L:��:X��e�u�$������l�~�����I��JKZ;ZS��YK��(_۫�V���o���h)��|p�KW��I@���EbA(��������\KY��#r�)[�$��7�t*9.�7��S��*�yĠ�,�(vB��ѩ�{�{���TILm��F�V�6'�2�B�.�57�s}"�?#R��,�5��"�Ĩ��K�Hp�j�L�[�T榿?~�j矍���Oq�%�ۋ?���Gn����eW�����<�R�muI�`ـ5:bV�O�H4>��I��j'�a�]+��YO���r�<�ܜ��Pj%�k5Z��0W�q�G�S.�Ҩ���ʘ��E6���L��Yḯ̬b<�)k�Z>�82Ƅ��T
`�M�����չ��_���-�3"�>�ۺ��'��<
u�=�f��GO��gO����x�.G^I���V-�pU��X���<�;S$�f����IZᩯ[[:�u�J�U�I��:l�N>
��u���-'��P(���J]gR��|Z���@W�;Ҕ�Ъ��{�ݖ��pZ-��_��1��~��h<��da4
�?.'t?A�Hnټ��'.�д����v��d>e8�-]m"—
Y�O����dj$����~����
�mHK4�?~�c�:��_�Go��,{�B�V-�pU������oe�'������.�\�>�)֣�:%)W��Ůt7�*Lz&��;c�ڸ�zt�V>�U������n�)� �W�X���މ�±v|���,Zi��ٌ�S!�`�h�D���$�e�<	���;�/8��kiR�8�q��3��-p��g�)�!��J�&>}�g��^$`��N������l<��,��w������|ͫ��gj�w$��.�̦8B�Х�>��
:�=u��4���p��-!�|���qk�c���F푐\-��X��j�e�S󒇛W�����"�6�2z��ב��a5�Й�<������$���%oA��#�W�&��ڦ��w{�S�2
�HM��	��5��=t�'/̚�+��
6��)�l)b��*�1�5�!�E�߼gߜ�e�
БjF�6�^#'��}h�ƿ���ȫ�w�L8�|7y�����h��3�X�!)noWJjV���=H_��%=�~��O:�|~���V�)t9�Ɋ��|�!�q��"5� ���ڴrֹ�n�f��=�ї��#���3�����{�<p�Y�FvM��&z,���t����w��MC����FOF�x��y	;�t&ǒr��y�5�G�['�Q��� k�Vv�;ɾ�E4�N�
�s��M�?����^Aw�$F�DKc=WO!��TA�v]��PK�yVS���=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�PK�yVS�l���pip/_vendor/chardet/version.pyM�=k�@D���5���E*C ��H�@Ҋ���-����D�>�8�rf^��Zk>��4���)� iXQ��%ȴ"s����3.��$���sF�0x�#W3��-Ջ�pm�[V���7
��
g��8cNԪO��'R<�+��H��0G���n֦�n]�{�;wtGk���?^�^�������wnw0�PK�yVS��2#pip/_vendor/chardet/cli/__init__.py�PK�yVSpW��
%pip/_vendor/chardet/cli/chardetect.py�VMo�8��W\�vm�	Ћv��Q��
��C�
-Q6�H*���)�rb�����̛�G.������n+�-8~/,h%@h�P�F@���W�i���VH�p�t���*u%��F���y�5"ˢ�y喛`V��cҋFC_�n��`'U�wvuq��?�J�jY�ޱ�������/�/ػ(�X��cSg��WK�nYbLRu������PX-��ȏEݻވ����V7�E�^"�T�T�VK�DJD�H'o��q��t�X1~۽v�dNJ��6�6nWั\gmY�[s\r���)zG��	��|��'>QU��L[_*䂮�F*a��x+�����O�F�_��#���fX�+�����k���r@�h�7%�FZG���PO��[�dp�P���
�E�3Hָ}'�%)�3B��N�9,��g���,��>�4�qf�a
zy�K2���ՈI(Xt�W~8�ùw����t��Y-D�l�
�-��ս��Xh���v.��Խ���6�q��n�=�V�}��]��T����l�gzV�4<�g���!\V6ڊ!@#l�8��g�5@�(D���uK��0�D<�:ю�L�%�r�P��tD�7�h��M����)�ǧ��3LC�]B�/O`-�B��g:l��Ec�iQ�²#�ҡ�Z.U����<볿P��,��mI�}�q�Թ �H(�ǖ���.��f"�>
�6-^��Ͷ������Z�^�%K������(��~s���݁�Tj�=�W��>�z�(�7�'6�����T��4�+�e���3���L����y��|;]�1�Hg^1^U��n��&>_][�ty����bO��s�������i)�<��+�c�e�xK_q��O<�#�8��f���fc�W���J��n�}�0��u_��ܾB�j5|1V���<�F�:0X����Mj�>;KӰ3E��38���.�&ͮI�i��fsy���ܹ}�K��$������+E��]�pO$��A4{W�����]���n'Q�x8�|K��s�puڃ���7��^
h�^�&\�5/~Ž+�+qI.��=�Z��7�X�ʇ$cU���U�����2Y�W�<��(H��"�z)L��PK�yVS(pip/_vendor/chardet/metadata/__init__.pyPK�mWzg�C��K)pip/_vendor/chardet/metadata/languages.py�\�S�����?|w���8q��7c��q�Tj��i�4W\�J��6`���xa��x�x�CK�� 4O3��?��%͌fAH�u�r�Q��N���t��:������䄾VFUz�7�;
�|�ICR�$��U��Y�Oe��̨2J2�!FT%&-&�(�	@�RBL�(Ѷ�.�ãmC
jK�RR:%1�$��a�D�ȡewPRHb��N������jih�Nq�C�gi�y���.q�+�i�IM�[�Ha2�x%�{Tvs,搎�.�%�(������;
�8A�DŽ�‰B��OV$:�R9�q1)
���aӽo��Vfk2���X�c��}훛�754$xV��=.Íb�2�����Ո��
dԫ�ʂ��/��[�Vb6�Z�nxJMË�o��GLQ*��NN�8���r;��<9Y�Q��2��A2�]���6~Ѽ��z��(�\����lmr2��k/�
Ű�����@���e����rXᦚK����H!�P��֮��v�U#�J���&BeT�(�ˤ+c/���E���A�&#Ev4P��"f�FY�8��LBB�����}E��Ha�ޚ�|&�ƑRy���UO��\~��i�e~,�#��w�?vK*�1��*L/~�H	Xg�JJ�Q��/r��z��pW� ���d���X����p7����7m)�g�9D	)��<��_K�U�U5O���.e�V��H�'Q/�	���b�2�{��,ٲW�4r��,w�a��E�y)�%9��k��o���^�$5�)Ob�NSK���ʃ��b�-6��
%����g��a�快)C{Ky��@c�dZ�F�e|,I���ۖ��}
�#����uE<��b���v˫h�$�Rc�CP���LhT�h'�Dj���%i9$rB#5e(	RK�MMM^q��b�ҫ������j�UB��<W'0��~n���H̏4��O�l���_/�����\�(�(n�����$���@�J�+����(.7I.�n���C�r���bKF�Tc$1�_޳u�[w����*�q.i�xb{Z��8��ԏ�R��+������1�cK.	N�2�*��&xp!�x�*jT9r<_��=��N����fb:����,����,P"@!��xH�AaL
\ ̀��6͠��0v��F�`{͌*A|A�*0�L���͟}ڲ"���>�H��͛�h����@���t5�߰�z�\����7���h�"?�ܹl��Ha�p�p�p�p�p�p�p�p�������PxVx^xQxYxUx]xS�
���»�‡��¯�#���H�h�X�xq�8V/�(�,�R<U�(�.�)�-N��=0v�x��8�܏�?��O^�����j�F�!��T�ڥ���L��IG���H��Cæ4��zEl0ڨ�`mC��`;�^ep4��5i������kغh]�F�k֚�.[W���5�5oݰnZ��[�m�u׺g=�Y��'��HH���3��zi��MZ��7��V�zk���[��֯�#���H�h�j�X�xn47���;��ȝΝ����Zh,s��F�o���
�Zȝ��W�G����?�|+����%���t
�l�m�c�B�lz�U�u�z�jtQlY�2ت �D�$`�W�������A�Z�Zn�Tm�Q"�P����)qx�k�����φ��=<N���|_�Ï�q�˜1����0>�a��~��g�1���i�q�O��������n��c�-�룀��>pÒl�8,�|���j��kS�0£�
!�|k�6��x��~�(�\�hb���Ǹ��Ci"�3_3M�F���k�_���E|�N���Zw�jF��-~���};��A|S�_����nck��������|m�153k�5ߙ���G���#�ËGG�-_][_<a>2�O̧��'O�p:�I�9e�7/��K�9cΚs�e�yռf^7�͛��-�yǼk�3�y�<i�2O�A������0�7��,�<C|�yw�u��K
�G������k���:XN�u�I���A}Tn
ء�=�1_G�Q�ۨ�"{�^?�w#X�L���a�	F/�$c�	�D���WR�m���ObF��+�j<8:vۺ�M߾c�.��n�V���˯�t���M�q�{���UDh=��[�qԛa�+�"�2�D��pF�k'L��AS��ʞ�y|?�/�[pi�x��x
�rl+x�NQ��R��W߬��Du)�:�1�4�i��6�Lȼ*�<�]ǴE��QƸ���Q�;���a%wկW��EV��ʋvՖc��;v�n��4�����nJ�%Q_�;T2=�:�_9�U0Sᇽ2ǣ�⃸���oJ
��C/�_a�S�B>����}Wov(��
�~:���X���$����:c
_�7�]|��g�;��8���<�����g���'W���Ti[	q|��6$� ����6cJ�e�!�Y���Q\B�K1����T��2�G��暐7�R�G�������T�|�B�b�R~:?�����/�������7�7���w�w�����g��u��]��Mŀ�Y�6��%�����-�t*Ȭ���V|[���!�O`l��Κy�z�ј����>��'!��8?c��a��!�(
�O���z{��q<�wƇ�=�.��:Kp\�/�ۭ
�-�W�Bf`)5t�&Y�t�N�Ԃ$Y

�r��ژ����$m{5N(J�1�E�,����U�j_��Ic�g3>�iWX�.��P!(���؞�>
��O��#�p��7�d�8��eW��SR*럢y��n��Ҵ5ܰ��YM�~Ƕ��ܦ-�'�<�m=�C�Y�~���;�i�"�����U��xn<��}�]V?N]R�3�%js�CU^�xa<�=�*6np��$yV,��`8�s�2�8�!�}��ه�8�3@a��z��}5Ž�;�s�~��˯��{�w{��e��Eذ����>�& ��~�
��O�hf�A懰.}�_M���6���,7y��ڲt�
G���O�%'ѐ��Uuk�[�ָ]p®8�8�8c�[M�In�)�]���4-����ܬ�HಧL�Zn|�e'���σVlW�E�v�-;!Ԗ]���l�nڋbo2c�>B��7��a�L������]uv�&+u�Kc�Q��1���><E��l���3�ƻ0S��Ǩ�w3c��1���yNQ�o�@k���ץH"��}�~1�H$E�S����Rnd�;҄a<��B�0��I;�;�/@67�o�6܅�ၝ>�į��U��:+��x�:��Q�7bz���nI
�CZ��z�я����>�>
:���ﳁ$mӏ�I\���lK
�&�h9fmb�U7���7�e��J�m��<x`T-)�
X�X.�
]��+ѬT�së`����-�]!:���֧�ɽ&��<�{<�s޴��rj(�c����VQ����ҩ��ǜ:J<�g����7�;���*)���r����y����R�#���B�9����߮����/Y�O��Ҿ���}��+-�/E�:�Iqz�8���8EA=c��C�?iX]��Q&��'z$zhTk	�\:��s�C�frN��tJ؜�i����IL%%�j_���}z��=�Ȣ�A�G~����#O%�Zj����nC8���Z&e)��/�0�����*[>W*�_6W��#W�3<x�ka�v?�ԝb������
 ���ؐv�7ɰ��������>�j�qGD&�ю�юm�hcD'�	��$�/D;E�	��&���%�$��m�h�v�h�v�h�D�!�,��v�hW�v�h׈v�h�D�A��D�E��D�C��D�G��D{@��D{D��D{B��D[ �3�='���$�+��&���%�F�,�~%�#$;L�#${�d���q�%�1�'�${�d!�S$;A��I�ɞ%�I�=G�S${�d/��E��D��$;C��$;����0e�>C�I�}hx���*���x�B%����u�n���b��U�tcU6�E��p�%�7�����R�3����_ST�~`�0��p���'�1����v}���"��W����=��Y���Ao������i=R(��VG<ma����1u.c��.$�A�jr3=�N=����â�ln�sJ@Z�a��5������!%%
�v���Ϊ�c���a�sj�=Sͳ��r�A���GeTBI�0d�	[�Q�_\p�#���,dzq�|���ci�#W��,��p$���ֳ���
��bcS����r��W�-�o�!($h��~!�����ԩ����`
�|�ۡ�S��b�l��9e����A�TԜ�ՆG����	J/��m�89�b	H`(s�z�~�����ol���jm�i���&���[r}r	h���;���h�~�iP-�L��5�N�q�ph�p�<�%��¦%'R(���.�<�.���4�	���&y^\�C,^��&Ō�m`ΝR�O7%��/TxP<�U�2��\�K���	Z�@J踡���g�AKz~[��P����t)q[-��'!;t��߮w~M�y~{����lw�����i�k�_�&1�~,�E?7�PK�yVS��kճ� pip/_vendor/colorama/__init__.pyM��j�@D{}�B
5�aKn]ĊMBR�����n��*���2� �0�y��ҏʗ���D�+FxF�@#��M�`�<A��� pK1Q��^��{s�3r�Y�Ǒ�1��5��>�/u�V�(v�~mv1&^���������0�z�$�ok�ñ*�qB'���,�4�D�a��m�6�nPK�yVSR٭���	pip/_vendor/colorama/ansi.py�V���8��+T5C-���$�Iq�̐0��&��Kc7X#{%���ߖ��T���{�n���"~��$�|�8U	��
����%����S��@R��!�L'~0[d�R�Z�m[��I���]
dU �p���(��F
���*#�`\1��H�	B|�8Me�ZܐD���xwϾ�bF���\�յ�
AF4�P��,�
���������^�m[�`jV�Y1�M-��B]�l�U��"x	P;����H%
�[��JP�bب����tZ��{g����YS�"���-lzMi��i?اܔq�U�G}�QJ%�����oeO�@�J��
Cƙ
Ö�t]�uETD\�K)�R�=��1�%DC|�}�gX�<�'�KE�ȩb�ڃN�7R�#8Q�ș�N�4ы����)d�Tbv�>�S�w�ꨵ��(�E������[�)����
%�t������;@�m@麌^�p�{�ŞΙ#�Z�]?�����<��O�B���cp㊡}$�珳�PG��|�8\�_�+�h�|	u\Q?͗%�����C7è����>�3�〔j�)�xrb�w�Ƶ�D�5��"fu�g�/�t:��2�Cp&��~x�V�S��/����&���)�]�:��2�Y%�Ov=hk�Dz��LS��<τ��c�J@��'ٺ�Gؘ������nez���[��WE�n�^�
(ze��9�R��^i�W�{U1^W���1���F4��^��5y�k�����^��&/xM^�~�\������i���4��u��:M�p�&K�N�KuH�Xhb�e"�����=��ᴌ�3�S�wı,��1��AԶ��1cȶejx����}P˗C�PK�yVS���q)#pip/_vendor/colorama/ansitowin32.py�Zms۸��_��?�J%���i�jRY��N��v�Mm�S��3E�0�z���]���ui=�_v�.�.��)O6i�\I��T�hL�h*#�!��G#rr}J��ӈf��(X,؀���tvy=#�0b��p��T���+������E��dDc�t�?����O��Zn"xh~NfF�9�%K�V�6�o�v�S�T])�B��Њ��<��K�ЗLȝ��9&�<�F����\���;�
I3��� �B��)��۔&	K=��3d_��z=��/�D(Q�,X*�~�3��0^�#Jd
qJh�bI���lȂ��F���R��c&��� *��y���I�9
%�=�w�H�ΜElI%��	�R�5��7��c$���q3�=g�aJ���ܜH`u����K��Lj
�x�R��R�B�`�$�{�#�b�*W$�k��'���D��؆P�y���u#߷Rc+_0fC@Dž;��K&q��a4�q1e2Kcb���Fڅc�79��.��yzƫR�D‚�Fv#Ο��<n�1�c�^~�B�jE:P+)q��s<q�q��Q��{�d��!���៏���?�=�6�9g"�C�:|����f�^B��U&��K�"���2�ɐ�0߸n0kC��o!u���Q�j�J}q��=��Ch������襃YM���UR@(�ۍBpuuڎ+��{z?}��M�>�g��of�=X���#SPF� :TEh<nɟ�H�c|�@�7�c)D�_Fwx�fEf�tS�x�v�S�#}�K���%��6agi��2��G�b87�b�a=��C��qq&��6��3Qs�4�H�~�o*��f`���X��+�:��V���-9(Z 5Ĝ?�lP���0!���s�h
U�i�V>�Ѕ	�v�R�	2$ɤ4,
5Hn��vT�ĉ%����"�d@u�ځF�S�w5�X��'�^��������?:����w�����{wt����}�8|����Q2��6�s��g��L��z�9΃w��{�c�S���%�!w�
��FH�u��k���=��p�Kp���\�X�	&�*�KtS�i^��5Dr�V�^�j��;X��2ի�[OV<� UQ&���%	�^p�ff�k���ĐYe��#�vG	�r�E0�t��,�0B�a��WFΗa�}ʣ�Vm1��g�������Ǥ˞c�-浐��h���O��,�G�>[���`�*V���t*$�3#�A�0�DU���%��,Fs@<6Z��t��ɍ�� �AH8�`M({�@�����R��U����˛ϙ(���֢oDUZ8QÅ�t�^�9W�pF1��ܪ����Y��Y�7y�a�r��p�2���r}��Ej��⑾�<Vq
Ͱ�"��oV��;��ſ&'��|+�V�/-�y5,��Q�\ ��������
d��p��g[�Q������̊�	�]#��[H�P���/J�s�Jp�L�:�X:���E�
(\@u�[ƌ͡�#��@��2ѻ���گ
N,o�X@�U�;��z�J�Bd��x��FI�4a�E)�W��M7h�B]�*�},ZU��b
�$��|k��,�p���P�;�4
��§���E�!h�u��&1��b�`%s�
��9��"T,7{W)8���L*�kH	9��g��֖�G����Ɵ\\�`��5>ŝ~С{ru����Q���!�N���O���>M.:��b�����b2�� ,ԁ�=ѯ��f����K���lvٮ�^w��]\|�m�﻽�2�r�ˬK�����f�`�0�_'!��]ڷg�7@�vO,��z��&�J
��W�f�X�U4H�N,x�%�J�N,%�%�ΞN8-�%f�+A�2��$V'���3���RY��<|����7=�#ޭ�I闹����MJ��M�.nR�5n�tr���M5�[�Ii׹���M
��M�nR�Un�G����䕹I�wi�qSSڼ�|��TO�-���)��Dk�����M
�%V#75'ߖ�unjH�-���!1�~�6����;��mk��5Mleϫw=�Cskϊ���l���ұr��"���i᭍yS�0@���W���iw���M��޺7 ���	��׾-~5 ���u���yt�9������σP�|��˙3=�ߣ�F� 8�ގ�U�m�=��K�ړT��,�p�CԪ�A�
��j�8�F{ǥ	�*i�_�T�7@��s�eG�pBR�'嘤)��b<GR#���kLI�>�Z��G$OG@=�H
j�j<����!�)����k�'��CG,־Փ��)re�]Y���
_l�r��1�?l���JAц�L�x����Tz�U�um��]�M��O=�U�i��E^�p
�`k�G(�n$0={g�^��2K"��>j���`A(2%*��q����B��*	��
#�Q�#0���o`��Qy�]n���#�]���+fW�-{a�� �|����u�.T�	�&�x���LO_E�hUk�~�.�"�3�9��@�h�)���\�zJ����Tm\ӸSX�z�����7��B��YМ�u_�Ď��ɳ��?�۷��P	�m�XJ�E��<+�-�L��1�!>v�1�@�QovmuI����!���G�d�&`��U|�bl�.C�Zi1$e�О��sҩ&�.��R��	��s< S��܇9�Es
7�0��^��ڛ����0�H��ܩ�)��>ޠ��P�vg|yh������	��@]1�WAlh;���F�?�5��R��X�<ë[���\�sp��T��᪓�E;���
�oP<�
�֋	j6��B	���к�2��$�)�M��.x�-�#ӆuP`�s^�P�6�Ê%�by` ��
�?l�5��Z�iy���L����/PK�yVSoEr�{"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�PK�yVS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�@�]�`�PK�yVS�(���&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��?PK�yVS]o�]Epip/_vendor/distlib/__init__.py�Q�N�0��+,��jl��c�IU���Ze��ڤr=����n��/����&7�\nl��}�����5'2�[�0���&�=������4M ��dh[́���{g!q�hBxv�k6�I�Z�Y&�;���$�-wZ	"D��*NV��a���o����-�@�)S7�*W�b\�4�Fj�E����`��Je�n[x2-Wf�:f�t6����j������4��CU���
Ia_�fE�(�4��Z�`��'nz����bo�
�|pЭ���bU�a�(�ó�kֆ�%e��1r�WOJw��F���T�F~dq7(��������H��������PK�yVS,ӽ`+�pip/_vendor/distlib/compat.py�}�v�F��=E/5^�[�L>���8�<юcy-9ɮ�a ���9ޜ����w���Gw��� igs��=�6ItWWWU�WW7����IV��U3;�������r]e7�F�#�������3�mVDkq��-Ch�2�ӢNє�������8/g�}T��E�*����7��V"��ʮWM	�n�4]�E����T�<=>yu~6��8>{u���go��Gh�7�ʅ�Ng�fU�ө�˲���u���t�����e�>U��T�뽽�Z�	�S?�^�.N��8�_N�������*�YDG�(����n�^Lī�Ha���Q
s�fŬ�||%�(����y�-���3����#Зi�^�5u�)�4��M�����lUd�ȴ̝$�Y�^`è3�L�̹O�׫,o��	m��lr\���uT����ߗ�6�^G�-uPd���,o[���:���?����OeVЇz�g�|L�-`yv�@�J�B���yU64�)}��P�O�Q3/�Eʤ�O���߀�^��\��X:H���I��ԣ#
�#���MT��d��e4!v�0-�Q0��8�0�UU���=�9L�'.a�hʼI^�����e
�}�楜����c/-��WQ���V�kX�y*{�����on�����I��J�F����1�"�i���V�-�|3�1�%p�R��]�?�[��2v~��U�"�?����⛗r��/�8��%k� ����4�r����r֤US��^�,Ն��v�u�v��,(����t��Q��Y�@	�Xd��#\��(�4�A��U��.�.�����t�]V�R��3�?�	|�˺1d|_�����<Z��$W���
&s5���/��`8C�M��7yy�-^�#�]�;�k��}њ�ws�U��b	�3�5�����n(�"wXDM<�ƺcH�0-l��Z��-��,�ñxb6�M�@H{{)pv�m��]�
|�������}WE˥�ˮ1�Y�����C�B[Lk�~B���K���T�:MlX�Z��T�;�g����6�|�2���]
vT��6ECd��F�5W>K�j��9�A�(|-hd�O�*��f±��Yxw0!هV!���^l����Vl:&�r�.@�Uv%�3E�B"+�4��8jR���)��;qr؁|�+�h���{��4M����L
�t��"z7����*�'���`4SQ� W�7/�ŧ�O�k�D ���������#"c���,,��GȇG�,Ʈ����4�4&Ѡ��2���lDR�&F���E���O��4P0
�/Og͢D�R��(�j�} ��O�GW-@M$h����Z���l�~i�׵��u
���g_|��HDwe�NJ�"JX�iua��^��U��_�K�̣B���
�!3�"�x&��K��et�g�<M0�2�ⵈ%s~��8����,Jy)82 ��9�4����"���xh�)��t$�� 7@�bm�����x��\������]V �#�[���l����f�>�����U��x��0�*��D���9r�򀯫k�.q�/ ����볷/��Wg"j���nOZ!��2 Au6�P�~��s &� ��b�W�_U�P�"���\�вb�>(�(�84ɣ�����w�������fM��1�̓�/`����")�<�k��\�w�!�GE/�^}b,�47�A�a��g�<�+��˧y�}�Nh+��N�_�F�=�%��#�8]\�Ip
 ��g��.����e0pU�r���o")Q��b�'7��iG�4P$���;>���}��$��f}�Y.}�HÛP���?����X�D�����<���a�$DD��;�`� �7(Rai���*Y}����h���������U��p�� ����C�G��_��99~v~��Q@c#�A��Co�j���ۖ�۴�fk\��x�
�f���"�������O�k���yߦMx�6�g+�F��H��j�`�pA=���sJ=���Nn��t?fe�5�~�kd",�Z>F5
��L��9HKu���!㓀��(�W@eq��
�� ��lU�Zwh^���&�\�p����?��(/`Z���7�&���������aIR"�H�o�r|��bz�����ճ��~xs�oOߜ<�"(�H�)�A�Lh:(�4�O�3���+h�Yv�����Bɏ��怞Ђ
Xy����CK���n��y�f�3��U�\E�j_���,�5��x��'�
r�����9�D��� $�E9�9�
+7Ȣ4��;g�W�~��������A�<�E�D�:X��+h�
�\�mc��4�?z��Gq]��p_�m�!�j~��o�w�ہ^�|+q��i]�s�V,��u���a=��h�<֓�F��D��[`��ڂ��"���C6���=U	~,�ܠ��g/(�����}JvfU$�Q'x��v�)¾��
���!w ���[bw�7(	/� ����
�~`�Ū�eR'�U�d�/�L��Ɣ���4���f:
�%��>�njw���i���4\- u [vs�cT��H�C��͌��ʭΧ21��� ^�c�eR����_���=|S�o�y\����nI8�L~H$^?��Z{���B}����
Ӭ��j?���"0t*h���Q	T��O����]�_����󌀽4Bg~����[�w[�W
tG�;]wYUd'��`D��`�AT��U!D��P6�3�*O���8F3�d$���RcD�Y� �0낙P��?K��#e<��G����Բ���߁_^��(�3��q���E����(�,#o
 HD��]V75����^C�mq*
LV��
[NA��a�$,���|�4��X�ey���j)	���D�̐�l�I�
b���d�e��U�JBa�*�aaޥR��1�aA�kp�B��QWٲ��l�'m90Y$���gsB/u�]��&>.qـ���ݜ�'���� !ئ��^�vx�:� %!�t9�P�
h�0h��Y����mv�.���������X�Kd)~��O؝��<̊ú�㶇�5c��:���i���R.�>D<�)~�<��`0���ZXϚ
��6��4}�+ƌ�:-����fq`"�Y���P�_q2���ٲ*^e
�an�$K� ��`Cc��1
n��z��R%J`͋y$Z':�f]n�q��$$�2��P�8"��-�
}�B�sd𮬧]��m/>!��qZ@�$Q!S�J�k�.W@2t)�v�"�nS-iH�M;i��a	�W�Y�N��9�
s�@�?ahB��$�� sHk�
u�c��i{�R�‡��LE��~��T]0^���_�(Iٲkk% ,�"�EQ��#��[�(��c��o�:�Z�$������0�FKe��ϖ/�Z���<���p��I�g��R��=�Z�[��+����P[~�j�yTGMS��KM��������]UP'���؝�k�/{F��؍2{<{�f�ū�v�GC�3HI���I��;3ĀX�*�|��y	�U�V=,W�r�c
ʘ`B[
��1 �n`>�L�yi�w:A�
�(40:��ͶȆ���`�!ɖj�E�7�ũ��!��8?/����0~���Ԗʚ��tѬ
#tҷ�����!)ܶ��+���lY�N���.����a�4Ʋ6�N�b��m)�h�*��zЭ�]�\)�!|�+<հ�ab�h�w�?��0��G��<�6���c]��i�P#`&Š���Q
�Ǻ������͟�&�6�z���l�5\d�n�m��_��Ae~@�&G'�XI'xpob4��P2�&�M�	5�`��$X}`@y���4�9/�!�bs�?t���5/(��CJ�Up��Z�{#�-�w8�v��d"��/�͵�X����(<���	��6���؋|�G�
��������M�H(���Ó&!/�d-�4�H[@���5j�����kc��c�t���↻�ޮ��{�ʜw��L+9'�m�9�`��O�Մjd'��Pty�fH�~ڠʸ���.�ɫ�0��}�;VJ�O����.$�!�-��}�-���$$/�!�$؁�;�$���O%��/o�"��v^���!�
�6'8�X�ؿ:�f������Z-M�U)��d�J���cpy4���~\�p^}2�0��>�@)�i~AYe7���G�.2�
��Nst
��0v
��h�c��\5���U_>i+6���E�"Q�<:|r�cwU�0�b��``在�DH=
����6���<�υ���qЬ.>��_���CR�?����5�Ё	0�A�ܵ�`-[��%y��g̛�]Fz���J���V�3R���5��\�m�Q�mr�"�l�媊S��q�b��*�p}��{��(n70�mIp�u��06��Je����2��2L@�Htѻl�ZP
�>���`lr�	�L4� ��?=��$yV7\A��,š�L��0V�S�H��4l옦�=�L� \�YK�/��]�3<�V��YnGc!U!�����O�"�gП���'�zUj���:����s@#q����aqo��G�5
	���Gp�2.ڪSd5�m4�z���H�2{���'[�/9����S[}&�1{���l�\n!����NQ�� mԟ2��Y�`H9������}��:cJ��/t6m]:�����r���tZVӺ)����:3�?�Z��`^����6�.;q��z8��YV$S����]����R���&:�'�,�Lii�(���G�Z����G�Xϡ@,W�Z����������F�êc��@�����x}Bߔ?�9�g�-����{D�5B��H/����}��d�V�cw��l��J�����a�Us<kH�*kC`ggE�aLZ�'D��f�e�^I���]LIÒ���I�2�\�@��2�%���܉�N��]�������`��y��JB�������-�v�pYy��xwD6��"r$�2Pb�c��n������e�V�zK�e���4���~S䀻1�%�PqY��y�����~����`�v9���%5�'04�p����M?�Hb�-Ӈ����)7l�ыj��a�˧G��kOm��¡��C�}��>�m�@��F=�7`SOk�..i���C����]�=�3���~,�1F�b4�/���,�RP�G�ǃ/�?F��?���C'���W*���/v7���i��	^�<��K�[�HԞЃW���.�^������Y�y��DˏH@t`}��m�נe�#VYw"Ti�Bܡq^ҙݩ��{H,W��uNN9��0Cw`8���C��۔�n���%e��[�0���*�x+�O�0&z�7o�β�V���yX�CﴢR?>�ۖST9,��ی)kC[?A�5v��-[��5���E��0�x��Ԃ�Y�Z�y;��J�M
� �ų-�����=��q������D�HP��uG��D_�l�3��`��UZw�I�B��(�U���L�}�#oQ���U�a�RR�[�P��08��7�%*���a�-����1����9#�۬�ơ��]p�"[��
ַx��	�#�n���4�h��Y0�z�&g�b��[�F`̅U\g@��wYzo�+0#G��W��R��u�Y�<��<j8^�ru�g1evb#�N[8|d�N#��C<��Yږ���jLXr�R˲X��CZ�"e���VDG�pd"�
�O��)BK~_eMZ+2՜�K�<e�D�b��Ƙ|
Mb``<t�n�7��kSN�MF's-
�k���ZH�ٵ�r�v�ω(���f߁zN�Z4�<����b͠��{�c~��
D�2u�t����j��(���0<�M�Tm�H�đ	MT��-���kv�I�:@`%��
@��J�pa��FW���
}�	A��1�����Jk'�zXz�H�n��^����V���,.ji��q�WK�X]�j�3��g��2:��ŢPMԱ��[�����i�>�F����2���u@9U�4�âq~�8�	V�
'%u�<���V �09]�Ў�m+@��#��d5A�I�e�L����lZRفf=߈'�u���ݎ��l�<|�D�df:Ն����/#�w����;#e��ēX�E+C�Ru�xh��TH��Sg5<V�OkPY�/��<i$�vD
�y7�~���E��V\.�>z_��-b|����dϱ3�qH �e�w�f5GK�Ë�T�O�,��0/��]c����\�DŽ�Z�x����?rY����L��OQqS���A/W��	lR�'�#�h�"*�K1�U�Lrf��s���a)�kk����-��0C+�ѝ I�"�N��/ںk��)S_�V�n�B�g���E��×l�k�y�'�iQ�,3�.eM��d?��P����7颼Kͭ؈�� �^��o,��GR�n��a�M,kM*���ݩ��DV����1�ƫH%�B��IL�e��0u�4�]e������*0p�/_1�������������
�d��G`Kz�jR��S�)/���<�G�<�b���z�#A���D<
�A�A�7�w���Z/xM>^�1G��zu3�g#S����kŧ�ڳ6�p�v6�l`��N�	)C�i���\z�L}l�׿'�6/�&�NJ}"�퐎=� 0N��]옑���߿W���NT�	�"��q�x�c�L�G���O�x�H���}�*H_�8���Պ�h��\?����|:��W�&�r�w$�樄�C0�tV�^e
�묈�j��<Y��G�J��a�7s��aR�t%����b����t7�=�L�kd��
*��6K��|Y��|�u�q+Z�msL}�#�R����m��LJx�Q��Oqq���
�x�;���%	;i� ��)Z�ZN����x}�b��>q"Z� ۛ�8T���{��f�����3�R�M�7�P�(ov�%_?�қUUmr���u&G9�:���f6�"O��5�Ӓru�S
^PB�50�r��;M�4qP����\�yj_�%�Gq���
��[s��tun�5�f�7�����#�	�oB���8ަ�5U���#�U��._�9�v,^�|19���ps��=�lɔII�Ƥ�8�n�oPG�:���i>���+Gu�`{�(�r?%�}*	���Ak-QQPu�5b�9�&o!W�{�	��!��ڨ�b[�������x��ݡ�D�uU�v�j�j2�;���Wn3��o%�PG@��B��#�].��X�hϯ��8��:Zө<}g��1֘�E5�Pr�h�l��O�l,�#����KQ&���dm�UsʗCb
M8gQ˟h�q��
o�T�l��[��p���d��t�����{}k��ě�$u�A�J�Z�<��)�ˣZI
���Ǘ�Wm��ZŶ�9�Y>:��ɶn�CH,9/�(��^η`�1h֯�\�?���<�GnQ��ϩ�V���`�浔�̽ȑ�N+
�(�B�U;2�,�*�����Dm��]iI�l1�T0V�>��͘?�;��8��e���F�+��{��$�K�P·LF�K�Y~��C[�19��*�Uw���n$jw��+�rz|x�ΰBs^�ɦYm�L�/�j����>��5�i��Y|I��=��t������t�T�L
�NͳĢ����V0�x�!�<��mM���Ng��;Z����6����1��	��u�5 �Nt!W�[ж�q�yK�v���cf^�/��1�//O_�)k�6}>@3�/��t��v�+ӼV�I%ن�ҁNb�%�ݑH�o0�J�I���Mk5���hO�?qa"w�3p���r�6�o�n��0��	�)���5���X�ٓ���[�P��V.� ��3��YaF�I�V�Kr�
�m�pd3����^T��ԣ��� cQl	�L��#ڛ��\��z�Qj�Hm��u���/��tT7)ྡ��5rG!lĂ[k\Fۑ�6Q\?'�x���0sF<���u�a�a?6�-��7v?Wh��8[^&��$�x�
zѲX�M?E4M�����gzd�l���
���Kf�@<R������P���݊C�,u�xLL�{�zr'G��ߢ�:AZw��)i��6�^M���܉<���Sʕׂ&��&K[���6T<�4�W+Q=�ޝ=jQ��^�ulB��lǓ���#y��y<�*y���N�iS;���+�F�$	4>c'OBg��*Dx�Q�r)T���c5�=U�Lh ׸�o��߿T颷�~��z�X��Pa�}Ԋk�&"�l����L|�P=	/Ǯ���%��W#�r��~?�5,n��^΍��X|U�u۾QՒ�����u�}�q��J�.(�uz�y���m~���:g����*ӛ`���P��+�.tqT�����[�	�S7ؼ۬��T���!��'W����*Fh#���t�i�,:�ҮΕ%�z��1O��j4�47��)��p;|;ܲ�\s��D9���v��3�:/��"$��h���V��i#߱8�jtj��c���8���a��CnUf�"��ٮG��W�R�w��U47S�ܿoN�,=i&i^,�G��nR��L�Ӿ٬���n>��j� ����w� "5�'V6��@ˑI�ˣt⸷f�>�6w�"��
����̞�w�$Y�iONNޛF��"+�Ԅ��M����ˆmΑ;=���g|e�ҎA[Lw�5��[/��95���=VF�eE͙����V�R�0f,�SG㶳W%��۱�D
cD=�fU�eO8�)��5��|�̧-�ó�m��%�eU�5��Nި�"0z�
���ӟW��n�x���ɜ0�b��D'��z������g��;9J�v�y�Y�X��^WA6kw�&�>.˨�j̾�@�[Ϟ�+B�Z�������_۽�6�>@���.���)�:��B�d;�E�&�Ȥ�-C}���>���Kbޯ�֥|�n���GV�p=�N�1��s5t{Of}�Ɉᑥ���U�Z�is@��ʊ�JŶ����ͅߜT%�7u���m>f

��`�ͽ���@}��&k2FR��C��(�$��]���77Xq�WS�Ƣ:���([D�/Kd���>}~���������ŗ�ߦW���/�W'_�e����z�����廽�"Su���P��n��+zE_|�.c��;*�E���t�z�5����J �Ბ���Q�$�n:9��̲V�Oʽ�5�ǒn6����"),�㣁:�ȁ���$P�<r?<t�@�|�-PSΖ������jY%�V�X�M\0��k�"�&�Znb���C���U�]4�G��9�ۗ��NIM]�C��G��,��D1/�D�Gq���~���w�ch��<��
�g��-�'Y��'G)o?�fmk�;8��DCs����}C���^8�d3�b�H@:�*na�ku/.�BT6'4<�E)��ݩg�l��%�l�
�_��%���f8j�'H$)75�8
���W�������������ܙ���L�?�绰��v��D�^�{h�*oD4@˶Ay�f���U���T��Z��{�⟽r�����pϭ���ޕM��y��%�A��.Qz�߲F	�o�H�?a��p����u����j�`��:���c�*�E�����V�N|�W��/�g���W�~vqq��s��?��#^����cΫOFG��|V�����w�����<��g�p���7������C��s�����.�^?\9Ý��tÀ�'�|HH�ʔе�������8��U��-��xvCM�O�_�d�w�Xd7s��QѨ�+j
�ɋ^蠏I���B;��m�b�D�)?�x�:����}��9&n�'{�u�ԁZ?�(�.���-����n��h|y%-�Z޾��2!C72���ƒ�R7'�	��ᆡS�@y�	��M��Κ��9�)��6%�
���8�_Ix�c�/{��f/SX�K��1�b��i�b[���l?
u{��n:D�یEs-�E��J�/w�b���;�K�������y�程�n��)��/M�)�,�� T���ԛS�o(�l|�!�,?���Z{���!P�mʸ�CW��} �B}'G�����-�ԍw/e��irdN;u��E���N�s�t��F|P
��W�_#��.x�;y�*��&hɷ��>��6�_��kD2&��Ǽ����+Q��0��3)׿�q�6��o�e�
3˰o�m;~�"�����۷{���-H|0v�<"�1e���6�E�mT���3D�p�CQ�١X�gy�C@%��=��\��J�y"4V��.p7��Pj3�w[g��FJww9�*`{���>�d��
	�YJd'YA�����
�.N�����]znj����W�c��nr@�E����v��a��QNG�z�P�Ko��4���.�gT��Z��:s澈�9���mi�۝��n���N*;>��D��^��l��n7�an�N�W����rx���_=��n�����������
J�O�+'~���~M��*�Z$o+�I[��Я�Z7K�醱�i� |5Mº��^��h���\Ԕ���O~�o�����-�\���H���r�)��r3�Q� �[v��ktg���ƌ+F���]. ����#k�b���cj��(�غ/��U��{��}�mo���ʝ��+ߤ�z��aP��쒃��UO�0��~�k+q=S�]w�.�Z���_-������kG���f����Y�W��7ܨ���X!@f�#!^�E�7}Z���PK�yVS�@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+@��PK�yVS2�H��Qpip/_vendor/distlib/index.py�\y��6���?�^C��Z>��l/�q:�c��فǨRI�*�U����]���>��HJ�Q�;Xd��[%����H�8��\$e�����������YY�U��j>��'�%���^��̪-^d�,j�
]
����^o�B�)�6VR|[6E��p#��1T�U�jt�_%�N�`��R�x���囫H�".R�쇗o_?�㻷?�~C��,�U��b��<[��y�ـ����]�mt����U��D��{-w�:��V��3�k���Q2&���-?8�Yi�^)U*�S��v�š�g�&rO��j
� 8d_'宊�k~���?�u�<m�;�$�j.^�md��^���T�5g\FW��*V���U��颬dA`jH��,�̎O�r��=�i��o����*?��Έ���y���?�"���bvv��շO߽x�x��A�`�uU_<|X�,*Նo���뫧/��v��Y��,�*N��|���e�g�����o�Y-Lc%+%k�S
=�LO�QWa���r)n3����z>�T�A�����͊5Y��*8o������w�b�.x�:�L��]�{` �r-x���"�e���\._���$�d�m�8�j��Bj�����j�#0��^���b$"�|-�j_�$[g254S�5�qAd���4���$Z�{�1�
�pz��#�_`ί�M�����E���B�L搙�� ������1���u8t�w`���C�p/��~�ka6d�Y����c=]*&n�fd�
����u۵��@<ct�Ie'�bk�,( I��u���"�L7�T�C��T
^�n���:J�M��9H�
f"�E��}r�w �FY�IA�&��tDAQ�tx�dN}�T�����8�Gj�h�+����$@0������K% �3�$�\/�8��P�Kp����d�ҲїD��x�B_���M���2���4������k�	r=zk��o<3��˞e�^��T	��n��r���Ij�d�����vb1e��*NX����Y\w��BIݨ�Z0Ӗc�a&�&mKvi��@�G�-�v�����Z{'�=}zx~4!�p�f��Ld\LUVMkىr���T���9~9�7��`�[.9�AK�ӽ6���]��M�6'�//�ÿҚT�eX30�w4E��a�����=�e������;;�!�F��μ�CgY[���<]�o���#�ײ���x�kL_�$=Oޝ�}Q�$�4f�&�&m�ID��5]J��W��k�-NȹO�Pн�V�-����3jLL~�l��JʂX5��eƝK��m���۝���\#_�.��t��i��G�� X�+������ ��İ��E��x$R�8Ŭ���nFt�zT���DL�a��Y�
���&Ƅ&�H�⃖ѴF�L�u�D�&Fnj�Ԓ��M��::��HԽ�O�����e���������q㰛&iZ�.�f��䨜k�F�:���m[�E4���
N�&��
(��V��
AvY�Șp{4�2	�'���t��x����5�D�o��)�d���}�9SƋBBB���>
�(C:L�������B���}���(0��g��A���H�B�V��$�x�9��p�2�&M�)
�^.��]����Yb/�P��@]K5�4��,$�\?qI�AK��k�6�����h�47�lW�Hb6P���\ ����=e�YupJ�ȩ�
8T5ځ�>�#�?-��Y%���h�Q3����\��f��ߪf`�k�F�SH�C�̦���xS34$D�j�T�
f�"�Q
��"CEX�_����M<�]Z5�y� ��e-����:��(Y.�`��%g���G2�k��8�X%ᵙ>$�L�T��}��1c1Vb���3%��Vc譱��t��L�靱���M~�~&��pX�u�U1��sPp8�2W���T�h'�e�hd�܎tVq8��SI��-W5c�7F�:F��Dl��ơ����@�+
j�g��5ّ���C�Ή�˽b3�[M9�RI�l8G�ىWT�XN�x$r���]v�i;��M}�N)Ox�<�z|�#F'�阰}{ٯ�LA�N���iƿ���	���^������n���*�����i���Q��A�.�S���fk�/��1��̊PC_܃��ݴ��/E�uⅾ�R���2�jW*s��5��)`
���3Xhk��n�I�(��Ϭ�)�y�V��%S�f#׏�֋s��
�&Y5�M�kF�3�O�
����\ħ����+n7IǦ(���@��n��]鰼��ߛ��>�|��^K[�wF��9��`/F��c�Zg�{�MX��B7;.�qb
t;��v`yѹ��z��q�m`2��\��UJ��|&(��򀵹��Ն���`��n^=u55�c���N������=��L�<���#��3 �V
`p�'�_�Ѻ�t_�)bsM�մ)�!H[dFЛ$�W�R��=�V��D0"�%��)���^��i�����C
���dm�u�м�\0�"s�
��EЏ�.V~ޣ����i��vn9�2�hhVD�
IL��M�ꅆ��m���zlb��k��ܘ���y�3r\d�O�:O
.ߠ�o��k��<���E��A}V���2��@=�,�#����8`���9P$5�>۰���0w��i�r�fW2�L?� d�P=<m��L{�G%��F�L�ʟ���b�'56Y�B�N�2 \lb��q
�
��*�h���+�@5�0lHb2�&Q��=�2���G�{o�xT6
J~��z�Hb�)I%��t�忈r�g
_'�����; ��U�fP����$��pS����x�XfDTi�P�C+#~.d�4��,XT�\����P�~|j	i5�P����mT	SH3:���%���H|��yw�Pc`�<�l��4�H�iF�zIn�� �Ԃ8�f_EO&��;�_�Z�-���	Z��.�?�m�5�prͶ���$</�۬b)r����umg\޵E$6$~B�-ca�nH���>�^�`\�8\�C�]�3�@�۹�
��ٸ��I-L&r)�+�(��"�6f��n���0l{͢��h��R��O~����y~W�4j*V�A��V�.D��]��M�Iɛ�j�񰑳�x�n�`�]��~Цcu?�i�����^���%*3�2e�����ܼ���`F���%�i�{X;X�huHAZl���Z����n��%wc�C�����i%e� ���a��L�'-ڀ5-��vwI��oi���p��M��;�:~0Z���7�y�����
�ꭋ(�`)�:�7,���[���V�L�Wr��I��:�ʽ�
]�Cw@:�UlX������F�	!c��'�:��
��jZ��x󺱁v{�I*$`���c�Z�XA]�Ӛ4~ �6̙�0Ja�|P��g�'���á�>n	
Ÿc��b6�RZ_��­�y,��i�Ա%�1�G
�ݺ��E��j��M�φ�kL�
��j0�}���ok�'�A��]^'Lܟm-��"ւ�C�6��g�,H[c&��U�H�A���[X{�HPZ/�E\%���¡�ŧ\4EW_p��t���׻�!�_����r��+�E	w���\<>14T}���+�DNg���.M4*��,ڤ�vU��(�-��c��U��,�,2Ii����6�
�0v�hA'�:�|Y���t�Xڸɛ>�.m:Im�f�i�(��1�wri6�N;�o6�0�d��%~%[�lr�B��=���<�I��h?Ҧ�<�6��ź)�:��L�H$\xd6�=[@?��]����N\W�
6y^��V\�n&S֔�
�q�p��0�3�'�::i�t��’)�����l~�dഃ���7D��9fz$��l�M�.p����.�o�uj:p��/L‹�9��t�f"�g�߱)�� �=�[���p�6��E�t��/�T��;c��ck)�%���rfO����Pv���l7:򙐚�Ɣ�4v�s%>�]�O�����']���e����ŸvM[Tj�cC[�!��s#���QK'Ҷ�knN��[�^rI58D$|���V���lP��̀n�(a�{�H�뒌�I R��N��n~��y]�"��&�"�A��{Q�Ɗ��i����}�0�(@��e�mt�ʶ��	nm�6]W�øq
��.�P��cd���Pv����=l���#P���pQ���:+Ƚ�˱�j����@HǙ���<���mU��~]E�t86��L�������>�(S���e���G�0�f7�s���C���G�";}���:����{fa�00>�I���0�����Czޱd��:ѣ߲��-ă�I�����ӧ�
ė��4CMe��ގ4jm�pɯɶpJGൺ��*dG�KL�ȟ**;�&V^���ƾ�6@sfeS��v[���+��������%���I������ ��K��СG�AJ�_Ȩ=Hy�q=����L񍱡��P,��a��îȧmZ�D7q�:"��rcm�2���8��<h��]V3nЉ�6�8)�c�>���D{�u���
hx9&�f'�L��2��mFԳ�&!¯C;%��>m���%�sĚ��s�Lw���2�1�	�\��œi���pIj��6�M�j�Tm��M�&���m�Mu����_�8�߼f>�C_���~� ��b� �@��ݩ�`I�m
��U�;�EN�yi�?�Q��Tu�YN����L��p-,�^��,vؕ�����AE�΍��������l#gf�i�/��q��R��*�3�U8�;HFTÊ���P��Ç���n$��%})�B�\�����G_{[�c�z�}��u�n��-�C-V:C�˅�.�0��N5,\�d�>������?���c��$���%uZva��;�����s*��W�.�=��O��z6ܳ;=�*8ph�f��w����g�)F&��9w0�n�������0��85�%3�g�n��E��hN�n�25_��[aW5�W|��`��:�W=��K�΅�y�`��ݱ�w=�)��Y2�@�Ӆ�x�5�=[q1�z�&=_�dk�:")��|��u����~��6�}��s܂�6��恇l�,*�\�x����N����y�[�����:p�%j@m�
�
�d���	�*D�PK�yVS�Io "3��pip/_vendor/distlib/locators.py�}kw�F��w�
D/���-�1��(��t<'�xl�'{7 �	0(�i��}U��P);��=gq��n�n�w�:	N?<
�e��I�m��7G'G'��r����uDOF�����S����oy�삗�?�Mž��YQgiДAs��w�uY/�Es�TY�u�-Ҥ��|Ȫ �����gۦ�o�*��Y� ��Y|�����^>��7M�i���^�x��^}��%��rGG�zSVM��%�-�r�e �k�����?�P�W�r	U_�Z}ڔu�f�4��E�5�nr�#���*Kp���7�l���Ӫ*�I��*Y��IP�0�۬2+��z7� ��6�I�_V��G�z_�u��R�0���\CoU�h[��Q��8����3��-���8�"Y�7��^������m���?o��Y=O6�i��W��dEV�T��ի�/�4��y�
,�
���ԙ�z4ٛf���֋:R7cJ�<~x�-}�Lf%3nN�L����=��M6M��_gM�0T������MVyJ�J%��ғ?O��Y:�T0/U���U6�WI

֛U�L�*��_f
��LĔ�nZ��a�ps��˜�M�j�ˬ��ϫ����(�5����M��A`�jv���f�߸�9��,�c�o�2�z���V���2X���b��-���<������/�y�b��h�N�,EU��觻�F�er�xt������ѓo�x��[�O?�ίqn�t�G�#��o�K>}���N��<�����~�Ԇ">�n֫��kN����}�^A�_=���߾�>�?B��i6�����n��e����Q�-h*�ՊpL����mz�]Yd#�+���G��Ͷ*������]�v@��盘*M�5n�I�
�.신\6KU{<VK`3��Xl�+_ xX�;=�ȅ//kR�*L����1�F��Y�m.>�������p�z���n��M��)���8��Q��F�|U�Y8�bGs�nu�И�Cw��pM�^weu$�+`R���2�˵�i�����*��l��2TYX�Uq1�6�ݶ~G��T��xӛ��0��6����*�����Y�m�h\��r"3W�a2��^l��|U�l�l�.6A��j�o� �>,�\n�q�0p�lq���u�]�B���Ⱆ��n8�jL�[&*��m��}��?�i­��f�!1�~��<�������`���g]/�2�z�.8�8o5aVDy1/+\��n�h�]5�f���UP��>]Β���%l2�/��l?��y��kǺv��1��v�o��M���•��'�Vyh�@v���M:[7"%.���N��7�-��jj���#��3�4Г��v�1ȑي*"]-�1�L��"�.�@�e4.h��I�T���6�d�M��;��H��.�����Vu��&��]�%�(�p�	�������c�ſ�/����QVQ9C�C�^qI�����S��ˑ�$
��,�ú�V��ZAŸ�CQ7I/��Ag������y����~	y�f��]^�\R��MF�WR���6�̭�I�Xf��`�M��I��w��: y�v�6�K���X'�:&�T-�#�@N��pr1�-�2ɋ�!RIm��Rp�7�L_�E��b*J���pPB��ۂ-r�qJ���%j���Ɠb�!���(%���E�d��?�z$����M	d��ĪqeOx>�E�uR���a:�������\�2���W��3���p(K����"$1�I�ga��WeyCh�.k��(�������m�"c�E)ZA��4�O�b	��z���E��}��|
���)t�\�����/��
W�2��«�>`9c��H�!`���]��|��Y�`\�xJ��?�P\@�h�Y5Ӏh �Z�	���'5n��r���.��(���T	m�FE�-�޶Ʊ����Q�sa)��++�FF��������A8�9%E�) 23�8�J����(UR��(u���b8Q�X�R��9ͩ��!ƞ�J@�lU��3h�'G^�߈+�$M?�/�72�#��І��~Jq)v�d�q���z�	�S?bUY
�:p�
7PHbQ6f�l�iv�h�Hc��!�4������F��ܥt@�w�S@L>&��رn�h�ʋmf�`�k��f�’D#c:h&��2�AѨX�'X���d�k1�@�'��g9N���=�C8*P��\WL��Ar��l42�d����i���T̬7m�n=��.Ԧ�W���;�jrE?s}�N�o��i1@�U��[$ۊq�F#g��oa
�Y��%�H�A����l�0x��Q͇p{�v�V b��~��u��VDj�� 
��H����3	[�i�R��6=��W+��T
E

HPz�I���S/@,'�.g�TAC�C*,�]�<kC�(|N�x;J�t�q�I��d o�A�k�!�w^+��_>��1�!"��@i�'M,c",Ĵ���j�d;�Jv�E%N��?� ᘒ�=�^�:\ۜL6����
uj4���d���Z�
@��Ie-�>z�>j`f�dڬ�J�𼬥��UF�8�*�~,���ר�'\O�K+��3�.K��M�-2�h$j%�E�%Ϳȍi���x�Qiq.Z�M�^FM���҆�u��Μ�S6g_h�1�����%����x��r��B�!E�l���S˨��=R-��$��XG��i0�4d�FYY�C"2q�5@���	g�c���ɱ��@��ۈu�.�>��UfT�J��4�f�,�"��y
|����,��
�U��ID�����&����$H��9Ep[�/�fdѸVMӤ�M���4�:P�R zoƺ�@���������|eNd- ���|�7� Lj�/��Ж1�����q�[ߙC��Uj��rHҹ��y��ྀ�]	��ҙ[K~��;ܭ�Χ8�@�B�[��<�����M^` ���8d�����UZ'�r0��M��IV�[�ǽ�H,�S{�CL��+X޶{��?C�/��O�R��i^,ʖ4<R�qǢ�!g�@(��]�"=�a���v��v }sro�:Tϫd���"@/!(��ld��0�9�?Kd���A}Z��lW�8��qp,S{�Ҕc5uǴ�0�j�1[
��e!�A�)��x>r�ZB��F�<?����t�6�^$|�b	�5��k��*�� ���nXS�=^�whr�A����ry��ۛ�A=�
�#�����	m�>CY`!"w����`8�Y���20��=��jY�W��8�u������Ʃ�3>�罬�%�5J<�b�O�������kb���h��@EjG�{�(y��[3����pD�pŚn��@m�,<�;��I���]�w�BA^W�<�5���i
b����oHo��oxBl���py�z��
L��衮�y�p=�%P�
n�"�$��ro��C��p4�ә
q��v�E^Ͻ�_��E�Lt{y>y=�E
ƳBޙ����E��:Z#�P��-u�T臊œ���H`�X_�m+V���!���}�<
r&����<ZKQӭ������d�|���h�@��۰CS�pu��2��v��цGT�|�kC����$N�4�P6� �k�ې%��0⦟�
&�D�nL�j3}G�=�N|��OʨtK:"�T� ��M��/$��ܛx�sJ�ƀ"��Q=����n3D���zx�/]ŽV5��Љ�tA�%;�����)|a�a#�f��8eS6�
��>띘{I�����v�'�/<��QȐBY�o-zj����bhN/$4-	�O)� �L1wD�Fڍ���?x�ƕU�&��Ġ�!yy����O?���_}�Ǩa	��b(�#�Κ�8�+Z��K]ڦ��k�X8䫾N�G��駾%�b����S�ik��KB?�솁���Lާ��JDG}c����d�����S��n����)�Z_a�=�UԔ���,n�~�=c��G��7�:�!$�c�2.�����r���EP�-�r�%E���	(����v=e�4͚�-!B6o�MČ�]�A�E���]9^x1
{���R��?�H]����X���	$RȈG���Z���]��&�Z�����k��T�~��u4��F!�,x��fI�ad�~g7���У������)̚h4��4�M54?�Ԕ�ݱ���9n7���u<�q���T�Gb�8/s6d[�Y��^9p�%��Gݬ��$&���M_���eDg�Q�[p�U�ɦ7�����E���9���~<
�n�1Ak�������1-��S)�ݲ��7%��x��8��51��]���6I�X��\ԓ+�O|��(U˜�
_]1�
��ۮ��s���q._�������5���<&�{ �U�$`m�ª�Mo�:��	y�0'���$A��"�bo;��&�Q'��(+�c�MY$�Fq{NGA�1m�R���V0a^QkUUF��9�/L0R!���E�$"`'(ݶbwB��xx����b��J�+f�6�����v�yjJhۑ�n�������
�PDNǭ<٣Az����O�	�s��lt�PP1���5���-(vP�վye����\��F�8��8����4��
���
>'{:�e��79����.�Sb�`d���s�m)���p��5�QP�F��p0�[?…�����IEpc�u�Wm���r�1��!:����R����b��0��Tk�Q*piz'ԣɿگ]iS+�c8U��i�ij�%�FIV>z�*m��]k{Ba��F���}w�-[ʵ��i�@Elf�v����5/%��uz8��J����wN�ݒ�xdGÓS*��uXE�:�U^Qw�T?���S��FT;GT�g�
�sYq�I�TL�1�^�)�#X�ё2A�+�ʈ�#��Ͻx3�`��7��-��!'\y�:��gh�e���$x�#�9�Y�hL�v��He#{=�O�b�T��^r4�O�q0��O��I����T�ls���U�$ܚ��TL`["~mI�+I���TqeQ�Q�h�B;����/��#�4n�b�y%2�x+���t}�W����X0��%[/^��̃�j3�����WHq���.��
0���Jk��z	��uO�z�^��Ȭ'��a�U��a�=4�X�����G]��vʴ/�f��C�$V�+�z�5A����4���,>�G������(���}�!����?_~��}�!���¬4Y�H�����)v ��s9��l���B�G1%�4�H�n`�t��y^�M��;1sl�nE�?Y
t���k�:�aɶ&s�v���%�������(��Fm >LG��/��ǘ�&�*����ȜR!�:�0v&Fᵎ���s�@z��vY@��������>�$�?Iߗy��2CtY��T=���Ύ�r�T[���C����S[�I�Z]9��S�v���}/�?�'@8���+��3��7��	V���@�� �z?��zۯ�o�
��.HM�M=�6�TQP>y��P>uK��t1^�<TiQ��+��:��XR�ɍ
���(��3�s(���� �u'.|�f�c��A�����Bt�:9<�C�f�}�?XжAǖ7�&�	ۢ�1`��/k�"$u.2��'K��gЁ���$|Đ
U�8j:�ơ�:�ߓ�	�jhR�W����I^�NU�K�-�7|,��N�s]=h
x�/�ט%/n��{M�4L�����A�-���,͓&��7��L�T���Uf�
����P9�H�'��xd�UR)sVZnQ�$�3��`�W��/�2`#)��p8	��X,�fop���#Si`�U�ُ��?QZ6����8������˿��pt�6�7��&�7�[y�1����T��|�h���ҁ��nlxxǂ/lxGB���'��}��3�F��悷��%���q}JIu��uP�s|
ݠQq���4v���F.�|)�����߼ئ����Q*����%c[��e�L����!J�6#.\-��w�kM��,Gw�4ԡ�nr�":������bZ��^�=9������}4~8��ŗ��<�������:� A�'ߣ^$���2��J�G��r�Z���͇�a�|qBɬܒ-;�\
1��(��hS��FG���@m�J%t�ۅ)A\l+�Q[mp�@�2h/�����qf >�����#<e(Еu\
I���i~�;%E��2���U�M/0�,���N���T3�bdY���#�����H�˹��c�����Y�S��g��{�Vb
�m����cG��9t�MJK���C�aЈg�*Y���@>x��
Z1@����4��E�d�N����3�J")�.ɳ�!6}p��:Q5'����h<X�V]�2�f4��^c�jva[��K�[���9l-|�M���Y��[�6�h�@���N�!�fն��,��߸�8�~�'�"j���u6(m�H��eY�D�7�&DY���noI�VV7�����Yn�gI}����le?�zU�� ͒�ۤʱ��x�O΄-��V�+�7R����&[�܄��Lf�5	E-M	1=5�5�M(_u���k�:�FA�B2VG3���Jf�(�[0f�㯽€�D�Ä�v=�i�Q\�=zgo���uFVeٸ�.��Z�3�)_�L(A�H1�ŰQ2^^1IDSǽ��OT(B9t�x+��<l��+c��g�b�iH��lf����"���=���v�5����I�*���Bͦ��iFo��i�G�]6�?5��D7�]l����#<`0�`U@�Ŗ�e�5��7�)�z78N��=~�z����ɧ�Q���͈_��ݾS��T@2d@B:&M�9�/�&�
�i"^l��1B�j^��k�j�I��i�K�y��,1}��0�]��)��D�9
�n�0�4���ma�w�8^Y�M;�<-�3�gg�IsZ��_�h(M��5h��\D:�� b�kP3
�9��ʤm�4ō�枯�ktXkܼ�%Ё �c�JV���͘���%5R;���N֓K�5�=�m-�K������N�E��O_%ٺ,"[ʐ_񄾓��걊4kL��.�s��e�)5����l�|m~|�s��:jXئ�ڬ�<�e_ƻ�@�l�m��;y�
[I@@�_x��Ɏ�S���r
3��g	
R�Ak	��jN<j���dk�D���;�l�tq�ښX�.�o�n�(*�DxF�:��t��E�q�i��3��@��vny�P!�R9���kGE��X�У�kg��!����J߮jm[�a��X�>]_iz�fH8��2���[^l�L������}�Ϧ�}�6��x����v�����i�N?�d�v�����˟ҏF?�l�
�9)w��7�W�"�m���T�
ҩ>��/�`�$��^(3�̀�rJ�Υ���*qN�fΩ�yC!:e��.Ǜ�ʖ��e�i|R�	=���<��a9m�����B�T��D����y�tX�Q@�\�&N�ⅲDۀG5�s:�	����ҵjI���ڍ[�R/7�&��W���pу�v�~�I���4G�=�i�k"��8"� $��I�)�(:z�H����:��n|ifu�,�S�	���"�+6��lY�~b�B��&T�Q��J�Cg��J�O�d'^v�Ϸ��cc5r�R�����)�g5��֒yk��3�$��������)��KJx��TQ����S�c83ÓŤ���B�U�-�U�/���\������6r��N��j�5
]b�s..�}'���fʥ@�<�E��B�p<��xGI>qJ�E�P�]�۰+;������5�9,b�}d���A�I���$����|,:
�,�RA�]��V���
!�>Me��&�1%�D��7�́}?�Q��Hv�[��}�u��0�f�b�1��%�ж�ij�S(��k҉��w-\.3W+�ʺ�ܗ�f���Ѐ���H"�K3�/C�I�@Q�
V�w����Yhw>�L����:�g∭��o���Sk����PQ�Oas��E:�~Wz$ ��|@LF�3ԺL��^�G�g��{W��7K%�?C���o��I��:�4>�(�{��:<�W��@�;��+�xe2�'�%	�²&�{5G�%�3���{�_*K
b0zP�-�q�m�s~h�I�>]�/&���@�ǘ˫�1n]e�̋�u�.AUau�%�?��c���'�c��א��z�Z���x��B�aշk�����Q9�>ܕ�� ���d�E_���4sBbmV1�{5�"��+��jk$�`�T��OT��
�o�d+�Vf[��u�_e�O0@�z�4�wϰ�Չ�):�{O���_��:)?�T���
���5e��:�+���&e��DŽ����A�/>ěC�Gout�:����bݣ�n6`$Lz��
%̕=�K:��=��=V�4�g�z��M��-]_uZ;�zH��*��'׷�F+��]�3|<G�x����~�(�R��viC/���u�L��d�'��6�35�]~0���7-3��C���/)XD�} �+W�+L�F��d�ε��L��>�����k�:�D4_�t��a�ޢj�F��=��*(�2���ժ+o����:@B�1���Q^�a��ư<�Tz�
��M�|��n�=�Z���XO��#(���^��SGzT3�r�D�9�-�+tr����0Y�%�g�}4	�`c�����g�u<o8��wX{�Ճ8S ��'�>�_�n���N���~�V���!��&����L��e�
uY�1�w��a����0�B�M@�ގ���6BΠɂ�:R�7�5�<	0�����_������h���N$��*`��L�3/]i�'[�yB�(��b�؞(Nc��`N�x�9�C#��n�r�Wt+!�*����W;7;��'U�0�7s��<�c,�6�a���v��
�t�7K(�e/}��7�����-��Qh�L��f�};ۙ�x�Q�I?�bpt��)�W���9*����
6����~pt�$�P����!�5��9N�߇nZs���1IP��dV�_'[��L[ɣ"�jMO�J�f7��f(ȅ	�Ř%���$r��Ze����sF�%j�_�M⽦dঢ/��upG0���툽S�-�.� 7�I��ƽ��X��.��BS�!�fY�ʢ�<'�#��mՒ��6��������_D����Md��C��XNfo��M���F�E1�F{��Ea ?�qN=\~9G.�6���vh�me9G��x��ٶ�	�Y���A���s'E_N`|�]�~/���mMغM�C��)��������noȃ|>��M����ѻd���d�wf`���DN�6y�������=����6}̣	��z������%J��K�Z}-��ҙ�L�����Ps}�U�y������-�Z�y_�~�2/��&��Q�Խ�f2��i��{L!#fh��˒��m�,�< :u	�(�t�%T�G6t7�k4���@�k��w����'����^)yk�1K�Y1n��ۀ�1y�-x�:f9$�
�Y�-�Z��h�v?x@�;��c'���F���i��2Ћn:�w�$|�J�f�����4�t�t!���"�g3;a��(���RO{g��2�I�q?�/�
>v2��.[;5}��-�&	�iy�Ͼ,����ͦ�����&I$��PJ��'w�Y��^a��^�G�<΅����t���
B�&�l�,^lW��Z�.�N�Ye4�\VْN�H'���=æ�˂��@��T�8Um�u�1�{`̙�~4�T���ځ��qqUP��V��(�y��e��ռ��݋�u��WA��?�o]��۴�N��R�ף_=��~z@�p��U�׾�&����t7���{�:��>D�iVa,-�xF9P	u{�·��o�w@6A��]y����G��#ۄ*�y��c(P�~f��Q1/;ep�#6�E�$�xs�/a
(�j`x$���b�s+��w�3C�x.l�%������uO.ĺ
����xIA>�q%�}`ͪ�J߆�؝�qCi6�v��mc97�'f�o���ߣ *�ߩ(�\H�x�yl��u�_ߡ�i��
]32�~��]�1�2�k�fz�UJt�R6w���7E�ɕ(h)���&s����̞ݘ�n�'?uw�^�у'�.�X����cNCM5�S:��ƍ!�m�/o^o[��S��+M{�w��<y0���W�kx�ܽ��S���<2�bShu�@�P���@#-N��b���}��3K�i�{Z(�*�SdX���܉8���RM��1��]_T(9�͹��M�n�+X�Q�4�CUO�m�3Nz0�@�/J���7�102)��Y�!oE�rI�70}Pn��-�����NcS�s��K������Qr�T���Q��]e����I�[��r����(7<{���+��O衩����n��w��[U�^�K�@�����9x�c[���}���c��s.���o��@}kK�a:��,�{���&��ZF�Hܕ�D��9�)���%��MK��tLx1�Se�
���L;��	�����i~��y��g�C��ɣ��	.�	�(�^�1}=f?�*>-���M���!_���^�H��=�3�<=h.�WnH=�L��䯴Ֆ�Q�S�~+	�L���U��a�eo��<��yk�p�a�}���+g-*�O�bК1�F�w�ra(I��f�֦�3��ԉ��	�h�b6ZP����8�I�KS��&i:��.�z�0��i��:;b\�Vm
,L��Tvz����7�9���vD�.�Ŷ-w)��F�Q�<]�<s���~Y���E
��R9�7?�׭ѓL��c�?����S���*��g�i؝#��lU�e���*�(��E��Di$Ux���wT�}0O'�`_O!?�_�9Y;Z�wF<e�V��S�����{f)����z�6,�K]��[e?�a,�UV3�j�L���u�
AJ�f[�-D'S��Q����m22��%Qy7TP�����zL�θ"�eC�=�8U��>�Po7��7n���	'tz���t�q���r���B�໴@��F�zuNy
��6h�)?���i*xT��E߹l��$�0�[�V�k��=��w��	����~4}M��rf��?6:��(DqÛ�q��I��!kvl�[��B��l\�X���Mq�S"k�>��ř&t�G���\8��*j�51
o��&X���V�������7����4`�V�m0$AE��1�;���>7���֛�,�L��rp�����:�`v>�	�40JEH��V�Ȓt�\�֒R�L��џ�\\Y���2�����)��X�>R���د��x���5�� ����në+9T��Xw适ʹ��9���$^w5�8�VD�t �>����o:��lc IMb�I���8<�ޒ�oNg�q���O�f�뭜tx��$w0��\#��T`s��ƚ��BG��yȖg���b ���NK��z-۾�F�;�y
m�I�2��;�9.�g+	|�3�Ӷ�k�8��{G�o���M@՘�\ۥn�_D�j+LA�fW;�����W���
+Y�Q�C��)@�~��ʚHwl�ȭg:��a�dY�*U��C�A���AmSyl'�P k��ٱS�9�?�Q�BI����VS��/��T���lC��M��v'BJ���+̩�td:�1����LMw8�q@��C��̘�U@��n`s��9i2X�q0�m��y���e`���CO51��+\J�_c]1�ͬ�z�1�~�S���aV��hyԶXW��Y�!2�N(9�
6T�S����d�T�M閉��u����4y�4*�#޽tK)��9��z�+A���̵�5�ҝ�)'�@�TK����@P(��Q<WW��F����;B�3E��
�ꕱ�A3F�us*щl�?�N����rG;�J~��g5�fP,B�WWᶨ��m�!�T��FV'̄�ォ*^G%�d�[
wM����HC9r�ij��25y~'J��[���"�o��kb����	E��DƖ����*�D�$�`A�8 "mA>B@_F>���19s��G��L��芐1��f���5{ofZ�����M3,O��}V|�l���`�#�
t���e]��i�r�3�� ��<&[4>w�~z#C��j\�&|������H~g���)�[d���L۔i)/)p��f&5S���L�b��xW	�<{X�U��
�Gdʩ�� ���=�YG��Zc�N��kxq�&��	�Ao
k�2Ç��O�<�]���a Ӄc������䊔1Vl�#��߶'���i�e��-���u'�c��(�*�O�ª�)8"�qT�[H���V5�u3���`V�Ƀz����48����g|o���Z�>|P�	���������J�U�V�v�2��W���*,sl�3��i������h��H�w@�@��[Ҵ1������9A	�h���$�0)�Ѓ����@�vƺ,_�P��z�	3[��)*�)�����{I�@G���|�^�v�'=6U~S��z���QPFg^� �o��ϋ�=B�.�ߓ
Y�~���1����h��{�3�Y��鸼%�^S� �ᢗ�}zR)��:"<}�rp��Z,K�,���1Ϳ7���dm��vN�56�6���L��X��F#۠�ك��ਯ"�����'(����%�@RPS�SJujt�D�}8O�����b�Zfy![�*4�v�PK�yVSx�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�PK�yVS�y��}pip/_vendor/distlib/markers.py�X{o�6�_��MQHj����@׹X��
�4�.#�6[��H*�����C�,�f��D��xo�19~zL
Yr���֬�ƕ�q��N��֐�MJ�{��c���\pAw�~�M�w�`B��I̖�ӝ�JA����Q��[ي�k��p�0�ߴF��F1V3a��c��ɛ��l��{C�(ɛ���'�|<��E�Ti�x,�\I��HM��4�y��qEŦ�FJ��傜.Nɏ��-'8x)
����?f����A�B�
�tS��h�7�ղl+�mU�FZo��%���7y�n�ʂ �Q@UP6LQ��&�-��N�wn�0���ݖ[F��ZXa2"X���$�o��k���i���6�"^7R"uxR,<�]��TԀI�(Z+Y��)J�&6+�k�����*ls��?dNەs�ǁ�c�C�p���������"�V+ZU����,�T����a�b����ru���|�a	Ŭ|�b����|�\��>��{��}.]�_���8�"���zUq8�V�Lg�_!A7ͅ6T,��)�D�t��[%�[Zi����k�\|��
3+o�h�b��Z�ھc��Hyh�b�D�;�=y�g�L�I�o�l�� A��e��$V(*�5Y�Ҫ�@L��gV��Ϸ\�����1�~��7��U�Q���������T��))���nF�!��.�C�����鞼`M`
ٽ�!��1���O�_M`�2��:�!J�X�}�Tc��C�C ��0���8cd��H4���T=�����b5D~!�h/��#�l7;[qg�V�O��(�G˕�I>u�`o�)t�
��‹�OJ)�Kw'� ��{8b��=�Kh}1;~q=�0�c*�:��K=��(�+�l'�_(��⋐w��R�)\V3�D���>,�?�a{)�B`ʌmUr(�l��l��C��C%��	;Z-�>��ʺ��^�e��Mz`�������m��6^=.�M���>��e\@
��u�k)P	���$({eVL(��N1k�.�EH�\M�Ճp�<I���$nl��K���x�f�>8\�@��lͰ<f�f����~d����ftJ�-av��.�0�R]$���u�J0��G�t�w����N�$��vT���^V�u������f�n���"$\�eO�Р�%����xCX^���=s�{�y/�����R�bt�f��WV��;6�ƅV�2�lnqXR�a�uR@���E�]�RM
�@[N�ʁ5g�yÝ��S�f�� ���C��sL�;���~M}P��y��C�8����j�n���A��#2��o6t8A�k�.`4(�0�(,�~)I��>7|٣�L��٧�K�x�au�V��{Ku�B�x?3ޅ�}K�����	�'O���]ξ������E� ��kh�z	�Я���?�;_�Ⱦ���pT��PU��Q�¼$���e����;IV�6�<��R
v0���}/�݋LC��G$��!�z����|��%Lk�`�O7���I���6����0��1�/n��!��s%嗶�s� �a��J�ۗ׌��X�#�7�+\�`�!���^M�hQ>
�%F��Kh��N�S'h+�s�6X��:x��V�<Y�5a�B���P����'N�����s۟&��	7�t'Vڦ���!r0Vw1��P�PK�yVS��=X�$Řpip/_vendor/distlib/metadata.py�=�w�Ƒ��@��tHZb��Vm�Nt�e?IN��
+	0(YM�����7vRJ��w|�Ebwgggg�kg[���(��iV\���b�_�dckc+xV.���	�g�`��3	N�X�殹*�฼hn��/�e�&MVcht�X������x:n>6AR���ׇ'G_�=y}t�������|��9+j�A�_�&pIpQV��E2�N.Y�������Ţ��:H�<�
�	<�v���`g���L�ϟL�;��m�\�Ur[��`�hl\T�<��e��X���"��8�V%y��!
�����<�r�b��Ќ�$��r&[��.�=///���g�668���<��<;�~��Rf�ݰ���q,���"id�����AM���n��aа�
}��Iu
�d����-*ֈ�e��-�d���w�5������X`$�cy=����,=}�7=:>x}M76pԬ
����P�%=��H�@�b�'u�X�UV�PwZUe��2����D�i�U,ռ�����n~Vy6kVBn6_4ASBIG�V��e,Ok`\�\3y��c_�o�����"�'K��\����(�aU����r~�*o7�M�g�j�i�I�dH��7%�[�by�	���t-�%�v��ղ����p�o��:>8|�:�>{����k�ᛣ���������\�fW>�h5�V��zÁ}�$�BB�b�B.ߔv���;X� )�a~��⒥P��CP3�|��~�E@a���
�FQI�/�T��]�O��b�N�(|_��/�
�ZX�t'~q0}���E��#�DH�CXF��x�&O��p#�?��r��k=g��ʈ7<�ew�e��X�r�F�q�c	¹��F$=^f3V������������/�|��0�@�ê��$�=z��_��e�V{���ʛ,e���f��׫��o�݈`��V-<�]��>�~�6'��m�?��K60f�i��$�P��g�l��r�Du=O]�U9�}�&ӏ���$W�frƪ�<�]�h��Ц��Go�,���ɗ��s��x�g7I��$9�$���+"�1k���É����������f�N�a�KW�6���`m�l�n�LX���%�B㠜͖h)��%�Y��ƕ6�A1˗)çs(�R@&g�p6�T��[�Q���/P�Dh�18@O�y�@9>Q������x#��Kc����3 ��&F`�ț�	�z�9����z�yþ�y��k�|�1�Y
�g����"��k��\i;�&��\���;9�Ƕݪ0�Yz_?�ۃ�����ͳ�����-�o�*�ϓ��@�w�'r`�H<�zv��=29��]5E�-�"0(CE,wZ�xZizu���Z)*����#h�928��@7�
��2K�$%s����W��ݬ;dw����ޥ�]�_`�&��X'
=7��;�����
��J���v���y=gu#'7�΢v���B�5����B*eV}J.�����{؞�_%u̝��t�oP	ğ"5D��������uV���I�t��E��l��b[t�6d�;�e!�17�#G�Y':=�y{�������˂
l���n���'��a��Y��S�s&�O����0��M�nK�=�0��
�dZn~u�2�d,p�`_���Iՠ���X��ؤ�Kb���%�������4q����7,"�.ƌSv���@�c���� �9�>BYN��@����;�ɝ5��YI-/��_��dM$'k#iH-������D��#9Yo������..����A��n�j�A��눢�O&����dMb��rIN�\�ߒr�
��"8u��2�їP��Z�9+"�*�G:�N�Ϩ����Ӻ�궆j�J�w4[�� '��|�Bkj�,Ml�rC'X
pBE3.Ņ�F9�,����R��|p�\u����w��\l�l�$��A�����`M8^����a�������e�d�^��F�l��ԯ��kb�A��/�M������ ���Y��h����[\%7�l��|p��b4����/��`FԄ0bP��Uy͊@D��?�-��v�h�)˼� � 7����U20�ޕ@��_�IR�*�6(�`��{� Kp���t�a�`�rHjq�����9�Ka"L�72�yZ�
 Ւ�.�lbe&V�),{��Ť�7�0{ѠA���f����Ĭ3�P�~�M['W$P=��G�2�	8/a��+j�7��N0L&Wk�ī�i��'�����X�eu�$e7OlQ�?�mX�O��t��v��MH��pB'i�����Hy2c��hslƛ�]*'#����Ҿ�Ƨ
�m��$q�n�4ME���Pڳ�V! ��O���<?x�25CwNō!�)p���{�� ��gVS1�D9>1���Q���e�D��
�� ڪ�]G��Z9k��Z'o߼��$3{� ��������X2_dDF������M:@jG@;B����1߿+ϱ��8x9=��
���?�����=���31�
g�81�<l|0�f�9��������>�kWs��9�a�U��C�]n#r�ppa�#���P
�$�E#m��s�gv{Sܾ�x^B�Ų��P�VK��%�b�䋫�X�YrZ��Ѐ3�Jp�w�q/Z�T��w�A���p�i��x��n0�Z�2.)Q��9��aVDŽ�^�&p\/�#�eH%�pS1_UIl)��g�D~T��(�T�܁��2��I"�gXr��M�]���,���l�`�̠VN	��"U�%Q�l�QJ���*��kq0ʛ�h��VaJ���`�$���a� �8�
|���`�\=Rs�J�����3Y�ð�X=�l�g�L,6ޱj
�j�C��<Y,`�#�'�8@<�e-��!*)&��4��Ž9y��u��3 ��n(�I)B>�J�y��tCG��Ț8�j�_�{b����1l��^(���)�U�3FK0X)�9���2Y1�-�T

MW%�8˗5L���Ʊ��v�d����`�MyĐ���S����=As��N"��
��	�4�ze��W�&�#Q�ER������xz��j�������`s"N�M�3�]VH�l`�S�.XVq�\�4ô�xL
#�s�/LQG-�NP�u���[ǰ%�j�űѾ��wQ3����eBKYއ
#ʂ�
����VMug3@��G�ӫ�Q�S&�E�B�e.5de9#i`[���i�5�v[	����\��R)1�Axr#��E���@:�.��\��oSNHӘXb5ֆ�n�+����!��= �	lx�-��1',�(Pj�uv���-��'x��pq{�=�H���8���`� ���Z�Z��f��-�?�_�
����J��*�r��-����U�N���R7�
�1H��9{�
 ��\�&<~`����B���oΜ�!��ܕ�!'��Y��X�g��(Zs
�oz����LMmʁ�d����5�E;n`�8�%��a���<��šg�l�ּ'��U�WKPv2�E2m���X�<{�YD8�ttZ��C�y�=��m�,t݋��*���b<�˚�&�nn�(7ͭ���K���.l0���a���Pv?��%zAm�_���ģdq�{�R�Q��u��C���I|'q����`���`n�-����<���[O��Dԇ��w��m'3�B>>�i�:����=�`lE�d"��?���P�|#��r�m�]%�I$"H?M�h�k���ǪI@��R��I��}`�fp��2H�DJ>�V���~[��ƶ��3 %7I�'�)�s�H�09/�������UC�`��)�gtl��Q�Ac�s�;c优��u� �`آ@]g�Xl���t�C��C���-jo j�GE��F��׀f�g E�C}B��D
�t��sD[���
�V�+�[������*����Z�	�`����9��w�3���=F����<��"V?��?ʬ��seo?r[�O-��{����z�+�-�E;i���A|�����@�H*�~]kh:!
̞�5f�d��y��Z���%������׷IuY��ؔǦ=�B�0�ȋ���ZX��|���J�=� ����`ׇ]tUd{�#��n1~���_���qB�;
0�e�^������hv��o���`XB�E�X��'
e�hc��>D:�o�UD�9�oq/��pZ�N2�ٕ�F�!��4��~P�݉iN�4�J�؜]��1ZZ�d$�5�Ү���ǡ�D���D6���$��̇)bN̎-`��)L>:�����L�&�a��Jc�y�
'����볾���*���nlBpN�&V��
�VDp{���U^��yd5��m|�P�#U*���B�����A�L�4V�0�P�y6�`ಬ��<�롛4�Oo�Xs	��$��9ؖ�_(xg6CF�p^{��Q�{�˜ea�g��@q��(�HY�~������V���n�e��V^jF�����*Sv�.����<���7
pӘͮ��$�*�.u�;�-G�S՘<���c
��>CQ~�A@ᨳ~6Cpzvq8����/n�R�`���9Y ?�;Ԝ"/޽�����ܛR�IE�"���g椵3\֜�ʂl���1?�Qp4��M��z���רKK/I~�H��ߘ�] �`��8�O)�~�C
/��<m��
�Q�_zV��ҮbWgOf�؊��_�[ۣ^���C��'�r�#+ɾ��)�IE8ZT���SaR��	'�|h/�.wt�� �%��h�i+�?���Q�i[���1�:��.,�`&��M��褵U�`?��he��
�S�7:&�'^����ۜ1�Ű�6Z垞�j&�.�3�6k|��g���;��aJ��M�f�.(��i��k�[h�N�2@����d�X����;��{�.��0YY)LgdEm���bu�@?�J��a ��e���W�i�8�Qu����)�=�`�
d$_b[CS������3��	e
��:3<��s\U[�o��[��@�.��ƻ��%��Iq|�%1m>B~(�Ag�"#o��']�Q�i���1�jr��P��Lw+\�m��PYe��&v�uL�S@g:�	�eH�	p�s~04�Od��`-�)j��k�Ze߳�_յL>�̪
��,�X��RomQ����;h�COS�5,�Z�����q���zsά8���ٿ)1�)Un-��=�b/)�	�F�qD\����I�{ �5ߋYx\pVVlD�L��ܚ;c'�0��u\�-@����G�BU�l����E�YYɽ��>ҙ��<�x�� �z{C2K�>�B��BiJ)����a~�,2&4pv[��+%˓(�>�CyzT:Y�*�؀�aQ[�`� w��&�?��1���	��YC��$Mc��)�[�󑛒���pnp���_EO�)��D����	5�m�-�Z7Ly�x����� �A@;���u|�,�l�"�<�J獋'�[N֐ܴ�$W���!�( �J�sF��>����EJ^����@����#�Y��<ׁ����ox<����(h���b`�g�2�Ϗ���,sI�Q�8�Ky�c�0�ҹT�8��jz��|�d�N��“B����x�f��7����[O]��k��~���U�0t�Ut�����w��%a�s
����#��>�^5��ՉIr��n	�`��V��}ԅ�H?�d�+�E�3~d&t�u}��Ա}Q$�ҫ��g�L��7��>�,z?��/O�"	�
�O�G���,_����|8���C������s�(V<~�������N����İ=<y���~==�퟼F0a����G�yڼ����?|������p�Nj�'Dk*2��Pfε��<�٤p(ʅ�>8|>}';��
Y�R�@@�/T -=+-�e1���Z��b˰�f�$e퇔���H=2?���҇�~�h��c�<�Ԉ��x�B�:_fy��z]�]MDjbl������w�~�1+n2��I��a�px��.�n���tk��vNa�¤��.�\2C�:8��obpUk���F��:/�1MX,ka,�w�>Ph���Y�Ƞ�dU,,��\m�+���2��eYa��碜D9�9�I�bD����Fg0��UI��YuVF�����-Z��)��%/�&F���E����\E�~��u�e���8�֗`4��h)}y��n�����x�N�d@�Z�-J<B�ש�[|�WI����&�g�|������߆/Y���)+�N�U����|����B��9�~󎐇$�})�d���6��br����]M(�3�:��Խ
�"�
��償-`���\�AZ2�P��M0))wMwD�$�U�p��)b�<��l�OlhC��s#�NQX���I׀��lFb�����
4��b�mRtA��%�aJ.a{��K�I�'���^���O�@T�B�*�`��K�0y�����庆�����ڸW������aEӀkt���B��B�%��3L b�O�)H�o��VD7�
Dj�Ƶ��4���Q�2E;�XfGn�n΅m��]�]�(�I�1tvE��,E��8��:��]O�Z7����e5c<���7���"S�.�]�l��$
�����s�)*�32��䬯�w4
�%b�ί�[|Z����r[���h�^ӻ0x9`ںߔ-^}�_w����I�U@�䵑�J�Q�Qt�mx�ď�/��u��]� e��i��u0�+jh-��b�Z
�i��ɪ��S��A�-~V)�i�A$6L�O��c���3
�<�KsV`��-#w(��eAu�	�I�s��a�ZK�^�+TS���71f����CF��Ԕg���N�)��,��z��Uw�q���,y~%ʸb�@����귧Nv![�YGw���{���~;@4���=��[TwK��j�NI�$�~T~�y���r�[+k�E�:��V�3P�U�P�L����^��H=3�Bΐ����x�cJ��:H0��C�[90��6e�({)D���'�\���&�0R^�@[�|:��d���.�E�c1-?��oE�{�S�)E��za�|��:ͯ�A���0�mM�U���(r�ۇa�1�
��2na]��?�4�ְ#�S�d��"�z�W�&�-S��<G�������S3�=�\G�U�#3zt�AU>�.�{g��G:"��h�zιx`Q�܃�Һ9�+E�%���-U��T+Jxo�q7�o��;����2]]�]�vW���N[7���p��R�����8��
(d���5f;�T�"ީ�[W��i�X!��8��а��*/){)�mJ���?&ґ���C���Z��me��n_a�?ƌ�V���D��t�;�U�׏��x-F�d��{�T�g��2�r��x�]$U2����B�|��#�`�X�tHXW��!�6���эX�8�j&
j���ë@ϙL�fuc�P��1x��/�Q���7�S��:�%I����F��x*n��G�P�1�|��T���r}��5
!tQW0fY��+q�
F��k�~N7-z�V.����5�L5���̩Յ��~�����*B�od���[�-W���x�p�y�j�E~�1�NX��5�Ƽw�,�K��c��m�oG��k���^(
2��LX��p���|"��@�n�nV��{D4�}T�VüBzLϟE^&�V���
�˳e�	��^e�5r�5�
��,�Hw��-�]"��}�6�z8�$�'n��֛4������o�8[�	}��jYg��`X�
�ҩ����e��k�x-��OM�N�x?$V�Н�c�/"�7��{+�Lڧ&�m3��=M����`Qq�L�
€JuR9�������6��yo�o@+_n�����zߛ��D;U����y���f|u��@�zA�IB^�=g'N�G#��萝E7q-��O/���:��:�&��3u�Ѻ��;1iŮ��R����8"[���:����w�,iu��
P���u_�b���d_�XӃD���c��ǎ^%�tjp��f{w����$u
��Nk�g���h�=0wl��1�+���6o���:[tXI3�y���+iUJL��b���@:�B��S����h׭�dGP��Z��{�!��)��xZP��;�����?���xE�iL�eO��i�N+S{��n�K
���[���"eǩx���*�I����b�a+eh`���gq��)���F�S^���hx�shd�6�\"XA�d�D�H��o�b�^�c?�,xy�e�����|�8��E�ߴ�J[�{7$�V�`��s#)]�H���K";^�ށ�8"HO�iA�:wB�8�~ptEی���b+���=1���Z�N�je]�cV�=!��X擡!��C?���xX���z��_֎���'o��`Q��Bn��ƨ���W"k����S1�s�T�3���������KHJ��4���l5��F�y��<�~$lH��{��z�Xz���Y$Y/�bぱw"�x��"�_ݟh�:[���1=ោ)U
���b~j��!,���Qɲ��Zr��V��ۻ��`+X����w�VΗ�:��V�=�7��	~�3h�8Q��`�*G��S^۳:��Le��~d:s�e���ca���#�֘apP��#Of�)�u/�0?�K\��^�נ��S�o�mg�|��g��b�ЈM����	0fR�s��a��O+1�, z�a�����'�U�jǭ�K7�L̫���.�n�_�*�Z@;A}6V�J���o\�;0ZW����s��>�;�m̈́��(�~3#�����W|�X2_��X��I7�*̐�8�+�����q�֐nSm�8��Y.B�Q�sͽ�
�5��'��M��'���?tۍm��v�L��6�r��R�%X�ˊ�I=�2b�!�[�|ڛ�gp�Q>מ2�cM��̷o�G�zN���?o�j�?�F��{�c��/VdJ��Lˁv�C��6�s��2�A�N�	�c+ֳ�ʛ�MYk#�
�S��:�*�����x�Ό>����Mb��$�i<	L�\8lƮ0��{D�����B%��17���[	���:�K9qY_%��T��U�f6Ն�2F�֋�J��d��e��Eu����PK�yVS��Հ�D* pip/_vendor/distlib/resources.py�Z{�۸�ߟ��q�|�����0�m/iRH�C6)��B[�ͬ,	�����{g��zx�w5��-�g��Ԙ]|{��E*����ş��h<��Ey��vW���}wy����������/����\�\����w��t�wE�n�M}�+�^�<嵄g�ET��|y]�ա.�׶b/�e��޾y���ͫ�~��S��޼���|t�MU�Y�l��I��,��K0E$��E�35���Tb]�_��߲b����B�o��P��TG7RK�~|���6�*�V�HUgr��a-J4��LK���H��*JQ��ۊ:��Ɋ+1c/�h�:�׮��1н�gQ��|�OG�qջ">c���a]�w"g��H�.�J�B�j-h�����Gȗ�
xV�N�H�l3c��5�5$��z̤��=�'�a��S�����2u�A8|?̙.d�^�_Ɓ(��V&.y���2�BGE��M*c��M�S'H��Q`3�m�ؙ�����R%��0.��g�����3�����+A�l�϶��I�����K^����@=�E��f+�>�!��Q%͈�X��)�H&�F-���<9�U��٨kJ�ǽV�u`��;�I���َW)�x^eb�����T4S�aXŖs�O��7�Rvv•?�8R�`Z��u�q �ԙN��,+��:@ b-g��X��&he�)"g��QZDN�!�A0�w#"SCtAʠ�c]V諞)��$�U�MMp�`����3O"=QH
6�E�H�B�a����[�Q��'��*;sW�ιkh�@�M>9y�%|+��QW֘�W�u(HV�\+����Z����ȹ����ȍ�36�_M��+��Ί�ML3;�c���|Z\���
Z��@{n:�g����7=^�_�A:��3s�`��|��i�J@h*X�8������[�^EV����#z@�d�,���a�E��Yv4���WGvP�=��s��U���8�+�k��34U	��y��`��+D;\��׀JD3/�I�
�nr%��"�1*���i%N� ���/n�q	��3�;0.1	��<[�������Aa��7����j�(�&���[�U�{9�q!���۬X�Lg�_>]��VO��B��I]�mgzLAJ��rv{��HU�8ShC�v6�Ҭ����A�m��}Gy�daY��eiL�!�����M�WM�L|E\f��}U����h���_�neY��⡆�
�i^�&qy\O� �߂���Ea�9G��6[�v_���Si�S�����Y�u���&���D�%	�L(>�l!l��{�PB��	��Fy�~9��I�H6a`��
��n�� �C���I��j�&���x9��
1�l8p���W����.`��	�$�<�PB�$J��He�b�1�i?�k9jW���ֲ��9kͥ]��W�?LN 7M�Ӕ��$bUBJ���iH����YX����o��S�?XW�����;k�
jk-v��0�f�7�<U�BƠrmXg!����%55Io�xu;��XyH�]�.(iEu���>�@����,��Y��h�I5��~j%-�m
J���b�i����������>iԚ�5ғ��x�&n	;\�T�wYV܋4�tB�f�6�w�Xy�mP�$:���
�<�=�"�ۅ�=�^G��n���+3�Wܸ�b7�.ó��@�`�0�P`�B7�뽀R�F���W����Z�p�u�LNT��@c�.����aK�Fa��	��MN�
�eQF���Q
h2��3�)��ѿa�z�B۳�x�� bٜ]�.���}�Q4�0~`_����!���6 	Z��n�Jwl�����a�� ��a�n ���Z`�iD���7WG�q�l!���H�-..y�U���U��=�ґkG�α�at|���\jj���!p5gX@�kv�~��[d(�c�?YZ�Oj�h �3²����x͝㣆Xa��6������~�AcOC��$r2m�:
!p��&��$�Y��q_�ڨA��ؽ]�>�y�4
���_��C�uz�a�Z���$��7ucGz��d��ѴWK��)(wS��GS��ӭQ��D�C�N��xz5���]A����$~UUEOQqb�4�
Z�hȥ��T��hB+�6ܝ��7��h�fA��c�n�{_T�O�{S��C0��+F�T���
���6�3�'�S���(O��31�,�����:,�ϓn�w�37�r���X.�/���8�S]g�u;�K�1h���ҵ���R
4֓�/$���vʕ�_��n� 8n��..�2�WcW�S(���@�dƮ����a��#�ߋ��5��DxC!ѝW�%n���7,�S�SßZ���u�}A�h<ɳ���~~&b<؊�=|�tF�
D��̼G��F��1�k�Ȟ�?̠�W�W�'Z@&W��݇��x��:�3�7�����.#��φ��mg-�A|c���[��K���usM�ˋ\�f�K��"���?<�TG��*���$���nj�X�e�6YT�`���8)̮��,$5:�i����I1��Kw��y�X��'?�b�4S�۸�΂"ڻ����&��p�0�3}������{�o/�쩭{�"��6�9����@�k0�0��L�������Q����ML<��:э��~�;��U���9�w�������R4���	�9[z#XJ7��ͪ�L��10i��U7~�zeÛ���0?�)�r��3}��7�^�
묩&���?�4>��%��Ez�zC-�������Q�!K������N��'f2b{}nnBܕ�yϏF�-t�J�%�-�U�{$?���2���G����U�b�G�w���d��jK�z�t���f����!woH��.2�݂�uk8�7t�Ks0>i��I,z����o��5��0�PK�yVS��E�8Epip/_vendor/distlib/scripts.py�<�r�F���cjUc��$�UE�ʶT�]YRYr�{���Cr,�b��ںG�{��{Oror�=`i98e��LOOwO#l�͈E�\$�cV���|�;��Wi���r���j��?;z1���c��$ܲ���v!"�H>g*ej��V�҄ݤ�	s���"��J�3��9a�D�bV�~-s��<Q�sv1yuvys���d�^]]޾��|w{��¸�"O�L�L��4W��Vq9�ꙟq�\�~ʟ�,�r^�I���~meO��t����/ׅXٜ+�)O4����Ev.bn��\�EqYN]ܬy[(�/|�u��<��ْ�|�U�"u�9�<V�k_z
�
�b�Adq�i�2�L�yr?�@ ��g�t��k>�¨����w��7����[��y^�ǟ�1L$��<�r�'�w���@G`Q�	?�o��S��PJ���[�y�/��XF+��h-�<� # �q(��Q���D,�T�؋��c��h#��A��{,�S �L��<Z	dR�6��^�.O��n�6�ۍH^<���'�Ӑ[�0�biY�@���?
���ʀ�F�H�T�d�>r�/h7%H�G��c>���=ĒK�����<f1�}��$�O�x�g�8�p�'�EK�[b?�w��K�+�Y��?�P�� 6�1�(�YH�qz?�X�K�5�p�j�`H2h��w>y{s;��\�Mߞ�L圔��g�<	������F>}�`է�����Wo'׷�۳7���0<�a��
*M�w��y�A�����!�qX�R�	�t�A���1)@
�|y���'�Y���G2b��A���c
��Aw���A�?���"��z�e�ޜ/@��Q��[Z�׷�������qe@��8� �l��N�Z��8?
%��U�`=`\��`и��x&�1a��\��2A���gb^� �p����G�O�|#��*�Z�����������U���c,�ِY��`@ӕ���3���==Q�*���J��<�`/�J���c��o"W��A����ʿ}�r�)M�9XJ[�P��yF"��s��,�с3�#I7�!%�A�_��4ş���B�z2���m�F>��zQ��ݐN�Q�t����}-*�L�`#���RQ�Cv�����kg\=�Q`���ˌGbaL����k�n��z-_������R�a��өH��N}�����6�2`$zo���i�u�ʓۼ���o�y�������y����:A� X�p��à��;�A�9�ݡ@�	B蹯�8��(q_��Җ
-���M"%Wl7g3�,L����}��% L�N��ʀ$�x�J��
������}�6wV�/3m�w��sB�����x{�����37����̓^c���D�4{K��h����=�[�yM�ut�
��	9-��%�('a�x�����"nG�iFJf�'4�#R�[ER1 4����dy�\��`~@�#g��� �4��٘�.ۊ
]$��zG�t��2��Np�\�s*_�\��0�f�H�2Bw�7�f��Dp �8n�a�K+V^�!m���h׍�8�
�����1S�`_<�`o�w9H`�ވ\���f
z�E�lr��¹�|@�z��k0&��SW7gy����n:��΄�G�L�w�Xg��;��C��|��6\.c�a�c�}j0h��J�5[w��-��#F�*&�� �|����(m�dЂc`�^��^18��@�z^�@�\m}ϘOs����oT|�݈.N7��O�V�0��
n�;�s��8���&	��7ȼӍ���X��nL	���M��"�O���0{� XMо�ڃ�//ꝆA���ή��@�Bu���-�;���Y�hUʄJS�z��O��:�@|��^mR��+p��^'`Wel>��D �2���oR���s�k?[�фh��!����q�K�R��=)�갲�Wm�0����]�����h{���e�i_�S�d�
j��z�tz�VJe���f�	D2*�u0��t���1z���c���A̓�ZuH?�i����� ͗cs?����c�c%��:�V��^�8�'U��j��`)��0hܓI���� r�9��~��o(������,0՛ƂRÖ?�'��ã-�gyA�!�d*�0"��a�Z��
;���ΩG�m?�|�Ij��`*���~<�@b`�rH
��%�E�Aތx��v�Om��f�����q��Z{�5�)�{���y���uY���ן�{�a)��icd��F8�0�U��Z�d����I�I*�ZP�ڮ�	M�û��F=��Oa=;(�P*~m@��~@�U��,sL"_��:����oV0l�ܢ�?pᚢ���P�ՉgkĨ��+6�7�DW�����t���)XP�;{f�B$���-�v��rr�z�c�w7�_���L�.�D��hh�
N(�΄D��M��$;n����f`
R����v�
�.�̱r��E�*B�_{�#_��N�rm�&���K�;���j]����y;���/�dŪ�@��c,�R�Bb䀍ث�7o�.o�^��w�֤N�%	at�ѰP��-��"�R�^��3�[Ax8�h
�5�`�R@FQ�]6����ov�F��!�U�.y��v7���'R(�2�<�8<��v�x����d��Q1"�����b~@������%{uz=�=�`g��go�͟O�^� 껧Gg<�[�������nޜ^4�y�ٳ��M[�Ii�h[) $賭���dxNuB�A1��G�2�U������+@��	䅂0f��,�x��[ؘ*��ͱA%A�qV����~��8����ƹ���G$��<}wt��)���BR@�I��$&�UkWt�V��3 ���F׷���w�4�}��{6��Q�$Om�!��2\�C��E����a
o��o��Q,t���?>��UhkES���E���ĉw��V.X97�ޕF[�3-sdmj)�����e�DG� �J�6��TT�2lj���Np�~%�h�4v+�pY����J�C�6D`t���6�P
���`ћ��z�Z���[hk���oe�N:dД��%߿�QTC�2����/a\��`̳��惲6�nG�ōz�m�?񀙴�LlȢB*P�
̧†5�͈��kil�_-��4p͗y���ޏˈκh�;%�f��7��qlz$����.!�i�uJ7hU�͐fBX�=�*):Z�p9���v���"e�Ohf��_2��j0@L�� ��óO_X&�+�`�*�zrj� eʑuّZj��Э���~9�����4��*n�a֤�b�*��ϰKK��=1P��谴���b���vV�L����[�L�(XUY6��Vݕ�d�ݘk�7T�r^|e�K�q���ձ&I[ʇ���X�u�/i��I�‹���w_S�g:�|=v���.���H�`�_u��]W��U~�t�q�50�G��@���j�O-�������V�yHx]�!u�G����=Fך�J�z��@�^��
ZB�F��
��I:���w/I�}��;�t�<l
��k��[sz:	����>f�e����e�Z̜��:��ٙdU��P#댘�h�����v����P`�kl\�&��c.��R"��;�k��P�����q�
RI_��!x����A�ʡ=/S�Oh��@�?�„`ȽT\��`V�{��#%x���Ɲ"�(�C~�q:'x˼�1k�T��)�9�qR�W��O�*��0��/�ΰO�a����DU�m���Il���#�jώ�0��������V�B�n!�OSyo�D�!�	$ޠL��F/,��hK��#�%��ΥG�O��i���,����RF^�'��_�0ӡ4�'�N#d��s�K��
����-a��zy�=�tDu�Ja��l���b�W��
�]L؀���k���^�I���]8va~�(�ΰe�
��GV���.�`�Ƴ��Y+� �)�wKȱ�h��A�>|j�?��-��g�,<0�R��޸�☝���d/��Ne��QU֯@�ցd�:#ݍ
%>� :Lg�-]0��ֽ]s͚)"y�f߱p5�*���L�ƾ��r<K(�1����p������3Z�m�
���2aKm����2���\�TZ�c/S�����wC]��(�<��/��JG���A�
�	m�]�?�c�˦?�J�Pe\�\�s:Q���6�P��h�T�B�Ґm�����QT�XOYp>�����
�3u�խ�j|�T$d@xR���g키��{T�\��̶��ZX�9ܣ"TݝRu��-��-ۆ�׃'5c`<Aڲ��V*�4�.9��֡����'��~�h�;�>����zI�g�4��x�j�t[��k�	D���"�'�MS�4�V�dG�"A�J�mE$DaYS������X9�-sF,��^i��h�1�I�fc;Î���\gw;�nơ�p��5�_+H[F�����~��Ow6uFӳ�q��ת"��iV�:(gV{�ݎ^���IG��|�\���?h;�)��
��Sf�y+wm�NNqGm�! ���J�a��s�OS�X4�j���4�g�;�+UU��ְ����c���s&Ԭ���{�:��1��4��pǍNq����s'�yGk8}�DaI�+��׺�c��oG�C���P�om�\�~��]$OM���a��/�;c_w�oD��aMZ�y.��@Y�)&���!�0l.�ty���:�_��cmt��L�q��� �������y�~#�����^�{&g�\H�ٴ\�R4ȫ ��r�f
�;�Ṅ�~� ��~�GB�\�hp�԰�ӍX�H���R�h���u��h��f4O�����"��=M��b���^O�"���:[�����v�v�4~(X�[}.ǘ��]��P�]�j�1m�!Z"���8m�em.D�?�6V�x�_U~�8�����gu��e��n���A�$R��S:1�{��I��Z��m� �;��N�‰~�����j�3��AY��6W+'r���+M��1�w8�h+�)�^���9"'UuE��U�Dl�]��]i��Ϝʡ�RL�E�Dwj�M�[-9%;\�?�G�����^E�6�������0�i�Om�â��玀"'�͡7��N��.�՜�PK�yVS��m��H�pip/_vendor/distlib/util.py�}k{ܶ��w�
V������8�Q�IUE�uj[z%9i��n�]Jb�%�$W�\��߹@p%%�s�I�]���`0X[Yv�}�]^5A�3^m�|��j����*
��ʋ�6����rQL�&+�j�i�nog���n��5ARL���LJ{�x�x���J6��UL�i:�W.�r��<� �:�����"m�Mz��ٹ~R�p�˼<Wu2���A�L��C�J��uY��yyy���gY�o��ͳ\cP�ou9�N�����Z	��Jz7I�M�GOv�����`-�W��,�
�:r�VT
���CY���󪜤�F���_���0�i���}��V�|��WsU��{��� ,f�����m��Y��c�z�d5�.��*���I�
EuS�qs?O�!u����j�d�0���qV��08��{�CB��$��t����rQMȢ��yZЗ�|�j�9`5�fy5��W?��5����ヷ��yZ
�?'u�S��J���$y�6M���o�����:O�}<|G�0�7�c9.j�0-z@-�O������
�pZ'	/Ǘi�E�q����J���<�	�U�P
�6�'6��:����/����7������=�U�\�������i�~�bpZ?+����?X����������A��G_���?����/?���wg#��~�𯻇�ZXm�s��k�9+~.��~�e��aY������t������G�;�n���Hu�އ��w�~���N������/����?7��ݿ~����F?��ӓ�3$�YY��4P�x�T�0��g��f��|uu��`� 	�L�eHWi��
x5�H�&�=�S`J*���w�
d	s�ߨs�幪\��u�Z�W��j~U�RK�~�(+�%�z�V��Hr���k^�HpY%3hz�
�:���P:���=��S�)K(X*�@��$�)�VI.��Q���L�MRe�y��TZL�bY���qPd�J��(Á�� ͠�U@b!��R�.>&igO<K�ɕW�ˠ�-K0%y�g�eU.�u48�<s��D�~2��b
�ڲi�H���T�{��HjEᢀ��E�	Ђ�" Q�uj��d���
|"`x��p5��AYA2�ଭ�Y�
�S"?��y�L���0�#�r�F�gSC��O���+��}�ď�͡��EqM|R~�?���e5iPˤd0��������qB���'�9�M�i�-�8�q�.c�NS��O��73?L­�8)�A^����x)bͿ��;�Ƀ|�1�2��m�;K5M�����G��� �f	�����<����Z�A�%� $�WZ �Xq{�Ί+|q�{���ղ��<F�O��Ȋ���[V��&��]��Ia��J�~��������j�4i��V+gO����/���u��,�)F�N	! ��),���K<��Dذ����/�	�����^^�Kgr��K�����?t�a{�x�E_O:�‡�BHnΥ��hm���I��D���tO?��.��Fgy�i,��j
V��S��SYfm]�zO���H��+<D%Bh���eܠ���@��E��m�V�=�bS��5�v���nA�µ��7!9��<d&tyƳ�Q(սg��fuC�|2�1ܖ�5URw�,��7iU��o,�Ly���cE�̆��
π)_Z�R�1�|�c,����ŷv���.Q��E�_�}N��QwEEg��NJ
O�gI�����{�~�}�{D��U?F�A�ZiO��iO�r6K4'�g�{�ĘzGC��B��_�T<�'�kAք(�>�Z�?���kW�%�4����ӷ_kh���2���h�����^��E��p�<|���à;�
�?iݸEr�g`NT�i����-�/^���7�ob|Z�u�`��6��y�	Z2��5�����`F/���E>e�90R�����3��������&��&.�&/'�G
�^������}ƂW�˴+����O=R�"���氬�ZZ�S�?g�A���莻Z�#ct�_���K�	O������z�e����1�*=��O��yҵ9��r��Z�@��s�hpl��{���>H���qd2��?KD�PM��#��y
�hTԊ��v3X�7RU(b��`�Y���I�8T{W�� ����:��yx�ܠn
K_��7�Z`��UpK�PB�\\���"⃵��}�$j����)����ÿ)W4O`�ħ��?$��nPņv�t���\�٦m8Z�BO���L�?�xE�"�;�o��g�z�R�Ij����d����`^�u���e�ujH^�B9��X���X��%�y<A�Ww&-ۼ�EY��H��H
F��$Y�P��C-
�-:��7�=>f��̪=�~Z���⁼|W�w��@<��'�?�{Zy�
�I��1ZB�a�
%
�5
q)<[y�u�����3�o�d>�
�e�[�I�v���#�إ�p������+�4i|�ӕ��^�X�_b�>���7RE���x�}?AA��f��?�FV�Ԩ��&�
6�Gz���	=2��"Cs�GU�{(��#t���9\9��,�
�K�u�}�C�%Q�k�JW
0
�F�_;q��|<O��	&~�v�0̀5D��c$(��Xm�N�7���I֑��,
�rY�X&�*0B�f2>&΄��F&Ɵ���5�m����i�o�iB��F�O�E��'5�Y-..��!�C�!ҷd�W)���
_b<w�T�O��1>E��1$g��b��4��+�l!� ��,��,���Sdj��錂�]��L5�]:�]ޤ�R4�=i+Mp+1:8����x^�#�!�ڨ���b�T}�؈P��Ѹ2�롞�X�:#�.�@h��ԔQ&YJCq�������Q}O�ip��Bk��dU�H`~���v��84�=�w���6��Ճ�c��#�� �:C��%��!ӻt�h0���F�W��߿�����;ow�cXm�IJ�ڜ5���6� �"M��Ij1�J
4�0�����<ȓE1���Y��6GB!�qۺv��(��YV����o�ǁ:�'
����9M�۬I�F����>��i
��Ϫ� ��C`�?�tƕxd���ns{p��oJ�_p��$5�NԦE�Z�i�j�H�4�R\��B�J!P���Hm�Xk�H ��Q)��ma�NA"��y3Tz�إ����1��(���"���K�F����>��R*|7��]��3/�Ҝ-�H_�f-GO����	!t�r�k(N���G�L�T�V���6A-��mb�r(]��e"CB�פ�ߏ��&0FW����|1̸i�(&sDb�`�v3�(H�����/B�^�$���ao0:��t��N�Y�dx�)�3.JT���-��S=��	L�[�0�#򌭦��7�_�հL�cX��	Ŋ����ap���y2�Fٖ�����v%�O��#K���jTTz�E������?:��y1kp��I�Mҹó�pN����诖�E萔���jH�Igu�hE�`��U���b���1�5=

�?#Y��1=����T�����kd;*�����
����/�ɤ���0���q+��&�a`1�0��7�}HP�	ZM�~��&�/��
?&�n�	�|ހ��H�X��&I,x�a��=��6oi��a�^��RTxY5�A�Ќ��ۺ���݇$Ы�BQgT�I�����{��T�1�C�Aw���ݨ�6���5z�Q�'�/:m�D@d��[�o+蝖�����0��{���P�~W@�X�f���7��j�����j�0��؎(���U�"����+Q��a{T��^Y�%Y�ǰ?��Y�%�f�Z�v�~y�'�5F��ɳ��צ�Ȩ�l��4kP�s�Z�]LCۊ��?�'�b�:K���D<�6�*E�fJ򃏮ų�)~�	��,ͧP��O���[>W3@#����A<&W��TИ�NYU^��>४c#��Hp� !�ɹ�c�˲�֣�o�0�FR
��W���+e�NY���^�|�W�d���b;�v��y%�c�� M�f<�P���6�1��a���j�?�|&�,�8�|��kȵ��.r�kZN�%���,~j�[R�Ȑ1t��E�B�3&ym�;2�����6/6���H�v�j�x,XC�Բ.+t�5(o�h�x|ҭ����MB,�kp	�
���:������7!�6Q� ��t�mY�*�.��ܤ잽�a����wW�9K��!4��Vd}�)aL�|�%Fd.���,*�{��e�S��OmY�A� ���BMҊɗ]����@5R�&�s@���> ����r���J(��}����$�y���(��P>�s�ި�>�}�t��1(����w88��!��Db���W�pcD�D�����
S��]�5��+;p��F9p6���ɬw)�PW�,�~�����J��h��"ą���q^���IWa
�\����W��ckD�h7�^�Y���Q����@ѿ��y;�t���8�.-�!u��a�$N[����%��A�<���բ}��N��fy��>�_�u���)ɖư�%7�����)b��X�m�_PB�Y,p��Q����.P�O@)i�#��
D���
�J���DP��ح�*R�;1puf#�2��z�)ˌc�=X���)�{���I�Th���0��l`����Ё>�wN��#�Tȭ�tа�*�B&=�\�`a��fյ�b�&v�	�~���r��j
���ڏY�2ٚe��%b$�Ф�؇���H�*��=�	��O�X��e�Ҡd9jN����W=Y����怚<������oǪ`�fJ�Vi�*|V��	�Q�=�4HNZ˥�N���b�M	E<�O�Q��4
>��P_�ү�~�N�I9�O	M0?i��M�BV��gf'����`<MC���:�,d>Xt'���q�#C��QgW���(�#A� 'Y��H�BD�|Fv1,'�;�6��__���Y��N]���<+�5�=�3����Ͱ��R�S�;ܡ� �ܓ�4�O�U�*�\�IEه��֞0��ʎ�_�����kg�RH�BB�w����\>t9��ŭ�X�L��3����x�l�gz��+>��l������F��aZ�HS%�=w���)1!���4V_lЖ����=E=\o.~:�s͎��������n�R�zHnXW}Z���<m4���I��Z���VM��8���xхs!N%Ǐ�'��p1�hg�K��\�ui�֊�R�F��Z�3B5u��gu���CV)�A�1:���BT�"��?����_x:vJ;d�x�F��-{D@�R�!�Bp`���؎`���l�U�g)���\ʻ������g��PD ��ȳzh��0P�9"�~q��>���0����WaC��D�����B�>x�RT���8Ƃi��Χ��̭�l���͛7�`��>D�_�L�)��jy��X%S��6w��f5��1�Ly6���\5�_�k��_�b�{��-g?�hv�My�yYӠ�Yz� =T^'Sꔠ�ϲS�������ח����F?���R�S� ��pwқ�����{�?�댩�����΃�kؘ�	K��k�rvP���{�%��[�^p�X艙4㮖4��(U���-c<��c��Y��yR��o�&����~�g|���fOB8ɐ��-��7�y�����o�o���Z-��7����7�?���5��)�塅�a3�G���c�b��yXtYV��,���i4M��Qx�H����θ�$M;�zS�<�V�{Z���J.)�"c;���TAW�v='z:fiQ�5��}�,�Jd.>v�8>~���o�e��z�X��F�v<Z�蹓q�!�N\a�Xً�*�N�ݣ�32�`S)��_�D�F�qH��OX6���*�"�1�|Z��$�܊�P��#�Y�:�M?���2hVq;�?v��t��[�u���A%��R�A��Ű;�m��8��U�9nŹxp�h�O{G]<���e=�����将r�V����9��i6o0@�v�B��iu����S}<�߳�5�L��)Q�-�r:��Q�0;M*���UV	���0n���a���j�ݞ���+xL�ㆀ:�ͣb���R-J@���	{εMݳh ��<x8�3�n<�S�a�x^$YΜW�Ӡ.�l�C���D"8�eZNdžC'c[���=��Ƞ4<�xmyubԒ�7����c�u<�x�
@�����YN=
�ԓ�A��.	І��O�l�!䲹�*m6�Qa�s�9�J�R��.��=�)�#�B���$Rr�7�����k�>���_�K��	l�%��!)����H�8�M�r�%�����lފ;��y%����6��4(H��):_q��"��$H��%�A ��S4���Eˆ\�C�!:{M^���ꂑ�#F�����a�IT��@-�=���~�����$Dl��Yz�c4'�x^Z���T���>>�d����?b߿�No>Y�_�
^�88�����2��5F��b�l��g�����Ԧ�|urz�~�"a���!��o����=�u\���v���;0�D�!�쥜�m+���� q
+0���)1��DSd�p�$���n��q{�*M�
�����Y�H�J��ɞ�:Ƅ�����	%}3qф������(�)�rQ���Z>"Uf�ff��ڤ�����F�˾-�+}�����֤�ZA���ՠ(i^�ֻ=��8�:��F�����B*1���@��B�a88�NSS�X�$x�%NX�=�#yT�܄UƗD9��D���f
�#ڑ�tf�l{�Ӻ�0l���Ѝ!�
�t�I|�%���
4��MH��ϩU
��o�p�p�X	��q�A:�����Y1-o�,�b�w��m|�}��<��1ӉJ<�?�����z1�G:�bǻM�\
�w�e�RD�Ϥ3I
������q�R����(�ZBY�upU��׶�.��x<�n��h�+��p$P&���X?@T���g�́(���Z�&NM��0��Q�m�r�,k�����9�:a�}g��j�RU�mǢ�M��$vh���,����ĽI�:
Oѯ`��i�[�0�
rO@�����:�Z�C�°n���<�!�.�	]@��T
�eo�'�TV�$e �d�K$�V��j���hmۭEM���KYE���!\��⾼M*���h��h��bS.�-vm��}m�wpG,�Nс`�tF��'��6��>"��cA@@��3Q$�2�x7tӭ��C.�!=�H�������`�C�J��mU7�'����qS��7�Ue����pfV��R�e�+��Sg$��r(�/K`���`O�ָ[�S(��('?��DҴ�`|`"I��K���*�p��n9�(�	��G�#0o}�:<�	됋s�=]�/Qҡikۘ0���ڭ��Vz�:Y�uPW�,27SYp�^m?/��@�d�6��G�Al�{b'�׼���\s~����j
s���V����(�Da�<ַm��
�D�k� ц�9�E�K\�V��Njd ��
�mɚ��~��n��M��V�$�mU���9��*R��Pn��ts��zd�qAE)C;�{���Q����_l��^1p�hI�ٕ��5�g���Z�2�&"��b�(�@��1mX>1r٨np��h��`5i{Y��+8�Vu:xp��?�;����w���K�6�=F'����=>{���g�s|�><�w7���XL����`o�r���T�>:���_�N�n/�"��B��B��B�Z����Աb>C�8Ű��/����(}�_<ibqt�WԒ4��D��˚l��k'�z4h&�U�])6�CE�T�𣨖�2�A}=ٚqtF$6^vaљ�Q���M_��P�E�̌�Ye���z���N�*<=��ݗn�SP(O�޴�)�Z�'g���S�k�[G'z�L��c�u���&2����RM�";�q4Jk�U_�aLIͳ�4X=�����U��Bx���]��vH��������)�"���?N�V�>�K(svQ�$��3?��Ț�`�”����������S�-���,�/cxq�&u��v�K�-<u8�[ТN.�P
� �(� zo��[<[��up�Ӕ��֔(ջMia�y�{��
��|]2�c��iu)�i��>
)�A���JuR>E��QIw��
`�g�/S�%�������0ʈ�,���.]Z���A0����#���F!�x���E`�z�<R�����ϣ�%�6W=qⓍ��h��	+37V�.YwC�Z�D��s�*U�hu�ި&m-@=��I�^�@v�.t[:�L_4��h��\���|�ۤ�-�~�]\��	2#�\'xn�n�DQ���Ҿ�04j���E�*w�X�-+|M]I��~e��^|\���R6�k�h��T�ן���q�mv�CBfni/�����n@��&�+��66�-'A����]Q�N�\�9��};�NK�X�gM`ȋf��P{���l,�O��5���+��;��c��qJ�݌y�ԄɤY�t�5*X�H
p"M$���P��_S��m�'��v�;X��f��6�d>Z��a�GH���[�v�S,�i|�\�j!��0H�6����?Cqt/�m������-a�>���
��~�m�V�)lZY��Ѥ1��g��'�bb����-�s^_Z��+��Q�Կ�=={&q�G�sn�y��{{��ן�t���+{D��G�a�{Î�hu%.��@�@Ͽ�
���e�h�<��C�Ma I	�UQq��H,�R%�b4���0E*���e�QR�T-�2ԛ�C}�ɝ��~���`�BlQ��J�\����3ݘ�]��ۃrH~�"��ym�5�A�Rgo� &&��P�s�N2Oܘ�&�6x��?�y`�u3a�����t*�y��>�Co�Q���s/����Jy�#�uS变W�
0tsS��B������PU#��}V��5�޸i���Or��t��ʘ�s��T����D��)�I��$�|ih*x�= �
��wpis��� P���&,�@]�cg��{��;�h��>d|�ŏ괇�<3sw/$;
߅֟a�CRuӌ	DF�(�F�a֘��ЯGLS���t0_�ø\mԋsLds��o��rK�qtc]���-���<	��n�ū�9���oO��u]��v�+D�a�Fa�l�+�������k�n��
�ʆٰ�@���ڂ��i���|�ɉp��#�V�����}
�<��m
�U�	�4PE��i�`�:e�~���P^WԜ����2ݹ�D���k�	�:=�?���6�&�^�^4V]ͳ"zض�S9����*i��N���Ci`�&@��)�X-�*��%9�4�������0���if7��=�#��'Ù7�lKWZ�R�!.���=�RX2����99��W6c��K'�k�8��<g573��8.cJM��+�O.����T�Iǭ2�ی��=�|Y89�0A����6�~]+=��C*����N��ry��V�x�TOW�z��jC�vo���ݳ2�4��'�\ �뜟U�/��N:A۷"<C�9�z���>��-��{�1���+�1���)���~#��xaٚ(HG��Pv������9���d�}Q��R+_4=�c��R����T&���3`vC~ȢMЮ]n}�2�˴�'�m�j�f��m4("�����лǷ�XNo1I,2N(=4W㳉��چL|d.�̰5���٠,�;ͪd��4�d�?�~�7�in����c���6	��Q�T{&f�UuD2��[�,1R�FXf�S`�*ӃovȨ%�����ɨv�����P`
{4�D7��e��e�M�9��A�GW�z��	���5گt�-ݑI��)��EO���yaRk]��ÞUCaB�>p&�\�;���h��R��ŀ��ǧ�^th#Q��PBi����礪B�-����(o�s���FSNK�I�z�Ub1����9l,�q���k�=��j��;H�F�B�k���=��.�k��-)���]>uI�Za��v�;"=��֖���ͬ0�8�HV�=Չ*�-�c$�������f�{~�+c�WW�T$�݈�����eI켬��a;�z��T2��??YG+'�*��eL<CG,�}'�x�t�S��c�Teq9��G�Z���
��mv���i��eu���6���I�����{��)gsPY�*��v��nL��h�μc�n0W�5���]��^G@�G�,�/�d~e��˖�z�xD��r�dN��e�wr_OS}���S`�a@2m�BQ{r������U��ߏ+�^������*�4tն�;�n��%Þz�T{�,%Fj3�O4�,0']ݫ]��)�
{5���8Q)�rl]�*�
���U�ܻ��N�'Bm�ѭ��Lg8gY������9sO�o�8�}}c7�.�&M��FY�(.\�f�ػ��T�T�T����_�w�f��ܻ~����wv����ӥ˴��Zt8V���32�e����H��ݛf~ځ�|D�O4O���u)�Y���nm�ܯn����"O��f��J��7�l2?�h@��9��%��	!��Nc��76�dw��i��Ӯ'�4�u�/�O�덚Lu��4��0�~H��a��ֿ��@*�az
���u+xH��wJ�vT��ͣ5v},0�8�NV�a�c6��������9�s{�cl���۽�vǻ;����G�" ��t|�#�}�_�|���_�����R��9���T(�BM#�;n���Sܹ�mr���Jj�y����n,
���Ծ� �yڌv��H�wo�3�h��c�f�*L۵�ݤ�'n2�_̗j�y������5�؊u���F��/d���4<8��l4��1mO�D�3��w�!�Qb��D�j�)�퇋o�W�l4���7�kQO��M��6��&Ϻ�Vॿ��:�5�
��Uk�F<�b�b�-��dX�����/,�H�C�n���ΗՌX:�K>���S�=*�!a�#][�����H�n��r�#�Z���G�X�NƊ4<�Uw4o��fWN��ڗ_�|�=��	-��+�����:��x�jW:e�dy��i�U|Ǟ�Y:��)N�kf1(���>�����q�8��1��	_҇��3���
�%`��Ft�=*����M
}B�Q�v;��������% $AQ�2�>fifH��wyS�	�6V*�I�ފ,�T�i�y����*���ӁWV�����$�,��޾������XJȜ�+�n����4�T���*�W��ȯN��t�=��Izr	�M��N̊j����X���m��Q}��c���V7��\A�����#&�py�w�=EP�/�q�'*�?����+�_��_�ax��m��Ե������������F��(��h���ᷗ���]~�4T���W#���PA�g�XS<�)����oH�K�c�]�'��m�/���:@�����jcp����fFK��#)�/�ܙ$�XG���;�``Pfd +��Z"��{s�8�hKM�^����4)&EY�[B&U�N��ܡ�Ac���n\N@�+}��fU��5�/L8�ܓ��u.�C	����m�O{�P׺�J�l1�ɰ�m��s�"��jY��
��7d%��D~�j�5�"�C���3G�u��|��]�e�(
ě���u={�F��k>�i���i��*�7˼H֝�S�$�P�I�O�H�z�3s��k��o;GG�>�|���גg�h�6e�]�+��o��h�&A�P7�I���ۭg﷞�@o.��*�Łg�d�h�x��l��V��;�ҩ~E��j'
���?�?t��=���Ҡm���c�Ժ�]��-�)��{4��Zi��?��&Ћ�L����0VӶ�n�@�����Rn.9e%N7#��3՚A���<M;�&����� J3%�d��{������J�T�8'�#ʲ��8v�Ra�����&%ȱ��LL��"�;�K^�wm�������#�?E'�����ݓc�-a|�������*'��8=�tv����?���~��14y�{�V���?~:{~��ϧ?Q˿ש(�K���{c���T*>>7��*	���G�?'	�S9o^�W���_b#e���*Ӄ�6~��6� �O��j�|R����>��07�:��� :�M߭m|�7�`i����8�j:*O�)*��5��Ot	S�K�t��q;w�d;��Tp6�뇀�fI��zg&�A�Ϯ�1^v�E_9��N��^+�#�eOaJB��m�5^�35z��~!C(�}-��Π��k��N�i�*:��M\�P���m�=#�m4Sg�
�4��i6Ir�HE��ʳ$8�نð�x�ǝ�X��ڢ:�5zN<,(�.l]Q��9'w�W?���S\1�"<���9;M�ĺ�J��_�ў[�a��	�����>�03\++���+DgTI��v����ャ�|�}/N��|��>H��UY��sI��ǜ`���\�܎��.o�
SD���VoPc�pZ��]�+�f��(�`�<;���Q&�x�r�yR�U\K�#�U
;������yjܕȞZFJ�>�U|���ƪ)3ݔ��0z|�+yOD=ڦ=k]N.���
[U�O]R��)�	
�x���+�9y ��(Mgn�\�l&��f�rq�nжF�<->�,r"ĩ�������Q����w��Z�-L�W�]��!��8��ոJ?Ѿt��;��ǠD���{���tj�����a���r
A��*��y�"�#�r��Ս���������4���D4Bl���w�ߍaXn^�~"62#k`<!�n�4�
!c�&�Ϯ<��>�?����>F3Z�K�ܪ1s�e���B5~�!cb��xr������۬��T�En&�� Br�^�����tB�Ĥu4I�eCo`��
����ч�%b�&�I�# ��'�PN��SRu�;-��\���"su�|����H�R`+W�J��7�43O>�-�F��SɌ��)�K���E�O�O��"�����G`�o�?��Vto6?d�tt�M"WY1��n^��Z˹{�?.��>�e/�O�t+�B�a���siEcJ
�(��ďi�2�`�>7ަ2N�VWh����Ra�}p_.B�9G��j<��Z�qW}ȉ�J��ۓI� h�N�{�8c:%"�4HԌ\��5�5�p�Q�?O�0ҩ4�[7���(1�XxHv�NV��W�41V\]\�.���A���x�;�ަa�kJ�ǢN.RW���6<Rw	wP>k[�:��ӡ�D]JOGZ���Y&We�)S*��T�x)whO��N/=���"�r�T�*�gEg�8�w���IC����2g*+�,~���܏��9�v20[{a����	L'��A�аoX0�SE:�K1`�K1�V]���`��+��L���BӠ
���>!�Ӣ�s駾�W36d���!S>+~�]�0;�%1Hr�r4�c�w	ntט��}R����W�|�M��~w/!	C�҂"SȮ��ה����م��D���T����ߩ��%G@��0���h���EC���%j�dR%�&E���N���(,��e05�[�ÃC�uM��+hʴA�<�R��:ʲ�E�O��S��$�1���R��0S�YC�n4h,��@+����]g�E�,����j�XY�%I|�� 1����M�<�K�V���Z��w�;�C��a�1�K!U��e���)F�Q��K�Z�Y.���ήm �Jhm���7dj����fi��F�6�m��|�uE���z9*�pnH?���W���GP�~&��l7�ӵ�F�3q���	r\b�6����|�d��/Vū(u_�Ff���}a��_{Z��6L�F0����#���a��wo6�[-�x�Kф��d�\RKK��4
F~W�7�>7ktĆNe;�N6=a�E���i���ii07��oz/{":X�4o���s�I~	PI}Lf=_.�f�G0��tV�`�'1����+� "	^�bQ��r�q���1�n���LbG�=bw����z��m�����K���V�i��GM+.���T�T7���>�ڋ*�.\��߸$�����Tj���7��[<�Ӛ�!&�L�t�yr�1�.C��S@��e�c�DoH�ZP�QF̴Q���p@wV���S2P4���ί�/m��@,��r��T�)Z�P6f��ƓD@ZP�}=��$G>�D�#f�T�W�"A�%�@��"�D��E'��xr�;��<V}w����Jb�&������ϗ�M��C��Mج(3B����-:U����N�$g5[��/��pwg���=�u:rh�톋�Oet���C�ȉ�_n���R�R��Jv�F��f��;0��^[\tGt���Jܾ��K�*@��J���4
��.�N�`��}^=Tj�$}���N�)�{i9�M��4�f�?.�"GDU_(�_�7�W*aq����ϹݴjrH״�n���xj�`�N�T��[@8<<�YOA;-�A�����/f�z�y�	����P�Θ2���n���1���8>��|�9օ��g	@�&�O��Z������I���=�c��V�/iO��v�Y�|Ny.�\���'�\o���3n·gι3��漯o�Gd@C��GO�޺�;{<�����B����KƥsXK.�R�>�X�[
��q$�Gz�<�(����;{��{J�y�c|_Q���ʫ>U�3�X<�uǜ�ʨ1��s.]�*�Ty�Ġ>f�����C
�ד���(�j�s!��ciǠ��#�����R�J~�].$���*cn���7�:N��|6�a����q��n����I�^�z�HiBMpZu��3"�o-0����A�Cqu>v��9�A"Nn���d�
��%:��-��ʮ���rD9ݼLi*|�^�Q���At�@g|?uF!jg���iG�/o�h�W�.�,z��%B��-���C	����8�>�=~&3�|�����2KQ=�p{�{6ᢁ����&�'�MLŸ�`�#�kx�w�~k�!���	����H\&����N�EGI]}D*r����2Ԟ���
"S~H���P����1hǒb�����KԵ+��A�$����`�-}sO��B�[�k�����0�_�}�Y~��H��e�uz��(�)tE���UaAs�/��9���J�K��)nU�i,�⤼m󫫫��b-�u�l������o�I���Fu�:�伎\�Qق��np��I*:-��4̡��Fj�Ewƅ�t�7��%�r"-��j�%W#�+>�(
ɦ/�R6�$�f�e&��{�������ξ;��;+#�L�B��Z>i0fRT����I�Uo���A;[]_��J��)�H32�U�C�b� *D�E���.���Q�óKt�$
�n�=�֍�[��Zҙ�l�'KV��$2"���M��Pw���������E�j��>�Ծܹ�qKI>���St�N�ڵU�Ќ:���2H���uQ`��YR��Ó��k�`���/��T��-)����>mƳSɳj5/qŽB��;=������dd؝��|aR�)9C�b��y�.�m���w�_,��:���m�Y
�d�l�r��@����*�x$բ���kuzٶˮ����s9 UP�\�#��j��z���r��ܗ�Ip�{��|��Z`^Cǵ(��4�٘���Y߄k���:��Y1���
T��q|���F���bS�5W_�w�U=
�kA��_TP�B�R�:��l[��
3��D+�����8X�Kڛc��@�N{���@3�RuT��B�+͊$�G\wv�%���
L8�wk��V�h:Й3�9%+ы7�f����0\�`�h�x���q� (ˠ �HfN��x#t�n�{���X�U{QH,Ģ�ݵ����݋�ԏ�n��d�Q�/tԆ1��w1��.�W��?[
������.�Z���-��fԶ��w��>o"���|����=��Yw�F����Y38�pkU�'�u<ԼʱR����&���K�/�n���$��L��ń6��6��@���Rг,0N����3?r���,y/6�`���>N���*�&�=u�&��z�jԱ١���F������.d^./��^�~�Ǣ�������������uNp+��&v�)��st��|@&��,���6����8t0��vV�c
ݙ<xb�BM�Y �٧�B[�Q��%GR�)7`|�`4���0Mm���Wl�{��,���a��ȸ,k�CM�\��?OK�Fu�P���vW�y�����^��S.Ğ)MG4�D&��F�I�=uW�W�r�t�����0ߋL��Zp;�]:����K��!Q���|@�Y���R)`2�)i���C=����t���൞����?��T2�x�o<fD���?��N�n�J�O(� � ػ��#��%�f+����~��J6}����A�-��=���&J�-���7�@�z'�\n��@�˼�!xL6����8�RP�Z�7��]���e�D"\�M.�7v9�ܖ�~erFK���5PS��Z����@�d��{zL�G��Hgt\���e��ʄN���%6%� ����� Y��qhEQ�hGx(^��=�!f��qD��n�D��dl�I��-l����k����u����8��Z�!���@�YV��mn��VQT�����J��@��ڼ!P��(!��c%�W�tO���޳�j���u�GQt�L<�r�������O� aVL��T��??
�S�_����P��Zţ"��G�1{�`q.�i3@�7Ɂ΋�+�#�.�4�[��I�Sr��AY���ˊ�D�]���+���E�MyRaH�$�V�]9򄚐�6�����(�Fֳ7_~n?I�UD_�	Y��HV���?_��gn�{�����T(��kg�mV�'����矝g��=�~�
>O������ǟ6��&�����?;i��Y�ׯ�8�E�o��W
9��n���T���\5�	�q���f�z�8hI�*�r
��5���`�ّ�Dф�%�����F�(����T^�b�)J���W@�f�_u!}�ٯ�eb�b���A��(�D⓪Ĭ�8mk<�K���{E���ߏ����?:��>�v���I���2��Q�_��8[q�~T&�(���&��q�b��\������a����q"�R����1�1,���934�O&(W��Ͽ��";���cHx�NS �,���
Ho���LyBOx���*�Sެ��Ŝ;��+��N$�jn�wR-i�OL_����e�O\SX1�
�zZND�������*�gF�P����|�f!@E�f`\D�̃�����8t+�+��p���.�	Ią�PoS�p>Hrw�F����\��H�}xs���njz�����1Gۇ�_�\�>�ןի��O��3�@Nw@��-ud�%h3|n/i*`��`�#�끝yD�M(r?tD��Ϧ�$p����v �_k<y��ʬ�K�7��r`N���C �8�˲��=�㨜�)h�SL1e�4�%�We�P�:zQ�5�4��(쭶O�ÚU��O�^~��g_����/��ׯ�p��z����6_��Ͼ��͗��V��6^c$�M@���%wu��q��Zp�+]sU�2Qb
�b�TS�u�\቉3�jE�b���0Ifr?��cx6V���l�GZ&9�j���j�snir	ˆ�X�X�����40�B�T�t�{N��l4��X+�xx�}��3s3Ź���:_�<P�F^�2.kM��a� ���֐ĭ3�Ħ�/�G�=�4�:�������CX�O��u��MA婳2>�>����x��f�uA��-R*@9�CT��L�G^��Ѿ uf���Jk������[:��c�P�W�̀4�Ƽq�K�h�����o����_��x�R��S����a��ʱiW?�k�l�PK�yVS��2�~�[pip/_vendor/distlib/version.py�<kw۶��+�9$c��d�i�q�4�fO��n��ʪ.EB2�TIJ�Z7�}g	��l�q۳nj�x���0�>�>� 
�d>d�b�K:��}�6]n�h~U0����������+��6�U���tV\�g_��$�(M<�y�9���ۓ����)�������}��ŷ�ϱ�u���:�˘/xRPo�Θ�f1���1gk��P
ȱ<��fl���(���r�f��;;9���N΋ղH�8��b	0���Q����N� 8q:�C�z�x�3��� &��"�V�b��l�*�XU/�,瓌���2�V�3��q<��c6�N�l����<�^�a�L+��/`���vX�c}��~��:�����r�ZsU���DR���$��;�y1t�Ɲ�g0
I)���2{2I��L�N��~��-P��x����WQ���U�M-����-���/����GV�gl2����L��3��
�ě��i���K۩5�e,�^��RZ[;��"�<ʣ$/�$�6�w0a��b��{�z�e	��o�G9g�iQ�
*Z��C]�*X����WS���T�'�~��I��@i��
��4�:�ѱx���к�j�L�'IZ0d��6���b��1��ք�T.R}�
�E��<�׳�\�cK���%|�p�A���4q�ǣ�r+���i�e�M�c �1gr'5����P�*4�UQ,�O��i�{K�;^�͟f|�3��)(��<��@]���d��&
w7��J[[cR_f[{�=�m�1l�=��08���SR�5$�����;�>���[�$ٔ�|�̀$p�ˏ�����=��Ri��V�f1S��i�Ւ�Q£8�.%���z��RE(�����g�i��~)�`���,���gk�.[�vMPi1�Uk�WF��ǭ�@b�W�]�M��ۛ���l�M7���*.\��1ǯثc���a8>jo���W���R�r�X��V������@k��p���g)�IFƚ��t�M�	�oijl��j4m�Ia:ȥm���Iʍ�/y�6@	�)Ū��˘�ӡ>
a���]��N���C�\�:���YFf��Q�`��װ��XhB0�.�1<�#ZW�Σ\�)�q�hȎu�30����"7'�_����?������-�t	+��hD��O�D�myO,��H6L�D\j�.uili�N�K��"( Ȁn!!km���$�&�K�.���v��M�k!�3��m��=1�'ͮ���j�k0��?h��@�}�|ɢBTH�f
�A�̢�Ѱ;��"[�-���
�B G�oZ'B��*$Z�7w��N�d�q����+�ޖY_W��d�/�+�DY�DiTX�V������}�֍޴�<�f�md�
���'!�¦��@\����P�q����-�
�Wʟ��-��r�%�z�����Ð��7,=`��G2JU"	Z�!z�s!F��C"��_ҿ�WK_}.�L����֜��^W����"\�CH%a��=��k�j��l�m�f��9���I(��/�L.��e֬�u��ʲQ,�l����R�BR<&�eW�b�:�]��l��ֳI��H���i��D���A1�c5m��0e�j�3��hv�e��,���OW>h�i5D�c\��h�����E��#�@���\������'�F��/5��y��k
�s���Ug���9;9;:�M�?y������I9�Q#X��a�ھ9�Ǿ���ım�vz�f����N+����LA�.�� �#����^�cDG{s^�O�&:,�r���հ�Tn�(iP��*Z4�BnQw׷N��YQC��$�y��������d�������!ŶF�$Z����e`M[Rz�q	N'�9�1K!��m��qs�*��(T;��>M9Jo\����A%�Q��ٲ+A��@�'j���
I�lP?�K�]W��ް?�q�m]���$�|�$���blIZmQ�[���g�4&�B���u���/t��6�
��E�.!�XP��A+�#,�U�UD��bd;꫱\�mC<����*�E�R69���<����_�QX�#Mw0.Ax/X�wP��MW��l�]E[CxSrؼ'Þ�E�KVs�"�k^�����b�д�R}�r�Z��ڽկ�ңمH���Z-���RQH\q?_V��Pݔ��O��2��y0�&KH���g���(��ԗ�	ٜ��S�&R��T<��V��^%�R~�\�VA |�{�1P��$�z��_��xA�I}B�A=�hn[k"��7��9�]
��=i���4-��U�UiO��T��#�/	K�/Y�.a�"tW0(�IR2ND,HWee��q>io���{�E���*.!}ï�4����c�TF�aM������m�����C`�Ok�A��;*�/���o��°�䋦+i@���j���Q-VV\�H�)L��j�6E��<f�~\�k)�&�+`��hY�W[��oP[?=|�_��E�у�"F�3�RNq5d�����
�:x����V��1,P���U��z僶v���5�\C���r��Al0 SI����?�'�yϼ�S�#�hF6u!�ZhU�v^��:� Tʮ۬'����D��7XTbE�����'_O.�|uN^`a�HZS�ௌ~Î���o;���.�KJ��ǦpW-�A�ci�!'bE��m��*2�F�s#_7�ιAf�4�)#�R:ހ��R\w�D���1������7���R y�HSGY��ֳ�������ƒ$��]K?��ZąU;�R5s����J��U�z��jZ�:?�F X��U?YR-�W�}��a�MH�A�;�;��2Sݓ�5QV�u`� �4��P2���b*M�p�``v�Z78�V�^�黙6Dq�K]!�<�5��ֹ�U�!$L𢷃8"F���(q�𔥂T�?.�
�_I��T}d��ag�5o���иI�qRK�2�f��.p:qԔ^k-롽֐dM��cVV6�E,�5��4J�J�H蜈̌n�=�	L�]�@;
��&�}����e�������L�6��o�髝��Z~�>uCO���]
@}��6�L�v�j��휠��D+�]���p���P,�+y�A+��+�c�?|U�7��=�S�������߲J�w
�[��<�3k)�]ǰ�,m��j���ֳ�߼=�����A�z���5���O,\B�����E
�eX�����2뇑7�/CAeVϻ�ׁ�3�cQ=��c
<؊M�Nw��
+�O��K��8��'�6�$,'`��^
�ږR�e��N�$ā��@���.��z+�����2p%�y�T�hE\D��VI��%z�M�.���[y�;�S����R��V�/y��LP�#�T}O� �u�YP�#�`�Q�ga$7em<{�_����Zf�&��}���c��0~�&�cv0�}9��O�{ty9��%�Ur�S^Ep�gm�>&Ln�-@Ж�p�1������N�nC�u%[���wߜ��vr��֦~�k�VG��j>砮�
�*�
:�ߋL&�R{L\Swz@�.H�V���V�Ǖ�h��2�S�0W0�[2�>a����KB:
U��:�U��T-N�@�₡&0س%���|5���+���Q��5�g��ԩ:�@�i�P0�̊����c�_�*^]�}ET8/�T�����km�e���|�L�S���|5�B²��hQ�fG==��l9°���EM�ī�mi��r�8T�
u��3�%�#�L���)���j;�]᧲�v�B8:�ǘ��A	�ix8nY�;��l�=�`�;`��J�C�$��4��ܟ��\�6wS���BCsc�b�HI�#\�I�y�B�u-A�xqm��Ħ�����:&Q��đ�@���j΄)B��M����i��)L�+��<Z����=A�w3�IW*ri6gDF&�CB;��UG`2����
&O��.�b4���9�p�~�hc�:b-�j��$�ę�uyuPI�
)���=T�9�A���L��Y�l
ƽ���iγuy{U���`���*`�)��ls��c_0�������
�_�wWDγ�[x�z/\v4��9��4��]68�����{q�X���Q����!�+ψt��_)�m!�H�M�=?b�g}�wT���Z�b���U'u�A�?9�9�h�+{��(k,��+� �:g�����"�%�UJ;��Q��妲.2��i���p�@�c�z�M���7_�r��\�f")LR�R:-"���@���?p���gѼ�{�m	��B�2�鐐ލ���.l��K�+��C �o;�.4�kG+�KpP�5J��Б�#⑂0h)ɢ|f�᮵ҥ,.V�{�̶+�+�.EG�ǫ'baj)̺������{��KZhZ|�0����VN��ժB �[!Brso��!{�2�p��B(�RHc�ȿa��p	]Ƌ@v�9��0���
�	Ӣw{�O�1&o�.��R8p�l.��s6 S�0�nv����x���d���
����>�?�2��>����6���-�a2d�]z��]��(�Ij�xǯ��KﵜV+�ua��2-/H������7�����z�
 e"�4�EZ�*+V�x���g3LR�UƫB.��q�y�{:� �qʇ�sf�pP]�/��"����e�l�7�N�bW$iy8�N�����Å��ޞ���/5�����}JV�ZP=c�s�٧��EL�Iƛ�쿪m$�d�X����b�?��p+�K
��6u��ߗ^��3��8, ��P]�2a��Bf��<�Q��"�ٹ|&�hI�b�����GW��p�>�|Ô�2㪾{��.�[�M�wǘH��R�AHX��	EQ)�R�6
u��i.{�x[��,���9��T>������p��ߓ�XY�a�~Ok��;<���!���X^o���[72���v���Z���@�PЇܗ�^�:m�@su��X68�"�8�ͼyT��v4�����Ԁ��z��@�̆��`��z �vJ9��o�[@�\�C[�ٚ?E^����w.u�-D �2Q�i�ݠ�Pl6J�uį]$��v�|���>�-���V½�)�:xU�XA���
���-o����(3����>(q_���l(��漲��k�gy�S
�>�C�/��J���������'���)S�޼�h?�R���xrĠ�&����h���(��0Ž�U�̨��je]|#��UE`��-p����^ȏo^���
'�4{����(M�nMQ�g�S�F'��ו^Q-O�+uR�}ɥ�j��1+��Z8K�Ӱ
�c|�^X�W�q���3�۟=�1���X�-��eF��i���7d�	q��%I�W)b��;�؂�dj���D@T���Q��Uٱ���r��tY��؞�i��
��Ȓ�"!W��U��ZB���kqZkl�ߘ}+��V�5�}���n��n=o�뎥
Z�hk�zyVb�z��q��6n5�|�[cEE�4�0

B�=��Z�0�v���F+�ʓ�I�w�Qj%_^���!T�@G���\7smy.��P�w�g��;�z[]���QF��(s]�8�aa8k9'�s��4Nۄ
�2s�ш%ic4�Ns/+�}Ꙧ��+p�
�~� )��o@��X%����l�h�.��^�Ey���cd�WR�.������չ��Zj��<�;��@�֕;� 'B~�.X�9O
���}C�L���])T��0��v~�?���CVu�?A!�1I��"�Nߠ<�O{�V��j��
(tQ���y2J��9ṿ�*�ρ�.6>�QNTPiT�B����YвR�4�f���q���BG�#|�=�#~��k�����rP*��c͸J�p��[!��S��u�A���M�X�F��NWQ">��A�.�tܖ�gX��2��2��F)�Q�;��A�׶��v�١O��xt��n`{?�Y�[�������;?�	�r�*���8���q���(�)h�޴��dV�0��X>wt��uv���Z>_}����j(������O���9��H�:��
����7�Z���\~K���}���E<����+Q��8���<���`�%��I�c-���¯rj�s붭P6F���'�f���bC��`��ܑ�W(�$�x�g�*�߭.���H66���[��������7'�U������o
�Z��m^��z�V��H;�gp�p���W.�k:��B�$�h,a)y܄�Kj�.K���3�""��#K~����T��XY�g�m�#�#�̑��E5���/ϭ�Iz��o_�7y��i�I��f�?PK�yVS���)��pip/_vendor/distlib/wheel.py�}kw�8��w�
v{rI%2c�ӏ�g�I�n����N�g��0�ٌ%����(���o= AJv���=wx�c�
@�P�
����o�M���[Tӝ����ֶ�<�WEru]y�󁷿������k��+�<���!{��EZ��We^u-��Uu���y6��q!���"��U��(��K�"-��]B�EZ!�s!�W'Ϗߜ���ʋӉ���wg'�޿{{v�/��ִ��^MբQ�%�<+*���PD4K*QijrkK�0�K���
ˌK�
�&�d.����L������D��D�d&T�븼�%#������,U�g���U}�t�yV&��V/

��^T�L[�:���f�$����.Gѭ(J@v
�IYA7�?�E� ˎ�94��m�|L�����$	0�޴�����*�V9�Lf�V	�#V������LL�M�ۺ���b,���勡����ы�wG�˓W�o�^��~9>~����ϫ㟏���]a [G|�qxos  �!�!`��p*����_�DJ+���c<�����$ʋV��w%��^F��!�j<��gl��N��	
k泸�f�\�[Σ��)�%_��W�a�O�E�?�w�E�[[Hx������(��d[[�U(�&Kvb�C������
1XBS$����He�*_i*K�i��v^�W�K3@,�N=y}���<���繿%f �j�!P`h�Tׁ�)��7��i���/�Y�o
%�^����~���,:��_��|���6.�@K�M�� �Ҭ�j^g��V�����Ld_�_n��
BW��Ȩ��矌aX��Ξ���$�B�����8�7�|U���"�-��QcQ���ך�qN���1
�Ab)ݞ.2$��2��=\�^35S/���܊(%��O�-��04���0�t��t�8~��g߀��q��t��F�~;y�Kt���G�^�}�s�)L��7'�߾8��O�v����^�[g�~�)KҀ
���*�=3�nm)F�C�Bо�5(|��
��������w.
�v��m�����y8�
���x5�w.���~X>����?J��_��p!,�!\^���#�
O~~������h���s�������߯�|���7?�����7�P|H/�D��/`_;y����^����G����G����Q>�ɀp��w��}�G��7���Ə�Y�.}�Y�"'n��g����d�Z�h{ف�K�]@�m9D�����,.K�5�����Wcm�K�(
J1�����-��[���ؿ��#_kx�dB��n��=o@z�Z�6p�j\̺N��p��@p�bܾ��ݺ��V'�<�]M����[/I
6#���u?Zb�o����e��i�N�y6Y�Tߧ�ٌ��9D	�4�
�Y�r1��@khRj��V�����:�⎮��vX���úą�y��e���_�	��'$��:�G3�⾞U�k���]�		��J�A=e�$뱸��Q�D�Uc��Q;��r�Fqao���L�M�{��9������
�\�(U�=�c֣�,��r���<�7\06G���o��s*�-�ل�����o��ʎ(����{��� � ��G%�A�==fT
��5��u���~M�K#�J �h��$W��KP\�3O�+�fЮ>'*��'Ny�Xx�D~в�[�m2Ѝ�N D
�0N2�i�p�-f��;%��]��xK�l��O���_��zi�BIh)��o�V����8]5%�V�!�P ������Ԁ��$�aS����b>_����w�=G�H7"9�������l�#���:P�[�f�^)��yxUd��$cXs��U�&�
~:70��m�L�T��7�l�<5|جcҕ��k,q��Y��
�;]]3��+�RG�6ĵ�Hb���
n[R�p��/C��+�V�s����I&�ORZ�uػ���7ރ�����Id���^[��xT��@��1��9g�z�Rn'~5�)���@ž����]�ep�Ifp\#.�T�?�aɐ��My�d���&�ʸ�|��p����d��Ce�c
:��&�l�1���!��=|нa(�X'���!��.���F	xY�$��v<4Jx����u���5��ږ������AkΎ��T\����>���w���q3�x�$>�)����X�5�4ﴘnk|�bRbRP:{P�W��Q���Wr2}�i��"��ƨ�._��n�X'M��n7,���ʐ��`�mn�E��J�'�h��Im���#�\
Z)�2�BmR^h²�@�� [7���1����������ɗ��P���_.4Vٿ_�6+\�Ba�̅O���f�L��S "
	�Z��݋$��d@�@���m�6�J@�u�,��6�l{S��/�\�Eת���S\6��c����uϭ�|@��l���X���{S��1^F��A�K��)>D�_�!��4hA$�M��S�)�"��`4u�a
_y�H5�p�S+�ʊ�=�g+�UB���X�m�
"���:�(��,ˢ�Ƴ��%�҂�]H���]w�&��?Oʒ\�3��j��\�{#�&�Ǡ��4�8�����#X��ӧ��d�w#L"�N6�"O�F���L���&�[����p\��VwǭŲ��R:	5��F��镤"�m
��4/�<*c��
�N��g�kŞ�7��J�}�A�Ժ���	��8Dq���H&W��!a����+�A����G�2��
��l��6/�"�d`B�6P�׀hAZ�
�r	g+�$�����T)�`p��w�A�uu�5sHr��Q
��wd�G���сƅ$�-���P4T�ٴY"�[�0�v�l��B��+�%�Q�
0�f��qq y����A}��S�P4��n�Q�w��z��-Ɔ�-��z֦Y�â6�:���U���~���$,B{t��'dԐёz>�6Tq�pl�]$#� {��*+��ΕQ�ў��K�v���DY�bA.�YOE4��Hq�
�� ,0�'2=�E~\�����[�z�a7Q���/�� �u�C��B�w��X�<�s������h��-G�A�-��bFV�v��f�ʽ�_����t4�	�v<�C�-�%�n�B{�p���d���qXJ$�^>܌HNA]��ؑ҉ŋ���|��
�	?�ݔn��g�r�՛�0��#�	�[�XPpp9�1�!�K�������CU�$
b�V�O�|1E(�o���(�)Gč
	�@N�"3Kb���?{��X'�=k)�E��Y4l^Nn����V��n
"�D��,�󼋌��%,�����������pJ��>�lg��
�ߊ��w���E3ʍ>!/�ۊ���@�n�6���W�t�Y^���0�r6ò�\��i�[6���Eɒ_�#6[���&(�͓�}(��`J���N�.�ros�K4A�MF7b��*ǀFl�A�<�1X* ��2�8L.��%�úP�}^F�ݟ
�@Lc�2"�[䐷Kg!�c<zv���3bP\�G��RU,����tt���t�I�>m����B��Q��0n���J�պ|7jXt�;aT�f���,i�w"��`����I�6�t��T�7���\�w:�۶�2)�{W�)l��	�K�<bG(ԫ��o���@�S'���Im/�c9��*�a��$�Ɔ��I��Mm�`��&L7��y�
����"�*ܲ�rXs$���g7]�T]i�KZa3VWqO�����MO�A����3�D�3'�ճ*�"�A��{���j�IEަ��:�r���ϢI�gc٧���Be��4l%m�����ͻ�6\n�Xo�ek�5W��˪k���)nwFu%T1�z�K�UK�mڳ�4��Up��W����͹�ro&nA���aߊ�+�6슢r�M�T�$ UT.͖�e�@�iu�t1���e�MRs�N:L�hHM
��lv�����&�;}�����q[��x�����"H1��b7W�iqN񔒿e[��у��9/[T^*>W^�H*
ܛ	�Vدǚ|\��w�5v�P�l�
܁a��OK��ܶU����m�s���TE���\��QYI�a���@�V�"���8,y�f���z�2
�RZ����B\�j�
�6>ys���ի�3�r����1����6⻷�����Fj���zE
��+�‚d;W���$1;�����v`{6��Eʧ�hr��JG�yͮr4�sR�p +HѺ.|iMh�E�}�(�������w���SK�����}j�ӹS�~��Omth}e�v/wU�e'����t�6 ��/a9�V�2-��j%�}�oRŘX5��F��$X
���tE[�-�J&��K��%ƒ�޽LJs�x_r"lY#��,mڥ�b�pl���rU:ʵ2�[%G�5�g�"Vx���}�h�Uc��ĘZ,>�k�y8���4���1�H�a�mf�z���]x�%���m�h�.��I`�&��GҖ�`�������B?�8��"���A�y�s��1�UK���4�[v�2���A�!��[�_Wu�6���~�ܫ*�U�:b��[]�-�>J��Ն"��"�Ǖ��Ʃ��B�n�RC�l�m\Dְ�(�7I���S����%��8~Oz:����0�;�ӄ@X��_!|�r���Y
�/��5[���SqA�;��3+3U�rMPn�K�	�m�E�	�0x��m��uU����WPp1�#Q��U?&�8	C�����ɝ�����U��l���Ax�`
u�Q�x,�ާe�fV9���W,��o���<����Q��o�C��S��}�`����z5��CT0j��1@�)C��-h
~ӑo&�jY;(��$Ǖ�Pr紘��J�J�(INӠ�1h�D�t�d�$6�`�&p�q!�8�T1Yˈk}�m�a���K�4��!:���˰�
�
�d3�8&�
GX���~�HS�ci�,��0[�#�C=ti5~���\���<
��x+�Z�<ZU$���CL���|(��oYW�S�x��!f�,���!7#��0§H�ev��~x��J{'��=C^�\f��|4��j-�b�O��9��L8��8��k��1�3�5r a�c)�4��-?����UT,P$��ﵨH�
~�u�FU~i�k�r�5p>T���5���}$P��}6�*K���Z�՝BBϟ%���R��wm=�	�[� t��H��kF�9���iK�=ώ�t?n�F�n�b��`�=��7�.��e Z���]mh�j��lY���g��%����hG�&�N����vi����G�i�&���V��8�JP"��GS�����VС���A��6�2ǀ.�K.k��<�~n/��K�<�D�Y�X:���mIy�A���bY�oE\�9�%*�}�r���&BF���:!#��fn�@n`��o{�ey�����rC �/�YE6����
�"�T2&��*�Ԃ��A��"���A�^d<��+خnȰ��[1[}cˀJ��%UDR�v��
S'X��N؃�U,�t��Z>ˬ�ᕤ�1��	~n8Y��*؂ڡ]�mēt�bb�h/�1�(���0�K�zRZz%�r��屲��cUb����X��S��Q��-����q���/$���N�)\��n-U#�O���9���Y�HL��}XDuK�lw�b��<<��8���mTO�;��� w<ԜM�s3ArI-/�/�qTA���p��"��
;��yRR�.���N���|Xc�o{=}�XB�ei%7���v7ՏuF�6��Z7k4�#��qgCώ�s�^ֆ���w�k�$���0|��)�3��P@��b3T��ӡލ�<]��A^
��������5ĄO�
K�H�
�^��v���;��Q�R3����5��QhZ��p_7��@3�~w��f��Xz$��v꼠3�����`#�]ٖ�?�[
5;FG�Ck��֚�^R�A��_[h�I�����QQXρ��2%)��@����C5��9�N������/G�tI��(��j���\J����)�Р�?��=G�*q���(����K�dmt�zF�Jh��r�A4��	�SQ=�%��g����ݓ'��ay]�g=�3/C{�E<F����]��IF�/V�s���+0��Su?>-�1�Ĉ�/����B/hq|=�&���'7z�T��, l��So�����{/_�]�ڗ��H1�Q���F��
Ge��q�W���Q
�5�>>�V�^�J�[-�l����+(b_���ր`s�O�{�Ϧ���vx��@|���_XРXhXKJx|mLs/���e�Z2�y��|0$�PqJT7#�TOQ�W��ac=t[i�Hs!B�+�CD����.�vdo�"'�Fv#lM��ɬ\��mb� ���gX�u��d*#6�i;���H)O:d���;b��y�9�@���W��!��r�X@���ny.��ǻ��S��Y,P��A�A�8ːk�Ö0i���Î�ځ��}��C�m31z���?������Tn��Qj��Y�U��e�X�RL؇��	�Q:���pZ���mO`	�*tO��]wh��W�X�)�
C�Uڟj�m8��hGX�%���H�\�^ «P��bA���U<^�g#B2�Y'�=K�&gr��Cħ�$ച�v��h��m �텻=2�6E2��
��\�ǐL&�(��U���;�����9D���i�Q
Hf2s���|��ix��uz�i��Z��ɺ��vF:�B�D��|�<��d.5�_���&�j��n���2$�N�e-u=%�@:XoC�]���w��)|�4!@�m8���)�w��xP^r��(�mށ��m�R�v+:w�m�R�{�P�X�Ni�[ƽ���x(0PTZ3�#(}2���ݖ��n���n��c,|�g(-�{9�NO���ԃ�
$��-P��GuD]&�z���Je�����"���G����e#tI��eS��j.�_�Ӎ*`�`�����.��h�G�4��mn���A�6��\
v��Τ�+�Q���B���{hϾ��[3
��]�a��+S�7f"��ў���!��rKB���x��� 7��^	XG>2��{�Q��~�7qm��9��\S'��=T���=��:e���:D�OWr��yG[�%��h��;2���cqȷ�*ß���JP�5�i��=��WA��ٷ_F5O0Z%i��q Ey
��$¬�4��)vFt�V�㔂zZ�5(o�v[�;��`)8�T��r�D��yg�O�Pu2�Ҟ���yY��H1@�fX9$�`����hd���L�˖]'Eg�+	�t�Bٓ���v��'(�[3���,�3��J�����r��`U7���/�@�̋o�d�հ�c`��23�Е�ݽ'��FOw�5��}�V0R�Ocء��z��@�l��+��ү����%�0~l��b�s�a�ЖnC��_��������;���Y���BwUu�;w��n��Ӻ��Rb�6(I3�����u��!Tޣ����\�Z.���c��nh[��H"P�<�mVp���|����Yb�z��bτ�k�!���n�?3�9j�
Y#zI?�s��{�u���I޹����hNWPnZ]�Y�\��<t�5���BL����oY�������_7�B�]��z�}�)�c݈D��z�hy!�:OˤL�e�Y�����ۑ�4)#��3�z����>�p&�-c��EJ�t�`��O�8ڷ:7�C��=��@p��{
0��
}Z��{�am���N}j����ً��Ԉ:�I�׺FDZ/��.6ާ���L��
�2/1�(;05�jO�%��l}�ԢN���w����5����1��х&��W�G�]^��Δb�Ҡ7�O�I�qq��輁�g�!'�ԄK%ƹ�v$�UuA��v]��꭛ܚ�b�HJ��m�g��J%���:Sͨ��"j�����u���Ղ���EZ��?r5i��x7�#�ֆt�'T^����2�����s��ց�oNS�}f_�Bξ�M>K�Ϡ���߿����m{�޾x�O��2H�J���������=��lrt�[�ϑ�mL8!Sl��}��\f#(9^9e~�@2�/;`�
�hL�1Q4��4��0_y�`2���٤���BY�W��j�,��p02ú�V=g���5!��0w��ʸF������I8V�ʍ��HUg���G����t�j��5G��yl�^a��Y���]�I��G��ǣHv拡Y-�g��lR��_�^���=a��M��2C�Ƴ�/���e�
)��jL�����.2gE�*cDK\����~#Vv"��h�W�t3ѽ�P�c�8�Ԩ�f���"[%��)f���e��J1f�I��_2�ep���8F'�"3�/��AŬK����`n-ڊ�n��WD���Ћ��>CN9�u6�4*�"�^2��V_t"��g΃��
i�4�ʘc�K&�l-���ݖ�dge��f+��"x=��*���sN&�a�?*j��)F� :�"��L��G���ҝ�:�Wʊ�
]Zu
�T6v6�![�!�3�z�T(r�2��4�əa Lh%n��M��2]�_�#R�$�v��pg�̨Ye^�V�*�\^�X�PwQV�ig���yb�����s���[��([s��'ǣ
��S���רa�C�<+�!�s6�bK���S`�l`_�Ȧ��o�$�ʂ�z�݂c�UG����H�xuO����3�h�ą|��`uC;)D%+D��O��H�G�ށy�lW^þ�wI�
7谊J��$wq��W���e�q|}��n\�#��o���s�w�JJMf	J�TVO��։�"����I��O�9r>q�GA�c	�=>l�X��ڌg�V�U�'C	���8���A�]<(�.AkBoO�W�Rw���ģ*��6y���@��0�ln�Q8C6�N�W֎��U�i�g�C�֐ﮜ|���O���*�>��#�\���>�v�C�Zt�5r�Κ	|��\P�`#�T�d�:7W�����$�@���?�L��th�)��ݐ��ъV����J2�����+/��+duy�P-���䭑%���
P�k͗�h���X����d�!�r�o`��a��d���������u��^��2�Ωq�]e���� �w<�z�:#.�l$�*)Y��9���{6��C^�;�����B�C��������az���(#�����07y\�;���I�s��J��z�	�i{TkE�0��u�z�9b�"�j�٭��\���Lbm��_K\����*��x蘼>���7T�w�	nm���+���^ےn4�TN�3�w,ݩW��&
��Ą����t�1�t���a
��!�f����
���눅do��>s��
B�!�w��L�g2O|�B���/�Ă����~=>��߿|y�F�<��!r��DŽ��')� ��<:hقڸ��
�?{
u�fuS�T�.�A��%�K�%	Fh�NI�D�t���{�AVc~o��ĩ��fB%oGk�,������n��j�;b�}Ih��ѳ4B�o5X*YǍ@)��@Z7I���r���:�0H�'j���21�ꝓ�Cޱ\����A|��›?����Ѹy��x9=45�R�C�
f["�B+9����'�i�d�n�����~�{��\��9���;����?���dC���� ���n-س;��O\�F	d��i�9n���ƼY<�O]�.��i�>I�[�<�#��E��S�+q]"�x��@���i�S �e����dBC�A�����0�����E��>h����^33��}8���H�w�o�\48y}����V��`���>���T��-ځ�i�ƞP��X��HG�
�ꎅ,u�T6L�,�Lfx�	��w���2�z����C���i�aW{��{�����۽G��'��}��Sw��mlr߽J�����n����iFL�1/ˉ�щt��||��4�J����5�

֝�c1����vTh�kz���ONM����Y1���3~?_���-�}c��F)*��lm=�����ɳW�ѻ���d����f2k��b}Ŏ~�X}e�R�TLm�)�ϼG��1���
x�b�F�K*C,K�����t�y-�nZ�r��9��9�"���rf��y#��Em��[��Q�A���K[G�?PK�yVS#�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!��PK�yVS��/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��<��]��PK�yVS�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�,�޾{��PK�yVSo��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�+�Ϧ���PK�yVS�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���_�?PK�yVSDBCbY�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@�_PK�yVS��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��gPK�yVSʧ-�-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�PK�yVS�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�!�_	���
PK�yVS5�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����ׁ[�PK�yVS�Ӊ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�~�PK�yVS[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Ӵ���*�'<��Í����մ]��_PK�yVS�����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�?PK�yVS�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�?PK�yVS��]TZm&pip/_vendor/html5lib/_trie/__init__.py5�A
�0��}E�,��_x)S;(�ut���U�cIt;�(�ڜ�P�l^1�ŴU��{��"�zlI6ۙT*{��ǐ�?�\�(�>���5�7PK�yVS灦�#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���PK�yVSKOn�� 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�PK�yVS(pip/_vendor/html5lib/filters/__init__.pyPK�yVS����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�%�-��/PK�yVS"��ĕ$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_PK�yVS�?�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ͽ�PK�yVS��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�PK�yVSu�*�\),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.-[/?�:��_PK�yVSQ�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����PK�yVS`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����/PK�yVS�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�PK�yVSR�)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���PK�yVS�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�=);�<OPK�yVSe�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&;�#�PK�yVS>>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��PK�yVSP����"(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'�PK�yVSM�Ї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�/�PK�yVS����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�PK�yVS�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��PK�yVS!-�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����PK�yVSe�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��PK�yVS���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�
PK�yVS0Dty�.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/��
PK�yVS_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'�PK�yVS�x��Qpip/_vendor/idna/__init__.pyu��N�0��<E�'M6��7�z؋/`̤�Fʔ��ѷ���]�4�e��W[Ӌ�A�N6�tRP?���H��z>��Ř��総�W���Zc�+J[�HM��T8b�OO��,�ԲDjբ��W�}�;��`��#�A��$F�f7�V��P�G�y���ɍ�O`��C��E�w�I�<	4r�ڔ��7kp�lٯ�Jnp��^�<]��@<��y�!q8n0Wk��/:b��nS��UJ������d�&� 'vAO�n��)����(��KMNS�y�9��W�PK�yVSecq+}
pip/_vendor/idna/codec.py�WKo�@��W��Z)H*	�
H@š��M<nm���Z% �;��Ď���x�`'��<�����J�K��B�˦VP��3(�?�`3��yu��R��������¨�>ͪ��n��c��1��LDѴ��N���)E/Ȓ�X6\`�L��)N�g�U5F{~z�Q4Lk8�q=wҳ(�J��2����0�2@��.bm�����#�.�ABS�-��>��ʠ΀Ks���*8�'��u���ؑ���R��%Ko&KaI���}��⼪Ւ�ĻNӨO��-cM�$�F��>�Y��@�v$�?����6M��ߚ�8��Q�`�#�dWr�p��0q��T�{E��
�]D��<�9��`7fPq��Y�/����f�����tJ�i�U ׍�&T`�6��MÂ�&��a���!?usrz�=��g�@J=[�(BW�]�G����6��	��V����Ҁ��A�QB=&����{ͯ[aGo:���2<�P�C�\���iP��Q$ÊX�y����F�F�n���vx]S:��,����EM��r�τL�h
�ۄ�n��}�t(]���Q���b��8(��b$N����wkF�K4�1��x!H�J@��|0
���T�Q�p\�Sa�7d20}��<`꧶M���!M�Q�Uf7��$�b��U �t�f��h�fL�L�Ӫ�s{nw�
��k�*OG�b�:�p%�������f�
�O��!]󒸁�?P�y'�޳*v�j�>���B��+½�_�/��\��~�<$�~PK�yVS-����hpip/_vendor/idna/compat.py]�1��0���
և��I��]\�I�۫��p9�~{�hA�-��~���jX�,
�E��Zl&����c+�p%�T-vp�꼯�ҙ;����t~��BU���W��IP�B�44}�F(�_�ʕ�-�gDL���T��8�A0�q�}�qb�7bl�t���I�=�����p��o��@��X��
����
�Yj~PK�yVST�A:�2pip/_vendor/idna/core.py�ko�8�7� �
���m�n����6-�-ӎYґRW��������nq=�#���g�\�tE$Ze)�I4O�洣�g�`a^>I�sfNଳ@�C%���$J�}�.���j� JrN�%�r`�IN��ә�F��(�fQ �aL� g�IgJc:c�4�l���,�O���3ՄM�i.���+�"�b�
Ɵ���}.���s�X~�&A��Q�߼�|���w?*X�w�!����#ϩ`�݇L�D)'4��>K`��YLs6'Og1[	\)!d��c�z�#���l {Yṻf	haqЃ& �w�+��P�6Is"h�E��Q&�4���X��ط�J�<�czP��"��P2��H$H!�E{jf�[aϯ�����l�[	�D�D�ق���
3��-;%]@�#�_��[����nx�q}ON�8�8=�d���bպz&~8�"�h\(k���$�KHxM9
sƑWZ�0s�<!���HLEȣ,�D���(r�r.��il��9�_��+��w�Ӹ�"y@꺢�B��3ab�/��⠄V��|H�~�	'������?�x��J�ti'S-b�,��|p!�85�J�Ll�:a�^J~!��Z���W4̤�̢���d��w�0D��D�K�֓�=<9�A0a@9<9��Dvx�›)Ɯ�Z5�L�k�-��G��E_\�Ea$�Ȍ�e1+�Xɇh���Em��p��M�̚t���h~f=��+�!@���W!��n+��ћ�l,:#A`��#�A�G7��8�ʽ���݁���:]��4D{?���AV�? J_�$4'Y*"I���9˸6	��^/j��I��B~_�5K��6��f���\U�Y�2,��Ag{�HL�ᤊ�-�,�ܢ�Ş*/wvmW�6��&������PΪ�W`�.��{�F��}����#cKd:a�=c|�.�i�j,�1F����=��\�|h�ц����������~�����凷���jI�^�K�5ۍ�(Jx���yڏ�"WJ��e�����r;��Q��,�2����OgJ&զ�D���+5P��kX�??�	W������ ?P���4�i"�^A!�\#��$ڭ�ּO�)ʓ-L��G1w����d�
s�n0���ͭʜ�!�_�
S���k�1[�U��z��a[C�X��7g�^J�[���e��]��fʣf�bfƖ�QIv��k�t=S�Yva��r��AM6Mo�gB�{xz���2}#��T�%�B*��e�q��&�lTZ,�7Y5�?(�6▛�,�s�s��%�)� �d����M*N����?P]�:��I=���o;�!�A]jXT:�+x"�]�K��<��ꪔf�[�U�Ѱ<T"�Փ^�r�(������J`6�*�S7txE�������C�-��f��Io�}#d���p�����s�/�¨���26��`�r��h�DP`ֆ��\=�	TU�8�х��V�� ��z
QWr��Z��8�7�����]a�����1ȳ.W���/�Ց_z��.��]���	~�I��_�N�4 �4uv�<���g�+7$O�4�f�?�� ��(�;�=�=����sp��ɩk6���	t��FЦ�_9c7Ff�m'�#�!��c�b�z���W4�f�7w�u4\�N�fUY�)�ab�G�YCb�!�^k��kI�P ��B�i}��&M�i�ޏF`�g�(���'�K�/$��U ��œV��h��%i�&���6j"m�ͤ5D,ݹB��U�S�d�rN&^^	H�s��U���.2����&s���E���Hok�O�t��*�F��VU�trSc�M�W-�K��-ɐ��[2�s��\���ƹCU~����q�go^�y<�����H��]^����7M�Z[ �2l�j�[Nɂ�R>������2�h�vA��J�{OR�i�݃4W�
�8�Z׆p���
���2�R����n��穾I��z-o�p5���w��ۭj&ʡơ ]8$�H�]꣥�2�k��hy�:�/�@Z�/RF��H�ĊG�n��C=�Q�n=��)��d�0���b啃��xP�QG���z�)h6+�r(����M�׳+q�ǻ�S�K�-�V���,Us/��Ic*���ͼ<c�D︟{{�.ֹ�1�Q\��E��:
Z5���kw��+�,�%��v��8M�ǘظ�&�C68�[cD�������wm��%,�Y��@�[�E2�`�VfcZM���F:4�����I�5��ՍP���4��4Ѹq�Ɩ,�N���є�ͺ�t�)�M�M�����VC�vo�*`�������g}@�n�TW�>��
C�%�?�(>^}8�u��	p�堼�n�I�q�/o�UrRZ�(	��ש��l���*���/���Rg����
$j���kI���Ui�������]%y'o�~�x�ӭB|��@����דu��6/DI�4v&��CֆW̶8l6\�*˕��R�^�p8�qD�$�^��-��}�6c�h�zT7L��m���^[�2�����ď���gҚ���S"��F&!o�b��ܭ�B����p�+
���44V��s��U���VI���sj�Nk+oR�-6�tj�#B��G֞�(�Y�N�-�(�U��W.Q>AV�l���3�z���L�^�ؐ�`,�w#
G�c�5wa�hs���q��̺�&��Ɠ���|(�DGP�7�j�{�X/7UN"�sF�F���ܚQ&�\�*�0�e[x���U,YTM�EIK�M��icˆs��(��2�Z�b�*��Ѽ,�\H4/��hf��/��A �~�j�%��+���:e#�/��������R��nn��\�-=�7�����Ԗ��w��	=g������������.���s��PK�yVSv2o#n�pip/_vendor/idna/idnadata.py�}K�%7��^��/��q�M�a~��Ec0;!��vyd�!�4���f^��U�#i1��<���?����O���ק]����e�|��������~Y�S��_~������i��7�|��Y?�������ӿ��}����7?��>�闟7�}�i���?���?|�7��������1��/��/��@�L6���C��k919�\�\A�L O&�C6Od���|�]��d7��.;��<�왞�,����u��Lw��t��G�}��>�
��nB��Oе���]�^�ܞ�ޏ|�!���L�o��s�<��v)���羿�{w�w��j��Kp�d9_���4̉]Р����)������k~���hXv��M��P��D�|]/��Tz���-�C���P=��C��"��+w���w�n�~[&5���>Y
�}�j��~Yn�-O�ɣ'�K��߄x*�J���͏�b �K�sw�*�����?��+Ü�K�W4
���E�#�3ʉU�������3f��B_��L?��K/��<7�CO��'���`:�\��؜_m��;ܟ�h����;��K��2��U�cL�e���[��n�K��`r<���'�lWT"������bzq�ޖ��|]Nd��E�,�����>����~��֗����Կ��e����j�j�j�j�j����}#|��\�<���F�&�f�pk��ƭƭ��������7�.�:�2�!PW!r5q��
���oh\e~�����7�T���/Uǭ���od~#�����J���od~3�����cTx�
�d�w��N��U���cTsa̅Ǩ���f��;Xy�*�Q�1�<F�Ǩ�U��cT����������U~���Ƿ�6��6��6���ۘ��6����x|�o��m<���k<���k<���k<���k<��l����k̯1���ۙ��v�3�����og~;�ۙ��v�3�����og~;�;X��;���<X���`}�σ�y�>~�������w�;y|'�;�����d�$s��n,~��#x����McT����Qu4d������o3WW+WW�{�\\�\]���~]�̯g~=��W3WW�_߸ո����[�_��
�u%N��#'�p'�p'�p'�p'U��2$N�\eeH,��&�73�����of~3���f�73���!��g�7�2d�=��c)�/;��0��@����0�����Y؁,�@v ;���2��=��/�{fS_�̦���/�%9Ys&k�dIN��dIN֜ɚ3���N�w2������b~���.�w1���]��b~���<�������K��K��K��K��K�3�\�Z�Ǎ[�[;WW'WWi�*[��ֻ���l�k��������M�o����Q��vN*��F��Q�lT�cT��a�Q��Şi������������& ;WW�E����u������s���G�F�F�F�<
�֨�֨�֨�֨�֨�֨��F�F��`�`~�h��+K�~��d�v}���?�u'u/� �(�$�,u����ޤnR�RR�R_R���� ��?�A������� ��?�A�������(�G�?
�Q��������(�G�?
�Q������$�'�?	�I�O����$�'�?	�I�O����,�g�?�Y������,�g�?�Y������_��"���E�/����_��z�}�N�b�k�z�z�z�e׳�OU<2Uƣ�xT�*�Qe<��G��h2Mƣ�x4�&��d<��߄�&�7�	�M�o����o¿	�&���o¿	�&���o�?�N��_�׮ϯ�����jgz׋ԫ���u���d~2��L�'���d~2��L�'���d~2��L�'���d~2��L�'���d~2��L�'���d~2��L�'���d~2��L�'���d~2��L�'���d~2��L�'���d~2��L�'���d~2��L�'���d~2��L�'���d~��T�Wu�.��CpJ�JJ�J�������EQ�MaJ�'C	�k���>n!�K	N	^	*����=����P)�=��SBW�P�T�Kqa�~,��,97AulE�E��JP�KF�WAګ�_x�E�_D%$%d�(�*�i���J�'S��*���h*S`fJ�JP`��l)�fu�O�׺>/19��JJ�JHJ�J(J�JhJ0%t%%L%,%�+6ݥ��Sy8��Sy8��Sy8��Sy8��Sy8��Sy8��Sy8��Wyx��<e��e�f���ܲw�	I	Y	E	U	M	�����������UQ�UQeU1�}'�4i�I;Mbq�H���t�k��W�&%d%}��\o�'���#ק���\ב�S��6�C5Y�{�ȩ�v��:h�:h�PM~������&&�v��o�S�WBPBTBRBVBQBUBS�)�+a(a*a)��Sy8��Sy8��Sy8��Sy8��Sy8��Sy8��Sy8��Sy8��Wyx��Wyx��Wyx��Wyx��Wyx��Wyx��Wyx��Wyx�GPy�GPy�GPy�GPy�GPy�GPy�GPy�GPy�GTyD�GTyD�dzG�����\����|7����*���w�����GH=��B�9�$�\�2'&R�nNFA�d�]d��2�]�a�$��\��@挢���yd���.���6�Dv���nǸpKj�nǸp;ƍ��nID�����g��=���nϸ=ps���7ͱ�9$�mA9w`�D����2gd��d��S�"2�"'�2g��M.L��`��"�*BT��!�ĢJUbQ%q�!N�`b	&HP�E�XrEpK�(�؜d�&�Ό��Im�̸3pKVf�̸3pgI.�̸3ps����	[�wa��9Y�!Y��]��s�r�[XW���5�@ck�ѵ�U��X`���q�*k,2�]eQ5�$�_�����0:��������͹���Θ�#�i`ǘ�����~'%O�`
$��t6�w~d�#�3 ��2�����d�0L�p�d���,�	QMIo�BpR��S��;c�)�na,3�0���r��Y��,v�;���/�����Fƭ�Y���{�GޒJ�Gޚ��$̟GJ~�����S��<{J��gO��S��)yxJ�=%Oɳ���)y��<<%Ϟ�����S��<{J��gO��S��)yxJ�=%�ӳ���x�����S��<{J��gO��S��)yxJ�=%Oɳ���)y��<<%Ϟ�����S��<{JyȞ=x�dz��q�����dz��#���e��	'dz����xvr<��-"�j��\��#.?����b.��3���/DN����B�N:ag!�Y�,8�:Y��\��A�5�V�-E�)#L�=���@��&ɇo���w���>����z��z���������>������}��l��}`k`�%n�#7���nL�#�����Fx�����7���F�z#���^o�����z#{�^od�7�덬��Y�#9�"Gx�������߱wa�P�Xwn~"��|�P��]7��XI�#+?���ƊG6~$������Ƣ���G�
�j�s�Sbbn��cn>Z"6���7"�Ȏv���юp�#;���Dc��Ƹ
����#��р��؁�3�ܝqw�wgܘwbg��ى�p�cg���Ȝ�AL� '&g��+ȍ�rg��mV{J&�`yv�����`�@��y'�1�D�w"���Nļyމ�w⒳���睈y'�1�D�w"���Nļyމ�w"�;�N�y'bމ<����䣈�(�t�&��&�7pߌK��K���+�R%b�y��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���J�J�R%�R%a��x���TI�TI�ML����a������x��-��	66��M�}�V`r�e2 ���\��#Iv���2�2�9!���&�|,r.4	dxJ�Mo���s2�̋$�י2[�|rᗻ���Db�`�Vx��F�U�(ؓ��We��ѐW��e
yU>`�ȼ�V��Vy,+&��sC���x��ᑍ��v����
�j��ڰ�������Ml�SٰS�x�ur`2����ƮE��7�!�� �B�aBo<����<��$<��Hx���2=�0��$��Į��#Xs$*�Y7O\�?�����d<�?@�9xo������å�΂a[�#�a��x�������%<2�#���2���Xc
k��1h���Ơ��k�Xc�5h��[npˍ5֠�Ɔڠ�6���X���x�ܠ��k�Xc�hp�:���쬚�ٯ��#�Ϊ١��U�C5;�f�j����jv���;����u([ge�j��<v|��l;���y�0���p���d<����8۷����yݱ\�;i�I�с
�.�Xwc	�R7�j�Y�{���U]g�۱|��X^^���"w����Y�1C_�Us\�`��v�j��`e� �l{���mDt��6�l#&W�I��5Xtp�b�|
V�e<E(�`eP��o��
�l�m�BX��s�?�b@!+Ā�7�ޘ�=i�*�l��d��`5:ؽ�
>Q�L>�OV�	���
1Y!&b��L�!�l}&����9��䑟��>ypb��
1�����	{�[M���&���K|1�&��L��-�9�%���x;y�'>�N����C<qz�䝅�9m��p���p�o}�aW�Z��[����7|���/���'��(��[�[���$�$�����>]��˅�r�-���%�}�Ż[����A��
�;ȤU8��ygCyݼp����ވ��CerY:9�ovXo�@���w�;�)�8"�f��F���������q�ug2w6����8�¸p����9n�r�j�P͛C^y��#r792�-��m,x7���o��2�`��#��7+2V�O�DO�C0�x��I>F��m���PO�%����;�PD֋]��K?	�H�G���@&_�{�d�j� �-����<�#t<�b��~���@?��Ew�'�]��K($��I�q�C�(<�\]hB�NJ�K<�����:���u��{v��X���o����b��	Ɠ��x��8�� J.px�]���=)�W�述��y�.�ȳt��"�\���R"���K�Ϗ�?	s¼�K�C�H �;���/_@]�qG��kr2�G䟄�bS`�B?��kl���j��$D_<]�-�O��d:v	�I8��%�:�>��\���J��ք~��]����.��ѿ؍��C���b���~���.��!��>����{;�4�{2��c��q�ݐ��#�Q�gz\�#��3t��ǽp�vx��9t���g+��;��7ϗ2�d^���K	i<_�v)1�gBݥ5��_�����l��x��H\㙘w)��g��d�~�lX�%�a�&�%��r�/�
��إ�_���_��~IpX�%�ay���_r�~IrX�%�ay��]�%�aA����
�/�+��%b�w���ђ�h��?����~��jE�?�؟�_��]Z�O���=��K��J�/~�J�/	+�dP,\�%��]~ɡX�Ӗ���m-��V~I�X�%�be�D���_2)V~I�X��Kr)V~����%����S��2���P�
�_����E��yma�_��bCc�����[�
��o�*�W�_�_��U��
�
���Y���_
���o��~�s��Sߥ<��r��2<W�:�Ṓׁ�'�;�;���f�� 7�'�An�������~�W~Y?��]�w��䏬��O.��K�\����/�(k��[��!�����?���S�O������)���Z��Z�e�&�˵��.Y��	��	��_Sa�k.�~M�Y���0�5f���,�ׄ��r���:}݂�~Y_��e]�n��
�⇯�.�5�NK�k��ů�׍__��q����Y�1u7�G�����ĺ�ya{���#�3���&��M�]�u��ׄ�>v=wم>@��Gn�ؽ��=%���zO�o�H��u�k?E>����~A��_����zw։���@��]�%�y4���8~�.5#%�^�^AoB7л���2
�[��_ڥ�?��KN��T駢�[<>��2��^��@7�w��}	�>t�[v���o���&��7�߀_�c��u4�߀�	��&�
��
R~��&�
�M���7�7�o�o�߀_�F�.�;�w�߁���]�w������?�~�(�?��!���?���C������%�mL������?��)�'���c�����_��Ď-�C��'���.x��G�M~w2%ss���]V�OЙ/đ���g��%r�#}z�J���D�]��;~��Hy���]���@�A�K��;wRҔ���e_�{�9o�:�C�WΜ8�]�]��p]��}_-�$��w���s�_|�r0I��������}�LqY�P$C��IJB.˗|"�3�!�|�^��(�zz�
��nB�+�	��}�_��/q�9�	���O���$��'���?	��Y�g�ς?���>g���?��Y�g�ς?�g}�Kᫀ�*���
_|I�q��
_|U᫂�*|U�U��
�$�9W�o���7��M�7�o���
���o���	
����`g�﬜�/V��ȮУ��Y��~���&���}	�ȿ��3��q_p��SB�K� 8p��3�<a?����Y�~��"���~������,��E�'qv)�a?����Y�~�O���u��Y`?����Y�~��"���~������,��E�g��,b?�g�Y`?����Y�~��"���~�,�3�]-�yf�
�.��:�;\`����;\���"v���*8+�RN����v��]-��E�g��,b?�g�Y`?����0.MƥAn&8
8Mpp��� 7��&�
�M��t�����;���G��@S:��E>��"�<C��a��b��'�<D�Ͼ�.�I?�*�N=�t�d}C��U�>h�k�*C8�a�,��[<�lt�r�ȭɼ�N�jb?�d��yv��Y���)pX���t�A�ð0�%���&�"���'�����.���4);��(�K�7Й���{'���y�WХ�K�xHC��.;�/����%�yǻ�T�3^S�����n�8�]w�K(���e�}�^����K?�x��{�������~�B4���o|���{��k�6���5�5���s;��G�K���!��I*4|�|�p�:��z��n�
�]�a|���WÒ��a�Ab�6�<<D���aTO)�و��|��������&���zE�GԮ�����簏� �>����w!��J�r�s�U�h	�]�nBF�|a��'W=N�^
M�4�����)�/��U�݄��U�V�����*�a^zU93�!D4�3�#7�

v5<�IX�&�� ��5I�!$4m8�2���K�	�4�x����p�nQ�B��{87}ϏI��
@������]�v�nWe�Gԫ���YW�0�᪚[�	�;TKމS�ADN�R�a��Ks�`��Y!���������/n�(��~!�๩C�3�6�|��i/OjJԆWΠ{���*��K�;˅��p��)�4��Nܓ��ju�駔�����aw��RDR�sC~tw�S�i��^݉�~J�N8�g���?w)����pK�Z����i��ai�Aߴ�������Kf
�*J�!�AL�&$4Lm8׬ ��U��/^�<�><��Aᾶ�v)g�oBA�><��B��c��*�+	Aң�
�`�*��gH��C��~Md�b�Kӆ�pr���컔�M(h>f����n��$�~�pt7If�K
:��,��&D4�H��r��*w�f���
��wFPv|N@J�
��sշ4��u�_��h�3lBC�i�1KM�bhǙإv�؛�ΛP�д�-�3 ��b?��O�W>�y������܄�s8^�Ԋ^g�����Uڄ��D�>�$+iCO�������I0:
��0ݥ��X8	zhP��]J0���S�j�%�.MΘO�cCC׆���
G���BSw��h�`�M(hh�TU�ᬻ��Р]Aw�x}�D\�'t���Rr^�#vD�||'����s����6���Y|�#�M��|v�v)~K�]�-�&�����w��^�.Z����R��@8xּ��_2v)��0O��y�MMx�_��9���C��d�M@�iW]�Y�1K�� �v�rO����T	Qrغ}J�/�1HRj���� 
9���H_�^�,��K���ŐdG&�..B��>��I^|߹ ����񖦽�c�2K�k�)�k�J�|�i���}�E�ipM^c�$Ij��k[�)�6d4��?n�p�AૄE�\;��Sj
�+
�)Y��#�E=�]U�Q_�n$}������4O�#�F����[v�aD/���C�p����	'��W�gn��4��,�҇�,?�����N���������z��u�&v�~��V�0_��p�x`uN�Ol�q��%�/0�Wf�l!<1`���PK�yVS,�]['�pip/_vendor/idna/intranges.py}T�n�0��+�l�1��V$�e�.����L"@�<I^[`?RR;�C����#��l�}�P�%�s�=Ѻ:�"=_�'��aP� W�	�@�-[��G��v�F;��`GX{��G
��[t����h�'���]�����P�uQB<߇�}UU<���v/��C���E8x��I��ʣ�B��̀�e��3W���EQe3�"�]o����|v����K*/Y~H	OC�0�ZrY����n8I�_M�}� ��
yoX<F>�\�6��_gq�iPu�=R�z�l��c��]�b5ˋzM��a=Y�ܰ?�4�O�	(�\_�ޫ7�2I�k\��Z�*�Kn!8C��*`�����ŖKp����Fb	�|����E����Y%W�Չ����mP��$��
�6QV%��b%M�u�c��G!8�
u>�-R�"ԀyME�\]��ȸ�[X��7�z���A��u�Rx1�ki��� �R�#^�bѕ�{0o��#� n��r�c���0��(.h�d�ݢ��-�c�"��4[hg��
�N_a�w;��"�Aoqn���'ޱ	���G�-��'ڔ��g��]dn�����2)�n-7K��Q�y��m'5�x<3�3��t�̀�x~����@>ǿ��;����T�Hn{����jU�Qx�Oe)R
/Hc7�vĬ박�#-�8�h���0n�9V��fq
?ܭ�L���Ag��<�x]o��m(�f��G1r�ç˓��d����K���vx����ջ��x�%�4�ZA��w��#��9��7�f�PK�yVS�C� pip/_vendor/idna/package_data.py��/K-*��ϋ�W�UP7�3R��PK�yVS����ypip/_vendor/idna/uts46data.py��is\ɑ%�]���=3*M��q�̛�uϽy�5k�7���y�fj=
U+U$�TE�����+��ྒྷ 	�V��6�L*�ZX��
H��6�OxAP����o��J?y3��������ƪwW��j��+���ź�֬\��啫W�f�믮}����^}e�O�b�[o�~�V��v�߽�r���|�w�Z�b�o�^����ּ��;�V���]����W����c��~�;���������+�^�迬����Ň�ǿ�_q�������'�|��w�?�Ɋ��n�}�߷}�;���ڊ�����?i{�{?��
���y����`�K�[�w����?Z��-��V�u-xw�;?�K;����?^��w^]��w֮���/����+�}�{��w���ߑ�;VW��U�w��������T������\�]��K����@�)4�&!�,��@�h"�D��4�&#�l��@�j>Bc��P�j>B�G��5��#�|���P�j>§|��RPh��#jS��-� ҂X*ZPՂDjZP��G���4���H�G����}�O����u�Y)��s�O�4z.}YJ���W���\���V�K_����u)�=��!����UR�>��LJ���7���\�ZJ���5RZ<������-�:۞KߖR��ϥ��z~ߕR��:)���BJ=���R�ﯤ��k)���FJ=���Rm�m�m�m�m�Um�U�c���V���;|�e|��1T�c�j�PՎ��CU;�j��4�@;ʪv��R	�(M{�iO��L4��#�|$��D�h>�G��0�f�h3L�&�kO��W)� ԂHb-�hAU-�iA]R-ȴ���ZP*A]�Q�|�5u�G]�Q�|�5u�G]�Q�|�5u�G]�Q�|�5u�G��M����R�iR�iR�iR�iR�iR�iR�iҚo��{�\���q9ڧڡ�ڡ�O	�g)�%-фN!ϴ_�4E�C)�c!Mb��)���'�R���4s�`�a0�RO��3M_�#�`zCg,�\"�>҈�3�U7|���1)���{ǥ���	)���wR�}���))���wZ�}���)���{�S9*��:*7|\��9�(���K�W�{�؇��]�b��.I�W�{R�u��e)���{W�8�Z�J1�:(�P�C��R�^�b���C�7�Xw�Lߒb0="�`zT����i٣s0=!�`zR��2�/�2�.�O*�O*��.��.��.��.��)4��u
�����U:�+��.�C)5���|���R�Qj>J�G��(5���|���R�Qj>J�G���|W|�5/A���w�\���.�~�5OA��~�\�����F�kނ6���Lr�_��;�[I�y�|�{����|� ��3��Hn����>���| ��3��Hn��g?�
��<Jr�g>�����ϓ$7|���4�
�!�<Kr�g>ϓ���ϋ$'>e-k�P�5Ȩ-�ڮ�ܨ-�j[�{��&)D^o�~Frh�:ɍ�"h�&ɍ�"?^�?Jr�l�ȏ�\;� ���$��7�|4��w�Pd&?h'���%?�$��d%?�&���$?�%��d$?_K�������G %������ύ��!��܊�5$#? �[1>����V��!��܊�>�!? �[1>I���V��I>�b���O��g|��5�ɠ
>��V
�U�I>���*�$�k�A|��5yŠ
>��bP��M�1��Or�&�$�s���|���O�&$���G	&9�I��5Mz2H����fb�f���5�5�5��&��H>�y/z�:w͓�!�5Cj͓�!�5Cj͓zw7ɽ/��|i�Қ'��^�{S�K��p�
�5o��K�y"��{�KΦ�p'�ͨT���]���L��Lݫ�.y��Q[j#�Q�j�{��G|ȔS�~�.y����C$7v^�z�G�^=�76	� ��&�0t��&!����ד�N����S
�R�=R���{S�{So�S7K=���R`R�A��M$�~L���^#�	������M�y?����FHn���'HnC��v��`����µ,���6��F���R�e ��O���G�ws�$�>"��5䞁���ܘ2�}$�1e��>:Lr㭑��²܄�w�#0)���F�9��
o�#0)����#
�L�/(��~DN֤�����G���_PxC��\�I�$GlR�A��ߒ��#6i���|H��Α��P�6ɿ�3c$7̔`�\�I%��VifB$�l ���I�;$ז")x����I�;=$ז")xg#�5�!��w6�\�")x�OPe,SY�X&4����;}$7jC�����!�xgɍڐ{����Fm�=��Gr�6�� �Qr�w�ܨ
��;�$7|"�x�(�
��=~x��O��$����;�In�D���Y�>�{�s��O��\$��I�;$7|")x�
�
�H
�$��9�;�$7|F����P$�\��!x$y��>C�y3$�\0!x�'����ɕ!����c&CN26ց�»���:�ŻKN�d�Bd��n%��d��2Y�0����A-)���H�}�Ę"����{w����-Y_"b�
�
Ź(��&����6�8G@
�y����bĚ4����$��x��^�&1l��tF�o��ד�7�jc"��"���"�o��{�w��f���yцe�PT15���a��8��?��i#��1���"�p���%dxS]��&JtM[�����D{��/���?���~�y��3u�Q�EMUT�P�L�'�H�=��D5�
> ��;~r����~r�五/�y�{o�uI_�཭$Sr�Ս�"��	�m��'C$����Rs�\#9:�u���$�lBl#A��-��m2�:�%��>#�眪�"��>� �g��I�{�?�s�ɽ{��R�=��TW�F�g�^�=�:I�Er��n�{���3���{I���{�I��h��/�o�0��{r*��'�"T�1W�Bq�B��rQ�-��X���,B�ٽ$7{kP{v�ɍ;E�ٽ~�� .B���Q�� .B�p�8��p����I�m"\�w��f�C���Y�>���w��O��]$��9�{�M�*B���|���JX,����(�*�S�!��6_��̦�-B����V�[�
ܒ�5Y����I���?���A������I�����>3-ådYå��;����Y^y�w��+����q/ɽ
��#������+��{E�?Hr���"��*��ܫ�~?ɽ��!�W�}�bd�>�Jr��OI����=������5�{�?�Nr��7H��&�=���"����{�?%���1�{�?'��S�6ș}:Ir��2���9�����fH�n�Nr��a��$��w���Mr��a��$��o$9��a��I��Br�V�����/�+�����q��9FM��$�CH�����I��5=�ϒ\�1jz�'��c��ܿHr=xĨ�?@r=0Ǩ���z`�1��O����c���1���=̼>Ƽ�>�
S����>y��0N�'�
3��I^"1|&�Cb��y>�g�>1a~@}�fډ	��M5�NL�P?��v�X�
u�NL���]7z�$��ڦ~%����u�wL��Hm*WbL��]7|b2��F�:�)ã��G�m?��nԆy�r��&F�r��&���?SDcn��ܟ��cV��ܟ��c>��ܟ������?SV�������d�rf�c�<�r��9��2�'����=�1����|�
���-�1�n��3E71v:> �g�9�
������!�D
�⎱��!C
]co�C
�zn�*�!@
=�����!�>
]c��C
z:����!�;��(FF�!����!r9�����yH�87v���Cr�&#�ܱ�����<$wl�71�7���M���C�&#������<$?i�71�7�O��M���C�&#������<$?i�71�7�O��M���C�&#��v#s������<$?i�b�'=$?i�#ƨLzH~�T&���<$?ir61*���4�I1�8�O�ʤ
�7�6�\�YA�摟:�Ф���I�@U��y�Er��
�5�zH��VA���F�k�U��y���Zm�fm%�V[Y�G}$7jC>����!�h�
��<�Cr�'�/�����ˣ$7|"����
�ȵ<�'��Y�GGIn�D~��q�>�Yyt��O�T�&��ٔGgIn�D��y�>�Ayt��O�N
���ɣ+$7|F:��D>���Fe�g'Hψg�b���}(�������!��>#�#��g�H�òψy�K}v��>8����<۟]"��>#-�h��$����H���*�� ����0��5����$�7H�o���"9�!9�%9�#9�'9�� 9��$9��Cl{'?_Or��4�b���$���Ar��$��N�!vS~�Mr}:R�욬�$���:���b�+*&+T1AUL����-���R��2�b���CU�́j�>̩Є���[��X���ߗg˞UEn�q�B�~��Q��E�7)Ĝ��r��)_K��VI`}��VS��d��"i��)����C�L���s�j��L�oV��^��署署s�R�̜�fv0Ռ���t�V��������ON�yrj��:��K���X����k,vBc��+�]Q��@��W7�L린�n��u{6��/�S{n�N��3�=�N4�3sʝ��zf����zÜ��Бc�a��Б`�aN�3��zn�C��ə�Oΐ�p�ғ3'4f�ˡ�3Wԧ�K��h��T/��{昽6�=��A�m��fN�Z㩙c���Bj�I#�=����sCO΍f�ǜ�"*~r�~^G�9�8��U�f@�ޖ�<�X����ۧ����ϧ���ԜU�V��L�'<�W� <�}�'<wX`/,�i��]1|�z�~�3́�ib,�����������������������f��fI$5~75~7m�#GS�wӆ��wӆ��ļin��x��x��xĴ4<��d֦���x��x��xͬM[df�ff�ff�ff�ff�ff�ff�ff<cf<cf<[f<[��63^+3^+3^+3^+3��d=�f"ֺt��%:�T�Z�Nh���F�0d�Bf�d5ô�
��
��1f5=>d&��a�9�73k�9�7����|3s�D���a����X�9�!KM{̩���@Yf>���gf�3�ef)13(3(3(3�af���x����m���s4��7��hd4/��C5��j�҈�a<K��j�҈�o��0��a2@����F���̼�g4��h$��4LeU����4�?h�0QB�D	
4L�0��a"���y5L�k���0��a�_�,�7r�/��i�:�k�(�a���飍���,�6J�{rӏsӏsӏsӏ�@�47�"7�"7�"7�"���+��#7��{��V��Dƹs3���n�lrf�)��3���M�L�i�M�-o��[��'�
G�ї9&&7���b���ll57���#�s�
.LD[�9���'��3G6G����b/Lv�0VR�����-s�CQ3D�h�0����”����
STW`O����OF�)>�����=v�0�]�.��.��.L(L�Va�ua�"��G!2e��� ,'�8a�n�/J�{K�<�L�9��}O&ڟL�$̜�� �4G�XN{2�E�9E�`O&v�O��DK�I�db���9\L�&�O&�H	M�2y�0s�xUo�)W/���!��XZ��5��z2���Db�Qc=`rXcu��G�[�\H�i3,�����N�ݼ����4��{��L��hl��O&��O��[�
��O�B%�ɋ��ƶ2A�ve[�=��ؖ���
�S�Y�z`ڌ����6hC���h%9Q�0�]e�f�kCm�T�aF�a�&w,q�nh� 4a��R�C'�H�	NdN�+�+�M&ͤ*�]MNd��dV�М=�&'�&)<;�E}ʾcf��0�D�M���_4Cm�81�I���E8Q�t�2��͢���̮��X{��ND����\]Df	:x��?�Jթ���ԁ2�b$2�zx�5Fr |2}i�;���j&cNdO�6齠j	����%�3�
3�
�@�A��2�mAb����C� �N#1��v%��$�>'��h�.1�'2�&f�7HL^‰�	'�z'2��Y
�ڌ���(��e�f�ij͔�8�m�Um-1�T[�m�j�xݚ�u���x�mW=��Ҡn�g��~�f=6�T�w'ԫ�պ�5҉L��[��m��n�݂�
;�68���V��:1'���QIj�hj�yj6o���1H�Z��Z��������;���ņ��FK�}���1+����
LA#2�f#2g�>ˀ��F��=r4h`�-�~��p�����Iװa�����2ob{�O2�#�olf�8���Nulg$����NF" ����f�d#U {I��c�O�~F�t`�O�AF�tb������TG?#�#��@��F*�s������`D臍&�9ň��iF�~�0"�s���s���gD��#B?��Ĉ��#B?���S����UF�~�a��	�3"�þ&��Έ��
F�~n2"�s���F�~F1�q#�O0"�g��	��h�6l6�a#��Y��rW�c/�J����3�w�)�ML���WX���U���~�Ѽ�ro2o���*�{s�˽���ro*�Y�
e
�qc���cW�[,���9���ro9��jֱܓ��{��r�=���������Y��3�g���6 l�a�`�{Q��&��-
X`�3KN�5�փ�5l%�X�W��XT�6AQ����~������3um/#p��1�����Kl`�D���5�
(x�wrT����1��f�y1��<��q�4X�8f�Nzt��a��|Ƀ���.1S��ү�����U�/�#��lA�[�\������1�s	F���.����e�㶥=�����%vL_c9�#�Z��=�:�bR�u*GH��T�H�^`�1F<�sB<zw��;7��X�;� P�X������e�D$z���8!�:��-�F>�Q(�U��K�.2���72�˝61���"P�{*GJ�8�+�,�����gD�������~�$��4����^XS���[�7���[��ˌp��ԭ.F�}F8ea�V#�J#�0uk##�V#��0uk3#K��a��VF��F8qa�V#���@��s x�ň�9<�a����1by��<��C�X��s?#��@�|��s(x���B��=%ֵ`���>�0{v
}�5`�J�"����E(�ɗ�ً��P��3�@8��'_	f�.B�O��N\�H�s��s$xf��	��3by��7�<G��F,ϑ�y��s$x�`��	�o3by�uj�ǁ��	�����ځ�b˳����8`v�8x�q�Ԕ9x�q�ދ]`.:5�〽��)S#<�۱����{AvQ<�8`��.��p��{MvQ<�8`o�.*�g�e�EE��〽/��l-CQ<�8`o�.��g���V�U�3�g{wvQ<���gU�3�g{�vQ<���hU�3�g;�+��g��*�*xf�lo�.�3�g{�v���?�;��D���^�]$�g��f�"<����"<�6g�:���9�׉���n�e��Q�϶\�����(�g{�v���Q�)bZރc����]`!rj�ǁ�W�B��<Ԭ>qb��(������S�<�j���q��X
�:��9�Ɖ�>y0���H��{w��ȕO2��.�@��G'���7������B�.��g��hbYq�=��J�뉣�͞'ƞٜ�D���3�〝HX{f{�v!�G�3�C��B,��g6�;��=��/byp�=���D�g���`'<�g��mb%p�=�9&؉���܅Xe�l�my��1��
�s<��g6'9x�ȹayn��1���\��٦��|�=f���ǧ��c���<���lX��y�=����=�9_؉��1͙HN$xf�i6R:��#g��ى�9����"<s�l��v��1��͉�A��9r^�b�B��y����3��%�7/�쟗��<�^��B��y�{��3��%�:/�쟋�5b�{���i�O���E)���ٖ�DB�<����H��{;{Q
}�8`@v"�O���((�q`�|��$�q��)J�3��0�Y��`�t|#h�x;#��;��w2�j��.F�"�݌��e����V.�vgB)r���o����;o���ֻo��S�Zڂ�RdEǏ1"��8#�
N0"��$#�
N1"��4#Bogz#�X�j�R$$ǯ2"^q��C��WfD��5F�+^gD��
F�+��(m)y[��	�(Z���)���!Q�25�R$'�C�rej�;��9V�Z�Ҝ��D��ܫ*f����6sw2�˃�"��n:+Qs15AQPi��K�ך�Vo�=L��&��U�KqY�	�aU�n��D�k�{XU�"�0����������0�cĦ^��8�;z���.*���U�E
���1�o��/�]'¥�[0��2�Dӥ��6$RZ���f�@lvC�����k5��C�2�	LFn����ڀ"��.�>DH��CI�x��j/��𘽀�ƒ<>���_�+[��H��Ә���vrBc�NNjL��)�	��֘���	���X��W���/x����x���/x���W�~?����'�L���	�~bo��~?����'�L��	�~��k¼_��W���/x����x���/x���W�~?���‰����5�k�/i�l�+�^�Rl%����j�� Wl&�� W�'�3���t$��=%?z
��=�[H(�G�V�,��!�Ht1���gz5&sM��&�䦆�����1��8s[�v�l���+S��H9N�D�����G�vR/��b
�c<hH�(��.���3��lV,͉VN�n��a��9�)�	�<����F���g��'/$�䂟݊�E�,����ƽ"�w��� ��"�71�H�Vd�n���*N�Bb�I�9��$7�9����dK�ս�-B��=#�5���{�t�O07�;��	�Y���-FZ�LD�ob���'H�I�AB���RZ<#z�v��4�gf�>���6&�Q�Q�f2oN�����L'J�Ì�`�j��D:!�D:�D�үn�ON��C��1�׹d'�����	��,�_���v"a]��p�{M��?1P���bj�YS�zb�UÜ&�4�D-�a���}�N�Oio��*���ތW�\S�D�,b����roU�{��{Tc��?u���i�[�{�3ݻ�oU?d�w=/��[�X�c�$�� ����~�	Y�{g�����@��j-4Pk��Z
�Zh��R����@��j��#)���Kn�ur���ܓ�k�c;�<�o�ܳ�&�=��Y��_�r�>[�
o�ܳ�.�ػ��|��͜;�D�u��ךz���\��C�¶�����x����}����Lp�o/�e�^~wU!:�v����x��b�
��x{���0CI����]}�o-���[�,�>�`��*�{~V�ܲ����Ǭer�V'�o�6�{���=�a�޳ر���+Y�*�$���S��Ez'��,7aU��$�62`	����Z�?,���r��{���,��-��p	R�=�p��kd�A+s�x��'|��O�;�]틝xr��ŀ7C�
�	�Ҿ��׌`V��l�f�l�v�L��]#N�	z����o�e�z�3�[��"��Й0H��X(����H�c�8B�U�sƪ�9�y~"�y�b����U�}�b�L>Wc�!ۢ�\~��|4�X)��j�
���
��Z[�K�ʔ{��7U($��`�����^C�VߔP�W�~k��!��͞/i����6���HZi#i����6���HZk#i���j�¾�=��~+�'-����z�B�I�'-�nN�s"}�ٸ�6��q�N��a`�-C�ӽ�?s
n���t�e�����A��A��i����Ta>e�J��g3�{I�ldD�<�q��
cS@�D���0��
X�{�r��#������
�}_���w��徣�X�{y�����1$�W���w������/Po�a�_n7��
���w~s�ݐ�|��>ˈ�c��!_
��/E
�iϗb����K����KU����K�B2���3?/���OЦ��f��h��R<�@���d�_ �Ģw����	5).j�S�ȨAQ�b�M����I��u���?\�?UH}Y!��FRP��B��k
��+|��йJ!`�g
�o*\�V�~�B`�k�K!�����\!��;
�~�U����B��_*���B��_+���B���*�+Y��vN���Y�	&Q$�����cѫ�.��Y�G��Y��7X�ǡU,��ͮcls{��~Z�r?�a��ֲ|�J���,�z�9˽��a���,�z^�r�/X��vN��=��f��7,��Sb-Η^p�s�?�u�t9F��+,������7�c{�=�lo��ٜ8_:��Kg
c���aC���b{Þ8�7�#��mqlo���
;���P���qloŒG	:��������
�4lo���H���65'�3����9�2�P���Na���1Ӝ�\Y�D��%��;���U��z��q\d$2��'�3�҉�����j'��`�Wo2Rr��:�FR ��`���#P��qF0��:�Hd�L��&�JӃ��~70��3�v0�v2�v1�v3��0��2�nd����3���gp#���VF���m�@?�}��B?������NF�~v1"������µ@�^n���}�;�ψ���;8Ȉ��C�;8̈��~F�a�TW4l
Y�ܐ6��L�3bRn
$��^d[	��kA~���i�*�r��nި
m\`��EU��K��WN�#^�{ �t�����rWC��.�'s�����C�9�ɉD����
d��r���d��;��޾�.eT�C����J��kez�}�9Y)׬L��7'����!���ģPܺ2=�nݜx�D��C��͉GN��=Ďܜx6��kz�=�9�(��L�m��Bq����ls�Q(�{��È�.xf�D W<��47���f��!��u�s]�̎�ny���2byN���J���ez�$#��T�|��s*x>ˈ�9<�g��
�ٕ��Bq5���#��T�|��s&xf�j�W
�-,�C� �J��~ez��ws�R(�]��ݜ��W��8\7�+9���ts��	�y�4�+����!�)�Z�†9�)l �5=��9�ɉ��a�9NN}�8`�qr"�s��s�S�@Rkz��s��A��<�s����q����D��0������y0�89���s��	�y0�89���s��	�y0�89���s��	�y�9�F.x�q���6
�3��''<�8`�qr"D���6"-0#�̈Y�o���&��CNd26
s:P��&c��r���o�������Sv��������뤋�.���U'2���fU?�u�Ϯ�P�2�g�<�̦���%
�S���ϡ�����w�ۛ��~������Nd�+��e�(���U�O���0wg��
�
쉟�B.���*��oa�(#��K�������9FB 7���f�;�o��g��9�7�]�T�la$r���QF�Ly�S��{�ٮӌd@.2��lw;#9���@Էy��� �8�s����^�9�|��z�o��qۼ�na���=�T�d�
�#�f�n`��0#�����lc�"�9��-y�پ^F`}'�����0u�y�ٓl;�cΞ�V#�9{j#��)�򘳧�2��f����s���WX��/�^�c��z���6�g�2#��� #��M�k����dO���ٛ�m�'0{s��gd��g���̎�æ�ٱk�@?c���fF�:>/��N��q��,��s�f'�v��`�v#^?s�ܳp��\/�F�.�����s��0a�p7���F" ܃qE���S�T��O�Ms��c?��>�7�h�;t������N��;�#:N����Z�37�}'��
���~.��cǰ~��b��nF��+���bNy
쫘���
��u�{*���bGE��#	�D�h��1R�=;)��ް�����'�hnT�x�47]b�맹���%J,�4w�x���3�x�4w�g$��J���FQ�����b��^�*,�4��d�9��ÊJ�#��AK���<�:EUo�z�9ʚ�K�(�9L��G�ga��y�G��6��؈���P��<Ͻ�*��k��4/.}���^��ؿ�T����q���h��a���I�����9ɶ�ŧ���b�i~=�r�5���+P��M�5��-{��۹oc%j��#U���aχ��Ղ
�qF�~�{�M��������{�S`O�F�YX����q���od;�b����@?x\���q�nq�q~S,]�g����4�F�`͟�>�-��g�B��5�ۆ]��\�#N��zq�� ���5?Ȍb��</K���s��毳��"�
�7�38?��Z��S�S�'�ް�5?�-����<���B;{
�-���}`=�5�\�a�:�B�����=�S,�-�e;�y��yDǪ��A��8Kp� �|X[8��6�\�W�.�a��# ���y���b�r/�����F�5�b�l��k\�p���g'٪P1�p�����p�U�g8��j����PѽpA�
��ȱ��.��A?�x����K<�����%����^���V�8�
�an�F�7��{A͐��0��
��h�bc<?E����X[c�G���,�-�q䀪��m�@?j����q��a�la�����-�r�0��L.R���&ٻ�
|aR�M��D-Esr���D���d�7i����J�8\l����\�����2"2��� 㲵�����p'�4�Š���Dώ�y����5t�!��D�Rg�{g�7h7��R|~x�C&8�g��+��rmD�S��Mu�g'+vn`�~����������K�����Fp�ag#8�����l����>���	�dG[v1�3����	��������	�vdD觛��F��N6q�l�qF��΍�@?����̈��F�~�2�tnc���c�����ӹ��s'#�O�#.��:���u���#���E�䓩�3�@?]g�~��1�t�g���,�Ơu�H�v2��=Xܐ��=X\M�u���
#�O�Sq_F�SqQm�Ӫ��Sq_m�SQ�������#q��T�nFD�����]W����]W����]J����G��ѳ�(�g#PL�FD�9���O��ٶ�(#±�g�c;ˆpl���;h"��T\w��]*��;������G"wq�m'w�D86���N��pll��*�����Ã��>��[����õ@tP�kqEIwwqAIs �'�b���t�gD8P�xqaH7�⺐n3�e!�܃�U!�<$��B�yHׄt�w��ts/W�t�0f����0N$�\�Z�t������H��:��\nq`���7��� ��-9�tk�f�@ҍp�����/�n���7 �6{�.��\�6�
;Ɣ�S!��/���{�kWX(��E�RX,�n�U֣���6*,�f���Eau�mSX*�>�eۮ���v(,�N���o�j=��?��g,������ �?��+����^�A��[a�ߟ�/)��ӞN�A:�8��/���9�A��0���;g��[�����h>��?�ԜA��O��+��C6N3�<�"��!�眤�B��!����b�J�!�7�5����=���D<wQaP�7#�
��f�nP�7wXg�57�߃��*c	s���Bhn�GuZ�����ᣌE��ܾ�
���]PX(ڢ�A�S�
��f�oU���8�0�o~� ��i����ݤ����o�N*��ݡ:Q���Q��<����f\��xi~X
���Ve�q�xwe����&b�o���xwyoqm�D�U�P⶧�DQ#㌠��J�������tew"��W�Au8
?d�E�`ט�za��Ze��\�0�#İƀ�:>>����a����7��a���dž�zsF��"����P�48���'LC���hX3�nF�̙-Kf662�*%V[�C����_(2��Ef���lp�/�
N���l�����̆���q�#^?.vc���T����1��6F�~\�ƈ׏���q�#^?.Zc����j�x��H��Zp���cz� �O��I��?�ʈ���Hl�Il����Ć51�e�F�AMbC$\d�\6gEÚ��r7Ew]8ߑ~F��FD�+�\��T�^e3@kh����r�U�Q�j ��u�^�]`U��Y?HL�؋�۷2����#���6;C�i�.�b���l�HL4w�dU��!X-�p�$&:oHLl�#vW
�NQ
�p�T}3��F5�l�FP�<p��8��vGq(LE��A�@�7�0��1����2�֘/�c�P�#�^՛���S
=��:�T�
󀎪#k����S��vqh����C3�E���(��G1�f(8�94C�Q̡ʍb�Pmsh�b��C3���ͽ�c��^��zs��X���H��eF���3

�KgK�K'L�L�LH5m0qڴ�ā��z�u��^}G!^W�������^!5G3�'	�p�����v�-�9�igo����v���9�i�{�g�ٿ��ə�+�Ԁ2�c��ٿb'�L�uF2 <�aC�L;��8�r���5��ϴO0"*gn��3;�Dʙ�����'L8�R��8�r��G9�L9�cΦ���8�S�tpL��)g:x*�*g:x*�3*g:xZ�#
f:�0�tpL��
f:8R.���#�@?%�B?<S(�~8F+�~�ϕB?��J��s����R�#�R�{c)�ý���i^)�����~Z
�p�W
�p.�~����ةٝd�Q�tq3;f:ƕ�Gm}䢳�����>2<�qPy̨-���+�6�O����[گ�G*�a��6��̴�wa\8�s�39��ؐ�����������G�������S�Ǖ�Gm�s^\|��7$��^��(%����0����G%�ê_G�0��3����@�O������,ƵCX�{��K�D�T��z󑘾e��
��,u�:
��Sǟ�%m�A�?xe	��
������UC�������M�`F�Xl�V�����N�s^�x����x�i�K	��G{�]+vys��	�Ɍ-�F�H㬚P�6��"cN�
��P;�+����2��&�kr:�-aNⲜ��E�d\�E�c��o�P���"F��%�b��t$pn����O[��g�"[�2O����0�ܻ�E�K������O�™[�Y�s�EfH�����h��%��H��AGQM�O=�N���'�vMVZ���f0�2i�b\ŁE�6��(��܊Ka���pa�4�q����_κ�zؐ�W�/l��s��4��G�OT$����~Q�ۢ8!|xѵ�5
�p�'W�ˏ��#N|އջs8������n,��G�!ca�����R�|EXęg)��".<s��+B��y�E\|�T4Q�	_t�E\�cX�J���2�>d�B�RVRۚ�K�[1
� 4�S
�̙�p#������*N4��՚��b��u`�������������������qg�e�4Ki������UZ^��BˋW^hx��khx���o�d�k�xխ�^o?]�#^ko�< MY��V#�oo��-�v��jBFpCӚ�o�3X����� ���\A"jgϪ��˻s����a��Bձ��}ߌT+}V|���V�(>W��V���7��͟2�F^Y�+�i�\͈W֛��z�5���*���W�����5
�y����[�V��.�҈W���zY��
^�)�2��)�k�Mxż�K�k��Y
�L
�]�
�ZyS��Vu{,ᆲ�
�����(��ݗ5�բ�*~F!^-k�{���X�0�>������F�z�hW�i��睕�0RĶ�T(�+�o�sX�]���M)�+��_2�VU��B�'��(���	x�_1�����ճF�>
([<!���3,����S��+��6~�s�mx�Ǫ��laXs}�Y���`'B@���Z_�
^o��c�����X����7�d��#�
����j~뫫�DZ���-�	˫�̀W�±��fX\]�B|�x�
��N��=
5��%�t@��v�����後��_)���lW��+~��
Q	�5dQ!*!4$*!4$*!4$*!4$*!4$*!4$*!4$*!4$+!4&+!4&+!4&n�6����`�n��k�5�5���U�Ђu������������������5���U���ĉ���/��`nyA=��%����y��魈�r�G��J�̧Ҹf>���il��46�է��e�TI�ol`D���D!>��>�Ɖb|��}ŠU��F�7NTÇ72�ϝq��̈>�Ɖ��VF�A4N��}���Z<�`��\<�b��\<�a��\<�c��\<`��\<b��\<�3by���2by�
��3by�
�O2by�
�O3by�
��2by�
��3by�
�/2by�
��<#��Av�.:'u�����dW`�s"Pw�]�EG���^��~*:�.��y�DP�Av9��;'����1w�9��Av9�λ�Z�d�c�s"�Ov9��;'�d�c�s"�Ov9��;'<��1G�9��]��ʼn<�71���[�W��R�5���	��=|��e���o�f�p������g1\&�[���yF�	��=|��e�r�o0bl6A���0bl6�uÌX�"A�uF,u���&#��HP7ˆ�.ԍ1b��u�X�"A�mF,u"������;�<�H���˳��{�<�H�##�g�of��,"����X�E$��Lj�YDrt:�C,�"���ň�YDr�{�<�H�#�g�`��,"��C�X�E$��ψ�YDr�G�<�H��8#�g��˵�\""�~v�6�KD$��.�Fr������H.�\?�\�%"��g�k#�D���.����ɵ��3i[�Q��O,�~�?ʈ��ډ2|x�}%�a7�uv�`����'�&"X>���ˉ������r"��#�mm���`�{[sq���#[�<a1�.���	�ia�h#�DD�G�%�H3���r6xLD�x���
<a/g����G�˙j�vt����09MRA{9sa�	��˙��H�k�\��D�g�r��d'<��3&;����5�=̀'��b&y��/�K8�?>€ϡ~�=	˂��*��[r&����\��D�{�L�%�N$�g�e.Qv"a���K��H�8G��e'6ξ�\n�&
}|�����G4W;�`s7#>�q;8i��6F�r/#�t'�0tt#vZ\���D��ۣ7����� �������Ф�k�X'�w����~*1�ݚ��4�5��Nd��Zn�܀��+�?'2�TO�;�m��
}_��wQ@��7
�u���ܰT/��iij�id����^��O+�SӮ�b����o�MSs�t���]�9u߉���q]Y�a"�w��B�Y�ħL_�B����db������^�������ovR���"ԏ�2`�@V5=�8Qx�1Fp.Ҷ��\�m'��H�N2�s���b�"m;����3��\�mL�8Qx�9Fp.Ҷ��\�m��H�XG�D�m��Lb�#8Iv�eFp��6�e�D�mW�dD�g���aF�~�1"�s������ы�~��bD�g���QF�~��gD�g���IF�~(��0Ǚ�[��ӷ�觯�觯�觯�觯�觯�觯�臮!v�ӷ��o#�O�fF���-�@?}��0�������G��,��Έ��F�~��B?���͈��F�~�2"������`D�� #B?��9̈�O?#B?G���o�	��	��	��	����彼ǵ@��s���2a<�e�x�˄�8�	;�q.v��\&�ǹL��s���2a<�e�x�k�Ȧ0�jfN�v"�6Ll�?�z�+�2�)S.�?���JE�u��0?���_;t�\�H�
:�1�oå�t!�C��^C���n�;��2�Z�!8��\I֣�c��S���O���!x=7�յT��\];�EH���\�xd�h��-Fp%Y{#�¹vFp5��C��Jَ��<�����'��qt�C������t�Q�j�g�uF��K��@?��Mq%�Bpb��-~S�0{};#8��EF�K�meW��>��y##8��g?#����QFp���?wx#8D�:k[�����!�t̀Cp�d7#8���&#8�n3k���v������.Fp�s/k{����2��������}�N?�}6��߼��\<�>{��3�?7�S`�}��FpH�i�;�k߼q��ǖ��[XX��)�vq/#8D�$[/��ώ���܃�jl���0���������^�e��a�H��p�����'��b#��j6Q�c�������q�e$/�M>�箱��Ԡy��N��ju�`�NF�G��38쵇����p_@�A�zvp�me�}<fac���P�0y=#��6�]v���$�E�6o��a~�
�7�(̭g��!���c$T*4�\e�t�%(Xh�c��${
�-�Nr\�]������sìm$�p�*��5��>K9� 9�#v�7󈁚���G��}����y�]f��'_���!C�"�9��m9��y#�9��=,r��=��g�2#�C�X��y�0;�yΝ`F��l�]#�9��=R"�[<r�=��p�F�sv�S�<� g����]b�����<�n���l�b�A�sa/G��y.�W� �����Gv�y�n�9ϹC#���x\@�s~�{#r��#<?E�s��#;q�x/�^q�NO�a��'A���6��gs�B���S �ټ���^�<���0�3���r����jm�o�l��M�۠��<Dγ�	9������>Q6>�\#�9{��)r�s[y�A�s�2�g�*�9�<�j���7c<�����Y6�Fgq�
���y��9��6�I ����7y
��y�o����B/[/r��|�����iǵ��~�7�<�qL��8�cK�<�g�B��\�V���h9�9:��!��pTq
;�P�A?��چ~z��*�<�r~9Oub�{���?��7�g����Yl_ؠ�g�#;��d��Rfa?s�J��M�)�~���
f�����C�~n�{#v�7�����a-`/|�8�b���v�/�x��2�`��eް~�[/6�Ϯ�aG��5~숟�ɞ;����8Q�F쌟��\v���1[�\{�r�æ��^��ص>���D�Y��;�����ga��܉s� NV��8d;�6�7�q\����	��U}�$�)v�ϟd/���j��m��T�߶�����Q�A}v{?#�?=�K�9����?���������`[�� �6�/�r&[�玨g��n�ŗ"��v���͋����%����9��lCon�X�Л�ܷ�}~@1�|�6̃��J
6���R�Z��0�6z��ͻA?�����]����#����ƈ�oc����ˆ�#mey�3�A�So����v��>�誾2�r����6'���@W�:�H�1�bj�F`��61�?�����޴�Z��uZ����ӌ�{��c�S?*���C����MN0�Q�4�;�����[�X�b�ja��0�n���D4N^a�ד㌀�S��-�`��"�B�
�P)U�b��ˌ�)u�e��.��X�����P�t�C�{��`�ӽ�� (慫�P��7,B�gg�E����ȡZ
�4�x�"G�nF0i�R�#�?@�X���bA��qX���0)�"��A��Ps'x�"��u�qy�-��X��W-�w�bް�����v�mb�P�&-�ط`�y�m�PM.�H���i
�R�8t�����=�`���,5ϰ`q�y���C���sE=�ч�v)����,5G��@?l�X�_�V�š��F�<��
�%�x�X�?�������/�`	h��K@���`	h�����'o0�ԋ^��@��9���ی`�9Ɓ���6\g�k�ϧ6sw��|�~Ft�X�b��[�b�g��;�{C,�|3�v�%��.�',��v�g0�l�K<��9TK<j�K<{�0�Q�SR�8rX��D,���
�fS�ӝ�`�q�G��s�[ �x.y-P���Wظ�T8�o���1fKI���L�_�R�\4�����b)i��{5���-��:�����R'�SqomkKIs�3�hb3*����7KIj�#�e�����ÇA4�b~,%�
�o�R�Z&N�����)����T��1�hb)I�&XJj��KI:j�RR�G�uQ�ǞO,%m����|KI��� ��ͱ0����yD�RRs?�7,%5�eф�����C�,%5�7�RR�_}��~��XJj�䄃����b�Q1�XJT�@?�}����&,%5�9��R�����3���)�x��B��3��K<󧹗`�g�[�xtt�%��g`�GϠ��3ϩ�K<:��Z��X♿ȞK<:>��e�*,��L,���%��b���G&,�,l�hO,��>�xt��%�;i�8�mK<:B���1��xt�%��Kl�X�Q��)�x�|�8�k<���<>�ǡ��T�2�+��|��u��|����<>���8X���a�H`���gU�=�@K�%���e���k�1�ym���V3��#1�����u�me�b�Ϯ}v��X@���"C���&?[z�}y�%)3dd]��uz��~�Łϯ1dr������(��_�`�k���x�����/v3�u��!�F�8̀���x��8ǀ�_\`�i���r茶8���2�3��~.'P=Y�O��R@4dȏ:h�!(h�������vijڭ!(j������=��/��O{g�LZA��A
AW�4]֐><‰��#��P�2C^�c��H�~q\C�'�>N�OC�4T�_=�џF�9�!�㜆����>.h���C�ǎ�o3�-*�,(H��@�}<Ȁ����=�d���W��-{L�����`��35H�}u��_QbK���U'�7��`���~�T�d���2�-�-�Ƿ1���^Ъ�xk�jh.�^�F���0�V
3�g+��+V-f�_��`J�5[	�_�h���Wlp�~M!��=�5���s<�͍)e�`�+�/[~����k6T}��D���=�9.A����g(���Я72�96AM�c��'��3_�e���=����=Ŭ���A�7
&���ׄX4A5�* fu-�u�?�|M=��&x��C��=�b(jՈF�x�Ǜ�ʗ�t3�R�Ht�� �º�TS��.���†�Ts��8/�����A�Bl���j!�Q���~s1�ߊ�~���^s�//�߂�t����uY?�
H5������_�H}a! V%�g_�������1C��~
���Z�Y�����b���
�[��M����M��uKC�׈n<�5����F�S�ר~�����T! �^���(L�oP��	����`�� �)��=nW���q������oU�~���q��
L��Da�� ��T@����N�R�H�W! �^�W�j<&r��c"� n<J\w�bB� n!&t����q�naU@����T��.�º�TS�B_ݺ�
��R-���uKq�Į[�/�{TŬ�G�j^�~+��-�k������
Խ8��@���M��u��R-�?���*C���6j詾i+oy����V`�.��,ec��/mئڷX���Oc!�����P|TE4�� C
1$�o�g��8�������2hg��hT�0�j!�CG�(�q�ja! ��R@��DD�����q����v�A�B�;&(F:�Ū���T�//���A����T3���"э~
�W��1
yL��J3�#�d�s�ؘ�I&3������@��u6f����R��-�o��v+ۨ�ђm�&FK��b�T�Q���z/9Z�{��ƸsTܸ���D����1��nč���R5�.FK�x��[�P��u��[I �L@=	��!��n���r3�^t7#�����
���
���J��!��j��)�K��Q�c���1szdH͜>�s��'�����\5^����Ț�{&f��Q�� ��З��grv΍���\�VU@균/=�Ga��ӣ2�L�31;�-����=�s��'�������s�FC���P�c��
1;�S�.�-;�	b�TL����Qdf�
�P#yCd4I'�%Af��� 3�FQ��Q� �O(2i���4��DuAf�G]��c��L�Qd��(
2�J�į��3�Ei���bm�A�bV��0�z����{A_:j�����{������)l7�+֓��Z�y�zJ���)�]=r�TO���A�WRO��^�O�RO�β��l��_
j��)d��j�1�Rġ�)�fJ�
��sz�9PO�M�˛*�c7U4���nSO�����F�S���S-��Sb�A?���~��z
�l������?����K��P@�)���X@�)��~�* ���n�S5��D/cח���k�r��w�]_.�T�����5���m2U�u]Abm�/e�X�S6�����T��6����Q�T��-l>�WTOI����^Q=%��z
��6/��͋�=m�bmOۼX��6/����ڞzJ��SbmO?%f�)�KۼX��6/���S仼�)�&Ծߪo��sWk��o�5Dݷ���[aޚ��5�R�-BXC4�5D �XC�Q@�5D��c
QO�s�!�)q�5D=%Σ�%Q�%Q�5i��C_�4}�}��!S ��r�2��ԴJZ���Qi��"s.�IM�D^�y�.��U�?�,-��`��/�IJ�(�P�d�R�e�J��ߔÛ��*�POV�7Qw�T܊�뮵�kea����Y��A�W�C��J�"��`��Ă�
cC��5}	9�dL ��X"1�A,��د�ȯ���<�����V��X��҇aH.~�ըX@���Z��i�)A:]_a��k�UhIC��\�0�S�]t�W�T�����b�˘IM�f.���~Ϻ��b��i3�o�墾vu���U,�*�
/b���h�O�A��:��I��d켞��9�*���V�����ǿI�ki)Bǻ)%Y����IQ0h�"%�׊��m-\�u�	R�j��EZ�O�
�T��Z�����+׈R4B7?�4�)��A�b� %S5HEp�e�y�ޜ񨥾V&�
X
�.0�nW��,%�e�
l���E
�SK�H�}6dZ܀�`�A�j5�و^�
�X0�ِ� �$MJ�o�wV��`�����;y#F.r��ī�u�X-P��[:�C��"s�8.y�aI@�^K�E�r������)�٩�9�{�ӝ���򷕷\�fFW<��j��_���.=�\��?�O�������<��nr'2����&Q�kƾ�r�����̾�"�Eb?`y�\�_X^y.�+�W����	����}��M3͝�e���@�az�nFB �����E_b���<y.�_,�=��o���)�=�d@�3�����&F
 �)����3�72"�n#8�`�VF" ����1R1�{��rO��Y�wU��}#���Pi��*-�Z�v�J�.U��]�ҢKU��rD�D[ſ0�r�=��klˋI�%l�"lL���1�eT�
�Q	��X�`�3�}�߲���߱�kῲ�k�Y��åb��2߭UT�>�������r���r���rsmh��ev��<^�!Q��>!1�I���H̆�"����9P�tݕ�b��L��X�R<�>I���5��cQպ^C�F}'#�x�!du�<�f�'@w��g�@�u�Q���g� ���yDZ�Q�̀X�"@L��o\f�q��A��� xs�J-D��0bi��2���e��ȫ2�߸ŀ��ƀ(k#@��P(
��{��
1
g@d��B�78�� ��b�D�;[)r������U)˸���b���e����6?~�˽��k����oX���`�?�#˽��O,�Q̿}��_b�ܾ�r�3��,����,��w,�!�߳�0�@r2��ܛO�r�,�1b��c�{+���O��,����܇�5�{{�����{���=����>��!����,��Sx\�>R�o,���d��,����d�̗X�(zx���*˽�_c����,�z~��^ϫX?c�wVo��OIW���5,��l-˽?~��(4x��^�?g���;,�z~��u,�����_���+�{��r�oX�-�}?��}?�YB���c�������w4����h���-:Zܢ�Ŷ�=���q���q���q���q���q���q�Pi�*-:@�E�����ҢTZt�J�Pi�*-:@�Eh��(���Y�������r���:K�?͇Ö(�ࠡ*ra[�����\�F�&f:��b	�� !�~��*�O3�\e�YF��l?�r��w�G�P��<R���*;hQb�L�8#H۵�`�i?���~��#�O�F������0"�s���AF�~������~��}�觝-���v��D�b��6#�O[<JQf::�~:�/b/��>[�D��Ĉ�?��~:|��p���*��w��=�13��t�1;��Ɉ�{�t?#��bD�S: ���~z�a�v�^�.�v]�����uaܷ��ؿՅ~��ׅ~��ׅ~.1"���.���.�ý�.��FD?��4��&�I��\�H��.
h���T�Lu�3R�3L�f����Lu򀀊��Nv��Mu��Z��d@��Jf��_d��Y1���⫄K$���+S���L臝a&�����u���w6�(�:72�t�k̈́~صfB?eB?��P�2��.)S���P�2չ��s#�O'����[��d��	C��T{'��LuqT��T�-�Luq�����.�h�\��ש.���u��*��u����S]�ϱ�u���v�Nuq?ϭ����s��eF��+s�.w�\��<�r�-��`��|.��>�v���&�[b?��ؤ�-�[�����.pd���Cb#��؞�y�� 6�N�	@a�4K����C����Y�st��;+6�Nwsgž���]�x���˱�_ۗtǍ���+z�>��2��-�p���7^��l��rU�{���F���'Q�DQ�y������Mf2�˟`P,�
�/��[𜪅p��@|����@o���b�ê9��^��;Uv����s���3��ۯF��sv�e��_�%*�UV�r�_i�l����3��2�rY�\#��?��ep9��h{��G�@�L�=���s��׊@���)*Wʉ}aQ6Y.�n�ݸ��ׁr��oh�$��ļ���֗qK<H�@���&�l�$��K��
$=�\�OΜ�CX�a���v���������{@������������{��
{JX�ak�
<�a���V{�s�{��"?~/	��0?~�	��0?~o	��0?~�	��0/~��	��7{�0/~�	��7{�0/~��	��7{�0/~�S�y�=��b/~�ӄy�=F����y�=A��ٓ�y�=E���ӄy�!L�C�@����?��^+����D��^s�	��k�
a^{�]%�k��k�y�5w�0���n���M�<�����}�a��n��}n�0��s��y|�["���:w�{{�u��:xy5�ҭ��	�k�'4�
|�и6�yB���	�k�'4�
|�и6�yB���	�k�'4�
|�и6�yB���	�k�'4�
|�и6��G�Z�ǏƵʏ�k�?�*?~4�Urկ}W`�hsF󊹽��Y����9�IY0�z6��S{�(g�\0��rV>G�ݬ'�d�e=~	b�Z!�%���,Y�_`-���K�\���%3����Z)+�J�,����˾�w�����^��#��<�ϛ'r��풋��k�5K^J�䥌G.��k�ɜ�W�d~=~Wb��}ѓ�[D��E�����\�e�O�D�hE�����sXC&P.���p9�k�@9!^�\��*Y��e�]v�&G��V�~e*�L�r~Ae�Z�wZBY�u�3���E�A�]~x'@Oά�'�+�捕k	��ʵC�ys��Äys��#�ys��)¼���Q¼���4a�\g�a�\g�8a�\g�a�\g�$a�\g�a�\g�4a�\g��F�N�n�3���%̏�Y������a~�����a~�.���a~�.���
a~�����a~�����a~��k6���'̏�-���&̏�a~�	��D��e������a~�V	��w�0?~���w�0?~��0?~ݵ������	a~��&ǫA`��}��Pv�U��DXOT��\��{E��:���%�夦S����r|n�\x�&𼻻'�\�ww�]*��7r~��(��,�d9�nk��y_;����^ߐl�IO�mh1O�ihY����(J�eŝkV�닸E���FQ*�9����Z�_���r��_x��{V@g>����m~;��&�c�^�C���31�m�ɸǙ�O�k��q&yK���('��(�yŵXEq��q��o��&�s�5��k��Jz�9�Hx��5�$��IJ��$p�D���h�k��{{M��Q"�F�sM��s�C��<x���J���&���O��b�be���@|�@��K�m��U߈�&�׷�?��/�'���v���5���R���k�?0��[@7�l�/6_+����E{M���Ö�VΓ�k�w�s���_�H�-�e|S9��R�{E�3�����.�]�OX�a�=� a��"��a�	3v�0�aS��v���æ	�=�a��'���
<�$a���"���ӄ56��J?~g��7K������#̏�9���'̏����uyg޳�C٩�ϓKT?�'�	�yr�0�'W	�yr�0�'�	�yr�0�'7�X��
��59�ȥn�^:d{M��Է�\���59�ȣ��Fr�ȥ��^��y.}����G��ƙ<0��r�@{M��y!�a���s-P���`��:'��GE!y�ߣ�������Ϣ��Ϣ�����%��/�R��s� 0��Saw��� ���ߣ�bu�U�v�yTI�1�y���*h�]m���F%�Ǩ�{I�k�?�����Q�a��hs9���gfs����=�Q%��F��a����\�wy^֗��o�:�G=(�}����i�s4���\�/�+���e��D?���>	�UI?��ԯoe�l�][��r��-L�w;�E��2�k"N�5���B�v���5[�"�m!�����C�Mm)�c[�o���(���l)ק�5��v�K�r�X7��5�.�鉓��	�<�a���&,���H��%¬�-�z�
a���!,��U�
�KX�a�x�}�*{@X�a	k<�Q3~����	a~����o�0?~���N����{A������{E��ׄ��{C������{G���������\��y�
�,���,�ݓ9�\&��F��V�U�^��m�<�6�~30����-KQ�,0ne�D�Of��g���-�H��e��h��u@Y����&������R���G�\�~��%�rr�Q��P��P���S��|�[�&�4U��S��wUE��XkT��׏\l�_"���Kǹ)��T&
�yDe�@��T&	�yBe��2O�LG������o�=]�51��"O�>�J����\�z�+�{O����2M�>;o�9��e�YEү��e�ax����C���f��O�尬����w8���ٿ&��{���7Q�'�,�	pS�����B���+nf�o8��;��?��8F��G��u��{\<�@��Ǐ�x�D���	p�O\<�D��������x��b"^�"&�=/b"^�"&�
/b"^�"&��.b"^�"&�.b"^�"&�}.b"^�"&�M.b"^�"&�HEb"�T$&�PEb"NU$&�XEb"�U$&�`Eb"NV$&�hEb"�V$&�pEb"NW$&�xEb"�W$&�Eb"NX$&�Eb"�X$&�Eb">�@Lė����1�] &��D��D��D(�D��Dh�D�D��DH�D��D��D(�D��Dh�D�D��DH�D��D����L����v*��N���@���@�7b��^s!'�CU �CR �CO �CL �CI �CF �CC �cCd�ʅȎ%��";'Dv�H��X��q�#��<�q�#��<�q�#�G<�q�#u�8�H����8ޑH�������D��HL�ю�D��HL���D��HLı��D��HLġ��D��HLđ��D��HLā��D��HL�q��D��HLī5�D�WCL�K5�D�QCL��4�D�KCLċ4�D�ECL�+4�D�?CL��3�D�9CL�k3�D�3CL�3�D�-CLī2�D�'CL�K2�D�!CL��1�D�CLċ1�D�CL�+1�D�CL��0�D�	CL�k0�D��[�ǻ/DB��B$�Jo{�56�Ln�h���$"a?��bE͈*�eFT�3�
��U�@�aS�;ʈ%�NF,�^2b	6�K���X�-d��#�`��;Ǩ��v����~A`�.�D�R�Εw�u��P�+���
!RoM�H!�H��'�7�����	��<���� v�	b7����gL�q�Q�K�q�Q�J�q�Q'J�q�Q��t�J�)+M��4���t�J�)+M��4���t�J�)+M��4���t�J�)+M��4���t�Z�)kM��5���t�Z�)kM��5���t�Z�)kM��5���t�Z�)kM��5���t�F�)M�l4���t�F�)M�l4���t�F�)M�l4���t�F�)M�l���������������������^�k�Diz�Diz�Diz�Diz�n�)"��)"��)"���D�i"E�4�"B�H!M$�()�����D��h"E4��?�H�M��&�̍;���b��o+����Ċ�ib)q�(ң���Ċ�h`��E4��?�X�M��&V�G+�����Ċ�hbE4��?�D�M��&Q�G�(��I��$��hE4��?�D�M��F���^S�G�(ңI��$��h�Ǖ�+���+���+���+���+���o��������5E94}E94}E94}E94}E94}E94FQ�|C������(��1�hh�"����(��1�hh�"����(��1�hh�"����(����hh�"����*����hh�"����*����hh�"����*����hh`r���(�&1&11UtE�������*��I��� &�� &��&iRE�4��I�T�$
Lbb��&U�I�)¤�a�d�0i2)Lv��{�
���j2E5�"��L@M&ПE�40S��N�)�L�(M�H�&S$J�+�����DirE�40S��S�\�)M��&WtJ�+:�����NirE�4��S�\�)M�蔦PtJS(:�)���Ni
E�4��S�B�)M�蔦PtJS(:�)���Ni
E�4��S�B�)M�蔦TtJS*:�)�Ҕ�NiJE�4��S�R�)M�蔦TtJS*:�)�Ҕ�NiJE�4��S�R�)M��f��f��f��f��f��f��f��f��f��f��f��f��f��f��f��f�锕�SV�NYi:e�锕�SV�NY)�)M����&VV�XYibe��4����T��YiRf�I��&e֚�YkRf�I��&e��~JSkzf-���\q���V@�MkM7�5ݴ�t�Z�Mkeߦ�5Q��D�F5M�l4Q��D�F5M�l4Q��D�F5M�l4Q��D�F5M�l4Q�QDM�SDM�SDM�SDM�SDM�SDM�SDM�SDM�SDM�SDM�SDM�S6Uڞ�lڞ�lڞ�lڞ�lڞ���F��i#E޴�"o�H�7m�ț6R6U�H�8m�l������FʦJ)Ҩ�i�F�4j#E��"��H�Fm�H�6V6U�X�Gm��6V�Q+���}�Ɗ>jcE�����X�Gm��6V�Q+���}�Ɗ>jE�����D�Gm��6Q�Q�(��M}�&�>jE�����D�Gm��6Q�Q�(��M}�&�>j��>j��>j��>j��>j��>j��>j��>j��>j��>j��>j��>j�R����[m����E��F�a�QtXk�
��(��5�>j���Z���(��5�>j���Z���(��5�>j���Z���*����>j���Z���*����>j���Z���*����>j���Z���*����>j���Z��6U�Q�*��M}Ԧ�>jSE�����T�Gm��6U�Q�*��M}Ԧ�>jSE�����T�Gm��6S�Q�)���}�f�>j3E�����L�Gm��6S�Q�)���}�f�>j3E�����L�Gm��6W�Q�+���}��>jsE�����\�Gm��6W�Q�+���}��>jsE�����\�Gm�裶P�Q[(��-}��>j���'������ȝ���G��k�O	q��q�������:!��?>'ĵ�G~��_vx7ݩ^�������T7�oqa�����qq����y?�R��~B> $W�����!B>&����B>M�x��(!����<�O�q��4��'|#NG�p�8`q2�;�d�y��0P���+B��DRHLR8HLRXHLRxHLR�HLR�HLR�HLR�HLE�ELEFLE8FLEXFLExFLE�FLE�F�>H��_�8�p�9��:��w�MZ�a��4��4��4��4��4��4��4��4��4��4��4��4��4��4i�4i�4j����6���	Ԩ	Ԩ	Ԩ	Ԩ	Ԩ	Ԩ	�x	ķC���p|���|���|��)L"i
ׇH��!��=-@)�"i
�H��!���~��)�"i
��H��!�����) "i
�����!*��z��)��b
������!*��{��)����(Џu�{�%��7�
���h�B]��;��1��tL#-�HM�XM�XM�XM�XM�XM�XM�XM�XM�XM�XM�XM�X�O��c��7R8N�����������������������|;�H
�I
�I
��I
��I
��I
�I����$��$�	�$��$�
�$��$��$��$��$��T���T���T���T��T��T�!�T�#$���c0�8�p�8������q�5FM���Q�Ĩib�41j�5M��&FM���U�Īib�4�j�X5M����U��8���@VM �&�UȪ	d��^��`1I�1Ia1I�1Ia1I�1Ia1IS5@0���p��������@�Δt�?����J����V'�*N�L8R�ULy�RLy�RLy�RLySLy8SLyXSLyxSb�����
��'����hR5���������������������������������y F�4��4��4��j��|�'P�&P�&P�&P�&P�&P�&P�%�"�z���3�����E$��-"�glI=c�HZ��'"�g8I=ÉH�NDR�p"��pb��pb��pb�����NDE�V"*z�Q����Գ��;����p���p�D_>P�1�V�p{�u���@�ҁ�J��"��Ka�p�uXC1��\�	p-lp�k	p͛�Z7#�5nN@�<9�"~�B{�R{���������aѓ�!�'�A䞼3���oϤ𡨅aCQÅ��	E-�Z�p��p���@k�J���@�=y�<9�'zrXO��p���a<ѓ�w�'��DO׉��=9<'zrXN������+��k�ɛ��kV��q�\~K���[�{DE)�Ձop��ā<�5��ݺ����D��^,���^߫l��S��k6PN�W�VG�8ⷎ�@9��:��=m����k�;�����b��:n�b��z�O�r���@�_6���J�7��9��x�����=l���Ö�{�2a��V�v����V	�<�.a���#��������=$��G������Þt�ȏ�S������a~��	��0?~/��0?~���0?~o��0?~���0?~�ⷴ�0/~K�X��o� a^��&��^�}1nԹ�~e{M�?���Yn;��?�K��+1� �X=(e?W�d��������B\+�C�ˑ�	q�!��ˋ/ӄ��������2��B\>|9N�ˆ/�q���0!.�!��)B\|^#���n��� �Y'�E��AB�'�����3B\|>�%�G����1!.>�����%!.>�_��p
\|������n����YH�9�9��F��\L�%D�z�9�/���l��l��l��l��l��l��lH�lH�lH�lHm��y��y��y��y�b�� �Pm���O�H�}�����B_�R?P�ʥ���<�(0B{_�g��U��U�� �wߙ9Fe���u�}띙#?�V{_qgf�@��ي��vf�	��Q�C�)�'����jOhU>�@�Z�'����*{�:;�*�m�?����+0m
�ʾ�j�kՌ�j�X5cR��MռIռ��n��y��=n�����Wi �R5�RuΑ�ٕ�s����:�H��u��3�LͱLͱL��gj�e�<=S�陚�������Y�����$S3$S3$S3$S3$W3$W3$W3$Wg蹚'��'��'��'�:C��l��l��l�cQ�r�P�\�\.��Beq���PY\�,.T*��Ņ��Beq���TY\�,.U�*�K�ť��Req���TY\�,.U�*���꺑�R���	�M/�kzR�oz��v�+�
1�4�R�BMo fo�@�*P�
�kě�M�UKJvZ��7��ߐ���3��$��oH��
1����H�
Iҙ����_���j�q݊oHΈp��論���~I�;`��f߯r��=C.:���!�}�Đ�Ͼf�h�or�/�������o��w�����A��P��2�8�wň��B����#C��O!^d�O��?1�x�C��3�x��!�;o�?�����.������������L�0"���w��i��a=->��‡��@�������zZ |XO��i��a=->��‡��@���&�=�% |XO�}��>��‡��@�������zZ |XO��i��a=->����~�o��]@~`��� �����b����\T�Dܖ^[A[��J�}��ZP>~�0~U>��:��ț�YKTū�j�ע��mx�q���g�����$�&�4:F�h��"A�G�3'	r��8t� ����W����+9f�WJ�W�e��E��G��	r��:|� ǘх�9���"ȑ|��ٱ|8���w!X�����xm�$��k��M�\��O]v&�{����
��~\���+�/Fo��x1:~� Nj�)�/6_�'�t� Nj��	/^,T�/f(��\�NRna�0^�6�<atl� �b�A�[��	B��L��5zMm����!��k|C��s��7�=%��kx�9A��J;il51F�vZ8�v�'�1F��@�Y ��>)$^����^����d�W�؜,`�;\�(�~N\�2�'�� �%61޹����p�ARˈ��c+5�$�y�1�-�{J�����X��4�ǝt˥���}���e�r�l�4P����r���@�(PNz�M�Ee�l�@<�,p�<P.0��@�R� <o��˿�+TN�K�^�s��ȸ��-�|�"
�K���^;{�k‡k�_�L�$m�@;�l�"��E���9�^��Ǣ
��;]�2�2��+��Tn ۥ�N��_�p�pL��~\��'�u����Z\���Ռ7��=�I�ӥ�g}�*Q���3�:�
����)!׽&�{�e���Y,�
v���^�����?��?Ͼ�zI�c��a���ۄa��n� G��	����U��9:
�&����	�l��
A%����v��
��Ww�����kj��BX��,��đa����k�a�u�A�����֩ST{o�����!dS	BȦ�ɰ ys� �l�>A��:A�_�z�&aX��?CȦ�B�1G7�W��`�T�Ǧ��Й��@	 
4V������8J�t� �E+��	�6V�ÓGB�N�##`'��
���:5K�u�
AH�Sk]+��)�����@^I��CL�bp�c���3�	B������?X m?s� �����g(,В�ܿAM��Az�pv� ���.�U��,
X_��\9w� ��9�л��6�:rx�0A��>�4^����<�@t��<�H����!(�(^Г��(� (/S�@P^~օ���4���u�n���<M�r�A��q�F
oа�s����Yb�p�8�����)c�trk��=5\�C�\�ܙ���gev�b,1���-�@ �"�v���QU�[W(��%ur��]�@�jx�W5�s� P��Fpb�p�A���2A�z�y-/�w�!��S�ex�=A�j�Z�?C@�|{H�����G��E:|D�L���>�I��hX��T��D'!��\C Y��t����t��V8�j��b�M�õ�!O����ɭ���X:\�x��ψG�a:\�:"V�4$`��p�-A�U_�"�zA
�ͦ�B꼠)
��_R
c��W��p:|�J�[\C���q���-n�i��ͧ��Dx�>������Ф�O'wO��b�8�o(˱ur�$
3�j:�&�c���-���n,Р�=����4�®���Q�䱯t��
	�x���4M�R��[h���8Dj���'8Ej��֢8Fjt�Z�Y7i!������~��AZd�(�����9Dq�����鱵ut�V���::B�$ln�U�g�A;�7�����x��}��)�X��ut����::J����������:���<6���ij�ݮ�c�	B��Sbb���E^G��Ȱ�)*��::I=&6��NP��]��S��&���a���OMn?�F��P'�#�F3�j�T�������;n���y���8;U3f�v`�,��8�jt�H��F�����U���ī�y�q���<��X�O�>�2�H}/��2�Jc>�2�Lb	��ڸO�W�5�BkC���3_��q�X����S4�����T8>kt�fu8@kt�:s�5>�� ��zd�5�2�]��Gi�����i��Sw��F�I���Z���r����b�S�F7i��Z���8Ykt�����F�����/�R���mop��h�$,~5Z���_m<���X�%Kp�h�r�`�Vh)�c�Fw���AX��+|G��=�N��xL�,��5�Ó�7Y�M�:Xy��T0�6�P���=�����!����!�
���!�؍7#�K�=8{�[�H���7Y��?���G�n�)
�8.k�ֲ80k�ƕ��	�>���+�y����'1[A�l�A��*A��K���G����a��<{F���#��f��%ܳ5��foN���9J��1��%{� D�U�;�h���wP��ӄ!f����T�g[���`	�JV~ωp�϶'���#(D\�yҸ�O4n�0��#�8�x��c���mM]#�ߟj��8ۚ�C�xN���|���Ql��4a���!V����Z��O����٩:��sT?���k���Ӕ��+ ��T⯈��6^S#nk�rF��,qF������D@o+���rn����}�un� (���9aF#@���Y���	�5���![/���M��"l�a8x���	�L��[�\�6�S"��ۺJ�
,���!!���S�K�/�0�'�����u�Z6��u"l�M��a�m�;����<@�l�̓���Ȝ�N���T��nwՉ>��C��s�:m���2a����Ƌ˕+�!���R����Z�!���=���a�����Z��N��*EN��*W鴴Dya���]!,0�Aۜ>H��,�qa�m="F�@�zt� l����Y/"O���m�Q?m�<AȢ5�a�m��`�m=�j��[z����:�/���6<��4*�c�zIq�Ƕ����m�$u}��&�<���6Y>F��-�����6Y>�b���}�m��4f�m�zO3�m[��.h��"���p�&��(j����Xp�&��%����7�?E=>���zl�m�4*�o>D�v��m�����v�&������g����ا����4���ƞU�m<MXn�n��L����?;Up�؜�N��8-&�썏S��썏�(��e��i��y~�:�����㴆�8>A��g.ߧ�v�M���O�!�OQb�
��#��I�+�4?��x��
7p<ەgs���SDk��c�Q��
��n�x�r�s�y�_x}0�9���u+�7��!dsD���9����9������A��Ӳ��d�-��n�'��<O�8����h�'+�h�Op�<5<��eZ�_���_&�_&��
C��Z�_��:,����!ͮ�B��
��׹��f7h�T楰�7)����44�
ܼH��E7�E:,��-�7`�MV8R����;��/к��%+�эh��n�����Mj#<�����0�6��<&��U�¤ߥf�I7�G=3L��C�`ҍ�P�n���n����n�F��\�g�����^�n��w��&��4�O7~A�:|��s1�Ӎ_�����W���oH��O7~K�|�ɝ���k1
(��mڻ�é�>D},����4�Q7�s�X�n�0E
N�4?���	JO8u�'.�b�}��n{�:8u�g��0�&wQVé۾@�S��Lw�S�}���x![������}�
u9p��҂���9-s�n_����d�}�\���,��U"��U�k�ܾI}�g������]~4�c�,͚�n�w�Q��۞_%X��0$��m�\d6���]�Cd�WBή$9�� ���i��Ѯ�Ls�,AH�'�	BҮ�#c��c���\�n�Ssx���CtG�~�k/	�hs���0:ޝ�[b�p�������o«��B�޼"-�J-`�m���#fogB��r5��\y���Kj�*kx�6��>��\�v?���k
�?�ط���w��?��i���������?�z��Q��q��I����?M����ϴ�Ϭ�Ϝ��բzET��jQ�"�[D���vU/���T��ۍ�S�b�_L���~1�/���T���P�,�/��%T���P��_B��S��T�>կ�̣���~}�_��ק���~��g�~��g�~�S��g�~��g�~��g�~��g�~��g�~�s��g�~��g�~)�/���T���R�R�_ʝ�/���L,�ꗘV�N�f��_��W�W�PK�yVS�'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�PK�yVS1���pip/_vendor/msgpack/_version.py+K-*���S�U�0�Q0�Q0��PK�yVS;;�ӭ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_PK�yVS���<�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�����Mp�s��8�g��0àӉ�$���2��5���$Y��ջ��S\��R���M���d��/-��Ҁ�ܣ��������I!��<��=ge�ɼ���i„��w�
���y�r�ۃ.F��P�}��ۭ�C��9<���@��s��5�� eG���(��ț&�Gy�=%֯=����Xĩ�,�rO�a�,*zrd�
���\B„,�]�TRۃ�Fr�\"5rGSr�c��������%E����a�̹,�D��W�Õ?�@��+�/��Z{��/,�:_捝1��5叧��Fu
�X�&E�H��%<��e��**(B�9�8.�Pxj��3(R���(�	��s��u���K%Ni*%�`4/���Ff����V.R�圓��CJ�#W�X�XLcUH6I�^d*�Vc��f)�B�R�f�
�E"ɤ�"��wݒ�
�b龷� Nc�i<��*%=[�8�`��^#C̒���2��\zE�h�r�"�Wb](^�	�!��0�S��p}�-�u6]��#��W��g�B��'!�:N	g�J�8~eu�LƷ��6��]�Y$�T6S��)�n�˂K��L5~��jp[��ūbEI�Q���sV$� �,��$��4]	�M�<˷C�+șRB�1a�6�}�L�j)���=���̋�ZT���(�/���{���/�fgfKc�BOuG���!��U��(��*r��QMzl�_� ��дa�]Gbm*UbP�W�s_۪��&D���V�o8����0B-�Ts`âuۮ`1�~v[ŧ�g� FWL����5�0����`S���]/�/9vT��C��Hn�(@�D�hM[H'|yZ,՞�(�T'��-,�4!�j���N��VE���R�+��6w�/,�
�(� -�UT��o�0UHE��۪�L,��*����O�_��A��B������Z�O���
��=L���&0���@I�h���.�&��LYcXhC��[p
3�o:��j����FK���5Y��[4��	��n��տ�b�e����3
E�0���~�n&>,z�Ä�O-O]-�<;mQ�UI��d�»P?'��g�Y%׳gpr���`�KBoOT^P[R��S�0!�+pL��gi�6%Ӝ3Y��dЃ�S,��gǓX*�0�EYv���d�|��k�D�$�Iڊ6@��M�Z]-�UրJ�U`(��ֺ۫O:������r®�
i�(4�#�G&��3��c�cI!v�{�����?�DpX�&��K��ڴ�9xGk�y��s�ھ��>"�:`'��(ut40�J_[�;M�kkj
g��ixӢ�)ݖ<<k��!U�vzN�eB��=E�y�'B1[�
U�ΑG�.��,�:�h�=\��9b_b��3l�m�\tb��Q��7�uKCZ�|�=�똸m�k�o��̶����f��	Kt�����Na�8^g��-u֖&2�y�3(A����3���Y�+><,��إ�������V�4.�P��04Rz4�oW٬r�gP�̫����-�qwW~�X>V���$��%펋�5�����ܬ�*��@Iwit��g��ړ�}�?��| Xc���._}�宵m�5V��굮����&J3y�+=��=�ie���A��g2����PK�yVS���M$��pip/_vendor/msgpack/fallback.py�=ks�F��+&L�B*CR�-�Bo��N~�,]�� �J�H��������=3�7@P�������t�t���F�$�N����)%��$&�l>�3�a�m2!��zP�Fccc�&32s�G3��I���0#��\�͆x�=d�g�.F�����d�o:�h�A5AO�߻�`@�ф���+�� ��
4�M�I|��`/�tB��(����o�5�-^���4&�z
7�4�.r�͞-�h��)җ���}����]�fQ+0e3L~"��6y&
~K.���d��tأs:Z0��4MR �|��٭�$�� -@)�kR���|�ה�M�	�묅R�/�xL�,��<�GT�A��Q(-T��@�4���٘���l1#�2�u��z?�tL�
�H5ˊ<]�ʅ{fa��Mr�4��@�uC
�C�F��;`�d��a��?��7�0����:���h��|���.6,�阦�L��c��������M�,nP�X�>(��2�!ǜ�{Q��Q?Á����3����u�������s�spyzvt|����G�0ˤȚ��:ʵbm��� hft:�

�� ���/�/h�Z
ꚨ�Y�UY���4��L�vm��,ݡ����hFj8��$}�ѻ��Vt1�<b�6m:\�i�P�����-���5�?��g�B.��@�Z�ԯ,пdTC��v*�4���l8I�I���7D���z��lc1���d1��ɻE�n�P�&�y�'I:�Q����N�@����t
m��4�l�|���@T�{�^^t���x�(�??�-x
?�}���{�x{c����7�G���){�0���14��|�V������~s�+��lc��d����<�<�p���9e�z=`�Y�膎nY��+�-�M�_�g��1�/ ���B�:�f�BG��8��6��
��\8@Uj@ ����'���ш�eQ�]A>�}-�
���F%��*�Z���q����cX�us������LtN�d�/奆M����ds���F���Ep�a,��j�x��W�s$-#WWRO����
��&�$�"1����[y�,�XsJ���x�`H�S��f�r(!�Ѹ����ʄ�iΓL:�1/�.��Y/�R�Dc2^�/�_BJ(%{��ٻ�b���@<�p4C��R@7�B�8�����#�4��v4�t&�@n�
��H��\���U��P�IM�xOk4�9_�(0ZQ!xQ�Ȣ����@s�Ƌ¬c�I0
Dm�lV��6A"m�5�F���~��h��-="�h��hB�;l�d��h
8��O�Q�3'��LQ��:=�HG�S(���9@�2ֽAQ��ө��4@�XIj�+��p�Tǹ�O�8˄��a���$�F�Z����-|T����"���q3n]���0D�NA�s:�&�1i5�1�j���D���x΢�=Ĵw�,�
_����vB�G|����h젵W�N�m]uH�<��G�@4����^���q�eT9L�)Ђh�|Og�|>���
�T1��RJD�_݁��r
���:�{hIû�d��Zs�˨up0�b{�ȋ\^�l��g�-�q�"�Q$��N����ܜ������6w�%[Z�����4	sB�����)0E�߿;|mF�}�G�H�m'Y��P����ȩҼ�8l��M�_�i��c��]��V<"
f�<��N�)I���̟�$���DI8B
ڍN�@	@�"�-3���)����&InU��`�Y'X^v�,�c�-��JC
��^e�� dS@�"$���Vu�R��P����-�	�����%q���y��gb��@�[l�BXmO�
6���	XG��E/@��3��x
�a�JK�t�=ן�[�:�h�/�1bq�C�@wM%����D��H�TQ̃2n�=�vm9I��Y4�򌍨P���0ʵ�g�A{��j�onn��zC(�_���u��9��Hn�D-U��� �J�\��,V��o�VU�7��^�V�2e�R�V\)����{�,Y�#OׄR	*	�9�N�F�S��fӒ�&R	Cq�'B@�U���b]7�n��dQ�y��+úF�/n��j���]^�i�e5��c�_	D�O)��zp�;��r���C�@B1D�7�2��*;���=���
kd��<���7�y��h�5���������\T��Ic��!�}j2��7�w`�
���(�5���6(d"["���f�.����X�-
�c�W��͖*
-�v�F���KD���zXD��
6���E�Hƪzq3���h��E��X����%����t�d��.��Q���b*�@"���V�B�{�t���|���_��-cz��ݳ�Ѐ�o�Ɔ�I��	�vВQ��⃔�3�/<E]6�ѥgڜ�]���,�5 �13z���L�+&��J>����vOC��fC�	�:^�k���g�ڒ`��E2O��U@�"M!��(�
�=����<+4<l��8���P=���(�6$���2���D��f��!�ׂl��v2����xӇ6��T�}8K�jC�o�)��"H�����|M��H@gA�.b�	O�-�0��% �6���R,6n)��n�a84�YUsGS���E��r�� �_M��Y�f~"�{ln��-�*I7Z�-|�� a0&�Z�X�GC�0g4�R`[�y�y�gd��8�h�eh�0��a^�K\� ��dgz:&͇���V��#_�Xm<��ᑯ��>�����e��kGb?�H�62�ː��QV뺭S����+q�d�>��4���@����]��Uym��@��T���%�Mz�E7� q��w���~kF���.�tn�Z�0'~�v�쒟�l�l{'�u+�B��Ngۑ��j�`d<�k��oF��J��é�IA�gV�"���G}M� �|jn=���&-�=��ъ;�i���U9h�d�Q�Ϫ��&�El��n$�WO�FBʩzO4�
\Y���r
�^����!B��%E�XC��V�D�
�V�Oё���4H�g�E}�
[�+RZ�U-R蓍ᱱ5��Q_��V
u�e���a�|)��:�&h�9\B
#������6�tY*Hԃ`ܒ2/B�!��B,�'�/a8�!G'�M�"]��1����{ނ=	���[�_�4��W���R�9f�9}��l��8�?:"? ަY�=���4�My��U���?�B�w���yi3b8`�<j4�g�g$���c��"s�\X<�����s�?,�U��Dd:
�s]��C�=U����::�
:���G���MbO�T�d����E�"O&X9�^�����Z6Ql-_��p�j]�l�tO�@��&�J�m�x�'�#Ӻ�܆�h>�At�H�ѣ�l�\�(��wNk]�S:!D���rW�Eb�zO��a~�Wx���Ś���AwOF}��_�<m�M�q����R�ݮ�{�s`DM��iÖ~/��|�ِ6�y(��Ѧ5�j(Z�[KX�\|����;a/1ԙ����U[o<oŜ�U�ń&���0`�2�n��~#��l{�,k�4�.6t1o����n�?�����t���@�u���qj��P*_�L�;)�C���SR�>R��M�00'z���Hw����0,%�
�9]U��S�䝯�N05��H���UYׇEš�U/Ӟ���qވ:�5e��A�w�8����wY��:i�#�#/㿧��P����I�Z����2�e}R�/�񹬝+�|����Kg�6����C���Y�?�Z�a�x����;��>xk�E��+���[�g�Ij����o�-�l���B�$k!�im$^�V6F.�g�[���'���u�mH�m��{�Z����4�?R�;K�y��4w���|��A�l�-�������Z��)�!Vg�Om���R�gm�2����uW����qrݮ!�W���_Q�/�`����:�=]G�����
mJ|'Gj�l�T�� 렊��d��#k�O�aY��&X#�1�?���_C,O9d��DO�d���D�Jt�]Y�L����eT�U먷�j�|�:꯫Z��P���uU��E�vX79��YR�����O��]UoyWU=�i�M��=Ihi�.��QF��O ����ۮ'��:���.��5�����YUx��	og�=��.�����>��vW��z��]Gx/���5|^�aW��{�^��뽨��#���_�έؓ�_h�﫚j�2��̬��[+�����}��<x�(w�r��b����P����t�s�.��kI\dG�ֿٗ/&���V����:KU�EDCT�s_Z��Q٧�x�ډHL�s'w1��%�@���c�5t�hA-m:9�djo�h��K9�b��(n�*��})œ�k(�otS����t��ܙqZ'����T~�J�l%��ŗ��-�xw�8�G�HfQ}��S�1���S�r99<b�6�p<v��U��{�j$��\x̋���Nf�i�m��"�#4N��0��G�pzb��eBu�,2��E��vg��H�V!-C17Lj���o7��
O�ؙ��X�~b�\]�f�Hr�7�:aՒ\y�}O�cRa)���_B}��l
ũ�Q1)��5T�ŝ��A�*���0P��zF8`u�r6���-�ha~p��zo!)t�j<ː�Ϙ�8aVl������q)$^�{�&-L��EP=��@]S����R5�{6��Ի�'��%ч��D�4N���wx�q��5~����l}��8mc�V�2�bY��`��)��ƊKl�dd�����/�wX�#�l,�I��P���r�r��U	��o}�H�J�z��bّno�1�r�,�u�I#��O�Z���Ɂo�C�"�L�(���������/� �d��5��Ҽh}�a`��U�i��XnU�^��[��̬阊�Yv�a�VFf��`#��(]ߟp0�d�F��ʳ�.E&rv&�S�0f����A}(=�1>E���R�F	+��涠�#�v�Jg=����2�������v䗜�R;�ǝ�b�cT�r�j4���s:�V>3�����M��74��k� �Ww�O��R2�����Vk�g`i��a�԰%T�c�>�$H<]k�OMeɌb�q��c�5�ʽ*�	�d͇I�	��?R�/�{L��G��� ��"
�����{�v2bdx�U�@'���)
X�ME
��o�9���xNF�x�VO
'�9Մ���V���8��S1������B[0af�b�'3r�\���4��I[���MX�'���J�ɿ���#����oGS���P��p�,J�ٰh�S��#��Q���Y�~���g�h=�y����E��J֞\�%�b�`�}�d�K"���o��E0p�Sr|,9ģ�0��#�F��!3M����&һ1E֐�DkT��9%���Gs�4�yZ�E,өrn8��1�H0�$�?�E�,;��W��l��Y>M��h����;������úHqIrj��&s����hI�7�L5�R�����,5%k
СDŞ<O��6Ʌ;�IU�>�j����U�l���
m����"�J�A۾*2���E^'-�bir\+W��yRe��ZyR�ޑ��.��cr���7ߘ�S��-���|�C�Yv�Y���̞�9�J�����*ۚ�-;�!�9e�neFԻH��A��
Wd?/M��-t�d`TfB2��H���i�J.T���+8�[RD=��#c⢘�r��ܵ�-5��A��I�$K�|UŽ
�$S�Ԓ�5&�ϥ3bv~�"/z�ꐖb��]�ZQ�(9�5�����{6��0��|�8��dQ�@�@�����_�q�Y���%��K{��
�d�PЩɀb+%�����I���Yާ`sKA���cܪ��p�g�x1�g�n�x�&e�ݬ'bp7l���c"�5B��(%��r�����;a��H��D�
B?�,3
�~��|5�s$�^
�~�������֪iXU�!+�S�뱅|��j�v���W�"ب���jҘ\��W�9�G��j�n��5�n8��%ܺ�>ϧ����<w]��+�q�K9/���w.��zR�I�͆�2%��ٮ�#���x��ӗ.���lD!w������W�_�G��H�CK��D�u��"=���d��C��+�9_Zҿ��q����e���*��-�6bE|�1
S �|����	�8�� pk�2f��0��͞��rq�0%"bN�Ԋ#�.�+�[�V?�yXo��Rjix�9�V��P�q��$X|����FK�W[�I�ب�Y��5�ۄ��2�Vј#:�!�����Q��0)P?���[=���y�Pk�$�}��e`����eu8y��r3~�-�
�pif0�΄u�	����/_�/���;�g�gK�eȞU"�r�B�����W���|�����c�������_�ə�N�:_���w�j)���q�K?�:�+֧�*��F@�ɨ	�U#�G0��=}B�]�
%V�{�OIl��#d��[2��Ux��ѿ�����v���X<4�t0h[���������U����Z��27C�]@�f��j�tP�&���듨?t&%��Ւ�w);��oi;Y����45^�fS_�+>X��2;���#���YK�E�j=�v��v�w��N���r|ζ�T���og���bF����ǘ��L�\e�ѵOe������װ����86�欳�,^e}�)�ĈT(��>�h~��#�D�3��y��:�¿R�߽��e�M\}����\�%�Xܯ��w�R�|.�b����\cR�
��׉�K#�:�|i_'r/���D��z�ȼ*"/[�x�����V��exw��H����ː�t��Z�꬙6S]LK*-�(k�LB][��/�t�_v1y}���1�Ֆ����@�G@GG&z��ٷ�9(K�������9�|�y�|�L�G����2�#�X�j�������x�y�&�Z8(d�ַ�c@
�iq���ViPo��ξ�:��
c�	��QmG�9z�v�*���
�_��1��nؘ�'�um=�Ii�9��hs&�G�FV1�o�⑆*�vVi�U���چ���>_�)���)��k̏�����h`8-6�����q'�� �Ǒ6b�U�侪q�UsG��]�3��$cm�rO�^A����踽��9V���}�x��M2q��k��p������9�9�<=;:>�ma��q�Z��Gy��Ae��e.�om�/PK�yVS&	��e�"pip/_vendor/packaging/__about__.pyU�Mk�0��"��6�`�
��e:v#����9v��A��l�ݼb�D��J��:�АD�g�I*�58U��MoA7��8���)l�h,i��`[� TÞN�kL'��ϻ���p)�"3Z��;08hK����5�@��A"#�Ȃ�-��,��e	���db�e�/����fL�3�^�'�)�;mR������pRT�a4�v�g�w���~X_�%��Y�*|�i��$1��;�ހ�I�6H���1�n�j�;w.�\V�8�UR K�
��XGzm,��VB�pb�4�E��o����bCg��_��:�l��c��q����v���Y���,��Ŀ1Eo���ҿnans�ß��PK�yVS�����!pip/_vendor/packaging/__init__.pyM��j�0E��
1�i!�2�.��Ea�&C7�7Q�Y.���:�7��W�G�6@oB�]4�mq�A;d�A�}�x�L��e��9X�N�Cf���s���� fxy{9�7�u���.`�(X!��_O-�ɡ t(ƺP+�3y��6�Ek�~"�S�^�Qb��U�4�l)}�*rM\@���+�����J��.Y�#|�a�|�6�����=�b��(`�Q�M���PK�yVS*:c��,#pip/_vendor/packaging/_manylinux.py�Z�s�������`
A�^�5qRY�lMeɵ�U�9G�*���%&���Ҳ���r�������2ɳ�ba�"�d��#�o��4��,nod�B4�ʪ�ê�Z�$w�He�(G�"KX��q�̳�K��$��cg�(x�����y,<v�� <���1�����j��,�D�Ҭby�}��`y̫yV$L�����C�z>��i�O��Z�*/�K+9��R0^�KY��u!X6W��:%ᙸa]�Y,���Y"X�KQz���XE'Hd
��E��'2�q�b���#�B��i�tۀ
N�����,Y����X
�`�2��=v�����_�>9?e��?
c^�,��S���X�#������<���'oe."��Xl��I{Ā�Q��n�ũ��K�O�3��y,#k?�g��(�b�����8�zP��X�4o�K���i�[+�h�7G�Ύ��o^��c/��������ACq|~tu���gS��n�4�~:z�s~��O��Q�ݛ`��.w�˫��z�>?z��{����Ӂ!9%����ٛ���)�OO'�3x�|�n_L�7��_�^��I��gd�.s2�U����R�!b�z��Dy3f[?��,�MhQ��<�u�IuHA��dZuD�}C���$��O.������R�&��x���ec3����c��߀�Y�I�=l�>y�o|A^�.Z�e)a�ovV�{!����zr3j��N}��$|!CHlDu~8s:>r���O/�ݡ��W�[���D{��d���(���x&�<f�8��G�j�1�*ҡ�Mw�6!����Q%����Z�Y�g�1� �
�9��`{����,�����Yy/^��ޘ����ΐ�T�ξ����_��=�����I���}�ǯ)�]#�P��#��~��5$� }�E��(!t�Z�����e6�?��|$�<��1�-)�?��Gy4mZ'��+��g�h�(it��t4Rt!��踪6 ���7:�X��NVK��"u��4z�)fΘ��3S���7p��๗W
R�g��Ǥ�3Ս@��w�	��A�ALX3�E��k=���P���<΀��L��S6
���:`K���FԆ����ZV�ǡea�C?̒m��@;{ۋm�!�G�Ѻ
�T$�=*k5�rd
�*�`׭Z�3�g]��/�v�&��˛��6	ً�s۳Yt�k-��Z6�`c�?`���ҎJ��y�<xv0t��z���n�?��#�T�7�.u�]3Щz�G������4vִ��:�V��Z��ؗX-%��ܫ��A>�tS��%�D�v�|R��9[�r2����%O�eU���;+�)��K�W���4�C���FI6���}GN��i�u��e)j�f�T�bYV��x7�J|�R��ylQ#�u�,�b)���'��
��C�(�D
�d�r��
C�W!���2
���yX�j��9J��sx�P[ER�xx�U��D-a��G|�}����q�����ݡ��
�e덋|��gk7��,��j��:�����n�c
�2�!1֗�}�g2b��'�M�:(ոc�s3vx[����S,D��d�7lY]�߬�
�b�����ů��^9��4s�
ܬ�����e�t~�ϰI���豼��p����"�����RYSM��	̶X�Nu	�D(��P&���fY���f�dQ�naP\0v=S55W����;���<�O��dw6ߛO��I�
�m7<�|��|�t�|�lw���:�W���������` �P3�&M0GG�?}�t���Q^|�}�'�j�A�n�@�	<ցv��/�XV��ÎgvT�vVW
&kq��1���1{�9���#��9���s�T�9�}�>��Μ���Q���A݋g@�_:�-N������+�L=8�;�c�6;#�\�?�\!�T�<���,���p~>F�L#B�*���Q��
,O|�$�\P��rJ��X��"tZ!�;��ʿK�rCx�.
�8&��)(����i"���]V�R�˅�>ו�G�*6��h�2�w�o�f�?Kj�n��*c�"�H�4�kQ���n��J�GlG����ݑ����}��'R����Bȅ�.Q��*U{��ƪ�1�#(n��g��"&��.{�ʣQ?�˪Ɏ��Q�Dٯ0�3|�E��5�h�NZ��IS�U4)���_�_H�6/<,���Z��G� XLy�,�P��/.��J�U#uU`�0��j��J��C]�1��N��UX"8��]�d�&"j��K��A��D�W�z@�
��K���z��X?P͡R��"����l���������p���j�̲X�J�\���[�x��1�qh�~�Ae�������I���g
܎���঵>9�E���j�AT�d���B��a���d/Q�V-�W�T�8!�P�=�����N{����G��:��D��P}��
�P�yg��qA�.z�Ge�lҜE�m���4}�P#8=\��(�M����{�A �=�[b`���ZC�Fb��b!�sF�A��E�V 1�D��HE��,CJH���3�<���[Ÿ�i()1>רT���-��5�n�� ��*\�h�C�Ҵ0m�g.�է���Ȁn��s�G����W�!�3�ڙL������J@?˭�g�l�@�=$Ą�q���[��z����/������x}/�=?�
���i��t����}��Y��fiG<0m�H_��96�ȪC�M�o��xջ:�d"��e鞍�ihk��w���_Y��������m���m_�qQ!�y�������{��>ۍ�ğ����hV�����j�ۓ�l��/�I;�.��k������`�Q�J-F3AZlȺ�>����e��)J�RV2ʑ�u��xt�F!V�	<�H�.�~���Z4b/y	TP�7��{O��5J63�n��iMc���M����6����p�h��xZr2��i���a�v<��;�0���2mRD�0 6J6�ѐ;'��t����W
���	��&`�֣Qp~�������/�g��ooᖿ71�}yŞ��m����R���es���g39���&O�=&;C&�!��>�}�c���طXL���� �&���t��aFS���1UQ���q��K����#�Hjy����s�+(��+�j�����O!��RM�ʲ �#���9�u`���^55����)��mz���!Y�@���Y�=-zۂf�m
���T�B}3��`����]��͌w-Ȏ6���[��r8�+�߅HF�_u���o�v���\��B�(�;{�ּग़]�v`
�eR'6�)��T�R�2�Ih]�ueZ�4KiZ`M�5�[�oF�]Jֲ�Ah#�k�5�I�k�j�����I=p��F�����n1
�5z��^�p1�;{_����
8G����^�}��In���g�G� �Ͷ��};�b��XCj���o$�-EF��F�k�͎0$�I/†2�:8�z�Z�wP��;�uF�	��otf��⃄J?S��������Y��K��3��=[����YI���^!��э;�9|����fy1�o�b]��Uw��=�V�C�m�����z�@�m�k����u�u<��/j�c9�PK�yVS��o�0#pip/_vendor/packaging/_musllinux.py�W[s�6~ׯ8�<,��p��N�Y��v�5�&�Ƴ/���HPšYL�f��{��/mg9��p�߹ ����k�8��6M�-�Ln��@U�m)@VM)*������l
��"� �[Y�5�{ЭRRm�zo��i&�T�"��RUk�)p�×-���Yh#�ih���$���Ţ.��ʊ�-�[)Z�ٺ.M�P7Bs[��aG���X�f��ծ]g�N�������2 ,/>Laa=�)���oZt�>4u�h�[�L&�( Ղ�i����q1C��
��BQ�)����=�R*;��j6|���VAY���H���8�a'�ef䯂��$�7\��yJnMɜT��H'��}��dt��>�.$����q:�=k��;W�D�Z�.�x��1zP�l�m��x#�ei��euu\���8?9�=o��_go/�����3.��(�w�.z[4Z螡�iDfª�u�r�"���m=��<{y�mϘ��lk�����q�Jܗ�{�zd�8���8N!:��!�b����Z׺�B��V­a�8����
�2Kq�����M�F��,�g^�*�	6U[2�=�5�����"J�p��O���Bb
#��϶R	�~!�B�FNx"uX}W�
���5`�l4�B@��l��Al�:+��Q�C����K�z��.
#�����מ�Sk�%N=3����>='3��>WWW�m|�_�g�p���P�קGkiو���?~��StO�>��y��8S[�0��VC��[�/ �4��mҍ v5�I+*\��,N|�^�;r�#��+zߓ�$���UQ�;��[�-:~J�V��#���j�'��E��
��D�As�q'�%"�'
 ���@-�dr89�Ȼ�!�:4����cc�����Z�U�`�{��]r��l��I�o.�s=��+�xhs�w��0��
���α����$5�Mݾ���^�����[�A���<<:�d%7ҟQ�}u����Z��������0�B����6�u��PT�c����a��He�U�Hүy��4���&N�ZuU�*v;	�
N	���ժ+�ޟσ�RF�e1��:
�B|��Ln����⹞��N0ŧz�k���yu�^�+��u��'T��wG˧~Z��a�b�n���̍���>��BЏ����p�VV�Ar#'��h(M�Rvߍ��e!q��+��+^�DJC&�T�kE���>�FeM=�:��+��Sʱ"Ԩ
�E1����M��h��m���+a�$���b6����U���Ezq��f��v�N�?�C�ɉM2_p�L��r'�'KCcܠ��:{�JPw�	J�4p���Î}P��Džq�����Dt���t�2�4��Ƈ�!��e��lm,�F�{׋��)�JRDy�*�ť�F�"��5��0ϴ���[�Vj���\g�>�;�x���P�,\���
D���&�zx�:�91C�0�^֧m2�����Zg��ھ�s�һ�~���Y�g3��ݝ�������X�ۊ.o�:d��/�48���yJ�k=���7�3�;���4�x��A���F����!�Q��M���
�F�r�9�f|���o�O�[��I���~���0�>���6{)0�Et�/���P)��~u��K�����	꟦��HS�c�I�
UK��Y�h����@~e���bfr�=O1�4�V��\읅�ڇ��f��đ&]1"�����MD$3lk�7�:��h��(�D%T>� �3u��qJb���N�dG+��Ӡ�o�qt��hy��v
/��ʯ���PK�yVSqti]$pip/_vendor/packaging/_structures.py��k�0��{�`e�X�`?:(�^Zv
�>5#M\��_�v��;�^���I�8�}),�B"�1��)RT3�U��D 4G:o�*��aӕ���
���'w1p��eϻ�KM;�vr�~Ymw�󂪝3ZS�v;0Xi+H�����@���DBȐ��6	� ��ZX�\(A����e��0��0Y���`�t��� �FAx	�A/Yr[��B�$��D�]ټ��tNǠ�����Sja��ƥ�oF�/BX�,q�b�&bh�	cm�Ry�P���D��ǽ�=(�79&(,ΈA6�b�I|a߾pBW9i/��007��}
�-�⏘=�c��z�s��=A�b�Ժ����R��5q���PK�yVSm��?{
'! pip/_vendor/packaging/markers.py�Ymo�8��_��"!����b#.�v��`�I�0V�cmeQKQIsi��_$R��^q�K��pf8>3zI��yM6y���Z�"�XY�5i�5Dn�L�j�7�e^�~N4YLn��s^N^����1��Z������$�15xr�aqv�0�jLp.�l�@��׹���m� �U�����yQ'�I�����	
��{m���J������l��P��-1���!&hQ�O��k��T��y%�$Z�亩p�c�&j)U^%�+�\$�CE��NhH�KR�蔜�}�˄��o\�S����?o*�x��c��&'z���ŗ�����KV7����
�l}%��G��?�\0�^��E�v_�$2�Dƌ��X�or�>��qyG�|}e'b�>N&i
�JS2#K%40ԧT|f"�+!h6y��`��k^��].x�c�<�;f�}A@K��u�0��L�;�"v�K�0F3W1��yd���uM<%�Z4l!�T/�w^B8*J�S��ve��Ĥ��G��7�"t���������ۤ�c�q�w-��]�M�d�
���%w(��d�Y]@X7�ڵ\>�C���(BJ��-
f~bh��[�[��	h^�kf�����P�3�fzQP��i^�2MÚ�X8�C�W4�*��$�.�iʉ#�݈Q���q
&Q�X�	�\nH9�d�G��=M�)i
O�4}
���A�.��B�䰫�f�Ӽf`�<������mi�u����ۢ�K�-��`�J���ࠕw^�T��_�ߟ,`_C�� �.Q�R��`�H�E
����An���p){�p�<A��@j{n�
Fk6:���J8��sp-�9�fD Ц���$^'zo"HR�����=AI'h��N'�ϓ�6>O�g�ƙ��BF�Y��l*		�&���C'�}��v�!S��7?9�_-� �uv�Κ�֕��5%�����d}Z�.�֎�i��r�SX9?���|� �<ù���OkJ�:��.M�&�L�r�nb�Ep�o�W��g�����f3ؠ���>�k��ڧ��:����8�_���L�qw=E�WV^Z|��e �9mH����#&,��������mgb��˽???Q������\�.�h�͢_��\Ku|�82�=C��tn;�X/#��[JK�ȭ�'��řV:�Q�`uF�Kg*��z�^�=1����s4�5�1�,ت�D�X�	>:"��C7��ٞ�V/X�Ѓ�Z�
�g"c)��������Xz�^�K�>���5�W}w���lIZf�
��� ܲ�Q-�H�U9V_F�J#��f�š�)��T#d}���5J�a�*��b�$����M.ju�t��Tp�{-�u�A	���v���b�N��:��`�����wT���;��,bP�~fd�D�V�~�g[,|�6kR��	�6��L���%�\"���(��Kœ@��qrX���%���yeĩz��]��iJu�H�5'0�9�{H�D�a%�MM���_�H�މ���ݺo�rQK�z�J3�ٌ��&T6w]iià�H�nv�dO�NT^����/���7
���x�ql�lL��#��	�?y^�j��ɏ�!��p$
��J;j�V�r�txy`�*�*5��@ �`�B���@^u0'�[���b�Cl��Tؚ���&���Y��(�I!���6	��a��~�
����7|�{�q�IM
;pGX���
��,c��������N}Y���v;�n��]R�V&�����&��
��]�5����A��A�����f��
e��E��!�(����Xob�uf�#�^�'L5��>bBx�9	���\(�1
{zq��զ]d֑�կ7�^O�tܠ֗�n3���������mnS��Rb�)4���LGP�ו���D6�#.��4Om�[>��A+���i|t��d�����<��g���-b)ˬ���ݷ\�VZ��t{�MTu����~�s)t:._�Y%��X��y��<r����j�S��u/ؤ���-�zŒ�����=F
۠�3�YX2�jx��-F����U�j߳'&��7���K��PeKU��˞U��N���Y͖+�<��!�E"�3�X������d`��$��+�رǂ^f�S����5��rH�����S&�S��E�\��y���~*�+l�R�/@0$!Z8��5g�З.Q�lscD^^1_p��#��P��S��)�6�!t��W�msS
;sXf
�p�U���t��7����Z7h�Cg�A�8t�ș4n�����0Bo����7=B�\��Sw��;S>�H��a��+��,=߹��i�%t��$Ս�h9�i�
�:sS�6�4�SM�g��� l1k���<Ĉ����y0s�ܺS��1�2���5���g�~E����Ik��6��\kΣ~�a���@����%K
��)ѿ���
$����W�y���2��_`,40{�A�]�9
��y�(��H��l�]��Z%�QP?�Z�Wު�[�18z��_�E���/�I��[�M��U=p�B��|�w��)?������+��}�k������ã��I����d�J��u⺩}6��E��^\,�����N�j���"�� �ы�xLp4�/PK�yVSn�AZ�D%pip/_vendor/packaging/requirements.py�W�r�6}�W �ɱ�I:�LF��02�j��+ɹT�p`��R�@�]����@J��z,��,vdv�
�L3F�lhF�t�r���Ɖ�fD2��X�A���
�X�|d\�E��_�gB�D����V2�2�'�^4�F��\��p�.D*~�e�ɢX�3&I��i&�IW�K�V_B�4��F�e�e��\0gɋ�wk��r}�
�!㵄�p�
2�*�i����˓��;�fax����N�_�X]�9�� [w`fjt=:SvE��g�܄]�[�����ḃ/��^����[���fҸ�=�J�e��KO���*���C4���g��RP��"]���]��ݴ�A{>5i�"�B�~��fi2a�7)g+�K�#�6,��~W[麮�sĀ�a����-D_�l��E\�L�,U<�,:#�>{�`��~G�Cr���4�?R���	����N�އh�mϝ�~ 6�5gBx�3i,^4g�$�%���Z�K��p��Nse
���`\�{�\
K#�4����Qov�z���}���O�Ѭ���zt�Ś���ۆ�g!� ������p�9���k��a�(Fض]�ܜ��>�&ac�q�'}��K�qw��\����"c�d���A%�0�����5�1��R��^}�G���,4�~u�Ў[Ʃ���h2=1��ŋg��u�1W1��� 
 �v�$�S
��G�I���_
��a�K
Ժc�����-3����Zz��XG�/����LK��oE�O�U:F#�'�(2�<~G3$]�sz�t�j��,�AsM�W^�-��
Ǡ�}�l/����N��B�y]]&��A�]"���N�	��ҒVJ���·��/����f%�=ʬUχ2����Zh+҇��fR�'��R��A
 ��z�f�
�hgce\�~�EL�Hٕc�e8:��M
��{f�mnnP�{��� ��$��?�����Ye��{�p����h�*���Ux���hF�@��
g4!�.ћl�^�S����Mui'� 7X,H*	�W�gw�dh�F�?{ae�s�<�v~�b�,�VE���
B����2�r���iTW�l��.A�R"��fq�z��1���F���3I1 �
��ؓ"��K�dwOѾ�X��[=�U������q��h�8�L��f�9h\��0�~0G��&U�M�OJ0��/�\7��I�k*Oȩ�(`A+�W@Rw��"!FO�@Ӎ�64ݰL�xj�i�O�'�zYlL�v��s07*RL[��m����K–$�U`ű'X����Ɔˮ��'O_�Q�3�b~������H����n��V�`-
*0�5�
)�[�e�1$ ν��ڜY�@3�G�����v�=V��ᰁ�;�Pq("59��z\K�K=�.�邦$�1�]�cB�����7�o�5x#�P����;nw�ȷ�7�������~3��q���)V��i0�`B�Ǘ�k�
Fk6g��؏�Z1(��u�Q���G������[��]�w�!pAj"�Q�n��w��6�K�p2ٯ��"곎�21R�^��_���z��o��I��xJ�jl
5|-ڂ0)��4��f���ik�wV��?e�щ�-1�Dt�ù�{^߯ǾQ6O
bU1�x�%q�	.F�
T'�	�4Y�Y{}�}%%�]�� �m�])�vl	~
�xMaҾ$a[��Wr�p� ʣ�	��K���okˀW�F�F�Lnx�Rk��}��9[?~����}���C���PK�yVS4d���x#pip/_vendor/packaging/specifiers.py�=�s�6��W0��Dr�$�<�ȹ4��x&�d�\3o���`�5E�Hʊ����AYJ�kzW�4�H`�X,v���~�2���,W��L�(�RU�j-�����RE���uT^З��$����f��{U�YY��G���()���7ߚ6q�F)z����o��zV�eð�J-�:k�j
�.�*J�"W����I����������(9O͟�"m�2�̓0vT��J�"+f��EUΣf��/�~7܋��,���<Wc��m�6��1m��7@����j��բj$9{�4Ю�/o�n�v�0`ޮ�DC�[]�{�=F.^60c�\�e��I���ή5ѹ��fZ�P�$]�u�4�IU������~Mx����}���b�C�qT7���'}�_Á�f0��K೉7�h�,«�`�G''�xHT�{{{i��ut\\��o*�.2U
�O�z^Ue5:$b��S�7�j��vb6��5�՗�2�]�(���_G��؂2�Ԫu\K�'����o��h����s�>IhxYN�T]Dgg��lX��b�?�9r/�:~�SͲ*j�J�wP�jU4	��X%��W**�Pi����ϕ�Z�����D,v�bN�I})'���I%v��q�Hl�ˮȨjT�Q	��5 ���6԰�J��X(IV�
�E�kr����P��xDV�H���γ(��5l��LU	[�Y۹��TjU�b��	���s�x�
�(���.a��%H�r*�|M��3����V(�{q3�ui"/�B�����㾁���yV�Au�Q�����q�3��˾Uh9dL"c2qR�ho�a2��R�܉�Q�
[�����>�����A��L���l���)�6��,,(Kq�5J�2	�yT��l�"_�6��,���p�o!��!�Qk���b�]gh���Q]����Y�50�m�b
T�@����M�f�á�vN�B*+�Ɗ)ĕ�[s����I�^�kRC<<�ɤJ/�d�ᆢ�mw�TIV���p18������G����`��W|Ƴ!�Ρ�����gU�\���Q���p4�o�M�P[��~����v����I��E#���I����vbMQ_�(ЧC�w�'i0��N�i���"3©�Mi>*��;OP�"
�4��|�4:�`N��<�m��3��H�Si!yv��H�}�mf���AZfYm��3k�S���\��Z�'@���	C���3��6��h.��*X٬��$E��Ԛ&7r�hS�����v뛅�rѫ�����>���s}Y6�x䜃)����ʵ$	�� �M!5��.m�Ʉ�꿐4�����!���XJ{���?C�)/"�Hm�0�`��a�1���Ƭ\9��\���e��O���')載u�JKU��X[��F�)�蜵n�V��LJa���[�k�P�AM��t���Gl:��+��JReH{!�t�qw��<v��;��"Ŝ�`�'��P��ۃv��>�Z����f�32��'dP9Q���}�:f)���.����7`$"/Q�
������#{[�5B���5��L�����V5�!7�?�1x?���Z���ɣA�}
���P0��b�$\)����/��������c
jZ���p p�)�	�:�j�fU��,/gY�'I�:=�x,7�+�"�Y-؟�`��mY.�I��䵒4z�6pr�cڴ�c-��t`���k�+`�s\k��ܹ�B��h��|�]W=�iUk��Wsڶ�3�Oa?O�2������i��j�؁h08t��#��o����p�9�=�D�N��x&�s����{X�r!��먼��)@��1O���b�U�	Z�'�H����6(�����.�qtpp�u�������ۢ$�;R�cz�D$J�8�(+J��@Ԛ����]!!R��v�,�֎�Jb'�p$p'�#A���D|�>�aG_����89NUL�&S;����,}�s�%|Z��$�*��]�}��]b�YV`D�K<�txF��M���5����d����)o5��i�Ǯ��z\�Xa����d!z͘Q�;6�$ �F˅�gI��2`�p�J����
����!砿�.-��K�I�+�M�֌��3�<mg켫��s��c�L����͝������{s$���������A����}_�Nб�����q
r�w���6�l��'\t�����������0�J��I���1bu	|X/��l�yv?-󲠗�B��=�^xI��eM;
�U��h�zR�A[؊ܻ��PQ0Y�M扆�5w���mjኵ|خ����カ
���j�wX�AtO��=`	x����~���o^�y��㿼|���gO�<�ne���	h�E�-�w�1쐳Ϋ��*Wu}�Fd��5�U
DO�����Y����:��Y`/��6@u`	emrb��UE�g�:�T�:ЩG"�PS��$�Pt����A�� a��z)��Pbę�����
C�c�:����H8���#���uC8�ȷe��f���;k���,U���!��N��a��C�莾����;a
v�|yT�숊�3�<B�wD�+	�S�V�^�
}.�~b}>��<2G��#L*X���/
f�dšHX{��!�w�u7��cs��U�,��6�Y|�PS"h
	ס�?��u����V7�-���ud��vz.�L���O��F��!h{m��Ё�-����Ҭ�ִ�%�``;�:Mhˣy�'Pu`Ӓ�H�Ƙ�l�<(�2��@ԗt������!h�S,I��J�fe��	:��3���&��:��!��f�Fs��b��X�ӹ��)�3�S8�'3q�i����va��#T���M\jug5|�x��P^a��S�K� ��s6%���;m���8lu�X��m���Pv�"���
�B�ݹ�G�-9qX��$��ǎ�SX�M��L�#Zӟ=���3�Ts*%��r��5�i �8h����\P��v���-8M������Պ_?	zx���޻3z"U�R�˜7�>�c�st@��M��?������s��}|�Ŗ`&7�7�M��$����&����u�V]��mi*]j���
ϧ������5�n������7�H?b\�sd|� �[�{�c�x�]O���u8��3�dN�L�������yr��q�U!;��)B�L[��'lo��{'�
2(�d��{�7~n�O���HZ���I>��o�ϓYdW5���m/��M�Dh(t�ͲƸ�Ќo�V3����O�P�zI�_M��sf
��`t��?z�`��(�[�3��ɡ��7��ݽ�z
��ȴ��
�IT/�)���B�3�s��i�;��#t_�hj_���]����K���M_d�h[Rj��Iupc�a�^no2�h���T�!��=��8V@+0�qb�	�eE�`�5�iY�5&���7Z~_Nx�ڮ����jP��͸�5�;�γ�J���S�����j�rfmᖱ8�G�Z�Ću��@�u�����yV��XG�]'<�'2�%��)���Q��	  ���x��s���pLΣ��MVS6xV�%�nG6��]�:&c�Ѭ0�ϡ��q�-S9���$�;-�ۃ>9'�_�v''��2�����
L���̌*�k9�ă��2�b&yV7C{�4n@��.q��e5y��8�W/@c��r4:9���TH����T�YT��
���,HL�`����=D�`����~
�N>b�P�	�w��t�,���{���۶{�����Fs�4��5��t�b�h\�1r����1����>0ishc++x�q�7�S+W$^,��,y8�Af������s����H5�"�lHVtw;��N��1�)��1tܬ0ܗ�4}2w���!&ש�!��tJ��(V���$ˑtpn흧��q�n1m�K�Ϙ�oܥ�i�Tr�G���1�Q�SgS� ���b�n���hib(G�K?T�v�I�B�f}�
����Hd�)��G�yN�a�;�S��Q�,Iǐ�Φ�fWϏ
 ��Y���-�<xL/o/&�) ����[Dxj#P�����g:_M�+0�Dbf;u���(;��A��
�[��JE���X_��g�i�8mL�8Ag��:ʗ�a�$��>CL��uc�]��br�1u�η��5�b�b���Ƙ�!A��Mr�Tjؾ���n��Mi���0z!�:��(�e^�z-Pl5M�d��e����C�6�I�Z� w��]�8�g�x3�)��i0� ��v����}t�>�i�?���ߘh 5��7	=�\�0��
Hb��'WeuEJO�c��ߡ�6���5���R�W�Vj�$��70:�
Bƨ"(O�T����|%��:ʧ%�/�LD`4��V;����%� χ�u��[�ݭ��8Y2��I1����3�ʛ8XS�������a�X`�+k/Yw�K�5a�t�.�v�8
U<���?�I������x����Xgw�W�ըC^:u���s޺� �=z
�������Y�c��=+��KZN�wB�څ���h:
`]���`�-��K�)��ߎӂ��2Jv�9
�?[LiJ�V$��W �ʺ�RT	�^��*���Q+�Y� ơ����� ��&qվ�����BG�\�렠kAy�e���⺄s�r����A�O�s���b[;sFC\o�7��Aq�����/:bv���������;�b��\
i�b	���N��;j�]ֻ�>hǚsJ5�.�s5����z1�Ĥ 7��"/A��sW��zQ�W����.�7�
w���=dk:��3�޵
���ams��nY����bڽ�ko;�˙�Z�.DBg���~LѶ1���s���a�F�-Xa�.�:x^xg�6�M��Ԍ����.������a�%�������/�+w��U��p�^���Z�Zd�������k�i�u*6�ĂU[� 
��/��w�nߞ�P�ч�'�&3`���a`��]G���c$VA=ikU�^��a��o`�+�&�g��b��Η����ť���|1�nxaV�֪�"ۼ�p��E�v$���ڐ�	��2$ȅ�.)����NN����wOxD��{��pG8��	�s��T)���.�`WKz�su!WbU��R>��D+��^Rë�!�Zر�^��EqdǏ�����ڃi���͓��4�>F`�Q"�p4&#����G F&n#'So=xr���������i/�����F帨��
&�)Ȩ��!����4:�]�a�`� ߏ�8��7���F��E��$+�-�.j��LP��)oTөchĩ�K�9X[�`�k��ϕŰP��-F��9X�W�J�T�wg�)���`��+��I�LڟX�OC�d�*�
�˪�R�<��𕶂`�֦� ߂@�"�3�0Fd����r��y�L�+b�U����d=<�;�z/��2���=�G]dr
�XD�$t/锌*�նMVP�C�-ʡ�1l�a{-�B��bh�'_–^*�B��V���!�]T�x�\�ϣN�uʼ��;���O�c�j�4�06�L3�f����>,4����`x1�S��u�7/M��n�ʟW�r���j\O����;ֆd�_�����||ϒ�p_�\��*t��%
���[VPvۭ�`+R��G�&�M&7ߍ�F(�q�$���mu�踻��%�F�߀�(t��`0	����hp�[�L��3���y��a�ՂGB���E�e��em*̈�ݗ]!�_���EY�Tw6x�w������NuF��K�M�
S�N?U�p�M�S.W��G[]�7��6�:��{�g���m�+]�>�ь��Tۮ�3S:�6�hU����#�[��7�XWNī*�Uk��Zj����A2����m���%͐��re��2a�W�~��f�5�pn�D^!o�P��o��x�'�G������s�0`��B�F%���ꣳ��a�x��*��j�|��[e��lf�T��0��|�޲,���ʾ�ۊ�ޭ�giR��$ĈS��r�[
p������M�.���5#�9Q<Q�A�&�E�����W����$@[�/P���*��.���d�Qdݔ~t%�:���H_HG$�/��k��������?�A����EZ��'�:���V�yIԜ,�cW?`���;�ED�!'�<�V6H~.�M��w���W��&Fr�F��X�X��´9�6�:!��9N�d��t
�n���u
X%k�B��+��^l�P�ѻ��ݒ�ׂ_�{;���#~n�T��K�B��G��&�|Ѭ�M�V�tHN�\�|��kW��B�¼�=�!��Y0���]�#dշM�竪�����d{a)�U����F�Q�\K�+ʰo��?���Z�]�i^eNNu
ݦJ����o�d^3'�O]�st��
�y���ql�i���X3�y���ʡ���H2}洸v�Cds�Q��l�3R�yI	8DDMj]O��e2{�R��ҠC���Eۚ�K�o�D3U�$E铮ӂ�����yޖm����d7t�O���N5��[~|��I&f.v�d�PoF`EP&�!G��4!��ȟgI���ٖ~��0 T���.�l����fw����:��TR�|P�e�Lh��B?�j�z�C�apI^�d�f��0n-y�MW�
�M}����-k@���6�Oo��]���w��4;&WQj�Y�Vs��Ъ��]/[�z�3rd_?j"��rm.{n֧�1
}��\fн�PK�yVS�m:�b=pip/_vendor/packaging/tags.py�;ko�H��+4����l&gD�ug�@&6����C�-�3�a������UU?�MR~�����H$>����]խ-vz%$[��3�N�$c�X�\�5y�+V_qV�j%Y����2Y��'6a�E>�b���%yJ`�N>���pN?�?�|r�'��YU��
T�,���j
��E�Ū�x�Y��Dd2�Ī,��e���/�m�%5X�{����ȗ�r���SO3q�`%"��Z?c?��>�'_>~<����R�K��@�#Ģ���Ǫ�'�O��=v%w�`A�ꨬ�kI��N�o
�z�iS��_r�R��ǎG���P��|������u#3���? ��aTt��O�,��<Y�8\��ȵ�r&�|�S�h_U�|���������?�g|���ϧ��N��5g��&>�a�wZ@P�d�^ƶ�_9�_,"�~�,�`b0�ODU�-��Ͽ�g���n4ų���i�
�B��o��'go�l�=�f���)�ir��0}�^V\�NPj���Օ���&���T���:NJ�T�8��	�J�VM�
�m�QW��§;�
�P�kv��u�u$�,�lJ�;O#K#]ı̊Z�1,�,�AD���X�Ʌ�oc't�s�j|ʗ�C䢎�P�lIb68����+��n�l��}.r����!r����(+n@�x�p�Ὑ��er����� +~�6.���t���O�^����ٍ�2vo���I����s`�Xqq}��0J��1�$�d_�T�o,.e+J�N@�_%kĊ���
\*h�R)�!Qur&I���IX�\r���WI�~�Wx���Bݓ��FvI�9(Ͳ"v\�)�ЦV`��A�@YYi�*�e.�foYr�6%��L�P�'+��f~!�H9���0�)����#��X��_���W��j�3�0����������	#L�L�	���1hlXrl��f-���m��&TE���Ē���&!�����`δ���C&�8OG]�BoL��m��Q�cR�+p4Ӆ������RD^-_"A":��k�����1d��6Bz~Ŏp��#�.�Oh#6!ݑ bw�ė��uw��vm��0�.pg����Bq���"��� BdIMC�J��˹HB�ˆt7�$��y���6�!��G�c"�w�)\CK)�<����r=�����|#Gp_KB��|�dF���?ӂ��C0J�~kF�`�)Ņ�pH���]�*-��Yj�W�O�r��u�p�#)��6�!$�d	3��4PCP�]����b1�Q��$e��g`�Ag���Ҳq�YV��i�
=/K��b�5bA�K�1���J���
1;�a�&��=rJ�����p�JKU.H`��ڨ�2o��h���RC�0Y8�h����(�ͥﻂ��0T���g��S��0�ٲ�w��:�|QT8[���M8l"�sr4�rE�����j���q �>{��� ?̵�q�d���)@d�8)A�\�*���U�Ǽ�#��@ѯ��A�����k$&i��3m���l��%0+�J�XQ�����q̢]ߢ�23�wh��lGe�X+���Y8��]�n���q�ּQ���:Ck^��XS�Ύ�!���E2:�t��Z&�9�Rg��`�H��A}��{>֎�s�
�Y�e��/�K�S��@u�.8^��}�k�V�pB �а\
$g�\%u
���V�N2����E䐱AI_p�?����`���-�Z=�Wq�2B��jl����lXAƘA4* \pP��J�H�^�u)�^����6`z%\��!e����l���-��t���^�Ǯ]2L�l�Ө\���@q����UXL�ܺ�%�8	�z���]�h�40��zC�ځ��i�D������?~����'W�v������ߙ0X.���N�hr�(RpeX���χ�>�'��uУX�㣙���^��\Y�
\�G۷;����1��=5j�<Zg[�-p�(ƋFdPlAU�*�HR(w�u:r���a��j�p��ɔVj�S��v8�{��<O�e�(�k��i��AQѲl{b/�!�imw�͌wߑw6��ͯ�ߤ�s��X���bB̜�G^4Dz��6��P;]?Z��֙�±	�ŸX8��aF�܇������~���(`�f�@���QYtz)uC罎�n�BE�SH��K�p
Lz�s���
,>�r�n���(@ʹ�A�q���FE?ʰ��g��}�)�nֲ��y��f�B,6� ��D��
��
��I�~�������s��L��ϐ�ght{efZJS2?�>��E
0�5�DŔ�3j3#�荰�֥��Ԃ�S]�w��ZM�5��h��/LF����zk̽��JY�.f�Re)��/6�e�'�9N7sGu=?3D�%}��-�xm2-@�#A~��BԠC��)v�@-Ѻp���u�g��Du�����桋�Y�킗5��UUT�>�; ����h+y��m��T~~I8\�ӓⲇ
;�	�U�R�;�׌��-�{�U3ߏ�d�h|O\
��b�����*�/�%���9�ĝ	���<���g}��1}0�?�;��%s�|�/h<��?٠&}Y�e>� �C?�E��o,ރ�#p��qC]��dz�CB�@x�6�덣��9�^��r�7�@�`�+â��	sI�Ad!j��1P9�Մ���2�
"��Mz��h�6칰�i���w�ߚ�wO�3g�I���pq��3O�e>�`r�}Ź�sw�~��G���q�])�x_;i�t4���)�X*v�*�*�������6��g�"N)s4J�I���\I^�J�E��vz�~����8{���
I�bjP���|����{� �h��	�Ν1ۭ
�K��mnL�ų�P@{��B�@��v��:c���o|���O��Op�Ri �A�vqiSެO�&��XX��1j]��r�|CQ�;w�Y��qE�_����|���q�a�I��
ں�ܓ�=�Y_�O/
3ڦDIc	���ﱢ{(�sh'�J DU��?�N���l�B�6	8��o7��a=��a�6����&�uR�u=�r�Qf����O f�_.�"O�u�\��'hOMآlb���f�����=7���n_��_����q�lO���p]�:�E��Kó���\�I
���l78���=:�
 0�����NJ-vz��h�}�Y�z��hj6۝�N�����p$x��h.���v���CKy����1s���3Y���}�f�����:�Gw^0��AR��̵n��m\B��*�v�M�4��V������$���b&1۵
Nڞ��*��pk�6X2e�Cqw�����͉����N0��|�Dȯ���x��y�3�a}SL���9n��h��f;�ᣔr����Wי��?�B���L�|�
�,&�3�&��aWU����j�X��.��ƒe�.M�%OO;hϱ�x��I6�z�N��Lh�2mS���i{ޙ�9O�Rر6L9�[_�d��R�h#�Y�n
��%���1��4Sc�p��q%��F�t\o͓
j��g<���i��fUr�+4����+oVP�(���XW'�M���;ӈj3�
ٺJ>���!�kX�	�>Ne�~�)�!�>�~�K0a!oc]�7���b�.�K�{���̽���X�P�|A_[N0�AC9�*��"�Z�uE��j�R*�le��7/n�"r֔)���A웵�1d��Z�!����U��J��l�1:c���
��#M��_���
�Lގ�>����p��-�b���'d�������L�-d��T̏�
�}V�7��L�	�u_%�\�S��h�f"���(bՉeD��q�6'�5zs��JŷS]�,-�&�f�F7�ܝW6��{��ſ��x�O6 �����!�4���<���3`����6��dM�KZ[��=�#�$a<I�1A�r��G7%J…C�(��%{�~�vqz-
�4�@8��A�`&�0��.�K*A�h4ه�@�x�C�0����;�Uǐ{��F�_gE~M�b��� �3�Π.�������Jo�d6��m���\�ԎǪ���z��ѱ�,K��NgӖF���	Ql��F䎼t��Ǧ�؈�򮏥gC���`�fU��kݙE�S�C�ߦ�gը�y{��@�9��\{jW1ўj�Dn���X��V
�Sn��o<�{0��E9gm����F�ں����6�*f�N�\�_�vvH���QqQ������t�7��X�S��=	�P%��6�W,�
�Fi�r����3"���T�,��E�P��o6�Ƭ����ݭ
I-�gk���$�;�o|Ԯ���ptV�1r��zG;��+�3�;���	gg�l<�oPK�yVSA��3�hpip/_vendor/packaging/utils.py�W�n�F}�WL�"c�p\�@.`�p��IU�ɑ�	�ew��/�wf��)��KZ����\������=��r�b�1���P�Y!Tk
ra��)����j�>��B��$Ef��^�odb�@��g��N�/N��ž))Mm�"PXJ-�T�do!�r]�h24��u�yb]JeH�[(�s[�b	��wX\���7��%ExY��>fi��W��&Y�F�2YFP&J㜎��u�\#sZ\'��\�]���J�Y�������̹���B�F�f޹Tk2s��y�FRq���oB���<Ѻ�e�� �	>'y�'JIN<����
E]+��5,���J.��T�2��U��.���'��𷸵��E&���4k�D��gߓ%זe`Y��!�Ӥ��H-`s�K�!,��3�)P�t<�g�~H��r�P�#\q����Wdx]Qh�$Tߍ0+H KabonŸv[�f�a�}�Q�Dd��?[F���h��w����;`��}}�k��5L�w$��*���)�(�s�A�VM��Ta�=:�j�;�v�����幅m.�aX�&
Ҽ-�"Ol-�j<���|�V��@��
qA&Ty,R��l�6�-�.�u��c�I�k,L<�A,(QP5�T�C}��`�e�m��_��g���a�a+�7)��hd�p����5�Z�]!-�W!�`a����ֈx��h:��<�A'�LW
�R�|�����qR�Xd�¿�>��m\�s��;=;��Lp�������~�⃑�R�yz?x��ýʷ&>�_P��?��oR�nB�7<\h��a��Q�؝ne\*;��s�G��vHFz��6�9�G����}O��=^c.K�v���y^H���8�t��T��[��ٿ﫴n\'7�Z��^�jgм���j�Y��<K+���櫖~�Au�~J_g�I����)h�d��f��=�ޥ�9Rwt���nT;A蚏��(��}#���R��q�q:���,�+ԽG4m��0ÇM~N�Ӥ�
�"x����Q�����rQ7��95��F��\�z.�p�pXg���@�Voz0s��[��ZZ����	c�ib=�(�
Sc�5���ψt���:1�x�����,��^�p��JE,�����OB����~8���)��ˁ
��k�h7�j�^Ͷ�|���5e���l�E�w����ә�f����ϴ۰����9��:G��J8L�bJ�M�	m�A/�x�dU��0��y�����ml�5�F8�~�����8�Ō�]9���j�Ю�8����]GKl����K�ޅ���>��g�G�މ�6��l��^��x���~5�d�:�_��&����=E]{�!Q�V�]	���$tt�s�t�>�ʂ~��.FΌ��������Y�~2+���Q,�Vi.n�j��D&�>�oR|��a��N����<qB�PK�mWd�Y���8 pip/_vendor/packaging/version.py�[ms�6��_��7��yvڻk5��4�u<�s<q.���T��d�ɒ�m%��gE��lO2��i2�H�.�}�#�]D��E���.e,�(TI��b�LU.�%J�/
���E&C|��`�^�E�&��4��L짳W&gJ����/�NΎ̄	��ӴԴ�A�����4_��,�E�.�X�JLU)��z�h��y��8Va���*�e��Ջ\�_�2O�d^�fy��*Ã0c/e�I�������^��&#�2��eF��q���A�'�uk���(�eX.sUX���,J�r5�~�[e�;QsYFWj=�|Cp��x��cq νL���3⦟���j/��+G�ڛ�Goώߜ�O_�{w���zfEs�ͫ8��!��Nsu��+uE�MTM���`��Ѩw���NCoC�H���ڠ=�OG���O��p���Ѹ�8s��ɁC��V��~��Q��"��Zam5��J��'0F�J���
̢5�1Wm��f�3��v&�H���"�˚�f�\V��l�F��1:�M����L�5�
�PӒ��T�x���<BxA���XImSuE_Y�Op%}�$����j&�f�W�֐6����׶�؟���������c�a�9�!��r�O���)�a,�b�����H'�a�L.�8<X0��L%S"�i�Y��Q���`{�G���a�#f�]଩�W�JA
��+/���M�2�du��Bu��&���2��2^��<Osߕ�,L�V+���N)"�@,��E��I�3�M�]�zyv��O����Z
�ij��Hs��Y\��B�3VOk����5��8e5�Je�uShv�!�ר����I�~���1���n8�iK,�Iq6`�$VX�*]"�B�$�"1ȫR�S�5�ޅ�S1[&lbvA�s���4����v��	��5�ٮ
EL��+�3��?t<��IZS_�R�5�X�P<���C}7b��d�`��&�ڴ� >6�9�s�p#�N�=�n����\�G�:���Z(�Vӊ�'i����)�? (7���X=�X�q�����SY�Ru��ǖ[v��(.�D�y�\�<�D������c���UE9[N���T����0_�gN�C��&d�m���-�t/QŒ6��/@G��؜I~~T����]�7t�)�b+!��P�LD�g���٘R�:)aJ��\��|?���Oĭ8��G��Cp+v}�ՀB�ӛ�#�M&ː]�x!3��39J���CoP=_E��y�KOȃd�k_�Au���gS��*��SY�'�-��L%@}��,m�H�������Xv0We�@��}�	L�r�h��
�4)�d�L�>ooo��������়�d�Py�2Pp)d�D4�8���ڙ+(̰��O�f�*)�9�S�2�.�_'��
QGES$�Bbt������:5~�٭t�F+(Փ������=���S%�GR�iw���@�h�S�
�X���4�!7���6��K�N=4d�{��]CRB�fT�^)ɖ����������J�B�j&C��`
�1C4'�N���b�BD@��/K���#�2Հ^�Av4�j��Ky���[\���[��<TE�Qmv��(���V6���Iʝ4�C�dx)�T���$��Js��8���u�Fm�`[�����?lB�5zZ�7� W�M�T*����������*�K�>��X�Eq����� Ʉ�1���W�"�Ҭ_��e.��D�Q�i��HI�&��Hq��4s�lgm�|:x��K���-�5f�"�d�;<K9ݎx����m�,��!`�d?\Ӗ1 luG�]��rB�@
{�
IM��rV�m`����P�_��p�����������g�����'�#�y�VU�����3�=�h~�o�.
V�
5'�vhA�Lߢ�]C������`��yg��þ��܆�yx�����-�nM��{K���õ����k��Pt�	�ݵ�ɾ�����R���y�|�������'O�"���I@�_���Ϧm<ք�﷫�yW}kD�0�Ї�Z��d�7��ʠvt�m�S����P��lHsu��E���༣i�O`�����"W����'o��|�Y*Q��[�aG���%%1�ll4�� WEEX*�H!�VxYr�E�((��Q���f�2J� #L����К�ǟ��Ϗ=��Y��ʄ�Sd*�U�{�X�f�o�}�3��Xy���y�������N*Ş{c��@���#J
2���7y9�f�w��M�t"V%�v(�k�h�M�$a�h��K�L{�� ,�c���n���}VȎ�57�{k�l�Qz覩�c�؎�����ȳ�	�3_Ζ'�2`]�i��f��8�52��Ý���N=�%��}�:�m�6!nf)�D���V��-3�r�]ۚ#'��y2˺Vxt �\��d3����#�üݐ�8`��oi��kx��������������Gu9M��Ӟxۼ Ә۾yRJT�7��c�O�gWf���4#y�B�����g�'�՘�u=�v�Φ#�}�{�i��Lg��J��4�V���
���7���n|6N�k�a��Fs�,#��V����r޼`Qc�̀-��b��mb�i�V���
j��sjD�:t��w3�!��sZ2�;gm4��y׍��U���f�gs	lk�ݧ{~�#	p�6?z��x�?�}���C@y�gzH���YSZ���ʉ@g0�']+�Dw!K���P�������J�X�At*�oj��SEɃ���<��;�
��S=�<շ�T����A��t@ݽ	=�-�j�*�6]��wW���4�k���s�"2�@sn�M�mN��(D=�G�$��&sc���F��{�#��u}F|'�:�����契r��3v`���[�@���\�����;�"$��=��v�{Q�%��|ZXi�J��)2SG��e>i7�2�֨�]�l/��9����+�FgEC�2'!�T��:1��.�@x��k�q�{ҫ���&�xX�9��o�S��&By��R�o����_�q�qV���*9i�A���1!w������>��w更��-K;D�찦[��ML�f�[ԫ�}�l����*)��`��`ow�o��ܫ�k��s��q��h訳h���?�ݑ�7�S��4�j�Uf}ֽ�N^B٥�6G���$���Z�t�F�mQ��('�h �w�1F&K�F��k7K������X���Fs�B��D��ul�<x�LMR�H�ma�[�zf`���=�=�70P�;���1�ހr.A�5�y�J�p���2u}���
��BA8>�	��Ar��/}&6
�Y
2��,�D]�Ә��Oș�J�kC�L��Iņ[�z�a�HP��7A�1��4�8�y��D��Z�	,L�C:̟d��,+*�[�:霜��i�Q�Lہ- a�
-7L���~��-����\L�R�����
�8UNlNP���e�>��`�ᥧ#��K��4�v-�ι��(KܳG�x��.�}���ENVpk'Iٰ��+�;�C�q�#�P�e&� |���!�c��|����Dc��J�6����/ce�/�C��\s:a�46�q�n��7)x�bc�F�𭿴h��a�t�
6j׻�X�\ߖ<�MN`%��DMkrVV׋� ���!��qYkKn�j ��B7õ�q83:��T4sDZ��=�����H0�-�Nk
�.�Y���6��`�=o�筼�"���m t�w�A�>P�<�	�����M��-�S!Wgߘ#(�yu��ͬ��P|ztZ�%��/(���Aⅳ����cu��<��ED�W�I'��Ԃ>��(����q8��d^��y%;�Yt��,��Du#�#56�'�ӏ�`y���G�M"�o��Z�܍�ג�z�cn�P5`�0��6`E�z�PK�yVS��B�w�pip/_vendor/pep517/__init__.py5̽
�0��\��q(����Q�l�!jmCmNLRŻW�w{^f>e�R���<���]{�H�2��-�J��bc��E�B�L����D�G��Y*�ݲ�P��8�Ir��!���p\k��uEPK�yVS�>R(�
pip/_vendor/pep517/build.py�WMo�6��W.����F}�n�m��"��� hils#�Z��k��;��p6���%q����#�X,~�ES3�:�>CeYo�ܳ��[�ӏ?��R�H�E"�Ni˸�w\��BŧF��_��O��[�$�N�� �[�V��kyZ��
f'ͻ��f��aA�c=�yӀf��V�f0��v�m���)�`V���6݈>){�zY_k��ܪ�)��$�}�M�M��Age)ye�'IRÎy#jn�4g�i3����1�{-M���{v��0
_za���Ԉ�ԓV5�X�c^L�d)�Zmy��N��X�T�e��/f�ƚBQ�c�0��/a�ك�/c�[��(vJ��f�;��跚dZ���0���M�vj�@:�U�+(�w@~D#Bm%u�3��Ћe�9P�p=����e
�ġ�����E��!R����d{�:�c���4g����\"A8�����]�kyaxz�7��|<y���q9cɸu�c�g��7�u$��B㡝#Q��=��;�w~�=μlΎ��O;2vB\1wnԘұ�쫈6B֢�y��-��<\6/q���
p��7�O8�S����O��
�b�fB������8dS�`��,���\��6!�t��&�ܸ�Mz?����Q֪�������.���Y��a��2�!%�-���8�>P�輟�8�o�6����Y(����3�?KK������ɯ��B�T�~@"x�F�5{�pp�(�_y,:ѕB�|��<�~
E�>c
�
Qk��AV��h����(�z���o}vr���c��SG��<ڶE�q�O�n�1���n�B|�~[/YD�x��B�Ut���]��a��s7Ǥ�Ӗ
�
��澖���T�|R{��K �0����	w�^SpZ��K�;\h#��/��F�c��{Gv�O�=�.�>.�[D���+Ws(j�ˋ��"�}��%�c�A>�ǎ~W�_t�Ӹ�x�+��}���J����u�Ú� ���M�Y�s'�J��䒖�f~�,��k�W���\�����!<��Pr�
��=����<�|/�����5��튰�5C�7D��8�8Dup*b��+�A�k��}S�C����"�&6aj�4��v�fiGD-���8��6�y����
~��56� ��C����Y_]a�D��*4��^E��[���xei���'<����:d~�''��	uw��"lG���gl#�����s��:�x�$V$�h�
pm�r�s!�&A�ZF���^��+���
�}Y�V���Q�w�DZ�d�+PK�yVSs����pip/_vendor/pep517/check.py�X�o�6�_�y((c��ld�C��[�v
�{�
�i��Lj$��-���"�aK^ڵ�ê�����w_���F�ׄ����"w�)N�,����ؖN�5q�,+YpRY^^\��N�'��m:�N��-�f]2cEK�
�^oj;Y��wZ2�!�ޮd!�䵖�0KJ��<vS9Y�|�Z�ڹ�6��������0F��og�c7�e�y8����"��W'5q��B�"RŖ��p�2���t���5�[�+Ҿ|��O"�\x����
�x �80���u#�V[���[��R���KQ�~7x��d�
."��Z�g�)L�e�mE��&�	+���3�gf��.�Μ�0���V�;;�xn%�i_�d�^�k|�ٵ|`5-e�Ieh��У�S�V:�Oj�	���CrQB�
�Kai�+�rQ�فx��	}�$
����k|�p�Q�1+ ��M-���pFcq�Ҧ���wc ��]�'2���ν��/�Kju���@�+rL#�Df��⥩�ٿ��c��;�����船|�F�2�&�4�^��"����Ƒ;����qR�r|N����N�:Xp<0�J��>R}ٝ��w�#��\�U��-֠��P��:V�v��>����p-���l؍ A&�넲`�t��Z�f����wɰ0�nu	2�⑝��m��A���jA;��hs�}Q������.

5�6��g��pN?��{dmʨ�qKVRA1�K������3B$���=)���v#D�GʹF�s3�4S���L��o3������o���8�I�4M��1���;f����	��c���#u��Ÿs.2.M���Ż�-ɜ�f9��PV:��;Xv�JW��A}�:U��c�k�^��m^�TC1l�K̒�f��cؐd�9 4�ɪ��Kr�,��d��j�#�%gP3A�_E��������CX��K_u�;pD�+';t�KV�+��Y�Ȁ��i���P��Mq`]\��{��b�fC�>Q7���2��u��۾s�-�1��
��{���ǃL_���+�����C�޹��)����cqˌ�O�o���˄��bs���W%6^+D�t(1�2"�w�{iP)@U
ea� �Y�,~�J��D�����
�#r�O	=(_�\Ck���v�& 6Ε����.Sm�'��'ʓ�#+�x��>2�
O�82��ʔq����u�6輙݈�\L���0is�}XdB1�_���w�����-d��0A&�v*n]��F�@K�y�Y~����®�l�f�c�C��Y�)��%�x�<f,�������������m@�.u����f���o��Z�f�\x�k
�œ�����?�|� T9�/�Q[�8�
�wI���(nm�B���W��5`��`׫�b:x.���7�d�d�F�њ���l�PK�yVS
�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��^�PK�yVS��5��pip/_vendor/pep517/compat.py�S_O�0��8���(d���
Q��jL[�D�=LS�6j�2�%��c'!�BaH���������nH���֔��ʕT��8�Lf9��ۂ�c]�
��|:QE"�
��FZ_�^�Aj����LBp4
۸jE���Ewh
I:�:��?�b
�3n�3�6�����k	hu��	�W)�M1��*��娃�ePB@�&�t:���d2�( ���Q��� �Cg��V��_�5��5h�F��D��U��(F�#��+����k�yZw�k&���h���Ɛa̚]=��L��ss�au���a8�*��q�o��,e
�����bW;wa�~�3��;}�e�68�{A9��%����w#�M�?w�OxK%5N9��m$�8;1A�u�R�ze���M����KW@'���{].�~�?��p�p+�\�Q|�:!y\�O���PK�yVS;ϸ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���PK�yVS�"��pip/_vendor/pep517/envbuild.py�X[o�~�� �(dc���-�q�caː�M��@�%��FU�Jb,��w��n��sZ�@�Dr>~3�E���dYB^��f��0�$�	˥����;��+ZH�8������H	͟���j2���)E�����2��\�*��b� �@d�-������{?�10h��Y|�1�S����
�H��<�KYF���S�C�jv�,�'?daƣ�̾��(�hx�i��^p�4.T�d	jPq_�@+rY�6*�(��@�p<��IXA��h�F��"�a��x: ����6��Gz���r��M~�,����j�&��5�{r��Z��1�$I��X#&��@���t�W���\񣥧.`�k}ѫU��IK���G�����l����'�'疠eG�Yp�樵E�Y��=�i]rķH���s�sE_�#�<�3Bo6n�q���K8p���>�xW��	�9�yB�K^W��\��6\(�yJr�$c1�a��f��#s^���c�ӧO���ӏ!��"
�y��8����]���D����}g��T��8��{*(�㝈@��&���͊Ď�*�G�� ��*b9^�
+��#�W{�<U/�� ��I�PI��M)�)S��e�1rñ�0�Q�����Ҏ�K�#�`1"ٰ(�ʤ�S/�؁��DO��R�N��&���V�(��{� a�l[*��8���F�~�Ó�ph��o��5��*���Psx�c����K�F��4��`J�/zf��B)�2���[�PG9�0�E���T+Z9N�hP1Ó*Z'0Sr��>�ʲ@����@Vpr��0�!�SL���x7���w��!k�սv��p����M�]�ػ��
�
�wCf�򋻺�O���w6�Ľ]/]��&�j���vW��H���,]�Ixz[�: wc�n���ٕ�t��ܸ�
�ozF�3?p�w˙O�w���8@��Ȯ�����aG��Y`c�^�f1[.���"׹�~��ϋ�,���W�[����Sm�Η3��&׳��gG�z���e����C�����Xl�m���{w��d�4ԍ�&hl��4ȭ�.G��`!��m��׵3[�!��'U����`�sZ
�B�Paq*K�&f4���2%�	''���ԅ�hB��9�4;��>*M��U�$}Q%�ָ���<ay�GV���*�w"���IZv��x��WF�44�C66�UNZςȢ5�礎��d��V=��d�PB)t� l��",%#@�ڂ\Vcc��b�K�V6��@��I���F}|�<GB^��/ ���ik�����"���?�V�+��y�̸)4�����ޞ�+�����T����>N���A��Tv9��*JA3�E�S��fz�O��#z��_>���=�S?�|�\�����o�9�_ern�o=��{�'e
Tܢ�9Pi�F}��X����k�D���y�9���u��4Ŧc�ڭ*#�Ʀ.��-!7�]��T��Įy�S�ꨥ�62�!�{�X?�W�*�fpխ����+�ǀ�����\�3F��V�Ӊ��]Pa��	����3��*U��e����v�VAf��o��	9���q/˼v�}�Cu,h��efh���Dv2W_�~^�b��N�*x��߬��<M�urQ�@�������������t.��	�HI�w�&/�Iu�N���kq�	�͟�H�(Ά��o׵B�?��zo=R=V_#BI�����H�tV�W�J��4�"�%I)�z��5�J��9��ښ����O� ?A��#���(
�)	�T�-�����,�J'�j;%^Qu
 [`�U�e��J��$�Gd��	i�e��=�+�0�h���E�N�k?K�M+8�o���Nx�u����?�W��S�]k�<�5�s4�>?Xw����Ag��%���|�Пo��[�e�M_5��`L&�Ga�W/	S.®w��c��&�
tJ�6��Cƽ���9�,�G����W�
���~�rA]��f�����p�*���-s[޽!�?PK�yVS������	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�PK�yVSUx��u4pip/_vendor/pep517/wrappers.py�k��6�o��A�m>\^E��"�\>,
W�mveR�u����f�)Jv�i�^�j`c��=Cq�w�lZ�nFK.6�u#w���e�ڊ�n�Ȏ
�a�̎Je��j�n0�Q�3%?I.U���Hm��Wf��n�FL�~�-+n�VUj�e��]��W��|}�c9ؽ[��׼b��ġ���<;��r�G��v(WE��6G�g�<:��Ռ�g���L������7����sqG+^��o����+�uC���jܓ�?֬�-��͕lM��ͽX��5�玳�����Ǹ�3 \�_�f�Fڃm��J�$��^ږ��]�0C����YU�Xs�Y�Ҭٵ
cI[.`Ӣ� ޱ���
V#�v볳�7���
#
劕�y[Fn�ZRP!d��FY!4�8%V�������<O��)�B���0���}�ouz�9��Y{�8��c��q�0*������i@흫�!����<�BL�$ �`���ZAMs�^>�{���E֯�����C��s1�uS�|O77��U����v�^Q�L�(��-u�~RCDG�BR�J���r��`;��
͙��z�3v	�[D��v+AWk�qu�l�Z�h���s(�.��wV�`�e��g��.AB��N�H��׭�oa�?����f�췘K�Xf���?Bf�ii��%k��I�N8B6���Kk��]S��pJ�s�X���H1B1��B{�ư��^��4�6J��5��jV�5�H�+p�;��MZ­@���CW�T�B{ ��7�A�鷄�dm�@!���U�2r����:"��oYu
��I� Hb��G;;�7�:��id���Ev��YDZtf�xrK�Gok�P�ړ����
7�5R�q��3��7��(����P��C]�wd-rq+�Q���;��W�=d�${f���
�42z'y����N����bK!8�PCT7äޫ�
�^>L�ˑ�p��\x�cR�Wx���
)M��������mR��f���%M�Dcm4$��<qM�ț�Xц�Ʌ!�Hp���3���u`.jɞ��Qr��b��]����r@�$����y��{
y
�'��րtf��UY��dD��A���Ȁ!�e?�d�L	V��>�Q,� �L�=��d�%y�#?V�6]�;y�s�d�Q�ڭr��]�]��0:e�b6��b�hW�]Ɏ��݁QA��V�ށ�L�]˪�{P��,}H -,1vb%�O�
�*0>�TL�.��/`��ͦ��]+|C.ӂ������,�,�dd§�y�(�kJc�����|Q�֏,ZT��I���3��Z�R9�uR
�ڑ2L�@�d��)��(rJ+	�B��]]Yz ����k'�����3�2�B��qWۥÑ�������#L�3�6�4112�&H`��x�XN���|��
KY�!,��"Fe��o<���Cq�|��z����!�)�Z�5+'�H���ȓ�X^n��'�q�9�O@�P��Ý��GcFy�C�W��c~F��EB,�A���{ՁH��^�8�#~��5�,D�sGð?"��?�]G?2z�q9R7�Q�?u�kF�J`JKp(9[�L\t��\J+░�J�̒�����!cv�G�d>A$�_~]xR7p������As������j���#�z�,'�%�Jq6��Eib�F��D�È@��d5p�DqpGsfP��Q��l���3���cE��}u��3���[)+uv�/��J	���qQT]��&W�#
���?筕�����0+��
揉�4��h��cXu�L��4���g)o���ك�V�5��L��JG�1Nw����#�f+|�*���вW�Mׅ�l��ۿg�F�!k��-Kx�ԕ����oP�����PE���=J
�=
���X�,;���.H����5�i�ۚ�yv�Uǂ�&��
*�s��;&���[S��ͭ�x	b��c�����
͇~M�%X҉
�H֐�{D��J���}F26Ʊ��=�Za<�H�i�|�/�G#������|��D}��i��1�Xh�b=$+Z���1T�^;�G�0��{)=5/F���x8��e��m�b*Δ24Xh�x�H���՞���zד57�)m�Ё�ɍu�����S�^�:�;��D3��k&�t"�O�Α��J���O_Q�A�����j'�?���-�
�O�0�?��L��_[k7�ϩ�8e��s���?����G�������+���Y!�6��x���,>}�Ulh5}�Jc�y���`z$N�~�O�JQ0*�F}�����>)�H,�gG3���C��EmA)���f�< ?���;ŷ�`ʽ������b�$�NE�wJE�+зk���߂�K/P37Q���]{�M2�&�0��Z�ePE�;�Нn%y���9I��6"��A �@n���P�
oƴ��$�K�L�r�F߬a/F�ʊ��P�1i*	qC<4$�7� �� �
�q91�QTt�@P�= �`4��5�z��[KF ~5d:��M9֓W_\����'�)_e;K暩��r��"��+F�e~���/�O_��<��ٿ^���}���ـ����
��jP�6M!�Ջ�����V�O'��JKÍ����b�_<��v~ߍ�Ä>Ƹ.T4ض��5�,J���y�uk�]�}�[����H����'-Tjs=�!�<
`��\ݮ-�i�y���Q(�j&�z�
�f`�$sK��r|g���J&��2�R��&1�,��ۖ��"��upؔ7�5����O�+�XlO7z
ti;�2G>�Ў�y�?狱�M��d����7eBƜ��MH�o6��1[9ϲ]����u2O�*�"^��ᴂ�	�85��v��|0�2\O��Q1h��m��e62��vYޛ�|A �MtkL����Ws�#�ί�v���fÚ7��(�_Ev��|ח�~	CNʔ��Լf�g��ZjL�m��df�\�A�0v��*��q_g
;�
��#t�,�8���7J�v:N᫴�
��;E��+��_����@��@����q8���os',L"J
3�.%Ò�""^��i��J�d(d|w؎�PZ^���������Kvj3F�Wˇ_^�WjI�T�F�OWAU��
�z!�����W`�
�0�ɠ)O,ЀF�g����O0ǯ�k�C�PK�yVS��$3)pip/_vendor/pep517/in_process/__init__.py��Mn�0��9��f@q�����G!�!-đm��M�N�E#$���QU�e�q K��uW��[AG�>0z%^KE�U��t��l�61y�\\��d�7i�zu+8��n�D"����F!������0S�L(y�SS�l���9\G�0'bmMUUf`������F7�\'�~�
qZ6��ST���O�Q�]��l��` ��~eA�(�p���y?�������!�-u���Ũ�/�F_[{df�N?c=5o���F��L�>��/�0��-��H�>�(C�2G�E�PK�yVS�"�H�+,pip/_vendor/pep517/in_process/_in_process.py�Z{o�F�_�b�� ���&š��T�I�/���;��R��ژ��e5�w�̾��(Y���p�a����<~��]���%��k~E�&1��(��
A*N�q��jIɬfiBf��	Yr~%��"��J��e1<MYNI\^�CI�qFGd���i��h'�5+y�Ѽ"�q��YJ�	�����}�c��ɛ����'�/�@Y�Â��:0g�VQE��_���Z
�Z�e\�f+V-	�|@�p�y���O��(��<�Z���C�9�/_�3*�T���ue��%��2���F��p8,J��˔��
^V򷺫n��>R_QƓ:�}SΠs��*)F�°��џ���(-C��+�ګ��Y�񜢣�GDBd�R�8)k�02/YQ�:�7=l�3��7��yE~gŁ��w�Ɋ+���:�dU��F��H%�s-Q��b��W@ �/�䁿��˻S���ミF���Z����@�-P�𚖂�<b��O�� ?��
n��y�Ѕ+"�}4�<~�P�����"�Vވ�|�QұWW������h�y�I�j���}`�h��wM[�9���=�q�/`:�
�1ų�0�lOͻ�����>��1$��*�}��똥����͜ FOA|3�Y�B!1�s3�!�v#tpcUA&JAQY���$���
��t'9����Dgv�C�}|I��� ��e�y�-�[�X&�"S�*r�2P�"�
��2�Q�T�|�����Oy��.h�;���AhءA[O{4��AW��|�,&>�@U� �C���Q���J�lRe���@~B/�5͛ѡQ�p	ts^f�XP�܈g���R�2�gl#��A��x^�t�n�i����Km�H6�Ɯ��䘁�e7���B���;����
t�,��.D��(x*�K��x="��OZ���"����t�R��m�Do �=�|��.](��U��KX@i���P_�]>*�Ѣ%���ku�I
@�rZ�m���H�����j}�9jtj l5�a�ȩ]r"I&e��ft�1ܗmn
�������,�ՠ��=��~+#��$�hE�E��2A�&$���7,kh�N�w�0�s���*V�
�U6Z�d=l�2�o�i"t�dH4<����<����lJ�dЎ��'Z���;`���!N|�)r��	\�b�|��Xd�vKC�TS,��3DUB�*��a��5)8$U�?4�i-ӛ���&�B`x��ʍIз�T�3�����xiM:"�CǞ�A�� u�i��Q�QI�[C��QK�ZR��������,���'r�$M���;9�Z�6����gS} F���׊t�̦�p�Pn���٬�h7�Ѵ_���y�3nXj�u�g������\��P�!o�(�t��U�d��Rغ-�.S(/�z�Ud:�
�X��6��Ԕ���3�a�HR�F��(i;+���F�Q���
��z��0ﮖl�$�︍�\��F�~��{x]Ž>}E�m��:�Z� �0ݢ�u���H��r���C�ҝu�����z��{itkX���#��}��ⶄ�Y �P�W�,�I��%G�7ZZ"J��a{��C�����i�?j�j?ݨ�R�-����K@�1x�s���?'
��j2y#WS��ۣ�ד30�Yd�9����~,I=�k'���A��H��‰���-T"���R Mh	A&XBme�7+���]��]w-��	�؅�N�������К/�қ���Ǐ9��!�x�%O����rC�pcMlX�ey)!nwy��)�Q}��<Q���C��oAaoU�/~�>��Bp����@���~��c���� �9�H8��[%����'!�ΗrVp��R���y�Mi6\p[�֛�vj����#r�kH�Y\^�#��2hS)I�/�u:�A#��7��**�ac�D7����#^�T��!!8�&�ٌ�blٵs�����~�pe@~K�d�v�Z�jkg���Œjp���$F�+�K�M���0�ҵ9�F��F���1�X:��qF��)�Nfș@��E�ߊk/��~�Z8��'V[�k�{�C�-�,�`N�ܱL����
�#��`,An����Z��`���N����-seuZ1h����	�ق�>	]�׌�eH�NQ�~ei�D��;�"��ܜ���5�[͜.���
��~^AmW��	ww������X�w�*t�<Y����v�}�2��Ր�lG0Dw�+i>^�	�����Xml�B����S�H0�R�5w	r���sr OAC�H��n6�`rgk��<4
Y����⽛�>�]H�E�â�.�z�gW���B�뜯�ٲ\i���F�N�-��|�\��_�[vv��{�R�?y3Q�F/�,[7m~ϱ�)�s�K@��i��a
��ZB��0l����=�xWP��-�9��*Z��jAU�nl*'���C��7�R!K��k���J&*~
T���)gO�\옃'{��Y��,��ͩ[��޽{������]q詂���c��[����1C�����m�l��9؃G_4�Zkmw����r\^^���%�f�Mo`
4<�4;_�Ӈb��������YsFg�W_rҸ�O��U�W*���Đ|װh��K�8~0��/���<�b���G`t��g���"�r�g�n`���Q|[Ⱦ�7������ԥ��o���7BN=��wъ�ͣt\LӾrnҁ�Ἤi��6ID���3�>��:�9���
�֐R,@zj�~�3��U�3�U����6��~)iׄ�$���7qe�ykG;��F#�W��Q/A4��fL��YF�r�E�(�2*A�PK�yVS��)��s��%pip/_vendor/pkg_resources/__init__.pyԽ�zG� ��OQM�,Iv{�W^�G-���cK\I����E�@V��Q�(��G;�y��
'���YY e��7�_�EVeE�"#�G٬�W��l�Y������ഘ]�e�.�f�����ӗlj�����Q�fE�l.�Y��ղ����r��V�����+=Κ�o}�n/�պ�m��.�\��Y�Y�����d�4n�ú�)ۃM�]�K�P�����g
���-62�l:}8���u�y��^�������p�K��Y�0��Mͳm[fM�S�fUB����z�)�j�]07�VvQ��H�P����y��S�՜�mu��_�6�k|ݬod��]�)o�v|�����f��<�� �0���lV�f,[�K;��n*Z�bG�?U+��`Q�m�in�����>��*���k���ժYohr��e��̋M1M�7�檙�\�5@�L��v]N&YuC�m��n�	�}p �a��k�~��mSݔ����٭J���0J��XװC�}�)ܻŶ�l����r���nH��ڽX��߳f�TE$�M�v��.��򦨖�Q�t`���S,o�	l���u�r��)������DW�}�V�m��Gw����lֻ'��[|uP~���M���X��5�9�Nw��u�y����.�e��Y�OV���3L��X��j���V�I��-���T�|��xhe/��w9<�o�����j�^†���ƈ�4�#8%+�Q�h8�p
/vx����E�p�a7���V�������N粪���o^�{1y�����7�`^���r�B�ppװ�z���j�\������$�?á/�Q׸)M;�_�5S9ݷ����n������7�(}	t�h��{,3(f�V��l���z\]87x��J�<���!Ք,gW@fۛ67����Ww2�]��G�2��Z&��V��3"�◞wX���hD����d8��Z�p�@-�{��S^-*��^���[�eo�zs�n��5?��@ċ��h�	QXx\-������(�H�u���^4��}1�u_��7������Q�/�!����LF:?Qx^O���b���]l�����L�pg�������Z{�oO�M����ж�W���s�A��@�%L���M�].�-�һ��K��]�<�M�@��Ŏ�
��ae������VzҖ}T��n���ZL�(G��2	�ݬ��F�ϖeQoW�>�`(�y€QL�nYtaM��_H�AG�4,[�&�f��*�9<��%�}}si�p�8a�ї�u� �e��2Mn�������}�,�P�U�DF.�����+��IJ\��m��R��q@�v���H$+���Z���TA׹����*#�`"���e���*ᚪ�ɿs_Q[���v/�Ų�K�{���,f;�M0Ђ���_d�9;�z��r��V�"j8ʷ�96�7�€�W�j�ɑ�^���3�8i��a���Pz�?yT�!��:�6�`!Ű�&ߴ
�A:�>Gg�I��� �4{>���M��ںQ�~T�N~�X�ew�u+]���·�- �ƍk	�T����A>kV��[P�â�����As�#�Y���O�+nt�\����4ܸ�s������Bb�5nXb�#,���y�=(֗�=��~ ,U9���>��
���]�������q� ��I9�O�^!�
x�ͱ]D:���%v�ҕqS�S�\�7������i��9�?zc"���p���h�^�p���ˋ]4�,��vC"pvD��7L�fW�/���G
����H��������z[#�|��|B�>޶(�6'��'B��ÜUZ
�+��.o�n&�c77 ��4�l�]����Ế~+{�r��8k�y��3���XԻ�A��9&�p:�MK�\�A�&�$;b�J��6e;�o�F��r�	��B����Bz��5�M+�-u	��fv5Ķ����.�k�I�G͍��$;��۪>�%�V�p���OZ�� �$�A�w�܇~E7�pt���R��ٮ���F��>�˭���ƪ.fK-pPĒ63z&�៊��y=�
0u�0<$�$#�_�@�d 87ï�z����j�ё]7�+`5�ot0f������G `��O�O;l����,\�����|.\WИ���x�,�}�nj�%���͒!����*�cxZ�����!�,$�%������Ph7�E�]n&3��J?��ur�e�%�>4������j`���|�3x�x#�}S�@�����͜t���}<ep+�D�����~&��YS/�$�H)n@4�A|[#ɫ_�RQ�n��v���賀�5K,}%\|t���Ȥ.���H9֧*��FF��{�w�ݤ���
u�	�*��U2��Pl&(���RcӘ�Nj��	K����[��.�Q�Fӆ+��N[�`���~*O�ݸ�p_�󲞕�x��M�7�~���˷�؟^�z��o�Ϸ��}����__<���߾s�����ׯO�o��T(�aF���&�J���qң�˦�ޮP-C{�
H���=5��	��s�X����?��^^ެ6;����2�W��Ҷ(���|���V��&X���ɣ���e%��O�>�
�J�U��{��/u	��%b-�@�r����-��#Cu�L�����S��}Q-8C�C�zp��܈�m���Ӌ��IvQ�%qE�r��K=��%�ߣ��Y�$��,�+�Fn�\.F���.�$��a?��rd�Gn�]FÏ$�h݀{q�;��-��r)�6-st�"+ۍo$,�[Ǹ3����gvp��TP	������LP��d	��g�<^�� ������Z2�/pnV�Z��e���=:��������~��Ls���f��Y܀qy8���3�������bg@�v��˅mĬo}Le�c(�,��YRA��������d��g#�j��Z3{���-"��������AxJ�F��%>_�0�?�6h�yHDoJ�kc�oTZ�P%̹��{/���=G!^���l��?
�r����6��?�D2�z������X��j��}r��C4��쁐(�8�D�Є��Ia���跜����{�7��GÑ�N)y��m�
�t���
ɲkm�'e��kP�������8�l��
`6��e���CU}\V�˚|%X��8�	0���V��nO�6���|�E����e�[yFʾB���
v`X���A��“G���ǏE�b���w2z��ﬞ��ͦq�)�j\��kV�L
�)o`�t_�����y�`a�
1��4��~F��L��1��L�\f��i�X�D��C{���sl4 dh�N;|�tJs!�+c	�|b���$Q��hF�ՐA�^K�Q��:ÒA���\F��h�"�󪥻$%���rPݳd�9��� M_C�-���
t_2�ҙ���\�����r)��m����ykX��r���c3���~�q& f���>�#���V�NJ���sYl����OUY��E1tK�? U��b��7��uݖ�;P@u��3R��oI.�uu�.ֻ�Ϛu��\��@��w�8��� ��_CΊ�!5��I˫��UW�
��)�M|����k��5�os���:���~#���9��7�	�YR.`�S��nK��*��r5����11����P|)B��σ��\�><���o^z2��GO��J��F���8ΐ�X~�QF�V�l��X�����jy=���-{�6�厡	�o�"
�t�׎�>�(�Ulɨ�r޲�`=_3_W��]��)4��Q@!���^Yγ��̙	"�K��_<�2������-VwL�B��H�
�9�"�*�s�r����p�Nï]��0�?�����{2�b*��h<x:_$5l�f
\`�T4� ���-4R����ʋ���PLA�&��/���Z7�˫L|BE�)�BB���tMB��2GmQ�,�k]���OG?����00�����_G@��Ej���I����w(�����?+P�3/o���|��q�91V�ZA��<��T�����-���W��;Ϸt��H6N�\,sOE^��udQ�i[�u�a��lCZc�9� Ȍ���kwr��{�=�ʢ�!m�M�h(�Fg�%*���B-$��1=�ҡ�'~8�;`�,Ff�D��QƯE��X.��YU*�h�
]j�&��좄�e���|l�G�˳�p���y~�%D�E<��'>���U� Nޅׅ�zΤ�$K��Κُu��.�0����o*f�ǣ.B��~��B�y�ݧ�,x�Yon����t���Q��!b��,���^(�?L3M������ԲM�H>O���K�k=��}�w���)��xG/]�(X-�5��I�tzm�?�~��(�7�_�Go�6�ٿW�h���E��\Ⱦ��1��gD	���6&��l2uøl2t�;�v�jg�"�7A㌟����A_7h�	5uS�є�k[�ɦ�T�)��[��j�:V��|1�0n�^�u{6Ps��\�����	�j�~Z(��f�f�c���Q|��K����Qp�n�z�j
��N����`'+�%Q������U�[�F�5�5g	��a�\ͣ녘�:�@-��K��*�
�<��x�-��7�j{A<���Y�f�)2:y�,Dhٙ)#�u�iٔ>a
a����q��ݑ��q!�ʎǠ�s���>!�GW�+�!�G<V���[���!4��pá��(Qz���1x���2�Oy�i��y~�0i,њ�ʲc���WEK^��e�.�ޔ|#�2vpr%��j���0�rO7�:��.�=H�d'�࿡�>Фcj$�],���~�G���벘�܇�^8K�循6���'�s���H�/�'�v���D%M�8B�j
c��]h��덂n�
��<X7��J�e��XO����,.�k�S-�M��t_�R���kYL�C
~�pOӣ�t�{G�F���b��l�+�]|�U9��g��8\�wl��k����c���"��\�z!��z���
o��l�>�t��]�$����WDY������
�){�^��eA�ޘ����7PԆ�

��0�����b`�G�V4�B��W�"Q���<b$�
q�g�1EN�`�:$����.���!��n�z��G=�{oNc��q�d�C�Ԑ�oQqD�T<CC�F��Zk�'©M&� $��1qU�Z>Ez~��I�U�BA��^=ԛ|�
Ex��Y��kӓ��f7�0��^^Лċ��h��+Q;������G��-�����0�pH�UG�D ���:ěm��ٲ
�~�� ~���]��G�-Nb����*\B�Q�����m'�X��	B՟#Jr@�\� ��1���	D��5)9���b;��Zѝ]rp!`�gu۪/��Υ�s��;,`.���8
G�c�^g�o�0�CR<�`�F�?�p�;���+EZ�D.
�nB���(#���l7��o������.#���@�jY��a�ٹu�w]��nA����=^(?�Z���Qё�'"^�Rd�8�"�ZU�|N�J�0%�j�
�P}v$gǂ4bE�$~P	�!DM�jG�d�:�gO�y���>�DT�]z�y'>�Ua��1|�t��ќ��z�"v����t�
�੎I!��m�!`�8�q*�Y�DX5ܱ�ܵ����L��^bP��-�ra�1wN�Do#T�������|`�g�N���@
�t�����`IjT��b��+�2��g��@0u�
`{�@u�<'O�а|���T �qs�,Bt��7���m�	�cx�Χ�RQDHCRp~i����Y��Nf�Nb��up�W�Ѣ��0d���XW7�:�Џ����5���ұ���s�
��g��"�� �˖���ϰ���c������l؄M�E�F�A�����)K	�T�~|�`��¤S��� �1��}�(##L���N�g5�8��Ԏd���L;H�7ϓkV7�f���d+Kg���"*�S6!�eE�dDэ�Pn�(��T��Q
T��l�1c�i>Ck�(Xe;�{��F��XhYI�[S�����l	$�Za��EI!�]Z�$79�-1<�4�;Bf
�4f��-.e׀�Z7*�A�tB��<6�EhX�Ca*���*�4>�J� 4��7�2p�ח�� �����t�Į,����Ƙ��s� sgX��QZ[e�ڔIf�2%�*���֤}�$���5��Z�J`U�G}�%�����
��ma�E	Q�Uڝ�MqmP;:߲����)�G�-BF�<����3���P�-�cqF�?�)U�eY��6ߙ�
ަ�[b���е����G4�bMqEF{����9����U���p �IOI����L8��A�s�O��158nìss”X�r�9A�y��0��aɅ���z�́���*�&�yސ�:>8���N��?�	`1"�O����kL^T�J�#�m��n<+�ʽ�(g0l3hC�w��mA�>ʍt�8<"�}���8�	�q�h�$A{㐄��)+���������N&�z�!�IN�**��1y��o/��\��	̌�4_ӌB�zc��B<��_L���v|��B�uh�~�����B�x'd`���~���h���-i�3�q����ú�`��oRZ�����k'�1חRӥ�4A���q�Ϻ0>��?��������q��%��I7�8��+��[��b(�>�PU8L��E��4ˤ1G�/�(��3\ʘ���%�]$ L���"x�M0{`�A�&r65^	H�yee���خ�Z��&
B�
�q��$�����/ ������֞c�&,cL��-�p�4s���~�\+";����8+j���`Q�g��Pe;�/qƲj.�u:� ��k�*b���oC"��1@h]�#A]~=��~�v��}R�[b�h	45/k�21�0���=X�D��pI��A{�8㷅��j˭\2>?P�@���i���(/��2$w���@���ϡ�p����hzA�BK����Ԇ
y���
	��IUa���M��0MCƖ��j��4:z��$;��!l.���,�s��p}C�<�V���r�KC;_,��p�ʎ]�(�-:<�-^���4o��qe��LO�}lT��|lW�5l��O<���g��'O��G�r�D�<5��:`ڏ��=�*��.J�\�v�Fsޔ�!
5�"'�((�y��i:��$D�"�$��>�xa�u��Ҁ,Zl�ıq�)¥���+\6�<^S��?��s!��Fb���;�dE}	��.��m����%b~�N��jV�G���7,%�d�d���Tه~4
1��"������D��@��k:$�)�/D���K�U�W��䉒~O	�dp�M����Xu@�W	�3&\�a���,3���'��VY��[b��/���� ē� f��t�}�~�G�$ԛ�J��Tg�5��M5�^�����L������G.��R?��޶��� �� ���a��&�������p�]Fڷ�2>�g��{C5�`.��'gHY�X����礘N&���M���Ss	Yy&MT��s��nV-'�8ĭ9��&[,L��.i�W�c��������A���($�p�l�+z0
�d������ �P��D��G|��y��8��0���\��Hs�2u�vp�ϸ����m�Z��!')�V\�@�M؁��,����ش���ް."�(s-���1o.M
Ƈ���j��:R���Θ|�'�r��`?���2	��x�ie�;3�|rZ�'O����1�d[�%<HO���-�ϫu7
}�"r��eu�&='�-)v8��8w^���l"��p��3V�
�)���(�����jA�q�~{A���w�ꂌ���:h�C�ջ!Z�[��q��X��؁ӡr�4>��k9�Q笥v=��ԫ�\��<#�D@����J�Jթ�"�U,�Z% ��@%���(�ov+wS��}B�;�i���5CU+-*NЅ>RٴV5���,�Ni�R.	�;���;W͝W��ɧ�l�,Pv�����L�ć��;��"�DL��͚�ܧ0��1�Fl��$��&�L��4Gj��3�}p�a�ώ7[�'O��4X�)�Qx�t��eMZQ�n#����'�j
L�@�K:���c@�ƻ�i��S�W����Rry'+����O��]��@�,{��uL�;� ��U��Ǽ$ӂ��{�Ջ��SiTe�%�	H���Ux	
Ս�u$��
*��3�ѩr��Y],WW�E�!��v�Jª`�\�#Ђ��ʙ�� ��>���2l�鉹��:"�u}j��d�7�R�#�V�3�X�ֽٮ��tm���xU�w|S���,����)`�-x�5ڪ��Ιr}�?̇�ͅ"�6�w�w�=:���'g�M�a��Q�8G	ϐ^�O��V����8�8�7i��g�O6D�J�/̱�/S�����VW��{��Iu�:�ҷ���\7�ku]����'��:��]�b���D\?���t�l�ѷ�[�������¢R�c��<{���H‹f�%�k�N'�|�,��	�aPҏ��� ���5u�/6�@�#Xh�#?]{�1�q8��m�`(kr�9��ȩ�X\w�Y�����'.=^-��eN���0i
��Xv�t��y�\�E<|I�y].�E/f��v��rK��L��ļ��ﱒ�w�Ϗ��D]�����=2D��u��׷���A9�������10��"Z6�y.'��FN2���1��K3�3k�T���X�n8���e�o�c���9��"Q��4U��>�x>�Œ}��
;�0�I�k�z�I��a�餳�vu!�\�=9w�F�&�80
ȳ. 7Z�ކyQ��N�'��k��q�}�3�&�f��d~>�.6��.l��� Z��5�И���������@��"(o

������m�O��d����<I!v���u۔C7/; ��I��b-B�"�2�A7Ţ��'��a �����|/ib@��׸���(f�\�<pm�'��/!C��4S=sNE?�0I��ڸHh8����Xe����F�q���du$��u�j���ݷ��djI~�Ԅʓ��r��Ԥ9'}%��C����'�&8Į�:�>��x���v⠜3��z�c��g�[D�,�7F�92����-�7[�6�*�tɦ��\(�트(�q9�'؟��1v��jXB���U5���3�M�yxMi4���˖<�@$�7�e~���
>��`:y�=c	k1��ߚ-���"a(��5uy�~�2����G��]�u��\q:�U�������C�w\�
��V8PiH�6!�w�0g$�E(�G�
�6�;�
��9��KT��!0W0���՝���@|��&�nh$ߝ9{��a��$	1�Ӆ�
��Sc��!TRt3욒�:�r�pV/�hw��v���]b�YtU�{���V7�o����6�c��J&�d���8D��A+_��z����f�{�����Iē
2�.��A�dH�;�4�!V]D��:�/v{`(@���u�:ҵ¸;8�C�jcI-W���|$o�Pe��V��}I|8�k�M�Պ�'��Rb��q�'Cf�t.��o�cT޵�м�M-8c��e1� z�b�M
�[�]W-�Ā���F���$Ǚc�V+�oA� ��=l��j�$�TEQ<��#-]�dq��s6��഻(^�c��^L��-Z�F�Xv
n%��aU�\`$!s?.�`��g���u��r�j�ޅY�i��n���ȉ� %����~O߄����	H)6�:�<���dS��ݬ�h��A3f����hh�]7����CpÓ�a���E���E����W+r+Vg
GGg�u���Yj[u�/l
e�5�r��k�)�F��G+��\�i��P[�<L%ѵQ��o���"��\<��[r"�hW<��C\�zف&^�T���
1IQp��L=��cN����7^ZALP�Œ���ؓ��roO�h�g�:6-qJ�	���'���g)�`�F�C&ߓ�w��XE�<-;��VI�h1�5ټ�%��Cُ�ő�7O��}'p*&O!
z�q})!�
d*R�p#6J�R#g�m��K@����tQ�����=� ԓ�K9����9[�U�Ѐ��X�������_i�9	��@����2WY�>X���-��?�z��{pP�F���!D��T'�*�����-k�S�/�Ċw�2ŝ�#�^���6�!m�
��OB�}���pI�X
���:�Ng�d�Fû`��H9_ڈ�rs,��s�o��7��#$E�02���_�?�I�xR�LB2cԕ�]Z�ĺ+b�5Qg������������YA.����Y�za�{��(�-��c�(UT��q��x%��]��*F�+�^�܆N�&㽢�8������Qu���)<Q�C���҆�=^���֛ꦌ�-J�Y�q�i�p�?�8��uQ�)���J�A�g����޵�9�����4].Q����,ʩAa ��a��"�8�$�c���� �uuY��rB�I��I*y?zHd@����M�R��wjP�ȓ���Qw�i,�3͑!�hN�p��X�LT�x��{�4�I�B�'�j���1��&���p����ڛ��WO�'Gk�-�>[믝P4���5C3J��D]Z�_=׻s{�J���9�32'E�.�$K���ߟA�?i
d�u0�o]�������H�l5)�.�u��M'N��E��\��qG��y����_*�N��60����Mk�p��a��,�O�����~�:�3y��U��$���C���j=�jh��67�%|�Qe�k���%��
���3�\�K��%�"tny��w�i��%)g6$�X]oߟe�~�#��p��sU92��/r��\_�ͬk�6[�ӌƔ��ꚬ���*�_�zUԗ�="��r��ӿ����W�I��鳿��Y�}��4ag�c��V�h'����F���;%9l(���|�+��=��,#�	�@,�����4�6̉�	yB�
�Q[\�d8J_@䦍��>e�2�XP&`�|1;�r�@�${:N�em�`%�k�h��c" �=�Qx�Fm��m{F�ٲ�D�pD��TA=���Ğ��O�
���8̰{)�]�}��Ì�A%lj,��V���W�
��24����5�C��堵��nSO��EQp.;����e;�\k���*�sv:eE0_HŖ]l1�H��ǒT��f������e;��h�b��z�ʰ"�z���l�k��)�t�2-w@��-��$e�f�c��q��F�'���b�N|��>q�bhz_x��Š'�ײ��XY�z=��m�('�r��?��ٙ^��Os�{I�Ο�,��o04���K���ՠݼ��sJ2�E͸@�1���G�#m��Ch�6����U����u��ܶ�*�xsl0�E���_��0��R"�([X�u���-v�Pγ��⺗���]�ͭ�!�_����PfG���4V
���t����t��z3��M����ӵz6�����<R�a����]��V嚲ċ���%�±��h�lg��{�7+h��0:d.�V���B\@̼��p��q�)Xm,��P%�G7Xl�=�.cc�vVxn׍�_����N^~���_3Z���_ޜ��t�^v�h[>��Pvb���!MO/�K\CM�Dx�vA��T�OS�y��lR��E��K�r�	�&���Ӭ��b.ɵ�rT�v"�CFY����!,�}7���c#��5��t�
!�1����s�wm�p�4�$��T�F�� \�n{�K�
?-=�X�yS�_�.��N�Y�6W�ϴX�=+��M�ݹڥٌ�T<{��������&��ռ��w�����ڱ������kc�K���ν��ۺ��d��>:�7ͺX�F��`�4�{d)w���(�dq��v"��!�T��^t��=����>b��Mq��\�VK��w��4*y�Uq$j��G����/F@�5�?�pv
���3��=�N���o%�<1������v+�o�MC0G-�~IN���D�=n�U��x��`q����>W8���8�L#��8E��(X|�9�t��iL���$3m�?���;ס%��n�x��]�玎c�l�*Ż���[~�=�R�ܬ?{��B+q�x�ە�E�Y�Ş18���a
�i�<Z<��&�!�m�Ͻ�W/�1?${� � �N��w�UK~c�����R���W��HR�0���b]�HR��.}���~�x��Ubڂ
:_5��	OGJ�݈YWδ̋�LZ�ԋ�˞��E��ɹQ8��kKά�F�{��x;/�����qb=H��g��L=��X���2��]�E������ޙ#�/X�t�p��sƥpgQ���7�;=�ė��:Θ�(�j�DcJQ�	p0
��u��Q��Ŷ��m�1�.�f���ܲ�g�#m���k%ī�^�ܬ@N]n1�0��y�e����^(�s:LK�#�2������Trhq����)6�s�[/
q� R>M
�3�or�;��1I��D"�����F�b���S�CNͮ׈�~F1��N�Ⱥ�����Z����e{���Čz��<���t4�e����"�G�3��@��._k�e���-����ݡi&�jC���%1�i&����l�[�"��$(J
*��s_u��J���Nyp<H.ֺ��B����/�zt����Oc� �tM�S�d�7‡�OU�R�e$�7���^V?��Ӎ�aC�FmF(!k,�w�`y�D!�m��֪��W~.�I�.T>���_U�]X:���5�#A��Ě���d�
b-V&N��=L�tΣ~o�:�u�$�w�<�y56��b�$�z��&$�l�^��e;+VL�n�����I�R�0�#��Âc��Πb<�pT�Mt�9��cD3�c�����GH&�R;�ٞL�r�d>sv��4�8�=ow��p�m��Y�;kD�[�X-�n��2��.��j�#�a]iu".|ߒ�v*�����R���N����1Z��D�$�F�S>tށ\}�8E����ζ�j��5��ʭ��M�N������x������=4OA	�F�ރ�^��>�py*6�zǮ�n���G⪬������>�l0&��(//'1��3����w���Ʋ����r3<�~7AJz"җ�06��@�+F�����ztg� �i!�^���/{�
~��i���m���&"�o�=��n77y������.�8��|���ÁN� X��}vV��1fv
4
O"=0I��I�g��9�9w;+�u���pml����h��04[��������d��W
�&R�*���fl�v�8�àc����sj����X��3@q ɴ"��J�!C\-v��u�D��@V/kEh�q�p&瘻٭�����)Zx��I6�A����	��ԟ������
Q4Q#&�H�{���vy�Q�K����>�����>�t�.6���uQ�����5M�ɯ�h�o�<ߓ���3���3S��S�2���>3�5r0��ڇ��S�Y�0�T�GFef��t�	=�[�g�/ԉ�]����倦]�d—+̌3�&>!9�$�%���u~X�P#����}e��-�Q�/��y�����)����a�8N�U�'�L�i��o�a��m͊�I���(����(���l�nZ4�F'�bA�J
M��$~�����Y4��)�gL�8{4����e3���L���n���j`}��9.e�:6@>����KX�yℊ`%�t�9�]�Y��Ty�oN4�x�@��
#���+�i�a�h��ǘd���%�勄��Z��Q�8�cx|���{a��>d=��>�uF�Ԏ��ü��V��̚���_m6���Ç-n�i�e�sI���U�ò~�N�����қ�����&S͎��1�{�૯�"'�"�՜��@������M�߅��;%�`�b���MYUC�Vǟ
��yxQ��͇M�AC��arP��G�!ݵ��v]���ta��̱b/���Ct}��xرӖ��r�������o�o���nkB�a�?��^�wk����tx�P��Pd�[Az�<�������,�5�ԃ\�"<z��f~��&F�����eQ_��*!�ܤ;����WM},���$�b���W��S���u��?ѠǼ���P�EV�8��'O(��\�lU��o�/D�7�7qs
��-$]�1���=c��ÏÇ�z�O//�E�j���p�
Fܙ���M��^0���$e���c"[_R���ƺI�@���e0hw�Ų@<E	��� U�pE
�5C36��a(l=/W����Sg��a�%�����<����kV���F�
|3Y�A~ċkmn�k��a\�h���ɍm8�߁r��xG�p���	0Yi//��0h�L��{��j��K㫙NJ�c8��d�=%�kh����l�"
F<„c������K�l�^��Y�H�����;��^�����������m�^f�C���Y��d_!J"q"�ճ�o�f9���9H��B�:�E@*����b���4V!%Ѹ�d5����pp������_�_������M�Qw��o�Ox:��?r9�#�K�������ơ�A�v�&RQBg���b{�x
B�9�T�{������/{:�,aI�mf,V��W�	���܋8�A�Q���Lfz�
& 	b�Qi�p���9�r���I6xKC�3���up�-�sB��m,�p��fFI�����eu1�)0�U�����!ZN|]dH�||��8	ytr��2���5g�ք��jƜM�������̌�X$��je/���y�y|xb��"(0|�ᰚ�D%D�D~]�=FK��߫�7E]-pR%~�Vx��Av���Z�˭Xm��u���O�*���V7ղX�z�U�sqt_���۰u�\dTo��6�S|��3���!�f�5�0�&D�1oVp�V���j�B�Ue��r	��@���U��6�	G�(��M�t��C��@dB�
��#r��̀�a�a����A�_T�h_aO��o����ZSI�@q�My�`db����������u�܆�8�cS�"��J5�fH`����P�������ߑ$S%
#fUv�&�ӷ7t"�}��Cgt��$q��(B|Dqxw�7�)E��	8>�%
%ԁk!w�
]΃s<�Y�1�>���p��%s��+~&�&�k؟	iפּ�Fk�	4�8Ԃ7I<�_�0C��܁��l��&��� ��y7�#]��=1.H�6��#��Rtȇ��X�)������UU�Z����#M����'���ڀGjg�`�c�‰�K���B�,�j���$93��;��c��i���9[*����0,t?m[X޴�XmIg�K�w�'-��>��[���jJ� {L
�w9�9�PĴ���B�JQ$��j��9^��0�6+@�O�`��N(ST����gX.��s��b,����3ތnl]����!�)�ŒJ@Yrw�D����2���6��i�hպ�q���C�{��&�qL�G/S{q�̮�(�1�����8� (�9�7�M���gDt����#�fW8,�8p{>��!���L��?���C�<Λ����ɤ�N4wr��k�_9�;r�…G�Ķ�n�'��!�rjl�vw3��i?�� G��s�F}����f�G�p������GpJީ<����cu��G�=����rg��c�������N���WN��� )��|�7�fg
 �hM&k;�K��n���L�Pg���ɑ[� �5�*LQ�س�L>��+J��"��3Tf�-�� &s߿y�������߼K������
4���D�o�eU_�\��
�k�?W.W�N��$��he���,ٛ<ʕ��J��$DD(���t�p^����q$Y�h]�n��`&
�G=��5j(W�{#�'A�î�	�q#�����os�c1�$-#�JǟbB-�4|�%���gC�����������k��u�y緢�I��v�����T:}��G�9�!��)����[���YW��k]4�˴���a�0-����g�K
4/���w��`�K~EyţE��g�a�yϐ���WO�c����r��
��=^�����x�E�})��B��D��b>�OV�����*��c�?���A	��|�($�e��冖aB�$dt�~�k;!n��РPC��zF�;݌��=z>���� �+��j���������l.�&��E�+�r~���|$�9'vf��%ȜXpv��j�AMB�dY]�����a��(�$�]��s8��29λ�C��df�'&)/�+sh�	�֮/D�����UL"'��#��a)J]�s���]�Gyb�zb����z�*�%�����B-�О|H�d�ԧ�]E����<��Z�����Ɵ�IZ�~�=�!SO������.������oj��Gom�h;�x��������i1��|�Q�s�f��v��,!�܇2���B϶�@�������7��@mվ8�XM��y�Q�E��s�
�F��
�hE�F�f`��J}�]�����|m��b�U�N��}Eأ���[��{b�4�s�y��p�<T0�#:�l��̒d���@�j��8B��1g��U���b
����;�I��8o���$�G	M�^Y�^�E�r�#&�WDĆ�~5i�׵⌡/�z��Ղ9*>�>��r'U{^5~Ge#nU���a��G��ܻ��Y)�Y�'f:ff�=9�a��2X��`R�[��
�v��U7���0���^�`
�Z$�g�?��Q�If��`��m����{`�ip1��C�����>�
åh��ks.���?��-�/a,V��,uG�{߾���B
6;�$^Zv�`�?,jV(�)��Q��&A+�"����2�C"����ڬ(US�K�gH&���B��>a���T7aw�X��F)��T����7��)�=$���a��}?:{t���m�)ꓺ�nO\o�����gV��}��y���j
�M���{�W;�o��Q�;WJaFja��T��M?� Fo�`���{阝���Ћ+��cQ��{��[�⎓�0�O�7leZBU�3�����>���;A����m�����E�[�`��r/�]�'��cp�b\�cxѝ�[L�/A�!\�V7dP�{�TA�=��M��M~�Al�8K|m=G$��4�l��Qeb��բ����[:
:v9��sA)���9|�h�
�O�ڑ$N��%b�
�
�*6c�"DN�*���t���ۘo,�k<���u�.	�H���*�d��0&�j�K�LL��I���]5��ޞ��m��l~��;��59o�d��q���᎚B-X�u�@Lu�n�ȏv���l���BBz��V�i�BߪD��L-�|Fv�x�"Ѯ��x�_������_�b���@�[���㝥7r�󲞳�� ��Z�������Of��P�q�M�9H��V�$j�%�IH�!8ވ��?�Eio�p/*�1#��y��L�k��-͆�\�h�����ųfز\O89-�~�t�
_ܭ�5��P�!�D�5�ʐY�w�gT�e�S�����2k!4[�� wuc;w��E��X��0�H���A����r���>B��NB�lN쌷�T�O�t���Л�L�w���{R���]��,X�jr�ӄ��!�3�=��"��Jn�)����2(#=����ݬ$�b�Uno.0C!=LjW�qQP|Ƣi�I4�p���Y��3z���:�'H?�yw�o]������������1	!Y��m�C[���=��F��a_l�����b�!�Lo�8�Tu٫�����2�����#��.;j�z�bv�u�m��cL�rߞw�>g�\���$+�Hl2�
�PCO��
=���r���݉Y<^�ky��܀Fhy�{s'w�g��N�Jy0���}n�[�[�����H�L����Ҝ����sq�%�m�bS��6��
0�pc�gW��%@��)���d�DZ|���T@z �o�J�J,i�i��`_�e^r��0���߬�|�tgY�,
.of֌�Q����
������T1a�ĉ_�
��t�݁�����`6���Γ��^s�)��h��cx)>��(��]f_������B4�v�Ī��߸�Ӵ�̍û��
o�Ր�:�n�[��I��
�7
D-�oZN�l;-�A4��]�~B^$x*p���[�Bn}���F�f�)����D_5�+`�����y�c.M���?3ё؄����p���T�x��F'����_Ie�%�*��d�GO@Y=�@��.��j�F�{8
R�!��r<ݠ�#��#����X��%eP��@)ol։=Y���񝘘����١0����s%L�,5��~��~�����5[M�ޅ��A�DZ�K�b�V(�e�`����']T�X��ZM�uH��/^�~���2��O�={����W�b�d�;��L
+����RTfs�%���I�-f��;���gX�CI�F���/f����KX;2���bNr����g���gb��=��)���A���Y{]��9E%{��`�7P���M{��&��S�NJ#�Wab��=+O�����ׯO'�_�}7vw�F�G
�f�[�0g�Ux�!+�mb��0�@lܥ�+Xx��(t��?y\Zw����r�;����Tp&.���܍2V	�
	��Fq»E�����(�fЇI�rQ�E��ԥo���,R���!׳���1
��I�r�-9쯆݋}�+�&j��rJ�:Vחm���Y��,"+�G&eP2]��ӟ	��WRf�������ruN������K�����46�t�L6�Fd���y�k��&1��H���c�Z#;Q��E�Y	�^RW1>��S��pi0���\a�pY^���}&E=1�R�K���)��v���E���5E���Wa�Z@
��*Rn�j�����d��MO�>���s/*�F��U����K
Q`H90��I��,���޵m-�	���Ӑ�%�Lפ�i��N�sB�,g�7Z^py1.���\V!.�	�lī����8��Y��i�2F��k��ϼrۿ��k� �ͷ����1��+����C}��X�tJ�C����ݜ���m��3vQ�H>�;�[��P�G�sUU�J���3���Ϳ����{�Ӂ���c���}}��2)�&L�^4�
ó&v�á8�8*��P���N��1�v�Gl
�ƗR�t#8 6��|�b0a�@�G��V�-J$�$N��_��,�|i{��V1�9�@i֕��(u?�w����T�҄\H��p1J�m�G���u�f
�o��&sq��*Xo>�>ᕺ��%t��j�n&7��
A��YS�V�߬��5�' أ/>{D����?O�W�q�Ns۩k(r��隂���U��	e0�&Y���Mm_iS��FK5%в��XEMa��L���G8���і���3L/PR�C�h@��crg�Z'v��*�8
�R_��.�
�X�q"���;�S[��{�j�%f�1i�F1�w�ϞХ/S�r���ƢJ��Qπ�S�\�_q�a~``���ǎ��?/f�2Ao��A$���PX�����`�SG�[�(FZ��@���y$o�5b�+!a��?�L�����#9��
-��H�Ih2��L�_�1Թ�E������#4J<L�|��4��{KU}�T/����%���DZ�G<2�e�]a��W&N�F������������J]�w�37���qgu��?b�I�j._��
�x����8Eg�T5��������0��nF�ǽ@�o=��|Jc=�jp��]%ǚkx:Q�F+I���{�#����'di1�p��s���JrC��fR0�z�t�1XB���
�G�w���l�>~Sa�۝g��
Sx�٪�c]6]�����RGɎ���^M�܊OPZ��n�y����84��o�Zm*�}w����=�^�T�qP�7��[�`�@��eU�/���>��V�ߤ��'�S	��j|�\���VE������^����(��+W����C�2�@��s]aE��v
�!;��ڄ�X-�)�1��^qJ��lwy[�uf�4r&ƞOȌ�..o�'0�Y�>���55�]���ۗ��}����̞=#�c���n���󑪻Z�nPm��<����:��U���$(��H�"�ٲ���*n�=E҈�!�=
=�%U�j�\�.|Qn%* z��'M��7�%���oS��]`0V[]�Z�gwt�n-��#)Iy(t��}@�;`ɞtȍ�e�OPg��{k�H�͙+��d�Y5
47C�Ȧ�2>�E�G�@�ߓ�]��y�A�lM	5.ɰC49�b��͙�+M˜�E��D�m��dkB��#�Ɵ��Q�w��ѽ9��&t��#4��I��m�%G���|�"�.-|je]נ�uBl���}�D�PS�Y��Ȩ��A�~l�$[���ı?nтf��X����_����>'?uRV@K^3V�ᡜ��|��:��B8��Cp�C��J��6-��(���
�m���1�AG	Nt>��{�|�_� B�k�������ΰ�t8�9U`����o��|6t�<��_�����OG��+�Z�o��j��)�0��@�U�i�z�ǃ�W�6����͟^�}�����/�^�y��������C}�)�����k60�K13#�(��B%�"dWc�a_��U����U{2I){�m�V@dB4�w��9����o�QD��B7�a\'��_a3��(�5���SuM�Ϩ�D����_O�����,�'�S��c�y��ȍ7>�X��	wu4ѷ���`dg����`l��SV��N���_��c�8Q���[)�N'�	!@,&/�q��X_�|���U�7^�v����(���O����b$�QP�)����+���>-ְ���orJ��z��R*�9���E�u\�}�(�I�r���3���&�n��D�+6}֗[��
P�hVy3����6ܘ�hs�����啡t�d�_�~�S���j���7֙�R2>yc�Z��Nj���8�%z�����ƍm=Ӻ��-\��K76���<��L�N���4&�x��YX@�7�TY�?a�!q K��R=�(�K����nn���P�gi�#W#��y�_ʍ8=зģ��k7���xX*J�C
����cS�}_rP$��+t�N3̀sɪ[�oζ	�Ij8���-'ݲJX�p��{�q�kԖ�VX_u��:��,򔊁S(����
���0���̎��-�\��@�y=̹����Q�In��_Kr�h��w�A�s�B9G���W��c�Gq� �u���~h��)���q�;I��S����9�uq�'�[��6�?&����,��9����JJ�O�~_�T?�]��������^.�OD�)���C��4kw���؂%ٍO�D��1�{��'�;Ξb���c������M&����pb ���#8�?�>!:8��w:�~�sx��#����D��,I�ELavy��qK��TI�I�d7ۖ�ހ�2��%��+��'�9LPİ6#m���e2'�G*cɿ0�8�	��n1e�ـ�p5e`�5�187�����7���擄�>No9�����eŽ3����P��`ݡ��`^&��`�?�d�x�'��򿶗�k��alc�7+�J�QH�]'��Xy��똥�te�2���$E��-CQk��Sϵ�d����V:��F}�+w�p�b�m�/W,�U���k���
Yb�2�nUbd?�g�u�&
�3nTw�!^D���
)�֨���_m�Q�(��&ZQ�$t�Y��I#��Í���a�2]b�-jR�^'j	q��`��$���԰W����n��u��6˂����;����e5-���ݾ��K{F���9�=�ݜr����S6��1Y����i�� �.�<���RLJ����z��.xP9�!�T�*Ln���@�#9t��(��%�H]��`0��[��Ɓ����D!����
!)2��
ah��9�ǭ~`�I����1M�Udc�����C�:��jݘq4�T�Ӻtf����Qt[P��s�N}�	n��	��``�N�=!7 ��� �u*�X}�FO�HW��m5Šۧ��@�P�8�zY��`�_8G&��5�H��_�2��46�dB��3�B�(��� �=
@Ȅ��K>9��䛧��+W����F���:�@M�Fα6�,�@��0k�f�H:�Nt�ځ�F�7�N�Y���5r�@�a]v�,=���uq��#ldu�x7��x�`6���/.Ae�Fm���4{1v��fm<��#�8�d�w|G=�(�A���BI��X�
w���v�(��F2&�3Hb2j��u! ,Ƥk�8��=W�%�	�@��c�bI��ﴍW4>9�� ���?�����/�<���"wv=ta��U���BiWE{5�Y�|�%�|�lj�$&^^���i�	�(Շ�0H��&�7Q��T$ξ׊�/�Z')�t�-Wt��$Y�O������R�q�N�A]~ܠ�����՞A�?���m/�P-�4!�<�t"�^:o��U �Xv�,v ���}X�#5��=S��\Ub;0q��
8A�p�����R���)`r��f�s6�z'��m�h�p[c5r��ci��(�<ˆU^�c΁Ѝ`Ŏ�����(ߠM��8�)�[������b�N�j�\
��C�&����zFҸD��hp8	?:�&�V�i�'mt�;�*���8I���,f�����s��y�������4�����(����A��gp�}�E�$��H7�쪮f��E&������eU����<K��b	�+D]��bc-.����~CQ
U�Z��y�ۜB�*6v� Rc��J�'QZ+Q鸢��l�}�V.z�J�foo~�-�ev�I�A�V��ER���&��2,�����T����-�|�ȇނ������V
?ۣ�K6�Y��2����%J4�Ɏ��{
���MJZy��fK�r7�9ZQ<��8*.�f���U��s�o\i�`������G��.���maa��iΥTo��5mN��Q�/����pH��#��}��j�h3_��	���z2����|/����w,�݃����:`��
�6T�ZB��q��rXm`�V�U#�-�����q�
��<|�z�쪤�d����d?��y�^#ݠ`(6UK��i#Oh�6;\��������><u�f��
��[3w9��(��o�	}�f��!AB7r��q���>�_�/��BL�G���zu��j��A�:�����7=�)^܊\9j���m"UEa_H����|��Z75y���kJQ�Eח�7D���o�B���n�H�+����E��j�^�`�$p�F{J��r������i�)���э����ĵ�_pM�Ǻb��?�C��dV����i�!^v8	��BT�ή)�菡{l���3XKlg����v��a&�щ�M�ΣF��:shI>F:���+c�@��ԥ�R`���ᴻSfFے+^���8�'��-D�a�+"�
�wZS=��=_��<�������C�Gf^�̔�3቙��
!���zy��ne�^[������M�ngWBheA)J>Y;�Uڊ�	��e���S�g
:Ez�5�Ρ7�u��U���v�cuɬ#��M��eMmˉi��_�kW������պ�^J2ҭ�P��r�L���T189
���a�Q�bȻܘ5��Ie#�����L�Y�_戾�%�=_3��=򋃹�P�"��s�#T~�}'9���/V5/AFݜ:�:�)&Q�����$�n��S�i_��F����0A�{8h���];+��d`�cD(S�H�*"9����H[�@�5W����ĉZ
G�����
}Yh=��>{�h0�W���PH�&��;��b��/}5�`����
��-��.�mm5�#cdW�jz�
�C͵"�s_��X�AvQ\���H�c��j'��]���]!�ǝ�������\�.�~X$⭖�c@�1:�����%u��b!�ۮ��W��vd���:�,ԍ��D�\y�\h�W��0$�kL���xx.'X�����ٖ}x~�5.���I�F��DoR������ZN`��QctYS��j{��f�	I�$�坲e����$>��}��1u�%�	�ҖY�is�k5#�0:.�!\� +E��>WhQ�����:D���)���H�g0Z����8�^=��O@g�?���"J+_z3(�dx��.�]N��Ӂ���j�M�}yx�?�z4�f�5�<Z��U�Z���(��ԈO�)+�I/�!�0-$r����)[u��!J��X�*g|�����D�ȥ��P���#��[x�
 _�	�:
=W���cdʑ:
�LA��ҧS���@ ��S�!��#�������Y���
7��� 
���w��A�\_�()����#T%��P��,�]T$"9��!�>
t�Jξ6�+�E�ȏ�k&�WNI�����hG�D��Bi=x�Ndnp��������F�]"<�?"�Ʌkv�SFsڰ�G<��m���O�?�&adWr�t���\�[���K���XI^.B0N��H�1���4�N�i��-�����IM�<�C�0[S)G�G1�!'J0u��џ�T����@��O��P�N�4Lk�j���k��<�:�{�%i�%Ɇ�轴����rU]�>e���u�ٱb������w? O,��q�c7KI?�o_��n
�|i��Tׅ}`�NNZa�ޒ�B�o~�V����~#.�E��Q��'�+���@�r��CirP�=��Ze��)�
<����2E��uB�H���i�'ڲ?]�C�n%H��b�h?�T@n����b4W�8�Ѻ2�dۨR�̛���O/����sw.G.g��B��Ѐ��S<8aŨз��~�:�0E���Y�Cq�9��0�گ�Y�/"(f,E g�'��I���ܯ,�Z@@�ٵS�͚z�#��Gr�"���궩�Fu�U��]ܻ��?�}GŽ�QbR郱2	�;�t��VZ��]�N�q[j���@;�С�}\��r�n��{W%�25ru�'������4���I�K9ҋ�+#n�:g�K���wݥ���g�zv�G�E^~'��UE&�#��V��.�W��5~X�X;j��Q�riW�he�!qF�4K��Wmf�Y7�X��
/ �jTMu�iV�
�R�"��%k���f!t�b�������8����p�k@��O����^:	{hM�-��45�:q�Q'��5{��� �
)�-��,j�8��{/T�nK�������O���p�7R��\?i9�9�:���]��FB�,�f+��-����cV���}�*\��ok�M ����!P?T���[J�L�z#�5th	�!b[�P���]ʣ��^��j�%�N�g��Vԗ�@)n���r��e��n���icUpNd�� ��%�����u��0�Ν���~6P�3Gz�>)��Ғ���ϫ��l^���u�P}��4^	���Rvy��^4V�(��=Bg��.�2��S:L��yf[`��@
��jG�̬Z��y�;~v��Ĭ6�e��Ѝ�+��+]���6,�)0ǜ�ǸO���g������g��Ǐ�G��|����>�쿗Ei}��뉼���%�X�N.�iw]�T�C{���b�����{��
V�ξ�f_p�h7%bR"�R2���C�Ϯ_荁Fb�wT��'g����瞊��k�?tҷK� ��>X�ý\,5�����_���-�`d3�͋wO�?}��)ϋ����	�g?���f��<@yp�g�F��޳���8�^:o�<#<�#{i�:�*��٧T5�;^�����U񦨖��]�4ئ��r�0�W4��5�q�?�A;���_���I��r����H&]��y�W��Ϥ������I�y��t~�t�c��AQa�ʖ�b�?�d�߄Gp�b�i��dH�tv�׏�~�ő1
��bKNm�Yo]$��d��:�r�4������W��ß9;��	�_\.����C�(	��@�*k��F#����
�D�j0��t��K�c�O�ii��1��m����5iA��$��9eB@�边񮌲�3
�z�	�F�����I���p1�')fH[���O����I�r�&ע�6��02.7�q����T]�#����w�n8	$`A�Y��P?�{K3Gi�|J�k+9fZ��N��vQ�X�&�+�:ҰG�b"�Ŏ/C�}�S�#����a��p)���AZQ_���s�`�����i��M̂����72A@R��c;<[�8�_	�/���E�V�:�"Iǿ��:����lE6\5@./����|;#�l��=4���8�f�@nN�ZQK�d����MiX�p,Ru�C[Շ��t�lk�Se:ʞ�}�i
��F��&�$�^��3N�Vd߾�:��dGa�/$|��2�����Z�qy(��Nv��q�Ն�	Vfr�
�~`; z���C�p	�u��y2�QRKI_~*�cLV����vӬ^�^v�f���1_"59+N�
�����4	�S���|1a܍ܷ^g�^�˞=�����__�;}����o�y��݋�0�}��K�F]�����"e>�R2���b�g��J�Ӓ��E�Q�Ws�y��.ی�WA����4�i�8��	Á�ዽ����C>.� 9���=�?�džSţ��rB��y<J�M��cƶM�`H7�aj�Tb�Nj^�2��
-|�Y;��{u�%�\f�26����Ypڌ�$J��,J��'�C2�H7	�=�A�twAm�x`�nF�6��Z��1�~i���I��9�!�݉Á>R(Z��PL�F�?G�SL��ZC�|�*��bG�VMAʔÇJ�����nI\짘c�4�9m�2��3;k�6n��_5�ـ��b6�JJ���y��/�j&E����bP�����<�P>*z��.�Cȓ�R�j*;޾	�dC��:��ēH<������Y7T��q=�r~L��L���+��J���sL�'�A�7y��
s�),��\�:���fxj�-
�y!'��b�掩~��	�����ȴA1VA���h�@$��>��#
�#�����}�B4��T��˳͹̝*���U汥�����AWL�b)?hgZ����)_�>�	��_�РJ�1��4�z�x�.v(�L��[8�͇cn���h����`��o^�{1y�����7��C@_328�y�\��г�����D+��������A��,��K�l��^���ۻ.ڴ�ͣ9�e��_t�8,����7��#q��'��5[�o��@����(�I���vUb0={��t*m@$�D�,��e��f�axx&O�%�*.k� �7��h��`9D�f�	9V@���k
ҫ<��A�wJ�^�u�����)3�n@���sV�B�ۥ��(��!��e0Q(2[�Y�K~܆��iƬ|x���r��qi�âb{4�}��-:M�,IF|��Ӻv����'}N�SL[�8伥���k���b#�9�0[M�]e@�(���5�xs��<W	m\��/j&�[J	�7�b]aa>"$ �j+@�&-��8�Xyj<�eq�#6�a��v��r 0���������Hg|n�2\���c�� ���h��žv�@[�����YK4+�ֻ#�9P�Q
,qA1�^���.K�K�-�%0�lkm��B�r䞊���C�Ruc��2?p*����!;¡�%��`)�2<w}1�b]̚�g��K�IؚI�V�r��6�HW��X@��_)�WWh��~*��'N�7�[�
�x~��B�Y��D�=/��E�<9_��'��m񾜏��iۓL�|�O��_�
&�fpN�7�w~�s�i/�
�T~L�k��Dx�J�N�1�	��Fw,�
��� È�>]c�R��`렄
��@��J�"�tJ_?=}isгwȸnQ��;�#ǥ\,H�*��a�Lj�QyI��
I�8��:�}sM\�S19"�8�8�q��T�.������݄a�*H=�I<��%v$t�����x{lv�荶$q�l��g�5�ڼrv���u�Zw�7q�5��b!8ο��tCL��O�0-��VW��0��vu�uW˧���ݒV�yc�-t?	��.����k=�\P��H�d3����C�~������w��IT 17^�lq�"iq�T�H'`�v��})b^@��φ�8$_�fT�HL�jT]+Q��D���7hU��8�0H��)>�O���em9j�j@i��h=�C�7�����JqJ�M�R$���fE���d�v���H4�Ө�mir̢�@��5���-��Ԩ�F�6��]"#,�]�m�If�2fB_O��Zи�%8$��p��ܜ:��s-b���X!8&�:@F}�7shᙚ�c�z�9o����N-Ɍ�PK�yVSa$�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���+�PK�yVS�T��;2$pip/_vendor/platformdirs/__init__.py�Qo�6��+��T�ތ:��t[�-.Z�*-�61IH*����")S��.iSs��B�t:��N�Ia���TR"Њq�IxAKZ�����XRV�I銦(�\��!��F�JL..�Tn�e���ʱ3���t.�uLs�p���k!�@��q�t�ӥ0a��V+�
Ta�
��>@W���J�l䋿?�K�~{w����_#4��$p�Ŷ"�-�t�U�~���|���,��?(,�z�*�������=hOb\��?�װ��WFt�M��$F�$�ӡ�%IY�D��M`E�4�B���e3�����d`�L�k���a�n�?��_'׳�,����8T;rH��|��������~��V��A�Q�*�ˌ����sF�0B��6FH��V�葖?��a�Œ=
5�_���0�p�s�)pʚQ���C�g��K�EY�Ums9'�����-�!,%���D�9��X�=6&e�Kcxr����h�WtUsNJ�oN%} �j��2:�Eoq��#晀�( d�R�-z�L�Ҋ����'�A5����6l��j�7�$�U���0>ѱ�4"}�&D�~��)�a�J]��s�!�'h�Xg;QЄ(�mVyK��
s\�|V���7�0�h����Ѽ��Y�ӳ�t��YԺ{6ۉ7m
��=��g�]�ƚ�=ÚfSL�B@�\H*�"�!eH2$7�A���h��,�Դ�n
��Qdaj���cj�q���0*(�- �������Y�'r�^�UR�s`u�m8/j�д=�0݄��rE��:��3�T
�7IuǤ�V}#uH�gK�=^w��{����VÌ�
�Z�V����]k�=Xs�\gȮơ�imv�@��
�����S���yh�t1͙GC*���&�;�)��)�h(=�����)�B�;���KI�r�6O���1x:���z����SO!�}���w>�v��ڮ?���A�)B���P�m�Q�u`u�h��:$�3Vw=H��*��p:�ճ�v���˺��ڔ�a��ߪؗ����z���Ϩ�����p�?_]׃����?�i�LU]��%�pE�a�j�ϛP����-�
!�
��X� l\"��$�y�$��j=��E��u+w�����z��
��w���w�et�5xGھu�H͛��X�����m���:�#޵��CS��ۧ���m�;2��)w��I�N��PK�yVSV�0�\t$pip/_vendor/platformdirs/__main__.pyŔ_K�0���).yY���AQ|S��
!.�h������ަU�Ea�>�sϹ���i��ܒ}H#�_����z-����>�z��Q+���e
c��_�ׯPAF���3��b$n���v.��N��y�����ݴZ�fߚ��KP]��$N�rB��5h�L�CyO��U�s��Z����9�#�6��wV;n������Ĭ�e	��=���eI󱿳c_H��S�X��X�E��.�L�䤲o�b�W�����jcgZ�@:�~�c�CW?�కx6�g"}��O��̌ܶ��C��~��x/ň���7R�0mh�x�HLT��ncP�E`��C�ѾY��PK�yVS�	-�>�#pip/_vendor/platformdirs/android.py�W�s�6��W�!<u!Ig��I<�:N���d6�Cg�
[��$�q�|���&���Ͷ>�@�=���JH
By�YIڮ�Jy�%�5O���S�:NI��^#���{7ѹ��%�����yiA���I����h��|߷�+Q�����YFxJ!�N�TR8[j]�I��\�4I��c�$|A�T��NOޜ�t:M�ޑ{��VDn�Z'	�*NJ�V�`2�$>�.t���a��@�b���$�I��ho+)**��>e47�8#��h,P��G����My��DR]K>#
(J��hZتSc��"�$��`d^Eg�ʲitVa�Ȃڼ��TEgU��晴H�_�L<a���<3�ب�X��e��8EFe0�o-��})+��7���Db�w+���2�I��{��I
’
���p�ݺ��z��\�JҼ���	�MO�@wHY�Wc
_[�-��A\�
�hΫC�5��cw0���wi2ky?R6s<"���[�̿[���M�*/��c@,.�W1��Ŕ3�~$�M&�ρ�q��5ԑ��3���%�o����0�s�P�/ThV��x`V�
t��x������.)��0t�`tT��ՊhY���qt��i�ׁ��0����f�3���S{m��zU�Y{�5���>�yo��0(ɣb��g��:�z@lCwk�H�Mڊ��o�$�\�#>�+��yi0ZP�$�k��T�F�Z}�V��/�v�%��؊v���L�vvz|�u:3�5}�X�N6�ۡ45�\�N�=5����m�]���x��_��	��`d�n�c����N����p�������<2(��3�U�]A\�!�_4����T��&�4E��1h3gW&�7�
�oK�?�FQ��2#����5�g�܄%����mԗY�
C��TU�t�>�R����woM'��Jp׷s)���{m�v����Kͱ���0�o`{;a}�>�G���=����0�M��:���?0)��k�%<s6d68�F���a)���0^��a>�x���z�ۻ����/o�^�����|�#=]�J���c��ށꏽ��?PK�yVSj?�}�:pip/_vendor/platformdirs/api.py�W�o�6���~�Wn���4X�b��b��6-Q;�H����ݑ�ǎ�81Z�4y��QVJ[Pf"��4f�iU['~���i�sc5Kl�m�R�����nqW8����ܴ��]Y�$+���d"2�}���|)d���L��Y�
*�6%�A*Xk&�|�9p�a�fŃ=�³'�IR0c�`6S��,��\�������eH��p�pTa'�B��*-����n���������BËl��XUIV�S����KI�c5��c/��g!��?Xa����揂h�J�/��R����.��{}�P}&,_�:�M������r` �v_�&�tȸb���Z_9�U����V����N�}X'����>l �v�}h'���6ԉJ&
٢��^�p�sp���H]q����w��P��,�
a+�K�Xז�l��Ƶ�ͅ�	�؈	+�f���Qj+i[�ʊ��E�i~�C����J֠�`ۭV��V+!�.8�D�p��u�^J�
�-��\Z
���LiD��j '6��-�-©�6���R
g��aJ;�q�妔p�k	B���"����ό�O�>�V�E���L{W��}S�":����ձr
5�҄�A�M���u�o�D:e���
(�
�V[��3̜3Iw�C�<AB���o�J���l]uQ	܆���D�Mț�w+���6�LxJ�j#$L
��I+$��<���˓#F�H�2*���׵Y��J3�,���w�~y����k��,b���X-gG�����?�4g�����	��&��"d}�\$9ur�E`]��P`OR%��a��8ֽ�Ւ�|l�D�6w�d�;��2��#��v[�;�fݎȑ.!+؆���C���wV��������kI�d8	=3uOM���1�	��}���A2$Ȕ��o�Y�No�7��#�`:��vp�!�ccg�v��6��*r>�M	����	3���X�׶�oZ�r�K��%޿�/�^���o���Q�̸����M�4�_7��ܥ�(��������?�A/A��4X���r"���2;6�þp|���±S���`�6A�a��`E9���v]�l��F��|��<�=^��F;�v�wm��txУlv��Q6C_�'�‰�t\�g�zħ�K5���F�r�u�T�Qg�l,#�h'2��8#r��|��Nd��8���F�[�y�z��d��k}p,��	Od6����PK�yVSŪ.�k;
!pip/_vendor/platformdirs/macos.py�Vˎ�0��+��Y�4u�h�:MUiP��RU%��&��Ė�в��vf�<B�`p�=ۘUR(BA�D�J�\rjr��9S���,��S�aA�/�����$�	��?���1����;�D�� $*jX]��h��'����=�hXF���J���H�
kc�D�<��H=����ݔV���TTg/��MDUZ�5F;��㸠5-ЍE3a�I�P�߬<����UeY~��0�ڿ�_E�;BJS�iOpAZ�F��X~5�d瑵H;�ɞ��CN�u�gK֨�%?��CN�
�� ���l��sGN�54���4�|裂�j3��'
M��	8�6�
��Ź��IA I�D�].=�z�a�H����N]t�1M�~�O�[(֙{Į$�v�]�Hh"�)	��v���;���1+43x���ʚ��F�71"<�%<*٧��:g�@�-���T��B�����\���M�7�@��:�7����%谗�;s%�J�mv"S�X�c~�b�=�X��jHvˣ�vP'ir1t�Y�e�<��V��V��}�г��S=�����9�{TSV
]M��v�Wtw/;���>n���z�8�8���1����5�_w��G�PK�yVS�9��� pip/_vendor/platformdirs/unix.py�Y�n�8}�WJ�ʀ#�z�`�$ml�"I����X�͍,
$����w�ԍ��r����g�s9s�a��R�z�~RϪ�J� S��|VP��$��y��<�R���U��]���g��Q���iֳ�-x��Q�
�8�R��?�x�NE�<P�J����^����r@
Ig:$� w���9<�Ϣ �9���ȳg�)2F#z��+f�!?��*gfL/y�c�bÞHXZ>�����\��H��2�|�Υ��\,��n~��R1�B����z�iF�"_r���޷�=�3G��
��<2��,����>�H�Cl	��`S�v�u��a��O��b�U�J���(!g�U:B1��xĔ�z��Q@n!k�@(n�̾�I��/豩�3E�D��\�|�rM���.cʚaOt�PR�H��%��e��ْ��#��]����m�&�@u���E@.�=|��z�1Z���
^�B8+�J��x`5���\v�,%k��DZQ:�ֲ���>�o)y5�̇?)
&�s
hȊ��i�|Ų�`[i�`�B!�%t�̇u�Csq7tVmf���a��)�B5�:��e2��27qL��̓�!@9:;�=�>�.�7)lt�d�4pP#�^�=ǘ7�~��m4�Z$/�~�k�Ȱ���	F�{nX-�6?3D�;��a�Ge>��o+����p�a�_B�MY�!���p����q	���ju��.�c�h�F��`���L�D�h��+��h�y��(>�i�lKٯA.��Jr����$׊� 5�����Sȗ ���B� D��h�(M��,|-�	����m�*Rvd<�P�
O��:j
��C��:<q)ʸ��u�ȸ���B4���[�m�|�6�}�q��oCW���o���d5aM����N6�[�ٰ�=F���V�#�Z�${:��p�qo4�2�_��Q���KQ�ͳMn�@~)�ez>%�w�PA��y��{^����)�;#��v;�vh��M����u{mm�͎A��MA`|�;�(�v�E��|s{r���4�~�Q�9����*/�E�pG��'�RQ�H�qȇ��E�Ԝp�R�M�n���l�K�/�>;@�`�����s��.q�U;O	�b7`�U�[�F��z��"KH��5:�ry~u{�\�Ե�%r�fpu���hg��[%��n[v�� u���*:^,���G��T�R�dC|�<!G�~W���ru{qy�9�Q�̽~ܩ��Z]�}�����^=�*���vp{~rO��I���x�h���r�;n΋���Ƿr�⸝['<c,BcU�ӈ�Qm̸8W
��]C.O�+AW�5o�����i�f�u�Q�����\��k1��ɐMG��ǒ�e����5�����ok�*���*x�l��H��_uK?���.��d��sg����X��*4�<c�a�Tѫ7Ϗ���7"Տx'��RXU����w��@�+C6Њ�YI2P���ahW��M���w�?=�ӛ�nh�|�)<�@"]��$IHJ��g�'sFsz�n�a*�!��$y�B�(�I�����C�'��_��f	��6d�n���w���j���D��{���ޤ��7ޛ���'���R{��B�+�@w�"�F2s�|�<�n|�z�M�׽(�YEx7dጨ��I�?PK�yVS��j=P#pip/_vendor/platformdirs/version.pySRRRK-*���S��K�/�M,��������� R��
�
JFz&zJH� 
`)
#M.PK�yVS�80N#pip/_vendor/platformdirs/windows.py�Y{o�6�ߟ�p7L.<5q�a��l���Ŝ��t�2#S6Y�H*�W�d�ooł���{��G�OR!5	�4e���P�H�	��$�BĊ��XfAH�1��ēQ�ءqL�b�$��"�q͒�4�9�eLu$��Ku��S��˜*E>�d(�7��h����Y�䜈�<��dD�����dH5%����~�u�~�Be)��'<�B�H������f���J�~P!��}ǒ�3���^��g������_��o���[{���;��qF�"�bDDDC@���I脑�S���@��9�|Gy4h�4�c!�㵴��
"���,8����fNGYp
�v:���<����)�zj� %J`"��)G
�$YZ8�m�t&��M>�0������912���#�`#���z�W�Wo�wO����D�]Ҹ���}�4
�K�&.
"�6�,�j�����"Q��z����_^�_�	��'Oa1��u/:�3�BTJ�$	�㓟@r�1<�$�D<d�33kl����f�0H���C�F�H^u�Fg��$ϛ�a x�q��E����[��\$l1� �N,���r�]g�s����"����T��Gt8��e%|�0�z�Y�Fm5EYXc��Jhr�1 �&Ck�#Yt���"iA������2�r�!xb���Uխ�f[T���Vc*��簾���i(�N�߿�b�m�-/�rUmY
��:gg�EA�Z+��Y�G[����p
��Ƞ�D+n�ͭP���3t���TU�����V���]7ô&�ě(հ��><�n�b����0��N�o�W���Rvuu���sM��nl�����To�J�C����b��,��V����ˠ2;�`�#� q�.�K|�)�6�tØCI�}�Qu}��~^a6a�V;m9��sM~�nNr��0�Im���ӫ��q�`��2K4���_��O��$]����*8تSPP�N�`
CX��0`�4��P�a�a#Z�,8��y�5�I`�R$�8�9��{0H��Ht��g�?f�1}�9�"�2�-�y���	����W�Ő��[���YH>ͲV��ۤ�?6�i�$�vQu/׽�RM&p�U
���RFyL+6�����r�`��p*��^T���'�1!F7��4���6�)8�[x��
#�v��fT����!&�V��J6���ΰłϙ}��1���D4��hxO4�	�T�;��O�51PU�d�L�/�s�E�.	A�(�Y<���O����~���J�gS<7b��綛�j��8�}��F�
V;b2	YɱU�}��K�]��I	������g��U`��=� ��M!�����g6��뻟O:��Nϯ,�&�����#��������2��_�T�?}Jc!���)��8�o����$�̀_2&�ֵ'Lk.�R�1�����?p؛�]�ÌԖ���=�Y���7��v�j#�Z߮�ԫ
P*[�9At�E�M(��Y�C1d�E�Q��^Z; C�!&�jȖ�
Ȯ���%�O�&o��^Ë�$��� ��X�
8{q�M~&�t����L�,�g���7�9h��w�V�K�?z�f9<Mb?�5�9��3rрC���뎱r��b�2�y6jE�|4�����Y�"M���C/l�#�z����hT1K�����<��.��=��;�>z���q��$FFu���Z��
VWNA��`n3��߭ߘ�&��m;�fy�K �
W֫!�]d�Qi`3�}��o�������7d؛�U�>+�r)��+�� N�e�j�ބ>)�;4����`��`+����5U�0nk�PK�yVS��/� pip/_vendor/progress/__init__.py�Wmo�H��_1JT��/�t����J� 9&�Uu����>v����]^�ns�H1,3ϼ�̳�)���6��$#��tò|�3A_ބO\Ї���|�deˏ���)ݳ|Ʌ�YJ2��`C�8�e�~�4����ǵd$�L��9�Y�C`��:_e���ª��֒f�4,g�[��a*Y<�U�=��%�1
�g��'�$��v@[]�\�^�V,̉�&���L�tX��E�s�5]�l��]�}e]щ����2�[ǥ+�OL��#s2!h��Է-P_m��\��t��@	p;��x�peOo��}w?�ad�O�5 �,w|��=��o���O-���Y_��Oޭ�i��٢�m~�Xt�@2��Ȼ�ƶ9�i��C Tw�;S��h��+�μQn�Z�|TQݚ���ؼ���b�v�;�8�r�<&L�T����г��6�ʡ�o;S%þk*/���ľ��cK�:Z�w\>x�L��M�/��hP�L�S'^��h,I�35�u{#F��,ϖ��\�,�/WY.Q��\Ռ�9�J�O#��R!ʒ��Qk�֬x��I�d�+u�D���e�b/_E�'Ū��PB�,�{2��#\�}p�����G=���J��׭<��#*�>
�^/��*J�}I���o�^��\������_��5�[��7(��$��t�S.��=���J_x PF�V�2^xg/X�8��:%�B�}��Ʉ�\у�ժтEO��[h�92� � Z�R.�Ͱ�ʥ 0Kf (& /��!��=����S{���
����B�����:�Ơ->���*�B�ב���f��,��X������|�՝S�j��9L���GKa4�.�e(e^&���:�afb��~�؈�������2��$w;|>+Dt�(/vC���:[�6��-�.ݻF�����XイqY[�����Z�%G.���͚C��%���
�v�p��j�]n���o��u�c��v�PԓPG����|���4Kw�k�Pb��p(㌕����+��n�%�
��>�]�?C
�1�e�>��X�*��*;MY���e;_)}��v�T�h6���ft��Z�A#��X�/���RM}�hD]�������$$Ǵ��O3jC5a��I�Wn���)F��P���گ|w��>��`���'��fv����Y�%�BwӺ[�©���5�c��]��G*ف�|
�T�B�0ݜ����9LCq7�Xm,��#m"`�<[<b�M�@u)��'1�����…�c||d�ZĮS�{ާ���븴^͒�X�>T�V���k6���G�_C�;�W����>��XK�;��^u�T�K���d7���lH�0h��1V�R�=y�o+�iFa%L��VPE$R�z��]�F'�F;�v;��m׀��f�l#+��l�q&�eA5uG��~h�J��^�����[J!7��Q��\�
�x`VZ���u��[%��5�m�<��nlAn�d��%�u��s��#K����܂�aew*7��ق�4&lTa �+V�\���/�P>���<�PhT��Ɓ1�L���'�5���jS�Q��U�����rH��c��8??>���ب�>�p<+��lŸt>��udxOv��V_�9����(P�IGx[��;<�vλ��<5.��^���9K��#�@ר}y���'�‘������WH��H~�}�ZS7��}����ToP]I�>:��烈�GV�PK�yVS�C�_�~pip/_vendor/progress/bar.py�UA��D��W<u�J�rB�\PE+������v���U��ɀc�{w#���
�Zq,=p�ȑ����73v��!"�����͛�^�}ԆY�d��<j v4��i�bt�ȡ9k���0 )�Ӕ����S���K����2�qg�.k�����4�<���d+�+B$!���^9�|�d<���R�+��
�������¦E!��a�bs$9	u�XzIC"_��?�EzI�h��N��tF�5��VGYF4� ��ޑ��OM��pM�<�Ι�3{p��p}�'����г��аF�! �5l�2=�zb����E�� �����pҳ��Y���� 5�>R�L�{�Ɖ5���2x��m��:H��i��
�
]'&-�dhB�q�ɰ��76��1�Q�kv}�o��:�g~<A6�12B�+��R����=��x7o2����3���	�0�La��c�P��#�Dy�Pm�BP׷[�c`�5�
���iwMu����8�J��ky"�3�U�I�,��8e�E.P��`����!y���Ѵ��K�N�"/�N�.���P$ۆLc��\����%�S��Y:g��r{��)�ա\i�6���$`�ʽ�P�\�k��,���"z���a�&!�n��6�چt��4c�t��n
}j�,�|5�(���U���@-�@\�iB4���,r��$�J���Ә$s��&�t�K�\d��8�c
ۀ��9�5d���T���P.�^xm�WPB�厶Iu���tܑUE���і�:�ҿ\��i"47�OR�4���u���N�ug�P��k�ݏ:?���RɰJ�)��ֵ�]8Γ��9�+�q��p4�H����ý�����V����۵u�ꦱ��M��}V���BΆ�R�߫_v����K�,�#���v�^����d���۹��h�N9�d-;<X��oT�qE��Fgd�����S�C��_����ދĜ�CH�}��w�|��Ke�Q�ke^(#���c�u,f�"j�����[s��kʨ�I�_c[���byA�H���o'��� ñ ��PDy���Kw��w�%U�j���ᢴ��*�S����QR����"�;gϬ`K��P"�9��2��˲��r�����z���|�2N����2H5��=�v�ܿ�gczMd�n�kY��t��s�o�P�Ke���mi~U�we�h�q�E���l���Q����PK�yVS���d_
pip/_vendor/progress/colors.py�U�o�8��_1jU�i��n�U�=MH�D���j�>1ķ#۴��c��j�;�*5�͛y~>��߮ csZ����zb�0`���b!��Yп�_Ø0^P&��J�
��҆˄���-7�1���%��
$�F�.V�W]Xb��I5�9�Ӵ�����k�	�#`�<u�k&�R�|������� ��+(xRI2�B����9�%$){!H�m�TLҌ�t�z��f��IV���ʤD�x�@���v��c<�Cggv��g`�C
�g�$a�F�v�؞��~�:R}w�	���1#�$��Q�o6t���s����Ev���bꄃ	>�\ύ�u��N����'Ǐ!�(����\��s`��d��=:���t��.2l"�~�9C6�О�c�F�S׷J�Ď����-�y��0
�)xA�چY�`	;�U2�����`{���UC��
|���qh�.|g�c�8*5�88��	]�C7R5�Y�)Ф��;-���v�{pB��ּ���3���%�M�I�JtY3.�N��Ii� �0�{�i�d?�.���ե�T*X��d�*Jˆ��2)H%f�Al����Ĵ�(~��55+5e��J��ʤ����jNxI+�����6��V�H$}��UIʶь3!0�PϜ�ɗ�wD���gn�t�*���[�-
�����w4ǜ�mQ}�6R;�۽ntfOm�j�A�|���5�GQ�['/,�ڦ�٨���	���]d�������^������:��w7ws.T���W@��L�P��-#�D�n��c����q���e�>=T��W�_ީO?T��S����/;�����{���cQ.��z�.�옗�uXIg*X��.��'S]�I�1��$��V��$|�Ss��7��Ϳ�>�?L�ü3{�0Zuh������&߇_�-q"^m/A�
7޷�C��#�I��x�����Ю��֖�ѯHoݵ!Y��qכ^��q@ka��:�q���,C�۩Fehk�;��X�e(G<��^i� �#6މӊ��z���Z���'A��ZFk�'ako���5����[�-�t���ר�ǰ>�6f�=
p���$xw\ �=-Nc���/PK�yVSN��|Mpip/_vendor/progress/counter.py�TM��6��W�(lZ��)��\��	Ȓ+�A`h-�f#�E�v��J�h���_�!e��(r(��G����X���?��.��>��V�\&� �ͭ�۝��f�~�fB���-\
�)^����_���Y�7z�mp��0{ٶR+��V�X��
a��*��*���5���Z]ٛ���A�-�4�it+�F�`�E�Y��d�W��5����1�Z��D��⏀�J_�ܵ����
�����q�iDa@*(��1�hǾ�|N���)�(0�,�d:�{���d�Ad���&�G1a$�YIrF9J=e�2:#2R$��I:��Մ%3�c�ḛȉ�%4�� ,f�3_|��r>F	HR��4Ɂϝ�_|]P���)L��H���F��!��h���p|CF�&�~�B5��,����<��t]�I�S��ao|箇i�. N��
+N�ɉ#��0�G�^�\���r�&���8	��lF��:j��y�!p��HƸ����~H�E����~�n��{�aA����?b��{X���vF�� ��6:%�؈u-�0E���q��J*�
ai�ֈ�
�`Sm��Ï������)E]SV[QW��{��.�����_�����A��Z���,<c^q,U)~��Q|�Ơ�Z
��Rߨ���f��J^H_h��b���6�]ъ
0a��O}������>�ևW}x݇7���-��2�P��>s2.qs����� ě���p��5�g=�y._|�,�R�<�9Ə��|������>��a}PK�yVS���.�pip/_vendor/progress/spinner.py�Sˎ�6��+.2l��*����	Ȓ+�����(��,
�4��
A�,���M@Ӵ��/�%e{&ݤZ��9�{-���G��R���O�m�����N P����M��}��#���R8x�}-
|vݽ~��f���s��s����*h�F�X���a��
Ĭ�!����m443�hn2-�P	��S��VF��l6��U�@!�b#�����ΪF�>�Z]�\��5�ȮԵ@�ձ�J5r%\W���z��k�i�dei�R��k+�R��8}F
��<��و���$9Y��8��AH،	C@UB��Q�V�X:��NH��Ehwg�bĢ�ӱ�<dX�N�-f4	�x@�X������|��@�i��Z�{��(�����q�N$z|NFBC'4H}t8��"�#N�\�r`Dfdbc$N��ڮ�$�1VM�7�S��8�g��Ɔ�X��Ċq~����/��Id)�#���iBl��NB6�Q@�4v�4N���{�$a�֌i7�ؙ�KD;O7x;L�2��0#�w��1�B�-,�E۴Z,� ���
��Ŀ�X��:+M��YU�
�<�[��1�kYUB��'�So2#<�~��C���~c��{G���\����Rݢ�=�Em�g��Q{C�H�٣��r�B)*�v�G�V��Ł�>t�#�����zï���{��</��坯����gY��|p�\��,���Q\�޽��N����;���_{�G��R��S~���p�'�p�y��S�z�_�}o���\��mw;��v�K?:��?w��*��b�PK�yVS�0�l� pip/_vendor/requests/__init__.py�Xmo�6��_1U>�� ��u�+��\�4��N`�j�@�J�.�����m���>I��ž�p�93�y8�����vD�,E��Qk�+Q���~�����sʏ���)�SrD�q�wD������?�Q�qt�m�6�^�ܼ��b��ZG�Db��Վ�r,)=(a�I��~m��N�N*Z�+��9��Y��EA?\�P�قϢ�����X5RR�����_��$��1��?<<dMwN&�b4�92m�iu�]�������i��O���V+hF�-Y�UV���w�ZEY��y��f�s�֕d%T,Ea�O|=9ݳ��QJx����@��A����\t���(�ag��^D�Dm����������!�xֱ`U�B씋��ƴߘ�n�s�%�s�,9I������*N�m���HsN?�ֱF��ѫ����E���YG}Cσ�=���! ֙��Y�
٬�X,͌�b������k�'�k�@W\�߳hV��ך��E�
�:�N�N��o^^\^_t���P�䆉
�h�?�SrE�h����%h����_�F��������oo�%:Ї���7���b}�X��X2���k�	���\�,��
O��5�˨��C|W��2C�pLX�&�#���/��ʉݡ��-��x�	��jp7sQ	�N���>��5vG��;+�npV2�\h��7��|_�чQ��G���O\��u B�#`S#�
��&�"���*V\�=���5�"��ÿp�|�M\�;�x�Ę��h:��gk��'���5xi���^��;m�~�*%$"���b���V�_ٌ^}7�<�g�C�3Nݳ������:?�I6�d���w��o�e
�l�Z��sz`R c�}�yq��n��C>��ӏ����r���?�N�)��o�p��z<�Ӕ���c�Ir@lP�MGt�N�G�p|}	�9�ϸ�ܮu
��;=����$2��� �r��EH�I�o�R͑Pl�:��T�gԐ5�K��τj��4�u2|�Ip0z�	]'�i�u�է�.�x+�-�M<ӃD��{�]z�ɖ�Av��Uu�СC��D8����W6h4zW�}2��2(��������@]W�u6�l���a�vOљ}H�[�x��n�%W�p�e \�=�OT�lP@���jk�s_,u7�n�;ƶ�qH������\��+%�J۪F6����'�J~����M��m�@�@F�ټ⡼�p[�9�e�k��|���J�ź�za����A���ը'u]�G[g�x�3�9M��g%�<��Z��
���Xێ߿h��2@��}^\�`�P�	Ab{���
�Uͪ�5��t~��7�߿��qZ�~i7�
��$�`
r��t}�����x?y�7�'{���o�bcƨ�)ů_\縘8�WЋ�7�{�l�H;X)1�4k	g

�O����^���={�*w���:�-=�(���^�W�G�E��&$��H�^�)x�hh>^f{�I���?z�H���w��%#�@�s���
8Ctz��0��$�K�%����r=�S�歨JG�ZL�j뙯�nŏuOK�GD�S�O��s��
Ɲ5���0��,�a�Lt�H�0��cl��[�-φ)w�NjԆIJKL��e�]�:|�x�)�@�t���h���:�{J��!�m~��I��GG�$$�]J�s��������̥�)d����X+2��}�{)1y��q���-nCe�T�W�¿D]��F	D�����̼��x�P����{)P�.e�x'ۺ�7�5��ٙ$��˶�^;�(�{�G��xD$�y�V�q����%�dܩ�c���D�G��]=
fd�ś�G����3��8�PK�yVS�&�e�#pip/_vendor/requests/__version__.pye�OK1��)z��Mc�VA�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(�~PK�yVS��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�PK�yVS�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�
PK�yVS��ipip/_vendor/requests/api.py�X�S�F~�_��<�f���>t4�n!e�����Dgim_�t��	��{w�N2�M�$?�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�,<�����}x99;%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*eo��.m�(K��o�k���X��	\;�%j6P/�vK����O��)�1Yp���xC-�����w�+��ɬ���q<Ԅ�!��4���Z��o�=m�}�� *�l�J�q�N���dt($�с�ͫ[���QU�e�H� $ЩK����AE�y���0ב�3�sǠy
@p��$&;�|F�Q�#ۅ�a@�Cl�Z�ۇ�������#����y���,S�7S�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{��dG��[��q#8H/��~#�f���ԏ��D��%�@j�3��'��n��chzw�*]���В>0��@,C��7_'Cy�z(z:��9j����T��BYn�W2�*'7=ʠ{o
zb37���X�o�q1�ddI�Q�˟ʐ� ����;�fB�E6�3�?�;C��Wȇ� �rX�;4�p��O�.�j�85�WPݡ��x�S���|V�����-��,�K&�j�E(��PX��J�Z|p��5�(Ə�4�><�[�_PK�yVS���+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}�/PK�yVS����.�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�PK�yVS�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��)�PK�yVS�':��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��PK�yVSg�8�G�"pip/_vendor/requests/exceptions.py�VMo�8��W�C�ѥ�E�=�i��h�"��mZ[�H����x�흡Dٲ��5��|����2#�^�@�W��J�\\\$���y��K��WF����/If�rPYHX���������vHi�XYSB��t��Z�ֶ(��%��2�×��睵Ƃp�Q8��$�
�\之����`|���p��E��� ʥZצv��(jA!gYm-J��Rʅ������La�� q�����#��jW®�]=m��
���'K%
�?E�sX�<�V򛫨 ���3jSG�����,�L5��˗�n4�;{0�s���!�#аz��V0� i&��"��/=LZ�<�/Nxo;�	td�Ꝉ��O\�%SWhG�e��q�u�_�h��g�:��=���n�>[�Y��Z���B�l��hMc@n�C��!���eۀ��cUl53�~;��hc�J4�H��r܈��Z٧�V�>�y�z���f��2�K��`wC;�f��ҥm�m�nZ\Q��>��=��w-�wP�IL�L��4y�
Y�]��GJ�Y��3ڶ(Q���.�:#��	G'V�(	�8��G'Cm(A���i��)��Ct�(���-JS�pFpf�����h0';�K�f���'P�'b괺7\�<PL�(ɘ�th�#Q�6���sԁi�c)N��ߢ��
��#L�)��W@-�7�\��G��Л覈|4���ث-���)Z�;�@�1��g%�Ф�ՙs��~�S_h�NJ�k$yp��k|3[P6Nj�_��^"ԃS��y��P����tN{��Og�@����N�31r6F�����1O���] �)F��pwc�ܾ�{��$FW��F5�V�Z��Q��Q��WA�r�V<���ι�����ő%J��¬U��_OB�ō�R,�h�Y�N �/�KȽ������&�Yr��;�GXM���ԵF���EU	��^ѣW�ϔ��,��N�V$N��9��+>+��B͓M���;;ݰx���%Rڥ
V�TZ�-��>?hT�A�$�T��+��N��2O�si��K�&��|>�KEJKV�k�Y����x�
PK�yVSa'���pip/_vendor/requests/help.py�W�n�6}�WL]�W[�K�"A�1��})
A�h��L�$�D]��;�I��u��H|�f��g����ϫ���3�QF�6�)�Pp EI�\.��l�?B��*U	��@�F��)\e[E9�"��(�)2�����Z6_eY䒖I�LX΅��9�&V�(��G����ńD&�0���?*"��Q�=dB�2$��O"�
V��(R���_S6�nNTD^��TpcV�������8��v���ƙ5/	�N�2�Hx#z��~
���.ߋ�<�~��Xg��K�^E9�A��
r$�":�����'�2��V�UP�Z8��d,�$2k��iN`Ý"ˎ���N�n�n��D�t'�ƌ�fZv	���i�K�'?�\��C�7�bm;��؉�K��j�7G��J�)/\<I�`����6���ʠ̄�۪��R[/�d��6`9'�������Fpf�pK��!�3�{�Sy�U��mDq�W�"�J�m9z�#YI�3�ݮm!�$�����O�0�W�\RR�İޡ���U�W�<CxBG̸'���H1n@;��B&�/��c-B3eݔ
�v<9f�\,�3_X���X[��wr�$���L
����,+�P�<r��
H��,�`с��t$o�}�|�VS>b�'-�����i�aO����#[�����딧q�7W�u,����0"2E�:�@�]���'�4-L���Mx��NTc�E�ȧq�]�/����%�R(�f���]��	�ƫ�F$ޢ��-
˞�u����7�`6yk��,2��{w+���i!��!n��l���!$�E�`�uq�3�0�����JФ]vn�	rf�PϘS
��g�ūn)^U�߭�W��~����[��/�~���x8s�t��`�)1�$��/:~�!�,P-x
�|�c���'vؓ=i߹-@�m��%�qe�o*)r
�2�B���C H��	VОx�E{�
�*��g�$���L�.�����S*k�b��[s���p���1�QV#�#TrS+�s;�f����������3ڿ�Ǫ�Y��x�
�SF�?�����u��!�o�VM4�s}�M��Xʹ�8�`�L�H-�>�
o��BW�8	G��i�{7�D������*KĒ��PK�yVSJs�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��=��xPK�yVSX,n�&l�pip/_vendor/requests/models.py�=�s�6v��@�q��[ю��|�S�|�ht��K����RK���ܒ\�j&��� ���f��T3�wI�xxx���ժ΋�|�v��>��{���^��m�ۮM7u��v�?����Ӌ�U�rWj�QuYQ����j����Q�����gY����n����+6ۺ�T�u�+6�|ooڽ�}u��t�3TU}=S]������-�U�)�T�&�nދ뢻(*�E��f�ݨU�k����/w�7MS7�BW��*Ϛ\��Y�+�B�L���@nw��ѳ7�3��:W�o���JՉ����ɓsqw���͓m�~b0��h[���7�}����յi�W��޺�7j[l�ŕ��IwM	�y��]�� �->��O��ukQA���fWv�6k�źn6��lĮ+J���zoƛ�/+�튺�3M����82�z���S��z�ɓ�M�ի���?֫�����T0S��Ǫ�m���muC�Mzk��:��.�4h�f��v���^e�>�Z]�EW\��Ū��l�]�f?����S����Pޯp�C�˚�^�i��u���X��5��y��qd��O@G@1'���f긺��"���Ǚzu��.u�F��;P�WpBu��>�7���3
�Ƀ�N���
��2ŸO�,��s]���r�Tb'�Ջ*C,.�0�L��hY�*
���e�U���*�hFn#�l��8��a�Kki΋�Hl�����{Y��R�,`
��ha7��y#�Qu�2�V�h�y�v&3�[[W����[�j��KӟPSt7SK�m��z��evV�\~ʶ[D	=�͇sj�]E��-���>��"g���f��b{��KC۳]��ZpC gF~|Z�,�d���_�=Y�k8�C��8�\�{ou��5���܀�|Q�+V���
P�
��ݷM
�m��y��{޼>����������:�P�>W:�)�o_=���h]�h�gN�dSk��i�i\2�ߌ��i���*8Ma�{��^�y��㏧���:>�e=����ϧo~>]�����Y���x��Su�{�������o�z����*��5<�/E�����iz����H��Q��r-���`r��H�@�
�1%�lZBg�ǧ��-|74Jp��O���HmS�`�k����4�<�x��pR@�$��(�������8�?L�c﨧3H�A8Tj2I�V���	�Xm4��"y!r�o�i�>�i���^��b[�Ƴ�=�~��e�����Ύn),[ �A� g
�M&S������)oS�XE�Z
,�5�Z���v���t*kΊO��jg"Y��71�3I���]�]�h�4!j����M����>��b��\���ͺ���&�ž���Űj���T&u9SW���h	�>���cиix2̼���3�j?��pnWm�+L�
����t�U�sHF��_r�2�&�#&�`ї$¦��y_�n���v���Ncoeg�˘��n���6;=u(���ts�3��J��gjx�{&{V�7�9����Կ���p.@�=�<�?��3��W��ȱ�L=;##�����?X����w-�#���S�E9�K�d�C��@o���;6J�Goi+6����0}4�Y΀�9��!^��8-%S�G�}+}���X�Y�S!�~�u�4����siܷ��aV"��7+o�}��V�C!���![f���Q|���^����OL�W�d��s��s��9�� 65l���}�Œn��^��p�+��_��wr�ڥl�1S�C��T~4Σ̟=�AYp5e���1��Ĭ�����r����3n���"�t0���ƌ�^�wHvA�g��Z�1�Fu�j��}�mf���P:
;�x�~�x�u
}��
Ͱ-/�����dM���й&�sp��:B��r>��$�!�3��FAPT;}4�S�y����1xt�r�hͬ�`��Hd��"�Q��&�t<q�����u�7�f�*T-��#0�Q__�C�<CP�����"�'*E�>����mdΔ�H�	x�F��V���Ɇ���b �H+E�&�����A( ڭ^�r�v�6�a�ԣ��z�z�r,��q��d�����lv��B����_:I��Q���i:s���->d�^kgk���*�]�l �6��@D�*ԱqF������x��H`�8b#v�?�A��-�աb�G7yT҈�4��֓��`�/�U���!�ͩ�|)=����K���f����FtnQ{�l��$���/�l/��2�)�t�k�0�A�礝+�V���/ƻ�6#in<?2�^
�N_��t��q���/�%΍^�U�M�bY��\g>D�X�ހ��O�e�Y�����Z�3pc�90l��O	跤��-�y�D��}��(�Q�k0�z����e��ш��9;U�T�9[���2Z�����Y5�`�o�c~!|�0>�������
�#�᪼ց�Y�S��$�n���9kp�&����Y��]�%�!��g����ꔉ`���ε=��y>7,��7�p�s�#��6Zj8��ޜN���� �{VTiݜ?9ם�E
�T��Uk�ӯ>������t�U�-��=���"�%�'���7"C�Lz}<�H}�wX>ʞ��U��G�>N�=c�cqJo��
�NK�@��
��}��z)&��c�X�ܘ�y��mnX�X��|����=��|���~�C�A8*�
A1I۾t�ɋ[:ڮoA�}NMRP 6�0�@�R��(�����53��H�#�x��K�`؟�Eh�5zm���z%���&� nzD�俰�`�^R�����a�Ǒ�Z��Qk�9�3Q���#����=i���ʜ�a��sn$�Y�4Y�n0�1;�hYE���+4��l-���g=��G�a6�c����~�,=�o��X����TeF)��?YZ����RD�*bb�A��NC��Zm1�z,P7�O�.�nRv�nvEG@#�O��2�ᠴFu@ɀ��y��Y��CU�ł`�0�4V
gwk�3�P��^Ի27NK�L���m�j�!��T^�Tۚ�àw仕V�*�m� �^�1��J83����wwk�i���D�i�`�iK��U>H"������;%��o�E�]=3Zz�٦���=�������
!_#��-���APai��%1�6�hN�V�T��d������h��v.l�NK���ݢ�����'���]�����}aN��a͹��H�k?lk�w�R�̀~5�>Ȯ��͘`�>[؞����ߨ�(䁢�r�"pĢ驛D�����@�1�|��!�%^`b�h�Š4&^�H+�IbbU�V��D�i�ە�ɖ�1�љ��T~R�>l36��t��)`�#	�;D)'���ݯO�|G�"t���K��d"
e�<E����'��N4���	*��
f(�0��\��#h��C��>@?p�;�D��ݥ�Y�t^3�5l�y�sU�ɦ4
�x��	����1��������ԅ�Y��N�W���BFa?��`98��딽g|����c�j d��p�$̖ti&�m��I��ga�$&KJBdLFa�9�3v���YǦ���P`�����p����[N���x^����_Ƽ��ȩ��>�Qn��&��ؔe���V�{
��&�%�_dWZ"�
ϿF������@߿�I�:+q=`cgeQ��
�%�	��V��o��Y�N,RY�jU�r�h���I�D��l2�$;�-%����oZw�o��>y���|��5��w۽]դゲ�x0�`e6���P�| '�*�5����l3�M��]>�O�D�mG�s�
�P�4X2�)�:�|VS�t��&+ʮ^�PK�K���YY�٧�Iܦ�-a6��5~{�F[���+��w/���,=�3�Oп�C�9	-�(�iJ\�JJBVL4n4t�����ωq�]l��+
��4��t(�!ԱB6S�$�z�8;T�&;ߠ�yԗ��[�a�1���&k��3��f�y���ȱN��{k�z��G��㗧��:��}2�����ȶ���w�����c�엧����4
��Mѓ�uɀ��1��{�ڼd�DK-D�8�����s7�{�Jx�+q�$�����k�
��4�}mG�T	�	�2�AX<n/O^S�z�"��U:`��uK�5���)�X
@�Wu�Y�4	��]Ի&Uo����:E�phZ[�٨�ʶF˹X�8�d�E6B'�̓�v�Š��`
�R�6k^��ʮ�l񓆻VG��;z��O�3�E�h>]��rE��|&H6��W[bJ*�3]��0�
#��i79��>��
�@��q�o\���JwČK����g�ƨ�d��^�ӓ.�9R�?NB@�4r�Q��C�
[y��zؘ͒�
���v@%�K��r��,<ê1Gk����>��^���e���;��H�)6�Q�Q�)1�Ԉ�1���3�G�1qtߖ+o�"c<
�9�Vۜ��_��&0	�PV���E��q���[2��=�0�+��e�����",���O��
]2�K(PG>O�H�;
l�a�øh�e{�{�C���H)b�m����0E�@�Ĕ Gb�C��zML�j�hJ�+p()`���~O�tx�)�@����8�4�_1���e���������9{Cn
���v�.�ĕ�#;3�,�ļ-��X_��,{���׻�x`iJ������4�P�ad���W!SE��b��~�}%U�t�
DIƼ��J��z6i	\��6�6�##b���73*!���	�8�h&���n��n��	�>�U�V$8s
y�	EY7���(�+���bhq\
X���آ��Jό����:?��\˱tpYm¸�h\��
NY&�|��X���O�%UY}�>�Hϔ$LK	��0?�rK&u���9	p[^�5T�}IN�*�$�%���2�c�����s�໯�qV�5!�wl�鲜� ��^U�^0V8p�ځ�Rq.{y��a7ǐ݊��DD�`���h�1НM��ͩ��1�a����_<�C4�HH������;ٙw'\3>VrA�ˋ�Z#r0@,��c�W
��q����"WK�ے��J)X"�dq&I��f�`2<ؑ:�cF���ШfHI}2�:{�+�Q����d�*��:
�#6�]��3�dT&��JӉ��H�'(G�R��G�bV
�١�r ȓ_@ЛMCX��'L�<��O"^N�l�{�5&�OCEvX�w�J�Y�R�(F��7���/�G�Q������x�H�'g�^__Rꧭ����!��N@���e��AiP�L��3�2��I
]Hޔ�$��/(����%�_��ur�P
p��(a"�{*�P�)#G-��%H��EXA�"MhT�D$+�L��1.BZ���}8Hx�Cѥ�^�p]�e��.�,D@�0��&1�C�-�E�'7�&a�}~x��dJ��b� ݓp�i��h_�
�݃E>%��Ǖ��*�8��
��>i�9�%��a�u��"����a��p���ѻ
G���!}R\���F��&��YF�:�YFd�p�7�+r���ҡ�;Iu�R�޴������I���}0�nin{"��&1ߧNt;��m�3�)�LHx�`�Jp�3���p�Ox��:h.��Jh�G%]0��	�&��֮�u K�&�d_}��\DX��K-nU�r��7Z,��H�d0�-(�鹷X�<x�pka��M
½h��7p�Rj��U�$��h�.%)m�4�P������]���'U�w2�O�����s0T)��{K��|�F���,J�U�˫1>�Ag)�!�8�8�
���-_^J7���ypNj�^V7 �Z|Qqau�;��/��.i��9����K
(^$
��#F~/��+B�� 1�0�:Z��m��l�M:�EWÔr�~�|�{x���i\��ǹ2L����O��)>��|���8B;�>��B)aJ��6uס�Z/�B*#�$�{�e!IB�)�s4"��q�HҌ:��:*�d����lS�xw�
1���(��p@���):�%�IZ���-`�:�,k�_9��O
�N!"'����2�gcK���v�d�^��U��:��"]1�),�+���@3�],��Ʈib�4*X��a�]��A�ғSro&��ibB��}������.�-����q���Dhs8h�0m����ʻ�f�1��\Kj�+�h�k�'�{	�'�Ђ��T}��k��gO���bc`@��#굗1lw��0����K�
y�K{č�d��p^I�r?�a>���K�uZ�:[J�1F����
o�6��i8H����%t�N~�<�詇��-M{�l�k��x�IG_.�QIyl�Ln����Rܩ�8 �ôb�hB�?�WL�vI���>Ȯc����\oT�M4����{���Q+����et�%��v�fuDྴ%��`>��s��V�L@������n�8>u��`v[J�O�4�&�%�\�o���̹L��m0W@�
6�IT��_v�{(B%���]����@o1%���G��(�v�ŮW��Լڊ.�Ac;�y�f���#�8f�#�%6G���x.����\�xP��)�J��\�eP9�e�M���\UhJ�9���vg4�W�B�"k�B)�LX9e�jU�T�5��Wv����4v�^�]��扈�Q,#z��Z��a�9�5��a6�g.��5F��|Gi���8�7#�����V>X1��E�|
j��5qVcPV|,��O�ǧ^�/}��:�t�@f�ʺՉ���/�I)wRr]-*^�
^�|����8a��(3a#2��r�F{M1�I�$e� ''�BD4>i2�n����Ɨ�A�a�G�H��w�ٴjد.vZ;3��Ս{S���/*n�h��8���m��$�Q�}^�]^���lۋ����+_�`�pۃ�vM��_��h[���.��@�
o5�Ӧ-8tm�X��E���K�	��'�>I�^�;�Ek؞����}�Rəɶl0;��,�z9��n�y��ع���J*
Μu�~N��OD�`�p�1�M�e�9�m��A�e��[��H�Kw����w���Y�6����@�S}1��o�q$��\P�[36v�|��)�܃,���i%����/#��mO9��<�dP`�ÿ�6��!�
5BEk��J�UѻdXW��eI�RcX��@Tw�"��#�B����e�'�f�я5_J�8�]m]^i;�v9ru�,3��q�C�ؗ�r�F�죧S�w��_���P0վ��2�$A�ﴪĹB��xI��{ܧ�KG�-,$�7�'�<GFu�k�-��.2��m@Fǘ9���mqtX���cۂ����3�C�4�L����X�;��$?4 ���fl��(��e�w����9�;��K��Ë>�j&��k���-븓��x=.Da��ʿ�b]=|��q�8��]VH?3ӚĬ���hIQa�Mo�m�v�������d�Ѻ�K�LU�6g�L}������gJY����O~����䭓x=�xE*���k=��!��{�Wz��`+���R�ۺ?S�eo䒿޻$�F�l~�3�[�-���0�cw:{&�	��.�?h�����&	N��WZgV�:�tK�@'���+�<Y ^a¥졃��u@��k��m�.�( ���N��*+��ƾ��惸4=rk"�%͹}u�AhEAh�Q��x�k)������XN�h��R�a�*e@IOY�p���x<k�/-e��6�x?$)4�����D�&5:?bt7�����:�I���w�'O��GW%���:p��q�/07�$>��~�Z�~wG3�qQ��>X�=�?��zc,�ӫ}2�HK�"�")��r�e��-�II����R��S��Ơ��l6:�͂NE�4U�uX���^�v�13��zL��#��â;̘�"��`
�pO�܌'��I�u<it�R�B�4��y�^ȿ���Ʒ�Ԕ��=�9��c;��*�8����j������^�	~�'���Ӳ� �HI�ЌTo5vˋV���vt�V�o����@+걖RΛ�Kh��@�{	��([��?�R�A��$�Ng"b��ս�Rʌ~k-�ᗦ�ob\��S6:R���1�B��l����Hv95�7�������=�wG�D�4�P�t[o7��&<���G4�DM�`V�Tq���cw���fc&�k��{䈐�A�Κ��s?U�$��jj	.���'"�,J>�*�,M��vr�=l�N�9�$��z�4�r8ROц�a��{���A�-�
N�3�[^C0�M�)%�C� |T��w�sz�e�.5jܲe��}G������*2�E)�D22�k�Ӽ�vx�:��lE������4
i���1n#Xa{��c���";8��c��/N��Y.�~���orݡ���:�Q�Cu��
���Om]j0;k�n��̕�@զ�ocy��Wߚ��Rw����^�R[[��M��\�?�d��k��sm�r3t�b%a�c�,fF����r�X�f�-�f�R���wM8aN'�>"%��\o��3%���$����%�/[q�>Q�,��O��ޚ��֏C�!�6'ä�_p�K0݁�̿�����	7��8~`���j��l��~��5�MMΖ�EY��ij^�X�/��.F~��<7>��f,���1m"�Kf���N��o5�!<d�J����c�|_���e�l�9���[u+��y^3cn�nx`{�����#������� 3�qܽ�fl}h.wY�4s�'�8\L�׃�����g����iT�L�qp�����j[�e��K�����%��]���dz
)'��n�IJ��0�ӛǭ�s=����)-�����͂G���Y<KM�8�uY�=6ram'�)�<����΀�H3Ob�$���>�-<b��sN�h�<ɍ��^�>��=|1S� ���>�ռ&�+lCR����� ��3e'64�^Ƃ\��G0�}IkCEd�?A^�a�Adg8#�)��i:��n�q��._��F=�����
Ё�M6w6�
=3�i�x��G݇r��{����_���p�)�RF�~{�%.gz�Q
+�����pX���Є0��^��{�+'R�	�K���Yn�&J(;/rT��4�d�Tl��/�?w0}E������4��ҩ#��j��[�3�M���*�#�p���X����-"_��t`*�.�)�(<~Đ��т�_��H�W�Č�K1��z���7l�_�*����?��!q����g�;���<�t��F�`0��6}`I(���.h��w�vA��b�"s��Ɯ���:��'�;'/�.�0�r��H�1�ZY]�5�k`@��XWј�d��.5l����]�ȶ��2袭_���w�_q�!��#�0L�JN�V�?����<��c�s�hg������ܭ����zai�wr0A�GC����7O�����<n�+���qk�r�9��8S����Wg0�oF����t�l��4'�/�0�X�=���vf9�{�9�(58�h����K�Ā�L�;t�t���d���/�v|}c��Q�
�)!�j�'yW&��tIG�?�K���-Vq@�Q_���O��Ң*�}��1(�R3m��_�%�a��ma�n�9xF�&����PK�yVS<ށ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�>���PK�yVS�4�8!�u pip/_vendor/requests/sessions.py�=ksǑ�+&�>p)Y�DA��(:�^GR�K)*`	�5��>H!.�_���rr���\�;�3��ӯ�<R���E�̊ˉj��s|����7��U��V�M�Ժ���������_e�Z��6�jS�7�R�*Ug�E�?�E��R��"��*-�j��:�U릁����*��������t=Vi�\��g�:Jh^�zSV�*k��ڏM��{��\�e�h���7K�7)�^�y3�e�瘟���U�h��Q�Û׳���3|4��JZ,�&mL�w�]�UV�6ۧc�V�OeVЇMZ�z�ޤ�
��B���=�𧴚a���4V�sS��f&=fM9�cu*x;���ֺ�Ԧ�HF2��$���}�abzi�:��������������7'��
`ZK�Jۼ��ñZf5 cqEߥ�,+]i>k�̍s/�&�шK���͵��n�o����p:R�n��ߝ��	�y�7a��e�&-��z�U@y�}R�ly����t�����Z/���UU&�J�Ѽ��ӑ��{�h�ʑ�(��IQ��pu�L�K�t��-<?���Vϳ�=Q6z�V�X]�f����*���	~X�b����l���b�I��6#`ؔ���
r�o�Z��ힷ��ik`��[}��{�Veܕo�Y���
v
ҟ7e-߱��H׷i�T�I��,Ϛm?3V;;?<?�a�+W��T��\\��r{�-��lm=0X�X��w|��K�{�B���d/[��d��
�\M�jK~��`B8i��D)o�\A��ɳ��1s��Ԕ�H�k�i���-��:l��/�F����3]��*-��
@_�=�縣	��=���w�C��;��c�
�zbo�Á�}�amk /�
�Ц��ҟ�k]�Ѥ��{�A�0��4`h�g���|��q�Q1`K� +�+�<Q'+�8���^��v�ͷ�6�su�!���Tm�}�n�s��=��l"	x\6�Ԫ4lu�`�����������aPQ6���P'����U�ڎ�p�jha�CX#l�b�����!�wu갍�DFC#�"a��0��,G�I�AU��
}��z]�h�kf1�m�4h� =u�z������w�M�-U���b��G�e[e�M��x'uF����5m�!��2q�躮�#$��O��c:����@}����<z���@
��LԵA���w˄� H��Z]�`Y�
��T0ṑ��zo�z���9����/Ц��z0Q?}�}�B]T:��g�P
4(�|��M�i�Z�
0�H@Hݸ#���O;���t�}g������%nG��GI�{� ̘?o��Y1d�H��<�"��6�&�pڵ�W���'ɧ@RP(�Oea	|���3F}8=A|�爙�ܐ�wثV��Í!�R�\Uog��AցqD�ب�A��K�@���{�ˍ�u
����M�*����Re�A�k7��B{�N��ۋ�T4ne���Q�uD��m݀��Ft#s�5i%��\&ZG^^f�p�p{�ty�
�Ke[{��f�iv`�,��
��J���o@�z�Rc��I;כ�h;ؔ�%�q`^>�������Sk�%��WM�1�#g	�L%@#@�?���	��m��z�UPZit:��u{yICb�#�Aqn#`U�₩q����xvtr�W)j����̈́��Ic-�<�Fx@�0��ϥ�D��<�IH�8⢬��� d)��F��kI�cV祪��yk�n���3����'<��kH����c�5�Dv������A۬�{��J
'�ĥ��r`D$�𐼘B��P<����j�(p�`��G�@�=W�ٰ4Z����K+�|�%`���C��[Φ�����l ��uS�k�~3��Ǔ>��W����6�b��&`�� Ei����U�MLV6�K��<`�ՉQ��Lw��`U[u�Ñ��wO��7#��FȘQ�8F}��o��A�~���
��q/�Z
�Ys�,����"�kD �,iC�5:���@Dɀd����Q����ą��.��"�� n`A>{�T`�z�C
ߞ��YIH؃HD�0I	��K"!ly��[6H��A�3�0d2|��i֥��{�C�R� ��<b4du
Vb�#��ˉf��b���Ѭ��ir&[EvYU�l�Aу�nW�,HvP�'倠(���=���3�y
��&5� @�6S�ڸ�d�ǎ���X-t%=LXU�m3
H5�Ό�����潬����:J�f�ЦA�80!��:�w�Qa����Zo:j�d«Ըm��"��>���U?�r��15[U��M8O0Ò̉yi��^e���]�	�d�1�s�(7��h/h�H} ��̟1\�%w����~�^�e��Fd��(^B�d�	!�y],#�0�z�L���'�O�*0F��/���(z@��g].���K4h`��rE�Z����
w�Ӷ@��(�9U�m�d9dsr&sd���"&�����H��Z���f�,�Ǝ���1�K�������Ï){S!��ؚ�S�P�	��>"<���Ҩn���̓.my	<�)��:WE�DT����|C=�����?r�g���?0b�B=�a�;�x�z���E�&��O�;F�Q�ȈNY>u�1�g��L�[\�;#�]c��y�~�<I�gٵ�:H�r��E��БJ��C`�M�.��t�v���yw
=���ǨSЇi#-.Q��]�!]�����?�N9?Q�CtOŨs�e�K���,ǫ��<@m�V=P�X(K��,�u�I�/��G�#�F��m�Da����[r�6:��{Bf�)�6���
���`��ˆ���1OL�Z��ܻSE%ܩ���=I<U�����0�&����d��/���l�Ձ1)���O?��0�;N�f�c���xL�V[+4�| �g1�"�7=��S{���������+��QN��uq�\
��5Oη��ϫ��W��7jmЕp�?��]D/YM`Sn��y����G~��i�?��]�5�)�z`&1�	���f��k�`����4{
�
Q�P�(a�^�����Y�(w@&�`o�tZ�b:V��t+
\:\$o��Uz����B�fJ��c�ΦIf6��lyc���
��A����Iiyp?���a��*?��2��
M�1̍��=r�dv�A�y�:T�4��o�sPHx�S�9n���'�e1G�sdt8�K���B�7i�j�5���<���4�WE
]q0#>��i����&%F����54Ag��f��������b@��)E|������X=��kR�K�E9�x�Jt�j���8���;j֭���if�L�8�U��w�b\��#;>D�;w�G�X�z�ub���k�U(Cz_H����ob�o#��?�M(����m�AJ�G;�Bw�m�":�F]d�ξ�w���cB`�h*�r|4&����s����B�ϰP��#F���`Q�RP������FYc��෦#�[��1��w�x�*�J�1g��g"�=��� cG���Y9�Ô�<�.�\�#�g�w7`�cd)����@��
@;�p^{�?~���x8=f���� 8UD%���^�$Xr]#ە��&x��Q	M�F��Q�c�������G�d`O�•}�c�	囩uvyՐ}$iXh% ���G���ҍ�QXj8�2���3{@ZS�5%���T�n&�\�x��� ���h,�����d��]��,�~�����r���YM��V�e˙#���5T�·�$ŏ���P�Չ�f�ļ���5���
�k�}7{��?��,B��c6�z�gd��|o9]f
>�I�a�b7Ι!Ɓ����N���Icm؟Omp��%��|���@����8�~�		��$��=�p�&��+��j>a��|��%b�_����ib\�pR|�B��M��6*gL.ׂ�O��׼DQlߛ>:�SV�=5���h�҉ ���(�UB�t���'u�E�#��w�>�nL�g��2k��Ȏ��C�Zb�[����p'&�k�'�0@�mY-�A���[�G��'GF	��f����QD����e�Q����^(�����=\�Y����`�h����Gz$�D��/�
v@�ČVs
|����V]T�-,����U�#�{$	�񵴉y5e	X��URV�W�:?�V�>���m�,y�К(~Pn:��[�����
��L�7S5���� ���������J��iC����jYb�����P'��X��l�����j>�u'�i�Ve�G���4��%���s�r*Ϛ��)���6k$=g�/���p�SX�'x���)����`�R=���g_�R�k�V�'8��t�AC�sa��/�Х���_���c�7�C엙2!L�{��}<�����À^��P0Qbb��/^�b�(���Q�3i���߀���S��EVІ�6���9�V�{����]�9xt���Z�*�1Kw�Ӫ	��ﯝ������0������R{ r��� �G���W�Hɦ�,��5}�`�����s�_�_�3�&�5�.�٨���l�Y3��y�GuH��~�
p��m����{�B��3�w�`&�ϓ�0*�>��sq������L�^>����J6���z&�
������sk�MN�Ů�N2��a���#�X��q|��5��Ӕ�2���g܆�㙨=:���"�a�)�/�{5Q�UY&i5y����S|~G.#�z�ͳ�O�|E�2��S)M���vf'X�>��~�KIfI���a�[L���`Ֆݰ41
������)D]��a,� �̇�4����f�iɓR�}��'^%��.��h����"؈��n(q*:{���"��v���g�m��iV�M&�޲�!�;}F&�֊��)��2
�l�զjdN3�ai0
��2��0+�(�gg�+��<��mCp$��&���Myd�bH!-�Ȩ(΍�I�TG���V[4(�&��isL�␙T��}��:[bJ��Mּ1s����������3X�R_�9�\՘��<C��)%,@f�����&u�K���5L6z=�H�9JɱZt���HY͐����7��lݮUѮ/tdj�|�3���˺��l�a����q��\ٲU�"�(dL���^��WR&�U��7�<}!!й��%���Pw�*[Ͻb�G�l�&�KR����1�\h����-~&q3J��Z���mȣ�ش=~���A����֦�f���!�]��ޒGFJ:m^�)y:܍\�"�ݫ�ܖ�'��|nS���i����}���_��?L襖s-6L
�ԯ��O�LX��S�}^��p��uoc��C9Z9�π��S�*h�ٚ�c�m���X�s㰓��l.�#qLw������Q)��>z�b��OR)�*�_I�lְ��w����n7/8@5���.3��|J�mYk1�\�44g�~@����.𠃘��{l3&A��8�3q[��",�H�o�<��1�eY�<�ҍ��WM)H�:֞���������M�x��Pm#��QJ���3;L�\y�UG�GQ��YT8�3�w E�b�-�2%�l"8L�{aȁ_6�'�ź)!�����к�<Q���[s:���0�
J��F�z#�/�8��k�6@����/��결��K�Z��io�hb�,}�3���"Z{;�c�g��#]��rW�!l�A�q�|�j�=�͉-�5���Si��R��MDz����7Q�?2�7����-� �p������iFA�F6��d��I�I���)�һ_�u��������bI��B3u ���6,��X/�ra�OLP�%U�v�Ml	�۠`į��D��aIFy����o�Nw]I�ɧu{�f�:C#K�xL>�j�o��ic��͟
wA"$��$�~J��� ��w@ƿ�9ۅ����w4��_9�l��`�?g�G8�uCю�cU��H��o����P��)r�%��
7y�.;c�����by��~
Ƣ�k���~�h�P:c��
����UyɅ��)��0��@�K+�\f7�:.P+XeCL2�ҫ�|(���Ma���f���O5���0�h��u���`�g)B)�q�N��@�(˼#yX��b��B��V��Ҏ�l���:��M�4���k�{�`����-�����H�SX0	#x2�nVT����1�tZ`���3(�$#���ʼ�Ӽ�)��c>�b�h�0V-���Tz�^9šB�x�wtn<��Pb,:^0�,牢�d)@,J`��;�5FV�1�߽1F�>�6\�OTj+�U���x�������D��#�
�ULvg��\���@cǕ=�7Lx)��†�	N�dNI6>L��r��ұh��j���e��Bb�\���몈�,'=�� &��!��`����GK������w;�`Q�F8M�(y��l����a9��^�'����l�{���b�G���\��\h<�	��V�WG"e4���ɵ��7���ˬ���v\>��{���;aj��w�����
��9�M�*�v������S����M�;�*
���r�|.�yր�+��+����}�!�̐��+U5�����a��c�x�����۳P᫨ X��(������8H��D����ؔu �������KJ��������{9���(��g
�zvP/o��X�>~��v��D�}��#8�]����G?�����yٗ:�d*?T��:~}|~��D��b�1p�^&�"8��Ū �^W��	=�Iǘ�K�1�����m�x�EY���+��6��T6��o���%�q����v�%l'��t��{�&�z�x��:��]?w���Tw6v�ý�X*�陣�>�ChW��8o�j�K��X4`nY��&P���G�-^�^�x�����#��`�н.��B|���G̴�b���OeK�Qfz3�ɠs�n\
���hE�G��Q���\����y.����ρ�y�҉2Ѕ�\+���k���}�_+/iE?u��^��<F��!��.*
z�!��9[S�z��*�n������a'���̋�]q��9/��6O7t0N3�V<k���陨��E�I%�����X�RO�]0/{<�N�l��RepPE��{?��]i=Vr�^�X�{�ٗ8�X��k�u�L��HU����0�\�EIL&;�)���
��`*�{�m|7�7<��&J��n�b�����h�ϓ"ܙ�R�(썌a�;[�[(�>`�	�>��'������A���U�Z���A�ke�
�- |��xسb�÷�ͥ#��D{��ț`���c@F|��i9^n��eh�Vr�"C���]��uI��]H�E���#��rHwx�!]�=�x?�p����� ��u1�+/���Q�m��݁�%�gM�91?��wO^�iY�fFx�c�n�ٙ�w��=��P~h���GWzqͿ��%Nsmffr]]��O��_S����/�,�悂�I[Y�: ���n6�)��_z~gu}�&�WV��P����`����S�Mb
�$�H<9��I^�����'���,������G�(�r��{ҽ��l�Ű������>���͎g/?�}���RV�/�pS�{��b�=2�X����e��v�o�w�ϰ��z���@��l�^G�A�tő��IJ��9M�����	
c.OԮۙء⚖/�r��J�"Ƅ
b#���oC���mI�K����M��Z�����]PB�6^��x�&��
��w�,C4oz/�%Z��7�G�-ɌP&�a��(HnZ�Sp�oޖ}�|�	��"�M��s�/��i)ƥQ��W�s* r`�.�D���ͫ�7]r�_,�n��
\dao>H��}�5ו�+�C	/B	��C������V_�z�Y�X-��Q�/]����K��>9�E�lk��'��K�,�K��G�{�� G����5Dk8/��%c3[z�]/��ػX���u+��{��?��\��?����l�XL�:~�-�Y�c��0 ����$���Mզp��ӿ�R����& ��\ϖ	�KX�����z�<N�_�51Z^UgX�"�+��i�e5Ga�W+����R������S0wm�u�f)�B�T���wY�xK����.��sN�����j駐0�Ba��+�w��'PK�yVS=��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�PK�yVS���|�"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��PK�yVSV�m\'�zpip/_vendor/requests/utils.py�=y�Ʊ��S��t(�㺌�ԑ�D�c�:���.K	0�#y�gs�bq�r���ӯ�I`wvvvv��n���[j��Iv1V�j���ll��B���eU�*Iˍ6�66N.�R��x�j�(��$֥¦Iu�f�lZ%yV��2�TTh�,u�n��2�ԑ�ްo��̱�l��Y^(}[�"�R@.+����d�ȋ
��Ӳ��U�'M�͓$7�r۪��S�O�te�U�rZ��*=_̒�v���he����Y���4�2my���u��	@�6�d��:��"X)��k:̣+^����%�CQ�04͜G�ȼ��躩�<̢*��!LPV�Zˌ�P��e%}��<�^�$�f3_�sZP�I���f�XҚ!�F��(ajU�Ӥ�U/U���̹������e^�@4���t9µ������0�mo�~���QYR�ef�G�ftG
�u����[ Ȥw��B�]'E��uV�C5�-uh�_A�>�ST��:�-ḡˢn�(f����[sQ�o�z��4&�av�I|z�zd>G��W���Þ��Yx�N�B�$Y����<�;(��nl�989�_�>8V�{A��bꍔ�'h���Ջ��'���7/_��^�|͉���'�i����	B��C�������%|y��ѯ���ՁI(�xijȱU�K]\����I�,U��d�?�s}��"����?xw�����ͷ0�`���<ɘP��p�_F�ˇ���y~4E�º�l��K=<��-�x�a���Hf(3�EU���j2QP�ў7��6��TQ���lb��V"�)IB�5_�9V)��rr��z�d�B_��)�˼��<�����z�����J�Z�p�x��R�lr�í�̘��G5�8<S�@��5(���ձ�*����<P�v����;_�~�������GGoN��ャQ��;�g5���dZ�%|{/�~��,
ص?�B�?�q��݅����d�i`//��O|�]���O/|{�r�2`؀?��`�	N�L�K]��K}p뷉Н�?����|��[`�y6[��s��Mtߔ��궏]��V�
�fB��bo��c/��?˫�a��#3��0�&�	���RO��5NX�:#�\]je������ �(մ�{���(}�	�A�Qoz����(��4>-y����Q�g	��}�^��w�}�W{oEnd^@�
S��� ��\���h�e=Z��Acg�h
`��G3�3S^��8�E���B(��y�'�$|1x�v�+�`+��!�
ھ��(���"��U��l6��f0�>mZ���%�Έ(1‡��.A���e����Sd{��}T���_��F�1���G�)y �B� �7I�`B����d���R�.r���7�a�v^e�1!j�Q~}��
�$/t!Ć/�X0�4��)cH[�����"�^�EU: oGfy�QU~f�<sPL5�1�Z�c4�|c��\.��Mu��ү�+0���Eu	��6��SV��"G�����`��1����ţ����`�5���5]�>��W�{�,nBp���-��$N��\�VE�t�pp��0E�2��UT�<�,��L~v��m��X�O�-u@�6��$#EAPx��8�d���;K�9�����̲�$�\�=O���Y�A[�x�V����������{���T�d��nϪ-�i�v�J@ $�	 1�.™�A"��k�n��
pD��\��������@��FPH�U��肺C3�=�B�;X����ल��*8M��ٰ�z�{$�	x�)��B��k@}^@U�j٘��~��v�{7}��t���y���;�<շ�{�[�MtPX�����|��"n���g1�K��K�Y�hAC���(M�дE��#��H�0M��++0�hI�O�p2س �ic�y�U�
M�ޅf��x�W�Z�䊟u����S����ev��q��~m���]��m۳n�5r����WސM���#o�c2j�R�o0P��I�0�=e�#k��eL��j�H�<��j��<��>즽ao���^]7.��pp!���g�iWt_DE�()�-b�����r�:�	̺ӝ�gn��U�����&F�<�E�7�lu��L`�q\)��ե�,R0r��ԡF��	ٯ]#
w���r|�H�D�"�I���j��ǣ�Oj[,�p�=��c��cݶw��{�f87Q~�e4�\���/�zF��~�,f(�h�pec[Գ3��2Ro�w���h���j����Ѡ-[VO߶��LJ��l|��̥Vb��������o��Y��,�����8�
DVF[�2$t
n�IL}�@k00�8��>_�A����yq����R���>y�~��t�#ay���E9�6r���ۻO?Y�m�El=O�"J(سG�M:
�A�\����:*@ʰ�V 碚�Ů��em�+�ۈ	 a�S��(��yp9?�Ei�+�U��d�Q�Ǐ*Fu�E�)�1��;Z"���@�^&���\�l�}�����N��)�`}�=w�Ii�8Khբ���|b�#�^TN�ĉ��c<�2Y���~�Zm3�����_��0@�B3������T�{�N
[��������Ew�P�W�ߩ��$��nWՈ�����02]�>tm��XZm��Eo&��#�H'(�t1ʒAp��R5.I���)�i�Q�+�U�;i�e�s	h’M�
M��OH�e�s5UOT�����\,�Av�.�%X�o)�q���H��+CI��CN��N�9%)�,�k��ZO�x��S#Klh|(V�l{&�B
&(;�<�& >�F$"�b�%x�f�g�����9��0��u�5�����]�BẌJ�K3�\�������6N��ql��f�?J[�ڰ��x�†?Pm��t��\� CzEx�K�bz	��meb�l����|�y����к�
 �YW��4q�L��)QL�Kr�P|�>]��̕9��k
��@o�N	,�K�p�R@���/�lY�k��]#���G쳞	��T�P2
(p�r�%�W֠D+�góv=�v��iR#,��H��Hj�2{�U����!�`���v0=l�������w58~�}l�@r	���c�U��Ɛ5��,^��� ��D{L���G��aPx�g��YI"�y^oI�ר�/(*�9hm��8)$8`w�1x��z��PΜ_l{C�C����l�ll�1��B�`<Ж��	Z!���9]�1���0y�y
�&ʪZ�p�Rͯ`> ���u��5(�$4@�ϓi���6~�K^[?Nu�@v���o�g�3y�C�k�B�Ou�L �Q]��Gy�bg4F-J$JE7�!⤼B��ǝ��./a�Ff���ʂ�����D�$��#&��&5���{�:P3�,KͯJ���L#�g�v.îE˂�ۘ��ʻ9�hi�E���%:����V�ߑ�Æ�I���u�����k	#��e�\���n��tH��tpi�=g���дIE��)�"C�G�M0��@���$=p�u{aLnd�0�-��C�H�`��e<����ϟ�����;f��#o蘖�5���zl�8��	�M���=Eka��F�Dpa�g>�&�I�a�Ƅv�D8|��E���~�ٌy6�~�&3�h�	FZ��u���CMw�z��OyW��u��)eQ
]BvsM�
���X�������5c��?�;B|-[��]ͮ�7k��b���|+4�Q��ȯ�c���z,�ʄ��=�u�ys�^a(e�T��2�ʷotq��^^(���:�0���I�lor�i�Rѱ��s�w~��^��'O�1紪=9�?�8�=]����l�y�Uj��b������s�6
k�Kɛ�c�$��K�0�p�[̈e�ԋ�#N���h�Dhr�����-n��l�ҋR<1ObP���
�Ԝ�EK�c"���i��%a�P��+
n��dr����L�R�dg�x���Q����VT��2�bW��I5�@��O̪NJ�i�.N�m"����T�j<��Z�?"�?�0�����ʯt6R� A�48�(I�מD�Nr���.dpu�G]�����6� ��h;	�L��Lr�\5�1�6-Mlif#��!���c�/@VXؑg,%1���MSn�#���x�X���;�/ޠ��Dp'&gY@�ҧ��c��ԸtS��}ϯ��B��V���@i���QR|��ص`�ׄ����I�:�)-]̼Y�O�ⳤ�`�����W���V�n��~<����&Ga���>|�6#��{�\`zCP8,>��.e)P�1��d�(����#��l���d!0;Ȅ~�y3&����o@�f"���nl��m��
�˯���&6�;��2����;�?�'I�$ϱ�f�4�3A�	��
7����e��7{w?���g��c2�7�Ո�E�6�aX��LT�e96f��0'��R�]�1>�`�Gs�g�˜�I5ʎ]V�_q^�7%-ѥ!I� 8�-�l#�zy��t�

�?Q3�:�4ֻ��u g֝��%�|f����r���(P1�H�4����]��1`��#/`zn��. �G�`�PM�Bˡ%�:X���}�i�H�
�Ѹ���{���Aj�m50�+d�~k���=8�SJ�X�g&�l��xSd1�ۀ�%R�o�%č�f��:ca���yaʧ&�́er�mr�N���Q�B)ed��f�[��̥ڔt �Z�/1٥�xi��m�Ɍ3�?l��0����ͩ$�,�N�7��yċ���x� �j��[�ßז��=iӗ��;xC����vub)�a�>��O�|ҘۼHN.,�H�S�?�5v��Ӹ~e�|�☧2��Js7�'ؖ42�!���
n8ϒ�iƟ#�嫐�!��G��qhr�]�ܶ}Ԫ�-$�#�:j��Q�EM%dʠѡFa�0�" �S: ���ErIm7�� I�B��t��
��W��)ʢ���.�l{&yJk�cZD�wc����pT^�hnU��w��~�۹z&�t�@��s�y��fƩB����!OQ�h�tY�{e|2�����I�|T�,��I�s
qHs�{��s�G_b���:%kTB(���-P���o�T�=������{��C?���!~|��&Ԗ��@�Et1��cJ	��,�`o�i�<{�5����_�fdƯ��(X ���
Ij�r_CF���0��򘮩C����a'lK���[W6-�w�\�u7?����A�yv|���0��PSŽ�W�8�Z���HIy��0�4�,���<�{ÎW:œ�!�zt9�R�&j�K
jA�H2���\�	�ku�,�h�Q�Q����e%Xp}���v�0t�}�@����h%�Xg�VC�&9��=
�����֟�Y�3�*C
�v����-��,]��R�\ؕ?S�wr�N��hRkA�(�./�h���u:�k���<Ss�y�T�ۚ@��ݱFZ���!=�h^��T||f���x��&��s���n=}���v��/h�4a���̳5p6��9=y����P}������6c���&Ht5�,�b6�ctW�櫙F�Q��l���2���̅*Llk�C��	4�\D�R������Gq4�L��M�"��9�p�"�s�94�i�o.����X>9HPPp>J�_�0�%��_3��|W�����14�5I�B���C���X��CŞdQ�7�7zY �P�[X[��7��d���sH���=8�H�Dc�-�R�el�Y1t�ϟA���+�''�rlFR���}מ"?>�vcl�El}�G�&���4�eaj���'8|A6,e��ڧ�A�Ӕ�`C	D�5�QmʮÒT����%L��m)Vj�I
�5��HB���C;��4����f����^!�kg��@��&,��=+`e�d�r.����3
�\%��d���I->��VК�9H�!�l_V��.B��~))���Zx�ح�E�[<�[f�O��A/uۣ?>}2�8}stp|p�����h�Y��b���f��o�;��_^��������������e��*�g�⧢���7�w?@�vv�=�����q+�90�	���"���i���iD>�Ƙ1S�<2Q4:}�hZuU(�z�<]�/��u%�=��H�&�Q*���֋��C��������x�]�e�ĸ͖ �&��#�����dø*ϒg;�Z�wc��!��!��ARFi������ޥ�����h��#��d�{��ɳ��\���?�ϫ�f���7P�e��Lg��h�\wHCD8��fo���}oa�7���cu��}��&������(Ή�����G�3��x`W{֎7��d���u�lߊ|y��\�e���nJ��"4�:Gx��R�AF���ux����r�4������������m���|����l5dz�f��
�Tr���jJ,G��N0��1��mqN~���RB)�v�:+M���jD�thՐ�~q'������@o�:]�M�'*�V�	V�xH|T�I�ڀ�q.&/��
4	�TmF�E߁vq�-�&a�����ZN#<K�{i�y('XA�"iS�a�a�.��I��
<�����8w�Mr�Z��K�0k���8|G�*hq�I��ɞ�G�>��%�O(����?��O���.k]5��l�=n���2?��Cj�AL kl�d���bT�-�2s�+ߛ��FRl0Hr~RTڒF���$��໓�n�P��τ�f{K/R#{8lJ�L��#�W�7�4��B����oƩ�S�&�����>���\�����[�V3����m��-x�;#�=�yѬ�ޗ_�;�E�,���L��?����=S��Ԗ�yn�]�.�*�|�0����+mc�	���P6�x{��z�k������\I'�t�QZW�r�
YlIF��$.pY��?h*�Aɼ��jv5������]GE������L5#z��~A��]�T�>�=т�\)��^\\el��	3�L���ρg��Zx����.�+ݻ�M�f��II� ݪG�:t�i�����ՠ,(�t�p�{���d:��:���BA��=D��d�d�6�*z�5`x�܏���<L�g$�o������3Qn�v�a�FC��G�&�ުM`�W�npf^6#�
v"���A��y�y[����G��^�>�_1;�	�R���_|�ۈ��2�+�~(��F�
f\�S�HI��dML�"��eP�n��I\.�H�3_i���ec�
��Bn"��F�8���4o�$s
.,9'*���q���m���[�
�M�nt��6�����Ђ���m���W�����`�"vlS��ط$���,̣0*0�d��M�"�*����[J��y*���eI~��W�w�ڃl�J)�#u1)��t�\�j{{*;V6�֔ZN�����`�0��,�A��0�qL�>��
�%Y�Y�(x�σ>�6�}Q����Gy�AT���4������
M�6�ZkҊ��1-�K�p芔�m��n+J�$�N���J{��靖]��&vUţCw+,��?�C�/C�O"��K�(����nu��HHx�N}{{�M�+�q��pc��I{�m-#��q�-`_L�7v��8}[1�>��e�v 4���J��8��Z��������0�⽃ElU1�`� �̋�`��re8Rp�Q��V��QC07�M��W��q�;�b�[�M�
S�����'��mQ�6n}Y�N�E�螂"�cm�z���[S�i�;ID�~dBe2���,���@i�����I�rf!i0�v~]F�7�i���D���µ�S�W)_gR���<�}ǧ�Ax?�ӎ��L�s�趖Q��E3�H� ��l���mϩ$X.H�o��엉k�	m�L���b�0�טN�X\T��l/Fs�x�Ex�D$������8�@}�o{c��F�:�/p��^��C��{y���t�%s�o8�6����i@��3ۣ�;8Ů܂�&��g�2�B,�'
>>�\��-s�;X�7%��^6����Zd����9{xPn?(=�@I]�g;�-��Y銨��1��W"��������K�ʧ0��8)o�GB��{��p Ǟ�a�.t�����=��~�e|C_�O��ڵ�6�
���Ց4ɮ�
5���*�X����\��,U|}
����Y�� �g ����B_<�
ȗN�W��8$s��6�����#c�~���e�f�@3sN�Š����{o ��aN�j�oTD�/m�D�թ�Ј=mm��z��k�l𣫺Y1��3h^�p6�I�H�A/���h)�C���W��={N��ڬc�J�tK?����Y_���g��
}f6�ٷt�/l�$6���/��nl�7K�k�����O��;� �0C'S:������a!���j�f/����xR��V�C�Ц�@g>�w�1�=LO$H�?z�<zԨkf�㨊V�Ŷ��T>~��x�twHn*�;'h��doc�j>!�H���Q�5����"@4��0�+��.��ǷK1�7[%�
y�"������#V��s�F.���D���Ə?XP.fa:g�A����գ��Hu~sе)��ў�Ohl����q�Ə�Z[��~�O����k��a�i���e"1���3��'=���+'��d�p�hu�Ћ�cb�Z`��9{�,о�{
��Lg6�n�%�"yT�\H^5�CsJ[��끼����2���c��3 ��M�2�Zh›{R�Slw�(��[��>�oS�Q/%�ض~��ɗ+����*rf�h�V��tk�D@��
ٞ�Y���2��7�U�R�@D�?EJ��N��'��V�4��^�oX(�4�dm��Ҭ.I�9��_D�8^�r~��jP�B�#�P�Jt�~Ÿ���.�7�zI
�Ȳi`�wf��
 "�5�U��P����+�&�l�F������K"�W�/�q��i����GҀrc�o�`��ƒq��⣤2���kT�#'�Ћ�*��ù�T���&Z�[pX��s,9��CךC�u
Y�Rx�	�#�0r-W�z|�G��@��)�����n����{�ޢҫe�vL�nj:�?�gc{�ưq��7k����aw,��ӍE�wd*}O�_�eU�&aey�=`k��ķ��r�#{i#�}��M����G����~󷓃�u�s�����������`����sU��NG�:/p��'qR�u�����\�+�I�th�X��^��5fh���2sq����'�T�g�����ha8�>������I���!7/^6�5�w�z�1�-ܨ���l����Vw�u벹����tj;UĊn�&�M��6�dFқ�H2K�%�qv
�e!����-b"��˃����x�����&��
���
��R�1srĕZ� Vā��@�hY����T{f��L퀖��H����*O��
���I����T�s�'��ly�U�xްΔş
����ɀQ����&G�9U�����	T(1���rI)�L�Q�/��H����8���ݎȄ�Ku��6n62�]�*\]�w�2څ�;���+Z��.@b��f�xC���̏�����q�/2S,}J?��'p[s��,�߾ͭ�I2؅��Z�N�)��-���PK�yVS���5�"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,�PK�yVSe�4�#pip/_vendor/resolvelib/providers.py�Xˎ�6��+���3p�S�M�Y4(��YZ�D٬%Q%�q��=�����"�]Ö����j�1l[�ye���E�B�T����������_D+��
V��V��/eZ�3J-:�[&{+t�+���=�[���7���	�Eð���9��h�u*b���}-k(��O&�*_D�x����Q�i?˔B;��nބ�_�0��F�d��)Ml�v:X�O*}k�4sPc[��������a��{QoR��wͥ쓲���:ɢ����1<{aw��Т��**�h�_��̅{�R�&>�L��A�8��K^��HB5-ϳ�
�G$�3��eGqv�޻䤵Pr
��Y�$ˈH^Pn�챃v����H�&:����/��Hm���In�I���ㅷ#iY���ҳv-� �i�k5L5����m���0��?�mV|�LJaSyfE���(6���,���V�A�xT��S�Ɯ�:D�Ү���|d�'�X5��޶g����Мږ}�PLYFl�.[�g�L���Q�&�E		��ԙU�oZYYv����k��(f�<���љ�GA���5lP�ȲM��6��\�?�(�,f$�e&�`��4ߋW�pC�ÅM��}d��յ�Xfy@f&��I��9�u�넦�2*_T���i���c�����#
#��W�p'�Rh�>�F�E ��N�f�,���%�H<n%\��r҅/�ج�]|��h�j�B��EweI.�O��M�	�*�'������Y9T�*	p9�IK5:�ƌ@rH�ڱ� �z]�6c�����@���h?�j��9܎�|���ڧD�oꄧ-�F�̲ž�g��B��Dp�:D��%UU���G?[�?��3�U��W'SeG޶��B��
���U�vC�>3�IӜ/��B�Lf�f#N�MK�<
g���5{f{�����dY�d4�Z��UL�SB�H)s-
[��q��إ��7i�sBI�A�S���%'ٶ�؁�),
̆��	���-(G��w(�B�׌}E%r�G�鐩iX�)���崾�����q��Z"��#M���ˈ�yk�}�?��@[��4�'B�N�F]�n@��������`���1f.QO��P"���+�#� �����`̒2���t�	��~ƒI[Lݜ��V�-��+�`�ׅc��.V�UfƂ¼�~�y�g.�zk�i�޶ms!(��]��	�nblK��<{MUa����|��/����-��!���_?^�ࣙ}���E��(�wX�N��T�,�빨��1gw�~��#�D�-ŷ���	�z�Ο,	�I�Y�^���H��*q��V"ɍg߸�����2#M��"��O�M����z��MPި+tF
�W�pM�e�<ֽ8K���������.�\愒�|���yD����>%V8~���d}���<IQ��+kv�Z��|݀_�����	�)��I+���h:Ɏ��
_��=�%iݤ'��斕J��\�)i�oN�"ZK�d�H���%�0tk�S�Y|�6I$x�f`#���M�b�[I�M<�������7Uvs���7wTt����(B���rO�S�N2��2��bp/߳���N���vS��3�#>Ș;I�`�f^q��|���Q�4�.���p<q�_p�/�(.2��5#����0=�,K!Y�%��&e���[+֞w���4(���J�zb
t t�n`a��7]�,�q���a<��0���Դs ׁ�@\!�Kbv3d���{�Z�z6������ױt�K�
��WTP�)��!�(\1�%����]伶o�PK�yVS�_��T#pip/_vendor/resolvelib/reporters.py�����0��<ň+�<Ƕ筴�=7{n����}��N��Al�n�؞�ge9F��Q���!I�懨�[��z�U��9	��l��2ZB����0���J�J�$�a5����6Ql;IL2_�Z��rE��xG�R������߃��[2N��)�
��Rk�X͡��e����*�j�J�5q�n.�N�\&�D�y��Lj$��ֲC�������(T�	�3
��ә]��[I�ql�+gV�!��Y���c�����e�Y��ʯ�9�K�N�����wU�q�����H	��%
Å�;�X���24��v���f�Yy�k�r��++���B�a�f��Vu�l�Υ�!:=�F��B���19-l�.[����1��C��f����#�1ϡ�6�#POo/����C]�3/
��)��:5si�0H~O�m�:����J�r�:���̳R�=�H�j7���RPK�yVSc��2�D#pip/_vendor/resolvelib/resolvers.py�<ێ�ȕ����!s3�}j@�zǓ����1��4%�Z��H.�lYk���S��ݳ>j��ԩs�TY���ؾ�k�D�șP�ڎ����١oO��IT��L���C_�O\���8x9�;��0��ԗ�q�n�/e׉�a�v�����כ'�ϳ����&�x3�6��?��[�HMy��0v5_�<����{�	��we���gKXl_�R2����y�����F���?�])9S3`V�5�f�d})$���†����Vc͋M��
�'o��'��XWr�ٱl�ƈ&��>4�w���:�;9� 2�³R�f<f#޶-a�ms�rj�PCӠ��وF��B�b�9��#G��E���ea�8n>�(�{�=��1�XxK�|�& �^��}�6/�h,��	HE�V4��w��_{{$�LAr���b�\YPN�nXT
9�����N���f�5gWI)��Ab�߿%?~R��r����o�j�dM;0	�*�I�h�����LX����q&�,�%�T&�=���R�j��#���c
��K��c�`�g��c[W��=��^�Ɓ�5��
g��L��:ˇ@�y[���D/�����(޶Q#ԪhB�V�!��:�Qрφc90��ٱP���=u��N�b\f7���i�
�о?���[K��;0��XqF�$�B�5K�i�Z��t��kZ��9 �Ո�I�I���F#����Jm#ٶa��`�r��B�i�n����`�#oh=�d���	L��nf�7�[��?0��J�>���]jY,
$=�q��#�!0,������	/��O�P��#�{��E0��1|癍�� ��d�������7z���Tb�Rڷ�����A�� ��_�h1��F(g	=�Y{6+4e4�+�$�5�ZZk�WLE.�`
�:��Z�܆��av��k��Ev��ϼ�_��76��ȡCV��7x
�Α-����~��b�t{2FbA��G
���R�Ms��7�2e58xT���X�(+�_k@�=~nۏ�w/�`ߎM��ÿÕ]j����!�����~�!�$Z�{�F��:d��s���vRɆ��
�S���q�4��N�	�a�}_���]�?��1�w���᠇*'�B���}�G�f?4֫����;���`�<���e_����T��1I�}lA7���>��'=/�D<B���W��;�	.+��_n���އz���{;F{�[�O_Hp���#��v����gv6�(����7Y���?�`!���6C
{�\��w��B�q�T��5!"���2��{��ߔ����#�^���Fk�A��b�v��2��������X�Ԕ���ͽk��| �X�_>�ʪ���`���w��I��v80�:dm����� xo�����i���<|�n뙔�,��p�����Ƈ��P�g,��'	��"Ւ?Ϩ��a��f�6[����d�~�"Mw��:���|�\%_L��8���V{T�3��e�L�~u�ݰ;o�pp47��o�?� a��,�Ɍ�-�b}E��(9�+/���e�:�,r�{]:}|�^�a_�\�?�5��
�BKz"v����<#1ɛ���`���a��{e�L�Lj�������1�\�`���X�؅hʔe@ �M0�R�	y�VS�zV�<X�TD�J��W�����3%��[4���⼐��أm`]��
9!ȗ)��΃c�G��;��Dy�\����%؈X��g�誥�_�j����WrX{�f�mLC���tDu;�^%��Y�#�MV�99ё�,@�˺E��G#jf��2��#Wv]
�<X17�<?�1>u�G������^gh���
7���}@W��7eL��q%��-<y��gLyfAڌ��Xq;��ڌ||y�~8rH,U�q�/��MP�/��H�=���Be3�f��uDj;A~ap�v�f{����,�Įޠ�W\U!���u(!�x��Y�Mʉ�
��>��𚠉��H9/�T�`�A|aA0��d�_�`���|�&����~�%��Y|����L�Tf�M�|;(��}�r�f��]���	k3��P�2%��佰%.��"JL�I%"p֕a�\��T`�y��?  ���.��e1�
�wm�P���fzׁ�
�h9��gSo�y�`=�ۤ��#"�kd�CZV ׊a�	h�"�S�HL���+2�vt��{�6"�v�߰}qF~v��ފ������+nnBz��R�/�>������0^�5��N�	��5*��C��x�̗D\�<��/@��%�%y,�8��|)�ׂ�
�Di�V�`Q�c�dY��0�)���s=��U��ݨj������f�h	��Q5�'L�8��%H�JDD�)ЋxD�f�t_�ԥ@�:��7��G!�e_�_���?�h�N;�;v�^�Y�R��D;�bۑ�1D=A�-��OG �b8�^<���瀾,)����g�u�� ��֗�&�N��~����`��KU����p
�
5�K�|(A��_�GD/�@���@D�,�
6����wz�xX�Q�׼l��`'&l�_c<E
�UDf*tK��5��Md{?�S�%PQ�J�`�H���S�:-c&��$j�d���P*�lV=��}���TG��#�к��;����i�?"L6(3��e/W�����c����e�/b%#��~����ދ���/ߞ	U�߼�$�_N��|䃍8���M�b۞=I�*��z6�u���7��+�al$`���e�i���)2���3E,PA`23?��>fs;����>;�j��b�^Sn����U�����v�?���y�|����f7�.W�����+�/ @j�	N�Lq�)�Ta��U�V�� MS��=�?y՛.a�i�̪�&M��y��q�R�t�Ÿ�����A�R�q�=s�Qb�c�r;�\�;��|x�r�������Y!��O��F��6Ѡ��}��/
h����pbܘA�K!�9��(�l.'�/��PɲM
��bs�3�+0�_6Ԩ�O� U��*ۡ�6�L_����W�R5��cb:�fl�o�X���þm��O��L��%���w_a\������͘��w���_aŒ�D>�_P���ns���x�V7~M�Ҵ�2�x�7!>7?,�ʁ,��)*�4�/�*=zt���j�{�d��VW~���O�Q:I��xU���L��h�'�c���q�ܜ�5�����_b�B6ө'��Y��e�Y�r�J�Q���@E&nl\�C�T�y�������PM��K:�1%K�|��.�l�R�j<V{�=�S,�(柨�Ҫ
d�8�q�.WTM�4�_}>�z`H��6�ܐ�>߶RY�S��I�bb
J��v�c�)p�$�E���n�z�!��Tqec�'ڎL5j�E3�iBI�����UDn��SE������A��8P{K$".���t��pa�x�*>Zek��uWMyz��zws��,���C!6���}��y"-P4���:����	l��$�8�t�F�"|�X�+[�<HrxC���f:�85��.�b�z��jR��|�b]���S�r�RMv�QDszֳѳٌ*�R⫁�ʠ��ڦd��l�(&�
ݍ�H̗�lœ�`U��0����{�����}���-�w�Zt���Uz�z�z���1��SC�J���ʥèy���v^9���ǒ)b�l�[QR9�:+�E*L��5�����>~=-o�cP.4�K�����
�J���2�6�*�AR�DJpL�N���୎9u~b��#�oVZ31G6�RT��ġ��e!�\O�h��G�@rb�3M�T�����h >ϖܲ�6��ӛ
7�%:��i".��� _C��l�dYXz�&�D�Vx9-���K���JZ��E|�ٝ�ǐD't�M�B��{ul�?׍GaO�c�ic/�{(�Ͳ���wao�3���u����-;@�ʮgعa�SY����<&�jkh��u&i:=p�;Eqj֩��ݸ�d��&��:���V���}`d��)S�jY��[�'�s���']��OG-�0�V�Eln���lkNto�*�F	�iHZ2y7��\��DJ�Vt����8R�DӚ�^掊O�.��A�u���>^5�SM�$�Ճ_�w���]�'4�l��ޥ�Թ�ۗU�ˎ��.���5^�����:�zEm�	?���r����(m s�%�= ��4�l�{Qa�|l�D��*T�Sz|)8��Cɶ�&���T�=#���C�T^�ވ��)��Z%�B���`B���D�idt�@��^���7%���U!�6���n
��Y��.[���
�Т?El�ؾW�i�Vl�[�ɡ�u���T�H{[H4`D
.�K*o5�i��Xx(Ube�&�R��#��=)�y8P��[[渴#�C��IpUr�at��y)s$�:��Fw�����n�Dǝ�S���u0W���r�0�j�I�Y�ÂK.���PK�yVST��pS�!pip/_vendor/resolvelib/structs.py�Xmo�F�~�bz�*�j?Zu�6m��jT�Qjɲ8�9`��rgj��wvY^8�Jr:Y�>���YYs��)��Bn6��%�	/��w�&��JF�>�l6IK	�2A�1�]�u��'��_l�>��g���A*�$�'�rH�`z�2$ƍ�H1�(bSQ�I,2�I��0:��,A	��By���qq�E�����Ol_ë�p������������=J��=�^e�蹮�S����D{J4ᕊ����<[*����Y�F5	�۹yJ��N8��E�O�x*g����R/�U���V�w�j̓�qO�w�0G�-8�Q�|!%����8W��)M�R�M��8�/N���k��)�������J�X�^�Q�q f�c\4��\x[��Tr;�~�%�>j�δ�
�nϴϐ�i_`ɏx.�
��`5cdHA@]/	Õ�"�κ�7|�S��r�4��v"��V�Q��s�[�1�=�T�a�)�Cv��t�x&r��C_���l�.���J�>
ֲۅ�u���7ԉw�UһX��5)��+�᪋8�rLS<.�i;FN-M�����eX����,v�d��i�G6I��j��g�@��"X�1��BzA��?-�"5E��ы<5�'��ӵ�j*E��U���'��+.��zSݽ�I�V�������䂞4tRy��W�8�-?��4��j���st�5�}"���i)�>Jo�1?|#��ې2_��[�>�Ґ�5Z��HrN�=�^g��D�M쨵ʢ���(xQvz�z�������[��
~�p��xἷ�L�ߡ�M4*��V�u[�hΜ���ø��}����l�,�n}!
�ZW�]7Lr��s�G�B��R���ϯ�%�	y	ޡ�8�1�;m�/tth8m��#����]�Ԟ�3&������4پ��O���?�бf"ԝY'd���`��.cUJvT���w�ohw��ۙj�; H�E���
�^V����T)���"�9�ǚ���iyَ󯻬pA�Dޒ.�%���"L�"����P6�buAVY�2�}����+鄫Rچ:�A�Ԇ��Z��	��[�h߰B���F��o�UB
�Z�6ygnKA�b�ɽ�9^>*���<Ԏt�!͚��(
��m�s,�;e}�-�������R��8�hu
����H>�?H>y�y<v•���[���p;���A����%��vh�S#5|k����1��$
b�:��.�z$U�@HP��Iح���y��<�x�.
]3�u�΄�:P&����FK��O;�F����_4���7޲������ws��	�F+�ٙ��:�{�^�92$-*�Xzr0�wQx�D��Ě��h�]Xퟁ�PK�yVS)pip/_vendor/resolvelib/compat/__init__.pyPK�yVS�.gc�0pip/_vendor/resolvelib/compat/collections_abc.py��O�ɉ�W�U�V�M,(��KW�QP
N-,M�KNU���*)���R����\�������b�Ĥd��܂���^�N�Ԋ�ԂO��kQQ~vSp�PK�yVS���QG pip/_vendor/tenacity/__init__.py�<�r�Hn���G(����]]�y��g�ws�+ۻS�)�E����H-?,�\~�{��X���!˛K*����h
��=d�z[�ŲboN^�����u*E����K^�0��.RY�-��}�ۣ�c���
&g��E��.��rYs�/�|��
r�[vͷ�<MDqp d,�R$��������y��	�	��<co� �H�ƿۼf+@���K(d��2L<�b]1��8_�SɳX����DF#	��E>�8@s�_��܅c�"��U���z��lBN��y�x�*��Շ�󋫛�c`���RQ���Բ�eζ�����πÔoX^0�(�U9�)d%�ń�����B�D�U!gu�	�p�u@T<c��vy3bo�n.o&������e�ή�Ϯn//n��kv��������+xz�ή~f��z7a�d�ú@��I�"	��F��y�*�"�sú�E��-�{Qd���J���%���T�d�+z�YTxp�b�:��<OK��ڟղ<�\	�{�F¼d�y�Dfʃy����L��=��3���JT�<Q0q��uQ��b�����a���,��k�?Al��`��j��)��2��a�Q[�+���$!
^J�C]��BE!T��=D3Bg����a($�Іo�=���@r)�Cs}t��ǒ`
�����V��^�f�y�����ộ�hR/R{���_f0b��=�%Z�ɪ���*ߋ�3D�w��("^Ub�no�p"R���.h�r� {���Fh���RT�g%���GRg}���x���K(_�s=gB�Ò�����8���Y\�"o�l�?�_������̀�E��N��E,��™�M�l���,��(��2��t�9���>�(@MCYR���4zy��KVngH>;���x-�)�`#�,��Ea��2`�ْ�q�'��W��e���Z�Y�C�pH!��N�Qt�Or�&�䜡���,
12��Dv/�<C��p�rn�,��1��Jd<��8a:�ă�!�V�!���x��@���#+D�^�׹�2a����0�N!b��+�
��ZB�nga��C�O�8@�x�M�\d k�x��_.��.�!�~z�௉�@f�f��0�q�;���>`��}�A@�/��}=��r|Z�砄���kQ���[�y;����4��A"��
�ٔY�cv�m󤖷�e98�(�Ţ�ͳl;aGG�׍~"\
��?[�w����Ԫ�C�%~�`�=h���F$\0	��Ć����+�W_ V�&O׼�+��[祱2xQ�旴����Ul7y���E�lӿ�����+�#`ߩ�
|�������T&�zdPj;g����NO�k�k٩��'wc����BG���� ��bz`aq7 �`��~�?�%r�f��|�
c�L"⏠3LV6�>�����0��DE�+�+EO$'�~�6@O�:��u��`�|*쑄\p.3Y	x$ vJ�ע;�'�a8��q�ڸ+�N��{�TL��-��h����@l^h��v���l�6jƒ�ࢋ@��m$��2nFc��@��p�\��j�~|��!���QYK`蠭�8>����۳�����N�
��T*�쏎Au�%�_�h�\�i�h�W�닛?��V��-�w��:=Wl�n����q����+�F1@)�>����Jz�U`�G���z�9��k)����ˊ����8fQ�FESU�qʿ	����:@?�"MJ=��/��ˋ�n���{^H2HU�!/�zHŢR���:A���H�c�����SZ�Lp�s��V0�򘪙���x���~�~x�U���N>C�w�(��b~\��cP��k�"d5����QcpT�w�1����K:7=���N�"c��%��?O#Z*=�
q4t��u0L�;z�L<�G.��f�q{D�}0�H֨�1hTS+��#JrD��h�H�@��q��K���ƨ�|O��,����U8}��|zB^�:�4ֳE�5�EI)n@��6�Б���0�r�1
�R�x�rB�A�&��L��wQy��t.��V�r2�%�d�&h�G��b�Tk!�ъ�uhu�G����&� yOe�ѐ<]h����kQ��r��
#� ٨ب
��0ٍ� ��p�e*�@ l=��H8Va_��;���c������v��d���V�l�ԥ��R�-li
�7�b4nm���<��a
o���� n<B�$�H%T�oT��g�V���I��,����@��A�(3o� R�Y�>-�,��;OÜ��23a��-��)f�Ą9-�c?��u[Ԕ��l`G�
���FT�8�}��g�\A�v�n<��O��6|�um%�������	:l�u��\��S����Iߌ������ �x��g>�Р�6��h��c6p���M�����ĵ�b;u3�Ӿ�6�;M9Y!mstV��4TR��W�j�Y�:��<Z��!9eh'0���ҵ	<��R�N�ݜ`w&,����:�z	�tĶn�<s�ӿ�!,�(m����ԣ�}��!kv�T�B�_}�"æ�ئ�ΩS��p�� B,��Ő�8�c�v��r�7;������͡����ڻ����{im3�=���x�]��;����k�v
fV�"vMjCw�C6����tm_a���g얚v9��g��;�U۱���./]��2C�T��\�v����sR��j�T
���(Y�5$A�A&D��RT��~��6��IX�9�8A�2f���q�-h4�'��lA���N/&�KiMPZ��Po&��l�!Cp�Ћ��q{�DI��']��Y���:z5�u�H�����:�]�r���}����}�w�Bk������"c�b'�2Qx�O�����v>Zm|j�c��5��P��X@�.�6�����hF�R��F���ߎ�R�n]�
W[+c��eYɸl�\��d\a	�xϣ���q�H��`=-���ΰ��6U��%�[Yx*`��<s�
��(`�Y�i
�ʒ�L�̄Ȝd9�'�Ww�@��r5��Z�^�u�n�\�}�"��n"*�6VCu)�u���WX��@�+��V���*�Q�T�
C��۱6|k�P����D�[���"r���%tt�8?:B9���,y���c�2��Sr�<a�\k�Ea��^X��Q?u�jB}��m*�x)����`ƝH�[p��0�����g��R���R�Ջ��Aw�����&�j-�r KRa�gy'n�/nx!�����H�T��T�Î�ot],�5����TU�V�Y%(/T�[��Q����K:6���,�VIZh��jyd5��K��lj��M��%�T�ڷBA����xG���T�a�m
��{���>�7Ȉ/�X`!�n�y�׃ơO�Ľ�8t��SO�N�gM}�&�
V�h�m�g�HOZO����ǧ��S���Z���=7��>D)�������5� t�ؚ��>|g�?�&3fX�ypԺ�n_t�"r�p���\ryw\�*=�h����b�����9��
��ͮͦ�TZ&mF��Wq4���;T��Q�=cp�E;n�1e�E��9�����V��x�D]���z5M~=-�WF�<w�,FB��W5�m}���s'hc��������0�+8��w5��(��[�^��ήY��
�]A�(��vSl4��5���3��t9��>Ȧ����+��]�`�MX�>uW6�5fs���r�A��l`|k��F �X�@k&��_��;�RÒ�w�À{p���ћkw��&}3v�B?�ڛ����i�p��f��f��E؇Rg(V�
��R7=7���w��
���U�P����yuZ�zW����o��J웁"i�{���A������$\�˰�EuI�^җ���*�^d��U^|�/�TiK�Z��:~|��Ś�M���*�xn��3RG���S�1�%~��>���A�H˖[��-a�5b���=�7[��E�j�P�
���qTE�H�"���@hOk�x��O+�ꤻ��L�
�x�M*�D:��0'̴R��@kge��w��>^�����J߼qr���4��B�ՠJ�N���3��*ZԊ�C���Iq���4���N�ۙ�3�V�_S���N��%.�%,�?�q�^U�é���{՞;ɭ��֓@��ǁ�4Fm`u��4Q��E)3�pg!*���l��ϯ)�YoWQ����-�X�
�{1TT�msL�I_
p�T��Mo�3��d���ԧ�$��['�qOa�mH�{���Z�U@5�qM�m� '��ηd�6Y]��&�ֵ�F�����Um��2Tv�A�σ���-Ds�ۻ13E[Y��|�o���az��T�7gX��H:�_ucd·��Ԯ}	��6��4u���0�{ނ���}�)�e�o!�SźZe�aïU7|�y��,�"\�(�펷��u�����]-꙾�+,�>�yF�����v��O��/E�bD������<��P;$ԏ�
�e�w��͗ÝF��C#;�����"���#��5�1�3�:6�7+�ii�v*?`[k݅�2�H>zGV=��`�6$g�kQ�vP�R�'L�4U���
�]��ۯ����X&�@
W�}�N����{~�qϥS�
�D-It{/;����b�wh�ێ��t��Ǯ*����^P�j��t*|~��{;g�
*�pCp�����1����<���4�]�dX�b��+q�TZ��T��^C����ꛜ�����40�~}�ߗ�M>h-C6�3�}$�U�P����sn"�S�-Q����t5xlZK���᧱�^;.r0+;܏O�(��\��/��qՔ_�W���C'썓A��|��v��b�?<�I��v�4�}և�=���{����'��3E-b�Տ�o���*�k��{�%y��\È��W2����c,�/^������ɉ��T}
��;�Z�m�� o}Cu�_PK�yVS�ml�� pip/_vendor/tenacity/_asyncio.py�V�n�6}�W�)P�4-
ԅ�:��z�u��I���G6�2�%�8n��w��:�.�|��ՃMrng��C���W����Ͼ����p��f�w����H���(�=b����Ler�-���~��[���2���H�=OPh�B!h	������*I��K���V�S�:���a%X�S!
�א�_�
p�\�g"AXr3wa*'��P���H��~N�tS�q��������r14�jv��J����z8�>!�N�Nd�5(�TpEiNV�r’�	!���6SH2#-֥↋YZ�f���)�F�IaZ���Q��
T*&���`ԁ��h0
���`���n���p<���-\���͐fo�?���W! ����K�,~�m	qj�5BlHe	H��'���l�0�Ϩ�9��v#5�����/�aƭ�$y��@Z��H��zA���Y���K�\�+�p	�V��{�(�y?��J,�fU��En~e����_0��hԪ	���������A����~ɲlD�C�{P�(��Ы
�W9�3�wY'���*�*
ko)x1��g�x�u-���%#"�m���b]�b
q�7q�k�Ұ܊.lE~|L3��SX�KF| �Aq6!�NG`��Xp���2��tA��	\�k�9��w��m*�	A#c�#��gB*���9Q�N+����ŵ��0a3K�n�Q�X���im}����hO]J��N��N�3.��kV�ݻX[QU���K��|���ʝLE/!��=�B	��]���6�*66ɱC��[,�Ўm��m���
O��qA��T��S��ۏ��.���"3�٢S*�q��.W꯺@,˯ݐzUײA�O�?��դi41��>���fD�T������C��>�t����}%s�eO�6S���Ɖ���_L��:��H�*�OE�F�/�V(A<�6��d�څ�o��f:h�Z�_�rC_�7*�AC�?�
�-��b�C0W�
�������$�8�O�r4v�9 dL��vSlb��葑��ꀼ�[�8s��UUjg�5����;��.�:�
���\���l�+��r};�֩X?�k��m�t��n��D���^rL������|	��E��s�:��}M\7�� S�^9|Ϯ��U�9�K7r����g�������F�
���������Z�ͽ�c�2�PK�yVSU<k}�pip/_vendor/tenacity/_utils.py�Uao�6��_qP0��q�}�
Z�-�Z{��eEQ(�t��P$KRqԢ�}GYn����e�޽{<���J���t0_|/j�Q�5��U�;;ZV���0#�������9ܲn������(-fPK
�+"�R�u+C���J�$C��n)�@���"R����[ȹ@���.!U���a�]٦�HB�x�Q��c�f����〹Vp霞�F��&d��P�b$� ;z_����9�mᯥ@k��*s�Ӥ%ekR(��V�5��֍��bV�n�Kƭ3|]��vʨ�}Y�$��e�D�x9$��xu�x����6�����p��_ǫx1��_!������l�4����O"��3���@@����Ɣ�<��dQ��P�h$�Mŭ�HK�2b�⎹6rTT��QBe���FU�G/S4�ؓ�qJ��$�DR�G��s�Wu�LԴ�t7���om��h�))y��%~���E�
.���&�9Ü�Kf�2�L�����?��6b��Z��m�X���?p�gm���L���S�až-��>���o�x]�����_]mh�]�1�Ћc�u���c��NC�C�>�9�x�O'������)��;��p��ߑ�:��O������@��L�5K�*��i�t�-��y��p�d��0i���#�#���9�P3���xb�n�s�Zm�m�5�6*�SB��Ԇ���t�����Ob���[,*��R׾}�F�i�:�[���QfD&��'�`�ہ�n�̌Q�+�ῒ�~��4�_ݏ��Qc�<9�:G�h��2�l��v�X]r��)�����s_*�?�������EPY�)<�4��돇�o�?#�j� |����2
zPK�yVS�����pip/_vendor/tenacity/after.py�T�n�@|�W�E��4��@�J��BA�QE�a�͵��{�����{��i y��Ȼ��3s�`����������Vf��K������R�H�LW/�g��fb
#��h��\���J�%�B��4��Dc�Vp�@����?2�Z��3���E���!�C��T�ȤPB%iU�iH��i(���~Jvq ��"*z�nUU���ڤ�l����`8��Yl
�RZ��Ұ��D�Z"�d���@�A�vZ+#I��V'T	��KKF.K�j����8*����a<��K>�w��z�M�pݟ���x8����x1�N�����>��w9&^��q�Y�tb��#�	H�F�-0���ؗJK�"���b;P�ɥuiY^�,��%	�+�L���!�u���C!� �Gk*IZCK��幤�	7?��`4���=��`3��5����<C2�Ȳ9�E��bL@$�&�[�b��q�к~���
ǟa�n4���w�1����ٽ �5ZhH�-cխ���GË�e]�;�n��=f=�O��Y�B>�\P�m�O��g	���Ĝfw3oo_z����޶�뭻�V��(�O6�J�_PA�yA{��9t�%�W��I��٩o2���b��V�2�7'H�BW\��w�D��b�D�����V�<>���;�
�bZ��W3�Բ��+���U	['�UD:�&�Jd{R��BU�K4�' �I;��&9�g��M�<^Մ�PK�yVS�}婽`pip/_vendor/tenacity/before.py��Qo�0��W�DI�M{ȤIi�-lU2�tUUUȁ�flf�R4����ִ�P���s��s19���Z͋��ӓWo�S-8J8g򛪽����j��j�/�>��7�f-,��P{$��)J�ԒJ`wӊ��3����J�ixGN�K��9����L��P$n ��S�,p	�*+��Lnw�6�IH׃��ZFjF����:`��Y[M��iBց�Jcы�"�͗�`;��hh�QsM1�-��XR�%B�PX��֬r����"�r�0��qc5��voP�d����F�$���؇�i�y\E���rW�z��D�Vk�����&Z-��L���9Z��4&��+�	��b��#��2�<�)�E�
�Bݡ�*�%7�A���E�[f�ʋP��цJ[�mE���kUBū0�C�)Z�,嶅A�ԖC}��n��̓�b>�L'�5h�*�����F��"&^�</��H�1�c�#�#�4�q�	������RI�!|�?�!%	У#Q�R~f!Sh`p
I���9xԴː"��
~�b%�PL�$�n�a������l�AGv�hdo�)5�D�)�gƬŲ�=�sq�������z���]�}�`���������$����,��HV�S�0�����gv��}\�G#��3.��sb'�.��G`y����p���Q?j��f�PK�yVS�kbt$pip/_vendor/tenacity/before_sleep.py�U�n�8��+�%��-zp�\�m���vZE!��Hf�&U��"��R�c�Yl�eq�<�7�O`��ֈr���?^��Z
Tp��w]G'?��]�.���9�yF_�`�[��2G��Jd�,�P+Z�FU<�GI�3+�����z@܇�bhu
"U�Am�(��BH�ϰr dzSI�U�����$�(n{
�r����8�.^;W
�ϛ�a<eڔ����x2[L�Hl��(�ւ��0ds��HK�W�P��^���^kc��L���5� ���:#V�;(ԣ2��Rq�h�E�F��"!�/���������l9�,�z����t9����{�n��tv�R�h����O"�/!�^����
3Q��|���%B���(����� -�ˉE��p܅��L�(�
�q�ڊ�0z��Xz�*׆9T<����NHKyE�Ö�O���dL�>#�O���,�_�_�9:ӎ��ҋQ�X�
�6�V"V)5ߚ�N�G��Æ��8�fZa'%��w�2� �ʖ���-��mJ&N�w��6�m���'��T��!�����j�Bz+�%���\�]��ľz^��ү_��|K��o��6�����`�33w7��y��+δ���kG�Y�i�O��7y}��
���A��*�;.k���pA�*N���i&��iJ��`�n�@�mojO����|�n�c�7�!�/P��;��&�ڨ`�914j鎔<�'������l�Y��Ұ�T��Sخ�ֻ^N���K��y��+ѥ�W<�'��~[�B
�q��}�)�w)ϼ2n�,fZ�4�,�l[z��mY��Zg��ae�@��oW��PK�yVS�l���gpip/_vendor/tenacity/nap.pymT�n�0}�+��L4tݴ�N��
�*L����	��&�3vf;M�	���خ��AG�pb�{��M�0QE�y��pq����m9J�p�ڰ��}	�\
�5��<��̶d0cZ����3�{KV�L�u�K���4�B)i
�a\���ve�HW.�s�9@�.���P�vD*��� Qp��`a�KHԮ����v�˴$!Qܷjc��z�q�����
�UU��
�·����|2������[)����lnj`iI؆
V��r��f��Zin��`Tf+��XRn�������(*&!�0����x@w��lq����r9�V�i�%L�|5_D����=|�G�@����S��~�]����b�#�j���|ɼd9B�QK��7� 
�K�E�����L��Tڂ�;���q�R�ކ����d6���O����jd��wR�Ģg0Q25#Ȅb�g R��A�1vP�D�ż&&f!E�jC�`R:��4��?�!�݆�SǴ�$��\/��#
�vO;p1��� �T��]i=o)9@�!<�������_"��^��6��dٽ�S�*ƭi�ţ]���6t�^�z�I�zME6h�#���S7���]nC�p_6�Y&Ğ�"���s].d&��s�q���b5�m���G͛�}E߂W�[R��;mz�)r@�f�y���B!@��?J|���A*X��&CW���l�~�/PK�yVS�R-���pip/_vendor/tenacity/retry.py�X�n�6��S8�Gi�a2�u��]�q�"
��(��L�UW���{�J�D�'uҬ[���U���|����"�%�/�>z����u���1��bF9<#���:kR�B����9��X�o?9���K�ù�C*;(���4�����AB�����7*S&8�z���]��u@�\d�DP.d)E�B�b
�c@�C �I�(��Zj���B�Ai��	��r@Ta�B��r�Z�<R�	9?�K����x8�LG�hl!���4MA����,��-���1Y��@���֕d��yR��QB�*�f�j����0T�Cw0��O����W������r0���pq	Ëɳ��b�=���~O���b�P
��Hm?�ti��5��e@$J�҄,b����S��Trt*�,�D�h^�(1[2ET�����B!�YP=b,̓�E��<zW׿���h������")�����?P
�)�I�T�*�IO���t��d�?#)uP�7x:tK�n�;�a�I�@oC)��/΀�St�h�l�8�� �ؒ�����F�j�}'�q�3�SmL�m�.�3!���KP{�ø�XB�(�3%�Y@�n�k��Po���AȽ�|���)0���}N1i�������((��-
�N���,V
ic�s�:O,;�m��7$^�<�۝R��s%����l�pw�^��/+^ܽ��rx+�+֦�<`İ`�,4!�EE�e����Z�_]|�.�77OьQ��W���p~"8m��H^
���_��:�La�^D�/���EE�(g��&�[CP�ȭ�U�����Uz�6��H[�f�I�n��(1��G,������Hlq�k�h��ܾ�v��*�(�N�V�,�Ը�x�g}��P�˻2h�h<��҈g��^��,g!�%�2�,�d�ਲ਼�n�{8�܇C3}��_�QO�w�2+&�p�q��6�8~#�ː؄�:�A��u��˅E�T��=ExǾR��������"TN$;��iz�/%�ϛ���&B��	�gty�%�L���@~�G�OM}Yb3�7�{
d�,��)j?Q�⮅��l^�$��Y^�bM�%�U�!��w��2_Y
R;j��n#)�t����
:���O�,��Ḡ�;=┟,
��a�}�+���f�Tp�;@���s��;-�t͎��C��m�õt��?;�/J
��Vh�
K��n����%R�񈤞��i�B�w�g:�7��+М�G�m>U�o�@wJ��������lI�ښv>lL�����w��jk�1�k��3�{`�<�q�~�|;%�eww�0S����=8:z�*�g�:27�_f2�I��^IU�/W�CV�?| 1o�G�\�B���W*�*e�����[~�՟�m6"ǟ�T��7��-N�߽��PK�yVS�V�u��
pip/_vendor/tenacity/stop.py�VMs�6��W���#ӎ��Ag��J�$#wD��8 ���-����_��J��t���Db߾}�u#U�5/��^���Ͽ���_��Fp�p���	ΎP�N�E��i�����/����5�)����g(
��HZ�@�,��M���6\I������M(�Dk�@E�RYh7Pp���k\B��Zp&3�%�_fC�ÆB��������f�����r�\F���./E2�&��4_�X�(�h��6�5���d,%��-Ai`�F�Y�.5�\�}0��K��Xrn��ic��*�~���I�1L���I�'�O����9|�f��|2��~����d>����[N�dz�$���j��H�,��#(T+�Ԙ�gԗ,V"����v�F]q�iH^N,�W�2�W�j*
���X�m/�&� ���2�?�:NFw���e}�؅F�{�[-����u�<�̕�,J�q���gh�zĄ�IA�	F}��$e�IG4|3�U�0�d9�,�0�pg�K�Xr4A[
?;
�ɪ�.T��s, I2��$�Eѧ�Bj� <����5�J�V���T<萑�;.�I,�VZ���H�=
�m��m�K���+���r}�]��ػ���p�x윥�Sx�pz�3%s�{����V0���$��`?[�x�$�:d�qp����Ymlp=��;�=�{V��W?6�
�c�x�z�4�|���/��+�Ι�����Wz�K�}˄q��^��Ut4��eBi���(�����6�<;A$���/���� [�6諒�W����o�¢N��X������jh7��^ګ-���tp�l��Y\�S�|
��'8^ڱNZtT�z=��)Os��	�s��
�7��+�6�k�?�����
�س~z��F�_�gН~��8��sk�X�
�PK�yVS�"9�a"pip/_vendor/tenacity/tornadoweb.py�VKo�8��W���J6�E��b�m�-�"rRd�@���̭L�$UG��C=l9q�VK$��c8$}SY֊�W��	��k��?&�H��9��<A�1�J���l&%K�Ս�Js)�*���ݐ�E��`�j�@�� �����`i�H�,8	Ž�MCӁ���Aȵa�(��V6�f�c����n�Y#4�*�(� }�q>�-��ۄߋ��_+���V����Ia�v �\!�i��7\�h��SH()�F�ue��+#��J�N"�G.\O�y�����>O��&��|��Lo7��vA�w0Y<¿��MHi"|.��O"�M!�6_⑀L��t�	�xB�D^�!��P	�%�-�v!5�K	��[n�iz^�
��2�k���$(�ɔ�B��0��"�*4(X�M
]�5�x�F�6���7rbnK�+�Q�X�<�a�����"v��T�����Q�ˬ�.?���ٔV��z���D��R
���U���pbb{`��{����<�r}�q���Z.[�>?�0Y~˛bq�7q�i,2�F�{nG`��^��B2�tbV)���%)d/lfp~��*9ף^�D�>��ltKi]Q�x~����ӢC�v��,["��h��DBB		��r�x.�B۞n�L�j��Y�m�6�3ط2q"a��{A%���Q�b�������
R��<x�_&p0t"��h�d�����㌯1���}��k[ܴ��r�?&fܖO&ƙ��۟Z����أ{��A]4�)�[-�P��ǃo�h�-���:��T����ۇ@^w�^uU��9)Y��[�˳���n�Y�I%1�5'�W6�뷗W?��[	5����!�hgd��O0$���㵯c ,N��9�N$lL�DIwULWA,��Ĭͳ�Zi���F&��*NYQ��:4�
U[�D3�;PK�yVSZe�Y�#pip/_vendor/tenacity/wait.py�Y�r���)P�!�L
)y�RJ-W�c9�RJ���\.8I�3�,�1�=�;�
�$����(�b� r�F�~�
=ag�X�X:v<:z��?�s<:>bo�L
�^r�Q��'[T썶˒���dz����~b�|�^�l&L�	H~��PV�X��`ェ��V�_�X�;NF�G�j��+8�u�r0Uڱ�
����e&��OE�T,�y�I�R�V�-�1�,�U,��qPs�x��t�;/�ҹ�d8\�V	��&�,�Y ��_/��/o�!�'�2a-3�R�9]3^@��O!a�WL�F`�i�ue��j1`V�݊.3i����m����0W�;�a7]����fw����޲����]]���˗�W�xz�Ɨ��?.._���p��/�!%�P��^7Bl0�A [�T�e
�Ԣ����0
�B�\Zr��x3p�d.w��J%���1>M�u^?�uƝ����H&��M��tkVNJ'3��jOr��瓳��gP��'�ϣ\��3�3�e7Zt:�4�̊K7�r+z4�r�����x
���1Zf��LE[-9���& �=?^�ʅ[�?s6��8{2�Y��(H3�$�	�n���ÿ�y���Ч�靈��f�|
6�.�CxF�L�ݖ�.�b�j̨c���)oB�桃��C+���'D�c�FPQ.!{(��2s��3�m�OK��C�-s6/UJ���Chx���)��Dڒ��wIm�Z�8.��^�z�mh�E!��|�U�r�0��R9�A2��­�Wq��ۨ	��
�Ԇ&^'!��/��V^�V>v��;�-�b��lZFA�^���23-��K�`��p�$�l<[c�J�Q��4t�-���FDžMy.�j��n��f6H����H��^��V]���;�D��<l��=$��H���H������}v�z;�:�ɡ����v��,,�
j�<=U�]ȼ�Y-�I[��`�œ���o�2���ݧ��/?��el	�m�%���6��V�:��2p�ՂRs���{�^
Œ�m��2,�F�`��B7�� U��b�JSO�ъ���N���^I/�i����������G�,D�Y�{���;>1���c���xX|jY��G�֤	���o�� �{��B7���D^8;`������Z��%ad�n���w����?&ڛ�E!	�&�q�T&��2�
32X&ToK��
Sz��Ɓ�����n�L���*5"���B�>��Bm���T�VY���T,a���3�J�#">܏$�O��s��L0R���,PBCO��Ր�9�+ϫ�쉩�h�O$�#�m�j���Q������'w��F}8�!�s|o.5"b���I�C�E��0���*��D(�gEx�U�S��|��g��.�FX
�ų��T��vbnJ?�.(��ӫ�q�QGt.�@[5��S�"m�Tf4�!6�Х���B�!��Ql�c"��mHWr�"�7��e(j����D$V��'>JX��i��Q��l�	���h�16��`�_0(��6�t�VKA��e4ӥIEͮT�3�Y�v(�'�W��J�G�!8_iw�y:��>�@M�R
mh�z�*�N�����]�X������qk���.�(�K9������wJ�@	�{�G>��
�D�}��E���o�e�u�	����@�ٵ������1<F��$�>r���Bc	�V��h��<��v�@��ڮ��ü/#����-^�aя���"�ʐ�r&���J�nU!�X��U�o&��L�;,��"��̤�to�H^S�_3�5��&��
~p�0\J�%ZJ��"w�6\��Y�,vN��D(��^i��_���@��y�����JLo<�vQ��9ئQP�S�8k��]�jh�[\{2�Mx��*��8$2;�&]J'RăF�V�B�À���a:MKcC�U��f��+/
#�d�y�.'ɞB��E.8�*4h�Mv%N}�
��/�������t�<��F�M����z����/F����ݳ#�
���ꎊ`=u6U�-|M�B��HI�v�WT�TG��2���$
�F��̇A�Olgy����%%U}�W����0�z*�x�����K�Xj6W^���-<��cJ%a��`�8�;�PK�yVS�Ы���pip/_vendor/tomli/__init__.py]�=�0E����sPA��C�i;�N���Ԅ����Z'�w�p�Q����.5R˃cIDBXۆ`-�XQ�m7��gʩ��[�\��֟�������Nn偀�UmP����ZUʬ�dZ7�0�>������i&P!�{$��g��E�c샗vv��S�BL���PK�yVS���@�Wpip/_vendor/tomli/_parser.py�<ks�8��+0�IY�WvwT�reW5����}���RdsL�����_w�#�읪K$��nt7@F�E�,/�(�ۙe����Hܸ��)K��GpC
�����蟟��_g�/�ҥK�ɳ�r�q0����>
��C��O���9,xV
��(�4	b�kğ��G�}��A�A�"Z�/<��Y�H�q��3nw5��
/�����hx1P�:���~����ܸ{�����J��x6��A�E�O��ќ[��4b�d9���f��4�تx� �dgg��l8��FW��G��r^���u�,�XĢ�eAr��G����5������.yT��3s�`�=	�唳ߖi������I>�q����?� �%\fO�����4�S�id 9�R�\��l��8����9=�ߝ^�������X����n���]|5�/[�Mn3���G�+���n ́�5{n��Nj���h-֝�Njs��׆�=F����������H+'��@��ߝ��2��BZ
1��a�1G���z��.*��1���ȇe�6�{-d�bmp}v
v5�t~z6@9 ;��}������N�>�Y�����2�+s�\U�Q?�QE0��'��G	�q>��Ԡ31l��Q��^�
�,��;\,�m˱�[��{x(Ƣ���9���:
{�!�E� I���;�л>�iP��x{s�w1�w~�=�/wY���|Js�%D���d<�y�N� �Ҭ�� ^���<�;M�+i���X��i��C0`Q΀0�%��)���?�3N۳E���Ǯ����3���a{�EC���(Bh4�A3`�(�,���Â��@dq��epw�P
Q��s���{G��Q�u$�.����~�?hf@:��b�e���Ԛ>�,L�/<+p	�n3�eV����8��p�.��.�q�c�h�(��8'�&�f��"��B�#q-bp����e"��;]`�?a��+q
�҄�d ���z(Ǵ1��%V�9����#"$�<]f!H�Q��l��av�A�]?D1-�T`h�͘ H�a��mmಋW�e�����=�A��9n��/�@�`B,@e6���1�Dpb�-$־�s�}��?��=te�]�r
�����2X��<���
��$�atj8�#@y4}�i$��>6�_��
�����s%!���QYx��{�)䋂
�)�pcN���
�����~s�L�i��5`k�լ�5�&|�	�~����qL_mzJ��ٍ�XM���!V'S�WI3�Jʰn���k�mH��f�R~�����|4P��L��8�k ��n��d��k�B+˗�Y�ħ>,,o���N;�'G2J�N��'n)��c���Y�+�|_����q��ͩ����?Z��$"���E�a)Qbǐ!y���Ӭ^�,zh(*��EJ��˺�GIT�~;���l�r=�_,�H�{i?��81�o������1����U���
��s8���EZ:H���|��L$rLrE�UJD�`���v,0�Sd�b�Rpr=ø�"/
��DU៵���im��i\GD�W�{p��4Ks���*��p���h�,x}kX
�k&�L�4`��K�Oh�n��c�sRO���?>�φ#���GL��&Z&1��������`}y�@-���!c!X])���t�
���u��;0���w06�	<�h�P��*,4t���a|�%d��ؠ��HmD
8�Do��
9���PS|�>�l�
�%�h���y�c�BP���d5�h(����@��x������;R.}P��vT����]G�$t��P��M�=�/��w�T7�55S����$M�J�U�s����!`^�#d���E�E�A�`��#g����d��01]�]h3!�Ԧ#]�YsX�2�(��͂Lm��s���|E��D���,M�:�i$�?�
r̩I+��\6҂���u1�qb5�$Z͘,'�]C��FS̔��RNɗ�A򁋿y���GH��T�Di�$lTv���-E��$(��\�q��[=k5��<YQ�����.ra��ʏ�� �l*��&��l�Y1�X�*�K-�Ҥ)I-���
�mU����,P2A�9t�6N�Rk���W��;��%ZmPȬ��!@Ȣ���q��e�~i�=\�x��|�]�!��f0�]��0�2�T�����Ψ�:F�p)�r�:ҤF}�B<Md/�����x"�D�t	�l��"�'�~y�Ke;Q1y�n^^Dz{j�߲�
e[�}�r������.H5pW 1*Z�,�Y�,hn��s����D/�"�EPP��H��z��Y��#�Ӥ_�t���q���Lč��
��V�e� {2��e�@c��ٻ��<AEttK5�٨�!�A
�R���"(�!{�Z2s��C��K,@>n/q�	lK]�%D�]@��ZQT^`	*���n�q��1�W9N�*%��yK$�<#�?ὔ0%˚-Iv'��<��P����x����;������Ɖe����`'�[n6Hm�8w4��M���Ug��I!�>,D>5�GW�0E�������z�}�b@T��5�A}[��Wk�i.E�Nl"��p%W{�1����,S
e�S�z���ٌY��C$ʊ��0{�����|=,���S���t0e\1X􍴅le�u�Q���JH^�++��˵KG��QeZ
+l�S��������[.��XI��~,`��`0b��D�Q�A����o��A;�6�B�c7�0����@t���i��e�-�4-�h�oo�����M�k�{�w6O�@�Fw!
�D\
H�G��
�b�-� ��/�g�����{�^�ȫ����]�۟,�ױ;�?cB�Ct��RzM"Խ8�e+�;��+7���'$	�;qm�Dy��4 m��g�-�v�j^(s
H��-l�Ld?^SX�e@j1͹�^�����C��]Ε>�x����]��C%6��ִY�LݪKLr����t��1>���	�jӸa�}�,��3���(�SZ�]ٹ�����*���.�0�Jl��m6�.wwl8%)��J\�L^�aq5���q��!����3�˨�"<�ڊ�b'��J�⟀wY�C��LP
m��[�
�r�i�z\��Z0�B2Z�D�;�wz�YRk��!���X^�q�|����Y�k6�}j*\N�"�:��v�l��Vu�J�5�ʋ̸K�V��J�zܶ5�T��z�T�>]+^��%TyS�oŰ�t�Xck��e	�5���\�R����
�[X
�l�Un�9�K<kle��s�3���|4+d�h�ƀ	�ցǐ�b��h�/�z�EHQՄ��Y
Ӧ��V�t`�ǵƟy:�lv�	7d� �\�'!���3U�ƺ�Fo�S�9S\��CUf����LZW��U����"�}Q�A\�{�NP�ie��Q����Q\w�U-.
Λ�v�N�0cUs����咹ָ\ͩ��1���I��I��UH�<Gl�^5�6Pa3s����Ч\�[l�*9lVlS+�uF�y4m��Y�+LY����l��o�������/����
᧖��JI�����7r�>~�N��Б�k�����~I��QVz��k��RBV{,�x��ml?����5^�p���.S����q6�VUz� ��J�H��q��aP>��
y?j�:K!���ԇĥ�mWv��ॐP=^�}�no=������H�������~$xI��ݩ2(u�Y��ݘi�9���7�G�ڧ�
��tO�E<;u>���/��]� 1cD��ݸa��ϳ�5�#_��ω�w��z�T;�:5��4Z�v��C����)���O�OCw�i��y(r�5tZW>ky�0�U}m�C,<i��T��v!�%t�[�J?���^a|��[�"�꣌Z�"DDJ�]U���7A�ՉI'8
~9�P�W%�F�&��m������C�p[>ȋ](�_�ٛ�<��)��7I�b#�����.;���q��_&>oꃘ� �%���1ai)Uȕϡ쳀�|�l�c���R�*ߺ�Uk��A�nY��銫��+�<��t�u��P�uC�:u���~X�,�u1)�h-�R�ڹ�U�;ZSm+�Y�wH\jĔ�� �*-N�A�g_�ż�Z�	�RM++^�teo�	�� �*B�%cC'��7R��ɽR-����V�7i����w��t��ѣ�h����1�ť��h��UTni�%O���`p�cbo��>z*�a��OJ�3��*���
�`HܹG�_�f�zX0��4����m!��a�B��?Vz��Az�[^��7���$�4�
�u����Ks�6l;���;��ƻ_���̧��+��AMuA[VC�Y��=���h,�	��:�U-'A7=�-�Zy-P�l�K6���>��HCr4�L�l3�7���'J��۴A�q��޻�b�/5������'g�;}��W	y�a��R�Ҍ�����8�֦�$��ng���������wY�\���(RCǫ4�e/��F�N�QrQ{�!L���3l�F�R�¤d2dw7�?�\�8M|{[+�������f�j�]�R�j��Fj��	?��U}��n�`��`��[�U�
��n�`���}�����*���d~��ڋϚ�ڜ�b�T�ɯ��&��	�քv=�@\nT{"p�K$�G�L�e\ѩ��
m����dͪe��}#��k[#��B�؛�0����w<���f!�:\�uht��7w<�{�]�
a-/��]��<{M�^g��@D�""
�M��x6ZM����f
4L\4L�d�
/W� �t)��~oi���K�.z�eRyO��?@���]�4—'���3���j2Љ��IC�@��/9>Sǧt�x��b�=t
�^�Rѐ�,Qֽ�D�Ԍ:�L�rCݟ��S	m|͓�577�k#�,Iq��?7M�Vu����(a���:�&���
א/�!atqex`�O��{�G�+����(��NFvb�Q��@t4ܳt�jK[�iaޓ��ȿ{H�^E˱��)���*Q���E��Z�8����͗�	:=ϻd�_ֈ��2._�ސ���K�H`�4ͦT��]��m,�,�0�h�7�#�@���z�ϙ;x�;v�ٲxR.L��x[d��W��<4\b4�#��r��ɘ�zZT�Gx3񈞁ض��G�_��n	�E�}��7ٯ1�y/��W�
���W {�([ijI�zF�������#��۷�?��'��o�xt|\pppp�:;�PK�yVS��1��y
pip/_vendor/tomli/_re.py�Vmo�F�ίXm�@�6���'�J����*	E=�l*�E�b������(��p����<3���=(r�h�G��7�P!�F��@���k�<��[ʐ k��CS����8[��W�^����ۆ���+|��²��Y���7b�����4e�g��.0�)�W��59i����9�� ��}��@Dg�Q��7�Y��:����X�$�$�.ҧS�8K�����n,��bq�,�e1'��O�	�xߔ�	�K�m��R{eˁ켄�zsu3�
5<4�������A�|�~ߍ��Hfq�Kf<%!���l�P��#"�'��e��a��UeY��Z��Сu��T�M'��YM������{^�q2ò	�ϗ�xS9�b�~����@��2�i:�U���L�.���X3���k/dv����5H�4p���8O6g�F�)nĤ�ݮE=���˲
�{>$ř`[h"�@x?ɩK��T��p��G��'���P6��׋
�d��rT��E-�=�:�pl��R�
�^֘�-&����"�yU"2���:P�5��I�R����a�*��X񀻩UYw�u-�NA[�۱��U]&5*Y��('{(�|s�b��X���5��X:eW�ɫx`(6��f�q�hhP��@�`��Q��7l�"
A�#�`ޞ�%͹��(s9M*�S�`�Q
E�t"�T�=�I�~�W�R��`�$z�:<�P�"�\ƄG��mΑ`��Jo^h��12��D~�R�A��`���5O�b�K��wf(����ّ�c�W�bI����;�U�E����ļ<��n�&�"�i���FqU�5bA��CLl��S�OÌ�pv�����)���O� ���ү����Lrw���d;~�a��#ia7,Ɋt3��6s}����!�3�x�����l�r�����7�PK�yVS!ImQ�
pip/_vendor/urllib3/__init__.py�VKo�6��W�b/\]z�����x�#AK#�
Ej��W����%�I�!μ�yr�eY����f
Rl
7�ۃ���O���V
k'H��Z
�[A+$eX�ڸx�Z#P5rXW
t�`Q����k����[��w�]�4�r/H�ۑ7��$p���j�@����V{Քp�F����{4�d��P2�(|�R�'�")TY��k�C�e�^��P�Q�ec��T�P��j��(Y�dy���ɜ<��C�c�sl��
��j%znk����w\��i4	.kk��G�ԹK����q�ŗ�7�x'$�}�8E��d{� *ͩ��	��b.u�C� �D�5(�,ݡc{*FQ0�=�������N5X�~��d�G����C��-K���FJ$>>l��M��{�Hً�S^v�\M��E�Y�6�r�3/�+cq2ɛ�YG�6,���4eQ#,�Jd�id��c�r�3=�v�Nq�E1����?� �)�Q��%0����5.�dV�>��_Q�f��~���˛�6N��G��
a���Lx��-��~�,n���+�j��2F��>y)"M��F�h��o]���N�����!�i
���喞�"1&�p�U�$T����CK�j�F��i�*K[�g �4�m���	�+Mz^��`�xR~4��щ����4O�8Ѫ,�?hD�s�-���)����q/-\��g���Z�oi��r�|F7'br�9�$�Q�֢�k��44oݒ�W4�p�����E8LUU�'�\��+Iyz5H�N�|f�}��-|�uC�y�S�($�$�����m�j4��a���ٽ��Q׎�o �� ,�h��C�i��i�|��g����K�8�v�鰦<����
Q5]�m�p�_)p��;
�ma;�s\�kiKL9.�d@5�neu�ӿ�����o��y����>9O9g�:D�p\���;��E�])N\K�’��ht��k�=�Ew@zo㉳+�/�=���y3�w<_����QXK�Q�D4=�N����t�/Ģ�w��3�p�F��߄W0�����os�w�;E����,�PK�yVS?r
;*#pip/_vendor/urllib3/_collections.py�Zmo�8��_A8(,wm���@��no���m�C.ph�N��%U������II��8��Cb[���3�7U�e�զ�u%V+&�eQi�ת�j-V��ٙ��g�
-H�,��E�b�N�U?��\k�΄�|&�(5{g�~�����P}W	��f�ǟ��~l3��ه��MQm�����R8���muf�'W���+XJ�ZT�U�D��u�Ub�Y�� ���3����R�w;��x�+��5O�G��=d��U**�~/�b��O�.�&2�:��Q�؊ߊ�F�C�I�����ދ���wFdH�Z�,C�,���H`���e�k.sQM�l������$��ʬ~������P'��+g�1&Q�~g��db����L�w^\(�,�^�L���a�;�ܱ->���%Ӆars��%�77��$�L�bO����O�e�+�����r�kq,��,�qpQ�o������ ����v
��
��������W$m�)��,�@��I�� ��
�srԖI�����.Y<��ە77>��w[`y�4f�o(>��.���>1oZ�]f
~��K
�{Iጳ|�b����ȅ�D�5x�w�s�h��g=N]x,�7��̀:C%����.��UA�	}��^ �R�\@�P�KeK���k���-y
9�2����R�u����8|�W+.�2"i�����Xt�����k���Ι��N&x�����'i�2](%���2�9H��^��4Ŷ�`a˾-���jdy�I���x�6lO5&ͧډ��%��V��iv�w�|�*�cg�
k�
3U�x��ٵ��yN�]|t:�1��<��2c�ü	�M��1�c�C,�\��^����4�{�|!rEM�m=p1�@P���A��";�o���n6ON*��CI�!N8%�˹1?�s�T\*H�|l�A?Q���VsS`
t
��zӃ�Ωs"�kѠ#��x�r�dI���hx�QYYHBQ�ˡ�X�b �s�/���C}RgɐqQI;����<��"H�N�a2=��LL4��Ceb���A�;C�)�Ɣ��R��H���z�e�b�rT-�e'�֙�;K�r�Jl�#�&�ۡ�%\َ�+���"��=�n}i�TR��l(	�OiB7��f�e�u��޸�jz��\�tQQu%�1k9���taݐB*l'�!Y�q&y��[����K�ݫo_Ĭ�����(�-Ö�"�#YO,����N�_�ss�jh��P�`R~_�[e�I;sݨ�ė�g�;X�
�sd�J����D���[��q��|�#r�ag���hV��=������h�x�4��1��%gYQ�N[��0��F�~c��C
���/'&��^���mHs׉��%��:�\F�hP�VXX����Bi'��ׯ�C���OB�F�OB/.��^��M7E�\�j�1��HZ�5�c��>��WS
|���˭��ƙ~7�}��s���<mD����pե��nW:��|0�����s[|�_��C��M���-�^н7�xt(��c2!	z�z�g��ˑ#���8{�@��"$׬���z`�8���p����g�����p``4�=�>�8�j�\wx�6�S�>&�����z��C�;puث��_���r;
�+'���JT���O|i9�*��Υ(��P̛㰙)6Dr�׺j�OLf���`�Ƿ�S)Kzl�s��#�Kf}P�������iZ�x�ڄp�VT�"�f3�\�U��'X��c�t��Ń6v’���C�Jg�FJ��|e�
����UgC��`�^�͓��E�#��qѮ0�au��u:���p���h���(�i��h�f�9�FB<v0�=G�h��/�h��J��h���4���v5O�gl����{$��I�=�3��b���y�������o
�s�A�-�7�p!w1�����hF*CH�V��z��(����h(0�/��i��p	���h��J�Yc��@apRu4�C�a����Ł�{�D�Af�hjX���@��)i+��;�"�t�ud�a{���gsH���#��<��LfsYguv?cձ:�Xt[�gS�C�<ށ!ƴ�W�hY�>����m�FX����C'�e\s�f`=����Z�n��f�
�"���'��f���IJ�n�!��E�o���q�+ˆ��2�.NG6X�*i���>�H�2�fz���tY��"��Z1~�Y���g%"��cС#6�/��b]n�~%Zr��b�[�,֊�
	��,X�����]@8�fc�9a�Q���]@,�^����1Ϗ�5Ӡn]a�>l�M�K�@)s���#;�S�;�&�z�|{X��h��b�dv6G�)���5{��,��3�9�2���fL�{�5�b�b/ɻ�1�d���^%������>��t�u�J���S�������S9b��!�:97��b=D;���J��
Q[S��8*Ax�ۺ����)��
�L����H�Q���7߈���I
��t�llbƣ�x�%:&sz�d��Ѵ+���R��Hۚ��t�zEj�=b֮�;�lK}�L��< �7��4��Oα�?R!��#��j��?��n�h.��8g�	�]֜Gi����ƘwZ��\J����w���"�C��H��z�ֱ=m��W�Ft���c�|%ʱ�7?S�35��g,�6��"e���qk8���Bwh1>A��v��y���2�L;:$‘pξ/(Vsa���;s�Z��7����M�bH�'�p\�o��w�[�M�dE.x>�{6�ʆ�ۥ+񽭐���Xػ

w�r�~��'Ym���!œ �=��>�f�A56t[0��C�z��du�)-ꉘ0�Z}��_�o����ԩӨ��6�\qk�jnn�P�H[f<+W��$3P�ߊ���i�aMY2�Ǽ�k*\å����Z�W�w�GD�fJN�%|���;{q ,J1��n[���ld"͵v�>�%c�[+��?����rw����YI�u�~+��u����������Z�6E�˼�*kKv41����t������KN�xpaF/���
�J+���"�T:w27ʻ3�o�X�5�O�Z`o=������M=�PI%��w:C�������L�O�Ư�8w�<5yF8���lc��dW�R6��lP�$��E�iQ���0��^s|�:ehG��wlñ�yM,s��l�CA.�3E���e8|;~`O/+.ۑx��z��{N���!0��ER%�h6�^MH��O	İL��:�\ �_��������� n;��.%�PK�yVS[�r??pip/_vendor/urllib3/_version.pySV��,VH��IU�E�%��%�)
e��
�.���~�A�\��e�Eř�y��
�
J�zFfz�J\PK�yVS�+_�pN!pip/_vendor/urllib3/connection.py�<�w�6���@�˙je��vS�ݪ��յ��Ҽ�l��HHbM�,AZ�v���)'��{w?Ty/�@`0�7Z�������K6E^V,\�<�+�j�ÊWɆ��i�Z%�Jͅ~*�."��x��m�2�b�ĉ�;=)/˼d�`7�<ï}����ڞs�0���"�����H>8o|h�7�=<����4�Y��|~u�g��$�p��n�lh�/;`Y�S8a�^<y���U��E���1QɁ��B�A�g�+������"Iy̶I�f77�3`��+逾
/����}�u�	)��j�iU��v���h��4��y�9��eM�E�s�4�y��Q
a��ᗆ�	u�O=rQ�s�5���;��Řm�a�Y�;�Z'�U9��,7\�Fp���Œ-���%���iB8-��t�s�zY��(��[�7e~dz���ziNKwi�&֖�#Z�d\`�4��&���a���$�4�3V�e���JK̒��?i`��("
P��@���f2��^�$#Ӌ�uvK��ԋ�q�VH��R%�W;Q�
�j�Gq�܄U�ֹ�p�4>'��P@B%?cf�3^����*x=��ή���j��L�܌Y�j���M��<Xʼ,�$�䂔*��4Mϵ"��$p^Ʌ�-�<�V�r�qZ�+c-����@jh$�l�����W���K/�A]�`�-Zs��1�y��s8a/��=�����_��v�3��$��?�H]�5�"s�5GM��!ZΫ:
K����,��K`���t@ �2LR@w���l0ſ��6@���
�I.��,Q�c?p=;�]̃��|�����ٓg��?��SXspry1��]����yp�zz\㰒��T�^9|���/���~������zr�ux������V�"y����X\I�p8l�A�@�&dr������m��t��@t�=�6e��(���@�	���z,�pa�,��Վ�᎗@�j�a���YƷ�$������9Ô���6/c�E`�
x��@��
�ٗɪF��
��ͦ}ip��q����$��:�J���[X���	��r�<�7@���A,%C~;Q��C�+h�m��u�@ɘ���Y���0�.����H`(cA.u���2S�1B�3 y�C�"��lIVU���;fJ��|�i%��cF��^��z.>l�N����`q"�J���"\��&HW`	���y�Ä����tv>�+��S�,E�ػ�b����(d�)�a�P�7E��,Y�]^�c$�D�r��}�y��ir���봽�+�d���������-RX�d�
b�Ac!�'Q�}�޵C��]��psy��l>fMS��lv5=?�a��d܎|�'�,%��|쌴��?��;Z���@Y��<�1����#���928������V�Lة����0����0�^:���e{լ�`\:�f!�P��}�c�0@�R��ء�HVD+��Z#�k3��ŀ��0����
��*���=��'�Ӏ:����u>�A%YRHY��/�r%�ϗw[áK�N����&O�m�"/��ԑ�1���~dɏ*!K�M�ٷ_���k���'lNJ��>�����F���QZ���˄������Ma�c:�:,Ր�z���P	��U�(Hhg��
��]i����q���?�)rП^�k��������|�+����:'�-�~P:��Rz[`j+���,&�nM���x�����"���x��D��d��ɳ�J� fN��!��\�i�;��S)Gq�>#�_c�Y�u-�V�|p7r%YRй�!�{́�L���X��׫���8�8�	�Ն�\��M�e�^I�F�Yg��N�h�^�[��6�)�`�	�hl�p�ӋԈޟ��M�4���B���iK�<��T<A}�ߕ	�w�5n�^Ч7�S�g��2����@S�6I�Y�v>�������ѼC��ł֏d���CEnjZ����k!і�͵y�����H�!U���OzK����
����n�Q���-�@XH�#8��
T���b�Jhɫ�̤	�LP�ꗨ�A��Z����sW��2�ڣn����-�eZ�|��7Qk� �*w�-ŤA�u�����n@oD�(!�H9�d�������LyG8!i�S�%Z�e�����:���gS
/������zt���P[8soO4�8�D�3�+����Dn��]8�hS�m1���z����\����у要��2�t������I�J�H��ٞ7C���Oe�Q-�ԳJ:�U��ZP�2nVn�������U3�N���O��?�Y�kPm�Z�N�?�a�#�hc���h�I+��t=�[\7��gml�*�L��CL�8�5g�5��p�!����U
�RWطy1
��e��1\�*%�A��P�) �!��ϢRR:qhv��/B�(y�j� d����y��i�,md���_�^Nث��=TW�>L��yf���ᅅH3�3�ay׉�BI���v��u�� s�'-Uw��<K<��x�6E��-ࢮ�)T��N�-���⓭�-�y�f.�y�F��G�*��l�FKv"S\ҽHy�P2�a>�R�j�r�\�����gpA��y�v�(�ڛ_��Ih#��hl���l����hEa���e�m�쨢�D��]�G%��9��M��V�ԯ��N�
����>"�n �y[m�Ț-�0���Y�)T�a���1��݃F���{v|l������8~z�� j�rNQ7@�3�����';����шP��;���:J�����u��S��G�w���cv8���ۄ�Ȃ��0'�x���8�ƽ�����/�xw�X�N�7;�ޠL�K����4�TpW�N��$f�<N�;y�Ǜ��u�3/�s�Fw�g��Gy��,�b��(�����]�k7y��(��ޕ��A�S��.W�,Й
�1�M�[�﹧����u��k�A���� Z�Dпn;M񜦠�2P��\�y�|���j��`
�'aE`8��lR�gQ�j,��s�(#܋Egc!�4yI�w|'��U޻O��Ʀ�%EҹG�`y̆��H7
��4�=^4C�]��$��նWY�Շ�q_㸝��yj�~T,mר*-j��x?���!��ҕ�-��p������: ����i��s�3� f���U���̭�FV�FL�Hǭ����nyP�
N,
�)[U�W�[�*.

�
�(�߁��?��1��m���8���V�zu��]�$��������S�F�˿>m$��u�|9u�<Cy&M�or���ݳ�No�)�sL�e�<AO4�ΡG}Æ+��u-�х�50d��<���yO��Y j���<F
����:�\0���(�F�p�'85Mo�|�G߶
rN���|�: 6΁�ȰE�fӹ�2��RG�77�O�Y;PraFgϓb7Y�Y�7%Fi��矨	}��Tc�#j�J��-����9�B��(�0���$��*A���R��^�ѓ��m^���7\�4�M�=@ �Ns$�cw�;�p^��+�QgFԹ`���7���t�j��|�Ͼ�]��@�<<%�
�-��e41����|�d�q��
�F.�9�i$GS�ԣݡ�!�,�܅�ɩ�诎��t��M����&�8V��9�5W�<1)�6Q#�4���Dym���&��Ǥ���E�
G�^�LU��;�yX�q&����nf!��(O�%"�l�<5��}l��\���s��N��=\��~��G��Ub���}ύ,�X�u�p���T��]0���z<��d�o���Ҝ�n�a��3���<�������T�l���"7J����?Q<-���א��'<
6�}�(:~�������S5YqC��:`s4�v�o a
��.�Nş��fJŜ�y��z��o���v�-Z���5��#F|��Z��C_1f��Q/e��o�.�@In~�h���crUm�	ɏ%Z-�Z��x�3`���Rֺ_�����&�j�4�*<��J�w�[�yY�647��N����P�����d{x\����vF��tj/8���I��%0D��m�E{���
y¬l(��#bq����!ց�>�	C!Wh��t���8��K��� _.ݪ]��c�F쿙Q�k�f��З[||�9d�
���\�5�!<b������O~�Ғ�J�l�u#2�B��n�Ƙr.�׈��;��3�;�9�T�[PL�-�=:T"��1i���1P'͚�'#��dq��fm^6�V��)5��G}���6��H��z\����#�6�:�Ъ���Wصնa�pk���Z�.�+��8S��>/w�yX<�.o�2;���[e�a�*���0L^ޡK�
��6��|+��ԿP���_Y�3��T�hZn�Nֺ��:��u{��N��:t(�/]�pi�t#�h�s�7�;�s�3e����Ml;F�a3	�X�Xn���l�4�]N�t�9�Z����C!��e{zbH�ٸ�#�v��|w:A�uoFZ'�}l�X�ъ4�R��`T�S���Aq��o��=�O1v��e�e!;�Eɥ^Uz�����k��|
/��J+ԽL�0&����C[����q����CZ*��՚��쓓�X��_�U"�>	�cMƶW+JB��5�CD��/Į���N�u��3�	�k��b�@x$*- =�[}��C<�&QR��d8[�4=�$cK�}E=6q{�K����mX����%���?��
�KJ�,�,,A	�Gr�vX�_=�I���۳�Y�/�eX�\\^�:��V@����*{u�I���v�T�ھJ�l���h�V0?��F�
�ClS�r��8�wU۸��A�n(�*=�>��Q��"�P�j{��Kp��	������������f������Q�Dua���	��Q��o��и�I��o�ix��֞�v̖�ǩ(��4"���4ǭ<�& �;�P��K�+�~]vB��,9�?B�(~A�>M�Lb�3{��={���wR&s��
�H��ۇ��5L���/���C� �1�I�
4ԡ��n�%����Z���&���2�?�Ա��eߦ��96���/Z�h��˺��ts����O��%�(�F�@�m�+&�Q�e攮T����vn�tn��$�"&�Ko�ƥmv��ٲ�,���W����6u�'S�y�Ձe��Y����!��P�!����aK��~��!ڱ��$�����pBǗs}d3��{��?�?�n2(Z��P׷�[=�H�J������cz�*=�뢦�?��C�^.r���������M��U���'ο;=�;=�
��}^M�M�}��G�
��E�����^T������ҿ}sY��.D�j��c1
N�@������c�F��=M�j���J��t��;(�X/��L/����k��r&���M�
c
͙����r���*�!��U�:`��Ýq��ݴ�9}"ͩ����4�sq'�W�R!���TC�H�/�(�;�	�o�D�vlf�`��5�VJ?�g�tO��=-T%�받꧷�2�2+I�?vQ`(�F�^Č����*��]�U?��f��v��9�i���R���TR\	�P�vđV>��G����lvF͛��.oT�(%�W�l��r�ꋮ~S��~�I��H%<����Lo���˧O�J�tG:-�PK�yVS��F(Ӓ%pip/_vendor/urllib3/connectionpool.py�=koɑ�+�("}�Ȳ7ٍp����B��Yr�`� G�&9��3QL���W�~wS��M�8�0,r������^]U�h�u2�.��o�t��M�tIv��e߉)�>8��E�T��Q��eQ-�϶�ߊN�ڵ��6k*h�,�3n��u�dmrE���g�]W�E�w��5_8��鼮*1RO��.k����;�+M}+��b#�����z�J��?\__Ʈ����ƽt��h�E!��M��f7m�+�パ��P�[w�ʺ�e]�֐�כn�]�Ad�h.��|���{�ʪ�ȭ�U+��ğ{�v�x��ޛz��H���������5;��;�5��_6uWϝ�{��0^���Uw��
U�l~�-�FT[�{wR����;�fً�U[N�Y7_MW��*[��h:XC����2m[��D�[ѭ��m�
���T�A^�M��(#T[�Ssq�7�f#r��
�P����
�w��ʹ��Fi?G�WϽ)�[ؠ��Z�ME)���-���;��m[���t��>Dcp?�jw�jo[-��Tw?6�8��j^�b�e�R�k9��f���_-.2�ʞ�"�'81�[�
�d�h�J��0B�.�a
O����N�HO����`�Z,���]}�?�fC�xp���Wڃy	xL�f›C�9:��04[K���gYZ���.�q��̙8��g��ej��,ɪ�mp�HH��:q�cA��4C�Q
GI^�ug�07����;�Kx풏.Zp�*`�E��X� �dW��j
Dv'�^��~C����0~��G_���Z��+AWh7�*[�f6���dQ�t:lE�'�6��	i|�xq��\�O��b!W���<i7bN"#���aJ�'>9y<�	5��#��)����Ҳ�yz����彙y�5r��<a;�M���4�ɓF��I3$O�a��~(U�`l&36=��`�����Z��S씿�e��tc��N�(L��";B��e%,QWCwǼ\Y��Yu0�"+#���ѓfd܃7�si�`ڴ�SEn�ݖ6c^��M	�Y	j�F�l`��^���]�MB<
�����j�nv ���n�'s�~�l���,�ɾ~~*n��N�7'�pA���LoJ�mJJҷ��//ލ����o^���W�����R�e��ϱ'8=�v�j@���B����:�d���l�m;Tz����D�8�aYL+�t�&�hV�Ãј�
�UWkP�9"V��
����ܑ e��\���H�������y�Gdx���G۸�[cz���Z$�U�u}�����o�y�_K����3d�Є��,�Q9M��4}���4=��Gq��@��}U�m���.��K"��y���/�� v�%�P�j��E��Dx�6��Q ��Y��U�wE�g����4(�[�,�:�9�J�X�<P�Z·�IE0�H�l�a�����Vs��G�eq��I�d'��a���Р�-`q�����A�%��	��4y�@T�!U?�`,����	L�	d����r��J����w-��}�άŻ~}��dm�	D�fw�,��o"a��-M��4�F�����I�t��#nsE�'
�X$����m�H�c�h��u�@v�������MoLlN,~wt'\���\�@&`pr<�MéjOu6����džF�(����M�O+� -!\�����(Q(�y�Qz1@��Ճ�,�Ŵ�6xV�(EFˢV��}P,��%���e��]) m�C����m����+E���q�*$�a�Ԧw�a��9j�!���_�'�j^�0�-���?���U)@0ր�F� ��4<B�o�b^t����BX��
�SX˾!T���P
!k����N��U
<눖Ģ훰����P�Vu_技��r�7�0�1�!��u"`�jÓ�6���nf�ާf_B�>Y���dÇe�r3�/ԟ���)R��vk�(��V��
/#u���P�
z�ă'��{��=c�f3���7���R����q �1l՛�i�B�Vm�O�ٿ�F2�X�05��D
��w/?���^_�=���4��wrj.�J�:��Ȼ���8�Ñ7y�y�4�����F���䶎<�C�EF0:*苹+�ӢUd3�X+���5Z�*2Q�S�-��¨gG|�_����7'̼�{�7��o�mD~�'a�ߕQ?�D��D7Ж%���D.t�"�F_u��=��b�ߦ���;�(^�[�o��f�&�A�cj8J�[�Y��"ȯ�u�)�{�P���n����=��@+�A�Ge��GBV�����l�f&m��Ӯ������Y�@K���FpCm(��b�Y&���e)�P�\�
�5M��#���j�X��Ԣɖk�$JS�'�}p��V�V�F��I�M�u%t��E�΂1��V?߈M����Qh�$瞂�';����a0N~��Z:�����Oj_�4���$O�)�hITbK����CzX2O,f^��(%��$9�-�z�-�9
��m�Xa�lFYZ��I>:K��gO!.�#-\A�/�
�l��3��:U�ԑ���ɭ��#���7���6/U:�T�{w�,�-����ԦkJ��a�.Љ��b���9L�6M�П
ҡ%��2܇�m���Wp��n�!�no�g3�d��f�I�fd�@�����ݷrp�Z��>O~�����6+Pk]�l ���1���O�}��8#S� p��	Bt(�m��‹�M�ٞ](�V�ˉ���ڤMr�kgF�R5�U�2Ù]�g��l����Y���;&��7��O�[���H�2�	)1�Y�n�.��A+��:����5�H�A]��uB�)҂2�*.ч�	��\^��X@����GxZ�fJF��"i$y[	�X�-)���#�FJ�
z	"./Zy�Z�ӆ&=��%OC1�}��舛������Q@���_	4b���T����x��NG�T�p�-�k��AP״�c�w��E��.Oyd�bH*ړ��#�րz��`0�����Ѫ@�=
���9��Q����A
�6o�V�����ӓ�i]��p�g���Ż�)gO�v���A��^@�<�֜�G��+�|zf3�������$6G�JtB�>��~��PK&0�Q9��$aI��yG����y��'����5?��*ǷAJ���7�h�aW��I� ����}�����C 
\ۂ��e��)	U�;���6�1���n�O%R�g{2�ӥq�L1.��5���vW�&qG:?p���-P�L�?
��1	I��bj[�@���#�k���#��q(�5�4{��u��=rÿ�4�˕Vo2}�S^��<N2}���Z�2�S�jvl���:��gRl�5q�
�V>����
�;�D��yϗGL�(<����:_j*8O��Q�K���y�wGB��m���	��x}�'P�	���S�dt��^o���)ʢۍ=x���i��obc����֌�1o�Dӌ�#��u��޳@.XV�X�y�
��<�[i�pL��FA-��x
��,��@`�H�P���TؚF�'��dب�W?i)Ù��a%W���X\.t��/���;��Ʌ9aE!�ʬëC:��@�9!q��u����VM�u9	�6�@q"���6���D�=��8?8ᗅ�W4�Mݶڙ6���PQ ��F�6��g{�p{�Q#����jQee��J�C^���T�za3A	Jtkǂmۋ�gϿ~n��10��n^�94�OZpG��B�H7t�OOYp�h�+y�~�~�Y/���V(7�w����&��H&�O��W�"�G�ӧ�s`�
h�,�ёE<sm���t0���3�[�>uo��>R�v�r�RQ�����tn<*��+�gb#(&��/>�tR:�F��tU?��Ω1~,�B�F� }��C� ��A��#��Ѩ
'��W�Ld�5����=��ENnO�tK��P^Go�"2�@ڢsT���'-08��G</�sV|	�"��}��h >��ڬ�L5n3x�&�t��>t���	�!g
���s�2-�J
Xrr��դ �u�9�`yA<b*�����Ȥ���(Ԣu|O�ݱ�C[p��]w�Jj[K��0Y�����x`��x`��F�Oe���=c���G�x�����'>�j��4C���I�2�����|����p���EkA+Ų�u
E��4kibyf4�8��ȲSr*t>�G��
R��BUoK�9��&��c�x�������­���g
��*9'����<u���_��)���kF�6�W?|�~���;Z
���)��������a��Iꊻ�:��oA�M1��RX�U��	�˓��N�:9==9��I�cXO�<.�c}zy�� �㺽?�M%�c�}���*(��W�_2�)��ʛ
{�ɻ-���m�:�I�q��ɇ�.�\Y>�s}������&9������P���6�#���b��8�N���0^$:(�6'�YBg%l R��]Y W=p'�M�ܸF��mj�2�������8N�dE������%�+�3�C�:�4H؇����vdv�t|pR�P.yJ
I�"�ZS����'Lj�����D��X�?_��;t�C��h�e�#�#W��R:_�����>rW7FQŞ��2\�$45��b�y�nb�ry$�'����9��@uX��c��`�@@�2Ș�j�������D��4��&�����z�I�^���y�£%%A�;7[/�qf`�;E��0�a��|*�����9J1O!�f[�ŭH�v�5��E7J��z�A�ۂ��IY׷��u�Q����"�Xu�Y�d�_�e��|ݘ��
��lX����<wx@��	��̝2"խ�/�8a�0�	DҀ2~;0c�_r��� �D���
��Q$2De�7�$q/K�׹��t.س
��%�܌�4*E��V�P�`gF�@��u��-��l���j����:t�+O�Y�y؇/�F|�%����c��H� ���%�J�:?���!�6���ϧE���G��G�A��7�e��Ϣu�u�0g�#�2�~x�RD�&2��W��*�M�Ygx���+�����#�#0ݨ.�)����|�=��A��.�H`v��Š}��x�)�n9�{���ū�`��t��h��1�Q���[@́�c��_��RI8����тuI�q�2hvF��?���Tt�j��޿~��2�2+u>0�U����nv��Oj1et(8�~�]��q�X��J-8�$��G���]k"[��>t����5E�~4���77m�l���qC���H�aR|M�	�T?sX�2Z����0g2qO!7C�Q}&gX��;NS+[�������s?�K���&/�2Po8�vpz���.Q
P�eN�KԻ�=8s��
An�&�9��c1��KL�hA[TN��9��0Z
vG)�D��cH���+
<F�)�1���D4��-P@R����t��C��뺢t���7�'�h°����k�*��+rו�3����.��B����I�6Й��3�w�x�'(Hɾ�PT�w��
<Z���'���53;�Heġ�1�"�/�>IX�ٳ��(!��k�߀O+��?<�b$�Læ&�
C���ϯ���+��#�'�y:
��>wa^�|>~xCꞤ[��`Ŀ���u�eD��ʕ�� `kMA�}�8���P�nv�hg�ևgO�hHq��x��9�/��꘬='e�w�FGC7�t��ۮ�-Ք�b����%��(�c�'�oѝŸǓk�1���FN���jy��_�P��@�*E��/ԥ��U�p�Az$~^��H�5+�<�R�0O�SL�]{�j�7z�TC�Y�?7�ղ��ZU�@�$��⹡t�#�6?��:)�cfGGƲ�pt�趡r`l�~�p�Dz
�z2����Z�"�P��LL��j��{V���-k�Ƴ<��1��Wk+C'q_q#�L*_
F�S�׏��V��N��,�Zg�Zy�E�У�T�6�p}�8�Tte,u1����=V���;���|�q�8�<��Cs��
pU�Q�9,8�;�M^<;���y�x��~��}3J�s���'>����+�]�j�L��g�#)3Q����:���m�Ti
c���\#��
��^[ѱ&_�<����e�����dz�:q��� �ӷ����Iq�!�Y�tA�T,+k��E�1�F��)4����h����2+���u��kXM���	��ck�ᜄ��P�Y��m&k׌��A�j�,��vq泙�#�h���q�$N����
7IF�%IU�Qԑt![��,7��ՖV�U��S	�w��9�*F�pR�<u"�f2��]�S
��W�P9U�H�������c(�J[vd,	���A�-?䟪�]�j4.o�#��&��y��l֤��G@u�NiyN��_�xKs*8���&�3yz2v��GΎ���G��~��kh 7����[�Y�;Ť��I�dU��"t���T̩�#@��BU6���p6��u�ݹq�ܪ�W�)j�����R�/d-W�r�K��a�-ʅ?�p��Jj?��Q��i)2��lk<�P�%^D��/����xSo���P���顨�p�X�¢w��TȰ��e[�H5�BR���?pص�F�w�q^P�tG�IUMth9�SL�TW�0J��H�����d೓�>T�@jc.@���4k�+��D
҉]��/�`��>O��b��;}�����N�19m���յ�i� ���
��`UT�Z��t1��U���ފ#+���1�
��Z�xe�fBÓLA=����-
Jsz(�!
âG"^ǟ�21�9;lX�df��۪jj�ꑴ2�GYjBN�iq�`=ޖ���M�<0u�5)H�O7��;9���N"ω�*kG��US�K��p�K_�*e�KB��‚f7JxXT4��Aג*깺�g*yO���Z���q1)��*�V�@m%�����,Ș�@����u��x�it�1{�����b�z}"���Kp���m��u1��ސ�U�W��e��%{݃JSwal}�5����v6�[����j7
��u����\��w篮1�F�HT��͎�'Ɇ�V��u�`�FL!�K:Iu�d9P}d�pQJ'D;n]R�6����14�j�ȋQ�z�vð΋����/�L]R2X.���0�c=�lΪ��xBJy7+���b�ం<�&…~Oc!V�Qq#\	 M\d��*rk�l���mbN��y-Y4�7�6U����=*�
ò
�2�b[FH�Ru����H��P���u��5m@�+���m �6���@>�n"��R	IG��Y�e��<�p�*1�9�Y����|B�U@��PgB���{�{���LӠ5[1��̸9�Ժ�
�q�1���N� d/����~Ə*ll'�r���no���z��i�6�ո�	1��9C*�����!<��d�R�����8��N2U��p���P����xk�ոe-5�����l&�ęr�z�#Z�p)ۉ
,1tA[�OUâ��ڬ���C�z!����|,�x�֠^�D�r�AX�_�>�E��e�����c��c:��IKW�&�{ƪL*���P]&��W���{�Z�Խ� �m�Y썤�h��ܭ€�1R��aB�C.6��C1k=qp�T'��4�����Us`�e����W[ȹ�(R���A_z�.r$�僇�T�U;��Ǥ�|f.NBՔ���
�T�wN���y���X���{@�'|;���꿒ÊJ������
>��)�SOn�ra(�<엾QΫJ�wV�+��J��V�^��8���\G�P�UO���2�^��{[F�i�����Ѽ�e8xŅjT�%Uυ�)h_:�����!&�������H��xP32�)��r0'��$1hyj�V2��oQ��vצ*�s8��O�<��m}�!W�7	L�6��ֶVا8Z+M��0�O�Ez$���㱬���|0Gc�V�X'�G�������ܸm�S5�M�ch.�vu�~(�K]Pc��--�뜝&O�"���H=�t\�7�#�Hd)[�.��P�}��B.�J�TA�h�D�%���I�`U�"�`�IA�L�¨���Ұ��3L�k]G���$��\3ĤT�Uu)O�W���p�$[f^�������
�`|9%k�x�E�:z��j<���<��uŖ LQ}��&xP�߫$�nH�up��.��wӘ���h��BkE�՗�S'<L~pC ~k���ʴ���!�"���^� ���N(qp;��^��ƾx�"�Ү�$��ϯ.��N=$�F��q[F3��Ș�gS!Z& �4�b�*��c ��Dm�����+nB7����=I<%)<TO�~��򬐿<i��o�H�zK�3����E��Z��g����|��$Zlu�>V񬷾��VY�8ey5�����f<��Co���c=r�KXz��a~w~y�_>s��Y�c
�[s�_���o&a��s0��Ĭ׫y�h��\�ީv�P��� ��K��b��r���dѨ�L.�K�l@��f2�]�S/X��'g3��ie2P�nr�(�×��!��!{���Ge�\%�-�~�5DM*��f�bG�@蛞��<h�g#��ʟ���f*������ce�-_@�x޽���L��D�_<�l]�g�G�8����%��K������w;�7
@�7��&A�L=U_�e��K��ygL���1���0�ME[~��"��u��EB�#�"}�*��x�%~�ڵ��?��}'�+iH4�� ����
�o=���&���A�v�jQIƋ�6�qq��e=�b`o��nM;�aR�#M��T�v�(Jv�~z�$}!(�5�	´�_n3� ��r�y�	M�+����'���:��G/����Bg3�D��/L�����ZX��ϛ�hW�M��(��:������[�r>\��VyO/�b3�d��z�fR��Å*�hE�˹���%�=�~#-�s�so;bS>���45O���ާl^��(��tg��8���6������ǖ��i�\� ��4h�22�
�2dx<���0�Ƴ�rTe�Y]�FEX��+(�:��^z&�><:j���3d�{��&p3��A�k��Tq'n.�r�#�*H�@�}Օ-Ȳ)����\>�Қf�w%��ǵU�������oN���W'�%	\�T��½
���_�w�j,�Y�;O7���MF5+�GƎ:5h�})TĔy��F>P�q�Zv������1'�E)"�0�;���Z�7��ǎs�y��y��M�������ɦ�H�/��{ߜ�sx7��?��%����y#�f��x�^��a�]�̵}*��N��)h^A��|>�PII�Lؚ�@���̨��%�Ӷ:��E;��*�W�O[:nI�$��c��I�b�GC�*!Jh�=i��d���?��e�FWl��Zb������+!�T�&5(�aA�z�bqUQ������cYUTQ��͖"]u�r�CPr����#!5`D��Ժ�Z�2�����e%�ZCE-ڃ�OYT��e��{�`����ϸ�Tn�dKPܡ�)âϷ[Ͽ�=ժ�tniQ�q`z�N;Y��N���P��]�t��i�@d,��Sq�n1#U+���hL7���X,�F���s���T6y)��F�r��Ӱ�&(������%Jw�ʚY.pL-�3
1nU��M#I�2��R��~�պ(�UZG��7���`r/��Z?<
$(�k�a��(ώy8�"ᩜ�gXI�.�����A:>A�Wd,�z	����UZTE|}~}4N�TCE��,'f��W�쫦5N�y�O����:��;���=D;��t3�,��;�jg�}�Zr��g�S�"�(b}���Tc�j�SŗS�/F5at�V��q��)������H�`y�2��ɕ�>��<�
�c
?7o�����f<�&�KAiW���K?i���Gϓ(��@�T�J@�}��{LY�x'_�d��dfP
����6���0����s����H�Sv~<%��&����g���QM���Q��n�*����?%�OώO9�RU�DU�PK�yVS^�I��	 !pip/_vendor/urllib3/exceptions.py�Y]o�}ׯ �E	z_�:@��4'��qM�R�]rKr%�o�̐��][�CĒ�������wctƢhS�ˆ(b2˵q���N'"�{4��Y��G�vf��,�{��s.��T
����U��<N�
�0nNJ�:j��Fo��
�|�E�Vv4�)��}����4F�I5x91�7�i�(��Š�����e�N�T�`ֈ�� �%��(����ّz�O_!�֩���y�ҍ6L��bN*4(�Ybj
�؀W��.�&V��)M��LX���p�]ќj�2g֑4��sva��M�R/�ڍH�X�U
�o�W�F.�����k�PM0�Iyâ�P��)��h%��^V�݊�:`�V�,x�;��{Afu,�H�o��HfN4�o��R��
���.���`�rI��
�X'72�؆��2�AE!�b�VJĈ�P��t<K�ۉ�8�4F:��j�uS�t�O̔����mz���Le���vP������[�x�p:}V;�"b������3�d{�E��5�Q�B+���λ�:?C(M�Vg��J��0���s���d�������2؛9@�3X�i)g��@*ix�����	Pp8lt-S鎳Ѣ��2`��jص�>����n�3!��d0O�Y�1Udka���1R@[�
��d�9Ϲ��9�kcE�s�n�s�d��?p� c�6�C�K�
#+<4Y0�a���d�@&abEivV����ʯ,T"LzDi!$�КtEѡ6?N�_F�h8-02�T���R����l��e��0��I�/k�M��Sg���L��[�ڊ����O�:"U̇[�,�M�1ǿBnہ�s�D����
��`���ь��l�S3����#���J�*��d&t�V�,"A6@�A��p�d�
��΋�'���<�Ɗ�+%��f:�cÁ]p�Q��'d�B�l��9��+ȦvK��>���Jšpr[���=O?=��筵鮎I�ǔ��]$<0(S$�X�=��pᄥ7�f/�	�YPmD
q�tYaEĸs<ށ���#mѻR턑��ry����1��֦��m�̊�փ�oġ�f&=&MYO�4��/��u*�4+qh=��<M�l��yss��z�Z~H��,wǺxA�/�) A��^�]���0�5������_�"��1y���Ɩ��
���J?wЮ�̏I���k
�l�;O��1��){�*��A���h��d��V�aF�Ty�^��76�pjV��"bg8,Vf2�&�9�#@z,�IiPڟ��X�Hn��E/wk�֢��R�d�Ȁ�+8뙸W�J�ٸ�z�� T��z�cI�`�)�P�#��P�� �?:�}w+CE~� ���ZS�/��=��[Ǔ�Tp8�rP�\C�I1�S�ުck����Y�~_D��۟���p��:V��5vL�W����_{�	���#�>]]5����q�QoT�_�]�GІ��W�</��U��'����@Q*�Я��u��[�i&C]�V�oX�"�EH���#㏡�)�P#�\9�tu��>���*}��Q6$�+lh������.�ܡ�^7@
���W��j#���!}���@T������!n����9;�J����1��چ�_؉P���M�M��`(�j�m��l˫�p���9MO���������[�
�(�I���^��b!��]�I0Akdx�hx�����o��u��T��}�f�
i���omg�j�������GO�_a*��b#��[��V��X�~�^��6�����sx���k�ʝmU��Bm��X��[��Ƥ����Y� 7oTh}p��>�a��rl�N&1�݇H�N��O�kh�b��*H�����ѳ��Ba�F[_��O���ܐ�m=I��ڗ��9��7�㎃.$[���O*e+�tOP	�rui��H���lu�tм�^ a��2@(��'��Ҭ�r�4���k�Zۮ�:����Z��+�d��:
HZ���b��T�~�W���x��-d� ���r�����88q�7+z�6�2��(�/�%�Xq�a��\���.��%�gk�	���U��\A�h�C�K}DU+�b�����_~Nܻ�1D[9��9r5�m;0D��}��_��ao�AH��z�������PЅ�ĩ91��6�VK�?|���}

��Q|��k�Dw7��x^V�P�V���v�;^Z���q����\�h+;N]�_7-���&��
��ï��+�"��J�L�o�=m����L@���]�;�a���_|����ye꤯*�*�E\Y�Y�X�;7���.<Ǘ9�꽱����t>�]�/����NB?��:��)��8���"j"R���oo�2�D�y�#̺S���>�𾭿w�hL�k9h�
\��G��";�;�e��+#R%Xc�6�_xq��\���Н_y�J�/�Z//�[�Ķ�PK�yVS�(K, 
�!pip/_vendor/urllib3/fields.py�Y{o���_�b� ��ֶ|A�*�s�q$9��mP+r%1�Hw[M��ޙ}�ˇ|ɡ���˝�y��^����ẒU�Ð$�"/%a+����~��:߱$��LRa�vɎ�}�녒�FkdKݱ
��HF�Q��dSq!�(�$�d��:Iy�v|B`�R��XQ�I�d�gGy$��
Yr�����<��#r#rˉw�YN?K��k�2�#�q^���=Js�����D�Z�+�d2���|Y+���F����5��.��ed�Y<�����akM���|�5~�ڸ-��Ƿ$/�#��.iǬ�r�d��,�e��	�u4�����;�XZ�~�i�K�����hF�e1���%G��RN4o�xs	��A�؊��I�٣`I�c�d���9A�߲R&Q��2�5_W)���,�6��`��VDK2�!˳���W��:bB��NC����$\�4��f��8}��Z����[)1?:�y�
�p��y�9��]z���'BL��˰
�>h�Z�	P�h)�P?���ȳt� R��X-
p.�SC&�r��K��ᲄ�ڀ��ݙr��2ծF��,��A{�M��B�,�e������{�נ9@˺��4���*��������N�hD�~{777�M6�hcR�����Txc򔴰]��!l�)ϴ4LDI�5��C�I���.Զ����f�%�ׂ6�	�pJ���UKP�{��ٜ�'��^n��C6�R�l���e�E����7�����B�U�O�����[aȪ�φC*¡9��;��E��r����ܞo���g�v@��p��y�����󋫋7��g���n����̛�ϧ�=1�zNj�EPdn<r��-���C�\��fa2�2=!gi�RZ���9ROU���c��'�䙆�3|��	J�"��뫃?�F@����E����x��/�!��nv��dن�(�DK�9i���a.l�Q��~�e�"��.���i�.2�㔋�d�젞
JHk�K䋶A�Lbq���M�W��j'�׀j�4�w�a�ã�$��5����=�oT�б���j��29�OE��bm$w�������+��u�U�U�[jY���w(�˒�u�Ӕ�c:���-C��B��+�e��*fT�����*���hG)	�����
���@�W+��m�vAUA����Z�B�����S&�(�	�8\A��H�����r0
$�v >�U`Ҿ��`*�ge,��P`�Y%i"��q��f`��4@��A^&<��|�\ۉ�3���фqr�����x����w�k��Ϧ�B~�z�=�mN�r�M�2�v���8����ͨf��
bh;�a�qɩ�*ڌ��`�$Y"���l(�܈���m_\'&�f���TE�nsT�19�1rP�þfgf��v��1�ϗ1�̓u�C�+��&x���O
�͑���:b�&ϜMF���,��bj'vQ"*�/�@�75 �H�
�%}��u/�j_����
��o�!�������=�'�z�<�]�M\(+H<R�t
cN6�|�13�|��H����P��duJ�)���dI֐z�r��<��B��(]?m��}U�u��|9���&_w�R3j�Ch�L��#�ٛ�j=�ġ�T����ڽ^B��WWDU����\EZ�
Y�p�5+���h>��1^�xN�+V�'�7쎣���m�VJ>���=�@5ͫqС/9Kkz�����fC@�g�]�Q��b��fa�j Z�c~��DЏ�=
Ö�
\�Ec=\���p�/�솲v��5_9�3N�F`�wd� ���b½���B��?������+P�F�w���0��9���%�3��H8~��:�h;�Y�Ѽ��z��r��;��nu}W����������Ե�g&J_�4ҟ����ϟxY&�����3ѡI������-rM7�z�����;�;�=�kZ|6x�gm�Ϡ��2]�	㵦�Փ~�m�a|u�s3���ݚ1�ت�B�&v( ��0����Mn�K�����S�zNvuk�����4�g�w`+S�V�.�؅,�=V�;��Nާ��n?f�R�N�J"�׷M����X��>���-�*u3�0;���;a�nR��u����|�C�&L��t�Oa0if���G7S����
�f�|4�&:����S;��֛i�7R
ҧ0��4]'t\!^&�7�Ao����:�e�n[F�<��5���ݦ�n8�Z�uB.ԯ����uA�򜘻چ�e{m�o�.rZE�FIK2���{+y@�6�@��u�����!�`xA�j]CQQ8P���`W�	q=����Rj ����ྂ����������"ݹZ=�\�c�U��t�HՃ�;̻�M��%h�$�b9vOw�#�[��֠�0�r`<h�V���{�>��T^}�m�[�����u/D*ϛ�{��ӄڏ���M�K�T`�v�����z�:�L���xGo3ׄ�_�iҫCg�?�PK�yVS����~�	pip/_vendor/urllib3/filepost.py�U���6��+*�
�A (\�%h���Hz)�B��њ]�THjw}ɷgHQ�-{7�%r���{�aktE�n0X �^��Z��;I�z%���w����m�z<�'�7{�v�1�Y+P6v��_��_�=�o�
�&V<,v-M�U����ūI�o�>K׮O�_��$I�-�;�-�T��>�7	Г�i��8����pk������(�`/y�*�6Љ��Ҳ$;�V)��4��)�}�-W���<؋�����mLn�3�J��,
���o�T�M�ړS�]����٨���-�q����т%a���{�-HaI������"�U� �Ux�F���릖D�6)E�*�ώu/c�)�A��qUc�u"�N����ѯ��
(-��z��$�x!���<��O����>`�y�4������.F�_�~&�#Z1
�k��l�%{��@Ŀw�i�Zy
��t��v;a�T����2�Sȉ��"l�Ѧ<o�r�;Q�b���7D���E��-�O}�7�;-��ns�UQ�#[t�t���d�5��9���^�
��
�C�$��T~Y��eI��"��/|�������:�"���]L�@ß'�q\SQ�q�z�v�i���C�m�x=ւ��(}EE���0�P!ܠ

ތ��@���H�u�\.t�j���y
�a��G��mri��`�NI�p�eU���W����R��l�Χ^��x�e�-�~�T
���iDc�x��'4�����#���(q��q�:Lr�_�
���PsԺ����ퟆ���+ܾ�E���`OL�#�FӋ���иyN�z�8�V�n��n$ �p��8�+�f��bߠ��r�,_��'�PK�yVS袑�h3M"pip/_vendor/urllib3/poolmanager.py�<�o�F���ا�����MR��3�y��
��A���������H��������O���ޝ��wwvv�gv�mS�E�o��kT��?�M+���eת��O&���.K�iu]�h�U���K���//uu9�lv�Gk��j���<�bT�Z�+�����x���?~���y#zv����17���+S�n�!�`6���H|�Yv�e��͂�����U��G��xA@�����yn�BW���uo��"t��+y�<:F�F2x���k��5e��0����_k]�E��G�L�K_ߨvW���Z]f�Vxf:��@7�件=�me��Aj��%d�!�Ã�$�eY�H-��)�捬�`�t!�D��;��#D\:�4�L@�`����R���jfy^�=H�|2��x����o����/`.�tz��.Քy0�(��8��d��wc�Z5ӛ���g[uۺG��AsS7��=�B</KA�0�B6���߈v'�]Y��@�k]�B�5��w�=i!tk>3Q74��
ՔG P�K��;
�eDg���6��P�&9SJ��I�Ǫ|_Xv�iG#�����{Uwa�ޖ��x0�F	��$�Y�^0cc��ad]֛��Sw�F�(@���AZF�7Ñ\����
Ǽ�
��;��ept�G��ie�Q��
�@[^�8��m�3�_\��{yk�oj��;%A��!
`K�I�y��A!��U�ͺj�/y¦~���\�6�ٴ�R��#�Ju�J1��0�͆�z���� -���h�C�"�ݤ�S�j�g���O��C�`lL�`
�g�)9�V��+ScD��[k#�a ��ڤMgZ0�0W��avd�t�)�B�jkt���l�Vd�+���
�O�t�Y@r6�3�,����$��PjX�Η�andS��#9)3�Oȍ� w!f!#�6�BmE�dW��hU7{Y��73�>$�BXO���3�S���Q�U��`�P�[(�B%@U6`�i��ͦ�#"3��B<��o��yjw�
撐U!P>��s�Q�A�Uet��UF�@LtR�Eh(�H���iV���z��'@A�[��x�Ǻ7��H�v䚷[����`xΥ,Y����<���
W�V$U��V+K�s��D��ϴ�'��@@��NU�s��cghE{��	����hK����@�^����T*�|°=��0��G�IM8��H��
���WbPh�����c�߄����5h~l?x�-�����3�
�
�9���5:��/ąFgs�ľk�ˈt8�"�+E� S�1lHݱ�}�3�8�Ǔ>Nmd򉴽�,+����

Y����϶؃D��N�fx�!$!I�[Y U������kq�o���e�B��ͦ��Mo�s1� z�@8!�0�	㻪n�ۺRa]|v�����L�jof�"����^Ykȯ:J�S��	�Mj0�K��of=^2z�����~��<�Y_ri\��
a=\�]�5�![5��4�q-L5�Dg���=&�^
�!2-g�Y֗
$�cI���1rB�-S���r�-8�tK�lf���F�nf�f��P��!�HyK�Yט�$OCv��=���"*�#������#�D'�Ķ�m�^�"Yχ��}�5^�oM��P��Mb�p)�:�
���n؍:��;��P��`������W�c�2p�$%�����@�p��p��@My��

>���5K�ݳI�7E��vc��y��`y�ղ��b�l����~�L���IeRnc5��H��NثG�Ō^��l}��l��p�zQ�.����Q�	��4rs�#0A�{ޏAC���$U��i8H��n�������H�x��f#m�OK%�3d5��.�����}���������@yJ,DW��2| ia��_B�Xy`�Pꍆ��]��w�VW."�_�DqLQhR�R��:�>=��xy��/;�i�Ѵ�����za,r/o����C���\�D1�#ϳ��y2'�%��6;��凳�8Ci=��˺����_��+��R���(wu=�y���[KG�O'^O�g���6
J�4%B9D�m�ό*�� ��'_/��,q�B��E��R��z�-��6>Ά����XՖ��jߡƜ�޲��u��\�M	�}D�?_P�
3�O�&g�EC�C��bE�F(�TCb�hN�m���>jJ���#.������F��|��e�4>Mf�FLS��3�t-K�h�a>�es9�=��^���y�7Rc�]�On+p@"�����J�_-j|�%�|0��Il#L�'����ϵMk��l~���$�o�G�����HZ΂B��Z���`���;�q�^\]$�'�IO�ڱܴ�Xk� 5�t;8(R�k�(��*�\W�_%�v�B�[3!^с �PU�/�B��蕹����l��V�.ܡh�ϧ8���fZ�I�S�+Q@V��%���%�8��G*!:aIp��w�VZ�A ���Q�'B���0���l*F��(�K��+�X �}����r��jCr̡S�lk^c�CI��/��vaJ�	�;)�ҟ1%�+&��
.]����op�(�srÛ�~�,99����Q�X�ƞ�%���b��3B\�*�+ ;���S��ҁ�+���71]��-.���m�/w��x�u�r���Ut��\�b���Z��
\�����=;��rq�'��*��K��BX5B9��~���B�G
7
}�?����=k��d�1��L0�BxV�t;�*v��
�����-�j���=h�`�z�`��K���5]�|f��>�Vҵl4i3��S�\c��S�\��*Q��>�Z�R���9�[���m�UosP��z���!ΉyD�Y�y~jyRg���c�ȩ�t��5"P���>���~}Zd?Yا���'~ت��"]�k�ޡ�n+�ȿ_?{�(�b��H�k�-g�I5=�H��Y�Q��������[��U�{V�9',����4z�z��OՍ�A�����C�ӻ~����2���s��9P3�a�?\,=0��� ��n�G�,	�C
�g�^����Y��F!�WYG�V|S����^
�?�-�SQ_���4#��K���K�$r��q�
�裆&�,YĢV�/���� Ńc���L����R�g=��^��B8Jϓ��c����Gs�No����W=D��\�X`n���_�����F&�Ys5'�IEi���%g���ɚ��(��悞Y��O�.�^��� �3���:���4�b��jp,�D��,N��E(�x6Ȱ]l�1M����4}�����
hs�\JB�n�������H�$���8����3�R�H�_���	�D�R�a��J�k&������	%��vY�]tY\���Nbq�>{Hq�lU�ܺ�	Q}�ˀ��]X_����NUz�c��ׅ�OOQp�f�rQd^��i�#�R�)_)��ކKƘ�6���MC�^�1ʠ��y!ŋv �H��~�1���y��{h���=V�q?ms`�(�����\�?)n4>
���ޒե9��(@T:]_���#A�;�J���p��wA5���	�U��E��:�p�tؖ���@nJ1"�B��v2,›�����)`�ē���`�a�ċ�߾}��C����<.�XK"��=���~U:z����b�Z���"�l�hb2g�{��8�u�����:ɨ7k�O��/�mT��Dq5�
:��U��Ň��&��n��ݱ���Sɒt�Uq�=^*�SK��{8Cl3�������b��dV�����ߞrG�d���T��X�5��l��S���7nȋ���PI��l_���]k�t��9sO��'��@"��c�ne��6��`�
��MG7���`�ao�4���<���n�'�̺ijcS���7��D��0q��kt��6dwlDO��*��܍���P.�&����Xw���0��hP(�3sL�R'�w ����3���	Ey<"8�C�h+�wu�qj;�
���KWlR�i���p�����'��	���ɝ�>��8�p��7���앵�Y��
~�Б�ĵ
Bځ��S*/m!�RD�2x̑��٠�4�2����m	���ѣs��`��=wbn�t�%&�OH�԰k��>{��<����8��\Mg��������KPp?��0M�:��.A���ѽ�2��6�,8�s�6�@ZH�H�tՆUވ�ɉ/`����es�׿�_單حr׾
Ls$�"x/vjse�xש�S���j!�k]P˝���T{S7WԜGY�W�$���ͱ3L#6�b�67k"Iqx}�JL������\$�dw ��p�z���S��Kn�D��DC���i���u�����C���9�'���%\_r� �no]A���٬��Y����YNj��Lg8���171��t^}�\a��+?=�D�ga-��}��/D@�m=��6M|i�����Y��O�;��`�;�I�i9�ړz}����l����Cp�I�f�W�B��.�$P\
��ʽ���9��ӚXTV�/�-��y��k��q��(.$
�.�2��u���7�:�&���� ���n<<��2K�@������*l ��1nI��D��m|G�(t��#X�pT�Cb��`)�egۇ$�ޯJI���t,�zqeJ�^�Kz�����%Q�	���$!Iq�?M���v*�R�7�j'��A�	���y� ��8ڼ��X�W6��R�ub�)5��VG��k�TF����s��lg��/+$�>6��ee���8Ef�E׽�Q����o�}�-����QȌ��bF��g��P��/"���T!��;a_�]�V6అ{Wb���B?ɮ,o��8|���B�CaFE�(E]�o��^���=���եP��s�hKj7x��鷃�'�-�z~����⟵������嵽��'�����ܽI�ͽ�[0T˜j1E�Y��8iN��E�{h�ã���?MZ�{���L[o���Y�A	��ڙip~�d�Q�N5��C/��s1��i���S�V{�dwKq�ʺ��D�W�If%�.M��b�M�g�G�V�	ΰ�Ž1�t{�F"��ޚ^�F��fA�y(%���+� *1.{�5*�t ������-�D�/���-���̳���I���mR��h�G���W�*J�!�d}�4�Dw��52�\�����~���7��m�����"����*���ﻼğ�f���v�E,n���ݱBt�J[���Se�SJ{'�>���R�4�Y?�Ff
`~���̕��\?�����#��,�(J.}�W�x�鹘>����J��ʷ?O�$=�R��?�J�]��B��Yw���l�n�7��q���7g��Z������Ao�R�����MO��ѭW�x\F�@t���]����̻�*I)z)�Vܨ3{�۹�z�`����V��Q�������G"l|�%�1������������b��R��9j��>(��b�i��L�B!�9j�L�-����PK�yVS����apip/_vendor/urllib3/request.py�XKo�8��W�����7�"��nL:��{h4lڢbN$QKQq<�������V��Al��b=�z)1:��&�le�fC*+��$v�N++7��l�0]��T��
��:���J�*���D�,Vx�B�ģ,�R�D�~Ưʤ��aǔ�a����l�و4���%�A���������2�:���(Kn,��'���Ռ�	��}����J�ԋ�	��;/K:4_��L�ЖVx��D2�R�X�TV��c'JZ�Î�3�Y�pK�����N�$�ؑ�iy�N䰅�F3G�`�!�Nij�p,`&�T�H{�e:'{*@����j{���X���A��i�%Ӹ�s���Rz>8��=l~
�%o���xC�-���X�ܱ�$Κp��R��c���Aҏ?|O6'��?��n��>����2���w:>���/��ۅ��T%3j�K�~<�1�ߵ������"<��?���7�oE�^���#�'$e�ҔR���*X�qEata����K&,{��H:��Jb��"{�-<�i�[3�)�E�͕U"U?KC�]�4����V� E��n�f��}Z��[��7���S�(ո�4<�/��-3�R�j�lz���u?z��4�\ҷ��JR��#���ַ��>�3	R����͢�i6R\~�Ŗ�>�5^���c�z�|VX�����3Ȼ����[��ҭ�S���T��.��t��Œ�^\<��rE��ڕֈ�m��P�'mo��'�kc���rN��3�|�>Ά������`x>W��1�m�M�tu��κ7�QM�e#����
�zcϡM������>��q�w�u�3n:i�m��4�f'J$]'�����G�D?��y�9jE�h���(�R��ԙ�+�v�H�6�[K{��h��8�e\�Ke+�u�:�J*-g.-��}R�.��c8����8WhDh�B�D��J��"�`���s�Z�o�\���&a���ȞJ���=M��[�AXU�,��~0z�|	A�|�|w�*i���./L����F�i����U'��W�n�=��Ӳ�DZ��,���i�};�́�ܮ'hy1�Dm�"��*uU{�o�
���.!I��F'0Քpf����*O�u�D6vp���������[.z�6�P��w��+��F|Q������āO/.1ކ���������"�m~;��Ga�񿜷��Ic@��#����N�UR�nlys��zc�~v�+S�S�E<]^Q-�<�Dt�m��ɴ�����nnx����+��_�Mt���ݝ��������iʬ+�<��&�鐛pe�%$J��]z�-�G-n�QR�nت�˽�ݠ�=K��L�h6O��;F�1ǝm᭵����'�g�=t<��.�>����'yz�,Ҋ[�%]}�ز�]V�V��"�����e���[H���nﮝ9�T��Vf����Y4�E�o��/�[��j6�J~�C�;+Y�D��;a���.’EɂI�wd_�<��w�����|9��H[����彎`�2+��r�+�����T޲�k-�s&#�*��O�|��;���@�n�6��r���?"z���R��Vt+̎��D�a��t�X�O��[_~Ł	�N!;��T�γ}F;��%R|�`d�=��m���<`�g��F��ޭቹ/n���3��£Q�x�����A���'h��^g��B-��L/7B˂�N4~���3��1o��n^F��r^�1���&�^_��r��8/v�vu�zfe�ML��RM}|Ԗ\^�߹�q��s���|)���s6��vN�%
Θ/gc����\b�!l��ƥ�˷ߒN+���mr��	Y�O���M�p�Ng��Wnp~pd�G_jH�\�?ޠi�����^_��s��N7��_X��b'��Z�PK�yVS)/c+npip/_vendor/urllib3/response.py�=ks�q�+&P���=���9�i[�(mI�"y�S�
Xp��.�B��c�;R���CPw$�;�����ӯ-�r-&�e۴��LD�ޔU#�Y]�m#'���@=�J�W^�VY��_��g��%��E#�4�]SO�i��dŭ�r~/�BVUY��7����5�Z�mc[�򃃃�ڝ�����䗹�4�Xnůř�P�J&�2���ʢ�p~����G�.d�&�7�!Tp;��uZ˛�w4˜:]���D����=$L^��݇���i6���r�I�l��1�}#��B2Xz@����b=r��k@R?{H�lq~���d�j��L
?�	�P�D����=�7��L	�Tc�F��M:��i6T����m�<� �:�'��d��5��o���)'w��HL���d%�w𧬆�I��AfG�<�k��2O�L����/0K#��\��gE�L&�Z�K�?�5�,��n& H0�m���"mRx3�0<��,$N�P��! fG�Ӧ���c��;(T`!T����ZHv�reKQ�
=����A�:`@��AɡrH��8����ү:`-����ʖ^Gd|.ߦy-{کI%-c�3�y�t
M��*�kxDp^��4������@����D�0�Y��yN�+zm��o�F-��QiWy{y}s;y��5t=��W�?^\��7��u��W��]}��yu�
�Ć�ڵ������s��N�[#9�;�0qi��X�ή�iU����]���=.��W)����!�wY.I�>I�p�?q
?���]�����8�v?����$�'�e#+��IAk�m�A�z�{�����O��2���O�,��M��j��H�ȡ���b*���<�d��Qh�siZ�Y���J��-躉���q	z|�GX���k�dti�����]VΨƔ�b=�^G5
��M�A�3`�8dp�ݡH��8��B[:N�:+�eo'�$25"��D܂X6�0L�����/a��

XO�7Q(��d�I�������=�.�C�5���zvۤgG��l�_hS�s�����.Fu�>FB��aȣ��3P�[�ۼ���@�o��~{����c;��R�h�r^���`�/@Ԁ��3)�n�+��)E
C#G`���G�QΜ��X��K������[ؔ
Y�BL�9zeE��B�0���A�)�̳��s'���v��e�=���;k��B�J\�Rb�������;������	�_�`�N��6�ш�q I
6�x0�l���7�z�OG���?y�F��C.�>�@��]��~@�򨇟
&�:Ъ���(u;���n`�`���Qf;u5,)+kVu!�jW�R��ͺt��j�s��������F�E%M3��x
zz�V����x�b��f?�1N�w�|'��&�S1kp�N�3pاS ���%,�ϳ��5�b!�d{'y}L�8���FV�9��<:��mA�c��e^�"�A��k�J���`m��P�kq
�?�f� ��6�c�l��2G�ƆN/0��*%]���jK�g��\V��m��^����-�	���&J�L��È�M��꣬V;�)Ğ�ى�7��D�t���!��P5Y�#��7�h+��艖B6�7Oڞq&�!r
&+�a�@�Ә���9���B��C�U���*[�'f�v��,:��ĶM���6�|!(��>��:�Xd
�p}��F����[E�Ə���+�i�MY�~���Du֥`ҧy���RwK�G�r�h��V9��K9�#�ƟS+��ق(�z�Y4��ʺ��27�=�):fѺ�f���=ƞ(X�T7+OV��ź��i��}i�J\@z��P����r"py$�Jso�&:�,�fy~�����������?��&ی���s���dv =GP�����ś�������۟o.h��G�c�����?�_~�l���=6�p��
�s�>C��S����>��֭��V
OžU6o�f�9��؎��^v�f0ئ,��
/�*x�d?x�3
�}I�'�u��E0����Iۦ�8�C���(����e.�jr�A<�W�� %�/KP�:����A��%�����ު���,(���`���K�iރp�egzf�����~g;q�~�]�t
����v���&��#�Ь�kB!�	Z&h��2���3���,1�|�d�H@c�R|6�:�BsY�&�n#Ah	�Q�	V��_!qM�+��q>g�:�Ԯ&#5@�N��r�g�8I[�=k���9��nv9�#`m�fX����T:�f��kل��T��l�1�2���;�`���V�1�g�MY��7o9� &`��s47����H����EV���W�]N�_=C���;2AQ�P	e�����r���DX�Q��%
�5��:�2��A��`� ):ZA{!��{�t����/�_�2q�
63b���`�=⮕�b�z�W��E?����Q���b��<p�a7we�/P�u7�|�
c^��d��U�"㛻������l��*S�(��C&9�FN&��ݵe@1Ѓ�v�U�=�4he�ϫ��
.t��<��5VGtTc^�f�@D`����̕��#U�����aS��m�P.�0���ON+i�`�Q�]�bV��l��7��^u0;�U�'[9Q�Bb��������[�3��{�O��I�A�܂t~��)B�S��N�.Q�=�)ڬ�[!1�Wvl=�T�M�cv
������[t��	�!dZ�sY	垉��;��<鬃�v�n�fhz-7�}�Q�\3π��h�lo�/�۱+H�'�tt+�qG�62�����_���]π��ې�v�cp�A%���D]�eZ%�}��հD���
4L�e[P�F���z���t��k�F�`qx:ug��Ju�ڄ=��LVca�壸�{�,FǕtwO��{h���B�5Ks�s��ƃ���R�i�c�+���ӻ:Yx������u�]	WH7�"�e
B-W^�i����`�̰Y,C
��8짆Mx�(@����.��yqs��\gr�^��WS�t���*���{�yISp���,�l����;�8�[m��0�QD��	j�C�e�ؤ=�`�\�=?��<s�2y��$�uF�O�I�R�t�%&���i,=��ב�/�:���O4���#�6:"Y�9ϖ��1����j����:�b�t=���H_T,I�T|w2��Gj>s4�eQ��JMZ��<9�YAԕ��M�\���
��aLA^��b>��1�ViF�WS��	��C�UC��:���P,D}�?nChɮ����&nr�;׬��
�H�Fw����b�^Y`|A�gL�β,�(��:�EGQ�����G��<�O�4��qɦ���%���\ċK�N�W<#m5���Q��>HNJ:��ze|
�74�dQU��v�r
�
�z,�*T-_L�(8��&?�㇫��ٔ:t���$��]��Gĉ��j^@5��*@i��#+�S4<9���ߍ�9>:��A>��	|�܍���?^�z3��4�?�HJ��B�P�9��y�nh��Fx�Y�Hr�$j��ŭ�g �<��DQ�M¼B͈��".5�.�00ţU���(��T�
�}��#�cykrA[E����
S��&Z�%�C����m�;l�ȍ$}�.Z��Kѷp�
�h�hG@�@�eL���>=n�T��7J0�������W7��^^)_��1������DUnD��nE4��R�����54-=���ǒ����"��7%Bʰؕ�qC����J���0~��������y�w��b���u��`�k���r2�S	]���zG9��H}�D��:\����Y����ӵȤ��Sn�<EjqL	��p�
�ٙ'Q����R�bCe��ցӲ�݀��l��z��EA6�8����h�p�.���l0��A��A7�P�m�s׿�ΑZ���6�Ϲsl�<���
���S5c�i!�+�B;�*�a�<�����?�(
����4�Q�2�g]�w�e�;�'�dN4�
�ɚ���§�з�  ����1Q�m��{���t�wh*�����Sq���2��+��eX��:�
ᒎ��� �;�s�L�Mw��V �*ս(��I���a�60=��i���)�VW
de�D��P�1�"�Z�`����#q��4i�X���ֿ�DS����䤇�t@җQd({��g�+E0��S)`�uZ �߾uN|�!��W���H��P�=��'�?���^�{�;�a���hX��x�݆�К�Y������MP�LH�Q(��]Un�1�Ӈ2[�h���@�B�Y����w�,zX����[��D�#8���*$�!*Rղ�8nb�}�� �W|�(��c��(N�;��NW��{�x�/�$�bG��X�H�-���+�@�f�8��1�=E�,�N�PFVx��ʖ���;E���2��b<�����b��B^q����SqW�1������,��,���/5��Ñ�(#��~^u�
#��*Id�wVWM�O�c��4�Ǿ�5��s^�u��cӅ�p�u�Ya�?�SY��%�u���9}����a�뇷�H�9��[�{���z�)qf:��N�GW�>w~���n�w�06J���A��
%Ԣ��p���U9OYo�E)kTzk��0�\�yB"-��1Ull/�<�����б�����Xe�����}xԸ�Y��$y35���KJ#�mބ
�v�d���G�ԗϗ�;��ef
�[��?��q���,��QU�IX��fE^bY݇�&>̇5�0.��t��9x�@'V�Ɓ��S�G[��?�E��S�c�>C�2�xd�S3�$����������y�$4��Ϟ.7`��;p�Y�X�����uOSK��,��ڹ�2+�\����?�5����`T�;w���l�O<��-���Q쀖�AZ�3*��9G���s�?�Sd�O`�/�j�B)��xݮV;]�J�>������G���)`�r�Km�@Fd�M��4D��}�JG�.�uv'1�|�,͑�;���4s�����%�{��[�
*��u,N��O��9���Y�������۬�[y��ɿ�r����-���T��8�AG�ǔ�������V����btd�ϧImg�=�6�G���"ecuJ��ڟ2<�F��ǯMw?=�.~��a��bř��t���T6�衚��3�K�.w2��<kv���.�0`SǎKY�*xT�	:-a�F\$�r��Q�Ok����…u����-+�H�.,M��i��.W��vq6;�S�3�˅_
�=0�N�uq�뭭1Ct��p��X��)���=&�%]��كh`�g�q N�7߈��>D���J++szS[l/҆˩���p�StX�F_�Y�Y�T\f)�����a��Y���<��7���T$B1���R'@�.��z�"p�*�[nr�um+�ȷ���|9Ax�����R�P��߹��I�nF���k��g�ԃV`C��
������������Fa���Z�C����w2��SwA��#�A�zO���W]K�/8�M,Z��?]����' �
E������㐼H�j��6Q��P;��y= c�|cnѺ���gx��N�
}�@5����H�%]�b����N��f�sm4�s�7,��UQ��@��b�:��-߯�N��*�^�XbϥUxX�sK�W�Õ�}I~������Nr�$?t^���K�i���O��y��]:p
K�;��q����v�/�TF'O��q:S"c]k}�N��0W~��{�A�g�q��K:BZ�v�>E�gķ5�0i�ʞ���\i�����J�!�YS�忊��[��M��lij�,r�Y�j��}�ר�bҾx}���͹�
5�2m���w���4���9ey�ɿ�6c����d�	�{s�>1Hx�B�9*��B܄����?+w��=Ţ�H�{�>DO/<e}�m��h��!g�}bD�E��O�t�=<D p��|@n��rp��2XEG4�;[W*'�\����Ir5���q���c+�G�h����/�[�}A!?u�H��
���ё���*[0]�a�Ϋl����I�D/��D��iО�� �;�ۢ:M)��x�����W
�Y���Cx�k�Ux(M��E��0Be�/�hJ��g����ft�g��]|��FX�{e���}:� >�`�G�i��q'e_)V?׺@+ȋx��U� �u���uJ�#�ɋh��j:7�tn3�,�ƚ\�S�(H����⩒�]S�LבW�O��m�Q�8
�g�b�f3pk=�
�3r�O��s]��C���x�)[a�/{�g�SFڜ!w:s/�oUL1� �=����
&���Jn��PY|�(O�
�R���W��G��l�o���wN��
t������}����^L�<��|>P�N�8�J+]��S}���������&�p��0�e�t�I�.��$���J�!�wܤs`��H��5�ϯ߽*�*[c��b��r�6k���aK�^>'�y�Ș�8�~�Ј]<�:��^D�I�~���P�Mp?���&�ƍt���|�ߟP���j��(i��%V�&��(��S�z-�V�4�MH?"�2�O�C�l]#�!��Ƽ\eso3��v�4�.6
�����dP�>��48&;Wܜ�n�f�QV/	}��O�v3=}��C�*�rΞ��ʌ�z���q���u�g6��C���Ԫ}7Ќ/�V�ɭ��U���}n�G
�"�^İ�}_�ޞ:ΰ}X���].�n+{����w��Fw ��z-X8;ფ/�ЇY���U=N��i:N��̀����,Ďy�}�j����H`�y۳x�O�t���L
7�$���w�<�#�*��r��[MΉ@]�m��E��D&� ����7�lu�|�Aa-AH.�M<����Lp>Q��m��������̞��?�a��j<���7b�������ũ�2(t˾�4O�!��e���(���:�Ĺ.�F��<D<�t��LC��h��`�r����N���r&
����^�t�:k��8�j?B�~�~Dž>[eg�e�W��ŗՎ��{_.݋`���3��d��B��1m���Vp�)׭ז�Ϗ�K"�K�1(�6H���v{B�A�O/�?'���̼�c��Eu�+Xn�M`�ҍCg�
e�m�u
_�DnX�fHA�>ҍ "՚��n*."��YI���/eVבx�}?}�?�k�'��� ��8�O�酄U@��e�i�=�O��^��:��{�Ҁ����~q6�PK�yVS'pip/_vendor/urllib3/contrib/__init__.pyPK�yVS*����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#�PK�yVS8e	�g+(pip/_vendor/urllib3/contrib/appengine.py�Z�s۸�οU&c�F���Ou_��<�\�X��N{CC$$�L<���vڿ��x )�nZ�$���b�}�d2��[.I!�6g��ŎgLJ*!rRВnXM�-mH+��{!6@xQU��������X�n�
�w<e�Oۦ���Y��6�7jR���VS��2�ʳj�lEy��|��Qt�@�
i%,~~E>�Z��U��X��:�99_�&��Dݐk����(=HQ65_�N�t�*6s�e�I�l%�4|=�r:;W���l�P[Ѝ�H�wq}EVl��l͈LYɤc��$���LQ�\2Y�zEJ�H�Xs�������QokƷq�~o�l�'�/�'srb���,��f�¿ۜ��
�|26�Yt�=�VC�_Z�P0�%��ܐF(u�I��"P����
h!�
 �V �Z�d/ښ�9O��1��o�5cDTZ~�n%/7�E�(�a�}������D7��4�R���xK�y�urǝ\y%�9e�5K����{��:m��2EK��r��&*t���
S@e��!�^��Q0O]��	�o1n�jOXIW9��
X��Lh.��]���l^�T
�"�,�@�{�O�����+*9(��ba�^������,��B�,1|٢��K�z�е90C���ҷ� l��E~{ks���r��h�TLv቟��ɗ����ӛ�.�7ɏ����99iꖝD��\���ŸB��E������&\�g`���l��r�(�uY�.G��!
v�\�M[+�e@
��kQ�l��;�&Pa"���d�6`�$�	����ۆ%�{�q.�S.6�4��%|��c�����4$Sei��e]�z���ꁏ��3k�Gs]�F�"��nn>xߖ�``32�"T4�3�X�;x�qoj���&xig�j�~�_?20t&;"Y�j���ٌY���9�./��n��(bH�W̌+��w�Ԁ����S):�!WjX�Js�PC~%��|_���
k>�#T�$)i(�
)4vu�:�
���r���
��S�L8�α�/t����ƿoDY2�r\���aP
���
��q��/�^����װRn.e�hF��$��	+ZГe�H��IHd��`.�2�6�͒@ϗBS���e���bh밿�ҨȾ��C?C>^�Z�<�IM9�rX//�B�e����<�Q�c�="�S�����N�0�ɯs�ͺ�ta�Ҹl+���(�a.�?T5.�j'@��/H�6t�o��f8���P�Vۮ-�x,s2
� 7	��t�������l/T?(�AJ��GLs`{�N0��[C��%o�dꄓ,_ϻ���j��,Ѝb�?��9��I�ꆯ1p�b	%�#��J,��׋C�����a9�H�R� ҈�`�+��$`0�[�b|�����4!��k5]r��!\s��6j�6g4�x���Y�h��a
s S`��\����e����Y�֐"�5=�o��M�Ǔy��P��<Å	9vxS0���ǀ�gl8�؇L�Eጎ�>AAP59~{���ˇ�+V�=��Զ.À���*m��+��@3�
���5�wЖ�f�f�6��a�߀�{s�T_5����E�N2Axv_V"�"�)٠f��`���ik�������O_��w�ټ�����_��ܘ@Cb=<5�N��G��EH,�F�~6� �,v�X���Jb�([:���a~
,n?��f��vڢ﻾��_��?�5$�Jm��F�BgH�7�b<��}�!�D��([t>s�
����;�-/�E8�K0��u~ykd��q��L���l��
���̯J%��Cl��M!HN�
�`M�m����?��᧫}��p+�e2��%�2�WaZz��X)Y���Wg���lĢ�Fnz̘o�}�aq̔KPP��8>¦���x��P)��6��d���?���76.��u���;�z������A�a;����Jۭ�Q;�`ҝ�ڈ�`�?��^��s@�s[(	;�=�Z���u���)e�H�P&;:w5�ղa9�I�YZM�?Jq�����@�X��ޔih�ס��7[�ީݵ[������j/:5���ɑ�rl/1�Q�{ⅶ���n�IX��/^��cvn2y��D�Aҹ�׋ƼLk���߭��s='	^�Z9�g6s{�=DžV`x������.�f��Mn%�9cU�T0�O�i�r��3�j7��g#n�Kr�=&g�^099���B<^�>~��`ă��j
�2�S����1��!�a�:���>����;N4��'ȉ:H�a�m������E3��̖J����a��ZA�LIR���H;��Ҥ�c�pj�u,����c��Y DXs�N۳1t��G��TGѩ������w�_��#��UX��,شHV��݂ˑa�5�7�ڻ�E�]Lg�R
�l��S��B�"�y��ӄ���0�Ѷ$����9Y���zܰ�P����r��{����#Z���ƧlӉ�>�ԓY��A�!C��F�ɰe,_�o��~��h)׬~�ܖ����/�^{��k��i��{�|֜�ĝ��������V�����dN�my�2�c��Q,e�{��$�y�bY�����);)�`�:�!��m�+6T�I����A@��Ms����=�^�}hf��2f�[�{Q��ѮE[�
��%)��x,����9;�9xE�ۛ�*}q���W���ֆm�ȣ��ŘuxR�8jːTW��L����W�&�6����M�B��'�R���N� +��pw��8�|40��"���9�1x��4m�&�>��oM�y�ܮ7��8��{M�V��p/S}w�&�#�$�sd˽��os�����:��S5����[uKT0+�t� V�'U_���\?��=<_� cO�5R��Ճ�0ϡ�Z�j{D}���H84��5�f��k�_�̂.�v~j[o����>���
0&��Uƥ�����YV*6%�9�	t��)v��)4�X�G@�8@�b�����C�M�Կ��fa[P��#U��y�~���iMSؔD���C&�O��������%a���#���E�V��̐l81)v�|�lE�PK�yVS��C�T�'pip/_vendor/urllib3/contrib/ntlmpool.py�W]o�6}���ST�T�IW`0`A�%�Ҵh\�!	Z�-6���T�l��%��rR`�����<<�~О�M�V��T*��b1Q��B�y@�%غR4��#P��c�P!� �dr!eE���,I�R���a�n9�f4�y~XV"���!��aBa�o,Y�&"��Cm*U	E��d-y��G�{2i�k"
)�o�r����g����Bey����t������S^4V���II�{��2��[���;FqƐ�'L&-�P�	�J)�lx^C�G3�r�T&!����RN�j�e�� �>?Ϻc4���8��rF��A7��
�)D����J��)(/��!A�wh!p?/$dL����UU��[��jmm�������uy��G^T�
�P)�j�Z�cyn�,p��#��vz�q��a��Xv��t2A�a�K�GQAr� \���tp��>�[О�#8�D�0�^�&���w"�q��$P��d��O��F�لn0�Y�T��f���@Y�P��+"���������B���֞fh�A���%pK-�E�8$J�`(kS[�1���D���O-[T��1�[��}xrqu{�W5���"'�wU֭�娹H����{½�hE1���:�m�aG�./��[>-3�eAjsхA2�|T��ەP�S�w{�p�srL�����fvb��
vl��ˣ����@ʜ�(h�2���>R�ɶ�MQr��{j5�4�rj��A�"��{�oy%��3��T���:e��;bj�D�D.�4	���*��$�����s4L��ݔ�Z!�p�&)�*xI_~�l��sg�H�T{����V��n�R����ׇ�7�J��'{���I����'�����c$KǪ���NQ�^�����)_�c��tA��z��[GA�\1[�r*%v������4(#��W�1v�z:�Z�}X]��������sڤ�C�8
�O6�Zs}`�~M,�M����r�C��
�Ğ�:�v;vM;��i�EHX�|��v��f��"�2�-l���ٱm��^ܢy~GB1gބax�uG%��l6H��<L�����y�.�F�t1)�CS?θ4��f�4(��+�"�5�'�l�z���6�c@t�)�h��0>M+�)���9@�uT��+NI��bKGQ��o�5z Ye����8�u�V���ӛ[\���KR7��1�A��
ț�[̘6e���S�ɛ��⣛�6K
j�O��/��X�u%�}.��vs�1��y�Ҿ�Q������<�v屪���a�6�������l}��)��'��˫�'jʈ�=����r�zwK�����juq�d�A�u��mϻw��ǥ����,��M��_y�m��̱:ዩ�c��p<��rر�D�ev4N�����%�W�l�s�ǧL��RҾw�鳹�}1;e��^����}l;�9��{8�_�h��dJ]d��O���E���8�����Q:��߃�Ԛ'�����3�'F��;�0���+Q9��'*���y�����m_o{k��>�Y��g��y��r��)#��W��.E�����0��Sn�PK�yVS`��^�B(pip/_vendor/urllib3/contrib/pyopenssl.py�;�s۸���(�&TNf��zsO�:�9r�ib�YΥ�L��HH�"X������]$HQ�s��>�ބ$�������w3���5�]M����2�
����습L�+�]�$�[V�E.X��*�"�i��%�ɒme�D�$����A�x�c�9���q�����Jb�(Y$��L
���U���He�\,\��>NW��ES!"\�x�HO�uOD�$�`R�A�S�H�~�w��s‘K������|E��O�z�l��3��f���Y˓�ξ�O��„j�r�x��!�&N�M�ag�k��![*�a�N�<OhF�܅|�8נ�{+�$;��������C�]����U�,�8���T	��J�b%�"ٱ�P8�`"+3��(%^��b[KH���03q�	yj��2�h�4��͆�(R߇�H�,ޏFl��u����߀G���V�U8k�]v�9�'�X�J����$鍖e��*U��eZ�x�W��8�d�i!5�A�&���E�5.�
�{�q)���V���L
��I�}�q6��q!�2/�&�U�罍�������;&Ax��F�z-Ͳ�����q��R<��;����]�݈�/�P���X�T�AQ1��:�0��7 8�%Y����D)�j
2������)��gTq�+S�jZ��4�E,.��Zl,���ۮEJ�h-�iY�+Q;:��!&�����󬹎�́;�<��U�K��%xQ�	N�(��_�=S"�QQN�c^N7��������y0�IMA��#�.�,�|)R�Ǚ�b�K�z�o/gBA(��F�42�@�C�Ƣq>������Tq�ė,�q1 D�k,����@cV�}��u���$Ht�b��\�Um^��$/�ÎD�˲(�k�|�ˤ,D��{=��e����M;���N�}�_�_7�� +����k3�|Gc3#���t\>.mu`�*��G�N��K��KHQՇ�Y'8C^����ǰ��47L��:�{Z�m?Ւ�����l��k�9�`#
;$�L�>�]p�dYh!K7��@�ۜ�Q|�ʓj�5qK����O���c}MXl�J*��|�pD����q�;P�l"W�W���}��F��0�[Y�I�����/v�|�Q;vs{}w}q�.�H\��N��z� �H^5f���?d}�P��������{��"��rʳr���|��1�S�@��<�2231���n��H)�
�W!�	�j�S���z����1�	�xs��~��=�z��ܽ�~3��?:�՝�p֜B���u.qO�`�<���f#��mH�A�a���[�	�S�$�������9F�&��(M��2��t5q=N٫'P��P����We� /"0��A�5��?D{1�����&M��ir;����M�뛻���N����;����ɛ���m����]0�*0@|h�?��a��҆����~@���=�qP>�����ͭCS�%SL� �P���W��=�>�N�&���/�2��m+�}����z=��U���Q�ݼ:���O�L���ϠE�0hB���;x�����A��:�RmO��2��QP?�FUL�Nh��0ų��׉t`��@�^"
��
 �A�[DZ3^�H���(l-@+�&�#��Yp����
�i�xsr�e�NQ���>���x�c��*�� ���e
�Du�Ǟ
�Ȗ�.�XxD�D��QBV����n�
�b
.VY���V�'��"��x�����������ۜ͝�h���mvT�����갵H�"춀�C�h�;��3�l�{��x�p��J&԰6BIx}a��*��2�\	�M�C=�|��D���Y�f0o`��u�xE�#�"����=�U�&�s�1U$��n<A��ü&�;�ceH"�'%{�F���
���&@<cU����g�і�t�Up#yǠmaq�kP�A�����/�pB!P�ƊT���@����Ư�c���U�_-Q�2���wT����⿠�JO����'�vK_�b��[T����-?�x"+r�墫V�lVR�p�@>�R��>��&Ԥ�M0�A-F���0W�i�V[��a`�k�_�F�)M(\Z8��i�
��t/"�F��>��E���g�)����>���J�H���$*[-�R�E����"+�_c+�Z'a�E���‡��w�'?0�b��3�nv4`p	��h��4�ſ
�lu�����kJ���"���j!\�"M��CE�R2T(�V`W����O������vBl�}�e�@�vB�n�:�^ǵ%מ��G	.�Ŗ�Z&"�`�\�H���%��|6a���eQa��&v��2��%�o�	��ξ&j>B5b���?�i�һ(D�D�m+�?�82�����ɔ�w׭DGtǶ"��?�4�� �������!��}���	h���#�Kb��鹃}X�#���O�H-0}�7���ȼ>��8���[�HR���1�0��M@(��o��[
Qu!L`#Q�96��7�㶌�FJ�,W��^Z�6P�G}�,���c�~�KI���B�aݡ�8L4��	b��-%6���Cv�(�Q��}����䇾^�AEk�s�O
J�L�!��"���]y�v"�V���!��a�.X��9�Wݸ@+'����MX�:���񦄇�(;���d��b��b+ߊ	�Car�yтcVA�-X�j�L���L{0���+u��A���	R7d�2�Fgj<T2'9Ȕ���C.Qul�1E-��(�L3������z������*_��j��藐�.f�W�J}v��7�'�&�N� �yq�<7Ȗ<G�@dKBf(��o?�?-��QU'���l��"�;S��sG��r�dq)K<8��%�N������IPb�;H+��o;���Bu�EK�)�ᒨ�V]��as��g�
���n�	
�����f-
;=�[y0K@}�����><y�h�U���K%Y�N��M\�&�+�U
*o%�5%�@a$,��T�!�=p4�"Tb)�rR�T��q��vm�G2H������'w}SN��c1���H�7P5�;*t�Ⱦ���*��㶛s��hR��c�����b��8�3I�lȱ�A�
�	�I
�lvO��H�[<f�o^g<J(�fo�f:TWT�l��l��0�⤪C�4t&C��p	
-�֖
r)E�:D���ߢ�u����->	���%��"�-=��l ��#ֺ�|�*�Nա2,���Z��jW���J�^D	V33�0�wx<�μ��h�����n�S�+��u�{��dP�tr$�J>ׄ�0yq�f,h��$d� �(!Sk���s8�c�ï��?@��<}�S��{����Bϖ�{_�n�@��
2��n���2bաP�%B���8|����+]�5���j�WZn�LXF f�l�Q~�o�E����r����ihN̆tP��	_�D�����s�
�4SO�M�zi�s��A��X
A;>7'6�SN[�a"���Zk���J�~���:���+.d�}K��C��
�w�Z�B��T����],�w��Gv�L���N��l��c6
XV�8%�c/�Z���xq��'���:v��i��'dm4튦qD��/ o���_�\���i���%�j���!v��Tb@3���~G�g��7��f.\S#�9��0ʸ�����	%oi��j�r��j�uYDr��g��GR�����ɛ`���ݛ�W�,#�#���G��ct���C�h��s�e��`��{�.m��-D�����/U(}�	�"�`�O����nct�w3�~��v���|
��x�@a���!��\��@i��[B_1�F��7̭������Y�W�X���L�a5�^{��g����=`���ܶrȼ���H�v<�pfYx'+ö]ed�x#� �@�`՗u1k���mƅ<��TS��}�3�;het��l��{0x�4NK�����z�������$��G!�tv�&�ZM��6�[���L��[���E��#w�oY�݊f�)Kw�(q��A���>c�ӿ���mᑱ{{K��y�%��X��b>n%�IV!��@g�O˘��Ξ�������0�n���z(�r�#������
�;�U`,q�\���6c�p1��خݫj�ڶ�c�?���,�Ku�k�:'4ό���d��[��w���o&���
�����G��e���<���%�)6�z�oO��W�!���yR��Q�1�RO�g���>VO�U�d!�R�w��
�^����.#��a$�c�]�Q&�S�|�
�G��Vd[dư7PCc'm�ǿ����SDВ�CFҡ.����O�\��w]�m��|�1M�������;e|�x�Q�Smק>N��
���i<��
9x��3ᣩ��yb̀��B�%����>��k:�us����}��d��Y�O~��q��-k�/�ۜV�
���4i�����:��87�G҇VŮ�̠9�v)�¼Q6(T'�!�����4�GC
A R�i��8���)��^�:���9"����i{�C�Z~4�w��'��y�,%h��̈́=0�*�P������\�sFkgk0Q�L�o����s�4��-}���ҭ��aGU?U����}r5t��{v!��D��rBG���������V/�s�K�)=�mܷ��&�釃,*\�*�������Z<��k�,����v�A������qoF|M}Z�t�����R-�
�Z�(��p%"(�<N��ზĽ�9�����J��_3
i���i���ziC��a����;G;�I9;��*����49A�) �����"��E0��ty�o�H��4�F�x��A#d�$K�$0o�n쨾��\N��r������/�5l
��ƛ,�k�^�dM&��k0\�8����uRE2��4��&
���Ap�io
�'k�Q��Kڑ��۫��ϸ�5�ck�����S��TS=��g�͜�9�ptL�f�=ЉtA��࠷S�B`gm�_�fBl��/��4.
����hz����#���bġ6%������-�f�^p���O�9�-���j�y����R���h}�Z(�R�k{(@�323�hX�g���PK�yVS���%��.pip/_vendor/urllib3/contrib/securetransport.py�}�s�6���+���y"s��$_��F�gT�X>K�s�T��(��"u|X������	�������+��I��h4��n���v�2,39˂d�f���
��L3Qfq�O�C���md�u:�U��up/s���ڭ������]ME�Dq0��(�
@��,i���Tl�b���(V��D�0@��D��<A#�A"�5"$��
�S�e`�+nv'7Ax���8Yȯ�q�>D�"�ӵ��É��8͎W��JfPz�YFY��\e\��F&��U�X@�U��	_�:@O�B�����/RK�G��i��6�!���A8�<�CZ18&L4��)2B���`b�1�d)��֨E�j���2�H2X�/�^��	��I<�XY�yA���*�L:���6�A�[��I���A�/�K�i�K�a�QZ�@�8Mkg��S��� mW�FҴqynF7�oOa��X��%`�Dr�H����9
b���Ug��y���,{j�I�Es�EKO�/mZ�|�q�c�D�D:z0��
�#�CxK
c\ū�ߧ 4v���`]�e�z�z�G���Db�bS7n�9s�B<%�!�Z��u:~�;X<�*-��S[�S�z9�O��G� �#��<�x(���
d��l6;�@�?(��\ �A^�"ʁ��s\l�IHBj�LK�����>M�Az�a���a�,�v�$B& ~��`�Ή̚#Wњ}��A�(V���4�M�� O��^��t/�E�<y��5�<���<�0�i[$�B����
��������<N�{�*�t��@��woO�;��}_�Z������~�Y����[������r��L�\
WAv�h�Nl��H�yD	R$ X!�'��,�A�S�<
�`���5l�����w.z�Zݩ��=�8l!�X����w���m!��C�0.i���q��x� �@Z�	�>�~��%MqS��(_��2sY���"���O)�} .@�`��4�J��H+�C���ޮ�5�+�T�
H�,��f�X�@B�����%N�i��r�(Ђ9p͋y�$��d=J�z�ի|By�	(q����e�F��3������S�Gb:��}܎�x*nn'_�.Dw0���}�e<�8�<��vp=�YL.��g����/F���v4���-�����zx��b|�A���ד����lB�*p��~�?Ÿ�����g^����a_Nn�@�ng������|{3���}=�����F�F�3F�gb�7�CL?��p8�7�3�E\�pr����Ǚ�8����#�p�j���W�񧾸||Q�	@�ybS�T|�8��8���Ɠk��pr=��?�0��Y��x:��x
(�4o'0�zM�1$$��J���<�8]�Ws��^���2>��e����WJcNJW��w����r�_p��&�_2˒T����&(V��|Z<���'�꯼~QdeX�(V �Q$�[�gr�a�
�Qϣ��%�X��V��wƫ�
�=�'W>h'|z=Sm}W��#���:L3y��)`F6WT��߆�NJ}�@
�1X)��ף�A�ʬ��z���?/�x�q��}�n?�L�B5�S�e����
���
3\�4Lz�����9C=%�e!1P���ܩ�͋lw&�+q��|#�h�gڬyG�i޼�z�>j���aG~
�cz3©>����A�sq�&���#�?����=tN���A��N�J����n�	�|��h�������1�Z��3H����q0��Ṙe%@OA���x~���P�i4OcțL�A^���8 �OV��8�wJ��@퓊�-vl�DQ밒CkZ�=1�]�����3�kex\`kˢ:B3ei�b�Jv�!�����-R��?�ѽ��k�I;����������[9,ЌU� �4�[��Q Ũ�c�WB��])s�S_��_*#]��64�l��A��F	n��Gk{�&���
�������A�*$5�sv�؎D���~�BK0�Y���G����Vh�h��jW�Bp�"�6p�'����~6馌��rX�$�.��,�՛W�kpSl=6b]�U�b��ܱ�K,H;2*Ȍ�p�q^	��i���`wmRe�0��<�e��x���3-qAVA��.��k0R3�*���? 8��My�2C	 e�������Ê�|�39�B�r�/��߂��Ք��q:���y���+x�.�+q�֬P,ȟ|���k*��
Y���^�
�{zb4���a�
�@��w�T���UY� -q06-�#�9è��[0��W��O���N�?��ێA��/��P:�+�j�t1�|�����
SF^~��ݓg�(ԟ��rF���H
�ܚ��[�	tl�-
[;�!�`Ѣ���ݟ~��LQ��yn�b��hx�q���|����h��{����!L����'�~�]�᮷/�#Ȃ5
��{��L�~>9}���P~n���5[=���%�jt}67�~����L.z��u|&�=u~�:>�c�%3{�^2����ӹ���{�� ���m����d�J=�!��*Y��\YZ!Q�U��&��HP��NQ�1���&.h��Kԧx4�!5�g�I��K�.a�2� ���*�:D�U�Ж��aHXנ�է+'o���`i��>�5�(��+��M� En:�g�g��('�k�|�B-~����� �"��^�M�����-��:xv�_��s79�Z�������O����Sq<}
����H�t��A�%~z�Gq��t<���1}_�O�t?k��/���K�zH�bP���&�rw�	
p���-9j�~�.��c%|<�+��@Ё����xB�:��#*6����h��v4�\Oo0(��66��혦m�!����m�eQ��w�lY&��o-���c�l����5�!��=в�f�货�2u}�}���;Z��"(^.�x~O��zW�|:Օ���i��j��pPm:Ӈ�2/X�(l�qT�R<�d��h֨*��x���pj���܈�w'�GUg���a8N
aG`�,�'�wW��A.kdl�
�uj�D"h�=Z�㗷��]�h-1>Ѐ
�T�z�) nҎGE�H���5@�t%ڮ0
l4�����A�T㨈��i�џa�f��\��� ɐf��=��}
�M/�򊥈=:g�F���5��AQ��Q�&�ku�{�\�c�����P�d�2�y䑼�L�y�u�����$\�ɽ�G����A6/��	ʞ�5J-���sf�RS`�jqpek��n�N�i.@i�e�B���5��qI��#(;h�="=>��^�^ś����8&o5'־�����k5�y�2oG������f|3j'���ub��
wPM����������,Z��a�{������<��|�^�V���t�(�e��~P
(�KA���%�/V�`tq�h��|��π��S��]!st0��{U�������Y�j=���oZ��hnj���˿Xc��Z��V���bj=x��ei��ֵv���?�(g��|��.1�mJ6�ǔ|t3~�&Z�%4f�u�o]�w��gbx���YGy�^G��) ^�Q��K��Y͔�w+;����F���h�5m�����p/����1��x�@��$ē�8z�t�L�� �ć���&:�T��2ih��� ��i��h?�sj��
 �����k�N1���V%Rx�W���`቟e��S��9gQ�<~�:�ì�_�R�(��6��B�n}�q��_����c�)��,_x���\=��c
n�ǘ%�<��Z����:w2E�B�����VTi=����_d�wć��V�wD�r\|t�Q;��l�u*L��x�.��]mG�/d�Z���2^�F�V��^�����^�U\�Q��Ξ�G�}H�����/͍�[�s~�/�e�c;	c�YՎvW<`��R�-�N�?�ԏ认,j��U�EP�C���!���(�uv���-�C(�p[P��N2ZI�Q%�p:I,����A4�%�e
�f8���2�(娋���˻[a�7���!�t��!�&j��]x��������/��ڍ/�A^7x�����ٝ�1�A"�9�T�/5�`x��i[�dQ���䰼b.9]
�a7�T�"�?M(�VAr+Y�xifa�:�g!���9�����D���J6ۀ��R�M�
��d�¢^��O1-����N���
8�W�1�`2T58.�̍�����w�6�������0B蜸R<��{�E�4�&�JU&���hTMËd�Wl&��I
u�f�P��Ād$l�Ğ�^{�X�&A�'}[�UD$*�l��
���!�a���b���$��*�R�@C��2��U�K�⯖0R�`%@l�\�S���c_[\��̋tMrr��׈�����@R(��"/ȷV�^A��}Nke��EΣJ֫J���H>H0�lM�mdS$˜�ii��s���uҳR���zo��)�#�m�g�`J�b�V��+XR�5J��a�^�on�v�8r8(�7Iu�+���	<5����;hM��n��ro�Nm�}��j���i�!��(��-N��"AMtkx{kn����Hة����V��=g�z�x����F�I�5z�U���%�{�k��-5�����[mA�AQ��Q�n�Aȥ�B�(ˁ,�.�7n6�Q&Q�G9���K�0�n�D!=�h�D���gnQ�Q*�ӈ�g]��^Z"S�}*�jjT
)�;���3�ƞ˪L�V>��`��D��s�q� d8Clo�]>'��@.�O��J���g��_)#��>��=���Ѕآ�i3h�l^~D	���qLo>\t�E��7�s��t^Ӌ�^y�;~�����Ȳd�(���:�O�y&�������b�6`H���_)�RF�O����� %��Jxd�JfBc��r�E������^Ϲ8�c|:z@�+-df5�G���kr
�>i.j�5���\�@5.�nu�8�۽>�=um�9E��O��vVᑏ�a��>
�@r-#��)�$C��{�tp��_�FS��s\r�S�:����Jf,Y�2�m�q�l��%�ˍ%:T���>��@�JhI����E7�w)ڸl�5�%,�ң3]���:,�w�=c*�J�,M
Y�J|@�Q/�])P��L�و�b��ʎ�Z��U�9b�yr�W56�òڀ�W-�_�n�0f�Nglv�!��.\a��S+�0bPfb8�9s�
,ҥC Xt�`)��1�<�?��a� �Gވ��"B�<�a$ì~��𓄔��!f�V���o��fo�$��w�7�虶
�(�H�[TA���
IqG,�f6�B�n�@˴�¢��H�a��s�H�`�'��:I���^2���[6%��������.#%�*�4\���uo�i���d���.3]��{]�p��w���=:,�u��Up/kӍԁ����
M���_(Cܖ�Z�WO1�R�{�a�Јh6��]�3˶YeAn�h{v*�rO�L�\�r4��xiNE�Ze%Ȱ,�@��k�������Kt��U���(2G��6��r5�K�1����GE΂�2���k���t7����9�bU��\�n%��hghg�j�Kc�dF�@6n��1.�4Z���q�;�����Ύ'xr0��~(�w�+�g����
1Ւ��M�B�u�-��wb�0�h�hy�W��<���T�{���DS��*�b�ܮYI��d�#��Nۢ��QY��/��_FTA���`��@F[[٥-��T�a�[��ɷ�������H��L��h
�
xO���890����;�2W]���y2^V�@	XQ	X|��ycb<0M-��
�DW;�`�Xa�se8�3��O8
�:�d��^�,��?<�p!�9v�bz�5�h&)�m`�q?硭��k|��[�8��	�rΊ2��iG�8AF�O*�u�K����Q)m�{�2��{|�\�54�s����_��je��]�_`��(�y��;FE-E��}3D�r`P��4(m?��+DgB�M�I�N�]:2i�E�ϰ��-�Tr���T�%;MQ�O�r�'
G)T���PܷTSI�M( ��.lQ�f��H�I2%�
`��f����Zr��m�nRɰmR���}�ou��rˊ�p�?s�s}�����a� �^�T�e=W�����ua�����1�c��Ҋ���0oɡ�$`p��'��L�������e���>�X�Z�E;jI����C��H�()���vi�I1
���{��$u�Y�_i;UC�t��*�cp�
]��o�U(��o�c���ࢴq�[J�Y9vsI����& >�o魣�rX젢��r�G�0�j4t�өC:~�S��N��GeO�`�YO�Q�����į�Pf��<C�f@��p���
�bN��Y�k4��F�*��R_4H{��zwN�ce��/�O����ω������e%~�t�?Od�B	��6���ĥd]��X��cDe�?�����w�uP]hJM��ݰx=���w=1U�|���W	38�+W�v�FM_'�Vo���4��b����$�*�b���(J1f�1!�����:
u��1�J�kX�7�t:�p�{�)�@��62�n����Uђ�
�����]�e]v�dc
�s�cyHʖ|z`������o׍(7Zբ�a���|[���5�g�.O�_��Ї��WI����j�RP�8ق��Qk�����$�uqs�8`6 ��q��ۋ)��(��K��	^�̂ǐ�.��1�X�!?�wN.�1a�x���L[uy2!���1�Ͻ1|iRQa�R�V�ˁ5a)™l�z�2s����Hu>�(�p�/�o5�;��o�2��=�~�'�
ew?�XX�%L_�Y�!�5k<IBȞo�ġ��v��~��J���<�CM��o6�R�-�y>�r�B+�i�~UcU1yU���et�ҤN/�H�=�L0߈���~���ln���\Ve�I�y23['$�Z�;)�^Z�lr19�bf��:�%(i�	�`̘c�E���܄�I��Pe�7b��'q�d�n��,�^�sQx��7�����1�h�c���Z]Ht�{v�&"�LeG�����`1��o�F���%����>�v�:���B�%ԹQ�*Dxh����s*,�6���n�-I�`��S��69��Bm[�/��6=�(KR�y:�d������_�<b��5'��aʃ�C�V�jP�gB��W���l�4���ܮ���\��
�8�a�^�t�`�,��l��UG��c�hs�)Ӎ�`�Q��ȷ"���$#s-9��ѭXc�LHᡯg6
AM!gt�in�5�*Ŷ���)���Ŕ/������=��9�N$��Ncr!wVz��:��)���Kb�4�=#��"C��H�[�����U:�{xWl�ɍ��MM�lr�@A��G���
~�C��P{��Y@G�`;�k�_i��W1�:�4�:l2:��I����\���q�FF�[���H�s>��JL^&'7��;�SCN8�$W�8*��%��*`́tL� �0�ə�Ͱ�
QY�s!��V�dڒ�`nȚ�H����W�F���\�=��9ʼû��aDww�l��Y��t�ԭn�i��-P��L'�L���6���`F^�M�+�oI���y���Z�
���m��ETq��/O�3J��g�ԇN�zkO�ז@�K��6:�����I�N��&6����=�
�F�(�
+A�t��AO�8j�����@��Y��>�&=|
�����qz�g�5�'$��(��im��lt��������fVv�L�_˻���8�������=��� ��_;��(<mS#v�j��:�U8�N�h��x�z��U7�v�C�O~���ּ-�,�b�r�{���f�8�3x�I*�Ԥf�j���g��yI�X^� ��vW���jx���͓G��R���)�n�.�>ד��'O!��Hm@�S9��N�f��']�{�ͺ��
�9�s�	���ys����jUnVwk�����_��/;���kH�D�"0�a��+����S�%��:��x
��)�6>H���6g4�nب?us.�ۨ�8�/Qm��c,�5�a�&���p)�>��g�
��*+�@��������1,$Q��o��w����v��-)\B�Z]�C7rT"���FZx�U��մ]ԫ���@K�����:�~E�SHt����
�e���}o䪷7��-o��vu�t%�*�p|�QF�M�S�I�\O��CW��]踍�j]��^�����{�g�����Ֆ�{iv�d�f�ʋ����ʫ����[Hź���_d�P)�t��e.]�0���N}���´�>Iĭ���4�E��s���(�#��d�ӒI��
]�P}�pz�'���[��?�XJ��ǩBK$���F�o/�j!f��u� �+�I��D��8�f�	��/���i�^��J�����D�(�w#�4�Z4GFM6`9壾�wT	f�pt;�oG���vtQ�?J�Q�]��zr=R���ٺ�6g��Qܶ8ref6�"<���z̆V7n(X>V���4U�}���@�VFx͖���UA7�
�X�'���r�x�����[��%џ��p�Ӑ�BH|Y�B�r��D�7��X&.�	�?Fp\�Ҫ7��2���s�kͨ ׮���%$��BL 1�'a�F�9L_��f}�t;�>�i�e)[u�!Qe����h��S�Uf6�Ssmp�R��ݬ�%�
]3E&�"��#���c��E,.�����Dn�Am���֝+v>��E���yn�V��]mu}�}�K�ȡ�˰z��+e��ӋU��_�i������rqAV]H�3\��@���fnE��ɼk���<2Y�Uw�5ʝ�qn���ê<�[��5��?������LN�������`7�C�
���٪�!{UA�ǶY��^z�E:-�����4T��(\4.ש��R0mk�kh��Eug
��,��wW�
��ψ��I��"�e9]7�X��f�N���sB��Wd|9���7v��sED�o�%��z`I���L��9"�K�jj�Z/$��*�zo���ʱ�K�|H]�Z�~u.�9"�L�b�5�X�g�ݝ\�2]�n��7�m[uuws~�ђe u�R4���ܸh�����jy)�$_E�>�
K��8��|_�N������ft#������Q~�g��
C�y����zm�fm�mf���O��d�ܥx.�5O=9�]4?��<*"Ƴ:Q�Cg�ob�~Խ�۾�[]!�B5�=���z�^�;/k��M{e{�����x�V�^�n�{o��*��޶���
۪���<��N����PK�yVS�R�?Y�$pip/_vendor/urllib3/contrib/socks.py�ko�F�;łAPɐ��"*Z��K���\Q�YD(.�]Z������|��6�`����y����Ś�"�˻�5j��'�a7�\��Ț�T</%�jq��\��`��*Q+�5���_[���d�Z�)W����(��?"�ӳ���]���l�K��ă���X�/�@<CR�A�wH(G��L�)W��5Ci/
v}ފ�d�[B�d`%!)q��$��[�_�(@��+?Vm@|:�	o� Ś�w@�Zm��jj�{�/��H�(�	�n8�8֝-noɠ��n���]��2����e8	7{f4��(��o�Sh�sx�H��sh>�;	uɏ�1Vq)O�Τ��ZT��(b%��cd)��RqD[g�1%X#[�h��?HȮhs�L@1ܐ�Y4�J��F��Q��hmQ4ڟ�5%��%���*so�	xFN�a-���%��0љȆ#�#F6� �>j���J[��]:߷g �nzV�Ո2|?%��B��F{c���!����=�t�)���E��v���!�q�wk���b�`�.��a}�cV��A���uav�|n(���]�T�CJ=�S�L������dSZ:b���f��V��c��nӤ>S]�������@w��:2�d�P�HJH�y�N�0$�;T}�G�hF|J�R�^{Uע��x]�Q�S��"�����%Tt*��� x���B/�ӽ���p��%J
�Ϣ6�M��E��L^ga�Z�D�b3YA���#E�����ט(��&��|���
=Cr�*��p��ƣ��d"�Q..���&�����%��:�Eu,�hۮm��(.W���bfk���<��)P��@� ��e�)8�A4���1�h�C)Π�tss��]]��m�0F��(���qgD����pVL�׊��S���E��K~G	�P ��6K
Sx��H�k	t�&N�,f��
{�e ����h�K'ۢ�������YU`^+���*̳�.:�[�����e�B�R�/���e��d!�د���$�\|<ћ���(ѱ�k�
3`h�j�7�e��TP/Z�4�e�
0d��X�)!����L�&���+ry@�޷
�a�D�4tC�|<�b�ٮ�{���r�B³ӈ�{G�a����Hk;��N'�Yo���S��;�md���BH:u���0�w��'Sz��#��a���z�c��:W���#�L�š^#�0G��3M���R5�M�=�M��خBNSp�p�euF�;�_g��ƥ�)<��
��C]\���m-/�u��%�~��"2�W���h5|�e)��J-<6�����F`��S�G$������q��	�k2�+W��37�4T�'6�9@��g��/WTЏ��߁N'�,�ؕ�i��>=���L�%R5D=<��.�#�M}��F@H�d�g�`j]ϓ�1ez>å�v�{�����hW�g96^!�!���ћ��9��n�a��Ĩw��kG<B�i1?OĿ"ވ�\:���K�Ӽx�_��CDSd��k��X�B[O�p�1�6[O�{���+�t�
=a������w�}eY.q4AM� R��e'HT����̐r�H j���L~�����=AC��RQ���Db�M��%_$���1��Φ�3L�������w��h��9E�2.�Y9��oM$Ɲ��&�x�w��/�K�[|QP�9`:&����}<��ң�+���l0��m��n)�����՘�p�bH�6յ�y���o�ihI�� ��91WSԹv�-͛a<g�UP���)�?'Ɔ�|�Ql� ������ǃt]S�l�	�(7�|ݭ����5�ku�ʧ���ӎm�V�e�wrR+@|z׋�E��M
��B�~:��a��k�#���_�y8���m6��qepҭ:�6����e�bb��MP8��o�۩�??�������W���q�E�׼�(`z�r\o��qL��ϫ����r\��SO�E�����)��������f�_�c��9�f�s��݃���yq_�~���s�3�n�����ւ���������+nO�BOY�v@��]�s�o�+����Aܻ���'R�W.��=#w��� 3���PK�yVS8pip/_vendor/urllib3/contrib/_securetransport/__init__.pyPK�yVS2πI��D8pip/_vendor/urllib3/contrib/_securetransport/bindings.py�io�H�;���ըAK����f�Ę�δF#dL�1.����*U>��ѶZݸ��ޫWW��l,wv@�l9�D
��y�_���v7�$/;}�ȵv�m�~�6sbB�?B�
��پaP+���7�c~�%�%��tȎ��؜��g{CI}{���g�|��JL��A@��6��j1f�D�l��@�|�o��g�O��w݆���6\@��M �o�n�3� ��#K�e�]�`;�a��C@X`�o(��k��ߺd��2Ϣ�l�:D��h���2>Y;����4�i;�9
�d�|����v,r6dM��`J_P�
�k��Y���w@���eQ-	�CG"��K�A�Ƽ7�~܅�e��i����̔$�|���~Y��K�	�9��v����0���0t����g�L��vPJ�}#���M�E���2S��m�w��f�&�$fE{pǜlm�����4b�f����
߃����;�вA���w:d9�eI�{o.��������v0z�-�O��^�v�`�!�A@~��`#!�tP0.P�A���)���pA��Ʉ���a9�T+0�6�]`-�a�����b��2b����<nb�X5��@\/�.Al!
���v��  ��)F�PQR�G1xXB�l�9����:1f���`���A�ٷ�P���f�<�����%��`��Nf#2�~'?�����/t� �'7��O�:�����~8�~%7�;�-�d|7^��3�ɍu	���>7��x�]��h��"��lAd>X,��d� ��|f� �HO���8�w�t���F�o�A��d��8��=h�@Y�6�_���.��l2ԡ�F	7]���`|�!���αf@I艠BR�p�c3��_m9�MQ%m6].�/�)����;d� �Ps16hb��qB�;�%4�:J�����4��i ��h�܃SY��Q)�"�=|0`D�J|7q��!dǽ��穸�%r�p2㤍���\���x����Z�s��o!M~c�Zyɗ�g�ɇ����w`�NWa�)p����
�k�"w��|,���U<e4�g{��3u7�����֓�������l��v�6�N7xB�o��߮Ish���/\ �A�]�}淚3&ӽi��A�a�4ۍF2�]g�$�[�_{�%�`�-�0��ڛ^��I&�n�9v�jv��v�T��IZ�^�\�e� ��l�	�!A�_H�׽��ȥ/��UA*s3�)�4SܟHK�rw~���pcC�P�����q��k�!	��,�V�˕g��XR��	b��>���B��了Ô��� &S�������	���
�wrc?#�y�D��k[����
�/���h��c,�Κ�P�P��1�ԡ8{
�n
��]���_�3���:o��:-E����-�ƑB@UTE3#��p�}�{�.$��R��?>-��A�����z�G��բ^�0�g��R'�X
�-_��+:J����!S�R�!^��Pi^K�$|&�	�yb�(=��'#�`M�$`�mҖ65!�ḩ#�@E�Sd�4E.:�PE��(��7�;���Emh�������4P�����*��u�%�oh�{^��1�V��o��MwQh�Z�35��.�HiZB.���BF.~ܶ�dp�L-��Fɠ~�̐� �ԘT�P�_'sG#V7O
�ک�^��N�����=�@r_[�PA��'�A޹��TY�gz��D�
CD�Pn!Å9;'Pm��_C껦K�=,�$7�:����f��
�÷�3��W�w䘏A�LT�� �\�
`�
ۭdiL�>����1�lNFd�4��`��R[P��)���JⰙv1n9a�	y��CԢi2]\���y��� ,�5錘�@e���U�5�5��i�u��4����:�j�I�K���R:=H%*9P�T�b��Y
����IZj�� �JC�9��d��lZ䕄c]FE�:\��u(�uhK�k>��p���0R�N�m�#��SH���e{A��Ò$$d��*��h>��AL�DD��>q�N�*K����EH�ڵ2#J�T��x�W�O5Sy0g�Ju��N`&y@P(WA]��y%*Z�h�o�@$m�|T�mN��7��IN=�i5����Ϛ�?}��TL?��ƕ��57�ȵ��ǻ�,l�SxHi�[�vB�������gDqk�]�%Y0����g�4PU.c:��EԼ	�LJ���)�s�?�>
�t#��oL�&۪���yM)��<� 
w�lz�Y�K��1Yd�u�J]�'(�W.HF�>0d{HS(��$_����t7��|:���*C����}ʕ�rQN����n	4��2�@�Cj�i�_�,�^k���UC�j�5�:(OV�(��ve�Y��I5(���%����[����|i0�ؿ��E����c��V|���9�#�q�@�U9q�-���ny�]�o��6!s�t�Lk%?X4���wij�/�+*1�J�Na�!!���T/��>a{�:H��G(RP.SEt�bm��gӉ
��,Bq��-��H�i֖�R�i,r�*�*x�Q�����A�a�	�%HB��&��|��IղP�ʑ�_��䲂��Y�*sIn9pK�Ne��Hi��.�U�u�l5i���J�k�"���|�3�0_+�P�osd��4!ud9�fģ�J�A��\s�W�rǛ'i�F���4��)�ge���->e�D�*_9dp�g�d'���Q��Nl��"E�Gm��!��+
�[^)��P�S��
L:�)6�
�q�6E:���'T]:��z;�rѵ�Uz�-S�f5�f�MU����v�v2~ª!B-wD�{�7ޕ;i�F� s'��oQ�Giܔ @�ϭ��38��P�������/1BҾzI2::}7���i��2Y
�bįy��L�_�;(�J3�)Q��@U-9U-3'���}%Qd%�}�r<��/9/ɟ�e{RJ�y�\�IX)H>��c�ˉ���(���n�BZt�ZT���5�r��X���TU쩷i�Óc}%.U~�B��r�
�)�/�	5��3Ώ�r�D���z�S����'T�`�׆XIV$���k�mz�B��	wY��M�C*<���2������՚�9f��?�9�Z7G%X\Ʋu�XN.%U3s=I�1�[�\�v���>�VE*r�Y��Sy���"����ԫ͹��{$���2������,q�R�d�W%�i���5�*�H�Nr�G�bo�K�v�U}q��vm|Cc�gc�A^�oX,|�����Z����.��D��A>.3�0�+���:��i<Ӣ�5��'�>�����|�w�]I�J�[���U���z���2�/P!!]-x~������5��L}<-zl�p
�B�������HZ��z^l��O�f�|/(
�Q$�0ȝx�>~�@��g�>S�ׇ��>OH�f��"���+�ߙ�َ�5���s����`��g�=15������%6�A�Qע�c�/m<��g��
�/��,���ǖ�O7M_Mx0�\��‹|��x��ޑ�>���}���lk��&P�]�M�L�!uq�ବ��Z������,(���<o���e�#(ҝ�e��;��IX����}��3D����Ho`6{�;ϤN~R���Cm���0eS��7п,���R�ܡ�p+s�$��/T��R���N1[Y+$��z�Oc���\/H��	Ͼ�׽˟�,�g1ĩ1e�N�n�,�ȝ��[;r.��)[z�V����`��k&���$���Fx��p���{p*gx����M��0��=�8�;�KP�f�[����/Q��a�G��_~��]I�S������q��xzqzy&��؟�&��L�I��PJ�4�^�[���l<$T�h{6>���>9�|fQ�Y1�xgb��8�Cj@�.�������3��=�U�b����I�%'����� pV�Ŋ˴³9*��!��tmx���`�O'W�X�^\��jw+�vpvu�	�U�j9��Q���a>�ӫ	�>7�������h��{�[�g��ޅ��
>Wq;�x�"�1F��yT�P� ��GI��r�t~l��(W����AM&1|����b�L�˛Z1�Y~K�,��>;�fE�O��$���r���a)�S-��P��:,.�U��rA�����)'�G�ƐR���⽯���`Nt4���Q�(�Ra��PK�yVS�*��Yb69pip/_vendor/urllib3/contrib/_securetransport/low_level.py�mo۸���š��җ�ِ��]��)�t��+Z�c]dQGJq�a�}�)��ݦݾ,@�">�od�����<*՝*�J��2V,��J���[����l�M#�E�(���F�+e��F�w�f�+�l��)tea�l�K��(�ʛr+�*e���zUܬܮ��.�h޺5*W�J�ʼn7���k|�hs�
�v+�*/��.6+]*1��WB/E�)�i�^�ZH�I�& .�\�>�F�6Y�Jި���-r]��E;V���-�Q��Z�F�\�	(b`��"d�P��\*yki����6�5<צ>З֪e[
	��F��!s�q��B��1�X��U??�oy����oE�L�u�
���(�dm�=6���֨u�,�����H����~���LE��)+J�lG��F`�Q7m)�P�k���(L
pc�\�;#`��E����z3x��ί�g�չ8�i��5 ����Ǐ���/oλxuqvz}N��UI��_'�U�v���Ό�!���>}�z4�F�Y�������Fل�oparL� �/ŝ��~�T�F�l�Q/������Y���o��6L��/W
��4ߒ"�,�I���jZS
D�2�3B�9�?�I�g�N�R���ZʶY���
)&8w
�q0O�Q��%0�`P	ʍ�u~���P�u^�s*�b���m�O����G4���é��`��U[��;Y�ʒޑ�+a�Z	m��4�D$�ǣO�
i��
g84��9�0hGZ�`�W�՟��M��pQ���`�2Ǚ�*�-����:2�޾ 8��FHU�������o�W�����;���~PZ���Qs�)D�=#�`]����B�|C�3X�e��Y��&�;̼��1,�E�:��!��=�a���!�����s��@�ˎ����d��MJ���C�e��M�i9/�)B��@�C
��JV�C�x��f�ύ+�TF%�=i-��[])���<ޑ��brX�"�V1��Q��g�5j9t�.o
�~��{*���1���$�PZC,J��+$�rFU���q]"�#k� �h���q�$��c���
V;�; '�ӺVՂ�I�̙:�b�K�ٲ�X��IE}�U݈0~N��/I+�q(�}�x��#�
5}/�Ȃ�ŏv,~��N�f�|�x���*0QM��윕LM��Y�_Rb�S���=�l�g�")�ء��(y_z�&&���Xq��� 7]�kJ�}}�y(
`:Y�ϱ������Yxgi&n��]^��>�J:��k&.�:z�_T�\�;0�NP�_�Ł+
q[q�zM��˥
C
;h'=��<>z�,�e����؛��Ч�߇�� Gz�f�_��9ef��ʱ�H�f�,����껬�cvv�!](R�q�,=G�3��@��,�tF���Sg���,/a�	�64���MA��"�f����
űS�f-��сE�a:O99Gǁ�N#�hJ��k�΀�$�7X��(��>���@�]�
��=�c�	�����g{Z�.�u��h���v|9�5�i�s}�o:���5�ᄓ�Ӻ$��u03a�����0X�Z'�/�P	J1���Ի�R��ZB��B��G)*t���n�3�*s�H�|�&Q,8�ʼn2Ԣ�=�`�SbQ����-dv��F8�'�Կ�����U2�f~��<��j�d
uYƤ����W�>H:���3@�6_�7F�u�x2��Acȑ���.��р��K�?y�S����Ğ8�V�1W��Ų�)��Z����^�ߚ%~K�d�ߛNB�X�_L�v�e
r��
(�=��L�&����Lb������!NC��K�/Ȱ!��l}���G<Z#q�+��9�ܘ�E�`�9?�$z��Թ�"&�h�2�.;�>K�������q�΁2L
��4��+�87�j�B�W�uQT� v{,4.��Ai��+����%ǔ2�){��g�xQX�����p���_�V��E�7�� tZ�cW���a�}P�!DP/�(��!��Ghb��:�f���i����%n�l�k�]�[��`�(��j�������̅_��Q�!(�����Q�("C�����-�7@�գ�����|/(kwĖ��m�-�H�&�D��+y���=j(+��o�;?a�C�on"��e�$-��;��G0g@x	��*��~+&2�*ܐ�c$�Y����jN,�t
�k8��Uk-6�I�
\I�V �r;
wb��C�i��~?��E�@���-X��Q��[���*|�V�2E>�R*.�zRr1u�6�!��F�#��E�/�Id�#�
��n+�R�����e�{��Z@���^A��M�,tP�+vЬ �R���QmtCz�
��!2�@n�'�-�
ώ"��ˮq��'B۴����uG�I�9>�YU�9��??�4�[�u�5Ϗ?M�7N�)�P�>�����;wK׷|N\��l�H��*|Jy'�iG�$uu���0�7]ls�q�h�*�i���i��ܥ�i���BD�7y�N�������q'��?��w
kƩ#�WyG���YD4O�=Oj*���"lܻ��/�D�c@��"�a9SE�$�$�@�G���p��XLE�mT%ο�?Pt��t��ʸ���Ď;�08wY�L-x�|3ޅ��k0�E
FAN�O��}�'� (�\A�A�Ǹ�ӕD�W�܄�I7PK�f>�`?t� �+�P@�E����g�����&�#}7�}��
�_2L\@�.�D>ƺ�t���"�
>�r�1g�@�o��'�����T�G�Hu)}(,Y�BW��`�~��cW���ˎh��|�,������5�+c�.��=�+��۱[�7�M�`��� @>���5`�B�N���=:��xqPQ=�]�Ƶ��	w[��6��(�V���3��(�t�ngP��5]��>7F��뽊s� �@U����=��^�J�b���������i0����DK�B.�=��摃I�m<K��b�G}����(p��7*	�N�◎�������6��&�}��ޖ��et����ԏ���9>#%
\q*��3S����7�=���;�e�A��{�q�*�"���a8O�H�lE�,`7h����O���_^ê8ҽ3��+�_�N��v=�*
��*�W�웂�ʒ��×��u�U,txVQ�ZЯio��TFc#|����+y���w�Ԁ$c�j��DH'%�/o�5b��4����RÀ��MH� �o������tX닭n��@���o�fP��C-��M��d+I��`ڠ��g]��D�3B	�D~�xnHg��,{A��X�[i��ڦ��M���c����ʂ�q}	�KQmO,�b�(r��:Ӑzʓ0d�8�{jCZ#��8��uY��B�y��T���4�F�S���q.��e�DT�(3��N�H��dގ��`QYC�����P7��C���@Ԧ�C�aîK�e	j��N����(S���7-:+Z��2(H�P�����W�E���؁�[��]�����D���֖lV�Q���\�n
�p�IWp��22"��i�k�nmp�Ɓ�����s�{=R_���ߜy0�!�S��yD�r�GQ��A� Pk��yQ0�Y���tݒ����)��;3~.u��Zs����7��R	6�eW��t��*�3�RGm��v5�l�zFm3�ѥ\;� ���/�2,�~E�[
�~��T�!$Q�r�q��W���4��C_ ,S�z�=E��w�6Y\���}�L�`r�>����x�ݓ�.
�Qʍ�ʻ��69i�i��*�n��@�>�~�_�/��G}��B~l�\H��jz�ru{��א���I�w{��\��	����ӠC"c����K#c���&��̏��)n0���bn��5�08�q����7���q:u�u�M"%s����$
��<䇱��C���@��o��7/v��r^}0?Hgx�H��"�L0�D.�Fh��z��CM��*���k1�ܲ�Z������I[��_Q����@|S�5QPS4
�쯗�}��Tb����Y�������u��������ۿ8ɇ�u�d|,���x�$L�Oq��T�At��
>�S?�$~↟��}
Fƒ5���
k�*�e&K���]��ʯ���
��ͱ{����ሳ�@e���}�dc{����ɵF�<R����5G���З���)��O�;�xzD3��]&k�&��f��_^�O@�@M<��T���x�Hs�F�좍�9��g�����Nwx3��Nğ�1��y��?PK�yVS�9��Pl(pip/_vendor/urllib3/packages/__init__.pyK+��U��O+-)-J��W��-�/*QHL*��)-I����@��`���9�%����%y���\\��99@l4�0�t4�PK�yVS�i��&!j�#pip/_vendor/urllib3/packages/six.py�=�s�6���)ө�*��N{w��S�q����N�^�M��Ś"U>l��|�����d9w��D$��X,v��g�(^���f���l(�^�z�b���K�VFx� 2�IG�g�g�,�4
�H�X�DN��&�L�#1O��\�^r#G"���Ŋ�E<ͼ 
���
�6[�4�g�^"�^�Ƴ��g�RF��a�� ��d)��
�?�b|�@��\�)�l�Hd�%���h�>��`�2�đ9 ��P�v$����WR�V�4��H���$��8�bA]�5ND*Cd
h�=ո���
6S�J1�~/˵	��y�DP�$,?�Q��Y�)�0��0��
����^�j�+���*q�Gq3����UV���PL��
r�J�J��4=�P��
���a&>���W�'�b|).&翎����Kx�ħ�Շ�W &�gW������w��ٻ�8��br|y)�'@l|zq2>�������w�_�[�<;�'�����:�"���%�;=�}��÷����# �~|u�tߟOġ�8�\��>�N������1������O�����+ʅ4q�+����''XP;�u� ������W��ɻcH|{��=9� jG'��ӑxwxz��1a��!2��ӇcL�2�����+st~v5���ure�?�/�G�p2�D�����b5Q��sNd�����m ����ؐ�O��%"sE5�����Y�ƁN�A)�x&=�%h����Z�WY��Eb��n{�y
��<��"X����q���{����y4��8LuB~���*{Y��tm���J����z9�@i�_sy�ǩJ�yE�:qr�S�� 4��^9�~p^B
@S9�C�<����^�J��W���4�L�B����{@8s4� �ǟ_~b��۳�1�uc���/�1���C�\蛞�?tVэK��������I�	*k�W.2�A�d�!��#K(mD^�֩�u��ƌ���.�}�X^zi���0�ͼM�TrZ�"���v>���#̺��:�y��6�5����*�2hۥ�.�R�@�?�;�?���3��^x�S�CR�����1P�,���+��b��P����B,Lt�}�9�<
%����%�$�/��b��fâH���mSwaq�������z}ּ���ӌ�b�g�d]*��áI�3���9h����$��2�3���P)q���rbZ?�ފ��Z��o�^^3U�K�7�`����oJWr�b�ƞ/[�+YP�YIp$h�]�n��F�(q�'<��Q���g��$� �q�
�!��ę;�<���[ʂ��9缑jR���Qs����(&ʙ)���]�۳�l�(��1���*�x���t��u�u��L)�HXܒ!�4�!��,�Y�Y0�	1_fh�H…�8����EěG����B��Ew�-��X�Ӯ�[A��<�s�߄*BPݒ���O��S�F���7V�$r� E��s*�j�A��V%j�w�����V�mI���e`��BF��թh��F�6	aL�T|�Ms�M�|�*�:ؽ���Q�H��0Si��L�<y��B,@���uZ�*.Rɭbz�ʰ���xFX�bQR��{�9�+BW3Q��wQʈQ�U�)�l�������;��[jc�Ԇ6�g�^�f�[�~��;*�$v���
�E��
�w�O�_0d�7�p�K�P�Ӧ�~�ʍ�0S�Sb�E
�����$E�[X�$�lf�Tgi�dm��)X����fS4��l�Xr�E������s㴑 ]�v �A50�u_Ѐ���WC�V�[���Zo���h�j�ߍ��x�VW�!�h/����aOd<�e�p
`^��CZ���L�P,��l��,�Dbp�PJ�F��q�A�S�~���Pb�������=1"���3�g�b�81���1�&j���=OP�!�AJC[5��7j3Z�����T��0�Q|�l�"���U�V����H<��i��R�@�z:=��i��R��V�}��k\�b�C��Ҡ��q%e`�6�1"m�z>0/��b����r�a}�����F���Me�1(
#����ݪYj�n{;��aU�7�n�;/H�`@ك>ٮ/�1(vg�n�n|+�B��ׄ�g^Js�T�4���<������m,�5��!H�gTgr@�k�˕�9������z�C�JcL�Ux���*����d�Aꮼ٭w�����߄idI��<1����i(�H:�\�'�R�UC_��i&�	�;Ip�Bp���7�ʑ�;�p)�Ox��5��T�\x���[Z�bL�n�1-�DP�V�Ǥj�,�?� ���,��tiҷ����\�F�֚�.�ͮ�K �4Γ�mPu�^�~�KMZQ�Y"�L�mۣ�ї���a��pծ�lda��k����xC���Lj��ej�T��ɹ`ON��w�Z��׍O�<�g�%�(�n�]S�Oȕ��?�����9]J/A������P[����2�!
e0꩙V��6����(�_*��+�k�:�Vyƃ5�)��l���5p��J
�ȁsk�Yz�n�)�i!�0��(N��95/�ѧ��Ӵ?�3%c���WI<�ik�/���`��a��pw������Q�!�k�(�J!�N��Ϛh����
��P>��qF�`%YT���Ղm[e�B[0>�2y̨i��Y���u[YE�lhT��%*󧑋�-���Z�
6����M�0.�wHD�7�@گ5�R3^%��z7���hܬp�����_�{BQK��7��G�Y-�b�%){�O����-�i5Wc�N�R�����&8�to"ve���`RxT�ipJ��������L����������Z0e"M�/�l�M|�?��e�/����"{���+�i�2tq�8S��@�k�L�c@Z������¼��US�a%h�K5�&L���]l�-�P�s:>=~[JA ��6���Bi\N"R���2���gez��d�Y�w�U@G-e@h�VL	�U)�Rp�L���BT	���Ç���K�ܱB�S��S~m�q�˸�PK�Dᒆ3e���Mtf�얣�q�OM�2'����&�D�����Ƴ[����~�Ψq;�_<��&�얂Y�R�`�xaL���yRy���B�v���V'c�t�Jg	�=�V�K���T�+�u$�(�c=��W��"��]�F��N��ՏƂ�.,hw\�
Yz�4����|��L�F�
�q2[ı�����)����r��8��z�� ;�{[V��IJ8�#�l�͓"��^u	�%�L��ҎS~��ł�VU{�۝�7OB�Kܱ��נ�qZq*
�{�.���:IjM���Iv����2��qV�5�WŘ��D�a&���p�r����(���m�vz2�8*:.E�躾��P��A��)͍�`&�"Ve�n���^���SI�鹤����zW=��|���M��Io0(&�x#��)S�7(�W�^��	k3O���T��g�I~Sʰ�{�x��⣾:��~մ^��s}5��{�|Q�f�?�V�i]��� ˵Mn��DZ�ы�e�i�^���g)ޟ�fe���=�1�;:3�g��pd��aR���GD;����MQ�;���SJΣ��6�hƫo���<}<n�X�Bܭ�b���d�K��;H�D��*b��&Б��<��Ԙ0�I�;�f�t�����G��6�5��ƾT]���	D2�����-wrt�n�����m4�/�N��K)G��]CLP�ٝ�ͽx'_���ZI��[�)+����z�6��樀��p�]�
(i��������u��*���{c.0ѫ8�\���Fs7T�����),��٩��|�Jc��,�~�z4)��٬����f_Me��Ҫ����╌�5OѺ$c�0t��lQ�
$p)�
�%�
��z���4�]�od�J⇠%`ـ=Qٻ����.��9m�c	t<��܃�9�^�;6ҚH��y*^Թ����0Bs�O��8��8�Oo�
�OA�P�5�^�܉��4�o�A���a�-�ZɯB���P�{��ר�סD5�zL=��)p�I�O�ț-�i|�h��S�H~�i�
�	o�n��f��|�6������E���(`߹�q;n8�	��3��;v�L�V�y����-��.�V�;�
�3�n�n�@�D���tE��`Zg6��E�6u����85�	VCjN�>�9�M
���hQF���q*�J��<�=�.�ی�EV�Z��h���Z���vXBY�USP�Ͷ`2�0�bm��ك��W6�"c{�� �~���[4���-��������*Ǫ�
�ؼ�h����
X_��r���7jb���Z��C��T��RIW�L�h#S���Wx�	��¤��3"拯/Q��GMS�����S�G��:�-1M_�p��F���ږ���W��|��p�y����W�Ŀ�v��v���WB�RO�i��bs�/�S����S�������yQ΁ȩ2�X	�I*�L(����N��>��GO�J->^�p�D�<�]\6�,s�Ϗ���\ؠ���ق��7I_|#�֣!�����/�\�\rr��u�Vj���q&Ab��'��ՋAg�b��ᩜ���H���s�S/T �!���U���T��Ƕ
��M50/mU(%��~�^���������]�	�C�S������}edu�2�����V�l6f^zS��]?v��a�c�z�^�`�㼳�Lj�{#����-��)UD�I��i]5%�ṣi�G��O��:*��էy����<P�c��+v��O�ti��,��i�4�b�qъ�)}}Z5��5ll�j]X��8pd�)���p �j
jw-���\X6in�Y\VI}V��N�ת���)�hj�v
�ȌO�T�Oɤ���ck�&;�X꽩�$j�:���� �8�����U;W1t�kD�][��[Tp,�׎��*��/lGU0���N�V������!�! ���i��f|�D!�]t�0T>�\m�g(�.��X-[x�4�߀��ܾ͕h��|��nG�l����ͭB�H�Fy\�0��$�jF��Q��Vsl��Q-b`�*q����6��0�Ć|�Ձ|��'{��
�6fi%U�M���;I
�+}Z�	���,	ʴ�V�?3�_Z���t���oT�qR��=<�18�\`��s�1?Y�C�IQ����4NHv.�g��m���Y�j<|E�=���%�<�K}��/h+�
0j����f3��E�
0�Ď~�����sԋa����SÒ������1R��q@��e��W_ď╵Śq't��D�ȇ������0*�u�e��ުh��Ux�RF)@�%o[����U�ݬ�,�Oqr�%���֙�^������-6(�:Rv�:�\��L����	���!�%W�3o%����
`RQ��iq�C��_lwo�}0��#����ρƳ-�|X������?�\�}hۈ������˖�a4�`Y��~ke��O<���&Br�!�Z�:�|����f�*5VG�<����{g|RMV9~�AkB�إ�,��\�EcSiO+g�t��\�&�X�=sD'�X�p�$�><g��I�U�l�:��Ȧ�s�j�cP$��z�>
4[Y�>٨08�M&]�Χjeӆ�i:���ܤo�M��-P�>"<b�LW�G�
�ٴ8��I��1����Pꪓ,�0����IJǀ�g�Ϛ�
�)x�>*)�k��2�'�=�gq.������ܙ�A[����S�x���P���I�piCV1jM�ʙ�<�ELkU���NI#�[�[)sI�YYJ��F�)tB��2�Z�C���7]lb�tB�@�L��q\��(�,M������๢�[�Q)j���0��0�穥!JI��0pFͥ�����4[��1�����)����=�]�W�+vV�N��el�4��<+o��ι8
��k$�2oX��ˬOh$�{N�GL0��31��{<�
�P4��K�I��O
2��ԠV�����k@t�i�.��f����i�^s�
"�����-���R�P�*�5^��v����5�聣U���Pf,-(��ދp3P�x��1��ʪNBJ�~�^��_MɬFТM���s���� �]�Y"����pY�m!��<��Zd���Խ}���ȯ�\�q��KR��j�_��Dr˚#�[�
�j7�Z�m����X���Q�xz���Ly�+Y	���"�Z�uaL�0����&һ�mg�{D֕'��ߣ~��xk�!�]��$�T#%��`luucs%��ó�+�~"鶐�j�e$��}
�L~�)˅��J��I�FW��:�K��r�z���Gt�v�
n����y��vǘ��"Pf�>ڱd�Ը�iw�	��Z�xW�#�j�V�=*����L���{YHﵒ��e����,��Y�y�����`���z��S�W�+���o��ɵ"g"Y�KeN��P��=>&\f����U�|׽���6)�t}�˺V����r*+�6�4h��oˋ��c��B�,��k��0\
n�
�#��k� �'R�n�y.R�4;�a�1�疅3��F��H�l��49��8������_���^q������ձ��P�w���ʚW4�_���y��������Q�Wk�- -��ܾa�LɥLꦉ�P��f#���t,m���b�"
X�)�u7G�M�o���M���c�L(O[�G�劌4��h5��ad�Q���
N��R+��<�QU\4!��#�΁>����N����Z�t�ǀ)�0�fԦ�i§M뛋b�Y�^DwO�!74ŏ�D�K�?HK�K�c-C���P�ɐ�U{\���M�;Is�)����n�fxh��9�1�BYq/�V<�qﺃY��+R�p:�R�z�<���i�[C��d��.4��0Z���RWЖm�v�xb�^{p��{	��Ό�:\tX>��7T�-u�ϕ4;{T2��z�C�
����9<��8	n�ׁB�yY㶎�O������,$l�b �3I�ׅ+��5�pc^�>4o��b�є{$���g�"�L��&H){
��퍟%��'˚I�}9�y	
��#�Kt�ͻ䂱K/oU�f��h�9fG��ǿ�W��1os��y�.e�q��
1��hn��r?�×R>-�Q�}�/u���a]k�F�5�{o%r�
U���0.¨��*5t?����F)�Z�6�P#��rTQ�X�ѓʈ���ŗ�td���y6��}=#s�gt,
�%��y���ޥlݠ��mxo�j��j�y-^��&��*�k(庀�7���*��7uH�-\Z���YY�G���Ⱦ
�i����,ڱQ�y��6I���1��W❤�~�~��y��pXnD��ܭ��F��?�V!P4��Z!Es��e�V�ㅕ:�y��>I7�8�ɔ��[���y+ӲOjb��[}�D�u�a1t��N+Bc-��-:<R�J�*)`F[V����A��k�yiP,������t[4�
�p�(�	��/�v���[\�6�-�'�{�"J��Hݜ�鸤�.�(x�@-9��f����G;m_Ϙ�z/�{}�~䱢-&��u@���Z�q�x��2�6�ppo]�Z��RP�\�.��X*΢hx輸�l���M3Կ�7Z-����8��"��%1���W^���7)�̼<��\���bx0tP54�����G�|`҈X
�� Bo9�=�荾��P�B� %�C�����]ͤ��O�4w$�;��X�7�P�g	q�8��{���)t?+�\*_�$�*�`��A_l�QU��O��x��BT-|~��+� dB2��
K|;�����D���!M>`�p�T�8A����0���<�ܖ��Kf�n@�C�o�g4CT
�W/	��gB}-�
���Fꃈ���k���Jb�_��j	/ZB#8!����|�3��2P��m�w��aE�$�ýg�44:��@�����Qj��Z%0�F��
J��?�D~��BL�5�2M߈È��׎��%YP�3��f�Y�\�P'�юC���˺'��$s-��!��l!g�X��)��.V�X�)��C�Q�"�P�;D-)r�~0��Qf{B�ʎ���<4΄�5n����(J�_a򽘅�Sn�o
KM�9(!�3څ[�h�{��1��9�ʾ��|LE��?pz�Rm`� ��PK�yVS2pip/_vendor/urllib3/packages/backports/__init__.pyPK�yVS޸c�H�2pip/_vendor/urllib3/packages/backports/makefile.pyu�]k�0��+�xK���R_�,��XK?�M��ǫV[
�</��O��׸�h#��<��ձ_��v����9���}t;�RJ�l�����a�X��ߓ���$�p}0R�{�l��=��7h�K���V#t�<6�V��̐�	��S�Z�|
r�w&���ƕ.I�d�q�֯�W��+HgY�n&죱�������mU���_��)�֤�RR���\�_����\[��d5j�o8Y��K�ilof�:�ࢀ'��ܟ-���G1n����箻	���y�Og
&R�PS��յ��(���O���:ō���U.|��؛(cD��w躌i^ȴF{椷�at�SG�>��m�7 2���7��$��qYGޢ�<L•G]�OA�O�Za��]��Op
���f#	�v\�e�y��t��n}y�X�oַ���S@Q	q4�����AhE�`	�XC
M�m6F͎��i�p�<��~��6p8�e,r��f\M,��;x�B���u�dEI'=p?�p�^b�����ю ��@����W+�{��"}$��C֧�q�/���b�PK�yVS�w��;pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py�SKo�@��+>��m�DQ/Q�C�V��G�f{�A��)����8~(R�bv����9��L��A�~
��z_�9�7�|-�=\��	q�h"ˇ�U,#�};a4^ |�r���.d'�#h�����my��\�R4�m��~Q"��d��Y�l�6CT��fK�Lѯ�99�X�^K��	��rz{m���0�H�U�Y�
QQ*��'�|܀�m�s�>�o�l����G��[��W_�8���&�&K}M�1��q~� �q�DqnFk��ep���%M�ܤN3I���;tl��N]��=6�RUUW�=�\�2������1��Kķ�&����m}�R�K�e��Z��˲��鍛�?Y�,��At��a���8o��}��AU�c�*�N��dy���NG�PK�yVS>�Kֱ/Bpip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py�Xmo�8��_1PPDN�in�=�@Ц��I�i���Z�b62%�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@�\�\�7�E�jz�={LJCu���$���։��&����:���tɛpx!tS�.OZ%W�|�����:v�������?�~S
�f� ��Ն��^�_������	���h�f�V���1��F���?�%e�] �f?f#g6��J��z��m.Gg���1�i7�.<F���f3i����X�=���Q^	�{!�S�ʅ�^N���V�qd6؆�,iVh��9i�'ԙ4�'ngkU�0�=>lO�q��."��)�	6�y���>�aBV"?������I��+�)�JO$�ρ)s>�Ӟ��ZU-`��\R��:��#��hz%*+���,��Q?ڷ����Q��-a��\
���3�Tʥf7���G0,%Y�:!X��><	(c�a�p�1`�}���x��+��d�#�m?m�b�{�ά�v���'S�kUP!5*���D$�g�*�7T��������<B�^5]q�D�A��]!�6,O"/畲YD"��`CbY����$QKvQ�9\�":l����T�E
��V��y����(��M�/d]>�Y͌�RB���1 ���2�c	���#L�\@���$�{ -
��iPӏ��|��uھ�.�s5W(ut��;�[䕂;�ꗋw�_��[��Q��$�A��.�t��T�$��^�|1��E:_#r�]0�1�6�Ub.�P;�u��/g�+���%17�ɭjwo�+���\T�ʪ�0!<v�V#��"�Į�8���ؿ㚐����H���>>n3GV�|E[�ɭ��OP����˱��Q���A�7�Kq�+�r.}Cc؈.t���,��{Y��F�|���5W(����L�\42��9�\le짋��N|����>��)j��u�^�}���Z�\���L��U��#�G�Pp��ud� صF�����ϕu�q�}��~�c�7�8s0r1�__�?�$�T+���qx�/@�泟�/ޜ�8�:�����Y�3�]�v�l��ki=���W�I:��'��1�,xPʺ	A鲦Pz4�x��@	ET4���D�\)`�\i�q�q�]��G:t�x��	����ad8��ي9yvI�Yi���.�Hޢ����LZ��v/K�9�Ȯk�/}y���.G1i=�}J.V�]�u#�q�5R��.����x	r�7��r]�2��\��+�aڮ����^*��>�a�X5��i4�傍hG�]	{�	��7f����i��Xd�I�[aǝ���ܹ^p?f�!.�K��
�yG{�i�R�D!Yk�� �5Ux5��p�U��H�]K��i�0p���9��)��Bt�>?|�Yڅ:����\ Q˚�mYLh������w1sbR�b�Bw�.�~��W�^!
�B#�dQ#hw���jY��l��lm���2�wF���F��`2�$�N�	����R�}�2�/�j�[�;I�;��C/N߼�]\�=�8?y��7���;{s�r���_L��柖��C힔ms	7���1�s&���Ai4��P�/M��wA�=�_6��ٗ�B�=>8����
X�꜁��(�1xU~�*���%�ŵU|[�H��4�ݽ>�}���~��'(�I��_ō�4Vjn�{�0:�2�
���=����<���|��7�u4��Y�쳆M�l�ct��r9���	}f氧pt�Ū�RqH�`��Z�ԝ۱|��n�+���΢n��BƑ3"`�u�-��tƻ-8B9t�d�;b�ۆ�a��((�(TE�L�$�Sq~�è�Z	�8m��_�b���m�?�}۶���7�޿��w���mw���4��e� j���cOvo=
m�R���!�{�2ݾ���둭�N�c��ﶴoܽ���^���p�i{��G6�G�_�x���R4)��'=��8����vÆ{��{�6�G��N�'��|�k@y��ԸU�7�!�h1�p����O@+]��OPK�yVS抙���$pip/_vendor/urllib3/util/__init__.pym��n�0��~
!�l��7�!�<4h�vz؉Pl�b[%'��O�EGi��%��ҝh7�MNȃ����8I��ߚ�AV���ڊJwF:uP�r�0�Ϫư�
w�Nk�8�8"�SҌ�=U��rJ�|��p�P�6�M�w@�8�|]��-eEz
���MH��N��(k$;W�F���U�mt��֋1�����D�o�ɷ���n�۔镽,K(��)X�����ٶ,73)��[����w�~�\�\�oY���?7��Z$��ߑ�>p�$ݞ�Q��{<��
�nN�.$
X]�����T�z���Oa*��{�Rj9��T�����>�H�������Kօm����M�ʲNoᅔ�$�m�g�9X��.�G,bg#��[Vn^2��fv�N��� �¡</��J��/�<�d�s<�� vf��Y�����k3���w|��>������q�PK�yVSs���8&pip/_vendor/urllib3/util/connection.py�X�n#7}�WdnJ{f2q�xc'��ه hQݔĘ";$[�����[-iv���⥮�N�2zE�j\cxQ����8`K�e�x��Fq�����]�E�;�*m��H)���K�k'��I�g]2Zxb��;c�������L'V�\���W;a�JkV��5�dZ�%n�pi�A���s�%�'m���^��X�Ҧ0�U�Ѩ�+�@/ɺ�2�W-Mf�$��+�om�K���g<���8F�����X��p�šp���
�F7��%����*y!�����f~�/��Y;[l���R
�\��|������R��3@���&[���m]�xN�<�h/�&���`���X|b������$wޗ$
6h��fx٢]j
�0e�4Q��ǡ�� L�k�s�Gw
cZO����sA���30�]���E=h$��C�	mLd�)7�,,[��#�'��pJ�_s��uq�̖����Ö3�w�:8W	�:��̚�rݸo�7!L�����3l���	!�Fu�-u-0@��B��uByx<�n����?�u�f*���3̴��"m��9�VJq#`�p׊Ր�4� �Ё59�yTXU	Za��"/X2�m��=�i�5%T屨�iw��7�T–�F�h�OϩNmk�B��U����nr�I��ܳD��@���y�[;
��i�Q*~������⧻O�/����׻Ǘ�4DcJ^��ӮR�8č�,USD0�y/_yj���~yCr�{H�H"%���Ί����55��b�m�u�4b��b1�����|*p/���p#t���&���l����"l��K��Ƥ;L��iA�+P�@��65�3�������K�5�uZ�
/0��pA.�Q�f�9�W��,�X$<ds��j��`y�`�`= �3��+�
����=|G���L,�&�.�b�^S�{x�U@�I��%Pg��SJ�o<>�
�������MD
����^��1���d�?Ɠ����5�9�fn���x�P�c��S�R�yU��(Vl+d�M���x����eB�4�.E6{I�o8^1��^�W k���{F�^�Me����o��v�<J���@E�0BϚ��jɅ$2H
~P0�87:�0>~X����XT��m�E	�
���8#�	�
g�m���L�5��o��$[r	Tb-E�i�V�1|㭙LC撤h5���|�������Oc����������n=�[������F;=��)9��1�!��.�1c`� �����Q}J?Tܸ�q	�t�Q�w��ة*.�:�)�b1$��凋GکeE�B>Q:)�Z�����=�y1Y�����W�'eÓ�� �1�e��M<�{���Fb=>� �?5:Lz?�7�{���怌P$i:+�Wm��������:P����8�>����Y2(,
�G��W �
��g�� �'nfW�+�q�����d&�8Mpa��lzBȡ�a�Q��� ;�H�����移�a��M^��jn��y�����W��c�D��<�l׼:��U�?��SP�}.�~��t�B�qt�p(�p�l!�ݍg�>l�ކq�D�}]EB�G��ɒ
\��:�^�Da���X�w�W�[�	��J�`�[����ю�Q+JS�v�=R��{~��r?�M�_4�`P�O,
i�bI����:K<�8�'���M
��s�ڲ���56�f������E�>��
��o߿�Iy;�'A��~Ѣ�K�%��4ă��g��{���B�*��<��ճg�:��Bb%�y�&�??u�|v<���Es������ q���A��[�vz�������x��Co�{��F�뛷o��Z6k��>r;�f2r�?�{���h�exs�k����7�၃2�����]���А$��q�a[�(I���E�ξ�dz�[$�PK�yVS
�\^E!pip/_vendor/urllib3/util/proxy.py}TM��0��+F�DB\z[)���V������%bӱI6��c��\��|��f�
�=�t%�}��BE(,�u��~/+�,~���XVH�$�gf�? �U�$56�Q
+��:H�,[k��|�e	�ӓ�<�B˵V��m�.�j4V*����=��d��3�i���hR64 �l�8C���f�����j�~��]�}�"�{Ab�� NJ�qf��AQ̛��<�Bs����:���kC�u�J쐊�'5��H1��0��vy�����=s��V������DJ[�T;#��Mp'����cG�,��H�?32򝁟�3��J�@
y|�m
�@Έ@t\�@��(��j���%��^�u�������Y٣�����H?.u��h'�Tf���b���%���A��30��w�����^��t�f��a!���y[ǕA�eK?��;�h�+��V5����k����ھ�B^�4+܈����&Ni��V�da����A�X���'c�T\�����6�0���s�e�"��&=�7�c6}�Er;9n��B^LDt�$}|��^�N�Z�"�9��u4����y�"�[�,��9'�PK�yVSN����!pip/_vendor/urllib3/util/queue.pymP�J�0��)��	Z���WO+({O�4�e0ͤ�Fŧ7I����@��	���	:v��؋Rv��m��^P�f���oJ'L�������"���>(Hg/��
р�1�Z�����^��
g�zI�]]?蒳��a�@}4M�&:lf<�y�<���)�:׊��,�*uy��y-4�i����f��Ɉ.8n�ILh�Wk� �K�CLw4�G��j���C��ӄ��tzS��z���n�
��PK�yVS�d�T�#pip/_vendor/urllib3/util/request.py�W�o�H��bd���Ā�S�"ZGu��徜���'�R{7쮛�~3뷛�=���z�=�yxmtq�.\a0�A�[m���Y�0.�A�f�����EM�z�U�S�n���:���i>*�;�R���D���1���[�܈k���w��)H��M�[�A�.�� �nEV ��H��E��.��4��%b̥sR]��9�����myfD�b
�p:N&"��^m���l�e똉N��qŽ��>�Z.�ľ\����o*��G�fv|���E��������p��ׯ;O�z��㓳E���(R_QYt�BQ*�Ji8�pC
��`U�U��&Ap�����*^|xs����o���NS\g�a8��@�:�F�Lr��B��4�uZdW���"���ų�A�f8��>���-�)��byZ�̘�L��ӳ�۫��٦W�1qc�; !7W{A7��Xd��>h�S���F\G�s��}0:	�2�)��í�w���U*-c6ND���NJ��0�ߗr?)���6@���<�_
���Qx�V�w�)���tMp�2z𤩅Q����P-�=�̳�*�}��P�r�+�;���P�)dҺ)���"��Z?8#�e�X.�Q7�����Pf��ೖ�jc��D�h�.����ad1�(J��F���P���AK7|p/�<�u;��-[$�0�۽�h5+L���/O�E/Þ�6��X,2<kR"�9�{�MZ��'}ļ�ȯ�̔H�-5��`ֆ�&x9��aH�?%S����lN-a�P���6�<hd�z��_ם�f�nц'��B=}='��o���a�)�)�Z<�]+`�a��
���[ܫ��nPό#�V^�ÅIw�Je�P	
�rz'-1|k������| `@�#aF\�C�IG�şI4���
�����b�:^�:@#�;�HFK۰j�
{����	���u�[a��_e!<iw��j�J�L��Ӱp�ٯ�Z����(<P���i5�o���I�6���/-�;@B��E����紼�kIr��Jvb��Ep
tT�8j*x3'���[��Cɯe[��+'�9M�����G4j�s�ӆB�����ّ�M�\wCQ�N���Zi<��8��l��w<���AHzMu:�2Z�X��f	�?���?b�q�ˍk|z�׭)�_��"��T�r�F��ҏq�m�
h��;.��O�D�d3� `-(δ��6,�������'����g�7��#�-����q?��?����nB�b&䣀�R5	.M�02F�2�Nz��L%���6���(#q����6��(�L�`�����	,o��L6��pQ���S����dt��Oq4?��4����0�Vg<�1�YM~��Fn���h��~���+@��$���x+��;��{��2�O9��(���e�G���N]�SCÏ�o;]�7�^ci
���O����������?���u��y�z�k�D�Y��[G�$�?�Q�=́4O��PK�yVS6(մ`�
$pip/_vendor/urllib3/util/response.py�VMo�6��W�Cl�Q��u�n��!۠�.
�CK#��DzI�^�����e'Ȣ@u�%r>�����4b�([�ZZ,�j��z!��ԭ�E|�J�G�TuF�뺝wm��ZZ�7�*��gej��賓���'��L�iw����br�e�5�5��oHd�uJ��9f�w-�'�"�9�5k̆z���"�i���Z-G�QA�PnQ�qTL���|$�����ɉmE�"+�X�
iQ��Nk�D&�nD����
�F�<T����s���x����i�G�R��Gx�0*-r�H��|e�(9}�#/���l���q�\K��߽�[B�5��c��Xq�UK�>`�Om-�{%㍒�	S�*W�ޟ�4�+w�Ki�$��T3��$En��J���AM�	�}^�J���y�k܅0yU�uLO1�l������_ɭ�W��x�r�|4���ɬT��gY�q�d���˚�>y�
�ӳ4FI|O�ጬ_T����B���h�x_�"��ܐX���yNΕm]�;d����Woe{�9�����]�"�T�)�.Bj�_4�n�E���oqq�_��Yl�ѿC:���<�c�6dU����N���\�&{.1����MǑM��u�o��(�V�)�=�Bn)Ԗ����Z�OJ	
�pM�Α�-Z��U�-���A�r�B� �5h���R��z������i�uG4xG3�~�]����}�O6��F����P�i����%7������xZ"
v������E��zo[)�(��0�X��-��be�}+��q�5�݁���N�tf�
Tw�V*m"9RP�ą�H�t�Q���T��0����A��80��$,�H�fb��y����ۗ�Lv��jC 7��.
�T����)vam\Y���UP�#�C6�t���t�a�v�D�������4v`����#%e_�.�З�E�m-�pz~"�����l�|�.��4gIF�_�#֝�=?
�
w�Zi�0;JS�f���׮HÍ���"��j@=�f�<�a‚w�u��͋�q����}8��Vc���K~�ҡH򳗅?��|�!?sa��1͏����t휼���pL��u�@�}t,����$�^��١�˃����v�M ����]6���4�A�V`L�R�\_�?M�b�n�.j��iUϥ�Z��5f�>���Qk�J��݈���Up��MR&�Q�W�N� !�f�8����w�s��
X��28�Pe��Ѱee��p��U��Et�cp�������1`@ø��t?�s&� O�S���p)�3t�;�0v�.����笅���ay��G�PK�yVS��	���S!pip/_vendor/urllib3/util/retry.py�<ks��v�+v�f&L�I�p.�(k�y$���Ar)�Q���=��{PNF�Co�A�ݳ{{��ȷ,��uU<�X���E��E��u�#�ד��6NR�%�oo��V}-��������E���WZ�iʗU�g�Z*��|Uջ��!Iŋ*�S=��?�&��b@�%�9@���y�e}��u5-��҃��.N��+����&���U�`�z[�U;to��C�B�5/w�.o
�>w��c|�.�������]x˫�pɋ ��Q4�z��E\Ŭ��z��a���
^�y��p��U��q��w�˪�1���ӊ%���{�b������v`�.��wG��}V��+���E��8b�eWu�W_%P=J�e�L��	fWWc�=�;e{Ζq���w6��L��Sg+�e��e�I�a+������^t��1�5a��`���"��T;>J?�|��@�V|�.�/�޽�Eo��WW�o�.g�ח7�`��r~�Іx��D�w%����1@�BQ�p�I���$Y!��N�Q�ޕ�����o���
@��
D�?t`^��^�	�������]�{�z]ȅ%��~Q�N^���QAl��GD�zzqy==�E��g�����g�}
!��$������T/s��^��%�{)O�����Ìx��?Ϗ/c���O`�x������H]N7��%y��>��!['�uA;���r#�����8H�e��x`3�@��&�ޭ���7`g�40�d���e�����K���!�L�68T�B+i��Z�lN�xܳ��fN$�K�L�£x59�–N�3D�T��ho�,FWAB������i��
��_���!;›���}��.�����U�@�,��
�UɊ��p��w�p���*�LYNF�A;��2^�@��ہ���_�i�����; ��d��x�gmL�:��8Fi�xa����Z�Y���,{�ąAg����qɉ�˸&�4P��"N�,�wq�ǜ���Wqjt�����.x!�C�p��8M�}�f�U�O9_�lɉ�,��8euV����
��ڿ��mO$\����j�^��e�q�h4F'�����!�IQV�mΐ��/���:��pf�s�T�g�>TrB�x�$��lg�	pNFJ��� �Nɬ��6�{�0�/���[u¤����mڪ�ŝ
Q�#�g��z��M�ì"��@�d1A�[�i�W���F�!Ƣ/�$j�Za��ЅJB4h$郤�4��/�c�F�8���u���m���,Ac�8�'d�Q�8�P@="*�6�oC�:�&����.OP��ـHWO��<�ٛ>�CPbb�j6{k4Y21i]q�bt2�?������������P��t&_$].񦈑lIŷ��_����=(&�nWK������i�\�c�姓'R�_��P΍�teݶUe�;��Ȅ�a

E���n��Me���U�w:���\�T��0=J}������<]�a�����%Y*

=�:�;�$ڀ�-'k]��7�4��>Ȋ�@4q8�sr�7��wD���(�J�w1�A��`�M^��6+��rՆ80�ȉ�R$ה���7P��IL�p��vV	�lZ��4��!V�`�C�$I�C
����Ahr6g���-�-��
������T�慡��l?o~��u	�!�kH�)?�	zE@�J��!��U��{AFd'��?�#����]B|�3�B)��@H��}	! *H�b`�{�q�D�{�l){4���|��!�b�4N�jU�*T[n�#HP�D)ԥ�:�a�8�:Z��*/l��'L<!)ڡeZ�j�y����Rk%�S�N�́����<%VnAT�x��M��kP��
�82r�Q���S��~r7��}͂S�5��d�{�s��}f��D�Pt�h7e�:qs	�D�'Hq �x]g��<��̭�9��(����[���MP�XQ��G��?ͳ[+I�\M���_�^��ޜ�[�h(����B=��h, De
�c�~�p4�C%�v�����x�~!Y����lvkL��LRž��O���=��ھt��
x�i\�ь3*�mN�VA��fC��h�ބ"@)y�1��<�
��B3��,P@4=]t��6�1FD}f�h%Y�@��Z���4�b
�A�.c�S��J�%�_�g�㎥jB�y�rd�2v�rY�X(�Mb"h
�
[�+�p+)�6�u�fB�7"�m�:ex&ET�
���3�Rb8=G����䜯���ߣ����ut3;����ί.�7s�>8I�HX-���9K���)����+�L�����4#g�*��#v�?B6M4
^ BU �|�{��J"
ܞ��*%)g���i>�o]f�;�����$~�1�%�_�3��������Φxu�vvy��
^ή�Χ�4y�ئk��6ϠH�up���oO H���!�n��Csi������`f��I��Z�ﲊh�z6��[��14<��;9�t?�Х�"Ð��k���fNNF�JȢ�1�d(^5n�0ֽ-��ݤ�ͻ�	�DU6}P��ׂO,�����y�s�Y��T�
t����S$ZPT���1����������2���G��OM2
KN��qx�&"�Fd����Ȣ�$�yk��t�#�#�[a��$��ĥ��ЯƊ����ās�@5�B�e���\���`�.d5��^��ϡ�����/?���S����/��T��"@����:��o-�}��W;0�[��**�'�@c"���HjOx(��ǔ��6uH�6�:�}(R^YEp	bЧ|�p�q{�O
���}�LA�{>�q#kkab���ɺ��6��+�̦\xw��^7�쁷���:�h�xw���S���B��>�ݖ����r@�[�0��߄H�"���A-�
烞;0�D�y|�[u�H�z�
ÜW�(�>>COf�����&M�#��i�-�t��Ĝ��ٖ�*���3i����7iڎY6��Mw��ll�����<"v>�No�30��?���J��M� r	FAĐ
�~cb[<g�:��p2z
�!Lȸ�R/hκ��T��6d�a����dA�h�E�4��bUC�w��s��4�����z��@{
-`H<�IioHb��Bp?Z�HX���e`$��<����8�����(BmEM���
?O�\�'s���%N֠qG��Mz}P�H���o�r�ϯN���EP��
`(���$�����hy""y�e����h�I/����$����ʲ�~�gЏ ��x�ow@�E�&Ճn��S�JÒr\���P��2��}�G�����/E<����vO��o%%
F�-y�1$A4VC�1vS��ј��.������̦aCA��z�����/�۠�gw�s�!U��쫂�+��[l�Vk���8�Eʤa&BH��ї��:�����Z�lS1��
C�q�R7����@+�cQbU5;�!dL*�|	����m��r��m�&OVL!Ț�yQ
�b�௫���6�����x�X��~��S�[Õ�"��C`O� \�a�
lI���_&�UG�Ȋm�p8i��u}�cQ\���&���JH
��,WT
x*� K�%O�wԗ�.^�|`�Z9~��^�^��V�>�T��y�^~�b�-K/���[WO����������>|���Z?�~�B%g��Ú*ZC
���D�<Aa�D��v�z��VG+RV�y�#�˯-�s�`ܿbd�?|��#c�>�!��ic/�ؙ��z7;G@YNI��Q�R����:�R�f�U&ឆ��M()mb��T�A���^�rAk6�H�Qu�l?�#\���ٲ\,V���X<婕�}D�u�a�h8���'��^��y¥�|(���@H�������Ȩ�k��5mG_TA\;���p����8�C]�0d��RQ
J�eU��.g�"{�D`S�9L����E��|/�ʼn��)؁���Э}$Z�5p�DTl�H��{�na��q �-��`�Fm�׷,�������첽n�w��@d#�� �>/�<�sK�����^�=��@Q���W�]DJ��0�M-��S�p�ť҆jŬ5�8U���`�����-��j�m"zJ�p�K��i<-����ǣ)�j=��b����3OJ-q��22���ݑ�׮̨��
���'x�eM-�qe�$���"��<���F3 5	&��L�/^�.���VH�Z/kz<EQ�*%�I�C�P�[�'�h�	�/����Zz'1}Bm�xA�0�1'G�>��$_6~c��T�$�2h���	;�p�A<�{$�ⶋ���/?�T"��'����[�X+V�
e�w<[&k�o٨�L�Hb 	��n�$2h/��a�z��^��K�A�/D�"�g`)��g݅�g:��	4��P�QR�އ�u���.@V>"R�������x�gK�xպ��qD�N�4��I����|O�Cj�
*7��ϋ�c�n�O)�	hC����!�
۬�ו�SwY�&�݆��,�Y�si�H>�"HoU䦺w	N���Ǝ��k�s��FC�&�rk�6��Dd�ܾ4�Ii��m��Xn:���S�..*ok���g�R�IJ����
v����b�V���e�9��6��Ж
Ii8�Z"yRF6����n�<릫9L��=I��a/�1ޓ���
��&;/d��Tؒ�;�d/*�u�=��/��v�"Űy��t�Q�;T��ҵ��]����:I1$R�63`0�E�~�%�h%��[�P��]�WB��F��H[Z�t�bn���݋�mT��{TE��!��q�:^�_֘p���l<��#�-��zj���F͵���p��6ʛ�H��1Kl-�xUOAOK�0����T�XJ��
˫��Z�U���rA�������_��@�t]����X ��B����FA�N��jCѝ�A�ޞ��[j*�Qű��i����U���5��H@#C1ch˖�CQ
2-�3Y��Us��x�N@�Vc��P[��6��է��4.p[G�nw��1
�l+���~�}�:�{p�S�i�&^	�#$Pۗ֠���w�T�&N�~��h���'YnO3���^��.�i~�Vxَ7�nH�d��Q�!y*Ҩ�tӅFt��Z��؎vn�I��%��,������FO|�V���ӯv�r��~�\�����n��v���u7tӗ�%����Tv�z^��n��B)�i�ߜ�n4��hupQG�ԁ�"ڡ��&���\�/�_�ח����ɡ6�/$[
z����rt���{�y;=�|�6��_�x{m�_<�Q���t�}��-�
P��Њ@:�M1��7�
�^��Fqr�}��s�@���~9�Um
s-�r����Z��W4����q �\���[�Ԩ�I	H~�����KˍN.��*�c�A�&
�_?�߳���"?�j
)����D����@0���>5_?��~�8�I;>���O���Y	��/�|xu�`s�3$���=;��7�$�Cz�B3�f�dҒ��զHM^[?�b���$.]l��G���.58���=AYc��p�HV;FQ;��ɢ��1:SB`�71��P�[���
@[&wq*�?�;	Q��_z�?�b�_PK�yVS���ǧC pip/_vendor/urllib3/util/ssl_.py�<ks�ȑ�+&Tՙ�B�%y��tW\�^�"K:Q�-'������l6���{�A�[��RYx�����^��E�b[mEL�7yQ1>/�t[�H�w:��j�cs������/2�-���e��XJ�v%^R��l��K���*�s�N�X�������;
,�K,6�̳��:~&Y)bX�}ʫE^�Rd���_��x%��sVn78N$���v�I�%�zC�ӛqQ�E�雩7<~�Ka'.�~�-R���h|3�N�����������wp���Q�U�bW�6�>y,xV���pip�����L������-���������vz��h_
o�o����ǻ����������yx�s�s�>�Mɪ�`�ȖՊ��Y"a}�r���y*ho�b���v�)�d�`�,�$��Ϸ����&���b�6��ہ���z3�t:�X�(�m������)T�،����ڍn�KG
�U�\�\"��[���Ȍ^��B�Z��K5C�[X�\��j�������eH�t��
&�%;�W�*`<K�Yo��,E�QZ�r��n�"����S$�7�	��U�
�\UH��䦇t��{�w0L����+��G��#�v�+����i n)*^UE�:`]�}7���;���;a��W���II�e)S�jT�1�G�GP���<y_lW�MT��:J�لI6�,�̭��Uy�����
U�*�����_�fybL�i��\�x���
t�2|�J�����f���>�/.a�<�c���:��	L:��&G�c|}8�^���.h4���o����I�+3��G�w��������m�����Q
�
2޾����./ԥ3ƙ��	�"�8�a���d<ID���+���
�;N�N�~†L�S���%	��4�1�?��u�d����/�/�j,7`�A��2�9���l'�d��&Ӕ�y�<�"vY��xE4�����F�v��)��l������*��`nN7���,/�Z����>O�Z���R\�"��O���ӝ���4y
�j�ψxtK��\�
�D�`�M!��ke�V��/�!$Z�(@'2
¡YY�x�z��g���\D��@���\T�Ƅ,�b��ٞ
���G���V~/�*$����d8�1�˰v���Y�s�m��@����)�c� ��!���u�)d�,9���on߂��`HZ��{�i8*v=�*J����:�3�D�0��k�%���&��{H����Ǝ`����-��)��rE1�m'�j�ౠI��sQ@�l�����o�D ��� �f�a���g.S;����7��hr�q���;��e��?Y;٥�8<��磏C��x�i�?�xZ��̉��'�a�X��}����=O@�{�}��N���D�`)?剀���{B�ࣝ��|����}a���5�����W�t`D\�q�FhG@��8�������4�=����6�=�t����Q�S���I ����U^V_�
��ĐxEk`CC��n�n�-Hy�"_���:�H�p4]�T�$���7@���!�yB�E�^��0SL�n��.s�m��ez��4W��4Dp��B��fë��Ix�馕���
Gǃ[����E��x|4�SpHHl�뎆`��Uy!�h�`�%�tG{��̉D��9qзO�L-��s�J��Ȧ�r�J��cu�
�U�_~�ћ����\�5&6E�/z��!�
�@);c8X�	3���g�H%���i*��
@>��K�c��7`N6����I���)?݂E4���L�Jw!�_E!��oatƶ�e��<P% ;ذtڂa�
%��y�,�8�-�"r��8���`�p�I����Dvv^�_�x�1Lr�-��S�ׂ�#:�Q�1?�V��O߻{tK�����&�;�l��]co��W-��XP}kT��ZX�ȷ�o��1�_j��Ձ����w���i��*{��o�~�[�߾.���E-`SD2�U=\e��'�z�-�R�B���r#T��Q*�!B��?�N4���E���e�i��Q�|��0��H{AgV�%�K	�I:7*"���A(lE�f�*r�]�w�1���D����4��)!��]%��Z��I�Z���[���{�FsfF9��3py+��62�%����/�PY�&�N�O��Dd1t����i�fy�ol���X��_��\^�MnEj߮��;Yhp�II�l��,�D���=
���Z-�9x�Cj�Gy�)���XtMhB鐍_ ^E��E>l	��?�K���CH`��.��#f�(g!��G���@��.n������{���K9�.dl�ۭd�2ڀ�4L�rUӂ�1�鳵ד(�H�
��m�K��*�&/7��d0�1��<���n�T��B�T$��I(��Umؖ���½2@�3Ӵ0�UPu��sp��\���7��^�]�y�����p�'��YVo �h6�f�Qԫ�	�����^�Dm��y��zT����!�F�uo
� �L~��}���B��4;0�"���o�l
�
�KA���$��D��%���c�I8��*��lh��^��E*�ġ�zf�n�����gbZ�HG�h_)i�!�Mje���ufj�ꠃ��z/�ij�R	f�Y�w���CB��3�����L?�JP�Zb�U��X��<�2������j!
'ġ^�Fd:�)�S�}�]�&�.g��kUd������i臀���pʦ
r�yH��6�u�]A����
5^�~c��|0�S-2��	ac�$/B�o+�:��Ȏ�m'�G��߄�E��b���n����X
k���px�z�v^V�"a�g3�$?��l�lF�g3m�Y�!0He�u�?��?:�Yk� E	5�e f�( �6��$��)i�?͞����	�u+�\a�b����<�V�Em<�V����4�%��ۈ�E��{��U�z�?�� X���B�Dٌ�]֋Mjm1�Z|�̛^�@=�TW�,�gNU
�S؝��l4�v
^z=Q��V���/R��<��B��(����̨EZ'�R:�F賋-��a�aA��*0��,Ѩ��=h���9��u�O�31����n�>�<��ߔ������Lt���S�u�=��-%�"P�(���c��5Ԣ�YF��'��B�!˝m�>"Cs�p�F�ɟ[�K��S��7�4���[O��G`�K��Z�?a�Im��u�;+^�۔�$��|[ �����l�s��H�3��€E]�f��_:��#�,3Ⱦ������ӘA��1�G�l��<|����'!�������3�<��=M�!���_-�E��M*c	ap������
�]�A���R���9x�90g'<g��N�TaG)¶
��D{���~c�()�����,�0��cI�HJ.�HU��X}�E�]��+��zr�{{,H�Q��P��=�s�����5V~w����
�^�8��~W��U��T��Ǐ��廐��Y&b�^�iL�H���թ�������Se���ma{��W"���b1�&�eeK��6Be]

�-P�L��r��P��…�kd�K*�PmGL�0|�\ ?��߽����f`�MEu�]��Fф�w������c��,Z�}�5FX�e�q�z�O�ػ�j����AB�ٍ�po�A����\����糔|a���͑��9	���\�5��`M�G\]	��!�o2*b��0+�e� Lq�MP�n�G	Qd�,
��Ls�o��oy���GZ��:�vgt�2�`�Kv���=�4�C�1�9�8H�t�|!N�[^$n�c�y�Du���p���+�\���?�5�蠒L0����a��Iŋ=Ͱ�M��T�	�N�mG�(ʞ���Ԃb���y�=b	&	�ʖ���V`T��l��_��C��~!�t�^�o��9}c��˥.u��-�W'�,9EY1�Gr��dD�,�<��3/$b�(���0�rs����M`\�>kH~�4�XϪ���n<�
�M��u�k�����2d�^����p^��`*�w=
�^��:h����*~��e��"I�0��#p�"݉RU��<rJ'��69�Z�����©��p��é�D�S�<’#x��
�����*-�/E�G�l�N���Wz�u��[U��K)5}�؂t�L���ȃ�P��uF(?t�G�r�O��Qgx��>�NsS����ԣ�S�Ы����������I3���bP�����g�%�|�F�"�h������W��)3��N�z�R�zh?ڊ���(�)�=���o��˲�5d�l��
Sb.X�{�a�7�⛒���t@c��%:�U��p�uբ��J�޺\��v���yẹ9��&�|¾�!>��3�~���>2�ýņD�a���R%��s�%�V���ϪwVH��ZU `G�Z~
2vJ!�˃4��+��)ؘì1}C����)Mm�q
B3<D���1�s�mu�������4��#��M�m�x
Sb
*�-�d���D�	\��#UVDŽ;��p���=O{V	�0�B���Xy�����=��b<ܵ���7�S��)]�Q���*�D�\u��tb�a�@Dۊ=�����E!D0 �֔�t�w�"��d�仒�L�TE0X�?��'��*��n�tp��+��;<�\�8.�|��<�b27q�k��*#X{A�7�0/�(IQ�MD߬
LŸ���XK� T�-L���v͔�6���,#|���%�wx����r�K=�	�~u���i�']G�u�䥐md�"���Ó���zq��Bxi�=Mk
t�:��M��'�.��=��2�J(�8���H��[���&�hPS:���N�9#�g-ۍ�����M��+	,"�(�n
�P,		��v38��1�D*������w��T��R7�Ȩ̤�F7	A�E� �r���5���T���j���Õeǻ(:4��
������h��2H�'�ܘ^�h4�ת�G눵0U��7���ּ��x�Z8m��Z _9q�f������d��0��C\���22�z�{v�����,�,�;R�����M���e7�6��2�*4�=�q뢇�@�0,�yH�MwO�(��Y]:���#�
��D�?��?����6�|����ȔQ�����F�H�����'ʜ��eknӒZS|��U"���wS�F�}�����d&K[֢ΰ�Ou�ɘ��wh��{c<C�5�&�(�עT%�?���\����*�L��̉����ڙ�[ۣ�<x��[Ӂ�/�ݏ��`��y���-��^�T��0}8M&T0ɟ�N,�X~k�A���{�۴y��=�xH���B��h�	j����"' r�_���䂺�Ҏ��Yl*]
��'���2}���v��Oq_���#���������
�u�.�C�-(F��@��[^Q+���J;�e�4�$�Z��\���ݑ
w��R��K>���|]@�H}n��V[2�9{���=j��:\�k#�M��5ͬ�E5zΫ��\.�6��?��>R�rl�	F��ɿj��l�7��w�PK�yVS��l�
(pip/_vendor/urllib3/util/ssltransport.py�Ymo���_��pX���e�EqX��%h��$�mQ�L��ʤJRvܢ��3CJ&-)�õ���ř���JǤI����p�/[�Fk�w��U��Zi�զ,��L<�rR+�������b+v⓲u��j���g�-��ϣ���m~y{���7�bs��7����hT��Z�ÕE�G>��]lEr��W�q�ij�N�M�����/Ki��H��Z)Q�Bو?j�7G�4�?��VoH��S�#%�k�}$��^��`�Q��Vl�T��K'��-n��,Pm��
���7Nu�Myd��drMxJ��\+���J�_��ho���v�:�j���JR�f�9���,�X�@8��'+�f���rŝ�!8r�Ég����]is��It4�N���.-Z~ dPc��2z/W�;BdWo[
�ΪE��Sh�4��4�h���#�Z:x��/�~ӂykS%�"���Ҏm��Ι�36n�ƑI�}v��w�s�4Ӏ�&j��d�FaJ��^���b2e��,�`	����u��]�v�<����=�%�<xI}� ��"�������IT+�,dҌ%����ɷ�q���g�Č2T��ᛍX�B��|ajA����H�P�N��]Cy\[�nC	�����T��!��?��6�˛��4�ӵ��~���OGd�y|��5�7��Ԗz�w{�V��o�^�T��g�~�H�^_�{a���F��%�Z�-�,�TJ*�R���$�;[��Ib
JܞqF��(M��)}�:�貢�VL"��,��/��g�0b��[���h����3���ka(��r�	�����J��}{]�_D�P�!�՜]���ג?�W�h3cB�SX�
S#�V��c�%6Z�z<}��g"Cp:��u�1�<:aC~�r*�(�p���F���
{ܙ���h�I��P����n�Z��z���@�$���K�-�Y����}�c�x,n{)�oʸe�kF��[7_��9����TH��d�&�в�y��n��cͣL�OP%��6�0x�o�l��d�$٠u)���Z�t‹�I���j*֯�Ƽ�+1�q�P�C�
h��'*���R*߱_j��:�u�*J�3e�m#e��͢��BQY�6����>�)��-Y�����d��������jb���^	���8���[�(��tJhLx7�WA�t�%�V0t�<��a޵�M��S�~�E6��r��/ŒT�P���׆M��>c�o�&��c�5�+fӨ3c������C�(b���Դ��9��İ)	0u�T�K�p��Vݻ����4�N�;7�'��$��Ý��q|e;-e~��y��~`9�-�0���nA�{K��xξ`|^<b&�����?|�]䗟���r���2bͻah��#�Vm�Y��Ar֖G2N�gSa��ǃ>7��/�w.|x���L�|���V���@(b/���<�����ozL��Z�	}�n�`������۔޶�N�,d�YRӍx~j����|�}��x�h2��sFț�x���`�f,$�ې���O��n/C�FW�nb�V/�����5���e�@��i%�}X�xY��J�]�j��Z���jx�!�s��}
b�[N�h]}��c�DQ��N���c��i �"bO��Y���&Nj�JP�sO$u�:I��H��nqCˡ(/''b'�Q��������J=��,D�Ei�$�8�zx�{ȯ����i.^�|��A�����+���0�ת�����M�����P�|wǐ��;�%�wߵ/gP���%o{��.Wt)���SP�{��h9��R��eY;%��t*9�:�X�r�Sq�l�z���ϋ����O3�s��p���va���xь'E����̘�W���Y/��ED�1[�b�@�7�Q�P�K��J��_��u:��?]�;�NԬ�b���dPk�.l�E��$���]Z�����}��
���f�&��g�t��PK�yVS$���'#pip/_vendor/urllib3/util/timeout.py�Z[s۸~�����4����캳i�M3��d&�Q�HHBC,ZQ��{���H�N�δzH$88��\�u�vl�X����b��U�a|�U�������s#w����m�Ě��aZ���}�z��^���lkL[�3�ɦ�%7��-7�Q~1�s
�t+J��v��@�;[#k��;~��??�x�����-�����ǻ3�6���R�F�F�w��N�u�C�3-#Q�{^��!��-@��j����S�-S������gx�G-�T�S�2��%�k�﹬���Y�wp��E�y#�U���g��î�̒��rYs��x3{�8c�9??w�Y�����G��g�ڽӬ�
[�A9y0�Zu�U�.�<b�x���"E�ڃ٪ƾ����m`	�n�����u�W���7s�����?�o��6޺���N�,��]y'��mfW�_�]e�
���3ߵ��R�斱wkE���`��V�[��E��Jh2e,1�F���[8˼�n��~s3����ԈB��a��-���;aD����/����n�ⴽ��3~�w�0�:���Er	�^��+�W� ҚDZ�xSS�$xx���u�@n/A[�H��I�:r�Z�
��Q�H�1F�Z��7
>��=���
+e��~��$2ȭ<�wb�#_B�GlB��b�b����YE��2}h6��0�V8%��2��7�.Kl�$��!؎��~�N�������
;*=�3�\����@�	��Vq!�m���,����Ew�l+����Ǻw��
�k;�:�%����+���d��������&�>��ns]���kY����<]��z����?���[��T.�gO��i��9T��
	N.!<7҈��pP�W�N����Ar�n͕0{!<�F� oS[�Ͷkq"�[Y[�2p꧑�o~�u���[�M�H�9mB�EQ>��ּ4��)����[�CHjV���OP���"/rʆ����}�ZM~��.�g�=��J���|�ŪF��h��q�UbX �k@�:�~tA���4$�O�$�lʺ�o�f�^���@o)����M�ņ��7
eL�����:i��E�
�uLK+��FG��<��J"̳��-�!���\C!=d�D''QM�|�(%��&����Q�_��e�)�۟"4Z���� @��)X��,�-d�K*�E�{-"��p�mS&�";��:4��
j*jmޗv����������<��>{h�ܡ��%&�;��`�r�,��zT��������";��*4�L��@+�V�iК�3A�;�@�D��k6КT߱���Ү��N 
��'�ט�
��{,�J��|�QP��c�X�����)�����yL�DV��s�4X�/��?��,m#�p�T��G����œ].B�b�\,fZ�����ա�*�핫L��yY�^�_ܺ�������/s��r���G$Hk'��[،��~xr'�����Tmxg"��L`5�p��v.}~�C�~�9����n~�.�,l#A���Ţ���XdɂD�S�H��V���6 8�b���[Q�Z��ӞwU�-ŕ�!D���6�oI�H�/T[U
[��'\f��`��'�|�P�C�-W=�)͈`�Ȯ�"�US	���<�{�x��Q����F$BLLL���)~0�
�j@���h=T#�ņ=�S���)~�襱�t�l$F>�%���^�_�1
P
�h�RgM��,�j`U�`J���Q%��Ct�
�� �Z2�"pZ���w��L��A��\P�O�c*T�������l�iJ-��3���*$�Q��^S�$y��7�#l�����N�a���x7.o�3(4];"�Ri�aXegllv�#ƳH�o�Ѫ�RӼ�<w�冓Ί2!�t��͜�Ϗ�=-n@�����0��s۲9?�l2E��
`,Q0#��������#�c7h�j�s�
�M�p�����c/��ز.,�)q�qU�4 ���F���6��a�
/iN���8_�ɡ�D;۩��4ᗫt�2�l���Xy?��—�.}��0Fꂄ.����P�
�2a8�ᐤ���qm�r�,�QՇ���7x��o�h�?�lj��[�aX~�q�u��G�4C/�l�J��xPqZMq�q���JB?�*�a��!u|#�+�U���G�9TQ�E���!�Ҡ{�v���J�r��F�
q��:~;��A��h�������������j��B2�J��(ߤ��Wl�+�~C��J���zQ�4^k�����>Ot&�aփgj{AU6`^�'1t5����IZcۺ=*�]�>�����aU�}��#�\�w�m���cs��ύ��۵|t�V`��>7Pa�!qc+��
���f�aiZ�Ї��T���G��c��,d"�	2��M��l��{����{�mDx����܄_�hLQ�-�e)�T��_`*+��a�)�|�H�����#���_��μ�nj�B=<1�W���H�/(�l�A\��vi���r���MH���4<~tq�0d
��N���P���-��ܥa|����C�B�[b����C���pL�]g������"`G��4_�7:cHƃ�;�0����(�O!�k��pb�zG��SG/�c�ȁ�Q库68Dyb�ư���h������������+M�	|Trs�1̰F�J�]kG��w<�E	:	�Y��ij.�t6�/*ъ�‘����)j2:�n���"1��&����g�PV�U-��k�†�X,���(���6ؚ��S��k��ӆ�O���{P�d�I �w.�c�̐��r�4;��@����d	vE�eS�8��N���,�"��q���+�)���,O�|M$��q-�s�����dCб:tk�p�g�y4J�G��+�+L4-��e0�I)ؓR�PK�yVS竕���6pip/_vendor/urllib3/util/url.py�;{_�H���S�e-
F&�.����$����p�l��6��у�<�_Uu�ԲdH�ο,�������L�x�\wZ�E�]��$Ns捳8,r�ߝ�Oyg��8�$�(S(�7�~^$!����ԀN㉇�4�4�S�x���/!���)���<���6�ɌϹ�c�W�3���Y�߈Aߞ������w7�Qn�:�5���(\�O^��<fQ�ν0��0�ا �1/bo//ߛ�l@��a0�aA4� ���T@��J�1�,���tǜ��<�;g��wG�'�<����
.`*���i����G��ļ0d��3�q��y
J��S�|���g�7�n:���|���_��!����߁��؞��~�y���"�i_"t���g��pb�� �fj�_{�ӣ��[����l3�����y����?F��66G?;_�`^
Oh�k� ۀm9֡!���7�?�������h�7�0�u謙6����1n_���:?�������ׁe8y������%F�kR³�η���mt��)A
�����.�<���Vo�Η�&�~�$���,Þ��&HZ=���V�͊1n�/@+�0�ن��[ǽ��{��t�=��7���>3�Y�
J��2Y�c}��n�++��[E�p��^;Eǩ��kҼ^��TF���SRZ�K�w��L����YI_'z���N+��̶��ٗ���U�[�`(ui��cwt��E��՜��c�v뜚�����b��2��~;�U�ur@Γ����b0�}p\�������߼=����;;�����������O�f��?��(N�L������l{gwo�?��b�?�l����g_��`�W�wD�[g���`p$1mϏ,_���=9�Ȭo�}]�Л!�%�i�u��[R������o��qC�H�y�ux32:���ݡ~����;��l6:�G�7��S�ٗ���ѽ�w��2��A���&��4����
P��G*]I��ãW��Ņ�������"�t�4[53"M�o�/.���K�}�d�g_�?T!���v�/t6Z`^�l��M����&-���e1��V�VmS�z{4�h)㹐��psAs��=����q0~��_����F�?0d!N�^��0
���eB_�v�o���
�Na^`����_
��*!_�޼�`L
ht�0:�I�e���Yܦ��h.[�#4f�v����i1�0�<Gʓ��(�;�b`k���K/��6��{/,�h9�"�8�	F�.p����gEU$�E>�Q�� �������&^�7�Dɂ"[�M&q�XJ_�b���|�u�0�3HX��-1����^�3	�^�C�w��v5����ʾ4����@��ciL� ڰ\�S�C*��~�Y�y�	�	v�A+������NK.@�1�XG��TnƐS��{��YI�	F�CZvC�J��N���#�HW=�'4�+�P�k�"Ic`�/�Dh�f�é6uX��`�cH?y��m�k�Co�A��X#��
�^M/�p9����j7�&6�\%N�aY��Ht$�d�(A4	a��h��`��H��΄����Ԗ_
+��l��T��)ܪ�E<�I˼�x�)N?�P����ľk��[����JA�u�%}�R�
�i�O�
,w����8��XI�8Q*]�@���h�d�4,I�ͦq�����00�l�]�������{Z�1g�����B�H=$yB�����oW�i��q�� Wb"�?�\3�*6��Y�ܾ��(�Jr���ơ}�u��0d3��B��{�[v����7O���8��R���o�
����b�+
q|ҁߟ{A��ZMDկ��Dn�*V��O�G8	��`�>�� x~�ի�m�u�����	>(�ԵV
���B�q�o�C"�V�j5���=h#���М�@:fh�`��,n�`�fx�μ$�0>Or�2f��o����#��P���=����I|B�5\r/O�SАȤ�B*JR`�fc��}?A`��}�?K�䠅oְ˵~��(OЦ�����[�=*�w8K��t���&�>�y�9���1R�s���Þ��{����"�Is�#�� �79V/� `����Y�S�Jp�Rr	h������`(D�s��`w��!�9���d!uFH�L#E(]�:���4�nGWQw�������>�����8�A�N�)j��,S�_w�1������ �����2��������30`�>�B��C/��M��rσ�
��6ȭ"P}�X{D�x��3{D���6���mՍ|cR�Z����5C�xd��N���6�(�}�������6
$k�B����׎D�y_+�s`��-7�ˣI�s7���|w2�#�� Gpx!��E�8��Q����F�/��t�� �iW�VR*)�.�a���
ᅿ`I��_�[(�"-U��Q	!4T!`dž��K9ȫKS^�������e�Ƌ�KK]c��ua*�(njm��+ݡ�+�+ie1�PK��<l�t׻�"6��S`�$0Ek��R m	%W��|�a��bU)T��Ǿ'<�#��;8s�0��iq�� �wI%@�Z6!�)�����w�1x1�^2�&%(��M	D;E��cc]Ґ����饩�P�8z�=D�Ew���AD�%QK;� �A�J[�D��\��☁��者Ŷ�_�NI�&�u�m�[rT�q!�8�k�Ϛ�2[4����
E5�Ϩ'�%�_ٳ��%��sZ5Q��U&\�fM�n�͕h6l6>�
`��TBZ���Hًe�������,��蚤夔�X�ʼnL��@����8�,��#r�k삋�(��y���|j��]��C՚\�Dys�޶wɜ��~�����"�d��W�����8bV����`��S��39��z��'Q��!!:�1�p���)I$���%M\iE^���UA�6&B�V@BpD�]�dp$�Z��L�".2�B0F�6V�ߣhAـpZX	�@�*������S+�+���l��
[�1%��Iq�ks�j�>!	�n���R�$NH��Ӣ�5��*I$���*�1˳�dZ������	B�2Ɣ�Š|)N�XR�!I�B�h���a�V�#�&��6�O�[#m�K�����2
�;$�z�
�E%z��0��zF%ᚊ�q;���2n�ʴ[MVRL�`S���j�+��U�{��e%�J'Qփ]L�LY�lRҖi`�H��ӎ&\a@\1"/]��"�K^���Z�y�Z�B�Lv#�vU�N� ����N�MG��]��*�:�P��:v�g+IK
�7�!{��O5Id��Ϛ����bU&�k�vy�i��f���{Ҳ=�8�.d��|��qF��<���y��N)��0\B�]�vJ'�9������rC�b[d[=?�x�</0���6�nM�*Y�o�V�c8Md�ď<�*3��<�d
	��[H:yނS5�d�@Tq��Ici���'{G^�0�1:{��oO��n��]f�.ꓦkQI���=h�Pq��Vg]Lc'􊮡-�I@]�3�"������L�*RQG��V�b蹻(���eX��zۨ�a�4�b���)SYL��$?�L�?�7�
Xˊ 2'�gG�?�(�3\��z�U�-��~c�D�6h�{UY�>q9G}^e��e� 0���:�Gn���2f��a�/��:�i)��L�-T9�V��R^V�;Qr�\&w�dt��	�U�W )�8�h�5�-��)MJA��QU���R�U��_*
�`�m�2y#�9ԧvn�4�����%�}�O��f+�	a.D"��'�0�y.�f��u�C_L(I��U�b@��3�8�t�B��W�cʒ��ↄ�
,�hY�$);B����̸w�F�N�1ë@���2m���;\2r��7�݈�p�+h���d��	�X�;jv>�ۈ�ptnU����un��"��B��n���i�q��J:=l�X��W$��[�<�U�o�������8>{�l�,�]���
�>7�R�։ˬ�+�2��2��h�\��m(I��q���j�G�}�	P�jG��x�� _��8�K�҇!���O��v�*R����UquK�}�t�rJuT�bs�z�t�T�v�̀��i�0��ƹ4N��o�>Y���`IJEw��򲇦�f�&ei��b���E
NBN���x\Ρ6�fD�ܭ�=�omEo�I
��o��-�끀���������ָ���H怏&�5���Mw`��޾y��Պ��J�h��%��	+9(��U�~����-]c��q��;^%��걣B�q���-��z�ٲޕ�j�5�Zm2�#�"�Ó-]�0��]z�lEq�E���`�5��P"��"�e$Yv�g�W'!.Ϗ�6$�%�OحA�)�>����υ�Y��{连�0��d�#N@�T��4Qd���{��h���B�]�-(�5���Ĵ
E����1Z.��4��f{�Ӝ�Jx��j�+��Ά->��U�9��V���}�>�9H�t	Q��k�F������t���H�gZ���Ј�rsQR�Ne`�2�����t��y����sϯ7��5#r횆[�x{N�k��V����PK�yVS�F�q� pip/_vendor/urllib3/util/wait.py�X[o�~篘R�\�Vk\��8��T2l~b�{��rvg33����|g.�%E9�[K��e���/���X/���LT��HS�o{7���E�5�7F;�NZi��z2�v�z"�
t^ՔIj�oUL豠֋��w��K�,݈u�ZI�W+��No�g����4��)v�s1���2veI�G?�Vy�~�L&��Ήgaf�4WQ��`��4�p[��R�$Y�F���~�\��~K����0�x��{ӉB6�s$ QP�f��Z�-�dS�U��,μ�Tu:�h�#A���:�ٔ��h�GrM�p�V��K�[��'�,pm�J�/�-5A�|�FBϪ0VVx#vD��V;�Ś
��eMy��]-ʢF�	�pp�[�t��k��@l&H�����p���$�������i.��u$a�z�`�S�d�;�Z4����D�G\V uv%�L���j����s�E������5���9p����qװ��ⰓZ�ҨGr�q��"#�:��
0!$�Na�H.hK�r�����f! X%�f�ho6��<�Vm��MW�����Y�+�j��.�Hk��٢�B�W�x|[0$nNҲ�������>��4=(|H�4&�� �$��~�Ґc'��<������m���W�
�� ťw?bό���C,��rl�gM�7�j�F���9(�PT�y=����C�H��}�%��D�,#>C+�+��Ś������d���A��f�0�j�8����J/p���+�TF�})f���T�.Ŀb=�6��x��BĀ����z�8�d�}��g�b��*�z;���f:�����U3�g(��x��U��ďR��w���l�[���,��$4�J�gS�bz5�:�1�����@�o9I�mw�0���9��0ǧ�lB8�o���s�{#^-�ˁ���$�.�_�!��:KxǬW�F�t��nܯ7_.j��(�\DR��Ƶ��AJv��	"3 �?-�8�x������냁�r���+'�/�{�,�(\ވ����7��<��o��0=K����#d
g@4�j�Xb���\�<��%�+�2�K�gɷ$q .�X��K��+�_|�f�cϴ�P�]K�����Xn�~�|=N�e�-�|a8���'�Ud�\қ2(x�	O�쟡��y�(
Wn	
���i*�
9Gx�0�z�Q�Ԇ;�늂;�z�pjiW�D�2ȵ�Ÿq�n��'7�	T&4t^�ܔ�)�4�V�{	�I���B�$��t�2$�<i
��⌀=�cra�B���Ǝ{9^TI�
}�"گj�4��RfǷy��<�>�'W�#��1��+�;2Ƃ��0� ���S�J��]�0j�vCy���?�\H?����g���/�qaۘ���pg��Å��B��d5ƻ��@���	���(���ǡ�6009�sC�.�*П��8�3]ًK񗛛CqM�0H�'OB�$��݇���tg�7��x�b��$o���ߴ�c�5�֩�y����(L�+&W�0�V�$è��En�
;L0t.Bi��-�a<�;���wE(�37�
�I�ghQv��<Ú�R���&��"NYh�;ڷ���	-,ܨV��/n�<�j�/7;
>��h��j����YGޝ��H����'fxJsK5���!�#��t��9��G��\�K�r73.���-?�TS���չ4踘+��㉞.m��<8S�|`�Sa/=��
��M����T���e��x�)�.;����p��W��IV��dL2@���F�5��rz>��u��
�L�N�6V	'�r_��ӯB���g�>h�qV_���לp�l‚�<��"1�8?�a��=��3�g:�ru�ݛIC�7XT�$>�ب�π���@.w(���U���;�!=2M����*�}A��娭ƶ�u-rGj�V��z3�އ~F��PK�yVSx�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/\�PK�yVSǭ�#"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�����PK�yVSP1D$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�-��ޜ�)��yPK�yVSg8p���!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�PK�yVS��֥�*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��"ÁB pip-21.3.1.dist-info/LICENSE.txt]SOo�0��S<qj��u=M���k!�S�1$�x
q��~����NBB�����
��=���{x|x��������`h̋��`Fw�`�����?�3�QT��d����5�ٿ�q��`�#����&���_�����Q5Z���"�w�p�F��
T޻�V����'Ӈ*�9@c�5Ѭ�!f��Hc�l�lޞ�bC��F��hk�q���
yx{����>����1����{�o3���6�K�s�KO���	�9����:b��{��n�A�h�Bí�I�Һ��$X��<�(i�)���&�ߦ�B��u��P�o,%�?���[�݋��\�߻�V�h�VoO����D��P�>�I�\���7Nz�ǜ���C)�z�QB��Hy
3V�y�V��l�'��X���"O�*/K�
ĺ�Ocy�mR�?�q�Ԑ���H�%��Jp�-�5W�
�l!2�w1,�Ήs��
��H6SPlT!K��i��\�K�*|�s=GU���(W,�&�۟��%��)�Ұ�Y��r��L�EƯR*ɘXǐ�5{�J"���ۮ�t�z?�2���D�Z�1ƔJ��nE�c`J�T�RI��:!'���BUç���7%��r�!WI����/PK�mW����dpip-21.3.1.dist-info/METADATA�W]o�6}ׯ Ї�%�KW
ݖ9��!M�8ݰ'��h��Dj$��~�Rr,�ISo�&�ǹ��ҟ��w<�C+�J�at\�R$��U�Y>���3�˒�U�n�]��O��.K�2�1�u���0���E!U#�ЊU<�㹰Q�Q�"��9a�*��12Eժ��qpR�4��2�����
E�e��LZW;Y�����牴Ƀ�
e���6�6��H]���"a�:���q�����ۏumR�1̥[Գ�dO�}�Ⴋp�g��B� fV�X�{Â[+�R��ӦN���@X[�$�{2d�� �c���)װRgR�T��醴�m�Y\�G줪�^�5�\��{.���)����s#z@��k-�f������&�+5��웆��>�j�KT�jW��xg�w;{�����=�wt�U!��V��ꨶ�@'V�����Fذ�L�O����sY``/Fó��Y�\����׍��㽺|x�/��ɒ�f�7��#����,M%�S�K?�v����q��Q(����U3�d?�����tj��{�x����e��
�u�'�Fk�9��!����[a�/�
[�K�,�նR�צ�j��F�M�-�3�\eLÀ4+$�u!8b:~'g��w�;�dYW_=����&�p-�$�ش=K�0���g����)p�4��*#�=�n�Հ�C��:�Z:tɬ0��Vna#v���p���m�
��6����Y/�Sai1)���~t��ĕ<#f2G/x=�ʈ��ׅ����o:��M�(�j:�j��^,���
��l�
Wy
i�& ��c�']0\�P}���QT0E}L:fd�p8���K���4����;W5�rsx0@���m2[W�6�����>���&�t!��D)�N��Fs*���<fun86�"��
=D/���m�}@h��D]��?�����h]ڶ�������aל橴)��J�b�m(ot3��\��<���.�+� ��h�7�>ֳ�
�����R��Л��eٟ��x0�	�R��F��'Œ��j[4U36T�K9���ѷw[^���Zx��C���g4xZ�9���M%�s�������*7����
|Y_f�p���3sQ�,^����	Dt��ɖFv�o!C�y:�y-3aczȆ�/[�^k�9�ܾ&�iW�^��9(;�M"/���y˞t��A��h�ʢ��J�+�O�i渕�um�tZ1�꣙�_l�`�@߮�ݓ��Ze�ou[i��A
��J�G!�BX��am#�!%ٞ���ߤ���
�+�������c�P�&5a��v�
���#j��11pLU�k�҆+��������y�^x�1���W�(�b�nz��O�PLkk�s�n���³	B�����(���~�v��ann�M�;y/�I}9J<���D���*�
9��F���w�������?aы�朷���3���6#FT<�:=�\�O�W�����Q��PK�mW�P2�\\pip-21.3.1.dist-info/WHEEL�HM��
K-*��ϳR0�3�rO�K-J,�/�RHJ�,.�/�Q�0�36�3��
��/�,�
(-J��L�R()*M�
IL�R(�4����K�M̫��PK�mW�q�<}%pip-21.3.1.dist-info/entry_points.txt�N��+��I�/N.�,()��*�,P�U�z�y%�Ey�9z�9�z���yV �˜%z��TPK�mW���"pip-21.3.1.dist-info/top_level.txt+�,�PK�mW0�jGk�pip-21.3.1.dist-info/RECORD��ǖ�H���?�"�7��'d@:�7���_�˔RR��{7�r��_�f̘.f������Ig�Uϛ6v �8I��Q�@�'�U#�E��E@�	ad{��C;.��
����NR~��xۅ�AV�p��%�Ƴv���_�Dg�X΂�z�ۀ I|q����?����v �����0~��i��둄ϗJ�-H�@�k.I�M��>��V�I`��W:M5�wm���OS���8E\���%���'�o��D�ً�ȒP⌫��iv��,?D.qN�]`�]]�
I���s�8x�>8���-�R�hq��L�.���������C�n7$�������o�.��'�/�i6'��_�3
n�a���T�7�0S�AW���\m@D�n0yA�`�OPc��UBq;c��9�u�⚕��8�^�Kt�6 �c��3O�f��z@��
58q!�R�TUKz��q�w���z���F^Y�uS���=�ț�@��>�#�'S†�����}�")9zH���M�68�/�6��u�;���^��˞��U�x@�#�E^�o�����h[
��B��|���
��� ��/�
�'��d,�3�8�80�+8�,�Q��G�c�ғs��
B^u�˓����騞&wkG>ր\Z�PQJ7g�2$s�$
=N_�u�P��*�*�<xѭ���!/;Y*�]Y]C�8]!�4^��ۥ��[D<A~`�N�+�pJ��\q��ʭɂ��e��Z�5��u �T�=�##����q�mo�d��7ŭ����ެ��WdT��:�=�%7$j�Z E�j5+0����_�]g��vz�:�izxy�X�4b��t�/��h�*s&D.�Qf)�v�c�&��1�J$�k�Bx����,�\?�� ������D�inV���x_�v�����H����gP/)�ݮ|����x�g����>����7&�3��k }GT��[fJ�%9�R���j�{�xj8A|�6U�mk�+��;�X�^n�ѩ�[�K0����O����2!�"l�$�&�P4�D¬Jm���H��9kҼD��b��a
���/8k܀8@~�tm��e�m��S��rpQ�8�	�ctt�Cf%w�HU��Ύ�oP�__���v��<�[���.���H�F��T�-��*x�30ւ�2w;6V��%�����z�>me���GL���(�϶�q�������q�G�c��h�=E-*P㮂/�I�Jtg���3e��bzӵ��3D�q�S�D
�Z(L�C5�K.\B���C%�w_ـ�j��~2m���x=�4�Dq��]*�<���is���Ӷadd��.��얝�%�]-z��0kn�҅�鮔q�ζ�k�o��������ݰ�vFP�<-�(��;����"2
�+�9��ݥd7����j,��y�*5��.r�s3�8��{򹏠\�*���u����n�q�a˳�DLZ���#MQ�v�bə��m��҅�c���@%�~�|~�c�������UG���r(��3�&f��6[�|�)
���گn�l��ϳ�<�˼h��=U���X#u��3ݔ����)���(T��}p��I���^
#E�V������t��Y����>�i2'z��T� �!�w�y�D�k7_sq����(�GQ;6���zq���٧ �%z��7N�,�<i��ݥdb���$U�ሧ��S��o7�H2��f���n�񞗮ui+��g@�ӽW%���`Cn+3pe����j�ta�b�F�/8��'�zf����e8%�̀���($yv�*�gX��D�����E�G
^��MȻ�fR�x�SE�M����S�cs<���*r�P��ٚ<A?Zϯ��;�Q>����G[�v۱T���G��.ٞ�(��m��̽p�uɚ���OVDz�:JI�ƚv��%`�T��P����M����}�?��'4����]��/=\Gcsg���[�%dw�ZAO+v�)o��w�o��餺!&Q2ߍ���jXwP.�B�75��U���LAX�W-��o���
�-��1u�W�[��M�d(ͺW-� V+j��(J��`^u{�_h��{Ac����A��9B����>����d�ғ/��i1��ۊ��f�1�l9�������iϸ� �'Kt�i�I��^�
����ob=���^u%�mNS�[ν��.�cz�O�	Ƙl��(��q~�k�˜(���_��o���`Z��Iv�I�&��+C&"�S�������۪o�o���:�n����cȦ3�O(���nΪ�?U>�E_�#�<��m��{�Y����`K�N������ց��*�]j��0A���ʪ'���gx7���S$�ĥ��!���t�R��扡5�{T+^-����_1�s�{:H�(��>α�rz�ƃ�h�e$ŝ��*�_u��ˆ�����8�>Q��oY��D<Lj�m��0�l}Uk
>��s֌�h����>[ʭ":��駘��ϧ��塢}���5���r���G�uI7��h�ES5[�D�Q��k��Q�{�T�R��ͅ���Yd��˛n夯Ҏ
sx�є�d`�������څ�뤋
j\�M$k�T@x��}�>��j	�����]2K�ޝ}�Mn95IP+k��'y�8��X�=T�3���]�m ;S����ܘ�6a��M/��iC�%޿�~Ҭ6��g��������<
����~��(O�+��?Nܸ��^�VM�t_�wS}s�b�����t�ǃ�Ȑ�CG��{)if�ejm:[$�@(��5*��R&��O�r��
P�Ď:�
��}���(��4^#�I�M�M͓�9s�+;�*ME2]��t����E�o�ح�����Q�!	��0���kBT|�,w�m���6ރ[���9p��Vb�;Nͣ=�o��_w��W,f�F�~f�c^�Q��Nc��ݑhvc�)<�qh;�^G��6ȏ�m��oYM�]7A��O$�O0,j�[��zC�Aڶ�ھ9]�[p�����^�
H?��s�(��z��o��]��j�E�@9�bע���w�2�Y�H�p,}�����=�M�����m��(�qR�;��ӡ��ގq��]�.�nth��5�{+J�A7VM�is�!�uhy��%�ּB�R��(H�*���U�ݘrP�Z�O\��cjfp�q�LS#�{l������Hs�u�$�F�(��F�����}M�U�(L�>"\�qgU�GҶZ;tΥ�)�ȤNC׏kv�(�	�H�[I�>����~ �;�ʹBi�#��au
}��Z�r�,���v�KX"8"�^j~�G�l324�0���)��ú�#d�k����v���&��Q��.�QC=�q�*��0y��9���燣��2�?�׈ ��\������|Q�o��4���V#�pv�,��!�����|ML���r�x��. 
�޽�[] E0Z�ɷS�&-RxY�k ��DW+�%!��=�)��/��ք�EE&�O�9+ЃR�7���K��W�x"�V~<QI&;v$[��̄�H���
W�Q���א
��x"��"��Q>�k�:!Wq� �:B"w��u�;�՞�B�0��eҫ���晽��9g�\l�K������Whw#l]Lj�@0�f���_������<�i���3��-���-女8�Ud����N�`�u�Gӿ���v�'�����:��G��5vtJ��d���H�'���T���L-�.�#|ݣ?�����ϖ<]�T4�z1�N&%[;@�FgsѦ)vHw��~v��#��k>�6ҫ��T�(5>֢}g:��ܰU�A���/�T�(Yt)Z3a�-\��$2��j�V�ۿ�k�wR�8�HWc$���0�(PkZ�g�]^�\�a�6C	��^��(f��L]_�����RB�m�<���i��i�'U.<�w�U��*۝`��yc�M�(����Ú[�v�V��0�q��2�~�l:���[���M-��y1�,5��y��r�c�
aJ�5�	�!T��y�Hg$p�jQh1G�LRK��j��oȇ!^u�ԟf�b�Fڋ��<'S���A��Ň��0�g�8E:������O�@�>h�Dy�y��x����g%��]�{�8�xWPjžv>�k��vM�(*<{4�z�n���4�Ƈ�(�mi�>6+�~�]u��
���P'L�m�@�Z��*��z�Ȕ�==��q;��f�>��U�
�^5����G�ǣR��+k���(G�tnX�HE�i�Mk��k@��υ�lo&�I�	o�����E�C\.�e��v��
���(�ZH���˾�UR	w���ᰱ����p]$^s=/OpD�2!vt�CeU��,��S�S	i���$�>w'M���~�l#6<֢8���O�#��Ȕ����{"������a���p�1% #=�1���=}���V�6(�����������ے���{aΒm���{b�:�K8��g4�2�=�	yu�O������I�yY�T�0)�G���@Rz�t/��:ӻ��
�哟�[�x63��D�*E��ܷ�1�k��<q�(�"���,��X3��h��y��g:$.:�f6/h��~t�3�GU���JBM��Ү���q���j��Ń�+��:f������	$�G��t\����:�B��
�������M5$�˳{]Y}�`���ñP�|V9��B*���ʓuڐ�8�WM�mغ^ͦE��A�Č���X
-4���T�wtmY٣��n]?�s�&(��{�]����4��Ϊ7Q��0f�Qo�ch�Gk+eA����aݬQ��N�і8ʍ`l�{D/Z��Dy��D��
u6$J���W�?�?C��$�M�����ޱ��<��.2ɚT'�ْU�����@�ۉ�/�S�~��Ƿc�i�Z��#�v���/��@�-��������r�z�m?c�γˤ���(�m��&Z�1�;�NҒ1�?�B���i��o.󙚸I�t��9��g?)�O��yn�&�ʘW�¸w#5`�.$~��٪�[��k�dž�o%�Mx����M��Xf+h�Q�5sD^���o��B^C���`M-�׆��T׻�T"R���7D�v�H����5�`�
�^���[�����{Z0�<��$���(��-�����~��B���ڑ#�y^��~v�N�M�G��\��u�D�ZR�u��uk��0�V���oo��=�"��֊*׼^P9i4$�OwS�%5�v�)��a\�/����Q��^�j��q}6#�vT�P�lw�������W��F0;/[��ӣ��]3�U��8E�IJ`\�,��(�暲2^5aa���~�n��h�y�9�B?��vn��xn�l�mc�#���d��>[9K�av�)d�
�d��bd%��T�[0��ѫ��:E�	8�� ��
�.8G�]2ip$��,�0%"K��o��_�h��ϕ�n�W���õ�z&^>�t�M��ρB�"�����_�GOȷ�:em�/h��R���þc	�a|@	�X	�8X,�n|�ҿ�I��7]y�o�5�.ۇ7{�3ܞ�W�O�C����TL�T��?b
j���.�s�E��l�V}׹5o��4�(��]+�O�V��=�*\o���D��qZ������I�,f���9ҡ�8\��VX
\AF!~'52��d��_�
�k,��U"�w|e�(�]�I?+î�SZ�Ց
�!*�MT}�	��|t�V�_G�߅0Ry>�l)�:
aV�ލ��ڻ��v��Qg	S+�ӣ[�j�y4<�4�v8Df;'�D��e�;̺,Yv��'�6k�f��T��F~�៎)|�h~����\��j|�1"M�].��hlp�mȷ��_�5m�뮪V�U�yvW�&,&=�������F��\\�	�'���Bܪ��2����F뼟'�͐�����9;R-O2d������֦a�q�V���^�Pm���	�T.|4�k0��,TE�m$�UaÚ�^���^�	��֏ލ�v�_ܾ|h�w���\��3�q��koAL��@��+Ѵ�,]bv5QX�!�����-_����[2�~M�5�Ur.��w4%C:��ܲ�do�_�!i��ɿ_"@l��+3�6����Ҍ�;x�P�5	��M'���Օ����R�9�r�sr�W���	�N╿��{�L�`uʣg�u�
�ǘS���R�	pu�
�]�����mU	�y���f�if*}����u�yV����F���".=؁�����q�`c� {C0:��[s&�C��g�{��X��P��k�@��!K�`qv3�{(��q�A�5)>�EЬf=q�%�tٖ��e
������p��Pb����[?��{$��>z�
�캽����(F��,��ya�krL�},Z�Yc�Ԡ~-�إ������o��
\���L�+(�~|�3����9-=0��O�dׄ
B�tyA�W�'
�R�6��u�(>ӶMK�UP�u�{{�f
^c)�o�����d��r���8,
���&�9������於l���N��
�߷���_�5�ox,�eu��ƍ�#EX�#v���Dg�<Rp���l��MU�S��*�0t~��2�=��NV�V�GӍ�ؙ"�߬_?������Y�Dj�ח�e��Bj��_� r��td��g�*�?��7����Z�Z�(G��V9�s'������!�ƿ�m����l���c{ų_��<H
E� cx���.�5}Kۥgk\�g��O`�w���~{��铰 ��#��D�
s!���h�kOzJd�ȩԺ�ĿL��D=d��b����њ�Z���4aɹe�n�
�ˤ��l���a�m���M�Ţ!�Me�`�t<z�a���`�&��?��(n�*��ŀ���:v�-ר�H�%[Mh�
���g�#F�5�6�@1�J����mN� 7��B!�c�=����8�2�5tBa�g~�����K����M��,aE�l�f[�qa������h�
�9;��o���M��������l��>+~����ԧ�"[we���?�O�w�����Nzg^�v���ɛI�|R�X�D�>� ��Ŀ���{n��A2'����
�j�^"A�;K0>t�>�ǀ�6�3����_�4�R+vF�E�1�%���&��l�O��
�J9/}2fR�8d����=J�V�m���J}`��o6P���Q��8>�!���hg _S���}�,A�%�Njj[':#q��w�d�V-�w0H�5R��v�A?P�n���4$:0�ğ�]�67xT���e��@����-c�:�~�zշs��3���d^i�{�c�E��!"�4������zB+�@^;�t<o�s++�ǐf)�TA+�Z(-��s���iT��w}�!��u�
���w`/��Kum�A�3Y\���N�J��6\@��nPmb�l �������]�+]|jrw�$�T�Dv�_d�r�cXy�G��ϧ~���X�.$5|UI�}A�ӥL9W��G�;T�j��?���sM�����O�[�9�1�|.8.j�3��l#-s��#�4]�V�I�俍��.�(�M��{)��A94Pp�0O�l
�e���uh�h��-a�¿JO��`A��Ĥ|�ūYۘ7�Y�����]����*��$5��Ĥ�um�W�w�?����5f�4�2�{�z����i�K3�;t�P5��;��&�M$����� ��nK}�mb,�t�,���,{��0�!Y��xݐ��A���}�tZ�%���R�p��>fe�h�$�=�����YM��{��l�_#�ᝠR��~>�"�;����η�Vno���n��p��ȣà	;�)�!�L��,Z�}f:��,�OzL kN���A����ѯ�rN�4����N"�+PX�O�{	�q�!�?�y1"[���!��
T����wt�K��l����s�ru.��9���"�MZ�s�v2��w���\��i�?�#2'��Ԋ����d>�쉟��2�C�f��ԈF���S�Q��χ�<+.=9�� ��Ġ�A~�4��N��L��$�nګ"v��i킈�s�\-���l�"Z-�ˬE���1��b�S���쩕��������r?�M�=*r��=��6��[B��]�n����ܔ�
eF�~�0t��s���/��	�E�k+��0/���gʚ�h�V��p3�A1��M�#�^�iҾd�q����T���^�P;�;`��r=Fꣵ�?�:���{��f~����F�
�i(W�#�$���ڍݑ�B�ݗ�:]C���)#��#g
Y˯2�s%����	ΣX���ē*�%��y�蚷pǏ���1��Z>ƈ� �^�A�j��J�:�TV�+
.^����{Ȗ*v@���x�����Z�W�a�u��"�]��Df��4�*�75��x^2뺫u��勿��ʆ��cN�s�?���B@7����"�.�}�`�����,�1��m?�pZ�<��2>L���Z�l8\9+�o�d��~jF����>���N�{(�i3�1~b�YR�������T%h��%<>���}�%m�:��V+�\"�[.�,9ы[p!8���>7?:/T���UFI�U�|۴H��s�e0ɱ��_�[]g����s9��W/?d:�8�<��)��$p{r��p�O�a+�I����Le�G�EUr�O?��~�bL;��y�ԉo��y�k]�>ܷM��-�qzB?�y�	C�U���&L;l[�dt��"M�@g�X�]Z��A��~��Q(e1+s?-<����3H�QV�3F*ͭ����W}<m0�����B��7���w4ըi����n���;0�1��	���8|6
�j��Ȃ�ms+n�]B�B_��:"������g^{�Ă5�]W�?+b_&�����y�j��-�`��Ɣ�ȶAxk�i;�o�+$�E7�]#O��/}�s�w�/7��	UN�c����>&�������/����>���K!� s�O(�+�+�X#h"�g9��Wv@�YBJ�#��P���-�[�y/��mvnE�96�2�_jKe<�đ�I��t�Wa��������S��d;c���-6������V�s�y��[�G��{�?:T~�?,c�D��蒔��l�^��ǝ2��8���|�"�w=�q*[P_�/r��q����m�y�/����H�G��ҝp>�4�)Q�e�f�5��u�6yNz�a�wN>}�@RX�W�@
8�<mo���L�f��(�A?L��1)a��9\q�-$��%ug����t�x,�B���y�!�5��?�rx�ܾu��`�äh�P��'C+�����<��'yJ�&�s�����A���	!'�ѡ(-nq��ʴ���+��D�7F�kb:nP@~�vA�l��ن\�j	�=bx!�WoKGw,|��P��M�(�5�{?���r����K����>�-�VnH'])���zVu���G�[�����P�Fz%$ÊU��ny�t�zr�B@�<j��G�c�tVJ9`Ǔ�!�W_<C=nIf_'U"��?ɼ���u9%?�_�Aꡗ�HR4.H7�@���=CT#��)��;:��>r�3����.pJ�i���P�"��.եO9$
�:�{_R{�1]�,��)�0�v��<��YDU8����2��1�Թ��
a���A^�I�
�O���ɾ�A���׬4�i���^��9���+{Q%�`֤i��7�‘�gA|�Y3���8��,	��v5���z��~Tv7Q+Y�)|�1k�N��g��yt�Y�(*n�e�Z/	��c�n�#�JF��  �#�����֧ԥ��=��J�g՚]��r���
V�ʙ��������#�'(����#w�|�o�RG7�Wg;g{b����A�`����}w�7޶�r ~,(�~�X�D�8�([�{I���
�(?�:���ᾞ��)z�2��R��%�z��w��kB������t$r焰"��T�u���A������k��od�G>�/a}L+l���>Zx6��
�� ��/�?�-��ru��G0�9��t삄�9b;��F �6$�y��o�����xb�f�.
Ľ��T��r�x����]A�w����>f��?=��4�ɳ�d
�ɇ�Qi�On��ev�!!���x��?�)�8�����er�4�v���s^����մFm�����߭B�4/�V����쥮 ���x	�W�:�{�Ȉ7(��N[iM� ������m.���6IPh�5w�k��,�"K����\����D�[t�8��.����MBu��ڸ�����#�Qv�r?7�k�s��Թ���OsNʺ��n5���<e�uQ�,jq�V��W_މ3Ǎ��}|�;k�a}�;���UYP&˷T@���ڃV&}�C��
� AݲE��s������}s��
��OBy����HJ*��=�����Au����h�����e���?c��K9�{B��
Iu;�ҙ�ŗ�n���Ƣ:Q�l����x�0�!��_x{��)��c4�-a��`Գ�����!�Adά�v�=��h	��O���=����˱<�pod�!{)��1":�D�1:4������(�K<�M|���F*�UX�٫�jH�^�S��P"άq����4�W��J	�gv�Yi*�g�'3ug�ӂ��t�mޚJ?�<�f�)�G
|���"�Q���:��2�spL�)��|�y�B�xK<��W�F��S�~�;y;n�%��;ݯC�o�E~M,�ˍ�F#�
i�S��FE�����W����t�?,���^V`�
:iQf��i{/���7��3�;���k3�NE܀�����k�{ٿ+3ϥ�hg��~M�x�i$��w��
z�@����58��S����x�4V�f'��,��(6�@�&f8�q�Z����G��{�TG���Im��J��׻�N�ri��o���C�����]�_�c}Tj�� �s��{�2F���QZ�~��V�EF�O�%T^��8qa,�Ɩ�H�EýA�����1�ɪK��=�9����#:�,9�߰d6�p��F�*s�d��;��P��nu'�念�;��!@\QM.�Y�S���2:�*q��˱;���-�g����������~f�5�G,>��f�f�$��e�:�GeqTXA��.Шoc��sRFKb�NZ)%� ����]F�u�G
=R������=�~�����"��1L2FQ��dp�1�vI��;��'
T�c�q������
��l�v<*$��J�b��Ͱ�y[|�5F�5UC����!��[ic`pp1��I��)"��kPy�08���v:`C��2@�۳MG-��2̥��w�M7�^|X@�e%!/S�z6�DN���j|�a���.2���v+L�1�M��a�8���'`>��ʹb�Gb��!}ht��UW�c灚��<��i�L;���������(��Y�eѫ>Q�� E�;�|�ˡ%C'��$))ֳuA47�����/9���3�#r�P�;��'[���*����
5��t�y�n�L�3�uŧ
�т�vYXs��\��W'��yMګU����16����޶��&{מ�9����R3nb~�‡�k_�f�`r��y�T�:�k�Z����p���l�4�剪��嚇�Л.�&�/AT���x:���n�D�ЋԈ������LܐE�ȳ
�|`>�>~NVO��b@Do�D|��-/e�=��u���j��GG.���R�C)r:Hݟ�k��҇`���%q�.�%е�3����|"~k
K�;t�&*ieDR�X����a��P�CL{'>��R�rd"ϲ?��ұ�;H#�[��)_HUT��N%)���`��<�p�q��5t��LiT�e4�����֤�����wB����L��?��ϓ�/����pp���ʨ�iܟ�G��4��3��ywF�l��s�]�A{a�eܝBLR���n��Ke:\)��.@�	�*T�F��~�S(G�����j�mb� ������A�:<��$>s�+N>w�b��[����飒\�S��WePSiv���Km���/��v¯�FiO;/=e8Bi9�oz�nG,��pW�Ǖ��z�?�o�^9�b&�^Yo`r�cۓQ|�^��Ёר{����6@|�j��G��ө@�f"$��\��r�Pg�.IR��<^�!��^����_�9nտ����)��{�u�s�SqcۛD��/`v�,�\��s�_Z����7R�P�å)�����~��Vv�7�Ciu���lM��S�k�?l��&��{��^�؁$4�V�����6Q)��$������޷�+|A��H=NH�ϲO�5��P�v��EBz#犨�
�?����7�l��$TĹ��!�	a��`��/"���.�NT�B��Dl������H��I�w 3=��?j���S*���a!�l�-0d��O�����G��Һ�!�DI��V/�0�/�X���"kJ���ҿ��$L��\����d���C�m�bO*N�g#K���Ț���\��6��|)���Ls\3�vA���WK䌷�� �_��Cr[5p4���k1���)_L����V3K����u�C]qZ�[��<W��7�C��V'������*���{�͔��@s����i��¢ǔL���.�k�K.U5
��	��&Cw�;0�ޝd����B"oSR�2�8���0�zOr�c�th��3���\�4Y\˲��+

���ͼ�R����ѹ�z���f�Ƶ���RSw`i���X�s���]/ۉ|d>5�?Ƞe$՛�j�9��4��hbG��f.��Rᤎnxյi].�$>c_C!�V�N�#��Edħ�R8���
�ۇ����"�棻������X���((΋�&���>�4��{p�J�sC��ã�|5��A9�����v�Kj(������x�Ez]"N� �.��|��_�G�繶P�
��J
Y�SMky"�g>�=�$�~�w7Q��B>�P�(���G�]/�;�,�,�Ɏ�D]��(�c*��-�����c0�Y��i�u���nP�[E%���=z�g����J��	�/��Y1�iB�SĚ�}������9ƂG'��Å�ƪ��d��Л=����¤f7��?�7
�(�(�w�?}�CY�����R+�z�U�.̮LL�R_��{�w룯s�Wc��_�0����9#�,9�wr�&hmyR�l���M"2Q4�i&)�W!}�TԹ�=~�`���d!a�o�-&�#"���$vQB�{`���T���v8�W~�R�~��]S�,�p��[_���h�Y��w�`�m��;�E�-]k^T����~S%��w|3��#`MLQJ=�n#tc�l�Qf�h�.�-Y�0��R�wv��5��3�Z�t(�KI��ܳr"˱+ώC�8��5P��E܅�Uϊ8�x4�l���w�����r��&���Q{�gn�v"K=��E�}��R'.����5���=C���=n���e�'"Yc^������~���޶'�����8���@/�5;�p�A~P�<�n�e��
�/8&���o-`y�3�\&�.f��/������TX�$`I�[c�`���J�O:
��`uT���\:}GuVӍ�b�\aJ'�b_�v�B����~��ͻ�o��=�~o��p�U����^���X��eH�m�QG�>3�<⷇�8�&g^��$&��<�.���#­�4MPv�>�`_�<a��5�����m��'Rk�q��ml��9����24��q�y�K��/��W@=k��ˍD6���֡�E�b'���#��`z�C�/���'�h6h��k!t���T� �\�Ы�}���pp�tpc�
�ם"�'�o��>Z�|�.�N�%�(8^�z$��S# ��3�6������W����N;�&�X����aKo�K�J݈;��3M��xi���>�ß�n�n!�T}��9Χ^�0q�~^\�%�ł�.�~�{o���
����[���'�-l7��Htyr8���QA"��Xw�˭���_�V�J��|�gR�7$8�4�V����J��]z|zt��tD��>n&>�4��;��b�A�t�T�I��(����8��Z���9��Ww*�n=sF�F����~�jc^��a���2��J�bCpm �[eɷd�ܺ��i�
�J3g1�.Fw��<��sCO��i��@�	�g_b����ՑQHPp
WvwC�4,e� ����\�
6I�Έ5�����;��9��+�F�1�.�����aP�kC��R�@�?�P�A�U�S=�~���5h��L��'s����,�z�>��y�;����i��;l�΍ca+�����+AGӲ�:�4�	���_����7%K�⚄&�\�����#�rgfJ�Q9�TL�À�|��
o��r���� \Ez�\��f��;ν3`�"�͎��D��f}���H����7��/̋4�<���O)��ph�(�ڝTrw)�	eZ*Nj�A@�G���H�R]CwP���V<��Wەm��,��-ž���� =�����N���/�^��Zֺc����L����39�p�-�����L����B�@�����=����^����^��PG��$Q�⬻�U��Ϻ��lga%[D�c9��e�N�k�Ld+���VC��W����8�
�Z]�Y�v>�&�|Q�	���n�Ω#A=�#�ڲ�u�|S�|�����:��&��iɍ-YWEMN��Aݓ��fj���G��Vh|2��3Y�6}(a�e�����եdRD)F,���s�b��ς����oy�,��"��<9�)1���G!Ѡf�0���1�^2��{c�w�<���.N�Rb�&b4O��e��.6����٥�F�q���,r"m���|l�a���^�N��#�E�jm㣁�Ǎ����!�ZՖo�A�EVi֗-�d���s��-óH["�"Kt�1���ϑ=T�=m�l6/wh��.M`ˆ�=Oս?��(��ct���ʺy��}�᥂�k�ɯ����~�LA�2�#7��&;ۚ�۔��׸��]�46�s�;����o��a��;mox1l�F�F�^Hwܕm��n���k��
�GX�����D<&Ӷ�K&:�'�>{v�a��<��ĺas|ws��>���K�32쾜!_��NR�MLe�)��XU���&v�,z���g��{�U��1�
�
�Q2Я�:qR�U�}6c����e��!����ڴ��T�/x�:�6�H��rMK�!�i����q��z27�ZЁ�T�}���B��X/_����r���-�`>�o�+oe�3/��+{�U�Ab.��|�I+���	pۨ򍑡�$H|P�h����9�&ܒ�D�؋xJ[��f��[�������V+ɛ�z)�~���͘�4���TW��;�o��(Ho��t���v�;��!8��xjۓXּ:В�Q��U�;ԧu��Q�Hm�1����p��A�H0 2����9K�����En�6��L3/��3@�t��{=�\I#X�
'�Vl�4�n|~����}�u�К��9u�a��o�&i�@Ed�����g8����I��`($�IL:��6�A�$D7�=	�`��V�˔͏�|��P��"�A�%"�E%�w-�%5t�V�2�$�^�+�L��%T_�?�Cߪ')3N��K�R{H
�I��%G�"�K2*�i����h��
�����0�JYV�?��cD�����}fX�h ߯2�A}0�9J���=��\��&�z�| ������;�=.Q\j�@_�D�A�2�TՂ����x'�ʥg:v|a�T$Z���s���yo�ո�_.�q�
ɜ;�ydcm�h���������0	
q"��ry-��ɡ��Ǩ�;wd0;��1<3�i�U���4ۃ����#�`	rP>P�@�mn�{\��.��	~��,�=F��n�ֱ �:��~b�~IݲQ0��7�9��.�����qZ�^X�i��t�m0ilbÌ$�g�NI�T��
�Y�,�S�c=G����>H��k���h��\!�7	��l��i>�1o���I�=XLL��7��#�m^�,��Jƻ>�xׂ`�G�
ABè>�:b3I��zA�����ݽ�ߦj���yj�EnB�{�ewQ�rSIWi}&�d#���e3.#�?���U{��)U�޴��Z\��az4<~��4	�t��jcdo.�3��_�_�T�p�7R2���<��:�F�	�./�k��TE�ZVJ�|��i�'�z���������(ѣ�\��㍁ڡ/r5��rD0�"�c��`X�����ۈy5xy�?U_ѰHӰ�{%l���'�n���8o�S��z�&�������n���	���-��>=B��߶�u�f��`�N�E�7Y���ŵ�=��Y_�-ϯw#��<b��=D�2�c1���S�ˑ�`/i��������𥊩�v��~��� ~]N�k�W��ԳQd���B�֜�.�����+���x�r�~��d)��#p��h�Q�9��{�Z R�.��0x� �`ȴ�埉%�����/8�N҈0�pL��["���i�S/% ��~��9俇^C�w�%�š(�wy�b�B�)���
1�B�!�՝J�^��!�	���ISvUg6O�JW�ѱ�Lh؃�'+2<�W�=�Y���;�'�����xk6����v�8PEv�h���s�C�K�YV��yX�z���"�=y�;�:�ge�X9 ��v5��y�bGAf\ߗge����;GQ��g%}�>�U8��"f^8F �d�ws
w�y�^���/�oDe'��
���c�t�E��/QZ��2�j������֯�m����&7���-�2d�E��F�����^[㾄6І|&|B��������&!��'�� °���Rp�G���Z��d�Wu+��~#�;l9�,Ϛ�;�%m�HA<�3�g��YUy
7��w?��Z���U����T5���*�%jY��fP ��aw$D���f�?P�O��ƺ���Oo�31��c"!GP�#"+(j�ʠ�G���
D�`��}����l�▆�\�w�l2��e��a��yؘ��wQ�!~��x���5Z���!����j,r����me��v�d،���5yB���4O���}��2Y6�\_�9���0�H�w�z�~䟠�����i(o�\��!=2g�дz��!�����}怡?���]��C\���k��P�g6��e��,�T��*�k��7�xf���^j��G�k�ڻ,�a>��kw�p)nS���8�N���[5��M���G�jn�U���W�k���Z3�eT��,0�z`����Lcź$����i8��z�ȮA�{���������ۧ�
{��ԑ�z�+��#�YR�*�j����p� t�.���̣9�b�z��א�Qm�e�/N8l��N��#����d���/�iA�Re&_�����~�H�~5Iy0�o�X;����M����`7l$���F2G��Tv�e{�V�_��y�.D���D��{'&�p>�S;�^S{|�n�9=�@��,�ۏ���?PK�yVS�:4@�e��pip/__init__.pyPK�yVS#�m���%pip/__main__.pyPK�yVS��5����pip/py.typedPK�mWb�=�_K���pip/_internal/__init__.pyPK�yVS_4	��&��?pip/_internal/build_env.pyPK�yVS�Օ�$���pip/_internal/cache.pyPK�yVS���Z�a3���pip/_internal/configuration.pyPK�yVS�yfl�1���-pip/_internal/exceptions.pyPK�yVS'���T��'>pip/_internal/main.pyPK�yVS;Ւ�@	/��B?pip/_internal/pyproject.pyPK�yVS�g���$���Hpip/_internal/self_outdated_check.pyPK�yVS��_���/���Qpip/_internal/wheel_builder.pyPK�yVS�w�4h����^pip/_internal/cli/__init__.pyPK�yVS�p���#��S_pip/_internal/cli/autocompletion.pyPK�yVSv�	n!��ngpip/_internal/cli/base_command.pyPK�yVS�I�Di�n��eqpip/_internal/cli/cmdoptions.pyPK�yVS f��)�$���pip/_internal/cli/command_context.pyPK�yVSjYd|��	��v�pip/_internal/cli/main.pyPK�yVS�o6
 ��=�pip/_internal/cli/main_parser.pyPK�yVSñ��$*����pip/_internal/cli/parser.pyPK�yVSs�O�
l "����pip/_internal/cli/progress_bars.pyPK�yVS%�߇�B ��\�pip/_internal/cli/req_command.pyPK�yVS$%������!�pip/_internal/cli/spinners.pyPK�yVS�zKXt!����pip/_internal/cli/status_codes.pyPK�yVS�ACv�"��~�pip/_internal/commands/__init__.pyPK�yVS8��~d��4�pip/_internal/commands/cache.pyPK�yVS6l�1�����pip/_internal/commands/check.pyPK�yVS�qC���$��]�pip/_internal/commands/completion.pyPK�yVS�җ�	�"'��t�pip/_internal/commands/configuration.pyPK�yVSZ]��������pip/_internal/commands/debug.pyPK�yVS���m�("��f�pip/_internal/commands/download.pyPK�yVS����� ��7�pip/_internal/commands/freeze.pyPK�yVS�������6�pip/_internal/commands/hash.pyPK�yVS�Ô<�l��Upip/_internal/commands/help.pyPK�yVS-g�����{pip/_internal/commands/index.pyPK�yVS`�+`�l!���pip/_internal/commands/install.pyPK�yVS�X��>�/��)$pip/_internal/commands/list.pyPK�yVSW��/bA ���0pip/_internal/commands/search.pyPK�yVS�BI��	���C8pip/_internal/commands/show.pyPK�yVS/#���
#��rBpip/_internal/commands/uninstall.pyPK�yVSwy���LGpip/_internal/commands/wheel.pyPK�yVS�u
.;Z'���Npip/_internal/distributions/__init__.pyPK�yVSh
����#��Ppip/_internal/distributions/base.pyPK�yVS��r]�(��RRpip/_internal/distributions/installed.pyPK�yVS�J�w�$���Spip/_internal/distributions/sdist.pyPK�yVSP�h�[$���Zpip/_internal/distributions/wheel.pyPK�yVSC?K� ���\pip/_internal/index/__init__.pyPK�yVS�I��~D ��']pip/_internal/index/collector.pyPK�yVS��W_"��%��-spip/_internal/index/package_finder.pyPK�yVS�+������ϕpip/_internal/index/sources.pyPK�yVSők��l8#����pip/_internal/locations/__init__.pyPK�yVS�ڝ{�%��6�pip/_internal/locations/_distutils.pyPK�yVS8�z
�%���pip/_internal/locations/_sysconfig.pyPK�yVS��Y�+��R�pip/_internal/locations/base.pyPK�yVSs�B|"����pip/_internal/metadata/__init__.pyPK�yVS.���_+��(�pip/_internal/metadata/base.pyPK�yVS	/3:<�'��k�pip/_internal/metadata/pkg_resources.pyPK�yVS{�(�;? ����pip/_internal/models/__init__.pyPK�yVS0�Oy�!��e�pip/_internal/models/candidate.pyPK�yVSU�=*��"���pip/_internal/models/direct_url.pyPK�yVSb�ch�	&���pip/_internal/models/format_control.pyPK�yVSߗ�������pip/_internal/models/index.pyPK�yVSZ0tT�Y&����pip/_internal/models/link.pyPK�yVS��l�����pip/_internal/models/scheme.pyPK�yVS W7L�$����pip/_internal/models/search_scope.pyPK�yVS�����s'��!�pip/_internal/models/selection_prefs.pyPK�yVSQGe�%��5pip/_internal/models/target_python.pyPK�yVS'�TA��
��7pip/_internal/models/wheel.pyPK�yVS�J22!��A
pip/_internal/network/__init__.pyPK�yVS�=.RJ
�/���
pip/_internal/network/auth.pyPK�yVSG\�A84��7pip/_internal/network/cache.pyPK�yVS/�P���!���pip/_internal/network/download.pyPK�yVS�w���	�#���"pip/_internal/network/lazy_wheel.pyPK�yVS�aݞYA ���,pip/_internal/network/session.pyPK�yVSӏV1�����Bpip/_internal/network/utils.pyPK�yVS-�{_�����Hpip/_internal/network/xmlrpc.pyPK�yVS$���Kpip/_internal/operations/__init__.pyPK�yVS�ͯ�"�!���Kpip/_internal/operations/check.pyPK�yVSľ
'
*&"��ORpip/_internal/operations/freeze.pyPK�yVS�:e�]#���\pip/_internal/operations/prepare.pyPK�yVS*���vpip/_internal/operations/build/__init__.pyPK�yVSY0��_*���vpip/_internal/operations/build/metadata.pyPK�yVS��j��3��>ypip/_internal/operations/build/metadata_editable.pyPK�yVS��
���1���{pip/_internal/operations/build/metadata_legacy.pyPK�yVS�<F�''���~pip/_internal/operations/build/wheel.pyPK�yVS����A}0���pip/_internal/operations/build/wheel_editable.pyPK�yVS�ȇe	�.����pip/_internal/operations/build/wheel_legacy.pyPK�yVS��{53,����pip/_internal/operations/install/__init__.pyPK�yVS�Z��3��y�pip/_internal/operations/install/editable_legacy.pyPK�yVS�	��s>*��ϊpip/_internal/operations/install/legacy.pyPK�yVS��X*� k)����pip/_internal/operations/install/wheel.pyPK�yVS��t��
����pip/_internal/req/__init__.pyPK�yVSecu˔�;!��]�pip/_internal/req/constructors.pyPK�yVS'����
D��0�pip/_internal/req/req_file.pyPK�mWS��"J� ��V�pip/_internal/req/req_install.pyPK�yVS#��s�����pip/_internal/req/req_set.pyPK�yVS��2 ��5pip/_internal/req/req_tracker.pyPK�yVS����\"���pip/_internal/req/req_uninstall.pyPK�yVS$���&pip/_internal/resolution/__init__.pyPK�yVS�˩�G ��'pip/_internal/resolution/base.pyPK�yVS+��H(pip/_internal/resolution/legacy/__init__.pyPK�mW!4�_�H+���(pip/_internal/resolution/legacy/resolver.pyPK�yVS/���=pip/_internal/resolution/resolvelib/__init__.pyPK�yVS�"�Hd+��>pip/_internal/resolution/resolvelib/base.pyPK�yVSj�k�"G1���Cpip/_internal/resolution/resolvelib/candidates.pyPK�mW�����j.���Tpip/_internal/resolution/resolvelib/factory.pyPK�yVS)�Z��I7���ppip/_internal/resolution/resolvelib/found_candidates.pyPK�yVSU�-�#/���wpip/_internal/resolution/resolvelib/provider.pyPK�yVS�~p_�	/��'�pip/_internal/resolution/resolvelib/reporter.pyPK�yVS\����O3����pip/_internal/resolution/resolvelib/requirements.pyPK�yVSWc�l%/��ƌpip/_internal/resolution/resolvelib/resolver.pyPK�yVS����pip/_internal/utils/__init__.pyPK�yVSJx9?����<�pip/_internal/utils/_log.pyPK�yVSrB—���K�pip/_internal/utils/appdirs.pyPK�yVS�c�k�\���pip/_internal/utils/compat.pyPK�yVS����s)��>�pip/_internal/utils/compatibility_tags.pyPK�yVSl=�������pip/_internal/utils/datetime.pyPK�yVSжŎL+"��ͩpip/_internal/utils/deprecation.pyPK�yVS&��]��)��Y�pip/_internal/utils/direct_url_helpers.pyPK�yVS�#�/�%����pip/_internal/utils/distutils_args.pyPK�yVS[w]�>���۵pip/_internal/utils/egg_link.pyPK�yVS��a���V�pip/_internal/utils/encoding.pyPK�mW��_�^j"����pip/_internal/utils/entrypoints.pyPK�yVS�;[��!��?�pip/_internal/utils/filesystem.pyPK�yVS��O-X� ��e�pip/_internal/utils/filetypes.pyPK�yVSR�=U/&����pip/_internal/utils/glibc.pyPK�yVSPg�����d�pip/_internal/utils/hashes.pyPK�yVS���-��x�pip/_internal/utils/inject_securetransport.pyPK�yVSɓ]
-��e�pip/_internal/utils/logging.pyPK�mW7#�݆*Q����pip/_internal/utils/misc.pyPK�yVS;��w����pip/_internal/utils/models.pyPK�yVSf=�O~� ��opip/_internal/utils/packaging.pyPK�yVS�>S��|��+pip/_internal/utils/parallel.pyPK�yVS��>9��$���pip/_internal/utils/pkg_resources.pyPK�yVS9��0Y'���
pip/_internal/utils/setuptools_build.pyPK�yVSɘ��J'!��@pip/_internal/utils/subprocess.pyPK�yVS�E��	���H pip/_internal/utils/temp_dir.pyPK�yVS<�u�
�" ��`*pip/_internal/utils/unpacking.pyPK�yVS~��9����4pip/_internal/utils/urls.pyPK�yVSZ��'"�
!��8pip/_internal/utils/virtualenv.pyPK�yVS9�����}=pip/_internal/utils/wheel.pyPK�yVS/���/T���Epip/_internal/vcs/__init__.pyPK�yVSA@\��)��Gpip/_internal/vcs/bazaar.pyPK�yVS�_]�E��+Kpip/_internal/vcs/git.pyPK�yVS�oɩ�Q���`pip/_internal/vcs/mercurial.pyPK�yVSj�b�6L-���fpip/_internal/vcs/subversion.pyPK�yVSs1!�A�W#��upip/_internal/vcs/versioncontrol.pyPK�yVS[��'d����pip/_vendor/__init__.pyPK�yVS�,t�+����pip/_vendor/distro.pyPK�yVS#���+���pip/_vendor/pyparsing.pyPK�yVS���!����?�pip/_vendor/six.pyPK�yVS=�<
���p�pip/_vendor/vendor.txtPK�yVSZ���.$����pip/_vendor/cachecontrol/__init__.pyPK�yVSJ�y� ����pip/_vendor/cachecontrol/_cmd.pyPK�yVSGi�#����pip/_vendor/cachecontrol/adapter.pyPK�yVS�b�M2%!����pip/_vendor/cachecontrol/cache.pyPK�yVS��d�"��$�pip/_vendor/cachecontrol/compat.pyPK�yVS��omE7&��v�pip/_vendor/cachecontrol/controller.pyPK�yVS����	'���pip/_vendor/cachecontrol/filewrapper.pyPK�yVS�%m^��&��	�pip/_vendor/cachecontrol/heuristics.pyPK�yVS�ȽZ	�%���pip/_vendor/cachecontrol/serialize.pyPK�yVS�=����#��Wpip/_vendor/cachecontrol/wrapper.pyPK�yVS��07V+���pip/_vendor/cachecontrol/caches/__init__.pyPK�yVS��/�	9-��pip/_vendor/cachecontrol/caches/file_cache.pyPK�yVS��A�gX.��Zpip/_vendor/cachecontrol/caches/redis_cache.pyPK�yVS��U�@>��
pip/_vendor/certifi/__init__.pyPK�yVS/ ������pip/_vendor/certifi/__main__.pyPK�mW�L�����epip/_vendor/certifi/core.pyPK�yVS��f�w���Spip/_vendor/chardet/__init__.pyPK�yVS9���9z��#pip/_vendor/chardet/big5freq.pyPK�yVS��gf<�!��3]pip/_vendor/chardet/big5prober.pyPK�yVS�Y(==	�$'���`pip/_vendor/chardet/chardistribution.pyPK�yVS���w�)��0jpip/_vendor/chardet/charsetgroupprober.pyPK�yVS�aZ��$���npip/_vendor/chardet/charsetprober.pyPK�yVS\�7H�)���vpip/_vendor/chardet/codingstatemachine.pyPK�yVS�	Z����|pip/_vendor/chardet/compat.pyPK�yVS�B�1h?"��opip/_vendor/chardet/cp949prober.pyPK�yVSD��}���pip/_vendor/chardet/enums.pyPK�yVS�=5n ���pip/_vendor/chardet/escprober.pyPK�yVS�
`�)����pip/_vendor/chardet/escsm.pyPK�yVS 7��*�"��ґpip/_vendor/chardet/eucjpprober.pyPK�yVS�Aya�4 ��<�pip/_vendor/chardet/euckrfreq.pyPK�yVS&��8�"��ۯpip/_vendor/chardet/euckrprober.pyPK�yVS��I�3:�{ ��S�pip/_vendor/chardet/euctwfreq.pyPK�yVS�A�8�"����pip/_vendor/chardet/euctwprober.pyPK�yVSE��c'�P!��<�pip/_vendor/chardet/gb2312freq.pyPK�yVS~���6�#���pip/_vendor/chardet/gb2312prober.pyPK�yVS
)Ӳ�6#��Upip/_vendor/chardet/hebrewprober.pyPK�yVS�9a0�d��//pip/_vendor/chardet/jisfreq.pyPK�yVSy%jN�L���_pip/_vendor/chardet/jpcntx.pyPK�mW�t��˜)��	spip/_vendor/chardet/langbulgarianmodel.pyPK�mW?�]��݄%���pip/_vendor/chardet/langgreekmodel.pyPK�mW�c��&���pip/_vendor/chardet/langhebrewmodel.pyPK�mW&�QaL�)��X�pip/_vendor/chardet/langhungarianmodel.pyPK�mW�`̖(V'���pip/_vendor/chardet/langrussianmodel.pyPK�mWe�,(z�$��Qpip/_vendor/chardet/langthaimodel.pyPK�mW���1�v'���pip/_vendor/chardet/langturkishmodel.pyPK�yVS����#��<pip/_vendor/chardet/latin1prober.pyPK�yVS6uM�U
&���Bpip/_vendor/chardet/mbcharsetprober.pyPK�yVS���r�&���Gpip/_vendor/chardet/mbcsgroupprober.pyPK�yVSi����c���Kpip/_vendor/chardet/mbcssm.pyPK�yVS�rs��&���Xpip/_vendor/chardet/sbcharsetprober.pyPK�yVS�U�Z��&��apip/_vendor/chardet/sbcsgroupprober.pyPK�yVS֑g2 �!���fpip/_vendor/chardet/sjisprober.pyPK�yVSNjƃw
�0(��)lpip/_vendor/chardet/universaldetector.pyPK�yVS���=E�
!���ypip/_vendor/chardet/utf8prober.pyPK�yVS�l�����j~pip/_vendor/chardet/version.pyPK�yVS��2#��_pip/_vendor/chardet/cli/__init__.pyPK�yVSpW��
%���pip/_vendor/chardet/cli/chardetect.pyPK�yVS(��q�pip/_vendor/chardet/metadata/__init__.pyPK�mWzg�C��K)����pip/_vendor/chardet/metadata/languages.pyPK�yVS��kճ� ����pip/_vendor/colorama/__init__.pyPK�yVSR٭���	����pip/_vendor/colorama/ansi.pyPK�yVS���q)#��g�pip/_vendor/colorama/ansitowin32.pyPK�yVSoEr�{"���pip/_vendor/colorama/initialise.pyPK�yVSP��ܪpip/_vendor/colorama/win32.pyPK�yVS�(���&��g�pip/_vendor/colorama/winterm.pyPK�yVS]o�]E����pip/_vendor/distlib/__init__.pyPK�yVS,ӽ`+���,�pip/_vendor/distlib/compat.pyPK�yVS�@c��/s�����pip/_vendor/distlib/database.pyPK�yVS2�H��Q���	pip/_vendor/distlib/index.pyPK�yVS�Io "3����)	pip/_vendor/distlib/locators.pyPK�yVSx�5gl�9��k\	pip/_vendor/distlib/manifest.pyPK�yVS�y��}��m	pip/_vendor/distlib/markers.pyPK�yVS��=X�$Ř��'t	pip/_vendor/distlib/metadata.pyPK�yVS��Հ�D* ��G�	pip/_vendor/distlib/resources.pyPK�yVS��E�8E��5�	pip/_vendor/distlib/scripts.pyPK�yVS��m��H�����	pip/_vendor/distlib/util.pyPK�yVS��2�~�[��
pip/_vendor/distlib/version.pyPK�yVS���)����9
pip/_vendor/distlib/wheel.pyPK�yVS#�g��)��~F
pip/_vendor/distlib/_backport/__init__.pyPK�yVS��/e��%���G
pip/_vendor/distlib/_backport/misc.pyPK�yVS�9�Qkd'���I
pip/_vendor/distlib/_backport/shutil.pyPK�yVSo��9
+��/f
pip/_vendor/distlib/_backport/sysconfig.cfgPK�yVS�y룩�h*��nh
pip/_vendor/distlib/_backport/sysconfig.pyPK�yVSDBCbY�i(��_�
pip/_vendor/distlib/_backport/tarfile.pyPK�yVS��o�D� ���
pip/_vendor/html5lib/__init__.pyPK�yVSʧ-�-XA!����
pip/_vendor/html5lib/_ihatexml.pyPK�yVS�6=a~$����
pip/_vendor/html5lib/_inputstream.pyPK�yVS5�mO�,"��Epip/_vendor/html5lib/_tokenizer.pyPK�yVS�ӉI�C���4pip/_vendor/html5lib/_utils.pyPK�yVS[2&@HF!���;pip/_vendor/html5lib/constants.pyPK�yVS�����D��#��l�pip/_vendor/html5lib/html5parser.pyPK�yVS�s���="����pip/_vendor/html5lib/serializer.pyPK�yVS��]TZm&����pip/_vendor/html5lib/_trie/__init__.pyPK�yVS灦�#��$�pip/_vendor/html5lib/_trie/_base.pyPK�yVSKOn�� ���pip/_vendor/html5lib/_trie/py.pyPK�yVS(��f�pip/_vendor/html5lib/filters/__init__.pyPK�yVS����6����pip/_vendor/html5lib/filters/alphabeticalattributes.pyPK�yVS"��ĕ$����pip/_vendor/html5lib/filters/base.pyPK�yVS�?�3����pip/_vendor/html5lib/filters/inject_meta_charset.pyPK�yVS��d�l;$���pip/_vendor/html5lib/filters/lint.pyPK�yVSu�*�\),����pip/_vendor/html5lib/filters/optionaltags.pyPK�yVSQ�aM	i)����pip/_vendor/html5lib/filters/sanitizer.pyPK�yVS`r���*��/	pip/_vendor/html5lib/filters/whitespace.pyPK�yVS�9qZg�-��lpip/_vendor/html5lib/treeadapters/__init__.pyPK�yVSR�)T�+��
pip/_vendor/html5lib/treeadapters/genshi.pyPK�yVS�i��D�(���pip/_vendor/html5lib/treeadapters/sax.pyPK�yVSe�kLS-��Epip/_vendor/html5lib/treebuilders/__init__.pyPK�yVS>>h���8)���pip/_vendor/html5lib/treebuilders/base.pyPK�yVSP����"(��'pip/_vendor/html5lib/treebuilders/dom.pyPK�yVSM�ЇR
$2*��a/pip/_vendor/html5lib/treebuilders/etree.pyPK�yVS����9/���9pip/_vendor/html5lib/treebuilders/etree_lxml.pyPK�yVS�vj��W,��aHpip/_vendor/html5lib/treewalkers/__init__.pyPK�yVS!-�B4(��IOpip/_vendor/html5lib/treewalkers/base.pyPK�yVSe�o���'���Vpip/_vendor/html5lib/treewalkers/dom.pyPK�yVS���C��)���Xpip/_vendor/html5lib/treewalkers/etree.pyPK�yVS0Dty�.��^pip/_vendor/html5lib/treewalkers/etree_lxml.pyPK�yVS_m�	*���dpip/_vendor/html5lib/treewalkers/genshi.pyPK�yVS�x��Q���gpip/_vendor/idna/__init__.pyPK�yVSecq+}
��?ipip/_vendor/idna/codec.pyPK�yVS-����h���lpip/_vendor/idna/compat.pyPK�yVST�A:�2���mpip/_vendor/idna/core.pyPK�yVSv2o#n���wypip/_vendor/idna/idnadata.pyPK�yVS,�]['��� �pip/_vendor/idna/intranges.pyPK�yVS�C� ����pip/_vendor/idna/package_data.pyPK�yVS����y��נpip/_vendor/idna/uts46data.pyPK�yVS�'WX�^��/9
pip/_vendor/msgpack/__init__.pyPK�yVS1�����L;
pip/_vendor/msgpack/_version.pyPK�yVS;;�ӭ9!���;
pip/_vendor/msgpack/exceptions.pyPK�yVS���<����=
pip/_vendor/msgpack/ext.pyPK�yVS���M$�����D
pip/_vendor/msgpack/fallback.pyPK�yVS&	��e�"��$b
pip/_vendor/packaging/__about__.pyPK�yVS�����!���c
pip/_vendor/packaging/__init__.pyPK�yVS*:c��,#���d
pip/_vendor/packaging/_manylinux.pyPK�yVS��o�0#���s
pip/_vendor/packaging/_musllinux.pyPK�yVSqti]$��6{
pip/_vendor/packaging/_structures.pyPK�yVSm��?{
'! ���|
pip/_vendor/packaging/markers.pyPK�yVSn�AZ�D%����
pip/_vendor/packaging/requirements.pyPK�yVS4d���x#��ώ
pip/_vendor/packaging/specifiers.pyPK�yVS�m:�b=��"�
pip/_vendor/packaging/tags.pyPK�yVSA��3�h���
pip/_vendor/packaging/utils.pyPK�mWd�Y���8 ����
pip/_vendor/packaging/version.pyPK�yVS��B�w�����
pip/_vendor/pep517/__init__.pyPK�yVS�>R(�
����
pip/_vendor/pep517/build.pyPK�yVSs��������
pip/_vendor/pep517/check.pyPK�yVS
�VЊ����
pip/_vendor/pep517/colorlog.pyPK�yVS��5������
pip/_vendor/pep517/compat.pyPK�yVS;ϸF�i����
pip/_vendor/pep517/dirtools.pyPK�yVS�"������
pip/_vendor/pep517/envbuild.pyPK�yVS������	��"�
pip/_vendor/pep517/meta.pyPK�yVSUx��u4��+�
pip/_vendor/pep517/wrappers.pyPK�yVS��$3)��Dpip/_vendor/pep517/in_process/__init__.pyPK�yVS�"�H�+,���pip/_vendor/pep517/in_process/_in_process.pyPK�yVS��)��s��%��Apip/_vendor/pkg_resources/__init__.pyPK�yVSa$�K2'��H�pip/_vendor/pkg_resources/py31compat.pyPK�yVS�T��;2$��؄pip/_vendor/platformdirs/__init__.pyPK�yVSV�0�\t$����pip/_vendor/platformdirs/__main__.pyPK�yVS�	-�>�#����pip/_vendor/platformdirs/android.pyPK�yVSj?�}�:���pip/_vendor/platformdirs/api.pyPK�yVSŪ.�k;
!��Q�pip/_vendor/platformdirs/macos.pyPK�yVS�9��� ����pip/_vendor/platformdirs/unix.pyPK�yVS��j=P#���pip/_vendor/platformdirs/version.pyPK�yVS�80N#��r�pip/_vendor/platformdirs/windows.pyPK�yVS��/� ���pip/_vendor/progress/__init__.pyPK�yVS�C�_�~��A�pip/_vendor/progress/bar.pyPK�yVS���d_
��@�pip/_vendor/progress/colors.pyPK�yVSN��|M���pip/_vendor/progress/counter.pyPK�yVS���.���:�pip/_vendor/progress/spinner.pyPK�yVS�0�l� ����pip/_vendor/requests/__init__.pyPK�yVS�&�e�#��O�pip/_vendor/requests/__version__.pyPK�yVS��9�H'����pip/_vendor/requests/_internal_utils.pyPK�yVS�9.D�,T ����pip/_vendor/requests/adapters.pyPK�yVS��i����pip/_vendor/requests/api.pyPK�yVS���+s�'��[�pip/_vendor/requests/auth.pyPK�yVS����.����pip/_vendor/requests/certs.pyPK�yVS�f�t����q�pip/_vendor/requests/compat.pyPK�yVS�':��G����pip/_vendor/requests/cookies.pyPK�yVSg�8�G�"���	pip/_vendor/requests/exceptions.pyPK�yVSa'�����pip/_vendor/requests/help.pyPK�yVSJs�y����pip/_vendor/requests/hooks.pyPK�yVSX,n�&l����pip/_vendor/requests/models.pyPK�yVS<ށk� ���;pip/_vendor/requests/packages.pyPK�yVS�4�8!�u ��T=pip/_vendor/requests/sessions.pyPK�yVS=��z�\$���^pip/_vendor/requests/status_codes.pyPK�yVS���|�"���epip/_vendor/requests/structures.pyPK�yVSV�m\'�z��Ujpip/_vendor/requests/utils.pyPK�yVS���5�"����pip/_vendor/resolvelib/__init__.pyPK�yVSe�4�#����pip/_vendor/resolvelib/providers.pyPK�yVS�_��T#��3�pip/_vendor/resolvelib/reporters.pyPK�yVSc��2�D#��^�pip/_vendor/resolvelib/resolvers.pyPK�yVST��pS�!��Ѯpip/_vendor/resolvelib/structs.pyPK�yVS)��c�pip/_vendor/resolvelib/compat/__init__.pyPK�yVS�.gc�0����pip/_vendor/resolvelib/compat/collections_abc.pyPK�yVS���QG ��]�pip/_vendor/tenacity/__init__.pyPK�yVS�ml�� ����pip/_vendor/tenacity/_asyncio.pyPK�yVSU<k}���k�pip/_vendor/tenacity/_utils.pyPK�yVS�������$�pip/_vendor/tenacity/after.pyPK�yVS�}婽`��Q�pip/_vendor/tenacity/before.pyPK�yVS�kbt$��J�pip/_vendor/tenacity/before_sleep.pyPK�yVS�l���g����pip/_vendor/tenacity/nap.pyPK�yVS�R-������pip/_vendor/tenacity/retry.pyPK�yVS�V�u��
����pip/_vendor/tenacity/stop.pyPK�yVS�"9�a"����pip/_vendor/tenacity/tornadoweb.pyPK�yVSZe�Y�#����pip/_vendor/tenacity/wait.pyPK�yVS��������pip/_vendor/tomli/__init__.pyPK�yVS���@�W��t�pip/_vendor/tomli/_parser.pyPK�yVS��1��y
���pip/_vendor/tomli/_re.pyPK�yVS!ImQ�
���pip/_vendor/urllib3/__init__.pyPK�yVS?r
;*#���pip/_vendor/urllib3/_collections.pyPK�yVS[�r??���!pip/_vendor/urllib3/_version.pyPK�yVS�+_�pN!��?"pip/_vendor/urllib3/connection.pyPK�yVS��F(Ӓ%���9pip/_vendor/urllib3/connectionpool.pyPK�yVS^�I��	 !��bpip/_vendor/urllib3/exceptions.pyPK�yVS�(K, 
�!��<lpip/_vendor/urllib3/fields.pyPK�yVS����~�	���vpip/_vendor/urllib3/filepost.pyPK�yVS袑�h3M"��Rzpip/_vendor/urllib3/poolmanager.pyPK�yVS����a����pip/_vendor/urllib3/request.pyPK�yVS)/c+n��ݘpip/_vendor/urllib3/response.pyPK�yVS'��}�pip/_vendor/urllib3/contrib/__init__.pyPK�yVS*����1��Ķpip/_vendor/urllib3/contrib/_appengine_environ.pyPK�yVS8e	�g+(��ȸpip/_vendor/urllib3/contrib/appengine.pyPK�yVS��C�T�'��u�pip/_vendor/urllib3/contrib/ntlmpool.pyPK�yVS`��^�B(���pip/_vendor/urllib3/contrib/pyopenssl.pyPK�yVS���%��.����pip/_vendor/urllib3/contrib/securetransport.pyPK�yVS�R�?Y�$���pip/_vendor/urllib3/contrib/socks.pyPK�yVS8��}pip/_vendor/urllib3/contrib/_securetransport/__init__.pyPK�yVS2πI��D8���pip/_vendor/urllib3/contrib/_securetransport/bindings.pyPK�yVS�*��Yb69��#!pip/_vendor/urllib3/contrib/_securetransport/low_level.pyPK�yVS�9��Pl(���2pip/_vendor/urllib3/packages/__init__.pyPK�yVS�i��&!j�#��i3pip/_vendor/urllib3/packages/six.pyPK�yVS2���Tpip/_vendor/urllib3/packages/backports/__init__.pyPK�yVS޸c�H�2��"Upip/_vendor/urllib3/packages/backports/makefile.pyPK�yVS�w��;���Wpip/_vendor/urllib3/packages/ssl_match_hostname/__init__.pyPK�yVS>�Kֱ/B���Ypip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.pyPK�yVS抙���$���bpip/_vendor/urllib3/util/__init__.pyPK�yVSs���8&���dpip/_vendor/urllib3/util/connection.pyPK�yVS
�\^E!���lpip/_vendor/urllib3/util/proxy.pyPK�yVSN����!��iopip/_vendor/urllib3/util/queue.pyPK�yVS�d�T�#���ppip/_vendor/urllib3/util/request.pyPK�yVS6(մ`�
$���vpip/_vendor/urllib3/util/response.pyPK�yVS��	���S!��q|pip/_vendor/urllib3/util/retry.pyPK�yVS���ǧC ����pip/_vendor/urllib3/util/ssl_.pyPK�yVS��l�
(��e�pip/_vendor/urllib3/util/ssltransport.pyPK�yVS$���'#����pip/_vendor/urllib3/util/timeout.pyPK�yVS竕���6����pip/_vendor/urllib3/util/url.pyPK�yVS�F�q� ����pip/_vendor/urllib3/util/wait.pyPK�yVSx�q2S)$����pip/_vendor/webencodings/__init__.pyPK�yVSǭ�#"��
�pip/_vendor/webencodings/labels.pyPK�yVSP1D$��R�pip/_vendor/webencodings/mklabels.pyPK�yVSg8p���!����pip/_vendor/webencodings/tests.pyPK�yVS��֥�*����pip/_vendor/webencodings/x_user_defined.pyPK�mW��"ÁB ����pip-21.3.1.dist-info/LICENSE.txtPK�mW����d��|�pip-21.3.1.dist-info/METADATAPK�mW�P2�\\���pip-21.3.1.dist-info/WHEELPK�mW�q�<}%��1pip-21.3.1.dist-info/entry_points.txtPK�mW���"���pip-21.3.1.dist-info/top_level.txtPK�mW0�jGk���pip-21.3.1.dist-info/RECORDPK���=JPKN![KW�#_	_	0python-wheels/setuptools-58.3.0-py3-none-any.whlnuȯ��PK�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�PK�mW_��f
�setuptools/__init__.py�Y�۸��"��u���-�`\y\��� �C?���h��,*�����o���w/��]�������/>5��ڔV4F4;%�\ۦmta#�1�(d�U_2s�
�I�y���|>��6�9�My�M��P��	�LZ5[m�5�6l��[�e]�rkga#�Iw2�'�NյΕW�4�x����x�dT��~������a�	��1�w��L�˛����K����j�I"�z��մK�������P�d
Gy������jPb|(^0�PU��;U�V[�݃)��4���TE���x;�DL)Z������ò�8l���!U��.s�>�˭���R�ʼn�#��J������l�6�� �Jui���7���BZ+^�^�^U�2�U�Z6JHQ��F��xujv�]`
QՖ�8�f�K��P�>u��˟���n����6�
�ǝ��*J��P�����*^,�.���:Z.�?O�5��ܯr��%"�,�u��ЖSF
�
��;�<pԸ`��uYg;�s2	7%B����ٝi���۪*4����6�>�
��0�NT"~~��Ƕ9j!(����:z �C�|Z�UU���d��d�`\aOe#?%Ѽ6Y8	�?�����3/�ۈ��V@�"�%]�Z�w�X
��g��a�їJjv����k��$��iם���G"F�!6~����b(���/�ă�Y6 ��Jez�,�)�S'A�{M��'��T��K����=D��t�6R��Q�`?�U�6�F1�����W�A�a,�j�]TPL��&}fI:�9��1�B̑�XN��ں��Y�H}N}��iu�$%M���L�k��3�Ŭ�vF�$a�`���e�qJ�[�k���|���eP�2:�:!���Q#�f�.Tr�nJ,������9`��669�b{Q6�(̱��ޮ~�ۡ(��Lub����o`�$�J�U�`�2U�\����w�c�G���ltB���
4n'6ߴ8�|�"��[��2��^Lpj5A��hG�[y�Ī#d��LŁ�U�6��	��x��ՠ"4��<C k�潓���BBo��pe��O�a�/��۔B;xm/�b�:�P��e�.r�j*�����.q�c�ht�A��evNZ��x��R����M"�Uj��Cz<��z@�{�&�Dn���@8��!���Z��q�x�L���Q<�,��g.��?jtv�K.���,���F�a�#��j�n�>C�Ӗ<Łs�(E禛4M�S�x��q
u��&��]]_�$JTQ�5j{y�f
Ҍ��z�Q#��B�����Z�$�.�>;�;.�P��a�K.ȷ��S<�b�]�~��j(�:q���ū��z2�m���k�7�3Ly�����誄Ng�4�<�ա�f�L�޹���4l��`�+��
T��[4m�`<4ァ'�<�mښ��<��X�ŭ����蘔����pՃ,������]qpt�dx���lxj�1�Q:�s��S�gj���	��@�tK�`e1u�P�@��R���"7f��<�\x���%�CHt�+���v��eؓ�9f��;^��sVn��cr�}�p1����Y���,C�	9�}p
g�s\�&�A�cE{������U3N��q��WO��c2�n��~.9�S��{�MI�'u'�f�~�s�tt�Ck�RTȍަ�9�z��}�L\��h��96c���Зq�<��`�O��C���iI�u;�	%�J�X�0�}@�&�9�q�#����zȾ#bQ��$����O?�__��͏rO�-
�Q���S����=�cVR*w�*!��l�T���pbc�e���t.����e�|8����H�"�lU��%g<���-��:^+��ᠿ��3�I�i[ԁT����j%^����BN"�0E]���g��✹9���qBm�\R���'.	���@S�Q�`�{��@�	��7$|����@BU�����J����ZyI���ȶhV�f5��6����{���$�q��0����C�Aw����j�~\b��uK��Yb��FA��:;���#���kj Yoq�G��b.�x�\9f�_y��k}��	F�48�����:¿������dґ�ښ�r�A遗�2lU����N���Y�b�oh6�����4��m�AcR���|��%�K�$W�-@ ~�Y+DB��% B���y�����t?v�_w��^I�������N��\`�8�p!���ieEꊇ�=� wԧL�lzcG��3f(T�~��}���]�<�DZ2�>�dT+Jdڵ9>{z+���ä�^��]=�����o�{�CAs�B;͹��q�x���[Ù%87�_�Z�6DD���َ*So�ш��H�ަz��[�=/Wn��<\��0��j �q���2����4�XY���/Q�"�(�>�����a��y�s����ֽyY������]�%0tB��׉���b5�b�Ɲj-V��D�==�����
���g/f�8Y���YŁ�7��\4�v般��>�A��j%�
���c,�]�T���F��Q�u�r-Soohu�Fg�fW�{n�]��Q����xI:���PK�mW�J��"setuptools/_deprecation_warning.pye�1�0н��2��8#� ��Mj)8U�q{�P�/߃ߗ]DU�R�sI)��L'�c��n�i�6Ƙ�gT�uH^�#�?�����m���mb]i[$��2/�!��l�	k������޴��	�w�Xc9nO~PK�mW��	�	X	setuptools/_imp.py�Vkk�0��_q�(��5t�]S�ڍaGi�:��d�l����G��16H"���s�����)9�� k�T�(g����l����*dl�D�K�����+GkP+R
�g�,q�.��B{��\ֿ�WA�q�h��v��+ʈ�x6A\nN��|]fu�K�٬SY��󼫻t6����
'���9�_{�4��N.g��%�Oq|v3����[=�N>&z��ĩ�؁M�_ɰ�>z��P?�W�ddB�0n�%K��2�2����GPP�B �$��c;@��DU�9^;�����v��3�ᖽ��B|Lw��~�J�W�V�6��	Ȫ���fkM�y�?�	7aT���o���Jc�7���7̘����o�W,^e2-xn�W,�Ȕ�������Ս$��WM��Ö���c�~k˭�v�OSʨJS�N4��Sh��yЄp|�����&�cf���@mJ��U�����)�H˥�E&e[����P���5��^8
��h&�V:9�̙7tN�i���K��qh�V�[��b8u�8�s^!�1�{J�4 }Fj����n�w3v��O�e�ð.�<*�<�O'��К��Mم��![l�Lg7��6���+��mU/��omL[H6���^<|vw�'翆��K��[�y���e��F�����6�k�$��Wd6)tE!�^	4��p�y۝��6��G�e}	�]�O_�����M�)��X�̑|Pǵ��`x�ْ�'޻FL#��PK�mW��MjO�setuptools/archive_util.py�Yݯ۶�_�9,��.��>��eK�C�6-Q6kI�H*����w�!)�����
�@pm�|�x�;T���[+ki�0�R��'�yae{b�j�2����(p���l���F6�Җ=ˮ��?-�ӟʄo�܃��SF>uܞÃB���򸩴jX)�E���6��-<��7N����Z��B��5��RjQX����~��z�g��g۷/.{��m6<�<��'��x_�=��Bo3g�m~ԩ�Ϣ��„�!��ݗ|h3�9@6�MQsc��Po:�w�ۿ��.۝e��g1���v��j�Y;1��Xi�h�
�z!�iu���;'�
��0�\�^����=�
��+Д�@��s愄�Z-oD����C<�}@~P�w񖜱C0~`V���!c�Zsi;��>6d�0�q`�0Ϊ����_0C죂���F��܃��!#r�	��-���t�����܊2�oK����+2��B&-�z���e�[8��Ɔ�t�HV�U�x�ř5���P�@�7�"
�ƀ�lS
��)^���\dG��[��b���
��z��z4&�pE����s�*2�O���1*扉B�eƘ�Ń��;��3�NȊ���j)�̅�r֪��h:{eF��-�,@$D�(��yj9�&�f�L�ȶw<�0S$���*;)X��R:K��ލU;�<�Ƥ&���B�-��}�-���A�@OH�J���<���2MLqzXЮx:s�&�N��c]�e���-S����]U?�m}�4�c3�m�Qe_���
���[;$22s��Z#xk�yqSu�����8�Pf�!^J�B�F�_��JzlLM��5���c�vr[)MU�T���:ve����
�"��l���+�,R����VFL�g/͖�:Š�ƭe�:7b�S����� 
63`G�*�p��/(é:���q��3�;�M�e��[��eer�Z�4 6l1�!�ۗf��4��MU&�/��=t�]���4>B>ghҏ�2@?�7���GFϘ�r���_�l�<��0�t�f�\3Ɂ?��T��n �O�--T��a��Re^"����b�yA͕z�[,�?�7Y�\�7��7ە��BuW�|b1(�v*�����79�h�>7��$�8Yy]
�
����l�u��aK��M�'!Ǝ]Xs���SWs��P�]?p��r���+��`�W#]i��'��z@sMp��쾏|a�{��RI���lz��[
7�$�����>\·�I��.�י0��Quo��N��?s�k��Yd�́����9;E�]��Pǭägii�~Cv�P""53}c�p)�ub������Vc�3��TI���3K�/����[!zε�eqe)LDP�h�����;bg����*�p]H�Ml�o�Ӟ[�ݎ�8�
�K�7Zb�}Ǿ�v���1�8�H:��i�jI�0�GJ��+�!C��:�B�7�9
�=V��"T�+�e{14��4�'�Cc�b5�<�0�B��b��>���	=��T���Rm�b�M�NX���z�0�ŕh���Ϊ�8���0�‹��v���I,���7���0��%Y��"���p,na�劾��T�OY��� 6߼4�i��2͗�44�¤�W�
��u�*u�;z_���z8V��-��w�!!A��?���7����i���
�P������� G�aH�
\,1m�3��1�O�_�
=��׼9��}Id�)Γ69��̋Z�]!l"�{��I}˭�6H'�GI0��;-j���P�[:d\Q��[���=�P��O���X��=e�g��^�ۃ�[=�ޠ36p���QL��߿��Cl�*E]��d�d<�����!�����L����fv��3�_�iL�����P�G �L�)$�pM<�^��_�Lg�B5���pГ�XW��
�����c����Ŭx��_-��U„ۋ�{���=�Wl�`�w���+���Nq� �p��f���R�J��V���Q����`��+ 7��o��?$�b��y@��{�lvU�fY��/PK�mW�N7�`((setuptools/build_meta.py�koܸ�~o�A�V��pa�I.������p2W�vy�D��lo���ΐ�DJ��˵@A��p�/�Z�^�o?�߿�#�u�dA3FZAk���TA�A�.:U��q�jBI��$B�U&���9)y�EI����"-K�[YR�:_�A�X�r�P�{/%�g�TKD����y�1�R4���zM
!�D��dk�c5��� Kn��Z�@�"�F�%�Xݪ5i���̐Gѕy��7̮4Is l�Ky]��8>��@"����+����Y���`蓊�{�����G����^�{Zk�h�a�$�Z��'�ڣ �A@�˄\��p�IM�,�5/��>%��/ �6!�FH���DޕLF��SY���a�Kx�$�s���@�n[b�ٕbKK�@%��
�$U{��2�@�ۄ�A� nН����;(���ZՃ~�Ӗ0��@������=0�&�v�@�U-W���Ōv�5�@�Z�d��J��9���T���Շw�t�K�bm�r��x���$���ȱ&/�4�.:�y���մb͎��u|���ǻ��q�m3@ޡohH�l�P�Rp[�Ӗ��dcn��ʣ0lFy@O�� P���@��$���e��&�h�
�o��7�/��)���e�����`�Z7a�E%T��e+�YͿ��վky��e�Omɷ<�zÂ1�'(-"��a_��~�*������Kݴi��I��
O�2\��5�c���s�2?�f��4-َf�4���FE}t~+���&���J�e��5��ۧ�5hyAD�@��!M#��bMT�2^p&��1Y�,��
hv��~BH���dx.q_:��f{�9�B�$��T��+]��6�^/xB䠉�`@$)W옚|*v՟������G'��"�A!�Ek(�e�+T��5%t���s�����Y32��3孓tL�fxJ)�w���`&$�.05� ���å��Y������r;�	�uBը�Z�}6��ad���0LPs�
M��}ۄ݆��X�S�Y��̵���=�i۔5��s�CVg����������t��9A#�Zuy�C(�XnLx�$���@�ݖ��-ǭ�|,DZ%�2��(=����90�FZmsJh�JuI�C��b�?�"�%t��tͫ�圶,Uݶ��M��:�-��X_����c��q���s� ��	W��,xm�5�8��<aEK1XS�R�)f¡�\�������"�)��b��ed,��B�ш[�s�#sk �S�/�����N�#�I���SO�^�sxc!�:O�[�f�a_z�w�w$�ؾb�=� x�B�.@مQ|���kG�5}�=�%*��i#��j��No>�\�%@�=#�]�@����iW��VaT�a���Š}�cԭt��Ĩ���XYV��X��.Q�<�I��k�b�ǡΦ�1�k_�Џ�gp�Vۢ^��e�w���T��(M�`^�<�׿��'paU�f�s!t���n��&�1�M30d�E���F��,�uq�1U��@;�P�{�U����<�>��"�x��s�	���D	���"��[��6�>������hԪ
��~k󑹪#ϯK�fnb+���
5�a�5�Q��>`B/���V؄�#�{c�:�/���tأoY�Ș(�!�f
;�
JB��juy�l	ڮ���P�45�9�K�e�y��\��ƻ���ݣ.���M�6F-�����1�G1���^$���3\ԡ�}�e�U(#\�؆��o�xMJJ��&�qj߲>WX��˨���Y���B����l�6��;���pg�q9�e���Ƕa�	���h�D~�+����l�wq���{?Jζ�3�t��94��v-3�#�=D	���o/4"4��jF,>�p��
�V�Bk
��	d4CT�z��bruE^`�x��]b\#|�!뛂E�x
���E,�[�����\����u�|֠�a�1-��i�>p�B?�6
���k��W]�NŹ�9��N�����ѧ������d�lw~R����,���%g����%�x`sSx�Z�ɨ>T�<����K�e�JƖI�]
[��a���0��Y���ty6��6	ǀ���#�fS]帗:�
-����4�_S|:N�Э¿�$v�U���|T�Aq2q ׺�1>f���T͜aP��$X�f�p��z��*�"3C�cפ�����j�7v6���ҏ'~:V�hRR<S��G-wFG) ���ڜXv��]�늓��h�r|��ۃ7�3��|s��h�CM�������2��� �3�F�G^����$����z�-v-�O5J�2�@��\2��c�E�2���o�W�nj3o��L�[��t3O��>�����m���h����h�����Tx�aV��O	�u����)S��f�2���
X�쾄s.u�49��>[��'���8:~�v���rc'�~2��7���e���T�(���'85�P=ͤ��>�G*�T��M�q���%.������2���7�3��=�u3&*�~��<߱a��EF@Mj�2�a|W,�Ӛ�j_��Q/]���:Y��t��[�c&���"��J�̻�ZА�����2su�:xP�����5y��������^�|}O��6S�����<F����ߌ�����v�~اt}��/�~F��3f�|��r<O�;�*�3��S��K�}7�����g� �μЛQx�Mz�b�,���kQ�T�HĒ]����
�J�U
48z�����?�vlb���1���@��gp�@p~֐�0N���(�@����ظ��!����&�#Yg)�a ĉNH���~���3���I�?zR�!і
���G�B��/���'�`��H��؍f��(ӛB;U琬HdE��ާ!Sl��EdDI��	Ȃ}ِ����mWY�L��B<c��Ѐ�H�c����j'�0y�5�Jh����9�r�������*[�
��3t`H�B]���_�����ak9��Cȝ��5fyr
����y$.87�r��
�����xtY�j��u:|T�i����?PK�mW�l<
ESZsetuptools/config.py�<ks�F��+f�r�1�j?\��xk�p%���
����(���~�C��&w[u,�L===�����n'Q����`�
�|Suf��Uc���f���0t��׵Wg�q؊z�:YO��+}K4rS�i�a,��Ʃ��#w��j���u7\��-�0T�C?�DC6���S۩B��0Zd���vH�k��tW�l;I����~G��]�}���w�5p��������K\��#Q;Y��V:0W~����Y�UJ��jj�o�f��ՙ�ϓ'O��$��IL�膪Ӎ[�W��W[i���(˶o��̕�6KZ0f� Yb�d[ s�M�7%��	�BߵӍv���f1�-�mZ&�4nV�<"b�^��jr�ES�F�,�}9���p��]�]SM2�T�p0�����_�N�]/���;����d6����
� �]���R�V]����~*����l�QX �L$�����lD��j{���M���_*�^��i�j����*�����x�oQ�����h�^�,��������?����Z�J�Ǝ��~b;�s��b��GqX���1�~�����n�)�|�D� ӓ`A_8�P�۪���x���������79�YD��4q��Ax��cA��`b�~�h�p�i�U�cEܗ���i�"���VWu]j�(�íd�a�����ߴך�|.
A���wG���&��D�a��@"+�U�=Lj���noe/�1����(�h��8#*�~�`[\�YW[����)u+�V�y>�3�A�n�ӄ�����\��n$~áJVc�B�������ݴ[��WR������^�]W�R%�N�3�&��!�tzIKAD�"��ÄT�R
ݭlD.���N"NiL�Q�6�q���= Y�
W��?9�Ţ�C��$w��F)v㰫���4d����w��q:��d({�0�!���e�<��:�`Ъ^])2Qsk���5�Ux�9�a�3�y���J?S��"��=�)2�LDS�qQ���a<0�����	k����ѯ9
5��7���r
g��H� (�e�咔8_ c<3{~��c㘌�l{�6��rQ� �7����CwH��t�����I������x��(�G���-x���h����,�g��f��#t�ZNC�֐��ό)�&@G�r��y)��Cs�"W[�HP0+�Y�C�����xC�8�%@�P0�����8������(���<:��z/��C�`<�?%��Ytٱ�|u(ε�����:A[��7�|0P��Y-|)1Tn��м�ǡ-��~+�*�EH�9<Z>�:��sv8o�ŽY�7f4�-�����e�2���X�"^G��vc9�1�QQ���R���MV5w�l�ԑߠ8�jo���[a��|�&�Me��}q��.`�)a�4^K;Ŷ&C���(3z+G�wvӴWu4��0��:3x1�Y	��(F�*RD�W���J�U��
p�|(���[��2;��b��+W�6�Oѝ��W�o����L�t/f� -�ڲ�P�M�D8V&�Y��r]Bb�c���/�X�XZ�6Ŋ��Y[��J�A��]ׂT�ԾB�\�>0�ۡ���|
��p����:H��Ϣ���i$h�m�0�#[ka���k+E)ׇ���wF���B��^�];�:bw�aU��`�u^Pl�]iʾ&����.�1�с��h�eyI��I2cLq��3����9Oz��e']{����Xm~ck��,�In!yc��}$��EM
����Fc�D���M������f{�z)�lQ�����)t��Gt�!���F�Rb�
�}�+
tBp�#��g��6����;%�H�Q�k��8Zg��@�Q=];�s�����]�=��%gB{3P�?ow�d��
e�-ۢ�j��&F*q�F�)K2岄oHIY��>[�������ɥ<��}���z����*��"�81??�U�:�D�2@߁C�����-��N!��1�5��~x�)�c1YX*m���y(��B,�4T���y`��	���(���V� ��o����]˺�(�z�PZsa���=�|��Z[b.|&$nVƏa,�u�7��s$!�?�{9�.�#�"	��M�*t��螝V�n�B;�r�G�ToE'�bTC���Ô`z��L�b��_�{୯s�I�T0�;��b�����l��>�{	A�R+����G�_��(Hw&���m�\o��?!�[��a����F��\=�!SW5W�k��a���o�$��3�Y�W��;"�,A��
햶wl%�=�R��R2�d�NM���ϸ�:�	���xG���ӌĠܮ�SM�y}.MG�'�xŒD~ˇ�8M�J<�<U�^��o
O�@��.$�e�4�?�($�x���v�4��S�7��#z��}'9gd(�M�Ta�T�tn��
<JM�ݢ���S�CRK;�<{����#�9�?������G���\C&�
��3!xJa���,��b�
��Z#�j��b��~$3sK�����m�c�&�-=��>E��Z������$l$�N�xnD�|�.Z5�P��T�Ax~8���?u��l�׾����Tp�e��}�١/q ����C��0���6���"臭��h��O�^]?G�+��i�^�3&��:��V�6����<i��2�HϨ�Т��J-U�ƃ��;��f�b�.���e��WW��K�R��"�V��01��J��9,�t��L'x�ê��G��U�. |R°ׁ��0�G_Ԁ<{��s�|�?H�ݛA"���g9:��:�م]�)_�?���U�G<��}v{�)ku��r����-bB��o�,�����j���T
,�΢�B������9�ǜ�+Q���n;��!�5[�D;�f[��V\%c66ؐ(���|���c���q?"ۼ���,Ѕ4����A`�z�)����.���ć��v�jy�K�o�Q���=r�4"�s�x��KX��
�s�K�إ+F{���J�{W�{,2CX��l­=֭��tC'��m�ɝS�F�������}�%�đ�J|���o^#������o�z��w_[����#L1��f�9�^���l���'�t�<�+����2h3[��~6�FW�!�N�+/�Ӈڔk�i	��a�1��ƻ��g.�7��C_S�NR����氤�^#'4`-r�J:meL�s�Z�oE��\��+j/��.@���3w|���`�Z���������(��|ԁp�z���dp�PPӢk��}=�sXg�i�ٿe�øI��ƴ/>趨��o�S�5UNNpd�9�m?�$��LU���ۺ��~�A������m=x���U�n!Fh��!6�h�0F��	\�\�b79!��v>ھ݀��Հ���B3s6�P`8H]�S�L��i��t�Qq��:����y*^�z�&j+�)�aWw��@k����B�m\3t��P��|�u1�ڴ;�X@����<����S����E�:c(�&�y�]2@[z�ʑa_̗�ަ�xˌ��X�'6\��H�D��06&b�|:��@���3	r�A���p����6�ag��n[_湯m�!��w���Kgԡh��?��
�]�b�i��\w����i���f�|OlI�]9�<���*�=Kl��SJ��Vl��T���'=����wiUO����V@�'o���.�ӄ}A泡
"5���1"f�"��Qm���4����96]h$���4�h�'-=N�Cu�.��Ai��}QwYE�([�V��f3RCQD�<l$R��2�)mxլ�����)]��jHKW���>*����g1�5�{x'c/��`�y����D��9�6)�D���Xy�<E.�|֦��eדY��⸦s��0=�q�1q�� ���)w��L����T��i*l�i[�nM"�|¼3�8/���6���?�%�bDesp�e��y��[�6�׀
��ݠ&n��f�":�3m&�i��N#H��Aj�\��(ӝ1:�h�鎆�J��]}*^
���Kp�:�&�Ѱ�j ��Q�~U�0�Y`HL���M�!7_b��-�$���F~�cu���6~>���pt�t�]���3U<S���3�'����TSչ�����i0[�Ql��_7�i߆��Rl��<@�9�aRW�MB�ZHU�YOP:F&�&���Q_��3����}r\
���V���U��k��=�(�&Ƃd��
@���i���z�5Ǒ�s��[�2�y5^c:���~�|�y,��/y��ɚ�9�;KZB:��θ;5�4�l�����l�Mig�n��
���Jd��˜�fj��B�w�j���>I��"���| p��|7����]�D ß$�"�.��W��n�):��~��;�Ў��	���j����%5}^�^P�(
S
��ĥa�e��͝v}���9�G>��s������@���L����#�%���DwVj:ɼ�����*x�ѝGPA��:p��3������0f���
cs/�n��f���ۑ`���"��J %!�H=+����n��N�oACO�8�t��J���q�c*�h$�}�b����W.����6�!"NWj��{��*ñ���i��COٵ����䩭�dA���&�0�t\�	Y�����b�IVͯ!��}�����s1�B��V���-��+!`:2ћ8��^�P�d-q���L��2�8�_A��	��^�:c�)g}9x<���N�	Z\����𡞊��:���j�OZQ������+�ԭvʔgr�H!���`?Q��G��O�E>w�.�=(�S~z'@�/�+uM��Z,�7�$:���s�l/�`y����G���t�X�����|���������xL4]X�s�=�:��M~a�u�낔��ڔ���3n�)7�T�	3Px胏��YB�nj{��H��XClT�N�8xxtWT�Ø�A�=�vb��ӻ�51��\%�m=t�����S�߽�A���te����z�0�CHs�����]����^	����z��{�{�=�9L��ؽaQ�VJ|�s?�EP�v�n��^X��vI�B��^��!^6�<r$y�2cN�-�����C��0�#������
X��R��Sq����"4�K4̑L��XC�s�"�e_utx����K���A��,F|���<qd�9���o	������V0�"�ᚳ@p�|X�M:������.��*b�-w$���2�ߚ�,7繄��=��OL�v��{J�����<�k+,��Mk���r���4j�G>�^�!�}�I0k��$�
�����1�=��QO�Q�ƶj��o��_���'E�,��ϵ����R*K��`Y�>g��D���;Ls��u"�o�1/�	�fI�'�ᖹ�
�D�>�vxl�]�-=fy��{�u���e���ӎ�~�B!�ҁ�z��U�!׎mr�� J��#>p��5ǚ��x\����R��(h�:����]��[�4��y�,�enƁ�&�dz�ݺ�H�-'��Lu�WŰ-��G<
�h<�o�lV]W��R:J#�5{�ՔQ�J?�?F'�q'���E����ۜ��ͅy��9�H)�̯E�� vR�X���j���왂�x;��o�4�}�It��^�qc�J>d�m���<."QD�;n�l�|O�(I��my������4Vv��8.�#S_a���r���s��D��(e.JB����u���0=���O|NEe�t<�8�;PK�mW+JΟ�setuptools/dep_util.py�R�n�0���� ey��z��=TU4��klkl7����&	d+!a�~�lg�1(�۞�1�@��rCg���6�����B�aR�=�Գ��Ť/�Yw����an�ԅġ��o�;ş(`46LĂ5�d��6D�eM[�4���8�{�#_��1䑂o~U �n�{C�N�rgq)�2jMZ�2#��	
#d��/�f�0�%��2�w��	X$[�M!��< y;��P=<z,\�O8K۴���^�*E�N���)�%��g.Q�WS�t�k��+�i26�񜷷���Q�Wԑ^�-�o'����2�ꅥ�9��D�&Δ4�0�*�<�)*���m�a��؞�c�Zp���2�4rF3��$V��a}�
���͗�W����#�n��k���d�B݉wL�PK�mW��f;zbsetuptools/depends.py�Xmo�6��_���$��~ږ����$H��[W�D�\$R#)'ޯ�I���t�|h-��~�ܝx�Ie���w?[��6�c)�a���pRq���l��
ot�eJs)��qc/�/�p�.g9�.�\Ty+��a+r�k����������������ק��@���E�Ӧ�s�&���k�g�KV$����-3�)s����1��hi���3�-�5��N,룣���SL��#I����HE82h|��-��)�raYT�&y�7y�ړ�O��^A[p
`ڰ*�]��Kٲ�޲u��&��8il}!\��j��˓�x��
��KBEu(�
i썓�O�ޏy��֞&=x��P����)�+�o���<	Z���<���<������,i��e�Y��]�B�RC��2hq�f�W�^!-� V��T�!����Ԉ̳�C8��<��OuB��R��3�y�"X8�Lޥ.1ډ�g�$�EBt_׼�L�fG����c�ꏱ����@b�7{	
ǿOKŨtЇ|�&G���^�\\������Л�Q�Ѿ�����O���(K�m����+6An�3`F�YF�xè*7$��,O�rV۠ײ�j��e�޺7��5F<�����SM0�n��Bp�&�c%�9�,-��Ҧg��,��0�r���ބ��p�����q�K�nsT���TQ]�$2�bq���'K�� v��E���M �-�u����0'�!�#�8(��v�(�ٴ"�-�!W�Cjؠ/(B�Y�Y�H��C{o��5{(Ygș�éRR2��hZ�~���̩
S��U3�r�+��ē��=�"�Ew�m$Ϳކb�:�ޭ�7 ��Y7
2��X�D�D�Ce<��k�1|���"6f�W�+�?�����>��$h�H��[�l�Q#��b�v�tW@R�|z�Oa��ϖ
h�jtk;�K#��8k�=����ϓ}�<�~@)��\
��kلfq�b&���$�()v�~�9����n�8ƾS\�؏���*�\R�2�x[�/����nF��]	������d0zu�gx|.�L�s�B��u��	N�L_�Ă�Ã�q��<���䢖{�9��_�'�7| �lՈ�k6-}6�fd��7����
Z��.Q���p��%��`1N��`+X緬��@W��c�T�[�N�X�dK֣�TZ�+͜����j�q)ێ�׽U�!^�0�2�Y�=TxN�eVc3�ގ
@�4����7tk�'��qL���J�^A����˄�͕�0	��t`
֖��������W�(��ۀN}mc�
d~���q�9��&��W��Q���-���?�!�g��W;ń��e�R�󎪙z:��"�?�d�:�-�,
�qucNG�N5DW����
�n~+p�C�P�Z���a;)�mdAv`E�(���G5�>"v���^��.���N�v�p�H[Kr���4�x��4�h�ޝ_�zycd��ڰ����Y����ВA��8t4�4j?m�LKna��x��c8Ãġ9:�e��I�Z�KD��DZY�z��jӉ�e�R��������yt�܃�����˗o!/n>�ً���Y��0��C�w����
��aU�^�>[�"����3������kx��H��t��<�����?��S�b����<f�g�C����J�����O�Y�.�uP�E
l���V�NAN�T�[�Z4vZD�&]C
�����Ǐ��
�`��)��1W�L�w
�
c�	K7�B��C���l��r)������M�tk@t��lx�?�9�{5�X�|�{��ߘ�Z!�bFA~��	�3��_b�8��oPK�mW2�
˹,O�setuptools/dist.py�}ks�F��w�
��Ȅ��<��jK��#qmb��H����JX����.��~�5O(�ɞ�{�*���������w��g�dQ/��8�u�ٟ��Q��u�''�i��l���ﺲ�ҳ��r���.)k�[�o���ҿ���u�T�]�6s՘?�`��l]��.j�y�Y��o1�MQ-�VM�q㿉�@�t����a�����u�G����۰Ū���\u���
����uѩ|]W��;���nR�������!I��v�M��~�~��=������-�F��&����q������ٷG�cQ��j�-Z�m�V�n�-˅`�6�%�F�mq�r|��ʵ:
穚�n�G�9��_N��W��m��!�7�ş��"W�ت��p@�m_.��� ��(D���x[,.�s��
��f��̡�@�lܗ���wU��N�
�TJ�d
�GjۨE�4��w��>v���g�s=�uY-��6ow[������.�^���wն����V�%�(�g����m/��F���Y����Y�(��Z���y����8�ܬ]�nբ\�@�tr�N�6���X>ɽɏ�vˆj���/�ѣ:��.Y��K���MV��6Јٺ���.�P�Qd||�Q]�,�"�ƭZ����XhTt]CϧI�O�ɳ�R< �����a8�&�_d�Ӊi���4t�\���qٜ����X�SUw��r�̾������%��哇3�P�Y�=��W��Zx�$���ZX2�&"�t�ຄA3��ݮˎ�

֪ӣIrr�ܷ��yл�{g�Ϯ��[��*�Y��x�k75����������~4�50-�j�d�i����q2��זtZx�ƒ3���R���P
w4��*�;�K֞�қ3Mys��o����󟞥=� ��D�.�I���M'����z2Yo�C�&��{�›�� �mj�/�����f��m� ���
�s�m����hy�3'�xL����vv��o�)o���.�}h��$��x��;��(�g�'"*�׉G���J���4!1SP�T#C^@���1�>::$9}q��҈��g�*6��:���Îu��=�L�%06о��o�=��K�;ɵJ�F!��(��]wQ7I]����.O�6.N�T����Yh`��-�Ψe����kn�|Qo�l<�]�U���%$����
�|
jZ��a�IY!�Y��Œ&��8z�M�n�axDgJp#ɇ�cpnN��l�8D��$��{相�Ld՘��}�o���k��k�_�k�LXw��ԕ%[���fc����[��Xm�J���N�����_%3���S��͝���|?��-n_��~d��ۮl�a$u�PI�6�0.o����y[�UwCo�jx9S0�$�b���B��XB�sCi9Ö�6ӂP^��PTZ��w�tqI�mY6���rI��8(q7�v�-��ԝ�_���~�t�	��%Ɲ��Gϓb7��{_ܟ��ٗ����
8t��2�]$�6E	<�#��t��*u͚<^�@i���r4��n`��4�k8��9�q��}��4
b¿�j�)�@�$�h�����h8P��Γ*�2�:':_7pE�+H����8N���}���n+��Z�M�����'O��VM~B�����;{���s\�M�%��t��vbb��mR6�ś6��Д�gs���>m��O�_�Q�i�x.����h���ݍ�ɤ���2S�6�6�XC�nkfi�Jd��������I��w�w��r��]����|<IƆ|���5��3��Ĵ�E]q[�`lg՗�Vf����>�w��M�L0#�
� �� �W�v!�/y�������I�*�g��+(
����(XS
��D\����Ax�U�7/���v�"��ǭHZQ�}����Oz�Me���v
�-����8J(
lj0��/5=`�������ԴtxCkfNtg�
��t�225\�&��x���	f�Ъ �Ns��jr�K�-8����3��V������s�*8���L�Z}1].��4���֫wQ���oK'Pnu���ӟ񑥑	�{��O:���b`˻�V
��|����^Cs=�A������ۮ)�E"�3w�śƶ��=Ɩ����5E�̞�n5�if����5Ι�K�'&��Vb4 �8jaIT�@I|��"
��-.��RL��T�%yuXv������yf��q-^���22ݏӷ'i���mz�@h�m�Te��Bm�d�k*^��M�{���G{|&h�r�m�F�@coG�6�f���v 	�d����:F"��D�Qu����O�	i).}ȉ8��<՜���,�>��43PŌ�Ѓco��y+q5�XG��CK�zx�[�dW��Ɂ�X���n�eBB�᪕Ш�
�%�TN��fD�L&X���Nfֶ74���zc�r�0y�ON���G4UW�g
�oU��-/��J>
q&�L@���JsD���K�8��f�
@
���Β(n\����El�C�1t�����I��}�b��]�{���#�9�<��k�K�y��򀬂���Naq�(ͳ�t%I�4K=�ЕP~E�
���f�I�Ӄ���}	8�^*PQ�z�v��13�&@,�^�h�Ǡ )�_9�=v'���h��3�?t���mY�[kU!�[+h}���1�qg ��Һ��2�V�E}��X��SJ��qx�i��E�*�	�M��H�n�n�
�H'"�����yK0A��X�u6�K.!�BN�����v�I��{I�sj�9����c�mOM(+B?�c���6=安��ʦ�hj�x�s�}rd���
��c���?�1�����
�O�u��7�����A0��N��l��;z��}Ҽw�;�B�O|ؼ�ߡ�dt�!�
<t<�8s:1V��^�]�D:Nf�r3�
i+��{$PyZ�Zf71�d�Bvtx^lF<�2�[�[.(�7뵹Ű*�l����n�x���3�[��M�M���h����a����y�(dч��83v>-U�+��t��˭�&������x�'P'��D�A
s���J;OMO�@�2L,�({����w��D>������(���y�'�K�3���z���\<ڬx��/�+o�I����v����N������\����)k�~ `E%�����Q�ꕯ��u�bTI
r��ҭ&p���>Z#�!eԲ����h�Z�a8`;r�yl��\���e5�ޅ˙�e��0cB�R�i4{��!�w�}G���4��x�B�N䞙��뎗z4��G�jx���bX4�zkT���q��r������|�6c�9���3:\��p�_���(�Ў�ϲ(�EStj���˙�޿����$�#�3�-v&Cx�>{��F�F!g���Қ��h�R�sB�����t�ķ t/���Qcp�9��`y�Za,���K��Zը���Ե�0i�hB�;V�`�r��x�3ZI*|i2�y��1�::
t{�����I�,���K4�W^_�Jk�j95�d�����}���@�ydHZ�ϴ����u5�,1�x���@z�H}�>��*��;�^ �`�@OQ23�`^嚌�%��_<���u��pX+� ����F	[ �N�d]�`J8,�W`�a1�UYahBu	����aZz
�n��T�RX6�j4��S�
d��y��Y�Yܜ0w"l�� �P���\�y�5�(B����-u5W��4ۅ�b���R&a�z�]G!�T�4qF��l��]�
l��1yBN�c�dASѱ�%��mNa�C�z��9�e��-��ɽ�K����F��?������!Hj=Y`X���
�E�-���*�B��,Vv�\�>��A��K�,�I<lDYW?o��d�U
���O���Ԃ� }�R���S�Lv�v[WKL|%���N�% ���*o�S8��0zA:a����qH��~i"��Ať�o���R3�z"����*�i����G��AX�頔��|��(���ޭ�fe!����$�e�B��`M�1���;�ӆL�D� �$aq>�4U)<�=z��*��V+Q �S��j­�c��C��a�\Ȑ!*��Z`�����ӎ%rnWa�x:��;�Ͷ�[)I�!�)�Taz!�ՠ�A,haZ�^�Dǝfs+rj �^�h�4�k�
k���|U�F�)�"(wy6��S���5�s�)��f
:r*���i�<�)�
8��A����p���jPup��ҩ$��U]�4/����D+}ݔ
��ɂD-}z7u��PcU�n���܇Qa:B̞�>1s��]@��aWnT&���].9wp�A��aS�-�*Y�ۚ8��U1�-7
�d�
vg���v�)���N0+��bqG�2A:�b%�&<�c�0�%�w�d��co�т�\``�n"Yt8�Zˁ&08%Y��T���ǯ*R�X���c�#\ݏ��ʴ&�d�=}����߿��<{��ŋ�/_?~���G^?�S���p�7��ɺ�̗�1�BY����BЊL��[7�8���s���N7<axX/�!���@n)9��S�+!��7e�[�� �jU;�a�s���<).�H��֐�K2#jY����||Tx����o�A��H�'�/��E�)��P��+�1�w��c����]j�]g���J�@>��L��u^��&�X�9�`�e��+��0I0Nyij�$C�Ռ�^��{��c�Lj0;��MϔM}��<���X���SM�4r#Ϝ��\L���Mv�M�%iVˁ�J��t��-bŕ��^ŏ��oG�p�{��h�߽��8��r���)|["�O�ܝQ�}k���nR{�����
�mySם3����H?����~t��f
�U[*���%�&
߂�yz@���N�����H/
tܓF���d�6�mN��xWE�rB-6�,���f�;�I�YX2�{=n�m=_���8��=t
�L1,�Zb��*�GI��9��`Z7>\h�j&���fYb��|.�ewzdOK���R�{0Cӫ��4�a#8��F���fj���a�o�(��Hr�����2���N%n�)�$;��Qt��>5jM�v���γd;o&�k���ذ�!�d�tx`�+����u��2qPt��h,9����m9�o�Ɵ��f�c1Jx��S�A�?��˪�]�>Oi�LȮ���O�Jm����5�!�|_�љ�R�~nP�H#<�z5�ܼsD�ɉ�ZG<��Ȃ�;�>%S�;�}��}7���3��mtM0Y�(x�a`qz{��k#�\�g���Vڪ#!�N�L����4=ƈRh����?OGF9Y'G��LM�<���f&lq�#Xw/�4��?��/t�5���zx���f"}	�H�b�2�w{4dH�$��@�M/�pQT�����l�݋�d[n����,y���V)
=��{|߬{�V�d
�^��|6꟝�ؾX�V����'�S���r$-��_ͩ��J�_�o#�Q�^�����=�-��ƅ}�
˃���Dt�!�Y<>:0h`:��ُ�{a�l��%����0p���8\J
�.�<wH	��3XyE�\�rl�35v���ᚼkĎ$I�h����;�P��z�U�z�Bs�
��z �$:pO����齳^[ <5��(���!�n����s98&*����K-%v���A>��r7�Ҏ;%�(����t���1���t4/�y��v��M�1��Gg���4?6��~�:��P����_�'�!b�����ű��(�߿$�#Mn*q�N"���ی5�6닆R��������-]���n�R�-�O�[o���&Ē��Y��R�!��N�6ti�!���� �g�3�L�\x��']{��sP����⾷R6z���>�yW�m?������q1�i�9�(톳˱�,Kr$")�Q�Z��k<�[��E[3��Z�\�0p`�����g)�:� H�|�R3�(E�9����q��\�Z�����Gd8R؅p��V`�`g��Vd�{����l7!��g��G(��vso�dR��b�����9���q��h81i��0��\��;׽q0�딠M,Z�?��)�D���Mz�S[�������U&�bߖ���{��1�D�S��T9(��@
�\�2Z귘b�9!"r�!,�S6�}�:-�ͨl�o/��Y<O��x�NJp�sǨL^H�
'�+��%�$�Oώ�������*������t=^�O5��=��r01�X�7ZԺj���x	���'���Z��
:����E�m��w�Q��O�߲^�RS�U�ݖ2A�b�C~���#��6���$}J�)�.�+Y�,�EɅQ��O>~v����c�UL>�Ͼ�ߟ=
/��o^�����ASjX݅D�7lP8Td\ǁ���i���€�3 .,�����7��PN�0�{����Q`�����g��}0ND���z�=��U��;�6$��6<�򼚌��M�J�#��֢
e��w:�=T�
oʖJ���U��0�I���-�*>�Xu��N����K��D�`YlqDŽ���Ь?��&����dB�tMՂȐڻy���@����v]�l�R0�&<-��g���R��֘�h�����r�uC�᬴����a��qz�EXoE7��k^���oH�ӣw�J����Pd��Hnj�.�7���ɮQ74ኖ�&;q�	nE�3�bo�[��
��j~��x�Ğ�c5x~�Z����P�wc����`��j_��@��޶��Q%�:\TU�C��;�����N�]��>㹽��1d���u=��fFA�47�5��O�Ac�?I�}J)S
qVߤ���z�;=�эng�R�$9��W�q�N��.1S����(�]�� =rJqj�q'zl;�z��Ж�j�4+)Й*�����ib����?UV;�G�̔L}���������I��$_�E��9�膜&��@l�K=���n ?o�}
��&��j��$?�wO<w+�R��9�H�k��x�4���L7�9ި�@��@&z��ZlB|���ZS�S/�@���,N�J&Y8R��BˆA��} �XV�c�����#����b�a<��+4n��{2�����Y�B
JGal��Li��ڣ���G�ߙ���ʟ��b��/�
�c�Լ��e���ͮJY'۝_|20@�k�e�~	7�.�b�T��$��9n���lIlI��۔�v��Zv8�װR���=ފ�EXmvbd�F<�&�yN��B��������g�`Փ�GF2�ݔ�mD��)s��5���W19��F'��b�/"�e�}rb?���}�Q��J>a|I2K�\	N�þ����^��'!/��x2�(b(���Au�
~ƒ����x�)Z�'�d@��	�xΧ"g�%^ ��_�-z`���h�'U�tS�o_�`�{ Y�ԗC��X��XX"��]��`�hZ�(e�T�9�b��-kբ��j�p�V4�]�����6�?��K��͒����0D��[��e@,��090���8<���<���(Y��bqy��v�����7�+"=di��?������|���7�~��C�M��J�����d�ЄQ����tS����Z4��M\�s��@��ߤç����N]�����?��*ݝ3�q%�ɀ�1��w���.1E^9�9p�~��50`�L����a>~��og9�1�$����|2��
Wu^�ǩC��]�m0p�r�轛�0ʮ�7��=�x'
K뻴c�,�MUf{�#,�J��帇'	Ta�^�O[.����,���?QWE:R|�h��g���zJ�%��QM�%���
C�݌*��"�]L�K��`a��{}]���~2P9$f��
�e�d8�֐U��������lڿ���u'b�=,,�?�p�Zg~D`D�-7�ԍ�C�����
�FFT9ɅE�u�,I�ث�6�[\h���x�$�|j%�+E
��7.�tFL}�R�<�*n���l'm�}�N����WESֻ6Y�+X.{�'��Oy=�����k�[h1���I#�*{�ӆ�'Z��x'�`�0e�閹:?om������%�
�W��0�;�P��%�{��٤i�»E�@F�7�<��M��r���[�*T��P1����un��v����\VGƥ�z���Y'����<��}����v�;�:���M�Y+�y	'2y�sk���2f��ȣ����$�4`Tb�����jM
����-l��<�#Z�B�����O����_ߴ��U`�Z��^�x��;���~Ґʝ�QZ�p��>'�8��PGpa����4�7� Q
���m���VLE=�V��9�g9�Y(�;^�9�dx�2���ԌK�77à��hz�P�t8�@���_��p̗ �Q��	�4S�\�S��Vff������^�4�WN:��`n<7�3_�џ��R����4ߘY�WK��J�|�_��&2茅�ep/}�7����}��/���/�e��RN���}(!$��%Oծ��}?_2���L���8���?���:�y���a��޶�B\�5��Hv~�/@ܡ�hBry/�"$�T,�X�x�!�#�/X�S���Վ=p���Q���U�ÿ�E��P'�\nT޽�,e�S{3�z��6?x�����!ꩪG�B�kvޮ�˹�o(D�ӔJ���S����4[�
-�q@�[H
7:�ɔ��p���r�3��CR��>{�d��>�jԜ�0soP
�?��=�������K��*a#�A��;'��1.'*�C�O���s��D�:b-�0��9��&�!=��=T�q�7�ֿ�N�op.��TV�9e�&A~�˜�D��,�aT��Z�JW'�Tm�:�A�l�vRa`�s���k}4��3Lt��76��N�wӖ�~��M��C Ѡ���?�2����yԣ�?w`{�/D�K>�92��kjD��W�������5�Rc�Kpu�+�S>�c���-�;�R<��Ĵ��ŗ��?�,R�r��U���낳�#�F�W��J ���L���s)�tr:z;:��R�K6�oS��.���u���'�u�������Q^���]Ù�S/ܔ��^�2�H�#:�M
{��*p�ɞ֖��㋮�˥WqURA�
���v';���� WZ���f����5�YWϲ�?g��?���.������l��@�%{u5o9X��b�`��S�+���r����J������O�:Bc�
�P�>�j�}�Aߩ�uH]O�ĹZ� 8y9�?3hq]���.H�E��=y-�Hư��ep��ˁ������hWa P̗̐{=ަl�ft��w)���	��Wh�*��Z�-�FN�H����]��=.��9�h�b�O�E?��BLo�[����wӍ�>����U[7�0�izv���H�n����0�0{wA�mþ��a����%L����<��m&�<���A�����+S(���O�e��5�1�%�Ko�[2�b��lq�n1�U�D!	"���n���ma&�ki�H��9�f�J��q���%�	,VA��	����ٿ�X=:��;�����X~�3��`�_=�gM��ů�
��\#n��T�Y<Ϛ�
���e8��d9�Ec��r�hU��Ħ��y2:f�A�}��z"�����>c�
���.�2�4!���)��\-)+����E����K��[r��5>��
l�ˣ��?�
�1��2q�M�*\X�$��b���fvv#����#ܾ�v�&���L��vK���$/j^��[_���μ5J���+E3���T�x"����4H�r��Q���ϭ����Co�ԏo��d�#����`����h�ﮨ�]QO鏸+ڥ�#������]Q�D\[o?���)��]1�[�+��r����\o�?��G[0��:�T�I���9&�ƒ�(Q�"�"�g3�	����/���~6����mS/�Նf@qH)�"9y���l������
C����`��F�F՞3�ɬ�=!|��c�r(6���+6�Z��i(���󮤅uy�-�j�k���2m
�QЂ�IB�$Y^�)T�=j/���I�>�O�8�c#���ʉS̼��	�*
ߎ��u�د�����b���
���Ym� ���������rj���S�.C���@�����i��M)mr�~d4e
�++]�Y#�#��'6K�@�*�$}���w�����)}�P
��3���E�C#���|���$��엵��|��G�$/9�a��w/�eH����p�9G��R��4,�jwve�E��x��Jե�����S�v�hP�CZ�IE*���w��
��01��9�v¦� i<�����ex�#�㉕Nr�I�+?�Cx
��M�g�x��pns$c0nj�Y����=�g����bx��4�k#�٭��qW9ݲ��q@!ҩ���}$&��
x}[�Ndz\�
�]NN����O lũ�^���ϼQ�e��p�7��*􀾻hB�G��N��)|��X�Q=�Q�
�F-�p?>�3���[��v
��NO��=�脉
�H�r�X����M1�E�����}��I�����ߝǎ�ap`3�ǀ�U���u�C�Y@�\V5W{��n/�XИ��p��C�k�w��N�g:���;�|T;�@h�l<9��pPXQ����Ї��j��l2h3T�FI�܎g���Ό�#�1���]w�$u��AE�����B��FF�U��C��_��N�����,��/�L<�S0��[�=�]��U�D[(�^�LyE)5O����:܊ŇZ2ł+��Þ>�	t{� ڏ(���IxpČj�P�rv�ӊ�/Y�B�D9`�Ny��g�p���˯2o%��2H�t��ב�#~�s�a��	��'x�J޼~��j���)�p��/k�����Tl3J	��!��&����(�����"��t�RQ:�w0�^<߭V���s�ݙ&��U�c�a���c����4��i���t��{�Qá��u�&:8Y����-��8�#[G�'N<۰��K���bE��m��8��8�9̑�H'��S�/������J�CSm�PK�mW��Q�
setuptools/errors.py]�Mn�0��9�Ū�F�]��W�$��X��Q��r�� ����y�{�iF)7I�s�9���|�4р���M(E��8@7�>!
�#��icƜ�R��Z@ᖲ��V�X�Ƙ�;f8cHo)��{:���\�P�z{~1�����
5�_��.nB�#��(>����|Q����1t��@�ںDZ��Y��JR���V����y�]Q� �"���;�_A���U��^�߂�-)i�
���^R�+�������U�aG�vۨ�PK�mW������setuptools/extension.py�TM��0��+Fi%`��*��nUO�ު�r�����&���
���\�<�~�͈�h�b!�>��k-���,�^H�v:��[�V�w���Q9�UQ�V�ЎZ]q���e��<Eq��ߐu������w8�}�
^m@=|IN�q'\r�݅̉%��Cگk�� �Q�er�v�K�����M����z36��4)��z�_e.��n��`����;4^�A ��w�؄|��!Hk�	SqR��Hx���آ[���vdT{��ձ�*���^U9M�+g��:(ۮ�^H�
������L��iK)��P"��P�
(>bNۡk��K<���z��뀳
��x��w�)�|�݁�ND����4aD�]fbR��Ƹ)�D�ЃVr�7���}�v`�b��_�G��Z�Mu���b��b�?�:�ސ�H�ŗy�$W��g��cZ�!��YB�&��"X�ف�{�'�=��YͱN��a-qC���
\	7�o.{�@��s�`����-~Z�Ct>J����d�ѦR���}�y��9�i�l�@"�F{�D*�Dz�5�zw����A�'I�&Y���2WB\UmgLۍ�-�F[�p$K��\�V�De��ŭ��5�z�eE�K�f���e��S���qaU#7U���~���v����yJr%N	�K����$�"�>�!'ǔ�����ϑ�?PK�mW޷Y��	setuptools/glob.py�XMs�6��Wl�%�amgz����8��z��$k$�\��)P�H̯�⋠$����顺�$v�ow��;^�`+���^,�x����Mk����z	s#3���W����6�5K����'T�E^m
�I��
Ǫ��s`������W��0?���U�
����E���&D��?�Z����պ�j�$���X1��I2�����`���spP�l��i�$.m��5ӥ�������7�c���O?�3��@ŕ6vG�`�<h���0����nA����
A�XUo�n�y˫"g�Pff�}L����
�lDş1,\X�̶
�fR_�\�����֘sVA�I��_kX4���6?�mj���ʇ�a�Nf� ӝ�s�@aT�*kB6Eam|GYC-aE9���=]K�@m�OY���.�!?���i4�	>-{"�8���ؖ���իB��'�_L:��ij�)9����⌫�C��m~��
�Q���g�\�uCpJ��dJ!1�ALu��k_]/����‚�`+eL��L��]��Vޘ�q1#=�4o�?0R=[��$c</������ �` ~���
w�u�O=���v�x�/|��ET�TI�QoȐ+�Z�����)��"��G��ι\�A�mDqru33<���Ъ�u�����/;6a�i�BA#N+��Tm��7m<�꧆c�V!M�����tg��$�0�%�\s�R��L&ر�7�)ɰ��%�,��(�3�������M:�B���Ƒ�L9�;�}Q��[�Zx�N���KO����>*7ϥ#T
��UX�Q�,���s�_Y�4B�����*�$���Lj�k �_���F�r�(�E���lM.(^�=e�T���d�V(D�{*s��+:c�9��r��r4M2�5v�rN�4{F�٧e���M���#�A�T�?[��N�r��.��*���h�j,Sފ�ՌL
�a�hT@��Y�$��=#���o_�>|HG/N��]ײ��n�Zk�N\}���{)kys��0�v�C�4)���a�vy��<j���	�!�&���Y���c��/P�f��C��~=���L�Y7��a�U�n��=C���Z�^�IL�kIbՃ~�n+��ĊiC����Q&g����>��@qxBq�Y���\N[�����<�U;��N7{�9���:&�?�Դ�}]��5v�ux7�vNv�źu��=�EM�C��Zc���fw�a;
g����{�׫5��0N�o'�!ّ��l�K.:����U1�ܪ�:���^�B&�,�t|�ց�o^'ȕ��O�����J}.��1~�0*�cX�+M��ǒV�9�pxH��̽]F��F֞���;g`�
US�Einh[����Y��P��@�E�;�׍��-��3jo�>�f�C]Q[ඵ|6�f���dH���=̲�Hi��pƬ�E<��`��5����
:6{�f�.d:y���q��*�7c
���t�/PK�mW_��
setuptools/installer.py�W]o�6}�� �I��6+��5Na`M�,]�BK��YU����s)���:?�yyx��UJ[�j5�ͳ2퓩W�V�0�ʡ{�bW�e!&k�v,���V���B�G;��Z�N�]��򤅭�y��Q�ƽ
����R��o�(Z���2�L2�f�Z>���,)d�5a�]L>ggg���Z0ښ�-�*+U�ꊭ�,s�YnL���&�Q!�LY��Tn�����>�u�z��T��a�$�1�)����:Qs��+�6�$�ZY"�<$SO!�=�`�+�w~�>���ޤa�!K���,<���ۧyk�kd��sV
�����f�
X"�8�/F�JV�oX�y�`=������A���3 f��+�	Y}�7
�86!Ŵ\��0p8Ac��(j⫁���ת.���b^�X�郯���,n>^����+�ny.N����:�#�Wn��
!%�'�U��e;��B�����+x^dS&���Zj��ޱ�٥��*iN��=}Ϸ�搸@)
�H�F�i
�p(�2娪'$�����K���'�%idXXH�r��M7W�oɗ�?<N~Y���n�!(
e�U�E��E@�@gZrXC~KmU�n�e��}�Qƚ9�A
q�(�0�����6�����(
۠Cz�CAT��P��q`����Ed'{�X
�]w�Fak,������w��k��L����X��2^<'�.p��*�dt[/ox�v����1�n�+V�N���6���hy��t��\;,b��
�.6\e�BYF���=�A]�B�|��s�@�d
W�nb-xAa�JR�nI�������=_թNa��cyGyX�L��
�>���@15 ��Lx�����tSQ\�hw��^�M׮�{Aݓ���<�J�-��]2=Z�ˠ�r�������T<�,��P$P0	��'�6g�J:�`�t{,ڔs��j'��=�~����j.?ǖ��W!���Of��x_<(�O1|��;1�$�����B�"�|7H�.~�$�a�;E�Yk���v~�~~��BNd�!S�\п����Ie5Θ��)�~e����!��Jo���10�(A��#�*&+BM��k`=�Qcw!�͔���]Q�����>����6o��G�z�c#E�
��ZM��lFȐ�ߘ�¶B��d��c�O�;ѹ�囇�%�WR�����w����(K��4͎�:	7�ס]��g��bt�{?��pd��t��h/��8[�\��'�
ǫ��Paq����H��._�\�j�ۓ�����]s�cRݏ2�
��PD�:�Q�'%3B���PjZr��㊯D�Ai5,�����<+�MS`UM�o����L����x����X����C5�tѕeU�l8��]�$���G��tqoXlN�PK�mW2S��,setuptools/launch.pyUR�n� ����`Gr-�k$��SU��D�`���:�_��8����3;�9⯚��F���A��rQ�iR��΀�D�́��	0��{JU��;*�)�H�8��x�O����w3��Ff�ƢF�\�<�i��^+B�����؜�� ���N���e�(�@��8�4�sZ��7���Ǔ��ͼ�����t��U�v�s�v@�Q�k������8EsT�.�/I)�3ZB��\E[:5�+��)(��5�k�
h���N�١��h%��IY��k�^��(�b�1�t�e�t+�q��S�(֏,�2T5kG��4B�3x̡
؟��l�v��F���𝏓�ˆ�`9��:��Vy)�?���;�f2s��7R�֙�D}��?�!t��X��oE|PK�mWE��4asetuptools/monkey.py�Xmo�6��_��($/��4ɺˇ"K��d݊aZ�m.����S���%�q���
���{y�܋zpp0�Q�=ߒ��j-�QKRc{+�)g 1M��%fk��Ib)$��+�t�٥�M�m�Ֆ}[Y���-�j�*�b�6|�Fս�AI��㕝`p�w�ʌR&%�����z��zk] N�
��$����4k՟�s(�d�z���[�y�?�+Tˤ��!��/	]q��U^I3?�����y�tk��3ܐJ2����n����b�dn�ޗ3��Q�{C�V}[�z�s�Z��k�y�E	yR�VY��_�p���BlziE'�gf�"0�ᤅJr��I]�𝝐�(8!���9-�
9�DX�岀j��xk�9����ԥ�Ғ��9Y[ۙ󣣕��~QV�9�;���%���L�
�•�K�HހO���9�� >�����^a1'�)�Y$�f�]�@dAߺ��u.,o2H��8���Y:�j	��-k+��W-s¥�O��7�)�
"ے�YԌ��9�I��d��p��Կ��bE�CD`꫱� 	�n��5��ռ��+�"�5��X5���%i�O�!�Q7�Y
PR۞�B�R�5����V�A�i�)ڴ�G�����;0�y���D�l%��4�O6O��g�a|��1�l>Q�1+0{0�i͠�H
%�%�[���> /��5��-��l��Z�l&l@P�1l����y��fmf�Y4���8��Ҽ�TM���"���'B]���W�~{��[SBgGP�.��� g9��Bw�T�b|��m
�ɢ_�5O�˱A�3��R�o;��D�Ǔ�v����C��U��0��qh$U��9>��*=~ŸO� �O�
�͓�g��lz��L�O9���B���
9�ˠ�+Vm��=�ɰ��v{{}w9\��ջ������]ݾ��������Ƀ���hI�E��
��f���n��|�AÀ��[v_��/aG�ߊ)٣�t��k��K�w�e(ܫ����x�:�e�����3t�b����5����I0�	LJ��?k��T$�ȿ���IwJ��(q���8�T�A��<��5�9��4�F�ݯ(6��`˝� ��b�#,!8�k�k�
1k5�,�R�YA��$>p3i0G�⍧A��aI��p���`���	5o^�>��D��$�ְʭ]��0��*xJq��Y�}.�SLäFp�Ȧ��k���֒������A
�-,�Fɍv΢U�m��'6�:��qD�"+U�6����+�/���n6�J�K��-�x��N	��I�͆i'w^��=��>�<�ވg�rF���M��j�ao�E�|�^|��h�|X%B��"N���/ۧ���M:�!�8�|�I�xɍ��2jiɯ����Cg'�7)^��SxϘXE*��^2=���[���9)Ϝ.�J^k�=�D�l��4LX�����a�P&������-`bB��tD�"4w�z��)�Ӭ19��z�h�t����S��`O�z���BT�>*�]�H1�i�����yC37u�w7_J�b��Oi�q���)�Rb���f�D/�u�[L�&9lO�70=zY���[��
G�n���o�QsIo�*Hj.���W�kL�Iy:R�
 �륄�PSy|�E<؝J��l�c�}8Z>>�o�]UzS�v�e"�3�E��K'�g�r�M�=�l>N�����ci��❍o�<�b�g!N�,��$�2�n�t|
l��G4+�R)Tu�[b��7�Yl;Z���PK�mWSB�(��setuptools/msvc.py�}�S�X���ZSYى�@BH�Z�mƐ*�f�S.�>-��d5w�����[:�I��U�S@>�}����>j�Z['�E����˖�E���4I��8M�d�{�Q�g^��o��ь�Y���.N�c�:����V~����ly�q~�X�o��$��������'�{�B�_�x�\g^�蝷슦7�{]/
뛿
v���`��ᶇr�\1�^����f�,If��|g��9l�΋����|9��b�W���O�&�c�T5���e�y���gY�J�]F�p�u�_��0�F3V�nM�$6knEs��YoM�d�A�,Y0�,��Y��(�z0�e�������D1�I6��'u��p���m&'q�n�Y4�O�0��˿���9H�^�`_�Y��L�eͲ��i�f�����`���*���@B��]���s����<I�PA#�.��?K6d8"����8�b���ˇ��4�d��Ta-r6ow��C�\�s����8e� ,^E)�f�]���Jt��x"�x�5�%���d	l1co��8�6� GS`m�p�Y�eb4>~~yw�_�/��Ӿw�}Lbf�rzz��Z8���{�~��M���!޿����O��dj!�9�5�m��y��4��K9@�� }/7
0d��^�
�Y���(3g
�z�]�q��s�4�2�yG��>���Nj����z��<�>c����뀾.�n��������ݳ�"g�S�v3f��sӈ����ښ�)�p8�ƫ0��٬-vJ��F��??sV�Z@�(-/O�eƈ��2��EWp�HjeD߶�{o�Th�g�YG0�[���G �4G�2\E����<�]�8�i�3b�SR��s�K0�z-�r0
�h�9LA�����e�m�SP���Β0W�g	L�8�N
�|�����k��j4.�Z��x8
a}����T�a��25�����X����`w�Swu�j�G^��D���-�O�p��g NA�+�$��?���Z>��,Ǩ�`F��e�*�-Y��z-1"4h��&x�ni'i0,�8\of�\�K����t��Y�A�s����z���Ʉ
E�l�S-^�!��Dͣ�9(s4F�֍�E���`\ϷU��
EJ|���@���Rl��OGIKB��Mom������	��8L/2���k*�
�H�H���4��(��&��6�e�c�>�Me@�Z��I2n.<6��v`ɉ3 @�_��3��b�2հ�H��E�m�,�E�{Q �1[4�{hsDc�:�u��.�),��T�q�UsK�OLq��^��K�S��B���/�$C�k�x���AM�bB+��(��
x�MO{6�'S>b)��օk��m����Ǻ�I<Mڜ�@�N�[a��&��{������q�w��M���Xf4ʄ� �gwOJ���Z+�E��Ϩ����
��%'[��Ҟ[�'p�@�-�'�+[�][L������Y�
�7}н�Zv���k6���͑�?�_?���7|�~W�����/�XjT]C��X�I�O�ގ~h(�n���h�Ʊ�q���vAm�3~V]T���V���q���kUٚ�
7��,����&[��I�,�������K��t�#:a'��"��Dv{���
��Zt�����1!~Ћ��%+}�؈y�~���q��k-�#�-��2�g��bw��ܗ��/MՔy�ݗ<8�
2��2�+[�rT�Q�J�HHf�h��oω"1N�Շ�z
�9�
�`h�
Z|�3X�2��q��h�-�a�"L�٭7�c=@�e<FI&����INt�/��rMx��|A�d�C6P�
���Gq��R��y���j�lX;M�cB'�=�n}N�0E��"d��:�Q��K1�T8❲��<���	@Տ��`1-�y��ůd��`�V�Z�Չ@7�?ڵ:�(m=���*>:e3�U�*�vW�&����e��">@/��^@�����m2گIz"f�zt|C^��db������3n Gcth��Ʒ�:�����i�~���1��j���%��N��,l��m�n���3�K>!��ޗ8�Y�h��(��&�@ܡ����"�fy͢0%�)�y��wl^�@�ˍ1g����ٰ���7<�4<�����F�~���]�dH�vz?������)o���-W�o�q�a�`��>CK�;师%��ӣ9+y�4\�2R1�;�@��_Հ�8O�0�s�/��s�#$�̗F�+���dH2�U��Q�Կ���>�Ǐ;�ؐ�{����8蝞�to���{;�VmT����%#빹h�e���%���K�u+vx�.Y����o�@Dی��>I����R�(�/�į4E�����6sL
+�s�1fc�O�B�հo�/�s��ѭj�P����@��&PS1��)��I<�8����� �AЂ좰ט\��(����I�����>�J�G�Z����R"�o��_̒k����QT��r=�+c���yfp���Z�S�۫"�7`G�w]/�vS[_b:�g�#-�]tDc�y��f������{6�Z����~���_1���C�2m{�e�;4&�}�r�[)��_�ӧ��3�+[�4<f�e��� �x�}��Gԡ ����@�[:<:��ї�$�`KŒC͕��,b�9ym���P|��kd�Y���_K�b̃|H5��J\(n�������I*��7��K1@t�{z��;��tDtm�`�(����U���`,�����mFKaə��ely������?X�w�OAg�h�P����f��p�q��
��)�G����|�V��/n5b��J��6��y�v����y��Wi\<a��~��i�	���#eㅹ{�<�v���,;0���ϡ�݇:�[�UI��"�{��/�b�<�0����B�'B~a��L&ބ�!@���+jo��R��l��.�фZ� ���%�!�p`��1v2[����@ʶw,c���L�$�%ENa&#�bF�i	�!� ��|S"�e�RE
~�p�֊�����y�Ї�AC~� ��p��'�E��/�����7is�I���E�œ��� �$��`WVj�Ǐg�8�Y�h�M��8���u0Wf7��3��3��A�-n�O49|4��
����:Y�YHҊR�>f�����t�1����� ��C����S�o�ME���,{ `�B�\�h�1����)r�Ҿ2�[H�k��4�$� ��O��V<pߪL�k��(����-�v>�o
���Q(�M�ƕ"�(.�ai1�:���p��%��^e���P�'�u����h��G("�e�/�=��`�=[���_i*���i:��A-:8>-�����ud�K��:�1����{���On<�8�4�Jx�jE
fD�J�
��2?��+��Rq���@��u�E�����)�*=��g�p��x��3|]�-�D'm<.�5Ro��(��T����@�rI��}��5O�M���x�,��}�%���>�V)9T���x�0�36���Y�#�0�g0�%[�_��1P��CF��,9���<�!�p#Y"���eI��O��tn�g=�sVa�(T��߄����q�m��O�
o^﯃R�$՜k�@$B_��so�Y�6v#`b��`w�����Xuq���9���������K����[�1�r���X��/3P=t��i4Ƹ�4�M����v�F�B[�pP�_ �$nЦ����v��D�zШn@�u=�����o6�{�$ ���@\�����Lb�-$�:u�[P���E'���{lZ*T�!���@C��2�n��
�dF#�KM9���N#�߉��1�琥M��0DC�ӽ]\��Rf0p�Xs]����w�49��7�ȃ<�ե�؁�Xlj��X�!_C~��
�]�O,v�[1�P>q8M�'y�J���JS���l��by�	
�>ʆ�vb���o�j>�T��l5WUT�}��H�No[ϒK����5�ͧ-������B�mfR�L���,��iV�Lhg�T[��Es}V�*�����ʥä#�nx���;5�þ�3�W��d��ӿ�?,6tLkf��4��ڗZ�!�.�y���� � ��j���h��u8�����<��x��8ۃ���岡�]�1�lr���zXya͝U�r��m�c"�sϤ^yx�4;Z��E����|z�>����3�-���$��3a
����S��\ث(φ��֔52���y���w�	�@��N8,F8C�D��F���*x�
�3Qՠpml�c�@-�<ɓ�x�Y�\�#:Ůo���Ol�y
�d����F�"

�1:�SֹY8�;9X�i�-�g��ɧ�3L��ᙫ���9{�5(�#Ц=�gYaD�ܗ�&�;�ϴ���Y5&��a���Pu���
�
!�`<K2f�����OlQ����[����a�nj��V�=~�E*����}IL2ϰ���v�
ig�M[%|�|�*U�kU�]�RYPs�]
$�A��SYp�>
���DN�r���y1�M{�w.�l���<��)����`�U�ea$���>{����<v��0$��E�uS�]J!ớ���ͧE���U�YV�a�<�S���t�'���[	2���zX=����p��Y�<��f�f$����-�PJ�LBD?�ti�t�?�y��FO���]ET`5��n��Ϫ��rv���4+)RRX���)�!Z�[��Wx��p�
�bْq�I����Zw�e9��i��}��ޱY΢�X^�sޗ_����Ou����ǘ���x�0?P��$��h�ֶ��_�b20f?�c{�ٺ��G�E�X�r,�E��e�u�6�I��KZ�`�<�?�ǤV�.߀�D*7�������.$�f`Fw���PT���D��ֹ*0"�2��spm�
/����2G�tC�A���`㖍��T�\�6�q�ӿQ�I�L��W�N�iՕ.��Wupj:2���uʘGΪ�U0+7���f	#�bϖ�<���s��%S��;���U�w����0��]e��@�Od�>ט`\D�:�R-�H�����ó�Db���	iR�(�p�K�N�>$
�� ��Pʄ|��K�SZ�LB�p6U0?�R��[��D�ԡ�;K�f��\�3]Dz��D�Ykm�f���VC��0��69��m����au���s*Q�6����1��F�$�.��M���<�w��-X
��D����gv�f|`M�[���r2M-
n=�M֐�۔c�Y
͗�X�Os�]�-��˒͢c�X�m�Y�7'Q�ٶk1��*�����A��� �֥� t0���{����\l��/��߶�;��ŧSntp�Ԝ$�_Q�/�5:���F�'���9�tt��q����Q[�.y�YI�:<9ofCڶ�y��S��I"l�[�
�8�6hU;��n�rx��*ZP������tg޼`T�G����.��$���d���Y�����G�;6��g�|1���B��l��')�vqb
������RкOC��”+^?�έbN*��ǝ�Ͽu*�"պaU���$�8�imsJ��l�)V��xxh������r��@��#(ӏ8oZ.�qy�����"�)x&H���6�9�d7"�������r	{.�U	��O
q�nK��s5�G���J�n��"�̳�ʊGq��S����:%�E,	)�]
��'cԂ�#��>ْߟ��G�u��*�P	�56�6ؿi�sʙ�Iԫ��4���8�{�Hn{ǔF*�&����j 0���Q��!+a��)���Ch=���y�v���k���b*�2�s4\ʀ!*|�r<�I��(�'�r�D��طa���U�����+�4rx�,��0)N�	�qv�v���7�rW)ޤ�s������^����S=�s;����Ȍ*���*"Tn=��:5㻧���0��,��/T��S�Q>8xC����-�W"ȏ���5t1�W���Rr%k�eg`*�,����x�Ë`W
��|��ѭ��庠gY��S�~~��I�~��섅�C�|�U{�G�!^�=�n��90���y��|�ݺ!�ŇrDQ�Q����}��3�:7�
V�s4��M5�QcR\��e�F�./�E#��y�1b����� ��b�W���	+�؍��}�!��_��������f��T�DIBmC��
_��3K�Eand��
�xMEI�+(2�›��n�$@#�u��L��ө˛�t���Bs��N�mURd�氀�u�"թ8��9��xCR_�D[��ȳ�6��	W�]K���jș�69�(�߯�O����|+���VV& gR>pi�I������@qRqj��?��D���]�|�z_��UK3��-�4�f$���j�����]����1]t�G�:n�^��cc]t��7����oo���Y�IJ�L��_��(-���/�oD�oZ8Eae��۱������R�
XW܀��]���<dA,�u%��9����;�b�)Q�фH�D[���_O���6O	�S�E�eeJ)���
x,Ss�c�u�¢ �붿��	�e�2��.�t�Ð���z���F����2�n��p���i��'��S���`~�t���a��g��p��"�Ls�
����e�.6���~�(�m�X�W)�x}|����v�k����X��9�"֗8BC-��N�,{�r�~t��v�6]�懨�X��V�E�N�<��vy��!	���H�˷5�����弈*���u���Ɗ���}��Pc�[���4��
f�N��.o��
�\bE��bظ�I2��=DW�G[�v����U����+~�\
�e�}�r���K��l�ґ�P�[�\����cu���C���(�&G�8
��KX��W��z�|�%z�_�����$dzmџ��wMO�(p��<��E�ʙ'HanH��Y����Ve�Ӫ�{��u��!������1�t,�K���$�L�if��+�w�{q�cz=�ı�
/g�����/��@v��(���{�*,/�#�(���/�#�6�&iSۅ�
�9�h���.��\��w�Ah�h��3�[�"ׄ�L�a��K�|SH�:��% *��l����n�kw��L��t{FS�!�
��Tw�U�b���΋ݟ|�&.ojČ6�/��������zճ���U�aW�	^�*]�Z�u�@;Ł�,r�7����ۋ�M�}ut�E؅��I��V$r���`���
�x�Rऴ��PU�	-}šw�J��-�
I��[1u�T�[�Q�~/��y�4k��M�z��A~��6i˼
���}2�6̗Q���`*�sހȐa&P����J�&/<g7y�‡�.E�qQ�Zx7�]{��r�n�V��EAPSbFcQ�����h�	@��rºx��%���!x��S����{��E� �)!��`C᝾�%�4Z�ޘ��+��8��RV��DsNHt�LE���Kg�_{q��� ��k�^%�2��'��9t�.���-�`�����ާ���B�.n�z�2O&,��G�`*]/3Σ�5�(����ښc-g�W[��]��;�������;_u��Y��}�2l��ӥ�3���'��\(K���|����-#~V�Fm�����·5W_�U�[��c������)�d��q�}:�$����i1���v���,�{�|�į'G�>���o���Y�|
7�0��cEy�ȏ�!c�7�Y�
���79��T6j��X��36�[�Xg,�s�>���db]�M��ȼ��A0�,�y���-���7��[]�i�f\����(u���K;�G���v������5�R���o{ս�~`����7հ?���
�r�
hܻZ�q�d�;17q�,T|�Fic����1�'7Ȱ֯�f��o3R��)�6g&���2��c��0�ߪ�f���5g,�@�T�
�kF�ڏV���&��C�1<��QZ�=YK�2@�w$��s*���j[�l%&�
����j������To�ê�v��.��i#�L$g��$/�N�vꏢx�<���}��������i�Q��bR����Q���
���
�)�kxZ>λ�u!u�u�*�u���GB�P�*y��P��i���uE[i�*��)���.�[�j��P#���a;��r��J�\��c]��l9��|���`�:��ofU��#z�H��3�E�H�����u�����Lx�1��Yck
?��k,���D����@�(�.��
��p(�S규7�7��F�6{σ���Q��n��.N;5L<c��0�V���5���C�׺�kc ���h��x��#[�ih��:�l�Q����o-R�K�|`y�7 Uz�N6$��5΁�Gu�ۛE��:L�1�����Y*Կ6n
�?�Y�0r�ot\E�m��uhL�h�髖AE��w���Y��T{��_��/�li_r�V	@��eʙ�`)�3qg����;*���p�3 y�����q_׺䎀� ��q+�F�C�bz#�5�m�f�Z�"&)��Q��4��VGl-���!�2���Q�ш��:nSD���wIۘ�������W�^1�a��;�|?ڭ�&�������)�hMed�W�-* �
#>Z��/3�1M��1�]}��a�n|Ӏ���c&ߘ�.�iބ�2=�= ��T`!�'�,.���إ9=��F�+3���E.n��&�����v.��H�f�cfX��w)���E�%�UTYl�W9:W�Kj���5�A+�،w(��W4�q��c�RQ�xWt�N�w$��Y^`tT�.����/�����[���G���Э(�y�ag+�|]J
�f�NQ�A��)��9��a �d��_�24�9V�Θ��"�CQ����u'^���h�LL>�9J��wS<�)}�>�;��~��,��A�C�gL�[mj��Q�C��%�ʛ6vɐv�w�2�\A�µd
-h��YY߹f��۫��LF�W]�u�b����V��jJ�Tg�
��	�:�ɶ�f��$�f�����*���a��^2_]m�8O* ��
�:a��U���ه�����W�f�e��=��<���~��U7s�)኷�y~��}��wz�PkW���"�aե�Un��.�ܧa�P�\1ƺb����}�=���F�Wq��\}��$�u~4GAŕ�����~��#"՗�u�0����]?��(X��B�Θ(q��a�J���)�ܧl"#�MҧR�,)uO���Mi6��U��������&;LW��m� �KȪ�=���@E<,��a<���_���;�5'��dK��'�l
�Qɘ;J}�K���/�߱��x��1b�3�Mm�yȯ�1~���
K2��
3�W�lhB+�ԣ���؄�1.Į%�(���_�Ob6NRf�Z��G�k!��W��{��ظ䛓��Q��9
RYXf��=��ðay�cow����'sF��S5�ظͼ�6���;,�SN�Y��0Y�7R��&"gW"�~7���jV|���rD+qW��jP�vX��s��v�p��(�o�ۻ��Ҭ#��4.��3x# ��I��*�TWRAk�d[4ʽ(�
�ۉ|O���&/70�QAn
�ǽ�L������U����3��f=���o�v�+\��`����:�J�)�d-`�I-�w��w�������kQ���H�
*�o�Y�B
�&�S�����;C�vݏA�h�>�$� �{����f��2)�Y:KkХѲS�jУj���1I�C,����FgeB
&����Ze��_��J
��zc�ݿ�F��ɮ\��כa�:=���I%_��	�$���Y�oX@,uQ<M�-���l����^!�_B���gڻ�����g7y�]e�E��9�L2&�#�P{`�����+�:�8)��!e�lŚ_�~�q	�+g��A��ق�A�''ւV;�����8��ast��<��pU��)�.a����|��x���/��X.�+̫g�]"7��\���:��0H��G��:~�*�H��*6�D:�9��}N�G�{F�|��o[�Н��o�����u�]�&Th�?��,n�p��q���k�@���PK�mWpm!Nsetuptools/namespaces.py�VK��&��W W�q���nn5�.�V]T������x2��=�m�̣��f���΃�g}D6�zoԩǨt@�\h{�M?U�>Z��n�뵈Qt[O��$�aI
O��QK@��fBZK�y�C�1�=�|����1O��v�G�Hp#�8�@��=����N��e�8`���tA��@�N/���r�+-���l`N�NC@/�T[Qx�"��F7�OK�$�1�1&���#�XU�3ezK��4e�h���UF�tnq��b9ݵ)f�[�a��p?�-� �����E��I��3d[�$7���d}�����	Y�T��9b�D@�֙��=���κ��ͿW��̩�f��H5�ZM�r��$���BYhX;}1X|/�"6�F�NȂo��u���r.U�I>��Þ����@w��ТOt
w+��ʐ=��F
z��hu�7�b_�G��M	�!��
�/�F�o���� '�#��M����|��N���,�I���J}{
�:<I�<!���.|���L'=��Ƚg�~f�S>�
q�RZQ��d��F�k���_�|��fH�A����9�:@��0�)�q�u��˝�hp�7�S7#K5e@�`-ͲeZ̯��ͫ���W��C6���Ɋ�{Wxi"�-�H��/�GDש#t��$Pt>�H�ȣ��B
�^t��횫^O�N��D%P�S⿧�����8�����[}�"kmQJ]U
]
4��i��ZF'��&eri�
g�}ft~�
�R]-eZ�e�Lz����lw=}��vή�ݼ6W2{���	U�)ڣB�������q�����^&0t����l/�^2]�.�W*��Ui��qL��X-M�j�g�d��H]

YI�s��P��	Z!�� ��v5�N�U�v�W��k�6��[�.JBS�,�5�
��xq���fuG���+ڀ�ei\�N�`��*�$�I�5E����=�O_ �P���Q�Q��0_����@m��V^	���2b�
�#欃���a���-����D�i}/̤4�R���'��E!�B�?�PK�mWT^�-Λsetuptools/package_index.py�}kw�F��w�
u=l�';��v[N|&����5D4I�@�@ɴ��۷��������9�)������^]]�7�_i�Y^�i���e:AV]�E�fy9{�rU�m�l����j���n�X�y������U]����k�6�"�� ZQ�UUh��i]��iU��*�Qk�0��U2-rQ��u#$ԧ�[-~Y���R�uU���j����	>u�j���D�^1��|u9�Ԣ��T�.�^��ߞ<�ǫ�M��x�n<˛��/�LU9�~��ɛ�GeU/�"�(&��]���~x�����*��r	s���&��M:�2]
��J�
�C��j2����`�Գ�O�{�Z�q��7r̘'����ռ�I�<S��X-�i;]�&m��M�����&�!
��'���D|v)�eU����e]永�������=���O^���ɴZ��Q�K����t�d������O�{9��W�}���y�=l�E-fc��4�=�N�����x�?_��|��s�;�C>L2@�>v|�—�����E��ۼ-�x��p��aJ@��_���|�N�
�͢��,���.W_f��&3KG��O���c
 �{?��n�����r/a��}:��r~	������N^�}���[�9HڴN�����}	���
��?�fU�m��M&iQL&��f�f����#$���ɬ�'�9�'�Ɠ|2��A64mȌ�%�-�<<��޾z���w�w/�?�M#~���U�(�:�d��D����]T�e���f�L�]տ
�� �&�v�,���p��Ъ�8��[��P=��4Q�嬊�s��W��^&fO�6[v���Y�i|�[���b�_��g����0�6�1-ւ�h�6��@�y#:�8�O�3xY�A�4Y�x�B5�Q��;� �
�XC���™���.��%l�7<�u�p��D�q��eU�!���߫�i�B -D�`P����5,����D`q�0��	Z\�#�1�D�Ys���(ā��P�����Q��Z�tz<:��<����=ԏD��h`���(�������H<=5�����B�ߋ�;�Q�̾xp�)?�:��մ�����?7���`�$7\�y$[���m��Y�I�V�=��M���
��Y3]R�f�d@#�Dh~�x���:�/Y�=kR��/�B�r9<����Y���G�0c�l��HJцd:2\x����8����9��zz��!���?2�a�3]�`�<�aV�0�/�j.��]���(�fi��I�h���\.!�&C`[]Au�o0���]s,�,]h
J��D��E���E����-�i��2�P�nq���Ǝ��jTӆ�q`�G��#�8��=r7���W�Z?Ll���j��c3`jpGD&ʩ;�����;�/�&��”cS��.<Bʂ�� �j��O�����&���j&�Y��g��p�p� K��aL;3靃��@��g�	H����E>_W�ƬQ�kJ��NK�*�v��v�{�(nB�]�1{�z�0e	v5K�f��+`Z?갈���ι�ܪ�6�st�A]!���'���Td;�/3k����Ϋ:oa�Pú6Igh�I���
�ݔ��bPg���Bc��H�&�.���
-
�&��RN�2�YbBb�8�
mWV�1q��gWz�%�CD���䦀=�N�K�bh�,j����{����ڞݞR;w���NI~��DY��#"Uh 21���Q�׿GB����d�D�+�5I����F�$dA(J���{�<��om��>fw�ڇ�`
�Sɐ�|ϐ�Q�:mE�Ȁ!�DG7A5z�����8F�;W(���c�يe`VrS��fQ�aݦ�y��s'h�t�����h�@&�����/m�(g�T8�~�/jjr���2���4,��O����mm�Ӂ\�& [P��<	iV6���&��` �o�?��F�5����i1��/;��@��`��"R0�4߻�	"32�5��fcV�D�_?�*�1��4��w�R��EЬ֠)z��Q�
�h>��0�$'H1�*��֠j5��������j�LNa	BZ��~@Z���l��a㗛�\���_�G�
#A��.��R�]%-�4�a[��y�ti����
�D��2�j�%Z"��z��1$49��V��e���tJ�+k����Yc��,�lt%��z�@��QC&2�L�-N��Ok�ŌB��"5R�@)�ZH;�W����}�_�d��!�G�g�m���%)��<���D��h��E��c)�i]H�봜��p���b4Az.���-aa�ɿ�\B<=^�ŽW0��%f��Hg��S	����&_a����X��q���:]���\#�Jʴ�c��E�&���hY�rE�9ƭ�v�-��cX_с#D? ���J��ݴ���{���Ž�`'FN`z��=[EK�@�7'�����=:����Eя��݋�q�Ȋ��	
Pȕ��q����X��&��:�6�E]]
��M٦�����@?��+g�h��h���b�/v�W ���=�f�J1,@���0�I�4�G�?�&�C^\<��� �3�	G���7�F�O�Α��Xnp��"(�F�t�J��n*`���0�c��lȩ"X��	Ҩ_���F>���V����}J��ùLL�LD����
G�8^4x�.}���5.�g��D�B(
���3�B��)��2F�.�*�A�k
iZ�!v����hǟ��޴+*xZ����.��RԮ8yz�ٔ�Snâx�
�J��t*���YR�se�	!���,���9��y�P?`��P,��'�*�5Y�
nǜ�2��
dh�9!�Oض��xĸcdp���_<���?��)�b^lC,c�:@/.��ِ��H��5��u����#`Da��pj��ē��-�����c�-J6��"A�ǯ"f��<j��𿣣��g��>�������e�y<;�Ňxn"{t��fx���cC��$/�v2�t�C����m�p��M�S�`���t��m�F�0��*U#��E��ǨFX��8���:��]O1\IC1�lV>�⠮�ot��1��
\�c�O�[�A�1�I"�A�3o�G�H�����a���]K�e����V�E�i�`D��fI!7���eG1�98�Gv���	Ճ�N�C��(X�3��>����cc<q�[�0o�)x��YátK�5��֛�YB�'E�C�mW��j�ʓ��49LP�F]TMی��n8���tr�.�BȨ��l3i�b�r,Bc�0d�&�t�ի�s5°�`p0N��]��V�� ��dIX�ۡA��7��LP�k�c��N�����릓�tE�.�),����e^���&�(&;t�VZ0RC��(7�ўt3������c7IC�S�4�A�sU��]E��O`5�Cv
�u���?&�s���8x������:A˚B9ȖrIMDq,���ts!4h�[l=��9/=���q�UW��ھ���3 #Y�p�$�D��7| 	�#��n�`;w�=��R����t1�Y�ԣo]J�	/�7�.=XoA˙T&.��h�!у9�4V|{6�u�=6��o{����B3&'��L�@c�Dz�۠D3M�tڮ1`|��]��T�!���N]4���A��mn'��)�,ѓ�mP���r%O��R��3C�r[����i0��։q�6"�s�X�F06��^� w��/J�m1vü��������N�L�}��5%�Y�,A�U��a�>Y��m��2q  9KH�n'4-�o?��\�+����u��Q��3j7+��ba�<厣�L�
l��%g�R�$
��A��d"��@�"�E��qB�YdmjX�Q�0�(Ͼ(��x0(�Ђ�h���X��:�4��N�B�V�ڗ-��	gs.R�a�^Y�ۂ�o�50*輼<�w��0E���C�M_p����Pz�+?)��W����(8>0��`~����n���c�Y�ǔ�b6$G��^F���d�8��o�9��W8�!C�R�1��c���	�3FgO3��0+� �0�������G�!��{���t�_��Qa�J���d�RIJ]mwnQAA�@�kK�'ХN�~������@|� ��.�u �Ƕ���72� 2���\2�Գt��-�����.��g
l!�E��A�bˊ��mZ����]K�2!�E�7�הR�mB{j�5�<��o��^���*�vr[ߗ|���Fz��F����/ܞ���u��I�98Z�/��?ٵ�m�M��/��Fv���"�
ߗ�f�@s����C�y�g�e��û�θ�@q��.r�\�9%w�n�7�}D{�������vYW�Q�N.��	�dc��x]� �9�!��L+�FHIG{�vj
�M5�~��1zTuz��D��� ����:-i:;���+Ǝ|��@
�C�zx��Pi�p����I^���ȾV�r���D��RV�DJX���Ua�Z��tn��D,Z���z�g��f�������` �˳����H��:�ԉ�@�I�ixz��O��+r�Tϗ�&�?y����ۓ��^��c7+�ZA\v����̢��i����d^��)rSw�3+��lȸ˄����=N�c�ó�;�}&�K\�U�-�/'P@β�W���E*y�|������Ha��j�S;8%w1�A���~�O�p=�G�к��������ئ�uǎ�)�D�}'��C)t�"�LMeڥ*�I֤>吳�_��4���,Ay����7w�.��Dտg��P���	���l�xx���<�F%�x���:.�^�d�^`1¶�(Ĉ�]h��*���-R�*�8��,� ���� �m�� 6�p�;�5���s��ˁ{J�2�-�ڄ�^G`�xٕ�,~��9�����4�;M�א�jƽ�~?�����W���BcE8s��juA0i����ty����80�4���s���ѝo��4�����g��(�kl��>�Z4tks�s;&1��u�;�̇�MDn^"��GU��3���G�=�,��u�cf�<����l�+�ႌ��ģ���ZS�����u�Uە�r�(L�/"Q�q�6�����d�=+����r��p�1�!����]�>���	��V��xW�y���l(�bӓ#ϑ$)fT�O5��P�8q�m;�?��O�0�E��B$9��}���J�I2[C�K�9�sl&$JawJ�m/�k*K�M���0��k*��֒I���s��x���܏L4�Q�v��˒���e���lբ��^���1N�'v8�!�M!�L`��-�z�_���Ł���5��1�Dc�9��L����f�Y{��ސlj���r�)'e��ג�2Iehe���Ֆ���B��nB����<n�B��y�L�p
P�`4�%-�<P�ݍ����]�q��u��&���M��3a�v��`'0�_vT������`���Q�/�{
�,�tB�Îs�I�����(Gx�c7�}��J9K�c��9��C^�ڧ�s.���G���5���l���U�r�O1yV�	0�ݶZy|(��T�y�ԉ�S��8웅�t�ٮ:��R��pW�wւe�g������
&z�'�+n��~0���
s`Q��^��ϣ��w�Z�	�e֑�JR�S��"���Z��^(	���h��;�@['g��`�ٳ����w�I�P�G	]@�S��\�,�ˤ�k�]��H_!
�"��Dl4��†D�ۜ9cV�PF���9�6i���cr���
U�E��)9�G��\�L��'e,�Y	P9�Vd�lx4��}	�Ա�z�g��q�V��e�|��곜ч��V�f��x�{����0�H��;C�{�=�^�C;�_J ��x�}��@����*ҁ���ܐ�	F@eBo�K�XnCCC�MU�0�N��)�	�nF��rhHQ���o��t��bA~�J�L�&�~v��)ߐ#�(������#�#���\p�d��M�L(0V{��e�_&�eQ�p<��M@�
����S�p8�[q�b��l^��	�-Z�)�j�L��+e�Ճ	�$3�O��kg"I7�ʐw ��J�j�%׮ffJlh�N���bMgx�`��7���ɶS����}���r���R
��é��r���BY����po��\��Դy,�2M��rٞ#
<*��c��di*�u=4�2�˩�΂j:]C�lM�g�̟�����{��$����{:j��Xp��O��`��F�N&��ׇCt*n���M�Xu1؃ts���d�|�=��Aw.�	��~6�oGR�TԾcY	2����d+����V_�n�!�HX�g�a3}��[��,���r��"g
�A�ĆJ��{��4P����:)��u�]Fb��d*���\����+�r�d`��jR]��������
`;�"��oK�5뼥�whP��,c��yn�wnif��`�,5�{I��j�;�h4��(�p$��P�<�x�	M�v(�`�+�w��,�"��b�d��b&9^�5���d���Mò�C4�J\r�
�&�N����6�5���~����G�Я�Z-z{ؼj[�=�G��ٹ���2�T�dO�c�����Zq�r�	��}ٟ�9��Ak� $�3:�J9=d�=p�);�r�x@��&]�CY��s�A��`��;�x\ˈ(Hو`�ZS����s��j�%y�ܯ
��A[��8g��%Ɩ�f/Ff�9x����OѺ�U���G�1P��W]AA��D��)�����w��jtR�XZ_*s~�kR�
$Þ�M�`�ʈ�Oe���N�N}2f���PU�S�0Q�m�B���&��E@D��0\��M����}P}�\#˜�b<?�D#;/עO�V���a}�ϑ�Qw	:�!*��?�!�H�ibS�=Z�9�,�m5!�qb��m|ѱ�� ��i����Yl����E7���"���J�i��=�$�4�u,b{}�-`�y�/O:����@�[M�F���Z��$��a�$��t�D���n���K��*�]�(Qz�"�k�����,��A��o�v'���mɵd��5J�biD��m�i��u��[�]�N����ξ�b/�g�;��g'�ߜ<}���ٗ�a��GX�V�)Z2�+���/�G��my�����(�&�$]w�B"��f���؊(t�`.����X�r�f��ۜ��g�S��Y5��]��C�.�i���:,��`1H��.��;u��:@jW(z�oY�:U!�RHU����p/����X9gm�C�p�Î� ����U�m��kd��c������]`0ݍh�:H�]�Q�3w<L���k����pU�/Ч>�J�X�
�/i��H7QRob�3c��ϭ����fo�9�t�TPo�m\�oɪV�U�7���uH�t��'�x�� �ϠC�������NR'�|T�N=Ե�;���(��ީ��m0�l1[�C<~z��-7i~�V��?�j��+>XO;���&�V��Y	���-Oޟҕ<k#Ez�t��\���d�ei�:?�xd��a*��C&�d00J���&Q΍�eItkk�wDyګU�:kit�a�%�Ld��-����C;@��0�ʹ�W�*���_�Ij�w�	�vh0�z����GVr�6n�ʹ=��\'����g֑E�~�~�/�*�k�+ P��R�U��خ���"!�Suٻxۋ��7.W�����V��m!�%�F&�p�.&�T��/�U[�f�_��%�+&���ֵ\c1��F����62���K����0o܎_8��Gs=r�3�e���;��s�9�ti��)��.O���2�@9�p�{�"I85jQ��u�S�o
qA�f������٪OJ��~��՜h}��E�׹xN�M�;�*U�J��Z.��bR��j��-ƃ�?IU�ٞ�M�}.�je�mɭ�iD�iF4�%F�{�߲ZImZ�Z�R�mGI�x��S�Q�rK��Q���Ɛ/d���[��ɬ2����[h8B�'�e{B�N@{-"��V,���>"s�ch�8*yQR��o���vթG�.a K�������n��aW	扟���ޮ4sلjn����!�P��%߲r�%�_;y&.ɼm[��9�+�RMU�a"tkmp�B3[w��Q�Әl#��<_���6m��w��P���(
�E���v)��Y��t#3	�-��5�_� Cf5oE��$𳍞�MPbI����69�6������_yle#��_T�7r�0�f�\��B��V��
�IV���a�#L�����Q/Y�U�`c�f�06?��?M�]ޑ�5�LLTe2��r�N%�G�~)+�V��5�u's��8:�{^�Ns���dyt��uU�D0�a�N@i�C�oO@%�ky�ʐ��8��֯�����I���1e/�;�<o���n9���x������N�
LxA������`��M��b�N-+Y�W�D��RS�5Ygb��e�)=�8q.Ky/��gf�@ꍵۃ7�dgm�j�ژ�N��}E��p�����1z�_0˕�٢C��#P��{]�+`��%F�Q3���N?���.Wh���ʩ��эPC��!�c�@9
��� ~�F\��}v�HJ��5�K�ޱ���a��w_G}n���Y��4�!?OK���"�1���C���~���T��|;� ��)��Nc�VS�ȕ������z�/�m,�0`��`���O�Ϡ��R���/R;�Oj��
o�c5н�+̳j�K+��n�Щ݃�u�rWG�W@}ʻD��Y�7ՂW��|7~R-�������B����98P�Ȫ�ߟ�1l,\(u���%t�]S.�/����Ј�ysE��֜����ކ���9]Ð�P�x�GQ}�*��!�I*��uUgco��H��;
n���K.ߘ��m���tن�0�x;��pӺd~�$��TAjO[�Og�a�.ʫ�O"�Dᄩh�AwGj�bv�X] ��`We}��]>�ž\Mf�I-�&v��& ,f��~Q/�N��;���[�@�+;�Y�K,�m����BG��L���V\K�ƞ��/\u�p/}��|�"�Pv�p�W��,T�ME�>S�h�1oc0��.�=�k���u��ޭ:,�Dg��fᮈ����,ԩd��6�f@�0`�����/�\��S�K��il͵�0|�ި�{Y��vBlFOu�����\���U'���;���������]��,�+yM]a�k���hz�q�z�L0�hH�;�Υtq�~]����v�ߪ��;��&��޽*{{��;.��o����e[�)^XCI�n`�3QS�m�ˆ�|��Mb{��q����C�icZ�K�H��'{<�tx�F�_��<�_?��������ٽ�������}��Q�ަH��&��OIJ\/��vz�}f(uJ�$8�qas��)��Uk�)�Ҟ�v,h��$6��+ߠ������#��$	�S�^�$����O����d�1t�<n�L��_���K��b�����<�[�e���CIS����2C���/�'m� �#����؜�M:����mk��\$>�L�D��q�.��t��Y�k&�u[{k�)!�{ٗ��{J�	kJ}�ա��Z��3ZX+Z2:��u����`����f�Odl&�{�����>�|�D98�4�����t������~����j����g��G���;��́T��^��b%2
�>�[4%תk4�^@&T�sVȀ{w/5>w���Eޏ�6Gw2��������y�Bv�J��E�%�5t������\||,a%��dX�#�m0����d3�;�*�nP���†�*}+&8����봮s��X�t P�)D��E�Zd�:I���j���"��C+��Ri�v�*D�}�')p�@��hU\3���U��5g8P�r���|�|��}x���H����;���J_�qG����O�r�ϣ)�CY'o�k��5�md��[J}G�`(�� ����So;)Ǹ����K�i�S��1�>���x8<c�Q�v��}=�����Y����Jˌ�E�SZ���5x�>Oݽ�,sh�� ���V��6��j�=61����ˆ�.t����igH~-&��|Y�C��z�:y���)���T�U<\w;��zK�.3�L/�0���p�O��������[Q��\X�5�֛�����T�r�j�� �7u1Z�ߥ[?pj0��{GށE͋G�\Nc���R٥���|a��uk������i5�(M�Z��W3��i3$��<\��{U��*�\%�×�)ߒV뷪���8i�?Z�ƶy��@R1�ݐ_.����y��V-$v��c�[B����c�*K���U<]�>���[*g.�D��a/6���>E�ȩƙc
E�
Χ#���J���_9k�������'���{'���gsE]�� ���͹0��������p?ͲS����ݠ����u���SǶ&���f�&e�#��Xh�ÎP������a]ŏ��C�
>h�b�Ef�`�;�U��b �]�c��NN�5�:m����[��q7�/ɽ�KuWU��a|�6�����BŪ��c��_u��#o�a`��r��0�g���FO�$!���t��dQv:˘Hv޶���u�!�d|S5o�*	���#����X(�74+��5�����h8Av�+y$��H.����V�5[%�
�ы y��݂~�Ӎ�K�:r��6<\o�ƾ��l�b��0^w‹�NO#8�@U�vJ�ƾ��+Ht���d��Z�ξ�f�ȵ3i�F���4�]�4'�e�ȗ�x�Ij�VN�ïB'^E>]��n��|Y�!��a�h��t�_wU�h������Gw��������8y7y��W?��#�������f��؎m���.��Sٿ�|�����Zu݆����v�LQ�3�}G��J�qz�#�n:E��o+z�+Uɼ'�y�sa��bx��b�4*�1�s��l��@�9]�kǝ7�xz�ޝ74��d]o�3�"�J(��sy¹n����Ҡ'+?U���Sl�/q~u�O
mygԌ���=4���
�	'����K�����Wg�9q�D^���s��!��CT@�d��'����\'{x���>�>�М��Gn��J�P8�c}�ӌ10c�پnÙ��`���fG�����<��z��~p������b��y��1i]���OnV��P��\�Ac�D�xi*����z�*�'qG"yr���.�:�� ��PK�mW�V�D��setuptools/py34compat.pye�M
!��9E���(t�E=�8c:J��޾U)�-x?ǜD�������_����^e�gw"IF;�Rഎ��@v�mɴ�m"���C�U�תt�{���v��7	i��kBr��?;v�mi�PK�mWQ�짟8setuptools/sandbox.py���۶�w��Lr�h銢C�+$�-@�岬-�gղ���/���)��K�a3p~P���"��5�lY�f�����k+vͺ(��]7B�������K��h��[��U+>�e��#M�m{�� yc���l�J����m*��;�	5[�z��B�][�*R�R13����a=7Xn'j�-��T��Y#�IS�v]�]�Z.[u(�M��<Z|?c�̐�Isl7u���+,�U�!y��/h�q�R`�(�Ћ���}̢��J*�7�V��9�"֋�hZ��5ᔗu%f)ȥ��1��Ҕ�e��{�;�R��Y��W���0_��g� >y����,j�DQWv\v2�k`���Ś����ߐ�%�-�/Ւ�u���a�|>����7�
�;Q�����L��,$7���~�T�^o_��@�����R�,���Aoy�в\,Y����*3~a���#�w
�!/Y�D��G8~�qň'`ߏ�E$��W�VH��{�ry���hJ���$7J��ci��HIU�j�ɰ��#�s�:��5x[h��=�~�4�h��>.f��q���(�\��و�<#��狺ڊ�#��m�L�K^H�|��%��$8p� u�>*&��[kU�ùi��������3�V?!s�c2;��iN��'�Nm���hRZa0;X�����ٿC��A��J�{[��W��$7	>$v�2}R1a!� �Ph�e#$s+Y���:�Mi%L��{�D_~T踲�w��G��(W{l
8[�XT��
i;Y1N�����h���#��=GϘ��W�����؉�WT�|�J�&����J�I5E-�����H�vA>` ��A���P
>�R��y(�H���aB�iO����G�74JI�,z�r�ހ�Ɂ.���(�mZcEY�"��ze[��e�o�IT�q4�B4��k

*d��J�kO�8�P�f�9���+o-D	Tix0%�_H#I&����IjM~R�
k�������4JubOC4zʞh���Đ?s�`��G�
{��ϑH�k���<���y@̎7�x���Z�\��׸�McI11+�mc˗��&�n�*&Pq�������ƥ��6ф\K^)�Aճ�!T=pĬ�I ��k�o]���a�]��٬
�9?��sV7G1(����ץ��C�`vMTŞ�w�^��c�*�L�*-��mc)�yn
7�,�����M1��;��Tv�Q�
RFK�"��7B��۷n�5��p�Z�HL���,T:��H�dob�ja��p���}�Q�!JHk�����]ws�T�/�R�b�YS�4��C�9���cN��\Frs�^�y�_���1�JuV�6��.�~�8'��/‰g1��'�k��r{��hF���	nV�~[�O�p�t�9�٩���/a�r
��k��|Qb��L�j�2�zHј|��sm��_�z����7��ϟ]�\?�B�N�"�ð�L��S*���-J7:`��5�J�Ft�5�A����$R�=19��xڔ�mQ�5?A%|�E`qE���=��y~n���e�+k\�8wܔEGI�d_/�?��I`�%�*��b9��P�W:�I��=�)�ʞ]pӹs�nqx����Y�
�}��<��8�ݻZ��CNV7����E%�zS,�m��������H���"�'��mU����|�-$&"4Ю��<�4e��@�����WΡL��#�H�%����؊�C��a�1��A�q!uN\{ha��2���,#U�b��ڧPrCjz����}�&�p�8�m'
|��u媣��"�Y��\SGi�a���L�:]/2�`a�S�����}���a����}��"t��0�rR�6~���gb�H�+�yi�P�=�9e"�	f�_6���sN���O�����U�|�ʵ\�����R�)z/’�X8���+Ա���8�.q�^�*�����(Mw���c�_}c7\\�Q��� �_B��1ڣ,�+8�1�T
��;�@��]�_;պ���ζ�w�Ao̎6��_����e��B����||�P�OI8��u��*n#�A��+9޶R�&���_=���i3���z�֦`�� 5"k�ne�~
�n���,UXz���>����Jo�Ď�ޚ���h`�=F=��pQ��YPbN=�r:M1g!z
���b�6�P���)��|u��X֡�|5w2E1��o�t�A#d�s�(�pĺ*\�����~#�8�r=�D�/��6�x�xH��@\�N|ղ�ł
R���V�<_����P�-Y����ǀ����b�Z|�]����2o�Bcyj�)�-�%�6e�������s����ˢ��:����2k�=�B��9R�xO�3��ia�S �R��-��a�@��+�����(�@�E�t��|�NNL?-�����S܌�9�4�$s֚O-��?c�����y��crq����� ,��!���@���*��ޜ�`$��`M9�(�Ⱥ	RHAY"�.�u8R�D!�!�\�c<�Ō|�;eL�6G_�`_�M���
_�Y��Pwm����FK���������	{$�P�P���i����!�'�tV�IP�5),���r��$�/&�ݞ������K�=���_(�ljv!��
6����0p�掟7��R��!�ۓFA_��3��L�G
�G6JP�ĞZl!�D�#�IL��\��c�S�5�\�7�RP�o���5m]���d��b
�8Ъ��s��W,z���`�#��,(mM����ghQ.�UW���Yz��������z���Z%f�,�t�J�QaP;{M#����H�<��S��5��#�(��#�m�|��C��fD�l܊����$�Ɔ��s&,48JZht��蹻	��GI��j���i���d�@�
붱1������٬�����n����q��(}-a��1m3+�'z�%��N�/<���*F��j�˸�?���^�(��*@#ź�A��/>C4\�U�,�q!��ݫG�@�K�~��coM�}ݴ�;s�exӋ�t�`�<�6��ĩ/d�|#5]�>�ċ����d�t'�h�4=�-���-��5]*�gz2�xqB�������|���9��5?��/M�Z��Sk)%
�S�S������6X��Μ\���+��q7���&H[彼���)��'J�F��Ƹ�7�#q���&�
Yߙ�;�FW&�c�ً��o�{���)������^�#뜝��»�7r�^�b��8rrK)z��������n.�M욁@(��
ݿ$نc��y�b8�H���8]�oe��E��В�'K��qx�M[��~d�h�����c�@�����L��;��
/Z�&�{���w�}w?����Q)��DQ��������z~}���󓿿k5υ��|�s�Švn�l�#y�;�_�eB��OCI-S���Z��K��s��-�2���z���_ث��ٻ+�x���g�����k���z��)~^�x�����/ssCûY�{���)�o��z�2t(�1�n�#���%EG���G=\A�[��ߜ�v�E�ƾ���C�g�]��#2�O���=��O}"wM�}��"�
�I�	k>�Xw�i���UޕB��xa�X\ru|^��-K:��q_�cH�<�nS&>r�r؁�5W�_�򈗿[m ������GĢu]Cy1/�zj+�z�QKs�E10�
�	���1��@��Ai���)a�u) ����_�^"�#�a�nP#�'<<Ko�OH�.��F �a���Z�uW��*�Z�")�
o���Ƈ��}�OG�&���
����m��m�-f�PK��VS����setuptools/script (dev).tmpl=�
�0�" �6`�a��!�੔���[k۩�o�͜B�/�
ʢ�dաi����9kv�����ޒB��E9m��@�!='��ۿ�w=X���-*o&��3��|�u�47\�%�}ly�Ѓ�4�E H]�@����6&�����1����~�!&_PK��VS�3��j�setuptools/script.tmplSVpu���q���
v��RP�(.HM�,�2��2J��sS5����RK3�R���l��♹�E%�����@U��Eɩ��zE�y�S4��*���PK�mWT+�~�setuptools/unicode_utils.py�R=o�0��+Na���*��Vj���\�j8G�����^��С�`K������XO:39�U�ې��(�&�{���;���;�a��[���>8���O��h�ɱ��M$�؆l},��4��$cϪ��8����4���`{�[�0��gYOϥ�s�XM��?Q�Q�+Êa�"n�5vH�9�	���4�?֐�f-V�Km��@�8��wK�[>)��?��E��˓�4}I�p9I��Ы0cq���c?�
�����@��(���9����
��XZ5=��\��2���
ZT�a5
�{wv�hu�K{o޽9�Ţ��!��1�!c�jQA��Ԥ:C��٫��
((<e�
�������-v�T7ޣ��_8��F?PK�mWH�Lbe�setuptools/version.pym�K
�0D�9EwՍ\z����MIR?�����<�L�����(��e$0�Zp%�;�����Z�L�SP�0d+J�,'c^���;:GJ���;�9.����PK�mW�
4�	` setuptools/wheel.py���۶�w���@R�#�4dq�[�A�k�	�eSd����%����W��{��$J��t������|�~/D��n�R�����l��˥6����?����I�"3�Jp��v3�(�,�i�2UUhP�Ou��]���?P�?��z+1kA�w��j�F��Z����I���UgJ��F(-���ux\܁x%���u��厛lע�N��Kl��*�&+�H�� F���p�ʜ��.���
�*��H%�4z6���q��9��|�bK�"�`�x��s����~R����=��ir��N��?��	a�1��nd����)�Go��@���tBĒ�v_��XXq�z��_~]%����~6C�}}��*��~�|�J_^�|�| �y�Z��4�F	�ŦȔ5�k�8��4M>���\lYS�b�6i.Ղ���C��GQ�L�jG�gB.��>2S���め_X.
a3{�P_�8�!r�B_a�.�$[0�Uzd���Y�J���n�p���J�7nIz�n�jˢ#G$զG�S%ˎ�6	@A��U{�$���\Q�m(Z	g(�B�j��ԅX�
-3"�&J����ο^��ܲ�2-���4b
�����mc*udy.DL�@�r��,3Y��@�ց"GqS���/��.���pϚ�U]m������2��Y���F�B�Ϋ�r�V5�g�Lk(�d�����O	���֌�����J�e�ҥĄ֢�v��Qm�v�-��Zg����3��bJͮ�R��T�Ԃ�ˊF���T���p�nQ@����*b;���Y�?�c��v�%)�NUM�ˍ�����a����9鬄��~�!A����P�d(Kk�`�'�q����P���c[���pT�5`="o@ځ��wlj뺐&�x�,�p �y/�$TOy�S�c�Wkhec+��T}��@���J��7��2�U���o
D�	��
�%ئ;	�	N66��2������^0:�0�1&RMa�1f�Y P�`ϳB��Ip��X��	z#Q�������'�A�g������c���k�rɢ�<F&H��`���y�Q¾e~�:u�H�\���~)5�<])�Д����G�������������A��a-�~ˑ
��A���	���ܝŖ�����E�kL��V�(��0�����Pµɔ��&Q��G�5�^(9^]�
�)��L
���D�Լ��%(Pi�S��k���i8a�[$�*�`7L�6栮Qp����KWB�� ���D:�o,Ea��}�B����"*z�/j�<cW-X?��Yzi!”��@��d��Gd��B�k�p���*Z�xq���/�3Jg�MU��&=@�C� ѴeZ�-�A�M0��)Tt%a(:I���[y�-	��ˀ��6�V��w�܀�*���W�Z2�9��-�jQ�]�q#qK�&5��g�
&/N-5L�Y��T�"����[4-]-�]�Ӓ��k���:LLt{��m���v�s=f0����:�!�a[o�p�0�p�C����.�Y��ס��ʠG4��#��O��O�p�rq�_0�b=�,?3�������Z0�R�D�zugT=�Y� `�^����k��'�A,
K��YHp���zd�z}�ʴ�aIC��{8.YiQm��t>SP/�2���}��ȣך�2�n�0�`����ayP��?���E2[�H��Vn��\��[CI�[%N9�X��.��j����y!��n�g�vfC��T���EJe�x�ÿAy�n%o�@8����
D��uMw��8�\�"<>du�XZKr#d/�Id������c�N���Fg8
¹]�N
�E_�V�-�c����x�����Z�Y�Z�?�U[���L���6]�u-0z�z{�����pq;��'���3S�����ӛ	��zI��ت;.��˗06���|R����L���p�����j@ZT���A�}U��Վ��R�H����(V�'�/�\uuL��߱�:��8�n��j�)����f���չ�3Cj�@��E1PbR�����k���|>�{^K2�½���/��[������S�#h{��
�w���,�@�`r�S	J�w�)~׈��I�\t�ia�p���ŏ���'<�~�7���GC��XaaM�����C�b�L?`y��R_d��w5����{X��W�`y������M4!�3GSB������\X��/LNҞ*��/`:��I��Gϣ�_
�\����݅��"�;Ӷz)����^9�m��{�x`��ǺQ��kz��{����͑�pf�=���c�/yfu�8�1��^�c�bF�1��*K{���uR�n����8Tc�1M�n'�7ۻ��0�·Cb�ֿ��R2�vO��rا����+��,'�v�� �mt�Q��kN�J<�j7��PK�mW���
t�setuptools/windows_support.pyuRMo�0��Wx\hj��&
	i @CB0�RZwD�I����Җn X.������$�� �}��J/��)j�X���Q{R�g+�D`��ã_��Ϛ0�lx�C}S�%,?
)Sb?م>4|����h�yԃ�ȮpyS���rae�C�"��������jŽB�c
Q�O��.#i�Y �\a@R�V�&J&�'J{����Uˣ���P�B���N���%m��B�i�ቜ7�W���z9NǴSu��;1��O
}�C�q�P	����y��y
7Re0{߬����h�X���S�{z�6\,f�Ngco�^/�Ï��{��F�a�N��~��w��6��jÄ���J>�X�1�6VJ*�f?PK�mW�B괯�!setuptools/_distutils/__init__.pyM�1�1E{��+
��+��.��
�Fa�,���Is{�-��{��s��R��L��0� ��^�/����T.i�w�jdl�P9�d�T)��ۤ}�q����YS��̥�ȭ�X�
0���6)C�1i��4�K��sDb�%Msc�@�`���;��/C����QLm�F�2=PK�mW��1MQ&setuptools/_distutils/_msvccompiler.py�<ks�8��+pteI%2�̬�|���L���.�If��bQ$$qL�<�����_w ���ݹ�:V%�	����79�'���$~��(�WE��r4:̳*L2��_|:<T�',�X�*R���\%y��9����3Q�aT��3��P��</�$*s��+�)u��������z��4���<�S��=��n�j�>]P?�:fiX��g�k*���Em���"/+�/Oc��K
�d��������m��9�3��eRU<c�
;�e���4��e��ߟ�3��
��%��e�
{�S���Y����8*����dv�׊%^�,�z�$��|���1tF�`6�Ey!"���H.K�[��d�E0q���5gG�-.3,&�a���D=+�<�y�$�*Mf��mXf�uӣΐC��Wyt3�Ek��0%���,�r�7Ꙇ�d@�h4/�{
��H����L�wg ��+��7���Q�:�$��[vC_��4B��14b�����At��i���u�WA�hP|H@T�<oADy�U�Q��,@�	�.��x	b�א}�7l_��?-x��L�<�-���/ӿ'��'����w���[�\��’��5�M����.�.~�t��c�#�}5Nr>=8b�͌7�O?��>��|oƎ���xQ��Z��0��Y��eJ�=C���R^��7#J^�e�>���#j����B�^�/㤄�S�	����&A�B+���k�u���jWf�իOaZs&��dl
����J�Xo�9[�Y�I�YΧ?�����.�D.�Di܇<H��0,��iV�z<�U�{D�Ү�M�M��>h2���F�J����B��Z�a�f�����;�	��exLO�~����F
�a����/�)����
f�����kq�y���$�x�͢
��z"OR�cG�1�N��/;J���$�q�İL�
��a����y�Eh�݈�ώ+�
7@1KY��EIҤu
Q�Gi��!\�I�����%�%�����:JG )汯�)q�s��Z���2�|0��sV�2\�,���^��1C�O7e��4w�!a)��oxG?Z���*�ʻ��Nk��y�y8ׄ9[B ���%�ap������GTN�5�ג�d��T�XZ�D�7ͷ���������w���(/�+m�Z2
�P�:�uT��O���	�Y�cܳ�fv��~߁`'�*g��³|�g0����L��싲��1K<?���lYl�����7���!RpP�%i�D��:I�V�l��_�j�0m�����2�8��������燎���Š�lO~N�WA��_/��l(W�?�ת��6�j[�uX
`���H 
)Bvج�w���?����*_�]XG%�?559k���?�̬m/G�&�^-��k;�y�'|�Am�
M3bm4��>/4��J��uW��gae[�VD�`����x�'�I�Bp�b� �z9��F+��&�;���U����9:���xy|r|��G�8}��b�<1~�y8EC�q�9Ԅ�a�!�]	�%�k��2ЗS��M��o��%_�I�L�(���w`����n����=����þ|e��r}���Ɩۚ�
�rߘ������e�k����s�j���u��Ƭ�%�w-{z�9e��B?[:	��}I����E�
����if t��Xqģ1��X#^A+aM��&�aYQ��F�{ź�E�&�Ali��t���f¯����J�.
��G��F���`��Q�Eq�İ�q���.˄�F4)�툵�T��F�+��O) ڀ	U]�@�z��a-%j�2M����,��}B���q~��볃�wL�-���+e���
��FΝ�D��华^����3��u���jV	�d�m�d�;@�W�pC�J�����yD0����H��0���v<���n�vB�ue�\|厥@x�v^H�@�)�8���@2~z�x�m�V�3̳Nz��g��A�0�a�(��eV���I��7�̋��ײv����pbE��
RP �@0�2-F�Z,!�޽�EJ���\�8'�'Y��1����5g��ߝ%�"�/�}>~:8�h#Hb�{Ս}���4���\��q��FslQ��*yzͷ1kt�0�"�.�%N%ú,*�H�G栔Ȱ^��Gc���Rr$�幭�6EU�ǧ�$��娠��X�b���P�o�#�`(��[�.VWae�����̅ #,�q����,��t�@�9�נɈ�@��P��t٬.yXG%�`A��I,	i+d
Й`��b
�pub�!�Rؖ�!�)ߍ�Z��@}��4��}b�2q
�6,e��TH	�z������
XrM2�d���3�	�c64�`~՜>+�u؈AV!�2.�o,��:Kv(��N��eĉ`M�4�dw��,Y�+׏�k�T��<|����ӽ�>����7��QQ����z��ZS�r�������ba���4;T��2 �(��y6��z�>�R���C�X4�w�$>�q�)���i�7�I�FD]��Q=�a��q��`Ȩc�vT��}"�(�@�:��{��Pd`�$<����8���1�
�#xgx�v	4fChƫѭo	Kp)L����@$�T7R2w�2�p"c�QTmZ�(����a*xKsۨpn`�1��uU�U��#@@C�[�>�Nh���%F J<�PSX�` ��z�.���I�('�9Lp���i��[�Bdm�n2��I"�I6
o
:T/r�E	��>�	��\�j�l郙�i;�ƽ���.�%`+�2`�U�6�o}t�_�=��g�CɄ�ɏq;'c�"5F
k\���*k��7	0ڞ���u;�L�1�L�M��D;|;�fh�v���ۥf��w6��:��XQ
T����݌A[�t5�7�6N�R}R%8�ΐ@�6�5��;d��?��{�A����$7`륧m��-����'������d�ZIf-����WŖ4B��e��q��auʃ~)�����]��	@*!�{�2J�*zW��;�z�NXT�B�(ހf'������KU0h��6�d�;�㾋�S��W�*ᔣ�30��>E�߄t��	�k�w�H�g�d��ϳ<�9����+���}�|BG��o>�L������ѽ3TU|`�XA���H��9�Єi<O���8<���~�<8�pJ�N.�����%�㽷ON��IO��V0�S�71�������������h�����F��>��FH2F�rt"W����!r�^�!��C��9ý�!�]���3����������˃7'SY��j�����/�zh�b�6�ΧG�雿M/����X�4|�!JL)z�����o��V�� ��6��B���>;IA8:]��e�����~��f;���
t�-dγ=���M����m�B����,�S7�7��4�:cW��>�M��vJ=�z%K��j��_'���Y{N/�oW[���E���u�n����VN�j�v\��	!�{)<�W^a����a���,��@�O\H�tN����&�
���d=D!�
>�}Y	����H
�ؤ��Ef[��i����޵�g������_��%���t�<@�F�2N7,ͳ���}�C�%��ì�~��:~����&
0|%1��,�B�<�%
cC���<�uV�^UF����5x���
>��q��M]l9˵���á��2��@:��cYM�B��K��m�9,K!i�Q=SY
!9E����a(q2�s,+n�>sW�@��Q�7t��a�E��_�::���~���fx�Y8�Y:ژM[U�y}+g7�]�
�(��02%��|��.�r����W�B���������N�Q��}���&���"м0�S�i�x��?����.�-fz*��z!5.0'�/3<@ț��zb_�d1
��`W?,A�}�V����f�5�|G�mϝZh}K�XHZf�8R̰˞��	���+-9����a�W"�^���!3�'��m���a�᳃��P	)S��T�/�(���~����Iv~+�P�4��n��0V�@��f-7�Tc-$�Y	p�NKR
��p�z��fI�o f���I����l�e�`�RFgރi�z<���OG�(P���~rv��"O�����R�8�L�&b�# ���[��@�o3�J������j瘴�\�� �	��I���π���}�j�g��!�jֿW�?$�[�ЏV�V�S��.�"�R�<��	�D��p�(|�n�;��E��\��\j��8�rߌ��P�,�p�X�Ru]w��9eЏUvƼ>`��	F��%L]�^	Ӆ:�;
�'�5�d���$���Xm����J��n�E1c�f��l�Y
�����"`t�7Rz×:=RV�����b�sm�
J��U�w䙥�дҎ���E��AX��w'����?Ju��0�Ȝ.���#n���h�:���*Q��a$��� 00�D�u��l���X¡\vG�
�hq*5�h�˿�r�_�ܝ��	S(��Q�ϮԦ�+Vm�Q7�0=s�x���w�+f�Ʊm��<�W���Q�A�#B�V���o��mR��
Ul�|�
T<h�Y<T*k2��������{6��=]�&��#�d�����3�&��_2��'w��8�bz}
@�]sh�ٶ�]=��{<䬉���=��po���ƥS��s7J{���/�\T{�uW���@�Qq���!�E��yX����9�<{"�ki��A�D1�~z^��yj��!ʪ����oэ���R�D0�.v�|7�;�34��v@���@tש�o���í[YJ7���7F��nW;�C����
�f5���&d�5��H�=(�*�*�Z�?�%�f@�u;^˼׬��Z��ۥ�Ul��~p`آk�r��+�ҽ��#��ɑ?. �
�r���nOx�TVW�ntVͺ��m���
`���V��۩6�.lkA�o����Y��l_[��W�Acݝo|��P��r�O=;=�ܣ�fE~&�lc"+����QO��]�g�|ێ�>΅vB���L�AuBL��0J�`z
�����$Z���:��J���x�DA�]�h)`.!@�w�#�}Xz�7�>���OA��2�Y	�e
��ƀ	��HM��]P�����^
�a�3WTE��q�8�BL$�����B�q;�5����	:��Ջ��neG��j>^����j��ጇ�A��yv�g`�rU���{8�oX0lY�#XM�JsT�� S;~vr����n���:�@P��{q����Iy������;�]���_Y}�1{Z��!F�6���`K�p����b��a�q��Enm�H�PS���JT�:ބ.��'{[�(BPAR���0�	$x�W��c�Z�
^B��7/}{�>��f��/�LR�_�_R_Wa.��Zy��ƭ!]b�b������k�����)��������{�Ӷ��U=�H�Ē>��	!ͫ��®������o���W`Ee�
���^�U������
�#UVg"�spA���Mzf!��û]��&\�"x�	��ul�=u�$/E��>����ޝ^|��8uv��on�2�JQM�;�
��:��"�8B�q�&H�h�Q���k���[%R��<n
��gg�$Y]��?�d,��tD�q*��xn�2nW��H��K����ރ���$����π)@���'�k�^t����і��޼���,+6��D7ѵ�������s�eh>(��ߺр�{�w�#8Nܫ���E��jF��2NF:�>�V�O��Ǯ-4:�o�iɔ�^s:ĺ�tV�9^�T��h�5��e�3̓����2Ɠ�S�-nd�q_I2�BH��Cq�R`_B����3���X�G=��ھ�݀~f���Sւp��l(n��2��-�ݗV��Tkͬ��>�;�4/�K#����%���[<��K���!�HW�PK�mW��5R
|!%setuptools/_distutils/archive_util.py�Y[���~ׯ��0H&4�:o6��.z��q�A�ȑ�.E�r��6�=ߙ;)jmA���9sns�
��(E?�e%Ҭ��_��b���ĶC��eS�m:�w<��z�40ۖ,�n�U�H�C٪�d�ﳞ���Y�e���4�Ţ<�rU,�]s`Ǭ��)�^�w#Nb��Ӌ�G/��X�=���o�����gK�Ϧ担"�$�jɽ1�o�y.�L�E�k._�E�I���m���	�٬��'��i�����=���t��7F��Zծ�*	`Q|��X]��"�� ��C3��|��^�fh�ʻ���u�K!13���w��>�D��ӻFm�����x��Z���'���	��"��M?ς�y�ZL�rj.��f���A�nN-��8�H|�G��[���m2���K��#�"aysh�D,�3H��6����Vt�u7�x�d�9ּ[�DY�|v�M��C�Q�Qn��%ŋ��'��W�;� �����>�t���ѳ
g�o9����',�`�9�	��ۜ�s�p�)c��b�|l
r����S�oj�}�<�LH�CU�B){�rXN®
�7�H	¢����)R�Y��j�q�N�{3�U�������k�ʂ�zI�|�:^�^�Ub3�Zap��v��
�B��}��K%�Kk�A(��3mW���!���{^˧(HwR���A�?��ɑ��Sk��W��9bL���E3��>�%�OH�������5�+�����Ӟ��3ƫ>Θ�7	f��iD.��KGS�8KgD$�2�	�V�N�mOB�w�e���,�3^��-�������n7О��-�y�
Z�9����$�؋*Y)8�9�.T4�)�d��mɹ/��G�ެ�`SL�96�h�2����Kf��3$��d���g�R!�v9�92�3��Um5"�_*�t䣊]dԿ��T[��i���FX�.Њ��T-��2�:��Ֆ
u��"��$-�m��-)��f��\�ٜ(c�J@;�CE����L�B��@L�<�$	�	I�+�H|���u�K����m��{и���d���~���AG�Թ4�6-�G�S9��)���it�1ϫ�!��=͊"r	dzdR_��<�,hG^!GG��2��_�үg޲��*�˰��0ED����EP�Eu��'*����hѕH�@�2��v@9�S�<0�?�ߑ�:e��~$5x��Dz��y8V_~ �q�?��	?�����6�s�eg��L��鄅�_�ȽO7U�5�\I7S����bMv^�y�==W^�3�AJ�ʮ���\1h!M1a����6��*��<���{y*`�j�%�/k�C0@9pۀcx�Hd��.��Q�ej�채��LG��Ki������z@�)�;kS�L��R�cY�?�HV�h���*�Q��J�����D*�"�tN�y�>SRֳ	{����*, 
��Y<�]S���qUy�M�zw4)�9�j�Z�藺m;��1O�Ǐ����7R9��ҡ{8E��?�r`�2;�{1Aa?Vy �8�N�;�E��Ω��(
�q�ԕ��ӭ��O�p�Vf�X�a�Xt�/=4�TSu?���C\�'�EVQAJ���1R�Ȁ��
��;�-��k�P�}�te�\���Tg��������ZH?��;
�c:�q��ُ������������7�����������!�?~���9�`��9WP�Q?�e�e�rI�sLBɈ#;�B࿚���(���,�����KT���t��Vp��?����x,��
j���1�n-��[;g�-�y�/V��L�����u�z-Mų�#�{D6؜9W
Y I>/S�z�|^)~��;�b��_�~~�~��?^}��j´{�>���^�n"W��;^%j��)��*N���&]bR�s���z��sH4�� ���+�������''��i�å&=��t��J*4��MU���kS�Sӑ�"ҿ�ChUMw�g
D��2���PMy�0p�ok��FG%�Ǝ>�3��h�ntljK�<M�|O�izW��&�8�m���#�f��Qg�h����؄E�꺔s_s��/<ף�X�w�L��>d�E��Iy^�ˣ�rJء��7�ez&Z���2W����t7��Z^��&�^�2]�j�H��y9�<��{�@u�|4�}J*���
yiA�#���+�a�KV�}j�\���2uYC|�҆C>t�xRho�w��(&9�AM�zR"4�
/U[
_
��匔o�{B:��O3]GR����ӑ����Q�4H:�1T��f4m�<���^���W�M]��_��/e9v�5�y>2�7�"C<ʏ�ʣ;��9�M�f�0?k�\V�ͰCɽ��1��@�4s�eD׳���m���v/���ł��B2��Q1\���ٴ;^Q����n'�_�C��Oz?*�w�)���$ިݕv�K�M'���ԉH�j9�|P����nec9�Ih�����W"��kD�
�tiV.3��6������+^���� �$��F}�B��d�Y�d��,�e�N����\fK��PK�mW�F9��.:%setuptools/_distutils/bcppcompiler.py�]��6�}�E ��� }�"(�4-z�6A�"�A�h�]ITIi������E���5�Ė�Ù�|sv�XB�]+J���M�˪%W�d�f���;�ʬ.^�����LTM�+ ��5�[��9�6�UY޲��e���V*��ث�O��j}�X,...���!�͑�9���C�k-�m2�o�Tb'�d���{|��U��`n�iQ����W�K�#k�M)���n?JU��,EV�5���GVJy�Y)n9bR<�,co޾G������s"M�A$ZV\֜��ʂiѲBj�p2	ɮ%2��
h�ehX�A��{�~��j�� /�Z&A�JVl8M��T$O|������{��F�Ľ����7b��o�����H����[�G��Ύ�i�x�dεNeC�"�p�_��-O�qZ�fY�	s�J����#a߽z��Q��-�Q
	�+�rs�p,Y;�&�[�����X���z�|0�
��Q2�L���j�(��H�c��K��F��%�G�[�9�
؎�V��$۪�T��\�Q棶k�>_�R�Jy��@��}�I�YHSJҵ٦�:^Fl�)�u9�
6��(7��ZT�,h7�u	ڷ�xޙ:2�
�Z��-C�,�*y��E���e�Y-������x�p��T�O(j��v�%$Z���#�-��l�g��xi��?N��zu(�6cq�A@*���W�t�����a�ܒ��9�h��^��h�G7�U�L_�Q��?8x����-]�
@�s�h"uVq44���8�_�љ�E��p�'id�U@��!��Hn��®�Id�S��Rlxb!����DQ��sV��_�?���':rG`�'`B������E��,ּ����o��/�Ͻ,�1U]=��a���9H9��m�8��Y��b����)0&���h#X�0!����[s��
W��g����"��;�j�Wp��������`�<
�k�9}���V �� ��&Ͽz�G��-���B��0h��v�zY���F��u��3Z׳�/迿���sk��֦�t�Cb�(�e�өQ[��}c�X{k����+�����W�����-�#&X�D�
�:��
��£v�i���`��4�����f޽��ҿ��
	��\Im�:/���k����3h�#*�&S;l�I����^�o�f��$��:\�0�[�eӉ��	$��kR'��Ť��g�t�>����e�س4��\ ��5�]g
"fq�ʣ���_��-$^O9o�:^j�?��|-�T8&��8�;^M�F�$4�	�5,�A�7-�'?R=E�
x܎�^�*�?��&�^C�C�ΰ�f4��R��;�/Gp��<^��(�Ҟ2��-!>H`RL��#���(A��"�}+�ђ�#<)����3"�;5��:�`�W\GS�j�g	J[��
ԃ��w褈$ѮO�啐*�և�i��$`��c���	�I�)0s�����a/5�dPe�׋���H�b���@	���r�ˑ�N�EL�+���Ne����v����5y���B�R���}w�.�^aF�`��U�i�vQ�����b1��r�j��>�l�.D�%è-��aS�'^K�U��LP���:�f��~�m /=�D��E�P ���"0�gT�Y���c��Y�rW��B�;^��ܔ�S}�9v9&L9��T�����#YU��BFș>�mvT_�,�][��ͱ^.BW�$53�W�!��<@�Q(�2Pn��An<�/��3
|�	�
{:�O]�gO���^��'ěV��7lv=5���)C�D
�GM��Y�Y��j�̸��P֝.��˝��B<�O��s�'C�uV�&�_��}îK,aɹl�}jR:�Y��}֗�a��*&Qm��������#U��ٔ.�}9V�ȉ(H,
��Ƙ?i��p>�O�헙�ˏ��wP��dE�h�@3R�H�<��ک�8
�ܭ��x��G�ͩ'�]�j�KY.�B�
ljK������.���y�ꄭ��9���I�\�y{��@u�@T<}��c�7��j#�y�=S��C����
���U3����0�l��rb��h@}��=�V��<Px*!�����Z���4���%�紜wS�g�.�r�� �Fv�T/~�]o̾��n�4��hSt��8�u��Y�B���-���4N}�+{����yw`7{��R�Į��o�lo�g���Do�H�'��T�
���?�~���o�{�z��*�2Mi��_������@�[��3ߤ���������c���pT|6��6�ga� DT���B��~$j�u��BŢ[�r��˴&��1*�T������}�����7Qzv��j�xb��J&1M��r|#��2����kH��]?�Y�� �h��Q�3s!fu�鱩���Ӏ�`�'���n(���㻷���-������qp,Լ[���n�xq��L�h�)	b]N�"53�<ns;�����כ�h�:�Pg�a�}F�_��Wں�gr����^�����Xߺ
{dF��KD�_t��7r�
mh�+�C��r���.�0��FǯB�Ǔ�����7��*A
8�;_L� F�OƲ���������L���݈Z�o�C��~��1^~1a�D�O'���aZ<{c�o�=-n���N#!�,hr�����*�J	%͚G3��1��WҙN��E+�����U�ClJ}�����S��W��"�Ϭ2����8	�;l�}X-��BTH̪२@�
�t���p墳|�ei���_8�����(�����
�v	:c߿�홝�au���>�o��NOD�`��h\��p3D �g@̉88��-d����*�C!7wBv��v�!Pj�,g�N������rUmO��J�9�6<�P�z�,<J�\�ې�����U�طj���_�צ��,	#eQ���4MCL�z����Z��,��m#�����(�� �߄.��貍CQ���sv%I���PD��A��p�W�!
L(�[l͠�U��i���������S����C�P0ŽR���+%�e�1g���v2	���,Y�����h���<K���@c�����m;0zR��^�{L� 4ji
"���c��'�2�3�Kƌ"��OSGf���s��r�e�6ԲK���I�IƘM����LL!+�>|����� ����0z�8>�JN���7�=�	L��r:[�«�iW�����pZ����N!9�,,>k��\M���-4�'��B�a��ctz�t��j�8'7��&��r�\�&���9�aNZ�cBY�*���^����RtrނG�H\O��%9l\Q��kt|���/=DxC���Lwۭ��*3�X�ػ#��OL��7\6^�4A�?$�y��(Q�[g���2E�l�q�#�}�Z��CQ���cT�aJJ6AN�䈲|���q)�i��&��ge���/�K�&ו/+��r���ޣ�ԧ\��^�o�f4;�"-�N�P��H����(�M�o�p�/�#�f_ͦ��$��՝C9���7bj����3~�J�a�>���J0�ʳ@g�q���F���]*l}	��h�uP/f�ӌ�uDʩC`re�N3Q��	�H�P�T9�.���������>x�hܰ�,,ԓ9�݂D�'�I�20�٨��NӼ���D�Ӟ���x0�we9ʰ�n���K*H��6�Q�؜�ֿ���6��>�&n�}(aU0c|M�$�M0ח2Q3�ۄx�M�*"�SŤM�u���t���D$�4�
L	���A.��d�mVg��_���v�uu�dNj	`�%}�y�ƀ(|J�,�'�-���{0����ߤ�HeB�\����ۋ��RB�9�m���	�+�x��#
��眓��w^fwfr��u��ο΂=|%:��/FG�깋A71�c�7@�/w35/O��Q��r7�AD7��4�`ϸrWM���Y�}����>KG��gJ*��l9�@)�h9QF� �(��O>^`��:��Ǫ���f���tЛɢyȃK�1��[D0_��A%3�Q�h�$�33\�>��,s�Z)�4�>Q��P��>�Ҍ����*����<;�u�+���PK�mW��| �1��"setuptools/_distutils/ccompiler.py�}�sDZ��+6P���@��!U��l�vt�-Wd��B-v�]dw!
����kfzv$�8��r�J,�������L&E�����E�7�]Y����eS�YYw�˗��<��$[u}��}��:��U�uI��Ia�em���uo�u���u��'����A*�:�6�������O�C7O�@�f��I��m�.���ï�]vW�o�a�5���_m�m�,��aˢlÆ�����2��Um�L�ܴ�~7l��u����7�)�h�}?��m[5��3ƶۏ˳~i_���	7��j�A���� X��;��,�-��˪k���K�fk�[����o��K��)�7���ƀ���?�t`�e����`7e]$Y�.x-������d�g5�&��u��HjYU�zس��o��7;-�eU��&�x��ke�]�j�~�S��e}ߖ+�
��-�p���5�n:؁ѦF�����j_���6mi�6��F��:������6�s=�C�/Z�=#���Ȳ����,�;D���o���T��bۃ�����Hp�Y�U�t���쀨F��l�J��L{�3�h�`�#Bn1l�P(o��dj'��;3ŝ�d��P��@u_�	?7Ќ�*_��� �s��.�{��m
�Ïn��`=[���
�*$����X�s7�� ��+W�Qs�+��'����+;�!S�+pS筁E9�M��J`̇�0�M��
b��0��
��P��98j�P�S��DY{H�����)�V��ji���iR��`1��	Ȍhq��Ұ�K��.9@V�5ݮ��ȡ�]�xN�w�!�Gr��K�����?#-ԛ.����.*���>�r)��fXa����
�`EQ���w�K����;Ib�P[[�L��~[�/b�9��j�����U�Az�Ѵ7َ�X�-^�x.�-�=����qqh4��]]~T���Q���cΔ���5
3�L	�8�nշB��iA&a�Z���FA��mYX�Â`��;�n��f��F}:OJ`u�L�<�x
�����b�������w��B�y=�Qt{h(��`0�n�C^2!���v��fq�4���&�ء�k`%�<�p��-iB*8�fz[��b�=hzd���+&��M��xA���� 
Ȼ�x}
��8zV�9C�-){����&H��ɪ$���wI�n��MO☩�MDAkڙ�l�� �D:���ۃ�O�m|�3�C
	�� ���ͭ�M#[�L����1�^�9(�#�.����"C��[TMNlJjD��9�:������%4��Va�(̣ޣ%��+!��6��#
�:�ϛ���4j�"k��u6���`G�cv0�j�.����3/��{5LN`�!c�<�6+���v�5��(�@� 5���cQڵ��|�M�g1��?Oh�q7@~!QPO��wDH=x�P�/��~��
�"�����aƳx��W���~�w���C[y8AK�t�~�2�l_
g�f�m�^L�jh�~��f;!�
��x�k�mn�w%��n}�n��R��䷨ø��H'�݈M[���I�og�3؀5�������¢�	�j�5`�p[~T�@���
L�|̐@o��H���w��$�&�|�[�/[�=e���&�ʖ7�VG�kx�ӧ���W��r�\�����0���[<}z�
L�6?>�f+�^;2�����m�J����y�NK�\�5��K�%����
d���`���e���W �>�]�a��BZ��[�5��/���+�����`o� ��%��%�kd�Ч�;�c	g���\�a�v-�2�#+։�‰��3U&�MʊA��ݿ�m���Z}2C�B�vas�~ԟ�Ȕ�Y�73⭖�=}����dJ�c2+(H�`u�����TaH8Y����Y<f1[��h�}��	m!v���2@�(n�5##{����rv0P�w[�`'���n8CH����eb�j!���X�c2'�<2��c���9�0x)f����\�&�=�D�u<7�L�?�\ҁ�Ue��th��0�4[,ܗ���.7�]f^����Ct����A�8BV5�!t�S%�(��K�0�v�Q�k���KְO'�����M�F�L&�|POuIRRg�w�ۙDFP�����.`B4JDb�e�'�e�Q&�Yp��.�	��vp�8��a�nJ~��"�J�ٙ�謱��{��2㠄;Ƈf�4q����.��	�:�J��g/�>�ʑ;�.�F�匙��b�v�H;��Ё��%��Z��,W~��f��3vt����)e��Lp�#��՛�������aU�F��V����5�w5gb3BC��U^�Y�ݣρ�V����؁`�5��vE�����o�
�f����L�V�%��г�P��r��HP�\pVY~��`L7���T����i�_�(=xE���F-�~hl�B�>��Lq����,w��Y8�Ha>��0�6eq���b�5��z��<�]["�m�
"��hͦuޓ[j�ٛ��;�1�%E�cNh=�!Sc�mO�ʇA+���r�!�xw�R�4eͮ�@�&帋h����@U3ǘ>r��A8[�>@�
�*XtAA"O�n� :|�c+���`Y*�N�[�":$l�?mV����¾�3�t��1�]�-�~"�BI�m�u�䳨#��ϒ���%��D�\�f�)/^�*K4�g#�/���)};G0R�=��p��s6Ug�����V,�6�f�=Y0>���n�تm2����}ruE�"k�}`Ž�ӫ�٠��$h����Q��k�!���1i�̀O@�B�<U��0U�߷���l�3j�/B�rq��+x����U��l��Os�����'����|�$nls��� ����Ϝ�8���I�ȧ�3�>�'_o�h�	u�~���<�Y��h���qH#0���1a�Е���V���F�	ȉ���4���B&�dX|;��s�쯢������E�WdcY�WMs�xH6yq��g֟#�ֿ��c�s�a)P�`5t�F�=AV�o�4�;��=�.�D��`=|?��LՉO�������#�><��QQ�N��Y����)�F��z�ʓ��;���h���xEd��t����@Y�$�򇷯A7ЃbV�V/�?̢�QK<��U>
8
y�A����-��S��I��e�<<��nu�Q�#P��
�Ÿ%��5�ߢI&�6�4���.���>_��xM���R>��1���N�}
�z�.8u$�z�M��V8���>
f:�!���=��pзóժ�3����΀�$o�8_�%�0���(:&+p����x槇n��0�Q����R�QJi܁4�e�xOB������DO��`�(�����*6Ȋb��v֒)ې
�,
t��)n�Fc�
�U
Zq"��tX�X��h���Q�L��{��%�G(U��;x��C�9�p�~�2�|�}�,,I����g������(�i�
�p��cs`�5�#��Aq�$��48�#oO|�bkL��ܧ��&�t�{��\�#��F��Zv�R�lGȘMi�)�`��3�s���k��H��>E=��v�6��s�7�C���!H�Gv��	��f�#*ƭ�V�.4Ugr�54t"��8�~ilݜ��mVʼn0ć�9'����Na(b���I'�="⒏���f�QS�6p��P�1�̓�#�5�L�?�eD�#�mdCm3�䠫Ihq�SԖ�!h)$I�%�,1�~��Q����H����K�!�=����i����ǭ'�F1E[0��z�~'�8S���t��Ca�W���.8�	!���Q�/vX�1�脎v�E���q¦;t��9V텖3V2�$h��1I�A���8�G�'�2�Ri�̚z�׼�����!���:8��h�ީ�{�m48�sj۶��!���HJ�b��>J	��J0r|�O&��	�:ټg-�c��k�iV[@ꑩ��"%�SHB��Z*�͑�&F:��i95>b'շK˂C�#B�ň@F'�Y�U�f��Ir��C���9v�lm
I>ؓ֨�+�qg�YDq����[�
l�Ǣ�VZ:�E��^��*<��Ȫ<����I����oY�eDA��,)�i�h�0���7"A��	M��}�Ø'%ߧZװ�%yDȟ.gtf���v�^�N�[����S�B.��-	�w6���F��U�d.�]&�nn����3b���B���cX�L��<eq�U�!I6��BoH����@z��ﮆ�Y�+9
P�v���ax}�s���a>�dv��+YP��)4	��i�Ypv���4IuL�}�f�J�Z�bv��F3�d+茠,Y(&�f����>�tG�)�kOnf�c#�g�8ݏFI��'a&ۃ�5;@1KU��0[�ہ(�d���c� Y΋1%�T���n���t��Q�xƸb~�E���M�ZՂ��������-��rc�~/%�)H%Օn�a.�߽���A�mVoL��=�9b���@g��կJ���M�/�ZB�)�pv�<l�<I�GS���G�N�i=��{��<�ګ�i�ň�o�d3���3 %�7���|�G�"�]S��=`N��`��-g����c��(�as�1N��`�vO�&�Ӌ|�^S?
n�t����t�	������-�x�6A&�G��46<-J�qz��PD�	=i4y��q��D����S2��	�f�;��(S 0:E�%v�)O�Q���G��3��0%
�)�e:P����IV�kP,�xb�~�	J��P�B�4�Ao�}�π�{�-?��?F9��l�R��ȋ�raDȁ6�ĆP����U���~�4�r���J�bl�1K�g�?Қq��-��Т��1�F��e۸F8zk�x����#R�!��3j��o�
Fܑh��1��N��rTQ�W����)�Q��D�j.�T�6�������b��������x�`���c�T�@ς$���ݛ�����'�r)��ݖ�ݱh�?���E��m�'Sub���@q���A$��r���0�&�����f}�7A#ҶX���!x�6�m�V�Y�X���:fm������VѢ�m��+�#���6��^Z8�%�E��*ӍIA~�}��ʡ����OTF�w(�Z�s�֘�I�ZZt���\�6�� �^7sW�D}�����\��OK��<�:Z���Qf��S�O�:\��B�Œ��^R��mV��7e�O�C��7g�ų�B�r�5WvF��(_����飿p�GM���1Wx�t�;z�7�m���O��g	�`��p���v8����w�pA����(\=�����!�����5~@�LJ�.Qp���B]���)ޢ�$�;�����;��cl��qr[��T���VU(�E�a�0�͝q�nk���c8q>�rZ�A��rsn�;n.�����~�	ݳG�\Q��S]7�%U�m�Aq��ޔ���R�i��(��ڨ�΋�BK{�?t���Ҹfemm���Ӵ��$��]���.��juP\�e��6�S�=�1D��F	���lt��^�c"n��`��t����1�pl,�4?���
��˜¡[���S���}{�����`Aߥ2�lԛ���3:�C(�	�h;
p����zu�m<�N�v�����4�;�|���l5RꐓtǪ�4��!�������C�kH
�c`����݇óS;%4�`!�fV>�\�P���JD�a��&�ܵe��iHY��3���]_`���j�T#ׅ؜;�R�����'�p�\4Qe��(`g|\��űK
�{	�h:�tj�{����p��K,��*p�g��]�7Ln����
|���#Vp�`�����`}���̐(���=^.N�`F�
�(�@Y��t�"�CY��X��]�K���'{XɱWW�h�$����� *�d3L^kF�CNlv�X2��n_C�"�E�aFǠ�R�S��do$ݘ�s�S�~d0?��� e�H�$d��"�T�G�a�����#*�:2(�aӲ�(�],�I��
�K�8��M[nJ�er'ߠ�N�DT3oNuY���v�{V��9�^e�t(�6�$墏t�;���EL�uM�u"���4���m�Xu�[>�cj�JU�Uc6�"���	K���?�Ŵ��])��E&�c�i]��G�p��6$QB}=+�0�ѫ�r7�ʱ���Z\dh�]��)�e��ٳ��ݔ�B@]���t�{ ^�<�L
r3Ae�.d�Pr�zt�T����AϓD���U�T&�y+ڽ	�9��}|S�d!��;lWMER�2��Xf�9��c�N߁��DTp�?�t*�Ӆ�dZo��&$ɩv%�$i�Q�*I�N��≿���
���N^����cg�h"�ğq^��a�>���.j$�7�:�s���*�|P
�h��
cr$����o]p�:d�.�v��\��а�Z��k��KƮ��[��0c�eg�S��r)�����EH�d(,�^�� -� �₰��]���9x��<��Q�׃@���rH�؍sP]���9*�	���Vl%���p$ǬU�t6mV�yAgDC�P����' ��Հ%�7��zP�F�%o�p�QU�&q'�*�5�J��x�S���?_9
K:�f�IQ8�����s�x6:�i��H/3�z�(
�u�m�&!��g�'s8����VA*�T��կs7�ܮ��nŎJρ��G6��\���Y���p=��3O]�$L&~�T�^�LY�6�0�N�r
?Mas��8�W@�
�\2p�(8��e^��H��ؑ�����‘By��;��;Tse��߯�h��
��$��
K��·��$�2!eU��tp�@�`�\�O`2k��膰��1�{�.,�v� �7(�7��V�R���g{���C�U?��Is�"���VUU�[�\��=�
_"T���N�4}�{U�k��-zܴv���J?��C�'�W6�2P�e=8�
�3��|�_�I4*��ԍ�=�C�pS�ǰH2�w5$Rn���\����Р�.�L�����}L���]�R�_�i�v�wc��r�����G%q�C^v��*_����Kʷ���_�Z���~��'Pt���K��6߽���_��?U#�{n���_�|�ӗ_}�5���&^��3�PL����rw�[�E�="����m���X;p���\�ka������X$/lA�ʲ7�]���J��]��韭�a({,���|
��2MchT����GVz�)��q���k$^^��VPSM�,��_k�Ȑ������b��;V�Sz4(��*��[�ýwW�A"�/����_���+� �/��5��P3ccL����Ç�����˅�#&m��{����-�nT��j�[VZ*��-ƒk3&v�E9�C.�*9��'F{vP'OR��������ΧTN�]�X�J
vY&?�A�LU�hv���*m���)4�v�^�D��'G*X���S�]����ه�\u&(4���!��Mk���ua��5'�J�?��r�!*�!�{K�Y\�za��6b�.C��v���F���s��n���V0e���8�7v��PO�3C�Z�33Xe�䷥x	`�qm��Xuc�0I�}�f�M(�����"
y�B���Gp�)���|R�3����~?k<�۷�q;ǯ�D,�(�̱C,�Xle"�K���i�,'U����>�t�훪�)���L����|�I���qc�tZ�Ko��S��Du�02�P��#�Z��vǍQ�s���~6e�Oܪ
�=|Z=h{���~�7{��=�dj��c�E���#� ��ZM�0`���x��jʤ7��`�k��Ge����j��цj�Ɓ>�� �e+��L��/6� �%��ǰ�`��d�K�x�'�^�H�KN��qL�<��G�b���ъ{�qH�j5,��-�U7�R��O=��}��a��}�a��~[ZO��5v�6�gI!S2��~_v���c�n���*��+�^z�.֝@�kN����oݣZO�U�oj���$�kT��x���3���Mg���U&t���ͷי��f�Ċ�Ef]�o���o����7��W'�G�d��>|�:���ʭ*(G�YГ-��?yM7Y���.+�?YZ�Y2A��q�6��c�E�;j���s~+��C�vN6��/��!�}Ko�ؠ��4�w����*����u&��?�mSo���� ����Ӹ����{<�ʛ:�y�^g	��yO���[L
�%�L0���S$���]ԑ\�3�l��<$U�]"��ڴ��
�\/M�����/� �����^?!��������`��+���c������>��n��D�7C��v�"�ɝ�Z<���b��"r��^`�¤@sOl�{�Y7���O�Ϩgx�C������O�7`��z�����0K�F}?��OHI���/�~�#�E��b"n5\�"��N�W�V<�`fׄ��)T�PAMJ��YU�k_�dUg�0�Uk����U���ĝM��j��1���Y�/��uj/�፽ZRG��{�û�1�o�y����~���G��B��8�`>tO��&z�@JU/�Ԋ��0�[I�{R��$v��iߒ㊩*
�r%Xk�RMt��j��P	��PBϜ=A�K<�O��{�X"�)ޒSc��ZN]9��]�BM�.��Mk_��Se0��QX�$[���ol���S�u駛�f�>��JW�	�sM|���S���]��bg<my�N�����*.>w�^i�)p�*�{�P%��Ǧ)�ȟ�c���H�3��2SC�UeS��d+:��UB<}�=z�V��,�,|�|��٪�x�Y�������U���%���uF�5Zy�a�`œ9M����U
N`W��=W�t�Y=�6��k�a��01p�9s�Y��R^*.�9=:,��^���/G?\����g��MH�<�}DF�Q�$��1�-,�<���3���������/������h�h#���_��"�I=G���y
\�~%�*],�)��)u��ꟷ�������mG�dYzw�r��o�L3��k1EUY��$`H	�Ȫ8aB���,�+�_�K��N��8����NY1��OY7^���
.ywH䣻l��\��`��P"���*UH�|;����Ȕ�8���+���MN��S��*�3��
��8�%�#�(���u���s�\��F]���xx��`R���J�ୣoc0�k��U�0.��>�5�^[���G')�,t��y��i(ю=d��_:��Z�*&��D%I�Gc�"jJ����t��;�͆�t�0����'N	C�7ݕY�>��C��V=�C�?u%�<�f#3�
�ʺ�3�e��+9��[���0�3Gpi�;�ː�횎`�C��4����|�ka!�~%TQBN�������՜�x��F�yB���8��s��#��&s�A����_>�ն�j����Q���
"�p�.�/2�/���A�W@�/j�_&��T�Z�B���R�����.��b(���Inj�Q��Y�xt�fv
;mw2���λOz)a��u
.mnIzہS�}^]=W�P5�9�)4P�A�-w`����G�Ŀϗd%6����}��F�(c���{���C��´�
�aSP���g�/5�K7�"���
��pa{
�σ�G���]vg'�o�yr~Ώ��S�V\ih����a��Z���+bEP�ǖ7�-�M|
�J��K�-�������{5��b�-��>{�|��0B�d�-π����)x��G�*�~�U�p�џ����|�>���9t�
o��kl��K����'[���~��b����w;z�� �4���ț���8[���
7��f��GN�
�~��R��o&�0s���HO66yN����oZ0�5y�����F�U��)\�#"��<f:IK����px��c��l�}��D�
�5�l6�-Lc1�ϧ�D�/
<�Z�Ch��r��_'5y$�ۭ*��͏�J�Wra@�Ja)|�:$B��'9��6R��v�=5=�ٻ`w��7�:wk�A9]t]��@ T�A-@��mO[Xl��X|��0��ʎj�A�=�7W���{\���<xDg�$��ؚqg�:�P��p�dЪa܏�����w�y��(|-]�5�������%%�G�)v�%x(
�ȅ��`4L���f���$��X'�$�z���ύ�,J&�[W	[�iS�x�0�S��3f���o��K��m
��73}�	�8D9u��ʟ�O�y�"fdK�CO@W:a��K�߬��/e����|��ظ,-qd+9��_�G��{$d�L���w�K{�Fy�M��/����ݿ}���{��qؠ.�<��>eg�w=��^���#��U�V(�0��>��;���w^j�^���V�/���Nu>�����T�G�G���x�-<Ŀ�����Q��R�I���?3WN0��M���a�J�O�F��劮�ڈ"L���ޱ�|�
��k%3Sz��i�=���r}�s!x��{���8����
~�-}D]�#�7���y(<�`r��tl$'�؏�&O��7e���\�?�_a���:X���������j���k���H&���u��#gm<m�����q��?�d\5�A�ޚ��+�Vu�@U�rڰ�纝t;	�z��i�A:K�
MgS�::@s���L��o��������\J�\��l�y�v*��%�0xɽ K�Hs�HLl�x&}��d#q�1�3'Ih-&��w^1$iX����t�����|�F�9��t`=؃ ��&'hR)�`x-�B��nX'�fo�6eR&��M�8��E�fS7�}�BY�� n�)+����5ʵ��h���*��*�r�Z��z�dYI�s��w�8�x!�h��Et�D=�(�d}5�ˠ�7
�c�[�<"��i2�ҚQw2��^���++�����6��Ca���d�FV_��%��2@�lQ�z���V-�A̭،2P��bv�w0ؔ�4�`_��@DË���%pH&�W5Ya�o�nXOi��Ds��N��,��Fu�'e=�}��AOݽ[�����ҩ�D���
~��^\D�6��Ĝԋ�R��̍�D�
����~�G*�Nm芔�U�?I8|#NkǗ���ܴΆK/^͓�w��3�X�/�o��9��k�ck�J��Mu����
^��Ћ=��5�M��k��/�c���\\?�I����-�Kx7���S�Ȭ,��Ԛ�.��+�:�N���d_���3YH5�fT���d��FS@�˗���ٸ^��p�Fu�R���K�8�G���=4�]qP�j]���bF&*H�о�}]��4�r�oMg`�]	�k�[������X)���"~��u���-*�g�貙a�L�	�T!�'a���&W�Q]N�Wxy�����\F
��⵬��M��U����776E����YU����N��{��e�H���&��/^�~]��x�<ݲ
���qu V���擎B��eM��oP��d�H�O��X��>�ed2c���lO^�#	�R�Hb�.�CDUa�[�;�P�uYOo���j$iÁg�粷��J;���қ�6���cU%��&�G\�'&�`�{����FI:|о�A3x��;��f��<�q�&+Ը�깤�.��lLL��� �N$�|U�@b� }�����빺J�_گ�x�*�te_�a�N.�q����<x*f4��'/����B�Y�H��͠Z�h��9�:6'�W���$��x9e�R[a���^�;�x��@����w��ly�/�Д� x�U��B�Xl����>��b�w'��JaC�ق��vP���k����E�)3E�`K\���{.�3b�H�	�R�\��}�Ӫ��ǎt��ލ�"�E��~��a�QsY2vDzJ�a�m���ς���)�9�C�4���ly^F:���H;[h`�9qU`�+]��l\���Vd�q�����l�\�C��_��aˮW�l�#
]K8��ݮ�>��~}�4�Z�XT���p�VBJ΁*��s��K:bt��F�*.�� ���Y4R��I:�-&պi��j��>�;����]S}�˦rߛ����m0z	%\x��ua!�@��[J�z�B��-�.%V(��r������("pL�Œ\([z*Wܒ5U��r�Sa�S)?�2>l��,���to-���F�?�k�^�7Tj�X��Ƕ<EC�IQ&Ǥn«!�wa����й�)�G�)�(�t=�#��>�=����PK�mW����w�Fsetuptools/_distutils/cmd.py�<ێ�F���
%/-�O&,�N����8�l�$�RdKb�"y���
��n}����>��GT�����U�$I�ڌ�X7fS�����Q�A����X��*�˜�m����u=*�U���-=˂�(��$IrsS�n�9���f7t��==�`�,��>ߏu�~�_�ްK�C����Ս�_��<��S�{��
�����0��?���������n�v?�
s/9uý�Vk��nG_8�6J�Q�ѻ�QE[g�;�j8�^��{�A��QF�i;t��e�z<eѨ�b��m�S�+�t�H����H����4�6�*Qp�)�5�ES��sY�Z�
qJ�h\��o���sں���}�zP�dMp��j���
�9��@���fk%{��Y�=�c�)x�u["<xg<iF��t�{�.�1������:�È��"�S�P'�Tjewo����zO��f�ΈAE{��E��m��Qu-K@�זL��O#��؍zx���0nX�@�:�����_�T\��a�S��s"BH@��d�|
bP���`�� �$�P@l���i�2SX�S��r�㡫2>V��hL���5�|	Ζ`��k��~y�R@8�%&EU9��o�ёf(xűn�Z�B&P�~���5#����=�>���Ҿ�V�M�M,��J&ɔK᳀"<����m�$6��b�zb�
p:��
��g��ȼ-@roX)�Fȅ�����n�	��i��"���k6Np �JA��x����_B�=��P��*�#��&Yg�1��][��!�}���R�W�g������T�kW����%�P��Ch�K��i�[ů�ʒIP��R�vs��?������T�C�YV�-*�0�	6:;��3/�<�`Q�+J9�А�y��)G/��ll�L3ڈH�*�Pյ5�	��@U����B��X;�Qw��n�F��y;��r>�>Zaɣ?	�Sy��|et��Ȭ�����4Ys�>������[�`�^�cs���}���f\qt����Mľ7Bl鍵�,�y;��j��]�8�@�0��9��3� ��8���C&�֯�:�x66���Y�[b���o<n;��@2#Y���E��S����a��^S���(��"zUY��:�O|��}�#ã,���	xw���
��U���l�ާ-��;bL�`In�c�A�5(pZ�ܸ��}�m�lvM��j)Z�7���J`OwD�u�`
�����E�/�g�l"D)! ��;��[����|�ဃr�i!/Z@J���P@ts��k��sB���+��k��\+�8LZ��鰦mA��+p^��D	"�K={��X���]�Ic7�g���A��<U�9�X$T�S�LB��V
y��#:�<G��t�M���?�&�BH]�π�w��Ps��@����Ѐ�l;CFB�7P��n@6W#�N��m<�S1T�hۺ��z<��;������xۏ!>0�ur�'M�uؼ�'�1�HB�|f54����Z{��^` ��3���h'�	��|
%�����AX����y�;=;�p�҃n��	�0�
2���c�c(�2]�E�!����vɝJ0?g%s!%�7�U��٫db��GO�j�RT2l��c@��n��e����3ƙj�a��B�L�E��N�;2y�n
P�;�)��9��@	3W�?8E��m������8?O�����uD�ԟ�O��y�j��D4o�_B��	���x�Ł{�'��N�-����6
0@&��'�x����1,��8
m.���T
�*$���R��ol����p|�8mD+fJT|\�6�w��zԯ�Q���Bq��[�	-�m���<�\�Z15��a�ɑW�Q��L鸕���S�L9�=DD[��S��Vf���nϑA	@��|r�+���%b/n=��\�@j[۲O�*��9�G����<����:�~`�v��%��T��J��[Uu`:@��]��9�4��Q��˂ׁ���5�@�`髛L\��r� *3I�@���	��gA(#�{Q�z��,�]�+m�<�D�$Rh�W��d^�` u�ʜͣth��MT�d!A����)J�rّ�HrQ��M3���u�Li�kI�+�^�I�D���OڒJ���N�6�eD���xo���F�F�cVL
��-'YKل�d)���\���N.�m��|����Bח�oQ��>/u1�|�B������� S5ʇX	W���Û�(Z�.q��2�D�Q�C��Pom]R��4̻�m1�Tzoń`d��0���!-�����0�ƌ�$�0h���9�FX���YT���u�[M�>��L*jwT+�`��.Ii�U v���1�0�����c�	�2(�\�(�ww*�<s�$1}n������J�1GѶ݄�&�6��A������o�}��A͂�)�Fg�V�O� �̩�A{a-��0�H�N~�y�Y��tM��_^��
c��.��g�����"�y˫�
�0,y����y�('���q��׉�v�M��Q�>�z�-��a8�B�� �XI/�ܦ�v��(Š���'hy�3�y��N��܆r)v����!2˝�7�%����G�;�Q!���)I
��-�!m��f��I.K��쭒��E��l'��(Xw���sة=U���Q����au6���V��U
ۥ��
�f�3��gEo����N���y
b�X�
�DP�������?j5��G�ȷ�>|������:�>�CG��5�׮���eJ��g��U�rh��Al��Lb@��x#�5�9��a;����Ҏ`@+��1T��3��h�OX��y�Td��$�h�e���Y����L�Μ�p�3l�
,>�u95��b�z��Z�����ٹ�j+	�n)�xG�y���q8[�|��F��RK!WK�T,���C
Gr�Š.G�{�Bw�l�Q`�����Jw�Nf�z�q:ԣ6=�wkF�D]�t4|�O\��L,��`�&�,왛��B���F#�X$�g�d3��d�H���B����l�q��7=�6���Qt�\N#Ug�6r�Y6��jT�S���g�$g6���+��2�܇ù^->��7�f�JeI�jK�
$�.CR�FK�J0|:H`�W{�����G-�"�5@d�
�26/r1���0�9���My����7�8�+�����B��˦��٥pX�~���L�t$���Qb�R�=s����gbGލ$���������v�^e����s����UTiOPs S�?]�1���Q$|+�"�>��d��"|�?$�-����X>��:7�
�k-���t.��u܅
���n�{ ص
�3z��<����Pd&XŎ����~�,}]��(��"�d�����q�������{�vY����T�w���F�_�ҟ����/	 2����
T�#,�؟niW	QC�y�a�Va��ѹ�X��]��є�_1@�����Z˴�֡7G����2>U�\g6}16���S�K,��Ӗ7i����E3'�V��%��zx�?_D�z������ �h��o��A�5��m`4^?�{�]�t.�Q���5
W�s�`���{�؆��L~����#
>�Zq���ʼ<B@��}Q�^by6q �y*��sp�qW�E�@T��S�O6�'�H"�/��G�t����i�N�9�i�Ue,���Pר��|�ei5\B�\
�'��r7}���p�"*�sYC�F
�L6�Qwl��2D�c;J��y;��E< fm|nvz��U1;:�}Ie	�&T��jnz����a/����"�HW��ؖʌ�+��'F�p/�J-/�vR��x(�Lz̈��E��|"��[��A$צ��Zv낈�F)4z��簉u�a[>*3Ú��_/�\NO���k8�V���y�ǯћ��
̕W2�#�FK`�c{숱l��)����>}�m��&[gsk霭��r��Q/�+��9�R�_��Z��n����
,��I��q7'JV��AXH�uۙ�]�/�G�s ��� *+�i��"4���Aupw���� �\.���rC�ē��sF���ڗ�p����X�����0A
|nğE��S����%.qb��X���<�-:HY"`������h��-����fI��~i��%�Ih�����#U������Mg�::���/Û3��P����;0�T�֛�ߥ����o��7Z'
��na��)�Fv �su[6S�a�+����ؗ�
	[���΁z�rw���E'�ԏ�>)v�@!��_�i~���|3��l׺�s�w�^q2�
��1ؠ�G�m/픽8d�}.b��/f��u?5\�J��I���F
va�����V=7���6ɮu����I� :��njK�����Nz��'L�7���K�h�c]����{�dG9Ʈ�w_u_�u���/�����n��Y�cn�K��X7��K	�����M
Ó����U���9o����x3!���L"�h/}]r71v?un�kGό52ѭ� 2u�pQ�ó��P<����Qt��p�̛u�
eQwWW7�Ǐs�I�-f�i"�2b��=E0�A�g�/2�#�
!��2�*�B�K
�zLj��s�Y����au�����.�
��	�ht\�S�.A��>����\�
"�6����p�w���/N�TS��h�ޝ��BQZD����Bq.�ڳ�5a`���F������\.�i�����'0f��bi���,ݩuCY{Ȫ�y
ZN$� ���y��D�K���י ��RDϙy�L���/]�=n�����17M������y���\Z�D]EPU��h���D
��I���ʳ���<�C�n���
�rq[>���g@N��Q��
���z��ɰJ���(�>b���<|�G��c��z�Uɽ�V�\9���Jip	�y�(��a���[C�Š�&���e�3|�׶%�<�J*��BC�(j��%��vžc�*��Qn��S	1�v��	.f�qN��y�4��sD��B�}��NQ��}:'ؗ�D�
�r��~�eo�Z5t͓қ�g.x.(O�I�M:���eINI�|�.��Y�.��}|Γ���V�A
���]�Z:��e�w�h[�m5�R+�T���#@ @!]���`��v/�
�3B|�-����SxmK&��E��L�b�����t=�T�K�ON6��9���^��q�e!���P~��9ՆB8����5!��N0��q��դ�ͿPK�mW$�Fq��setuptools/_distutils/config.py�XKo�6��W�I�㤗�Mw����&(�0�m��E���q����������b���8/~3�h4J��{�35)��I̤��S���22;�n�77b��yJ��*56/�R���d-�YJ|)�������؄�F��ө4y�6	F�Q�w������l�曂J�$����pc�gf9(%=�]�D��A���O�V�'t�\��9XTJˀ�){��oL*rx�� X��2gdNwlz���<��w�:(��Xd?��_Mج�&@/�8(����r�L�\��<cN�|:?�g�_n��O�K�պP���}�	�剐�ˌmhr�[��@-+_IVŵ�GX�,rfWi�sfC���"���Y�'
k��pLB���d��k�E��t��)9W�9'ϵx�����LA�.$S�`;���/��=��>ˈ�#��jbj��r/K��
�1�������`4Ym�^�d�����6�6Ks��0l�v�WF��'��_���^��r��G[a�� �lU�0����1q�ٴ�r��,Rb�ި��}	������q%p�z��SQ0c����W�W7P`��ǟ��wOcr%~��B�aL(�ƴ��� �fQ똞���3?�Wꇢ���΁z��|M��](�4nZo�i��}��(|T<�. ��홚;W!��
���38�
P�YꞆ�R�$��1�{�&��m�b��}+�VZ ��b�I�	6c��ɘ���$d��<`I�#o(xUQ���#oO(�W�q��X�_'JK^D��W�l�Q�f����g�V|Z;�T�#X�	v.��+c��łRL�m@54Ww�M�0�d���_��5�)6�rfl3$�zA
	L!�#�s��-�w'PhNخР�=(gi����D#�o�v'{)Y����mS�����p�,�Rj����D��f�t����9�Ž�*��R�w_���K���8�-02އ���8.-�g�-U�mW���P��%
$����˾g������/�J�03Q����ox�Gu^Gդ=�9���Yd�t�A!U����ÌDC@�ςgF�KL�wC�bÅ�e�g�x�
�v����T��C��Ϟf9l��ןt���R�=n��꫟p�e���eH�Af�x��,�"��.��D������}p�1���A>x�1���k55O�`�a>�٫�z}
�s~�tB�գNb#KO{X�G]�u홰W�6d��gw�F�D�nf6��4���'�zt�j���>�\�j�-���Ȋ\�N�x���;��3��	ȣ�?1�"�,��G��yYN��e4"R�p���TƘ1:��nFn+�n�s�9���],{n(���m��������{��kz�
�a����Um�_o��Ɋ�^�̜�4�<���n��Y#�_�@K���PK�mWIS^��"setuptools/_distutils/core.py�Ymo���_A8XX��B���nz=��.v����AK��FUR��+��;/�$�J��&2M�3g�-��B��ku��X�X|>*a��)�R��([Q+U8��SBW���*�c�p��X��8�r�횕�wu�jS��t�Q� ,�e	���T$���[ݴi&�]��Bׅ�*oA� }���]G�e]�w���o^J�[Y�G��8��g�؋B�u
�Z��'�3�IUd��r�X�q��n� �'Ԯ;x�����e��.Ly�X\��F{�!���Ld
����L:�/[�*��OԙX�|3L�6��a��������w/LUϭ���Ͼx��Gp>��b�ؙ�yTe#*�<(qP��"�R��t:��\�� �v����8�(j~>t���j]p7��G4,�w%�2@�q+Z�$�6��
)d4�����$�[�M����� `e7~��e��>�}/n`��Ã]�7��_X��p������>����,�Bc#9^UZ+hѫ��nfb�g1�አ�����󶵬Tz�˃�o�Nd�l��N:��Gsi�7�Z�Qޠ�]�.�L�D��BT�s�֚���SG�N���}4I�Nj�`��?n]k��ܷʂfx�/�i��_�R���O�����C[�4����d��)�֠�x��GL�zP��d��g�<)��e̎O[UI]�/�o��+�?~
kĪ���9\H5/�+��(M}؞�����;ۂ�*:/�E�5�?�T�F[�dn�U�� �����p;gJժ�M�_��!!�]���U����U�u^v�$�y-��0�l+�[C˺���/-+��J�{���魮�6��(8��[��;�LZ�p�]��<Z���$ϝ���˜�u}�3%�T5�.XiY:�������[ٶ���I��I�x�#
q-
#\��=� z��Q�'6B�`ma֘ť8����T�z�c1��Ma����w`�}�_��@�HN�$4`Cֹ��Ȃ�;,%|܃�����*Is�B�P��p�0	�x�eV�E�A���ϐ�v=���l�4�f�5ƾD�K��d���kR��iԒ4�4���D��CD>[$hr2!X2�U{�r�a/4ϰ�z�i�u` ���Q\}��xr�I[��)fq֯՘�3�sW� �'A`�_$�9W�#�+H{�r��C���$
���K��_hl31�(q�}�'G�ДN�6C�kD�G~gÈ���XaX�9
��Bg_8�d�4�|�9�8/�����9X���Ԭ7���d��0srXXJƃQ�T���v܁�$h���jo�� ���(���	!��Y�����S�
�W��U_aL؆4<�w4�d���,��s
CȜ+���ۃ�Ѣwu�ؠ•�'�a�w�0b �=���38�""�p�`�[�C02j��Q�B0n!�7��+�i�P,ˈ`�a!�a�0���B�7
�!?��d�=��1����](/�׉3��$�^���12�C����h���������ޫ���tw*��wf���}:c{�2ႇ���%W�=P[�G�\F��F(M��je�B���1q
�siN)�H�n�X.�N9+St�P4�z`�*y���d�-�*�'��/Χ�1��O@!����t��l]ѻb�ӗ�>���ˆ_�M�
y�\?��c^�b�_õ�`�,�?
y�KI�ʦ$�g���)��^KH�Y΢����[���e�'L��%��@8>��{�6�,�;���j����n>��U��n�%u.p6s1��tK(�`�t��Ľq������;�!��]�j3 �h�娍/Eь�忏i�ЁI%�[�D�̀S-��6����;kn����|Ћ�]7�4���w��K��QCi<Ic!�'ˠG�GF	L&F.�^/G��>EW5>	n��L��7#�{ݐ�)1��h0[L�������a��T~�f.���z��RF�Q�P	�$�v�d'�G�]�3���`}�+#��_�;{��Z8:(	�0팈߈�ך�ݢ��ݣ��?�&y(�u��aM�k쪮�)Y�!�YP�<�[D���� 0���U�3�? �]�R��a�*���i�-�Ģ.�~0�������V����Z�o��X���B�.��󧈠ğ�&@K��,򱍋}Kߧ�~����K���I(�Pv��/Ğ���z�k1I��܃�ҷKX���qS�z�T�4� �݄���55�q�z_d	L&��"���1�:	�v@o:ji`Ģ����K6|Zn
�J�4X	B�b�1���o��VQ�`-|�F1���AY���f�+�y�I8�*L�N�I1PO}��U��x!#�[MVQ���mWtVrm0Q��1��j74X�&*�ϔ�7�d�X�"cW	��WXA�]~�a�X�b��݈���׷O���Đ��r|~uCU�ݭb�+�4����mJ��N!�W28��`s�O�7�*2W]�
��T��>��I���,�!"ސ��<SW��EmI�Wt"�_|o�aN9̃C��u	E�3�0��Q��;�_���
�${F�G�B3/C�b����)*�k���IJh3P��{�c��cՄ%��!Y!L��Oh�m�{�J�9�_�r0�u�����.A����&%uH�Y͍+�^�X�o!`�&5b�������\m��o���$6��`^P�I����Iw�]�nhrLm��#�~�뢩t�M��8u��nE�)��>�Ȟ�k1��<�?*�Mx�5oF�e�	��+񇪂�~4]	L�[L�\_��L�G:�[՛���j�&R�2'���!���(���c�3�?�{�q��ړVec�����y��sS/e������[N^!L�ʷ�t�F�^�z���8�x)�@����
�kA�%�Odg�]�^�j���rT]q?ʱ��<��]/_���G�6Ȯ�T/]�PK�mW5��<�*B(setuptools/_distutils/cygwinccompiler.py�<ks�6��+Pz2�j����O�����f�ę$ms�ɨ	Y�P$���{��)�N�դ�D��y^�	��,Q���eE���*�y=��˛,��
gz�X�,�c!&,f�Y�wV��oE��"7�m�"��*k���ѳ���K씒��i�c�%�sQ��B�Y!F8�EV\�=�!�v�,ٰ�b[5Ю�l�`�����b����OQ��ǶL�8y�7���.W9ߊ��	���ek�/��϶�&1H����MY�^��
f����f16�h�&��7�lb�\���%<�8	�����
M~�N���c	���-m+�Vu\�ٺ�iz��4>!KjN�Y���0�a
ٟ~��@n�ь��)�2ga�
��:{�@�1_w���=�'�FV�aA\�N���ĕl����΄�k�ɪH��
.����G^�����Rrm�6���l$�p{K�߮�\ �[��4)K�—�gZ>Ռ0����Z�$FA�$�����#�B��,�A���*���w��
��3�J�ؚ��[u�s�Qp����,Dœl���L� ��l��݈�~pu#�Z��������Fߜ/wu\�i�0��6(� ^K@��e�jkN���Q���D�=0.y�����KqvaT]o����S�<�T$���5O'�4�q�u=}|�Zv��4�ajҿ�R����#��4�+5dk
�f��Eg�d�
0�>j�M�!g0����6?SX�=�N���۳����~��!�BZM����`�$�Ӄ��T+���I��j�@d���-A��,�F[-�����:��D,x�n�A���F��Y-d4֯��s�ʎlZ��>��/8��Ha�Q8W�q���*v� ��-��(xr��Z	
�A[D��믿fe3�q���!g����������=���J�^-��H�U���{���m��#��"��ҳ�3���&s)�7��_��ڏ�u��@6�4|yUV���W�_]LX���ǥ�fr�Gjn�4b��r�47K�jF��L�%>��u]������'�\�	�˨�#���c=��#h~�y2�ddB/�kY
��z�*�xg��,9��H�3���k.�������6�(�q���]��7�/X�2�l�<7�T����5Y.		�.�2��9��#���ɲ*�#�;"�3�_�Y����@XČ�j��ٹ�>��.�+=���s�m6�`�hh4m�٣��o!���b�<��l�]�D��~�w��V��cPgG�~s��߀Yx����"��q���{����8��[�Ϧ<��c�gSw�]pu��Q�=��<���	�3�
z ����TF�KX�F�z��WG̀��W�Wfܧ���?�����yQ�f)7�5콏�{��ރ�@X����~=�F;�}
���@��ж,�Y���2<_O��+0U�鄥�~	����O�������P,
a�N�}5�_�R����*�\n�q;@B���l\!H1�S��QN

�Ah�s>Ao��kx�KFA�d�˗??�����W�	�]\�`��jo�f�r�EA3a)$����yCh�y,��u�bN��E�P�x�YS��ٚk
�~'u)�!��(#�t�!�xq����-�b�O����X��ӡ�����S�hʫ�Z�s�;o _��`��%lf�x���b���i|�S��`��f�{ё?�LW��Q8e�9���
)�����@�'l��V�3�G�1�?'���B�(��?��G��
쑲�D ��Hc��B&! �����<��	������R4�|�@���qeFE�x���}�!=�%m�(��qoZ?��0T���;��<�dw�t>�
��	�an�9��zI�n�!����^]�h�у�x��{�ѡm+�TVR���w�m�v�j!�l���
E�H(d[S�0����NV܎�k���6R��s\Q��y^x��? ������SkUD������I��O����w@�
68�<�]��	z���l�;f����h�L-�
ni�^��%U�m)�o"H}k�ѳ��l޸Ak���(��xYN��H[�1�x�N�Xlz�4�fU�★!�x�AӉE9IŻx� 18��<�?��ly��;�_y
-��p�-��\f�ֻ���8ŕAcm�;���
���Il[p�R��ij�I�;Ѳ�%�B��W'��� q}-�WcJ+��B����B��M�R[a,�H@nQΰ�^��2���$%Z<a5�ܢ�v��b�ɡ� ���j�mx�`g<���˾��+�����*B>��4���g�iya��>���Jx%ٰ�>|+��k��[�	`�x��H�j�j#:\`��v�>g_n���԰�]�������1c�J��Vn�Pj��A�S.��f3H���Q�;>�A���j��zk,��GniU]_��܎��L�6f��N5G2��%���� ]J����i,y�Wź2ʅ&��`'$5�W15璲�B�n!$1������s8�c�[V��
�7�ث�Jt�P;�}��qv�gzhg/O�4C�\][���A
�L�c5m�
l����[g��N��TNWM�
�� ���;9�T�N�E���H�y,MҮ.�],~{���H�Ad��\��o76�4	}
���+��)�Qqh(���M�Q���(l!��HI�jPTAX;�`T���N�
c4tDE�ySۋ��\S$��k,�5:=N5g��$���nK��l��]�z���iEeou߄�1�������z@��\W�-�7<�ضI��ζtZ-V�\�����D�M������~�g��W9+u��
�b���*c�S\	DRv��zܸ����L›ateF l��k���أ��&��`GjH�S��?eV�f
s"�)(��s)Eȣ|��lP�
�f�������-��0�����O^�/�X5��t�dŻx����7��i�Eڵ=Col� |%+���&)ȃ�[5��Z5@`آ�s��͚���)d��)A��FH���f���}h�LnQt2([����p������1$��$�G��'J�����*Ti�]��7�J����~P!~��Q�'��{�h��P#����n6�����m����8-�s�Z��$/a���(z�X�e�C
u����Ì��ݶ�?�	8)�%YwY�RW#WY��|p���f���K��q>���؃I3
��/����!28f[�!Ƽ��Z��z񏮝��,�$�vO����3"xV�u�v�Ҙ�� `9�F���B�Y�\��K�R�X�����)�Qͫx��짟fS|��)�a�޴S���;֛����ߐt�L�,]�G�Z��]���W\Y��ᅢ�9�v�g�;�R�6�tN�8)�����T�r��3d<D�*.+6������H
+m�u�N���u��HxO9O��S�
xq�O��*Y��DUiO�Rv:urU�wS;�wD{���V�;����WSZ`hT��4v�ϙ�w�
� .ic��D<tj��J?�@߁�$�Wm��k�"
����z�G��c��*
�L�,Ǯ���%\�W	!�L�Be�
JƷ�'��f��}2$�D��	��]��:�	��v;�VF�Q�>��,�o)��W�(��扎�U�F���jj���m�X�D�#t�yg����S���
=�?�k���O�X$�M� ��*oT�C]S�
�#^}l��<�#���ȋ�i�stD� �����=���}�K4ok�t�5]�J}V��	{B��6�L�m�WG���q�z2�rҁ�-����<)�SE�LF��O�����%BiI(�l���q��<g���G՛�;G22�4wF{(Ù���Α�a��_�G^!
B_��$)U���V��F5�GO��Z�@��KuV�nC���Qqa����>����Y��#E�}�^��+��"ڃ�[��K�j~�=-t���Ćw8j��Zƅ�� ����lJ�R���ɉ�ص��m�ԃP�k��-�gT��|���PO�F|���;s�����p�X��������TS�K�~
�=_��%���Cg�(�[�������w	k,$��1m֪q[*��
q�&5S2���G�Q����>zy�V=E�������'�_�ۦHx���<u����z����#�IS����G��M%��I���Q�,
/T�V�!2���b)xM
��M3�'����C"b�u������
R� tN,���t���_��n�}SIJ��?�(zn�a^�a^���Y��Sz@9
䂍�jXGFv�ޣ�.�l�m\�8�fa�����#�@/�
]��u�q��c�tES��]��3����;����!�"�jU8�+_{�t,U���>�P��,-�%^�mϮ�enzm���i,��B$\���UGw%Q<E��b
_U�v���X�r� �i�총�UY�Q�)�^Q`�Π�IV�I�Q<�@�j	g3!C;�f�Xߚh4��_yךE.�˶!�N:�?a^APUU���o)����Z�EV�$��"��vٜ#��se��h&�em�M9��Z���Zqc�lIA]u3�A��
�E� �p�V<3;B=
�h@�L�y�ǔ~햤g�}�d�`4O$�z�����%.|�%��k���o�ix2�t0���H�9�EVQ>�m >�e�ԕ.$a�����o�_����9e�j?x����ீ�=Ɛ��Fs[�$
A�M[W�s��{�*.:�wl�C�Av�O���m�n�[hS�\��r�E}Յ�5��6�ϔ�[���Q��g��?'�����&���PQ��`|��e�ը��:V�4��!=�Spsu!
�4Q[����������8R?�*��x��V��A�]ɪ���&�䀜&��M�µר��;7u��+��P��Ϊ��6�	u��/u)J����u]6U0Gjb0������m��-D������f�>H���2�jb����S�Bdt�Z:����+(�Tu��y�l+�����
~1��04o?t�N�XpuX�hi����Z�C7M���)V� W�6����1�0�{t�
`��#{݋��UB��pϺ��w��N���#H���	V��x�PK�mW_�H%u�setuptools/_distutils/debug.py]��
�0E�|��*H��E*pk;K���
y)�k�o�[��8�㜲"cNp_���޽�w��Op�(����24�RA�8놢��+~��Xjg����D��[=X��s�I��a�\�PK�mWk"#��
!setuptools/_distutils/dep_util.py�WMo�8��W��(d���c��] ��@��� �%�"B�I���3��);��ؑ8��Ǜ�,�VX79!���3}+���pG�&�8���N�b%߀��
�͎Y��q�r�Aw�	�m�T{�����I�73(k��0\��;5}1��L1y��n˲,
tD����B��hc!>�3��?ѣ�(Zށ�n`m�d
��=w�mx!�W�&������
�*�"��MX��`x����nE'0�3偪[msw&��Vs�*���&��=�N�>�-���s�l����zR{�ܘ)��+y���s�(��6���9z��vd�߆8bc��2Wx�%��w����w���+Ѳ����[��ڢ�޵�����ŃRsI0߾?���:�?�=�ҡD��N=������ٱ"����]Q���\��#�@y��6�Ԟt���p�K��W�P02ä������S�8kzp$O䱼XZ6�nG�Z2	�'M2 �����Z����g<�#��k�)p� a>0��P�Py�u]]HCM�5�v�^��$�������Q|Y�_Äm��]�`{חu��
v���σ~5��9G�<>�[��t�&����
�Σ��Q�٣x�������4J3���`�H3ȅ|�3��dT�*�d����y� �E�W~rW�gp6���ntw�2�� p2�dy�HKL}7x*Nd1B[���8EEP��J����g
�r����?���ρ9�T\�p+l4化u���q ���Ǣ��M��6� �T6I��第�а���d�t�˷0��ʊg��Puu��I8�.�^�6+7䉥aB+�5z�	�.��6O֡b>Wp�<�Ä��v�FswV��Ye׮G��S�)�ek�7fR%-[~�암���n�.��c5�`�s=�pim�<�I��j��/�
�hѪq��cG�7�.ߥ�tΡv�WhC��5n™{����
}�������l��!3
jM5n�1M��R�ο-�R���p_f�b�{������ԑg=3-��(�c}�煍0����1����0f%��
-�a�`>̼��r�g��$B�D�i�D�|J��W����陗�����kA{��ͭ��zZ	*~��i�/T�hj��{���6<[�z���m�1)�F���M.��D���0�`�D]@�d
��ٵJ��:�_�iF�퉟,!�O���;�^8���3���.�^��7�X���Dž>�%�[/�i�EW�~Z�qa��PK�mW�3��
b!setuptools/_distutils/dir_util.py�Ym�۸��_�:$�yu�E�
�m/A�%-.) X�Eۺ�(U��q���̐�(�ޠg �]i8��g���(��mY��(�5��X����$v��ڲ�F�N�R�m_I[꽀��ڦ+�R��'a;�L�\.��n�ΊƄ�T��f��Z���a��E~�ߕ�zK�V�ڪNˊ���U�_,^���۽9������f��F�ZȢ(�/a)�*M>u��u!���2+hQUY�ZZx9�]n;��îi~������2F�!�-��t�Z�M�k�}ͫT!��~#ߋ�щ�QQ^�G�(�Q[I�d&J��Ց���`�m����+�9TlHDl��hDߊr',�s!+�Y����(��Gr���mu��o�
v�j{��QY�(�.�M�Z�ؕ�W��ׯW�Iu�ƨ��y�����������;{*dl	jDjd�4�"'�V��)_�������iBV%�4,��kl�+q<��+���Nb�w\�z1��Ķ�;D�m��H)l�n�
sV��,!s^�dL��R\O�w��S8Mf創�j�;)�on(�~����ܒb�-D�W����8�Y���d�Xt=R�"ҍV7U�i�����*4E\�hz�T��4[Y�����苓w��C�]�U����Ժ{�B��,��mS�(�M��V���`'K"�9��X*_zȫ�.�t�DL@!��g�J�.�K�ñ
զ�����.[����e��ϟ?�F$5!e�,v�R䐏�q�Z��n�Q�y=�Jc�y��F�S�ZD	��]Q��0T�8��ظN9�ʩ�I���K�����D
s:%[����*�G�w
	���|Bp�=Rn����@�6�u��.d,��f�_B:Ú��[@�9��"I����U-���ʦA�ܘє�ye��:\�U�dZL��!zϞ�/���i�Ҁ��v7#��1�
��H�
�46$9�,;���9ZFu6}�Df��9`�|��P�	L����B���(R��O5�x�,�j��91�e�#�W�Y�J���ǫE�Oa��Ue-E������<����=�k�%�^��	����v�,�հ�K��ڔz��P`�`�9��A�b���Qf�_�R�j����^�N�i��]����Y�ĹTW~"OU��t7�F���1����DH}ݪ֊~t�؆'�z��)^���������?~⚿P�ٹ.�tWF����C�r��gp��$w�1�d������C6u5��\���<Ó�~	�}@iܲ�E�!垬���+z���n�������#ݝ�-4�*@���-HE�;&��3�h��W���A��8G��3��j�%�ە�k\nSqR�M���@'�ie��.it�l�-��D͌�'~?c�D��0T�ɱ&B���c��m�X.�`K;�1A2ڍR��"fEt���YIĮ�{��*��(	��d$F��x�:�hp�Z�C�VP��Wԕ���<c���	�9�5���Z��% %��t>�}��zZX�

b��4lu�w�����%����f�%����t[K�Ua�=�5��m�(<����ޜj��Gs��׷��߾�M��`^H��+��Pb$��f�8WK�7����a����s��Y=A0%YIt�{~-��H��XWTƥ�9j���Q�O�Z��
��2��0f-��K{h�`*�J�!l�jrޏP�šS
=����TA~�5�l9*��/�����D,g3�f�+���-�E�c�z>kश�t�ݜD�%�=�޾sA]�[l�������{�MD
烽�z�,��Q�$���E4�y�(�5��k�b� 2$yC�\� z�'�������¼����]��uTt����9�a��m��ai�Sj��/g\���
��#��qr�2w��N��X�x��9^��弳�!����c�m
Գk)��p�4�[�gU_4WH=J��*�Yn���v�h�T�Ac�5���И߹d�JU,�3��ҍ��E���멌�
�?�mɷ~�S���ub�ƓA�8��tW�hn�E��)�W:��CN����[�g�^��l��#6�(�F�7�'����"Mr�3Ɍ��D�X��û�hZVˁ����mg������٦�nM��| *4�H?{Nau�Y��������XB�V�g�a8�&�.���Q�T��v �PT�gWW�t�M����������$&�L�u��@o�S�M�=���qG�Nx��캲��/^���a��\o��*�ۺ�}�(�+�4#���ZhB�N�͓?�e�0 ��VD�J�&�N�Z��`�[a�E�e�W�=M��/'{�\��PdʝO^���J.K�L��y���E��y
�K������S����_�p/���@?R�Y��(�eNˇ�񒛿4�
�l�)�~�}�F�c/hd0	ej��#x
Xڌ�p����@ϕ�4
��@�Y
P�����f���f2_^=���a�~/B��`��v߳�y:1�I�o&+��مk�K�@_X�'�8�	��ίf�|��rx��N=52I7�nx��j_�J��S�p{
�|tt׃��?	��OQ�6�x���q���#�QXN���N��
l���r_�M�gV�EWR��W��ʑ�����.�h�v�����N���!Faz��PK�mW�. A�3��setuptools/_distutils/dist.py�}mw����w�
�^�	����+?��q^���'Mv]-D%T$��d�'����̝����{v�ã��0s1/w�3�L�U��j�-𷳳��Z�.�oL�<j�+x���j[v�,���V7Yk���L�s�]�>lM�V�ϮLU_gW�j�Q�]_n�f��kb֋��drvV�M�gݱ��6�֜m�f��]Ym3y�3]W^�%�Yn��9;���Y?��lk�zwf>�̾Ͼ�ǯ۶i��m�]do� �g�bl�Yp�ů7e�:.�M�pi�5>��Ͳ�-�n[�f�m�kxC��ڞ���]���j�z����U�lgY�Y���/��[�{�����u|m���W����7ggO�͵���M�6��6Y�µ)����t��ve����y�e?�T�.�X���|�p�;h��]Vf?�@��/߼����l��y���7��֔kD�C�6m�jZk�M��	V�#�cޚ�δǬ�vնl��0��^J�+�>�/����;X>I�!�����6M��%ȉ3Zg�7-���.��%|�0n���6���?_��e!�<�����g��O���`�Zwha�a��r{0�lS���6�����l#�dy�?O`�x.`:���˪�_a`Yg�e��Ψ+�Fs[a�L��[�
�U�*b{X�2ÑeW��,/`��m�O�̄��b�p@�p������G�@��c'r���=,6������io�=R8w◌ҁ�{�k[��򇦋�.��ݮ��&�_���g���r��g�Msخqx��Ə����o�$�]��ʾ��m�*��"S�N��_࿿����;��4T��q�ߵ�?�l�	���`x��D���l�哜eo�?y~ߴ��ME����T��y_��h|N� ��zh+�q����o�v�y�́�p'�=.]��ͪ�E_gM$�mg�
Nf[�C �5��Lj�.��+@�pt�5�~{��C�ZO�y�<����4=��ym�q@p<�/�u�h�ms���Bb/��������C����<Y�
B�W�u),R����%����v�t���$0���SL
	 �9�2I$��$�n�6V{}���㾁��$FmV��d4 �0"������t�y��'�
|
�)��eFvsmhfnt��s�?��������g*�_o��rk�J
qI�D�D�#�d҆G�+����;�ۊ�-�ޛ}[����G�`���:�\��׋l�������y=A�<�/3�$�jz���(�PX_�LƓ��<�誧7�(f��*� g�v���N	X�
q��#P��D�fvjϓ������a�zc��������|x���*+��Vݔw2PZúo�Ѯ#1���0@@:�=���)��0!W@�a@,4%�v!�����,r�ؕ�&���@�䧓Y�|:S�h߰�?l/z�}��v��a��tt^��9t���*�FD6��j^��n�v��n�l��@R|eEҰS���i��5tC1ӿş������^r��xڎ���
�&�M{���;l��M�<�sB$�G���/�'j<�B��C��"
H���[��o��
r���og��÷��z��9.��>�	_v0�)�ٝ=T	ּ��o���\��gHV��n���~�k�M8�o�LQ���p�L�o�}y]����aS/ؑ��<��n8��N�6��;@�3�u�" �$����mW���;b�_���,�9l�'?�����@�c�<�lݎ��&]b�jNj��`�X���E�7$2���Q�RC�1�։��0��?n\�0���=��fۙ`���������ǿЉ�=
���
�q�C(���q8��Cq�@�8�a���g|����@��?6~$P�ՐI��
�k���(����ڇ�D}�8���7^���׻Lz�C�-��?��`6W]�5��݁�Y�^&X	��O&���g�SB�(D<�1��ߪ��<-`r��j{�1��[�J4�@a�q
�h+��f?r�+P'�� $���П �}9s~��!��d��K��P����.p��8�+f�V����>���gn4&�� d�.����J%�,�iyV��ҤQ�"�
�~O
�-b(,�fJ�>�뚕@"X�����F:A�|"�A�(^��[�\��Ē�v��PY\2�Y]��50u�{�=F���AF�u�P}s��߯S�2��п�"�έ����{�VG�(�����2peS�1��T\��\�$�mV��l;���D��хF�3e��J�b'Ã�rtJ�t�!V��Ȟ�/@_X��q�=_�ԯ���V��]��#;걇:���TO�]���<�I��W��e_f��YAo&���k$^3��d
���x��
_�Mߓ�аnh��p}��T5[�p@Y��7K.��*�y����`�!�������I���_E���1�X9N�+@2���G�9�7��Xk��ͦZUp�~7����B�����<.��&_�*�F����?}��W�?�|�m�����	-��9��N�����z�p��+���4��|�[�I	hZd���e������55p��OQ�^݂�����n`U�~��������n�G_C�b���G���)#_�;b���`т��рLt��" �-\!.���&3{�U<a�'2d��)��
L���M���M��'�Dg�
���)�]��k�ZwC�X���lU�#��H�1��q
tx��RYuH��	 @���^B;5r�)ъ/�����`#�/�S�@1]L�݋Z8���G�:9!�}R�װ��E���<�B�9��^ށԥ�I�}�r�!A��5r	ƭMMx�k�����ee��Yh+�ldeF��Aψ<���y���4S����";&�
��#������vYA��hrrT#��,�rZJ�gvC�h|���k*ê��g:1���Q�5{���z����b���9y�:�ʲh��L�g����@�h��](���~�~K#�R����
��E!�g��;6ef��������F�	-��[�р�oJ8����t�E�8p�&w���Tv�Nk\��z���\�V���a�X��ޓv)��)�+�Д¡�gi�vt�޺%�af99Si���f�RW�
{u�G���Souff5y.�b��pQ�����㉾B:"�7��h��Y@@w�zh5�xd/H	!ꎦd����[�(n�uD<��"y�1�'rYh�P\���+$���wp"����̀��'�rIzU��ad�/�ddy���D��#�.^�����q���6wf���M7&���K����kп�ݏK�Ƨ^o���IG��
l
lg����-;M��j��q��@�(=��]q�������xGD#�K��{�^5��1�+w�a�a�XeNg�9�!�,�$K�"�,������1�
�1�>�w�g�Q}\\���}oP��$���5�u���P�r���"�I��cJ��C�����խ�e<Յ��l$���p_��XD�>�[���h��U����&ʣ�����*U}�������Ȅ7�႖[ "�#�5P$4,ۑ([wh�"�:����1
�����C'!O��T����E����	�i:
q���JAa�h�7�f64-A���$�9�Ú[��X�D�u��Pt�bf1���®h�(a��@,�0���譡�'Q�5��ܫ�j�ґ({��rd��C3Eg:NF%�5�H�����[:M9,�eXd�һU�}��Y��H.t$�F��B�]�]W�l�*G^k���~����#	�j� ���aY�T4~G�/
��}�E ����6�m��UǠ��Av}([@)c�Ñ��:��P-��#� ;�5Y�" �MK���5���G)��Y��DJ�D��[�`4����%YE����6[���4�S�%[PǗ�DT�]��r��7��}�ӂ�Ƣ�)�5|l�O����	�����p������K@1�h<a�g��9G���H�?�r�5viw��<\L���$RΏ!qnH��P��,I�P&�0%8{%�Ƕ\�/E1g���x��yj�-���>�&�'�2���\Ĝ����Q��EX�`�,��0Y��UM�9�ZJ��(�Gj�`����w�Md
p#X8b�z���U����|��c��:�!��?��N!�y���dO)V�)Mh�p\��Q[�2
�$�����Rƪ�C�-�%:*�_[Q�?��h�ã�&��![Զ)�(����dB��.a���(瓠�u��a�Gu�J�F�&�<;Q��9�,
��X[�b.q1/��ڃ	����5JbH�k��	^uJ�::��5P�;Ŋ|�����������9�Ȯ1�N�k\���k��1��cd`�S�����WR�h�q�\d� �
��7�G�	�h�;Y�ԯT��)*��.�*�Cr_a�je>��֖�8B���]�
�=�����P���n�r'����/C�L;��[v{�s�l[.�qkM2�gU�M�_L&jc������سo.8R�h�`���Q�)
-���kР2T$�,���A���O3*�9`��w�DR~y��V���k�
����L(�Df��px~�7��\:;�
W��c�5��%%{/��q|B�2,��t�.s���.�S@��S�� N��||��\O��®Ұ�%���š_t�N���z�����xZ�y.��Ɯ�/����1�$`�%sp����
��ט�Qv��mlSa���|,��m�v ֙@�
�B������J<���:ߧ�����0���z:��0����df"�� d(E'c���\�H��XAT��O�*)(�5ƚB	�<�Sk��Oi���Re����/��^��~�E�t�5u�r�QɄ	[�LghH"��"�d�Tn~�=v�.�0p��u��6*z�Ya�����w_�)W/�yIa�~���ж���ႎ�T�P�0�ec�^�@$����ka�E ~�»����xC�=
�:Aɡ�G�c'���[��|�z�`�y�}�7�\,�.��8�2���h9���Tu!����@��=�AVD�X�/�{S�}�p�J2
�\L<�nNr�a�.�p'��	�$��c�JW��~{�<b�y�7r0[}j�C{���n�?̇=lV�3�S�uȐ�q��$�$�0�*l��%k'�®�#���s;��{?9�?��)R�1���O�O�	/+ܘ��+M��8(��{h�"8�$U!Թ�R0���^��8�Ʀ�x��L��w�@%�P
�ž5 ǿ���0lkɏ�U⤞d��es��e�F|��m�+����.�D=�<z$��S��_�{Q����������?���m`3�"�o�4��L��p��3{�6��h���U��J�I	���ӳ#��cOB�L����6Z
�^�:zY�~��1AJ�,1:<t��ϧ3M�xTlZ�[P������v�'I{��9il-�)!�?`�w��>cp΄��ϊ����s�>�d�:B�q���j77��dx3�66��!�8��e������O�7h�C��Q�c`�N9�DŽD���K��5Z�ԡ!������H�����G�%
?�0�	�'�"�&����70���JFr�L��
>�+�������t��{�r����H��:���%�&��I��H7��Q@96�N��"� H����ٹZ3&�^��ߧu|ܗ�l�#@Ӟ���W�S�җ��4d�m������M�D�Wa����D.�Pѧ�:p��]�d�Qº�uW�|^��\�q���a���J��8�xS�]Z��B���Jx�ì�8�̟g�j[Ρ��:�>���'��a�mGa��
�u	�����
?���@Ë��Aub�B8&�b�ɪ�6�%���\��J^��w�X��ېHˡ�\�a��X�<rP��`h�CǠ��R)d��5��c���J����U�踽�`�ԩ)�ɋA�l��?{,���n�#�ـ8�,Y2;�G��ZH����<4ddA��äj�5�Q4�6ܐ�C���_H��K*Aw��ܳB�J?b�H�J�`��H�!���n��b>�4m��~�_��� '�2���)WU�7P���U����輒O$X/h�<��D�b��ްI�G	EF:�.��"]�edd�g$��Xԣ�)R1�+y�x1YSP���z���>[�W}�[r�VF5>$�36��6q�h�}�H��ƐmO�������p����B��z�Q�5V+����Y�Ԇ[7�܂�t)0���G�-"�r:){�S�Tŵb������ie��N0��b �%���r!6�>x�7�E23����Ň��z&a��b��%Se
h��(U�])�B�9�O�|x�|0��v�j�3�X��Ƙ����C�$�6$��-[���z��
�&�<���l���Q>(���FX��c�ߓ�[���/w,�pՓ,�fxf�Т�OT�!�4!?ub�XL�}��E�i;\f	�Q�EV���3)5o$#GA�O��͉K���[ξ��/����l���X�]���!T�v8Z��&H�H��c��H���%~h�/-������(��{���m��i �k�L�5��=)i����BU��Ǯ�r�牛;�Pt�B��J4E��!���as��v{��00V'���ߡ�$�*8?��Ǥ�5�溦Bj�fF@���Q�D7dq
�g���)X�F"L<�8Q�71��٥�#Y6V��>�,��b�6��b�*%�t�)��&ڬ��.f�?�j[�5逊��ɂm�2E������)�m��06�
1*6�T�Y�J�mf3�<�۸�w����[(&[ף�jZ��m�
���]\^Q�HxS'�w��l��20���.)Z�� hോ5��p�����1��ek��BTT˟��sCu��RP����S#(U7ܜ@�G�m����)n`G���ڠ�ҳ$��%ُ&�=�ڭ�/��m�7)?�}.]vE�:4�B]��F�,[��du�"�R$�9s_��b"Q�AE�P@J.P_�Ns�Ԝ�����~(/󱆵ښ�TR��6L�>e��UT@?��˟�e�8`BY�=X1��f�;3�]Uz1���8oK�
qc*����'m�E���`Z���lZִ(��d|%���U�U+�\NX�`�I��1�E�bUgkyn�f��I<s3}�my�qbN�i���~�~��G�Èw!��E�,%���#�^#	��9�z4��Fy���v�i��������p���]�,�e��l�ɨ����d�i�7�g8���n��ЛR/���Ğ;o�kC���3;���Gu�
������q|\;pc������6_�k�2j�C�Z�eZ�([���&գu�;H��R�zC5L�LO]����`���T.C�R��>�u�4����6Շ�~4K�߁%�����1�>�d��Edg���:������uĝ�DlTk�H��'5+�I�GtL/�)�O��S��$�iҚ���i�a���x�u��>S!����\�V5����ڋg�{�F3._;��3������<�^�K�e��������<�?�XM��b���Sܟ!=�'˲�ŖL�*-�C�Q�=Op��W�섭(QX�b":
�)��e�.�&0\��%凃Nt�ҵuPij��
�o�-E��ѻH�A��T��Ca+i�P��o`	�
K�d>���/���"� ڎrҜI`�W44Ҽ3=7ӥ�l4�]_�UOzjQ%A��D��G"�I��Ȫ�����e�Fb�Uͽ�^�������a$��
L��g4��V������#�{��-p-���-��^���a��H�&W�8A!�_BCPȒ/����Գ�����w�K������<�;�jG�ҩ���"�PV'u���?��e�i�
W����(k�n���=�t��xߠc�>x+R�*�	��R��:���+��w��=
X"���t	A�/���AG��L^mȟ�oe#�Xj<�����b�%U!��,lkQu�Et�jG�����=�†*�!����p[��֜
�<���]��E(W�zL�HԪ1�%zCF2w�%�"o�}S�"��8ܓ�sR����<4$|�bb�EAڑ}:Ih$"1��Ҍ��G��u	�(q�GZ^w�ǽa�Cۮ�۴�
n�WNŸ4n�~��P픓��+&��O����	����~���v)�ڇ#�>�x>~p���{�$Y2<� �#G��<�T�#�.�3#��G9$�%^�fG^C���D�p�}��;��-�iaT�m�%E�%��&�c��oN���r
���8����!:�FmmOts�"ΘS�9�=�ɒ�]{=��0M�r�M@Ɏ�K���Z��x-7M�7M����Xj6���i�2M���a�mP�a���ID��e��G�Zr��2KTsj�=s�q��o���6�<}3��p�vw[|����U�+Hn�DקXb�Bbp��g��T#=�c]UI�c„	fA�\8|RT�;�%4���;.��9vMc|���e�2m�$�I�k\#ra�ӡ��PW\��<�ފӓ��o��C�A1u���I���b�N�����i�L:[c�5U�[S_�7Q�ѼeR���)�@ۺ�NR�VU�2�)Ј��K!�,@�
��� �x-�@,���m��4��)��x�*��L(Qw�(�ԳPFa��K�>S�莃�u<rWaM'����u�eO�u�$�~��Z�L��rF�w��
�
b��]m�t�G�.)�x����It�͂XWt[
['(����9�;�G���/N�X����GR��}MH�R\��*e� 8sä&���NL�:��F_}�>/"���m*������bh>}��M��7�h�}%�"��8c
98�\�f��80?��ta#;2�qpň������phЈ����|��b�S�Z
��?�w���p'E����<AWBZ86���áy���z�8"���c��2^^��&���O�ǐ'E�<}�8���m>�<
�R�8� O�!KO�W6E�#�l��@�ߔ��w3g���9�����SPt6T\��Z�n�?ugT����O�����@>������/ݭ���^$�,׊�n��G�qJbl�������<D��y(�����sK�oj�]{����KS9���Y��{�7p���T[^+��|��D�~��d@+&���Ii�5͋g�T�ӌC`nU�S�z��Y>'
U�̀����}�R=K�s�&'��a�T_o�߇�kOV�tZ�W���2I�.ӋAGߞ5LȎ*�۬*���{[��J��]vJyy�I,Jg���A�1��޻뤬���|�!�{���v���A��'q{�1�CB8�|�ߨK��?Fy�:FX���X�ʫ��wE��>�Z޸5fRc.�Bd��	N0��[����l,�	mp ����^E�4wS��n!J��h��l/+_<̋�KN��B}xh�5��G�t��&�Z����"'��!k����Ԝ���?�4��*����A��T���?a��m��HD�S%�I���ǁQvꢳ��������MN,H{Hu�{!I�I�ߋ���=�E'ǔ"�o�U���97RB/P�S��Q\�
N�(n���L�X�N}�K�Kz'|F���.���R�r{���hzV`�n�*�H��	
i�CW��2�3�D�]��z��'��

X
���@�[������(K<�"��)�����"̢v�7����JG.!�\HNI�!S��~p�,�l���.�a��N��|�+�uV����q�e�\}n9�`�s��a�]·/}�	�;S������÷�4k^�a,���J���42㏿jdW���J?s݁�AZ�����i�n������BM��H�$m�t#�mJ#�$;���m��K�W�KvpS}Vt뵿+�LB�t��-�kU:UhC��w����[�i�"],�;������:����`)��G��f��c��R�.ҩ����t���"yh����M:��*`����Ǖb��{(�G�#��荁���<�$���s\�����,!F�˨5'�����<��7GX"W�Y<Kʯ	���.�Gm�%�J�$�����P��]�� �\�x1�<�Q�s��gXc5�Y^����D����s�_�O�K;yܧ]�����$�:�Swş�Y7��W��iwj-��rqwpi�,��z�鍦Mn
��#��=�2���'-}��n��G1^<�U�S7J~�x�8�e�*��J9E�aJh�X�e�.�\;���x(V4[�rz���
ɇ�q$��n/� Hr���-wcJ���2D\F"�H��	|T�݉�6�ûX�l�*��c���0��V�j��N,��G���R�#����n���^��է�>($�W�&Ĝ - �8/�hLu�9�dj�W*r�lfm�Wj��1��B�(�`m@�iU�?h��_��[�����-�(�3��)�<����pK4���V�p�z�RS��C��Z?3�c�
��o��
T+Q�Hj3�T��J}L�H�}Gܻ���x50@�OZ�L5I)�x��2ې�����[:�4u�"i���n{)�9L�����Ҧ�E����Pm�zX�^*ٍVI�T�]E�_�R\"�;j*y�ވsKj s:O"
n������y��q=����ۯ�WS�G�Pc����uX[��X�`d쩴���l��A�1��"��&��VUN���o�O��������n�ʉ|r�0�땝�c|��'|Y_5Tސ�Z�W�;�E�v}
.aš�\��c��	�\��I�˘ Qu1��[����FB����y�9�c�;����1u�F]sAq{}�)��-i�9)�It���\�����8�[�!�A*��"���G3�kXA�-{��k��_�l+~�J$�݅F֮d!��cbA�v�R�?�剌�#�g�~1�Mh
O{.B�* y|
����PV/�Ҋ�x�bB&K��94�H���+>z�qn�B��C�x����q�T/�W�muՖmu�k�v��1��M���3����Z����I8`y���"r
�4	!��D��Oߋ���V!\�<]�,�6��Ǖb����5�L#��� ���4�#(h��"e![#R01��K�b"/=(�.1��of��D�܊LWʣZ
ܠ�#:#Єެ�]UT[��_�Ղj� /þ���I�Pk�q�U��B6��l�{P3XgJ��mF�|��6ʤ���n��h8<��<�J
��LP�lH������_�y�ӷ�����w�߾|��l@X@�'
eX���ٕ�T@��xi��n�/�5����P16U1_�'U���`l�vt�2��B�sEG?l�I@��O@%�� ��cU�L�I�����?��߲��k�m�w�Os�������VR�obo�n��n?E�c����
P�{MO�\�H;|i�Z��gl{�5o�h#�z�h�,���w�������b�6�H=�_�6�Ba�J��QYb��V8ۢ�h�붅2�jddԎ��#3j���ZmA�0Œ��l.�'Y8Kl���EC�Eܮ�Z�H1��~��*�െ?�����y���[g�,)"5*��Tǣ��Sۭ��!Ґc��|�H/|��T��݊�?��8�}n�u�(RMF�z�,�T6hj�F�ã����Q�xbK�lI�dꄑ����[H~�a�>�h\�ލ�M�4E��xC�|���-ho��f��s��Ŏ��	  �3)RM`H\��ČO��`�.=w|]ש���s�yW��e�������A�K!��\����$�,8���z���
�
��I�‘=�Y�L�r,%��MLNt�<D�Qy�!փ|�AN7���۪7��ȸœ�.�\WQ݉_�)q����-��Zdq�fkJtq�f$��FIt.���=˂ƫf�dv��A��w������?`ݓ.�3H,��"�P�r�Z���<�\G�X;�B�ѓK����\#on�5P���nF1qn���^�<�X��y���a6�~En5�_�5�d��:Ϟ���d���"}S��f��2����4�t�wL	��e;��dc�^L�e�t?�㽙s���s�Dwቺ���j<��H
�W�����_"�"i�07@�v��×_.�ro���"�76��|�m�Y}S10WZ�};��>���m�m�'f�K�D���f~7��C�ʳCB��b�b���U��P-iy̸~��7����c����HY��ޞϬ��z}�5�8)@i���}��5(/�ܲh�ԝ��ڲ~Q�&awK�N@p7s�g�_�ڙF`L�vsɞ���,Izج��URFg����21����)��1��@�kYã���uy�G�cV��	�w�����6r�WR��B?�Y�)���W2>ޘi�x��u��8���c�wqK�<��~'�M��Ū�pl�_��Wqtn��0CP#�t��@U���[<1�H��2�22�H�M
TW����Ŧ�X��C�	���	�Z��W �?���4�p��bLJC6<�}!"��Aq	J����FNa�Ү�E������l/�
�_�֌L3<h���)�������׉�Қ�`�B�?"�6{X�5ޣB�6Cʹ@_55|���ۜ/J	�r�Wi㻸<��ۚ���6v����xVS�*�흤�om��;J��`�KjQ���g�W��^nÐ
W��PK�mW�n���
setuptools/_distutils/errors.py�WMs�6��W��r"���N�3m㩝��K	5	p�a���o$%DZ��dد������2!�h��%��ŭw����詤.g�J�*U�*H�:Z��U���U�/	�:�Néju��6�T��V�Wg�?*cU�}4ej�_��>Djo�LT&,RH�i�J�Ϋ�f�=)W<�B��#[m����֩���Е*]�"��1�`�O-�.������ �
�F-�k�䖵w��n�ʴ��Q�[�eB�Q9������"�m����`ju��Q2L�&�r�f���:�pI��r�\,�F�pBQ���f���B�W�Q�w9�
��B��g|���^��b��c�|��h��?m�P*#x�`��q\��X����҈��+�^F1	4�@ΛU�ϙ"�8�"ۯp�s!�ܱ��)c����P�;K�&�ZYBe�6���hz�©]BJp� upMe�^��r	�9�b�Р6�H���3Z�p5�2�46��uIo��E��xXDN�������J/jm�߽8Z]^p��ۧ�v�k����w�f̓��l�B�� ��_�XR��भ���p�����NA�g��df�m{F��aS�,�p�pR:ƅ���Xn��}ߙRFW��"��'�2���*�p����;�C�.5�(���K�,εBo�.�wW�~g)*A�b@�T�����6�<�Kg�Ɣ"��@�I@xy:S�߄���=�&Q�h��.���g����Dv�#^�"���Z����Pz��U�%c�;Qx�t� asЏ��]b������˻��y�����d^�=��p^u	w|�f�+��3T����O_��÷`1a�H`�h�}��7�'#��SS���yڋ�b��;��FGȷ�I�$��ET-f�CT�㡟��,�n�V�%ov�l�af�L&��{v���C���.k���)
wqH��<��������H�<Q�#��p?��e{b�[����k�=�Ġ송���d�?�~(ifa�ns���k�\i<y��D�ȟV��k-�.�� ���#�+XH��C_V�ʂ���O3)�S��
l�mO����dnp]��7�W���������������ly�Z>ih����t����kW`���|vVk|��+��!�4���G8&0M^6n7٠7��ny-�v��g��G8��܏��\�%��)~��'��#\���k�7��_�t�X����<�}�����W��6���[��Z��b�S��~�����~�G�:��c&2���)��~�}���PK�mW]�4:%
)"setuptools/_distutils/extension.py�Zmo�F��_�G�0��Lӏj�C�m�9m�$��!�ȕ�g��rI�:܏�gfw�"Qv��N@"�ܝ�yff�(�rm�օM�c�J�M9��\��++�߅�"+��3�X���,�*�T����˗�ۿ5yS`�.�Uu��nW�$���Dow������^V�.�v2�6�:>?*%�� L�����"E�F�#���V��LX#t-�z��Ah+���V���������oLZZ�ߛ�zP�\$SaMHY@�� �z-Ti��f&�[���eM<�c��/��J���
�H�,�.������'�J���ʘ��Z
�N�hʬrBKUת��Lu�mTvӹ�X(dV7l3�E�4�\`ӛš���,#�w��b�di)8M�MS�b#Ȑ��F����Z�M9�e�+��ŁlX��&���A�T9Ԡ(2P���u2�8ӵ!7�|6�hl
�f�(@��Ѭ��k�_Ss�B���}�G"��#3���O�J�.��"���Ԫ!�DR��rY(���P)+Pÿ�1��}�jq0
\$�M���'npSzW�Z�����t������_��=�aOb��P�n�:� lV49)k��������Z%-���_@��.�#Tam���N��aX77������4U�sq�D�k�p0�䖴��*d�9tX`
V�<XS�4�=��
¯�n;%���R?����"��͵U;YI�9mɬH!��.t}@J�����f&�X3�wq������k�S�^�:��Nఇ�)��*�r@��u�����y��x$AL����r>U�ԓvw)g*M��Q��6L�!��a�	boɾɶ�v��J�j��YeX�x�3� ����Ϗ�T�S�~�D�+�$$��d>w7�s�/����㊹]��)]�0�8e1.�IC��t��nBDP��H�u����OU��х��y��OW6�A����P�\��0���U����E��z=���d���V����N��e%�ß�G�����^Ժ����$�1�L�c씘3y����TMI��u@��
���
�;�2��|U�j�\�na�B-��Q%f�/�񤨼�'^P�bQ�N�#��͸3bȕ��+485�4km�5gKuqُ
�K�]�,uI;��L�Y2Tɇ�u}T/�-N�'�����PS��T2�S[�O���p��WnMZ��o)~<7��yW��!�'\�
�u=`����wH��[~�5mGq_7[��uu���0�t�H2�:;�^/ӷ+9��`TbC&Vm�ʁ���Z�wl���h�H�+�s�B���R�J�Uo5����>v�̑ծNC몳��=l��x���K�WS~2xU�-D=�g�c���ف$B�Ժ��vkU��c�T:K�B�;�[*}��o40�&'�$���
��x."]j���t���v���Ǔ.D��$ࡆZe|s�Wd�.�б��-ѧ��\�T�?iwC�5è	{[�\7h:O{�nS�&։J�����|I_ZL:��M�K�q�0����{h���'G��ܚ���d���qZb%�n�O+�����k����D\��
@]��N����Cu���ҁޑ+x0��7Jd��V>`��i���u�P����,	KP�ˑ��7Ћ{u�c�b<��S�c�vB,��ElU��	�{���F�鷢)�Uc����U���~/��"��슱����AUfU͞Y�b��(xvY��8����&�	xvAH��^��ߟޥυ���!kcSޗf_���t��O^m��c�u�[E�Jj�[o�UI����-�j[!��'�s�{,B�3�MmE� g�;�D\�	�N?M�����lk�k!pOH˄g��?��aO��ǃ�1����n�|8�GC�Ȇ��G��僾>N-g�kխ�jt��ܐ��#ۇM|z�ԟ�0h�ӱ���֮LO���M��(=�F��!��=�sW�Ӯ��x"T�ōႶ��-nt!|!ޭzeG���RMu�j�~�b���S�b�c�J�m�vU�]n�ߔ����3�0M]%�2�P�	 ��v���G/zw��ť��e��
��	��A�g���$���=�@��W__���Ɨ@�&���\�K<��X,��t��/wĹX̞^�{#B�х���:wBB�	�N���`Pk�1���t������F���;�Y�{��^w\l��J�ás���%d�WDwF���������t<���k����QV2���o�?>ZL��u�x
C�^}O�(T���<��+���m-y>�~}����7?|�.��d����ϵm�M��?0z�`���fIG��q�*�C����dΒi&�$����7"Iq���2Ċ���V�� �҃��v�!���f�����#e��ר�������%%���(������p)]W�.�z�CJ�כ�I�U��x�')�P�u<�
�+>]�ܜ͏ŻʬN_��1�~h&[j�b>B�;:���d�!��̶�U`'L��l�dL��/�D���ׯ�w�"��a�ˢ�K�1.x��
BTM`�?�|Noױ4f�g�Cjn�IY��3�}!~�[�&��$[��A�e�^�P�J$롬�#M�n�3E~D�ϑz�$悊��׶�����q��#jN-BD��94 ���R��&B�so�J0V��~sbUl��#ۦ����ʐ(�`�h�΁�H��Aߥj�bX�+��9a4x
�xԂ}�VϐmCo������uw�͐�u~�8w�^��NC��@��i�����q�#q7b�}�O�<�v<��c��J?R�d:O8�A�q�}}w�e�i�r��b��ʿ��ߝr�Y<3�/�>tI2��۹��G��c���M��v!6��,���ǥ��Ūk�năM�M[S�z��[(�q�U*����&�H��E�!}��T�|���<�gU�ռ�����F 1P�X�,���~{�.�isL(�D��Q�G$h����~�֞���;�7T��0��=�3�BN���t\zzR�X'A�r���(k�S��;��Ǒp^"MFT8���'|�z?��7Q�C��-�f&�z冎pu���2�Ξ���
����j�óD(S~y����)�|��0���?��96���_U�����Y����ҏ��}�<�#��������5N���hP%W8k�W�_�"?�����2�m�J�z�j
��l��I]�/���*���v<:�"p��>Cb#snk�ݐZ��ʽ��kz�ßo�W�y�d��	BR8a�O�)�[|�g���}}���F����}�!h���>�3}g����O�%����|��X���?p�L�PK�mW�1ƲxE%setuptools/_distutils/fancy_getopt.py�<�s�6���@�L$�����U;����1I��9�WC��Ě$T�������I�N��4Mc������L��4�uSg�^l�29�w�V�z2���Y��RM��z/���2��T�Q���%<�kq��}�JM�*��1+w�8M�:Se����릒z9��{U��\�;�`���^&�<��eE���}|/�^�@��z&�.�"QM����eYgq���I�K���K����(j�"�N�!Z^5��45У���k-�yV
��E&�d:�N&Yq@"�	� �f���k��m�
�1YV���0k�O&�&ً<���],Y�nS�*9�f�Q�$W�� (JU�_����d@'0R�x���߿���b>�C"�ӺCVe5RW(]�o��O����$�sDI��q��D��`,��{��ͻ��{�V�,@�<+�<�bK��|�] q�GV&�7e"��u��>�F�D����^��6�ri~�����y�K ���l�˰
�y���K����_�
&jWf���Ĵ����E�g��Z
�	�[�)pU֫g�����X����#��/u�z����N��g��{#H`0*�����9*�g�$�;�_���8�Wu��d�R��PN(qOg�=`e�:�~�SV���"��trB��d�$M_�E}C��$�u���a��D���a�	T�ۦL�5d����H�p����H�ĥ� ��,6�L
!�Df1��$_`7m��%�a7�y�TO�$�$(Y�m���I�P/��C������d)�fϴ�ظ��,%ҠE`v�U�8���uB?�r+����:�2���:^��W����9l�B�
�;L����O�)��X�
x\
^�8�kQ�'f�+��UM%���0a�
��58ciC	�Y��=��=�t902�]١|g��q�k
@�"p�9�HB�����vP�2����n���Q��;`L���8�e5�'��
�(.O�)Z�ޠz�8�J�2�	t��^}Pe�����c)�%g���	$N���Y��-��W-����NX�y��>�[�څ*J�S��F����'tP����ս�3��8bt  ����� ��z�֛&�SF1d�E�*EO�}Ći��W�U*X�`W��W�2w>��h%�u�}�|�}:�!�`����r'%�ir�V�
t��,���#9`��4d]�@_��:��8@���XtH�Y	tA�B!{2eI�
�亁T���}4��A�vh(F���I(k
��Ғh�l�H�8����u~st~34„�\�ƍ#����L�����@�R�s�#���v��!�nn��֘Ǟ�Ɨd���@�Y���<#��5��k�L�TV*�6�!ډ��v��spy�FמoVU�#z	��^a̱?�n:��f��T������m����0DŽEH��dܪbb�\{��N�x�E�P�]D@�3�	ly�p���/7W����0���v��D�3���Uoᘗ�3��2g���FL
�^��wp�n���S�X��l�©�߱�	�u��� �m�%��M�����&�7xt������]��&
�Y������1m�C�pN2�!{+�ׁ9U�D�}'�,U���*�,�n��zϱ�H�,0�k���=&����3=F���f%���iP�ZD�K���
����`�O����.�d�U�T�Z?B���z�cc�d/�;S������:B�u��!�”>+�VJdخ�ݾ3�g�%"Jy��u����w�f),c��}��m4�f%��,��,o)�#v˒u�Nƀ�O�����W��6�?���T<}D�;u#W�ҿ�
��,�,�ˆ�i"{��f$�i�/�)���m-����H���sط{IiWnĤ�X�W'��0��;.�~Y+�/��N����L��(�#�.h�$�O�O�lPx�8?Ȋ�/_����0�9�����U�-R�^�̗RzN��6�V�w6��*�dosr�2	����aO"UXt�\�"�z�g���#���S�AFϹd拾��a�"K��j%^
]	"`rN�`�_�bt�=���?>�Yp�a:���a���_�R+Q���Ί��t�L"
ʨ�D=��>�f�-��k�[�n�R\V��4)U��|��A�;���������eG᠋��uaS���D�/��'7y,R]��J�d����J��HA�L�d�HGr�̦�H?*t(6�B$S�h��HŮ�(�(�[�݊�i��V(��8��;&L��-u����օ�{�������V����8��r@�~������k�ُ)���%�?X��-��O��7m �6аŋoД��-F���94m/)�!8�A&�`F#�k�f�h�	�|�Yc�ގo���U���o���i��=�eb��s�3k9�w���+=�4�م���NR�PbP�gOյ���}�m��ޢ-y�G膂�SCd�e��l�r���Ձ���
���}
{H���TC�b���>R�>M�Zs�*+Uj������dT�B ք��W���H�̥�C�U��QHl�&�}�F��m�kv�3��$�_+��<�V~�NE?�Ft�;������~
�S��Xl'�����\�{�-ޞ��Y�&��Ƣ�{�o����d�Z�Q�lK7���?yC�s�nBR6ņ~0=
`_~��g~Ǹu�߲5H���K�m�6��Ք��Џ�=�_xM$,KL	]��G�^�[�X$Qk��/���b�^�w58�[p{C����2��M�0�A����g2��u:�>����zy��\W�2�@�	�p)��B�oMQt):���;SVU�������r�
!Q�-BD~��ݡ�W����Jqh �9zGQW*��=�Y�9n��<���^��[��DN�Z����R� ƖY��"^�	lk��Q
��x9�a`X	��KOV•����4��<[�2}eg٦�v����0����n�{m�a���q��D��Ee�Kv�ò�N�渞Y���F�N��^����i~�n�1&��B��
x]��g��hP��P�Q��s=�@/��7�)T�! _���+s�	�����BP׷~�?���"�����K��|XM�����ضy�˗�h�4D��;='g9#?I��\E]��TF*�%�����[0	�S	g�e����c@���){N���5�j��' �dژ���w:0#��lj]��s;�PX���i�o=oj����b�����G�X�y$i�7H��S�����ᄛ��qmh��2W�~��G��et�kӈ�Z�MZ��I��=h���5�1okL��j�R��p�M���CJ��X�m��Dv��P)��ۧ=T�ڻUS�$es!z�E���[r(��Ά9��mo#%�!�zO�>%�w�q���{|8}���C��Ճ�]������Aj���a�H��Y��݈Y;��)�f��P��8ձR5��'ng��\�:�m9����
A	n�fS�Ѧ�N�t����oN∶�E^:��%�����⤚�z|�aD�h�kB_gp��%���YP���)l#Sm��X-X�fo�yӏ�ƛ>��3�K0�8��dC'�6|kx�[�{���8;@�B�����:�C4w��������ppxH�ڼ�V��,���/ ɰ�J�Ƣ��i���5^�]�U�7�u:d�&l.�\%w�<u�y�Uܟ���4�$��+��*�
^P�#y�v@���m���s���qA!�/��9}��{��2�i�8%�h����7�>����+:��jf�]��=�di|��0���$�X�R��9'F�Ik���R�P�:`�6�#��t�P��� R8�FO�	¬����P.A-�hXp%*o
pYp��7�u��h����z,y�Om�vv�D�����l�y�e���^��K�k�{$=ހ�����vbYOu��f��l3f��,�d?p��
�N�a�Rm����(dӌz0��ݮhfe�/`ė��g?v�l�`�Л�q_��veD
:�C���jv{��R7�L����vW�o���|�Q�G�n�ϟu�' �~�,�w~�]��vk�Ψ���ޢlk�^�!�W�vad���K��X4���n?�U����(YY�[��!_wl��07����_Ő�]/q���%�
��!R�9϶`ѱ>���SE���f�4�^�r�\q���ظ��a!!V���s'���ę�Ktjf��e��r�W��ϛT�ci��d�:�~��	
Tq+1�0��Ѵ�ڟi�~:�Gwx��m-r���A�Z�=�P
A�;x�r���‰*v��||[e�2�ϔ3���lƯǵ��poQשr�9����u~2��FCh�c���!n}!��(���Lu��FSmjg���e�o(i
p3�rk�=rV,F��\����l�����n��������y�1�EbIn�c�"�P��8�r
{�3ŝ�����4�1��/]r��:���_�~`���h"�=�2#�WM^g�No�'8�B�[q)�81��`r�v�v�)AyԦ������[.�ꕁf��L��F�/+�m���L���ϓ�8'f����n�Պ��$����N�Ff�U��3�z�n��/���;5�[,c!���@��d94i
���3��5i�5�.��{4�7(���o���2�|8�ïF���*6��q2�BǏ(1�*?Coُ��tpV�<�X��ӿ6R��7;�b�5H�:�7p��+��9?)?��q@��a�e�
�m
�<Ȟ�<�p!�JDTYz����я�V�hf�̅l�_��C-����M%�N��U�3�]�y�WT!��0�=�e~aG�]ա;��AR~�^Sf��#V=0�!t ��B"��ͨ��|n����o�2�w���`�Ѵ�O�]��&���{V� �$p#�׮A�j׳��UЈy,�
�oZ��x�o��$�R�!��I�������gݚ�7�޼���h8���S0�A��E���E}���m�c�yu�����a״�03W�9���'���T�
���TA��,���#Z��\�ϣ(.��cm�'®9��+~�˼���=�$����bc�q��;z!>�
�ԏ�#�w<���yuݹ�m��?�ĝ^�'��]8�Wy:6c@0̽|�ь6�9���/Q��ͭ�������~_�g@���y�O�vڠ�d��^d��?,@��jS�W��ύouZ�g<�
�͐6��zM3��ug�z=]�y���*����d�F�*�eHB�@��8�*�����[���z�mn�H!UiJ/\b�u:�'��;UHl��N|���7������P�������˳7�����"jE�9";�뫙x	^��?^9Ң
"���}�b-s���!ogs�Q�_M�PK�mW�È
�"setuptools/_distutils/file_util.py�Ymo���_��V��JR��MgI�Kr
p
j��x^-�H����3Cr_$9v���Z���=�p��i��o���b�+uI�����~'Vm]xmj'V�
�(+�������w�Mr��t:�L�1��&+k6����5։��e��=澢G{���\M&'����7�.�S´�i�е�
��.I�Y�M.��d�Ź��xcju&D	�|"�?�Z�2;ߢ��m�n�q��4�.dU�	�?�ɤT+q٩��ګڻ���\���Ų]���t�_���?~��?�g��7�~L�ul�	oD���S�4~-6��bF�r��	�3ˁ�j2�Ґdy�\X%K���f�s�n�fæE0Pj�:t�z)�ڱ��4$G붾v¬D6�bƂ�;����8���x��:��7FH��4��md�H���K�]�;�&�d#�6��ꪭ�M����'�70Jأ[��bc�� ��yH^^Ziw�/�0T�P�����<eUX��TeXl�!�(��oXm����Y9�����]fy7D}.��'�x>;�_f�´U)j�Y��8D�7DXI-����<�tB�
)�h�_/�g�u3�'/z�2�hk
}�0z|�.���ô��`����W�-rj�����	</�~'Q}�v���
��k*�m���
dvDѵ���
2�
�k�=#�>�B���l
"�'w�����z�h���yY��_v.�k���a
��1�(*`�,��%KJ7��G�u���7���3��50��M��<�|���T��	~itiw����큗<](��pI�^�*����\��:��ת�Vqm�X'�
C����\h��� ��.V�',
Ս'luU��5@��a��˕�<�:�W1(bF2#���n�����]C�U
0��v���R����k��dS ̕i�*U�ւ1����g�Ө`�"K���˾�[%�?�fzEF�^,��ʢ���Ǝ�G~lUUE����֘Gg�ݨa�e7Y'G�R);���6��>pt��JX�v����E`&�5f��δWy�DG�@.Ht��:���g,���v�k�P��,��3ᔧ��)����)fL��ںS�2a��LF$�d�̳Ш>����8ڡgYe�6Ly�?�Y6�(֪�&5xÃ
NR�K�p�����
)pF�C��]��
&tb)!��z�����j��kY�n�:�r<�`�71�hv�'���€@��!K��T&�q�QNvt]�AdDu~T��5�ܷ
��L:I�>�F�a��fW��^�����	��ܘ�5B�T���ⱕ)G �T�Y�Z�K�
�C��ژ��|��~��1	'u5��dE���V����J,5m`�K��7Ɍ���a��pcP��f�5�mS�|� y!�8�0�ݚ�
!�k`[���A/8e��m�X�D����ĶƮ؄��6�����b���g�x$�H��ά<o�b��������*�U�D����O���ע����7��<�����G��_�x�՜�^�Wo_���]�5"�I�Z���v}_�1-$�ʍ@1Re51ɶuG�Ah�N�^����H�����bt$���R:[�R�(�rj_d�_<����Qp{��g�w�%Q��?;���	.۫ٔiv�
�0�j��9��#c:6�<�J�ڣ�و_v�	ó��)?�Mn�w�c��;�'Y��G���t)n�;��7�٫v��"�1Luf:���G;_����q'�M�+3��R�;}F�u��f����Ƚ��1�x,�g��8<!�J�6���Q$T�e����(@��C�T>�3�y���g��I���	�ft���pK>�J!�*Y5
=@7;�AsL��D]G|<�g��uo���>�<��OA��< 	�#��K&����3�UרBc�E�3f6�u��`õh�o��8
�����$b���H�x�O辽�z�x�;n	㷩S!x�OA��Q�E>5�#���ufJ&��~t���5�[��X[�c��PV�[�~۩���z	J�(
c�xp�Rޠ��p�����Z/��z�<%�`�#�C��,Z*T@�{
u0n��z�
o�\?�~O�裰�`��	�?!����<?*�r 1(�#�G�t�)�cxh�2����
x%�(�O9aVhONO�y ��$d̵���q�1ЈC�o�s�������>_C�ԝG
��=���C�WC��wu詵�P�n�Bl֏��EKQu��S!r��||��NKu�����\�[z?1n���?P�\��%ϟ?�t�}�:$�ם ��50��D�e����iq�����{�."sI@z%�6�_�7#�$3F�y>y�G����E�8z��x����`~5n���=���g>�ۀ���f��Lv
9�5��{	Fv�Xa}�{P��x
:���\l���P�Q7��vC���x��嫟ƥ�W�N��@���|dƒC���t��?v*�*h��qတ��;F�Ý�_2�хƋ��n�pjG�����r�|^�����73L'U�~:2t�9�
�c������#�3�yǕ��
�L��p)�- �!�O ��>K"2�ԯ����-��c9
�l�]t��6���o|��J/�z=��i~����Dzu��;؏o3x����7���PK�mW��%4_4!setuptools/_distutils/filelist.py�Zm�۶��_�憔���if:�XN��I=Mb�_&�9_5	I�A�����ww�)��N�T�9��b�x����a.MUWR��B*��m0x�˭̅a�J��hf��ƌYmD��f��VK��e]%20{S���9��R�H�L
+�`2���\oJ]��'-�ӢX�*[5�u�Ue��`��嚵�_樲��
]�6�Zu�֥6��o'��+�?���E%t��wxy&�\��A�j�������̘���|�ʂ���*5�C�2x����x��F�v˵,k�`v(h�d���y@O`��d@�^��E&k9�+a�h��=V�Mq����	��J��`������j^.	W��V�35H+�dm�J��ޑa�5ħ�k2��E��Θ0��\�y!75j+wL��
Ϭu�Jt���\hLZ�J�R)&0�j��ˋ}�ÎGfm'3�:���b�f3Y�j6K�P�1�q]L*1���z9�@��ZFW
�3&�E�A'zY�a���7�1̶b�BlP�k�9�n�un8C��\*Y�2���29��\ߴ�0���Nn&�5�˻������Դ4P&<���B��W���6ˀ��5~d	�'���rT�\�7-U9�=�߳�/�6|l�<���w/x;�t��J]�t3>Wb��/�?�5�U @k*q�!ٛ��J��ډ��N'h8c�(��D]��<��Q�CEB��kc�##�������=�ގ�R�S�Α=�.�AZfŝ�z$}Բ�7�s�Վ
"O�|���`��p3p�V����6Ѓ �YU��3YtF��������E���4jT�
�)[K�	�x!0������b]n�,B�)�[cj�r�V�!
ǣh^��y�)��4��]�'c�Ř]<�3��`���M�Q����X�U���~���Uny�g��6b�)fJ™>��Ja�=l��N[�rk�SKu�����/tS�)���5�:�cإ�,2U�"�Dܹ����/�!�"��Z|�>ԨxĞ�/��j.�8�e�G�&簊Bn�o�S7�'Ϛ�/���d2d�n��8��h]��P��Q�򓫛֑ ߋ�����FnE�H�@P��Y@x���X�A�@�|2�_ދ�R�E��mt]������XfHb���~����:��PF�"�+�.n�rWx�P�P���U
�ø�%�P�`i��2�<$����(Q�OW������@�����h�\U���sX �$�d�،{Li��:
%�R	�1�$��`�v|��)�$��Whc;�^V��3�箭�>�JL-����Jg��V��q���a�IM�7���?
5ЦD�s��e��4$y��1�;,m�r@~^�@ �\ɜd�ߊ(�;;�>�HM�S�q�T!��־N� (��*'/��Ȱ�X�`�mV��H���?��%6)i����n�k<U?��(T��hn�
�M7[�z��&�J�	7���L���+�%�U��t,�ȩ����;/��ȉ����b���!��t�b�6Zl�zW{�������!�G�`��kNA��q����!{�O#U�#8ʎUm�z�C-6&���#�=n�
�'q&mX
���
����Jz=ع����/KJ���}N�E,��4�S	k��E�Xnj��^3��h�!����MDm<�҄��������֣^yR���<����)
�b�d|D*
�Q�Ю����͆C��I�����Ԧ_������` ���е�O�!��>$��԰������1:z9Ά�
�H����A�T����w���%�wl��kZ���%�
�sifZ,�]���÷4m�K�R�d�5��}{�1�;�I��Pe��!h���	�����T{(�wR��r1�$c�E���N�v,��o��l�k@��PK	���'���S���˼VP.'����C�M�+���lD&�:�V\�BC%h����4��
+?��닆�-Uap��7+��p�_��TXYR����T��;���^�,��ܙ����!�y�^���~�r9�0�,���y�*0\x�u���v�@�.up�B:%���'����Yb��Kj�s�.�\c��h���,8�ǘ͡�w����<�RG�椧Ӻ�h�T\W�T�~m/+�=0��^GA'A���2������vB���q(u<G{�cO��Ft&潩QѸ�@��g��y��zyiׅ���X��p'0��,*.:�c4,nv�`[��濢#_\�jQi^��͈�B��AZh�����r����*7���a>�@��_y�[��3�������X��NĄ�}��d��v�9�:c����!sx��f{���;/�o�ߴg8�̮S;dw�	�<jG�S�p�9	:�m�]�g�Vڭ��V�Iǽ9���*998ds�I�$<�?}i���p��{aF�nJ�X!�޶q �\g��X�`�!QV�u:�':$;L�M���P�'��ڃ����7t���56X^mp�GW��o���|�\.�v�4�f#\�� R�o�V�RB��ӊ�˅���,��_q�?�9;�/9g3�{�I/��	��SҾE��%:����u��v)>ҡg�;��{Q�A�Jg�\�J��P:�\��;I�wxUH��1h��$�C.u!��6f����tG��W�4��T�S��5S�����Ue�}���}�1�AQb��v( ��	
�nE�h�;~n���=vN^V�{�F��`�`U�n+!���ߣ������b�oK��i���0;�������t��������	!����^^JHY�W_}�׿L"A��h���Y�BH��[��t��
/N�Nd��0�epq�]��^Z`P�\�]�!�=D����8�R[�R����E�)�B��BT��p��k�N2H�!�Oq�D������!��|�Y.���Ee`E��Nn%� �8:�k���W�S�<�ӆ٨��X
����lڨ�Ym�L��Nl�@��<���nU�.����fs��vԴ�Zս/��!S#H&ɸ/��E��-P���v�܋a���t@'��r;�<�����b��,
EW���w���6����b�g�/
'F�-�XtϪ:��E��_T��X	�.����Ԛ�r{*;j�5�ރ�:��#�Pr�Vi�
�W���B�H��I��CF&M�(�:�}�/���W�����F(wEoS��Bf�X�Q>�"N��h����lj�;���O�ʒMZ�7/���c����B����-�
����Z[L�9�mi�Ǝ�1��9���啵ʑ��ZÌ����(�J��T�<�J��7��ʴ�je�WR�Z�B�M��#���?{e�O��b�tO.X��w'�F��>[�gl'Pbmš�D�Wp}�؞��BU���	���M��Yx3e�08O�j}r��ss��s�e�3�z��$M�y��ÇQ�|F�G0
9N�O��m�s���r��7[t�����&L�A����}�$q�}��a7r�jx��jM��1&X�Ɉ,\~ǂ��]ct]½�N4@�N�ִ���
-�0r'�vj%;��^p`+9ҭ�3�$�Řﷵ��ށ�l6���0�'�ddW̴�u��狛�Ձ��͎� NX���ɔG�$��<�,��h�$i�$�E;�hoK�o}q��/��>&l�/kw���7brE��/x���M'h��D0�Mr���/N?��$�j?|{n���1�����鰖�L�=o�(E&��;s���bX� t�?��{�m��B?4��z��G�"�PK�mWˆ�з�setuptools/_distutils/log.py�Umk�0��_q���Ä-�`�e��tJ[B�}%>�b�U$9Y���d�����	b��GϽ��E��*�5�6+(p��R���jLAf-<L`�i4��H�x��Z:9Z厢���<,M�SВ�$
��Z.��F�$�2�6����M�άT���Z���^�r(ķ�ק�0�w����=mF��dvG��b:���h�A�L'���(1�m��ӷfu-�J1��\�����:K�c�.7:3m|p�X=|��˾�En7<ר(�*iW�Ť�Z���01%�%�f�$�h�e�r?��pj����Kk([|���
.)�v�ı8��e܋�k�p�uWȋ��{�S5;G�j !�ޢ,���g�|��v0��~�T���v{��pc�G��D��]�����TK��_��!�`QqQ�B.�8*���k@>�K�F{p���{��j'9����2��o5��)v@�f��e�r� �W��ӫ�PY��`O��ڑ���4�1Uf�<����ql�-��k�G���H��8ƒI/�y,���,�6�YM5Cc�n�޷4C�����<�糧`����,u�wA&B,=M�	��:�����:N~|E�<�3<k�S7#[M�̚<:_ϟz �
�3�j�D���0�wޭ�.�S~;X7��|[��1�m_H;��f��Ku
���L����?PK�mW>����!�v&setuptools/_distutils/msvc9compiler.py�=�S9����Й��8��@.�K��"@.��#���{d<�x�7����_w�c�ِ�Ի:W���G��j��Z��nlj(�e��p*�Gߏ��,Iy�j�Y%�`g���CU�cQƒ�,�S�e�g,�r�Y4e�Jf�Q	��58KFE.�qɮ1�R�/�q�������V��L�x�r��x�!�zH�	��c�?��]����'P���h�`b>��EI��iX��B���I��9�)��v��j���ER�<c����b��i
�ht�c,���[���r�O#���'^�,�YĆ��|�F�&�-;�j�A9)��hT�[��Xt�1NFXW�����Im��{�L�h�`a�˅�&��Y����J�k�[�q�O-r�l�B0��H�?��1V���iT����K���(�P�O�������:&fU42��l�&�A>C����C��ց�u�-/35C��$�h�>�ۋ�~��G���CS����|
?�ZU�뮢t��Z*�z�qUGTo��|��>��>��?�{q��O?�_R�%MN/Ng��OΏ��9=������V�����x��+�8&Ԅb���}ww:čX7�E��~d;/^��t[ɘ�0�h�5��76pGlwgs��,���dD���D�8˸d�4��`����=FyQp1��қ�
�(MzF~���<˰E���~Ec}X�X��d�_Q�U�3-�}NQ��|�^���9�c�ň�/rr�~Y�_����?���`*9��@%��u~|�l8!4~WDS��w�O�[>�?0�?��RtA��i4cw|!e��#�.�n9/2v��F ;�o�h�g%u���}T�(M�aTvB�#/A1Vl*)-P�����H����X��׃h�~��lI&�E�%���֬�
@�����ևӃ��������#n�߈z���(��)�TB���k��j��d ��*]2�J�)xk"�`���Ԣ/19�u0JEfU�bw��@9����H��9R<��@���D��%����^L"F ��PjA�khrcj�(P��A�3�@�)����[M���BNU��NH�Q����0�;�H:�
]�'0���BP
c�G�M�E�E�<ϸ)?��1��m~=L��.�9w5��ϝDOi�@�"�]���g��sJOC�<���ڊ��}��ZG9�Ӗ����x���x����|q2j.q���L��4e�.Pwd`	�Z�<�b����M���߂p�=I�+3^qYߐ'p(����D�_��PL�#`�(N���v?o�o)1��.Yc�3��x*�#�$*�"�kC	��v�V��e��%�K�{�j r�+h�m/�?e	����3�j���`�~�H���j�r�*;~���sɐf0H����qO;J��<T�.�RŽ �o�u
�m��.J�Ǩ� ЩRaA���B�_���aL*���VZ�P�ec�r�R�ÓH��GI�a�|,�/}X�ٗ�C�k���Ge-������l�ƪ��!�9P��տ������}�]��a�ec�!Xv�'�V�wb�;�v}S��,��`�ӭkr� �]�i	JA9
���IZ�xD#���K��P�tFƐ�="f\�$1.���ETr;�6jT$�Țc(��4�UN@,�V�i�N�l��AY�sv��[�)
��Z�h	*M�
Z���|����C3�V�7Gl
_vwڨ2�e8[���m�����뼳�o�d'wˎR��qE��>���{�A8sp�R�L� �?,6[�c3�6���ܗm��4~��?�m1�6Z?���j�>��;
Y؆b�m7��T�S��ŗu�b7�I���\�%�QX��m��7�2��`5?�d5�&��"��8U"�,�J�x��*�mi	7(

��6����
F'�Bq����B�C���0V�c'�%�t����0�Q:���u`TE�
%(ib�2{6�|�UPDG�d����7���
>N0��>���P���i���@6�􂍝`�g��^�~�
0�X�3�#`Wp��d�&�4)�6��R��F���������ܹ�M=��mR��n����K�!�pT�*&��$��W���X� �8���[��v���H',γN�"7�#�D:�x�G2 !a�%v�_�s򾮦RCd{��_7ĝ�H!��ckr
wY�����/�^ID����8}��?�h=(8�B> ���%�(2^��+
����2&}���=��>�C%�Y^`4`Ȏ��4J�����>�ձ9�ݭl�c[1�V��M�0��f���P�b9��_G�4�%��jI2T$ ��8���K`	�5��/�T����cA���N���` �����hF2�	Z�r\���V ��{�V�v�3��Zc��\l� Gf��_+�,{��I��:Jk���"����z�r>MHb�z)*WXf�A5�!�y+{6UM��%�*ԄH�W
�ja���<���!��C%�%�À)���*�v��!ls�?
�f�MAT2cݫr	ԁ�I��$X�����������W��/��//.N��T���<��9&��\݀ �8KD�|O��J�Zjߧ�m��6h�h5�,�h�HJY6����vz�t/�Do�D@aP�[I�穐6�}��Ḣv��/S{�@W;�hH:8a3�����JWՌ$g�����Г�E�+��5��+
)�*��]�g�г��Bc"5I̠�����lL��BpM_��Xn	V�	�9 �hhP�M��/^�<�m‘?�n�M#*��U���qJ�`SeL`Zuv��j��J��V���X4!خ�h��~��u����<Mj"ٙN=PR�KR�t���b��+�,b-ƒ4Y��REow���Vv8�]�d��A�Q$��]�T��R�4��1�K���h�s(k��!� ��0g���cXL�
oIG M�f��
?`Q�i�K'�#�;���R�	1-�8���6�O���/�z�nS�H�=�f@3	�X��3�8��3,��~����?�%��9F(C�:zk�[��]�K��㲦xڈ.�l���/Y�&ݨ�T�N��R����f
�7��WC�?!h�dVؓb��m�a�_�j����?��������:.�ض�?��ѣ�I|y�h&w&0b4�i�V熰ۀ�mӅ�F��(ͅ�T�yCW꽏���
Zs��%�hf+�T���0�]�o�(�J<1?���M�a�������Ź<è20C7��
鮖EW�������Tҵ%�P&h��S�1Q�����|;��i�O!�<��|�2��lS��MW�k&(��:�F$/�d�F�D�I�Jܹ��f2�h�М�k�w��:��i)��0���_�\�
`��2�9G\l.ȗ��q��g�J:���!b�i�G>���
�:l8�7����>��D�,(*"�/ò!܌�,����w�mA�7vS�9r�B���H%S9��à�Vџ�OY����`6��$%��ƞȠ	eMq)���R���}d� �ʈ:'���<v(M�(���p�zrr�F+,~c'unT�l֬���f3���n]4!ԴY9�J5�s��י�h�����cF��	g���@ѣW񀤢�#�s�hLtc�Z�Mq�6-m扪7I%���UA���g���綀�b<���ӴeVDJ��e�:�b]aV�%�U�C��=��Z�3�
�GPf��j4�B0�U����@�it����7�#��$pU'k��9��r���R�������(�o@L�[���qvjӪ���
IU�B��g�P�`�1R5Qa�}���V��TT7�ol���9�M�;,�~�E�NK�ф�ğG�i�LyVq6�|`�)��sH�ˁp����[�Z�6U��6�t8{�#d��(�jEq" �=EK��LE��B-0h��l���ֳs�(+�S��
�����]6	�>E6�D��s�@���{]7�>:�_~�<9�cB��s��5ar'�g�~|竡5%wdD��(+�;�/QI��!�`>c@�bAf�Er;)��#P�xP�k��4�pJ	���h��`�c�>z����FC�b��AA��%�S��֪���5vA��=���H�]�9�IG�}	���&�
��Ӊ�Z���L�%+[3lbppv��(�8�q��i���U�3>���['�6Ub^��U�LPcE��S�h8B�v��g����V۰��������$�k�#�3�rrsT��Ȯ�ϻXs�C]4$�,/����aR~
.1n���:�������vVp�~#�tm�¬�j�}�"%�����,9�ПJ�\wЪ���省U���a�Zu�B��Ƴ�����Y-��Y-��l	�(%-�P+P7ͅBu����,9s�:�n��\	�BZ7&����$I�D����F�z�}������2�n`PKw�\�j��z`LmSto��X3�4�A�p�"�i�Y-5{Z_��!�����]*��ǸXj:5�a̩��A���y�������
�2�ɴ���G��&�,�ިEߴe���S3���fSݎNƮ)
�1��ɸR�n�f��,O��M�����Ύ�ϻ�g��1h{t~t���_k��7ꀂ��
;C�j�+�V��_��Ѡ���4�.��Q��?�ovؿ�P
�?H0���x�F�b }i����)���99?�x|v|~yp�w~aͪ�J+�/�t�&ݘ̓�g�HΧ�f�(~�.u��߉��:����>��
�AGj6��S9���W0:�r����TU�UM1�?�t{E�|^��%5�t�0�%�B��;[�t�*_�1�Ȏ�Pg�r*`(�Q�%�ƜJ<�4Hg�.��ZZ-ɫN������\&T9�0��u�JZ�X�!�*P%?8��r׽~y�d��3�g�AC�>��uu
�}���
嗍12��^�JyD���& b��q�����ς+/"�ґY���D��&J<e�qJ�j}��{��!H2/�𠰮����#CJ��~(q2s2	`�[�7�����w�Y�>�2�&��p�1�y��UD!���熋���XJ.�����'HoW%,����a�����ʨ�ò��\�֑��' ��E��0sB��F^�A�e�3".���r'4��D/�<u�E�ʮ�j]Dj�'��"ׇ�FӍUY.J�0�H*�����3=�ۊ�V��FL��s��@��Z5Ow�_�H��z>��V�顤Zj4����5��ʾ3�Vc��9�@���즆7;[����@k����(ul��F\u�Ṑ,����J����sn�#�(*4$�5t�őVy[UO���>�Y#M��Ӕ\H��x
��&^8&kr�Ǟ��5y
�i� �P�[�Mf�>D��
:���"A��a.$�ap��'&��'�Ai��q��jM6.)��[��6��b��wO��:{�'���Ï�H���q�Of{����QE#8�A�Fåm��4���Z�c0��$�ҳQ�P�~�㛥Wu�蘒�<N�O��	�m�w}��_�#��L-�!���P��c/Xgs����`j2�\e�^:Sy{�3s�-�Za��c����e5�+>9��f�v?ݻ[����-��aJ�r�l]��yG9��d@7���#t?�� FF�-'q�I�[��K�6"��l��!%��+�qB��MEM�K��x�m�H���0C��}2p����s)�A��[öo�^���TN����8����SO

����k�~ȹ�܀�z$~��:�Mi���B��,�H�Ki,~�(�󥷗Xų�e�r"�B���#��o����1倪�!��@�z�'�ڑ�_�b��Y' c�[�VM[��jK��W_�iI� ~�Ҭ4d�9�sU�e�����_���m`۩���A�z�T����H*4z����Y\�t��X}����b��/W�B�k��q�8P1O\No�*�'�L�ܾ9e+@?���T|��6Ͱ6�s����ƥ��=�y��=P�u�.>]��!w���;-����˃���m�?��p�
�Q�6;L���J֕�k��.�S �l��7c�qx��Ndk[�jxv��p0�F����
�]��$C���ra�q�b�ar��v��b1橷��{bC�N��m!�K>��j�3d	4����b�_s}`ְ���o��,���Gו4�9}�=�|�@���-o��L����-O���9X�>�-q��������4��i�`.�؛{��ɩ�{��vv8�)����EŁW9+	��U���/LJ�.ޞ{/�,�Dy�i�����^�2���}b���[���J�*N�vgBǍ�)�VW2�h�'/ł��R�[ǿ|��x�G��Ŵf��F`�jwm8.���ew�^��(��Ҡt�D0Jr"?�'��a��&��n�fn�|�)y�!�*^�Md�K������&���O���EwYP��!�xǷ|1�C���;B�ב����R�Gʓf\mU��P1�QG��=	�^t��L^��U:]+��l��]o�x��[*���i:���%�ށ��ꁆ�.���3^��{͘���~��7���<��c���}8=yK�oa�K�FY2�TXi,���}h㬇�F�+��s�]���۾�*-�������iO�k�L��rq��Q��&�"��>�z!���g�����^�Z�6�k6��LѸ�n�O7�}�'�+�����$M���u���x���)���J�qo�[t5`ې�L[�i�f�
��$��'1vqy�G��5H�טrQ%���V��̸���*	5�b^қE�P���\�%� !B��h`;Y��F�JP+��t\m,h�簲[�%�'�9A��Wu�yo]����묹Y�WD�m��H��,��*mS��	x�������3�o�nc_�Q�9<KB�	f'c��{d �|k �[��Le��B�e�?-`}���9Xe2�We�c�E�=�V��1I����zB{J���A��}�.0ww�IY����"�v©����[<ۜ�-����������~��
#1{��p�;�$��n�����m�0r;DnAB��!o�%e��"�R6bq��B�!�Rի��Vh��$V2���AS����;�_�;�����kRI��W6���b��8�u=�;�;|���3z��Z
@؀8�/��|F	i��5���YqlV �|Q0/n�!�/���ʓ���傇(#'?�ϓ�lm3El_]������K	�<�(c�a	I��s
�!��|���Z������|c�^�����7����:c�es�3t��b�^�=���k��F��9�ף�!Z�{m�շj`?^R�m�<J5�˕8n�(^1���az����^�/�J�4�t�x0��㠶Em�:0�W]}k�ʜ�R�[W�}�藣��i?�U�kL�Xg�@����S:�ԓ��w�]
>��̟��Yj�2��3����<Z�?ͭ{冤�4��ޗ�t����u
W��!���I��3��J3�FG��!�O�Zv�#�bL˾�P被�а���Ar�Q�RKF�`�����
̌�����x�O��|n��x���ގi?�#��;�q��8��e�x4���R���\������h��?�]�)(���8.ዟ�{�g�k��hۼR���Ŀ�%QD�B���?ت���͛�P<��<8=�I-	��I_5�HN��h���Oy���x��V����@�z�G�24'VU$I��$��a����x�'�lY~�+��.cn��U��ha���io�b/[\z�4o�U$u����a���+�ߝ�0A�k��8|(��˗�B���b��]��2��Lt��O�(�\|��"���B�h.��:�S�.ϳ��;[�j�W|B�|����JźO3*��NO�~8�|Omhb�q���J��~���7�|�A����$�ʻ��Q1�����6'���͉�#���:���v�j��Ф�;���* *dj2Z�z
���{��D�}�����1�R)�T����`�9o{N_`_U��0.�� n֫�Y���ԃ��3K��7�O�3�b�����E���0�#0׌E�S�5t���	�|F�C
�QF9e���E^�yӡs֥&�ڏ�o~iq���nNG3���0k��W�%�7�_P����b&!V~>>u[DS�o(]���62�A0v�}�'3,{�a���UOkKz���06˞�G�XY�*$����4#'?S��9�{�w�c_��P���$�ޜ ��ᔉG$����T��uny��s��[Tf�2L�p���M�;����V�g��v�r��
����8���~�ٷ�]^~C&Q�ѹ�ウ�a���gM��G��PK�mW:�kc�[%setuptools/_distutils/msvccompiler.py�\ms�8���_��/%j,�N2��s*�����;v천�=ۥ�D�bL�\������~�
�HPVv�w��݉L�F��t���(岌,�t�-�8�E�w��e����>��C�,^�	_p�\�Yʲ+眅Q�dUa6MB!z������D6+��X,Ä��egA��^o�})��)���9/�|ϒ>�����E6�S����p��y���l��X���M8*طl��fq��-;�U��"[�Ή��߂�ՠ׃�eE��JY�ق�"��B0U���9ԟ���K�w�IX�꽪�D�^�ē�WzG?�
W�h��[���x2�r�&�^��z�i��F�[����{ �}���>�)|�ѫf��b�����Ƌ,�wf�~{���w�:z�>�+]�(].�E]B�0��%�KЫ�ʫ�NC����)�KvL]�"�oU'펾|��4K���RhKBV�>��A-�{��%���)������ڢ����k����	�t��ޗ�Ha�0�EQM�~8�hFyU���R>�B�P�Rf3�]����gbYp���|U�܀��	j��Ζt��V��س2[ޠ������3{xe�?�~��H�ף�����hh�l�8�tqq��J�-xrv�d|�����ǣ�$OގFG�����%X���h�PH��P�!���8�^.��%0:h��q��],g͇9��5�TK���)Z��څl�c�J�;BW7Ң��=��0����SW�x��N���ݗl
Y\�Y'�L@,w՛� ̡/�WW����gp}b���:�F�-RrH�j '��$ai�eE���E	�&J�=�b

��?{4�.���#��]ʞ
Y��y=:da�� y���$�&])�������
[o��ucɱ�*	5���[`�,|p���"�
It�,�,�f%�_#.��a;^K$���;�Bv�`�!(vr:z�A̼�l���i\�Ǿ�����&��V��W�T]~�u�^E,������!�X��9�<�J���^��B�kO+$4�ʡ�획>\y��?�=�ܠ"DW��M��԰�3fW��u/���7��S������J�x�l/x>C6[��������(�jb����ןൗ�Ӧe�ݴFO�u�Jy�ձ������CV�y��WEd�@�R޴Ȳ�h�5!``��؟�/�^� �Z�n6(�;���s��!8�G�oO]4��� �W�l�j�c7�`��yR�e� �,�vd�^��|
H�"��`�%��	7k�5���2�0	�",9}� m6����5�� .вͲ%�0`������䋀��*[�;���`u���Q�~�F�
�a�E��¯//_1tC���)[����/<t�u7�WH5^λ�ԕU�Ǥ�K��6�H-
�g�v�yC��5|���5`7>w��MD3d{�
�d�=���?�v׮�0��d>+��I#�	��~9Q�P4����A<�A�?h�:<O�)��Z�]�İ1p�c�Z���o�*��l�i	�Q;�B�&��B����j6�^
[��Lr �	����d�XZm��@�
$)I��[@���'�u.�"앍���b�����
o�
a��ˢ��2o���~{UQ\��Z����Ҧ��"O�����"��J/�\Z��j��̀��ffv�?�zY����Kc!�b��	[̳%�	����?We-: ������K�a�=�$*�b�,�0�;��V�:����� �U
1�������Uݕ#{]���c!�<:!��U���p6象ܖ.���-�G��1q�b:�Y8��={��c���(���y=(�2)�<��䉇q�������^��
�R2��+�j�^s��^Jh#b*��1	���H1� ,�$�;�JB����Io|�oK^aWU#�h仢%L�)8QL,�{)9^��-���P�@�4dE�ES����a��WJl4(2R�[���}�vC�S��.E��d�
tW��^S���d�(mw�3��גOћ�
����?|óm��_��)|���}����^�8�vc���l�<��<��4�4��u6�6Q3V}�X�t�����[ezUHd$���׀U�|��S��eZ:�*q-(�
zX�q�_i%����d<�1T�;8��w���v�j���=Vs��R�� ��)����!�@�e\���ԗJ���"%�2�G���tY�0�c��g�XN�����8��sNJ�3��^��@��n���i|ⶠy�p.�;S+�(R_�O�h�L�1������S˟&�ŏ-���/o,���DЦ�K��`2�dK�vF�e���]߇�Da2?�L`r�,c1g���0��ز��úsR#�ӱ�a��i�F}���i��<��>>��E�RQ�Z�?.���G����*3�R(
���Yp\$�ц��!c�ǰ�)E�d̷�����v˧���F���;�$�%E�>e�o�O�F~��4����Q%�`<#G�(IZ40F	Bյ�w�g��4�A
��k<�N�L2���
YT���2ş@x
�]��&�l
U}U��"kD-�XM��,��*i�
ӄ[5�h�m[�-���f���`�/A�x���&I�v�_��[V�̷y�8K���C~/ܨ�*��`Ɏ�� d gs��f
�h���9`ouַ�0 ا
lt��|�n��TE��q�f����>���
��e�j��R39n��-���������K�����
O��WnA@5��\_�8"G�{�7Mp^z��,+!�%I
�x�3=^caRķ��?�ք7��EX��jK{��d�C�s���
���:Md�IG��)���y��֯ƨПh�(���?f^F�Bp��
�#��6%֑{&��z��p�
��]�������tcC S"
���X/��1�ª��CO�(I�F�2�:W�IW���R�C
G,aP�#�Ecᠱ0i,:ޮ#�hhz|~}���vA����ޒ�!W�)=�Uj��a��NWWQTmg��X���*��A���b��3�ܱ��$�cݡ�5��m�����oYܘ�
�a��!�]$P�ZA�gCX �^�A�w�,�n3Ļg/��C���K�緯}6�l���=�xx���o��'[G|��%4m�)������_����N�W�a��?�0�f+b͒�V�%$�\��P���G�G/ߞ�<��8Դ�:�;��̓���O��:���0�G�}���qe�@������� m�R���D�z0��|�SCJ�� 2�W��vk��Yu�uE�"��Q\@X�]*[����b}��o��,�1ǬA�;/�WC�$.QI,�k1�җ�� �1�9��Zc�GP�	L1������b�,��X8��2������j�	:202���
�����U<*�{N�W�oPl�,�%Q}u��4�X�� 6ؿ�Ձ�݆l�i%<�흻M��ܪ4��VV��÷�;�w���k�*�-D�[�(��PN/�A�j�V�r�IJB�rVJ�r�P�U���n*Q<�qB.��-�A�e$��R�{�����]Rj�Q�(���S�-��㟤Rrx\�ע?!�Jqvb�na�U)��x��m�|͜Ӡ�h2��W`ڕ������
Z˿�ڨ+-ԋ�r&��0L/�<�I�?����L�5���3MV�2Q/#�����7m0Z���s�q#R�BC+�C�C�1m|kYá�iw�I�T���ۚ3ݔtK��C���P-�����k��B!Kุhx"�h����i��=�X��*J�w#W#�j͏M)��O��RVl)KE��⻂�6�^JV�I��g�"I�.�L�t�>������,�m�ڒI�0I�I�J�J�X���+$&N�I`��>.�H��BR�@W.�ĥK^�oO�𶝀���zM�
����˩����>a��e�'��Q}~h\������[�f��v�QE38ːAпVA���#S>�����
e:~��f�]U�ZU�<h��AмMǧ�z|(ۦ�D���tK,8U�s@cc
T���O��3W��4��\M���Ы�W]�	��/�^�k�ɶ
W[gM���-�n�j��V�U��ә�:�K�,�a떣�B���F�ڸM0�A(;�[�&2pٱ^��K�vZ��D��s�C�\_��)%-�KZ���,,b�P�DLWI����U��m"���\��fa0.��0�ۥ;�=D�8���ڎ=
>�U���X��x�P���e_������
��b�#�Ա3DmG((37h���#1�db��.�ѻ)����[o�����e�r�b���#�?���`dK��H���D��Y���M��3��������[�1^s��%-@��Ӭ=�Y�s]�.d/�}�w��#�Clu�K>��U<���b�uE���Az�d,�)�&֏��\̏��*ԪYTA�,~��'��p���
@o����s���\�O��d��l���1�R��ּ4��p�
��o�6�E��}�����k۱SwD1�i�oo3@@�#���g�'�f���0}�۶�m�'o���G[�1���/�2ۉ`��f٦��iI�ᘉJ��M_�Ӳф�k��
	(�������ߋ%x�?U�?��X-&Y�,��ܐ���(�K�}T%_䮯��
�H�ź��z�á5b��8=��<�[�tw��!'�{ǭ=��
	�1�w���w�)���9�Fdž�Tw4څg]��ˬ��e�d@�V��^nj�xŧ�{L�l�3���h�tPӰ`�
��Fy������w'G��M�� q��ʑ:�d���O��A�[��t�0�?�_2+��4���	-7��[�m�,����3=�{��=�z~vq�Oɵբړ�`����zvm[vb�pG��-:B�T�WK'K��X'C��2?���OI�djo&\�x�C�}�a��Tء�\f��L�"\�ŴM+����̻3���'f
I�8^����`
JU�#`#��Y�m��z�\i�іYe�x�1��d��CI��fx ����
����u%|�(I����ձ��;ա�3�F���/�N�o�H͠�]��8�X��!�#5+�������w���Μz
�ڒU����n�K<�f�$��^�1l�_/�h)�%���)�ǹF?��_����0Ƨ�6����&ϖ�w�(B`c�̴�I"ܪ�N�&N��2���>H�em�	��%��Z�E��>��z����|(Rr���7>�Ϙ�2L�5\����h�#m*E��`{��;k�/�u�k,jDo���,T�T�j��ښt^�MS�w�P�09�!_��-��0���#&�������Y����9�	L�zz�m�#��^��Y���D�4emT��ަ�������&���w�YE�?��Q�Dv�#��/c�X	a�г,ǵ�8ByӚ+�������6}�Dz��ܰ$�'��	%�zA��Ku}���K44wtK��_F��S�4`��?'��)<<{v[���6}��D�Ȫ�\��t�0�J@��5�!jZs�Jn�V5�))�^<�>�׀�ˡ���P
��aj�4e�a'F{�R�T��jq���p"�dYr%:n*Ȣ��e�I.���P�-E�4�p����+�M��pX�$��4]�ngi+Zk���9�M�^o�#[4K����w�m5t�5�!��:Z�����o�ߨC?�?�P��K�܌�5�$}<�M���W}{�^�>���e��2_-S����N2�U�D;�߃�����!�>� I^`��,-�Z����ߚ?���"�a>��{�ךּ1ƭ�*��T�!�+co1͞7��d�-�On�w���������o|��/G������g����Ϯ����a-ngv�>���
&�2�&;����w��<��u�1g� -ŵ�'n
Or��,��oZ���K�}CWuŜ!}�]����n�G�����
G�f��-y�9��tf-�5o���Ɩ������֫lm���`�Εei��؝���ۧc4��5�i_8��0(2����Gq��#a|�d������]N�!�WƥN�9N�!ND!@P.�bi��[���V�e��S�+�C�ZU["@�Ԃ�
=�<�Zt��<�	R��I�/�p[�~��}#a�.����g��7R�`�F`�]P���l�K)�4�&R�7�0��1|C:X���.qey��LrVHh��K�e�Ȗ׹UZ�&ڲє���M���S�
%{�_We{�90�72˵��oxݗ~=��(v�&�V�W}��R�mg���>�ܸ^���Qu�,��[F��'YGE_"ܪ��q�����|sh�!&�pa�S�����ʍ�Y0O��PK�mW��v��#setuptools/_distutils/py35compat.py���J1��y�&��<�
�W�g:c��NGЧ�73��5��&_�*E�d����ql��c�\.B�y^����$ȅQw6��a|4��Z���8����@0�}Z�%�h�T`T��͔V�O��1�E��~��r��"
U�t�9u�I�:z	O�ާ/�5���Rد)�3<�$&_
�e�g�`_,����1>>���r����x��k�����v'�Q�Ɍ�PK�mW��{�#setuptools/_distutils/py38compat.pyu��
�@D���`���{�+J�����R�^��j�i�/�0-�L�#k>�������&B���#��f�RV��l�z왒�ZYxԮUZ�$��tUe������v��Gk ���
PK�mW���s�
setuptools/_distutils/spawn.py�W�n�8}�W�:da���C�
v��m�t����%�f+�I���wfH]l����C�r�;��J�|�U��{�$w��T)�����Y
U����A@e��WR��
�U�s���W�6W�ke�*Ug����*��
�[h��Xр��.ҹErS;C�O*�˕|�E�ź���Ŗ-Z�|����I��ƠE#�l6Kմ�zp�5�7�!��$dcv���:������-m��-��k�8�\w����:��j�I����M��pW��u;i����J{X�N�W�w��F��:����;}�t�
e�%�9+L�,i��@���y(��{
���m)��n�FjNShur��t�>�z��\�H,�e'K6x}����M�DHS��n�����$(m`/��W�	���W����p�=,c�l�Q~���c�9`o;	s�
#��g9��l�I��1"=��{Uװ��9ɍC����=p����<f�1J�:�B>��8D+���H��ݜAȴ�0;�l��D]�ĸ�z��AUd���������w�*�gZ0�������*�"#���$?KSpY{.�rXw>0��>9�P%��s�,}��T_�YNNy�)2���+�L�=y���F(��[c�"](%���%,�b�,�{p�te�0,��
��JK6���3�n?�'dm&"��S�,�c��3�=P��x�[N�8�w���	�>F���&)�ܠ��B��F�n�K<,��3�T��x����^������շ��O_>����簑~Ո¸�ǶƿP�������m'�z<��2u�Ih{�h:�ieTf]��Y/�B����Yy&�2l��J��B��<�~$'�4>*���#�D3�}�����Y�
��;Y��p�fp	1��b�Iq�W���,�^�!��n��hPwr t���-��0DO[k�����L̯V��#�t:Z��F<�E�1lG����Nʣ"*�
8oI|h�>�g�l�tl}�[�N�b���-t?�����|�;}B��g�^�Q�Dok����M�Q�N��⻢$y�G����4I� m����&�xb�	�7\\��4���M��=�,�}P�"�zp��g���y��+!�.'�[`k�Cs�=���A��H���+��|��aE��XsBS�o<rG��O�o�����b
�Q5#x��b�-0<3^vi��-��[s�����]�G�SOo��%����Ť��q�LМ��!kҴ�ɞ�iL �4��.]����氧'*[ؾNqƚ�o����B��З�b>��T�p%�)�@��U�&�0m�.^���I|7J��N��e�V'Ż�0h�$�y|��%l�N�q�T9�7��kz<UM_O�OPK�mW��>~T"setuptools/_distutils/sysconfig.py�<�s�6�����jd6I�w���\�i��Ğ8٦�z�0	I�)�%H;�L��{	~Hv�w37�Nc��70�N��6���Q��U.�7�*�<-�<[$˺�U�g"�y����VJ�BE�"�&݆��L�u����2I�U��X���Mҍ�V(RY!P!��Čp+���F\+Q��Lԭ�E��l9Y�*�^!��gr�fs�E��DW"_8�$.F����,�Q�#�Q'��L��*KT)����h��|Ҁ&�_ʤ�T&�7B��%��*/Jy���/e09YCc|G�?/b|�_2Zy����t:�L�u�����k��T�����dQ�k���K��x��$�熼'�z29��=�U
/�M�	CV�u�VI��NU���{�Z�\3�b���@��qu�Wz.t.~���Q�.�J!�װ�������0h��BV� ����Z$g��'���꣊B�ǣ��{�_K���0u�D8��(�U�@�I��*/7Hb�2���,�$Y��in�dZ��4�UH?���c�z��]�}�L���\����Ԫ��"*sQz	�SX�w?���I����]�Ӝ�09��&e�L����o�.�5M�m~9�j6Q�VF�RW��x�8@0d)�?n�lFpځ��KD2Ce��E�ATd���|r%VH�@���̖���X���;���Z�BkU*�u�Yʵ@lwL
Gt���:�Ҳ��<O��f�[U� �w�R	�R�����d�an�#h���z�:�O2]�4UvF$rw
���q�X�Re��W����?�Yæ��$VP):4��.#B?�1�����?�PU]L炿i�t:kW�f�2ы$m���<�z�&U��"�9]����L��L��/A���$�W��
��UU"��Ao�So.���3�V��ZVy<��7,"�l3E�:�"XZh��J#����L��
��H�t�e��p�{��ig�;�N������eQ�Hq��8�8p�m�Ew�b��v1"9:�iT��bq��2�f�ʥ&�Z�
Y$�Y���k�F��Q�I�5z7��ir�اU�
|� q�@����2Y^8z���cԂ	�	/�>oR����Э�
w��r��	��>F���0|r
v�7����dV6���G���T�@
��"Εμ
t�2`��AvPN�$Z�k������8� �Yܪ����T���K����d�ٕX�߉��X' 2V�8s���?�󅱣��V)h�V�B���0\f\Ap=�-@�{O�<��g�3/�����}�Ğ��(mї�<xv5L�G�4���ᓹ`_�N��v�84�lt~cddЖ��	��Bx��<Z	T��'�j!����-іL�!!0Y��[_z߂�7I��I��evɳ�LB4Mw�V���M�y*6̜�j�ΑH��uQ��v�%����ț�mh˜c&��iJ0�%p��ӱ� ��`���z,�Pt��N#p��xZȎ	��N>N;�ƺ�D��?�����qKѱ/�'�@�Ҽ�;ȸ�a�?Һ^�Ru�(\��Ѵ
s�Ճ�.+���++��F
�0.�>���(�C�v�ۼG�e��2�T�4�
��X��(�����S�ش�Ŷ���B��������u:t��f�1w<dZ�^@��<�~�t��[��	gx�KP���I�(,ƀ�ˢ�+>�����-Ʒ�񨉀ǎ���l=5l
�b;��zB�U]	���n�:GU��Ώ�	�Y���9E��d��0&���9!Al�G�B<,$~��Og�/#�X(UJ��[�]wwz
�:7Y~.M(�f
�G��q����M�u�������Y����{6��0VCH�o����=�)1"�-���$�wJ��ѳ�����r���I
';f��lc]5�a�M9zv�0A��\��k��&��A�rT�hg��K�{�E��6����nv],��F����q���
��|�NJG+��}��!���H/LĜ��^���z�Et���哫�����э\*
�>�j'����5�j��3��u�!�n�,�6a���5"�3w�-r�ud�%��Ne�s�WS��leaZu������(���Y>��v��y��2�"�j��A�1j��;b4}�o�B��e���V|�w
��_�I�+AX����w!�)}��u^�ds�v�f��"����(�n�y
VB]�#��gH7�Ȣ�X���Fζ��A�=)��>t��h+�s`y��و{mšAPk'�/a�)��꬯�h��R�_�%�t �&����~�g�c��/f��2��8ML����A��#�H���D�,3��w&Q��(4W���b�hV�����n30�6ۉ7"��	G`�Vy�"�#�*�%R�Rk
Uo�;5��52��&��f �jX��*]�;ɛ8���Σ�$�h�����o]8[z4Q�VU,��{!�h2�����L��ej6���L�kx�n������3'�r{r��k���ƃ��ҏ��_�;{}�����Ň��髓��l$�6�����ڸ/�u�;��ݷ�[Q�B���ޤ��G�\DAED�߈�s0j���W���)aY�@��oݕ�m\{��8j�>П���~��v[J�r���ۓ��Ջ���ϯN/޿?	���l�wl��~2uEl��"v��-��"@|Ё8:��ҹ�6Q��u�����Ȃ9�{�ı�8� ��4�֑�FY�(9a�{��t��b�g*<n]�*CL�t JQ�.�aQw��Oa�qՁђw cZӷ�|7ZE�Gz�0�>	� JM�ɴ����ɍ�M����j�>���7Q�՛�Dv3�|~܇�%�
:�xjLS�w�q�����
��@�욍,{,��	�AP�ag����q(Ve�Z2��h[��VQ7/ڸ?`��6E��.4��E�c�V^Švջ�q�㍿un޷�XK4���!Z�^��0��z�����h�Q��/={��
X���o���0|��f�LU���D��N������4M�¶>�c����1ͫ�v*|$+u��J�8h�vao�%p7�F3ݻBHz�E��n���q��-�ݛ ݞm���O��Ũ���J��L�;@_Gzh�>���y�ޕCy��x���Lݟ:��Y�:��P������^�1�?���{53;���6gt�)X��7)Av]qw�ǀ�>�f߽!h�o]hC��F�kּ�W5�/��X��αIS5��u��%����8��N��8@��
`��cF��N����慩u�`�*�65��aj�c,Y��sJc�!��e�Җ�
:���r�x]º�L?�8&,�7,����=~!�ˣ��]�?r�O��^=�	?�v�[f��Π��w��^�=z9��٣�V�����šXA	3�_~'%�>�*�kh|�<Y�f���G|����$sq������:Ϻ�V�P�$����;S��Wd	.��b���2� �v��D�-yG�G��7��p�'�-���Z���6?��
J	2t��|��H�I*1�=�T�z�*���P���͂Ihk�lQN�K�b�k��7��!���,��*y:�G����OO�}����������U�<��l���T���(Ȑ�6CT཰�6	�w��%���,�'D"�(0C�X�C�}�S���OT�!2/��B�é���RVJ�Hh���rR
�����W+zo�HR�{T���SZ��DN��fO���#�ᔀk�J�?"������X ���=�
f�M����{���l_S�g�^�)m��(J�4P��(O��ʝ�hC���ŌO��ɶH�C"\t-��_C����:�E�9A��*7 ���4GLT^W�c2��0�r�^��GL����	��&��n���r&���J</o4�ޭ�(.�u���`�B�EK�cB�e��e�ߤ�L���<�,����A�E��wz�5�׮Z'�*��ĎoZ��8֭�-�B�n�a�EЍy��L�z��k@�o`w3W��̶�����=�TVv����p���7�9��΀��gc49����Z�Q�рQ�b�����nK��C$�(,Xʚ�k�0#Sg4%�������d>��B�q��&&�Q^_]~p�\m��(��C?`���]�-P��4�����G��~��Nq0҂�� ��H��]U�9�mk���y�|pm�ܶ�5V��l�LGk�Ѿ�����
�G��,��qu��8Э�c���v^�*S������?'�;���n鳟{�5No0���֭
���"���E�e^�f�Xm�<x��p�h�*���F��]�
���Lr\�q��F�=R3�EI��CP��e
�-9�=�K�\u�V;�l���:��Jr�a��"�~�E�i��ɡ�I␧��;����6b���Z����_��u�i�矧h|�>�R��F�T��s^�\x8�!���eQ�fI�H����0
�nG:�A[�0PћӘ��J�'{u���12bͩg3�9��B3e�8��>Ţ.��Ҡ��sJ�sos�|�����^/(��=�M^�E:$�M1<����������C�˼
���H�r��$��$tR[_z�hޕ��6�`a�e�yJ��]N� x���ܢ9����
��}�VDp�1��D�i��0�����kL���3T%#�KRkxԮ�Pr��t37`:��<=��k��Y�D�&v,���^����j	�D�������[�|r
�N#�h'�����]_��][hm�m�}Щ9���b�ꑐ�4���iSR�!N������V|�����)��M&�60xH�Q9a�2�C+�L�l�M�V��J�:S���q��-S���=M}����ٛ��?�8zw�9z}��gx]$�O�:�~��Z�I�����74>t��p-�C��}�=t*Dwf�)�Le'1m1���]
C:67�A�f%�o�o< qi����xb��s:%0=�i�n�|���\�b#�=�>x���(�}��78�	�RI�cv��r�Z�كj�?X(��
�x��J�������N"�/����ޫ�_�\��r��٫?��y0��C(�>��z�F�.�����
VN7�}��J��N��z�����#g@�x����;[�ݐ��fK�l+`��'Wm�j;Ž�}�ד��go��7�rM�k`5��%܋S�4������mr̾���q�~��Y�7�j���8T��N��2�3橺sG܉��%�j`U��H9�X
J��W��W@; "%��+�f�L���:�e�M����0�-�1�J�=�Z�m��e�g���33���uK���,�5��kO��k{�
9��d_��i�� �'#��u��/�ٺ���i��^�g7��W� 7Y�Jvqʊkʅ7\�m;`v�t}|��*I�R�`�!ŀu��c�H>��E�pO����Tn�G�;���Q��`��!����h��>�:�ľ��A��)�o�a�E������8P���<5vμt�k0n0�0�E�/A�0Ow�s��5`��$M�
�=�ֵz��~�����u�k���q�� �
]������S�8�]�MzQ1 _΄�!�QY\0	r���!B%�u]Ks�v��9l;Ë6��F��Fj�wImgp�����U��At�ޯ6E�����8��]E���c٘��L�@6�bt��
�9�ݓ�ϖ[~���#߬H����c�ݗd/��"����y,���^�HF{��{5PP����K��c<��$�
t��TA<�Q��~�نo�At "O��rM���`@�/Z���p=熨�mY�6��\w�p(��~��!U��3�U��ߪm����₟�;��sץ=�ۂ�����������:Y�����h��|�[�7rHϜ�k/_�q��{���{h�C�1ҵ�fw̜˘������ft���l5REϳn�Y�Н�%.o���[��r��G
�uۯ��W����|���
����rν���A�R��E�Q'��a7�;��+���%(F�wO��ͳ\��,]{ �
���<>�3l���z��
��k����D;x��]�y#w���ֶP�d�?���W9cv���ͭ��;�0б�xc�*r����M�}��vr�HH\��\G�J;NȨ_L�yxke3׎�n�?pI��r�����ꡲky�>�ﱣ+�����������f�wn
_l���
PK�mWQ8��Z�0"setuptools/_distutils/text_file.py�Zߏ۸~߿�q���nrE_�^q���k��
�D��ʢ*J�3���͐�HI�n���Z&��{�j6�5��~��榪�c�)#����x,�B��C��>��y٨z'S%-�� �9�F�u�五Eq^�F>`K*k%�N��Ϋ*/�"�ǣ*�����Ѷ���M��
Oe���:/�~$Nys[�>�tPf=��nn�c��F�3Q�777�p��F���IfuU��h�U��`�cF�<�9�#κeB��,��$ˆ��4��J���bX�:������!�V���e#�X�t�s�)4Q3b�r&rf���:�d-S�c��X�©�T(d���Z�����P&�l
�T'fg��u�g�l�Яt��	�d���t-�Z�}��4�T8v-ğ�L��!F	V�sO������p��rS]6�.
�-�Ư���d]��8��3h����b�JU�F	ZB�a�gϖ��U+v��p6y*�N��q��P�0h�,��~���Vb����Ƕh�
����u���e
�я�Nw�'�L�]~%��\5��x��}�.��KX�M�='�-
��W6�
�tq<'g,�Q���K�d�t��Z{�E��C#�����Җ��u���d�������k¦%��<�`�9����T��V,. �V(j8m �z�Ȅ�B�{�Y�Y����1�AOL�ƴU�7��i���S��+�=΀i�fp��|b�it���딺�'�*[�m�BDh�O�h9�$�^kDD��G�auS��j
�K�O��ٔ�ģ,Z���.!r���6��p`�w��s�v^�AT��K�U6S�j}�̄$����ْ�I�1I��䂐��m�5���J�%*�a����y�H��z:�e�������ן��cEP���{��^e�4oz2��Q43��V�c|p�B�Ǽ���#$�L�(��s�2�{����ٟ�qԱj��V���D]&g
iD	}���^��{���6�2��P���v�%'z�#�����]6�d����"�n)��`�>_'�F8�H�E����=��ÀT�nL�*%�R�+_*��+4�,KRa�^�m ���t�%O���D����p�q��0���Y�*m5�d5�#��@������o���NJ&�(c�L�E�ĺ_�R��g���xm�q��!��V�"��w��Q6п!�����)w����2�FB��&�X�U�teV�����t�)kF��0�v��?�ơA�wȗt�pEq��@�O���F]ATG�<52Q<�p�,G���P�r�Kl��d�<-[n�A5���J@��qV[H��h�MH��$�}!�S6�)�<c+�8�C#��z��|�BY[��'x�4ސ���C�>��8���^����z�F��rV�N�Гk�;�K�xseq=\|�r��n�5�Q(�k�mx��K{~�T+��Ѯ5��s���E�O�}�H��g��{|dݔ��Gi�mz�����G��a�Ǎ�†���!`��xP瓮���}�V��D�:���jd��
ʞ�b&cQ8����ps/�8�Q��l"s _ �C�>��e��UH�T�j[�#�z��M�x�d�x�)�	mz���I�5)��i���C@[��*:6SFq�-�#�5��z�n
[��"�r[ܪ��Q!*A��˖~�g��emP�O�"1š�*P"$�r
�_�Q �3���uAIcޭs����1�ͳ �,?�+���+���q���Q�+��+�Ww���s��En��Ǵ�k�����t-�i�]��Ɵ�}��Eh���n��J�n��?T�r�W�O* ��ҐKP ��k�?��U�!��P?�Ĕ!�,��e8Y��:f!��/}�e�lj6Φ���%RV�Ȃ�_S����[u�-5�i��R�o���[�#�T���Cs�~7�D����K�'��"�1�^Sv.@�冞[��^�'δ��#󡫨�v�pR��'��@y���=��R0LZD
q�v"N*��
�?D��Ƶ���*٫��<�h�K�t�&�߬�g�΍¦2��a�׀�ZV4�M-^��R��I9�2�xyn�0�3ȾM[j1Ȏ1�
�W��U���x�Y\�Sd�'��/	���m[��lk�^s�<�ól`�ߩ
��ۈ��Vѽ9;"����>qO�sx�m�䀞�s-���Ǽ�u�F�7*��MlwDm&��+�F���Q�g9��[kY��Cj��;�����
��A�O���r��M�9�|�hpgS�L��.��{��it�2��Q�
E`�^��	a�Wj���C�lj�l�֌�S�>j>s*z�m(��Y�=]�g�_�����y�bdծ0Fi6��д�_,�؊�G}l��A_���uk
�2����Ydipĕu�]�:y��H�<�4YhI����0�Tɼ%zH�cC;�ؾ��x�{��x�L#}��ʱ������#WG��1kKp�c�fa�q"�~�=��8����_����~8¡��SHs�Q���N�>�[��_��h��
�GS2�[$��-��EW�CC��a�e���9�^�U$�6��o�U�D�["���o�iNWX��a�E���\��.WT����m4�B��8�p%�~��P�V7$I���@1�+�3��b]�r9>��a�����"�\z����0!��cڃ�JJ�'�s"����T���~�����aEI(p�
:�̮;�"u}:C��v7$��>A�]!��*�]��n��P-�Ó�o|W�	*���-s��D�51y�N��T�r@�O�ڟ�<�V�4�s2�%�	"mi��s�� �5O
�͉k��Hp�&m�࢜v+;�ў1=��fB�c�W�&}lV2��/F��G��X����R��(���jrV����5P��ѵFh??9q���L�$�k
B�'R�ë;�]�G�Xoh;)�3 =���fw�q��sd��ŵ2�vz��*��Q��J����[�a�Q��wbA��H#�|ҿ-%�]p���[&�`BM:
�{����J�߭����dWt���ᑗ3���8�X?'{{��<�c.�
��,��?���+[W�kng(�s�+7��_d�$����)�}��G|���#[�>�7b��B�r6�²w{����[�з�~����|Id����*%�}�Ni�"��W�p�d!�(������e����{a�_PR�|�7rr��+\��R��2��g�X��+����d�م�]0�e;>�[Z�,d�8g?�
��U�Α(�s�@�,�:$n��BË�o�KH�#Ͽ&��^.4�Xp 9]��i4t8=��>����)��nn'� �%'mW���V\��Xy����a�P�q�y�D�6�B�V+��\N�{-���vm�AQ�Wb�Ԃ�z�����{[)��xv3�-�C^\1O��3���ǯ��i�em��{��W	��/����I�h!%R��Cid=Ԏִq{vA��w��һk�6�̖'�PY:�*�,�l�'��y;�e`\T����Yz�X��6B�}� ����O��ۿ�8 ��6��~����p��6.z��u��bs���+��^'2�Mz*�d��T�	/��J
��	�iG7�o-��w��2�V��t���U�Oԗy�Pz�c$�8�7�cq�
�D��=0���j�3h�y�fؾ_�':?r>��7��7b��������u��K{�n������`�o��%c4�G���G���dU�$ݻ�}�|<c�����n��>.�E��Ą�"0	T`Fč�d�����������\�5?�^��<�O\���HMt�m����x�H�Jz�G���ӕ�}搐���=!F�?�����ͶbE�PK�mW1���8&setuptools/_distutils/unixccompiler.py�[�o�6�=�&�����p9�]���ڡi�Y��m��D�H����I���df`�-�>�����e2�ĉҕNRVyr�"�I*ʓ�+�k���`�`��ʎ�(�J�g�Z�w&7��;�َ�q*�	���c�D<��B�c*��E��]1���	c�XƣR*�
��l��[��y&n.�yZ�[Z��'~‰4!ɣ��S��ю�I)"-�D(�
%��^�iM��K>8%Ma̛s|
�[�kOh9���Q��,�J�$�匉��*��0�,��,t"s�s��Ӓ��R��1��N��2^��lZH��uz4�A�sX�<�/a�P��N&���I���L�6�#���e����ɦ����ٙ0+��&�v��X+��&�bZؙT����q�ѽ9ۊ|U��(e$�Z�)���t�EY�Ru`_��W �W8c��N���d]�����S�vm�a�r��e�./Y�r�䁑�����RU�?NNN��ϟ��]�o˥fQU�"�i-������e�8q�u�]�y��B�I�V����R)�*
�T܋2"s��Q�d(�b�G~w
��&M�>&:d�
�D1�W��x�A�戟%۝�(;AQ�_��U���3�ɯ�}��w��M�˂\W�7�yx�4��>7��	Č�9�>�L�#�8��p@��r�b|�0�[�G��\%3`?2 ��VI,@q�nTO�K��K�W���$��5�b����Q�8���@�#�8o-�E�D{l�[�������V1ٜiE\v���t���KG�!��\3W y��2YW�����~h��*��謊�AS>��
��TN^T��>\'�r$
R8���#S���8�������
���@0:�wPj'�46j��춮6\�� �1x�'�Α��/�:�<<991N��$����ʼno��xC����
��)\o��V�Y�ơ���%��]� nN�N��,
�k����\��?X0+nq��Qh䀼 �Y�PW�7����T���G��F���5�H���W�Vl'Ja��P@��G�¢L��a�4���k�e�raj�W�R�.I�&�\T��H��Ƒ�:?�0��$i�,�1v�m���t�Hs`�o�u삽����9�?
S����D���+%�'ύ��FW
j�;g�Yg%Ý��?&/i��[b#�s���3W��#o.�r�~rb���^����mS�$�cr���;�̠h�Q7�Fb�h��h!+��$n�h͕Sc���4��!�;���^=���S�
=g/!&� ���8����D��FV��z���FpR
�dN1"�_�s����A�5���
�@�xnY�����d��h���d�3	��}-����&��R��4+a�$�IA�;�7��x�޸������L9D2+��C��:�Qb�{��Ϛ
�G����J
n7�pH�I��㶧������$�9���"lY���J�^�>_ҭ�	�娙���
r;m`�1d���L���YC�&9�py�@�ae-
L}r�mg5N��e92��m�E��;��Ӈ7��>վqgg�!o�3���N�����M��AK�3���A���s�]��V"Ӟ�;}!N3J4;��O��6�'���	��Z�E�|-l��D�5i��qv�:b	Ş:�4�D�I�fg�|Ã"_N��Q�N)3Ę��E1�����P�{H��u󖩤tf�y'=�5�vӁ+7kK�!u�m��\�L��z�#�����J]G�T����
��H"Q����Lm��%O ��s�)̛56��nk�����_����("*��c���*/�q��{Ԓ΃��0��87�`I�b�����~�)�T�]���<I���yX7�Fk@�_n��qc��6q?*���F�f#sȸU}`��!^ڙ��ֱPM��|n��*��^���ꖟ1����,�w�(޻t�_:��UϚv��bpgHVh;WL��rس�x�$��٘^�W��+�M�=�ԃn���?UCt�a2h�HK�]%�������;��U���}���ٛ��wd��Ȑ�/��)����RG��2L���ы4M��aGWC��.)e 1w0r�)�@BF;�����T��2)Щ�;,ݛN�)ۨ�;"�r�����y*8&��b�_�ɐڷԃ?]��g=�K~�[��~�%q%PcEj�Tu|`*�!]��eQ�RlZ-X�M��1Kt��%��#*j�R��μo��2�P�쌂'�$w�X���K���J��LU��
D����{n�+-��>�#ͧ	�1á�5�-v=ݷq��~~pY;]�1�����[Mz�IǩimE��~'�%�ӆ�s6U���@ʔf�ِ����nM�fu�2,eb!�a�����Ik{O����>}����-��o���w:��֯��wR�h�����3D�%�2K��l�v�>���!���6�`"�A=�����N��+F�M����WW�>����aW`J��N4ś�۾�鹆Q�i�Eh�*gg�̷���p����X7f"�OJ�g�*�n2הК޹�f�J��u�/a�\2*��,UANߜ�o�p�#�|������ןC�ą}�T�	e#|[2�c*%f\���9�-�cJ��ݣh�A��' ���MmG��Jiqs~;#i��a�8�磣���e�oF,nr;�f�򷒛r��J�xrƷ9e/�|��P�%�
����D%�p���8�}u���cz�%��]�$��8��lP�:~[�χY��tf&�rz�~���''����ͤ������^�lϚ�-���"J��Għ������Y��
��Լx�iZ�|D
�1ӌm�<��Xau�E�����zC�6���aD)tU�l�x;A`�LSrJ�jEvY-�N�`��AkF�-���H��@����<�K�nΌf�C���)|z-\�����~�ͷ=���Ӻ�X.MQ�+�\�%��4rI�9,v���� �/c�y�~͓���~�-eU���|w�5���9~�V�%UW�ޕn6�ޭ7��LK3�^sk�A�����ɽ�'g�0 �c��x>�R��&E�S���{���2fm�#ȩih�`��;��+<��w�lO\ 8lu��J!��~9ga��uγƲ@j���I^|�g�_%nќ�ؕ=���`$�Ɲn���E$�9��hS�	z�Ѓx߁��)r���bGzl���~y��T�y]^�%5��@iD�a�M�_���N��:�u�1ϐX�IL��*7e6`�AP>s���`vہR7ǭ=�e��R��4��~�A�����l:����fG���_����N�п����N�W|?���M�Dsd�KF�K)t��������!Cy~>g��;�-�9�/Jd��Uy"
���t�
�[��i��C<z�,1j|���]Dړ�wF"��kwD�'��	���]���:#�.$jZqFNqC��)�ep���fқ�)���o�
ȿ�ѲMF��fz+���~8C� ґ_�si�M7(9��Ӌ��;7d�B��|�rb��P^��qC�&��)'���m�}����B�Fc��>i=X�mX�b��5ߪ��C_��T�C/�p޽����P(��j��Wo�#��Mh`�Su��ó��&��h�u_a��6~��0O^Oӽ�^�“1�5�}����S!zR�ΐ�^j^T�����}+��rl��~�/��Y,ب�R2�{o�Iyq	��?�S�2�[����UI�Y�m~�"(4�cz�9ɾ��E���ƱG���i�E����VӀN�"��x�j�fE�p�웖�T����6�|i������R��h�4۞~k�<�<�6"��#Xđw�֗B��BOCےg�����rksf�Ay�j�������p�+<_IB��[�v��(u�†��B�_M��iy�V@��nlj)ÍL��{nB���v]r�k�f�d1i��e������L�(�$�8M-I1�	d��4��Kq/RY@��K	�=�����{Q��f��y��y��a,��Q�?'��3ᆱ4̔�U}e�L_�帣�~x��uо�`�@��Q�i�X�_Գ�/�g3�$�ݏ�\��@����6�e�������M���l,(eI	����G6��S����sBmډ{�����͟��[��^и��E�g�h�d
�=�b��q��rL��5݉e0��	�Q�`2��K���T�3�Y3��8��D)H�y~q;&�Qy��3.�
����(�{ȰKL	�w�b[	�̟�!��Q%+��Ϊhf��J;1��`�.(�W�hӜ��ݫ��JT*}d,��2��>K���\yYw,1��)T�dU���#Q�""��Q�fO��cS+���n߱���Ԕ$:����A�F�H͜G�Kǡ��0Ĕ`h�ϝ��B���G:�)N�A`���%@��XS���PK�mW��	u�Osetuptools/_distutils/util.py�<ks�F��+f���$���8�))��$��#��M�'kQ 0$��b�_����[}�H`������#���Tu�ff��ާ&�Y庨��gi�U�:���ȍ�LT�o�e�/T��*���~��i�Ҽ*�\�b/��*�c�2]oժH�L���y�j]��*��Tj���d錑���*a������b���,J#����CU�\���9�^�����F�2�h���7¾ˊ����ү��:ʹ�P��y�#K�*]�Q�0!�	�Ⱥ\�~��,Z����D��BW�0U�����?@폺��\EBC>�4�y��Sm��,ၲӧJ]/S���D��4϶
N��R��e3cb�:����i���R�UQ�
Q��W5��tV����uG,��qV'���ʣ�&p�ui`4}�w&*�eZ��u�Ue�:K��V�p9NF�h���Z�bI��}##~"A�dm؊^�<1
�c4^*���ןҼ���;]�:k�JQ.�:*�4����йFy5=��o������s��>GY�
��d��$}��$���Hߍ�cS�"���L�&�ΟռƯi��6i��"��Yb��h��=S�ٳ��;y��
>��"u��,<{6V�3��ٳ��U<r@���pX�4h
e��t��;�܀f�=bt�/J�y�O>\^���a3��
��Wm*�l��B����j�$�i��;��+��9��i�>8�&G8�
�V����o(�w Q�������.��g�,+y咇�s��4hn�v\ư���8[�y�\�x�s����u��W��_~|�!b@U�N�"?�/ؾ���8�P޺0齧
<�J-#UUp�>���l�P���oj��,�uE��j������bİ�����>�Q����g/�pȇ����!�u�J��?�������K���=O���.�
��@g:2�U�w���H]�Vc��^9�:��'��	N�W�g������Q	z
�YM�Qn-���Šyd��@j�7K�噑%T�e�i���`8��0Z>���|���#�3pݛ��(�)>�e�W`w��U����Y���"��e�5�������8�[1ר��>2o|��
�=2�G�S���'Icu���х�:�H����V}#�{玔���9�s�}��^�tAs`���'<��L_8�]w���a̛���Qġ�܅�>�@^����]0H���8�AQ¬(*���e�ip7(�QS<

p�"�7�d
إ�
�	$l�h
6�L;#���p��99~����gϾ>�NO�7Vߜ���~}rtz����~��^���݁c�	�M�&�oP'��{���o������%{x^ �Q��L�����Z�}t�&J]�o��]�F5n`�O�w
�6�G���3F �.��88��&�����7����몠�o>%��'>�5}u��ݻ��V4gI�xt�Y�
�e��t�^����"�8��>DW��]�k�"����n�ݪ2��qKe|tp�����?�`[L0?�>�E�
S��ꫯ�96��_�_}���ux}I�e���>����uh�{�nٹ�m���� 'jw�:w]�vĿ���E)�~}��z��M������������LX���hh0D��s��d�����EG������C��1X9�t6Y�Y�鉖�߿z}y�[��ۏW�'���G����7o?�t���o"-|>�0f(CZ#q�w�L��+M~�l;Uo
����ZW|��(�ȗ��򞼪 &�o�1��':��1���`=3�-@����[s�֊	U���٤|�0ÅfS�����6�*J)Κ��D�� P=��)��Į�b�S&�.3/��X`t���1�
�lo��f+�=��2��j�~���/��5
m�’Q�U����*�D�`C�t����D)�����p��2M�c�]V+0�	����z7W�N)�5��`"
�)���Q1���Г��I`��==6p��-�\7��(K��6r�N7�[F�� �w�뷹�
e���	�)f�O���K�ɂ
��(�:>���r8i�yh��(���IZW��&Yˆ�*���
QbvK���(Q��θ��P?�����Ƿo��AO�����'u��b(ق9M�0+��z��ԫjS�w���74ue���������}9��7�Gc�%����4ᇑ�/;��V�pe�c�������D�j����q`��ؠ7�D]�!�I�Z��_�|�S�7<���!ڨ�Q
��o�� �O�����/��ޱ�������5�������]����^�0�FIdE���XC#��`���h+�)��St+żp�T�FwnG-�����3(Ɣ]Dִi�D�?��+���)(BZ_��c���5=�E�(k��&I���r޺�SK֘3�[%t*P��s�6���Ic������t]�Xs�8�D['_c1ed�f��'�ǀ�3mi�ĨdH8�W9�
0��R��G�@�`�����������T!�hH$L�"F�0�pCi�<�a
�N�f�[��W%��h�nb�G��S�O���hT��ٟ��1���$��d������u����Y]iL��?9���m�40�����%��c+4O%�BZ�!<IܮN_���#1����K�����q��_E��i"`w֑ؓ�a0��,�zC���!��t�s|��T��U����	�!�7z-\'ҿ�)�=���:�7�4�ẍ�ȳ�����
�*�C�w���قO���v�6�X�$f��4�ۢ輹�zj�8�3�Cr���������R|�ב��9����v�ÇC�9�̜����II�%�Lp���]�������O��.��x,��3�ý����z@{*9߁{�KJ���Q�Qze�(�8�!8����u$��[��?귞��9����7>=(W�E
�NZ첸x� �3&m?Fc�^�d�<�/Xm6���V�uS�b�*�%؏��ߪ	-���\hk�\�)�����l�zR
�}DzR{�����%"���N�n.H�\?��F���Nq�LB�G"�$�{
QU��2���M�˙7�*z���I0NZo�4�|�O�����}����`�ֱ���ҧ�^8T�u19>z��ٹ
T,�� ۊ|ٴU�{t��Q�[Gƀ��BTE3��%�nAI�*DK��>����R��J��f�p�[��������(cv��k+qtI�k�:˞·lB�V#Y$�j�W�V�� o��q�U�LØ�N0��V���/�)H����7K�c�	�qh�.à���3��|�F�I&*�c�=`XG����7���t6E���ӧ%���iT/P����5)ơ9���4����,m�D���@V��� D��CƸٺ8�.��/r��Z�޺L*L(�U@��";�"�Ri���?�X�f �B4��KA;��μ}�]��Lc��(]��Xς��UpM�x5����~8�|s�x䏅�Jֆ���$j�R_rn�3fhZF���O�ete�:�@��l��B��A`|�����=;W��ơ�^���"�L�1��[�|�T��H��)�4�&HKI`�]�6#��r`�B380&�<ŒPRc�zQ����D-�?��ꉝ��>l��-�
��+����)�
�BC��K�|��4q1��<[�{�MX��;��(֣�e�z���	|�O�#�n�p���,�R$�s=��ߝ�<����i:z�Ki���Κ���?r�L0�f-�(�o��_Gq�"���P=8<wZ��RC�!X�Q��G�j�{b��z�i��sp	���TT370�Q<���0?_HJM�p{&���*4눪F��egBb�r�2:��F��(�6�۰�_;����t��D��rʺyN�V_�m��16� �����M�[ >ۺ����f�,E�bnPĽ�.ۥF[i�O�Ѵ*_D��N�4G٢(A�Wt��F�ee�ļ��Œ�H��аE{2۶T��U�s�8���/bZU��w��6p�A�Ʒ�m5�w��B��t��0���t:m<֎�ڊLWH�K.S"��<��u��#���8��Na!����Á�a�c��
��7�Bzq\����uK$��9�?��Y����NN�GQ氯}΁�u.܆%�w��?GA�b��r�0x��n�bOWd��B�F�o��Kr�ӡ5�-k�d�[w¡�f�V� -���F搭�ܓU�9���L��a3h?���
l���1}���荻����٩�ډLV�k��#�;�[ubː�K�>u=��vER�Z1yЊ�]��H�+z�%Q0�YnR�,b%��G�?B��q���-�v�r�1+�0�u�*�q���_*���(�q���c���0�O�4���
5Q'Ƿ�>D_���s�h�6;���7���!�R^)�Y.�<Wfq�d�>���#�e�mX���@Ĉr�J�O4����|QWd���6m0��f��C�ͻ�`�U/��C��EYSG�)���fm|��>6}.l�J�	� ���u%��Qƅ�|V�lؖ,㶨_R�	>4�S)Ml�D������H���E�e�z�i
�-�Qz5+���5�2��=�ok��NFc��S0R�l{`
�]��Q��#(\/�QI=F��4��)��]^fq399g
2�*�)��'A�C�d��v���D@G��||��)6�M�N�r�N��<f���ʪ�E�p��
w"�ݖ>�e]-9�A���b��R��ȶ0�;�܉�-��n��?���Bm>"��)pxbç>��������}����Hٿ�$�#��?�n��C��#�l��)��!��M�F;��q��n���v`+�p������g>#��—���l֨ig\oCN�xts'����j��I��
�xa���u`�Րǎ���`Ӳ(�:�X�#�,ӱeNiu�����t��Y�Г��!<Ė�0ĬB�y6�-E�e(R�<ݼ�)(��(C��e2�yr�Ƀ�=��X����E)��%�����s�������Џ0N�y��^�x�'�oX`
U�5�er�Yu@y�ї��	X=���F�}Pa��q���$�q�	�����b�h�6N��sJ�� �H�l��`�K�	��@5��eq<"���K2@X�XI:'��EB�X�	�}�Z`��_^��w�L��6����B|�d�{�d%B �U�^�L�I���
�9ƅ.Bvi������Y��&�����	�[���(������H�M������9t�6�`ػ�)7E�1M٥�0tG����'(L#�;g�Gm;�tR�C��I-�;��n|��H��FqO?��.�{0����n��TؑA҅7��Nf��_��q4j0��|��)�zƫ+w�r;�P�M�B�]EifF���{g͕F��oN��\s�M�7�FJ���f?��!�v|��,(s�I�}����G
���	�c0K9w"Rcj�+P����-h��r/(�1�J�7ܞq:�%im�Ydlq�'��=��
�u�h��{���o�t����~s��{,����prz�нcT��_n��sX�����6|��a��e~�䳓��1@�"�����-^E˝�1����{��I��!rX�g��'��X��d8ⶋ��%}�L.�f��_�&dބ;q�k�PwuU�t�p1S������Iz�|4ͲO�J�� �vFI�I�R>e�P�?Idݤ����*G�|��m%ʒ�ҎΛ8`�(uw�LLbBQ�$��������N@#�/T�t0�u�����w�1o�r�P��U)v�8�RZ�M�1*�
� M����b8�yqM�D=�����F'�'c���6�N��5'/��+�*����?+���s��7�gm��
��w�ۍBCB��,j�)y83$Q��<)֘ai7�m����Z �|v�B7a���c�A��`�>��a���\�|��ꅺ����[�ΤU����,�-m|��9������>�d�����<�aٰ��W�WY��i���:��Ktӈ�!�j��B��tk85m� �}J�PN��q��'�l��9�c���&V@����,��fV��#��	�y�~b��!쀈�
/��!�Q)�vN@���VHDioҶ*
�����0�T�g3Y�e�5Sg؍+�xK�wB���LvZU���仸�60��[ώ�;��rw�z5k�FEC%%Dn�/��@$VQ�e�εa��ۻ&|0V��hw*�N�*��v���dmӝ
�ŀu%t�)���1Ô���H=Q�-��E�/�N�&�&C�)
�ԅ%�	�$'v٬�ڗ������]3��ei�oЮ��G������-G�-޺��ty#	��_�N�?N�I�!k@��%�Q��k�(��ĝ�c�Q��y�y�/[��wqg!�M���KH�z7�s�.֝ ���X>��H�Z�\��;	 �H
�e�̮^C���DZ�����l
ɇ�o(&6ځ�5���~�۱�К�$�Ȋ9�fw܎Ì+{���v|z39=���G��Őt�b�(�I4JY�ǖ4�KA�����H`�N��Hx�/t�3�Ҽ�]�X�r���<[q��N�߉�
�����f�>C`C��K$*�z��偃�G>F֒s�i��߂�Kւ���EW�λ��s�C8^�wԔ��|+�p����ǝ8��<�3{�8�0��;4��M��y��:1!ĥ�&��d��j�Q�zJ�Hؙ|Tz����9D@Ah�٭���^��g���V,�Nkyk+�pg�N8�`��W��*��4�0�)�@iA�r��0��@���xD�X0c�@!Lw�'��
F:;v,�@mH�;��o
j���!T1w��%�Pj`���R�������I(
N�RG�.���s5�3��Ӝ�eOld�W}���'^1�1**��)�HJ�T����ʼndʫ�c�~���O�wd���Ч\���r���஽P��/7m'�^3/���PK�mW�87�l�0 setuptools/_distutils/version.py�Zm��Ƒ���bµ��E�$WRN+�W�E��U.qŎSW��5��hA��KW~�=�= w#�*%�������~y�{./.Ub]UW6u_ߙ��<����%^���LV9u�����CTV6���N�yv�1�ѩm^�jo0��c�ǰ�Γ�~�%J��i��ֲ�5.�U��I����h4����lb��S��V�*MQ��Ah�9pj�gF&��F�{�#F��Sv��R?�Mi��q]� �Uu�+Wc�_��6�7ɵ����O�����<w�]\��B�j�)�I��i�ߓ�,h�[������B�Ό�@z���-��	h]����#d2���ꤥIԯ��2]O��X�	w:�ɀ��o(�u��O:��۲����D�eW6�:����L�<R�-��&!�������suQ��$3� �'�1�/�^��z����pS�^��>3�Q�B�����6q����ʚH��	��jg2S���0���Z��L=�$yp�p��ybD���eb�ZB*>�u��l�ki;�V{e���,�
E��҇�p6�M�d�#*�rc�x���k����
(a�nJf|AƓ��|q!�{K�f�����R��=�^�a��E��E0�P�&��l�^O�N�8�/b�o�p�3l7ֵ�C��2
ǵ��1�V�
�<��kY#�+!R�<�̬#G�t�Q��~H�V5l��3�v���P��8�x��o�߄�t�M��iH�k!������L������ӑ�RE�5�i��S�ͯ�3��Уm��^{�Y���z#�Ѧ'�6�JL�Ǽ�	�jo[��x�1�Q�����\|3`�|&��}Q|;`Ⳉ�[a�&���c`8Q�zvY�� �c��8��͌	��<�φˆi2��}^�<N��z�4�=�5&4�!���Us��
��x0��k#�z��I���̊"�k��T�1�nQ|����hЇ��
=�x�9��	`p�Eiis���Q�1�q��HN�����6:���w�ڟ�
�1g6�O�0�"|*����i�-xB˰0�z~��j��#q�)A�.�
}�=��m3$`�z���<�Q_hð��|�o��^gL<u���Ȏy�l��&���?�74���AWt���c ��n�{�8N	��UN��MW_�.�V��}k�]������n�;�A����sZ��D�Ni$�'y5w�L�\f`+1�\8�	T��3/Mj|F0�� ��7a�D���A}6�>5�X����f�dđ�86�w�72甿fS~�L��)9 �N	����9F�:��G+-�F��`0`CGz�ݑ~�D#~�yaZ�\�E���J�
�ebJF�L侱�|Si���(ӌc�!�il��m[g�z
��"z�=E�A��z�`Ή�����ms~�_E/�o�h>G�U��f���̓&�S>��`��U��h��E�"�<�Z�!Wq�B�Eэ/�ɟ�hwt`w����"���P�-K��b���R{�p���H�mj&�'?'Ϧ��H�äy�����ӛ����Yt? ���?��O?�U�/��77���%a�&ʆp>@A]!9�H�c7��;��!�����AB>�?TE�~?A���?��LlF
ZdF��9|^��|��c���vH}��r�V3�|�^���`��g2���7����৘�a�Ի3���vb1�3�4=R��d10��\�վ�I����b�d ��j� e{!�a�u��p��V�9!����h}�m�r�������i�~,����Ǥ��l��
'@���:���J�{2��N�R/����-��p�;�s)E�7}�2�YL����yӳiL?�y�կ�7�}b�m���?fc�1C��3�n1�8?�7z��7Oqlk��9U�`�����;F�
��
���Ze�ܵ�B_;�5E��A*�y�k��`�בF��W�#�rH�ʓi�nj���G>N��`��Ƶ$�-�ߛïz2!�����T��-�z<��O���{���#7��OP:uD�+�����@�ϐ���}�U<>��亿�))�(���&�,����A�I��:€��}�����a����K��� Y̒2�C^�}w���P�Ш��:��+2��E�~�Yz���'LsF�>��V�*��v��.GB�
�q�^�cTYYM�.�4A�jr%�G�-+ʚ
 �`�|W�bO����u5���.�����(��b��
��/��;�B�.�1T>�w��?�����㐸T�.�P�C6�(�2;n
$��0�Ϡ�rw�y�D����b��h*hS��I/[���5 ;g�	�OoRo��;��N!-��MM%'<
�.с����aQ��$xД����^g�W'I W�iݦ�B���s�"u	�ŁA���97t���QQÀ��P�m�Z} ,���^�i[���re'⣖��=2�;�~i˙;S�+�EE��;�S�נCr�
�]9Er��^׬�s��乃
C�5�L�:-�z<S㍩��|�0������b����Z�R��~�t�PF���V�(�t6qN�봳�\��gDCi�`ıv����6�VP]Rz��y����-�����5�V�L'�K�9�I[� ׎I'�P��j�3
�s�+5mw��d)�����	$��խ1G|R#�Zj(�["wĜ3/��+ynN������vkbp�*P{:. 5�ٷ`�z���(8����Ej��^�!�C�.��e���^D�Œ�C��ɹ�b��)�!b�8(7�!3o#/ۑ�,z�#�+��-8>�/
���d��K�E��ܿ�Vz�=��cՙ��w�ڟC v�	Z
�g���@��{���Ɍ���wyZ˭���PLĸ����%��b�5^������p�
8�;ש�e�s栩�-eF���!��LSh��j%85�PV�������Ȥ9W��D�x��Ь��Wb\�<K�NAb]l�]Q�}^�mM��Ad�wq��x�}��_��l�*#��
{�I��m��&
*�o�nj_�h��,P�;0���=����Wʉ*s��g
]�؈��(Q�K�363'ͽ����t���'����,G[R1br�+��f�$t��32�G�$��w�ޔ{]��.p(��2��}���3��HʑJgGaĥ%P��0��wM��_�+{SC�+v�X�>b�>9���c1�O6*����Vª��[��)��M�62�K17|c�\%pMⱑMl�c�b���,�ꯚ�ߌ��=0o���(��2�������ʪ�6����{*�+�F-�#��ܢ8*�4�r�1�[x����H��2Z^={6�����Q�Tn�����K(��z���ݸ!||䌕�}g����'4�j[^o����$��k���;eS9���dX~�m*��n/�DZ9�LHN~g���Ǝ�cw�P���<f��])�D��eNFkiZ8Ep�
�1wYX"�9��M		�E����	%������%ғ;�E�@T��.��>eJ�K�y�?����3
��g>�i�#5�{LҰ��1��͡<�w����o`T��Pni�1v�(�=�;!�*��k:~=N?���8�^���ܭ>�����ou��9�/J�Ė2������+廝b��g�%�M��͑i�Gf�Bf���?�E�ѠCĄH������M<���}�=#BP�o�M�7zٽ����~��h�
^=���y��e��u�߯�"]���_�/���/waW���ժk���RҳzpL޲�����/6KZY�0������'�i2eTB�~�r�I&#�p���g�Չ��OìA���)��
J�U�4�Nq�{�Մ�s�M�h2[5�^(�F����Z�@g�j�6SW����s4E��uɦ�ڻn�v���ERɨT��g�7X���K����ږ��G47%9���!S��BA����/���l�Kq>�z.z�<i�t��:[~��=��<�e��"�V�v� �֭j8���v-a).~�u{x�I�ʠ�Z����f7��}ީg�}��Nq��<�C�z/�j�~�"OtӚ���
�7�\��G��e{Y�_Ӑ
W��~T8�׎z�d;�x�Im��b�p��1}yѯ��{��?PK�mW2��
)setuptools/_distutils/versionpredicate.py�XKs�6��Wl�dD84Ʋ���R&�ig|h'Ӥ94v%��d6|��l+u�{w�OВ�C����o���~ˣm�a��P����T����s�¯j��F�<���Q*����y�7��"/-��y�bc�6N��g6/�B����h4*��F%q�^c��e��E�h������_������vz)�_�H��Hx��S�}|q!F�������;�
� ��>�������4^@��8Ґ����km�!M�Hb�u�26�^����~>�?���?���f���7�իz!��&��5Dh�(�k`�>a-��b���A�(��v������*ݵ�U���ߡ�ܬV+��3���9�*^W��`��,�H��2��b4�J�����K�[��M
�K֚]f��^���N+�Oh"�a�̷��Em^�T�0���_��'ɧ�@��z�޴�>����3�qh��oA�$�5�ܐ��#�!Ϝ�L��f$���Д�0�u��9S�x>��
�4T菋�.��j�?�ȓ���#��$�g�ɛ7o�du&Ƣ���Z�2S�^����j��]��
f�LyXo���Z	⠲��7:�N{Iz�?{v���0
|A��`94}٭�0���w���m���R�H�z����@}���S`�[����`�>.�Ӄ�(�u���j�%��^��*����A@l���L�L�ml��xƅ�4�f�t�K�,��d��8cۍ�N�M����jǃMì˲��b�X7��ɸ�S�Տ��~��I-��J�a��i5>.����T@�։��)ڈ�
C]�n��l��:�Z�*�${��0���	����3V��A�O��<}���{�$�A���!ʹ��y��pJ9�Y� ���K��-.���2n܊��RLdq*�3Y��糪$����{�%*��6%���P�q;�B�΀�͊f'�R�Sg��=~X�j��;\X���"LE���+
a��0�{�ذ
4&�E@5�DoTr@]0�l�naO�m���+U�d�q��jK/����)�y�'X(��T�N~J����ب%�@�e����.���:hb�L�r�z����}�9��$����;'֮iGr���	����ȞQI����Ч�K{D;��t8�N��Ǣ�N;������t���?4�%dJ��qIb۪(ܣKPȪ���˹܎CS���}��̞�մ��ҳp$�z��j���W1���_N�\B��%�4<_z��`�H�J%z�{�'�����z�Ku2
��#�@Ã�B�q��v���#з�E�:u�!���
l���^1�D{*��
7�Q�bV ڌdM>����8C��	�#n
u�9\�i�n�#
A�6Mwm�D��N�"�Sӆ�1�ֵVqT�'���U�n1�HO+��|�"nkk� v��6��
�é��|�f�ZUwF�D�;��hL�ep}:��^5݊�=9]���� ���h�gR�(�0g~�3�;Rw��*��l]��	&N:���Z����V���\@N2s	0�ϕ��mHʀ�U�k���Bl�9�Ke�V��<Z�N�C�����y@�+` ��I�r>��N�!?���	t<@��^l�|�P9h�ܨ`��5]|�A�ݥ����Eл�ܻ�f���p��s��qi�˖K!޾�A7�E�Ӂ6t�v��G����#�>v��cJ�r
�0�j���f�)���ͤ�H�SA��\���*�'܊8�)����PK�mW;��*)setuptools/_distutils/command/__init__.pym��n� ��~��{ȥ�D�窇ު
�ac�`@쒟�/Il�!p�a{��X�,��V�yFo���G���֏`��h��<�=�s K9����-A���*V��
�7C��l^;�[w�⥉�,M����d�p�iG�+f}��sm���We"4��Um���A�J��*�h,�R��
�)���qR���t�S��H*��X���&b9�D��&�>$�gɅe��Ù��M>Wi����ꪏ U,��3M`|�^�l�-�X�
�.S8ZC��p`I�,v�{~�_PK�mW��n1��&setuptools/_distutils/command/bdist.py�Xmo�6��_qPHZm��Gc��/��A;`�C�-Z�"�)�q���ݑ�^l)5��Cl���sϽRAd�Tu%
�l�~�d����lv�/��2P�8��rZ�y�6����u-�
��B2}\�HL�5�R2N� ��ľT�ef[���?\shVr�OE��J/���2���9�Ҳ`�V�l6��NR��*���B��BVP�P[`Ll]ph$!b:���[@��,��~�@�2�9��=����}�4]���?h��`�N��a�8��	+K.�(
���l��|�n9�;��\ݽYű�Yj^UǴ$��F�=;���1��~�;^�Q�����,�}�)�1\�z͞�q����@���\��݁�Y�S�9�x�by�f�_�s�p�����?T�z5�T
�����B���CM�k�B
΅d{wj9y�b Y�@�_�#�k�;��(8-&�D��.�%\�8��A~D�$JL�1�c��1phd�iax�Tʳx���ג�M��9	)�
��s5E�]K
mYM�2��\���+<� hnE)"���jG_)E��"�U�"y�ߞ�Bн��z��O$�";�Î�.TL��b:
6��X�l�<CE�U]ZT�$�$��N�Z��^+Up&���\#Eu�/�*�BZj��9wt@�k�R�������6ǿ��v�[�B�
_�!S U���S!kʿ�隊kʤC�Fc�є�T��pwG	%Ê�c&�
Q�pE��s0�h'b����ۏ��E�q��y�ׂ��s��
����{��_��!I�9�.d���#��/IS��3���TF<�K�'��@�PV$�$��o�;S!��fl5[�
��3L�e��X�9��'���%�Ńm�y�_��s�!D�
����Ə�a�pZ"x�t�C��ƀY���Fg���a{��X�6-[Y��&AN)|:N�XO�X��o/��8����B�3H��1�ii��i�`��mgC���٪�����7ueKmfE��sf����qs�5�z�����heԶ����L<��WT+��42����4J?�!��
C���p�Ǝ�v���n>_s�=�H�>���_�l��e��_i
���3f��{�Ә���5+�5��e&�ۭb{��h:}9p��Z�9���P7���hpl�oW�Ɛm�q'?��ѷ�/�G}G��kہi���US�{��k�m��<�vUj�Ƭ9Z�{앻�|G�EI�G����
�6I|�^�zŪ�}	W݆���4Q&)Y�K�TBFݮK
K��|��x�:6�
��KSk��7d��\�N��9)>#G��q"�z�Z���1�
&h��0L7o�?��;�럫�L�ޫ��&ڭt4AV���^��pFi���.S)8h���+C��Ɔ����R��vZ��+��+?������i��s؉�L�^�3́���N�}�!��z������U�W��go^����O��:�B>`�eyxeB����g޵*�Q
9ΐ4��k@���1�9��"�7����f��Z�y��F��(�+��ai�W3d���O��Ӂ$�ܙI;c�m ��/�<C��E]$�����41�ى��Dz}
��d��]��
��ާ�l�-`B�����va�9��L�96l"�X�D�=�%.�^��
�zx0�7�p�WM-
�<���ۭIZ�y]��|�\MCR:-~s^)�đ��PK�mW�wq1+setuptools/_distutils/command/bdist_dumb.py�XK��6��W��l�Iv{ ��-����>;0��N�c[�$�L��/)[~�ik`&vHJ$���03ilceavGU���v�*͚���u�%Vր=#��!�"�,!>jA@Ȃ�,l��Z�PU�݂��n�cAT ��,?#X�����3��PûZc.�@����1m��]�A �Zi��V%�C���ֹ�
��*'�i]�+]�2�ӱ��R}��j�
`e��F2�涨���[~7��9�*���{VU���t�L�b�NAp,�10�w�&�Ateh�Z�.�{{l>:p>v����l�T9KC�Oq���r��6e���-��";(��x���(��6��ɱh�cr}�8b@��(�mY�n��eay �Ȋ�Y���3�e�,6��g������`�&���U/Y,�s1_u�S�Uf;0b+�N_�ǡ�xk?�m�_d������2��˪[���
6����XQ0��1Lp�MEu"�T�!|���*����]��W�(yuc	�JWL%r�S�E�[6���OU��~�H��T90�z���ۘ�l�p��3R9����;�ϖn/�AO���~�ja�8����W*��f5��N[Q�2x=c5�"�+�5o�w��hM�k*��^��j����կ��u�rۮ��ܶÃR�j��%6�Հ����nϴ��=�C�L�=R�\�kD�e-*���#�K+E!��w*6X���!?��\jڔ�7�rwK]2�I{o�"�=��I�a*��!�)mi~M�}��c�U����q��Frd>Ϗ4n��	�� ��nG��_<K���;�d7L�Y`�̎�y�I�*���<�O;4��i��q��)�-6>����ߎX[�/���\WiFs���	��5���"/�z�3�
 �{����0�E�J�?>��HFik�F`�I�X�
X�7���As���_�a���?�k>���1�S�T�Mu�ݕ��{\R�lGn�Q��<{4��No�)���<5͡���|��V��c_�I��űP~������=M�;Y�*;=7�(f�f�}2kC��Fy�~���/8~{��g�T�|?�\�v�N���]o̮%z�X_(mGj��u��?
�u��/�К��I��,�M���ggJBo{�H��ԎV����0)�ٴTYS��෾y䱧��ѵ�o�0���ò$�ZM�(�	��Yk|<�Ы�z�s�����3w���g��q�0k+�4�jn��Ր�dz�,@�k��W=�wy��}=�I���ؽȿ z2Ji�/���:��8��8w.Ԏ��,�i��0M��☂S_��(��qr�Ǧ��.�r �p�r��N�5R��ǿ#m���md���K��S���u�跜9� ӗ���6��C�PK�mWo�Y��"��*setuptools/_distutils/command/bdist_msi.py�=iw�8���+0��X�5:l�I�{�����I���t�_��G��ıDjH��t�o��?�u �C������ĢH�P�U��[�$^<$�d���IS�:���=��$#qG����]�>��‘�R�,o���2
d"|eI8\fq"�'��sem�p=�b�i6��0J31��s?
�"�2�"CB+N�'��=9�/f*�4OC
�M����E�d"N�U�`.��M�'�$����Y�ʼn��	C+	�d�W�X"��dнbQhpG�p��Nd6X<d�8��$
�XE����~���2I�$�E_�o>Ň�6ބ����q2/��Ef�D�;�\��u�t4�s�%R����F�%2y�U�|&r���g�ϖ	�}��JK�A0���d4��T�}�'
�j>"�|�߂K݅��lރ���x�=)���~F�ŋ^DP2Y�d�"X��:-�)��(}�7�i���#:4k&�?�=@�a����N�fr��Q��G �b0q��F*g��O&)|}us�:�t��Gy�f�9��o	��]KL�0��Y����8LҬe�@��rf�m)��d)�+�pk�*䚦QH	|؞�]�?0φ�0���~�+*��~��<�
���
���	�%����[���s���B���?�HK�JxoIaއ��cIfa$�z����k��Q	 a��İ�觺M�67��|@2�b�w�\�ڞ՝2��3����p&?�F>|��?J~v��E�6� �-NF��=�#�E<���X��]#���.��.�߃?H��~����P�O����v�mE��D(�6��&`/���xM��,��]W���5
)��*:��Id�Z��q��Sk@
,x����"N���8$��E$n?1@.%����4���CyK#(�JV$�~&[S@����Rc��}`W������5��y�\�Ob�b�N��T����x��{*Zb�n>U�0�� [�U<<�k�Ȁ���_��~g���lğ��x�ֲ�"g̿����{�yȀN�+����//��G���|c|�<��"�iN"�ßD;J��W�>�X�w_!���6+��/2�]D4�?$W<JGIH���(�P��Q��8�p�\C�m��*�s�ɠ����L1C	��ءvw!X8�i��8�U�2�=��3\���!�c�j�Y
����.�
��Y��5��~��|����H&� p2g�«��P��s��6ї�#�F��)��kD�I,F}_�rĻ!s�'�a�%�$�HS��X䉯k����^��7�ٮ
��q2�X2�.�(�#���P�q�@���HT�W�*� �]����ZR��b����h/���5��vQ���?���
Ǣ�!�Z	{r����8-T�$";�\�,s�����ބ�]���
,6����IL@*�z�J�_(2��U��Q��l���#�����8��ձ�`��e�U��S0�1�Ii?Xa���8�ϖ�M�c	#�8�lv�/c��Cߏ�h��QF=hq=�aN��$4��:4h�
��'�q<�~d����T�*-�FE[U��;�]�{������>���G�\‿���!=������Z�[�sk����Z�[�sk}n��}�j���A�v~��=���.�r!�F3ς��L)�l�E�+��?
$H���4�PIp�B��:�x
:�9�^5�k!�?�i�T��W��Y �{�T��T�8H�;��Mʾ`�����S�*�(?E���B�"�,�m�W��].�
�.#�ԊiE�ceJ�+)���,E���
4��cB
}�d9��)ɾ#>�2=�ؿ���� ��R�N��
�1
:��$�x%ں�f;��)�O��~6m�=�F^	�ٱM�qb3��o4�^5�W�CS�
)ж�=�����y,��7��ˈ�$�A�LT�|@��V�����O��n؝�E�`�z��B���lI� Us�:˥�0��tq�4��`@ѕ�Asgw��j͠`a�eJC��!2�@�� �j�BQ�<�|>G��8h�zūl�����n��/�T�X��̏ͪW�~�\�dz�=��J~��
���PO��*�Z�z�
pU�??K��[
\�H��
~�,��"��IY�O<"`���t�H6��5�>xZ� �U=,��7�4
�{\x�MP�RA]kL�Q�b07���DZ~���
����A����Q�Y�R<�5L3Ɣ�9�{�'���©��S������o�;��8���#
G�	�-P���Q.�Um���#������1�ޖ8#���(�wh�[���v_�}'W�(����i��e�sZ0���;JS��b*L/E)X��x�0:�`����J4�I|�K(@ݴ]�wg���U;⟎�3��B�hܙ��0��,�iC0��*�)�郿�RrfTF��H痸M�i�j�E�쏔��*b�_�?MeRRsL���P���3����M��hVX��;�A{;�A#����q��y�uxhhӃ;����Nwy���BCM���u��2R�z�\Њ����M�_��A� �.t�2�8ݎdi���$�kl\����lX������SQ�C%�a��DުU3���6�8���u��F������1o�]��:�'�78Y��y5��O�l~��N��h���TlZ6�$�@�DT��X8��L
]EuM��n'��E�=�K>���xtSb��e��"��뇦��É�����N�໮�(ם� 0�_>�����oo�_��$����
{l}��Pf�=�A����&Z�%\Z5~��G3�ҟ�m"�3�!��rA���Ȟ�?�JΒ���E�)F$�YQ�^�\P�jܺo?�y0[��&Cp]���0���널���8v/i��.�;I�y*�o/�rl�.��Z�ժ�d�6�.��(kR�î�L`��[h�yyY�<K����D-�>�d��f[�DF��2[[���^����ʸ��&[Se������0�pTs�Q(AY�Z>��ᬬ��jV����f-�(�|��}�{`�lxǗoO�\\�\ðDś�p�f��Z@�._�_��9~��B���@�j�x�E�9�v��z���C��<V�2Py�F��19��*�z��w�a'�ì�F��|��FI�tV���)���s�;&��Ӫ���w�;�ՠ�9
����-����dq��|=ki����G�0��R�9�1g`b�`hn�|K�O�_4hb��[+��8��4�r���Sʛ�
�$hMM:i��__������1D#	����G�U%(�8y�թ�ѫIڃ��m�בծ���1��cYk��ਐ��Z%�	�O��ޑ�o�Xd([�f�s�\WS`)�ŠŠ��2���a���'�##g1O��c����h2{�u�M�XF�$r�:���OUg�v�nF� .Ϊ�	յ���-,�2̒ad��4�\ $R�<���|�iZ�Ya�R)�9��G�z�
��*\�(�Pԍ
輦���e�p��Y{/�R��C�`0�u�MC<[f�&��9��D1v�.7I��=�0�	ZMKD?Lb�w�~V��5�o䀞5��6�F	�j��?���b�i���	����J�tu�j���3_`����4���'��L"U �AL�|�#��z�q� �MǸ ӫ��,*��@5?�DQc[c5�T�X��hm��vMvw}]�<>Y]��^�l��/�� �F�T�O}�z���v�	SH��j��O�]+K�L��r1q�,�E�k��M-l�"�B���aIk�S��[W�E@x3�����-�V�n4�8��|I�]���-)7*��	#��u�����o����E��������?�\�������݅���V��i'Q�0J[��i�Z^ݸ�N*�(�����r��8�����p�A����Ǐ̂�����L";r���宕\5W��r��������ӏL!�u'��v�Q-I}��w�@��� =<
[u���7�-\u��ʲ:b�6���_(O�[W|s^�;�|��jۨ��TU�ʟ�W�V��ӽ(��%�nw�JaH�a�0:�+[�-�=,�s,_����5ܹ��~�gK�����aV�O���{��YiXu�5A�w)'�����aIbK�Z��k����Mx7�`��\[�`V+p=^,�$.�]�*�e��jܸ�FsLN�iϏI��"����ݯ{�½ ��J���_�S�2L��`s�]
3פ�V
��B�1�5��TCP��oW*Ӷ1i]��	ߌx���-���W��ڎ�;���8
•��(h/�w��Z
vQUn0z�8�	Tz����t\�Lg��+ֺ��]88�t�u>�F�j]��o.��.~6��x�޲1�\�ftl{Q-�U�ģ�A5:ޟY��ӣ�r���T�`�&��<��pJ/�)����e�;nJ�D�y0�q����Ы���^�R"�՟���
I<�\ݒ;���J#��^���3�7��	�b�[$z�@{�g�KY
4�-�Ը���S��$��C��v�%ˁھ��e�S�3m�[+dJ�3�B)��L&�8��FlwL3�x0�{<ǭ]Q(�sqd��mw���������@��^�Z�+'��wI��ƎF�cD�~������)�Ŧj�`��5��,h��Fs��6�U�3Z�D*���T�7R�,��W�lŖ{8-`���K�}�g�6J��޻�����/w�Z�M��b<̰��x�o��1n�[�I����?�+�-���%�R��<����"�WD���._U�7���.(g2彽V���݀�Io��!v���ʻs�����Y�Ԁ)e��Ajb��)[�Y�gXߝ��Q&L�ry�S��r6���j�X�@i�"���6�4gE?g�j�(Q�$�v�\�,5
��}Y0|�ij���YE0���C��T�u��Ρ���|�5Cυ�3t�DQ{ҥ��(9}.�_�j�wu�������p4�<.��W���,�B��-�ky�1ݯq�߫�S�JX����X֟�s��i߹SC$U��pk�ࡋ�al����;ǁ u��SE�U�/e�̭
h���k�v)	J�M�&h)�Q��&ޥ�nU�X�.���� R���Y|�
׿p*�@��T
�-��Mp�s
7
���9/�]h�c���	�h����`|�>��������:�SՂ��Y����;.�jVnA)�S0�c7g��)N�,�Dt���Rw)-��(��J�^5�Z�p�����tŸa�N�B���\:�����~l�V
�F���KѸ<�z��T���e\)a*�&!T��*a�0��
��i5@���kɀ���y�����aÈ�e���j�w�5uޝ��t�K)�2�F?	�)J`����?-�"}
�fK�_��:<2'���=��%��\{u�睅Q�N�i����j���*�0��2
$V'�$ݳ�:H�V���͉-�burO~>O鴥R>�e~�EW��T�u��\������V��:#����H��sm!~�E��/B���22.n���^�a�n����0NR��Lb�5qG�5���Ɵ���\*v�����!���[��Y8���E��ܷ2IO�mFG���cI�a��Q�Q�NE�,
,�ڲWQ�
((�֘�K�M��T��Oy�H��U�(%ȫ=J,�e(ttC�����>ʰ��BcrT~�@�u ߑpU#B��S�&'����j��ƣ�Į�(Mq�.
���^�����FR�*[V~kW��Ѯx2�4�<z�{�u@��M�%�/�/�ʪ�&����>kom��I�x��!�_��.uV���$-f�*.�Q�g�,uv�@�+�<�3��z�h�a�vt�Q
�
H��v\Q&���5��]�s�Ɖ��:>��h��n���Vkи�c��I����r��&���l�Qp��H�`�K�yWc7|ࡄ��8�ũ�q�/
xc��8�˃"�ZKYg �bU4*
f��ou�n�{������B��T����* 	�Z�	�mߋgé�!�|ʼn4�C��Ϊ��m�h�!���`��)��l}R=`�|w5pS��LJP����i���X`r�����)��y0O^>�#��X�7���u*-�ӭ-x�����&l�
���`�q��f�k��bd�FVI�1��vY�³����`�Y���:F������������~o�wx��(x��v8�W�d��]x�.(��^`�w��Z�`FPb̟�Voυ��L���٘Q�z�\���8��A�B��x���X{�!�R�@�{��U~5�f�A���?s`��YJ��y	0�:0�	Y
�l,~c�诳x�τ�K	��"��r;ƃ�kP�,������aև�֙���	��Yh��A�9z�����
��;���!^
܁M���׽�G�����X�
CANw����[�n��V�G� 7b�=2U=)�n�P��!bD�_��ȵ!�S���~ȉ�QL�0�E��d���}�5��aЩ{۪�j�2i�[�&�aw��g���B,�g�e2��t��f9p�T�r���pN��+ݝn�B�ӂ�n$z��<�
{�:��b=%�����\dJ�Y�M��.z�$P!A��zӖ�����xm4o_{���ɓ}�
�Z�e�Q̦I��LK�C���H���(��]
�s$�#�{�̆6���v����3(�mGN��.�v���F_���5	���hQ�M)Ŧ�!�aTކ-:go�:���\�m��B���ѳ��嚖ǿ���9A�P���NȦ�2[��N0+'��f����4�%���s�zQع=�[ө��0�KF����PmX���t� �Nq���3���>Kl{�9e���ZQ�CX#M�]%�$���e�`V�~ª�Fl�I�@���š�������[xk�2?��O���&��_��<\��:=�>}I������*.z"��V�%.Z����UQ�W�rZke�������k��4��<�&��U��B�
�1��ᆪ� ����"GI*�Vo�&9rg��x�$?���yV�J��E_����*J��z��\@��t%Iq��-:~$�x���)/GFz5?ʞZ�S�SM��i|���/��$P��v5���.���R^-�����< ]�!^-���Fd-7�.ek��%�3�8�Uɹ�bhE�حx�7��z���y��,	u�b�K+V�*۫�/�l0_"ԤE9.L~ٝD��^��0��Ek�����u�0�����T	�o��S�
��;�N��eD���y�a�[?��D����>��B:Y�t,I	��#�|�IB��PMc�������Zꬱ1�Fv&��F�$@�/tw<�؅2���<��^U��c�~ $�$�BQwx���i��Y�׫6����_~~��l!>�&��ʕ����~U��'��3�K�<;�' ��u�&�P�򵓔d�&]�����;�ga\J\$��$F�ˢ�Aܔb��N{��e���T����ηa�,����.�ВO�w�Nr���0�;�Y�9�1yD��8?���ӯR��FMj��hHX�k��XG�}Z��T^���P���W�p���^��d7�v��v0Z&�͍7Q���U
�
�4!����D�+*-`>��L����^�5̏�Ą���aE�%�:3��^��h���s�������nީ;�V^�[��댿l�w���ޑR]�"l#���)7]Dg�]�:pW�u�,7��"�0�$�\t��]���O�#���Yô��"A! �buB��	�"���T9�<x�A;hG뾲�hn��c��ʼ���*`�	�\�f���$��[��&��JK���Zb''�u���+�fP�_9ru���$[fg��^#��������\����חQN��vE^����8��^NJ4׭
��x?�mJ�\���7ͦ��:[5w�>7n���h׿��x�����	����]����e���������)E��<wg�
`���S���>��p�0�nM~V��R���-�{[���U�pu煟x���Oj�g�d���|�*2�+�+=��+��66���2P���*Uce�֫Y;��m�e�^6>	m���2RN�)L�K�r���0�����h�+�����x�"�y���j�${��L�v)
?]�d�G������K��W����:��q����.ΖrSN�~4Q/q��1�����ZxU_m
���C?Z���6�K��2%m=`:��6)f~�k�>�ޫ��=�7w������Oo,X�	�Sm[�?�����S��#]�u�*�ވJ���9�/��+i`d�hF����	;4�330L�cD1�0��L�D��q�<=������1��k;�ЂN�W9�.ѹ0�*�	ăU��lV�=����!���z��jȜSJhs�l�+9�57���7?�n�2��*�(�J�e���ۄgXz
��~%�E��=�e��\������vO�9������Au�V�Ƿ�ٺߩ�&�.�W�`��-��CT7v�𘍚����vR�^����|\�i�%
�>���$	)�3��!�ټ℞U�o�w#�W,l����|���y�B���G���e�@��2Rk�Լ�%?u(?tȴ��W�w�<�oPK�mWd]�v!T*setuptools/_distutils/command/bdist_rpm.py�<ks�8��+�\�������eg6{��$�s�XIS$Çm%��~�
�@������L6��F���d2Y&U��IZ��|����|��²���)��X��쭂e^�19��qɣ����Y�7e�>^$YT��L0<Ϫ�|2�$�"/kV5���c^U3V��:X���鼕�I�7��
��f�`����7b��<į
�Lj�c��e^V
����l���ּ�]�ɳ�����|}p�QU�V�������gɫ�L
�{�&R�QF���8�M��0'�
|�����2��⯼;�3>k߲	>�%��ܱU^2"�dk�h��6�U��LC
�?1L�b����&E����p]LX�-y�&� �&�w�m��-8�
'��/	1
����}��[z:kW@�hj��L	*,Tf��ϑ�z�bA�y��,�B\")�z�$��Լ,J���MT.�8_r$�[��hr#�vB�.&��6�\tt����)��Iܔ%lw��\L&MZ�88�Ǭ�k���z�Q$
al`	M���
���〽,�%�x��Ȧ�y�d����JS�Zɛ�k�@��1�Mۖ�Q�������F �<Vz*��uS0a f��2Η��ֹC���a7@,���������Ik�&s�>�d�#���P_�h
V���M�$��M�#I�q@����zƢ4�Yo��E0gV�.V%�r
A�,OR�\�C9�4����J�Am���#9D�$Ys;5V'}�I�
��Ps����dy�������I�%~d��u�7��*�,y\���m��y�^��I�(�x��\Z֘�|���k�5�/����$J�F��΁�<[�����x����9�����_����W��Fv�F̐z7�m6��>j@�JF�U��0����޷�E7���������#���Y��y��p�NACPi���k-��_S�H�T���0--M�7Q�}Xͭ0�%��-)E�3q�5l~�t⨈I�Ը7$ �{;����m-�ڀ�ݏN�A�1X��~|bw+xv�ԛ��,��3f�����U��?ݏu��V��r��v����˜��­�oA��(�
��M�j�Pd��@��L�cRbl�.�f�31A�i,\q^5�q]�D"5X8,�XTR!�6��F�����p^��8ƫ��U�+�|[��$��ᇳOồ׿}�&.��@���#$�� �(�`o!�e/�~�����%���%�١O�m�=��z1�����%��M�_Uv`��@_�-;�T;ʊlte�X_�ص>
,�C	/�;;?>c�=جV��k?����ߟ��`N!���ӽ(��?�>9��L$����T����%d���*�ϧ���i��;�}���,ӛ��קw"q
��j����|���v�!Z�I`��-D�qR��ũ�!|�Ij��M�������;�h��e�ٙtY�$~���a���k<�#4�5hj�� ��s\C��b�5��-sǑ�1����$��5X�k�T��w�1�'���9rr���#}*?T%
"��(M�q%���jz�b�?eՐ
?�h��׀{�%
'�|)j�W��6y��(�4�Vd��~2E�/�����lJ����5���^���-H���K�ǡ�D\oۤ��r��χ�9����4�c dx����6CI��8 h=�0�=  ��"	����e���"h����q
�8��g�큛lFH&@��l�ː"�ޫ,��$�ֶG'�q�,�|;m�x�Y���
x��e)J�`��7�bhƵ���S����l�bGKBa
`J��O%�v��X:ƣ	��Lvy#��2gA�
��E|/���6�y5Ǻ�<�|���Ao����2�	���Us~�㦎)7�yZ9�e��]��������'����AWt�w*pn���l���iS��W�VKv l��^1�Z�[o��3H�al_2��� j��]�{�R��q��%�B�d�Մ*��j�;M���)�#i�QF�B�~9��^�'D��}]�����]N]`�)Ƙ�>�vC�s�$C~[���[�ӣ��q�:�f�5.*�+�]3,Rm���<�#�0t������8�l-+�@�]n�LG��c8��=��χ�/�^~_�x�
ު��ڟ�"2>��B���ԟ�R��Wq�7b��"L򌽑T�س��f45c8�R��`�.�d�}���ߏq�ŷy}[{Ӿy���2���/�Li[H���t����	O�̣+�
��dt�
�|�r�`՛2:��БQB�0�c�R/�����ƪ���3H=�Q���Y��X6Lwñ.=W42l_�&�?(T�W�އ�Xy@;X=n�l��{��xz/�[����Z�}'�mp}7�:��?���O�C`���yi�d5_�����"�8�O���U<��PI]EMY��a��}�D\�H'|
��	���`�T�[�PX��.@ٲu�:���m�J#�b�TRp�6ɸ��s�eD����]Z�i�l2���� �*���'����:z/{d��r�ʸ'3=w�v�VO��ZN���G���R\V��P�&�ν8�-�X�>��pӏ��W�|5�c��c�$p~���K�"?~�|��#�ȏg�o����k��.�����,/���J{fl9��g���E�H6/u�l[1�95Ah��z({O�,�ڜ���(g>2�1h��A����5��P[�=]��,��H0^sGYdL{��k��Z�h�-�C�狪,"z���e^��i�ߑ�v�v��|�F�W`�M�3[fF�n����C^!��-�*�N�ɢ�G$QJg���Eא!�Z��\_���/G��P|��K�Une�Dc�p����imx��HT����.G�s��#�k�a��f��d�9�*�$��t�p-��/�.-��֕��bV(�6ӆ;tW�W���a�l�
�$��pE�$� /!�� �� �cVA<�怸>�
�:5j���c78V�q@O(Q��vI��	L���ժ@�C��$[�s��=�XUR�=��
AZA��Lo�3�#�7IX��~C/j�Bu���>ԫX���:P.!0n��nA\)h������䧭��e�="	(����j��F��3m��Y|����-��f��	��Ov4v���zΛZ��b$H5t�,�y��\��ێ�
[,w$@	�4�f?���b �z�q�]�2��r��wd�Gp�]���W�����|Uc5
Fh��&sx�+�Af�QwЀ-叧����W��rۖX
f�WH����f�*]d��n
	~LG!h�tFfN��"B�V�'ʝ���ڻrS:�?�&UaGĤ����l��Oe㰤�{�l4��$��������_��fjnE��b�4�����e�C2�S��{ч��6G��e�1��J��"%D-[�hE�餫%h'$��qT�"Y��5;��X�ݲ�NuT7��w��-l$E0{}�1��X�.JRѩ'#�#Y�.yQJ���ꩶk�2C��7�/͒i��2.L�
�]{�O����Կ���%>�QxQ��l�Z��%	@,��ot!�f�3m�5ێ�v(/�e\GP33)�Q% g����8�����v_�25�>k������	�
�ɸ�2}߻����%r�[rdן�MȱDwY�vNwZ��Y��Q�0���խ[����s�E�J��gڨkFs4�LtTs{�#:
+��*c���7u#�|
��y���K"�����ˢ.�]�"|����KлM�:--�`5�TD��2KDZ���P��N���X�b��L���֤��/�(��z3/�P6��kp6�=��R�@-�`/V��}��5�OìhEm����\�ʼ��-����駗��>Z�86�PLL=x����!I��
���y|�ߌ��e��0��'���;Eq5ľc��ۋ��:�墩��bO~���{�:F���ӳ�V�#V@(�a��I��(,
��01�Ū��eX�H�o7��Gq�"�*�BL��ɭU��̛
�
>�0%�u./�^Z��l,���Vu<�7U
��eSTD��d|��<���==��oM�]
����^���b-�ĥL9�����:+�Jn�rWS<�����s���de& �,V���(}�j����uq���YW2���iRU
���9��J����V��o��F��ᥠ3 �j�h]�s�f����]Z�!�񎨺t�eB�@�
����FހVw�r�H�Z�+�uݲ5��;#�}��4W�a5=��	_�C�1��"0]�qWǂ�����|p"q۸�!�8�W	�
r.�6���ݛ]� wM|�H��@�Gא�`+����VdBeΉ�i_}:�Ɂ��|�Î��p�&d$tL�ix`D��L���rƲ�Z;���{j���_f�n���
����y��ŷ�E�����wM8Ib��J{�T��o�j�
���W����y������@����P@���jwV�Y�%T}�c��iw�j���\0#�PX#����9mI��#��������G���x�4�<y�c���;S�C���}�\�B�i��A>���C �����45��R�4�y���ҟ��-Z�v�6���ת�~�h�G�tj�)�r���w	�.T�A���۫M��S�|����}��3,��tl�BG���δ��[m��P�j�h���	�����x@خ���k��>�c5�^&�:9pw��(�0��{vko�C-K��
��<[����Y
ErF��h0���!���tk���B�Ӫ]VG�t��yz�$������AW�p�s:s�B��\۸����!a����_��9`MQc�h_O�C�5]K�u�Wh��m!�eHmXa,.uL��kqY���̻j��g���Ct���$n�2��3�2���M���xv-�_M�˸�<!������sP
l��߂�W�:v:HZ��c�mRAh���G�#E�v���;v�&/Pu��8�{���B��u�D]l���"]|�~SHÅ����T�R�!H*(�����3���v;׬�L��������
��^��)<����̥ �-������'��im;�D��Y'��~Q<=�Fg�7�d���
Jec�k�{Kg�B�F��Ic���t�ƉC`et�⥒-���gU4���&Tq�7�$�v��!sj�7;P��6��۵��`��fj�ҌG}��gc����)�bCQ��{�2Hx)~�b&#zz�T�+zO��ꫣ�l#~\&~����~�UFb=�V�O��Ѵ):�A��=:v�hg�9�]�Qq{�KU�>}�ɜ�PF0j�t�+��*N���G5M�b��r��iI��B�gj]��_�}W,���Af��@�v�!T��x��=[cz(;m�I;@;�q^*�u��Syy�~	��A�f׸Փ�w�}�c���I�۷�ˌ߄�5	��B/� VOm��l�,G���%�x�x��b0�Ay3y�H1u��^���O�,\����1�m�ҔY]FI��6+e��[�
����N��BDajv �� z�j�?PK�mWd-�E�>.setuptools/_distutils/command/bdist_wininst.py�[[s�6�~��@��"5#q<�dw}�:�Lf��js�L�ɩ�)DBc���=ʯ��@��v�V�,�F�/_wCQ�nڦ�t����E�Ư���.kݜ���*�u�Y��;7�����W,W�7�q�
y�>�U%ԙ�,V%����(����A��I�>�c��+ ��g%��gT	fǼ6���_7d+��P�f#�~8�(U�Ub/oE�(!�C�RRi7���1��zSn�e��N�٭P���`�X���Y^q�Y ���mquv��U����%v�"'嚁P���J�f�[��;��AdH�Z�L	
4>$�W ��x�~��X��+jr��6�D�H��kpJ�HL���Ӥ�cU�5�C<��;4�cY#�دE{��B���)+��5�f�$���j�؅^D�"Їd1�������e���Z��\��tL�G�+����%bOg�
��V���
6��jv�I*����SD^nʜ=e��<����VA@�|�reY�p��BQ波,$�e��X��x���uQ�埴�|�’%�B��հ�1�\\���Y�rh��WlݖU�����e��Zk=����� ���?	^0����:�;����w�zY6�1�fvm�KÞ�*����<����V=���)+Wq�=�@p�4�O��.�cB���YC�[���_�r�2��>K\sM���
3��L��s3t����Zl0D�p�+�z�l�����
܇�q#|̽�g�}^��O�|�2�ˮԎ\-`!4�5�!�#��0��p��\h
��n���۷q�G�,�c�~��5�A��PYVO-�gV5�k9ˡ����F��hxH��8?��ɝ8�.gEXU�5�q���yuǏ�Y�3b�dp�Z�J�ڇa����Snv�?�|s�����A��_��՗W!�a6Di�_皉:�d���㷼��t,�!zY[��
�u�p�i!���_��MmX��zM�%ZT�%{�>yrs��q4�Ji7�֍rX5�In�"c�\�����.�\�c~��}9w�,�C�$wBT,1o�|+��9�hN���e�t�N��'	�Z	��p:@2�����B��$|����
L=E}�P���e����Q�̅�C������L2q���(5��:#��|l�7�NlRlJdF�ݸ�̺+7�?G	���!A40X�H�
�]�����*�/�T��Fv�t�<9�)�
s5R�s�v��p0� ��^��$kJ�E!�1�9�j�
`�䏈�Xܑ��yk	 j�x�����V�1��u�P.ԤV���3��Ét1M"��PS�˽q&�Q����M[�1焐�-��:�)��i?!�3r�,ov����~h�+
�Zc�bd�W�UFEӔ��+8��0�ˢ��,�� jx�s�d1�����C�	����+?�Q���C2,Npk�6t��E��j�ވ}�#nj#`�VƲɡ(0gN����+�r�4"��I�P)�r�g��hro�K�<h���wx��۬_�:�M�L�ub�8��M�%�y���Z	~<���A��:&���t�n\�!���z���a��A;��`���%dnzN�U�ZqU��@��dY#�MZ\�(�9!0�LԚ08���~ͺu�w F�b-x*s���̉*�qĽ��p�p^l00�#cN΅%<$�Ͳ�����L�k�P_?_��J�.�v�f4*@^�}�#,���r��D �E-x�fq����$��t�kʎ�Wm!��r��Sk�S����zL0$�u'(�"�Ԗ��\�×mԀ ��,t$��W�@��2����1��X�DN�-�*���
0��I��C~�o�����d#T�"O���F��F6�㷢â@}@��"$b�%�I\�@j
G�u(�ltW�5s$d��R��C��av|�P����א_����v�i"PRY��
ɠ�p�#�"�(b�X!���W/>����@k��������,b��1�!]��F��^ц��{L(�!pýb�	��`��7=g�j,��mr�s'�}A�O�q�  Ձ\k��t.X>j��(�&�)�{�	�2�9���۫�s#�� �"�ُ;8~�6��&���
�^�W-:# ��*���0�+�#bޟ���[�3����l����Q����t>��E�z�S�m�:�8�C6,lG�A��4��z%L�S緲,\
	�AE_˶;M��,k�{=9�u�]G��=�_ �CO.��b��C��ן���a��t[�(D��p����7��������UҨ-�5�{r�����<}�v*V��(\7u��tc�YWj��#<uܴU�G�QN�xs��?��ٵ���D�tgks���'p=�Q�,�:���sa�e�@�'�SnWNy���i�_���s�q�O�y}��
\�P*�\��dpa��{��f}���N����b���3��-I�9�{�D4�Ϊ��̜�����Ƀ��I�h�w��Ab��gYx���Q4���z��ۇ)�9�Y4��>���N}��mܖ��B�ઉ��ٹ��/y�����{�	��+9����Q�qc��qWD��Gs� h?�r8A������A������97������6�t@����u�F���؋+�7�ܞ��0A�=�L�A��s�Dkг�#�y��oj�5���V�0�){^V���0�_��jλyCz*�����u�>��[��ڈ�$�d֧F#@��'�(F�����BV�UĺW�� ޲��,�Nܸ�b1.�Jx��-�5�&{g�*7`���i�W�,0[� ��i���o�,>���*��៪e�T‘v�����igY��7���a���T&;8�"�Gȥ�'(�!���N%T�˹�9�����D���B��&{��Z\^��D�-�͏�h�+_�������uL�e-9��.�\h�Pw�W'�9!{��H�`�%��E�����n����b�.�Z����\=<fz���^���_���$��͠���A�=
p��䛭o�?��*>�����m�Ѧ��f����o��t�$�����:Z0��f����G���b�u��<�:��O`S�W\��L�9&AP�n|��!�I:��d�cC��aL��ʀ���A	鵬o��㎞R��.sYP��u^�K(���v��i�,Q�&z
�~�O�!�DH?1�
���<�_A�-����!�����ѐٙ��T�}_o���Sdw KS�N��$����6l1b��3�U#����ap�z1
vK�W ������庚�n'�J�q�W�������4�e��7R�99��<˜��qu'��_+��|�t���,�;T�2��x���-;Vϊ찑�"$��|[�n�k�����/^���}��]��ET�*��*Oԇ��=�3���U�f�d��$fs��{3e@G|>`�;eX���"d�u�����}{��^�������B�%�j3>3Z�*G�C��'`�>�[S�C͡��⭥$��,��DzQ/{����y��݉.�<�n�U��^��w+��!�Y6�3�^j�9}3b	����S�Σ��(��l�7���g���XC�bK
*�)��T,,�k���ߦz">�Q�P��հ�4s}9$�@F�
އ�zh؉p�����Ҍ+�]Y��"��9q8�;��ǔ��A���kL����uvk�.F�7�'��댊Jo��p�[����y�5�v�A���ފ�+�;Q�}����LBBOPm���jɶRze�	`�h`t��َhay��.��e5��`�h6l.�a���X.�N�M-�*Ql�J���x��Ï���b?Y �
FQ��z�{�V�P�<I�طt��]TnP��v�Ya�
�%�	�P��i�L�5�3QBg��Vm��hq���Q���v]1ӑ드V�w�+T���~��v��l��}�\_��0w��P3c-�h��ư�bx�x�Y�gwJb�{�z����d����$u����s��/��;��ы�U4�W�bQ���2쵉j���iJK�?�җ����`��J/�����HJ�{~9&5f��W����s�+���[�ƙ�l�����ಀ:N��|{}�C��~E��/�7�޽�����ۛ�߽��p�sqh�[Nך��y���ܝʡzsahQ��ƒ�1/<r��
l�����kq6�\C�;qx-j�r�)��X	���3^R+�_�†��R���=�C"ȝ%cՔX=K�4^`�tr���S�|7eQ��sz$$�c����,Mݡot�{d��������hm�4B����3�D��!]�����{�u���%�S[KU�[O�?�`���,���u?�����ݸ[��N�e+��;��M;�Z��t���_��eA��L�Cr�#�4W������@��ͦ�<r�=�_\�u�/����^~��0bpB�ѭ�/�>�pvN�u��h
�a�K
�@�vI�<��A"��8�6I�+�C�ca�"G�!���M�WRci�?PK�mW������&setuptools/_distutils/command/build.py�X�o�6�_qSH^-u�c��=�a[1�CQ�D;L%R �$�_�;~Ȣ,��PI��G���β��V���U�1�T�A��j�k׷����w>D9ȝ@Q>˲�Jt����l@��^��КCy���"\k�Mw���B�_hq�A�����m�2�W�[�V
߃�S�[<c/Z�M�~�|��(�r*s į[f8?��w�
7����2'��룽���7`i,k���
��rz?�������.ߠ��͸��k4H��*}t�?�b��>f��T?h�˄���<�s�)^tl)�`5k����
����{Q_�����
L6���
���֐��9LtD�F����n�뙂���]��l�8�kE�^�AG,%�|��	Dt3�:������S	`rf�謷pk��&�V���c����do٣�������3̯���>A�C�C��(��v3G6|7� �}�?Y.�+4,�P(�x�\�|�R�ld�3)>��9��|z-vm�Ф�q�D�{�ފ�c�w=�3��O�,۵>x|с{!�?�t�r�k���5hA��c�����N��39�����aA�F��2�q!�[,7`L�d�p�mflz~>�n!����ax�N�����ؕF�J5\a�]G��$���Q�I9�;���������l9ҽ�xj�4\��'2q6�C�
���Ey�|�(�I���W��YL�(1��"�k�biե���!\�!}}J���bM��1\L��"���8��ȢI)����53�9�'Љ'���lԣ�B�>!
%�� T�k%��0/��`	3K�j]���D�0X�
��l�]�,#�2�;�wX��M�h&_��3�铕�E� }���ت��C�O=Q��-9!�p2�l5��8�Y�eoVݚ�n�PE�
|�ci��K��%V���͗	�
�ƾb���#r6�zr�a�keI��+�Q2� sG�C�`�?i��S�EF�Fd42����=�9�j"J��Щf@�&=r�Vn��1���iR�}���:
��c�0)�	��y�Z��@��T��{�
h�ȣ��U?��O9��fOVW��L�O!����)�w~���x@��r\VÁ�r�)_f�9Qc�P��1PŬ�l���K�.�����n�l��?>�f�^/��	
�y������|j9�;�r>�1f��L[Q-�!7�	�,�1�=6��
q�v���N�|��2O�y�U�~��Qlz�
�f��6�T�>gƳ�{�D�g\E�V.D��yN�;����4<�1�	��h�&�Pz�����Z����%h�M;O��3ƹ��1O��7-��J�M�J����9��CI���`L2EK���ч"UO��}� k^$���Vϲ{�D��_x�H��i�?ռ��7M�n\x�h���E`�>�#�;́���i�Ӄ��z7�� �}ˇ?0I��+�Q�[�/�)O\�kv`0�"�La��P�G��*�����v�PS-;�y�Z���rI�&l�O�%��%^~�.�tM�w�!M�h�6�cNmN���@�h�3 �|Լ5����S��ٕ��S��hɩ#�΂��A��(�S�z;z�E�S��!�2i$)dً�N�4�t/bG<��=s_���.*R�zՙC�衝aǙ�W�A�;1oY���_PK�mWv3;��V+setuptools/_distutils/command/build_clib.py�Ym����_��"�t�:A>n��m
P\��E�8J��J�JR븿�3�(Q���M��pk���y}fH%IR	c;+j�)U�pYm�N�ն�E�Z�k���0{��0��㬔�+��*�3��z��K�Ú����e�0!˺���/�QUW#!�(ZI�HLЬℿ�jAZ��$IV��
���� ls���5o�ڡT0-��[�۱�v���K�r�:�'�ӪA ��iO�Ie��t��r��4�>��v8*���Q��Ak��XnEw��R�5�N=�����N�`�.��߃��V��HRs�g�Y�K�8=Q�/���
�=��������_f�ޡ�@����@�"��I
;^Z��*�=/KՑxJ;�(��yK�u�/�dc���n�p!Q�J�@1e��ID���,�P+\A���,����*��6��hZ�-Sf�ǵ֏>�H�O��6a���9�Rɝ؇eg�j�`��ߢ!�lI�X��jU�tP�a�����\�0!,��rK�@�e͍acBf����[R�)1\ܳ��L�������'{PQΙă��*b�{H��S�-�|����0Ȑ_4PĜ�p�omU��x�����x-F�S.�<zq�m5FYi������~�ے�=07gO�-$u�I�)>.�`vz,�:HAI��$�L�%���J+@�hZ�Oa�K���ڴP���e�!��B��ɻ�P�.cO��{��������m�	�G*��1b���E=�d��,<��Q.)��5�O�f��9�Fu�#�
����0~�F"��A֓�d_b<8-�'��NDtH�#��/o[RsVhT_ ���$��"����P�z�x���`z�Y�߰�z��j���^G5�#�cLuW��L%t��6B
��X9��e(�=%�{@&w{㿾(DX���G_"�b���$�9D/`Gj���I�V	�B�I��������#���W���;r\�?��9
�Z���wحs6cp�g�8�/��.�㎽X�;ܯk"z�_�x`$���e#��/y����>s��r��Y�������s���o��|�tM$D����3%��[,%�L@�)ފzS,%��l�Dlu~��ika3e6-�mS"5܆7@�LT8�͔Ԟ2^(��"�K�)"�td��}q��䜎PK׊?�$
��2�?PH۳I�.V>��~�Ͱ�sݘ���]$�xR6�ɬ��m��6�k�W.u�q?��|X��\��lWD3y�BD�q�e��}��xq��Q�4i*gu_�3���~�u9��[�d9��d�'�}���j�gm^j�a��Y���E5H�2�|n�P1z	�s��a=$ʒ��\��j뱲FY���$���_�����B}��ڌ2���L���5�:d,�O���ܸ�+������u�7%�u��/������;~�dN^��5YP�ћ�~����
?ra�k���l��H�&t�Y�(�6�vÙ	��v�q���*dr\����M<'�������3^חd�ΐE�7��!�
���m�D�EQK]��">+��C�[�Aҳ���g�,�Ez8]�#Ӄ��"�cݜR<DD�
}�G�v�]�+�W-+�o�~�,hc�:N\2s�Lr	ct�
t����/�H�|�:��~��4LmU{���q���^�nR�j"K�0��EP	~r��Æ��x�G���$������:3/�^]3�ϯ�,(]�j�"�0��D^^w��|5p�khLTgk��T`��]
2�6(=�9��D8%�Bo�.Έ9��F��龣+x3g�Ϸh��5�Z��ç	�da,�б^_�e��]Հ2V�^�a���bt�.F��H\q�@�WU�Gp�
J���H���",�O ��T�g�I&cY�F°d�}�	�בB�~����D-%Txvy�X͢o璞K��6ga���`�E
�:�~�羽�?#���F���?��ߐ��d�$"e'�K�u�JE�L}�s/L�����,�F�b
ur�X�Z䞟��.\��_��7����3�a/��M���ɝ?�Ţ�����a�&����W�q��2��u���Y�mw?�J~���y��X���͋`��xK�����H���1�/���
���
I��f�.73���K�_���u�a����,�Da�}�tꙡ8Sz��uyO���x���%��9w���2�f}h��A@�����PK�mW����#�{*setuptools/_distutils/command/build_ext.py�=ks��v�+6T]�1	?����SEVn4Ul��ܤu\^�XR�@�@Ѽ����Ǿ����;�j21	��={�{�p4�E��l�e��dU�.vE����ѣ�Ͷ�Yu��n�x�ۊ�i4��T��F��Zx%����G�:ߕ��r�4�<�����EW�۲����ޕ�Ȗ�γN��'O�&���$�F��m�t0~�A��X�'u�?5Rj�USo���F
���6�MS7�n�u����b�[,wmWo���9,`[��������Cw[W�{�J>���|`�l#�^�����Tɽl���m{���m/��-]�4�2�`_7A;ݤ��&�O��o�מ�ЛvZ������w��.=:��z�E+~�L�u7k�6k2$���J����/��
���;g-�[���0��]V�z2��Ij�h��g@!��*��#I3����/��������ɯi����O=z��R��l>�rrJPC��-4f�n�����2k[ax/QTcP�\�˦�v��31�v��)p��d���iYTwȂ�./����01���/�~����	a�\f���-�>�OZ��5M��]��
lR+��He��l�;�pXx-VY�<́ڠ�Xf�hw�;쳁M_�F
#h����u}G�Vv�m�=�$W�*'�ȶۦ�6����"IAk�M�i�u���^��.U턘	�-o�Е�9�2+�E�$��})d,�a�|^TE7�'
qI Bio3 Κ��Ki`�fWv�V��J�6���X�p6)0UK�	��H2�8St¨��ž��f`�±Z��w'�����^M�������
@/��;@h�4<w(�iӗ����ig#���+2�;,x��v�tV�S;��@���̐B3#k^̘4&�}Q�����]��i�S/~6�=�mq�n/Q�"^�8AF��PBH�=V�3��sĎ�d�X�ݭOm�5�)$<��\�n/a�HyE88v��i’$�"E$V*Ó��v<�Ǡq���[xIv-h"��g�=$�ʆLxq6��1��wbdD�JL厖P��h2�A��fK �@b����[A&	���a<��ۉ�����z��jd�{�l궝im�@�B�mQ��:FN��Sl{*��AW���I�XJ�A�͠XWh���.nw]u �*�"i�z�,%��(�����m�Kr�p0�R�Q�ղ��rZ�ҕ7G�Oz�B��ke�����,EH;�R��œ���_ *��6�����tW�S��q@�C H�A�J�.��4CH�jQ�@,���Yl��5Ș��I���@p6�
�Y���n�"��&DG��d�e�D5�XP�I�1�h��G��/vk���z)j�F�����2=>,x�<��`��b��E��!%���0I��]�نBh������e�:h���^w�8DyZ��$�y��f}�}t#5���E���Xϖ[Q�u]I
YI�~��#H(�\*-�B�b�B�66��ٚ����}X10H�B�%%?���eȻ�Q"��<'e�Ii�h�@��H41�?�:[�`Pe���\k��P��[��t+�퀚�WZ�&N��ĵ�hG��w��Q[���oe�R������g4�5;�8boQ���@_T���
���Y�lm`��h�(�`YG_�����bl��axL������\˳�t���o���o����DJ|1~��G\;0��9�^!�{�b@{�X��r�.�\k�܀d�Ε���1R2���䋺#1���X����v6�?��*4�pl7��d���Gw�2�z�/�u�؍G�ؕ�~��N=0��`�r]Yos�>�)O��;*c�v<?��l��;n���ZK	I�"�����>;�d�L��j�u�!)C�Jj�os���2J��ub5���NԔM�by�|��O�oD ��H��>|t�*��ڬZʤn����1�gi�e�X�s�n��Ip��e����#,��~m������_z�:` U.��-��O�+Bz��Z9w�fi���*�sN��*	@���]�oE7;
�hl�@L��ՠ��M$F�ۚ���:��^����i)��^�R��(}4<b�<���o��	��Bz��o�Ø�'b���DC�>G­�s���n<9���co{���2��ڤ+��c�Uݡc���X����(D�*�]r`��-K�5�6�
62��"�zW���1��u�9ٵ�|&�D��b�&�,#��6�f��C�������9��	S���j(��òH;�J)��Ӏ�Z�E�p��fuTM����H�+2-�TiS��K`z���7d�;/^PL����\������&�U7��G/�:�؁��s@0����3�}f X1T�$�g� ���{��_K���aQx� :�@r�p�f�E*��J�}v �PK�a�{]�S䑢�0�?M�]�u��C���g��r�s��S1"��cȲ�Њ�GW�
�Ȧk�5��	��æ=�A���Ѽ
첯�;mթ!�F��h�`���V=�M&�F�aS�5���#������CosM��
�ђ����O�@����)�� J��E'��KHiNP�
 �����v+����:��e�����)|���׶�{
���\�w��&�?����T��'T/O�|�/�5 ez�:p���d���N_~��\�h�nBc�~�w�<�_lM	pb�c�����B&��A��Qk�o���X{?�#9���e�&��NI<�@�%Ϛ�w!j��{��O�i9О���(���0>N�;)Y�����g����T�|��K�)K|�WI��I�7������/��~8{�
������w��ކz����c�D��a��P��|�Ȗ�*/(��؀���&�:�``�f�>q�{��`����6��t	C�2��LP_'$��
������"�-]A�@S�	5��:�e��e��/x47��
��W����\7��	�c���=@�*��mQ+]EO+Y0`���x�N�a(
��Vڬ�8h�PC���Ϥ=��4#����/.{`lL{��s�ޞ�rS���@OD����`L		�=��7q���/k��>n�?3ʤ�Q>O��l:�i�I`{S���Dmسct뢅�'�$&�d���15_`��>�.��>������5���9�$E��9�i)���SV��%���!6Y�:��o�O�m22�4Y�T�p:��������]��L?�J��%�qOWX}�R�`�r7%��%���f�*l��G�\��KR1�i�}RT�H>+�<"|lۆ�L��ۃ^��< �bQCXZ٬�g��Ĺ2k`y�T�=Ә�*:��x��C�ƺ��	�>��1U����0q��Qp:��y�D�<��笨�>��
A�7�u��&A�?�A�u+��8-+r�*4���{?S�ީ@�V��]l��I�`�#��x�L1��|�h�Κ*��%��`h��IΏ�07'��`申E�x�2}�h�TF?�r�}��7)*,ѝC�@F�}ù��cк���L3	�����8�F�Q���:�S�a.��󁘯����P�W�_���#�Q���i�w("�Z�DIڊ��͆aPL�"���T�ɝK��+����:�S
_ԭ��ˑ]s@bٕNt�l��݈���[֤�xE��?��%U Ԓ��nt��'%�|{�k:�!��Fsq��_A^x2���#�������
�&vP:�wi�zgIAT�"�-}u�SF�==jjsi�G��:��
2n*�VLF�>�I8�yS�o;����Ƀ��ƾ �*8��O�ѣ�4"M��R3��L!n�e��|/�^�}���.�br��|xp��0`�dc��ۯ�?��nM|����""!=w�6�Did�;Z�F�F�c;`��%q�99b���3��Ι	D|�����S3������)��|C�_Ln��Aas�w�*m52����I���~I�'K^��͖��P	b��1�cxs�G�c�ӱ��Ϫ���1E98�.+�2���[�M�	�ۦ�/0h�7��B���\�x��V(ru����.�5U��$s[���M�2��ݡ���իl����GQp�Mn}��4$�dCF�e�W���[�]#C��5�ǜ�&dE:����C����mE
�=N��
�e�yu�P"j}�M��S#���(#QM�֠>��p�YA���LV��a�(��Z����"@��v2|~"��W"�G͇������Mq���	��v�Ν��`,�S&?2�KY�	�%/>��?�;�Et%M��\܋���ro�����3Vl�Ƹ�m�*�+�u
�v��,��Y���J�d`�#g}~*]A��ЖS&��ZGw45K��m�o�ZƈPlG��5M�[ޚ��a��JX�:�\R �`�U@�d��_�rF����'|��S�W�m��Jؽ�o�H/����5���Y�CԋpP���i��<5�V��)@y��}�KC�2���~s�A;�؛�eւ���V�S�䬫gh�o��7'4ki.��#0�����x'1��^�"�j�i&�β�1�n��=!�S7��i4Ϛ���ܢ���x�8ĠG��ǎ�����Z��A� ���ۏe^�63�l�VoU�}z�J0��/k�N�`zd��,����W?3]$�/�]Pө�8+��>�Y�aJd8��T�N����g2��(��p��1k�����ű���ڠ|�O7�1����R�{��}��Vx3���f�t�<�ohD5�PQscg����ěϧ�EL��/��od�����79��,��L<^V�y��o�}��@9��[��#o��٤L��G�^B�
�T,Ή����;'Znץ���9���*�������q�ﮒ{s*@�{��%�4��l0��ٛ��3"Ni/;_�{lc;����bNĻ��CB�����kROr�{G�$uJ�g�\Qd���T�J�����\���N�+��뢅�|��$�]��#��\ϝQ�6
���lg\��ͧ�[�\�\��2[OI��Z��i]K}"��z##ʅ��S�狿c�Gu6i3���",����H�-ꐠTwKN�����hO�iO�5{���*�ן�@7[��s����5��L�~�V6�]݀���`��������b���7�`b
��v��3Ʉ��鴀�̻��;r'�,lU�$]�0�bn��m@f��uyI׈��9u�yE
#G�vz��T���p���vۆ�t�ڟ3�Os5�w��H�N��t���-6E�Ģ����U�x�1}�E�����/�6����Y���3�@Fu���r[,��^�r��ô���@)v~��bȦ�<��e�R�L�Lc���`&����C!�<����O�������	,���CJY9��Y��q?�T��#P�X�k����Z4rV?���(�������7<��(�F4e�S��(�f�_X�*T���D���4j;���o"{���RϢ]m�V�W0���1
�уm�2:�D�\�{�b�.<�`���5�ѐ�
h��K���P)^޵������K4*��,qz�{�Nl��%����b*��$��0]�IF�]�Q�9�MKv[��`��	��y���7��in��dd���1Y��WR8NJ55�Q)8���~����1�-�gõ��RH��.l
��z&z�:�
ν<�1b0i��e3+)�kR/�p̹j��sJQ��4���U�()����я 1��>2w�Y{�~~s�j�!Zn�jMû%*Ѣf]9 �Yթ|1l:c��������b[�-�ٲ	:;H)�Ef��“������|'du_4uE��}��� 1ŽX�ʬ)^_�`��zi�dꑟ��7E�C
��w\-oL7��]���.G�r���S/��[\�[U�S��Žۓ����[~�A@"8N?P�=A[���mr7[�w;)���u+�t1��^8�é�,�́���e��H��Խm�����a���n�?��0y^�;�����~n�Q�U8	�3{���.�v��g�
�hx�Fg�.��
�Sr�f:��G��EE��^
Vd�HL: X�]x [�sjبOH�0����@���&�}Ky�(�H]�F#���5Xh�ϭ��T�Gx��Cr,먲��\%�:P(���mA�M��KN�̧VT����ZO>���!���Jv��oe�Z�ğj�D�P����o��-� ��u��=巧9�^�u%1$8�o��w�6��@��c�����9�8:���j�|�末+g�q�>���a)`�Â���v�Lo����.�
��w�F?g��s�x���`J�puu	4�,_��٬�$Z�l��2��Z(�:����
�dlb��uIhj�74o��!`P�R�ֲ�|k�B$0ߋ'O����Ϙ�kmI'���4�w����b��ySo[w:Om���l&F7U�Dm�(�m�{Y�[�okk�o�/�s�h0F�z�H���.�[Sn:��|��PI�N1�=r�M�
�|�7��w�.PH`3^f���^Se���ɓ���,���cl56Qs���c~u'�45��?�1���S���{���J
�8G�#�w����c�R��$<SҸw�H���QZ�N�W�ݲ<��ֳz7���埈�|�d�1|�ˊ܂r�„�#35m�|�FU"���a�܏�/�F&���sw~��.�GK���ѕ����8aW��M�R?O�h�np�5�A@�G򏁢V=
y����]�˦�������v=,y��g���P3�'�<0�3ʲ9��@<�Rm���C?�"��c��E.���l_%f����Y=�47f�hT�BEAH��[��>u��)��7����
����MZ&�T��Hmu�xs����]�Fҽ!�3��tn>��*>��l�3qdaе�~'�蛀̙�����l_ذ���35R�m-�g˯&�t����J�7��k3�s�	�)�\'��Er�El�)����y�
P
��y>���WUxCv�<��W��c
�"�)#K�D���(ΓU,m�٦����8u��F~@���u�e8 }�
*������A�f��%�i�,�0UD#�x�\�A�p�*�)O�%^#�)�Pe�e
�(���Ʊ��
xF=1Lߋ(����H>���z"���H�����j�6V�C�	(�Ϧ�QS1��M��|����¹l�M�W�*�b�T?Ȧ��.`��h�n�o���~�H�.L���1Q�|��J�
HkאGO���
hЈ�UE�]�_���
gOq"Oͯ��ex\����)����c,T?X��
�讞~�2���]���k��ZΦG�O�Z�˫/o&*�Ŗ�K��6*l"�S/��)�ni`s�t{p(B���w��-Z�(݁��ڦ��엯4����n�݌�ӡ�!�������{�N"���<�^V�I�,��P��Ur��n�"�����w�O¸{�{��/�}nce.�N�`~�.�f4���7iGnr�_�����0KYgx�Ȁ{
���;'a_��/��|4$������1'�1Y��L尰N��/���~����_��#O���&j�d�I^h*v���&�ʲp�F�f�[�%]�%�8h��+��ӷt����s2�\���^�aL��nW�CFX����h,�tX�c�����)��2����1L��z�g�<��x�V����D,��a�����ˢ8AC����
3в����˛ٷ����m�m�ӧO���*&���i.�n��͞A��'���-�ݳ���Y�
����vYYRv���%��$4�z?�Q:x0��ꀟƓT��x6���x�r90t?�L�2"�����wJ����?��f�r4�d�J����^����������{=������3��+[��^���]�M
]�M�g��̱
��
�9y&MI"�J�\&��Ҽ,+�n��TVj�t�gL�9�Y��ݟ.���R�;�$�����Ji�{�{����2/�z��!M[d�e�c}צlz�a��@��aP��]3���J�#��)��<��)�=nɹ��n�]Uzt<��GL���#�5�����R$��J^z����W�Q���Hd���U��zF|V%S�3]��q�8ﻃ��&�2�{�y$�{���C�bT0���T)F�/�"^|;�=~�r"�^<��ZM�n��r�9(<v��d�xƼK'DzHn.���"^���:�l�5�~&��s䕕/O��������89��.�YK>u�d$Xu\��*ׯ�7o/�ߜ�j�mh����q�������|w~=5��|p
K+��@d���G�	����k.塎[�v�:�
E��|�*�#��Y�0��W�-)��dp��g/���7/'i�\\U$8gU�
�9��Xݼyw�ˌ�WF����q3j�cQ���"�q��q�l�LS�_�!7<к�ǻ��W��5}H�kL�6[쟉ﳲ���|}�X��s��U�!SZ�ê��ZoHL*��TL���?C�w�?�V�uaZ{�%�WC)���;��7����7��?�y�~~s}���7o�#2�3T�T|�*��/�����t+�j\d�_�z������j~}����1]r6|q긕�Շ�x~�ë˛���8-$L�U�Bd��G��~��˷�޼�uɐ��@h��{�a7��ʩ�����PK�mW.�8o@)setuptools/_distutils/command/build_py.py�[m��������Aҝ�����"�Ksh�+�k`�0h����%E��������h�^��awm���>3��$�Vr�����=x�]mƪޮ���՛CW��hɆ�`_��,5cRff%IruU��X+��O]mV8�|+Ov��n7WWe���I/�T���}��z>���a�6�E?�;>�qfH���K���X�W�o���l�,����a�,�1��?&�����=<8�۱�eE$�V��{Qm�El��_�DL�;�2%�%��6]�t�;)N�"9|���h��j����?�������]Ns�k�K�M�����n�n+J>�ýO�r��+����%���%t��=Ӄ9�-߾fe�þ:%����!�|�I8�ƀv��k���o`�ҽ���D��jS������˪]��;f���?t2w��+=nڶ�qU��_�xOC���8�⊝�0;�Wcn%��j�x
r5dR�%X�a?j����>�iwZ��>��߉K��[>���>�ܨ��]���̟��1+��j���zl`xՈ���5��?z0��7}ȟ8}21�'ϯ���ob�8�᧯6#�c9Þ���>�e���P<1�KV֖LkA�?�/��WQ��)�g���D&��m��j4�U��}Z���T���$`��0�3]���q�Y~3�t��R���̒���nm�⦖�Lt�6���M��]%�X��n?0�WU���1g%o��ha(i�؂�Bé�ca?��Z������K3���Y�ʹi!yKZ�)D�9�9
���W�i>�|6R0H�]�?���O���C!`�ٿy=�/,�g44K�#��Jɼ���,�KF�`��z���>I�)�c����~@ݝH�lsb:����{�NL%��o�؛o�~�_��� F�}��0��@M�{�xQ�v���A�:*`P��R�A�Xs
g,����
�
v�e������)�Z�P/� �F�hK3��8���Xjp�C��ʪPc��F��cq�r/ �J���8�u0��*��w��$�E�RǾEqNB�AS�*уz��˶LP�]�;$,���ܠs���:�(o?ڑ\#>�B��!B���~�(P��Êj��APբq�-@����ޡU)��5Շ��D�j���Q�r���G��`K��#3%K�|1�D9�EC���Cnt�pHA�(Dl
Z�]�J������~Ԃ:'�cU׀���rp8�l%; >����3�w���R��C��ڂL���\�H3)2u(�G�SLW(V���Q��FI����q��&��ZWn�#r�l���v��	1B]�]l`���B���Xjɇ%_R๚%ԉ{?b:�R?��d���S̀,d�F7)�!�A�5��l���Af`f��kU��o�s'V�6�P��M4b���)�43����E��`�y
~��Ī�P�H��>̣���7!n1�܀����웶@��pَ������V�q��j̶�%�AOk�썶��EZ�BH������ev�*�액��]]
Y��<[���d,��x�1�S��l�t�M�4^e���%0Gz����됕��S#���9�LÇ��[��w����7��t���ơ�ٺ�k��lb��op�
�a��f�����DӵK�ۆ޴`3�<��^��Xw*��(�O5��u+�0�/��h�Y
���\`_�	�_�5M3(��^�)���#>B���C�0���]������`J�ԋ
m�B�--��_��B��5�ŬAF�<�J!:L�>P�#션�vX~���-��B�1)WbШ��FY-I��n�P��D\0a��U�de��ϬOͶ�I�x�9��<��7�\�B��^8V���Lu�u�yjF���yx��Ȫss'df6L���"���d��onv�vͅ���V�o��AJv�E��C�L,�"�i�Bl�3�?�?Cc� �)�4�:���@>�E	��h���~Sg���(�S�r��r�m$�yP,�
�\U�4)k�����w$�G�*�NN'P;7��#�`&(c)� a8 ��<���l����.NT�lj#�+@��k��[�����X��墲�����
�~�V���m�%̯�Q~��};�h}�>��&g�M!�b>����؛����)����N��pF
���00@ē�-�K�x�@�Z�����J
*�U�
��(`�{ލ��MB�/�.�,Z(�'lߌR���z�*Jjsb)�%e�*�x`kr��ھ�a/��ǮSl_��ղP�u-��V��g�@���E��� ���|��#��$�h��s�O��b��Ń	�!�t��־<t�	I�\vk���E3x
��J��7��:�R��6@N�&�g�lv��k'�$�#���=2�s�Y'��
��!O�Bf��	�E�Ȭ��ZQ��x�ah\��F*�5��B:�����,.B�����P�>�d��d�ɉ�2�e��j�^x���&I��%��t�_%�L1���U�WN����Q���Ʊ�O��k:"�؈��a�H(Hj
ID��J��	��l�Y/��:@՚`L��5��'d��ݭ��o��NV5+	e�
򄽺��eHн�ao�������u�uE���U�g��e�PdA�ȱs��qǡ�s�a`�\���	r�;y�~�M����c:���/�kG3� ]��z�OH�/$���t���^+��[�|��Do�`������Gt�=����*5���a'8��O+�]2�(/�CB�A�/a��Z]�p��o$UR�C5t��0�\��k_�@r]F�(gN�F>����{��D��
(έ�6\�����#�Y���o�?�*!�͸[w=�%������1��Ȭ�7�Ǿ�����_�c����i�@��@@+�e�
�߅�S`���i�	�>�*@���j�2+��^Q�N�|����|S������N�H�aS��5���)K�e�"�`�&kڐ�-@\ D8�U�fRã%c��L�N��|����f�\u�*��X ���J':�;�U_WQ�i�/��T�
�i��,��	�bdg����A��:G�BjAC4-u�����"��:�&��>mПyb�g�ţԡΨ�,3��8`{7�-�j�b�g�W�'��h+����X#t�r�xu��,��ZT�U����ԇV~���=�rO
�t#�dP�U�$�BޙP��>}�PѠ&����-��ACr�X���Q�%(�)ܐ��_jL@J#>\!�9�k���j{�s�Mw���8M"����K�ofm'VP�I7:��N�K����%��?~Ny�A�_�|
�5���:�
C?�/:��� �Ӷ�8“��h����W�g������g�bx+�\��ꮥ5W�&��i�?g��BlO���|Z�X3��,��6ʛ;����Z_Yy e^ѸV�J%�h	�hO���0���W�A��J���.eG�^�:�^�i*��h�e�#&s�;�u�1�Y2��Dg5�~Eb:�g���nI�9W�s�!�h��,�y*q��P6H�5R��)�K&��9��Nz�?v��([�\M�v���jx��<���xw03��yZ�
�}x{#{*
�oL�ywj"��X���A~�/�Mp\Y٪�9�
l�a@OY�\yg'�4Q+Q���4a�>܆��tI�U沉btv���`pWv.
w+Ht~�|٥�2s2��3yFlN#��hd��1W�GOo���!%�C_n�\]z���3X��dUp�k���
�l���aὑp����RÙ�#�v��aϿ@�d%cO�»&w�����g��'�ި�Y^�	O�k�����[�Ӷ���$���f����*��cPW-�w��|';��17�L5�R���M5ll���$WK�~�w�u�@��ϩaՅ��H�		�-�=d����J9��h�{��A�*ߵ��WP2{�ӡ�J�I��r�t�#’�\��d�[��ք�A�%$<c���u��<n��TK�$�;�2�f��X)�N�&��Nm@�z��TE%���W�@��X���m&�Ģ}E)ft��K�W
S�8s�h���������g�-��t���k��I�Y���/��f�%}�]5 ͭ�\���GR?��=�V�
�A�%/ħ��4,7�Ku[F�#�j��B	a�C�{R�knfu�3u��"��x96?�EQ�����ҵp����14'^�]��:�ku�r�&utvJ#\�%緔f�ա� �Ju�n�nQ�N����E����R�x����B�:�Z�[I �{�g�a"	h���7{=�6��GFB��/�<o�:~���GxS]�%�y��m�kz��&��/��MQz+@��]A���:�6���u;Ů�G�LO�^��c)V'�6�*�Q��`*CD��J�
��h�"��.��^����M�	�m�d��9WI�����'�
���pu���-M$U\��AX��p�h��U<F�,��p�%�7z;�	��»Ul۟����a޽8_�\������PK�mW8�4,K.setuptools/_distutils/command/build_scripts.py�X[��4~��Iv�hyX�� ��h/h���rgj&�#�aZ.���8�6���&>���x��HcK+3�j��y�K�%+kYX3�]m�LlEn
��^6�����<o6��Bi˔Y0-f�V[f,��~������//��V�f��M��T��CD-���IQ��_C�����8�7���v3!O�������]�fsoD|�d�~�ۍʙ4,�Y&��U*���{�v�w �Bc��gnE�+�uK�
��`�2?��������Ip�n�m�$��?����Nj��/f3���j�޻����jzĪ�3p@�]Y���7�*���R���ڽ�T�_&R_��'�A(i[�����rg�x煋@�t,�7%^z��l_��\�e~�y���S��Y���ma�`b'���u&�8��B�2݃1����3�̭��~���u[i�V*<�+_K�ڶ)���<C<4��Y
�7p�Xg��W*���c{��ѝN��mUZ2X�ڊ��1����29b!i)+����N��:,�r+��#!�q�֙��B��S�w���Z�K�6j�_c�;�Ĩ���e
�p*u>�u�ңn���_��S*���"q�q(*��Ǜ:���ƢRɜ�}��H0i}ö\߃��[�����*s�s�c|ς^��r���.1(r��"���aW�����J*��I�U��I��'���oKk��ND��"EJ��ĥ�h[mu�%=tz�fQ�Amk`��=Ն`��]�2�}[	�]W#[��^ky�~�����bд��m8����2QE�*�(�h7�܈�oE�5
f"^"O��9�
��]�-r&�r=��^4hዣlF�E�^�w�Gl����Se��jI�
�ӘE��K1lξ���)H_GO&h5�D�\��J�e�L��K�+۪D����n0�m����1b
��T�dͫ����I�Й0����c���B�ݚ��ko����Q���JC��VP��� �	
Ɲ��<y��l�2�⿙��W��`�PiD�q���h@�>x6��`w�1e�t�0��3��y�!�0��eb[�}5o�^�
=v>v��C����$n�F�mн���V�w�<��B��z sPѝVe|2Ԣ��%p�:��2OU�5II�]Q�)���mn�h�S�Y�zTrF���n��ET5���d���`�:��F��3cnP�O�6��4�TW�qx�]�zy��;=Ս��C��`���7o�^����Ż�p��x��"5�:���g4�戺��hhxڇz:�� �ɽQ�y3\��L#n�@��M�-
���w?,�`%�<�@���J�WE��n�CaP�4�C�i�pw�Zu��7K)$fݳ�{�S���^O�=hi-��Z�3C��Ոt,O"��HW�	4g�hts��5�>.r���GN/���55̖D��qL�f���~�YYQ�N)���3�WH����a<pZ���i��ȃԈ!?gWie�z4U�Ĝ
�s̬��钘{���:��jP��n���
`���n��3P��_�iރ�X��1�nCn䫛f��|tk�7�f�݈R]�a�Z7���1\,G�����f��`�]��g�@wK���;G7�@����gȝ?��.ln
ĥ�������7?m�
w�@ewCӸ2ӣ����&}X
�u�]��}ʞ�ϱF�q����O�?�<<�H3T�{v�1�'�v���+�P��{ļQ�B}ꢑ�D��(ހ$�����Ç(����a����}s�}��Xs�7PK�mW�m�&setuptools/_distutils/command/check.py��n�6��_A�(���`{
�E�a��H��F:��H�FRN�a��ÛDI��U(b�<���r�,�ҝ�ʊ���(�b��b�n+�AhE���G��$�/���b#��Ĵ$^�����MA@�F�ԓ�ݵ���b��rA�yAʦp�9�J�����9��:�@��5���Z&H�I��'{4�
�x(4�\�hJP{_TL)r�+4`#	/�2O	��\p�牂j�"��d+"-x^��ٲ�WZ�׿7V=��S�}��~�" ����aM�*8�xb��o�%�5E.+���#JF����(�&_�F�A��e?"�X�A�����~j�4Թ��K���yYlyUJ�����uJ匵-:;I�t2�H:""1~�p��M�iX�kG�;��oame����{>�Cp����M������n�׷��|+�����x�t�%�•"�P�N��Hq�yos�f4ies�'�E��ӣ�&6�J��i��cvH�_Y�`�p�f�R⫍w-���-�����V�f�%ӌ4{в���ą/UHnUB~ɲ�id�q^C��W���ZC捷�OB
C�S���� �f?B�þL0G1k�#J
ߴ����z���R5�d�P���;z$r(��-�gy�,�фmř�4=*��TX��1��nC�k��5�p�m�e΢d�0hz��i*`"6�Ȗ����L�0U����
���Q	@�c�Q�u�&;Vu��n�1�汙8�½CI��b|�d�c䘙��U�����ⷘ���a��Z^5]�ꢫ�A���\l����d{�㋞Ͻl�|�Jv�կ;�	E�	)g vL�Ch���a0tF�>P�m`� Ig�SO�i T\z.g�1�RJ�
������d\���(��h��N��c�%@	eF������S�Lx5�����	�A�F#
S:"�F����<SV'��y=��F�K�z)��q~�+1�Bg�y�
-��״'	u}��s,��PM�S]�5

7��:`m8T��!X�&����"��?Ĉ&|qd8���No��^�5�]J�0�7��\���"�~A3�����jQs���Yl��=�?�Kf���35�O����5�L	dZ��I�1����浓�t~D�LO�L�$�ZYJ����ܥ�*��̂-��2��eЫ�>.əZrF�"ٟ
�NGU"�9��v�|w�X���AZ���>@WdI^��4�xۦ�J��z
8G5�A![�zq�p;��4,D���Qo�Y**�n<D��#�~������)��2�Y��y
?�,���U$�'��a�5ۣ�357��h���)���cہ�Z��Vl�g��Z�y̯�w�QB�9M��h��י��y������<�h�L���8S)�z��V�yz$�<\䰩�n�X�L>vnR���1!�7�ĺ�l@	�̀��
&��碨�l�j�k���Q����w�&�D����.���tg��ssv0��sS�M��ʴ���n���n�E�j?φJ�ц�5j�S�E�w�JSs~��,~�f���O��b�<�n����~�v�a�g&7�	0�x>��Df;�>��"�A�6'���>������D=�[�����I=�[��S������E��f�C'��J8H�U侮�ZG�Ig�2�m�;��'���/!���m7��Q�qۓ7ڥ��SdR��ij��̎�(W�O���߃\m��A��+Wf*Ψ�����F��6c��PK�mW,���V�
&setuptools/_distutils/command/clean.py�VM��0��W��Bi��,pA�]!>	Ѫr�Ikp��vXʯg�|9i��>%��73��iʅu��n
]UL�M!��$�\�+T΂�#|�q�@=>M�$��W�����g�	��D�PpV�ۂ��B�+�Qbm�
��0�����������I"�Z�&���.�n�Ck~��l�S3X�߸uq�R��Z�-:��$ZmaD�Vpi�@S�C���B����卐|'
�E�Ձ�ŏ�ѯE_���M����j؄��� �
N��ǒ5ҽ�lmF�l�.WG�R��V8!����*��;�vڌ�#��&1�*]�?p�B�{i0���n�Ȕ��!!s;c4S[�҅�
-�=�%e�6l�M[�A�6ݸ�q+P��ƺ���ú6���s�k�3��Wd\_��]_�%%����=jaQ�T�+���e��&D~j������>%'^��ֽH�!�R�ǣ�趍"8]C|@v}e���Ф���I�w�󡑞t��؁b(�'ф8�v[^��O�Ś
���726d�4j�����S'����y[K�n�QtO�5�2K=d��CIJ�R�%��M��~�ȕ�V���<�+s�
�9l��ѽ��PZ��ф�Q�7�E�=�pM�����
��P�@u�x�s�}N�6���^���/�QZ�`1�ǒ>k���q���b��l��گ8k��|��8o��gF�o��5F�D��{�_�{,~��������8=��q�#Tb�w�gt�
�	���3�*}������ 8�!f0�(�k6U��F�E	39��M�c���B�zюA�v��MW�a4=�
�|���m���?.�PK�mW���7\=3'setuptools/_distutils/command/config.py�[m����_�(8���N�u�nl���4�z�va�m�VQZ��wfH�E���i���-��yyf83d�(�r�vm^�M*˒W���q�x_օ(E�*֞�v�b="ffF�8[�R�E�b���~x�҂+�hO�e�(V�*z�J�Lu�5
�L�"�y�J�u�`�[��aUY)����<��`���+�g9���O9����Y�ٌ,30(�рL�F�����F0^��%���*���S��Ջ3�SB8�y�C��䁩��&D�)�L`�
�8;J����@�]K�e��4�F���^ru��X�6�+T�dD�~f"J�lX�'1١� ڂ���D�8��6�(����eܪ���š�%�!�̐k-�x�h	�0�,(�{�w�j<^�J�6LI;��2�����S�����͏�}��۲_�4�lR�<J߾�?�_�-
竫ł�'*m�1T��5oH��./�H�B+�d���e7�?�x�s'�GY�ľc��lO�Ʊ��E�J|�'�d��}1"�Wi�eb��Bb�ا5�^���M.��o�;T<L��t&y%���k��jd*�
%OId���JW�S"���Є	�"�7�'RE@J<���x.`�!�"���9oOs�z��j�U5���hW2W��MO�lO	sKcڄ��몄m6�8���F���z�dפb�8�eGQ�����8mQ��^޶����
Q��.�,�SmO
��q�b�hO2�(�{DcS
�L����B ��h1�	<_�/l�<@��ۜ��-�(���sc�bK��LgO١�g8�\~�����y	Ѐ����R�sH��s���v�h�ң:�/O��ƪ�ؼ��q
]�Fdv;�N�^xd�䰫U@G)X-�
��%v�:Ĺ[g��G
�f��
jȍ�d�oG�����(`�p��L�rB0�6�g��?�(� ڥT���'%��b"���e�|=Ÿ{��Z���S�y\���wDs��z_�Ɛ�1=4A�g�s�M�!ςځ��Î�*��H��C��V�ٞcZ	����H`�z0U�˼�
�{H�'��*C�'���D���_��$�;�Œ�\�h?��PC��f����!��'؎�ֆ��'��*�����+K�,t�*1ϖ�::Iߋ�k�L2Z�>W�J�A�ٗ[i�"ڈ<䉃	���%u���v�%0�7/��ԗ6'��dX��o~$��Tl�^t�k(B8z.J^M�
l�hw��i��_���,`���c��g��/
�`K���wB܉h Tf}b�TA��&p �+&�;Z�ڈ�eC�p�S\�Ì�I��r���9Z1����Xr��T^/���Ⰱ�͹�[��>7&dx����*bo���to�x/QG��Û�׷�3�
̞��F�]SY�zvrY��y��xd,դ�0k�9S��X̆F��.܍��
&�U���%�z�
�Z������y�3*��|0�k

^�e����v-�:�|bz�Q�"^8�K�}���U�ޓv:iy����h�AoD�V�򭀅ճL�� ����RnIk����
�R�Fa�Ɍt��R�
�+�c\m�����P֝k,oP�	���Jl��M�j�>��K��7G�.@7[��	��� ����ΩĜIv�f����H\�-�k�-R�#N+9�~���N�Lȳ}u5	��x��ci�	��6ky�L� �Q#Jy.~�ި(a1�7���[:�qC�j^]�m��^�����nH�!u��5��u�o��?�;?V��6�ck��ء� �shl:���'�*�P/;v�U9�0��{	�Q���BR�DV�=���J-eC	�	5�_{�g(�[?XwHƻ!���2�s�JC
����
�d��N�A0��F	[�y�]�UȐ��m:a�!�}��0�i�@|a�v�A�8���ȀZ�d�TY,���*R}l��\1���bs{=C�Oyz¥R�`m�[��S�k=���t�0�*����]�yu0�K���[j�
1�
���"L�F��B��}�E��~̖�_T+��`�
8��s��۷ԉ_� �����犊0|:����!�O�,�c
f��6YB
:Xg�{����L�E�`���ë��+�FhD�'X�V1�^v`'(A�t��[c��n��u��RQ���Ap��^.x��n�Lb���ew/ؕM��9��ߣ2c�)�Oy�Ы����lS��s����,�s�xp�U�JF�s!P�&!�	����'1�CKނ-���F�x�}g�$�"��C��=�s����;�O����@�=VAS�C��t�K'�Н:�$m��&���X8t�>��K��@՗{Y��ֈ�P#{��F��0�6}����XHN;~�������=Wfcq4_\,�'�o�-z�4S |mu�
�l������#�,���=L���h��hW]"��<�A� M�x^� b�m�r)��]�CxjF̊�`���A��u ��E�ak���\]hJ�7�����~�;˫6��KTdd��Y���y^t�>��y��Dť�H�����p/�HG'���y@�
`V��\�%H�ye.
��Ж�@��xd��Pw�&�ԇx	J�dZ���y~3ľ����Q���&ݜ
�����S�����j��ë�;o�g��VV5?W���?{2s�qS�B�xZ�^�(s���!�tW'(���)��>-z���m:�����#��!W��,�"5,>�ZU��J���WV)�_�q&�b�U�vCo�֦ې�!���[L��`'�J�=uZ��!Q�ݼć�׈^��iB���+��)����BqAWz�Se�:���h��9�}NAa�p��.zF�<x��i��(�Z;�w����=��WA|VcT*i�Jt�h�ǀ�6Ӫ\B��UK:^���;j�َ�.ְ+����v�����YZ׈��HI��H�i���˄|R;Z�"צ�L��Ե�L����u��O�9�U'�5�B�a�ԛ�Q������ȧ՜�s|L���fo�A�+�����x�a^U�a�;��(j%s8l�c�1�(�\�Ã1�D-�P�K�/�̏,�`�Y� �ļ���5�������M��-=���u�|H�_��]��&a^�(i��� v�,<�Q,qG�ۛ�Gb�QTԻj��G�%�[�v6v/!�t�m��6n�<�����@|C`��3��0^�o؆���{�
� :ST��t��E�L���܉Á�A{=�c��(ݴ�t���	��q�����]�h����N*c�lq�^'��!�[k8n ��.(7t�i
�ƫ"�,�=׾�y��~�^�7F�[�N�p������"���|��Ճ-����ؿ�{��9��9�R�;Ȯ�	�޻q#TI��Z#c{a;���ї_��y_|鬵��_n7�#������� aҸQ)����4��Z!ěvҦ�&�y��7����.�׷�Q�>�Ͱ����t���xi!a�qc��ءHI��� �&(��L�f\��a�W�6i!v!�
PK�mW�i�TE�k(setuptools/_distutils/command/install.py�=k��6���W��D&�l�>��䦮ۻqmb�b����)�"�c����ڜ�ۯ�� ��&qꮮN�JF"�ht7�
&���]ߕ�X��v��Ţ�E�U��ً��[^w�uΞ�l��̘�E��Y��5m��^�?qv�n�-3�0��jn�'�~���?��F�y����ꏀ��^�f�
����x޶Mk�2[��ʺu�n��cκ�����n۲�K��j�,��[�n�2ѯDG(�,�d�
_�M��[�)�N�ǫ]W6�܅�"U=��Ͽ_~���G�_�y~����K�]�7m���~|��٫_/_?������/g>�]��\�.��*��7��!��]v��,U#a'�����F���/����e�m�*��u������Ⱥl���G��<������n����ܵ|]~����6���ݾ�4���~	|@���-����&H�կE���T�"���٪\Wٍ�2L�UY�����>�
7
�=��S$� ������`�{(���w�#[?I@����c�ג���|k�
8q{��Y/x+���7`	�����/h��?�@�8wvmTɈ:�AO�$�ܦ>��}7:�uS4ݴ�Q�(�#��m*��	C��%���~��	��y�Єir�ހ#���jXV3�Heh���}�@Ȳz�j~˺��֬:�e�!��Hj*/R��|������w�܇�a٪y�S~��<Z���_�
o����ņG�t�|:)U�H����*B#+�.���Qp9Ѻd�%��6e}��1Y�eU����k�}$'#��
M0������
ov+xǐ9d������@���ѿ���lj>0� )��aQ�ZS��ϧ��?�`M]�5��CǴc7;���2�,wA�=��B�j��50
Z�zզ��^tD���E���&4�!рJ�����<��l}>G�w�z!��u�4e��&���ŽI��Q? ��‰���ل_�Wo�l
B��z��aW�y�U{Ý�D�h&�Q��*D��m���_�媧36͟��U75ay����"��?�-A�=���~��Mf
(*UxG4�>|���L�
�])�;V�T�ÐQO�,N��%�_�˛�T�r��A���.�����Ż�Ԕe���]����RHKСeb10���
�
���	�G��68q�,,H<9ڪ���1��
���U��Y_u�.��f>�&±��8C�H@}#=��H��^�lzg�h�t�X
&J^����D�Dҁ�������/�!4�D��#��l�!�G��-E΁�5oz�Y��m*�Kk7�VN�[;;��]EE'��$���pɸ#�<�*ޕ�9��T�CP��X�6ƭw�?�<�
��x{���Dz�E����R������`�����%��O;��l�P�
�ybk��|8u�Yp��E��B6ݶ���o�qQ��R��f�__��p@ਃ�y�!Ł��y���vS�$��*�;�˸��Cr-WY5Mų�v��kDϒ53����n��"�g�����;3���X�쁘E�8K�v��k'�ߐ���04��F�o�"��t,�2�@�hб��:�E�3H�CL���P|]�l���9�J�G��G~��Η�n�Z�Y(_�H�>B_ky�9���D�K��>�ol��8�&D«n&X��������U�}��Ѫ�)�
��
�v�jJǵd����R�]��4�hR?j�'��#o7D
=@��A�m�#��cF�%���î5��Mg�7_‰^�
U�:|O@��q�����'�
I��xRBZ��C�
\�(�R4k��Y0���v�$�����i&��w7F��>#8�w�r�9�bx���",�
�%:QL�W�I�g�у�G�:�����Hʸ]Z%w���Bj+ ��8���#��n)���|b�vWxDYK�Q�����Q8�g,�T(Z;<:%����c"`	�9��X�����c�ߋ���0�48I�'���h��ۚcX�v����Y.���w��#i��5��f3����ݶ
nv�*k���R�<�9�"�m�W"��{	cO���I�:�շ����׈�$��۵����r"r��n�%́��V���r��F��J�a��]��q�z.��y����A^�Rz9����Z�ш�D�k�
8S�q�}ӳwus��������z	�;c��ـ�����l/-�4�D�#�	iMW�=�L##P*ImQ@'p�`���mY	@$H+�B��`r�7ڛ6
'�1�3���d��L����<t�L������sA�΀yh~��d�L�J�@9!�l6��U!�z���о��(���GI�8��J.�:3]�"b)�O<�v�:R�\�u��8^���
J���f���<��-�[�
ۄ[@�oe���&oa�k��Qs�^����HN�.����|<�@��/1�.*�=���@�dO���Hm�s=`)oG=`������
��H_N�S�ٙ�m>g��j�F�7��s���9��o0Q	�@��rK����z����Rn��M�\M�N��`�Te.CK�\oʶ�ﲶۻ)Hp�j�>kK�E�|�`7%*�Tx�ϴ����KѲ��	���p��΅R[����@?���%C@�w(���2L�$�Y�'��ië�N��|��,��8�9�m���O�8�dd��N,����U���y�yD�t�C�����R�,�J��<sS(��2�m��<�*��@����+�$C'�����؁�:jGR�aU��������qҺ�	��c���FV؃��JSH�(9gUG::ÏYzZxP�)c!i0a�n��4z�ƈL$`u�fl��*Y��~x��;���*(���:/�;���/���K%)�Xj�};��x�0Z���c;臅G�����*���'��z��&�[�m�R�`�SJ�D[*{Q�n���HPpj� ��/Z�NF��	�(q5$8�t����jh�z[�Ù��)8;��/#��ꓷ��)�+8���/qr2�?�����
�k#j	�f��Ч��&�jG�B;�H�Q�A�4�ma��ʤ޻dѮ��%�戅�E����ƑSڔ�ByS�q/R��(	
d���V�.PN2���eN��]��sg�"����H�C�/d88�i@=7k��ԾMI��DJ���>�ze�,����Ͽ����#_��r�Rҩ�(��g���"2Z�,ڤL
�-���
�NIP�&��ZS���A]�u:1��T��,n?��7K�7v������{��Y��FD"�`{s���KJ|��i
-���lF��5����u��t4
W��,�3
�'�q}�aG�j�[im���2�)Iwx�/(��5���cA���g�T:PT@`��γ��6Pc��L�r*ς.K��r�!՜�	!�A��s�5�-Ȥ��MS�X�|莂S����� �]�\=��A�O`��x�[j�jc��
l�ڽ�uݒ�p�_9���]Ǟtҿ�d\��Lp6e�`�M��8�
�0��iH�7��mcJ m�����p�I�Q䞄����� ^z�Qp�X���ɳd���=(�{`�W_\���%���-�J�� p�����P��[�i��I��c{2]�0�"�C���a��a9��X��b,~�ct53]��� ��ZC��g5H�\َcVe4�s����E�F�A;Ns�op��A��-PVo�Ť����I�k<I[��D���#ݶq�G��nׂ[����o�(����w)'�>�!C��[[͉ҢE�Qҟ�z��)|\+�tW�MSO�����Tk����+!��R�~ϡ�
����С�1S�f�U(eܯ��+Xp�Qtʩ�I�~x���5pC�-rɶ�R��W�fM*�r&y�*U"3ah�FĴ��(��1��Ut�TĊ����H{aj���X�uU��yc�$H�Og���[en�&�=���Zj����>趇��37q_c�CU}"͵5��tx���Q��۝�'��lP������۞���)����W���v:P����c�P���&�
��e0�`�iSfjft�3�r�՚[��+*�S�
`ޤ�e��m	LRI�{�ۥr#�]L��T�+��'����2��s
%�_�e*œ`D��q?7e��S�Ҋz�a�5��x��m���I�6���Ƥ��{�t`��^�	h�RE�B��~�<Z�a`�����;���Jqrm�_J�����o%U@ ̿�� Qcxr# 2�&����m�}��e��oG"
����%q�a_c��Fu��A�-�
*as�Q��ũ�
*��P!x�D17n}���@w;�T�X$��B�U˝���8���?�
���
|]~�f���;�1��>g��z!yB=8"��.:X�s�O;�W���揯1�]Fc��B��]��)h3�7� ���+��t��j��z����3,�"�L�D�!�3�� p��D�=G恈��)B
U@)'wB�S6Ma��ʡxR>N�[�v2�?���:S��������էf$G��{O/ql�n�;u<��ilƲu�Z�
YV$0Բۋ�%Su��n��8H�S/�S�ȗ$�U��dp��&D�jk'N�kA4����P��Tc�I
���k���%w���=��`��N�GF��CU1��S��5��	� ��`*�;UAԪ��o�����y>�������\kjC�)��T���o��]�vd�xӄ bm��4�Q�'�Re�w�p�<p�s�t�q���5P!���0@W�a���u�p���b?*vf��O����>P�����$��I�UC|(���kN/s:]��GJC�#����I�xV��ڳLݡqƨ�ox�v��G�?�.Y_vm���V��Z�gp�
��}��M&�2��*,a�h6�N"&y%&�,����{x4�Z�g�@�dz��s6���I�F&�~��XÕ��y�	vžb�2��v9zW�5�"}��­���^�ԋ�0%��j3V�s=19tVCR��,qm��R��q����Ҕ���pK��]4`៉�x�W	�C��}��Z9�}�����G��Q��M�}���_�[ߧ�o�ގQ}���i�5�8gsZ�Y'�]�^�l�x�|��B�]�w�{v@Y��ѳr�^0y$�f�{�Oʚí<�;�R�,n�_
�g(�bL ��
����[��!�^*�C����z��2M��<S;�K{�8p@kc���`��[s��-���鷪���m0�a]
�1�e�5<�.����d5���#zfW�T���0u�E �:��'z�ş������葊,1�Υ_`�[%�@�b�V�/�i��<���x���}<^Ǿ�5�|����$7xj�/��\�+�2;ΥB�y��W�w)M����U��u2�C��v=�I�^�1�P���#�s}hѧ��#��5C�ڟj� �2iDW��L���A}E�R�xR�7�A�h����4Mh[,�:#೙]��駟4��&��M��
 �ߊ$�"
]���Qs9r��[�ވY�]S�~�jz����g��(�U�6��M�􄡼�M�@*ӑ��ÌŰ�ؔ�Ґ_g��Q�E�W�z��د��D����8�_�$Q.�¢k&���(;�Ů_QJE�em'Cs%�p�+�6�v�P�T^X�F���Yr�0ZL٣�O�%5�{�4
r�u�M�7��u҂��b��l��f~��*���g����W��ط��>U'������Ʃ.�2����i�'��ja]_M<�b���N.�^�뜖�,��k�n'�,����!�u	�e������QEW��e�9��t��+Uë���^|b�DHXt/����Hv�;��j�S�X��I9�w!�жYc�n��a����}��f��E�{��+������p�-v�k�'_?��(o!ԋ``n�ĖZ  ޛ�{�1`^�.f7B��7�#���ȷ�[n�MH-#�1Z
!p[���73�mq�xe�����=讎��7d�*v���x]�K�S<�X����rNn�NހS��	���ӗ�#‚�S���
����x
�	-���(�����+59���4�cHm�������"l��9��!X��!ʣJ'N���b�g[��l���Ԩ��)9�$�aJ��I��:�H[FӍ#]��u^�n�+%��8�h#;�a0�CC@�Ё5�)VS��6��"ٟ6��M𬅩D��p�4�}��@�i��N�
mO
��:���F^ݠo��:��>7�Oկ7;������x���E�h����H�����f���]y��Cm�i�@�G����%� �
���J��\��968�]c��V�c�?�o����])[ZK��F���r����lXa�m�Lcj�����ٓb�&,�ڸ��Z���"A�ߢ)o��t5ռ���)]Z/��۴�7Z4�73�jQ�9��<KF,�'+ΠK�a��?S'�B[WN�iHL��I��vHF�37��7/TM�N�u��2kٗ�!w����	�\A��4fa�#@>���ߵI��o�$�9Y_��!&�˦�e�N@��!@O�{
�p)��j6����q��(aAa��0�(v��C�nS�>�Vu�ի~`�aT5:�*�)���v]���hj|<4���)p��߅ B �cp<g3���@�[o�����3#� ��2��4g�
|�
�/_��`�xh��ի��j�ڨbb�ȅu�&��x\�%�謡fq��,ա���oG���E��*ۮ��xt�������PK�mW����-setuptools/_distutils/command/install_data.py�V�n�0��)F��$R@����^���B�L����N����CB�Z"@���73vDž��u��˽�k���T։��‰(z��
kT΂;"|pH��z�Jm�ߒ�5�p�^HU`��PXJY�]�qE$�����a�|�I��G�R�,DE�n�q�mT]��q���vn\C� ��P��]�v�Ѹm#�1���������lE@�@�7�qR+x����;\k�l��Y��K^i�ۢ��%�!)����NX$�
�6��l�@<J,E[�U�
�`Е�Y>p�#g�?�¡�RFN����w��~iAT���\[ ��ȱ���g�&F��C,�-���M�˝�
5LgoaH)I�����_��bUoA���4��30�׭��KF6�-�L�<�_3W۠�{C��"'��c�aT���%�R�σ��-u��8#C�
��J�}��\�$�����
]����XvI�i�lV�����5���=�tM�jd_�zy�Ǵ́��V@������髚��&Ms���@ID�PZf�����9Z��1UB�@7��IPT����@�m<_�O�'�6��b8��<�bx�D���5�8Sj��YhΙ�bV~">��h��a�c$V��F�#�>�;��/F�IGa*jd�%��7��yǜ��6��2/�.��V�lʑ����
�_Z�IQ�0��BqC��>8ӳ�
������^x�Λ}���ot��(�o�b��_:�0������gN\���� Oty��q�K��.E�*oh��?��L4QӺ��r���k�s��9��C«��U��w���_�E��y��<�\����nw)��(��y�=z�:Ƥ�'����f&s(�f,�e讂�D�PK�mW9R)S+
1setuptools/_distutils/command/install_egg_info.py�VQ��6~�W��N@��Sz�>DW�:UJ�&U����î��F��e��;6�6�TE+��of>�g�qÍ,��U�1ٔ\˄��p��lU�w���5`�?O&�lu(9�JCsy��>�&~�����ߠC�fY�qE�V,��]����u�1I�:��UW�k>*��9�McՂ�h���F@q?j�P�Vᴠ�}:.����5hj�{˕����,0s�{�����3���?�+��.(�]�C�ЍOcm�>�USv�g��|�BlI�-g��	?5(ڐ����L��*����o�� I�Klf͹N�'���$��-�f�=3(Y���SЯ?�4%�&�b��t�w�U�cә���X�O.2W5��Qy�0�(�W�"|Bm���Iz���^���n|�5�5k�i�D�){f��GŃ�9�L��\
�����b�� ��5�\X�B�ΑpC��Q�Q�6 �]His�&�튁iC�;�	+��&�V}�(����r�
�"�L�������bJ�t���"�<��?\ԅ ~`֮�)�����o�NHZ�m�WmS�+����ٕ�ٌ�[�U���^���9lS	�,)]G���T�r^����Z5��K�|��x�d�C��WQ_?Q\X����<i�]j��P���h-W5LS��?�~+�zr�jQ7����r>�?���UJ��g�F
�&�N5�l70^@M�v������066u�nD[#(Y#p�
�Z
:(.�0��>VF�K��e�Ɯ'ɝ������L�Ռ����yU���c��%��@F�^˳۷�[VY0��:Լ�����4�-5�˜�_cB'?DAR$�Q��\ci�}�<������/??��/�\)�6��E~S���'�`�c��hJ�{�CB�,��a�SĴ�J|��h6�3G$c��DZ7����t2��$
q4F62�k��Hw�S�M�iU&�gr",��.ϔ�Z}��tޘ"�S�Mx��}A��S2t0�.C^��QZ��M�7E�T_�
�~I�� �,�PK�mW*Rj&�0setuptools/_distutils/command/install_headers.py�SM��0��W������rJ/�T=F�V����Zc#۴M}�'@��S�߼�1�s!��T�jM�7ZTR;�(U��hc�Aa��;�g�oi�
4���o`>����D�BN�ϋ?M�V�AH��7�Rq���ai�"�~0��1�0�>��t��ؖh��F����q6�y�xf��Z+/���#�0Y�O̶6���<U���2������x�r�����l��]�����L�rC}���#�_�R귨U�(�Ĝ��(l�2���%ב��Q�&\�Pu�mb������q}m��}l�����K:�	.5�+2�j��m���]�.<e�vVuGs���(�-��6��F��(���u��I&��@�F�W~,��j�.�η{)�(��ԏ�s�L	u��f��aUy��wk/V��V�0������F��z��zc��j��/�K`"��PK�mW����	� ,setuptools/_distutils/command/install_lib.py�Ymoܸ����'� 	Y-��(��]>\$N�"1�DyuъI�����H���\_��J��3�yy��$I�J5�������7m/�k����б=�$j�ȟ�j��RbeW�}J��ۃ���y=vL�$IV�v?p���/��l�=��Z5��I��`v9��n8[„�B�E^��A���/W��y�U�^�#�p��|#M�nVo�~�����w?�*_���՛��oߐ�l�RuT�N�2�S~�Z����D�wF�Ӟ!s�Hd�P�&O���o�������@�Ek8��e�?l���c�GgQ.e����h���oy�����*�nV=��2�?���,��W9q+�A�}w@�E�?�w:vj���L����ebDX��v��Ĝ���;���S�{��	�3���!���k�j�B�A�=rw�k�Z�T��:�tc� )�h+
l9���ZH�T���0%�;!�q�z&���0)A���F;�X�H���5y�&��U��-���r��XB�:=� �:��u�7�ni�dG�6&%�/Q��!�C��\m*�Vܤ�~A��R\�e��I�$�c��V.ݢ�~B&����0��1�\�p�!�'��X��/L<����B���5�����3G� FQ�6��c�)�@�
�����
�l�S֮�M�W$���^���c
���/u�~JS��O	�@�W�%z
@q{�VA=�X��a�{9�N~n�B��d>�mʜ�Tl�L�7�c� ����[�k��=��_J��?C��I�_�4p�ji�t�e�uM~핺��WZk����#*�y�)�Q}�נz%~��9�ք�
����^q����W�����[���)?2�{�1m������a��ҵ�H3D�[���~.
2�!���u�6�L��l��%�(�63�0U�=���Y��5r��V��A���M�3�C
��ݷ@L�N�q�XX�����ѹ�SH�����W~Q����#�:B��ϝ��Ϡ�A��
0���9Ph����X	�!bU#*q�>2u�
��H��ȑ�Z��q���x�����IB�(y��}�T�쯴�~��-_@6�Kt?K���Q*�ed"+I>U$1��E�g��2�(;;��tE���7ش]=jZ!�B�͂�� �m����i�ظ7��-(+H䕞�x3��*�3�J.5(V��R3�m��+�f��̈�wә�Q�v��ش�x�"*�hJ���_WP
��h�#�mvT�X�K[ٳ|!Cp.*힙������!��\|�݌}e�qƏ�*��[J���A���M�YC�mp��M�{�A��62��C���L��f-wql;����ݦ�XYLBf�ͣ��áT0c���G\g��Ay\��G*�,I��)�931�i7�̼�y|�	��D_���L��_��}A��a��k;D.��ޮJ=.�(T�ipI��
)f�t
���r ]��?�]��ow�*���&E!8WIP��8]kH�^�k�*$YX`�#-�?� �$}EQ��������.��� �G�ؐ���{g'�
c'�%$����(걔B���u4���޽����P>���@ KG��)��7��$�O?
$m�)��	j�Y������7��O���PBy0�C~��o�$�ߠx�e�wF@/�ri�	ӂ�����n�����I�S|(�#Ny%�aT�V�δ?�M[)�=�/���š�ճ:j����^�q��~
*�tP�e�L��k�@8;���	+�R"[4+`�KHm���Tl��z�dCDSp_���JD����>j=(����^״~�m�M~6���}(<�y�
����*w��������X1�(D�M� �[�#}�p�>�Fj�h���x��G�ƻ���&���n�o���/Ȭ&]��h}�(��$�2�{��a�l�ܡHh%
�S��WT��:#�?��� +�r�V�����m?�9��||r.��o86�v�:Oin���d�YG7l7i�/3��5���X<.�E�AXG��%�N&Z�o*�3n�=`�ʶfB5�K3��$�;�#Ơ�x�{8;�Ȁ`�',����w�{9�G��K�F�p���
2m�BF=̀���:!MGp�wG�qQ=uz�-c��ALmB�‰C�T?�ĥ����q��4|��(}���iB�,��15Yk�[���W��0Î�������u�kq��};O�(`^{�Ehu�Rm"��4��N����3�EkҲMԄ)�-�?��3�W3�����)9��4{�Л
�V�Ɂ�/�X�x��vD1�F��8�>3��Fl']NG�Y���߷�'�SWZ�����Q�����o�1�Az����9��Im��տPK�mW�:���0setuptools/_distutils/command/install_scripts.py�UMo�0��W.:ۀ�R(����a@w+ñ�D�-��4�~�(YJbg�2K$�)&��Zh3��EE]W�z!�6e��R�7:��w}�J��lB$3�<F
)�V!7ї�ْ﷈�8���[%փ��{xSj#J	ZE]vQ$����Q���S�
�[ߎ��\����ha6&>~->~~xEQՖZ�,��Cf�Q�j
��XB�C>���8ib��Nh��1tШ
r��c�ܡ]i��j����QXR{0��Y~��D[��dm��	A��S,�E6��jUh4��{�rN�g��A�g�k
�hQπ�w��8
�$2�=s�3R�{�V�Fk�Ky*ӑ�	�*T�az���?1D�ۆ���YF����1�%�N��u
���1o>�j��7)��$�s���$����58�I��",�wr,�+={��m�K/�9����4�g���]��W��.�d�u���:#�~|�0���z������(�t�;�Yf��H/d�q�-!�I��d��
Ѹ���X
�\����7����EC�3���΀��>x��۠Mx�X/&vl���>��p{q���31�?����j�/X�s�x�
�q�-��Ύ�jj�Zǹ�0;��V��\�Ҕ�3=uO~��2��tww��+�x��iفyM�\���bՖ���!�|B:�f}��ʋl��� ��E�W�i5E
�x�Лc�oPK�mWCh�o�+setuptools/_distutils/command/py37compat.pyuR[k�0}��`m�tS�.2�����|�D�hX��$��ikqs�Kn�;9�|�q"��+˲"L Lr���E�q���-(F��*�7�=��#�(�DT�TS�`+R�K�F��5%C�-��}�cI��˦����">���ڥ�J%��ѡ��:���IǞ���5M'�p��O�vm��u*�U�s��v��n����!�"���x�_�l���E
�!t����9��ܸpW!�1�?j����4x��n�v�Ƙn���tk�z`(^D�H����֬�@:�:��]��tPY;�"m��������\H9�Nσ�
`��A$i�
����Rn�	��>K�Y��La0*,�PK�mW����t
�-)setuptools/_distutils/command/register.py�Zms�6��_���!�Ȍ�8�w<�6��I���u�J����"U���������iz����b��X�>��x<NDQV�H�0�W�(KB�0��ht�Z�|ų�`咳���y��c�*��!���%_�(s�
��x<��X,yT�?9:|r|4a7"^F2a?�/F#�Z�d^���Џ"�U2M�,\G���$��/��\�+��d&�E���<RS���k����͋J�6!�2���W�i=���(NAb�-�;l��ш�/�E,źy�Θ?6vC�![)f�C^o�%<���C����ĭ*���ĭvΎ�3����
��^
��b.�,�	�	�?1$�Hh��Q*�V�9���!��5f�y'Ҕe���B���Ĝ�V�����XG��%�Wi�E�Z�"�J/0���Y��<�o�ۺ{a�$�3���^VQͦ���.w�/y��h5K"V�t~
��xp��w'$JV��k|$�R���r|
Qܩ%.t�R(�i��2�_�����>e�g�M;ϕ�J��-V�,����|
~c"��V�r���Q���I�?u��f�o�sZ���D�A0G�Ƃ���F#�[��k
����bS�
o��cga�И�*�f�
��b�pj��o�a�5��9X{�MS���)��0P�b�w���O�����f�!.8������:3�2>���|-yL���������`��Hk�˜����&�}�� ���*��D��d<aנ�-��;�}������ ��q���.��!�
���o�{o]�I���Q���:�}['�y��.P4�$�!ޤ���`9�J�,/B{q�1-ՂO$�v-dl��W�=���g�#a��;sVS�yzȻ�#���8r=�G��kA3ؿ$JW5<�.�bj��idǝ��В�%�	�C�����۟_��ޜ__�^�����1�'#���(��9��/T��+rp����~{��!��Θ���oע2?`���cE+��8�/c�����F�'�g ��*M-l#�c��(F�?k�f%\�5��N���y���MI ��~�NL5_�X���{�p��.�}eN�����s�:���$�j�(�fW3����e
��*m���	�w5h˂]�i�Oe�Y%R�ΐf�=&�n����~��}�vΆ���$�w���}��t�E?��4�@jpo�Q�(|r�Y*B�]��&dB���1�B���wQ!bU�҃���mK�!��7���ց�Wf7��OLX���WWoΟ�A��c�%Tl�8#����5�b���
">�OI����tAw&?�c�,#�)ӈB�q���̟���
=�c��BFBv�8u"��Wg���@@�^Љ���]�Z�S0"O:�Z�S��)J����,kဆ��0��낑F˥���/s�m
p5�3�X�
�Fd-�
�eJR�oh�	˥K�4�$��B}X x�%K����.x�|��Hl�f;�p�'�b�]B�8���X,���,F*Ot�o�BN{�Q�;�	Y8H�!��/v��f�O�Zl�H�r�%�B�"E�˾ ��1{�N���b��`��kAj a���t���A�}8���w��s:�Y�!'���Br��[Y��M�c���Rv�p��F�i��#��˂g '�	g�
E��%

���ᓐ�^����T��@��$vt�~9��r���U�v"[W�EkOC[*�.�t4��>�0���Z��w��.��N4�W]�>��2P@���:W̉���*AM����R��&:z�;!c'��{�a�?���U[]���J5�0=B6�Ps�p��^�}{�y�Y��Y/�4k�!�����ۘ��辳a%�lj�~S9L���Xpb�:�})ß
��+��J�^O��
v��A�u�
w􀬛�2Y�Y�e��_�w7�Kp|x�����e�eD)�I�pu;�\lD���:ǯ�P��2`�#�({v;
�%齷��f#��9*߻Ti��V9ml�D�W�N`ގs2?�2p6��`K��yD�P�/��s5�HH�=��R��3�v�]O��J����m���>ܡ@Gto�����u��E&�+U�퓟�o�~��@��W#�Wä
������'������/��h���o�m�[\W�wB<v��<��r�شs�Az��t����@z�w뚢%��e��ď��2uwjK�,�?���N�m�C�~�v�S��\�n��Ev���w��8z�S�k�mDɵ^�}�J�x�h<l/r��Ik߁��70�1�g�nd����
$�/���K��ג�\|DxY#t���m��	f��]P��;��M�����2�G�y�_A�vuh�����gD$�f؝�eol�<�9�~Q 	�7�;�6T�'L��j����b���=p{m�*k`-�$�D���Ħb,H	�m�ޜ��,@��ob�~�R��c���.D�4�)��������^��2�)IC���o�]O���iQ`�[��̠C�sBٱpd�¥C�`>�65��r�r�\�K�&:�R�i�V���ְ�q��l�S�|�׳���:�J�'�X�u��f����
��E��⣵�Ӳ�ۋ���5{ztҒU�h��Z�u��zVH�X�u��Y�c�t�͠M�D�&_k��Y.�1��5�lr�
�wݛD��(<�_�@��}~z��	�L�2=����_c1(�Uc���'u	M�D����a�;0��ޘ�p㝽��k��w�aI��×q�C{�;�����9D�-��c�9���	�3|��{?�}��Nj^������g'O/~��ū����yr�<?yz�줱s��S����c��MR���Y���,�$yxKG}ye5|P7���tCQ�U瓌=�ρܾ��(u�w�B��:�d� j��>ma�F����6��cA�+]%���?�n�k�?�׃��tH�B�F�Ҿmȝ�p4��K���KQ�?…>E�V����d���~1����;���g��N���JC������=��r��u��<Zz$�	@$6�S�4J+��M��g�퇽cG��i�/��!�F�]��*��;_�"纩?��sK%�{����n�`V�k$�'��h����~�	8������ܤ�oʳE���R��:�n���n��֣�J��U&Z-���þ-S��i�(��^�~��^E��B|8�#�B�j�wt�id�Jq�Mm�Z�3�1�UM+��r�z���J��������S����X�b�D�O;�m��$Pwm�w�ul���I��m�⡪x�*;����L�۳��	y�K���a>O�]�Rt�X#�1J�]���v��䅿�"���W�3
D�s��O\�Z�5�{��PK�mW�t��v=J&setuptools/_distutils/command/sdist.py�<]��6���+��r��It�y����5�s���.ۗ<�>DB3�#ȑ����n|Ay���L$h4��
/����З����x�u�I|tu���V�(�^�� �s3�%4 az<K�N�^0�d3t�`��+�0����b���*�m����<˫]�پj�L?����wuY�y����+�N�w
�`�y[��̼ޕ���w��|��z�� 3�=<x	�Á8��_f��/�t|ͪه�y�7���M�C8Nt]�Y@�q�p�_���[d=���*Ď�Cs����{�.o�|��o��bTk)�-�W��ƒ�$zR���A��m�G,�냨ڵ�0R���Z�Y�̬H����ً[Z�_�Ql��?3��ۻ�|������o}������b���'�@?deN���ْǙ��u����v��M�\�ߚZ���,�A���K�L�R���|�_/�y�AR�v��kv�?��ȿ�ƚ%nK���R2�T��@B�]��|���K{�mArV�Kْ�����l�0�v,?���~s=/x�S)��C_�;�A��\���L۵�aWvқ��0� :�-��6J�$�y�Jqbeo�
?�臮f�zfp��
�d�NL�^��m�bI�8�^�(���_��3��>	�P�7��g��z�����?-�+��JЏ���
 �V�z�L&¹(�
AD��`)H#�]q�L4��b@;�����uc�Pq�D0)�:�%����P�ي�ܕ9�љ��
��O�I��o�R���38T���m��=+� Y�v(aT�	��w������h��S���DQ�}�l�����uSWg���?`b'�����\t���쌷�j�4[�Q����Y���/q���<��r��Bλ���p	j8�*�py.Z�!�,n�m'~)�w��Y:+�I��z�F'j����h9Af���ѮQ�q����k(J��{�^t��,���Sq�kG���`Y��$�Qx��?��a��
���6*~L�ohBh���\�����E-�N(��Т�;N&�D�P��[��IZ��"c@����>;��������'j5^�sF���	%�R�3�b�a͇�4�)��o-���V���k�Ho�O�'m���v�Rh܍M�>��!T�ٙ�\,�b(2�4݀0"!4�!K,VY���uJ�Z쁺b�x���67, Ut��-�1�d�P�!���ȃ��&F�'1�R#�ų翾x��D}GҩoY��w~u@��&�uٗ�*�C�0N�f6I�jZ����T'�
"=��4�5́��N� 8/������[��N�/]���#��}7�'t�`.�~N���k?�o���8�����&%�8[��j2�d�(w���ڳA�M���o�FO(FoM^C�K��^�:�3��L�4޲(|���(z�6���t�R�0,Lt����4���;/b	r44��hT��7ꅟ-/�xn�	7��:=vY�t��8w��"�}����{�d��5�h�D&��Y�ك!���y�9FQ����:D,�)c`���yY��P�SK%���Im���E6��z�
ɭ-��K�H�j���f �̛��bC>�ԩ�^��2���]6i������3H��I	��#1V豍C�5�����Gq���CtWC��00cV��2cD�0ƴy>��BN�z�2	�3҄�]Մ��v�0JN�Fx�h& _�\�3������Sv��v'Њ�7�9
�+
s�))8�@���*/�wC��(�T���Jc����y����R�s�̇��+,��(?�©m�Z+�[�x獨��
��U3����V��~I4�M����+�Tc2��/�p��v�tMI���c��3�c|�v�����	�+e�z�����r��M�0B}C5�G8)B>ueY�L�z\�dGͻI�d�F�Az��	,J�mq�b"uATf.y�ʼnmŁ?�$�F�5�ݎk���5(9U�m*
d�%X�-<���+ǿ�6a+C��g+�N�x�E�(����Ȣ�esԥ�p�v�wx[�� ģ�q��'��K푭���ҋ!�Cc�hC�FfXh�J��k7��>� ���$nJ���[���&.;�Q=;���[��ı��� WF{#�ѡM��$�#Y�t1�"�OX�/�+�g�*�4EWPؓ�i3��w��UK#��D��j_ӿN�[���Dzw���x�+ށ���Y;�m{jƟ�jB�F6�C���Z�h7�<�`̉�0����7t��͹?��<6ŀX`�����&S'��
�))�ٞY��{����V��M{^�L�͗zJ��i���\jl"#�ϓ$�jp�;��s���'@�;��8�=2���5KQ�Xb�`*FX������D�LcLZNl�.����՚-,QIJה��U�y)��J�f`*yWL$�f�^ՒL\32��8 ��9(�+@4Ӎ���/sMa5o�K:��V%�I�嫟�~ǥXK
,�0�,��s8����V�xY��F��͈��n�01�Vt�r�WN���=�q�s�ď>��a]���oeS
=靄���ٚ��É:�'�O��N���Hm)�gI��}�玓4�vG2Cp��X�9���}��#�)]7\E�z%`���&:���X>��!�Ĵ��Ф;��A�+��f�z�f�LIi�ǫ)|�f4�΄
PG0���	l��ݢ>������qPD�U�Ƒc��!��dp�Oqn̩"�jSӡ�H}���	~*E.}���N�f�>�N�.��AK,\!�u�>��*�^X��Q�)��_�a��H�yS=���ԏ�WԔ�j �KA69h���ݛvK���	5�qҡ�*1�C Fh�@�7	I�Xf,o�un݂���m%,1��D�)+�hЊѢ��I[��F9��4��
D�K��q�6�k:�m]��GϏQ�}����$���v9�KWz}5�_ά�[�y��Ξ�TT%���9��(�Y�s����Rz�'|��n(5�.$G[��Y#j�ׄ0���͘�k��&g�� �^��;X<�i�3��*ހ^C��rґ��r��)�ѰI\7:���+Rgdž����)�vh������^��g�&ˆ-�3Gi'x��q�#L�<o���9�c�D�U��S��)��]��oٖIs�/���_>j[z��wf���8�Z�[sXi����U��F��^�t)���T���%{�����:IŸx~���vLs�*���%$�C[`������òuu���U���wM�0��x}o����9G���/��!/[�!6��O���=��h;�m�c�&V
։~tΏ�0�x+����D}Y���dLM�-��S���S[	:@��i���	�O����LV2A�||�ׂcE����)��h���87��dձ5�i'G��s�NS30��F8���4lԦ���$�u%D��z!����ԭ~����:��u�XX;�W��'�3��	dnO$&.�e�q���l�c���.bȿ	���%d�3�q����-���橅{Cm1�n����Y�-�����K@_u|;���K��x�a46���S�[Q5�ج���;Zal�F�[���Nj�dx'*��>Y�/�S �R�A�V�` �^H��R���C�f�N]��FҌ�xۦ�}��c�ۻw+v�;���C
�?d�����/ �5w�dN�q��=?�:�o��d��:�ǿ���Px�Ot3�F�)��!Av��[Z/S�ך;��D#���!��@�noYr*�����c�aA�<����ī=G&O�q��\Ⲫ%������K>"���^��o����@�M���˴}W���D.S�_�]������ҵ��rEh?��f�H��5>[w�*��L5��O�Ա�E��ȱG�^T�U{
��P�L����±�R�$�h�ֹ}�:�7X��G�
����#$���h,�&y�n۱<�/��b����NN+!�p�)(K�� 0�j�_^����/�#�l��
)��{&��M_T�g��{�M�ZW��2K/g�����Q��yNM
���z�����U������G��x$ѹ��5�g��'�G�6���t���l:�:��XLu�0�8�%��n����$Hf.Jf&z��9�\ٱS	;�gs԰;�G��]?ߜ��⸚SM���R��LZ*��gF(�-�5^P5)ъ��e�������󮗈{�\'t>�����1-jrYGNI�e�X���9Jm0�"Z�l��jO2��7v�9�LL���݊����v��1�&�����#�M�L!v̊	9j}71)�Bt,1HV�'xn4�G���v��[��������k�������BJ�N@�Gu�$�6h�
H�@��Kw=��e(��C"CU���~Px�he�t[�|
�F	T�U��~3�S��p"�(�&��n9 �g�p�b������=�!d�P��:�UIAQ�G��~�Z�����8�?�-�
�p:D��ݴ5%݁\�A��H�nU(�~xGϰg�W 0���[1Q�fQ�T�(b R :7��갎%����ޘ^^��;��*�n\��txˣ�&Q0��E4"�Z�q-�Eb״&�!����,2{#���U�j�4�h�v76BX�Cr[��X����'~v��0'Ѥ*|iZN��ik!3?�8p	�2��A�4N�7�x�:,ct+&H#$$a9�x�G'��Ʊ�^#�@�=�Y���}�=?oa�k0�-�N�A&<�� ���p�1,�Nw�J7Ee�Ӫ�H݌�F��m��}V5���ɧ����X��}>fN)�
���DF��	4�~��2w�e,<�x[V�c�uq�;����w��@Fl,�+D%��[�&�^�cZ�u����7D� ���kq�F{w��S�nt��I��:p�_��1'�Ha����] �=OŽ�*Yj��(b�{��[6t�;����k�$^��(x���/ژIy(�ʽ������1᝴%u���G�D�H���~g���lqe�4�z��6�X��t��<�sr�(�Xzӑ�\����[5�luk{�]+S�B~���r�R@��-S�ڽj4ƍ��O�gԩH��e�^����W�k��Q��r��+����`�z�Hd;��S���,�ۓ2R��:n];��m?{�m�a��>5�1��mZ�A	>�sJ��nC��cy9�y��ͽn˻yd�t��M������ԝe������c�=��H���7+�2��D�P�BA�~O\�o|B�Q�Y�z!b47e|U�e��_55t�l�?�d�� ��u)�����6�DhE`;�>nj�ŧ�?PK�mWj��P�	�'setuptools/_distutils/command/upload.py�ks�:����N؋i�&�]��>�6��M&���v<d[[�I}w��	��[ϴ1��G�<o�qY75�e���-����f��Ů�َ�$���w���'�IZ$�3R���0R����/2�=�g��]U����|���r��d��$T��'�}%k�BE�J^��"-3���F,�&k
�eŊ�\��|���:�ZE�d�z��]�IՙAQ���˪�ea�-+:.W����o�ن���E�2> ̻���f�'��l[6��l*|-ɧw�����eD�?or��� Q�p���+�x�,i62����,�Rl�q)vr����V��Vo/?ߞ}�]��xvs{C��3o���2�{�a5�k�~��k/"�˂��F�[
��h���{�P5T��+�9���󇋙��1�
���ym('��boG4"{�-V�B��㐍����;�����|S��u�D��5ϙD6-�F�bC6��#�� %y�_"����zO�)
�!�����UK��e�h�������1ؚ�ל�/f���5��0si>߁�2]AwD�}�Un|(E6�Jnˇ�`���z4x��X�s�Cv;o:�-U��ڭ��?��4t��n��EY����#(�l���ʌO
�=L��\���c������O�C�1-�5߀�H`K���}�E8z�p���z�>
y�#����Rn����J��R�-��p��;�M��	��3
�\'�*�x��W�AXH`�J�{e7���${/�0� mg��׹�c���Nl6��	[{�c��ȵ�p��a�*��w'1.h)�fJ�L���c�&�(N1Tob4VSA�!9�dB/��yzX���iD��=#%�
D��U�1�R��C����6
҈�d9�	�KB�	A�O�^$\"�*紨�ʕnَF�`u^�.��
���yG쁗�=�-�GG3���r�\S#`\E�t�j�k	Y޻Ȼ(PlZ�$gȑ<�y:��p�H��
NpZ��p��M
)~�3l�������<h^�kh'�
�J`��,�qY�V��b�&����o>�`
I�����vҰ
,FIb8�/��*6�9���s��@��;C!�H�L�WP�:�c�s��h{U�hM�B6S8Ƴ�:W/(���<0�B5pXd��d����xנN灱R���ï�@�Ac@S�<�:�j��~�y	n醒O�L|�u�J=3�:��i����_UY�k�kz�e]�e�j��?���~d.ED5ЅR#�~��� p�tp�����Ʋ.���%l��Ƹ�)�]	�Z��P�+֔��9���}mJG���mi��K�8�1k|4��l@
,�X�Ȅ�r�V��6ԯ m`Y6�� �O��#���fYA�c�[�8�e�9��7��aA�H�l\崆^�����Z�\|�5���X��PM��x�:"��{vE^<?e�=���ڜ��b��6g#�2���.tw8�1s�ʝ����U�0Vɴ���W:3�>Sy��W3�ē+z�k��qK#� Y��g܈P^4n�N3K:��b�:o�w}������&��y�T�x�n�Z�j@���4��M-�4����T%��~D	'dw�n��޺M
�/�2�//$T��#��#QZ�\��}��������i�N��-��T�Ƣ��$�N�Rh��]�@�����-#��][�|�[M�	�6�;T0�`p�*��	v[x	�����,���.�t���V)�b8H���OJ�E''�z:�on�P�S=���N�0Θ��%Л��1㧋Og�n�`��W�7��iHI� 3�J���y������}|�����ɋ���x�����˓c���ɋ���2�ZY����R��>(d��j6�C
�A0$�[Bg������e�nU�
"r�Y�5��.)0���ɿ��>��M
��R۩�A.=X|��à�o�i@l��5����#cz��4�EM-
��vh�J��0���J�t���S4r�V_��G�%���6������n-�,�(�}��4bj��c ��G�TH�V�.l�z=��Gh��N\��9�tR>��x%��;���M���<�����Н�_�ax7M��空j�ki���7TCA��E�!��^�������K�~$�~`���=t�P�a�-�I�vn�u�SQ?�2��|*1r�c4M
���[ �Z&�3��h����e�������(5�<�T�X"�C]�5���k��h����]�2�������e�n��CB���	�,u��B�S�j����g#l��d똰X�5I�MQ��y��e�<X�T��]__^Oܑ��L+Ғ���0���̃�2\[�&�Z��<��}�
V����T��{=�r��q����C7��]�"|h�'�N#E2"�y����O��ڲ������CF;`���c>�Ȩo<�PK�mWsetuptools/_vendor/__init__.pyPK�mWD�*�;!setuptools/_vendor/ordered_set.py�[�o������DJ7B'�^P�H�ՠw�C��A�v)��}薻��\���K�C���8!��%9����x<��ٿ�D�"���qת*2�S]�e*�q��+E&��(��b.��*��n$�ܱ5*9�y"��h_���Eq#Vof��߹�?��+E,7(�k��4ݱM�*�
�&�䭸�x%�;���r���]V�	���*y
��8|+E*�l
[���`?�}�R�\��h�٦(᠕(��H�S<�hU‰�"MlX��L�K�o���X�F>'�]����k{ٌ/c���_�.�L����Ŧboi�weY�-��g_�R�Kut���o�[���Gv��w�s���h��(X�X��lv:�F�X��(�5)��N5(!���l+@g2�	�he��@{��T��+1LP��|ę�g��c#r�,^����
����X\1^U�\֠_�%X�2qq�jܡ�q�h%E����
d	Pu��AA�"�S���5��:�e�xY��!�ؐ�^[�-L^u� �D-�p1;�1��i�,8	D,/47V�j��ù��.`2���H��Q��L+�!h�q)`� z��Lڑ�_��>t.�BYZఫ:�q��+Yljy�`?�1����۫��|7�P��.s6�/�������-���M�s��d��sUU�DR�Ӧ�8�Jy>j�gm�~�F�ȱ�{86\������Y_�~���4b��y���缑IkN0�x4�0^y.��b�D�����]qt��㿜��3���>��r���P5H�!g�����L��T�%����# )Bm^���ajA�|wbE�4�Т������.�=�7�N�9��8%M������h$<�%q-*|�(3 ��h�"C�^C�3(�5G�bW��J��|�vEͶ2M�ɖ��FQ��\D�̑���Cڞ=��/ɧg2��;m��l��A�%]\��P�F*���|��DŽ]�%3�]?V��V�vZ@d��,P��ʢ��n�
&�;�^���܋�1�0|D�
{�t`ԺF��
���v�[GV8l��ɗ��#���xU^�!1��jv~�\��fN莋�n�0#R&ml{�/�s��D�%󐤍)�Y�*��D��q�.Ι�q�YW<zQDn�k�b��hv��:�����ܒK@�{�ܔN��R���4���w�Q9f���i���3F�^C�
���A$\�
��1��GC������
	����ӑ����9y�o锄�r�
+�nTY�?E^��r9�� U-�"<F��z٦��f�����쮴��ʺZ�t�� h�-��b��/�E��&���(\
�1�V
Ș!'�.y,V5_�(�B�ئ��
=�=L��$.1]�d�6�;�Du`(��2QO���oq�mx%1���j�"�)ŭ,j�Lݢ�~����Ӕh�϶L��w��B-G�����*A�f�nR4s9��|+�\���
 �丹�~/ ��U�=H�<Iu���׵,���҆}����Ή�ln�Ȅ'�AQ�Iv�W̤�(J8�_;D(���()��fYD󟴄�vgR���@�'�5���UI��R���?㛍ȓ�١�v�m5�%�L_G�on%�*�]� �^��9p�΃;s�eu��-E-2=���(ԛ�ŚiX����o��}H}
}1ٵ�t,�N��\��BEes=�z��T�Lof{yF��K���5�Ń��Jϗ!�	X��<��&ﵽ0�����O���̓��q4l|�K�sIP_���:E��1~S^פ��4�x�-��G
&l�L�Z�6�7`��=�+�������BD��&[���:���+�f��F�<�iOez�)��-$]
�B	0��l���+�����Q^���k_�Z�����᪦)<B�{�2e�VO��y�Q�7���LkU�:a��ŭL�5�	���TBGe���:7��"-b8���7J{[���zV��&��D]b��<��CKQ�b��d� h���/�M<Q8t6�Jd�,ݲ?_x���
�(���{��ljH�‘J���T"U��Akw*��1�mAg�g�rr�ۢ��e�X8xM�L�^kE�,ɣITiu:+i�ɔe�ZI�
��{���'���-�:��/
�g�T܁�St�}�Xi>���O�{R#��b�����-ʁ�޵�n"v�c�Τ�W<޲��g�C�i����=G��R��c�Q����q>A�=�]ڒ��n+z��J!}�����v0Vz����%�ڼn`_}B���%�(�|
���q���^��A�7=�\sot?�a�4	�'�W�3���N��K��y�y����U���9t�%�
w����}]h/�tAB���՞�u�TJ��v�ad+����yQ~J�S/7�ϙ�r������OX�w��wAPQ@[��@��\]�5{��6��8(�+*��~�D�
]�ꀵ�f��
S3{O?���5�#6i�"&�-�z¾����f�k��fM-{
��A��1��\/�-Q�o��w�V(s��-a�"��W�6��^���:�m�50ᴷT��� k�H7ru
��!
�sȦ;���C�d�l�
��o�l	��(Z�Fm���r(t s[H��Y�9��%��؊�%b�A>�<�lky]�ϧ�6�yD����ұD_�%���mb��/�z~<���,p�}8}���N�
dYq�l.�D�p���S�o4Ěp� ɘ�� bg��O�P�c'	���co��&:M��P�:�~ҍ�P�
ư�^R�m3{N偽���U+�=�(d
�kSx��-�R�:
߬�&C��[�)�0�2�
��ӦJ��cEa�z�	��Q�̽CaMh��GKl�K�1�V�`�7�v;s>����s_�d�T*��I���*
-"ZƎ�$Z]�te�7���6��p�1V���
����#��)���Z�J���\�\�>�+֫˙�b,�.}�AԾس��A5�����B�#��S7�s �\��S�O�T�^���P�Do�nׂN�s}R&����c�>���&�!�h[�zˠ#���7 {�k��+���4F��+ۼ�Y,�-6��U�AoJl���tb���҆RK���P��gN��v#\��@4=Z�M}�V�P�Q�Q�T�_����k��o'uj�e�*e����]]�Z
^���s[x"���9�0����{}����~
� j8��;W^��%}��'T�
��)Έ6Ԡt	V�b��|�5#�PW8)�Ρ�c�i��}��M/���W{�q��|
S)]���P�Jm���uQ�uH��e���)�� D�0�G���zh��j�|"�&��r������v�=g�9�&�{��&>���B��!$i���=�5>�iǀG��
��Nw��5��9gp���Y��Ч����u�f%L��ؗ�.�w!�e��E���ͽ���'c,�+a. ����5@�{�,A�HA`��C��{�h
�O�4��~��Bf��e�EU,��tw��K�4Gq��ض������"������@���6�t#B�[��bC]�b�<M*�x�s�����E�>I����Dȡ/`��\X�Y�@��9P�ud��Q�I�_z�N'*[�LP6o��Q�O�����i�3q�9�"���1P���+;���O�K�O�9���PK�mW��+\�x�setuptools/_vendor/pyparsing.py�}m{�6��>O��ܮ��Rl��n�]�qZ�:/7v���x��m��H���xS�o��AIv�={K$0��`0/��i>�O�`v=��2����O?��v��u���WA8�kk��k�_��x>	���w�H��뤘�e��Y���yR$'�YgU2���"I��4���YU��u0K�*�'U�f�:������s�T��U\$P~�e���@�|4�&YW��i:I� �α;A�@*uz��8�'A��$P����:��UP$eU�#A��d>����t�J;��R"�y	C��F����&4��d������ɼ��%>%V�=̋�L&��h�u�4�Pf��J0F�_��S{H���y�A�ɘƝ���_�Q%���i>��W0Lh8�8�rS&���'�eB#c
��
zͽ�I�Փ-����qB�g$B�1�{RV@)��,/�]w�Տ�w��W��~���߼��޳�gAg�~w�৽��_�x@�7�/��zl��{����g��ݟ_��=8^�	�^����}{/w�|����)T}��0��{�wp_Q�mo�=G(/v��|O������=
���D���v�z����Ώ��o��?�y��`:� ��{��
4��b��!�
چ����wp�>5��#�
�r��뿿����W��v���]���]n���ii�oh�g�/��ۥ���*)}��]zMn�v�^�D��zy�~~_�9Ե�;؍��7{���o^A�]���@՗�1�}G z���ǃݺG�v����7'�'��O�CX��a����N���'�)��v&����	��qɫ�4͘(�w��W��ߙN��l}���G��)vh�J���x6+�xt�	<��uW�W�NgPW�f��R���%,�I���u<i�.$,��N���'q�g��pM��'�]u?��:���8Ϻ����$.���*(�����P0ZM$b{Ӹ��C��속
��"�L�8]�8O�� ^>�9���
;C�G����#w:׸�YÚ\#y}
3�
��'������O���F�����g� �N�sa[��p|�����2�̙�?����x�K�'�un`�8���*�Ϡ�X}�=@�D�e?�i�'7̝��og� �$��;��}�}��U���p
�On��g\A�΀NJ]��+0l�/�3'n{�*��.��Jx3��`V�mn"����3�D
t�Q;q<��ǥ*yO�"�y@S���e��P�r�^� �D��}�YG�>�	�j�����s~��?vN�h:�����N&���w`s'�Go��G]zԍ�n�����Y�X�f*�ń��b��B�ޯs@=����6h�E��l�}��I���$Edd�4)e3�.	��.=��)��^�'*z���IU��F^$l�@
4�RH����ǭo�G��N��F#�{���Hf �T�aX�$�"&�g�~"}@�+�o�78�9E�2�&
�0��é0$��z��@d�.�wX��<ɂ�"�%\%�*^�J+��ABi����$E�Q�s��4O�\��hSH3��AL>A�O�j4�Q{��sĎ�O���$��3ʧ��~�]RQ����m��O����O���)s>��ɼc��0*�w���\�yY9�+�YB�"i/�M��A�c�P`V<���]�[�f���讙���֦ $�9��	K�X����A<�"��Y�6�33�hiCf@Q½������M ��+)�Wŋ�HT7_e�z`v,3u��Oh�u���yZ��<�G������>ޅ�`�%�y��"�]���(|��wA�I'�ه�	/@�I^c<� y���k�L*���P��@��N;;�c]���a�菐�N�D�8��P2��P�{uj����.	�dPfO��K��h�ʜ�<�2"�}X�����`c��1�ӄ_��� �tL][�����*
�(�K�U���Y5��u�<eP6G	���d�%�j^vO^�~B�}��Er�vV�
��
��
xz�k_��;r2f�z]�H��b�$�d�#���h�?����xtQ?��!�P�@6�IuX���U��!6�s��T�7�9�Lލ�Y���ݢ��W1D
�e����GFEc`��d���!�8AarY� �A� ��S7�1���j��5���Ϋb��H.C���p5�+��l��
?fqX"/aQ��	wPV��6��A6X���=>
dA����y�6����|#w���p��iq}�Ix,
Fj�!���|$�=��|�W{�bΊ_q(�0��Ϊ�.���IdL�O���I���|2���p�/F��n�����?�C����˜~��j;�6�6�?&ׯ��񩏾���S�.M �Ɨ�TX�n����͂��G��*�%UK�G�rt0l�T�
>�?$�\���	f�2���f��7�Y��\��C�ʹ� �h��g�y�~�_$���#�"����?��'�X���UC��}�^���Z�L��듔�Qrg���a|&?_͒L~���I���=șpg�aG�FvM~����/�w3�N�����E����:>�؈�����f1s���^�ҷ�*%�h�	/��{��c��j:1�_�n_&��&�z���d9A��	�pEM��͟�:p	lW;�D?y]$�i>/�r����U,�O&ϒ���HQ��Y�S��l%)��R%�Dm����y6Rd0�=��Ư��N4Y%���(�f�c��p��i_0[�M�eUqv�/�pJ{��$@k�F�<KG�8�a�g6!�0���qd�I���rBV�������L���)&�f��;�p17مZ�11��x�����6RF�-bq:��>T%S�}�NQ�A<q{R�t!�m>��>|e�JGk����i�%d��y���+��2��l�x�b��۪ৈ�����c/U%q�
���x��Q��g�[JQ�C'69����
�X�{��ngO�&n��|�$�@�/��G�G�H��#x��Y>�F��$��2T�Q^�I���L|E����5�1��4�0?��g� �?+�Y?%�
9.:Z��<r�lBG"��L� �	ί ����Q.V�G�(tʠN�t"��X����_v�I��MY
HeA���E��z&)�40�	�."5J�����C��-�������a
S����I3&2	��l\�)2��ɵH,�����4�T�Y�~#C-��T�&(��T�' �_�^5y����x{� �])�9?���a
���F@��rI�gI%��!�Qu�M'�^�#��d�gC�p�R¢��{o��m/��j�ن�xz2��j3�};��h�.��V��66��ǽ�=�y�f@F����m(��ݎ��/`���~�~�9�wr����P�?��O�0���p)dR£4���B�D4�w����7u�l�V��������c�<B TJ�F�"�R�נE�����P{��O��r�d,;�1�#���4x�� N����O?!^	�;L�QE���Oإ�����q<���I�H���}��Ċь0%�S���1X�8�B�cf���tX^OO�	Nb�OOw�v�r�̍Wa�O���]��4��HpV��P�	�Y^�9��D+�3��f��ю9�8$h�F&]�zTA���B8tV�w��$dƬ��H���',�S+[��A\��tNJ�@!���φ���OPv�>n����G_|�՟���/3��o��ӝg����vG�R[r����I��;�1"�f��wgJ��;�_�4G��bT:���2�+x�e��Ոj�"C�� C�&'���u\��_�QuI�\�752A���n�smW��⍃����/whQ�E��h�R`t��7�)vI�4.I��W�ZKC���C����A(m���S�m�V#��:��$�UP��Z;4Tŋ�������1��K��o\8�o;�~c�š��){�j�†�I�J����2i��G�zg�#�x���{�sv-��tS�Z���G�#��}��X��+�"�ėy:.X��k~����N'p�-��x�>?�U��.C����d�؁/� �8���{��;�m�����=K%��ꋲ����x��PC?��3|1P|���$)�Y�P�f̅2�'��n�Z�t�E6�ZđvCA��:<�N�"���P/��X	�>��;0F���vzm��`�/��
k��S`��R���5�Y}��;��A�
Z������-�&��طv�	5����$�����)�._�+>y�[��4..��ټ�q�ä8PG�Γ�w܅����#���I�R�!�
��|����#�1*(�;���!�Y2B;5Xڎp�P�
e�[Aܖ��~�n�2�1�P"A��mMG��u?f;�}d@��I�1���;-"�H4��f�܈�A��!��TוVjI�)�"�w��ȯ26��y��P|kMm}+�y�2���̎��vs�ъ�zPT��	���n�gI��YF:(�v��*gcG���}$�����=����H�Ģ�|zN�Ok�����;X�Y�R�k�����:3�u�jvݡ0u�0(ԾCYL�x��'�$�=��k���c�xqf���C4����[`q����t:M�h!0�^�m�J'���/x�O�����(�8�����t|�=�m�k����'7p����O=3NQ},-z|�*�q�r�1f8��b4Ո�`��]8n�o�oL�MR��$�=�dU��%�7�lUFuh��!�d�>}[�B*��IMg��H���oX�m��ilrƢ�*}�}�AzJ��l��bI���i�� as��x2���]D)+��[��5�Ĭ[��X�Q14��*
����m�x��8�C-ܙ�I��J�ilj3yV��L%�@f�ж�Ȟ='��CI"�>A����,)�O��j��[�W�g���m�5�hr���i�8��1"q.PXf�j^��{�6n��*�y�6K�q�Z���[�|^���o��'�w�x1����?G�d
�F;[�f�V���snL�bJj���(G�G�n��m�k���(d,�&������sbth28����,b�H#1��$E��4���
P�
������b��SIg$Y(�{7=��6����wXRJ�hTo�֏oj�N��������Em4[.���'7�����-C²4�J���<�\'1�` >wv
}��y���Hq�A��uǔ��ɯ�����MM�gJ:�xP?��f��&͛�{�!�j�8�Un��u��Y���K�]��o�o<|�n����B ��l����N�'�l�t�^²�3F�:H�BǽN�-��m}�%lu[i�;�EwT�W$�����jc>��`��z-�x`��-��x��Y��_�w��‹{��u/��F�b���]X�0oz<X�B��!�n3�>�f�h�|D���dž�<���=D	�F|�r��U7^�k\�n��$_�xB߭]Ծ�P*H[t^R�چ`���u70��sK
��P(n�]of�q��t�p[,G^��.�i�UX�]s��(��J1����W�%`?�O_������eh�x�U�[$`�!���K���Hl�Z��*Q�8�}�����j�'ߎ6���B��{Wj�X����4�^G�؋^x9fs]�Z�U�%]҉in6p�Eh��;U���8�V��	�`�J(�uä��)ל���T�n�Y��>6���P�$]/Z��;��7Ŭ�DL��6���'��lPɨۍ��{�A�	��뫃c���c/x^y-`�͛�Q[�<������^����k!�[5e>���Mk�5�E䰤{M�hk��>� �u���5[�!�o{xT��+ψ�w�gJ٥��{�Ft��J�F�zKfs$}m�6�m\��[��c��Q���ɖy��(1"��4�R7�wk.�.��r�]��e�B�.z�]��!���‹�6���.�]`~�.-D���EdLr{'hr���6�]�Ҷ�/aA��نrx����{S�!-uiRZͯ�z�Eh�^���ڼ���p+hԷ��B$�����I���.�{Sc��yi�>��6����S�[&��{n/a�6|��ޱ��/E4b����@
��pϽܑZ�힦��3�")�ќ�p\�+ W �$�Th�_6����}8D��zւK,\$$�s��

�wA�ͧ(M&�щE��(��u٭��1�ߟ�X֏ͥlӣ0K{��Eci�J�&���RL���շ��k����D�?U��6���*Hy�Ϥ���L��wURx����GY��X�h�-X�"�.=ZmX��qIv�6*����u��܊���%�(F�m6��|�Ү�'H��jz������y���%�&z�શ�~�҃*lu?�N�R+2R(lj��¡D-D�C��:@���u�4�ŏ\Am��Sshi��C������$�k/iء+�^���C.~/</l��uk�bZ8�۶��Պ����Et�bt�~�.�0[ҦB%_2
<�Pu��{,벚�ߵ��;�C��F�Z��HPqɓ�;�I$����B9� ���_}�Rw#b1�C"�+f4��n���\�آc��lX��J��!�`t�DuD�a�Sƈ{ys��'G:�gJ`������~k5i~C�GS�G$��
�
�i��������nz���������<�:x��{��
�k�1�F�������
��!���pɂNS�C�ǣ/��=Ҁ�Pi���Mp����em@�HQ.b��ٙ�X Y��!��A��ɵ�]���אj$莑	Ƚ��fg���exM&&U�lTp��j��oZ �%`��SL���;��1���W���2}R�`a��,�U����ر�[�7�6�;=Ԧ�5�_?=���
��i�x<6��́�аݦ��$>I&N01�_ ��!�����t!��oH��P�~ZwS��z̓6FC��"1lF±Cx��TY�N�Dȴ�(*��c-F+-:V�%��V��m"�e�	܇!ܪV�K���l?�^lPҝ�%�]�[</"�w:!�2���_�a����i����
t��t=3��q�/��\�v;ĦsZov�R�ph�(s�WR����e�.z�[�T��Ү��3:�8��e�:�5�E{�*�bD�xD��51iY� /�w�,�R�n��A�EM	�LT!�#U�oX��H,QX�DG�$��2�,�|t�]K1����_o�4�!��e��& �v�ˠ�����Jб���t�b�Q`��1"hcTE�n��
���n��r�[Y�����_�&��k��r��tW"�Bu
�z�0U׾�w�P�Z��#(����^s�����F*�)�+�ma�Q��l{%�j����4��/����"Y���ޭ&�}lA�	�l�!qpk�H���ٽ߰��)B0�!��B�'
����5��n!�:"���r|Ak�dW�Zl���Ej���-n>�ࣨ��`��	��_�$�������=��j=iBu��-�jT���;�	{�E��6�;`�
{5�F"�{��)��*���Q;H��t�,;�gt��֤�h��b�{pF�_|��j��#�Xԕ���*�_�X��\i�t(�If|�t�'�O�E�2��sB�R�CR\%���1���j�c_�$,2�,�A���
����4s+�}zLٺ�]v(��ZOw�9}u�lR^�	�����`rQ
��7�b\^LN����_���B!�6T,��G��-E}����RӢ����K
1��WS2�M�TK]�I�i���=ܝeA	1	��M��GVF��tIY.�+�h��-�v�=f�X�퇨���	b�t�Z_���P55�¹ެ=�Ѱ�~Mu����k��.iN[g$'�B,Yl�t��T�W񦪏����AA��:
U���'%^yj��&���6�U:B͆�#��\�-����/i�HFO5i\z,t
}���[��L�i_�Yņ��=�۶vMg��F�zm�3<=���aA�%��mR-�T
Jm����dYLL��zk�a�tO� ǹ��L�o
,Y�c���S��Z9ccAz�=���Ea�*;t#'SO8;��Gcy ��h�p��#/S�����+Q�9��K(溱%Ζ�#Գ����s���1�E���)�m�6������V��4zV\�Lf[ݮ�;��e;Px�i4�܂�6�����Z��Fm�Z��޸ V�)e`q5���%1�'iܳ젤u,kD��2om����H��o��$i2��_u�%l�]+�7�d|�K0)�_�����	jI1��ٹ���/)�j}
��75t��i�F՜bĆ{�9�>q���N���t��]m� �+$7�ha��/�d��o�d�{F~�YEcl_�t(��gT0��j���/{��h������U��9�k�G6psm`�۬
�ⷯ�Z��
�;U��f�n�Kj��^Fjӑ_��{x�Oj�Jl�8
�wa�M�����=x�E\�c��F�㓞�����
����^���j� Sk��;>����h�Q��_u;~�����.��	6�,���#J�B�1�:��p�1f����a
�2�|���t�[:3mb���&�F��}��%��"�'�?��K���P�j�:���bi~ V�'���ѹiY�MCQz���:��c��s�iTp�mz#�|�����SN�����^��ī�PG�n���9����d0ou'o_�]��#��t�=�%hw��Hp_��s>D��6v�)���7||�t	�@�����w�
�Tg9�<���{o���~��
q��}%���Q�~�c���;l��2�f�VV#����n�4|�I�(�@o�D
]�Y��ɱ�3fu(��l�� �����
[����R�mf<j�8�+�\R:D��J���\7��c�&`Y�ڇ�b�G�@�}yt`�vx
L`�P�=��\�\E�Mr!�'eZ$�]����	��}P�ڰٿF��<��0�
�v�ӣ���r].������E��Ь����k@�%��)]�,p(�t�w_XX���`T-J�w"U~=��U5��#���[L��p�j��m^j�B����G��Ȉ�:G�*�0���<�x����Mŷ�������������[�~�n�/�1a��G��4���^��@�U�����L��E�^���x��RN�>���^wZ������i>���uf�V6���\\r`.�M���x�u�ڝ���l��5>��FUE�eօG��������DzU�,+��\F�^��~>��Ӱ.�����jgֵ�,Z5"�4%���mꀼ����-�ělX�Ʃ(==MH�5��Nӳs�� X�#ʂnā�z��̆�r���v����?���F��x�9�����؅�{ݞJ��MJJnO�3v(�1BJG6 ���O?����05*�_}�n
�T�ϒ��䩟�}����ޯ�c�@l���F�������?�Opocc���cS���<��*R�+jƬ@�]�P��%��
u{�ll4h��l�����]��._ڗ�Ɍ�>X���.�pϋ�#%#�v�^,6��պ�O����ZY�cט*��gR���}&�.�7_30��9z��������ęq�{���Dm	g�n
�g�9&(&��Z����,�K`t���~"i��y�B�VtR�)/�S�5r�ЗK�Q(�=��}�\�!��$D�5J%>7835��l���5)��?�o+,�
�/���vY�X��_H�@3� ���-��Ta���Qo��UH_52�<��;����@�-��E�Ie�Y��۹衳���u�^_]G/�&������_�P>�t>/?/����f@�"C�� �ާ#�h5Aq�
���	z�^^2qJ�[���,9M8
0q\�&f` �Bi��M$ήM7�KY,'kR�!�R6F?��׮��m3�����f���6C�9�||��_%��EA!�P/J#�s���er?x2>Z�<.��+��f�io���V�}��p8A�o��4�un�;﹵�u��I��T6Re|_��y])���{
J�2Ѝ�F?�ߟW�l���q>*��x�g=��'E\\?������
��ʶ+
W�ʢ�`��ϧ�#�KbuW��cen�7�N��h��u��X���Ǫ���r��V����D��Ma���,��$
O��`�����^����	���]�c�X[a�������|tO�ώ9 @���Q��WS�m�&ބ�����:�l3�����ś��H7��|���']L��^�|bj=��ħֈ���O�㚪���^~er�O�#��v�f�la1��n����G#���JX��n�'�0�g�m{;kt���Xoڕ�F�m5�4[�?<s.�xiZ����g+��{�"��"�v�sH�D���+A���fK�^�Nn+�Vu8����'/���l�hS$g��B�RA�Ǟ�dT��F�v�TJ)L�bd��\G���4@�?��H��s�����!:R�m��S�:�uu�{�Wɦ��Z�Ib�B2�$�f=7>)�㢙����$�K�<�6]XZ���/�9�>~�Փ��fPτW
*�M����D�L������'7�V������s�>)�bh�q�L�+ǩL�Gӱ3�+j�W�|��d�RMkϜf�t|:�_B��4�Cs�I��V��<@ϡ->����A9(@\!���	�	R�4�@�f���B�����F�un��M;�^f �\7I+�t�X8�ЖN��+*;H�@g��g��F��9`1T�ŌRu���ROl�-G�܃�M.*۴�z++�
���p�%'�3q�C�h�QK�:i6
�Av^��J��OitY@F"�o��i넟�#�1�lA�ףL{��@�@��s�Nl�3-D�x6� ������7��z��n��jtH�..C#�;jt�ΉF� �M�7���l>��-�7O�@��gy�!C�]�lPP|Qɽ���%~s&
adf�9�l��m3�]@�p@�f`9�Y�!�0�|���-��pO&%e�뎓Q����;�H�t��4�X���.۸H�k�`RAl�B=VR��`v�w���GF�=R.f���ӷ�����cj�����Ǯie4��M�*�((Dg�:�<����Q+���@�Haϔ�׈#�Q
�*uu��i�u!�WK�y�^��#��y�Q��s�4�S�ny:3�a����*�m��ƒU�z�f	��5��l��׶�C=
��l��@�h��Q!�Hߣ"/�>���&G&���S���"�.�]E���hM���QGx̋�`�LmT��̥J�&)�h���Kb �L�&�Än,8`�Ry]�� �hs�w��Q�B$H&s]�4��5WOzOga��'��PZ�L���@�dF�H���ЎvR�?j������H߹�=-�|�Q�q���H�����Я�z���KY�k�~dU'au-�"(��kVE��U�9�cXv�Uz�)jڑ֬P���æd��z��H�WxOy��Ur?���Z
b�2E��V0��[���云��J$�t��	�A̒,�T�GP�s�������g{ϟ�оR��=�_�=�y�l7�~��w�Q���ݗ�������x���� x�&x�����E�������
^�|H��3=|�����
���r'�{y����f����7�џ������+�����3�0�C���Kv�W��,""��,g
W4
0W�Z?~�;`i�Z7V�~��,�;%t��Y�,��6˶�r�mj��~��)^�tL�2؋$�i>/d{�d{n ]��)���6/�{�7�0�u�Z��N�kr	��86/'b�mbk�C?Kn[Ɔ8~�k�jى��Z��Z�i�K�e���h�Ԋ%��
H�<I��ze�Qb:�Y��-�(��c�s=yߞT���9��z����b�7�GT�
Yi�>j'0GJ&�d��,g˨�)��j�����v��$b�<_��S�e:����K�v�o��8����!��7���m��z[H!�$N�2a�XIFc98p����=����x <���O�),�T�9�����v�m._A�E:NJK�u��0�.�V&g��r�Tr�B���xk�7m���z�����/��(Ѩ�]l%����(�̿���M~�z��R���,KO�Q�9���Ƿe`�+�"�#����	n!�4CL�S�I�#8B'���.�y��i���W��3������X4��U���6�@k�X�857�]�?$���z��$~�T����o�U��!�a�<j�h�x(�°w�d�0_�	�J�Z��1K+1斬�S��zN��8���i�q�ϳ�,��m����l�Q�a�[9?!�GN^\?�=s>C��i��&!�r�qzi�+�@l��
n��tV���@Leh� �<^1*�2J:&�Up<�L�kV��Ng�*��icv�'���$�U�H�XV����\�&�C��i��e[³���u�;�,|�����L'd��/��>�x�P`��)���V[��H���/)3!�}��id�iy�Sr��b[h���c,�������	�S������$ɢ�׋B^@
�m0��^po9�LUw� u?��y]$��Ƙ��<Ek�1��b��b8%���3Ң׮@��w������I3�c_��
�SM\��1�zʎ��%�o'я�Ȕ
4�&��U�Ez���A��C�w��d��%ޯl�����z��~�w#��q�NZ����/pw�5�\AM���{�V^,6w��A�VwGud�/��ւ��X�!���ȿ\�X��Z|�嗏���_}�ţ/���+c7�u�^��&�sb�=�^	F(�;����L��͏�Hkьf�ްcs�Y����­�X���.ӷ�+;u�^� A�uC�C,�0�J)NJmA<m�)lg��e.���� ���=�z�A
(z;��X�v
��;Z�3¿�4?m�k���A/1}
 .X�E�md��:�o�yFmnC�vn���Vk�ٛV��muc��7��;)����FbG��^���=�q_oj�Ф+�q�=��y��R[��5��V8+
�3=�WdC��z+��A�/_�n2Y�Td�}\������JȖokh��wS����'Δ��z(��1�\��͘A��HB�2"
�
F���8vc�x4H1�si����|N=��8a��Uۣ�''Er�R|Ԕ��{Oa���A��qn��.ڷB��YӐ��Û��ۓ�R`էL��5ڵN��F}�l���w�@�XO6���*��ќ��H3�mw-��%F� ��%�Uع�`�:�l��5o���u�4i3/U�9B��߆�`MR��NO��t�|��>�Pl�S�����ghIȥ�l|"�Z�S`4�E���:���'I��fkR~��]���t��x�h����-`�ķm��`�4Pg��ԶKy���È���qL�ƹ��h&�@A�
���K�
p�|q�I��I$�i��a�{ew�2�1
������a6����'`�"�(>vVe�u|M7VT�I㗷��l˦�,�����X��YY���N�IAR>GW`�:tȼ��i�(�N����xm^��fTg�]�"�ֶ��]�e�q�ǣ�i�h��i�wc�V���F���f[��Fu�W�Ŝ�~����l@T�'���((�|�'�Uς�V�C��1�9p���4XU$��-3���Bţ���q�^��_�Qj�{GY���iF����
�6� �Р��c��Ґ�j�F�S���"�Ԉ�+�e�,L���
���R���1���P�$�Sx�����YW��`�t�Ĉoz��cڦ���Fy�MB�2��8�y�9$\<A]	�ַ��1
��s;�rˎ|E�q�|t�q�||r��jHN�;����o�x�/~L��o�"aJRDQ�Y�AgӦ�Ѣ��U5��X��RU`5�1_+g�
(�xL�w�3>ԮoȗG�mwIm�=��ɰ���qx��d�%9(e��uDb\�
�Q��R�TJ�,`i��G�N�['R�J
4�i����?�#VNxQD@xv�y��Z��ƃ��Ct�(���y~i�|3�LNKL��اad���ŷ���*sD[�e�L�1���3����1mjD�S
E7�n�F*"�C�0U�Hպ�$ �Jˢ�4rQ������E�������#|rb��l�'ϱH��Ai��[����sr�-ǺAi�e�������T���� �b��}
}���X���V�|I�s8B*�o���½416ݿ[�0�����/��]�ì�5�� C��ZjD#㾊�ׄ���Dbu��!fq5Z :��-���xB&G
W���5�
Z���N�+<����Tj�4NkA��
�܀{�6�Ž��6f��6�P2����r�E6u��	]��2Pᴌ0��5��;m�;��V�]Q�]Z��c7y�%Eѻi��>Do�N�n1>'�32�2F"�1Wxέ�d:#�?,&&{��F�O$aK�Bժﰪ�"���'h}m��r�CvE���f}(���͍��PX	�y�h74�r�4[J{C4���I���N�l(�,BD����,�aL���u�����
~�i�i��;S�ro� ���$��|:�5��f-tG�^}�"dZesǖ���������H���gG�(�c��+ݹo�	ض�r`_��M�+n@���BI�5��y�����Uy�&@Q�|Qհ"��/E,bu�"/f]��/I;�����j�.ɿˉ���Km���௳"?MU�Z���N<:okf��>�����
�ÆQ����V�T.Y��˃�����t'�;i����6rW?�>lX��D٪ow
6�\�iźs��L�0o���X���^ȃZ�i4,"m�
�X�A^s9������Vѡ'��l1P�yn*�iƅ%<��U\(�٬�”�F"�^�?g&o~@Q�
����V�O1L��6�|�|E�Qs�rGeA����j�Ԑ;�Қ��
��F>m�Z�J�@�8;�ʏ�Z
́Pמּ=թ;ꡪn^���b�5@�$��c��A�V����h����zhj��Ή�t&zK�1Շn���-�N�9@��bq����c����3��z��1�w��E�X��[+�ZD�jZb��Y����[~���Ր�P}di�e�����[~yK}>ަ���nk��B�(���wYea��,��Xp�t��X>�O:��u�i�����v�և���'M]�<p–��z��yX+}�� )V�V�P��؊-��er�B�%m�<ԃ��x�)<�]<\���eWl�)�;�UK^G�՞���F��=Q�?f'�TJ�|��]��赯!��u��N\U=h�8Pw��8?���a�*�y�ICZ1�D�H�"�/�҄���� A��A�|�ȱ��
c�e<��+u��Qc�	�g%�#���at�[�m�)�u�Euhh�Z���H��5
tm��p��'E2�t�-ۙP���4o#h�k�����^:�2�$���F�%W"z�nC�
��į{�,_9Q�j��.I�����5��{��~�q��\/:�����>_����%�f�2��ҥ���,g]�KZ׻ò�uﰴ�
�?v
�;~`}OSJ��e1i'�Γ��X���zWc_a���+�tiǠ���[ַ..戧��z6����k�^�{���%,��Ɍ�Z��:Y��H��6&.��y .�;u��Ck�"���z
��>q�'�|9�w��k�������_����b�#p�J��kO{C�1�}����.�1l�\}�k�5f�m�7���k�k ��F�5A;�kK����^%d?��p�f)҈c��ЙL.��,�AF~�������YO����ħ��w3���a��;�H@�^��\}xa�m�k4j�2��cn�d�!gA5�{$l\���<�sI�.j�uSY�o��#DZ[Զv�K��8�����\�n�!��m��fT	� &��Siu�E���؏�ف��އ_dֺ�r���c��`H����m�X�[[�=ó�4��&`5������jK��Fo-R���>r����EqK�~�\���,4w��(�<&N}ܧ�{isL�r����eH���H��D5�p��_;Vy�:�XGj�#Y����1�)Ӝ�W�lx�L�td[�Q�h��ʭT�di�Q�є�\�m��lf���UB��)�Ha0�I�.8+b�[�hc2lʴ?��1S���E"M�lM�;*#�C�����Œ��?Z�����$�����iҲ�F�f:��+�P����	�/�՛<�|�*Xo�"�LǮ�`���&�*ig%"n�[LQ�Re�N�K��c�,����J3H��(R��0���)��.qf�{xl����!�a�%�vv�]$�W��d�\ �Ht(ב�[�Q�)}}�
:�=WDv��B��q,ugI� ^�s�Т�����>̩+��jgL�iB	ֶ�dD��@9R3k�����N����$zWi���c�!�1���Yy=��׻���n���h��u��l���r�Â�hG��x�zC��9i��9a�^���N46*��\��$)uP�+�)�O�0,��)�</D.zjڗm�gB4�Q��p�,�]�Ks���i8�ZX�k��6��w��߂ͭ!�7��eܪ�Z�㎡�/,L�[��6�g�Ɓ�/g'�ecviJ���|v�0kz{ʑ��S��S�Iέ�-��EA���2o�f���sX�'	�1��$��
��Q�x3f��_�i��Qc�ٴ��|l
�r�g�z�\蜽�^!�2qG(���ZZf�qh��ӳ��a������E�+w���J��%G��}����M�e�?�䨥g�0(rS-��8'���l���ɹdj+ǻ9lb��}��;��
���Ü|f� UQ|��<�z�գ��&���M�m��4�&P��7�l�'�<�DIȦ
I���sg-�4}�5����'7v�q��=�t3��!�B�VĆ�o0��&��G�9���mu���z��)*�T.��_�����z3����~ܙ��=�Y7��1ź1~N�]#�3~��K�����,T,@e8ka�6#7�}��u�u�R�
|��ݵTx[+������'��4c�SEkmxE��o��l���1�--�i��1%W����p;KXF5T���!D�y���rO��vf�FMCF�l���}��+�q�z
]�8.Z_{�I�(	*�#��(1�A-1�ϑ\(����;�@C�UG�0�)�ͷ�6��
�5|���p��!���I<[&���`��2O9t�va�*�9����� ��z�
ω���B=�c=�'i!?���z�5C��r V�G0�ݬ�zN(�s��y/x�h���	�ˈ�#�0ݭ����,M��aj���펖;����A,b3K���=Ԋa��%�_r�x�pP�Ub数�Q��N9�r���hR������_“�_N���7��_���7_��cW�D��M�D)͈r�QB�Zf���X�k���t��}��A��!������Y���^�M����
��k�? ~��?��)�>Ҩ��cY)�R��?�����w����s�L�в�/�a��z�$7�sy��۸Q�.��[ES��j�)��[����؜n僠=m���Z��h�M�Ou�,b]X�Nلz/\�i��s7��I2��/�Y`{��۞�	?����&c�6ګA?d�[bv���8IΘ'+�Y}�ť���d�cr@+tk	�6��\Z�e`(��(��E:�
�q��B����
ɏ��]1G7�E:�����6S8��cK��w	���y��ֱ��J�RX�U��
��D�t�{g�PT]��L��ϲ��E$��bI�$�	$V2�1lLu�EN(�@��@z3n-�20c� ڼU�1x�x�@`U�;����E"_��2�C�*�&I���'�@wd
/�ú�5��T �����ɛ��$8��E���2�N�����9��΋�����7
�Kho���#?q{�N�W�޳����w��n��5���=��wl�e���ߢ��	&_ٵŊ{HY�E��R4���%��4�\3�U�H^
}���tH	���Q\3�K��g����
��d�!�fƁɔ�ꤦ0CG���j��<�{���:ei�@�m��-�ھ��t��LG�Enu8}�/Vڗ�m[s ��i�40�^�GQ����t�IV�hs6g�x�B�?�p�3�%O3���r4<� ��B�h����ʈ9.F��g-�#�Q ;Lںh�/�"��Z��c��Rۑ��!2��A�o������"�,�]�bK�Gv7���L��/�TH*
���>�L�#�+�u�L&����gR�::'>5�:�x��!�`m�j���7AYi�T�t0?
>Y�WP��{?�����r8��q��]��/�Ɵ>��n�i���4�;5�� �H�I�H\���m�Ʈ���A-Ϻt��v��Qp��v�������?F�c��	�(`P��_���D�m�$�\���j���dA/8���z�/�¦�+�^��Cu���>��B<w[��wI�PAe�1�&����9�q�@�KՖ���X�Ԇ�Wk{:��'!˕Fzuek�k�ٸ�oFs�$3��%/���:��4�þ2����<\��
?3LĽ��_�R.ð3���|��/��2?�BXm���A��s�%�E��L�?Nbt]�
�mJ?[��t*r��_�
��xZ�ҭ�i"��s����+o(Zr�WV�Y�#��
~Ѡϲ���nt�XþF�q�a<kW9��Z�&�!>��L�������j������Ct�FD~�,�X���%�t����%��M�„���H0gEB~P��܉0A���3�~�<A料�/����B�ᜋP�nղ������VClnA���#�����Z��>G�F�����S�0�k&uX�ፆ�AZ�ͫ��K�r�_��N�!�Q>=AE�JςV ���㜃!�(�.5��〒����E��M��d���4���pO�G��D����������
] ��1!,�T�p�P��L<�ͨ��r~bO�-f��g>j�O�V�(ow�����6�&L6L�`H��d�D�;��A�Y��?�<9��?�O���v��7�~�Z���xt�J(���gi*�����������3y�Pj�i�rs��������/�@V��+��3a���i�@�HC`K�"9�c1��o�����]�@"zo�Z��}�0���G�3��\[���Mݥ��c��%E�ɨoB|�kDit��P��E�,PT\ֳpceq��I	�3�_FG�5|�����}��O�KF]�Y_D��a�Pj�t64V�M���� 
���{�]�,bI<�VR)��|��v����b<����8�c�F>���.b���G#ÙD�+��"5=+�.����m%������a�	g�St>��<�S�X�^�pZ�m�=Tw��k�67�gP*�^���A��xG��-����#'������/[p._O����%N��-2����ٷ�[p�d��u��t�;��/׏}���e��S�P���2��=� �	S�Ц.;�uе��.G��~^����껄#t����dd�\�2��̟��l�ۼ���1�<n$7�7t�miݖ�`/Β36�%ߎ-Z�3�Jke��ux+�ar�<A��✠��x�ܞ=W��N��`a�XD�\�w�vX�Z��":4Z�y���ʣEW�ި(�>Y��J(2r�g�|�[����@�����C,5}�7�x�AXT~!��Fwz�k��cP+���s_E5znѩ�a7��9��6�
q*g.dCɋ��'k�ɒ��9��?Ύ�Ƴc���Zď4���Ci���G���C��mK�U�����U�|����c������5�t���S�G��?&��8���.?�d���Cɀ�'�:Oɒf_��>�j[�/�j;�n�_�O,���;��O� �x�l��ի�</�ќm��6����:� V"���d��_ت�k���
nl�4�l�Ŗ�h{�J���
%!�GdQJX���E]C���1"��o��<��ȧiU�����F(�}N�~��/�=K5i���<6㸊����ڰ�}��
�~��w���|T&�,w�L���
؄d�	ڹ	BZ�<�<�:�ƚKTxFe����d�_�WN�ׁ�Ϧ|^�B.�~'��ͷ���9����CY�);��h2G�e�D��S�@�����9�I_&u>�e�{�A�xt�
�b���4,�6"�@Qje�r�R�t��-��[��u��]g0�S�Y�%=ۓ��û�����4���d�	�O�FfS�2���/� �ԣ*Hd��Ԭ���Ծ�I��Z�)Vy ��9x|�H�2	b�fN��N;�B�m� *S'���6D�H�q�?�eW�?i��#V�շf��#�'ϫ���wc��RTT��1MuEc-��R�	�ERQ
D�>�Z�R
�A �C��Xɪ�_�� V�$���<'_2�dp6�<�SѼ��8��,�›o��,��ɲY|FE3�(討w.�R��Y�b�����4s?r����@�d�<���w�a0)/~w{:q�Qy�ʔ���I���>^�Q��站e6��6�[o���	Q	تBC�V7�,�����-���T_T9��V���l�A/hj�=L����L�.rH�g�
@�~j�I����MA3�Ov6�)�x�Iz
�3��\wz�-df�5�P_w�P8)%a3��,3�5X��(Q0��b���*sT�&�t�5#��n�s@�(��:
%E��&"�2�C�x�����F��%tz�[���;oբ�Q
~�*���P�-h�o�q$�sjf�OsWc��=)
߶�uc�v��N|2
�7�|�͚�_�\�5v��K
?�]��h��)�';]XX��e�-@�/����:a]=Ĩ� "_� Ĉ>���}�K_�
��z��
W�:���T�j<P����F��%6��5�e��,�;��k�y~�qP��⮎�#�a4n�?*<j?��O���ip.�M��H�a�07��`�V�[�Y�o����!�E�A�MA9�<Ʋx~�P�8{>F�<�V��:�����N�<�ؗ�6�d\F��9Eot��r��=FeJ#ٖͮ[ml�
g�KLc1R%��.�0Tb�T�|g}�r$�M��6�S�����4�E!�t5�O�2�P�l�@��q5%E&i��P?Fg3 �.�5���<"�H�����6��;��LP۾�[�7��+Ǵ�6�s��t����Έ�!�^����A;Z�d��G9+͜P$#�!ԚU�n�C3x���V�~�EX1��7�E
s��lB�K�!��쇙2AH�	}�S�ѭv��]��Ƶ��0�&B�L0���S_��O1�]b�"(���)��>rn08�TZN��h��3JP�Q�K�mV#l�Q�
;�v��[�6���Nh����_N%P�gT��#��d4��Z� ��64z�� �$�
��vP6���(�N�]�<u(�e�_�$�3�):=TY�z�o��4Z_����,X����t��_[B�j-ɜ�	"����BQ2�D�7��<��R�`ξDY尯��1R�5�j����LeI+�**�$sK,��-8i�{�OKu|�c~���.�"�[�Tڪ��}W�e�Z�t�)&(LzC�̊��:O�@ΈC�`��w��P�&ƷJ�|�KM
g��4��N09V!��r~bmH|�� 'c��`�7	�_�]����C�c�9wU��.j��{3�, 
iv"%��LJ(�!lܯ����Ker1���4�cu����̣��/&��J��Y_���K��Kfɩ�_� 6���Z��;⢍!��6��q�]ke�V�^7����ә�#u�\�#L�	��]>d����A�����u�!�ᨃ��&ya���Vgcˌ�l	�����I:���up_[��C:��D�W�馵G��zx����aǔH���›Z�b���^pޡ�Q^4�VK@6Ԑ��l��8՛E��M�w�ɥ_��aJ�V+u@�[_��x[P1�W:�\�Sa��R�P��Nf�A�M����*l�"�v%�Ra��d�$o�X3�8�^�U�|nC2�
Ib�(��N����!�6}NTG�n�
�l-��َvz�9�W��6�$��K�6E!bf��TA�;�����iÍt45/r�h�"�b�(�StK��Oڲw���P�-����l��;��^b���@s�n�듌�jj亾�B�lM���U��b����$�%n9��Upp��D��_
�6��G>PJq�:������|��5ꈶ����F�=|��s"��:g&0��u}	흈��U��%g���gi���݁����ej�<�l��j��_ֿ�Ƌ>gc��!�j5.�nc|G��؝�eTܤࣾ�mh�K�G���#��Q���Y��D�xˍ/$K/I:I�o��S:շ��K�/<aoG�_ܱ�Eg|qoCu�[`�-����Z�^�)�u����;��{c�B��[�!�i�Q��9\%B�y�MU������BLL�Fh�D�����"�.���J�Ұ�Tb�߾5B7�f��7濗�T;
f_�@�l�ldCUQ,P@P$�-��I=͠�|j׿��E���b��Ngr��+�q�=��1�nQD�Em*�v+�`k��+%Eڡ��pm?V�/Y�y��45��/�Y)ke��>:WrM�ã����j�֪Т��(饙'ej;P_���}�u9��6܂I<�"��~�iM4&\��0a��D��g8Z ih���B��a#�ϖ:��ܢ��W��̘҂��h�g>�i\O�
:�����^�!�Y"���X��\/RG�	�#*�>[<�
����,p�=�
�
ha�*U��z��I��4�۹g;��R�F��#UI�d��l�I�hқ��z��%w�n�w��}}���e�a���{l(���!i���Z+̕o�J�0�3(�ۑ�
+X����=��5�r��!��?���b��{�w��GU�T�&"6Ϸ�x�_�S���cD�+Ǚ��6×�C�T�����:���c⌓T�9�,@��k��CI<���K��H-�}t
���vof��5+C�v��a�_�0�o�끿���m�߅�w�\&�[�[u�R�#�*�ŴD�Ώ��4y4�N�������s��h(�埝�+t�}�m*��?E�<AhS�m"��P��ޖ�<���1�f�'���M���tv_�y|���y�� ���w�R��s�@B���o��.�&�߁�x*~�p�\�M�fK!G��'p0�P�L�;8�Be�&YZ���&ŭ����._TC?h�c�
��,[aL&[&0_�}�3�(��6��R� Z��cb7c�����^��}=3�-�.����<d���Ƀ�أ�ĦyuO	�B�r8Ti�������t��
�%Ƨ;
5��Y�NJ��3'��q�V��%�����Qf�9{���x�s�T���������ꦧ�X�Z$�G�G��9z�SJg���jE���h��K��N�2}^�)\���ӱ���#��H�
�:+r�A�(��K������Q���=�������!���F9�)��5�1D2�4}��X�����s���,u�6�MJ�ׇnR��A�n��:b:Q11���4��e^��p���mk��o�t�wL�\��Q(Ǹ�jꤧ����ƻJ��󾛞v)�*}��Ư��<�NL`p��GC?�jn9����z�&�@��;����K���tTWy�[b�gl����R��
��8U���M�*F���tu�C�F����5\CY2T�&��j�FI�
˽`�Y�b��g�q�,�Q�a��Z��1�4���F�]��+�o��u��[� =g�J;��<�B�6���÷NC�Q�VbK���l�������v��ӫ7φ;�o�9�E�p\>��W�6Vj�0��&�-��f�c��"�tl��J
�%��Q`K!v����wm�b�ow�w�+VEs��,_-jR}3��y�B�
[@y��fa�_4K�I����wE��4u�!�Pv����k9�BL�)��'���N��
�o�
��Z>�5�5��C]�� }A>o'L��H�Q"���Y*��y��|,���q�?��䲁&1������J���r��lC2D�#�k�w�#�TV��\|HJ�S�M�C�C�m ���u�%�;Z�Ph�ۄ����F��(�S:�Ă����D�S�:V�b�!I�va0�3
^�:l��x�t=�_��ꢠ���Y��Hs��8���t���ў�����?�L��<�
�$��[�+��Hw�V	9�ih�=��v/x�	�Ez�����apJ��_:�H
SJ^���QB�Y�ֲ���lo��ҫ��#�;��W�:�����U�`+�D����[&��s�er������\�͂�r�ig���>E�>�ݿA����h�Հ�z�o�.�"��z��KP�sz���u��VM1eX�a�`��Rj�ԷF�`�}ݷ��"��Y�D�OIG�Ȱ��F}m;E�d㴊�{!mb��>����{����y2��Y��'�Q>�*���"[�a�L>r��<��h�@[�2�6�x2@�Znp�ZeL*=|�|]�V�1�f��f����J�a6/hqc�W�J}m���Y�!1�96���a���#�0�nI��LRhAs�aS��8	g�;\�\��k+���J��l����>��m˔֍iT���2����sL��[���}sO�
W��k��=�Y���n˾[?l���p2֍��lzy���J�9l��avVB��#b<J�V˂�a���ihuMK��t�P^H_D���߾��{����u��G����	ߧ)T+}II�[T��\������I�(���D���׼�ukmJ��"��^����h��D�_��Q��A��A�?�r
4��p��[�G�p����4��1���f�ќ,�r\�ͨNQ�J�n�F�3�YJ�M�q�Mϧ~)�Q��C�i�5��Q��z��Z=lea����1=eu�����hji?dna�n�z�r'�A���E){e�1��-<�&�Ca��M[fT?�9��r��*,���y]GI����$�74�i���O��tIB��@�r�2�I�I�v��(�!I~����/1��C��
�_��k�2��Y����].A
b����ls
At��ډi*��e��~V�XFVZ:N����{� � +���l���޷�
�
V��&�H�Ժ\	��eb�\�N7���Ļh訆*:�J�r
��'$�$n�*x����'��ȹT-��	�ʣ��,Gc��b�b�W�b���j
��x���Mz�"=Y����3�$�Z��̢}��J*$����HB�QC���y�	Q��EOٽ�)�YN���ݦv�4sZ'JiT���\7c:��A�&�&t���y�bb�ә��$�}��K�
v�6κ�N���^c?@"�loo����x�H�!E!��`&b�7NPB���A}�mT'Q��I��~�ew�x�B�:F�h��u� uSC#fF��Q��d��g��|��4���9�����o����䝷\��IZ�s�8I*�};r����ޞ�����/��3��3
g_AG��|:���$�F�U	���
Z�ܲ%ɠz
��$�`��Q����i������Ѹ^�8H��9���[�������]���y��	��'B+�-�����G_|�՟���C�E�
���S����$3P?�x�V�A��Ϥ�&����@5�q#Ņ�Ȋ'�tqQ ��v�s��yYq�V�7��Au�^�*�N�
��zdؗ@�Ą�$�N���7 ,G
m��\�퉦�;���L�#��������ߏ�1�ڊ������_��1�Qy9�]ZZ���*�r�uV�K�/Q�]Q�l@*�Z����Z���J)�%��f[��?-��1���ު�h ���7#\��k4�Pz`^3���Gz���կWh��Ѫ��@HG�����2�P�mL��ٚ�Ҙ����4����m�3��v́5���tpB[k�E)�U췥ue�m3��+�'�`�&����T��� �KAbu)z�,�w<=O36�/M��‡Fx%��wˑ�K_l�<�{y�4�RŲ�������몬H�V�ۛf-�if�փ�3�.�g]���큇X)�3r��u��nkM"�"��Z�D��Q���Ŷ�E�o�;G���P�6LJ�N����{��7`4�:,�B�i��]�-�l���؏�؏��j�ɀ��kzY�v�Y4nǽ�1r��ŋ�;o�	�7�UQ���^tޞtXO�3���m[�!�d����Z7�·�*�*G��(j]������'�qЙ�VD5���:�ۢy��L}X)(ꨲ��3�k��"��BW�}����&�k�z��zt�kn����u�����E�@�n�`�R��C��=0��h���W�(A�eK)���#�㬟W�E~U��760��P�/cxln�n@
��N�h����< =�[
i�6�x��������C4�4ۦC*{<^������[}��|�E`.R��~�H��ጛg%�ь_�6D�9����}�\p�]���%t�|�rQ�Fr��H8����bA�U�� ��>sY=��:�8�����2�\�6��{���{{�nl���ԁ��{(�e^���aߡ�.Q�ʐu����ME�9c��1ͣd�؄�1��,�g�#�P]Y���s��H�=ipϰ�E�ɻ:���NYR�G���wއy��rW`��^$%%g0�RJ��m1<� �K�E��q+�c��|�9z�?���񃷃��"C���ص�$.��������S�9<x;�?�����g݃fO7��m>|Hn5�eR�N�+���:�0� 6=��Ϗ����y~���|ާ9��_��[}R`�E!V�qR�q_&�_O`S�F��Z��M��ⷝg�=���|t�������������������zJ���]J���q
A�s���c���$j'k*�s4t�!p�ƍR�Qyu�E�nH-Y{@q�
�����nr`�~Z���M�������0G�F
�lg:�.�f=����c�`7v*��=�����B
�q�D�������u��>b���<
�.k��OP�!�a��B�ű�l02@�"�8g0����T��g	�K��{��6nda��=�N{6�&-�vER�,ۉ���[��P
O�lI���MZV$�ok�R@�I�K�y�3��n�P(�B���o^��Z���{�?��h��t_=�~T"����a�|�]�\�t�>;ć�ʖ�
���$x�@�_�g+k�g���ܥ1U�vn��M���c�jM��S��#�.�=�iQk>�y�v��EG����{�
	
�~w&߃|�㸧q�����9�:!]
�n���M�	*��G9C��"D?+���/ݾ΍x�ٕ�z����1L~e
���-��=�]����_�gϐ"�k^�����f���.��C�*U�UM55vs	</�
�5�`�Xd�p9�;l�Q�� ޙ���C&
�	,QF�=(d�DH
�b!�p�^�^b�3���u�V��UQ)�/F��oD��� �F2P��YNV�Y����630�;/G|�m�GT݆�_�P�c�8�Q&�^9R�C�Q��=)t�\~�@%>1��LĐsծ�l[pJğ�(�������]�g�����HP��<?pJ�)Ryv��ggu�by��`����I��)�
��{'Q�ӻ�Q1�|R���A��h�ꪖ:c�]��)7o!Ѹ��xČ��M��A��P�p��W$s�8���#��:����v��vtTY@uvQ���H!d�-�O039�LPY'�)c�=�U���U~g�U,��EQJl����1<��T΋��˳�5����x��yX./2���(�;�YNʢ�)�8ȇ�.Ǐ��ʎ?�Z��=$,8#����Y\�O�N�ׅr�WI�,�H�I\~�rZ�([�j$G����$�|�A2;1cX���킒	��t�Q�̶^��,�l�%��6�mo�{�+7��ʥ�[oh�ƣ��p������_<�@��'/v���p���E��f��������N"���q��Y{@���o^Y�+�Z��JNWM��U�s8:��{�H�q8�&�)Yq8�Yێ�2n�k��ծ������P��:<Z9��W�x�gez�
��C��x�f��0��t=m�����
�*~���S""]ktt�����%����h����a�w�9��+�0�T ��Y�#�8���-��Tu���d�,]MQ����=���I���������-�<e��T���<׿�*�U}mmG�����%�DmJ�9jf�.	m���UJ���RZ}������|�4�8�|���*�����	���OQ�mF�ςm��P�ђb'\�dI�)�V�	?�M��g�Eѥ�~�����$D|Ӭv��AE�t����Y�Pp�$��6�`^]̏��m%E�ӭ�N��g���w�Ж[M#��^��q"�8�>��<x��}�J�h|�U�V֧�-�\&~Z}�3Y�~U�w��^�g�G�+4�ϯ��߰%s�kc��P�
E(�����4���u9��t����fr� ��߀����T_���E�'��i��;�܅>m�U}D��N��k0�0�rv�׉�T�j�&1�LIj��y�T�~��E:(z�?��Ek#z�0�������g
���&��o\�A}�@�V�ZB/�SUЉ*��t|YȐ�?�{r�<����o�C#ư�IC�(�Z������h`����|�s�c��{��{��C����]!���빗0�51�kھ��\:��V^_忤1��ʐ��-��vςF���%upz2��-d��i��/��Ղ�6�.��?����]*��@*�?Tmo�M�
HU\)��/M�;�UA�e��Ց��/E\��i�^���Va�ϣ(������6U�>P�Ă9l1�D6�5����\	�
e��G5+T���߸	���pvx8=<�7������&�
�i���RGȲY.t�u���|�dE�ϑ-n�$~�B���=E���(�z�joG�SƇ���>����3������gn雀t�;�E�
Ě�Fq��pǮ���J.������f ]�?��%Y�^�^+n����A���mCU!��4m��k7wq��ߥi�V
:l���
N.�,���vOӥդ�qy[Y��{�H�'?���y�b�r�Pg\)A�`�����$f�o���y��^)�s���ƃ�p�Y?�͔%����% ����鿑Ѩf�19�L�����N�I��p\x�أq���eDt=p��?�i׾��1�1��,��F]�俥>�
(�g��q0z�Z�4#�KS���Gح,�j��d�_�mIeN�,���"Dc���>��}fK:㤋�T
N�{���h�ib��}�gy���.N����e4�jht�ȫ/
}��m����F��#�]-[�?�`�8�)l��Ē���8?�Fʚ4#�Wh��פqP�'�+/���ZM�Swww9��/���1G�.���s*���=6��ԕ�煋*��G¡M,%����j,_�໺k'�=�sV%��
��@��F5�S�'��v�Q;b�K�d0o���2��y�&�ce\4�l4]Dn�2��G�<�>΢Qի,�ۏ`�To8���.uz��}���)'�1�bx�K�^��&���G�
���e%J�@�N��H�`��#ZIM�8��$R�z�''t����qfT�js��[`�!�	Ȅ;Q���w貏�g��qR��s(�3frz"��H�!^�mQ�j�]�����sUw�|l���f�
���i}�Y��x�������"�OΓPGy[�D�pWY)Ɖ��.�amu�J�<1�}��1f/1�ꔪR�����&��͇p���J{x|�eo�c�?S�V���6�1��DŠ��ōNW���~3H�8W�F�E��J�~�[�e5=п� �s%n.b�F�z9����b�r�bQ<����T!�����eF��s����v�}��3�ox�9��`��Xs�r�qoW^kα�#��v•��Jf��hz�1��R��>�k!LF�Z�v�g�Y`㵫W����t����ߎ�I�*)��\Fʩ™��ᱲLJ��5&�1�;��$\��KŐ���A���DAͦ�H�uǟ��7��XY7�9�G�>f<=��>��P)�Lh�E?D��0�t	�����v���=$���#_0��kcО�z!�a%�r����A
��"�i6�n���R�� Xa;N��0�T�B�+@�:�&�R��QY��l� �J�Oa2��9�hz��{8b��WӜ<�����x�H�S�5��&�}�
F�%Ru9����LE��H�1q�&�]���|T����ZD����1Y�X������OF���Go�h�:v�d6�"��M�l���f�Te��n8~i����躿�Ĭ)�Z�iP�4z3�JL�'���;&f�V���4~���:Y,ydg%Vm�n�xz�?��a�:v#�ަjU����'p�0�b���Tؙ2A���d�P�(φ(!W�~�$�β�YU��J�	p�QN����^��J,
1�����c��	��(n�~�vӞ�ho�(��0?�3()�X�1�Tp���d�W		5���9��/�5��GG�g�?W�r<$�)�k{;�(�^<�rZ?*��$ď�y��3�mf�
��󉠲4���SxxU����n�ܟs_7��5�D�a�U��H�B��Ƶn�}^]Yo8��s߯*0������P�u9��7����f��^а�T�ז�ơ��$�J�]>����B��'�.���֑&U���p�ͷ�G�F:D�P�����RR3�̒��Y�=�w�S:tGmg�����H���X�tjXqt�4Z�Q���>�C^�%�k�5���J�w�U�Q�6額�<��`3,[������M9m��O�}k%c)�%�Vf�^m�r����
�k�z��tO��B���U#�lu��/y����ٷ$��Yx;z9�_N@yQ$
s���8,m8�����@I�_�y����#G���nyV�A�����F
�,5�,��
<s����*�G�Lof�IB�MN��^6=�Sݽ{����=��ThZ����Q�����ͼ��n��*�y�8��zu��`�z%���*��\&�җjwݚ��ź����P�n0+"�jJ��M��C�P8*}%�s��f��w��
��y=Ē.��).?S�	�)r��i�q*���iE�S�bU��^�@&@��y����4r�PP'�t
���(���Mt�ذ��;��b��_J��Am��*�ق@�Q�Rz�	�<͋�����D�;H�UR�i9�j��1�:�����}�2�ۑ���d�5�]�c����5�5V��7���b	�m�J%a�[���z=�#��F[���'���%���x���iڎ���K!Vz�'��Px�ú�_C�=��ϼ�/.����j��Z����m{��?�~��
��$�f��*��B���W�]��+��{���t��U|�&���xY:!T��x�*ඉ��܎]"�]d:�Km9_n�|�k���|-*E�`<:E3n�8t��9l�+��?��|��}ǂz(P�T�vA.?�S��ѵ���ZTk�I�}T���\C︵� z�l=l}QV�Ean�l�(��5��ߡ�j!iW�<}9]]5s�BP]�VP�v�t�Æ�E��?7����[��m��m9��=��m��d�pő�#��6�V�EXhk���!L�0�*.*�VЃ�Y(�(xk�k���)\q'עN@�	uh�?V�`t�V��	�U45�R<���^�	���]E��T5-�3��Wm@��T��G�.|�� ����f�x��E��8�;��y���������
s���<��V��L���-�o�4��4b�l�Z]!�{�I���BN���Q<�+�l�qٲY�mN�=��0�u��w��B�	j�,��(��"�����`b{��{
Ƭ�BH:"��Z#q�*�(_��0li�����B��v)B���]ԫ~�}�I�h��೨��
�OY�v~�k�a��]�e�C���j����t�����`�z�i�v����~G��=�m�	I�O>����c�$�!k�S��ػ5Y�ŨhO������Һ��f����������eJ�J��J�,�-+��>���@����B"��
��4˂�Ӭ{�	l%R��CG���5��|E��;P��./O����'��׻/�{���˿E߽~��E�x�ǧѫ_��
�w��7�����/��B��.βI�Q)��7�q���h��=�~�9��/ov_G�?���w/_D/��_	j��7���2�ڤHe���J��q12u�U����ˇwdQKk��ķ��HxD=�~D����:�_��J�F�I�m8��fc���A�`�UV<�hjf����	D;����tʓ����@�z�c�莡�pS��� ��6<��P]>6�p#����|t̼H(6���h�#5���jN҈F���4jm��~����D��Ѻ��?ZO���r!^	Tsc]�3���n����%�+o
ޣ_�W��0\�qU�F����i}��`9��N��9#�-��@E#�p�]n�87܎Z�҇�$W���X�<Z����S�,�l���$ʏOC4�(�L��B�`����.�:b6Ff:F�|��	�4���6�#���K�
�݇�"�!RyuK��(��a�T�2�4�[��+컐�n^��V ~���m`��=%��sN!�6��b���I��>��+�4�.�m�OK����0�
�o��6X��0�^H~R��´���;�دQ�!
��o����1����i���$Ԧ�a�.�*�%�%�py�Ԓ�ֶT(-	ϲn6���X|�S�{Ѷ۪�e��.c��)D'ڗ$xm+Wm��<�'?��r�p����]N�*p��Fi-8�֖�$�F{ޭ7��C�[��Š!q�\�^�R���]�ǃVta�~�(i��5O�11�_�"��@8�U�&��
b��
�0��!B�*�J����8Az C�u��t���p7�}g��Z���zh.V�������(��"Ҿ���zt��t^͆
�
�.�Ù�2:�{|/ōR\�:c�rK�
E1b3�G�RE��Q,�h ͦ&K��8;45��?�Y� $׍����p��0�SL�:i;�7�����P�}�YYA�J4�ttF3�=��(}��t���X�=��&���.�_���h*�I�J,'�3b�ճ\�M��J
��A�h!�����?���§R��/��Ї+'^9��%C����U�Y�`C5�~5��n�JU.5�̬�B�j�b��{^8TA>I�6`�Ќ�&�&��?��qɘ�QM>ܣfE3�8��P�B�����6	wU,�>T��\�`��>���f�py,��T���
,r{�o���ѭ��^5�Fh�saܲ�a0��,�¹���m�������_�q�|o��ք[Iӄ�������H�+�	Kk�(0�MV�
i>4d�*s�4�L�||�KI��ϳ�<��l*�
�b�Xa�Z��
��k��$�&�Lr��
*��s����9�
�{�O�'}m�I���?d}!㱡J�p�H��ce���P����h>�9�,9[^�E��f�W0�gv�L����IE�Ө�)na�d��o�Ul[�n��kr��(��bt�o����ټ���!	`��<��mS
���mIjQ���Rķ�,<���w�&`[� ?��P�m)�R@q�I���w�3��l��T�KK��}��K��x/c��
�EՁC_�g���r��:M��ވ�#��n��7d�N�*��S���-ͯ����L�^��2�%6=��V2�y�9��.�߫�-��(��8z���iN�Qm]d#r��LǓ�";������vy
�QК��k5R�k���	��pDъ{p�P�c'
(�|;�hz�]������BUŤ�/�`1�U�"ƶ@E�{!����4`�/���;)��r�U�p*����
�
J@,�#l��A���P2�b�[:+��G��H^�h
����";��Mr�(���V�c���W�3��Rٶ�#i�4;qHH�
1��u�)ACPv$R)d.���ऀ�%|#���	���v�Љcf�{x#�:��1x�s�Ҁ�
��Wwx��$�Ӂ-��� @��V@��&a����o�,��6�K����o�!cHK�M��׆g1?Fg!�r��m[�t�Nܽ,�:�R�<�4.�2���a�".��lO0�6ʂ�I\-;'`!�r=�}�S|k�,M5��2pճ�)[����O5�BoȼȖn�.D��"hw�G�		5o��K�j��U�]2��=�
S�74�SK	�bP�Ȟ���³�`O����듪8u��"���0��[���܈�ʔEj�r�ڴ^�9���ŽeOA�����I��9e�9�F�,�ߎ�=Bg�R������4
���׹2�+�B:�#�c,����t�Ilі��F������,��Y@��ϛ���"���[ƥ�ŌdL0%��v���c�Q��1���+��nV�,9&	��	�T�VT��+�C�E/�W��#�m����M���Ο�ޮ�G�����Z����yw�̏����@���G�X)��X&`$�m1�b<�A�nK�F���K�(M
߰8���*m˘/.xH���%��`�.'�3Y�88F��w'��
Yje����épD���Q��?�Ϣ_�8��m�z��<��V��@�PddAYw����= ���AzX��@\�Uv��C
�>E�p˴6<|�>�@ŵ��¯�Zo5���[��Gt��p�W_����3�D�]ɲ�x}�P�<y2ԝPW��~��v)ԝ�'�����M�-�kE��F��)����"���/��"�����Z���z�s���*,i��D����*��V�Fu����e��G2غ�n��-�F�G�2�*�����U۞us?���l�HSSB�����DɭSƂ(�p�.N�du���yr0^i{'р�|�MhNj@�;��wA�j���W��n��ֺ@
�e��|�ZAL���H�M���	;�Ѐ���awv0�,��G^�A�ʭa�W<�*�k� C�n�{��2e�p���oA7ʓ�.A�M�)i^�'�9�+��
�
��r�G�s	Ř�s�C�F���{�����L���N�K�h��09����8*m%���<͢Lو�XI�8������(N�q���՝Ap�T�		��D�|3�Q�*�;8m���{�Ħ��^U�"�yQ���k.܈Z�pc}}��B�\p������DO�;�sh�ş�(z��/'����������K?���+�5�Ź_���\���YT\�|u�Yq�U��)�C��V�b�w��|0@2R�}L�?>��Oj���V@m=�~�5���?�|BX�
�W�����,��ɱb6F��ѥ�B@}�eI��yaP�7O_��
���\VO���aP�0ϴR���J����a�*Al���“���~�"N���E��d6�燌��B�9���cshή�	�ͼ�\�'��Xf�`:ī���MU��7~,ZQ�סR�?d��0����<�i��
w��(y�ž��%�=Jm�I\�oo[ɱB�[V:�u�([�����]t�
���tɄ'&���͇�6g5X�VB1�^���5'&��¦�
��ռD5#��5Z�
��aM�Ί���x)�1���J�%���/�Yы��;�P����k�q3R���(�ė�=����dU�=���R�����B�|F2L�T��#p:U�#U¸8��s��v���vjX]���
���>�a��^�L�=�%�`�)S��*1\t�X�&�з�e/�E0�fț>�UPe:�ձ�}_$�ͪ�8L���gӕ��c�f�t���ENv�v�y�n��2�76\���KZ;#A��lm��mm҆5A�,v����MH�g��
�+���'�B��PTZ�Ыp�B���sڴw�&OJ`'�r�j��TǛ��z��-�&�2=Ԃ��t�q�:>rr�
��H���uiQ�2
?w0���m�G)�.}�R@_Ĵ^ێ<eve�-�)V��o@��d��z'�fx|�+>��8Y���3{㴎���I��ŭ<7��`����H�<G����!b�Au{m��7�#�(�}����m0'�!�T�@+�M�0zD�t2
<a��*�.[Pz3M/�io%E�*�)ԝf�R s�)�W�Vn����']�	%�V��F����A�^��1�\'�w��%���
�^�$����(U�@�/�J����
��$�>ZJc������8nF��o׀���ʀYT�P�7��J��s4���7�)�:~�v� �YJ��3Rϡ~j*��zD�Ӷ<-�\�h��ڂ���1���9��8='��F�k�›f΁+�0�.J�~|I����cR�u#\�l�'?��4܌��4�	R��($�����¸
��C;�]��
+ �R��Qi�*�����U�7�0�� �9�Rqێ���bJ����ОL�Х��o�<ڿ�k_�ݰ�	�|���:��3��e������*�4�TQuQ�J7e:�x�L�3(�'~K�U�g*Yʂ�y��bYOGV��W>w9Ղ�*�E�`�/��$����Ğ���ߎ��~�LJ3[�d	�yЩV�C�#Eyx?|#O�%Uп��_��
�����������̵k�

�]VsI�N��5�}�㵇ޔ����r3���\���^�|���J�vꋓ� ����V/�@C��-י��}FL��h4���9�D)�b�4�AK�[���0�QҖȒUY��ll�cW�[�0�-�{6X8q-0΋o~v��8�m��{CyG�$]
�6���1W�(�1�z��kl\���墭��f�t���p4�[{j$oB̈\�Z�]|Āan��AQ��4��2��]�i�7��Q��,��]`#�5YY�$��DŽ��]Q��63J���
�1)�j�w�~:ϋ(���an++@�?p4�ξD�{W���3�"r�F4NЋ����
���@�&[��c���/Q�&��=�+�&E9��L��|���[�QTpL�9�9�n7Z�p���}k�N7˝��!>k����n���$��իY+��m&뭍�(V7�C�nc;�Q���SEDoE�����:��oН*�`�P6	D(8��4o�R��(�+�#�O\�{�F=�W-��u1޸��L�
\�XZ�{�����s���
q�����4L
�w=u!�GY�W��vьYE���7���j
Ьߗ6�^>�地Ѻ�Z��0V�G-�NV�ྑx�a��h8�e�m>R��ׁ`�z�5"	�
�J�OE����h�X����n��)HҐNmk����h�r%a��a�����e=<nn��к��ȕ�h��xŅ=�
W��?�z��5��|�5;L��Vo�!�Y<�u��,=N[��|P�r����1�4���F�!�C��å�#��z٥�,}�̧ߗ�Ⱟ�����c�g����gi�=�7$��3�À�5����HIZ�L�%�i~[:H�2��%��4��fZ��+栀�h��,;��g�2,��l�qq���Awǃ�p��CR��}��`�������x@ƨ���S�r<��IF�7��uGYM�TS�u��,��Kr��l�UѦ�����f.�.[������	_+�}>7��$�S�s�WWkA`�!�޲���
swc@,z�6�A�H��7��:�c
y����&|ǁ��-i��z�%����i�B6o����9N�J���Z��&.qu������٢zh'���V�/�(�y9��oI�W~�+���O��OHݓM���	)")]��9�G
��^	���OW�LWS�RkAhʭ�
	l�8�~�]w�~
�pw�A~��܊��!ʁ1>�|�"i4F%�:�E,Ϸ���hq���ԲªMU�ĕxno��`L���:r�֟��<9����%�#���k�h�K���q	jr���UnoPS��;ΙȇEa�3�Kc%hk
�?ێZ�Z�}�֥Qʼ�'���pV"�m0ԫen_�k�B�,<V�yv~����ː�F<YY����w-�j�E7�J�p����x>%�G����Fݴ'ĩ�ji���`��$ENz�+m���#$0�dxz2C�}��
!u��ͧZ�MZ��Ϩ�e���Lf�Q��"���Z��	L�u�t��l�Y�(u{#�m+f�$fV`����'vd&=��5�zR5)ό]�m��#�o�����MP��a='`�VV_�hM�
[5�|��Ǎ�`��4#)��H)R��9*�S�����b4T��x����w��0���{{P�t獀H{	�2�d諕��
tA-.ǹI|��,�A:��g%�b2I��ЖD�7�F����!�?l ��{�'P-������
x_���Ii����1� ���驹����T����4�8)�m"���K��S���<Z��T�_�p6P�ag��W*n�l�ޤP��� �7z�4qְ�����"�c��3<հwTŭ��Ɖ�ͼ_�����ӥ2{5�1JM��.]`���C(��8#0	[�7G2B;]��arT�Nk|�~�ve	N)�Hի���E'�=�^�a<|��t�{?Q1������|W3�3�*�O	�/�Ёc��Q�VE�3��_(����pڻ����-mF!�������Bj|���e<�8݉X��&�&����S\f�XWzb,_@�D�"�b��@j��<���<��b,hU}�(l~�7��h���SF/�N����X��]3Fw��w�iܝ�G��@K�8h�uⴋ�z���������ƀg��M_;�wa<s{cx�(�
o�~PKZ�)�@3&@xJ�@Feb�jG�</-v���E剱=Q������?:���At�@"(�!�LWo›���8�S�K-��̤���	o��B�;����P�[ɫ�n�L��*
���H�)+���/ҭ��|�RO�<��~���h�<�z��~�dd�}*���[��R�lPM=�}�T�f�l+�=ֲ���/������ɋ~�/o���+/�T�
-�.��I$�B/�C����i�x�
N�r8�])������2L����C�5����������'�O��F��%N��u�V���v-�����'��*�˜)���*K���^�و��X�F��$���"��Y�
4�-��8��x���w���R�X[h$��m/b
H�	�Es����Vб�L���G9��*�����s�21!����
�|0��(��}��fL,/�J��:��ΐ2�S�kd�B_�y+
�D�9��BA. �s��h�K}���M��޼�d�~��i��uF�z��6��8���f/`3^��r�.�}@�ipD���K��c���T���k𪇲�q��ڻ�m��ؚjoL�9s�^[o�J�� ��6o�qg��6��XI!�,��<ʵ֗��YL��_�Y`��5��s1���]���N&#�F�fjw�K�8����u<��/t$�Ց�P���Y�o�C%�5��aga�o�i�~��YL=�ǰn����,HIv�|BZ���%o+�L�t�M-7�% �ף��(��IՀM����Ս�}=l,k�g�~�K?
�W�%a���Q+^u���[eˋG|5�����I�|?��U��u=ͻ�8���N�ce�BQ���jV�Gc��B@L5D��VXfQ
��YM�}�������,28�9�x�҅j��THMb����h��p���v���hm��VQ�EO6�@�q����_�XS�>q�*/�T؜Z;S͍u3H\���X��PV潼�@�)i����nӾ��=�GX��J�ϧ�C靋,{�����M.I�0~M��O�,�V����]�N[v8+�Tz#�%�J��g�EP|ԫo��T8�ȃ�ܙ�88Ќ��f��%�ܥɖ9^����D05�V%���I�W�����w�Ǘv~�c��$6[�#��ԗr4�d�9���r8?T�7#R��>‹I���c�sˉ>2K�7"��Z������-Q�@�\��iq�"'z8g9W,CU��Vb(��:�mK�B��"������@�`/B�$�C0�N^t�I���^g�S��j4�w�R& �+6��B�����
/������i�d�ٚv�v�LJ�8��ߊ�3z=�ݾ(�6#?����$A
Q���u��y�=ul��y�{n�*�r:��HmK��av��1�����2���Ŭ��?�4ܜ�9����@�Na="�n�
`�0&{A脇hfM��6q�����9+��Ì�,�n(*�
��t�h�3��Rw�6��x0Ȼ:*�������ᰨ�=e)Z����]ˀ�c�!"B��X�A���_3>��>�Gd��R}��b���u�$UU�(�FS�*�Ŕ��ž�Y���o����+�R_�~N0���Ӕ�����L��&���̜'C�Ǖ�%��<ֿV%]�i���M,_���#�h��0��80~�ZQ����� z�����wZ�����cTl�1��)��G�ڢG�V���}���N)29F�G3�HƳ�x3ʚd_���|l~8�JA�*n=S�Ih
ܩ�0>�ڛxOa�8NXP�2��
���(T���2ܵ{$'v�2g�b�f1n`�AL���&e@<3sO��	��	)��%���8���tNv���i���Ө�Z�S����r4�����E8b��m>�ި��M�Z�T�s�M��Нu���0^�h�n
D�!�n�9���W�8���sʎZ�q�)���<
x&zZ%*&�Q/E��
Zh?��ւ��^4�	O��k��nC�or������m.��$���}��Y��@��-Q�)���7v�4���3Z�v�1%�]��_(|��(r�І"�y�����כ~�����A���^��U�bKy�R��浿�j��HSk�7�oܿJ���8��q7�<�''��XE,�7V���,fz��^]�؇�-)�*���w�b�8)1�Jz-���1�k4�VW��<+0�œ�S�TJ�֝��_W&��|9�;���@�o�8Qt@�7��p#J�hYs��<S�H�}���Jݡ`�l���M���\���8���iL#�w�hd8a�.N2H�x4�����KK1�(Z=F$�hb�@�}tnP輵.BX�'�2ϳ��8DcX�&����aѭٟ�)�c�WQ=�0G�z�9�G���&�#�:4Rhx�U�g.:
�d㤥V��C*p���WUEmzM����eo*�.��9�nj+ ,��������S�O�-<���j"�;6�a#�:`���#�GVu3�bd�h��x�Rj�|�xU�5“]J1�����:�
k�K�⌿�l�{�N�L(c~���q0�?�a��EG��Ԇ1�f��x�4�p�#*0�*���T�aC��$�R��3�
�D�!H#1�&RG]C�(���Q�|�/Ͻ<v{WzHn챉�
�s��<)k����5n�"��\�n$�"��)?�Ԝi�u��6q3א��XeǍ5͍�xX���x3Fy:���}&���+o۾�]
���1��1��������h�(a����g`8����
Y��3E��X�m��2�:މ@�E[�$���N�u��p0�dl0rX�X.I|�q��
�a�;��B�)����H��w.@��jw`((p������A��a��(�t-,*��Z%	\��d�2w q��n#+l>
�	<یl0�|ԓ��w�F���y�f�'qG�C,-6�pk`Y��V���� ���Dh���+ڳ���|�����&�ۡ�&���x�Լ�j���h�V����?H��_T�Էh⑳7�Jz盏N�c�fT���G��5t�&)UW��QϽń-gdG
d?�`�3f�d�T�!$\��r,
W�+�x%q�ȥ%�v�M.+9�P��̸ycF#�{e��+�4�0��z�&�r^{'�G<Yx�pl6�$�;�an�ׅr����=�U\g/Оfߏ9Z5�,}yQD���:{W[��wnl�&��d�f�@n�m�&T5�~��1�ͷ�ѯpK���ș�r#/?���ƃ�y��g�v��ϭ����6��/��QbG� �>��y�����e�{����:��xP�9���W�����kK�a@��|3�7�i2�oUNq�r�2�x����`��>�*̂�Dž�a�� >��t���52}�`yC�#���K�5Et���"S~����‹��Zzo�/Y^�u�]�k���>J��{��@4o#u?��Uv��q������M�b��x#Z<���-d����Y�m�@��~����z��q��xv�/;��g�D[�6�`Z;\W���/ȵM7��;+7	�}y�vڭͣ�+��Ҵ��P�:�j�hT�#��Ϟ���h�#w"m�	$�ڞ�A�A����10��\�j{��;	�㟸���g~��S�GT��J�H`v-[�n$�D���<��֜bZ�$U�QuR�z�ZQ�����C���t:�(�j��3ő�D��Q́�4��i��?��<�1�Mc'��)}�_~�u(�5~�E��.�>=�|>�Ɠ_��l�����U��ʋ�����iH�t��F$�i�06UV�P5��>�e�����d�x�B=�NI��jt���2��i[=έa���쫑���	,H�Ɍ����%E�N��wuظA�|9�������A�]���n���h��⬏;3ے�>�	a�.3�`��ww�ܘ����&o[�9dјLY���Avi`88����~��
��˰��IN*�KmA���R�JV���s���+��k
�gݦ$��T2�O(������]) ���?a�t��2˽�'�=M6���9w�/L
%�Ү̊Cw����n`��S���ZK+?�A:�\�)��HY��7��V7�D����U^���X�Ѱ;��Qչ������q��Y4����½�R�*?!庫B�9�Rvy-SP�|�?�D�`�S��FE*<�j��;,UG�B��0����O*�l������ȕ
f���6�sLȉ�7V &�{��DJ�;�HTvY��)QUn[�R!s6�7�LT���<*�g˖{�����$��E�)?�g�FIy+a(X�6C02kI��n�b�,Iz��5G�s?�̥F�`�~����t/l<����ۇ��%<�#�����ɝ�#E[�����WLq���	�a]�*�L��</0'����h�� �5jh&���\�WC��z]J�^�/�7қS���4z�/�Ӭf�bq�Y�.IQʮ���B-�D0����~�P:��j��h��e!c�4����
�\^��v��z���QHܙJ%�z)��N�r$���s�׳^O_�QĄ&��S{�~��6C����z�Bӷ|���:+��$����[�`Wf���i�'5#�p�k֬٠SjQk$�uY倜hDp��)�K��Q�Y��
���`'�����
�,�kN磃��I)�z�jEQ�EϞE�Y�ދZ�[j���2�va&o�$��=5��0^F�@��|�S<;�[,�td1��g�<�a V�1X��Ȳ���;����1*Ɣ||��p�(Xyi�(|9��W
MY�tlQG�2�pl}	?6=�o���������ޮ�������/�{������k��?߿|���i��&V���3�b�/O���~@��i�o��K�Z��P����2��?�+2r8�N#ͨ�b�l�
�EV�yz��(s����Dt�����:���ڲ�� )0=�2'�.�;�0��|�&��Q�,/�ۮ�֍-���8y�cvF<-փ"��a�m�����،,��I�vL�j����tXoJobuL_�VƜ�I~朐򶘻Xޘ��<��ZW_��&�F�!/<��NΌ�`�[tE�/{P�B�٩{��{yF/([�0��W����9@Sӌ�	a�~Ë��/q30�0�xd�>o*}�M9I�+R�TĎ��?�ŮŝƦ�aM���SF��_�Ԩn
|�4G�[��J���[��d���߇��O�>��G�Qe'�w[õ�c0� h������M�Ge
���X���ޮ�'{;��NF����؇r�w�Q�VJ{ҵ�[��:Q��_n=fp�D�QK�,�%��4H�˄��:�@�����߉��gI���㛾��ز�����qG�8��8%�)�..���;�#Ru���e��z��`ۺ�3j^�s�
�S�����V]�Z-Pr�v�����{I�m�uxLg��ON4��Ce�q�2��Ȥ�y�LiP�Vg��/��RFյ�Yo�#��Gʀ{$�i~���f����.ݼ��}�,�xǼٺ��D�$��|�>��;ō	a(�Ra��+���?m4fs�m#K3e�n�+Y�?:׆ߙ��u�3>� ih!����1Ģd{�!�Vd��)o���Tz���ɠ�G1�=�T��;�q�|1�#��f�����0 ^M���HO��ʓ���N�d��Z+�EZ�9���[}_u�Qf5\��}!��KHZ��_əVa�����gb�6Q&:X����L�sa(�,tQ���2��N�C�˜:�8�4v1.7�B���M��ṃ�
��'���̪f٩h!��*=ay�B�V����L�481�,��’a�ғ��֓�c���¢�1[�
ll��f􆝇LLL��D'}�חKٯ(���s��Ъ�@>��)���u�}�s��ͨ��w��$�O��E9�1�Y��rv&�!�9�z{;�h|�ݻ��`
����|�΄�&<c<on,�&� 6�`C3b˦�I�ģ���p�\O���&�O5�����F��h�|�'��9K���2��(�Z
���C��Q�y���e�&���t����Ǜ(!,�|���u�i�&'9���y{0Vr֙ʒ �VU5h���d#�z+����������r[��l6D����o����>z�JrE�d4������ߋwZ��h=jE�[��@�������
�����*�����1U<�#���P8���"<����m%l�H=�]���2�H�#M^+L��>"����s��W�J�.>�2�hD��:R=�k#W�!gy�c�n�qpj��'E}y��R����3�����r
CAM���&%@�P���Y�`��BH;K^�ȭH�o-�5�U	lkK���9���d�#��<q��A"0qP}��MjTO�a�()����W�߶���-+��E�7Gemt)H�����f支A�=�ua�A��*J����D�f���#DY�>ێ*���>m
�˛ʷBӢ��+2�����
�y{���$��%�S��
��U]�V���#�O9m�#j��۵ZI"~�&�7�B�V�-��7,*�1īZb4��A2j�ON�]t�8Vq���N�b��Ӊe��`#%,V�IM��m��f���Og��m� �6��(�t7�R��t��w�?۔�hv"B5��B7����'�@�Îì���+y32�Fd��Ov�b�6����:�����ف����Ͽ�� ��#8ԼP�@	�g<%���d���m���+��z�^E�1�����M�����$A7��	<6ZY:|��<�(�ݼG�!g}(S䲉�u]�M��9��g]����xl�s �}w������B��&�#�R�
rN|�1ב�z*V����Oѥ�DId�漏0#�SHך*}En۱�.���M�O�N�u'�<j���lE�|b�q�h�Q�E�=���Vb)#I1e��xԷ�᨝�8�'��Sü{���Ő�~�hE@��S�N�D�E�UC�Y_�g�4'���L�M�(�dE�k�^k�N�z`
O~t���4����N����Q�/
��IM�oA�m^�EЕ���h><ȧCh�f�>�]Z�*�1��z�z��a'tw��/ ��ԓo$k�)a���Yb���s}�j�v]q� 3T]@\��L��1v��n��AY���}@��� �l��c	bc�[@��LPd�-B[)l�,�lw,t*�*d�r�j�ԅR�j�BX�UL��R�v�[���u�ۻr���$����@_L3A�\����ʦ]��3�8��,��m���0��Q|{<�����*k8��n�sijV���,R���pF�Py-���'	�;�o��gqn)�ʂ�ˈ�)9���#��
�l��t1H�Ŗ¬3��c�a�l*HA��
kn:�Y��������>���R�[+Ӓ�
���{��VP��T�B`�p��
aVh;-��r���Z�����ݟI���ȩĢ�{�6ǯ݋�P�a��r�*�5V(}�mXI>Z{p��mxV�66�V�}����1P�p�Q�+%i��v�Q�֠~X|�|���ȱT,�Ѷ��J���%T�����ZG%gN���G�b�gi��k�%:!WM����MU���Ԟ��,�O�� �#jϦT���]OЃ#р֢3���z{�p�ƝI�U��~��Bo�'4.�-��`q�(�O��ގ�l���nĔ����<�'h�RD�JT�ļ�Ӟ�m�w��	�eo��=ehiHd��vٹ�L�Xxh�Bx;����j<M�P�	���I��21�k-�T4~��p�U�*�)�Ȣ��88㇪F/S������٪���NpG*�/�jmUTl��D��mӒ�\3�%W��K~�]Xv�[�H���iD1��8��`�p�l�9����u����+���[.�;h�mo�_��(�a����w��T���U]( ,~�Lݶ�wjq�<�|S���G�K�c�����Kֳ���]ϷA�����M;r�I,?`M/�����r��%ͨsm^yf��}nuYe� �ijN�(�$�9W��7�V�_%�����\�d�WR��eeP�8
`��M����"y痲k=�jC'%u���ZGӛ�'�>�d��/��A��&�a�5���*K-N��l�����G��+����!�ywt�N�����j��Z\+E�qbO��s<7�1)	���T�5X��j�P��kq-^���uaQ��S�互�|�>:��JI��[|�cl�q//u�����d^�����^>���4���gq���8���4|�SZjr+�t�id��m�Z�E�n����$`��D��Ф�b�=T�~��P-�B<6L36`��	������^=���%��alUWm�~떔�_IEf$�)+W��M\�۲�����<`�+��B�3�j���ZBW"^9�{*�JN��&�i�v@a�lB�@m�[�|H�<�gy>x3@'k�	����l
��,�n���G�eɰ�*���Q#Z⍜?[t 
�K��1c^DT�U����#�UL���9t&J�����*k�!h�Ց�K�Ų�x/��tX�юt�I�}wn�q#*J��X�͔�)��FUs����>�ð0�:DW�*�0��{:�H��d0�A`�)��AG�,�>��852�8�T����Z
�b����qGt���6�ϷT0��<L׸]v�����5�!ÌI���i'u��7���c���Ԯ������3Ѯ���� ��Vw�v�Z{;�Nb��+]�U����6�$]�)Ű��$I�}T��Ƨy�Q�jh#�z�K*tk�?�R.��i7���0�Sl�θ�Cz�]��)���݀��}S.^n�ߙ�;g ��
8ÿ�З�^c��z-��s.���j_�µ$��hp�pX">ք9kX��k���wb`%i�#c��D	E���َ[� &���s�w�޴^�پ2���K=�(��*%?�}���k��5���)���_)��D�fJR�VnS�:����%�k�e�X��w�@V�W�D���5�%J0�>�
 ���)&�P���i�+-��>ӻ�U��K�Z[���蒑_ct����'O������v���}�&�1+١�,������'A
������ҧ�HE'>��/�y�?�ҡG��]��L|�[ϣ?��	�ߑ(��K��Ƙ�G�zY�֤t�Z��(2ߖ�eW��Z����Ʋ����"�]S�k���+�ǰ*�m��Y����Y��r-�j�?��H�v�ݕ��8Q �{���yr����؆cŷ$\�
&h�?�	)R��-��Xr�f�����̓�B��J���L�K3V�J%)w��_�����b�Q�)ϯ*Mg\o�FG�In,�L�M&*7gU���DP9�bL%4$b��a6�Ns�H��m;1]�!Fp|.���t�J��l
]��_��S�vm�׽� Q��AN�H���T�d��C����K~9��n�J�O� �-"���@vϦ��r|�Qd�i��G"?q����,�S��/�*n��w�N���:)v�w�%����y���%^_����G�N��������I��]��Ǐ�&��n�K���Y��d��D��g�>q�%?Lޥ����erzZ�TQ��"�<~�5��e.�b6�6O�&`n�!���np�y'{����;X��$jx�!=rO�F�v�ӿ��זVS����������(N,�k�C��N���9�kxNo�n��d�u�z����(1�%�Eh[Q���!�U!l�լ7�ؘ�͵���e8��FSd�7�$S҃i�4��H���*�	��+������a�>��]K�8�+��׎ܲ�^�vm�E������p���ߙ�����п�A��!\?"�Q~@��]m�U
oj!^�P-,���QF>e��~���jO�vX�K����j�1�@�g{�k�+��G~"$�ݳ�{�*ϧ���# ��U[�����D=��O�Ƹ�)�w*��8��gےߴ���~B�YR?��,������4h���]����FL/��א����R+QbY���f6Y��誫��{Ȕ����IN�J�6���y�͖�R.�%�Es�%�D�ӕB��w��PǦ������y���&!��O��@��D���"��;�ĕu����WO�����A%8v�
8�E��?�p1���Lq2T&:͋��_��w�%
��g�RE͵H�=�ZF
q� فI>Kߦ��B�\Xߌ�dIxE���{�fd��gA�̲�W�}qTv�i�>\�]o�����+�z�_O���.̪������	V��y�<$]�TQ���
��x6WE���!5�{1�Nk�	�j��H5��!�D�A9��?I�S8C��N��q�q�l2.bV/��l}Ň5�ćLĄ��N�ϓo_m��p�4�]�� n����x�׿��,�JYk�D䐰�&2��� ;�M�VT��ב�۟F*a���.��r;p��t��u�c֟�
L�D6��9��)r}�K�|�
O�
�A��kpl�O/�����X>Иc�a���t����}˩����z���5~��>Y
�xܻ/��ˁ�ik��U���E�f3�w���Ȑ�y���g�F��8|st��FcG,Q~y3����&8~y�kW4Ԅޔ���ְi�M���e���'[���u�����ɂ���'�c[�j���w'�����\������S1 ��WΤ�^7���0�<̽�@co�*��=t��3!m�Hw�Nӡ���8#�, ;�.dE>Ac%At/K��M�i�(�	#pʪ��뷺�G��q�k�1�q�k�Uq�qT���;�x�2{=�O����Q�ռ��7�;;�'ɖj���8Vi�D�NK4J���i�Y�����o��A
�)�I����-^2,Ǝ�~؋@�=�VN�:v5�7�D�p`4����9Hje�6�"�50��
�B6��
���Y����ɷ�Œ��0jT�G����2@�L�e�~��Ѓ�`��򮎢���IÄPT�d+�'C!~�+u>�S��a�ΰʣ��R_vnR )���¿���YYC�I��:\ª��0&�1��)΀Q�@+��	8�gS�`GsB�ݽ�a�����Won�'o������-N�߼���l�1�F+�|���լ?̝��@����ϟl���[�Ne�n[�9�k9�)���e?���s9�y�M˪^>�0tQ�;���m�N睓�}��_�����l��
�fE�
T%�IUHB8�O�n��Md\8�2p/=Y+=y�l=l=��}�Es}#�x��-O'�'\)���#u�,��y��M���Œ>={v[�Oy�-l_�[��u����[�?쿳N���������rd�CL�!_[�|]�'�^"w�a���@�̯
��p��w��Q�%����(�\l�/���}��߯-�^Z�m��)UZ�mz���)�-�6���˽�)�����eDh��drˍGn(ɂ��#b`;����t����Xo~�ìd
2�B����q�v����fo�^��2��*�juin�_}aI&(�;i#fK�K2�Ff��8'�K�W�ڹ!�0�a�YZ+�Ѱ�|�]��D�^�?�돏n�m9ՈO)��8c�ق�)�*�C��65S(T2@�ՒD����J��}6m��Ѭ�w��l��n������G����F�����e��N�&�4��{�����I�r™��j����[��ЭǶ��Q6���>�da��Q`�x��UbD48�m )��z�ő��:�R�����֨�;)4�P�C�'��`���S��i��Æi��V̇�\Z��G�b>4�M�<����{5G�j6�����*�&!K�m�…�=“vh��U��I;z�\�Σ������$e��'�;������Nd��F�$P���P{�n��]�����x�G��P�:R��+��;��H��D�e;ٽr
�'�MV�c����Y���<�rOn;WcEr@�N+��B�tb�5�ĺ���xńXn��4AC	����E�nT��MUٺ��P	�&���GG����#t*?�n}K�^�ҍ�zr�\^�~��F�5nZ1gz+F����?`l 7�7u3:���`:1#��;4��iY���4�HE�sy-Jj����g�{_ʙ"T�}��f	��)�5���_����c��ZE)|��8"���e�m��$-�l����?�[<�*}N2��?ڊ��M���#t�>�S9E7xu��/o���^�Q����v2a'3z��ɛ��ﺳ
�j�b>o�$��f��=�v��>�_�3��ݽ��Y��ݦ����g�����hք��]�����.{�#2h�
��d8ێ�qwظۋ��aF�	$��,?�j]G����po�y�$��"j5PC4t���3��‡�{��L�*�t��тT�D��cQ�Y��u�VQ���|g%��;����4q�[_�5�Z�qY����C��pjO�-}�.
3͏���ɨl�7y��(Ê�`$(Ƨ8�u�w��t�ց	7ﷷHh
RJ���Z���~�f1�΂8�����6�i�=�������_~�E�tu�3[i�P�%3{�CcT�hf��ƃ�G_������ڕk(�6�ѣ��?x����ۯ��oA�!��鷯�.�l�s؃��{`�8����a�<�e��uΙ@_�"d�w��(�^§16z=!y�Ӯ/)��At����)?٤��|��^�N$GO:�b_���ٯ;���C���*Uv�
v��������p�	a���z����	年Vh0��т�����E���:V���P���̉ξwU;�)âZT�1Fp���MҐ���p�p�6�u¦�{�N}�?�#h�֡K�	��ͥT�\G�S�X�98W�ju��M9�Q��"��fsE�Ry2����2��s��\���a��&kU�F�����+�i"_j���z��=O|72�(g"�C(�����$5���f��Oh˰8����4@��NT+φ�2�U�	��t&s�nV�-\#�9�֭
t�1���5?�{�R��QT}���nj�����J�v�Z�E����|:37�)�6hE.؎��g��7c���r��@t=F��$şL�RNP*0p�xn�����$U����?�:���t0�J�����Ӊ7��8��a�?a�g��(���z�	���Xº�pH-�rKEO�/�Zw<�Gꝫ�N�(nRXDZ���19	�>he暑r�l��3��i;�0"�B�Q�ق�Mgӥ��'��T�'SHv�������_�5�b���=�ϳġ�=K�\�d�Z5߃};�,*�z#ä8���ףX�C�`+V�!mma���&P@���(���3��c2t�:���o�o����p��j�̩�<�7O����,�{@�]�`���d!pa�5�F����VtD�=Y�2|֥�I��2]�&�������ޞ��e��ͳ�g
��-�8�a���4�@����pA�G~��
dg}�$h[���pa"�3��ET�d��X	B.����O�λ :0�l��eƘ΄ta\�ה�d�S2��q$N�6FZnU�;�b5��jĤY��[2�@�%�y.��2�a��?PK�mW!Q8�AR-setuptools/_vendor/more_itertools/__init__.pyK+��U���/JU��-�/*Q�RPPV��/L�J��&g�cJs�Ǘ�g����+�*�[�Y��sPK�mW�a�h�y��)setuptools/_vendor/more_itertools/more.py�w�F�(���
�s���%;��w����l�M<��WG�IP�EZRr��zuwu�AQN2_~�t��Y]]]]�|�-�&�M�"/��'OVU�I�z�-��,�$���]�d�(Yf�t�n����?�Q����cxh*��ŊEf
�]UeE3^�]��N�\WY���,ׯ�Ů)+�����ڂ۴j�t=J�l�[�n�t[s��,�d
n��
^�|u�_�l�N�t[n�Z���?I�oq��ň���[��D��/�]V�:7?��r����^�yc�R�^7i�I���Io2�@�ɗ���t]WY
�<�M�\��fw�Q�JLf�.KX�uy�eav�)�z�m���u�K��_#��G�|UV.]n�*��Ly���*k?6;���G� Ⱥ�����uv�.�j�(����2�&��nʢl�"_F��l�o�pq�v��j��d��i^�浼ږ��c�8�7��e��x2�:x�d:M���49O.�L��:d��q�^�|T4���6����B�|��+j?W/��Mfk/��y��������l���Z��i5���US�ǰ��3�w�~5�]6%T������Y��L	�ͣMZ�L�biY�UV��vO�&��:��2ϋ�(A�%`�f״_V�|ר���K�+��^�O�`��\��n�m�����|�P�F�5/`w�fr�j�,�j���[D���4�0o開0�M%V3��5 �{�N]��r���,[�7�t�-J�~��6�>a�h������#|���{\�PٕDT�S��aY���{�}�. �P{
�p�~�Ͳ�~L��
ٶ?}8U��]1�E�j�m��f뚯�����yvk��M3�pZl;7\�iS�v�ޮ�f�6��U�g������!&?�+�d82��T�z�@{�7���'��2���$��u��.
Ql�i�.��ӟ]���ԥ�
8���?h��Jb�����QF���r��I4 �ekI]Oy��ɻt
��c�"c/O�4K��j��p ��*8�[��>�
O��Id/�
�%p�!|����g��ӧO?�C�&����3Y���r�0�&�bx����ߋ/�D��s1%'��t�<%�G�Ǘ�c0�.Lx~a�\r���'���g��S�}��a�RO�m�^'�@�U%�JU���
s5�/+�΃���y�	��	�l:����5J>%�29�JEe�o�dWgI����>ʋ�P`]7pf��d���ȳY5K��s#_=~v	pGɐWQ;�ٛj��f�~�7��6cH�3`��7Y&L�P�"У������뜾���O��HO����,U-
�s�j��G��b,��"�"��t���<)�e�&�88�{f|Q��ޠ�A��C�U<�>M��e��b�p���QP[Xvȹ�z�����DT�x]?F	�k(-,����ہ�pq<J��y�J�á���Y��nQZ��!
���%�.�[�o��yո�8U�'n}T��Ȟ�ΰ؉��:��,�/wLV��*+qtpWɊ�ң�<���r�9ڹ5
�6-�r���U�	p��+��LW@����FV���l��������͞j���DZ�">+��)�t�᱑�u�0@�‘
F�[��%ZϬlp��!��aO��[!�_�݄�Cl�,��/=H蒕�P�d� �z䖡���14���9��s�N������*T�0�u�
�]M.�������er�4�죏滫z��o��b\VW�u��N?}~��V��0�봆+t��Л��X�io@P�<�����O���<���v�i$�Mܵ&�����`6��7瓁��l�Wȶ�Gɛ�m&_�M:��7(������#{�kg�ߒ�V��l��j�>�Z{�jt��a��
��	����t���ڍ.��D�G�Nɇ�ĝL�愂�]@
 �rM���c�n�,�	���6Y��Mz
�.Me�Y��+���e�^A��lwֳ6?C�řUY��	
…����j�V�N����W����l���`ޖE��;�ff�Az���L��K{���"�Th�E�j=Ӟ�
H^��{��Лh��"L�2��(����;�&<2�L<�6zb�
��4��e|v��\c,��6L=`��u	[���I���Y�=�:_\'OaY��Oq����Z��y�Y5wݟ�F�B����E��_ԉ��鞨�_p����Y�����K��Kr��"s���pX����#n'�x�I�C�0E�����W���"Va�+`oi��H� ���ekC\_vn������v�7�U�"b�_M���m�$�%�]��Oo�J�L�gES��B�6i��$�h��Z��b0u��C��v9v�_�*���[p
��+s9�>t������6����FR,o`��o�.�Cx�۞!Ce;�Hm)����o_m�a�t����?�򥻺�d�S�y3���l�ٝ�|1�捑�"A	^�s�^(l�.��>Յ�e�n��^�i@
b��(wH��p ({q��(q~H@�x�6��m��ݓ��n��'��f�,19�u�j�ȃxE���nddY��RV���j��k-A���tK���g�f�c^!�C<�];�b�M���՘� �%���W}H���&
��W���Z��׵�	ۖf3��3b~2i�u�䅭&2$��[	����E����ؖ�{ �R!��?u0�b!����X�-k�ߍ�)T�'d�@~��eUe�橦޸��g��rW�t�ǡOl�o�t���5�o�78�s�"G� DU���o\�V���b�Q���5�`y7x�R�ـCm�{8wѡ�.o�-u4h�w}b�:��ʔ�Tr�!��F�A�MYm�u�3�p*�C��j��4�&C4���̘j$a@B�Ľ�&�_$��֤���^��,�&�	�8"1��)��U�q�<�F����M~��GfpGp�}���>-=-O8C<ـ���UeOa�x�f9��4���8���U�\�>��"����O5&w�&�(!3K�+��j��W�p�‰=֘��
p<}���AގS���-�mZ�	�r�X�(�.��"�y�Z`?˼h�{�@�ˋ>�1OcD������ԉ�B�;TEŐ��_���Ź���'��n�#hP|r����dz�KM��� As�s@B�,���ǥ�ܝ#Lܞ�A0�Ni�{�T���
t�s��Z3cĬ*gs���/0�E�n�$ӄmb�fOm?`�X=����t��k�ɺ?�jԚ�h�H�,��|���+�K����uO�{/�~�/�~�~|���?�P��}�s��%7Y�E��bk�B'7MX6٦����?�y��wxDZ���XF��Th�@+�n�M0C@ ���5;~I�Uި�� 4M�7��M,Q����f���CS@���B��PD#(kJ�w�1�rC���f��e>C;�~=@B����lb�P�-���J�B^�&����N��@��𿷬T�D*H�'��_�KAx�9�C�0�t
�YA��-�����Z>�A?'����4C}|�����9�ף~N�Tn�E���.۴&�(/Ԫ�D螱2CG���,�T�ܮ@��'�h����w�9JN��?D��Ȓ��]�iM�)xK&�c��P�j,���iU�
p�"��)^Ef�8l@�lj
tGd�x:��|�� ��G��
�(zE��D�.6���|���Xޱ� �5��Z�ZD������>;9��{��Oei���/|d�:�Q���ۖ��Ħ���WQ\ajg�;@@�n��	�pr
��6Fڔ#��zJ��$Yi��m������l�9,�_k\ȿ��^�W`GI�&8P���ȓ��H�Zp*ȭʠ���ϭ^�-���ɀ+��*��&�����G�0q�=��o��r�[)�6+!�5>_P5 ����·���,��,��π���������Z�B��
�t����'ҝ�	�����@�Ȑ�'P!�+ГZ�#�q�ɴ�?9�?�M��&瀒Jˏ�D(��H����n��o�	�&’TY@�>�0����ղ��0	�	A3ϊ�5��j�2�œ����:��d��Vp�VW����-�R��3:%Y����y�6�&~Ȳ�����y�-�e�'����K-����
b����|�4�Rr`���$0e���2a܈/Q�E���9Z��f�d\N=PO�1��'f���w�BtVj])J8����d8*M'�BLD0���v
�>~�+xp��<��\�P��1
��沬�%�6�H��]3B�^i]���N/@aU��\CB�
��b]ր�%*NC}◚��C��/XE����&��q�;{��Q�	wy�2�g�mJ|��u�,��c{�.���Od���^t;�h�?{<��̗xүD���>Z�Y�{}�&����b�-�E0|)UZ��7%��sO�o�6��CfԼ6c����{�ƛ���>�I�
���IƁV"$E'*jQ��8m�@4��x�PC���ѶwtQ����0*jdt5�N�"�[H��zU<�D[N�z�^��+�g:Oab@�*=g0����`(Uy�."���ώ��A>n?|a�	���4
ȄH��[��8�W'5م��c�˲\ �?K>��߿�����������|��7�/^�y��׎�8\Z�97�3�N�X��@��ط��|E��!��YF�{��*��z������5�v�Yہ��o�uZ����/���BU��C��C���ŐڇAo�e����ڠ�xSYPi�b��\�y�%�	�?�Aq
�)A}��>��{`0�ۡ�;�������7.z�Mوi�&��Ot���ƠI�^s�B`xG�6c]/�萺{'M��{�$��Fu5��C��ö���>\TkC4�n��l{�s�m�>�b����l�¨sc�|�m3��}kHGo`VZ|���n��(��Cn��+W�<|ܮ&�D��'��Ԉ��Lz�� ����u$���f��IzcإM_-�ț��Co��|�ޅM5-�O��R�CU������
m�L�n�\t��i�M�eh��H�y'kO-���(r�}y/_��@X��?�r�*nx�9��o��Y�ED�d������Z�2���k�Y�
.�M����у�g^lwh]�v�5��荰Cs&s��V�|��{;�ӥô"]�p�b%b���k��<316:o���@<���$%����/�0����?(}��_3dc��Y13&oM٤kײ�;k�$Ş�Ms[�����1��n%X�	og���*b��nn�D��H���e�����
Q���t��
.o�%��Ѥ��~����1�S�\_���3k�;��o�+ͭhh
����R�x�+.�ț���n�mF",�,ߪ@��~���<��z���5�//���o��.��;ُ��G��e�@�����E��.��"�%�Ǚݡ#�ܦ5$��(�ܺ�_[S�������
�g\��g\o۠z��)?Ro�B)���VY�Ҏ0�i�O�^��m7�YА��|���"�5*�X-v���5����'8��C|�!���9l:J6g�K�<\������F�{jS.I��鼔m@˸X���������Kv�u��J(ej�=����3n.kzE���I�?�r�iJ��W���Ml
4��b��
(k�Zw�{�i�B��3C��#g�`�pcWAf�pAc����md�`�Mz�ov��t�!d��&��O�j��+Y���=�)�sd���}�x�Q��R$=i�	M̈-(� 4C�<�b�2s$�w��8uja``u��/L�q��ˑ-n����5Y�"/�dMx��Z�H�C3�����8����k�(0�~��WS��|�W��������	������IW���^h�~(CaJ^92��J����Y��9��s��,^�8A�(��0z�=����a+�'�ʘ���2����L�c U�7~ڲ�g��[%ӱ
5_dc�t���ʿ�ѵ�?�P�5X压\��F�&���+E���\B�a6L�MI��]�,C�c
�����Ys��@��ј��h�/�Q⇉��ȿ���3����� �art��,���N���P]JK�H���bMf�/�㞉W`�N4{���9N��-J&G/��nو�N��-�@l}xH7h�˄��5�e����5�x�a<q<���r��9�Ƃ��	>8�<lF7 �°
����K�>��p��z�vl����t�j75����<ʂ%����z��Õ�+��OG%m(ɦ6(�G��`�
���Q��6]ܤWhbC��A�/��F3y�(�p�)9�/����t�;�od��y�l��~��y��{�E��_�X�Te��I�'�1�;�;i��ђ|7����vf3���[����1�KE��3�YqD���I�\�$�!`p�'�\"?NѝD)<f�W�>	E��o+V{*�Y&3�}-�>�Nihk ;���<P��^�?_�.=�P�Eg�T=����ߗ��������C�ϭq�!��*��ꝯ��L��&�k�o�͟��Y��7�-N~˳$��?*7_ZdX��u��$��F��봾&9��l�o�|^5��g�M���!y���٧0Xc��6a�n����5X���9�Im,ߡ+i;_ɷywIկ���r@���<�N�jn:�Cb��C������.@2H�����_�)�^x��A&�@F5��j%�?+�kD�>.`81����#i�������ja�Ty6�_�)#���i���ڈ���!C��h�	�)��UBH�`?�ikr�8�����1Rv&�4JڃF��X,*��C\�hȯ�J(3��ķ�z�Ć�!	_9j��H`���(�j㋆v]Ƽwˌ�{Ks�;9�4��ږ�Wv��}Y1��Ai02bN����e2L�9����/U=f��&�,��Y�:�s���m�o3��{���Z,�?���&M��GeT��#�h���MX-�b�n��L��H �WT����<�#}�7�ܿDcÞ�W8W�}Y4������t�4�/8Wn���z�{�@��r��豃CD�Si\pGV

����4�<���O��M8KWڏ$�݋^o����@��ꩇʴ�\�6x�|��GF���<�����
��/��;R,�f�` |6T-�G���mj/y��f��D+|�Z[��Ɔ <�(x0Be?9�$>J�^:\�`���� Xlz8��y�qgXaȔUz�Y駁����L�c8�©(NF�>�{�	���Q�$&�Yd�A�y����ⲅ�FD�l��r:|U�*���B7�\��p�e?
����y����Mh�I�1�	��z�-i�o�m�l�/I��S:{{i��x���ߒk�����I��F����H�	C	]ूb���WaNz��bb������	��7�É
�ԧ-zb٦>�V:tL���h�NT
�'^��뜺:W�e2.�L���I�:��{��Ӎ�jѭbKȐ�b��ߩ�U�LFvk�Z� ���u�c;#��F�/	��+�ɯiӄ���\)�6�[%+3&Dc�Y�0�qŚxvg�,�N��|�T8���-�(
���K�%kN��L�?kN��~X�!��CSr�rV�wǗdK�9�CW�	�p�V��|k4�2qP��XЪ���y�1�S5�K� �+�B:
�$�'^��/���c�\4�v���UNA3�X2�L=[��MD��E	�ͭݕ��t���F��#�O���{�X���z���*^r|IJPe��m�3��w�}�yC#��{�XK���ޢ�zY9,)��5l.�zh��p�›/�0�k��N�`�X7"���*V�'s�ut郫��^��%n��������^R�}��
�eB��9k��W�K�P��x�nU�9r=��o�%脎'������D��#�#�X�8��1����sI�fK��e%l@��}�h�����$+2-����] �l?,�^8%��(�X�s���R��Mm��&�N���� ̅�� ����x�l���(�s��%[p�PC'�&m�
Y(��ح�xor9�$��Nf��L𴔬�ai��,�Ӟ�z�����D��_:�p[T�Q��&��re�d�.'�>� ��*��m}���[��"����0l�h��Txz�*�:7�2 L��M$�&^j��w�����۲`
v����[�O�Yb]ZjK��ۡWa��97��v;��H�������H��>b�f���¥��GB4��w3�i���؉>eΫ��x �������cB��b�(�+&�rM��k�hT�r�Wi�R9�̾db�3S5�6D@B�c�Z�u����S��c0ݚ�AZ�Qu
����z�D�H�w85�$�)��ף.��rΟ����2��r�^:_@�+�
�f���=h��2�E�Ma�H@R#|[�Ǖ�_?*��
T�
�n�
�l�]ʃ̘�G�֜��L*��ʞ��bO�^�i�o��]nϽ����m���0�5�/e��i�̛�rr�@�z��Q�ܧ��Ǟv�%��K��h2�;��l}�]�5���qF���of�6���k��L�-,�~Zs�V0�b����I%���}���}(L]���,7���3�d�����YX����/LeV#[	]l0�Qf��:k}�$���y�B�kY��J�
(p�ô�G,J}��z(�~��r��E�{��!��2&��S���6M��F�Ny�r�3�"�I-�xNsʢ�:b�Ѩ���z��:7�z0�yÉ>y���RtA#K�5�&p�/�T<r��!��Mql[kG|�N������Xׁ;ڗl+�9��q���2Gn��!��&�Q?_�G������"m,QC�� g�c��+��悔��/�5����lM�mS���"�M]ݳBc*X
{�Q��|��ERɵ�.I�$D���l�7pOzW�K�Xq�D���ʾ�vUBE�/�E~��[03��a����5��ߢM����@k�E�t��Ѿ3�I�)¢�� �&����T��)C��%V�ũ�9���O�υe�_�0
�t.��b��h��	7��q$���i���8&�M�7��\��k����˶�������G�B���x#6Z"w�'E���"��}��ZMٲ�����Gn/{�[M�e�G��-��M+�l-��X#yyA�w�G�4����x��y+����޾\&K	��
���
�s�*�A�'��_�ʛ,bKCT���z�[�'}d���g�Y��9�L*<����P0
.4�� �;u��8��1~1[�q��˯#�s�m^��S�y�؏��aK���m����6�0y��{�d���%�˭g=y������ɘ^��H�='��Zę�����WW��m�
��f�
�Uæ�jʷ�Rsm�5Jx�qfR���vWec��7yC���hW'4k�
�$�����4��/:���"�}��`���_��<I?�ۊ��oc�X�Hs����D9�����Xs��G�y5���v�^�̙+o�9�]r&F��R���9�g�z�nՎ�gA���$r42��R(�#r&���j�M�NL�W�&���v� >P���s����Ҳ�LySz���_�������<Y�)�V���B����I�ki���^BQ�CS�3����ÝZ�+q�!*���~����+E��~K����l)�G�]G�dm;N�AF��7o�}�&��
�,҃��.��k���S?[�x�_���E��Nabu�d_�sx�s7���==kX��|���}�����L����|�+��8�?&1/����חP;�n��-x���y�K����6	E5V�Ͳ4RK�Y��7(*.������Y�>"A�T�q@�`.���O�"1��iז�nZ�	����dqW�h[�
��st��8��:ۦT5N��A����� �d~^f���d'c��FʢO;���4��
�GmV�|H潘�a�-;������F
^'���R{��wa"�l�YR$MN�s��__���E)�)�/L/��"{

�6,YrF�~-Hcc�#��%\�
�#�Zh��	Ӹ��+á�T�r�5cM�s4ܣ߂.�����b�[���*e�=��H�rc=��G��FC�[\�w��<�,�`��1�PF��|�r�z�"��x<.7�9��?��=�
>0������N�������ߛ����xNm
*�
�ݼ5�>s����o��[���xچ2�U�CԱ{S�z�ٛ��az}��㼖�>^�H\�J�P�
~�eW�=dR��$"��#�j����UY����4�)w��}�g�)��#ďBs����`� j�x��ӈ��8�Ѥ��D
���9�i�=���<i�q
	@�fa*�(*@)G�qL��(��Z�	��NJpЌ�3P�ٷب?%�n$�K"��p@��a��C���ߨ���>�y�8斮����͕M^_�Tqŀ�g��PEk��4$F�a��I^��6�_G��Kn�j�S�]:�]�R�bc�)@O.��?���A�����G�h9����2p�<R
O?J�xy�TU����{"Z�?7�yp����Hc�ڐ�$L�P�n~��E�<�bWMseh|X���3
9�S����1UF��w��X ����跛F|��ˆ��"�(ޮ[��rEd��+�)30!��$F��ɐZ��fŮ�Y����OF��g�磏�����>�V{��/��w��R��Q.ڨ$���3{^H��L�+뙻��Ǐ�\{j��Y����I��=�a%"���N.`B'Gહ�UH�)f���sftBvq���բ8�Y��kPUb]�� �y�(T�+�̒pں�)����	���`��1�94�TX�8v���2���>}:�lt,h0�x{q��lb>��
�o���y���D��Uy����'�gr���}�"G��8yYC2��3i��U�-�h�)p@Di��ܢ\�6ZEP�$Ls�$h���GEu�����ي�y7��<@cƑu�w��=�A�K��;?@���6Ŵ�9Cm�_s�<�a!�����PL0��j*)e��LD�]�ՙ<�L1IUZ��x]�u��u��ka�$�'�ӗ�Q�
�/�N�Տ�(��<�U�O�R�"��ռ�
F��'�F���\������m�J�+�p4y�͌����I�>�P�U7��R�#v� M*�a(��4�+.�OCЇRq�u�{�dNLo��	�7�s�AiA{�6�z�s��G�����3�CQ|\� �"�Rc~��8[�����gh����9��c/����	%��V�c��%��M]�x�˵��
�0��zY�b�&w/���%˙���Y�!a$���P�LY�8L
�A�����sE�F�&��e*Cƽ�n��A�\��I8�gx��oy�/.���Lh�`ى8�m����6%�������%��@�_�r8�%��}���B.��"=0|���X�b�_Np&n'a�[d�#FhҊO�N�eґ*�7ޏ;-7<F�
&B+��:�Z��Jg]�o��M�t���V�#U��4���A�Q�e�FKܚ
S%�"�h�i�����@�ȴ
��w��S~����5M�Ʀ���'�1;�hi|�,��d�^x��� �K���]��3�S;b�6^(��;5׊~�Y�p���a��o|�q��)�����ˣ@L�#($h&?c�cF��1+�i}`�a5�Օ�{)W�:k��K�$�>���c�7$�_`|_�$�Q45+g~T`�̬��e�峣���J��~�7�4I���K��P�g�a���A���A#d�4ʇ��Y�K��0�ω���)���u�Qt}X+A��x+�>_|D�/%[� ��25)KG�1��)/v��od��v��T>�X�b\"x�Y�D��
9������$f�:�:b+�0�ӥ8���fu��})��D4a��&��sDR�94�����ǞV�" /����d�'=���s��vVʿ����#�F\��0�t��!�L������0�B��T{=� ���<�|���Ȯ4�m���bD�ޙ$�8�|�r������_~���Ư�%)J��e:]��dlg�	���NqanS+X�jD�t���y�;�p�K?D�;<�
n'O�◖W�䏡�+��a�H�A�gg����=�Գ��])�Wn�x�P��,:�|�7!�QfdI��-?��Ć��5ûsF;�^��u�ÖFT'�罴'DM%���6��ey�X�yQ}�1���.�Yҵ�m[��[��uvg\�1���������`�i�w�z�_��:�,��X�b�,t�C!�u���k���<r�N�)��|��F�ިli7"xx�c��`�Ũ���Sv�"�|E�`��g_]u�2�m�ZF�k�	���KY�,�+<�\:adV��v|��s5�6A���E�A�&*��#|����^�#^.?v�;95�r�Vu��g��mJr���˄ʌ����c��&N�<E�k����[�����J*
�J&[pi��(D�F�8l�M
�p���:���R�_X}N�X���9$�*�T�Z������I�''�k���|^~�3��%�=�S��O؈�����@߀��&���y�f�cS%)zx"���"����p'N9�40��?�r+m(g
�v�2E���,��d@�N�`}ל��7�co�P":��1z�T�Wl_�
�6@�@<j
m�ު�'�:�k�۬Hh��a����7�!$�1C�C$爫gϗ�l!q�o$�m��3x�#�:���N#�j�ŃM*�Ja3*�VZ([�M\":#Y��zܼm!z�j]�T�n;pjh���Mv?ŭq�a�1�*�kG�s�*��q��%�fhzJdJji[�0�^"�P��q�r�8�6����⾡-h�A.��Q)i-
�EL]��3��β�d����P��F���f�Q&~��ਦXJ$�ʥ�"�����!mAA ��M$���x�c�\���H$ό�I<�1D"i�#ȢI�oS�K�5�ZJ���Su5����*趘.e�4�Ⅴ3�%n����j4�M�`\�u]�&M.��W�MV�ȩ�Kx�E����
4	�E�d�L���+�i�1��&��ȅ��+ �I�	�N�*l	�K{�B��
�D�Ëae�f�B�pI@h��\@�ֆ��p�{O���s�O�5R.y�7,+��o��h�h.�g�.h�#3>i��l-'SD��x�����Cefڛ0��h�2��BM�7���]�)�ud�c<�!w�0g9�ݷ���Ś�b)�� �5��ى�C�����’هt[�\����#��ǔC2��m�N1"�k���-g5,����f7y�&jv��?X'2Q�E����TG(U�g��v��O"5���9>f�k\�G8'�@nI�v4p�oR�$��ql�%���gX���\��/�qI`�?w�~H@P
��f�HE���fB3�d3��F��Q�ɷ7�������߃�����q�@Ba����9r!�\����p��70gi����H	��v���V������⩶�;�!V'�Y��~m��p��$ґ�^�tU&#"F�N�cd�/�Q^����D�O-�,�������J��+u�Fݍ�$���I��D�]g�%Ξ�1�(Gќn)���L���&۔��rj���Cl��MK�OMt�4׻C���C�3�mlQ\cy}���b�Ⱦra�B���owЗuJ�s$(�lVkNWB�R:�c�A�X۶�KToE�r�I�+y\��b�h�y��3����+ԗEb���i�5pF�$-e���ˉ��H=Z�V������r���)���[GS�x^a�x�᪥�V���/��+d��B�`X�"H%/����0"�C{,�8��k�ZI�(
$�i��V�6����S��H(���~����&ƕ��tv��<F�d���	0e�*8m�ml"���?Ԋ�"�Ӈ���|�^�d�A�Yա�N�E��k��D��0�n�]��3ϧO������0~�Y?t��fu~��?�Y��w6��Ej�4��R=���6������XX�o%!�x:�3�c�[�hEڬ�W���E���(ɠ^fE���v'*I��a�}��Xx��ř����/�����[���'z��%y�7��f�#{>C�|��S� i�d�Ju��s��B�'?aa2GN�v���O��*/��~Q{g�e`D�%M׷�}��w�#3{�{]X 7P�(�c^\�ܸ�Pn�N.HA��&ɰ�\āByL�A�F�+��	n����C��9r8H��h�s��p��R�"���?>�x�UYF2>����"������TE�ۢ��&\YJ+�[ʼ%>`��Ʊ����3���)��0<sY�Q�ݫ�"#G�[[�N� �G-׬A�*Eׅ�\*���RT�����$7K1�c�\�����d����k�+@����^�=?�,>��)e��{j�<�9�0��aA���hK
b'�.���)m�i��m��Z}��؎��9�Í�PR�1��Ywm��<�9[nq9M�:�����*�-��'rəaS34��!��,�!~��95y��Ex4�Srpx;��zsn��d_
c�[�B�)@��sc� tݩ���o�!v,�b��$B�"B �z�>S�}]�Y/ڑ�k��J�O��2�qt��l��on˄�'�F��/�����"<���_�i��&�ݻf���U�=8�j�B7	�l2����w��~���F�y�T�����m��7�j�
�����b�,YFI��]E�ZpHR�$�ໜ\�媁�RjK�d��cb���B�,2�A[�{w��A���(|9���V�F���Ȇ�s*u�e���ے����-�˙&{?f����s��6�fK�Fr�} ż$�1���\�m�J�LS��H�n`˵��抐���I g��m�A/�/��홹w��WR��ƈF�i3ny�m��6mʩj�	���b�.�}�v������&c���̱�B?;6�����:��0X�@��b��&+��lK�+}�x���ko�Vh�lTc����|���7�N2�ʇs/���;�L{v�a�,�6�]A��fEO���kb9���ꊆ����3�+��˗��?_�zճ�>N?us�܌%&�-eg�ʽ;Kލ�_�scv�Β^o��D�r%�0j?f)��dC|�^��;e�{�sRo��$��9N��!e�nX�\ej�;Mo����4����M)�aDƏ6N�6�P\��
<�(�k�1Ƣ�$7�eIw��m�`n�]c��=LW_G<�(i�Fsdžy�D4-�B��x�r+�u���,�-�XƘ�N������ĕ׹'P��
�$�}Q����C%N>x?u�i��oF
�Y2����HgJ6Ǯs����0+cN��-��V��Œ����ؖO:��7���r���3��Y�av��|����<���}p$����@vuFZ�XQ�3�Uh�{�[��n;(�A��)��E�P�6�I�%�����J[��n�Y�S�{?�?�E.p���i}�+ƒ�s8�͸�ܴ�G�Π�D�A6�+�2��&�Y"��(�:�6�'i�=ZHօ&�A�eZ���f�<�8���fT%�2���^c�r�c?J�	~����22���=7}�ȩ�G�}�H����)ϔ���3BXy�'����um��XQ�#��a�w3r�����o
O��H�8R�(ۨ�{���p���x�&�L�I \��B��_ʃ(�K6�����h�䣓Tm���k<��y�|����ʸ��=�_�����oz�u5ѿO��d��D��(@�Ϊr���ud�|�v7x��bJ̚�ly�va�L���>�;���ݖ�g(9����d��֥���_bm�orE��.�4b���@a��]��P�f�g3�dM���拍)W�����E�V���2[7�m540f�5���b��x��>Q����iX!�*���=&�%c�V=����~zFi��E���oj�Ĵa��2}��߽���?^�����C��Q�ksl�^�d��ı�s!N��ƾ��N�e��������z^��	��2�+x�Ҵ�A��H76諕$�3“����ڞ����O�}���k.�aY�zG�v=�j�2+��x�Ngy�<�!��\�q����et�Nܩc����ƃ!\���;�U�q�jƦ�)�=�1��&�,5�lE�0�40��,!S�P��i���2�e+��`^'��gכ�o
-��m��]S
̘�Z:��䃇����wNսav����S��v.���x!�xq�(t�#�=���0ȓ�	�j�f?Yh�g�N�k����#��Q҉��	O��"��I�Ch�FQ��v�I�@�C�F:Z�_A�hҌ��VL/@��y'�9�Q~G��|̱U��5Ѐ}~?�@)���@�_�Z�Ka;�E.���Mv߉!��a5�=�$6�Nak��.t���MA����U�lmc�U�'!�q)\=S��!
�`@)ۨam��u�”<��r�FNDb7 �_j����ׁt��ܶA��K��7��0��j��,�^���#@V�I���f�U|���j�3��29����\�#"���!F7�x:E׼�4���GN����n���i�A�4��ק�#���9�n���c{��=V��>.�� ¹��u\�N�I��u��c�m�x�,�m���R��nO߃���`ٽG�v����E�������"]Y5-�j"#�U�T��|��.:ڱ�>���1��~���\�Л'�-�2K1�\�|[U�^HR¡`����¨n���e<�6Jb�9�b�o#۱u�Dw�S��������ig�7�L�p0���G\/��#x�dBr�[v���������T��np���!��̤�yC��2`+��ɒv��ū?�6�}���kx�:�����w����}�׾���I�iB����p��
N�˯ք�Rf^��1A��{(��W�v�
��ܜ)L�{�R���?�Y-� ��P������r.�y�<�a<�{c��_��8��+|�4�U���^�U'g\A(��#:�j�[h���PF��I��n�p˚�UʂR���1%��qP�:����4�4{/?��<�ٓ��ϭJ�����UͿ��>o�Lp�1/�"q6�!
�b|&�o�H��>/�_���!���\�r����V,b�����SL�q��ͧGb�+�3�l���)ِ@�5E�7v��p
\��z�l�)Ơa�e~�r��+�Y1���f]�dlC���v-ŀ����DW)ȗ�&A�W�<���&P���G�.�
}��Q��/���e9�hʆB��'�q���t.��rB"��`đ�i��ɷ�V�4�H#��m�hb^Y�ڇ
�No[!1�w�§��>�ȉ�ٽ��?������@N�B/s�I�_�')$���b�䀱�5}S�x�r��Q9��9�׳='z�Qg#C<V]�����O]KMA򤄶�#3�Ե�3P�_��(�z�\�{����2��c�e�e���6q��x';Ȓ��Gl�o���OJ���3�4ob�����9���>��Sk5���S���7�v��x���� ��!��ٺ=+$���S�2����G&�_|M�\<t��od��p|2ғ�����DZ.�˜�U��i��_בr�L�,���f�aì�8��	V�gbC��u	Ľq��-�$�������ǖ�c��fT^���Ut{��U��>&>��?}�����ґ���s��=t�)D'��~3�sGcԊ]Z�Ǖ��q8�<��w'��\qպwzV!'X'�p8Sx��t���rQ����K���}UG���O�N�n=
뇵F�m�K��=���I�	����d7�]�
5�E�C�zq�k2Cn���d�KW	�z���H�S9*�S�~�{�a�����E�+��m�4�D]�)n\M��]-рmj�1�6��_(��U��K&�zP3���tXV�d�a��+�>�&���L����Ah$�k��H�B��u*)<�C$XO�9��9e|��Oq�W�ኛV�5��ky�VfR+�ܱ�^��~X)�����l��?���%��l/�f��.nn�~}|,G����s�q-�Xcz�<%�e�<�w�+�똘����	,k��0V���ٙ;wGp���u@�i�W�=z����Gz֣���qe"�@�Q愃��xf��	;V������5�7��|�d����eՂf8���e���ar$�n|�;�!#�,��Q;ޓ���2Y�	�a>�@�y�����1~<Ï���G�@>����%�'K���Y�1z sGqL���.4\L��N�H�P_�&c~B�'���c�������%b���.4v���J����	����Oer��zK͈!L���	=l+o֘+��.LiU;��xC�{�4Y�6����m��|�QpW-}����͍�`�碽��z6kTdmd�V}=v�e��[m6�|�F��[�
ET������j=�L�4*w�^N��j�m�f��t��̠�b͓�Kg���:rPo���tRBvI��A��6l����� ���n��Gb�����C.�|l��hryq|��Vi��O�1�\J�=�j鶬s$�^ɜ��]�v�a"��Ag��vo��D�R��no�H���^�����:�W�C��y�D`u�l|�&6Ҟ%����m>��b��p��f##�Be��%�e
>ꐤj�XC�[�d�&��
�02}�
;�X�r���8��1�4��`1��n���9ˠ�Q�f�$����Đ#i\��a0�����o����OjhGb��6T˴-~�!# ��8���mK`dVMp��\�h8ݦ�T��{V��6�_������9���^uk��T�[���������7��	�=�<��>{;ip��d.�Q�=h�I��߅"���
��e�I.(AcL0נ%I0��g�|��ѷx��˴M�M/AkV�M�Iy���#��
+��R��8[s�ҽ��Ƀ[�u��E~�����@j��8-Z�%��l�g�Ŀ�1��0�7�����"��+�u�_��Sm��yy"K}��|��Y9�ȣV�,}{�at@6d��@���H�K�䃁�B��ܙE�1P�A&$�
Ҍ��L�N?gڊ{׎_�V�@d���n��t��dT�����b(��s�A���X6�5?N'[�a4߈�G���X��/mYxSCo9�,F/`�[���IA�c@��
���	�{[�M�@�g[�a{wN�iR��+�I21��v`�t�A���\���
�x��NE���Ʊ.p��橑�����O0��a��{#$�p�
I΀a!��������<�H(B;9_t�`LB[O�N�'�hE�-v��YD'����ϕ�3
s%6-�MD�u:M���Cӓ��{ټ$i�m(��]�d(�W�0�șh��$���a(��	v�w�]���#��r��\�+�)��,�1PN��b�����ej�1��/�Ž8�T^�[�Hn&ު.�S��}�CRO�8.�A�όp��<��T���R;��n�q4K�G�[��RT[�.�c�L)$�̴^�bdyz+,�|�\]��MQn�XF/����4�Z���H���\8��{�{��X`��������\6�Y{�������ƌ5�ֆF%��KUJ�I���$�qɛp�)G��yOM%�f���]��i�v��N�h��b�a��Q�l�D�1vBs6�I���g ��Ʒ��t���aW��MU/?_ֶ�Ҿ��'68��4+�8/�#�����V���J��N� ���9���#��; '��(4�D�u��%��m�D���|�`d�"G�~`��R�5ѬH��I��f��9o��~6r�S��LEhs��2��ғ	�6�qGc�.nD](�J�=k�g��!6�&�;�����*d/ԓ״�$r予M�7QI�L��Y
�K��{k���%sN��*1�P��(�|��%_�h���g^��w(�E_
�x\��,`Wh.�S�{v��R�LOP�u�^�E�eߣ2�������G���6�tC�C܄���l��v0A�Ġu6���o�;ʘ�`0#k��"�si~|�hDZ�j��f�N�#�Y^��4�X�#2n�}�m�	0h�^ꈽ̬��<QLVftq����ҋJǁe���q\<��,���\��;�n��G;8��:��k�؈l�oqLB@`�����8��N\D&➵-LJ��6���c�Ί�~J1Mj�ʰ�(9O�,�t�/�R;��d���&K@�%(73�m1�PM��Db�3�9)��'���I��r�CS{�
�^Ѡ�Aػ9�{���k>N{�L9�]��R�kR�b�4���Hf����e)�d6��*Wk��[�h��H��&S���R
)��5}K��Gޟ�D|AгK;p=�N^�4cה��t
;�yf���3(j5ل|��ov��N�d��/�=o� �9:9]4%�^���W&�w����H���>}8�|��6W��2��z|�nS��\����/�l�neJ�e:�<GV��Q:cUmiۏU�����"�Cq��y���M�%�=���|�v�i���6.I����-Ş�F֨x�*;B^��f7�P�&7S�L�נ�
s��c�|�N�)���M�<�X{�S=��m����͎o��F2�"� nM>�|���[�ǃ̽���@1#6D8��+�,�<9!b&�0�M�� �\�$����6��^b���&*��c�x��͒.;��}�HE���75勓��y�qK��b�L�=��=�ॽ�IRʒ��
�;��AY����tا�k֛��>k�v����O�s�c>��Z��6�sޣ�O�cy`"mRn6=�k4,�(���ZI>9�y<2{.�l��&/i��"�J[D!��?�4���`�~�s��}���j���B�D!7�^d	�4T�{��\�;F�a�F&�6VޟƹYL"�Aaa�tה������E��(�o�eV^�6wc�/�,i�V�o�o��y
1�Bm��9����g���#���2�S��Q �|�lUX��%��=y$RL[��!�"����!Q��@T�Ɣ��*����V���t�w>i�-���� f���l�5b�-mV��ёi�
�<�?�=�~V�D��M�8�u��r��:�	\=��pַ{����|h�Y�se����ژ �G�=E4c�Xb��\���C:2Y����^W��<b���1e��#Wfšw��T����p�-�Q�ױ_����#2xHg�5͸oX��gTX��Q,`3:�k�}!Iw[L��Ʀ����^��]{����IRti,��y�|���V R�j������d�%Y��p�gE0L���ɂM�d���CW�bʲ{����}=����lf�c�Z�E1�M�{*N�ܱ��V��J�ϑ^�a����yXr���3t���>��\;��`�f|K������"�|kv}]��nG�RJhGJS�gG�SJg�[�0��Nڰ[f;�7
=]�c��q�&�	`\'�`F0Q���������(O���>;��X��w��kt�Y(�>mX^È���ӹ���[)��G�1�W�dn���~�|�Ke��#(l�E,zOv���Ҵ�!�F.O �i	�mj�ܶ�
|�1�2[��J��"#���y9�d?f��P/8���s�x�}K|��$�v���������7���o40��P���4�ᇆ��WF!�!�Q �l�J�ڤ�5�t����s�� QwJDJ���S����HvW�F�{a��"�L��|��">Y�nQ��H����*h�)l�/��t�->dd#�HP�Dr_Iၟ�wM
/߄L��@������c�C�z��_�dSܣ$D����$�C�>>zϏ#`�52�c;ɡ��Иߵ��Qs�̔�V�1�t]�u�/�c�4�����Hah���k��%�%Ӆu�wQt�tWΒ7�SV�So(Pz��c��Ӑ8�SZ5��Xlr���'�D�2��@��s�,��t1;�Z9T׻���0;�Ej��=����)����ߥz_4'��x3���:Z/lJy��n����jH��8�w��(�d�|j�rޔ�T�� cOQ�����:�v�6��8@
��]�@�۰§YZL1l�X2��IϺ�#)��:�����6�y 8��a�PCԊ]$!@j�
��[J괐,aNQ��8�nc1��é�j��0Eطj��Я�V�;qD�
B��38\�f�N&l�����M�<(E��]x�C�t*�u�l볏>B�]=�*�+���҃������?�0]�ʣ��J4���$#���d�����=��Ca9J��j(�E��@]���W��������4�j����y�jn��;5Ƕ��J���E8i���N�f��|�	SVAF�j�[����]-�\l%����eMv܆���hq�@ݬ��U�ɮJ4�pg50��{�v�.fe�N;�.�m��l�*�9���{�ͽTU	�MtA�=Y��E-���$B�B%��v0�^�Y�A�;�TŽ���}m�?F���lJZ�W�)��^���T�)��`���K0{1�l/m��sŽ�)�/����@&�
� �Y�����I
e'��B����DA��$}pFc|�IeɆ��&zY�����Ӂ����TJ�K���gI�)I~YMYڍbf���h�K���6s�KBq�:l~{���\-��c�Ï�c���F��"bhFJ�.+�;������%�&�!��
M��k"�$�#�sEw4�E3�O�
����5�}��>��2�	r6H!��A�;�ٱ����d���!O�J�b��K��an��:�s���+���͝�FO'e>���a��H�h/>�c	Oؙ/S#���3��lF!��T
��l����<�g�~�5�B���'�=�Ɏ&}��FN���o�[.���v&��K�X<��}n0$�[q�s�Y[�u5/�֋c�[+fE��̜�I(۔Ѐ�m�k���;$.]���t��u�:B/�7�S�s�c�X
�hb&V��5Gؔ��
����6W�7K�:l�.� ��Q�g���Ft��M��yp��D������q�K��������b@F1�'6�4�>׷d'.;��X��fM���|�ʡ{6���f�̍]�r	�A`��gn=�U�����S�9�	�Mj��9\nN��7{l6��(���9�c�?�gi�9��#䡐�-彊��b�"�.�Q�c<]_ֽ���6�~�M�O���x�<�rB�*�+_�0��;�� ��\�5~Nx�;R���E�Ք\�Q��V-{<�P
vOD�M�ݗ}{��>�KOu�<H�.�����𻢟��T�b�S�_4���Z��!���o���~��;iC��
����IC�(ES��`�S��ؽѦ�6�X3�|!q?�-m2,�!7N�5{P�)������&Q���#��D�ԟ"i��M�d�W���-���I�a����jxt�c�<|���}PL��1�a�&J����I�d,���ْ��z`B���xi�qN#��MO/�KX��R<:�
�##��؍u��ex��0y����/�D�2&}
8��3/��J��]�D�׈R׭��u��*�k��f&�r�I_�4����Q-a�Mz�ov�ʆ�4r�EP
ٰ_b��U�_&�-&BZ�[sؠar�b}��U�v���g21��$:��9q��F�?)�*Z�cA��h�[�6�U�����hn⩉L8���ejȱ��
���D��8��(��*�Rl�̟1����P��5V�r/=i�)ޝ6I16�CΒ�
�iq��H�d���0]P-��k8�2|o)B_��� XN�/���ڙREC۲&����#��ʪw�d�47Q�^�z��X9�؞��QO.z���H�d�ݚ���pA]\��$�W��*�o���B�$����d����v�a�t��y)���8�:)����Yӷ
�b�
�qa*c$�K��Q��>:��6���#�k{e4�%���莒�@>��d�{(7�Z]o�T�/��p3�&�(�X����"�HA?SB�����7#�F�gBY�N���7��=a������0J7q�!��[+mo�<����W)��
҅i � ��fc�^C:�+
�E���f�zML��a��L�N���X6�ח�@
,z-zQ�N'���|N0x��H���Z���?a&t�u��@����FZ�䎩�l;��s�o/��K�f8
�g{�_ʿ�����nQ���q���y�B�b?i����
ݧ��
��6*�c�!՛�0�z��_��
�5�!.o��6Ǩ[F�g�;Tw�GJ��Z��l�
,��P�i�n0���c�(^�k�D���k�L>�k�IBao��8�<;�Q����~���� ���j[#B�8&V�ͱ��	���i��2�m�u�@Y�i��)�q�aN�)��.u��%t�@߈�o�bP�{��`-j���M.���)��-N�1�"��c<�5}����,����\�8=<x��8����̔��w�x���s�wr�������JA9~�s�;���%#�^��<OiU��.�)�|��YD�B�c���l9ȵNj�n|~fs����"�[z2���[#��e•���h�@����,�0�j}��uZ�ݬ�70r�Xj
��qbV�K��t9�j��m�&GaH����G2�2���Ϛ��fe�ϭG���t)�6y����Ϡ�	�7	�#�#aݲ\�Q�Y��W��ͷ߿���?�^��o��~��˯���Wr��o��=�Ud �y��M�,y}��x�2�,6�Rv3��*Eg���N�k��Cp�[�c�i�Vw����E�	N�6KҦ��De��3���9,zV�;����S ��S>��{��ܲnFY3�>Od�3i��(.�`Q��;��.�Ej���	Scb �c١�*�U����rJ
&*�]�ì���#QꗿT�����F1�H�}�M�QLee�_��H�B0g��4E5-d.o�'���ܴ��b��U1�,�.����&ԥ�@,#���
�h[g$)�ⶬ��2��E�Ѥ�֙���	rMTь�-05$5��ݑd<��k�hEo�l�����K:�B�b��r��}	�`l�h�ì��~��1��)Ш��?N͆pՍ���'>�
�u��{*Э��9�ɿa���ʻ���@�˰e�{^�����/>%��8Ձ̠+�9��2![�%���xI�,�6�U�B���5B��CeF���
�,Oui����H]T�H3�X'^�����O��R������k����:e��ͤ�g��A\�.\ݺɁm�.��</�P�V�T�R�+Ѿ����nEx��es��ч�K�E2\$=�	D��.��r%E�it:��i�Q�ܱ=�P$���DIR��E�ަ�cR�PЙJLi�f�549�"�±�;[��E�j�{T�
�};�����V�H�	?����=�8Q[�WV��L��]��l��*C6!q�s�Y,YE�F�XZM{2L��k
-���7��y���;͗w�dk����i�����dRA")�Q�8��5 7����[ME�-K�U1!��ז�H�=5r���^�_�r�Բ��\���[���_k���|�ƀL�9�?l�>�C[�|�1
	�R}�}�2�!+>۰�Qf&^|#��9H�o��_{Ř��q����R��.w�%�[���1?�[��1�ɘ�F>�v ����2Y8
W\٠��Y�2wə�X��
p�z=����W�<�9;!=x����cw	V�&�?�����P0��� v�M����~�����yߘ���E��lَ,�Jl���Y����!�,Dy��M�CŊ�)oF&�*+8v0�����+,2̇�c����������>�}1�B�B\Q?'��c�d��ɜd�+n3�����F��A�Iž�/O_��?���$_?u�	��>{��a����;�����~OZ�2��~��т�6E�-�*��;�4��_�'�˫�7������3}�2g�Z�V��,Z�Gl�'X�
'K�g73��li�cS�(����ߍ��~YZ� ��=��Bf��"RiGq������������tmM("
�Ƌ3벜��&�f�<���G��o�����~�qgw�>�G���Hŝ����MoYЃQS�
(���Js�:n��dM�/�P��G���A{�S���qh��Jl�ILmbf�3�Z�@�����Ir��h�����&�A�iT#�w����U���O�~�#`%���>��+-��na!�P!�����Ǚ����dع���0XŒr�iɓ�c@b�
��i��*���oEN��?v�
��&_�����K~�.�֪
u�Cu������?M��5�^��k�T&�+�p]��w���N��X]��aȯUSd�(�ȑ4���Pp���**�Y��W��a��Ɲ���Լt�!�#-�m�J�v��և�੪�J">�����-(I�{�Z3�PS7�Q2%�2�S�X\VfڔS"m�I����A�gEq��TF
b�8�?��R6
�"C�4��V3h۰�V�ASd
��<���m��%s�����,�pؚ?(*'�L|k$pO��@����C9��yX��?�S��k�,%
=Ͷ�"Rsp;�Q���u~#��L�!l�Ƞ�ٗ������Yo~d�c��e�_j���B��{1a������q���Q��BW����HDM�2�y,0�h���^J�Ċ�ɜ":S��JS���D_���K�E��
E{�0z�0!�����5��:��;�J|
w����cv
7���a8͡�mH�є�`.���C�e58�r�}lYa�p&�ў�[Is�uM��`����O����7�TZJ�f\�gV�b��a0̙�n�k���i��o9�:��_We�d��rn�|��P;(;K�:AK^c��zSX�L�@�=f���H[[2�^�
�S�pߠy�-u8t9��3��8a���y���kϘj��pc"��<Ş^uیNz��M�ШG�-u4���4z�z*M���mH����LH�j/��N�9CK4�.��ӱ�X$���c���b���.�y$OI�&륰�Dt�E�?����Y��ȁ�}$AEкa�!���&�����Nm�99,�5��ћXH@
�b�fސ�Z �G��@iq3v������л%��Nwucl���&��C��.�\����Uc������s�����
AS����}�di�^G���h֠2����\�n��yZg��,F�Rd0\�ihrBVXo_����iI�w(�3Uؤ�et��9�ND�̶i23��l�@'�#,pG�X"!>�q0��o3�?a�x~�h�8a�С@��~=�G��KZsy��|�PY�gO��lFg�e��f3>�/�:b	.6��B���2[éT��:�M����%��MV��㜱�=u6�w��X��@�p#;8g@�	#Z̳�p���a0����+��ͽ��(Q�f^L�$�c;Jm�S�f�4=��,Й���4�ڭ״k��lBd��,����f,�V�����䙳�2���vł�vZ]���Η�A��(�FV�#nhW��v)b�L#!��R���W�k	��I�-�G�*6��搎ی�?,Z�Ć��ybpPz#���B���\���fߣ!�Ƙ4�������K�XR??\�Xl���w��rx�jS|��{�Z{�S�uZ���G̶4�B7��9��?i,:�_p�둜��g��J�"
9��m���L�����M�8H������7��/Qv����ky�ߤwS��֑h��2W�X�½)�f�c,�Q�`��`�)L��X�5�D�q-��ٟ渾�5K�����̺
��uC�&�G���3k�,o45Ǿd%�6�~g���##@���Y�����iJ������)���3w�,{�z*6F�^A�``�G��v���Ȕ��Ȭ��)�S<��|���
����A�i����@	�j����&o|�G>p"��iƙ�ﯶ��1fԇ���46��+
��MB|a�h8_c��v��z��G��4n�f*��J|o��~�[����F;�Ђg��<�A5-JO�1p�!�V�ؙ�3'�Ğ��-#�����M؇�٩q�g���f��<�ʋ��M�\bY��ha��x��\�k�yOe�R���Z�ulWR͉
\�C4 ��u�7�kU�KsGmŲ�O����Y�#q..V�~0��0��@�w�ۘ)�[�C��ǒ~�%��C�|�ym·�G�K���Pa�v�ۊ�r,�0�O�tm�m�����m㈡��
E���8R��Nhz�@z0K��xei-k�V���Gr8�쮬�5P"����9��Q�M���I�=��HqBd��y;�%�Gi.�t&��#	���qo�>W3o���aH���Z��qm�Ow��0{�*-F���IC��=��z�g�({?���2��j��`{��h���G��ɐ-��L�����$p�q�}�����=x	:x'&V^����>��q�!�H<��V�����_g\�T���Pe���:Z�����=�s�k�=[����í�)����9��!�Y��F�֓��ΕíL�+&vΠ4oT�>W���h�<�����J���B�8���J������V��j:�)J���7=J�-]��/�
��j��d�tM�#���<"��vQ?�c[Q��=cãI626��h���|�!	z����R7����5�����He��`���?�),�8�D*�s�{ag8����nn�X�CS��q%=��ڥ;c9��"H,t"�$�Iw�+��#֌��eRn�i�P>8�?S~C�b��O&��gd�D)vKI�s c�$	ي҆�RcM�,h��XÜ��қʝ��
]�13%.֟W�j����On)Ք�YZ�`���|5L#�9R��.rM��0\Ŕ�#��n‰�]lcʹ�&��� ��WT��Lv^�!I����)ziQ;�e�$�@��$��$��T�ٚ��p�؎�+YI G�������r”z:1�!Bez�-X�`�zz���M̟z��M������
Eg˾
�rg��`�jGc���J��赞A^��Hj�B�6��f{J"Ę��骨�I�����.�+�&�\��A��`�n�_7 B�qg��*d�pQ�޹���@f(V�ү�c�}��l�A�5����ݼ���H�㙇�7P���E�ki/���?��p��4�J�D�Ŵ�|�V�D4��O]���"�"��g*���(�Nud�!G2�5rS��!1�8J�dW那�@S�su@"b���L{�Ʀ*�8�w�PRi �.�(��ع"9#���i�fc]�vB�:�_�����
��B5o����s�R�o�D�&�h5�5��J��W�9����B8|W�{0p�h
$9\����Q�,�DO�{`������Ll)A�^~غ�
a"�[�v��o2C��-v�}�5�:�٣��+ �H�O�C�3��J$MmϷf����Eү`�ӒB�1���%�W�ld�0�3�la�%G<
�%��ס;��[꫇��
n�'�a7���sI[b�/ѭBڷ�~�ݸ����xXTt�W�1���g��EJ�&�t>��d箩݉%?4˿޼�B@7�"��AE ��Y2t����%
vЙD4�h:���>N/4���ɢ�P|Qz=H?3�\�	86���=�=D�N����ȷ�	[Set�L��dF7�:�5؏{&H�[e�l���
ĝW�#��渱�V�5�O�L��Ԯ7-��
��H��C���%*xk���JEg~��!��J
��#ԍ}}v�0������nP�o�6G�B"�lzi��?���[�t�c�s�~�˖wHX&5��d�r��%�\�n����n�Ǔl�p;͙Ջf��z�{��Ћ��}wc�-;o�5s���q'��scL��ooP4<���֮������Am�i�dY�U�{h�}�T&�x9¿AB�=�	��{qI+?b'���|���.���+�$��
���a`����a�q�XlH���yb֏��,���̍ku2�����a��(j�o&�ᄋ2��l��l���w�-t�.��j��
������(����z�W9X�x��~����a�]�,��/|���]�򈾍�:5_�o���@�b��#̕��dG?+ew��%�5D�_PK�mW�ʀ�8�?,setuptools/_vendor/more_itertools/recipes.py�;ks�6��+pN]�Rh�$�d7�x�晚ڭ�V&�w{.����5Ej	ʖ��_?�"E{��|��DA��ot7Z��矶��iU!�M����NaT�����u����K#�:�oU�J|==;{S�b��h���Wտ�ԫF6G�j�n�����z��J��).�z���V�{#W���Q���aĝ|��
���BFөH�mwW/^ ������u�yaw|�q�޵���������&�@���Ɯ=y]�ʒi'�{�oI�]r&�_~'u���z���͸�}�گǼT�u�����ڔ:�/�S��7�l�r���3��ݲ���20m�Ȩw��m�0���
ė����Q�0r���<;[.eY.��Z��>���n�(]���?ub*�y�Fֺ1�m�~κ�m�*�H���="S�ꐫ�Q��lˈ�nx'���T��>��Q��iug}���<;CU�G�G���=3{cD��0�U��Ie���{����7]��f��P����i�j�V�Y���W�z��� ;���i�����Y��d�I��H����;�Y���J]L�	Nٚ�	�|!���L�+�ׯ_3��T�~&��x�_��R1O��W|"�
����
ϲ���Ug�T�2[D���⫊!<�3����x������-8	;W��q�E�8���]�׳1�X��k�w5��%�f�Hh�8�Xh�V��Ep�ө�x��&�����
rq�!C[!s�Eر^V��&��Ё0���p`�U�
�ߺ�p�ht�kIH���M�'�D�BxyC����صi8��z*�Y�'r2`� �kQ���p%b2��,�:�W���r|*���_	��T�$�φe�9+yz+� }]>k7�2/eߖ&���0'�`��ћ������h�_�f��|3�0�I����05�EB�]��[y(Uu�ٞ��t��/�*��7,�g�:9�U;3%�Hs����Z���
э*�����5�G�wT�u�~�}kI��\<�r�`��A�y�����]]�K�
`�z�"�%�4uUx�vA�	F'�=%/�ԞA�l���G�Trk��nj���J����Y��|*.�_�rx��~i��L$�� +s�8G'�
i�>j`��-t��<��C�~�±U��~���}"cb_�w��t�x�R��${u�n�u�c�+A�h,�}�1,�˞"N����4g�߈�0*��i�aF�y���e�.�kQ�͡��������"'\�fK�E5���M{gca�6�d<�W̘=�4�}�CGs��P���M>Qڀ�6��ʯe�GG,�<eS"�&��38uQ�A��5�,!�@�t��yD����6�Gq���e|q���9���h����H �=%�R�'�'�u4f�/�g���X_ڬ
OR��B��X�b�l&�5��ok�
�SW�ԏԡK��j�@�	O6)m3�\P��F	�㇋�#�A_\� [;9s�w�#�ku���X�
�C��V��K��
"c7g�n�ŠX�&�v8�]�2 �XI
�DAx�me�
�).��ن��A�Ϋ4l��i�˺ǟ6bdzޗ�>��*w��d�c�쫽.�plW觮2�A�]��鳂س4��8�Ϧ���;�.gC	Yr�f��R�4�8�����3�s�R��`L�@ޜK����[t.Вc�����p�E�M1o_:$K^��l=(G�W��;yP9�>Ô�Ta�:�����F�y����h�AO��YE9�=��1!�ns[H��?����ٰ��GUC	���RZW)C�ZƩ%�_�Sz���ԛ����*���byH���N���QY��y1�&B����=�eW�)�HY%��6'�F�{�.�&x����F!�c2��.��R�%{�'��>�K�	>^��2pm�r�ޒ��`w��.�+!*Z9�qe+p]�E����"�0)ЫS�G�h�u�k��
����޳�R�'��z��'Jq���.CāR��~��4V����%����[�ūo?���_�Jp�Hj�/{
bF�$lt6�J���iE��4��w
KW�{�@�d�x�B�Zpސ����@��P����Q�l�~�'���I���M��_t
����ز�J��j��r:�с,W�Z�&���Ԙ��և���ۼ�I�C1�W�Q�r1/��*ma���%�y�6G��p��m�U9������
>4M�00��ZD�)̧��������ͦ�%(/����1�5��܍��`����w\��l%�8k}P��p�}uo0X�u~���Q�^�ޒ��F^sFo���F�2�����_hW�^wjs��
L���j�Jwk1�/I�c ��Ppխ��`�L����*��彂�4�4�?��dT�9D|f}e/uC$/�[1���..� ��+w��v�I�I�w�%���T����_�Zq��R�#�a)x(:�vCɢhXjG�9��
�|�j�\p���/�r0eL���a��xP����q'�:A�z���i�3]���3] #��B#��������~�R�"Y���B�0���
?���1j���������6l��*���愀���@rb�a�/��w�b��[������1� ,A�u_/C�2Hκ�NU����u�m�E�&N�i0u��|�^,����\����x�	���}-I�O�Z=S֚�l
66�ڂݘf⁂؎�5��Y ����	���Y�Eѫ��X���1#7�-��	;WKw���α�7��{j��8�*�N0���;�� %��7������vbA�ąA�3]�.d8�7���@��+��8t�F�f�3�X���x���#>��QoQ�,�7�k|r*�(���4z-��B�3�p���!$��0e�.�-��.l���Đᐳ��5���ߜ�5B�q���N�&z��ѧ;o ����P��ٯ`��]���!߸3>V�49��(3�=�6�t1��"W>�[d��p6�%�~�QըWy)���p	���{��1�C�*9#�Þn�s-<��R�ڢڻ~�D�ƪ�C��Q�j��)�>����'Z��]�=�}���s��b�Y�/}�-z�mݐ�u���� ֛Ɉc�q��CG48������v��ް�6�jy3��eg%}\C�u���h�����e^E�@kT�@u��8);%��Fo��۷o߽{O�3yS�6��Z�c:�6�%�5��6�BÕ)�����N�;�+$�?�+ǂ�J���9��Ew{e
�j��짤���8c��AZ��l���l<ː�,k�J�����zO�&d{��f^6;��PC�']Lc��n�8lI�
���z��Yل%�Rԏ'7��xd��+r|-n���4�k�a� �.�_�]5&��Gi��ӐY�VC�}L���?ʊx�S����~FN7��d�
6�EU4e*>�ȳ��y� �&���/KSҌd<�5��E�A�h�-%�s�i�Jq�L:�3-�.��ؘ���K�����R�(�2��B��W&v�o�n��Y,��]�%�4o�(O��'�9��oe�_�;J��93��c��w�`ש����K|����(rS�
�_��Z��	۫z�{�
xKlM�ۯ�|���}���]9����s�&��:�ӽ�H��C.�J�eK~�Nʻ���ڵ(*�:�Bd��+"E#u��w�30C�V�Zr�ǚ�Z�mz\�/�p���GoC�8Sa�R%��a�X��!q���e���@��oEY׻��R�ŀ��9ZNw�.��B�n�w1�r�1j0,�}#o�5,[k�IQ���XC��lԞ#Q�����m��
��z ����M�&�pS՝iXS�cN�'v��@��xf���~��3x�ۓe(�=yG�g�u�eP\2x��|�+ 8�����j3�}�'>݅��X8�WpNZ0�]�Ʉ�3�ί�A����딲uB�b���N�����m$W��5���F����=sՓ�r[��iAC]��`E�����oi�˳���U95��"�׉(:TX�-�%/�G�p��8��B@��:�]���KN�p�lg?�i�<����q2��&l�Y�rfG	x:���G����E�z�}3-�v�
n�XH���������@ꤙ{�p�'}��]�ܔ�5��gƽ�t0��|��
}�������78����d��E�a�c��ۗ�B�%q,�P���q�ڜ���V�n=�G�y�_#v*M������'�xk'4�g$� ���w�I�4�[eR�2�E)H���Џ���Jl(l�w��o�-_`P��p���/B��2���#֏�Sh�������W�F�U��"�zİ�i�y��=M3V��Y�;�o��b�ߤ"��.Ÿ�ԲwZ��2.�$OZ����z��NО�/|���X�P�l��rCũ{�:�7��AlJv��n�����Tמ��\s�0��C7 }lKr��B���=�c�zj�gn�:=ܨ���ʲ�a4M)H����b�Y�6���#�Q:ә���K
�"d9�[h������#�_��oS�H񃘍i���7>���"P�ȅ��Ģ�V#S�}!�bzv�~O��!��$�
_�x�B�3�шxE�
}���Oc��5L9�!���%f�B�9_T�ɩ?���6�^�T�q�"J]xmؼWޡ��;F�1�q�E���2�s�Q����w��������	����bB�')�
з��XV�cN4��h6�b�x4�J�?.���O!�g����X������,c��~*��໬�nE+������x���~���d�u�(QGO�vNx����b}~�,��>�u{?@��K�4`�SGL�䮿��+��w����_�V]EI�K���@0��m�1��Hc;Ƌ��*��Nt���1�ᓂ�'�uޢ}suua�tnξa�3����;����|��zfi;��^ę5�q�bEp�}�^4��̈�v1p�PK�mWZ�k���)setuptools/_vendor/packaging/__about__.pyMR���0��+D��e2��^Z(���CaY
���I���c[^��Wv2�s�ы���;x)�@A�>j�:�{��G<"0�)�r�m֝\/kZ��9[��=4�m�Ӿ��n9-�3����z~�ڌy�x�-
<�.;�H��y��4d�Y�	m5x7�RC��Q)�iv�A_�3�Q�q=}P��ɲl�Ih��6F�_�W��J1��busB�&�����c���t���ID���n	un^<]G���o�#
kq������U�*�99��1a�n�\D����!Q��>2���~%�c��2�}Ѡ*�J��}��m�>9�Mg�����&���tβ�K��ݷ��ϼ�!�Zr��?;R����;�L�n�N�*�*lZ��B8wr|��P�=��[�PK�mWeD2(setuptools/_vendor/packaging/__init__.pyM�Mk�0����l��}�}�0(�t�2�q��V��B���$��xɯ>��=P��B�]��"v�B�: (����$^G�氟�j�A�ġ��s�T�
�T�v���4p@���}�u�-
�ĄYg�<��ȑ��zhُ�C��bS����&Ac��Ȣ`��]R4����3]�a
�?�V����1��I��C�e�t`1�^t��E�4hA��,E.'+ &�\
PRw�OBE��^�cU�.[��N��yS�j_��X��Y�m�B�-
X�(�n���PK�mWJzBh'setuptools/_vendor/packaging/_compat.pyuSQk�0~ׯ8��xx��/#�A�����BJ�� T���ɒ+�����I��ftz�u>}��w���p�j�h�:�@���
:]�@�h����V��ݦ��:i4�¼��A�*�}�\�9lc�f��۬��:Ƭ1>a��q��^m,��iz�
���������w9ٴ�z�Ψ�#O�*y��X����]�@�
7\�XB+��[��#�������W�o�R~}YL	T��m��-Z��J�9\˒=t�
m}�����9,���R�f{������/Y�G��)0x�$]YD�S��:��9�*��S�����W��!�K%����>��,�LC���Y�gKm��oEQ�2��9�oM&���,
���	�H�I�S����4y��K'-�2�Jhf���"HY��PS{
	E�U�4��u*]f4��#����R;/���`��T����;TI�Q
*+J��?�ڹ���|r��ŘVОs����J�rТ!τ���d�a�zoa��4R 8p��g#�EzQ:R�������IՊ�㩱&���y�Lr�e9����?PK�mW�]�מ�+setuptools/_vendor/packaging/_structures.py��j�0@�!����c��.)B.	�
��*��J�@��cg�qC�8�Bu�%��F?�a�+���'�ԠU��c�I���n��ࡐ1w�]X�輲&����&i�:�q�|�����M�&��d���眵�cs�Y�e^j�v]h$�I*�GA���HK*
j]XG W��P��$j���"(�2�LLU�Ak�=LM����r[��0�p�SށsqB<�t?_�>Ǐa��<������ށ��\��+gنU�U"��a�i���E�s��*��Z�ƿH���g�{g&�x�&�BU�*�H���B�܋�~ß�̺�b�ʓk˺��4�]��9f����������w�r�G�΁�����׮��k#���/�
�}b~[�K�5dk��ҝ�+>PK�mW���n_'setuptools/_vendor/packaging/_typing.pyuT]��H|�_�h����#�@a_��ǣ�5��Q�Î�}�gl���,�4]]]U=UU}t�zֱ�vC���'
QGk(����=
�<�~���w�0�iE���I&��v6Pt��S
�c���}��S����.�5��;�g��L�ԛh�l�W���n�J�y�g
�Oܳ�m;.�;\\jk:���|�t$�0]'<k!U�`����
�h�l$mb ��n�?k�����<��*�vg�
k�汧�	И|ȥ8�hΙ��y}hE+�r�����
�W��؀����5=6),1��j>h(nt����&��N�<(�V���'��A�\���Tt�b�����E����
���U��%�;z׉,bП�IRV�ubj�\9(���"�=� L}##�$����^���᭓�V�>P�Q)1�{��ʜNI��l
�G��{�+����%�i�Zd-���MC
#���.B���ɺ,E�뒬��zn�$�H��[X3)ɪ����*E�˂>��nn���?�����o�J�=Οn��;Լ~��|�R������&ְi3�m$B�y��ߪ�*�v;����;������Tb��RH)�� �=DAZj>BRY�i�����$C@;$���іl�i�<����-��קNo���T/(0W��<��~W�e�R���HaD2~�؟	���m+���:�ya�'��X�~v!�ۮj�k���-��X��en�!�U�x�o����'�����6���~�O�.�n+���g�5̫rh�y*�op���.�M�d��{ь��U�&�o闬��^�E���W�m���n��--�Bx�˹�V�PK�mW�d��{%%'setuptools/_vendor/packaging/markers.py�ks۸�~"09V8Nڛ��D�Qr���۵O[���%HbB<���:�o�.^(�IsW}�H`_X,���u&�2���EMs�gsVH� u�`�TkF*&6��z�t?�l@n��/z�er< �X(�7W?[��\1�OO�Nή&�a��畦
Vr�U\l�ޒ2�2g#V�,�Io)���鲮j�Ҕd�����[��b�~�Ev��`R�����W(h�`�	
�ܻ�OeN+`���r+{��dU]V�� �3��H�mIA��
r�l�y��JqW�L�y%DV �ꪢ(�~��o&�/&��x�(�W��r@~�➊ŀ���[\)��L�4�q�u*�)!��S��$E��ʂji�j[2i!��#v�ϋI��o������j@d���2#�PWvd@N�;�g7{��Q�R�ՆA8��;#�Q�C��b; oi����s6%�f���n�|@��'���ҹ12r��)�Vm�l@nA��^���07"S��7⿣���|�f�l��'2ɋ��Iq�	^lXQ��
��!!��`4)k�a
��TJp�nh^��\�C����q'MA��%���K�{@j�#׼�p��x�9��\��J˲cm��X5P��M��mJ�U��!8�`i�dq�V�jC��	ZJ|BR�|�5,��
k0����`0 ���<E�ۆ]���E��#�W�9	^*+�*M#���@/�L��͗
Iv�篁J��,�$Z7#����e�]5q3<�(p(j��>A��C����1zx�L<Ư�	zMZii�t�����'@���J���4��U�`t�-s��wr։9��{����=��?��aT�?�u��:/�?+�_��ߜN��"w�3�Tud�;����6@��ZH��C�h��4����rF%�{
o�
���9���:�� ��E�ǹ�Y��O��/�! �4�:A�t��x̭�i�=[Ս�����y	�يη
	H8m�C8�Ž���jr��]�U֐8U��(jH�00;��]�h�Zu��v�
ۭ���n�Gw0бJ!�*{�r��]P�$�2հqtF�ɊUQ5=���c�7�˫�������F#ؠ/��>�vO���3��΁���w���&��9r�)��Ya1�����87����7�*��a�0���L��ݛ��S���+>}_�K\���_���A�\O����#�4j;jP/c�kBW��:�O/Ɨ�3-tԏL��2�{��TNY~�\�zLM99���9_�rC'�"qD4�8 ����y�Ld��qrk�p����Q���f有9K��a;����4��IUL�"
K�)$e��
��UaB�ue!+Z̙��y^06!w�)R�7�R��<X.�
aרӄT��@e-d5�.�l-T�E�5��bV1 I��l�cK���{\��A*�0/o`G���*]]�����߰*�@�}�Ț�1���c)O��#�)�2#��l�ƞ@%l@�&���_3��
>`d&7�s(	�/NՒ���F �{Z@��)+����dӊ��"�����<,Q�`���g�•	�������md��P��`�$g����hD^�;���ukj�&�i0�4zf�אʊ�a���Y����j�ޠU��4��!�I�'��#ϊH�i����#D}8�-4���u�J+jGC��t�4��jf�3�!�W`�K�Iv2���{�k�b-����?h0,���Y�@ZfI^��Q0���(f���g�pa�_�+7�����`�E�NlWef������R����r ��R ��6�Ʀ������9^�[�x�̑`�'��sj����o-�L�r4�'\�98�	���p���r���wm�c�"�I��R�������D��G���r�6^�S��sT���昙���4Q��}	�Ju`���b���@3�Ί�^�@5g�vИ��I�l5k�"~SՎ���S�����l��m(޻�T�#zv�J�A��a��nw�>���5
1ㅥ�o�eݶf]23 ������}�t
�ء+l����?� uo�yI�h�$
�۳'45BO���%�,Y����(T�j�-b��c�(�}���B��Z��!�Z��>*a[wmd�!@��6Ӽ�M�[4ш�-{bAj�Q�~��
�Ƙs���l@�.���o� �����k�d�Yx�h��h�G�Y�T]嘅��~�$C~��%߉n[�X�T>MO���u$����Ƨ�pOs���Pꧬ@���i����ֻ��g@��==X�G#�.�m����>��+���h����X��T�
��[8�v���h��@xӃi��c�A_^08fj��7���"-�~�{�6�r��2��*�H��nk�o4W�m_�V
y����G�QuA�j��{��ܾ��Y�t�4>�Ne	]������W�
h�eG[k�]Jj��Jx��x��WX�g���;�2؋Ӵ�P�!��
Con��7$�^$����nx�/���H7t��v�2��h�{(aG��Ӿ.��]�.)�6jb�=����O�/g>��K;$~WC=�L��[~���T��6'n͂2?�*�D�^]��NJԘ��^(��Cx����ń��9<+'���Pg��� 8*�;*MwN}'D���,����="?�1/Lt�^��?~��j��s���Jo��b�-�M��xi���וbatje�ʮ����O�ى��s.�����B�;�f�&n������֑��)����E���$��*V�/����!Q!��a��R���,��v�������Zȼ�M(,�3)_M�����΄�O�[R`���=���\��i}o�`w���f]���PK�mWiS�05,setuptools/_vendor/packaging/requirements.py�Wms�6��_��B��s���續̤���$9mN�r`��R$�v|m��=H���^�/"���.��d��
�M3F�T4#Y�a�`	��q"���)��%,�#��#i�;��U��<�lo�
O@����pMQ�0�g�(������He����-8��2c���I�f"p��ؓ8�V��,�I�/.	�EVI��I��T�#%Os	�|#��N-!$�w�g��LV�,
�b�q�<(�K�;�;bI.$Uz�K�'=R�t��4[B�m�{d9}ްRk�Z��0^L���p�O�TЬG�l�>�Ƞ�ߧ9�j�Q�sD�
2"���o�W<���O�1Ņc�\{%��s�[~�E���h�~8yW��)��а���hG?��=2ִ�Q�l�n�����yќ�ȹ������W�)9��i�B�<B�O벭��&�B�a�H�4��ߪ��=˥��f�8/������0G�jv$J�O��mQ��WB]G<U�x��t
2�f�W�-�ㄣُ��nL�ul=�?�4���R�\�i$�()|�������b#�]�~ ���L�w�qmG�pM�;��|�4��ǡ��l�"�Ѵ��Φ��?����n2Xޅˡ��7w_Ɓ�;��h���\�܂�z��J�� �pP���p]^r�)'���îI8� v xnN�vE?/�Er���'�=�~!�K�\��#e�*���E<.�O�e���!�
`��`_���u����C;j�S��|��H�ׯ�ZK�

b�b$WI������2|7�ΣA���h�[��2�j�o:Q�>2�b�k����c'����Hg��a�{�S��]J��c����P��oi���Ŝ>Ū#��q#��Ehn��yu�q��>�q�.�?�
Т�0��2��O(=��.�D��"��ն
���=ڦ���R�z���N�>��C�|(3��:�cE:\�����
7n� 0I��B{��f�
�.�ʸ��D�p]v�����6n�,w*�0�z�T����=�6�G��Σ1�xu_9)_U���!s���:+ N^�lN����Ķ�M��[�Vׄ<�)F���k�(��I%at�x��Cƀ�
Q1r���u��@/��<��j�����)[�by��3�st'k�hbC٥�,�&��-l��>���$��Am/���]"4�n�S�02��`�R��zO��%��=�ƾ���a������N�d@s�;�v��5�Ý{<�`Kɱ��}Jա}����[���I��DD>PyCn�k΀/hetT!�b+'�X�-4��k3�'��P>�=���p��Ee`����s�Fe������K¶X�U�ű'X��u�_�	a�`oc}��#����L
�
U����K��?��3�Zi�w�=]y�iP�rnc�����Y��HG��_}ÿ�}�//�L�T}�#;W,Ȋ
���$߮{xދ�	���o��v�#s�4�ǖ�eZ�a}���ݗ�8�T�%4^-c��A,�FT:���>������"W��>`�����ߨ����غy���,���ީ�*�;�9�p����i��y�#�A��tz���R��ۤR�~:�&|5�!��٪3}nz��@�(��'�c����:Y�}�m�jzw>�4`K<2���A�R+�ߴ2mr�ˠt�&s���n������BY��W�^;ݒ��l$<S�X^�0��8a��2�	|������*h��:`�g3�C:W�;���O����̵!�{ƌs���w����8v�c�wj����+�uNwm���1��a�PK�mW��)��|*setuptools/_vendor/packaging/specifiers.py�=�w�6��W0��QxNn��/r7Mݮ�咼&׼}�WKS��Z&�$eōӿ��@P��4�n��ZG$0�f��h7z3˪�<���N��<�g��+5���D�Q=SQ���**����E�Ÿ��l���*+���q�?��|B;~��iG����Ϗ��x}���YY5�J�(��.�k�w^�QZ\.�V�D�I6��󲸌���e�,�xe������*��Z���0�dW"6�e���!OkDt�H�?�]Q�+� ������1���fܪ��q}�P�0Ze�l|	���Lx	mL�7{u4~�ףg�s��;�dYm�A��E���<�I��4{���fZj���j����")+@8;w;��]�F2�L�����>�E�O/��<���M��o����1�-9�+�	Lh����!�7O�%����r!�~[?����v��+�r���F��I�'�;��b�>C�\�h0|�`j��ytr����H����	Bt�_�tN^/T��g��̗�,�rp@#�z=��&�G�i�X�,�a��`�������h�:z����e�:�T3�+�}X�ӯ��/<F�ُ*��(��>���5V�IZ�Y1��u���J��55�1P����!rž1���{�8�H@���T^'(%V1X@?](�lL�˂�L9S�+e4W#���Ah2gI5��NP5k�L"�]��[C޶��j�`6��2���fDE�\��J򆡨 V3��#@>�MbUx4X`< +U��	fk�r�/N6߈�EY���-q0|��JU���(��+����!�1��_̀zBTX�SvMbج$Cs� �s\���&$Dΐ�<D�A��(r��/O��K�Yn(��r()!�!��Л�����B+ˁ��U��VNC�_�1�P���O?�.p�`��*6�Qf��gHO��v�2�Mr�s�[�Pm#*�)k��QU�_�|~�۬fY:��Pn�#3��Q[��q��$�ƍ!u�*p�z��T�|���
]��
r(�j���
Q�zw2g9]&u:d�ڍK5U�a�&e:��`����o�O�d�j�/�c�I9���x��Q8<���h��;cа�,��~�0�7�ѷ^������4�"oҟ��kI�U�c��_���Z�rr<�� Q�3�&g_	����ȇ�{�džx=p��D��j�lGt��0�b���,��D�'0����?],�cZB�1�+O.���0�D�@�fK/Ҡ|x�п��Z,����ڭSH��[@a:��i�?����E�G��u1���MCuIs���?���t^�I��>u:�߁�7���}��f����eq�
�zO+�W>m��/�����ѩ�m��Z�p�HC
Ϸ�h4bZ�r6���1kg�����SU[Sm&`�ac������0���	ГX� ϣ�8vT�1�,OUZ��X�6�V�MzArZ�2u���-D���0��9�ɼ2��ES0ob�l0��4�>}&֡ӝ�ƀ8
����'�	���@g����n�B�����줬�C�}݂st�����B3�'��<A�޷��v���/I�E]`��+ء��j�/D�].3}wN"�:�S����pdo��WK�UѲ�ֳ�J	p	z�e�.k
L�����~�F��?=�5K37LƄ�1&���`�J��]�\`�2����LjP������=c�M�&3�Q���2��y1�Rކ�p6ގ���\��0!�*� h�C�wа}��+%y�4�a�	�IA1�Y��M$	�V�@��;�fc�KgȜ�|�Lfl���@�=�i������|�����HϘyN�yO��~+�
�D�ށ+�-�`6e�{S.�GG@@�_�G�@<�U�:��I`HW�͆UP a�$���s�0����z�DғXX6�	�xʋ�6nlzP�3,����]`�ho�b5h����1��eٵZ�P�J�`-XAҖ���4��T�4�S+
d�����"����X4u�UR@ḝ�Ks�.�z���-�������8Y,T>i;f
�G�%X��3�4j��z� q��W�|>9�^�,��u�y��0E͒�5���u1�Ŋc� W�,�	�4�����
��q���E��rh�!���A<c9���T���o-�%���@:� �3�L�]�k�VmCV�]^z������p*;%�C
�ڀ*E,1.SW�`q��WO�99�F7�F7OF7��C�o}W�9}46��'���jp���@X���q��o�Y�M�Õ�r?�z?N�86?.+�9(�8�FhVZ7I����8��a�HR�m��/��i1/rzy���dh�	/��yQ�J�<""]U�U��(D�		��%A/�2Ѱ��>�ЈM�` ��F���G<�8�*F�'?��f�=�"�D���7Ħ?}����G�
~9����=}}4��AG#0�=:��5��ݣǰBƭWO��\U���v�Cj0-ڇ�6ONo��~��N�y�Z���qv	�l��{y�Ŕ��7��B��4��k�5��|T"���ѹ��0\�S����J���ޖ�y��0|�%����<�T6~	~:����b�C��0�Yi_T�O=�M���ƢvgP
v4%@�NPvC@
��~�LU�\{�H>Y��6];r0j�)Ug��Ju�����g���4i�	����ϣ���#��;=��W���ܭN0+����M�5�p�3QU�,�SF�s��&5��&WS{\:)�X��b	 ��qz��c��e��ƙ���k�t�s��6�ۂ�^\|p��4�.U����d:�͒O�Y��67��-E�K��Kt�y�_S��˭6U����p��K̨`qrZ`*Z��m>'ుGM���ޯ���>m��ɰس\q��@/�/"�a�h��K��q��P�9,I�R]��0��.y5/�$$�ֱ���OL0���(�w�{H`|E�gH
ڣƉ��*�����I�U:p�yN�V6�_w6�����?����_�Aբ�:��M�ϻ��9أ�z���?�t�����p�.>mcK0�����Lo��b_T��@��*S�v��6�DJ�[� ���U�� �Ps�Y����
�}S�#ƥM ����J�Zl��'O���+��w�XSN�I��5bL�����B��BGeC"�4$B.������p�݃���OF�}2@p��?7����w{�-��Nޣ�o��O�Y|E!�$:c@��k���	5e�N�iV�q��<Vj�'�a��T�C��W�,�[u����8LPV��C�/��0o_�kV���)8w��Zr4��'Q�<���z����7L���)�A�ksj�u"�ض��
�SB�����g��hYRʻ�IUpa�c�^.or�h���T�z^���8^9@+p��0�ղ$sp�1�I��7&̝��pZ�P�Oy�ځ�)��XP3���5�;)ϲ�L�k7����PR;�0c��ͺ8�h���U�	�>��MQv��B��,��U��9�����V�U��y�8~��Pz��x8���鍿LԑpL�>���˹l��YU%|���Y��9p�JU1y���f��\����i��K�e�T�8��|��{��h���#ʙ+����Ec$�t+�
r[,�ʞ�kcR�c���WR+{<�uِ‚�Ž��"���yV��y{�8����f���o�\�M���u�>�꤬+��{Heo`���K��7�O���p����բ�����N��lz:���a��99I��/cG�|�=@��:v��"�>�~{5B�G�ޡ���A��5��g*��zuW�s�(1/��-���f{b�t���Z��^�x7:�E�)ŹL��������2��S/�g�,x8�F�㻽�����g���:�����2-�AB����cx��t�R*_�۟�\�AzhQ��H����)D�W��W/s�͑u�m�Sr�Ė7 ۃ�2���a�;�>/�R��`�"�(U�I:�TH�K1�O1�SY��-L�
% xY�J\�3I^(�l�<P���2�
L��x�h�����7�38���
M�,*�W�l�*�t������jg`59�j9�c~yk1�LYD`h�x�O�9]K�7�ô{.��՜�I�l�vV:W9`�\�5�f�\�0{��R�U�C����ʤP���C<���~-W���Qb/憄*�WEx�MV�>��Թ��\��Kxnm?)b�#R�+'i򩳴�]�[�~���
�����2`�ϣ�#�s�/�DTlu͗�C�d�2�$̉��xK�di-�_P<�$�5��D�KHo�~�Xa�G`�m����~��xW�ߚՂ�;m�=���I1iC{��Y��]��Jgs�UZ�Ү���� 3S�B��Z����@��_bOnc4,�[D��FBn�tˤ
h��$5����z�%Hn�X�����e�?7�C��&��H-Kn�vD�0�&�q��@��5eT���ݰ�̈́��u��O*��ِ��Jy�*��*��ѓ���<r�/��u��} �s�j�^
Z��T;�^.A��|Z�g�Ь�Z\)����;��	=6��Ӣ&�����[1�A��Lb��֖z�x��k�ݝrlr���f�\K�Q��]��z˙P͚ߊ�:�P]EUo���P�m���j�Qc��ڏq���z��֨/x�N5�=v��=��h���=�^gr]F���U:��\'C>etR���]C9�!n�(����F�K��9��|G���mvm��U�w��>M	��A�������6�����s�Kն��s�5��^>���+7��:>A�Q ��z^���GM$�9G�7wM{)R�U��$�����[���:AC"%��Ŵ}G��x�wLӗ����<:�3�!�k�sHG�C>�<�Tx
�C$lT�^j;�B���9Eh1���[B�(����$��a�%��.֏���_�n�'�J��lz�����k5�U��/��R��k��V�X�HQm��x(��U�bg�!����`�:0I��O={]�
��F�U���J������7m�&�Y̑��K�1���L}8.� �1T�p����0[����7#�i�׆W2�=W���tV�ܲ,6��B��[�'BC�/�᡽��}����?z)����Igġ#���=,
J���a��(��Tp�2s|#��6����G��dX|pډ%=�>��Q9�+����s�)ȨE��Fo�w�,�����Q����(|h�ް�g$�%Y��k 
pR�m`����y��V�I��$�`�:��9�p��!��ɋH%�i�Dr�SQ
�Y��=��H��5j�x����0J�X+����hs��X��)�WAP������9O��S
���t\s��de�d,��a�5�x��$e�$��O�k�"ׄQ@�V�}L	���A�7�"k.��-�O��&��w�%l���b0�މV']��sN���M����J_��7�$X���{"��30����m�Rܜ��~:�0�\�ë�#���VE����2����������PggUx�=��2h$e�w���T�����#�̗���c�mU���xt&��ZgEF�m�z���������\�7��c%d�Kf�hj�o�M�@�]�m .��.�5hl�B{�~�ڟa��+O塛_�h����2N�U�0�����8�,NazmpXx�Ĵ��}�VAM�U���^��L�B�&�2Tv�Y��ʔRZ�/Z��߁_���[�O0%�W�aIp�pH�+;'��rNB�mW��L]=w��W��e7ſ��c��e1�.w�����L&]Y,��ҏ��=��%�-�ո��Ȝl��G
.��C�07�ۈ (H{Ý!]����x��8��NԜ5s�!��~�%�
���}�g�\5P�F���N�d=��%�0`��*�F%S�:K�J��a��7W�v}��/Y���
�ʳ=�e����Ui��zK^�g�7�&���r�����K�
��� ��qJ���U#uK���
'����<)u������Z�Q���I�D�o.*]�i���b���/Ug�m ��2�4SJ�UDg�Ѽ(.�����4	���o#ᏹh��^(y!GV7�C��j|�����ɽ�AsfK-]5'%���5+X��_����#N-z�����O��+?����:i�Y͊� �2���ism���:��_9NEj<�i�$�,�-�"p����̂��|�?D���]�b��p��=���-;�|�'���
ULz����\�nLS��T�'�����5@���J`��MQ��,����T�.v�����3X�Աcgϡ�}lu�(Yܡ���7L��|�@��[����޽����lzw�—��\��+�k�ÿ��~0�MbP۲V��C—ђy���7QrY�S'3��6����4M��vH��G�^���(�}��!�f�zqk����
�v�y��Hɀ0%5�u�W�,ʬ�R��y"�7Mk�SAȾ#MUD��9�p
w������g1T�|sX-�0G����/kmi��"�Ud�ڢu7��|ZeΥ��7�.L��B���u�Xf��1
��p5WA�,>�W_W��|��e���h���6~�C��N�����y���5�q�ț|�\�bx��J��-i��Q�+)�?�uԷ�3���i*��]y�]iQa�UC�<N[w�l�N�}��ˎp)qs�u�aď)l�C�h3��?PK�mW��'^$setuptools/_vendor/packaging/tags.py�<is�:��+0t�	��h�����8���Ʊ3����$���I�Ow ��ݪ�Z�K�F��h�7�<��4�C��ҋY�a��+� �X1Yf���S��[z>�;�`]�k��Q�ll����2/	���k	㰳0���G�'g�Ä�eiZp�@A.�<*�l��i�t���"dAXxQ�;�,]0ם�E���ˢ�2�
�M�4.�����~�EY`S���(���
�Á�h�,`XQf+���s ����=�xxx��Fx�˂�A���s�6�2�f�9KR��k�z��m�u�����%
����,,ܼ�N��0�;��6cB$p��l%3y����2�
@���Y(�EV�Eu�ʵ�~�L�
۵�%�<�v�b��k9��?���o��yt��|/GVO��B8M�6=����/���a��;L�B��ѩ��қ�a�Ȏ�ss��N���;g�2L|
�y��Q~L����i|�*�i"�fP�����O�;�W�	>�
�
��- 8����r�Q&�����j�N�>��p���������;��oԍ�$R����┼	A�#���}�/��l�ؤ�ei� �����g@��;��
��<^��uQ�p@�h�::w5��L=Xu7y��!{������^��sof��ϡ_t���,����<L
gTj�›�"�����<v=����v���3/A �<�j.Z,�I���C̽|�wv��bT��=�
�-o�����8��F��y�9�'X�3f@4|�TX�7��\���X�Sh%Q�v�S
���$�V�\�?���d;}uX�%;I���C��N
��]9qz
R֩�C��k�K�H�� 	��,]�Y���uJ�l�è�x�%�A��(�A��rR9��\�hm��/�l� �YV��$M�
to4�#!�6�����ht���Z�,�0ب�im�,GM�SX��и�x	��Q���Mծ�s�����),��a3�n�OW�z�6M�[�ջzm�x���Y��Q����G(x�
�|g�`���/
j�\���q�>��
z/�C4�]Tb��긲� {���~��sRӰ����
H_ۡ3sا�j�K@O��d���3�����<$�P2)�P�ht�Kx�ȃ�RF�׃,B�{L�<�D�ċ�WT��8!B7,J.�\�A>���b���}��夕s��8�z���ś�Mҥ�=
�w,mbɎ�JX�F���]��hY�D��F[��θ>!Lմ�,�RB\tݫpu�f��~
*�i���t��@���t5��ۥ���,��|D�=�/��bN��b.3Bvqڽ�x!@�x<B�1/g��^��+s��"�D>���C��܌�1@�ab�ᰗl����aqe�4��kg�.m�%ì�<�I›Ž�o��a@G�e^���xG���AӀ�	^\x��B-F�����ٷ�dJiS�������_�I�h���W/�9�Z��&��k��dW_���XE'NKG9m3" ۂ(�s�	�I9��k�P�,"��/�#�T�|w�P�:"���Vl����fp&	igQ%�� �c�tф�D��:M*U����{`�a1��huԝ��#���;r�%�}�"���~�!G�O#�i_x�q%/ :Fn��|����	���==݆��C�S(,�\!����P�WX�pZi�c��|:f��ˆD���@&H���`�&�I^P4��
�zA�"НK��Y’�ʢ<M���.��W%&�� -4�χ��
�,���Z`?>�,�|�	.�Nt%T}�Z�W��W�X�'8G�_L��1�K�(�;_�m�C�^,�Q�d�EI�^�,H�<yT���a]�U�D�����#M��rl���� iP��2D�k�� A)E��2��5���0mA��m-��V��e�o�FOG����������γa5d����rX(�-��i4��`l�R�>��I�t4,��
*�I���<u��vcJ;:�������1�:��ʼ!`:	Z���ұ5���2��4}��}�~<9�?}}���A�bя�f̶��
O���B$�s�п��c�hq��z*-e�i�t��5M㤌� g>]J
ĩ0��|�)ӎ��P5�@P!&�>�h���eX5'��|���/��Q�]�K�ԩ��X9����}���Q}�!�&	��
��z0�V��5��n5����%��K�P�m�oa
�^�ӥJG���X�c���R�2�wa(�ˊ
k�ez����ҧ~H�Ǐ�㤠ɺ���8dgd�A��(c"t�E�k_XQ=�����\*�)�L|ar�e�0��_��D/@���a�8@���9�q��7��\'����{�6�>������{��c`$�ȰzU@
n^�J��|��G8�Gx���(���F���ת�������:��U�h�S
0^!{�2Ƶ�}���"l���(���t�Pw��]�Y����HL�{L�)W�*O�J%J�):%��'h�'>�����爦�/j�#u�����^U��[�mM�`+��)0�����s�S�M>D]q�G�y�
�ƅ��p�JW����ЅG,z�^�V鄁ۿH����Fߤ���Ge�t�2�>�CS7��*��umG%1�����h�@�ݓ̳��
R����)��l���U�o!��F-�޸����w����ACL�f�ڄ2/��#���%(�A�z�{g��Qs}7�F�H�\�u2��]s@�N]���jκJY�&rٮ�a�W��X����N�DXM�緙�5�I�)�F�ZgC��#X�0?����T�Ҥ,�4�^���**(C�P���%x������jk��nR�܍�[�f�T�X�wm�mԂ?s�Z��4J���n
��.�-�X�Xc-��Qi7�й�8�R5
��p���j��6�8X���lkj��J���@y�>��* ��Rٛ�b�
X*�������w��Ѫz'��aX_���U���Ψ�M72��S[�q[������i��hQH�r���+y���ʤꦴaF{mv��c�
���T;nr�#J�� ��`��@.JhH�Pӓ|�2
�����ʯD����m.���k�RӐȍH���	աi 4�Ю��|t���UO>�D�SV�8�S���i:Ò�p�'�X�T�g��JEB�/<�i�?���c���2ݾ�%7r�*
��������.���"G�����׃B����7�D����X� &Q�e+�k�\
�_�4�:��xM�{�ɥ$\�4�u�t��ٶ�^K�]��^�"�n�7�r��}a�l�8_S���hh]���i
:�'��T@��-4�L��d积O���+R棶�&iY�Ѱ�޿��[�F��r6g��3�{�P^�<�0m�<x|ҝ⼽m4�T�<���|��U&��ŖY����أ�W��6-%��~�ž�kJ��"��~����b)-��N�P��B�T�}�XFPQ
+��^�|wQ��:|ܕClU&3%|䋃�����}��k!����1Н�%���*k\aʱ8�+�B��e�2��5��IO�2˰ArCg�4}�Eݮ&w��g�+��	�f�;�R
U��(3�u˶�fD���.��M	%Z

w?;ba䭸�/]��DP|P��T��&#!9�&����G��Sn��f�jbIqͬ�x�:���D�ԚZ}i�(�o\���$�MoI=�0��
G�D�u�A���ظ2�ё��z��A<�n��X��GIy�*�V�̰2|]�HKB�7k56�>n�s�A��ܣV���G��IJ���@]�~�š؝=�P����Yڠ,�NxB�֎Mt� �&e�S�F-�!���F��e.8�TJk�^�MP��4�s�k���[��&w�t�~W&�Z��8iST �|�T=a�-��h�9*pu��h�#��ɤ�A�r�ֱ(<�SU��E����U;U�}[/bli��L���=A]��kf=�)�bJ[x	�r^;`k�{�0���0^�!����d�U�0R�9����L�	X�ي
�r�	G�f�%���k����ʾ��cMy	[bgik����?��h2ݞ����,�?��Q�����
&����h�Uٰ�j�x���w<x:j�G�]���9����w=���)VG��
b�A��8t��Z"�����F��v�)J��R�����p`��V�*��1�:�:	O�g�nӈ
xa�5��OͨC&��٣.�u����L�P{d�5̧��2R�%�Ջb*��ɛxww:���5g5TY(�KW�\ԟ僖�Xz�6#��t~���ZG-�=����	��C��,����Sp�퓏������D`v��ֳG�iGS:PH�,hܭv�!��^,BG�†��,��7k	
r��5�̉C��v�
�T�=��4�B-4�f�2C�&�]�#��h�%Z��G�N=x�4T��2��IZ��樯��,�I��XL�"-!�
�A@�1�J�B��|����v��l��,)�LKt��؝6@]"��/���b��U�`x�):�f<�¼`�0+.0�y �A3�k�l��6�bv֨Ρ�}[[\*���s/s��� ���Kf�����l�G�(in&���=Fx���F�!(У� ��7��r?�dToj!�#��,Ĩ+t1A�5[�)^���,	�a�{H�y�-:j�N3i��4\r�)�����I�6�W��{�t�DN$j�$z3�Fi0 c�B.�ߨ�$!g�͒N����AWV����P ��^BQn�>z2ݻ��W�\&Wb�$���V@_m�����z=��9���$���[��+E^�qqx�Ð�Q����T��3�+��{�`��?�=��FO�>�l�}Y7Pbg����/h�^^�{�.��o�n��-����υV�*N;��V� O-�N5�i��bO %R�k�8��s�Kn�_�����L�h��iQ�:u�4�ȁD�g��Ҷ� {0KfJ�r������6/��*����=�y�2j_A��X�2+�p�͔�:f�Ym@�I삢��*|F9�Y��8�
�>:B�G�gÞ�����pA;�����ԗ8I��Tb�)���`X�9.e߃���6P�dD�����'#?Y���@f�t�x��Ʀ4���=ZQ���1��ƫ����E��'�]�u��[�8����*�	�:���ayN�Ͷ�j��"�B�WtqH=l"ZwNx	���(7
�~[�j�R�g�UԐ��q��"i��ђ.�}���h�=���!���n?���ޑ��{gg�!<�v��{(o��;������;�'�޹��;p9��g�g}|\=������w��[;�AܽWG��I��S{����?i8<>�;w��}x��
`�rn��vF���b�s}�<�XJ�+{�(jY��!%�|-~�����q����&���=4@��r�\=�hK���~���(���L�
\a�$?�X����v�6�%LJ��et�7tIՀZ�EtD���z)���j��/c~�.����/dEګ[(㰢�$O��.3n�l�٤^�ݓR�*��T.��N�
�ڨ5@ӜW�	`@�'v���]#*����[��y�1��6%���UG����:j��B���pT�j�Z"$��ᓆ��Ib��ԑ���)��dcF%�
H :[5�
��<�N���n��w�7'���r��}a�rq��8�{���7m���g|a�\(�[�t�>�l�_(���)߳ˬlbu065��]wS3Mk�/���gu��{/U׬?�g45�?Q��./[̧��B�9DԽi�������}�Л�x8X���4�a��L�po����� �s衄~4����ޚmy�?:�`��dm}�e<�A�'BЩVMu�=SJIo���R;�ͥ���}��������)���5�_����#�z����<�z�A�|���F;Ow�����ֳ���P[�X8�V�&c��ò��`�~ݍ�������v|����g�%F=�,��l���q��݅t�z�TG�T6�
�Ι#�1s��xzϖ��-�4��.<b~x��jy�:U�vea�*�겁:vo����~Y��ӎ5���n%C]Y�'�T�C�c�‚�PdaZ3�*X̮F�n-v��u���e�[Lm�2��F�=��kl?�Ҿ�tx�;�CA����I�������'�����.mn$�q�tOUMqK�
2��!o?P�#?�Ή�&�/�1�0�@�Jh�3��xu!/U���/�s
4/�q���	Q�w�3�{Ҭ����)�y��w�N�ݡ��0�~]�"�2����ڜ�cO��D���
>x��M>���ˮ��i���UY	�
�[�Y�N��V�G�Y�kDk��ʔc�Q�0ڑ��ԍ~zC#g�02�zҶ�ݾ���E�|$�KÌ�W�N�V�CgL���bL��5/hEA��bb�0\n��c�k݉��m�k
�:��B`혣Jg4��N;��O�/�QE���VU��8U�^S����cVmj�t��8f�{��z����vޠ�ϫ�^mZ�<\�{���шg���?��%ʴm��Is�a�\��)5��e��S;�%^�[�ϴa�zs:�(e�BEoN˗i���)��(��9�W�G�(�_�9m�ǡ�_'��K��	�d�&�Zww�­0	8:�i`�
ƛj���~S4\��(6��N��t�?PK�mWJ�f`�%setuptools/_vendor/packaging/utils.py�T�k�0����f�D��}	t��a+!��`t�(�9�fKF��cc��N��4m��ؖ��{���-��\t�j^@!R�3�e����.
��?|�xJ�I��7�F(��
�����.o�;�[D�8��Oo�-��kZ)��&+e�UzK�r�!UeU�E��rQ�Z��$ymk�I������F�Ťy�C&V�	�C��� S�m�ƠI����\t�����է�����>����jj�7r����D~�d�#|Q�HEUQ�����Oq}���ٯ�'s���%Q��l�K����o�>�� HR.���h\�42g(���~����A�9H���x�{N#� r�a�㇉���Bٔ6����-�r�v⏈c��G��{VV�5�(�a����H�>��"�nE�ͩZ���.���a�]Y�fF���/T�n�$�$}����v�D�z,
y&�5ʴ�h-��O��oA8��
4�F���H\�(-�i�7Vo���v/:
�=7)VO�sރ	.x���盤m8G��������h�T\[C����q�ҥ���o��"�]�pO�C�*�Y��=Y�hmt�]�/�ִ���Q��_Td���m��l�ڸ�	���Vp#�����h�B�c!���t�mbm�Q�)k����4�է�Wڟ���)
�)�CIY�)cO�ѻ��y ���v������r��	�W/"$�1>Z��M���h?n�#�ƒ^@y~��Gw��Xw��8�PK�mWPz��n<'setuptools/_vendor/packaging/version.py�[ms�6��_��7��Y;�ݵ��i��z��O�K�F�ɨ)�(�J�~��$HJ��N��,p������boϥf3�
��%OY*�i1e�l*+�+�Zh�����'�ʐ��;��̳�{�ϦD���KG�S!���ы���C�0�6��	�(r-�\�o�+��"�`SQr��h0S����lY.��c&E�J�':O�������K���X�dVB�,)QЁ��i*�I�&	��y�V
J�(֥Z&�S;�G�Lf�\�ر��R^
���BfsG��?'������Gc��1����,�.�0������)��`�#����F`n
z�.P%����@Z}�A��e�����&�ޮ
��
[
�mآپ����z�(q���Ķvwj���#�/��z�����n�(Qi�gztɩ?}�����?����j�yjp<�ne�T�V���(���̘�Ţ�I��-�d5K��' ��Z�t��J��W�K�j�m���Ev��:���:�%��|
=ݤ����0�#�ә������r�
�d���E0b��4}
G�%O�����������۷�o�@�9�6�M�񅘖����g�L�Q�Tp#�T\�W�����S460
��T�I>�4X�ao��{lV��5��P���A`V(‘���L̘�y��=��92&$P)��^�r��~�x��|�+hMpy������"�"8����Rgd~vrx¾�f�zL<R�vm��S�V{���[)*��sq��}as�;]=5j����l����R*�+;8N�砘!�4��/���RC��2E��pWΝ�z�i�L��ֲ�/h癨'ƆEb�<ά8>�<��Z���6C5�hj��n�Q���MĴ�x#����m�B,�E��a��bHX#���d�����)�}���d���.~�������o�Zt���~�b��A�O`�/ZJ;��[І�^�Ѻ=��Q@�����J1=�7�D��j��gI%�g�Z���>�m#{���Rny[���fP0����#Ug�B�U=5"\V;,�.�&2~/6C�,
hz���H��: ��	I���O}+���GxD�-x9DP���
���*/ �YU��2�O�L{��h>����l�ó!�fDo�U�"kM�>5 �w���OH�秅�:K�i����?x�7b�Q?8����쒠�̕��@�{)a���A���속���3��}töC�	�
�^��]D�)Oȳ�^��&zļb�I0�~_Jq�m�/HFy��T�Q`�����،$���~�z�ץ&��1��v,a',m�O��T�2~��~�W��\�C$Q�����J0N
��(��$�J�-����{�g(w�����o�����]���MI�l�J&,�6|�p%��}��4~[�pf�^u�e�S������RaB�K���5%�*�DNNy)*l"@�h�M4j	ܸ�[�-)g3�p�, 7P�$���8z,n�2'DĞw�;��t/���c��J�X���߰�	i�Ndj�W`6&f3�/����$�L��]�K/M4�2Oc�)H
��8���d�$�TCtX��Y�}[)m�7��~�sm�ur�X�-�d�T�+.�0�u�T�Б��ܱ�c�h�d�H3>ͩ:�j�O.���TNW+#
-S���Ճ���5�o���;ͯ���uiWG��+Y�a��핡�"�Q�SY����c�u���繙��5V9,^�_�mX�������ۯ2IT�Ű�"<IK�e��� T��P	�
ٻT>w���<�͢��O�l�r�F^`1e�pk�Z��m�L�h1p�b/��<�A�p���:��BCF���C�4B�LR�hc$a5�4�ZuV��:�)kЪ����!���k����>;yJ��w��;{~>��j`j�`N���c�}d����l�b�+�Â�x��}�-�7���}t��k��qz0�7���F%7�o�c���E��2g��q�O����:mQ��t�n;�8�u�}Yo�]:��O���`��Sܨ�ݳ']��'\g �p�5�@�k�u����QE��E�1S�~�����j�5P-�-�]jЬ/���lLsqݎV��^S0�^�a�ã�xq+D�������o_<�8�P0h<~�5Vu�s�M�:\���ɜR��Z��|�vg�����\Aj�)8ذ����+\�VI�$8a��#��Ui���Z���vWxT�C,cdv^�
���.����'"y�}0����*_C{"��\��Aَe��fS��!H<w��0b�0�����@#%DzU�C"��#�iͺ���`v\�G����8;0(���I��8���!��o�
i
W���Ӝ#5{{��G�QT�LlL��D`�lR�+ȃ�g+o6O��dd��
v�l"�q��a�s0��d���X�Oq�u,��C/4�eM��,�}��{./�@�/*I�~��z�&r� �5��zm��5zB����DQN|~L����ߤ�&���	�f=S���ȕ��|����g�R@��h�N��bhqW�@��A���Us�ck‚;2~��Jݛ|�B��|��jp��OS�����!�.R�2���-�k�p�!8��X#�EiwOh�{ņd-TWNl��n�p����;��1��f=L��G���RኾU�;��+��j
~:���p�[�6�!�r��Snkt�cH!v���٧=����<��jxӷEaXܷO�3���3���黎Ղ���{�i6G�9N�T��\
6^�ص��Z�2{(��ܟ��=Q�ø?Y��{��/�3m���[��r1�����'�o�6�՞
�G�U߲7=i�"4���$-�kE��	��!�Ld�vp��f1�ޓ�5�����8C�Ƶ���+�L��W� �q�vC:�l�
j%k�N,�P��UG�R�T�*�,A	��U}
!�?�	�`�!t��*WS�B��Q]�+�T�[(��g��3�A�E�+��XZ��+8x�/y&�M0G�ϩ���Ҷ���ۥ��k�M���fc<~�/��s۳u@*ـ��%S��;]<��(n1a��̖�Mr���;V���֜���\�4�2G���'���dY�G��ܦ9�y��-5���Vk�Y�fz����
E4��n���v��=4��?�K.���x[���Q�}�-��lL��怵�6��p"t*o��|�n���9I�ݨ�)��[ ��J��0��a��пJ+m4ڟ
ZS4n9����U�<e����9Ds����5�W����5�aa+B
{��\�kT���X'=t��	V��Q9��X��+�)T���^"X�����qm]	{AK�n!]�;�
��`2�v�ߦ0�x����u��`�R�n�sJo�L!� 8l��+��Lk�eV��JK�(n"�� �3"Yo�'���ХŢ����'<�0+ɒ��/�L�K�g� ,Muj[�JO�k�S�[!�"�YI�b@k�X�C�zX����tV<��N�� �cgT��b{�6�\d���	���l|V.��sõ@�n��w���p�`8N��x��
J�s1ķ�K�c��Ws��h� Ɔ.A��m[���6A7@(������2�N*��2��9�P*����1M�H���X��$�jX[|�%���;���ߗ��"��łg9~�7��"p���'�ZB�F����fn/ܲ����&��WG���5C��U	�_��(y�ٹ�'��y�mr��{رWj��_�6j�}�a�Io�AKxl�
z/�MW��N��3�����s�����]��-a:����е�sKp�)?�k�\��OO��]�6{��vu�ƂkO��;�OŵL��ŹL��󸷏E�P���S�F�җ'a�g��+ƒ��k�ٝE�k��;�=��PBP��x@R�`C�a{��a㰖�aT3���R\�G1�@��nb�[�t��PK�mWR/��setuptools/command/__init__.pyu�1� Ew���B"E�R�н�"Z E�0r�'c��?�WJh�O���R2���
Նpo<*��
3�V>�SM�-��/�}~Ew9~�G%����mkoʨ;��
�_kS��v�`]<����PK�mW=��/M	setuptools/command/alias.py�UKo�0��Wp
�hb��9��0`�40[N�ْ'�]���}�ö���|P"��H~��Z�*�t�Y�r*��
X�	��~8��i&�g#��ژ(��N�6�h[«�D�[Z1]���l�a�QtYC�(�h
����D�U��q��ဧ}K��ZHh��:"�{�Ѷ�Ϲ���ͬ��,�qH�dq��h��s`>V;%t0�Obr��O'mL����'x��
�E+�{̵l�R@FTP2�|Ok�1i�
9,{
�@�R�$~Re�Y+$Ϻ2)[�R2�
k��s(�.�X�3�SH�*�b~�=u�zEe�20���A�Hڊ'��'�.viϱ=2L����la��pvG";_;l2Jx�.�?���fa;�Rc�L3����M�M�1�i��f�#3&�$s.�){����\�
7����t�v��IO������l'~��ђ�G�Ϥ���v�xӱ��IK3�}��s��^����:W�&vd�O	���pl3CJ�]o��T{n���:M�r�!=K\�Xs>:ɸN�O��ᣳ��KJ�w�d��c����:#�Cٹ�wG��	�[�7�@���T��
fxR��Y�=�z�a&���y�~ �6��$$?��.��=����N�Z�)׍���)��չ0����)L�%��?�iK��?s���n�͂�
MWU�H�������W�b��?�����/R���e �%�D/K�"�z��ho�gϩ��
��4�7bG�$���"$˥�.�$��1W��࿆edoGjDy-��8�h�h�{}#l'
�q�|k��`}q��EPK�mW�ut��@setuptools/command/bdist_egg.py�;ks�8r��W�rH�)�}Im*��s9��j�벵Yod��!1#�8$��H��� @��������h� �ж�H�v�ϛ2ݔ�2�ۭV�y�꒥p��a_mC�6"��j۷{z�����X���~`=߷w<z������f�G��N��7O_�%��+u/�B_��7��0�y��y/n�Z�������;>d\a���m�}�^[�Loġ�,�C�%2�g0)����զ���E�U���m��Φ�ȫ�p�6��q��jU�-��
PUW�(>[1��0O��(P�Xᚺlߖ��G۪�M��
�ڲ0
Y�0�B>ǟ~���q���+���ٵF����)�}��r�0�"՗Wg��_�K�/4��^f�y}�f(d ��[$��r�z���65g��1��5%�$ހ�l�v�j`���&�����&`m_�^OB�A<�& ��^$'U�[t��Hv;�=<VTl�Y-��fg�/�H�oº#Q���hGF�jEHK����*�lӶHD�eYd���]�n����m��y��g�6�h�Z�^�0����FD;@��ʴDY��p�'}<A�i4�چ�V��
`���\S|���J�����Dh�]J@�縤�Kl�7�?�T���Vz
�Ɓ�]3�aw�&�VOQ�X�I9IXx�,lk�`J�M��	ӬG�QԹ̸�H/%2%̊��e�`��9����c��@���-h	FЕ�'
i�SЀuo�d�Q��hV��Ĥ�4g���p�����B�k;ŭ#��	��gd������;��VR$X����D�V�����Ĺc�b�"�Pԇ��J^���Y(����ey]��;*�#=%,x���������ux����P��U#��$���fy����[��,`O-�E�PqS�q�gKK��q#���a��5`x�k�k���X�m՝{=,× ��	��=���e�"3p����!�\���QP���WJ]�:t���F��<�P�u��k����2�x�"0�CҤ�oQ�2�@�o�DRhx��}�(V\��9 �W��&�Zzfm����>�p^e��(�;�'
_f*N���dU�m�xN.>p��<Y���LX]	����5z��i��+������m����m�D#
�n�sB�]�:��
ZM����sX,E�ZJ���%��ױ�8K@uy'��k>F��Q`�n8�f���!y4��d�_k��y���d�`iG�|�Q MIz��B-�E.�����f�A�(�#��&#k�B�nIjY�fʠge>�S%;a����;;��w���M�&��EV��`��C�BL��ς*h�8դ�V��,b�k��ހ���H?�SS~��@�m]&���U����]]��!�*�
0ʯKW�@�+Al
ᰄA�q9�9=��z�t6�'�˪D�42�x>z�{74��(7��Y��4����Nw��)0�dη-��O��;��>Y�%kÒ+d��9��Ϯy��z�	�����g��+0�/^��k悰�y�I���Qj����^���O(}�`D�j�����sJ
Ԧ������q-��Y�z��h��Դ>z|Ʋ��ȏ�5NZ���V)��ĊYa�C6K�ei�����{�3�]{��-�LA���o2Ϲ��{��!��	;�E�Jٰ�w/_��C�����˟>��������e��=zD�G
zyS���?��4�Z*�c�
�n��Vd�����k��t\<�3x>���E�hڿ�g��<{�w�Շ��]������7�~<���[���=r�mՋa�0_w�~�H��džÖrf�<xB^�R2��&݀Z	Sw�a�\�l�ɠ�	t��{ն��=]�-�}5�ݥ��2�a�&H)�N�j���l����2�J�A��{�BP�)�
��>����}��Y?�qH�D/|4���Ds��<�G���p�Z$��>G�ur���9�I�#k��k�-��
��&�3�Po3�z�­��/�´;�B<ѾK���I���1��޿.
Ǟ�]�U����Q��.S�t��{l
�v]uט*�`G!:/(�����&��8�K7���8p�6Ə���U}�w�[Ĝ�sp�h��߾=�x�槱6����h�1��
CƜ�8���	'�$�7������t��З�j�XS���DZ�X
����́��-�
ا�<
tM��n�|�Wmw̴̆�ö�
��Q,s#�F���8l�L�R��j��"�X���v¢EtD<ʹ}�R�5��C��*M���P�����Uԭ��$���p���%�Rq���]��ЀTߺl5㔽̷|8f�:߹9ַi�
T��CAL\����i������F��V�ӟ�//?��x���E!=Dkȭ
�VA�6G���,����y1>�Yp'��� ��;��=�>�^������2u�[��ǐɻL�"�`��ΘW{x��v��M�����x�
�횆���lm�\��)��Mv�їG�cQ�����L��?T|�:\xY�h��׎gDxY*� ^���S���h#0i$yV\Q_>}4�<�N�*Wױ����"'v�B_�=��2nHlU�쭞$ã}���ôu3ofY�}�͌=f��M��I0�E��z�2�,@ӌ2��&=}�,�\?�V��5���~��L��c| ���ȋ�eK� ���n=Y4���}�x�\�_ӧ����*�z���5>�C/Y�J��P�D
�f�"e
��n�b�!w���l�t׷`�B�$�����3"�8�*`­"�Mbz�D\�����iF'fa'��Ya���G�,ޱ`�y7��>��}�/��r!�������pKŵ������,Z 
���n��� S;o⨪r
y�@�e(c=�R��>~��S�f3�fi�Z�E!�ùǔ$V~ە?�.����>�J}��W��p�|j��W0x,a��(LF�C70B�x2�e�Y��G��U��:7�����
�+�2���k=�֒=�,�$O��R"'"ẞo����;�@TB���Z�d���FְC�ǜ�@�R�X{��zl��唠��R���qxZ
�4@"�!�n�6=ة*�囉�A��"�a���c��R�W��#7i�I-[:��Z��[�qKKvHδf��*���߿��k_uܦ5�켭��s�u
‹q�x����ϳ�O���>^����ZZ<1\�.�|���(��p�!�<��A��w�o�my�����7�o'�Y�j�V��ӌك�@�A5����O���>K�ࠕ������Z��ǩ���8C�Q��x}"O#�ëLbV�3[n۫��O�B�o�E-�e�?�;��\�(�3W�P|^�V3�f�UVb�[~$�xlSZ��ZJ�żK���Q=:�d�/x�5oء�V�<�
��Y�V]��b':���3p,�٦H�F#�k�4,T�S¦�0�w:��iq�+��r�nEt
��*Vف��?a2X�@'u���Z�����̊/�����XX)�ss�14���F�S)��a�PԒ"o2�y\�&��)"t^�Jۿ�$��aq.ISP��{��z����%̭�	h�}~���Ǔ�x`��n���Þ˸���O1q膊ٺ1��"%�h<v`�̶*r�L�C#���8\�:�	A�7)����b�m|�ci	��酷���y	�$H-���h!�k"걢�=�4�!nZ8�>�[],�6��v���55����Fm4��S���S�/xD�Z����9�6A1�����g�u�զ>b9S�-�9Na�OU��l�&F�|o1�Ϩ�>�x~M҂�̌.���|�")�q���< ��_
y|f�)K�����>���n0~F�REb�N�G��r�L��¢Mؿ��6�]����
�dؿ`3��?�B��VR��?��/_,!%��v�^���(F^F�Q>��k���䏶z��m��qq�o��=
�_}�^F�=��&�S�W���ff��\_;^K�U���q�w�>��?����|�R_��V2z( x� ��sڴ;�B�,eeW�u�
�`ԝ|e=��`���B�^:H1^ǰI#�aSQ��d��j��=�>�	D��-^=��H�̪>������_e��������n��g����_)ؒ_;��D���0�����U)2�y�CY ���w�P��I�8ߧEK�w1���X��r����g+=��t:b��$jz�z�9����
��a�N��H6OC:�Y{��b;��]�����7,�*���zO}���?�?B(4�%��\���{���A4S�b�ܵ!O�
G�k�g�sq+;Y�����9�r��9)X��`<�9GrJO�벍:	I�� ��O��A��\	h!��:C����$��� ���M����t��IgUbĚ���a<Y�Z8.h���l
��έ<�i��ц�k%&N�y7:(�
�{6v��w��X##=]@�&J��D}�E��X����8�@���a
��)�&M�ڍܐ��`�9؟1�Q;NM=�X)R��ы�@�]^�(�� �X�xO����*��q�b)/	�Ζ>Zj�(�� HX��'��4Q�(F�fR�F:,��D����i��_�&�|��y�j�K�_F���(O���:i��@<�s(�s6+|"B�~���Q3p~��*�w`��K�O��(S,$�C��I;��ŝ��A>i�O_�vyj���G��Y�V��P�'.H�UF!�ӝ����̴��X�IE��@�MNAd���o~xyy�	ѣ(@uF}�r��3��؈����Z��'6)k��m0�}x�Lm8�2m.(=��ĺn,�O�[~��^y>�-��PK�mW��ȹ��setuptools/command/bdist_rpm.py��M��0��CJH��=.�P赴l)=�b{�KBqò��#�qj��E�4�gd�[�4ʇyQ����ǴU9ۃ�`��
5��i�;_�3=x�c���c���a-�2�טUEM�{��I��vx(��f���3:��pBh����-�x�ge��A�!2[=YჀǨ��R�5)��n�ԲG�r�}<_$Xg,:�@-��$6"k}�y��Xr���hѳ�e��I�Ŀ��K�He�
�g!\�<��19
�߿�.8u�	�3������#��4��i���sꍓ�?��/�����9��@BC�Y�L���qb?�	��de���$ (�y�Px�A�"ż|wmQb�.q
і��
1�&��Tӻ�ﮝ�'�|cb�xC[��	+o��ZE�Ɯ��Z�n�:�)�¡%Y�]�u������`��~�[^޲��W�����(5l�SO^��s���M5����_-��	Azo��|�g^9�p��?PK�mW!�1? setuptools/command/build_clib.py�XM��6��WL�
���h���@MM��ba���f�"�ڍ�}gHI֗�M���emsf����p�����PJ�/��SUB������J@80V�VGk��%Zk�#���'�����&��2m(ǖ��Ub�g��F�3�}-�}��'k�z�ZJ8Wh)�@Ͷ+�g�^��o��,��ģh�x���I�Ƃ7P�`v4J�g�O�U��}�W��
��)%��>9/��� ��C��D]\�]��*��H��Z*L��vB�O�4 A���`�C?�%T�"<��12��D�R
���F�m�|��qO܁������DG'���8�!ZDe��=�,��iTID�ѯ�B%�(�	�������J[iQ!H�"Q�9.�Q�����DTU{��[ޗ�rR� �"(*�J�}�R�cQ�2PA4#�5�͛[aG��{�"�c+4ҙ�p��q���;>NJ{&h�Tg ��c;�yu���'�iҮ$��^{J�������Ujұ.0m-6�
P�*̲�+�.��>]�jM�H��$`jf:ڲ���w�e�DP5�+Rcmх��e��
�k�'Jtkx
��
nٷc%[�����Lz�	`]�1�|]֛A��+�C<Ra4T���ș�e-���ԘO���Q�t��4�c��'��H�w!��|�ւ�$Dһ��O�`.�n)�Hi6��Dl�C���E���5�'g
Z�n��mi�Z����
}�A�oc�>I�{I�t�x?$���^ޝ�L�+'C��:Z�p"��
�,>!t���N6�6���A��[[��2>��O\*!O�Qh����-�:c�pm��+d��6��ѝEA(�竖/�֝k[Ü}g�.����M��<�6Lo63&+��/k�������,#~�RJ!��DN!�ߖT�F���+Gsۑ:h~c��"X�D��c���"'����v��&�S�
����R�]�o����a��R��snfG������
u��ڂ�^��Ҳ�Z"��ma�0۶�u�TIO��~�
dm�%H�
&��RY����h�<'���{
`>M�l�w�Ϝ�J�,]�q!Y(N]��DN��py����~qa�c,��Mj��nꎟ�jo��.�Y6�u7��l�6�����≗MK<4��3|��n�7��J��uP�H���g�q�"%�,:eN��Z~7��kY�2���P����z����>R��D	�:~y�8�'$��	�G��'�<�#F~���zZ�s���� �����Y�VPK�mW�I�V�3setuptools/command/build_ext.py�ko���~�FƁTB3�Ou��{4\���1���S$å�V����̾���|���ռvfv^��m��5rQ�O�h?�����b�5{�V�r��y�+k��{���wWo޿ˮ~y��ͧWW
�(e��J�y���Hׇ�*2q�T��%ˊCf�$6e%2�hP�=f�:b�ZX�d-�2�6�
�M�)���A�;���(	ۊ>SP�g>"!���i�_���U�v�~��?���6-jY6��z[�;���;^,����}/�m���`/��6M�TY�[f�Ȅ��?��k�R �
+��>dg-DQ�=0�UuLB���~������Mq��+�
v���+٤�ذ�o���/)-g��eq��{���e��>��7G�UJq�ˁ-�؞�
&�`�	��_
����X���o_^��ë��Ճ�Em�x���g�|��
�[7��bQ�~��se`�L��\�fi���^i[�`���-�ݕ�R(mZ�����N�q(;�X#9�l*���է�N�V�G}��+�#�l-�v-Ȫ�Q�3�1�i�%�l�٭z"�X4�m�N+�ޞ�l��-��(XE�_
�Zr��E�z�M1�+a���ӧO�'Q�_0��M�l�?�k�]���n'�m���0o֕�]��i@�g{߈n@�8Ŀ�6���Ur~�΋c�e��9?��8�W��in�ru�ً��Opy�꽂W>B���<���x�/fy�y%�̋�ڂ�"�) QI�蝔b�@3e�n
��kb������]����V��H�M�X<xh|2��X�
p��Z�h�}�@�҇���O�w�%�..��E>�}��{�k�u0��8��D�Ɋ*�:t�"��I����E������<l6�}�Q����������4x��u_���dn~�W��r*�3'����
�R$!�¹���K]��b6E �2�f���XDD�ײ.�;y��b�W�B��b��:PSݡ���6+'5��G
A.s��*,L�� сk*;p���e
n��%�k��^NrI�7��k¾�8N���f���:���K�T(��e}�����N�U�<�@YJZЁ�zẸ�.��ȀE^L7��V��[(��PUt=���U����=���c��A���~X�T�Q��(�BȖ�|K�&��ߛ��5���7��� m�P�O���B:���Ѐ�b�a'��3�gH������W!k�峜I�j'z�p�E����%�T��g84x�ɛ��o���w
��eJ�%-�Tjr�����R�(�8]' v�L���6��-�E��m1��2��*	�,�u#�%iE���j��@��AO��Y-D!)�\��BRw�g�;}��@�H*�$��ѩ@r��}��F��@�D�9��^}����߿�� 
���3�]�����8r+����e)f	z�󡽅�n�7(��`c��l\�X��m(�"�~mo@�0U*�d �E�U��o�hI�'���rc��e>B�����f�c�r���P[P�Xʲ�=�s����Մ�u¬��Ð�`Vwag�d��=�T��LUGq�0�dH�JWۡ��HVe}KiQW�c�p�z(���'hDEu�
7�CѠ��;ή�͚è�k�|���F�9�ϻ� X�^߄?h��_��_'�)!�4舉I����C���o�ڦ�n5 N)�v�^8_��e��~DK�l�r��P$~zAE��A({bY�'*���xK���p�%���}�~�&H86b\ޒTz�����;*��;��U���oK��k(�&��¨Q{
�	�>�����jZ}*�H
�ÐS7���m;�Ȏ�\Y�⸲!�[�D=
�P5��k�WK��я�K��ID�aY���"�m+�3Qtfلf�Ŕ�J��܋�a�S�FK�+�&� Xz�y:\��5���-4��"5�c���>ZRNw��g.F����PP�J�X�.���Iy1f>J<"��P��y�g�h	$b*� (g�X�a1U��y�3�T�8�A(֝�2ARQ;�ݍ���wM@b���o�!R��	�k3�����1[;~}�i,|��Q>>��>J<"2f�Q7�8�S�3vT��o�f���T�h�J<"❍3��NG�n��Yf&�V��������(@(>j2��a^-�Y��=�W�-ҽ�<��M%uO�fjZ=�+�u��1$;�tG]݌Nԡ�������}���Rg��m쇶A���bt��'�9�O!�;}�,!��s<��Iف@��	C��[����)�zS�� h
�B�2��<4,�	k=<�g����wp��9T����1�n������%.
�Ėv�CބRQ� 79�8�4�q�D�y�(�g�e~��dA-�D1���b7ś�[q��5^�{&�	���&����s�E�_ ��z��(�u��>�H�+#�2j̺+�(q�9����ӡ"�InP�8��,��d���3��ޯ+e~��2�K��w�BK:v`]�j�@�%4b�������Y��kU�a��;��Q��ц����[��c8��K�j$m;���>�����P���x5�!jՉ7DL/���%�#s��Lz,n�c�&�r�h���!+I,��8�6��ҋ�*�i���V�K�=��f�黎�H��t���AA�(�=��dАO\8���Q��N��/�	�d_MOFH�A]�7i�-�$��`/#Ű��%8D�����,�:���LQ���\	t�BT��2����lle[�	��WC:�����jC�'�T��n�^�o�[],�/v��jּ
1�J�:}R^�e'���^�t�?��J��^���)�58XQ-W�h�ŀMj>�y�r�F��s��u�i�g��p�qB>�P�����S0]q+{��Fc����:e�"Y=ֹ�
z�
ݐ��)�#��b~W�<<�'��Q�o+�#c��y�!Fې�6�*5$N��[�S��5S\Ͱ�Qr`!��|��-�u-릧�Dw�c!�(R����i:�*_�X{P4�:��)�����K=�jgm�G�
���R=,�(=��A
n·�5�)⩜1��;=�����	U8���m��I�I�ߜ�fW32�b����{1$h�����
�����+�f��=b_�����E��j:���g>ْ��v5�n�^v�٬��V�i���Sy��ՏAWA�̭�15�����V�B��?�㣾��v�����N��p�1A���|뺎g-�9��a�Z��Uy�/;'�! �x��_��3��&Uo��o~��ÿ�U��W:Z�%���u�	U�(��1TEH�i$��u@�Ł�(꽝���;��Za.v��-��sO�9}{'�{��KI�s!�CDl��Cݾ���[o�S7��g$�xW�ט�R��Ag����w�<��}φj}�*=:SJ}��<:M��_�;��q��ק�m|��/��)��,)�`N<�Qm]�.ꛒ�	�5���Fqy�\���^�!�(�m��([F�1�妼�A�����Pl�����K0|v> �AK����c�L$��x����"��9ؒ�x<��H�g�%_�:tMǠ�PK�mW�2-�y	T setuptools/command/build_py.py�Y�o�߿��� ��S�|����Z�A.@|����]�ZQ%��m���HQk;�l����pf�Kq&�A?OBj��ю+=k>���V�����D�i�Ɩ��8���Շ�]3]UDH~�+����6���~�t��\�ę�B\Ba@i�-��y2s5�er��B�&���#���)���nױ���#k�$��0�RSyd�z�#�#@��Ytnt�x�_
L3��M��������C�ہ*E�bJ�JP�#ss�a<ѱe)�\A�R�>Q{l��c�tTS���}�D&�>�#S;C��WPɈ�X�{�?sJ()܎���8����0,��6�>2憬R�$�_��0��IPɤc���,���\T2,%��o�%��E�ȃe�B�����ʝA��{����gf�O��$E�j�Z�Z��#�/��P�bC�l`�ۦ�^�W���ٱ.RP� �ʾ�6/��\j���� �I�Í��Q���4ou�,"ZU��}��!e�i�	fYg����E�r�J��UH���{c�V@x� 
&7*����B^�f�d��N���2��RJ��w1��t����w�e��{�h�_PV/�0v��xC�9�	Ch�g:��*jOf��#�$�1�l�1���Q&#zb�Ӭ�PP��=\4k�qi\�!�5v����ǟ7���XU�vP�eӸ���b��p'ݬ���w�����^f����2�Ҿ��z�n5���H��1V�
��S��83k;��q�nu�o�kВ���ʑk:Ml�J�K�)#�12�Jӹ����� �!4��q�W���#�VB����UU����
����0\�gJ��xPy�S�`az<F\�S���YV	��=N�ސ��sSD�۵l	`�V\Rs��~.�`����A<�Ul+�=�ƴ����cy[�G�f��V�i�,�"oO��ʹ�Bz���DaC�� ��gE���CN�Sb��ᶂ����A�oX`�t��g�g�US/&����Ȏ�-E���@�#Q�h�`V��i�(�?[�_�dڳ��qJ���Ц�a_&�AM�A���}ஊp�8h�����!�榣��1cFG7�}�{���B&�4�c�0k<�2�-�9D{��K�3�,’���o���2���T�G[:�o��=kP��,I��G�oWy���3�T���$8���M��ո8�L��-��1j��*�j��hˆ�
[p���66��ĔՁ�����/���阫����	�o߬_�=(#���P�]{+l����_ii夬�	]��:�u�R��n�k6%���3>�R]�>����g�]�O���}�R}A�Ҹ��,�����b(ƛ����/�g�Y5@9:�4j�&&��u���Z^ˈS+�O�}�}ߋ�����!�>|:!�:S,u�;��~!&�\N��㺓�lX�r޻��	;�>]���V
��*�w@�2]�ʈ�c����������t\�MC��'%��9��b܏΃.��s���Xf���3�	�?��k* �_H?���c�s�nk=��9K���w�aMp<(@1��ߠ�cPPJք����e+6����Xw��,
nA6i�wv������'*��#���5ѫe�l��aR`�ڭc�g��:��B������	���~�-D�`�]�l�R�F���7���S��+����*�b�c�4����t�{R�:"$�)�;6j��A!@�2�PE���#�u��e
aӉ4Te&��k�CTp=�ߓ��u2���H�������=�2��E�[:����W䇁a�&�V�Ĥ��Xb���0C�r�[?3�����H�Vn��&l�i�)�[r�4�f�jbp�48���nzW��|�dF��Z�-M��7�����x��a��h퉷�_�)�U:{�0ӱ��ύ�`���A�jj��S��l�4N\����*u�Q���US�5G)�	�)��Q�@��q,U>	�������]��Wմ��fc��&���j�G�&&����}u�����$P���8�"�<�=Mc��{W�N�-�o�͊�g�O�[u�2����K���3(G=�w�%���r�Y�f[6��C�'`�`��6��Y�;�y+�� =U��)��\E�
m�b��+_�)��OM�-�7�U�U(���B���9d�$���|�mP(9Q����-h
q}�����j�K�ny7/�X5���u�бr)��ށ�8��tx_�Z����$�#ޯ&S��?�#�ڒ⺗�c� ��c���=7�Vr�l�+�L`Y���O�w	��*.H�ckx���V����^�-���(6�;CM�4�(���IK|!�'�#��mʐ��rUx�MQ��vQ��y؆FKPf��PK�mW&��ddsetuptools/command/develop.py�Y[��6~���(
$%�y�A���@oh�����h�YTIj<��9�H�${��<��s��M�Iq$5W�׼Q%~~��d+�'&u�Q}X�{�J#����I)�p��O|\�����\�������7b�s��?��}%���2e�*��N���x�m]2��o���`J�lJ����TG��{2�Y�Vۆ*Ej���e���}����PZ~�"�I��7�I� z�{FvBznG�j��27k����5I�!���$
��Q�,u��b��Tm�F��%��?Yҷ�RR��ǯ��'D�"��^�$/b���"@�@��hP�������hA65�Qu|\"I��G�����o3�^�bz�������P~Ua����,d�/�(F�+"ے׌l�b�;"�6S�ٹ���>)A�~�ٱo4����q�]�l~k�P��Y~�ƈ����{�T�# 4�NT�p�I����ދpm0��\s���p:�F�&��Q�O!��hL�P^��2)�����D�
"ݝ+��k��)�מ<!�d��O��m/k.G�w��j4��H�3]��15�`�N$y�ˍ����y<͎]��D��
ȔO^K���0*&o�C�C‡l�&Sx���#I9��s6��ڰ���I�wbPM�p��.�s����B��XuǓ�W���G,��pl�)%���9ߑV�m��
z��T[�f�jJ���7H��y`؉�Z��ѿ&>og���s�򶆎V"t�?�Ue�TP��O����(�T�Zq�A���X(
A.zm�F��,�ج!�P��q�-[!�6��6�2��]%��|�K���8Ѽܛ�3��܃�#V?��oj��+���B^Bf�'��L��f�;��DPg��g��c�n~E~��(	G)�7��pJ��� 7��8���\�1�[i)�g1�/`�LӚj����i��nR�ƛ\YyS�R���N�Ī�([�7b���(��3��*ͷG��:Ē6�l2Kk���8��f-�Xei��!�7h��ӁA����X�̀�T0�(u�0u�]�-��	�4��~(��+�x��7�TZX`ar*��A�ز�XW��]����e�;LԘɍ)J��	;��廔�!Yt3c
��z?Jr����:��"��B1�߼ }�=��j�mSؘ�dS��P�^��1�R匥��u+)fW�i��4�������e�7�J��ۥ��a,K}}J�B���7�2��(e���O8�`FXn����ސ���Wt	%LVWXk4��R��R7���E���~ŽmY�Ggn%3Ŭ
;��MaUت��, ���5�jľ�Xe�w�o�V$3qVyR�VA.�!��Vh�幂x��<q�ѱ6�0LNIN�"���a�\�,�ޒ�-v�I�fV�4tDp�
���z��w��L-;,3�>������|�s��!c�~;�v��*(2��SC1:���`�����WL��T��IM��+;��/�.~���mg���Ce��
�=�2ߟr3a�m��r��&�;�c��N~�}�����)j�9��s��g�謱��Vwc��	K=x�k�/�o��S���
~ �};``��/r�o
:�'�%���#�%Bk���xT�*.��ƃ�t��zE>}�D�A�P�i��Uhp��ƅ>�nf0��IhvG΢�K��h`�&ς@����|����r�م�8���U�Dx05�(����5k�g� ;��ώ����r�O\�x���v�*檦���crp�+�n̘�zd�rk��V�3$TY.w'hPk�Pb9Mm9
GnKe7vP�"�0���Z��s�n<������>���?qQڲ�����9�ni4p��;0��z�%�w�%�lT-Bf����{�E������h]�ױm��~B�^�/^Û��ִÁ���lfg~욳WȬ�v�5<LP���iЅS�G��yt�8$�I�GB�R([�����{i�J��>��,�-����p�y7Z��
<�	㪓�Nߗ_��Ɂʄ���
����x�F�����X]}nX���t�ո~W8�W�2����	)a7�Zˁ����o�V�rWG^�'�c�g�����PK�mW����setuptools/command/dist_info.py}S�n�0��+V��	�#�P���*䘅X/������v
��0�����9{u����P�P�9ԁ�'{�Pcc,�`,����?�6��*��Gf��\�5��,7�R�C��~��W���L���1�)�;�G��j�ڙ!E�#=�/c�N@\)�GWQ���9�ô
�m�?+�G���g2h�Akle­�
z>�<X�X:5v���&����4Bp���]Vx�kb�M0�3_8�-<vM�}�M��M�\�d������=��.h7�{@R�y��Z�$ZW�ڊ\�rü5�2�En�>PK��y*�؇`4mN�}��sÄ|�'�t�Y,�[�'��!J}�?��
�^��|9�p)�٧w�
.�d��9_]���w�����i2��>�Mn�u���PK�mWE��wg[�N"setuptools/command/easy_install.pyͽi{DZ(�]�b]dZ�lJ�E�c�cK:�'��3CrB��HѾ��������)'y΋����ꭺ�����h���n�W��/W�3�y��E�7�*;o�l�ԛ���ͺ����٬�r���з�|��Wˬ9ϖu��z���ʮZfoo��f�`[.�ʋ��g����z���b��6=@m6Ӭ������r�h��rs��b���C��jN3�r]wuO�We��f]e[h��?xP�e�o��wU��⠺y[�K�	�w�y\m�ʾ���j�V���E--_��Ճ#���m��.V�YV��M��w~j�?��/��r��ܢ�\W-�-�K���Y��eۅu��m����d�ܼ}�^�{�f���O��aɷ�K);	[�eY���\f�t����/���8~����G�ӌ��u�����j.��-��P3�VE�h�mok��-�˪�TE[�5�my�q%7ˢ�P-v}y�����3_��z��l�K��O�?[p�>�14k�CӖ[�l7�߶��
J�[X8�XyU����m�,��վ\Ȕ�QU��- Q�>ԅ��c�����m�Hh*�}cj�'��~��4X�%�j�z�ó�)��6��

Z����Q��]\��U�w�n���WQ!O�ٗ�_��W���4����Ǯn+$\�w���bkQ]@=��<o�*7�Ue;�-��"۫h�kv-����ۺ����p{�\�?TBKL��Z�t��*`V��io�.�c��l����~��6�u�lp��읛G[\����@�e_B͋��ۦ���*M�J����f�Y2��Tm_z��=���Wo���:~��-���̃�]�ɚM����g�=��l6���}��5?�Ѳ:/w�~4͐�_��z0��	,@�t9�N���\WH��l�������c���M�����b̃�B�*`o��*(���/�1���W���}>yNe[�)S���\-:X�|�v4���H5ӹ|���T�����X�d�y��4�M�ϫ��,�TF€S+��]�w@E�X~n��!��������2�X��maP]�k��s�����͸Ϫ0Ys��gMY�s�q�"��`Ll z�lBUw�gm��˲+��ͥ�T��qMQu蠆�3��>��b*�;��>U}�'�%��-�0t�g���L*Iol���`@�7��-09y����YV�xן�f<��Vv�������
�աB�I8)��]EϪ�j�g�lj,O�E4�_���2�l�`G2��x�]5g�|Y-�����6�S\�������2�bUv�ljC�r�M�u�"����%���s�5����'��k4�p�1lY[����p�\I�<i;`z;<:v��y���EC�;K[𓏙��^�$M���G�o�oG���16e�\M�0r�MDz��ae��k ��욉/V]�?�T�n;�C״��(�a�d��h��h�e������r"O����Lb��+�5�7���NF0����-SÂ~}��_����t=�`����v�j&e������T��Z�n��n�h��X��^kl*��El��>���c�kW��A�
���ۄSɈU��)>�=u��s��rY#ޔ+�����A�`�׃D�bf�w6r%`EҲa����]vUU[��p���Lj�k8���o�.������M
��&����<�~7��|��|��S fo��E��ٛ'8�꠨��;�p������7��nC��
��0ڛ�f���Vxr�j�*��c�`��2�
lJ���3F�PM�Yd�2������.UG�y��L'�րy�k�U6�ŒR���!U�*8-ĵ #kw�jQ���a�8N�ڇ�if a��:��{7�:��Us3�l�X��|���4�
�.�>��8�]��8ab�>�UҬ۔���;��l 4�֢�x�.#�*g@�W�.�\�W�6o�Ѷd,C.�]3�Ftf�m�n1�����r0c��eW��~[<��%:@�:� tf��a7e���w��G|ҟ
O֬�r�<��|��z�	s�Q�Gr"�WE7��($t�:���6���� �۪.`a@b�a�~�w�s;���o+8�DT<�����&����
�t���|��_r�θԚWɬ�mtSsMװ�7p0�Ų�z�0�U�e�.�N�ELM��4h�H�NدD�g3B%*��t��������0���q�)6���A����s�cŒ�	�a��
+R4W�~��v�
b�_If�^S�P?ԴJ�4 X����[�yw�^�N˞��2��+����VΖTQ�bII��7�yD۲0*�r��i
�n&Pʂ�r�z�4�)�ܩ�:��z��dq�k�U}&e��i��ٺY�Ϟ�b0�>�M�����Y�Hu_m�MC��`��.����/?�$�w�~�]��Ωjڴf|8(�e�~<�/�ro�&��6t!UDc:�^���WG�=$�{���Z@���O/���W��^l�V��pܯM���Z�'�6�ۊ���SpX/�m�뺴T[��{L��Y!��p+Ę�*�(���ŌjY�d�w�DX�ǟ�`^P#ޓx��P�n�U���H=l�nwF�v����Y ��	Çz%>M�<��_�	�jɎ�99 `֫���][�=���Srȉ�{�2�E��n2�Ց���IUi��cGj�GKx�j�#��Ff-i�tB��Z�UKd���X��E�K6 zgMgYS/�ί�@�ya4���|����F���s_u�H��q7�jUv���{�%g��br�t������}��L-<�^iX�@�g�Lp)̻��
�ީ�o(��r�˲�xX�y�ƭʠ�𪹘#���>Ǣȇ?D��&���O�X���J�}[UJXw��sI\қ`�~{m�n���j��>�`�rb��+�U=�O�ڪ�
D祛��tk؈\M�і������tD���e�1��!ai�ˣ���ǟ�s��G�mgx�^q3�d�qx����B�~�EO��~�j�OL~�2�==�E!�#�i2��H"����#b]�|2Q�Uְ$Ƿ]_��>���a �?)��9��ϳ��}��ȅ��d�J��|�ū�~}����u�����,ϻ�
;z��T�>�Oբ��_p�ht�,ڂc�&�IU����0c�Oí�Z����|2MT3��PM;	����jo��@T�M$�u?K ش�W����OO�+l�eV8�>ѿ���aE�<7�4��-�׫�\/~P��倫ڬn3��}:�	^�d�Y}�*/��al�@�}��.M��>Vk�"���d2��
k9>5'w�t���@F��5G��G�F߾x����??����:]�dO�)��s9�{x���� Zԧ��a���yR1ۙO���U���y��j�͉�+���!&�w�U�^�{���QB������5��Z��J�����Z}ú�L[f�������z	5"��d26�`���
��N5ۈ�ҳ�L��f%70lij88P�������@�Ś���"�1��}�6�4���A:��v�W�BBs܋v��md�wя�Y� U����b#a�����)͒�h�գ��a]/���iO����q�q�:ؓ?Э���)�>�ej>��f��B��̚�� ��s#�&z�YI��j��IO�-��Q����Us���U?f9&p�� 7M�)��������� �3�F�Vh	�	�;�%	W��~%�w����#Z䝹W��x�[4��7.l�x��?��/2(E�a�=��¸|�%��$.�w�=��f��kB&%�dF�Ŗ�
����@kT���%L���z��2O����Q�UY;ԣZ�� R�_��Ӽܢ&���)��8��U���ZK<@u�1���n�y�^<�j�U���}Y.��B�P<�����ں�,��0,�Y�a\��`8A��S�%�U��O�Z�ke��&6���9�ތ����(Fr�h|�*���,B-&ㇺ*�7��S�=�);�p��<�}^/�:�2�P��y�N�(�
��ҫAj��̃jS4�KP���(xb��=k�8��.��k�`'��Le��gL5gi��_��Z�\�������� Ã�~�)[�l����`�<�7�O�6�6f��4Z�Οd�?�Ãg�/)W;���
�m�{��!���cϨ�lf�F���zJ*�g�4a>�����A4���h��;k�➎�Ʈ�xv��;1,��MкmP;��ތ(��e����{�d@Һ��iw4s�n\��h����j;���f�ow�lq�u�/��Zc��R��f9�W��H�E�6�o���-?�[u�	�b�1k��%�uw����`�����P7r�r�oQ=����́K���'0]v�Z�9��mӱFt�AU(P�q�VlW�a��rS�X��ua枆�+�@�!A��.W,��>͂�	�<*�����e�rsc�n�q�r?r
���-�v.TXji��z]4�iF
�)
�\�^{	��e��]�>#K0�A�,�-ۢ��\o?�-�5=k�Zka@���Ƨ�(��d$L��%��q� Uu�-���=���b�U��˾T�N�M6�in��F8��b��ў[�)��H�=*7�f�<I|�x:ݻ�ò��a!�I�Ü��H
/��]�/�.'0�J�؃!���js���=�رֺ�{xY������B.�� �N��k;���?V�z,+�4EԌ^��(��e}F����Gwt$�������Ls~P��Z�s)&Zf>HyZ!o��E�c=��d��T�9��x>:1�y~�I;x"��Ν�B~�	\'���EI���s�(S��I���aE��Q�'��zn*fw㭋����?+���tu��������;ۮ�-�}R�v1&���]���3S�y#��+��e��G�8诃dd�X�U`u�m����v��*eQ7�#���njf�m]h���Y�+��f7�S��/``�6[6
���=#����h��%f����ODk�;���
oOX�.?t���x���e+zj���̐�̌���m��-�pCX,��:W)в���č?��_��%�<�t���f�rKR
�~�V!�w
��N?�SS@�\*C6o>��M�Ď�}͌�	�	�Խ�����^1�f����ͱ�ſzC_��84b��v$�=�Wx���(
/��o^�}��)�J�A=���j���p����Y eO�R�9�h4a��'�{������#���܆��'�,����
�I�u�7b|��\���ƈ
��^}�AF�gh�憚�(��ctVM�4��*>]fXv�f�.�65�'w��:P��_
�2[8��k�'7��|��S!O��޿�)4{Yj����⸰���v��|�O��<D��M%�/���76��`�;bn� v�� ���ז?j����1�P���N�"���xn�M��N}��[.����e��(��[�]�Zb5�AK-�Z��q�B�kyB'`�$,J���P�����<������?!�/R�6�Ů������RD�TX.S�aHڤ��?�ء���hQ>����1����c�cn��9�	��0�����2	�a�ChZA�Ծ%!^�
�����n�`ao�,{���=��Ã�C�NyQ�od����S��A�����Dk�M�Ȭ�d~��<�o����v���1oqS@^�|�1D�9�����{�[�wd5:kn�'�� �Y���Ǒ�o}���e�q���z�����P���ϩ/kٸ��J����.�5�������ޱ�Z�dF�����ޢk���Jz�Ӡ�vt?��5��w]��1w;CSiGM�����u}��0/�UV���ׅ��ƛ�$Z�-0U[ ���)hN?�}u/�'A$���9L�0CsL�#��|r��4q����GF|��a�A ��Ҝ�`�9)���nwb�m���-�rcQ�h���zA��5�f��V>��a�E�
�8�N���"�AS�y(��!it,�����m!��BW�W=Bx�O͕�a+#��\�u�!^[jG6�*J����K?=G��E�( �Č�_�E�|�濢7)����eXQ�W�2��ף����]��ȓtq-�J�)�Es�j��8�қ�{J�$*�mI��,����(t�r��Q��p�Ƞ�ąe�k��*;ۨc��M:\#in��CՈ:f��{:NW� Eb����ml.�	��h���?��`oB[鎤�J%�5��>�"�*���
0�����݆��`h�AX�C��z_�@��P]�������`9[࿨�é�d׍����k$R=8��������G�?����>2��	-w�H�b�vMD�Ի�j�a��'��џ��9�?v�� �i�m������@�������"I���Պ�_?\>�`|̣�\vʵ$��m|��Y�W6���c���v�
����	c& {I>qk	�W���\�SMwyl�i@����� ���c��\#�}@R�D��P�$�U}U���H\�>R��H<UQ��l˫z����7��J�ͧ�N�T�3��i�Ш����<E�,bPޢ�` �CR4�����ڗʿ5�6�@�f��.
�QY]��zڻ���1���Ec(��ܾu.�S��RzC�K�(͘l�E`90l�}��W��rǨ	:�=l��8�3<v��J�߼��KY�"�Y�e�0����x0*:�Q��pPċx�"��ι��L=r����b/0N�V�W�mx�~���ڛNtH��L��A�F�J�,�U�Z:7�&�(�S��.v�\��)�akg�F�],jA�EI�x��Z�\�
��c�hG�M��lT1�X�b�Wڜ�~�[:5~����A�m�z���b=���:�}�-;����7��v�t��M�X? �7!-}�Ŀ���й��̅��'���ʌ��M�=T���W��BI��1���L�֡�7�6-���e�xT���sX���T�ɟf,��b�*��{g�ˠAztDr��hM,�Dכr�OO�����7ZB��SK��z@b�H���Z�W��������d�cRM}��(�ۅ��F��ӿ��j{����\��jzdD��	��ڨa_Ӌ$��Q��f*����V�J�:�1��$>?������P���Rb��q_�9�:#�]��ŷxty LAĽ����[���.BZ�]e�}��Q����&�]j;�6ע���o�I,RqE}�7����2����;0I6�V�
�g*Q`Q6���!�Mkl��
‧�u
�m�z��T��S7�1�񒢈��1�p�����|����X��2��`)��H��+t~4��qzS�Ma˃.�H��=�?��?*{�&�
;�ʮ6�
Ct�s��9��W��xOr��W��ub��˜�K4rQ��4%4������L�!f��:tu�-��v\∉��K�bo���p���.|�a��(Aղ��{�j)�}A"��	�dpҗ����}����	��>(;��x_��vw��4"��:��c��!X~q�P�d;p�!�({F��1�H�b4�[T��n�̀)�0}AH,��wU?`���XKV�[R���xr��/���@�"�sNh�9�f�>��VǟtO�+�؀���E�'GP�c���0��@ƱD�M���/�5N٫�uL��o���T���mB�^���f5:[�D/�-����FN�A!��!%�3���rs�#J��K�m�T(о������{�7{ei��IT^��ɦ�}m��˲S�F�V���='��<����>��n���9C}4D�������$ �(��s5�!���A�U
�0�0�E�c���G���O����׿���
c=f���m��m�p�\d��B�0�^�mU$�8��
i�v[ְh� $����r

n�1|�h|ـ�]�C�z���p�>�Z��MI�u��HO��G=FM4x\��H��)&4���|��ƒ����e��T���/yR��I�&�<��o�/Pr�E:N��)��8�ž��#�v�D�<Y\�k�:�E__��^jsǸ{u萘
﹈�T�IDNa�h�wY-�E�}��qQ����D��}�ٳ)�z]><9��J�0�~W�W�E_��ِ���@I_���۳�����P�G�.��_�-�ߪ��]d�q��Q��\v���Xs��Gxȁ�i��`��E0�EG��j�$5��uj��IOrt�B�m�=2�j��7�6P�u��Yj�8�*����f �E^)t�1�n�Z{h����i*Q�����:㜁=�����0��7�����(��<���V��9��׬��yw�j���v��s)g�\���W�H�Zp���K�����Y��(�Qy��h�gUd��Q|�m��&�\�?¢	u��v��M��D�蚃-!�%�?W��e��UuQ.nM�K���Q�7�s�s`��C=��l�e��{�#x�Ÿ��fi�\�� U���͠'��̘����R�q��=4��}a�[.o
T>C�gǁ@�I�yyO��w�^n��ۮ��Զ�=�G�iN�gw
�OI�:2�gҶ���j[b�~�Ո�;���W�W��|��~���k�V*K��u�����O?#�����x�/�+��$s@���
2�%���y���o�#b�ƥc�Jf>}L�Z~|�+��*L��B̶��F/c?�h\tS!a����ʦe��f���=�b�D�!�Hv���������$i���&��6�47�H��L�b\L�|{����n��C�&�$f�\X�i����}й��,����T������ߘ��س4���%��Xq6O+g�^9�e�)��c���omX��5�Xh�%"�	�9�|{�Jo���f�ы��Nc�mY�vq	u,�'ͯ��lFL�g�Wf�E�\Q	�us 1�bF�#�ړ!]����@��d����rG������m��PE�>Ta���UX�R?��#���A����8«7u��d�Y�C��d���� i+~(D�-��2�'��yz�N�%��-3�rJ>J��3Irn^�4�6Scx=�Z�p�Fg�ό���ކ���G<="c�EA��|����:�Zy��Wѣ.���"�=��XBQ6d1p�o*{oUŬ���.��mϾ޳�����5f`�]>��=,M�F��,?9(�M��#Kh��QQ\�Us�����#�#+aǐR�%�&�b��`2b)�9�ؗk ���O��<�I���l���
�Q����p�ǁ)Lڽnn0�W�!:�x���6�
�����
�6}ӫ�ןIRmr�/��6|ᝊ�˜A���dd��ɋ��2�N���Q�a,x���̙�S���ɵ��g|��?�^����x�q����Ņ������[��1�Zq>G���>5H�֡����Tq�kҧ�T�ʱF���
� �n�_�X���sC��7���J��n�n]�6�`��c}��V����NG��qpӪ�j�PWE��t
��^����)a����99��0��{[�֞�lVNHoT��C���ᐐ�@1BW��h']F7�
-iQw��-
�*?,z_ҥʛ	6jؓ6#&fTI����!�������~�A�'a�\A�}NB�h>̞]
��T���Ǎ$h��1�>з��&W2r24���.γ}+s�;�Xi:4PxMI&v��@��'�}(�P{�r�$`�����\����K3�!��!.�c��W��	��#�]a+�4��V���4k�/����D�{�P���ڕcI�fo�O6��/�i���o&Ef/n�
6T��!�b����L�b̥�_*�ѷ�&�e��Ј?}��/�A�҄�Z���[��9Ë�l��(;��*��JlB�Cs��^{���-oan8���Q�����~��t�np2�|�W�/4̏�c��D4���@�##� ��8�������x#��T>�<�(��&�fս"(�ȩ����cJN��`km��RX��Zo�+�1�f�G-4�Q0;f�1���^R>�HV�>ێL�X˧�4x���@�������7�zlv�JČ-P��"�z_X3���=ϞΟ|�	����4�F���0:��iw�+4��j٥�L�
�?;���h?p:^�;��B:�'��W��3���C
�x��qȺ�����%�ng�`�6��r�ա5�/����K��=�lo���i[�T�ODI�NWG����ǞZB
P��!�V�Qk����E��|ҩ�55�/E�R�B�{"z����~�f�=���٤C;F�2jp�J9Z�=��bg�!���e�u�K��h�]�'V�xc'��M�F��V����Q�GC�;�Z�?Oц��a`� �Q�l���e��^��ex޵6��Ȇ�s�!x��8@Dr��$-�<��D���'����c�8J:���.Jv���|�cvK<"8{�s�t��S��\�7�1%Q�/1���C�8�=E�q��)~\�n�;�ݶH�#���m�ij����@��l�� �L&�Lr�Q��\�7=��O���^�}�x����m��eh�m>�nI?6�*@)= ���=�$�C/N�gN������JJ�v��f���qf��f�5`h����z�:o�]H:�)&+�a��HQE��v`	A�-0��w����pφ6V ��"
뾻��^���m*���#�C��9���뿘�@����4���-�N�?����V!j�<���S}�lŝB�/H9��\�PY����L�_��������CGtfl��o;�zô���������E,E^,�R�LJ�$��=�E<�-fxkહs�xL�ġچ��d!�}�:,<z��T�u-�����#\������+2@0('�O^{(0��+��:��"�kI�\A�u�pϫ�=�:��&H%�Qv�u�}zZ�ݥč�
��яR�N�&'}�_��w(>�b}] �Ӻ?t���E�a�$���+;�Nh�)f�=��_��Zn7r`I>�;��}�%&�ڐ�qm�S v����X���Ŝ�ݘ;s�K�]���:���C9��u�*[�&6�uH���J�])���� M�V�Bf����9�7s��aN!�/���ZM���H��s�f��TB������&��e��{����{"���1v
G1�S�<�*;8F�hQ��<_L�9�Fٚ��b���g��jWH6�ֱ�[�V����` >Sv��7�:��h�h�<�x3GO9[n�ŀ����"Vˑo��e�ڞ�V�̭AV�]%�z�UI��f�a6�N��D�n�0��& !W�ˤ�o(�t��p��~�~��F�nE1�Y
����0��r�1�����GQ�O�F�A�Y��Wj��q��"��f*�L�y&�L�6�|�F,`�U���G��c�[�
�rƘ�ID���&������	��\�y��t��0D�.s����<㵩9�#){@9�U��FdL�{碑$#D|sK��Z�ü9��L:g)�]A�����i?Wn,`�5��%��5Tb�;a@d�,��+���{�>������C��$�gA�.ϱ*]���r|�c^?ɸ���m�\ftneL�����d�Ƭ*�"���?��9;��7a��?d�|�q�{�z�=ʼ���,{��	HT�Fo<é��~��ö"��=MJBQM-X�#h���&B���]jyO�I+�G�P�>?Egf�Y�#%h$����c��v�&��u	~��~A�BG���0����Ou�y�k��)��}�@�A���F��l��0��Է�+����GcX:"�lLa��G'��p�
�j�I˸tb
�+sq)"��C_4Vu�l��R�]��'��Q�2�b.A�60�N�6�%�o/�<��C��!<��㟒?N����z���l���l	���ɞ�[2�Tl`��+!e�P�Hq��&&=���4C��U��Sʻ2؁��eA/]4�e�Q����6E���DO�\7��Dro�5�B������/��̯��(D�S�ӂ�Ps*ٌ���d#�����d\�.І|�R�Lȳ����+�d��3\�VCN��ƣ�ڴ-r�=e�8��M��+L��b�$��B3&�b��׸X6`�V#��:�
H���]��	��N ,1W��F��.����̀�~Y}(v-)���5
��Ąw�e�y��V��Ѕ�}�e�W��d�b��G�P(�X�-���u�DWA�'�:�e�Dw��!G沽u!^)�r�'g�^靤�!U��z]Pn���!<�#(8�*�@�U7r
ij���S�L�'�GF৉����N:��1acژ�*�Y��
���]K]u!>�Sg�G�UR${P%"��
l�����Y�i�bp��?H�͆h��.�W3!�e��]��[����l�Įi�4E�˷����1����J�<K�#ڰV^�7�l��t��ze�qI�Y��|��U��b��κ�
I�b�.�d�A�WQ�hju4��m�Ջ�xā���[�?��� /���#�{��T=�s���U@X��m�	��ɱ��#��H�A.�p��M
E���1�Y^���=6Xr���o(Fᠣ��d��V+��
���~:��{
Y+�p:��J����nPu�d�YVg��|�y���PM�FGicu+`g@�g���S=�p��F#Q� �_Z��o�F�c�~�G�;2C�G;�y���Q�]��q�`��9lN�7H�SdO�?Fp��M���x�J�2�����'ߌ'��I��f���ɓ+I�(+E���'t֨6%q���ON��}�ϏN'�͞4���/'��`��e�Pĉs�����7FS5?��m7_66�!�Ļ�;x$?��k�uӮB"m�@��]��5���.!��+?��~���x^���fFZ8|2�5[T�O��xhN2S=^]������u)�t�56�;n�?F�o�J�ab�;.(0Vt������s���fǂp���^���jo�В\A3Y�7*r*p7*k2ɽ�5�ƒ���FvP���}Na�ܾ�Oe��0�=9�m.h�����Bm��/M�-��7GԄ�#4xڒ�+����R ���
ѽ�O�z^ͧ:�꡿��v*�`�y�\>��㎔�*�v��z��&{����k�^3�H����$(G8�!Z�l�a���݄ꕭ�6j�&��e����b�i��Sɻ@h�l��W�\���4�^��$�>X�|6���0�����uNp��S��H�R\⻼�R�W�n�%�o>�G��FQ�0��q�ΠlC@�����ar�A+������X����~�pn _!~�O�q��j��:C�!j�qy�d�w4�����̛q
^� {��ZY([8�>��h|N�:�*����|���[�i(@�k�ǨN���ӪB�u.2���V'J�}���G_����ᨿ�~}�j?n�X<��FI��8"��#Le�/oF}-�h�'V�dT,�c���ub!�����;F�Y9��X�d��7�3Ы�wP#p�*
��q^Ƨ6�W�梠J�7���V�&<�`n�b���w��W��b�ᤆ�RP�ՠ�ɽ��nw��ҙ���Gp'^���)h5b}i�Ca�$ׅL��
E赉�i_��0�i�ɹ�,>�m�$����-%� �{���`�S�t���ܸ��Đ4x�4����_�Fͱ�k�dՀ'1]u��Sg�|N���� #z�J�N��0a=������	Y[�o�X���f(���7Wʭ��b�N�j<K��&�&Gg���*q�q�F����U��Tm�-�(����T&\ä��:��G�G^�%�\X~B�Щ*��8v�p|"Bbͬ���W��?�4���'���G8Q��#{����re�(=�+=�ԣQP�TOg�h��	��{t�.�`�B�Be�lo��:����@��X�
O��j ah#�`�T���^l�ʼ� ���<{i�7R`n�v�4o
P�y��d+:U���ǖ�����*k���q�Y,����u��v�0�!����G�Hu�����{cxa� �6`�dt�S�������Y�Ap@>b썋1Q��v�9���!`=��,�e���j�p����W�d~�ş�:*�9>zW�z�|��Tܖ0t����(V��E�w�pM`M�,�����:�Ȫ/il&u���<�C������`��u����8;�1�B�(�`Dt*٨Y-g]��F��/�̮��r�f���x�q7S��aFG��՛J��V��[X�D�^���	��&.�b��W�@D��l��x�m�[a"���.�f�v	>Ⱦ��
�"�Ir�0
�$�3�Y������q��.՗Wԣ��n*j�mV�}	Ĭw�����)ƙѣ�v�i9;.Lfv-�d
;�t�wIerPo��l��bk�M����8����M���)�f ���ʋ�0��Lϣx��|+����b�ﵻۤ������
��?zp�Ӱ�T�H�e��]���|bBt��kEˈqFi!����?PBMG��.��n��ʛ��-���;i�i���u~ܞ	W�]-Mh)I��`�G��j�9�:�(��c�&bRL4�7�9�>��i6H'�<���:�m���Ϟ>��(33Es���>�g� hTW�7�0�}ߗS�ׂY�p����x���5���k`��IO�q\�Y��ȟ|x����~��_��f����	�(
��)�=���x��tW�bS���6��s��q�#x��82�>���[i� d^�W)‹�v�38���jE~~bEe���'0��<#�ј)�*W����\��#a�vL���ɗ�2MƩ6��@����ȁ�L3P�=�6��{��W�TѦ��f~Li@^�������[�D��5��0ZW�����erqGE�g` ?�׆<—�7��Գ*/<��)�+�U�f@dbu�!�lj0E�##/�+je��H>~�ͻ��^��1렦��W/���-ЕO��z�>.���aT���}�����Td"�1�E��O���b�銉�I��;�2�#�$XI��k+��0!fq ���y��!�����P0�g��ӱ��}z�������mUdι�&�
����D/Ba�|��~q�=3;�\�>XU�m�����1��;L��O���F���)�~`*Md(W<A�e�{1����-�CA�t=F����w�š�VFi�_��;��`S��4�˳����3S6Eȓ	�I�P����$$�`�M�[�8ߴ��ԫ4�(E����m_�y�q�*�.{�_ꈠ]�{u|�"��^A��D���lT	���F��G��/�d/
��+s�	�i��GdF���Z?N���)v�
���Ju%�BI�R�I�C>9�%�W�����o�p���C5�)��J�E�0���z2�W�����5�[?v�M!ba�\�$xsJi��[�Sj�-$���t ��W��0��C��%�ޱͽ��NRM�H�YO0M�f�m�䝻�S�#q�`�%yzdC����Ӓ�O*4���Q�p�a%3�@�Kg͕��.7;�t��d���P	q��47-�,ؕɡ%���2�7����V!���6�N��L��H"�Q����U(��<pS��J�������lpqI�݊�	��5�2��v;$V�!pD(�{kS:��nq�]b��T�����n.ɬ;Ѵ���P3�H��/9�h�폖�`;�Fi�Րi
w��m+Ꮌ�HRN)s���/�[���X���G4��GdZS�Gκ�)����QӰ���uV���>b��갧���!$���1�*�
~Rq��uRM��H�(��z���9уC��O4�cU���s�^���c���H���4��X.����.D���=5�c^!�>��>r{6��{|��ִQ���\,�݆U)�Xb�ԛ�Vb��C���q��?>��*�B�ԁ�TTX��$K���T�r��+I��YL�ܵ9��8��DF
ָ����Ǥ��k%.0n��aE�dA�PM�EdX���|�@�m��	�Wo%W��w�"��#8�I0��Ά��?���K1�^��S5ꚲxY��ȧߕ�=����Jg��;�1�+�3
1�'@�B绊v${�
��j��0�!���Ŋ��0A�'j�rW1)XM�0#l����9�M�yP�[��Ҷ(�
3M�,��E���>��!=���'�=
�;Jl���-����Cca?H�>ߞr�`��"*k����R�#~�l�&��7o߿y��qq���	��嗯_��7Gd2VތI�2���Bd�������q��
����b���dN���0�x|�u�a&g���^�H��7�*�@��U��K�6f��ƾ��������O�O�1����Oɹ�/02ii��F�������{�3�t9fo�X2S�Z0v���{u�B����iq�AЕ��W*]�L0�
�x��;�|	'�r�3=W�Ӭ�q�d9$D��{O~�x
��F���hSͳo�_��Q.^Nˆ��9BR^]�
���I��$�j�|L�l�”�w��� �v~Q@�����Q)�����$Q-�V����������V���֊��9w�#'`�=�������uk"��Y�TFbeA]�P�$�@����᤻�l䀬����8�&\\J+�	_
�	
�Evݢ��I�=&o,��"ˡ3�tR�[�C��e&�⢙b��J��X���U"P�͊f�ͮ�G9(�ٗ,�рa�̠d���-�8q�X��
=��)/C�����8�I�X�'v%#@U+���Vj��y��p-���a���|����I���<��n��+��h%2;��	��RgV�9.%P�%�n�7뼬W8Uԛ��=s4ώp遨\��|��3١��6�m3�WX$�d\dXƹ�ļC-3A%�����3[�\���
��n5�14⊖��[b��5��8{!��Ҥ�9��3c{jQ���P�S�A���A	r�,�1��R�D��\V��c�E��b��i;7M�CQMq��>��$g��P���h�+�l�:��V��j?b�M�a��y=�T,Ԅz£��,%r=�^/��l�vW�rj6�k܊�5ٲ5�[�؜���<Ԩ��}#.<5P���
�̥P���w�ݶ�T���^�z��ؤt���m_�<
K�Hܳp�|���~�=Y4;B 6vkc�g�� �t��)ԗ>�4��
N5�=)�;S4�P=��}%�*ηD�0Ge�h�&S�2�E-�esC�QZ:��Bݐ߬��P,D��{S�X��d�QLu-)�` �S����,�qo�*Pu7N>�ɴ�l�dDSX_�H�;�Č}F.F{Q��l|
8ߙnT��ܑ�rĕp|?	�Σo�/��d�r]1��z�\�Ⲙ�[��4>Gd6&��F���~�|l9h��u	�]ahiAZ�?�9ʇ/�5ލ�
�-�kx�t�7���W �M�Q�p�6���N��$1Q@9R`�z���Z��-�&���
aeGG����]�\~<�Ll����]G�	�f���j��x]v���N`A	�.���q�80��c�L��͸@b����ێ˼�-���ÙC���ʮ�/+ר����A��c�x�A�Z�8�ј�_�����E�p��cXQp'����π��Բ]��\�"�"8��G�����S\�Y��>M(5�w��Ϟ-רI�s��m0�Q]c� 0
�ak[�氛�N�9��ǥїG��"\�xY�* ȃ��!!ibE����BΦ�RP�ΠI�=]�ő�2's���T���>�.����ݮi�e�I��:�P9��~���cJ��8��b8�%�榎�W%��<W�(8:�'	H��ɶ�e�gQ��<{Ipp�P\6��0,��L�M���3�絝�=�RI<"���Ζa��s�8�iǾB[,�]b��jv��	`'!I���h,�vǥj��ξU��sF��}�u�^�
�?����cܡ�v��၁ͤ<��
s%�J�SƔ%����P�l��Q���L����5]�9����_o��
"����
�Cj���|L��Y��u�r]_�v�!�ၫ),"&{�	����5U��H
��#ȃ(D�
3��ħ���2�\I�iLi�f���Oy��]�y��ڜ���T@�)�J'	F��c$uAl���\-[�ȝ�.[F��-ԁ��&�{V���'�	Po��_��ٌ^�a������\#U�[��f)��cת�YE�����.O+��j�:X3.��+ܥC�D 4�����wp���N��V�!�н�ࠞ�n=W=�${zJ��|��F���ϚNy6����(W#@ݩ0��!���
�J 2�B�F|w�PCrJ�q#�Z��'n��z&�c�?2���$9�7�UX��N����DemMxۡ�h��f��3V�ƵȨ�I�YSV�Q�)��ķI<`<щ��+j�y��YN�79Ox��U�N�ʳb���9Z�:i�bv�2���&V7��*�,;�u�T:$I�2F�q`��w�s�Y��G�����\f��.Y�&�C[���[�Z����L����f_w�Q��=��fM�`�.Ȳ`ʺR��V�q��s&�8;��Q��eǼ���D��bы��Ps(@���T�0�3��Z��6��g_�7�
�����5�*�1ç��>���_���3��{k[�8`���U��gO��W1�0��}��gϞ�`�3`�W���]���_m!`�e�<�'[��9z��7������M���)`�FF;\q0΍i�����=��2�)>����g��a�qF�@c�
�@0�����	�M[58@�@�H�Ǖ����ǁӈ����e�
h�{[o�m��]�Kt[4�A���\����\}=`R�}TW��5�{#�>�"[�Qth���ji�x��ݭ$KW�ƞBE(݈�r��Q!b/�)Q�J��-j4��P�f��}����N_
	�:{����#�����K־.8+|k�S,́�Yē�\;��ڀx�R�������m7ǐ.0<IaM��Rީ>��������n�WӨ��ƌ��3��)8�HEI�<)�2C��7Roz5���c��Eeﺌ^ۗ��
�G���٤�\�F��������7���n�jV�3}0�q�#KyTԯ�+�r��L�
�v���L�9L<�q��';���-p~^/j�I`���w$������x���)�ʡjuQ��'r<5�Un�1�U�o���I�>qPx=�D���A�-$g}�??���9x�o̱]wq-g�lc�}8�=#�����U�,'?����Ǒ\f)���k$]��&�M≝�� �i��v��iv�Y�fW^���`w��4�N�x��6�e"�g�q�]f��/��_���Ĉ$�x�У��i��4͌���6��b�iֺ��1T���I��S��X��՛��	r2���0�b,�����Ͳ� �1;9���,�6�ِB	�d��	�[;���Q�w%N9���3)�dz�z��yᢤh�%Ψ�8��!�=�G�z�X	�{�5 ȈJw	���Y�?��Ed�hZ��`ܴ仛q�
�KL��dWޢ5ș�`��{p߀�	V�[fa�
�'
|����ؓ�_�v�W�bKH�`9�2�۱���|�~�E
1I@mэ�
��f�f�9a|���Y��9EO�Y�W�z1k����~��6���X�ҳ}��B��
�p��o��
��Y��0�u�d��(H<��\0�0٦�\Jy���'�ht�-�A�{�T	5)"ؚ�1��Ƞ�0�9���ٻ�d6�N��(_�r>f3���i�h����9�TQL�}&8���쪶7׬��Y�M�	��|���I�D�K�RH�K
Z,H�4�G�-�R��qb��3�kݬb��+d�X�ե3ۙH�nO�0�E�hs�O��@9% G@�g?�nd����ۿ���_��^|��G�@4�����o��g@_�&�ܱ����>��',)�(���:C�M_�%�X�O3��l��u��+ȅ<�=��	�%h��(^�5�7�3�b�]
75O��Sw,�nݟ 5��"���N��B�~�����x+�G�}��6�(幂#e�xPlb��P���>�	2�/)Y̹�i����Q�h3����f�&d��T�ga`GƼ>�o�	mf�)0*�!3H�:�:����D�î�u�K����I��)%
�}0��4��H�E<��m/ǧNE���+��\�0ӭ�t^!a+��	�^.sz�~n��b��E��Sb��c�Y���<��/W�6�]��d�m��Z���"�,�N�z�L ����F��g��'���=%'��S��S�t�"�=���p�zl��$ܞ��1<y�|�2��7{�#���G��/�8��SdV�Ut�RoL,���b�7����b{�
�;���_�a0��|G:	
7�]��Ӏ$[.M$,ͬ��2O1��Y(��v�8S�h}f�h�(�icѪ�����Ԫ���a�� ��	�vgӡe�!��S�t��WR��ɘZ?U�ы��$)���w�q0`bs<M&��aN{����伫EP��T�p��ϲ���;��:x��q{�f_.����hOb1*J}��&N�閶�����F↊{5t��,lϼԀEm*+�
B��NP۟� ��4����~�dZ��B��p��cn���(9D�ٚi�����л½���ve2W��X��Ӿ�5/���k��Kg�m��'s���&���:��S�����p�A^
��0V�1D�C�j@m�'��<�
��Vs �y;�gL"�C���w(�L���o�+M"h�`�"\�;?s[?3{�#AR��w&gY ����G�����4$��s�vG�9ԕDO��<�5x���Ǫ���
y��|�
p�66
��P�WL�>��U���r�L��;b���㒚���藓9I�30x����f����رG�(�hn����1�}rG�"KZM��\-�jpW�Z�)[����ju���ԥ�����I��&�e��n��q״�x�д%�l#��Cis:NQ�N�J��mM��2p�sl3	F@��[1��<Aɤ4��̑���Rf�G�&]Nr� u��*�KבtA��'^��hF4����h�֜-�K&q;���p�&�9�Tѕ�|���Qzh�1dF,���o$�D
a ������2�T�k�Dm��!��qĉ��C��N��[�np��p�2�h���8<
iޤ��v��w�O�«x���Z"�K���V>z�[�:�DХ����L]y3SjV�u�t�_p��yp��G(T�ؑ���Wt�Bl��gx�w(w�+�t�]�У͌wEJC6Ha��:�P�b
���8
/�˱��P��
i���8�(����$�r�v��q̆��K��gw&����r�ƻ6�Ё�y�`?���>S�8�$ͥ����4$�UNN��O\�4�B�b�P�e��)<��G�=4��Z(�5f�_�|�����&�S��߾ݽh42AI(< 5Wt��);&
�#��r�9��V}��M	C-W����$�oo���
L��+i�"�Y�]��JE2�@c��`��]���>�wR��ny��w��@Tt��-31�<Š��{	�~�P.�O�q/�V�P|n�N�[������Db�]H�9ux�H��"ب��s[�����H-(v����ŦT�<��/<����-&�mM��4���F;]�P�/sG�
�Gu�򷑿7�:8>հL�;��y\xQ.ь��<�#��*g0����F�A�I�����­��U>w�	=���r@�
�}X�wP�0�9HW�T�k���:^�t��p'�}R�b$=e2a^�bQ�����X6 %��w��'i�E��Q�/��R�|�r/�wh�D�r/�tc�q	�35O�������Vݢ���+�� ���?�~����c�

�-�8x�L�C�"��x�h��T�3¬�%vo'�~*�{E�4���]n|�޺���?:�ۛ
��6�1g�@긺A���z�۰�{4×;(i5�k崂���l�<1�$�i����n��|�<{���G�A%�t�5u�L$\#�4t��^{�+��ǘ���N4{#�U�!;$��ە�n��2)p.xd*�~�WG����5�X���`K����\��ό�;4��O�01``�ː�D��Ņ��ܛ�0[�٘����>����mW�Q��ů>;��l3�8
���ya�v��[���f ����1P9;�A��F�ɗ�vб��$�H�M��\_���N�!5{"VG_A���r�Q����!��r;����g�rBKr1ʯ��R���t�GbA���E�݄]fS��R�J�ѣ���/Udz�i��"]��
�,�Y�<�$���~�2��<����^_��"�fƄ��}�
�(�UM~�D7Ȫ�h�59���4A:=�(�[;����<$	s�`�dפvg�/��S,�Lάl׿�l4@����&��1i3W����q�
�������#Nw�ƀK%O5$c����Cv���¶��!��Q���z5�zj�H���?��f<���.1)�t�]�mU�MlM�K2���� �}肳J�
r����|�a�\p��b�.�+�S�Zbg��'͓gr�c�Ao���22{�&��]��J�߾򔶥��5LEL�w�Ʒ�E�#[���PK�mW��v�}�bsetuptools/command/egg_info.py�<�{�6����@��G*��d�ۻ��|{�<Z_ۤ_���s�2EB���m�����H�v��D��`f0/0�L��MWץJ�z�I�<��ռ����ѳV����յ�b�u)�]N�4�2��v'`��ꪓU�&���Ѳ�74F�eQ���b��m'^���{���|	ɶ�[e�<7���4m��/�9���Ѝl�y�v렟�R֫#�1�w��Y�iYn���g~��V�Ojg,j��6m��Zٖ���Y]�@U���d�d�~��
�-U�К�ܯ�mZ^�[y�um������y�́��b�o���� =ܱ�^�\�޶��+���i�VIh�i�A��	�.�J7r����
�4��j~�B���,*	_T]���.�n&
����
��]=G�"�eZ��mUdu.�,6 ���%��zaւ�,L�{_ӧI��t����o�/�e�-E������(�Kѵi�Jث(�<ƙ��B<U�Sz*��Ǔ���P��DlӔ򽈟��~y���_q��o
H�H�{�$��Z��qҽ�"QT��r�-�V���B&$g
S��r	���e�I�l�X�����"-�V�̳ۢ��QA=	N�i���Q%��G�jq]��tQo;���'��I�A��j'��f![Q/=x�T��pX�8QtD���R��,`�W"B�E���_dk@&���L���2�!�lP0%,������Zt$cB��Z%HY�S͔��OХ��TY�H�A��v��E>�9Nj��H�:���e
��x.䎄u1O?=�n���K�D&����M���G��#���@��E�(q/��x��~�E�.E��]��)��Z%T���|����G��h�M���X��irwkIcI��
6�`82�c�6yym�Tr�dQ���i0����X}|�����LX�?h&�j+q�����k��ܮk���:�RV��K���yY��EW��
�IE�`�
M��l{&ǟ�oD�90_8"�#
{	P*��}bi��֋�2d(7#����@�;�Gwg?|����s����|wOw`��щ��zbУ�*0LȖ��t›뢁nE�<��K�q���r���[/	ُF�
�џƐz�\��k�_�u��bꬬj�K��z�P8D�P�跣����m�~=��9\�|�%}DW����6.~O����c�kg�Z#e=��Vm�mf�xn0��b�����M]�5�^_�.hIE��̰^���µ��J���:AR�.�@�洭�=D����<��5/���Y�1�
�z����qx�iؐ��X���0�;0$�G�0���{X�{K�<��jtORп���V�^��7�x��4
0����F�Yӂ
n7�vC]fbY�+u�~��WoϿ:�B�����~��W_��'��b�U��ܥ��b�*�Xi�c�.���~�玲Cw�xJ�nೕK���� ��7�NV�㦩f.���j%s���vI�t��s�g"�{�N��	�˙��$,:�:h���Ǘ�����#Y�3�I�X�ìgz�=�,U��C�h�dZ���w�T���0�@��d#M��$�hq���D���B��`[X8;`l/�e*d�K
�y�de�to{��(�˽�1��I��!���x�9�'Ӑpz#D�3a�;f��
c��;gf�z�`��h:^�$��i���*PP5@LzKG8fBs�D$�IBjaA�†�p�)�3101ݖ�)��ƚmJc�����t�`d9A�#"9"�Y��.m�d��?=y��'�ӧS�͆3���ie�=����� H�>��Dw@�j��s�(����m.],/�/�xm�5�+i�r�_1�6�7�@��vz;��p�D���}���Ln�q�7d����F��5��k�7�}��ײ�;0^��t��t���$IH����0W�2�g.;�P��^�G)	&Lm��8S2bE�JU�%D}N
)�c��)C
7��ذ+�M̴�c��!ޛF�Jo�%c���mo�A�'["�"�
n]��b�vg�+I���M៮厢ꔘ�n@6UWd�n����M]��Eѵ)��VR���Bɟ���=��*')��FH2^d]�k�G`H��d�	��|[o�5P�	�d]Ï����ׯ����o^�x~�d�mm�1x�ָ(�/�/��$�cö�_X�{f>��DB��#؝`�ĭ�#I�/
f�Y�m�	άg{�`�WfA�K5��-V#�\�X�b��œ�WC/j#�z��teb:gX+af[J�:B�,����Qܝ�֪�Ͷ�C�CxN�е� G�0��q��#�S�Զ�@��ü�}2�
����XM(,��$_�ڰ��ƣ�!���BLP�!�l@��t�d�}&��}��E�R`�V�JΘ{�����F�P⼢ܓ�q�
&�.�ܚ���X� Վ`�\��>���^�;iMm��"�+GJq�6˃�C_�X�����x&�J`C�#�<�R��(�F�M��E+S���'�ӈ�%:�ɏ�z�N���2	���h7����Sw�脎V<�F���2��.H<u�l��z#�
F\���K<�;ȩW}`�잒c1�'x��;�W�e�c�|�T�F@�s�>_��߲iӠ��b�Og��kD:�|������g��6�jݡ���G:��^�Ra��jxa�5��l �X�I�Sl�70�:sbcF<)��Gw���Nd~C�K���D�g�'`�1
�IA&^��4�~�Ih	\ʆ]l��Y^��m[t`��y.Kp�h�i��vM)��		��xf��hߝ�!�+�u���2#�P[0x���4��ڑ LzѸ:���HA��s��I�NY��b�	���U2� QJywu�+���ygR$f?�����r	bث$�Å*+:�)O�Ƃ�V���ۡ�|���,H����@�ŽE'��f��ć�1���B-�5���yأk��wjr��m�P|L0{�.F��*����X*�Y�*Bu��,�U���`Z�1�Q�xX;CXO9�M��$��a2���AFi��1�	�����+�yW�x0��VS�.�N�
rF����
g#؂�a�TN�A����|vŞI'�D'{*hM���K2���"�c�8�'9I���rēm�<�t�`f3���a�>+�h�Y9�Kt��|�j��}��<ˑ�ô�n�h���{0���F�2�&cĺ�5�ǀV�D�=���\�ƍ�x?5�p����h�:�qXN+C���d�q*�Yƒƒx�:�b��b��*
T�l5�v�3���0��h�����м�^,E��"@w�z��砊�"�3sJ���BamEMXѥD����q9%ԗbXU��[�'���	�qUNG4�+��#���s��b?��
�s�b��E�y�ݷ�^��Ń[,��H�]�7
6�k�Tgś
���Бl�)n��bt6�퇻fFO�a[�h	4�%+_�G;�P�=�	6� �����D<��)����N8��#H���ժ��[�XE�(���0��t����m�^C��"�r��\B�4;�č,�f���ư��)%�e�3���T�]������
X�gx@� �<�
ٓ��?<c�Ѡn(b*4%P�V��=�1e��-�լ�x�
1ْ�)�>4�Iۢ�*�g��_�x��R�Z����W��m�rĺN�9��#���TW�X��|�	���#X����ނ�רO�����7i���ף�R����m�s�������viZŃ
!W����'w#�u+%��i��o�'��Q���_pLXK!��.��s,f�؝ǟM���z�����mĉ�ˀYĦ^�38P��wD�D�=E�N��?��N�k�	+��$ȿ����!x=d|ع[��o�3�-]����P�`;֢Ct�7��z,>�Y���Zp'-%�KС�eIE_�\��.~Ot`z
Z�춮��K��cM��ˆ�p!6x"ڦ�N��,C0�'>L�P��f���H��-�o�]�^(����F8�:~�c�$�+_�7/Ƕ�M��ci6���S�p��c��d���Á#c�Y�
����YʗrGg!c�(��FD�T�q0�P7`,���K�3�H}�&��8�`m����^8����D���;	�W�m3�zz %t�Y?]=��vT��1a�@ON�|��'�Du�!��xR�IKA�N'0PU~h�5��o�`]�P��<�ެ�?kќ��0(�#'kE•��M�h1ҖJ�b�6��4>�t"�M8������X1��\.��y�UpPA`D��@"$��)��\D��r:2�zU{<���^�FJ����'J���b�Hz�Y?o&��pk[��o8�W��x}{�0��!T��U8�0�,زd��l� 
y�o�-e����j%{�F���Ga]fju\�H�6�V�J�P�3'�0�l�t�\�#�HބQ%a���\�~��ŋC�F�p��e�V�}���Z0��ÝHw��1�^,��8]
��g��$
�&^N/�����<&p�2D,:3Mv-�VZˋ�Z���ܯ3�C�8�v�v����h�k�Iэ�n?����"��I4�Eq<��ܖ�YY��!|�V��ݬv����@�T��Q1�v�Oc#(�[H5�F����E��p���]�b^���5��(�VbXI�z���5!���R��Rl!���8�/��/��|��9����@/SqH��S7�ep}��˱e��^g�������
Qc5\���+���1��2`�H��
�3��C	�o׌)���p�{(?_t/�Y�3d��g~/C1U����Y?�Mw"z�F|'�e�^C���?��[5P5Xh�\��<�t%tM���+1!1�X��
���M�:�"��]�NlS�&�6�B�$f6#}�I�v�P�qv�2ͤ3tuU��^C�7��[��:��{�F�7�����{'�;�;�0�湺  �ÑZ]��jf#�u���Vu�Ş�v$	�k�1XgYg\���x�'�R�gl��������ʶ����x�.@oa�|]4
P`��omw�Q�V��:���v��j��]m^��@�s-�ޓ������X����F����x5����o�^-
�wM�X�30{h�;Wx�_#C��RPU�!TQ��-�[~:�6<P�e[͸����U�1_����>�d�!'1��u[t2"n��*��ek$��J^��I����h��U���bfo�3ٴT	�%O�Ǿc���1#����ÚZ-���Dt�P���y�g�upC9�v���5�w�p�?�[�Y�l#�7h����s����+.�jW��x{�9��	���|��pŖ�ӓ,E�ڕ``~�O�V\zƹ@���]�<�$����U��1��R�=��p���@M�`:�<j��>�<&�n�7j�#��6�b0KH5�
��q��p���3�eӬ_h��0�2<����w~�L�����*[,�)ȱ�'�-������e�_շ�=QB��kf��5�zƚ_�	��r��N�c{o�V�gLy��t>���-8t�e�KܗD΄���
O�a.�{�;Yf��4���=!����z4�'1�?��A�P��:�U�T�cs/�WuW�)�qBd2O�qD����ѭ�qP;�k=y����1�͂�8	��)�Pm�ʇ=��R��}�~��y~���Y<����'(���g�{.E�Sߓv
��%�eˋ&�Л��Gzw.���v,G"jτ��Gc�/`�D��a�n��W��͓��Lp��#�y��W!�Yc�����.�;vNd1,�`ԓ>�"�5����)~WPR�6B�U���z
/.��Pi龎Κ	W��O�>	4*xތaR�1�aџ~����:g���Qo�Pc[����9�Fp.�E�w�ֳ���?�6F'}��h���Dt���m4��}��g߿��]�n��n֍�����|�t�_�s��2p���(X��&kc��	]4Z�ݨ�΃���H��/�
gt_���P�y :���&=Pt��v"��wՄs@S����v�KiB3�>=v�׼s�Ndh���㠼�:r�¯���.&S�"�<��XA�����7�?Qݮ�]�~G�{g-k�}Iڊ�7f$�<]PY?v�`P
��>j�A!�Q�vlS,�Ή�&[��
?x�՛m	����2ו���u;3�a�V��HR�"N�y�v`��@�]T�C��!F.��*T���\+��0tuN�1Yv����U��h(����N4��u����x��=�Rj�\��.Ҝ�Uc���x��M�5ғ>�����OE�'�ot�%���عO�>I��wAy��;]?��6����*P滹�$�F;�W���L1��5>R���������Z�=�˭16SU�t�s�gm�j�4�S!no�&�c�pX�q�
s�'֍�2��?�B}20nc=Q����篵#_�$�9d
8r�}�_�"5u��/�H��2���9��-/~��.�����z��v9�e�_�?�}��
H��K��$�†�=���U$�b�Ù2P�ޤꮅQ�_���nJ�j@J�����U$��c ����t����Q
����_Z��CO��N���_4j��mH���D��O��Z	�+�g:��Х=�A�A�;���)�$?�}x]�7��� �`��ϑ2K�{��s.�;o�i�=��W+�M;[�@����/�w� ���q/��U9��`F
�S����z�J�Mq8wDw
B9%���:Z�A�ޠr��s�4�������'|I����kd �-��
��'�0R�>$R+:^�G#�UNJn+��'!�[��������,���𖿻�0�4�`�pTCѿx�1'�G� Zb4d�S�}����/�W��0�~�����V�4&_8X�Q��o~�]��3/V+|�n�V�ݹ�{�E��M)J{D��Ӄ���Z&�־���p�z�X���6~�<}���Dߥ0��/�j���D�E����Ğ,�%O|�^�[bCT�No���� %4|�F;L�Лh:-��F&�?PK�mW�vQ1�*setuptools/command/install.py�XMo�6��W��v�]�iO1`�;@z(��ES����]6��T6�_�7�(��:	�-��7Ù7tet�Ji]�dm3a�6�ɦ�Ʊ����ZI��l+
^�އ�7J��
�m�]�M�']�n��`��5�i#I�i��Z�um�䊽6R�4S]Ӟ���Ŗ��5��̈Z
�*掂����2��eV���L:S��)c���ε���� ݱۓI7��7��im'���/n�����$I��[ˆ��|qs�0��V�?�`���ӌ�0���;~�ɧ�R�B�B8$�Yar�:��]X�Ek�ؽ��u��r?�:w��k��yZA��s�;��!�W��v&o�Z��c���0
:ϻ�`�[�d�3�g�DN���K����
I�8lP����}��S^.��ԑ?�(3�8�II�ܧ�9�F4+
�7����uu�0���lad��G���sU@e)�����P�
̑N�Z�'�ք��jC.f��C�ϐI����5�@Tʌ����]=3X+[�W���A^�ܔv��w�7�j!L��>>�<(����NB��Q�:w2i���aU>gJ<�7���J�%�Ajt|%�E�_����q��z+���v��4��3J�V�)��U����(�YHЏ��x�&֏6z��;�t�h�:�ݮ���Ԟ�B�D��C�X]�U�>^����p~���2\��!_�+&>��,�`�0
�VP'�����]��A��d��6�"0��0*����R䊽:(m��r@ orEe��;����ST���y<��
;�-�΅�0}���E��|"�zkKi����6����%8وѓ}7gT�;C�p����XV���Ga�X�0�"5��U����$ʼ�ܕ��������Uc�z�Y2�MG����M�k��9+���Y����aY�V\�F��]?�'�oN�U�1~�	=�?��h4ۄ�r���H)<B�
�,ܠ�Y֣2B�;
���8L�����
$��v������4M$M��*e�)
�4���9�˵t�z7B��tg^d"W硫��y�"�F��f�A�u#GwM6GvnQ@
�'�R�
��[5�ftGlP��􌦞B�tGN�>C@c�E��S����)��˚ri�x�k�����%��1�>�{ZU��y�=�4�~��\��[2�5��*,gq_��!�n�eX�*����R��
�v���h�گ����`�K_a-�)���n�4�voo_�A��+��<�?��m�&�)X��*i()�P������!f��B��ϧ�lc4/M�׽�f���u���Y���T �u��t)�s��M�8I<7,�%]���˪N//�{9ZR�ZԴ�]��2�F"Š�N��N�2�

�k���;GQ1{����2�w㜂w?8�ͦ���<S�	e;#�0���1�IxO+�,���f��Z���(LgnϾ�S��R�l�;�H�5b�CW��:8L�~�J�s�E������>_�o��ێB�1pe)>d��jML���:�&�t3�~爫�t<��p��}<�z�O$N�r$Z۹����.=��:��6�{o������a��?L��b��jj�¸���Ok�I�
��?�w?�)/�kڝ/����'t�ק䊽}�����}�=G�	K
�
��p�����6�3}V%aX��~~'�3�R�fA�+Y$�s����"r�3�`�<Z�4�w'��PK�mW\Ҩ�+�&setuptools/command/install_egg_info.py�VMo�0��+,�PYrO�Sz饇Vꥪ��]���$����mv��V�~���yHeM+J��w�A���X'S��js^
�E�AP1���3f�?����|k[�����I[���fx�	{Χ�9}w�shz�<AP4)�F'�&��Ε�L���>�{`�Y`�z�0����"���r�P8c/�2V�"k��`�,�:��O�YF���f�@"�1,�GS5�x�R���|��ҟa��?gem*�d����#4�T5?���gFĔ��ѰRTJ��������JC� g�y��Q�D��!$��ݾ&�B*/ڒ��k�>�,�b�l�׸�D`?P���ުc��cO)�F:��i��9�x/`����d�ʼn� �����$h��0夥*	e0�;e����y�R`⇛�u�̵q���n�r�Ѭ'Z)U��PHi�Ą�_
m��(}�0��	�c%�����l�4x�%'QO���1C�����N�a~C�;�)��,/^Ƅn�WV�t-Bjߖo{\�V���h�-���o�z�������`�L���y�c(�JƬ�m�����8Ym��k2��.��՞�ָY�>�N��a�3��\*�i<��txVmd6[�#p��;�T�+H��?F;k�e+���2�t�NDD	�B6��;:)����I+���Rŵ�e�1���h����ьn$��̘vP�JS��@�u4�iR�~����C�x57�v$<��Y��ʝbMq�b6��D���MۆA尩���:��'��_���c_���K�ҝ�FBZ�u����iӹ�I�PK�mW,��,#!setuptools/command/install_lib.py�W[o�6~�� �[EX�X 逵���b�-�\(R ����9ԍ��t��"�;W����1m7b�e{���n�p`��Ҳ�5��J�1�ix;qTº�	i�R7
WU.�HYH�g�2m�a�ٔ�[�ܥt��m>��V�c���l���Ւ,s���x(�fJ�믽;j��-�n��
jf:�Z��(�z���U��u�<3��G�
Q/D¢V�>k�\z��'�����e%��N���W=�o�h0¶�U�%;	w��
���Q^:��[\<�+�[);�hϽ%4����b��JG�Ut�V���m�;z�0���*
�6�
u�P<�!��fB����T#�|�~�2�~��'���
��!z'��xL�z�
����� j}DjKILj��ga[(ɦ1�Ӑ9���%��,�-"̀�����|#�d����� �+Bϟ�Wˢ����@�-gT=�����#�SqrG�&�lBI�9�[`u'���ж�8���!��.M�d�޲����s��ͽ��jx��0{�� ��N�
`�آ@v����1�},
��Y�$�������}�.26��?�Nj
OG,d6Y��^����j�{m�J�R
���.�j�$Q\#��O�|�X��\�)��c����=���T�_R�i]�4f�9	�����×w�rZ%X�MO�q�\�”^�x�D9"�]b}��ں@��e-�6�{�8�H|�֡�@�r:���5	��K��AC�g*
D#)t6_ˉ�=����y�,�j�H�N��2Y��>C�L�����٬{Տ� ��2@f�_(ŋ-����ñ�Ծ@��KJ����R1%/�� �{)�Ƒ=
�i3��{>� �1�ՙ�P�E����2y�R�c��Ι�0l �bIh@9_9��R�,"��k�ƽ3b@�h�RԟfSlɨ1�������޲䒃��~�N���Un��e����m_8�5�C�j�t�[R��,�g(0�p{�-N`&E'�o�PO���I����
��M�JH�m-�(�+���TX�>�[��H�������E��W��hȪ�X��o�jb��j%�V�����t��vȹ��~���!�)�L��Nm��y���ȥ>,�U=l��m�ZSf��9Ã��!��ѣ��'nT��m�-3�Y���-f�n��d�Y��c���&�%0B:�R��Ty}���8�ɵ��:�$%��	���-�X�0���E�y@��RBlW�)��a�`��Ԝ�st��K#�kU�P��QS�';�e(�%'�+�@��PK�mW�}���!
%setuptools/command/install_scripts.py�VK��6��WL�SU�m�{��C�9�-�dv%R �u�_��AQ�N�As8�|�vct��nt�� �A�n���ʊJ��Pu!�u��J[98‚6�M��@c�Y��/�;���ń���^m2�Omi���T�y"�r�*�:Q'r@eG�e-
VN�k�$U',��t3��1��i��AiӋ&Ѣ��Ѝ䫺�m)U��b�0��_Z�N<L�
�I'E'��R��f�f6ğ�x��V-�U(]���Yt�M3���%���i��"
{-g�B�Il���q�.>���l�w�&)��G p�ӕ,�[f�4ց�L�aףkd�v�C�8F��QP~�����W��j�kz�|�� �rK>IFl
r�M�o(�F���,��&��`��l��E�im+;�M�̢<	�q�g/���t�o�)��ϟ�X�U!�<��;w8������2�Ī�=��p�db��N�:<��V)!q�N���G��P#Qf7���`���e�R��
��-q��B�٣o(?��W����m�S�.������=%������l�7�ǰQP�����|t�F���KU닽ehx�s���wΣ���
�a�j���WO�"TZ9A�A�DE�3s'��4},�^:��P�v�G������y�5�>3C�,�V=u���O���e!�S�Ͳ��J;�]�V��/��IH�F��Y�`q��Uƅ���B��F���7�8wV��u�a�GB~���k�pN�ms�u���Ksx/[ZrXo����EAn�@|K����X^x�����f�mT��
1�!f���&)��(xte��F��첏��;���aZ6��
r�i[p��Ј��#�ݲ]VK�˞&̄x��>��ɢ=����Js�����?���Q�.��Y�CzI����é\�%�{i�i�Y|��"�www��PK��VS]�)B7t(setuptools/command/launcher manifest.xml��OK1��1 �!]kAJ��҃B���1;��g�ɮ�ooR��R*&�\ޛ��K���������
g��[��AL8� ]%�wP����A.�����E����覤V`%	�z�u�۩$;�F�Y�t
^��׾ڢt菈����j�+ �8G��Th1R�M��9��Qpy��k:�
}U_ڍoy������=+`�i�V2DPF�ZL���F�QGC&�����p��g`�m4�xyD��V1P��Pw��<��Wu��e�#t`�Ig�%-\�?9k�\�4^KC�|_)��a�c��~�_����oPK�mW���3|R setuptools/command/py36compat.py�X[��4}�0�VM�x@Z4#V����J�x@(r�5��vf��z�g'ν�%m����s��eʬr���X������4���01}��*���I��i�K��ˬ�ZY�Vi����eI&r^ּ_1\��}��w�d�V�2���J�p��A*�Ƀ,���S��ej�*�{�
֤�t��=L�엋=���x�V?*V*�D&-�'2�����yK�k**�*VW�b��I�N8Y��(� �=�ϥ��g{�����|�L}p��7X��KdD��<;
�C�1^NJc�,�!+	ӯ6t��c�~����'�]l_�`�����Za���x�l�j-Z^�*��
�y*�LfR-+;���t�.���?�LsjYdIu�-l��QC�4~����� �Q�N�&�<��9���/C>q�\KazRX8ܞ�,ʔ0���mz��Bh�U��\C��Y4wH;���`�,�AZ���
��>��A���ʇi܏�p��d�����W$��v�`������uLwh�q��: Mpoi ���Z����B�%�q�*&�
��_��F�

+�#$s�D����D��
�����&��$�\�]��J��:�u�~∎Yo|T��IR�D]��ˑ�
;�'�����F�4���g��/��8⨋Z�V鮎�x���'��{�.�K~�]�B9���ݦ�Ұ�������.�Ĩ���6����}��iy�)Ubz	Y�W��zW�Jd+k�2D"�i5Q^�
@!Fg�H���#/'+Ge��YMm��/��i��%���_�^s�j����
-x/�z&R�z��F9U� �h����mt�{fN�.2�h_T���Ec��ݳm�7:XDS)���Ō��Ӽ���oߙmGš�c$x!B�eC���a;�߹��F?|�B��k��������\���n:�!#⇌��
�HܢoM�y�a�B-�6�	0d��C0=T�h�6V�SN�=��z�@�1�_�%�4m[�v��i�Ҙܘ�4�+��&�8\��4&G�؛e�U��Rۿ���sC�6,�Y�n&� ��	h�[&�4�a$=Qwu����M�-�fA�(ި�ZE�=ͩٔlԕ�`N+e�z�9h~-����6�}�!kꮴ������%�e��D2@���kê�7tη2�~�6��7(V�]nF�g5/��n0��@'ً��oʳ[�h8Izg�.�ވ����/��)]���o7��K�(l�إ����
 p�J~/W��C��ĭ>9���)�MN�v��%n�/@��^��|jor����Y�~>��
�<�}�W��}b�Xݷ���������G�,3|?sY8L]��}�.�iERK�O��+W�PK�mWv���setuptools/command/register.pym�AN�0E�9��U+F�+4H�fTq�к��&������	�;��;�<.�%�9��8�L��ӣgz�ކ�0NRC���MJ��0/1�Md&>`z����[~.=�T?۔�U�A�[Z�gb�<��$ �!�h�w;�Xp]�/Fn�M6���*�<�>M��q�&������,����9?��?]�ba�3���h�"��sLm��5:C<5���]R�#-6�
���c��]w�Z�Bǧ�f����ub�w�DR�/PK�mW�!��Psetuptools/command/rotate.py�UMo�0��W
K��P �u�u�]� Pl��jK�$�K�(9�Z��_$�'����R9�{�8����X�ѿ�S'�%�V~�Kc�,�5vrx��2�k0&7�q㓻�d�r��3g�b�V�2I���΁5^zd��1Zi�>a��4%��Ȫs�:2&ѫDWX����݈^;�kx���<T�A�F�ޡ=���?�ŲV���r�Z���<�����hf�W�,�<�"0�ߕ���2����+�^�"��I���	�#�K�}{��L5�լ�T�1�C���|�zY�ql_J+�d��pt`��6��«��óѸ�
'�m�茆)e���j�S�>�òR9ܔ#[�E)}�iܮ�BUW (0ZC`E���a'-I�䷙NSN��Z@&�T��L`]g|���j���h)k��t�iOp�^���(���>��;?d�c�
�(�v�
L�R�DX�M9���PNi�.��#΁D�7���;܍ay��N�M�1N�?�Y/���Y�g|s\+�ΩS�I�Jc9)3;y��6t�y���3糬m�7�}?���R�I��,��T7�<��9�͡�A����
]��QSmZ��8|��SFכ�
b��>�gƉ�\�Ө��i��c0��)��^Qފ�P
�	'��z����g��"��Q��H,��҇2z2����94�Y��3�M��~����?��;󱌱��;Y�t��k�P�;W��۰�D*�ǻ9��T���*�������C�7�q�>%�u��K�PK�mW��4F�setuptools/command/saveopts.pye�Mn�0���¥��r�9E�U�2!����0UU��u2�a4Y!���9:x��D�
��[+��s�/�.>DP�Qz�q����x����F���:5�f;T����w�B!�t�0��bU��"0��u��bPM�߲�^�|�T���n�i�kH]��2Rdx���;�eM�]��n&��U{Y�(i'@�[Xc�5ܕ����N[<��A���Q�x�ɻS�Y�_�V�n���#:�N
�U�v75�X��ذ��Ǩ,5��x6Ɉd�.�����Yy�%=�V�&�;N��࡟���=<���>-�	���Օ=���W�V�PK�mW�HnYsetuptools/command/sdist.py�Xmo���_�:XHBa�A��)��z���"ɶ����h�gIH*��p��3C�P�|W�@`����g��kU�B�ZY&�Fi�JuXu?�gi����Ej�qÔ��2�/s~J��Umū-�n�ڣʴ9߼�
��R����
��miͪgoN�L�Z�8�	��9��d����j�/O�����數���Ê�g�^�u�xY��,�am]̀A�j2U��~�4
��ԈTZ�3��Q��&���mc��X��l/Q��5�Ҁ�By�IKŋ8����s��,��Kn�Q<Ԇr�23��P�>��!�h�a�>ۣ�̴
FWlw^��U��g�m�1����[sm؝��f4�="�]Ȩ��ܵ(��TM�F4\s4����'�$Ds
�7 ?:E�x|>B��q�Z���r-�E_��;�Q>*��jQ�5�݊��Z8�U�̬bMkɄ%�: 3��D|�r������K-��v���3�LG�^��}��rM��Qz�j
�I�� B
i9L�|��9�yr�S��>����q�ۏ���Ͷ�~��=|����*BsRm,}�W�]ѓǃ��b�������(u��$�[_-}�&q�"t[�F�{����γ��H���*J"!��*�
�>�=�K��(~���1tX���'�t)o�I%��3q��� =|�z����,	T�G�#�q�?~��}[C��Xg�� hȨ ���@�h��f��%x:���'����[E��0���Jn��4�>6�@U��)�O���#��\p�A�6��r�?�K&dr�(kEU5��J��ߧ9������ʥ԰
GO/f�U��'h��S8�b�.�Щ������j��P�ݤ�Ӂb�=}���P��@o6���� k�wA}h���ʼ��d[�4>����~<��_J�:������t/���iQ)&���>���e�!�ҿ�Q�WbV��q�I���� �˺}c��!үM�x`t���q�ȏI�@l4I�?nw�S��e+��6�d5��왗^�)�-"�C3�$���O�S���1�5��[��.pQ�@cw#֖	�?�-
�颧�1N��~��U�|��
���l����¥��#j΍V?�*�ZU����S`�s�ކ:x�_ �4��[~�����6=r��j�U�h�!l�]+�t��L�ɢ�W<�JGO{Z7uh�r�'��y�َ���i/3��!�f��B_n_��9rdet�bux�a�C�9�Rc��=⺀.�Չ�m����-[?�:/�Bd
�O�d�#�a��R�:i40�0�h�Ϲ���]ҷ�̫��dH���$�Ў���(ܴuQ�x@X���\��)����9��0���t8L2�tO���	
���![�=
��ž
��Eh����	�6V����Fl�Ц���p]�k��q�pY��X�68��y�ڳ~�[�6,a��>��.nv�d��� J#��\��a:�ׅ[	q2P5}`�Z�Z9�T��2����]A\�xnLk$	v-J-��U���
(,�p������Jpf�m����2�^uwv��!�MNL��E¸x��L�bT��k���M���`�&��iE�Af���hwq��u��3���@,���h�N�]\#!�B^�ҭ�ȲWP�����/�ݪ��S�L�����A=��a�z�3�yL
$)�7�ؓC(,rg�4ivp��w"�e�zνS�Ƅ�e���L�!�S���z�(vkg�0�`�.e΀ť�}��t�۴DK�*�J��Pz�5��LE�%��3��[x�"j��{������k��w����O��jxE	9R���#�����TԹ*D�O}T=�|aK���TA=�S#�Ӌ�h�tW�~�\��e�,1!�dA�lz
��*���n���;�#{q�!�Sq��?\N��GoL�ްi��0�RZ'�N�[{�����U���Pa_?_�9eB����7�q6��5W5������`��&��Z"�'�\y}���{��+H#�^��kfN�i �k��t'3)蒬[�.5^Ϻ�4T��ڡ���)n��ˇ���`�����rf㳹w�v-�)�~�	K�Rl�PK�mW.
n���setuptools/command/setopt.py�XKo�8��WI��b��@�v�����!dZ�ln�)������DZJ��r$�|�̓�Q*�5��r^��7}'Rt�C��ᴪ9+Rwǫ��	�	'��x�~�ŕYs:�E��?�TH&Vڂd��]7�5
m��*�i]�9ّ�Xk��Y�!1+���w��)��J�
��&�_�V%����|�m��ꮠu�ެ\Q��2�A��6�t�zv�l�Rِc���gb;�#���h`O�Q�8��27$���P;��/��ݎ�J'��)�*��>+�c<S��s�Nf��쟎��[�ˮ�\��ɔ�\,�S��֙�+�@�<�e7@���
*
��1���8�1
q�[�؃B&~�&��ֲ��"�Fk��$(���E둩Ҝ|��bH�p�K�����QeI�C'W�m]W^&�r6X�o�P2���blw��Z���>���jFA�tU呡#�-�ddoa����3��K^��/�ęD���Py�=y��/��Jr�(�Bo�w�)-��3Bn��H�h+�T�j60�#X;p��Q�(��	��jȍt�@�oq��hA�X���J��)�[���9Ns6JO	f�&��0���%]�ZBNm�t�@ӐP�~��>��{���zN&�Lw�Ǫ
hմ9��<ސ�ID����Z��ʠ�H4��H�pe|`�L�i�sr�`@n�]����=�ɽ[�{�ag7�ܵM��XnD�;	2(��>�ka�+��3�P�*G��JQ��!iH����hӲ|������T8��us�7#���?��xM�Y�l-��<�qU$S5�aq�1�0�첞�R�g���Y��Q�ޗ=�����/y�l�5�a߅�2���'�H,T���d����B��Τ�LW�
�\�-��;ky&�樚"r��	PY�l�9N	�½���3�`I�GcQS)�7�%f����ۃ-�ԅe�pw��I���0x��莬�K��
��ܶE��Ĝ��i@���9�􁹆
�ÃM�홗�Їs����z����(���p,���`��|��U��<52I`$�c=��|�Z�{�L�p�.�l��MG�BEњ�k�
6���:>f��H`�g(���̺��͢cP�Y�VQ�ysfa=;͌�����h��3Hϕ���X�s�ù�[t~��p���k��8�W{]A��g�S����O�yK�~��[�����m}Q�Le���`�`%]��
�ä`���`L��5��ϸ�Mc�ּ
�7ջ׶���Bp�v"��/#o&<�5q�����|�@/v6CDu�B��$��~]E�W����lCQx�UG���x�3��.֪��>yQT��z$��X���U�'o�3"�}~�]��׫oɝ��>�c>%����R��l��K�\qiՄ�]�g�,;�+��g����/N����po��
���ٶsS<,T�F��i�
F��[��Sdaڹ��=ؽ� _g-��
�����kZ@'�������oڷ�ܲμ�|PK�mW$����	�setuptools/command/test.py�]��6�ݿ�� ��8����|Hڴ�mls8�B�%�ˬ,������̐�(J����V&9���<6J�L��to�мU��m��V��V|m+��Wd+t�T5�jٶ´��VGVJ�v��L&�V�0w�m��#.����V��V=h�v�����(^
����C��Q�.������y�K���U���]��>�J�W�
o��ڣ��>�F�vA�x��V�G��C��2�E+Oy��D-�����Ǐu����]j��]C��)�A��.��"t����6��:	m��W�UQqc�o�k`�
,e��E�س<� �<O���n������pe�I��d�6IW�
���	X�U�]%���ǚ�����{U��(�n�q]3�Lș�3^U��P4)�5\,k��v�'Q;ԫ׻=m�e&
�lx�p=�p����AIJ�.��瀫f�?��%j�W9�����5�
8e'K4�"ҖG�)�ZEk�!�%1���E=�(9kr�e���I,�t��Æm�KoQ���dO)6��� )гNz�G�Ģt��^��0���99r����l/���_��5?�<4!��1d@�y��}g�9NIɄ�/��n�Q�R��S��,�bx"���˿��0�ʈe�@^��|�p�_}2X���."�L*��#˺��Ǹ,xbx��d�+0�J�	����W�B()����ҝNΩvptn��c�X���� �԰�-�4UWgx�������)�9_���(\�5�r+��~�[�Ѯ�]DV/�qP�A��>�W\�῕?0��B��܈0,�Xac(n\�ja��N:RJ1q��]��-`8�]M��E&��TN���x!خ�U���1b
-���oeI)-
�[�:,�:W��"�I#����61��#<�[��vrRxL����KP�=���Dd'A��	�*���)bMI���YSKDvȀ*�Ii4"�)�����R!�42����"j�ѓ7������UX9��G"@��dD�CH��_Q����Hu��{Y/��[rH#]H��ď怶���ؑ������P�+W�`b-T�-۩�>�:
����B8�ҫ4.z���X��.k�V����Z��	�r���'������)_0'��g䯝Gړ`��/wF^5^�8E'n�Uv�|���'.,�I�ɁA�:���A\f��b4�?��|<�z�|~0����Og�aG�m�����sÒ���?�B�,��,��g�ŝ
��A�|�v�`#9K����W,�rH�_D��@:�A�d�Y���6+���Y<r]BMs���l�T,����r��4.��@S�z��̽��Bã/3'��J��ř�.��`u���$��5���3�=�WlWkC��O�&�%�%�f�Z�i!�ͫ�

#�G��yq,�`��M��2꩏<@�H52^|���M���Оp�@��9�)}�j���>7$��I�AbO��Q��
�6�n=�6=��,ƶ}z��"��qWr���3s����j$�s��<71{�|�/X3o���g�Akl��I$[�ǻ�ք�xX%W��=��{�ΎJ���\��~ה(�
�I��+
�sY0X~��.ȅ�.ğ7eISY��*[��.�^�(�?�����?���3�IjUE��N\K���m����B
�]
h���`�A��Lj��a)�F�x�%
Wx�д�
��NE����B���s�F���R<�)-������x�"��4��� �?�"��k�/��EA�M�E�:	�vN�S�jU�g�q�42	&�5�Z��Z�j�,L�w���1�;��׍B�@�����b_�����Y��@
�j����+l�\r_�
�rU�l���c���؏�'���<uw���XE���iO��|���>�(�mp/���9�E��{���K���e �yrd߬���v��Ćh뙢�>Q�i6�{X�F����pM�8�df��[7��q�`��<l_�x4����I{V�sp�ߚ$�&��ʒ�Fz噘�����w�uCsvc'�mdt
:�8� �)������ͥ
����iSn�
5�a�R��H������ D&�#k�+Z������y�w��P���_�iA��U_�h:ɨ�!Cֽ���Zۃ*͚�+�n6����b��f;�ZN���g��Aa�y�M�b����%��X�MaMd|P��zL�pئ�
;�&�?�e�A���W��j-Nס�F2�Ta�@<�d\a���w����l��x��h���+�*����Ybc���:�"�h���O�зvv�Z}����'���z!��Ƙx���Gn~�
,��]��Ηb�����0[[{(�X+��ɽ~���p�t�Λ^7�$}aX��{]B�|��8��.�B(��.�s�B���U��˚�(�����6��.8�b�:/�]��دM�=���
��Q7��$���@,�](9�91$)��PK�mW"]K��setuptools/command/upload.pym�Mn� ����bE��GꪚJ]�(�hp2�#~Z�d�v��2���gY�&����XO!�L*r k��{G�3)
*3��;b�>�v�����ꗍq�5��0��$Q1r���A9��W
ü@��!�>֫�SMk�\�d�e�H�!;q�zl���q_��7܁�v������9>�ɐ���?��	�q1a)�[J>vm�o$����*n~%
;�jR*�(�?����b�{�� �\s(�2��?�)��a?PK�mWm�� 	2!setuptools/command/upload_docs.py�io�F��~�@�A����I.l����I�h�kˆIS�vfGY��� ��w�� ��w�o�,�[�L���Fo��7��|�ԅ��*���ޕu�JViE(yÕn4/����f����UNb{@�A4����3�5SD��D�hE>�?q��v�*���5ORd?�m�(ɚ*���R��8��j��U 6�Py+�,�vp�2)�lZ>�(�	�ܙP���-��+�7�`�Q����vH�?��RQ��6M��^촮Ӭ�`���E��iM�b���v%���X+=_�ܯj��+6uV����l6�ن���b��|$Ӎ��ž����T��R͘�h͢(dU��vv����sNe��
m

<jr��
�	WU��jj��d�'�S�v�Q��Gw�ȚAL ��ח�/Vg'�>����x�OrL"4�:z����<��z'�Tȭy~�f�Hn|�(���I�� �(W�T@�ʼ�Ouj�=e�h�\L�&4͕3�9P7sr����M�wK��`��WQ��Q�_tqW��A�~�P�`��gQ���̹<���d��d!<֍�^CT3Z�p�'6dG�J�;^}�+6.���7ߤ>X��X1�t0��IXMx5΅8���#�~X7���(�2�B6�J
�l�	���>�E�Fr�)�+�9-�W�*��s`7�ı1D�XS�e:<n���!bL��e�x���F-���{����(���y��+5�J��^�Et�#�
���!R>H<����]�D��ʷ��y�M�#4ɐd�g�$+Z�8��2b,������A�0�|W���@�M館�eP�}��X,k��:&+Ҕ\B	:�xԕf{�A�Ӫ�'A�K#	�cD[�`�8�t1�I,W�U�P^���
�V���`��q<������F��}¾�G�4�1��j�B/P/e�S	rG���qd�ː9>��_���:�4��4��+�xo��9J0�w�O���3���П�Ґ-���!��`����3N�����?��
\:6�MZ(
SA�I+VO���A�Dp,�%���NB��Q��!ց��Rb���
�X�l�aDΚ
��O?�ge��Vn+Y�ۆu��}S�E�Spb�\쪊�!r�w��.B�'K�n0JҒi�SM�(��%S��3��Yy�R�I�o��TO~�X��xؤ��̟�RKƼ��LW8Wf��N�V��È�c�r�����}�[�_�ϴh�)ʵ�Ot]�CT��%䡩�`�#�z�D��`,t�c��A�x��FO����b ���{�6
�,\a��X��|R�wQԊ~e��ҼÈ���Qb�cA4��M�Bk��?������^=�aY����C���7)���=g00��8��F�)�������'���TV.,�V��ӣl��ZFc5����&�&�HJ*vW�
������|����lv��h�1�!�
z��p���4#US�����	����v��\
��ޮ���秷翜���Oo�_�8|~��/�Oߞ��z���|�:|���a����1V�\F�C�S�qfUb�:��`1u1B��q�۽ܤ
`�=^�~�\N��藣@�����@��V��F�JZ�N���'}W���F��(�R\'QKI�P9�I�|�b�o0 jZ[uh��n+��M�k��qP�Z��l8�<�׭�ȍޭ,ɢǡk�a'�w���zGD
�E71Fr%xU��'�c���A��^��&�B�@��G9:��GGf�X��JH2� '$���&�տ5Y�����(�}z��+h��z�s�d9���
������(:�d4ok�;wB��=$Ʒ�q��9�Nd�������m֋]�Z{'�j�)w|��H��Y�\k�bF�LН R�u�.f�z���ǀ�#�����؟�Fup�;��o��2�^,>#�U3F3������0FЍq$��
t�����z}V*۱���t!��Z`��%$5�b��H������u�g
����P��a�ˢ�w�n��{�FR���0�(�
ײ�ۋ�O0aṲXl5W�1Q�0���$;?����nY��N��g'�nD][M�(e�Y��d|T7ڹ=�c��7��b��I2;�~LƑ\:���i�CD�G[�T(�1�w��I�m���SH��d"�b�O`@RX5e�˭sٗ����Wv���6�Qn����'gg��l�꼈��a��_���@�G�0�=y��m�Rtnn}���@%G�V%�@
���Ėt_YjMQDy������v��Q���"ȵ�7����x��
�!p����.8e&���j��)k{J~��D;Kyn��u���縡�h�[1��g����_�Z�J���ߑW/;�U`�q��PK�mWe��g	setuptools/extern/__init__.py�VM��8������B��ۢ���\bW\V��$�n�6��L���[e���
'�nu۩z�zU9X���GɇfRҒ���V	��gНq�������߲��>��^�b����
~��>1c�4Z(5���hb�ܣ���6R���C��8�g�3s����z�����q.���T_o�5[������-n���>
U�Ey7�3�ۀr��<�2߬ny�3�z��l�X%Z(x��fO�E�����XpaZ�{�=s�~$�c�$������0���Ӗf�3�$b��܄�$���sV4ŅMQ�4�nT��3�(K�S�Q)��9����3#
��g ��Ƥ_����Hq�ك���n}Dc��tY^$=�ز�á�6!2�;�N� l�P���Q�s}KU�E@��Q�-�=
Ad�����|�j[�M�"��M�?�m렗OL��x�]�M�](o���3��0W�Xֱ�`a'����I�7�&���,�\Y�m�_���l�_ނ�l`��sθkr��	�Cn�u�By�p��\�H1�Y�5�Bw�m�����x����N�?��4���
��dFF������k��G����;�[ޝ�ɇ������g�H�ʗU��]}�P�y�x�:��D�e�fM��
����bӵ:���tQ�u,�8.�ʹ�Xg����ҙ(V��Xly�J>�
���ȉ0�r;Vl��o�b��f���(OF<V�]��9���r�Lf�-�_jlL��𽀧��>vP�0��Du�A��Mj&����Z�n5�Zs:.��,��H�E�<�v9?/��`b���M�S�%2�(_ԇ���1���)�聎����:��%n��PK�mW�Yď`#setuptools-58.3.0.dist-info/LICENSE]QK��0��W�8�RDy�,nC9fY�y�*�(6E��;�W�H�g�{ͤ��:�S�W�z	���&0V���BpXuz;��NS=F�%p�������M z��W�؉h|k7��5�(�p2�H�1����pu�u5�A���َ���wt�
�-����N"���n꽵��b�&��Z�Hp��yxk��
gs�@ί��ξsG��9���.�	t���k�b�bkGBa�~b�18�=g�p7ϐʅ+�uo�?M�;^�%��<�lV�c�H?�a�7���s�(�d�`�n�_;g��u���-�.W}�B_���>��nd��8ɇ��w����f��c.Q#�Rk��Z�����Yf"���H`/�F���9�Z/�[Y�Ԣ�@i&�e.�d��LO�B\��r+
�$����"�����|%si	[KS�Zi�Prmd�˹�r�KU	�ϐ���Z��؊�,Qk ��Ն�9I1�C���A�ʃ�O�g�+��*w)��\n��?���E3����FP��8~�����*��g�)�y��e%�ZVh���BzZ'"�L��B�Yh���"8B�]%�	!<G��!���PK�mW=k����$setuptools-58.3.0.dist-info/METADATA�Xmo�6��_�����8m�ju��I��i���ѡ��̚U����;J~w���{y��;�n��h#T�np�]�"f���UJo���]pt�A�e\W;�FȊ%j�Kœ6*���˥<`e�j���y�ʼYgו���<������/�1bk�a*���¢*x��Dn-�\;)"OY�!lՐ��q!#�cK+��H+[�t�]�r�Zo/�\^�}�]k�b��~��؉��r�-�D�Bh�@�bz_��+������/�J9�45�Y�s�!�޵�v�t��ї�1�V���*��
KiX��`>C�I�7F6��sy	z%��@l�0��m�������j������f�����1�YF~��yZ�Q�2(�t�Tz�>��ߍ*DL;5�s�a�!ai��5i_�1��*c!��cOČ�"�㪟;N��v����/,��Rh0~
1b{G��E�gBb^��O/���3� ��=��Xښ�UJ������������ʀhX��^ًm��\�X����{t_=Ω�
�ȧ���0x߂��f�c[3�n�XT)��u9�%�c�^'�oZH��1���Ĵ�Un���[�	�g�Z���1rg͂��|;�
r����
��юO ��~b�n{���Sx�$uj�rȩ`5)�	ۡ�T<mEX��n��Lh[r	��!�K.�<�a[�n�K;��@���g[9� �(��m�ڜODo�b�=�m����G��NȈ#t��B1�XԈ��͊��ˢ�a���?Y!ay���z���ճW�Oi�)���?��?�Hdi`&d�zl�D8[o>�,�c��:u��
*�w���jV7w�I��˅�x�G]UX�M�z˶��^�M�t,�܄�"�x�����k�̧%誷���y��D㯓ɥ�k�~�[�sx�X%��1��Pg��q�VH�8t<+�}�ǜ��}v[-�����cF�1 �Hlbۛo� �����!^�t\�s���TiМn��Fr5�0aܸp'�ǦL���P��5?�K_I�{󉰰XCKz��δ�ݢ�qv8o��}r���}d��ސdʑ�N�p-}1Mݑ�ׄ�6U�z[[?�V�(�4�0,�;�Ǯ�ы���}X�E#�ƣ��p5�x7ĩΉ���[��a��h�,p��BCҕ��D�7fB4X%��YRu$	D��q� 3Uʄ�+�U��j37�<�F?jl%�Q�N4��-ě4-��dn�}.S��P�{ׅ��Z�J����6��0W!"�	K56"l��P������p	c�~��\aPc,9
|^o��y�X�+�zO=4�	�J(k
3ƊR~�
��I��9��	�L+��:B�~4H��W��XI���ǻ���-��AS��`QQT�ur:�:��.On�7A�4֟aF��]�8�n�~<C��L2Nӵ����YL��cxkY��#R`�K���V��=���@/��`4��=B.��
+5�z�&�BK�l�\�p�/��E��4hq(�Y}�Y�JV@�w�u�}/j��֌1hͥ[�yVp��:HM���
���4�Xܨ�0�yא�J���#�����&�W���K������
�C�d�te���҂W�s�Xܻ�ю�2�&�z�PK�mW�P2�\\!setuptools-58.3.0.dist-info/WHEEL�HM��
K-*��ϳR0�3�rO�K-J,�/�RHJ�,.�/�Q�0�36�3��
��/�,�
(-J��L�R()*M�
IL�R(�4����K�M̫��PK�mW�$�|L
,setuptools-58.3.0.dist-info/entry_points.txt�UM�� ��+�4����[ժ���=��'Y���z}�b�|\��y��Na�Ҹi��(M���J����л`��D��'kF���~��a��$��xKB0�kz�;�j�T4�3��=�̳�$n��p�
�	�u��򴲸ev�B�a�-�0H��U%��/��F��n��#���*nY���C�S���vb��J]���yd�u��ia(O`�qf����V�#��L�
/b|ZX�����N[ىζ�</lƶ�e���qt�t`ځ����^$"� 0xe�ĢT@�h{�£"� �Ufy�QѾA{%��{�����"�NYU�$R/�2��+�h�F�P������M�J�#�2�HQr��Πc��ۙ��ެ��?:h�N�gS�<��p�X��ut��h��7�	:�j���B��%q�~� >�e��̉��N�F��I��>�(wk���a�yBnΞR�Ԉ��~|�����;�<�;��l�M�݇ك=���H�Oѝ�7"хm�j�C]L����HQ8�������r~8�uy['�x�?,'E��;UB!�)C%�A��ƹ��Ħ����yh�׷B�������)���W����c�PK�mW;���*))setuptools-58.3.0.dist-info/top_level.txt�A
 ����0�PP\�3�z�9�.1J;\��A{�#�PK�mW
�^"��4"setuptools-58.3.0.dist-info/RECORD�zɒ�ز�~�V��L�fP�D+����A4_��<7����9i�9����o�/�ۃ��!-z��B?��k�d�'.��/j#�X��֣��]*��w�Br�$E��vM����0�?N�'���~���U:8�o��'�э��O{��J�v��f�bX4����:�]r���~��$��~�]��&7:= p�h�L�����4��>ڪ����*�z���i���¾;?�;�����8%)��%5@
\Z��ʹm�
2�'!
	m�$Ÿ1a��w�(�rZ�����X�Ld�Q���d�o6�$��`�7�n�i�?�Ji�0��N�/v9�}���^Na�RZ���*��� ��Y���*~�.�d�c�A�N�Y�J��c_=��	�S,�W ��b�;�-|n��o~q�z��tY�]�B
��ыuE��g�1�����8v���@���/����k�{�G�>��U (dB�]RYI9�⍜'`�a���>���q��8܃�o.�s�N��p��M�@O!��@(�[�'��`��&���a���L��̝��n9�K}�J5�Y3�W8�‡E��/Hj��_2,�k�g��
#��ȯ�r�M���7��OO����4� �������%i�K5h�T��	r<^�\��{���we`]/H��0�����vL����َN�P��Nʢ�G�O����z�Lk�Y��Z" k�R0�K;}�i��~�h5T!����P�!�LJ�6�RZ������;����3�?�O�!�کn�=�=��޽��>UB8���s)��V�(��4��>;��*S`f�.,9v)G�$�k��4�[�����$򗁍�����L0�W�B�N���0�?���p�X�\B�VR�Ū�u���>��!��Q�ٽR�u�\_/&Θ	��[ҍ���`�|��/�=������{�??�#~���}8��s�w�Z U;�V�1Vs��,Ib���$NQ�8�́#��[�@���u]|�sw#ߝ#9d�!厵�<�Kzׅ����!�t�w���.?��;l�v&��^K93( ���A��LV*T�D�����!Uo��ek[�=#���'偂�^:�Q�b+��T���n��S�Q�қ�)���$}��Gҽt���U���Nb^A�s���
��NwR��� A<CzcZN�3q�#d�'�4����~ij��Rd�)�;��I�4�L�xү�(}�]_R���w�-�1����%�0H�4Ok�s}N�,)�.+m_��3��ϟ�ggh���V
z�����
3���C҃ �v��[G��'�����5";83���(O�	���So�@Y���Ic-p���K
~��'(�Tu��R���<�Æ�!2�ړƒ4
�O���;ɗ8l��~�#��?䋛�1g�VECE|��f/]����|n��z��/�(��iȒ��L̰����$��';��]"�v�����M���^\��Tۙe�p�{q��,�x��N�G�Iy�ʽ��l�;�$^™V��E�=ז�x�m��xC�����x:\���ք��\�;�_�V�c�'O`�E�G��\e=x��H�Ut�E�4��i�OBw-�	���<\����t�(�)D���&�᮪#�'�~�9,�n!�^V���Y��B�Wtb����h#qfn��xj듉OHGf&�[;l��3V�a�1�~Q��7ջjiqf\\Ly���t~T�N��gc'��n:��z��Yyc� ��0aR����(d���
��Xs�{�XN�{벙�j�!I�/��~s'K	����l#e��Xrp�e1˥o�ý��9��nl
{��7�����+uI�rl�p��+��e��YԢ��Ԝ\`��z+��/4�]������ʦ��c��2��އ)8�p���V*.w��]�B��A;�`_���ڍ�X���>�z3^`zE��J��<�N,k!/hc��u�ݟ#�*ʡFE~��t?����BX�Mm8��[�l�Vw@p㻗�*���G[�@툏��>D�M-:H�Ž�V�C�K�;R���|�BS��<��p�!��(Â��!��K�5�V�
���	�/�:m�WO�ӏMSw���]�^TμX����9�6�.\aG-�"S[�#�WI�ט��:(�n�!����w��Z�
��p����9�܀��\c�;��H����(a4$J�����ښ�o�j�{��ѡ��B��$������0��d��q�B ����@l���^�JVOx_M�Ob�����+"k6�Q�q�|8DaBk�P���tp��F�S$e��-)H�׿s�!���ݠ�T]u\I���1f$�B��C	$�a��j���捡�Σ�FcRƧ8�t���,�$�V�2B��&�A�z��Y��{�L�I�t�DB,�ɉ���=���)lܤ��l�	�=m݅/-.P�F9�Ԝ�H��Q!�$gcE�l�U�
j;�$�w�K��w^֚R���V,�4MN�ܮ#r:g=��RP FnL�-��ީW�y������+ݞ�9>ܦP�@R�H� Z������t���߈8~ԩ��d���KX��p'��3������C;bM��R�;��lL�^1���c�u�C�׻Nڛ������zV�#�'^��>#�w�1=D����e��BI�Ӭ�
(B������yV�'��}-���i���A�)�K���rs'�bm�x�p�i>��!���?Y,�CE��=�ҧ�~Z؊� �
v�V����P7�.QԹ��YH!�q�%��aKE
a�\7J0���9�kD[."�mtdg�Y3MtP=1��(
i��=4��Kl��8�]?���@�T�%�����Jm�x(��v̂Gz�מ�=Z�'77��R�-�s�$�}|�`B���s�
$�/f�W�*�ϗѸk��(�]�|4���0���|�4��$�m��p��$��5��i������.o�Wۍ�9��l�8x8k�
ƵM[�V��C��l��6�a��I@��z쏽]{���N��e�xp0�(�R��K��C�w9�A�_��G"���f1�2�:(.XF6YWђ��,���J{�`�]Sܤ��\6��Q9bڷ4��s��/H���UE�s�@޻�i�bペ��^��_�K�
�R�ݺw2�:,a��Un����-�W�2l��p䝣��ܝ��~���[p���tp?6{U�DO��}Q:��:![�Q�]�l2t�.IF���Y/[m��ʾ�$?�C}��0�'��SW�7y �H�޶�O���g����89P�	�V�﬍c��w�R��,��tN�.A�J]R�c�UUk�3$ۿR��	��I��d��NHб����Ւ�En�0H}wx��=7
\�I���Ǔp0���4ܻD�d6�q�^{����w.߼]n��w���@W�l��G�{p?d<K����g)ZnJrE����A��9?x������S%R�T���Ն=�%���c�F�ﰏ��c�|]�����ǦYTBM�G�9ae\�>��R�1UU�|��0~�Q����y�,ٹ��*��I��Q�G��Ϣ�Rn$�>���C����g]S>و3e�a>a/�߂^�˜��
n��.�Ys��E4�JC�+�g����y�����WJ��zn�E�\����}ԡ2� ���񗝏������ȅ�-�췑����f����Y�Ȏ������/����_��!�b�*$0�5��	'ݒn'#ZmG��X����x[�;66�{n�w4ﭻ�q�sG�G�"�&��\J"Z�O���v�6���D�K����'�bb�61���Sh��-t��ϷH��;fz5�����գ*|RgU�a��m�Cn�A�xh��kJ�5nPg��;���%~���@ݲÑ�|ߎ��>�-t�#� �P�:�R���s����~��A1Jt#�ض�V�y^��
VQ-��l?<j��h�'��	��l�uʤ=	ةDŽ�J쁖�	�+���2�+��A�:�o ��D\kY3�A�#���0�Dg��L�7J�ZUc�&z����v�}��|<�<��W�)AbQmDXbw��FG���		�5W��b<63�/��O+ao]#���s~�ԔB7ȳ;h�z$5��V �Ox�L�)\��q�w�F!�R�὾��5<
r��FTdwFY��4��rh�}��'�R�Q��M�o��gC�dB�u��B�e�8�L3����I�o�)���%!�;��f���C�9�6��[p�愻�R���e��ʓ�Ƿz��_&ڦX�/��]�$y\Ӥ�նض8fN�;�d0���;�aa�ӴÉwC�&�0�~�����m)
'�nF�d�3$xrz�Ĩ�dpZ�����xoE�&�O���1��uIĬ���=��|��T!w`�����MTQ �+R��v����@^�g2�|"���K6�[�(��7y9�5��v�)����7�u�%��w��s���`����n��hgߙ�r��,�1)'��ۈ�)�o�����o��z��tː�o��ߣH��%DR���Q�l=+Q�I�ٗ�0�$s�	�
���[�.���41�H�V!
�Y�;_;�lV�k����-s���.����5�����M��,��Z>��y���q��dQ��}c��W��{��]�����Y�s��V�s�g���6��B�O�n��f������ִ�9��m�����s��vR?��Jc
K`9Y"�a�ú��SG@~�dn5p�3+I�-�Q>~�C�ܿ�G�S�x���x������r��I=ȫ���"��&؃j�86���F|�^Oi�m�k��OT�H�gW@�Y�m_N���,Q�0x�Z$RY�|UKy�p��&@B�a��37��|%76���6�k-��:k6<\!a�;�0�(��ظ�_o~6$�sׂ*��Np+g���@/��e=�U���d��`z#��~�Ӊ2�	���h2A��1����z�xʦ�nf<^�U��;}���y�O 
�ׂռ���%�F�>3��1�(��=!��2;K��Ž���S���L6Ă����T�@;b��XT0����T�'l>¢~�œKOpr9{'3%�a:t��3WZ��#O����O6�uAL�����q���ʁs���.��#����qG��D��u�bH�Y	�z��I!�vq,��ثxG�<
����\�H��u��C�XG�����E��s��;*X��K�H@��ԉ!ȷ	��Re�}�/�б�n�彻��IDZ��~�kz5덛�o���̓����}�P��UsK)2��I˄L�衊���$Hmï��χ$cEa�����n�����{��s%A�b�I��!����ɨ3y+b����a~��׃r��tZoT�%7����m��s���	���~J�p*�򯭉�8{٭ۃ�pb@ )�|S;�E�V�,�PQ�������M��-���!��m����jF�4!�e�5<o�$���8�}m���U��x~3d�9��w�Ê���VI4�p��D:yF_�������+F�C�o�����U���k�ۇ����!UQޮ	��80��z G�5��-�[�~�b�k�V�И�����ԥ7�f|/���X0��	t�g�������/�'1�1�e؆��y��G��۶��g`�K�=�jhq<�"�e���cb��I�B�UZ��0��\%,"�I����1�� E~�����Q��a�t����L��~k�����湣�̤w$H~��_���fd�tIcm��`8�A��0��
Pד���y6�F���?0�����X�,a�:#OaZus�V�f����0y|�
�#>�!������ȍN�����G�Yy�p�Cn�����՞U	���!���}D� ���G��/�< �0%��0�N�����q�>�����y��x����O�%�J��K�I*+,b"������}�d'¬�<�SfϱR�����&p�/�6M��5��P�>�Q��m���X�3�7S>3�J�;�縛������?�ß&��JΝ7,9��P�0J��e�5u5�R����{��7��_fůF�Bq�)�l!��3B=�і'��xE=̜�ND�pH��/�x���_�Egw���/PK�mWb�/q���distutils-precedence.pthPK��VS�@=�h���_distutils_hack/__init__.pyPK��VS� ��.,���_distutils_hack/override.pyPK��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.pyPK�mW_��f
���"�setuptools/__init__.pyPK�mW�J��"����setuptools/_deprecation_warning.pyPK�mW��	�	X	����setuptools/_imp.pyPK�mW��MjO�����setuptools/archive_util.pyPK�mW�N7�`((��G�setuptools/build_meta.pyPK�mW�l<
ESZ����setuptools/config.pyPK�mW+J���T
setuptools/dep_util.pyPK�mW��f;zb��'setuptools/depends.pyPK�mW2�
˹,O����setuptools/dist.pyPK�mW��Q�
���@setuptools/errors.pyPK�mW���������Asetuptools/extension.pyPK�mW޷Y��	���Dsetuptools/glob.pyPK�mW_��
��Ksetuptools/installer.pyPK�mW2S��,���Psetuptools/launch.pyPK�mWE��4a���Rsetuptools/monkey.pyPK�mWSB�(���� Zsetuptools/msvc.pyPK�mWpm!N����setuptools/namespaces.pyPK�mWT^�-Λ��~�setuptools/package_index.pyPK�mW�V�D����r�setuptools/py34compat.pyPK�mWQ�짟8��(�setuptools/sandbox.pyPK��VS��������setuptools/script (dev).tmplPK��VS�3��j�����setuptools/script.tmplPK�mWT+�~���u�setuptools/unicode_utils.pyPK�mWH�Lbe���,�setuptools/version.pyPK�mW�
4�	` ����setuptools/wheel.pyPK�mW���
t�����setuptools/windows_support.pyPK�mW�B괯�!��u�setuptools/_distutils/__init__.pyPK�mW��1MQ&��c�setuptools/_distutils/_msvccompiler.pyPK�mW��5R
|!%����setuptools/_distutils/archive_util.pyPK�mW�F9��.:%��m�setuptools/_distutils/bcppcompiler.pyPK�mW��| �1��"���
setuptools/_distutils/ccompiler.pyPK�mW����w�F��_<setuptools/_distutils/cmd.pyPK�mW$�Fq����Rsetuptools/_distutils/config.pyPK�mWIS^��"���Wsetuptools/_distutils/core.pyPK�mW5��<�*B(�� dsetuptools/_distutils/cygwinccompiler.pyPK�mW_�H%u���\ysetuptools/_distutils/debug.pyPK�mWk"#��
!��
zsetuptools/_distutils/dep_util.pyPK�mW�3��
b!��Osetuptools/_distutils/dir_util.pyPK�mW�. A�3����.�setuptools/_distutils/dist.pyPK�mW�n���
���setuptools/_distutils/errors.pyPK�mW]�4:%
)"��\�setuptools/_distutils/extension.pyPK�mW�1ƲxE%����setuptools/_distutils/fancy_getopt.pyPK�mW�È
�"����setuptools/_distutils/file_util.pyPK�mW��%4_4!��~�setuptools/_distutils/filelist.pyPK�mWˆ�з����setuptools/_distutils/log.pyPK�mW>����!�v&���setuptools/_distutils/msvc9compiler.pyPK�mW:�kc�[%���%setuptools/_distutils/msvccompiler.pyPK�mW��v��#���?setuptools/_distutils/py35compat.pyPK�mW��{�#���@setuptools/_distutils/py38compat.pyPK�mW���s�
��qAsetuptools/_distutils/spawn.pyPK�mW��>~T"�� Gsetuptools/_distutils/sysconfig.pyPK�mWQ8��Z�0"���`setuptools/_distutils/text_file.pyPK�mW1���8&��8psetuptools/_distutils/unixccompiler.pyPK�mW��	u�O��t�setuptools/_distutils/util.pyPK�mW�87�l�0 ��$�setuptools/_distutils/version.pyPK�mW2��
)��ίsetuptools/_distutils/versionpredicate.pyPK�mW;��*)���setuptools/_distutils/command/__init__.pyPK�mW��n1��&��X�setuptools/_distutils/command/bdist.pyPK�mW�wq1+��g�setuptools/_distutils/command/bdist_dumb.pyPK�mWo�Y��"��*��!�setuptools/_distutils/command/bdist_msi.pyPK�mWd]�v!T*��K�setuptools/_distutils/command/bdist_rpm.pyPK�mWd-�E�>.��	�setuptools/_distutils/command/bdist_wininst.pyPK�mW������&���setuptools/_distutils/command/build.pyPK�mWv3;��V+���setuptools/_distutils/command/build_clib.pyPK�mW����#�{*���!setuptools/_distutils/command/build_ext.pyPK�mW.�8o@)��Esetuptools/_distutils/command/build_py.pyPK�mW8�4,K.���Wsetuptools/_distutils/command/build_scripts.pyPK�mW�m�&���^setuptools/_distutils/command/check.pyPK�mW,���V�
&��)fsetuptools/_distutils/command/clean.pyPK�mW���7\=3'���isetuptools/_distutils/command/config.pyPK�mW�i�TE�k(��dxsetuptools/_distutils/command/install.pyPK�mW����-���setuptools/_distutils/command/install_data.pyPK�mW9R)S+
1����setuptools/_distutils/command/install_egg_info.pyPK�mW*Rj&�0���setuptools/_distutils/command/install_headers.pyPK�mW����	� ,��5�setuptools/_distutils/command/install_lib.pyPK�mW�:���0���setuptools/_distutils/command/install_scripts.pyPK�mWCh�o�+��?�setuptools/_distutils/command/py37compat.pyPK�mW����t
�-)����setuptools/_distutils/command/register.pyPK�mW�t��v=J&����setuptools/_distutils/command/sdist.pyPK�mWj��P�	�'��l�setuptools/_distutils/command/upload.pyPK�mW����setuptools/_vendor/__init__.pyPK�mWD�*�;!����setuptools/_vendor/ordered_set.pyPK�mW��+\�x�����setuptools/_vendor/pyparsing.pyPK�mW!Q8�AR-��B�setuptools/_vendor/more_itertools/__init__.pyPK�mW�a�h�y��)��ξsetuptools/_vendor/more_itertools/more.pyPK�mW�ʀ�8�?,���8setuptools/_vendor/more_itertools/recipes.pyPK�mWZ�k���)��rMsetuptools/_vendor/packaging/__about__.pyPK�mWeD2(��GOsetuptools/_vendor/packaging/__init__.pyPK�mWJzBh'���Psetuptools/_vendor/packaging/_compat.pyPK�mW�]�מ�+��(Ssetuptools/_vendor/packaging/_structures.pyPK�mW���n_'��Usetuptools/_vendor/packaging/_typing.pyPK�mW�d��{%%'���Xsetuptools/_vendor/packaging/markers.pyPK�mWiS�05,��sdsetuptools/_vendor/packaging/requirements.pyPK�mW��)��|*���ksetuptools/_vendor/packaging/specifiers.pyPK�mW��'^$��P�setuptools/_vendor/packaging/tags.pyPK�mWJ�f`�%����setuptools/_vendor/packaging/utils.pyPK�mWPz��n<'��ӥsetuptools/_vendor/packaging/version.pyPK�mWR/�����setuptools/command/__init__.pyPK�mW=��/M	��Ƕsetuptools/command/alias.pyPK�mW�ut��@��/�setuptools/command/bdist_egg.pyPK�mW��ȹ������setuptools/command/bdist_rpm.pyPK�mW!�1? ��0�setuptools/command/build_clib.pyPK�mW�I�V�3��n�setuptools/command/build_ext.pyPK�mW�2-�y	T ���setuptools/command/build_py.pyPK�mW&��dd����setuptools/command/develop.pyPK�mW������U�setuptools/command/dist_info.pyPK�mWE��wg[�N"�� �setuptools/command/easy_install.pyPK�mW��v�}�b���Ssetuptools/command/egg_info.pyPK�mW�vQ1�*���psetuptools/command/install.pyPK�mW\Ҩ�+�&���wsetuptools/command/install_egg_info.pyPK�mW,��,#!��{setuptools/command/install_lib.pyPK�mW�}���!
%����setuptools/command/install_scripts.pyPK��VS]�)B7t(��z�setuptools/command/launcher manifest.xmlPK�mW���3|R ����setuptools/command/py36compat.pyPK�mWv�������setuptools/command/register.pyPK�mW�!��P���setuptools/command/rotate.pyPK�mW��4F���4�setuptools/command/saveopts.pyPK�mW�HnY����setuptools/command/sdist.pyPK�mW.
n�����H�setuptools/command/setopt.pyPK�mW$����	���k�setuptools/command/test.pyPK�mW"]K������setuptools/command/upload.pyPK�mWm�� 	2!��Ыsetuptools/command/upload_docs.pyPK�mWe��g	����setuptools/extern/__init__.pyPK�mW�Yď`#��i�setuptools-58.3.0.dist-info/LICENSEPK�mW=k����$��
�setuptools-58.3.0.dist-info/METADATAPK�mW�P2�\\!����setuptools-58.3.0.dist-info/WHEELPK�mW�$�|L
,��o�setuptools-58.3.0.dist-info/entry_points.txtPK�mW;���*))��5�setuptools-58.3.0.dist-info/top_level.txtPK�mW
�^"��4"���setuptools-58.3.0.dist-info/RECORDPK���.��PKN![��"�BB&licenses/alt-python310-pip/LICENSE.txtnu�[���Copyright (c) 2008-2021 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.
PKN![��"�BB,licenses/alt-python310-pip-wheel/LICENSE.txtnu�[���Copyright (c) 2008-2021 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.
PKN![��N�'�'doc/alt-python310/README.rstnu�[���This is Python version 3.10.18
==============================

.. image:: https://travis-ci.com/python/cpython.svg?branch=master
   :alt: CPython build status on Travis CI
   :target: https://travis-ci.com/python/cpython

.. image:: https://github.com/python/cpython/workflows/Tests/badge.svg
   :alt: CPython build status on GitHub Actions
   :target: https://github.com/python/cpython/actions

.. image:: https://dev.azure.com/python/cpython/_apis/build/status/Azure%20Pipelines%20CI?branchName=master
   :alt: CPython build status on Azure DevOps
   :target: https://dev.azure.com/python/cpython/_build/latest?definitionId=4&branchName=master

.. image:: https://img.shields.io/badge/discourse-join_chat-brightgreen.svg
   :alt: Python Discourse chat
   :target: https://discuss.python.org/


Copyright © 2001-2023 Python Software Foundation.  All rights reserved.

See the end of this file for further copyright and license information.

.. contents::

General Information
-------------------

- Website: https://www.python.org
- Source code: https://github.com/python/cpython
- Issue tracker: https://bugs.python.org
- 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/master/Mac/README.rst>`_.

On Windows, see `PCbuild/readme.txt
<https://github.com/python/cpython/blob/master/PCbuild/readme.txt>`_.

If you wish, you can create a subdirectory and invoke configure from there.
For example::

    mkdir debug
    cd debug
    ../configure --with-pydebug
    make
    make test

(This will fail if you *also* built at the top-level directory.  You should do
a ``make clean`` at the top-level first.)

To get an optimized build of Python, ``configure --enable-optimizations``
before you run ``make``.  This sets the default make targets up to enable
Profile Guided Optimization (PGO) and may be used to auto-enable Link Time
Optimization (LTO) on some platforms.  For more details, see the sections
below.

Profile Guided Optimization
^^^^^^^^^^^^^^^^^^^^^^^^^^^

PGO takes advantage of recent versions of the GCC or Clang compilers.  If used,
either via ``configure --enable-optimizations`` or by manually running
``make profile-opt`` regardless of configure flags, the optimized build
process will perform the following steps:

The entire Python directory is cleaned of temporary files that may have
resulted from a previous compilation.

An instrumented version of the interpreter is built, using suitable compiler
flags for each flavor. 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's 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.10 <https://docs.python.org/3.10/whatsnew/3.10.html>`_ document.  For a more
detailed change log, read `Misc/NEWS
<https://github.com/python/cpython/blob/master/Misc/NEWS.d>`_, but a full
accounting of changes can only be gleaned from the `commit history
<https://github.com/python/cpython/commits/master>`_.

If you want to install multiple versions of Python, see the section below
entitled "Installing multiple versions".


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

`Documentation for Python 3.10 <https://docs.python.org/3.10/>`_ 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/master/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://bugs.python.org>`_ 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/python3.X``.  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.10 with 3.10 being the
primary version, you would execute ``make install`` in your 3.10 build directory
and ``make altinstall`` in the others.


Issue Tracker and Mailing List
------------------------------

Bug reports are welcome!  You can use the `issue tracker
<https://bugs.python.org>`_ 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/
.. _comp.lang.python: https://mail.python.org/mailman/listinfo/python-list


Release Schedule
----------------

See :pep:`619` for Python 3.10 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 `LICENSE <https://github.com/python/cpython/blob/master/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.PKN![�̈��'doc/alt-python310-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.

If you want to enable valgrind support in Python, you will need to
configure Python --with-valgrind option or an older option
--without-pymalloc.

UPDATE: Python 3.6 now supports PYTHONMALLOC=malloc environment variable which
can be used to force the usage of the malloc() allocator of the C library.

If you don't want to read about the details of using Valgrind, there
are still two things you must do to suppress the warnings.  First,
you must use a suppressions file.  One is supplied in
Misc/valgrind-python.supp.  Second, you must uncomment the lines in 
Misc/valgrind-python.supp that suppress the warnings for PyObject_Free and
PyObject_Realloc.

If you want to use Valgrind more effectively and catch even more
memory leaks, you will need to configure python --without-pymalloc.
PyMalloc allocates a few blocks in big chunks and most object
allocations don't call malloc, they use chunks doled about by PyMalloc
from the big blocks.  This means Valgrind can't detect
many allocations (and frees), except for those that are forwarded
to the system malloc.  Note: configuring python --without-pymalloc
makes Python run much slower, especially when running under Valgrind.
You may need to run the tests in batches under Valgrind to keep
the memory usage down to allow the tests to complete.  It seems to take
about 5 times longer to run --without-pymalloc.

Apr 15, 2006:
  test_ctypes causes Valgrind 3.1.1 to fail (crash).
  test_socket_ssl should be skipped when running valgrind.
	The reason is that it purposely uses uninitialized memory.
	This causes many spurious warnings, so it's easier to just skip it.


Details:
--------
Python uses its own small-object allocation scheme on top of malloc,
called PyMalloc.

Valgrind may show some unexpected results when PyMalloc is used.
Starting with Python 2.3, PyMalloc is used by default.  You can disable
PyMalloc when configuring python by adding the --without-pymalloc option.
If you disable PyMalloc, most of the information in this document and
the supplied suppressions file will not be useful.  As discussed above,
disabling PyMalloc can catch more problems.

PyMalloc uses 256KB chunks of memory, so it can't detect anything
wrong within these blocks.  For that reason, compiling Python
--without-pymalloc usually increases the usefulness of other tools.

If you use valgrind on a default build of Python,  you will see
many errors like:

        ==6399== Use of uninitialised value of size 4
        ==6399== at 0x4A9BDE7E: PyObject_Free (obmalloc.c:711)
        ==6399== by 0x4A9B8198: dictresize (dictobject.c:477)

These are expected and not a problem.  Tim Peters explains
the situation:

        PyMalloc needs to know whether an arbitrary address is one
	that's managed by it, or is managed by the system malloc.
	The current scheme allows this to be determined in constant
	time, regardless of how many memory areas are under pymalloc's
	control.

        The memory pymalloc manages itself is in one or more "arenas",
	each a large contiguous memory area obtained from malloc.
	The base address of each arena is saved by pymalloc
	in a vector.  Each arena is carved into "pools", and a field at
	the start of each pool contains the index of that pool's arena's
	base address in that vector.

        Given an arbitrary address, pymalloc computes the pool base
	address corresponding to it, then looks at "the index" stored
	near there.  If the index read up is out of bounds for the
	vector of arena base addresses pymalloc maintains, then
	pymalloc knows for certain that this address is not under
	pymalloc's control.  Otherwise the index is in bounds, and
	pymalloc compares

            the arena base address stored at that index in the vector

        to

            the arbitrary address pymalloc is investigating

        pymalloc controls this arbitrary address if and only if it lies
        in the arena the address's pool's index claims it lies in.

        It doesn't matter whether the memory pymalloc reads up ("the
	index") is initialized.  If it's not initialized, then
	whatever trash gets read up will lead pymalloc to conclude
	(correctly) that the address isn't controlled by it, either
	because the index is out of bounds, or the index is in bounds
	but the arena it represents doesn't contain the address.

        This determination has to be made on every call to one of
	pymalloc's free/realloc entry points, so its speed is critical
	(Python allocates and frees dynamic memory at a ferocious rate
	-- everything in Python, from integers to "stack frames",
	lives in the heap).
PKO![���3{"{",doc/alt-python310-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
}

PKO![蘪zccdoc/alt-python310-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.

define pyo
    # side effect of calling _PyObject_Dump is to dump the object's
    # info - assigning just prevents gdb from printing the
    # NULL return value
    set $_unused_void = _PyObject_Dump($arg0)
end
document pyo
  Prints a representation of the object to stderr, along with the
  number of reference counts it currently has and the hex address the
  object is allocated at.  The argument must be a PyObject*
end

define pyg
    print _PyGC_Dump($arg0)
end
document pyg
  Prints a representation of the object to stderr, along with the
  number of reference counts it currently has and the hex address the
  object is allocated at.  The argument must be a PyGC_Head*
end

define pylocals
    set $_i = 0
    while $_i < f->f_code->co_nlocals
	if f->f_localsplus + $_i != 0
	    set $_names = f->f_code->co_varnames
	    set $_name = PyUnicode_AsUTF8(PyTuple_GetItem($_names, $_i))
	    printf "%s:\n", $_name
            pyo f->f_localsplus[$_i]
	end
        set $_i = $_i + 1
    end
end
document pylocals
  Print the local variables of the current frame.
end

# A rewrite of the Python interpreter's line number calculator in GDB's
# command language
define lineno
    set $__continue = 1
    set $__co = f->f_code
    set $__lasti = f->f_lasti
    set $__sz = ((PyVarObject *)$__co->co_lnotab)->ob_size/2
    set $__p = (unsigned char *)((PyBytesObject *)$__co->co_lnotab)->ob_sval
    set $__li = $__co->co_firstlineno
    set $__ad = 0
    while ($__sz-1 >= 0 && $__continue)
      set $__sz = $__sz - 1
      set $__ad = $__ad + *$__p
      set $__p = $__p + 1
      if ($__ad > $__lasti)
	set $__continue = 0
      else
        set $__li = $__li + *$__p
        set $__p = $__p + 1
      end
    end
    printf "%d", $__li
end

define pyframev
    pyframe
    pylocals
end
document pyframev
  Print the current frame - verbose
end

define pyframe
    set $__fn = PyUnicode_AsUTF8(f->f_code->co_filename)
    set $__n = PyUnicode_AsUTF8(f->f_code->co_name)
    printf "%s (", $__fn
    lineno
    printf "): %s\n", $__n
### Uncomment these lines when using from within Emacs/XEmacs so it will
### automatically track/display the current Python source line
#    printf "%c%c%s:", 032, 032, $__fn
#    lineno
#    printf ":1\n"
end

### Use these at your own risk.  It appears that a bug in gdb causes it
### to crash in certain circumstances.

#define up
#    up-silently 1
#    printframe
#end

#define down
#    down-silently 1
#    printframe
#end

define printframe
    if $pc > PyEval_EvalFrameEx && $pc < _PyEval_EvalFrameDefault
	pyframe
    else
        frame
    end
end

# Here's a somewhat fragile way to print the entire Python stack from gdb.
# It's fragile because the tests for the value of $pc depend on the layout
# of specific functions in the C source code.

# Explanation of while and if tests: We want to pop up the stack until we
# land in Py_Main (this is probably an incorrect assumption in an embedded
# interpreter, but the test can be extended by an interested party).  If
# Py_Main <= $pc <= Py_GetArgcArv is true, $pc is in Py_Main(), so the while
# tests succeeds as long as it's not true.  In a similar fashion the if
# statement tests to see if we are in PyEval_EvalFrameEx().

# Note: The name of the main interpreter function and the function which
# follow it has changed over time.  This version of pystack works with this
# version of Python.  If you try using it with older or newer versions of
# the interpreter you may will have to change the functions you compare with
# $pc.

define pystack
    while $pc < Py_Main || $pc > Py_GetArgcArgv
        if $pc > PyEval_EvalFrameEx && $pc < _PyEval_EvalFrameDefault
	    pyframe
        end
        up-silently 1
    end
    select-frame 0
end
document pystack
  Print the entire Python call stack
end

define pystackv
    while $pc < Py_Main || $pc > Py_GetArgcArgv
        if $pc > PyEval_EvalFrameEx && $pc < _PyEval_EvalFrameDefault
	    pyframev
        end
        up-silently 1
    end
    select-frame 0
end
document pystackv
  Print the entire Python call stack - verbose mode
end

define pu
  set $uni = $arg0
  set $i = 0
  while (*$uni && $i++<100)
    if (*$uni < 0x80)
      print *(char*)$uni++
    else
      print /x *(short*)$uni++
    end
  end
end
document pu
  Generally useful macro to print a Unicode string
end
PKO![��N�'�'!doc/alt-python310-libs/README.rstnu�[���This is Python version 3.10.18
==============================

.. image:: https://travis-ci.com/python/cpython.svg?branch=master
   :alt: CPython build status on Travis CI
   :target: https://travis-ci.com/python/cpython

.. image:: https://github.com/python/cpython/workflows/Tests/badge.svg
   :alt: CPython build status on GitHub Actions
   :target: https://github.com/python/cpython/actions

.. image:: https://dev.azure.com/python/cpython/_apis/build/status/Azure%20Pipelines%20CI?branchName=master
   :alt: CPython build status on Azure DevOps
   :target: https://dev.azure.com/python/cpython/_build/latest?definitionId=4&branchName=master

.. image:: https://img.shields.io/badge/discourse-join_chat-brightgreen.svg
   :alt: Python Discourse chat
   :target: https://discuss.python.org/


Copyright © 2001-2023 Python Software Foundation.  All rights reserved.

See the end of this file for further copyright and license information.

.. contents::

General Information
-------------------

- Website: https://www.python.org
- Source code: https://github.com/python/cpython
- Issue tracker: https://bugs.python.org
- 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/master/Mac/README.rst>`_.

On Windows, see `PCbuild/readme.txt
<https://github.com/python/cpython/blob/master/PCbuild/readme.txt>`_.

If you wish, you can create a subdirectory and invoke configure from there.
For example::

    mkdir debug
    cd debug
    ../configure --with-pydebug
    make
    make test

(This will fail if you *also* built at the top-level directory.  You should do
a ``make clean`` at the top-level first.)

To get an optimized build of Python, ``configure --enable-optimizations``
before you run ``make``.  This sets the default make targets up to enable
Profile Guided Optimization (PGO) and may be used to auto-enable Link Time
Optimization (LTO) on some platforms.  For more details, see the sections
below.

Profile Guided Optimization
^^^^^^^^^^^^^^^^^^^^^^^^^^^

PGO takes advantage of recent versions of the GCC or Clang compilers.  If used,
either via ``configure --enable-optimizations`` or by manually running
``make profile-opt`` regardless of configure flags, the optimized build
process will perform the following steps:

The entire Python directory is cleaned of temporary files that may have
resulted from a previous compilation.

An instrumented version of the interpreter is built, using suitable compiler
flags for each flavor. 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's 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.10 <https://docs.python.org/3.10/whatsnew/3.10.html>`_ document.  For a more
detailed change log, read `Misc/NEWS
<https://github.com/python/cpython/blob/master/Misc/NEWS.d>`_, but a full
accounting of changes can only be gleaned from the `commit history
<https://github.com/python/cpython/commits/master>`_.

If you want to install multiple versions of Python, see the section below
entitled "Installing multiple versions".


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

`Documentation for Python 3.10 <https://docs.python.org/3.10/>`_ 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/master/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://bugs.python.org>`_ 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/python3.X``.  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.10 with 3.10 being the
primary version, you would execute ``make install`` in your 3.10 build directory
and ``make altinstall`` in the others.


Issue Tracker and Mailing List
------------------------------

Bug reports are welcome!  You can use the `issue tracker
<https://bugs.python.org>`_ 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/
.. _comp.lang.python: https://mail.python.org/mailman/listinfo/python-list


Release Schedule
----------------

See :pep:`619` for Python 3.10 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 `LICENSE <https://github.com/python/cpython/blob/master/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.PKO![���� doc/alt-python310-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 pip 20.3, we've `made a big improvement to the heart of pip`_; `learn more`_. We want your input, so `sign up for our user experience research studies`_ to help us do it right.

**Note**: pip 21.0, in January 2021, removed Python 2 support, per pip's `Python 2 support policy`_. Please migrate to Python 3.

If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:

* `Issue tracking`_
* `Discourse channel`_
* `User IRC`_

If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms:

* `GitHub page`_
* `Development documentation`_
* `Development mailing list`_
* `Development IRC`_

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

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

.. _package installer: https://packaging.python.org/guides/tool-recommendations/
.. _Python Package Index: https://pypi.org
.. _Installation: https://pip.pypa.io/en/stable/installation/
.. _Usage: https://pip.pypa.io/en/stable/
.. _Release notes: https://pip.pypa.io/en/stable/news.html
.. _Release process: https://pip.pypa.io/en/latest/development/release-process/
.. _GitHub page: https://github.com/pypa/pip
.. _Development documentation: https://pip.pypa.io/en/latest/development
.. _made a big improvement to the heart of pip: https://pyfound.blogspot.com/2020/11/pip-20-3-new-resolver.html
.. _learn more: https://pip.pypa.io/en/latest/user_guide/#changes-to-the-pip-dependency-resolver-in-20-3-2020
.. _sign up for our user experience research studies: https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html
.. _Python 2 support policy: https://pip.pypa.io/en/latest/development/release-process/#python-2-support
.. _Issue tracking: https://github.com/pypa/pip/issues
.. _Discourse channel: https://discuss.python.org/c/packaging
.. _Development mailing list: https://mail.python.org/mailman3/lists/distutils-sig.python.org/
.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa
.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev
.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
PKO![�Yď*doc/alt-python310-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.
PKO![_��$doc/alt-python310-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.
PKO![SoD �1�1%doc/alt-python310-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.
PKO![�Yď$doc/alt-python310-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.
PKO![�S��
�
5doc/alt-python310-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.
PKO![�'��ss0doc/alt-python310-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
PKO![�rE��:doc/alt-python310-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.
PKO![�
���Adoc/alt-python310-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).
PKO![$dگ�7doc/alt-python310-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
PKP![���@�j�j8doc/alt-python310-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>`_.
PKP![��f�n)n)Bdoc/alt-python310-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.
PKP!['��*VVGdoc/alt-python310-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.


PKP![���@�
�
@doc/alt-python310-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.
PKP![\��ى�;doc/alt-python310-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.
PKP![�!�**9doc/alt-python310-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).
PKP![��cߑ�Adoc/alt-python310-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.
PKP![C���"�"8doc/alt-python310-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.
PKP![G��N��:doc/alt-python310-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.
PKP![Ѩ���1�1<doc/alt-python310-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
PKP![P��d��9doc/alt-python310-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.
PKP![ƺ4�{{5doc/alt-python310-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
PKP![��`''=doc/alt-python310-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.
PKP![4/o�*�*Edoc/alt-python310-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"],
            ...,
        )
PKP![c�g���-doc/alt-python310-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.
PKP![4W�pppp3doc/alt-python310-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.
PKP![
`�nPP)doc/alt-python310-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']
PKP![�0�7�79doc/alt-python310-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.
PKQ![��s���0doc/alt-python310-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/
PKQ![�&5pp-doc/alt-python310-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).
PKQ![���+doc/alt-python310-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::
PKQ![I��xzxzAdoc/alt-python310-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
PKQ![f�m�(�(Cdoc/alt-python310-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
PKQ![:X���Ddoc/alt-python310-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`.
PKQ![I���Gdoc/alt-python310-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
PKQ![�Y�
&
&Edoc/alt-python310-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`.
PKQ![.<��ZZDdoc/alt-python310-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.
PKQ![�ׁ���Edoc/alt-python310-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.

PKQ![R����Ddoc/alt-python310-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.


PKQ![�W��Edoc/alt-python310-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}}


PKQ![>�yq�!�!Gdoc/alt-python310-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.
PKR![@�G���@doc/alt-python310-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
PKR![n�O���Qdoc/alt-python310-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.
PKR![U��)�z�zFdoc/alt-python310-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.
PKR![eO<�x�x<doc/alt-python310-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.
PKR![2�����Adoc/alt-python310-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.
PKR![�Ӹ�6doc/alt-python310-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
PKR![��U��=doc/alt-python310-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.
PKR![�j'��@doc/alt-python310-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�![�ٝ�raraman/man1/python3.13.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 \-R
]
[
.B \-O
]
[
.B \-OO
]
[
.B \-P
]
[
.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 \-\-help
]
[
.B \-\-help\-env
]
[
.B \-\-help\-xoptions
]
[
.B \-\-help\-all
]
.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 "\-\-help\-env"
Prints help about Python-specific environment variables and exits.
.TP
.B "\-\-help\-xoptions"
Prints help about implementation-specific \fB\-X\fP options and exits.
.TP
.TP
.B "\-\-help\-all"
Prints complete usage information 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, \fB\-P\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. This terminates the option list (following options
are passed as arguments to the module).
.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 \-P
Don't automatically prepend a potentially unsafe path to \fBsys.path\fP such
as the current directory, the script's directory or an empty string. See also the
\fBPYTHONSAFEPATH\fP environment variable.
.TP
.B \-q
Do not print the version and copyright messages. These messages are
also suppressed in non-interactive mode.
.TP
.B \-R
Turn on hash randomization. This option only has an effect if the
\fBPYTHONHASHSEED\fR environment variable is set to \fB0\fR, since hash
randomization is enabled by default.
.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's warning machinery by default prints warning messages
to
.IR sys.stderr .

The simplest settings apply a particular action unconditionally to all warnings
emitted by a process (even those that are otherwise ignored by default):

  -Wdefault  # Warn once per call location
  -Werror    # Convert to exceptions
  -Walways   # Warn every time
  -Wall      # Same as -Walways
  -Wmodule   # Warn once per calling module
  -Wonce     # Warn once per Python process
  -Wignore   # Never warn

The action names can be abbreviated as desired and the interpreter will resolve
them to the appropriate action name. For example,
.B \-Wi
is the same as
.B \-Wignore .

The full form of argument is:
.IB action:message:category:module:lineno

Empty fields match all values; trailing empty fields may be omitted. For
example
.B \-W ignore::DeprecationWarning
ignores all DeprecationWarning warnings.

The
.I action
field is as explained above but only applies to warnings that match
the remaining fields.

The
.I message
field must match the whole printed warning message; this match is
case-insensitive.

The
.I category
field matches the warning category (ex: "DeprecationWarning"). 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
.I module
field matches the (fully-qualified) module name; this match is case-sensitive.

The
.I lineno
field matches the line number, where zero matches all line numbers and is thus
equivalent to an omitted line number.

Multiple
.B \-W
options can 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 (though, a warning message is printed about invalid options
when the first warning is issued).

Warnings can also be controlled using the
.B PYTHONWARNINGS
environment variable and from within a Python program using the warnings
module.  For example, the warnings.filterwarnings() function can be used to use
a regular expression on the warning message.

.TP
.BI "\-X " option
Set implementation-specific option. The following options are available:

    \fB\-X cpu_count=\fIN\fR: override the return value of \fIos.cpu_count()\fR;
       \fB\-X cpu_count=default\fR cancels overriding; also \fBPYTHON_CPU_COUNT\fI

    \fB\-X dev\fR: 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 \fB\-W default\fR
           * Install debug hooks on memory allocators: see the
             PyMem_SetupDebugHooks() C function
           * Enable the faulthandler module to dump the Python traceback on a
             crash
           * Enable asyncio debug mode
           * Set the dev_mode attribute of sys.flags to True
           * io.IOBase destructor logs close() exceptions

    \fB\-X importtime\fR: 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
        \fBpython3 \-X importtime \-c 'import asyncio'\fR

    \fB\-X faulthandler\fR: enable faulthandler

    \fB\-X frozen_modules=\fR[\fBon\fR|\fBoff\fR]: whether or not frozen modules
       should be used.
       The default is "on" (or "off" if you are running a local build).

    \fB\-X gil=\fR[\fB0\fR|\fB1\fR]: enable (1) or disable (0) the GIL; also
       \fBPYTHON_GIL\fR
       Only available in builds configured with \fB\-\-disable\-gil\fR.

    \fB\-X int_max_str_digits=\fInumber\fR: 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.

    \fB\-X no_debug_ranges\fR: disable the inclusion of the tables mapping extra
       location information (end line, start column offset and end column
       offset) to every instruction in code objects. This is useful when
       smaller code objects and pyc files are desired as well as suppressing
       the extra visual location indicators when the interpreter displays
       tracebacks.

    \fB\-X perf\fR: support the Linux "perf" profiler; also \fBPYTHONPERFSUPPORT=1\fR

    \fB\-X perf_jit\fR: support the Linux "perf" profiler with DWARF support;
       also \fBPYTHON_PERF_JIT_SUPPORT=1\fR

    \fB\-X presite=\fIMOD\fR: import this module before site; also \fBPYTHON_PRESITE\fR
       This only works on debug builds.

    \fB\-X pycache_prefix=\fIPATH\fR: enable writing .pyc files to a parallel
       tree rooted at the given directory instead of to the code tree.

    \fB\-X showrefcount\fR: 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

    \fB\-X tracemalloc\fR: 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

    \fB\-X utf8\fR: enable UTF-8 mode for operating system interfaces,
        overriding the default locale-aware mode. \fB\-X utf8=0\fR explicitly
        disables UTF-8 mode (even when it would otherwise activate
        automatically). See \fBPYTHONUTF8\fR for more details

    \fB\-X warn_default_encoding\fR: enable opt-in EncodingWarning for 'encoding=None'

.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 PYTHONASYNCIODEBUG
If this environment variable is set to a non-empty string, enable the debug
mode of the asyncio module.
.IP PYTHON_BASIC_REPL
If this variable is set to any value, the interpreter will not attempt to
load the Python-based REPL that requires curses and readline, and will instead
use the traditional parser-based REPL.
.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.
.IP PYTHONCOERCECLOCALE
If set to the value 0, causes the main Python command line application to skip
coercing the legacy ASCII-based C and POSIX locales to a more capable UTF-8
based alternative.
.IP PYTHON_COLORS
If this variable is set to 1, the interpreter will colorize various kinds of
output. Setting it to 0 deactivates this behavior.
.IP PYTHON_CPU_COUNT
If this variable is set to a positive integer, it overrides the return
values of \fIos.cpu_count\fR and \fIos.process_cpu_count\fR.
.IP
See also the \fB\-X cpu_count\fR option.
.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 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 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 PYTHON_FROZEN_MODULES
If this variable is set to \fBon\fR or \fBoff\fR, it determines whether or not
frozen modules are ignored by the import machinery.  A value of \fBon\fR means
they get imported and \fBoff\fR means they are ignored.  The default is \fBon\fR
for non-debug builds (the normal case) and \fBoff\fR for debug builds.
.IP
See also the \fB\-X frozen_modules\fR option.
.IP PYTHON_GIL
If this variable is set to 1, the global interpreter lock (GIL) will be forced
on. Setting it to 0 forces the GIL off. Only available in builds configured
with \fB\-\-disable\-gil\fP.
.IP
This is equivalent to the \fB\-X gil\fR option.
.IP PYTHON_HISTORY
This environment variable can be used to set the location of a history file
(on Unix, it is \fI~/.python_history\fP by default).
.IP PYTHONNODEBUGRANGES
If this variable is set, it disables the inclusion of the tables mapping
extra location information (end line, start column offset and end column
offset) to every instruction in code objects. This is useful when smaller code
objects and pyc files are desired as well as suppressing the extra visual
location indicators when the interpreter displays tracebacks.
.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 PYTHONDEVMODE
If this environment variable is set to a non-empty string, enable Python's
"development mode", introducing additional runtime checks that are too
expensive to be enabled by default.
.IP
This is equivalent to the \fB\-X dev\fR option.
.IP PYTHONHASHSEED
If this variable is set to "random", a random value is used to seed the hashes
of str and bytes objects.

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

The integer must be a decimal number in the range [0,4294967295].  Specifying
the value 0 will disable hash randomization.
.IP 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 PYTHONINSPECT
If this is set to a non-empty string it is equivalent to specifying
the \fB\-i\fP option.
.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
This is equivalent to the \fB\-X int_max_str_digits=\fINUMBER\fR 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 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 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 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 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 PYTHON_PERF_JIT_SUPPORT
If this variable is set to a nonzero value, it enables support for
the Linux perf profiler so Python calls can be detected by it using DWARF
information.
Setting to 0 disables.
.IP
See also the \fB\-X perf_jit\fR option.
.IP PYTHONPERFSUPPORT
If this variable is set to a nonzero value, it enables support for
the Linux perf profiler so Python calls can be detected by it.
Setting to 0 disables.
.IP
See also the \fB\-X perf\fR option.
.IP PYTHONPLATLIBDIR
Override sys.platlibdir.
.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 PYTHONPYCACHEPREFIX
If this is set, Python will write \fB.pyc\fR files in a mirror directory tree
at this path, instead of in \fB__pycache__\fR directories within the source
tree.
.IP
This is equivalent to specifying the \fB\-X pycache_prefix=\fIPATH\fR option.
.IP PYTHONSAFEPATH
If this is set to a non-empty string, don't automatically prepend a potentially
unsafe path to \fBsys.path\fP such as the current directory, the script's
directory or an empty string. See also the \fB\-P\fP option.
.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 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 PYTHONUNBUFFERED
If this is set to a non-empty string it is equivalent to specifying
the \fB\-u\fP option.
.IP PYTHONUSERBASE
Defines the user base directory, which is used to compute the path of the user
.IR site\-packages
directory and installation paths for
.IR "python \-m pip install \-\-user" .
.IP PYTHONUTF8
If set to 1, enable the Python "UTF-8 Mode". Setting to 0 disables.
.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 PYTHONWARNDEFAULTENCODING
If this environment variable is set to a non-empty string, issue a
\fIEncodingWarning\fR when the locale-specific default encoding is used.
.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.
.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 PYTHONDUMPREFS
If this environment variable is set, Python will dump objects and reference
counts still alive after shutting down the interpreter.
.IP PYTHONDUMPREFSFILE
If set, Python will dump objects and reference counts still alive after
shutting down the interpreter into a file under the path given as the value to
this environment variable.
.IP PYTHON_PRESITE
If this variable is set to a module, that module will be imported
early in the interpreter lifecycle, before the \fIsite\fR module is
executed, and before the \fI__main__\fR module is created.
This only works on debug builds.
.IP
This is equivalent to the \fB\-X presite=\fImodule\fR option.
.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�![��F�����0python-wheels/setuptools-69.0.2-py3-none-any.whlnuȯ��PK<��W�}a~�distutils-precedence.pthE��
� �~�۞B�ĭ��a�4R�Am���P��p��m/�CiWA�ػ��I���Fm�'�Bv��i�&B>b-Y<CggzLeq	9(������1$[���ny!�{jk��p�PK�uW{j����_distutils_hack/__init__.py�X[o�8~�� �˅+;v��d��m(Й	�t��(XJ�m"�(���b���CRuqf���B��w�s�1Id6�DrYh²����dR�\��u�/��FB�����PsE鄈ׅQ)R-2jEЌ8nI����"��P��"W<��vD�'�dR���L�J���.�_�uYdծ��%f��JȌ�l+�O$X����<&���ʂ��5)�Xf�а���S�ڔQ�D��)E�/D�������|��J�{�k��$̸��]����(��<�7����*����fs�����z��l8������e�a���}~�{��Ws%4����j1�g�Vw!^�����c�B��<!��p�Rs-%��6@���\4�X
�)x������#�����K䏐<�"v")g�/OK�H•(X;#�gG!E ]�(�
6KŽR$�N�t�J��g��R�ݵ9pU��=#<S%8����6�Li��Fw|�
Vbw"w�*��W�d'a:C@��{����e�U���3R���SWM1��h��O��#��e��y+�����E
��[�I��������y}wG.j���
!�P�/B�����8ᩯ������3L_R���†��4�/����'r�!*:���(dv&#GV�$��E��xH����`�x�����??ү����ǧ�O�>?Nfd�ʘ��MS%�zY��Т��l^����t��1��ՠ�&�_�f����i�|�缀H�N
o�J�aE�mH%K��B<臍!!�����چ�L�^��kgB{�ZM�v(����y��C��!�<�A�b��/�������'�+9��)�
�t־m�C*wC��2�H*��"�]��{��i4���[�����!�F�N�g�G�릶���|�F���sK����cs	k�ޯ6�����Ⲯ�� �82,�v}�^�U�34,����ج�S!���_�����0Mi���w9Ӛ��㛐V/�娖r`:�;J@��.����4)4KL �'-��e�ؾ�{��N�LS$�J��#���o2�qG�Z�?M�o��R�2%���̡���)
��=	[	=�j�{0c	�\aQ�h�s7ڂ�B��)F �T�>A!��3���~v�0��+@�@(�����I�L�t���`��;!:�…ϓ:#);D	�5O���++��T�&4�C�>Imm�a8�����=�>�"dQ|�%Z��ũ��`"q���h��k�-�7O-�c��8T:��2�y�'f
��b�
j�H��!q�꾫�=�Zq���Ĕ���9��	�#BÞ�*AA��ż�>W�aO���2����$����q6�K�%����N�ʼIϴ?,$S)8c��d[���R>��]E�g��ֶ�,��~�Y��0�@�D$b����z��Dd��>��"h�0�;�6�i����WB�t���@w�B��^oiU�2�4�W(ʖ>{3�s�n��k(�5ɢ�u�%�3r���;��Y׼Ə?G$"�"��RS�0aT��e�U��|�<=��8�d*��,�XF�U�&�=�+�v�Z,<��\l`vE���/�$?�p�
���Qc.�.)��ݨ��8,������a���4E����D���z}i\.�=��a/���_�rg>
\.�x�0d
"iu�������wW��y�zc�����8��:p8oR��3��ȁ��i�"�^qf}��FΈņ���MVWWg������^��Ԯ�.�X���jC��y6593��zEfNj�p8n���#~����9�m8J_��OE�1Tȼ0`��isF�aC�����a�F�A%a�٪�D�IE$�����MfO���TF0���a�	σ�)�74U��tKhI�ȩ��?]���k	�գ㗰A��R�k���\oU�*��#�i���C;`��83;�$�;��6��eu��|�k�W�K/�<�c�d��}c��v�s�bf�߆%�;e[oʶ�쭍�9��j����O�}��IT_�Xg����^�a+5���/x�v��C�'@'yᎀ������N�0�ȑ�%0����Ԏ~�r��}�.�ѡ],f=+m�VFk�o����4:;��ͿǏ��;����)~�Yf���|�1�y̑E~"��rI����^-�[�g����PK�uW� ��.,_distutils_hack/override.py����-�/*���P�O�,.)-��)��HL�V��Kɏ�/K-*�LI���PK�uWK���Bt�pkg_resources/__init__.pyԽ�v�F�0�_O�P�CҦ�K:���(�ܶ��׉��v:�#kH��$�H�@�l���H�ξUծB���̬9ZY�v�v��=�^e��"O꼩6�<O��z�w���{�M�%�ꢘg��X�ɼ*۬(�ErS��E	��z�T�k��l�E��۪�&�e^��y�$o/s�7�$��ƍ{Xf���k��2��BQ×�%���vM�f�$���f��^Y����Kxq���C_�70΢��<�h�l�<���ZT�U�$��*+��f	��hX�Y^�0���%�Ů`��^�a5yS\��7U}Ń/�z%�l�6_���^�_\�I���dS�;��^�T���<��X6�vfY�
Z�lK�,�
���盦�Vɫ�W��re�����&�f���&7�]��t���h<���Z�ta^�j�Y�<�5�:nL��� ���F��!4>�+��,�R�F�l���^2�rF�=\o���6`ӄ��`��=�.�54�V���2���*7���v��mcX&\%�'�f�du	��M��w���Zڗ뫋M[,�Ūھ�:0ϫ��
q�5)\�w�ʊ% l
�k��u馘��	�������v1�O���l�moUS���v�׀)2y� V�0�����%�#o��^�~����9=:���6�ɫ-`Q�|�>�y����X�V����aH��0��.
4}���zZ%G��7�~oN̺��D[�f�m�D'
��Y�6�'\5f(�7���
�|H�DbGuY�W{�����O������oao�M�c]J8�5�]s'ɺ�β����L�{r��-�a00��װj���y�4�,sC�o���>�#�́��@ճ�=���{2�lGN���٦�<�[E�&�ȗ���,a>��۬�Tu�u�N����i�E>��yQ�fe����p8�L�wüJ�ьܶȗ�)�%�c|�����u��-?�GU�S��rC��do������>�|s�ֆ���M��M��at2�m
�`�?�#$�y�~�wu��H=.�'~���O��~�W�#�7s��y��[2�b�|9f�����M�G�pe4���K�]�G� �I,c��|��+��Vyr��S����X.����1����@��|��0�tO�T�{&1m��<��i���ph�d?�5��JL��γ�y>_�Y�Y��
?��u��0`SX�:��gJ�!��HD2C��V=���5��;�U^Xx�;/r"��1̥a��ㄕ'vż$�$�Y,�we�ž��S��O���=��A���{ɀ[����m������5�)p,YZT���G�>�Q��]-LC�	x��O<~��j	����1���)0k�����O���OO���Q�)^����z��ߌ�y�oMv�=�����O�6���'�R�u|o<��*}�`ρ`3l�H��)g	�-��G�~o.�n!���VM�ə��9�x�,M!�G��"�g����S����8S�(鐵�/�
ra�8�=����L�r���^#��½������8ݬ���ҼZ�6ER}�oh8I�xl:�K�NG��ɣ��W�)s�@Ww�+�Uc�XH'W��d8m��&�����<fh5  ��֎�q����w��ZvGA]7ҵ/��t��PB�hhܸ��!KC��<\^oGvA�'j�r��$�3��R�������F^���?�N���:����,.!$�X��%f8��2[�-��^V_4��ao���|�bj؃�;w�y�-
]���}�ڬ,
��9 ̏!Ѥے���q�E�α��UQL�s=���/��Xm��͍�<�=���%xU�
	��.6sxy�
��$ڴ$�'7@1��ej2���x5�2��UV78>�eɋ?����{��D�u��K�rӠ\��%����=��u�:K�(V���X���"�7���	����r�|#[���E�R�9|�й��mR!5��RR8�E�$ۄ��f€IŦͥ� ڎ^\�yU/��r�z�a!%�8�K�|��z��}C]���/Gؖ�#�B�xMr;�fv�GG�`��7E9p�Ċ�G�3�.�|����d4L�)rۣ)���a4>9||:�$��6��㱅&B�_��FK��g��J���BM p@x���F�)�D�?eM1w�#���5��X��X"|1��QVBCA��D�ܔ�f^��<��ZW��:���<G���t{~���݇�1��Ύ�g�b����<6�]�p�����u�)O���򺨫E�lIzɺZ��Ʒ��Xn��6������+�0�W~�۴�<�,��D����U]��EQoI�
'!�,gD��?�޸���>�J�nv�"���	k��1�+�7��t~He;X:M�K!O���h�E�~[��o�X"�,�q��j��OF�F�<խ!0 xk�ǧP��q�ښ�d��W'�����f+=�8L�F�R��`/d����
,j_=�>�ag�^��Ꜫ��XLY�6Osx�A��{��u�����Ibd彁�<B��\��~�7d&�(_��<�V�l
�~�����7o
�?=��߽Go^�����韏����o��ώ�z���W��~2x%r���}�nD�@���/p�����6k�d�����>7�+|�jF�y�
V)|v|q�y�Z��^�;$��f�[���3&0��/��#^ �,Eww��N�LQ�q�=�����O������MW*v�g��g�	�c�ʥ�c�R]e�=�O��b���|�S+�nd	��Ɵ�5D����ɉ[�kd���X���UݐH�_�<�v��B�<W����)�4��Ԫ<A�����'�x?ݟ��n��m(��shX̹�h��D�)e޴��0�o,�	�B[�X��l�N��,u)�2E�ƒE��<����t]�_܏�&���/8Q���Bٵ��'O�>��~��tO�G�߹�f�)^Y;�w����\_R7å@�&v�ӳ�m����F̤�Dj&f��Z0T�رp�r��l�\�$�U�>�fo���V�E�)�q�v�c��OI�������u�Vr�����}y�e�~�j��?%���;�����8
�w��!���4���8܁ʦѭ(����Oz�(:��j��Yd<��s9�B����P���E:�S�Z�#1�5G~'���L6v���p���!�\�F�ݮ�p,�I"��m��ӳ)Ne�](]�����~��E�7�e���U⩓�<C;�hj.��$�VB[Fl
<%��En̯�>���~�5>�>�4Cs�x�0���=��ߏ��?��^x�pO3����c��H�N�c=���&��,l3c����~����<�
�����@�?�,lf=Lf3��F���f̖���ܐ�V	���d�=�v/a�d�a�#f��>��\��X<b��5IԽ��T�[�jĠ_��t�0�ΰdP�0>5�L�f�p΋�.��tO�FuϒҀ��{�T}����wc�j�S���H��4'�3�DTpɷ�N�zu_�������n ��|9b��H� Ab���5�Qd�'z,�M@�Y�str*k-���*��БA����H��8C��C6�
yM�-( :�Pk
��у7$�?��8��z��iU�o��J�	��7Ct"�!)��F�h�w&-/���8)MP<��l�;Nf`˖ք�M��c�k�t���
�Lb�Zqh��p'�'!H�	Mi3S�,A��t5���XE���Ȓ��ˑ������W�M^�z:<L���]z2��G���Ҽ���e�p������G�C\3O�P;������o�[�
�-C�ߠ�x��l��	�4QP+��R�aߊK@z�d�/��{�H/�gr�z�Bjq��Ь'��5h�q�Y$�S<��2�
g���1Dh��-jy�	�����#�AJ�w���,3 �d0IӁ�����C�狃ϛZD���l
��';<�5�����+�ܰ�hB��mrhY�0<�OX)&,r�AJ�j/�jsq��í��%�O�v��)+t����[��K韃Qzo;�#�57����Y
W{]��89�1��Hn�����4C��"�L��3gG��I�Â��{�͞�i��j�M������@��-u�̎��9[���� "������n��6y�&o|�c1s�A���q4�3���Ⱦwx���YCȚ<��oS�lq&j���j �{��3n�č�w3��7�bb��kQ�~J�=<������.	c5G�l����<L�5M��Y����U�.#2����_>q��,5{�gN+������$r:;K�?���|��Qu����ؚ��\
m��n�y�
�捶�N��,^��;J~m!7���0�G�/�樾V0��I0ׅ��铤�é����$t�ot��/��V�4v%�ó��G��1%���s�	�%�Ҝw:�d�I>;J�-3��=����qT����N�D��y���K�Ӑ+ _�x
Fz(�|M�C̺ˈ"T	tH��)�'���J�!p���,���y�)˜$�����B���ُ8,o���[GA�	8s7��H���u�JZ���|*�o܆�O��dh�-�S���0�[�'���i�p����!N��!`b ��
yA�zQ�Ǯ��:#yȚ�7����$�W3 �}�.-X�Զ���z�ĕ�Ӣxp���:>�� ��p����B�r��
�8
�p׳�0>���ld(t�&��ò3�K�T�'3��R��3�Yh�*��l��$��igTz<
s�#��)H�c�
>��-�w��[�B��
�
���wX]��^�(.#���O6�����)k8;>�V�}�5S�6Rc��?�r��E��;�q���Ϡ���������g
Fw� �O%���Ų4餪s��ΖYyE�I�LB`��}�-H<D1��%y�_-{�]��7��p���`p�����f8BӢ�Ѹ��/1��Q��U�b䢷
v�,�ϛ��Z�o�d�,�0�����x6�׸Ho��rڎ8"U0��ܪ
�Nw�����>~��)��Ζ�2����������z˶9-��{�9?�hh/,R����O˶�D�6,�"�V�7�M�KmoQu��\�+�-��3��3�?c/�<0E�{���Pٛ����S�j��hJ�_;Z���ъ�Q(��X$
Y���#FRl �v�0��"l����﫺��h8r�K�F�O��[C=�0�O�r��全��e2��c�Ͻ7�`"�+����M�*�YM7�?��݊�2<!���ͩH�O�2�y�/�z0��&�'#��q���
��Mӣ��f;���c_�ћ��=����t��
�i����$�"��h�|��
�L�}��4�mi���a!G��A{�A�nwX5��І<�/�ϣW5&^�{�덊�
��$�K�>���i��$#M�6��x�6�i���D
��}JLA��/ ����B���wb��M�E{����=���B�:���1�#=������������.���@uf6�v�:$��qt�~ǾsX3�R�YHAF�@��"t]�B�X�j��@c�5�Q_�m��@D�F�%.�Zl<9վg?7�����x�-6��m��5�??�Z)�����/)"^�bg�8�"k��bA��*r�7���{���;��e��"��7��
�Юj�%}�m��'���V�Wn"*�.��@>�U�+#����F+:�Ա�^V���ͺ!<�	)��D¼i8VTi^Հ�;{�����#�%��Ą*Ɍ^bP����a�4w�O.Go&����5�nm�g�֨��y�����lLj���()V1��YEd.s�٪��v�h����1F�sr�E�7�8J�:�"t�l�>���7�}A[}B�1�e��W�h.�!)A=�7Y�Ʋ8J�'�{+v6���8�Z�hQ
W�ze�+3)�J��������2c#� �[��[����L,�˚��Qq���"���;��l�2L�A�FC����Z���x�`��F�S���h�	��]�(##L/܍N�g��Xs�L�d���L;H��H�kVV��fF��8�F�N��1Et�!�lB��cD=׀���t"��T|i�x_�:�z��}���J�r��C��'x)�D��ϥ��7�Dg�QkG8OM�ϑ�q�r\��2")����B��@�����yHހ��ɖ��p��Z�.I�V�M����׬�*�#�����x����QY0gj��r��IÂ�0��?jT0��_V�7�Ҭ|�C]^�yi�*"�1MwJ�g��F�[��ۥ�djmM�3���tDH��ɬc�5Q���˸�?w1�Q�^#C�m���؆?�5ݸU4��̢M�t�:���h�k���ņ����`wdP�$dd�3W��Q�~{.�R�hc�k+nr�aA��ao��</}����ƹy���е�����}JVS�E��$��4�$Y�^��e�tv�9�z��v�y�u�,�	�<%��X�uPsO�P���rGL��s��Y4<p��w�\^G�M2?Z2�u5/T&Kf�}�k�dSZf�쎕s'�7��Wf��[�/A�}_��M8�m-PT7��h�?�(�0�6>�?bY�&#O�@��J��-�>�flJ~�tٴ�O�az����}S.�v03[�8�x.ꑆ4!��i�L���s�ds�d�,G=i��%�c2��)��7N����c�>�Ŵ�PYk+V�Yȿ㎾pۯ-DF��0Xc[�j��d*l�x�W^o��6V��a��T�>�'Ӌ9��vLn�*���S�����T�]>�c��+H>�Z~#�ɲde*��]��IЏG�W�@SE��Ԙ[d��@z@<��x����hL�F+��5�[^{�<��d�i^^3EuC�`�:x.�151ʰLp0��j�w�ݎ��L���|< f-A0&n����P�sg��I�(V�)��l�M�(3�����Do�1�NT��l)=��ޢ��=W��*��Нqfb�m.�r�vi�p�!
Ռ����l�͡C���2t�,�Z6'�.��)�Q=��J݈u=��pƲj6�y6�N=���R�l����{��2�#&,���D���j?���	(�*������׬#�Dz`�A�:����hgܶ�ۄ1�6s�:l�/�&ՙ���DVzːBK��՗<�F	�3�8�*����Ycj���7���Ҩ(�ԃ�Œ��#9�^e�s{$l�\mQG��O%�9^���\��9���?	s���$L֛:_��R��gK=<���zb��l���l�^�]�yG�$�����,`!����͚�xD1���'���NP�Ģ�Y�#�/�ړ3��;?�ڿN�rҹ�vp�	L�hC9J�@A)��e��pK!!��}JR��Ϗ�/گ(���͒�L�5F��H6;C��M���kJ��t��T/�,���1�-}�YYQ�J��3�|���/|��ɑ^��z�V��l��
��qϙ��o�0U�X�B��ù�T�R?�N�,�S��A�����Aj��TX
R�w}�	<b�$�4 �|=ql��Ac����&a�6ͥ
S�Ye����48��g)Bee�s)3s�ͩ�F!��@m�wt������pD����"֬�I��L#8I��X7!�Ӂ�8/����b�	�85���Q�\F"-A�\�jtpʣ8�Y��o�}]i���M��j���L7�D�=�.�1���l�{�b��6�Q�,�\\�ՉP�#��A�����iM�B:�l�Z�#� |�C��,�Ϋ w��s�x[!�]W�b(�"�75�`D�4�%�D�',�����gƍ�U�{"�g:J�ٔC��]�Y�i�����#�:�V�#��~��Z<��uv�Χd�&ʡ/Ub���Z��~���j�p"�.� i��<�N�����]����ĉ����-���KZ偾��E���rs�/�X�kJD#�V�*l>���Jo�� 
�B[�1L�\gJ�?~�a�1�><�r)�Dҿ�GK�}�Ϊ�8��I�����D[��[��_gM�����N�q���%���&�q1�d���&򙫲��L|�[B�z�M�!�q�p2j�#~F�Vm�6ɀ{u.��
0O��i�*Pi��g�J�57����u�:~ؘۣCa;��99��n�
�&�a%D���hG�a=�	VL֠�
V�^T
�۵�[���A�z�|�յ��-O�:���G�V��	���c���rG���g[�J�;7�F�r7�'�Β�e�b܂�u
����q�I��i1U]�6����[�	��eoZ/E:�Ub	�E����}�y������a2�yk6C�#
>��q��A0h�U��LT9�T����uN1u(\9�H����Ա��{��\�Mː��tほp$Pk}�oJ3��eoqYF	��"'Ì�8����S���+�m�]
��ZDs}��Ĉ;�Q���5�ֆ,j�3��ө��/뵟-ח�Yޒ���;m${�7}.��)d�E�4g� �!R}�����������:5õ}��_92y�-�)���O�R���Pmj�N_*�-�^��ߔ�/���­,�	��-|ו��͉��z3�*�e��h|��i��-wp�Xr����rM%�q������Z_�{źH@��u��,X��4O��
��Z.@	��}�tQo�~o�Pѡ�"�a&AT�V&�q˻��urQ��P�wY��.{q�nv$���wt�΍ѷ��Ǜ��"��C�*q莎JE}��Ո�fR%�k��O'�{J�9t�9mȔLx$q��k~X�����`�Ήη�K�w��X9P��F�i�3`'K�[[��Ʃ��D�]�&�.0���'ְ@<z�Z���|�2lva�8K�21��_�fyN�f���:_��Y.fVk��|�!���N��ĺ�c!��V)��q+cj�p�\��3�n�]��ɢ�s*a$41����J��d�Kfs�#����HÛ�9��kN7f�^�Қ�2х	V~��k������4��%O��%�y��1��	3����v�Ӡ��^������CW��'�uqIؗ���I����pA�HQ�������70?�?[@����lZNuؘ�t��&	v���$����U.N�-`��
�T��[�xOo�6��~�a�{N���u����X��f2�![G\/*�$O7Y��(����S�m�S�{��w,I����d�2iypl��}�����*�����%Y���γB�!K]r�P�*�Q��Ѹ��u�%%��js��)�2�0�-���G�#Gq��!V�<�1��OH��X���Tl�2�����Ԉ]�%�Y�x�c�G��2[7�UĂ^Q�>�$��x����iOucD)kH���&T��Ȥ�&�>J�1��sk
��I'�����hg.���ڕs��T���R���7k��>�5k��ͬ�L���0��GB��l6��Ɖ5v��쨪1�Z!��6�d���fAƙ�N�<�v7�L��yCJ��R��<�Ha�_��:����c�X��&��jC�C�" �Ԛ���<�H	���.١�ж�Xp@[.9��:��^(~��./�j:+쩭L�T�n!���.V�`�8�n��t��܀;9���D��Hu�Û��B�I��Y��+�+kp.�JRE����oS�#q%I��n���T��*_#(�m���„��)�����v[��z;�
�\ z�E����ؒ�wlvt���_!nl�X�$�Z��������w�_�k���t���y��v*��� c��	.T����c�@"a�E�ۯ��a�tLfh���(t�B��hl�s,d�>q�B��'
���UȺA_�d�+W#a�}��$&�[�������mĖ���:@�c��F^D�L�S&����j��3Vӥ�_�5�ѺhЎ�݆62c݊#9�ⶱ̸�(R�n��F�m.11=�I�����0��Vjg9I>%`��N�
S׀8j�nЮ�EE^�ݠu��H���Do�����Q�a�!s�IcԡT�SrLF��{Ocg�����OO�IT���"~R�BGGXX(k�:��Θ�gS����C�M�s��(���]GI~ʙ����q���r�R�Ԩ�*T���Lsb�n�&N����ڊm2

�}�I��]-��!:�G�&����h|�:Hn��1聣�1��~|m��rp�7�tLD�bX(r� J���:�,ݑh��q<�ֱ��4@K������W�.TN*��0�3�h�,@���#>�qR�"�<����]M�h���]��&�o��;���]r:��q�,E���ax�b$�A4�����P�7_g��U�5���dQݐ����G�S�ދ���>y�i�K���n�m43�7��̎X)�}H��	�7��-�bG��E%FC)��L�0^$��*�c笍T�����xӉw�W�)�!'�T�{����Cp�Cd	>��3]�����/��F��B��Xx���L{؛Hh5�����ݍ�g�ێ@|�>!�iS��^B�{����(y�E��v�9t:�'8��K�0���qi#B�ҁ�.�������4��7w7�Xv�G�H�2
I�qW�wi�뮈&k��bDV���ju��<�O3�p�1��Fd��5"xB�(_���ݢ�g�w+���3�/��8�(��rYQ�;@s
�k���تc������o(1~�B�I�/��{9u�_U~�zS��*��J�f�ƺy�a�Ӛ��N�R4z��r�sg�4U��uS�a�f��l�Vy)�k�*��@(�����E8tq8�M6���.����(���񬓀]��t���7���V�y��߱A��NJ�XS�{o���hB�ƪ3!�,҂�@k�6/���Y���V���!�>8��Kp��d�
�;�;��& ��S�IO\:ӿKT�K'�3YrdJ6w�/���	��(e�����ӎwn�`�J5�]��맿;M�����
`��_���5~���H�lM��_<]Ju�T��k�k�r<�����t�D���
���w1p�ac�8@�U��e��Q㲆�O�\
���~���G�.K��&�V�C*��9.�=	��z	�b8�M
L�"�x&�z��~ғ;�<$߽��2�C�Ab��X��Db)��qKI�A��cw᷊�@U�-
ʱ�]�n���2[7h2���Wm�Ϥߦl�ZU| ���@84�R��ˬ��D�x�h��Q����?�|1��O�<��N���Y]��
�;�9hX�›t��"�8]R
����E�5`S�"uӽ�R�����w�m|�˒282@���?8pB��'WW9���y�c�	g�B1����!����x�]̘"��l`ҹ����n�oI��'C�r�����n	�(�Y�5<��ԥ_��/+N�
ge�T	KLP����X#���:z�R.
 ߃@����/�4]��SS���&��� �X�6lJ����Ű�\�٦� &���l�3N% ���!o���Qr�w��u��\�a6��9YJ�|>�T���3�y��S����J�,��,7��ڼ��5oɅa@�YMw)C05=�dd���')���'�=��rӳ-��M��Ԟ��깣q>v���N�/ku��^�r�)��<���M*�PKa'jx~�F�|�����8Z�Ú�C��;$>Gv�%�P�X��k�>g�C\4��$	c�0w��68�`���Z�hq]��:�mJSU������_���<xfTUY� 2eX��Ga�[���O�D��	�hnJ���ƍ[�ٛ\�������J���Ew�^3?`��Z;,ۡ+��(��jW���ד�
Fi���@{��+�wfX�5�6��9�KJ��ce����'��Wk�ˡ�0:�2�z?3q����@�
��Q�D\�ژ0�5��VXy�=�.cc�VTx�׍�_ۦo��z���	�����ׯ�EZ5o"ږ�.6�YR&�4W���S��f�klRV��gT���+*�&������OaW�@�]�2A�HK���]��CSzx�Mq�����y��r�Ƽ�M���`W&��Q�ď�wO+yj�B�d��,�O��K/�m�US��|X304�
�S��K�yrT�*+�oXTe�UX��ݡ�4�嶽��ْ/g��<_�? ����x��/���T���2��T�	�f5õ�Q�]pӖ}_�|�= .me2̆	ú�i�[��&��q$ᛪ����c������z	�-C�R� YF�(��1d�R����ܗMO�q@�c��Ð��]��EVi�E�<�<�E�M3�b��8���a��_��t=�~?�p~	
G��3���=�V^�o��q����Ͷ+�Ҷ"�����?'�]�]�n��$��6��э=�p4��YG�}�q���P���s�y#g����fQb6a:�V���CKLP-:"�v�;��Us��f6]�J׀7���{����`}��P\2��f�}UJ&��3ז�p����$-���&�
!��ν9�N��`�M�$A �A0���`o��<���ȗ�����K$�L�l9��MVg ��~�K_g6%����+1y^�
�G/�6?���t#!��Y�yq��˞zQ6`�u�� �9;
�V��r�չv��aOa�v�䆘���x�<3��4��D��	�2�A(�t�MN!���,�B�2�S��ߟ1��{gɮ�����0J|�-�댺j���Vb�:&A�iQ�� �"H�z�)y�|m�C�ko�����"�T.
���@Ipc<�"RW控;avV �.7���Nt�\�27���~(�K�O��#�*8�E��?�d*���P�s�d-fԇ�i׋@l��4z��59�mp���"��uMx��C�T��;��!'�7���F���V�$�椁̿Xm|p|q�Ro8r:�|}��c���5)v,H46��]#q4T�魩+N���Uğ��3��>+Z�$���'�(ȄC00��pv,B�YJ�(A&}��:�|�d�0	�}����y
�hx�O�=;�����������N�3��o�w���G�O���X	���5luk�	�e���`�|�v��y	,S����l��
��5
\�t��ٽ�f<��S@>�у�wy�5!�D�f3�3�֋��Z��`��믿��p��������M�n
e���e�ȯ�o2��'Pr��O���N�?�4������7�ŀ�R|�"\��%iY.nsJ�Si��wH�v�L_����N�}�z��/)�XD�ƨ%�ʯꈟ���ur�' }���8��w�_M@
z�c�}`B��[�S�&��lD��� eC� �5=;|��y-?��s�<@���(uQ2�Yȇf/�O�b��؛�z>:P_�|�S�z�.�|��o�<"NW?+��5%q�w���z?M�l�2�=�ў"�g��-�|��L��=`l�x5�ʹ��\�ֽ�r��H��Vd63���<[3o�r�{.�3g�KÌN����>�	�|gM90����W|�I���-H�|��)c_�Nu�;C�/�����.p�������lA�o�{)���V���(����s�|B˫���v�7��$v-Y���,9�*d�M^H� �Rw#>��zI
���S���O��U,s�3�4�8\o�:������,wm��KI
��p��҆)z�+J��$q���u8��#��['� N
�ݨ��a�A�������g,AX�����ǔ���?/.�!��3Ifh��w��C'���Dt�q3<�S~7E��;=ӗ�04�B,��c�ɢ�Q�0��_^$幔
S#����s8�k�E��i����#�Ҥ��k�8��ߧME�;/����8����p�Ss���.;k��ʂzh��y`�0^��T9DD���u�T�+B�+��.|�Y!�Z�|���ׅV�?;��l��?;�?��F��m�~�a�s~;%}���<�Hԟ#M-η��m]mΖysYU\n�j
C�lP%j�!�[�]��O�5��Q2�A|�(*F��ƒ�1��
�_.Z!�E�n�Y�f'�S��j�zH��������S�����sGW��bg��΃C}��𝦩?������;R���t&|{���v���~Q��ƒ��z�p‡�[�`��ןEi�OH�q���Q�7���@>�?R'6/��2l����Q����y���1%��(�/��m���J�U�P�_������Ї2
�����?���
D���3�=~�`/I�C��N;���E�v��m��-�E�s�����gS�I8�	��|8�p>!����5�	>$����d��y1Oszt�4�T�t�BǤ��a��F���vD���ЮH⪦�Һ�>e}��ev̚��:�L^T�s#��%��Z|zH��lƦ�)U�a�F�Vn�j<~�����+��tn��gA�}�T�ZT2N
!n1���7Ź.z�y>�<�{�W�d<vo=l���g�;<_��I;��
�a��+�l5W6�˶]7�40�u[UK��v��E� /�#u�>X_]8�xzٮ��0�b~`p�D��G�9J��y�&�G���:��)����)�6���^ט�N�'��8�l4<��gY����*j�F<b��Og���OD��k��!Y'N�]���ta����X���O�CԄ�O�
f	���e3bn����l6���P�	��`�Q߽�/���>��F��Rj�QuE����3���>T�rH�ߪsxMt�b��?sɻ�¤���FF�����2+�X&��xnҝ����<���FY1_C���	�u��<7%Q��\�!����(Q��OԞ1��|�3&�"o�ϚQW�Ơ���E'M��1�%�>c��C�
^]�'�K5��y���x#�����V��0��W?���"[_Q�M�C;�{��6�&�ʍ�o?�;�"� gD�e8���_����
\�����k@Y�ħ<�]�h=;�WA:ARA+=7���<�0\B%�s��4
0�7c�D�o�Uvl���c��gT���8�}�]�֋�c=d1�S� %�F6N���Y��|�DC�8&����޺��<C>���f��B'XWjR�\\�ɍ���I�'�]8K����dK��O��g٬�0��v�"`��)���6�h�"��F`��ܤ�5z��a���+y`�Ld���[���¸O�ʘ_\4�'0O�EFUU�8;G��+���j�*��9��L��^ ��:C#���S��s�����GO�U���� �0����k��C���������0�Y]U;
�=cC�{
;�ר�m��,��El_��N`I�)��e��n��B0�"��_gEc��]�������N7��m	���aƩ?�2j-B	B���|��$	yfO�9���|x�=�Nb�љ<��O:e���.�9ɛ9Up0�XV�-���*�D9F�ƈ.:ɁY#v�8�d����ER��Cߕ�s<���N���L�L���Y�}{�3��	A�3�|�w��l�%g5۽�M��O<@Z�ߗ�	�,a��|�MD���%sK�����,�qb�O�Y��R��lS,M�D�bQԦ�#���?a+��eS��eV5
t/JX��m�&,V#ck����6(��xS|��9�A��cၞ��P��Z_�"�%�3f±ޮщ�p�q1�ZJ.����0�M�O|�*�t�Q]s���{[=N�PW�L[N�$ޘ�	f�a�h��	�����ܮ"�6�鼥L�1���(b���|U��������z��7�kQ�	����G���2�@r�'�
u34�ؓ��y�F��F��ߑ:S�#vb���+��ص�0��}e|��8w�M'�Ⱓ�������c�c����� eH���/A������8tEsδ��=2L��n=8=i���n&�F�J}�g@f��AuUȒ4Z��Bé�-xE��o-:`� ���Su����^��¡�*��&��}��	@���O������9b����M�qS�%F�U>Lk�9,LjGeAk�%��X���V�2�2Q�m8�~�s/����
���Ɖ*��R?�n����=���� �|x�}�P�S�;��󅢜4���C�M���4U��Q>z�@)f.U��M�YT�/��}���V�
Pk���3���Z��#~���~?���vkwA�VO-BM<*��+"@��ʫ1t���ŸAwcO�����bO\�	� ��0I��]V� |o�.�@�or.��)HH6�jY7;���u�<Z���葎��+�+�=5{Ȑ�	�ne����C4y����WyO��I�=|nd��� *j�|
�ݴ�ˋ��m���AkG�yC���Xm�v��\5�o�[��B��R�wX8��d�p���4�<����<��t�,��<~�Vh������3��;�f��дxq��o�����d�8���)EUӿ��'�G��n-;{YG��,��&O����<��69��0q��4�ى��-����Ӏp?3^6��^4�V#��7�����:1��έ����J�v�㽐�����_�z��m��|�C�,'a���)�Ey5�I�5&C[�\$�a9�x�fKC�d7�HAK�
�ɓ�d\
QU+;#�S�u6�6��V�3�PZԐ��P?��\"�n�%`�Q�
��^�<�I)ψ5��5	>�l����jC�g5IF
�0�S:[�����_����r��o�VN����W4��ԁ����(b~�]b��|�����+�������
���U�y\��0E-��t��g�͋�ȗ�����6��O��ϞɁZ�C���_<I�9N#߅H�I�(/��y]���9?�=��ޕ�0N Ĵ`1I$�ª�#����]}aS��~��躒���+5��I���l١�E��	��xq��N�5jZ�V�_Ի�s�t�S�C�|�X/�e���h�ö��n���2��%j���$( OMT�+�L�ʑ�]r�<f��Y�U�2�ɩ?\�j��%	��eq֐k:�}��Q�,w��#~�xRJc��FuH�G�+�3=0Q�A^�CK<d�v}�<|��Φ�B�x�I���e�_9����d�G�=(��͏�4�c�Ǯ3c����'ˤ��

����	7=5Ex/l�9��plj��zOo����%���� v�)��a|��ٚ;�ÎX�i�y�x�6<a
l\
�1^wF*`:��ٷ��&�"uq��.�^����?!<����APc�+�2ԙ�6=�{!Y�pjCT���d������N�o�'�p�c�s�6�E��jl���~�O�K�#F	�L�֫���s���0&��[�k�������������I���1�BGE��b��G.(3q�q�#=,Z!��I�cR�s��\��,��0y� ׇp{�JA|�Y+N��b��O�͘�r�c:���[�!��܎�FZ��<���Δ���0'�־B��#���0'�
�r;�qP
E;��JJ�
,�@�,1�n�y�v6��h��G��S�`����ߞi��F���!�v�>�9�X	�.�"L�?�����ޙ�s{�Cx-;	�{��7���
�f�K�!j���B'=�e�ɳ�:_VkJ(��L�R9�)��.h/�y�C��+��M�#&T�h�!�fj�L��7�8.t�#�;�|�����S|�k�Q�ԥ��}d{sh}�N�Z�Kt����)T2��� o������S��[W�yV���c�8�5�#�	ǁ��Z�n��v.�'|G*O(-]��kg�Y�[N��}װ
w������]��%�1�E�xӦk��>�SL{M"-����bdu=�0	��
����K轼7b�ك;�h��=p�M���X�$Σ���e����$�ݐl��H�{*��ɡ�]�p��G��3�c���@y��R���;��-����	:����R�V���DŗY;!G>d���A�6���-/9�+t�O��M=M���W���c��ճ���#�J2_���9K�Z�ly��ޞx�rh��l>u�m�a��Մ��^n`[%��QUW
�C�,���]5re��?]g|6xlhʠ�=X��{l���з�Q��b��j>c=s���H��E��ﷅ8'��]�f�)ֳu>��m��Y����\�o�0��\j�>f��1x�&B�u�P�*��)�-�l���3������r��
X+�S]����pI8|e�����8�d�m�6��DSl�^.�5Ö=���i���9�����n��З[t��H ����%� �2�y��h9�#�Ԩ�>�^�ӟ���T��"T��LJC����؜�PJ	i8���%<���i��4c����2#�GF:1�=��P��I�[�/�;��h�X�&zL���2�(�L�n!��eo�N%N��M��v�&����OO�D��'Po�����������W����8t4*wT�(��
�\�/;�J��P�9�c��`�H�b#��?�}�y[S]���K�):��rP	��W�ؕ������ܯ�c>1}L�<�l�c��ʆp%�вGD�PΡ�&]+! m!�F߽�ș��g_sG!ǁN�K�~��	M����j ��DO{~�tX�nɴAƃ{��3�)���~�8C��Ѕ`ό�ΩZ�{!E��_T�
v�慲�<��Ϟ�}��B��	l���Ԉ2¼�!�w����5�V���]��h��V����	>i�Ӈ
�a+O	���<"Ƴ5X���[�biX�:ze�ۑ2H�'�-�gad��\����������Z�d�+�A*���
�r���u��`��"_h���!��L4ň�J�_�|��k��O�>=~c�z����X�~�6���]���P��V�s 
P@ޣ+v�KcT�?N(&�1�����*���J�=�0�l)��4}�՞!��2jWq0�JХ��{�9	���<?zv����_��>{������l(��Uȑ�ǜ�&略�rѩ���7~8khQ�tX��9a�����I�r��Б�-#����$Ǧ�ݢ�
4��䉁�t��2b��$M�9���9�@��ܼ��y��Kc��5�N�G	G|�WM��;}�K�.V*4ِ��zԽ'�x<��+(dl��W�,�Wh	�����h����Y|i�����włH|p�'�[z��Oeh��ME��
�ۛK�|T���;
b��N#R3��ߣ\��W-.�WX4�4D�wQD`V�U�/2)?���u��w�4��dY^��2�L�%bΤ�Y���&� e5E��n�h��=�z ���*N�Bu��r���B�d<m�h~S�������W�ϛ�:[�,CJ���
_dЋ����Fv�O�R7;<�Z��t��6&��9%���W)�ݝ�c����1B֦���/��BU9�|dkH�-C{G��RUv=�d�\�>����~���|���m<��Vb��Ǝ�荻L)�Q[/�ǣ�9��j�)u�19'�
���?����*=GM�4�	#A�����R���x��n,Y����!�lBqn���0�[���;�G�rJ�`8\�w�ƀ�(��x��z���:8H�=�;(%�a�ഘ�\�����[v*��X�*��P��Ӂ�k��(��?�P8
i�g��Q~�zZ&�L��-�y��dGEl����Hڄ:�Prl�w��q?�����.�Y\@�}�2��y_��!��Z�[)�9���fa%����J�@������z}�+c�=��9��\k�J���x,��$�SU_e5������������i�;u��L�a1��I;�N�����*W�vj�r��ڎ��5[�9ZV��!�z9�@i=��l�릥ñt��K�Ѭ@;�S㕬��f�֑]�J���������e�:W��(�����[�Ӵ<��E�s�(8P�0�CRoߟk#cZ�A��Ek"b�%�ٱ���0�b@g�g�����.�9�9�|`2榸{�|_wpT���dz�]�q`c���ۊ��F$�d�٬8�
�����8Q�ȯ�֚��o�,�_�k��r [��y�>t��c*I���ׁ��@��W�I,$�ϯ��w�xlR=��i6�&���+H��v�q�"�g��uk��$��
�g9���&��ҩ#$h��.c]��{���F�֩�2	�>�F�FՔo�A>�\t����{&��ikp�/�)�-�!uZ�:4T��
��p��]�43Q�H�D��,O6k.s
���
n���%j����9v#1&�6p�:���&�fj�
�P�1�H]�8�a.[̗�䃜�Qʟ�X��b��ly����>ǛZ�W�Y������:�8����	��i���uQm��@��"FAE�uõ�]H	o����R��Q��Cw�%�9&�{�z�N��l��7�S^�]��Z�1�1���1��.����AD�����"��J���.d��6����'��Ь[�ω��<0�yhQq�{��|�g?yYRIN��=V�gX묰�e�椓�>Yw��'���=|К�.�^O�ƭ��]z�p<l��,��m=�Ԯ�o��?g2�A�MP��+·�:���OXX�l���}g?i5B�-��Zs�u�h擛η7i��jHckA�i@�O�uv��ab��:q�V%׵f���7��<~��茑<%�T�o�英ѹ6"��PD�5/�&M~lLMv3�쌂�Fc�]}�����,VWM�'H��VD��G!�7�/^��Y���gyK(Q��##�u,�P�4�L�9�:jr�Ba��(�aKS\�&_~��*KH̑��4#��>4.R�I��Cc\�~�����U%#�6'���x��(u��M5c�zQ:�?0��^�᳼E�{II�!��QYm����EW;@�~�6�{$�)6VC��]�|�Wǻ��M��I$��W�a�1�{�qu����]������Nhg�퉊��ׯ��9:��&�K�c�T���E��6B>�۠�����dG��J�~x�����t��:W=xws�.�����`�r�X��'?�y+̞��y�o���'�qpz���_����-���x	��� ��7{���l"ؒ�����^�9N��x�݋����>ys<�33��@�#|��Z�}ɦ�:k?�7��s���,�|��Ҫ]���.6G�����_Ѥ�EA�x�F
�m�5R8��+(��7� �S��K���u��oFSB�%�����4Uۄ��HD��׳i�#���G&���Ǥ3r?�o �PY�C�?iO�k��3��HN>oN�0��D�	�l�`=Uĺ^����V,^����H�x�`����L�{Y���ݻ���z��Am7�	���u�)ڞ2<��2
�]��<�+#��:ta�*�aCۜ/����Up��ۡ>!5�Tj]@��$�Η۰�����0�{�]�^,(�__R1�R��#�q�f�Sm�1�Q'�0��7�W������Wh���+G��XkU����M(j֏�:(>�ꠓ�����$ul�ٔsV��b3�E�'� �f8����坙v����O4M��^]�>Yyy}�j4�*,A���pM�L�$K�b����*���?I������<���L�]ފ_
}�"�Y{��Γ���F���*Gw��U���s����t��́q��L��Ц�Ir(���-'ݰ�T�p��@쒗�@�)�F��k}ғ��-N�,2U�(8�%2� �-�ʪȱ8[r嘫b��`����6����&~
�t�2Z�9�FP�f
�,��F���֧�e�ń�1�7����f0|���?-���f�;����ɻ�����!<�VxvM��70<��ߝ��ޝR���ֆ�jC4�<�Xal�ND�H���v3�1s��X5k�e��l��i�i��}�a��7](�!���ONh��dO��O�Z�L(��c�D-Nx�`/x�6;$�8�y�w6�~�Sx�29	6ǩ;�)X�܄��|�V���.�R#�����6
��(�dH�d�i4C&�=c��~�7�X}!�+kJ��T�A��u�T�������'C�}�rdN�^��S%�IiY��݌r�����uG��O���wFѝ�|��j��������
�g��kG����GFX��/)>M��fE-?ɺ��{1O�~���m��2}�FE���w������SǾ������:[�?�3_�ӆ��MV�fܱNM�@r��0���?۠q�O���U��y`��Ԩ��V�_ܾ�x�r�-�Z��Lg��`���;o����n��O�N^
iM�nL.�2�s��";�Q�b;i�P�E�M)-'	F�-����(7�v[�P������T��m���!�(i!>
�v��'�T�!���M,����(�Z��! �ƪ�s�%6	˜��!�i�ԭq�+w	-�OH�Ǻ��1�'��`#iъ�G@㍥,s��T�-���q�аTŠYP^J	���
��``A;�fN�o�'/�:�g�p�;B���@�7��f]\%Cž۝������9�����W��}����	e���_��R�n-���tPNf7�X,�92`��^�'���@���,�ѫ�Ox�_�V/����Ćv��V�uّ�h���Fp��~�9Ys�]�2�����Č�t`w��
t{n��
�����.��l
�'����!���HW���|V�q���ztÙ�&�	���B�1��bb�|��f���8A�ɽ�w���m,��i�m.�0d��A��N}�Nsa�N��ԗwHP�DbD��BFB-#^\��.�y�xy:��]c��dH���;�Dyy���iڝ@�p.G�ļf��	�0�Pk�71���F�S���
jN���z���
�U*�̚�j���(BG`�*�X�Y����˫|y߮�&!-ƚLx��pʽZ{|92	�qe�O��RD,BO6S�4�7ne�� ���ŧ
���>mP_�T�s/(a��\@-Lْ)���K��)y�9c�+�d��X�I����)�Ry��]�cb��^�)J[��0�X�ny
Y�:T���Lʭ������M��}ك�ٮ�V���$i�N8�B7<z��㐑��0�i��f��8T�ά����O�(�ϭI��Gp��;,��T%�{��O�"�t��  ��g�n϶8���]���=�fj���[bZ���0�
YO"�+��9����Cg?��&8����g��sv�LM��E��`���������vt>�������v�q !}�� �}x�{�}�}��y'<R���VPDw�L�����M�o��)m'�����n)+��A���w��{y����W~�A~�gF��)��]h�ۅ3����NTT�,��?�e�V*+�}�m�Ǚ�t:�5�������"u5��цT�UI.��A�AY%����L��.6Y��-�G�{~�l�
����э�t��SC	�/LܐO�t���2+��������M�yr�A�M�!��C���[�pQ�ϼGZ7�?w

�/�!��b�ъ[�_�����FNv�-}�A\�i�t,(/�?�7���O��[�D�?`.$@��_�*,��)*<+`J>z9k�jn��G��牟`�t�c��=��ݹ��B��>O���l�pDДOI����H�=;��ֺ,<&��N8�8'�q��A�̂�>�13_Z�au�1��3��6��W����9^���X���I!�ָDf��ӂU �م:O,.�&�1��(#I�MmB���c�%�+�<�����غ���!���F
�0[����k�bE���~����<4)�)��̊e3���\���,����#��4�$���˭��=(�����6x�A�.�R���?F���q��`�T��Z/�ē\�a�+%:�ЅŪk�2FáqF1E��O�w&���Ⱥ$\*Ot�Пvw��dj�ī�s<��M�����>>,���B\pnL5��^��DK��)�`	>1�c�;*�,3�r���F%>�B?���4*ߙȉ���Y�bD�[L�,c��_
u9�3b?��/.�G���a���:����/�TF�I�`����+߲{n����n�G�7S`��NJa	s]��
`�匡t�xPo�����B2��kؐB����4`����itE�É�k �>��1dk[�����{��?s�+�r3�ӋQ�$ɥ�)`�4��nq0�j�$�{t.n��Ǧ�(�1<q}y�|:����E��BNFǷ�¢�
ܩѣ�*���ƞ��=|���{����xQ�dE�QeYĞ%���b[��D9��G,ԑ%WP�sʷ‘1���+N��8��(���ie"~�p��q�)�	{#���!�h�Z}u��y6�Da���4p\tO\C��p�kL�z�AB�
�-���
q"ԟ��i�R�����J���U.�yGi���5��[�:]뺟��3�.���t���GDžA���0�ԉ�.�iG�7cu���[ס��=���p���h�Q�����pB����<�����lp�a>�<<�k����F�o�27'O����|�_P�&�•p)W%�߯7g�bN���JR^ک��-l�y�L���L�/S�T��՛�.i���&0��H��Ҏ�9)0������O����)#�bɜ�����[�qx(��-��'wQ������+�O��x�M�޹3�o8�>-��S�,�͔�2����D}ķ�&crOd�}##V�I�. :�0�碄cvt��"]�,���~*�pG�.��l���9lJސr�ś�+;(��2��<GT�g��	T'hH�BnuUT0�F����Z�Y���
M�ޝ kѱ��[��^��蜯)��v�p#4zY����Z �2��C2 �C.�����[l�S�
4|��*�@� `�f�a�b��B��/{�H��7�2g��@��-�!m�%£�#�
��j��3�ӆ�f8��Lo�֝�x�.�4	%��'�>��LJ���jo�p�[�V٘���d�英���֝�A^uqa�+������>����w��+-����s�DRx�-5$�զ0���
&����H��4q)�N��ӂ�E���RBr*U��q���]�34{�T�%�tJC��bF+���C9���qI�`I��d/t+��]��X�EU����j���w�����K�5'�r�;KIӺk_��l
�,|����U�}`wX\S�5y��*�@����s�g�¼�ר4):Gk���ԉ2��שru�=�شVy�Y��=*�ԫ2E.�uD���т�q�٥��?]&���{ ��[F��䱻�0
2�=P�j�	�!F��Kxxj޴/�zB�7.��w�o3vI�	�I	�sŃ�������7o�P���d��q�z��0=�ۯ�ZN�B��]���4�7����=��t~eg�<_����Gr#�����)�Fe����]ܻ��>�]GB��adR��8�d瓐��'kS��Y�N�q��B����gͿJЩ��V�N��vs���]5����=��Ÿ�t`V��O��?]�_�E��-ק���o��t�}�]Zq(9&�g�{4O��x�]���d�U�*��`�������$9���YSr�yK�8� jA�U�� w����^=�1�D�D�g�öZO)EL�d���$�U��NS�{X�[ZD�̾��ūht 10PGC��
�j��/�Db��(�sO-�rNI��T���N;zB�y�c�s��^�\��R?ݡ���z5�&7�/"�g��C�y��dJXIub2�|�p(���H>~|�E���ې�wY�	L-T�d�G�]=���<������(�K�; ~����%*���{��Kwo({j������g/
��<%��|��c$eYo�˪|0��=��_�x�Pe��x�8�!^��.OE����v��yI5���-�
�A/��g�E"��)ᑖ��cX��g��|a�O���X��G��@K‚��n����u������L���!��I���s���-i������*oO9���_KÍ_�N���)�..����Ax�m��`'�e�\2f�ò�����6����$���İy�ުs���I�ˮ�/d��D�9:a�����f��
KV�,Y�Y��Q�f^�
��Z�5I����E~���/�1�0�~�^O�8��V2y(�w�N�j%E��^T7�X@(W�Vzx��
��gW�ȁ\K�T�)��.$���:D����^(�`
��:�$��^�<_�mwGʮ��^L�
�����=R���h�I���Ro�a�������gO�>a�s���O�Nrt�n49Ō?�w��%�LލOǃ��o\��E�
�xr�_1W�{wT<��v��U�ώ��.�d�G�\eŒU�uJs� ~�M�f�
�߷�=���mn�sΜ>�N�񈩘3.�r���̤a�QA���� M}rr�QKV���~��:C��Ŕ�
G��]F�+q��l�>~�2��9��=$��4ܯ���N�:�F�"��u�j�غ7%	��_\�B�J�����P2��a��=��*l�H��KcG�Wu�~KU�|A1��(c��oV���(�#�-��9��� ����|�����ڣ�&��''l9��t��T3F��ɜvL��
��	�G������muo���a�_2�\���4�(YW|AA�| �FƖ�ڸXVg���*V�S�D���多p�g&y�{�8�`i(ߪOI-�e����SUB); 6��e��<u6�a��󩌖�|D��7S�!P�
�~���*��G^�V��:r��L�s\�9�%`��6��5���Lfk&1^��M�I6<2f�h]�;[n��
�]*�P�G�w��F5I0p*�8;e`�\mxp�9�f˩��KR��Re#�sq�ke��7f�z1o75�/��v��:���W$A��b��x%�L^�|�<}���??�����˧?�p����X�?�|�av�%b���������##���}�DsS�\2�6��A�&��Mô0]��_�Ʀ�(ٛ�l(�GY[a�Ӹ�Ю���Li��ԇ�&��R��n3F���O1�?��"��bS/#O��wp'�3/�sK
"�޸�������ܖQ�^�^��"9
�W<
�W��� Ǿ��Ag��˦&<��&�禌�����?�uW"B�nma?;�� R:(����y�?��L-�:)w��ǛlK�8T�/5N��a\O
h�e��v���̮u)�6��i����3o�����MMĭG�G��|S�Ϸ8��ŗuU�"��'TQ�y���]�ϝ�
3I�dl��[9��Ҥ��
��<�����N\X�e�ʐ�g����/��Y�\��4��,@���VIz����es��f^Y`.:�ܫ3]Ξ=�K��-��:���|f>��G$�#��Z�=�N-r�
6�@uF�Q4'�9<	�X>Z?���Yp�?*)��'�̝J��Sk	���
o�ID���/!�>Px�U
�#Eĵ�U^�7��*��H�N̴�2�w�l���Ѿ�3~V�?��(�ZG��L�
��~z�����͏�^�|�|�s��fȆ�@0}�.�K���M�;3J�:m���������ـ�Y#ur{��4�ם�ܲ?�~��x,�uL�Q�����R�-�7��N����_�����h�m��1��#�?�I�(W	�kXz��d��f&n~48�'��+�5g�қi��-hT�����2+��IK-�A�%��UJ>g4A�zYn9?<�ύ5Z�BA�QS��2c��匧���K�'P<}bi�AE)�l�B�/�o�s�S�('ab�Ȗ2��r���â2k4�]j�-:M�,���G��N�i_��ur�O��Q�b�Hw��K�֡��S�}Ӓ�:���paS������\�S�J&��[L3�WuVX��	9DA�.A��E�#ι��k���X���g#�?7-�g����R&S�O� Y��88IA��Ȩ7����$I`6ط
m-����h5�Z�����9�d)U��m�Y,�@1�����e����Xj<m���&���:�\FUB��h
]�(
�>\$y�g�*���{�¡���#o)&2<{}�}]�N�0���vX���4	��4	$�ݚNae�
���~��$�mm�&M;����%ͶY~U�����n�t��f��|���?J��4��a��5�Q=J�F�p��r5	2��44��za����٭�‰5.���#w�k���[VvR�͓\Q�_���Zf��D�-�*�v���A�ô�Ƥ�!8��
T�	`s��Pf��)-�NjN?2Y���(�'ڈ�5�Į��LJ��`��O
��-򣮏[S�r���Ǽx���}g.�����유��gD�Qf]�m���ib.����E��H�"�L-��f�
?t"��i��u��
r�y�I'+j��S�n=��
Z�����3�Ȫ��3�(a�xs�j�H�Xd}Ol�#��]��M�|kZ]lsO����~�N�����?�?K5#�V�fn�[t��n��!Q-���0#�ʩ_pUL\d���(Y٣�ҵ�6f�H�MM�@��g9ne��z������OޜpC�.+���La�NƇ�c�"�2
)����D):�,Ǒ�JDc���b�s
 {<�*	�X0�z߃�%�K	w`-h(x���IKs$CC'4g��A �)�Eb\ؚ��&��̰�q�|.Za��+N��\~�Nޯ���_)`a0G�r�
W�c��y�U�B�l�Q8�	���PK�uW!pkg_resources/_vendor/__init__.pyPK�uWIB/OI�8*pkg_resources/_vendor/typing_extensions.py�}�w����+��ǥC3����Z��q��/�b��;��$����.�����t��7,��b����%���`0���MU�I6��u^�V��-���<����m9o�je�U���ڪ6��k�����M�5ɔ���Eyqpp0�f��t�'�	|$���Q���E���ɦ.�E[�ɛ	>-��c��l�5�߲���y��%�o}U�����h���Wm
��×Y��_A��O닦���L=~����	SW��'������d���KF��gM�.�jbdF~�m6s �6��E�S�}�J>��j��_�/y�Xl��Y�]���YQ~�m\��u�檻<�;18�۟_�?os�c�mW�ż5��������"��.��5-��v�na���e>݌�l�z�M�����.�n�!a6/�E�����U�e�^�8�+��kaZ���vZ�oܐ�Y��a�ʳzZA�U�-,�,�6�#
O�:+�eU�ͫ���_jb���F]\�~����Z[�E�*�,*�X(t�2�S�_i�6�ҿ�ba߿���5�&[y訁�u�sJ����G���U�5��_�Ym;r�^>�>���g_���/��jf��~ȁ&,�~�+j7��U�ztvp� �9If�Na�/��כ�-fŪh�^>9��'�������S1�6o3x���'�9sM\��,_UWIV�ɺZ�"G���d�4����\�+�@z嚪�y��J��dj�L
f�(
u���H�j�?t4���O&�s�Y�:�����d�0�E�L��C:_�z� ˃�]�|���R{tD�ϰ�����y�]MW���&i0>an'�E�\ ���e1��*�Λ�`%�gM��uѬ�v~91����2�J��^��
����a��
��6�������@B(XH��J+�Y��m��L�n���`�@������_�;�P���7��2WĽ�㣷�;�/v�レk��7<�4]�>�M��li�K7�3Z�]O�7�>l��h��i�r���q��ґk-�M��s�xD�%��ǟ<��FIE�cU�TUr3\g �X��+(;\�W�[�1�>����g9H2��`�� �[X�oA�M(�Aط\���^`v
p�iQ.+Z��89|,����\V��b*{��
5Ii��N��N��$e�5�
�#=�o}�c	�C��y����u�^=a���=�k�IWE;���ky�4D{����^�~s�����\�d��G"t�@�7U�e2�M!�~�P��J��E�@����u���ż����%� *<�$_��o�5����;�H�ӓq�MѴ��`鞍F�1L*<{5
��7(�~8.�Q���A��*�b�ȅ����j�X=�rg�\C4=>��d!Tj-|�VQ��Q��Q].t��~��@����N[5����
��K��#.9l�'(ټ��y�
�5 �]y��LpWρ��mXl!�bm��$lI�ޒ�����3���d8�3SyM0&_�J}-ž�M��Ŋ�M��-[ms)x؏���c��l�Q���޹q6�<���W�t`Y�m応���F�<i$K>�CO��Q	+�)<EI�X��/bDS�>XJ��
{�(C��=�W�z^d
���lJ���y�8���2��U�^�E:�{�Po��t4�v;z��7��侃���}�:Ҩ�Z)�P>	��P�&��)EP���C`J�2�'��#"K�9��6@��S�u�0�a�F@��or�G�w�բ���7�^]c��cܓ�]%8]���doF����4x�^�pD���\��l*8/ �7E~e�)�`-ؑx��<�2K����&�4�I����+	&���������
�&eP�~��)�{��e���wt	؃ю9�c� ����n��>�Q��掣L�%�c���ȹ?�|���:30��Ѽ�|��ӣ'g�U�A�G�]_�'����ÄY�KB�V����@���J����^�;��a�����B���زEu	J���Dt�g��s��Yo\�n�0�7���rK8^y���l%��,*�O����(3-
�R5�YT�cX?O�@��|j�)�
ab�#a�t�����@F����%�{;#
��A҂�.T��N_���Ϗ,>{���>5���CܵiyC�q��G1���3�?�ʒ��].|N^|���O����hϠˇ;;̍|�5�4��59��L�m�'�ה�a�\)Y	��-
m�"P�hO���(�S���\�8MK�!df�d�m����~$0,��e�����"�j��Hӯ�|�i�p�N����?\�\��<�l�Ms�ᇳ�E3�\�F[N����v��O>���=��t�K�8[����T�N筲��*iٹ��S`@=��ժs�lL��%r���ab���XsL�_dM�%6���c�����G���3�L"ͽ��Rl2B�=����}����{�M�-�����{ܛS�1�5�B��ὗi�-�9Q,o"��sK���ܑ���q;��h$�5ю+\hՕ���R\@k�@΂}Ѯ:QϛW�[�)���ap���.`��.6,��5�
�U�j�
wU�U��I�o
$%<�7t�<~���U4��Ń:��J�g�G��ˌ\�NsG��<�m�UK���F�ыU��h��,��6,�%s\�"�EE?c@@��qby���QW����v�ݲ�VS��F��z>VТ5O�Ծ�XĊ��ΛM@�#�q��4��+�$�$Z�ޠz��	��3ۨ�6���MV̝~����;� �ң�33�|��0�!�coH(�V�1�*>=nR!�懓��2��|ֳsF�N���nخ��5��d*-��XG�:)PGw��(p6�с��k��.��:�/�w���+�B^1����P���:e�8��	��*�2�ca,��
^x��ͺZl��$��T䫢���,����T�
��/@��%ړc��
hiw�g�Q3��S�*�2N�_>�	�@�dM�/~i�¥�� ,;k���*vl�t�j�3�6W90�U6��sUᖴFa�^B�EY�Q���>��6�\VWW�$��j�'=��[�����ބ�ao��)���hJX�r�ݕg�-j��6}�ou�氲�ʲ*Yt��z�O��v��	��b�[Y$��!�"i�BjdC�/�H"b��?4z���TZP��?���.��E�7	r[O:Nà��j�faï��
�3��G�{E�fAy�(Y0qi��Ar
#��:��#`/��)$K=~�Ncj�)~:r�Y����o:=�_��������^N��TqE�$��ؕP��E�pr�#��!؁
����(�[�
6 �,�y�rL1w�A��N<
x�u&$5�V�i?�G�l�zj���;�QY��W�)�!(k�1�a�L��]�ʓ4��:!qMؐ��Ծ�˩?Q��-͓����f@޴t���'ҡX8h�|��_V�E�:��m�V��>}��#ߴ�p�TTۆ];�ź`�H�a�&����O�e�b
��k�x�%7nT�Tȹ������:�����l�с�(�j����i�*ȉӽ������~~q9
�	*('Qݤ}�G�?L����}T�J=r�C���U"b��4��[Un��_����� ��/��
=80ζ�<9�wT��⴩L���}*�¯�qR�ӏQ���'�O�닓�߼x�����3X���O?C�,����wl�@�k�\�
��_�g������?��r����_�w�>3�9��o�)RY��8!*��l9zY�'WRY�����������{P$��jĀ����C�T��&CQ4)�R��R өz=�ܛ[�����qb��%�� �ί�'�K��U�F����"�ѧ�)�X
�=�o��A�gh���r���G�����u�/�g����IU��M��˨{�_�iVTz��K��iQ25p��Oس{,1�Y�un��m��S��`,����!.��y�G>�l���(A���[�E�7�WU}1�?�~&�b��7�M�^�Es44]�����j)�V�KM��?��ۘ2#����u�^g׳|�-��mZ��1�������f	O��h*��k
�b�r�<?*r� ]=�/������be��dU]�L��]�8"�����`X�z��lS��k2C��:��c|�~�s��5[h׏��ip�7=H�"��������48NN�3�\T{/&
‹%�e,}YÄ�	�l���E�`W5U�H���US�^��
�^��߬��߱��ʬA�)@ڳ�"]!�P	�6/�H������.kV�V�;�F׿�
�g��iml�[�|�»�UXQ�`�A{v��ԁ�]������^:�*�3V��%�e�%=_��݃�T�Yg��	?f�e�z��R�jw���;��BK,��[�c�3������OǦJ��Tz�;���UQ�
��#���CRn�����v���va�vkv=����nM�����m�,��r@]F�����������Y0ن/^�i�ܪ8�vw8eY�QV���x�y�^�c���h�sV�#�8t�n�%�ݷ_l�����;�݂J�
gmv�4v����O>V�N����!�V��h�x{�������u�ϳ-_?��p��_+����e��WDv]RI�0;�ɟ����LB�m�v+�ن�I�|'(�S
%�&^Or�'���W�g��n��@��2R��'��1N�r��gϗaк�2)��Y�Y���{
���cA�1��V�>��C��K ���zv�Ǵ�L���Z���z��N<p�˟�.(�=I�"M��!"�D�ݪDr���˘�(�*d�\]�}�=VV��t�j�(�K舲K?H�lb�Y�w��|a��Z�j]�b֙�Աq~�t��K�_� �n��jlх_OHR7��9�:HQ��
Lq�%��o�(#�+~<ի���	^��
�\�c��lW��yuQ�8�jܭkX��
��v��?��G�
���w�P�c2y�!)}{�X�"�N����`<C���K�_O
�yN�p���4�,�b#�>�,a]�cm��W���Ѻ(��k^Zd��q�@iccX5x��'^�-ն2f��X�
���ྒ~rm:�F�dF�o�-�؀O�'g{���ݎ��Y��['��z1�c�v��_�_xٻ/u����!3*�1�[��$/i2]�,����Z�[�
�se�d��.�e�zH�W|�ؘ%�Ȕ�{�.)=lH)��t���,�wMC��K�G��<n7,�;{�m�ғ�7�u��us�p�e�N|�Ѩ ��U�x�?r�`�m�7���u�	�v'�>0�Z��P;2���u)ؖ�����Ǘ�B�̿��v�_��"��΂A��N��N[��9�����������Yu;o�;r��>&�6���6�<�c<<�JG���C�(�J�Ů?H���YC��7?zC[�ߞ�	�ߘѼ-�#e�W�W�Z����8��㪾=P}�$��u� 䅻[L]��Bzةb���ɗ�j���BT�t���99��Mܢ8�g�8G��4<�k��D�Yy��4se}l�����$uל�.���?A��?�@*8ŗ)y�Fz�������]վ0>Uy�(-
u��z=�A�b���>M�ӋU5�J�C���!vO��l��?�e9<�g�
�J�D�B69pNX��
`�I�-��g�|�񡼦0��!���NHzP�
L��/��c�c)�Sx�\�Q	
�f8D�`���&š���C��E4ӱQu��t�*=v!��w][�h��a���my�����>Egq�DQ{����<{�[�| "C�«�jEK1y�T/��	vu��ץY_-�!��ڏ�\a>�M�Uo�9�؂v�I�֯���n��ߟr���1
 ���H��h� g
�	�n�}u�VZ�J
��je�֢r~����f�vݨIW�(5�S�2r�N-�,d�z|���Nb�1u|�v��1Jw�\���w��x�DTZý6��������~�wҨӣۀ��m�Q�k��x݀���%|��ΫNl�;��-d0|�կ�L���Bqe�4���7�:�]h�V8I~����h�Y��ϼ�h.?��d�{���)K� T��9#w֔Ҕ‚6�]�4旈�W:v
�b��7�~�%A7�p�
M�ݴ
4M���]�i�t0��k��ϡ8��s���蚍^sr`��K�����U��{薅���$��T�0�j�<����Ծ�bGu �%֨���=�oԙ�&R#!�ێh7[�:��e���]�R��r֗6-nw�6��%�D�f3tV��,��S\��(AoO��W,��&��a>��ӏ>�_?�<���V[��6hA�Z
$�骪��T�ţ��^�(r�=b1<y����$�y��<<�A�@S���3�'��|��L42��D�0��/��]�0XC��溒S��*��?�$J�}}ܩA|�E���=��:�+����Y��D���P�ѹ�9��pE��C�^�|�G���%v�~��A�Be�!�'?�E�̱]igq������jK苰@�b!bw�H���H�/�t�����ۤ��p��8n0p��K���djT�q"�d�����>=<:#fH�4��i,ϙ�4<u‘�5�n�.j������J[�0�,1�BA���"_-8�8�PA*څ�I��B)�;#��N~�l�btWS�vh�����o��דM�IU�t��d��w����t8@��;b��AtB��6uN�-�]��K)��O��y��*��������>j��uS��nP!��n���H�x0�c�ý?�L�B
����]sO`����F���H��50W:\>A�������r��f��A[-�������W�E�{3y3.q��6�E��0��CuBzH��M��y�nGH���MT���Gu�u�/)����(#�"(���h�w�)��O!j�'���hB�x�⡌n�E.�Z����yX]D^���1�h��a$�$Y��^C���G�$���+›����|G�]����UP	7r_�Mݦ���IiwX��l��N��ӻ����Q��Hг����D����Ep�i�h%4��v6��AՎ�\�X��ʃ�Y��7��P�ܬ�s�(/k��{UC���N\�ڨ=�,�7ELp���p���_���ߍDέ��\�m��\�/b�n��YT�2��|e���܋���2��8�������<�Z"��U�"�5�
�$��=�$�BZ�����&�R�	�O���xD&������=zF�/�BϸQK��3i���h��JT�R"a��tIq�0|�,J�/|���o���C��F�r��gR�Z�.vY�(Pw#
t銳6 �
�w�hE����!0�^�ƺ�[�euUN���w���Ω�(�\>>J���dy�������U&Y����錿<���m��^	�Bo�	�S6�?#F����H�=�}Œ_�צD����z��,�X����m�;��W���@o�;z%�>4���u��^"��r���݅k���Vk����~
]�\R��
d���M�����6�q{�j9fEP��T�?{#ȨS���4��5uoһX!i?ڒ����)z��HHz��3��ݻ�F6	؃7�MO��`p���%/��y�F=����E�ʭ���q\D2+v�R��-`��^ʅU2��R�QVjQϔZ�����y�*�Ifw�j
g�O��Ժ�����v�þ�yU�o�M6�uv���†�
�A	i�vk�ÂQ#�^K�U�S΋�B2]�wd�d]��"��$����~���d��~���j^��y&*Ŵn��T�y�Q/X�η���qx/�i��y7�����\ÄO�L-�"���E�����U6�Wk/��Lc�1x;<J@^^��'���EU-���S�k����HW�eT�~$_!�G�X�,��`��1t��B���nH�+Rf��cʎ���)s-�ُ@(�K���<B���Cn��2�6dU�Q):����#�`�$T+���Wn�,,�E�=�o�$��hjL8�=a0i"�ff��gB��]2@��bL��|06W?�$��%h��UUs��d��G'��@7
�3���T�A�b��/�|�섾�R�!��8`njFg���0y�\
�R%��YH�P{+��+���Z~j7=͒/�X�w2��hW���`r܌<��]� >]R:�s�O��L��x
����ŦC=��{$+�F!�G��
����z�,���A`�V����'���)��Ttz+��μ�	M�8i#rX�	P!�h�o	bN������q+_�v	h)7�K��MZ��N�mL�r(g����!�M׸?��+9�<�t�ާ��耍�������Vb	�a2��ј��2+/r��I��P�f������}O?����=W4��֮b��$��s���$S�n�%�N|I/)���}3��;u�;�D�:۰�+�����&���
���y�A�c��j���P�"�X����s�78�����F�r�����Ky�e���z�;G�Ա*�{m
��̫��"�y@㸾�d�=ȁ��3n�W�
p��G}�dٔ�;������Ŵ�e��[	��9��.bB����C��q��������U���v���Ëd.�3m�NYagMCJ��ղ�͓b�gdE
e}NU���\����S�:�0$�kq�]�U|�Ә�Of�h��E�?m�Hzs�G��=�$�����Rp�e����n��R�`��[8C�YOOH�}��Q�ѝ��
�^2T̏���wx��鶄�6�0�;�mÑ�i����U�b�`9���ҹfD/��nL0&��S	p6�����������f��A2�4l"Z�G����X$�뵾"D!NK��V��ʿ��<q�M�_<���ϓG�����2{S�ҥ]7����3��Kag�7ygr��-a{��`s5��eu��@�ⲟ����OY#�H�a ��/%�4fX���(&H����#�ȶ[��B1j��J���E�QT�lAWs0H���Op��1�;ݨ�H�U�M.�8l\aG@#mJ$q��*&WZV����/��N֍�3k+xF%�	у���4�a���: ���7t��p��ԋ|
��b��N�c���u�l9� ��i���ݘ��a��mC�vv���s�W��.��_X�:�;/��N�ݼ>���4���=+K�-ݡp��Pf'�R��GIj�?�^������>P��#9l`V��d�ϒ�v�*��ӗ/x�wB�ʎ�l�ڠF�������|���G�O����iLPҏ)��AN�x݋83+\*���9����s��vf�����'�KKN^�0o��Ж3lݶ�:l��z�{)U��!�lW�s�i��E�s�*�C��D!�%���Z�k�S�^;�s�Z����3���fW�e����D$3d��=g֐�+�w(�c��p%4��38~`t��=�z�$������er�H�;p�:�aG�\��p��W�^ȇ�+�%�ƒ 2���{�ubꍻ��G�u�.����¸�<(�j�4j��������ƅ����p��;Ed��5;G`<k�_�4&a��#��Pu&؏�^�?��	�����Eq��m<<�#��B&��y��Wت��*���(�;���G��s��xL��v��@�o[���;>BV̀�?�xJ&�!�9x���؄wQ/�7��ޮ����V�ą��x�ؖ6,�r�|N�^9{!Z4A�m`y֞b�1J�d��� I(FӬ�*��G�@�
�r���E��e�b&2�:Oq~eKt�;�t�����y�kt��#�J��$kS���6y�2�\5�b-���9��t�����?黜�B;<Бk�'��P��(�;�ÏC������LO)�
���;2K�b��-�@��3��Y�{ڎ��_�%�}o��OG�c�%l)k��X��21��Y��dR?�Y��8�o0L���NO���	���}��5j��J򮨖�8e��\E�VN��(��P�Bϟ�'{�)sx��u�P���7�Q�E��L��U@{@s��(�@W��Ŵ��S6x�>C�-�M�+̅�Q����F�&��3+��EŸǘx�z���Qǻ6�жq���`_Z����YA.����=�m��b��Oqib��8ojԸf�:��G��;�J'�gi:vKR:/-&���ٖe0��"{\�L i�D)`g�|[Ƌą}C�cF��f�}�c
�߇�E�XC$a`QM䊷������ѓ��ϰ>'���5$��1fW��l��gJc�]}z@:��Ge�����:���Z�@���*\'��P��t��x`1������H��>zF!��a�/y+:VV�Ve��4�ɋ�;NLn�qB1�	��&�E('|R��$6I~0�2��"v�8#�u���	D
��+rFq��w_qr\��}eL�I
�ҝ�5�=��1$pGQ��Giv�9!��@O���B�
�99;�!���=}�^N��)���S%�={y���8�>]`d
��Kwg��C^&w��1%ڦ6	���}�8�H�MvW\ͪ��"�fI���
K>+
:р���d��(Hx���h9�=l�5�� <D�D���ɉN��U6h�p0
H�C*����i�i;,ɥ��(^���#�{��Oo�_�#픊t�'cp���g���fA�[7�88�NO�p��~�o��a
�A�
��DXﴸ"�$MG�40R�?���q(��浱^;�eXl<�����Qc~�Z������nJ�3�������p]着)��t�8%MB�1��~0g"Aa��곑g=��a]�휾�	�g=��=�îZxh5���nj�s���٧ZKN��6�o�i*���5YKzʬD�+>��9FҢ��bS�:X�)8�yh[��{<�'S��:g��7�v�S��YU��v�tVE��5�&E�kN)%_f3jK���M����1�Q|k�ߊs�+8��0��k���f�%������HP=�w���O��z>;����k����ki�.�L�0c�L� %����ۢd�� ���8��AK��g5�s���"�L���]R[���}�O2�Y���/��JK���RF^j�x�(�"��>"#���d�wf�w���e�4��,�1�E�1�y=�d���|fFw�O>���~���$d�S�i���#��� =����D]�3!�z��=��,���	��m�`/����+a��c2Xՙ��[Me}+5�:��=�=b��q�\�+�mC���R���Lz��2�?0���cG���"��<m�bԸ�=��Gz���.8��!E�R�YӺ
}r�$�rTnm�QO蒏��~A>G�򋨆N8������q������%ތ�eO�bŘW�����B�:d�C�MXi��U�����r�S#.u#�[q��gW��N�)��'��c�
Y-�N��p�d3���µ��XL�E�*)�[�nk�"��K�:�ң
a��;#b�U��H�e�4F>�*$�9��X��{z)ŷi;�2to7�c��o	Q���&�Wy��n�]/�(U��I���)[��m�J���C�}K��(�n
gT��:f�{�T�KUc���%��K�.��##��VMn�w��2���Ğ�]�?;�����[��*MXIuϰs�^%L�#�n��H�*}B&~�QMߛ���{�~:�{
�4e��g(���x�7x��F�9I%���Y��L8��YI��"	����?�D�_1�f���Mp,r�K�km�RG��t�i�U�f�>��|Yе$f���zr�㼼�Di+{i������vEO��Ҡ=Kq�v���P
7뵄'�ҹ;�,.�0�����/v
�lȕ�K�~���DAs������c����PG:{~>2�G�?����aL~�^P
�G�Ȥ6�E����Ms
�L�d��I��B:��Y�'�7�N�����(5��Z@f'�U���"�D�,�Uu��E�<rj��h[����κ�Oi ��l��n�,�Rg�Y{j��(�E	���Gr.p�6GV�ڑZ�� ����f�d��*3a@#I�'�t��Ro=�~���t{Ua����0��|��з(v��gVn�# �>������}���o��}E�������Z9��:w0p�z�,�p���N�cZ����фr��1m�5�!���9q�Qc�@g�����'^���`I���q��O.&�w��(�0|I�	�
7V|mq�E:~�\F�T��A�5�䬛�i�077�f^������)���?K(U�	��k��������VJ�q�e>g�G�v�2�#c���W�P�� �"��ת俬$|�]8��92TI���H��6�}�ءCS�Wt�̑��^Ѯ��	AD��$o�����T�ґm�߫p�ܩp׍v[���0���a0��G���<
�Ĉ���������7�D�嗼�*Di+(�O�Lw�z� ���.�6�@)	��|[4� v�n��h�L��4�u.0�̙q�Z�BÐ�����櫪zM.��`m�=6ƈ�-7��*C����`G"�q�62
�}�+	�j#��JR����m�p?�g1�E���x�����f0N|�TՇ��U�B]&�`;�g��|�{�yt�5��3���u��_q��'�CeO���
�36��p"�y+�Q�G���D�lsn)�kH}~c��9@��n���Er�3��Qu+�\�7�|z.7QK悓kK�"�%����c;��^jR�����-���4p6�X��-!��������̢�<$0]Ů���D]jVa���-��ل4�,�R�P_��+����쾾�}�;(�,������v���I��pHE6t�
{�5�V1$�G1`�ʮ+�g����ʆ��)B�t-������*�4-��Kv�V�jq���j�vG�܋��8O�>�S�'Dw�s�������-=wn��߈uOb��_��mV/�9=�57���˩�����e����r#�mբ�ƽ�0p�
�61X���������r��9��9zy!����͵��;Vr^^��*�6{�IE�<+��]Ȋu��V�K=���d�+��CZ�x>�,��������xŊd��0B�NP
�mr���N�Bm���+�Nf����!��X`̅�j�v�-�%	�o;Ii� �++��/Z}��]�����f#�.54�t�VH�Ւ���4D5�qƋ��LS�^&����Q�@M�+[f��i�̛�,�&��y}R3sk��)��B����|B&T�]�G�h�4
��q$+XsPI�	xt�X���#勄���(��W+	_��pv����b��LK�kC`�E`J>��X�aa�0�����I+슴@$���cZ���ﲈċo�iC'��]"#��YD�� ���@�t�����x�-jz��v8��s(
s�Eh]0
��C���he ����4��+It��A�ⲯM��ښRqvXg;����x����0��q&�L���[u�Do��A4Go5�tU�D%%j5��F��]dbݖdd�A8���Q�pZaȢ�es�RD8�
�n���y�W�u���T�
����/$ynB���M�@ �y. yv�zie��G3�̊U�^C}�.Zh�mˎNɗo�/[�#�ֿG�Q�r����ů"vzT�8��H����Gd�_
%r�V�QOLtw���r(��^���еqÿ�;��_S
O6��J�}���C�^H��O�A=�h��W6������ޝh���9�&]�&]�&]�&]�&]�&]��7��?U�d����rQ�<�
��C9ޙ+�J����J�׼{pC����C�W׆������NJ��<甮�-x�Y��ˉ��ҕ�y*]9z��#!Dl��� ������6��C~��p���X���n8$z8Z��85�^��rwC/t��a��շv\*7���\K�CR�G�g���̋�Ʀ�J���{}_|�\�)W���=��e"r���K�j ��s�r�s�4Ij%ޡvÑ?� C�45_�F�Φl�x�T<z�=Ngq��D�I�W�=�$���C��X�m?�\��+�L������׳��1U�d��>��ϞԤ��fB�=Wհ�p�����g���r�!�D(�x"F"�����I�0���M$:K'�^�o�r�m��-נ8*!�5/��=n��@&N���!���9�Xhǜ�(��f�c�D%V�Ҁ���3�of��w!��^8�`�/��C7c��[Gptls���c(��4z-�s�~?S�Hr��#��&�~�9KTj�4�47�ږ1L���ć'0����n�’���I0Lh�̿
�s���
������i7`�t�Z�w�u��gG\rG&M�_��#.n�xn#(���ޑ���x_�Ͱ"���?Mͳ�.M�=;��J&�:��	XC�pX��»`E���'����99+�'����l7c���7�23Ox	���n!���6�?�;E�כ�������S{�^���C�|u�@>��k�Q[�يoi�<�Z�eO<���6��Vo�ܥ[k���m�><=w
�da�S7{<D�mb�[8�Ȃ��;�H��
�ǛƏ?��3_��g�%���k@��xi��5�䅗�j�B�K7D�4X}Ea�-^߃I�n���4��E�jžWR�J2�G�T�%���t�C�/%����:��˄�2��PǠg����#�O1煗��t��#�Bu{vǘ������"YɨR�J5��}Iś�����r��_���0r~�x���p��k�C�Εyץ�ϻ#���y')g˳���e!��]��2����K����i�=|AG�c8�]a�tH�o�s��X3,1����o���u�]��O��3���I�KQc��/|�k��k%�Db�#�e�LyR�@'.�3T�.̧����Yz��~��t'QX~���v?~xߍ�?~ٿ��4�����'���o%J*�=ٝh;_�c��
�qߨr�E~��{
�x�Dv�f�Q��pl�I�Y�'�����tI��YQ.��j�`�rV.I�x� -8�Аg:n�@��,�0
P�A�t1&�̙����o��j�y��K�&I)n�<��q���A���+&�t�u�4SO��Q��P���7���&;*z����[Λs8NN��� p����|'O�k�wqN*Ii�7�K}��7����s��U�ד2�}�,��0��v����>���y"2`ѹ�V+
.taBG.�'V�&w&X�P56�8���� D���j�/�+4o��ۇ���Є�ڶ�`����-��	�J��C	jf
)�e� �.V�Ђ�]�k�������B�r�4@��60⒓F��+4�ߎ#��4�kh��zv���k� Ƅ�M�A�I�(�V���������DH�Y��g����="���ҿ���e�~����8��X���'?8X�KKA�5#���U�1�ȬIߎ8���h��X�1p^�_�>��y�`}��"�?��;qX�>󭠾wd�?�g�4��?�\cl�-3#��xE����
3����	����ل�rrP~knr�<��we�h\����(S8��ɐî�	��[_��j�ɨWY�.���o<m�#�
�C%^�h՛t:���!�J^pX�6��c��W�D?��b��.H��ږ$Ge�J�b���H�sx�s�뢍���t׏��-;�'����*"�a[����u=�Ȟ(���7 ��r�)�N�)�𦮐�j�n�-�e�8�!�S�J�ٶX�p����PaRߢ"���K��0F�'� Ȝ�����2+/�$�Za�3�6������.!��'�b�#�mZ8!�]
!V�!e$��kL?sĬ�Ԭ_�?�s��o����~o�夷B�0�T��ߖ5�$
�=�뽮��:OyӃ�S�mR>�	|јi0lƒ��9�ɴ�}��w_���(�UÉ�/����q\�����NOV&!�!��[���!���zs�S'o86T�q슼r�!�2X�N
���Y�yE�:��g��������S&�Q��j��Ị-QܜJ�a�
���J�/�i�{%ߚ�O�볱
��%T%�|��v�=��N.���[Z�aK�'g~t��/]�s�`��6�Yt�[;��b�\��@��e�&���t�/<z~�h�v6���/�� ��ɠ#���4&�Q�;�a�|��Q�S�a��9J��*�����TbΛ]��s����\�9�?�6m���o�}��b�n
�s���݋$��Í�9��=�d�G����-a��0K��0�or�<TFF���m�j�<� �"f��{M�.�et+]����ՕǺ;#��p��m(�@��p��y�8���jW�g�w��Ms]�Ƴ��R��@��e�4�.��6�V~�Q?',aT�p-7x���8xUS��5��Rv{�3�t�'Q)�4Ѝo�j%5o5|�O9Pb\T<�^O��x;ێ�P��;�^�ޡ;���CR�ߥp��͏��(�2����R�hU��.!��"Go�Y�BA3�'��sM�TO���9G��7�����&Q�����^��̨x��gS� 3���kP��q
�3�Q�����瓞>�}�aa��GJ����Ca�w�|@�P#x��T
E[��oG���/q��Xd��N�瞣g���XX���l�DI�ӯ:�V����w���Bo����+x�_y�/yi&:1�+��m�]_��Dc�(�1�u�:���4�]D�m���uܳ3n��w��˽�ʩ�Wྲ٬
�}"���%����9������.�W�xd���W<	`(�6�m/s��N��|[��TC��:G�0�����Uǥx�s��YXF�٧���4� ]�A�S�	1�Z]E�e�uU�#���f��D��&��N�Z��i�?B�W�BH܆x[˒װA��#�Y���?�,�`v��cbE�Isv�A.H�ڇ�i�"��&��f[o��r�lRl�M"#�[�T<�4yW��兑b����h�ޢʛrآY�n�B��h��I��(̀��/QB�C�i������d]��ЯBW�ͨ��~@t��R�;@̂���=��N�]@������+��L�v�[���s��^VA('p
sX���{Q4d�f����g�0��T���v����0����1�U���7��Cs��
�;�@E3e�K��:v,c��XO�Y�)��VY�!�
+q
G��ȴ���^��ŕ��V��K�
Wּ��#5tm��RB=�ڰ���*�:�A���h��v�,Y���NQ�G��$�8�\O�
*�dq��t��,Rm�V4�X��/_�g���*��j^����
����™�pFC���*���f��QU�'9fA�KdY4c9]ح/���AwT#`l����q�z�3>!R��d:���e1+�ELݼM-�rŸ���u�u�K^6�1~�1��r�K���v�9;N�t%��A����$�-�'eh�dŹ�SF�}�!P����6�9YJ	���A"������6��u2Dq����3Ӭ�$5�4��iD.W��
G4��ćiH��؟�qrs�Qv�&j 6w֙�f�
ۉN�_���481����e}t[ū���-�<2��nu$]��;��x�H�v5�^�i_7�f��8�F5J���T��w�W0���ۈ� ���ӌ[�4��o�E�|��pZ6��oN8�^?κe�Z�)n�Q�:%��<~vQ,�5��o�����+N����OPQ��|u����ȉ�{��A��й�X�r#jm@�έ�#g9��_�"i�iu(�:�/Gs'�ܽ��ZnA,1�C��E��\�C�}��垵�}ϕ�2VU��z{��p���ˎ�:�N��7�GyR���D�R���z��t:uKo*�Ԝ�\X����z�:1�+����o�6[����A�����f��t��nn50ys_OLn�c�"Y������Ǭb(��=����P��:���p��r#���L�=��V� ����}��U+
r�Bm�E��y��8_wO�p~�3�M�ILQ�V��w~��X@B����*'Ո��~Q
OU�;���*��p��oa1���a�&ϣ���jѫ��i�P��]Ҥɽ�&q�/�!n��.�PK�uWB�q8u
� pkg_resources/_vendor/zipp.py�Y�۸���NXN��-0���I�P�Ţ4Xh(�s�Dzf�b�>D~��I���(Yv�A;h76yn<���в��^3ٮ��ԵJ>u\O�+e%��R�^�m����m�xҕ̆u�$�vV����A�J�M*��e`ѷ1���z��W�m
aU%r
Ŝ�۾�(��\�D���Vَ��Z�)��4�‡�{h^���B�,�x/�"��黺�2��E>��qc*{����DM�L	�q-
�
�wN���݋F�>�Z�T��dz��ѓ�a{����ґ�c�m��fcv?�3z�n��H��@J�e@K*bvIx�ϒ�(��B�fL�D�J�"Jy�����t�^�컶�!��O$<W�y$�!�P�s�H˲���yl��Q�e}٥D��D�8sg���좉�,��%niyS���^������%�K�%f�ˊMغJjk��B�N�"(߄
��f��D�L2����3X&��^6�����\J�,!��j�DS�L2��=>�r�o>qkERkZM_G��r��F6�V��e�m�rê��x��U����"%t���)!'4�4�;�Kyŕboں��oe�"���?dw�ggz��:�o�MڋFz�M+��)d��3�2�(t�#?�;���#�^��ׂ�l<���G���y-�-̊	�S�p�`bU�� =,8���{�D?�ռ��3+e�pe�CJԱ���de۳�Lw�#��˾(L'qT��3q���$�(��0J�:"M<���9�r�%�F����̙Z�;�΀�o�A�
�=e eH �{W�����	�	s��&��0LH�"S&$�.+*!���o�E�ޥ�#�ȣ� �ص��=خ�ʹ�:�ۮ��TB��}X�{�0j5�!mқ���|�?�(�(���Ϲv��,����Bd���w.oF�v]�v�$0͗��;q�+���*�';�d2��P�q婬e8���_��M�����	r��~�n��H�v�hJ��+�W����!rg��)�=��-�B[�ڣ�Q��m!���&dI���X&ך.�'��Pz�6Zp��Sxn8[XΥ^�TVL<��M�4�.X�;YT�_B*S�cw��'!NE�5ڀ�ş����$���tZ/ᢇ��_���/��������^8�-
��$���������Q��OK ���HSJp摁*���T�Lo��jط�&I�Q��ACxrW��2MKE�ԝK<��l���{F����L�ռq>x1n�6��D(asD��7�$Z+�|�b��@�C�!�zq}=V�y�|��/����1��'�v��$-F�|B?�)&��=a�|^pͩ�i�?�P�n�Ki�S��LFĀ^�q�%�=�r�ڜ������#ζ�y~��؊1e�	�c�Z�[��Hp��=�{3!�3�\�*�|FwG�Ạۘ���i��D�Jw���Q���C-���mG#�y
0M�Z	j]�����E�����g�ʚ��MA 2�B%�O=��	�����0���%�C��j�J:��X�%���|g�jq��J(�*��*���0?c[D��3�_6'�Y��$7(��*�ySZuΚ���A
����	�YU�� �^dNQK�F��Z7����i@��i�%
��}��=�ʯP��X�U���U��`a��j;��
�M:Q����vwG���o�wwv���s󠹼�ؠV�]��+�0��6���^�ˆ|�U��_-�W�ww�r
��x��K���:���[�j�
�-H�.���&Mi�@2_��ݬ�s�B��ٝ�m��?�̮s�/��#JS��w��zlܸ�]]����"2�
|l �<Fr߸�f�?
�5���T
�k�%
�����ر�;����L����c5c�҉\"/>�8�af��=�}�j/Loi_.h�3���C6�o�I�rT8��
�}y���nF�痧9Dxl�3:��fJɉ��1�@��ő����=�=z�����"�}|��3��L�d"n	�"�W�R�4��5o�����F�m��R$1�mP���x�xa�>=�}���1D��P�����u��驜\!��D4�n
�S���g�������L���o��uF��iF�
SKj)��7�)�Ԣ���Q�ԫ�B{6v��&���y�;�۰Gѥx�8O�GGx��p���
=nYL-ǘ��j3=�ozq�y+|EK�s�g�{7n�ɸv�9'̯�gv����_l��ĉ
u(K��X�S5v��"��B�P�
��:-�_�
j�zN�@�_��]�Թu�
�s��;Y8�'�l�5L����	Ðz���
ӫEs��*�sv�/[�����eU��3p�A�A�g73X�SïW۫͆0�y0\�FG��/�a+1��P�b�.��$�>�`�h
E�YQ�g_j�p�8?�rt$q���0|�-rs�LNx\�cB,}Û�6�� ww~���у�޻G\D'�ߧg籿���.��/8*�w�,p���TT���z���Y�.��&��Qs�n;{�y)��G}��F��P��[��.�g���(fVș�'�����+?m
��i��V`~4O����p�6�R����lZ�Og��|ꁡ�g����:՞{�x�|7�%��K�t��PK�uWoq����5pkg_resources/_vendor/importlib_resources/__init__.py]�A�0E�=Ť41�;��4C�Z�֨��RAV�_��/�,	k���k
���h,��2�3F�l�,���n���n�3��G8�>�1=�f����k���q��Ԣ�����d�br#YU������܁�F�wܜ��	�Ce0b��T�|]+���iꅼB)�{����^,y��Z���`��Òò��b�ٝѦ�J���<o�ڡ�]|PK�uW���'t�6pkg_resources/_vendor/importlib_resources/_adapters.py�XQ��6~ϯ�����k�+;��p�b{C��ZG2$%w�a�}�d˒�Ks�~Hb��H��(3�V�S�ƒmĖ�C��e�ض�YԴ.T�������mz�W�~�ow��b�pc��-�~U�����v��Z.���=d��|���3(άb�=�{`G��ͣ�w�q8Ep?*�YY
)lYf�z�@���m��÷��8���.R+�鍓H�8.u���;��Z���{ԒuRY��	�X}���m���ށ�Z�����$*�E�,^��p��p�Y?��kuh�[��x#0��󢔸v��������(�fU�f�Wkv�����/��3%j'�6�R�I�v�c �M���B��{��0����~�Z�,H.��oD�N$�V����+�<�����3��Q�ղ��>p���wh��igj�!���0����R�W��e}ژO�Ӎ
�#�#C��]��Q�����}�D/���
�w�.eV@�M�96��E��F߷�9%xh��:��u�ۋ�� ��Z�y�!x���P������]bJ`�+�y0�Ƣ��& �@T`�ey�xjm�8���"�2�\cw��|@%C+L�����b��|�qSR��m��7%T�@a;����]G�`�ǹzN<g��A�{.]x<���ψjP~F2a���ɾ�3���PI�1A8���k�p��$�zxv�$�|�5F�b�M����<��G�*F�l��!<�p�}�>6��>c�S��y�O%Hק9:�1��I�$o(���W��yO{z�9x���/J����r�0C�`�\����s���k�k���3�N��b!����uE�-�vi��
�'Zg?�73
{�F���'��΍ŷ'�����x2Vw~n��U>�W��a���ڗ>�."�հ��������O;�d�V��C���W(!b!�z_��7��[v(Ѹ��,�~����x&��x&0�Y<5�P�7��<#7b��v����������Ò7�1H8��^6j�=7n4�ʕ_�8a��ܸK7_w�K����0^2=a�f��%�������c!O��뤅D=�z�CkN�"��|nH��/��q��Mt�����{T���\�����PK�uWþ���Q4pkg_resources/_vendor/importlib_resources/_common.py�XM�۶�W7K��6���A����m���"tiyl�WR����{fH��r�<o,���|�93�9��u��	O���٤�۝�)�ޝ������+�t�o���/��Ѫi|KU�~��kL��;rA�b�쑕a9�Q5�6+�G��[�+Ui��Bo�$���=��ޒޒ[�wN?��z?�tY�#\M;�N�%�X��գޓ��}w���T�;<��������`���b����_egK-G,_/>www��ZW��Qz�mN	�+��2�\*�l%@Jo�	�=����S�=�S�u^��=�[��u
IgO�C{����l��+��,sy��T��	*;Z�)G5�(k��h5;�3���Zr��G�J"���A�֛���t�"�60�Gu&Gjo����� ^��-bh7Y�}ك��BY��\�t��Y�����1}n���`� �����QwBzؾhNoD>N0/�!��{m��F(@L%�l��o��.!�n5S�Z�Osއ��2��m5=Q}��tuj�ح�;TO"�/�����SbjQK/g�$�^�{���#��m(W߽���~�N��2t�vpI7ѹb�+YȗѴ���O�<�#�+�J<0�(��5����S�x�b�@�
�j˒Z�᧾⾩��{0�n����J#����P�\�Ձ@��
�9��h���/ ���1e�v�xY�?Sk�v�~ൂ���#b�������~�<�6m`��w[K���
t=Q�W��S�I�@�����
��d��i��&}�&F�(��eL���S���e�V���Go$���9�ke��u!�HRԈ�a��ua��1�"z�X&��^T���ik<:[u0&�"��y���!�[�
6��@V�x����#�rh�C���	��P���(rٷ���HQ(M̔��ּؕ��nt�?,˒\�ˏ������^׏�a�T��`����1�+�?�ك�����C�����J�Lt�%6��eX+X��W��(N��5�����S�
�[ƽˠ>��6�����3O�؉U�
	V�'���U�O[�Qۓ0��!n��#JB`���zWS��1>L�YTTp"&���,~���]&����C��v������tڄ{V�Qq���1�"�r\`�_�ǣnp\��t�F���v;��~�\ń����󟞯կD-0�|I��(�E1�Қ�ÛKw�Mԁ2ҵ�,�L������e�z�+Y-b蟁	��qH����V���f�b�6���4�-�D,���,��Mm�G�@ȩj(L_Um�
�M�t�@�kg���=H��}��:��%��È���+�כy|��p���3�5���,�}&�C��aڒH��=���[����n�6X��w�l�f�g�
	����=��� s�-��pɘ�h1b$:�RM�@�k�Rn.�1��>C�w_bd�lʭq�q=�Xi+0ʴ����ّ��V�x�������Q��)@;x̤���
Ϝx��@�t��
���h<��F���3h!=K�5	�t�4:�z��b���w�b��+�ܩ�P�JI2I�l�4�P?&�(Q�f��f^�;�$#�j���L�_j��᠟�Vo1�*�!a�l:ӢԤ
-�k�T��pi�P�|U�o�H�r�-��Eאfǣo����K0�*Yߊ�+�SC��vC�dЂ�
�5ǀ\�x �o�R��\�����Y
�����������xX��D�[��x�Fx�(��:9�U)��6ǟ�u>X��(�i����)�Y7�#	�(_�Z�*yw�RZK)f�:�%��JX��\Ki�Q�+�HVu05�����iĸ 4QP.�]rj�J��W�J�!b��VT��^�FW����l�$��{��$k�ޒzm�*��?PK�uWa.;�m4pkg_resources/_vendor/importlib_resources/_compat.py�V�o�6~�_q��`�!/��M�
PF��aC ���&L�I%q��IQ�d%M���4ɻ��ݏ9T�������g�8��8��2-�M+{�5w;)�Ye�J�>8��fS�����X�Mg_��*#K�W���X�(��4��������2���7QWBb�_�i��uX���%���3�{Ҍ�|�\�,s�ؓB7�r�E��r�ׄ��C�����?��f�m����Rڋ�h?��1
��p��v���Yp��N�iv��z"�����y����Ɣh?j��V�l6�WN�d8��4�F߉
N*�6��M�-��%�B
wd1`_-nH�8p#�*m`ut;��
�ȍh�� �2P��.�/�h"��#:,�Tn��ޫ R
W�EY-��X����d~�����{r�F㎝�*ACO�}�N�Fl�:�ޢ+L�ޗ���i��n��?-��f�r�S7t���R"�n~���a ��jϋ�(���|R��İ��z���ٚ�|���e�\t���>F۬z�H,,���R��!��,��Bz�����M>����lO<!z>�>�@��Pq�q�Ʌ<�,�/�����������?��m'l�r���!���}�"իd.h�}��ჰ��?�ʟBv4񉛍7h����<{ �'�7?^*C������%���}��⡉~��H�(U��.['m���,�>T;�Դ�9T\�5/��3��ZA(̩��~PST�3{�c��ɮ�M��S��g���u�r�žoS�N��j�3MI��7"�P4�	ְY�yɥױP��1i[�MC��%q����n�t���4V�&�^���X�q� ��ф��
�Ш��YswC�����Ɗ��(O�xzz|ۆ�ƙU,/a�⿠i6��b�~�7/�!��u;�A�҈څ���"�!?=nh6�4�;PK�uW��h�t7pkg_resources/_vendor/importlib_resources/_itertools.pyuRMk�0��W����������[�K)�m�a�ؙ�v��Ov��YW_b�IO�ɩ��Az���@֍�*�(U	吱*�������StB)�S���:�D��.zm�4Z�.zG�]Vm��\��T����I@�2�E8	+3�XI-�c|=A��U�1��֔b�z���9��:Dݩ�g�Š|�W����M�qӁ|��Ґ��ep�8�py�瑀
k����XthOa�Ɩh��FP�C4b(� ���]��\�Oft��b��߄����a˛M԰�-���Se��^���"��&��,;�i6qQ�1I:��-�
���z�e�S���/��4�s�7����,�/����̔��V�*�!A��)ax�Ɂ���'s�Ml�[�#���
�PK�uW.ev��
4pkg_resources/_vendor/importlib_resources/_legacy.py�VM��6��WL݃��,=\$mz�C� ݴ�E`��hͮD
$�^'��Iɟ���[�x��qd�i��U�nl"�=>u�m���}���N%ՃM������ŏJj�íC#6
��V��[���~�J���9��k�}���T1XY��m�J���|�s���} �[]�
��s֙O���7%�I�TXC���R8�R�4[$@�Wc��ΈΆ5�ć�]�&���ps��x�?C�?��k�ԓ/l�X��hq��
��Q�G�P�m��T֡����X��a�\g�y���131M[:�X��R�Y���7�кyo)�b����V>���5� �=��@\�
D�$K,&���71��wH�t�:�R�O�,:�d�A���v�k����)mZ��ϸb6���`�d0���J2�L�
Ax��f�lo</A��"�����#��o��
%�UPa��� `����|.��0�A#���!$�C
,��*���{j�m�Pخ�.�����G���/��1ڤ����|���6Z5{ʔ�{�f���	�WRz�u�j��Ia��[@��-`�3_����:|�B�F>RH��t�>V�l�0�q=V�.,c�iT�"tM�-��9;YV��tj6��e��řn��L�ir�1�
U�~�lB�@z-_9�42�,��<��U��
�+qrڻz��4.2���R:Z��~Y�9��^��a�f��	.��<��?I�o���XՎhV!$�J�c4�n��o�/�
Hc��Ss+����?[��,I-�դ-��f<Պ�1�Nn'I��������s��nqqt��W)=t�Ez����/��6�uF�����ZXGc��;��PDӌ�Ix�p���a)kYҞ}��P�J�;�-�@A[Y�!̏󅿖v5�K�5�4�(���>BǶ���_n�|�k`����@}D�N�1�����^��MD�_車q�d��ӕG|����8�#�Rc�L������b���R�9�n(��#�r'�3%`�'�P��8C�7�� Z.���N6P��Vza�~v�\��->�ʊG�t���3z�~��:�Im�Ag��gό��D�+Zr{�0Pi�Mhn[��%�<
�S��'�}��ɶ
��}�_���;I�F�JI��L}�ER����o��c6���w�F��Oo��<�T铉-���	z�r0���ə� �av��B�Ȟ�_aɿPK�uW۴�L0pkg_resources/_vendor/importlib_resources/abc.py�XM��6��W�BQ��ȦH�=4	RA2%��L$Q%���wf(J���nڢ�氡%r���Jխ6NȼX(�TzX90N�ʆ�t�J勃ѵp�V5w�uӜ�J5Ҝn�%��ʼ�~�I�[�\g�D��%�]�nd���Ҭ�5jM�8UCV���e�7��BW��ݙ�f�Xd���,[�i���L@�`��Xc��ϰ�.?����֊�u
N�-�'�y��o�`s��o�\���Y8�K�K8h#*M��pZ�F߫���B��5۵dd�b,�%���DT|�%?/� tMD�-T�d�x��܈��{���B6,�DT/*��ο�'�9�
��� bw�
�VB�����d<�xJ2�@���n����E4��tu{����M��{�����3o�{C�^��P���B��6
�n)���P5�s���<��y�r[��M�o�qR^�AXdQ`4�wB�U����)��*a�¿��ƪ��#1�԰�!^"|:��2*���sI@�8.������)x��b,�Aa4���&	J���4�e��9�Ļkp�S�RC��Aэ�"�F>�;Ӂ�LJ�+:�b�撁��+3�&�T�@տˆ���oXhC�,[�����??��T�C+�4�S�ط9��鳰��أ����0�������Ύ�u`��M���&4�o
kS"O���7%�����k��<��,�yD1��4%�zN�e�x"kc�fX�ۺ(:#������(;r��C�YB-O�r����9z<��g���������4��U��w ��DNNE�T�Y~r����B���
:$��gf�pi[J�_�L���	�A=*���J/Rµޜ�tX�}QCShb��az�����n���?h��
A�6,~Р'��$	.�UdƤo�ܫBŸ.C��f*����'������J�4��\�)��N��	�c�S-V�ش}��r�ٶ��bD���1�"�QwX?8�I?X�cj7PI��x}RF�J��P�S6I,����B��C�9�$�E�c4��V[�@jRܰߋ�~��~��g
t0���f�,Gf���KZ_J�,p�z"�� Z�wvY$��r;�	:+�mQ���x�-{+*[F4���CZ �S.�)����,
�r�t=nHI��n{�s��i�;� ����0;u�{16�3�3S���dGs�]Aa�_��a6	S��yԉ�p�;w�Ԍ>�7
�?3�\�9,�R�gY_u�QU�Qn,h�Y�0r��|�M����\��+�–���	����7Zm��~.ɜF���"ʡ�%��͋ᮗ��8bMG�+*���R���xaZ�D��#M
a��U&<F�X_�654�.ɶ�D��G
����tJC�����ާ4�`ş��0�������;�O�D�<�G���w[��w�N=MA�����7|wXO�6�M�;�$��!�Q¡���!��:��
��_<�.y�.�t��|�B���t�N��_1��Ĉ������z��<��XfA�&��Q�{�g��Yw�H�����F�]�b���w�?�4�'��G�B43O�B��5RG�i�"E�V	Zv�,�PK�uW2pkg_resources/_vendor/importlib_resources/py.typedPK�uWUKa�x�
4pkg_resources/_vendor/importlib_resources/readers.py�Vݏ�4߿��>Ĺ.�g�J �C�hQUx���7�ܺ��v�6T��3�ĉ7�������ƙ���of,��X�*�T^�6r<�?(����+���McM�
6��}�J�zc��/{-롄{�@G�ʴ��~��hk����0�����;%+�qDm]����ǂ�fd�'>�m
ꗲ���!*�\)���
ހ@I�^o� �ĞN��m�9R�RK_�܁jvLR��Ӈ�J{sUP|��r����fF����^O��,�n���7c����l2oXg1�h"��D8\�
i�,/�-�1���Re��8k}ʸ����|v=_B$']N�0b.
V��d�ZS�*M_��?-Z��o����³"�Wu���#
����B�D<{�.۱��,g�G���t�!lu����LKf��tSv����C��{���)�0����γ�`��Zc�pt���A�W�_�^�A�� �}�~��פ�ҭ��^ ��c�% ֠͛�eGD-Q�>=�L���!Q'm�'p��n=��PңS�1�!�#���5�F�h��L�s�a��G�iD�λ�9ː��W^v
�P��'��a_#�Ǝt`%8f��2����hR*h)-����A��ϤF�Aj�
���E(1
����W��K,v	�ם�E�YX+��R�B��uX4�j1�q�9�B�3�=G=����x:;wg��/Օ
2ŧp��Ƹƃ6�U10(G�N{!5��@���}T�L�O��d_�o��>
�SZ���\'��/_J��2vl[��{��@C���c�$����VE����1%<����� ��c,Z���V�=�"Sq�W�BxO�F�:#�d�uT����i��o�$���h�x�5[cz8��Ae����~�+6��oi���a򜗽�%��,�\��U�k����aF9�_��t(��)�3�{b+#5jY���P�帘8����0V�b�-�]tG�?�
p�|�8�f��lhAq+]��d�G���m?�ƈ�v�Y�&�tV���N�2эӑn!R�l�t��m/���f=:x�p�y6�Wq����׼A��eb6Ó�,�R��ȋjK]~��i~��B�������u�Wa��������PK�uW��\
3pkg_resources/_vendor/importlib_resources/simple.py�VMo�0��W�v��5@��݊P�+�CQ�-'Zmɓ�t���$[��ӏ\"���#�(s�X��, �r�q�H!$)�˪�ZI!��$X�u��ZHM ͺ%~��Z�R��ǚ�i_^3�[��L�$��<H8�9��t9|��J42�*����/�0��W���M��G��b�UM���|���m��9�<��)ֻ��<�v��k���ɐ*-!��{������v4R�,b��B����r�(Ѹn=m
^�,��.Sm0ȕ窒䛬�=+sIyO˔�1�3|��y�j`��U6u1����2���w���Lp�o��d����i!U����O�@�7�w�l���R�y>0�(�2|���oS+t�m�XX�]�Δܲ��J���s�F�4l��KQ������ݤ�Q�%�Q������ﲮ�n��E����[��/u˼=&����N֓63ܷ[l^��4��Ho��l8m�\��=S[TۙL<Ȇ�LL��[(��a�(�u	�<o1��(�͌�zƇ������	��::��r���;���͌F�Y�K�#��4/@�����Ŭ���(٨�om�K)d�����j���D��@t�N�Ԁ��r]�]NT�|0�n1~iKt�*E>����ݚ9��y)N�5�F%rz��`l*d;�S��^���"a	Ӑp�M��a=����ӛ��j�l�)��{�z�1��נ��f�J��Uԩjq���NDFV.�P��F#�
憈���	�jv� )(Ԧ�#���̏ʂTp�X%;P7[���[[���rlA����j�<�I�����n�7l��Q���n�PK�uW(pkg_resources/_vendor/jaraco/__init__.pyPK�uW
�x 3	$'pkg_resources/_vendor/jaraco/context.py�Yms۸��_�:H�4S's�N��&�vr�\3������A$��H-)i�{w/i�qӴ����>�d�k�a��I{��E��J�R��{S˅_Y�Meڶ"Fl���E��F����U�~�U#����f�x�.���k�fK�b]�7�t)U�r�����~_�z�̶�w�lX��¬���J��_N� �� e��S�W�0�� /U�i��oW��m�Ȏߜށz�E�䚕�6���jf���b���)�%�g���
���q؍�ٗ�j�Z��=J{U�*����mD�T�4�ߐ�J�w�?ø���)^&MΪ
oւ���
7����Q��gnDC U-x����_�ѿ2�QĦ�lD��]{+ '�`�R�
��s���Y�V���@�\У"W�
-�=��ap�ע�[�.�
%��W���IΒd���������r�48O��t�O��n��]oD]�T/,��u��+�����$�n�Kс[�˳���n��ح�	{ې�@���Z��sm���a�S�����(J�
���]nH�&�׸��xmw�B��B��K��4�s�>l��h�=@C���4�m��m���wxpmBX������L[nҧO��i�)V6�d����gv�7v�_$ ���B�������+�/#MV�]"�K��V6ij��t�,�-ސ��R6+���
eu�&�R>E����5<>�]��j��߯����qM'�$�Dt�֥pc��v3�@�KAT��;4��dcL��ٳU�>[��+u��c�l}�>T�X�/����-O��� �� ���[|�X��9,�]��IU�lAEg�e��vt�<����$��]�4[�V&],d����~L<�|oO	��ː�@L���(��7[fzT�A�`L��J�ضw���R��QBL�?	�m��C��M�`��t���9\K
-�k%��p����6�N��,�sr#NY~��,�A�oNM/Ԕ�Fq'��$�wJ��'E�A�K�ۭ��εS҈9�	Y\�ܛ��v8[�6z|�w��t��b���ɡ�o:��ߩ�zD@7nǓ�B�ڸA矽��h-Q�ye�e��d�_��ŷ��RZ�‥�v�����j)�uJ���]�����#�
�w���H��\�u5b/�;������E��ш����%�W�&�*d��l�J���cP��D/{d�8��q[��&�f�^%��V$�Q�z�R�5}]�Չ&���]2k��8�a�N��Vbl�c6����'���7��9���d��VC�u/
_���H��&g[����V}�����d�1D@(�8���O�#M�0������+��A�n��t��#�D;��Y'qP\xM��{����h犂&��8���z�p��5R��]Pʛ�����t����)n�KX�_s@^9��'�� �?��o�jՃ�b���-��H!��8{� ���1-Ex�/�k�cl�#Άb��47@&":���M��!��n[/����0�;�7��q�
�g��c�
�U`�|��
`a�AD��<բ^�Qږi84ϢA�(��hO�fq��?���V�J���9���Љ�ޮ��]���4x��I�x����șO�P���Y��#��z���a \+���O�?2���?n.#e���F�ͱ-�a'H�G�X6�|����~��Lڔ�)���@&�8��>�)B��q�6|՛M�gI�]�G�"+�?x�a3G�T3����5��� �j�n���	΢�f@/�?�����:\}�(
+2l�	����8�_w��������u�r�e���'�6AI�������R`Y�ps9|�ف�:�x^Y1\��J�˜���v�W�7�#�:��1��x�=����YJBǙ�|vzy�Mo���ą7�`��>_���������%��������(�O��|s�<!z߰�h�ky��k{���˽�����
�����Qu����ˠ�_�'��[q����s���WIrp"�afp��g�ݪ�L�x�޻��T[�\-�zk��
o�o�A��`��l�#�c��=�h�)��YI�Ƙ��M]��/�Ń���|��w�`�<q�υƆ�F<���<���oA�=�N�?>Q��V���0+Gsc�8F��֟���=}[�&Z~6Ȑ�/�t0��@f�b���h���k&�#д���B6Hθ��P�Ν���_X��%�7;�QX5�O7Z�N�Q	E�����j�^��4a����PK�uW�/��5�:)pkg_resources/_vendor/jaraco/functools.py�;]s�6��(�A����;_)5����<$����<�\4EBc���-%��~��({RW7�X"4�ݍV��6�U���ۦ��I�/�r����[���1o�
˦�g��?��6Xϙ������LJ�h�t&�v�w���o��~���4+����UU��t�n`�f���Ľ�Q�6:�/O�l��X�7��<Q��W8�]���|��7H_�(�wzzJ�_xPe�^��f��jV��3�g�!!�Fm�2e�J�F�'��wi���&��z��¶f����͚��u	��4-�<M��/��iV)O0�L\�F�/?�I-EZuc:}2$Oe�U�<[ծ5��f��֓A�����e��Pf�
lh�Wڮ��p�*�,�L�}�KT]�ek��V����	���E��+nW���{{�Uc��*��::O���w4��|~����{�sA_?��v��?>�?�ǧ;/=�%���}n��Y]���?�����o�$6Qo�<>�k�:�V��5��$X�wnt��:
6L���F��Hs�6�<��h5�c�筲���t��*��`����	���N��t��]�f� �J��|�S�z����)���[��1�׳x8-����
�]?��l���<�"��2Ԉ�
X�G�M�eֶF�P/��pm��`G�MS�p����d�f<@��vfav�W�	�AT(H�V��l��h7���	@�Sk�k����G��ږOZ�x��ge�AzZ4#���X]7�Z�pQ�l���_.@T,q��̊^��"�ٵ��*��E����п��_��(S��[�C��bɞ��ɷ`���y�3C�[�l����͞t�ު���� ������㈞_L����Ͽ�DO
����3$r9IĹL�{&t{?1�>�z�#�&,ˢW|T9��^O���:��'� Q��:�`��PdcZ�FZ6����F��Ώ\Ǎu����t1�&M��'�یMh��M�7�>>�I�5�Heq?z�Oq��%�b�0;*��~q��wo]��)�ͬ�oh)�Nbu�}ihF~D�����v[
GP0�B��"k3t��F�6D�mVc���a	�4�[v��q6 ���d�7�y���h��bTe^��gHh4��6�>��*w���~-�C^6�6�5``�7��A��P�t%��@��d�@��Ah���v0�9d�`�����j�����	%��.o�`\䋖�
(	��f�eK���>��/��F��HD�~�$���c�3О�rd73hٗz�=���r�|�fU>�|��x(���큱l�g�L��ʋV�΍��537�{�U�ٵ�I�B��hkP4@�jtm~aiŊU����D<	���j�����dˈ����_N�������*�L��-�A@�p<
���'-�=�+����B ��	ʧ�**:2c�!���T�8�w`�rOf˙'g,��]-˄�7g�I�;9��p�����9
A�
ճV�u���0)���_���2�4[v���hM�R�4oڒo��-Ӌ�~kAF��\\!��ku��˂��o4"�3"̎����L
)XhK霡)'f���%hU��Y�,��� _��%�y�Fa�a�&��2�(C��寚sJzX��ݻ�)��ĝ N����ygt^n�}w��Ӈ����l�7
��cv�q�$�a߱����I0��F3���\v�kg�rU�㈋	����;�3%�
}Z�o�]��>(���>�G�M��l�,ׇ���J��yh�2=�P@:�h3��F�r�Y��CKH�@�1>�'f桜F!B�+��S��r�4M� ��葬�;�U�VJ�!�AwA�%�!��h4��A8؄ ��<�!��8 ������ �;$4��M�I�b٭�\���@��7�278X�30����<�V��\����pR�r�҆�D�r�D�!��%��
��1�\v-��׺��A��6��:+a@`�4
%A<NT�`��F*��[��հ�!>�ǂ�y
�dg~��6o�c�-�����πx��7�^�9L��+
fi*��4�%��9	�)0�Bph�!�����O*XH��L�e�x�E4�{1��L(�µ����Є�	�F<X�儩Nډ+��~��������(�i��r!�h(���}yQm��l�r�*��p�dT_�ȕ+1s�jewxDžrL�|�7Qy�̨�Y-T� ���\����iGA�i���+����0�h�A0�6�GXөJ�F�^��}�1QW��p��\��f�L��a)-@q���*�=�n:*�R͞9�lH�1QF����3ď�q��
�`���@%Z��g�!�	���I(�7�C	���7	fx­)ݕ���'=7Q��A�#���Zz�;�Be�E�D0��g<����UᲗV��_�8�?�Y�+����5�* M˒���
�WQ\g�|٬��*[����fU�[���5ft5�$��w��|��p�n��(J���lX
�}(��:^�2�G�m��Å�l���M��)��C�g�Ԯ�]n6�(A���\���$�J,�k_����L�R��J[H4�Oe�v��ÆC�ƈ��%ނe�\�����SS��[������Wi��#
AS
CgG�O�Gl�P�䰎��C�v�~��:��Ö���v�ɒ�B���٢�+�����M��Sր����
 h�4�yL��a4�)^K�ˢ&�;��@E&ⶩ���j�@{�f�Y.���2a�Qb�4'�\�eC�$׸�߷���I� �>���/}�>j��	V�<�ȕ�'|��@r��ض�h
]����C´��Pi�����[�3���"m�����„���� �lx��˹�;7���zF1-�c��U�Ns����ܔ 1�j’�&��)��ҽ��$}�N� rAproNI��\?&V�S��4�
.��R���SΝ<�SA����S�%xv�
V$������6Š�B�5Ze�����{�.��`,���l�N��F|��?F�l�N�9�C_*���}���AP��e��k.��!�q8��#��D��&$#������C�)���𔗆�v��gZM;Nr�>��$	9��iktNJU���f>��:K�qg��n=�DP�r�A�al��'|�p�Ѷ�6�r��*7�A(洙��,>�o�y������|�.E��XUM�F���,&e�uIu�k<j�G.��2נ�R���p�����|Np���$�b��T ]���Kpxb[�jJ`��t���9��j�-�v*��T_��?��Rr����
L�;�8t����y��
"����w#"�9�~>��x-�G�B�D���И39:7�_��X��H������ɡ��<�	j�JO8|΋/�����	�͏\�(2DM'�އvr2�!��0�"hӞaO�=��A+�&��‘���ҁ.��t��"L��\i�C�K�'���cY��,Ix�R�H$��E���%A3o�����_�Eɶ����d��f�Ɍ$�&}$)8��@�\���27�����lۄ�Ȉ��
�'�f�=`�pY��4�B8ϛ<Z��R��>61�%�S�I�B��hc[�g"�~�F�}?A
Jn@���R�%:l�␿��:�0�g�rWE�{阫r��U��	W�SxUqw�Y�pH�v��������pBx9�?6���<QA8���P#����
-�[	�a�he�T���)0�<�V�d���D�'+����y	&�����"mD�t_���Tڗ������\@]�C�M�,j�p�fTⷁ\��.�MR��!_~v}T3����9�yDe���l����ų]��o)�&�1W���K�p�ʇe�N��ä5�>Ev��4�a��J$+rF|MH�e���)�[b�/���*8�pV4ÿ�(�ש93u����W.�I��qS{�n�/5SZhE�|�aD�hnP,+(
�P��Z%��%j�o(�l�p(���
)���1�X\$�Ň�p�(Å���l��8Wm��Xe2YiYv�-M��i��Fqο�{uz�[Ѕ����R.��QE�0�8H/)��B7�B��Z�$Rҹ4lޢYXl�x�1��$��îJ���O�Ɲ]$�.q>�a|"wz��m!t���Yn�x}9��4�ɐչ��D�bP�?���.���7�_��M�G��A�!�q��׽��>ޑ;�G��XУ��ǴU��7���i����Q#��oʸ���	c*)��K����M���T��t�%r�M
���hN
�o�Sy#�t���/������є�R�<�`ͱ�L���g�����PL�%��7��-�c�͂�U���D�h���@�=\g %�Q��j�����Lc�Z?����o:s�/2��mM4���ku����'�o�
�+��cs���I7&��o�=�@��6�֜��m��t4�ĎZ!��gv֌ۙ^��Է��,�f0��棷b1�q�;��[�׃z��" ��'���٦�Zp��A���\�-YSYrB�'�ۄ�����
8hِ:alLʪN�m!^�TL��Kl�Rm����/w�b'9�8�ynn4[���M
\���,}|�~�����Ҹ)�?�pS3�XO�GpL�K���/U�+�4�������{_9oצ�֊<U�UYXۙ�s;MAf?i���1d�C���|����D ���qK��CX����F@��`��#����x��d�PK�uW�.ɪ�<-pkg_resources/_vendor/jaraco/text/__init__.py�[mw�6���_�&(�2���s:�8��t��M�9M�=����HHBC�*�Vg��s/�$�i��͙�%�\�7@z��+u��'mUc�4a��[{��M��h��-8���H�ߢ���͗z�6��m�+#�]�x(�v�N�^V5NT���Xq�k�m��9�5�F.��DTu^_��?`�~�u�S���*�N��y��aX��F�u�Q�5�5keWu��2_���늘�|���zK�<:*�B�vn��-
O겘�J�LS<x�T�m*!�Pؕ��F��بfQ7kLƐDMˍmt��j�R���YmJ���p�ٺ-���=����o�{E��_[U�J����1�lT�[�2��̄�
�7JZ��z�������oy���>D'ɢ���H�I�31����d:u�S��CB��� Rce���I�b6\�>�S$7�RCKil?��,@ԐT�Jy#Dl-��ҼP�`�U���B5�^�=�bb�M�&C$��2xT�҅�@ֈ?C3T�Bb	4j$�3�cB�ʨ�h���W;���S��J^��_Z�]�<�[����$�8�7+U1�uUnŵl�dNi�'Er'*#ܒ�*�Z��MY@��S�|Ǔ?�SצU���<m0{��>H���W��*��$��k���~&�7�_z��ۀI�zJg����?�
�ܬ$}�FY�\M��8����`�k��CMVzC�d�^�,��F6E��� mqa�z����ګ�^�b-�*du�X�ekؘ�-4~A�
� T�֪�N kҢymW�+l'�DXF�0@bJx����<���#��8���%m{o��Y���5�'�/�T���N��q�\�\f�ALF�|6U58��btZ��d/���$̝;��;䜵��)���*{��n�0�l2<&�B����h�U�@���U��6�&F����z��"?G�iYߨf2�ܪ�=���8H�CR�~$����*�Q�>��J����&'1��VJh$|�qi7�7�H;�E�I[�C}�F|�9
�J6������0�$�(Df��/�&'�mb84!� �³�,^
�I[n]��z���%��9bDL,�G.�������E�>#]9M|�Z�����F҂�3��b/r�	>*��
"����	���1Z~{�Ρ���<����.�[=ט�em��P������On�r-@�lJ7H)���T����r��e�*Od3J���?	qPV�@N��!&�����%�J��TX��i�gϓ���b�=�]����/F��W�IH���+�l�M�������@�	�p����]�����>a�`�M�؞)#�=2��_��)�2D��ȩa����d��
��]!{��Č9��H��L�"N7�(�ܓh)�^��dfݬ�ڛ
�o!JCk�P���z2=�.��-�H`��ypY]"u��ڨ6�˥����e�cx2X��'��*o�!zS"d�)MNƅ��d^���2Q��e��u�
aO��[$]j�$\.�u{n�#)��ۀ{v§�(�יޘv��W4"x�.)��VHa^�0@�r�,�F����C���!��2ݚu][*�)��H��
$:����D��#k��J
YjT����H!wY�Qӗk�L��B�U
��H%oU�k/̶D��:-�6�4W�h���V(���18Ҧ�%��-RTݴ��ѭ+/�M�PƠ6Ӕ܊�l7��k�\(x1��|q-��%jQbA"h�ԻJ�rIJ��s�rJ��
%ʴm�Z��PD�l�&oˍ$>@:װeTC+�uI�Hb�{��u�v���7��^�׫���>��/�F�5�Z
�-K�`�2oM*^�zt
�P��Z����v
>� ��j�F����k^�0�5��E����s������D��H^�Z*N�����jR:�1�͡���-�p
6�^�+
��ښ���2�:n�d\!7%�J͊ꕮAV0��.���j[�:� ҙKϫ	�纑�z9�
�\��{(���Y/TC��ש/L$��ͦ�o �A�N�ʴ"��Q�}��Q�0��	�f���`�|"������*gl�k�@��9�[���9a�μha�e�A\�b,��.�嬍�I��Aq��sԔ`ٯ>rUm��������{�-�$��D$�^�J��:�;��
9@V���W[�j��y�H^�W ��_Р��4iz��J�Ħ�^J�9c�A8�:�K|��Ĺo��p�T hWI�K��Iy�����u�H��C�����X�V�h���h�jR.j�f>!��`��LhRW�;
N=;j�	/���tsOwK�#N�;kv=��n�i���K��R{��7,�OQ,x9�%��i���D)u�����W�� ��c�Z}��[}s�q���+NܖNe�e˝!�H�&�m� �KfI/G�[
3�.D Z��m�6T�lah8wЪ�]����)����W�z�P��#�a��?��gPj���)�Xu@�R�r��,��B�R�(�/F	$g�n}�(�h���2UO|�����⍲�	=:�>�:J/4�Đ�Rz���iC��%W���|��JQyOʘÞ�Ф��� Ҫc�HK�����#��CU�P���S�g꓄GH�4��G;���t;y�vb0l<˛�ڮVu[T���\!�ׯ:�<@�1xFP��Jv�m���+���;���7�!.��v����&��ߓ�
��t�q��t�A��z�e�i!�&���K��\�۳o^� u�Yo	�ph*���Jn����X��-w�(|qF��R�<?�*���R`�ae��9.�ǔ$��)+XF`����Sy{��C�{K�Eʵ�.^�#2!�
Re_"�<�����O�� NV�W�q���zq�o=��œ��;�
Y��†]�tÚ�'�*�j���T�R��BV�JV��1�d�&m�S(��t�d���d��{��ع���f�n~ϱ�Ĵ���!�ۣK&g�s�Յ<�������O'_}�#�i5a`�
K���ߙ�d��O\|g�iׅ����d�D�-��~��O"8��$��}��s���亹n��S��[��雵aM�n����Wpݓ�����ԛ�i�tQa䈞�s�?YĠ�H�l>޿ylNv��������R��u���w��[q�ʽ���~�tn��v����Q�B���>�p��v'��L��#j�_�?������
7J����Y��'����j�+n�N�;����yf/��!�;�|���[���A�������;�rD.k.8QFb�+$F�T��_^�Yzow��>���4�=�dD���t;N�
;Ŀ�$�]�u�8�%7�Bv��6_)��X����.P�p$�6
e"]6u��<v���\7��O�p��0������P����н)o��d��c#<�2O�4F�l!P
�,<6��=[�u�����n�w߽��U�|��μ���X���0=��Dy�k��Y|&���xn,R�����6�
M����������q�d��؊g������9wy�D۴v�������8�g*X�yݳy����j�#�}�����ѪA�܃�A��B")}��AN���ϯѧ�<C���5��ޞ�z厥L��c�ڟO4*I�
>8�7���$jF��ބ�����}:��5�|�/�+u��VM35�4��Y�����n=�R;c���|�'�)%�<�����tϡ47��zc��$!��G��7���+��s�&r|<�B`�Y%�d�>bN�3,g�r8���Ў�[���Ԍ�}6\/���vfI�d�F���hWW�&�)��_��^VEUWp5�3+v�<��)��y6,��3�w�P���r��n‡O㥩�9
`���iE��"	H
�:e4���/�#�+��%���;DA�Ǘ]��<����K�I?Dy��;��MP|�h7C��#	t���.�ay\G����Ǻ��+p8����R1��-X�=OQ)�9��	8d��w��'C~l�t��^p`��6μ��o��۶,{�7��aZA�=zNܗ�����z>b���y������]�"7�cF�w+?�"-@ *0~���?<���B�0O.Nx�=�3O÷!���S�Q��i�{RHt.<������S֥X�w�B#�fC���|�R�\�$O97Y�p2���E��f�ž�η�6V���d@�^]"�ҦW�X�:�Ҵ�����a^���⥇�PR�.5w��'��w9v�qNŁ��-p*�:G�FU$O�e�!sk7��;!)�W�|�{���sYՕ�c	s������s�̼l�>~��@t<Q%���t�����q�N=初	�J���C�e��1 �'�e��O>�����_}/r㝜R�p�<�g�x�e`����(1��6�8|�_�XCҚ$~��z�X*����V��p�������ﴆ�Y]�Oź�Vz��7���xW�]\^t7m��'ăw��e��G>r�e�[�;���M<���z�h�C�8d����E7���Cq�2J�"y�Z���#���1�$�����6\�A���
|� ��p�R'�3@���g"Ӡ�ESo2ϪI�{�^b^�����q���r�/E����3�.&��Z�~02�a�_���vs��g������;V��(J���q��d�|y����N�<����b�72�8T��sz%���Lu56��#X����H����?��>�t�x�5�:zGy���o����΅U42�GHr���L��_����7d{
�}H.aˌYQn#̖5�h��@��Vs�V�ï!H~En�N�3~n���~��{��3��>��Б�J\�,�#_���ѕ��4�����njz��|�ҵ�/N��^u]�O�5ڨ����~ol�9'�E��vV�
�o�c��PK�uWt�lOp�0pkg_resources/_vendor/more_itertools/__init__.pye�A
�0�9��(�]���!��WM^����7Jw.gFD�4���b֊����̈�ôj=`�7�3�\��8�|�Nb*��=�C�cܚ�-����.��Z��!���O�8�PK�uW��I!+1pkg_resources/_vendor/more_itertools/__init__.pyiK+��U���/JU��-�/*Q��J��&g�#�PK�uWC�z��@,pkg_resources/_vendor/more_itertools/more.py�ksG�(�]��G�	<B)����dkvt�w<�֮��4��"�
w7D������ʪ�Aٞ��ːH���YYYY��7۲j�۴*��~�dU��dQ��٢�ˢNr.�U�+��%�l����2_4���]6J��UqM��X�ȸ�jW,��\۶�i���z�T�r���n�t[s��,�h
�|u?�U�]�X�l�-��a�^�'	�,�Ӽ��ru��|�y���:�˪��^���UU��{����|!/`Y*��&�6閿4�M�h2��S�����*��ր��I�k3��n;JV)��"���e	@_�W\��L�7�m�����_Wi�D �{�6���
`�+�UYm�t�ͪz2�v����e��z7%W��k�����O}_�5���U5,9TJ��')��;�MY�MY�A�q�-�m,�t�V7�9AP����-�.����MU��Yâ�m«u
3��ަyu���j[��H��-�\��#3U��t?x�d:����<����Ws���*K�=��3X�_yvk�EGm^����Ec�C<��6����TW4�\���7�mo
���
շ�w�M�����,��uZM��|��1lnؗ�����E��}���ν(�l�k�ٔ�N��4lE�q�6���{��ƉsJ{�{���W��B��'u�y���խ����]�~Y��]���/ݷ��}�d�E�ȫ���ѯ�;���}��װ��n�m���헫*��n�H�zFh
�+j��E,gN�f'��#�^g釬���}y!��{Soq��Q=�a/�1��)�6\�Lj���Ե�.�
w�Kt@��r�[k\�����=<]f���{�
�O��G�{R�La�p��bf�����z�H����_��:_L���e�>:�oӥ����n��Fo5������lj���5���u�H�SNY��_��[�jWL��`�n�n�u0z ��k�t�6�!!�b۴)᤺v䢆-�L�U�z�����X]�On��Ʃ�v}��R=��������j?�q�O��:��j#ɹ��[(]�ϛ�[�]�̇t
%��1��
׺����-�mH��<��U�.
1����UM���'O�SL�<��	6J�M`H��
U68��O�>}
g�M24%�	�J��\'�*a�J����	U��/���J�M?�Qr2JNGɋQ�r�|z	_[������%7��>�2�VH��l
ےzJn�:�Ҙ�2`'�TZ਒l�m�0��I\qu4_ϫN�J�x��;��?zZ��Q�!���TT&��Lvu��	D룼HS�u��M���ϐK?���U���17��K�M���X�ڙ��U�l6#X�p0�#�f�y��Z&�q�P�"У��������>���'������ˁY>�.<*���vO�Ɨ���{��00��k$HP�e�ٸ7p����ʚ��of���N�/"�`�$:O�v��h
�KW��6�<(7|����i\/�M~+��*A������B�h�w\q��Е�G�Q�JC���<&�8����c�8%f�y�J�΂�hc	������5*�4���b.is�i�%ͫ�ǩZ�<q����lZ�;���ڭ���ӭ�r��\9��^��)�`}��Aj�HCM��M�>���9p��}X=N���e�f{��O�k��,�/��[�.��lڦ�o�K�A.���rKW,d$��N2o�J_8R��6p�C�u��*X3�`Tr+D���뵛0�`��
����	ݑ�
Ҁ�����2t��v;�F�0�����҉r0}�~p�p�T6���:k��.�&����䇲��!½u�\7Ͷ>{�|������,�eu�<��]v��˓��b��Q\�u�4�Bo*W~`ڦ�A���/H��O�??>��q|���L#�n���x3��W����7瓁��l�[�lY<����f��ۤ��z���?M�X>�W�v�-���>�{��,�����S��w�F���ޮ��M�d��0<��ntY5^ �T�uJ>I&�d:7',�j���]��t�8f�L��ɺ,o�k`�i(�Ί%�~� K�O�6p�=�a�3�Z�Y�Ո�� \s�	p�6�1��dKj
x59�q���ɻk�mY���^~@j�`F���[`������8�)�N��X���3���e뿧/�DzM�@��Vf7��B�;�`'܄GF𖀼��m���8p{#��2>��u�1�q�0D뺄����I�x�g	~-�"u{�/���0��j꧌��P�z-�ӈ�wQ�Ǭ����Op�B���`�L��/����tU�/�GGB�,`K��J��%�!9�u��n�x8��X����L��$�F���z�}��+��n�������dz]����l���_�ֆ�8�����@+��dW)J�~5�z�ݒ�u��wt�Lo�J�L�gES��B�6i�j=�h��Z��b0u��C�w9v�_�*���kv
��+s�W��/[���C������{#)�7�r��7Z��!<p�mϐ��w�����c���W�f�$�4~�z��|�.����`�L��:[�Fvg+�_��yc��HP�W�\8������A분Ou�yY�ۅ=��v���*��,/
w�@�iJ�P*��M*p�8zA�$�`��$�H#��t��BNb���1� ^Q�Blc�Y#8�Tdž�A1��>�ZK��8�a����☇WHF��m���z�c5f$�n��d�U���I�B���r=g6��,��u�6p¶��La�L�l2ya��	8t�Tm-�%�F)�9�0��ȦTH��G̦XHr����l˚�w#d
�I!��"YU٢y��7n5��ه����{#�݇�q(E����*]d��N����
�jq���>Q(���׾9p!�'F%!��B	�w��-�
8�6�G�vj����RGJ<�%����2�;��|ȿ�<K�QV�t���;������9�	M���&8�>53�G"}��"q/�Ib�/���lk�
��c�I|o��K�طx��]�*ݸH�C#�K�Ȏ&�nh�#3�#��~�[b��������(7~ʪR+1��Y����*�T�V�� �W�r���z�_��&�>՘܅���,Qj��c�#,�_]é'�XcF��+0���i@�-�y;Na�ط8C4-
&��Yb�� ����k���Oh��,��Y��//���<��s�"kv�S'���PCj^~ARl}y�*��I&�����&m�A'����R�. !H����@6�oG��qi'w���v��SZ���=Uh�s�@>��,���̘1���ª��k'��ژ�0���r{sA���N���G�/N�����S9��=RD�%]���b5!!7��Q�$y��h�����Ҩ�MZ�p����f��'�`i�:5���~�)�f��]���{w�|S��́��F��z�K��u��i�ő�&��s�I����D_�?׸��*[*1�7�T(��U\�uWM��`��@���e�����m��ŋ�*�DO��f�5>_P58v����%�^�?�����r�p����-~RKyEk�
�242(��ó'O�w�N���;z �g��c�(N��'�vG�;,H&_p
�:��uN�s@I�,ß"[A�� y�x#�B�)2�	Z�TY�;}�a�U	���@��'��E���X\�
�Fe�-ވ`��M���£g�
XXu���m���,�f�I#�$[��2o����Y��{�}7��.0�p�J���~:���\j����oe?�[%����{j�Ԕ1��6��q#�EZ�wG|�V(�!�S�Sz�{��Y��9�o[�N?�r�A���|�&wg���1�=L������(���N�ۧ/��N^“���K�cD�i��6�SMK�eM��G�H!N����Sz'���*�h�!!|��:�.k@���X�o�Q�;�D�\n�TE�<��~}U��Ξ�sK���?�M�p�n�%\�d��Ú��Uq������H�j�x4;�̗0q�Eh��e�ׇo�������Y×�P�̫��7%Ës��;Z��ׇ�g�ym
��%o�t��M��.�,�g-
40N���*[I���b�n�nؐ+��x�PC���&,�|�E4�FE������a��`�!Y=��(���E�݀��	�g:Oab@�*=g0B}�uT0���uVr�����������5�c�(��2!{h`��d��p3
��$m��%�C$��r���,�������L�������o�1��ͻWo�q���B���!v�ƺw�]Ǿ��d��K�a�����V�-��D&�����(����|���j
8�����F��Q������bH
�� �7jSp�ztzcPF|-,�4f���l��m�g�ZD8(��?%��[؇|p;�y'��5�5 ��EO�Q6�!�$�������(�knQ���f�2aRWb��z{�y��H�gtt�P0l�N��A�K]�W7�n�� {�s6�m5�b�<��lʆ��\�`Au�FE����������Q"k��v
W�by��]�mZ�a�'+�Ԉ��Lz�� ?���e$�}�^k���茔6}�#oZ
���Sx6մ0?��ҷ����ȭۗ|e4�s��-��`���ѶR��^�vg�@xY�������jR;�
�
|	DSC{��ei�)�H��ע�����9j�Q~w0kw}�5�2�����$f$�Ż��	��+��b
����IC�>�b�f�z^3ۚW�)7���]�8�����Amp��8���h�]\Vc�������͍�ڼ�n
VpY&hC�\�5]-�Fg�Cv����C������tO�)�!"�H�M�,v��-{���a�K�����F�~XXk��˚d�W%��J���+�E�y��G���z$/i�_Q0)���@�,��p��.�o1"�q0:3�w�=5���'
?�2���Z׈l�ܭW|����=�<�*��N�Z�y".(`���a���}u�����.��:�s�#��,��|l�,|O�]�U��7�
w�0�h�hHtF6l���
��I�	�;��\3}6VG�h_��G�6�����]�!�-عh	��d٭��=�G�3�Z�W(�No�1ɑඎº���Ю�=Bj]��
)�^$[��E��f��m��a�V�E!�ا��-=��<�L�͝���<��e��yҿ�N�����	�Ab�_�?
f(��g���6e��]�VTW��ڌN���n��j�cE�f��\8H����1C%2�HVF�#�q�����i�,�|�!ꟴ��`�A����M3�9t�|���}?��'ܣ=W�ó�����
ٜY_���m~�?��i�BBԢ�v�u���z1��Ȼ��f��f�����2�����=��&9�k��^]��_���K���b�@�h��[vTth
ƍ��S��(yh<����E�!!�L�8FRm~ڄ�������xK���޷A��*S~���R0��oӭr<)��ӆ����mc�\gACf��Ĭ��!/ƞ��^��z���;�Ga2�8�2g�MG	���rI����]^����Z{Om�e�ʍ�)@������+�ٞ]�2"y���RR�FU`�~M^�M��y�ͯ:s$C�)�31#�$/�k/���@˽)6٪��i|��F~k�#mQ��Qˈ̵o�5r�R�7���!�4�Yo�f&{�oһ|��8��!{�X�ܷ���J6��מ�&�8��Z��>��ը�C)��4�ф�
fą�[
��M�J1�F�9��
P�q�:�00
0�:��/M�q��ˑ-n>���5'�"3�D3$�
��X#X�}��ő�c_cG�@@�)��0L=��:���~�:��N�����Nw�vgH��Tf�B�
S�ʑqݴPr�͕��A�3�>p��-^�8A��)�����-l2���&]���h�BA�L�c U�~�r�a��[%��
��ȼ��w�1$B�ʗ�Ӆ�?�P�6X����9�Q�����֕�81Yen!�0&�$%|�a�����t��y��f�(�m�o4&}��7J�8�=�P��{*_�ߗ�t�2����I�
��\�?�l��
2�
5L�1���{&T��:�셋���]}�aQ29�2�Q�M�ZA'�DK잉ER����
^ڽcq-G$�LFD���\d���c�����^6���@�؂����Ui�%�gZw��@+�vī�M��
�,njf����v��Q3+;`$n=cH�ID��i<���$C��p�z�<T�U��:�K�6]ܤp�q�rD�Ka��7�9�k������j:��W(l}�C�$><�����W��{�u�_�D�Te��I�)�1vN�w�?�w79�a����f4���6r�+�6�P��
�4(:�@9G�x:�´��EN��*P�'��&_NчM���f_q�$A_��X[3������hY��Y`������9�q�A��u�D{��-��-c�"�Ǹ�7%��<�dc�䮁���|k<�������F&�t��5��n󧣄���*��s����,�f��*7_ZdX��-��3�mA���N�r���$��mY�}��*u�.�h�y͜�ڐ�H��>��~�ac��t�Ǹ�Ԯ�Wg `՟��NFv�����|��w�tD���)7�K����2M�xH�<p(���C� $u<�Ab�E�NG�A��ݭsrm��9_r���g��������˵v$-f�4�GRu��O��(���Ҕ�`�Ze�;"]�Zw�-@�bI�O�9�N�Bb?�ElM����9F��d�FI{И
!6����)Ȱ��Q/8ql��'��iH�G��u.�!�D�1����A��*�n��-�Ҝ�NB#M�u�e�, ܔږ~$,�:�!|��~A{{@Fc�KU���?
˿I�,��9���6�����s˷F^-
�SG"'���2�ˉ�5|4��#@X-��n��LQ�r�G3��oYr���⻟�BR<+��p��E��h�������`��X�/:���q�[��n"�ƣK�@]-����$�Y k��Q�@����ytv�lWe�F�iX��8a>]i?�U@�/z��������zJ~p���\��2�U��%=��Iǫ̷̆��dQGܑ�5��≍p�0M̭P�ɛ�����&Z$����i�Xv4Q�`��~t��|�:C�pm���3�E�b���@��ˏ��JJXEo�(X�q��Dx�#*���d��0H�t�Z!U�Hbu����E���蓤�la���1�!J�0��W��"��+��Kn����ǡ��20�p�)͠?�=f3��ݼ'��5���%	pJg�/��9yY�@b�oK���W:�D^�t|��)5�w��w��g�����D�';�!&=l��p�O���Z��>��@r}ڢ'����n�s��/�[���Dՠ
|�U��Ω��q%]&�B/Q����P�a�V�?�[-H�n�ȋ.[B���?o�VV�2٭�V�sV}i�
�Py�m�Φ����KB ��d��4��A;ݎSG�n^�U���7!cW���w>aM�ד뜍]'ѡ�C3&Û�~h�x��鄌��~�'�~/��i`v��<M�b��s�vwwq|I�r��FK��gk�.�̷�I0w���w	��v���cJ�j^5�F��q�tt�I$|X��_�|��Ժh��,	+�����5�d��~��ɛ:����4
\�[;�r�2gC�#$NaG� �6�?1�c/W�*^r|���i��!��B?���Ҁ䟯Rc-Hr.5�l^V�G��V�A�ش��="�Wx9�}������l�7K��T\�
#�eN��N	�6㩽u�mn���������^R�}��
�yB��%E������6j�Bݪ�I��pn?���:��#?�B�����Fc��PFr�sh$7�2���o6�V��3a��3F1q����/2-v��C��d��~X�0o��^{Jl���R�Ȁrm���r��Ka��	�VA<:��;�>:�߳����8���i��)9��6,���pDtbg���-�:ckv�wr9��u�Xs����)�"9�Ұ�Y�CA�Aw�v����m�˛����<���r��6y�wf(�%��9�9�pdUV�5l+�
W�Zm����c��������#�P+��񹱔a���h"�(?�Rs��k�O4�S����2^�E4?��rإ�I�,�zV^�s糫oe�U$n&C�\[�q$�u1�3?^`[�ҿ��#!dӻɂ���A�{�D���2��SᅐY����Q�~�1!F]���A��o��4*�?9⫴�)�tf_21�)y��Q[) �ұ�������
=�8�
����`��;�p�OM@i
�C
1Ib�b�.#͝sФ�g9��o�(Z<a��+�꫇�UԻ��G�5#n1F��^9�+s�0��(������Fa0��ѿ)T0c�1
Zs���3�0J3����=mz�m��v�=�z�sW���>���� �)BMP�u�\��p�O����A�h��Ǟv�%��K��h��;�|�}J��[<���qF��of�Y=�������-,�~Z[J_u�����p�e�A�o�f_zg|�
sv�_��+�>zAʮ�X]:#�41@���jd+��
���l�t=B�F߆3I&�v"�0��,BL�ћ�ۋa�=��Am>D�3c\p�؁}���~�rfF	�Eg
[/�a#P�|1U9ϋ��ɤ��B��9%�e�1�h�Pc�OΥL�[]�$�z0�yÉ�y�\ 3��F�L+oM@o_p�"��M�|��m��|�}�	+<�O�E3��-nr��ȱ.�1F^9��ЁzI\�ץ�UX�+O�'pU�D�nS�Qw>�f�,��_T�ۣ����V���:��:=���qY$v� G���a��~f�)�������L���F؆�X��ٴ�|3��Df.
�ѓƁ�K��m�&.�*�ʠ��T���ϟK\�CA�[���]�h �cQ㋢�֟(�@d���k#r��P�u�������O����ھ��5U͞-���)�CT��xí�OϠ�홃MJ$�e��Uu�q,��"ƥ���7�J�h�'�ꨑ5e[�'f�4�G^[�B�.ӵDڱ�!�9٢�.������F�r/�1�B���O�b��b�L��X籯��(��Ler0:S�9����[���Q�.���l5���ڃ=�,*+����=U��d�I�n�3]GZ�C�dD)�	P���&�I��ֈ��S��so�Ǘ#������5�3׭8XP�i!C,�-�	I�!��#41��)K`�w�L���T�Dhub30��c��g�%�-Eʑ�i!�kn�f����C�F���# S����0Pv��\d����,�Бȵ'�j��t��W%���d�)���!�(!&4�����H�|d�X�P���Fh��&�O�}����t[�8����6@���r
{}�\c�u/�"QP�{q5�kEV�������##�i�M�LtwA�=�����X����2d}G�s?���ȅ�5�{�2L���@V2�������P��|���^iyO��O�'ӷ�z�+��C�/�[�ӤGV�8��ZV�Jr�z��zķ\]��aZ�CC#����݁j_)̘Ȗ����]��2�&`�R"�P�������kꜾa�����,9^��e_w���	n�[�Gۧ1K4���6]��ri:�>��˶��;�P
Pŗ2� AQ93�;�����"��}��ZMٲ���a������_6U���ni;8���6Z�N�M�	u�E��AkG�e�$�J��ãc+��1�V�l�HtjW���h�)t�����?M~[|(o�d�-
��7����Qm,����aB�ީ9#d���V�b�B�(6��Z��^����H\\��o�&8	���S��EZ9��!B����9�[I��u �E��V����{�dw�b׸��ї�#0s�L��6\4�� {1*gj�K,�.����!�߶*�*x9O�}A�]qO��D�?!;)�?��l,t��&o���bm��d�~FW���Mݦ�K1ŗ��C�~��3��l�����Ͽx���lXZ�1[l=u���q�ф'����¸��s�y5���v�c^�̙+oTg�
ӻ`Nl?Қ�ʢk�=��B�}�U;����!��IM�Џ0F����V;/�
OL��oF�L;A�
�wS�H����Ҳ�LySz���W_�������<Y�)|���B����I�k��u�#�	E�?�����{w%pF$]��
Qqg���{�Z=�,-nK^�'4���R�?���(ݻ�@	��<Y� #�i�7Ѿs�JP�UN�̓��.���=C�{�9�qD��17%�!A�P=l�S��Ys+/��^���d^�h��^Em(c%���l"�� ��X�T�����(�
���ف3aY�C�T���<t(|~�
mH21��^�{�me�G
0��:�K��k%����@N �˔��V��d���1kX��K���e�oJ>Ɔ��׹
����Y����T����qWPB�EIt�a%Ԓ]>E�����][��iفOO��
P�p�:d�7�T�so+�Wb�3|w�q�n�l;��mJU��
����0�G&yE�!��90^.G5K?6R̈́"C��f
1�2�!��3mG{~��T�U�=^'��Ţ'���X�ۅID4�]gI��99!W^��<^��.�E)��s�e�x�$+vh?�a���6E�V�iX��!�Wa��뵁����꒻���:K�)']3��9�H�i&�4J�[�H��b��-[��F�#�I�0�Ca=ǚ�> ��*�;0j"�R0F}>;,?�m�[9F}oW��xL�1�rbh�{
|`t]�ɦ�2��';�ڊ*L[?�fo~l/�,�͠A嶷������f��.��8y���
�F'n�8v�i�B��"{w[:L�ϒz�ג����o��?#~��o�/t���:i�dm��uB/J�o4���?6�<l��ds��x
z�����܁� "��x�߉D�>�7�4ⴀ�M�7)`��°��2G{�tv�Ǥ�-OZ��BP*�&LE���^���}%�t���N�I	��~��=��G�э$��H��2���.D�<HO#hAx���:��r�9�rN�ʚ�D$����ڤ��kT@z��*
eT�!q1�Ut]0H�†&D�<��R�zW;yOAo�ڙ��zr��J�YΑ��y�z�	w�w)-��S�sSN���	��{�|��{�U����'�:?�cӨgo+�,��
�Nr�
%�淧e]�˓+/v�4�d���!��!!ۛ��L��+z���0��6�;pO1���_����!iD��H#���Vc�"f�g��`Xk,��Q4R|AG��0T��'42@��������S>��륏�����v�݆��%n�V�m%�U���B�7��s��z62&e�#'מZp-yhV��M|R,��mp0+���6t�b{ra::9�h�]�T��bv۪�1Ol7!�``>�Y^-���s���+6���8�b�j#�v�YN�(
&/0/�nkB�e�2Xh��p��G�UC�]�lt^9p���F����(��^\𮨣��@�&�4�h���@LV�|Ϫ<S�u��L���d��"G-�8yU#�5L	7C9���i4Ҋ8 �4��nQ�w�M)(�%�vU�&-�WY
ǣ"3<hj[�]E���ݏ~����F)r	�=q��2߆���|YC�1�3Ԟ��'�v9Ar�|�fsԄ�V��Hɴ��oK�Wg�P�!�j���tݚ�=�s=���G�M����)Y�ؗ��K��e�㊍v�_�~��ʠT%G.�/�Iĥ�X�]�N�Y��������*Q�Jz�Mz3#���:򥣏4�xG-�>����5H��a66
抋���,]kS]F=?���s�[��T���Eu=�;:E"慁ut��X�.��E���\�1?�!ᜁO�u܍ֳNZ��c�Oq�4]�A���{�Ʊ��Ȧ.T�m<��Z�l�S�$�v1ƎW��X��e*��:G0�b��{�^�SJz���~��}�~���=N�'�����7���f��x5kQ�։�������54���2�ؗ ���ɼ5h����>/h�'�]#Y�Le�ȁ./Q��9���8	�/���4�@�/2"�

�}C&5.���́��6y�
�JX�M贁�ɞ�Y��k�^E=�6�.1���!E���(a~�p�3q#8	S4�%b�'���4n�'��|������`䌬�o�\�\3�Q�=(_�eq���#s�*+|��F��>h8B����l�ŭ������|���]��n�$��L�ພzǽ'>�J�QӴ��ۑo;��u�vו&�ft��[�W	]g"�q,���ħ�BZ�Q65�
��!q$ږ
�ǟ�|�s��)�SZ�����*�{�����yG��6Lk�^]yz�r����>������p�.�8br-�[��y���tH�L���������,�5ή��sG�A[�A���
E�
eZq!�A������18�!s�Q>����B�X���*O$l��Nq-~!���o�ac
*ik�,�#�#�pA�#Ԃ�˴���ш/�y��T�
��n�w���kTq�<��[!�������	������INF�R�ՅW���`��P�h�gK�J�)�C�%�)�^䥓<���a�k���y7
M;+寃�������؈�X��Z�����=���p\)��U���D*��l����֔5&��\�7�KP&b%!tٛNlT� ��;17<���Ex7=liDu�K{�^h?���[��?���c�W�����u]�3~�l���j�a�?ۖ8A�����D�Tw�ǯ��_}�����1~|��o�ӳ�Rbc� IJ���t6�l�H��瑛v�o�5�K.m.m��ʄv#b%�dʄ�
���ۿF1��?�[��M���SSv�������r"�'�s9��ď9��$zǓ�S�EM�z��:����q���DZ��'lwI�O�fe�Q�T�֤Q��nn3NP��v
�^���"��=j^�����B�p��$�����[�t2OC�]ْ�kMa�0�,��\��H��X�)���=�c���T�i-4��f�������+�U�|�w�21������t�/1C�,�t�yjR�0�-�$#N����!Fَ�`�5^y���De������T���&�s���꛸utF��˃a˶�zZ|��`�`N
M�p��5�9
	F{at�Ȉ�R
��9�������0����Ҷ�1�нD.�T����z�1�hU���~��
�
mA[�rIΒD�Jɉl�F:qk8��e}�e
]ѝ��P�C�˪.�Q&~֛��6�P̈́��c����z�m���� ����z6;�y�Xx=q�1v�c$C�vԃ�؁,�:)����Q���t�O#u����@G�t�(��qn-$ˤ��q.����c����S"���6irּ*o�b?@N�݋�a�6����0�h���]�\��=�KW:Y�c~���DFjs���LBM
򭷞7�4�J�
��BÊ,̒�-�j����)��`��뽧}��)�<�PVT޿
h�i<:�ܞ������L�p}�ZN��8�����'*g�J�7���*T�.�>f�ص� @Y?(�r�sJ���}[��Ln��vK�dQ�n_f'Z�B�������*ѷ�GL��)
��`:�b��[B92?��r&�r���mv�7n�fb��V��L�}�~{&0���*\���N7��I��^4��,�����U��-�܎��UH��XRDZ͖d'W�a��~r�Z���%u�A��4~H�h
�f�lIE���fB3�d3��F(�Q��7�օ|����g���{f�8�_v��S��s�B�\.(N1��p��#�j �E��q�Zk��k�D+��&�n='v9�x������}V��F�_�̵6�<�t���-��I�
�a��Nݝ1=0�����.�yO�"ߧ��zJ�	�yŸ�	��}ŕ:{C�G��CԘE�!P��٨�b��'I��4J`7��6C˴�Ɵ]6٦��ǔpq����Hl�[*8j�[
�\�M!eN���al8�~��D�Jœ�e��*Ck�D���soR��	�9k���Z���ǐf�׶E�Xr�R<(�+6
_��r�>�u�&%�y@��?#��-j�"!�x��搬��LDN*� ^�"�hYZ!)�泥A$0�3Ma�D�:z����*�׆-���Jc�7ؾ kC���[y�`���e���.�{h�E�J��v
�*�Q���>�7۪�f��|�bi��N+>Y�`Olb,�*O'9�b?&���ב�S�����x��&�(y��@2>}�q�Q�S���:&g�jvǡ�lA�y�U��kM�DmZ0�z��$�IB�GO������0~�i��5)�M[���`���ol���i���y�-�om�B������>��P"��t8w�g�¢��ъ�F+�M`�bxfL��Ƞ�?�#��݉�-�b~[?t��wq&�lw�I�	���+��Z'z�y�y�7�Ҧe%�C�p���#� ��d�ʃL�)Gy�U��OΓ�0�&9O��GMq�WlEQ���3l�2P�����6���)p:��k��r��h3S�`67��=��\��4
��2Ѯ�.b��l�͠�[#^�5����U�q�E�L��|F4�9Vz��@�q�Z�9�ު,#ij	�R`q���Fg0B�d����U�Ŭ�q�,
����-�e�`B��|~���Y2��)QF���ʵ{u;�p�h`�aK��;d����ǻB�o�0��RKT�[���1�1�	�RWW,��h�/Yj��5�� ��f/��a�r_l����
F�=���v�����~u����H�BDy��6�4y�>EK�>���Y�wlG�L��X�=u#̜��pצڛ���S��[������[V�m�6�K����9(
���.��#p7�&�W�H��v
C�em'�X?�Mb_��ߗ�S�� �i�ɟ�gj����Է�#�/�g�!}!<u_�¾"�����5vsI%!4�l�8:sa���7�eB���2�ѐ��qPP�u�	��a�/�4J�d���]�K�O*5+X5[���6�|AP��Dj���\^��.`*�\���6e���
�b��d�J1xU�,���}��<^���k�dL���3�\5PSJm�\� �b,�圃�Pp�E�rl(+W�N26H���/���~�*��9��]N�.�u��}[�u�Q@;�z	5e�njP��@y�0�n�k6h$�����K5�ʜ}"����&s�,E�w[�uE86W�-O9w���vA��WL�̽�d�O�/5F4ZM�q3�Kn��iSNU3XN`T]Kt�웗��T�t/��Q6kgg��"(�"�%��b'B먾�T`I��>�MV�ƖW���#�%�ގ�M��YjZb�0�
����7�N����󶶊;�L{v�a�,�6��\A���AO���	g��MOxuEC��f���T��^������W_��k��SNݜ%7c��gK�Y�rΒc���ܘ]������/ѯ\I'�ڏY
�4>و��㘦�{g�\����q�p��7)�#�j��*Sށhz�4�&ٱQ���mJ�#�|��ͅ⪨5V���D!)3�1�$�:,K��#�l�-8�Xs��B�w`�U)r�m/	�q��ܱa^-MK��="����m]��G$˂�d�#f1�߉�H19E��j|��w��HݰyA��0�@��><T���U�%�\�f�P�%s��
)�t�dsl�?�V�0k��2�$��b/jŌ.�8���m���1{Cj,w�X>C:��F_`�%�z�݁#��y`����#*(!��2��1�h��u�Ц��X��vPփ��SP�p��m��hK�uk����k�ƍF��|1e��s����7	���׾R!<��Q��Ϲ!L��<rZs�\&.�)�=c�]C���? KD<��wCG�F�$���Gɴ��h϶L��ٌ5���py��ZOE�^c�r�c�S{�������ed>4zk{n0���SK�����%t��S�)���+g����;O9��/[%"��vGTW���f�=
�����2͑�q��?Q�QM��ˑ� 7���?�ly�k$�p�g%� �MD�h^�e���7@'�ObP�5^�o�k�����6��W�3�a����E�6~�#����~�'�=%��EJ�SV��0S<�$	��&�!�;b�g�����������Hڛ�v[��Pr@޴���~̰�պ��GpH�M�M��b]�ڥ�FL^c��(׸���ڌ��l�	&1j��|�Ѭ�V:�6����ުQ�E�m��u1���E���'Ǔ/���҄=N�
�W����L�1W]�,S��(L6���R[���wǿ��ӆ��������O����E�&�ƈ"�c+�N1��t���Ո���8�.$�.��/0
�klRK�)iu��W���uG����
�4-aP89ҍ
�j%�[Ō��k�D��g����Ӄz�}y#��oXVc���J���ڲ��Jp"�����@^�-O%4�a���n����9�Fw�X��Fg�2��`3��Ü��8W5���O�?��&�,5�lE�0�40��,!S��
�Ӧ�]�me�V�=��N�)0Ϯ7�_Z�[�v�/uM50c�j�^��Z�9U���i�ק��NM�ܹ�{���Kŗ�B�<���(�G
��<	� ���i���&���Ժ6��z�1�n%�%��0��(R���TA�?��j���j'�T
�>to��EO�t����[k���^�w�3�{�<��[%�>P���S
��?�T��U����=�Q�",��d���0 M3س��Abc����Y�BOO:�٧a̟Y���6��Pb���3�Q,a��
�����aA�P^_��5Vn�ȉH��K
յ�@��:p�ؔ�6h��Cs)����[�^Smw���r(�J>�a�C�o�̰����Ymuf^FbV׸:�zqDdU�4Ĩ�O��7�F���wr��Mw}>�:�fP�:t{d��C�;ܭ�ôrl��Vj2����%D8�}��K3�6�y��_y���-�e��uW[j�����{pC�w,��(��!�����`<@����Q�+��eSMd��
��Ow�E�Y���6�er�G6���g�(W;���v�u���B��?8�Vմ��p(���`8~�0�����/,}�D�����n��A���vl݂&��ԧ�?�2�5xj�W�#�Vz������>�z�g�~��p%��߲s�H����>���|�p�E7�A5d&��r�����[�L���
(^���9�c�u��`\û��VG׾�|d�?�C��e����6�O�_Hw巟�[�Vd���&ܖ�0�b7�	�p�CIƀ<�Z���hX���La�X�Ö�Н�\���j��Xu0("�y��}�"nO�ޘ.�k/�g`���O���]i�Ъ�s=��#��j��>h���PF��I�Qn�p˚�U��R¡��1%��qD�:&ݪ4�4{�^�٤�Փ���V%��~zmU����	�� �"V$��9Dac_��$��1��Et�#S?�j���]n�BڊE�6V^z�	�">�5��H�|E#�{&��y=%趦h��.x��냂�[��9��
��y�Z?���p̻�fk�uY��
�*k�e��Z��Z� _�5\�s�v&�AM�Џ���,]f�r�.��V�PD,˱FS6~��>�u�C
��s)L�Apu�#��NC��M������F��lcE����>�Pvz�
�1��>=>�IG6��}��Y��v�Lꁜ&�^�ޓV��GªK�C����c�k2������B;�rB�s��g{�)��2f#C<V]�����O�IM򤄶�#3�Ե�3P�_��(�z�\�{����2��c�e�e���6q��x';Ȓ��Gl�o���OJ���3�4obQ�����z��#��jh�=+�P��o��l��ԓ3�Ah�C �u{VH`52[��e(E�͏LĿ��P�����g��n˱�d��'=#-�a�c]�9C�����/1�#����KYv�mͬÆYgq !�*�Ć>���{�o[hI<��56
{?��-�G�5�ͨ��u����?F�0��}J6?0�F�?ON�ux�H��]�����䅓�c�Թ�1jE�.-��J��8�~U߻���O[��j�;=������8�)���w~W���|�('r�%�[�y���#nQ�fx|W{
�u�iX?,��8�*����U~��D>��f�r���s>
x�a�U�[ń��.8�3�A�?��!�h��2�$~sqq|�Н����%A�!t��"z���M�[
5A���(����1�����]�83�c7A�k2��;�o��M�%�����(>��=���?{-�z/�8x[Gnl��
�hW厃eY�:so��x?&�8��^���BWr���\>�U�%�	�U��!]0��~d��Q�wB#	��E�8X=4��PI�w"����E@��SL�Wd�*q
�{�맕}M��Z��S'��w�5Aw/�H�t�5�i�Fҏ].�lғ����%�luP,�f�����q�Q��xEc�4�=�	���^bzJ~�ly�W:����i[`V��
a�_������eG�x��VF�&{�m�=��G���ו	��=)��J�v�x渵H�jm
�<��/�߹L6y�o�Cl\�h��˘^��m��/hS��(S7>R"ѐ��I��%y���r��	\�@�X������S�����J ��2r����P�(�;Y���:V���\
��}��B������EZ��EoB��'W�~J�?�)1,}��:��~�h�;�D�}/F�n�S��u��R3b��ƃ�ʛ�M�l_�̖�ZS����y*�G[P�l��;X�>�(���������j�΅���x`=���FFm��c�f7��U��kl��{�ƩPd@EY����ϔ��Kc{���ˉ��Zռ����$�=�Hx2z��U��B�J�LQ�NJ�#i�f57?�
[�Щ�C���&�[g���i�h��F[�8�\��ȭ�菟c|��p�8 ���mY�Hf��9ѡ����DT�ǃ�6���&W�6*k�߳���$�1c|v��N�
L��i���}l��H{�trҚ��P4�x�io�	����XK�͏��O�JL��C/b�n1�ܗ��70�����H�xb���g�8�)����
˫T�mc�&�Y���F;$9�G6P)�^I+����d}σ�����7B	���'5�#1�p�e��ސ�SoF�ފ�%02�&���O.�hAަ�T��{V��6�������fJ�<��^uk�ZeT�)|�m,��%d�OH��������I��ķ �1���A�N�\�&��*�*�Z�n$��D�1Qm��0�,0�L�qq�ɷh%~�G��L�����f��T��GOAz;"����J,����Y�(�k��<�e�8�=���ޟ!6^H-��Eau��P�mS۝n�%�'��OHL7𯋈����5�j#G4�Y���%ϭ(��ʉD��f��S�$��!C�2
o~0@B]%d���,Œq�z2!yl�f���gt��i+�];~M[i�M�.�1�Q{�Q�n�b<��|:�:%�H��`��^���i#�5��tH\�9d(i�7��;5�C�b��(K�����;;�1��	#߷Uٔ��q6���q�ĝ&�����$C�߶#�k�����¤FVhċ}+��`6�u��\5O�4��ļ�~��x�s��!��vH�
��a�L �΃��d���Eg��D��4�b�W��b�q�!Vt�k�L�\�;C�0Wb;۔�Af�3��u=4=)�/�G�x�y;v�$�va��p^�è#s��ғ���1��&�ߡwyC����V�F��2`�}����b�!�2����M0��/�Ž8�V^�[�H�*ު.V��}�CRO�8.�A�/�p�ox�5�9E0{��(w�����h���N��Y��ęRHd�i���)��V|��b���כ��A�,^����i��4n/=r��eQ�p�k�(�����6�C��`n��K	�O�k�z<ט�Xc"�F�/U)���-$Jl�7��S�

�*J�<���C��i�v��o�z�Z)0ð�1}�ТH�D�9�
�d�a��݇�5��p�[�J:}�o�+u�榪��/k�{i��]�[p��ޗ͌!�yf��p+`�\��j筐,N���ۑ������"�2�r�`p�ƅ��(��n>J0DJ��f?�Il�ƚhn(w椋�n�[Ü�7pGK?9�)Rc�Bչ��)��Qe��D�ø�A�ZZ7�.u%��Y݋K���ߝRz��o�EX���kZ�39�_�8ӛ�����٬��|Ç�
c���D��9��^�|Ջ��j��%_���G�g����g%
^��g(��|��_
�x\��,`Wh7�Sv�6�R�LOP�u�^�I�eߣ2�����QGRp�?/�P6�7�-�9n�U�@���L9h�Nm�8���R�*�"k'#�3�~z�h�A�j��&f�N�#�Y^��|�X�#��n����	0h�^���ܬ�ÄYLVftq�������v���2����ܯ�+�n��K;:�.;��s��Hl�sq���Q��Qg3݉�HEL�6!�����Q`�~[Zq�O)�K-;6%'J��}�n�_jGדl|��dia(���f&�-F_�I@�XLx�0)�2��,��u�&������&�B��W4hz�nN��i�㚄_�=�d�ծmv-b1)B3
��M$3T�r���/�hz��5�,�m4H�$a��)E�D�{(�T}Қ����#�ώ�!� �Y���^D'/�1�mJ<g��
Y���D�AQ�y���;u�[\8pl$�}���y����qʩ���(	��� �پc�3WF�E���i��ֹ���<���8����&K��Ͽ��e`c%p+S�.ө
��9�J���rK�~�ҭ�(��#�����mZ-	��~�8��q��$�qj��F.'�87"FŚT������
�hr!�̔Y
�0<f�w��~~��Qz��ߕ�S�5�<����(��G���h�/"�����'[�����~<��Ƿ�*3b:D��hqp{�rɓ�"fB!����8�5�MR�oS�n&f�+k�ˆ�0ƍ�Z�����w�T��WxSS�<��~�7���dJ�����#[�#
��˛$�,��� un���H�Y��f����6�aw}���<��:v�׋^�Ԧ\r�{�Ju,L�Q�M�gA⌆EŒS+�''� �O��E���Y{����_^�-i�(�z��g����a��C�z��!������Zm��X�-Q�M��`�B��t��CpLj4��ψ��Ɗ��87��R�3(,�c��5Pv׏��E�մ̊���nl���>�%��ʏm��MCQ9�!F��M���5Dz0��L��R{䌁;�Cw�52
���VE��8�~G�7�lF@���j}Ƚ�í>�pH��C���1�s�J+�'��,�A(��OZkqr8>=�Y�<1�g�XzK����vtd��¯��fŝdD�$~��M�8>v��r���	<<��^�7w����|h�Y�se���ژ(�G�E4c�`��\���C;2Y����^W��<b��0e��#W�ġw��T�ޫ��p�-�Q�ױ_����#2xHg�5͸oX��gTX�|P,`3:���}!IwL��Ʀ����^��]{����%Rti,��y�|���V R�j�������c��%��p�gE@L�/Cs�[�� lAw��vŔe?�M�Ń}=����lf���Z{C1ŏD�D�)�=6��a]M�����Yna|V��~���|�g�Ùk��ڌo�j�b�X�O��oͮ��{�HMJ	�HWJ��HaJ�z�j��Dpi�n�1��oz,����+��TM��
�NL��`�j��{����P�r?N�tv�g�k�
�b�Z�?�B��i��F�6��
�D�JєF*_����w$s��$�c�\*WFXAa�.bы��]���a5ry)�JK�oS��xV�iQ��:�T�X��V����K$;2��z��`T�Kě�[�U'�e����[���~������|��a��b;d���?�7��*0�q�QeKVB�&}���7_�st�zQ"R�#_�z�
�F���5��c_�WfZ_�&��j|p��5F�$\��<�a�|�}�C���)#IE2���,��K
�,�k�s��c,�
���������&��%!J�\�&�Z���{~����%�G�V��ꮝ̐��e����Ə1
��zh�
|)/������WE
C�TNb��W.!0Y,�3XO���r�����F�zC���$øT��đz���Xtw��_���e6i$r�)VrԞ�e��П��A�ȡ�����E����6R�?��YE�G�H��x��*�������똉e�6���`S�k$v�-~��PC�����OG�g��sc���b���; �Z|���Y�۴���)R��篪ʰ݆>��b�	p������Hz�I��~��V��a����
ӄ�V�&��QT�$�RR��dI�p�ZƑt��dN�Vk��)��U�߆~��
���� �n�^���
�4�v2aS�GȬ�<hb�A�(("�����+೓�TI��f[�=�*�z|U�W@�������N�����
LW���Y���3�dDr�‘Qw2��G^>w� 0G��=@��*X�+A��*�sx�B��f[���q?OV�­��`����>Ti�@ࢠ(��#�����l��-a��*�(m~�Aֳ���e�����ޛ��ю�p�0.o蛕Y �h6�U�V��u~�2㎂�ͬ-әpGֵ���v�MZ�?eR|~o����*��	���Gk3���;�<�HhW������C�2�jb���x�u�o���x�@����j����j5Uj�0(�;���"LߌW�K�����q/m��{id�ӄɲF6H�m�'#5�hD�`C��つP���5Q�B;@)ɟ���{��@Ri�a$�
�^Z�����Ă�t�b��&��SJ��İYr�J�cVES�z�Y�<�Qc�z	���)/�D��u���B9s�Z@'&��7w��N��"�o4҇cSR6�Y��ED8���\.�4�+���@lYhz8�G\�%9�}+���/�O�|Х\�/���K�|���@�&�}� ��jFm[���2��^��u�`�@�*EKm�w�&A��5l�G�9.l�Q7�>����.��C����X�%<agV�L��f���o���"[)<�g��1_�s����l���>���D;�|�9׻���}n��ڙ�#/Y,�c�0I����@q�I�]gm��Լ4j/N&`��ы0s�*�lSBN8np��Ӣ�h�|宲KS>�M+	�,�F��Zb4�+���X�W�u`S~�7��\]�\-Y��	�:M�<�G^�7��Һ�S"7����/-�c[wC��/���{�
������h��Zߒ���XNca���5q�+G��L�:�;7v��%��������TQ:F�HN��&�7�#��0
�9{���$V�$�#���M"�d_�'���bN���*
���+�P��KGI�qX\zY��Oxk�t����6��'>q���Q��0�I����|�°gj�k��Ń�2r��9yD�Q�HY�n��WSr�E�
[���HC5�=�(/4�v��iC�|�<�� ]��a��SKp�ϊ~�R�S%̑Nـ��N��kɢ��b�8*�c�c��
%�5�|�2�'
y�MU��1N�b�F�Kۄaa̔�����L�\��8s��AE{��T��KP�D�'��8z�V�S��
�6���?)Jo��o$u��z�Rj���!�QxA��});h�AA����9��`n&u^��l�bdKR3 ���⥁�I��7=�Z.a
�K��+���<j�c7�?F�R���3;@a�0:91��_���e2L�p	�Mg^Z��౻,�D�!��[�g��u��*�g��
f&�r�I_�3����Q-a�Mz�ov�ʆ�4r�EP
�p_b��
V�[&�-f�Z�[sؠer�b=��y;JM߳��ǃ�H�kꜸ(�}�ԟ���N��� vp��-l}�L~���c07��D&���vв5��
S�c&bzQwq�PP)�@��X��zx(H��Aɧ�������������> gI��˴�ć�`�Z�a��c�.����5o���/�m�P,'��׈C�̩���mYG�|��~e�vW2
tڛ�c��v��c�b{�G;�0	B$���T'�"���M}�4��y&r(
ٓ�*[�����A�1ӭSr�襰��	�<4z�SgM�jT�A+ƅ���8�	E�������abG�+���,1�<�@w����&[�C�Y�� px3��~���!�01D��bF�O>A@
��BX��fh6�p���x0"�8+(��7��`��v�	�����o�Q�����_Zy�C�En�~��)� ]�P�
^��j�F~�5�ù�@�L�&���[����
��=���i��3�F���H�Eo�E/j��$��f��	���7�S��̄η�X�h�9�^>��H���1�C�m�r����Y~	�G������eg�O<t�����ވ��E�Cf��I�V4�h�>��`l���Q��X��޴΀�X�C��2e%hH���y��9F�2
?�ܡ��8R��DӢVf3l`9-w
�pL�t���\\�F��X�'��d�[g��_�N�{; h�I�ى��������H�9TP��rƱ�Zm�-|�O�&�N�f��+��:��(MC�Oy���
sM�%u�kؐ-���:GT|�BW���kQc�
Po�p)���^�dlq"�Ia���I���ȷe�쮠m�Z���)��d����f�l����+Ԏ�۾��̭�ēU:���K���E��Q�B��zJ�zwy�MY�~P�"R.ӿ�c`�C�=^�t��S�����)�'�y�5��Z&\9y�+�&��4�o,�k�r�����/\�5Κ�#׍���?�'�`��J�ð���؆irG���Q8�!u����g��g3��@��֥ZQ\��������r��kPÄڛ�ϑ�nY.Ъ�,�������L�������o�1��ͻWo���W��o��=�Ud�y��&t����f�Ug�A)��L]���d�@b'�5��!�ǭٱմ�����f��'�	z�%i�`D�������=+�[T�)�u�)���=�^n�7��O�'�ٙ4�s	���g�%���"5�d�΄�11�[�����L�*�O�9%�خM��U�B�(��_F���F1�H�}�M�QLee�_��H�B0g��4E5m���ۯ���|t�����'&���4��?[u�݊9d�mxnh�iNud���o|D���Q�t`V��J�M1�v$�Ύ�|J��m�o�l���ݴD)h!`�b�[](dy����c�/�4��R�:��n(�Ί8`�)���?���rS��2���PS9�t�0#+�9%w`�1IT�/,��a��i����2��N�G.W���08�3�:$D�1m$�Q��v6i�wWXL�YLO�ש�g���q�Ŀx@ct8A�=��]�8aͿa��ڪ+�_UXa��A�a�"���GT�_|>J�0������a���2�ȇf'2g(�{�s(��~Z]��P�j��z��:`i��+Q*�5{�xC�Ys��JtK��JBB�%ϹGM%������$����F����G�e���cE���DNI�k��z��02/��������S2_��(F����X��h�ҍ�����y�o���1Z#�⦌�$AHM�";7�2mR!JM�Q��1-K�]��4�N ��X���t�x:
e�hQ��|�҂��i�i��?�r�̠���V;��/��������n(�9�pf��Ջ{!CK},��;�J�u�F:�����Tg	T#��Ĥ��HC�|��1�]�Όjh<���@��.H(����!�"���l�Iib���a~Y!�,ԻD�3���0��r�ihҤXi��W���}�ޏI[K�*�·F���Q�[�^?[��E�j��U�p�-ب�09�x�.�	?5S-�ڨs[8+�%��"4���9�iʦ_Y��za�=���^t�5�I�	[���ŵ����z��$B��|y7J��tv�0s�cFW��	��:g�Vr��Zh��
���B�6,Qp�&�V�kK+3B~T�\̼[�j�r�Բ��\����]i��Ok���|�ƀL�}�?��2�C3�|��P	ZQK}�i��$`۰N*Sf&�D#o��=1nm��Pg�#�{�#�>;��mh���ܭ����F�A=2(Pv/�Ε�ph���P�x`�A��)uL kYfb�9k:K��U�ی^G�FNXb"M�N^����Zɚ��)@��0N|iR�(���AQ
�U��<|��~������"����Egm���U)�W�@�`����8*Q�o���!�5;֡�8��?E�;�]M���P��}�H���^�Ǡ.ߨ^��Hk�;�(-M��#���|�2�dG5�=EĎ�z��%*��Q��<�W�H�ǥ���&��8�2�^!�Fr#�WN{�Ҍ�x�h�#�5z���.Mw��d'���F��IU7יj,�yl��ڪc���6a�YR��%/�VԻh_�ۣ���`�P�=�EdOy���9�����W=���˔T��J2�zc�f�a����~��Z�D�1�~��w�x|�!W����Ŷ8�痏ظn��������	-N�6�T�5هNw�m�n0��Xe<Kޚl��	T��5:�6כ䛧��p��/`�o����?����;؜�䦥�ߑYW�WG�c׸umSt�{��¯J��1��~џ|�.���x^�����(�
E"�~��;7�������	������̼3Ǘ4p�Ѧn����F�
�`YZc_ܚ=1~�+{9��>��&�O�UN&o�����&	HB1��º8�1H�b|����l��㲺z�ߞ�ŧ�85��;��P<:��'�ɨ�;{�Yn[!JԠcw��6)��g-�+�IS����&k�|A��*��8n�8��L��q���J��H�o�`�a�.�U
'��'�Q�˧���DA�����f??W=��=������/cґWZ����:�`B2+���3!��ɰs1u95��<2ʙ��<v�5��4�Ƨ�^�p��n��=89>��у7+`P6��х|�X��tivVm�����ߔWG���ظ�	��<'���x�r��W9pF��B,2�S��TC~��"��oE��n����{��S�8���m��g��6�$^h��Ri�o�v���Ͷ>�:�E��-+�̦6t�ӯ�dWE"h�`CMݤFɔ<��N�/Y�iSN���'�F�r�y��ӸHX�����(eӐ�?�r�����`m��݊f,h��������Q�M�lN��ؾ�^[�E��c�����+rܰ}(G�0kI���Wϵg��`f[zE��{��(��yɺ��f�v�.�wdP��K_}a���7?2���bd�_j���BY�{1a⩳��q��Q��BWP�����)6QG-�t�:{q�H��"�#��_�Q�k����%
l�OS:6Y�A+@�����8*	09:��զ5뗁y����?��n�b�O9ȋ��
�clC�uB���r�?;t\�P��*���6΁�4Vg�^��9��4�Z�$?�&��(�.]��"�s91���Bi�Y=���0g�ͮ1��1�A{}!1^�
���]�ʹ9�EpI�@;��=s��Q�������	��ٯ��F mm��+O��|��2�����`N��q�e���ˡq�*����}���=��Y�4�=�I��9�Q��[�hx?�i��T(�*���{��8����b,�R��Sw{��=��%����D˳y�Xt��1��c��P�"�V��e�l8� /c�I�i-���YLj�`�?E2/E�fȩ5�
��$��SE�˷��hː�肀��[ΏX�?�������0.9��gT��U�������F��]���pHS�c�^H�k_܋�΅�|rH��YQ3��"$�=]Ϯ�顴�u��!���~?��N���M$u����H*�d�A�~�Ly�E�%9ݝS���YYwc��I�� � �c��bs�?6kq�Pt;�
��D�D�"�ƹ.P���?e�猓�+4�J�B2(^��(6�{���j0m3�qCJ���	�%�z�g�P��37��H+��7�Ϣ��ZaJ�}��"�OW��k�[&�G�!�+��!ya��Hw�0��CޛJ.S
s��8Y�紙�hQ��n�q0a?�9��8)�^���nCgt��\���>,Y�����:��x���|�)�A/�Qh0��i��d�C9_<ؗ�D'�5/��;�Wl��)4k�-u	��r��+�%�VRn��NN��VV���p�����B�h�P+u�?�b�9��n���@�p��z�[���a(�u��'.��>�/��̃��@�l$R���r�K��%(��%�g^.=��);L����1����΅Wj(&�*\iM�Ϋxy�:4墀�R��C$�C�ۧ���``tjn|O�QB;ۭ�Ml���JPc/�V�%R�	™I6a�n���FP�)gO� �������/����Vf:�8�݉k�WW%�W�50$��%�y��f�vﵺ�W�=|ʭK!�%|�[!T	��t�	s_l�W�q�_.��Yt֗oN��59;���̴�ԉ��'P���Q�|Fb�YuDJ�8Q\2zf�L%y������_\1XgLYGy�ܨA��
�q����V36O�[�6�>!���n
��ygw�f�g��[��E5��u��5�XT_��뎎��x@n�'v�X�oMk���bao�������o�l��-���pA�ɁPH7S:���|J5��;��L�Y>�!�  �Y��ƭ�nbY�/rH��
��[�
�z��\;<���=������;�Hz�vS�k��L�p��U��T�bI��\��`��n�2+�L�ho�'���\��9�_AC���I}���_��P��
�0vr_#�6��9���g�O��2'a���x�7����Sa
�{�����g�c�Ķ��3����jR��=�S��~�*}m�hK�1'��#v,@�D_eʼn�eMd��]��~�N�Yq]VJ$w�bi]-���R�=�;���?�n�	�֥�|����-�_�O
��"�"�L\�Z��e��m##G��w^�W)��0���œ���搙����230�x��ͽ�@ࣔ��,~�����}��y�OoG��0Ϟ���_�ESw�D��ڻ�p4`1d����VV��J�<�
��(?���H���Ҧ�G���x�@�3�!S4y:�
|�ݳ��u�s�[8�W�3�XLD��O�`=�g4��A��v��0�T}�)J��g$�#�BP�6�GR�Vp,�vD%e��*7u�H9(	qbő�M���?}4���2g%�u121F����,0��5����dKL�
u�J�z��輒Nj*s����ϑ^�8�����G�"���b�5w��.��J��&���;�����<�}ۂ�8�%\��D��\�V�m�/h�ⷱ��Oф�Ǻ�b^@D�����9����(�B_��-��*ձ�98ڣ6fb��ks'�r�hh��-�D�ƅ^�o&$0c|����R��Jy�c�]P�o%���u���>$��p�n��^v7�y}���o� ll15���c��9�q�`,5	�8�@�lh���Mѱ�_��.Z�;ޏxw��]���f̰�e��tꃟU9�#=ۤ�S�D��`إt���g
k���R3΂�\�*H�b:|_�1s����=.���Ӎ�f�Q�س�?k�N�4�<>
}���qx]#]�f�{�u���K8��a�=���q�� ���!FJ5���u�$=6��ߛ���bûs%�v�����/
����}�{����b����]�Q��#��3*XL��S�4xQ��u/���ƀHc�%��o:��M�t~@5m���˾.��'ZLc��&�������E���z�M��ΐ��Vj�s�F�L�x��u˘⠔�2����Fp	���R~�^RQ�j2uk�~wr�����$��6��[ȑ�
�
�27ي�~H���b'�p���I�ϻz��o��5ݳpٷ�����ĥ}�!j(�3ʍ�ݰ{�4WS��(���!������6��2]�Co���!z�	6!�d�&5�kP��2�"XIUZ�����X�x;�%b�NBcq1���r�XbLEt�.6k4�W��M�K�(��&^6�������L�Ա5��5F�{���{��iӘ$l��77�%�aћO��h���k|���J9c���K�K�Pqf�_���N��b\���q��[�]>c+D��wK��@f�&y���"��!1td1���J�A%#y�)%tԐ�94��aA�c�T�|c��듗��	�5-�F)�9*\�H�H��G^��!	�%9����$m�g�h󐻺m`��O��8�+1Z���[E@fpī��ɡ�g5���fLò	��h�9m�#�y�ʻ�v'�ƮY���e�0�n)�ժh!�;>��f*6v���hE�{��/�CI8N��9>���}�e��%��(�B&�qM
n෣�V((tJd�kPh����<Ѹu_M�S<��NQ�V�ɏb�����s2I����U�������bJq懶�����]r%$�lf -T6��\��1���if�6
S~�u��r�Ød0-fŲ~��0�D(��BL�Y�m�U�4�����Ϭh��G�������sb�iL��(g��rΟ!:� ���}��(�[�q�n�k�Es��b�}��/�?�w�ڛ�y�]3�1�7n�u�tn��]
��1���+�0q�÷�Am�v�^���:�мx6�92��D1��wF&��'�i'8����O~���8ċb��]�.�'?�]A
��ˮa��fF`�p��ۢ���ـfCI�HK�G1hF�:�b�	(z��"�Nvm
�o��#x����s!Z;�w�%tGa�[(�!TDIe%�N�\3@�W[��!ڄvR�¿�O>�QDP����Ȼ?t��?�������H���'�j�j�CS����yw�OLJQA�k��/��J
�ܥH �����7�;��Vw�J�\Ђ�*����\8�(��!)S"[���L?��
j��OxW�ѧ��`��}��tđ	.��K�_�����f3���|6�y���}��ù
�>�
wd���X�&aJ�O&�b��7^�g����=3��eY%�#�,�*�}��Z8�VJ^�\�T�����w����D>r��	�(��؟"�4��&��&P��1C� 7SA)=%��P��ZS~^�u��T�=E�G���nju�/��\~��~S��l�/��)��9ơ�T���W�RbA�$��I�y��j�_t�8�wB����#tL��{G��e���"���;�]5�
����u?釾TM�	`�iS4���4���p�'ŭVE�P�nbޮ������=u��"��Z��!���iK�yzŷm��ߎ�7���7�����&e�lU�9\*�D�ڸK��)�+C7gVC���x.WM��_�̧t���2�}������bG O]<�	��h���996�g;�
z���$U�%�O|X<�Ž�e�L��MB��Ap~o+�J^A��8+m_��.��	�� n�f��Q>�A<�>��F��w%'����8z���HQ-0�CcΤ]�!�s��l�G˲U�1&��ž��[�*����C����þ���o��Q!|KaH�H��u��n?$�*�3�C��8c�3��"Խ�
�yۈK�Ud�X��
�=��_w[?R���\��&�"��zB��XDs�k��U%f}R�f�}�w��d|�v��VR���S�l�A/�����Eq��5Xj*|�L���������-o0(���z��V.f#�^��w.ӿ�km*w�WO��)E2�����	��"i�'�]4.��E)$X;s��I�O��vek�R҉Tˌ�e5!Ե�S���8}��/��|��7��Q���=�cI��.�	�V8�+g���6���w5��-��=����ѯo1j�]���v�_��ݪ�;p��8J^Q�FE¸f��n����"��a�K���U$Q�`( ~s�k	u�qnş����U�w�N���t��z��[z�37Jn�I�Ӥd����Bj��歊S"�i�xQ�ŹZp@닣Kc�4�5�s<�yw�ī��<�'����o��xs�+ֈ���HJJa���������?��������������|�>�n)$i]���?�4�J[�z^����>�tD�Κ]����2��x����'2l`���I
�=	1�/����=�Eߚ�1�b
�}��2(z�d˓xÿ�9�fq\���.i��>2��K+�ZY���7��-��n�i�;�XC��{=�L�r=��$U������WލL �P��'(�|��j
�V,2�B,^�#`��6K
�zAD!wZ�3��q�J<���N�X�$1\�8Ì4��P�눇Q�L�L�r��U�z
��S
�b�KEF�W��؇��6\����_���֤��r7M9�x�'��QyC��%�56�P��q�8����lE}}��Q�����f��|��,TP|զ���V��:c�v�IVՄ��7�#���R���^�O��ϳ�Yw8T�����w
����KH�@BR���ͻw?�=�q:��?��]�&�_�5X�!��9��gm?��*�@&_��s����@�FF߱��x���ǐ&��u�78����� �%�}���#�r\�<�OyB���HX��Y7��^��B���\�)�ZNx�� �����a��
8/Q���z�@7�!�# b����jt��|l�M���y�;b�4X���D��qyB�}�^�,�e���r9�p��'�I	y��@0�q�KĵX��nl{��M[��j;�m�7R��ۯ�Lk�vS�4�v�?��̇�"˚����K}���޷h��K�&�
ńʶ�&;��ҽ4���_�?k� �J-M���¦#�S*)�#߃R�9�ܔ
�܉��+�b2�װ
�`���M�	|���^��˰����-Ι�o		{�R��b0o�D*2�0���'�^�?�_�y��=}�O�Kl Ot��E�\dqi���(O��K{.k��ru�$V8�ã��
�ΡR��.:�����7�b�+���:��
�װ�x�E���]�
��`�,}/��ʷU��B�	L'mVm��A�B9��@�����N8)���r�Z3emt'�����w8�!h��漈��'�*�\����GA8yQIь�k7~����I����'x�E@�1�xe4�$�����p�:~�qM϶:$¸�Z��5g~�^�>��}o���Զ��

˂����V&�C*i�(���O��]��ēp��G~��ܒ�/&��}�RYz�4>m���Сs�ʷ��
ky�K���l��3.kri�P'��F��}�z�+B����,(�@�Gm'��"6��S�dA���������V%��"��=?Ɵ���9�]`�d�>vb��+�1�2HUAI��� ������U�^O����%�ˆ��wtS�FK���nV�n�T�76��\q*�h�����U>wB�v&S��b\,��z\�^��$�7����Gʁ��Ou����������?_�����W�6�������
���=��nm���A�~&�6� ���(�%�
��]K�a8��=p_�)o���hGp�M�
����hl�\E���d|<>B�k�2�<��M
�>E�����K���-3
B�[��]��+_�e��^��9����E�}�f�X��<���
E/4� �Аa��LRl_v������ݟ˘~'��l�fqe�A��`[w3�3\a)�^��_|�,��j�?�=u%���/���~ϊ㰜�r>�Z��?���3��=�{�PK�uWV��{k
�N-pkg_resources/_vendor/more_itertools/more.pyi�ێ۸�}�B�}����
�"�b�-��f<y��i�YRHj.����$�")y.�4�H"ύ��C���݆��džDa�i*�V>�����Xs,�u��蘒Ƕa��u�,hS�3=Fܷ��ϗ�d���Kx����X����~����*���yjj�iM��H�Ŀq�����	|��~��a�?���I4fZsCX��~���#���O�[G��>�߉(�����$�R^������.�p&5�,�T��5�)����'	ظUP�̨D�ؒ��f,�,>��������z���^�\y�V�Օ��J���������Wˢl���p�:A���H��n���~�R����e/�/��+)�z
~Ô+�?Ŝ�rW�V�^���~�^���>,?++�y�������_��e����:�H�0d.க�?U�E	��P��oOl�#BN���\_&��ş�R�f99�<t�5���E
�.�w}Q�Z����dYp;I\�К
!a)ؽ�*ʅ���}��H�����E|)��Ӗ�v�U�Z�-Z�K�|f�I������4�3��2��Q���k����zqJθ*&�M�_NJm��8sa����إ�p��/w�|�,�3$�a�e���	��iI�5S��-�a�e�����|���܍����Ʒ{���3�#a�]W�@�2�z5��*GҊ�1M3�Y�L�	Jw����u�X�?.0=]]��RPt	J��R�utԎ�"p�_\\/�2�A^Y���u� ~h����6P[�aX���(O�ry�Z먜��[��A� �	tK�Ԧ��G�4���h�^8KHlHD�$F[xC�R���cgB��;a�;�:ѵj�R~[;��<p��7$rۦ�P�bk�m��j
�
"�<,�X�<b�#�~��`sk]+'�R����Mcj��;`�)\sG��W�a����@$��z�s^uZ����6�6
�(��@�*�,E8�g5�oӕ�D8�o)�b9$_�1���!X�)�%�kr?��+gȅn%�0ci���#����Ԕ��9�kP�w���Y�\u�~�+�
��z{?+�t��ek������"���wr�C��M$i=
�,D�>�H��;���^�G��9[�-IA�[��n�V��m UB2���X�*���cc�V	3f�8�ݻ���'
X͞�g*UAr����kqag�
�	�f�N�DB{G�@r{?���T���u)a>껖����V`L��g ����8�b�ׄ���3mV�B��>`��7UYc��]\���}{ 3b���&̟�L<`F�g��*�i����D��ۉ����ƍ�#{O%�GH,i[����ݣ��#��D�w�>b2!�"W��e;���3�L/�F7�� e���?�]�~b�j�nlj�u���]��XuD�����`7R�I��T�D۫br\��/�5lq%��?Ӆ�-� V�#z
���S� ��;m��a�C�w��%ҕwq���q�K��}h�����|���cKz��5j�7%�^JT��ey��Ҝ���M�jۤXl-�1�K��R����>�}W�L[����I��>�G5�H����^�6���(�A�D�'�:oK�4`��{$?�]�	�[cR��2I����R�[�MV���ܚ�ک׸Q���m7�A?&`�Ppu��9��5O!��e�T�C��=�>���f�C!���KRM�i-� ��L�{F@����ɘ4��J��;lϚ���#�p�!�=NG��B���Y�E)|��ە������*�$�qO �zn���)�ZO#-��V+^�N?����ABR��h�x�D}^�%_��?�����`}H���2��Ly219v-�i���=l��b}/�ߖdO�b�^Z�M�h��5��<(��<�4ţ�	Y��$q�F*r�<D#���2�u���=!j��⩉U����˙��Ñ�H��[z*RO@�!~�ꄓ��/J贳�ͻ�*��3l<DE��y��MA�w�i�xD�:��-��
��}�0b�u`	Tޗ��9D��5*�c�#f׈��|G��@�8T��52NB����!uqr��0�e�s�9���p���Q{F���8����?��
O��w3
R�� �&���mq�Uܔ�
=���4.9�dG�N��T�1�հ-�]0#Q9~ �H:�G6[��&]��c�Q�b�{��T�9�.20w�4�9X�6��
�X�oc�+Jn}uw����C���%�Z����Ei��5\���uR�G|�G\S���X���6/��X���|��*�>>�T�9��rd]�t�	���,�D�aX��γhC@��ϥ!oI
r(�F��N׾�$]j�
/���L4eeWa����D��1_=�k�$���-í���0e�T>�eA�P]L��e�i����#nM�����<*��%T��m�x.T�֢r(_��F;���u}���xT=ƨ��{"�Hu'���Y�G��OVx�2���
��N��U��*	L������#&��Y��}w�"�+k��'/D�1N�#A=�ӕ ZQ0D�
$��vC��H��K�1�Q��(�ZN^C9"��S�q��V���*�+�y�>��x�O�渡���'s��h%Ūo�,�e�競��o��?�s����~\i�]��շ�B|z�񤸬\�nF�yX��:�����;"'�A'�r|l'Jh��9}׷��µ��RD�ߑ���9m���!3N���C�l�%�|�%�y�]�ۅ'xc<[dǖ�������=��O��x��rxv��[P ���
�Y�bHl����&w9R`����&��H�hS�
/����e��G���h=�M��N��R_@&*�[ִ���!5�W/S��h�N���N�ho�I�;z"4~e��!}!p"���acI���
�B,C��LGї�hg�z9����,p���<`Z/bʟ�cC�,��JM�Nm���@z���n�): ���ø�kz��-҉C��a9Y�W!��e�'��߯}R��$��<u��P/rD6n����%��k��@�q�)�����A|�W�ކ]r�F1���U�JY�MJ<@�:�Ƒ�&n�<�_;.�w��GQ�E8�<�Uo3Tn��9��W�Xh�%����s��5�O����H�#��!��x��1�Etb�x���y{4g9fL���l�\4B��K�Cw��x�'��Sț��|���$t���IJ�������9�Z
�Dj����|MD#TG�]��甎�^��-C�#���h�[�=;c#��������Q	�& -����J7X���o�w-����U�~�'�3��	���F֮?�3|�G����G}�PK�uW-pkg_resources/_vendor/more_itertools/py.typedPK�uW�i�cHc/pkg_resources/_vendor/more_itertools/recipes.py�=is�ȕ�+z��"HC4Eɞm�*��J6N��͡RH�h��@��:���w���d2[�*�Dݯ_�~���y��ɧ���UUnU�Ѫ��l�kU�e���*W�8ktՔe^��\h|=>:z��j�/�u���Z��<[TIu�P�˓���K��j�,�o�*=^���ȵ���"˳�^e�]U�hD�V���kv��0�@R��ٝ?��ǻ�fؖ������0�4��`zt��ɓ����\�t�4ee�rEV��MvY�H�T��ם��d�4-�d�t�-��DyW�t���\�2:R��$Y��r��
Z��>�U���E#������%��l)/��0�t��N'�n�j��K����l7��b�kh6d���Hu�
|���:Vu���}��	�vj}w��&rt4�%y>��uI��+P5�<�`�4ˍN�W�*+=��f�
�f�/�,���כ2���Ӳ��'����YS�m�U�c��ita�!�p�^3}�Ի&x���3O���{;�����_���q�-�y�KҢ,��u~Ϫ۬��WM�/��fI>�%�Ue����-�����
KfX���V��;�����6��W�,i�n�zd���7�1[⾱O��Ӫ��I�i���)�X@
��ڧ�1��{�,����}�r���=��]Y{2`l��"0����q�<���n���6��u�^.��"�zE5*b	���9A1��n�[�U5*F�d[�2۫�V	�ٺѨ��իW�4V�/���ph__Nbu����D+��4�|O
o̬ƌ�TAd��D� �:���db9=��f���؊����Q�W22�)&��\L:4����
K%ʫ��
t>Gu�缐�C�L���)<�e�#|5R����)�,X��Q�e�X-�F���Z��۵p }���Q�T�*%���Y%�tS��X}E��R,޲��
u�ܰ�@�ڕ���$�I�eg�j���*O��4Qw��N�Fj���.��g��O�ݕ?�mo�������A	y�J�MVǭ~�?�oz�<O�{id���9M��3x���>��5qf��/�����8h���-��nt��7�.��&����j	(�k-��x��T���\�
���}�hf��%�u@��2��Od�$��7�Șa^j6Uy�}���UUVc�u�����LAv7	�����f�1���
X�"��dɂ��}�s�Q;�}��E &�V��P��a���E�y���A��&�pN���~)sA�-O��=�q�Z�#Ս�Z�-h����e��$IP�����ޯV�2���>�n����ul�odK�jS7I��0�;'�Á�r���ݎ��`�r��	���H��r܃1��M���˳-�)�މ3H�#ѝ��(�=��
}R�=�o-�cu�p���~w�Z�}�����e��\⌗��Px<�ԇ��7ufī'�r�iQ0��l�6�+�KS���d�ѧU(iq��2eY��y^����%7њ�
WЊx�t[p�/�ik<J���C4'(����3Q���Ä��Ѩ����
L�{w��
$�F
���_���o�*�Y��g�z��6�ȊI��yjT)n
6ʽb�J�
Wp3��sUؾLtOر؉=�Ʋ	����	�P��jB�ϡ`OL{��ˁm잵Oq��n���)��'�4��O�ŀ�z�xg�f
����������N��f��W���s\��4��Z�lX������*Q׵��k����~��M^�	�C8�5U�n7�M�1
3����6O	���q�<ځ��^,�2�X;H�
��mRܓ�W���i�#
w	��X����Θ]1���e�=�}��=�ˠm\՞U�ƍ�{l0�xE��Pe����B���i����/b7��]O�y����g��I|�-�F�.�&���zdɾ�gys����h0�"Kp������Ҵ�@��ǽ�������F�;���2S32��	�W�0�-��H!��Z������œ+��Mк]�Χ~���6�ȃA2��5{p�s���D7z	����3��&�e֧�--7��{P/�=���.Q�M'��g�Ƀ�n��c`���f0��Q�������tH�=��p�o49ԅ�����ةLJ��n1=-���؛f�vu���W�,���dWk0Xo7�KtC���6�`k�X���>M�\.�C^^�,y�{s��G��(�ŵF��ߏ�N��3���2^� H޾�fӘd�[;�(��t��XP
c�l����;͑��<\!�?��'��Pv���hY�8Ax���{�hB:C5o῏���꛳����F���Ձ�o��p���S��t���g/�N���\6���Ͼ���ܼ�Z���~���ʄZ�l4{�c�˜"�<�>�LP��afb�(� V�*�֔����v��;v������n��q�Ĩ�Kt�O@�F(�/
�|v62}.�(��N�'R��0���A�5�3tnY�!.�bo���P�hݲ���Y�μ��v�DZ6�=ӭ?gb�x�}ii��z�	1
k00��By��̧�l��/`���T��Ƴ0/e>f�g0�%xY��cAV���Ԅt�?h��GA�Xl���l�:_�]�����g[�u:�9��f����c���U�	(��}���L�;5!�W|�����?�>�?[�38�ɠ���C5�b����p��
sUD��Z���*�����լ�܊ltv�
$!�L��(��v'8!I�l�V��3�*A��_�a��h���<\���-��n7��{�\g��JuNu�}�(��X45ʌ�K�{A���K�YLA��l��+���'�W(m©`�m�����P�nQ���>
�q&h9Qfi1h��*�M��Wc(:@�|G���ر�7��3(���f�3��Cn�k�&#q��n=;4[	��L����*s�Ĭ�@�|
(�,'H�t`�x���qߎf|ds	�J�4�ֹn��w��`a$�#�w�V/�J�Uv�S���4���[�AJ��Ϲ�g�ɼ�_o����b�
$���e�B��N���HY��F�j�2�����v� ��v�]��MYk����;˻\y�:��h�1I�Kq�|ٚC,�(W&��"X����#��E�
~.E���.�ː���uQV���Z�eత��D�/��Ø�M�-�<��`���F���6�K"Ÿ@֘`҃�AZ�)������}����?�����������g��}��w��?/⋉N��+�Z�����VЕI3Cv��B1CuDN��ٺv�d?
��< ���}X�C5Ģޭp4x�%Ua�(����2�u�m�CW�e����q�,)�����c�1��nn�l
�~_�
�9�y���#y8�cӝoV6��T7[$I���&�j�/�f�Aa�՝S���a>
X�C���hn�X7��V�3*yY��B��#�`�,te����o���-�������
'�>�Zk�%�������h�"r�:�"ax�N��d*����x��܉�v��c������f[��J��}d]®f^��/Zs�>=�M'/�+�G�p�>Q�c
� �l]e7~�"��m0�:��a�y+����Y@�9���.���|� H��_��vڭ��iڪ��O5E6Lr��J;�b�]̌�����¾��<�G��vv@�1?��\��!y���X]��Fy��b����Ŋ�#&���������n&�MT�^N

B���f��=#��= f�Tk���` ���a'R��0L;PDO/R�{h�B\���X��`r7ti��Fn��1&�K~7B�%�X�uB�ϒ��0~��{
�Z����7`�ʺ�"]���M�
�O�Xȗ&��#Q��(��:�ؔ�Q	cp��!VG[A�x�V*�*�.�9�`�s��kl�bP˥
);����0�1D�u�
<Α�SR[Pm�U�Ƭ�M	�8V�eKARR��]��O��NL�a�C�t��Cw�����֦E)��Z�N�5�k�dD�1�8N��p.n81x{��}���:�u�x�V�t�|=��?�Kڸ:�|–Ki�H7�"���uuCy�*�i&����͛7o߾��=֙�'d���B"@[�F���q�+�Pz�E�5gb0�q��`��.F-p�+�r��,�(Czܘ���	
0��z����t8��i���d%����|���ϥ–c^^�cu_� �o$��
UJJ�$��pT5�fK�Y�����:,��	M%-o;SN=�L�;�Dӫ�v��8�Fr����1͏�~�OW�!37d����f�mR��_�0�ԟ��u��DP�s��7]P���K>���%����Y\�[t7&Έ�C�p\(/45�%�NC��,!sN��M�����
�x���"<�	F���{�sƆ�
X(���31��g$����
Lt7M��^t��Q�L��7x3������V��:'�)�?�!��#2���?(��t�8�ۘ]n�� ��$�4l+t��X4�Ϯ�yPw��$qO�4�g�
�pK�Ʌ�P��+��rC��2w�EҚ��j���꧲)�'���ywz�9î�qS!��,3�C��1u9��c�`�p���0�/X��.�FiC�8Ϣ�*�B�T��հ���2`�$E]��l��JsU���r�V��ՙ��[���xW�b�	�a���4�4(��o��Z%�NP����d�g��w��g<���c��=W'`	�d�9�c'��;�-_�A?��<J�_����
�������F^��<'�M��A��,U�{�&�,��Ȟ[�_*%�=�_<��@0\�>��d�2h��=:��>o$��z��F����XیƔ�����jm8�=�'���1�W~A�˟�|��+.փ^�?8����2�U���v�S#��3!q�'n��Uɭ
'���q!c�Q�v�Yk�A�X�9�3@n��u�@-N4Xr�b�ׁXbt�Gl<I�v~-v�V�J����1̱艂?>�4��Po��D��d� �ԡ��(�ݡ��m�k�B3��&<�Ͻj�pG#<����3;�A�s�$~e�?Q� ���
���.�q{:�6w�3�~ujo���$��0�o�u�\S�x��j�@
�cK�if�$6��۬�͏���CeTʙ���������_}�����Ȓ��
U�p%�	U���6���Zk�EG�~βSl�Uu?��e�6˂�큕a���W[� 6�Kפ��D��)AF_��c0k���UX\�ev�$���%��wװ��#���b�4)��'"�.H��w7E�x\�0L�5�����W�[�
Lᖝ��"i�.��se���8���K�~e)@�5�=�õ6���ۉ[Cι��I��e���؆x|ulb�����}cR����2Ԝ�Ơ=�
V���K�c~�v��{��Sj�q����
�!�zbj���?|]������+�G�;:�$$x�C�<�su�Cd��dC,�-`�3��2�^��R�Q�!"
_ٓ)ĺ����R��3F��2��J���l�k��;�a	�O���e6Tϟ��� �5�����ѣg�Ѷ�l3F����&�98�ɦ�����ƖTW	��W�,O���p_7x+�FϏo�1��P
�!���D*Yz��qj������B�%$"_�;���ԈK�bX7T�o����n��h^��d<�� ��CaS�uڗ�8����`�K����U��k�#�n�;��8����nj_=t��^�W$��t�MTg�"�1PWa˝����7��2�+�Ц7w���
�uNsW$�)5:�!�!�=���3>F:}ɟ_��6�s�)uE��58���j�ڤqhj��1��i��QA{f�2S5P����c��/�Ϗe�F����t����—x��^+`��l�W�PF�Lds=��p��kׂ��Gc�b�l-��mI�=����m^e��M"�gIH�Eq�V����ÛLj�~	_��TWAi��Ε5Rt������OޡZ{�v4�b�EwF4�ji��#��`���n�y�⭿��NK�h�n�^����� �d"���pAȋ%�v_S��j��ʓ�c��ev6��P���HYꎴ����k�A�L��.l���P�.�n�o@i͹�N~������������!z��	j�N���|&�bi2�a�Y؜^(m�r�Vs�y�A�Ɗ:D�������cB��q�#f��bI���l��pU�8�
{#��e��1i߭�oM{p��rh?�E�B�A�Z�ʒ�XͰ�"ÊbP�T��T����f#
�w~=t������nS�Y�����Q�5�/�h�E+W���b�@���t>��2$�K"_�7�o�L���=�<m�)��+"��'��z���2z"g�՗8�{�ґ�"���jKc}��
���򬞥E�^}��
��;�o�DRd�=8��ű\�a���%.���������
�6�[�_z��q��_��u�\��O�
�m0�]K��J��f�ĉO1c�0�_b�6멳��_��|�dpae�UU韸�
�5A8#�j�x�Zo����b��-�\p�o�J��L�5����K���+��'�;���:ƴ�J��/I���3�T���\��=�
a��:�Aϻ�M��?��\8�	[�s�R�^��w�R��v�=���3w�'��M�4U��c�����S�-�-s�.��7Z!�|�D�^�:\�K��2m3��u8�(�uX{'�B>!hW~}����'�s�;��N�nj�L�Q/g��&~�*��}%�F�Ί���"Hr?�w�l��D�h���Q��r��IA"b�qɽEL�	��u�̨����N7ȭ_-%�c����w�_�:��Y}rP�Ն��`D�S�PIK�.�@v�+~�
��q�f�6���-�%ڗ)���F�g�_ �0�NÎYj��E�@�гC�jƓm]�Upnn6��$��	b,�R,�`>�;<�0K`#���ꭍ���Nw���(5*�vǮ��rr���(ڜƝOM��r�8��`������� �!d����j�ˆ�,nz9�7��e�4it���TUr�ECu=��������S������3Y+J��n�K�(*쀩w��q���;u��9�}�vW�Y͒�P#��Q��+���mdl�S�{�^�)'�ȶ���~=_��o��L2r`����X
��9J%⽥UcK������z��x$=��(�Q)�9��^�s�*\��4���u5R*����]���`���k�^M�
f�y��l��.��@���t�v2y=9ǽ�n���'�;�c.����U�k����9�ٵڣ��
�H�.T#�.�Hʟb
8�I�Z"��u��6O
��N��y�a[,�t�Y�����{D3�1#}o��:9�BMCi��gQHͬ3,�5G~l��m���~1|�1�e��E�t`�2�9��_N�W�#�{lĹ�N�:��S��8&����{�uQ�+/:���-j���r0��n�y�������s>�x:�A�K�������<[al4M����G�z�K�����<�Œ�ޭ[R�xO�kA�*�LX@0�z}��-�|\�Hz����.�@Y|Oq�����o�ˠf���dR����4����^q!2��87�&��\>F�r��ҕf�`���@�J�Y�EU�|��W�SQ8�5����%�HHa�6i}_i�a��O��ɨp�ۦ�ͶL�f�޹�ö}���	P�W���@��]B��(�i;�P�/PK�uW���>��0pkg_resources/_vendor/more_itertools/recipes.pyi�WK��6��W�!څ�@r4РM�C��=��e� hi�˄"Ur䍁��I�mI�d/�����y���{�*cYm,p�`���,��^�W�55�j��-�ɺ1��ڠ@i�[�=xl�~�׳�߯����߄Rb� �� E#46���2���O�o��vn����A"7�՛0"F��� ��謄Jj9�-�������ۛ�%S;�Z�C�2�aRc�dGus"}Ϸ7�LI�~�awww��U!�ju�oN���'̇��P�
�A���7�%�TK(�Kd���Lv�A������7���	D?�H��	���q"=V'�{F�}(ZEv�3 ߝG��$B�Au��{��Ih��1�j�Ec��/Lz���ψ��%�t�]��3�C�*y]n�w�å4�XS�f(ލEͿ�0s�>�U�:���w�'�����\[h@�Ϩsn
C�(�v�e
�:�sv+�#-PE�L�]b|i��[f}l�0z�hMۀ�
���yܧS�N���+�:Ղς~a�JH���">��f/uv��q��GCu*T�x�ќ�"���T���#ס�<�<Tm��:��t���[-��p8x,��)��W��I�i�Tw�>��?�,5�´�z-���h��w�'��}�=�x�Q8����ڣ9G֢}�д��}�h�w��
*W�C��m�n���Ӯ��Ն�A�̗�k⹫k�bej޷����ԱF_�hҴ��[��&9oT{]�)��J�/*��N4�,�ө�(��K��S�Q�w �Z]���w�.���l�2��)����O�:@��꺨Y
jq{�C�d^.*�ۦ[Y�
Ǯ_��+{ZI{��_6|�dIo
���y�遧^n]�hJ�׹��$T���PܿҸ5]�7��Ux���4~tF�:���{aX������sF�͉{��I����U5ݷX<A��������5Ɲj��m5���4�j�u�����a[�>�y�[%
Zy�,�PK�uW�=64�+pkg_resources/_vendor/packaging/__init__.pyMQMk�0��W��ޚ��v�`���aP� c���J"��Ɩ��s��b��!�K��CO
!V�Ej����GF7y0}��X��rʴ5|��dt��]�Y��2�^��/��1�����9�uœ1��c�����ѯ7:3Y�� �)_E�2�¶�'X�f��@zXD܇in�/{��"&���c��h��WIp��#���u=��\����V�"���͒�]�M���e�`�P}�i�%](�3��C0��g�:�t�>�*2���7Z�ʽ�#�i�G�q�W�����0�������V��d�PK�uWb���+pkg_resources/_vendor/packaging/_elffile.py�V�n�8}�W�ꋴU�����v��\�&X,�5Z�D%J �"n��!%�R�$]>ؤ4s�h87�u���x$�R��f��e��Ǡ%QB�"��(y����D��.�� � *4] ��x�*.4HF# :C�y^b��R$kD"��d'��y�'�>���'� &���ֹw:K�t��zU,�(K;�Z�8�;l��{O�0~ߏG�wt8
(����"��cWh�LS9D*L�(�XV��j��0��$���>xӉV�J�p���q�{Rͤ& �t���f��,"�0��D�s.��z3��en��$ 7~��8����D��	���iR����������Np��{�x8��+����t�h��^M�O��>�3��j��}M�F+.`�ޤ8B�=\��͞=}�)�����rU�>�Ȟ����כ)����W�%({3$c��
v#�9\���k�ۧ��5���#r��ʎYF(�3�Ü�C-�;	�0'�F�Rڄ��vG�\+w䛻�\^BR��~�n!l�`�ؤ*�p�#��5�.y���GxVl:�v�U2�P�v����������{��J>��"�ӈ�5r(�f��&'�L�$�L�±�4�Ҍx�(�M Q���
-����u���¨�9�����z�4��|ޒW�({J��wI"��S��1>���3��#�<5�U�l�X�ABy�����Y^7 ]L<����Ĭ��S7 �I����P@����[�>9�����Y��&�ыx�{�zu~WWW5~WvUx(7��F�g���jxG/�=L�F���g�s�/X�B޶H3�d	Q��'��m�x�
�>�0s����A�oJ�Ϥ@��<h=��iYѭ����2�L(��d�S�s��+L}i���2�98�Х�X_da
��[ӳM�$��cYjXp^���ƍ!W�}i��Ϫ\�k�N�}�� l�?� U�o�����M���Bf������SuCS����v���0g;&0 Ćk!0��{�����|�$2~5�_�x�9H��Ұ�6t��d,��44E���`���L�zEL����h'���/7������/8�>U��P��sS�
��b	^��el>V|�N޴Ê�Vb�
�V�Zw�~��ZWh�8W�e88��3�v��3=��̌��x�4�z��{A.i�wg�&�*�22���W�B�!�����s�Ԇ�
�Lo�PK�uW�"r&`�"-pkg_resources/_vendor/packaging/_manylinux.py�Yis�6��_�af�R��$_I<u[ױS�*�'v��x=DBj^%���L��>/�R�t�m5�M����,�,��Q$�B��ڒի��E$g՛y�E�F���~�E��V���'2Y��y�ƬXe����.{+��"�]v^TO<�M�E�e���#��[��E4��HTh��'W���^p����I8}ǃ�Lp���?~��?�����?�������z�~_/���Ϧ��7����ߘ-��Ö���C��+^,��^|`IZ0�ğ�w�ʤ��Z�4a��k����B�$�Y,�U���+����9����E�J�m���dz�1O�B�[��3?�$��=�E��m߈�����D�&��;�b���<�G��f"ѐ.s�3$Z�������J��P/��@d\^��9�����_yT��a�dP��W�$�ɤ|�y/��(���H4��`��[�<ܞG)/t����`�(`�"d�(!eʖ��"g�\��˄��dy�*Ԣ���h�
�ya(�@�H.%�ao�q���xY8ߪE��IC{_��(�<a��D�L*mRZ���/�d�bGG�/x'�;v�$HC�7���ś�ن������w��v�#�P���`G��V_u��cG�j��iȃW�X��.�w_��a�?
��`��3ٗ��x,7	F�]�?���5Y|�	�k���z�2v��	��<�:���N/�c���HУ�}=~t>�`|>gDƀ��p�`ɓ�PL��T�U~.{,�E���=,.(@o�b�4ۑє��8��I)�h7�<Bda�T�E�)��(�w٢D,i�Y��R�H��oD+�J�2F�C6�Q ����N
�z<v��K�%�7��2�i[f!/��*�:��|���a){[���;=���w~q��Pg�[� [���^�V�`t��
�D<����9d�Prv�ak�dv�2	�|%!��֞�}+&�a���m�u����ѿ�r�[*"��"6��Z��R�Odq��u�^�V(�YJȕ�T3����
�(i+��tꡦ�:�`0)=Be�,����I9xWJk��K��Ŋn*��@�B�IB�5`�rҤ�"^�$b�a	���Pv9�)*���(��gQ:̓�$�wg�x2#(mTaz���t�r{:y��^�`�˴��HV��)s��x���W��
]�!��B@9Pi
�u����9���^��k{D
�>��p�5,L����qSx��ڷ�z��\e�,�2�XCc�-Q�A���EU��e��ڥm,0S�w#�F��eDя
���C�C��f�~��<�,����3����Xc� u���%�����Z�05������4��C�"Ot��S�0�5��/����Ӗ�f��8�P3�WdcH�@$���bt�Օ�)5!p;xt�:�.E��Da��y�X�}�*1 �$"�{�0�����~.e.XZ�a)���e^��е��_�S�	�H:�XBu��D ��p�R��u�h+�(\A2�h���f�q��{ !��H��Z$�x�dB�~�IJJ��Bg[���NfL�P{$�+mY�"h�$�h��L�x�y��%Z�����Mԑ�5�
I�PE�x�(��M�5p`,�A�%��=�	�?h���@�-O*C!���ʵ̋�$jK"�c�OV��DFdt;���b��Xe�m&"�
���dA��"�
o�!�m�d�
��������Z��p��")}s�3p�ڵަ��{���oV�,�hR��o
짒ѭ���U�5h+~��#���j�{B��D�k�՜Q�����(��G�L-}-�Gi���V/3�iq�MTH��6��]V�ylU��Ľ��S��A���#��R7=��#K8\R"�n�>���T�yo�h*��\�9��&������*�T=�3u"��Ύ�+�l��UlS�]@��H
�����x�)���IZ!(�N�`��q �*��� aXF�A�L��,l�@A��CE����6��l5́1�^K��9�(U�Rg~6��zl*�9��g+�j]�f�ӟ�]bg��3��y��3�ص�|�ۻ��^u����=���p�����o�����?�~E�U��m�ö�ǭ���Cz��k����̃�6����Y0��j=}���@�"-٧-����=��b�!�Y������qþ����28�
g8t{��,���X�i�(/��C�0p㟈%]�1w��\��x{3�S��Ű�i�s�����(�^�^��ɮ���z�ӌ;�^�C��D��ho��Vʐ��]�S�i����)�iUeꓥ@UM�Q��/�U��(GWz
�i�6���K�?����7y)*��\��AC\?�d��8
�=	���m:Si�v|WK�vrg��X8Ȱ���;:���Zf�����ޤa�e�-F����ӴI�}��H�d篐��9����/�"�{���5ۺ���o�O~��_�>=����x��Y~�|��d#��@��ׯ
d�X�r��t@v,��Id�2��A�-�d����@Lp��-A���_���c���e���f��C`�-�i�g�#F��D!�$
�fN�ʌ��$�T#z���Y��?����B��,M�4
M��a��;5�
|��s���L�G�`���)Z-A�æ���=CZ��lrBg߷�R�9h^��׳�#vہ�k�wj��|�S����SUUŝ���ڽ@��^�/F�r�_��|��郏o^��?��hg�`��3>�I�y=��2.�n����U��lT�в���v�I���3�6 �E�p_M҇����UAT�a��IO,BICܮ(�V�&�pr��:�yfq���0�G�Q5�u���޷-�!�[O���k��n�km���.f'��K�����n��e5[����,P�t��?S��Ho4��ۺ�d0nyX�[�x׋��Z���i�QB3[�,~+��
:8�8�*�>}�?ǣ�ˋ���{�G�Z�	0T�.}=��c��m�`.�ќ;�+bp�=��܌�"�`Ś��N�~�#4�)��:ؘ^��6��Fl��v������`~��`9�PK�uW��}�	-pkg_resources/_vendor/packaging/_musllinux.py�Umo�6��_q�>L�lb	�`0�a��6@�~q��(�Ej$��(��wG��[��H �{��4Mo�o���+p]��Y�����T� �V�Fh�@��,����Y�?
(;k�^��vZK}�ۓ?
�%J�Q?p����sj\W�t����:��Ή�%i�&	��X��t�QnX1��n�ZS
7޹�Kjk����7^X�]�ވ�Ä�蕫$��B���1aҺ~���$)w�?0��1�l2���_�4vR�x�z8&I%j(Zn�((�O83�o;��m�_ƈ6sW�h�(�a��6�Z2�PU�Y>ɢM�Z%}������)��p���p	�N���՛-|����L�_�Y�;���"&�qX���cf�>P����{颷z����`�_�ڟ�����*f
;Xӵ�E�/bu�ėy�c��”튒�G�����/�E�y�W�a�6�~�r|2�l�h��.�_���R�@:D׊R�2E�~{ҼA�{��XA�Mƚ��� ��hH^	K�@�t�X��CP��F��s]�|�'�z�'ө
��i�?�7%�j��}�+�/!{�骸z��W2.�%��o��n�9X���~(qxz{���$�L+�[@j�i�A=}�R!:{�fu�%¶�ޅx.E�!����Z�	w�V���{�:N�B�$D�H�o$��^W�q��M��!d�����	��gw�7��贤�qUh�8������8��p!+,��*�	C���q['�3r��	�Mb��λg ](M�"����}��_ad�����q@i�3EE��מP�׻]�W�vc9���|^�`���.�m�cH����w�"��]C�_�f����NbbD��⧼����S�Cj��n�����G	͊s^6v�q\V�c��&�d��:���[|;,[�_?7��]���e�@f8R�@%�Z�"ܰ _��g�8I����1��ˤC3�k�%��z�z���'�ָe���Њ"
Y����4���=Y��^]�C�<��h4H�oh\���6�Y�Ps4F�463�%�R��1��Z�()��p�3�_Pvt��:ӢƓ���:�4k��9%q�"�q�n�r�:i���y�.�|�o��Ug݈�|��^G)��PK�uW��i	�'*pkg_resources/_vendor/packaging/_parser.py�Zmo۶��_��,����~��Q�sRg5�ڙ��@el:"K)'�]{�_$�����@I�9<�ϡ�y�{��h��$A��P��ъd$Y�d��XF��:"�u[��-A�t�r%7h�RD���� 
��z�,�(M�2Mr%
''g��"�(Y��7L%%�$9�i�5�d1��ɻ-��Z-x��a���4ݠ�1��ǃ�1@����
Y-��"@ӌs�q�ԃ��[�C7��;�D�=�wó��x�.��9�Vkc��$]�^�oE֠k�Dy������xKz,�A���D��?>�+f����2��b#H�VSR�oib00	��\{���a(�C�J�La��o��o��O��G8͛�P0�"�!��6�G�c�s�uz�sV��TN0����n{RK�]�f�h0�#t��к,���Wj�('�#�����B��tS��d�_zz�w����)���^`���r�=B��4Gl��4�d��,�'<�7�s�9/�m�g�w||����2�g��m�s^�c[Ž���[�*���������9ǍՌ��x�1��TVn�A+L�mi�oȗ�b֓|�z�i�Xz�FH�+��R��ey�^}�0��f]�������'�w��԰7K�ti X�#�*�:�0��mLX�����^u%"�4���o
R�rb��-�N���p&nex�Kcn�"�3���U�����ާ��i�(�
XG�$_�g�_b����̓�d�2���7D�A8G|�c9��k�i�H�rmXU���A��eV����{m���, �-T��H�tش��2�7�����7�AɡB��(�S���9�J�mI� Z"%�C~
� r���2�b6F���5A
��󶌤���KD�_'WԢl�@�UB���M�L^�H�hm��-Y��`�u�n��)�+��pđZ;�1ofP�2���\)�٬��f������h�B]F�]A���Ȉ/��u�@IS���('�(�����Q�ms��nns��_NմݿC�]�,�|�q)g���~��@j�<Jiu����3�D.d�'<̠Vr���гWX�+
l=6�]1�=O�߯A�w�o�*���+��:�݅<�w�_��72�
=��n7a��rM8mZ�	����$X��(����K�͇F���tR�P��W���k�SR6�&o�B�}���v��*4�5"#�h��`i_��Ϸ��#P�ˠ�{5��e|e�Cj�\Ii��ZyT���x��R0�xx�Of��_��#5�@�V>��~~_N2��]�2�6d�R��Jj����$� *���3JA��~n�i`�n^	�Ԁ3�l�Y�,���F��d��e��A� g��?�}�vЖ��#�#��6�g�|l��u�j�]��:ԯ�(1�y`g�	⁲�{\���-4m7;�Cct���I�@��K�����H��^e�k��U�Z�	i�ۧ��I+�
$�c-������ˎʡ��QP�f"R�|0��磹��ծ�<�2�i�
����Z�@�1֪#�{�@���~0	ۮ�q
L2�|.(���>u/�[-�Î3?��c�{G��S9�9�l2.��	��W
/3��ֽ��/��_�ѧ����|4������p1���E�z��=Bl�^G_�'(M�G�(��eL�?����oF(�S�*u�mgmcM0��
�^�m���\f<=����d8���3N�8.��_����S������Z��g��s��:�U6ln�0&�Կ�$��WU����jd�*�g��Vۆ*�6u`e�!/B���'S���g���r��&�-�tc��څ�r�Z���Ah�
�8��4MՕ-)->9�X|]��N�.\ʐqغ����e��������Y��ַ^ŔE���j���Uk�w����~�.��0;�$1��T⿢\���1�qop�vK�~��%߇�}��n������t��N����7���7�F4�cjަ�c��KzM�d]�a8�Z�*�4{.�[��8p��h��ښNH�v��#�NWދ�����d<���b����h�s���^�)BG���t	i�̽-�Y2�u�%����^��
�j�l;��/��M'��ۿ:�������=.�^}i���߷)��☇�҃U󨿺(�Z���R���=�/�fS(m������dͳ�v-?yj5�a�<�U;>ӗ�5��@��`��Q�tV�ɯT8cA�.�,,���4s�@���f2]ȋ�)3j:z�k%�4�H��?�%ྯ���3��]@�C;J�
��>�yB'��Ӵ{��"�?�u6�\.�:>�߁�/P��������������$@JQ#��PK�uW0��`�.pkg_resources/_vendor/packaging/_structures.py͓=k�0�w���YpL�h�)B���B�϶�"�ҹ�_YN�?�d���t�����������HQY̠V���-�ܿ�T<uӦ-���Z3xLb�*�e���KM;D��Y�����yC�׌�Բ�	V�
���x�6��c%�2$.�M� H%��*J�i�p��C�"�2���,��s3Rm��pt�%�e7)��MM�lіͻyI�t�uf��_�����#��{���S�
e��#����'���f��d1�ɽ�{,&�8$(,Έ^6�b�I�`W�pDV9�.����*���v
=ٺŝh7����
	w'�跘n��vc%:��dC��l׬r�PK�uW�sw)�-pkg_resources/_vendor/packaging/_tokenizer.py�Xms�F�ί�h:��&�XZ�`,'L1���NAV8l��9���8���w�N�uK2X��۷{nw�p��"#��g�!��y-T�j+�ɒft�4e)�Y%IId�$�7�,\d�eL�,�#�mw�0�˜��!�M1�\qx�)%n��E�
�(͌J�V��m�o2��o�|8]�I3!�0���i�V[$��Q�/�H�oyF<!ba{&ݫ+��eMnID�5\�%I�X0�r��������ZM�Ȣ�+kRŒ�H�<̂����,Z9�ۚ�)�Q�kjC?*�{�4��L��r06_��R�Y˰��Җ+MF���u*�v�HMs7	v�-#�W�w���C�YSq����_C�7}�b}G���?��i�Q��*�		/b͸�8��8��S�����ڙw޹�O��U�����b�6գ`�%����}�T0�{��3��O޸7�ZDX3�R�a�z?���\~:�t�&�55�<���^w�$���^\t$�)H�_
'�Y0��z���b�"^'a�4$B�T>��&)o��o���gw(kM�-�a���
�9��s?{������=��q��v{���woڻ_ڻ��{_��tYP������l^�{��rM�t��k��Ψ�9�{�M�;=�f�1�B��v�����D��Bq:u��!/�Jf�l��9'��M.�������ν٭��6��*q��꤬��Fd�������v��#Z��
j�g6�o_z��y�=��esq�8Q�*�=`�
S��~j�1�d�/������v����P��jԗ��5�e�I	�3(���)m~�4�z��׏n���z�qo8.G�y��`2���;k����N?�wN�~U������ִ�\���K%��55|�g����+�s�����vՈ�LǞ��)��
�ǥ�)�#@�2!��@I2��!O66F��[ܲ���ih*(��GK�R�f ����o�G{o�7�M���7�i�{��`斴�}�eC*>j&�?Q�uG^r�� �*7�B��<>�^`b��V9�M�>�}�ɔ/f/`��Y�I3ݬ���ݎ�6�"���6�K=�)ب��0�m`��Y9��b
"��Yy�-#W*Ō.�3���sҁ�'	cw-2��;�Qʤ�H0|タLrKSI*�B��N���D��E���b��2u$M)k�7i�i�����z/(�9�@�wIoE�`_H�B���2���x8�F1E砫�������F�M��nh��j�p{���>L���40Tw���R�~������7��!4�h��J���6�80�+�H��+~��{^AU�4b�
a��iR�Yk�����d�	-�J�mL���W����0a�Ϲq�%�����V�V�F��Y�YWrc�}& (��=�Ŗ�,W.h9<)C(Y�nV*)�Gv��^%����RyA#ohD��>L��dR�kѐ'�8�T�\���c�|��*��XD�dd�hA����0;]U��Bm�u��׽��G�q��{�J��I��.v�)h��T�;�������p��ɋ���z�֛��'��%��ר�%�M��?�y{��
L-�x��/�GJ\�`lDe�',B��t�
 �#ˁ�W0y<$���l�ժ]�\&���jV>~�?'���r0 t-�(ƹOA*݃���Æ,2(�
�*�
_�{���=M1A~�Z*�_�+�Q�]�=xvp(h�/�3��6dѲV�є���J[%[G���f�;�.�0?V�>�~��=y�'�j[�,�@�zۈӔ��ը<�PK�uW�M���
 *pkg_resources/_vendor/packaging/markers.py�Y_o�6�O���.%mѢX�r�h��Nڇ�B�%����TH�j��p��>���Dje�8�>�9�g~3C��;�ɖ������-iÿ́f
�E�1;FS{M�־��h
�~qdK�;S�K�8"ߖ/���ƒ���@S�3���/oߜ�;;��SR�4P����n��V*R�}�2�H��.�車%S(�w���X��V/�J� ~���]�7�m�y����f	*k���3�%�.�Ǿ��O�踔UG��x>����W�.�zm�~�[v��}�N۞�Gŭl�f�V{��PM�x`�(�p#/����?Xm�n��7�J�E��Xͷ�'P�W���Y�X��ѯ�
�8��TH�kX��ݳŢ��^UEN��*�y�n���I�	<g�k��&�S��+)�L�w�:̧�������HS���?|P$��z�
��l��\��uK�&���=k�b��d���Z�OZJ���a+!���hH��}ۀ�n14$�p��|���r�DΘ�Q��W��Y����#Pr� P�!�dZ�o��=+n�ab�!x�Ѱ�s��oF�D@в�n�\�yt�\�ӊ�eH% .�C��he��s�4��^aP��+����.,$v���.�}5<�/����,�ڝ^���D�4��H:P��,}��‚��@NNHf��F��ڸ͂����U`S$k�^���)�����-���?j��j��Rs4/Ǧ_�Y�+��� �S���A�{^90^#��]�G���˕6���@�Gճ�u0�[-,[�4��c.�[�
����(ܒ#r&���=D�5#;z� <���a/r�%#�uY��
���z��( �`��"��3��1�dL+�Ѭ�6ǐ~��]S��@��f(��
�K�yv6�2=f�m/j�)Z�����̸xL���M��#"{��]�����8�*7��
&�l��M2y��jl��q��ֻ��9��tҘH�Yq!��|��;��ϴ�CX��V���yY�NÌd�g�En�����<#O��p�p�6��)�M�%x7�q��fS,��,�c*-�g,�\�
��Ρ0ي�t�P��+ �ɑa긟��F�/�2hP�&��$þ��N�a��?I�E�~�_��(H�@��9
WĚAv�2^D�DgO�nG�bA�j�<�$���,���~vS��t�v�_��"�,k	�!��Kc��i��>A<�Q�;�3>���H&O�-B�!��;)b=(��+��c1H�d�D}E��!�N��2�*�=��<xMqPY�p��?�Kv;��-�#8�<�a�Ïߓ����d���eDL����!
�����Նu�"jδg�3�ӫ��;�鲻5;)J�.�����ӽ"옰}H��$��
��ɯ��>�i�������そ��O���5BykM
�����,�p�`��2�ނM~X\9`�B��C�����+B�+�' �:u	����I��-����i��p�Q���It^(��!٦���N@�_�7���pS����o��Q���g�lJڡ��!�yq�x_�ߤ.9 &y�0N�Y�J����n>���ʗ����`���Y��yw*�~��0/c�Ƀ[�ZݭZ&"H����v2�\<�y|
l�y���b�;���6[�L�l3uO��Ӈ�w��֛婸͡�ϱv��b����۶o����EA���+��[]��
Dz��GI~
L�ݽ(��d�O\O��_��	�|�}.9���Ϧ-�b퀤8�C~�m�� �鉥���)jdy��Z$����ngnDr���<~eK�9�i8^�!{�P�)�ϓ9�if���Խv����jfty��.��[��N�O�r�#�>�;�y@�J?E��?Ș��Ӄ9�%cr72O=�e ����Z!9�x���]$y�Ԗ3LR�9-F����hR��X���Č�"UXlЃ«��:�W�$�\��{�Yn�*�&x9����K��#x7lE�`�V�#�ێ!��Y
M/}{l����GP�Bi��v�qs��֗�����\Yk�����-b�M�}m��^C�<`4P�a��۹��I�o�ӆB�sX$���(e(�l�^�%�ȡO����"5��e���O�	�ۿ��&]�8|��u�5���&��(��@?[_��W���
se��U�#�&�%G�?�a������[ٶ��U���htȩ2��B��}W��`�O�0a�9�A<��^�xP5p)ko4��S֓w��/C��������.?~��=�1��Q��̎A�㹉9ɏ�~r�X�V�f5�J�W�̰�xG���O"�Aez�b����a������������fo���,b^�u�l���:�!�W0E3�Q�����0A��+RY��*xB�W�
:��H�c_ȵ��x)?vN��*�^֌̀%q\��sH�
Y�5��ƃJo�bYF���+��z��EZa;��bfY��z�f��Q��|���`���&4���3$�oZ�p�j�2� ���x),�;�.z;AB*���
@*��Q&|�mB���o.1�D^��}�p��,�N�0���4<{ڸ�Ζ��Y�;<��;��D_t�4��ñ�#n�g���o��,���אH�/^`ŕXH��v��-�Ä������
�k��p�0����2���=h��˳���.	<Zα,�PK�uW��VN�
@+pkg_resources/_vendor/packaging/metadata.py�[ko9���_A�,��$�@���c'�d$�,C�Ԕ�q���V4���*��~��b
$���b�X��yY+��6]l�I
]V�<����I���T��5݇c��<���V+�g},lv{�-�[�7�즞�w�����Ng�)R3S�g�<S]�''vK����te�m��v�&����ӥRg�(��^/U��M�q'
?#k^���'&���S��L\\������_^����o_���Z��8����X^*̬�c��?%��nLQ����uY���Cp��j'vW���l�
b���j�<|��\�ty[������@N�3�𓓓3u�3�>�7�Nt�ݺ��;�+U�j��ҕښ~U͞�c�y��&�ΥGR�3��:�i��y�נ��E^Uv���i���;]��4���AO"�nM��|oN��ֺ�������;S�B���@�2U5�9��	{�Y⎎ؐ�'"�H*�p3̪uz�FC�lOOO_�/I��X�U�>@K����BN�����֚4!n;# ��՝a"���N�%k+&W��=�LE�4ϒ(�����O��� ],�T�V�j�
Z&����M��_�k�Ak���{������[X��q�KSB�k���l,^%jߤ��sP��[Ry�Cvy�Š�'���Lz����;�Y�M�S��qR~9d�)�S��|�:'�.2�΍����&KH{�܇��qB�I@umH�Xv���&&S�گ�k���m:'��`��ߩ�����z��3~�e�r^w	r�IZ��"�5YC�d�~��7�濇.�#SmJ�.�}��9�e2���u�
Ģv�n��_��R�q	.�M����~p\���d��F�����NVM�ÖO�Q&�d���sg����SSw_Y�Y��G92m��L$��Y_.��U�%�l�e`o�m�[q�Ȃ�J��E�4��Ċ��ˤw35�����#���G\�#�1=b�{�/ذZ�fw���nsd-u��c�@��@�a�d�zMV�c��im��Q
\P�(�Z�%�diQX:i
&���g�f�G�f0ͬٯ�y�<O+���h�A$WP����^\�`r����K�b�WΎ�o7�o����IXp���;[ H-F����ǟ~���
�@�R���DVT�\��4�y��~�^��\���I�I?��^�����ֈ`p�I¡ʏ��?�bNLrK�1��:���a7rh8k�
hԪ%���^���G��d���r�՛��߽��.��{7t:�?��g�Gu��G>�?.�?p��lm���P������=����W�[���޽�|���"6)��??3x���?
~:<p�ܝ�Q�&���Y+�A�A�p��u���		��f��k5>$�����
��aKNm��!J@i�k�"��]��q~��zq�uSf�nAĊɔ=��g�-59��No���.�1e��^:�fG�zm����;��B[�
��v���x��oZ�4�ߒŁg���n˓3��)���"����R2fxa���;�{�pwHH)EERL.;�#"\�Gf��g���dq�S:P�)9y�ͧD�LL1
I�&�XgB�R�3#6ٟ�$wY����\�z>;WT�)Q�s�H����Q��<�3y��\\���ڥ�M�KU�`��
���2c)�`,���'PNi��ZJ�g�Q��Pi�#�����0>��R챲Z�BL��EDgOQ�B1\m��e[���b�\̬�Qҏ!�b9ǁ;��Y��i�qFU<v����*"둕gR���+B�}~��P�!���=��r�.%!כM��,��a��YEN~��l��M������I8�S���+8k��҄5��~f���)����V�v�
���>VLr�åPe{Ck6;P3�НD�<Kc1�%H-=k���Q��g���a��FǶcR9�w)n|��~+[<��k\oW��>Zo7SϦ7�yF`���鍺P���:�n�(QA-;�1S�C��±<�f_��G��Շ%,���*MN�(2�Yt�D�	Y��C�J9���㼅�OF.����X,���X���d>��˔��H&T�6t�@�ܻ�������|iOU3р�eg{ �"W�z�4��d@�^Z��?N��^YF��D�SbG2@�P�I�W�
�?)NeDo0��dN�Yyz�lG��$��H�L:�jq�}=+g�P������ˍ�c#�@?��8�_͑���i�l����2��t���ku���I�魏F�?RF9�W��.ܻx/�ILM�Ar�p���K�+�"�ߝ�]�C���9���ۭ�e�C��f�Ko\X���&��6y¹�qS�-w,IN����D�[^�P[f�m&�2�!�7�(8�� �E,�V�N���Ûr�r@�9aJ�1'��@�:dl]y��eFN�˫�1-���mƓ[Ȭ�iSo�o<%﹩#�r�3������j0�$N��
3��)C�V�p�.m��Z��7>�q��M��X9��r�+l�'T�-����)%�ْ	b)A)Ac����,aR�>	���]���ȱm"4mEq���ecɞ�g���Ē�k�ֈ�.���}�|A�g^��<�M7�(u���������qv��>����S0
���}v}���Bx��u��E���=�h-��勗Ɨ/ ���L�t[��hP�����
� xC	�節�Q��8<�w�z����w���O/�X���#j�Aͽ���R�.ǫ��ceiT�/����z�s�����~N��r����rP#0g`9�B�^��{`��1�`�8��
�)da�hò�:���1@`���)��F��L���w�(,F��
s��Oˇ���ң��<��G �0ڡ:�'����	��<��8�"]��E����g%r��x��ב��E`D)n��	���oAUU�튳Bq\� GY�9��u���Ur{��%�B��t��ҮM~�ٿB�Җ�݋/w���{��.�W�j�2�KV��0��
{!���S����+)�ȸv�Et۔Q�!J��8���R�۪��C�C�����]>~F�Z�K�XJDX��4*�7:�Q�㑓��&m����B�=��B��%2��<���\���+_��A"���8�"bl����4�'�76�T`�D���G53���4�4x����v��'x��Ӈ��D̦k�`ws��k��^�ڑ�ɨ��4���0�`,'�*r��,������TƂӝ�d����÷/���-��?"��DF"�,�2�L�
��Q��n*�ZJ=o�m�QsXU,r�<0t:� n�$��խfN����Mθ�)p=Iu4p2]Д*фQ�E���t67���_���0�޼?�y�B��'#[Ha���iÆ�^�\�"��.������eF/�>��N�1��w �;t&�W��ՅA��8�r��tT�P&�g�_�{��vA�_�F|	uD���%K�f{����5��������c@ MX��tD~�$��0ȗ�f1�ϓ��jd���d��qub&Fd����`\��Jjy�F���Z�_�jP���A!��E,�2A�@����y����kF�)ح��NѮ'2*O�n{��� �4�����p���
�(aƝ9���'d����=_3�u����[�z�F��J�F�Z�Y����_��1Z�f_��h�7��uh6+f�d.FeGA��R"�N���4�*h&����1�G�6�C�y�/��pq�\o�™��e���[¯�j)9;�(�q���������j<���k���!����QQ��M�ȅ�*1mz���V�x��v�aW�R�����p��G��Ow$rd9�G�u�TA8�i��-	
��C#M� �?���İ�\��	n�aZ�GAɷ�2o��]d����Xj���M_��`�{�h{�$R��>{��$îh����V����sd'�;C�345H�Z���
Ez
]�'L[�q�Mm�#�1�)޸�L8�DY<��5ٝ�|[�Fȹf3�IӘ�6>�đ�)�fg�U��-9��b�J�q7�RN�"˷�^�1rG��l~m�Y�fڬ+/�%+�4�=�O:�%�,�4.�|#F��k��v2U���S��{v��؁����q�;�c��FG�i.�*�ɤs2}7&��"�ˠ;O���J�_�΍�l�H���껫@�l�#��I�#d\s���S���wH5BG���{]�M�Ӂwq���!��lS�r�%3~<nv�D�Q�Ed�⨼�[��� G��)�ř*'�gGw#�TI�e}/�$�~Y�v)�+�/Ԩ���iw���5��������m���%�>�\&?
�RN��و�0�D|x��1�e9i�Ŗ	�C�0t�)ؽ$U
A�$y��=ko�� �� �7:����7r�_3b��A$�{���K���ƹ�� ׊絒N	UҔL2{�3.Pfq�����I�m�� �h}��M�3�:�ƒ��"����_-H5�ϩ����
Tj��-�{�����/����	���Wj��D��2�/`�ڮ�ֲ:XH*'UQ���R0�;o� _�Ƭ}G�#���3r�+ư,��G��{�������H�����'s�_M W@z�-��lqKٝƺl�τ[UC���}��㢪��v1n���5��J�:��1U���Y���p��e����I͈戆D��=�#p
?҃$�|A8��B�ɉ�j��M�@	�.�*�ʗT�v�s�&�Kj��
���L�1ʇ���u7<=��_��/��W�$��xb�v
>�C�![J�vW��Ȍ���e����%�EY��Od���4�j�<�Vt_p�N�(�蜦u�ދ��0�zH���J�?W�~3�W�郧��]3���]��n�o?'�������E�ݡ�b���~薜�"�YyK�,"�y|
�hb�e�_3*���{=ž�mq�trߚjɹ���*Zb��u�wݔz�o���ZŜ	L3�@�p�����
�1E�ԇ7H
�R�2���1��\vuh��y@�:����ݔT��&4��D���N�*%N	9׸����9jH����C:X"GL���h�Ӟ�d�Ų�g�����u�E^���׫��=�=�$�6�8b�u�y�D��N�vb���'RmN�f.��	�r̅�H��6��BB�g��)5��ݬ��h佧�p.H�3R�J�U�H��`~˗�n/�9S���Rۯ���,,�~b��I�I��A]�L}
�9���u%
�t�J��[�
MZ�,�e/U�}�G��Za����%���l-��7���~��Ш#:=���d�
���K����L�Yyѕ�ts|㩸N�Q��z���x���\O:��p{��'�̹�Z�V�1Vq����{��z	���.a��~l��K�~SZ.b��E�o55wq��K��
����LB}�ES����#'76q�A7�τ��Nc�/������g������Y�:m�=ҫ��?PK�uW(pkg_resources/_vendor/packaging/py.typedPK�uWDz�8��/pkg_resources/_vendor/packaging/requirements.py�VKo�6�ﯘʇH�"
�:��`��
;M�!�+��F"��zc��w�ԃ�ʨ�%��7�!���V(E��E�*�ĆK�he�5�-�um@�nqڰ
�.=,��\���~�>��d�`ޞ��n9w����?ߞw
���JYύh�(#��{�+������[�LT&[�D�(m��U%��i�W�V5�}#�#t�O�>E�M᪱h!�R4Į<8˝���n�k����\Z`��^تo\����c��K˞ϵV�C�L�����2�\*]�
r�l5˟X�r�	��oD)��~�y��T���(%��Ѽ�+�8��z�DQ�ާ��:�C/K��N�5��lU[���+�>��_>��
d��@��X�F�/��ˉ�j�5�ʄ5�kR0�fK)���"�:��o.}��ؙn�0|) �$j}`E���T��8H������>1	;����r,X
F��m�@1�B"�N������?%��V�PĊ�v��	����ȂQp��#��Z$� ��$6י�ӎW�i��w�	���T�i�R<Yrp(G�$}c|���ǥ�%乐��ylxU������b�����YI��Y����^/4Z|H���yÛ����
M���)��$�q|5�Sy�@ۼ�nk����1��S��()��?�(�LDV���YL��1D4/���?W��P�$����o��n�Z�7o4��Wh���N�Jn+�I�XA��/�e"�:��Ce��^�ȼ�<s�@Ώ;,�{�9Vdef�׋#��`Z_~n��<�I
�}a��A�u���)�0דS)�e�=�g,~8����~n�h���H�v��I<]���pt��B��ן��o��Č$O�n:�!���2w���Š�������0SC� a�bAv��M��_%dl��E�&�|>X����j�{����Gɡc��f��6'LK+��x�q��)�b9�	SK~,����3�C_C�m�%�>�Np�z�@���N��~'�;��]�1
���lC&��s&��>�y�EyN%N�u�B��$��ȿg��Ś�NǃRAn��*]�������5}�]����{3!xq����܉�G��0=��9����e�P�#|�Z�p�dž�u��gJ�����PK�uW7��]3!&�-pkg_resources/_vendor/packaging/specifiers.py�=ksǑ�+�`�P���'�'�JNU>�)V]���䚋]dwA��~�����Aɉ��$r1�3�����/�Go��*�L3���E�EY:y%��"��2��ET�rVE�%��t�L��xX?�A�UZ�{�ѣ��%���}�[5&�^A�{������9=+��fذ�R̋*��r�.�2��y&jME��Y�u:��8�5Uu%��|0�ۋ��,f��&�J󫸚�Iz���t6/�:z���ͯ�Eݏ^�I�N���[�R�RH�b��d<Q��@��(�J=(��Ws���ti�gI�%�L�������.�j��ռ�铌�B,�7��z��j.~H��at��ǫ�5�R�b��E�N�?���ׂ��_�yR��ѐg8����.�Q�(���4?��q\7�>��)��39�zt�N� ��|ooo*.��I!ʉƪ+�D��ѩ�n@K/��2�Ҽ��|"Ի��{<n5~p'�ѐش��(X�$K���v��l!��eQJ��]����ry-�(�k1��.��hR��#�s0��F�2����ak��z� r ����E���ԈF���2�;�ě2��1�Cԝr4�62O*#�j�q��!a�}��f��耧>�TP4�&��Y�t=���O�y���@.��Q2|�I
��)='�����Jd����Y��:Q���"E�P?����?����FD�'1�cR�Tu],�i4�[���;��뤺��J�z=RI��D��v�l���b���R�Q��2 Z�覥���Xȶ ,���t�ٴ,�%k`<#+E$�g�ds���'3��7�`���ֵfO��!��e�^m� P
@������H_9�x�b	����i���Z }�RL-��@����#b"R7�)b4B������?��ws8��:[E"G��#�i��j��qZ{��F/�vqW�d��n�'�J�
�g	l�
TO�Z��	�̵b�'��P�5A ���,#Ȩ�
 �K,V�#�O
k��J0f�}����pp��7�Ʒ�4�
HYe\���i��rj<(`�ɺ��Z���h0]ר/�Y'm��5���m�%����qB�”x�ܠ(�z9�C����tRڳ�*��+r`o��N'����٢�fk�s�<����S�4gᤱ��(�|��v$�%a��Uh���şt�_�H�n�*JPsi	��eåN�> t@�82���X��G�dj��%Z�E�,��!���H��gr�6��Ӡ�t�%G�@�aMMܢ.����� "<קI�hi����_.
i^��J���ت�y����OԨ��/û����ݓ��)�{w
{�{)Sq=`9�T?����O�$��U�"�������MT�d.�j q�2Ͳ�iA���(KnF/IB�x�L�lW|�eqpmHy���t9�_4^E�?�>z����i)pwq�T���$_i�;��:�F�����]3�&Ţ������$[La9H<�&+:�\j5��~�d�[�P^��3�ؼ	lE���a���_���w~�64)�)Ho�����O�
/�,聪�߀f#
��
��/��Nļ�%�|�E�.��Z@@��hRd�|q��7 ��b�77���<ep��`�E�P_�6(D�X	�vu��s���R8�p��y�&!��SXA9%,��Xz���h�H-3�`��rKG:�m�������$������Nb����@��\`�|L�@�{[1��ׁIg�G8�E�k{R1/�N��Px�ǘ��hyR7W�O'��}4�o/�8�S.��h}$l��P�N]\��;uU�9���zG3����Dž�&B[��1"f�#I�[��j��;Ԛq��s|
���M4M�F�]��7wTO�d���n'���M����Gw��rһ7d�0ֽ�[ۢ�n��x�#�|wȽ��.�{hޕ=���F�}��e`<���}��u�Dyp���ąA�'=�ߢ����O%��3�S2lՑ)M;Pu�k���;M�Һ��8M�	��j_Xm��ꬨ������8�EݷR�'�e��t'Q����Yl�	��u�1
��V⹍|~�l��Y&�����Y����8]�ؠH�&����na�i3K�E��y�w��+4��)6�wM%GK��x�(oxK���X�;LhUP���+�-�pJI��aQ��H_���EXF�WK0�1:��EI��jkp�"?����gb�����{��>���v/b<��LoWف�aN����A�M�^�w~�1>����?��s�b�z���ϟ=}����<oF�yoV�˰3�:�ص w���'���T�E�'�Q&��n0ys�)
���R�2��y��]-���f�ه=�n��H��1�N�7�t:[;ON�4��&(~+�"�zM/0M�0����mF���;ŸR���@U?��`$���{U��F�[L
LJ�2�2�T9��	9s��d������	_��_�Ku�N�	Ƹٻ��씶�������۷m!���Q7�E�u���X�;&C�\�,�q%�rr�E�F%�X/�w�Bnj/;���{���A�g���ff���0P
�:s��1���:�yo�����
��ֲ����14;���A���:�x�뺞W���~r���}8_��E�p����Y����ǿ�j�ۍ����wtr��?��?u�ӑ6�[��b�W H���t*ε	��ܘʾd��r^ȟ��/'ƅ����qxV����,X�,ͧ`�{�[5i3"�]EE��I�7�
��(n�1w�bQ��tt�h��(tA��
ʂ���
:�W���,BY`�J
�
t�J�0�`��8���ϴ>C}:��t���8w�����R袔.cP�p̤T��R9N��Rxp��Z�p�Rʨ�1q�l/���$��ȧ:������k�M5�og��G�{ނ�ǃ���
J)��ܐ�8Z�A�bWx���(r-?m%N+���Hf�x�Y�|H��O�
�z#��	�V�gyP�_m�J��z��3�ď�/A�6���A�0r��8;>o[��VZ�p�L�Z�JE�˦�]�ɹm��Q�.��i0i��w��<Kr�cފ(��H`L��sp
���� ��t��u9$�]2�����2	�?
��<}[��5���i��'_�:�X{X9�`YK�5��e�	�yqA���-Of���C�=��,�=L��wڱYjCv��v{<�X2tUbf��Gs'_��b�C��6�c���u�x��_�m����)���I��<��PҼ`�P.��Z�p�R�>/��{�(�a��x�C:��C�y��\��(kS�$<#WᒨgC�-_��6yh�6�L�i����MtS"��g��Q����<����:�m@���p�^�Qh=�f�6�_���x��B������������:�cL<@rꙏu�jZa�1ʶV���Z�>�N6�V����?Rp^�L�����!�fn�Z���^��A
K�+�H^�����+Q_8��<H$�~�Y�v�M�Ac0����5Ua��rѕ�By�juV��?t�U]cn!Ӹ�$Z��wL(��r�Y
˺�=3�;}�s�,GՔKP6w1��>MO�t��+���>�B����Q������:��!�{(S�-d���b6b1�iך0�ۥ:�B�5ދ�T�p�`ŚS��&"���M�3	4[Ll�B�61��h�����J�f�˄�ܽ��&�WO�:����;���hB?h܉*R�<�Ҫ��z��Nn��}�p�CG0��u���]`�\AO��ө�B�gƨ)R�mW;!��W��|�iqG`����Z���#���x���^��+:�?F��J^R����J'H���dS�:�-���샖�;��K�p���!�`���/,L���<����8K'����rLw�?	��	��B٢'d�@E�>�6|�x#B&$zX�,�_�k�
�Z�0�o���Z��`jAn8�>D�A�k��M��G�X��'d4���[H2���$�#G�w(������(z�\��jG�e�v��q
��ɴ}�﫮���HՕd�IQ�b�o�n��]<L8uW��,��0�[���D��N) ƅ[v�fϙ0���L���ކ��
�$J���
r��-UD�I��"е��yI�I�8�i���#��\kG��B9�3��._��u_���5�={ᓒ<�h:�\%Gg� C�F`h���ҏ�A��9��8i����r��A��w��Wf�9�c�;��޴��.�iuV��?�nx�� ����t�e��՛h��X�:�:�]���������m^��y�P��9�����O�>�lv�$(����2D��ͤ�,����O]{7��t�D_�pT��HȾ��\��[�/6b�4���^Tz'��:8��*��q� F%����aG�F4I��"e��6�_�(���i�%`L3�
�ƀN��6Ͳ�K��2�����<D�LMyh�ab��sPSٰ�j��Vͨ���*@�/��V�
,TB���z�0�������ɗ��,��霋>���o�2A}tL��K���櫑�5QL+�i�1���0"��ͬ~�Ɔ��\5�pm'VSR�����p���z�!�h���r�QA밹���5���W$i�Ϣ�N?-d�mPC��[��!k�S��=t�TaE�?[��
�`jWE���.z���l��25޵|��RM^gs]B�j`�R�\�2Gޖ�>g�;ś�C,^Fk��?����]Էm��5�#Է���{��l�K�e�e�v��h���v�Uw�+7K�NB���8a�WH�'H�#B��%C�<���������k��@�_*��(ͱ�����^�+�IL��{-F��UO�M4�H��0W�͓�j�s;fD���i#���*����:�°y�f��5����˱qPh�o��;�,f�ύ!�p�ӷb���v�]���6caL'�C�v���鑕Sﭠ5��Ϣ�ǂ��K���(�5�]gp�4��*�+Aᡞ�Fӂ'�w��
��lx��Q�ֿ�K�I��2�!��pG�\tw��Nz�:S������]u������M��M^�S�ǖ
mhAM̙\��t���dAy��Σ��~d�ي��|�F�<KH�Vw3�r��L��U���ٗ��M*�8@�p
ݟ�2�aS�kc�
�3��^Olw�z:��Ꭼ���2�8\�\Ь���K������%���H��9O��QL��讇���H���$[AI�Y7��֛l��d;��xeT�xj���I�r[����6ZOS/W_��z�zUw�T�S�S�'���Cb��o�
��U�&�q�cZ��Y�^���˞��%��V�*��(j^^���G)\�E�Q��'S�C��S0�L����K�SCy�fI��}����`�lα~t��yo4��b�`�V��d'�Z��{����|0z��x�,g�;�
����w��iF�1e%(��\TC�x��C)H��Yby�&V��}��e���G��H�,C�q��O������GO�X���A��+a�M���g���
a-�o3�cB�R��'r�ك��|��Y1��%V>w����d�r
q1��9{�M.%H�B9��j(vjauS��J+�e�R�!��>#鵿BO��	�
|.Y�-퉽��*��v���,.-r^�G����nK��rx��Wg�SYQ]i��y�Ҝ}��I~3�hۈ�dׅ;UZ$p�n1њ�kDw�ph��-y�=&���\�S�ٳ���T#�fZw�����Ɏ�@k�}��}�ZU`�[Wi�7J��~��:���Ӻڬ�%u)!/2�G��MY�Lflߵsy��ׂ��"��U�6�3��X^����}�h1wŕ3iР���Ƹ	B�»�2Pk�P7Q�]Zz��at��{�\�GQv�ڕM5�ݯ�!�|�;�5�F�nj���xn�s��)�)EF�<f}��Q	�J�h'��TUu��zU_��E����zZC,�a�a�*h��ֹ�d^���=3����NJ,NtW�=��V�0�}a�T)��˚�u�QJ�������ų3��O9�1�#��z��<�L\�;я����~bUqY��rKト����akrp�,��9+*�"wk�y����$z7�ށn��d]0�BOn�����#��L�5����Gg�@�y�*��c}�_�Ky�W*��	��г�҈�	�F�s�T����䣨�����0<
M�h)��ߑ�5X�C���c&�~O�ע�w[�D5��wgDUf�Ѕ�*�W���IF�N�_�ǣQ�S���-e�������	�K7L�Ğ"�^�b����1�wkrc�[v��ohv#���2l���k��6�lk��[�$����wo�3H.ds����O�i�������J�0h�?����)f2.Er�#��4�M雃�$���]`o/�A��b��	A��e�Ԟu���l��o�Up�U��
��t���,m�>F;�B�ƞ�h~��؊W���˴�L�;L�qָ�0�"��3��9�c�lsn�6!���1�8�]_�9>�7�˥���'3ށeF�lrW�3���f;��봑��&����hf�p�"f���[:���9�mO�t'jx·�RԬ���:dv���I���f�Tr��;[���RE7`_�>�jħo'�B�[��Z��{r��^p�0�C�)���Si{�MwG�61��<	��L2?1`K�q�c^�U|�
��ۂ���rsV�D4��<�(�od7��\b���mT�s���� h�>���|\s��ȧ�e���E-t�l�T��$']@#W&0��D3K�0�k*�>_�oMh�ۣ���s������
���Z��n�u&8�
h�����S���q��;��`C7��8�l�2�3����nr ��77�	����z�ON_��WX	8��U/�B���;��J����w���Ŏ�|�������/��Si�1�j8�]��T���uJ����DO�2`�prЮ4x��epf���5�k�uܣ'�j���ɍW,�ek����Z���M�k	Y��~�:��.�ԼdСa(������M .��*�5��a	My�
��e���nj>k����<�fQRm3�L�����%�u���کV��a� 5Y\�J��=��ϼ�V��7
1�hוּ����dk[��jǵ���l�gz��xt�6]]*R0��m·Ps�_�htӳ�m�n&�u_k
n����Ku�G^��:3`�Q_��
C
�*tJ�q�m���\g����U��
M�%�\;��At<��-�
�׏n�jH%���3�ݧ�H��}�yeIND����6����f��]���:�]�ux�.0����5���kr�ksl�Ć`���B��kF~:A�)��Pуh~�E=a)�W}�&P�)��by��zX;m��Y��b壘ܒi�a)�m6(h�(,������
���F�b�X
�a(ݾ�9u42,GZ��ꬾ�c�u:YdI)K",�p�;10�ߔ�Y}^��B7�M%��֑4�������Z�1Y�
Y��L�i�������f��2*�$C��_<N
-GR���.�{Vя�������:��t� >uC���W��]�~��UN��n�0�yThN���?t7g��x]�����	�J9�1��ˆ.��8�8�2�ٺ.�+����z+0�s[xUa��
��z�~����kQ�����ܗ�F+=��=��^�dsg;�v{<�������J�27��vrK�LV��T��vT{*��*�ʜ`k+\M�Zn��g�<�kȬ�r�u�[A�oe]P�VQ�2ee���e[A^_S�k)��)X�گQI������'��:tbu�P(
�ua��D��{י�N&��k�ܝ�\X�)d0��vog���C�u�ˌ��2ce�Yz��68Z��\]T�(��~_G�(�#弢+�	���D�ѣ�
I=}�m��
�1�8z5`��i EOe�zV_�XJ��c3�fH�����>s�נ��r�%��	��隼4���.	���e���q�}��	E�/䉝��f�XYj�v(`Ě2/�~�چ�ۨ��†+q���W��a���a��b%�ؗeSv*)IU�pIV�d�b�1��l�,_2����M�ܲ(um1�D�Mm_pPp��Up�O{᧚�}�j��cr�<y���7��--{��^�+0��-�w�+�K�p������l�o�	w(�r���PK�uW�=��m�F'pkg_resources/_vendor/packaging/tags.py�<�S�Ȓ����u����9�Dž�G�$Pk���(J��1LV��	�R�����I�c_���\�X�zzz��{F�`��B��H9�金S���$OX�%�`�%g%/��s�q��g�Q�
�O��"�zl'��8K��佁	لs�������ɡ�0�{E��
7PP�e.E�+�7�6�˔��%��E*�^O,�yQ�4��م��L�,�oYM�E>�R�;+�r�gsqћ�������X��x����?N������ˇG�8��!�j	��~��罘�C��P��l��#``<M����~}RC/K�c��_�[ų�sZ-��/@��Y�c=ERh��q�JEV�Ẓ)]�z�1��a]x�ˏt�EY��Q�NV�e�i��!�Ld�y�S<�Ux��a�����'?��h�����O��=b͙,�!�?�0�,i�`��!c���/f�z>�f�`h0�wD�g5�����{�}���E����i�
�B��o�����l�ٳ���XJv_�)|A@����<+c��1�2�`e!�)��1���<�%�g�������Τ�;�EU�zh۩�e,/�n��劁��~E�G|`-q*sP�%J�'���.�H�y)��wD  ^��D�Tз���s�j|��Cd�����霄lp�1�&`�W����9ϸ�~C�Rd9��4�=4�?���5�ͬd.[���8,�Y�+�p	���/@��bP���}ήE��)<���*�2���b���e\�(�K��4�L��}
!�尸��+[pP�d� `�"^!V���bAе�Ha���19���L̖�G����^���*�K�=	�K�_D���,+d'�O�J�.�
T���L*�P).210;��%�I��9�I~
]�xA�\-�+�
� �A2���`X�x��`�t�o@ђ��j�3�0����������#L�L����1hl�rl��f-,��m��o|V�i��5.1g�K���I�F�G
j0g��yy�!u�'�&U}oLߕ۾�F��]���D1�D�&'Jy1|�==|��MK�x��׍!���k-��W��n=r�^��Zp0b���	"vvI|ܶ���ڵ�kÈ���c��S�&w�o�V$
��
��fƅ���>�_{f���S�c�	��@ѯ F%�<����j<��� �:@~���� x(�ɌzJ�~$r�'C0J�~�ƿ�`�s)�TP�#�j�*;����+5U�+��'7���upx/)^�:V!$�f��@
A�v
"��ŀ��cq�A]1���0�L!��e���0N�>0��P��@��h��_�RD��E*���⢏����q����|�􂓾Pʩ�<�ȮՆ��^7�ʫ�LaǤZ@s�@�8�̚�\P�k��iu�;�����j�_�&b�p�C��Yv��E�_���I��{D��Y܅$�w��z�W_�MY�4^���`�inĊ	V0��Zw��c&َ�x	z�e_�ѕʾ����7B�����#(h��hK���%j�X����	�z"�°�%�&~��j�p�7=��g
Z�
�V�-��?��n���q�kּV]���bC�h��]SPώ�!���F�N���
��Z&����{��`I��A}��s>�S���e5�/�K�3��@5�38YE��~�{�V�pB<�1���h�c�e	9�
�[ʼ�S���Yd��A��s�m��
z0�ܖ�
��ԉ8��tO46~S�{A6, qL!l9��&�z6԰�e��{ϟ_�R�i��C?_��s!e�����x���)��h��xg���_v�aJd[���U�:vT�ڭ8\�����{�@=�q�F4A�V�&�}��T��["������O?�����n1U�
�?P8����"v܈1U&fy�
�n������hr�_�-��<>�}��ߊf�+]���a�f{�|<��S���S�u��w�b�V"���U@�y��@9���ӡ��g^�%=���/�&#Z���mP����7�Yҟ��ɝ�Nz��5˶���rKk��53��"�����Y��_�I������o.���}�SFE��^���4�����Ls��s�"���隑+�!m��8�g�.�=
�#ב�"8*��C����1�m`��yj���^p���I�}����%�_��7�!1@?
���.@Pe\���QяS�ق��Su
���5o`cy���g0s��.ȹ�9Q�ĶF:>��$g�_��M\�&�ǜ�tb`PRϺ�Do��ihl��i)MA�iB����V(R��x&
�̟Q��Do����A��BP'�Oyt9�Pvk5
֨6�ID6�1E�5��#��J,\d�\�zQ�UvҊ
�`M:�{P��4/wT��s0�N$:AҿR��>^�D��H��@�;%�hh��1PG�*�Fg "]e�D�	3bqk��X�	�${�_��Y�͌/K�f��E���
���;����[ؑ�դS�%cw)��N��*��"�W48LRHiߠ]S����!V�|?>ѣ�=q)�
j�����8�hVg���
����h�хy;�����|L nXv�̭󡿠����}g���eY�h���瀞��S������i�
���o�v��Q���9VU�!��������B����`~�|�B1V��w�8
�R3^����$ʸ���8�Y��G�����f���h��5�y�����EV�2�d�o ��S;x�H��$.`�4���H=���(^$�/��q��?����/Y������w���j�j�\��儂�Ƣ�(�8E,����,.�7�4s�U*��z��>0��
����G����MW-S��.c�O��nF5��5���P,2��Vٿ��5��d%K��`�Dv�"Y�۬���z@��3��"4�RxG�Tvc���9�8|I&���h�H������uC��Rtr�GWޢH��ڢ#����~<��X���V�%�;���Iʫ��۠5SP��5���w�ֽHi��A�	!��[�,s���Z�$��Jw�KP6L��}p��$�ڵt��M��u�f~�۞�6��bH]�yĶ2�[��=�ħz���Wi1S��	V& bQR�������
q�_Wt�Nw��t��%׀u����}�^��i>s�6p�[��]��b��O:T���:P�E�����ݾ�.6�G{��A�sEb�6����:���
�M���R1kˋ���ԧ�0�}�u!ޣ"D��ѠF�mO�e��CXɕ�+YOO�h��z-eW%�rV"��t�xn�;[�w���n��*8F]�zJ�%�P���m�5Q
�d���	^�	nV�e$u��4
�2�Sg[b�ٙY�1j]����ٚ���Ͷ6�0Q�_���|��q߿3�����Z��s�SN?�{YOЮ�
/:cӺ�Uc	����X�=��9���:.���e��-q!���T�6��8@�o�Bl�X����?�\���P���=77��n�R>Y\�"Հ�}��#�C(��.���ף��g`mNon�L��8��}�z�i{k�^t�H�9�3[H�.I�,@��(�y\vu1�	�uW��_�bßHL�.���b���?�c��j9�Щ�Ӽ*�xg:�NN�)CÑ����d�[��_���F-�ߩ����39���}��f��b����;/�m%s�[w{k�Pe��ӝ`6�d�UdhĤ.�>��1��I̹��m�H��A�6B+�2Į��{d��ܲH:�`L)��	�_5]_�\�̜7�My�����:ڮ�	Q����䄏�s���j.\]c"D���-��3�c�Z��$�|\\���恸�|Y��ha��YUx��p�e����飡c�qb�=P�C�p��9����A���E���))gf��C��`�e|`�d}�M��`?��jC�tc�
rm������ڳP���{E������m�D,<N���ǩ��7��4ƾuU�����~�g���&�I���lݓ��!�	��n��A��-:!C-�3�]���_&������c)�?���K[�]{�,��N�N�p�E�NE�e�P���w�K��q�+7���qՙ����_{���_�0Sc]���mp��I!��	1�w���+l��ps�ǒ�
1�K���&�2,�se�b
�r��.7�n��:^I4�v��ީ�+�5բ�����!�dа��"�8U@�7��boR�cio��|;�	sy�k����oo�;f4v�.u�[�Чd��BW�	6���Җ	&����|@ePQd�aMQl�Z�ԄZ�߁ya�_+"A�Z&�`ih
b_�5�$@&=�5"X��_�i�T��֟�3VKpKE%��}�O��>�mie�N�`.l`�?��^ϡ�-��������A� 4�0~�3��C~��F����ck��ė�]�W\��W��,�l7с#$V�Є�5p�Ȥ�9��`�����Yj�M��H�.�q�ۻC6��<����;�!�����hD�Q��ӌ�f�2�ƀ�{�c�݃�;��$k:vZ�ʟ��)�'	�I��
3:
���n�u�����_��v���v��M��&�GQ��̤F�bO�<��HM�&���X\�L�hhYzf��r���٩����o��׹k�
2�x75��{��Zz�$�?E.��3�9�@K�D���55��Si�/8�v[ԩJ&D���s&�����6��z7��Ⱥ6��t�1���S�}Y����R�]S�W�-�.�$(���M������
w����4�t���z�]��†!�r�HA(�;�_z��z�оn����_@�R�aǓ�9ev���}�^:Y�Z&�c��:RT�ש<s���*�SȮ��4���Evc�p����`����7�f3���'�fY}2Q�J����=���Xۂ�T����^ٱ��-k#R��^���<Þi�M���wL�Ƭ���D�w]�:��>���؈3�Sg��,�F��S��:�zoT4t�Wg�w ��]�s.�9�CF����3�ZR��qV�'�"�nws��m����PK�uW�*+$�(pkg_resources/_vendor/packaging/utils.py�Wmo�6��_qU
Xjd��R0�}I��[,i���E:�leQ#�8N���#E�9N�b3��"����\�����;��r�b!1���P�Z!(k	|aޖIJ_�X_QH����II��w�.�����ũuX�5���mSK.��bK�\@��e�
!C��\����%�D���kPےK�����U3�\nK��"|)(��D*�V
U����e��L�Ę���u�\#sV\'9�l�]�λ��Y������{~d��YA!I%�șq�&3��͒5����s�;�Q��I�D���b��,H����
��?u�>���u��a@�*�I���@%)�+^�!�����3���v"�ȘT�����n곟�R�V��b�C�Ӥ�K
`��%��C�3���|�ѡ�S3ٜ���W�\PT�+2��(4��$��%S�1�
��{߳C�_���Q�Dd�����0�����:�� �S�O,�4�����:�k
09ߓp(�+�S�hG~��
�7jU%
����qP����x��\?LmS�}��8�W�+c%�hR��[|
W���1i�԰3���$[�<1e��8&�8�P
V�,�@�T�F��$X�hL���v�$[`Z��r�5�`��$M\��P� ��XA�'S�u/5���Ķ{�CegCm�V
oR,w�bh��q���_�KP
^!m�*��V�la.���ֈ8vUIZ�G�m�Ӓ���Z)D�/N`2��d��%��p��/t���bl;Ϭ�v�������^��7�~�ok�j�M`���
�f�u9*��Q8I�I-���à�0��r8�_�)r���<�い�����A���5�Q/?��4Hd��|q�sF[��p��]O뾫��Ɯ���n2�~���tz>�9�NӰ���F�9~�*�{rl�R�|�uo�Ǹ��j�k�w5���.�����A7���1��MJ:��pHAKM^�nV��#jf:P{o�',ܳ���7�/
��܈VF��ȟ�]#u��,R��I�s>Gf3K�
eo�.ªP��iO���iR�z���_��Ng�^�|Q7��95�F-˜��ʴ���@��Z���|�N��� ̱4�K���e���L-���Tc
.n���� �Y'*]��5�����q�꥽ɍ���������>���~8���)�s�	���{��u�[��x��XOPL���]��ov�-Og��c�]_�4��nÖ�O��W�^p�8rV�aRS��:N����.�J���p���=�|c�Nx��{i�E7U��g�@;�+�����;"p�3`�s�8���pyۧ9-Es�|c�Փ�,���e��m�h��^��<BM;/4{�Na��H�&�uw�=E]�
!z���bBLR���+�f���1��%�,֌䰡M��+�R�6��T8d>��l[�9�-���+Li���M���1w��?�S?�'��PK�uW��x�?*pkg_resources/_vendor/packaging/version.py�]s��>wFdL]I9y(ǒ��jF���Xj� �x��X�(���߻���h��d��C��/,v����|�(6OR��3^�I$2%b��b!Y��r�X>�oV<��5ؐ�$�J���!�YL`ߟ��0!;��x�ٱ�0�g2�M8�b�������sɢ|�JE!X,
��*�A�C�IJ��d��1���|ɀ�~�d��f�%�U.�.�H�g��<MET�ce% q��i�@��/6+ n���6C���)��@��
��t���+P'Y1d����3É5�p�
�����;��I�@�~;߬ク�Er+����S`d:e��"����ɇ���7����C��Q~=�ny���e�gH
$��1}��!|z�;��4W�;q��먚���?��������<��6��8��&(����!���+�98��e`�h\o��h�j��9_�0�?��e��r�w����҅.�+`\�����l�,��oaeq��<��(y�ZW��М�s�'L8���15��,�0�K�d�����]��������cqK^)�,�?Sd�p��b1׫�o���?`�G�O�lAp��N��
��00�qttd(��Q,��4��t�4�0���<��>uV�l�$O,qM���^
�^�3�����>%:���e�Z�R��s���ZK��A����U���+��,� �3Zo�Gb1���`B�>DT�#�fz����ú���J�{fҽR'V���N�F�7b31��3�-:�t��j1���H��K��*&��� B$7����)y/�bE��a�$���*QI�
�E����ɩ䞶2��[)h5`�, �&_��;(gw|���osP�c4S*Y��:��G�V�#^Z�,���֢���d��\	����}�z�u,�(�}^�����W�c�B�JsC?\k����a���u~��/'>����c���?��u��5����3_��:�i2bS�ѡ=���H1�R�eAɺ�&�׻�a��2�HA�K��d���q�+6�b�`Ŕ����7!;�v�}M�ו����G���\�<�f��;N_�d���BC�Aj�F�z� 
9�2}���z��.�������3C�����!z��OW�%���D�
;ˬުa�+A�~��L �޿�2�f�-�i6���>�Q��]Ҹ��~��T� _��4U��.A��U6�V�t�	�A&��nVE�n��"���)O>��Z��d�'�����ͧt��\��ELpol������X���u�%��Rɵ��eɋhђJb��T�Y�oڠ�&�`���@j?ac�X΄΂ ����!w�fW�O@�|I�61��U�����d\QÐ�9/��^�Xj��Ә��o94�JZ���"�}����ئG'?�����|ڛ��ZA�)@�%,y�Hb��9���f�6�n��Nj4 ��UxT@	s���8+��.����ʤ�o؄0'W����*��L��R�$ϬԜl��DK�3޵���tb[���Ȍ�&�P(������UTY�;SC��Am�7K4��gv�C�i���ZxLڑ��TyCG�#�H�3�����K���(B�L}��&`/X}E��=��uq�e�y�5p�]��i
E��J��~�g����	�'�j��0�MXe���?)�<Ƀ%-�B���.ŻE!�.�*q&t�L�AA.���#;��F��b����N�f���a�ƹб]b�:=>e�~;�³���t��(������q�j���s��I�W���$3�W�Xr�J�n�����$x�4�\F���&�$�Z���O�A���l�~�.�g*�X��ׅa�&�vK�H�c+(�)f^_�����}b;���z�7�D���6��56��̎|���f2��"Aszd��� TP�� ��|jಇS�*Sܪ�,>����!k<͚$!9��Hf|r�5g�i��l9�|����HH�Kcn�QRvQ��4�ឋ��"����4~���͊�����Q-̦�r�|�z.�+
�'�v�:f�6J�6LZj�H�s�����Z/��i���Lm,/�hABs)�6�2C��x�ďNDG{�S���y��~7E�<��?#�_!p�!��Թ��A�D3)������Zat�r�z"RIg��V�0o�K��K�o���bٓ
���Fȁ�,�h������;�U�İ�<�(ս�|����q�G���v�\��mn�g͉��djsš�+��f������인i�B}5j5;�q;���-Vm�ݢ�a%;�.�v����
ɛά&�uB3���%d�)��S�	7B���PGp�î���ځ���ǭ+jJ@d��w�P]W�F�ܘ��vo�Pf�`��(3�2K��QI�� |	R׽�?��!{9خ���4�eZ���G'Y��cHݠrL�d�UHL�g�աs�[Hʃ�C.�gLʥ��*9���|����ڀM�ViX�.���}�a}ෲ������87|�s'��$��
�c�+�p�oq>�����ސ��̍8�&��15�d�cy6�I���r)[+�.����i7��z�9�y�Y���v!�z$vy��n�w1�,ÿ7�b�CA��vՏ��z���Ǵ���)��V���fhKl�
6d4t��m�ORQ�YA/�,�HUF	��Ɇ&��*h{����E�v�,ukz���Iԝ���$�}K�\��-R#�7<�{\�O³>�r��I	���E�q�bt٥�����ݪ�A����ԟ;��k�	���� �̐)��
�pQy�]�F��N��ɤ!��x��K.o�B{��P�}Uޟ(�|I�
�y!讅:.�>IEe.�z����yx;"%>��yy;��ɘ:	z�q�p�v�Z����Vio3)8�o���H�b�j���Z�M�;i�~�E%��ߢ��yJ��b�Iw�K�?-�O�.�,�/��^�����y��v�ؗ�OW�WW��+����B�������d���(N�
�O��o��朿S�${LT%����˲��%�App��R��J9xT)�̷+ց���-A^nӉ��N�u��	�
o�c����sh�����G�M�}�N�e�S"L�m'�ϕ2���'$5J��R[�!�I
�/���dn��K��-xJ�T%�qJMIQ�>x��@�͓F3vh}�䵼s�lK��L�X"����9��W=�%$���ס�/��e��6R�|(`��D�RtG}l�vhj�I�ȋbw@�Cj�ԎP���|-Q�s!�p�Y O}V�CP�V�k��8�ϊ�GĞ�N�Y;HvDn;��.��h%�[�e7:��7�L=N���2�N�^h��^/!����
��&݉�
��ҳÚ�C��{GG��Lʵ�v�1��
~�"��8�;'[O���
���iN���"����q�)��_�Z@�nDu�_�`��zO�l���s~#0g1�`ir�Blw"�խ:ȭ*�	�VzP��h ���Ĝ���K��9��v�[��g���k���=*��7�X�P�xi�NM�];����T��Vw	C�~ެG��tp�G� C{�X������gb�9��F��6,��FwC7Z�D��t˫KkC�;������Cv��=�^+=R��4M(.�����,�3􀕸"�Ί$5�Ү�Q��>��o���ź�Д�ؠ�o�����.j �G�)��A�A�%G�gkUʉ��p���l+���$��y�a ���5�ſ[�2O�rsv?���hX���O._�]V����qt������\���iQҼ�4��Ox'=
Kbh�8�!r��pPI,+�	Dp�y�n���LC��:L�a�[t�h���K�Bձs��9K��l�M�Sܫ���Z���	c��%����.)S�:�n��E��ky�Q���������[Ea&lM��*�VP���yQ���A���Ю���
�y,����Higر�Ǚ�6����RwF�t�믕[$y��u��6�I�]\�ט����y+�H��U���}�2hدT:�k6���V��٭1��@j�1OL�,�ľ9�gV��	[����ߎBl����WWId�+O�����O��Z��"���6�VC�}��fdY�;{�yv���0� �{j��m��#R�p�}��	$X%B��=	m�&�7_�v���"?�ԝj�V5��0ԫmH�<4��PK�uW���2.pkg_resources/_vendor/platformdirs/__init__.py�Z�o�8~篰�ˮnK��K��F�6��R���TW)���]���m���?��`�
�Id���0f��|f|�>J�PI�@+�QL$�)�h�F8�aIY�\�$�+��r�KB�ˍ�������A�ң<�̤J���&�,�
��$�|pa�Y��pUȂ�0D4����1Y�^x��1a��VTs,7	�5�>��WJ!�#\���f+�Nhr<C/�s�����u��(c(b��&����_S��4,��J��{F!38�H"�w��DH�J�)GD�ZB�sZ���v
Y[�z�t F)Md�c
���T,,��L����P(��b��Za�`!&S�D%�\�|���1���h�@�=͎����M@��:���\� �Hd�N�]c�av�b�#V�G�k�L�IEF��9�y3��D����&�������ty��3G1��W�ݥxq~~e!IRp�v�5~�ϛ�3P����.޼}�ɟ6��'P��i����u��pŒ�p�k��Tz%z�2��r��e5�v9�������S"Nd�(��[�����g
-@&z6G��I&�-‘�wMo��ڂcPMz��/����6꠷����HL1�"+]� <T+��<)���P�Br�L�Df�:.�qG�)��`y�L�%��$g�x=G��%p�41���)պ)U�y�9N7O�#��&dE9A���y�9hY3A{��,V�-�uԥEC^��Ӛ-ku�Jkz��*8�9R���:IƷ��XZnH�
'�ö�N�BgM���$a��3�B��A
KX��),U[���ie��Y�|�b��b���86k���4p�h�fIJ]��9p|>9qV�>�l`h���9�go�فhC��=�h�~q�!������/F����� F��U���j��h8�`���X��q{�a{/�}0�{
B�	�wg	�&��`�R���!��HI&E	�=Ph���_	ɴ�;�.�"�4-��Jѣ_������z:��z�4��`}W��Ch����VϵWP>�5a��mP����Z�F��§��is�<T�u�iapG�u$���=�y��n�Ph�����+1z؎�o�χ��mXV��qc:.�o��� ��k�r�<H�uTi����Z�rv�Z.�N����o�U�GU�vZP)6�a��$ו���-�>7r�I#[V_��R���)�#l>}p�潳#��9R��Ž���ùb5���������
�+��v�f�N璽�݀:R���PK�uWZ�7�f�.pkg_resources/_vendor/platformdirs/__main__.pyŔOK�0��C.��V�PAo�W!�m�h���ʲ�ww�v���E{*oޛ��i*����b�c���>7�F�5��<��QZ���ɵ�;Ԗ��]���Y??�_���>�³�G�0O�#qc�T۹�7;1S2������tZ�fߙ��KP��7�,N�JBH#$h�LQBu
�ֈU�s��Z����9�%�.���V;n������BҪ��at�G�*Z��Ɏ}![�w`]oa1�%fR$��ɤ��r���!Yӫ��!�	\�:P�@�����~\�a+p6�M��Z�q������k��?�+F|
���o������DI�;�E�S�E`,�!�h߬�P�PK�uWR"�si�-pkg_resources/_vendor/platformdirs/android.py�W[o�6~ׯ8P^$̓�(#1��2�I�vCWH�D�l$R#�4.��wHI�ǎ����E��}��Q!EIR4��4I�U���B�W���	Տ$�Gj��˜(�i!J�[(e�d$[�v]�j��bF��څ�Ԭ��)�.��ΙT���y���D)8�,��S��}^��_�%�E�r�3
�u�����R�ZM㘴�"�IvK�%�e��I����/�fi�[rK4��(�Q�$%u�I���.��1ID��:�Y�h���
1�C���������R�T�}�ia�IN4I�X�hY�����-<��TR��O���R�K�@3��5cj4ZD�����T|l�Y>��kD�,��+.XIU||Z�W6ϴg�Zw`�����<��  I�a`j!�h'�t�$�(s*�0��o������d��Db���]M@n��t���FR;�/�bw�n��m�^��6פ����h/E���,��v`�L��l��v��ϵ�nF��o�F�i�����[�:�N��P�/Vv'�m����[U��+�Xxy��AƔs�%�"i�&S\���9���zl�=�EM�N�5���D0L���9���(�,���bM<�ì�D�T�k�\��2�
���VMi����^�A�6�:�~+��K6\����U������E����N���Ƶ�AE��JO�Bϰ�q�uD�7���V�Q0'Y+�i��M�~8c�L��an���0h�Z�t�عi3iX\Pݦ��.0�#��z���F9Uۡ�)�}7Z���sBg�kz�2��}#��E��N�M<\�C�p������)�t��"���Z؁�y���۹��t�D�hz�y-A�<�ZÅ}�8>0���A�8&����„=��?'l=�LS��c7zm��~[Ɂ��f��0"��E�.i]��͏K��D����a8�Y���؊Uu�t�>~�P�KJnݬ٢c�Πa�{��_�o�W�h���tk��}�c����/1��\
_�;&7y<n����V;�����pqo*��nO�F���8�p����ϷW�?��"@�����*d����$�,��>��w���/PK�uW	Vp�.)pkg_resources/_vendor/platformdirs/api.py�W�o�6����~�Wn���4X�b��b��P2-Q;�H�����HI�Lqb�0i=�=>�=*�V%�qV�Z�8QVJ[`R*ˬP�L&�7e��4f��B�NŠ��87V�Ė��*m1�y!�w�S�Q��;�s�Bf
.����9��-^B�٦dK�
֚�$�~\D�TBnB���r͊k��'�IR0c�`6S��$�A�S�?[��/^�p�W�9���Ю�P���
����&�V�A�3TPHa�x�~���E6�f��$+�0�������}�`X���ԏ������e^Ó��b%J���R>u���e]XA�t�Pp��?�ѵ�eJI���3ˁ���}
�h�!�Ӭ���9��l�����C;]��a�4�g���D����X�g�P'����u
#x��������~/D�1�[�
Юn�S
�Y#�R��
,��-u�Z���~���n��V��|J��VҲD�������3�b!R
�Q5��A{�N[�\��VB*l]p�B3��k?:��xD�!��C^�KK��)�h+�ԓ��–��]������S�{[H��6}�8�v"��5�M[¡�%�rJ��&�?3
���[U��8�3�]�.J�M�����W����0J�G��9z4��x��Yַ+�l�HZm
V@�p�I:{R�`m��n��)ٺ�8����D���7��w+���m���j#$L
�]���p�[[-˓3F�H�2*���W�Y�壙nI��۷���mz�%z�z1S�_���	)�.G1��V�������}���[���g!�{��"ɩ��������{�*)����X�2h�WK�F𡡛�Zm�d�;��җ�#��vK��ۛ�:�ȑ� +؆6�9�)���8�G
�YQ�-�ߎm��WL�3������~�{��a3xuI����4H�����ݬ{N/������t����B�pm�<<�cgNߔ"�#ߔ�-��w��6¬��w,��k۴�oNA9j���?��wI���[����o��Q��e\v����&g����m=Q2���[�3o�iz	��d`I��r �����[`l~�}��#�#�s�*��]��m��f��`E9�<��v]�l��F���|wQJ��C�h���
=��:�f���X>������=���:-�^�M�׹R�<ͨ����ZG;�Qg���Í�Cw&o����7��:�;��&{�]�܂��l`���PK�uWK� |_
+pkg_resources/_vendor/platformdirs/macos.py�V[k�0~��8�>$����Z:-+d�1d�>��d�Hr����H��&��Y!~�#}�.����8/:��d�j�@4�v�I��(��4}�D+��Ц���^���(S�Zxٗ�d�w:���8��{�\̜6-P�
���n�����kwZ)��L��\4B��^��B�u��ج؇:W�s��%I�Ϩ�����,�u��f��U����ɝT� Q�oKn4Uk]'T�YN�F�F�5��D�0	ڿݾ����U�V�@�A�$�E�E��F�Wm�Yd��l�R�#�)e����g4�ȏ�#�)[>>�����W��'gx.��4�Ģ*��n֙U���AZH�<t������T���d����>��̂��Z����^]r�3M�a�gU<�	�M�_��d�GM�e�p��-5{��p�x:�g���`���!3����v�,Fć��{%��3��)z>m<,� m1{��_W<���俤>�#�]�9�W�Xd�豧�{㇜+�U��Ŗ������b�Ola!�8,���@����uG��B���"�2��ڱg���v�����z̑�c���z�j�������{Q�g�}�wCm�qF��������_F?��PK�uW+pkg_resources/_vendor/platformdirs/py.typedPK�uW	-\��*pkg_resources/_vendor/platformdirs/unix.py�YmO�H��_�2Hu�`���Zth�t@ER�$�K�N�pv��
/���~3���u�Tj$��gf���;K��DQ�0Ţ��y.�!Ti��R�^��'uu��t/Eʼn)��Ti�*�c{WH���2~[	|����I@s^�ΨI���p��>ò).��@��~�f�{�G�?$d��N�tH�$�������d�&w"E�D�$yƨf����)g�cp��Ǻ#u�̔�Oz,�lس	K˻~�.��>���_-��sv��T��gr�%�ⷌ,4�/����^�7ɨ���R�²�y�殺R�U�FR�e�#��_'���-ኌr6!�f��z���O�Z�b,a���<�j�J(�|9��6��̳�8
���ť�]W�3�x�Ŕ���8�KD���J�9��S��m�ta�=�9�BH���(	$�.2�L`)��'�SA���.��י��TN�y����5�ԛ��<�&�U�4�1X�EPJƃB�k�e�R�֜Cx���n-[k˜�n떒�qP��^��+�3e�j@CVT�PC#0�k���ڨ�
�3T�J	��5���n�0��L��� ���zu��d��en�HU��}�rtr4>�>_���SX���{h�F��{�1o*�Z�8�j�(���&hצ�a�9	F�{nX-�E~f2��w&�a�Ge>��o*����p�a�_Bn�lY4�!���p��	�^	T�����U���c�Qb-�Dx(�s`"�B4�ҕ�^&�<�e�5k�%��� Z�?�Y%�Qfmn��kEN��ߎv�{��)��TMv!"�R��J���r�K�B¾5q{롊�Y�#�i����v�!�r��(ʸ6�[�|�q�7>��h���dۚ��~;��f��?�5]�����9��s7�	kB����d+���-�[�m���ȴ�pW�=���x�ig4�2�[�-��9����g����R<��$|L�"l�,��l��l|%��*��qS�S/�F*u�v������"�GǟOw��7;��^����l]���F5�r�h|4�]Qk?e������drk�ˢq����n��*�d)�|��DN���2ov��m��_Lr�y�Z�ҫ���9�iK�d���zL��!���I��0DF��@�Q*��d_^��_�O/�#$k����)�����n��lT�wl�8pL��mXqM��	�J����Xx���8>ڶ��Z�R� �p��	9X���׋��)�tL�2��y��:�����A��zlU�8
�N������:�_v�D��P�{&0��06{;(c�Ղ�q;�Nx�X��"���O�ژu;p�:튻�\n������k�l��Sm�A�Xͨ�&�b�
��9[��bX��"�"8�.�Ս���^���߮���_��
{-=߱'g�'��*pU�Y�=1G3v��_R����#�1������H���b`�}P[
�r7.������`i�Nq=+*�08���_�H�}�a������ߢy{�
]$6��M���2*�����x&x:Of�&v�"���´xc �s�#�X�C�	`�$B�S?��!�7��ba�ٱ�6d*n�֞v��kԼ��J���2�;j�`���7ޛ���g �GRz�=�B���v�"�F1s�|o��ˮ}�z�vL�׽(�YEx2T�Q�
z7��PK�uW[є{p�-pkg_resources/_vendor/platformdirs/version.pyM�A
�0E�9Ň.��Ȣ��e��X�qF�Q�,��{��p-���pK�.t���Tk��n���
��d尓���(�7�^T�U�iuD�!��3|�1�C�^*W?��)L��PK�uW?�ߖ��-pkg_resources/_vendor/platformdirs/windows.py�Y{s۸�_�UzS�F��r�itg�>�i<'?j9�v,S�Ěxh[��w�.R��j3�xb��v�D")RQ�sɂ��i&�&�s���W��[�,c�x哚�F�b���Z�DR�!
����'�f�&	}LX�n�4������H��,����^�����xQ��~�� ��l6G���+"8y�2ɈDi4�ȘjJ�8�����Y��[�g��O�P
%"�"};f��S���Y����{ƿ��G����}п�tt���a��st�90���(�K���#""€�#0�Ӕ�2���@���|Gy2j��4�S!w㵴%�3�
���,9��)fn;��,9d|7���d�C��/��zf� %J`"��)�D-��	$YZ8��]�׼k�<*gD�l�耜�m��_����σ�ۛ����o���,;�a_�4_��>c�F#�A��r���|��B�JC�PM�I�7�8��77g�w�MG�S$��P�׽�9i)*�z
������|�&L/1"�������b�-��Zy��j�ɫo"}���b����6q�i�3�L�M�g`�YN6Ȣ���r�p݅pN���J)V���B��㈎�෪d���[�=��j���
k-Z\�Ka���ck�#Yv���&iI�����*�
�S���k�[�J[Ś�P��*ZM���~��zV����z���F�	�嶺ʪ%�c�b�]_^^_�մoa��qPdQ<�1�xc{Sx�PEF�Zs�jn�jc�7C�Y+LU[k�Xkk�jsPq��0LbK�y�R
{/1���|о-Z�j�a}����8t�C�\-�F+���bgL/t�㦱���
��-Y)�ah��@7D�؂�e��c+vbl�UP��{4ꋉL�b�)�+|+(�6��X@I�}7Qus	��yXa�2���[����\�_����uM-,R[j��vp}u��2��̹�ӽ��c����K�u�^͡���:��u60�u�~�?C#��U<N3�aD�G��t�gͷ$0�Rp�1~f*��*`.���s��.!o��YS��sVMhm�[5�
�p߬d���!+[�J繳��:�Z}��f��^�YL���GՃB�K=��a�~�!U������l���9�%������¹�BzQ�3������:���6�)���t!4&T��F8���+��*��U�sCL���
��l:g{��`�-��
�R�$y���,�����<2�}r��@U�ar��|ŅC!tIXi�fq����0jC!�������Ϧ&�ֈA?�_�n��)K��]�j�.X�4���X�*�����n���j�
���}EX��t	w
B~}�tԱ�G�dF8cc80�,���j��'����80i
Ř�y�,7��]�-�{%�E�%A���nk��}+2Ol9�+�5����s��~:�G�|{{~u`ci��H��P?�,�ӆΈa/�q���S��Y"$����|4a.F��4l�`n��r&g6د��^NQ�T�^)i�I���l�S�fȷl�bً�
u��8z��?mB��-�Z��`m���w�	%��>�1b3��F�Ã�;k�a�?ƤP
ٲ|mS
��la-p��>���m���>�x��,�|
�p^��,�LE�o�s��� �|7pP�0�jx��.��9��rјH:���S�3G�F����"�x2}��>u]��M�g��c/l��y���x��=��'�:���	w�Ü�����C����/p��͸�i#��-`�ۍjM�����,����ДNq�E���Rz��ЬNx�V��z5�p��9j
l�����X��L�Cf��M[m�2jׄ��c�T߆���1��U�b��z�[L�\@0l�����
G�C�?PK�uW�zk���	 pkg_resources/extern/__init__.py�VM��6�ϯ �b;q����X�=$�^��	z)Ak�3jdɑ��������43ͩ�l���HY
�uT<i��LA�C��á��{�Mg�c|����q<�7����Ï0`�0�p��Ao�L��	��5R�˛o�@.6��=+�`d�\�Q���� �/�zgp�a�ͺ�x�aB(���G�כk
��(��$�/����`�h���P���P���^���w7�����Q��_(����ɷ��_GgGt�2�(]{��H~�f)�����y
K��d@z�K!�'�]��B��0{
ES\�ŮJ��&�b��=�O��q*[?iͶ��;u���H�}\{��(��ٯ��ZÓ�9�a}E3J벼*z$�U�!�À�!�4�/� �2�6$W��
�<�jˀ�����]��#	Ab������z�n�[~̫b��]��'%�ۣ�^��2��N�>���>H���g���bn���@��N1Ս%���⛔V�g�|�Y8�X���U�~�/-��<|�u��F�������I�v;����\��r�O��(	���I��~��m��n�	J:!W�=M��9��L��[��5p+z?Kgh���Z�'��A�;�{ѝ�������W�X�ڗU^�]�I�y���]w̥���ډܚ�I�`����\,��[�`���c���b�뽃��4�L&�ݲ�!�R)&WA�17�#xL]�-+��<�O���a���\�$U`N�u��yO���\f�-��А��G�"}#�q�JM��.<<�p`�dbϚ=P�W٣F�#�<-�>f�m:e�H&e�l�2�H;��_���.wkE-�T���8Pe�"��Z���6�"&_�:տj�tV�PK;��W�޴�
�#setuptools/__init__.py�Zm��6��_A8�Y�s��&�,�rM�h.�&���2-ѶjITIi�n�����z���7I$q8��g�d����FU6ו��V�Y�ۦm����ZQH�Q�.�B�7�
$�5�N'����iĺ��F�†�{2��J:��V��X�)c�L	�HT�y-޼x�,Pw�q��dmt9����X�i_���k��5
Ϡ�}�+��$�l�BZ�?L��8z�ɫ�B��ک��(����NJ���9�T����;�K��n0�)���oa�Qo�*Sf!n_߾�z:���l����a�h:w{��4�����f�R�Q�$f?8��$IdQ$��?N~3K䳅{��}��RVYx����C��5��v��Q��H����?�`t2Yi�@Y'yeҖ�t#��+��d�8>�|���3��ݔ�$Sk�-�VM�3��d�;�fEA�F]�L#W�Z%��3Z<t�Q6�a���ukH�ų/�
� &�=݊�8�Ƭb���Z�.��R��聹^p�V�痢t|���k!G���cۚ�'pꦯdNVm^d��P�V�2k<-׽��a�I�Ȫb
��~�H�j��UU�!)�j�H���e6����2�mw�x����u�A:��s��?�[��h�L4�;I��쑸5�NU��i
�(l��l�![����nX���Q�4��V�
��M`*���	��P�ȎP�F���"�\��"T�a��������M�(�e}�\�F��r� �� E�Q�l`R��釁D��Ƌp����.��j�vE�U�4Y�D���FF���~"�ʱ����>U5�+���=�O��3��Q��U�fΖ����r�9�K�w:�g�O��fG�0f<���t�싯��W�����x���]QΒ�bjf��(�ĵ4V��&���'���|4�rf��n�8z�$�h�x4�z~�ME/r��hi'ֱש����]i70��goQ�����9�M
_�,��ʿ��y Ɓ��l�ʎ��HP	Yu��l%�ͫ;DAF���s�f���i���V��
�Ų�밦x���I�jԆ%�"9`��-��X�%鍆��c�$�A�D���.7M`W�tU��>�߮9=L]C
��A!€�"���$j�#m�?AW�Dd&�񺢂������u���<���\��O��I2NI��JKY������%z:?���c�@���˯�pRXu:��PVܑ�h=�T�&���=�[��C6�����5���$�C�U��\�+�9�墊>�3�2s��p�r�<>�0���~a,*�w�$�N�g;G�A��6��;��B�w6*;nO<5-�Z�!
|��B��]���I搖j�6Y~3�c�vR\�^�LY��X4����#�Q�$5���C!^7H���tZhK�
�_t�HRiK_��ʽ�2dÖ�[�⟕���`��d���ҫ�\"
V��OΏ[���N1��^8hJ긶�R��V�����q���%qМ4s]�tZ9��$V'�].1�)��-(��۷b-��!��6[�!�:��/���5�a�P������Q��x����H[0+��$2�آE������}uqI�褜<w9�{#���Xs�5iHB���3:U�^)�k2�	тM^@M�];���^_j�3B����3"�;T3����P���U����G��Q���F�NP[ec�{��u:��P�@^�~s�a�7��QlƧ��o|�j1MX�J�y��i��;m����&/��%�c�sq
I������X�7�ť��ۡ(�GuJD*���|��jbN������\�ϘŴձ%^��aBV U�ZG�lE���sGΚ5T��&���Y.�.�:�]��E���%E���3�2n�(����`3��ƾ���&��n��ӛs��1�'R�}y���a@-�#	�m

L`�w@$ꇭH]�0�!2��B�p�M3�����JW���|�d�$��c�TD���e12d�H����t�8�8�:��4�n�m�@,Jj��Q�[��eb�d���a�������P1+%K��l׭r�&Q|ȍ1�s�`[|F�D_�>t�i��gRw%)w�
3��F�p�Hs��%��R5w
z��%��w0̧F�*���m��^�:�򊙞�%�
�d��w�|�ϪDxR��z����;�;�1�͜M#�{Y���=�����J`s�ͬ��k�%�l�<4��v���C?��Ӡ��T|��8J�C����p,�тB0CA��F�׀�4x�zw�"xs�MBq�'̇xGE��Y<��a��O�S�P����}��#֔+W���b� ^޾����c3ڗ
�E��>N�t�G3���5XN\�R���H�i]+#ހ���#0j�X}���1���٘6m���)즶u�U���ܡ3�E4�:h40j�gva'�_n�:�eU�����5	�M��W�9~А��4�GS�1X���
'���Y��G�g�3��ƧEa�ƺ!U�?oy-�h�wGM1:�L�6��uGt�m���YW[�x���`��c��O�c���>Xr,�`w�Eo����^���7p�k�v�9s3��侗Q�!9�`@ҟ���o0FIO���,����A�q��d/.�+��d�x	C�>��Z����u���^�>}e b[���?M�����O���xt����a�G%A�J�r�����H�`�{�]��7$�wk�
������c.���t����:�D��*���q�F]�=@�������NCQ8�;��yX���E�8�}؟�1: �GfF�'|=sa<,p|�rf��?����ѐމdž�#?�d�3�� �HnLvg���T��q����f��'��o�F
z_�����$t�����ӓ҂�8�}��7�G<G���?�/��5����).�]��Эg��ѴtG'fD8�a�MW$P�w��1�?뼊��u7!�D.-�{���k z0s/��Ϻ(�o���M�9<y�5P�]EA���"����Ґ���T<�G�݌�ѯGXb=v�_q8��ϘFH0�g�N��&"���z��8N��S/��5��7�Sip��nb�V���*����Ɲ�榹�8�/efޅ#p	�'���퍬m4�?sv����;��X�@��_�����x'�7�b�o�PN�I�(�CY��{��ܟ1�Yhé�qr�~a����N\�vU�)���ˀ�[jl���+<7��x��9���I�7����6n�N���n;P�;w�����p/|֪� �&�zz�|!�]�����=HѮ$�@������O��XP��_=}v���y�v'�6O���A��t��nZdi��%�6Mm�//U��]^�,��6�Kz����s�L��u������}�?�Wʞh>�PK;��W�=��"setuptools/_core_metadata.py�io�8��WAa	���Zc\`�i�E�$��@(�Eۚ������{�%�`��H�{��>�A0xK�4�����U�0�	�RAɼj��Z,���tvC��0+gy�"|è��d�d��x0��؄,�����P�N\KBq�,Yy�S��8�5�e�lFEV��pǏ}�� �A*n����<v'V
��*+h��U0΁�w�y�3&֛��zU�5›�Z��3�ڬ�XJb]���F	h>"2.
$��Vd9��m��%��h�4dl6��j
�gI��HҰ?��aYS�N�mnXí�u0j����ܭ�B�����U�j�mJ��>1�֢�r~��)�����A��d�Db,�h�!g�<���d�@T�F��Ȱ?���d�D�戓q��hX:��p�(>Fv��}�^�J��hJ|S,k���2Y8�J��+6�Ŀ�`p�s��9�jXD⠣\��pQ��s�#g�� @�XR��t���!.akj�y�gB.�V����\��tJ��
�r���e��Y����[9����27�F6�┥p|����2�����Sv_��oblD�S���X��THS�B����h�rK���B�\e�)~9yr���pC�'�
$����O�ȴI�:_�lC�]��,D]�7B�#���k	�5f�	P��g��١y���!?QN��&��x�)�CI��
�\\���yG���0�.3{�(��D�(�#n�w(�e%���rU���B7�)�1�h��d��:��k�'�l�4
2�$��J҃���i�-F���c��/#�\BM���C�z�=H�(/��{qy[@9]k��b�B/b�ވ�н4�*�u��ս���� ��1��=���d~��XBn'n�t�h�{(/���k�~G�ժ��q/���O!�f��}�oO�@F�}�˫r���NZ����v�:yʼ���_��
���ܖZ�7O5�o�zU5)����d��ӵD"�f��QG�5��0��Fu*�7�,��C����>\g> g����'d���3U6�D���|u̺��<�m1�n���g���d�@W�ރl����5�r&�P�����677}��F����C
9Fȡi"8�Μ%�,bw�J����6���HK�F��8e���I�9��5=�v�88z��a�!�!�)z�pz9 �O�O'0�W�YebI���}�J��i�&J�R�6Vb�,�K��ʣC�0Aɽ��
����/�nؐE�����BƮt�^�q�
�e����y���Q*f�g���`�-�`DlFQ\�-K@��%lK00��0����d��%�s�p��΋�x��n��\�(�$�AR�mZ�+@��nE��0٬d����5��;����6��6~w��T�(P�*��0���x�a�KƁ���@F�b�a�K5����O
eH�Y����SIQN��x���� �
��@�
��>���G%d�"&Wj(γk�����U��1j��pt�%%驛7a�+�rV!�iЊ��9��hS'c�0��o($�[�#�)L�a���X��sU���8fQ�xJ�}<=~��s\�8��IQ�̡�l	Krԡ�K��3������Fű�!-��U��HTe���rϼ�&����=d	�뮖�y0���0�����4�b��D����o4��gY�I'�Ջ�G�A	�
T�9�#��)̛w���z_D�� ��G_��ŻvY�t륋.��oYZChFjN��g(��|B�oe@Z��i
�U�����j�h�����6@�������EWO^���2
煟��Cx�W�4�9��Sa���)	-�p�ֶԐ�d_<�v�M����렓
�_�,�M��z$�0�|ȏvH@872�r4���j����r�����ӌS2$��t���뵕,|�
u���o6�D��!�z�^�����o���Q�7�X��h�0(���0��Y�1�-x�8�L��x�GvC:��>�k�iW5�
h6M��fi����$0��� ���0�댋K����[�]�adA��#Q��zʻ��+7.xI�6l"�c�^z禿�����(o�i�=\�t߇{j�{�6��'$�É�F��=yj���ܿ=W^7��0����a������g��Ӊ��Nĺ�P�|�J��?�9/�{<D�{'K�3�HU���w����9ݻL���RJog{a�V>�XT�Н,����2��2"����tO��~i'6��W~����᪯����<w��U�y`��3!����C&���1]U��DC1�|�aϦ�93�#d��\�0��􀼅#�&�a���#3N{QĂ	��E>���b{��nlKN�̰������Em	�� �J���΅1���w��a�>�V�v��umu��4	-}S����{�5�V�HP�r�C\�y��(U��
�e���4J�v����\JO�}q��o0 ?ah.�e�}��>�*�Po)�}#��)r�-uc-<��3Z�kF`���鶋� ���o�?�-i^彏l|Fp˯�wN�A;��|�G�#�����_
S��9��^�NzÝ,�R�vu>46ݼ���gP{S��0U�:��c%�I��ęs�oX:�7����m&�$m�lj�c@:�)5��R2����p�c3����I��T�w�)�Ҍ��_N�Ǣoe��$��z[�J}�d�B�I�E�X
�r!��n�<5��;����0�1lC�����������gϟz�ۮ0���@I.mv�^ZL�5~�bW��2�PK;��W�znJz�setuptools/_entry_points.py�UM��0��WX��D�^iW ��{��$5$��h��ߙ'i��rȇ=_��Gw�(�ޔ��6�tZ���֏�:�O���NH�� ��O.jkhm�?���ߔW��?G۳��*Zm �h;�2:8Ba����H�>�DU��&����L�=��?zXf�,n<s(-zt�Z�*�G����U.߯^��'� �Dak� ��Q�.���d�D�"z�4�ً���T��T,�r4�s�B8�֫�+p*�E�.b�C�i*��ͥ����MW�~��B��8�����b[P����ӿqV��m[�+p��A��E�1F���S�w�h�Hw�Gk���̮UBܑ��u�H)a7Kv�����Q:V��r����И֪�h��]���a+��I�>�`�lBR&A	"��S�l=�[v�{l��H,���<�ɲi����C��bX��t����Lɹ��ɚ߰I��H(	<3w��|�0���/f#^�
>�7L��K>�qy�0Ȃ8+(\F�|��pN��T�n�;�[z#������a�bΧ2��@�P���+ImCj+Ay�e���/y�3��泹]:շ��|�k��K�x���NG�L��tp4���(�_�^�4��W�H�ADtT=vޔE���0�C�<*m$w���m��&{V/��%�k�&1D�y|j�K]�R]9)�-��	>C�9�R�(�#���{L�E@L��35̶P��k*����&�9$�����fn�Rd+���a�i��/H�/� �|,�g�G<��hUw��8�ʼn�����/�B�M�(X�p�K�Y�菑mxs �������A�|���u5g�v�,ΝK*�H:�{~��h&8^%�
����L+��]��^�el�5�G�op�PK;��W�9�	setuptools/_imp.py�Vmk�0��_qd�����|i�@Fה��vc�Q��d$����;��/Iڮcc���tz�y�N����uU�5�h&8�%,_�k��K
�/��|)�w�s1�B���������t��P:�!5���J6Ok����5)V�S��}o���:W-� ���g���QC82�h��br����:���Uv>�L��~�����jb���{|9���b-�O���\�*�W*>?f�Jt��i>{4�xdl]�8m�#K`�q�	/hd�(��q�BKE����|%յ���"��w�N�0��ZidqO!�i�X&0�5|ez�g�{rGAՕ�g�m1L�c��p����Ǎ\I�X���BF�ᡶpp�p��q�-X�"*/E�Z��,.�edvU=�}�(�ŪqVa�2��RnV]�����y�8�y�V�K�ma�
ν!<��#�/x��V�K��i6N[�F��j%F=v���q!tW2l����͊IS��(�R� �Zvl]��bmz����4��^!�+;	
��Ȝ����_/���a%LB°��3�O�'��kD>dU���dϪo�ǿV�����;Y�
#Tjܰ{�~�v�ğ�>7�"2�w���K����z<��d37�B9��@{F+��[έ3�>���F���7��K����i��#�K��F������g̏
QQn��"ž)�i�f��o���>l&q��u��e�y*v^������)���+�����,�|��k��{����O�����a�PK;��W���D�setuptools/_importlib.py�TKk�@��WΡ6��)���Ph9
-�P���FђՎ��r��Yɒb�M�^��}�XS7��$)��°�,��3X��5]��Ҹ�|�^\& g6�u�kǭGx!�wOS ��4K0.���\����M�C�U��#��=����<����~P{��o{"���GHt��cඳ^{O~��Z}	=<�,=ՠ�w����C�@d���$c���ڄ�h��܎�0քm,�ԥV���N�p֣���5lг��M�`�#�������n����A��d7X@���������L1�T���:T�/���۫YB×�ս�n3%BV�6T�V/��2�-���ӳt��a0e�so�`652�{�2��G7q��0Ƹ��,Da���uh��Kp_�T�%�ZN+�?�=7�-�d�ѩ�z�I�]��с�i�d�)���mU1W*����X��r�S�<�B}۽|�țn�]���aB쾛�Ll�pUo�G��\�9H�+	>�|	g����ۜi�>���Kz�Y_�7�N	Z�q?P�b��їp����UAo�#�B�ϑ#�����PK;��W�T��X�setuptools/_itertools.pymQ�N�0��+Lwh+��I�C��|�B�M])4M�$E���ӵ+��X����K�l���k�t�謣w��X�����#���oo6I����+���l�PZ����&��b4�F��c+Mkh���U5¡�CQ&����x�8�
��,8T���@�Y�aM�D�������T�dd��v�����+��8�a�������ΰɁ�8C�x{�P��w�p$ɰw�5h�aZO1��
%��V���E˸\�3��6�^^��X�c���t�7��̨'OBb���_ȧ���`W��t�x��,��&�+�kJ�����¬9o��Q��g��PK;��Wٸ�Ըvsetuptools/_normalization.py�Wms�8��_�sn��E��5a�a�4�f.����̥��m��#	R���o%���>�v�>����K��LH4�e\�h�|�*����9��Q���)ci[ƉT���)C��2:cҡY�".�1Ec���x2˹PH0g,��TM�$D��5<�
�̓lR����x��`�Y1��[9�>�	�:��蹕��J<2���s��J��nW�8_�)�0�6��)Uܐ�]2N"�lk�����v�!��/�ppug	�#>�mO���A��ap|���S�b�>(���GZ��wȻ���A#�/���Ǽ�X �>\i
_
����`������6�����'��|py����
�}����cv�{7F�'�o���l���
�qb6FZ�$1�PDŽ�i�!��G����9>�+��!��tp�R��%��׵	
Z�a�zrr�q����0r}#�"橵]�'��)#ϖ���I����$�M+��$ђ$ɳ#rL
�V�5n6�<�D���>z��b����Kb����V��D��ۂ�9��ޮs��=*��B3�g2��&���H�(�/([c��u�ܟ�
�*2���Xw�Ҕ�;.Ҹd�,f��U��[�d��ai��|."&qU'e�T�n�X�����bP�^����)�:$ڛ%�X�	�d�E�1*P�=K�)��I�"A�4�ht���V~4���\7��0�u�C�!� ���xUi�ht/(�Sn��u�����X��Nw����,qwJy�K�BbԤ��]�臥��<Ss�*Y��4b!�f�͸ԯ�H'0�Z�R*�oÅ�%CBF��T/�j��!x=
=T<�*Z�
V�g���D,O�4��t-�5W��5�^�Jx�V�/Sз�6�h��:U��@��_��̜�/˥!�{�X� M��׋��jb
󃮗zn@�$��"�|2]U@��{s�Qi#A+f�Ç�f�J���Ϗ�Xp�c+\/���x�v��U�6���>���x�gg�&�8I�v{�4t�Y#�VfTEz:�?aɨ��^�����^a��}ϛ�W?��k��.��M�2O���`�d����S#��&���h[6��K��-�+����cwү�w�I�)Vc�h}����~w�^�Д��ws��
�p-�0�@��/GO�_ �%��
��e�	xQ&�X$,��eRq4)�7ta$��2��1��z݅�	���S~gf;ˍ�iOI5�x���-�r�#
����k��<�'�;�H¹�&�夒Sa��=�:8�
��̹�l3�bY��4������Q1�`�;[P�%s���)3�U�i�r�I�D���v��Ḁ~��
-n��0,d��DEЊ8}�5\���P�G�^YPw���մk,��]h|��q���}ಫ���^���62�.��3���Z�뛾���~\@�e�d�9Q[���¶R�
PK;��Wb)�� setuptools/_path.py�S���0��=,H�A��J3����Z�����h �qЖ~}�(U�j����g�٘a$�83��3g���<{��5d��~�	���{w�
����fYv����>��'7�����m��^^�vh=lp���a�‰\AX=�䗤���� b$2�+J��%zH25]��܄�R%K��b|}���w˱��4D�V��u��;kA�3=B����H#��<8�6IS��R*
>��bap�ьg(,AK��a��H�gD����L���+=�U� WU8$B����J����ЍЪ��z!~!,�w���S���u-��Yq�
�8K8w�w�ȷ�0���a�(�Y���
[�*Aܽ��~F��Fbd��
>�L�z�2M���]�bGQB�C�D74yh�˳��W��z�+�Ӆ?T���"3�>o�P���wf�u��i�z�P�1��e,�2�	PK;��Wa�1��`setuptools/_reqs.py�S�n�0��+�b�> @�;�4��E`+6���%�����Gɉ�:_d�"��#5�a�l�3��E045��(��'������Q{�5|�H��訆���O�??�v���d��8����h�r��ϊT�ddT�tθo�zս�����'M8��퇫O�f�6e�l�J4���S�ʡ��)D�����N�lb�t����c�U�ʪ\�*�	���qgG��F�y�=A�#�)Q$�B���*�{�)'+�}�����U�Y���B�p��G��Z!:��$���0sh�	V/�|�
\����2���FEQ��F���>Wʔ�� x�����&���S�ـq
��:���w!�9�Y���g�D#t���C�-ټ*��i�t�Fm��]�ʗ9ԓ��z�}J�4F3N��*�˲��TH�ރY*)�V�g?�ݮf���aǺ�m�K��e_�۩=�7����Զ������ ���)�mZ�S�W�~yom����3���ci�PK;��Wk�n��setuptools/archive_util.py�Y[�۸~��`=,�*l�0�,P��"@�(v hشD���D�������CR"%'�$]���|<w2�����RV+�ăռ���c�j[�1�ˣ� p��֬���J��Җ=ʾ��?-��Oe�7s@I��+#zn�a�T���<�j�ZVIc��Bk�
�t��/py刋�
$�3��JjQZ�ϫ�nǛf�c���g=t=/�w�X�<Y�'������J�|h�֬�a�u:�]'E��*���nWiЩ�L��߭V���ư��,����IY������6�����:{��m�Y
?3��Ye�$��z"�ku��1׎��`�`�+����{�
;�D!����S�gH��V�!������M�Vg�۟U'&ЯI6��{f�G��9��K#�~�4�~�"Y���=��qV����Þ�nhEg�
5�R0
l�#!�u��;#�\o��sͭ��9�]���rgcEK"��(�`Ғ���D���
��K���
���>1U�	Uv:���Z~FyHj�X��Rc�Sv[2�h�^h�=���˞D�#����#+9"�P0����J��͙�	Ȕ29b;	8?bT��!I0��l0HRGr���>�11!kf��o��rgF�Y�������At�Y��I�Q@O&4���oL�1d�Vv���y03Y�"ӡ���$�Y��%�T�<�@D���lhIޞ�9tPa(�j��D�$�R�'P��#�-�h�LJU劇#k�����+�gNh��jP_�쬆����lr�C����[U
��P�,��:����cBaD�Ik���~��`�L�}S�� �L��-G{)]	]�E�T:DH�1�j@��>O?�c?��nGV�P��^h-�t���b�*���b�Zn�ȸм�?��Ԣ�$8o�3�f�X8�6�c}���1�	�;���Bs��@��T�k^R2SssP�����'5jC�%L�-	 �me
,P�4@6�q��>3t�LI5 �A�e�hJ�Ğ[7��6F�R7G�iԪ0x�7����޷(�ݤ���_�a>�|��^�.�ʷ�@f���h�:Їd����T
��@xK	��2�,�2��=E���R���>Jm��-)H�6o�K����f�r3yQ�����#"��ic�$?}�����SH��$�
I�q���Z�o��3��㑶�=��_���aaϕh�}á�B�v��M2�q24��-ą����hF��@1�<����F���?��)х��qR�K��S����纎���������~���¸���n�?*���J�-M�zUo��%��*[�pMq���9;t�X�ѳ�тW �+�@��g��;��CbBŁ��W���Ev9ȮVX�"c��-/���ܐӸUi�q�
F$���Q��j+|�=0���(�t"ڑ��Av���
/([�����>�Ȗ�>2*L���ʚ8�����y^l]Q���OT�E
']5�3幚5��l�]�GW�/�����F_�x?e!�bpz�9ۜ��z�y���攡�I��ɇ�0�B��
�FYF[�����9�J����#L�#��X�ͪ� p�޹Ck4��_Z���j�/�r������C"����B�'�"�!���
R��❗$fqxF�P���>�dY�s�9�FA���z;g�J�ȼ�e�V����
���f�˰��L��������/ْgfZwn������uB���T_��/�#�'��Tq�m��J"�au��_J�==�e����Nn���f�v�=�l�x�b���t�����ax7}(p�?n���A�#�p_�<t	�Nc��G@7�?����(�
�nx{�8�r�ܐ���az�-�F�)"�Llo&5����j��HB?��m�{�Z~��
?��lw�~�%m.�X�/���V�}BYt�iz�~�O=S-��+���;���Ug�T��7�L]�iD�1��ۛ�?�KŞ�h*o�|�L�+���t_i��{�?��?�A�����_�4��_\Q��*?I������آ��:��0=����X/܄FY[W;}�N�+�,��=;v=�M�4.���g�E9�bo޼a����j�A����G�`���Bq�r}�ƶ����?���u��E%>����j�bc���o��_B�n�M��{^>{A�g��PK;��W�|,"�Hsetuptools/build_meta.py�<m{�6��+��QY��s����ܻ�x��M�<�s�>^?E��TЎ������INӮ����`0�W`� ����ٟO���B�*KR�T�$W�V�e.G���e-�ݔݭy�VK^���oi��$Œ��e�œ��di��L(	����2��
Η|�#l��^V�Cͥbe捉�~��J%�L�(�)��j�?&�mΧl�^%J+�̅F#
�`��	����JN�Zsf�awe�/G�W�v�j�"+�cӼX�1���� t��#�a�g� ����2^��l�պ\j5���;����#�&��H����B GC�*�*\��l�'r61v��\i�ꊆ֝�jG��M��07�L��<���f[V�GH�)�uΑ�������S�l+YXR"�5 ����)Lh[�J��v����r���6�D�ȁa��J䚭�j9�ɿE�.��Ѭ��A>/qP�zX�׉b<I��-K�-�����Ք�9�Ȧ���<� ��C��׀�b��	�Qf�
Z��4�'�/��B�B�&�l36_�"_j��1zb�)���|	�F��וn]$�Ɇk4+�b#�2���6ޕ�9�����l��k�M*��&�D%�0�kp��6�|�O��L�">>�ѓ���e��(�uـ�5+����$���x`�\K4
�`4Z-Di���~��t;׮�����V"�O)��G�����-�y�K�̀��o�3��5<�j�Ecaڟ�TM٥BY�t�fM٫-N4ɧ�]_�t<�oZ��H�5�xyU��m���F‚Q�}	+!�K�%�c��f"����y�x�A�R��?j ���_7��T��~��(�Qcvή��	�xz��������>#�Ph�1ht�5�s�J�]�b��/^��ۛ����ջ�W�^�x_�|���E���'W��\�~�2�yq��)�I��M������_�<�{|��
�K��YB4��E����0��b��(�)��D§`:.>��L+NT��1jy���ٔ�-OE&x%
��Vy5o����\�/j�z��7�_z�g\�k�p��<H�m�)�9��&l�O�u��\�*���K��?4%��g�"��d��hx��ܧ-���F��{nt��!}�U&B\s��U�x_�4E�#��X��Ӳ������Tծ�'~v��ˆRQ`4�9��i:�jdsQ�֭��Zh�3��h!x�p
�D}��/z�v?���
t�&��g����u|���o����҆�6�Ԧ}v+���q�	���F�E�ݸr��^·~��B�1�� ̐5��*�CX��n"ˌ�'�Z���H�10T�d�X&,Q��g�%ġ��\42ѓ�{�aD����ـ�Lh|���:,D���d��K�n(������*�lTv�b:2�a#:�HHl�O?���@S�vQ�X�0�Q]c�SXU4~.��2�hh۠���<gaF4e�\g"*�`�%�T�>�C�c:�vz���K򚓹kzh�ؼ	[�:~Y��6	d/+�b��]�j1���i��m&�MT;��/&o�t'��7�=��T��L+�U��`X+2�.���!@�<`o���C��;�s�R��C�QFoɽ\�
��-O5�8�?��T`܈���Z�xw��8���?�6��-��A=d��(�x�Ą����Qd��D�1��@��;��X`����K��m��N�ȗ�IG�!�|V�X��UÞ��C�k�)d�㷛)ِ���'��VM)m�`�\��ٙf�VlQ3��l���3i�~�w�(ẃ��gc�g�f3O�hF����bp�(���$Yw�0a5��+�U��4x��hQ��n�<�NOO��-��3C���i��s�QB)�T
Z�B4z_m��2HrY"&�w���E��"���6/x�:�%p��U���bgD�C�>��\�?iTZ-���5��\����\/Hld>�};&� &�4adG~�* 2�T���{1.ИI�˛�Z��i� ���@��f�x���r��	"��u�D��%�}`��������k|��oOGM�.M���pg�Ԣ3��._&l�]�;��_���W�VbW(%Y9� Ev�Јx�D��}��0^ۻR�$������ޚi.Z�Kr}s�.�>i�q�m|��YY�}D��k��޿�ߖ:��c��V�oe(�0V�	n�}���[�v@1A�&�-�q���d.T��(���x�,�MQ�&���೯.4���&�����s@S^M!?�ud�&}QJ0r8���R��Ꮜ�4�r�F��nE���Σ��/_���!��|>��/�
��r&��	dYq �ƀL��dw����r�
�^�.�n��˔��f�/W�ݭ��w�����B�)0\�X��R<���>������vo�٬�4޻�7��jN+݂W�i�ee2�'
&�}��`
S��+�2Cn��S@_qBE�O�O�eA���B��1O�M��N�s~�s�,!����!3�ZL�K:i���܇�!�v��6�!��n��H��a��V�=���]���4�އ���+���|"�|�9d�;K=��bLpx2�{��+<B��!�N�h��M���*Y͖�a�/t�-�E6�8k�Ə�L��@Y��,2"�/��:˘��
;�w�8��(
�3�#��wnC�"�p<��|}���`Z�x�0=�rۻ�]w���0�U�k��|!�^��a�]_��Y\'9�%=�lm_4>F�WK�!��A�a�6�P%4���vC6B���C1���1�[���c�(ϊ\?�)kѧo&7�ݰg
���p#X�2۔K~��F�~�´��UZ�"�P��D|M;$�+$y�s���7r���|IA�m�Б���Aq!,ZR�kK:�j!T�T��C<�I<G�$�?B��g�z�ōJ+")k�I;�*#B��8����m��V,[�
:� >�|�ĵ��5"��0 p�½��p~x��KW5����KI��]T{��AF��w$��)��.�S��S}���Ӂ�;�ԫi�B�?����֝���C����f�y�'�e��y�;�Ыio��;���F�,/�G��6���@D��r`*��h1왵�����?�n�h�n\C�9t�v��ݾ��uh���ۼ�z?��Ų��頋\�q�kդ��YY!H�%��n ��D�%(
kQ�6�}��{���볦X��G���o���V�aǛDq<n�C�6p�bǙ ۳6�S�`
y�#h���?��|)�^�����!������pҗ��T|s�Q���Oǣ���h��H��S}����	' ��Hu}��!���s��&���������y��H�9<{q��@[�'Q0�cz��D*�-��!�t�O&�e���4Z�>&��%XG"�
� SI�b��NP[M�?D��<���<X+��g�-��p:��QR)��\>z|����ɣr�3��n�1`�6yg</�=T~4l7���u
@c�;���=��r���4QZ�/��'�.0奌�YC�KH�s� �,��V+Dl��p�f#&/	O�V)U�P��2z���H[�(��nYB���Ӝ����<ow�B\SbQ���B�7�D�*��e�m��`.V�m�?�N"��Q>������	\�,F��Y���rWZ�jh�:^S�DF��S�i1L�v��]=pA�+���t\�XB7
�����+��~*Bm�p�A_(�X��L+#,���)�M��]��`~�m��i<���*-h���
�j7����y6�&����/�#j9�!<B�T��9OY�P�J`j�I���	+��R�E�|�@.��1
����n$&�Y���� +>����Xׇ����ً$ו"��3B�v�o�O"�M&u����n{�� 7(k������Q��{η3��8V��#�m>+[�t���~�0� r�M����9����Ja%7v�ʆ������IЕ��ʵ����t;D�]���y��B���\(j�nK;*RƽBL
���4ն7.ߟ_U�wN�1Ǫ��0�a�U��wIQ�z��܉�m�|d"w���=|��H_ъH�֑�}���ʧ_��N��C�ٌ$����;o"�7��/S8b�^�ÏY�����I�d%]&h�J�����ɫo4�q>@�JO�ʋ�D�'H����+�Ǩם:S��3� �v�� {ܜ�������s�Q�1_4�����v�@�C�5��\��#/H���u6k�:6����nmob��.?z�d_��O��]�C�ޗ)����$�s!�ä$>�~Q����C�%Z�2>N�h`>��5�o8����<�8ŷ��f�v㾏cHP��Q��V�K��'D�Z�0x��F/��u�������Q� 4Ƥ8�A2�̋f3�й��A*��7'l]���޾��8r�ȃ��e���N���f6���-�O?�D������!q^��ށl��������n;�n�ۗ�c���O��;Ǝ�';�7T�e��E�n{�t�$m��C]f�[���g����6���aC;F�`G��k��๯KN�ԝ���K�=�bH�(�#6������c��輠�x�X�{���2zVn ����-�;
�� �_�0�����]��sB�^0Jn�:)��_��Q�j�ߤ-
H�g3��G�R_��-��G�RQW�Z_��ЛE%�+��/0�)��la�d��߆��r�n:����4W�(�䷼P5�s���#v����%F���3l�E��}+Q������q�(l�H�C��~������\}�V�gx�a�u9:�H⚛~��7zܘU��>�q�qBU�T��Q�^��+�^�O��n�jxjكGF�K
�d�?5T��B}a���!<�z][9��r��d!����n�i��z��M�
��'7��m���"6���`��'�W[ �.�ʴl����tE��@��
5�
)��%�ο�/�*�cm�d�&�/����
޴|�~\C��v��]Di�w��A?	����|ź�L֋mU�IV���
��^�Ib�65U�~�*f�Q&z��Ueŝ�q���c�����X�N)�� ���O��O^ Y[4�RuС�0'eĒ$�_�pB7B�{�]e�>��Ң/�wA<qq�.��Km+�A^O2��>y�����q'�Wn
vȹS�`���-��Hnt�Q���������h�IJ)��Z��w+1�G�tO�������B���-	j�7��PK;��WD(��T�setuptools/dep_util.py�R�j�0��+���e�ih9�{!�JQk�lIhi��W^�B)�af�{��2���ra�w�� Z���*.*�<�zę)d=��vJ5�	���9������c���s��X�o�tH�@Hx_J<���Q^/]̈́9�c�c�vfX�c�G���e��Wa)��ų҂��]� ,Lh�)��*/ˎj���e�i2�z��t�\$_d���;��9L$P��T��Z�"Ro���䜶[Bj�N����%�K3r �7
Ye���{�<�����X%p�@��^�70�}C�ޤY���8w$�I�]3���r�A���n�d��°!PF�x�|i	[�PK;��W��k��setuptools/depends.py�X_o�6���Rt�G�ކ��viQ�m����@KT�E"5�J�}�ݑ'���v�D"��wGɮ��1��+;n�5o��J+'�]+w�J-�j�j��X�h�������r#U]v�Z�a�~/�_�y��/������o��_/���8MU��WR]��X��(��
:�%o۲d[�)�
҈lò�T|���J0�:�.�1�W.�}�U˭e$�l��wrr�F\��	�4�
��A7�
��߶���9����@C�\y�hXYJ%]Y�~V�͆)ށoP��N�%�a�ۮu'z~%�h�]�.�o���F��;����&�]&-C�U}|�*�<Ed�qo��E/3��%��hk=�ᓕ��s��$[������V3�eYKrY}͝�[]����xf-�@�b��R���z�W��p�Q���4O�SPZ��y��������6c��W��,����-}�o�#���W�e��1;4���P�ݳ�?u���Sj ��L���uF���I{D�L>�ɾٲ�A�(}�Nf��鉰����M��� �&��][*=��C붓s��nt(SC���f�
QO坡4�l�-#�I��T�,�gXA�X0�����A՛)I���v�#�5F���5�tU�:)F�[f{Q�F���[��U\��;�H車碌փ���A�'�>��X!��0�*m<�Kb���3�/eS�����
T+�ϰ�-�:��-��P��]��W�ʙ�1�a6m�DX��*��>��#ND�cy^fQ�ڊ���bO�̶�}%z�^�8��ͱpb�9mނ��un��?S�Lƥ��M!���Bl���U̜�@rm��b���&o��"�;Jע��ڣ2$�A�Q�.@�W*��Ԙ�^�`���/�jƎ������"}0
/��E/�=(Av��
��~��z�?lj��ǎ+h�f��z����h���%��١z$#P�Zz2� Z��K�0����6�����xH�2�\�n>B�G��0m|	�YS��L;6I���%�aJI���p"
%5�Qx�%���NZg�ћ��x9�ȹ�5s'���jB�	XghI����G�{?�
xj
	*U� t=�q��2|�2��a6�����M��n���X
�����x���=H����aI�H+���Y�j�kb��v~^�P�-��K�/d�b�-��v��-�jIp��-
�t�K�:Y���+Qe�H{�
���p�ۍ�~�`7V�o���_���'1���e؂f���	�+�%x�P�(*�/������A�����"�Smc��l4O��8՜�*g(���jG�H���!}��� ǻ=d���
�A��j���`����M��|��:���#J������Hwty�p��S�����a>9�j����Vp�x�NOx>a�V	B^���ҍ�C����
�=����ۧo�3�ƴ��ų��a��Q@�Qע����t#Z�(T�3��=-��:-͜c_�Qӳ{��!^q
g��4GG�����z
^ہ����a�CQ��Z�|v���yP��$�x�J\���g���%R�f ~}��@ӷ�?�I�:~�	�)�D4�E�5�3D|�"���{��=�O�E�f�����6��FX��&�bf�n���@��9��c���>y��x�Jׂ�֋�?�`|�7_e�hR���yD)��wp7Œ!�F��imX
HR��r��]�gN}ַ��dn��?~��՘�;w=�ox"Ի0�a�
��P0���X+�Pg��O)���ؽ��O�&[��DB�������0�*�u�I4b���O�S
zh��Kœ�3���OHs��s��9nb�9
��PK;��WgTOu��Rsetuptools/discovery.py�\[s�F�~篘�(g/�Rv���q�q\�R>[*-	�C
`1�d��U�G��%�/s@Y�&�J,����2=���鮫�YW�bU�����^�k�f��ԕ�֫])�Ȫ�h��6��x]����r�
hST����޵�r���:��y]�����ʝT�d�:���ڦV@F�n
�ǚ��u]��}QmDUo%�u�V
h�Sr5�LNE�������f"�[�w5��ʦ�JV���T���	��C����`bD'�r%�T<�%��ﮂ'�5�M����* U���XɕY!���7��k�4i��
��>�6����������������U�{��MعR��Y�>��Q�x�on7�EHp>�A��<m�Zl��9�n��*���V��vh
��o��N�j���pc�=�~�����
���d��ns��2(�2�o����k�[ć�����)��R�r?Z�C��-�ʪ�-�N/�9X������J~�er�DQ4�ۦna3;�vu]*�V�u[oź�-ӏ��<S��o�zi^�g~�d�MY�o�+��
j�~{��|~���o_��۔=+�?�Ʋ%`��+��^�.�����T��o������Ibg=G4((�D2E�m�����L����O&̺mk�/�M�M���� 	@���ZL&s\q�<\Ma�S|����ד�]���f���z2�o@����۔����w�D0�u��3�6�d�k����z“�d%�b�Xͫl+cd&��D�~-�@������F诨���J�AV!p �h�,�%+Z�.�O� Ov�$-l؈u!��kFF)1Q�0W�����D	�A{�M��"oe�!0�YY�1k�EY"c]����ʽ(�D	u���6�q4���2C��d[(-��rAh�4��J��81MgV:�Y����ܼ�m]���^�ʽ�͋ħ�s��aǷL4�oe�j{�c�)2����!'��>gPl2$��žݿ�c�_����u�wU�*\t{b�Q�L�
�&:�.��W����\������<+Y��װ� E�+�_<����'ZRӿc[	ི˂�v�y�����Ԋd��c�N�'7dfьt�s���2���x���#��K��?荷�c�n8��M�K
j����V��ue鑣G��
\Jp���u
���0�T��KC?A�ɑys��o
0+F��ZP�Uj{�섺�w�^,D2r�V��c��He*~��թ�L��ɭ�Sz
�@	D�
G[7m�HQ֠e�W�=��?��4���;�}	4��f��$`�q@��q���5>)ww�~�>).=�ٰ�8^�u
di"z �a�[�m]S�cK,FG
���B�f&����=4-��ۚ5P:VB52G�^MG�lVZ�̢/|HY��|X�>E��묱
F⊠�e�8���k;���W�I_oA�'P���#}D
t0�?�i��J�:|G�=g!ՎIw̏6��	��L���~z�zM���t��) ��7u0�ǚ:L�O����Y��C��^����m[��r�a	g�k;��Y��$���H_^���pa�#��99Q�TD'�y��!���y��_03e���~I0A���_��
[Y�i�Z�	a��BR+w�*M3��f���¡�����[O��:oPխ:���s���H\�͞�t����J=TBn��ۤAgt���9���]��3x{u=	���-�lh��������X��*�sO}Z9��H�-9-����9�d�3��\Ɔ�����d2�}$���gj�V�<w��v#3Hm�A���u}�戢s�۟�~����j'GYf[O�&3}��<Ƣ~i��l!�Zx�����k0����ִ��bV�9��PJ�\�jR�x���s}У|<�pQ=k�K������J�hG
y��@�D�4��l�o1t;(GbU�W��
c��@- ��z��U:�N*
�x�1�C�B'2�c�LyQ�T���
A��a���C!a����a���
,T���K#'."}���2�N�7-z�����g�g��j����C�����@���y//QM�~��	H��	��Z%{������!�
u3P�ݳG'�sQ�C�֞���
b�Ń���� �b�v̿Fh\�=T�=�v�"��f�C~`��(�^���H����eP�Eh1�Jy�`>�+L!�cs�Q�ΎPC�=!�6��g��e�b�nR��S0z(�N�^��W4POՆ����D�E��hYT�ו\Y���{_U�����mV5���J����l���MVmdYo���T]�{�k���oeM%l�<
�q�:xD��`��(�߃
AK��;�˂U,B������_[�PA���v$N�G\f�V���H@�3�WLp��{S���;�]�ń�:[���K����*s��;����}.��õ�a�\�l��6X�M��!.{4��e^�1?�/����o��JV�:��i�;t�m�r{�ίO�P�z�/�W���e��S�jП��FD�%I���A*��I�q���_h3c29�q�e؏ɧvK��[`�F��O�����n�brD����^�h�
<"��g��n�T�M�!e�QObb�G{���� Of�c���
�í��SG�L��z�D�GBO#Ɣ���{�Y`��0l!���g�8x��_�U�W�5�N���n*p��
���3qqv��bi�+�* ���O`$��WB� �n�”<��S�nNK�#J����s
�9A] E���ϣz��
dN�.��)��5
�P�ܕ�Z|!��4b��?U�U����JvAu�L���g��)���$�K/�xҝ�����J��=���%c:��r
C�L����³���LbE��&<��=����#��`�m)��ڄ
茊�Eqq�%��C�C��mѠ>7�e�9�5b=	��fx�R<}�]Q��-�+��ÿcB�:��z�ح�`����e�_��v�;u�=���Ї��›
.+��bA9�cK1��	���cJ�%H�=���[����4�)�
6�?[�Ӿw��X��A�=_o�$���ʠ��� 4�d|FI/~�d1��G�:��K��:��3�|B��>�e.�t_x��-.(����-��R��%�9σ���/x�$�n�D��P�q�l���
f�@�
J��g��`A�B�9QX�;XpN̩n
ָ�<!;��\�U�Ԑ�]��Byh�m��cq��g� �n�'2�D3�X5g>�գq�(���s��)��-O�Pw�Q��OC��B&����]K-��΂��i��8�nd�GHT�%U��)ep(�tM�A��ʎ5�.t�ƵU���5�!� %]�����hC�yc+���
~Yc1VH�����1��ƫV�t\��#W���ƪ	:��x�pW��-��ˀ�A��,�ry@1���qz���%q`�`���O�j�q���0���m(`
�fjDh'=0Ǭ�+��9'E0�y��$�N�1�7%���z��)��3f
rϰ���EW����Ty��Q�4�q],���0�x"�
Uo�(m�8��?�.`ɦ(���X�4|h7��ĖRH�@����	I>�e���`����������P��i�W��Y׵nJS��,\E�
�>h�S����eZϩ�WT�m�O]�d>Ǐ��(%���v|���2.�#;���=�)�txVVS�	q�FH��)� a��}s��?e�IWr�ۄR����lr�<����lQ�p�($3�i����Y��eV��W2*̶9��-��Wjlj��>�:;:�m�ƒ_������q��p�1��O�3T�4H�6�dw�dR�wE�p}���4�:��q��b��8_W����Z�G'm�&��)aF¾#��h�z��b{�]��_fa��g�<�����<��yqZ(��haVO�-�`^`NO���o��rA���e�s����T^R��)�)��k�^���T�Y�9�8�" �@2�4F���O��CZ�)ž=Q���C9�F�=!Z`�>���t�J_�h`�qW��
t�*��1b�ξd�j�A*T��v�,�w��J��}��^�.��=��]u�Ǘ�YKMXOe3�+�!�W�
S1�BC�Y�q��P��Ā�Z��4���Qh�$�C�;!�H��'��n������'������a���K���0����.+uh���Uk��T��f���sN�l����9t���Ѱ/@�5��9��"OI�X�����Tܲ�x��wT��cK�Y��
�� y~��f:��τZl��@��|���\ј9�Pb9#j�
.�`VT��%V���1�85^������
<���$�����R�wt���z-�4%_��a�I�>u}����82Z�o�A5�hD�F�<�b|�6�$iǼ�������ZO�y�Ytu3����ۂ�����!`<9�5u_N��A�T�s�s{Y4�<O񨌉7W�5=��A�����p����up�Q+4FK:�Vc��e{ĘS�F3w�5��,��E1��b�>_�'������й�w�Jp�Vu>�t����]�#�	;]��ت
l���;{����Qx[F�z��3��iH��%�ܚyמ�w�}F)�$s���^�k��xS��Bӑl���O߮�3�N���?��H��^�0�����)�ֱ0��4��AϘ�⛹S2N�1��޶>>���y��W�kD�S_k4)�j�qq���<ڭ挅�O[�q�W)ٚL��_��w�c�c�'?(bS#4�+�3�d��L�L�ΛP5(��g;�� ��'X���o��-���F�b���S� �;<I���|�wO*�5b���V��D���;��ĪG:2wrL�@��>of}�Fۃ�v�e�,e�~ns��>_�����@��6b�Bf���o_��u/y��R�t�)}��J���{1��hF���~�mc��5U��c�']�u�H���zs��gD�����~��
���身N��]Q"տ�A�a�����T;�=��|��e���&Z&����XK�ѳE�F�q~�7n�`��������ƪ�!��w��Ǟ�y�g���N*{;�#�ߏ��I�3��Zw2�F����Ȟ��ź�K8��Z�9���J��G�TpC�6%��M�b��.��Ki��<N��{#���Q��C^a��H����#&}��|8R}	ы��u����ЛR��qC�F��C�{E�R�
���Q+���,$`
��14�uz~�=�������WQ�	�,]>ѿ�2��It͓�:Ύ�Ij����J�Je�Ə��	gU��%�-������d-�C��F~��U2U�a���t��Lm��� H�[k1Fϭ�+n��x3��M���t}����.��/L[�H+b����SQ��O�Q�cۅb�J�����)���g�lf�?���"y���NT�.�u�e�;Яí������z>�����i�nt�o+>^�{�Wl�&>T1�Xb�,�+���c]�89d�-��ո%� �r� �aY�t�K,��ۓ��l��D�8���Lc+ҕ�W��B<��)-��\J���,��~��|�Ua�q�PBJ6���92=���.t�~+@�vCW���n�qVI�.n�7���j�h	a�}��
swN_�1{b6���-"V��{���_,��=�9b9�������M�(0��[t�j�����C�6��Z�_�`�ʪ���1�����K�/7|7-<��պ���[`���;֑���&��SXe�Q4N�Pgl����^oCǿLׁ�3��8=��m�g@��3��V~��W��Q|�)�
X!��Z25z��ϳQ�Q�[<و����T|9�O<};�0�a�]t���V�n䁛NE��7����6mA<�v5+����k���
Yp�v�����,!S�z94�>��2tP?a*f`��H����\��dt
�Kk���E���Ahw�V���x����IJ?�t�&�3�:��8��)�NB�r�q�PK;��WP�Z�'U�setuptools/dist.py�}kw�F��w��}r&$�H���Uv}��������ܣс!�)"J��x�֣�hJ��ݻ~�)������������E]�8g�˪��b;Tm��T�M�
�jͷAvC�ֽ��ٮ/dg�lͷN�o��?Xv�Z,�f�7C]]�h��t�W�/��<���yS+��;���M�\������
"_�3q"3�����>[��ȏ�z]4�v�W�6��n/-�����^���_~[Ȯk��4ѿ�,^�Ù�f��Џ!�e�,v���͠�
]��u1ȼn�Kxv��B�����*�u�]����Yt�zStC��Ķ������&���{�]);Y�4X��pq���b񡸄���E�AZ�7WE]�?ѯ3�����o�ZV��'��z8���W�S�F���f�v������5m����Y �‡��G�A�(z��H4�?
!�s�\�b�v��J9�˥\�sn�H�ZEY�jb����D���Llv���
 
�Vm�;-�~�����/�Ϫٺm>H��.�6 ���,U��k���:,� H��M�#��n��^J�z�7�����V�B�^�v�����ࠔK�,>�y�LK��b`}a��rzx ���_�#7L�&{�k��.�G��L4�Z�i�zٵ�
}� E�KT{��q�����f!A����F*��+BTߟ�Y��G��]ZT���eL�S�?��;������RC$������'(ۨ&�K���n:_��%�9�vRQ���s�ɿ�Γ�d�Z�İ*~$�^zp�
�Ƌ�H\�;bO�/�	\oK	G�IFsY��
	ч�VA�~])S��iM3�A��=X�Z�A�{�.�E'��Fc$I�p0_q��#xDSu���t�`�k��Cy��*�W��H+k�h��<t�u:�_Ԑ�����%Y�$�E٪�s2H`as�B��G�R�&�Nd��j0�`Y�E���Ʒb2"�
.
��5��[1�`j}3�ũ�(ͳ�l�i�%S��G�n��"U�
?��C�=B��=����g�R.j�N;Za�cf8@,����e+Vl`Ѭ��I[X��Mf��0��F{(x�F��u5�t�rfa��A����,���;�S'75�sje�#e��a�Z���#6 ��^��?{2
a�����?�tr	�Z���kP�}��#��܀�k�}�?�o_�=ėU#E	&쒰H�ʺ؉�ND[���I�Q������̇�@1Hev��~�����FW�fU?�+	���FK5N�n����ja@�-�N���B����?�Ϟ<{6���R@T�A[�x
�����v����
��@b�*�OPԤx����Z䦞zd���[�M�����b�nM�+Io�$]h����&͝�՘�Z��T�n��}�SJ�
��䠁�y�j{�H���D�Q�,q���o)
�t""	e�>֖{Ka�-����V�6�2U�D�]� ��ҹ쮀ҥV��u��N�^)�筌���~��XN�c!���k�C9���Ho	������`�飭{`����Q/S��ԧ�?	�Um���F�X��0����_gY�N:�
PtK?��<�м{]�=�BL�TK�H0�b;�,'�8P��_�(�F
D��-}(�vƾ\GΜ�1d�x������^B(�3A�mkK��G$Wu	V5�V�
�[B�j���A��
�����kl����g�ú�ӑ�kQ�{�={,,.���Ȉ�j�@��
u�0���FѦ�_�炑+��p�mت��44kd�6��@GxW�bJ���4Ж�j׸:���%�>:j��%�@ѿS��)��r��3\S������
7h�:�^�q�)����u�Df���"�a�=N4ypIH��q�.�7�!EY�W�R䡖��:����܂�t��kX��CF��AF�(Det��->����]��FV(�N&��C�熐4���}�v����)c�E�B��rQt���'.�N�G��PMz�*��)��fL���E3���
	���-�.�3�a�㏑�H�iw�ģ	�?�U�eɶ�p�kb(7�X'�5�~�.������3�w�M2�=��3�@;�އ.��`ȯm����9��c��g���
�0fpp�{��#?���'G��;/jX>�z� {�Pd��0��k���W������)I�)��2��%�7��C1!�ꔎ�+	d-ʲ'Gx٢�����kѪ�6�b`�\n���M���49d�Dh	n�F�	�;�	�k;�l��Q�R�r�]�;Џ-̴Wϒa���b'Xy@��}���<2$�ܡ�)ޮ!Z��-�p,(*A��@z���U}��R��-��WH/߉�C,�UQ�߇�۽;&��u8��R��o�QA����np�u���pX��"�b$˪)A�4`yx�8L�@K�@�v���y�F�W��W�����2�
�p�e�ŭ7�7&l�� �P���\� ���bL���i����f~��.E�E6 �
0	���:	)��TgĴ�2f[<����`�`�m�g�5�A�k<ϲf 졖�	BBG�0��'�xN?)���GO��&3o��J�jr>��`)+�A�$��,0,��UUJR8���(6�EUW�N,8>G�M8�[
�d9��A��K�,�I<�����7)�!�@������tb�HÈL�A�r�i�$��J�c��N���|e�7�AE�q��`����6���
�K�i�
 ��� <��ݤf2�T�O�UJ����G��AX�)M��	;�8��k]���W
k�l�j@����

�$��"�Ҁ*�eڐ	���7
��!��J��ĝۣ���k��f%*$�ՠ+��p��1���VjnŽi���
{��F+�fL;��sۦ��O&�D��Q�7��jI�
�3�U�^Hp�:4>��-I�
%��4�[���w
��L�B.tWX˗v��P4�M:�Ay̳N�Gl�8�kva�6�Q��nNc@�M������PQ0}��(U)���v�6���袬�@��*	�
���Z��q��@A9HB��m�?ZD�}F�1���ŀb6w�<����r8Tk�)�}l�K�;��`n�s���)Y�}K��㪃Ök	lR�Ƃ�6[�@���$����ݠX]�օ��`h����x�M�E[�.Q��\Qh���9r�q=�򠒕
��r�	���G�3}|:s��،����u?���+Ӗ4�5y|r����_N�_ޜ����۟O_��zu�����簫�Z�!/e��*��9q�a��P���,)Zn5n��|��=�������^A�
�4��LS�(u��r[����L�C�7N��:r���(�|��t�#z��$=��U��!G۹j�m��z�e�����l$(u�ID��H�7��)T$S�c��fP����7�߲r��+�����X�I�/�U=��=h���~�!W��Vw?
=\�rg��.ѧ�g�O���
���� K,닥��Q
�LN{�c�O���.���bej�ޱ��|�:�Ïc�ͅr'%��k����cy�A�K�ɢ�1�3M�$��z�,��h|��KM���t-Y��3
��Ր�.SrR��pU\I/�P@�b[�m�>�LC�gOh�o?��8��r���X��?w%�B�n�R����w,��w��k�A��m�M:ѿ�e�'�)��B�+7�Ie��&	��Q{v@��س���,荺DR��n/<�9}N����5d۫����ة��C*7�3�L=dN���H�z��3�a\2	�8�{�ڞXn!F��t��P\y�O���}"�~�*�����SY Jv0�����
���Ej�r��t36D�6��)��N�ڒ��AM8��{�Q�޲��v�~D�$2Y���H�(8)��G8ʡ�뫟O�߾Ɇ��}����������s��!4�kpE�lZ欠fK�f9t�4�3�5<n'�0�fuj�}8?�w��f6=!R��ńr
��wO�����R.�Ù�)=S? z��į�\�X�3��6�Kx���i5CJ:�]�t�h)}X���Wͫ��~�i?����Ш�𺧸U�>���33��sF���G9��M������䖕�K���/�HY�h`��
��1#w<.I
��b���X���sR�N�wU���Nŀ�!&+Ȓ�����:��¢�D��n&u8����'���
�%��4����"�KvA�b��"�_諅Ǖ�w��;9��?��#^ɍl1���pr$l6D��V$c�3��j4�}�s���H��z�0�)�9�EO���u;iC�R��׀t�q�������\M��1oTs��V�����ƭ��1�Lcx��oF�c�(V��A=��F�s��t|O{߲��$��x�Ь��}��}\��;�J�(,l��[P�Eo]����h%�٢��2����{��b������s�d��s�����:?��$e�{�'{-���Í��������w�P���LFD�-��\JY<{r>j��fc�"���9��,9����"�8�P!�[��Lp~�ɚNs�_�nh���):+ӂ��|���l@
�k���4w��N]%:��D����\���t�����:���q�)>��p��"#*����TdQ_��
,�=n�`���|�娴C2�)�Xf�zz��k�gx��s-��3�.�.U�#��t��p�"��?������`c<�}x���]��������_3���NݞӃ}��z��ݑ��ʪ��	� Z�Y��1��O��a��S#�A?L�Ϫ��l�t{�1��[�!t�!4�A$��|��eu��ύJ��R�����/�/^�9{qr�
�V�o�������>����o>�&���U��
ܕU�y����T��ILw�{��~��q�]����ws~�t�6
p�	@�σq�I(S*
�u�@�K<�+;�6+ړ�J��&�t�r�$b�$�� l���dJ2ԢF�'U�\� V�U|$^��ӫC���"U�s C���E�'27"}��Ԯ���ڃ�1�
s��ć���<���yYl}���l<��ɠN���)/�
�R&R{{~�h����n�����؄G��R~G����cJkכ���~;�弖��`�7WVWR�\7�t��C��k�]�>:��.
 ��5��cdK��9�K�9i�9�&�צ�.�q_���i���&|�vg:��<g�Ş�����7�;�,��1��~J-~F,��O�C�?�\{��U�ce(P�'�><*$񬊦i��gO�Xp1&H%JG�9v?�xn7�+����]�,P�͌|$鼪�$�
f�.Z�ɏ���kBy����و�}
�A#�V��$�~�
��Z��Q�C-R㌏ߐ�1��7�Z���%��Y���J{ᇽ�9�
+�\S�D?ێ��*���Q�4�(�
�U��c�'���:?x>^5[9F?WEm'})
�3f<k5s=i��ˢ_��N���^� ��Hj��!����@������œ�?��v��.̙�r`��B}���0E�F%K��.ѝr4�|h2��>֊���W	�4Em���0*#������M���5]�0ȉ+�,Fe|r=��R��Kp6��a(w��L�}X�驝ǃ�`oF�6�f�#�#�z�����b�ZNJ|�6������/ZܨERv���6	�c���W{�{��1��{��&�?�'co�e��gNA"���D[4.���'g���o|�*������8�-f�"����A2�S�]�P*H�L�S�d���;�L�R̷�w�+��Q�)�T��56H�1�
��z�t�����'�eJ�=�A�,�z���Z���+��{��m�����iy�6,��'h���&�<�\Qs�\�X�~���B��e���Jw�c�9?Ch��cWW2��^]��_C���Ʉc��vH6��$2[�^��<���XGS�%�[��=J�=y��L�q&��a:ng�1����^�ƺ	O�0�l��<GRDGJQ���7%N����
�t`�)�̫
�c�.���`H�A��Y�e+�&8hC[�q�q��zՓ_�%dU����׏fDG=�Ih�Z=E&H�S7fI��H�sn���[5�����d5.����#�^�	���C��~��XG��M�� f ��=Q�H��׋�f��k�£P���e�Vc�M�PI�x��ߋ�����UA�����E����n�&)8gR|�A}C'��+`>��~�u�Bw�2޸*�ŀ�dq���-񊬺��́3n�^���2�bv��y��l0�1�4����ʍuhC���8���.���`�/�B��p��]�1�׽�s�E��!4,7i%�k���u�	Ǹ{�?(2�R���x�x����^�_'$��H��@/�HY��z�i�lj�c�j�*��H��v��	�}~?��]���u?���<��W��C�n@,��볩�H7hX��a�zJV�?c�糱3�
ם�Q{XX�.��8��Ď�����5(ph��#~0~���&T&�uh�ȑN��:M{��T����|m��C
��w��Xq8��^�:��"�����3�ݔ���p�9��o���ӷ?���#�Tm$^ou��xD��S?����ۮ�:L�ׅp3�'�{�{�G�w�
��_|G,ypL�.�Єq�㛣�q��ٓ�)DO{S�T����|���bW�r��zʰ�}����Y�B!�K�<�Ѿ����v	�-j�?���F:�뜫l�|V� m������WEW��^��
�5�0_�-ʠ�l���R�&��+@wX.W�]F4���cy���w����2f��!h�Lj��2r�֣�L�z`�u��b9�{Z��KN��R���MV���Rs�I��x�gٷ�%2ω�����y�����y8�A(%�!B�zr��'5�9��M����xKA�E��K^�>,��ݽ�
��Vm��Rŝ"��h��~L���������3�B�=Y3��Kt�K��ݩ@.����{�$.�t��	e�T�d��c�z��	�g����@l1���'S�&?����]��^6��?r�@}W�Җ3=����-6z���BrQ��̌�V�rd]�8Ҵ� 7�=�K
�Tn���߰�
�B����x�	4�{�M�ʗ/,3P#/9Upl�j�gk

���A8���@�͠n)
"���eQ��U	*�_��/|���%��{�Z�ࣜ�G�	�o�O�8�/^����~��%*�~|������j��.�_�j�'�g��un�jik��-1�:��!@e��i���3_��B��F�.^\WM�^���qD+����0�I��گč����HM�S���&�3[U%ohwu���̇�e�"0�L��0��_=��+�%���4�T�x�I���-��+�E���
[�.Sc��n��ٴ�qR��]�ܲC(и�Ψ����-��~��������4쑒��D3h�`�Bc|ޝ�H:~�S�tܒ?sMl]��\��%�Ta�E��OGƇ�	{m$k����56#=~y�j�f��X��~�(i��~L|��F.���ҁ��pI���=daܑY�0�2��%5�Z^�3���0���3!1�=z���UD��Hps���oxiD+��Lt;�#+ڌ�"�-��v0�灟�Oj�C�z��f�ˈ�{)4��������"s��5y��_�&>{K]̆��o"wf16EqvR��-�G5�`ƣ‡VZ�B:D�L��媨����fr>MT�,���$�R�ZOb�'���,a���E�JJ���p���߼�v|�s�emS�e9�L.Rw�6��&��(���z[Oo��[�87��%�8�jD-_��;e�U��\qZ��`a#�\�5�UW#�f�5e�%�&���.=���P��"�.a�Jݡ5�-����J3s*$exK:\�e��N.�nr��s�qj7l
�CUϸ���M��3u=J�I�G�+`zؠ�ai�T���E���jAƳ�d簽� ��"�gG�]�D|���f�j9 QD�
��b�yvs�x�_`��+G�U�*]�E�
�6�
O�n�O�1�[�͔���fyC�`��-�v��
�v�G2Mw�WU��5��>�롇եy6n�`���`���,1��Çag�1�`�@�y�pl{;��|	S��.:|�� O��;u'S�&7t��.M�5�Ϻ��A�V�-�1eG�ɗ��[2`H��Qd9r��
a�$�/��t���H������Ϭ��tK�B���8�~�H`Q��(BV�]`��)�J����x�����ڥ��k^��c�(��/_����C���%�qo�Y�g
�����pP}6���s�ݢ���M�����Šɾ��"��aW��c+��7z�e�iBr���\}�T
�|�*��ܽ�m\�zkk|�/`���<����8�c�@����ob����¢GVWY��af�R�-�lw9h�Pc�d�}1/Mc��KSJ�Q�*R>�U/�Ս��n�8��<U^
7{Sm3��l�rdT��)Ol7�{�Y.�ۛ�����%R?���K����`�n_Q��?�W�V��+�?�W�S���]�/�+���}E��]��j9�d_�34_1�
sW�U��/`9����hk����Mՙ�K�/b2A,I��5�_�W��%a��c��W�K���t�Br-:����2������ּ������M����>�_c���F͎o�9�Yc{D����T�}�ʼnz���p��=$PM��?�;���=p[��5�Y���s2Ђ��@�$]���u��U-o��V���S*k�OU�(<#���1����:��Bw�n�<�+��7����o�T/7o��4k
D���]B�<bt��B3�g6�_
��f�;
���H��%8߄. Oܗ-LfL�q��띧�]#�'�(�K�"�(Dr��>�!�~?&�r7U�Ia?GhZ!X8�TU�R��2?��.[e^�nB/�Q7��9^�t�1(K�.����┰�9W�z��}EB]��Z�V��-��%���m%�d���_��j x��Nʾ�@�1S�b�ޔ��;Q~1%KY��!��<���vԧ��~�m���5�wP��1"�e<�z�������ΓHeN��ӓ=��ⷘ��(��ti��?�'�W�"�UN�l���Z��(�<q�n?Fr��Co���零w2��ߡv9:ߛ
?<=�|g+���Uˍ}�������Æ�sz��I-��P�7�<�r��2�e'6 Z1��h�DF�K��+���.�GZ�I�� k��Z����s��;�\����w���{� ;Z��y�X�~/n��cA���+4���ah
�,�e˕)`٫\%hLa��^��N�.�5�r�;;���<B�����@N���6��<L���E4�z
O��ٖm�f�D��m:��d��CG�8ä@���T��$����̴��
Z2Y��Z���O\�*x�e���yW����L��BNh�&<J��b�1���t�Vm�/���Q2�íX��' 3Q��)p��ۿ��Q��D�e�Z��<8bF���%|�O+�K'e❪���m����M(������[	3��Rw��t	�c�-��k(0_p��0��I�m�/��a�M��%��_�d#�
iq��u�N����²S��ҿw�FX*2�����-ﶍ��)k|��y��c���~��y1�����
�ºZ�;��1tSv*za�*Uo�$�l�ٳ/R6��R�X����n��2wR6��y_길@zW��"�bIo����J�S��컺2�s%
xǘ�3�f@��� E�����	PK;��WzO��m
setuptools/errors.py�VM��6��W�%)�.�=��%�-�@���k��S�@R���
%Y��l��y9��̛/�f�D�mr.-(��R�\Q��b��|�m�J�Oz4�u�ZGi�f��R�j]q�mf<r݄�u�M����G}��hN/��709荱�8�L:�H׼�Fb������~T��)�}�v� 8����-~�qk��_����&�ޙ�&P�v��]���Bv��L�1-���z�7n�ӕ����_�a������E��0T����ta����M���+S�51Xz��76�����N}���-�L�?~��ѿ��F2}0O1�~���f��˜혢�vwR�L�S��:�G0����7�-Oo.j��������A^ܴ-~m7�iQ6L��Du8�7#_#"E���"�
�#1+m|�c�yʺ�I�yV�N?�>sM_�/�=��H����'�_�bUP޳��W��a�Ҝ�e�5V�ju��ju���;u��������#;�k��v�#؍�����e�^��
CN�k�
K��	q:�S����K�����r�w!�u��A�s=���l	�g�O+򈛔�IZ
Eqm�jt�������MǑ�)~@��kW�drl#��1���f��) ;�n����돨5^;2U����Iw�f³��I)Њќ9���������K�m�h�G����|A��ۓD�W�E+�Y�7��.J\(�B�_J�����IKY�
��9��eF$����ֈM�(�f�m0J|�"AGP�(2x������,�
�'��y�I�N>:0��m��o�hZ|m8���YK����H;��k�¯�x�j6&�rE�
Mj��m_��B"�Ƿ(1����Bl����"r�w��Xtz����"Sh��’��܌��
#3ۅy�xI�'��ʆ�Om�*:���>��m@��]�8V
���d(^mJ��#�I��d#79��PK;��Wu=̕�setuptools/extension.py�Xmo���_A�
H��=��/P8v�H�s9���ݑ�z�ܒ\�*���}�l��V"�/��3�<RՍ�^X���k���S���Tη^U.+�0lh%k�}e4={�N=�l��EV�HG����n�/�TN&���"��'ʋ��=_\M>��4|�D��Z|�-	�7a�(�J6��N�DC9:+q-fqJ���pӪ����,�����w"8=�Xt����y��|<alTX��ٰطE�҂��蹠Ƌ�����d4�NV� <6V��j�*叓�gs����N&�mt�c~���*E��E�4̜���ª
9!�SzW��!jS�e�0��^9Q��N���BV�p�����`�Ђ(���P
���n����{�hP����k�[��~����h/ɪ'1_���	�R����x�4�n��hf�I<ɪ��J�	���d�,��`���/_n?>���?�|ww����z�H��`���0;k��X*�^Z
1ǚҡ3B��;�Y�#��(^\h�/.�I����`<�N�~R�蚴_�5��	��<}g8 ��y������
[�\��hLB7��M��v'�������^l[�;�zV,�hQ�%������Q���J(ʒ��C��fl#�^b�^|��PEK�\�l�~}Ks�o�.���S�yV!���a�9=���RXc�$���X񐀪�@W���;�V�(��!��+G��~.�F��#cgB<�S�#�L�Y���˥x�z�71��b��7p��\C�ڪޏsi�p�e�DV��ic�0;��Me2r�6��NM9�jP�9��)١�G��?��`l9<F��R����p�X�=fG�����ةؓD�&�	�����k^ &�/Kf�>"�}K	�#O�y�Wle��!�c3#שA�kşWa��c�^(O50�Gct�x��8�]�9��0�I0@�/bԙ�0�Ly��c˛��4)��a�ArH$���h+iӬ�(����8+����i��MA��h��E6�t�l{�T��j
Z
��wž�sS�B��EȬ�	��r��LՏ«^0�ZJ����C�&
�$��(��ʋȝd}~s�j�#��m
�ΒV�0���R�u�|��L��3�VYX.:)~ ��yR8��BQ�N�O+��x���J�����ʽ-���l��;� t&Y�
I1�]&���!�L�Un�N�KT��J���2�1	EV*;�M�ǹΒ/��� n*eN�����|qW��A�lPv��W�9c\��8>��N�)ds�o0wL�.}�#�p�M�=E�>–;h�?6�@Ձ:�,Ri�'��ٵ\��xb3MP��hVaڪ��
G
6�{Ta�_ e��	��A�̮c|a	'�Y�̍�N�~����	���l���삏}U+ht��]g�
�0c6{I��o��(�XoP{b3;	.T�"�/�~���kS�

�p ����	M���:���N6�"t�+�@���d��'\�JL�V(N.ϭ�,�oC�j��ƿBd+�U7�*wN9N#��.D:S狿�nI
����I�8��I�_�NLre]I�kQ _����R�(C�N����@�b
�}M���+|��!�#���p8k�T�w�S�6�D$�d�ԩew�K�V������C��9��:r�A�n"���̡�����=�vb�%����js�R�(��\6�sX��m%w���f,���W�����8]���xׄ֫bc�×ME����V*IJ�l�W��sJ�[��!��v�Ϡ�g����	T׸���E?³J�Y��sG�v)�M)Kq�������b���;}�뚨d58a`%�$�7>��T��V����݅�`?�哒"�)�
�����k�x��̧��xxY�ۆ�|��0�#�P{��s���46�&��
@����<��A�.\�F�B?N%.���27hx�sx��饤�K�\�z��#e
�h�m�Û��U���-�)�2giK���ԝ��=��+��᥁2>N0��[>��'ְfP�K�u��<0��0��~H�o���ǯ3v�GgX�9 ��!�ū/�F4�`^����{���2t-1��	���┡��A��l�a�s1<��#&�����s�Y�G�,��e�vx'�1ƞ�O�%+k ����PK;��W`E�Q�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֞��p�9+gX��,(@s9�J���̥�����4��-"]'�n̅nA��Q{J>���Y�<W��m-�M����;�kw�D/R�8��(�1+x�{��|p�9B��g��͞��,��N��iܾ����X'�}?�{��PK;��W>�T;}setuptools/installer.py�XmOI��_�"<^ٳA�}9"��-Nd)aY�=!4�g�v��a��ߧ��Ն�}��ק�P�”N��Y�T�ll��Vˢ4)��d�~t�-VJ�hU��Ȕu�Sڊ�Z���MLeiʖ�9��q�]Uy���tJ�Q���㤤[�=m�ts�4��U�ne}!W^�%��)�
D��(��HV�*�;���{u''#�����yn��_��0����K�D!���¬�u%��ՋP+��ʭ�yJ��LY?�?%.s�Ķ��EO!�%X����j�z&��@\m�\�I���YB�u��������	�k�e���)�g�m��S^[�*~!q&���S����B�D��[�5�1m[��_�y�ܸD>J��R�Wp`R�g�=wϔ6�CJۑT��&�M�ݯ�i�T%j@�7⌴�5��O>��*ω�D�;aUF3Z�(uv�7v�Kz����?�?�k��я�%|f��P�ɔ�Ib��5iԦ�/�Ue)jl��	��[��d�Vׄ!�����B&�Z���촮�赘L= ��}u�
��R�%�eJIj�V���UY��Sw�>,
��y�+�ם#������$�P�+9�B���u�y�'��=�o�"a�w��g�<���??Ͽ{ν�un�Q�?���K���=��㏭
@	eS�B�ǵ�H+��"	\��� �J�C�����z
ڜ�KSS�pIJr"3p@��-!�.sW�XT|���t�"�
�\,.������@�����j�N�
��ZעkŅpC�&^�K���f�q߄�A�1���dc�1'��a�T�a��ʋ��K�y)3/�i�3;�}�X���CF�}.*˵���/�]Iڸ�
J�����wXw4��^�w(�3����_�/д.�}<$:��|F�IUj�}n�P��Y@{���l|sӣ��9���X����>������Hw�_�ܜ�z[{獮�uqs�CP�$ʨ@�G��O�c�KӳQ�"CǝYX���P-5��dehIe�!���&ޯ�}�wwQ�,��!�W��J�Z�
��zSL�`l�\�)�2OM�wL�[��ܦ!�+bx��!�1��h�G�me:i�6��7�I�qJ+��1��l;�;Ae��fP��g���,|1���}Rߚ�s3C�����I��;��{����s�7�gP�W<A�T5OW5�pyʨ3��x�۴�tB9e8S9ֽ����7w��x�%��� ��Jq1�?����A��i�Y�0�c��T��)'���ԿC��`?7x�}�]w�I��ΰ�]��ً0��]��+wC˻�(�Y�2�:�����S*�T��G�E�����kD���kMgV��O����A���GuƉ�X���&7oo;-�m�*�#��`����#��\n�6�H�.�ԽǶ�d&�<�����6ԁ��Pǽ��������**p��Y�b�pˆ�����^x�?|a~<���5��{�Ӡf2
f*.�ù�
�N�f��Pk
t����rI��ԕ�ũ8Rǿ�Gwk�nD���6�$w;�P~��G�v���Sk�.�����ul[`��+LWyQ�ޘ���R�9�z�B�֛%�q���񿽈}�-q�1C�x�w��B�@��>7���dP��s������<_�<W�n���\S�TZ�c�v����W�T�_�p�o����_�����E$�lK����3�v!��d�q�τ��ŧ/,���nfv�Yl��]a��]Ӄ��ؐ�hW;S��ځ|�0�p���V3��f���@D�
�
t��'g��ޗ���}�#7�PK;��W2S��,setuptools/launch.pyUR�n� ����`Gr-�k$��SU��D�`���:�_��8����3;�9⯚��F���A��rQ�iR��΀�D�́��	0��{JU��;*�)�H�8��x�O����w3��Ff�ƢF�\�<�i��^+B�����؜�� ���N���e�(�@��8�4�sZ��7���Ǔ��ͼ�����t��U�v�s�v@�Q�k������8EsT�.�/I)�3ZB��\E[:5�+��)(��5�k�
h���N�١��h%��IY��k�^��(�b�1�t�e�t+�q��S�(֏,�2T5kG��4B�3x̡
؟��l�v��F���𝏓�ˆ�`9��:��Vy)�?���;�f2s��7R�֙�D}��?�!t��X��oE|PK;��WpS��0�setuptools/logging.py�TMo�0��Wp�!�`۵��j7`�a�1Q,��*K�D�0���Q����a>$2��D=>Yw'�	�2=-�
'�h~5�i�m�W���M��j�:�r��w8dY����u����rq�r^�2��#����h����N��_noO�l���c��7���aN̅@��iW�V�<�3�L �ޏ�1λ���Cf��I��V8b+��y�ɻ�V���c��N��QM�kj׺��g5�U+m�,�XJ-B���Q�N�}��z(/2� ���<���S�H_�v��&$�俜<t1�Y��J]kC�Zr�%L`�ECŲ~�ͻe��4�|L$;I���d�7O`0Xn��e�r^0:��I?~z��fd����\�C�To0J\��$�gr��AV��m���{j=��U�GZ�v���.D/�=\��i��ê�S;�J
E�U�jQq�Kl\�ѧ��BJ��Fr�}��]�*h��f`�+�*_5���:x�C,��;�/T4j�|�Ը;�a]c�}�tw�
��j>�fw�?�}^���3MC�'띣���/��7�w˯NJF�6	��PK;��W#���c�setuptools/modified.pym�Q
� D���g�t�N�Z,h�jx�"
����͛Y�ǎ��ev�#�l
��A26�GV[��Z)N,��}�E���{i�&爰�A��Ҩ�v%��+\|�PK;��W�t�O��setuptools/monkey.py�Xmo�6��_��($-��4�P͇"M���݊�(Z�m.�(��S���)�u�-�f[<��sϽ�GGG�[�?��i6�_�"-�f4\�jq�
R���H)��{=�����f%U��]�4����JɎ�'�/��b?�N��`���Ê&��b��k*D]�K��u�z���X��&��[jXE�dohf7ʿ~g<[��	�x��z�Z��]t\�Tp��_�lE�5�����x���̌���Βj�I#��O��k�!���Y��w���(Ճ&Tɱo	�{=2"{��������ȅ �4DY�����t�!v�0|�3���
=дc���U�׀I[���3�3Z]�)�jTdUn4�"h�Sb�q�IAU�����{��ƘA�<9Ys��U#��a7�
�K��>9��y��
�y�U���ցM�����$G�#�,��b��9N�ZD)�6�
�co˄�97��� �|�d�%���*�A\�C��Y=�-�"H0�LU���]��D?|�S�n�R��/�o�g����w����IK�NI�F�=U�B7AR�RF����ue�ZhIX�GŰ��z	�Tt�}Ni�eg{��J���+mR��eE풝d	���)��:GW��Q\o���G�n�̈́͊H[���X��<5^x�b|�-�!���)��5�=�a�Ph BA	�Ȓ��x\��<UG�):?W���kh
�q��T9�L��NMY�ʰ������]��G({�g�]�w�As��+=��UW��k\F�C��m'�O��xq��;]A�G*Լ_I�
�yV������޽�'��/�_�BXd9�1�3���Lp���RI�v�������Ty�ID�C�]?B/��Ѳ�?/ȫ�����\���ڳ2|�p_�?͞34�O���>�* 1p��`k��N� @�_�uu�������X��~���_?��w���|xw�'h��S��jR|9"5��RC��SGB�&���]�P'�\m%I��[���2�lTrVA�XM�����}��2��oc��!�B뫾u���St�b'\Ζ#m
w2�
Y�@�3*��O�!�}W]�����E �u��M���7N#�
P*���|rA�5��
�F���"5��L�zxX�X�v��;?A�m��WAp(�T��� ��(�t.�lV����N�H|�X���<��N0�GC�g���b�yt)O�/��s�ӓTZ@	�o���7Q$s��\1X�����B�uYŒ���ҽ��� �"|�5���D:]�nlVio�3�|�a��Bkɒ���b�F��h$�[�ۙg���>V_�~K��``��p\�/��'da��,l��]��0�	�n�۟V��u�l��1�Ef{
�yd���?�-�4l��O�Lmp��`�e������ach9�Ƨ|Z@<�Ḍ����·���u:�U}�n���7Jj�2��G������uJ�'������*�pՌ���Tc����+rV]ػ(y
���
�y��7 hİ��+�0�?¢!u�;W�Y�+v��.�%��ts�]ə�������)�E�a2��N{��{��*�6����R�W���p������:K�mm_&�dzÕ��5�Y�ɽ��Qo9+����'˃2KMK>��Nۡ.,���-��G}#M�u�$�:_���VǁW���l�w�
�`�R�8�e<�mAy�{���Yu���'w*�E�m�̀�W��,���ְ��H��T�+�?PK;��W�O�&>�setuptools/msvc.py�=�s۶�����'��(��8N�y�Tv^=�<�qzet�|�H��d{z��ow�A�)�I�̩�X���b�X,v�V��q<�'񒍝t1��I�L��yI�Ɠ�9Ӆ?uz�;A<��S����ƛ(��dh���o<��lX�n�z��o8�>�eN��iOSggk��Ӿ~��u��v����:���l1�b������n#?U��8�Sg��8�4�;g��"�ρWWavA�~�������qLn��l�3��4�6&I<s��(��L�ũ,��i6���/R6��=�-+�+�����R�'�g�7H#����
pϟN�#/<J�8��q���l�d�|�g E3�;�X�!�dA^���ENS�!�T���ŜZz�K"o'l��I�Q���
�S6‰B�KoҌ����q?��8�J].p��U%�J
�d�2L��l�2�d�y����GcYǁ1�.�3�����p`СB���� p��sh�����迆��G'}�yG�|�trr�jX+���{�v��U���Gvo_��G��ɇ��Ր���Y�zc�&�p�.�����7\8��0��Ǜ��<�^:-5�O��o~�rF~p��@�ƦYr�}�n�W�
��v�VO�#��I�ՒVf񕟰���>���ދ��n�k�
;;9zu�^���������z�]l�9�4Kr��$"Vw5��X�
Ť���B���ؑ�&�QS�N���E�ɑ�����:�`HS��?��3�`m�
�C�hXE����_�0�4M�����?����rR?m�J�ъ;�Xœi�g�e�S�+PnQ�v�9����*-������|+�L�ci�����ì�8'���{�ʉ�����	��:���|!�
�Tb�JSX&��e|F��2��`	5͙v<q"X��4�u�du���$�O���KNB}^��b�_���|�p��pz�~t�=#B�Ed�Pp
���cT��,��^0N_S@1#�2�5:d�S�K�����Q��P���Q�+��S�ƞ�S���;gY�k�y��^� �hRtZ&te���pBX!ĕ�%]�b>���(K�\���~�t��du������<�ʬj�9N.a6��χG�s�T4�p�Pk)|P{Y��)�t����P�y���!�}��ӎ#�5F(�rX~v��{{�Fv��V<���vٶ�J�u>Ea��!�mJ��I��V�\��r/��"+W��k)~�Z��Q�����ô([��X�e�?4oU��t+���
Z�UW8��)�Q[M�eM%%�݁5�d7u������Zm��"��k�X��k���,yc�6��豃�l@o�Zi��ֲ��'�@�-�2I���a��z8����4��A;�B�^����,ˣ�4re���\�།b5���N��]߾:�?����'�ޟ�CK��炶q����*����.���<�a)�1Kym����}�\�I
b�F�|��Ypw�vh,��%��-�̵p�\l^ԏ6V��`��U��r��3V�`���,G,r��1���րɐeR

A���������X����m��X��&�E�b����띜��ۻ[�x:m-���U��<�ƣ
;:�"|��?m�74���CKvp�,X�˓�\�H�������q|���֪J�C��<��֪u;��I��Z�:
���.�q9o�򓺱��3�w�2�T�f���Y��
;L)I�"{ϼ���6�дU��ʎDÜ�`0�Dy�2�
��U�ݼ^A���
0��>5(�:<�~:=~�GGǰ���zH��%V��Uo_��?�w{d/�6���[{�c���Ο����X�P�<�5�4eѵ�ʂ��D3���Z	��)
F�c�$`�������t�<
����?�t~��k����9�AN�)�i6����>�jzP�5�"�<�ޛ2WY40yp�\�M�+�᎟b��r�T�"�T��#�A�}x��\�u�#ʕWL'�)˚�!�jbמ��˜�IF[Ƕ{�v�&�c3/�O�@0
e��1r4���T�]�k�$@��;��:Q�ͯ�gP�X�;�B��&5��m�MkϜ���*=�J|�Qy`�5`�>S������C�_�8ē��>��wf@���A�T��`'�{�~�;~\���?�=��"(��nR��E�,��鼚^�7)!,��^�#�S\P��էӚS�4�����r8(�𭋃��1���-���<p݂ؼ��1�`����Co���нsN*�M��"3�l�C�S���S}�(��
[�x�������M��3mD/XuaT�䆴6mG4�	>�H$J����~��f_.w�6��R5 �֒Kv`���9�0�!T�qS��x�2.�K��9��Q�Zg����'"6�	��{�l��{��ӊ`�r���i�SC)��q|��;����fʾ���T>}*�������G�;͙zp��m�	��䕇�b�
}؏t���'������$v�.�8~���4:�3rDrA�%�B&Ί�<�ޖg��>��>��(v�����Q4�s۳B��1��'ó2�Ҽ9<Z�����9aR������P>;����4ek)���9��=���:
7�^5��e:��a�
y2Ў󱏋�z�"�^d�|��S��f��e���y�s�MMI��*���-|���.s�7VaV?�ۭ}ǭ��M�G�˝?���::p-�w��U�wh�t ���O�␥0f\5��ml�����$�ϟ���'t�Ԭ+�d���1+H��Y&?o�k�q4��婷H\����+�HAs�c����*l
C�@_��0�/
�����d��#Z�)9Z��xV1�S6��Y[s���2��д�Pos?�t	����V�KF!�ԏփ�*~��$��}�d3����KB:3�u�ګ���_�7��a1�����(���{�Д,h��r�@CB[�َ3
��[����A_�J:�񠐇�Q��I�jL�h�ݩ3&G%y��B&$�9x
��Q��ZA�T2N�A;���T'�v������l�-P�/�/s]R8h�$H?rz&��"�Qn@����▁ғ[O>���.v�/`	���LR��%�:u�[pY���oW
�*:+D,��:�Y�`B���aEh�RV�b��}P�%��1�y#��cN�z�(��Ңo�"�p
�1om�F4�RMA��\�D����Ue���$�p�/CLؒE��T�!�	�=H����E���b:O�@���c�*���'�+y�G�R��)�Q����E��,�
�H�EP���'l�vwo�6wU�m�p�2���ec�[J��V�t���=,QP��1�oy豈�ٵ>�C5�5*
 Z��Jc��
���<�U6��5�3+�������3�DR��]=ɭ�+�NoCN���m��SB3}$`�&�;�eЈ8ܭ��^|/�`,� @���[��Y�{�ԯ�)��r?U���|vߔ��=d��p98뽎�A�,S��a:�\�D�}[}a�V�r�]w�S"|}O����I����n��P)��&����?:u^�|'�%J�׿>դʁ��t��՚�F�r�@;��}뙨c0���c���Q,��Jی}�����H�:)���6?�.�ͣ)6ՙ�񥶻ĝB��k���uT��=�A���.�宲��W��ɟ2��������ֵJ�+V���=t5����i&ߔ��Q�̭��`0Z5(zغA�Wa$�ܖr6虌���ȚA:��a��$���`��-=IU�qʌ=,ѫ��,�TU�υ�rT����Έ�7R��cM�����Y�9=����UD7K��NURoOy���Y�h�\�u讋��T����P+�X)�Y�.Xr�S��ۣ|�b�@��u6
a����A�Fv�A��OB%ߓ�)5�nG.�t?�w�<����\*�7׽�,�K�{s0��薡�/M)���,O��M�3I���Na)�\YR�&g%�9A��iχ��l.��H���P�\�03�	�����������~Ha���/�G}��ZrP�����	�O5�(%	��e�nc8�bpPY}	� ���s�Q���c�|z�y��e:��fY�4�ѱ��XǺ��El:G|�!����wa󫧜���<���g}��D�C�s:)���`���Q~�>T� -ㄶ�b�=�CD12J�+R�]!͉CS�@�i|�9�&ש��m�R��f�9�V�;Dx��}�N}�e
 hf:�b�BUX�FQ��K)�-AQ$���W
z��C^�Ei��چ� �!�e�8XQ����eg��C���2�:�w�%��lO��|�WPi7u�~%O��[�;����u�G�|�%U��TV��}-OX���b�;�Q$�W�7j�/6W	���6Ra�UfK��-�õ"��.e��Dj9Cv�?<�I�=���:�<��M?ݫ`�`���7#���R��L-d[A�()�#�����o窈�X����=����0.�Ǫ�>������X�ikmefg�FC-~ʷϴ-�4!�r�DՁ�ǟ�J'��Q�{k�ܜ��J���6r��@���6z��:ų�1����\�1Gɾ����Hʙ�w�3��� �:�k��M�+�KO��C�ԂҌyxN�,鲂�
C=���߅�=�r�s�8�[�v�$�Q���������j��}��sDM|�l�-��;�S���-&.�_7,�;A�)�CNgոu)rs3~��5��W&��(��=�
(�s�1�n�cC���F�0�Oa���H):��wnG�鐦��ܶ�D�%�e1������L�T9�����9�t�)ܿ(	�)��G>�Q0+N�Q+}Q%���?��0���E<�7
%N���~\atAG��,�ͧ�$�͎��3�_q�[��d=���6(����v&D)_g]��Ԋ>)�
�;_�w�v*O�‘~��o�Vrk�1M�.A_���7�UƢЖFK�����Z�D�0AD�q�T�=�)�Y�PD�R�r�A	�|��dlCZ���\�ds���!Cu�r{�A#+�O�r�g�`pE?"0ˆSv�7�mt���2�ǒ�d�{�m���NIy劕t�����o��‘�Y�,��<�~����&T�c���	�n���"�aݤM?.���7Օ4-ށ/:��~�
�>�XQ�7�'��W����r�hI
�&Ri��@1B��G��)�'_\��.~"�	y�4��KDL��i�2���#��MZ*����~�
��?�ؤ�X#�K�f�8p�!q�ٵ͔(H�1a��o<oԞd��1���<��i�|�I�W�V��uf��,�E�b�97��'���r���La
�a��\j���6�0����^��:��cc�+1�!V�`�ЫZ��yQ|y&
�&1@�;p���x���`�
m�l1�R�x�@�ΛY^5J�r:���e�����B�ql`�>�!��AlW�xɑy��N5�mb��5�P�@�ʰ�\P�ivka�B��2Q!
u��n��b��N�S��뒜�C\D�i8rK�
~/���ik�Œ�v5��S�c:-��k����!��wG
X���n:��V�o.V)�P�EASp2��j�L㠨̵X=�%O�(-�
˂���&��/x�p&�Uן�h	ޝ����/��SCzy�S'X���f�{�x�g�IuK� Z`9�Ͻs�.�O�1{���1_��
�����dr�d⼗%_��_/�y���)_�'$)Ě�>.�r	��O���^��K]�7�8�P0�o.�l�.�`� ��~ղF�+�[݁sA65'�\�������]w����8n��2�a=\t��g��e��Ņ�ʮGf{K�ƾdQ43��ϞODڻ��8Em����2��,��]D�+n�S����b� &�"�<K��C8�v��|B�z4&V�9іH�l�b���i�����g�iHP��[�eȍv��UXT�t��W]=����LE��5C]`FG;
i�i��)����)��)���	��:��@A����S�WQG
G�~���j��V$�ʘEY�J���_�����כ��j�<F�T�M�A�%1x�Y���o��E8	�;<���Y��-5�;95��R�h�І�&]��H`XkϭZ�@�6l�h���}M�u��G���-����d����*#�8������A�eo,����V�D�E����E�j���RP���.�����>?㪹a�L[S�������_���gO>ؓ�����s��eZ�p��!&���rt�VV����n�Z���*0M�&T"��$X˞W��z�s�!z�3
��pJ�O8&W�y(�qF����<t�A�Ȟ��a��K�����[����Ө䗀}�q������w�1�h�1�^
���0b�2m?۩��E��$���z�Ɗ:<�o[/f�@�������}��+wO���0d"*>�A�mp��m�"�2�z��m��hcp������P��-gb��"DŽ���
�,�����5��KDTLL��z�M��
㴣ͦӼ�v�bIU����]����l���z϶�m��oy�"Ƨ9;�*.7�Do�����vu���"��{���t+j��@[E@\ك�����M��V�
w
���!m{P�B	�o�",�SdS�K���DQI��g�W{{+z
5�$t���F��f�]�
���q��C?C�xM�d�Q��A>�
��e
��+^��LH��t(�W����yڜh}�!�	���u�6h�/�P�Z��s�UO����n��Y��5Ya�B����wކ#�	��1��m�T���!ot=�|����֕b�����`7���z� 	���t�����+�A�d����p9R�4���-�%��y�W���@9+��lL��
]�+�kx�Z��
.��K�.� ���u�E��V*A_@�^�qF�^߅Q8[�m�s�Z���ȷ�jL8ز��_y֦K��J����^�E�B���9��jȃ��K,���>P��a	���k�k���,����>�*�"��a#��e�\�Ac�o_u7
�:
�t�u�h|��ʦ)��]���VGa�ۋg�8z18><rq�,
z��:ge8�)��ʃA~L(;e��X�@o��]g,"�XKM;ei���ܯ��N�?�|d	%�D��$��i�=��Ä�hgs 2z(�8�7�Ѩ�u9��7�*�?hůQ��G+����"'�aT7Yc����K�j�$�ӷ�^���5,K)�e�y��> S-s�zsR��<	˱+���Z�7�z�n��6b��
u�>e� �D���w��I�'l�\�_@j�@Y��߫�b���5�
� '���p��b�\{�2U׹��*�m���.J��'���B�G�"�f�wS���۰%d#�PkT�]&�W�K�&N�z:TMG4��U�@��435��^��.���+@�w�$�(��B��^�!�u䉫�U��]ha�lF���Q���R�-(�m�+�h(-��H��gmLm1`��!��*�0��1���vUZ�C����~�ks�6Z{�lj��.��V�N��¸�Gw\(��HO�KǗ��jB��s���/�0��Ջ҇~3s[���!e������4�+��U�$C�B���{>u�Ec�
?0�k���Cն��f?"�酟0:��:�*��,f����9Ye��{˝�wP]�}�m�d��h����HX_�
[ޚl�X���k���j
W@J����{��ߔ�u�[�lo@v����y�2�8*n�Uk�C^����<���<ė&~�W¸���9����g��KH��i\�ٍ���o�j��i��*�]�^QI
;�]e=[
jEUmzT԰HdU�Hj�qI��oBW
Q�RF��4]=�M៊��h	!����0���� <�,b0q�6M��]��l?�v��㊤�Y�*�6,�MȦ�Z�#:)_�Q�9j���H
PC
x�Tc��h�t�Y��[�շE������p�#Lop0x����g��,����ERL��J�^��[dH<�HZa�P��b�ھ��Um��f�*����K�t��]Iք�2��= �J����[*4%�4�5����Ȧ/�����B�׸O__7X�1�~��9�1ݯ�hc*vV�v���^q�KTYm��8Z��ݬ֫(��+�Vp�i�I䀬�P�nw��g#�Q��ʱf���#!A��b�m]��6�
�
�FW{�%۴���3'�4���ƣ���\dʺ��Z>�J�q�U�h}�.��5�x������2
��,��a��9\�;KOG��� ��ൽx!�78ͯ�mHܳ�i��!�O����`��Ȧ��QtF�\-�HUL���KƱu�#�.��+�>��*�����0[���z����|�<Ay$�im��a(��7��«|���fc�y5Ʒ��ӛ��m:?ȩ񋟆�Ӌgs�IG�q�$p�'jZ%ʿ��{�+��?�6K/�5mTl�`3G����]u�J
W���LIͼ��;9m�jW%��b%�>[NǪS���bC�]���Ǡ���ƺ�c8������e���36�p�mVv'H�8*�T5��Zw��
T_*Pd֝\�����{<�Б��_�Θ(I��a���X*1�'l,��Mb�!,	5O‘�Ai:���e ���1���x˃�
��B�zH���2r��74P�K����!^��zfl�iGZ��z[�3QV�(�,o��8J\s�����1"�x"��t�o�����g���xzC	()�O���W�b�c+��TQW�W��W�ђg���/Ct�q�S�@mr��,s�R�K{��k�ysv�U4*;]��"�&��{��4�Z��񣳽U8K�t��� �0�n//��͸��V�a��6u���!�|*��D\�J��/���WՊ/�eCB4�zE�n��%#�l7�s!�\���,Z��!��>�k�1��3|�N�\K�Ӿ3F�g?���Iu��ķy�Ћҫ~4���sR(0f&{��q�mڭ��-o��&K����&y��Z�e�QI�k�]K�_�E|���¼x-.��ݐCj?Rˢuj	�
.���(�G>"���%>���:���*¾��a���1�B�NV
�H������2.��
�IȄ���F�Q�Y��!~�yT
Ǣ��ֈ1,�����;��uk(���Ef����x]����_ޅ9�T<�m�ƊE쟰q�PY��MHe�(Nv�����͟����ѫ������-�ZP����w\��u�GYW�5�L�.┉���V2ؚ6�=��/�J��+��(�*�4�.Y����c?�ba�m1�f�r����XV��ވn:��d I
˔�Y����H���:�B�X�Bs9GKB1�xi�����X�+��D�_^�R���0���M[%��M;~�(�&�<&�D8����֣�>	C(�ͳ��t��b>��$�0n�"ٔOBE����`Q[ǻ�{��/�u6�PK;��W����csetuptools/namespaces.py�VKo�&�ϯ@�"��E���i����U�����"c<C�N2�����$7w6���<��@
��l8���S!�Q�T9�|�^U�>Z���p赈Qt[���E(Ò�>�-y�"�	Qh-��?��˗
��s����=RE�1���I��i��t�t��YF�с�Q�N�ꑱ1	T���2��,�z�e2��Z<MG+��؎э10�4��+
Rǔ�-i��9��д�
�22��A827��t�&��aR�u��h�q}��~׀@�%�YL�H>m� �D ��>�8�V��o�*^�����[��#�H�o��ٳ�r�Zg�ˣ���o�e���D�0��J�Wɯd�#���@�O��|	h��;���C8���i��K$5�(<<�f��5�J6�N�0)�ٟ�dɂ(b��qp�"��Z?\�r�ե���
����>�.`ؓ�AY�S&�"?��3]��*�2�xk#����o�žV 7��C���	^0,M.L�r�}�A�.P���$�Zi���f{�Bl7jX�H��$��v�:<I�<8��'�.|�
	�]�Nz�ãȽg�~�x�|���RZQtx�u@֣��rI��2���'�|���$+�?Ҝ��qީ��V�9O�r�[��$.�6��M�<z݌,�Ҕaڃ�4���2��WU�0���x��)�p��2p�	/M��آ\�.ea���L��S:@�<oI��W�"����lX	���5��M�N�fF����)빶'��=0D�a|��[����E�������y�qG3��>��fg�y���
�&�Z�9h�Z���d��Ỉ�v���lg��ڧ��
����_p�8U��T�G(�S���;&�w�)MۢLT�P���l�W/L�����t���aL��X-m�j�g��Q$�e���CJEV����ӎ�: �� ��v5�O�����������`��J���N���BJC���"?�Y�F���m��傸r�`��iUI"E��)����p���c��G�fD���T����-
Tж�J��-��S�Ĝu�"��7�yi�@��6%�[��K3)ͥij<�����?�B<�PK;��WĔ��+ɕsetuptools/package_index.py�}kw�F��w�
�^6	Y��;��J[N|Ʊ}���\YCAD���L;�߾��'Ф�d���<'1EtWWWW׫������œ -� �k1m�U:}��E�U�eQ�Y^Γ�`���/WU�ͦQ_+���[^醋u���j�N��˴��S-�fQ�D+궪

}Z��|�J�FԺO�,�v�L�\�z�u]Ą�t~�ůk�t[����Y]-�ٺ���lr]���@���G�W��Z4պ�
�%����Ӈ}���ѓW���ӣ�i�HS���O�=x��IY�˴�?��*m�۫�o^><���Wy]�K�3�0��l�Y���IgbR�Ka�y%�F��V�Y^��%x��~t��ӧ�_أ����Q���.�r��IQ�;O��#�����2m�դ�Ӳ)�V�S��B�B5�;��k"�g�ɲ��D3��.s��iQ����$�|��ϧ�^c��dZ-W@���)��qt6z0������_&ɝ?�߉�#��~zy���6Т����1�wο��N���I���/�L~~�۝�\������u��O��}�r� =y[�m�Q��q���n�=�C	������;o�;N��-�fQ]O����.W�f��Lf��f��:��c
 �{o^>������6��I�*������P�/���;���WO�?{=I���C@�^~8�/A�!_����AҬ���⽽�$-��:��L�,����x2/���f2��	�m�3��%>�\�e^6�z����Z��}*�-��F|���_O_O^?���1�|�5��.W�nx���g�&�O��M���������d����?
�� �&�~�,���p뷼��8��)��)To�N�y9����cK<�21���6�z���Y�i|�"����P��`1���x?�6�[Z��� ma�H�Ft�s���g�j�44hj&@14��j����Ap+ ����Ņ3Og�#\K9K�g/yn��j#��ѳ�C�@��WU�䗅@l���D@Eu-jX3�1�?"Ɖ���`���"��F>c0�(��:oQ������	L뫣nC5�D��xtx��y*Q	�{��B���k�QF�
����7��xzj��9�;߅�7_��;�Q�̾�w�)��:��Ѵ������?6���`�$7\�y$[���}�DZ�I�V�=��͝��
��X�O��PL��
�x��k���z3��Η,��5)w���uՊ!I�����<V�ͣc�1[G��\$�hC28.<U�fx��/���c=}��!���?2�a�3]�`�<�aV�0�/�j.��b���(�fi��I�h��\.!�&C`[iAu�/0���]s,��ch
J��D��E��l�p8R�Ʒ��)��H3@����B;*j�QM6�Ɓm'���T��f���P6�^5�j
�0�T2���*:�������(�b�X��ζ�L��Țh�S�L�?��)�R�T�
$S?9Zb>G�Ȗ���dg)~��v�W�]�L��cڙ�H�ld�<�M@�l
�.�Z7f�:]S��vzT�7�h|���E�9t�'�;��S�`�P�$o&h�6����������4�'�g]5ױ�t�ɪ��+��nj��S��4ad[DZ�?���rZ���:�꼅UD���$4�.R�^p'8t�:�\����7�:�mY��,8�)(A������
��aC��%T$������d?x]o�M_�|��8M�N�w�o;Md/-��-2����Odhﱍz!��O��oN���V�g$nJk�,�E摨*����n9���/�i��+�*Q��vM7��15S5	��3���Oy���8���9X;Ҏi.�f{�l?�R�i+H��9�f@�;q|vL�1��f
��dLKp=[�̢m�u�,�5,��s�pq�Ē=�\���R
k���V�o�f'(w�
şԌ��Woi��Bm��<0�#
�����8����m�6y���{+���#�gG�籭�/"��l���i4d��F�N^�pG=�Iq��9Z�U~=#��=B��'�[ɝſ$��6�j�:��,���.�"EL�|���'4�:-簛A�,c��䙯�ώ�A�����V�(l�z�a��ٜ�þ��|���L�U�����<�pul?�v��j=6��|�����,��W�h"�G���NW�W0����l�ܝ��NQ�5k0�i�p
a����w7 Pdia8����i���ֻ�{
Q3B�"���D�N�9�x�o���oq/��	}�^/�����
dyy�������ۦ��������Oc�ń?���;1��O�((N류��Ľ@��^��4h�y��.�xk0?�e1C���wֈV�B��M�I���vV���4�q��E��l@ƒ~R>� ����.��Ő��<�F/	�.C�eDJ\��?0/�8ک�[�D��L��F��2]E���꩛
@)A8��1�B52�	�f�n�k�3��cD��ou���ڦDk<��Ĵ�D�zo��pD\c/�o'?�\�a@?<�(�Kl��َsAH��p���Ck����֠�;�NS������7-@�+��e�p!��D�
�A�.
<�&��۰���?K���H͐%e?WZО"�Q�����"�?���>l�vJi�҂No/[����v�y�-#��
�@�j�Z�����2K��h��`~���x�#g��5r��؆�3�5K�`��%�{�W�I����Ҭ/�6oA@e�DL85�n�I�	�JΈ\F�1�%��Ȉ���w/�#fd{�4���7����=��?�?G_��|}x��2�:����
Lk�������ä�Py2���L$��������M���{��|��בn�M�(�_�r$B����2����ٴ-g"��@g��)��"�zlh#Ɲ���t+@�=0���n �c�x��RJ��L�J�y�p8�G�}n�F�n߶dY�O�T�o$Z�&�v@�
>/)��B��C�(����g�/�9�P=nu8����A?#�����:�76��eͱ�t�i���YáQK�5��֛�!��c	0�73m�j�V�U�T����a��``Z/��m�Qx;Z��4�\�ˬ���L�g�I�c������O0��lq�zE֊��egv6��,��~'Ύ����V�� ��)[�ۡ���x&(H��̇��������o�AAsM�,�Π��9���&�(nw�V��a"XP��#�i��2����Kt��v��"c��'��qr:"����f��1�)�O|򤷃�#���r�?����c�Lc�S�4t��Nx[U��]�3���P���/����s����8x������=Ew>���htR�pH��2�\

�1[{�|E.�K�agd[�u'�z����d�X�!D����̰�$��铢-�>>����#�Xܳ��G�f�H^�oR��`�-gR��\ϣ�c:,C��8��X���4b�A���ǿ���͘\/��Y�;��}D˪2l��g4��i�N�{ݥ�M�b^.�����*���g��F�q"���#��j�n7h�֒2#F�h�مq�[
,ʭ�d�С��mDP����`lD�9b�An�3��I���y�
i9�����JS��Y���zV��`
�[�9��x��,!�`;�i�}�9D�1��
�,`�@�&sp�C�ύ��J�� c�w�dZT`i�,�8_r�hudM)@x�d"y�N�"�E��4�dQ����԰l���iQ�=l��J&K_�"̑96-�
XK�u��@m�t�̍V�/[��SN>\� 
J�+Ty-��Y������~G�9���0t�����Y�	%a����R��p%�)�!#
��!�f���N'"������>�ٰ!9��2�v8
8+�5�xC��좭q�C2�\��:�����.D)g`�gE����ӌl?��!��	e<X��>���薦���RݚhV��uZ�%Ƒ<��lVzմ=���q��kK�'ХN�ޢ���s��@�/t���Q"xl��N~#C
"���u� �!I=KG+��FX:��*z���P��.���YڦE�ݎ�e�d �Z4zs(qM�O�&�����	�q.�Q������;Z���N�ے��~ب8��h�Ѡ`����-�!���Sy�V�+8�i�W�<@W�i2��+�=;�ti����.���~-�'���H����������.1��h��mi����V�&�|T$Jǘ�n�1��mX"��u>�,>R`���ˤ�M`� ��⢼u6�����VNn$0�M�������=�>�
�U�԰�4Bt��Cu�V:��d��d��fZ�6BJ:ړ��G`vh�D7��y��k&����+±��	�UW�	����C���D�aH��i(?@�t�Á��*uvI5/�"�6X����'K�o"�9O�Q�*��/�K:	7��>_�l-�au��3�w3���JZ�o�N0�\���`����~�Wo+R(>ې�D��1�ϥz>{>����?M^�>{���\Z���
���;����`Ee.h�Kh�ɞ!u͠�s+��=�3���odCr�+���)��LK���ti������8xiy�w�f�#y<�������Ha�񕜰[�L��� J�����3$XϏ�3��6aG�a�(x�@�-�߱����?:�a����MGG�*Z��Tc�b�d��!9ۑ��N�����
��*ݽݻ��
�=�-�j�L�9e����H���:S�G
���n���@�5�v��B�(��J}���!u��6!�R���$��bs�x�sژo_~����)��R׫Mh���]	���G����x��V3�ՄxG�f���w|�CˎѰ�}o��4�3��V��f}�FE����`y��r���e�5�`pr���k8��b�a��08���[b���
݃-�֎��)���5t��a��y�@d��Y�J��A�5��c=�!�yG*KnV.�o9F�Y�Yx��D77����L�s$�uLhn[H�ڪ<w��Eab��	���;��_/��� �,�:
�t�uF��V���֙we��;v'��Z��T�h���0�gCy'6=���p�b�DE�S3PHe��J;Ѷ��x����0�s ����jQ����$Y�zo�?'�fB�6���¹F���dr�l
� ��F�>m�@��"#��թ���J��D��R�oǪ�,Y]�g[�yqH_Y�vj�f6)�n���p�D6����}�:�8�mp��j���V��� 
�¬��E�x�3m�:P���>$�8���S΢3��L�d_�Z�����v�ڒ��}(#�͕��>�2��`�7�҄� 5m�KZy���˻�Q��];p�����ۺ$/����ٛ�4A�����h�QXԾw��������l5;���ٞz�N v��'����-widYp�?_����u�r��yK�dq%{�-q�Ս}*:���<���бDZ�y�&��Y�+'��皝`$�֪��>|A�t����N,�B��a�؃��ρ��i��.��Z�s<T�U��9	��
&z�'�+U��~�0�����m`Q��a�S��R�޹j	&A�YG�+��OvD놸�n�fk�k{�$�D2O��9wđ�N~����sjE���#��	�w���Rڀ�^N��r)��Sl,C���w�Ur"}��(\�����p.D
�cns�y}C�ֆ�s���a5�eA��6T%����h�����t��_�M��Y���l��h	���t�L�D�ub�.l���X����:����XL���jc�<�����SR@��X��$Q/���о!��tc��>h�_�qqa��[Ct�kȢ�2�9�%P,'���Ŧ*K�'�	���=P�t�ꄆ�HH3�A�"�{�(�I<�ɋC��v��8��R��M{qA>7�:��h̍'L���$=��c%��Z��e�]���ѹ7
���pqA�c���v���
���&�&��h֦EUΛ<�dj�Qr��Y=��\@����ٺv&Z�U�~�t^�RLd��ffJl]�N���Mgx`U������ɶS��~�}��R����.��é��r���YY��ʣpo��\���y,�2-����5�Qa���u��&k0�3�!���N��T��ZfkZ=�@�����~����FT��=W5Ug,��Чԟ��CjO#y������a8�T}�m�a�:��A�|y��d�|�;,�Aw.�	��~6�oGR�QԾc&Y�2Q���t+����V�)n�!�HX�g�a3}1�[¨�!�T�r��"g
�A�ĆJ)��{��R��Y�:��Q�C�N�5�0B�o`�� ӌ3��W�5��V��]�	I�ȬLnW�?'�,vKJ6뼥�h���,v��~a�������@�q�B���tp�l)��L��Ї� ׅ��E0+��i��t��(
K�I_�
my��'kDŽ����O�>),���	:�Ӱ��M+�y�{�ZqBZjD��[߾�PF�h���t�=D
l^�-ګh�#ڈ��B[rx�Z�M�:�Bְ������K�#ٯU�s��@��9h����$sFgQ��碿L��n���bW�;�h�Ԥ�ޔ�:{�0�E�j�F�����W߱^�2À��֍�5�I�Ŀ��72P+�(q�^�י�I��']{]�ʉ��9��Y&����̽�@���U��E�1���W�x#�L�����v�ưѱ�b�}���)o0,ш�-�r �Hv�C������N5K}Df��uU�S�0M�m�:ѡ��&��B@D
��0¤��3�vBA̶��I�����CoK���r�Y�`���ٓAa�g�%�}'�C��x{�!�-HEe�h���l7|�tlj��_��{�$��b����۶�Qf��ݠ�~t����*e��~��H���Yv��:[����~qщem�3d��Tm4���5�wz;vH���J�I�(��~g�_R�_���+1"�Jq��_Agp�� �Z���l�$�PZ�S�V���
�^����x˶���3iX�
jǐ�b�{�f��/O>x}��[0�4
<΄e�a��K����2n*��{d�*N�y��QY#�rf2��R�m	+.b�b�M)ύ��B�b*��*��	8P<�o��-�����{���@;�}9���[��x�2�_�{.�uI�K*��vw_�7?��۲�/d�l/�h��Gd��i��t:��`0�u������hWR��f�3m�V���{�ѱ��i2aL��ĒG��wCd��F&zw�Ԁ���'y�(#�v2`�k�Y�!�F]+D�����ޔd��l�+��~2�V��N�H����%ꖔj5�PŊC�\��^M��}ŀ�u���{�t
�vE};����
"ު���!~���5�[�y�
�-�a����=�L��^��G�,&�V!C����_<�~T�i���
57<�Hw��[l���E�Y��r�S���Y�,�N�$�Y�`Țq����E&�h00k��<�&Qu���f�sc{��\�U�ƀ:�it���a�&�L$�l��G����>ja��i��Z�JX�+�
:sb�UL�bF�9���χ9�R�y�V�%%�:�Cl�=�N>���}�W	\�X�����}��e�v�D�^������^�߾�;�7[}���M�������aSe��8w}͚��K��)����sZ�r�UP���Z��Z����.��0p��]p;JD|Q}���e�U�����N��J���s�
� �=W<^]��9�e���r��-��E�pZբ�����	��0j��	�/Y���U�>�kJ��J��d��-��Ư���n��'��#K�lk��^�s?�P3؝m���A���\pBEW��
me�m���iD�iF4�%��{�߲Z�rZ�Z�R�mGI�&��âQ�rk��Q����H�by��q�Ѯ��*}��-qĆ��#d{R\�'t���"2�E\��W&2WD��;��'\���˧�ٮ:e�({&d	�3pq���s�V��2�*�,��b��ە�.�P��M�ļ:#$]j]����H��d�k'��%�w�m��B)�T��&�_qv*�p@��ќ��񳍆6���f�ڴ]7O1��o �[���O�R���!��f�^(5k2�B?$�@����E��&��4��REO�07o�1fwy�]#BՋNT�7|�,��d�|�-;�L�V����
I1���a�!L�����Q��S�`�b0H�06?�}�?M�]��5�LL8d2�kq�%�Ǻ7)+�/�.1�u'�Ot���t�:�y�r�
/릆�NxC�H�.�dߞ�J'��\�!��qF��"�ѝ-��-]{�^w�y�n�p<������
a/�7�
���ף;��S�Ŷ��8:���zX�R�:I����j�V�	�JUz��Ykq�ܕ�^�k��,��k�n<��ڴն�1塌#�e����r�Wly����U�ť�$�,���1�w]V���M��R�p�B-_����4�}:����ăΖ!�5+�R:^�확y�'�zE�B�c���,ȧ�ڴ��i3���W;\���W�U-f��~E��Jтm�JhX���t��5[�����CoǢ���,���֑*68�*5[>�����o�:�k��)w�J���zm'�ɓ�N\�H���_�e���h*�N�<�w(��J�]�K��.�=�5����,(�w�K+���,�xkߐ�:e��� F̀Nb��E��U��'`�r�J40}G�_׹h{4s��^j��֓>Ç��9�be�S�5��.Bo�0P����{-�k�����~���5n�M��z���Y�7��3L�f%o\*���g��hz���`�B����~�_�0|�V_����/����k����B[�Soor
?ӻW`ooc����Q�	�u�)��@��n`�3QSnY�ˆ�|�A�^�:����k/�>�1-�] �^f~��=iҬ/;�7	�3ڏ�fw~{�6KG����w����^'�#���w`{A7��+��2ap\ZER�zA�����:o�B[	, >!���z�U��5/�R)��	@4nn���o�I�វ����$Ih�BU�-I��y:뺛&G��͡�延z�8~@/��?.�?N���9�h,�&��H��e���M}�m��6_
���w|�ul���N#�m@ۚl~�"S-QSW4�߮�tR�Y�k&�u[{�)!�{���U߉�5����P�y�P�-�-ş��?��x���^���o��^���G�����!�����W0�]�Y(ϡ��g�t�����o��������j����g��;m�_ukԁ7��O1+,�";�CM�i�%ת�p���*W��X�C�s��n?]���ݘ򓻓Ѱ��uph�'�w	��RWj�����Jxcy^ӝ���%����d�
fC|s/���lf tR�O��AF�lȪ4��a"Q-�o�����_hU��ҁ@Y!���i�Z���JL���:P��,���M�ߩZ
i�v�*D�]���(p�@���#T\3���P��5g8P�r�ޛ�|�|��}x���H����[��E���ٸ�y���œ��RG�YC����~A��&��O)䋢��hi^O��㒴ӖRމM�靈�����J��������3z1��P�m�8�F?M��*-35
����$��$���{{�`7��>��
0k7��S��6��L�K�FЛ�>	��r��g�!�m7���gLe���.AvT�J��l�9�B�V�󞒡���LE@��p�d��n/]�u�I���b�q��(3��K�_=��C
r��.F���t�cM
&����Y�-.T�X<o���W+;Tj�404��-��$��]��*ވ�5�C�Z�����д�kO荊�@i�0���ɷ#�u���r>)��3�WX�Bj�@�r�}Tad�����7�6���੝?�E��nԐa�4�GTVQ�	u'���
���WT�W\��s]n�
�}
	���3�a|��ö���J�a�t�/��5���]^l����ɔ��X��
�.�c��*kN=�
�䎠X'���>��B5�����|f̤��Dɥgr���ڎg��m�'���=r�G.;ʱ�ć�
N;�+o �:��{��@��1��0A�Jm�ncCNwr��i���7�ucU,W1�$�.�]U�J_(���|Q�ٺ���/Xz���n�Xa��~h�������	����=Ä`M֣sX��m�I:��(}�eL$;o[���ź�f���2�B�;��5��Ђ�T,��KH�U��n��%c@� ;�<�Ky$����h���h��p�u1�~A?H��H�:r��6<\Ӆ�<_��lEq-L�ǻ4NO#8�"U/?I��ή�+Ht���d��Z�ο�f�ȵsi�F'�ۈD��.Q�[��"_��0��Ij�VNw��C'@E&=�$�n��|ۄ!��a�8�
m�#wU�h������u����� ����=}=y�����o^Ǒ�A�pf��I3�Y�6�k~���j���Ɏ��IŰ��ECN%Ųh�ȣ>yMY�D�Y	4N�q����:��
��:�7�7�8wM<���Z(fpJ`�~�s�E���DѸ/���u�xz�ޝw���d���3�d ��7N�}���e	ky�œ6���*�X	���0�DW�ʊ�Ж��̨�A�#@�Jϙ:�q�'�/:N��_��Y9�#|�/ϙ�}$��}T@'�A�ΰ��hr�O�'	?xL�#�޽��"b��c}�ӌ1c�N紺a��j!�֟��w���_��i=TC߻{o�u��J��|�~�4�M��G7��H�\C����1""RL�ϫ�Ů�<��I�G�Q�`�EY'LX�{�
PK;��W�����Jsetuptools/py312compat.py��=
�0�w�Bc&�v+�c�^��1$r���޾q�L�C5��{��8y��\^�9�:��02F!*�6�
݃��!/A_�!�B����2��RΦ��I�g��z<k,�
�C֤��pU�Ab�%����[��²¯o$��z��[���I���%|PK;��W c(3�
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���:�Hզ��&����ܐ[Ł�-}�&v�IA\7�xFۊ'�ze�ꨶ��i�3;�R���y�hZ�.U�^�M|�(Z����>�c�G�;c�F�g�hz�C�a_���"�����/{�Ù��#R�J�^�3kA�C����9��;o�� 4�S,  �iD��%߭r-���=��{
ߋ�f%[�wF�
u,/�6N�M������`8J�/*�Y�W��
WjT�9*��P}���C����(KEI��
q�6F)���J,l���N��3E�����vC�����#j/"{�@i뾐m��9z�<���S:x)��ۈ~P*�R���T����B$lތM������Gy>H���p�[����[�!K%���c��������*���F���,����&xf��=:z�Q�0z\Ժpg{��c���GFS�a��BG"�Xa���A�T;u�}
un_]�>�u�!�G�݄L�@�#E�;!]eP�61
D8��ʅWn}?h��	4�\O�D�w�Ms0�R�@6׼�_�,n��“�.�� ��!<�`5TfK�+0���1������c�b�8u������X��f�vKF|bɰOEg��8���~.�h�d󲨶���;��D��Zuϫ�>}�/�S�zrZ��ȼ�iKG��4��
D}�8q�?$J0cQ5]k0ÿS��O�ol��7#|�$�3ɜ��SK�9.���Xozs�*��瘜@����@����@}f�:��G�Jk�7g7XI�.XS�6�6��C��R�CV���u�T!Q�`H;�ϰB1#_��NӴ�Q�W+ؗq��c�—wa!�]ۃ��辠���	?*gdg�$�r�I1�5���e�{Z���>p��I!�Ձs�{M
K?��\��0I�	�c�'����nl��&FO�0���@"��]H�x������a2�����M���{H���Q�7��P�.��QC���5��[H/Q:B�u��7�+���u��>��M ����[�i
E[�G�&�귘B:�j��b��a-2��H.?J[G��0���Z@��}Օ��x�^�������^����V��p�_0'ݸRy�C��^�H��"k=&R?�i��T�r�"��5Jty��r[4d�P7�� ��z懅�0I��a�b���	
��%.z�n�0���Qc�$2�A�bF�1Y&PyúolL)u��hex8���i���[�:62@\h+J�K��{L�����k	.���O�F����ѷ�Z�2���B0.�6�6��H�.|��˃�
�y���&�y\�G-|��Q<�ƒ��?��k�c_7����n���b-�$>��
�~.q�� �HM���'�&�E$�3�%]�4'�1M�dK�+z��oM�
癞�6D�P�=�:�:_�ijN��E�ϡ�KS<�V;���ZJ����Tk����m�3'����J�t�Ϳ�E�	�Vy//�-wJ��	�ҾQ䱅1.b�
�H\����~C�wf����݂	�v�bp���(�@ �EJn~pcEo���:g�}����ܫ���o&���R���f�����8<��n�f �3qC��I��/|,������7NW�[Y;x�>1�����qz��r��,Z��us��X�/��A���9��~�N�‹���^r@A�q��w�ݏ'e}xT��(QT�<j@2ffﮞ__�?����o�ZA��s�Do0���\`1��[7��H^���w��>���PR�T�}��B��=�\%p����_��^����*�z��
>��~}��|yzu��>��޾|���/^��zr������n���b�(c
�]�����
�a̮��H95rI�hp��DWA|-�Z��?'��rQ���'�����l�������>n��S��]Sr�m�����rsš�:֝d�>�cՀ��P�0^�K�\�W�i˒Ωr�ė����Ϻ�딉�\�v�t͝z�ע<���V�������C]�P^�K���
�^{���eQ��B{��p��7gzP�C��vJ{]
H9 ������xص�H@i�	��[�R�+��gX�z��e�Ux3���6���HJ�›�-���a*�F���Q��`�d�u1A"y?|h�j��PK�uW����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�uW�3��j�setuptools/script.tmplSVpu���q���
v��RP�(.HM�,�2��2J��sS5����RK3�R���l��♹�E%�����@U��Eɩ��zE�y�S4��*���PK;��WT+�~�setuptools/unicode_utils.py�R=o�0��+Na���*��Vj���\�j8G�����^��С�`K������XO:39�U�ې��(�&�{���;���;�a��[���>8���O��h�ɱ��M$�؆l},��4��$cϪ��8����4���`{�[�0��gYOϥ�s�XM��?Q�Q�+Êa�"n�5vH�9�	���4�?֐�f-V�Km��@�8��wK�[>)��?��E��˓�4}I�p9I��Ы0cq���c?�
�����@��(���9����
��XZ5=��\��2���
ZT�a5
�{wv�hu�K{o޽9�Ţ��!��1�!c�jQA��Ԥ:C��٫��
((<e�
�������-v�T7ޣ��_8��F?PK;��WRp�l�setuptools/version.pyK+��UЋ��-�/*��LR��rSKSK��J�*��� >�,��83?/>^��@*��^�ZRZP���S����_��n���Zf�]����_��ΕZ��ZP��
��Z���	PK;��W����qsetuptools/warnings.py�Wao�6��_qQQT�TeP��ai�mR;�EشD�l$Q )'����;����m6t�`K���������K�p�2-bx`*�\C�y�hn��H�j�dR�\G�w���R�A�2���@�W`,���Zs���L:��T>��`$�z�����߃��ӫ�y���d3�g���F�(/��0�
�"���w���"�/#�}�Y!���`�L��	3܈�����jF�౩'��2�&
4�����7�*�)73(��9KC�E�=o�-yw��j�F�&����X��5������?�!��{�Q����騇c3<�ï8�����m�^'�0��'z�LX"<nrA	Z�{����4��^a^1:�BX������@K��k2n2�	�τ	�}�T��]fS��
O7ڨ;<Z_�1s�zѬ�c�`ˮ�{�Xs4��dW��E3��/9Zb q��f���I���;�՗J,�ϊc$��m$�g�#"W�7e�<]�5�+��+SK��\?�w�޸G@�9�i�
(�ן?�^}�C{�Y�����@t{���� \X�~܃q�wQ�5H��4V���M�����g��1��{�D�d�/�)���Q�h��EB�(eTv���'��$�C�ߟ뫋]wJ���5���b�i��YD�W!t4Fud�uh�M�B��.�G��_�E���~?Z�"#�
:vx��L�1�qØ-��G1a+�ȷ�.�=ع�f|+?N�G��u~P9�þP<0!�Ԋ���Ґ|�,��t��mH�m�;�m����x='�*���j�t"�pƊ��;�d�� Rk1M�oY�rO�f+�XG�����`�͒���V���׷��o_'O!�d	9G��(�8�����^&�*��%�O8v
1.J ƖC���]?-E�hxi
��Tb뀣�+���I���NO�3���U@v49�}��c�j�QU��xHes[������B���IEp����=6o0+M��!��OABrk�}O6/��"�������q�跖�Ex�=�4b=޵�ޮnS�PUm]�i���k����~�M�<��N�a�l�)Lo�Cc~��/��
�!Y�w�j�ҙo�����1��tuM'wV*��HWX�QN({Jd������E�V��e\kF�4ʃ�`u����[�X�9)A��h��`X�
QL&�]9ZTeW�(���RݓC��6B��@9_�0���6�8��(�_(A�#l�ɥorEQu����&?*�96G෸
%��W���jn�t��&������V�L���q+��4ў������	�+���+1��3��6�FU��S����jI��Oi���{E�Ka��e�{����`p1���ΰ��]^��NG�>�՟1�C��9����Z#�ߨ�����=}��;�?PK;��Wi���d
�!setuptools/wheel.py�mo�6���^!is��>z�����Y�-p�N�%�f#KI%q���{�H�$��.@�z��z�\��s^*�ڦ�����r�|&��D�?ͥ��R������Z����?��?݋�e�1�+��t)��E!�Ʌҭ����8��iS2]��Љ��n+�A�?S �eE�]���v�K%���{�>2E&O�O�l�<uT)~�4��ȣe��+��R��b>���ÁU9�]*�������J�{+$?�J�Ih����d�7<3m+�,u�H����b��ߛ�O����
Y��P���?���W�Y�6bG�~�\ੳ�w�s�Փ�`ıy�mE����9j���=���hsb�%������p�v�_?��Y-z`:�/(�/�.ؤ�������Ջ7��2M��iG���Vf\E	�yV2i���,<N�s�&�+H��]��R�iƲ=��N���WuœE��b��$�	�8yd�}@�qpz���'z�IHL<�Uy�?_�^�[�F	��H�P���>֭�܂����C"s�)8�Ҝp�(�so�3�neE��5����.WDS���H�%P�.���O0jn�)V2Ksع����e}�	�A�j9��C�@tM>8�+J����Y
�sI��!�r֖>��ƱyDkEoY�I���n�B@����qG��t(Ȱ@����!)�����zbE���P���I6A`i��6ƶ�h��t�x��u̫��{%I�r�_.�E��u���@*�X#)ld>�j)&�$����i0P��+-*��\�fP�u�9��id[���8 h:�=k�Nu^vQ�k��ˤJΪ��5"!��&�o����I�R�d�:��P�`{?%X���I�#4��Ҥ&4S��
�=$��[W����7K#�*�'��Xp�����-�k�n����BJ�*�.!*�����+ka-���G���R?���Ք�ညC�V����›�
��E�M�	�f��-4��p�p��P���A,�뷬l�F�ZƑ�n���0$��<�y����$���c�?i~�"7HF
��u��"�qBa 8tN�ij��tv@�d�Y�To|3@��&��Fqߡ�c'�@߸�Gۓ��]}6��m�)
yҎd�{NT5��qD�d5�)�x	g����`�}�
/��:�q=$�zo�d����;�<�Ѽ�4�c��A�D)m��p2g�3C�"�X��@h��Lh��u�B��`����`��VU�`��+��1P��d�&������;�����d��r�mH뎩d.�x��#��%��v8�E�S�p��f�t�_~�rt_P�bz�(�\������bK`��k�a�x�(�Ċ�&��o�	U�Im�&>��M�J3ӆ]09~}���۲��"�,�e��lZX
��r�|0�B�O�� un4x<
6�H��X���*L�
A�1y���<.ͻ� ��b\0"�7��]���B�X5��3(z�.*�S���lLB��kf�}1͙f��Gd��Aw+�x��*�<~����ϑ3JoJF@f���!H4o�N�U�z���F�
�0Ü$�Pc�B��]jwr���F�U�{��ݺz��_��a��J�ioF_�:&�I����
���a��m�����
�6�
��,��J\�<�Z]\�#�ŮR��!j�O$}e����`�0tqa�S�Ef"0�){ϳ��G��q�0��f'�c�S<�p�A�`�s���P����@�~�q{<��;�&�7�D��Uѓ��y��z#�DijF ��~�;�5���:@�A��f�N�s�����l]�d���b�F&}
�Rl[D����e�Ra+��1��>'�c��:�
d���QӚ��0�o0��<*�/��a��<d�Б�E!��4�sՆl�Mv3H�J��`���-��$�RT�����tsr�fBӠO�n�f1��Q��j%���7zk��<������+.�8HX;fֆ�C���G��Uyl@�#`k^?"��T��'g8��ݠNr�
��P�N���c���f�o�'�l��w��������|gzb6�)ꓭ�m��͛˧�o.�[�)�W?��>j�dn�S���k�a��r���fY�Zud��`�}�Q�?���9L�<s-�Mn��V)o3}�K{SB#oѱ��Shzz�!�T��1��sʗ�M��˥��5��!�>��=��aꯇ��y
 �ٺ�TeP*���R:��	���qLp�io����B8w��nL?��0��]b��w|�Ɵ�5G��Q��m�u,T�F4\�G���,y>���/�9SG��o���Ê0�>C���ls̢9�9�
:�u<�L���R�)�x�p��\E�|�iR��=z}z��wppᾩ��;h��g��
�����'��\f#�82k"����U�i%/��<�X���ɒ��I�.83^�I�ѩ1�Ŀ�	����R1��S`[��h9E�[�̮7zj������u�&jS�)M�o�N�ͯvpC;�?��w�cb����C��YM�wrاK������,'��� �mt�Q��j��x���d�?PK;��W,Ev�setuptools/windows_support.pyuRMo�@��+�^c���IML�S���xD��n�]�;T��]@Z�v/;3y����ai&$A���aG�#qT���ٌsZ�a�/�VgE��<
����
V��KI��Z��Tmh��"�Bp4�pE���sie�"�c������h4�F�c��C@$�.'�(X $DLbHB�m�dM�HaO����(
ƒ�F'�h�"u�rT�WN����N�����`�@x"�����9CUq|�*��٬�~b4��
SmtT{W0�?d�$�%Ǥ߳�
��q�p#U���[����r5�GN�h���r9�u6w���f���f���ЌΩ�3���z����|��:.��_�W��v�R
iZ�PK;��Wr�7��g!setuptools/_distutils/__init__.pyUPMK�@�ϯ졻 =x<z�*އi'ڰ�ɐ���mwʂ!�G���Aca1�EUXC��9�g%�����u�{�-A�lE���s�dyt���S�ox��B��#��JG�i9�1��􋛦�;�L,-��'����Hj�Q��}����{hw��@
�����0^H��m@�3	����Ӂ�aR�*v}C[�9N	����uﭲ^�?=��K��K}E	��PK;��W�)L��%setuptools/_distutils/_collections.py�Xَ�6}�� �ˁ,̒�A[4A7 I�2Z��LdQ%����{Ͻ�֑�m�@#�w_/���^�,UܙKES�ޘ�[�^�т����س������ >I+s�
����Evq���9��{/��I��O�Z3�ͳ_d]��vy}&�{��	��^8��;���j��K/�j/��!�O�iu/L��Ԉ8eI���EmU���r%����ggL��o=����%r}�ח˔�'�e*$�?.Ǽ7���K�Ӎ���F���7��1GV7n�D���'-�)�e���%˥X�y��S��A�ۨVT�aě0�b���K~�mN[��Yp�����q�S��	AvbL�|C��b�[x�^�j*�s�=��@36���_v��
��f�8U��y.:D]���:�|c+n����u_�葉2�7��R%yL�(�9��:�(��5��u�<����hjb��NY�v�ojȟ�t9`��.H����7��
H?��J�~�I�XklBf����8T�����#��Ǡ�����d'%��	'0
�%ے�%��W��U��w��U��;��u�u\���f�	"�5��OQ�����v��'K��X��*/1��p'�F1bR�<��]������!~s�>�#L�Z2ԧ�~��=�F6%�Z*�VX��]�?Yfы�
B� >��uR��i�+�u���0�
'uł���?E��!�#`�V)0�k�<�ν�;A�/�q���P�-�� ���ʄm�3��kڶÒ�Mߚ��'r��Wp� �֏ډ�ՕX2%��^�v�6�×��@���B<E~a��z%ݱg����n.�y���|�ϗ��F�#���;U��4P�y��{Ӕ;�p~�Ӣ48;eHX���)��P�nx�¦�E��s��Ƌ�ie)*�5���!	�G6�6)�\��fJsh���Zb��ԁ�;5�{���`quѯv%�KEIs�Њo;�M�Z
�@��6�S�<��>�	�I����4�$ϭ�U�qM"l4�D�Ȳ�r-�^��g@�A��	�Y�R ��w t.v��š�;H�t�2I�����M2��4Mm(3�s��C'g �SrJ�{�N�BjDtsє�ˈ��=Ad+o�#q0HΑ�hB����y(`T�(84�7��@QC�.��”�շ�S&M�ѣ��8½PN}�\�o���¯�dB3�8��Hk�8PT�xЄD��,�g�J�"V��P�i[�|R�r͓]D�5ML�1��u/�԰��3�q�ZxQ)iq�D��U�dЩ�?t�,q�T���M��
���𳻞�SF�+�N�����t@���g���}Ҿ<�_IL�&�m6+�mi5�Ѽ���Z̙����)���:�8�y�:叇��%�u����j�vB�q�Qa���ر�_L�T��4	[P���ظ��NK��!#�dTG��H���q�@�+Q���4��2i7|���EEw�m�3w7��/"�v'{f��1s���B�g�0�3�C�5_{�N�wA�xƎS.���~�O9����h׈���[�ь����M�00Ź	ă&�_E�@�l�l�o��"	�5b|[S���1�
t�L��!v��A�M��Ce�z�e��0����n�I�	��VXе�M�!�L1흏q����]kG[F��'�i*f)��)�tʵ��v�W�~�e�Ik�x�U�`�?h�'9��a�D=��Ӝ���m���6�Y�;-�tB0�5���oPK;��W�r��#setuptools/_distutils/_functools.py}T�n�0��+8�`�p�$�.R��vـ�!Qm9�jK�$�݆��Hʱ�6��*R�=�ORmg���4�,�2�⮌Tخ{]zcE�{��i᧰�4����cT�:��V-S�e����[�18�'�AV������:�0V��|A��___Cg��[/�<lfT����J���-��E6����XX�](�CT$�uҦ�2�a�.�i5M���J�T����Y�{��)��IC�@��$>�h��)��*�	_xF[�5�o��XC ;�W�E����^�9ba�^9���	�ϭU|�2P�y�95��E�*��u�m=��Oja�q�%�e�;ɮB7v�)R��
J��w�,�0>�&N��d]��Toj��B�¶���<`S�8D,��b�p���9���N�xA����2�e�C��a��3�e����$��\’X���S��ᖽq��p�ֈ�{����#������$�U�x8�<1	
��z� Iz]�`�sN�U��q
:.
ۃ�c�
QU�D�;�
fo�Ie);O4m�'݁�E	3*��‡G���.M%�E1�ձC�Ș���`,��f�<Γ�*=�oFx���j��$Jk�S��f��^�G}L�CN&��4���cGI����!D��7�e�����qg��w�1i:�g���w9�v�:{%�t� �7féY�PK;��W=&-$+setuptools/_distutils/_log.py��-�/*Q��OO��K����la|��� 3�HC�PK;��W]�;F��&setuptools/_distutils/_macos_compat.pyu�A
� E�9Ev�0��El�!�Ue�ۏ��P��&�O���T2W�S��+�
�\�bE̖S���:Z���h�%����x�n����hkȜPkT��v5��0���e(��k�O�d9��r�j^�A�Q��Ϸ�PK;��WI�z��k	"setuptools/_distutils/_modified.py�VM��@��WX�VIP�N� q�V�P;�L��L4�PʯǞ�4i�+z�f3�����i��O���D?@m�AX�F�i�U�D���5�ӻu��Y���X�kgL��� �1�ZkzXKk�E���ѩ?�'>�f��;�%ӿjء��v�d7�J&8t�eY��vZ��-ь��+p���6��J7Z
�L٭���h�B�M��l�wDN����Q�UL�L�9���Ρ7�j�l�Jʴ��ugpG���:�.�|Ov��Z(@
_�E@*�NvM�6�:̴x:R ��^߶j��u^���:���x��N�2�1������0��g��[e�Vߟ�yv�P�D	D#LV��
���U�(G'���$8%1!@гw��#��E���LޠK<�ʔR��:�Q$G�L��1M
��c{0���f��8ݰK��˴�:Y�7�jJH�Z�1��QS���	Y�^h�j�P��W�r.t#l�xǝa閁��L�7ݨ�y_�8t���Pr9ޱ|3PUA�?~����e���_A���m�7Uq+�`ft��}l��pR�L���!��w��,T{mRq�?��K%mvTk�B;��`�D]�r��Ap~u���-�%�	q�(�,:��8�#��Bc����~O㧝�|4'N�"4�,�i�8�&P��i(�5b�h5
>��P�t��bhzː�P�:z���
�d	�kZy���	���Ӱg%�1�A �f�Dso�5<ƭE����<3�ycϏvԹ?ڐ&����@�IjPK�dĠ{��� �����5����e-F���%溂�	�;�jd�^8�I�3�Cp|�O�k�y��`uD����֜/�0���6J��#��1B��ҊGv�hzi���r.|���~)c���?��d�֜N�(f�Jڽ\�˫"�^b��c�]�4\\!���PK;��W�AA8�L&setuptools/_distutils/_msvccompiler.py�<ks�8��+pteI%2��#3�+߮#+�ر�V����X	I�)RK��u����n$@R�3;[���G���o�r'NDY�I*�`%n�(_�����8��0�;�|?��3���)_q�.�<c���K�™(�0*Y=�Ei(�`��4��\��OD�첬�$g�<�?La�*����D0�@���]R.�KK�,
K^�췼b�2O��/�h�D�^�EI��i���B��%k�D2�tP�Ow��q���Hʒgl�a�(6�|��б�c�E>�5^q�.AN��*�
Oq�2gq�B6��`�p
0" ���*�x�ȫŒ�Z��Vl�0���1�d���#"1^08���Ɋ��`��緜�w�Ͱ�0��B�l]�uK����4�閻���zD�!�D����0��kf��C��iڤ(�b�?60
8ɀ�`^�+�s t�G��^M�yDFv�9�����Si��$3�[v���ҵ��
X�,r�|��/Ԍ �z0|T���n]�2X+��	�C��iMd�WY9b>g
Gp�y�O �>7|���5�~�ɽW��z�2�-89����7�o'#kX�\�v¾��k]�]ꪔ��/�/?����JʁZ����cFˇ�/���>7����G|]��KbC0Џ��Zx�2�g��6dy���<v�����U���y�G�w@]3��@����1N
h���O ����#	�����6B?�#v!d�_6[3ɪ�0���X2�&n�~fo��d�nI�q�z�����?�=>XХ��œ(
��{i :j�%@�<��һ;c�'5�M7knjv�A{�d�t"Uj�9`/���k'�!�#F�&�m�4Y�K������|�M�y�!�6�Y�SmQ�%��$��oмߊ�%���%��s�d�e��(�s��x��Ѝ;R��Ejf�x9P���6Ob��G]�$ݰhf\�WY��J���d�p$�d��LP� MZ���6����0ICp�#�-���qS���@i�%�<�53%Ny��b˳ۤ�3l����W���
�ǗCg�й?0LY�d.-�������H?0��-��yU���6�W)�z�1O2�WF�s��Ct+���Ӂ7u��]�D��u��-x�AT{���*����M��O>f�<����|�&���w[����6}�J2(�<G�� ���ŧ��k�+Ϣ#�g5��d�q�@��D&�>6�=�[y�t�I���7e�%�wY��#��6q�4*�$	?�0��HV�I�������4nd޶�����6Z��,�'����|2�g�Ż����	��&����7�[�p������^���٭r��0|nY�۰�Yå@�y���a�u������>����mT����WSs�������zTî���˾�d��`V�M%3�m��|9��y��6Z
=Ɵ��m	������^��̲$e
�Q��q�ۡ'�F[��08d0�m����9:�����\�.'���/NW�?Ad姘Ҁ��@\�+Dr���{%���WG,0��+�&/�~�0|K.�9�2�|pٔ������<���h����E�T���O5���_��/]�����X�rzt�nj���l��V�|��˔�#m4݂�w-������"G�<h�%y��1u�H��!#膈��f|�,�-��>]Q�b~���/M Z�EI����C��$VU�u���Bՠ��IE��B�-��,���4��5�zJ'��_F�E<	�ZC*d�	��Ql'�m�������0������C h=K𰈖5F�Y��o�A�?�6�D<*s\_E~�|~8}Ôb		�R$��O�e�m��9�]^��zL8yZ�*F-�a���M��eH&�D|_�t����(M�#B�!���Eb���.�Ե�T��D�0
i���r��J��|-��f��h��gm�����[G�іp��<k%]��yfI�=��v	��Sְ��7�|)�������)õ�����.܀ۀpQ�"��p��Bf�(a;�D�%$�w?HqS�����$��*�Aer����vgIɨz�˘•���M���ߴ�h�m�:x1{�U=+0b�g�4��vZ�R���h�8�"`-��Q%���*���;栒ȭN�!�Dl(%[r�P���k]��E|�c�]�
JHҁI.�;݁
������N���bQ���P�aC��\
�b�����O7
T�cJ���4hlXH�ͪ��UT`�T�6�%!M�M�:���<l@��Nt7�M
ۂ2n 廑U���y���@\N�]� H!ц��4�O"
�}#�N�r�PRk@�I���r�p��@9Úf�Ϛ��Er�2�eȼ��l���JĒ���`�(�dL���� ��p���v�{����ng�����]t!5�U�s������=�/���Аb�|��80.�nk'�CɏQ#�����M���ڴ<k�!M*�-.u峏�.h�]O="���#�E�X��{F�iځ��6� ��U��O��HR:(�}�,��'x:aR1z�|��b@~�pm���� ���&��Ԥ����
�]�|
0i�a*��;C�v��1Ũ�ֽTB
��AJ��0*��I����vXr�,��xQ*��~ؠR{p|.����)�?��*{�x�Y��h����9
!6
�{��RE�UCQ�\#�)�N��1PP�I���6���0�FW��_�:����b6����*[@�u#`͖(�w�Q�����Lvq(}�w���^m�(�iDH� �"KL�}���(��[2 ѕnF.�k�1�£�f�K<Y;F2Eю��D�l�éQ��%�|&�r����~TdD�츥�=��t
`sgw����r�t*�TV��^m�ٮ)*1��Lq��T�Ydm�`����
�u�	L�W��ypݬ'�M{oU�d�̼q��­v.���s�cj�8鷙�?�|�H��Ak�NLM���T��W��d5�(�K�D:QJuc�I�C��g��l{pʬ=~���NY�Q��ʰ��v`AX� ��V.�([�/h����:�>�m;,�$������7 �I���������*�T��
��}����vO~�P��rv}���%Чe�Q"�s2��[�"�3H�r��<�9����7��÷����w�h������Ƚ<3�"B�ԥY��|w�N��m�H:M�e��(P����i<O�E����������d��5�L�?�ݩ
m�@�C|�_�;9�0N�35�T}'6�=~=���ON_M�F�G/T<�7�A멅�WB��hg�j�ڼ�:;�Y훭c���[�V=���j��B��3s�m��4��°�/��_'�w��W'Yd�w�c�k���Ӣ�۷)��7�������'�i?�r������G�)�_�sr�����-���?D?9_��C@�[�g�bG�����C^`�3�ݯ|TZ����\#�J#Y�|����6Ou*kO�Fٳ�1VA�_�!C)稕��l��j�v���*��!G����>���<-DɣL&)k:V!�
[�f��")8x�4E@��~{���E���5�b���;��%ˎ�[�F�c�$��ul,@ց��a�Hqdd1aTsT�=jW��X;�"���.�����c�o�=��ca��p��ru�;�׈���E���ڜ��X��`����1HF��1�}F��;�H�g����_'���
�W0�����"d�m���g���g�n�nQQ^.)��ڼ<��S�r�K�T���=��`h�B^
�O�tu8��<
ō��U		aV\YN�>~�J� 	Z�mR�[�ʹa]�$*l+�v����Ư��}H;0��������+�H�\<L�N���c�1���
�>ܔ��D�s$d�3p��K���.�T}
04���U�ƨ��z����}i��-zdYE1/L{0��W���_}��c�S�1q���g�r��.�H�RU*��I�q�O��4
u4q�N����\��[K�›%���V�d�J�gI��Y���"[�$�a�������w�0���
X��"$�%*ʆق���Z��U\}�'����b%R�k����&_3z h��MѺ�2�ؒa�$`t�U���ƥ�"|C�.�b{pm
J��U�w�݊��4Ҏ��o�E��AX��wG��R��B�;2z�>x�&�7ib���Y_5�!53���:�C��
zy:�{���	@�x�����:�h]�>�C؎�$�KPB:v��T*�׮�uW�;Gtځw]4 ��O�_���0����
(ؕ*�?�b�ڽ�c��v�A�M0:y#�;NT��ծ
7�޸�vT�"�?:l�DN��䫥`��Q�)��%�S�&)�Ggu�|9�����\��)G�`����X�1�FO��yr���5ɶ����>:�SO��=@�	֤Ob�'���;xhح+Px��4@�(��;{7�wQ
���m%ؒPZ*�믿�;�ij�!&@��/Kjs�֝��'�aO�r�2��`Iɾj*z�r�8�X��zʟ���9�
v
�q{���){"�W�w�|7�:�-k���vK�C)�=F�K��6|D�DJ'�t�훾z�:n	���@lV�<���[(�
J�Z�:�&��.�i6�N+m�k����Y;2�݄awW3
Vnа�N���+�=����*ym��]`y5���Ϻ��@*\�����L�u��zaU]�2SF
�[�͆o��L�:�r�Q��7j�?j��#���4!�}ڂ��ZŹ+go����t���%���.kv�����th$�5���B��pY�Hi���R�:��Y�`t�O	,J�(�n�D�浏0�
����׵T-eJ�%dH/��.����;
o �ēp�6�����L�9��92ٻ�:��٥Nq7�vg������n!o>Q�	WG�-p��I(�3��K�/Js��5���)#n���V~F5K��*>^�������a_Jכ�t��gt[�2^R�I�G[�>�{O���(�O�O�_��k�V.��kI�W�ϯ�U�-����
�Q��;�Ъȶ�a�/�s��?��LT_3Ҍ�"�Ĺk�j��~���kJZ�7�V��B�e�8��6��W��+ƍ�9��*v	�tF7��Go�T�޷4�	�=�.���j8�|����f�҆��
�p�.E�7�l�j�%��7fa���n�^[٬ý�Sv�mR��yZ�U#�H�~��Uea�W`=��@Դ[��������,�11�ye����H�0#Ve"�s�4`�����;���ṯ�(�7�O��Fl�Q�M��Ձ������ƹ�R>`T�*����7wyc������
���1���R�4A�E#��YdT�V�.�K���>;'�Ǫ5*K�;8�>�NK��]|�E
�6��H�[�)����q�������_�@��C��6ޙ�D�~�ێ���/#�Q�����z�yi��J{��P����BkAq#����h?���Z��Sėy��j=�>
�04l�cإ�B���z�@�K�昆Z�g��.�*�y��B�:6E�	ݢW��'#9uy���%�SI.����Cr��C�yC]{�=`<BB���3��&4ZP��f�q���Nb����5 z�{2��!@�l	���*�[~�Em���;�,_�Պ$Fv�a7]���8<ų2�2�>gHE�PK;��W��GJq
|!%setuptools/_distutils/archive_util.py�YY��F~��a�Lh�q�v=x�1v�G���ْz�"69y�}��OJ�xX=HduuU�W�8�+��q��*x_n�X�[��r8��ؔ�l��m��^�A6f����b��k��ϲӃy4l��T��]�a۲"��(���FU�����I��8��5ꠢh����"���vE��}�z��g�϶Q��W8.o�����f������LT�'�ع�mLJ��\���N�c 4�w���n����;+�]�䟒��]@j��-�Ě-ax��U
3"�+�`ދa��9����D�/};v����9�=e��4�5�]S�OOd5|w��I5��g�i�h�(�7q4�lr4A 3�v�A/�~q��e<o����aF%�9�����B�v��[�4!�ҚWb��B#ge�뀔Z���8gw�_�J,����~l��7�_ �\�=G�ޯ1�0pڵJ�U}p�E�1�2��	r�MDcS���$V���􀥑�ݨ�L�	�������,^��?����v<��6�[0��)�� �
�@	�C�7��aض
��x�!H�\�b	)���
v�7UlhQ	n����� ��)��)������(�`Wk:�o�d%�gQ�r�{�]�JԬ�(�1��ҎC7��v}ؘ}'W�20�;����l��;��%��5\+�̃h�)��
�X}&�`���gF(���(���y�~�Y��8�O�ܓ�Mr?J��?������Z
#����{��/�m'��*���>`[_˯��ِl�)����k�1wr�%�x��]�/�L�bG�f5�v��x�q�f	K$��"nG��Cm�[qPi�.�`��z��R7CG����I�;T�F��
�B�4�
S:h!6���@�`�R���+p��49Q�O�P"GoB��THΩq�\��U�"n��iH*�)�f�d�B7Y7D?0D�Kk�&�TZ�n0@���׬j�j0.P��,��Y�i�ڱ�7�Y%�ù+����6~A%��nQ���$FV���	f�#����\�{~���`����Z�����&���J�(�����	z^h΅=���D39|p����E��8M]���q��^�J��l�SC��p����(k��S�wAz�ov跓hY�GB�4�Z8
%��ߘ7��/����OtZ�pE/�M��Nw��>vn��6ڧ1;	Yo��i��(,]Rm/�_$S��;t�k��#=���_��<['Sz~;U )l��G�y$B¹�x�L���"�9�]�A5������NP����Sl@
�{j�3b��@��D��F����][�@0���w\�|U��i(Ů �?]��]1u�Ktp�l��x�[����L	4-�L��D���@m���@�q�/I5SSxC�K�sh]bZ���YZ tt�ic=t1����@5[Y��D(�J{,5	4�&�!��Ŏ~�{6�X�'%��l�Y�����v���8:�Zu�]Ǻ~�[�}��<��L;=�)�'��Ǐ����ڶ#��ؔ�Rm!���z�
�«zuDšyj�6���U\L�i�v*��Q,����M	��UK���Eo�a]<��4qaba
�yb<!�� ��'�V�l��T�F���M���NF�N�4�.օ�ęl�BC-u�VU��!����dQ�ݳ�?'��Tpa���$����g�3e��<����ջ�˷����WLf���r'f���� ��~z�&0~��(H���<$6(r��t%~0�1ZE��k7ɇ�ne�*��^c�,��D��r��gWz�	<$>��"ଉ��rW�*��@�=�o��ټ�k�vj����6���@�s�6}����s�#�{@7�9�O*�N$�y��n��%�v�4E�޿��կ�˷?��ǫ?��T�X�^�4����:�x���\l�K�)�g��ܴ�EH�DI?Α�)�����y
�L�<Tv�-G�����y��n�!�J�!�]����r+�ۥ�X��A���Qu���h�MרHt��6�涁��@ns�
u(���x��Md�11�+;�s�̬i9�4@������=���V"ح���0!�β_=���W��4��i��p��|�?�L�c��tbe�{۱+y��i�P9��fĿF�g��\�R#�-}��u�������@�X�fc���.^}6����=Z٭Q�ǛD�C��ʖh�W�Z����IQ�=�>t�$�[n�ޖ
�pZ	PAL�`!�"��[�=�=@J�l�ԛ�F�K]q��D�gj����G%(F�t�t[VR�ǁ鋉���﹬Z��L�Ht@�)�4x�
ݭ8���2���h��l�._��r��ho�(}�o�i��8��r_�[u#xN3[�Y+�w��f��j����f��i'�7����G_�K����n.3�Y`��.�\��I�ԡn&��z��Em}��y2��	��ѹċ6e�k={cB�ܿ|�M��d����	e�~5z��9���K�L�-z��n<��5|�!X�h�b'�n��-�YoNz�v^;������8P����w�i��i��?���t��[���@6�`~:��P�PK;��W��Dc$�9%setuptools/_distutils/bcppcompiler.py�[ko�F��_1�Q���J���za,�n��n�	vS$�a9���Ҳޢ�}�sf�^�$m�l��9s��o^.���MۨL��IU%e^�L֋�MY4�*������Hon�HąPy��\bI��B�;��������b�d�֋]Y�K�<{&�Q��r�\,.Ļ��c�ۓx}ʤ�Gy(tYDbk�
�!pe����3�뇤�W�,/���V�b��SU˄��nkvU�͔>,N���S@��LŹ^b>|YY�k��{I�jh��o�����kUb+�����Ʋcin/���2�e!�>�m�
���ǂ1܁f�P�6�&n���Lq���U�����WB\^~���b��ʺ�v��q]�z���e.ֲ�˚�JoÅ��w��e�D�����V�����Sq_�
﷬�3ܹ���e��jY�e"�ޔ3�n�a͆Ps��j��pV��eW�y�/�r��#��ȱ��K_�d.22��$n�?6%*j����X���ޮm�Z���LB!W:������6�KA��h��v�Q5Q���y�u8\'�ڒ��ʶ�	������Y�@���.D�łEK|{�#m�yue�[.��I-i$��M�b�,YC%]x��ϡ�'�5��ݩ��
��5�S~>j�0X@l�S%ŵ��yw!���FhI�v貇
5e�e
IK�����wk!��^m]�*�ɂ���=��t#!�mo3��U ��\�&@�_�*5��EԂ�e��XLFB�$���0��%��	22��L�omA�g��8��?@<�n�\��K�O�z�`�v�QH5 �g���'�‚�#�;�ڿ��(��Vq'i��",��v�I�iaō`�";�!���.�.�bh���
굸
�Ipg_U��eD�x��������p~����sI�B����O��gXk�_0��zNZ�z���gclyS���D�Ɠ��#ߔl2������2�Y�f��C+��]ݳ�k��KG��Ī�Rl6�P�fj��"��-��~��>m궠���5�I[�t���v���f7��r���|!�P��F��3$��\VqsX{۝�qꬥ�i�m\���d���k��LB۠�$�0`�^Q�٦3,9��5Ғ��f��
�@
A;��䛗D���mU��b���g�liA�����Էa��p�#<��zkn����n<�¿�/�V�ۻI�ݏ �c�K��,��:��]e6}_x{LJw�g�~V�yfhk�~<���&�]����6�&V;�r��?��Yn��(���͟_��ɨ���T�`���� 4�&!�_�qR�z�PI֦���_�ݡ���:�P+����]	&L_"�E�?��A+"�X��"[
�ćm�2�,��*�VG�ܐQ޿h�Q͡6>���>y:B�5 h��K�qE'��e��ΐ�j��`��4<��=4�i�� yF�\%x@&ֲbfs��~�
�t s�[���c"�F�S�8���p���ɑ��L:[�����\鯃��Ǘz�^�-�x5�
\nf�f���
��y����y�W[	�����8�hi�F~I߫j�et#�=�������F?&f��Z�`Jc�íf��� Cณ�
X/FI5�1�"B`�7��:�Dr
�ͅ,q���{�NJ)�s�"4+��t��v���#/#��ܕK6/���j�׊�4���=����X!��3�k�П��HNޑ@)ӧ�g[B�]Ky�W㘡=4טF?�"�
2�0t,�ʚM@
"ُ�|;7�K�6�7��/JcS�5MH��:�g��B�F[D��Xe�d����3%��%�&�"���c�����r_���@�Y��Ҥ�Sy�s�9��Kd��1��V���"V�B��&~�W6���6w�s�W˱�����56��j��z@��(�bH�Y߀|sǕ�2�s�}A�~�
sk��ٷ�>��
�y{�q"��3�,���P�?�|�3������1-�D��bE��Fn��Iۺ��RKH�I���{�"�2.��]��El�&`���l�7f��;�x�v�u��pN���	�}�~|e�!w���k�����e��VR��wF��1����~**�t!
�n�4u&���V�:�
�/#��,;taS����5�2\R�PQ��k-¶�l����ZN)�	�XX��\����
(U:����l}B�d�N�q���q&I�[x�\n�X"�|�ѧ|[f��$���M#�j�b�Γ�H��{D�Π�|%\�aWfYydߐ!���Ťe�0aǡh��h��C�„cu�t�^V�[���S�����o\�`��A����m�9��nM�ES���.�����l��4���N����R��p�+�=�w��w�oSG˖��H��;�"�k��>	�=�A)J_�}����O���W3��(4�c��8~�2��g�>s>u�d��t{5
/��槡���Ø�(�b7�w_�R ���E�0�u*Iƭ���#%LT��
%#.�|�7�$�S��8&J"W�	>�.R�2OGt��&�(�xo^�&�0��n<
	�tQ������
H�n_ܭ�pp*Z��j)��A����@��Iu��Cz>�� UO_}x����L傸.P�6�	���E��kB�����߂��t���1�2�j�a��D�.u�"��%&�Y�n�j,��(�!��6���f�y@W$b�Fˣ� SW�<���K�{I�����殎���Жa2�40U����'U����V���!N��ʐ���Z�Uy�w���r��<+�jN#|jQ�2g�,�x�l��+������c�}rk�et����X��@-��6�7)_���ӭ�%�Q��E�-d-��� �X��%C��(|��r�r'�3�TO�.����K�Ј-�X���� %�����k��?ǹi��h��jO6���*4E�\�2S9D)�bMn�"`��{$n���p�Z�	��V	��QM�";�ձ�����9�K[�	9��jZl	L~�
���'�)#���
�G���x��.җ��ҁ(��l5���l%�j�9�fJ?����Eq)��C����uIs$C@[��$f��z�����0Ѱ�l�*�����a8|E�*6c����'�G�isJ��X9p�<�Y��Z�<�<�Q0	L��v�(�n��ԄX}Z�fQ��ʋ;���q���-J��)р�V;3Kfe$�*��A>nN������TV��:<��;M:k��f�a΄o��4k������f�2�w�ߘ���
�Y�L���R��0�b�B�Y^��(r��L�
H�-{����'^e6p �LaE�f+�a`FҾ�~��$o�qW肋*]Dl�+a���˽�s&�i�)�p
�������ٞV_	9�!o�^܍۱g ٺ�ygkq.!�don�o���=JW�—~����U��t����z<�/�8Ѹ��>{:��N���p�m�`�77a�D��p����<4�X�"�*��F�e�H�o+Ɉme�C���؁6ȴ#}by�j�{-{�~��.ؒ^
��v�ZBf�H�눷'��+��W��<wa�l;��kw��U�r��N�8X�D�p,�=�˕mЩTƌ�A���"�\��q�f'F�n��"�/�8�h��%��J��5��ES�� ��\{s�}Bc'�8��1���D���f��g�@����H�52G�����ה�s�˦�78�7��r]!���d�E	�9c�:�>��9���̘4K;A>Bxt���eY�۲���DžxSV4��Rr�.������O��C3�oe�9j��M(�4��]ו&2ڊ�c����-]������Qw�5>�{��#�9�LB�4��A&e׳%WS��jO4H���˩Y��d�X?FlL[
�]�L��{�,�Xy~�p����;Q�j���7C�n��ɒ����o��F���h�6S����͈�qw�$��H/�� B��o�Y>��j�
J@#�<Ղ�]:1��ȣ�=��++}��ɓ�=�C8�})�"�W��t����-�3z�q��yj�Ǡ�F�GC>�^�!�E&(���
��o0���7�
��̌,Ġ����7V����]-E�߿��������D��������	?���8I3Y���Hol]�9�����2�^�u0��Dzb=��|$-q��IIΠldh0Y��Wƞ�WB*��e@sf��|�ʧ��0#g~|�
���E��RMwM�vR�~��4
��A�e�
t�0��泉XD��8{�A�1��CF�I�>��}f�fy�G�4��E3?B��Ѕo[V��PK;��W��T�3�"setuptools/_distutils/ccompiler.py�}m������\%.e9u��ճ��%��Ŷ\���j�b��p^�P+>)���י�%��=����=3=�>==��d]�ݾ+�v��vW��99yYW]VTm��<�'Y�d��k��KVY뒼��6鮳.Y�MQ9��%Eչf���dS7��v�hRQWɶ^�r1�LNN��n��=��k�k��v�5UQ]�''���&�4u�&�6=I�G�%��ӓo���������꫸��e���cᆳ�{��L���J�@ȋ
�����~�T��&~�˺ky���­�m�n]��j�N��o�]Yt�_�u����}p���~�e}���ד�^A���4MX���ֹ�U����o��C��:x�&X�,[V�u'X�]$��e['�Y����%8��;$[�]��6ٷ0�Ձ���kƀ���a80�"O���`�E�N�qZ�B�.˯	�z�U0���A�#�feI�`�J �����@�}Q����
��.�5��.�8�}��uM��u ���(����Ё�m���3�(/�k��غ)�fyS�U��G�&×�!��
��Z��B�gGDcpY�	=���ED��>[�B�����x_���<H�-��`͉��5��Β�z�fD5dV�d�3IF����İ�B����T��;7ŕ�d�}W��@U���kͨ��u'�n�;a��fUG�D9����,�O�V7ma����1�u�a:\�]ݶŪtjN~F��W:�����X���*oL�sm��Wc�LJ�i��}�&V,s��_;ܸ����+�uAL�5�$mp�C��n�oA@-��t6M@J�3���̈�@
u_Y"T����kwu�8D���@,��CD�H.��`�J<?���h���;X�j]�D���չH�'0�ǴC�n[�B0�iY�x�s!I��j�:mN��́�V��+�ަ̮�^�w�u�c"6@d�W,��؞IU��8tN��*>���6���cΔ���u3�	�y��&�BX�iA&a�Z˜�FAU6M�V�Â`��;�nȚ����s� ��:��yr����9���������7�ba���n�(�=4�t�0
P��!/����@;UH3�8�A��}~��plQ��0@���	A�`w��e���6{P� ��(;WL��Z�D? ��i��w�( o3�
t�b�Yu�Gs�66	��U��rf@� 
P�'��$J?\%�uS\]w� �����P���vn1,=?�N�����—`�=�?L���0
⨉.n��kYb�c�R�c`�q
r4P^K�\�w��^hQ�9�)��|��V���P�;��jQG�GK��1�u�*�~�׶!���T�Y�Z�20��\f1�Fc�6�¹��Z�"A��̋�`l����tZ��Zj�-*&QV��@b\;p0ʖ%i��K��s#��4��UF���"���ش�6��y�K��%��}�}�+ 94��u�;h��HZ\	4z�p�{������d��/�������P��6�	��F�`9�m�z��Jg�:(��]vYs�d�.�A��zj�R�X7k�܃>�iu�;�`b9���q�vy�V��[�
��3T�0ݯ`��C��"C��@
hD����>%A2Y��]�5�B�r��<.W\�"���O�/���C��.�A�L�?{�4~
ݍ=��a��(�_�q�2\$���6ő�;_���E%6|�mj�)x��<�`%b���Nl���:W�����,�E~���r3GѼys�)H�c���W`����=���BZ���5}/���t/��Ls�ٻ}�ӝ��eG
=��ځ�KCu�s�E�o��(�cD��BבE+cא����X�9���\�'3�D��'l9|v��ے�,DV�݌x�a�@O��5�\A&O&b%	�4�aW9X5	�=���0yϣQ�1v�5&�x��a�8�H��rq�F�`�F�/�GE.���{��B��O�vN����C�L|1Q�d2�:<2��c�ᡍur8�	`8ph���
����:��t�i����J4~&���w���iь�4[,\����*�#�̼,3������Zq$pP{詧F�yP`,C���__��w� Y�oZ�O�܀Cz՚^@�
�?�I���4n.4��$��z\+v+�;��#�)�=�DW�2!��@�Ú�Xᵇc�QH�(�v�� ��v;W�[5�}�[�����/2�_��~(iF�ǵhj�
ٕ�g
�^>{���W�f���/o<�B��CK�aȄ��8(q���d����SO��ѷS��m&V0<��9"̓Wo~x���Z׷- ��`j��<�QE�1T�1�R&��O9w��	�e��c�N;�Nר���Kr���p��|W�@7;t��yr�8׮�/;���,G	��A����q�g��7-P�5���:U���1
�1�߅����Yn���ZÜM�A��e6��H�p~0��	�N�4�bP1�J�V�r}���ui��:��|�]S �-���=l�aS>�ȅu��}����撢��)�ސ�1�S?�~|�.k��@3^ݦ��NQ�s�P�H9�"��~�P��1�O�!(t�~�PЅ�m\P�����F<�_�0�bTC���xC����ş&+��3Za���Z��y�̮�����������~�IbҒc��%��t�\����x�w�5�jԞ
̀@T���v�rb�`;d)�N������?2n0�zI��4C�����iD�Y�W�-�!`��O�%od�]�oL�a��"y~�k�
0�x�K�L��{Y_V��]8�%PL,�P�O�w���*�=� ��x���0j��B�wqz��U�|rM�aC�4�SBV~�ǹpȏ�3ro��"��c�c�
9t�l�$Ȝ�<dR����}:�����gï=�^w���1$2	x�뀋�*�>�Od�xvLy4�O.��!	릢8:O& oh���?M&�c-�$s0S�W��	n�[j��f�;;K����dD:�H���ױ��	�'4�1�=��b0WZ��Nw����跙�ǫm6H�8WK)���S���Je��!�� �K��Ͳi�{�Z�yxj�Y�������:�3@�M��Έ��v���=hiO���kP�t�X>d+���g�l��Yܻ�-`ޱ8�y�_�+��^ĚHۚE%�T��Ą�ƆTM�+Z�QH�DzO��s"X�V�\�75�`�Z�(d��pH�1}��fC������B_o�i���gj��O��ΦDG:~2��@n���[�a$�.�Y�� �ߗ]�"�G��&�1������K�~�����FA�0�y�8���R�=s��̳�lF��d\�@�4l�!�
q3p[��z�4�B5��&���k��)���x�,�)VƩJ�5 �BP"�CbEK	>�>�88 �6�Ca"5(�y_�׭�i�@&�Jlr��9r,p$Q�9����?v��QU�'"*��m��͞�����Ed
O&i`��$9��·�cbD�~��_`�N�~�;N7�/�Z"�ؘ���=Y��)-98zhX���:'�$I1S�3Գ�f��p`�׼��E�m���]�l�Մ��Z��C�xĄ���J�kKՙl�͜��*��05�m���h�
��0�{�9�ђ��7(Pdm�Ȧ7"✓�N��i���0�b��h�Ȋ�SžlѶLli�ofb?z�fV�ؤ
�$E�E
I�[gE�2�k�gF��{�L�ɊĐ���;i٣a�a'�(�(o_l=n>Y0�)ȃ�|�#��������T�)���.�6�{�]��3��iEѺh�(DŽ�:֧�CB����vn��X�VΨdz����]:�c��&�	[�$>J�?���JǶ������,�u���+����G{G���{�P�MC���}�ی)�(e�$]�飔`o'rT	��Z��I���j6T������k�qV[D�#C�J�r�4B�|Th�<<O
��I�0�=�qd����T�,Y,����lpgUV�W{�Ò-��[�c�jSH���4�d��ߺ��F4�~I��ł�6�q,�&�ҡ��/z<��}�P�q���*`/�	Q�
$��q�&帢Q��:K�kڡ>�ݏF�?�͓ 1��eB��`�1L����r�+X��"dO��ꃧp��K}Q�@�v����(�
��6+��;=��˿���<
��C�t��5r����&���{U�-gR����a6��$����E��A����w��#̂�^lx���C����u������S�t�@1��L��$
�J7��9l<�S���3j�J�;q�
�Xf��ݲ�Q�W�Z���R2R��8��[���k�3L�B�j��ʥ���`��%Ɗ�K�a��K@>�l�Lx��pv�<n��%:��0	�+�foo�|.�;T<�Y3a��S������92�s�3ϙ�m|S:�_8����O1]���U�!�h~����&�p0v]ӧ���,���TM�K!^��'~rƒ��n�Ǔ���g{�腈�rĒ>�
�ۢ}S�l��
	i"�ۄi��I�3Fe�ʭ��)�Dm1��Qa�V�XD�0�st:�?���M�/g�n5�ԂbC���x"1@�*|�(Q� �o�z�z�'w�*O��5F�C�dӐ�K�t��[![��vs���c��2�(�75���kfX9��;*ң��޲���g�;k�w���ߎ�D8�]�~n�$�D��;:n��k(#��2blv���4Im60���]�É��x�@�噙��I�Bn{S�b���EEZ: ��QT�VsLF�,��E}x\E-?c1u߇7��,�N�lj� �̢~H�G�Tm$�Qd_T�}���z4%zƢ�d,�G�ݏف�6r.�DY_��V3mG]�Sxv-'��2�i�Z�\��!�Y�(����z�����EG��(H�S��+K=̃?#3���Mnڑ��?���O��#
�S�)�g���@����^$؉�r&;:0��.�����:d]�g�Vk���b<X�Eۚ��m�$j����5�[��0��a}/����Aÿ(:'2PX��“,�A��fп�O
�UvT��b�.�;�4�߾l$)��Cz&���)��g�!�t�{��$
��8�?Q%Zp,��P��ޖ���Ք�HO����"r��&8�؈~��6&-���'�:a��*{�M���x�clcs�h�0��i������c>�f�a���VL<̣�Yֻ�+���a-oȄ6a��~�	�Qs���Ez������ׅ�ԡg�E-?_����N���h�C�/ž]����	�
�]���(��i�F�.^�o&ЪF��ă�&�zk?	Y����
f�'㍾@���GL��b� ��>�`n�����k5�p�s�5��D����tvܴ�{����c���jfRS�0�"S1l�lq��	-֮��R�iU��ೱ��G6�+,�{�l�]�aQʷ���#�N�xr�,����;��>+���y.„}�\�jz�b$6!�08)���FckS�j�>$�p���pJ���Y�&Î���<�1g����:S�5`kq应B���9�Z�,Ff��w�t5L������a{h��C�&��]g�=
��Y-$L��C��K����G%�G�b#U�8���!�<6:�x&�	�چ�
SR�"��@H��^�v�G�&W�]�e�L��>��㓲�Q�˦3�[~ld��hv�mSt���z�z�_Fr�Cۭ1RX�д�#��샀�G�i�@tX�M��K�j,}�S�.D�9�=��>�=_��#���OH!�8%�.���c��D����@����O l��Gg\@�xjUt�I��V1>�*�]|�w�.C
a�1��#�\RdA�YV&�cP�u#�VI�IJ���N��g+��1nUb���R�5��)jg���,PY?9���z 9ь����\�8�ME拘�m�^��$��3����v���\2}�h|D��CB� z e��g5�Of&ᣞv�����=7dR2U�q(U9E�:��$�QF�%���uS\|�
���`��P��9�y�ʚE8��#�����.�oXO��K�����c�S�5�m㉜#��9J���&/�[>}Z��K�UC6,�W��Uh��J�D��L�l����Ю�3�B���D*퉝xD��G��y
�o�c�]��V�dh�M���|Mt��Y|���!`N��G*��5WnE�z�z��􋭩��q�|p�PJ�V�����U]�.�x)���S�Ǔf{��E����$)FY^e
,�n�yn�c����O#�";�&S�f���L�
2m�klq
��Tq�NԌ�͠�<��N\|#$��B!H���-�CQRZ�0�g�k�+�h��
I�͠����Z������u���.&�a����K�Vk�҆�����`���'V��s`1b�[=v�k���l�T+f�P�^5
�+�r��Y���̅��"2h(��{V\vy�_��9ŕ�۝1*�q��5Gj�2O���`�q���Si~H57Zg��3����Tu�j�
�ڧꛒ�4��v�)��a
[��f�UUG���\ӔDI��ɇύ�l�O��)zqna�D޷�|4���O9$Kq�6E���I'k��t(�d���;��kZfM�|�1����pģ�cQEe�[����s��\g{t5ƶc�K=�llr��k�᷎�|�c����E�A�ȡ�z
S0e�Z�AGQ|q�x('�%�O�ӷ"���悞�FA�e�Y���1V9{3�q�YG1���q�
��U��pT��7��k�tm��p�c�mC���Q�w4�B(��K�̤�jp����ؘ����w�I��I��VD0�؟KRxY�gH�|P)���mT�#�W�/�r/����b4����͈\��(-X����c(�n
@
�={����V��(Ջ�����#%(�?
TbY�}�g@u�X�OqK��ރ")F[gLݨ��54\7�q�k�������Uz>h��?�y���i�#L�W�k*�K�q�]��O��kЭ���C��b�ؠө&w��dz^�1hj�`��M���?|��/_-�|�|�#趉�r�Ol�o^���M#Yzn��O_�|���_|�%�E�L9[�H,����D��s��y�}~��m�
Bfh".�o�����Xvn��諑����HT���)9U/�l���C�C��O�;8�	�u�Ш�:��)٬�MJ9��/���K.����u$�������5z�"���/�k���tMV�eƻ�F!����gDB�y�u�8�evW�&A�Pj7�\ű2T��s&�Ժ�0�?Էx"L�UĤ�B��=�S�@؂�jG�˺�a
d2�$�&cbGg��.T�@�7☠��`�f
$�c'6��9�̻T���X�~�V�&��1���%*gP�z'�4ŖFv ڄ�GF'G�G�>)��2n�r�,�>�?T��uQu�^����RO�����B�X5�G6@��S��tﳪSb_̢�U=�֐�?~ћκ�N�0��5�OR�c�{.�����n��q��7C�t���גn/���_Y�S�r��D�yIj��;�jBYG:'i�ȳ�^M@%��N� ۳�Qq�ܤ춇Q�ݾi�_9���7�ₒ�<��$�MF$�V��'x�Y�T���백O_����\kZ).��`����޷v��84]Ħ�2��Ǭ�c�z�'�ؓ�1i�w��[���I�G�X7%j���H
�@㩴�)/�t�����G7�Xr�7�ɋ���]��G{��"���Y�.,Q�ܬPx1g��<���T�������Q���7i�ت֏�k�ۮ��t��#ݿ�BC��": ~ ���:���#�B�C�w*%D~[��+�3���)��3�~jt�(�z@��Ef�bQ
77�
�St�
>
!�lnk�g)~�[%��^׺����":V�IS��f9��c5�F]F[�)P�G�8���%U�{�s��=��x�I#�z�c^;]p�"��t��K%�����<y��?
��cu��c������(�F�wZ���/�� ��*9r|qmQeG���TC=�~)��ڔE����d��<#W�/���RN���G��:�^	U��ݰ�<�bcsI�L.�$~.e&�G o����A���1>{��`:��{��Vhv�y���zƑ%9�m=G	=�\�z��!��.B������ڰaȖ�P��>2�x[�����^U������;��X�~p�T���b"��[)���eo�Q,����ѓ3��7������\ä?k~������q�h"��
I�]D�\��?�#;r�t��_�4�d�ɵ���_����`^��#�?f`�8�z�n��#�j��7�y�!�u��n���H�.�@�A�&x���t��;|$g��R�6�5���7z#!2���0�f����K�IN��'����V�$����O��a�� O�U2�A�ь�u����H�[��]M�#��m�A��f����jC�*Z	/|�sX�Q�^��n�`Z��=D^�D�Y3ۮ��?���|���+"��-����5iA�_4��ۍ�go�W�-�	G@�,$�s�f�n}�F��G�`�c����IG���K���gNH	g��v�zrZl�6�|W�[��	ޢ�}�rrr�i����OZ��+���'�7�c�<:,
a��>��9^Z#x��x?�+ya<3��L��>}q���؎��p-�ܗ}�\�e��L�����h�$Ȼ8%��H
 ά�	��'G�����=`�;����]�15�G�}���Coz �2�011e.��=Mc[���h�<L����P넙�p��s2��M����;:{��NNu4���L�= �=���ƑM�]»Ͼ��:��C�X�&��f.�T;_���p��L�6��ƫ���A3N_��/�Ģ�m�7$eI�
JR�{?oȉ�0�;>�̑$��K��Po3�솾��Z��5�j������9;K��L�+W9��)QH?^�i���ߑ�J�*�~z���2�T`��Y��f�3�Ȑ�/ܭB���r}.��I�<T��0W�����4��vGʛ,�gx7zr�?�E��9�LWq%�ToJm�@gq����x��8�h�_+��'7>KX_&z���|�� ��0��zC�G��7����n�"Q�������60����ʌ*��m[���a��i|c�M���h�N�}e(�&ޣ��ee��R3X�s��X�����9�<�pa.>u[i���4t��M�E���X�j������>�]���ӌ��ɗ+�/њ��'hli!���/6�"�I�PO�z�x�Ц�zJJ)uj��7��
O7�~c��2�E���>��(0��2�v�ք�uY����$b����Yq��%v�,�3�_ǧ�=x���Y$R8eE�H��e�p�&�lTp�UU"�a$�u�K�Fc���A�h2��	���i0
���L���͝;R�����G��)Z>��m�%*�e�*T�8.@����Z/Y{�&��X�ˌ?b�O�pMwH�wF��̤e�X�o���t	;_J���/=��4����&Fqw1�b��?!D=k�g���pV*w��n��5s��_M\�-�o�T���|�����_��2�����$\)0�ۯ�$����l�`�I��8!Da!��aM�A���)z�GZ�\UD�婢J�E�9��=F~d���_W�/B�f\V�U��uU7�Q	��:�z���qO����_[�s��0��Y����w���;v"��5%V���{�˪^҃>}�C���q~J�WxTa�.#��Y�.Z�2�dz�^�%�?��M���N���2O�| �I�p��b~Չ5��gD��3����B�^�Q��φ[����R�(ϊyzz�����d�G��׶M9�N's=Z����P�|@|�v��dj1�c�����L�h�Ns��
�������_M<z���{���|c&Ml�_���e���	�pQ����%8c^S>Dx;��G��^m��ۏ�����e?UU並�lۂ�Iq܋�fI�jA��z�g��]`�#����x�K� t�՗_��:ڃ�'1�t�)m���EہVktoB�~ΓOڿV�=ǐXj��1 ;O�-����Cd�W���N��h�����z�<yrsKg��Щ
���&��x������uTNo�-��x7���YfmA,\|Z��6=H���(����lG[�@�({�O�Nwu[|@w��>̠!'��)�l��ٝ�?���k34;<�L�<���bP��E򆯛m���{�AA�ޞ���������|Vdq�����fڸK�I�Wh�'*Py��"�� �O���B��s������
*~����?��n7I�p�шסh��u<�t�:�%�g�}��p�&��`<�n�0���V��r���|M5�\K�sֽ_X�I�Ɯ2�����{F���/S�U��˭�C"�7���_}����R�$0��3����z��w-�}ѷ6tj����#�����m�z�݁�%-�'"?GWY�_h��>��¿���F�q��H��r�!;D�|�5nA\�zP>v>j��<���xr����D<�����R5z-�0{x(�O�˔s@$0�Ղy\�7�Ae�2�F�2��t���թ�L�m�d�X��KN�NCj�[т�A�^�Na9FY�N5Ƌ�h�<�s��"%���:E�Q9��Y�ʰ->)���-�7�{Cp�X���tɟ�J^>}�LC@~1�����uӗ�ʀ�%�J���wo����I��0F���&�]��qy���<�o�����c����1b������[D~Q7%�I�4��Hp���=� ��G;+\��Ӑ�fKmb����ڕ�3��,`wR��E����9:�X|�&?�����3�$���KR|O�7Ŋ�T�°���eC]�>�����h��q�_#���$!gr�P{��&��āQ�M�>���췖���p� 6cv\P��.Ao�L'��b�M��Up�R�|w��;��-@la̒K��Rw`S�*.��������w��N�9NA��#0�������O0�Vu��V�~�B�~s��k�;��\&�N��u�����Q=:��Q[\�KˀM��T�8_,ڔ}d�)!�a�rT�3�zԸU��Y��K��*堬t��'�2,����XlCL�&�Y�\�Q��$I#q�$��c;)H�$��vR��6{bTc:#�7I�e��G�Ww��@�l�#���Oj�Mr��z�4�ډ�+9��������n4q��V�`�N2vc�����-��bܼ�L�☝�9�Ւ�"I�@<&��Y��bI�u��
�9v��c�NQ��$���:�M�����&Z�R5���4�Hybܚ����q��+���oq�)���r���0GIj^��K��˥��P�d���4-C�F���(^n1���k곷,��~K F69&��<\�s`�LX����^�ml���I�:&��YF���Is���8��?�<>d���̜�Ӛ�i{��
ld�I��D�zt�䛤%��2��l~��nE�
ͻ\X߂#��e�!-��n��_j��K�ߙ|\7�JK�^͓����3���}G��Y�,���������j:��.���u�Bl�P����k�"=7G����'�r۹xKR-�qq-USx;��SRŬ%���˟�^	 �)sj=^�,�a�&��Y�_�uѠ�l
��az����M\�@���?� �(#���+�s��׾T2�*�HJ1�5�khW䌾�� ��lP��|W���F�l�b�L1����dѵ�xq�M)�r}lḆ0`�;�d���*�����՚J���q�u��cOiԸ�e�H�7l�� ��D�zu�	T#���LA+�Үt�!#u2:=��c>{��u�VDS�q�p�&B0^x�فX�s�]H����5�&;<�F%̓U-��A�c��ۻ�d�q��}�[����hn�P���|�:�g�[��&��bYg�Ҷ�;����
Gk���N+�:
�Io��d
ȡ�X�I�����pG�q��:�^G�fh���{_��$���?�~z5ÿ>�犺�%q�
um��8)��d�>q�
'GA�(<+�
��#iI�;*Knԟ��L��"y~�X��Tj�!J�����,Djy�it�נ��7	�g��y[� # �ZսR��F��؈xTc�
�<|Bl��^P��n����e_w6�3���.��ܟ��uX쪖;S3<�pH^s�dzr�
ѷ�w���̓Pqa�!ˏ\@��Ud*/��5Y�e�b�H;c�س�!q�MZ&k�b����(�����:�2�2]��ɽ�����KÑ�W��4��瘿�g}�X��~�a��#% 6�����rĀ'�
og�ksA�c�u����Ѣ�E�d�DT�������7J&>=r�)gH}c�`v)v�qY�.��Э`����ѫ�̄��O�K#����?a�=�'�R�Zd.yT�$����Q�u�FM*XU�hK�
�3y]K9�:i�������N��(�}B�9$����.�s)-B�
G@�l*�9�nx��y����	�s��">rL����h�0w�^E��됻$��,Ǵ�_�v�"�i�������Z�@�*,�AA�}��M���%m�l31(�� ����`˥|�����h
i�d��-����(�a�&U��\�=I&�G�a�����,`����]w5��š��Hg�'�PK;��W�2���Esetuptools/_distutils/cmd.py�<ێ�F���}h���?�`��:�g� v��@K�-��$��Ȋ�~��7�;ط`["�������N����0Um6ũ����o�R5�zݞNyS��΍���.7��}�ӣ"��M�������>?��M�$77թk�A���_[���[�Us����Imt߷�Q��[���n���;|)�|�.����Z�׼/�Ճ��=�e��t)����H���0�“� ���}^SΔz_5���=������W;�MB��=�p$m�z�F��c��&.wNU�U-L��{�A��I�F�q׷��a�j8E^�����]
�W�K���>�����I���-5���2Q��)�5Ty]���2r�N��8nuΒT=���t="�\%���ɚ����L�Z�xs>Vő �F��J�R�����ĜRP��@x0g8kF��tn�{�.�19��"����:U���"�]��;Y�jeW���7��@Җ��f�ΈAys���;ݔ��oXr�^[2n7@�|?��o��=`�	�?0F;���[�&>��8b��§dז�D���x�ɀ�ĠT��: 4�� �$�%P@l�x�4�B�)�H��Ai9��ؖo+ӚצE�A�j}�{K���wC_���������V^�iiK3��T�L���	}ب�j�D&�C8�هm"�U��In䶮v��u^��$��C!|P��b!X�͔$�&�C_�@,�N���A������mr��[V
�Qr�˪�|66�v�!���2�|�6z-��6�X)H�75����K�{5�Q�{bct�$��=�^��m��X"䮫a0T��J�DcOK�js�U`��;ط����
p9�f�PgH+_+�B*K&U@m�J��O�F��
G#��s~	�gY}�,�0a4#,tq
�!g��yxƢ"X�r�!G�f�S�&��b�/L3ڈH�J�P�6�	�!GU����B��X;�Qw�߬B��y
��p.�~Z�`ȣ���!l�+��}FV}�X�����z��k��E1��w]@�?Z�����K� U�C{/&㊟�-��V� v^O��7�HB���f�1��s
�T1�_k��'�FJ%2q.k{Lp�[)t��lh��D��i�-��Ⱦ�7�=�Q ��,�
�d��`W�������i��Vm:זGS����%q�7�-a��"ã,^��xw���t�Q�
�,���e��1&�$7����{��,C^\��nw�7�:?X�%���Q�@��=���`0v��V���绋[��
&���U�=��D�VC���p�A9в���	 %��b' �9j5�*�n��JA���`�Ê:�V�r<�iYj�
�!��0�C�@d�gO8�@�t��.ihG���SM2������l!	��\!��%4eͱ�v{�����oݞ7����,&E��$���ՇPs��@����Ѐ��ZC6"�/P��G6W#�vš`6n�9�KC��m�Uu5\��
'�ƈ��X����w�:����4/��Ix�.�P%��@
M>u�i��޺�gG<�pƌ'�#���?��N�[�@\޵9�J^�w4/²|�'�A�v}_z�u�:A"@#ƷA�|s�S�
`4�;��8�ۍ �c��D`fR�k^_�H���LA�!T*}�(�V.� ��{x1���'@�8(slGHfn�_0̄H�7;�`zd�-r_\�n4ۑ�Kuc��ÞR9��1��1s%��]�����+��
��kxޱj�R'N�w�����V+�D�%��� �p�/��\�'|���T*���-�.`�3$`�m������'H���O���o"p�
��j0�W!�z7ׇ�_}e�
������l���M(Q�v��D��zu�_ڭ~7�l)��
6�.Zt���4�]8-����Ȕo�)�P6n��Cl��)S�U��g�eՀ�Yg���KdPPa��\�
.u�؋[�,sHm+[�	�Pa��v�1g\��A�Z��G`��Y���}�� ����N��dPV�Ue�tܕ؛�NA�)�.�,������+_�h����Q�H2���pMX_;BYދ��a�m&A���Xik��*!�'�B��ʅ%s&���+s6� ЦQ�7Rq����:/��EKZ"�E$6�p�vЍ�1�ͮ%Q�Ɠ{Y'I�%���?i
��%�[q�X�1y�t����=ǍT��Ƥ�6ZN����\%.��!�4b��S�D�{���I�`Ft��ˢ���
���U�R!e��pj	�Z;��
EC�+^���;�D(�􂋛.��kăvA
�(�
⭭��'AIÔ;��}JE�F���iN�@�ȁ�[�<r#c̀��QJ��j�~Pha���E���r<u��fRE������wI��찇���q���-�~n?�8F���-�G��N%�]���OMz먂�lъ��H#o�v�
S�C� �~���Jm�|���A���)7+�{�[[���[,k�jX�l�ii��/ؿ� WV�fQ$����06M�y�7��-��tOCW/x�e��O0��dC�ae�'��e^:�°`n_�MA��^߂���|��)Id��t�G���X���W�/P�,'�.����x驹�S��q����,�B�@�vp��8�0���,NI�k��rV��c����(��a*��~����7�8x��?+E3B�w�a��E1��J�yJg(Q>��(Hk�Ր�kj; ߾y����o��ݖ����[r�� w�*XR[f��ڋ��r/B��,=�m�I�Dm��;���D������U��*�R�g@+�16�s^,�]�x�{PF��T�_�j�j�\��a�s���cU���N(�<�SZ�r��U1�y@��x��K��!ǃ�K��M~	��b\5�L8Ó���X��DqQ
Ó���,&�+Wx"	;r�J�.{և�5>��G{�tu�6PN�����A�c5h�AT�f��t���?j1E*�]j�p!\��<q�
X�„�pDܨD\n�P��2K]���"�+���0>`�{�us�.a��^S�)�DH�ׂ���,�PP�'Z���u�3�J3��Q�h�R�g�<a_�V{��L�X��RʑwA1g~b�eH��9��~�F��J��S�ဗ_`�}����3�`�e�K��*Դ�Č_��`�t6��rD̀���(w���
R�.[Q�1s���%�,	6j�(��H*<-���L�������A9~��Pu�U\Gnԋ�W���j/~5yU�TH���@���g�?���H;�b��.�è_pN�A���o�<�O�*ւ�k����zC�ZA
	,�7p'ei^Lk�����@*�k�g�(]x@77S��.��;��M�A�o�J�B��3��$���?����р���ւc�@rY��]oM
un���Y�ϩldė$�G��(�T#<p_�+�J�j|��T��Ux0�H[CX{��K�ZS:{Ű<bW�I
��o�p҄An���x�RW@�l�|8n*���"�f�H��2d,-�VH����~�9�e�?F��5~��E�W	<�H���	��~�(7;�Fͯ��A7W�x98��\��4�r��e��	�^�N��͎�x�{��S\f�p�hQ0�۱�<)(���'p����˫���q�!�*2��-gN���<�ry�B���aS�wL$♒I�PA[K�й2��I;�ʹĊG�:=) R>`�-%�뽸���$=gR��
�RvD5f��b����>�?l�i�a���P%�v�����(�pO�Y����tz�O�ν/�a̳	���������SΝ�y�֝
�
QR�A��q�������j6	���J�c���
[&�.��խ��~�Dr���m�e��Ň4��H��[\Fx�X�OG�W����%�yA�]�(!١���fqd�r���\��y`�,@l����#�2A@ʯL���el���]�'0=�wN���)S]���^�W=r���_������u�愆�:
,}�v��-I6��AX��u͉�]�?#X���@.ATF�=%=E.h�����nK��_A_��Z�A9�L�'5_u���۵/y�	��b%T����1�a?5��/c��'�EG�{�&��q_�:Y�n�n��38��������$5���H�s0��2 ��z���[��~/�H���GgS뇼&�ہ��TW��d<��j��x�7��7��8��}r��)ɴ3"�y�K���K���aTK���7�ۂ������.��S&N+��~d���u�!nNw��G����ȅܙ�;��F��d���7h�Qvdչ���@|*��`!���%#x]ucͥ�/)�;�<�}�xH�'�s�D�ܪ����$ٵ���a���Yc?6^��ng'�|��6̓7v�dRf��X�G���4YQ��-��W��_,b/�md���%0Ģ�z<��l���AF�S[B�e��a�I]5�1'��"u����G=�U�~��B���T�w`އ���O�[׬4�mT���?�.$Tc#h�ۓ�qGi)g-$����::�cAww07�%-c���p:zq��+���w#"�w�K�%�e�NZ�^O��'��f4M�h��J����w��K��쪠5
��^���B=}*����NX%\`�k�3cїo��M_._�����kp�tA�’����ӻ��[
G�n՞`=��g���uTU1�Ao�0��ZB�N⪠�#��ړ�g��<ӏ�"a7�������j��sI�ݶ�r(��F���q�Kȷ:�>U ً�
�f
�x$�ǂP\2�9����?L��`���eQFZ�;>x��m�+�z�o�n;���HQ�r��]���\���^�yP{�.b���D��U�/|�e��̓����J������	���/�4��;HР6B ��|�
�����B�� ͍ع��t̴��Ŕ�$����+�վ+�i������G�R>�s!{�&�Fl��Y�4E���2jS`a��!�4D�R�a���÷��LpE��r۷w*!��)yj ��]$l���a_xC�U]�g�Ɂr��sj����9Y��+@ˍ
O���֪�K��<�?w���O��Q-��J��K.���������2��[`�h���'��a��Uj��t�{[5��ut��M(��^[U+�J��T�� 6����
�����xÇ���6Qa*��$�|a˟m�S�Cvha����k��dCj�%㸚ڻٱ1��,$0��b���o�3��Pր�at��?�F#��
&lԽ������PK;��W �S�/setuptools/_distutils/config.py�X�o�6~�_��$�����<tY���M1�a�es�E���z]���"%ʒ�UqL�}�����d�q���*���i̥x�SDo�����b��eF҂*55_�b�w�i�R_��@o�&{��Xl�K#ؾөT4}����$�JHM�
r)v[�|SQ��$voA�fyn��Z2Iw���&��o޾�x���BO�
�W|��
����z	0OL*rx�� X��*dIwlv��
|;��hl�$t���g<3` ����zk�y,�A��8-��f�q\�`���X���x�p����[�+5���W���QL��\lC��Ux����w�B�zK�J(��<�{Q2�J��[0+�ZT���!K��O�7ᔄ�L�� "�ї���3r�Vr1�O<�P�r)��� �@��U=�|_�m;jb�_�0�P��/B����'�Vl$�
�k����H�"��Q\0���a�i��	��H#����?/#��}� ��e�F�І:�=����`J\�M�K��U�1
UF����C]�R�Q���q#p�z��癨���|�t����[H��O�����OSr-^]_�C�0&Bk>yr�\��/H4�����T�3B^�R�Eg������L�
�ǜ�9i��A��q��N�R�˔E�G�ˍ�}R�
�7��*�@��ک6��@5K��: u3���b	�ڡX�*�����#l�d���	v9��)�bM
��&`�jO���u�s�%�y�4�0�y��f�.�'JK^E}}|r�>�����8l�\�ے�}�	zlؓ]�)�=�U�՚�R�-��bzji֐206ۮ����������Z�o>>�Pl共�4J��RI�&�8���d��6L��
-	�U�x�G�l��'�
��m��t/%+58�-��df�����2t�,\uӹV�Ln�`$���tCIw��q�<�㴉9����h������!8�u�0qV�5t;�Gd��쁔�,n��ӻ!8����H�1F!�g��l8�BT<*al�a��
jbK���'m�&�Qz�E7�����d�tCAa7F����9�$L2����B�1���;�ܰA��Xop�M��|ϛ�?�+MzپrSv`����b�c	��;�b{�
�k�Ճ����ZN��X�#����]���0?w�߃]�� ���q�s��>Da���G���4n�"��~��0N���7�c�3Ͽ�Q7���`60
�
���i'��~�a��㾞^�hf:O�R�1��3�isN�sַ����<j���>V�ܴz@���^fE.QO�x���;'����u� ~b~�X[����>Ѧ[�шHUʹf�i�1G�8���ܫ�[/���3w����k��Bu�9�}x�o������&l q����L{kEԠef�t���#�0p���m�ѯs���$�PK;��WTP���$setuptools/_distutils/core.py�Zm�۶��_���#*�q�~��x2��6m�N��
"!	=�`�d���}B�I�7mB��b��`��e��e�]?�vyi�Z,~<(a�$S
��A��U�r�7b��n:c{U���%^!����QW�-p|�T?t+�ڲצ��˃�AX)�D�iH�����׹/jg���UeJ��Vo�,�J�4M��.k�r!�`�������Y;�D�v���u+���Ll�T�b�\.|la\xr��7�տ��� y����J�z��O��Zc]x�-���{�g�36���K8b�ke�潰{?�^,��R����r&1��bIʥ@�˖���ù�@�X��`���{"�0�N�����wo^�3ԇ^���'��Ţ(�gE!��w�鶫�Xy1���ŁQ�`$ޡa~<��Rl[����D���{%��UV"���]-O�t<��P�� �����8� ZP��j��p{@{��hUX�j�
d�q+Z�(�6��פ����F�k���n#jtC��t���픽�c4-_��ŷ��h��v#�e�n9�e���໯�;����?�?�H��w8c9^UZ+h�g'%����;��k�*H{?�he��7}o��p-�N��|+���\�j�M�l�g�6z\��4J4��D#��������[u���+��)[�8h�E��X��t��ʂn����4d�W�������NGc�	xv�F�e�1�.X�_�@ǒʧ��ذ���lvgy����ُ���r��j�_�j���<�=�_�ˑt�`��Z�pU�M!“���k��`���kfk�2��i8�(���Ȫ�h`��d�(�g��D[gj����l�>�%�P��.�@7��I�2�۲*����rX��Қqpha�l��[+�)Y�c:�8�u���ɠ�������`�(A��u�����S(��0���lM=9V����Z��n?��"߆/��}o�F�+�?����_~E� z ��C`=��焥܈��>����	�vlj�(X[�
)z������n���ue�#���7`�]}�%��f�Yz��!�R�
pa��[Z��>S�ȥhU�A�$�aa!�K(	\j<U��2�6� 5@N*�=�,�9�]Wk&s1�e�]{MF�*�!�!�����a����yZ8:���G('�`%ӷ�ڣ���w�a<��V��a7��X�N�Aq�%��ə�ywZc�f�z��:'9/�Z4����E�>�
p��`i�U^#EĐ�a*�B�B��L%��o���p�n*M�n3䵮C�Oq���q�Kh3@�5+��@A.S��G���{�/1���2�#��R2���pp"Y�1̜���`�<�Ձ� ���;���TX�)��X�8�Ҹ։)4�`Z���9[?9�h�~���_�Ƅ"����h���Y�u����9Wd�?{��G-^����5� \i�@T��`-�!���ڇ�9�cq�^D����wfA�L�:HT&�-�T�b�1
���1�`�i
���B�7
�!?��d�=��1�����\(/̗�3��$�^k��12�C�l��h,�bZ_o����ޫ��*�����wf���}:c{�2�en���%W��۠G�\F��k�4�2*��z=�&�Ĉ�SH�ks\��$�9���l���C��Y��C��n��ɪv*N�_]�O�R�a��B��vz�̼��N.�����˻��|"3�J>�D����n�?^2-x2�o�Vb��		s���4�dZ�S��h�5���]k��XN����/J���&Ϙc�Gx��~���Ҹ}�F��7��J
�����y�A�ْ�#8����
P!�%Tl��z�������\��O���g�q��
��5S�A=�V]��}e�f.�K��8e��)C�J)
]�h1{�(���t�`�p&Z���`�c\J�(�A
޽ ږ��Qo*������e�#�#�����o���O54��y��6�fdy�7����Ǽ3�-�́E\���w�0�q�b�k3up�9	����x)Q�'!2B���������<�k4Z�4��He�)��.���c?�v�6:���}KGMn��tw4����$�}��/���-�i7T����p�<�`.��FM�@��
'@]��-��岛���%�!g�Ŝ�\ѢCѾ��ѩ����
�҂��`#��3��!<��T�~2�4�{
LK��l#�5$���ܯ,����S��&Y�A0�M��F��;,���A1Q?IU�D�?ߎF��r�_��㺾Q���^���!�};y�^'�H�ߞN��R��gg=��~�z.Q��w+��X�&Y,�w@4���ر�<Ǿ$����-#�� �ӎ	5H�i���ۧ�mG��ښ���n�VOr 5�y8���E ᮟ�@����N1CIu�X�ו��:,s!?3�������VISd#|_�F�>I���$b�y=i��$�j@��
�3^HJn>�J}P%l�Dz����j�B���j��C�Da�&�2ۤ0EӁ�o��™@jg�>�ʝQ$��P�`�o`z��alI��C��rJ��Vt��x���F��<m�7����ӨKVn�U#^�ʔ���jP�e�w
���1�H��|T�9�Ȑ����V n�,7A�<�z�z̹O"aIٙo�{5ue��OjK�~F� ��7n����9f���ˈS�@K-��Uޑ��Y�ow��GybĽ�(4�19�b�$?;�R��}�3�P(Z���4��M���WF�
a�_(
�4�
‘W��\�/�:e̥|]1���8�K���`c֊oB��m]\1��+�`�\��y���yi��'
{��*�&)
�2�F��<cϟ.9I�!w�B�Y�l}��{��D"܉(�%S�� 7��:���z�x)���,KT�W�h���qe*$���h�]�"���1{d���̮������be\����3�y���[�	O~�䍈E��_��6
0��j��
?� ��8I�t|$�HpR{����=����X_ǀ
y��(I8x=�8_�7�)�/Wr��ˆˤ_L=f,�V�
������r}��Av��qF��G�)�:]����,�ס��NM<mq�U�*�>t�S5��Aj|<�c���Dޕ���{��k���J��1������l��c�b��PK;��WE>����.(setuptools/_distutils/cygwinccompiler.py�Z{��6��ߟ�UPH���̤�6��M��� M�ȣ�E6�j$z��,
������K��ٴE/�Ll�����&�(*+�}U˴�_益(Ķ�j��f?u�cUr�
g+5�Z�YVԹ��39\��L��ۦ���m��]O�i��˷l�
"�/US��L{ֳ���M�W�������=<�l��6U�a>��^�=]�X"�-g��i^�5bi~lE���,��٬�j0i�u�~�{7X�v�75��?vy׀���;�%	��(8�i7����зC?Ӌ��s·���k|����]W�<�a��w���d��=�'��xB�OuޯE���eL������w��%�������m;p��4b�d%ǯ"�1g��B�5/h��U�\�y;�Ͳ��XtY-��в7��|�k�>����^��yžKO���Ó�s�>Vh�;�?,W�z�O�է��_���|�h��}"�xD�?9��{�}�=:vzb�NO|��zp�'�����xz�<���ώ:��~�>Ҁ���r���h0�uhJ��^f�z�z�gR��3�Z!������>k�z(����&ڮ�{�7c������nϪ5�i�o���\����{�gW��<Lt����P�o�n�� �<�M��/^����ɿ�O�|���� �
���ݭ,2�I��B�^wbh�ӹ^�o��q�w���k[t����g���7�>����e^I�~&y��$z�(c�<���ȿ�,b_[F�\2#���8+�Nb#��R(�W5'/yp&Z���q�`b��i�G����5e�Kv�g�>F����:�<��yC�����X1	eI�dG����\*�;����C��4��W�f�n�Q*4���o,���|n�7y�8�/�ڮ)�4}t�r�yO����Z��c�Hd\���O�c�ȆL9˪��,��^/H��7.N��q�x�+p��ڊx�S���:04�� `w�>��D-���Z���l��ǥ�KZ��:�iL���H��X�|B�=g�>�Ġ��(�I&tG*�7�#��U�H�V�/�������������m�{�S�a�ಉ��p�U��8L
�C�t356`{�s)�sX��im+Hp��l
��"��p�!Λ��t���q�si���">������Xu�I�x��{���"��Wq{{l��wj����=vÄ=�Wh�mo�v�G�	x2�7/��|���
�"��\nM���d�_��b���]ˤ�@ni��"�����,�w�2��$�	8J�>��Ba/B����"�t�O	��
��$�5F*N�K2����~��03Qq�9�{�.�a��0��[����[��d=�I��]��)*�;sa�oԚ�6�A�3 dJxW��DtR�L
ͯ��Que!J���6�<$So��[y��5W)����m��~pv���Cck�#�)�d�r�ΐ��V�Ě)x9�9H�d��u�C{ϋI�/$����V�#���_	��(�����/��p~����G^_�-��n%����d�o����Q�]Fs/*6Qy��+Л~� Ѽ���W�g��&��%��M�!F�:�����I��N	���pҔ`�L��$QE�!`ԨZN�+ȧ�XO��K��,P���K%) XB���jg_}�U�%�i�I(wK�N�Gf���e�DK)a}��&�=,|2�CZ:����F������%�lg8����ť���ܼ�}���^q/E�9�P�(��d㔗\}���phK�%�^Ѻ ��Q����������&��>:���Ա�a���R����J��I�";�V+�w��~��?��$��2��Li�O�fB��V*g�X�=���SA�[�"���ï\5���^��Py�ʕE�O�O�@Q�{���d�,7{�1��@ǎ���z4H2�eE~Q�m�TU0er�'�t��h
3ZC����T���@��M7����:C
�ݝ�n�^���.�*u*��%	�V�2s�C��!�ʤ�O�=Y�}�������G�:p���B�2�R��^�إ6^���.{�,����k��l5��
٣��M-�S%�B���X�$���B��ܳ�&�orx*�Jt:H�P��9��1 �[Opm���Bg�۠��]��Ss�z��ߊ��U��1u���Pw�6W!z�$��H���p���U��tL��<�Q��\d�|�L�_�y�1�?���{��)#����GM���¡��*�"�KB��<<��so'���3��Ѯ �z�a�w|p<׼��+�&-�4*�%?"(���m�WQ5��fCI�>uZ�:: �Ԓ�i���E�qr�������A
N%��E���O��޼�>H�'�һ�SFwK?Eɥ\�~;?��[�d�vXP�cm�Z$�#ZB@�`�����2/������d1�H�g��Yʖպ��S�ܭ�6^F����Ĺr�_���$����]���ʑHR��(��8���Y;�/r��)8�����3%"
�F-;d1���RI�2=����$��V�����K${���#?>=y^�����ZT�������
�64᲋	�}���;6�Jh����ot��}[����%���)�C���R�6�4�t�u���h����d��כ$G3�l�ذN|™c�Q�Be���_�6 �� �0�"d4�Q�]�-ޣS��
��pwT��4�ȳ��t�LQ���_cW�cj:���엍r0*pS���Y�U@��.�����Ò.��7=ɓ�Q��J��b(+���Hۆ�Ye��r���~��R��N_� ��ºǖK����!L.�}�
~�[?^��Rt����l�bT\m��kW�`,��e��js�9�n"�^���o�t��Z�a�,~/\[̉�=��Y����Ν}B��|���
��
���<:�PR_FE��(����@���JH~1Y�	S窹s_�Qx+E��:?\��O�?��>�f�{c���k����N*���J�]�Is7}БLz��/�^L^w��9�J$�����5V%3�2'1]�i_Q7e��Il�,�%�b��䊓����\�&Յ����w\o��[�?x��;�0~���\���?#���:���?�.`f?�{6]�X��������,�f�]
�|�jT�y>Խ
�&MDE[����)��H7*��jd4H�T��6��{:�yW����&�^^�ѣ����ۗ�'��<~��fQ��}�U��ӋZ�V�@�,���E
�j���t���2�r�Ae`F!������U�O��r���ˡ����ٱ�P!
�uIkQ�bg�	,C2oR�ep�˰a���vׂ���`�y
�Dz�z�8QN�9��h�*����QI��bã�)g�5ǒV*(��tۄ���n�(T���n�R��v"vT��j�s�]>��*�I���3��p)��j��XRm�z�ICsU^:�t���ٓ�e�f�lG�^@+�XVY�O�L�DE	,����N�Z$���c�2�X׎���j,7��m(��	��a8*�6�45V/��#N6>R���V����Q�����Hp����6��A6u'f�����	[���<�o�<�_��� LU�b��W�S���)�v$��BTaɢ�IΉ��2�ݭa�qk����=��a��K�<��(oE���1K=�A"��z�,tJv:��S*P��[�15m�M�C]~}�rL1�'�����UC�}�߱T�H�����kw]����N= 6�J7���!���f�=�Y7t�Z�0QU����C?s9X�oPŸ���"��.$������F���Fɺq;�#�D=/�P"N����i�ĦGk8��`Abʛ�Z?���>C#�H/�Ф�_��~L��M��Wu�z�XQ���$���Q�k(ӛ D9ۑo�
�S���:��k�Q���`m/D-�=��#���PK;��W_�H%u�setuptools/_distutils/debug.py]��
�0E�|��*H��E*pk;K���
y)�k�o�[��8�㜲"cNp_���޽�w��Op�(����24�RA�8놢��+~��Xjg����D��[=X��s�I��a�\�PK;��W���]!setuptools/_distutils/dep_util.pyEP�j�0��+D/I!�㠇��	c�1��A4��,/�?�nS��'��'њX6'�✍	�+�@
�+{
���1��3�Sk��V<��A�
"+P��.��
�;��,�#�(c���{���Ui�-�",m�m�apܓ�`�<&[���'��G��b��I�c��Q�$e^r���Oá� ���������\^�LIU����dzh�PK;��W��S��
�!setuptools/_distutils/dir_util.py�Ymo7��_�*v�]o��9p��6��K����!PZJb�o]r���{fH�$�g ��;��3�g��r�kc;���]ѧ��?�_ۣ�v���2b[����n�BZ]����֭VF�*�>
�*e��r�X販[+j>����Ŷ�K��s����xWY�V�xC���[](~旯�z��b�Bl�f���Q����8WWBWB�&W���d�*r�UyW岲X\&�U�RW�±��r�*�ۺ�q-[���R����(����U�U��s�X��+^�rq'�~[,���*Y��E��W�^��Q��ڨ���4����:�Ⅸ�?��o�7����+�(�Y�om�)��2x3�T�`��"P����G�� �F�X��""#�
K��"�m�<����YY�d�$6]�*Ī���D���k��$)�#`5\�{(�X�oRC�4�dLW�u�8{�wS�Sj8Mf䑵�j�9)ӭ�(�~�T�;KnI����+�b���M��ȧ�Ţ퐸a���+uU�(K	;��f("s����z��ڊ�,`		O�hc;���]�}�j���AAҐ��@�V��NJ&❍�Zh��h����%%p��:ڊuQ�����@�]
7��R�����A�*�M��(���q�Ӈ]Q�e!&��޼�*�M�M]��t��T	s��{D�%a#y�jc	Ծt���6�N�3i"q/�ƹ�
�.;$bM��-����]�-Yf�%���c�kI��>}Bx$E�¸V��(@Sp9蠙�0c�A�{=�!	�!��k���Q��P@���*��]:�bqnUi��{�ׅS�����4�GI�F���-G�{E��c��	�!�0��*v�ݗ>��;�)m�UZ��\�|�W��;�>�6����r�i�Q4J�+����e�l�l�ʵLI�V�Ά�I�"�d�#��={B�)`��B�F�%e�f�T�����͚V�
�4$32�I�X�e�2��jm|���3{�/V���������� "R�.+���=W��q2>��Y��:b~�M���s��WtO�g���2��5���n�)�9�	�;ꅯ�%�N��
�X��!�y��K�d��ﵮz�^(Z��\�{ɳ`�G)�@�uթ�jԈ����T$����E^�e*N- @y
1Ua�������P�(I2R_6���_�a��'�z��1^f��C��ͧw>2��=9�E?�6�����'�“����ܫ���G2Q�;���>9�n�t�&2ـ;���O��9d��q��l�aB���6�k��.efb�A�S¢ѵ1��E�Ga��@�h
�P�;F���A(�>FP���iI��C����Q*�*�P�!r���U4ׯ8*�:��8X`B�r�ā��o7��*;��͌�&�0�34��P!|GG����=h�l�䜀�m�Ƥ��n��(��@�"��Hl��k8@���0�DC��/�[�
t���p8Eh%�|�Z���g��PQA>�O�܀��PbR�$=�y�3��l,�+��A�U��F���=(j����wj�n��"��?�ݸ���>%8�Պ��f��j���9� ���ڽ����Zs;�zK����H�5C�f��`fDɓLɋz�HY�#_[�����7򫞐��*27������m�.�L����J��)A]�1IC=�Ub��H
��24]a��$�C5���F(�`*��3lA:�/u&�V�~��&�CS��A�q�l9(��/���P�H4��{�zr=Ć:K����|7�GYt<�`�na:
`G9�D�G_��.���e���Rj��ڑ�{h�����z�,��#�D�{Mq�e��:��Gn1�&@(<��h�zڿU���m8�<����N�k44�G��s��1ʤAç3ۧ�t
��P�.y-j:�@�#펢n%��.�t�3�������ή!�y���4v�M�9�K
�i$��iᖪ_��4&@��;P���@��o?/
p�]b�āI���:�1�%�����}�����,�
���z
��B��-���K�
֕5�9���A��<����\�O�+j���ʯt-���Y��`�j6��U�Y��Q�x=ܒ�5�)�(��&�qg�����~@ѲZ���c�I���:=��O�M�݊��@ti*>�~r�au��CZܘ#�~r�NW:�z����4�w1�5j��|���F�>�ø��8�:�k`<g瑠5=����ٷ�C�>3��	9/��ws�wޙ)%<��t�t�_��{����g�\/E�٨<�����x!ϵW�N�jS�k*�r*Ÿf�TEB�Ue��g�$�@C��N�6�w��j;ovn����IU�uəS�Kٿ�f���t�Pḙ��N����<+Y���އ�f�iz��mă���#�'�����F�E諸��e��Ñ��r�}5<�
�R�>�����q�d�t.��_��CWg/h�(0�ၿ�$Wۄ�}�UL�}����yX����@@��#o�f����2���c�5�Az�D�1G�}-ɷ
�����e��_)��d<��0z���Soz'��M�׎J�[>��A���i�	Y�L�bu'�c(�W��Z�
�8�P}��go;Ps�)����H�~�H%�{ ���ǽ���:������N�c�
�#F��J�"��3Cw�j*�Y.���_�C�9��׷7�t�I�B5CԼ^&~p�7���fL��PK;��W�?~94��setuptools/_distutils/dist.py�}kw�ȱ�w�
��> gHڞ���U�8�g�M�8�'3�-�M		0(���WwW7�<g��~�ʉG����wU�F�U�v��ܴs����mSߔ+�fݕɞã����u�-7E�N�۫ry�5fט�T7�֫��d+��”�ev�/7�òj�b�1����Y�OF���I���M����Z��c��զ��.�3�:�dS_^�O�M��̶(7��ٚ�-.��,��Ɯ�t���$�ir[4tnO̧��u�Kz��i����Y���}fn�Ek����s��ov�d�yE˕z�L=~�k//&��uQ-�K��0`���Gz4ͺ���MљŦ�.�tD�����,���)���f�7]}Qכi֬�����i���HOt�����+s�w�����O?��|��3��S���ʬ��d�W���?-���VYU�&ͳ��U	��fU�e�s_v�[��B��h�"{{�_?}�"�Ͳ�٪��.�o��)V�v�je�vY7�d�b���C���1ٍiY[n�M��gaDe��P-��0��o:"na�`$e��jX��:[׍���*+֝i��t~"�,��g��s�{89n���������G�_�;�/����Ƒ�F���p|Sl�f��K�Y��&��k�7��m�*���-�B������WX֚]�ά2�J�Q_XŗpN��F���yU���V��pd��!�s�bS��,j:�x2w@v�����q��G����Ⱥ�׿�[`���4W�i���KF�@t���5�-�_�C��b��n�^B���|�O���[�/y�^��
W�'>�.a��O|�G8�w(�-���n�e����Fp��Bn��Կ�AB����1��IOQ�N�K�!"`^�v����a��m�\gW%��sU�
�-|e�3���M8o<zк�	�A�.�&Z��.�m��{�
��`$���Y�3��{�4u�`����P�8(8�M�N��	t`�3�l��+��ѭ��,�́�������<Ǔ<[�%����ye��Gp<�/�U���?;T�^�uKS��#����8ۖ�Wx��+���/h��w�E��ր��$t�V�n�����FRѩ`Z�!d?�B&�\���ٵ9���j.�[`�x���9����y(K�$�AD43��ׂN5OQ�$��O6t@���n��̍�Xz�w�)�Z NY\��痛���Xz�CC\�[Qf�(����m� �@i��ݦd�E˦�fה0�i�xW�/65����<�R?s6�FH��G3�b�eu�\\�X�J�@�#����xRv��E����"�d�I�v���)�]!��Ct:S#�(W�H�y��K�[�<�Voa���]���;�׷��/kXWX�`���
���FJkXuM
Â1�u$�\�Cǽ���� �& ��<���� !��򣣙�\�v�7�Ϩ�W6豰��h�=�LU?�7�Oۋ�`$��);��z=�W�a]�;�3�Ј�&�R�˰ߕ���v�M��#H���(v��پ5�l���n(���BB�;x��	;�JgWHN���!x�����b�_�	yQ�~�{��+B���_-r���p���*�|��� ��~=yF���f�(F>�����pdS���yCuc�C܀�Ư��5~�$�
��*����\M��+'�8�%�]S�ˢ���z���6�a_�i���7��Rl�@��݀�U��;�[�0Ĺ���6��o6������g�!���.� %7q_\#y�&Fɯf����z_�Z���ސ�k�WoS��82��ݽF��uU߂jf6�	&@u���k�><������f�o��ӻ���퐽	҄K�)����0;�+KS��/Uw�y��𛳙��a��G��Q�٪Y�EP�gw�6wC�СrЦ'�2�kaJt(27G{�fa�v�m�Q����y��C֐�L:�BP
�����t�@�m�1�W�ڂ��ٮ#��ߐr��H�gi���|B�	ynD�������K��B�b>-7{����D(��Y$PR����~D�g��a߇ �u�CП Q�Qnv��!�
b�`˛5h]״g���S�Q���4{����v��5�%�@��Mk����Ʉ�: �2�Z�JA(�iLy6.`�I������nG���Oȩ��1!�N�e�Z�X��XX�:<�� ������[�P��d��r��PYV1�Y���0[�{�=�X2���@�Dv�P_r�*�-�Q��6�<(�z����0U_�#W�#��	�o���.�ʋ(O����3.��f��|W4�Y�O�<	
�\�̉��<����X����\/DϹU"β���(ӟe��$f�d܃�9q���)�auB�٣����s2/���������vj���ZF�V�`x��$#�����J㱿5h�4]G�y�ʘ��啂RVl��A�1pv�C�,�����s����p����2$Rp$a�_~�m��b�8i�s��xV �_h�$�_�o�bcX�̬�岄���	h��y��2�&���xl�EѲM�n��>_�z���o�/���4;���'�{��:ʾs��9�Mr�ܷ�6����v%6�i�-W�
�rꦀ6V��J?��V���t]^�������mD�"�7ܐ�����}�<��F�w*�����������E@�%\!.����}�U<a��1dǭ)��L�|	��)���u]�'�&fV
��º�]��f��SC�V����C�_?F�Ȑxc����5�G���l�H��]�Z�t��vj��S �?����၍ؓiOA���|�^�¹��>2F��	�쓢��M�-ڷlW"�yh���d0��H:�ǧ��)ک�UI0ne*�s^t[6�*�Pw�$Z�g#�.���xF�IM��;���Zǯ��1o8�-1�����t�&8�ȇ�r���4jP� '7@5�9X��L�!1����pv.�
�&��J@Y��2�mj��d���Y�㉎��>𐸿J�	���3�Վ�,�V	Ʉ{F+
���&�+�g���K�%��
\Hu�����7Dkc�<�v�ر)3S����P��LhbE����T}]�)ϩ��,�5����7`��Hะ;tZ�r6��s?0�t�O#�O��|�i<� -��M)��r�l�G�[�f��ߒ����W,u�ưWk�B8�V#fV�����ŨiZ�:���#"z�xֺ�t[|��V�G�����h��JX\�ň�XE$�c����>��@���/] ѕ-��Q�#m
��<8�@�Ыb
#�~v� #�H�D&J�Awq+T7�*�ce���1�zg-�n�1�O�\����kп���ѧ^oʋ�IG��l
lg�����-;M�/+��q��b�/G�B�+��ßԒ�-9���h�z�rc}�uË���6�t�ۯ�,����8���!��ed��ǚeRVU�9�V4MЧ�6C��-�/��K񩲳Kj�B�\�6��H�j\}B�4U�!��dL!nw8�@�p�Z�Y^k]�S];���A"	.�	w�r�A(�Et�T�:��]�_�?j�\x�Z��}��RV����|�Lx�	.h�"�:0�Y�qEBò��U��)©�����.�M�{�طPĊ�_AŸI�/�9j;��#MG!�X��Z)(L�m�Q��̆�%�l�D�5�PXs���+��Tr�3/f�`9K�v�v}��"/�#ݓ��^��\�~ͽ(.6�!-���V�)G�:4St���S�^c4�~a�]����Ӕ�RX�E�(�[�+�0k4�H���h�Z��ϸmK��S��ML�]�O0��b��~� !�C�$���,˓
�6�H�CBq'����P�P��G������Av�/@)c�����*��P-��#� ;�Y�" �UC���%��Ƈ�ݙ��DJ�D��[�`4����%�YE����2��:�5R:�4m܉ƥ���h�/�8)9�+ʗb[��Vj�$;�)���Q�����/�_����F�U&Y:�^"�T!�GV����|t���V{����1$�	���Dr��ʨ��[���ؖ����t�;���vp���m�����ѯ�(Zf!N��bԑO�u44jS�
,���t�J���(�wAkD( t��0
�,p���q��m,~A�1�`��?<��6�=;�{|�Џ�A�*r4�P�4{Ў�~>ơ�I��A,@s2��fM���Xu�!�@�Xx��%1CGߙ�k�	{�m�|x��8"߽5d���Ū%��֖Hh+�9̹E�%|Q�v�5,��>iC�H�ĸb'�QT3qEQi�h��a\�.�Y��ٛ�_��X�������U�䩣3�\=�E!l���Լ�����_<;��"D5�߉��|��z���_5f{|�,��C�F?�!�J^c-6.���9냼A����(0>L7e����R²0 �����tHnK�SU��'8�ڦ�G�
��k1!�đ��J6"�Q����yhx�)`G�q��v�w���c��l�1F�,������Hm,_w�`�^�+)g��s"��@Ru�I�	&���k�}����JA��<��#L�������S.��"	�_�e��v:�~���;#�ސ�1����"�u+���b,�&qO��D��0�1!��,���� ����f�C�9�������qMM�v��v�x)*�nނ�ɯ��+`	���Oup�g��O�y�g�.�,c��^6������Q���m�lan��|�6h��A%�B����D`lmg!���]�"�i��1�be��ǔ$���,Y��;Hc�m�_��YS,IY��W��5Q:Z	0G�Pz�7�z��a��*Eݬ�rn���^.��׻���
(��b�Ѽ�t`L�(
qQ�瑛�mQGD�[t�O�A���O�wq�5�����m�*�O$�g����d��0���=�A��w9�j���n�o<n�9�4�{�I�"��ǒd�AR�����	���h��7�T[�mqi*�]����9�5/[�ͽ�BO��(��=�N��q���e5�ǚa�y��*z�/:ٜ��6��-
�:'�}ڟ�C+�IM�����Q����aE~>_AY,&��k�3����(��Q���6’�@�_N�D;ϳo�1�>���	��S����w�(��\oT_w�'�F�����|�!�>��w��..��,d�b��á�ɱ�Vy��=]1���\/dd��Hב���1��0
z����ɝs�I.�����?,^�����ų7�x��h�$q������+�מ@5V|d�����Eyɹ!6��=g�[{WE��M���0�;��0�i���U�$�d����e3���=�jk����|G�
k".�cM(�-�1��|2���k�_����ϛ������ �[��x�P�_hn���P�PNJ4��Ϝ�Ig���$A:b��MN�%RN�Yp���AGE��8Z����C������,�P��Qͱ�8݂�E�$�V��<I�1��Ick��N	������d���UV����6/���)%�W�
[�ј��ښo���FD�$t����C���h�Щ`�(�N�&{��7dC�p�0��|۔&��IH�
)�`�rP^�uI��Rٝ]�x��"�L.�?`�d7��2
��)p�q+2UN����1���Nߞ$��N���쾽�?�Y��u�h!���9CHpYgV�$����Ю���1
��SBiW��i$#��� �Ub�s��W���h��!�д�k��
��$K�6�^�!S�j�����@ũ��߳$��f:�=�w���)�|�pP �a��.ʑ5f%_ғ[N�Wѫ^2��f��,�I'�.��m~N�����T$<�aN?揳L���-�Pl:�TN��O�"���}َ†�)��IG���%~�
�;�fs����^BEdL��"����ce�K�]S�iE.�o%/T
�PpӞhH��Xq�Q�?h(9(ل0�¡cP&�����K4�1�Evc���
�ZBtܞP����Ԕ��� lI#vDT��ݾEn�q(Y�cz�;��ZH����<4�cA�
ˤ�5�Qx��IeB�{߹B90�'S�q�R

c��*������	c1�`h
��`��U�Ø+JZ~�^��1��I�=��{?
�S�>A�re���%~U,˪�[�6e�e�<	t�C�:[��`��%2I<�.�-Fz�F)�# �씺`-G�"~
$?�3��w,�Qvz�u%H<p���)(Z\Z�IW-�ˮ�-9�*�*
�u�§���2�X>P�zm�X'e��`E��S��T��t� �
�!��9�}�Ž,-A�aV�*U�V�!o#]
‡���al�ȳ��J��(U�l���Ryu�`��n�$3	J��d7����9�1_|I��z���>��ҋI�fL�5��~�TH�Z�M�
��;�_q����O߽�f��GٷAZcp6�^/�>3�Zn�fU���Q����#��	i- ӆ�$�f��|�C�
��c^�)���l���qZr(2%jR�"�*z��&�3�T��[�a��Hj8<�)����#U�;��.�O�)���#`L?��n���|�6
��Ƴ�l�@J)ɻQP��g3b�?��s,��+�((�2�z[v6���H ���R"����PѮ����f�Z��qoW-�D�zZo��n'h�~�\���q�7ٛzG
�g�,�P�$`�+�ȇ�v����P����8�d�p��$6�c���lN]dF߄�P9�H�ؾn�Nt��,&+�Y֗U!�03�)Ǝ��>wS@�ED�V���|{O���
@m�r��۩�ZQ�E&�>�Y�ff�U�F}kj��
u����mbͪ'G�U1�s��	J�*w@O�Tcx�Na�4I���	_����&϶)F�ww�ߓ,g��6��p�W�]�9�N�8.���G�z7-��n�y���..(\ÉSZ�H�	_�U~�����M���ŝ��8��UE��JZ�5�q5(�Q�Os�*��:@�)Dp�E�����oN�
 m7��װ#T�ne@�B�6/��%)ُ���-�]ygݨoR0~j�\F,�O��u�)�g��:�7Z4f�����}���{��Tv�D��<�BQ.q�X@��$"�|������2��b��H���J�d�i�����]et���<z��Q���&���I�ž�zlּ���U��P:�ڥj'�wC�-�}�i�6�"^B�0
��A6=k[Udh��8V�h˥#�#�[��R�~c�j�X��"�c�XS��$�%j53�܃�ɣ����
��U<�O$ѻ���%���c��Nc�9�|��,l4�Z����R�-�����\��
��c��~�Ŵ쵟�04э��p�d-��6���.�M�������A�;�.�zå!kj�9��aoM�RQ=�Yoyj�u�8b/��N���0�6��w+`Q
+BM^��Z�s���d3�.8�K�|�9K��5U�01vɒ;L0 #9�<S͍�VI�,�Ĩ�&�s�i
H�B?��姅~4N�T�缉 ���O}4����'`��)g
��k�
K����zu�og�cՇ�*-��		E�9����-)mF����I�6�ޘI
7�����>���;��je��[�����sd]���kj�Ot��\_vJ��T|���}4��]���)���@�qj�-ѹ�����8�#���z�[\�_!Z�'貭�2�(���Q�=M�����섭h1����t�n?Ջ<H�ϼ��M���{�,Ӧ+�`h��TS,�\�
�١+�|}��;�ԕ�bdz26��SL�
�1��$���M�'�[ʦKYmΨ��L��ޛ���2|�4�]�ڇt:�Q�A?�_�@H"3J<�ȡ�����%��j����4U�U�5�+�cⳞyZ6h(�cG�jo�nw]���l縖�1[�ߌ�ަQL�I?Sx ٓ�j� ��g>�))d�g��L�fJ��h{q/V">�lp�
���y7���̦U����j��R�R$m�Zդ�p�6R�k�-/�e��h�o��*�`Ʒ�X�ދԥ�wp&����`�-��+���u���%���Pڄ ��,�:�v`i_��}+p1�R�A��j����-]r�nac�*�*�(HZ<�/�(X��b����-�18���D��9�y�g���%�P8������S0Tc�b��h��?e��"o��G��y�]��a�-��ܷ�T��;dLڏ}���Cy�u�J�j��c�:fnH,�.<E=��J�_\��ag���-]�m�΅?�b5��-�OѮ���(��������$1�{)���c��y��ޗj�s&����]<z�|9�|N�g���D6~�(�8.^�sYb	\Hh*�h��46r2��(.̓��]
����F�u9a��3ۚ��P}J��u����	߄CD%��>|E����C�M��P���%�1{���;J�%_���~cc>Q�A�r��	�<+�b��\�5^44�6�[cI�Ⱦ��]��4M�Zt����x�O�"�n.[�82’C�a��T�@�q��p�C��$x��E��<��a���3�����Q�6zV+�y��O�U��>����$�����c?؆�uޅ�'����w�B�
ĿC}s��s�
����.�Aҩd��N5PD�}!��C_��o�PWW���՝_�/1u���I�����N���#ΗVUMZ[$c�EUS]vWQ�=��=dR��:�)~@ۨ�R�VU�2��̀�K!�-@\���D�pu�@±��mM��`�*'��zQ)���@Q7�(f��Y(��O�����o�A��U<r7RMF�Ɏ�u�ef߶�$���VS�����ņ{�� � ~܎F�AW|$�˒��'��Na,�dج�UI�԰�p�"�h�W��x4��7��űy�X,`< nq� yM����(�˩�Q�3=LjR*�+�t>Ph�=F��"BKo�*(�[���\
�ˠO������z\^�;$bR\F7��!�����x��ܹ���.`d��E<�.I�hQ�70�z�/dT��C>k�D!�)j����}�­E�c�f�����p`/�s��M<������}55�`��*(j���Q����T�O
B��U�5�&{f3Y8���;���Xfo�O�����z���:06Lg|q�[�����(o����J����ܟ�����ݭ���>N7�K��M?}�O�Cq�������+�Aމq�(�w�P4+���ڧx��� ���%-tД@:��y~�x��x��o�����L�B����fԣ#[nᤇ4�R��G�T���CK�U�Q�z��Y>G�D� ��h�Ľ�b���MN�L��Z��̻��J~,�I������ɏRO֦K�����6���Mx���2��]v�x)��Is4؅$�jPsJ�w�'�4pΝ�~�4�:�;��ryt���;��� N���7j���(V��J���4�Tם(�G��B���@j�U�C�L������Z�>c���7�&"��-}�T@J�q�}�2��e4�����>��={"�^�-,�,c��E֙�(ٲa�GH��s�$�l��=H�K�n�ߝ�9OR���qF1K
)�>�^T>�+����?a��]i��@��%�IL��[�(��^�b��Hzd�ə�IJ�0��S��{�x��!��Rt�5�����H�@��~��n'q�(�'"K8�I�D��c�J��\z]�0�3�o����\|[nTp���X)�[���	�.i�RC�(��t�K|�� e�d�F�۪;�q?(H�[סȼ
M\ڷ'���.d�-���e읖q�����H�;<�#a�9gt� ���,��(d������Ư�4w���mr���k\b,�����S_å�s��E �B���r>`x9���ߚ������9z��3�Vp�<\�(�#
SL#:��+A�x�j�T!��S�Z����4K�	���H��w�.��D!����S$H�
&�?arRA%̑|Z��dw��7VZ�[���8����*����p������ntA���������[��R��=�lP!.�QH|�Q�x����c^���Gl�PV��u�_�"���V�t�㑴��5�kR�$��zE��OXX��:�]��8�t��W�̲�_�8%����	�v6��2���~Q
q�����Z9�hG��3���yO91���C�̥��$Ә�b��kpd�kY�by�]��o?'q�u�>��,J�̟'���A�(���q����}�e��a�q�L�N�a_��"r��3rU����r�Y{ �{��ˢ� ��8h:�� �1�}ݣj޽*�!/n�����X��6�S�٣X��PZuA���S�4J�X|������R$+p���rq�eX��nʕsy��b%��-z�e]���2���q�u�k@C_S_6�#6IB��+~�MH(	:ݍ��;��fIx�UY��b����=�s�:W��ى�;���0�2'�4Sa���-<�����z��]�ل�ه��c�$��C%�Ń�㕊C'�Y������X5��_P]U�Z,�b��X]�Y�E�x;���^�l�Bx�*8��R��X)�?j=F)b���J��밺�õ.:C�̆+��:�P���G,�c�@Rn����Ȏ��ij��2a�IJ	�ӟ����>������數;IKd<t�K�~�}t��O�����K�_��H��?X�¹�RIt�J���
��(�c�b	]P���^�wK*svL"�l���9����{��r�3[C���ިi��9�L�����X�ѻ}V�b�֖Ĝ*�)"�?Y��˙��$�D�h��o�
�	�9�#�����[��B����fF=�3���R�C�yM��c[�X$]�l�g�%�8Йkgs
˩>%��R
}2$�.�=Uw"x=_:�- ��>�9�X���-V���	L�p�UM�����L�Vt4x�TA�D��Ml�ueK��m�������� Ecc��2A	�#���5�$�֖]~x�4���l���d%��B'V�(ap�1l��eWRU?�����~ޗ�zMh
�|1B�* {|��c��^�m�����ɒ��y�M����}<��G!|��8x����q�T/З�My�My�k�v���1���M���3����~����I8`y��\'r�4	!��D��O_p���V!\�<]�
�L��rІ�����_��M5���B!��ċ�?f��QJ�t6�����ΐ����ϏI�,=(��0�쮦�rq����QL����
��$j$P�=^ؓ]�T�Œ�_~�ł�� ¾�e�IP+�q�U �B6��l�[�<NX�J5�]Gn��n6�
���'p8>�
���=�lb�R�aG�p��>/��Ջ~�|��_�~����R���ܥ��׏�#�'�-ʍ~Wx��i�O�=�M�T֏TxXв�.�l��~�rU�C,q/���'�G�RU�!׷�,��}��}�6���S���m�\�3��"ua{1�-K�]�;H�|��{IQY���1H��EwL��:Y�Q"�K[Ur�=���y�y�G�;`��
��|D���v��E��6��
=�Ǭp5ը��~�z8�b�`�ֶ�Wxdd��_c�j�j�TVmS�Ŷ�En.�'�0l��Ox��
e��׍�ƒ��?��\$�����y���ף��<�45
�F���N�͘��Z����|p�MӣS=v����r����"I5��+��<�<ؠ���WУ�[4��[v~C:%�#���p�
@��x�)E�g�nl��)
�ě�f;@���hA{[�?���V��p;WR$%�������S4�>9
��r3~��w���sWT;��NT�u�^��:�.�6�@H�u�&��SHy6��.48IE!CN��u�p�e9�ɓ"�#�z8.m7���H0g���袹��2��B�;9ӝ�m�u�6eg�w�m�y]�*��?cS�_o���
���eq
6fc
ts4��24IF�f���g�MP�,�|܂ve*Pm�ޝ�?}�a�o����>�r~v|[������w��΅G����o�W�&Th���J5!&$_�MN�U�/�^S/����3y���*#[�)uopQxƹ�)gc8x��U�=��'�n����N;fe<ݥ���)��-f��m;�v�*�AԷף���i���
�z`o������=���ԏ\q=�۟-��aC;<mY�JI}���L��^?f����jUf�Q�`��	���F֡nZ�Κ�����g�N
�з#��V��hh,q�z6���p9`�k�Lbf����[�'�R8��c�3�6�6�c�x_3��Η�pP-ݹϸ�~b��>��8ƨ8�6�%toO����f�N�S;�2�{��2��"�*�O���!{ꓓ��FI�A@$ז�s*[��Ҿ#ܵ�����6���_f*'���a2l�>ql��"�KHϝ}�]��*��VC��C�6�a�{/�w��$��_1�jj��Q�@D	"hoI�Q�5�~��R�-���&���*q8VL���/jBr���l1�q�۸�%#LOY_%>�UUJ[86�T��5
��X�	�F�*/E8��Ց�i�1�x1��aF
hj���S4T-qE6-FМ��s�,��%&��ϸWNA�>�0o�Y�p����o��M�ڕ��9�M+CM��&V!��_Wu�&�"��=��*|�bޱhdM�Q���L)�ʨjW�AG�˫���
!��6�T��	�5�ju�L%�|VW�Q���o3�$�5�Y������h$W3۠��(�f�T݋��D�=����܆Wq�5��04�P�M����=>>:��\![����oPK;��Wd�X�setuptools/_distutils/errors.py�W�r�6��+�`yF��''G�R�d�bO�ɦ��XX,���Aj�":>�z{�u7<��+b��	k��0�}���T=��E�lP)P��^��_Fպ*5�J��"�P���l8U���&�
Q�J����O�X�iM������'�	��n���R��*���iO��ƥ����V+$믂�uj�lA۵*t�J׶�j�%nSK6��lv�3c-����Q��9�y�]���2m�|T�|��yT�".=�0}[8���9�Zݢx����;5?@3WH�Sn���z>��f���!a��������ޣZ�r�0:��M�����^��C����c#|��h��@m�R*#��h-��qm�7\ @����3�bF5	6��D��rwz���H�s!��qxS$F7�/���w��IMT����PnH�1���S�� ��ZAj��حxI�u0�Z-�Bm,‘��!�$�g���j�e,bnl$_뒦����e|XGN������R�jm����Y\_q��ۦ0��o/��+w4f�in8O��d��y4��J��V|�o��P��Hs�����|1S�=cH�0ƩadB}>��?
�B�RQ,����L)�+����Oa{RE8�^pJ���!J�������TM_�Ɖv�m�%��S @�_Ɖ�G��!�;�e�C��M1���ٺ1��` ��$ <�|8S��_����=�&Q�p��N��H�'���#�Dv�#^�"���Z����Pz���],%c��Q��t�`a�ӏ��]b���y����?H7��b"{��yvOW��y�H��+��b�����h�&�_�m�#�`9a�H��h��@�+�^c����{��|X�2��?��FGH�������٫�\L�=Ǩ�)�CO'�YB��V-�L^*�⹽l�ar�L'��{v��D���&����1
7rH��<���l��?��)(n���Ӆp=��e�b�[����k�=�Ĩl�����vd�?�~�irq�fs��I��N{�4�|�����?-����,��L0K��`	"[S�Y�{�{@�?L�|O-�41�e�=׃��u�?�~�#
L_�G
r�����P�0gO磐�^�^2:\{��7>j��'��I>��5>Vg%~�1�4����L�&/��;��?�	oy;m>m>~�;�p��;܏��\�%��wS�߽'��\���k����_�tſ����,�}xw����y��ˍ�]�o.q���4�1[\?K��g�L"}Y�1�YD���sCľ��PK;��W�~&
("setuptools/_distutils/extension.py�Z[o�F~ׯ��(L%2sy[��"�6mE[4I��a#r$MEqTiY������&�nZ��E����T��eU��F�T��&�L~*̝N��F�o��H2i�LTV��4�B/��~v��h��LZe��saUY��ۗ6
�`2ѻ�)Ja�:�"��N&��F[�G�P2ˎ���X�G&)XV:K����v2Og��K���M	@;�U��[E�6AP�o}1j`EB|g�N3`��9!RdbңX�P��֛��m���%�`�eK��Y�c
@@���=��`;ӫ#�)&�D+-+c�k.�{�SF�Z��T�PEa��d��-D�.⠐IY���=��hr�K�2kf$��3��2�?�������4q0U����#AV�4��d�VW�n<ɡ�S]��̎$Â��y��@
0�H�Y�sGД���d�d���|"�v��ʖib����JȲ�V%[*��	��{$5�$Gf��\��3�l$ܘ�ZU$C�H
�V.3�P|!Yah��1f[��T)��������U�F�
aHor[�<Q�B�v1�^l�D�����8�IV���)�2��5qu%��(OrS>W+�)���rCώ�� H75����՗�����Ƒv�@͠a"�i�#V*��f�a���]�`aL�,R:Գ����s}/V�؉��L6WV�e!A��"�X�:��>��%��I����@Ț�����V����{L8��^%z����<��&3*��E�Ĭs�o�6���*����y�M�/�S��O=(w�s����0JɆa�мA��Na-ɮ�vC�y��j�s��ɤ0LBسΙ��Y�~��&W�S�4�BIP��$>��"ȳ��W��L�Zq�q��.����\u��_�QCQ�Ci��n*�(��R'BY�K�~�4UΤ�V�?�ڜ���k�!K9��`Q��3��r���N[��
�[�#q$�u��.Y��}88�KQL�[Q�����0Ԕp���!ʴQ��;%�^��F��UN��v��

���8;�Ӣ%S���V3j��
�0��@ǃ����<�d{��u$�z�dƥA?�\�q�N�X�4�朳����چ��J[�Y�n#�*���Rm�$�Q�(�8��8�9՛|5uN��=�U]g���Q���I�5�k��e�V<���C�u��+2�V��q�.�䉶��Wt�}]��ˋd5�cNKIB�Q+g�)f�r%��JhH�=�*�Z�`iD�*�T�Mі��z��m��P:G�/�N)��F�l.7ێB�9���i]�ҡ������d����T}�*�����).�y �P?5�s<��Z�`���Β���J7Z61�5&G>$����x.�k$���p�(�A�f?OZ�	���*���U�^�Z7B��H�"�8S�Wy���k�Xӷ�P&�u���vm/5gB�����S��ѢՉįZ��S�YRv�!�-Z}��Ƚk\Sϟ��@�Ҙ=N�Gɚ7Yw+�����Ϯ�p#DX��u@��N����yGթ�O\�K���Θ.į��2u���A�~��ܖEE�oFB�D,��}
��Ap�ت�m�S���9d('�bAV�X��@T�j37힋Ƴ����iLeV��+{��g��M��[P�`}�n�%�ѽnX=Є��n�l6�|"v�!��W�����<�H���e�(T���r��'��VY�9��u��v��9����+kUA���)C\��˦Ԑ�{�!���›7��tO�9
8�޵���1�|�С��L��=뎸w��Mm��{������aq�-�7���)4Q#z=A�oF������=�U{V�у�ux<^��\���H>{�Wr�cu�٫mU��Y��z�F<�>F��I9�$�Q��l�yqD>�ō�4�*n��5��f�<
��3��R�rc�]�Iё���T|%��}�W��)Ծ�w��t{�=s��e��9���|�wag�8��IoG����s��w׏�#z��n�͈jd3�b'|�� ��/?|�>|?|V|�RS�a~q����U�a+b��A�b�'7:\,f���E�у�t��H��*��34h^�N�W���l 7�˹�����p��i���f\�Q�u�wf��G^7���\Q��Y{��/Vz�{YX
\[E`g�0�,,�?�iй(�'cpK8'�����k]U��?g�Ԗ���2�.n^#����5w��a�
ZKnt�_^�;����	ІX�ι�r�Q��>s��=��
�H�*{m�4˅�	#���b�-��oZ?�%��A񥳞�DE��K�^��b)ك�u󵎲172k��S�);���<��Egg��%�ζ�L.�`껫��s�-�E��eql��S���:�)1�T?�p�3'�=}�1��O�,���	�Y��п%�o�7���Z
y�P`%1���R�f��V�}�� }�R�1o�ߊ8v�W/�9x�O�0�Â��Q�8ۡ��qT%����1j9��'3<c��Cs�A�s2'�>���?"�}��P���gC���
)���R�S7�Z'ә�80<���炒٬�i�$�m��k��4�E:ݎ�\0 ���<��FB�q��r����as�d{Vl����*+�>뵜���`��ȳ��y�w��Aw����^M�N!0��.0b�	�;=�w��)�Tv,r
��{���GE�7a�ۋ���,aN;e<�0F@�Bz>5�H;;n���V������F4f�؞�a�yq{z堩or�y>yzĽ�O��ߞ⅐j�fD<ʈ��c�w����Ӎ8������B���n�
E�G�=�{]銺kqg#z囕��eg�,Bi˽�����'hB�(S���8�Aqt��Q�;䚖���2�Z-}�ǫ7#�C�Y,�����\��(�1�}Yq0n��������%����	��*�	��9�5���ˌM~:N�]d�a���	�,&ع��~kwS3�T���N���mu��O��u�\��<܋�DV�ۄA�L]~v�i����=�Z�4*_�?
����u�����(z�H�>��14��^]��h��?�ÿB�3X���N�t2����X��X_�`���z�KrV��}d�ᾤG��|���P��i��.7�*
���i}��{U��X��4��`~D������L�0�vCl��������d��"�,J��#��pĸ���&�w;��QrM�c�ǞQk�9��G%͋A-5�R�kS�+Ӻ��IE-NƓd�R�ū���2�/PK;��Wڍ� ��E%setuptools/_distutils/fancy_getopt.py�<k��6��+`y]$mQ5c��f�UR^�&���IžK�fgU	I̐C�#+>���n<���x�:��@���n4=�ϳ\�]�r�K����V��l�c��5oX҈��X{�L�I�%M��V��+8%-�q�g\�ĝ(
q̫�,ɲ��E�lǓ�k�\�{��A4-x�՞8�%a7��s�O�&��d3zHn9;�T/L
���R��E˫6O��K؜��˺��k'�=��+ˤ9y�Hx�۵p��eu"%��bb�3O��|>����Cȓ��Z�[��o���F�lɛF4�顿�Ms�������fO�f����.=�"��x�h�jN=S��� 𒥅�@N��$�-���[���I	���O�AT���o����)���yu��-���e_��/��_90��,�\QI�qr�	����<����p�[$k�(@4��y�4�%DP�} qd\^� `Uʗ������A�֬	���ח�\�_���_��Q`�@�ɗ(y��&�����=a��h`b*�U�+���+�OZ@�%E�ȹ��%�Uy�~t˛-�{>���8�r�����h����|�M������Å�y��	DF�`m�T�@i�F
��8�Y��j�]�	�B؏x�\�\
�%�QO����zY&7�v���. 7K��꟒�i(�]�#P�F��Al��@ac��T��=�m>ь�w��BOZؒ�IŶH+��m�3
�1Rb�Y�`>�r�E[!
{�Ÿ!5�6�Z	���,qLR����K��h�D��+6�k��P��	(f���ze�b�K
�
_g�K�wl�ɫ��lBɋ�Bc�&@��Q�he�Qj�f0��x�i�4 ��):`���,�t��z��䤈�,�Dװۤ�S1s��0lԆ%#�rx�xή��5���:r`��G����I��J@�#P���@�C���zPe<����,���c�����@��4I�r��`��B�T'�Ɂ@�Q�\2�e�
	��@^Y�*C��C��1���=^�%q��S"괗�zK;�b����́�(��BRK*��Y���7�&�sRî��Faȃ[�"V�Gӈц�؇�vX?B�/`���"S��;�`@.��@г�)�4T��}vB+l�&��J0.q��QKP�h%�8��9� �E�؃���s )����z
4�d,���"9`D]	!C�#Ж�Nx��mf =�g^)'�L�x�8	"��k2���aha^ݑ�j	<hu�R��:�{�&�
b?p#�p��I#�k�b4~T�T=\�ڌ#�@��T��)�b@��#�#� vVݐDW��Q�1Z��t“V%�t6�#cd�6`�F<y	6�0�M����v��񰽫�L���ֳ͢�t^�W�(ߟ3
|�"�#U���!�}���RQ�[�h��W�Nk�B���+W_q��Fa��&4a�P��`Yb\pW�����5�=f�r7.�	�z�I��M��R�'�ezO��Y�I��s�C��uC���>}�$�J|Bo~�*pW�i��+��s�Ds�o�	?=9�2>.��1Ct���`)w�g�'+�p�������²8�=Ь��Ȏ�%񥬐_���c��c���%[8�K�,�v�q�?	���5R���T�3�eCTmhJ�NNyN����a�R�S
!r�2�-�6aB-�9���	���Q�Mz���
3cMkʎ�*��i0��+L�Rڙ�ڷK4D��"D5q	n��a�K;���1��_Q鼟���	�y�>��I��bs����������$�',D�,����xj4<��d���m'��S��|��+:�⼅�BO�^㦔ߓf�$Fҩ�R�s����Gя-���i��Y�9���Q��g/	i	V�&u>N%�Ə�/ ����U(pQɎ�<���n�'b���?�b��(?
�����7�fTD+��*�K�b��rq���{'��C7��$� 5v�j�T�l�憔4����"��ɭ�l9�c0��L`F\v2T������O�G1��z� V����!^������� :�P�E�S-F�/���-z��$�<G*�hM���S1^�e���>��H�r*\Q�"m�&��ߨw�[��"V�ã�-�j*8���ݩ�q��1��{�!ɉ��W�m",;!��I�ʞ��n�
w�)�
�*Z	b���k���A`�<��a�R-�	��x��9��:?
���2�~;,
ܤ�az�2ɣ�"�������GG�) ���=~O�f��$#��ӫ��������L���(D|LUƒ��?�y%B��eB�b��f��{�����'c�j\|Fs9*������I5�w(ј*�kB`���K�0��ks��|LS��zҘ������n>V�}�)�v�Tܩ�K�:Tm���m~2l>��+�V���駟@Q2H��G�����~��7���i2o�wb���A��>`�!+�=,�ro6#����ᝐ/�CɺK�,LcAR���D�w��
�+Oy��J0:*�?/a���A��/}Q[���@�@_P<X0G��82��+� |{n���zE$G���F��S���~ɀ
x)��
 ��&��C�ǒ'l�T-�=��ѥ���%l���E?Fo�

Y���h'=(���Ԃ,?�zC��:B�Ru�~ѕ \q�?0�k��P�c�r4��g�� 0[.w̦��~�[:�[��\Fg��^�
�]�#Ϣ���m��9Er�޶�#
���
�'X�W&t���Evu]�<[�}?y��7�۫��u@w�}���B5ϠpW�Ⱦ#d�ޕe�+!b�̈�*��bbS
��v��(�g!"����ݦ�W���J�aWC�w��D}�I׫fWE��qe��*���PS�|�'k��d��^_O�l���顯
HА]��Q���#��hѩ�_�id�\����걵˳�}��lc��k�޾�����;`P�W����˟E�
܎��X��iT��C���8����b�8��d�SG�[)�w^U�n�&F���E��:W���9�|CIB���xI��Ra�s=�W�����w��[t�p�Y=����B틳���}n�Q��iT�4��)ܩb9K��1L�&��]4Y�:,��@��/���L��y:�#혬ݞ?��S���i��+.|�a�b�+oX%�
<�N|�ri�����\͌�
Z`�n��K��h�/�r<mM���4,<�(��\:�9��|+b�d��_�"����s��Dr���n�MHݏ�>mzá|�9�5�fI1�[l���l����px�m�
Uvd��B�n�D�۪n�5��[�~K�ᦫ���z\��?�ɔ�l�(U��\s�3��ޖsTC*�x{�G�o�'��2����M�w�kR��w�^���
�
<�9�ƃ_�N�aط���D�̰�Rv�=�N�뉞��k���O<s�tkڀr����
H90�]�'k�{!�
����5ɋ�u@>��
]&�It�=�͊f�#O�B}�7@��V@uH<J$A���ˮ4EQ�w�Y0w�loo[?���+k��s�B�������Q���j�����~��n�د�D�7��9Xe�
�`}a�7��S&��|��g������
�Ph�*2�h+�y���;L-��S���(E�"����Z�Q��.P�C�>���Fx�(�d�7]~��7=P����-D߷O���")ɕ��xӣ��rWХQ��H-���'d6�����~.h�ˋ��	z�<� 1˒�t[^��Y(!��Aݕs`?HT]�#��b!���L#*]S�B"M1)�w����0:�11�+SPŅ<�]�(��lr���vR���CV�Q�v���BS�F�o¸�Β�~AxM�$Z�ȉ��m@Id
�4צ��JNe�p��-�j��̓�02��`H��f$R6�qi*Ռ0���H�UZ,�H]��"��X�3.B����&	��R�I4Y�|�D�?8�p��ಓ��ϟ�U������Q��ڬ?�'���}�L�{#g�n�F�3�o��I�N��BG_�+5�;�qPb����m�.�*��7/���I_�^���”5��
����L����wV���Ua��
��=Y��
"U��|���t�p:d�3|K<"�	��h��O%cO$��i[h"�
�qVx>;������(�|�FM���2Epe��]�ݎ9��eɎ
�~1�Uq�.�l��#�#�'-Z���o����$?na�N���rmx�����:��.��3=�d�mRQC�ߞ�(ا=z�(�����FT!Q��p�6<J�G�j�hmylrlzĥ����_
C��W2ur)�60�1�mC����Ե����3c9�k�W�5]�"�H�k̀�o7�~x��-��@Zn��lh��6�	�����'�Q��7��ς)+h߇��J����A���Ԁ�~ok�X�k�J����ͱvn�$��R�+I��8���`���_瘪5��Y��5�j
˕����t��F�ku��d���~�|�j�Ǿ2]�v�[�.5'=tՍToYJ$V�!{���(P�`0�*Un~;�c,��)Q�"�^��ɐhfu�y��Z�4���i�lH1p"�8jj�-�V�[c�g���c?�-�9�~YN�v����q�m�Q4�C�h6#k�37��<�K��xK���DS��@�6#kg�lޙ��A
c��<�nH]��5�/x��4�<fY#jV��;�H���������ዩ׳�ƞ˙?��mxr�307�R����%0���W��&W*袬�\�dVG��3�'5����Hʓ�G��]Nyb� DZ�!��b�t�A��ڔ�i���F���IyV� 4$p"e���J�G�$p?!�ƚ�m��^���2M�̹#T��' �M9���sĒ���/8��i��a��S�S֣d�:������9/���
�tk�Q�b���T��P� J��3C;%:p�}3���ϰׄ�~�C����n}����W�e0��׸�}L55�^�g[��A���ӫ���7s��i��r����w�v��Gߘ���^�'�k�� �l��`�����j�t�����-�W�~��?0��v�ҵ�s�"@���~_P�*�Ei��?��U�=�8�֑u
��Eq��e9u�b�_�&T o�gC�n6��ٔI^m6��f���k���?l�M
�d���b�1)^[,g߀�>��S�?�@�G**�����X�tLN`w÷��X}O�
�_(@kx��!����~������;��4���2�,C����ł=��/��/nQ�ε;~�ar���o+uŞQ4��PK;��W�oL�
 "setuptools/_distutils/file_util.py�Yk����_�ja����ޢp�u׮;Ȣ�
�vj 5j�Z1;*$ge��﹗�<$��N�,k��幯s9����7^Wn�ԕ���h��k�˦.�6�Kc��(+�������o�Mr��x<��zc�ƍ�֬�LYk����w��^�a��\�A��Nx�+U��n�]��i���B�"+�f7��'y6��dUŅ�����<���l*���ev~E�������?S�BVծ}�i4�j)��Z������8[LE�T,��Rٹ�Qg��ك?�%?�D��y.��ۃ���0���_ذ�-2�� ){$Ưĺq^,ˆZ��O�`0Y�P*JC��Sa�,�!Cʂ� n�f�"(�S�Zk=�^
�X�}��
�Ū���0K��������+'&K6�g�sHzi���Ɠ��,���u���z�W���H؝�fQV]5��ɯ"n�{"^{P�݊TkS6	V�!=�xa�ݑy���(����`��*�CY�2,�tp!�p�������7�,\$��,o����^3�B:����8G�2��Jx�g�"��	~���x�PYKVS3�-�-�G�`�DH�6үf�D�	��>�	;��55EO��s'���H6s��RUʫ�Mr��6y ���C�K�mXP��mls�Eo'��w���vE��m��q�
��(z'�8�=�Gk�<t��~΀��%��ȑ�b���ݨ��g���{��r��̪�*�y?�i;��=+*�I>	��S;2����Xd.� }�bc�S�F͑wQ�z�z��6��� �Q��,ncEOcK��ۦ��11�b)��J��e���"E��*����2P��:�9lQ��^Xŵ �
�VA��0�j#O��m�m	�r��eH��v�L����h�m�
EˁB��˕�<�:�-M(��bB2c�̧�
���F�w*���Zk��,4���v�(C�1W�qD�HT�X�"6���|9�
�0�,!Z0��n�t���%�
��y�,
l_�!vDa�UU���]c�E(zS�E;Y'C�R)�zf7�w��~4��J��Q����-2��L ��։�iȯ��Z���̠��UN�$zޱz��a�����gB<�R��<9D�I��1c���֭��83��!H��ԙg�Q}��;,�v�C�(j6̥�?�d��F+U\�����P%VD�t#u%B�2���b���% tb!!��z�*���5Y�,�n��	e�A�obP��� N���a3�C���Lz�֣��躜/�� <���|ckD�o6x���}A��ڇ�]�.��FV�8`�6'��$pq
�,�B	h��c+S@ҩb����^O���옱�|��{�.	'u5
�x!YQ1޵�j�Rjb\&V�6���ɛdFO��}�^��)�et����Nz�����s�r��z�U.�k�ᵃ^0ʴM$' �<tc�������_�c�]1���6���b�b���g!y$D${�}g���I�B��QĄF�\��*D^D��)�'���d�k��mz�]-��F�K����7�o._<��Ջ���3��_�EX$r�D�c��T��U���Fvρ���R(\��4ccq�j�V�F(�{�����Y�$��8�g�#OO�q��>�*��E����ܡ$����j���m���JG�/�ِ,���J�h�&cf�!F�=�
!ڛͩ7��!�)���/�K�ڃ�ـ����Ë��߇Mj�O�c��GY5�7���t)n�[�PR��W�1F�r��t|�=��� ����q#¦륙����>��'l�a��
{���_.�o�"Ϗ�,<�*���d���\MB�� �l�&/
�F��PJ
ok��y�4���w��I�8��&(��I��P�[�Zr�^	�x:շy��H��>���MI ��]=����#���vL��OQhq�L�iD���W�Q�F�e6�ΐ���9"F�עa�A&��(b�%'�|�ׇ����6ҹ#�s���@������ԱP��OA���Q�"������}zevb6L�_����ݱj>f������c��PT
[�n�)�S��ѵ�'�iQ[��g�I�+���p�zf��c�)	��\\�LtA�B!b�+��q�J�G����M��}��6
˱
&��j�{8�q�~��GE �b,1�(�.ߧӻ�ݻDPtP���?r�S�%ڔ�S�<�
s�����_h4p�i�����_`����#�MM,F��!���]}yj���ԝ[.>��{�GJ�]�ڢ��Z�ު�|

n�s����EЈg��
}�6PX�_H�B.���'O��9����k�
\��4�vĂʥ�.B\�9��措ݕL�"�T6��\Q�ͯ#��W��W�J#;U���[8�QnG���������dГ�&jx�9H�v��?�(��к[=vhM'���)p�-�=�=,���z*��
<Q�H���fMu�=y��ݳ�?Sb��u�~�)���g�]"$�b:�F�:]��p�H�o'뀇u_V]Ý�џC��B���s8�eC�;�ԕ���1~��w�s1>��>q3��sJf�=����X�^F��ǧ�d�`w��ީs�b#S�Je)�VT,�(|��Y��e��~iT]p�q�";���A
$�r�ƺ\p���,�g�N��v�F*uy,���F5�N���'1�w=���²�0�_PK;��Wqq F�5!setuptools/_distutils/filelist.py�k��6��E!9��f{����
�m�<�ɞAK�]YrIɎ����!Ҳכ�ij�D
���̐���M��R��%�
�T���ЬY���a��\댵Zl^+���eu��n�Dz���`�V�B R�����` ��Z5���I	�4��������K=�U�dc$�ُy]��j�+�,�g�T��x�{)���7�~κ�'U#T�K�(�e}���`0 �,.~��7Ĝ�xn�l�ꊉ���V(�X8���,Hr�%\|�*���J֭f��:��f��A0�)1Ь'�nx��J��FhCc�T����Pm��Y�|a	�Ȳd3�~-*vz
��[�c9�^����n�n�Z	 @(@7�E����P>_’y���Xf&�c�ٙ�ْWrբ�
��-�q�5�R4bG�mUE��*�HPB*��lh���zf=2`����Ԉ�s6��J6�i�E9�؆�j�S]���ګ�
�742��O���j:QW�E)9�ɀۆ]�B=.ɏf<�ԅP ���L���hF2�Nl�p����B�f�&YN�k@�.n/t��F-
��I�ǠLx����P�@~�R_X@
��#K`<A	�@�9y�UY�x�>�ϫ�Xj��l>z$��x���^L
���R��݌�J1b󒃯����* �3D��I�݇�<�@�t������m]��h�K�Yr{Ua�"!`�JׄQF�d�'�tlf[8�
�D�#��	|����!��2�#�5��<�N�8 �t�W)�	��?��Z��=8��6-�<���J����qk�Z�*��ayU<ŀʖR�,y%0�����QbY�Ŵ ��:T$�o�n1�QlZp����8�D|IdG��J��@.씝g�^�N�G1�r0�Z^��$����C{�s�12����>ǰ�*-�bZ�JX��ǀ�M
1���F�i�_n�}b�^߻�|��t*��tA.t0�
d�&��˶I���?��p|�#�/TT�6b���}*.�8�L�=h�
��`��$�\��������l<�g���QD:1���t3"kڠD�t�/.;��.����r-Bu����??��@��I+�ed�r��E���"�R|ޠW�������c��g�e������CD��щR������uUo*'1��#l��M��C��C�F��X+U�B������_�o��wD�g�(�@�F16M֮ ��]e��Z4�j�3�+ �$��)�6yyFɽe�&�R�9$4c��4q��^n�6D%��h[6(m&㲎V��3%�v���<�B	L@����v��.�	���p�����>�nĖe�#
��%N���{�޽��6(y������M�
r�KY���k�'���d���b�*!
�W�$畱6'V�3Tr	����B�X���U�I��jO�f�Cdž�,a��\��c��2ܺ-"�/@
n��]�i��F��������K �1ڇ@k��y
����*�ro�B��rq��1�X��'����^����H�+%��(�n�.���7#٧��3F�O��7hr'�:�������H���^y����,cJ���P�m�5�tN�W)���zU�2Y������e�1��f�w���p�)��챂��㠗�|;�{T�o�� 9��ۺ0��c�k=GGM��{'�N�R�m��7�S�A=������^����ފ?���n*O��l��HUZᤛ\�4�;5z}u�$��|�_�cؔ��&��3�k�����K�,�/�4�PXS@Q����|�O��Y@��iA]W(_+[��#�
�؝ǜ����wmΔ��D�kŨH�W�m�������+�R���%����jd��I�<M�N�xH`q���`�*��T7�R��Z�s(�SL�F�T�ߟ�p�uHa�G����44�8�d�O-踐>%��4a˺hKq���I�
�$�:q�Uuu�W"�P���@
BA]nr���4�B�p�N=.�8��/�.�^`Ռ~���:�FM�O��G��鋳�eU��A�<D�#����΍��Ybt���"��{ޖ�(C�M��v�"@/k��N�����j;4�
����,E�g3�pp�dx<!9s���Yݸ���>��Dw\j����8T7\5���Sp�~�l���|��:	�x�wH
�+�D����:f!�1����֯��a�y�WQ�a �s��A[|d�P����:J�m({��u�pY�1-�e��ă�!
�~EG>=�=�Q�#t���B�i�!,���m�z���й7קRL�0\�pg�(�S7�i�D#��eBa<c�ќL�n#������/�����#`�\l\,�mZ�k?�V���cb��߬@���I�`%�bjNw�5����~�тr[BGĸ��cC��[rYs�w�;�LwU�;�_A������`!Le��|1D�k��j�U�Hqޞ-�/��*!�I��DǗ��b�������l���=��Q��v�`�4a� ���lP��c��F8��u���p�I�'�\�+"�M{E!���9���`Ο⶟��v4�an:ñ����g�}��N�o�'t��<%�ߛ�?���28a���?]<�m��c�4SM)�j1�w����xE@�+Ih�$�C,m%k�
����Tt$��6���%2PIY֛RV�z��J=�ltԿ�.<�8f,H��^5�w�tf	5� ��pw��-�e�e�F�̑2�W����1=�}����xMI��Ԁ{���/|]�¤5s���;:�1��x�s�ѢiV����	(�<>���LB�!���/�5����8��(��Wy=ݹxz�wr
����j��j�ҌW�@NK�вw�h�/!Aţ[+}<g3�P��٫}Q~b�Q�	k��4o�L#k�����j�tL93D�	�Od;��A�W���g��b��Y�A1��M��j(
��:3R���2r�s��h�1������ѫؚm^��ز$9 �%�ޥ��=��3ak��дWս�`�&S#H�I�ɋ�M��``T����^Тf��ݔ ��:���7D�o���P���;?|7�j������2k}Q<Aa�v�+�iS��v�~�K,�,OKym���r�ڒ+�~��۬hbɞ����<��p���c�[C�&M�(����t�M����{�Rs���J�W�;��(�a�*��*�����nG03E�@�2`���\������S4���A2PX����*1��km* ó���id5��b"��ۂ��,����9�ǵŎ�d5�@zB�
�s�†Y�莫�6w���C�	�X�k(�2K�E�S2bd+�#x��R��;�7�@�y�O�F$��V��,���:���\;`�J��5�]����<��4)X��Q'=����e韣920���Y��4����7oF)����(d1e��ȏ�a��GS���a��}���]M�߈�G����Q�!0�|�ܠΆ�p���i�B��q��jM���1FL���q�6K��.j��
��h�x-y�iѠ�:	��;��U(����=��H�.��<c��E~c�?fl���Iӓi22;	���:p���e��gc�#���H��m2��Qx�	�>}��(@�v�tD�͢`����[�\�S��i�]�?���� �����o8�H.w�FɎD�8�$��ս졧� {	��R��o޽�~|�N�!�51�^,_��l/P����{��<i��G��3�s�i=���~i�'RH�?PK;��W9M8��setuptools/_distutils/log.py�S���0��+��C0mN�ԥ)�-�����=j�h�d)H���}G��h]���y�y�4�X,��j�A�Z<��Q�.%�:�����?�K��2�����m�"���*\@	�d;-���Σ,ق�0ja]�=e�k�*���3V;�Bɣ�ۯ <�Fۃ�1������+O�b���1cȞ7���!���L1����24Ō�U޾�$�9�0�Lmg��x�>^��s4ŷ���Z�g���$��1�prH��r��G]|a@�:���N�%�]L��)�0t�6rd�zt�i��~l�j��k�0���l�5�TTU�齢��7E�*X�W��P�����6S��t�tr�T>tAi7��<H<;<��r��O�%S�����GH6}�_�d��GŹ2*p���L�4�����
�Ծ�\�#���U�F5ʚ��w��a"�������ҝ�-�r���-r����jT������p�np�j�B&y�EDG7
SAtM�?L��"�!1�Ȯ��㰻��PK;��W�!��"�u&setuptools/_distutils/msvc9compiler.py�=ks7��+��8���,g��%�H�Z=\�,gOV��P�h8Ý�$������1�$o|{u�JL��h4�B�v�qRVu��e8/o'?L�"Iy����Y%Y�N����x���%�E����$�X>eՌ�h\VE4�XӘMҨ,;Ӽ�'ɤ��|Z������
�:Nr����}��C�y�)gI�?�_wI5cCl�g>�߿���M�i�)��&KV֋E^T4j�ƀ�-/J��DD�k�1{�j�a���v:k�c�T��x���X�y�B�,������c�����t>��Q���'^�,�Y���|�F�&�5;�r�A5+�zF4*�5�V,�������;w�aV@��'s^v:�0Ї�V��E�Ox�K��ׂ�owQ�RaZ�s¤�d�6���@���O���.�F}n�IF0J����+��?�r�f5���]�l�&�Q�@�+e�Q�_���U�"J��W��Į!�]��;5����v�����E�'..B�FreƸd�~uE_`\�i]�ٻ�G%G���~J���~sN8��Bٛx}�\D�
����H��5˼.����]�9��G1$g�=�>[��W�<�g�r�aS���Y=��V���(ԬZ*�z\7]G,����oC(��uX8�0<|?���?�xzN���������ۣ�CO����p8zvvNs>�;?�8}<:}�`���g����_n��B�<�/�p��~���v'�2�
�����:�B�^no���E�E��X��;�2.�"��4�?��$/
^.r���6g�"�&����x�n�3\Aɾ�����-��ڌ}L�W�Q��p�����Yt� V������ݫ�^n��1���ObB�|z���
~�i~}2-��W�	P��R�:=<2��)�9�ˋ�n��%�Y=�?0�?��JtA4�y�`7|)��)`�>�.���V)��h2ዊ�����6*�(M�qT�B�#�@"0�ܐ�Z�2��ϑ�`��z�z�߿E��w=`ʎ`�EX�6�hͪ�D���_��;�;���.�/���L��d��
��
1��/�ΗN�CJ��DK:��BiĦ�Q�h@���t�s�çDHjL�r�`o��6~P��Q���%i��
���8�U�\�[ma�	y#�Y`�\��\5�E�(FQ����C�?aӟsطqД��\	C�Z��
$�m�R��/��!�N��B��,EDLE�a��ْ)�nC�8�3ޔ�KM�~n5��f�r�E�m@-��s#Гj'(�4���A�3Z�X��!Hg�����l}���)fw,V�Yg��rw�$=a��d�^?�=#�4��Ҕe l��@����Z)�r�R���,����o�8Ձ�€U��,A��7d

��?!�2�AƗ(9$�G���m�J��Fng����b����1��4�*�%��"��B	��H���
ڂɒ��=a99�tqܮ����[A��|	J1-sJh���8�D0�V9�@��/��i3%YR�FA���@9x���;T�6�R�mI
d�17�)v�4��P5�^�d:UJ,�_g�\v�#xV��0&\	v����X&&�Y#ս�?ʀ�iz������4��Y|�؇�.8�q=�bh�_
p�$��'ll*P�at�h�"�+��a��%�O��p��ϫ�3�5l�#�n�[�h,U�����H�vD-A��Ak\���/��J6������V|�u��W<q�y
�x�F��5�n��*�n�]3fhT$���c(j�y
�-GG�8Z���h��+�[���`O2I%:K�A�(PAC�p;�o_n��F�ݍ	�×���]Ԍ%�^�XZ&~�S���-+9�Bt�Y�e�6�%�M\P��ƒ�
���bl��1����0-�[�rT��Y�6��؉6U1��������E��Q�iۆ�0���j�����~����n�(�����m�pv���E_v�R_*�Kq\:�
Hh$�<L`�A��:T�ୀ�8�v�j��Q�nY0*
�63ѱR<�&Fnq?W�5�RƬ��(H��
�,E�v����f��E�`X�M�:X2����*�xT��y0ض���H�����B5�wQ�i����p�݆�4��5�Q�Tvw�1��;._5�Bc)Ϭ��]�A Z�/����\�It����<�=/$c ��
�˝��>�P�L�V j^��(���/i9ʛ\P��5�	����5m-8�i	b����K�a���
�d���y֫Pg7d��"�N�DD!�f��_�W�\����TD�VM�UkA�Y�$�(�0�&�p��w�U�m�i������"vN�" M��G@�Q�A �Q���������n�ƒ����Z������_���C�s�x�0DG@p%t���M�_c��1,sZ�����;�mF�-��&6Eʌs����VA�����bi�kL�zM2T' ��8���K`��5��o�T����agA���v����` ����hAB�	�P����DC����~�Q���L"&�j#W[��A�D�I֋���D/��N�b�
³ۤ�3<�b�ocX�z>NH\4UBNH�\b��;��X��,A�IAd7��P!iF��8�%�����$d�\FI,���&�n�
��0��tx!8~0�D
���b��������DC�6$X���z$�%�/�hr� ���������!.������,��@ε!��R{HDY}-�f�A���a��u���")����о3!���.1�ZP�ھI	���7��*��R�T��=�
���]�L�]n	�P� �x���M/�S6V��1�������@�W�p��+�B�i��N�I�Y�g���D(C��AP�9,'u՘Ɩ��jm[��P�;�c�XEH2Tk��9Os�p�u[Fh�f#���0`i,i�m��DF4��-���<��|�
��׼X��إ�d�۽��UW����&3G�!?�9�!�{Ez�N3�y��h$�A�RV�%�8�����]i^c%M����U��/r�e�V"�����#~��BUc
��ѵ���1{L�m�\��:X%�tZ�MnB��t|��[��)�S\3���R�u�kB<zwh�����zA��n�*���9�3���1P]T�E`�ٟ�����#!\u5d�������ih��)��)ZJ��S�uD�
�
2cyK4�v{�2���0��r�'Ֆ,�H;iuP&Z�0Z�km�����靱��X���@��%���L(��_p�^\���-Hg��i۝���p�i|�ȵ��yi2US���*�&GV�L܆?����-O�(�ي�=���~_�[cSceϹOr�H��|�e������T>��l����O���} �A}#�,h�i���g@��d4
����Rfp��hB��V���.�v��3St���E��SӚl5$lN��G9�GQ=��u���_9E�+"���Ô�`֨��o�%�gQ1
��x��R��-�G�X����O�
1�J��kP8����6�[�I,&�3�$���eh��f�\T,�Ⱦ#l�h1~�򍉕�JPU�Q�µ�
="M|r�?d�}�j�m��T@�;{&"�0F���s3gC��C\$�Q�qTE,P�5�`ꤜ�}��17�����	�ɉ5����7�c�pһ�U�E�rR�Y,Ŀ���uцT4����9V�����ʆD�$e���,��V�J��=�K1{��y��sYw�W&�.��BIO���ߝ*(U�\�2��P"[�"p�=-�4m��5��Ք����$F�I4(��`m��pruwk�b�
�:ïxe�Z�@�6�eǦ���s��hDWTH@�=%�I���T��hS�\���{��X�Pj܈x0)�N��7�m�s����ڞ�
3YEBN�Mb'�5�3���]�T׫�+�z5#�׹�����a�1�9(�d��~����@R�XS�c2�M���#@�J�<u�
�XG�ղ1�cw��b s�4&��K�.7��>���C��}F�o�(����0#eQ�;hn��-X�ڙ�۹n&kF@��$.e+��RPt\�&z�cL�-4�����+��f�ei�����c��cR�eЛ�Y���P����=8�8?:b��hx�k�pn"+Vkt6�'�a|�X+Z`�.A��I�B���v����"5��AS/,P���3��"��U������+�0^a�FLQQش���Ǽ�]tm����Ƣ�xE��)&+��T=w���5vF���ξ��H�S��".,��;<&|�Sٗ�Щ7�yF�f��`����w+p���4�-��w���f(�J�Tc�S�`�T���%�:��6��X�˖ceH�����
���l\���Qo���H�Jp�sS/\l/̟��f/�0iH��؉0�Wߍ��A��?Z6Q����z�a�Cj���0`��V�J������e��V�Q���0�=�Ү�{ek��z4e���W5��㑢'k��6~Vd�<�8����;/��}�VYq9t""��&�%4����>�Z�>&�֍xuz4���g��0^վ�`$Eq7 8
�k.��@�= ��9z��+ ��$�$d�l��ص����O
��	�a^�N�.���.�6�Z�2�Q��S���{����Pg}�N}0u�ʻtd����n�vXoԥ��"�o�q�������z
�&���'K.�買��i~��]�yF�������%�spzp�ˇ�:"�oD�l��Z=���,����/O���[|0��uz2>�E_	zh�O#�_����H��q��L���4�.G"� wp|L�1xt�������|�x��� U��i�����@�����"w�l�C��ݝ��cƾ�Vml��`݂QA����h_>��HE�T
�P�\�d1{C1y]-�~�La���E��4������r ��P�2��!+����
J]�PV�6K2�Y�x`� ��zpY����1q�Ê��`�SF�K��d�I���VR P(@����V�k���/_\	g��a�P��s��l���K�g;�h�a���X�#�޸��}��rӅ.���>�qsבlAt�H��D��³X�f�UW�P0��zj c"��A�7qD��Đ�J�L���?�y�	Gn��y�9�����N�tK��dz�E��
��-�"�O!V�G|E��#�o�V����vq�	a�qb'Ŗ�.
�?
>'�_NJ{�Hi�5/��j+�$�/������(}t�;�Ң��n����5Yx!��m,���T��e��Y����ţ���&��-�l�+�`D�#E��W^�qda�PT�=p&�CeiRo�z��@�/�Q�c�B�Ӛ��F�1*b(������gEii	mJZ���Vi]*x*$��'6ƿ��#H��fń���w	]���Cn�@Փr�~��7��2�)�n����]<��K��<�y�j\Qup��;�Z_�Ԥ:��Gӂ� ЃD��t��R@W�[zBR%y�n2��[�K�>,d��%E�n�|�E�VL��!�PO���-��e�~��?��l�)-���k5\y�EX/��..e�~R ��K=V\6(]���~Y��y�ae�xlhۆ��%_����H,<���O��+z�1���6f^�1�W&S���r$�i��;kn��J���]b��7�<��C�Pݣ#�iFr{�ͷe�R�p0�'Pn�k�>o(���%t����A������2ʮ9ɣ�OP��&�D���"�EJ��Wީ�}��IIE�2d�(<�D(Z�QY0��c�`��ldg��/�nI蹍Az�[þn�^���d����8���Ӓ	s�	����τq�	?�T����o�s�Z?����ur�t�MK�+~��Ӆ��B<^��~K������?D��|E���秸}^,�?�_�3�I^v��(�7^��7��jyѽ�g�C+��[&�&R1����q`Lc�p+�v��U�l���<.����G'�#����)]�!�Mī�s�8iRk�R��M�۹Y���Ph��ir?�1;�����6�l��yR��)��	�CŃ�]��P�[��c�E��A�x�����:�mv[�F�!.É���9������v�胒P�m�W��g˾/��-T�H��,�U�7c�Ke�9
\�'�3$�vFLC��*zB�C��x��/R�fg�h��1�jT.��<�������N���ut�n{h�Rn3�_�s�,�Z��w��]�Q�X����C&����.�=Ef�voǓ"��1����
wLV�"�Kyj�8UzwX�#�,�&P[�����Ń�_�x�PK<։·��8���{�c��&���F5y�._���]�(�,?�?����6'��<xiτί�s�زR�3ۃ�TX��y�ۻ���;Z�s6m�J{_�i��m�n!��/h|g�5��OqA�G�b%�,raP����f�d�o��j�H���_���([*�xi22�	 =����mX� �;�n���,Z�Ж&0#%"��[�X��q 5n}Ȇ*�w=�!�8��%�Qq�޳u���@@���r�&���)=��UkB��Ky�u�9Ҳ�o�8�O��H؜�m�i�wߴ���s{�K��^Y�8�z��V�����ˍ�O�N��Bo��K'�GY2�e%OV�X�{�
c&zr4o�Y[A��Ң���֕{����V�R�vs�4o(V��+g
m�>�|�ML|�M
x� ��z�g��`�Z@��&�-�s%�eZD��}�:K�v╅�~	݁t��)/��s�;8>f�Kh��9nAq]���
���v�/� Ѷ�H`��
cg�go�j�@"���z�ݼ�A7
D~���:�yE/�زg>5�-����Ӂ�5�T�zPͧzcA{<5�Z-�?qL(�����;��������ڰ�+b�&W�_`Vц�9�Pd�
�	H���
�o���<E
��HG���度��nqS=������
��䔬��m��SP�U2�EU�c�E�-w�!I����zD�J�7�:�~�ܼA4Q�YU-v67�e�m�su��|7y�Q��R#A����/��a��V?��Žy�g��!!�����2�FnD�P�8��QR
��_&c�W�?,v�
!�Q3��dW�Ǖ;H�n#4
��[*�d�������x)��-�|���^���k��0�j��Z㽴|j�@3��r%bF A@N�w�Dƛ�:�uΚg`�,,�
v(�X<4�כ���˗�h����.��юn�$&[��"�ח;��R���c?����+�ky�P��P�������%��� ��v�q�K����þ�] �56^�B7�(�`+,߃1��ü��0aT�����wђ^�7�Jw��?��[�x�+��వ�x�����
��;�}��]2�j@O4�n�v�h����EM�Z0����5�eVo�����>L�;���4pr��Ϙ5kP6eɗT|h ޒ�-5
��Ś?B�YS��壑�3�
6q�-���ˮbC��EB�R�K��k��U=�G��c�
�L<�*��L��+Y~�����}�ve1��e���w�Z�/0<H��W�X*��<�����[@�̘`(���#W}����1P��96�<��4��5�����%8/��^,i��z�?�SA9g� J�M��O��v��s��G1�[-��?�
��^��
�����O!H"��͟�����>4ogL�g�{��vU�OwA5���i�����F�G���=��O���?n�����;�n(Ps�[I�Dn7-ƅ��v�+�EP�Դa~���[���;��A��s_~_�	��?�|�.Ò�M%Mp��~� F0�!�#�������ixW$V3���5�����;���F%t��$)'<M���u���J$�s�8�-h���o����>���D�y��o1��EB�D�9?���6�_�4�n��n�-Ű���wA�2|�E�n���{�r<5&xU�ZDՋ��u�yi��B
���&���Fw8�6z��D��n�<�w$y@���Z4}�T`��y�{
<��0b���I%]A+
F�������җu0~�(��ݼs��|���G�T��pg2�Ō���]��b��E~�F���qi~
�'�Ɩ�𾜐/(�H�6ʄ��G��s4�zt6��d��R��(%�@u�Ҥ�(���9��E�����7��<�#й�D��sK�E47�Ϲ�![l#�f�p㘞l/wD��@=b�I���i�Lϟ�z
��}5��c#yT�MP��'f�d~k��g�ōhC9�yZW\���W+I�d8e�.�s�Kp��F@y:3����5�f�"��Ø���5������N�Z�}���v�f^��O3��˯�!%� ;Z������=|��>!Y;�PK;��W
��]�\%setuptools/_distutils/msvccompiler.py�\�S�8��}�
=�R3������Ud�-�!_�
��3�0�gy�����_wK�%[���W�u�l��j��?��y^�rUƉ��v6˖y������2�S�NƟ����S/�/9|.�,eٜ��©(�pV��0�%��yVP��xVd"���S,Va���*�3��y^���>qY�M����gI��G��<��){���8���"[����	�Wf,�XȦ�k6�c�8����[�*��"[]/���_����׃�eE��Z�Y��.,R�]*�%�ɬL}�v��yx�g�X`d�?K�$�4�)yo��Wz�����qҭ#t�� ��A���hf�$�օ�g���4(x���k�.L���Q��8��=zլqQ�8}X��u��"xg�?�ק9O����_��e��^�%��0Yq���ʠx��42����dG�*"�Vu����a;�ϲ�W}�C[��m�P����,lI�*j��-"�h-���dA)-��%0|@i�8�g��
>�g9'��~��K�r��NH�y4�<�^�g\�
U�,`��˴Q�$��L�
t’�����*�B
��I_��A_�H�h�I+C0�_�V�r�X�xn����_�1�
Z������|<������*s|���88y�����a'��7���88?=��e�j��i��d�3�9��x^�YX�-E�)�	c4E��n�/)�,��|U��}v��Pp��c����A�s N>A��c�}�`�:�+���YO���UA�g@���T́�R*�֮׋���*!��j���!�q΁ǔ%���J������Y3~�Op���� mN=_�څl�C��Yu�&W�f���u�@��e�+Z<�s#YP�y �����N&�Xn�7�~�C_��M]=f���n��ؔ�-Z��dų�LIwdU_��7I��p	s�h�-/�f%�/h�5��p���?2؅��و����C6�O����Ob�d���Z����������8{hp#5�V-�F5�3 x����@���7YĽ�N����V�YI���zPz�a;^K&��;�B6��n��";	"�� h^h��q�A0<���B���T��ʢ��C���˯]�W�#?*��{L�sV�H�|�tv�P��	
�r(e�f�����c�$7�
�x�jՒ:Vu��j��n�x�ƀ�a��
�_Jl.A��w�l(*�\k�y����[=��(��&4q9�A�/?��k//�i��

�i��5�c��Ëw̬����:[���ց��!1TdYi4֚0�JP��'�c�]��~5э�����:��/��&�=o�0��pG2�/`�R��m�����=��y�
�:D~(8��+p�H�a���R�rx�>l���t1��v�Z�y��!�;q^ɗ>;�#,_t���c
G=����\EC�����/��0<EÆ��[��=������ϰ�
�.��e�829Τ�{O�L-M�g�v�yC��p�hDhC�ZLp3b;�'X�����~�|Ԭ����U����'e�<i0=5�+�گ��0��a�S��3��1��~O�ϓp�X����h����:)Y�0�lm4ja�E�9���%@G*�Q������s����$��J���d�X�p�z_��%)I��[��˫%'�fA��� �y��w2�g�*�B�e6���@���yͶv[p�eE`KxjU�
.J��$޻�E���c`�ve�e�5+�b �������!�����R\��fi���J�!nb��*zZd+0T��?Ve-:>[�����a����n�#eD�eJo8HH��|V�Ѫ��U�t����J�����l
��1��b=��7iv���PnK���$ߜ9a1[�<�a$�>�0�b1˪yr��MF��JJ)P�(-y�a�99x��W+tC����l��5Z5I����xC�
-�1�۞l�}�R�J�T&�x�\H{�ߖ��*Z��FJ�ȧE+�F�(:/��y��*
�B�0:Ґa0�aL)c,n��
vV��Ѡ�Hѯps��ifm��X�h�a"F�����_$;X��h�s����L9���u�10������ �O�
��� �������(%0����y�s2� M��~�ͱMD��U����O:xOsK�2u�d$�կz���t�̿KoR��ek@�9�/t.������Ʉ���〢�V�t?5�W3G��@E�}�B�{J���ĥ�WV�D@p
e�qAspQ�+�K֊��38�XQ/��U�l���	�b5.�h#n�Hv�Ε+R�ϘR�I�EF�uzR._���x	ߚY��"�Y{�~I��(C��9�8��i�A�|�����0H(.A4�nʅ�0�i�R*g�Y��z��mX�@�!�\�	���U,l���94�*�+����`�\ߟ��ԧ<o��G��s��.]�)�e��?�}�����Gʩ�H}̒��"a�6�U �<F�H)�&cv�7[��l�e����Ƣ~��`��ӧl���	��O�f��c��7��d�(%I��D��r�Zջ�3�Lq�Ԡo�5tnga���wF,*�A�J�'��;37��1��W�UŪ���H2ˬUF7��Jڰ���V���1��y�����7���SGW?%��u��YVNl`�����[��F�T�CvX��L`������8}������k#G@�N����G��]��!�d�!3��/���>�f�
���J��D��v�HDiKc���h|����x�+@��!>`��۸0�� �����c��ď��,�Ik$t�M�WBK�2
�*g$�&H�¤���+�ȵ�)o˰g��&�57��	�1�k���,4�%�
j��u|^��e�s[�H�A�`���x���c��ܬ>D��H�}[�����3�\�*�6�H�z;��#.�iv��F@�D�$����ZO|5[tR���1խJW�ҨQ鎳��Ua�U�pp�4k��~[��j�L���Abi�X"��~�bXԣf{p�>z|��*��7��!�A��S���z�9|[Uje
���6B�>V��lK�U��v��&b��Z j���`ך�U�6�h^y��,n�ކW��S��^�Y-4��D4!u^�Aj��N�$��%o�>�N��/�_��?�~���(� ���J��F�n���4r�>9p�G���]���� �����}��K��_�E~��xm%O�y^�@Rp��$C�G��O?\�9�pڿrL�n\�h���ͥ�Us�:yW3.a��6�M�E�h��F�=&*����,Mn��
[i�
u����@��C�o|j�q)�Q����²�kxSqDq��`�*�UI�M�����<�8��$?_�����Ee�0`�L_r���b��y�)�Ƭ���5����3�c|�x�_����cc�)��.5D`W+ZЩ���$�	������ҼU:*�[NԆ��+�"��I�F�]D🉦�p*نl���1�7b3M,�!m��n�\`W'4%��Rm߿����8�}�Ty|�h!J�&H���rzz�wPCh���d^*	�ʀ��[�ʰ���"�uS���6�1��,#y5����z9c��)��a�s�*��ЖOc��O$!G�%|-���Wz��n��N��#��TH�kf��͜B����WZ㏵ce݆�uۊhm��hP������ήe�ks��~aXA�>���i�T �7?��j�!�����[&J�Lj��̷�u�ŋ�ly��5�"�5\�}�:
h�C���aվ+0G�F�D5ۣF��DGC�#�Z5F,�ω�ZVm��ku�B!K�rh8������o�imIZ���t�N#zjM��R2b�f #����i�	�JoUm�`d'Yulq��
�v�$�p�0.]aT�K���"�]2�&Iv'�P�k鞪��z��D5	��ᄂ�_��JH
���U�����Xж	�--?��v2ɲ�YB;8��n_�<�o���m/a<J5�G������>��??��l��le-4���ktj.>���]:�����P~M�6�äb�j�"��}���R8Tƀ�m��Y���xC��%�}�g�	�Q��Xk���3��Y<���?q�q�V���&>z�^�mz��m��$�3����G[�����*��yt0�)Yn��
G�A�q �-H���tJ��"L����e��x��-��j��%��i�rm��\�0�x��.hubI0���CQ1y�&Iں�P�6z��[2z��`=ܥa^�KwNl.�����{�w�>-��$�0��dgF���d��Bg&�����Q$n*��SM�p��´�z�&@j�>�:E!��İ��b����?1���`C�k�x	��oO	��\>��;�e�[%�����N�ө��X=ZNv'j��}h�M2vQ���k�GF7����q�:�5�R!G��P��ї<�7L�Ҕ��*�P}�"�P3���4嵂��j��Y�&K�°����}�rv(ig�f�Zm�y]-��/����n�5{(��u�W�Z|hڍ�#ܞB!�k-y��ۧ/��87�ڶ�u�D��~r_�u�߾i�M�|�j^����S߶�k�7<�K�x�##�g�
V�V�mE�͸��)e��Ɠ�J��즑�P�إCO�~H���|�v%@���%(����r ��i���(rQɗy�Cs����w��P�Gz���>�Yc2r���Ճ�kF,��*�S}��|���&ty3-}�]��{����<�cឩ�:_Ը�A��<.�Q=;���>��OۚwfE��A��M7�4,.���,���x�Бx��$S� V�&��dw�
;ܸ�Q�-Zn:���ů
'�
T:8�{B�W�%fl[)ә��
j:��m~9;=�أ��zـ�IeU��Rwc��&�Û��7�ߠ3
�TۆtN@0�D� 4J�h��"�-�pΨ��U����J�kMU�-�-d��%e"Ȗ�7ҥmZ)�_�/f^g�ה&03%2��
�X��iP��z��u�a-w�׋\r��\fG�����	1�T�le��Գz�X�`;ii�Q�e�g%I �#��ZuN�V�ܲ_��7x�>;���4R������&�>�5U����㣷����Dq�\�bVt'{;W�e�J
�t��
vq�ƾ�
�[�k�-��Bn�x����
���J�p��nڑq�O�l%�}c�"�F��b�$�:��oB�!����铟֖�
*��+Ă��}�m4����{rP�&�4|��X/j�_p�jOw��^<���}��y�O��{��_�lǢ55�i���+A]� ��Ü|��Բj��
�PyZ} ��?W\������[L\��S���[���f`��}�&��#��qլgo�!���6vǏzME�a}��V|u�ø�Nk
�4�����H}���J���#�f9.N���i�X�\��Sx�s���]%��<ɍ�Z(���+��f�;x�-Y��x��X��2�U����<Q�O��y��"\����(h�X Ue���-����	x�'s�#T����v�j3S��_��{� ݗ#k�)6�_2B��Ԇ^<��n!T�N��v4�j�(���Yq3�����Tdɪ�J$t>R�aI�ˤ#�\Z�i��}]��i�1�&/JEuW"�>�����H^/����V�XJ·rě���E�h�:t]q?7���h��+:�AAu���;���=�5�?�!�
(��q�CNy�>t���˾=�~oS���)S[�@�ϑ�İ���1&V�6�Ë���jz{�g�rA@I^`��4-�Z�g�/ݚ@�`�"�aB��{�����ĭ�*5��!ȉ�	���k�x���Gw�{B�{x������ۿ�_����7�N�O���N/?���A-�j�ō屷�R�͗���̫d��X�=�/��˷��:�Ke.1��#-ť�5��e*<�-�W>Y}3ήQ7*��L?����;֌�s�O����'5飌>^�MPY�����W�c_EgD�s&��hl��I�i��kcO�����T�&kv��A+��� L�����x�0(2��o���p���<�
ՏwT*�T��9_7u�#:�=Q:��[IZ�Dm}(��
i�7���ءK��� pj��G#�l���N	y�įǙ�%$=0/�4���|����w�Y簤+i�F�Ύ�u�@�cپ	�$&��H7LL&oLa��
�`=6>����%	`��B�Dw�,�ѼN#����3��<~�8͔w�Tp�{ȂvU��&�@��l��r��_�U_"��	���-���Y_�f��[D4)��(�/�����u�D�x@���<DE_+lURA���:M$u7��nCL�����$RC�*�O�<Y^���yw���PK;��W(��#setuptools/_distutils/py38compat.pyu��
�@D��'u?����Ma���T*��n��4a����֑g�)K<dMi�;����	�����Lo�"g1@n���B�Hڅ~��ߪ�^�
.�,���gTu?���c����7���	PK;��W��{�#setuptools/_distutils/py39compat.py�U�o�6~�_q�,m�l'K�x��0�@��}H�
��NW��H*�[�ߑ��#Y�M�}G~��w�#��-��̭R��h����fK���s0AX+��ljڲ�O��u����v�svv�7Ҵ�y W�2.
�o>ܧw�_���0��94lYpc[˅��/V�.nJ����xsL��+��ф���~���M�,���Y��mѻg.Kb[�=��ށUP3�W��0��}V�Ͷb�X6�[f�U<�U�6f�\�,�U�l�Rr�w�L�l��^��f���n\m7������z�^������W���-{�qs���ڬ_��z��E��P"&��I@�j�$����!�X�z�E�
1��X�$	��P�fL���^4�^�Ea����b�୒HgPjUC�4�C[��%��2qKf�	47Z+��D��gׅ�MSJ��4

�rA&��0�ҭrOm��x�B�
^��QZ(���,O(�
����=�@H ��D�'X����ן:�S�<���̆�w1��6m�:��>/�}S.��gޤ^�t����?eډ��LBM"��O��0�f�A��Q�C���{4ı�Z@ɅxpUH:����|�#N�"=�Ӝ�L��ьS��s�~���(���*�:�3���<Vh+�^ЯF�	ᭆ����xȭ>���P���T����p�&���;eP�����w�FSA&��s)���dD��y:%��p$ݏ(ͳ_Hg<���3	-�;������#ŇY�Ѷ���w���"@'
T�L��rn��u���YF��FVp��Ph_
��k�#���ڸ�Frl,�����=g�/dž��-0V��R%��˰ɗ��Տ����bϩi���a&���(���PK;��W��|V��
setuptools/_distutils/spawn.py�W]o�6}ׯ�s0���iQsᇬ
�>�-��-Q6[��HʎQ���K��q�<�%���~�{��f�R9�yU��k�A'�k����NBʃ�,��ӅWF� ��F�K�K���*�9hk�+c��ĵ�P�*�5pj��;�� �Ap�5[+PA]��āB:�H�kghz�I�t�����Ԓ|�ݝ�رE+��7�U{����h�"��fI���X��G3<�х$� XHk�u���ɺA���f��t��������$I)+Y-�2����U{i7��ճJ{\�Nӣ��;�e��m�Kx�۳��Q�v�qR9�A� �0M#�d5�)��!�Z`H<#�,(_:���
���}XMI���J���b\{��3���c�,;Y����3bJ6�!Mʻa�>b@�����8(�Aa��JUUh�Nr�N�5�!F��Bz��瀽�$��+,��j���#���&uƈ�c�T]�FB�$7v��W�:('�%�h(ɛ�� 
�!�n�#-ws!Ӿ����u}$t\��TU������h�T�G��+�CY�;��h�"(2�/(L�4���"�(�M����3
EQR/;'��wmL���䔗�"�Y����FxO�2�J#��X���K���i	+ޘ�.���\(]���2y�&�ҒM36����/�}?��'dm&"���X�
�2�g�{���&-���1p\�i�	�~F���&)�ܸN*T�lt�����j�<HU��;sW��}����w��?��޽}�n��6����F�=�=�5���%��:��IzΦO3�aݟ;C���+�G��N��2
5i0�e'֋�P~�|P���
Ӂ!45�����w���I���G�����9
��y~�t��·��wnfY.���"tO��X`j��Մ�Y(:N<�#��jO�n?�!�6�?����n|�Yl��ڋ�G���%<�S�*>�E2lG����L��H��kpޒ2�<�N�8�
+h��)�#���U���36�}����g<n�W��}�H/��Z�I��⎏��L��Se^S�<'n���Zy��fн��6�0�x�f|��	�'\��4���M^~���z���<��3���|X�Ν�$��&�[`��Cs�=���A�s"����y>{}�&�Yv�G�������d���I�]x���/��U3��r.����iǐFm��Mk._�����%�1:�tQ�XR�N�QL_��ϣ	���:D`M��#ٓxT�*M����-v9�>����)��뛪�,_�F9�%��OO�H*Wؒ��Tw �|�P�����NεI|1J��w��L��à)�"��V|��{I���r>��`�W��ty��^�8�PK;��W��Q��I"setuptools/_distutils/sysconfig.py�<�s�6���(�jd&M�n�Y��f7M<qrM�p!�YS$K�v����> )����ܜ:�)xx���}�A�.o�T	�$Jkє�|�\�E�ER�l�ֲ��Bdź���	��Z	]�$[g���x+�L�r����Y��"U�*Rq��m���j@���
Y�>3í�[���;�R�VM��[��Vg�f�QṂb�3,�V-����nD�v��\�n39��Et�v�G�gi�!"2G6ܪ"SE�ĺ-|
�j�Y��Y2��~���Q�X펅/j@�U$���F-���hv����F�?�Sl��L�QYo������,�Ve
�k�T+��w�yd��J6�y����u�������90�m�\���a��j;U���I�-2
1�[�y��Z�EY����E|��O�Dq\�] $�X�j��Ɋx[�m�b\=�=�5ՊXW(�w��������F/�.�/-�"�6
�s2���ߞ�x�&-u�G�!�[�j�}\��>��Ƈ���*�m��<�8�D������Ih�70�Zq���b�f�6�;d틺��D�M!~̊����;+$��`��V!�L������]V|�T���An���Fj����%�xj�Z�9,��߼�����]�d�q N�Y]�3\:&�{��J�}��i�W��ʵb`0�]����į�C�
��`��O����D"�-j[5;DE֛��'W�Zk���ZU�+�A�8�ڂ�Z�DkU+P����[�� 
�Pr�� �T�E�i�P8S�˶NT�邩@�ߪ���n�s6�<�m/O��(6D�*���Y��8�
��<W��ȃ�{W�F�D(��F��"~?p��9]3F�؅fp�u]," k��*\��Ѥ�0��QU���e"�`���a���r�\�d�Ը�Е�˜נ�<��j)��%�!^�$� xn���C���X6�a��F�e,��.+��V�qڲh��A�s�N�+QZ"�ڔݒ���D]	��vI2̜����������^�$�_E��:��妥;���>��8a���Z��׬���%�iٱ�$�!K17�jn�/~�'� ��؄;X��lJ-y�t��+^^׮�-��yѩ������-��d_���E�Q��a9�y҂}g�=me>�:�m4Ŏl0��*5�N��a�
��Iޢ{�t@�[2�������V�e@�&�B��Re���ǨE3�3^�/�YS�:��0��س��[A�2F[}LTՈg�)�x���H�?
��Vv��:B�����@�'�R�"h��*��F�agX���,�F5�����ڈ����[Uk�H�k$����
�h52+�Rl�/��Tl3P+�8K���G
�˵qpO�`�rX��E��șq�����|�{@@v�4zL��4�"
��j3y����ӫ1� 1!:��
N�,�>8!}=$��M�Ã�}��!EI�д���7[@K��!AVk��
�p��l�>�|d��#ʛo)�HE�R^Ӳ���ŷ�BԵw�V���M(~�
U�X:��K#1���mU�����@#�Tae	”/*���$ lҥ�|�ю=#�����U��.s�z@�h��'ޥ(+ß��t�? |
����\�ʇ��u�"�fL�����*��v�� %�➀ɷ��P;���L�"�.�A�ũ��b���]|��9�4���
��N�=��W-��f�5�)��l��#��E��W����B�x3�*h{;dש��x)_S��h�*u����x���D����@7�?������4O:��s�'�/�$��E8`�Zղz8�k�y�G{�/|X�(P�І�,,<��/ϴn��D8�*���,:�aX�v�S]$�B_[[cFj􁝁���Ki�+��8];@ԁs]'�z.(m���F
�{�.sFh���h�
����˅���p�v�e��7���؉iI���
�x/�t�t`��$�b�K�Kd���w��`~��[eƣ-�L�q}6���`bNG�V�6G��|���f~���ed8�d#A�"�N��Kݰ$Z���c㒂˖�mM�w3���i��И�����F��	��+��i1k��7U�NН߿RS�#���Qې�Gql,_���BQ2x�Vߩz0o��$���UV<b���86Y
Z�AW���������}�$������7�_�ˁ�v���W��|B+zj�Xt�� �ֆ���kyȦ-0*� ��@x4
�k'����~xl87_:s�#��0��J3�J�fQ�)�qT����;N���u`�a���Su���Q��Ѫ��:�/̇��{1��l���쑏�Rf%�6���Q�Y��)�h%�֗|�42�:��C�"E*��,1��5X
%�|7��r��vGe"�9E�3�\�Z��Qz��w��(�s��p��05f�;�t��'�9�ы�A`Cz�><�g-����/M�'��M�=�/b��16e�i�
�ߺq��I?��C"C�/a�\�~�.6�=G;�
�j�ۃ��l���T��$:��h�0�|��a�ne�셣�
"���� a�wk~R�@�#�b�哫Q�s:��n`R����g�H<HF̳��QRdg*���O�3�,	Nf}Nju��CQ�KH�>= ���Ԅ2X���ْ�ّ�N?�H7�Yp{6�,��v��i�����=��5VDy�������4fp ,E3���ܷ�>��O�0�cH��I)+x���b� iuSn����5U��aq��W���cq�͓���~^�1\�%�ē��S������7>M	t_��[Z׳�ۍM98e+x��!ք`}
�������AV�+�B�L6a�)��F�!nv�W[U(X�b�����������:�us�d[5掝�Vx�@��2xs!>���V� �X6�
��C0�L&���-px�.x,a��+�m��|*�L���ur�)������'�F�A�K1�-ʬ��F���Bt�6"�n4Z�kJbP���B�g�9����\�Dx�����G�߂�|��ur
;=���&�
����Ta��A�pK��߃R��'sGr��f�ÎM��L�kV��x�懗�8{�������嫳���Y���Aq�?Ɔ#�Q'�5��.���h��r/nWh�0���2I����/(�K�U��’M��X-t�Q�{-�~�s-��{eiސ��4X�|�0z��ճ�^�ޞ^|������Wϧ�_|���_�/���={;~3�t�/Hb>ULd?��Kvl��Jj�.	��ϩͪ��I2!�0x9=ŭQ�>��4U.�6$�����⼸�-n8�N�h�Ee�u�.sU ��j {���NX�C��rF\y0zV��B�� O���UUC�`Dc�B�b�\��ٵ�����N�a�'9��#���1�y�� ��	�a
����l4���1+��I����gz�)G�@��F�I��C��	��[:@�S�Y(��t�U�"L�8٦V��Wҧ~��u�����=�������Vt`���o�1֥i�Q��s��)'#{�g�
����(9�^˵���x�}��Q0��;v9�’�0�e�I3s�p<I҈�<��]3���R?�Ơ{�����$�1��TI5�����sr�)Rױ/���FN$2��?�R{��ǐ{�.����6�!>���Thl�/1�`�
&#bܕ�G{��0�
�m��&��j�A)������
<���������إ+Z���t�C4( �N�D�ѵ�g�q��T��d0~T�Ώ).+s���q����'�@O�F���͒򻬸Z���z%z,�ɂ��K|@�dç.o�Fa���������n]B�f�,�2`Ē*�o`-��0�ꌹg�b{?$��]�����z^ʣ=;�Ǖ�������g��	�F_.`/�x�@����ß��F�+�|����tr�o{��>���JW�.z�οXY�L�� K��3��5L��Ƥ���������z����Tm��(�O��77�b��↾��M_(��7lN�j��F6J�DV��d�%�7��P��w��b}U�
����R�g��tYWQ
�o��U��n'E9P��S�+wӽ٢�vvADu�!B�n��P��6u�V!0��c�mDL
���\z�g��AZ���l;ʲ׷�V��ڴ0��\�0��
��z���&n������!]Y�)*�/�&��B�~n��?��xH��`b�IB��mI{/�
������߭����-J6������[u�l�
��ds�({3���x��ѳN���+�b%�$�Wwe}�aޚ���L�T�2�-ip����4�o���K����	��}i�cҠ��j �)wg�����a�tI14=*�ړ^pa�\m��Bg}��E7:��t����u�w�;���ca[�m�q�q:p-�zO::9�z`F�unh�sJ�-������|�TK߮���Ū�Q�b��2�����A��]�,�X{���LnX�i0�C\p���j�7�����I����L�t������j��'�d�����@ݧ��:!ꦟ�O+Ǟ��Lk�v�\s:��-,f��x�c76w>�=F�.�s��ܷ���Q������3x���!�8V.�L����3�ҝ�?-�@�vOU>P��%�c�ᇃ���	�?���ɏi���/7��M �U0{E����i]V��z��ex��8%�����&y�)V�9i��:+ar]�?���tH
��#:&�0h{�ޒ�?����͕�ڙew�W�yӕ›#�>4�����RH)�w7L�F�J���Gs��G�g�k��������e�����aϋ9�N�g�Ͳޡ���_)�&��ٍѶ����[R��o�=�<�����T'AS�0PљӘ�Y���:[Z�W���w̜�Z�\!��L0*�m�ek��s���t!�6�����Z��"�9�ڕmP+��g/	ctb�u���`��eh��\曲��;3b�U.�T���oS��-���iv%����-_FA�#C�G����apkE����Χ�H,�y	�
ϰ�^�e��xf.=6t���w��k�U�Bɍ�ssM�/�,�S��V[Y4Yb���}������C�l�R�&�tA/��b`a���c�F�n.`��w���[_��C�}�m`x��=�?q�H
�����Q?b�V�]
EwU����J�����mL����NzԽa�U@l��
�U�����Y\!�w��D]��]R��p>�Kɱ|�+�����I����s�$�N֋�����p�e����{���7Ah���T�r�H�v����ʐ���m��A6�\��d�ñFc��r������A���f�d���MRV;G�_��d��9��h��|�6�����]��+�+��=��Ğ�LU���I�A�;�� �G{�٦,�j7�)|@��~m3����2xF���ʺ_�#o��D䝬1���7>�01U`T���R�����4I?��.�6y7���PK;��W��olG5/"setuptools/_distutils/text_file.py�Z[���~�_1� ��T;E*�� A�v��m,F�H���Q8�e���w�\8�h��/9s�\�s�f�F}n�we�nnN��Tʊ�įx�#����.�P��/?�Ԣԍ�w2W�1�h�ao��l�ܜ��hYU��h���V��m��t*�^��xT��r�MM����7U��J]������s��V�,�]�f����x2u#�����0���͍���$���*�������㬃�í���	�FWq��!��(-��\YK��N��AZa�Q1�c�����X7��Ʃ$�C̱�2Dʊ��L��@9�"�d-sX`���Ys�k��&d��Z���	(�K�>��ՙ��j��U�i�C�N �J,�.�`j�Բ��o8G��	������8�*���$Ȭ�.�	g�=h37��MU�m��7�(�Wv���/2qT��%���b���e�-!6�0�ܳˆ	Պ��t��2�K$t{ܪz)�'خdN��}��U��f*�L[ql��<��=j�%W1z�V���$�w��~Z)�^p�lVrՔG:�<�6y��7Jo�J.�/�Jp��{M��s�5-����Ւ]���Ω�.ܾ׍ؚ�>�K�������� ��@*c3����d�{0mU�-��>����>>��^
W.<:��:c*ye��,ok���޲.
(�)�W�t�G�/x�mf��8�.(�CY^��ސᇾD��H��6�;�T��g�" @�
s֢eD�J�6�vH��!Ąe��l���)P�v���$�VAئ�5$�a�*k�]���>�ȻB�$<v�(mՇ�7mv�92�ŠÕ�1&-	t�
�HB�Kؑ@�������j%Z�`Y��
3?���T��s��NVv�f8�c�q�$r��V!���hi�x��!S��1 "�D�T`z},�D8>Y0���pB}�=��Bq����xj.�N�p��D�$_�z<�#��4�U�"�_F
e2�N��Q24�qD��Y���.�*�Cx�"�<��Y�$���;)eݻs���$��$�)εѫ��bnY���$X�W4���S(��!1�sp�NY����͏8A�f��K�
�O�m���kU�&�z&i�l��ًA�a�V�-�;i�����uNY�d�=��_��)#�lYG"�Z�� S�\%em[��<�/��@4�f�E�(�F+�&�8�%(�tQ���u��\S(g.�a���7���2e12FT� ���p9KQ񕹥@�%�c�+J�u�Le�/Ķ-Q2h�	�\�
���oO�hPJ���D}�[�p�z�4yf���o�*w��r�8��C#>����1&clA�Y%&�%l�(��2�A]5Nxއ�J�+Z0맩l#^,��	��-x�<y^'����
6�bb��y`�y�{�{K�ߣ!i���VU;Wk}���D�PP,�`�YW;8ϠZ2�.dc�KJ�HgʭEZn�ǽ��'���X֑���xP���Qp����,AU���
ϭ�u�I�3\�b����a=�*�C>�~Ld9l��N_�CL"��ru�{�z�ҏ%������.	����l֣��j�[D|�8�
-������C�Qq��2�
���P�#q"@�'��z�n
3�����o�6#�@@p�}˖a�;��â�A!%|�)=�T�q�� �#:JD�
i)o\QҘw�:?��s�Y�aѲHb��=��L<�?��N{%3�E}�N�cE���bL/��/󶮡FF5,zNj�ֶ��L������$�GF��펱��\ҷ�>��"��HI��
ڳJȠ�ji�#(�C�si%e6N�'sB
k|��S>��1t�>��QT�,�|��_Vxx��<��*hE���`��ꚻNƇ���w�v�hC˓w
z�h���Q��c鋠W��{��;�N=�_�E��C��n�S㮩�@:���5�g%�9�#ח��;�d���i��E�������/r��Ƶt��+}�*�>s��%��):�$�;�l�Y�󣠩�<��P\�M��&��l)f���)"�������6�R��i�\?-VO�� �MLg�(M��o�&��Lh��O[SI5w�;|�
X��R��k�F�<s����,�SxL��Cx\�s�c� �j8��~!Ѓ�������9�0�ܸhbg��(�N�	��jG��-i�ћC�zO�_�\�i��W� ��VԼF�Us�M����"*���͸��E�%c��.CY��rw{���Oj���=
���b��h�s��e>�j���PĽ׳�Wbr`IyI���F|���/Ro���ON��Gn{F�i�����b;ӊpk��ɍZ�2$�D���SiZ[����f.Wv�A?�.:�K{�P�ƍ���M�D5d�O�u��?���Ⱥ��9�7���2\3F�~*xzőxK�l��n���L��UG�v�Q��]�v�h��_\���(#閗~@��i�
Ch2k�B<�
��A/L����o�H4P
6
�Y�}p!Vh��m<�0����<�'�3���+Ǽ?�_$XBR��Ρ�,�CI��6�c�M�/��g@E^�Maxls��[��,�߮gM����ŇޚBU�/��l_М�hO�6Ȳ�)���ܺ
�'��r���Y �o��=}��a���$-_����`�O�C{Ɣn�_�y`u%8��]�(��	MU���[w&*t��r��;�q�J8>A�_��rU���~懚�,*���9�b�VT�y�_��ӹ��L�f��wDrY����R�~Fq�t�0@Ш�_P@c�KDZ���s~ ~
w����wOnڶU���~�AN��ۘ��{>�h3!+
����Q���4���"��{%V/|b�3�Wp��6��fr|*��Ԇ�I�/�H
F!��::˔MR�q����La�}'C��SU'�s�NZxGV����<�l#��X�tC�������ޭ�ek�v�m�h������.�I�c�X�A�:���tqG��k���@{�Ba�Q�M���yr���wkN�_��do�X�����˛�����X?gw��_E<�c��
��R�N��o^�=��k*�67-����u���<�&�zD��7�(�@p�ʎ���f�R;��L/�MX���B�]�ݲ�@a�=_����,�K�u_p���S�U>\;Y���*#޿���6���������Cf��t�-\5"���1��g�h��O�.��d�ٕ�]ٔ�͍+g�V���Hѧ
��0U@Q��v{�ۗ��ܷ�'$
�#�&S��+��T�6�d7�S���/Q��"��h.�g^�<P�;�E)�}b��fI)<�D���T�qD�{�*�l�v��W\��z��31}6gy�k�
2}�Aw~$8"/i:�Z(���M9���f4�Yrۻx���w�`ӏ���.�u�iF5��x�0��P����X��\����m���:kC�$���s�q�똲
e��O�(o�0L�$g�q>���g�Ik
qiT�̙
��E��-�f�QހH��\qq�s�����F-��z��X�\�lR��҈��D&Q���ԁ�@7�m8 ��Xdq�<C�!�f��>�U��]��T�S]Nd�0��gh컢�z�u�X����k��gWI��hD�7�y�f�q?�O�o6�@��G>߬���"�G��jK���><�r$s_��H�Ľ�4$��L!�ډ��X�!��N�j�t:H7�G�>cL{s�tZ��#��1RL��D�j��oG�m��K���d��?ko�!���o������] �a®��?!�i"}���q�YH��m�"�KN�m���vt��P}�PK;��W>P2��<&setuptools/_distutils/unixccompiler.py�;�s�6���)Ӓ�)ʹm�s�q�R'M3禝8�ˌ�Q!�S� miw������tw�4��"�����y&u��2�IS�C��})sQ�f���,4�w�}���;�Ҝk3�t��g�6��w�f;^d��3����R�<������`���,rYv���g3ƾb{�VJ�Ll`4c��ޱ�˂����q�Ok���8�&�"͛L0-x��X&+�֪�B3]�Tnd�	&��ON�s�������;����Ȃ4
X�*��^漊�8�����𔩲��@�0�C�$e�b����L׼�iK��
��n�Jk�ΏP�@��C��N!JS�0�l>��fr_��fJ�'}l+Ѿ�����ZT�R���6�ڳ�u��*6rk߯�*3��
q�i[Eu����l+�UY��R��ze���{ؕ{a1��R�vh^:sx�x�C1���K�n��[zt�j��c�
�*�Bz�,찣~�����͞��?��;Yl5+Lh�Ju��栈�����-,3�n��{^�69��?�{�>5�f�Sw�
`���X�ThB��O��4
�"�wV�d�0��^j�3��p�^m�����vW[,;����uS�A�?p������x�^��Y$WM��@z�4��e�0>�R	�{� ��2�X0�A�2�`�nu��a$^�8H#��.��V{`?�
X�jj-3{��p�Z�Z:A.�t@;
&�r`�&�	�ˣ���a���)h��c��e��5�՝�(q�����b�qq5��EM�w�q�H2��;�+�V�G�_�uC�P���>�4eR��h�[ǭZ���Р뀕S���օp��#G� ��Ȩ82��G`5�Z 6�z��R�{�yf�#�p+���;Tz��<3j��%l\s�l6�AcpSO�#���d6�A�a+]�^��.L�Yd\2�A��HL�竘Ѵ����m9���� �A�*�+"��
X'~��w>	�b��4�1��뛘M�������kY,�4���O�g�z�&'�
�4ǁRށ�:g��
��t>o�����kק7;?gs@87�a��o�w蚂��i�Mҁ�8�
��2����=�鋑�Ä_���ʜ�`9{�
�D�r�$�l��!@�V�����?�,2��H���5�$��R˖�	���<cС�	n�J^��7�w�q,��#6�lxƾ[LU[Ѵi�u}��g��,A�D.��[t���suo���J��ݫJV��Ѻ�y��J��˗W?�x��%-gw�MRF��eVL�F��
�0�M�F�#%{^�;��;�h��FDZm���=�D��1x��!���@*�O�#��tǸL	�J����8h݀�1�	��3odO���-��x��2؄4=��z��
�s�٘�S}&�4�)lb�7ھ��vs�]��,!]��3�?�L�n�,�Ý}]���4]d���D=��xM�׫�)��(�
�>dXXF��Јa%0!L^�غ��{��B�����
Sm���׼HQm�P����(-^xu���xOك��UWu�Q�8:��֞4%�kJ���qp"����
74�K
Q���&c��y#j�ה��y�����4Ӣ
1_l4�L��Pd�UH�Rt"�q������5�hݑ�c2~�*kQh�k��F�
k���ۘ���{� ��F[����y��o&� <:�S�V�:��m�9560��qyg	�!I��[�{�ߙ�X������g�Av2�xu//Y�w��TX�|��8m��{9EP�F���S
u'�N�m-{��
����Ȑk���\C�"��k�69w�?�i��fΨ���6�Ƞ0�-�FG�ER	�UA�];j��2������@5��:O���:z`���t��:%N&���o�!�1˒����-�����2~Ҝ��y�܎�v�k� ;��x�ޛ)�Teb��Լz��(1�����n����}��Г�=8�Ѥ��q;����fn��Z��F�|�ٔVM�z~Q��+��1v����n�AV0�*��9��>0�������$�aG~�	����3���-eq���#q[��Y��[�+hJ<g�����ܧ�w���!���<�HSB"� �X`�M��|<=�Ob�>;Egכ8����Qb�SG�O���iF��Y;�<�t�9�&,�邃�x���c�6�qsz
�O�z���q6�Bbqg�o�\t1Nt�s��X�xP��5�[�ɥ't�SŏI�fO�"i��\��:�?�u�����8�C�����"�(SQN����^o�s	���œ��=�RCr8��c1*Ԋ)�T.v��9/;a��WB�x3Z�`j��c\�;�p]��ןnA�O�c
�Rc�pQh�ʑ��* LA�h�������4����y������='lƍ���i����=Y,�o߇��>��#��ǾT��q��?dF=�&��2VT�$ꇥ�h����?�g��,&����Fb�`R�e�,S������}��	�����ޒc���=�*���9�“�o�P����4m�!�Z乄N�Dr���t��\�8�Q��H��U\�]`أ�Йc7��n����Ț��v�#2��܉���c�(s<�a�~R����xH�v�"�F�g��c<���2��b�ھ��mBv�Qx(ľ�,l�E�x��&й2��A�2��x�2��@�oځ�Zv�q*{����b��q�3��>��*:W�������|U�}9:�Q�{Q��T+n��XOr1��)`�T���'�������9��MR�r7��P�x�z,�QM�0nljt���Y&�Tѹ*�mU���{�{B��*�9�u���E�OJ=��-Ү�CY�*�t����|����rcC�I�3�Tv-[A�m0}���.B��&��#����~2F<cW"ǻm�N��NH ��@����=ĭ	�����i�0��t%b�,�Q�c�3Z�C8��HFn*�w�;}<d�N�^}|u���/_��ov~�B�͵�����?I���f6B	��C5�''s�b�'���0HEq;��5��Լ�?\:8���\�nt��z�eG�?����4�n<3?�����֘���,�~� k�l��.6&��i�}��vb^�e��t�{R��$�%X���_�a=Ü�'�SȜy!T��C��S?Qw���q�8Fڈm�"�g<�r'�NIyL������j�8:F؛���r��>����z�MS���tu�)�q�	Z�yġp~q���r▚�������: cN=h�|�n�{�Q>�}<���#Oo��Ō�P(��Xyh�O�����eϾ����<�wŮ�˳��AѲI!�%ī�|)�vZ�J����<�3Qs��evn�~��TS��7_{�%���)>{Зd=�ѝ�f#�Q�k����p=3��P�>ȣ��I6�_<�̳�3��E���:-�]�k
Jq�Bg���5@zh ��mw������o?�#�I�l��J��^�,I���`?k,]s���KP$y����U�D������CCέZ�>#�I�+rd�e9��a�V�y���\!n�t�MaP��B�V-�\���P��נT�S�l!æ�=6��4�
/Q{hD[��;J^cN�0}���*7e��Ҍ��>s��:ج����K9��
������Kt#ԉyX���,L��G�����l*O&�����A)��
Gs"����Oc���D�q���xQ����S��Q$���tS���bj�Q.��Uc���z��eD>�ɷF&�����S��>��O@��A�+�a�fZ�Dϻj�F�Ȥ�s�'���c7�}v�am�.f��j��s�����Y� �Yp/�X��;
R���~s�2'X�4X
���Z�����˹�;
=��3r����uhSC@@�����/{��-�9<T[<�	rTc�F�_�9^�~��|���"��w�<�E�^��SYH>7����/sn2�./q+���]�
~��`����U�8�q��,������&�`!AL�2�t�s���́$��	�@�b��!A�)�[E�y��V��x̾�ً��������Z��9vî�g6�ao��Hu)��W\:���K���ϯ�u���/m��!�U~l�Rh(bR���m�i' �������C-0Kx����2
�u�c ����! @��2�N�m���ay�v�IH@_��H�Zՠ<�ŴXn�(uvS;���0�>lw�QHG���
!7-ݶ��˳�[z��Ľ��	4�DL�5���Z�q��e��p�R�+ST�%�^�.�'A�-�|)�D�JH=q9�r�WB��:tuti���&ϟ':�Bc�1l	��L֨��;?X-�3�J�lj���-��._��
"�̱��D��	�Ζ�_��^�DAlq{)�+7N8�gI�����2Ao�*->zX��!&xhUkT�0X^�x���:y����� "�xB99����0�����m���!��\��#|Q�t���&Bo籊�tϿ��+�̙o{!�{|_�W$�-L�r�1PWm"g�i����Z`Nn�
6�ts���zm�
���W�����3�u�`{	&��փl|�0jn#��mԫ|���䴤ذu���:���h��C���>�FB�Dx#A��J�}��4f�8@R��Pܲg�Gt�Y��,��V�5��{�)���]��=��ǨM��i%��N�0��WB�����	��^�
zZd�p�O_�iLoA����
�|@��)��K��_8��{<�x�Ǯ{�퀼�]�9�������Ԁ��u�9/b��m�t�`�HӞۖ��M��MoOL���yf�<&�?�[h��@�5iM8t7IOR�QM�� ���-�QҸ����e�@�R&/N�]�ZX�@v>`�Ơ2��fń$��PK;��WƜ�`U�Fsetuptools/_distutils/util.py�\���6��}�
��.R�D�عT2��ݬ�<�8e{��gU	i�C
������ A��8QU<|
��_7�A��u�6yQ�����y��HJm�Zѳ�9�u[�Mn�Z-*)�M^nTs�4*3�.�F��F�ecNL��Y�%��J�'*�&k]�'A���۝�Ї��J&`���]U�]�M�Q��v��L��e}�/SS��5/���>9YWf�b]U������EҬM�}J�����lwy�����Ē�u�3G��{�^ֻd_�|�zf�����$�k�������rg��.N~�-��\7mU��2B؟g�lh
5s<m�
����o�I89��(�<ȴy}�5_�;��Z�Vm^dhSi�"�I�1��
ӫ�U�zw3�S�S��˼ɓ�8(�fgj��Q�8�;�Z��k��(��үu��ys�L�A�l�׺�YA�7x�i�ڃ\��+�6����+<�t�7IC�3`j%�5g�e5j�@��_�RH?i�D,����>�c/�rm����\}feg[�:.��V��*,��g߇QRmg!-�#�͆��W�*���\�磇�$�O?��4?�$��E~��Ej�& �Q7I�4M�z�–Z���MMO犴�y:�qkG�C)�
�L!���+4�.]�	F?^������3��3B����}��En���g��v�)&���ڳ���ߥ,/�|��ӗ˗ϖ?~��K���`���>
/X�P����ya���p3z�w�Y���{��o�j�
�I��u^A�� 
z�'K,`���������e�p}�O�͔�������2����4K*,��uI2Zo��1S�YB�����'R(�f�j�vmQ�1�"�A�/?{����_|���O_>��>}�����?`e��Њ�Be�%�y�WX7��ie���'F���̊"v�aS�URL,��zZh�	��ɒVh{z���ف8���^(�VAΆ�[�ߩ��1�Um�P���V(�]w�gI@�iBì��:V��m�P�`"��
���ǎ#0�5&�[.���*:���0��%h=Ԥ��
��O��)z���aRx���<�Q{��JK�l�{IF ��bȤ-��>��sz�R��6�V3��h�i�sՖ���2 Y��ZH�u'[��F�ɪ�*|���k֦�RM1j�:)Z���(Rm����X�
�?���b{��܄�(j;�B?U?%E�����,aC��S�>؀�M�r��=rO˺��Cbt�w�9ǜ�,0tg�3��|
��#*�:?��p�iR^�<�
!p]Ŋ��GI�j`���6�	t���KMExs��<B,P��<A~���7_>�Ī0<�jk�
m�ev@h�S ps��Bۇ\�ڛ�jW��^�b�X����:3xLh����J*�Έ���\=���NVOf@Y�#�=,��Z8��¿��c5�>V���l�c	pܫƿ|��쎝�_Lu۶�U0~����܂�߆�mxW%9�L�d�,�:�!���
I\�H4�o|lJ<D2�,j�K��,6QV�w&D�S��h�ⳢVy���";�zE�[�[�y�(��ٵ�Q*/��7�C���g��M(ё�!�>/
�[R[2�V��F���7z+-��%%�D$��x��������|(;�Rr�.�dJ.!<(�&C�������iB@��$kj,d���w
�<�J�}r@r��01��,�7��ז���Wڱ
�l�)̟	��ʕ�5�1rIڴ�"Z΁��ͧ�&���M��O�_XψI�)4�e�Ҽ�Ԫ���:𮈅���!�ş�I}�'�,F�`������Ȼ��ݳ�m��ή��a���j��{uH��q��dU��mt��t��O�o�5�8@j�����cg3l�w]h"Ir�~t��+�E,e+�>b��N�R�?&/��ܑ2�Ӂ��.�K&7zY{�{���1f��"��P��x-m4E��=��m�k�#(r�7*L��L7�@���>�;��hPt�&�d�ްn<�EFQDغAs{3�1���Lod:O��x�s^ff�u#�}��g/���t�b

$8����^�}�8'�?Rb�Т����ŵ�T]ܕ�GY�r��3A�L�ՙ�Edz���,�իQ���Nl�&2���J�X���e�[ 8ϕi�:�
��žR��wո�ZIbab:�]ZT� >:
{�
ZG$#���Û��mZ��PKnq�>�'�{�Sp�B�Վ̎�u���K\C|s*Ӣ�t�%�y��S��A�Z�ȹ�~�*N~\�YrK��	�TMvn�"^�$U�w���� /�j�4V��[�ӈ�H�ن��KSz�j�è)��n�
�`}�+�zMj��(����<���t5�]�W���M��o��-���>��ȈO�jg�g�|��K9�H}���6�e�G�vI]�'M��bƵ��]!�q�I�w���7����Q}�nWuC�:�:2`�Q]�G]��9u�~yӊ!f
cR�UP�'�<�p�d"���R�*Av���-�f��䯻q�7���A�Ka?��b@.�'0%�3x�7a�8�[G�d�NCg�vC�/8od�9e�R��hLPU����2�>�Cx>�#P���AAfܭ�";�\��&?g�q��d�PbY�w����*Q$e�:��l� ef��O'�	���N�l����I2�|'�Xn�]$c�b��3KJ20��n��k�\�*ku�U6G#���`))�F�ha5v�&q?_�c��K��=7�hi7��s����۷o�]��L���g�޽]W@p h�����_��d�ۗ��]^������g�܎�u���t�<�i�+�=A��w��IL�L>8����pdk�O���Y���J�4YWF�L��d�K�'��"s§��e��.T`9z��r�z��G���Pb5ٔ�NiKR�8x���THc�l�����o6h�rA�$�8olxZ�C�jYYK�ncL��{��F�mH�*��Ǯ��z���f�@�kk�Kx��%��^V�������ɼ�����M<��7��ڴOn�Q�{Ĥd?Z���34��߯
_�ju}��+b��F�;X�w0[�BF���7��z�����{z���A8U,�<K�Ն��/��)V�ك��>)7�٭V�Iu�T��L��I4����D'X�U=2��E��m�#�‡C%��`l9P^r'�E�4�I��g.A��cY�c1Sy��Br�̴�ܔA�O��.k�ה'" 7���t?���&�r{���4F��ܶ�]���8q��k��*U���6dm���C��l�Hk9vȍ~�+�I�N��>�s�*��O���`�[:kQ�E��bgN��7��6s�Xz� �%ۼ��&hN�5k�i��y��Kz	���\�(��yh�T[�YU�榡�۴��8�����~����7���$�&_�+�̀�9;��^ْ���9��DG/Å�]�-G
2L~q	��+�]b�%;*BD���\+��J'�'>���Zq}s���-����$�5y�Q���� h�b`��[������4����~�3#�~��Y�)��'�� Uۍŕ&��+�b�0�ۮtJ9�.��q�H��7/��M������K
�r�`MA\Ьꢭvb{��ԇ٩�j�ŗ^Ar��1������
�}�P�U�O���H[��t_v�oX[T�J�1��^Ψ2)������=6��X~�����M,�[b���?T��Y%2�������D)p!J��P睮L��uh�p`���!��,��֌�|��WN��"�����hYm �m��$��ɚ���갬���.g�Ʉ{��r�d��i#g
L�p�D
��)d�$��#�X(2���͋6��Dm$��Ƥ�68�E�0���dѧС�n��E����@��ɭ&ݫ��dR��|Ղ�m��ʼn�:��.���	Ɍ$DuI��S}�'�ȃ�?�M+����L1-B+�]��'��lUb�����pYg���)u4��cJ؂�7G^ڝ<2ٲ޾{�rF�����%�˥�� p����ᅸ��L���0f���!6�r�)C����C��pf��lb:�uۊ��l�����21~��1+c
J٧���W�cD�$]]�j��p���'��u����;wA露���k�]ӟ��A�k�P$��_X:ұSӐ����������}֕Kj�^��A�K6�	`�C��	�ZI
w�б�^&D��,�8S?�[�d~g9X�1�3K��N�7DFRz�*	۩�ꀸ�%R���\�ǟ�ɤw�������g��F^͕4������l�S�e�W�#�����Ӷy��txya��LMQ��i�=�c��\I/��!�)��/�xH����]5:�u�~p> +^�4���\�>�#�\˕�[��񺴍��i�[�Eh(��P�dQޑ�5g��M'�3*����}q�%	�po�:#NH���e�,pn�!:�QV���]��c���7FG��9��i����p�I�L>��^��d���SX����T�d�w�!�Fz�-Ƈ�:q��<�H�����
��v��٩���<$���,�2�G�-��I�'	��+���z"���b��2:����vd�TEɚ�?Bnh���!Ԗy�del�1���<��D�u{��qk��'�.�wBw�jwA|�
�޴��T����P��X4�6�e�Y���p�;Z��-��bq�k�2��9�e� I`�QOM�L�p�:�At|f��c!l]�a�|�oh������s΀��l�6�W�Y2��L�Al��1��z���L7I^�3[��� 1bW[�8M�-:]j9�ݪ��U�8"��6F9ɣ������Z���κ���@�+f�ك�t:�͒ث���	�=��l���J����`�+�p�\ڋ�w�o)W��>��A9ey�i	�˕j=a��zI	�Ղ�f@J?k���Jʢ���%�D�2	SKo���iݧ���F�����)	5ӫv#IQ]( 6��q��m]p�<Z<�d�Vxw@a�KpD�
A�2vA�b�oNG3Sp|��lq�g�B��v��F56{Z����_vk,���+URNg#h��=o���3�;y�o�968ޱ�Y֝�/,��U�t-%ZK�ׯ��f�{�/��,���/��ͩ
���
��v��Tm�w�K���s���Hp�.y���2�	<���\>�19(�m��-y��(�,���N��!�H���W瓽;o���CCK>.���w�S��Ñ�Z�)�`H�O�&3.����I����O۬3��F��`|H��'�\����i�>J1+��\�!2�:~s�A:9��D`㥺:q���M�~��_~hA�p���!���M�M5A�Nֺ9����-[<_��S��Y��i$��vXvH,�!�ĺ"�5�/�
�h�/��4L�N1�S�S��9��p/TR�����:⊩��e���z�����
Q��ͺ%����̀/A�-�'&�7�=쉩��D�%&ڳP�mK�}r8
H�ر����1E�uEgu�A~��H�iO�����zpi�\��#�L�����!�^Zl7A��V�v��wmL�ew�䰻!%�� ��]�c�XN0Ur��.P)e�eճ��X�h1�s�w2�=8�e�0������:����F.[�V�T��ٜ�|6i���3��q{��]���kH��+tE`R�:�k�u��hdQ�uu��T��/a<|��p��8�@<��;��z�ؿ~P�°q�y�j��~A�E(�SG}D؁�'���{�yu�a����5P g;���u����%�𲆯�����AQ\���+����n�C�L]/��<h�ʧ�J}�s��Y4Q����-�F���'6v�w�������5�|a�p�F0�@��(v�ov|�*/v�_L� �q�F�<pg=��t`,/[=�2����yi�_$MI��z̅��B�C���l�t�V�T���o������QH��������_�v��j���)c����屇�x9��0�R���x���|��ATh�!��v=b/mS�<����`I�k�z��
<ي~]yؒ�y�?���<�WM{u���_�4'?ul�W�2�����vT��x��8�X�Kj�[�&?=`��Mˉ+
\n��a�P��R�m����ƉP0W��4S��8+����ڱf�vZ�ݼ9u��cO�If}�2d��Z��=|���эN2]}d���J���#�N �Aw���IϿz�u%d���M��G%_�R�%�V.?C�t�~�#DO(q�W�=��B)���L�W����}Ƨw��Lgv�PK;��W��Yn<�2 setuptools/_distutils/version.py�Zm�������:E�"�$WRN+��Dw�T.���d�Ih�̓�ݥ���<�f0Cr%_>h]����F���n\^\�D���uj��W��E���K|���Te*��Ț��xn�țl�*��D\��?�-*Q��~s����E�`��D�7
��Z���D��g��gx��F�TŽN�q*����*+e���,�>FL�\�	�����^�������i$�w{U)!��TH�Q?�4�ꖾ�~�*�߂�����y"�TF�?Do��a��cJwR�h�c�$8
��V��B��㸔�Qc�)H/���� �a��@�&٘"S�L.S��$����[��h�1�^�:p;��Jj�K/�F��*(V=ƪ$�-�v�0�o⚔o9�E�#e��^��x��xos�)�T�dF��$��6����k�X���v!n��KP�'��4*^����mn�|.��Y�%��T�T�*Y��&2P�/2���1I�������vW�(�ghYRqVbV�=(�Qg��0�Z��?�+�4Y>KHf^I�MkGց��FY�b��q<Ef�������!w*8���_��U�=��Y�X�w��V�u�7�ѽE�1��ܩ�"Q�F 
��ˋ�|����lߓ�5����KD���uBvS%7�U��
�I\?�Y<�O��n�Nj��Ĵ���H��˩]Qn~�1�����a��ͨ
��G�(&���$u���A�4�]@rV�������b#MO�n�.b�I����L(t��z�s]��SBd�Ʊ�/��3�R,C���4�R�FuvB�HX�Yn^�5���D*2V���)��$���?��x6'F�ۙ���g8��S:�r�SM��&���P�o�O1�O��!����#/rA%{ڧ���6�KսJoV��±�b��T�T���b2��?��Qe���zͻY��C�����#�~j%�1)X#7V������#���碾
N�����k������\|9`B}&��}Q|5`Ⓢ�+�X���8�X��4ĩ�a��0m~Ƅ�"ǡ�3�x�7��Iy>�	=8_���Lh
Ll��%&.pp�b!�*<�QD�<D�g~):�1�&�`ZX6��F�(~���n�BSR�}^B���/�A�p2!P��EYi���4�=F�G�^r�p���a���k��
�u�3��'X����Ed81�S�|z�J˰0=W�l�;hy>%��2K�0bϩxی9�9J��<��<�_hø��"�D�^g�!-�|J��Be���@�����2�����������kR5i��Iж~�}CI�kLm,0���]�V"��K�N`���6.��y+y隸G� �>�DB�2X��9���.IQύ"���J̊B�g3]�|i�W*U�n#x��"�7����"E��l�{�jr��G�͘��8Vפ���9��M�=3
oR$r�H2��@�H��1Ǚ�L�uC��I���0��!3F*֑��E|�´�v ��Wgw6M��_lj�s+�t�iƔ&pBYX��M��mr���B�g=��3�X�s�q��4�-������
߂�W��m-��蹼�o���s"T��|��|�(`��vDW�o�U�
�����LC� JZCW�X��	� p�f��LYa�l`�ۡ����Y���x�Q��l[��C���&?&Ϧ��H؇��������w���(|��/���o߈������iHئ�$=���t�E����Ý@�u~�Fh&��J�_��H�����$��j&2�ӯ����:�
�נ6��I�C~VN�3����3�b&^t���:�_y�nD���A9AH���'xy7��R����@H<��l�d��S�`��'���Ż�"��l>�j� �!Lf3LͨBl����;}�N��9���B�,�u֟��^=-Џ�4�Kq��s4�ӳ����r����]����L ;Jz	��p���ݫ�2dUPl�����1b.:�?�w3@5��F�M1ћ7=���Ӡc�{?�Ս���O�=��g����ŗ��^j�[U�
�����S\ۚ/{_�m2��v})���G�����x_^��K�T&n��s�0�8f8ou�[LrF�e�ڽ��1���d�/<f�4=7�<���b��C�6{m���~ճ��a"�L�z:�N��K���.q��G[~���霘ts�9's��/?��/���(�A��2%唬#���E�J��c�F�>*��J�0Zi��XN��H�\eI	GVT��]�iG��S$4j�rQ�S��Dm�b"�J�<=��ƥcs�Κ{bi�j[��b^�ݞ�c	�<p�sN˙Y1x5=� ��ڧP�'�v�g6(�kz@�Q�Ů�垪)��j�-�]�V��+d�֗a,�U�8�}QRB�et��(��Ʃ�H#����Z4%����
2��Վ{I��3�B�ܔd��#��)I�z��񲵈��]�s�����&u�Ec�ř�4T�£���r�BF�bj�T&�y,� f>�y��Qn�}Z׷�A�SB��T�����ZR1���ֶ�T6�����6v-�S ������i[Ap�Rhc�G�p�$��Қz��Ԝ�zCe����/�kС��Ϯʂ�pd�N�l�s��M��nk�3˴�K$@㍪��}�0�����b�-0���'��/�����a�y�M$Q,I7qA��g$L��NY�}���a-�޸Zi�͠9g���-��{�E�㵖`�t�'�E�^��l��\Q&� G�K��b��Zx�kW�i��ޓm��`��B�����@2��Z�)U�QOfd�ք�
�(1���9w���Y�2�"��nU� Ce����J>�2�,�Ufvh|D��v�-�W�F8��L��e-FV}��b��?�S�>�FV/���m�
LJ�tT�ܐ�󏑓��
j�v��5D���U��cI��:�%�"Z:�_D+��G6b5��;���C v�	
|,Ϭ�s�����CAnd4i�ic/��t���3�W����\���Rx|����-d�.Nǝ��T�F���$���2#ۂip'C�u���_�wb��䫤lREu�,�I��㉴x�[;����Oֹ6E�ȝ=mb
�ʉ��Rm2e	"p�S8Ǜ�������׍+>�
w���$�6��T�����8�>Z�l{�TE��T���z���j�ω*s�3]�'�_؈��)C��mq˩������>��e�딓�B��~�O[21br�
��es�ұ噕L��	��K+.:~���,	��;P�a����~wz��jލ� ��I%�eĤ����a\��5��f|��o<�Uk�9�b�&+�C���|���V���Io��k�A?w�X5pu-�9�[�JS/3�Ku��(Tr]W%�D`:��fL�$�� ~�4�v�����x+�4 D+('��:�vB\Y��fD<wOez�¨&=ra�-˃ඈw0�3�Q�!
�v/G6�.��ճg#�؂J���8&#X���0_��Y:�6n	8U�m�+nr%6*F���¯��	�	fG�4��YwW�V'[w�a��ԩ�t{q1�݁dBrr;[�Xݲ��5@Eb�s��Ia��YK$hX䴚��S,�3���<���dwS�W?fЅ�EأDv�%�9�DzTz']��Z|jrY���P�d��G���Y?oH8��	a�}G;�	]�ml8��/����G�%�"�q��cw�r��Qp���r�����K��>�Z�է�BG���n�3w*ȁ]5�%��	{����w;�&21��%��s���4ٍ#7j!�``Pߟ�"�h�8bB$j��ZFT'���}��$BP���&h'��]E˅l�-Z��O��ws^�z-~-�﫨L!)�׵�����]�l{�x��zj����^S�l__`w���fI+[#���zf��4��il�<�ĝ\$������˖�>3�NT>>
�k�N��@a�c-4`��4)TϸPL�8�	M�k����h�h:h��t�n���Do��w��c4��>�viO�;�b�;8��eH��ݶu���ж*2�rr4�c� eS��pI�+���EX���^�z8�[�?��O��݈����G���2�zB�$ ��}�j�8�k�Mg�{����u&�b��B]�+�����fHN{�u�xL�nd_�Ѷ�E>�s�P���wN�:�fh{��F�/m�>P�P��6P8�_��<�:�]����q�z8�����T�ý_�PK;��Wa��U)setuptools/_distutils/versionpredicate.py�X�n7}�WL6	��Ȅe'/��  -�&�CcW�v)y��eI�v�{g��e�1�Ȁw���̙��e����*Y�X�,0Jz�d�U�l��T�J�X��8@�A�4���@����A�kpӚ��R�4e=j5��,M>��8Y�e^��
� |�F]��<�>���>
_O.D�E�8��M{�����)�N��
�x4K��I�EH"."|}D8?Kq��N�
x��RZi��,5oQ��S]��O�fӻ��ݓ��t��3�|�V"Eij��AE�Z��
	�h2�!��/
$�s��q����ߕ�ԅ���N�G|��s���O���5N���WV���(���jƓe��}��F�R�eK��AC>�uI[}[y3��uϡ�Jʎ�&T���b]��J���:5W��Bo*����kQ^�D�#v�Q�T�#Y�,��.9�;�Fv��>sY��,T��]���k�z��5O�f��5���F���nd<�l���ʤ����d�n���=�����l6�-�+0V���F�e�l,NFp~�?q&�#x2�z�J��g�0��>])X2W��^n�@Tu��4Ҁ��j�e��ƨh 6J��u�U�d��HP?��vaL�%��Ů�nU��Z�Xb����^mrY�J&r�K#D
��,l�+Sa��pk��C,,��Z`z�h�O�JU2_ކ�re��bY�R�F# ��DU�i�l�K�Ki-6��1K�8�$81-Xw�
�1���[nlJ���&�����p,�Ck�z���q�Nܰw2Ӈǽ�_+��
��`~�
��*S7)y��q�*��ԍ�%\_���%ʃdoB`2��S�1���ip/b���q�����x/nw�A�^Z�@HJ.�qY�^�SLa��>���+��'R[�7��ɏq�Ƣ:ՙ�^���M	|4uB�~�U�ڌP/�(A���6��VL�X�L[�����4A�-�&��.��{Ñ�[JÌƖ@�8�Qֆ���
5�@e�kTR��Zfčv1���#p[���R�?,\*���r�x@LfC^����p|*N�?�_k�_lв~!4��Ej��P�l5j|�*L�w���!�*�C���.UY�#1O��t���$��D�`Y�=t��*HR����3�S��;����2���X�Ig�g�_��;��]�x�T�SB�D�V�>�9_�Tk(</��Cv����>��W�g����.�G��æ@���w�*�c�7��ɥ?��8đ_���$�">��+��)��?FAt�ϜV֣Lr��k�#=�p��䲟���K�^��������b����D��bB=\B�F��;�ǒB���@�]�j�-��(x��]A�a��5��1 s�R�{1�,�rC����u|�5��D�݅* �l��t�N˄�[��W�V
b�Xnb:����[��R>aIW�hk���E�aoL��;��k/�b�s�=!k���c����`0�	��73�������pK�ߝ�ݹ�p��VYQ-Ev�CH�X�J�9�7"+���Щ�Хr�6�c���8�C�rG�kJ�ԴdҢw�۵k��V_�n{o�F�Dtx�<�H|���b��^�+�uV.*�͕��wҦs��z�-~�|S��O���i��"l�K{!]h{!sE����Z���ڭ���-9�z�5�&GO��$����4�=�j�>�Uj�5��'t˗��%�ӈҏ�٭���z��[���w{�h2�8;�PK;��W)	���)setuptools/_distutils/command/__init__.py]�=k1�w�
�YJ�L�Эt�^���ʝ���Ϳ�S�pwڞ��ˋ�֎K�+K9��=��7��6��8��>	yj\9�g@�A�m�����A堵Vʘ������x�w�:�
�쇙���`�m��W��
kSl�TK�VC����"����Q.[�	��a����2��(�*.����k�����^:�I">��PK;��WSOV��N2setuptools/_distutils/command/_framework_compat.py�TMo�0��Wh��RgCOf`��C/M�v�aY���dHr>俏�g�%�P_,������0�/��l�)�U͜ȅnOJm�ZW�ؒ���D+R1�xJ��@T�6�ؽ�z\���Nk9�&���`�+?�U)VH�y�'�4g|
QPP,�PD�ǀ��C��B�`k�.�n�
o�;RV�V���ZO�q����@-j�TA6�6�I���;���vF�b���M6`��*��x�m��-|����Z2��*����l��m$o�Ft�;�LI��d&$BMJV�n�m��(V�7p�3���
�bG�u;�ɺ�.�1��+A7a���������2[,��OaGn�5Fu�)L��ݨ�o�v��a3��[�x�X�\[��T�L��0�O'���+А҃P�1�7�����2�
a��}�z�
�d�Ύt6y�H�7o���:�!����9_e�[��Ɔc+�g�����Bq�p�r��*�墔le��w�r��h-7�v�R�9v�,�cP="�Ol;�Q���d��z��Ik��|���,Aj����Ս�~R��3Bon:0�5#v.}6
ĉu�ft�QRs&Q����v���2Qqk $6?���N�Z[��E�α�L	������_حp����Jx�k��b���PK;��W���� &setuptools/_distutils/command/bdist.py�X[o�6~�� �0[�<���E�v
�-�2��H*�S����DIΊ-��s�9߹�Q\���Jg�<�(�--�u�LM̞�7��Ė!&��$�b�0Bɶ�!w[.�:�Ȧ���H�(�~��2Dj��H��ԋ�N��
ň#����IL)��'v�T��:���e��Ƌ�׀�^�dfS;��bQ��{y��wjt�^-���7�C*�K���+��q�$��lR�D�UK���{�Q��bGE~��@�ּųw�h��:���n��!��d���n-Hg���(�$r�����w)�r^�]�}}�j��Vk��1�M�X0f
,N��9���ٳ�N��9⭾�RH^Q�	J@��$ύ�����V�<Zxn�ij#%$ine��Wܜ���V
��!�Y�[n�!�Q�əᇤ;vi1�H�&�
͜b<-@�C��	�@�G�����tmh~_�V]��)=>6z�+gz�t���=�S4*Ϥ-�4�>j���Lmڬ���]��E��Rͮ�%��'� yA�/��O{#��n^���w#�4�j\	z�F��A�� ;&;lY�q.�`
�&;^1$k��	ĝ6��"�:��e�
��}CSc_A�/_S�� ��+�jښ��#}�s�-`8q�;�
N׍/��F0"�u�"u��N��z�Z��?<#��S�&d�:�=~Ċ'�i��X�>=�<B\&�5c�>![UHƂ�L�D���<#�ky��_���\/.�l�9�؜w��ͱ��سn�m��Q1,�av�35�$7lt6L6�/-6Z�.�����}��:\!��p�ۉF�i�lkW�!���L�]٨�/�*�G)b��!g\��W�ȫ��C��$��p�'�o>��\4�K��
�r*��VVTq�$oc?߾Y��͖��<��G��O���:g3�5����$�D{�0�����Ew+������`S��*���v�Z���r�
F}?H��S���0UūS2a[O�	n}���`;y�^!�>�ǂ�3�[|�����ǧg��H�\WL��D�%���O�|3a�f?u�kG]�g4�*�AXU��N��9��A�3�����T��Cm<1���2�W�k��opP�2l	!���6�9j�uNi-<\��oml��ːf�ଔ
��9jG�3n^�=}�S�s���u+&[��7D�w�|7F��~�g�
�h�[D��*;CC���~>
 ;�LH{������h�8`Ӯ���׋�/�.4�0]�8,N	+3rd14�Z�-����~ Y�^���Ѻ�^`
E�Y4*�0�g�$(�̝��U�3�{��zR&RgP��/�E�K-�Y��0Z�"�d%��!�Gp�1�SO}�ͺi��L�ބmES��@���0�s�����>���嚝yN'n��
;���[V�{d��Ѽ�	�-�R��쟰��v�h�q��?rD}�Q�������	;�q��=��v���#�V��:��о�q����}G���l�4=�>�N�W�?�$PJ�7=��1ƥ���g�O#�s@!�j�W�n;*J���l�N���P�v�9�Ì��l��75���^M��O�7Y��:S�Y� }@��Z�_;���{N��F�I���x�Zz}M���y�8�g�YV?��=��;?TD)�#rX���/���\,a�����>�#U���@Ѓ)��<R�b���������p)�Q������g4�W�j}�a���ӯ��.�ɝPK;��W��y�9+setuptools/_distutils/command/bdist_dumb.py�Xmo�6�~�Bs��.^�5@>�0�^����;�wj|�!�M�E��H�ؖ��0��&)="RT�,k�6�����r�}S�S݌��n��e����̜���Y>k��[�⨀`�e$��a�ّ�4�=��e��j�>��0�3��g����l�~|�
(�vPЊ'&��-<��v�e�e�n'.�T�I�k���
�����?;PAD����:nZ�.A�U/u\�g���3��V�F�5؀RR�`19�?��$�����o�)q5g�ןAi�S�Rwr���n�;v\k6���,�v��Q�����eS4>�p|��`�x��rԠji-5����)\�o�=����
�� P\]q*G#q�fvAџ,W�U�<�4�'�8��8�J�����1R'���L=���{mX+: �fYl\4��3w�F���HP,�=�4�Ip�k���N���H��=;}�?���~2���1��k�<��5��5Ҵ!4����6�#*#O�����`�Ŏ���h+�!w����̙��^F���y��K̪�5�~�-)�D��2�o���+�$L)DH���Р�鄣�&��^��.;Ԯg�B=jZ3�nΚb:��坆�EV>"����Mj.0}�x�~NAΐN6{?�8�Ja=���UpNH�!�sZ���3�����>����L�c�7���>#���|�Z<�w��;2�
�b���&+d�0�w���
]�.=��L�pn"L,�2S[�lI'P���X�Q�.�� y�v,�O<Mf��۴�
��=6}_p�h��Nq�lj\$�V�0yS��FyY��<I,��(�OR��lD�:�r� ��؄i�5�����&��{A��������m�y�i*�D����}n�C/���mv��f�ai��M���C���cƍZ7��-�"..�q�p�E͞a\���T"��%ћ3 T��<�g��ߠn/�:��R��킠n���a��`QQ&+��P��������z�JI9�m�{�U��>�G�z�4�f��vV�oe�y=�H"�~�|��1K���-��Dž?��0U&\��W�Q��xa�\SM:~>���f_�U_�e>U�4���p�g�:2��pU���ǁ�j���Du{�`,7�</ؾL��#�U.����L}��؁.Jf/sI���=�z��}�ܔ����pGNα湪F�^�)m4�/�D_RW۶`��F��a��
Ul����ݐ���r�z.��pѳ
uĨM�1���6��
��'9|��N�p�
���^)F���>MA����Ti#�KG�*�a��X�׹�Ya��3\��7�^��4\�漿�io7���$?�`9-�|�ϓ�p�qc3�����,��Q��Өk���Ͽ��PK;��W�4���U*setuptools/_distutils/command/bdist_rpm.py�<ks�8��+�\���򚺪�g/�8��s�3����Ţ(H�">l+.���n$@����j&%�F���rg�U]�I9���&L�96E�98x����iU�j�����er󢂇g��Y��E�6��4,�_�s���d�8�A�ɳ�be=ϋ,�eٴl��Yyp�,�
��g����Tu-��^��7'�~�M�,�H��-�ج@xQdE����f�r��A�f�yVˬ���z[���d�DM���t7�x��j���
/J�^��[$Y
_�$,K��'�39������VŽ�#7*Li��MA���E�|	>S#~<��<,��;egYʧ�?O��*+���h�8]�y'�1I�L�-��~\�]!7:h"�etRXWɼ_�u�›�KP_:�N�`����e��m�bs�ʜG�2��z1qZ"�A����"�E��i��bK8-	ͅ
B�2�9�ң����o?K��~T	�ڃ�yX���s$T���b�:,~�-8҆Z����V�G�}1������#v�����0��Z�DuQ�
�-�k"34@��p�=�+��������0G�b��mG
�	2`�tt�����Ͽ��v 41j&�,[�4 ۤ���
B���G���U�/�*<��N�˓)���R�ΙPE:@�R�tPW�E�|�a�0YxM��K����N��c��x�C�Q.��pJ��fu� �u�#��%Q@�΢�j��$�^�q�-a���T,e���sؔl�X�2�I��٘�PL��p��D0$'�N㴾����]�њ��uT2!��>�Y���H7٢NLx4t��U�չf$��&���h��)�7��'Y����x^�s�\��[�I��,�7s^tN/�0��6xs'nx��z���~Dz�p�,_����8�5�n��e��A����/���{�2c�b��A+��	k������O��~�^J��kP��
�|=X����f	)��t����rY���"iB��w^���k^	�p���y��m1178Z��
Dg�����#2|
R�86[t48�7�5t��0�qWxXd?��[q�$�R���>�E���aG� q�����:t��ޤ���#�y�%`L�mB��
j|�i��M���ZdT�l��	�V�7�4Q���4��L��*�+zh4n�<���6�5�_�M��.M���.N2�>�-���c둮#Q��(«]��]b�u�2	W��
'G�I���ޞ���c�B������u(�lM��G���^��Їtt43�z�Y��}Iి$6[4<���'=/,(^XPt$b� ��β��8C9�e�|���Gΐ�-
�,�5a�(F�P� t8���9��h�@�4S���x������;6��>zzp~�0��#�wguz:@�>J�.�ߦ�i�3�~g� \�?h�>�� ���ӿG�K����ӓWg�|Hn�E\n�X�qr����c[C�}���t��-��A��*!5E)5@�u\������}����6�vIf�L�n��&�Av.�t���Љ�
�J��Y��hM-�F�m3��1iu'�m�+щI�
��
Gj��{EK��e=�x��Zi����?�Dx�)8Na�O^ɓ�L����iZJ��n��0�p'
O��)�.֮e|�t�
(#a�ɉ�~��s�����5� 5 ߆��T;�d<i%M���.��αu�(1����c���X��.J u�u�H5?B�x@h�1 3�3��R���&
�����������pAN�5Q������z��y��	/r�{]iH�I�;��H��J�P��0�a��ޥ�J�;�q�
��a{#��C��5�4��eG�Ap�$�sI(UL.� �)¸�ֻ��f�����}uY�6O� ��x��8+g�����ũ���`d1s99�-Ojݡ�u�se�f/�����y�
`��Ƙ�e2�e����."FXۛ��e�.}��
��릮jJ�(�K0�*lf�L6��*<:&�6�sG	4n�,$��u
��o��(s�/��!;,v�����R�f"/���;x�)	���g՚����OЌЦ_<r�1�l@���ݔ{g�D_js4u�x�����.��Q�\ٔ^W{�T3�B%�|�T��k�ѤU��ÛXT�`�{<-�+.5]ɼ9���l�3�
_���1�����s����8^<��¨�&S˖h߄q�M�xa��&)펁����p�\�H�%��4��CM���bp$�Ϟ{q����d�mV�U넮 ��m�	,:#�,]�d�q5�l`fa�K��`�g�'E�x>.��Ý�
Ԛ.�b��������gwe�����c��&��,<��ӝ�vؽ��`I#���3��A�"�"�?Ds���b����N`�m�	���;�
wz'��Z����7��~�upMJ���Oi,`�A��n^�_��,�͆47�r��[`���PII1IY$�a��"M���H����~x��T�m��kq?<aKW���z6��V\*r�Gɩ8`�&���3��D��}	���+�T:�r�}	���z�\��T�e*�pV�3�K,#���0�GWZP!�3�Cp+h�+`�bׂr�4Yh�L
��ǢnA��p�<�&w��r�Ydj��M��\���Ԁ�ܾG���y��3�a-?~�t��#�ˏ�'���<�=/z�ņ�>/���
��l1��W���E�H2�t�l
HVS�Gںx�{W+�j�\=-K��)L3�}�_�ʼ�W[SHu�+	��F��οݳ"��;E��MO��a�2��[
`��P+B�����Y��t�5H��Fd�tm��؅�����M�UY�:�ߣȇ�""��Q�S՛4�bo.5<�c���Xހ;O���h}��ݟ��ڡج��%\e��S��&	�9�>N����*,ܫ�S������0Yc+�vx�)w�+ǒ
?�!�b���gW�ށ�*�C0n��<1l�
��j/��q�@���Ω@�i��G'xn*x=�)�����"�9�D�AWo�˜��K��i�z����6��N`�ZkN����nс��Ӆ��)��S��V��?�]�6����V�D0wwY>t{�����3(b��]	�-�P�>]���@>o|�e(����p^
�ۨ�9e��hR�;V퓳�Z$��F��+mt�Q�z��[7�V�beU(��>Y
ٺ΢B;�+qS��1 ��Q�|��YVq�#kjK���{%D�����X\�v�PL,��-��M!�M�4�#���,�ǯ2,~hSeaFh�Ɯt�N��)�-4�G������P�e�"�f��Z����x��J]������u�~7ͷ����h���}��j�6�sd ��2�*:�X�n��LΕ9��(�5F�?�k\��EmQ�Xڊd��������^{�d��{=��o�z�'�&�$qe�!,K�o"�0jŽ�ً��u����>��TB,�%��r��%�ÓX �p�Sq��;m,иlM竏�H�3�@Vu)�%Y��9NF0;�]�.�sކq"J���y$3��)_��Qڳk*t�L��m�If��6��S���oN�'�J�|�?���tn�n݃.e
�Ɠ �҈Zg�B����������"�ʤCG@S3��Q�kЦ���8摪��i�Ǧ-{����uY<x�A��/�T?��5�j3�K�u��j�Ȳ�l�7n��C��"I$h�>�48?�7qp��:�I�uM���GV~��	�>G' MU9��zN�����.�|,�>I�D]\��da���
w�L���r0h�&3}.�"�4�ND�C
<5s4�^6��Px�����X�aj�t���Fg��ϓ0��3��S[W`N�o�>�K��4d�Nb���>R�b&�4p����	>Gp>���ه��qF��_YqY��ׂ�����O/eu~�\r�	!w������C��5��o�.�yr���^��E6��K�,�7T���"E�3��f�囇��0�y]Q�4���&L��}d�J���0.p�Y^~�y&����ԜV���<��JC����_ѥ��t�%���e�7n���哷k��5l�0��M&����,��ۊ��w�{o&U�i�U.8�B����e���Ku��H#/�k��'��}��t�Sܿ�S�1@���e��e|�#и����6R�O'QI�T@Q�6��1ؒ�F��=�_WU~���^�2d�e��i\�5�3�Z2�Ju��V��o��F���% (����Ҿ}�\\D�����C_,���Q�z��EL�I��.��#_n�G�a�z��'�A��-n�]��>��C�+ﰜɄ�'pN͡�}L">LW��Ւ s'��u��
�&B���%�?�nG��.�FG0�w�����m]?��c���
�3X�$޻��q(��w�ݗ��؆�;0�b����[��|�(��+,
�HQ�ɩ�������nf��/�����g
����}�Ua1�}1���ܫ���i�7|�'f�7�~�B���A��ܯ�Q�Ȳ
T�Ƈ���&�Ұ�	�y*����u/�գ��b����TxI���J��yäo���R@lz�I�Q���Z�]��D���1O�ݣ�a+jr�U5Q�]]�w�/�mx��us����\�ki7s�7T2VU!�Z�,�ny�Mz���	[��켼8b���&�,��2���ɤ�ʀ���X\V��L��D�3ؽ�ZI�N�7ŧ"9	ǎ�(��5�m����T{s�%{I��01S�5t��o��Ӽ��:z!o{e���v����:�س�R�6y��T��ݟ�+K,���h��QE4���0ƫC�a�0J��(���=�r�V�������@8�����i�P�n�S�n�����Z�A���OHz��5�;��^����`�V��6B>啗����΀J��H��p�>��<��,�,f����+M"N1�1����w`��ɬ�QQl����Y�|����!F7�:��`�h釵�%���I$ف�ԍ�&.���#�}&�*��׉�k:���ZLtMw��\�]������|��6�aJ06��N�p!�����fp�r��J?.g��s���4%$8qmֱ퇥�g����cb%�>���z .����ɛ��ӓ�n{�[�*07�C���PL�T�C�~:�w}QY�GOV��i+��Nrʺ��S���q�nF���d�b�:��*�K�q�bS�7�$����!3��7+M��֩�ۖ��`��f�i���3��2�ڦ�bBel�I�g?��}^�˘J/���R�� C��ʩ]L�h;�?6W��<L�">��,#�͖�Oߦ��Ͷ7}����`W�V�-1��~�B?jA��"�#w.ݵ.�r��>��Q~�%��P:L�*t�-j�JN��C	��uՠ��Z���SԪ��dϰt�Y�-a�E����� o�d����]4���=l*�!Li�KJJ�{�%P3@�x��j���#4?�q�z�~2���BM�7���
��a��I�P�ɀFK��ަ3巁�<C+�S�
H�$�Δ9��
ѳ�]��}�a�����>����˝��+K�c�wb��L�s\6]`�2�\MВYU�q�A+y��D���� i�N�$ݍ4&��u�Ҥ�Q��PK;��W������&setuptools/_distutils/command/build.py�X�o�6~�_�)$����A3`H���m�0�Ea�m3�H���xE����$�r�hj�ǻ�ww��$I͵�
otYɶ��.�=o���׶kX˄����HjR�$Y�x�Ie�>��Q��Nɖ��X1��޹Ma�)%����?:å��$�r{f6]C�N�v�Z�lG�A>l���7L�,�Yx�a!(��WVv�W
՚��f�q��f�R�zInIbE;2u2.�D0V��I�І6M����4l�l_�9T�-��6]��'�o��UF���:oH÷��S���4t�b��J~����w��_!Xom���޺��v�@��X�w�zB��	o�Y�V���͢e9�E2��7���0I�H�y�5�H�76�. �R@?���Z�԰���6l�&1�d��	���BЖ�AK�ً$D��8B��5�P@}��Ic�oȵ�rU_�_@(�=^��s	q�d2ԣ9u,F����
k��{�(�v�rGšw�^ng��l��q#�I��
ږT���4y�� v���<����늡���o|ۄ0M�>�{�\�C���J���H{dUo�q�Φ��Z���f1��N1��3k��N��/�[�R6��)����#x�k�,�KEϘ�
�G��{��N�3ތ]Bf�N�/&3͚�'R|��:Kx���W�5�B��Bn�B@w�K:nNɁB?��wPiӳ���
R�5��	�u9�ԌP5�^��]��[ˢ��'$�^Exb�sɢ�PSK�����Ҫ͒��6��&~=��P�~q���L����!w��8�BV����*����1A
��ѳ�Wd�O�N#	"s?pQ�M2i{GP�1
gzƍGNI���b�=rAC��2,5أ򒐟��פ���)��+�eP$ui]�
E�4>>�r����L��(.�)�`�7%�z��NO^H&)j8�~<P~�"_
�l ��`�9)�}/�}OJG�Y�5��%���̲�Ձm�O�^���W� �$��
n�-mG�|�-�(�;�¨�H�D�> !gh,���WJ�A"`�bq#��'ɧd�\��vGZY�@M��*�ƨ��=�#a�TlW��Ǒ�!�
�#!��Fd�Z҈�Rr��Ə�B$�z�]�����^����H�	r���,@>��]���Ȟ������e�ǰ�QC�˗�a��PB�L�{T6�?kw��1O��Z��0�h�|!bV��\�����FMs~y`��0#�'�%z�pT^�
U>�⁹(�ּ���41�fM:^}��r!<�%��T^��"�Al�Z	���1n�$��I�Ǟ�"�s����N�l�)�7���%`x{U�D��3�ƍ������๬��3)�=Ϲe�a�x�8�D����w�uy]�p�@R�	
��
��o�~��L�#8;J����Pո��|4��a�o�Co��rmo��bY4�@S2j���;/d�dZ�a?֔�)�X�ΐ�q���E�?���=o {��3��㘦z1�ѯȟ��wl�v��a[�߀�呿�k��^-�1��fhb���W�ɽ*�U��.8�PaA�
�yM���x�[���x��]pI<dpA2'��� m����<*\q��ns~�B�jȂ�r�G�j^Qô�n6���+Xq�Çd��l9�%\&{%.�l�1��V������KTF� V�#�"ua�W5����t��p7��u���Y/9aA���&'[��zY�m�t�PK;��W�5��+setuptools/_distutils/command/build_clib.py�Ym��6��_�((d�Z��������C{��!\J��J�N������%ٛ�_j[$��<3��$��u�S��K�4RWyѫ�ڗ�*6��M[C�Y�N �&�t���ae&��\H���W_	�dwٸ�tBY�tY�T��6��kdD�
m�@IBЬ₿��@[��y�$���x��=JA��������8��0��ѩ����⿽r \'�me�>�q�L���3�'o/��Nh��SV�#��@�%���l�G|�;�2x����N:U�Y>-M]C��eš�+AT
��B
��P�R���^���v����$=1ů���מם���C����[���
�,��P� ��A��tR/���d��8.Eղ������z��f�)T�H���J�[@3u�Б��/��$��'��#dPN�;�j�J��YO�f���tN��`�����#4AיΆ��?���i,L�[}P�0��3����-�p�:�Ѿ6�l��@�}:���nwo6?��0��gox�R
.ki��2q;�9H�����{�x��y�||γ\��D�f�ǻ�a!�|���z
�#�i����N: �\&t.5:�첕M�b�JL��MÆ3�-.wm�X*��K���$��$C��Y���#AWiDl#ɩ�j|\�>�j���:�D�(���:j�g�S
`�7��ͥ��b�J�h[(����2n���~�Q/��A�8�g��a&&n{ch�.h���0�ц�*��,���d��M"+���5�P��P�1J�gTA�"�zm�v4�����:$�/�΄L�k��7��(
�u�;7�=�^5�WH�׆zM�������!�|3<b"v����g�Z��!r�CR�Z=�7�%���\_��#鲯]$)܏c��3Mp=�$��#�n�7�y$�-h����C��X�B�9u��(ձ#���N��5J3b���^OI�)-�4�yl7м�����#@+�ˈӂ��c��y�)�F�s���,�f�c�3QN���%3��jf���լ�4���Dx�%�mn'�wԴ��R�ź73��'(�C��'b���DFy�LE�Q�\�H�ų	H>ƪ��CN�%lW�']�{��Yn�Z���y+��B��Y��Y+��#��R+�~B�Z���R��HF:R*����1�Ins�٣��N�6���ㆄ�[���d�K����t4Lgs��Y�K�lI&*�:�?2� ��8�(p��mg�_�H
�
T)�%�5�v+=C	���5e�G�''�*E=TԭFpeO��a'�ѭ�d�-B���s�ߎ��U��,;��Ĭ����dK
����y���.)�Cs�u�!�n�R6կ(��4����"�"G5�^51�.�CU�d�/��_h����f�ݓ�ӯ�|z�"v4E�Su���U�t�MQn��o�gH'���T���q��>j�2#.K��\�I*��O��$��6ņ����n���g�b\؝Qp�x�[A�!���3w�l�&Q0C|���(h>@I�%B(5R���y��̋�qV��g;��^|��3F�D
+C��N��2�sl3}�ۉ�ʗ<�[�W�+��f���6��\l<;��R4cW�����RN'1�o���lݭW�V>�_����S���6�F8��a�g���N�~a�77�����D#�1Z%;�_m"� ������:�k%e��w�[}��%�0)X�V>���[b�#�Ԙ���~�Ȳ b�p�z��&��;����xp	
O�:������=�V��%}��Zkq���N��d���z��1��e�G�jL{0c�9���F��5��[�4��(�3��M#aӚmަ�H�[�GX2(�3�Ȩ<Z�3��"5�B�0��.��1�Gc�N��H,<��x*rѝ0��@-�O�˸(��u"��8qҵ��z��������00's�i��xIC~.N21���h�Wj�p��ͥ���48����Rx�4�5�\�-7�Oc�]p��9�ώ����F]ruA=�lj&�0�����(,��Ë����b<'
_� �^
��aH��v=�;q�[��ϮTVS���~�E��X��9�Ͷ~L����`�Nt����]���������1��Vl��$M�
l����e!��d���ʓz�U��3�CX b�?�����H̸ީak����Qɧ�e$��?PK;��W�z�l?#{*setuptools/_distutils/command/build_ext.py�}ks�F��w�
�Z_�1	?���hJSW���*��v&�x9 Ѥ�%s�����w7d%3U��TLݧ�O�w�>�L&e�����|�n�ES��}U��yx��b���V4C��"y��&�n�&��,Y�]Bϫf��+��U�<ڶ�}���]��CRW�je2�əi�ϒ����eR�h[�HΞ<yd�$��O���d2y����n����R=i{���[���v���N$��O^�]�v�z�=J�W�v7�α��}�^������Zt��v;nkuU t+�M�a��u�Q�\��V��t�lİ���Y܊�va�;6�'����7�V��؃j]�N�֍��bӵ��F����\�l�뱇�ɥ�{C����ӂ���z�;|�p��%�遄��ߟ�[|w���ѣ��14��r��O~4%ER�ü��+��j;i���*ys��9�i%r���c碇~�}]��5ド��OsC�|��:���d]�?�����l��O_g��/�_��t��ѣR��'�����EѲz�0�~Dm}xU}�h.�$H��W]E�+�P���)��ŭ���i]57��ܮ�:���0���G��?��l��k�$��KQ��]5\�I�Yɒ9@IK�a�n��ҋYR�"W@��
l0,�M�E�:,�Ġg�*��߯n��6y�_$9LB���n�/鑥��&��V%�C��u��x$$��IZ���ow��0�.n���s�.I�(V�z�F�	kU��X��J��T2�	�ܯ|���jX,����"
���cKk�����0�d_�V2�
�2�J��Z�q690QOB�,H6�ZSt¨
����Tz`"�T�n��@s��pch�NT]�G25��U�^�;4���4ix��M_]�&i�H;[!iJ���Â��a�	ke�0�3oAj�k4�)�в�ŜIcj��ꚑ���@Ӏ 4r��/�F��@Oa[쭻(I/@� �@�K�!d������yb�y2e,��ڥ6ޚ
��^��\��N�ܑ�*p��i*��-`A R��Hax�>���$y��j����a߃�Q[}�|������	/O��#𿉖<d�H�TZ�@�"��,4�� 
!$|�v�U�%Âny�ǖ��~���𓢺��^���DiF�Z�����\	�dh��e=,m��@X������i��̚�l�گ�?�ʟj�iЌһ@����@k`-�P�}�޴��.���U)��@�A�zV���e��})���~�/F�F%H����@� 	\��%K�?�3%�g��� jz��t�<.�;����,԰�K���R���K�ް@�0�P#܇Lm���F�z�r�C��>�����ء$�u��y2�NZ�t���7(5}�47s����E]����
�ČlD���IIh|=�6|�� 4���1�He�
�EU��X�@sA�c�$]#��Z�fI#��@�d<�D�
�Plw�J��GK\!�~'V��Tی�a��er]��:����v	M�;�;9�_ڥ'I��j3_�@�%o����?]�	$��ޜ�RV�q~6��O[$A)eh��"�C�ꍤ�H!D�g��Ų��4��V�%� E3IbwD���'Vq��������������xp	�ZԻՇ��R�<�EU��.���<w��cDTy/�t��H?�Q���N�2��E=D��=}Q�F_K»gT�����][����e}E�5��H���1�jF�67%w��ꉾ!r����{��7�bT9��3��~d0-?�B$�"���M���89�����5HL|��	��P������h�Sf�.Dj&�R�1��C�5
鯠�Ų�{�J���7���������R�H����h0�6��l �q��;2��#H��|�m�#W���g:%?�r鍁��ZS۶B�&�ȯg��t�-XbX��tZ�+H��@��u��a�ޟ�˭��Φ�=�a��)+�ju�|�#��7�}!R������*p��hV"����>pL�Yރ�5d�Ǜ��y�j�۪�E-�[p�A�b��׃ݯ�"y����}�J~��|EHϗ�/��_XF^�v�)՜�_ڪ�<�3�n�SgEW{
�(�e�@0L�ՠ��M��B��9$u����ӓ�~�J��(4>b�23��n��	��|zܙ���15�ctXO4����f�@���i��C�:�qY�Ir���Т['w"�o�����յXݠ��2�ͪ��`�mjiF�&B	�%�� Áz߀�	x�X�k[.O��ŗ�h+�$�{��G�ۃ<��������2��4aj7:S�q��Q.��Ah/t�5e{ף�\�^�]Z���N���s��jd���5��Vʗ0�
�.)�<�'d6�m|�Zؚ>I�fH]4��N�Z��tJ��(�����Q�:��A�Y!ȯp^o�׉
+�I��9P¢��
@T�ʃddz��n�$�;zwŁ�!@�ŀ��M��O��ԄK�)⌨�2���5�~F�@�LK[�������}
�!��CԽ�7���?���7��P`�l#Dk5��]n�4
$�li<��x���n�'�:!������g�[Y�t4�z5���P�<�@26BAg
�t��M�j��'˷i��E���Z�x%!j�Ŷ|��88w
�=��mĝ
|�7���ـF
g7Y>��~�,��Q�c����� �m��N�F�Տ�/?�f�h4o7�1�-Ƌ��/��:/X�+1�֊Y�ÅY�?��-����ZN0.G��Pp���M)���D�N��n2x�
����߄�4O�	�`z*V-]	�D��Q�^VV�qr��g�{�l�}��K�I��P)�n�.K���7��]�/���U:�����|y�ݫ�w��B0[���1y*�'�|�ۉ��ލ�\
l@��e���@���n����2�`�|�����m���>t%��W��<�%�?�p�����i��g4eYPsu���9����ϣ����L�����z:K#�[Gm?f<�Nt�gA��+�~�E�t=MK��Sm�U�C���f�c��A�@��.�w#�Gӌ8<*Xm���1�qO��:ޘ�MAk���H�I�����$D��e��w�o �[!n�;3�017GK�1�1��gS�ua�D-X+�u���3{�S;f�:�0�.#�cK��wa�9h{_�PŚc^��F�f
T��B����
ɟ�z��!Į�zM��&z �c���� 6�S�rQ�opI�CR=�I=�b��s
�A��$V�f3?J�[ �M���9
}T��;e�"ESh�f�gUc�1ɖz:,6K1�ش�M�busڑ2Ӏ8�%x�If���g���Ŀ��`y�|x?B�+�l_DZ�;�@�'��5f2��էV�;��;�kY�C(U0i������}�`p���s���Z�N��������>%��O���2���9�$� f@>��`�$�̥5�G:�����w��0�s�&%�c�S>uDr�y�t�B9p�Z4�*��8�E���	���
R�C���*B�(t�b����<��d�bQN��pT���JaT'y+:�'0�"ܦ9TR�3��L偾��|u�%��ur�J���)Xn�ļ"�1o{L�MfN��4����u�tn���
�U/�^p��ۢ�����o���m�dR�%H~ϜYMR�#>/
9��73��U�p���h�;R+ȃ�n`�p'Z4��xx���bt�o�xz �$x��Aj�&�<w�j�00m����K�pj�ܤ�d.�OUҴ(0�ԧ9���ZuJ�q���\.]
me{yϝyA:2�t>�E��n4��=�2a�bʄ�bD�^�
z��r�2O�]0�-Fls�`)aĶ�����_x�G%>�Q���FE��κE+j*���vR�Q�Q���Ղ��.�]��Uh�LO ��+?N΀����=t��~qa��?�jJ����r�8�0�Ȕ��@*�+#�W����H�$y��X���f9�8����i"d�O���;>�n3˨��'��y�9�y��/����������
rxW�('���\hۺSD&0FU��,�7��	*qdž#����6����CFm�UF�	��D!7��u
Җl��m���JY,�&�\g�ܑ�:ͺ<A�!����4��Ŗk��б����]�l����BD�����I�a�Ij�!i٪c��Ը�k��Q�UD�(�Dn��2�J}��]�̌q��ͩ��@�o��$S������d��N�S�#tL�Z��$�	V�3�1��k��)�!/��߷�
t�J�T����$�I�M8W�5ao�1���n����v��ی�f����ِ�Tj
	$���Z���@wjb=��q��v?��NfAW=�1rƏ$�̥�6�qt��1��A���M�b�����6ؔB��(��nF��N}�.�f*D<�"��,b6yFa��r{�Y����K�}'"�/�
��c4��Q�ꋵ8քX��"@���!q�>3��V�q?��Ч��	�=8X�~�>Ṁv�f�<}@��6|��2�8.!zw�ț7�\�p�R��OC�Km�m�=��E^���7�@�^����ӊ�H��B�m1[�Q�p���?�񨁩>`Z"~Y�$r.��A��~;֮�E���秽���~f�uQ�&��<f0�k�Ja��a�5�ҵI�)\ܽj?���1�@'ɤi�B���&���ρpo��W8K�t,M����wէ�|M5p1*��B����y�.�g&���̞N���i��('�k6j�m�Z��a��X��,y�e��+���L���G��P����^�G}B��8�V|r�<_��*�I}|�)>��cD�H{�2�AB#NZ��O���N$F�Xe��/D�{�VެKe�IJ���dtAؓF����ǛF��*0`�EM��a3i���I���
f#⤆4�e��4v����~s��/<"���*p�:봢Cpp��Xe���9�0�R����.V�w���/�c��]�_W=L�믦�o�_/0ʌh�
UlH�#d����t���s5��'WN�W�u]lf$ix	�}~�i�:g�q��	�A����se�C�Gv�)9�P-/,����H�my��dwCN�^4��yp ���ֿĠ�G�\��غ�3�%��E*�^��C
f�
�����.��C��&f���\�`�ѓM)��-h˜�|�q>��`��
�z�q}9��u2�m�s�vk����j9�7�s�w�p���sX���?���pΠC>/�'��)
#!x8�8���Us���/�Ր�B���ÒT׮��f8	�j��LM0b�� ��)DRy,
��U0��9��~�����C��o�^�Ԕ���X.���P�m�LG��!�8T�.}�ϼ*a~�0�:�Y4�,G��z$�r:��9jO&����'V�8N���4�zZ��Z��Q�E�4+�RF�#�d��h�z��b�d(����/�r�x����+פ��"h:��Ì��Ւ��"M�X�LІkQ(��k��t�`���cV�
̱�����AY��kH��>��f�޳H�蚻S�:]w)���?�V8=����'s�O�l
�e��L�b���>�w�e��M����4�4���w����,	�MÂ_�>��8:T�D��;�:b���in�p���O��Rq����+�60omC[��і�Q
�|�]��}g�:�j�ν>�1b����6#��)�κa�jKJ<�G�4����(5�m���
% 1��>��
Ys�zu!�!Z��fC��u#њf]X �f�2(i�l�����+|�&�����@�I�Pi�^��<WC���y��^_���}"�۪kr�oP�8�q����j_]}p�"�
��I>�S���ý��)����\J��m��n(G�#s)��Ȅv�L�j�o�j��n�t�v�Ns���i����eE�If�Ѯ���y���>�Ȼﺋ���Ǯ�$3� ���7�QÙ}��T�p�U�HW{Kތ�c�<���E�r�����	.ȹ��4%�{b�&�o�8b��������*��'Xt�K�%R���_���D�j��_,�2��#��j�{�����mK�����ݒp@�� �)q�O2��{��$��R��V�) _Y�l�k��=>���lZSRm[}vr����x��L#��>N��xG��s���#�[17�=�3��U���ZH��O���e!�j1\�4G���,���p��p-]PMD&�c�����s��5>"g'c����@⃡���ON,��~Y�n��҆�v�D���T��1>ȃ�M� �a2��T�7N��2�)�m�uU5Т2�n^�ƲRh|I�%I��my17����sxW���H��J��9����JМ����<H��ڈF�e��$���=y�&f/_�4]c�Y�<��7�7����-�bˮ��t���m~9G,ʌ!;~�'����nE��0Zsw�+Leqw��CC�-��\�N�78TUז��y�8���
��Yꑋi��Uh��c��|�J���@g��B��Sڵ|MU��'O&�mO��c���K���:��RM�i��$�ܿ�Ì���i�����֩��$7'���ΖT�BY�")�3)Ƀ�?�$����X;B�]���b�V�f��$]�u�.�of-�{O��vdz��䡏��L��>Ο�!��5�Ȥ՘��l�/v�Æ���v����x�\�+��-Q`�Y2��ڟ�Fʄ��YKC����<�DK�noE�aAX�(?���K�lœ�v�Y"Co��t��GwF�B'Q��4`S������T��z�$�ȥ�~W�5�޿'��ɼ��
���2F4� ��
/B���S'����WT���&������lO��NZ&Z�T�]ty�wu��{�k�&K����}��'.�1�	j݌���T}�Dنgb	@�k3x���K,�C90g�����:6|��\��f�P�I�mr�pF��j
K��*���zۿ��<0L�3L��j�u널�z�S��1J�d��7X��y���y>���׍'v�:��_��)���f�X,�1�f��;�(γu,�ڦ����8���F�G�y�b�7"�Y�������ɶ��uRc�,�)�D$��7�U}o"�r瑈/�y����P�E��$�_�����6�g&�<��+�#�� 諃���|JM�c)�D_�yl�k����*,u���_u�Ϳ��b6���UI%Sb��ƅ�HV�
��T�G�ф��R�U#u�=O�Ď�*$��U��|���l�Q,�*�O��=�����O%Ξ�D��z��[�p�k5�c�?*��S,�>Z,�j򨮎�犛��E���۰�gֶG�@�{�«��:t������L)l#�S-��1�j�a=����`фQo�X��S��4M3�ݭ$�7�z��gl/��F��Od�P�׌�0;	��O˒{�U�'�k�u�<.��9+�&x����'��|\��CD(�EDs>3׸�MT���&Ǣ�m�,���8�Τ-��	|��ʪ,u[�-#
�)��{��
|�|�;��1A��_��-�蹠�AL�;]̯�s���_���9
�i�F�ʽa���81�ع�k��@�,��QU���r����-�V��H�����N�NO�(�I&�}iX�>�*�:\�O�`�+>}ft��\�5aq����4g|sKâbq��L)٫��):�d8*̿Oe[���	#��WG���:~l��p��&�Y?��/����$P�W�W�o�{���0��Owb��Ry�m��3h��W5��{h,��hp
YZ�rȑ-�ϩU$�Ȕ�q����7��Ns�˖�<�%�t�J12t��F���y�<
�R����Od0��k�1eJ4IH����{��:����|�ފ�,8~�2Ꮢ�}($�Ɣ�2+}�egs�Bea���dw35�x�%a|(�̈́.G��gc����Y^��\�ҝۙJJ�U��f��U~x��Y���Q�r>%�q�N
x�X?�WB��l7�iʝ��á��lo��mo>gR�����|�ѱm����Hfd��)5ݮ��xӅ�Ӟ��
k���UA�E���8S?�'׈t���W-�u*j���۠^�Be|龖[���q[1�L�NT������5�/Tx�@�OsAs�˜趏#׍�ػ�e���L^|^��O6}�r��G�����a���?��3��gDLŁ
�1[Ӊ	Qe�����L�鈗x8{��N�j�&���>�`3�|�������9mʮ���k>��$�U�/��W��/ߞ���5j�Y�.p޸�ѻ��O�o�;���3`>��U��+��=A�|{vz�@�q
#جZ���ԕ���A[ə$���OG^QKO�e��.w�����i"�+�&�Y�zG�&RWo�_�<����	�������j���T�p?�$�*�8O�Q�IӰ���
ߴ�o�ҿ��(<��c��f6~��ڠ�$y]�}P��ז��u�&\�[f	���R�V��ת��	,���,
�J`��(o�F�,X��-)��K�x
��8]\��߿}���������߾�����N�Q���BX<�����(����y���ū��������)ݘ6~��a+׫�����W�W���8�'L�U�c��H�!^���oߤ���)�v��)8��ε�Ϧ��PK;��W�!~�S�@)setuptools/_distutils/command/build_py.py�[m��Ƒ���bD�
��V�|�o��˱+N�Jtw�Zo���`�, P��Ow�捻+��Ғ����ק{�ժn�|��Nn��p�}��ۮގ竫�c'��%���}c��̌ɘ��Z�����8L3��K�׵�
N4�ʳp�
���flLBOa�Wt�#1M�$�C��qn��>,�_�m;A�����[
�G1�ۑ�{�|����8����긔�l7�\o�|j!��%�
[���q?��x���x����0��NH�W�xf�����a: 7$v�b�DL�[�?����x��,�៕����i�~[�C�4�Lpv���w�Q��?��˜?��%�>C�-S�7v[�����#a��O��:���������`9���%�߿a�0��G%���W��Oe���p
��׸i�:��}$}}�Z���*�_���o�;k]
0(X���Y��h�(|9��(#�;���0t����]%���hh/�a���q�tu��Y���&ٰ�o�w nC?��k����j?���b��x��M>����=��|�h��s��v�?0f?!�bVM�?-)���m/j;�7S�hF�"J
��|)J�H�b1�+��K�1S8Ű3��#�c�ό��\��ъmD^����5���*��͏Z���P���e�>|����Gm��j4�1+���Ӷy�N;��t��"F|p��'o�Yd^�DRL�"�;`��(9�S���mU����[~�=�z(��؊�����ό�T�C0�:�7��y��Zz!jP�Ch>�S-��c߉�+��%T�6S��/^���r����J�����i���.L�)�H� Qv��&�?|�
�*���wG����4� ��.A�R$aD��K��C;��K��d`F_��%�L�>'/�O?���;�b���tra�$���蝘�G�׆����{p��t�1b"�Ԃ9k(!51��K�#����Q�B�;�F¨��p&����&оD�-s�l��OY�<8�&�t;�5��И	��A��h�(�� @O�3BD۴�Kv��t�c��'�Q����I��Q��m�g|�$�-"�:M�s�[4u�r6ha�^=��V��4L0�!a��'��f���^��iBy��Ў�z���'@(�Zt��D�ZVT[����c�$XV��Ji-��O�~Z�QT�ث<�M�؇�ѵ<��|����eF��E�=)BK�
m鐂�Q�� �<�� APJp��f��IꒌNm�< �=�\�D��a���	ӅgVN�ͥ��i��lG��j�eRd�PB�Ζ4�mP���<�PD%�����=@@��K���HG$䶯ۏm}��	1B�}�]l�a���B����h��5_S๊�½1����E<Y���T3 /�A��M�j�y[�s�E����,s0��X�-��@�7ׅ��|�m(]� z�KXܔ嚙RNf�R��!���O�D�X�j��ޅy�)M����@�[�6�%=�%�a��y3\GD���|y���P�5fێ��P����5w�F[Q�"�� $�mh��u~�w�Cq#Ǯ��l�E�����R�Q ���Q�f��ҕ7
4�{��V��@�
��7�c
��M��_i�%�����I��P�+Z~�ŵ�ޑ�U��*�*�vm՘�Ẹ���
&��Σ�墉ra�X�ϵ;�h�Co)Yć�?Q��m:֛I�
O�>3M"s��g��B����;�F���-�!�㊊-�=rB����C�7���`��U��`+|�ؾdSj(�J�xrCm�<2:�Ah���5�2*0���E��ox�Lz�3�3�Yza���&!^װ��u������~��ʀI�v��b���V&G��V�oy�����hk����c��3���暝c�O��R9Z׈M3��fƁf�Xm�ƕ�px S0�a
����$��cE��c�J�2Rj�K�›oy'ED0Ƚn���I2����P
P̠M(w-L�D��^)c! �%_̖9%�����u`��������L�Œ���\l\{��t��i�
�@��Z�������V��~h���l��񸙷�4����j��d�O�pp��8y(Ɖ�h�.�(�T���#���k�ܹ]����?���x���Rk`8NLjg?G+/�a�
�~ X�JN~����x�G����0?�m�!�!��-ƾo���ub�'��-�gԃ����<Y,�r�R��w��(G�J��%pj��ZY��UO������
��$T�NpYW�O���a��(�2��k��vg��Z2��*o	����k��{l���XJ�1��r
�q���&{�4��-
��I�
��?�>S�p`��3-?��d�+6�W{Q=��bHG^���a�ϨH�ز��X��I��s!݁`;�|׹�q.��
H����Ci��~&L�J�:�z��;p1�cuf+A\aj�Z:�i��Y�r��-2k�sV�Su<�04��b#��/n F����>O��*��o��t�_�$��P�Jf �,��\�W.�����$�ߖi�=���Tx4h�cU;��ޤ��o��D*:o�x���b��5!@���zX���ᄐ.RV�i�):��%W�ԭ	���|Xp���������[�b��[V�%����w�:)	�r�n8- Ѐ�EN��ʧB��L�H����	�:[�l�D���n�ߜ�ԃ��+��_�1?��+H�H���[�|�����8��a���sc�����/0'g�	�>�W�^,Z]2`���&C�AQ.a��V]�p,��$U9�q��U�W��q�ǵ/O �mK4�ۨ�/n<�b��_(�z�Jh�%�0�Q�^����F=c�M���$v��8��
@tw$��JbTs7�����72׸�J�[x,��tw6}�������B5uWa��35s���BD��9�����*�W��S��u���<q��!UCQAm����k�u���2g�H���~IPgB�!�٬���-��t�?V�D�K��Űw8�H�PM�ֻ�h��	��
�火(a��h7���
'i������S�H����*��� ��!����C�1��[�s�Z�C�D�6��<�r���u(ښ�Q�A��f��m6��E�uw�����Å�5B�+MP��EL�}j����˅��0�ٯpXࣰGJ�UU8����V�L�(P��
����a���[Bl�0Gz�#������i@�}�l��Z�R���NޮZ����Qʅ�.�ю��o�A��ʸ�~u �XA}!݃�[.�Jڃ�ޒ���9��މ���3�p��<TI�}�<^t����A��m1_Fo���^:]�^̾T�JC!>��;	�*�KP7���7�
��	�K���I��̪����u`03� �b�k���UP1Qa���5�R�µ�/T�I�s��4�~i�zz����<�RvT�(r�kR�ы9ˤ�s����b��`��+?S7#�%_T���<^W$�Sv�G��p���9�`'�+��@ZZ�Q*q�V*����a�%�%K�^�;�⟺D`�����N��s�<�d?�&�̌�`���}���Ȟ��
zޭ���$��"?(�%���kZ[8;gP�M9�)[�+o�$<�G���MV��m��G�tp�d�z(F�o����(ܭ ��)�e�Z��<\�8�L؜:���rQ"V�GOo�D���!%C_j�L�xw��i3X.9��y�l*�c��%�}[FK�M�)��d�������L�\ؐ��E�6Y��!��ΑաwD)y�mG�E[o"<���:3F�^n'/[���St�gK3W�%�"�����~�ji@�K��Hy=�k)F��ϰg���7\��^{��?'6�*\Y�PVW��#��pl��W���&+zQ	��Jq|=b
���N��_��N���iw��[D?����	���	/Mk�nHxv���7���	G�:���L􋓎2�d����(u.�%�IC@�r��RE%����X���W�*��W�Ē�E)er��7G/#Kظp�(R��\��wy�������4X*��2��'�~�^S_N�\^��u��4����j���8�Zf��{K��bjx%�%gaE�^������$D<��Y�ƅ=�����
I����;XUX��v1�ֽUj���ݟBs�^�?�C�v�V��НXGWa36��y�1���V��\+ա���E�;���%o�W�$�J7�u��br"u;謫�q���,R��va�i$�e�
^��:ش�}�ϋ����
�to�6�ˣGx]�%��y��z��-��qpx��g8@��I���yAd,�q�_�*B�������2��Dִ���XU���!T\���
%�T����=*|k��<��Ơ��N��э�̓�{Xp�tjsb�r^�[��K�4זjQ���Z�H���4�h�����˸\y�F�E�`
%�Bo�7UK-��_��鼝��P�_�rv��y{�ϖ]�%�xz�����m-z��j��PK;��W�~Y�.setuptools/_distutils/command/build_scripts.py�XKs�6��W�T]���I�&�q_�;�C�L�d:�2DBb
`0���w H�!'�T��>��o����Ԇ�:��vKE��j^K�+^Eg۪d[&�&f���O�=�9��qG�VR"�R,Z+�%�PC�w�o���zq��!��w:�bͯ=����0OZne�ל�.�-S��j=T~b�,+j6���e)�=<zӍ�a��͢Ho؊�k6L	rna�*^�d��� {P��F��GGϲ���`.��O�����R�o��&���� T��_x.xN
�#Ț+
�p��\�xf�E3����3SWFJZC
_�]de�(��؝��Q�%՚�R�4�M�#����\����2�C4IrY���wuEf���C�Z3��V^���?�������������Xn��A�Iw�=#�wq���9C�5��7�*w�� �[�r¯V�E�2(�m�����kCW%���XW,��
Zb(<�P���b�.��+��"t���a(�tp�i	����ux��צ#!2���O�i���')����Ze}��M��e-�2]��-~\z���d�#��<�v��#z��X�-�L���~��W|U��Yz>�ॖ5������_C7��;aU�!?_!M����SطK��ʹ��{?8��??�d4�4ݩl��
M��ʢV���5���;�j�IP֘n���Y��p
(�-7�avpue���P.:��)�Ah񱆳�r�Ew�!�PC�5��[+Clm�ɠٸlo���~v�$kc����}[WB�r��X�C*�KY�MܿE{�LE�
D��X���BWS�{�u5�7T/��L9&dU�=&ϟ=z�֔���&�����s�(�&u��G�� ?�����	�e^�8s�*&
� @a�:��Wv�&$�'���`��:�Q��c��e]y�Kc�t
�w3�KyKw�H�����-`�A5s��VPnPV����}�(R�16�������k�v}��t�eh�(9�.g����RR���h�}K���`��\�ѡ�2a�f��
xיb��/I:u~�<>��vK�HbH ��sKC�oxUAӘN�m*uV�����IgZP����j�\�q)r��I��iS�G?�߸��}x�͙�L~���/��1��l��6����&��@b��槵��{\~�*�={���M<�:�O3�5�o/�!����?}s~���}ܯ�������u]I(N73�
�Ֆ]+YW������r�xu���a���=��r!�at�����F_�_@�3��Zs$k�VM�J��%Na�m�k�����*n�?y|Z�{Y'$��6j���`�+�l\��*ن�Nq�4��Q�nַ�Co���±JN����Klo� ʻ�cr��H�1��m0v��R��q5��"_P�|�ea%,���‹�7�K�=y$�O+{B#�x���ɓ'��ᇨ6���b�8�8�e���+Zx�}��|����X���I�o\��a��ԙ=��vE��գY��N��~Qk����ߎ��Z^�{��[^;fN�����-��E�-lCa6Ԫ^1ܑ
�P���G�5��
]�P����kŠ���si����Xdn3��=�U��AK��"GO����H?�\K�ݟ�{Z֎:�:q���⦃w��$o�
1����Ӑ��+*\mL��s���&ܾ����%[0XJ�q&ܕ�ۃ��c������������n%������7HҿPK;��WY��49&setuptools/_distutils/command/check.py�WK��6��WʩW�=p�"�!�6H�!X�4��P�JR�u���_�X�� ��of6�M͵�
��ڦa�.�3T߳�c�	h@M��o��PG@I��6�Mƛ�UϤ�g#�!ˎ�mH�l�p��?�W�T�t�$|�w�]�=qsN���:Z��#G�}��6u[y{��Mǔ����=��QϵK�֠3wU	�5��z�3X2P�T~σ��SÑ�%�ܔe>�ڏq�MO�^U0=S�e)�bzsfb�\������i�vz�jk.O{�t�9��Z��g�����`$D��Ѧ����h�'���}�N��I\05;55������wS]'���$��
4eP3wq �{8ܑ7ՙ�Z�Ŀo�?1uҷl-X�a���&0���kz%g	W�4\xi���Ls�`�r���y\�e�̧���<Tn�+���u�O�q���jfi��c�wT��(�y�J���Vb:l0��V5�"#�I�nܳK�l�3�F��9�2�H�#��_����ݎ�9u�/fO_�ˡ� 3�v�fK��^i~$��'���|�#�U�L��%ChT�eP��C�v�3i�Rk�Wk��__���!:��E`�c޽��0��K}Pm+����.�D����#�%̙�@d�J)���wm�Y/�0�#,`���%J$w�;��ʽ�RDM��~z�u\�(1�%�I����#�7��"Fj�#`E�OS+߷}l��o�l=B͙�VU�V�u�)�'�B��b&|�J�r��{鵉m;���*��x�#5�}DL���W�ϥW	����<�SHE#�Q�%r�	��P�~��.g�̥���x��3�aҍ�i{��Z1�amL�QN��f@"��p�e����� �J��&
�b��:p+^���
v��u�`߼ ��',L?��1=al,����vj�
�>Y�6���vŶ>4���,����Aji("�p���c���ab�Z�ע��GǍn�_9�ZO퐬A�]pJD�|E��3yu|�5z�H��'��fgm������F��tF��Ȍq�V+��A/���rB� �v���o���aZ��In!�@�R��6Q�!
��ߑ�zC^�r�W�eh��p/ju���Z�J[� 	��a��{1�Ҳ+��$�
���\��)]�گ�oNJ�Ǘ�������s���Qcy� -cŏ��gP�o>�?�%�����--,�3���vN��!tI��>4��:�g��=�!�v��pD2��-���שYs��\V����P�/�a��-��x`DJ�i�	\�y�n�(��j�ȗ���j�\Ew�0�5��=���'i�L0�e�K��f�u���}~C�n�u	��T+z�������tX�G���r��M�%�:V7�T�v�|��l�.�Eu��;��ϲ;Ѕ�+Ö����~�\_�"�TK��'�*득#o;Y�<~�7yd���~�'��.X"�'��@����z1_���9���8���u��T�)!h�ؕ���c�aZԮ���9l��%l2�.���b�A�{i��Bz�PK;��W��
UT"
&setuptools/_distutils/command/clean.py�VK��0��W��Bi�4���v�x8"T9�58vd;�[~=c��>��6�?���7��q̅u��f�.K�xVHd*�>������N;$�@���8�.h��y�C~���:�|�(
�J�*���]a�Z���3��)0�i���v�پټzE���q�mt0���B3����n���qu�K}�{gȐ�^�c��(�
ɬ��Ϫ�����G[Q9�� �+p�3s���h!�H�ZH�3�E���%?�K?V
|�3��$�������`�4�Xq<�Z���E6�L��:l�O~����d�V8}�}�&%���>�b ��`kL��st>���gf�7<#���f��~(�v��L����NǩN�y�.2�W�$��x�|1�W#�pM�vU�RP��ں���2t^��
���_����X��K�LY�P�*U�?ءV�-?��!dd��.-�*Y�?�ܝ�"³��w�R���� ��YYt�Z���:�ɫ�x�(��0[/#}��P=˸Nr=���2>�In�f$��ۨ���OCV�l��5���y�6�pW�P^�P��J2w=.�ZQW� \bI�?�����Ł.��b���Ҝ�HM��5�92n�{�|���
�ũ1�"����*N^���n�/��
t
��|�t����6�N�S/=q��$�N`�}$
�iե�2I*k��2ý������<f��%�?�=��4��'�k��o���s:���Rnݱ�oJq<981�AG�}���o��Mi��4�H	�u����_33��v��Ŕ�j�}���W͝A�'p��[�����~}EPK;��W@?��m3'setuptools/_distutils/command/config.py�[m����_��p���:�׻�E�I��h.�ۅAK��[IDi�j��ޙ!���ݻ�	b{6E���̈I�����;Y�u�����[��a�x[5��D�i��f��R3#evE�8[VJw�b�j�a|��k�莼c�hVqY���	���M�
L7"�{��J})����j̀ނ7M)sNk��_��I�69%���Xb�L30����hA�l�K�u��
i+/KV�
XAq5|�pO�k�����i!<aY��E	l2�g���-�
�ïK�2�{���*XS�\�
���ɪ^�}+�Jy��ӯYҵ�+�ԠdD�~"ɘjYb1գ� ڂ�/D�����B'�E�$�����z�+�VUl
�Bv�ڈ0>m�@	���·"���� �Լם���֊`�z�mK�f���⻯�����؆���	(a���I����X,8�l����^/|
��V6��4�hxK��,@8
�U�A׆�� ~����&���$$��c|̺��*W�O�����r�R�y�⪐�F�[����Q�w��B�Z�6?�=@ ���)b/kA��AZ�5Ѫ\h
+�������⾆QZ��ki�lu)w-Gf�B��C'ښ��_�	���c'��Q�:�C"��p�|L�VR�q��dC�	*Kk��x�X���z�w�uD�}�OZ�Us�U��"͢G�Y4��dv�hy��,3����G/�]��Tև�E�xb��[��
�cj�X%��* �h@��GK�P�E� �������/;�aBc�����z� �$/�ɭ7-�(���?��6������-������O�h���@� +@O�Ĉ�Z�bX�U<�6�Z��À��hA��[�z��RՇ+P��)�����E@�T
X�T�5J�]�n�5�!~�z��C>j�?�_87PC�#��3��@p8�@���H@����!(s�����ꙻ�ck
�@�Tz���E�Z��,]���ws/rQ�Gn/�7<e�	�����z'4gc�ԋ���8�T���
"?��.!
�a�<bl�6
;.��!|�!/�c,�R)�e`;�"D�N!��KV��-�nH��SjK�'���F�=�2_�(�;��L傴�'?M�P�B�i�`r���1©�8�ބֆ��'��I��X�n�oH{���J&U�2���&�މ��l^Y��׈Z�(�����4�y.����x�jq�ڄ��r��Q8� ���#?.�P/��83ld�\l�����_��3�;�}.&���Xk�m���v~����<	A����~8=�����ǜ{x����*��&�pJ^ �D�NLŷ�;����bc��K|P�l�)�r\��)Y1�����v빼A����i#��S+;�L^X�?���O���v�j�C�f�������p���[��V���Vt}[;�v�y�ć��X�����ϙ�-�*46�Z��6IY֘������p��*��`
d��Rl�{�U�[����54zi�?�6�Ƶ�����x�R����\�Y��F����	�ѡI�S_����E[�z#z�`�݇�
Xg=�>�s��m�&�D#�O�ا2�:�z���<4�BkLGP���ju���]�t[_���
j9�q�xė�^g&ml"�D�:�0փ�������o	�cIu�ժ��y�����M��C
?S�d,�`�$�����:yv�b�����<���Z���^-�VT�<�5{����,]��m���sɝ����a��#`H[	G9>W�C.����j��ׇ�����m^,5v�5)��Xl_r�y/6�T|��N{KhP=;�<x\N����h(J���kjB��������ʄ<��(��E�;&�}���WL�-���%�/!k�Icj�i��&���`�J��	X�y麶�P�/W&G��
$�v`]3O*�=G�c��b���%U&��c�J�t:P���j��t����U�-�uhQR4����d� �0�0F���h'�LU�F��6o� DoL���Q�+:���$O&���&A�ˈ�"��-9V��V0F�2�p8% ��W���"AR��[0aka���+�_��?IYa��/c4�D�;_
�����B�E�d��	��z`���K��QgV�uJ�W=�	�<P;��yg�߭W�N�.��oӨ�c�
R�;s�@b72�E�B��}�kcT�ZL���+jq�2�Y~��<l
��6�Pm�'����d��&�f���	��:'83������A�S?�(�Ne�;0����ʗ���LU_c��a����}�)0q���q3h�Ŋ"�m�w����^<az�n��uue#X�}ߗ�]p_�̡��کRϴF<8�C=�ϷX���X+�����fA���oދ��`�V����|I���B�`��&|bދ�;������p��{9�sA 3s���|���w�Zq��/�Hgu��(By�{</$��av���@�.~5G�}��X���C3<[ �#D��Q�'�/�Ո!�B������I!�e��5�X}����\�=�M�z"�C�@�g��G/��@�|Ϲ+�΍g�X������������Ĉ�i��ˑj�}j��A���_�d�_�<xj��_���W1@�w�8@//F$f.%�T���<S�p�u}
���qH�L�I�H���~��7���/���Š��?^`��wy8^��^��]��G|,����@Ix-l��#�f9P��n��|����)�Ӎ)5/�N�-�I�Ⳡ�e������������/��������!DF���ⷔ�Zރi��
Ԫ�����
r*Ry+�x�lea�ݹ�����
u]�1�Zl��a �)`��q��S�X{���{\���޹i;M��n�:�ސk�x��ؤ��B����IC�Wf�G@₲Ϩr	�@"�t�\%�7�ss-Sb[A�Mn���œ�ڔ���IF���H������k�|R{Z�RS�͍M�z�Aҿ��r���8�U/���cǖ��Q�]�����ȧ��*�(!�:���#��)b{�l�>�C}�|RA��;����82ⴱN�|��r����1�h"j	�����5��68K_�X�W?'3��ݥ��{P��Ff�~�i�O9�f�^
�vݳ��G�V�&�����9bq͉����cW�:�"�M�#���n;��xKf� �!@��"p8�[�#��s¶�κ�,����<%wߵ0�Ksnwb�����]^���.�`��t�'Z�&��r�5���KW.��02����Z�C����br8�5<7h}#
�[<����g�"�Y�<1�{%�y�sp!4�i<yN���
y9������������b~�o��<�B�%rB�������l�Λ���'�n�^�5-���L�Z��sZ2S#bxM7����	����ԍ��؛�P�Լ�2�o� ҫ�&j��55R�w!�kw�e�6�yk^��/|3�3�*��SF���֋P������4d,~�@n*R2h�M|?�<�J,��u6���e�
�u^*���PK;��W�kf0��u(setuptools/_distutils/command/install.py�=k��Ƒ�W��Q�@J�?$^�֕,ɱ*�����6[H��@�����_w�3�"'Ww�rY$0�3���L&�Rt}WVb�l�ۢ^��ZtEU�����*��u'X���n��$a��d299)����8��1ߖM��]U.�f�p]^�e�ۮi*qr�n�-�3�W�5S��|=�	�\?~&'�_���7]�����?�7fX���ws�d��h�n�.+>��u�}��c��}���绢��L����-7E}��m�t��8��*�u�n�{޶M+��5^��_���>}�:�sAw���b�M������B��^�c�-���K���/`����/~�����ȫ��o^��|��bn~�s�����//|�ꗋ�ų�^���?�0�$����K>.
�o}_.!��X�+��Hr�xǦ^�x+��/�eկ����M��q��e[�:��z�����o��
�/�<��{��gA�(?�w-_���|:�T���c�wW�x�����0>�Dl�7хx���G�xU�7#�$Ƨ�"����a>�r]��&B��,��m����.96͖���C����נ���'5���m��+����%|˚Ӫ�7��@GW����R��X��y������%��&WF����ztD�H�j��,�Y5R���p���ų��q}G��0�N,��ĭrl�E�4T��~�y���sf'ȳo��|�`S6���2%i%���f��E}`5߳��5k���`�|�q����W9��K�*V+��i��&�aX�h����-���z���-���O�Yj(�[�Z��b�p�K^�5���=�
#i&���6��<�,	!ҧ]ז���dݩ�iy׷��u��PϬi=#�LR��w9�v���o�J���
F��LY`���50i���_��(�	��:�vE_uZR�5�Ұ4C���%@�b�V�Q��IA>�<�.,� ��M��Îw�1���ᙁ�P��`y��,3��Ў��F>�M!
`���Jj�P��&	�)y}x}�r�{��w��N��נ&�6��!�(�j�@�����m�b��c�t��T�M`�bыؙ�'�v�`S� �yת���9ZS��*UÚ�:���Ǧ&z5���G�H�3�b�s"0���O�D�f@�-2&��E$��@Sx&h�;�r���K�	��΀Y|0�mW�y"Q�ϥ�\A��\_<Mn��3����6.�����\O��[0��\�I�.O��Klq��F�Hܧ��Яy[J!��,A�W�]�j�j@��Mǔ�ej�\w�X�k�)X��<��͈�(uo�D���fpV<2!��?��[�)��x1��Sf�M�ܰmq�Y���=G![��P
)y�L�|��t�/g�a��N�A]�gW�eg#";��'�J���Q@ݦ-�؇�]u(�k€n���p�uDj��L��~]鍉;�Q�f�
� '��/_�^+4���˜�A.��V��*l�*��q��e��AE
T�)lc2*��_]�'S�H��{M��aXڈ�|wNN�G����磦�žf(YV�v
��
�)����oІ:gM���
��{ї����8.j�PgT�F����#q
f	����4 ���hNj`��B�i(Ns37	K��8j9M����ҟk�*�L#�G�bǗ�\Jkԇ����,B��Ը�k�E.�S���ٯ��h������&zL��y�.41�Ʉ@{���L�9�r4��
Uh]M���lbA�h�OGǧ>sJGh�&��@o��o_D��ڐ�\NGf��\x�I�\

�����*�eֆ&q��oE��E��c�D�IZul۬��S؝|ܨ�L�ϞQ�Դ�ϟ�gO)�E���l��#0ր@$œ�I����)�:&��>{���C��'Qx�3�<��O ��w��-C��&Nǧ��(U7��S�fS��#�)P`@��v�p����ǭ�p%UQ�~<K�pҺw@���)j���1���l�,[Γ�Z^�&�7Ù����RYLW>��fj{+t���¬�j��9���M^
L��ohZ��KX>c�WO���$����:�\=���b؊�;�z���]Q,`�n��*�٧�R,9pH͛^P��m*Ms]0��F<�/_>�n�tE��؜d| 3��]���Abq��@~�S��H��xN�Q��e>�BL�(�U���R�Ww=�8�˜ni��
W����|0��׼f���[L3�����l�q�1�n[��������&�(�?��3#�9b3A��]�؀6�T���x��XtF<����Jڙ���xQ����y
w9��z�c�qm�x&`���3M��>0`&F��,�/�	�o���K�2�r�LN���d�`#A��挙U�h:;e]veQ�рS���
��i$�4���w�fZ���{���	��A���h�yW;�V��df�9Bd��Њ�yO�v�Q�=>q&�Ɲ1����)
�z"X������4E#���.{��k��rZ�i�0/9��.s��d̕1�+���N�����Z�L�6tm�G��^Xӻ���0�b�/n���B!}�P8�ŗ���U�8��6�p�@�0Aw!������ȱ�g��ڱ��Y{�/�N�v�}'Q��E��)�1p���?
�D�8e�
��Y����4��h61�>�sa�N�bɣ�F&�:��l��hKJy���'^Sm���fT���s�2v��J�pG��D:�[
\���¢lX��5���-/X6 �LTh�UJ�;���0�)K�ڂ�:T~��'��H)��q��%�-A���6XV�b��Y��A�F���8�g���;TבL4�V��U���gz��m�������ZJݚ/�O�еo�j�ث{cό\uQY:9�ӎm�k�(��ີ �W���	�x.��P	i
�zth���3e�0�Gx'Gc��pt�^�v�YOY0�i�F'�A��\3��u����Lt���+����������B;�%5�q�}��s�݄��,�>�V\�.5�T
�D�,�	�=�~�'#�+�]V@;o�����mYc�p�I*���`�7Қ
;�a���S(I2 ��/�2�[���4.�t}c�P2&h��ͪ�5���(R)(�"���(�O�Fe1@�banF	��=r:x�.U���=��'�3�qǃ)ש-���b]�@>��+:��$�d�{_��P9eU+We;@�ҋB���Űe%�vG?�X��F�q$��
T�D!�-*_[��R�Gީ4�#�jy{��dh��h��w�\���t���@��&�X
!�7�4��N1�"�HA��h�������]��Q��7�?�m��Z��L���G]�mDg8W}5F;�r®�ʥ�ݝ�)ەӝ?d	f\�i��
:<,صJ�A��hn���Ĥe��= ��Kh����.��[�6Z�p/�.�B�Ё���ߊ3���O\w�[�a̙"LJ�wF	�ԆW;�8V�;�f��4K<ugg�����,?=�%��l�	5p`�+R�sk��GXy�	�7(��fY�����ODOt[Kj�B�'�Pb�hŕ�R���+�J����;v!�F(m���+�Ir��z�|�q��zR#H��!�K��=(��ȄD 2��s���S��ꍨ��Z�BR�’}��n���R��jO��R�T���y�l×�޲�Π7P��˒�LA��C+�\�r�K%�փ�`�NoMg@����c������(aC���^B�W���6�r�Ah�R�h��?m�-���s7�҈�	���%�
Sd(�Q�b��yx��B�-X��W������Obx����<���{�]��%G�����/`�I�C��\�0�N]�+�̪�y���pz�3Ĵږ�fL1��/PYf�P��� Bak�9si��	��N|lhr:�>�dL�t��b�9R^�
V�`�%���$��=n�D"�<�ǃC�RK��\Z�X��n����9�	�4p��D�����~�VAOm@�TԪs���PT&L���X����lvì}-�_^�KZ.�vl��=NF󓃛�I�q?����{NMlNհef�:*���ѥ�:��uAc�7|o`®��-�N`9Sc�|D+('��L|����&g�hXS��_�6W�ՑY���f�M���p�,��[��цń�;�`�n���r�1���Ѩ.0����K;���wJK:@~g:iO\?j��
Z>��"��Us��E��=7K���d=�bӃ��f�=`˦�⫙~�����i�F�=�n�}�8s>N�Ē�+�ď.�Ws�?-��H�8�q�ԥz�gk��"��;�Bb+��fYT�*��~S֏�oė��H��領YvSX���;���::�nt�Ԇ���h+y�S[�W�����
�.Ͼ��Og@d�;w�&�X�b��G�b���<�췽k;��H��N�6��X'�W��0�;_`���3z��o6�٭��4e+��<�Z.J�d�4j��f��l��Ū\v�`3*W���W$�xтzk�FѣB�>�%��E�%٬��b��d&8e�J�)�����Dg@�4Q47r�+�D�]�M� 1����㿳瀽��a��.�I�,wѝj�]�-�$�b�Q�jBRj�DoS�A{_���'E�R����ZJTd`
*�(;����f1|��I��m��l�Ÿ.���u�g����Z�a�)l���gg|�N�
li�+��2�,f�L�1aG�m9�di����P?F�g�K�f��o�\�4b�QZ�S�5�qRo���������At
Δ�3�m�u�΁��裔!�A�ȁ�5�#B)d���~���)���
ӻv[Ւ/��j)�nR�����*�j��&������Y��c7W�Je(�:i�3��{�~:;�`���v�� IBy,'o}�c��?����T�]�R5�8���+HH"8p��Ǫޒ�Z	1(�Ӈ���'F���c����tpq�̜��yN
)�G2��B7%QY&��B��B�FM��E	�3����{I&:���&�`��7�hJy��~��f�����r�t3or�c��m	�U�ƽ̯������#�s���	�#e@S��
x�N���L�~�hT~�צ����M}���r�
:�뗾��)L�ON�{��ǵ��j��컖4J)�ԡ���޺"\�0�
����uN���ކj�Xw2D�E9���\ߖ�U�o��%%��L�m�$ʀqX`x��L��򷦮����9se��B����7���:�~�#L�N�L⡰{|}�js��Oힿgp��h`+q��/>�rg�Q7a�e�dUZ�̒g��#}+PQ/��`ť��������6��V5���&�Q�B����!�`�<�:�_����np9}r�a��$�m>����ff�֘����/��2��Z 
S�a��}Q��s�9#>А�q]�L�.�[�0v̘�bb��I�Xf�’a]n�H��h�t�H��c���{�KW��M97'�C>�Ϙ�m�5���i�T}�X���C����1����42�8���!_J^
?^*�qAl6Ҫo,
SU.��k;̄�~�ꔴ��6diS8�8"8��KK'?�j���8α뱲��9Js��{����NxY��ϧL/H��O	�N�%L�Ujn�(���F(y+w�Gf���*��$�3@�K��N�ǧ�)z
�[�j�B_:��S��sp��ƏZ�:��,�f��<�=h���&��g&�_���@u�*9�0;�ϮFAzI��;(��dnn���vA�(Gw�X���&���c5c�A��j'��W�1�SH�L/X��%�ݷ�7���"<dF��b`y�,�!���Q��/�\*���uq��שYEL�1�eHS޹?��6�\���M'�Ľi?`�g�b !1��V 6<�)�**Ue��$.X���bpO���[�;n�U$�b�;��
=�an'�π҂�
��)�-^�*Fa<_����2q"
� �B�kp����P��y�Н�A��o�{Mny�{M��f�I$�d�~\\2���.D6{�,�w����PL*Wmz=�
��k���O@��%����id�g����o�A�co�颷��ٷ�b��6p�1E�ϰ�y${c_�Λ?.�0B�E�0�H��s7��*}�+�I���(/�	!z���z�{��lX;�Bg[����b�����t�'��)ɓ����*^��0��$�=Wf�7��U46�G�ɏsC����!GEw�� �)�����U�.v$(A��n
XI_���}ӕ����ޣS�������%�5��e�NZ��`e7�"6������KV����pO~��q��<�<�I����?�9�v�4�.�� ��4!�\�B�j5g77E��ӗP�5e��A��]���7�a8J����̻g�Ma��rRR��ÿLy�E�&���EW�;$,�����?b�Gs�%Q�/x�*'��dY��\2�N<8���B3t�$�f�ն���s"8q=|)`����@�\��@7LW�
��D�7��8C����q]��T��s�NݦG!(��>��!o������B]o`�*�~�^-�c�?�LU�q�j\�5�SUP��.��؈�s���U�0����G�w�t�ꃪ3��
]�����~Y�LDb�5"K�h�f��{̃�r��;��S<Pґ]�����^n�*�L@¢C5V,��8�:w��R3u�
LR��ڶ�
�ד���:�=���S�8���{����"��<s�!��O@��������N�D?��Ss|9��T����P��"y�7��
����E�M�B�8�j��GF����&~���yj�2"��j��z.�&
���r)޾��1�p��Q��F���`;ȳu�n���3����c��bL���ˈ��O�}Ԕ���z}��by��ѥ���U�s)yhڿ������\����&�ũ���F.ȁ�`��	�6��إà\n6}v�.K�V��K�<G�F
jv��,C�k��[*Jt�;,L��WY�ߝ��~�w������q�^WWZZ**:�]j�A]g.tY��E��L�!!j���O@�i}�����@���:�e��^�x�1�3�M`J�<�U߶vK����
�!� �I��C�q��;K�sv9���2��Q_�s_��խG<���]�L�uT���q$�W.dך��c��'_�Zs����T���j:��t�0]I�*Y��z��
�J�BW;��ˈ�u�������-�븜�Z�mhQ���W��u�s�5U5W}ҟ�(�{{�2ݻ�A�qs�C�
����7�
XDA�����glNg:�:p��?:Qc����P��1��
�$\s�.n���`�b�bѲ��v�+��cL*ǟQ�9��9���O�q����%	Z�%�ܸ��Jx��1"��U��_])��c�<���[,�A�V��R+�XA�>�l��)f:^�ou��X��~��*-���J�s���R�~�Y�ڰ�������LS'����&�H
�9���ݹxlј��VtË�9�Z*mX�O�)+����toX�1�q~ܺ�hu�Z��������;0vߵMp��mi��rE[��r��h~}-��DΪb�X��3������PK;��WSFf���
-setuptools/_distutils/command/install_data.py�V͎�0��#V+@"��u��t{YU�DQ�!q6��nӧ�H[KI����o�8.�u���]t]U���NTծND�{�TX�r�	���d�K��Ρ�z�TǨ����z%U�
җr�*P�
�:��(z u�ܷ؟ደN
�*�
e!�(�u��m����d�A�wߺ��8�'���3Z���@�v�p�(������=S�����I���9q��g\k���Yn�&����kڪ��5�CYq��E $�6��Nl�8�K,E[��.��]��d�c�p��*��棳H;��i��>��r�D��(�Xy46���qR�W�����4�x����]��m��
5
u���u��T=���.�X�}Jy�߱Х!v:���u�C���;;���
O�6�j7�u;�/x2o"�>�Q�yϣ{�Tw΢۵�m�ₜ-ƫ�K���'�.M�]�9�7�1�a"�F�L�f}�r�����.(�N�u�_+$A��WL�(�Y��%T�`%�<_��43�3�nJJ�t��ev����L�{�!鬘WL	m��Y�J�1�CHF�c"^�Im��t�y<9#�bx�ŨO��nJm��.
����o�A�E�WS�H�,�� E��)�	81<��aF�4�	SQ�.!l�auMfw�M0'B�5��Ҋ�Mٳ�Lw����ꦼs�
VC-q��c�\x�Ea�u�g0�`�y��+O��c����}��%1�+�8�	uK1���3g�F�� _)��u��cq�~E��,c#�;
/��"jZ׿v,��u�-$c��:�x\x��M�.���s���%O��)�?��G]�+��,��.e��b�'ߣ��~��G*r��v24�����u�
���%���PK;��W2��L�
1setuptools/_distutils/command/install_egg_info.py�VQo�6~�� >�gu�� �����u(� 3t}�ƖI^z��#m��K�a�!�M�#?�"��i��}Ѝ�m[i����4%n��6�M���k�E<�����S�&�5��$�f�H�d�(��y���_��wo��T2H��J��κ�Ǖ��K�IR;ۂU�`�z;z���YiWr��{��m��2I�����i��	/�J�
�n�i@�V�ZP�~����@�����.hk�f�o��������J;�yB�>򳊩/��u��Lџ�^�
��!�Ȏ�i�,b�5	uв�_1�<6�Ĝ~�����;kp���s�C�3�Fz4��SNL\�4�}�59�
����J�����n�#f�����;�z�֋7�YC�����_��T�~1�)\�j��'ؒ�=.k,g
�}9��99b�a����'�@���;*v1I�b��z�pP�[Wk����WoH]T��|`��z9��r-_�1HG�
��;�����l=*�=>��}�0��sQ��7�tf��Y��9��j��t�RjC�Q|u���.�Ö��q�\�r�����s|9��f~�����V}���-X�Z�t��s�1!�W�wǴ���&|����j�#����,��c�u(C��T��*�Y1���Ӄ�O�g�&>������טyG�'*U4�U�z����m�C�s���؝��y�<Q\Xv�������:��i9NfY�4O.�Îg78��HD'���>G�50�":�}�m|�١���H��������*��v��Pqc�c��iG�ck*@�`��^!Ci3�)�yA�2�C��<�n��xI��I%�;vkAҚ�N�2�� c�n̞�0�j
�t;i���^����*P�3�6���� +2#J9w(|�Ye���d��G��VA�v��[���L'�H���
�UA�@dž�
�ZK�vgė�G��Ф�!�c�ھ	��[���S�č����b�q�b��q%��2��,�社���q/��}�3]=�nE1�8�55�h_��HvĆ�O�d��imT�st�l�'U����83�̓PK;��Wi�����0setuptools/_distutils/command/install_headers.py��O��0��#�h)�y���K/�#Ub������M?}ǀ	$[�Q�o���dY&��I��3��jY�v�U�9c+�:!�
���w��_S�7��
��e�����0KDO
]܍N�/�l4;$�$��7�RgY&Do�5cYFc=g{!��N'��xӁ�_h!8��S�spCV,��^]gi�ħ {�&Rƈz6����~L/�*R���W�K���N�9l}�}VV���X�������0�����O���lU&��3�1
[��]��Ğ��S��/&]�P�K<q��*p?��l4�g�|ٿ6��]�ٛC{���7A��4�U�j�J�sR��������څ;�)W��
g���Y,���,~)�^B$��Ǒ�ԃ6>�<�x-�`��9���?�1_٘5]��tM�;3^��|1˫�)���ݰ�vQ�蹉��Az�nZsW���;����Y%�PK;��W��i�	� ,setuptools/_distutils/command/install_lib.py�Y[�۸~���*XHB,a2�<L1�m����	�I�";h�k#�Ie�.����DJrnM
dbS<�B%I�o�U�ɲ��#�e�KE�����f��8t��z%�:0�w������X�MfW	�{yRޓ#ߏ�y�$�f�.��}3�J��nU��f�~$%0&��F~��GL.�{蹻T��p��<!�?(�KX"
�/�GQ3Ҵ�\�y�ﻟno�׷o^��z����7�_�ސk���	���p�$vf�ɯ6>{&k�ꓑ�&H�?�=F����${B�@ݻ�b�vh;�q��* �D�=h�oF�%!?1\�`*�2p)�]Lj�YOE��}Bȳ���Tiv���=��>��a���̉�
�	�R�����бS�f����a-��D�9>"	��:w��ǎ/��ȟg<\~!F`�7/�s�CN�ȝ��$�(�f3uHii��@)�hk�8��H��gunJ\��LPeuaB�i���⑂d[�lK���\�[�������yz<��u�=�o,�=�#Ў��&$�\\��z?��Ež�)�k �	V+.N�Q�$�����n�tz�L�H�15�`��c0]��A��m7�d�=��-��� b�&f@Βht�
�Y�|k��>&��
ox�P	�OU���Ј�Ï�9($~p;[Hh'��~l���Hq�L��/�`�_q�K<�(���|�ކR�^��P�(�0'7B_�';��v(�'5�.`ƸR����޸�����&�V	��5a�@�)���W��[%p�V��%��2ɺ��S�a�۾Ƃ6j���+v1�Q}=��*$~�e9�Ը�5������H��>D�U�
��WK��Pʏ�(TL�kG#�#+�}�AMuu7����ǝ`��=����t
���m��L��l��yp��L7LUc�h{��Z��бǢMd��<�L���}a۶���սSR�_��\e�.���
��b��.��`g��_�&�B�N�JW��O����U�#��x,���J�ľfYD��Py���)^X;�b�|A��_3һ�|�/O����d�o*�� �؇�A�I������d���|g�g�8JEv�L�C�O�/�~�?�wзbC|�{����A@`cu�ߴB����N󄼰�:\	�vF��u ~��Vz���T7���0�h-CV�'5�ӎ�Q�\�cp@,���Y���ds>*�2]G�<-3Z��S�غ�!tZN�~���S��ǁP�����f�ʦ�,_��R*{f�s7�@��CaڼG.�A.lƾ6U�����j�m��;E������gNdCtVyb\,}��^xࣲ�%���ẃ_s���;�X��e9Pu([	����~v���j>�*��l�h*&Y���x����%�2%{Ό��F�ٸ<U��|?�Y"�X납Q��3p��}}k�H��$Kh�U�{�
�j�?+n���j��݃���U������8Bf��Ѷ�IQ�U� 9Cך�Ho�ʴnv3�`�"-4Z0��A@7�I�uH^&Bl ?:�v��G��U�ǂ���g�;;�6T�Phv�\B`���<���)x��#G3xp8��˟I_Ao�|��:����)�\w����l�[=r���k���e?f],��v�zj��;�Y�Cɖ���TA�0@��L�,����o)e���$������_���x���k�l���ϫXa��y�:�8�U���QI�j���5���������%l[�,��J!o�'���~�-�Q���7h'�|��$aUJd�b���k9��o6(�T/@�l��!<�)UBG��Q��^�8�,�00��U�_y�g��M�;1vu�Ou��lT���L��/F����c�P�!�	y���A\�>��n��;��Ȟ*5�[;<atX{y�U[�^w���*�/�a�Wl�WfW�u�Q0_�L	�כ��/~��%8�H�Y
���z��k*Yf���o��G���59s���Pȶ��|�_Zι�����(kZ��^e.�4����:M�3�zOy>akNW��.B��*횈�0��2����pZf��5���<�)v'�}�Ag��Yw�$�+�"�� �8����O��5�z߽-sX���M�F�p�>��;m��{�s�bU��4}�!�^.y$�2�i�#����|b�e��0;Sj�֛W�e����iv��ǣ�u}#�<"�4» �퓝����`+�:T��F�̰��H���1W��3�7P�<�"7x��i(`(m&N�l�$��Rә�d��-iYU��
N���ە��BS�c���vry|�f/?zs���B09p����x'b&#mĈv�3�i���AfT4󘯺���̹	�G�_C��o8�]��u��_x/�,͍ƧX�gy��k�6�PK;��W�	8��0setuptools/_distutils/command/install_scripts.py�UMo�0��W.:ۀ�R(����a@w+
ñ�D�-��$�~�(Yrbg�:�H>=>RLǵ�f0�ի�����JHmʶ-t�Dot��;�F��!<�H�	x�R�Bn�OG�#	�o�q]��4Jl�5l���F�޵($���Ht=)��FQ+f������tJ�hi\�s43?�?>����jK�a�F�q��x�8�N`
�w�@�sㄉ�Q{�1��l�Q�B5�>�C�� �M-�:�!������2��`����a3����76��	%�3!<�Zds.U���n�K�tJ�8-%Xe.(4�E��_E�(0���p��u�HM�u�zE��X�s�N��0�{�
��)���!*��6�`v����,�ZFs���n����YFŘ�7O�!�NJ�)��������li�$�k�+4Z�ώӋ������j�j�qa?���wg��I+5ȥ<�If���g���O��\�h0�S�Tn_Q,�BL��/&;�Ez%ˎ[e
IOZ�9�+xD��X
�ܴ���N�Kd����ρÞT[g@ra����}��e�&�E�W�;amnl�o�8�~�	���4�[��x�`�K��4�v��ڗ�Q�@
\�8wf��j�5�^C���v�����~�-���e�?^�Zv�]�'�;�%E��C�csz�85��OH�ޢ/�Ay����◶
��J<=ϑB!�5���PK;��W�>qp�+setuptools/_distutils/command/py37compat.pyuR]O�0}߯�b�6�L��@M�y4f)��Ʈ]�",��E�Ҧ=��s�-M3!5�\9��`q�����H3�=��@��F��r��脷�xIF� �J�5e
6b��|��	��UM�PpK$�fC�g�.<�4#R�G��V��ХS�(.�n�%ֱ=�_Hz�4�G/�`2Ƴ��m4t+OfI�ג[���B�k#����~�wC"dZ�PW���~a�hC���~�N�[7>\��v<�I�Q
�Ǔ�q��W�1�
{�iW�z`(�'�H.U���Ɯ�@Zi{��}�X�z`��Ywp��C��_e.��x����aC�g=p$7��޻�����"0S�
�w�PK;��W��
).)setuptools/_distutils/command/register.py�ks�6�~"���Ef,ǹܹ�鴉ݸMj��^��xT��$6��d5��~�JI�;~�E`�/,���$-��J�2���*ʓP��q1\��_�*Y���e���X���j�m�jI�2�
�
�p8X,xT��<?8��M/#������A�Z�b^���T�i�~e�b���Z�,Kg�:%�	���e5��b�6��aY�|ȩd\M\o�/o�<�rI�VIS��ZF�A��LI�[����'�e,�u�9����*	Q�tVӤV��Z�:��F�,O��!�K.��*�E.�&�[Z���e@�xM�)�7b?��G�f��(K�J�93!�Q�G���C���Y��ֆ{�f+�b�؅�v��sZ�*:J�*blD^Tl^g��k��Qn�hع�����x���Hw�T��x�o
�=Zj�,a��g�� �[ߋ�<~�͢�,�Xɳ���A�$�s�ϴJA�pŘ�����cK�^��[��O
恡cB�@㚗y��	N��5�Щ*�X��y!�7R�o��Faz�;����������kp�EW��I�?8K�ƂO���Ө�����;`�b�ե�������MAk`G�<]���͛:G�)/[�)Tk�J�y�B� р˜��|hZ����&H�	��hyj�xd����L��bc�BQ���>���F虎�!�<�k�c�9�]_���,Fۡ퉆�M��%�W��aC8b�zZ�cd��(��8�x-c����C���l�1����u��</�@L�)&~@;�hu@�'��]8�������n@2�� � 5�O�8C��jURV^���%G+�S�+��z�NElH�����Dz0d�!�4�����\pLI6$+-��oS cA;ؿ$�V4��.�r���f�!R����,8�C�)����_���ޜ__��|uu�kDž�#���QV�s!
�{����EMV�B�;�
>��d�$G.]W�;x���."Џ�BG���b��Q�TX�C���h($��E����,���']/ٮ����8�Vi�!�k����%d��#��s�
��~���:rW���vu~Fn�*��JL�qnָ<�X������l*,�:<�!Q5�aYg����"�4U�J���jZS�B�=�����G�wA��@4�����;ļ�"تˎARY(Z^���ؓ��Zua_�,�D�΋,+6�]��%g��Bw�hDz��\Þ���er]��}�i̢�Zz�̼2�_��|�l8FS�T�)>��l�oϮ^�?h�{�6K��0FF�	�k,���-+��@�\<�;�$�yЫou�C7XE)FE�	�ـ�T��d�����������T�sP���K�m9��ɨ�P�&��(N�@I<���g �[�V-�+P�؀k��wm2lM1�7�#�VK�[�/�4�)-��#�H�z�C��Ff�KR���o���{R8�6�(� �	�f�7���4���u
C�G��.��uE(
�vS"�ڝ���v0�:W⍽�}S^F���vE����������dgj�+����9	�N�Cv�%�͕�	��̸b����VL�H�(�!���w�v���5���m^l�J�E��;$[��+�Z����e��R�ָ�
hz��=7�Ƃ��E������v�V�(ҠOC�����+��J���#p�l|w�b�ٛ�Sx��ŕ=�ow��ks��D�K7��i�T\}��᳆�X�޵�
E����+ yS�����O1@ب�Si�bV�2���æa�RS�/�qz�tځ�R�'�i��P�v���R(�j�lMaT����r̂�)7{��յ�b!:{��\�]C-JL���͌o�w�0J �i�m}0"�#���>p����3�S�WY�Vi�C1�=���>~����'/�ق���S��%�P��l�J�/ȿtO �D?9>v��s��P�2��g�D8�Nc+��݅�	�묀tK�0(
�3�z����J|��Կ1� ��ǻ�Ѽ–:�z� 6a���>`�~$d?����`�*�yD���+�e�g��֋��J<_��f�4@���.��خ��_���p?�ӯ(3���#���m��A�8�x�h������^?_�|&����#��#�v�M�wE5��ܧ��4��I7UT��k�yb�h��[O��\��=#=D�
�{^rDbExò#:��\Utx����p|o��ɥ��]޿A=j��?Gpo�Ju���U�zɁi|�^v���l�zd�7T:���,d	g� ���{�]y�e��L�5��v`��9J���Q:�1E�{;"�W�o���E
��ނ�<}��mSBPm�m�Kh�_P��I�d����kT�x̣M^�KP��6�v���/�:ʔ��ǫ^��ӻ�U�"J*	rU`��ߘ�_��u�Q��(��hp�&��Q�|dw��Y]B��N���%�,�&&���AH�lku���z���Q�4��kK1�����O�e�
��@��q���A��$|��#^�B�5ChYC�*�&��ك�mBa��x�����&u�j�TZ�/'�U4�*s
Ů6y,�"_�-���,�Ej�^gQ��d�1ڼ<0E6�V�R��Զ�[�xw��>�fǧ^E�>�-^�1�.V̩��՘\��ݤ����6$+��X!�1M�k�ܹ>��=H�=��ؼ��Z&'�����#���C����klD�]�e�-�GM�ND#�pU�Ѻqe�#�����&ߍ���OȅQ��Y�ȹ�������ü�|q�sK����D�QN�ʂY�r��]	zG��ó�?]���O_>~t���ǟ�_<�9���'����ÓG���J������GG��	�a:OL@k�}d�3�K$-—�a�WF�e_0�j�6+L+�r>�8`K���+w)���Ci��f�Ӱ�o��k�	]�4v{��=w���	��v�
�j����`�
}�n��j��y�=MK�=8�g�Ҋ�#���0�C,�A�{�
��o��^�܃r��x4�����R�7bG5j����J	��
����9$;Y
'����2�7�`h���"̓K%~� �p��?����?��H�K�q�4_S��%���Y'AQ;�f�ه4�HT��QLO�o~�	����顆�S�x���@M^|.��n#V�;"%����N�c��_&�뉳:�y��]����M���Y����Y��4�	?�&��:�_-��n����L����Ʃ�s�HH_e�4�����}�w6;>:��i��D�/,�,�kln'��拇2���\�eꗛ�x����d�Y{�n��D���S�jNN���'+x�*�@�'/��Hs� N��=~�R
����n?�e����N�PK;��W�5;˪ K&setuptools/_distutils/command/sdist.py�<]��6���+��r��Qt�ysJ�s��9W]b��Kl�"!����h����n|I�xo�<��F���o4'���З�H��x��"����ͱ���׽`���W��2Ϣ��Y�Y�D3t9g8ܕ[�n�U��Uyl��g�П�Y\���U�e�!~�OOYW��^��~%� ��z�F!��^�hQv)>Xޕ�4�u����A���}�5�Gx��k��DZ�B��k$i��5|��qP?Λ��w}�f�A��k:C�9��-r����G�gCϯ��
�c��]��^D�W~��ue
;�*�6B�[��}V
\0�%	դ�5����=
����ڵ������j�*�+��iY���=��0��B�lP�P4��7�����������J�K*؆}�������9�?~Xӓ�my]DQ�l�oj0f�55�}T���O��Z٤$���#kw�^%-B�<����Xv��U��1�^�`ǛW���3R��6Tp�w�<�
.i,���ۂ ��kْ�Č�y�
���<�M��ϊ��"����=8��At��h)��L۵�7Wfһ*��;�,��R)5��Y��K~be�e:�]�p�DӒ���$�L��^)�&�Y�ï�ΎYd�;�� ��	v�
U�����7�o?|L�K��-�z*!=�"]��"2��'�]����I��$(�
N�V�䢂���sCM���t��2A�w*�[���P�%t6o��Z7���C\v��o����X�</wewf�A.���sp<���@���
U��g[�o�(�a�J�;�x����У���:��%����Lˆ������w�m�t�M]�=���� �s9�׼Caw�=<<S�D`s+���|��t��=wuw�O�Χ
���/җg]wf`�2
?dU��+ނ������EQ
�{��,�E�d鰴K;4q��,�Z�6#�ÃՅ��]����s�!�N���B����l���a��BIC"�s�� ���§Ikܙ�
k����"(@������ue��d�7��:.MF;��.��.�j@�F��e虆�H���r�Ɏ%DM�>1��i�7'��	O��o��+!ozB�4��1pپ_ɇ����|-{��vB�ާ���h�f��"���i*�ճ�z�N\Ģ�[6=�
7/Y�R��
;mec(7��������a/���׾��F��Bs�D^�����(Tۛ�t+���ۗ�~���Q(?�
�S�?�ַ���IJ.�2�ʯ\3ˏ����B����k��8:w�zu�ɔ�䡖Z8sn�6D�D]��B���)��f��)f��������M��Xx�P�]�^h���#���T�(�0��;L�Z[��j�s�p�49�����ȸ)r�����c4��6���9���=����If�Y�oW�E��=i��1'��׃	"#Oˈ,��$"���I�h#@�v��C��l�BY�g��	�05<Wپ}�+���Ks�����`�� �2^\g��3왅�"Xsʈ�2�,i���J>A�g̈��`a��u�J��R��퓎�;�_<YX�uєt6���l��~�Ѱ�z���,?)y�R�{ާ���fMؤ�4g�W
x^�{P���G`���6�X��\E���O���5d�����-$��Uˆ;ra���|8E����ae��b�	��	s��(�a�����
���� ��
Hg���d =a�R���[�ڝ@b�oXv��(�*�,ŵ�~ba1�Z����5�<&�L�6�h�\.�[���|�&��$X>u����o�.��X�1�� ��U��aнx���;^ D�L����k����h������f���_��ڄj'PD>Z���N����c��ڥ}�r�R.{1�&Fe?��}<ۏ��Mu?"B�DM��x"�|���Y�ء]�d��`�ؤ��^#� ���8�Hf�8�5��+���J�Ķ��ݗ��C�53�ۼ#ޝm]P��\��%H7K0�[xXSa��4���6a+C��g3���z�oQ2=�,�V*��Q��S΍���"��ll��b�Ƶ�N�L�*�8��c��nd��4�,�G)�l���AR
���a� ��0�0AcZ� SS(��^ \f��z@��]���� �F+$<h�l��d�ƩQğ(���4�h�p3!���H���"��3A�̍����;X�-�	��`fs �f؛�8g��4���~�L���~��?���Ɂ��x+�l{j�_}|�F�!���Ze�h5Ƭ����y���9����VR�y���z�w�����5)0�2��e��ʙ̖i��"�홵Y~�큑��e5;mϫ����R-CY=M΄�f�F9AA*!�۬#��zp�T=��Ķ˰F�Ȕ��֮Y�z��q���S1*�۸/+�j4wn���W�����ں��+A��tfY5�ͤ���r78�+&��i���Z���0�]��_�Aw�� Q��U�?`�}�C�xh
��i.��Z�h'𛫑��M&�Z�P`��!�����U|9���Y^s&���>�H��n��01ږw�jD�:��x¦Y��a���?���u-��l+�j�����]��6����YN�]�z�W��N57&��$t�%�����;NR��	-�U�E�et�߳�f�K$S���D�R�(�+Pt�_�!Ը\.Á����&�A�
j^q�,������'#{nJJ����ҐM<�E��_�J&�:��R�&��	[p��X$���E牺$�@��}�o�^�[V⦦p���T��	.*B��S�>E<��9�d�ͯ����6��f�X�B��a���9�^�ȁ��H������w$���]���0rӃ�z�"�du).'<Dt��U�kR���V�D��+���	�ܱI�bG;Ԭ���L�$`�k���S"�Ƞ'��c�l�������^\�)d�~|�;�s�����vP%7�y�
0.4��
�ʕ��=X�.�*l�&�G�����5��L�쩖�*�P���e�(zV<4?�J���	��lM����T{֘�i��BX���5��L�s�	!�����]X�+첻�=�y��&�)�$-�ZI�=;e

��ug�I��:�sk��U���]���;�E��(}�j"�ؑ�`p�v�� ��O0�x�bM7�����eJ8��Ɵ�)|���[������$Ns{R�Oږ�}��t�~qsn�gZ@y��@ �sh��Q©xY��uiUg�t�>8a�:0�"��+^D` �!�p�ӡ�lh,�Q�q��j:�tW��j�����]�������֭�����b���!�����6?x�w0����n2��0����H%q�&��@�TU�
�"R{�
@�λ/n�Yc�2�|��1���">��&T���U0��޽[�mḮD�㪅�*#���M���؀	ywsϩY^�g}��tf��
�é���Z2�;�ثi��NwK͉w���j���n�s�-S���s��͓[뮰.w�=	|��#|��3,B>c����QHT�G�$=��q�qGtU#�]���S��j��$������?�*[�% Uqo���Fx�;�zU�ch�%�'|��j�5[�(�w���|;��
8�����x�3�n�����D�b�k'�M6�ڎߗ� `��\6}q$�x�m:ا�8�?�������W"�k�}��!ٗ=��~������ڱg������ޅP��u�n�*����[���7�]{��]�����Eq��{��H��m��H��l�aᩬ�{�g�-�]���ϟC34
�`�<��.+[��v��u�g<+��W���'87��'g�e�w5���_���*R���B�`!10�/U��t�b"�<�k� �)�{<l~�Tڻ	�j���O�ܱ���a�9�3T�B;
�ީ�vE_�WL�����1�Q责��)s=���3�`���4H�����Fb��55݁�
����L�|9��Y���\tB$����"��E߃$]K~���ˏ������%��~{��񢴓�N���b2��N��9��5M+�Z��	��V�P,�p!�b�E|�%���e
$����G�8-�ٲd_V���K���t�Ӳ��՛�(�@�WDzc;�zr�>�#���ͷH��:������*�hI�W�vl��~����O�g#�7�3�`�l����Ϝ.��˴�%�zB�n���]���(����R
��%��,�0�u�@ڣ�:�^�u�kQ��z�e�L#S#7Ԧ����-�Ul�Y��ېcϠ���n�=�[�c_�#Ǯ;n�^�$�7�jɦvy�P;f�Du�박
u�;�
���ċ���!_��j\��̨�҇ڼ����k��	_��V�o@�Gu�$�t}�.
Ȃ@��L�Z��0��K8�E��R?�O��Q��Fj)8֌%PvlY�.���35%�I�e5ǜ3���,��O�Ҁ����;*AB�<��<y9,󆢴/���ǶR[���I�M%�1&����ikR�=��ڝSȔ62ږ_����؆�U 0��33^�fQ�d��(b R"�y���z�b+���R$��� Y���@0 ��f��$
u������3r�$�h!'x��5��q����#�7"���[ֶb�]Fi���C�{�m��$8�m՜Xv�ζa�����!��1���ˀ�Z���<��� �B�+*�`}��̑��N�C�V�B;��`���߱w_�ea�=I�ȷ��ܤ�z'A�cy��Xk]�]kU}�ƫNW���[t��/QD>��Fۀݰ�aF���Jͧ)���NyCߑ雊i[�L膿f.���t���C�_������k�R��r�^�W`�9�8L]4�<��"��m𗟖;A�nEWaz{�O��^Bm��??
�n.��GB���!}'nw�+�o��\��N�UHv����o�,����E�X�R���@Tc
�v�g��e-��(���;BVMɤP
ue���y�����Vԗ>r�pH�#"��:�1F��ŕ����d�1����r0o��"�ҍ���׭{����#P�e�V5ŗv�൴�(�'����R�3�뭒��{Lcx�K�TzF��ɒW��W�>}��u�ȏ[���S#��;{��A�v�	�/@��7eA���"C١k[��4w���xթqDG�γ�i�%�燈P��^2���rd�6����e0F��Am�s��i.��W���x�✓���X˙n�gV�����PY\_�|�p�O����.M0��=ټ�j\��˰)���+�~�Ĩ����� /�u)p�`@�U$s�d;�~ޮ�C���PK;��Wz����	C'setuptools/_distutils/command/upload.py��r�6�]_���CjK1�c'�:z��N�&��vwҌ$!	�dЎ���9A��D3q�� ��\�F�B&Y���2O���h>��o�mY�$QF�X@���&m�Hd�HM�/t͈���	/s�u�L�7�ۺ�T�~���rS��.�j���z�Ֆ�T��Ǥ=�
�R�/��Ǭ̪��F@ ��Ie�a��Y�+��w77��BT�C����A�k�$��=�����V�*�	VtT/w��W�_�YYӻ�S
���@Ò�R�6UrɦFI>�9����G'�c��U�/�D���S@�(U��'i��I�S��L*�~¥l����_�,��ߟ.__|�9�x�|s����,ȷ	�O��O�9_�ł9Y3E�Q�X1�X�l����11@3r/��j�����TJb�/�;�k�9����)�XІi�K*vn�".D'���Ų�(p<��w�3��1�����0&��`AV�`��l	�L�:lU7�<�,�j�@D��^�%v�ɑHOҢ6�UU0Z>(���6¶�9[^r�i��a,��X�VďO�!�W�Z%�2)��wW�|ϑ�TwK�d
T�pp�vX�3Z@vz'��:Fz�V���m?t�Wn��e�z�z��K��BD���f�lf�[	��Q�o�-#[p�N��U劯AQ��E�e����"O��_���XC�O�݂��;N��vk�`u%����A�7���b�A��*~�4(�#�J�@���64���� �)j�n9��b�Iw^�5`0A�V��sj�]�w\6��;{�Tє��t��q���绕���lXT1�H[�L��%���V �=b�:A�55�"�Kc�O4�A�c�e�zw˄�X˧cD�q+�������1���.
҈�i:��*��霼���q�]I���M�u����{�%ҭNK��lö4&%SE��8�W*�V�F�΂��T��f�h�m^0���)�ƾB�RBpJ�y��R�ӂ!G��O��N����qN�B�E���$��ۦlh~-�:��:u�5N`�N},U�qM���b�F����`6�a��6��
�kհ�G�b9|:�}�lf3p*-fX`���?��8F�BLr�[BeX��7�g�(�ҺRE��CS�ƽ-(6���(M�D��+2]-ױ;X��������tdmi�G�C@W� ��ʞ;�I7�b�J���xv�C�O<@�:H��^{�h���s��I��,�M�CբRUV�6���蠝�V���4
�I�Z����t�����[C��֮>�v�DL�Tm�5i�]��-�P�P���o`�]/f_	���s���Es>�6Ϩ����`DpL��#n�-[�0˻P�F�����p��@.���b�9a<c0��z+{�������~a;��d�F�uA4֭l���:�W\��o����J�1�ڞ���q_�^�gO�G�v�䱶{#�X�����J%\���m����|
10�>���S-�L$��*�a��-M�l^���z'\1�_��x�R_n�E�e��QI�4s�C��-Ɇ}5��?ұ���-����ǁ~�i��I��B�P�"�6)��/�RƳF�m�� Uv#J8%����~����O0/	�6s�SB%Y=`��-�
F6��GʨC�v6�!���u��:�"�^�	�2��b@{�g�1M�CW[Ν�{@n�
�
E�h�U�=�	�O8��Y
׀<q��,wwtg���nI4C/K��N+0q''lX�z:�_Z^Q�33���N�i�3_+G�W
/rk��N���\Y�5n^^\��ǤU����μ��w������7�/N�������wW�/N����ώN�ݗ�z�Kÿ�_�l�Bv�A�����z�Cb�#t�p�J^��_D���{Ln1ٰt���+L��~kA�M��⥇t��muS����!L�aP�7�4 �m
�k����5��@�Z��~�Kt;t=-vL
ݦ��3J�t���S0r��_����e��
��b`o���>�uc}gM���罘VL�t�
�S�
��JمM�V�_��
�!�����>tԺ
)?��%�/x�=�s�t�ڬF�z�<\7閛��o����>H0<�r�^l�-K`A4c�{Ar���«#��#����*75�[Ch����C�T�'NY�?I� ������j�0`����I奞:�?����N�o��� օb�\b���m��h/�_�`��G�d[�؁�W
�Ӏc���=I�ǷP྾v�Ѣ��{� �:&,�?��%�Q��~��O�"�+ِ:�������%�Xrtx��Q���L�u�to�ѷ��2"�ahǭzS?�y{�%�I}\����o�Bd�4.&�C�e�*^FQ
����I�I�Į����fp�Qmm�پ_�X	��l��C<��z�y��?PK;��Wsetuptools/_vendor/__init__.pyPK;��WD�*�;!setuptools/_vendor/ordered_set.py�[�o������DJ7B'�^P�H�ՠw�C��A�v)��}薻��\���K�C���8!��%9����x<��ٿ�D�"���qת*2�S]�e*�q��+E&��(��b.��*��n$�ܱ5*9�y"��h_���Eq#Vof��߹�?��+E,7(�k��4ݱM�*�
�&�䭸�x%�;���r���]V�	���*y
��8|+E*�l
[���`?�}�R�\��h�٦(᠕(��H�S<�hU‰�"MlX��L�K�o���X�F>'�]����k{ٌ/c���_�.�L����Ŧboi�weY�-��g_�R�Kut���o�[���Gv��w�s���h��(X�X��lv:�F�X��(�5)��N5(!���l+@g2�	�he��@{��T��+1LP��|ę�g��c#r�,^����
����X\1^U�\֠_�%X�2qq�jܡ�q�h%E����
d	Pu��AA�"�S���5��:�e�xY��!�ؐ�^[�-L^u� �D-�p1;�1��i�,8	D,/47V�j��ù��.`2���H��Q��L+�!h�q)`� z��Lڑ�_��>t.�BYZఫ:�q��+Yljy�`?�1����۫��|7�P��.s6�/�������-���M�s��d��sUU�DR�Ӧ�8�Jy>j�gm�~�F�ȱ�{86\������Y_�~���4b��y���缑IkN0�x4�0^y.��b�D�����]qt��㿜��3���>��r���P5H�!g�����L��T�%����# )Bm^���ajA�|wbE�4�Т������.�=�7�N�9��8%M������h$<�%q-*|�(3 ��h�"C�^C�3(�5G�bW��J��|�vEͶ2M�ɖ��FQ��\D�̑���Cڞ=��/ɧg2��;m��l��A�%]\��P�F*���|��DŽ]�%3�]?V��V�vZ@d��,P��ʢ��n�
&�;�^���܋�1�0|D�
{�t`ԺF��
���v�[GV8l��ɗ��#���xU^�!1��jv~�\��fN莋�n�0#R&ml{�/�s��D�%󐤍)�Y�*��D��q�.Ι�q�YW<zQDn�k�b��hv��:�����ܒK@�{�ܔN��R���4���w�Q9f���i���3F�^C�
���A$\�
��1��GC������
	����ӑ����9y�o锄�r�
+�nTY�?E^��r9�� U-�"<F��z٦��f�����쮴��ʺZ�t�� h�-��b��/�E��&���(\
�1�V
Ș!'�.y,V5_�(�B�ئ��
=�=L��$.1]�d�6�;�Du`(��2QO���oq�mx%1���j�"�)ŭ,j�Lݢ�~����Ӕh�϶L��w��B-G�����*A�f�nR4s9��|+�\���
 �丹�~/ ��U�=H�<Iu���׵,���҆}����Ή�ln�Ȅ'�AQ�Iv�W̤�(J8�_;D(���()��fYD󟴄�vgR���@�'�5���UI��R���?㛍ȓ�١�v�m5�%�L_G�on%�*�]� �^��9p�΃;s�eu��-E-2=���(ԛ�ŚiX����o��}H}
}1ٵ�t,�N��\��BEes=�z��T�Lof{yF��K���5�Ń��Jϗ!�	X��<��&ﵽ0�����O���̓��q4l|�K�sIP_���:E��1~S^פ��4�x�-��G
&l�L�Z�6�7`��=�+�������BD��&[���:���+�f��F�<�iOez�)��-$]
�B	0��l���+�����Q^���k_�Z�����᪦)<B�{�2e�VO��y�Q�7���LkU�:a��ŭL�5�	���TBGe���:7��"-b8���7J{[���zV��&��D]b��<��CKQ�b��d� h���/�M<Q8t6�Jd�,ݲ?_x���
�(���{��ljH�‘J���T"U��Akw*��1�mAg�g�rr�ۢ��e�X8xM�L�^kE�,ɣITiu:+i�ɔe�ZI�
��{���'���-�:��/
�g�T܁�St�}�Xi>���O�{R#��b�����-ʁ�޵�n"v�c�Τ�W<޲��g�C�i����=G��R��c�Q����q>A�=�]ڒ��n+z��J!}�����v0Vz����%�ڼn`_}B���%�(�|
���q���^��A�7=�\sot?�a�4	�'�W�3���N��K��y�y����U���9t�%�
w����}]h/�tAB���՞�u�TJ��v�ad+����yQ~J�S/7�ϙ�r������OX�w��wAPQ@[��@��\]�5{��6��8(�+*��~�D�
]�ꀵ�f��
S3{O?���5�#6i�"&�-�z¾����f�k��fM-{
��A��1��\/�-Q�o��w�V(s��-a�"��W�6��^���:�m�50ᴷT��� k�H7ru
��!
�sȦ;���C�d�l�
��o�l	��(Z�Fm���r(t s[H��Y�9��%��؊�%b�A>�<�lky]�ϧ�6�yD����ұD_�%���mb��/�z~<���,p�}8}���N�
dYq�l.�D�p���S�o4Ěp� ɘ�� bg��O�P�c'	���co��&:M��P�:�~ҍ�P�
ư�^R�m3{N偽���U+�=�(d
�kSx��-�R�:
߬�&C��[�)�0�2�
��ӦJ��cEa�z�	��Q�̽CaMh��GKl�K�1�V�`�7�v;s>����s_�d�T*��I���*
-"ZƎ�$Z]�te�7���6��p�1V���
����#��)���Z�J���\�\�>�+֫˙�b,�.}�AԾس��A5�����B�#��S7�s �\��S�O�T�^���P�Do�nׂN�s}R&����c�>���&�!�h[�zˠ#���7 {�k��+���4F��+ۼ�Y,�-6��U�AoJl���tb���҆RK���P��gN��v#\��@4=Z�M}�V�P�Q�Q�T�_����k��o'uj�e�*e����]]�Z
^���s[x"���9�0����{}����~
� j8��;W^��%}��'T�
��)Έ6Ԡt	V�b��|�5#�PW8)�Ρ�c�i��}��M/���W{�q��|
S)]���P�Jm���uQ�uH��e���)�� D�0�G���zh��j�|"�&��r������v�=g�9�&�{��&>���B��!$i���=�5>�iǀG��
��Nw��5��9gp���Y��Ч����u�f%L��ؗ�.�w!�e��E���ͽ���'c,�+a. ����5@�{�,A�HA`��C��{�h
�O�4��~��Bf��e�EU,��tw��K�4Gq��ض������"������@���6�t#B�[��bC]�b�<M*�x�s�����E�>I����Dȡ/`��\X�Y�@��9P�ud��Q�I�_z�N'*[�LP6o��Q�O�����i�3q�9�"���1P���+;���O�K�O�9���PK;��W��aLBmT'setuptools/_vendor/typing_extensions.py�}ks�F�w�
�tU$�4c9��F�ڊ�8YW��+ٻө(�%�I�@�\��_?��3��$�q+�H`�g�������']����t/��|�H�U�ge��H��WIWy��S�ڬ��bo� z6��"z��u�>Fi?�x�JD�^����2*ד���*��MT$Wy�6����eZF�_R��)��F�t4�v�W9t1�.Ⲍ�.��e�.��6����uZ%Q�J�2}�,6�=��:c�G�Q��l��}|��8�<�>FO{{�<R�"�|�dI�N_%U`D�^�(~y}<�+}��R�W�G�Fc�9~%����=wUWy4_g��h�,�(.��U
�����e��Y)qɆJgI2Kf�d�5��ώ�Y2��Y>.yU��?�V�,�V�Ɔ���<�ƪҸ�۲\�F
S�E�ק�ޙ-�47Z�>F��Y�MI�. ��e2};�`t���r��"^&��R
��A?��h<�o�cہ"N�$:�yxQyџ�_C��;�G���}�S�H2�
��mҫľ�7k�H�tL��r���uog����On�-�͓��
��z�dUI���}�����xZ��f�����
(�A�(�_/��x�$�h<��7CV��$��B髴��9NbXvӸJ.��.z����f
��X�bM��"]�,F Y,�{��).zC�;�h��G_�@��kD���Is���U�}��=�6P�?���*�,LS��M6}Y1��?%��E���̭J�V�Tzg�EbGz�٫xe;�c�ODw��\���k����������E�%,#��b��L>B��z�b
�R��ђ�u�ގ�� ��)�fdq��l����ϒ��ʅ.�,��3;�-��Ծ�*Aߦ�q���J�.�́u/��ҌN�.'�2�~2���x��hx�H�R>�z���������^<���w_�ó����v�Y�t�"�ưR�aD��"�H3���@QU�
p��&2z��^�e\UE�W�P��@\������{��'
Γ��ؤx��r
�hLK�~|���"ϫ�b�,����c�s��s\Ặ�VuW���(&>2�_����Ert�'�T`�4�Ő������?M	wKѼ��i����{Y�Ʀ7��H�����.^�3ܳ�����˔��qt1F��ߦeu�<;?7����"�����4S�~A���hW�3�͎����
D���	ot�~	�m�ܱ��ƾ��i�����]�P5�`�_k�1��Q�P�ب�+Dk�PP��7��dS��
�� �D�o9�iL�+(�P� ���*�Ph�y�mI�!n�����{'v�ࠀ��{'�mن`���	��F�&��~
�I�)^�U��P��H�i��B��}g�Y2���_\�R��eZU��r���7eR?���6�H��R0�ED++ά��\'�h�����[���?����Ԋ�<���+�$�����P���~�K���g[�Q��
�v�e��c�c���,ҋEXa4F�a��MpidM��,e�ϛ
�e!�%C�3�]���9E^
S��"\�b�t����{���MU����@�=e᎜����1��g�'R2�i%JV[R��PLD���"y��^ ����E��f	�0�ll��+b*����ճ�9~���82��ɓ']jD���C\��y�����{Nk�L� Ef,\��g�s��Ջ�<Q�=�}]>l�07�U\V�!�'l���mFw��C (�� � ��MdY�Q*ЭG@Y����~wY��z�l���w'j�N^��ig�%��L"�4�zcf���0 ٥�a�������~{5�93`
�j�ր?<  �)+�I�1�<`���U����1��%
�	[D�����ã��Me���r��G߄jԮ��� a���"]�B�OW��� o],�I�@�`�O��,�W+�	��C���Ѱ��9j�,հ���3H�W� ����9 Ǜr��	��@S�_��k�������Y/4���;������-Bm�~jhI~�ZR�/z��Q(XTj�v��R=�.�^"�F^2�2-�q̽5OBH�*�J��2W1k�ِ�F;w�����er��"��m�n���ϒiN�4\�F�t���U�i/5pP!T0�H���Lp��IӰEi
��z�Mf��m��/
�s�9���x���2m��#4��F��ެ'}l2@o
�;l�]���{�m��	��{$�>�ܦ_�u�]���:w`�dY�°��h��
��r\*ڰ���v�������;v�)]<�9��L�
�Ni�ޕʹ�%@l�*��\����@f���$@������T��s��.��=��6^����#���OP�����K��G�l8��n���=���	՞�S�B�'�a��
��Z;��+���A�@�ڪY,�t�a[��J�j2l�!�QMdP�	�x�l'fת�Gu=S��6���Dl�g7�[P�"Kc7�l��;�өNTv;�2tcۑ~D�MѤ��vU��uP75@��_��r.u;��4֨x�%k���H����eE��VLh��oX��:އ���Tt����r�<��x�����v�Kjq��{��c��&�Ɏ.g����\]D�t��>I����F0��UI?�%���=��n4Em;�4�(�2�znPQ��J�-���H�����e!\���|]�S�2]��[�NW"�=<�|�Y4O��La~���1�������
�
�{{j~ad[���V{m:;�Oj-uw�e][氩e�AlT�9�p�N
�>m-�<a<_��H0�
�|�Z$�5��ѻ��ʧr�r��'Iu�$���Xp۬��Q�N��gN_o`b2\� BTժ<����z2����1Џ�8)?�˓ð.f�N�-"�+�V5�M�8���cK�Fc~�;�՞E�=��Z0Ѓ!���F�?�~��tr�R^������̐�"5�QN7��C��`(��6�0Tľ�P��!�hVS��qu����y����f~$gv
J&Z�H���c<^y�А���䉈bH�5�yh���_�wa}���������Oͻ�3g��������ў�D���ў�&j��{��[�:�*��ð������臅C?�KRM롷}ɾg�D��ѫ5
�
>�i9=9����c�vf�DǵV���=}��F��PE��E^\ࢠ�6����黰��%�a�B��to�'��#��;���<�
6T�Z#���x�vS.�lޅm��2��úZ[��A˳�xNу�U�J�F�ܮ݌�J�O��iZq��z]�~JR7#�
�H&��m�]�0E���AW�Q����y�����l$����Ra1��~�pÛ�'t�	OW�y�C�_�6���U��,D�PDr�l�5��?"���<mkf��S.dQn��9F?��\D�f .�}���)C0Y���j�Sg��/��A��h�����;v��ĭ,V;x�1���]Ӄ-N����1�,4gzA�OO(�'H[�!0��>骝N��s���8m��!�D�V��T�'�m4Gk�AQӯ��}Uo�n�Ġ���A5ԍ4���w'/�D�U�'R���[��H�,�r�R�0��č{�m���6P,r{�"����0�Cؓ�מ�!���:��o57m����T!XhO��t�.�j���жci�j��cr�i�{���J�=�SO��Z������e
*���
'l�wK�p�R����O���_/O^|��
�۝��Nj��ԣ��O��P��(U�
�aՠ�+./u�7h��
9D���%��CB3��??�*�ݜ�H������N�7�P*exG
���Z�0��ӣLJg�j;{@��U�[7����(��q��qB�Y�g�}��	-�@޶��T)���;����|_u�4ǣ�ɦ��#~)��U�9��B G@�EU��=������Sf�~xƠӎ���]%��"���`ii擪�o8�<W�n�C�^�Y��X8�Rj��#�G��^��`��g��QF/�QI�X�a��鶣�3>V��7CZ�"Q�]�^��[^_���b�~F�l��oNP0�ҋ�h�x��	��J�R����.���O����C�MK|�3�Y��&b��4���Rq�Qq�
�*:�gI������ӹ8�I�o��2c��n޿�4��,E��i?��gKUgFFr�C�h�V���Zc,01�Ւ��$��t�D]�"��sJ�$l�vD	��G�ѿ9��YK�JHv�Z+�zE�H	�d]%%�<yP�'?ҖZN�c$���Ϛ�.<��^�� �\��b�����*U�f�Và-���T!\�z��fy=6�>��k9� �ѕ�V��T�P�N,"�Є���O��2��ҫ�/�n��U��W8-Fa�X(t|ˬD�Y‚�������(�,��(~��j����ޖ���=��b������v�nQ��M4[��4��Y,8f	]��:�,K��H�ٿ	�,�oJ!gm���_{O�8E���Qй�*�u��[���6��'�8Ϋo��K�'�/!.R@�=P���Q�L�da��q���Ն�Wf����l0T���mcB��8�?q!�8�R��G��f 
��58p���(�9�f���$�$���Oh�3X,�"D�+qoM�u?X��(�B��A�x�f��_d_=:�5@icc'OX5x���N&�ؤ.2�8�6�H�����^m0�7P�*�`Ӊ�
�4zr։�O�;���ƛ�b�7�=�bB��q_���]�"3(����	��J��%M�æ§v_0��sㄵ��*<7��[�=�6'����5���{�.U��U)���6���3t�4�;���z�6�\���5�ߩ3Y�����ey���J�]�p��F�.�:���m�@�
�ʭ��++�
�)���V:=Ц"����!o�,�Y%B�i� ���7�@�P�x����p�05;M�jm5���h��
~��6�����:f��C]k�%K�����rJ]�!��ץJ�<&�BK�B��D�<SM(���2�x]��c���N��p+BW���".M6�7&�j7�;!N��fz�n>�)x�0~*R����3��k�c#P3	/{��'�u@�6p!H�o��ao{�L1�@;����E���C�%�uF����9����9�8�1�N��H$t^�I� z	�&�AU�4O�PzX�(r�UCMN #j��k��E��x��"l|E�f]�u�ف,�\/��3lZ�P�#9d|X�Å�9�|�/�h9
}ɝ��ơ�٪��G��Dy�7C3�&M��EJ��eR��E���.
p�oL����\��{[~:3g�	�D9��� iX*RrK�]�Ќ4C�v-��fth��\�-���C�J�Яp�/����|���XWm��r�z��jy(���2�K(60�_�BAmFrI�5�J2�00�!�3FR�,WL������x۩G@����4͖�k�rnN���7g
D��Em��i1��̣�l�_b�%���s�(�]ب��U�3&��
'�:�5���S����L���8��'R,gVZێk�y4׷	\����d(����A�PC���^����g{@�h�n�����qCq}��6��w���m T��^j|VVqN�LSW�Q�궮���}����v9�} Ӟ�*���cux���}3�*9ר�Y���X.�
��
R�D��b��!����^�Lv��F�B̤�:�.�
�KaN��B%<鶜��v��z"p�S�q�.8��LH�3)��mc�;�3�&�[Q����v閺��+�إ^ ��9��D�`�[Ү5��YB�O�	m9$�;h1�]��nU�/�6��N8L�cFb��r`,�~�3y��E7;�z�YԒ�RRgR1�
T�t�&I	n3u��QS=���}���Z�?�B�~b��|�z��V�I�����^�#�T��N��.
�c;J-�^��g޳��0��_S�*������<k|��Ĩ|1j.�!���/`����#.��b�Jk�<�eN���]=�|�!���w2�T�çM��#$�!/N�Q��ivr"�EeU@̫�lSP?إվ�%}��m�����E�ꇙ3$L�v3^1�4�.�3����m&J����Q��/��}�N,�Hޥ�f䒶rU���NZ
�^/f6���|��nCQ-1eѦ�ށE>���`0F��9c���J������F�%x.Uz|�e���5W�]��ɵ����~�6��.ƶ&+hyV�[X�lb�����Pw����@�
�Ы�'4y>�.�w6�ɏ�#1��^,��5Zv5�{0��~��B��}��hF�SQ$�����Si#�b@�t�uz�}a�Ctf�wKb�%�L^怉�;i*'-8���GR\x�=�
}L�An5h�U�M)���F�����tZ?R���~���)��F'/r	�2�����Ӕ*��y�d{tF��ߢa���<S�<�L�ѽ�D�bP�h��^�*T9�]0{���rcNI�b�HW%���z�4Bo��Pb6��m�����YM�R�rb,H7��iʬ�޼���4ZY�o�Lؕl�c(L�\�-0/Wt��$G0����F���Y��U��p?�HYD� Ǥ�\���F_L;���eɩa���H(C�J��Dz^S��/~��b>�>��p����R��R�X��(��k�Ȁ�P�ã�c�����j@ng��4xY0�l����n*�/���u�D��h���VK]�
�n�s
�V_ζζζ��g[mw��b���9�1j�g$����\{��Fp?PHcCL#��kP㝢�r�&���͉_	��[��%�����?@�P�/�6?�S���pӇ*�{w��.�$,r��0naL�w�;���ڏ��;��ݴ���O/?�Z�Bh��V��Ƽ���fS�x��|/�<�n9
c[�b���ɓc��2x��j�"M���>�ļv:�>:��e���_ ����d��c);�U�)�DQ�D��C�F%��B ;L�=D]���7ۢ�x��*ď>�N�^���[�˛`�|3U:/Y`���
u�Bg���r�L/�8�l�X�Jlw
���-�z�q0�1��nn� �ӡ.���m�VkӲ����f���o(�6�.u� ��pkq�kJՇ=���.�ɉ�:Vnf�����M�ߵ�8�m.�{���)+K�\%���,
�X:�0���s&��<,YX>H�r�t��k�_�U�4,Z}�	%����
�~�Rj��h������
�����ZI��H�U�Wy���⯚!�e��I�"%J<QH�|Z)U�Q�;�ZPW�E�J]�f��<Wq���+짻��eO�wI���/S�R��b��|>/7I�����6^R�i}D�	G^t�%���}^'�n&]�/���{|R
��S!�t}��^�޺������Y�fE�ij:�Se�yæ��%L�{�<��vi8��ˢ�S!�8�CES��<�Y
��w�w�^>����W����=��Et)&��[��"2G��+%���2.D��2��0�I�/�t��������L����8�0�/mT�
�Ƌ�������^#��|�����ǟ����FO>:W��Y�.h[ޯ�*V�ا����lۏ�j�H,P�5�;���'�� ��8W��.WUz�e^�w@Ul�g�9k�]�8y�H�N�=��"�!ٷ�����X��v�&+�`f�i�t�����0�	�̡�
4�q���'4�����E�$x�������M��/.Ě̏bT�V����3��>R��qW���o��$�ባl5��w�	;�Q)3X�CA�ȹ�{���{��;���b�c�>{�X~�#�V7y����R�,S?1mk�LQ=S��11�­C��z��W}Qѳ�rd"��`���/�p�_�T�,Q���IwY#�YZ%w�o�D_�b����"��]$���S��k&����B�L�ˇ@�?��o��˔��-:ľБ��“����e2T���>�m�{��7�Ͷ�R��U��D�<EY��h��ݼ'�fTL6�F{3�h?���tֻB�Ҵ%�f�f\�&��m(�����й�O�
�=P��ӯG�f���n�1�&����Eu�u4/)E5IJ�^Ǵ�����nYSD3�Ѓ�/Dj�������C�4�\�z����EAY�Ȼ�Β)f
!�}	#!&��1׬R�
W�㎝ʋ�f�N�k��|��1��UP�7��ȶ�N0�2��ҿz�wv��.�߶�w�Սz$4�^xy}4	u/7&ȑ'�y�{U�.����A�����F]ꪗ�W�D8�%9�Q5�^�)�КJ�=*�
=P�ߥ�7�҆6�\��_�����U�U�ɪ�=�j�jž�)���S�k�>e5�u���ey�Aڶ����6n7E���@
�*�Yr�O�,>P�$��Y�p��Dw7_�s��L�c��#&��޽�7��*�2�?����uǤ�sЮU����V�Vy�}��
43rUO���r�͛�ߣ$�^F��G��o�u�QdGƴ*��+y֟��#w��Qz��.>��'��aM�3�=�_�JEA��$5�a�YOt��S�´�:cl蔴�X��&��A,2�ph����t��Z�#oj(*�n��a���$Cr�
x�v8�NA�J��'D4
�Ӭ*�V.�<����^F�Y9���Ei~�al�fU�vt�p��|M**6*+r��2t��?�H�L
���X=+G�*k����]�@��8{!M�;��Lis/��Kӆ��$y�J�j�����{��A;�2%��I���E*1��-��hᷩϧ�9Ō1(%b��f�"��d�s�`g���z��4>��+�:PO�eK	ڇ��~�q��.�#&�m�-%O���}��a�?BCx��&�xO���=�t�#��=h	�W�6�)��j�w���
�������?�'1�3���+$��鶚%�Q�1���9�����<-ʪG�+�3M䑗��uOQ���Am��Gc!]v��>7C�̾�Y�aT�2"�����b��C��;BQ�E�?�o�$��h*�
qa0i"��g��xgBf׬
5@t��_
��G0n:0�v�1'WU��>%|��@�xĈ�b�\��|v���c�y~q�B]`��<���d��[G�vY]�\,k`�;e�#*�B�����d滜�c;Gv�h��,�i���!�I2S����ԑ1>@�P�k�*mLnc�9J;.nOw_�%{�?�-pў�2����|(�D8g�?(���y�2��X���K8q��D�U�M� ���)P�,�ҿOI�>�Q���0Uћ���ʪݼQP�)�s�I�M-ҷ	��K�zf$*2�'�)O]Im��uƥ�߬�YR,6�:s�f3��-��]�Q�|�5ȶ�lJ9g�E�F}�@����%2�P�&7��hp"]�X?>���K���@�s.�5߷5辩�na��8�p����c�8��U^�A��L��~�+ѓv�<}�ބ�mK�:���N��'�:�Qx�_����Q��@��f�`���_�l�T5�D"��SN�Z�g�i�:�|�W�T��0po��0�O9�j�q �z��lG 6�1\|�����ӱ	���!��\�_�,X�*;H��P�����X 
���l6���rq
�æf����<9-�S�;G�я��b�ӌ�A,}g���
�Q�ۅ[[��I��Xi�Xg&`WX_�[!�Ԇ���sQeLrvLL�0��q��#�I]��GeVO¬="�aY�Ú�@6Ly���؄��1�D;I$����r��Рh?3�Q��-���F1%uh�+�����N�BH}��z�RΨ��G��ќ�^���/�4�	H�%�XMHq��5�<f�hl)�~;��C������LCU�����d��Z\�
0Oh�s��Y�/�=���K!ұ��O�����=�)K������H���qezH�k���-P�����l�NP�zG��vP�9�M�jm���$Ia�\g�>���_�B<��B�?����-�)�I�������1(o�B'>�3E�x�}���~JQe�w4��Q� �E��5`s7�������qy����Y�[�k�=\ܶ5fMU�~������+b�hO%<�ZI[J�rU�7X�u$y�A���`y@T�����Tۤ3��@��4�>����{��tU�YoR
ҕ�X��t����b博�1J��� ̱��ԏ"����W��w��Yl�~���T�R��Y�(��+p�``�	��M)|I�9bg��R�P���o�c�J���l!��GWo����g����l��[�t��lV�6���S�СI��x����9��`�	(�Ϣ�J]a7]%�b���E����d����<{'����Hz�y�D�Ko�ɕF�\��z���,��Y:j���Sf���J`LZⰦ�Q�����RW%Æ0�PF��D�{�Ĵk��f|�U�xe|K{,NP$B�#B���I�/�-&�!=2�>�N"Ǐ2d��~����~x=~L=$KR����{d�R ��|�I����i�`@����k�w�e
,���̯��K�������]�O��P&q1��Y���KV3H�"�~㈻4r:�wuv��8`����gtS��i�*_��?t�+!�mp̊A]0�-9Q��M]֩+d�2/��^2�0���10�XfҧJ��aA`#>zp);���;|NF}�Cq����d ��p�Z�O�p�QoZ����Ɗ̵�L�qr��rs���Gv�2�+���QX� �r�s���n�kC�$���)Y��VJ
�1>-tk�XU��t$����23���}†{4т�PT%�=<\�o�l&��)S��"e��]|����T�qn���Q�p_��A�,i�Q�حhI2y���H%�t��H�9�&-��(���]�*��b�w�*�w)rm�lC��qK�0&F�փf"�&���_9��X	T*m]�'i��u�z��0�ؚ��V	#A�*��SCB�fϨ�1U& T#�P�b�e#>}z桖�;�mY��G�xz2(��Ϊj5%}���0�O�T�����62���
	l/��f�2��Z���S7�ת#7���m�����N��{�&�������3'��e�ι���e)�lod�����A��̳���-���K�fk�H�w�j���\��,X��)��^J�����=��au�$w"�e��8���c��If@k){Ě�-invv$1��!�9t4tH�ru+!+��̊���]�|����΁�B�" �r(�>�N �1*|X���~���mv`<��=������B�`��\�/i���o�8;�P�r<�%͕�~Kf�09�ژ�b�;3��
�^6�:'nOO�-ю	�x�y��az(x��M�藠�]Q�?�*��i��7V�6ա9gQҥ��]��|Po�1KQ��h�-��|��E��1[P���1n��!��u�#5�Q��9dǍ�	q��Q��#���,c���J������"���z
��i�do��>��w��aK(��n��Ȍ�r^T�V{i���7��!��e��F*�����E(��M+�����|G�$8^h�5���5���	*�#��i^8�˨�#�5G�έ��1�a��w�Q�]���m�ûmx�°�1��σ/ƃ/�7�2�p��;�A�x3�|gOi`�h��ck��u�(�&V@��p����	�n�g���o�#>ӱ���7W,?|�{7�H��5�G��E�GO�t���'�%��&z~f��h[��ֵS�g�nG�; �y�3t�6f��g�TX�v/��'��j�h���ԑ.}0��ક�/~m,$2լ��ڜ?�'�&����<�t��a����a�-�1����<��'qn��g{��}PA"E�$vO]PS#�?���j��g�sP�n*��!iY����8-~*]�W�\A��zֶ��Jj����Гfd ��Y�:'ggj��0�wS��#u�b�v����Y�V�X��:��p/8�_����v7�y�3�	����jۭ�nIFK��j�� �Vi�5[o�V���j�{(4k��~Eˈ�&q�Y�H���S���>�0�tIi��D �05H�}�`��i���!���9W�5x|짅6��Ip�S����T��c�V>�J��"N���3\[����=���C�=@O��ZT�2H�F�G�ڧj__��h��gp�Z�@3b�bg'+�I�nNS�R�����6h�A+1�9:�9z|x6 ?�S��`��i_�r=|�T�z-!P��7���NSBL����	X3�a=/�\��	�g
�jcqz�H��	NAc3���~�e�JC?��M*�e\�E֝Y��+R�1R<ٸm�O�][�#|`,�N�L��:v�Է1�o&��,�	�G�l�?����B(!���kƔs�5�l��)���nvy�1��W��tEǍ&~#�a��~�c�}�[�0�l�Kb�m�j9˧�w����]ɰ��ΆO�6|nC�
�ے�6��`��a�#O�osbo�mq�1U�6��[K���U�%S��H��~~A�y���15�?p�]�f{�˭m�vL���|[�[���w�'��u���d���iPnr�2-;��)#?9�݂�������:Sy�\�i�t�G�I-7�}^gʟN������C�:�?n�d�+͒d%*"Y�۪�l,q};b��(�z�`+�#��1jE�נV��@dHw��g�P����J.��W��V̇[���Wڠ�LbNF"�WE���yF*�n����
1\���f��~�w����v^�JH����
!j?H!�^ZiD�b�#�((-t�]	Q�Z�w����Z�S�j�]6X�1�W��c�q���^A���� q��3�?0�u;�����F��(D�dp��^~��9��v��Jv��f��^ˤM�@cn.��[J'y�$�b��c`��C'�|�����A_t�������a�:�C<�ԩ�1Ⴤ�g�x�G�\���kJ�]�X�Bp8�;��H����%��e<x~�<�p����s�ء���~
uTg��G@7R���H���̍Kf��q�~��EL_��m^4�F�R	s3~�-�]ܧ�����O^
-�r�;�ṯŚGf'*��O1��v�X���Z��l6^���/��#+��Fs%�G�>���z��3��2�'��D:3��"��Ja��{�f�v�:R[�u�:2���+��1ޟ�����Mt�ܹ���_d�]��-H�u0��@g��U�ש�y�)��7}b��.
ٚ�	�>	�P_�=�6�pM�|�xN/2����(S��[�Sӿ�ud`�2u�`�"8�X�Z�pZ�����m���L���0u�57	q�	Qc:�sCs����r�`I����9]�<�oH�����d���?R��w\������r��w�QK���:�@��$�4
�ai,���3W41?��ӷ�����b�P���0��q�)�!	�YVq�*�
"/�.0�%��
�<�AMFSL�
e�늦j�-�ЉI-M�)�&/cL���@�����7��kD�+��5�zq�i�}�5�ܳ�%H�_�0�yy���Fz��� ���E*��;\�Ӌ�!�͟��kF�5@�~��〩�׈#�<WA�XWWAS'gP�R������M���Y��>�	��Z��#w��:L)�n�s�	��t�Ԡ�Iؚd�a ѿ��{�T��F���n�;x޻�M�����v�{܅Tnϔ�1&���/�h���섹�/F�bA��_�0 >��J��9[+�B��j�QBǢ%yܮu���$�$�-y�ed�H�Ҵ�q�ؐ�k����PU{�!{��"����lVW�9��b8�C\,R-�?ֶ�}i��K8�sۖ[�
+�B�Π�s��am�o(8�P�i˄��e�;��ᾢ���gps֫1�;f[T��30잚�{�eM��rQ����j�Vl�Y�0�⏣�b��E�vb��z��d�r5�U�$�X��@�oӫ���p�zx)_�i٩��lr;���g�_f;�=�W\�\�g�Jf���;��z��E$Kn��J�:Z���s
�_����B�[�����a��M�H\oҵ�R�1�x
��8�-0��Ĭ��i[������  Qf�xH��: XzS	��`GW�&�+��������t�2
���)??�5.��HE&ٹH
&��6�
�"�I���n�crd�E���
_B.S�it'gc���H����R���C�c�m�R�։�(��}��~U�+1��S��
����
xgeZk���z�厴��R%��g��0�'�*9�{m�m��j���Gxa�а@���Y��b?����2����v��a��f,�_��7x�m�z3�EO�Czt/z���7�0r�y�ы^���2't:|X�dۼ��'O�
Dz}A���R�9��w�C&�vj�Gv^���W3Gyvq�Kֆ�7��Wglº�7Z��}��Cg�1�]��e��~�"�gj=�a�]Aw���JA�F��?����G�g���e�qY�x*�ebіa�A�̥���-G]��ScVf@�_��ed
�S]�f:I�Dcp#�+�k�_y�+�ܚe`q��Jv_Jht�>Y�ӷ�O��eL��ȯ�9s /�����
EB8��*�Ŕ�15(���%��wI�*��EvIMϭ�����$w�;���� PA����t.ٓ�#Y�M8!׫HSa�n��d��H�}Cs� (�Ju/R$Ʋc�6��P��z��Uw9�2��1�@�|:�`�€
`R��C{;_9hV����lz��Y[ݜ�Ƀ�Ĵ�}�đ
ģ9�n8��}����Ď����`�{��{~Ean0����9T>?Vҩ=6qS/�4��� �q�Ԧ]DUAW��X�
��E`g<I_@kx��]�cݰ��-�:G��O9ot�~�T�*%J�|s�%1�L�*���:#NX��7"<�Gq	�2-y�!�b�5_5f ���S2������a�%<��V��/.92��)�X~�Oz*�;cS��t��ɳ�!t�:�ك��I�Yf��zU��Κ�nN�N�Ku��+�SJ|�y�B�2<+R!��`�xy�.ch#�8#��O����@�T�ȝZ)
w
��֒M�%�=>��r���n�� �
b�l}��jpװ�]D�ߎ�Ʒ�j��m���qĭ^0j���dj���b%���A�|=D���A�|=�� z�QE��Pm�c5�緆:?��Ń|� _<��Ń|�ǔ/lO��ޘM-�ް=J�Z��t	����	�AQv�m� �Q�/�-@�r<�/��j�9_8�?�r�#N��/�11x�A�	i���yb���OEj֞x����5�b��ol�gog3��y�Ƌ���\�!H��hX��,5�N�.�#���#��`����r�)��kR�w��<�����ݽC��tt���c���J�nK
��ќ��z��*��m��N@����c�$��@P��K�$���}5X�n��n~?�~J�Y��1źLW��[����a���t:�u#9p��,��P:�g�!7W��\\��&Է@���U���5�,=	��]�����ڋ����-��R���Ծ��e����4)MGC�������*nn�4����R簸�NSTHMh��L�e�y�%�O-�Q��터zv��� E
ߗ��0��i�|�4i��d����3�:�9�����s��tc�y��8�.��Z,�v+퓻(_���QU���8��4�Vw��K��`�����0u�Q4�T	g��OH�l�Z�Hﻦ0��	�;���X�0^����=z�v��M%1�)
C��?��9�x�[�J?�� O�K��;{��0�bH���S��1�Ns���3�
M-�X%Z�A+}�l�ey/8G�s�KS��k9f<W*bt��ߥI�Jء{y�
o{ң"�M��&��#4��
���ͅ���:�*��=H} s#�VU��H���2�|E7~|��g�5ީw���Yn��Q+6G�
U�q�L�Wb�v)?�{�PL7�U�ZCx�/���K��eW?�mD,��ұAO$b�W9�	�K`X8�]ɸ�r�3
�*y�k��W&��*��꿦1�{�ۻO��u�4��ܷ}_�ym���ž�jw��ö�ږy��dD��R��&ЕT���z�A��'/��g�C�9������+�0|�0���)/Jf�*�L���R>B�nm{��l��Q�j��z����<��dͽ{8���ϫz��7g�\��\��p��[ٶ~o�V���wyj�9�A�	^�H]��P˃�ՕDjs������I�΄���PK;��WB�q8u
� setuptools/_vendor/zipp.py�Y�۸���NXN��-0���I�P�Ţ4Xh(�s�Dzf�b�>D~��I���(Yv�A;h76yn<���в��^3ٮ��ԵJ>u\O�+e%��R�^�m����m�xҕ̆u�$�vV����A�J�M*��e`ѷ1���z��W�m
aU%r
Ŝ�۾�(��\�D���Vَ��Z�)��4�‡�{h^���B�,�x/�"��黺�2��E>��qc*{����DM�L	�q-
�
�wN���݋F�>�Z�T��dz��ѓ�a{����ґ�c�m��fcv?�3z�n��H��@J�e@K*bvIx�ϒ�(��B�fL�D�J�"Jy�����t�^�컶�!��O$<W�y$�!�P�s�H˲���yl��Q�e}٥D��D�8sg���좉�,��%niyS���^������%�K�%f�ˊMغJjk��B�N�"(߄
��f��D�L2����3X&��^6�����\J�,!��j�DS�L2��=>�r�o>qkERkZM_G��r��F6�V��e�m�rê��x��U����"%t���)!'4�4�;�Kyŕboں��oe�"���?dw�ggz��:�o�MڋFz�M+��)d��3�2�(t�#?�;���#�^��ׂ�l<���G���y-�-̊	�S�p�`bU�� =,8���{�D?�ռ��3+e�pe�CJԱ���de۳�Lw�#��˾(L'qT��3q���$�(��0J�:"M<���9�r�%�F����̙Z�;�΀�o�A�
�=e eH �{W�����	�	s��&��0LH�"S&$�.+*!���o�E�ޥ�#�ȣ� �ص��=خ�ʹ�:�ۮ��TB��}X�{�0j5�!mқ���|�?�(�(���Ϲv��,����Bd���w.oF�v]�v�$0͗��;q�+���*�';�d2��P�q婬e8���_��M�����	r��~�n��H�v�hJ��+�W����!rg��)�=��-�B[�ڣ�Q��m!���&dI���X&ך.�'��Pz�6Zp��Sxn8[XΥ^�TVL<��M�4�.X�;YT�_B*S�cw��'!NE�5ڀ�ş����$���tZ/ᢇ��_���/��������^8�-
��$���������Q��OK ���HSJp摁*���T�Lo��jط�&I�Q��ACxrW��2MKE�ԝK<��l���{F����L�ռq>x1n�6��D(asD��7�$Z+�|�b��@�C�!�zq}=V�y�|��/����1��'�v��$-F�|B?�)&��=a�|^pͩ�i�?�P�n�Ki�S��LFĀ^�q�%�=�r�ڜ������#ζ�y~��؊1e�	�c�Z�[��Hp��=�{3!�3�\�*�|FwG�Ạۘ���i��D�Jw���Q���C-���mG#�y
0M�Z	j]�����E�����g�ʚ��MA 2�B%�O=��	�����0���%�C��j�J:��X�%���|g�jq��J(�*��*���0?c[D��3�_6'�Y��$7(��*�ySZuΚ���A
����	�YU�� �^dNQK�F��Z7����i@��i�%
��}��=�ʯP��X�U���U��`a��j;��
�M:Q����vwG���o�wwv���s󠹼�ؠV�]��+�0��6���^�ˆ|�U��_-�W�ww�r
��x��K���:���[�j�
�-H�.���&Mi�@2_��ݬ�s�B��ٝ�m��?�̮s�/��#JS��w��zlܸ�]]����"2�
|l �<Fr߸�f�?
�5���T
�k�%
�����ر�;����L����c5c�҉\"/>�8�af��=�}�j/Loi_.h�3���C6�o�I�rT8��
�}y���nF�痧9Dxl�3:��fJɉ��1�@��ő����=�=z�����"�}|��3��L�d"n	�"�W�R�4��5o�����F�m��R$1�mP���x�xa�>=�}���1D��P�����u��驜\!��D4�n
�S���g�������L���o��uF��iF�
SKj)��7�)�Ԣ���Q�ԫ�B{6v��&���y�;�۰Gѥx�8O�GGx��p���
=nYL-ǘ��j3=�ozq�y+|EK�s�g�{7n�ɸv�9'̯�gv����_l��ĉ
u(K��X�S5v��"��B�P�
��:-�_�
j�zN�@�_��]�Թu�
�s��;Y8�'�l�5L����	Ðz���
ӫEs��*�sv�/[�����eU��3p�A�A�g73X�SïW۫͆0�y0\�FG��/�a+1��P�b�.��$�>�`�h
E�YQ�g_j�p�8?�rt$q���0|�-rs�LNx\�cB,}Û�6�� ww~���у�޻G\D'�ߧg籿���.��/8*�w�,p���TT���z���Y�.��&��Qs�n;{�y)��G}��F��P��[��.�g���(fVș�'�����+?m
��i��V`~4O����p�6�R����lZ�Og��|ꁡ�g����:՞{�x�|7�%��K�t��PK;��W6���g1setuptools/_vendor/importlib_metadata/__init__.py�=ks�Fr�+*U�%�*_.���"�>�-�%)�4��Β������J�=��7KJ�%�,�3===�=��a�m�n�����O�P���J}\���~�l�feY$�Q��z-�EY�/m1\U�R}mZ�Cө�8\w��{]tuY_jT6c�����At΃��ˏ8�F��*�ʦ�$�
˼X-�Q�C��ݣ_5[ ��V��N�?�e%��M1V��r5,�Ӣ�L'��'����^�nA�˺���/���m�
eORG�W�4��u�*VWb��nj��kr��Eu]�zz�/��.ߏ"`�BԪ#N_�9-V�K����xQ�S$*�_55�,��ӏmۉ^2?�^�|۬�Jxm2�*���q�N��?' [���îQ�~.{X��E��/-�[Q�9�:ϣ��?��]��E��>c��&��W��}3��]��.���^=���7e=�g�������Q�<��Dz3�q��s�ê��Bx'/iu�g�1�8<<|{%"9.He�
H#�����Z�M��Q�'��6�3�tb�:��j45+G���.��]��؊�C=1��(��"����h
oxl�I�Z���Ө'n�hU"Z�My	���t�%���E����Ǐ�p+�lm�g�(։���—�g�3I�;'��)=GeB3:�{�z/�E5·;��vȁ8\�M'��
=
 Ƀ�-���`��.$l�'\���z�����uG��IT�I����y��t_.>��ARM��a�����[Cr~����T ��ٹfM� �x�}2[�5�B�9]�1uG��S�ѯ�E�7���s����xiV�*j�OH�x��b�Ǫ�}'2�f>�#�ey'ڪX��	���H$Ղ^����R�G��QY"q�Ez���C�r�v.5Ҵ�QɊ�n����1lKC��
;[S�ʚ��_'��"�.�fDV&TַU9P�$��I���Xᴉ8i�r"j�-��t��n�C]WI|�QJ�߈z-���s4b`�8~jd����?hW��(��RTk#;Rn�R�V2�YOy�Ҽp!�3�;����\�I�*�~;�ع��i�|(��e��
�"��
� ���9�_��岄��e��\�}��æ��$�O-� Zh���S܍����_�k�$�_��c�Du�]B��scnk�����~��;���ډm�A�t������{t�ANw�Xu�({�՚��6v3i5���?,��1T�\#`v��
(	յ^�,z���%�C�rG\�`j������;`�ջ
���Ķԓ�)�ImVyAZAb��<�9'�Ϝ���%�v3���_�i�X-R`���J����&3�h���d�7BD�6�ѺY�Q�e�껫ah��{�t۬�����׷bUnJ�f�zq�{�/r��2��m֌L)Ҳ�\�K$����g)�����8.����@vŃED��;�.[:ֵ|��7�O�+ˤ9�y,�--�6rP�����P=��o������~��?>��:;�&����
���B<�6�ߜV؂{��Yv��sn�dZ[�=\.Ǫ�B��ᆹ�ܖ�	������r��,�W%�%���
4kӼ��Ԧ��(���\bϾ�5DGgO�f�;lC�-Z���١Ɔ93�F�h�=�F��U%��"�Z�r@E�eoٌd}�����A*���5�4U�\+�"Vڙ���1~ ���Zbv$�7_I$�+�%�*��3|溾��r�4XY��V_֦+��Rf��bO,[���NV���	�7cU
�G�'��Ql}&�R���/�7������b�_��D���$*R�W� {e���e/�����`I�ʎ"
.�;��4=i���4,�w"#	uȈHI,�e�!�X�"+=�)���8N�`L���|q�ۂ'0�U
ۖdAe!QL�|p���v_H�Kp�s#z��a�ps���9Â��]U�t�o���K/�%��x�P�H�ClpB�B6��I#�^��{,�bۻҨ?[��G�qY�!QO���̨��N.m�M�Ĭ]��.:+��xـ��ٴ
�L�o�4m�v�+�u��q��L�A�bu���������$de���3C��|�M��R*E21H��3����d7�GQ6�V��L���{* �TT�- h9�C�:����h�ϴn��W�ݏp��w�H~��_��dPτ��6����2�8�k�H���ISn��9�����b6��f6���t��`}2������Y
h��FvWE5��L,���O�ib�6�2FQ��
�B/���2X��zJ3${}B$Qz�.��cnX� ҳ�%��a�ɛ
��>nHFE�1���&�Әov�I|\�v��M�#f��6Lb��Ď����Kط�c�P[��dˏ��6m�@��߁��B+P#;6<Ѯ����I��fعP[�/E�rc�3��Z-���f�bF�X�6F'=2 L���/6i�N�hp�����<�Q�+��~_�/N�P9GV�1JƐ�!O,"94��ɨ1���˜��GQ�toX�o|�z��d�d=v\%�Y�Ƴ�I&7���)�Q�K���Y���N�N�b��Z%��Ft�vh���8r�|j'���n��:�k֠�N�q��5�(��V��}�$̀�DwQR�_�6����St⻉E07t�-�M�J�&��C��A�8\���o�A"�J,sL	�z%��G�M�x�w�8�z�x,�� ta�%�]����$��U���S��[(�e?V�	�
��86Av+�`J���U��?�a���FĴ��:��9�	v.�ФX
�|�͡HTދ�UJla����IUcs��Ȑﻺ�1[�
�1��H7jOJV��40
j��1����8��CIriJb���6����>3-��f�4S)�$�}��[��
�6�G�*�cH��~��>)v�
�R��)Q��2���'�W8�^X0��
=wWvԘ	��%3:.�h6�F�bJ���#.�Zۣ��.�8�~�v�J‰�r���*j��,�܈�@���)p��aS	ƞ��RpǼ)
���������;������e�N�f�}.n�i�|�m�~�m,���� C둉���ń�e�"�HUi!;:��6
����
�,�>E+��Y�uq��
O��n�5x}�#���F0�K㹫�.[b���)���He�̈^�T�ȏ_>��HL`�bBfm�&�|/H�6��U�.7���C���w�	&1O�D/���
�luU�uFjP1C�v�T�P�Չz��Z�w�zc��ڸŐL7m���	�k�B[��s��1A�{�Fєq�!W�mN�*$�M'`N�]����Uf�
������&�� r�4���3����C���نkE��^��~���ۑ��3=���)��Bc>�/הm?WP�h�UD���T�c[P����6��2�:�;h���@U�s�6��te3��3C�FR#f��>}q}����kxUV3:F��_�����/�>}���S���J�ܖ�?�p����Zށ�b���A�T����&���Ryt�����چdz�0���%6$����=FO���c���>��m��2�U\�y\{�����H#�e���V}),�a��3��.��^���J�lؙ���͊�u�oU�d�
�Z|�[ٜg�z�1��9t�k�����VD�i$�v�aʵ*�~Jo��&:;K!	�"�C�
�itRgIe�A�x�Vp.�BA>��в̃�=�Y��|���m�yl#ImXX���fY��s(M�^�~�H�/��0j71�'i?Q�%�* FhkI��,z���/�����!Yp�˛_��o��B� Fq�=����k[��M@�x7AM|�q@	��?�	8}����tA9��{Y�����e���ȉ��FȸY�@���L$�=E�酨���H`n���T_��F�ˤp�-�V� O�)� �z*d�'��Ռ=��"�e��sH`���JaZ}�x/ �dn g$���k`~k�B�ƒe�W���0��ە}!��d;�F��l6����tm��'4���ES����ܼ���6;�8��H���s���$���� >��0θ�.T3<��ԙ�~5i��j�.���.�Ģs������#G��n�c��[��,����U�ؓ�f"��xDxJ���O@��y��f�V"�����E�@
�Z�=oo��I��/�0ח#�(M���j0
w����|"�'�k���N�,3si���b4��p#Ɩ�]7#X��a���%
Y�\��w����5[�
�r�	��C�556q����@[v{4�@T�;X�/q(�s�(>�cK�K~K��`��z�Cs6QU�� �,��D%>����@mq<�����������{Ǝ/Q$W��xPm�N��oEeM9Q�I W3��B?�)���z͹/�n�%9yTɫ�%���lX��$��Ι&��<��ȉ�D92�
���.4�u{;Ar<=�8�2��ӣ�&N>�ov��h�`;Rr��~�x�'$�����9D���#��o��/�~�81�2Z��%'�h<v.yN��x=���?�s���]0�CŰK1\�F����v
��t��׀W����Gs���<��߲��܉�'1ڧ|E����,�� ΏQB h�,*����O<2�g��|��i+�`�	s���5�F&�[��;���V�mU�����e�9V\�+�ad�3���Ħ��>��]T���t��g�$�`��6QxmL��J�5�\ð;�Wޤx�)��S��Q�h�M���$7��PE������d�ӥӽ*�>��O���]�1Q�̮)KӢ�ו���h�Щ1��g8"]B�q��uce�Q�΅��S�^�`��B�"1�3A3���Q�gZ��햯e[�
<�|KΧ�����x&�����jJ��g����R�p���j��.(�&s�F�Tb����<�%9R��C�h)؊X�������b���z�"3��I�]�E��(SpOzЖ+�'*c���(U>�X~e(��ˮ� �3FOS�U�ԉ)���;lbe݌�X����=�WuE?�v���r�5GM;�[�r[�z���H������j�	�\�����L��N�Y�e�X�9)Pu#_=.�î��0����Z\�����5M�L�[T˙��)6q����<��S���C�FK�>�I�h`����),��]$/(y<�4�`
�x��E6gf�_���Q���rV��s3��7|G�rB׵xqO�܈��k�3�4MݥQ�`wP�&(0��vb^'!D�}�KF�����9���nƄ�Sc�2��~<�6�<�-��H3�uoМ��g�_��wfLY�c���='�.���,_U��>So_����`,��ٴ1�!?�-�l���eѣ�а���+%64o�0�kp�K^R�
z�7s��0���a�y.t�NR9�Z�=����c�k&"��(�+���	���J$���	LEG�M������uڛD�d�F3�
6.���ǒ��M��؁|�lS�t��h��X���=��7	��PnikwW��8��$�`�T�#�E(���o_�p�Zb���n%.��.���o��~gh7� ������S�y�x����4%D�T6�V;Y��᪍�b���[�bMJ�	���P$��s��'#Jއg�R'�	.hV}���w������ˆ*'����ȩ���쪽�/�x�׷��D��l$iU��mn��'C���p��`��k�8(�H7.8�]��F=y� B�~�ts�s���Iwxv�g�ߠ�?:��U{F������^�Cx�᩼R�"si�,h�Wj�Rcs�<��
]ws�G�e}����O�M�a��K?[D�/�⅃'��b�*�Lt*���8[v�Z\�<�
X����5�����a��O�xW����y��MU����D%@X�^=��|k
U8�}������=E��\l�^kXѼDV���RZQ&]��B�F�)hA�813��I��������_�2<��=�m���ޛ�s�S��l�{I4ZKMc{���ʳ�Ü=��b�k��S�_^�*;2_��"��!U���dm˚��4�[D��f�`�X��W�#Q^u��%��G2�c�d�*�����4�G�%|���0G��>X-�q�����:�E4N��y�c���,�Zu����NEG�HM��q�
�������Ic��)�fEGx�t¤��kϙ�)���ݳV�j�Yc.��d���2`:���f�ʑ�$�e}q���Vu7A��0��툓�@/��w��ZAUAL]�T�A��Tl���&�̍�/z���L�Bh�0�1�꫎	�x�ѣ�X�?�+��=���v�;��6P��K!�ia,��k���H��S�IWlX��"Lu�	�vh%���ּ�̴p�램�Z��/�!4��Ѵ>G^+O�]��[ڔʦ���D��wr����&�oyd��1X]���
W3�Eg�͡�)9D�/}'��v�,n�j[�)N�F�LOѵJ�a�<5�B6GwxB�P�t�7���XcRX�O��ޏB�xȩb�R��α���";I=U�~�Qu����>���#aI�J����&6Y�CY�~hV����z���$6x�9ױ�_��]��&�{b�a�m�x�<b�k��K����"��DW��4��kpVsRݯ/�p�?����'''�p��IH�q���\
·M�k@p\X�m!Ya/��G�d/JC
(0K��}2A^w���j�흇����-�+�/���s kJ~I\u,���A��>US��&���ȱ>�R�s��@�v�G�o��(�9�
��3L]J��*�{B��z/���<(���o^��jׄ��>�՜%	�� !a���ǛqQ���i�ܚ�i��^ �JՒg�U��?�pB�n�Qbe�K��^�D��4{#��RG�p/���NS3�6X-���pe����|��=��	L�w�$�@��ȗ���>hc�+|�ҵ�-��No����å.��Vw�>f�:�{�V1������e�ءI�;��h�����N�4z=�L�&�Iޏ�M��
h��N�r���WWx�$�f�1$Jtf�Y��PK;��W
�h��	2setuptools/_vendor/importlib_metadata/_adapters.py�U�n�6}�W�IY[M���"��vh�dQ�!(�4v��H����;�$K�4%�X��r�WZ�ZN)a#�6�H.W���������=V���Bk�
�hiTY���D��Y촅�4��Vos͌�LDQtR�;+�FІ+N��b�nrqI@���{R�f��܇�>��u�D@�K&�� �Qi��૒�Ƞ��ɚ�-p%j�sX�%l�`��p{m�265��)W���Fn+��Q̆I&�t��j!���]�Wɬ��W�SUǵ����?��R�]�_0`���W}�'����}|����c�G�:����ō`n�LuRg�O,�����^��5ߝ���3��-�Ss󊋝�@#�8e���XN^�f����Ł�ߦQ�4��O�]�_�-<"pY�X][�q�;h$\_����g;��%��M�'��c����� �e�R��$�ҝɚ��]�պ��� ���t�'�
��;rgQ,�p�̊�:?��A^��O�J4
n�ޠf�t�$m��`i�h,��i�k�g
uT4E���m{I�`��[�t�
��]�~3���/?�@sg�.2xx�(��
&}S�E��'�����hf=����2�[
C���A��
�&����]f'�9�h�G�`gǗ����w���@��t��?5�&K�.	����0�+C�Hu���t�QO�$G{������3{�C�A�[:�:�!YG'�#��M�1�p�Ms�E�_=,���x?�4$�Mx!��wqW���~X��m�b�~�큌i��L�x��0\�����$��;���Sغhr�]EXp�X��J�k����k:7�6[|i!�_X~��u�<��x�!s��A]���bji�Q_�h4u���2!��/\��莟<�z�m�1���f�hn�)m|��n���1t���7�C���=�!�̄ڄY����$�Ё8�ӓ�{n�E�]#�w��w��G{�N��|�PK;��W�����5setuptools/_vendor/importlib_metadata/_collections.pym�MK�0��C=4�%�x\<�W��R�f��y�$L��~z���
�&3���Kb�X��Q/6�TU�F���}�\��w�<0�'�8��''����j��M��7�U���<X��P�\0 "�y9��`A� ����	��b��|���;HSZ�Җ|������٠�Y}8����=g�����Qc��j��֣�O�z�O�dzёW�,��yF�&w]7ڔr�]��a��cfYL2��W�M	���˗�I�)C�Ī�N�
�;�Zg	݀�Q��<����fq�W�
�K��f�>�'���x����8sYM�����v�z7��$�`��E�D�wiB����R�#F�o^���E�StVT}[�`߶m�PK;��W"b�SC0setuptools/_vendor/importlib_metadata/_compat.pyuU�n�0��+�R�hr @��)rh���B���͚"Y�r�~}�Cz��,����f��q��'2=Z%�Ҹn2�ԵP���~Τ�����0{앺��E�=;Lc��y7�L�>Kg:��z9��p��
�|��9�n�:���
h�٢�8g�<���pU]�qgE��di�*%��5���h�3"#����!Amq	�T�(_&���?)�=��'�q@��	�/�VuDM��Մ����CX#,D�a��N.��T�`ƾ t��"�l�Ѣ�^,r�e�[���aD�f�w>�J.�m�jDjXX���܋���N!딵HwC�4�u��?�c��-��Nv�XP
���M!],��6�ix��3z���5�h�O�SV�;"�}x�;*3�]9��ϜH�a,_XK~�05��b+͑hI"�Ŵ��2�<�eE���97'ӈ�ugڞ��i`�ƽY	��tOm�u��6�;��Yl
X���C=�iV&��e���IQ�"����<����%�*��f�hx@�`\�;���)b#`����L���4n1��4V9���} ��7�I�>�\���i�5c��bS��"��盗��|\��o�n�\ι��~E�p�ǟ^:�Y��h`�yDJ�x%$Ls��
�{���$ㆱ���>��Nl���GYe�{���l���w�܁�BVXQ?�`X�!{��-۞,i���2��y�vO��	/&��Ѵɖ�F���H	z��i�a;�P�V���q��}�~�
'yR�����Q�G���)?�C�?�ۈ�П]]^����u�N�v/�ʲ�qvĂE��3��/AB�vQ&�PK;��W�:oikO3setuptools/_vendor/importlib_metadata/_functools.py�VMo�8��W�!�l�v��(����6s����6S�c[^In���KR�G�l1=4�(��|$%]��z���L�ŮkroL�f��%쬩�EY��t��:]�
�A��4�6Wy�IX,AV۽Um�v��4����]\\���$��vA�׵��ycu�����P^�nd�d/�{Z9��]:s�3�	�wA�Եi�%ȅ~�a_�E�|���ҹ���zE�3]S�u���j-��h���2|Q4�d{��󄯪H����
{W^,�.s�O�
�� ��s�CF�4���`���q����A��-�UU]��@"i�������CA}D�Rě,��4�\��� �f˪����7H,r���ajS���6 �F���
{TM�RJ!�R�j��D@�D(�OlV�g<ovcy�)<���X�-��]"ik(�%8��8*a1Ӌ���P�T�+���+����RT|
}��:�X`�TU�F��L�`���ꤐ����I��|�3��&�_߾�:��E�t_�P���H}����ڗ��4��t *Y<=-�T4{�Ul����?!):oƔ_�Q�|X	;t$;��<��\�|~�P�IMD|ib9K��]VNO�wU��HBJ嚹�#�G��t2�%4����Pe=�0k�VGn�����~�A�m�\�kup�_�܌�#��O&}��P2T�a�v��j�C�&�H�Cu^S7��0�`�Y*qNG����1C�纼����~vS}QGj���	��Z5^�k�7$G"�i�T�Ȣ���M�)MM����N�ֹ��k�G�n���Y�U���Įd+��U_����
��U#���šBV�$�(4/T/��z�s0�r���@i?]���m7��WI<�O�>;���s�_q���%h?���%M��R9�g(��2C�l�
�ds6�1�~�����j1h���I�����R�bwm�
��v�<59jŻ�D��MNH�%|�/��pҳ��������G�E���~��Xh�{�T����L���gZK��mH?aٹ���e$�r߅ų\��*��o��o�
�rKO6��x�vt%ۋ3��9���;#���|<��ˡ�̻��U�ލ�p��j�N����Y&�PK;��W�:���3setuptools/_vendor/importlib_metadata/_itertools.py�UMo�@��+F������Ȓ-�I���js�"����X��������,�1Nd��y���%ӪiQ[�r�����ɜe"7�y^�lK�{�1>�6�e�)b�c�XϿ�ÙtM>Kc�p�,����hP?��'(����7Z*֨A�y\��t��Ύ*��t-�˛�[w�C��X�5,�nO&QBr}�G`���j��8�CaN7���X��{H��{.3n��i��L���P���q�J+di�8�N�p0,�H�j-1O�"n	�$���a�Gj����A�\:s9L=`����3HT%1���V(���nW�+�.��Dm�l�ֿ"X���+��g�h��f��]�x�۰��F��%��uKr(���.�0��ד^,@�Fp��>�k9y9!��~��
ꐔ���c.�I��)x8\�8��S!�Z�eW��RXT�Xe�8'���;��h��6�������)X|�<�Է��	FZI9�'4��ϔ��-���қ̉C�1<&����F&�L�Y+��7���a5b���zK��N���5�54��/�\�}cK|��9�ccp�AHeb}ãm-j�-�Ñc��ȽFa2m}�l�{�v��w��Z�;��'%S�L��9l�	9;�9��j7��}��F����Ig.�:�����~F�_5_��ӽ���K��+���}��pp�\�u��:l���(6J�xN��pO���V�u�PK;��W�����.setuptools/_vendor/importlib_metadata/_meta.py�Sˎ�0��+���? @��K�>�n�K�C'ڕEW���K)/o�Mu�$���p�xn�(kn;0m�^`�Y�f�51*Cg�[�!�SK�<
�>�����7��Wg�eYV���v:)ד�^�C��ϸ��$�C���l���5P��\YN�f�7`���qE�
:���j>��F�5;A��##�. �Op��oO�p�4���{�"�qs17
��II�h홒Ö�4����)(N*�F�����$��FG�&��u�����h{
�s�ڠ�~9B�!���V�<����/ ��m�#/Õ�S`w zj���8�m"����?~�4?�W�4�[��@О����ҖV(���6*�ق�*Kh�3-Z}H"��:XS1<}�׾��Ńr���E�(���ٸ��\���*�9^m�ک_�U�M���l:���?9z�])�s��O��PK;��WkA���J4setuptools/_vendor/importlib_metadata/_py39compat.py�SKk�@��W�vP��\ZC�5M)��B	�Zk�6�]1�U}g%?�(���j��|3��i2��l׶��B�[$�my˖w�Íz��F�OR��Pp�me���1�����fw���/���6�o��u�$vsY0������)�E�#%�xI�G�PX*�R�A�1A�g�Pu��u4���Lv�D�枩]�9���i���A���I�܈r��Ѭ�v86��^`'��㩹9�c4�.D�Lw�96�x�L�#�8���<_=����_l���!�|G���"�S`�p˽,Ή��)J��&4qҤAY� �^�J�92����Y�z�dit�f�'pHD9�1���h!�G���4�Z9���1V��2��!��n���)�z�o����s�_X�R�
� b�)�.~v��?w�������c��냿��X�215E�Ȁ��329��P7�`l-w�����:
�:�%t��F��l����ZM^�PK;��Wx�v.setuptools/_vendor/importlib_metadata/_text.py�UQO�0~�8�C��&m{ak7����Iӄ��M����vh�sv����N���w�?��xU+mA�h�Ԫ�4[62�J	��UhKUd9�K��w�c��*����>�8�3Ε(�������d���{
9�K��p�ȉ�[�`�%{Dw�� ����P\�X[�UU3M��0�%�AI��Lsf����ϔ�|�l6Ӑ[T�
VJ�"J:nS�.��7z�/��Ωcwf����9&�J�,pG?����L-���n<�h��_:�鮰�+Vǻ�N(����թ`�.�[��e�<��v���Fl��Ik�9RTԦ��n����.�^1]Z��S�����w
�r��G��@�"�����r���	,�&^0�@@�J�^H�h�lIuE�N��eP
��l^�0~���cݖ�_����
0B�>}]���@-�0�>��Umek�q(��\/�^&="g$�T��r8c�M�ҞjԾ�ȫs��/��N���=;�I� �;��#�#�ݽhwF���.!˄ͲؠXN�J�=�4�FKp�T��8�ϭ���mH��H��&$j9{�$�	��T�L������+i���rij��H;�b���a��wE��ـ�52��;}��{E-\�����w
����D��*�Ur&4}���)��_;#s˻=ɰ�=!�ú���4��׹�&�7 [;M6HnmQO#�~_��ߘ��k�$�M����\`LK49�i�o���_&}Z��4̺͓�^PK�uW.setuptools/_vendor/importlib_metadata/py.typedPK;��Woq����2setuptools/_vendor/importlib_resources/__init__.py]�A�0E�=Ť41�;��4C�Z�֨��RAV�_��/�,	k���k
���h,��2�3F�l�,���n���n�3��G8�>�1=�f����k���q��Ԣ�����d�br#YU������܁�F�wܜ��	�Ce0b��T�|]+���iꅼB)�{����^,y��Z���`��Òò��b�ٝѦ�J���<o�ڡ�]|PK;��W���'t�3setuptools/_vendor/importlib_resources/_adapters.py�XQ��6~ϯ�����k�+;��p�b{C��ZG2$%w�a�}�d˒�Ks�~Hb��H��(3�V�S�ƒmĖ�C��e�ض�YԴ.T�������mz�W�~�ow��b�pc��-�~U�����v��Z.���=d��|���3(άb�=�{`G��ͣ�w�q8Ep?*�YY
)lYf�z�@���m��÷��8���.R+�鍓H�8.u���;��Z���{ԒuRY��	�X}���m���ށ�Z�����$*�E�,^��p��p�Y?��kuh�[��x#0��󢔸v��������(�fU�f�Wkv�����/��3%j'�6�R�I�v�c �M���B��{��0����~�Z�,H.��oD�N$�V����+�<�����3��Q�ղ��>p���wh��igj�!���0����R�W��e}ژO�Ӎ
�#�#C��]��Q�����}�D/���
�w�.eV@�M�96��E��F߷�9%xh��:��u�ۋ�� ��Z�y�!x���P������]bJ`�+�y0�Ƣ��& �@T`�ey�xjm�8���"�2�\cw��|@%C+L�����b��|�qSR��m��7%T�@a;����]G�`�ǹzN<g��A�{.]x<���ψjP~F2a���ɾ�3���PI�1A8���k�p��$�zxv�$�|�5F�b�M����<��G�*F�l��!<�p�}�>6��>c�S��y�O%Hק9:�1��I�$o(���W��yO{z�9x���/J����r�0C�`�\����s���k�k���3�N��b!����uE�-�vi��
�'Zg?�73
{�F���'��΍ŷ'�����x2Vw~n��U>�W��a���ڗ>�."�հ��������O;�d�V��C���W(!b!�z_��7��[v(Ѹ��,�~����x&��x&0�Y<5�P�7��<#7b��v����������Ò7�1H8��^6j�=7n4�ʕ_�8a��ܸK7_w�K����0^2=a�f��%�������c!O��뤅D=�z�CkN�"��|nH��/��q��Mt�����{T���\�����PK;��Wþ���Q1setuptools/_vendor/importlib_resources/_common.py�XM�۶�W7K��6���A����m���"tiyl�WR����{fH��r�<o,���|�93�9��u��	O���٤�۝�)�ޝ������+�t�o���/��Ѫi|KU�~��kL��;rA�b�쑕a9�Q5�6+�G��[�+Ui��Bo�$���=��ޒޒ[�wN?��z?�tY�#\M;�N�%�X��գޓ��}w���T�;<��������`���b����_egK-G,_/>www��ZW��Qz�mN	�+��2�\*�l%@Jo�	�=����S�=�S�u^��=�[��u
IgO�C{����l��+��,sy��T��	*;Z�)G5�(k��h5;�3���Zr��G�J"���A�֛���t�"�60�Gu&Gjo����� ^��-bh7Y�}ك��BY��\�t��Y�����1}n���`� �����QwBzؾhNoD>N0/�!��{m��F(@L%�l��o��.!�n5S�Z�Osއ��2��m5=Q}��tuj�ح�;TO"�/�����SbjQK/g�$�^�{���#��m(W߽���~�N��2t�vpI7ѹb�+YȗѴ���O�<�#�+�J<0�(��5����S�x�b�@�
�j˒Z�᧾⾩��{0�n����J#����P�\�Ձ@��
�9��h���/ ���1e�v�xY�?Sk�v�~ൂ���#b�������~�<�6m`��w[K���
t=Q�W��S�I�@�����
��d��i��&}�&F�(��eL���S���e�V���Go$���9�ke��u!�HRԈ�a��ua��1�"z�X&��^T���ik<:[u0&�"��y���!�[�
6��@V�x����#�rh�C���	��P���(rٷ���HQ(M̔��ּؕ��nt�?,˒\�ˏ������^׏�a�T��`����1�+�?�ك�����C�����J�Lt�%6��eX+X��W��(N��5�����S�
�[ƽˠ>��6�����3O�؉U�
	V�'���U�O[�Qۓ0��!n��#JB`���zWS��1>L�YTTp"&���,~���]&����C��v������tڄ{V�Qq���1�"�r\`�_�ǣnp\��t�F���v;��~�\ń����󟞯կD-0�|I��(�E1�Қ�ÛKw�Mԁ2ҵ�,�L������e�z�+Y-b蟁	��qH����V���f�b�6���4�-�D,���,��Mm�G�@ȩj(L_Um�
�M�t�@�kg���=H��}��:��%��È���+�כy|��p���3�5���,�}&�C��aڒH��=���[����n�6X��w�l�f�g�
	����=��� s�-��pɘ�h1b$:�RM�@�k�Rn.�1��>C�w_bd�lʭq�q=�Xi+0ʴ����ّ��V�x�������Q��)@;x̤���
Ϝx��@�t��
���h<��F���3h!=K�5	�t�4:�z��b���w�b��+�ܩ�P�JI2I�l�4�P?&�(Q�f��f^�;�$#�j���L�_j��᠟�Vo1�*�!a�l:ӢԤ
-�k�T��pi�P�|U�o�H�r�-��Eאfǣo����K0�*Yߊ�+�SC��vC�dЂ�
�5ǀ\�x �o�R��\�����Y
�����������xX��D�[��x�Fx�(��:9�U)��6ǟ�u>X��(�i����)�Y7�#	�(_�Z�*yw�RZK)f�:�%��JX��\Ki�Q�+�HVu05�����iĸ 4QP.�]rj�J��W�J�!b��VT��^�FW����l�$��{��$k�ޒzm�*��?PK;��Wa.;�m1setuptools/_vendor/importlib_resources/_compat.py�V�o�6~�_q��`�!/��M�
PF��aC ���&L�I%q��IQ�d%M���4ɻ��ݏ9T�������g�8��8��2-�M+{�5w;)�Ye�J�>8��fS�����X�Mg_��*#K�W���X�(��4��������2���7QWBb�_�i��uX���%���3�{Ҍ�|�\�,s�ؓB7�r�E��r�ׄ��C�����?��f�m����Rڋ�h?��1
��p��v���Yp��N�iv��z"�����y����Ɣh?j��V�l6�WN�d8��4�F߉
N*�6��M�-��%�B
wd1`_-nH�8p#�*m`ut;��
�ȍh�� �2P��.�/�h"��#:,�Tn��ޫ R
W�EY-��X����d~�����{r�F㎝�*ACO�}�N�Fl�:�ޢ+L�ޗ���i��n��?-��f�r�S7t���R"�n~���a ��jϋ�(���|R��İ��z���ٚ�|���e�\t���>F۬z�H,,���R��!��,��Bz�����M>����lO<!z>�>�@��Pq�q�Ʌ<�,�/�����������?��m'l�r���!���}�"իd.h�}��ჰ��?�ʟBv4񉛍7h����<{ �'�7?^*C������%���}��⡉~��H�(U��.['m���,�>T;�Դ�9T\�5/��3��ZA(̩��~PST�3{�c��ɮ�M��S��g���u�r�žoS�N��j�3MI��7"�P4�	ְY�yɥױP��1i[�MC��%q����n�t���4V�&�^���X�q� ��ф��
�Ш��YswC�����Ɗ��(O�xzz|ۆ�ƙU,/a�⿠i6��b�~�7/�!��u;�A�҈څ���"�!?=nh6�4�;PK;��W��h�t4setuptools/_vendor/importlib_resources/_itertools.pyuRMk�0��W����������[�K)�m�a�ؙ�v��Ov��YW_b�IO�ɩ��Az���@֍�*�(U	吱*�������StB)�S���:�D��.zm�4Z�.zG�]Vm��\��T����I@�2�E8	+3�XI-�c|=A��U�1��֔b�z���9��:Dݩ�g�Š|�W����M�qӁ|��Ґ��ep�8�py�瑀
k����XthOa�Ɩh��FP�C4b(� ���]��\�Oft��b��߄����a˛M԰�-���Se��^���"��&��,;�i6qQ�1I:��-�
���z�e�S���/��4�s�7����,�/����̔��V�*�!A��)ax�Ɂ���'s�Ml�[�#���
�PK;��W.ev��
1setuptools/_vendor/importlib_resources/_legacy.py�VM��6��WL݃��,=\$mz�C� ݴ�E`��hͮD
$�^'��Iɟ���[�x��qd�i��U�nl"�=>u�m���}���N%ՃM������ŏJj�íC#6
��V��[���~�J���9��k�}���T1XY��m�J���|�s���} �[]�
��s֙O���7%�I�TXC���R8�R�4[$@�Wc��ΈΆ5�ć�]�&���ps��x�?C�?��k�ԓ/l�X��hq��
��Q�G�P�m��T֡����X��a�\g�y���131M[:�X��R�Y���7�кyo)�b����V>���5� �=��@\�
D�$K,&���71��wH�t�:�R�O�,:�d�A���v�k����)mZ��ϸb6���`�d0���J2�L�
Ax��f�lo</A��"�����#��o��
%�UPa��� `����|.��0�A#���!$�C
,��*���{j�m�Pخ�.�����G���/��1ڤ����|���6Z5{ʔ�{�f���	�WRz�u�j��Ia��[@��-`�3_����:|�B�F>RH��t�>V�l�0�q=V�.,c�iT�"tM�-��9;YV��tj6��e��řn��L�ir�1�
U�~�lB�@z-_9�42�,��<��U��
�+qrڻz��4.2���R:Z��~Y�9��^��a�f��	.��<��?I�o���XՎhV!$�J�c4�n��o�/�
Hc��Ss+����?[��,I-�դ-��f<Պ�1�Nn'I��������s��nqqt��W)=t�Ez����/��6�uF�����ZXGc��;��PDӌ�Ix�p���a)kYҞ}��P�J�;�-�@A[Y�!̏󅿖v5�K�5�4�(���>BǶ���_n�|�k`����@}D�N�1�����^��MD�_車q�d��ӕG|����8�#�Rc�L������b���R�9�n(��#�r'�3%`�'�P��8C�7�� Z.���N6P��Vza�~v�\��->�ʊG�t���3z�~��:�Im�Ag��gό��D�+Zr{�0Pi�Mhn[��%�<
�S��'�}��ɶ
��}�_���;I�F�JI��L}�ER����o��c6���w�F��Oo��<�T铉-���	z�r0���ə� �av��B�Ȟ�_aɿPK;��W۴�L-setuptools/_vendor/importlib_resources/abc.py�XM��6��W�BQ��ȦH�=4	RA2%��L$Q%���wf(J���nڢ�氡%r���Jխ6NȼX(�TzX90N�ʆ�t�J勃ѵp�V5w�uӜ�J5Ҝn�%��ʼ�~�I�[�\g�D��%�]�nd���Ҭ�5jM�8UCV���e�7��BW��ݙ�f�Xd���,[�i���L@�`��Xc��ϰ�.?����֊�u
N�-�'�y��o�`s��o�\���Y8�K�K8h#*M��pZ�F߫���B��5۵dd�b,�%���DT|�%?/� tMD�-T�d�x��܈��{���B6,�DT/*��ο�'�9�
��� bw�
�VB�����d<�xJ2�@���n����E4��tu{����M��{�����3o�{C�^��P���B��6
�n)���P5�s���<��y�r[��M�o�qR^�AXdQ`4�wB�U����)��*a�¿��ƪ��#1�԰�!^"|:��2*���sI@�8.������)x��b,�Aa4���&	J���4�e��9�Ļkp�S�RC��Aэ�"�F>�;Ӂ�LJ�+:�b�撁��+3�&�T�@տˆ���oXhC�,[�����??��T�C+�4�S�ط9��鳰��أ����0�������Ύ�u`��M���&4�o
kS"O���7%�����k��<��,�yD1��4%�zN�e�x"kc�fX�ۺ(:#������(;r��C�YB-O�r����9z<��g���������4��U��w ��DNNE�T�Y~r����B���
:$��gf�pi[J�_�L���	�A=*���J/Rµޜ�tX�}QCShb��az�����n���?h��
A�6,~Р'��$	.�UdƤo�ܫBŸ.C��f*����'������J�4��\�)��N��	�c�S-V�ش}��r�ٶ��bD���1�"�QwX?8�I?X�cj7PI��x}RF�J��P�S6I,����B��C�9�$�E�c4��V[�@jRܰߋ�~��~��g
t0���f�,Gf���KZ_J�,p�z"�� Z�wvY$��r;�	:+�mQ���x�-{+*[F4���CZ �S.�)����,
�r�t=nHI��n{�s��i�;� ����0;u�{16�3�3S���dGs�]Aa�_��a6	S��yԉ�p�;w�Ԍ>�7
�?3�\�9,�R�gY_u�QU�Qn,h�Y�0r��|�M����\��+�–���	����7Zm��~.ɜF���"ʡ�%��͋ᮗ��8bMG�+*���R���xaZ�D��#M
a��U&<F�X_�654�.ɶ�D��G
����tJC�����ާ4�`ş��0�������;�O�D�<�G���w[��w�N=MA�����7|wXO�6�M�;�$��!�Q¡���!��:��
��_<�.y�.�t��|�B���t�N��_1��Ĉ������z��<��XfA�&��Q�{�g��Yw�H�����F�]�b���w�?�4�'��G�B43O�B��5RG�i�"E�V	Zv�,�PK�uW/setuptools/_vendor/importlib_resources/py.typedPK;��WUKa�x�
1setuptools/_vendor/importlib_resources/readers.py�Vݏ�4߿��>Ĺ.�g�J �C�hQUx���7�ܺ��v�6T��3�ĉ7�������ƙ���of,��X�*�T^�6r<�?(����+���McM�
6��}�J�zc��/{-롄{�@G�ʴ��~��hk����0�����;%+�qDm]����ǂ�fd�'>�m
ꗲ���!*�\)���
ހ@I�^o� �ĞN��m�9R�RK_�܁jvLR��Ӈ�J{sUP|��r����fF����^O��,�n���7c����l2oXg1�h"��D8\�
i�,/�-�1���Re��8k}ʸ����|v=_B$']N�0b.
V��d�ZS�*M_��?-Z��o����³"�Wu���#
����B�D<{�.۱��,g�G���t�!lu����LKf��tSv����C��{���)�0����γ�`��Zc�pt���A�W�_�^�A�� �}�~��פ�ҭ��^ ��c�% ֠͛�eGD-Q�>=�L���!Q'm�'p��n=��PңS�1�!�#���5�F�h��L�s�a��G�iD�λ�9ː��W^v
�P��'��a_#�Ǝt`%8f��2����hR*h)-����A��ϤF�Aj�
���E(1
����W��K,v	�ם�E�YX+��R�B��uX4�j1�q�9�B�3�=G=����x:;wg��/Օ
2ŧp��Ƹƃ6�U10(G�N{!5��@���}T�L�O��d_�o��>
�SZ���\'��/_J��2vl[��{��@C���c�$����VE����1%<����� ��c,Z���V�=�"Sq�W�BxO�F�:#�d�uT����i��o�$���h�x�5[cz8��Ae����~�+6��oi���a򜗽�%��,�\��U�k����aF9�_��t(��)�3�{b+#5jY���P�帘8����0V�b�-�]tG�?�
p�|�8�f��lhAq+]��d�G���m?�ƈ�v�Y�&�tV���N�2эӑn!R�l�t��m/���f=:x�p�y6�Wq����׼A��eb6Ó�,�R��ȋjK]~��i~��B�������u�Wa��������PK;��W��\
0setuptools/_vendor/importlib_resources/simple.py�VMo�0��W�v��5@��݊P�+�CQ�-'Zmɓ�t���$[��ӏ\"���#�(s�X��, �r�q�H!$)�˪�ZI!��$X�u��ZHM ͺ%~��Z�R��ǚ�i_^3�[��L�$��<H8�9��t9|��J42�*����/�0��W���M��G��b�UM���|���m��9�<��)ֻ��<�v��k���ɐ*-!��{������v4R�,b��B����r�(Ѹn=m
^�,��.Sm0ȕ窒䛬�=+sIyO˔�1�3|��y�j`��U6u1����2���w���Lp�o��d����i!U����O�@�7�w�l���R�y>0�(�2|���oS+t�m�XX�]�Δܲ��J���s�F�4l��KQ������ݤ�Q�%�Q������ﲮ�n��E����[��/u˼=&����N֓63ܷ[l^��4��Ho��l8m�\��=S[TۙL<Ȇ�LL��[(��a�(�u	�<o1��(�͌�zƇ������	��::��r���;���͌F�Y�K�#��4/@�����Ŭ���(٨�om�K)d�����j���D��@t�N�Ԁ��r]�]NT�|0�n1~iKt�*E>����ݚ9��y)N�5�F%rz��`l*d;�S��^���"a	Ӑp�M��a=����ӛ��j�l�)��{�z�1��נ��f�J��Uԩjq���NDFV.�P��F#�
憈���	�jv� )(Ԧ�#���̏ʂTp�X%;P7[���[[���rlA����j�<�I�����n�7l��Q���n�PK;��W%setuptools/_vendor/jaraco/__init__.pyPK;��W
�x 3	$$setuptools/_vendor/jaraco/context.py�Yms۸��_�:H�4S's�N��&�vr�\3������A$��H-)i�{w/i�qӴ����>�d�k�a��I{��E��J�R��{S˅_Y�Meڶ"Fl���E��F����U�~�U#����f�x�.���k�fK�b]�7�t)U�r�����~_�z�̶�w�lX��¬���J��_N� �� e��S�W�0�� /U�i��oW��m�Ȏߜށz�E�䚕�6���jf���b���)�%�g���
���q؍�ٗ�j�Z��=J{U�*����mD�T�4�ߐ�J�w�?ø���)^&MΪ
oւ���
7����Q��gnDC U-x����_�ѿ2�QĦ�lD��]{+ '�`�R�
��s���Y�V���@�\У"W�
-�=��ap�ע�[�.�
%��W���IΒd���������r�48O��t�O��n��]oD]�T/,��u��+�����$�n�Kс[�˳���n��ح�	{ې�@���Z��sm���a�S�����(J�
���]nH�&�׸��xmw�B��B��K��4�s�>l��h�=@C���4�m��m���wxpmBX������L[nҧO��i�)V6�d����gv�7v�_$ ���B�������+�/#MV�]"�K��V6ij��t�,�-ސ��R6+���
eu�&�R>E����5<>�]��j��߯����qM'�$�Dt�֥pc��v3�@�KAT��;4��dcL��ٳU�>[��+u��c�l}�>T�X�/����-O��� �� ���[|�X��9,�]��IU�lAEg�e��vt�<����$��]�4[�V&],d����~L<�|oO	��ː�@L���(��7[fzT�A�`L��J�ضw���R��QBL�?	�m��C��M�`��t���9\K
-�k%��p����6�N��,�sr#NY~��,�A�oNM/Ԕ�Fq'��$�wJ��'E�A�K�ۭ��εS҈9�	Y\�ܛ��v8[�6z|�w��t��b���ɡ�o:��ߩ�zD@7nǓ�B�ڸA矽��h-Q�ye�e��d�_��ŷ��RZ�‥�v�����j)�uJ���]�����#�
�w���H��\�u5b/�;������E��ш����%�W�&�*d��l�J���cP��D/{d�8��q[��&�f�^%��V$�Q�z�R�5}]�Չ&���]2k��8�a�N��Vbl�c6����'���7��9���d��VC�u/
_���H��&g[����V}�����d�1D@(�8���O�#M�0������+��A�n��t��#�D;��Y'qP\xM��{����h犂&��8���z�p��5R��]Pʛ�����t����)n�KX�_s@^9��'�� �?��o�jՃ�b���-��H!��8{� ���1-Ex�/�k�cl�#Άb��47@&":���M��!��n[/����0�;�7��q�
�g��c�
�U`�|��
`a�AD��<բ^�Qږi84ϢA�(��hO�fq��?���V�J���9���Љ�ޮ��]���4x��I�x����șO�P���Y��#��z���a \+���O�?2���?n.#e���F�ͱ-�a'H�G�X6�|����~��Lڔ�)���@&�8��>�)B��q�6|՛M�gI�]�G�"+�?x�a3G�T3����5��� �j�n���	΢�f@/�?�����:\}�(
+2l�	����8�_w��������u�r�e���'�6AI�������R`Y�ps9|�ف�:�x^Y1\��J�˜���v�W�7�#�:��1��x�=����YJBǙ�|vzy�Mo���ą7�`��>_���������%��������(�O��|s�<!z߰�h�ky��k{���˽�����
�����Qu����ˠ�_�'��[q����s���WIrp"�afp��g�ݪ�L�x�޻��T[�\-�zk��
o�o�A��`��l�#�c��=�h�)��YI�Ƙ��M]��/�Ń���|��w�`�<q�υƆ�F<���<���oA�=�N�?>Q��V���0+Gsc�8F��֟���=}[�&Z~6Ȑ�/�t0��@f�b���h���k&�#д���B6Hθ��P�Ν���_X��%�7;�QX5�O7Z�N�Q	E�����j�^��4a����PK;��W ��)/�:&setuptools/_vendor/jaraco/functools.py�;]s�6��(�A����;_)5����<$����<�\4DBc���-%��~��({RW7�X"4�ݍV���M�V]��u]ړ�_��Ƹ�Ee�&k�cV�%<u���o�(Z�`=�*�{�^X�v[�27;�]�7uc�~�ɪ�7�)Y�E��^�&Q7��?usrr��ݨ�{�����Z�]�/ܛ�|��z�+��ܬ�8ߚ�
���'
������T�ګ��,M���*��fH P[+�,`[���}���� -����[��쐼&�Cض���6r���M�F��<M�:K�8��i~��<�ƝɃK����;��£H�n�Μ�SZ @Y��V�k�L��m�ɠ�B�~��Ͳh��n�
lh5ȯ�]7�1J�Y�Z�}�KT�Ek��V����	���y��+nW���{{�Uݨ�U��Lt�����h��*Q�炾~�?����9~|�?~Ow^z�K _i�\G+X���
hBS�����D�y�߮��<Z]D����`�W�yc�.3Q�a�X�E�7�]�y��L�S�7@��C5�;o�v�5(vQ�
����eE-m�iE�`E�V�A�R��|�S�f�\7,cS����cF�g�pZ4�i�$�z���fo�y�E)e������Kݶ��'*�^<f'.9�ڀi��›������du�[�x������r�������֭�Ʋ��ݬ$5N���l�f>�^W�x2
ƫ�:+r�Ӣq�&P��n�҄�*e��5��p�b���m(��{����k��*��E����п��_��(S�ʃ�!:Y ��I�H����J��6��^��[�d�Vve{$7e��<�v�󋉱�c��,�S
vrF�F��\Lq.S&��	��O����|���	˲�U�U��דbE�֖�D$jRg, ��Y
�lL+�H˦��Y����k�xcb1�7SḆI�h����6c��MD�͵�OnzM3RY܏�S�wI����̎��d�8Q�;
��U�P��jk�Zʻ�X�}�C��_�!�7�ݖ�1��P�y0׭F��o�nC�jPXg�X�1�Y��<��t�
�y��׆l�q�,FYdEz��F#A`�Y�Ƃ}2g�Ƭ��%�_��WD�Ͷ�}
�%;F�z3T�]�J ��i�?�"*fZ�����~=� ��\%lG�!pB	F��ۅ:?���vJ�o��s�R�~��˧�& �ѯ߅0	9z�t���g����
Z��Y�v"7@.��,�G�a�/ev�ٶ=0�-�b~��^y�Jй10��a�{�*;�v3)Q��z��E��B��V�Xi@�h-�I8�V�0�ni H�I���9M����/�����~�ȭ��$��$�ǣ��~Ң�߳����JΝ�|����#�1&��=NE끓	q�,��`��yr�B�/�ղL~s6�����g�W���Q�n���joZ>�I�e�dh��N?��9�ٲ��ޣB�5-�_;мiK��;[�f�ւ� pƹ�B"%4*��2��=��hD."gD�����L�5)XhK霡)'f���%hU��Y�,��� _���y�Fa�a�FWm�Y�!
]���W�9%=��v{��]V�fV�N����kLVl�}w��Ӈ��3}�1�{�1;�8sxƇ��XTQj�$t��h��"&����ٶX�fq� �p�s�}��T��O�
�k��E�q|߇�(�	�m�3s��H�tȘ�F/Ӄ��*6�h+'ы��
�1��$���#{bf�i"ԯ��[�?
L)�J�d� �ɺ�S_%�a��`�
t�Y"�b.��s>'��?��:$dpUT&�d~���3��=�S���e��n�T�1ysa*s���?c.���tg����B$�����C�Z��i�N$,��M�2{[����@8�#a�eע!�{��KT�h�GXmt�0����Q(	��q��[$0R����r�g�����78,�hX�$;�+��Y-so���vh~�Í���r�a�0_ah0KS),��,�G�I�N�Y�C�q�`���4H~R�@2]g�-��[-��(݋y��`B��etl�&Lh7��('L�p��N�X�4��Mi��.G�L���9DCQ7�T�#ȋ*6es��T�Ć�%���D�\���T+��;.�c��ý���gF����5BURm Hʵm`h��vĞ�uF�2�x:
s�`3~�5���m�Ajطu��w~j0�U�il6��D9y��'��bڳ�릣B+���̆�i"�lּ�o0C������qf�	T��.rsf�B���ʝ���x( ���&��O�m
weआ�I�u�!�8�z�־UKq�Y���H�F����W��B�*\�r��?��'��<�xE<�����FrC�iY���*����!��Y�U��lq�.��t`n֘�U�P��YW�����Y��(����P|C7t(�"�-dD���\ɇ	�fF7eTZ�L���Ҹzv�٘��.�s�֓ 4+�Ln|Ŗ�0�J	JJc!�X>uG0��k�
��u#ڗx�˹��������Q�9��/<�� �"�=G��6� Ύb=�T���X���a�ч@	�f�(:.9uPч-ۦ��i&Kn�_��z�6/G�cz����7��OQ&&&׀`�d0̓`*�,�N�Z�^�Yց�*��0�uYv��e��S4�ՙ��ȄF��
���pŗ
!�\�~��J,&���,.�G���h��P$Xe�P W���M��b�v�)t]�/�	�b�Cy����o!�0P���Z�
R���yd��^έܹ'�@8H�5ŴX��*LW!0:�8b�2����T��4ALN����|$�3t������9�9%%2;p��XqN��3�+���K�O�O9w�NU���k*O���ٽ6X�L²2�3$�+��z��h���>�C���A���c1(%fC=p��5�kE�1:e�u�΁�R!M
G�?�	�&'([,\�pA�a�+��m'n "�6!Y̖��z"Oq������4Ę��@
<�j�q���Y�'I���N��d�T�+��i�y��d�_w�����I$Ep($�0�V��a��W	7 m[�ftA;���� Ŝ6��јŇ�M�"O�T\��ݥhW���m4��Z��aRVX�TG�ƣ6�q�?(s
�.�j�
�����w��O�/F9!Mҵ�޸�'���f�&}օ��x��q$U��h��S�
�p����U��-��*�ğ�P�`B�Iǡw�����l���\�����	�-�ka�8z���%����Ɯ�ѹ^��P�����D���G���OMU�OPcWz@��s^|�%���L�n~�Z�@�!�;��>�������ɨ�A��{R7E�}Za4!L�ܬO�t�����?a���J��^6{�h?�%�n�˒�wS���v�������"��J�O�E�l��>���� @�n�ni&��H�l�G��S����_+)sS�OۚͶM����:�}bSo��g��XO�-����h)?�csZ�9��-dJ�&01�u�{&��id�Ԡ�h9*E1]��F�(��iR'Mz�Y�\��C�^:����}G��nB��^U��I܎W����T�N/���f�ґ'*��j�|��8X�e~+6,��L���9�/����*�,2����de��0]_�:O a��||S���[��(��S�&��B�RW`1�y��ҕ��uh�	�E-VԌJ�6���~��E#Q�I��?��Ϯ/�jF�"��!�4L�~���

[<ە���ak�s���Ǫ|Xf��=LZ�Sd���A�&��D�"g�ׄ�P։
�B�%��‰���cgE3�+�~��C1�P���{��|����[7�G���6�R3��V��WF���!łA���Pa��EPR�]��`��b�6���yڐb�)<�Ê�E�~[|���2\�{}�v;ہs5M��1V�]X��@s��P�$F�.�Q��^���u�t�௠{�)�:{T5�#�KJa��
����Ǹ?��t.
��h0�y��Gl�u��aW�q�^�'q��.	��DW�8��a|"wz��m!t���Y���r���/�!�sU� �Š�1�]4�	��7�_�M�G��A�!�p��׽��>ޑ;�G��XУ��ǴU��7���i����Q#��oʸ���	c*)��K����M���6,�Թ�nK���?�ќ��7��0F��1q=^�i�U�))7��y<v��cs�<4�?�7֨����PL�%��7��-�c�͂�U���D�h���@�=\g %�Q��j�����Lc�Z?�������_d��w�6�l7�������;��;�ŗ�6��t��Q�-J^&ݘ�>����G��'Xs*�ݶ4�l4;
h�<�G�u�Y3ngz�[S߂�3�`��T烛��b�e��ǁ���o�_聪����3�4z�g���j�9tge��rѷdMe�	���n�2fl?o�Aˆ�	Scc�.;��x�R1c#,�A�H��+O�W_�,��N"r�q4����h�7?�����Y����&�=��)T�qS^
~ � ��$b=���1mXJ��o|�"?]q�տ�6���y�n��a��Se]������i
2�I�n��͎!�Ҕ�����/^h�&���[��š� �e7���xɽF���%��PK;��W]"ʨ�<*setuptools/_vendor/jaraco/text/__init__.py�[mw�6���_�&(�2���s:�8��t��M�9M�=����HHBC�*�Vg��s/�$�i��͙�%�\�7@z��+u��'mUc�4a��[{��M��h��-8���H�ߢ���͗z�6��m�+#�]�x(�v�N�^V5NT���Xq�k�m��9�5�F.��DTu^_��?�(�n��8��J�#�{yt�/��y�v�(y��F��Z�U]d��W�@�"��2������
����mKÓ�,f�R7S�������t�BaWҊ]�b��Eݬ1C5-7���r�q�J��Xp"D�)e���=f붴:�(�fFX����~mU�+Q/�F���Q�^l��G3�*D�(iC�i3��7�G�����$��Nf"��&��Ą?�ߒ��MO
�#N{;H���Zn&��p��0�KO��lJ
=,�����QC2�pl�+�A���X*K�B݂�V�n
դ{���	t�T�!��X<�c�B
r kğ��x!�5����1!teTe���ʫ���)�j%�A�/-�.�{�����x	�PY�����Ⱥ*��Z6Z2���"��n�J�e-n�, �x٩H��ɟyҩkӪ~�`�6�=���d�?��īR]�v���5�x�@l?w�X�f��/����m@��s=�3���ߟ�YnV�>|��L���p��M0ҵZϡ&+�!C2R/WVw#�"������0W=�z��`�Ո��[��[�2��!�]y�6�y��_��;U����Ț�h^��
ۉ%��6��^�4�>��?��7N�;|I��!a�5ƥa��z�,�������x3�5��z�"߀MU
�-���V��=��#g1	s�N�>�9g�kqʻw��޽�.!���8��p�;7a<�`�e�Ͳ�Q�b&�*�����dZ�7��L�3�*|�!-?��Ðԯ	n� �J}�O���f��B��Ij��	_�A\�
�
0��bxҖ�P��h�¨�
i,/��>6�,Ɂ;
��7����	j�M8���,�,K��E�~Җ[c��~oG�~v�K1‘��{�8}D��=ls�C��HWN����<p�8�����!�؋�x����r��! i��t��ߞƧ�s(ex(���*�y���V�5&�GY[�.T�(����tx�|��\����
R
e8=�&+h���kY��ٌ�f�6�OB���7���`�	<:|8-|���e)`b9�����v��qO{�}�4v����_F(��jRp��J6�{��rFb�2;b�.\#�f}�b��y�O�(�jS%�gʈh�̀�A8���gʨ��8rjؠ#p�8�)���mWȞ5@y=1c���(�&2S���M)�:�$Zʳר%�Y7+��f���[����5�#��L����@�*��E�al\V�H�j�6�
�ri�vY��Vt��>���zAH�ޔ�t
B��q!�3�W�+�L�`�l��/�@�jC�S��I�Z!	�Kl]����H
#�6��i%��u�7�]�d���K��B���(P��!��&g$��`�E�L�f]��JeJ�4R����N)�8B Qd��Z岒B�C*~�0R�].E���Cr=���hU�m-R�[����-Q絃N���8�U�9��J:�(jG���xI`e�U7-0rt��Ko�(�1��4%��.ۍ����(
^L�(��@\��p�ZGT�X��&��R�����\���vC�2�E��֤'Q*���r#�І��5�A�Њu]:����yݮ]�{�ͫ����������sM��V{˒"X��[��ׄ��]1ԧ���~j�]��@A%H��ǨZ��3�F5������8�iM�rQ��m}E����2�n�1�B�)�W���S7D���|������x��dsh"�èa>\�����J����fdj��j��[,W��B	�R��z�k��`�K�!t��C����"�t����jF��n�F�^�B9ש�ʡ*o��P��u�	�w����Ge��S�2��{u�n��k,�ml�Y'Fp<X?�Hf��(�J��Z ��zN���k/tN�z�3/ZXgy��Gz�b9k#cF���hP����5%X���\U[�A=�l�G/2�^�e)	v�3Q���E�gc��N$xC�U�d�Ֆ���za����~�4(%{"�F���@�"�)���s��t:�N�߀`�?q�<�U��R�j�E��b:�r�>�)�P�$@�`x�!V�� Zu1�/�����xDŽ�OHf(��6��Ղ���SO�N��A��a:����ݒ��ӀkG�Κ@OF��[��cd�������j���%�
�S^�y	�t�@;��0QJ]��j��#%��7�Ę�VE����E��f�F6����S�f�rg�1R�ɸn6�ÒY���V�̵�V0@�o[�
4[���j׫�n}�7�h�վ^2����t��@�ƀ=��߀�m4{�F/�G����\�-��зT&�G�Qə�[7�9���L���;� ��x��kB���2���M11d���c�q�Яpɕ!�;_y�RTޓ2氧24�(�2����(�R� fe��qx�PU6�o���0�$��*��=��N>,�9�N���򦮶kğUݖ�f.-W�A�|?��0`ށ�1C���w1������g�Mk��{��~�6�	�Ds��iC.7u\�!�h�b��tZH����5Ò>,����/H�:d�[��,�
����*2��[�2��+��z��5
_��`��=�O{��:��XeX�9|�K�1%I$�i�
���g/��Tޞw����a�r-���Lȃ~�Tٗ�=ϼ���08����Uu\���^�[�dz����N�aCV/��a<]�f�I�
��w2�դTt��U���t���8�	D�
�#])Y '3ٮ��s�v�l,�ٺ���s�-1-�#5�������\}u!���t�/����W���t�DMAr�R��3�w&+���ߙy�u!#���:�w@�x�`��f1Iq�s�hF�\$q7�n��r��.��!n�fmXS��,�.��\�d�np���fh�;]�@X9�g���O1(1R����o�Ӂ�b�n�e|��0l�����V�rO;�~�*�_2��9�z��Ʒ�itt��п�s���6���	�nӽ��'�O�����<����c�*�IFG���?���Z���S|������pށ��{��N(�>��.���f�� ���������N���
��>8��W}E�����O/�>�a%���1���t��9	p�o%��y�M���D����W��6֤!���6	�M�B�H�M�n&�]0�!�Md��;0�/��i�7:��t4�%toʛ3|"Y��������+��-[T5��8}�Vv]f�"a���wo��;_�3���7�t L��8Q��Z"{��g�,��T|��3���
��BS�� �.�e�{���.���'�Ǣ��:9>~�]^&�6�]��n�x�=��
V9G^�l�|���Z��n_�3�u�u�jP)��a�㬐HJ}j�>����G���ϐ%&|���g�^�c)�&����S�J������f�|,�Z�ѫ�7!��o��3{��y��r
1��B�J��U�L
5Mpv�1��@64��[�����N�$r6��I�D�C	�'�~�o�s(�
A~���ح?IH���&��
*��
9�������:.@V�,������Y�������$y��+5�v�
׋��g��Y�y'Y���F5�Օ��3A��b���Wā�@Q�\�z�̊����iʸ'r��
K�G�L�,�`��;�a�G{氛���xi�f��d(uZm�H�·N
�g�x�����yFn�/��Q���e��'O?��|��Q0�N�p��9������H�d���eX��Qy@)���n.�
��k?�T̢~Vu/�ST�m�A?u��1���ɐ[�4���"��3/�����-˞���j�VP�D��SG�ei!G3t����=�|b� �yz�(�z�CWA��M협����H�J���"�O��f��)̓�^E�����m�+����D��}Z垔݃ϭ�C����u)�����|!�Ј����-߬T�&W��S�M7���x�A���~�/��m����.зW�����)֣�ż4��r��n��x��'�T�K�u��	��]N�]�SDq l�|���Α}�Qɓ�aYx������NH
�=_��t=�\Vu��X�\į=�$�2�.3/ۧ���)OTɽa4�-��p����S�@9bg§Rpn�}�>~H�	t}�}��a}c6�W�‹�x'�%��/�Y>^|X>/e�>J���M���W'֐�&�Ä_E�1��,�
�膲v�ժ,\l�*��|#��;��lV�S��2����6��zW�]�M���	��'`�e�푏�xY�և��n.)����)��!�C"�v�
:%9�P���Hޣ�������~Dh�:�pF�u4�|c�
WhP)�e�0�;����Щ���4(m�ԛ̳j�����~>v��}��z(����_��s�L��I!�����GF���W!��ݜ|�Y�{��g��0:��D3ʃ��x�>�?_^��7��8��l�X��/�.�܆^	p/� S]��m�V/qy9Ұ������O� 8zM���Qެ����sa���QR�\�"<���W����
ٞ�|�K�2cV���e�߃6Zj?��p���\ǯ���k�_�ۺ򌟛#d�_��^����x�C�2t$q��%���"(`t%Ʃ0M��*|t�1�^m����t���W]��Sw�6*k����������u������PK;��W!Q8�AR-setuptools/_vendor/more_itertools/__init__.pyK+��U���/JU��-�/*Q�RPPV��/L�J��&g�cJs�Ǘ�g����+�*�[�Y��sPK�uW��I!+.setuptools/_vendor/more_itertools/__init__.pyiK+��U���/JU��-�/*Q��J��&g�#�PK;��WP,x�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*��ŊEƅV�bє�ڶ�M�&Oף�ʖ��w[�ۚ_g�'Sp�UW���{�Re�u����r��r��G�I��4/F���@ݺ6�`z�~���*��׹�yU����:_�C�J��I�M��Mz���L���o�벸�j�5�!o��ڌ6�ێ�U
`�0�uY����p�2S��f�0����*-�~ϿF�/������6\��fU
=����U��jov�{����+X�u�5�{����]Vհ�P8���eM��#ܔEٔE��W�"�f����6��:��ZmӼ��ky�-o�Ǭq �o0)��4��dXu���t����ir�\P���9t����e�����[@����׷�}=EJ��,x\Q��z1�-n2[{���
շ�w�Mf{\��b�N�i}����>����y�����Ů��eSB�Z�ȹ�����0�<ڤ��4+���e�ZenS��nrثS�+�Hi_�^�lvM�e��w�j�]����;���0V��5��ٶq����7m�kD^�v�m&G��R��l���I�Ed��hO�(�n��T�`5�zZR����.����uKp�M�٢���n8�&��I�\O�j�;�Gj)��U	�]ID�|1%Z`�����7߷�R���а
���,��������m�ӇS��SX���v�n���:��7��g��`�4wp�Ŷs�%�6%�k����:o�i�^5a�y(���n�b�@��=�@�#��J�������~�-��̾A�;]�\�Ŧ�f���=��uq�I]�߀3�z����믄 ֯�ʡ+e�Z?(W�ڑD��X�F���h��K�0Z:�-21��dA�����}q	�����s�������X�D�r�P�Q�wќ���lpF
?}��s84n��)9Lp9�5��:)W	ch2,�gO�
��x�J�M?�Qr2JNGɳQ�|�||	?[������%7��}�i8���=�����)�����ur
�.YepPB���Q%�:�1W3����<h��W��y� ɦ�.��?zZ��Q��!���TT&��Lvu��		룼H%�ug6�M���ϐ�<�ѱ�U��Y�17���g�w�y��3���v�lF�.���`�g3��<�
x�e�4��
5@+=�
���x���k_�>�4����}0P]���Pբ :W���}�0(�r����/"-�xA�_Γ�]�h���C�g��l1�
Z�4xPn�0�]�#��4�^{�,V�!����e��ˮw[�{��KDu���c���������	9xǣ�ป�q�$ >:������ը�@��Z����/J�W��S��y��Ge���)�;���ڭ<ɒ�r�d%M��B@w����)=j�#X�*����[��nӢ�/�0�y,\u��1N����t�|��O�kd��j�,��;�.��쩦�o�K�A.Ⳓ�rK�IZ'
��/�`��5Z[������:���T0*�"`����M�Q0=Ć��҃�.YYi@���Gn:k~�C#�o��H�?�~�D9�>P?8�R�@�
SPgMР����Ҿ� ���n`�p{[&�M���>�h������,�eu�Q^׻����'�m�l
��Nk�BWj���^�������#�?�;>=����8i'�F���]kr�a�_
f��ys>�)�f��lz����f��ۤ��{���?M�X>�W�v�-�nu>?z��,�ѩ��S��w�F���ޮ���*~�Iwa(x����j�@t}��|�L��tnN(X��r-�T�z?V�q̲�p��+o�uYޤ���PƙK��Y^��O�6pg=�a�3�Z�Y�Ո�� \h�	p�6�o��dKj
x59�q���ɛk�mY���^�Cj�`F���[�a�����8�)�N��X���3���e뿧�!���� �T+�`�r_���
�n�##��#o�'F���:�A��Y�g׻�5��/n���h]�0��9����,��%�sn���u��UM���JyA�ez��.J���Qs�	nT(49�]���E��ۛ����H�l�9�P���$Ǹ.2�M��5Kx<�v��W�$8�St\��1{��-bV�����L��tq���m�X�6���e�f�^(^Z9l�|�]�("��D���vK"�Q2�58��6����yV4%�-�n���f]�.S7�=�i�cw�U��rXH��P.�2�s��C7��zH�a�y{o$��V���F��>�ι�2T�#�Ԗ¿�xL���ն6I'�߬��-_��}A&`:�7�i��֫��ي��i���-���<�k�u��v�bк-�S]x^��va�鵝� v��r�$j��7j�����'j�
�6�^�=I.��&���l&]�A����Xg�f�<�W��ۘ�FF��!ձa5�OPL����k?N�D�i~k�8����<�c۵�)���n�X�	�[r9�xՇq�hR�@�y5�\ϙM��.�]�
��mi6S�;#�'�&[�L^�j"C���@[�j	�QD
�9�m���)��S�)���8���1۲&���B�|@F��_VU�h�j�[Ma}�./w���H��}J��&��J*]����q��>�.rĬBT��=�ƵoE\��/F%!��Z	�w��-�
8�6�G�sj����RG��|�'F�c��L�N%'�/j$ߔ�&]�?���=�o�vN�A�n2D�	�O͌���7@$�H�o�X�Er�mMZ�y{�5���m›�~�#	���k\��shd����
�dw��aK���Ђ�4�3ē
���YU��|�gi�_H�LS�[��8p<^���3�~)2�/@��Tcrn‹2�D����V�|~u
�.��c�}
���ӧ���8��n`��Ѧ%��*g����O�)Ÿ�>���̋f�g1
D�����4F��,�ݎO��/T�CUT�y��KI^��
�y�I�:��'G��A�n�I�qAp�ԤH4�<$$�����~\���9���#�V��wA��@7�0���53f@̪r6G�[�!���
\$��H2M�&�m������>��(J�I�F���#�F������t�2���W_�_������_������+���
�������C�	��٧?��Qr�e[�~�,Ʊ�,tr3фe�m��~��Sa�G�xg��G����ȌeO�M�����3H8[��$�[���
B�dx����E�@*�m���8^?4t��,T�XE4����{7��+7t��n�KX�3����$D?�Q��&F��b�)��t/�Eo��09�Q@�~L��x�{�JeO���|����'��=�^SK��4�Pآ!̞�1���s2{��I0�Ǘh�J-�c}=��d qJ�&X�����Mk`Ҏ�B�N��+3tT�n��JE��
T�.p���F^�m�|G���t��CD@�,)��u�ք���d�;&����nx�_�V��/�	��Ud���ͦ�@wD����#��0�bo���WT)N�,�b��>��Q�/����]Sn���E�
I�{���鳓������T��
����@�o�SE��@�mINl
l=}��v6i����f�P	'�`im�a�M9򫭧d�L��v
��V��{o�qo�6����ƅ�k=�%�p��i��غ�<��\]����ܪ�>����U�R�Ͻ���B�k��*���j��\w�S	�V�-w�x��Bk��� ]��Ur
��|���ɢ����+�(���:J��8��*d��Ƞ`K�Ϟ�}"�ɞ@��~ \�9{r��=��;"wX�LK��c������ir(�����L��H��k���N�暠i",I�t���J<�Q-|��9��1�X\��F+�[<	�?��Ovijwoue�)��-ՙ8���Q�{�k�7�nci�,K�=o���'
��QX�|pr��?��Ԃ=*`��[� 
kηJ�(%Vi~�@�S�,/�,ƍ��Z�ٌ��u�lFH������^~b=�h�|�-Dg�֕ �s�;KN�����tr,�DcpH~
O`����g(��'������epE��`��k.�jZ/k�
�8�5S ��ֵ{�Z��RV���5� ����-�e
�\��4�'~��?:�Y��U�:
�}�jR�w�����p��/cz�Ц�8^7�r;��*��m�/��Df���E�ÈV��ǣ���|�'�J���e�Żׇo�z��)���Y×�Pe�u�yS�;G��Fn�~>d�G�k3&�,�X�'<`�)J��瓞���8��dh%BRt⡢(0@�ӆ
DSl��5�Y�m{G ��:��VAFW��,2i��d���W��I��d���J�B�z��&���s�Sً��R���"��h���8��c��`�� �[J��L�D�E�!�n�#xuR�]��;�!��,����ï���o�=}�^����W�~3���_}�؉å���q3>C�ču�T��}��W���<�eT�����[n�7�LPo��_3k7P��(/��&_�ޮ��b���(T5�>��>:}�^��}���[&�_�ρN�
ʈ7���,V�_��g`[♰�����-�C���ۈ��/��x㢧ߔ��6h����@�HIh��5�(�wDl3�2��+�w�t��GM��iTW3::�|A0l�N?���E�F1DS�(ȶ7>����3-�Z_:Φ,�:7v��6��޷�t�f���>�&^�Y;�k�r����j�H��yB�M�(�Ϥ��
��_�_G���m�Z��7F�]�����i)8�{�0La�]�T��D}.;T|�0�[,��&�4���E�J����X�֏��w���"�>��"�ߗ��
����.��ↇ������%_DI��-�,����*�y}�O��������~LL=�y��v��l�]3��;4g2��l��y������҇aZ�.G8v���[z�5WM����ngv I�_�����t�d��MO�����/���������lҵk��5����b��FWJa	
ޘ�C�����3�P�1~d77r�sx|$NY�E�q����B:�q���7���Aw��h��@�O�	��)^���
��͙5���7�G���V44���N���[�MN�b7��6#�W�oU
 em?	��hi{X�c��㚏ӗ�e�7��H�^xOɝ�GT���	��2f �X�`ܢh�~��`NJ�������Sn���don]毭)�?�s��mr�3.K�3��mP�m�
����{�����t���KiG��'o/ſш���,h��p>��z��W���p��^G����!>
ːv�˜6%�3��%m.rvyqv�^#�=�)���r�t^�6��e\,_���K~@��%;�:IA%�2�������
7�5���Ugn��͟b9�
%y�+^{�&���L��V����������E!~@��!|S��3Z0q�1�� 3uD��1��z��6�w��&��7��CX:��G|@ŧo��ߕ�T�מ��9��Z��>��ը�C)��4�ބ�
fą�[
��M�J1�F�9��;P�q�:�00
0�:����8���Ȗ?7�FQ�u��,�n��]�&�@_�L�ܡ��\�XY�p�5v��R?�ԃ��sn�퇫�m�����Ln�q���kw���Oe~/�a?��0%��M%����,���Y�9Kp��� O�{n��MG����~e���E[��F��1�*�?mY�3�ƭ��X��/��b:{�Im������`��
�r�E��g#u�EwJ{��ʕ�X
Ye.!�0&�$�r�.�Z��r��FG�B�̀Q�˂�h�BG����(��Dx�DxCEN��S�������X�09	���\����NVm���%Z$R�]�&3��q��+0U'��p�
��^�%��	��n
��l�_'�v} 
�><�4�eB����2�l{G���[��0�8�CMc����Fc�����^6���`a؂���Uu�%r[Zw8��@�l;6LK�n�n5�����~he�U\Y�g=g���B��DU����6�dS��#�Y0]|@�(�m�.n�+4������b��<\r8ݔ����j:�7����B6|xB?g�<���=����V��C��
p�$˓�͝]�hI�Xe��l;���]u䭍���x�å"C�Ƭ8"��y��u].r�0��r.���N���+n��"h����=��,��;��uM�ʊ�4�5�lup(L�w���/z��yZ(Ԣ3�D�NE�q��K��p�	�L�]�����8ӐKJ��Y���zG&�t��5����OG	�,wU�ԛ�'��Y�Vg���/-2,�n��Nq����|�O��uZ_��?H�e���>��dz��݅���
����S�1�w���I�}�}H�,V���6��Е����ۅ�����W�|�H9 __ZO�F57��!1��\ZC
�����b $VZT�h���g/��� �[ ��|��؟�v�5"S0��FPؑ�X�S_[J�Uu��O��<���Ҕ��h�4d�ymD�Z뎐��P����
���*!$P�r��5�KZd�r�);�m%�A�Cl,���!�S4�W\%��^p��h�ObCӐ��5�\$0ĉ̉d{��EC�.c^��e�ڽ�9᝜F��KmK�+��\s�����41'��B�2&���g����ؗ���I^�?I�,_��9���6������s˽F�^-
�SG|�&���2�ˉq�|4��b�&�Z�r7Ho�d�$�눃+*�~�nɑ�@�m�_��a�+�+wѾ,��f��o:Z�n�����iw{�нp�nx�����!"ߩ4.�#���~ytvD�]�Ȉ�'�
Q�&��+�G�	��E�7~[�`�T �@��CeZO�.z<pK>u�##�
�]҃J�T��ʌ��S�eq�)X30>��أ�
�Ķ	����x���g�>R���ycCM<����a�N/��T0��Xt,6=
Tۼ��3�0d�*=���JЍ�Y&�1Q�T'#]�=��W��rG�,�Ǡ��<A�ЇIq��N#"c6�xS9�*DA}^�s.1�8ϲ������<L�LÎ�4���ژ�GH=�Ϸ�6d6�$�)����v�o<�
��oɵH�[��$By���@j�Ԅ��.�RA�Kkm��0'=�y1��g�C}ڌ������l��=�lS�v+:�~�
�
�m'�m��J�uN]��+�2z&��C�ct�Ut��FI��V�%d�B1~���ʪV&#�5s�H����։��̱�J_#�ח�@���״i�c�?�v.�G��������,aøbM<�3aO��u�^*�D�O�x�����w��5��}��5��?
��U�)9�{9+��K�%��ʡ+��8[�t�d�5�{���ڿK,h����<��ҩ�W�%n�\!�g	�/y��_��k.�s;K��*���n
,c���_�"Yp�����J�WX����T#����'���R,fwd�\�S`/9>bٍ
�2��6ʙw��������=i��D�to�F����w�l���6k=4�C8^���M�5�A�_�M��V�b+��9�:��Յ
uj����D��dr��	RM/)������2!B���5�+������Y�G��u����7�tBǓ}��Q��Q���h,z�����P��๋�ds���6�a�c�yr	�Sr���zn�.�m��?/��}�
D,ù��qAm)�gশ
T{�s'��Rx�B�Ke����y�w�G<�G��rT���9{Ԓ-�u���q�6@��,�QF���Z�7�yC]'���&xZJ�F��4ln��i�E=�n�
Ru��Y�M�/�G��-*�(��l���ng9�2[2�{��I�G�QeYö>�p���v�`���6��4�Z*<=�
���K&Hш&��~/5�h�V��E�mY0;���u~P�-��,�.�	�%`��Ы��ꜛxz]}��Y$n	C�\[�q$�u�r3^
[�ҿ��#!�λɂ���A�{�D���2�URa<�Y�����M~�1!v]1@��v��o�N4*�?9⫴�)�tf_21ҙ)�Q" ��1r������)l���1�nM� -è�	��}j�w�[�b��;�b�Ĕ���QFj9�O@�rn��n9s/�/�Е`3B}�P���zW��"ʦ�f$ �������/���w�Y��N�p6�.�A	fLf��AkNv�{&FCeO�c��M/Ҵͷ��.��^�{��6�Ge�ė2T�}��K9�v^�}=��A��{�cO�]�T��%]|4ϝSB�>�.��xQ¸#N��7����zb�5DJ��D?��d+V1����ˤ��L�;P�ξ����M�����i�N�bu�,,��D��2����.6��(�a������
g�	Gt_�g��,BL����ۋa�#��AU=D�Xc9p�؁����z�r�)�EAg
�&�a#P��U9ϋ{�ɤ�L<�9eQd�1�h�Pcd=�yII���G=μ�D�<]�F)���%ӚY8�\�9��p������#>����h��pF���K�����8�a�#���EV�̨����#�A`sn��6��!FM�3B���{��V{sA�^��ƚ��A�D��ܶ)Tzp������Y!�1���=�(�I���"��ZT��Q"��m6��'�+�yAQ�8`"Nzde_C�*�"��"?��-�X�0�T���o�&�ahh�5�"uE:P�hߌ�Q���aQ�DyL�EVQH*z�!����T�~a��'���2�/wJ:�xt�x�4fw„���8��h�4f�F�ݦ�~Q.M�5����e[�nf�JJ�£x!�BCS�-�;�"l~�d���łv_��lY�PTU��#��=⭦�2ã`�\˦�yL����S�����λ�#t��QqY<V�<�sxtlo_.����q���t�B�9Z�����䯊w�M���!*|�Y��-“>
2��3��Ԝa{&���UK(�Yc�ԝ�lkd�����-�8���ב�9�6/�ʩ��<I�Gs�0�%E�H׶��u�zP�<r�N�;���ֳ��OX��t
�dL���k$Ȟ��L-���B�zʫ+��p�G�3r�ɪa�T5��v����%<�83)�b�t����Ѝכ���R
V���
��^�W�F��s�
����jW��D��>[d0�e�˯�a���mEZ�1[�t�9��q��D�RBk��i��
n��#Ҽ�B�u;J�?/j�̕7��.9#v_�	��I��3�k�o�j�� �y|f9IT)��9mpl��Ҧj'&�oF�L;A�?�wS�9��W~i�d��)����/^ߋ���w���O+`|p�wt���$ߵ����Z/�������`�t���N�ѕ8�wv�	��A��m�%����H[��D���#b�#P���'� #�R�7Ѿs��RN�N�n���˩���r<߯D��A�_�0��[�/R�9����~xAP���5�y}h�_\��	q��}p&|�~h>��n����A������k�u�ٖ�Ff���<�%\Imd���+�fY���,h���t�M��Pt�,S� x*�8 C0}T��h����k�s7-���Ll��+z��P������9:�c��i�mS�'V���~A��l2?/3��n����c#eѧ�Pd�C�P���6�f>$�^��0Ӗ��xI��n����N����_ƻ0�\���,)��&'�9�u���/NHǢ������MB����C^��,9#�J���1̑������w-�ɀ�i�E̕��Y*L9隱��ȉ9��oA�U�H��b��-[�PB�2��m$\����A�Mk#�!�-.�;Pjb��J0p��t(#�u�[9N�K�s<����ٜ��Z��B]�zR�^�u�d']U�_X�uD�����^<��6����nޚT
���\�Vˆ7��-�m<mCq��*�!�ؽ�e
�o���m�0�>K�q^Kp\��E$.X%J(��߲��2)}u�{�q5�^�EЪ,��gn�yؔ����3����G��	�AD��0u5��}�p�i�i_��hR�f"����4�l�Is[��ٸ��T3�0h��#�8&�Q����P�~
X�?'%8h����[lԟ�D7��%e8��z����!�t�oT�ns��<JsKW�����&��M*��b@�3EQ��5F{�	#��
B��$/lh䯣Q�%7[�㈩�.��.�)^�1ߔ�'UvƟ�r��m��KT�#l�N�|jl8i���%��ֿH��I�*]^��=-�ɟ��<8{[Qg�1m�t�n(a7�?U�"D��x����24>,dr������)e����*#W��;�a,�m��b��M���]�eC҈�M�Fo�-�Tc�"�b�g������\�G�dH-�y�bWѬxjd��'��ѳ����|���K��=���ֻ
�h�K�(mT�\��=/$�O&��]L��GN�=���ЬB[��XĞ۰����p'0��#p�\�*���3�Vӌ93�	����u��jQ�,��5�*���d�U��ĕBfI8m]�L�^����Ȋe��֘��L*�Q��Ahy��q�G��>}6:4Q<����]61
�@��7�h���B�GϪ<S�Z��39�r�]��B|��,�!���4C����i4Ҋ8 �4�`nQ�w��"(B��r�WY
ǣ"�:��M��lE���ݏ~�1�Ⱥ�;�מx��a읈 N·n�bZ���6�9�͏����lWp(&an5����q&"	�.��L�@���*-xy���[����:H�5��F�C����KèI���R'���u�`q�*�'�A�B�\�j^�#@�{�T�[Y�U�LA]�z��6F
%�|8�<�fF��t�$Gi(�Z

�M)��k�&�0�Xl��!�C��V���=z~2'������9��� ��Eu=�9Z�#�Qht��(>.j�E���|�1?��F��N��ڍ�34Z��c�Oqα�\�A�ׄ�qy�ƱT���Ȧ.�m<��Z��f�NQ��v�h~�����?Ȓ�L�Q���0��_�U�,z&�� ؅����"g�o�v�|�2�!�	�^D7O� P.��$�3�Ny��<M���`&�f	0��D�߶q���I����TP���hb��T9���P�¾W�e!�ρw�>�ZK,F1�/'87��0�-��#4iŧU�q�2�H���ǝ�#�ȁ�Gpp-xl����7�|�צE�p�lh+ʑ��r����(��IJ`�%nM���O��}C��wO�` id���;n�)?WB���Uc�EA�|��f�4>G�qo2L��~Gtf�%B�	�.�י��1[/�՝�kE?�,k8�W˰��7��8�Ô�a�MM��Q &�4����1�T�մ>�Ѱ����ӽ��U�5�y��%RG�CƱ����/0��e�(����3?��0lf���2���Q��I��^���
�$@�%Ro(ӊ�3�0֏�ƠUIy� �2g��	��,d�%NU���DB
�Ћ�ĺM��:�>�� mm�[�/>�����-YZb�������}��ʔ�L�7�gu�Q�*N�Q1.��J��~l�Z�|���e�Z3pG�b��R�RXU���꾔Hw"��Wu���9")��BOh��cO+z��N�Vs2�����z�ƹ�M;+�_U�WowǑb#.^�?�Z��ʐR�s��	��D�Yf�S���p���m�MO]�M>
k�e
dW��6��F1�e�LrS�\9Y�����/���{�WВ�S�2��wd2���|Dz��0��,�5"^:R�ͼ�t�ϥ��a���X�K˫F����_�0@$� ӳ��z��f�c�����{����l�U�ݛ��(3��$^Ȗ��tbC����݉��[/���aK#���^�����Lsz{�}��<|,������Ƙ�VF��,��˶-��-v�:�3.�D������ˏU�ڴ�;t=�/�[b�{XJ�N��Y�ڡ�:����y�i'�����]�nx�joT���<�L���_l0�~~�b�	��)��d��t�p򳯮:r��6�y-#�^��5��H�,m��`.�02��l;��˹B� ��ڢ� wGc�>DI�N��/��ɝ��x�]�����6%9`^�eBeF�CH�1�w�H�"��}b��-W���d%�o%��
�4^|�k#l�Ħ���u�d�h)�/,�>�Z,����r�Y*J�I����
�$zǓ�S�5J�_z>/?���q���)��'l�L�O�l�o��E�ph�ټn3�1���=<�U�a�w��[���o����E��6�3�n�|�"�RtIMR2�X�W��k�Jz���7�X(`���F*�+��	�t�?b�\ ��6t~o�_ĵ�mV$��ڰGd��v��Ƙ��!���ij�K[����8�7��6u����f��k�q�Q�5��&�t���\+����&.���EJ=n޶�n�.t��u7�854Q�&����8�0�Q�ѵ#��f}�NJ�o34=%2%���rL�z/�i(��8y�^	pA�
�_�iq��4� ��zL�������"����X_gYC�Ag�b��UQ#�em3��(?�J	pTS,%q�ҎQ���z�m���� ���&��lv<�P.��c$�g�N�$�"���d�$Љ��ťm��M-��x驺�[@apt[L��ZW�BR����D
�X5�&L0
.e��.o�&`ͫ�&+���	}�%�	ѢfpL����"D2R�c�ҕ�4���k�Sa�B�
e
��	��$�I�H6��=M��C�a"���R�d!D�$ 4}|
.�|k�RF�潧�J��)�<�����MM4�4�۳~4���4\_���)"��c<Da��ɡ23�M@K4h��p�&���{Ʈ��:��1�ݐ���3����z�D�b�g��fnŚ�������{}Ea��C��y�J���S�cJ�!�\�6\���5@�	Ֆ���n�Xn���q5;g�����(�"b����|�#���3l�J;�̂'��{M���5��#��W
 ��s;�ѷ
�ucf�8�ْLU�3,��O.\˗���0X���t[?$ (��Z�yT�"�sn3��u2����#��r��ۍ��R[\����g���{f�8E ��������.���\�c���4�E��q�Z]��k�D���i}Q[r
�T��������ÍF��im�Gy�Hi�Z�*��t�\�݀12���(/��yO��৖�zj	����	V�}˕:{��Ft��CԤLK"Ю�����gO��l��hN��X{r��Ag�m��~L9�F��!6��㦥��&�M��ݡYB̡��6�(���>��NB�edߊ�����E�7�;�˺�x�9s6���+!n)��� s�m[�%*��"`���<.�o�l4��J��EN���"1�x��F�8�r����I���[[�-K+����hp9��`��X正)�X<�0[�p�p�Ri����d��2tq!0�t���Zdpn�=If�5d�$���4�l�r�ULn�C�Q�u�~�x��b{b��Ty:;�Y#b2�m�����2y�6��66�P��jE^���ÏS�a>F�I��b���X�ˢ��if"��tS�F���ę��'��GM�h�ɬ����j�:?R�ج�`�;���"5w�ԅf��Q]�{���t�e�t,��巒�U<��ױ�-r�"m�l�+Cq�Ң	���I�dP/3�"Idc���[�0���u~,<���LN�n�Nv�se�-��Y�=�Ԓ��ri3�=�!sN>Nш�){��o2j��d��9US��ϓ��0�#';O�
�'Mq��yEa���3l�20"�������v���;Б���.,�(H��1/.�`n\t(	�M'
���NA�d�n
.�@�<&̠�[#^������U�q�E�9�|F4�9Vz��@�qQ\�\<�ު,#�	�R`q�ƉFc�zIV����m���q�,
���-e��`B��|~��֙Ii��HyO��,�(����|�����-�-q'o�壖k� �
����[.PIt)����G������X��A�P_���w��5� ��f/��a_l����
�=�d��E�� �~u����H�BDy��6�4y�6E{�>z��Y�wlG�����r(��a�?��6gb̜-���&x��L��e��m���̰�UҐjc�Ā��
ܜ��^�"<�)98��\b�97��m�/����ʭk�� �i����g���D���7�;R1�w�!}!=u_��¾.�����5vsI%�'�l�8:sa���7�eB�]��ݗ��~PP�u�	��a���4JyF���]�K��*�X5[��~6�pAPûDj���\^��<`*�\���6e���
5c�Dbe�J1xU�,�$�T-8$�Q�W
�]N.�r�@e)�%sQ�P����sVE!n�
ޠ-�;�� U�c��n��i�X�e�ldC�9���2�U��m��YF���L���C���[�9�t�^��@#9Y�>�b^��U�t.�o%v�)�X�}7��ZW�csE��~�$��qG�ˎ��ޗ���ܻ�+)s�RcD�մ7����^�6�T5���F�e�D��y	�HuO��Ae��Fqv��h!���]LEh�o�
,�}��N1�@��x�%ĕ>g���pp	���c`+4�k6���1L�R�s>	R�݂�z'P�ù[[�W�=;ŰE�Q�ቊ��k���"��OB��5�LOxuEC��f�Ͽ������/^�������9Kn��Җ��v�ޝ%��迯˹1��WgI�7~[�_��N��Ri|�!�{/I坲���9�7�b������~���I7�rN�2����7J�k�Y��؋�Ѧ��0"�G�C�](��Zc
�L�5�c�M��ղ$�;�6߈��07�.�1�p����#Z�4D��cüZ"��j!{D<C��ۺ�g�H��G,c�'�@��Y@U���ܿ(�G��վ(�	J]��'��:�4I�7#��,��GWHI�3%�c׏�����X���1'��{Q+fta�YU�wl�'�P��J�d�[����,�0
;�r�ibw�a~�}�>8�̈��s ��#�D�(��*�i�=�-Vz��� ��T�"\(ir�$ڒ{�ZGj�-�b7�,�)󽀟��"�I�������
�A�9�f��nڎ�#�Yg�e�� ��f��vebx��,�C��
Aᓴj�-$�B�� �2-�Lf3V�KE��3���
�B\a��K��ӱ%b��?N��t||��^�ڞ��c��ҁ��>b�n	]m�gJ����!���NƓ�HNĺ���V������0��FO���𷆧Ls$p��O�mTӽ�rd8��f<�l�u�$��l�X�/�A��%��m�z�q��I���sS�5uM�U>�F{xe�����ʈZ�k�7=��ߧ�{2�S�N^��?gU9
S��s�:2N�A��eb
1%f�q�<`;�0x&�?����I{��n��3�T��l2Î�V�RR�Q�/�6�7����uj�^1�f��j�0h��V(k3Գ\�&�dc��Ɣ�[���tc��"w�z�F�c���Զ3��
Q�m
�r<��Y�(M�S�4��y�x����?�̒�f���d��a?=��}�"��7�qbڰ�}��������/�Z�!kb��(µ9�B�r2�S�X���Czc_`N'zײ��szz��b=��y��QU�<tiZ pr���J�Ê��Y�F�jm�XK��>��F�5xబ�
�#~�o�e���D<l'�3���[����M.�8C���2:r���Աz��d�.f���Ӫ�8W5c�����P�S���a��xn�[����_�~��iqWz[E���}g0��`
̳�M�7���ֶ]󅮩f�R-��K�CT�A�;���0;M�T�ߩ�_;�w�t�Q��Q�8h���F�?R�I�	N5L��,4�3��ֵ������t�(��Ẍ́��I�G�r숤
r�!�T�(DtU;��j ��{#-����K4i�w��Z+�������(���qP>��*��h�>��R����d�j��Z-���"aq�&���x������
�
�O��5NC:{�Ѧ �n
c��*f���O����ø����b	��l0��m԰6@��xaJ�X�m#'"��/5T�M��
:`Sn۠�gͥ�n�A{M�A�
l|/TT��+�$��q�3�*>��g�ՙEx�_��p.��U����n<��k�tepx�#���Dw7�
�4� X�A����
w��p�j�ʱ���C���K�Ys���:.o'�$���⃶p�s���]m��B���
Q�U��ޣX���}ޢ�{���{�
HOG�����M5���{*�n>�Q��R�ċ䘏lf���`Q�v�͓��|���y�p���i/$)�P0]�O�p�RaT	7_X�މ2M%��^1�淑�غM�;�OQ�u�k�3�v�G8����#��{��ۇ<	W2!��-;׈�I^}���*�W	7�Qt�TCf�ɼ!��h
�@�dI�Jр��{��>�_�
�5�[���auTp��Gf��>�k_yH�o��$��4�W~�Y�em���Wk�m�3/v� ��=�dȃ�E;�L���mn�&��=l)�y�����I�Ba(KN^��h9��E�0�ؽ1]�/�^�b��O���]i/�Ъ�3���n�
O
5^�-4�Yg(���$�@7l�e�p�*eA)I	\���8�OKV`Uz�����t�x�Ŀ�Ix���V%��~�ܪ�_�o��c&8Ӄ��X�8���}1>��7h$�|��W�/�LL���~.v�ANvh+��Xya`�)&���ys���#����d6��lH�ۚ"���Y��X�W=6�cP���2?��|�]����lm�.K2�!Sem���b��ZK�T���KB���+���I\b�(���#K�Y���ǨÏޗe	EIJk4eC����Z�8�pi:��D9!W�_0�H�4T���[Z�kh��6V41�,O�C��`�����;^����`�t�������[�T�m�~ �I�����կ����FTp1}r������l�u��Ψ�����ٞ�=ƃ���!�.�E�⧮��� yRB[J��Y������V`�k��}�mz��űR�2��u�L���`�
_���
d��#6ⷀ���'%�|��C�7�@�fta`��NIX�����X��)Tf�l;[m<��Du��H�lݞ[���)vJQv�#�/�&T.���7��r8>�?�I�HK�`��X�e�Ӫq�4��s̯�H9q&Z��`[3�a�YH���3��O���8��Z�bm����O�c���Ma3*�|]�*���O��*�ce��LƟ�>JN�ux�H��]��������c�Թ�1jE�.-��J��8�~U߻���[��j�;=������8�)���w~W���|�(G�%�[�y����X��'{��\�����Z���6�%Q�O[��$�Y��k�̮�†�!�=�8�5�!7A�t�����o��Mx$�����?��=��_~�Z�"Εq�N�������&W宖h@�65՘{����/�̪�{�%��
=���ny:,�rK2�0E��}n���A�L�� 4���^$��U!�C�:�q�!,��˜�?���?>���p�M+��~ٵ��g+3����Xw/��t~?�i�Fҏ��w6����T�GV��?�YY�?7n?�>>��hll��8���1=W��y�2[�;��uL�\k�U��5TvC�Ok��̝�#����:�Č��ѫ�=CSZ�#=�QTp��2�~ �(s��]<3��[����V@���ޚ���Jn�e�ɋ|��Q�jA3S��m�09R7>ҝА��٨�ɅG�i����0�} �<����S��?���		j�#s �W
�N�|��m��%L~Ѭ�=
���8&�L|.&�g'�_$��f�/z�1?���g�1}~�S�G�1quh�veo�wd�Y�^l���2��l��f���]퍄��7k̕H[�����B����y��G�L}��6X�>�(������[���j��s�^ix`=�5*�62j��;��Y��6u>c���-M�"*���O���x���\�;�/'�~g5Ҷ[3�c�P{fPr����3�F�r9(�7�Wg:)!���a��u�DYK_G�c��Mz�Ί�#1O�U�!A>�rq4��8��r�4��'�_.%�h5�t[�9�Y�dNt�o��0
���r���U�m��Z��l$O�y/�Z��\�+¡�g��i"���Z6��MiϒNNZ�6�vo1�r8�U��k����g�2�	uHR�B�!�-F2K��~��؆B,~�|Gf�Θ��k��F�{7v`l	��e��(X�C�~d�sbȑ�.�˰^S�v��7B	���'5�#�Ep�e��ސ�So@�ފ�%02�&���_.�~4�nӿ�R���=��i����	�t���d�rK[f��5@e*���O�^��b����MAk���4�M|2�b���4�$���B��Z�V�V�2��$��1&�kВ$cb��3N�E��[<Z�eڦ����5+�ڤ<z
���U�Pb��d��9@�^���-�:y��"?{{��xy �lo�-�Չ�Bu�ų����}����t�uQӕٺƯ��6�p�<�<����\���ݬ�H�Q�o��=�0:�?�?�M ���$ԥQ�@F!Ak��"��� ��iFo^&A��3mŽkǯi+M ����E7��:jo2����_�1�O]�9
� @�P,������-�0�o��C�b�CI����,����Y���-GY礠����1�kmOL����ʦ\�xǿ�����=�;'�4)SՕ�$�
�U;�o�� ���k.Lg`d�F��A�"��f�X��U��Hӎ����'��0�̽�n8\�$g��F{�`L|YwT$���/:x0&��'r��K���;܈S�,���`��J������٦
��:���\z���I��l^�4�������.Z2�+{u�L4]zVZ�0����;�.oh��Q9�mp�Ε��c��('�1���Ѳ5�b�ؗPaGj*/�-X$7oU�)�k��!��'j� ՋgF��ev�l*
��r��m`e7�8�%���-��)�-~��1q�YfZ/�|J1�<��k�X���(�~,#��acc�{-��K�\�}�C.���=ʽ_k,����F`�td.ì�}I��@�s
[c��kC���*��$^�	�c۸�M��Bü����S3VI�.�״f�b�f�h4hz1ð��(}6L��;�9�
�$�a��݇�3��p�[�J:}��+u�榪��/k�{i����[p�F��͌��yf��l+N�\%Ej�k��E���ۑ����_��	"�r�?pr…6`��n>J02H��f?0�k�ƚhV$w椋�n�[Ü�7pGK?9�)@a�"���i��Qe��^ø��vZZ7�.u%��5ٳK�}�ߝRV��o�DX���kZl9r]�&ћ�$x��٬�	�‡��އ�5��Ȓ9'S^�s�(�r�|>J^��/F�g��^�3
/^�;���|���T<�B^��+4�)�=;Y�?�O�'��:	e/�"ܲ�Q��G�A���D��~:��l�!n�[�s6�z;���p}�	b�:��r�7�e�a0���sg_��4?�D����
5]J�W'���lgC����6�4��/u�^f��a�(�+3����vt�E��b`n�8.Er�N�n.Z��g�}��rwQ�5UlD6�8��? �F~F}��t'."q�ږ���j�G���1lg�}?��&�le�M��'M��E��v|�]O�E�]k���
 �����}�&ye"1�Ì�����O��$�O9�!��=Z���h�� ��ٽ��5	�=�m�ծmv)�5)B1J��O$3T�t��2�ky��5e�m4D�	$j��)E{D�)�}Қ��%��#�ώ�E"� �Y����E'/I�1�kJ�g���Y����o����lB�\�7����F2�ї�Ҟ�O����.����`�ZR�+��;�Ase$b�e�>�V��m��_P��C=��c��~�o����k��_6V�2%�2�ڀ�#���(�������*�W�Rp��8b�<]�ܦՒ�^�w��S;�4�HB����j�b�u#kT<J�!/�X��W(M��)f��kPI�9��1K�S���ҋ���L�b��橞��6G�?��f�7`G#�~�d�&E�ق}�xŭ��A�޿�Va��"��F���P��1
y���&�ad�	m�N\�x�Jv/���XYFT�1n���fI���ξG�"��Û���I���i��%Sz��^����i��^�$)e�D}�p렿,��@:��5�MNN���
���u��	�Ա�z-PR�r�9�Q�'ձ<0�6)7���5�MK�~�$��p�<�=��f
_���Z~xMF�-��ǟ|��fi0`?�9��L�>��O@��TA�p[���x/��*�=��m.
�#�0�?#N+�O��,&�Π�0�I�kJLT@�M߇"LZ�7�2+�B����Տz�4J+߷m�7
e漆u�6�������3�JK�W�w�)��(�c�g��*�q�Î�Oٞ�<)��U��{��[}R�(s�r *_cJ�d�V�OX+ZD�P:�;�����p|z�hyb����6+�[O���4M�����c?+�S�?Zx��`���i�z\�͍���e8�۽`VOn>��,⹲���kmL�Ӟ"�1Z,��d.Tc��!���BT]�+}x1�p☍2u�+���;SM*n��jw_8�������/VR}�<�����f�7,��v�3*�E�(0�Ƶ�����-&^jc���si/�ͮ=gp�]J�$)���4�H�<q>K��{+��m�[�����W�y����d�ݳ������d��y2[�ݡ�]1eُ�Eӿ���\�e6�αY�ݢ���&�=�P���W
+mj���H/ְ�rp㼂,9�S��_�i�Qc��b0j3�%�c��b	n�5����e�#})%�#�)�#�)���-{��N'm�-3����.��1�K�8U����S0#��Z�pc�v�l���܏�Si��
�},Ï�;��5:�,�^�6,�aDAj���NĭM���ӫxG2��Hd?F�ϥ2e����"�'�K�WiZ�N#�'�≴�6�mn[�g>��U��CM��EY���X^꼜A���n�EE��D��%>Pu^;�zJFN�~�����n��7V}(F@F�|��C�CL�����(S�d%Dm��K:p�e�9GW��;%"%z�G
P��g$�+\#ю�0�VyE�Q��u�jb����(]c�J�U|���6��g:Ԗ	2��D$��I"�����һ&��oB��B A�@��ʉȱ���y=p�n�)�Q����pjϡy���0ٚ	����keh������
Pf�o�h�����ƺ����1`��]X~U�0�L�䵈{����:��Ļ(:A�+gɛ�)���7(=M�1�K�iH�)���EwW�69�Z��F"G�RE G�	Q�E��t-����]\ZT��"5�㎞U���na�W��R���PxI���Xnm�6��Fb7p��g�5�mq�x�|2J>5v9oJN��j���'���GQ�i�U�MJL� �h��Z��mX��,-����
,�hY��g�ᑔ_��߁o@Mq�<��0E�!j�.� 5A�N�-%uZH�0��YaI��D���n��J�"�[5�m�׍A�Н8�?	���
v��K�l'�I}��JɃ&V��"r�Oz�.��!D:��i���G�Ʈ_���l`_�G�yz��G�����`���~%��Pv����2D����y�ܡ��%C�5�ޢ`M��@���@Q��mUbh�m�f���<Y�
��z���c�{�P�q^A�{�"����
�y'o�ih�ׄ�)� �\���Y�Ʈ�e.��zo�ۇ�&;n���H��m�nV���dW%i����K;
r��L'�Y�6�m6i���I���^���&��ʞ�����d�D�]��b;n/H��ʠˉ^��^PV�����#���?6%-ګ�QA/HUj�Ԕ`O0wL��%��o��6{��^���]�҈~�	�a�l��ڬ��Fh���$�����I��{�k�����
R�>8
#�1>��ˁ��d�H~����͉����@�HAE*������ĉ�����$����,�F�3��G�Q��%\J��9�%��j�6��PN]�Љ�1������1Y�~I#}x14#%}�ȝQd��K��H��r���Ć����}�5[��ع�;������]�}�š�>���m�|v����w�@��m�c��XF���v�j��']�h�����%H�0�v
|���9�?Е�����b���2~���\c$[�˱�'�̊����L��m6�`d*��l6Bs�k�u��@?��M!S�����dG����t#'{��Ƿ�-B�A;r��%��w,��>7�8�묭׺���F�ű��"zqCfN�$�mJh���
εTZ�
���UvY���i��ě�)�9�1K�r	41��ꚣl�w�X�qq�����%I6�I�I��c{�(�3�j�#:w{L�&B�<��E��qh�n���@v��C@��C1�?���@
uB��[���i,bs�&n�a>l��=��Pg3c��.[��� 0�3�ނ*Z���ȩ���&5c���7'co�=6��J�dp�v�ٱI��쳴���P���^�CA�x�|EJ��(�1���/��
om�n?q�ۦu��'��k<�^f9�~�ѕ�U�L
w�yx�NF��?'�<�)��Mݢ�jJ.ƨ�`��=i��'"�&��˾=mh�不�C�k�?�@vj	N�]�OZ��r�|1�)�/�I�u-Q�Ð�S�7�CF�pڝ��d��ߏU�|��!g����u0�)�P��hSI�p,��r�����6�	��'`��=�h����xy�J�����G�Q
"r�O�4B��&X2�+E�����΂�S�[JM5<:�1
��Oe�>(���0G%L�ͤ�2��ap�lIZd=0!��\�4�8���⦧��%��r)�r�G�w�ƺLjY�2<��P�<��EΌn�b"v����Gtә��?%x�.I"�kD��V���U��RR3�rW9K��/Q����uި���&��7�Me��9�"��l�/1�b�*�/���!�ӭ9l�0�P1�>�y;ZM�3��ǃ�H�jꜸh�}�ӟ���N��� vp��-l}��L~���c47��D&���v�25���
S�c"^zQwq�PX)�@����zx(H��A���������������!gIA�˴�ć�`�Z���s�.����5o��!�/�m�P,'��׈C�L)���mYG�|�Z~e�;�V2
t���c/{=��T�]l�@��'��m	�F��nMe�q��..�wӫ�b��7�DE�{�]Qek2ct�t;�0v��I�ڼ�zUA���F��b��[�j1hŸ0�1�%W�(P��a�Q���5��2�C��tG�M ai��=��u�.�7C*��~a���C�y,ft���}����)!��zo�fc	כ�G�#≳��,�Y����n�0��~��z`���������7d�Z��Oi�B��PkwV�1�S�!֕�"�Z�k3o�&&N�װs�&o��NO,��K ����y��T��}>'<�?a$_{O-r�g�0:ߺbz^\���p{��V#-Zr�TA�Dʹ޷g�%P3����/�_��uv��C���Zy�8�W�<d�{���a~`Ec����S{�|zY����M���e=dn�/SV�������n�c�-����;π#�	HT-je6���r�`(ǴJ7P�Ň1j/�5��M�u&	��5�$!�����p�D��xϨ��X�G��i��j�CE@5���!g����‡�kq�hvж�:[������4�����8�0'є[R��ƀ
ْ�?:Y�oD�7�1(��=�]�5���&	��K�I�'�t��1�Ԛ�p�|SQ���
�v�U���LF|@t
of�D�;J�B��;�_���M\Y�� ���ߝ_�ϒu/TI�����p�ؔE���,�A!�1�������EwH7>?�9O�EL�-=�Y����v�2���	�XY�xU�q~c	\S�S�p��~�:��n���n,5����81+��P��e�\�6L��0
$LǍB�#u����g��g3��@��֣ZQ\�������s��gPÄܛ�ϑ�nY.Ш�,������_O_��W��{�շ�L�x���W_��+�G�7e���ى*2
�<��&t����f�U_�A)��L]���d�@b'�5��!�ǭٱѴ�����f�'�	~�%i�`@�������=+�[T�)�u�)���=�`nY7��O�'�ٙ4�
s	���e��a��"5�d�΄�11�[�����L�*�O�u9%�خM�aV�B�(��_�_G���[j���c��>��(����/x�K�N!��3{@���2�����s�s�nZwqT1[ͪwCJ�^f��x\ ���K�ay�A��3�uCq[V�BU��hRr�L�|��&�h����yNY��H2�i���5���"���y6YF�܉�%�q�a1�?F9t�>��x0�q4
�a��f?{���h�bz��fC���F~��s�ƈ�A�=����߰�^m���y]�x�s�eز�=/B�UDԎ����L��@f�w��z@��-В�WH�$j���}��*R�t�F�	�{�ɡ2���	L�V�'����a�alk�.�c���M�/E�wtP�'ʊQ)Y[r�}_��REIF
�2@��f��3}� .].�n��O�f�i(U�b*uS)ѕh�VC�u7�"��Ʋ���X��Cޥ��".����i���
����4:��ʹ�Y��C(��y`Ev�$���"Io�1�\(�L%��V���oh�Xʁ��V�"�q��=*��Ҿ�T�F�Yٌp�g�Ԅ���D�T��-�+���q{&e��aNS���
����8ι�,���h�e,��=&l����Vq�����ڝ�˻Q�5��U�4@��Z�jb2� ���(TYݎ����B�ƭ�"���`�����W�kKK$C����jz��/\�Vj�[���F���TP�����b>Xc@&��6O��ڡ-h�䘆�
�}�>ؾG���mXg�(3/��
���$�7E���bL{�8Kƀ�g�	�
�Q_�����-z�蘟ᭀR��܌d́C#c;CE�l��,��+�l�q쀬e����Lb,Q�W8J��J�܍�x��N���������뱻+@��N|i�s(����H
�ʦ��e��t���¼oLX��"�o�lG�m%�@�~�������R�<s��ɡbE��7#�A�;�]M������1�C�ߎ�
ʏ�_fm����k��!�����W2��dN2��Z�zWN�� ��$�b����/���\o���:ӄ�g�=���
�0��|s�\���MKO�'-p�WG?`�hA`�"��
�_���z~�/����U�����`�tl왾D�3f-c�]n-G��6��Ά�%۳��yg6�4pα)n�����FBH�,�m���J!��N�����I�	��d`�H{_Ki��&�X�řuYΊ�m~�o�e�����#��ѷX|j�Sc?¸��mţ��G�����x�^����,�)t�r��v�9i��Rn���tS��L�� �=�)|��84yy%6�$�61�n�Y�K ��d�$9J~4Q|T�B�� �4��ٻ�qg����'s����f�|����f�������r�����c2�\M]N�
�aF������1 1b��]���K�^�m��"'��;��zdp�/�O]�Ɖ�?J�fkՆ:�١���uyu������p/��5y*���\�.�B����V�o'T`
�.�S�0�ת)�@p�^�H��f�h(�I�F��,��{�0�j�N�VAj^:�Ց���n�x��l����TUn%�H��p��$�h�l����(��g�٩b,.+3m�)���$\�H[���3��8Xv*#1^��ݟ�E)������S��v���mX{+�Р)�T�BWG�6]p��9��b��O�y8l��G&>�5��LO��Zq��Y��<���Wϵg���f[zE��9��(��yɺ��f�v���wdP��K_�ua���7?2б���/5��@h�XĽ������Y��8CBڨ�C�+��fh$�&H��<�f�@�p/�lbE�dN�)�k��`X�y\���p���h��w�M��=�c�o����N�ޚ��@���|�_%>�����i�1;��K��0��P�6$�hJL0���١�2��W9�>��
���B8��h�ɭ�9׺&��g0�OF�'��_�|�-��Z`3.�3�v���0��B��5�S�4F���L�H�篫�}�Iz97G��H����U��%���W�),X�M
�y��������-Z�a�Z��oм֖:�@ę`f���D̼ƏUϏ�g�
�tYv�1��k�bO��mF'
=pQ|Ҧhhԣ�:��r�h=��Je�6$	B��b&�E�G��j����%�F�h����
,@��1E�a��Pz�<���p��RXI":�ɟeu��,��I��>���"h]���PknTN�M�6̜������M,$����Q3
o�l-���ruD�4��;O	V�xŌ�M�ݒ�]���16��x����}�!�a�b.\�|�窱U�G^�π����)JZ��o��I�#`�r�4kP�^��o�Q7�<���F#x)2.��449!+,���J�Nٴ��;ۙ*lR�2	�|�n�D'"wfۿ4��Vf6M���8�#u,��8���7��⟰@<�@�	4M����I�P v�K���#�t�%����c�A��׳'�s6�3׃2�a��J��[
��Xf!��q���T�Dz�٦�f����
+���q�X؞:��pl��C �?���3 ��-�Y�	8Ki�0�
EL�����^�R��F3/&pڱ����W3^���t�
�L��d�\��kڊ�YP6!��|M�_MJg3�v����kz���k�xCc�bAE;�.�����P����CX#+�7��s�1�P&���k)�P�̫H��zD���$���#s\ksHǏm����@b��zS�<18(�s�Xn��?�`q].n�`f��ѐ}cL�P�A���%y`,����s�6�k��;�]9�M�)>��E�=匩�:-���#f[M��v�`́�4���/8�HΏ�ڳ�Mu%B����6�uW�J�sf�΃`ݦ
_���wzx��v�N�(�����)e�����̷1��w�t��v��M���Z��U���?��NA?+cZ��	�V�0S�u���L�1����q`�,�}x���]���?����05��7�i��{���`�;��Dsx��j�k�����~dșQ;�v״�5��4�:e��}�ΟeO�Y��(���!���.����u��ՂV0�#ъ�gq(ٚc���U����?������"���q7��oc��N�6q9���VT=Ƭ��o_>�����qE����i�/�U�kL��n���S�h���MZ�LA÷Z��w��v�s4��h��\���L�7��E���?.<��
;�x���؅54z$��V����15;5nM����l֟gWyQ'�ɗK,� �M���/���{��%`�,�B
�&�Qs#���J�9������ڻ.�F`p��|�x�@P��I6r��8�����f���|	�80}\�cy��6DY�_�j@�M<�o�;�M����鷙*�3pa[aY�%p|N.]������Z���#�!�)Ҋ �&6��I�殦��#���+�V��HM�:ET�=�0,U�㕥��UZ��w�ᐳ���@
D��3�;�pH�G�ôә�Od�V:��ƽaT�\��-T}�� �?V�t�cǵ�1ݡo���,�9�V'
�2@��1�Er��H~�� ������}F�A=gM�x3=��7
�������
S�v�%�p��Xy!Iӯ���\(���!7I\����N�Htg|�Tˀ�Ue���:Z�D���>�sA��=[����í��)����9v"�Y�������� ��L�+&Ϡ4oU�>W���h�W<���V�	_ڄ�B�8���J���.��V��z:�)J���7=J!0]��/����j��d�yM%�����<"o��q�A�c[���=c�I6R6��h���|�H"	z�����8�$�b�5�J!��H	�K.u�`�?8ЄSX�qډ���r���pv�i;��rUa�2=�{�۵Kw�rTS�X?�D�
I����WF�H,.��ˤ�>���X�|p��N�0���7�LR��H͉�3쿒'K��.QI���
�ƚ�YЊ�A�9;<�7�;s"�>�cf�4\�?���R�Ս��R��S�����8��g�j�F���^��1�����#�G�݄��Ɣ��M~ֻA��7o�0��켮�C�R;�S���{|��NI0YJB1IBa9�5Q��
������� 
�3%���)�tbDC���[��p��;���?����r	_�m�
�}&��΄�WYՎ��A$���p����"ܐ
�6���mB0���D6�1�~��UQēJ#�SU�]*W�M*�>�M���.ݾ�n@(�=4��;�U�0�`�sC'���"����_��B����<�#l&���y�����3�o�!��K:�T��^��
ƹ��
�iT��	�ʋ��"��ډ�.Ѥ&^Qg�EbF�AD�T��Q,�
�
����k���}Cb7p��ɮ��	Ka��.��D�F�#�*c�M�.q��vQR
!�&.���� �B9u���i�fc]�vµ:�_���'���6�Ǘ����s�D\o�D>'�h5�5��J�oV D��#�b 8�W�{0��h
�9\����Q�,��c܆�`L������BVl)��^~غ�
�"�[���կ2C��-v�}�5�:�٣BK%�H�ϱC�3j��O$WMm�f����Eү`�Ӓb�1��%�W�l�0�3�la�%G�(:��7�;��[
����
��'�a7��sI[bNDѭBڷ�~��ݸ�(yXTt���1������Ej�&�u>���让�	:?4˿ܼ�B@7�"��AE ��Y2t����%
vЙD4�h:��@�C4���٢��~Qz=�?3�\�	86���;�=F��N����ȷ�![set����dF7Q=�F5؏{fR�_e�l���
ĝW�#��渱�V�5�O�L��Ԯ7-��
��H��Cũ� 0*xk���JEg~��1��J*��#�}{v�0���߸��nQC�/�6G�B"5mzi��?��T�[�t�c�s�~�˖wH�'5��d�r��%�a�n�����Ǔl�p7�Ջf��z�{��Ћ��}wc�-;o�5s���q'��scL��poP4<��֮������Am�i�dY�U�{h�}��Tf�x=¿A��=R
��{qI+?b'���|���.�W�+�d��
���a`����a�q�XlH���y��E�,/��̍ku2�����k���(j�o&�ᄫ7��l���l���w�-tW�.��j��%
���B�(����zė$9Xy��~�U���a�]�t��/|���C�ꈾ��:5_�o䞵`�b�����dG�(qew�L:�5D��PK�uW]i�(�:*setuptools/_vendor/more_itertools/more.pyi�[[s�6~ׯ�Q<j~�g���n�ݙ�M+;
"!	0h��{p!	�H�q?$"��stss�l�"��:;� *I-9/��xss�X�j~��KE�>����2[.2��������ے�'�$������4����^��<��C?矰��IrK�_TX��$�����DjA�Y��/
ay�D'���n�v�=��KE�]�#(?���8+A����D�R�k��-Ώj��D�%aHwc���1�{�D���K��r��]ex/9.����B��=�*Ud�QF��b���ǖ��;�~�~��W��Ճ��A����^�Q�}r���*˹^�ɏ�!0��F�70t�V|l��ÇUg�G����r�
�`*�0������9'ڒ��"�ܼ�,�Y�%"Cڪ��,[�>j	6+k�Λ�w08A���(�~Ȁ0X*�
;���j�sYB�.�L�2!a�;P#/A5����*T>��l�
�:wQK�h-�2��&�֗N[)o�M	<�{MØ�W�"���
&�����5J5:O���e=��E�O�[!G�����JWwzM�Bj�#��ܭ"l���1�8sa���ǴK�Iñ��ܱ�ӫ���h��[5N��e�nVM*�
;��9	�����]]�L!�'R��
�<v�����Dhw�	�Q��mkI1�����{x��G�j�͉��]�rP��a÷�؏�%a��`1Y���	����!��O�#$�eg�w{*g
�H�2;(7��L����GW��j� �OnJ�9G��m��؅���~d��>9�s�D��,��"���X��4V��
��M�ub��|�q��i`5a�'j� �E��ޞs�h�t	I��Q�};�ΰ��
�|�a��'R�5:魣&;ڹr�-�'\6V�sX�7�����8ۋT��tOiH!‘��h�K��$���?K��<�L�&?�%+f��?�c(6�7�C���)�=�ߑ�����֡����8�x_�7�������aD����@�G���Qk�+�q��z��m�v6�m���F��$�)y����@I )���}��c7�;k�-$�He��գg�|�AL�E9�����b�
F���&c������N����@=M��qa��$�	�_(n��W
���O�V˨��"
���-w�K�*�p�*��A�Z�]鄟59gS�/��TH�
��z&��pϡ1@M�������埴����Ʊ��f�3xZj˸�������E1�f��ݚ�X3�w:E��Ve*�p��W��ga��74L(�9T�%��F�,Pu�$�=jL��ƨ鶁R�ŭ��E�$��'v����v�HUp{
��ElF���E�����R���~�9�3��lY?�5�����8�4�w��z�Y���m�n7c ����VH�23A� �=I�j�r�s�2�*d�׸�l�&}�/��*䵄����Ы]V�[��*����K�qΤ{�*��E��:��h�@�!��r$�qA�Ps1�	������3~��m�
����Fe��Q��>pq��Q�XF	濕�fz�d���+~�9a�3U�As,�(�Qv��a�0�A͉4����<��e_�ھ Yc& '<M+8�)�x[�{����Ĕ��/M���}�%����13��9i�d�����?�i{���׍GHH^EZҳf�.��2�U[�6�C
�t�?�4!%9M�Lȗn<W�0������޼��w�=7	�> t�p5��+D�B����	jfS�j���Ѡ��L=���*��3��!:R�D�yX���d����,�.3�M�J���@�K^NԴ���5�ɬ|�<�+ҍ� 5��!.��(E��ԥ]w��4�m�eF�K}�p�J���<�{�ߐ���a�jh0w6T�z��� ���wkN�<��{�Ctp����S��*n�U�W#.��ۓK�7�>�ӓ�s3^D��l=D����ۑZe3:��������vW�\��[3ٛÚ:]�X0û	m~�@���n���Y���t��м�a�����l�"���1N������A$.wL�·w�C�PD�~�;�R�~���8Mcкa��{y���P��	jt޳
K�b��Y�s��\����i!yƹ,_P��ݝx��P"]�꭯��yS������v��p�G���Z��ƕ�093S��Cn.�z�����{���՘x~O�����r� �)��g�n�~�Swd�ńd�X����h7xĉ>o���ߚ��<X���||�������ר<��,��%�1�*�7{[��b1q��m��e*\Ks{Vd��I�
�ȡ���㜛c��l���DPIO���MA�ΡJ��v�9�]�?���Su�;�Oȉg�3�u�#B�0����\�n 3���Ry:�O�C�Ɯ���ͼ����Y��RY��{����;]=��?�ܒ���_��
�]~��Icv:<������TM�L,q.֜	���F���8h��7����N���G��g�å�p)�j�MZ8�a,�5���ӗE�
�csXW���\%~vuO�D��{�#H����H�ڕT��Pp��C���I�<��oxO.��m�v3���X��ɥ��i�HۍЇZS`?)�d��|�a�=���yEj�җ^�x���6�G?�ĩ�ګ�
?a'OdZ��b'h�����]��ԯ\@d�2岯��N�(��y��ω n��H�ފ��li�C�K�I��.�Nڌ���\��B�A;�m�*-5-m�d$1�u��ȶ����˻W_�F�ڗl�PK�uW*setuptools/_vendor/more_itertools/py.typedPK;��W�ʀ�8�?,setuptools/_vendor/more_itertools/recipes.py�;ks�6��+pN]�Rh�$�d7�x�晚ڭ�V&�w{.����5Ej	ʖ��_?�"E{��|��DA��ot7Z��矶��iU!�M����NaT�����u����K#�:�oU�J|==;{S�b��h���Wտ�ԫF6G�j�n�����z��J��).�z���V�{#W���Q���aĝ|��
���BFөH�mwW/^ ������u�yaw|�q�޵���������&�@���Ɯ=y]�ʒi'�{�oI�]r&�_~'u���z���͸�}�گǼT�u�����ڔ:�/�S��7�l�r���3��ݲ���20m�Ȩw��m�0���
ė����Q�0r���<;[.eY.��Z��>���n�(]���?ub*�y�Fֺ1�m�~κ�m�*�H���="S�ꐫ�Q��lˈ�nx'���T��>��Q��iug}���<;CU�G�G���=3{cD��0�U��Ie���{����7]��f��P����i�j�V�Y���W�z��� ;���i�����Y��d�I��H����;�Y���J]L�	Nٚ�	�|!���L�+�ׯ_3��T�~&��x�_��R1O��W|"�
����
ϲ���Ug�T�2[D���⫊!<�3����x������-8	;W��q�E�8���]�׳1�X��k�w5��%�f�Hh�8�Xh�V��Ep�ө�x��&�����
rq�!C[!s�Eر^V��&��Ё0���p`�U�
�ߺ�p�ht�kIH���M�'�D�BxyC����صi8��z*�Y�'r2`� �kQ���p%b2��,�:�W���r|*���_	��T�$�φe�9+yz+� }]>k7�2/eߖ&���0'�`��ћ������h�_�f��|3�0�I����05�EB�]��[y(Uu�ٞ��t��/�*��7,�g�:9�U;3%�Hs����Z���
э*�����5�G�wT�u�~�}kI��\<�r�`��A�y�����]]�K�
`�z�"�%�4uUx�vA�	F'�=%/�ԞA�l���G�Trk��nj���J����Y��|*.�_�rx��~i��L$�� +s�8G'�
i�>j`��-t��<��C�~�±U��~���}"cb_�w��t�x�R��${u�n�u�c�+A�h,�}�1,�˞"N����4g�߈�0*��i�aF�y���e�.�kQ�͡��������"'\�fK�E5���M{gca�6�d<�W̘=�4�}�CGs��P���M>Qڀ�6��ʯe�GG,�<eS"�&��38uQ�A��5�,!�@�t��yD����6�Gq���e|q���9���h����H �=%�R�'�'�u4f�/�g���X_ڬ
OR��B��X�b�l&�5��ok�
�SW�ԏԡK��j�@�	O6)m3�\P��F	�㇋�#�A_\� [;9s�w�#�ku���X�
�C��V��K��
"c7g�n�ŠX�&�v8�]�2 �XI
�DAx�me�
�).��ن��A�Ϋ4l��i�˺ǟ6bdzޗ�>��*w��d�c�쫽.�plW觮2�A�]��鳂س4��8�Ϧ���;�.gC	Yr�f��R�4�8�����3�s�R��`L�@ޜK����[t.Вc�����p�E�M1o_:$K^��l=(G�W��;yP9�>Ô�Ta�:�����F�y����h�AO��YE9�=��1!�ns[H��?����ٰ��GUC	���RZW)C�ZƩ%�_�Sz���ԛ����*���byH���N���QY��y1�&B����=�eW�)�HY%��6'�F�{�.�&x����F!�c2��.��R�%{�'��>�K�	>^��2pm�r�ޒ��`w��.�+!*Z9�qe+p]�E����"�0)ЫS�G�h�u�k��
����޳�R�'��z��'Jq���.CāR��~��4V����%����[�ūo?���_�Jp�Hj�/{
bF�$lt6�J���iE��4��w
KW�{�@�d�x�B�Zpސ����@��P����Q�l�~�'���I���M��_t
����ز�J��j��r:�с,W�Z�&���Ԙ��և���ۼ�I�C1�W�Q�r1/��*ma���%�y�6G��p��m�U9������
>4M�00��ZD�)̧��������ͦ�%(/����1�5��܍��`����w\��l%�8k}P��p�}uo0X�u~���Q�^�ޒ��F^sFo���F�2�����_hW�^wjs��
L���j�Jwk1�/I�c ��Ppխ��`�L����*��彂�4�4�?��dT�9D|f}e/uC$/�[1���..� ��+w��v�I�I�w�%���T����_�Zq��R�#�a)x(:�vCɢhXjG�9��
�|�j�\p���/�r0eL���a��xP����q'�:A�z���i�3]���3] #��B#��������~�R�"Y���B�0���
?���1j���������6l��*���愀���@rb�a�/��w�b��[������1� ,A�u_/C�2Hκ�NU����u�m�E�&N�i0u��|�^,����\����x�	���}-I�O�Z=S֚�l
66�ڂݘf⁂؎�5��Y ����	���Y�Eѫ��X���1#7�-��	;WKw���α�7��{j��8�*�N0���;�� %��7������vbA�ąA�3]�.d8�7���@��+��8t�F�f�3�X���x���#>��QoQ�,�7�k|r*�(���4z-��B�3�p���!$��0e�.�-��.l���Đᐳ��5���ߜ�5B�q���N�&z��ѧ;o ����P��ٯ`��]���!߸3>V�49��(3�=�6�t1��"W>�[d��p6�%�~�QըWy)���p	���{��1�C�*9#�Þn�s-<��R�ڢڻ~�D�ƪ�C��Q�j��)�>����'Z��]�=�}���s��b�Y�/}�-z�mݐ�u���� ֛Ɉc�q��CG48������v��ް�6�jy3��eg%}\C�u���h�����e^E�@kT�@u��8);%��Fo��۷o߽{O�3yS�6��Z�c:�6�%�5��6�BÕ)�����N�;�+$�?�+ǂ�J���9��Ew{e
�j��짤���8c��AZ��l���l<ː�,k�J�����zO�&d{��f^6;��PC�']Lc��n�8lI�
���z��Yل%�Rԏ'7��xd��+r|-n���4�k�a� �.�_�]5&��Gi��ӐY�VC�}L���?ʊx�S����~FN7��d�
6�EU4e*>�ȳ��y� �&���/KSҌd<�5��E�A�h�-%�s�i�Jq�L:�3-�.��ؘ���K�����R�(�2��B��W&v�o�n��Y,��]�%�4o�(O��'�9��oe�_�;J��93��c��w�`ש����K|����(rS�
�_��Z��	۫z�{�
xKlM�ۯ�|���}���]9����s�&��:�ӽ�H��C.�J�eK~�Nʻ���ڵ(*�:�Bd��+"E#u��w�30C�V�Zr�ǚ�Z�mz\�/�p���GoC�8Sa�R%��a�X��!q���e���@��oEY׻��R�ŀ��9ZNw�.��B�n�w1�r�1j0,�}#o�5,[k�IQ���XC��lԞ#Q�����m��
��z ����M�&�pS՝iXS�cN�'v��@��xf���~��3x�ۓe(�=yG�g�u�eP\2x��|�+ 8�����j3�}�'>݅��X8�WpNZ0�]�Ʉ�3�ί�A����딲uB�b���N�����m$W��5���F����=sՓ�r[��iAC]��`E�����oi�˳���U95��"�׉(:TX�-�%/�G�p��8��B@��:�]���KN�p�lg?�i�<����q2��&l�Y�rfG	x:���G����E�z�}3-�v�
n�XH���������@ꤙ{�p�'}��]�ܔ�5��gƽ�t0��|��
}�������78����d��E�a�c��ۗ�B�%q,�P���q�ڜ���V�n=�G�y�_#v*M������'�xk'4�g$� ���w�I�4�[eR�2�E)H���Џ���Jl(l�w��o�-_`P��p���/B��2���#֏�Sh�������W�F�U��"�zİ�i�y��=M3V��Y�;�o��b�ߤ"��.Ÿ�ԲwZ��2.�$OZ����z��NО�/|���X�P�l��rCũ{�:�7��AlJv��n�����Tמ��\s�0��C7 }lKr��B���=�c�zj�gn�:=ܨ���ʲ�a4M)H����b�Y�6���#�Q:ә���K
�"d9�[h������#�_��oS�H񃘍i���7>���"P�ȅ��Ģ�V#S�}!�bzv�~O��!��$�
_�x�B�3�шxE�
}���Oc��5L9�!���%f�B�9_T�ɩ?���6�^�T�q�"J]xmؼWޡ��;F�1�q�E���2�s�Q����w��������	����bB�')�
з��XV�cN4��h6�b�x4�J�?.���O!�g����X������,c��~*��໬�nE+������x���~���d�u�(QGO�vNx����b}~�,��>�u{?@��K�4`�SGL�䮿��+��w����_�V]EI�K���@0��m�1��Hc;Ƌ��*��Nt���1�ᓂ�'�uޢ}suua�tnξa�3����;����|��zfi;��^ę5�q�bEp�}�^4��̈�v1p�PK�uW��f�
-setuptools/_vendor/more_itertools/recipes.pyi�V�n�0��+�%P
�G-�
͡v/�!���aB�
���II��V��k��g�L&��]kRHEJ� e���멂�U�'�IT(Y����VVRG��.�_(�t�!�}G��;#U����	Ww�aRP��j�
~�������+"�?����#����y⭣��*rgdKs�H�1�(���
[|�ίo�t�{��G�C!3„I��7kO�L���?�����tZ[�-���
+2G>k]�\"�*!h�m�2�e8�x���1���3t�-!f�ێ�\?@�$!x$/2h�?����q���>���ś������$.��r�V��>S�t�sPts
O��!����~�i�7CaX�a;��R�wC�:�U7~(w\�<�#�뇬�U�R��2zL��(��R2�������|�������9��]�Hw,��N%��
�q5���Nx�3�	1�=��	��j�ﰷVߢ�����Bj�A�'�FI[�:�m!&�v7ʉÿ�&!�|K�Wb����AK��
X46�ܱ�*hr<�������2o�ܔV�J���o.=�]W8��
�}�=�A�mul,�At�.�w��3(
��~�+ؓ����$|����W�d�`��\��8�4g?�.*Tf�-����;�[<����o�3�xJc�t��wg4�����~ �W��<Pj���!�MF�y�-�6���]g�H^Qv� �Nm%
7SY������;!��+a��^�*����q��jp���d��,p��o���h�33�)�co.A��Gh��1�'{zGb�9�^��<n�ü����P��|+�b�6���J	��_PK;��W�=64�(setuptools/_vendor/packaging/__init__.pyMQMk�0��W��ޚ��v�`���aP� c���J"��Ɩ��s��b��!�K��CO
!V�Ej����GF7y0}��X��rʴ5|��dt��]�Y��2�^��/��1�����9�uœ1��c�����ѯ7:3Y�� �)_E�2�¶�'X�f��@zXD܇in�/{��"&���c��h��WIp��#���u=��\����V�"���͒�]�M���e�`�P}�i�%](�3��C0��g�:�t�>�*2���7Z�ʽ�#�i�G�q�W�����0�������V��d�PK;��Wb���(setuptools/_vendor/packaging/_elffile.py�V�n�8}�W�ꋴU�����v��\�&X,�5Z�D%J �"n��!%�R�$]>ؤ4s�h87�u���x$�R��f��e��Ǡ%QB�"��(y����D��.�� � *4] ��x�*.4HF# :C�y^b��R$kD"��d'��y�'�>���'� &���ֹw:K�t��zU,�(K;�Z�8�;l��{O�0~ߏG�wt8
(����"��cWh�LS9D*L�(�XV��j��0��$���>xӉV�J�p���q�{Rͤ& �t���f��,"�0��D�s.��z3��en��$ 7~��8����D��	���iR����������Np��{�x8��+����t�h��^M�O��>�3��j��}M�F+.`�ޤ8B�=\��͞=}�)�����rU�>�Ȟ����כ)����W�%({3$c��
v#�9\���k�ۧ��5���#r��ʎYF(�3�Ü�C-�;	�0'�F�Rڄ��vG�\+w䛻�\^BR��~�n!l�`�ؤ*�p�#��5�.y���GxVl:�v�U2�P�v����������{��J>��"�ӈ�5r(�f��&'�L�$�L�±�4�Ҍx�(�M Q���
-����u���¨�9�����z�4��|ޒW�({J��wI"��S��1>���3��#�<5�U�l�X�ABy�����Y^7 ]L<����Ĭ��S7 �I����P@����[�>9�����Y��&�ыx�{�zu~WWW5~WvUx(7��F�g���jxG/�=L�F���g�s�/X�B޶H3�d	Q��'��m�x�
�>�0s����A�oJ�Ϥ@��<h=��iYѭ����2�L(��d�S�s��+L}i���2�98�Х�X_da
��[ӳM�$��cYjXp^���ƍ!W�}i��Ϫ\�k�N�}�� l�?� U�o�����M���Bf������SuCS����v���0g;&0 Ćk!0��{�����|�$2~5�_�x�9H��Ұ�6t��d,��44E���`���L�zEL����h'���/7������/8�>U��P��sS�
��b	^��el>V|�N޴Ê�Vb�
�V�Zw�~��ZWh�8W�e88��3�v��3=��̌��x�4�z��{A.i�wg�&�*�22���W�B�!�����s�Ԇ�
�Lo�PK;��W�"r&`�"*setuptools/_vendor/packaging/_manylinux.py�Yis�6��_�af�R��$_I<u[ױS�*�'v��x=DBj^%���L��>/�R�t�m5�M����,�,��Q$�B��ڒի��E$g՛y�E�F���~�E��V���'2Y��y�ƬXe����.{+��"�]v^TO<�M�E�e���#��[��E4��HTh��'W���^p����I8}ǃ�Lp���?~��?�����?�������z�~_/���Ϧ��7����ߘ-��Ö���C��+^,��^|`IZ0�ğ�w�ʤ��Z�4a��k����B�$�Y,�U���+����9����E�J�m���dz�1O�B�[��3?�$��=�E��m߈�����D�&��;�b���<�G��f"ѐ.s�3$Z�������J��P/��@d\^��9�����_yT��a�dP��W�$�ɤ|�y/��(���H4��`��[�<ܞG)/t����`�(`�"d�(!eʖ��"g�\��˄��dy�*Ԣ���h�
�ya(�@�H.%�ao�q���xY8ߪE��IC{_��(�<a��D�L*mRZ���/�d�bGG�/x'�;v�$HC�7���ś�ن������w��v�#�P���`G��V_u��cG�j��iȃW�X��.�w_��a�?
��`��3ٗ��x,7	F�]�?���5Y|�	�k���z�2v��	��<�:���N/�c���HУ�}=~t>�`|>gDƀ��p�`ɓ�PL��T�U~.{,�E���=,.(@o�b�4ۑє��8��I)�h7�<Bda�T�E�)��(�w٢D,i�Y��R�H��oD+�J�2F�C6�Q ����N
�z<v��K�%�7��2�i[f!/��*�:��|���a){[���;=���w~q��Pg�[� [���^�V�`t��
�D<����9d�Prv�ak�dv�2	�|%!��֞�}+&�a���m�u����ѿ�r�[*"��"6��Z��R�Odq��u�^�V(�YJȕ�T3����
�(i+��tꡦ�:�`0)=Be�,����I9xWJk��K��Ŋn*��@�B�IB�5`�rҤ�"^�$b�a	���Pv9�)*���(��gQ:̓�$�wg�x2#(mTaz���t�r{:y��^�`�˴��HV��)s��x���W��
]�!��B@9Pi
�u����9���^��k{D
�>��p�5,L����qSx��ڷ�z��\e�,�2�XCc�-Q�A���EU��e��ڥm,0S�w#�F��eDя
���C�C��f�~��<�,����3����Xc� u���%�����Z�05������4��C�"Ot��S�0�5��/����Ӗ�f��8�P3�WdcH�@$���bt�Օ�)5!p;xt�:�.E��Da��y�X�}�*1 �$"�{�0�����~.e.XZ�a)���e^��е��_�S�	�H:�XBu��D ��p�R��u�h+�(\A2�h���f�q��{ !��H��Z$�x�dB�~�IJJ��Bg[���NfL�P{$�+mY�"h�$�h��L�x�y��%Z�����Mԑ�5�
I�PE�x�(��M�5p`,�A�%��=�	�?h���@�-O*C!���ʵ̋�$jK"�c�OV��DFdt;���b��Xe�m&"�
���dA��"�
o�!�m�d�
��������Z��p��")}s�3p�ڵަ��{���oV�,�hR��o
짒ѭ���U�5h+~��#���j�{B��D�k�՜Q�����(��G�L-}-�Gi���V/3�iq�MTH��6��]V�ylU��Ľ��S��A���#��R7=��#K8\R"�n�>���T�yo�h*��\�9��&������*�T=�3u"��Ύ�+�l��UlS�]@��H
�����x�)���IZ!(�N�`��q �*��� aXF�A�L��,l�@A��CE����6��l5́1�^K��9�(U�Rg~6��zl*�9��g+�j]�f�ӟ�]bg��3��y��3�ص�|�ۻ��^u����=���p�����o�����?�~E�U��m�ö�ǭ���Cz��k����̃�6����Y0��j=}���@�"-٧-����=��b�!�Y������qþ����28�
g8t{��,���X�i�(/��C�0p㟈%]�1w��\��x{3�S��Ű�i�s�����(�^�^��ɮ���z�ӌ;�^�C��D��ho��Vʐ��]�S�i����)�iUeꓥ@UM�Q��/�U��(GWz
�i�6���K�?����7y)*��\��AC\?�d��8
�=	���m:Si�v|WK�vrg��X8Ȱ���;:���Zf�����ޤa�e�-F����ӴI�}��H�d篐��9����/�"�{���5ۺ���o�O~��_�>=����x��Y~�|��d#��@��ׯ
d�X�r��t@v,��Id�2��A�-�d����@Lp��-A���_���c���e���f��C`�-�i�g�#F��D!�$
�fN�ʌ��$�T#z���Y��?����B��,M�4
M��a��;5�
|��s���L�G�`���)Z-A�æ���=CZ��lrBg߷�R�9h^��׳�#vہ�k�wj��|�S����SUUŝ���ڽ@��^�/F�r�_��|��郏o^��?��hg�`��3>�I�y=��2.�n����U��lT�в���v�I���3�6 �E�p_M҇����UAT�a��IO,BICܮ(�V�&�pr��:�yfq���0�G�Q5�u���޷-�!�[O���k��n�km���.f'��K�����n��e5[����,P�t��?S��Ho4��ۺ�d0nyX�[�x׋��Z���i�QB3[�,~+��
:8�8�*�>}�?ǣ�ˋ���{�G�Z�	0T�.}=��c��m�`.�ќ;�+bp�=��܌�"�`Ś��N�~�#4�)��:ؘ^��6��Fl��v������`~��`9�PK;��W��}�	*setuptools/_vendor/packaging/_musllinux.py�Umo�6��_q�>L�lb	�`0�a��6@�~q��(�Ej$��(��wG��[��H �{��4Mo�o���+p]��Y�����T� �V�Fh�@��,����Y�?
(;k�^��vZK}�ۓ?
�%J�Q?p����sj\W�t����:��Ή�%i�&	��X��t�QnX1��n�ZS
7޹�Kjk����7^X�]�ވ�Ä�蕫$��B���1aҺ~���$)w�?0��1�l2���_�4vR�x�z8&I%j(Zn�((�O83�o;��m�_ƈ6sW�h�(�a��6�Z2�PU�Y>ɢM�Z%}������)��p���p	�N���՛-|����L�_�Y�;���"&�qX���cf�>P����{颷z����`�_�ڟ�����*f
;Xӵ�E�/bu�ėy�c��”튒�G�����/�E�y�W�a�6�~�r|2�l�h��.�_���R�@:D׊R�2E�~{ҼA�{��XA�Mƚ��� ��hH^	K�@�t�X��CP��F��s]�|�'�z�'ө
��i�?�7%�j��}�+�/!{�骸z��W2.�%��o��n�9X���~(qxz{���$�L+�[@j�i�A=}�R!:{�fu�%¶�ޅx.E�!����Z�	w�V���{�:N�B�$D�H�o$��^W�q��M��!d�����	��gw�7��贤�qUh�8������8��p!+,��*�	C���q['�3r��	�Mb��λg ](M�"����}��_ad�����q@i�3EE��מP�׻]�W�vc9���|^�`���.�m�cH����w�"��]C�_�f����NbbD��⧼����S�Cj��n�����G	͊s^6v�q\V�c��&�d��:���[|;,[�_?7��]���e�@f8R�@%�Z�"ܰ _��g�8I����1��ˤC3�k�%��z�z���'�ָe���Њ"
Y����4���=Y��^]�C�<��h4H�oh\���6�Y�Ps4F�463�%�R��1��Z�()��p�3�_Pvt��:ӢƓ���:�4k��9%q�"�q�n�r�:i���y�.�|�o��Ug݈�|��^G)��PK;��W��i	�''setuptools/_vendor/packaging/_parser.py�Zmo۶��_��,����~��Q�sRg5�ڙ��@el:"K)'�]{�_$�����@I�9<�ϡ�y�{��h��$A��P��ъd$Y�d��XF��:"�u[��-A�t�r%7h�RD���� 
��z�,�(M�2Mr%
''g��"�(Y��7L%%�$9�i�5�d1��ɻ-��Z-x��a���4ݠ�1��ǃ�1@����
Y-��"@ӌs�q�ԃ��[�C7��;�D�=�wó��x�.��9�Vkc��$]�^�oE֠k�Dy������xKz,�A���D��?>�+f����2��b#H�VSR�oib00	��\{���a(�C�J�La��o��o��O��G8͛�P0�"�!��6�G�c�s�uz�sV��TN0����n{RK�]�f�h0�#t��к,���Wj�('�#�����B��tS��d�_zz�w����)���^`���r�=B��4Gl��4�d��,�'<�7�s�9/�m�g�w||����2�g��m�s^�c[Ž���[�*���������9ǍՌ��x�1��TVn�A+L�mi�oȗ�b֓|�z�i�Xz�FH�+��R��ey�^}�0��f]�������'�w��԰7K�ti X�#�*�:�0��mLX�����^u%"�4���o
R�rb��-�N���p&nex�Kcn�"�3���U�����ާ��i�(�
XG�$_�g�_b����̓�d�2���7D�A8G|�c9��k�i�H�rmXU���A��eV����{m���, �-T��H�tش��2�7�����7�AɡB��(�S���9�J�mI� Z"%�C~
� r���2�b6F���5A
��󶌤���KD�_'WԢl�@�UB���M�L^�H�hm��-Y��`�u�n��)�+��pđZ;�1ofP�2���\)�٬��f������h�B]F�]A���Ȉ/��u�@IS���('�(�����Q�ms��nns��_NմݿC�]�,�|�q)g���~��@j�<Jiu����3�D.d�'<̠Vr���гWX�+
l=6�]1�=O�߯A�w�o�*���+��:�݅<�w�_��72�
=��n7a��rM8mZ�	����$X��(����K�͇F���tR�P��W���k�SR6�&o�B�}���v��*4�5"#�h��`i_��Ϸ��#P�ˠ�{5��e|e�Cj�\Ii��ZyT���x��R0�xx�Of��_��#5�@�V>��~~_N2��]�2�6d�R��Jj����$� *���3JA��~n�i`�n^	�Ԁ3�l�Y�,���F��d��e��A� g��?�}�vЖ��#�#��6�g�|l��u�j�]��:ԯ�(1�y`g�	⁲�{\���-4m7;�Cct���I�@��K�����H��^e�k��U�Z�	i�ۧ��I+�
$�c-������ˎʡ��QP�f"R�|0��磹��ծ�<�2�i�
����Z�@�1֪#�{�@���~0	ۮ�q
L2�|.(���>u/�[-�Î3?��c�{G��S9�9�l2.��	��W
/3��ֽ��/��_�ѧ����|4������p1���E�z��=Bl�^G_�'(M�G�(��eL�?����oF(�S�*u�mgmcM0��
�^�m���\f<=����d8���3N�8.��_����S������Z��g��s��:�U6ln�0&�Կ�$��WU����jd�*�g��Vۆ*�6u`e�!/B���'S���g���r��&�-�tc��څ�r�Z���Ah�
�8��4MՕ-)->9�X|]��N�.\ʐqغ����e��������Y��ַ^ŔE���j���Uk�w����~�.��0;�$1��T⿢\���1�qop�vK�~��%߇�}��n������t��N����7���7�F4�cjަ�c��KzM�d]�a8�Z�*�4{.�[��8p��h��ښNH�v��#�NWދ�����d<���b����h�s���^�)BG���t	i�̽-�Y2�u�%����^��
�j�l;��/��M'��ۿ:�������=.�^}i���߷)��☇�҃U󨿺(�Z���R���=�/�fS(m������dͳ�v-?yj5�a�<�U;>ӗ�5��@��`��Q�tV�ɯT8cA�.�,,���4s�@���f2]ȋ�)3j:z�k%�4�H��?�%ྯ���3��]@�C;J�
��>�yB'��Ӵ{��"�?�u6�\.�:>�߁�/P��������������$@JQ#��PK;��W0��`�+setuptools/_vendor/packaging/_structures.py͓=k�0�w���YpL�h�)B���B�϶�"�ҹ�_YN�?�d���t�����������HQY̠V���-�ܿ�T<uӦ-���Z3xLb�*�e���KM;D��Y�����yC�׌�Բ�	V�
���x�6��c%�2$.�M� H%��*J�i�p��C�"�2���,��s3Rm��pt�%�e7)��MM�lіͻyI�t�uf��_�����#��{���S�
e��#����'���f��d1�ɽ�{,&�8$(,Έ^6�b�I�`W�pDV9�.����*���v
=ٺŝh7����
	w'�跘n��vc%:��dC��l׬r�PK;��W�sw)�*setuptools/_vendor/packaging/_tokenizer.py�Xms�F�ί�h:��&�XZ�`,'L1���NAV8l��9���8���w�N�uK2X��۷{nw�p��"#��g�!��y-T�j+�ɒft�4e)�Y%IId�$�7�,\d�eL�,�#�mw�0�˜��!�M1�\qx�)%n��E�
�(͌J�V��m�o2��o�|8]�I3!�0���i�V[$��Q�/�H�oyF<!ba{&ݫ+��eMnID�5\�%I�X0�r��������ZM�Ȣ�+kRŒ�H�<̂����,Z9�ۚ�)�Q�kjC?*�{�4��L��r06_��R�Y˰��Җ+MF���u*�v�HMs7	v�-#�W�w���C�YSq����_C�7}�b}G���?��i�Q��*�		/b͸�8��8��S�����ڙw޹�O��U�����b�6գ`�%����}�T0�{��3��O޸7�ZDX3�R�a�z?���\~:�t�&�55�<���^w�$���^\t$�)H�_
'�Y0��z���b�"^'a�4$B�T>��&)o��o���gw(kM�-�a���
�9��s?{������=��q��v{���woڻ_ڻ��{_��tYP������l^�{��rM�t��k��Ψ�9�{�M�;=�f�1�B��v�����D��Bq:u��!/�Jf�l��9'��M.�������ν٭��6��*q��꤬��Fd�������v��#Z��
j�g6�o_z��y�=��esq�8Q�*�=`�
S��~j�1�d�/������v����P��jԗ��5�e�I	�3(���)m~�4�z��׏n���z�qo8.G�y��`2���;k����N?�wN�~U������ִ�\���K%��55|�g����+�s�����vՈ�LǞ��)��
�ǥ�)�#@�2!��@I2��!O66F��[ܲ���ih*(��GK�R�f ����o�G{o�7�M���7�i�{��`斴�}�eC*>j&�?Q�uG^r�� �*7�B��<>�^`b��V9�M�>�}�ɔ/f/`��Y�I3ݬ���ݎ�6�"���6�K=�)ب��0�m`��Y9��b
"��Yy�-#W*Ō.�3���sҁ�'	cw-2��;�Qʤ�H0|タLrKSI*�B��N���D��E���b��2u$M)k�7i�i�����z/(�9�@�wIoE�`_H�B���2���x8�F1E砫�������F�M��nh��j�p{���>L���40Tw���R�~������7��!4�h��J���6�80�+�H��+~��{^AU�4b�
a��iR�Yk�����d�	-�J�mL���W����0a�Ϲq�%�����V�V�F��Y�YWrc�}& (��=�Ŗ�,W.h9<)C(Y�nV*)�Gv��^%����RyA#ohD��>L��dR�kѐ'�8�T�\���c�|��*��XD�dd�hA����0;]U��Bm�u��׽��G�q��{�J��I��.v�)h��T�;�������p��ɋ���z�֛��'��%��ר�%�M��?�y{��
L-�x��/�GJ\�`lDe�',B��t�
 �#ˁ�W0y<$���l�ժ]�\&���jV>~�?'���r0 t-�(ƹOA*݃���Æ,2(�
�*�
_�{���=M1A~�Z*�_�+�Q�]�=xvp(h�/�3��6dѲV�є���J[%[G���f�;�.�0?V�>�~��=y�'�j[�,�@�zۈӔ��ը<�PK;��W�M���
 'setuptools/_vendor/packaging/markers.py�Y_o�6�O���.%mѢX�r�h��Nڇ�B�%����TH�j��p��>���Dje�8�>�9�g~3C��;�ɖ������-iÿ́f
�E�1;FS{M�־��h
�~qdK�;S�K�8"ߖ/���ƒ���@S�3���/oߜ�;;��SR�4P����n��V*R�}�2�H��.�車%S(�w���X��V/�J� ~���]�7�m�y����f	*k���3�%�.�Ǿ��O�踔UG��x>����W�.�zm�~�[v��}�N۞�Gŭl�f�V{��PM�x`�(�p#/����?Xm�n��7�J�E��Xͷ�'P�W���Y�X��ѯ�
�8��TH�kX��ݳŢ��^UEN��*�y�n���I�	<g�k��&�S��+)�L�w�:̧�������HS���?|P$��z�
��l��\��uK�&���=k�b��d���Z�OZJ���a+!���hH��}ۀ�n14$�p��|���r�DΘ�Q��W��Y����#Pr� P�!�dZ�o��=+n�ab�!x�Ѱ�s��oF�D@в�n�\�yt�\�ӊ�eH% .�C��he��s�4��^aP��+����.,$v���.�}5<�/����,�ڝ^���D�4��H:P��,}��‚��@NNHf��F��ڸ͂����U`S$k�^���)�����-���?j��j��Rs4/Ǧ_�Y�+��� �S���A�{^90^#��]�G���˕6���@�Gճ�u0�[-,[�4��c.�[�
����(ܒ#r&���=D�5#;z� <���a/r�%#�uY��
���z��( �`��"��3��1�dL+�Ѭ�6ǐ~��]S��@��f(��
�K�yv6�2=f�m/j�)Z�����̸xL���M��#"{��]�����8�*7��
&�l��M2y��jl��q��ֻ��9��tҘH�Yq!��|��;��ϴ�CX��V���yY�NÌd�g�En�����<#O��p�p�6��)�M�%x7�q��fS,��,�c*-�g,�\�
��Ρ0ي�t�P��+ �ɑa긟��F�/�2hP�&��$þ��N�a��?I�E�~�_��(H�@��9
WĚAv�2^D�DgO�nG�bA�j�<�$���,���~vS��t�v�_��"�,k	�!��Kc��i��>A<�Q�;�3>���H&O�-B�!��;)b=(��+��c1H�d�D}E��!�N��2�*�=��<xMqPY�p��?�Kv;��-�#8�<�a�Ïߓ����d���eDL����!
�����Նu�"jδg�3�ӫ��;�鲻5;)J�.�����ӽ"옰}H��$��
��ɯ��>�i�������そ��O���5BykM
�����,�p�`��2�ނM~X\9`�B��C�����+B�+�' �:u	����I��-����i��p�Q���It^(��!٦���N@�_�7���pS����o��Q���g�lJڡ��!�yq�x_�ߤ.9 &y�0N�Y�J����n>���ʗ����`���Y��yw*�~��0/c�Ƀ[�ZݭZ&"H����v2�\<�y|
l�y���b�;���6[�L�l3uO��Ӈ�w��֛婸͡�ϱv��b����۶o����EA���+��[]��
Dz��GI~
L�ݽ(��d�O\O��_��	�|�}.9���Ϧ-�b퀤8�C~�m�� �鉥���)jdy��Z$����ngnDr���<~eK�9�i8^�!{�P�)�ϓ9�if���Խv����jfty��.��[��N�O�r�#�>�;�y@�J?E��?Ș��Ӄ9�%cr72O=�e ����Z!9�x���]$y�Ԗ3LR�9-F����hR��X���Č�"UXlЃ«��:�W�$�\��{�Yn�*�&x9����K��#x7lE�`�V�#�ێ!��Y
M/}{l����GP�Bi��v�qs��֗�����\Yk�����-b�M�}m��^C�<`4P�a��۹��I�o�ӆB�sX$���(e(�l�^�%�ȡO����"5��e���O�	�ۿ��&]�8|��u�5���&��(��@?[_��W���
se��U�#�&�%G�?�a������[ٶ��U���htȩ2��B��}W��`�O�0a�9�A<��^�xP5p)ko4��S֓w��/C��������.?~��=�1��Q��̎A�㹉9ɏ�~r�X�V�f5�J�W�̰�xG���O"�Aez�b����a������������fo���,b^�u�l���:�!�W0E3�Q�����0A��+RY��*xB�W�
:��H�c_ȵ��x)?vN��*�^֌̀%q\��sH�
Y�5��ƃJo�bYF���+��z��EZa;��bfY��z�f��Q��|���`���&4���3$�oZ�p�j�2� ���x),�;�.z;AB*���
@*��Q&|�mB���o.1�D^��}�p��,�N�0���4<{ڸ�Ζ��Y�;<��;��D_t�4��ñ�#n�g���o��,���אH�/^`ŕXH��v��-�Ä������
�k��p�0����2���=h��˳���.	<Zα,�PK;��W��VN�
@(setuptools/_vendor/packaging/metadata.py�[ko9���_A�,��$�@���c'�d$�,C�Ԕ�q���V4���*��~��b
$���b�X��yY+��6]l�I
]V�<����I���T��5݇c��<���V+�g},lv{�-�[�7�즞�w�����Ng�)R3S�g�<S]�''vK����te�m��v�&����ӥRg�(��^/U��M�q'
?#k^���'&���S��L\\������_^����o_���Z��8����X^*̬�c��?%��nLQ����uY���Cp��j'vW���l�
b���j�<|��\�ty[������@N�3�𓓓3u�3�>�7�Nt�ݺ��;�+U�j��ҕښ~U͞�c�y��&�ΥGR�3��:�i��y�נ��E^Uv���i���;]��4���AO"�nM��|oN��ֺ�������;S�B���@�2U5�9��	{�Y⎎ؐ�'"�H*�p3̪uz�FC�lOOO_�/I��X�U�>@K����BN�����֚4!n;# ��՝a"���N�%k+&W��=�LE�4ϒ(�����O��� ],�T�V�j�
Z&����M��_�k�Ak���{������[X��q�KSB�k���l,^%jߤ��sP��[Ry�Cvy�Š�'���Lz����;�Y�M�S��qR~9d�)�S��|�:'�.2�΍����&KH{�܇��qB�I@umH�Xv���&&S�گ�k���m:'��`��ߩ�����z��3~�e�r^w	r�IZ��"�5YC�d�~��7�濇.�#SmJ�.�}��9�e2���u�
Ģv�n��_��R�q	.�M����~p\���d��F�����NVM�ÖO�Q&�d���sg����SSw_Y�Y��G92m��L$��Y_.��U�%�l�e`o�m�[q�Ȃ�J��E�4��Ċ��ˤw35�����#���G\�#�1=b�{�/ذZ�fw���nsd-u��c�@��@�a�d�zMV�c��im��Q
\P�(�Z�%�diQX:i
&���g�f�G�f0ͬٯ�y�<O+���h�A$WP����^\�`r����K�b�WΎ�o7�o����IXp���;[ H-F����ǟ~���
�@�R���DVT�\��4�y��~�^��\���I�I?��^�����ֈ`p�I¡ʏ��?�bNLrK�1��:���a7rh8k�
hԪ%���^���G��d���r�՛��߽��.��{7t:�?��g�Gu��G>�?.�?p��lm���P������=����W�[���޽�|���"6)��??3x���?
~:<p�ܝ�Q�&���Y+�A�A�p��u���		��f��k5>$�����
��aKNm��!J@i�k�"��]��q~��zq�uSf�nAĊɔ=��g�-59��No���.�1e��^:�fG�zm����;��B[�
��v���x��oZ�4�ߒŁg���n˓3��)���"����R2fxa���;�{�pwHH)EERL.;�#"\�Gf��g���dq�S:P�)9y�ͧD�LL1
I�&�XgB�R�3#6ٟ�$wY����\�z>;WT�)Q�s�H����Q��<�3y��\\���ڥ�M�KU�`��
���2c)�`,���'PNi��ZJ�g�Q��Pi�#�����0>��R챲Z�BL��EDgOQ�B1\m��e[���b�\̬�Qҏ!�b9ǁ;��Y��i�qFU<v����*"둕gR���+B�}~��P�!���=��r�.%!כM��,��a��YEN~��l��M������I8�S���+8k��҄5��~f���)����V�v�
���>VLr�åPe{Ck6;P3�НD�<Kc1�%H-=k���Q��g���a��FǶcR9�w)n|��~+[<��k\oW��>Zo7SϦ7�yF`���鍺P���:�n�(QA-;�1S�C��±<�f_��G��Շ%,���*MN�(2�Yt�D�	Y��C�J9���㼅�OF.����X,���X���d>��˔��H&T�6t�@�ܻ�������|iOU3р�eg{ �"W�z�4��d@�^Z��?N��^YF��D�SbG2@�P�I�W�
�?)NeDo0��dN�Yyz�lG��$��H�L:�jq�}=+g�P������ˍ�c#�@?��8�_͑���i�l����2��t���ku���I�魏F�?RF9�W��.ܻx/�ILM�Ar�p���K�+�"�ߝ�]�C���9���ۭ�e�C��f�Ko\X���&��6y¹�qS�-w,IN����D�[^�P[f�m&�2�!�7�(8�� �E,�V�N���Ûr�r@�9aJ�1'��@�:dl]y��eFN�˫�1-���mƓ[Ȭ�iSo�o<%﹩#�r�3������j0�$N��
3��)C�V�p�.m��Z��7>�q��M��X9��r�+l�'T�-����)%�ْ	b)A)Ac����,aR�>	���]���ȱm"4mEq���ecɞ�g���Ē�k�ֈ�.���}�|A�g^��<�M7�(u���������qv��>����S0
���}v}���Bx��u��E���=�h-��勗Ɨ/ ���L�t[��hP�����
� xC	�節�Q��8<�w�z����w���O/�X���#j�Aͽ���R�.ǫ��ceiT�/����z�s�����~N��r����rP#0g`9�B�^��{`��1�`�8��
�)da�hò�:���1@`���)��F��L���w�(,F��
s��Oˇ���ң��<��G �0ڡ:�'����	��<��8�"]��E����g%r��x��ב��E`D)n��	���oAUU�튳Bq\� GY�9��u���Ur{��%�B��t��ҮM~�ٿB�Җ�݋/w���{��.�W�j�2�KV��0��
{!���S����+)�ȸv�Et۔Q�!J��8���R�۪��C�C�����]>~F�Z�K�XJDX��4*�7:�Q�㑓��&m����B�=��B��%2��<���\���+_��A"���8�"bl����4�'�76�T`�D���G53���4�4x����v��'x��Ӈ��D̦k�`ws��k��^�ڑ�ɨ��4���0�`,'�*r��,������TƂӝ�d����÷/���-��?"��DF"�,�2�L�
��Q��n*�ZJ=o�m�QsXU,r�<0t:� n�$��խfN����Mθ�)p=Iu4p2]Д*фQ�E���t67���_���0�޼?�y�B��'#[Ha���iÆ�^�\�"��.������eF/�>��N�1��w �;t&�W��ՅA��8�r��tT�P&�g�_�{��vA�_�F|	uD���%K�f{����5��������c@ MX��tD~�$��0ȗ�f1�ϓ��jd���d��qub&Fd����`\��Jjy�F���Z�_�jP���A!��E,�2A�@����y����kF�)ح��NѮ'2*O�n{��� �4�����p���
�(aƝ9���'d����=_3�u����[�z�F��J�F�Z�Y����_��1Z�f_��h�7��uh6+f�d.FeGA��R"�N���4�*h&����1�G�6�C�y�/��pq�\o�™��e���[¯�j)9;�(�q���������j<���k���!����QQ��M�ȅ�*1mz���V�x��v�aW�R�����p��G��Ow$rd9�G�u�TA8�i��-	
��C#M� �?���İ�\��	n�aZ�GAɷ�2o��]d����Xj���M_��`�{�h{�$R��>{��$îh����V����sd'�;C�345H�Z���
Ez
]�'L[�q�Mm�#�1�)޸�L8�DY<��5ٝ�|[�Fȹf3�IӘ�6>�đ�)�fg�U��-9��b�J�q7�RN�"˷�^�1rG��l~m�Y�fڬ+/�%+�4�=�O:�%�,�4.�|#F��k��v2U���S��{v��؁����q�;�c��FG�i.�*�ɤs2}7&��"�ˠ;O���J�_�΍�l�H���껫@�l�#��I�#d\s���S���wH5BG���{]�M�Ӂwq���!��lS�r�%3~<nv�D�Q�Ed�⨼�[��� G��)�ř*'�gGw#�TI�e}/�$�~Y�v)�+�/Ԩ���iw���5��������m���%�>�\&?
�RN��و�0�D|x��1�e9i�Ŗ	�C�0t�)ؽ$U
A�$y��=ko�� �� �7:����7r�_3b��A$�{���K���ƹ�� ׊絒N	UҔL2{�3.Pfq�����I�m�� �h}��M�3�:�ƒ��"����_-H5�ϩ����
Tj��-�{�����/����	���Wj��D��2�/`�ڮ�ֲ:XH*'UQ���R0�;o� _�Ƭ}G�#���3r�+ư,��G��{�������H�����'s�_M W@z�-��lqKٝƺl�τ[UC���}��㢪��v1n���5��J�:��1U���Y���p��e����I͈戆D��=�#p
?҃$�|A8��B�ɉ�j��M�@	�.�*�ʗT�v�s�&�Kj��
���L�1ʇ���u7<=��_��/��W�$��xb�v
>�C�![J�vW��Ȍ���e����%�EY��Od���4�j�<�Vt_p�N�(�蜦u�ދ��0�zH���J�?W�~3�W�郧��]3���]��n�o?'�������E�ݡ�b���~薜�"�YyK�,"�y|
�hb�e�_3*���{=ž�mq�trߚjɹ���*Zb��u�wݔz�o���ZŜ	L3�@�p�����
�1E�ԇ7H
�R�2���1��\vuh��y@�:����ݔT��&4��D���N�*%N	9׸����9jH����C:X"GL���h�Ӟ�d�Ų�g�����u�E^���׫��=�=�$�6�8b�u�y�D��N�vb���'RmN�f.��	�r̅�H��6��BB�g��)5��ݬ��h佧�p.H�3R�J�U�H��`~˗�n/�9S���Rۯ���,,�~b��I�I��A]�L}
�9���u%
�t�J��[�
MZ�,�e/U�}�G��Za����%���l-��7���~��Ш#:=���d�
���K����L�Yyѕ�ts|㩸N�Q��z���x���\O:��p{��'�̹�Z�V�1Vq����{��z	���.a��~l��K�~SZ.b��E�o55wq��K��
����LB}�ES����#'76q�A7�τ��Nc�/������g������Y�:m�=ҫ��?PK�uW%setuptools/_vendor/packaging/py.typedPK;��WDz�8��,setuptools/_vendor/packaging/requirements.py�VKo�6�ﯘʇH�"
�:��`��
;M�!�+��F"��zc��w�ԃ�ʨ�%��7�!���V(E��E�*�ĆK�he�5�-�um@�nqڰ
�.=,��\���~�>��d�`ޞ��n9w����?ߞw
���JYύh�(#��{�+������[�LT&[�D�(m��U%��i�W�V5�}#�#t�O�>E�M᪱h!�R4Į<8˝���n�k����\Z`��^تo\����c��K˞ϵV�C�L�����2�\*]�
r�l5˟X�r�	��oD)��~�y��T���(%��Ѽ�+�8��z�DQ�ާ��:�C/K��N�5��lU[���+�>��_>��
d��@��X�F�/��ˉ�j�5�ʄ5�kR0�fK)���"�:��o.}��ؙn�0|) �$j}`E���T��8H������>1	;����r,X
F��m�@1�B"�N������?%��V�PĊ�v��	����ȂQp��#��Z$� ��$6י�ӎW�i��w�	���T�i�R<Yrp(G�$}c|���ǥ�%乐��ylxU������b�����YI��Y����^/4Z|H���yÛ����
M���)��$�q|5�Sy�@ۼ�nk����1��S��()��?�(�LDV���YL��1D4/���?W��P�$����o��n�Z�7o4��Wh���N�Jn+�I�XA��/�e"�:��Ce��^�ȼ�<s�@Ώ;,�{�9Vdef�׋#��`Z_~n��<�I
�}a��A�u���)�0דS)�e�=�g,~8����~n�h���H�v��I<]���pt��B��ן��o��Č$O�n:�!���2w���Š�������0SC� a�bAv��M��_%dl��E�&�|>X����j�{����Gɡc��f��6'LK+��x�q��)�b9�	SK~,����3�C_C�m�%�>�Np�z�@���N��~'�;��]�1
���lC&��s&��>�y�EyN%N�u�B��$��ȿg��Ś�NǃRAn��*]�������5}�]����{3!xq����܉�G��0=��9����e�P�#|�Z�p�dž�u��gJ�����PK;��W7��]3!&�*setuptools/_vendor/packaging/specifiers.py�=ksǑ�+�`�P���'�'�JNU>�)V]���䚋]dwA��~�����Aɉ��$r1�3�����/�Go��*�L3���E�EY:y%��"��2��ET�rVE�%��t�L��xX?�A�UZ�{�ѣ��%���}�[5&�^A�{������9=+��fذ�R̋*��r�.�2��y&jME��Y�u:��8�5Uu%��|0�ۋ��,f��&�J󫸚�Iz���t6/�:z���ͯ�Eݏ^�I�N���[�R�RH�b��d<Q��@��(�J=(��Ws���ti�gI�%�L�������.�j��ռ�铌�B,�7��z��j.~H��at��ǫ�5�R�b��E�N�?���ׂ��_�yR��ѐg8����.�Q�(���4?��q\7�>��)��39�zt�N� ��|ooo*.��I!ʉƪ+�D��ѩ�n@K/��2�Ҽ��|"Ի��{<n5~p'�ѐش��(X�$K���v��l!��eQJ��]����ry-�(�k1��.��hR��#�s0��F�2����ak��z� r ����E���ԈF���2�;�ě2��1�Cԝr4�62O*#�j�q��!a�}��f��耧>�TP4�&��Y�t=���O�y���@.��Q2|�I
��)='�����Jd����Y��:Q���"E�P?����?����FD�'1�cR�Tu],�i4�[���;��뤺��J�z=RI��D��v�l���b���R�Q��2 Z�覥���Xȶ ,���t�ٴ,�%k`<#+E$�g�ds���'3��7�`���ֵfO��!��e�^m� P
@������H_9�x�b	����i���Z }�RL-��@����#b"R7�)b4B������?��ws8��:[E"G��#�i��j��qZ{��F/�vqW�d��n�'�J�
�g	l�
TO�Z��	�̵b�'��P�5A ���,#Ȩ�
 �K,V�#�O
k��J0f�}����pp��7�Ʒ�4�
HYe\���i��rj<(`�ɺ��Z���h0]ר/�Y'm��5���m�%����qB�”x�ܠ(�z9�C����tRڳ�*��+r`o��N'����٢�fk�s�<����S�4gᤱ��(�|��v$�%a��Uh���şt�_�H�n�*JPsi	��eåN�> t@�82���X��G�dj��%Z�E�,��!���H��gr�6��Ӡ�t�%G�@�aMMܢ.����� "<קI�hi����_.
i^��J���ت�y����OԨ��/û����ݓ��)�{w
{�{)Sq=`9�T?����O�$��U�"�������MT�d.�j q�2Ͳ�iA���(KnF/IB�x�L�lW|�eqpmHy���t9�_4^E�?�>z����i)pwq�T���$_i�;��:�F�����]3�&Ţ������$[La9H<�&+:�\j5��~�d�[�P^��3�ؼ	lE���a���_���w~�64)�)Ho�����O�
/�,聪�߀f#
��
��/��Nļ�%�|�E�.��Z@@��hRd�|q��7 ��b�77���<ep��`�E�P_�6(D�X	�vu��s���R8�p��y�&!��SXA9%,��Xz���h�H-3�`��rKG:�m�������$������Nb����@��\`�|L�@�{[1��ׁIg�G8�E�k{R1/�N��Px�ǘ��hyR7W�O'��}4�o/�8�S.��h}$l��P�N]\��;uU�9���zG3����Dž�&B[��1"f�#I�[��j��;Ԛq��s|
���M4M�F�]��7wTO�d���n'���M����Gw��rһ7d�0ֽ�[ۢ�n��x�#�|wȽ��.�{hޕ=���F�}��e`<���}��u�Dyp���ąA�'=�ߢ����O%��3�S2lՑ)M;Pu�k���;M�Һ��8M�	��j_Xm��ꬨ������8�EݷR�'�e��t'Q����Yl�	��u�1
��V⹍|~�l��Y&�����Y����8]�ؠH�&����na�i3K�E��y�w��+4��)6�wM%GK��x�(oxK���X�;LhUP���+�-�pJI��aQ��H_���EXF�WK0�1:��EI��jkp�"?����gb�����{��>���v/b<��LoWف�aN����A�M�^�w~�1>����?��s�b�z���ϟ=}����<oF�yoV�˰3�:�ص w���'���T�E�'�Q&��n0ys�)
���R�2��y��]-���f�ه=�n��H��1�N�7�t:[;ON�4��&(~+�"�zM/0M�0����mF���;ŸR���@U?��`$���{U��F�[L
LJ�2�2�T9��	9s��d������	_��_�Ku�N�	Ƹٻ��씶�������۷m!���Q7�E�u���X�;&C�\�,�q%�rr�E�F%�X/�w�Bnj/;���{���A�g���ff���0P
�:s��1���:�yo�����
��ֲ����14;���A���:�x�뺞W���~r���}8_��E�p����Y����ǿ�j�ۍ����wtr��?��?u�ӑ6�[��b�W H���t*ε	��ܘʾd��r^ȟ��/'ƅ����qxV����,X�,ͧ`�{�[5i3"�]EE��I�7�
��(n�1w�bQ��tt�h��(tA��
ʂ���
:�W���,BY`�J
�
t�J�0�`��8���ϴ>C}:��t���8w�����R袔.cP�p̤T��R9N��Rxp��Z�p�Rʨ�1q�l/���$��ȧ:������k�M5�og��G�{ނ�ǃ���
J)��ܐ�8Z�A�bWx���(r-?m%N+���Hf�x�Y�|H��O�
�z#��	�V�gyP�_m�J��z��3�ď�/A�6���A�0r��8;>o[��VZ�p�L�Z�JE�˦�]�ɹm��Q�.��i0i��w��<Kr�cފ(��H`L��sp
���� ��t��u9$�]2�����2	�?
��<}[��5���i��'_�:�X{X9�`YK�5��e�	�yqA���-Of���C�=��,�=L��wڱYjCv��v{<�X2tUbf��Gs'_��b�C��6�c���u�x��_�m����)���I��<��PҼ`�P.��Z�p�R�>/��{�(�a��x�C:��C�y��\��(kS�$<#WᒨgC�-_��6yh�6�L�i����MtS"��g��Q����<����:�m@���p�^�Qh=�f�6�_���x��B������������:�cL<@rꙏu�jZa�1ʶV���Z�>�N6�V����?Rp^�L�����!�fn�Z���^��A
K�+�H^�����+Q_8��<H$�~�Y�v�M�Ac0����5Ua��rѕ�By�juV��?t�U]cn!Ӹ�$Z��wL(��r�Y
˺�=3�;}�s�,GՔKP6w1��>MO�t��+���>�B����Q������:��!�{(S�-d���b6b1�iך0�ۥ:�B�5ދ�T�p�`ŚS��&"���M�3	4[Ll�B�61��h�����J�f�˄�ܽ��&�WO�:����;���hB?h܉*R�<�Ҫ��z��Nn��}�p�CG0��u���]`�\AO��ө�B�gƨ)R�mW;!��W��|�iqG`����Z���#���x���^��+:�?F��J^R����J'H���dS�:�-���샖�;��K�p���!�`���/,L���<����8K'����rLw�?	��	��B٢'d�@E�>�6|�x#B&$zX�,�_�k�
�Z�0�o���Z��`jAn8�>D�A�k��M��G�X��'d4���[H2���$�#G�w(������(z�\��jG�e�v��q
��ɴ}�﫮���HՕd�IQ�b�o�n��]<L8uW��,��0�[���D��N) ƅ[v�fϙ0���L���ކ��
�$J���
r��-UD�I��"е��yI�I�8�i���#��\kG��B9�3��._��u_���5�={ᓒ<�h:�\%Gg� C�F`h���ҏ�A��9��8i����r��A��w��Wf�9�c�;��޴��.�iuV��?�nx�� ����t�e��՛h��X�:�:�]���������m^��y�P��9�����O�>�lv�$(����2D��ͤ�,����O]{7��t�D_�pT��HȾ��\��[�/6b�4���^Tz'��:8��*��q� F%����aG�F4I��"e��6�_�(���i�%`L3�
�ƀN��6Ͳ�K��2�����<D�LMyh�ab��sPSٰ�j��Vͨ���*@�/��V�
,TB���z�0�������ɗ��,��霋>���o�2A}tL��K���櫑�5QL+�i�1���0"��ͬ~�Ɔ��\5�pm'VSR�����p���z�!�h���r�QA밹���5���W$i�Ϣ�N?-d�mPC��[��!k�S��=t�TaE�?[��
�`jWE���.z���l��25޵|��RM^gs]B�j`�R�\�2Gޖ�>g�;ś�C,^Fk��?����]Էm��5�#Է���{��l�K�e�e�v��h���v�Uw�+7K�NB���8a�WH�'H�#B��%C�<���������k��@�_*��(ͱ�����^�+�IL��{-F��UO�M4�H��0W�͓�j�s;fD���i#���*����:�°y�f��5����˱qPh�o��;�,f�ύ!�p�ӷb���v�]���6caL'�C�v���鑕Sﭠ5��Ϣ�ǂ��K���(�5�]gp�4��*�+Aᡞ�Fӂ'�w��
��lx��Q�ֿ�K�I��2�!��pG�\tw��Nz�:S������]u������M��M^�S�ǖ
mhAM̙\��t���dAy��Σ��~d�ي��|�F�<KH�Vw3�r��L��U���ٗ��M*�8@�p
ݟ�2�aS�kc�
�3��^Olw�z:��Ꭼ���2�8\�\Ь���K������%���H��9O��QL��讇���H���$[AI�Y7��֛l��d;��xeT�xj���I�r[����6ZOS/W_��z�zUw�T�S�S�'���Cb��o�
��U�&�q�cZ��Y�^���˞��%��V�*��(j^^���G)\�E�Q��'S�C��S0�L����K�SCy�fI��}����`�lα~t��yo4��b�`�V��d'�Z��{����|0z��x�,g�;�
����w��iF�1e%(��\TC�x��C)H��Yby�&V��}��e���G��H�,C�q��O������GO�X���A��+a�M���g���
a-�o3�cB�R��'r�ك��|��Y1��%V>w����d�r
q1��9{�M.%H�B9��j(vjauS��J+�e�R�!��>#鵿BO��	�
|.Y�-퉽��*��v���,.-r^�G����nK��rx��Wg�SYQ]i��y�Ҝ}��I~3�hۈ�dׅ;UZ$p�n1њ�kDw�ph��-y�=&���\�S�ٳ���T#�fZw�����Ɏ�@k�}��}�ZU`�[Wi�7J��~��:���Ӻڬ�%u)!/2�G��MY�Lflߵsy��ׂ��"��U�6�3��X^����}�h1wŕ3iР���Ƹ	B�»�2Pk�P7Q�]Zz��at��{�\�GQv�ڕM5�ݯ�!�|�;�5�F�nj���xn�s��)�)EF�<f}��Q	�J�h'��TUu��zU_��E����zZC,�a�a�*h��ֹ�d^���=3����NJ,NtW�=��V�0�}a�T)��˚�u�QJ�������ų3��O9�1�#��z��<�L\�;я����~bUqY��rKト����akrp�,��9+*�"wk�y����$z7�ށn��d]0�BOn�����#��L�5����Gg�@�y�*��c}�_�Ky�W*��	��г�҈�	�F�s�T����䣨�����0<
M�h)��ߑ�5X�C���c&�~O�ע�w[�D5��wgDUf�Ѕ�*�W���IF�N�_�ǣQ�S���-e�������	�K7L�Ğ"�^�b����1�wkrc�[v��ohv#���2l���k��6�lk��[�$����wo�3H.ds����O�i�������J�0h�?����)f2.Er�#��4�M雃�$���]`o/�A��b��	A��e�Ԟu���l��o�Up�U��
��t���,m�>F;�B�ƞ�h~��؊W���˴�L�;L�qָ�0�"��3��9�c�lsn�6!���1�8�]_�9>�7�˥���'3ށeF�lrW�3���f;��봑��&����hf�p�"f���[:���9�mO�t'jx·�RԬ���:dv���I���f�Tr��;[���RE7`_�>�jħo'�B�[��Z��{r��^p�0�C�)���Si{�MwG�61��<	��L2?1`K�q�c^�U|�
��ۂ���rsV�D4��<�(�od7��\b���mT�s���� h�>���|\s��ȧ�e���E-t�l�T��$']@#W&0��D3K�0�k*�>_�oMh�ۣ���s������
���Z��n�u&8�
h�����S���q��;��`C7��8�l�2�3����nr ��77�	����z�ON_��WX	8��U/�B���;��J����w���Ŏ�|�������/��Si�1�j8�]��T���uJ����DO�2`�prЮ4x��epf���5�k�uܣ'�j���ɍW,�ek����Z���M�k	Y��~�:��.�ԼdСa(������M .��*�5��a	My�
��e���nj>k����<�fQRm3�L�����%�u���کV��a� 5Y\�J��=��ϼ�V��7
1�hוּ����dk[��jǵ���l�gz��xt�6]]*R0��m·Ps�_�htӳ�m�n&�u_k
n����Ku�G^��:3`�Q_��
C
�*tJ�q�m���\g����U��
M�%�\;��At<��-�
�׏n�jH%���3�ݧ�H��}�yeIND����6����f��]���:�]�ux�.0����5���kr�ksl�Ć`���B��kF~:A�)��Pуh~�E=a)�W}�&P�)��by��zX;m��Y��b壘ܒi�a)�m6(h�(,������
���F�b�X
�a(ݾ�9u42,GZ��ꬾ�c�u:YdI)K",�p�;10�ߔ�Y}^��B7�M%��֑4�������Z�1Y�
Y��L�i�������f��2*�$C��_<N
-GR���.�{Vя�������:��t� >uC���W��]�~��UN��n�0�yThN���?t7g��x]�����	�J9�1��ˆ.��8�8�2�ٺ.�+����z+0�s[xUa��
��z�~����kQ�����ܗ�F+=��=��^�dsg;�v{<�������J�27��vrK�LV��T��vT{*��*�ʜ`k+\M�Zn��g�<�kȬ�r�u�[A�oe]P�VQ�2ee���e[A^_S�k)��)X�گQI������'��:tbu�P(
�ua��D��{י�N&��k�ܝ�\X�)d0��vog���C�u�ˌ��2ce�Yz��68Z��\]T�(��~_G�(�#弢+�	���D�ѣ�
I=}�m��
�1�8z5`��i EOe�zV_�XJ��c3�fH�����>s�נ��r�%��	��隼4���.	���e���q�}��	E�/䉝��f�XYj�v(`Ě2/�~�چ�ۨ��†+q���W��a���a��b%�ؗeSv*)IU�pIV�d�b�1��l�,_2����M�ܲ(um1�D�Mm_pPp��Up�O{᧚�}�j��cr�<y���7��--{��^�+0��-�w�+�K�p������l�o�	w(�r���PK;��W�=��m�F$setuptools/_vendor/packaging/tags.py�<�S�Ȓ����u����9�Dž�G�$Pk���(J��1LV��	�R�����I�c_���\�X�zzz��{F�`��B��H9�金S���$OX�%�`�%g%/��s�q��g�Q�
�O��"�zl'��8K��佁	لs�������ɡ�0�{E��
7PP�e.E�+�7�6�˔��%��E*�^O,�yQ�4��م��L�,�oYM�E>�R�;+�r�gsqћ�������X��x����?N������ˇG�8��!�j	��~��罘�C��P��l��#``<M����~}RC/K�c��_�[ų�sZ-��/@��Y�c=ERh��q�JEV�Ẓ)]�z�1��a]x�ˏt�EY��Q�NV�e�i��!�Ld�y�S<�Ux��a�����'?��h�����O��=b͙,�!�?�0�,i�`��!c���/f�z>�f�`h0�wD�g5�����{�}���E����i�
�B��o�����l�ٳ���XJv_�)|A@����<+c��1�2�`e!�)��1���<�%�g�������Τ�;�EU�zh۩�e,/�n��劁��~E�G|`-q*sP�%J�'���.�H�y)��wD  ^��D�Tз���s�j|��Cd�����霄lp�1�&`�W����9ϸ�~C�Rd9��4�=4�?���5�ͬd.[���8,�Y�+�p	���/@��bP���}ήE��)<���*�2���b���e\�(�K��4�L��}
!�尸��+[pP�d� `�"^!V���bAе�Ha���19���L̖�G����^���*�K�=	�K�_D���,+d'�O�J�.�
T���L*�P).210;��%�I��9�I~
]�xA�\-�+�
� �A2���`X�x��`�t�o@ђ��j�3�0����������#L�L����1hl�rl��f-,��m��o|V�i��5.1g�K���I�F�G
j0g��yy�!u�'�&U}oLߕ۾�F��]���D1�D�&'Jy1|�==|��MK�x��׍!���k-��W��n=r�^��Zp0b���	"vvI|ܶ���ڵ�kÈ���c��S�&w�o�V$
��
��fƅ���>�_{f���S�c�	��@ѯ F%�<����j<��� �:@~���� x(�ɌzJ�~$r�'C0J�~�ƿ�`�s)�TP�#�j�*;����+5U�+��'7���upx/)^�:V!$�f��@
A�v
"��ŀ��cq�A]1���0�L!��e���0N�>0��P��@��h��_�RD��E*���⢏����q����|�􂓾Pʩ�<�ȮՆ��^7�ʫ�LaǤZ@s�@�8�̚�\P�k��iu�;�����j�_�&b�p�C��Yv��E�_���I��{D��Y܅$�w��z�W_�MY�4^���`�inĊ	V0��Zw��c&َ�x	z�e_�ѕʾ����7B�����#(h��hK���%j�X����	�z"�°�%�&~��j�p�7=��g
Z�
�V�-��?��n���q�kּV]���bC�h��]SPώ�!���F�N���
��Z&����{��`I��A}��s>�S���e5�/�K�3��@5�38YE��~�{�V�pB<�1���h�c�e	9�
�[ʼ�S���Yd��A��s�m��
z0�ܖ�
��ԉ8��tO46~S�{A6, qL!l9��&�z6԰�e��{ϟ_�R�i��C?_��s!e�����x���)��h��xg���_v�aJd[���U�:vT�ڭ8\�����{�@=�q�F4A�V�&�}��T��["������O?�����n1U�
�?P8����"v܈1U&fy�
�n������hr�_�-��<>�}��ߊf�+]���a�f{�|<��S���S�u��w�b�V"���U@�y��@9���ӡ��g^�%=���/�&#Z���mP����7�Yҟ��ɝ�Nz��5˶���rKk��53��"�����Y��_�I������o.���}�SFE��^���4�����Ls��s�"���隑+�!m��8�g�.�=
�#ב�"8*��C����1�m`��yj���^p���I�}����%�_��7�!1@?
���.@Pe\���QяS�ق��Su
���5o`cy���g0s��.ȹ�9Q�ĶF:>��$g�_��M\�&�ǜ�tb`PRϺ�Do��ihl��i)MA�iB����V(R��x&
�̟Q��Do����A��BP'�Oyt9�Pvk5
֨6�ID6�1E�5��#��J,\d�\�zQ�UvҊ
�`M:�{P��4/wT��s0�N$:AҿR��>^�D��H��@�;%�hh��1PG�*�Fg "]e�D�	3bqk��X�	�${�_��Y�͌/K�f��E���
���;����[ؑ�դS�%cw)��N��*��"�W48LRHiߠ]S����!V�|?>ѣ�=q)�
j�����8�hVg���
����h�хy;�����|L nXv�̭󡿠����}g���eY�h���瀞��S������i�
���o�v��Q���9VU�!��������B����`~�|�B1V��w�8
�R3^����$ʸ���8�Y��G�����f���h��5�y�����EV�2�d�o ��S;x�H��$.`�4���H=���(^$�/��q��?����/Y������w���j�j�\��儂�Ƣ�(�8E,����,.�7�4s�U*��z��>0��
����G����MW-S��.c�O��nF5��5���P,2��Vٿ��5��d%K��`�Dv�"Y�۬���z@��3��"4�RxG�Tvc���9�8|I&���h�H������uC��Rtr�GWޢH��ڢ#����~<��X���V�%�;���Iʫ��۠5SP��5���w�ֽHi��A�	!��[�,s���Z�$��Jw�KP6L��}p��$�ڵt��M��u�f~�۞�6��bH]�yĶ2�[��=�ħz���Wi1S��	V& bQR�������
q�_Wt�Nw��t��%׀u����}�^��i>s�6p�[��]��b��O:T���:P�E�����ݾ�.6�G{��A�sEb�6����:���
�M���R1kˋ���ԧ�0�}�u!ޣ"D��ѠF�mO�e��CXɕ�+YOO�h��z-eW%�rV"��t�xn�;[�w���n��*8F]�zJ�%�P���m�5Q
�d���	^�	nV�e$u��4
�2�Sg[b�ٙY�1j]����ٚ���Ͷ6�0Q�_���|��q߿3�����Z��s�SN?�{YOЮ�
/:cӺ�Uc	����X�=��9���:.���e��-q!���T�6��8@�o�Bl�X����?�\���P���=77��n�R>Y\�"Հ�}��#�C(��.���ף��g`mNon�L��8��}�z�i{k�^t�H�9�3[H�.I�,@��(�y\vu1�	�uW��_�bßHL�.���b���?�c��j9�Щ�Ӽ*�xg:�NN�)CÑ����d�[��_���F-�ߩ����39���}��f��b����;/�m%s�[w{k�Pe��ӝ`6�d�UdhĤ.�>��1��I̹��m�H��A�6B+�2Į��{d��ܲH:�`L)��	�_5]_�\�̜7�My�����:ڮ�	Q����䄏�s���j.\]c"D���-��3�c�Z��$�|\\���恸�|Y��ha��YUx��p�e����飡c�qb�=P�C�p��9����A���E���))gf��C��`�e|`�d}�M��`?��jC�tc�
rm������ڳP���{E������m�D,<N���ǩ��7��4ƾuU�����~�g���&�I���lݓ��!�	��n��A��-:!C-�3�]���_&������c)�?���K[�]{�,��N�N�p�E�NE�e�P���w�K��q�+7���qՙ����_{���_�0Sc]���mp��I!��	1�w���+l��ps�ǒ�
1�K���&�2,�se�b
�r��.7�n��:^I4�v��ީ�+�5բ�����!�dа��"�8U@�7��boR�cio��|;�	sy�k����oo�;f4v�.u�[�Чd��BW�	6���Җ	&����|@ePQd�aMQl�Z�ԄZ�߁ya�_+"A�Z&�`ih
b_�5�$@&=�5"X��_�i�T��֟�3VKpKE%��}�O��>�mie�N�`.l`�?��^ϡ�-��������A� 4�0~�3��C~��F����ck��ė�]�W\��W��,�l7с#$V�Є�5p�Ȥ�9��`�����Yj�M��H�.�q�ۻC6��<����;�!�����hD�Q��ӌ�f�2�ƀ�{�c�݃�;��$k:vZ�ʟ��)�'	�I��
3:
���n�u�����_��v���v��M��&�GQ��̤F�bO�<��HM�&���X\�L�hhYzf��r���٩����o��׹k�
2�x75��{��Zz�$�?E.��3�9�@K�D���55��Si�/8�v[ԩJ&D���s&�����6��z7��Ⱥ6��t�1���S�}Y����R�]S�W�-�.�$(���M������
w����4�t���z�]��†!�r�HA(�;�_z��z�оn����_@�R�aǓ�9ev���}�^:Y�Z&�c��:RT�ש<s���*�SȮ��4���Evc�p����`����7�f3���'�fY}2Q�J����=���Xۂ�T����^ٱ��-k#R��^���<Þi�M���wL�Ƭ���D�w]�:��>���؈3�Sg��,�F��S��:�zoT4t�Wg�w ��]�s.�9�CF����3�ZR��qV�'�"�nws��m����PK;��W�*+$�%setuptools/_vendor/packaging/utils.py�Wmo�6��_qU
Xjd��R0�}I��[,i���E:�leQ#�8N���#E�9N�b3��"����\�����;��r�b!1���P�Z!(k	|aޖIJ_�X_QH����II��w�.�����ũuX�5���mSK.��bK�\@��e�
!C��\����%�D���kPےK�����U3�\nK��"|)(��D*�V
U����e��L�Ę���u�\#sV\'9�l�]�λ��Y������{~d��YA!I%�șq�&3��͒5����s�;�Q��I�D���b��,H����
��?u�>���u��a@�*�I���@%)�+^�!�����3���v"�ȘT�����n곟�R�V��b�C�Ӥ�K
`��%��C�3���|�ѡ�S3ٜ���W�\PT�+2��(4��$��%S�1�
��{߳C�_���Q�Dd�����0�����:�� �S�O,�4�����:�k
09ߓp(�+�S�hG~��
�7jU%
����qP����x��\?LmS�}��8�W�+c%�hR��[|
W���1i�԰3���$[�<1e��8&�8�P
V�,�@�T�F��$X�hL���v�$[`Z��r�5�`��$M\��P� ��XA�'S�u/5���Ķ{�CegCm�V
oR,w�bh��q���_�KP
^!m�*��V�la.���ֈ8vUIZ�G�m�Ӓ���Z)D�/N`2��d��%��p��/t���bl;Ϭ�v�������^��7�~�ok�j�M`���
�f�u9*��Q8I�I-���à�0��r8�_�)r���<�い�����A���5�Q/?��4Hd��|q�sF[��p��]O뾫��Ɯ���n2�~���tz>�9�NӰ���F�9~�*�{rl�R�|�uo�Ǹ��j�k�w5���.�����A7���1��MJ:��pHAKM^�nV��#jf:P{o�',ܳ���7�/
��܈VF��ȟ�]#u��,R��I�s>Gf3K�
eo�.ªP��iO���iR�z���_��Ng�^�|Q7��95�F-˜��ʴ���@��Z���|�N��� ̱4�K���e���L-���Tc
.n���� �Y'*]��5�����q�꥽ɍ���������>���~8���)�s�	���{��u�[��x��XOPL���]��ov�-Og��c�]_�4��nÖ�O��W�^p�8rV�aRS��:N����.�J���p���=�|c�Nx��{i�E7U��g�@;�+�����;"p�3`�s�8���pyۧ9-Es�|c�Փ�,���e��m�h��^��<BM;/4{�Na��H�&�uw�=E]�
!z���bBLR���+�f���1��%�,֌䰡M��+�R�6��T8d>��l[�9�-���+Li���M���1w��?�S?�'��PK;��W��x�?'setuptools/_vendor/packaging/version.py�]s��>wFdL]I9y(ǒ��jF���Xj� �x��X�(���߻���h��d��C��/,v����|�(6OR��3^�I$2%b��b!Y��r�X>�oV<��5ؐ�$�J���!�YL`ߟ��0!;��x�ٱ�0�g2�M8�b�������sɢ|�JE!X,
��*�A�C�IJ��d��1���|ɀ�~�d��f�%�U.�.�H�g��<MET�ce% q��i�@��/6+ n���6C���)��@��
��t���+P'Y1d����3É5�p�
�����;��I�@�~;߬ク�Er+����S`d:e��"����ɇ���7����C��Q~=�ny���e�gH
$��1}��!|z�;��4W�;q��먚���?��������<��6��8��&(����!���+�98��e`�h\o��h�j��9_�0�?��e��r�w����҅.�+`\�����l�,��oaeq��<��(y�ZW��М�s�'L8���15��,�0�K�d�����]��������cqK^)�,�?Sd�p��b1׫�o���?`�G�O�lAp��N��
��00�qttd(��Q,��4��t�4�0���<��>uV�l�$O,qM���^
�^�3�����>%:���e�Z�R��s���ZK��A����U���+��,� �3Zo�Gb1���`B�>DT�#�fz����ú���J�{fҽR'V���N�F�7b31��3�-:�t��j1���H��K��*&��� B$7����)y/�bE��a�$���*QI�
�E����ɩ䞶2��[)h5`�, �&_��;(gw|���osP�c4S*Y��:��G�V�#^Z�,���֢���d��\	����}�z�u,�(�}^�����W�c�B�JsC?\k����a���u~��/'>����c���?��u��5����3_��:�i2bS�ѡ=���H1�R�eAɺ�&�׻�a��2�HA�K��d���q�+6�b�`Ŕ����7!;�v�}M�ו����G���\�<�f��;N_�d���BC�Aj�F�z� 
9�2}���z��.�������3C�����!z��OW�%���D�
;ˬުa�+A�~��L �޿�2�f�-�i6���>�Q��]Ҹ��~��T� _��4U��.A��U6�V�t�	�A&��nVE�n��"���)O>��Z��d�'�����ͧt��\��ELpol������X���u�%��Rɵ��eɋhђJb��T�Y�oڠ�&�`���@j?ac�X΄΂ ����!w�fW�O@�|I�61��U�����d\QÐ�9/��^�Xj��Ә��o94�JZ���"�}����ئG'?�����|ڛ��ZA�)@�%,y�Hb��9���f�6�n��Nj4 ��UxT@	s���8+��.����ʤ�o؄0'W����*��L��R�$ϬԜl��DK�3޵���tb[���Ȍ�&�P(������UTY�;SC��Am�7K4��gv�C�i���ZxLڑ��TyCG�#�H�3�����K���(B�L}��&`/X}E��=��uq�e�y�5p�]��i
E��J��~�g����	�'�j��0�MXe���?)�<Ƀ%-�B���.ŻE!�.�*q&t�L�AA.���#;��F��b����N�f���a�ƹб]b�:=>e�~;�³���t��(������q�j���s��I�W���$3�W�Xr�J�n�����$x�4�\F���&�$�Z���O�A���l�~�.�g*�X��ׅa�&�vK�H�c+(�)f^_�����}b;���z�7�D���6��56��̎|���f2��"Aszd��� TP�� ��|jಇS�*Sܪ�,>����!k<͚$!9��Hf|r�5g�i��l9�|����HH�Kcn�QRvQ��4�ឋ��"����4~���͊�����Q-̦�r�|�z.�+
�'�v�:f�6J�6LZj�H�s�����Z/��i���Lm,/�hABs)�6�2C��x�ďNDG{�S���y��~7E�<��?#�_!p�!��Թ��A�D3)������Zat�r�z"RIg��V�0o�K��K�o���bٓ
���Fȁ�,�h������;�U�İ�<�(ս�|����q�G���v�\��mn�g͉��djsš�+��f������인i�B}5j5;�q;���-Vm�ݢ�a%;�.�v����
ɛά&�uB3���%d�)��S�	7B���PGp�î���ځ���ǭ+jJ@d��w�P]W�F�ܘ��vo�Pf�`��(3�2K��QI�� |	R׽�?��!{9خ���4�eZ���G'Y��cHݠrL�d�UHL�g�աs�[Hʃ�C.�gLʥ��*9���|����ڀM�ViX�.���}�a}ෲ������87|�s'��$��
�c�+�p�oq>�����ސ��̍8�&��15�d�cy6�I���r)[+�.����i7��z�9�y�Y���v!�z$vy��n�w1�,ÿ7�b�CA��vՏ��z���Ǵ���)��V���fhKl�
6d4t��m�ORQ�YA/�,�HUF	��Ɇ&��*h{����E�v�,ukz���Iԝ���$�}K�\��-R#�7<�{\�O³>�r��I	���E�q�bt٥�����ݪ�A����ԟ;��k�	���� �̐)��
�pQy�]�F��N��ɤ!��x��K.o�B{��P�}Uޟ(�|I�
�y!讅:.�>IEe.�z����yx;"%>��yy;��ɘ:	z�q�p�v�Z����Vio3)8�o���H�b�j���Z�M�;i�~�E%��ߢ��yJ��b�Iw�K�?-�O�.�,�/��^�����y��v�ؗ�OW�WW��+����B�������d���(N�
�O��o��朿S�${LT%����˲��%�App��R��J9xT)�̷+ց���-A^nӉ��N�u��	�
o�c����sh�����G�M�}�N�e�S"L�m'�ϕ2���'$5J��R[�!�I
�/���dn��K��-xJ�T%�qJMIQ�>x��@�͓F3vh}�䵼s�lK��L�X"����9��W=�%$���ס�/��e��6R�|(`��D�RtG}l�vhj�I�ȋbw@�Cj�ԎP���|-Q�s!�p�Y O}V�CP�V�k��8�ϊ�GĞ�N�Y;HvDn;��.��h%�[�e7:��7�L=N���2�N�^h��^/!����
��&݉�
��ҳÚ�C��{GG��Lʵ�v�1��
~�"��8�;'[O���
���iN���"����q�)��_�Z@�nDu�_�`��zO�l���s~#0g1�`ir�Blw"�խ:ȭ*�	�VzP��h ���Ĝ���K��9��v�[��g���k���=*��7�X�P�xi�NM�];����T��Vw	C�~ެG��tp�G� C{�X������gb�9��F��6,��FwC7Z�D��t˫KkC�;������Cv��=�^+=R��4M(.�����,�3􀕸"�Ί$5�Ү�Q��>��o���ź�Д�ؠ�o�����.j �G�)��A�A�%G�gkUʉ��p���l+���$��y�a ���5�ſ[�2O�rsv?���hX���O._�]V����qt������\���iQҼ�4��Ox'=
Kbh�8�!r��pPI,+�	Dp�y�n���LC��:L�a�[t�h���K�Bձs��9K��l�M�Sܫ���Z���	c��%����.)S�:�n��E��ky�Q���������[Ea&lM��*�VP���yQ���A���Ю���
�y,����Higر�Ǚ�6����RwF�t�믕[$y��u��6�I�]\�ט����y+�H��U���}�2hدT:�k6���V��٭1��@j�1OL�,�ľ9�gV��	[����ߎBl����WWId�+O�����O��Z��"���6�VC�}��fdY�;{�yv���0� �{j��m��#R�p�}��	$X%B��=	m�&�7_�v���"?�ԝj�V5��0ԫmH�<4��PK;��W��%��$setuptools/_vendor/tomli/__init__.py]Pˊ�@��+�x�
����`"�a=
c��`2:�]��w���ttUuW��ߥߓB�d:���Ϛx�u.��s��5-l��ru��n�x� ��Zc��nڐ��Qg��/ћ�
k�S�,#�0Q�EA ��k)񅏰����1`�b�.R*mE������;m�C��4������@��b��Q��dsH����N}��/="/rq�>gpf� ����߫�ֲ��1�Þ�|��#�^u��Ժ��Wu(���o�S�ER6��kz��Ҩ���PK;��W��i�iX#setuptools/_vendor/tomli/_parser.py�<�r�H��j��d�bK��3�XM[��#����]��`QD�8,�5����:P�����e�-�ʫ���������Q��se�"�ɀ��'�W� ��1	n�ل?dv|x|�&^�À�������4gY�>]}`y4�	��ieI0˳8a�ۄ� �Z�$^1�]�Y�p�e�j'�(μ,��T���0�>=�{3_5g<�f!o��)`�nE��q�S���[��ͧ$~x����6���~	"/y�o��|
�E뾛pն�b���d|>�gO�g֓��翌.�ϕ��K7�ݹ��,X���0����y��f<鵺���p������C{|�Apë���=�\���ġ�:�2�]���X�ċny��q��Ujvt��n��z��l	#/�M9��=��|���-�7�cx�wi��>�,�#�P�<I`��G��yj�i�% �{)r!�Ff��#9�������3����Խ�\���/��5����&s���g����h/7��0�Ɠ�%�5�6�U�wS�F�
���G���[���g�?��1w	C�r��݋�?!4S�e�2����5Ң��i}/���
y1e���σ� ��΁p�b<#T	���iC�_G���}<iƾ�R!������Ƚ}:��Phعl�~������̜�����{%�x��l��V?�V�73�G��P��8.8����ѩh�q�ʭ��h�{Ix��%,f�۶o@d���h���"��&�N
�p�R�g�.���S҉�܏�|�$q�//����;�3��'`A���,�<�s4�,Hq���9��C�?�Fj�����Ǟ���m��g8����恟]���^O51Ԛ�0���d�������=�l?����p �Kϲ�q���B�YN�����$2�Ȅ0�$��%�_}�A�*O36b�<BqE��`�1޿��|���"��Y�
�=�Nf��G��
/�H��k�I-9�߻��S�:`$�o�<*P��
��χG�� �*�>6z�.��k�3/��{�'�b�&�	��Z �W���c���~�����)�Kc쓂?��#��H�C��4�)�:���XzLX9l��q��{�#��l�g��f|�X�t{�C�ݦ����H	�/��jb��;�ނ���=$�'!7P`�!M!�1d��+�]q/J�9Z��<���炒�%*�$�y����Q�]�k�-P��4㶡I���/��H��O{�_H���� �C3z��͈@3���l&5�9`<�c#��
����+?^��ʏ��O_�X�HI�-�����0#;�����	z�?F���D*�}�n$��Ch���b9!(�}�DzC�A��P$�5���I�4���d��3Z�����	)����	;��B�D9��]���*�	�F�E�0��WON��tk�lV@-�����^E��I��GsMV4���!x9�Zݶ� i��>�y�&����]}����;�����$��N��F�6�|Gx��[�}�h�|�*�%i�/���a��q$
m$���֭lL��+
��V[.��`BSg���L��n�������/kD��ĉ�ӼEF)z!Qbג!Y	3�@��T�룖��ܤ���pg+o��&�-D��6��"�C"�2|�j�gh!��:AD�@0�="O�7��
S����.�O�A`�%d�3f�?�01:�)H��8���DB)·�l�5!�:,}�2�A0��������Մi�a��Ad��Iy���
-�}��K�b`D]�m
���K-�
Q= A�ΰnqMu� ʦ�
�nA�7�k�`z8QJ@@��H����:�;ճk`�ع���P�WÙ���y��z��~��W~��C���C��1�t!�*ɣ�\t�$R=P6'�t�Mm�az�Qb-J��R;����^;��Ԣ����(�k��#z
�(ine���l�a�t���"�0�9B��@�J$z�T��L��WjR68=���3�Ys�o� 0����8R�Xk$Lt��Oh�!^W�#]�yy&QNi��,�"H�-�ua`r��bc�/	o@��E{�$���Cj+��B��k�ĵ�[Y��mU��F��o�i�	��L�IbN
S�uL3��np_��zO�E��V	���r�E~<�ٿ�
�+j�L)�U�c�o��RB�C��xb�+ʹc��"����X|�|GR��Sa�L
#+��j��H�Ri���[S�_`�6��2T��f�W Ƌ|�.=J~���؃�
\��
��%�U�(�90긂Bƀ°_@Z��g �[�5o�,��Ӱ�Z	0����Qeb
Ԡ֙{G5��ɨ���^Jz��6R���(q�j&�iIB�H2q�l��&�/�yz6��rBh�L]?=O��W�1�H&I�d``Xz(SJd
�Ne!R��]�(��j}'���
DV�%j]*�!�e�
9��3s�ul�GY
��)oI��z�s/㵴/T2w�hP,gw�[��ayz�
|C^���6�2��enk�Z���<蚺n�S�.�AQ�O���gǬ[��ɠ��t��ǁ��q0��8��|j�6�&�%�h�̀Z� ?)tć��@K��CI�7�es)j�Mc�&�f�W$�e5V%,}�T^J��v�g�ȉpu7L")����R���Y[^u%mh��8xX�"d�2�s]�\�����)B�N�D�Dž�
k�`<��%!���^�3���n]jv���n|�u�(6���ri�,
��1P�MƼoU9�M66co����?8��3����W`�e������U���2���ȇb#�ʓ�$�8�U��!Zr��,��eǙ:b0vE�
o{��%$��e��%2)Sڲ�g�������VU�E�zl(�Y[�Q����R$i���+�!��]4��{Qm2�
�-�����٣��@5V�~���EMJ��+�fy�C<�
>�G��S0�!<���,@5;���fP]���?�^0���(���-��؜E��0;z��H=s��q����2'�ďˢ������w�,u��L.�6����$��gK��`G���� �����9���H��c���7+�K�߉�8��L�>Ȃ=<�b�J�a�hiW@w��O;
�o����%�퍦°3
˳c./�JZ&z�CQ�F��s�Ӂ�	{ ُ�u�B:r]6�z	_uW;2-3��t���̶�Z�X�ژvGsnc}6�ܴ겯u~S�`��VP��,"/�!]��Y�mT[��X�+�$%gE�Q� �=�PXV@��mB�d�	[L�Ɂ ���>'�5��Fz�)�Cs�ږ襢^�!!�E�g/x������z��6�>*�n����~mrS����<�MeS|�S~+�<'>(���8�SMzݽخ�fk�lR�-�P�e��7آ�rb���Ϧ���+�����oy^+,[�+q����!{��Ď�����X̰AU���)֠�v�XԮ���K��Ii���m����w�g�3/
�(��e����F��&�;���c�Y,}�ةrу�"�p��ΑLJ�A�f�
��L��:��@d�'�zڪX��B�=�;J���*G&yw���Q��cS=���b����pk1�'��6ڿ2�����^�>G~�z'AslΊmU�0z;�`3o����Υ��%K��j4V,~S�͢��Z�v�Y�D���&GS#�筊lT��6��rk��9FnI�^�ڪ����S	Hd�cJ��j��4����s��3j�|H
�9'�Ap�sک�B3�t<O
p�2��Ԑ~���Ր=o1d���!����2q,��s����R�O	r��4xڙ�<�����܏����BĚWs!���T�xj��ce�4J���O��
��+xM���g��E�u�-��?d,���MF�}�,�c��hf�Ҫ�=H��\�R������~�ڳ����n�o�xM�߾k��{������w���	��ț�Q�Ҿ�o���^�a� 7yS�����@�����P�ZS�0i�x|�Zc�ҭ}+h�F�\I�`\=7�J%�ep�a�LRL�VL�yT�۬%[a[�D�����.[wQ��{4�t�����'�J':�:&*��~V�QN�WS�͔Q���VP���ͣn� ��Kd�!{�$U�0��D��>�L���6UO�+��H���Rm�)��z���$^/E�QW@0Ji�t�n�G��ziׇ��Z��\-;h���I�)&=EY��ش�Ito����b�	vb�sB��-�<0v�-$j͢V�.�~���n�@�^�<(��漢�xmz��]؅�dcjI�Ds�ZJ��5���v�vҤ��R>��;�b��ѹ��`��Xv����Й�':���eڔ����Wga�E�Nl�#=S�ђ��x2�M�4#%!֚3I�b5�}8�3�l.GYmX�#;n�p�&Q)�m�FfpZ�Tl�-�bi��Uը��}���2l-k.��Θ�\���r����*��ZM�4�e
��ɪ*
�U���l@.iz�q�v]%�����h*�2���V+��@u�.YəK-��#թ�gc�z۾��ҿ��ƽ�[j�0�V��	��e���DDP5>�du�X�K-���?}��/&���|���ڵ�`���9'?��&�H������e��_�\�I�*{X;��VjP	y���У\=�}�Erp&�4�`���DI����|��*��>x&���Bt����m����G�L��8 ۡ��cS��!�ݫ�\7%�z�����T�(�UA?5�.�7`x�a��s/%8�=f.]U�ϸ�OϪ�Mv�
T7�g��m*���:6�JY�8�7��}���K��
�r��,M��>�`u{�C_�f
L��$�R��P��+��k�:����d�����:Q�������]��^��=�1�{��^FC�x�#ݹWd�����}�@�@P#{x_O�i3��t�6���p �b� E܆gJPܱ�$>�}Ev�ˊ��ˎ٦~n\��K��Bb�p$�	v�����7��b��o-��yVe�,�7
 ��E��{ޖPS3�| Q��������u� L)��&����C"�֕(c���3�*J��	:��^
2=����޿�py�U�����i��t���1o�Kq�RqUm��&n�׍�xb��ߊCW���)��Q��΋#_~�G�,_
�Lj��%ZCHW>��HĝV����F�›��f�v,B���?��'�ٱ�)�7�p�`��Y��'[��sW�JS��Ж����o�'ה-�ǻw�?���,�wy�m�����[���o�㫲J^�Ԛ:D+'^�
&a�/�/1���t���6,Q�g)�O�=0����ʉ�;��P���y�k7l�^�ɦC�"�(�w�l��mm��D��ξ�H���`�CZ-%C��/�[�"QQ���RV���}%'���=L��H9h4�
ND@JKp��5���O�왮��w�ᢖ4\�>�<������a����9�޺r4�z�n������0]��M��w�z6��]7��
c\�@�1�߬K���Vk:�9o�/PK;��Wu�1~setuptools/_vendor/tomli/_re.py�Vmo�6��_A(_�T$gka��� i��-�y��H��U
�*b��;���نa���ǻ����u��o?~s���v�R\�<�1
����8�Ǘy�/�fK������h����o���y�KPW�R����Du�b�btAJF�ǚ�Η�5\�FF�EQV���(B�zC(CqY�����Ic�Y��Z��F�o��厔\��ˌH7Y]&����~
ZGI����KM����R���[��	n�ocZ�˂�̀��҃.��d��w&~=�ͮn���4��ݡ1��5����w���;Y�!�ܟ����&��%�ρ���c{b������Tx�^B�`�2��i��o���>q�s�2v�ȢIgo��Z�'��y�J3�*��z�ˎ�����C�#Df��ޘ�q����i������Ay��jjS���q�V�#�{n&�k7���e4N�R�S�s<]��^uӱ�O���Ik���$+�e5
�N�>|��:p�\�8����փ�x>��I3Σ���۵|��>�h���HՉ�L@(�C�����;7�Ӧ(�3�b�܍�Ec��-�����hP��%YVaj��HF�3��Y���t�[BrHn��F�v.��R��a�|�����+�N��Ӌé/~����y=�5.j<����V�R�0�PB(���1�y*�-A�x=����չ�1�*F�F��ѹ��x��H=��˚ᾬ��P)����vuQGb�6"I[T�˲��oW� l(h������T�m��'�[Ђ.�4�hz��A��С�@y�>A[�M4��R
��]Ҝ�:
3��B�>uM>J��N$�ʲ��+��+f�u�零�Cm.*�|���6��;�γ�kij�Fl�V�k��B���^&oz��A7�U��^��]�zAht��˕�f<fc@�h�!!�!�L?�c��C������T�;<��bz��h B$RoaP�l�3E�(3��@��Ѻh<F�S���ĴqKJ�Q���U����A���d�=�n�;������-�m�tE��nɾ����;�Y���tdy����a��+�����&Ѐ��P�b'G�l�1L�`�tZ]#��&&��:ȷ��PK;��W��g��"setuptools/_vendor/tomli/_types.py=��j�@D��\���!���6`���æV\���he�}7m�u�̛��׏�;}"'\Fd�+�n�x���������/��n[�<m�����`��n�ȥ�'��S���6��b���q.G�sW�,G�	h��;�4>	XA�Ā���<��7N��
�
^��s2��epo��1<�
�\'����PK�uW+)�!setuptools/_vendor/tomli/py.typedSV�M,�N-RH��IUH�/Rp
P053�PK;��W;��N��setuptools/command/__init__.py���j�0E���K��
AP�]w�](A��d�^��$���r ���Y��33�9X*�%䋞R&Z=�O��ZP�PjQ�ft�|��Bō�s�`�tw�'����֬�#wl�<��pZ���*�������
M�n�˂���s�~�����y5l��Fh$ORq%� y�q/�"��8�����Rmrv��7(e��C��oPK;��W�8T/�o"setuptools/command/_requirestxt.py�WKs�6��W���)M��q/M��L��$�^T
�+	5	�([��w|INڴ>���o�b�X,~��A�,Z�%	{��A�n>�\��̳�na�+����\�$�$Q�NY�^Q�����줪�YE@?��8r%E��@��*
=�{��)r�jrƥ��Ҋ1Q:#� ۪!�\���[���jG�?!A3�ѫ���m���ΚS�2.oP�T�
mnJl(L�\�4's�"���`��*�{M�F��"�u#�;��Nɚ�[U5e�_��cmeJ^/�
*�;HP��h�*�^œ.��-i��+��m*L�=k�}?5�;S��˲��P�̋�O�X!3C_�؉cU�8nX��#e�G�q8���
lpPPџ�z_��hTW�u��m�/�E���[�:�K�7)p岿qI�?�A�#Xt�ˆ#rO	��JFm��k.�aU��j�`PH�"TL��UH�Z�7Q�?���m���&�h�l����Q��U-�:�82GC<�N��)����(ZFֲ$�P����0xb'js�M����1�.�d��_��毐�L�|��U7��%NSU����G�g�8��cq<�3d:	5���ʡ2���bLK�u�zԍ�J��?z�0mbJ�,�a|�Y��'�X�zq��=��m����>ڗ�fKk,�ꯦ:$�M0��4�����`,���_�*������F4
(�!S�8Yu�
�J70�o�Ɯ�	��bܺ����֡�~<�k����2|�nw;���v��MF�����F��S��l����M�w��9���o}��{J�9E.
.7{h��
a_(�;C��l(�n,���*b���En��};h�hzu(��8h�^^U��E_Q��O�&섭%-�U~��#�_���\��**u<���SѣZ�-�s!�VM�^�4Up����:/gqv8k�ĮAGh��a=uǞ���&b�\-��d+V��r����P2���ō�Ѽq��afW�<�8˲$!]�[W$'c{���E7��^�F���.���E�L�0h &IW������ΣW���k<��1��Goζ�r�|	^��c�w�È�Y-�Qa�1������E�\�nH���Q�x�KɊ�cF�l�\�@pӣ����0[ޫ��0j��D�hg��V����̷n�G�/u=F�;;���]�p�X.d����M�}�����ر�
�X{�`�(�B�Vh��u �)�d��XF˶!{��w<vp2�{�.}(�2�{�Q��V���O���H(��o���at�e����݇��_���'u�����_Ό��痎Z����X���a�q&-q5�ہ�|C*b
���T��g'����d���߼9��Ǔ�uD���n��M��zR�%VH�lQ����b�T��Ѹ\�����W%����3o�l�T-0'}���PK;��W�DȘ0O	setuptools/command/alias.py�UMo�0��Wp
�hb��9��0`�4[N�ْ'�]���}ԗ-')��|pb��|��F�j��Y�J*��
X���6��5���L�Ƙ(��^�6��:���D��-���U�7�a�w{����a-M���
��_��4'�P��'M�of	\:�54BBK4���?����-}*U�2�hf�
��!K��Y���{�~�:�a���i�<��zicJ<�O�n
��N���"~c�UK��2��H�)�[�0�IcV�a5h�%��'U p3네�UW&ek^SUIfYa
i}N%<�eK�L���vA|����@��AQ�s��ͨA�IډG��gҾ�'��(0��ϊ�5��u�e��|��(ᑻ�{
��6��`�L3�`�h�S�b���#�|���	�Ŝo�������\�ƍ{‚AKy>�e��椧	S���g8ۉ_�A��b���t{�]3��|�$p��~?P�9�`�r�b��I9�SA,;5��̐�l?����^�]�*�g�yJ�z*�\�^2���kx�����h9N@f�8%�,q<�3!<���et@�Hh��sC����(.L�)?�b�'u_���sAF����t�	��>F�?R�ҟ�W����NBf�b#���J�p��tu��G�n>lg�I���`<�H���nެ�EԴѵ��j�Is��<6�
���U����)ky��Q*��:Sر�]BJ��wr���oz.>3�]�yvhŞ�Ytf����.�d��1������{;S+���
�qEcGA�̰A�V|�{�{���ŷ�/�PK;��W��)��@setuptools/command/bdist_egg.py�[ms�8r�>�G�C�vĵ/�MEws.ǖU�z]�6덬�3�������t7 ����� ��F��/`����o�J$y��gu���R�)�n�?�U����aW�}��"��b�5{zπ�(���r�6]�:�o�y�w�/�~�f�݈D����l�-��l
~
�8
���uCsϿ�]����wY�Ĵ�	�x-`z��u�u�qG#�E6'I��m���������Q�M�)��ߖ�D��ߎ�]S���C1�E�7,��V��(�X0�t LW�Q�ڃXᒴ�)�6e��l�q�aa��f�A>Ǐ~�V��y'��Jԡas��V3��^�QB9h{��7�?��S�
Z~P/҇��E�D���U���s�@�m����!;.�du�[��`���n_�`aeN��R�|�Y��+x�����c�L��B�XJ"T�oɅ씠�Q�L|��Xrp�	g5�����������Э=b55� {[e=�TxRp�p4��gB�%���4�6M#Kv�l�f�Un�%���4#��i�1w�T
?eXe�N�PiV �C��o���(M�����GL�l��mS�?�,O�!-ρ̕1��)z���j�ÚB�J&?�%�@rC���'B$R<�>0�rX�g:�Vm��qR���&tBր�G�j�,|c�	��<2!;�F��i�cɫL6�H�;e79��ꁹ98p�j�)�Ο'/@R@���uh�F�� O�0���$^ß�j0�!��S�Pe�e�wG�������w�k�G-�v�a��BV�0�_��k�,�!Z	�������g+�g׾1b�1w�z�(�F{
!��W���K�s���uЏ̣,�*��G�d��aa9Nhf�y{��+f7V�$֭�9/k����!�9˺�P,�@�i�;e"�u�����sjpL�@�0��z�|
�5ۻ��͙|(ve{NK`4����)
�!C*ƯZ\�
�}]�[�k��Ұ�C+�նmۊe�uU�0PC��ˬ*�r�1��X*<��K�?�
,Uiwڊґ�C�S��$W����)!Z�z\��ujEx�;S��<1q^��ǖ,�_�\��Hj�0�e�i�x*.>r�gx�:���$��<e3��Ӳ�0Ɖ!p�xY5��)���
m�a<Ԭ�WP
NH����S�l����X��%�UJX*�ƙ�c��gZ�iy�u�hZ����0�(*ܵ8+ZTQ�O8��Mn��O{��|5��Q��(ͬ�ҁ)��D
�M�|A����j�e{�q9�XW^��~�߲�IU,O����.w�#�w�z[��m�h��VB1$�@�~�����ppȵ��дq�EJ�L�GX��0y�̽m�0�H?��S���G�&4U�d��Y
A�T����PM%�,p�P���9��&X�<�nK�J����`��0f����Ĝ�\O��ZPg؍�Ӯ��S��3hCSz	Q�r�|��<�� �M��h�4'�����F/��J���z�����%Y
*�AU;�c`��]�.��ͳ�YVg��Ǐ�W�_�.+!�?�|�3֒d-�L�:�黣+|�l�EQ�шv�'"X�\$�J��;�=�\�.�k�WO���]�
#��?�F�=�)`�&�����4I�j�3
c
r��nKq��"��w3�]�͎[�
���gE�Yn�v��~��[ao��wA�2}�����?����z����/���pձ{�4�0�����8.�k���iw�5��i�[��VǠKW�nxF�~�x��Y% PK��Q7�.��{�A��WB�=������ӥ�^ި�
��>#�ޔ����A�3�+Ga��?���3��!�<���^y����8��j�Q;�age�K���m+YH���m��QPk��R�a�DH	��MT�k�5A(y*e/�R��P=�^�P��8�^#��'�dYW�~VO'�3�7��U�Y2YꇭS�q4�,���䀾A[�q�sEr5x}ؓ9G��̤A*Q�j����eENj���k���c��4_��T�q&
{x�a�tEJ ��KM��wb�4O[uO=��l�J�Cn����Ÿio�+�#p�X�N�����ʍ6�>�\�F�c|ڵL������9c?e��0
]�ys~���Ϧ8f�_�St4A�A!f�똓M
���#'�7���Ȅe�p<[z���j�X9���EZaVu5v�͠H��49b�a�SNy�z6���
lu�J�ƣ�<�
qM��7�z%��>pk�9����� 
X�>9>Ċfّ�4��	��Vo,B��	U�?ա�B3���N�ʫ6.����q&7�\*�����j�۝�֡���ن��tSe����T!����8�S4��SD�Lb��<D#;c�R09O7n��/޿�z���e�P�eͱ6^���>U}���Ou0e������`��{��`�[�B���:�H\~�ʒ�*�	�_�6�iE�d� C�RX2�S���㬫�rϻ5���%�nek+����
�-��;���.\9�f��X�*�:ȟ��(��^���^����*�68��5�aC�7�����&yG�����m�1�3U���_�;���W�U�-�
�!�JF�]D�� 2>���wY��8Ϣ�|n��!N,�(��q��JE��L#JL�+G��	`��08:?��W��&G͗�L��}|���)�?��;��s� �����z2ש��lva��_p�M��?%�k�m��7����1�2��d���]�8je�JV��"У��k�l�b]��B
�sO
Ԛז�xJ�dt7O�-�!��i�,q<�?����i�(�C4p���۞����n�_�	1g#��%x�Sg��9<�g�D���B�"y)(RN%T�;9a��f��2��*��=vV��"�L1��y݋$I�x��������.�KrC�W�‡Ъ��a����c�8�/���� �e��Ѿ0�*���L9X�-c�t��0n���sQe⎶�zۂp�bC^�BnNuY�F�X������>����]��M�e�70��
��BXmU&�y�P�	�`P�
`��r\O$��d4,���܊��T�'_r�v4��3�Κ���{����‚ x�qUQx@��/	K��l��G��:�#�l膡fh�ܺ�[��g�H+�?��X
��x���=�o����kr�=�g�	X/"4d���^���/�~������t2�Cp�78�[�����A�x���V���x��������]�-��~��xӉ�ĒLp`e.~��:���K}-t^`�.��4nU�N����at#����u��C���iFSz�'յa������M����'N�,w�6k�t��f����b�"����!�����Z�})H0Iq�
>�"��G[eyScj���_��iV�C�gq�vU(�
IwW����4$C���q����eG=��Ɵ�1>HR�	��[���ҥT�ƕ��{�dk����^p�)�b�Te%��I�!���qu��(b�eF����`kj"��R'<b��,f��wl���1���^�gu*�O4�G��J��Q��S���5'Ms"G�l���r�?�<����5e��qn|����`��%^��Q����ת�lW7�;�ķ6��D��,��3�OmR��cl�U436	����\�%J��ܤi�QU���Ynj_qWF�:>a��:Y{����J��#��Ê�:UW�ǣoWH�ϕ��F�s7�����-�n���ba��uDǹ�
ֹ�`�S�/xB�[M�o|���%��;�c�����:�;���8�u>W�:d��P��VĤ:�V�z���-Y�3	"8u����)�kw[L�����*Q�W��;��9����OH��	���!�"Qe/�K���y���5�}�{�'�����'<.��O� �Bڞ�S�&������9F���ӰӇ�x�!+"�(�i�J��C�죍�k���8��X�c�W�����&@�3�"~�7�JcJo�['m����LY=x".���w��ۚT2�������LL�B|��zǴewX�-eM||1�%k:3�H��Fzlu�(�eY���bv`���|�;04XO[Y׼�>J��s����E���2G��I�>����O/~�G#�Ԣ%��?�5�fũ���7�s�]ʭ��!F����35�������^�V��$��R�`{�7t�.�ؑ^��ODo�����V��0J��55�9oJ��<Q!)�<�ǚ�T�4�#��"���=��Bi�>��ü*C�
��wt �d������9�r�µ�_�ߋ�
ә����,�T�qz���8^o��N�v@�N��4�Y�RS���I�?�%�`J}@J����[):�̩�nݞ���pe�
�'���4"��k�r{׃�r:`ZS����L_[VUI,S���5g��ы��к(��+�ߘ����l�f���F��=5�i��X���@/�?�&aZS���6�)�[���`ahl������m�R�E����)s�� �R�K�ujnr
���0�=�����4i��W����Q_�+�c_�@^/t�
�e�H��o[	��ry�]��i��"������
�J�t|���t
��ɣ
�y�@�&�:��._�PS��QݒѠK]u�<6�����\�
���4�����=$	�Y��{�}�u���J�*f6��Ѝ���P3w0��|tt4�tA��)3�""��a*
�U�foZ�9�m�,\���"�|��n@}���'_xT���ͦ�._����
�{�uz}�0r��N��ڌ��4:��/mQV�w��aX�%�A��Ҧ�BԆ�W?���2�|1�7�Jv�Z�PK;��Ws��Qsetuptools/command/bdist_rpm.py��M��0�����by��l9z-[��J1�=N�ʒ�GҰ���q��YJu��f��ygd�m=���t��m�U�v�SiM܁�b�$��-0v�V	�w .���㵖���B���$I*ɝ����=�$@+M�n:���F�������(���֝Q���'
�I:Š�sP��})T��%*��x�@��q�&p�0V���U��c�:֚�gy�g��s���R�!8�y7�y���G��✓�|�5E�@����#�<�کn�.D���T|��p(�^���%6�V��`��V�K��t9�蕿����Q�w�$����V����	>�ۋ�F�{��(aq��^H�A�yͦ)�st�e�r��7nS{�ag�0g�7�R��b���qB��5ղ]���KX�/��>[�;1)'ou�K��5<U�eu�2K���u��f�˄�t��^�1^r+C6�zZ��X̯S:�6�m,ʖ�`�Ve#$NG$^�v��i��k$�
�E#y���ԉ���w�?6��W3eC��K�O�+��F����kPD v]��4��uĪbcc�����d	k�ۿPK;��W�>�	�setuptools/command/build.py�Ymo�8��_A�>��J_��`l�I���6-�{���i��y�E-I%���̐�(۹.=�I�p^�yf��7��^��;ZY�~[��Z�����^��~yy�ϋ˟��v~*�u���ύץ�r��ȪȖ�.�vwx�N����)�p�k�])��ޘҝ�ڪ\zm��¢�#�"�[e^�u�2�31~2��̎~4g�7�)�T	;�����*��lw*� �y�����֭<:��}��������go߼9�<�����?������^�OP�p�յw�o��ҹ��q�b4�o"7�Vx#�хpki�|�V�,��r/�_�ZZUy�rx�k��-݂�,}�i����j%�����N���C�H��o�O?���
]:�[��b�x ��?�~�
-��h?,���\[�H��5ܳ��ў>������] Y��8xZz�5���!����'!���V������#g�#�˭������@l���W�.�t���ykG�쐵���F��l���c�ܣ���dJ�NG��5E�+��'�צX�x��n����h�}�f''��]Vo��T�������'�Ovt�
Ŕ��H�Xx�Vpu��x��zҥ�U�<o�mfG��=�0��pBӀ*���R�t�eY2�@�(1�5��ӧ�O,&�b����_�~|}~|L�R�
%�_#�u� �j�`���Whm�VV���i��ęW��V�ȭ�z����n��wk�J�t}��D-`���2ݨ[Y6K��䀩���DH+S�掞``�Xp*x�<ox�Sp�1��g����+�e��`�eQ��R_T��Y�m��d�%}t~Yy]V~����Hyy��ҷX�r�P�gA�����e�=X]��6���	��S{��.��W�WX��HBȔ�S&��Q���� 	q䵪�ői+�J��r 	Ex/��qM�`(����m�y����ݦ��5�#0o�HI���
,���%}e{��"�*#%"�ޙ,N��Ҡ�!&2�1��]`#���d��
C����lL��N���V�IJ�T<k��X���Le���K�f����kV*z��*k�dA��h���X/
�,Dl��u��YSo�Qqk��U��� /&�t��M�D\��T��X'd������H>��:*;�ڊ��ܕ�@rc9
�Է*6^0*�2�	�gV����']�5�`�X���s��U��|�U�z�;�
jQ�ړ�&�U���A���""M�o+��b�8-��R�V�ұ��Ya��"��kc��O�L�F�U�N����4��!�'2ÚVl��I�I<�Ǝ7�j#�	^���xڍ��a�
H�{�).�R�B,��О9���}��c`R'�5
�-2jY�rB�lC݋�nK0x���}�ZAߎ�p��v�����{7�	S�WE�#!��
CpР.��@��
�\�_�~W���dG�\ǥ�/u�J�@"�n��Y
��${IP��8bߒМ�R�:�d\[�1�`���ܦ�59���k�ٗvpӔ�m�(�XN0����?�f4R�eu|���&%t�L
��L��߮<�6���i���U¾�z���o����ʶW�u�vB'8��~�n��H܁�\�p��0��A+�QD��u�W-�=9U�|p����Y�zT�0��|����
ږ�p��V�S賍��n�B.�;!>:��PS����nME=q4}Φ�,�z�[x���a�Т�*"�w�5{�v�p(�ٻ�/_]���U���#�vU����4∥<!�A��Q�1��j]r��%	"͒��ʝO�O4U�0��s||vz�
��Z��O5�],��-�F�mH*{m��oC�	��S��XPg��U�W:���@��TA�?��);@F�ci����S��c�E�z�Ve�Ɵ+�`�ͪ�w�G�f}�H��g��J�/̈�����apC��șe;�Bz�.�O,�G��ih���v�3����F�
��N'~��}U���{5����}�'p������C ѥ9OX��&���L�d�J]�HoQ�@>��b�ػ����B'����|��Vv�G� S�*JZ���\fHsR���O�Hm�F�(Ս���Ko�Kq~㤪Mݔ��hH.*81
��)�����8F�`Z �R�
�vnN+��+]4v��&�/#�1�/�� �$�
�����/\�B���x��N`��eEԄk�4�̷o~;qr��M4��(-��rW���z�ף�&�
7ԃ�FB�����v}Np*���M'=��&�.��R�[�Ct�Tj���;��E���'�,�����փ7�J�m����������B�$2��!\�j�̐5�dz�'��	�c(-��85�	���}a�I���,��u�!����F�|<�s��y��PK;��W�}�C<� setuptools/command/build_clib.py�X�o�6~�_��8�\��y�p�P�v�{(
C��DW�2$�Z��#%����M/ul�"?~����R�B&����&NUQ�2���Y�Jqf@iq\�ZI������{�㶮n��D����ZY�ܬ��hR�L�g�t�_�N*&�0<9jUW+����q{ycW�3),}�\i���~����%�����n�������a`��8y��U*�1p�)$��m�O���������=q�x�ji�p�'�E�Z�U�)'�+)Ջ(�7+g�ǘb�����=2݀�'cYQ]�A�3^�2�eڀi��3��(0ɕ�<��7e`�V	]�b'�>���
�9<�Ɛg�V��e�ЀH�P%�J�{P��	�`�L�S�7g�7.=��'䩅֣,�m��=	�j�!P�yW(XU!D�}\V��<7�o���V%+8�@b�A�˪C�cx0�9UTq����P�R����\����3D�/��L�%x1�"�Yu	!ށ��x+�@�
y��F?B�eA�{s�����'�s�A�g���Uہx|�6�/�f$/�^�I����OQ"�˔��D!av�7��Y��aU.��p�5���*™v�W
������}DPԘ)�b��q�Xf�����Nxh��}�������3O��f�	c��)��e��J�l�Q��D�
~c�X/5��kX�����DӚ��6�'z}�_(W��<UZ�'H��.�A@��qF��5ʊV��ݧ r.��1',���ξ��jSl/hR��%�7x�F�{�OS��ʭ#��c�>k���zh�9�ڟ���eK	G�:������l�H��:�|���)|=�#���/R`�����\�\ü���\���o;�K/�^[u��A{]�t2��a�<��0:�腞.����n�|of�(��"���eRњ�l�뼢�Fn�G�r�6ǜ�[yFk�4Cg��#��4H�������;�1��P܏N�}ҟ�s���d�Aն�-�$�������Xv��d�x�aT���
|����)�n���+�EhbW�p�MU�&�v�g+��W�#ɂ=��nb�p?��+��s�
�'V�e��Ҹ�wX0��ɀ�Q����>�D,�j�\���
,SYg����7���ݎ�s=�aAcL���<���\#���E��n�?��}�U
�>���xY4��t�s��Y�I��Z��y�h7��U��k�3�g1+Ҏ��q!�/���S���uTb���ZΤ�1�|&B^_����M�8|
��NO�G����M"NR�;X�x�5O��t���j9���h뤉�	PK;��W�"/�`Dsetuptools/command/build_ext.py�;ks�F��+&T�&�l>���W��ܺ�g�,g�-�
Cp1�(�����yc@QN��}9������~M?�v�v=k�R��~�z�m[�ٺk�L���*��bS5�;�1���7��~x�_���Oo?��/��6�X.r���v�
��dy�nwU-�|
�o���vUsg־��~��f�o�%{WI��i��z������~�ԓ�"2����)��P�e.{3�
 F�ہ�F�3K�7$t��Ӣm֕��d�n��vɒ݉>W��>a�흦F�~ؑt2�umg��ȥx�#��^4�j+63�|\u�;�f}w��1����}/����-�`��֮�N�	�bA�%�֌?��+�B��ժ�e�	�;�,ʲ�a^ׇ%L�����p�#�ö-�Z�}U�%^�ռ�m�>�5;�������\m��i��{��d�ɫ&Y��c!��4�ة���c�#
���-�L�`�(A2�"x
"/g�����W~������`�]�>�����y��
�mڿ��lV�y�d9�.�x<R3�Pd��`�lW��l��%����W�\MPܴr���N�}�:�X!9��k~'ḣ��d\�*WJW���J�P-H����3�0��B��L�J�=�,��MPk%�۲��pEm"7�%�I�+!3���P�o�d����0��a��g�gQ�b�-+�&�ن?�mk�L����F���
�	�f]u��, ��^O�eI�G7��(�������U�B:���%ӣyݶ��n~|���+�
A��=��ꃚ��#��)��h�9�8�GV����aW�^� C5I�R8xOb1���r�X%P��1�A�VҎe��N�
%������
b&jX���
`5}�����}Y����w�%�.-�%K>~z�:���D3�9��l���:/�Tj�Ё��&�:����,I�
�e|U���a��S�t>�T��Gw��<o.;G��o<g�.`�r 0Q��9dxlZ�$C�	�Tk.�T��T����h�}B��[��lw(�kՔ�^>c6+j`��c�s
��#����`+p�V��4�?�G��nhR)��,��,��H��n%���#����B�������zx�p�L�<��K��]��,n�����7�vZ�玴�ou�'߲%G��0r�D�MO�,�8v��s��k����k�C�n롮�Hj�qX���i�/�͂]����ԬuK@
0N��Y&��i�%�`���M�d��U������Ds�;L6�"ޣTw���|^�5B�j'o��>YAl�HҴ-�N�
5�&�_^`=��e�j:R���2��	��v�N�a�/r1��:
H3��=��Q���j�q|͞Ǵ4���,�
Qo��I�„8�h�T��$��$���"����C�hB:g�e
9|���R =t��~�x�[��x�O�,ʓ���#Dg2
�`���]�v��Đ���E���50����[�R���fy#D)�Y���4���=�"���=�w�1�E��Iyi��Kb0��i#�@EA��탊�[!�0K!�c�QC�Yy96�7�4�?T�Cl�C��L��BP�]'��T	��u�U���sH��̂��ݠ��ZY2��'
�-�g*�'o�#&_�?mg�κ�z�<�y6���z����
�����#���[�Ò�2&��)7\���M�����/T9���_`���XT5��0mm��#�/�|�g�|��J@���)�'��}B5�@a&(�SnWG�F a�Y󢧨���03C_7u�1�\#GGw�6��"�ܳ� �@K]�l|gv=�١�}�|�uf�4���MUl& �	{��.T�ݚ$'�ȕ
!��Na�Ry�F��]�B�%Pp\�[��Qt2���+p��[��X�m�p�p`��Qkl��y���^��^N�)Gv^7����#����S }�R'�2�ݳ�Q���
S�ɒ��t��U�yH��7�~��Ӈ�r��t.�'�SpYx@�(90�_OD�����%hR�#�hS
Cި"������3��/B�P���YxL�T�V�e邏	��D�+�*YP��ci�Ŧ�c��z}���[�������9���5��$��BѪ+ϋ	��%��GC*�v�@���͑�T괅�LU�^b�jN���΂�'�SW�=Yh]�q.Aך1Ƨ�
�P��>O���&�i4,w�]m9W��A�969L�C�=�eML��M�@�<<��?GO�2H\�0��3����a���hb�1�`$�{�אʤ��S|"&�����R���t:�ej��p�/OZI��"�_Z�x�^%�+&)2�j�8v����U�[;��{�J��-�����"/�V������Oc�9����o&��ҰQ���=��VJ�]��|HS.�&�(��xO6��i�ф��l���	N���E��V�.�yϪEN��G�%�4����0,c�<��A��n���&�\�h�nh >��f<,�0�
�]p�V�-X�:i/FV�3�Ӧ��l���f�R�nL+�ҀT5�,�B�Dc�Ղ��,cUMQ%U+)�B�˺���h�/I# �h�C;��6MI�rJ8�3t"�O���K�>�`=�F�
�d8��kb�X�,-jX��kSBL��@f�ؽi�[�Ƣޜ�����3c���c�_"uI���N�<�S�;uP��o��v���:�3�wK��w2�؆��4w�rע2�6[�m�C#x���jx��ЫD�YN�v>>�.��]��t��EPK{^��#b��!�q�%�Gpp��95�'�E�$�u݆o͛��7l#+k�
�э�/J��Ӗ<X�1�8�_\�����EM��Ir%���&����`%�eS"����5K`B�c@�͝
F��TMOb��h~�UŢT���v�KF9����jG��$��ΐ�~�K����T�$.�C��|݂�v�ю�$в�*�M%�L��'
���%���S��^��>/�@'�9�E�~���oh��jc�2��$��r`�R�A��8j̸�ȉ�H�X
a������/�7��zdJbK��_�D�u^
�d
�^�s�f�]�P��R�����noU���I�9�YL�쵽�+�~�wm�/L*ǂ~��V�2��
5x�"լ���g�4>)��O���h酞���ڥ���хR	K�\��k*�>�n� �[�idV�j��B�=]�Z	�<�Й���ttX�C��Z�_(c��B��E>~���a�F3H3'$R_! ����cB�U%s�)
�H�<2V/�|��Xщ� �q�
U�jL��m5ϲ9uqKl�Md@�V���n��t�n+�^>{��]*~�6b*�j�-�����'����ԇ���	�VH$�:��3�ypK�H����x�B(Q�"��٘�ɗ�|�J��T��6�.c;�$e��6ѕ]d�x�S�Ӊ2��ot7�L/��v�b����7Чn�M��]�e��[�޵�{����jX�R#���
�1�c����n=iɀ=�5߮J�/��w7>iS��*gt�z�����f����ƻ�GN�bB7���H��j������|}4(u��o9�NT�@�+MLeB���cr�7/��rQ�4/}UӂtN�/i=�uSOƁ��M���ԑ8c�#��Ë����"������\+����M�^��l�0]..�PQ��@��4㾡�	�^�TO_ձ�Bt|FGK��[�&�K0����⹧*,���W�A�/(���bTC�6
J
���S�ױ܂�����}c�����!@)��ɯ�ϵ@�,E-z�߶�/��rߨ����a���9�'�㬲�8dK���l!z��������	Y����]�C4����]ݮx�Z�O*�7%�<?ȽO��'������D��Ǜ�󍾔
jP����{4��v��f���7��9���[�ً��g�8��K��S|��1��s+����cv�gI�+��m�K��Ư�Q_i0]�b;��=X\�KX��OR�����{'FЋ��q2"K�d�uf�8I!�	l#�j��z���z���wZN�c�ͪ�)�����/b)�9
geJ_�^=
޵>��Ԟ~���=CN��=����=5L���m�^�ߚɩ���|��yQ��/85Q�;vQ��\�+>:y�%{o�r��J���ۖ�wG�M�-�{#K\~g�Z�KNw�����&�ﹾ�3���.�f�r$�i̗Ӥx|�ۉ�&�G�vh��H{\�Qe'�~�_�:c�5���|�aP�
��9�5NF���
�@S�q8��Xr,��-4z4�9M	{���X
w���l8����.�D�ZP���
��������'��yO�H�4��x�w	�wo����_CS1�)����-ߧ�O�'S\g�L����=�O>�L�9�����8�.��~*�;�#�aO��
s��o��'��?�{�C_DT-��O�/�K0��޼��5��k�b�c���=�o�
�ə2wH]��v+�
$����gc�O0�9�>�d�G���٘�����a?��7�ܫ�����RmB�SW�U� Ta��L���P�W���|�!#z���4!�>�B����g�Rκz���¿�z(��~5��Z���.�ׂ^�R`B���—���.nf�����\�
dNjξ����"�'a1�oPK;��W��X��;setuptools/command/build_py.py�;ko�F��+:�fez��|��ga�d3�'X,�"[R�)��n����߯���n��L���#�������޶��m�*�u]*&M�j��VK^^lqvW�7���h!��,U���|^WO��Y��Ž�+�p�U�n:YYsd\���;��V�Ӷ:p�{Z���7c��m��o�GB܀�\|�RzB>"�4����vn������)����v�>��K�C�e]�r�>uM).�4E[�������*�?���F	Q�=ϼ��h��N计��Eӊ��Q1�...���?~�}w�){������7w�%��is��%�7���|��e�(��Vj$&Ѽ�	�X]0���:�����K@n�U�%�i������e����
��K�s����;��g��M��U.
6wssf%��=�۪�+�bלme	����]�|'�����
�
��˭�O�3����Ò]w�M��
��,�)���S���=�j�C~�ٶn�#+��(c�������T���z��}�,�gŎu�8t�lS��!,�)dn����_eE@?�/D��
� �:��Da.��i����;^*a�_�.��L�v���uV�v�E��~�
�+�ث���'�{��v	h�@�uJ��*��
(V[	��"�	�J�(���I�B�H�W��-
�P��"��hA�U��e�1��_=@�es�H��.N��u��$V���}��!F3˺fEa�����y
�I��GA;;m>�aP�}2�~�M0��A()e�x��
������^�@��0��p�F�ATIp���$"�b�ݺMЦ&fd�Vu�$��"�`�wء�--(@�Ё
$�t�M=��4d�a�升��/��D��'�3�Z��6jI����F
8I��
9��#jm�ʪ�,1��M
c�
j�GbU��7,�����i�(��O�-
'����3+H��#@�����lPx�;03�����J_ݵ�l�.���}F��<���ӽHc�����q��J��ef�1KK�2ܔ���Y��e��k�f�]�_BA)�ߥ��ӡ㊮w�����L���u
�������{����I=͡���?�Jg�;�NA=�Y_����C�<ڔ7��
oeF̈q�z��E����1�'J�h���R�9:ۥ�?!�
|�Z̙��Q��0��'��'!��[�t2BJ�IzYhw��X{�~�9
.3&*�p8�9����^��%x�A�Gf�hz�-�<��(|��P�f��Dc�q��4���1`�!��hXL��(��*����0LX�
L��N�`
|���H�m�l=��� �q�@
�߼+u2�σH��_�	W;��*�X3_�u�wi������]�T��u���p�]��W��;k��'��
�b�����U�:��dm�Z��ROӹ'ޜz���0��n��xi��Fbq�bQiE��'�<X>�S
g\��n����x��P�K�=��a^���H�4G��#v�<�À��1�A�l��5%�鐹�dl��h`M;��=�	� $�-��\O%����(*/
Dj�P�l�#��%�A�AN�$�?��X,=��@¶%���C#�-����ih��H�AÎ�L�8�U��9I�tL�	�X�8����jt�"���'.+6X��$�?,�[�1�b~��쌂QW������w*�PN�<&�+
!W� ﷉�26&��6���z�Y�m̷��_��kK��<��:�ׄ4��d�M����R�d��,�}��d�w�K2byb�
�&֍x��5Qu^b�/��M��ˊ�ܿyy��q��wO���1�*�kț1Iv� ��!G%��
!�̇lU�1���Qn�B�>;[M�K���G������ڠ7���r�`�(��ā���!g���#�<��b�Y��/��P1��'��������Q���ĩ��V��I������i���t-�Q2���ݠ�A��L=�28�/�}�&L�p�G���p(��J�1�$�K��� �"���bo�,���ed^M8K/��+�*b�g\�t�>d�dq'���۳=Nb�_��gރ�����\C��������K�۰����kȗ��_ݨzh��}K6�����ܥ�E�fUX2�%���h�@���B�
#�L��2�V�"�VW"*�p�d���w�񥬢��(��О��2�ܓ�Cg����C�W�/>�7����I����Rj�R~)ĩ�#,�n�F|4�����S"��������l&��	s������}5.t(�85�6M+�l�$N��m���=Z‚��`_]���Z$�j��ؓ���^�q/��`;t ��6^Y��Vl�T��g�
�@�?\1o��^�?y]�Fu�s���N��!dJ��q?cI��S�r�k���T��F(�v�xq!���|�:۷I�|�
�@��D��$	Y>M����&�iJuz_a��U�D�^�m���z
��t{Ě[F<����Q%�Z�r�
|D�*�@ݴu�b9�Z
XB*sR�T�֔�NV�%�h(�G�J�@��㿾y�H{�p��6�Z;��^C�j���!�Y�|�qbʚCG�j��.Ѝ(��:#L
��	�W�U{���r4+⑬���	`�t���Rg���.�G�hO��Y�ao����x;*=�
�6�38H�W�0�/(8��y�����&"��օ��1�'�y��h���sN�0H�o:{ȈB��	�cBcu�>���b�t���G�2^N��9��[��R�O�0��"��Ƈkj�2�{���P. �oE���j=Y���Č�Ž�k��%�f�%�7XFf�*���
�&��G�'q�J�9*�+�P�)��g�o_N2g���qק��(���03��M��A\���0����㙸���?��)���|�/��ݲ�4�)
�. a3���i��:��c�d�T���IT2"u��;W�b_��a�0҉%��fc`R��+�.�c.j�[�;�*Έ�d��X
4�ch�|��%��J��F�t|=
�x�7uU^a>�f�[5�
l�-~�fs�5�E��4�*a�m���y�eΤj��d���@���h��_2�H�H:2�a:y��RV1���;��F:��Y[�4�@�&5,.Ȝ��5��6��Lç[8�$���L��tr\jF�k[tws���3���t{zT����ںk(�/CS����Ei��C�����c�ݚ/��|i'�=�	�t2��<
ш��i"���U��U����(P�|ϊ�?��<AM�I�J���S���bP�];>g��A{r����Db�}̙��ދ^�:cT���� ������y9-��趠疸�դ��o�N
�@������}˟�@�ζMb�
�Ƞ��|>�u�Ӎ����}�nx���<Y�7p���%ŕ��u�<q�9n���- �<d����������v�D�?������$�m����UzZ�Ÿ�áD��پ�Uy+!�vO�@�.͓	�_]D��bl���?p���S����3?��x�W�J4����)昆7���B"�̳�Z��1BjZ�i���	�į{�ANp4f�O�O��[��
��"�=�� �6�#tݶ2P`x;�>p�_L����܃�@z����������Ȳ_��W��n>A2^^f�"�5��V��=��k��Ooo?�
�{u�'�-�	$B� -���m�>�`̒׻
�?5$����7K��?��zȕ>l���N\���0o�AaXWw�ڂ��[���?s�W>HT�	�����ALu�0B6�Z�Ҕ2��<2^���Ơ>{� ����ޖ���Cd�pF.��#V�B.9�zd�I�4$hH�?
�F�<�]Sy��&i�.�W��U�NVJ��-�ڹZ�e��Z�1k4:�7��o�۵�YLdc92ã����n���*x����JTW`ք�Whv�,�U���ҽ>�=@+E]͵����)�C��W9K$�ʁ	��hO�/d����xr�Fm���lݫ��[��?�XO�2�%����N]��5ejk�t5�A�*s!T>��J�p��!���C �����?���J�c�2���X��w�c���E�|(
w���ո�}�"�=>�f��
uE�o��d׆�t������S�˪b��m� j8(L���6zrs.��T�����Tږ�K���O=���t�O�n�� �kĖ$#H�����]�[��V���/�x�Ь�uEX*qe��%�=?�o�|�mJ����7�f*�)�Y]�g��Y�Ͱo#\
t^��U�oǐ8���0u�\�lAV'�W�r;������6:j�Ce�����TB4f��2f]��Z��>���Ш
��M��YR
��-��
M?f�̄���״�a�m�U�ٷ{}�l��3:qiS���� uЎ�>ՙ����/�Zy�PK;��W�J��5setuptools/command/develop.py�YY��~���hv iW�ɼ6�A��$X �	6�4ڢmnˢBR�v~}�x����
��G�*��ե9Hq&-WzԼS5~~��d/�g&u3P}�:O҉��fR
���4��p�΄򿎝�m� ��8h!@�^�ϴokFյ�Ҵ���挞&R|y��3Sݳ��D��l�U���ub(&�}􃽚�*Q����dY�7��8`z�GFBzig�k �ʖ����7dK2o�g�=�#6r-�먘l�aU��Q'gߑÀ�"{G�U$���	�'����3�BVV3;�Ы[�I���P}Bz}"Z�C�ZT����x�=Zv�mF�[V̏��<��;%
�U������Bq��b��'�,y�Ȏ*�] r�ź��~���:\4�ǜ��N�D*��ˑ-����/��(&�Et�_������!�P�� ٞj�z/Y0��\s��p:�F�&��QOO!�&��I(oݔ�2)�*���B�
"=\��[��9�מ<!�d��O��([.'���hW��c#�M����p����t�e!
M����ͬ`"&7>Ð?n�ݵ����/�
֩y�����=��	+���5٩���=�M[4"��ٲ�Z�i_`��ȿE��,#��Ns�4��\�Ciȗ�2c-�F4Կn5��b�s��=3�j?D�0�.�=��J�E��Н¿E$9�YC��&nm��{!φ:ѫL\����0>Ѯ,cۂ�w[�Nj��\�֛��?�ݝ���<*���:���+�&��ֲ�"-��D�%��ߓ�ބ���ѴHl����[��Gpg����HNj�U�J���#d��T�‘�B&MYΤI�o����`��,_VB�Ĩ�=�f:*�ъ���G1xn�|��o�K��hC	]�&�MIj :a���O�g�z�RH��u�rb�a�#Wi�df�H*h�@�#fCK��:@�D���ӵ�D���+^��'��Xf�ʵdC��W��"�Ǽ�%�o(�w����w���n�&���?��[R$01�0�%�_���\��7j�jت���XEWeڣ�ԠX�f�T���}k�Y�k�.����#�V�����P��jA�5_�X;�Y
���(��}��>ŭ
`0���"�E&O���G��_��˼�38�Ib�$D�sװm?���01DJ���7�5��M���`���xS�|�~��ϑ�-�Sw�̽d�"���9j*[ZxD�A���	�`?�1VE�=�D��F �PeV�COEn�	��^h��䵁x�μp�X_�f��$T����%H�Y�N:ߑ�_=��Y+J�H�4�5p����m��`�|A{!�ˈ��g63U�ê}�/s.ٿGHH���P{eO��DC�&G�7 �<��l�����^@�J}Y����3;��'����Y��q�\�2��§ݞ���7�ҌI�A�H}�}a��b�-�nA����!�cE��5��w�9�O���謩;P�S���Z�ע\��Xe�Z��*��8�}����ߔbw��B�~�G�h���r5�'�J���`�]n�W�'_�~%�$F(�S��O&#4��j�B�X�0��IhvO�b����h��/�@���.+�M���ٕ�4���U�Dx07뇩(����-�W� ���8]P�';�g.d::�F;{��+��c`28�|7E,J=����r����׻��(��P8��������r�%T�	 ��������:��-�k�rM�Q`�����`c���uT�܁��ڮ�G�,�m��U,�"��l�ó�o�b�Ӿ�%�<�,�_�W.o��/	o���ߵt�a���k�b~��W�,�v352LD�m�yԂsLF�Jyh]8d�E�'B�R([��K�:�{/�j��ϟ?��*�-��b w�MV�d��B���n���߸�
ف˄�����(��y�E��A�}�m~mX�-1�+��!V��� �4���W�Ĝ��P�e`6Iz?Ǜ�*"Y�t�5Sy6
9A~�
��PK;��W��	
�
setuptools/command/dist_info.py�W�O�8�_a���!N+��C�
�$$TVl_V+�1i
I������ߌ'q[������x��y��RB���,�JG���$�Z��d�X9� c�bz�eP0UC�s�ƚ�j�!̄����	eWj�h^��R�,��W]�uW�IW�dKE���D�X�݄��`�/E��YKR�z3���I{��0��,�n�0��E��`�C��=���6\���Ზ�٘��g4U.$�K���5
�ș��Z�B�K�6MA�Ŗ��=<da��"�J���[|�Va��Yd�R�kR�]0��-oW�rqsî��]�n~��r��n��a�˛�s���陧��;T�+U!�/sH�߯蛊F׍>E���l�j��e�Uό=^6<ݘ�)�‹�%����1��s�EMĭD#S`Z� 7��T���!�36���2FL鸬��:d�gg_ξ�
�=�wȰUS& �8�L�ɇ-�׺�)�i&FA��U��튠�D5�h��h�R#-uϿw���SX��`)*@����b��zu}��?���H+���y�	�
���j�	]�����5&�32��Ϛ��wg7G�\sJ?�b|E�e}�
�(�0��^�^Wq	G/�4~����q߻4>zK��m��`�ą��iX.?|�\���'��A�����S�HB%�H
��Ub�
�F�������#�:��	#�t��,�0��HbE���K��k����=��;� M���{����ha�e�?zX�C�CˇA����.�.
ܖ�8�RNw���5�vض0�Ü����tԑX� �&e��jw��s�w�(x�A3���wC���{o�0�����6�(y�	�Ψ�E$jN�:Ú�o�J��T�Q�b�8���	vx��݅��},��of������B���l p�SQo}9c'��^�z��p�p�*^=�r�*Mߖ�(��3X!%�5>S�x�~!5�Q�`�N�V�<�T�t��|"�ֱ�J���m�ɣ��Y�.i�p�E0�n�\�c�ph;$��z���
C�Mb�7d1N���<ہ�Wk6}�M�0��Ծ'��˻�D�(s�N�݃(im���>QNG�������S��p[�\�'��X�ll4�xN��hҐC�~�z�*���cΎ��`/�����=��'}S��nc��ˮ���g-�8��%͝�@V��a���J���DaW����#A�֢�='�v�k��)CŒ:'�PK;��WS����\�Q"setuptools/command/easy_install.pyͽ{Ǒ(��>�\2�a�,�U$:�]YҊr�Zw4������>��֫��Rq�w.�E�t���5��M�r�v�juo�~��{�uu����&[���<+v]�.�j_oVu�<,?uM���j���lY�ݮ�V�t^��2{{�]ԛ{�bqY���,˾FxeWT+x���u��j��dmYf�E��E����,QF8�>u�Π�$(WU[u��j�]��2���>��޽<�.�n�>=<l�n��I���Ͷ�U�a�9\]�v��r۔�f��J>yѭW��
`��5�:;_��Zo릣�����kߗ]�����}���l�m�]�*��m�_M�)��nZ�kt/������O��o����7�goe��n��|zU�O�i���p��w�b��R�����yV50�U�)�{���z�Zn�y��\�b����WLkٮ{�g{Ӛ_k�ۏՖ��.h��WW���\��������,��P��O�uSl���E��#�UP�����Ϋjn���ۦ^���}�*?�?�Zu=�η�/e��Ϗ�	��n����l��y��׳��O�Y����6j����]Ԫh�U���� ���U�E�	�e��?
o��K|èM����]ՔHk�9���ݫ��7��[L��Q//���?��:�b���9��^u���=7����(�wQ�vQ��?���f�ֻ��_�
�bU�X21�g�i(�_����8�����S:t�q�Ϗ7WUSop���;���������J�,�B�������K�D�u�}]�6K~�i��s��U�0͏�r�����˓��������ff��7O=��3�h��r��������g�lf/�«gxVM���:�$���v���5���do��~����
	0�1��̟���<+v�n0��9�oy3�y��x���{�(;�e�k�K3|�]��l�s����j�=��ٹy�(7T=�>����ƗUm��/�U7?��p�L�f�b�h�F���qvt��V��]��o�~�A�Y�Y��r4�ug���g�vQU�u���/��P#�d��ͮ�g�E���6����i��bՖf�5\G���7����e�l�3\��h<kJ��0�6�I6�}FsY������
l�'�-6@���qStaJ�L�?q�eY�U
�	;?�N�!�mϬVfX�u"��o��j����Z/j���#�	vk�
FCF�#��kX�I6��-��`<q=poN�K@���,+Z��ܭ~�5��jz�'���?�%t�n�좸��΄���ȴ���M�,��w��he&O�Q[������ۗ��2h��c��`
4��-Sӂq�x����f�����R�W�e9�6����E�ZV�@���⦝.��
�(�?��{lJ@�E��c'
W�t׬h��Yz�4��l��6���W��eK�h8�e�xS�so�E^�����nN��C�
.��˲ܒ|�Pˇj#҇��
v4��/�`�����7���␾t �f�7�h*?��D�7?�X}(�7��V��雇�,p#ߛ����~����am�f��)�M���EL'[e+�pe�%���>C����*���=�����X��C���{E�C�w��O����
���f[XUQv
���uA8������m���*��0u�W{�C��S�Z�:��*�7�*^�U}=��ێg�
v���7��0�_���z�Y\�`V5\��vSlۋ�k�d"��/d��(��fĆP�h���=��P`ܞ%jr�͚�6�Y���Xw��C@�}�f҄�1s�`ᏒN�ݔy�s��ׇ�x%E��$HM
��o���>=�}wr�.?y��X�}��΁�.�M���8�n"�"���\/��"����EF�(� �mbp�d2k��s�p��`�0�C��N�gf��A��<Yʰ H3����!�	���l�,���ŞY�F.�m}@z:�me��Z��4���O���
�2 ��S�#�h?� �n��F݌�e��0�������wnכ� ���QB0=����H����M�%I�OQ�5+W의l�^�����h�ZH55L��d����#:+��2)�K�M�#�;�@�r����M]w�-�
��(�������-�z�j.m��
��ٺ^�`̞0��GȦ�L	���5v����a�2
墄un�`(���E&���O�e�'�Τ��{��2
c?�
ƒؾ��{W�pk#<����?=;9�o���H���*�R��\�5�$e���QJ�>T_���29�2��ӕ�����w?�%���c��~V�yFnnc-�
}m'YyUGp�]�4mwsY�%i�Q�R�
d?$�*�/��,{Q��9i����_�Vm�Jz�?�p��,���r�0����0�I��'ˁ�O���-,�٪�pB����i�0��S���ٮ�ɗ�M����Hͼn�&k�a���?͍�n.U���>�DO��p@�E7�5A�Ќ��,W%`�n�K89#m�T�8�b�ن07LF��²j����>ը��.�D�82]Ƹ-�]��au��l�o(C���v$[�sc3J0��Z�PU�_��3d�G��9�(�S�{j"�'�O�Y���ј�ͻ�Dq�3>"�đ#�	&��)�12y�&`ՙ�[׃�w��H�?ЀQ-�%H�K�(
�����#���2���Vtl��
�0�
"6�Ł�9fI�<��O?�~�y8cIe�i�5Nw�x�C��I�J���"��^f?a7�g�E�����D��4�y<��H�!P;��=���XmWQ���ܴ]�>���^\m��RL43�(�f����U!#���1��_����/���qD���yw�!#�>�=R�<k�+����|�L��,	]��X��!�`4���8��'&?y�ϐ�-x�ANIS>|9Oz����]�>g��j�M�$������e�G�A�Q�
Ά?�b�.�^7ph��^#@�ǚo�e�#�V����X�"*D8���COO4����'`S�Y�d�`{2{|4j���٪8o�o�7�1�ޢ�D�z��ȼ5��z��jp����Wt&�Y���<�v�cd��ؿq���	�dž�أ��Z"����?���d�O|:i��$뾑�W��D�g�o3ϨU��$@�,��S3��ǡ]��G��%����2��.
���z��쐐�#���fl*��,D�=$�th����s���-�Q�Hw&��p8�?1<
�Yǯ����qn�-�B�h�w�_���S��Xw�fN�Q�F罜
�ك�)W������#�Qؼ��Ef���*�����U�%~l��th"pڟ�M���:1o8IЀ����1�J0:.���w
T�j�'V#��h��WW�V:�,��o�тmA��iL:b��Z�{L_���b�uSyUڥ����"��&�:+��b����-�Q#,���]qIX5�N�m:h:��o�䁆�"��Y�\4�e U��ۈ���C5
 #�|dk�yU]��tNh=�j��Mrh}�
?k|V
�Q�
�
F%��K EB�t���q��3k5��2�>g}h].��6�
Hi|����kLN)@��n�À��+��m J�ճ�U'K���"�e_ w°���h����N����g�^�/_�8�+�?�&\�լn�[�����mS]�=�<��Q��M��-AdqB}�ӣ��T�4ؼ�bY_���QbyO�~��:�]��r��$��I�z5
P0��`8�
R
��6�l����8lZ�^��3��F���tkG����8��n�P�r�`�!U���{�JV�Le��V
b6�]h	��5�[������&��0���(B�/H�V:�0�-��-R�M�(�6AǬq�xwk�Ĉ�{�4�qomlJ�m_�t�d��WL}�R1�k��k�r����7�"o/icUCRo�}hz�|U�ԕ�7#�]=�9���	�`��$MT�*������
p��P���t>F/
4�#Y�N�h='C�$�ف��38ʀ�Fܒ_9�*&}�Ш|Q���pd����<ާM\��f}�m��˓4-��!Wj���k^��)�QhA�jd�&�eHQn�x�"b�릑X&����N���g�-��i��)X�=�ŝ���rlnG�N�W$R�%ЍA<!��j �;��=�!O�x�{�&>��dW�����J
`sQ�̍����0M�9/GO��lL���:;Ⱥ7���i���SK�Ƚi^f��<��x0f�Y�l�JK�Vf��2}�V��_���xs�Sϲ��H"�ߖi[�&I�~����Jv��(�_'O��=G���P��V��CY���`�vx�:#���U`,�=f�[TG��Äɘw�*a�����4W0����TWmx�jÌ�~W����!jӻ�p���5"uF��'i#�A��!�է� ��M7�{�q$�/�G=�����V�H5�k�yN2��]�P���簷m�1�nj��L�E�ċ�83}���L��t�je�I�0@~�g�Kf����g�ȴ&O��R.p��{��8��]���e��}ط�t��ElvAຯ�s�;BW��K	�$X�b��w(^�ܘ��\Ll�z�����@`#t�˃��Ă�ٮC�)c���8�>i̐d��=~�޺e� ��������M�Pn'-G��]W/.;M<1}�"jF/Y�Cu<�fiS����#K3�p�ol�1�{�z�W�#)&Zf=HMZ6�G�~2�q�]	�s*��J>:5�Q*��d�*�
�ڳ)i��ui:Ϯd���=�r�6jb��c� 0��z��QEo}���8>�ȅ��Z��5%��͝�?up�ٶ�nY�@K�𘂿c���SӔy T�+M�e��Ff̅t�b�(�du�m��="w�!_���]�a��M�(6�,�;���g��!7�nD�X���`b�D���f##���V
�k5
����ODl�G��d���.>��0���6w���J΢����t��fj��G�-�q}Xl�h[�)P
��q����
��_�u
d'�T�](��bK*����dc�����?��U@�Z*�Lo=Ԅ#+�
�@��=pe��y�pj��Kf�L7_
e�ys�0���ˍ�Rg��w��V���ޕh$|���߼y���o&H!��t$��A�.��n�N�A�)��R;�H�J�������C������	ǝ��/J���0I�`#�L�$FSkP�ЕmQ��٫�<�(�\�oV�EO�m��j�ߐP��/�!�)Sl;�z�V��Axf@�o�3�u���u�Lm�p����0�+�
F��������/­��B3;5���?��/�f�|�M.$���1D���x��sGtՒ����8?�U�8?I�ܷ�5P��v�v��%Uv�9��G��$q�o5(��߽�C��
�(�ۿ@]�Hc�
?K"�z����\��m�X�$_�(ԇIE��t�&fs�z�4uV����H3W/�h6�1���;�CX.S��G�a���o��x����1���q��{��3n]�9�1j��ᄫ:���IR��C�&B�rb��A�L��Y�4��/9˲���S�K�D���E��湸�Q�,��Y��@�x!Gl:��7�Ao-@���1�ٿł,���o��ض���qlqB�|�1h��Ճ����p��2Z���j�M���
�u^��9�0���B-���R��h���3��a-k7~թRa-������PS3�몥��[�U+��l��
�7�Ȝ-|�<�q�j��!+���»*�@��Ӂ��t/��� �
�>�`^έ���/H�eQ���L�y[೶0)����Z��b0b����ORI�W�>r��~�t��0)��<�>
���پ�UB���B��Q�	E��m�E�\��Ύ,8)ҷ&(+B ��q,���US-H�bQ�p�*���̶���#��Q�	m��"\�Mh�����8>$����/ |�։��0/ŏ�S}iz��ȳחCݤ�K��Q$��k*�L�'��S��L?=�O#{��|�W��̡��X�
�g�&�ɇ��~Axv/~I!hj��?��-����,�<I7�R�4��ח�O/�cq�u�'��Rl��&�4�5�F�}��Y��b��IԏJ��
�c�v0�Ĩ���}
�GҪ�bՅ
t�2�5�t��k˜A��6��O�Kp@�g,�_ �+��I��Hl�U
�(b%ͤ;��\1�e}����j��ޗ,��Hh��������0:]�Q�7�0���q��9n�q���������O���_b�2vB��Ր"�'��eW#���q��G�b>w��P�4��5�i���mJ
�~C[��d����7�ϑ�O8����'VL�7"V�l��,5�|i�]!���d0Yd��+�$kƲ�Y#̪��B6גU0gפ���KMF:��5�~wd����!1^�#=�}@��d�t�D�UuY��τ(�����D�2�u�N�e��B;���U�]L�^�i�.�Dϓ���"���I��{��-�	��9�D/N6�����T��1N��r�G�1���2���ӑ��/���(;�	m�#����@�[�i,��U!YA�2�?��\�~���d�ܐw[f�
f���$��
/G뭉�w�^�)WR�:W�l$<�8;��)e�"h�b빏N�s�Z�	�ǗEd��q�����&�{�}��7�:)��9���^��kHf0\���WZV2I�
'��?T$����䕍]��Vg���s&��l}���G�Vr����0іr۴�+bn����t~��wt#���C��c�oB��cxhq�>Z�/X8v!|��p��m��BU�C��R�,�t]�{�W;�\��7}Y�,ǣ���}�
��x	��U��!�mĉ���)��~0}�h�1�|Yf�1�d���0#��\����e�X*Z�'z�Jcd�I@�����ae��<)v�_�`��V/�?�x�)�f�/�3f���o@c�	H���^�����Oߑ�``^�S�g�}��e=o�H��.L��h��"}�|��GX�~��x?��u�}��G�{P/
Ѹ�
����Nz8��.��p���S����V+b%�]옂r�'�jD݊q��7FkĂ�
:}w<փl_�Rl.gQc���Pu��!���ox�&���Y>4��P�9�ύ@l�.u�z����M4��q,pqG}��O���1�us`J}����f+i�Qp&#����1��Q��@�w�p��� ���
�|f����}8��1���kw4D�R:�;��r�ܔ˹�Z�̼�H3M���Mᗣl_4�3��Ƥ��)d����a[�c�@\��妾�k�8N>;��Inu@�n֡N\}���*�^D����*9�Hn��/�����e�1M��0��;���:����Nx]*�&�6쭵��Q� ��V�m��o��bm����Q�>�{}�V�ߝb�V�0O��=?�Aى���-�nO~�(v����wX{woV��`�vCd;���榷�[f���L@�I�l?N[������.9
��L��n�DgΧ~���
S�vŒ��{�z�!�s5a�v�/���G�d�jS�y�`�-�cR6yo� ⠑F�����; ba��󤾮[��iA�4K5S)D��(���q,%�=9�'��M�@+<�fvQ�J=hs��H�y���}�_��HG�u[����ۋ,NI����2ߢC2G��MS*�Ն������O���-�3׳Ԁ׎�nLx��׿�̩8�ee�k�xm���~�cIs�yk�T]��Zq"�kR�춬�7&wU2Z�O��\�C�����qw�����(\7�#�I��H ),N^���V����5^���������|����haԃ�r��*.�̂.R9�Ѿ�b�]�ҭ�T%�qS�q�!�}M%`�=���@W7��5�+��EGyh���m���)�^��%��{��1��)���.ʥ�z:΅r��T m�3[ ��{,�-�0r�[�h=łmqV����ؐ���@I�:��ͼ��&�oJ*6
ʲ��R���в��n�	���e�uEg�kSv��ܴT��p6}E��B��|�}��rji��Ԥ$s�^�ț��
n�3����J��>��g�CE.ZU�3[o�H��l���#�-c!M'ߣxX�`b�2�'�� �D�}���gS/9�(0�ܔ�����+V-:�д�w5��G��V��9���&�52Ҙ�,�{�[�g����tXh��	�'ׇf6/[ ��l�Q�-^���}[�l���k7�.�i��+Nm�t�w�s�)�X�����䅔��	�aS�`��hυ��(�g�(;=R�'�S~���륭;���\7�-yd&=��g�k�_l�a�m�G���3(~�����@;T@@h�����H:��{:��-��e�-Z��2�ۺӈnJ���<8��m�n�kj�I�I�Zl|�Jp��w����AvR��g��Z�ׇ�k��Vm�+��GO�$�T<��4<�/���$�9���
2��U�'y���/�Q|Mf�?9Ԩd���$��9�3�X��0�?b6�5�0��EU����F��>[�����C��a3��G��,��E�T88��>X�[H+�՞W���Qn��XY᱐�i5����!��:�>D���-�i������'����E8u`��}iM?���������1%�q�f�I�cKz,����V"M۝�B���LI�Q�ÿ��px)�����^
�"�d0ј�`����f�
�@���!�4nʖu�o��ByX��7�ɦ4��}ƺ�~�Z���t��cN�"�W�3h�`dT;�|#Ä)�
4�-�H`M�.�X3Ǜۃ�Fz�I��S��T���/Va+���ڹT�}��\L�޸O��2�Χ�/�~P�8Y���&��h~�2b�e�N� F��Q5"�g�f��x�W�$jN��:H�'�z�e�2@_n�n�b(��&������	͐� E�c�}m��ӭ��l��:z�#�3(3ؑ��)o$���.�uiM?��¦Z��Q`8q�x���1Y�̷�o��1_G�6.���^��������)4�Ԭ(	󪞇~}�c��#�+��R{%�&vA+����y��x�6l;$�S��8�CJ6��Y|��Ȩ�ዾb�K����+_�i$�19V�).��� ��c	0�	�BXO�>M��*��})���UL��
�ā"���ʷ,>��;:��Z
���o���4����=���ӗ��~3��Ҭ���[�?V[n���J5ƈ�֚���-
�!�o�_��2��`>rL�0Xp���4���\�����ɈS���
�B�jK��iϟ{�AI���G�q�V���A��%'kt��C��MA܃ی�����~ Q�M�Ii����]�ئ���xM��'��L�Njcob3+�d3�C��b�����
��-�;�)�	%����o��u�aӻ�/�޴H0R�Q~p��L�RA���-M9}��{����`��0��~{��I�ҩ6�$����Ӝ��|�Α�0�c��{��7��NFa|����x���~��zV�"�4^S��9��x?�b��l��7�3���B�����ВT�ru���_n��z=c��n�P�o6�����&(y�4?;�E7��K|*���r�Dj��k"�dM�n��SМ��P���rx��p@��b'��b���=D� �v!���&��r�^�n*��� �|����l~��}ȉh�џ�k��<�hg�#XN�exI�	�`dp��}%���l%���&��ty8X�zp�q�ơoD��W�n�2�֓�;�He��=��[�I�+���f�\�ȹ�(���'>�^�K��������zE����I��(�3X��Q#tU-�Tm$
ј�@��W�S�����i���*��ͨ��n�n��z[��_�Kb�5��٣��6a��.'������*�NG�]�Gې�Į@j��0��b;���;�ҙkrJd0Ϻ�[a��jN)���j���
�V����%�[��!o56��r�ՙ'�6o��uD���~�oYNM�?$�9Y~����l�*Bʛ��!�L�Ukؕ�)�}H�0=02��"%�+ K4�5E�R�5x�"�{�x��~�dul��9�}">�I2zpYn�~�)ΐ&t��Xt���۵�oq��G�.�+w;4�I!B�ئe/]G�]ij��̣>f-r�_�iC��0~P����
�о������m��^��nƤ�z\
p�x̸�4������g@�_�倫�Zg���|S�(Ut{r�$\����쉊]������r��:��1��z���U�{�9�>B�oG(�Z���; �Iz �c��R2Z�2�7�0�?~�Q/�M&�,r��L�
m=��������w/߾?9�X�e�v��{:Y�囤����&��Ǟ(�˱�&��M���ɧ�̫F@K]a��,m���W�2�?�	[@��j�e��"�v!�8�l�tѩ�G�9hb�Gt
�K�N�SJx�����h���| Ұ�z�����ܤґ�J:b<d@qKZ����;
t�U�da7�U�@C�ȍ��`s���.D_)���&�B�imo�t0Q��M��������Y+u/�ӚG��&���pѤvZb��E�a�����'\���1����LQ�|)��C�zo����"��637��<8>cI����0ۑ*�\�w��ӈ�G/1�:���E�O��js.�^��6�FO��$��f�_i�����3=�׊�19�fn���aO���	R	rm�s�Q�.j}J۔�Va�g�lo�d�у�O(<�|}�#S��uǤ�*斒L�:N�hU�)g���y	d�4��a��|M���7�KU$,K��4���dl@V�)�-��@C=��3[N=�q�TT^�uz4f�;7k�u�*Dv�u8;���
L)������LH��d�V�%�&�Չz43���{��x%rzg���s �I7��ƿ���h��=}Q�_�M�*�yҫ���뚲�5g����z���(�UhP)�.��I��"&���Mhv>��7���W(7���*��6Vk�+�`n;��$W7Ú�p�m�E����l���V�}3�	�ydh`��N�ߔ���n�/�D<h`�]�<h���k�vH���#��D䣀[��J6��Hƹ3�8c�Pm%�v$+�B��D���}�a�;�<i�jt�JM�67^"
�,��	�'�$z�)e�oĩ�8?Q�������6 C��R�ACk��hi��?e�������/�:���f�S�2�w��61��
��&7(�i@��x��k)�A���7�mp۞��.F3n��v
Ѳg�#y�~<3�k`K0�5^x���l��o�r��q��O��up�H�lڛ�Z�?�x%50s��r��+�u�,��V��B%���W�dYgV�*�s�O2�!�I�l�6�t�GT5b�Qa�MX���c��\ችf2�|e6��l(�Er�Nq�������"��#MJBQO-X�x�w|x��f����S��n�0�G���#,���@��������(������	��\����j&����w�rȜr݇�
�{N�[��)��ef�|���'O�Ϫq��!�e#@ �O��9��n��6��"��� ��j�{A'��beZ���}��D����+�2:5_
�������ݴ��^��L��i�<F�j�C���x�t[�Q{�Q���SH����� ��l�y��t{�DZ�"�#��G>��/͚�i0���Żč�Ed~�yf��J�)D���4ͣ|��W��甑�&t{Q@(2�,3㌜��Fܛl
�T3�y�%s����T����W\)5����.�; � 34��s����T���*@P��(B�u��)y�ժ/T���y�7�9LJ^2*ͅ1"OA1���/�wQ+G�+�,�M+�^�_�Y�������퍮�+�I��FU[�.�PX�ۖƋ�|/�O��Y�/p`k�
����/�֫��,&�\�+&4T0����8j�>�*aI8���'3�{�9�dR�Se09p%���p(�v��>�R���\��RCI�#�8��x�
A'���&R�⇠�Pk�:5S�iH;Ł�b:�
�>JȽ[	�0����y��U)�ȡ��9�]Z��
�!]q��|���ك*��(u�+j�����k#��Qs�iӢ;M��,H{Q,�T�Q��ja![8q�Y�L����­!tL3�J�k_�+M,i��Zɸ�D�9H{�I��O���v;�n�����(�]u�6�e%].�K�<������K{7�~Vo��{�����Z����:˛��쁻���Sft�EX+�l^a�[k��7��L�����\X�"����yhB������VslV=��.`=�Ir!��)q`o�����֔+��{mM�����F��������M���]3ex`��|w>|g^:C��BЭ��e�n������9�7���
�) i4����z}n`����(�����]�<�F�oY��a�%�8�0��\��c���}�Y�~"4>�wQ�d([�
�c�u���NM`��菑���Ԍ
�P�~BM��O`�QB��6���)�;;y�����q�������g��RB|�U�Pވ3�h���7FS5?i�M;[ֶ
�D��-<�_N
�k,��ӮC�"�$9�5N��uw�F��PVv��/l��ʚ:�CφN2#9=��-ʣGw�&47�������|o��}�'*H��fN�z��[��h�sj�*�w�]��U˙j]����K�j�:1+X��Z���\A3e�7*!*�C��0	��RU�zF�Q
���Nnj�M����.�SD�L�Q�œUIo�B
V�qc2kaB
4*�'���FKiC"��gE��@>��C�ѝ�O�jV�&�T����������_���4�R��Ԫ
u��^vl�&7����[��W�}"R �� 	�b�U�p�$e�vL����U�����}�M�C��Z��J�.��&��_M5�ƌk��*�X�z=�c���~����X�T�4���������┰;��۠���UkD���ԉ�=L~�k�e�d��y �����gK���0�_��ڬ��g��U�ڕ�(,��C�q)���z��#q=���W���������h��͏���]y���W�p׉QuY(����F�sr����P�u���lk���QO� �5�!�)�r�B]�F2���F� %�>����Ͼ{�^�71�W0�����>��,�gL�\��6�*�0Ja���	B��
�"��%��BF��m�Ss=��O��4���� ��z4�k{:�e~���b�\�40�Q���d��0������d��%�r�����������h؉n���8�v7o�`���ɖ��ˋD_��e�y_�k�
a&Y�n
X]e��l�ׅ�'�#-��W���Dre�h+��p����тǃC%d m�友`ˊ)JG �'��Y�����;�q���2&
Y�Zې~��Щ��I�>�R�n֡��M\pJ�ŝ�S��Z�.�?E��PY�Z��2P���ƫD��IF���"2�]�f���hX���5�ji�vQG%�키
�>}�y�x�y�eqb̅�'�
C��e���4-0�f?�?2������5��O?�~�y0Õ+��\Is9�'������O/�J/7�n����K��O.�����-��}�!
�"|Y4�Uc�k����@��2m�������@X.`.�gۭ�/;�,�=˞[9���۲�"m��.CV�)ؗOu?|]v�e�zA��yi]mk=�!K@3;�1U�����o�|{<��z�.�v�7��	,�2��Pͳ��!��
��A��ȗL�6�a"����������C�8z��*�TE��("�5/I鏯����?�:ο;9~���|��w��ܶ0t��j�(��2ٯ�5N�5G�0M��,�����In�I�d31�c�9�\��~𺌪
V#��L�p����2�t-a�:��_D}�
��r�v7�r�Y�cy��ܨ�sv�jL3��a�a}���mgۜJ?�8�3Id��,�*��D4X.r-�'��H�5&J���l����{)� ��\J�k�T�'�8���A�[�6��X^�oPw��s]�7�z�?�@�{��Po�0d�)=�iW��#�I�"c���Iݱ�ބ%���������L��-~
~��)��{\��8'/�eʶ�ɠ�o��d�_􄗦��L<>`�5TR(2C����ߤ�������?{r|Ұ�D�H�e��mٶ�d2����kD���Qi#��!(\�S�SK!�/�nf����[�{bm��A������a3��3{Mh��d���Ǜ�r�� �yS���W
,�XvKU�5yĽO�!�
�ӯ>�������{��\D�Y)ZCT��<;���9p���]q>A_2X%`
�+�n�w�N쿣��WU<1��KL#�
@0,���G��|�կ�l����.YE�hZ.�Z���C��g_�p�(6��dS�=�~'e��Ι����ï���ߍ�����*ExQ���3`8�2ڭVd��K�X$)�(%���Ta�4�F�ҭ"ގ�q0���1:1�P�$C&_*���=��_L�dt`��"}}���XA$���S��娪g'Th���ji����I$�Oa�PC��PkK���i�L�	�6�TX�!���e�uV�zVU�e'�?b���C*��Н��G����~��LI����Z�c2�����:d]�D�y��=���]y�8��{�e��&�Q�����o���g��d"�1�GE��w�����劉�)��'�Gr�#�$�I�)v,��ѤO!f�'�d��%�)z��(���;�	���7}�!(�>����+۪�\tMt���c�	a�W����9!w�q���t�n/�?�I^4�a9�јYj�j�A�>�R��G�҄@�r�D�L6�i��ֆ���=�%+q�.��?���j�o���������mt��?�(h�l���c:a�4����'�I���I4�n�������N������4�[�B7�[ ��UѶ���B'-mG*�Q�g*A�t�L4)�F��0��5��b8P���L��Hy�F��l?O��E3ǦBD��B��NLPH�U�jd�e�%Vz{Cj�z]"�.6;D��o�sW�0��.	�E�
��F?�u��͵;:�3�
��h&�3��3�>{lp�›,����sK4f�����J�5�u�`f�|B��׹�aw�Ӡ��*5\�72r�V�5���(���HZ�=�N�7���s S�I�#�8�9D1�ri��z�y*E�rٵ"�B�6�+C�Gb�0tY��k�̡��h��ri��C��m�k�
P��#�w���/����@O(9��9�[�QiGΕ�tNn$s���r��1�9�4��1D�.BQuz��L��Έ](�h)dI
Z�d�op*�W�ħ�f���~3��x��C��
F�m�z%��L���$��-67ȇW�����|Ul.	�m����d�����x=�� ������;��j��ݙ
	]H��jd�]�����Bt3��G�Ԝ�����@���R]�s8"()�C-*��_AZ�0���kh¿�r!�bqx��}#n���:7.�Ǹ�+ƪ�{�RwR,Z1�_K��G�FcbR�njr�K�y��A�Ę��q���逄P@���,�6:@��u��uҧ�<�	�r�o	�"R�zHIÒ�Qo7#R��e'f�|��ꉱ�S��,ˇ��t�RJrl.���:����w=�=B�o�hR�k~9�1.�m��ue2C~�vHI��[���f˞��6��Gc�'7�u|��C���,+���#��;Tr�	��P�� ��h$�'&pd��ך���U ������@��]���z�wm��@\�L����&�,D� n�]�?.nψ]L\�&���	��:h�i*��1��}�웽�o]�ޙ��0�!|�2IUԸ���Uޭ�
醦��vƘTЭ��g�e�t	ݕ�
��/h�t#�?t�Q<���	v5&zo���#��E�۰�{8Jr�j:Υ�wD$��ךI�O�T�m|�1�Q��Efd!�sVq�ў=z��l�$yܿQ̤�DnDŽ&��h�
����ʓ
n�
K�H����@�	D��ب�*��N����)�W��R<��U�	��_��O���wh���G�O�#O%4�rl\�(=�k�+��e�Je�7ۻ���;���S����+�VG���P�=4o�B�? |l�^�ȹu�[*��~�g	O��ێ��;����O�i�Asƥ��Q44��V��ɡAͪ|�����G�5��}]i���[�^~�>�1�&0R��G��O��8E0w��9�`�)�S�w�/r�]��wo߿y��$?��I��>����/��c�.��d�6�rb�	
�߃��Ŝ4Z��8|7�ߖ���
I,�oԥz��0낳��,����Ck�&v��5���auM|�{m���?�/9��GOf�f_����QN�-g�%������䰬���C������6JM6A��q�?��9��ԥ�ƽ�;䃩�j
6���1d������ߑSb�0�l�/��p5�r��qAN�BPM���^-�n�R9W�*�g��Zuh��X�e�i'8�ި�"������h ��xc�clW+���/�u��_W�H��U�I�O���#@3����أ^����@g`��j�F<ϫ�`
�2�ʇ�rG���88
}����VR�c:/*�'p�7l�*J�Fi�s$ݹ!Odß��Yٳ
�gZ\�WZ���8T_6Z���a�br}F��:�6�s��dW7lަl�E&�C��bX�P>"y���D����J�]UN�S̲o���� �I�"���t�\�|�	�]sh6i�F�:|��9�T���:q@1����d�k���p�ý0y����M�{7�.2�H����$�hg����s�:��	���`V�n%P�%�+oH�wVT+V�Ko}x
���,;ƭ�`pg���ـ��ZFF��v��[\a�L��{p�M.y�'����m&�dh�q�cW���S�xz
W�
)Ȧ�8�����7��k��]q���'lp��9��+cGjQ�ּ�P8>A����A	
�/�!&%���N�(q���&�jRLK޺e"�-��%��}Vm��',G��Hl]���^�a���١g�r^����gJ�K&��+���&� ^�f�E!	鱌�S$h0��,���C�Wt�ɑ���%o��~x�M�OύDq~�D�7�U�d.���\�ɜ�5\��~/vN�����d`��m[�}��2,�&�����	�dQ��@٭�7�9g�ҕ]����p�L^���8O���J�2��z��98?/�]`t��զ���
f�:�*b��5��j�"
uM����B�1���4�U�VH]��ג�!�'u���\����uw��+GaQ�����Fz@�M��Օ�ҽ�8f4�0�c_ZF��o�0�����A;�J8]�T��YIN���������̇-sm��b�oi�;\c\&�`?O� ��� x8�_[����q]�pWX�@�֝}���w��Q�j?��ckIkq�@�k���2m$l���Ib��r���������A7W�Mt���a�HŠ��<����� �3��:՜_���`U0gn6*f�3ஆ�EėwZ�tI׮���i�=^��5*�h�J�$���D�uosX�]�|��'����t��#(r�y��-�a�TK��0]�N��L�6��pH8u:�ay΃�s�e��̷��W��q�>"���FO@p]֋��>M(5�w�ҟ;��Q�r#��]Sc K����A`�S���^�|��4���kr����X��a���>!ilE����\��S��Щ��O�w@ل&�I�Z��/ԩ4vi��b��5�vH�,�OjWԅf��^u��\S�>с�}��m9}n�hzY`��3��gy�,�tp��l{Q�zUͲ��L��qſ����cS#�f���.�R��$^����W�0F28{��X�[,�]�r궯�IB�"9�02�x��K� ]�}�R��H��r�r~�%�H{x���tu��D��=2Hy@�1�LH����r[Kb!��O�X4�q��T�p%�s�����~� ��sD�������L�����YRXL�r]W�q�!�ၫ(�.��-H	�n���Σ䙈ğAD!��WX�+&>�����1�J�Nc��H�Δ�?�q|�;��?���3L�%-YO���n�R��98FR��*,�Ӱ�Xu�"\n��U;�óB5*$H��,Pm�4J���^�)¸�q���\-Vbҭ��z���k�z^���"��ӊ�����>�ϕ]�sg�H����N��=�>�n[߄���-!p�)��jO����} ��F�� �^�؇F(��uS�<��AkѷFX݃��՛#�h�q�;z��m�TDO:�a��N�KU��{Gt�3�L��V��ZBA�W�U�+�j!��zT�! ������Pc�4�Ń�:7�E!8LUo̞����Rb?�2��'�h��Vp9	���,O�e3/C5�qČez�r��u���lQ�"�!M���U��v�DiyH�$��|�ĉD�W@�a��d�o�׳?Ͳ�
VD�8�m:�@s����G7��;�0GlN������ƒ���gE�a��)�d��Ҷ���q�j��3+�8;6މt`q�rh�vz<Xb@족���7c�6�EX�V��s^b
ƕ1�Y�,�ڔE[� Y���і	`g��>�����%�<L��Ѻw�	!U��êmwe{�����U�
���w��|��a�38���r��z9��m�?��9�懏��r�e���_�<�m����=)~��o�,�'�}�믖�~��'�Ģ�E�CŽ��������4��|�;w��m��Ct�1=�*�ե�Gۉ�
q��,k�cl���������n�<���4��A4�(�IH�Cq�4ޘ���{'�6(��}���v�����P}{ӣ�2
Q��������X�;��d�2bې�7���&�I�b���¬��.Y1l$�Z$4g[)V��a�K.���������n%�$��H�!�Ȓi��[�/(�o�R�wpG�vU���hP�:	�*�r
Шx1u�;��)mpn�l]�{�!�fwp�᪰���XX��G~��?��Z���I��iX��劣a�/�^�T���
}�U��NAw>�X�c��k�T�!��I�	
�ۂX���!�tҔ�/�����ÿ��C%�5���/Z�F�$;֝��i�AسUT��v�Z-�=�>�qVcK����Kt�����5#[DZ�匸�	�q��7;>��vV-*��)�������!F�вV�/�D�8;��6�L�*�����Eo�p��rB\�G"&�m�$"ޏ�~�yJ!_���sӾå�?��?�������gHg���j%��x���3Z��8^����s�}E���7�q 6�`�5x�dC�
*�(��ctr���rvL��7�(ϛ,�����C8�ۋ�����X�bMΜ,��9K���"Yc}����<�F(���b�Ifқ
���>�p��O���y�y�ζ�y౷>oN�t&�V�_6�ԜfXG���WCY�M��cW��9�����v�e��Z w��h�Q��b5h�q:"v��E褄P��%B���I�ё$��QōѠ �'�8iy����Axo�������n1S���#QoN����������f[ܠ?���e��n�\�	V��ca�	}
|�T����_�2}h�[H/�9�
9
�P,��4R�D�m�����n�	�L�/�"h�Oԑ�B��%�@�j�,~�Cm���uk���:{�ޓ#�ުcs��?��y�º&������ (��-Z���
��Z=�J�/�
(�pdm��V���?��#��3�'�h��a\�3��r��n�;��O�	����Ņ����}$��dJ�QE��ՆD������Y������-D��/[�S�Ʉ(��l��$I7~J����s.<��E�>��ժ�G�B��fm���I�j��"�,�4�sT�2���G�ǡ#{����_�_�%���Ͽ9~2��~`������(��o1��6^/��RW�NI�Eպ%��Ĺ2X`�R��/���x����V����0=�An�_���t}�A���Ƌ'�u圾�x�:������-[���/���)��q��V�2B�����F
R)��il�L[n:�pGʐ��m�{�Qw�*?�
҃/��_5��&ك8{GU�Ä+d��雲~�ku��i��@q�&�������qф$�D�<%!<�E����4
ܫ��>}�������p8h8`�Ƙ�i0�:���Y�̅49�,İ�{ɭ�2�US�2�"l'��AFg3�Y��m���7�n;zD��p�+��(�p"�t�Km�d���K�Ѡ�7��%���dR
��
}��wF[}���wo�S����5n��A�n�"�(��ͪ�ز��H�c�ghx���T��Vo��GV����8
�X�u4����kȮS�М�("�
a"�먬E��v��{��Q�MpXZ%;ۑ>E������9�͖])Ksm�wY��e�H�O;X\6�2�4>�w�Yۖ���Od�Hmj�l���H���Ձ۴�dch�����\m����{�6~��g'�J������6夑�֎�~7��#:���N.�[d%���F����X҅�~O���Ǐ~�[w�r~��*�1�ˌhO�L�AMc���&��������$�ޏ����|��\^
X��CX����mt���
i�&m����K0�%��
W���(�gB�W�Q���ać{�^�#;��L5�S�S�g���T��/䙠^�X�(�h�`.���Lp<�En�9PnH��)2�h.:�;��U��h~�V�	#`5@d�ተ�M9�=j��)ӊPi���Ś���r�Nt�q��,T�+��g��g��u�`W�o�]��p�'g���=l1&�E:�<1���X;�����z���;�Z�ۚ"�E�C��F�"�:k�V��G`�]䁦�ywDb�R���\�0<��̎�?}����Ͷ���e��0�i�XHs�c͌�D1�P�$+��D�(107�B
6�J�����Fq��c�eE��u��;m"Q�ܿ�!���P]h~��ե(9 I�� F�4I�W�1�Y���Ө����.%���Dz
�b��9'�@BP�!h��?~
��0S�	�m�z����h4x�O:�8s^"0��@stR�_��i�1u�J��=v^M'$��2����t�ߋ�bh��s���\k�6�I�!��-z�}��݊�Z�|�NdD���n.��i�ݢ1*�4t���O��`���u;��Ӳ�	2-�\�A�*#�k����b&c�}p�� (���ٗ�Ҷ��{biRD��"�w2g$4h��?d��{08��ΐ��B���B8��R_�]zU�+���W�n|R�_�M����X!�$��d0�J�[�'PU%�Sf�wq�2�}Ĩm�be��hý�85�?�O��n{&TF�Ȁ�sG�m_��j+^�Gh*+`Vp����>�U,�����-��������Lb�߇���nj��'�3�F����V�%�]s1kw"��۞v�7��n��_�'��\�g���W��Ւtt�nd��������[˿��/n�A�2y�<���zy�D�CD3�/�ftYr�Q����>q^wڴ��}�	�4"�f��c������j�%
�5M����*����ЦG�ᓮ�r)�y2�٨)ϋf����ӻ���>N��y��9m�:�ە{�C�⏑�yh��G`�?�4@^ϙ)3�k�.�-e��c4{���o�?v�ߠ����=ֶ���[JD����V�l�{;f�����M�蹛���.Kݭ>?�����l(��x?p����k4��0����߇����3��E~�^])�v\�&�>M#��v������S�Uz8�/����W)I�g�t�؏�;x�`O�fj��W�Z��n3N�!5r�����;��o��2ip-x]*�~�WW����1O}j���S�_������1�.��#��x�1$�}��	0:7�6�/,�:�Obm�c0��`u[t�Hp��&����yU:0vE�:஫3d�Y�T\dg��#���p�wʅ��䋱���@�d{;F��gs���~M\F���4t3��V�)
(V����x�M������
���`N��Ub)��G_>�B���_�B��ܙ��тkQ�����z�+]l�C�	�X��x�nwNu�|�MxɌ�}��ieEut��It�ښ҆��Q�{�g����1��]�R?��{��)��x5�M0�<�X�iѬ�堇�g�_���`�ű��l�OGqgX����<6\0'�4�냪�:�hHa�aȞ�� QH�-�d��e:�>�WCo����G�o�c�٫�iG.Xg�5e)�d���Ƀ�e� �$�ő˫(7�57O=f!x�^�j��3_p%�|�.�K�\�Z���Ӈ�����j�Ao��@Db�֎�P'�*<�Dq�ĢA��a6������_?���q���p��K�h~�]��o΍9p��9�����tj�|g"ݍ���4!X'�}��w�hl�h*��ܹ\����8~���+�󛉼%�������M���#a/\�?_���Ǐ�/9\�U�G�[��]*��ئ�1u��);�q9boq���w�p�w�	�ݣߘ�@������ӥ
�O�7ew�PK;��W��ߓ'ރ$setuptools/command/editable_wheel.py�}kw�8��w�
��TZ���l����vݱk�g�ا�t���$�f�"9$e[����I9NUz���:������p�F����N[�R�p�u��۴��BeEӦy��;�s�J�4�kՔ�z�U�����v�"k�Y�ww�t�PY�ڒ*fE�����n���	<���EVܨ�n�EڦcU�Z����?��M�~�U��u����v]��F-���j7�ىcU��>8�QJ�Z�K�j��i�5�F��L/�
<*ڬ,4`T�Y��r��� n�ڨ�A�Pin���*���B-�Z�۲�`�l��t:[g�b:Ui�P���U{��� U	`b�-� buZ��h���0���6��]�j��u
H����t���Y
�����Z�5 f�(�N�L����[��770�gV�oec�5��6��-hk���β.W�<�)Sw]��7
��b�2%'��*@��s
,�R�Җ%N�ߦY�e�B^_��Z���tRr���l#�6��Ԋ�����'��O���O�>�G�ټ�o��
�����Y#�>���g�]���ueZ_n*��4�[�&;�F�:@�}�ZQ�nR��*ͳ���Ԉ��r���e��"]�����"k��FV�>�Y�Hd� ����c�^g�5�i�Һ��6!���ĊgE�aL.p��Dk�9����A��:�,�w����<o�����`P�$ZL�������+&����H��I�Q?�臉�ױ1d��l�y���,�M�D�h�h�A:��*G}�#�5wdyu��s�3�Ep
�T,%磉���bqH-�;	.z��f��7��@Ϣ$A�I�ŝy�6�JND2~,:…+T@1���e�d(9�"�fY��Y�-��.2�S���[��u["�̡��b�Mt��*{�䧣�}���� 3�L��k
��(�tL�K��5Cޯ�
�1��F�5/W��+mQr�
��W�e��ڴ���~���/'�.O�DZ%3��/��/��#F��������'z,t����>��cFe��xyv|v��u8�K:�X�߽y�.���h��rAz��8��`]Lh
�,BV����(��O��f�v�!���^�E���
]��ݱ��cÏ�����˱��6IVz5�e�$$��+K��Gu�?��贸ٸp��C?�_buYo�.O�n<��9���9��>'�b���(�N,�f�o]�&������KX�<����b�g����fZ	�����k�A�D�5hlL;�i�ks͙EZ�j��t���e��,ZX0h��mM+�P-���++`��C�W F�B��	�����o�`x�˂D��/�mW�@[���C30k+|��ȋ؏D��d0L)�(
3�O�<�}py��rę��K���t�K��4&E��kJl�Z�FՀ6��zH��]����Dz�z�,��p�����.�@�8�5�L\�)���h����5(��a��O�Q��A
lQk�4�ЫtC��
���wPk]��u; �ŤMDu�c	Ѩ<�C��:e��)Є}���s/(G%aZ41ZJ��ۗvS�6�Gj)�\��)�4�����1�t�_�hw��8_`E)��y�1�'���{rM�'hA]�#A�%y[(p]"���+���z�cK�3(��'��B�|���Ӧ��`���H�t>>S��.����)�������O�'�|:���>}�ǁq���e��X�"fI)Sv��,�E#4H���9�f���_�֚�Y4�ު�g��r*F�Iw�)��0K��z����u�Ua|sb}�����Y� �Fcim��A��e����ձSB���AO���
"�[kTu�+ak��k*��Y�A�\�C��u����M=O��=�l�TJ�i%����
��l��Q��{�y��<�Flմ0Cn�����C"��A/�����#�.�/���'��6N�E�lſW�h�P�,lն�>�Z{L$r"ͨ/�	��L�����7ˆj���eE}�쌏��r��%���zѫ�9�ஐ�6�	���yb*�<Ĩ1�"d�~	K;��c=[��t�U
���|�
�ju,՟����_� �qi�Cw|q��j���cP� Ee�����2L�
2���ЕW�AP�X����T��PS[q �h�p�FN�w�/:�€q�������h�pA7�'1Dm!(��BaHU{��ZYf��<�R���;+@	�;K0�(�v�B�
(��;�s���˥��u$C-�i�<=�Z����j 6��WN4B�
~�x�)�{��2N|���sj�F���d�X���3�O��͍�j^�����K�p�E�8��Z[�/207u�auf茠��J��b9���&/g��u�
��b���}�M��b,�\�d�8W��it���u��Ÿ���DBmy6�O�U���o��5X��M��f���L���q�{Y�y����!��{�-c�F�H� ��#>`�fKv�@����R�=�}�%�� q�2_h��cϼ���n���`N��6�#�Z��N��¨ԏ�?�`�z�?���W�V�b��:Td1�B�aO�g��S�>��^��7pNk�BF�Ha�=[f��Д�E��2v�L��0��Dpߞ5��=��bāA�f�\�����=k݀��8�Z^�z�����K)-��D-GO����X�|�����`H���Hk�2E�4!��F�w�қ�����-5P:��]L��m;��E�S}�1�9��4�Y�c��E��0�C�3P����Y�X�y9�3�<�T�%���y�Tz^���
�<���=��]�bt�{%��n	?�E�
��Q+�s���n�ȷ�5eU��N���!��B餜�j�"��c��(]
�����/�f+&�¨+��M��_ܠ:T?�`<�+�MJ�J�-cD―�!�U@'P:Q����͔Tq�G������B��;�5A�/���hZ^��h�̪�5�W�A�އ��s�Ղ,HD��������t��z0�B̗۴I[`�0qJ�0ꀗ.�!;!�H[�!� #cH)`�$С~Hk2�*�fY�����15�	�L0��#`�d�q�5�_�f9���]�K����d4([c�׶tś���P���~6�!3�]����^8��X�64GD���H{��1�/��_�C"D�H��u��D�+Ӑ{|��� <'����ְ��8"�.}/o��XN�QG�"���C�>�s�Լ'<CBY�=�����􍜩�\����Ć�o�R�}�n��6
ȖW?��7oa�-�!��w�JXtU��d���-W��ҨUvsۚ�
�O|�ڀ�@p��,[�]�N���	2�� ��A�z�����}��}?��A�d�B��%�gᎏs�h��w]�n3�&C�6���5�! =/�M5=džR�n�&���oպ���N�Y1����S�nS�����D�������ϲ��uW�:]�m=�G9����
&D���G�u	��{˜b�X]�on�)��?���
&I����dS�P/؅
��;��Au@}`�5	y�xS��?IO}�-6���@?�(�m��7�8�e�Qj$����롯���_�`ʩ2���ݹ�X�f<�
�x��/;���K̛�8G�uw�sd���5?P�ަm$/[T���T��_g��`I?��8���`���S�j/)��f����@~,L���[]�q�juK�3��`���%~��S꜇��C�AΗ=ptQ�#<��G�w����0��:���3H�ڄԎ���6s9�*�aN�@�p�kv۶Us����W�*��r_��oִ�.��)�e�Z?qr�j3�3b,?����P$‘�(g���1�>`D3�6�_lܔ�fd�
7z ���<�f��ަ'U��s�^��FE��-jnhK���~>p>E[u�7�-t;��h�
eH�7��H�I#���!����B>4�P�g�&s2+��ٽ6h.GO�/{O�C����r'���'�&� Yѵ���~�*��<+�HJ'�~8��5��2{<��mo;���녓Z
R}�-��SL3�?m�������	|����|F
�ٓ�l}���(�hϷ��;�t9��1�g�0�<����
����D���N�������Kh�����	L�&�T�8)9.����h�3���ٯv���֙t�<U%%��[J���gi�R18�SxC��6mSD�^�F��edvJ
(�8h���%/��1�p`2�|�:A�sG���K��
é!/�1�˅Q|��yҋ������]HG���?�s25��;N3��骴>��5cbEz�"�I�$�Źkf�
�%8RK�4L�3y�6�-�7��a#Nk�����<K@?�-�vcɍ{2�ɮ���2�k��Y�{���I�@�3?M�8XX
Mc���t�u� 2`�	 58Y���
��S���6�1Fg�i4�bj�.������
H�d$Ys;�vȜ�艡�K�?X�W�3}�
��˶$��ɽ@�c~����^��6��:���;��[�����%X�e��0(��9.[�ur(��rt�,w�K�CW@'�e�k2�m��cC]���K"?I�%��$"�%�;��j4�mL���=��y^s���gj=f��]�c.�>��ݺ�]8欔�L���k@#���tA�
�@��6���<,���”2T��g�u;��B��r�*�6��'{�zr�N�����{��	,IP�OR���{y��_W�X�}�ú0:~�Z57��<v�Qr�DN�k��IJ�
��8�NL�X���)bG�V6�a�m�H��族��Q$�!�T����?��Ufn�t�1t�S��s�\n:G�p�>zX

~�9<pؙ ��n
���-	��'qfd݌�L�R������q�uv1Q �=�V:-��۴^ �@�
XlV�Lp�+�� &Fn�����0p}�X���G�Gs�I������u�e$���w|ÓL[��Q��i������숵�E�/x�ٺ�}b��L���S�����s��N&��o�t�1���U��\���5Ƞ����9g{���u�;��Ys-{��;6`�d�W�'ZXƚ�K;[F.�(BGa�U������8`~ ��=6}'-��Ǟa��05��e��m���������/�g{g≆G��pB"�\P�8�vY,�����c�`���`�p�/�tx5��
��f����'�Xp��̂Lٸ6_L���~'���h�/�At�z��!^�ۉ�Z�;�{s"��ӓ��l��5uO�����L0��U��@]�qUV���"{���L�>��;�j�,�ء�K�&��� mC>U(?䈶Ͷ}G��f�;Y6��ˇmh8p�j|�q%���
���U�(��n�����53+<�ϳ��9��n�i��x�;0�@����$�p��������@�9��r�>�04�:m$Y�xd����)�x�s�3O�r4��i������:��й��7�G]�\bP��w�E��6W�79l�tc��H}�f[V	����h[�g.�M	&xu���::�w"�����D�ω
"P�|P`�rh?�Ie	yM�4����{R�q�
�pZބ���A��yu�0U��Yݮ�`3��t�8�z��M:�xmQ�����J���-\2ꄲ�q������fL�ғn���k���+�R�goO}ִU�.t�g��+dH��	 �YLot���$���\s�{iAb��h��0��/�B��ࢽI
���=-�\�>�;63�Qqȶqq/��$q�d ���cP3�`��#w�$����y����=A�Q���"N��`�n�{��\��}��Dz��o]�a|Gf�4���fD������š��n�c?�Q~�������VC_��3��H@��>�n�a�y�2 �M�@mӶ0�\`�d��	bB�^P��b]���������+�w����x�
��R�7ZcD��������@�z���H��Jw֎�”J�Rj^���n�H>��[�BM�PVDn�v:����Q�6�z�!�ޗ>^���o߼���R/�����ß�ލ"�u1'�����x��X�����5G�$26G���Y$��J>�$�bX��ġr��ѷ8g���Cg���Vrl�Ӄ�A��vcB~�-���
�-@o�VbGN�f���N'|�
F�Ls4.�S�T�
U�E�2�C80ޝ_�i��v/jN�趛�޾�F<���2�+���Y4���p`n�>�)^��Dz�R?��g��Q�U'�q���
�n�2_7��d��7=�#��"����7���p ]=GX�
y /d�S����#��Ipm��}�w&`� o��'���yEr�ˈ[�=��-�O��p�
}���E�����P�LL��M�1���1��$�1����y<}�]�3<��K����}sB��(�8�,as��
�nb/N�~{aU4��K74r��Z���u���ϒ���L��M�V�������àJ{��ʈ �L/��]
w:��u��5�~�(>�'+)�b�a�k�=��y�N�v�y
�t!�_����N�s��Fk��5_Q~�6����rU��ֿ~
������F���d_�m�!J�4�AN����������Mwa�O�8�ౌ��z߇e��� %d�ړr[@L�nϾ3�� }k>��~�~�m�"l:<>�o3�#�n�:	a�C���0E~'l~�=��
Hwf
��37{Ư����Tc��[W�lE�Kw��6�Mzz.�5wȏ0�s0@�=�AW�b�P�,�#\��14�Z��i.C˽,��D.a�_���Մ���t����2�J�<d���M�����X!w-<{u�y��V@�:|���w7����$�t���7��.�Pm¶;�<�$1x��u|�׸�T���A��3��;�:S��������Ц~ǙL=�#B�L.(
�?v�듀���9Ը?v�T���s��T7�lY�P��@����݌��R�w���o�|f��#�U4��?*�z��]��gR��Nro+v��|��m��@hR����k�={��t�Ϋz_�G��k�I{;���,X�
���[��l������v�������9�X?ґM��C�k��2�5ى��;"�&��8�*�5��C7�FA" ،ӟ�~��s�™�X#������do���
N�7͑��&G�y�M�ao�Ⱦ����_��\��Y�T��m�
Q>����硫	���n-x�� z�N���r0�wv2�h��D�M'o�%̾��֒0�	ѐ1ӈa V�|.�ƿ	��빔R�2'5���x褏:��%1�r?���$l$^�`@Z�YҚ�j_��3�����ݶ�~ߍ	��x}|������,���he.���i;���+���z=�3w�SSo8�f��&P���a�UY,�`m�M&��!���=�Pė��5��C�w�Ø}����{
��%xjo1���߇
L�O>���xw�]��
l$��eY�� ����S*`a�o�"Abr��=���K��)cϓ�β����f"���]�s�vc���W��߭��G=[�큖�*FZ�Ew�mW.�}�0�蛾��,k���J�@�.+�{aP5l����#�;!Q�6"�[���f����j��ʜ�p��K��΅$a�VO�y�&n��1����x�����#K�n����
���_g�T���@�x�������f'6|�Ig[�π�FNqCq��	h����(��v�Z�l���)�L2��ǫ��
��h�A�;��%=J��m{���MxB �h��E
tH)׮��Z��޴؄�J$�9����d�7�������#q��_��*_��uC�4xJ9C�#�$qP��g!��b�$�f��^Kj���D���}׏{t��b�PF7�������-��=7���%��>}O݃�@�Z� :��a���{���8���z��u?8����s�w'��O�8�x���T�&I�2���q,N,����1�.�<�-�1572$@���er/�"'Y_#f�X�;��OВ%vM�-��W޹�_dg�%�:�K���U����S�r�^�)d�s��m��/��{|�9�����G�ٳ���dU/S��oT���w��1��f��K7|ӿ�g&_�
]�E��Q� �j�ê�
^��t{��Jё�.yo��l�vx{թ�7	�
���F���,�'��x�(������j���L;��ľ־u����L1r���ư���ޞ�9�;;�O���O~I.O>�8�<�4�M�W��y6���f��r���F�y�3*�ڌ�ޤ+	Ыldx�Q�=.:��A�+�r�Ʉ�ט��}�w>���d�$�	�X}:�xrq~���RIJ�˟ ����>�L
(�i�	���,�d�˚�қ{�s�4q��"��o�B;U�gh|�)�̲݃�juj�յ��w44�;zץ(ċ!��x�?]������©)�2m���²0J�ה��{���d�ϔ�����8._��p#���\� &:��ȑڪ.a�Vr
����wr�g.Gų[�&�`jb�	���/	�n"�e�.���B���F���| a�n����x���cWf�$x/�k�G���4&�b�W�^u�3v��@�6�:8���me�]!��.�d�
�7�;(DIP������뱵����Q��#�-z��gG�E�����u9;�
����n:n̿-��yT�"J���.�-�DC^:)�z�5��$�H��KeĮ���w��f�/Q6�s���4!S����ġ�h�Y�	��X�&.���dL�_��q�����R�Eһd�~fT[�}XItD�ís>Gy�i|�OX��"�d�}H�"n�3��@�<���>O���d#�oD�y�d�v��]�w|�o�`L�d^v�:�b�~Nh��t	�Ǹ=Z,��pfhV�W�x��
P���->B�����	�Ag]���e�X2Dm/�6>m�`wt~z���v|�f�=+L{�A�/�K��X��X�_�
������t��5�,�����O�g'���`���w�<�c�l�No�z�茁.��9���FM��Iɇ�	�tڙ��4C�#O���Ω�	�)��j�HUu���7���rw&����ɂÁ���8�4;y5,f
���0��H��1|	X�{��t�\���ǣ_���9[��=��\unr|ryt��}.ztT���Ī��|p殜�>I��iY�/����;w�ՙ.e���+�0:�BCW�]������}�߁ÇM�i�3�:�<.�R��s��ԉN��C�s6�]����'$��%f��{����=�NV�n�}C2�&|�|6�^Z�c=�`�H0[h���c�;���^��|�
��i�]:S��lvx���}�����{�����̴G���Ӏ�8z�k���yY����#^o�dI"�^:��Nt�V�����1!�Ḧ���P�׀!+�pLx�s���I�\So�S4�KNމZ��A2�~##`���)�aT�NZ��\[0ip�s	���}\:�+���
�| {���
�X-���������&�����Ir|��$��^���PK;��W�
xk�gsetuptools/command/egg_info.py�=�w�Ƒ����O�C�v�����\�j��/v���%�
P,(�u��������{uH������|��v2��o۾i*���f��E��봬W��ы�g=g+J�w�rۗM	�]N�4t<�n�`$˛��u/&���Ѫk64F�UY�
��r�6]�^�o�{&X����x�5��C^���`��ΪW����@�w}�f�U�Ow������;�]/B���uN��?4�S�'�3?����7U��
E�$Ie[U.5z�gE�g���=:w��mJ����u�m���G�Ugӷ���D׫�,�u���a��
Q8̣/�z�U׀�M�w��oZ3�e��V�z��u�S� ��ض�.��d7�����j���R	�C��}�,���e�֬�ͺ���3#_��	��G������_�7�t���������(Y!��1HLr+�?��)t/���]V�
�$
4�#��S����{v�^���g��f۴�c��ϯ�����?ܢ��$�r�n�[��Ϫ��qR���Ч��m�u���b�H8W0eQ�V�6#��jXK~����U�_����[�n˪ȳ�@D�$8V��f]E��@MT�a�5͖Ͷ�?�Lϡ�ޱz�Y�5+^�E�-։�����#�@�b��J��5�~�_��/�+@&���ʄ��2�Cp٠`JX��"�����#7"Aʂ��S9%|�.O�ȳ�cjĶ��E�s"�?�ˈ�:��p����\��&b9��� ��:�Y��sV�Zwc'�ّ����W@��C��p�?�pQ�ϐ-�N�)��Z'T�R�|����Z-Z~���������$�M
�p0��%L�<��6^	��(��
2
��ߟ�/��A~X>͘a��CkX�[��,�5��HP��۫F�6�v�K�k�P/\Ƽ.A����%�È���	0;�ɠ�,��O�7"v
�g�X�a/J%����K	$�^��!Ce3r;:�Q�E�Y�>�;��K0՝������]�N����e]�.E����g#�]�-t+{��O.i�@+��t�$d�%!���:��R�6��'�5B�o��W	T1
u^55�%�U�%��a(~�(:��|�f������b8�Ӭ�#z԰,40h�V�q�{f����=@D�\*E����8n�5�v�[�
Z_��S"o���t�u\s��uْ�T֢,��^,a+\�^���Hh�	���jŽA�R�X��"�z�|-����/�� �YZ�pE���qx�iؐ��υ�,��@���=l��[�q)���S��A%
,=�y�
�3�繞
�>�@�㎎��]��I�t�x��8�e�C�[U�Z���7��웳o_�_����Ͽ�}lɓ3�1jԆ�u�܂�
����@�V�F?�o�5-ě;�zri�k�V�;���C�Dd+���q'k�˦��5�z͋T�	�$��!�Z��vK�{�k(��C�Խ�$N�<3�z:�i��DLe@w��a9���7	��𜓧� fVTj��$RjF�^�
�d�#g|#��G$��EǞ�)���C��AXdf$��|�$M��?�Y�/8��K��G�S\&��cK�3O�-!'��!�6��.g�z�8l�z��n���v�k��Y�y�hwSƂp�n9x�7��Y<A�a?
X[š����;�"[�L�oOI���-��iK q�H.m�7�W|�.7�[�=���p�|� ��1aqK˻��U�q-,q����Q��N�C�xW����S��kQz�V\�n�+������K���)Y"#|w9o��N4$g5��?(�z�Ve�tI��*�y�hX��}\� �n2��O��4n�Q������\��C<9���渘���2H��4gZ��$�ƌh�[{2�Y6��Wʻ����'��ӭ��V��nbb=<_�E`	r͂��Ϳ(��R:D��b�d1p8�V�)l��8�Ͷ�*�N�TS�1��l'�����</
F��ɦe1O�	��ӧ�~��_}5�=�o��I�.�;��W;LZUe^�(��΂��V7���%p�M�Wۂ�X^��_���C�̳��]�ܖ�Q����?����̡5��JŊ�_�$�3@{�e��b�F���5��5��;l/נ4x�a�?�$��\��l�J�=�O��(�H�dI�M��q���.@eC��B���ض��E��4�`(+��k��w��M��t�!�[���ذ+&�u�a/���|⃈d��ǩ�HV�1ы��㖽1�DI�
�M�^�2�0ݥoKI�u������(5�7�
���L����}xӔ��nY�]����Ey/b���[4�w���H�s���#$^�,�>��\�kZM��`sη��'o��q�'xጽE����x������W�^Ο�}.
Rtɬ�~_����sk��@
�j�ع���UYT	�`��=D���� �s`�$��m�!�%��H^�B/�
C��c�v�0�߱m�s/�A�>�J�ץ#�0p-x�o���P��w�|HQ���l�N���w�'�ra;��y+�6<��pb���8��7���XL(�ag�(�ڰ1��5|u2���H��_b�M'qgJ:�r,@���Y�>W����Ys�{N�J�}�&�C��#�ѵA;p[�Nٱ8	��X�7f*���)�=��͞�Rp��3O�%�y
|f6:&�������H`gB�#er`-`�"P��#
(�7�R��3��KjN#|BM1�n���nP�bn�<_��@����)�}�@f~ߩ�L�؆M:�\���l�<cP��� �I��3u�|�~.~�}�8V�'�A����H����
u"8�=���=����8+�F�3���_��}��|��gS��z�f\s�H�:Ȯ�:.0���kP�3��!�R��sZD�
�����^U~	��Ҍ�0}�RA��FO?�B}��m~3�4��>���kC�ҍ�\����0�M�d!�s_�'ww�4�I��]ք]?K��|?��|!�+0�����`v�\W
��`P1�3'Zy�D���3��ur������]y�.��g�H�k��5�bhs<�ۮ��҂W���Z���c�;�h��8�s�������{-P\z�EI�Gy��t3��CRT�P�Lf|`�A��y�@���[,$ڄ�t�Hơ$:aA�\,����;�� 1���b�ĸ�$�Å�k:�)O�ր��¥	�øf�F3��S�[�@TH�*��k�2��d-HD][��ff�^�=��q����!�����0�U
��x$�qfӶ�t��P�jT͚�wb��iH?*����0
�䤓P��g6rG
��Ù���p'ݳ�ebu�Q�Z�zʲ��Y]�A�IDz��8qwR��ۀء
�e�&X�+�\r:�$zn��,
�2.#�
S'8ASy��!����p���+�l���WϘH�"��]
��Y�Bw��cE���g��ؗJق���1,ӆZo<�~)��'3h�n4�$�d�X����9�W�c��GSK�kܒq���aPCE��������w����X�V�H�^E���U)9�M:3���1�c��"�P�q	Lk��@�cՆ��L�̘��瑞\�Q'�@kɟaQ��&+��H��&�"�t܋�U����5趮,d�
��r)�̏"H,����<I��ef��ZjXu�׋��O�	�-�򺚎XwA� ��T&�E�?��������c�ο��ūw�x��Ĺ��R�[ݳj�����X�w��X�� w����{Ӫ.'�:X��w�4$�*؞cS���7t�vl���!�чk�Ly+O�&��f+؛�ߞ�~��=�,�Y8�|v�jSV��]�r|�]�m;J�2B���(�-���=`��lj>�Ź��3���Ry.(P���w{�������T��������.��V��6��JO�J���xy2[����,��ҡy��m�s�������2ѝ��5�W��#9�:����H��jDD�/�Bu�$���`��3^ T]3x����e韤�?��g�ӌ%�:�?��)��X/`��*	�T���_��S%/�kx�v�uR_�NXJ�U'@�k:W
	��!㳀�B�vÝ����b�
�m،G�6��O���b����A�;p���KС�gHI_l����u�<LT�u
NYU�hk�cM��J�h�Tf�ӌ+<�6����HN�A�TY��%��k�&�i��=(�_�Ah�ӝ��ͱ-�9��b��|"{>y���i��X�����<D�n��Y��}<pԢM�T�i�F��%1�;��ǎ,Ư��0��4��H�0�[cI�<�P�D�/!�Ώ�i.������<��b6o��D�5�h��l@9S���G�
m���|:f�%Гy��%�kId`U����&�EN'���� �M-Ej���%��(Y���ȋ�
k�AI�L���A�(yXm�.�.KQ�g�_1��Y|4�,�q�q`�ޣ�f���L:nfP��";DHCb_���<���%��'���'�ꍄ��3�_�ڏ:�>�t1~،=�I�V�u|����N�wNj2�lOi�w4��8��@\g��+$��V6���<�ݖ��xLbt�{�&D�W�""5�.`q�["];���񎍉��U�;��
�Og�Ey9B�dM$���uA�?t�x�w�ЋC�F^���Jmk�
Dhv���$e�D�{��Q�bE��)�Ι�?-�:/�x5���֬���
��*K7��(�{h-��>i-�m>rqSC���3�5J���Ņ��B�žQ��g���\�)O��.���mU镅���Y��g�pf�:G����l<��Z.P��&�L�������K�T���Mh^����+8����%X4㩴!�c�?��ç��Hv�g�y���0U+on"ǧr�s�%����̆	�PZ�͵����\�ʼD
�uke��&xO)��)�$R�%6&�0�T���5c:)@f���+���y��2�ߠg�U*�"}����::{�{�#�������;u���on�@�`��sqz��ҕ�+����Ąİ�K�"�����3Q+�N�'��ub����h-*�L�`f=�w�۬�FN4ߖ�_8��𬩫C��]�x�m��c��m���!(4��A��P�(iP��g�`XӃ	��E��-6��j �ߊ޹��7�$� s#���,kN�^�9���z�9��4vH��<�P�*)U������r�����uٶ@����7u�yN�Xt���Fһ �Lq���}�$1@��Q����HN��R��U�F���l�Հ2�v���xZF
��1�g�졍���E�A���CF��PeU��yZX��j|mxH�N�qc����Uj�I��E%X�C3H!=R�>��~�;���S�81�������2l��	���'P�捝lz����-�[��vK��x~-�[a�p�e�*�j/lѫ�Q;b;�қGVr�����dEr��G�辗��ƌd�
>����J=Oʉ��:�g{��O�����䓯ဪM�U!Ta�V�9�?�H����ɽV��i:��ʡR��؜����kP�ȜG�1�,��t���=*{iyf2��Zyɬ�sn.ݽ�0|��-țJ<�0���1<e�i�2�=��C�=:�Ϯ�y1މĆ�R��{���t���Vl��:�%$�w�[	���;n^?ݾ)EB�wK�SI3|�iP&g�;�#��8?k�q�G�H׫yu!VP�e������(��8/��ms��;��]Ar���ԛ�n�v�.����b5
�'����E�5U���[�<~��[p��ܿؖ,Θ�geU��c!��=��Rf��4�ʿ#��x��K�9T�!tPy'Tu-O`eJ.}R�3|l���+۔�l9!2�w��q^e�H�u�U �M�:P�w�	N�XV���=	��i�P�ʇ=���Y5���F	��c��>,U=�DU4�
�T��E��R���R��䋘I��LCwP��ݹ�̜Z�"PԞ1~�k�FTM���p��m� ��~S�'1{�� j���4ߘ�x�@��"U�V�)C/�d&P�
/�h��V �^���S'�w%ua�ꬊ���k����W|�������/�Jμ	��7���ж�u�ۙ���]�T��(V>]����t�]����^�P���h�炎m�����am|)���yK�**�[�A�4���!?:⇝q�:�2� .�4Q�P���c�&g�'�~���6�7s��x��-�<�����=ˌ1�M�_�MsOo5��k�ÐcD"
d�v~��?�ё`�v�4��Ż_^��qSOUی�����m�0Ț�~�Nk������=��U���2B�2��łT�b1��b�I��}tA�U���`=��^��A���aNCU
K�Vеm'i���F&��&���.��"KJ�L���r:��H�M��F�/Q�:<!ѻ1����rO>��U&h�k��G��O��hc��2r�jV�{����Л�	ߔA�d�'Y�R^V4\ޡ)k �^�3�����8�%���Z(�"�y��^�$̷�PR��ի�!���]΃�K���B��E�MW�'W}ߊ�'OZނ���������o��WO���X���U1\�.���
�3俁��B=�X`4�{g�>L
b���s���}�y+���m�����v�,�.�j�(��4���ّ$����D�8�0�Rё|"�^�%�X����"(?�y2a0��������
>�Q�%s�:��L�?�QG�R�/Mn��)�SY��GJ��Z�������~WY=`ͪ�W��aM{��gl���u���S�+@*�B�np�G{d�vl���s�F>�|F��QY�B]�� ��^���ZIk��d8i)@��jѨ�$�*�n�HK���Jq�
�v0��3r���*@5X��]rEMW���p�?�
��?ʖ�u�oTYG��Q�c�~��È�3�ň!��TU��R4x!�i�{��/
����z�ҋ��3*tm�5���8�.X�v�~�_�WR
�Wic���WB������wFC�=���E`�--���ف���ѕ�K�t̍��)��[�Z+!y�c�	J����
���S]�F.�ǫb�̾m��g�Վ����+� ���Ww���g檦{�H2�}���p���a5����~�.�0�7���-�!�X8�u��8��<���V/�G	��)>�Z�C(0�8���(�ٽܮ8�1�����%��jS�e?ժ�s����)=�-z�?;	1��,��~3:M������=��F4_(����W>�sH�(h��M00r��p��ȟi�'_�RT�<`f���j�>]P��{%�2cw��{��q�LuXTC��%��D��h��"�.7��9�?�`����ݸ��">�%6�?cދ�Bd��FzOj�t��v�x�A5~<iw�z1e�_�8�R�����/��ݨ�+Oo��W�5>�8��C�%�nÄ;U6�y������s5z�N%��:H��PK;��W�5n��setuptools/command/install.py�Xߏ۸~�_�zd���nZ�F{m.@���R4E�Ph���P�JR���P�D��MpzصDq~~3�Q��5)�u��Rn�6����Ƒ7����'\Y��l�7��>��\�M=�O�]�L�6;&%a�h#���M�]�8��]Th�gf�P�ў_�7����9�տ��6�jx�Xܐ�FhC�&��������϶~�å�`�"��I��2�X�7�j��$JN�#�S�LA
''�����;��l�t
�M.섵-���ׯw�A6�{��,�B2kI�_ŋ��k�\��r™�F)��LoX�����
W%Wx;^Dk��u���3h����7�ʴ,���m� k �$� xZ����A8�2�a��\o���/�2�|�čU[��q���n�/�M��kI�,AMI��u��&�V�Ģ%���A.+�`F��h���`ܣ�{�q���|9��3��ֿ�����y�4#�@�&G ����KVJ�"��<���F4ξ�~�;W�,E�V��7%�g�	&�o|��
ep�RMR^�"a�K�B)4�;yI�������{Ң$�U��|�<���QNv4��qVn<X}�z�l��nDCM�d3,����nA轥s;S�-�yk�~9����Gzd�Zɩ�;f�($t�Ww��w�w}��6�6����r&��|�����.ښ+GN����:�k�>J�Пt�X��pz�XX��M4Ol*��TB��]|OV�����y���`/ �uOQ
��+)��6��wj.�y\s]l�}����P|î�P/<����㻢�0�����8,�q'���;���`v�����	/����0�q1�W/��nI�Z�	\@T�n{�XE�՞"��X}�^^7tt{�5�8q�
��N�t�)@C~O�n��HQ��?�Q��r�ԉ���u��%LA��7ق�?k�%f��Ja�S�ܐwG�
���X	M�p�`
���C�c��vCBc�AH�O�7�UZ_hI�m�j���B�Q�eS��y�n�OC�
�p%ϲNW�:P\�!�@���z�E��6�ߙ�k�
_Ī�J��e��5��w�1-Zc�?W��j��#����M�m<�= ��o�LΦ�3�\Z~��:0��|�
w0�jP)�]���޹ȵx\����K� "`��&�%�T��~/u�ɻ������!�7mƀ������ti�FQ�}�,d�)q�r����č���!gy��Lu=�w�Mb��k^
��A�m-�'w�6'vn��:<����`޳'`���)6c8R�(��G4�tӝ��
3��M1�,ޭbOLH��Q�[&q�r�)A��\�J�a���C�ȫ�Z���^_K��9�I�:R�2M���i�'� ?%,`�p$�	R9�&%G��*@n����_�.c���o��m��@���=�g�|�K/���n��M��U�C8=rM��~!��i�r��O���:��q��x�/}z�Lc	��T��ͩ����Y�FO�?�P�*�s<q�9=ˢ>�7�G���#X��X�Z�����עZX^��ꐃ�����������Y��8� ڨ�F/�Z��8OQ/\������<
�Y����S�>�zPb���A���*���)(j���������gf�v��:;� �؏m��	�>b��>6�re[�󁐗PƐ��ʴB��w�Iu��[��N��c���4�r�_h�"k���E��Dn��O�8���F@[k�A̿O�dM��Iv��-�<�#�`wɿR[0��b��g���le��Ԅ�U6��M�D�Dž����M���ZKӺDŽ�D8;������ߢé���U�~���]�i
7nu�����48���� ��9/�{?��C�7t����
���#�G�#�������a���#������|�-�f���W �>l�_�xi��d]~�{��T��
����>�ʳ�?PK;��Wz�
&setuptools/command/install_egg_info.py�U�n�0��Q�\g�*���颕��*�u6�<Z��;�WnZ�E��9�ϭ��D��^�(t�[�Ek��v]��Ѽi1�j�#���֮�;�u�To���<"�r�Y?�(�C؇b>�(R�������,B�{���lRD�^�mMShS�t�-?Ng��`8{	��8�τ2B��\�ȋ�:�� ؘj��ȬK�{����U&��v�@�6n�&s6'��Mr�T�'^��
�ҿq����YM��k���S����揗2�	S�O�*Qk�o�g1�kՂ�Vߓ�uMq8��2�E�E�Udd�nH:x��r*[���+�^!p��Yǿ&Y0���4�~/��Y��L��!��#MBY�ܑ��&=�c���t;�~�c�7�r��x����?�*��ņF
�n,fԅ�0�o �6;�o�2�x頳�(���i&���Lݎ��bS�vc�i��_��'���!%�`�5�6bF
���hӈX��aw����>�q^�ev��Ei��r�N�h�F����5��z�;5O���]~f�DJ���Q��8���q�̮V^px$]	6;��u1����p��.���u@��J�6kvE����SΧ��l��9
���A��ʋ���Q��I��AN��&9!��)����)�F���}�<��N
���'��N����R׺������i.�D⣹�1t���M��rn)2.�d��甩� 
r̍8+�5{S�q�n��u���7��D������I_7].��D�~���K���<>��PK;��W[N�*!setuptools/command/install_lib.py�W[o�6~ׯ �[GX�X 逵���b�-�\(Q ����9%R��nlX<W~�*�tJ[�L"�f0I�UÄm���yJ�U՗vό���$Q	c{+��K�4��r�"����
SZ�$)%7�,�2"�̻�	�����{զ��b��*VK~4�*V�c�@�5kU{�e�'պs���SRA�t�fd�҇�C/d���C�['�nG�w)�u`�Z�I����qy惙|��eY�
�3��ہ�7��0�vp7��Kv��P7�:X(��lra�x[��R���\ޖИ��	��-�蝔PZ����w�'���rт&t;nO���z����43�=J(�@����[�n(0��<�|Ծ�E���#�S�
��q�LV[S�1��0*���?�Q|��b��M���Z6j
�鞅�$�|�g��~�ކ�lT�w6󅓍rHr�I�#��(�+F'��[�"��3��(��"�=gT=��U�v�v)�8���~VBI�[@*����Bx;����x�M'���<ݱ��a��K��ɝ��kx���{��)� ��+��
T�E�	;��3���1�},���E���R��k�~O��>,{6=����M��2��Z��A��f�e5�Cʽn�J�R���\.�j�%ѲF^���1xs`s]fώz���BS�]`L���S�M�,l��5����o��
�
J0��:�9��)�.{$�x�D9"�mj\����H��e-�7�{��W��D��O�B9��g� �&a"e�si�]< h(�L���"����z������5t�)˦�&Ҧ�Y�9Ӑ��	�T�?�N��U?����av��R�l�ϥ��}�v�r�le(��RU�bJ^�FEf�\���핻���d�=}��E��L�B��E�
i��L_ �H�gЉn��p��+��Z�*'�m�NPq�]�v�;�:A@���z�]��K��jy4G����,ݺSDS��Tgo޼(M��s
��Z��_T-��엤p�i0����x��
��L�34R����@��$��E�[pkrdε��wD�^�\���v��*g<�fc�ܱ��Fx�&�"���wdUm,J�Wc�1��@���pSz���s�9�8�����0�\�-i�ᎋ���Rx~Řإ:&��=#n��=]�]�Y��k	B���n�������6��]�mt1�hA�	��
���hp�Їč�$�4��P���,��;�E]�SQ#Bd0#K9�:��r����`���"pͬW��di�2�}�[�c�K������E���ݰ�)̓(2VM�z�y�PK;��Wӹ��u7	%setuptools/command/install_scripts.py�VM��0��W���t�D�VB��
����L��ڤJ�]�_��~�)�0�Q�����{Zkzh��W���z��9�W��M�K����]W�ڪ�;��U��q˓��,k9�� �e�G�F�U�,���k�eu'�O����;�ˀ>y������ɴ��0t#��W��R�5�h�0��O:��L�-�)�d�~ce��v�î���)�9�Ջ	m*����a�iG���j.t�/�����Ū��q��(B=�y
p��U�y�P=��nFߪ݊��=EO�Qz߾�E1d�z�@c�am	��+Fi�t�l�FP��/�~�:�X��ê�c,�S�]�o�;y]��T�o�mI��A���seљ�ָޕ�M'J�L2��^6���Y���˃*��VU�7Tϐ�}�*4�S,��r)��M�\��$��qK�؟ܺr�c���=>k|@�B�=�?��'}8��k��3�š���=����b	��^�:<���h���VywDR|	�_Û����w<�D�+��������ɘ�?_��h��P�%	$�A�Tb�N;8EB4�}p4��y�_P��w�����F�,��a�5�<3C����=�¿�2=�:_ĢM}�mso*7P�0���?1)"���Ҟ��/X�u~U��K�#��.(�����	�� �W컹������|�DZ@i�z��]��^�3�l6�hMQ�.�6��R�el�ˌW˚(_|����٬�d�c��b6ZK̪���g��߾"�0�)}��n�|D��wI�2-��x*�0N�V���|�[k���V�~N��H��S�$�"�cA�a��kE�(��?�a{��(�l,!��u����$�b��Zw�a��

Y�ߚ��[x�:fPK�uW]�)B7t(setuptools/command/launcher manifest.xml��OK1��1 �!]kAJ��҃B���1;��g�ɮ�ooR��R*&�\ޛ��K���������
g��[��AL8� ]%�wP����A.�����E����覤V`%	�z�u�۩$;�F�Y�t
^��׾ڢt菈����j�+ �8G��Th1R�M��9��Qpy��k:�
}U_ڍoy������=+`�i�V2DPF�ZL���F�QGC&�����p��g`�m4�xyD��V1P��Pw��<��Wu��e�#t`�Ig�%-\�?9k�\�4^KC�|_)��a�c��~�_����oPK;��Wv���setuptools/command/register.pym�AN�0E�9��U+F�+4H�fTq�к��&������	�;��;�<.�%�9��8�L��ӣgz�ކ�0NRC���MJ��0/1�Md&>`z����[~.=�T?۔�U�A�[Z�gb�<��$ �!�h�w;�Xp]�/Fn�M6���*�<�>M��q�&������,����9?��?]�ba�3���h�"��sLm��5:C<5���]R�#-6�
���c��]w�Z�Bǧ�f����ub�w�DR�/PK;��W�Ьp1setuptools/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���;,�.։���qJ@t��z�.\�(ϲ<�ǵ�$:���4����s0m�a�%�;>s>�zss�S1_,%9����b.�uc������$��eݒ�e?�q닚jӲE��3d�2���W�p�1?3N�~��F
eM[9�9�?L������V<�jH8S��}�pT?ۀiĎ*HVF�'��N�>�ѓ9>�.͡A�"��o�ü)�!H�}��x��g6��4Q���+�]����H$�x7DZ��Q�Yŷ���¶�b�#6߇�d�n�~	�PK;��W��^F�setuptools/command/saveopts.pye�Mj�0��>��.&�4(�)�,%x��
;X��Rz�ʞ$��^����m3�IyI!8T�g���$�y	1�јF�ũ�c��E�B('����p��C�{��i�7����ЛՃ �`�V�*׆T�چ34�(/�C���U�A�	B��>M���n3��o�8���2Rb�R�w�K.ƻ����X��+���Qjր�Zla�+�}@9h��|�Ӗ��QQ3�l�AJ5J�/��?��wzh)���u;�d��3jT�e�n�dfj����-
d�^�~���c,�up�2���sH�;���{x7uCٍ���w�~]C�yS��PK;��W4"(_�	�setuptools/command/sdist.py�Y{oۺ�?��sPH��]�n�a٭[�M�8�t�BK��F�J�^��s��h����Žtxޏ�a�Z�X!�m�,
��Zi�J�9i���\�v�*R��7Liٓ)�2��g�*+^l)W'k�#��V�AN��:q/�4sO��{����b�Ȳ��e7�W��/Ζ����ͧO���''Y!ּ)m��Snu�.X	����������M\H]񝸈���g6�}�U�xY��,�aMU��4RUd�V%��Zi&j&�^�T�>�����7Z5�Ed�mj�;E��Z"W�I�8�wv�K�i�x'��~�R����Kn�������cL(dv�-C��jo���0���MQ��~�Nb��3U[xg��_z}�4�qk.�9�V���Y��l2�ѹ�$�r� S"�Qs�Q2�'�%�����Q��̭�y�"x0CJ03h��C,0�k�A�k�-�?c�g3��|��$���q�P���"ԩu"�[���*V7���K�h�Y0c�/m*��饞+q�T*u�d�c[�筨�pf�&w�A�����r��ti�?�e���?]H„2�.m+�&OS��_�����O�l������z�)AG�6����ѽw)��!M"��׿F�K�:]�Z‹��I�x�C��b#ʵW�g
ϳ��Ƒ�l2Y�U��DBf��-�z#,6^�o���9"G'b��qǧ2M���P���v�~���';����۟K�Y�̷"džˋ��[��s�n�
�ϊ�Z�Q+	%����;M���u<�D��"����
�g��_0ɭ���?1w��!K��'#�)W;�ۢv�c�q^��8�����.�ɵ��e� z�m�:<饝����.]7�p�!�1����*�|�b�=��/y�LU�*UP����	�j-���1ߦ�Ҟ|�"}��	�P�����ٻ9{
.\A��o���0�u�y;���I��~P�0O�;��)���L��?�y7I�,�u�;���d���t��pD�����}lU��+mB=��CL�������!�9sg7��8�R<�A���hF��?H�V��e#Ɩ���d�}�/��S��r`��>k5%�N��g��������
�GXk�n�e@�jKCe:i)~̄Q�a�jxQt�sP���X:�	�n��5�ӫ��+t^�z�:�+�����}��W�@�U�2�����98sLߚ��DmB�|p�ٍ�$l���F�l���e�<Y�c�vdQ�K���Ҏ�M8B������ig<���=4|-�����&R"p�[��k�hf��;i�񁡣֩21�vvd�똝����V�Aᤓ=���:^��-�1�lOJ�˴����*��E��o9mt�1�|o�A�Ol8L� � ���sX�B�Y���Ԡ�8��7�ř�����(�a�ռ��#�})+�>й4f�&
��F9$�\;���]}X,���$9;W���ގ��tFX%�042�e��[�+Do'7[�V&{Z@���ܝq��e�ePG�,8��!$��x�}@S��l,�Bd5�a��.�t#��y+�-�
qxێ���F��S�Vp�$םb�Iɂv�9l~`f��(�I��y֒�+��9��X�^��kq��)���^ÓN��!�>1�]a�sixp$�.��A����#���՛��1&��sEz����9�)2�����u+GO?��:i�-�CXbz�z�5�A��}-Z+=fT�M��uϼ�G���WV⥆ɉpz�#:͠�h!4���\ڍ��qp�/^'�0'@ۢ4bb�	ggi�����Q�(�λ
�r�U��5]�О��S{�I�(7"Û��c�ߔ0a��`����n޳�v+/t0���U�.^|����'hu� ��2��z��X7�șPo	ˆ̃H�B*�w�&n���������[��b���g�
UE�=�ʒ�0�7¿k���ܝx��a��:�C���s��}�7�IRA��2��P�
]��2ۈJ���FK5�?�a����wg����9}C~݂�ݬ
f|�ۛ���f�>���ٴi*j㳐z�	-��YK
�QJ^��[��u�V�G����B���^�^�-������������TT�*�����޻H��S�t4N^�
��^42�Mo�4&�U>t+��h�@�x`��`�����f�K��EQ�5L�3�єG3���X�蕉fs6��:ڋ�A�m��֖&��;����n^��w�����������#�\��WZ
gD\�}�b�+�4�rb�u�r핦 ~��\�U�<ʺG��+��pA�dՈ�v��𺢭A�W%�Ɔl�(��
C\��q�;���*��SH9���w��M�5�������2X3�PK;��W����?setuptools/command/setopt.py�WK��6��W�[A���"I{�	���(��^ ���E��3×HKv��A�g����]CJ.�q���Ix�wb E�>31�=��*��"uw��ɘ�p���w�G�\�=�c_t�?0]�CO�db�-H6���u��]�ж\���u��-y��f^��k���~��N��T�]��7��j�*YE<��o�mTw���~E�E��l Ñii�HW��seM�ʚ�n�;Az&6#8b�W
l�v��@���*,cpM"�)��#�A��A�ݒX�Ě#�DJ�ʻ�ϊ��T4�\��f;���mb%�k2�8W1��b8�EK��r���yh>�;�_b�$q��q|�{�A!�:���ww�?\"r��RMIP.���#SE�D~�S2�{�aB�v�RiЮ@Jз�ԌW`���5���C)ι��O��l*���F���QP,KUUd�o�z,�Y����&\�v�ԣ⌵�V�I���
U�ۑgt�|agV��Ya��Li��p�FF[��JV���jg�#Fu��NG$p�!҅1 �ő��5b	�*,^���"��8��(=%�:SV��xH�O��tll*w�iӦ��
�;P���ޫ��j�L���(/U'Ъi�/)y�'/���ɣ��A��h���������ɁC��$��L{�c�V]}���6��w��s��
=�?C��YnD�wdPΡ}����V�G*g���E�J����BҐ�B�Ѧey������T8��us�7#��\
�dv'�boI\w�2Z#�@X��a����UBW%�79ǚ~8�D٬ݨ����.\�3������N�UK�g�nt°���r�T1|dz	�C~�F���\��g�O�
�Y�2967��G@e�w!ŧ8%
�~~�O`�%�hEM�$ޔ��!k���r��{��V�Ce.�{r��"���.�9+�Is��`ls�s�n��
���̵?H^ChoN���/����(]{�h�C�!�p�)z�$��
�a+�]���$0.б�n.K-ؓ���[��s�i#p·��P>����m�����L��9�b�%T�n컉�l:ooڷ���'���3��if��j/���[�� =W^��b�yw���0�
�Dp�a�'֐^����!����>��}2�gcٳ�W0n��Y}�,��γ׭d61ðN�&ۋ�'Zⵤ�}�#l�Φ�mp��>���L��m�,|qy3w�C��)�4���n�2DT+(�C�@2�9h�q�F�{��M��F1�uS(i�=��/Q���E�z�%I��R�� ��y�_���F��_�rC�U��Ǽ&6!����Ϸ ��Ү	�k���~Yv�I,}3d��0Q_�=o����n6�
<���9�)�	�ak��i�
F�6��Sda������
[H����{��>�}Mh�<y��_x���zn�LZ�N��PK;��WZF��	�setuptools/command/test.py�k��6��A 	qt
���6�5@/	�9��Ph��2+�*Iy�73�^��M���Lr��~IV�Җ)�����[�����o媶�-�[�Vh�T�iki�0vuЪb�4���4��Zi����;\��?6V��Vh��n�����*^�r��c��Q��E��u�Y	��7�U�
��[���x)�'���{���􃬏��-�/[nEVq� <:^ϭ<q䉮����ZlV�#6M3G!�����rw.k�u����*^�v
*�N+�E�+�
��OB!�%�\�\����'�
7&�U-V�U^��[����djHn��BX�I�V��F�����tz�?����$
0R�-R'�q	���l�Gm)��U�c[dh�hݼ^�o�i]3�Lș:0^�Mʰ���w.k�X���v�'Q{ԫ�m�e&
�lx���p=�q����A�Ҧ��9�ٗ/`J�����f`i�Ni�d�6��BD���)�U�Fұ$�wy蹨��$笗ТL�5�!�C��rrز��t)�M#�bd;�S�MFh�j��Yǝ�ס��ɔ�ɽ*
a�'.�2�	Y�J��tRCMwY�ռYhBpbH�<�(�}��9JHɄ�[��n]� ��{��-.f/X�F�Dt������� J#��yA���ȄK�9&s�տJ�,�eR�Y��%��Ȃ'��n�{�s(E|��x5�!����O,����%����~�c�+TA����� "����������!0?�8�<E1��r
�¤��o�07�o!�|r+gуՅ0
>
;�'�k�?�����L��Þ�e+�`ōE��f�����>5�c�%�%��C��TG����*�i_6%�۷�,0<zFL�%�'��;@Y\�F��V$Kk��a�H�sG�襳�ma�������Q`nD.��N��̀f"2�� �t�t��D^���$�����"=�@���I�z@4��]r������s���GG��`0hf�U]^Va�@�Q^&#��C��~I�fyߓ�{
��JrH"�\H���+sD�C���g��3��gt᫕
X���Բ���멟p	z�+�c�`�Bgorn�r.�+�V����ZF����pL���X/p�5=K��=@4�lA��;�;	6M1�o�s=*�s���ʹ�^�_�M���z�~�Aw�g��S.�C��O�!�wU6MF�|���DKa��Y
���+hm�	��^���^��`����`ɖA��*r�A�M4Պ]��}ڌ��?B���u5Kr/Kiϔ�g�u-�|9�T8�H	�V��k�^�~�_����=����:/�BdhRf���6�U�;���E�AE���H�[��P��k�I�E��r/T�6BZl�*�B�0"B�,��.�`�҅���\wԯG�
p�j�8:I�uws7��?w�A7�x�-��TC��=��d"v�H�w2uOI*k(@l��f�mzx4���鑅�F\�j_p����3��������s��>7{��,`ݿa��W�U�����9�{U�Hvc�fZ��~�\B�d�)��H��Rp_
��o��1���J[�������B�yS4%�u!�ru����J������ӛϿ0Q��Vu%j�c:q-�ҳAPn������\Y2^ž���	��X7�Q���J��.�+�)�
��M=�\�u!BB^�q�f�h)#�)-�#���z>1��?D�i��[�AE%ל_�7���!��u�r�VeU�g�1�%4*1f�
�9��Z�j�
,L���1e{�K������̵׽��@_`^'�(H�j��s�7_�^a#�e�}]��e�e���|���Ot73�����ƶ#��xM�{rN��t��G�]��3Rg�)����3�@�G�@����4c�~
���;����5�N��
;a� `��פ ���&���܍���a��fDcJ����=�A�mHbhTCY2��B�<S׿����ÿoh��a�$����BA'fD=�ݽ`Ӟq
�us�B��!~�����B�`X��&&���̩���Y�3k *X�N��5X#[���u�Z
a��Ӏ�U��tRQ�c��������TiΤ}7u�/!pU_�"�\�m���+����N�WXddӠ���͚���'X�MaM�x�Pl��?���U���ox)6x�h0�G�ʩZ��M(����UX8O7=WX��!���b�d5��_Z�MSB{beP�t������˓� B�&�����
��C;���4�u���D�π������om�Eԡ-C�RD3�����j��+�
�r�w��o㜎���&�������%���>���jw����16D��+}��Ե��Pt�e����t�p��~��>͍"�|��v�r�w�	��t��P<B��u5�Q��qcq�'�!�PK;��W"]K��setuptools/command/upload.pym�Mn� ����bE��GꪚJ]�(�hp2�#~Z�d�v��2���gY�&����XO!�L*r k��{G�3)
*3��;b�>�v�����ꗍq�5��0��$Q1r���A9��W
ü@��!�>֫�SMk�\�d�e�H�!;q�zl���q_��7܁�v������9>�ɐ���?��	�q1a)�[J>vm�o$����*n~%
;�jR*�(�?����b�{�� �\s(�2��?�)��a?PK;��W��9dm
J!setuptools/command/upload_docs.py�Ymo����_�� ��L�8I�@@s�}q.9v�C�Š\Y{����2�R�wf_�]�6���`H���<�J��m*A�E)
5�\l��mX���+�j^)�D)Q��
�K��^��F55�b��f��f��5�ɇ��ŚPEJ����|�$�d��bC�T�DŽo!5Q�SY.�/�Y]��Y����V�n�&gR
�t6\6�����wB�O�y���_5�D��E�o`��BT�����Z�&/*�ZYU|�7T*�L��}	/���iI5�[*k^�u�\3�6�S�HV�n��X��6�LJ�"��LMO&�$��5���i�W�Ng$U-x�j�TA�NABQQ�H}'�'"���y� �b��m��F��a�n�U�jǪ��e%Y��֢U�d��:�d$>=;������ه�닏�W� s�������ͮ�y��kQ�Bޙ�Ӊ�,��
���8v�`�	�B�
$ޘ���u��/�}0Og�W�	 ��U���r�nr��;�5�?f�Z��d�5D�7Q3�1�LS�෪�
��F$�q�4e�>,�����FU��\���h�ʙ0x�ô"k��Y�[�X�r0�����.����e�hN>��Z���P�;)�f��uĕ8f�t����U锂|�<m�����,�,��Mo{;y�5��μ��:O�G8��yl�y���c:|�)��j@�5�(�y�)�g�8&��N���'��Dêp��I,#�+�
�P����4<˓������Q��}�8���t�1��qR��@�z%J��>����:�r�
LO��7P�6Uz	d�b�(�#Z��zBA���H���o��k���}��HVCca(s*K����W`�ش�ta��IA+$~,�
��-C���`O���f?���`��A!G���7���g$�&�5PcF����̆
a+��U0dԤ�F�+!�B��.e�SH	����˞�}L�Q��<��[�+#u�Ә�!���������Spx2*DRal.ˌ��(
E�#��x�ꚾ6@���	�v��9�+�Io ��A:��+�a�ȼlŚqy0r�=���q�o%L#�23�zr���\_Q	ŲᲭ�5��i2g������'��%�cO{AW0h�r�ϒ��709Q�wF`�P�L����`�s1z��av$3"�>�N*��1�b_Y�Db��pf���`����IZh��j��5ىV��Pk�G�`��|��-e%̞gGO����_f���t���|<P��-��^��mE��h8g��O䪭q��aP=(��bS.|zt�?�O���>���%gBn�B�#�a%~�zH�S]i�IJ�e��ʻ�U1�:VR�4q'B9=P9��'�xi�r/~��8x�C6�_v��FKƼ��MU�C`�Z�]�-l���Og�ʛ��,�X9�����v3�V-�I{C�6�I?��ZB5x���9D����*x,�~"�*S��
��|��/7U\��Q=��'l	\� F��Z�f�DP�b�t���O�(�3D�}�7}
Ϙ�M�a������Ylxo���q�����P��o��{�g0c�y��c���s��NFޘ#���za���>=�Ŏ�L?�t�w`'5
p��$%5�V��M�ja�#�i�<�;?�f�!�tQzA��6�B�� ��3�Н<�`y�h$��{�"���_�\�z����/��/�?;���7Wg/��8>�/��=?N�9�1ΪS�;�����<�e�2�;��F����q�����t��`����	o�p�eC����C}�ᗱ#�}ava�`C��)a��۲i��ꕽˋ5�u�7�	I�P]��y��u��@V�Ϟ��p�w���e�3��{��o��m4�.З��*���fL
L��:��e:ū�U���o��o��_>�H;J����o�N`v���,fw'3�zB�E}y@��n�ō��v�w.��tŴ/���5�I3l�A���ǴRAŵ]-3X<�0a��j�V�rz���+�, ��%Ov�w����I฀ma��>H{uєĞ~��P�u���ڌ�{׎����op��-� pf.e.~;��fC�����ؿ�������J�M�	��I�0�n��3?���0N؍s$�[kt�Y�.����Q�X�
�
��J3<k���n ���YIzgk�G��9|1F�znj/�3�أ��֜د�����h�}��%�{��w��~����0��̤Zf-
o@����z����b���n�Nں�RwZ ���/�~�}ۛ�Q˼�*e�WM�]���yb½G�B��YCd2K����i\���2B]��k`�ҙ���:�>�>
ɿ��^D�$��Pc�ܱ��!�V�F��klcWc]f��XR1�Ϯ�.��Sl����9J������V!��<�϶�)�6w���ف���[����(hTJ�#��}���B5P�ٓ��*�s�~��h���;�|pE�:��;݁��'"�u�xV�߈�c�s����~2RmQ0�Vm����條��i��w�i����k�KX��7�#���?V����Y
������8W`�qϦ��PK;��Wh�0��setuptools/config/__init__.py�TM��0��WX��U������		�6m�N M��ݡZ��q��۝��4yv��g�q|�JQ�:'��m'H�J+R�ߝ��P��T���P;�FE����>���U��'U�E�qp�Y�j;��Nt~���S�Y.>�E�1�oC�߅K���	�e�a����G�V"D�c�6t	,��n���h�J�y���DQ��>�����O��n|�*�+�B>;e�Hb
�|�&7�T�����$�n"�~�o��w�G�ݵp�O�:���dֿrΰU�[�a�
%�}��
fq�աVO�<<�Z{��9y��d�b<��9�+�ȶ��:/�܈�O�P�l�+��Z���E� L:!�bT��a
��Y���xXJ��ske�q�,��B�A\�]c`���{U~v�����|��FB��qd�0�$��$U��;|��7A40s-���Dh�J�㤂r7�e���zR:�-��	Q�}Q��D����+�2�ݏ�$���scp��B#����Y��r��3R���Dz�8;+:���l�!O2��m��V�@��s"�+�
�a&�t�Rh.U�J��ω{��T+�'�Q�3�s[pU�q=��@���Y88�9V|�����3=8Us�siw4�ڲ��/gO����*�K�$za���&I�PK;��W�P��9)setuptools/config/_apply_pyprojecttoml.py�;�r�r�
��K�s.9��$>�6�d�vY�MM)*�&!�c��!)ۊ�O_�H3�T%S�k	�n4����8μ�2	�8KEd!�d�*e*�C^d�eX�0K��Fi$JY��*˒RDqY�ӞPan��UU �'D+��`��8цA!�.�d"#�+�
R�%�x�E�h�z83S�#Qme!�8��"NqP��.�D��0^�@�je��U�.Y����*��
�	eY�'&�$�6��	�}\\<<~��z>_�o�~�^\���'Q�R/j
K6q
�H�D��`#E�&o�8� ��YQ�$�l`�5+�"�N�8��^�
5�Ah��� N��"Yr��=h��(���>
7<�E�����d�8EAU&L$�(�$�A"�q�s�!�e�Ç"{;�a€��;�o��a������>�󈆮��	�$xJ$��Ê?}�M��{�o3���\c���k
��1��p�lyH.+�r��oȌ�8��^�"�ș����`��[ӂ�_ۃ�3�$~Ҥ��"���h�[ۍ4�`��a�m��/&M���!���
�1�.��Y����Ij��~�3#k->�྘U�Bd={�����)�j�-�ͨ3"�
Zi9wY*k�,�dJC�Ԑ]>:����xY}�1��`'}�:�䚼���Ƣ����`��q"w�|
���k��*�}�a���x�A~ct��
��
�������L���"��**����0.�}\�}ZH��[����g�E�U~�x@y9l,����z�C���>��W�|��������h���f��Au)��q:_#�I�pns%�b�`p�_����J����RQ�H�P���
F��Eլ�aS�o�C��I�����洉1
: �A����J�^���e<
܎
��G�{�<��..Kp?:���P)�AQ�{����)`�c��cقU�ٚD#�${�go΃�c��M�X��%��2K�Uv`�1��K�j�������No����t�pw;�����4ё!_���**���Ŏ��m���O&�l"����� R�ʰi>-����׮��'������Qۈj"?iA}����O�l��`��g~���S�q���ϳ���=�������*n�B�]v%�k��0橐��1�\�=�~'��+��p�A�b��Lo��	t�y����k�)���=���G�x�1݅�>�i8�D�Z�������>�5�Z[:�a�Be�%?�,�t�)���Y��q&8u]���S���`��&E�5�&~�|���J�^�ؖK���YZj�h�@�2�-P�-_4$��?<N�t�u���;������5�;�=:�Th�8��mE2�͉Z�Dش{X�`�h��/,�[&��]\1#��'J�m���X#`a��o�(=����7�,�R3�[�cPwJ8�Yq�\���?��/��eM�R��F�*�a/�^AFC��y��u.A����l}��bPIg�i��Iɺ'eU�����u��W!���iF����]K�20�1��I�
{-|}@ϟ��s�Rf
�'���5��FkCC�~s7���},�f �w֝���d%ߪ�]P<G�+�R�ee&�.񛞩��PW�8G����]TU��V���֦��E,-��$���2�P�#yB���85a�s\��Lr���[�4���d
 �8��9�����p�_�C���3H����$̭>۰۠:!	l� n
��$#3u\��6)d�`�����S�B��o�Q>u���T���6���;?B��k'�cҏd1)�+��B�T�ܮ�UKJ���-��VG�(-�q�\��%[�Uq�A�1`
P�6„=�����%�!�c�k�@�ϏH)�,)��!�],ی ��@��7 �pg�8�(��N[}�*\zh�LD����P0�ſ5A�K��+�Z�#P[�(r����plX[���\q��L����t�J��rF=
[�F��rii�]������.��҈/�Y~�B!�a�:@����H<�)��Z�tM�1S��o
b��e�wG�(dL
��\3���zPk�4rl�Д���8$���h�R#N��jBP	���b���@=�I�ʈ`}�NNr{bw ^����`2rF礼�}�P�`N8k�sT�HBG�Y�	Zjoԉ�H���1'e<=�kd�z�C���b�D�{����QY������mB�5�鑙�NF�c���F�������$D��P䦑�9t&��8�*��9]pVm�����x-b�<�-ۥ�pmV�u��i�s1�����r��UB�T����ק|Pn����-�R���o<Oߏ5�M(Lb/.4͑����M���Y�X�Wj�f��L[$j/�rס�K���ak�7s�G����,�w�O�si0�2�BK�T6�ط �G����Po��cl#�[�U&L?�f>��x����v'���}5��q���T�|�s!_�tך��\^�g/�{�����<S��¯%ׅ^�n,-[:"�MP�pk>���Υ)��p����*&_��*`Sd�\}�<��G��6/��``�Vz�R�A�$I���ZyG�郘eP9�;p�j�~��#)D�ӛ=�F�*��åE-��B�pq/�)TR�j�dT�8�(�Ӟ�۔2�LǎS%���uXl�a�.d�IP�'[
��-�j�Ue�s,.x��gS��fGS�@��n��t�r�S�Q
/ �1<w�X@�3�Lmp��m썖 ~��f�z/؍��D�i�'���~2�ث/��r�N����ff�Ob9���L�i��A�!D�d 
��kU�_1(��+-p�j�%=,��{k��:@�:U�kC]ö��ѣ��1j�T�_��mо���i��`}��6�ԌYZ��w�~�7=;u/>�wg�dOA'����K�+��6
������D�i�`�SZ��5���_��h,aC��8��ܕ���ZR�]{ؗ3��׷
�M��@��u�k�L,��ycZ*��7+`��_���6��'�R�n�w�M���h\�6���7F�S�n�i6�	�1>��6�A|ڤ�j|��n����Z[��y|D�dA�H��2�Ĕ��k)H\��;d���Y6���wG�Ŏ,������+����:g����
�y-޹����S�Q>7;�{E�/�R(��	!��'u��7l*�v���F���,�sl�����A
,�~ɮh�E�P7�����g���M�������8�#��%�&?��>��Y�+-��1d�vZI䴏�!��0f�����[5z�v���䤩%�a/����l�N?���?�י�w��$�:j��r	�oVx5�j%�{�VI<��V+�Iu|��}�w�?~ݗ{�8��_��4���w�wk�
&��H<M����RA��9�3t�����@O^h���O�`���Q(B�y��
�)����.?wGvOQ �0����)WZ���N�u<�nϔP�ؼ\������+��K\@��Tž�^���F׹���K��w�[�-��Z�ǒ�(�������|��_��]�5YKĊ,���"i�}��x���5����G�s�=�mW�!��S���V|o�v��}ov��U����
����P�0��\���;Q�P�� ���?y�2x�k7��j�n�!��]��6��wb���}A�ԥ՛]T��>f��\|K�������H��D����/#[�r��l�@�����0�D
y̋�f�e��믙�b[Uy9���{ʼ-/+6W2�·�eu'�A
ui�^j֮j�"I�{�_���p�l���d��n��4J�q�X�,���h�5k�Ӥ�@����z~h̲��<�c�Gm_�E�\�[�zY�k'�uoj��a��R��ND�o�TT���!u��.��B�M�n��5+����Ơ*�o^N"�0��Ջаv��hS�O��
�n����

�������6��a+�^��n]{���WZ�5��A��a�+0�GI���E]Qs�y5�����N�f1�=�~_�/&U�
�
�p˭߶7�;�X�����Ό5��+�1��lŒ�*5CMM��R�J�����Ǵ繝6}]:�����7��3�U���l_��E����A���]d~$p;�_��Q����c�RBJ�~9�K���f��3P�WW<u��մ����…u�[�ϰ���6{��G���n�������z�(�2�
j�¡T�Z.0��3(k��<�UcV]k]EV�y��n^ ^1�y&�����`O�܍�!��mrd�U�D��a�$�2�6��JH�0	i�P/W�/(���?4�.o������E'v2�
2[k	�,^��� ��cq��l�ִ�p+�g�+�=������O�P���h��l�4�sH!�(��<�7��S��Ot]�?�+�Q��b��/\�b��D�f*1i��Yb{��yhk�E��@yqR�!���^{6z[�
*B����!��x�=�PK;��WA#�!�@setuptools/config/expand.py�;k��Ƶ�+�

�{e���B���7q�����[����.��p��U
���׼H�_�����3g�k�s8��髺�Oj?4e_��Q}���hv�l�}u3t>P���0�^�v�uY��/�A�Yb��V���V���]c�l6�U��h`2�[��][j��j`ڱ�}�܌��W5�Z��2�>��l�<S�B�\��p.�u�������)QA��v�O@�̔�%EO�l����L�dnO����¾�(ӏ��p����~���P ����;UW�GR����v�2lP����v�����!F$9�����	�`b�k�L�����m���06���Ҩ���~8�m[��F䦑��1mc��z�ЈVd�f��]'wenۡ�!�XA����QH�E <`"��!/����-B��x� ����meԡ�
bߖ�oh��0sGʱT(E�4���u������W����S��u���l��ހ�..�~���w��O���_]\��˫T���x �Y��:��4��O�l>�Ϫñ�z�Lo���ځ��o���9�q��]�?x�)�ӡ;����1���Ey[5�;��?��¹��@����ۢj�Y:"o�A��V���U����y�Û�-i�E��5���*{������o;��#���8�.���G�LQ�w�Ѯ~w:�,���I��,N�
/-�W���M�8�;�ei2�um�&~k��W�P�dY��ٙ�8h(���/;���2W2��S�_��lV�cή�:�unv����u�v UV_����xjQ��*����,�yjßt_슾pkg�69j��d����r<#�]�%�����z����"�d������}4�~�������]7h0����p�K-�N�U�>��4ָ��`Qܷs��ˁ�S�m��+�#e��e���{��US�y�]��.r������%����l"*Jt'�4k��jҬ��.ߞzm�4u �ZC{��p��nˢ���t�pJ������h��z��k:a׈�˷�J��מ2z�\� ���NLY�mw'?��W���:q4��+��	�^��Ew�a�[��_L	~Hx��<f���?�J�6�VF{=�a2�t�e�20���i
��{	A��أ��m�����S��ܐR�u=���W�Z�c[m���V�k�vC�j���H&|
]���'�ư!c<�3)!�Յ��MWDz�pp�7p�X<�U;uyI\��x�����W���ܑĺ��P��$Y�d?�@����naU���_?�SVC�
3"z޼�u��s�F�+��К���k�>�8j���5�5X�7m�gt����g�^q�!����{�A��)ACe��,c�[a�z >���sP�E0?��5h��m%Ѿ	�B��D��_R]�ւc�*��b�{��C��"l-�/��G�5D����R-����Ə��q�q��qj.�^�K������w@�ʇ�h*��i�6G�W�{P����M�.�S���B�vdD��~��ol:�j

�N�Nk
�8쾰R��A�FGv�@%~ˊ������϶j�9���x��r�f75�}f���S�?�Aw�00�`t?��|j7�t8�j8N��7d��Z���tdD����������`a�U&�2�%��mcC�Fh����D�J+P&��'��*��(�Xz�v(�Q�h���|g�~�M��M��3i�=����?JC�NٜM���Cx���ޑ�h�E�$�q�c��"�v�M�Ä�b��0���툞"`Btll �rΆè�]L��I�S����ulE�g�	���Νl`�SǏD�/a+���G�``N�r��I�>й~��=�Ȧ�]C�<�)��ᙜ�������9��8��l��_�e�YOm|�9`�,��#?I�2}�z��C��W����Ť����ۡ��ɞ�M{
���sFőλ[�T�����\���/R<P{���|OYB���Q�]�xĸ�xw:��"��BR��g��=����l�܀����0���J��d$��&G���f�>���\��N��D��F�XP��Ӧ�lM��ѣPM�l?1��a�22Ow�Y��bgG���^�i�D�3�U]c �aRD��W83��I�|*EH�~�U*��p�*I*F����3F���hB-���3���33�J�8�:�|��|�U*���Ư�탰���eQeě�<K��QŶ���@v�Ue�+���%��)�V>��Ʈ
���N%��1:oq���(��K��'Co9�.����T'��p�lb�9~:Ϣ �H�e=�����N�
u�E��sd�L�ٱ=
8�;ֱs�s�M�[�Y�f%�"��9w�$x�uc��l����J�E���*)
$a�*� ӥ�X*IN�����TcSW�n�9-F�Xi`��#bI��<'Bʹ�3\�ژ��W�Mr��l�
Y���h�3ͩ���$��/�Z�W$&��vc�g���-�U`�Ѵ"$��H�i��0�4"D@�U1�âa$�מ=XeDk�PX|�V��(�Z�Ś�cl&J<���Y�2#��.$G�0}�R��L7X�
m�ژ��\^n -���\;
��`�$3�2,��6�ԍ,Yu�@X�_A���xlMDeop�W��\�Ⴊ`n9ׇ����34�0�pג�,
��еC�ɜg����BzDfu�w�
ۡ��&i�z
&���~������X[z@.G�5ʱ��m0�`e
p�����6�8 ݹ���AUM�uܗ�]�<0tN�I�S(L�ћ�7��Q���f!��?��"tf*ޗ�~�^ZO��`��+i��/��s*�`,Y���#�֣��,�:!�O��z����Z�����ɤ����[d��<�y��4;�4�)�{�y6g쮣�Ku1�j`Ḱ��w|b&����#؍�F���^��Z���!ڇ�5Z�6Se�H�N��ޑ��9_2�����cv�V�h��\
�W8/M���P]n�b.3�x��<�Q���6#_�@"�#?��B��:�v!��P�$A��4MD7a[�w�pR���ئ�u9lˊR$��-�/�ݫ�#�8ǀ�C��M��Ăk��_�Z�!?��|r�
�g����B�dp~.�d�~&hz"��D��<�}��n@x���+��Ϫ�4��!��:H�K7��պ,�^��#9�C}H�G�M����
1p7aG\��~�[��SB%l���uVLF�a�~)�tmR̢�Xz��6��A0(u~^��T����C�ݘ�S;_)�5ա������2�QGm�����þ�f�^��a{;�?� }�4^�XB8EA�]r1��1(cov%(:�P\�@�D��]ؒѯص"���U̒	���7��Ȫzچ�m�mq�
�;�C Ϛ
$��@7�z�IW%��#�G��WG}\m��7�+��9kK��b�<UΡ�fЈ�/H��Wa��L�X'%IXt~�ky�����#V~wK�<�Z���([ΠX���}J8���ql��T�Ҙf����<��Sр5��������v��j�~���A��l����T�
:��F�fy��#i2kKp��sH^��m�b���)2=��M�~nq��~�Ӄ"ZV�b�6JTm[�����%&��i�
�o��U{��c�R/!b'OYuѕ��>$#�$��a���*���H��sJ�&&x���;�	�R=�>�Ę8p-A�h�l‘bi2�5��v����e�H��7�p�3�w7�GB'�����ι��\�!E�;M^��78��� �8K��6Q���N[�Pz�Qn��\b;{�	{�M\D�d�:�g)G����⦛K�)�������tb>��Z{&�
�%��YX�q�lP�ڌ�I�I&�@wG�wA�v}��k)Mz��eA4���|�-��vR�`Z�b����5�JJ5�š�$��%��.�o"���x7�U�8���^�w��n����P�-ϱ����|1�0��k@x���-Ӫ�[�G�P䟑���\�
�4	�(�%���o�_̣BN�����a���b���i�	#�pH������wI~ٍ5.lc��X���;����a����	ū�Bv<a���x| ���Y����o^�
��'6O	߳�R�#�%�o�hw�t�%�N
�~F�׾p����~���睌�1�"^d�Q�md�Z�����N��7IV^��57�Е�rN���(%$I����z�p!9��ŃUaz�E}��g]��dB�6�'��|G7�:�1x=d	� 2	vV7];�2|�#�́T��&�R���wi:Li�G4%g���B����9�Z	��M،��$�_\F�^$0�Fw��ogC��.���|���W0Ȭ�s��o�`��mb�:����K�N�v���b�&1[1h�c��[M��k�k����<y�*�k��W����ط�����`_5
�O��oCů��MoT�����_{�LXpR����&�
����l��
ۺ��g����{�/��PMs�F�_�-U1��w�=��h�ڽE3ε2�}��)c�V�V���i魱#��Ä��U�R�=Lx[��(���P�s���T����F�q���+\���'?N)�Bwk+�
'���Nh���.x�d���%��rz	�2Z3��<��/�w�t�+>�]����FZg(�v�L]����س��N�|ѝ{�kBl�Pc�']X�>G1��唙M�%QEf��]u���t�K�Bޘ��)ݔz�����{^@���H�W	���������l�W]��M���=:}���U|�(��Q���j�TScEJ��K2��q����]�*Jse��8G�'��"��4.ː�:�Lt���?�Tb�nl��BſN�/m�0�#f��&�-�kP��k��^�:2ވ$�<H��k퟼��w��4osa�
(��\|����b:�zu";fY�2�
���CC������{d}�$j��,�O��Jc���K�JF�?��б5��)_b,��kڎ+)����/h���ǐ-,�5�1���6#���D`$��3�A�6�+L��M.<���"+Θy]c|Ag��;�u2������a�� p~��ׄ[���%�,�5�^��j�X#�@m'��B�^$�;ߚ~�����`�PK;��W�`=��C"setuptools/config/pyprojecttoml.py�\[o�H�~ׯ�a�
$��M�����8��cPղ��H.��-x��OU��l��d_V��]]]ׯ�͉�h���L�o��.��jS�m�u�6m�c�e�o��<ޕ�%�%�d��/W���z�>|������{�\�٦n]�E���J֋쎳�*�@�k
�
���.[g]6CnD��-�/���r��r��]Q&jt���L�`.�v]#gg�v���ݙzF�Ϧ���U욒3��*k�Z�ؾ�Y�U,+EͺvϚ��uY��e�.Z�S�'E���[^6�ހ�P4e����Y,��$)�Ru۱����}������a��`2Swԕ]V��Z9j�W����uEVʻ�8U�����2}���o�����g�mV�٪�3vQ�݌}�=c�TsV��5���*�5����mݚ���/�ʌ]U�YY�ߒ��5=�!k+ l&]�C�Q�}��d՚e��򫺟��>5v���s��_.����o��廫��3�~(��b_e�"?�ݢ���dRl|�-&>D�Zp�.D�I\���X��*���e�I�9�8�¼�3Pt����$E+�>�����=]����i:�L&k���:Eˋ�?
�X0�?e�5�]�K��3�'�"2F�����Oh"�q���,0cQ���(�$���@��%�Mќ�Ed�eYs3b{,:lcH5
�0�B]#�9][��4/3�� 9�ɻO_>��������׫O�Q�qDS�vJ4%J��m&��k�!QB
�F�I�C�ۍ�V��ծ�9 ����bU�E�g�=qd}�%`���Y���ϟ)�
�m@5$�,$#�iX��FZ�"(Fn�?��Q��o`���(w�h��~��  ��M�g
��5�92�@�pM:AOi�h	���9��#����^����/�=x[V��5�I?��Hr=�����vO�����Z��$��*�K�|��Ŋ��!��JQ������
���6�'���Ċ��
����Q4�DOD���Hn*]�c]q�W2�y2��(���ͤW�>'/J�Ik
����� ��ل�ҧ$���
�I�nd��&��A*�@�f���ze�S$��K��6m��׶�L�Ќ���U� �{��g���J:x�;,I��Ή�Ek5�S�/�[�-��`d���]qϫ��Q��0���k
����eF�7�f���Af���U��k����)�FQ����5��l�
����ij`��r ��*�K�����n��;@����Џ��'��E7r.q��t�CH#G6Yufdի*y�7��E��{�@oV�E]"��yr��5x�%�T�n�_�nZ�@H����x�'S��6�L�!Dz�#6n��%E���|���5��Q-|�"]y��{u�7�7�g)u�,�S{M�(K�F�Cl��E��k���P�[+[%��u	������\���#!ȇ�r@M�,�F�������3���H�,�(j���ݚ��r9�e�m�$5E0�
�)7'e���T;�oT<h�1jherF��9�u���-�V��N("��ף
�?��|b@9���c7~�i�ٺ	"q��I�V��Kht�5�(��g���!	���$���|�e�E�7�q���v��a�8��%��}��S^��p��3��oP��V�
U�6���;��"�X���lӰo�J/�]�b!'+=5%|WtHȮΣ����ZG��Kx�`s*�t�L%L��8���a�Π�ξS9X�e�@-=(�
�2�"�3\ �!n�	9�Q�8QC�EU���[5����e�z@7�n�r����Nf��:�.B�fŒ�4.��ZP�ɡuhPE��̅���Q�70!��S�l
���%���X��+rsEKBK)�
���P[S%���q��6� .���u�y�o\g‘C~��0U9T&�8�Q�z袮�ԑz�L2[�=�R�򒒃�%Ȁ,����
%�L��Sw��G���V~(�������-F{{~6TMI$�{xP�B16\�uY�Dp�� ߉��"ip����<d]$+g*���`hUO\�Jp�BO�t3�:g�
ȄW �O�dlh'
RQ��
Eeu�*i��vS�S��r@'�5+d��-���J���֭�Ξ8ڑ�׺�����
�ՀVBt��b[!�v����D*p�\9��(Wp��+\,�e��.~C��s��g�}��t���-���$Or�Dzk��&�;$'}�:M�6�4���Qnf���}�������������71�����tb��
j��
<@9y�u��7��!�i&i�8ѐS�}�zs;��d�����C.��!3#
!���ebJ�蜴8�Cn˫�K�p�;�T+L��C	 �/Q�q��f~N�ۦ���/�<E{���	dx̳��H�tS�:���:�sY�iew��ϐR
���t�5
m��`���T�h����aYT�|���X�=��0 ���J��M���˳���]���H��#w:k�3�1Q�
X�N�� >d6���I7�-��&#��"�ՓE�1����+�&�Ŕ��_=ds����3ZL�V�E�Y-W��,�y�#�K��Y�B��ת���,�+K�l)c?�,�H�&�
|�'�m�􅲔�&��Ss��<2�/U�SI���	y����u@0,��Imn���fM��H��c��D�L�.�n�
(�D��Z@2�vt!
��d�
�`�-�Nj���:xsF�o@o�D:L���	܁��5H
�I����qF�c�?J��X� :~���_���ӱ!8v>0{�4@O��at��,�<��:e�5�dP�:'�س0K�7(�����>7 j#^�+�h¡����Y����g��׉lE��S����N�hxۅ��tL�C��׶�b���Ot���@�\����W]��7uQubxO�mь/���-�ztk��J�|t�Ve�� ��Wl��+*Ky��<々��*N����u����!g���-<%=��?
�md*r��
�L7��
�sA�7�`>�q�T��|�U��9NMI���o ��&��e?�u1@Ÿ,�̟+���h�^�)΍�<�N����Lmj�a�!CZ�Ib�]�� ρ6�lK�6�laWlI�y���*\2�	������nہ�߃-�(�=[q�v��I"�4�3<�S	��Q�,���5���{��ҥ�P��}���<���KQ�M���Z���~�c�[R)kT�
���E݋r�b�x,@�Z��Cj>&��I.U��9��.3M�!��~�z?��Vྗ�g}=��J�xM���_���*���kl婱��IAي�X����Q���=$l��`F������A�4
��	-�m-���d��A^!l��f�S��V��f�Kir�>
�dKv�^0��;���^�uz�<����/e�ny�=�?�6�!��ĆЍ$~;��(�l�J�9�mQ�t�<�K̇�RO��JD����eG���1���=���Q]&�K[U���0����{��kP��]��|t &$2�<��1$�8�]E^�a��t��
��@�W�?aM��AEJdz1y�Ef��ݟ�=�#�
կU�ut^t5i �P��X�=�k���HӢz|�(V��K���[���Do=+�u������W㦶s)�ƕ�4����GA�n*!l�m>���U7�l\?�Soe��9�k�=�[�E�ϓp�ʉ� � ���Y��A`+ǵ�X
JI�|�KF��A�jc�_>ɕ�����LS�W���`�lOX�F8�O%H�R�g�豅��B�ql����*��n��C��6@�Pj��8S�<�IS71}c�Quz�ፌ������n�O��Ef�W�R��D���T�<۞?�ki��:S�^��{�[���~<u{&��u2l��2�s9� ,���hʢ+!۹]����+�O޲���{��E?��_��z����D���X�iwNE���c�z/"��6�]���́Un=�`�Pq�������U�;��`H:M��aT�z�D\����آ��a#N�q|S%�����9$s����������p��|J~��E�i7�$�7`�x�v$h�+�%����4|܋�7k;��}�R����AI��|�Q�Q�P��xoi��l ��kYv�z��R����Z�/"AI,���/Z�2K�i��|fs����9bt�i�F8�L_<��=`S�O��&�G1�9+�1I��tjuW	<�q9��F�y�N2@�[Xv��.�"z%�n;�Ѽf��+�[����r9��|�^�%�F6D�@�d�zA��3����(���
����&�-c�[=�KO�LK�����[X�U$�:�٬CG���!�{���\L=~�������L���9D)�`��#6T\��x�c��!_��O[�U�)���e����[���j�Rd���M4A'Ŷn�y^�y_t)��=?5��5ݞat��ۦ|ӗ�^?>�w�R��O���b�
�;;�s�j:Z�
��� i;��~����N=���#�#��e���ld`��b+@~#�o���;���(u�
[.&�����xZ��1A�p$x�Gs�H��� ���;dM���^���O�k���U�>j+�X���GCl(< ����oӏ�&�2��ֱj�~A�N�<�N<��(�H��}����o�#�h����y��0<�M�ux,�5wV|ͬ�"-e��;��z�:)}��#����*�L'�PK;��W��>�csetuptools/config/setupcfg.py�=k��Ƒ�+�T���V��:�Hk[e�RYr\.f��]dA��c���~� w%;�\?hI`�����Ӏ����:�E+�~��uي����Eߤ]QWb��;���8�^l6b[���'��OO޾7EY�s)vi.ž)��N��ݥ۾����d���u�M�w�ub'�4O�t�˵E.ѷEu1�l����+�X�Nn.�,=P�.�n�.�=��틸n.����h��y<��nD[�m&��)�v!��^di%Ҳ�E�܉}�ຌ.lL�Epʻ�M�]��KY�E�*0ip�l6�x2�u��6:yەŹ���(�/�턨��e	Ku[�n�r��e�Y�c�d=튴<p��I�
z����D��/oO�ߞ�����,�ҋ�,��R�ꎿ���7��M��W�l���V
z��m�%�z'��^�}��M��S����Q�c�4ucv�5��,`�a��U�O�������J6!
Y]M]�dՉ�<
����u�a����Ӳ����qV��Y�-���+@��Ӯa����_��B�/z�M�T0�.a���܃���̃�=T���*�L��/Kb�́��~m���ė�)�{�Zi�ODU�#���֐�mg%oSб��F,@Ib��}q%�&��R��w;��E���(��)�.X���3�J����uV�MBU�ҝDU�﵂?SV��/�ԓ�]-�I��c�C��%�_��`�@sa��7��_F?{9�d|0	,.Z!�x
��&ˉԝ/&7�xg���jk�V�[�Y'ey��ct?C�e��1_}��4
'���BvE�{4�+��|���b��cB5=�0m�}'q؜!�� $KA��U�԰�]}
�].DqQՍL���ߛ���hjY� ?"�/�kY�����n*�a���LJ�bց%R
Z�5��WEV�����j����EB����A��.�ϗ���V�Mv)�����J�Y
$	�fu_��������[�/ӌ�|��]}`�
��i�S[Z�4�ڹTu�X4���k�֔�`��L*I��W���V�=^���v]d��	�)����'���z�^���$@���{U.��Z\>��1���nDs#̨R��8*&�2��X4`�����.�g4�ijċ+���}y!����]a\+
p_`��Npߑ^C+&�h&�����J��1Jx�@��!:�AA�FW�2��NS�x�����c�(��fnD�����LT\�F�p���e��?j��"q���4�՚�+�9W7��K���/�t�2���q��fn4��(e���
�f5�c���=E�Ǩ@2��`^���y�#����U�x�Z�n�4�č�v�bh�?�"�aW�D&�����i�h%lQjHE���M����Ki��;j�Ek��������~؝x�)��W��2���c
\���G���X�Q�9v�@�8*T�{&ʐ)
���ٻ!��?J��>QG�F�z,ĕ�[�'�/=����|*x��i{.��ya
 �E�u�Y�T�3;�˦�/�������<��ȍU�>;f��6}�"$i��������BX�l0VIb�q�BX�9�t���E�(g酷�gyT���q��<f�Ƃ1�|CE�8i��!^�S���X	��=�o���d������5�I�b���-���ݦ���``��˜��f��`�e�ޏ[#��P�p���COr�̷��\�]�*	����l���EqF3h���f���^3�JK1HZ{��AϨ�+�ꆂ��[��V6���W�\�0E�:}�iƥ�F�hjOI�H�Jc}��r�����Q$j!�?��"�=-��C�Ӫ����1�jg�5Z�ȥ����Hr=d�tcL���W�]Z�c�����merT9Ј�P�W�#D��˃{pGa�d�۫�	Fj%��
�3�v���a��P0P��$�MA��D�c�?2�m�����e���C�ِ�l�*�9GTq��MK�.����^bp=e�q�˜4sa�1I���D�%�UUb�!��kQ��˒b�U�2��0g}���_d��DS���a��h
i�l��`@Vq��1^�=�ۮI[���)C\�@����w�U�*��i���D��EY�W\a%��)����4�),�9���1���0���)�
KQݬU�F���.��ڢ��]��%�x�J4�+W���WA�[��O�����I&����HWa"N~x��R����D��72K�>��a4F��"���h�'��~��?q��˩��2�VrT�vK�|�!t*~�Pem$r{Y�T�\�
]4���#�����n�2k��g���`�����S�
�U�g.>[��N�I���+�!��h�:D�r< +�u���Xq�Y`S�x�5|Û���A�}M�c�QY�+ҽ�X��g��l��\�(�՝E.n;d1�%b|���w˹�殽�H4DԺK� ��l��ю���Nނ}�ʴm��G�k�9ᙵ7<�5�P�#�팔M��A��������цA�
�����5M}ݷ:��^�a�Q��KY�P�`tH[�Q͞�*��1��{=R��X^�kBl��}�e�ݱ�����Ʊ8��
2��]�e�s��uv|�
�	���T.��&��L>,
w@�$)��K��|�:Ƒ�>_&$�G�0�{(乎�#���*�����h������]L�**D��|N�9"�ٮ���ʱ8��\�b�%B�`e'����+�wx�Q	)��!�,KX��I`���Y�]��I�)%
S�N���D��G����t�œɯH�`c�4�uV��#�7��m_�����L��܁��M��;8����
��;�AA^�L��p����E�K��ZaZ-.1��G�x6_��W�7�,��-ɣ���9���&�Z��J��]��.SI��y00��i
�̹���;�m���X�X!c$h&~��4!�&	|CL�$�t��l �`��)�|s���m��6�y"�7iՖ(�d�����iɴL���@m�j���pr9/� >�2����<Pz��Nt͏���f.}'�5��z8� ��������2=/0S�
	5'�ݪ
b�$	W���<�o�s4�tt�K
�9Ĺ���(��q��%�am�2!&�C�$����J�34�kQܽ�z8��tX���tSV�k�-$�0�c�H�]��e5[�|�#6���\����[����|�:]c�o�H�T[>T;<���`��:�T�+F}X���$��d_"��/Y��5�֔��\
��g�S�"	g��T�eiM0 �	��ҏ�k���ߪ���K�<���vD����"�GTB�첯�b��
��w���D���H�S�?��H��2z%f���Y�cMP��*�Ҙ$�R����:J"ww�u�CcwP�`�iEs���;}r�v�S�����?p�$>��i�e�v׀�aK��9��0g��Q��	2��Z?�Z_���ά�m��,�}1��5�Ŀw��5|�8�>Wg�J�y�x��R���H��K���h[PF���-`}�9��V_��Z.� �(�ƃ9��
X��䶄J��\n@�j�VQ�$��y@q<C�;S���Z�FcL%4�L��jG�,Te�l�a0w~H/�{�D��3{I�*��B����Xu���{f��8NG44�Y��́��	�n�«�L�I�N�����+XP��j�y���/0��o��V!iIt�5�T]�$�U�}ڂZF�'��4�E�
��y}��O�q7u5�0�Þ�2?�%��C$o%ȴaPA��~�w�
��)�8A0F(�OO^�>��ox���ߜ~��xll������n �@�C�EWxE�'����Q:�р�L8.
�@�?
�'k���2��X��nY�nj{q�>u��D�*l�`/(/<�0�6Y�b��[G�X+��jP�쩆{*�)z���[@uF�ҹ�^6�_Gn3t��#��0�r�Eɟ�(9�)�5��*`��l��ů��s��T��p��ᮘ��
mb��7use�:��p�W��c��RG�d6y@���#!>GOYXy|;(��	�c��0(��D4��-���.�Ҋ:Ԇ����C�����Hᇎ�g��!1�#����[�7�cau�M�6%�5	�wfhP#���>����2����c�I�:�Ս�*.*��
t��9(�`��ΐ�A"���㿴RH�9D<-+i��+j�u����̽t��X*Jܜ���x�}�5�I&*׸���ǰ}�hٯ�~�
�����W2�d����.���~%"U�Cn/�]��&���=�5૓������ڰ���`�(�G"�D�tI���>�`Y��A��b�ǝ��6ҥܑT�NʽjS�l���ߥ$��P(_�Um�A���c�z���a"re�rP.3}f���A��9��i�*�>�����8I�T$�����­A�.C�����G�g�i�
7�J�.H�ә#!:�Ҙ��~��̩'�2l1"	/�u�Mp�;澝>��ْ����F;��h�)����܄��1I2�QB��_
�C~�"k��ǔ�F��OjO���MX1ԲK1����?������.o�φ��`xh��,)WO�J�jCP�
��6 H}zu�%��:�,�c��^�5��� v��كE��>Y.P��p���KZw�Zz<�����p��Mg���Οb4��oa��F�9C4��)�*�,��ܯ�$/�n���r����5rf��]q4�����&��dև�dR�R��H��̼v�R��z'A0/�l)f}Sά���~��0�`r�$����A�W��a�
���z���Ձm����s��y�����%�2�s�
^��@|t�eL�וw�c�/J6�󆟕�P���4Ϩ�hz�@�d٘�A�'wÌ���w�p%�����m�.�t?���2��U�7���m��Xď
�����`Z�4�-��/�F���>	{䤏��S�`EM+-ˑ;o�J����<�aq�{���I�?vs`����T��-����~1�M��GǨ&��c��.�s�ڠ���X��%��/3�X�l9J���?0�GC׵�KGBxuu�<r��6�������0��ܼ[?����pG����R�G��n��+F�wp��N�-���SkL�f�g��SyZ}3���'�/R�,�¬F��R�巿�R�sj.�i{�#f���Q.��^�x������*���A62��z!I���7���nog
�Gu�m�����3��R�$�=}+�����A�g�����R����=�p�+!��4��ɡ#�ڑ0My��od���X�q�Nǖ~|�`�0ړM�Tn�?��P�Ub���lg�ב������
��w�+����`"\�}��1���dž�C�O�|C��*�1<��3m|oT�H�D���	n֐��c��#�r�'���n���s�F��Z9��Ͷɭ��Q �|��q�Q�~�^�[������Ä`K��ӧ�m�t�-��~/�>)©�D�jr��O����?.$V��pGy�C��x�R���j�#�凢���M��DH���1�x��̻��wlс���q�w4���I�i޾��6�cTV�ܭ�����!`i�d���婁�>�D�z�����PaЮ�)�M���KM ��4`��v�B��������0�o^��J�U���i4�2|u�2���UR�{�l&�HR��4LmJ�F˹�!�;aM��L�����LȮ:�X��L	�їC�� ZM�5���v�k�%܉q<��G�ݻo��Ee@}�X���~y������kܔGz��gm&����`�5RNs�J�gxm�gt�(�rf[������C�)&�u珤f�*\u�e&r����LƷA��sH�^z�N��gZ��m.{�?$�T����xr�4��[���Q4z���ý
K��eG>�r$^�D�'=}�� �1C'�����޾x�w��Cǿ!=��H�y��0��b~ ���Y|�}�_s��Q��2a����<�q��'�(�$��uR�4�UU�fg���z�ؿ����p�!~sO�q��5W?������lL<�}�+O�I-k�����7r��Л�4���?��h�m�/�����6́�:�I���>F&�y�ɏ�����$��i�]�>�L��,?�H(��;��C8p�iUWE�#�x��<n+CÓ��ӿ���/=9(��x:��a��Q>2�_K��+Z�o5�8*�3�7�]���M�M��uEM^GS�h;����pu6EO1h��SF����jH�&�Y��,�śH�1���0WP5��
 ѱ��+&�~z����_`ݩ��Kk�z����'����]�T�ۊ<�{�+��@��oܷ��������>kT���i+�Ǹ�Fw���E���9��E��x���	`�A��j�^׀�~?��6ɻ�����o|��E_��Y.��
=ҥ*)�e�+����g��D{I�n���Θ�d��=h�ū�P}�pH�3I�K����ϟ�
�˚�E�H�'��bwXkN��+��>R��/��y�!)�3��S�?A8Ŕ����������>PI\��y�S1W�m�P���Q�EU<�\����Vػc�=�z��+���PK;��W[����1setuptools/config/_validate_pyproject/__init__.pymS�j�0|�W,~�A�Z0m
-��\9AQ�u�bKA�s-���l+�8�Cb��fgW�5
T��ޘځj�z�X��*����{D
���^Ե����AI��y��R��(Zk,��ouJ�B�X�w�D�J�ѳ��Oo?����ٯ�k�ߊO��i1_�J8��(Q�?%Έ�.;p1�-H2Z<!׋^�3����c�pNNq��N��4B)��/Ŋ?���w]�E{��W����{#|�$�X�����y����a���l��?]�JO8עA�'4�ZH�R�2Ho�|Jp�e,���q1�T�D:A.˻<U���*���%h��Nq^X�~+���_j���dF?b�4���N�w!��!�=»:���6�o�`v(=�.l��r1�ޱ���+�_r
�PQG��*��"Q��dM���?h/��"���Za [�M��n����kV�fW
R2r- ���]^�z$��jX��PK;��W���N#,8setuptools/config/_validate_pyproject/error_reporting.py�oۺ�
>�
�Z��{�Ax)^ָ��ҤH�>`��B˴�F�<JNbd�g�ݑ�HIn3�Z��;��$כBUL����En��b����,J���`��5K��U&��옕5�J(
���o,��"����n���|7d'2�I%�
5d�����J9φ�R�k+�T٧��,�e5��FKxFA��F�y"RA��=�7ؼ���<ۊ�Z(vd��DuJka��|-�$�������b����������mY��`�`�ۨb#T�;��K�K</�Yp+v%k#CM��+��V.���	��!��h��ּ�JK��x(/�
�6$b�ќ��X��\J`���O��K�ŋ�n<!��=h�������xr��M�	'֛��L��g�d�����n�p���?�O���w��`HJ����>������i	���Ƨ���8��x:��_�J��b���U����ǯ�9���~�}�"
�A29�����t1��~�Of/��`}�\�8M~;�x~֘J1�*�
5]�y&�,��BZ�R��t�dB�.H8H3^��3��㕍�*Tx��X��A�r'��kc�l%�D�~�9����qu������d18_|��#G�N�&2�/|����,����_��>���.��5W�����[w`�wB�@�E"����f��@k%-"�ؽ�n�>��"�]��/�&eD
斕�ĺP†�-�\��Ŷ"���L�
-#`��Z=�Y�"u���C����%�{7p"6�v$��n&�Df�J��#��b�hx^��V�D��z���d�&)��?!$�mVED�@o=���XA�r��aX�,��JJ+X�[�G'�}z���j�
}p/X�s@��J�%V ڢ�_�vע�){��)Ic�a��C�K|0���?��+J(	y�;�"��!�A6�aY��F��]��!6B��&
�O��DCs!��U���(1���.�q/�}��8!-&o�O�����jr~��qɳR�\2_CS.]�?YȘ�g�|��1Do�}0��H8J��oKH�C�R<s��&	�8��x�z�|'֠�M4
4k\c*
�Y�ᔨ�*Gp������� 	yx[�Ԯ1����/�]
	�6Zs:��h��Q�@��Bg����6����m(IB�7O6m�һ��։Z��wRBX��rG��G�:���Ԝb/v��&��D�͉Q�X'4[^Pp��g��Wo��]�7�!��x���
i��T�_���|���f�=g0v�����/���������-��kQ�aQ������֠�-6 �]�~֒��f${
o��k_�Ǜ%~�7��ͥ���=�̩9m<y���Q�I#��!���<*+��K��	�����R(i�9v]�j�ڞш�����
V��5Q�F�*�	�o�V5%G�k�n;���>-'L<�[�Z�����!�Õ�䘾�&��� t���������\���hZ9��x&��#u��D'Aj~�ϣ'��t�ۖ_����Μ^�	Ԇ�t�Ԩh�)6a����F�c�y���#b �-`��k!�9�U���j���/�!��l����İw�^.�������%��7�5�􃢽��z
�\	~Q?_%��Z�G������:�,��ep2�|{1����ף���[j��>Zl�m8�V�g�s���^DSHvqL�F6��_�'��g����q���T{���u����dr��]|:���u�T�d�nr6�J�GJ�=f�v�]�]�K/kɢ��B���d��bLs�%C+Ya���!k�����\��<�GVS�hM���E��*�,���I蛏��{�qً��mI=�P��'��Z=s�̼�=H2�a�w��ʌ[b�BZA�$�e�,�.0Nh4|qv~���ڰ��01�*[P%Z]�s�{`9,����Tm
��K?�v�QR�<����<�#��u��d�_���b�x�6N�XK�C�ƥ�Ϧ�%���:Zi&)�=t�����t#�ڀ"߮�а��d�+��[=��4�)��lß-b���Q�Oy���v5
9�czb��F�#
���[���B�h,5�Oѫ���?��|U�t6d޿q@����"�]V�Ծeh%3w�C?Z�ߏ��'!��/� ۄ7c;:�a@���]G)��O)�Qeӻ�U����9�Hl�2��/�Nd��+�����O�b��:8t��1;�x1۳�F~SSq�N���٬�Q(F�����y�<&p�7q��bj"{h\��r�d��aEi��:�j��P���K��J��m���m=�I�Z5�7��=T�&�����b9Op�zb��QC��uz#�E������J
u�SMah�+���i������A�,F�y&�a�S��v�ʗ�UYx+vC>#�^7��K�
��Z��A��^�Ӑ�Y�"\-�y@�bGG��G�|T��$(XR{�I2>Yذ�� �z�`�+�С$.<�{���f��T@H�]|u�	H��-�L���֣&R��M�q��o�S�-O���{��?T��A��e`fJ-q݈p�^d��]qD�{%�(���Js�j�ֳZ��Ll�~K�n�P��۷DQж=Mx¥�
Fr�RZ��dgj�:��~�����-�}�� �~�Z�l�H����X�k:�5���
ܸO��'eQ��E�%��-#x�8��t  �K`�#��ƣ�)�z�2UU��v�h@GDa��N��Q@�7u�k�[����I@L!iS��U�AR�-t)Ч��͐�s��������bL��3���f���M_4�Ar�Ԟ�E���%^{���s��?"�o�}-��i��)�{�	�����fF�P�׷yW����/��I���囵����!{��F��?(�Ui]�l9���"�-K[�x����i3-M�h�S;����># f{�
�I�F%���F�"ϟ�Ae�m87���P��7�k�?VKD>b����>�z!���uZ-^��Q��V��Y�z�2�>�,�E�H��+��zZa��y��f�� �ވ�u������""v�i��(7��/���R\�lgZ�����VZls���uS�7qN�˟�Bf܎&C7
���d�7N�w�I�U���#�Ss���dij=�
g~H�Z��#�&��1�C����񥨬�x�G�����h.���Q��X���~��'�~u���t�%X�:��u,/x����m^�u�i$P;p�E=��כߝy���
�A�= �_��1��2�fJ�.
^��H���Q'TR�!��kg���[&^R�O��{�^Wĺ�2i�T�#JRG�)ݯ�I�7ܛ:I��E]�;].S��0�43�8���W��-'���5j�~j����+L|յ���)}��%{Z��k{/?X7EN��=��5�Yj�]
��g/="��@�A�=CTC��~����o޼� ��o\�Z�Im���4�
��_3������u����
i�g��r�ɊX���g��PK;��W�G��A�:setuptools/config/_validate_pyproject/extra_validations.py�Tmk�0��_qh_l���`� �t�/4n�(%U�s�M��$w3%�}'��Iǘ�>=w�<���;����q���jS�
��d�(�Q{�Y�����I(Y
/�v�EVʪ�E�<x��������,��"c)���6��K�tt�P��R3v����
��)�3VYS������åh�ky��J����Ʈ-�|uP��r�M��y��r6��c�$�K�����S~�Y�*��Ӣ�E�n�1�C��Eal�;���o?�R�zQ�<C]:��[�`��a
��U�M�^Py��BV��U��Wr=%�T���J��
��J�`��P\Ӊi#M�Pq�X��qQӍ���>B>��p^lhQfp��[�_���}�'��8u�����c*ދ;b=��,9\��{��S�-5��w�B!tX9B?ɒ�
�[�<Nܟ���G��W��3�J�hA�(sdH���5��5�V�!�A��ڞBz3.�S��}�!��)π�O���&�'e���&��d ����=��qw�8#����e��L�o��|���8���WKR�k����PK;��W�o^7�LBsetuptools/config/_validate_pyproject/fastjsonschema_exceptions.py�TM��0��W{I�ZV+�Vb{!�Xĥ[5�d�'�N�Պ����gم�x���<3YT�q`h2��~�����
\�Hʢ���&Zމ���j�"�qT��Z�`K}��T��}B����~CUӍ1��-&����YXߢ%�6��8C�3�
 qJn���N�Iu$��pB��Ai)��v�d�a3�u�
�;�
7��2eE�I��I��笶 kqK,3)�C���B^�_�4��:+MqD���@Z؛��$��Q�ECpXJ��
��:���".GN��Y�W��E����m��Z���ø8�Xx7g�B��Q'�*�:S'�6�Wqc@€h��1x��2�hQ�����=�>/9���2N��"s�s����7g���V�T�C�E�t]l�x��eQ�yy�k|S+z�˶����5H��B�N��Hq{"TM[Hؑ��pq��.p!^]��#�i���������Ax��`��|�Ԓ���4��
�>��m_���5^u0���?[3�t&:�u�G0�hvyD4���3�c�����<v�?� /��%^�yxӶT�ߞ!#�[�԰��
��	��mg����n�)��̎AϮ �VO�����At�ҙ���b}aN/prNl���������[�d��x�<6<;��PK;��W���)|X�1Csetuptools/config/_validate_pyproject/fastjsonschema_validations.py�}kw�ȍ�LO��cZ-{&���ƛ�ښY��ױ5��:�&�MI���[���~ԃU�*�����.�=�q�(
@(��h6�W�ͷ��z�E��l�����I�>��H|]\O���(*�g���l�M�׋k�� ��y^�����(gErF��g2M��㣇�|����G��?~{=}�|u�x������>{s���ߏ�ǫ�|�,�Q2�\G�,͓e:�F�qJ�a�ߎ߼}��e�(�}?x����7�t1ϗ,�<�O��yR,�Y�g��2�&���(],3�w�[�_���>��LV�hÿ9��o�׏ON�߼|�|�&�����~�����`b����g��_����U�~W��Ƴ�%��t�H��4������~�_�ǀ��������o�y9��'��-n�.�{�o��yt�L�1�p�'�G�U��s@s����~4K�0i��gQ�#Jt^.��b8�Flv1\\//��<�����a�HG�9�!z8NG�$��g�l2�/��8������ҏvH�y��Yo/�.��<]��Y��뫻) ���áYFY�͊e2	��r�7�U$Y�:Ip�׃��"�H�Y������>ba�>b�a�GMC@�^6�p�G�v~�
��"���O��u(<����y�~��l,:�Cb~�0O���!����C������C}�-')�����e��ާlDNj�E>��`s&q!k*�ߏ�b�g�K�n�g���>2[&���E��]f�=�.V9���X^��kZG����u�L��'8Z������G�@�T�M�S	�u�b]K^�W�(��y�`�p��.�I�q��Sh��]Gb���h9�`�W0��^G��!���"��ĉ�ʗ‘V���I��f,��B��ƣ]����lq�~��a�$�(6�����&�K���K���Qq9_M�H���֑�PE�H��O�;���p�m�H�xLd�L^��E�/a����dR��y���iGE?�PP���Z�`�p؁��(y:!��=$y��U��(�<O��d�<�S
{�m$�1d�Ȁ��`N?��Ւm!A��5w�b;l5Yj��6O��y�ůoOHD���Gp��i�2Z_Pl�3�G�g�``[��&p�d�Ġ��M&H,bg���r�Q2�s"o�\KN��%~�4���@w��wR�+�������6��)�ZB%�ǰӇ�tM�	�2��s@�>�|5#��-��r>_��!^��}+�V���ɫ����t��m���3C�_�`�p���h]�^O?3b��sߦt�pL�e��P�
�i�4_���cS�g��H콿�{��ɸaFl�"~p\'�T8�����߱90�u��ȳi�_G��d��!��:��i��N���T�̃�ʱ�\�y���w0�O�j�j�*��q����G��ʶ"q��^��<�ϵdj��=���3�g<d''O�1߿*L�ϫ��X�%�*A����S�9~��űm�(T@�����e@ L��GG�&�`�l���B����j����i�����6D��XB��:G�����U�x� ����%)��'?����x�@@��g�<�ؿi�2����8�)|�8��1p�y����K�:%;�;�9=�`��9�u������L�Y_�H�x�aFcF�Ǐ4,ѓM���+Ж̮�\W�}Vj1��yE�<lE�8�W���c�Lr��4��g���&y�ꉺ��G���(~��P�h�ah7\�ʮ�
"�S��2ɋ�	b85i�d��_�JM��T	ԶA��\2�YU��eh�"�q{���,i�@l�*M�v�(�����(�O�땐|.\E�1�6��g�x�tb8ݴ.���ל�6���Mi|��uz6%�,���1-軀�+3;�J��ᴋ\1�!�>\΋TJ��`J>kD��8KA�%;㣪@ڐ�
�`Aa;�
����R/�=\(�ӷ��A�8d�Is� ��HZ�s����%���f���	��ѡD��ҏ	`X�-����P�(�4|�x\Yk�gj#������
S &$(8�}��������{�$)���Txlh{�� P�����$�}��>���ƅ�w�|wK1"I�_�4�G�����3�lE[�J��.@l�'��ŀf���J|[�4ξ��W�A9�E8ǯ�_?��&
Ǽ^dt:`�Z��ΦU4�U�ђłm���@�U>ї�
���9	�(#��.�<�'�Y:��'3���&�d/br���o���~7`�
π�;Xp����H��"��v�l�n��*�`O&)]Fp�X"#�{�l|0�C}�˸/�/@@���|ͧn��V ��A�v��nn�����Vǹ�8;�6)�^�)p�8�u�Cq� ~C�4"��Iz�̐q��f3�*�7uB�uԍ����\|4��W��8<_�F��^e	��(l��FpzK���YVL��U��RL�\LV��b���{6c��|,���17�0�0]G��q�Z�Wiy�~	7W�Je��:��*]}�h�R0;�A���Mc*gQ�x^��<��Ӭ�y\���ma�`�=p��䥯xW��,N������"�
��VQ4�����%�l�k:~�H2-��N�.�:x�����^�8��K	�?�F@��pvʙ�5w�1�YƗ�Ĵ ��Ք�v<c�Jӕ��ܕ���TU��<��U$���M�e��O-�l���6SHv��sv���{��	AB궋[��GA�*pl�oĕ��8nz���d���z��w;���4*!jЭ̭Xڅ)Ҹ ����XI���%���J���1�n�]����32f����0�U>���xȍ������RܩU����s��Z?Bя�?b��hB�&�O�-A6��m�r6��Q�P�гk��T:j�	��d&��do��T��j��6�tT�A4�t��eҟv�BԂ.Ok���V]�o�\;!�M��K��_눩2���ڧ:u�OHS/$s1^ͶΣ����7Sŧp�$,N%�r��l�@��yEW�yW�Ix����"�cI���P"��O�M?5^d��ED�!Ԁ(�R�O��jU��|��'UT�}�Ѱ$/R:�t;�H	�Q��^p�%��,�dK��^��\�@��xB����X�$�B��H��I�h<���`�E2��c眀aci��r:�ã"55��ut["�z���A��gB�m�r�f����a�n$h�!�I��ΑϞ��
���iK��>1J��<�n���h�
�2�uZ�̈́�!G�t�J��̸y���<'*�8�T= �ȁ������>'�(��N���d��ɜn�h�a��2�Ĺp���ȴX�G�z`Y����5~+9���B�,�/Vg�~��q���������(�'��ys���ߣg/^??~�}�t��e��d~���Ġ�_�-��
��e�^�6��[�
v�3����˴�O��d�dD����&�3�Z#�*��_�9���3:�e��'��jE��vʁ�π&.�y�
�jk�	��x��X?~ 'P(UFW��`�yOp'H�Qq^����}:��������..�t�3���>������ٟf����t������v�*�+@��4e�%��t��!�@��=��o�0�Ym�JL
�{��)�3���R�(���m,�k�,V�<�C��z@^6�.�W�?+^a�l�+�_p�#jX��d�S�t�Ɖ㞭���"�Hџb)~��l���b�4Ca\���H3yb$,H�t��Ba��y6�u��ʂ�Ͱ!��
�`ͻ���n�N�-(C[��>����H+���WY�\���7�'��˹���mp���]:�j��"[��p�5}B�Y
ϊ�ȹa=��Š���	�Ɓ�w�8(�skH�_/�MCq�v�\K�X�t2?v��$��wg;M��H�p���Ӌ�9�i���\��S�~� �gwO���-Y�䰇�a�8�y�7��aɰ�t
�b�e
���J�B�]��F|g��X��%
h�~����;s�t���tLNk�b���[�܇������A�Ӕ�Ӡ%qm�q��2�Q}�RZ0�bn~"	8��aqXJ�-8
�*Q�z0�ާJ\+i� aa
�]���h��WEI��j��=[^�6 �EQ|�d�D2P��
Ԡa�;���K�H�gUk{JQ�"�<#3M���K�M����\&I�C��#��0�`��~��,E���
���(Fi�B2ž����g�}|~]��{C���QB�aA-�7�� �#��1�ȟ��N��tĢ�ӆ ֲ���8t}>_�ƒ ��by��E�M�{y��ҝ�(:���c��L��Eq-���M��bYQH@�vjvG��S����:�0!m?16ʾ�/j��9�L�'"����bEz�}v_}�e��+�'�;PA��9�C�x?[U\{g�;�O�m�M���`�.�k@Ñi�R=�~�+&f���5�>��m��`"��턃8��bP��� ^=(A_�Q�����,3-�_<~����'�lv?h@�ȸ��A�:g�����:����"��M�[�Ja]�Ք�����a�B�5��z]x�>q"+�$��,[�p�v7���e7z�����%܇H��R]d��-�A�ö����'�O����cƁѲ���&�Ѣ���<X��RC�^\��H!�Zv�i-/zL�����o-ѣP/#P(߳�d)lz�>�Xa��v��ⰺ����tL�bS���–],�'2��d�ڕ�	��l�4��J:c�z���������D
Es����g�9`e�c�����^?�h飣�!�"Ē1+����I(�/)�?�U��	6�}�\�+g�ʳMF��Sr���/&�Pb�9l�hw6��n�}+5�v�%Fu��B9�-�Ջ�W�=�t��EϭG-�xK�O�@1S�T���]a�����8���a?��d/�7mD��,�4�n�'�/�=y{z���<y����^�������'�������8������f���|�uF��`�`_Β32����8f�[���"�<3��@<E.�򱻌�Q"���Cշ��S>�Q��(n��V�@��x�H8bʤ���4A1���Uz)�$�� ����S�"�x�c����$�\��X|����l�����Y����&R�#F���O�%�[�g������¤�}��,C��UigT��Ju�FQ>�U��6����2��E��P71��C�\�����|���L5�hv.�h�,�Gc�D�kϺ�������=�a� ���AQN/~a�>C��E��|!�~"�=���������h#l��Χ�b�Vs=F2iА�F\��E4 �a}9����Y��ra����|w#j;�ΎY�Ԓ�f��!Z��A��������H�R|��;������Zidh����n�O+�Y�:���+aR�u�}�\}i�cO�7��5_KP#k^C�L�#�C�R5F�t����$�Isx��t2�+�{�x��B��|�'�;q��k���-L��x�bg����ʒ�,��'���Ք^��0�Y���Kz�uB�����0eI���O�pȢ�HJ����|eHv�d6�T����|e NA�ϖ�#�|���xB"���'$�	�xB"���'$�	�xB"���'$�	�xB"���'$�	�xB"���g��D<!OH��D<!OH��D<!OH�s���9����U�C3̊!�~�U��Q�9Q�Nm\���_�,�ҧ����ޞl�{jM���g9�6�=��{�U��{�X�#����T�d/��
c���Qݽ�Vڭ���WE>mp�<_��.�05�B
3��Y�g:Y���G��
GrW�@զ@���:�^�;gp�Ń*Y��Fɴǿ��0��0Eq��ɣ��VXe`�w�U��U�Se\��}�h�
뉉{V�eQ+�a����:����C�5O��r�S�x�h9(�h��Gp���6�t�x (�U�s7Vnϊ�t.��5pC���A��7���^
q���P=�tSd]��le�PU��c�tVb;B�J���.(�+l}�if@>�{�Y[9��>�b��io�N��d>��V>�Q�7��݀%�
�����;�'�4_p�ߵ���>����.~�7�A�T�4�)�jkhAw:�k����z�+�i���n�Ӹ��}�3�=�O���]�`�i�>xt�=P���x[�TnJ��Lul��z�u��0�a7��D����+�W�5�סdh������[����z�e�V��ڿV�W�V��I�:���^��ޜ���{�ZUf
���Օo�;6��Y�nv��om�\��s�r��z�a�
;<{��E���!��}�|,�V�׃+xb��
�����bD8�h���]�sH15��P��YL�p�_�ِ�?
�蚡�!����]
��q��ײ��C��=�Æ� C���K��K�ڀ�3�u52�P�+��
��B��P�+��
��B��P�+��
��*4�wɥ��]�~W��e��P�+%
���
��]_�Q	��B��P�+��
��B��P�+��
��B��P�K��P�+��bh�����]�~W���w�T���4x��ϰ����3��t3Ԧ���B���4�K��KU��K6���Pu/j�߰�{���N���Њ�S5���!7��Z�k����Y��,���(T�jơb0ԑ���E56
d�0�+A�et�PD�
Q�ځY��e�bq�@��G
�.<�s���,�Ǟ��<=4�iR)�W�,�b�L�g���b�b�R��[���N�t4�0p�򅂥�_i�i@=��Z
pp�-�T�Ib��h�����r|�����H�J�I�
nqc��W?���\����R 1rV1T�߄CW��IÙi��s�vJ�FK�b��2�\wB���Ϭ��C���p(|
_C��P�5|
_C��P�5|
_=En(�
��>�B��P���H���k(�
�����ે<_�Q
����„
������k(�
�����ેA3|�_qB�J��27�̍!sc��27�̍!sc��27�̍!sc��C�F����1dn�m�27�tt!s�������:*!sc��27�̍!sc��27�̍!sc��27
�27�̍!sc��27�̍!s�-dn�xB"���'$�	�xB"���'$�	�xB"����M�TH�s�(�xB"���'$�	�xB"q�9C"���ǂ���'$�&���'$�	�xB"���'$�	�xB"�/#�gQ��J�"]�RT<ʝo���tYCϬ����gVg��{�r>K�X
�윕�kH��]*�W��H0JF[w�^H����d.!�KH����d.!�KH���|�s�C��!�k�	�»��w
!�-��%PH���Zw�B
��먄Z!�VH�Rh�Z!�VH�RhUͧ!}���cB���2���v�>���.��;Ԛ9�n��m�iV�mW���y �&w��u�2�;:G!�h�%z�(6�
�DC�M��	17w$�|AD�Ch�f��?ѣ�z�#���7<�+F^B8��q����ۓ��wOF��Y��V���6`�ǻJ��jˡ�
��/��Z{��$e�~���ԏ��LR��RGϕ%�����ݒ���rX�1S;fS!��Hk��K
2ͭp�YŹ�p��Q�kθW���_�z���S2�*����B	^E#"�6jꜪ�}����io������4<���9F.�khI�� qQm��Z)�X
gӒ��^V2�K~"Z{��������Hp<�P��|y�15q7��Z���Zo3Ft�6Ѯ���Z�&:�|MN�bkbؖ\M���Nr�еY���vǡ

���VkHU٣����q��d�E7�:�ީm�o}�K��T��bO��l'��n6(�J�W��}���e_	l��S���rž��N�ym�ur�u�ι�viW�%�ʆ���_�^�]J<ej��+Gn'��/��|��(�]W�khyZAr;��\aǢO~˲oC
h�~���P��o'�d/S���M
?��O���#�
�
�'���͍�K@��V.�ح�K��ܫ	�m��Ӷ٬s��
�:�m�2�U�Z�G�ʏ
���S�=K[Ѡ
)��S�j6ڮY�u)DjSS%R��)E�R-�@p(F��T#s��+G*�
A�-|]
������%@�<�4,����v$��l"٣�ՏC�m�IP��I6�]7��xQ��qX���:�YOvj��C��&�?�qRc �LMp�Ԙ�K�̱}�j���c&���5�u��C��_�wZ��D/��A؋�_I�>�i=����|8��fˇ����`o���*�~����of�]Q�DV�kK��i�7�"dx����h�1�Ν� +m�Gv�Ѿ�^�����f��n6	���&��7u��w8TNL=�m۵�k���{����^/����w����^)�'9�3Q[���ʦ'�.+�`�m��]|���B؃)x�|,��p��*��u�����(��@�
�K�<���mG��!��NH1RL�p���ݷ�b�]V��^�c�uǧ�5�|�l^�g��R3�c=
�����C�J�7j=!ɧ��	I>�O��,��F?��ׅH��[�4�Ш�*�i�_�D��W�#-9�:4�]�����/��~|rr����wɧ�
T ���ol=l�Yر
��B�T��f{<�uș�l��f����̼%4k�h�A��CV,�]{�U,���zQ�S�D�*:k
��2e��>��y�G����4�=d��(�;���Kxڤ���;
�Na
��}ů烖�(V�vkp�ĭ����m\S
<E	=0+�
�<������y��/ر`?�5��c��y󯽭�sw�JQ7�뒛��W�r�w�ݷ-�;e̿m��M�4ֵ���t��j�nPkK��eE��bW��0���V4���챗���dn��p���7�<R�z&x:5���*�Fx���
�XKWw�3Z/;|�]�Z��9�G_Y�O�8���&��	������*.ξ�,�X�L���՞e��V�8�ޥi����6λXakm7٨������!��%�4m�|Eͦ���rU��m[x����� `m���mG��\m������{�e��pX3���>�W��|��<:�>Կ�8?�,�����c]vwl
��vT����5�&W����W�ˠ^v�^��6��p|�3��s����uT��u�<�hf��{���t�>��x��קj�iM�R!�2m���m������[>�c����&V�ȴR��CP��!�t��߆T%2��t�Ԧ��͝����nا���FN5�j�x�:���4��KY������7�RigM�T� �B��:/�m��y��#جݼ��yd�ωTu�)⬄]�.���ٶ"��?^�����'	sڔ��{~Y2��3�',�
V�ee���i��/��|����G�'��!��`M���y�cxf����E��
�zǪ
<�56�lE�U�G����@�_��r'Ī�Q���Ft5�S��ΜX�Wj���G�>p�U�Z����j���j�Y�����Uw�: o퉵#�f�6~(�4�u��u�u}��&�7浵��6�=�u>Z�r#T��Y��:v�|��K�L~v`�����N�5�����F��Z�l�,�����ĭD��a���^��8��A�ޒO�B�͢����q[���/n�nn�=�O�Y����D�m��d�-d�.��
��Vm�f���[s8{�M;o�DԲ���B���7z��ٍs����͸�k�a-����|<�ۧ�����f<�ٍCm1{}��to�L��t㴦M��Ѳ������ ��V�Ug��QWr�[���Z~-�RNֶ��F:�*Wu��գ�U9u��ƽ�;��s��P���Ң�TN�x-�9����Uİϴ�j-U"�LZֵʺ��9[�V�#k�-k��־^MQ��>ϖ�s]SO��ዢ$k!��5oܶTP���-��<��!�/�K��ՖyF��k��I���δc)dY��i2�+�����<�h���5Ů�t蠎^fV� �A���c��t]�x�o��|�/Vb�/���e��m9��q��e�*m����2�k�r�k?�5����䫹Ʈ�>���lH�O��#EX�$±N%g���AJ����J?9)��bHj	T} ���V+�m�7��?=~������GlX��Cy��dtI�vr��\P9�DI����"+AO5yd��Z�UY%���R�ד4�d��������<�$'@�µ9z��Q\ڰ�b���X�.�Us��F�J��GB�����e�J�h���Pm�~�G-����Omf��O��*�O��٩C�:�S����q�|E�RikY/h�XO[����VU���ng�m}�w4uy�o��>�G�Qw���TVg��8�&�|W�u�XI�r�9B�ݠ��h:���@��&0�G���~
�h�E�O�X������\����3L��Zf���B�9��G�P��5�A�:����;V�U�U>S�;�02�+#�BTi��*���zto��v�A:5p<Ek�CF3e}�c�aٲ���A��pO�m�4����@���u+xB��,�Դb�l�r
Bӝ\3��	+���/&�U:���r��]6#l�\��M����˫j��I��%"��	��)�%=���@.S��h�⋇���7��K9hڥ:��r�����Zjt�R���b���f*��T��bF�"�q�V`�a�KO��f6���Zo8��'-h�T���RF݂�r���&�(��:&5��M8��aM��Z�m�
�AX{���#}���.��R_�y�۳��^�|��(zn5���d�n�:KQ�9�S�yw�]\��A�A�	jN��b٘;����r���t�d5Y��n�'�/�=y{z���<y����^�B����	|��|����z�v�4��|l�
��W��@|>��p/�T���l���!�q�����u7�:2�k5��]���ּ^��4my��pܧ�)ڹ�*�o�s�m��y�_��lY�G�-L\�Ǭ,xK��d��:����zzBX�m�A8|�N��u��ѱ
�mˈx6cn���A�̓12SVc�������4]&8e�'��5�K�_�y�&�&Ɖ�wu
�ʒ(��t�c�
�\��8F=b�nd���,�Lt�X�^F�
m�@Yr�3�,Qb�bvmUboE��M����b���
d3{��߄)O�1�N�eZ8��2OO!f�J���zN��?8�j�B�4$^S&zC�1�(�\m�,6�sY�w��_+X���H-O�cp?t4����5p]�S� ��.6�'�ƀ8[b6��|6�!���t��׮r�v���*.i^���qҗY���n�[�B@m��]�3�����n!���b�͖��e�L&�ض+�x*f��Ѹx��|�]��7�H�S6�RI.���s��}Hp�(���Ӛ
k
(b׉�p"q�&҇q��f�@"����1����e���j;yU��m�zǡ�}=�?�����E{��Ggn�
r�ks4���B�e����޵��]�eA ���
�/��y�
�Fض���S$td��,+B�J|�!T7���Mn{s��`�
���'��o�g�x��֤֕�9)�ړ:�]��y9������G�vJ�j_�!��E�P�u���/
L��K=�ؾ����6F�sg���Qƻ;{S���Ԣ�
(ƻ�vG�kw��P�m���9
���M�po�ƿ�6�>��n���g�>�}���)k��⯫��u-^>u��T~;.��"|�P��PD�a~tQg�(���S�O�� .������)���TM���+ka���Wpk����2�]6���s0�yط�x�]g�'�y�E4�)V ��5��<��r�m�	�ʩ�zmz� ���T�{&�o�+���Zo|����?q��k!�=�Ԗ��{�]�ʷ�$�B9P�n�T]ON�&�t+n�i[���(��[뜹SJ�?-�t�ѷ�V͏�f��N�$���ݕ�Z9S=�Օ����e`m�69>�W\
k;Lf�ҽ�c]X���؆�W�l���j��
η���-���c��w�����N�,�����'֠���S-A�s-]@�_���9��Z1G�p ���F����,Ƃ�z���v)��+%�o��ΆB��h�gX&߰6b��>��G�d� �����`<�J����^sGC0���ڨ�YG2p}�g��.�o��d��pd�-��ZQ?�IJ��X��a�+<��[Mu��k]����������?�C�p�P�s�[�V�x�q����a�7� ���"��#���[���[_�e��WyKZ��!���?`����8OΗ�t�[����0�s�P8�X�U��w���R�K���o9zI�pR�l���b�
�SaF�9D1�Ѳsv��>$�x<����
)%:[e�q��:�.�Js9�N�x�����9����$;_�mq��4�">�=��+L�~�-�0�go���fE`�}�_��}�G��'�����7�x�À�����?8F{�=ɒ=��P�X�Z�$ս�.�^V��!�= c���̢zU�E��-���_�VP���dlC��h!%Y��>�r $z��ʝ�z�`t~� û*;IWiά��5Dž�0���t��.`4)����l����i��}�^�:9���J��1�Vay��H���%W�lL�X�����ZWtd>���ѮH���\�3~;ν�mA�Bg�~]p�+�I�%V�+/��(����*�E�9�KY]*_G������w��J��e���}m�m+O��?>�I����Y1�97���X�V�uvN�7����A��3�g(	�L��K0D<Z�ք.�k��nV��	U�%�a��	gp��dF:�Jᶹ����ZpZ&���I�Votz$:���isz���dM�
�Q�)`�c,����P�����1�G�Ia7�8��U>r����,Ɩ~\�Ɉlg��z�,�S�h���t����ߟ`�tV�9X=2%Q�Mnb(�2z�$#vf97�x�Ȝ�L�
��`$���֚�e��a)i��(�f���2�+�X���z-F��K�`ovG���٘*�H;3�:���j.q@$�p�aYG6:_�Fri'�V�iz̻]�QF�mV&I��Ey�
5/��8`��?9��?�L��g&�3��hg��
����Y@"�)d��Z��a��y�d�=_�ӵg5Tg���aX]KU��r��b��i�6�v�)@mu]L����<�d��-����'����X��w��8�r���*7�W��o]���vP=�O�yՒ���t�����AJ��:��d�S^3ce�P\�K9$d�2^���,�ȋ/��W)f���k)AH��gׇ�x=f�K`�S��HV�,�
�)��x�̤��M'��p%pq!9��"L����D@�:8?�]H4�<bU�(����9���'�����jM�&b]�_�����X�&��s�	����@��3�$b%��d�C��w�1_0�I6ʖ�#�>3��|0�C���	SnLy�1��t��E[��=��HȌS!�i?�,K���($���w#��ȩE��|�I==�!��	Q_V�%�5j��[k�"��J{�͝�	�ɪM��ϟ5RL���_Ԓ���RG�V�k���41f�&M.@L�E��E+��Jm�@)z-��x?J�hd�f8 �� $�?Y�y��`��)�챖y"1Jo�p�IA���N���-��c�	q<^-�,�BlEM�m��]Z��!��4� [a���݌����~>~{2�f���{0W|и���3��h�b����-z]C�u�	���F]\�F��'29���d�-V8Y;m��b��m��5���î^fv͎��N �)Ƨ�a��z�����'�O���(Զb` �)M@e�뽬�Z�¥��M\�=W��V�6jOki^c
є�eݟA�sP/#�ƿg��R���m���,�,�)��8��UR�><��_S�t��z�;Z���Te��֢;�������z������z�-jC\o���
q�_�&���{�����y���h����B��߸���2��epLj��!�sbnB�M���17^�y�h���`'7�y�L4���g�����y���'K��β������ź���zёzQ��Eoœ���LB�Z%Q��������d��}�ʼ�iɞ#_-*�+�1c"UfJ����?�|���V������c�N��j���;�),m��g�	2]�q�����"�Ԧ.dp�%"�n��ЉYk�	ol��L�#P&�m"��-���fA��$���>��:bS�;jk&��}�Q�}m�%�ؚE�l5��R]Es�'Ѹ��N���w��E~>�Ջ��A'��ӝ����؋\w�֪h]է���̥S=�U�����t�Nu�۾��1�����;z�g�m����蘹��$7���P�n���v����O�NM=ͪ|cS�޽��FP���l~?�����J�%�E��vtto[!�$_�B\�u\�u]�ޢ��珙��c���3+�h姝aSC�J=#�j������j��Xk`����.k���Ǿ�`c�*M�7��ʷ�6������� �e:�JEA9L]�Q�H�j6L����[�G�o�x_{ſ:V�G�I�) ����o�������&˿���+&�]�u�\���2~����R���o~��r(Ň���t�����g�IǮ ��Ǫ�a}/������%8z~�OrmasN)j>J���-E�u�%�{�S���gJ�ZЃ�GS����Z�[��f���{�k���uE';��_�9����Z�+fۄ��3�0�S�LO"d3.�/���k
T���x6��b��c&���X�_��7̋�:�y���M|���w�Vڊ#s$4sd�pdc?�,:�92��ϑ�pG���rd1�&Y��92�Zg~!�qd}Y�O_k�:�ȥEds����|���kVFY�;�݁���uά�D	7zY�D��(hq�ݵ�5ӡ�ug�wUR�ԖQ΀�΀/��5U��'�-�آW��m�	�ӊv$h\>���\�d�_R"*{pL!ߥ�$�c�m��(w��x�T�w�z���T��W]X���=EҐe��i��v�V��}c���&og
�]4g�v+G����Dq5/��&<3?Օ)����bِ���ل�y~1�aȫU|U��C������C��C��x�sY䢾�<�ȨNu�J����
�bI۫t�zi��@�R�ŲIq�w�y�Vvg5�X]���^�e�mV�@��,�X�-ٻ��(o�*DYU��<T�U�����W'ѓ_߼9~y��ѳ�����>~�b�_� D2q\F����͊(Y��̪{c	}Kx��BTڭI�k��^�^�0�-�XVK�R�ӄW~-k�S(^Tk��_���
�34�)�}lA��+�-��Y�-��s�j��~e��F�r'���K�"�w"‚Ć���WQ���r�����''�o^�}�4:`�i沫s�k
�8iG���M�����.�Ⓚ�s���F1W���<S%�H�Yy`��!U�(/���*^p˧�^ؚ���1A�h�kH��¸4}�x?�x?�x?x�U^��,����U\e��z��)�)��!������>�-*E°עx�����3*�#�\$e�=?iO걽X��;��S�y6M�k����.@�^������dIL&�:����'3��Z��2QI�#Jd58vmR��`��;�
&��ۊ ��jJxQ>�hꢕL
����-����)��0�?�@�C�lB��*A�T�
>% �?}q�C�.4��}���[�ԏz��[�PA�"�fp�P�r{�J�1.N��"zZB��Q�bE?wz�]q>��-ӏK��ד�~��q�j�*�qd�`<c��ah�tD�()�8�)|�8��1��b��A^,�Jpl'(��U��أ}*���zcp���tޏ�f������,~��D�M���rm���iU3g��*xz`�Ù�IN\��Fg5�ZWk��ꉺ��G���(~�����3lÐp���7��Oţ�$��	�"Ɂ��M�*��_X�\�oV�5	^�� �7�d<��H?�B�H_���ł%
��f7oR�C�@QEppƏoGa�k~McJ)��b�nY���G��҃6�h��3bQvу���v�p�NϦ�U��ʡ���
�,ɔ�et{8�"W�lȳ�s,`ȥP��e���,o�Nxz�GU��!!�d���*v���7��gs������~�3���9pw���L`�����"�]��i�{˵�D�v`&���#�9;
:=�j4���aE:_�ۜ�縥̫L���%���c~6�S#��Ƴֲ*-�j���ke}=��E:_0c8�(�ߌ���
 g��3V�S���p�„�Q�K���3V�3��%�^21�Ԉ�1�����E�Vy)4�'H?�J��h�#S%�@с�(Z�
U�e��@Rqk����w�X�D��r;�|���آ�_�-��{Y9O�V��.h���d~1�̢���i{���W�A9�ek��ׯ�EeE߸^dtj`I�Y��+�M�hbZ�_������`�O\%����9���QF�Q���n�x������2SU��k���w�u�a��p����)%(.�j���c�@��kYڔ>�t����w����xPƨ¤�y�b�]��Er�M�%�]��\���L({���K�(�xB�%�7��7}`9��}���u�i�!�-���0P6c[�XD����OҘl���s�i�<<�ݘ���� z��^Q�[!xv�/}��5G�I&�ʗ#>"fNjy)�:Ȩ5�8nK�����#�L82�G�Zø��g3�{����F��G!��/�+С�����l��,a�Q&��2�԰�%(b�4�z:_MXl�d�)X������
�J��`���qH6>#�+�)�Sk`^�y��f^���:�������b�F����{�:��� �_k��s��@@R�iK���n��A����?����Zަ`��+�UE\Cw-�[=��P��
��m#Q��ʾ��~�&�G*t�%s3���@�p^�8\����0���d���Zs�L�U6�f�w�7�����t?}�>�W�/��_�ا
�jP1����{
���WL�<�ڼbL'���Z-;g�9s3hc��U�� cuۅ�C�� 28�[I��)S�[�1���ܜV2�w;�U�,;�5��=ɚ� o����6��H����/����b,H�A�?6�5waw%�C���Ⱥ"�c=Q��g}ù�㿐У�P�_9G����7��~�,���1�ct�bT�@�h	�ajK�"4��QAo���gl��0���7Ƙb$,'���d���q&���HSmi����j0������=M�`F�Y!jA���tY\���j�N�T���ͦU�6�΍�������I�ʄ�L��4�a�>)�w����[W���uj����C0sf��!�93�`�����"73����`�@с�C0sf��#<�#��Ñ	G&3�`��z�Wf��w|[B0sf��!�93�`�ø���U&\e��`f)@�ڧh�B%��S[zv�5��Y���쌕��o���������˲����n�M�:�V�ꈕ�.��M�k���E]��*_�vV*�����]��+:�ίP.�m�N�P��u�x�gYB�b��@w�ά\a�c�ɳ���q5w�O���8*�;�jG۱T������;�J��Q��c�A�G��஼���l�f�kG(���F�'I�婳�p>Ke!���EkZ�9��J:�"~MɆv�bW4�QSK�?J��]���'*N��A�Z�B��_��Vȹ�����Zg�Kz��â�{XԖ_�I>�2���tuX'+��|H^���A���dX��^�����3��m֥��?\g���]2��];����vx_؜�"�E2��P�^�֐NA�DSSƯ ����@T�i?�c��z�V/��͚����a��<�[f�S@�w��E����������⯽jiPH0��Iݪ�a ܨ����.�e;�F^G\2MqA�u#.p�[�8/q��l%.ImM���2���(�!���B/��
e3����!��!��0C���v#I�Z�o$��It����#�unT����B�DA�Ca-ĭ}h#�YCޑv�TB�A땑&%D��_�H�|^��m+�DC�7�/���/��`��҆����b��5�G2�ӏp���wH��npyz�d	P���l����^t��!G`�xw4��̵���;�f��~�m$����ڰ&Jh���/zJl{TtM������Ш�����*Md�� FFZ��n)��E6�	�'!k�'mێq�N6�%Rc
N%�ڢ��7M)}����h�.�I��:śx�����S��i�⿯a�Rs���j��؊�[�3H�VAG�h�f�ٖF!A!���e2b�1}�Aj�6�zo=l�����Rc��o��#0��`؊���U؜��
.�ܵ�%��+�`K��)�`+��+��};�ňw�D�xD:�Uq���#ơQ��n�J�4G5�-~q
������W�ƌ��!��t��C��P�Œ7�Y_y�v���f��ߤ�B��3��
�.&��G��b�nþ*���R��B�w�J�!�P���,}UA���vJ��F��,�@ǩ��zc���כ��?�{UiA١w��7�������ӮŊ8�!��p(Y����!�0�
Y����ԇ���o�Pp�!>����C�[�o�!�>l��'�O{6��d>��7]Z(d�Nb�mD�|��C��'=4�޶QA��"P~�D]y�&A��Ɋ<
bA��N4�Y�x���jSSL(��D�:�����Ć	z;ѡ��CC��i�����Fj��������ͷ/3$�u��OZ�����(��/�Du�µQvNa��b���#ć:!;K�PN�`
r�vyE�q��-GL'z�P�)/�̻���w0�u٘�D�����F�j�5���>~�J�}f��\ǯ4��vU]��\��ŕ�k`�ʈu\��H��2��W�MMv�|����ij 8��:~;�i��}��(8���uyhu%�\Kx���m�6��l��Ud�c9
�1c:�UɈNs�-	t@S���jH扥P�i��ƾ���O�cӚtr���U�D��G
���r��l�xƥ�C14V#��Vp	`jS	;�_�1'������e

D׮[ƾ9��o�׏ON�߼|��a�t��T��Vo���#�#h@����h�^��
>�0^O;(�?��S�a�td<Su�$w��z���)�a)��p7���n"��a++"R���۝��=瑒���	��w=w�di�H�N��A��[;UHt�IK�M*D���ݔ�\��3�rE������e#�
z�v�a���T��-����é	�W��O;�j=m�-+���:�^d)��A�Y�RhΥ�M+*���CS4��[~��Fu�.�Gc~-��b��[�4�誥	�s��>m�~�;r*���X�Uè���bS%A�^Y0����:h̢1�G��*�����,�+��}Op�P�U�|�8��E�����t�jB'�*��u*=V
b���6CGE�j�w��'�<R�A��*��{q��xP�"��gs��%Q���ESKE�B�ı�<�Mcl�i�TlO�fU��N;��P�*(T_�B��YF��ƛh�:�JO{!ɲ�RIR��[J��x4
꺀4,ߢ���B���w�p���<�ދ���4�^Q�F��ĺx�:*��<m#���Z[�~�3wj�Ƞ4GT�6��F���n�m�p�����1��?_0�q�>C�a�I�������:�[ʱ�Z�c�Џ��1�������D@I�W���J�w��>��{�؃�v��d��?T�.�l�S�L�Zy��\���kN+��]x�\����\}�vl9;�.�
ZS���Y_T���O�S˵�����^��xmP7}?|���gXY�f�髾��YVf_������jX�
����D�8�S7v��lx�5��v����N��MZ�n�^����Nk=�A�
T�VNG+�pʶ���i�cr=��cW�[���gi���V��E�۽�W���[�0��S�9/��{�3=۞_�~�[:8�|�
�S��v8�t��NV�;�V:mx[O
k}�f��F���+m��V}�o��1f��)%'�gT���xr�f���6��e�D�%"(���bbg�l��擂|�%9㕈��KL��c�N,��K+>�?���5��z�'��H�A����O|�������*���p�������7�� bت�
�)����sz�x��3��^��]K�����c:ͅ�a�hξ@�؞T�N(�MO�1Y�Ķ���z���&��rٛ�n�BM�;��4^ki��x�w%`� @E<����?��+E����|y��O��%�W������JF(�4�p��f�)v�YZ�)�������w���{�)���\&���y�}�CA���"�Q'q���&X�pFR_)pz��Q���=�Ue�?����b�Gl�$����g�u�Dr��3�T06��T����L�a3r����#��R���?<��`����s�i��b5%���޶��3������璏�%�
�xC1�P��?��V4��|��X�T+q]�J��R�
y�X���U���~i�(:P��)PZm��6r�kf�v���̈vd���ϬV�^#�׈�5b�kD�d�L82��4ͭd�	��!�@`^�y�1�ݰg���qw���nC!�r���"�ξ��wSQ~c:���f*�Ι�n���bo� �X�v��(�L��V�v��A���a���i%C}��X%�2��Q��=ܓ�9-����v�I���%���X���1����� 쮄rC��Ɍ�+=0�3E�|�7���;�	=
���q��}~cX�G/���9<F�,F�T�� ��d(B���V�
�p����H0ycXD��M�L2�z%{�L,��!����&��;�`
5E�{����v�BԂ.Ok鲸��p�p�2��\;!�M�0m���q������p�	W�p�i��(��}Rp=�j�4+/6),ؙߥ.�K}��ф�U,)����3 61��A��#:��q��tH�1�������ȯ�̤�>�2v�;5���{5k�M�
)��|>dC�_�=`ſ�3"�6���9m��l�p��=�z��z7�@�|�W`�z�B��A:���+-^E;ڎ;,�K}
�sn��u��w�������XG��7�V����I�&���TI49@w��sK,U�6|I&�+����@/_��ew����;�@o��^S��L0�|a�v���ف��o!�~�۩ڵjv���^KKS�O�M�ZN�M�zۖ3�✧x<	��|��V�13�أO�N9"�q�7ڞءZ��"�W�]��齸�[RTS!�	�j�lF{[�d��o��F�v��U�:9�f^�ƒ9�K�	��`����{�nEҩDzY��!�̆�佶g���lmϾ���Xǐ(Gv�M���k�<�W���+�ECj��y��Z�_�Ak�mIdI��NY�]ZO�F$��Ol|�4Yk �[&�J:�/*�PP
�R��F��!�u��P�{j�ԜcZU��V�]No�E�zd�������	�;3����$����M�Yq�6����NUO��clJ���gm�)�DRI[I�4ַfYe�_�95pߗ�[��a�)�R�S[�nJ:*����Y�m��&��탠����L\�km��!��ڳp��K�}f]l̀;��m5�|[{���l��n��5nw'���i����a�4q�F���n�Ê���;P��:�,��H`��}}F��J�/U��B�j�PK;��W��{)�#0setuptools/config/_validate_pyproject/formats.py�Z{s۸�_��t&�-�q{���<�����G�Ge��HPB�ב�m�|߽�H����t<�L,>�����(M2N�d�b���m��W-�r�i|��]�%a�f<Iœ����e1qs∫^�j�=�m2rN�9:�i|�n�#�<�k��r�,�+^�z�H3rT*k�(/����u��{A����ф|���^������39�NGg�Qf�����2���Եy<�����~={5��|��:&�?/� �8L~�hHݜ*���V���m=��*�1o�J3���^@?P�z������Ǎg���6ݻ�w�ywn���r�^�kFo,�������v)���?~O�%�'��J�N|X
n�z�^Ҹߵ]W������z��]H�c�ȧ�O:s�ߊϮcz��}ܩ"��S�J'��G�0������4~ɶz>P9�"��5�0���3+������Jm/�RR33>_�{�'m����W1�H�+�ï1���O������1<Zd�,!J{�(/��4dۑ˽u��",'q��Y��sǮo^}��|;�7����xtшb��d�o��P߶3���,c�-���?v�S���̇p�Qc�=���AA����l#9T��'u�+�
����(�\�2x ��[�����(˒l(�����!�#^�[����e�2!�"����~�Q�2Ԇ:5��HJ�Q�8H�[��'����nXl�~��}Qˑ˛.�Nc�u�P���1_�2ܶ��B��=]U�7n.f��8M��'��'nLX�s7]P�$ �
΅M4��>���4�\a�Q3V������\HXR"6�r��:�4!4�̫`e��21+��*�=��t��T�Ro7��[ȱ9��v�z�`SE����Y�9��zE���,���Gs��xEs�,���s���K"nM������hX�Ps�q\)����>C� �Gnv�`]<s��|�x/�����z���C5^m��I���[�D}rC�ڽ�ĭ�b�!HXh� 7��Q"Y1��^C�б�oc�g��HPĞ�N��6�F�S���?���'���4;��Y��&�����΢�/B�'N�$�/�'%����5��!�J�r 3���GjZ��*�
S���4d�4l���{U�)����t��I�����%���E�4t�餴���o������a�WS�R@C"Z�eyXwQ4rYhG���mMUdaȖ6��2X���,\��5�i><8H�;��l%.���0ԣ�A%�)(�\����rP�2
�сM�E��)OF���k�w�\|��-�k�Rp[ZDž5u}ijo��~73��;����L$�%�Y
D%z��`^���zؒoZ�O�ħ��\0g7�k7���S��Hg�A��
�S�Ƿ:����M(3/� `��x�n0���B���/���
1��O#w�!���y
��.��ĺxBn���͒B�AZ9g��J�4iT��d,��L�����9���[�<N�eR���>�L0��芥8���0��i���hj;�e��A�U��Th

���]��r��	����SrfX0����L�L[��#�3��|^�j�a1�c�4�̆�v-�P�����y ��L#���g���l(���o]u�-YjT���66Y���$�xi��W%&m�>ˑs�r{�/�
�2)�F~'`�<U�ڕ6�c���9��q��F���Ǥ���{+&���SM%������(ok�Z+��'"��4�Ν����yk�~>y?~s29��&��N��)�kEM�O��0av�Ƹ,5et4��25/�|J3�z������V��nٌ	Ĭwe�M~�F�,�}�,V&�fw��Q����|�n|���U��4e��ԭ��M�q�O�f�����,�BS�i2W-�H|U����݅1�"�,��:
�`��VsPe�][1YYC�B^�p�
�0�2P
����0���v^�f��#l�;�u�j�zT_W��)�yJ_��ٮZ�筍?�bY�+eu�ͷ�Z����Hf�q�I�'{x��I�u�-Bٱb�b����z��eS&�
َH����%�eLgC2�z�f9�t�[ϋ$����QL�Bj�ݠ�=B����!��^w��}��%I{P� dv%J�
�;g9��x���,*"�FK�)'*�{E������0��,���-z�&)21M0�?��K�|��yim���{���(;�{�ڿ��Os�Yt_\^�7ƏF5J�����|`(ݵ�@˄�M�,�,E>�)��G�["shvVu��4˖n!�F9Bb���z�f���7:�^�69�M������e~47g���{p�ֱ���9wj�����7�7�.��7�`�o� �!�^��|�廋�O���˛}�҆�֞ѥ|x�
��{g��3��f�����r4��Ŗ[�������cB�N$g:Q�6�L����B�-�x3V�N���˟����ۥݿ��&�s�j�=α��,�c���)Y����ʝI���p��C�H���vh��"n疪|�2:���f�����1f"�#e
N��"��Ѷ#�U\�03�T�����pN�:��=�������tUd�&g��>lhj8�!�S�;�V�S}��yᖝ��Bk!�#tm^`�F3P�������t͖�4�ljr �����t��ڙ3oS7F�reg���@�
!�S��}\m��PK;��W�㢮�	setuptools/extern/__init__.py�VM��6��W�HJ�ho
h)�� H�^���J#��D2$�]���)J���T������|�R�F[�d��S3y9�ⒹٝN�vα�Au�>�
�?�>��9���>���~��{6��]��^�W�N���K��0�o�<��h�,0%�d��T�����,.�Xo�Ȭ֞+1B���t�3Υ�����כj����=�Uq���^+�bX�u���
(W�AQρ/sauςމڻ�`�˂De/�CUԬ�Q��b�?�
X?��;��r�~~M*=�5,�u�a�R�I��pL�B���.�,a���fES��ŮJ���(|{e(�X�~��1�"/��'$l|��^���Ƥ[���}����I8d�b񰾢1�zI�,o��تgӡ��>2�:���(LQ����Y�k}�U�e`Т[��͘��H�1���T{�w�6���m򊰷��?)��6z�¤��X��A��s.��-�zAy�8sPĶ;�TL&��욘V�G�t��뤘?�-��K�o���Y��������
ap��XA�n�Pοa���cN�)�E�[�2Id�[v>�)mG���T��Ӥ:��D�(LPNS/�zbā;XA�YX��f�Vn��X pv{Ϻ��[�4��sӓc�|���:���˸���9�g��u�R�@���P�	�����9X\��B�V:�8!�tg.�sn�쳏�5�&�nI����O�h�� ?���tr
l��F~n�����]GN�m�*��V�.�˙���1�,�K��pH���;�w�>LS1`���f����%�`@�f��U��c0��]�̤c:f��Ffuh�Y�y��x�X/.1���t-�wu‹��4樅�a����)�huZ�٠��{�WV5��A�:�7���:r^G*�
}�Lp�Y/M�Wu�PK<��WSE�O�#setuptools-69.0.2.dist-info/LICENSE]QK��0��W�rj%����g�J02Φ90��6���w�d_���<�׸��Ņ�.@o'{z��T�Ѷ	t���;h�z:���z|����)�nt�jh����f�&�.����ru�q5�A�b�XG���`|���U�@���km=��fo#���9�dC�\C	.5�ܒ����.p6�s9�& �	\|�:��%�u>
.�	���Os�f�fcGBa�~b�18�d�p��ʕ'Zto��|M���iDI�`Z�'[��&R��;?�F�?������'��.Y�x0��V�������F�'�8꺑՟�L$">���_����	�3�ښ�d�V/2)�x��*��4���
�s�^�,���R����ܕ�ؓ�&ߧ�x�5�
e �;i��( �����dX�̥9&l+MA�[��Cɵ��}�5�{]�J�|���,�U�N�	U���2��$��k�U�|�d*O6���u.�Rj�s�K �;�,�B�h�����q�6F��blTa4�	���z��H�kY�U��
�霈P	�
qg�S×����x'�T��*����O�PK<��W"aPEm�$setuptools-69.0.2.dist-info/METADATA�Xmo�8��_�+��I����n/�����m�n��b���XbM�Z���3���N��n���8/ϼ�Ï`y�-�����X?8�>�F̀-��4�j��Y��ޤ�2����FȊ�j�K��#6-���˥<be�h��y�ʼ��n+���<������/�q�Rk3
�Dش���¢*x��Dn=j��:)"OX� lՐ��q!G,ƖVH����pl�҉w��w�����͈]��� �ܢ�G+ k�	�
��.R�' U�(�!�>���F�*Hm&�C�T:6(��t{��� IL�%���w!�1b&�p	T^�w6A�a�2�!ʸ�Țp�To�]��b�Z, ���a�-�An���5;/
�Ȋ�����[,�C�e�tPI&�VAç�s�\V[|_U!"Z���]r
[���Z�ِ�#�T=��(BD�m�=�U?v�1J�j?�7����B��k�#�n<N�Ƶ�!�8n�/�>M�(�"F�(~�"���|�U�!��`U��8�C�OD��c���_�~�&�w!��5�TP�
��,<ͧ�
��砑�88{�cVj����mg�=(��:$'O�UB�f��a�~`� }[eg�3�ffWz��U�cY��<4�9��y��b�[����,Wv��<vm����?�0?�Yc��7�R��x�0N���6�{E+~�B4'����'X!�&�c��L�9���^�׉~!�-��|A�7��ƷLd7SDA�ς�N�MQ  ������9j
nSך��vǍ��^��[T��J͝����������oد�wd�=�S��I�K�O�Ƴq���T	vI��쯘=�6���.�m�<��cE<*�E��\k�Q����E��E���ݺ��o�lI]j��o���m�KM%w(Ј�
�{!9�0:����w"+$����oc�O�Ջ�٣�����*��w8O��j�ԉ�#0j“[�����'9\`/��'�T��TFU��sm��lF��$q8��� `"�ar=M�,	L*@Ɔ�1�D����"�c#�uv�H�4*�E=�mΡ]U�v�P�>	��'�L��	�XNy��A��n*4�(AW�V����~߉�_'�K[�,���y�PX��K-�-��ˠ�R�t���v���k�gʌk���>!��y�s�օ�~���Vƞ0�Ӡ%�FPM�����ku���e�gl%��9~�ur����g��ǜ���-u����6:�nF
�#��E�{���n3	V�tV`?�js=�˽VO�J��ې�-��cl�a�n'=3&h2�=�Q��'z�PR��2�S�^`
-�Iҝ��}�ډ���a{�9�S�ݫ{K�)�G��ݿ��CXi�;�J����O���Vfcʅ���g��qx�����7������x���!o+1�=����N�����wv68y}����Z��Mf,���o���^t}e����ڞ��M\�����������7|�7l!���DO3�Qw�ت`H���^>�ǭ�G4Y׊����$:�M�̤��1���f��(����r�l/�ٶ푞������L��Bi[�S@$^�.*�C$N��e�B&T&,-�p�P�^��,l�t',�4��<ע�[UNׅ�x���p��T��i��<�5Ze����r�9M-6s�a�Y���L�!G"�Nj��gJ�nD���� ;ha��Ps��[���˫���.>��v�5�����;WdN�����.$M,��������^M6�;�6�əE���?]9nU\s/
	��ѵ%����%ڰV��'���
2��/(݊m�t�{�V���ǰJ�w`�z\�,S���_ۻf�qWv�"�\$�����PK<��Wo��4\\!setuptools-69.0.2.dist-info/WHEEL�HM��
K-*��ϳR0�3�rO�K-J,�/�RHJ�,.�/�Q�0�31�3��
��/�,�
(-J��L�R()*M�
IL�R(�4����K�M̫��PK<��W/ד�t
,setuptools-69.0.2.dist-info/entry_points.txt�V��� ���͡�!�V��*�{�*��I�����;`C�e��c��f{f�}'�pn����%\
�^��8��Z�]�h\I���uj�i�&�5�-	�4[���*�Ѹ�4�J�lp#No椂w�%B�fk��aKa���6��	��N⩅:�
=�4[��r�K��*�� �	�	�PS�8t~I�n�P���h�1�7�l;ȒE�7��jqZ�Y�Z+���ĂD��j�=�kG��q��'�4ą*��D�JFz�1:n�C�_@hXHo���t[ɳ ��&d�5Q�N0\�
������i�9��;�3�PGda*��`��{�£"��j����}���J��V�0��Fd���,I��;��_/,ԣEV�Cq�35x'��~��p�p ���0JU�)g����6���V��wZq`�X:�8.��*g�mm#�J=Aw�X6y��Q"�~I�����^Yau��q�z%�9v����9~X�^٧	��ZL�b#������������g�4
�e��|틚=�����e'?�/���("k��t�T�Ǟ��6L�?��娈s�7YHBaI|`+�0����a8�q�7���Jq|+;��̇56�Ŭ3���e?S
�?PK<��W;���*))setuptools-69.0.2.dist-info/top_level.txt�A
 ����0�PP\�3�z�9�.1J;\��A{�#�PK<��W3��s�%\Z"setuptools-69.0.2.dist-info/RECORD�|ɲ�ȶ�}�V����A
!�$:!�	F������F:!EDVƭI��ik9�Y۷�f]?�Y�MQUA�O7]��׫\e:�Y��0�흒o��=�=�|'���Y�����
�tS/��u�*�]�_���<���9����V�K*#�v+
��ED�#�l�
S�7���mFO���v���
�A�[��OcSo�3,8��Q��O=T.�E������zh��{�F@��Z��q��
&w���9��L�ˉ��~6H!(�s���n�a�ĖS�+�3���4�F������`:{$Ն��?��s�U���겺���ff7��v
�`�V@�T����{�:72s�넧7$��%k�'X��2Pq�]t�m�9�y���$��t�G�<����Y��m_d�� ���Sb�.%�K���<�P^H�a$s׀�8���@��y���Q��e5�
�6F_�
�$�=�^jN��en���y᜝��6(~c@ߣ견�'��Ƣ��������r�M"c׭:��P֥9}���7��";��Ŝi���p7�a��r�n�N�}ߎG
��e{��
L��S��]��x�I�
оssi79i��EmA���jZ��δ�����"J�`~�/����I����	��v(��մw�Ƀ~��ٱ7JB���'"!ha��=O�#�P#���udjo;<�w�gy�.�~r�wD��՗��W�w<m䅯6�8]�ݼ���
9�z��}	�K���ח�z��w4�
������_��t]��2�����.%���;w�}���8h&�D70F|r��zA������uկq�	|,�����P<q�|�Һ�x���Ķ�G,͡��kzC����
�zM�M����|�m4�p3Z)L�T�C�Sf��ܚeA��X��]
$�wA��t�X;��0p۳�*�2�E.���4������/��T^�3�[>3L�N.��(+�ռ��P�i�I@ȴ���O�3O�� �e�%�a�T������p����Y�
�#�ZyDo>&�/<���%��a�2L����x�;M~�1���|���ѱ�o �>��{�??�w��e#A=Ų���4oDU��|�Rd��rIҙ-���!�S��B�0_(V�5ѳAɄ�
��R<�Jz����wTs4%���M��W�G��ܲ����5�D�=-q�m��R�#s�
����H���mM�� ����9�*,�d�T�9�
G+�ΚBuA����[Mehg cq�1�f��r�W1�)R>QDEg/2��#)oq��m<�����`�3,�>����j��p�A`�'>��Ȫ�,��}�匒	ȫ}�C�L��)'�B^�E�.��80���>��3��_Y�Qɉ�t�
��$��L��䔰�R'���M���ßD�K�]�>QjΤ��:!p�m���Ұ�'��k�1Ӈ�%ث>�����v��}��R雇����jB��M�-.��kG'��ǐ�8��Σ*[^��+�ޟ�T���n��
L�E��g�/��	1���������^��f����/7���R���C����$L��M�c%�?E�'��_�t�=+�+wO�����7�GZ�� �|l&Mx�*Z�~�D��ꓲ���?��Bo�ې�QU��V��e�3=rR������A�a�v�g
�8T	VW$�]���8{=Gnn'wr�W�ٹ���/)7����p����v؞�6,q�������E���4W:�Y��n:B,���Sd�D���4H�'~+��m�6Z�]���
 I��|X���`��>�8�s�Zt#ا|��Z�?��'
X�#��V cP~�3c�t��r;"�[��q�����
�����}�f�A;6'�knYҦ�^�Ϫ3��1�ms0�5��&?o�+O�e��ѱ`�����R�b���n�#EM��c����[zA�ǰ�L�Ua[g���-��v�t�H�b�œ�(
!� �L_a�|͉�Ggai�'�:�|B���TX�A�\鳻\��C��3h檐�������P��ټD��h�/�,�b�/g+��t՗'�'��(��Is�
�6�g��H@y&��9*��^5-�8��ZWq�A=j�՚��,��Tfk*ɣ��)�c�x���Kn�ē��Br�
���3��]�ޡne��4�Z���dU a==�In�S"��U-�m
/���{�4r���2n��<�l���Q_=�qU�V�|��W�M9o; $7��3{���)��Pjy��t�j��Q��.��s��Sq�ʉ�<����9bkZ��Yv�`T�T���!�.x��7��"�HE;e'N��~��uI�9pA(�����������ݦ�^��}O�����C8��8 8d׈��:�Y�l}?R�U�����V�OP�
%<(�Mc���BQn�l����ę�dx{��1������sv2���WP�s�#�J
ýr-`gi���פ��ky|s/�8tbIޟ}W�w<P�N�`rR�2� �d!�z���Z�F���f�����)�r{�oXL.��J6
�ǁ�2�Ѳ>�A��t��v7y�q��4��=_��g�#;��3"V���Eޣ�x�Z���Ҫ�`u��S�N쑂;1�.$Z��Y����*'YX�<>cym�fc�>r�s=u>�ϛ5�I����o���ә��in�@�+��b���oF��G�}�@��B�r7�KAͽI�䑴k��E8�p�e�a�|]`2�ɶ�|�:����v�UEa�(Nve�l)]r �Gt������O�1�s�d�
ĝ!8��YJw�p�
�A�e<Bj��0�%"�Y<���r�=�[����y7��j�l�'��Q$���a %�>_Щ��r4F��Z~�c�g�$�&�ȫ���!�5Z!��rԶ��
�i"^�%� �&�=�Q���N�<7u�
I
�Ѵ�8�e����[n::TG�aszKβ
�h.�e؆�m]�Ô^w�z�����C��<�Vz�Y�롖��0 ��ć{?����]�kȪ������	�,Ǣ�u�*rtopq9{�!P�И@єQ_%��7T���^f�t����oÓX:+��1E�6�����.�Qh��Ћ�u��O`����`����.Y��/)��̖�]}��N8׫�C^VV��C�?��U��D؁Ns�%2#}t[N��n�-���z�B�J�^kS
|E����rq>NL���OM#

��
���n����	�S�d�%ȗ�^v��%��{2M[��,&1���8�C�p�Tƛ�+�
��/�VyeԭB��8����8S
�y��%�v$'/O�G8�Ԛ�-�A7H�,�ߢ?Z�w=�]E�2�<��]Q��DjI�\�6甌E����qr����^͌@�7-��O1�[�a��6�{!��f��d��H9-�"��A����Vm�����+S(�;�܇����E'a$P��.Q�z��t英tA�5���0�����)�l�ꋺ���Y��z�7m_PK��4�io7h7��&������_z�ɢE���w��T��b��� 	8�N����U�u����|Ԟ,�j��.c�~oo��N#웩F|ŷf�AvApC�/a�[�j�
[���u_�#��ݑ�ju&�d����Q]������/V�ݜ� �-��Vh�Z���%��#�
.خA�zk�����>�Q�Ť����Ҿ�*�Pz�
:p�^��uO�[F�G�$nH~ٺ���
�CO=w?n'nw�9����p1 .�nǩ5��u��Mt��maC�ʁ�Z��n7�t�Z����Ѯ�{�~�۴'��I^�]D�GB�6�k�}�5T��62|,��$ੌ�x�!ߑ��V��5��L�`�q�����eIŢ��T�A�.��Dt��}���ɬq�
D�'�5�?�.�N�a�+μ�zn�޶V�W�w�9Kz�s�pF������[�m#]��c9`����6��4m��L�re�Jl��^������g3@ܭ��M�+�Tt�i����b��"�����x�Xv��w;Sb�DO�Ew9���\��XT9LO�J!�10���m��?(�C/
�G��2.��e�\(�UӅ�V�y�h�oH��?��AӼY����-�E�]-Gj�Q����a����9r?� Z�Эᖀ?��ۘr볦�i�Q��8l�v�zhB�C���
u��ч�A�O���il�a�fYW��y<�� ���i9@m�L���#�����à���ٺ�V�z�L1$��^��	aĞj�
�d���zl׊�+�Of�6��Ո69Z+$�ޕl�<	��LU;P�m���ɷ7�=�Q�d��v9eF@�R����Z�<�z��$��.��c�\|]"WqQ�]#x�\l/���f�xoN�IE$傸IE<@���{$�O�����K��Nçb�s�6'�ʊ�:W|��2/��s��o��g�
,�`]2�\8���U �`�l"�r��l'�/��R,'ِ�GO�R��:.G��T����3��b�!�;mW�0U���A|�O��Mi���T��F�a�.x�bI[��.�
\������@��\�O�JفF�ڹX��k'��
��$Ӕv�"l�dJ>��;��0�)��^�n�u�%�u�A_1��a��~G�!dKf�wT*M,6)�;�
�>-�Ѣ�z�K�����Al���~2^���S�v�Uc���Zx��'�~@���ǃŒ�I�rEl�t(�^�7b�x���(���P�j��}�~͉�����Z���Tq
����D���.q���G�২��-��`+��,�ePQ��LF�d��ɀ�gs-:����H�;�o���y;H��Ub�:
0�L'pĔL��,�2���Ԉ`ħ��7=qI�|�'�� 3�~{�S���Z� ���&�g�*��M}���/&�tsj���(x��頦\c�e1x��p�s?��ZqM�~��BA�� H����7ͼƬۅ
��u�~6���>B�'��������;��V(y6��6C��M�_���Č:Ĝ��H
�t���'�޶�$�+D�}vı,o��͢�r�)�A>�"آ{� �iݏ��wV�Ktv�{Aزk��y9nG<8�ʝ�����>|�Q�O���������]�N4��,ۊz�2SȔ=���ݧ-
&��[�S����B�#kZL�n$�e������������d�u�a
�䕿#7mf��?�y�'ԩ�wg�w�X��$��A.8�Be���0��2�i����]�zӡ�C:j�H��7��K�C�E���R����}��O��'A�ze4�m����Mu��,��=�0�@�x�w4�w=S��cן��~ԋu��T���5��������=9���x��JN����Z�O�z���'��wá|�Lۍ���]���kL��}'I��
;w{ue�<�a��T=��
�t��h��B��|@G��r�^��Fm�Xi�Fݫ���T|k��^#�g�;���9�o����ƽ�,��8��1�?��y��|N�%����ǥ�O�[�����%��Ih����2R�����ٲD�@�\���m�'9^���6)nA;��̈K����>�p��"֘�*n���g8��K���-\,�v#�a��g��r�̒78�`}���5_�
�!E�ſ/z����yj8���^A�j���|\�qzn�U��5�8�Y�ޏ�*H� vpB�g�u+;�s��u���r��vym����=����G��'|y�A�`�	�(Fx��>���݌M&�����~����ϫ�bԏ�ᛌ��ɜ���=/
��\F�(��~g��V�5�˳�[=~��~���3J]�)BE�=��KhC=~�n�C3�8u���1�\?��#������{�ӽ�~��u�ka�os{]�[D�S��7ޫ>B���t�DI���~bbG��o�N>�	P=E�p���CK�*���4�[�ae�(�2�߼=50�gZ��woh(�8k^ee���a��}S^����䏒�D��dD��粿�pu���*��Ì��@��Yv$5W{C��*�+ɷ~Xg��Ņ�r�v(����h�f,u�*��G�����N!?:�UQ��@�>�dbآ0�=�.ڠak;��oP���r�1��i����(Y�"�nd~4h�Ox�����Q[+j�՜�����|�L!?��?(�/Y��_ ��I_8�uWη;X�'�>%P�
!���5X
��.
MQ{�����Xj/ݦi���{���4g	Qz]�{EB�W�M����_6���nW��=oG�{l�D8KTR��~�U�˴F����^���1(7N��1W�����4�2����W�$�&uZ.�ʇ�{ms�R��$�/�h�
�_�<�x+.U�;�ľs)�F�X�vw鼟�ߢ���}p��A)�g���d��>$��@8�@�&����A�ŋtI@)�tnp��70��?K��Z�=��八I��`h�X�g���3z���z�s�CCk�j��ϓ}	�>���ٝsC��.��� ��G��_��asLŨ�("������u���0����B�Ftf�z�@5%KEG�$��� ��&����wI��u�d�=
�a|�k*�vFv�c�ޭJ��V� �ӆ��}ĈE����sᑔ�\}
�W]H�ETy �|+�h�珇z?�Io��K����ɉ�H�h�:��Q�Nd�F_8�O�~�6��o�2�³�.��p�.
"q�[%-Y��_�~N�H������1A8��4��M�w9~���2�������Á��N�,ӯ�Y�>��L�p �'Y����/�I�>���W
~�������O����0J�E*-�m���^���`"�0-�-7n�o�6��V�`���bԶ���&���T�Ho�;��:q��g����F���Dg�1�DD2�(�-.��]�U<���B�A��c���q���������2n���3u7�Zp}3�������B#���g�"�����~-7<�z-Y�D��瑶�V���-��� T�|r��*ω�9�_?~8��R�v�|˦���s)G1eGO�FM��Yn�`�q7co]��S~�D�so^aZ5��M�ظ�'�J�ak�ij�����F�_:�}�_0�}�_2��_1�}�_0�}�_3�}�_2�]�_0�}�_1�]�_�~��wI~��w9���w����w���޻���,�w��꓁�[JP~�!]e
1��� wV9nu���!�n����	A	p�G�4�!�:�vX�W�E�@l�zr4�����[y�;����k���s���G-Ԗ��8�F��8LD����\30���{��;�×^�%��=l跼�O�m)
��C����歸4��!�c�3�W?%���@�Q���{*�qXKD�^vN~�'>O��/���~�q�;��42CmM q<*���σئ�2r�v��yO*����w����^����͆g_��LG�v5���ޏ�d��\܂
��;h�ȼ�{Դ.Z��{q]�s|�O��.�s�\mg�g��a��70���]%��)��� Q�0�uŸ�8��s�V��ͱ�!���<����{}`�p���6�7?>��z��X�W�p����̷�kT��z����[��r�}҃!0ޭzf �	N��ל�RJU2/-������
_���c�,لV��A�6V�;���x���K�&�W�a���~��Zi9���Ҽ�ygG�[�����Aʏ�=r-�ˍ�wZ��3Fݘ�/f��w�$���q-G���c�-<v�\�*
�ߚX�QQ?_�mJ�+�8�ގ�R.˞)?:Xw�Q�43Y�����f
_z]7N9ו�����5�d�ѷ$P��'4IJ�фo�^��?p#���o���Pz}(j:b�|��Jv���GK�ն��������ٷ~�Y�E�~}����I9�8���}�����W���w�I��`���k�@�|��m����,b�1[g��@9+�V"\~��C����~���z}������I��&�
,�˙XM;i.=��3G�:m0��U|�/�4�-[�kX�s.�uY"&���d�`�N�4����Lx�y���=�D�L�f�mpt�ឳb�ő���(:P;b�))ֲ�$����h��g�X��s�
�r������z3����U8j���[����W���S��_���I�{q�fˀPdA -��q�3M��,�HV��;l�s�/��i��9��[���e�Ui<������er�-����fd=�|�}���_�c���7�,*�<Qph�v앩:'���n��������ycT��piЊx�E&Y*��f
�9)���յ;�4ܢ5p`�Q�4j}@��nh�L��(�?J��g��F��w*X��6ė�zb~}��^��ȓ�
*�|�����]����~�>�+�짵6E���G/�)[��&v��9
���u��@��7L[� \��6�>��A~�D�.��3b[�K�����b�)2��g����۵2һ���ϘnX/2B<��e�-W���lCJ�@��>�?K�t�<\��%=����R�c��X!�itE� k�q�p��N7�
X���h��k�b^�\���(�B�"���d���q@��y~œ�cSs�l� A���1:aL���"�7��<[ml�y��Th��
􍳨�Qf��ō�Z����nݟ�<�T��.�l���A�
pf�GѨ����e�����~�/�E�u��[�*3�`�¬�hg4a�k�*!u�^%6�@�z\��ZhG�C�lK1���
�6�u��wxvE\�٤�Z���6�@ �P�0���Ώk����̶�^��:n�Z�ҥQ
%��;��Ȫ0nR��8����޷���
>�K�ġ��g�9Cy	V��s�h���e�v��SW{��ޝ�;���k�R�)��VQD�7�J��1#�����cܺr��We�ԁ���龜�A���϶�v��`���9�����D�%�|,::�ALV���u�?{��?�ὤ�]�� �)lN,�5� ��R*xNO�_��p
z�~��X�]q�z���k�s
0����0�Zl�-��!b��nP����������7�C��I`9I���k����|Վ�����"����a��Ts��r����"w����v�"IW�Pc*��	֗�A�_;A
3A'^l�Z9m�U*������9����/�H]L�T�D	��LV*��ߊ�>jݨ�1HP��/)d�m�|���/��;��Sh�.���%T�q����E��U���;%YS�[<J�g���O5�&q+���F��xuO$"���>	�M6/���9V>o7����PK<��W�}a~���distutils-precedence.pthPK�uW{j�������_distutils_hack/__init__.pyPK�uW� ��.,���	_distutils_hack/override.pyPK�uWK���Bt���
pkg_resources/__init__.pyPK�uW!���~pkg_resources/_vendor/__init__.pyPK�uWIB/OI�8*���~pkg_resources/_vendor/typing_extensions.pyPK�uWB�q8u
� ��j�pkg_resources/_vendor/zipp.pyPK�uWoq����5���pkg_resources/_vendor/importlib_resources/__init__.pyPK�uW���'t�6��A�pkg_resources/_vendor/importlib_resources/_adapters.pyPK�uWþ���Q4��	�pkg_resources/_vendor/importlib_resources/_common.pyPK�uWa.;�m4���pkg_resources/_vendor/importlib_resources/_compat.pyPK�uW��h�t7���pkg_resources/_vendor/importlib_resources/_itertools.pyPK�uW.ev��
4����pkg_resources/_vendor/importlib_resources/_legacy.pyPK�uW۴�L0��(�pkg_resources/_vendor/importlib_resources/abc.pyPK�uW2����pkg_resources/_vendor/importlib_resources/py.typedPK�uWUKa�x�
4���pkg_resources/_vendor/importlib_resources/readers.pyPK�uW��\
3���pkg_resources/_vendor/importlib_resources/simple.pyPK�uW(����pkg_resources/_vendor/jaraco/__init__.pyPK�uW
�x 3	$'���pkg_resources/_vendor/jaraco/context.pyPK�uW�/��5�:)��Kpkg_resources/_vendor/jaraco/functools.pyPK�uW�.ɪ�<-���pkg_resources/_vendor/jaraco/text/__init__.pyPK�uWt�lOp�0���,pkg_resources/_vendor/more_itertools/__init__.pyPK�uW��I!+1��z-pkg_resources/_vendor/more_itertools/__init__.pyiPK�uWC�z��@,���-pkg_resources/_vendor/more_itertools/more.pyPK�uWV��{k
�N-��2�pkg_resources/_vendor/more_itertools/more.pyiPK�uW-����pkg_resources/_vendor/more_itertools/py.typedPK�uW�i�cHc/��5�pkg_resources/_vendor/more_itertools/recipes.pyPK�uW���>��0����pkg_resources/_vendor/more_itertools/recipes.pyiPK�uW�=64�+��#�pkg_resources/_vendor/packaging/__init__.pyPK�uWb���+����pkg_resources/_vendor/packaging/_elffile.pyPK�uW�"r&`�"-����pkg_resources/_vendor/packaging/_manylinux.pyPK�uW��}�	-��q�pkg_resources/_vendor/packaging/_musllinux.pyPK�uW��i	�'*��9pkg_resources/_vendor/packaging/_parser.pyPK�uW0��`�.���pkg_resources/_vendor/packaging/_structures.pyPK�uW�sw)�-���pkg_resources/_vendor/packaging/_tokenizer.pyPK�uW�M���
 *��
pkg_resources/_vendor/packaging/markers.pyPK�uW��VN�
@+��!pkg_resources/_vendor/packaging/metadata.pyPK�uW(��A7pkg_resources/_vendor/packaging/py.typedPK�uWDz�8��/���7pkg_resources/_vendor/packaging/requirements.pyPK�uW7��]3!&�-��X<pkg_resources/_vendor/packaging/specifiers.pyPK�uW�=��m�F'���]pkg_resources/_vendor/packaging/tags.pyPK�uW�*+$�(���rpkg_resources/_vendor/packaging/utils.pyPK�uW��x�?*���xpkg_resources/_vendor/packaging/version.pyPK�uW���2.��+�pkg_resources/_vendor/platformdirs/__init__.pyPK�uWZ�7�f�.����pkg_resources/_vendor/platformdirs/__main__.pyPK�uWR"�si�-��9�pkg_resources/_vendor/platformdirs/android.pyPK�uW	Vp�.)���pkg_resources/_vendor/platformdirs/api.pyPK�uWK� |_
+��0�pkg_resources/_vendor/platformdirs/macos.pyPK�uW+����pkg_resources/_vendor/platformdirs/py.typedPK�uW	-\��*��@�pkg_resources/_vendor/platformdirs/unix.pyPK�uW[є{p�-��J�pkg_resources/_vendor/platformdirs/version.pyPK�uW?�ߖ��-���pkg_resources/_vendor/platformdirs/windows.pyPK�uW�zk���	 ���pkg_resources/extern/__init__.pyPK;��W�޴�
�#����setuptools/__init__.pyPK;��W�=��"����setuptools/_core_metadata.pyPK;��W�znJz�����setuptools/_entry_points.pyPK;��W�9�	����setuptools/_imp.pyPK;��W���D�����setuptools/_importlib.pyPK;��W�T��X���C�setuptools/_itertools.pyPK;��Wٸ�Ըv����setuptools/_normalization.pyPK;��Wb)�� ����setuptools/_path.pyPK;��Wa�1��`����setuptools/_reqs.pyPK;��Wk�n������setuptools/archive_util.pyPK;��W�|,"�H����setuptools/build_meta.pyPK;��WD(��T���G�setuptools/dep_util.pyPK;��W��k�����setuptools/depends.pyPK;��WgTOu��R���setuptools/discovery.pyPK;��WP�Z�'U���K setuptools/dist.pyPK;��WzO��m
��AHsetuptools/errors.pyPK;��Wu=̕���MLsetuptools/extension.pyPK;��W`E�Q���Usetuptools/glob.pyPK;��W>�T;}��"[setuptools/installer.pyPK;��W2S��,���bsetuptools/launch.pyPK;��WpS��0���^dsetuptools/logging.pyPK;��W#���c����fsetuptools/modified.pyPK;��W�t�O����Xgsetuptools/monkey.pyPK;��W�O�&>���pnsetuptools/msvc.pyPK;��W����c����setuptools/namespaces.pyPK;��WĔ��+ɕ��X�setuptools/package_index.pyPK;��W�����J����setuptools/py312compat.pyPK;��W c(3�
8��e�setuptools/sandbox.pyPK�uW������8�setuptools/script (dev).tmplPK�uW�3��j����setuptools/script.tmplPK;��WT+�~�����setuptools/unicode_utils.pyPK;��WRp�l���j�setuptools/version.pyPK;��W����q��	�setuptools/warnings.pyPK;��Wi���d
�!����setuptools/wheel.pyPK;��W,Ev�����setuptools/windows_support.pyPK;��Wr�7��g!��2�setuptools/_distutils/__init__.pyPK;��W�)L��%��S�setuptools/_distutils/_collections.pyPK;��W�r��#����setuptools/_distutils/_functools.pyPK;��W=&-$+����setuptools/_distutils/_log.pyPK;��W]�;F��&���setuptools/_distutils/_macos_compat.pyPK;��WI�z��k	"���setuptools/_distutils/_modified.pyPK;��W�AA8�L&���setuptools/_distutils/_msvccompiler.pyPK;��W��GJq
|!%��@setuptools/_distutils/archive_util.pyPK;��W��Dc$�9%���setuptools/_distutils/bcppcompiler.pyPK;��W��T�3�"��[0setuptools/_distutils/ccompiler.pyPK;��W�2���E��ldsetuptools/_distutils/cmd.pyPK;��W �S�/��4zsetuptools/_distutils/config.pyPK;��WTP���$��2�setuptools/_distutils/core.pyPK;��WE>����.(��0�setuptools/_distutils/cygwinccompiler.pyPK;��W_�H%u���Y�setuptools/_distutils/debug.pyPK;��W���]!��
�setuptools/_distutils/dep_util.pyPK;��W��S��
�!���setuptools/_distutils/dir_util.pyPK;��W�?~94����C�setuptools/_distutils/dist.pyPK;��Wd�X�����setuptools/_distutils/errors.pyPK;��W�~&
("���setuptools/_distutils/extension.pyPK;��Wڍ� ��E%��m�setuptools/_distutils/fancy_getopt.pyPK;��W�oL�
 "��|setuptools/_distutils/file_util.pyPK;��Wqq F�5!��vsetuptools/_distutils/filelist.pyPK;��W9M8�����!setuptools/_distutils/log.pyPK;��W�!��"�u&��A$setuptools/_distutils/msvc9compiler.pyPK;��W
��]�\%���Fsetuptools/_distutils/msvccompiler.pyPK;��W(��#���`setuptools/_distutils/py38compat.pyPK;��W��{�#���asetuptools/_distutils/py39compat.pyPK;��W��|V��
��Cesetuptools/_distutils/spawn.pyPK;��W��Q��I"��ksetuptools/_distutils/sysconfig.pyPK;��W��olG5/"��Ӂsetuptools/_distutils/text_file.pyPK;��W>P2��<&��Z�setuptools/_distutils/unixccompiler.pyPK;��WƜ�`U�F��r�setuptools/_distutils/util.pyPK;��W��Yn<�2 ���setuptools/_distutils/version.pyPK;��Wa��U)��|�setuptools/_distutils/versionpredicate.pyPK;��W)	���)����setuptools/_distutils/command/__init__.pyPK;��WSOV��N2����setuptools/_distutils/command/_framework_compat.pyPK;��W���� &����setuptools/_distutils/command/bdist.pyPK;��W��y�9+����setuptools/_distutils/command/bdist_dumb.pyPK;��W�4���U*����setuptools/_distutils/command/bdist_rpm.pyPK;��W������&���setuptools/_distutils/command/build.pyPK;��W�5��+���setuptools/_distutils/command/build_clib.pyPK;��W�z�l?#{*��setuptools/_distutils/command/build_ext.pyPK;��W�!~�S�@)���3setuptools/_distutils/command/build_py.pyPK;��W�~Y�.��7Fsetuptools/_distutils/command/build_scripts.pyPK;��WY��49&���Msetuptools/_distutils/command/check.pyPK;��W��
UT"
&��Tsetuptools/_distutils/command/clean.pyPK;��W@?��m3'���Wsetuptools/_distutils/command/config.pyPK;��W�kf0��u(��[fsetuptools/_distutils/command/install.pyPK;��WSFf���
-��z�setuptools/_distutils/command/install_data.pyPK;��W2��L�
1��G�setuptools/_distutils/command/install_egg_info.pyPK;��Wi�����0���setuptools/_distutils/command/install_headers.pyPK;��W��i�	� ,���setuptools/_distutils/command/install_lib.pyPK;��W�	8��0����setuptools/_distutils/command/install_scripts.pyPK;��W�>qp�+��!�setuptools/_distutils/command/py37compat.pyPK;��W��
).)��ڞsetuptools/_distutils/command/register.pyPK;��W�5;˪ K&����setuptools/_distutils/command/sdist.pyPK;��Wz����	C'����setuptools/_distutils/command/upload.pyPK;��W����setuptools/_vendor/__init__.pyPK;��WD�*�;!����setuptools/_vendor/ordered_set.pyPK;��W��aLBmT'����setuptools/_vendor/typing_extensions.pyPK;��WB�q8u
� ��*setuptools/_vendor/zipp.pyPK;��W6���g1���(setuptools/_vendor/importlib_metadata/__init__.pyPK;��W
�h��	2���Esetuptools/_vendor/importlib_metadata/_adapters.pyPK;��W�����5��Jsetuptools/_vendor/importlib_metadata/_collections.pyPK;��W"b�SC0���Ksetuptools/_vendor/importlib_metadata/_compat.pyPK;��W�:oikO3���Osetuptools/_vendor/importlib_metadata/_functools.pyPK;��W�:���3��?Tsetuptools/_vendor/importlib_metadata/_itertools.pyPK;��W�����.��lWsetuptools/_vendor/importlib_metadata/_meta.pyPK;��WkA���J4���Ysetuptools/_vendor/importlib_metadata/_py39compat.pyPK;��Wx�v.���[setuptools/_vendor/importlib_metadata/_text.pyPK�uW.��_setuptools/_vendor/importlib_metadata/py.typedPK;��Woq����2��i_setuptools/_vendor/importlib_resources/__init__.pyPK;��W���'t�3���`setuptools/_vendor/importlib_resources/_adapters.pyPK;��Wþ���Q1��Resetuptools/_vendor/importlib_resources/_common.pyPK;��Wa.;�m1��Imsetuptools/_vendor/importlib_resources/_compat.pyPK;��W��h�t4��^qsetuptools/_vendor/importlib_resources/_itertools.pyPK;��W.ev��
1��:ssetuptools/_vendor/importlib_resources/_legacy.pyPK;��W۴�L-��exsetuptools/_vendor/importlib_resources/abc.pyPK�uW/���~setuptools/_vendor/importlib_resources/py.typedPK;��WUKa�x�
1��Ksetuptools/_vendor/importlib_resources/readers.pyPK;��W��\
0���setuptools/_vendor/importlib_resources/simple.pyPK;��W%����setuptools/_vendor/jaraco/__init__.pyPK;��W
�x 3	$$���setuptools/_vendor/jaraco/context.pyPK;��W ��)/�:&��v�setuptools/_vendor/jaraco/functools.pyPK;��W]"ʨ�<*���setuptools/_vendor/jaraco/text/__init__.pyPK;��W!Q8�AR-��ٸsetuptools/_vendor/more_itertools/__init__.pyPK�uW��I!+.��e�setuptools/_vendor/more_itertools/__init__.pyiPK;��WP,x�y��)��ҹsetuptools/_vendor/more_itertools/more.pyPK�uW]i�(�:*���3setuptools/_vendor/more_itertools/more.pyiPK�uW*��^?setuptools/_vendor/more_itertools/py.typedPK;��W�ʀ�8�?,���?setuptools/_vendor/more_itertools/recipes.pyPK�uW��f�
-��*Tsetuptools/_vendor/more_itertools/recipes.pyiPK;��W�=64�(���Wsetuptools/_vendor/packaging/__init__.pyPK;��Wb���(��UYsetuptools/_vendor/packaging/_elffile.pyPK;��W�"r&`�"*��x^setuptools/_vendor/packaging/_manylinux.pyPK;��W��}�	*�� ksetuptools/_vendor/packaging/_musllinux.pyPK;��W��i	�''���osetuptools/_vendor/packaging/_parser.pyPK;��W0��`�+���ysetuptools/_vendor/packaging/_structures.pyPK;��W�sw)�*��<{setuptools/_vendor/packaging/_tokenizer.pyPK;��W�M���
 '����setuptools/_vendor/packaging/markers.pyPK;��W��VN�
@(����setuptools/_vendor/packaging/metadata.pyPK�uW%��ޣsetuptools/_vendor/packaging/py.typedPK;��WDz�8��,��#�setuptools/_vendor/packaging/requirements.pyPK;��W7��]3!&�*���setuptools/_vendor/packaging/specifiers.pyPK;��W�=��m�F$��j�setuptools/_vendor/packaging/tags.pyPK;��W�*+$�%���setuptools/_vendor/packaging/utils.pyPK;��W��x�?'��X�setuptools/_vendor/packaging/version.pyPK;��W��%��$����setuptools/_vendor/tomli/__init__.pyPK;��W��i�iX#���setuptools/_vendor/tomli/_parser.pyPK;��Wu�1~���	setuptools/_vendor/tomli/_re.pyPK;��W��g��"���	setuptools/_vendor/tomli/_types.pyPK�uW+)�!���	setuptools/_vendor/tomli/py.typedPK;��W;��N�����	setuptools/command/__init__.pyPK;��W�8T/�o"���	setuptools/command/_requirestxt.pyPK;��W�DȘ0O	���	setuptools/command/alias.pyPK;��W��)��@��L	setuptools/command/bdist_egg.pyPK;��Ws��Q��3	setuptools/command/bdist_rpm.pyPK;��W�>�	����5	setuptools/command/build.pyPK;��W�}�C<� ��~?	setuptools/command/build_clib.pyPK;��W�"/�`D���D	setuptools/command/build_ext.pyPK;��W��X��;��X	setuptools/command/build_py.pyPK;��W�J��5��4j	setuptools/command/develop.pyPK;��W��	
�
���r	setuptools/command/dist_info.pyPK;��WS����\�Q"���w	setuptools/command/easy_install.pyPK;��W��ߓ'ރ$����	setuptools/command/editable_wheel.pyPK;��W�
xk�g��B�	setuptools/command/egg_info.pyPK;��W�5n�����
setuptools/command/install.pyPK;��Wz�
&��#
setuptools/command/install_egg_info.pyPK;��W[N�*!��e&
setuptools/command/install_lib.pyPK;��Wӹ��u7	%���+
setuptools/command/install_scripts.pyPK�uW]�)B7t(���/
setuptools/command/launcher manifest.xmlPK;��Wv�����1
setuptools/command/register.pyPK;��W�Ьp1��D2
setuptools/command/rotate.pyPK;��W��^F����5
setuptools/command/saveopts.pyPK;��W4"(_�	���7
setuptools/command/sdist.pyPK;��W����?���@
setuptools/command/setopt.pyPK;��WZF��	����F
setuptools/command/test.pyPK;��W"]K����
Q
setuptools/command/upload.pyPK;��W��9dm
J!��CR
setuptools/command/upload_docs.pyPK;��Wh�0�����\
setuptools/config/__init__.pyPK;��W�P��9)���_
setuptools/config/_apply_pyprojecttoml.pyPK;��WA#�!�@��;r
setuptools/config/expand.pyPK;��W�`=��C"��f�
setuptools/config/pyprojecttoml.pyPK;��W��>�c����
setuptools/config/setupcfg.pyPK;��W[����1���
setuptools/config/_validate_pyproject/__init__.pyPK;��W���N#,8���
setuptools/config/_validate_pyproject/error_reporting.pyPK;��W�G��A�:����
setuptools/config/_validate_pyproject/extra_validations.pyPK;��W�o^7�LB�� �
setuptools/config/_validate_pyproject/fastjsonschema_exceptions.pyPK;��W���)|X�1C���
setuptools/config/_validate_pyproject/fastjsonschema_validations.pyPK;��W��{)�#0���$setuptools/config/_validate_pyproject/formats.pyPK;��W�㢮�	��e0setuptools/extern/__init__.pyPK<��WSE�O�#��N4setuptools-69.0.2.dist-info/LICENSEPK<��W"aPEm�$���6setuptools-69.0.2.dist-info/METADATAPK<��Wo��4\\!���>setuptools-69.0.2.dist-info/WHEELPK<��W/ד�t
,��(?setuptools-69.0.2.dist-info/entry_points.txtPK<��W;���*))���Asetuptools-69.0.2.dist-info/top_level.txtPK<��W3��s�%\Z"��dBsetuptools-69.0.2.dist-info/RECORDPK��P�hPK�![�h��u�u)python-wheels/pip-23.3.1-py3-none-any.whlnuȯ��PK/WUWN��epip/__init__.py=P�J�@��W�^ta��+����o�Rf۴
�3C����v�@������ɷ@C��I�[��J��ޘ��C���%�@���;{�cjl`p�o�R\/��A����
7p�
�0�*˲ߎR;?���
�~> �~��Wh�(�	"��p�P/�G��)�X��'��k����Q/[D�T�yޒv��Va��]�4sQ���]�-��CI[���IҢW�bH��i�gv1"_�0��
.�l�?PK/WUWo��׼Vpip/__main__.py]RKo�0��W���9K�w-vC�阈-	���#�i����(���	<t���E�o8�BY�q�9Ft	��.�QD�|\��~�4 �9��U�W�&�4�@=���Ƀ�y�`f��y�J�~�D��h��!�E!s��8�0��9�Rp����_���4x�S������[��á��&�t��Y{U|�NG��G��qvN[�G1e�.������!؟1�u�p���\pw)��4�0��٭�ǭ�n�`�U0m�3w�O��Ө����m'C�m��n��1I��LVE8E
�#+?��׀���r�zC�Ǥ!h���meb!{�@�q�7���I���52��/�\�_�:�<��w��yO�x�<8�c�Nu&�	��e���e��)�MK.�p���њ�Y�����]�P��|��PK/WUW~%���pip/__pip-runner__.py}T�n�0��+8�0p��0 X�E���dIz�BPl��fK�$g1���H;Nڠ��$������p�Ŭ����/[�k� 3u��Z�	�Qt�AB��-j�7�]�>
�%��D�-+�A:P��	xCѮ�H�����Τ~�aEiUm������Ի38/=�5�0����'t�6h�2��V��j�J�[�֘����gU�:�Y��t<���2RuZ��Vġ��"��i���o�1�|���O0��"�Oq9Ἅv�xp��q�A�в�h5�i��2JG]F����w�&`U0�t�V�0w��{�GlF=�Ta�:k�U>�ny�����	�A������k��yz���c�,=�2~z��*ѫ�D^/{~�g��
9��]��_��k�M������
����V
�I"�嶟��J*M@o�z?g�h�5
G�G9��dz�v��T���ym;xp&��J��[�ƥTe=�ʲ��"��L,�����B̧�%�h
�B�#D���J��T}�Α����gҏ�kV!5�w�ǂ��1��EES�\ �9�1��^����f�E.���B�N8ze���'�?����A�����X�������I�	D�	��;B�A2�7I)��TiF�Β�����B0�0�ޅ`	&^J�o��bH�Sڑc����$�^�r��;��R��Mԉ�0FWe���,=����6��_PK/WUW��5�pip/py.typed%��N�0E�~��X��lo@b6�i-%v�8��=N-�s�Ha��Iw$QF�vT�+>OI��H.�3��Q<���̧f,t�$���o����Ƚ9��Ÿ��X�����|�������h�dr1��h�d7����*��4�;#�)!�*��W���|�J��߱��7���g����]R915n��PK���WԈ^Cpip/_internal/__init__.pyuQ�J�@��W����uz�=z�x�e۴
Lg�$u�ߛv]Ńs�������qA�B�Kf�g�kQ�)D�ER��#%E6�OJQ.�c̽sW@�t��ym+'Q�@hB���2#�4�h�o��Q�
"o+�9
�0�R0	�����,��NŻe��;�9ע��m�^�����.ʇC�Vp�h�u��f�yȶ(���i�-3��B��� 
SQ,�fk".k2vȘ˱ڑz��'�mK�Т+o��j�}]�����<�e.���k�P�ۛ�;	�����cR�K6��6'^��sF�8��kE;8�|
��x��}PK/WUW�c[(pip/_internal/build_env.py�ZKs���W`9�%��8�T�$���2�f<�l�T\��F�)����.��t7 )�l*���F�_?��]Q�l]�����jY'y��`��˴-��(��L�l�g����Ţ86�hYY��c����W����ؙGY���}�Z~�މ�Y�E}dY]�<Õ%��E��_Y�h�S���"�.�n�a��"����ɫ��W����!d-��!{��}���e�>rx��|��B���WŴ)�8��U^�8�-��Y���M�*E�Ă�����{�?cOM��B���� �y�$���I�R��IYg�?�wQ��i��E,�D03��W���c��>�6i#��P=t��2;�js���M�Mm>9ߧ]�&|��bc
���ڢ���v��3.{ٲ�,�a��Ԗ�$/D�x~
^��Z�B���mrST���]0->3́��k'rp<�K\��74�X`�˕���~Gc~�T�\,�3�]�K&[�},���醠�������p`�D��D�f�I�W+�c��Gq��L��ɕ��^M��A��M_�rRh�_�W��A�	@+�r_H���7oRXtxEx��<��:$�
�.�]Q��Vzn,3Q4�t��H%�L�OS�h5�
���(��
3E�IO�W�	��ނ�0�X[��`4�N�թ=@��{�u�J40�X{�,�0���c�B�,��K�����b|�r��s%[�8NwSK�p���Ԋ�؈N߲�DƵ�@�
�};u����r?w��JN�MU��A\H4���4��;�.���̂sd}����\�S�t�G��1�@s���3K%��L�Vh"z�r
������*_I,l��2�˜gu�{�
��1���$�����$!$X�tPK(p*5�;fȕ�dn;)��=F��5$�]ײ=bUc�������X��~F�vUz�%����8��I��-,
0`��i�ڝ�����
�$��☖ů@	���=��%]����T�-�4�7�ų aCqNu_�7�"J����߲
� >ĥ9��"��Jb3���ƴli[2��[�7U}Wa$��!$������E#S\:��%K�������Ur��4
��m�!d�6���1z��)�R���r����OM����~E�,�rvL+T~�N4�2
�L�(����4�z��z2SD�ʼr����x��始w����`���a�%J�|u-:������B&��K������B�{��.*�GC!C� ��hhGC���)�g�L1�ʉt���%u��_���)mg���$=
!8��<�K��];ķi�!>+f�Ŕ�s_M38��ad����f�aK�g�U'��Fe̶��?XI<�-�<B���me�*�ҌzA��l&>[���?�VC�)TxHg�Y�M3�߃���h�7X]GT=�>j��A,w��+3F�Z�wN^AY�$��v�� ���}�
�obJ���1;�:.pȔ?��؟~2USp�8�z���`�����n��!3R.B�e<�Y�z�D?'�C��d��r;��@�T�x�;�>ؘ�J<.g5����9~�s\��V���z
[��e�+�,�*({@%�'f�4�9g������^~2uv�ҙ�!6�62҄�T�4��D�~���C^d��t
S�ꞩ�-o��(�鞞��9�L�<�(���u��8��\��K�+�!dFܕ[���q>����r<=8���.���RWo��T]�zq����O�o�_^���q����z#�����?�ig�����h�Q��gM�:XW
���"�MY��!��	�
���ӄ�����e����q�b�$^�aUU\9��ؠK�}�%<ǽ�f���{�8�����0��g	.�3�
�m^B�X�g��[wtF�K:b��ۧ��pو��T(������u����6z���uS7~��46ܽ�t�F��>�_x�v��MbH�<��Ю�XjY˨#+�Q���~��ă�v��{��rx1H�:�����h}�;���R�>y@±��+��e�Sl���fָi��+?�*�M��p�*�j�n�\��ޔ�����<n?!�A�|��c}����u���)SA���R�{�yYі'�u)Y��_؂B��‹�V�.1��c���`.SK����)�[؉��Ď<;�U!����x%�dób_dj��B�<Sq�罒�b�ў�ױփ����=�pw|�neV�PL�*�f�aB�ƴ5��A�4~�G8�'�%
IQ��q%s��K�3����$���{0�<�V6��i�2�Ǿ��o2׶�)�L4C
�G�Žv$φ�A�Y@�'b�&���ys�����UMGIBw��Ӈw�ZK���C��>�Ç�EZ�B�*�n�t��@��T&�Q�m�4�ģ��L1�g��!�f���w�}�:��ۉ��]8��;Z:�Q5�O[?ӛ��QvGK
��7Jw�N���0�����pm�9�]��W=-4^�G�bdi��Gt����=�:�iUi�Z�R�}�iیZ[/���xB��<��ꨓ�9���7�Iu�4��Z�H]�E�����5ԝ#��~��������E���O?��F�C@/��:,�jg�`.ui>qk���}V��<�R��+� �)
;��4-L�ӻ�I�<s
E��k,xSB��{	�y3;�z����B�F	�Ń��~P�g&�n��9xq�t�DKhc���il���ͷ��a��#!*t�E��r;�X�"�Ѭf�9��ZnZ�]8!�i�VeQݠ\���ӊGH���eg�{�ek�mE'��	�kM!)0ǯ���k���]���j�4�ys�0��б�[�22Q�8C6~�����9�n���K�.����/._�x��r��Z���n��`؝����_K��w1\^?`�~��xY�ʍ��c�(�4���x���/2[�=�
ݾ��L9hiV�{J��d�<����7k���f|�������Q��)wD�)JJt����]�k��
��nB�G;hq� +�_�/��������e�^����Z�Z�>��PK/WUWy�"e�(pip/_internal/cache.py�Zm�����_�U`�*d^b8n+@E���K;�ÁX�+i}��'+E�{��]�K��\��
*��/��>�,o:�>���e.�j��j2�N'�/LY����L��Ǐ�����l�:�6��N6�ًBV�C�����&�c����8��u5���ۢ�&��ē�E�ܪ<5e\�����JnmC��΅�+U��w�˽�ܪ҂�]�Jg-ɵ�M��2�?)&2Ä�`�>�3��{��bO�a�T�\g����ܛTe6Nu��UR�YC�����ؕ�Y�
��Xz F�����b=�ԾH�Q�V<;vL	�4f����<��j�< ��7����R,w���z�cQ�*N��d�߾|�����7ɛ��/�~jJ�
1��q���H��캊�{ϕ�ʹ��L<�+�XL>���UU�����L	���=f�!"A�Vc�v�aq&�����Q
�&�QG�|_��,�
YJ��.��|:��t6*�u�i�Z���+��>�bwzdc��a�h�맳Y�S�R�U�����:��
��V���b��.��EQ�[�*���M��4F6����`k���	�Z�{��L�ﱵ4�"�T��Sqs��Ŋ��u�$�U�fR[��7&��2����Y;��$7UGF�cccr�X[��S�F::�,���_xY���!xe=�G3Nه�����ȏ��4C?�Y�}m+�R-���U*��u촚��g����[�+x�2��-�pJ]zK�����������H,��!m$���+p�����(m߂IL#��͜oJ���ѓy���%�Y���5ֻ}���"��)��.X��	ɏ=IC���6�q�8p)܅�l{���N�3�-zg_�i]SZiFG�z�Dű���i�z���e���T�UG�:���$�^��kY�5t@��6�r�����J�SaS8�uu�r��lT	Vg��L�
T8���Y�8�4y{:�/����#�|�huY��1?��.c1���b9�Q�W:��QPm���*���b��U��ű�(��Zً?=�˓��]MO�:�t0�)g�z���8�ێ�K'%"�qx�-\⦐�<˄�:V[r�>a�^g��Y��K�25�aE�F&r_=�Ô�����C���T���
�E���ڊL!�3]5��sP���g덶�7�/T]��t�:A�k�/�� �)��˰궊���p9��+H� �1	�ߒ�±��$�r�<��eX����1JR.����\�����G�Ԟ��$j�ו�j��z�żz�x�=<^<��,��;i}YgR�z��C�U�J3�eⰧ×]��2P�!lI�]۔O� ,�
��f���c�n?!z�����p>���z
�I�lD_��xW�_D?g�GD���|ƌ����b�ڪ%t}j��O2����r�"D��(�������P�UPb��B���:oL�r_d�@��,M٤�\�2]�
�$�y�"Mg�(�[�Ep[�	eޅ� 4E~��*�k)3P;Qe(&YM}��3w�@�~.�|ϸ�j<�}�i�{��:��%��k����쐏�gh?��`5���
��Hm��KL�鏐��p�̏�@���'Ok��`E�̜Ϲ���8:��#܎��e��P��� -���P��A��gG��b��M38��+ȹ�pt�� ��Ƭ��Zy�_a�0�SOM^I�)�Y.��D��켔2`��k��x��‡W��S��8�Ƨ�HW#u�Ig
k �|�1MBDpKK*^�m,��EteH
�E�%
�<���kީRz�Au�zM8c�0�R�jh�7v�����=�r���� f�>v��n*&g��_|w�/SA9~Ǟx�nB�|�ۭ�O]���~��!4�����J+�K��;v�V��™b��^E��F��3c�~�P޳tg�; �Iy��c�>Υ��**�Ξ�V�{��˴!IJ:�Uo�%�q1'��<����8U�z
f�3}�EcG�fr�g��xE1��oN�r��^V�

(�{A�"��h(��u���G	���z.~B��+f�V9	���Fԏ��P����9Ir%Zׯ^�r��P�~Lt�˂��M�c�?U��=�>����۸�9��)��	!��	�%]=t8�v�z:����6�%ڎ���l�a��X"�n�X.Dq�s�R�K�yQW���r�n6����k�#�1D�I���^�/���@���-w|�݋��ɇ����gO����p���1��;��]�Kk�e�1�ɥ�e�fО����0��v��1�/L'�a���7�<�m�t��_�.�"پ�����mֻ�I��#�-%��Z^�
r=O͠���@�����%�OY
$;�1ݛ'�.`<i�9��t�>U_��.,�u�y���0�������� ���&iWF})r+Ϲ Me*z`gg�˸��
�|F-3����?��d�׃�����!#��p|O��o�2sp�oK�V���h��$�? ��S}egU25��9�J��qs}�15��Z�/�嗶�-^��{e�����"
�X�v�i������@��1�Ns���3��u� K�Pn�a��{����m]H�;|����`o���B!S�͵[��z}�&�[�����2cK��s��Z 	tn\�4�3�H�E^b�T���7����H�mw~D��@-��@���~���e�1D>�ky�|V�z�xQ����*���I|�?��=�6u���f+��^�OJېC}6e���Йq�;�W��h�u�1���_�C��U��A�_���b!�;��o����:Kٴt�)�j_��'L�k�?�囬�
�f�V��R�K��\����Uok�����~	ة]�Xkx�Ü����n@u��_=yL��<����S��П��L�9ip�-}�c,�L�:�H
�.x{70��a�rL����ĿL�(`GI%V�V�m�;Y���u�9w`���4��J�� `8���4y~Mwgzv��KgcY"f�]X��Tƅ0���ik�/PK/WUWJ1�-�6pip/_internal/configuration.py��o�6�w����2��n8�����K� ������y�%�����~�=�)�IV�3�֖����� ~.��ȤE��I���5�+�x�)��b�Y��Z�EV��ǃ#�'k>`�X��U�s&r� @l)2�"X�M�
�����D�b!���l'�K4�#v���~�����
Q�R��
͗w
	�I^!L��6�lWȔ�\-�0�l��P_q���N<"�X��x�R�A��X���̖2��K�,+I��B�oj��U�6����E5b����&�#v&�>��~^��R��؇M	�5�R�Q,r��"�e�i���C �1OrS)9�>��d�yQ��ϊ$��h0�;gS��>")�THup]�*��.�|z~r��rP�[�7��:�'�ۃ;�B-�r����1`4��`p��4��$"6�$�_��z�VI�~y
��#�*9~�8{�.��zz~�~
��N�"`bi	e<S\��s���S����w�W�ܸ�R�v��Y	��}}��+��b*�U��D�h��L�Z-��ӫI�j���.�B,łV�;���l�f�M��U�{U�5�,RNk�O?L'���g���6I6g�|+d���{`��I���@�<��
�ޞ�M���-���r�'4\0Jx�izuuz2�/�N�W@-Qi:F��m�#��;��|ţ���NOⳋ��������T��j�1z�8���_|���d�H��JA6��%UgS�ӂ�\'��G/���|���
�1i;�;�;&�z��q�Q=�d�䷉L�m�7���g!w[H�C�b� L����4�$/�d*�NCZ	jM�T��J��
�#x�qj��}?��`�<۳R�%0.+����6H2�}��O���� ��"}�~��� 
���ZZ#����Va
0
�7ľ_���W��W%!-0��c��c#
8�Q��%���Tl_l�"l���_i���^b �$�G�y-Q�U�#�},[��:�(��2U|�7C�F����1ې���f��l���0T�m��=��Y�c�"p��߅�C�6b-/8d@�W("�"*>����w	�z�A�P�ė� �_��!�)A��(��pT/ �N<��ͪ��F&��0�|���� ���>�uS�>ٍZKч�٬��y{zAX���M��z��p}��]տ�ͨKN�؎i�V�KYl!)�:Fa~	^�*Y,�01@{$@��O�LJI�>��b)X�R��Ǘ��!1���*ؼ�>4���>ӱ�):WU��~u���V$D���S�{�Ak��)���E6��*2�0�(G�£o
8	��.�a����.���Ck�O����G����I�g`�4�M?Cd1���YSB^24Q�1���r��94�H`3�-c�
�:�%4�T��9y)��xs�)),Ր����i
1C���	�捉��?�|�A�"z�8P�U@�5�1��l�A"�Ȁ��?�w�L���?��2�9l�ᰳ��B�G���Y��_� <i�ox����	ƴ&*�d�LwH�.���-p�V*��b�h�q'�P!��g�ZY�|��p�Qf�8�Ksb���2���z�C���0��C����u�B~�ӆ
OҎ!w�X��,��.��RSm��\�Ǡ�$�T�f�
��n	����!9��ۏ�9%�)k�6=A�qU�<�쥦��M�gȼ��]/�Tr�+q��?'
)�}�^0t�bb)���;���4�V��~'�D���4FR�}ˍ�H����j�#���p8�nޤ�T��S�_���BCB_��o�m��it/���b��J"S�4�!C��#GJ���j`��#-�56�U��	�22&ZrM�4x��_���FJ;rE.��XF`}G�#��Oڕ<>S�
=3�Ց$=r|����
�A	F��U�rXn2]�0[�`r�u��[�����b��uO��L�GF:��_U�5�E���F�,��v�/�'ĆCr������!p��{�e:F�����d8��O�ϐ������-�k����n�~�D�#V���cF��,f��~ھ�tldK�~ٴ��p	Yc����b
.��釭��m+u�#��8I���A�:{��c�������9��6���D�ŀ����'G�6�!��W����������OQC"e��ǘ�̌�i{�?�5�֏(6Y�y/���k��kk+�n��l�h�4�4�~~����-��d��m��L��7�]B�� ^S/����6
:�:��S?��=�6�R�dY��%���sؔ�	�a��������gO�'��=�P_�km�)9%�Gk@Z�Y@�u��'�k�Vj+�'t�9����R脬`/T�K��-�N	H6$���_��P��{��v��;9'
�I��+�O��E�7y3��qLF}�v2*�P_�<��
v��x�]��.�L�uqMƄ@x7	����ep��+�)ԾT�4��o���j��D����ᠹ���K)��zL8�tf^8�~
<��b�Su}�A>Q�Du���n���=0&
=N9x'Pd�e�*���XT���.�'�g�4,�g)Aad�o�o��b�����5U:�Dz{�sb�,��4��Fw\�s��"v]�&�X�*��X��-vW����lO<�N�`C�S�l�L�����1xS��M��u�N[��n��%�����΄ךp_��۾����'l~.��|�e�^�u��黾%��#�z�,ݐ�w
9p!�2[��`�A�0l��+��A�nh>�jۧ�F���e4�K}ˌ��ʭ�af{�m�w��e^N����F57
��n~�랼����Ike��O-O�Y�^�W,��|/��֑=��s�^�|����l��ó�FX=�[s��K�0m֦�S�!H;{�&km�QRBTM�V�4l[3�ˡ��5��^[]�q۳o��)���WB������_>F�͎�û�Jn����C}��,he]sғ���I�ެ�'m�I߇�u]�E�j�;�T3'�H�C��s�_�걡���ص6*]�黽��V�
�%�e%�ɦb�]�I��[�]���[Ys[9KO
_�P�l�k��y�.��dkMS��;B�g�͚{���ݘ�\�bl��qT�EA�N̓�X=�	�}�������u��j�0&�{�؏�������=�Dͅk�٪�J5~��R��
[�.�e��k��7\���ǿ��9Ip�XNt�"�,39�꫰�ul�J��A�V�չ�!�L4�z���x��T��|6��ǯg>���O�|��W�R�T�֎Ku�S�¼�ڑ����W�p��&���1����b7���xH���6�_�������ܞ���oy'����n���[�}�)��a5�4�i��]�L�נ�V^�Z��:��!A��F.e�we*�s��uc��f�'\݋���[����w�̷��L��V�f���iʣ�U�����W%)�
�g�!�pX#x�N	Q��2����` �'ɺ��M�ȞƖiQ������Kki���v�@�s׽�Rkњ����_�ZK�ĸ�J�x��U�n���By�jk��=�K�7Ĥ��Q�{��;1m�j#*�*R}�M��5�~+��~zv6f�m=��Kk���t�G-79Ar'z�&[ٮ�ϹQ�+L�8�U�r�N]��&Y����Z����̝����<�S�>ܕ^�t�d�o=�A��L�̙�Or���=��~5w�+�<�q��N�K��i������y�\�g�>���h%��k7�9B<�B����z|��(vPX)E
)%��u9߹�JU�&�p_x�\�<�m��6(j�R%�8��5�������9_�}WO7e*�aJ_]�T�~
���M��:8eЪԜT��B��������p��[pO@�d���#����o�l1?iU�;W�K�U�ơ�������	b{��w�?Jl�g{���f��D}�ܛ(��|4��!�v%���jv�f�a�{�Ԯ�m�d�V����Ɨ�J���y�~ʑ`w�wS��P����vs���f�_���>"�q�8��ix��/�ȇa0�PK/WUWɗ���\pip/_internal/exceptions.py�<�r�6��
��[-%{2�TʻN�ӭN����N&�xi��$��!H�5*Um�7����I�d���du��YWҒH��������&"�*�<S�R2�ȫ�"�J�
��p.����E��2��T�7�/���wW�,֢�E�\�E)fE�a�.I6	~��U��$+e���-4?�W�K��	��+�8r.�R��0��,LS1KR��r!�T5�B�x�*5
0Oc�奈�Jf�ȩ��?�<��Hc��,���B��yV�e�L͓4��Tֿ�s����
˅Ӷ���Z�	L���TE�0�Fb^M�#賒aɍ�
	�[^�p>	���<����7#�"�ʑ8+�ty1���Ѻ��H����"������/�_+�J�����~<�/j+/{z&����<5k"��ϑ���+�Ų`UZ����je I��]��"X:�wX�Y� �G���"T�
�}�
~�o�D}��G��{�KY�qX���ס�/��E2�p�����x�JdU��"��B.e3A��81���e���
� �2�GGGO����(���4F�{r˙��i8
"�l���6�����RȲ*2����bPx�~��v��`̟�O�Ƀm2ĭ���m�I��
9K>��`21`< �0q�5.�G��� ǖ5����I~� ���1ްĉ"fLmD�����)N���ʲ�J�+��� 5<r��ӂq��^�48�y������Agޏن'��z�Sá�S�dD�W�4)��C0M���䪨�W;JC��y��E^�D���u��b
k��'$��I��/�FUeY �K
�4�()�WG�JĶ3,�,/�o��9�M�	��T$��B����VY��y9�F�Cf$�vY����U�(��T
����$8�B�v@�U����u�I ~$m�0a�@�dQZŒ��q��44r|p@W���A��]��X<,@̈��CP>��V5��Lc	cd��xx�J�0���b��c�JW� ajQ��c�Kr<�����7+e�VO�6?�]
[3)���E%������zz,�j�w�>���CXd��w�6�yl�9#s�{ڢ��j�����M�D/����i���ly`s\�G�w��E��71L���0O�$S�K�LM"\wxv��2�m�f�Mpį
6V��+,QR�
�v�#�. �f�O����	��o�Fl)ۮo�e�J�ɨ����Ӱ��,c�G�Q�L���\'����5�l/�h���-�f�Q��~o�A�@�Λ
�y0��n�y����A@B7|����bӜ�+o��X0�
������鎝�F�i�X�}�
�VS;�I�O�-,k����n����d�-��ޖ�������ڮ�nmC�f[o�U��IR���л�a���9��mc���U{�@LQ���f�=���>�”L�%�{gϬ	��̻�0�-�ni|��0���n�ŵ�f*x� yl@%����(I�<K�M��D���#E�N�`!Syf�!�v�+��p�]�ؓ�klw��?�3G�-��z�<̉C��o����3*��?��?wt�&�3F�o2����~��|�q3��Ͱil��9����a�����?��xB.����=o�Pc����3���Rh;1��A�u>h]� ��޹�v5�@e�X"$~=W�*��;�<�H��ӂ�%����$�/�dg�d�<�݇3�5�f���iTV�B���	���)ZV����/��zB�=���麬:8��`����׀��]��$JA��y��$��kt�t`G
��w=�E�`T�a!3�Z���_��mqK��X���\ގ��.a=��)���]�
�%c7���n������w|:2��:��䨎9�`+cQμ���M���p�o���-�6&�jݝ�gm��H���>L��MM��?f]�K��k�"7����f�iS(�1�������&�as����8 �T%mP�N���Z��4���h���Yj��]J)�'��O�)f�
f,���d%�d�Dĵ���7t��e`g1>�au�ߌa1��<���C~C��e�פ>�g�����^ot�}��v91�p�p��
�?U�{3�:}qzu��������w��S�<��^׋�#��p�
@3Y*�q.�{6
If���1`�Q��/��ۼ|�WYL���%�%�x��>�6�9$ݛ�	'	�;�0�Tr�G�͖��2q��dArLg(�U�h�!��&�I;�ᬽ�.E"��~Ϟ���x�R�?m6�K�۶FB��0�ܠ�T;ȸ���v1���E��"D$~�CV^�r~���)�<�=:�+6����J��#����A��l!��H�ɝ$���@�(8�3i�cO�����Ȳ��cg��f�z>�x]⌺�T��j�A��ՠc$:�1cnBؤ�:�))�k/����3j$�0�M}TRJ��5������y��uD��6������ֹ�F����i��LvN�qD�r�+
*t$<N.aV*�J��KD谘�����7�H�²��%���=���\n���#��QC`7�s8��Nf4�b
@�H?Q�S�w�
�9f�YY���������@]hU⌬X��w$����þ�=u����zp?��Hn��%�ո�ǰQ��	b-�ZU4�&0����#����f}dX��W`3⑈{�%���5�C�0���S�\>�?F�	`����p^�$��/��࡞*�po�-�$*q�Ț�w�;�[Y>����������:G����(��j�F�{\fᤝL�E7?��X�-=y4M�j�3@4��7��l���#Q!O�Lo�89�g�GW�>���$�4��o�זj�~w�=�Ǝ�V1��p6,�j:
L��@�5�j�9<��̨�Mg���a�7�����#Ց�yÚ���)�JT���n�{M�/�=�}����`��s�2�$�C�H���,�jU]�5�s�sh�Ug)9��Q=N˺��&yc�Y=K�O7�)���Ui�oz�-2��
}'�
���E)�Q%jYq�X�qqJ�Nl0mm���!��>�Zl��"�]���$喖	�N>E��fB��m���lc��+p�����(�dD*-�F���	�Ý �
�O�hL��M53�Y_��D2-2�.��o�
A�+�l� �}~$[����d�XT��h�̦Fw{�I��
�M�:�}��<�@7���ao\����H��n�jԍ#�.�����R
H�JՍ��8�5䘭�_T~�-�<��HV�D�
(���S�9��hB)���O*X��i$�F�����\���8�!g��޾�YN7��}���f�û�����1��n����y�|�ga�5��j�@ₑ�����Z�
������	�)�L��!���ze���@�WјUi��j�K0E����|�?h╍u��kZ��W�w;�[U$s�ua1���و#�}P���WO�Ӄ��T.�L�䮙
[�<=���Ӗjh�f����Z���`���4��vU>g���K�Z�=�q�l�4�����H�e�M��Gz�x � �>���	�
+����nt�͜����<�v��l�ft�Lc�kC��n�����?�-��,�ev�5�a�<'y���o��LV@\�\�m0s�I���FgT:�F?V���wI�>��
מ�C������T�6�$u��}ݛ~LX�K�FLS��I.�q(@ K?/bY����Jc��|Dx#3�AOZ��l`�%�̄����BO`u��?��C�T���QE��G��.PF�vY�v����x.�%k}N�����\��I��8Kt��I(�h���y)�]�?d�y��뿐�q=��C�Z�b����R(�cj�T
^��5���,�`��3s��Y����F�%C!vWWՃ�$U����cpT�,qH
D��U���ГQ�-8�K���$^��������3P�|
��%�(�|q�5�w��m޽ĕ����R��	"��P
�s:J��7�XgVi��2s��+�P����1��	4��Ĵ���	B�������%XsR	�5C�	3G_��&�i��ZEi�8B����yJA&OE�����t�pP�Q	���c��y�&�G͑z����5G";����Ƣ��/�0l��
�.�B
dOP4�������˯m(��k�Q���d5��7�H2:��X�����K���x��8:���b�{~�XZ.Tm�'L�QA��������-�Wq��Ty
[30/�i���ȥ_ר��ۙe���Ǧ����������
X��_��z4B"����.;#�a5��h-	��j9���K\�C[چ���2�F���w�B��DV]�1�a}JC��t�j�� �2���{�K4�b�	"6V��9��A��(WNf�60��߹���k1ഺb�d�'Tc�F������!\s}L����H�����>���t��}������_DS�-?{�O[h�v��Q����#H�>B�LʚT��:P�X�ߝ��w��Oϱihh���������_�����3IS��|��;_�2)>��`Bю�UD��!		��h�k��C��!R!,�Ero8�f�`�ı��M-�"�n��/:�Z*�q׮��$��労�/g3�l�,��b�^.qŒ0��A��	%i�vDU��fk�s���ڝ�=�$���e!+��y^��`�]m=�5�^W��FB`��dJ�W�D}�5�M�P�?ᩯz�z�$)���:�Ry"^�1)J
�����c�u���uU�ǭ�I�~y�ݻ���I����U�k��4s���i�9�sC���xݕ\`D
��HW��[Д������[� ,��n���3�c����E�g�����<�S�eG�;f7�"���!����1�"z-Q�P�䟢_|G������*�{@���f�SJ�/U(��N72沴+}�OPLy#�v��|3>,~�lA2 ��l�ǻ��5���m����9��7��(������&��1�eJ]~Dr��
E��s*��
�@iE��5ءk�v�V�M�QR�,�!��U1�''詡p��.
���>5�����|%�A���X��_��Yݎ���9_���y!IQ=I)�=��~��+E˼PK4���Q�v-͒�qǒ]��\N���oO��\���Җ7�W�_	x'�)�ˋwo����ޟ]L�L�^]������ZwҺV��+�FfiG<���T��x���!���!\���B�ծ��+$%A�Ņd$
��2���w��/�ǔ,�� �c�[��;�5�f�}���"��a��?A���s��bI,[�K�os��7�~���@�x�K��W���7mK�[�k����lPq�@Uj�C�;_�d�������>PM)|r-}w9�Z��\
�|	�IT�
�.�_���w�X׽��|J
3Y6��ǫ�sÆ8>>j����j��O_�����::������?�O/�o��8;��DgD��+�b@?��\��G�
�m��0)�n�tA�*�����cP0�S��A���@Z��2�
̂�J!K�>�մ+�
2����"c�pxLyo�d#u�ފ�f
���\,mI�E���|@h���?�-�[
z��'�Y�g�Y����tf�y@�hr��;,�zt����5~9l��b���(A� Y0��Yt�EOQ��L��Zܶ�Nu�}�Z���3d��L��lT�:�%�j�9�e�6/����tb�h}_W䢋Ϲ�EO�+�2I�T��s�
�ԑ�lmʃ���\�x�CF��l#�f6���h�k��1�1�T��|9Ӆ~��|�6��L=4�k\$��󌮶��-��gn�M�s�=t�o�.���a;�&�L��n�I}N��)��:u�q�RC�b����`�����ׯޜ���E0��xwAc{ޏGhi�]��`�c���gqCe��0�aP�r�1�z�c�;�&I+�OW�sm��� �W�و��;`��쨬�s��]���o�LLH8��]��A��'�7<�I�c��K$RTBn��R�<R�y0 �2LN��@�[<��_�䩉��z��z�oo[��
[��N[��`:r��e�vZM�XNP�zn��W��R�����Gm��Zt��%�X�`�iw�q[n�p�dzs�
���#�h{t�+�k�j����t�cL�����N��Ecګ��4�0�3�R�᝴�$ þ��oO�X�~���l;�
=0~L�^�}���jS\-Qwh�O���P|*z�h]TF��V!���cdR$&������c��7?��-~�Yaz/�K��h���z�>ep'�`�"���H��ݰ�����%E(�.��]���\n��|.0����2�Fa�\�#��-@ST.Y���$s���Y��,��-��"�s����Ԑ��Ԉ��5���c`�!%\`Y,���h��1��*��wǎS,>��Mm ����/4�SQ ���Ȱ���ix�\��'����E*�{'�[���,uN4N��@�<���8-y��V�Q����=R	;�DP�Ě�G!��R��G؍7ظU�:��rV�uo��$��:�|��7��і�{$Aʯ����-��J��1�Ru=���e�>��Sn�g2 Z���Y��K����\ʨ�)���ӽ��]�}Ɖㄳ9����9[�t��i��Y�4����Po$(Ԍ���*g�/[�ئ��D���Q��M��u
Xw�`�.*Yz���>�~�ԩ��r�l�?1H�@�~
C8r��3`�R��r��R���b�����g��9��}��̪inoJ�nr�5��Z�ѷ�0��P5~�ݧ�sC}���Zf��d�����#��|��HL�PK/WUW'���Tpip/_internal/main.py=��j�0��~
��
�}llǝ�v٭��&J"pl!)y��)�HH���?H��V�<�\�����F%���q�9R~�2j{�.�59�
�J�<�ek�h��g"��,�(���PJ�+YKB�N�M��h��
j���]%��ȼۚ�*���УEJ�E�Ɍ�
a$�����x��8����^_�
p��Ńz�O�����R��l�r�S��s��ȌrE�E�}��s�PK/WUWi�j۰	�pip/_internal/pyproject.py�Y�o�8~��B�>d�8-p�e�v�]\��^�-�A0�����䤃�����dK��}��@b��(���Q��^�$�����f��i;k�޳Zw�����I��^4n�;�Eܡ�j����^Z�`��Q�w3/�˾Z?�h���w��k��o�he�i�^(7���y'�ߧO�<��I�*�}�����ϝ��w�O��f^���{�?��d�^���Z��H9��Ѳ��������:3כO+�Qɖ?���݊������
.j��������tb�``�d-��T���{�$���ޭ{�v�AadE��z0�X7�k�9��)p	~gi[�j�IKuY��q�
�@7($��E8.;�n���'P�J�P��LJb�����w�~J��Ɗ�1ޝ�M�m�ů3X��߾��jL�<����)\@��#��F��qF�͜n���(���s;���Vv����=7`2�z��]�d��L�K���j��{�`����d�i%F#��^p���q����N��uf{Q�V��
�O��j���o����7������@(S�aՏ N�؋�2"	�CY����"U��+�	�Nɞ���dv���k0h�j'��>.6��ނixm^$|���b�2�<Ȱ�cT�E&w9����W*�!"��$o!�0ȸ��=mn��̄z�F+�Th,w�8�qu��~g��D�rq�����m$i���nJ�2����*�$B���1�<W�Q���T<�d�8k�����-�O	b8�I��O�-����-,Y�}/���o0e�n��\��Ȅ�]��+�'��A5U�/n,�Դ���t/�Q���ސ&�����M-2v�9�n}�x��͛yY���RkK��A��
7/���+���X]R&p���
Z '�˽�����B
ED��"�U&�����ZR��i��?�������g05�g�� /�J/���/P1��� �k�a0��^[�����z0�e'-╤żx�
H?K.I����|�Z�%��-A(,C@;o���-�U��dNc����c@��M[�%P
�Q���`<v#�����V̀l}�a=>$M:ǹ�6Š_��X�6N�#.)=�;.3ҍ[+uǟ�Bc��*S�'��e� B&�~��]����#���+����#6h^_��SŬ��b���n����(T��w�?���o<Dd:/�uezpXe�P	Z��p���1�Ur�C�D+ै��b���x�ig#(�%���|�O7tV�=%jQ��f�`u!�K���;��@x���1�g��}p<�@`�d,7<��ˏ�
~�U���G����b;�z���n��͘�^���]�,�o�i�e�tf	�.!��H�r#��E�\�ys��GKl�Ұ�j����s�~
����۷?L�WV�Y~{��2�˾��Ë3u�JT�P�Ŵ���k�t\�R��'<N�0��()��˘�o5�t��ȸ�w�&+%�36�'¸��;k��
�}�(;�%43���1���+�γ��xO뎨��,% �
�o<x(�!P9��`��6t[��3	``�^�� ���o,�7�&W�Qy���~|�cNL�{?�$�5=������#�tA�`b��H?��?Me⳨�4�c�<������l��;���i�K��KV$ӭ��=$�����_W7�k��u��G�:ڤ\�%a�ڧ�z]L�^��PF��e ��T���>™�S-�*���@gI��7�te��ߴ����=�VU�>S	�n?D���>v�0Y2���.C��j;ƅw�&84���b��~Ot�3��ػn���<D���:b�Xx�Nr`�����D̘��c�%���7o��_��n�a"YD/`�ѡ3NWyT΀q�؂�-˙���c
��w�Q�<K�q}������/p��mq�.n�J
e��w�Mfk$����_ߐN�M�g�7�ΙCNu�k�y�=5I�{��}��������1L��b !�F��,����<��|-rs���݇;�|�D�a�L����Rrw�w��y�����8�G�}�3:q�#�%P������C
>�_S;��\�+i�:��*�3�z��W�f���Tu7��=�e'!u�Iu��i�:�x��A�w
!Y:� /,����'Fb��-\2ܧ<�#�`�ẝ�:ĹfZ�6���t9B1:�$@2)�»���*�H9��"�Tz�Z�qƷ�4��'@Ǚ���@��Fv���x��ե�mB�!F��9��),+�0�N�F�(�N�n4P���,lEw2�ȭD���V�����ˎ�P�I�}?��i"{8ɖ&@H@~(���ϩƨ䗼=�mg�i)>�?��,��"������PK/WUW1�� $pip/_internal/self_outdated_check.py�Y[oܸ~�_��(Vӎ��bPm7M�n�A��
�85�X#�$��4��9�H�$'��<�#�<<��\��!5)�f��ق�粭s-D��Ž�]�7����^���[�(�P�:RB%
�;���jQJ��+i^Q��"���.���]��E}\�����b+��zE�7���V{��M�ݱ�.�o)2��1�`�'d�#T�/�{;% y�KrQ+Q1��R��#[�T޶���TN��V���x߇��Z3	"%�.�=0PUl!�����}�?g�gY����v��Y�;�g����-�Y�J�V:c���޳Z�h���S�+������D�YQ�J%��X�'k$+;\\����$�s���L��2jh����+s��5�9{@�?��ͻW�?]>�T ���Վ�xA��0��ȩ��2�;�2��z®�މz�X>~}�+�����N�/4�2�o2|�"����^&5�+"YS������;ת�,+�\,�O���	��i�ҿ-��ǃ�|k��,��e�Z�H��+
ĐS�2�e�5�,��m���!D���R�y��`݅�D���;�Lv��[г; �nem�yN��!Ɓ��+��{>:y��UE/�9Bk���=��>�u�XZj�&��gZ`0�w��<?;?;={vz~~�������gkIy�>[�;��+R �6hV�͑�
���.EDIШ ���x>�rO�I�3^��$�>G+���l}v-�x&8�;�/\�hB��L��Y���?
D��|'j�?�-�8X�x~
�V�o��_�6� �aR[t�Nȕ<��+A�jv��iNvy9`�[��=.�%_����~:Z�+$`�7rstP	� ��'�8p"V�s<���5�Z]��=Zb~�6M鍤!1�'���;���s�@�{y!�i�U��_��|[N�:!�M�s������XV��+9#F
Q��Ɂ�L9C��-D�͈F6�'�.�	�SZ�"��l��0�?5)���-Ĩ5=�q��6�����!���y+����Nf��:~���@�pAa@������$D�wq�jx��d�8&޵��M|�S ��"t8�7����P� �@�拨?H愼b����fN5Y��A����t��=��0�.��x�
��e��-�����$&K>A\��!��oz��f�&�>
ya�=!oJ�f�Rp&΁��/�z��p#@�(z���x�"ќ�C;[��U{z�L�X�Ř"�)m���L��2��눡��{,����
[�!+Z�N�z�H#�‚
�Tي9��������-��PPx��C������'J�K��@f0z�Wm��P���aT���0g�
(�A
m6���ah��Z�&>��—�[`M��c9:8�:@}��ٴR.}�Q6AJ�Z)�Tz%[|f��QP�J�h���:�Τ�I=�r̮e�29H������IZ?!�>�y74)�T5,�%ϝ5m1�LW�/��#*�c��;l�L�)�X-�Pj쐌��ze��Z�zt3]��X�A�MX	V��%6�.~�{[E��l%��P�6�R���D6[ݳ�}ԗ�<���7ӎ����un!w��,��2����+^>�S�!�I�S���5}��x�>]o@ޛ�kHpL�\o����o�%�p�zV\�0‡�(���k����bZ��R���.����U`88�;hLp�&��y`���j�,?8��B�[�X��퇉4��X��m
����qa�2��X�׀v�}����ch�o�=P�����f�ظ����F������'3�6"�Q��,F�0��S���[p�z4���*�n��Y��WIs �nV�fB��j��K�񁕢.	Ԙ�Y!$
{G�[;��́�eb��<����6\�ՈI�Ꙥ�y�xf�p@��d{HG�c�,ܔg=��p��źC&�MQ�����i��p8�zW�U��
 ������2$�c��9]����{;�{X9�S��ụ�����T�pX���`
���H�[V��)�*��]?��-�Ax������P��m8�Kggp�L�W�w�i�Тܦq{��ͻ��n���&�h64D>�
����~��x^���r��,|H/�p�b9&��F�7	Z��Y?��iZ�g�j+�Ė�V/��)K8�����E�M䵪o?fƺ�d�9l���oV�ެF~�CCrP� �<{�!�K��33*��;�?�+�'����gR�M���w��G)ں��)�^���	No���bFc U�K���b��G˰'bk�5���V��N�E�L������)�ʹ��f.��?�`*e��{�����inì�b�z_�y�0���E��C�(8�=���rS2�b�-�#e�a�h���ҝ�S::��8`y����sư'��Zs�d:���H�.|�Χ,�]�}4��jP��ޖ��7�[��6������|vD��V�$$�9k�6�nb&VA.�2n�9nU�t�����Am�[ZA�D�G;;�q�ۿ^^|�^�x��E���GlŁ�(�$�M��p+%�K�h3�	����Dx��~Hmlz����u����h�ܷ�P��0����@I�2j
��.���Q�C�H�_@E��|D&m
�lxb���G���9��}�w
�UWzl?�z�o`�����l:PYC�G&
��W��kIӯ��њ`��`os
���ӯ���i�ij�����T�}���d���8~	u��A�h|�Ћ���s)L�\�PK/WUW�
�`dB.pip/_internal/wheel_builder.py�k�ܶ�
FFP	ѩq�G��h�0�ā��������i%E��	��;3|����K۴@ط"9�y�p�(�^��Qȡ�C۳=�������?
QK���{�ȁ�k��X��$�Af�(�6��Ե���p ��ʬ��Ѽ����q��
!��g^��7�H�7�R�����u�ގ]-6
���,�M��Cq�q�qJ���M�T��_D��`��D/�%|z�%����G5�2��%�j�|�6+8���E�G����� &e����j�����c��B�,�:���|�B˳ĉ@RvCN�Ko_݌�/�	U[�޳�jn
�o�����yiqہ��݌l��!Ma'�Ϟ~�x�(�mg	����jq��y	��YBՋ����L
g	��7�>d@����9����*Y��̤��>eG.���Z�Z�J1��ж�̉C���oE�L��M����k���qºΧ�uP��i6�o�kU�hQ�
l�'��H�mcKw�]	?7����Ĭ\��s�y�l6�8Ǿ�{k{����}��W�||��<��(���>��
�W���w�^?��7��W(��B���(���(�nn�*�-�\o6�R�Y^����,���2p�]}�n@k�
�����p���|8��.E;��V����7���6��x�O�� ���K����!�t�^}�=5���,�o��ؕ!��T�$1l�c;�g������ˤ4���pK��͜��jw�,�5��Ծ�F�k��_\���Q�Pz����=�y�@�P�Wٜ���`1'ы��&pi���^�Z
w�Jj��J�p���(#�H��	��m�Qn�P��*�׽��ض�=��,RBiǛI��7�/Q��U
���,eM;Ы�!ʷ��1>a/�>8V�u-/U�A���$#v0���ě��M}�≦�d��@|�v������b�G\�m�-��߳�?���l�F��Һ̻3�ɟ ��l'��L6�6���P��̤E���������m�5�n��������"���[/T��B�����#�	9I@�l�b�tĦ�",e\��D�(�V��xU�Jm��^9�oV��]��DR���&te?��2(�/Y�	c��G��+�JD6��1H��6?>{�`����}�U���hlj*���&�
�4*���`+����uæ���y_v��o����2�a)`Fȼ%y�eN�'!~���a����]n$2!��%
HM���F�u�8L#^���M���1�tu5����j��@�d�`�
���
JG��fN�rb�2-A��u�C��s��.	6��{�#`���?ks/M���!_#�����n�۔��8������!6�L&�����ܨ�@8*�XaKw7+��h���5-�=��㰈�".�V�ĨJ�?�mCD/�T�ا��;��j��:��@��<�E��{XI���C��K˧��d�y��P&�]@�c��|���`�Q�KK��#�̎��A�[�"��Q�?�!��*R�M��{���I?:�TҀ�	5K4�?��Y����X_��{��/b�`��!,�i�r�sD#%ф�FD+PPLf?1�{���JJ,&��x�tJ��П'�^@�^/��c���N��U�>��3J���e�Eq��5A�/'꣧�'QB�SL%���g��97���ƾE�lð�僐T�����b�|��u	T-�S☐��|��p�
����ՠ����#�j'nU�_��C�ހo�Mۣ�{���3��	�:p��U�i�t�z{��Oi՜!b�ͣ���-d�0��~������"��*�3�h�S7,�D���7���>X�����+��PR���[��
����Z�qF-���2��6-�RtR5/��f�kb��Ϟ�E��j8���PDs7�<e�d�x��J�k㐇Ա��7�4���ͪr������ڬ�:O���[JLr���LO�/��}pt^��	����I��9%��t�'f�a&��'�+Q�L�k�ƷUS�k��M�w��S���c��R�k_5�M���V*D���.ì#v)"�'zyhZj�^])|W
*����xFJ��9��ҹ̓������$t��F�y�@�tG�L4n�[��Ѫ�͵��~n;�e�ZGs.wƨ�1_��?|=(���<�X���p����Uޝ	%��Fl˅V�
^�2������.H~����9[��\u�?��z48_L��G�KGe�r0�1@?�U�e��������r�P�k�UBHW�
Avj��u�D���u	>ѳ^p<.�֏J�[[�� "J8��>,a{��g��f�y.{�$��y%�K��=��eu�������mlkֺ�	+e�-*X����j��拆���!�r��E����:{����'��ƴ(4�)����Ӏ�Lޜ�#�C�
�K�c��^g��k%��ANJNG3*]�@�R���˭�Ւ.�y�.����o�c������Ôg����@��;+�����c��|\���D}j�s0�bu�H0MCة�W�r�`��z-~v�x���d�j/dWݪ~�Sg3�i�ߒ����nj�[U����q�?�J s>u��{���A���v�t�F�r,
!Jݍ'dܩ�G�P����.δOr
u��:�� �8��{2�ٷ��:Dm]�����L� ��YD*��f7��m��$E��sʭ(��.G���K��i�)=�l�$�1%5������z@��+���9�Ӡ��uww���� �٠�e>����*�o�#
ۧ2��^�N7����a=�ْ9�g�'�(�^�a��7u�KǻhH_R�׬b���E�z�8�78�����\�����:S��+H\V��"�\��x8�;�^t��Oo�@�V��b�b	��(�Ņ��WO��-�J��d>s��ˤ'�{�:*5��6��ʜ{���/,c�C�xR|�T�`��5���^���H��ъ����#]D>�X�GXP�4p<�7��^j�q��,����Zř�g������j��J`�'�	5�>��~"�׈4>L���)r��Z�u���㻜$6�PK/WUW�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�PK/WUWQ@�g"#pip/_internal/cli/autocompletion.py�XK��4��Ws��v��P�S���L�.�!��5���u,#�3ɿ�[[��a_����S��$y'�"�H5i�3���N�J�ښi.��i]�y���lyK�ٲ�I�,��
��huK�b����E-�R��Lj!jE�Lu���s�����'�4�%y��c͖�WzI�[<������"˫��'�V%d�dT�"���,N'����{��세�9'��j��.vlO�Z�y�R4'���b�!�,����ѰՂ���5Z^ȃ�d/d�9{��P����i��ì��(�k�hn���ߓQ9R��Jt�B�Ru,�{^��H�
��ۇ�͟�xw��.!�����Ye��G2��ƼV�B��`�&A!�_����ls��\����j;�
`r:���J��Y	�gV��+l�Gn��[�ʊe犵��mv�|'��s[1�q��z&fR{��8WCP�Q��U��b�]8w;G����ت��r;1�J�	P�6&���T��0?s��-ђG0��DOo���� �L0�����&U`�͑��M(�E¯���dd�����*�z,z�Ԣ�$��aeUG�lr�k�t/��zW��bغ6ƺ��aTj��1Mn�l����l"�<4Y�c����6BeN�H��
�Y���0��5��hAhr�?>�`^�F4�5�N� ��Er$�A��$�S�B4�e�Qv,�Hf
=PW�]萙m��Yx����x�>2�����Ooʒ��8��D�逬c\��Ƙ���V"G���an��x�"?���/�pLP����?��[�ƷT�x����
U��iI|O�).�ͮrŀ�@F��͞�Lv����ks{;���N�q5�<��He�u_&��|xx��C��ݻ��M��f.�IaE��4�**�j⸹�a��Es(�Ȳ����D�v�*T��DtPJ��E��O
��9�ob�!�D����q�=L9��?Y'�滭Q��$Y��22�T��<YS�_k����>���3F��P�J�7m�g����F�}
��������
]F��y�Mr
�]����F�e}��b4g�=g9���3��3i>�kH�X�Jə�,GJ�%T����7�X�K���/������]F��2��H(#	1y�����,�*#l;f�7�ݫ����j�v F�m[�ݬo�KE��#��Pb��qs�Ǡ�W[2DH߬^o
S��&�$�����!4��/��Z�VR�%q���tP��aS���"L.,#� �I/����ZQ��-L�4N'�k�5k��pǙn3G�*�k-�<�YWn���n���)����	ۍo֟O汏��>�������|9�qD3�)���<�^_��]n;!I�7����<�B�)x��r{���0}��l��7�1��y�v���I��c�l��@��	~�Buj=)����e�dj����U�S�qs�� "��OaqmJ:	讞��&4�r��)�B�D�i�c���u�ȉՑU�_]�o�����C����\[{�@^�
S�^o�3��&��K��r��8���M7�[F�	Y-��2_X};&+oUlDT���ԅ���}<�����ҕI���P�#���'ِa��@��*?�8�#?|b��
+b��1��ɷ>�|{{��!>�l�b�ki�A �Jv�j���EFڸ62�?1���gY~O6��\1{���V�C׶�qz{�1�L @.=���.Z<g.â��%[��`�����D�[�ǖ���㗥Y�>d	��.�<;[��/��J���7��e�_Km�h��(NR��B��J3��g.q�}q�ۄ,1L�h�<�ǫ��y�8�H�������~��P|��T��W��ӀA�rfXi��9�.�-�Ino
!�`2��`��lc��C�#�ʘ%FC6"����2E����>Z����0Mc9�f�'�qCcϙ=fZ�`�h�����h�� ��1)^8�wpA���+��ͱo�$`m��PK/WUWʐ�1�
"!pip/_internal/cli/base_command.py�Z[��~�� �H�.<�:���m#�`Ƴi�X�D��ʢJJ�q���~����&�C!ر��s�w�Ap-�d7�pi̢DX;g���D�u��T� &uȴ�ٶH�\��V���T�뽆�N���Y�	ce�^/���gnD$7"�2�}�װr��H
i�\~� ���JOsv#�Dl9g���s���J�"��u�%r�f*��LcmB��=��f�2��6��*ͥ�0JT�4:��ɲ#��s1�Or��WK�����2��a���[oࣛ���,��VnE��;�d�9�l���\䅅^�����{zzx����Ow�/��ey�o�O�5���~���=�q��~���[}䫇5��𲺝OfCJȷHz�u�_���gY�����Ub�j���Qe��e
��	Ĵ5���Q�/�\*��ܣ��J��PI|�Lk�%U�-�NIl�U�DF��Pg�^F_x&�=��t8~m�s���F��sc�)/�Y����(���Q�l's�����r"Q��N���0!㱪sn�w����>e�I��̉6L9Y
�z��DoD�i�1;��j��"�We�B$2}�x�"E�v�Hcix3?�p�Hr��SPfT�y2!Obs-j삷��ؔ�T$��d������]��),l�dP,��4���Fœ��!��%�FA�A$FG�-�P�O�L���;f�{��T�)�Jw������J���B�-2X2kƳI3!��z�ӝ(b��՝.Ai1�GӚ���­q?�Y���6������g�)�s�%�Vp��*�Mg�e"��ܣ���KB��Ow��W9�9�u�y��
Ģ��L�=�O�˺J}�m��p+��a�J=��^IL����\�|�l��v(�Y��n��������T���AWo�8��ڪ*���[�;m�ü+m�6�

�{	4��R���x%�)��A|�e�c�M�e��Su��ְ����#�R�͆�V{�6p{���d$i��x�2��$�U�J^�e4�.�x�)��_�YJ�:T%��DBi۰X����@>+��ܜᠠw��`$;�&~1S[7���oޡgq��dFZ��48I�IŽ���fZ��� �ܱZ���m���:�O�^��QI��j�t�<�[<@�ۍ���N�J)CL]���[�}�lY�TE�`����ܡ�بD�
�Ty�v2���Ӳ� T��:��t��Q�{/��T]�t֥��ĝL�G5�U���Ǿ��v_��9������؏�
��L9�򨷑�tyVB,�[	�Qs���G��?��uv���Rm#��"i��a�v��.ˣD��!���zB�.N�Q��)�S����}��l֒�Q�KEr���.)L�L��b���*9]xeb��6���e'�����B�ӓ/$����ߺt<��U}��#�%�o\�r��|�>�D�F[l���@�
�$*����,\T��1�.��b2od&�U&<-��t��nɩ�/��zM���m��j�KC��tv�i10�F��(N�˔�����V�V�݌��͏Ϋ������VW�w��������y�P�GT8���Ga�3����X[�$�Hg����N+\�ol�z��c�*�[~���tD�Y��YS�\~Q�_\d�|L@NTPN�9����V!���߃[l�LQ��2I���Ht��m8�gkv�@L���[�H�=�e04'&G�ږ� �ߢ������&���n:PC-\>��j���/W��������.�qI�dt�ի0�aR(lgB�>��Ҙ���PX۰4�3h�q��H��N,[]WY""ĦU
�i����	�7��C�����d��ᒭ݀G�S�=BJm���R.�������,U|�$��[�z��$��ó害��E#��@o[�<؆n.��gP8
�k��"�z�Q�S@�[= t�/뀎!�_�AV��-�:���|^?��a�V{w��lP`���l�|r<t��(�
�bn%�X�M�Zl#��¦"�;<@EǮ���~F7u��V	@�M�_][7�J�Y�θ։:t�6�8"����4]t.��g$�!��o���zg�F��|խ��o�{��Y!��=87�,�B
����ZOvDPD�ŋ
�Q=�u��1"4�H�B�u�&d7.��HsPֺ�9%��	�S#�\�
	)Y囌
c�E/b=g']T5b�U�}o��wl��]8P>�9��9�y�
%M���:{wMG��;şpc.ߢn���8}Q����?�a8�՟��N��݄�G�a"<��iźk�-���-]��ٟ>�����z�N����J�gw�:z�S���f9���/wF
/��]���ߡ\��#�[4�s��$N�o,�)��?����P�+���Z�b�)v�஺ɇ�������ihA�Z�4`�+�c�
��k�ũj
���e�؇�1�p�F��R1D���������о����_�~��>�C�1��hؖw�D
+Ӆ)5u��� �\)�6�6�J����Zy������pc����gJ!.���!�.��]:��d�qv�Q�DLݎ�6�tt ���_��8�w�/�{���o�Tr��L����i�����Ƙ"((��ʑ����:$	��'ז�-�[�	+k!�Ҩ���)��ܥ,)�yCwV��v�ja��A�rளHQ�G�w�M7$t!5ƪZq>��
�ǧh�0
����̧+����/\�:%F?8��f��PK/WUWiZ�H �upip/_internal/cli/cmdoptions.py�=ks�F��+f�"�Kb��rŋR�(��Z�VIJ�R:$�""��d����5/�e*��:WY�����~M�0��^�L+=W��ʢVi1W�U�Y׽��R�u��l�k�ԕVY��R�"+��S3=R�M��X��UV�MZ4Y�h�,��w���4Ϸ�z�*��e��:+n�}�X@Y�T�?��Z󾚥�������Mu�u��iU�:V�l-�[]�*�-��!����FW�?����r�ϋ~�[�5Ξ�ꪄI����F
4�sor�aQ�y��D�u��q/,��)���u���
@�`�ҫ�0
��`�����Ej�i6���j��N`FU6k�<v�����պ���ʳi�i��<���[�|,k�W��5U��-�rC��,�Z� �V9��	����������ɫ���#��&d~�DF1α[5R���F�͌l���"�kD��9.�:'��t�3��7��|��6��=���{�����.�U&쒀g�"��y�O��*�j�!��YL��L���Xd��z���w3-La��V�Z�UUv���Yt����"99>yu��pv1�m���%�
�ֻ.�r��:^��*m`Ҧ*s�Gzz�?�;+��t�=?�H�&�pV�m��-"}���9=��KT��i��v��Wo߼L^_�:���i��3�ؿ)����r5�Ȱw㿦g��H�$�^�"IUiV�L��&�Ţ�db�yU�Җ��w�MY�IO�?�����~$m�ui���y��G�=�x\��J)3�OF���>�3s��vZ�lQh���`����3��p��Ë~�=�ȶA���7Jx��<k���&/������"��ƀ~Nh�^FG��oFv���p�5���!���r���5Ԁ�Sj<V �7+��
I�9L��I��O��/�����VF�'�d�3�W	��#L6�\G8^tÈ��j�$�4�YD7�7B�q:�R�K�P16��B��R��9譤Ҭ<\�z"By$�xkO�0X)�]��1װYWYA"���
��<mP"9�l�u����vR�`Bj2��&�[���R�C�J�}���8���a�Ŧơ}ʵ�����X�_ۿ5�e��� '��
����4��D]��F �����_C��4+�j��E�EB�b~�G�}4�O��#5-w��x�`��:��A�=��>��Q0$nD���mQV:����:CYJ\C����t^����)��Z+� `2��Z �妚ij_e`[Z���뵞e�l���Xj5��-1  �`'P3V,�"C�Z�$��`^V�d��b��_R=�0�nݨ0��!H�d6�h΢�x�|96|	��@ÿ��F����bm@:�m5��'�,��r��9��̶i�2�"`�Q�A���@���L
@��=���L���Ϡs��jSXF�$��A��yVM��|��4��lC����*(˥F<n�\����x� ��T��`�+kb�3X���m�K/�:&t
ږ|&Kg��Q#8�~O�
���������B˛���i���
9��U;��t��������K��c��'5�p��?�hh�$`~����"�j�Ƴr�춾��@����
��^-r�B����y<�-u�N&�]����8KX:fX�k�1�C�#��lsy���G���_�3��Cd���6A��錩0�508@�4�F��t�7�{�t5z
;~S,��sP�߶��uz��r��ٜ`΂�Vo�`X��־��
�ӹ*���
����e,BkHx��d��?5D�����@���6�B)����YUиO����������N��J�c���R�IsyZ���v߹��6;�{��S��'C	u�Pɴ|���� �.���\�Z��M���{����&�tH��a��V:��[`��XV`�#C~
i,�e4!��]�^�9~����O�o�_����%��,Pش9l��7XR�'iX����^�4������D�b�e}�F��S�3���MѴ�+/�{�W@`�M�hl�<k�=�;1~
�EjC�y��l�kY[Q���c|����G��5��n��r����'0��EZj�فL�K@�:k�K���N�Pz�qs�Aޠ�z���fH@���O�+��"�!���3���
ȴ.�9��R����ٛ�#uzq�A�\�]���6zӇ��{p߆���|��O��Li �B(<��ٮ5�pYf3C]�P]G�	**��&�o�*�$C�莒O���	�`0��PzM��bq�r�dȼxz亭Al�}#��x����׈��>�t���?��Ð���|���,Q�S|b���t�
��L�P}p��;
AO�����~��!�q�H�՚�t;���No�$J��=��T��
�`�!v�2�4%��g;ǿ9p���
=�e�ôܱS2��p��YE�40w�cy�=R|#3Sy6���{�1l@�	��[�m�l���9��d8��|mV1��H����V1}�-��n{��x�mK
��7x�-��:E@���=��x@
��JO���k����yC
cxr�a��d`zT��5��s����z��񵿜��w�j�R�f5���B	�S�#���𰈶��r݈�b�1����Cy�X�%Jg'�d��+�j=�6ct,�2m#�y��KY��X��4/��݅�p��R)^�A��	���w�D@$�ay����K:�F�!;~�e�ns��<˜G�\<�����P���I���1���,>���gF�F��Z��LD���_�ӎ����$à�5?[�� R��zfk�=����ԃt8�=FB�J�z,�Z����`Ggv)ֶ6���.f��t�,F1Z1�`(#��P�)@����4A�K�U���:�+���GɅҼ�ml���:�\���ヶ�?�3�<
����>\��ӬO`��1 }|��0�
��(�zMʇ`�_u�*�G,�i>1!%�a�	$U�+
t�l�� 	�9�G���=Zoי�D"Gf�6C�|�7L�k:<�>��OAeC��L��9���(�`G"
FW�8#
�`Ȃ��30�d&��B�$����^X�B���w:>?RНx�>�@9�<��{4D+��J�)�TibQ�h9M���P�������]��s�� }j$�y
�kcqa��|= \p�sS�.�J6�I�Vm(�W���IW2����kệ�o៑zQ��Ccwvڨ1�M�|�g�]���o�ӱMBm>�Q!#��q�e
�X!C
&*�\��ŝX�e��I؍��fGnc#䘴�-�{`�zF!p����ŷ��MIG���a�	r��_f��4�6c�f�	�}`8����<�)GS�ӑm���f�}_��rr�:�J��r��Z�Y��ck$=�Z�a�eY7�#%������(�[��z{y���G	����3q �7��H.`V�Y:Oe��FT��ۥ�{��HZ����P�Vt�����2�\�306����=����4qx;1���9�GN��Q��=�؍t�$��L�2lmT�G�]�!�9x�B�yPv��e0'Y!��>-���/tiPl�i>U:D�������ӑ�r��2��3bЖZ��gfAgt��Ā�����03��1�Z��u4d
Xq+P��MI��[(��	��b�j�9�G��~�������ͨ9X&� ���d`Xe�4&�3���6�F�4�Qq�0��]��i�Cj�f�z��&0Y0�׵���6�w¤����M��1�A�x�(mUh���,��$̀��)�F�_9/28���=��o�D��?#�b��툚�Ḱ_͝g��B��.�κJp�azs���� ��q���/1�G�R�8y46ف"n��:���`�r���ӶA��(��J�����#H�e��
R+��f���Ap����u�C+9x�ƌ��#nv�1��8n��H-�ܓ�I������&��z� ��%G:eIW����
�܉�6iNM6B�NXѣݝg;ʞ����S(_�GK�<��>!B��x�y?��|Gɗ��N��H�J~Z���D�A�-�Ø�K�"#)��O��)8�,�K�$bf�NL�z'�J1{�˚B�f�h1�*��%D2A�W0��{�Zc���o�t�i�c��`m<K+���*ɁZ��+�I~��N�Gw��߅�%q��O�����L�������(�F�CvW����u{���iF�)�J��<�܉燭;�݀t;�P�=����3��5�|+9#�����% sx���欯X�\�`���؊��r�iY����2ۘ*?s���G°�(���
K=�����l��7�Y}���%�x��[oS�f�2��b����p�o\)!%�܄EF'�3(�9�ι��/����7��E�M�""+:48b]~S��bm���_��` �<1q�_�uT#$8쫿�Gζ4�:F���v�̈��	����ha�$�3�,P.U�-/�j�M9��gJ�c��;�}&Y���j�]ܞKȢX2�a2�6��P}�^Lv�z�@��0.�,+�-E�W^���ёz�Zi�4u����0�b@W&�7�[�qC	�W7���%�yX.`V~M
��X���'77<Ѧں>>?`!r�x��1����Q�L`��PM��
�1g�.R�n�Օ���r�5��[����o_р���Mծy�Y��ڳ��[�����zd��������C��3����>����V�1��kAD5ú�CG�}%�ƿ9*��+3��/Ԫc�
ꡪg�n���U�������z�� GW�޾t����ZtOG�Ӈ+w���e��)�žl��v���z�=�#��@n9�R��۩���2���HEw3wzz��gzI`ԥ0sD�36Y���fl���B	P����D!��E�U�Ո4�y�
>pZ<�c�߿��x�e�o;�J��Tf��]RO�a���q����,vCX�v`!E#<�ze9sOǧ�r�[~mI0��6��3�W��T��-����~r౟���:c�oYB��H�I�-(kqޚ�Xر"�������`3�����m+3C3�a#"�(����rm��.��Ҿo�#�v�M��y�}��):��G�Mz���پc�#~<3���bW/��@¶ܰKVH� <�o՗�u�\�ґ�ЙC�.�.d�>�>��B�a=���L�66�,
�Ư��n�	Ct6
-�����H|�ݝ��]���w��)���(h�ٮR,��Ju`[�pM���
l���=D�m�U�Z��r7x⡫����q#�/r����b�K%�4�9�o�))o7�B'����S�m9A?X�Z���7s_S	��va�@щ������kB!���.I�E$�'6�S��I��O���/�lg���x��q����u��'8W�t2h2�C=13:��n�ߚ�k6X?ǟ��<�����,+
h���1�&,��i��a�:��^	�pP�E�h`��W�dߎPc�$&��� b$���z,�E�8ŤH��UH:�0��y��c�#܆�r��/'��(��'wՅj��|�1��xhc��9��W�^"��q��΅��<�q��bh��x8��βZ7kcH�^&�	�)-���e��p@k����E
��I���^��E��l��U����M=��S�,r���W�l@�=XP/�޷��H��0Ha<��$d-��_27X���L��zH�y�r���9P���I=Pg��b^���nk:���z�ۭ�����̀��Y�.�C�ܿ����J�G���־�
3	jW+�
\��"r��s�z`�\	ݶ�kh/��3s�`�7|�&c����:yJ�2�2YYuW�r�p�Zf��j�%”}C��&��	W��f�4�[8�zZct.�SH0��g!�SA�9Z��N`v\ d�п����
(,�:��.l*�'�&֡�H윞
f��^��;��j��Po��B��0
����7���
6x�����Zl0�1��p�-X���,����̫�gN������@�z��g��1�7ی����6ď~�R-F$�	�	3�o�c8	�Gѱ��s-Y䢬�(�ת��T�Q��p*KiϦs	�:
Ɖ_f•?Bv
�a�s�7�Tt�-M�Z�|bx;�7��;�)Ap6�a?�w�A�3�R�aև�^� �`M8{垗l�1����G�o�-���f���1��=R���bC�N�k� ��6�	��e��Lu�b���u_Dgfjj]�5�	�-�z��{�d�/Ѵp�	�5{:�ޚ�cF;s��~9Z���s&�{8���O�*��}��<V-�B�e��
�j��[M�X�l;׷�l"q��ge�̡�[t(4��GXޮ�G1^ϼ��Y�$�A�_��N�������Fѹ���bh�7L�#���eѱёH��2���J9.=�����Q��~2I�Άz�����y��>yL�y�@���f���w�ﮡ�͈*��a���I/[sO{�@�@C7�`��͡	FC>9�P=q��p����
��>k��`�"��!l���̄Vj�x�Ĕ�*#p�Ɓ�օ��]�;�Ô?���`�cv�b�x0(]Go{��f*fpQl��Â�.#w�At�i�}�>�<d��PS/����H�>^��{:I�e�\,�2��%��?��=��(u
�����J^��zFI�za�t}@��a4�wOW��ýs��8	����%~�$���t<����~<6W�HF::�T��V������dN�#��r�Р�� ��]xi�L��=5#����/����Q��f�;�	��UV�3�
�l{,��o�૾���*��'��!8�s�9܀�4���M�r�s��V����t�KnʲA3��KI�����U��Heck�j���2�܅'�PI��t"r�jf�Nw
c�"?*�T!8�TW���'������JW�:�oO�B�u/9/G�lp�8����d����7H���i|�
��o��m`�F%atվd $J�[9����_�co����#3�V��f��������Q-�ә���9���g�|?�
�r�5c��z����������\��4A��3�9�8-)4�.��-I�G@P��UM[V����qw���`B,�{�]�`àG{�]��A�05�o���e���Ƈ�����W�n9��#w������{o���#����I��$Qx-4�LJn)�K�@��.e��n���DF�4�Ct]ϖO��A�5�5	|�RΖt�e�lhN��p׍��cx���.�EYP�;te�>���=����{�v2�kk])%�+8W�m�H�0�`��k���7����
�Qjt5U���M�Ԫl��kưq�(X�.��7���(��#�7~�l�����j�D��z�^�o�B
cE�p�`�~p�
�Z��_z�A95Ѧ)ѽ`��M��"���R*t���k����'�}�ۗo���VE����~d�&ţSN��3���L�-b{�Ӈ.�Ɏ��ym�1�+4�#�KĚ9�	��.X��A�	���xf��A�ɡ!�d=�Y�)o�p)�|`j���3�#ȆMe�����'�g��أ������������ߎ�LN�������㫟/��[h"[�;�<�1��|�ZC�fPI�ˋ�y�õ`�'��ad�h�#��D�?ڬ��h
���Z�v�F��n�TzH����)������2`z��=Sj�b�Ȉ�U�Sm3I@�y�
ôG����#�
]��!�0�9J�.�{{Ϭ�����:�hN-�w��j�"@��-�K&�o�����oC�@6
���$_Ypl�GL�f�}�}e���i�e�=�[�=����d��,7!�Z���}�K���\_잴��>�m�I�ݬ��N��z�;��S����\���A2z�y_�"섗�O��kҒs��}d���x��k�6�����.�k���'��7o�PK/WUW"GM-+$pip/_internal/cli/command_context.py�R�N�0��+�=A�|�&kL�z�x�l�
�nci�0��A�Ρ�3oエD[������પ-����?�qXI#�������G�x	(ɺϬ��]"c"��mD���g�J�e�B�˵lGW��#��͖qW�\e	5�˘���Wk`��j�0�Ӏ����H][T�?���G�X����� ����~�MC {/6��y��;���4�֕��F|�D�Oܾ��V��A�z��R����(C�8�#<'Q�=�p�x>{�.���O6WrA�͊�t.d)!f�PK/WUWfn��pip/_internal/cli/main.py}Vmo�6��_������ w7�@�;t7�CQ�M�Zɐ�ٰ�����4����I����S;�B�V��A&��`�	e��y�v�uAh[KM�]�)��[��?���d|�:��8`#��[��R|�E��$2����.9���V����n�]��_��4wR�j�Γ��⮂�N��M�t�g�ڑ��A�5�N:_���9�ޒ��'��G	�,c8��fƵ�(�Ƴ����QU-�,��06��0�=	�X�F�b���>bNGBy!���0�(_��Ɏ�=��?�h%�/�מ?������k[��^Y'l3���v4uʎ~���D����Z���
Dn5�=g��Dے	�+��3o����Q��R��0���2��ٚ�����f\D�x�����H˭u��A&����C����7Y*{M��G�����Q5t}52�+ȭ8ӫ#�d':'w%}�%�����P���C�QBf}�M`9��Q7�`ݓh�!�b�'�Mrґ��+�\L�JL��+.D�~��Kq �d�!Y��q��
o�)�?HS���>#g�Kq�
�`��1	gYs1�6�cs?����l�IBu��5��ۑ���9��)�tG�ȽU
S�2
��X��A�3[�j�glgb�g11���օ������y�������ZzZgWX�=���ۣ~r�K���/E:?N��l����6��b��.�M^U�uU�"ڿ��R�b41K��3�e�3W��j��D��/��.�{ϥ�*Ppm�Uh�q69�N�#��LnL�e�-q:��#1@��6S��j����?p��=>�;kh!V�@9�3�H�8v�/�!�����û�c/��� �c(",O]�
R�P^6�y$MJ�g\��fN��
�g4)�#ƺ�ԑ	��}~>ZW^h.be@~�l(I��IS�-W��R��g�*�D���Gl��\u�@"I�u���s�&���&Z�-f?XӪn�G�~��r��ٱ�E_>�x�S*��u5�VI��^{9��3��9�����Ք��)���J��4��|t6Ƭ�
˕��b����|��@��|�}I�K�y.���w'���x�X�)00ΐo2��vU��a�F�.Wη�
�?�����oq�^�Ҫ�n?T�oo�"�/ �n�0�-]����p#�<�1�k'}ϵ9]3kGd�Xj�75/��,�
mǮ�o�����~D���;qp%k /%��"ї__ř�[ͳ{S�ռ�™&�)'����l3~'��?PK/WUW@�ze� pip/_internal/cli/main_parser.py�Wmo�6��_A�,c��s�-k�����-Q�H*����"%�Q�h#����sϝ�(��h.#MEsFJ�H.�6��
aO�D-b��)��J35��h6�u#�!R�'��%s������J����?sm�1\
Z%�m*6�4ޤ�)���WE�ă�z`&S�t_�t�6���y]H{���b����IQ�C�٥�$�)(��wVҶ2�OV5�R�Ԁ�I���!|�w½g���x�k^Q�yє�����;��I)9ypkx�Ӛ�<�dLi��I:�fYF�*�Țl�\1jX�)κ�D	��w1��f����n� ˏ�[��+gv���R̴
�t)@�t�����/���	�U�_�遭���wx3��#ٺ�W�E��A�N�>��f���]���x1l������*8}Y�p{�Ep�������O7�U/�ۧ.y��tz�wx+�LъxУ������d%�&��L'H�#�1�����%-�G�!��^�G�X��2�D�V��T�[��ˈT�H&����\q�U�-����l��FϘ�Տ?��gg�_�T��/Q��ڄ����s�
�1c�g7J���g��#���u��&<�ve�&/�Ys4we�4|�Ҋ[���L�����E���+����	"��F�I=n��()�b����! ��2-�
x�+)j�k���������zi��Y��zw(/�k󚻴���h���p
�����s�C'�.�
���k_�pF�����,ܨ#�Ksg3K!4��r�g
`���\���h
î8�@�|}|t�E�P��h���'hv�J}*fVC8{)��:x�/�3�V�^DG(�PT�KΊ�)���_�Hd+��-,-Pm���d8��L?�_��i��j�K�7H4����Ě;�=��v¡I�Xō�.7����r�UɞA��<׵{�Nvn~��"Ia�}��[��b�tQ�ΗK�k&[��i��9�I�����U�����F�J�w~��i���Xڅ�d����XN�"Gp]�m��>K˥���퉭��+F*�./.�����b�Gv�ɮo���r��:�@���;V ��\�%�"P�S{�z�	<�K��T;�"���	��(����[��n�h(�J���^�O���	��\"lU��}{�H%0����u8��N��J=8��f� HYу/��yRH���@A��q�YUB��6��
�W/� ��f��۷�î�aMGX�,��e���t�7h_3)$vW^L��3���2����I��-�[��>,��⧌�)�����j@� �/+��^��k�"�a�Ѡn�\���u��Ț6�M�� Q�xb]|[rXq�4k&|�=�k}�j��9ZH��v�w3��E3��lܿm��!��S11�(��QOm��L�g	g�~�������"�d����F��̡�����1�6�«�+������.����K4�S�G��VR�4X�弦�=#Gْ�Q��g���N4"K��]��>T��b�l�}�^�9	cA��Ep�ڍ���j��N��f���PK/WUW����1*pip/_internal/cli/parser.py�Z�oܸ��QX��J�C�,.AӼ4H��Ң�[����Y+�D�����>$R�'�
��9��7�M��oT2":�EK:�K����%Irr���i�n�۝{��z�{��A�f|:Jw��Wu���dۋ�D�/~A�С�z&����,⾽h�9y�+����e=U���{.�ůCװ3��]Qr�ܷ�)��RQ5Ȳ5��ڗ����_�ן?��(�-�
�
��z�����}/�%��,\V�L�jZ��j_�r蛜H�+q!Dsr���?s�.vL���Ҳl違evrrR5TJ�gJ�Κ��T����H�0R���	�4��t8���qr'W����='[7�F%�p~Ͷ��}rU��d�6'�h��+��G�.��nj�?'D���x��U:!���a��\0B�kYM��ڏ��6� �b�sm�#-��:9Я%R-�dR���b �r�U�p��=]����oƦQ%H�A���ai�~�!����\0b�@V���B��M�3.���`�kiEi^�&��/� a�$GP�зge��y��cܴ��X���ۃZ!# ���rs�<�$���9I4�%�hC��B<8�9��Q`
�6[�,���590E�Y��dV8�0�L���ʽ
R9���rŠ݊�g�۳������esz�V�Vg����Z��"Bl�8��L�s�Ϣ��j�$07��]��:]�3�b�p�$6��jX��dF���:��4�ҧ��ؾ�d����N�0ƌ�p 8�"\�V(2��N
��h�„(7�h�5z�{�z-�:SK�M˼X�J��w��.�g�{��k��#,�Db�g�%Ʃd�d\u·��IV��ɂ�A��|�;����u+���g�$/��i�u����k
A�0�ly����	��xẈ.~�;��_�7��-��l�FNd�0�ߦ�%���f�\Z@|!!�#+'���:�W��i4p�EC�K.Q$��'�m�JȮ�٢AZ���m2s�z���K��m-�`k$�gҫ��p�)��H-�1��q���8m�@����3�,Pv���dZs�Iu\Q[��h�C��f���fr4�L��=$�m~�xg����&7Z'��7�'4���ǰ�R�S���:�8@Hk���
�L[ڶ%��|�>�)�Q֚��~��w03s�	�Q.D�����\!��+c��E�����Hq��_�p~�{Ŷth�w�O(�% [("�z��3SH�D�IGl~�C�.�è[[ (	F��\S|=䀟!�����Pu���
h��Y� ��@��#��2�,�����(k���Q�"s��t��4h)-�c�4P�A�{�⤏�H�K�$����RС�z�����G��
�2�����n�:��GmZM9h�8�3����p�*���BD���d��<��Tt��X���7��딼�E��&��k��;45���߱N�;Z0�b�1��k\�Al�E����@��%-_K�}ѳ����¬<��/:Rc�	,�9�3?�F���,��+�v��y���+��)秲n��[$��wzA��F�:��+HîT/|P�s^A�:d8^Q��XYt����z�m�fݥ�k�]/���q����TB��qB��S뙀6�p�2g�X��d]1�U�`ú0i�–�$�
��q�^M)��#���YB$QX#q��R(0r��E`M�ƹȈa��zϫ���0L��H�=�.m��d�ݖ76������Ůx)�4N/�[�m������2��R�+.E�����h�
���}&��&�[Z#H���M�tS����}Fr?ґ�R~X
��%;Zxkj���T�B?�v�z�)�4��Y�׊uj��?q�n�–qL�@%�J����z���POM����p��
�3�.����f�}
�m]DJ��a�>��=��׺Q��")mrm	����u��(m��th-JA�]������Td#z�y�Ϙɒ]#.h�䓑@Ͳ�Y%^�;%�М1��p��Jy��ª��M��[MbX�.�٤���Mo��z�۸�z�����v��� �������0����S�w��·N���1�f�,�u#��ŰK_�J�!�����ٟ��-WgҬ�Q3R$y����ŀl��7�,D-��vZ�*F��$����l.;p���`+Xۧ�k�M���o��1
���|S��~\������-�phh1�9j��L/�*�|�R�ᣡk�_��W�(4�;}�a�9�16��n����f����0�R
��U����-eRA��(g(�$�)bXoO1��l:�1�z��0`�^=8�W�1�36V���u䶅Բ�B�%C]�}*��B!�P*JZJ�|x�y<�V�^�����3(�+�uz��xT	���s\aAI/oڎ�yB~B�EdB��#�!<Ũ�]�����bW���܄u�0�y�k��|� ��}�hp��i���(�o���4͈U��X̃��'����񊇤oT��E
:�~���Y����Y�y�"�uPH�]����k@wY(2a�8-�h
;�����m��⼶���	���)���1����� ���!��KF�L>nŽdPr�������'X*F�bl��"U�i�B��55a;�C�������#�t�lDwx=HM?D�b�ڲ����3b���'��`�6Z�xT1<�lAKw���CA��ք���M�>:��Ch����/�/`c�S�2�"b\F���›�f�ڠŠ�S}$3�80e� ��0zA��_a�s�l�5�El��ہ�9|��lα'�wJ��#�+��z�Λ�d�:%o40���4[_�jK���k�_�H#ܘz42�~�n۵?xԟ���x�P�K�P��S4�H�a'(�X�W�=�m�QN-RA������a8T:��ff�E!�
lj<W24'l���3�>�� ���ߺ1#��P1ؓ��n���R�
����\;�Rr!�wg��4��P�]��2h���m�꽨 ��ukO�Ǧ�i�c��<-��oO����L��P�^�Z{~����v(
�*�ӻ-V����M��m�z��,���%}!�;�/�tO?��~�6��:C��d<��DwL�"���>2��x�Ŀ�\E�����#���wŀH�k�Vv��s��ٚ>��x�D����z#G�'s?9�B����6�ڷ�\��PK/WUW
6O��"pip/_internal/cli/progress_bars.py�UM��0��W��%]��R)X`���ު*r�Ikֵ#ۡ�g�{��R{<�:�<�"��6�FNki���#�s-�D8��R��nQ��N�>9Z��v�ھ�Nh�eM-1
`���;�R�Ԉ��F�
Z�����-��J��{}RR�rj�($ދ�8�}�滩�=�BiOM����$�-�K��P���pe+4�5��i�B+DE�8!m*�~?at��<JT�{Ƣ������B����ͦ�|�;;���H}o����
rOs�Ӝ�	�`
�P�U�!�����3�d��5PMT%\�� �'�Y+����"�cA�ӊ%�‚=�F���<��!�	��
�tp�%�,
�W��i��8�$�*"��L����â����Y��i���x�wE�6={i��0����/����򛭒Ƭ�b&�B*�>�^�o�����˲q��
��i��%Y���a�����_j�d��/������i��e�v�W	��B��&�XhUf�_Z}�()n ��e��1W/�<^�sx�J�d�;`��;0�]U�@qhԣ�avgE���N3��SS��a�e�/�sU`&Q�m�jՉ�϶��d��	Q�)�B:e�C���AP��	[(�1v������#�
���4��6thc}���5��Sl��j�D��{�< ;^��ϠW��V�L�~�H�57Np?ڑ��_�2��4��O��ܵ�8PA�U��'���PK/WUW��&�)�G pip/_internal/cli/req_command.py�\ms䶑�>�����ʎ+I�*��-)^U��:����k��!1D�!Hi'.���n@�z��J���xi���
PQ��U��J�n��i��gU�6��,/3)9��:V�Ë�bW��ȥu/7;�NT�TH�����,k9>ʘ�M�f7/dMs�j.ɪ�[T���eE�P�uV�cv��w�-���
޲<k��(Ew�6��U�s�#kEy`b��m��.�~�,߉�����ʒ�N�{XK��B/�W��r�x�Nj(�=^Y��Y�g-͝<�Ŷ��l�WyWץ4$�Z;���m�t�x�_�5+{�{v�W�����<=}{~��߯ط�a�.��V�C���r�n���ջM����-��sX�0ɧ��)>	6-�i��3
cԃT���:2�E��^��K7�u���_.���K�I���m[�+v��{Q��^�řh�qh �� �,9ȧ5�]����<���(J�J�tgO�B�A�y)c�q|XDڴ|;��y������G��wis�v`uFM��=��x�P�w@Y�@�`��Nu�>�������v-�׮�X~��=1
,�!�W=��?z��=��+�&8@��d�(��o��\T�B�;��0�lS�U�u	V?�L��߆���x䀙�Gs$SkQr���8��lz�9M����X����yM:H���}����۴��1��wѢI�5tE5QoC�����|ߤ�h}�S0J2��j���������k�I���Ռ����ս����I{4�Ծ���	�ECK9���K�t���1X�%=[�i��y�-��oY�����N²x
��<b�|���$���� zĆѢ���l�͊}�Ցj�W�	�=﷌0��i�����$�e��}&J4	�����&������xbw{�3�P&Kz�\/���4�m��?d-r|�		�`�rȑ<1X�

�`@�۩n��aa��������U�"�0��,��?ʾ�#�뫁y'�G��a�&�v��@�����͇����������
*
a"�}�������@R��y��*H��$K�
�2p)U�Z{��Q<�C7���a�K�%�7)'r�2
dJ~��Gl?�Jm��g�+�?y{zW�1�QTM���˼��aljD�� �\��ϖJXҵE�Jx��-�A�����]7m}/
@vz��0U9xC��g�|� ��Y׵K�uŢ�V�G+����ܱO�`$h�m��!{��^0��G򩋳a��mWM�t6P�6sX<�TM(���`=���^�kk�`N�[L@�
@16k�Š�V7PP�߬/�AeQ��`��S��y:��Y�U"+�Η���`�s_�'J���c���U��4�G�h_a��ט� ��,��"X����$�+[a2$��r4J�w�z��
Zk���)��I�p��0u�U�]�5��Vt�~�8�Xa��9��Ҏ�������s�0�y0\�Y��Cri����G>=gc�)����\��F����:��t�j��nѦ]��:�'l��$�WMg���.�A��p�gC+�9d���QR��1��c4�t��*��a>m��K��¨U�Z��ԁ���O������&=x/�CC��%Ab�~�DO� '��NƠ�ܖ^o�wbd�b� �h.��DG�2+6�b�D��������DTo#A�`5H���$�����`n�,no��Zͱ.q�m#G	_���mU�@��<[oz|��.s0��Z;����*O
�Wl��@�������L�SZ��Z��S�wB�>0�� 24�~�6lMpB�.1�p��vN/t���j+n{,\���_��^@Џ�#��N�aV�f��v?���q��{�Ƒ�X��b�¸� La�SѲ���x�*V�'�CC
�����u��ʧ"�>{���?3�4��@����F�y��W!�?��ŕΩ��0_����eȷ8�@��K��j��Bhj�؍j�T�m���ېY1�y2J�Î�-Œ�W
x����agux^/
�$y[���jh݂(T]Z�=�8��^`�Խk�Aq�v1c^�w�$������
p���.�si���������*���R7�|> �|�X���{�[���<"�D������c{00w��eVs_����X	X�򷫱#;�Q0�'ʃ��j
Uӑ���R�	Q�įN�.�xY6<��~x��I�7=b.��;w@���	]

����ЌU"W^k��r�W�i���?�E(?!���l��Z��MY�*�WM%7m��8m��g�1B�+\�[J��������W�~wy�ޜ��:��N�����i�.��/�g��jy����w駷���鷧o�C���7�QV�Ϻ��5�TlӶ��L�m]뚚�1`���<HC���}ʾ�I2Xc���U.�l���npWWT�U]�Xd'JP�Vt���-'*�|��' T`���g,A*S������f��
(�1����6�]ӔB͇�2\�Y@ph�cR�oC�9S]��D�Rt�����/�؋"
wx孛r[r���F��t�t�z��:���e�j3���t/2b��:j�X(p�}Sd�L��4G_�Q?���k��XYm��:�)�0U=��0?�t��ç��B��ʥ� f���l��I�1IȞ@iQ�2�1��%�Ac��b���ۗn�w�(IX� �o~a(�����6��ŒɊX�$�p�Q����k�-Fc��Q�^+��B �Y�N����K؁��$/h�j�h�9�H澵�EKM�֓6vG� �b�b�۰�h	[+�πN�!�x�d��ŢW.�jk��H]��<��f����%�_����IJE
,�����hK�Ғ(s�Cg�Aa(��!��{�j��q���Y����]��B
Iba�=�j�XR-�l��Lq���b���3'�F�wǕ���X���c�r�Jc��K�E������8(nR7�U�ǿj�6�� ܠ���# �9cFdu��
�1�Q�j�Xv��"cHA(nP��2��,@X���e��w�qG��dcE=��U�̲<�Tu
'�=8T&��2�c/U����
��T疓�K��vNJ�Q�H�)޼�{���.uT}����HA	d�t����try�;�Qb8�&-N[�e��g��/C��K��� �N�;fFA�ڃ:lH{�@1Ǥ�;�P�|bxodˢ��f�am���}�i��ң��,��ґ���}�=�l�.z�8N	����⎴�g@�NB{�x���3'�i��#�f��N1�΅���D�k�F���J����l_�sO���S�.ؤh
���0�	��+�J8kN�O��n"�C����\
.���9�=*�gھR,�b��{J�ֱ�u�~�S�Ř*��c�-AВ�ic�v˦�$��
_f�<�x�
f�����`,��j�_��:cL��sxν"
�UMF�CqF���ih���͕���qڬ�f��0�<hO�AP��R�.��B�+ފ=Ew�]34���nn���I品��C�P@EL~ E��i뢧�<��p�da�m�{��^�����g��2�:L�vK)"��������W|�O�`�I��G[mN

�o�����*0����c����(�3$ˆ^���t`H�_�����q`���X/�MfY�>�X�lG1D��d���w�.��w�BO�Zͨsbo�&C�I���cV��~O������L�7��$���˳��֞�Ο����i`Dx/q[�V�>��o�u=�LKU�c�s���˱�u�Y�ܶR���[p�A���,Fnk,LE������;L�ѧ�o�{��iO�1�[�8�?�]	��G��+��L�B���b�mߵ=z�kH��)�)��Z�bgboC��_�`��5o{�2R�,zL$��!��Zo�	u�L7 ���}�pT&)֦R����C�v����!Xy+3*w�cE�C���
Gh���`��4���x�i
��ͭ�ߧxO��%��_5���HI3qM�z����x�Ĺ�6�v2~0����@�UN�h�*������K�f��a~`�����CF>2?�v9�d����$O�
�}J?Ggt�	�|D'���/��g��/���/н��u��v䟽t�I�;x�To�������-�Pܧ��=|c�+��JnX�HoOR�i�F��*��E����d�"��0B��"��֩�W �u���~w�]�߉Lc��b�s�D�
a_,�1ElLg���l�h��":��4+
��3>�	'��ݔ"�^��̥IO{�E2��ÊB���d�E:�2�V˔�g��=�T�)#���ý�+�?�9�q�����a.�uN���w�� ��Y�QsT}.D�\9��o�^$�陂yc�Ų���{�����+tNb��@��Z�^�אtxU�9��y�_ӵ�<��3�=�kG���]�Tn��hɏ�T��ˉN�.-n˦[����x�W�by��AV�Y��O���!v�V'��YCj�:��%j�M3����DX_b�qO��}��tt28B��N�f'��b���&�1�N�`�^P�����{�Q��e+y�xU�c?�����2��%8�3�c���Dt��ʟ��9z�͋05x�yS���) c�D,R_LW~V�����݆�$�Q;^nE�Io� B�g����2�s�n2)r�V����SŸ1�
��F�lS��������<����ؙ�M	ꁎ���%+�Μ+4Gڜ�&k�]*��`1�W�>����&�̭m��0U����-�����hcJm
��&N���2��b��O���:�[�u�@��D<W�~�����ru��9p�e	~���V�KJ�ę5�M:��O��<K�W�Bֺ	h�:^(��zr�t)׊!�'��'��3u��vZ)5	+*�N�_�H�?d�O�&'zM��>�4E�����R?����B���Q[����#".*Z��˩���R�nD����}���m�N��;�e�=�$����d�{t�޵����PK/WUW��Yɞ�pip/_internal/cli/spinners.py�X�n7}߯ d�i�Mu�"q��
�	�`�KI�)rKr�����e/Z[r�E���r�3�᜹��
�-ɔ��|���-�V)a��.ի���W,�k�"vS�������$��*=$��JR�ނ�C��ZZZ.L��UAm��rr����b7{4��_0��IK��$qt��Ie{
�w~�?�J�b�� I�LPc�L���bN3v�|r6'��ab> ���L�HsM�aX��U!�
�Y~���}H�̹�f�E�SKsL��_*5��
���,���aМa
�p;��kޚ�mŌ��
jV�\`�����ȟ>���ކ�yh�-�'�7���c�kX���gT�͐� e�S���0_�+R7�H���&
\��o��<7�̅B�������gA��x�p�4
\�WM�s6�M��թ�����v�F�{t(��*�ʁ��.���fpG��C�*K:���M歨q���~s��>gp����������<�x�1��4%���k�ۥs�� :D���F��j"���.��%ny��V���+�dž�hvc
�9�[E���q��!q��\�Hs��8Vu˴��oR"'.�
	EbEn���e-�Q��E�����ݮ���';{�����gj�λ���P2T�#�3W��D�:zw��@�ug��^�\�HV]R;�S����/Ekۗ��6�l�e��	��R�o�����A�$���E���/;Iۖ��{�ay-� mϝ��]"O$�;PB�r5Ch�Sm���f.a���%�c7�!a6K!��\Rhl�5QYF�/bC�Jf�0`iC����2�YZ
;@�B���ƊN���ղ�!��0Oo�������X@�H�GH�E�d8aV�(!.[^
ns��6�7&�Xqs_Y!C<lĿW���G�D�C�hG��
���,�����k��*ڿ���䌊%4g)�s��=��G�7�vVe�6�4�tpѥ/?����:�DC�:���>("�����yxO��&��V��ʃ�؍��[NvS;r`����ư��p�u���.5�H�?ä��9���8FwU5ݺ������õ-s���w4v�L���-�?WT9:q�U���}.���WV�fWݬ8���9h�$�$���s�2�����1à��.K��b���X�9��x],}V�q�(ɬt��@��ex�z#����0J�)KA=Du�� �t�@����"b��FPyf�:�Gg���u�}6��@ŚnLe�����-��9_�ڗ���a�vU�
EF�M� ��"z���y�޹��}3ɺӴ"%X}|g�E��Sc(�Hg(6w$�	Vo����K�c��f�6V�#v��3��QW��s�
K~a���:��uY�;��1��2�D�"Vэ�mq������X}���S�ˁ
�擷�ק�W�_������'���>�����=�e�a�n�1��q��`�Aj���h����m �]X��W�pA�%�\�G~:�� jsf*�!%���Bi��)�P�&m�!�Ȏ��4���%�����%RF&J�0��fχ��V��Y1ȴ�AE�)�F~:|�ɉ*Ѣ8xƢd�F����
����0�������j\l
:.x1�Ɣ̌���ɋ�i�=y�Z(�ڗ;0�8e;�Z�@+���ݶ���7�w�ш2[A9H�PK/WUW�zKXt!pip/_internal/cli/status_codes.py=��
�0��\���2@D$(iʘ���6˖�RB�0�P���v�3Z�j�Ԝ���F�
\����/V����@��\ӆ�q�PK/WUW��1�*"pip/_internal/commands/__init__.py�Wݏ�4�_1
��6�\i���C��J�Zu��i�:v����g�NZ���f>����4MY~`{�V�	%���ЈIu�Ta��Q7�8)vIit�2R��	�l��j^���<���!�=���V�N�n�c2	r�2�
�AZ�K����Š^����J
w��Eq���.Zɷ
s�
rɬݒ�
l�r�K�I�|���B�� 
�-0ص*�@�Pqv�@���aJm�"ЭkZ�Akx��N��Q���(D8",rm��1���n��_�k���yK+���fcb/>a�:E�G��U��W��NtZ�����p�g�ؐ^ŹOr��O)>��l�R����P�[�3+���mx.J�c�tp�ze�2h�e0�����P�X�9�o�B��2KF�_O֙Di|����R��TR�����<ϟ>]6��.��ԛ����}oجg.�#%�R�b.��^��]O��1�^�Ѫ/��E1r��@��r潊�4�����"O?x���Ӡ�/Q��2��V^c7�F�����X��
ǫ�˃HӅC�@M�]����0Z�kDR��p�N��'|�B�P]#��>�E�u"W��"#�����vz2}ט�燹��R��~ǙZvSUT�#}k�y�8���*�*�~6H���ؘ1�g��-5N[�o�^����-�ؼ��ݠ'�S�2���=>���k	e��ٱ�Jq��𙖣��!Nh�kK�$�!"��QP�O�)�<#�3�F�dB�va��.o�6b�\|A)��&�}�
Y����ӭ��k@��+��Dn�	4H±΁ıq��C�%�S�W��{hv�5����~�…gXC[�C��} \�ެ	|��A)���,"å�c�F����$3;��'�_���(:q�I���%�3w����o�o|o�N���n	KX7��x
��7�Ƹ�9�
}sЖ�{���dr��������v�D��H��,���"�����m�v{�p�7�`�$�4}��F0��%�x�!�m��>��wkE���9��$��3�ßϱ�K��Z�׹6']6������F�r��"�e���h�H��eR��Y��,�il`?�Lv�],{��2�9�����ېT��F��x�/PK/WUW�
�pip/_internal/commands/cache.py�ko�6���"R�Vv�w8���P�rwi��ݗ\��m��EU��M����I���<���lrf8���*Q+&�$����uZMֵ�1Q�*�%gf��i�p���}����}y?e�s�&z�ʫ8�K��2-�U���T�d%v���,֙�yE�T5�2.-��/?~�������_]�a�+^�\��w�y]�z�.󊾍�6*/Z�u^py/����8j�p�Vx=��d�n-L�2��$�&�ɪH�dg�j�
{�yF�	�� �C)+�R���##'���l��	�^5K�`9�+3��]mŁ�-�иE}��\�_�]��c�R4�ó��yN�&�L��5�����dhs0r9ĭ�N�}�'%��l��i��#VM���Ң`9F�	���*Uh�Oww�S�%�M!���j.%�'��(F�j���Kj�KK��܃=���v#o�Z
��V�ؠ�{+�����ݴ�޲��L�~q�m��S0�����mUk����mҕ/J��,ͲD��%/��}b`�y����jGp2����ZF�����v��{{�j���(.0�6�����V�+.��e�QM��[^T��2��8�>��;Qn挨�М�#z�h⫅2a�%|*��dS��
�O}�E���$eO�Q��dQ�n��:�n��o��^:kl!�^K���`�\�	�%!�O`�WF�^7��� ����$�XT��ֿ�'_���Cw`����5+����[��M�Yc�I< ��fs<�Y7%y$�y���/��2]<���#\s�ԥ.1So�?8D�.�\�=��/�|�7�oi
��5��{;�����'�𭌘��5�p�B�h�9�� ���ܨ/�����j����’�M��C���O��r��̲�$T}��‚�h���X^��͇�mdz.�m�f�d�	���H��ͪm*��b�a]��HV7! ��4���mM��Z����x�d�d!#�o8�h�k���.�]�U�J��ׂ����a�̜=+Uy�m_1@�Hv^|D��DYk���x�����a#�l���
�0����CB��!�p �_���Z�XW6��Ӊ�6|lD"?J�=�|D%�#��GT_�Q��4}�/��\�g�#��i�ܿK��C��nl�h�b���6��]4g#�?�^ʠM��D�Gt�J�F�M\'r��t�����\?f�Q?wEqϖM^(c�V2�1j�W�2b��9A�b@�d�&�R
i�w`�+�/霝����'J��ܡ���n1�6��G�8�>$�3���{��[x���s1�:D�T�pS�3�(�����:�
�l4Z?Mq�f��Cu�F���G�h6��ө�P?��k���`F./��pf9��z4�O&�&��#!����`��f�3���l@Y��d1�؈&��"�K�1�Nt�=2?�m���U|ә�m�M�caA��,��1�MWgZ<�أ�WtQG4����g�:`3�oY�@�6rD�4sfF�R���W�o:1�FѸ��_c���gA���p���
;d>O���,���>�8]oQ�_����5�"��0�%;��\r�\��/�g-���x|�߰K��5T�[$-�+�|���Ե���h�w�#��Y�
�>�hb������=��6�C��?�x����cpb����M:��.�x�;ȵ����FS„��7g�y�����R��[L�ŋ���u�ds���n"�(��O@�t侪s�p�[G��G�,�~R��y�X��)
�vK�=��ʣ��ym^�Nm;F ��1�䇗�C�ԭ?(��C�=��ӥ�ǚ��;�NU&y�����H#J#
�J���Ν�5�]�ۨ��?�*�����K��������7��ط.�f����1�=`ۑ=F�=T�jK��2�ϪH��EGϡ�-G�ؾ�]9K�j�B��kH�{R���s9�0��*��0A60n�r%���0���)Ӓ��-���+��0�Z5�Ch�����.�_�큭T��\���k/u�	��2A]I�+�a��3`�	|��ӿ.�(���S�90<�`���$�O
l놉�}����)S��H�H�����g���DY�"x�q��Z�Ɂ��}Vǻey�y>=B��8c+GPDQ���2m	�ga]��q�9�w9?==���Xԛӌ�O+^I�������X�w,���B0�q�&�kz����M�Θ�PK/WUW}���M�pip/_internal/commands/check.py�UMk�0��W��
^��B�z+����� e�h#KZInɿߑ�"o�v]�=3o>�%���P�i�n�ڙ�
�;� �W��Ζ�&σ�!VڊI�i�*�d���0m�a��׷ >��y�O����Ǧ�ǟ���5���x�F�JQ�&d����,'� ���L�,���ԄRx�^��La�ř=��
�	��(d-�Tfŵ�� ��Z���ϋ�T�t�v�Z��M�W
��ޖ3�y��Y�	Ž�ub$/��۾��j��N�g�[�q*G��@X�g�hQP��"d֧�<S'�����4��M������:�{Tu	��vܐ�k�-n���+��7�*܎YR .
Ψ��S�%ɋ9�?�'�.@$-�]+)B\��[�D���8�~��H4ޔ�2e<cS�:I�M��j�Y�b�Y�s�~�]�I�+��7��}���\��Q�#Hڄ�U��j�����Hם���_w�C>�9�S��韦�#G��4��|��Ez�]����ڇ�'��Ҽ�3��=�d=m+��
�z��}I���9=���T�a�W�
�9�N��j�i��k�?�?PK/WUW�Κq_�$pip/_internal/commands/completion.py�W�o�6�����YJ�os�b���ư��ch�D;\�I��ߑ������I�����#�҄K�b��OI��#'�`Ó�T��
��$̨��s��m�s̈́�)K�Œ򘄎2��I�8(&��1!��2T�,����t��c�$�1��[*��'�����ԛ�>��.�n>��a���=
�=�riH%Kb@�\��Y*�G�(��`���̯f�
�
�7�Z��x^�cZ������;�ή?�&M��}����p��nW��~\���6�[�&�(zwX}�iv5��~\ޔ����0����\��"��,������}��!Y(�~߶v*>9�h��t\v�X왊����>�<�`M��?�B���DŽ]v�auW����|>���/-�(G��rA�릻���6�Z���	�A�*•�̮aB��d��>�ׯA�Ӹ���]E�.6)��#�	�S<���ԗ�s�O�
�ᯕ�i(hY�s!������G�����
�p	.�B����؝W�;?�mX+��I���S�e
Q����g�S-�`Z�,V�hA
�ÒW������bIX,�f`�-pi���lٗm�Wr'}�I'��"
�DDЂUd��0�*t՛�Q�KqC�0{<h`����&����׊�i.���L��}�����M�R���V
ߎ	6l�����_�Բ�}qNcQ�J��\�꫼C^ՙ͡���!�VqG��.L�/��WX�i=/T|J���?��疪ag�Y�Pg�ٌ��a�h��{�ȃF�z-?�k]��
i��j򴾖sM�-��ne݁���u����J�ɜF�C����G���&iG�G-��Q�N�s�/g�^u�;�5<agT�*��9���A�:U��|_+�`0�A�i�8U���,�ָ$X�)v�r�	�Q�
t�.�����bg�8�����O����K��|_�y<n=��O�����7�!���Zv�H�	�b0����Qk���Bt�\CH��f![z�5z�p�č��5w��\ca���*j�^jaY�ݶ��^N5�v�e/��0}r�-ۜjY�ɦ��N��v�-LO��(��v�"Z����B��b(���ޖ'Yj�5=bU�ͳXW������?u\ᬲ�u���챍�p��Bͮœ�^�2�*�+_�4�fӽg9_賨5��lA�hƸ�S����1�7D�9����5�S�j�q#��e��e'��e3o�ӣ6�L͆�z�rPA2Mu����մ�'i�/UN5[��'W��_��
�!��ͩ�x|�d���l��2��;��I�5ژ��7�1|N2�2!!Ug�n�z`<範�f#p_����PK/WUWbO�9W&'pip/_internal/commands/configuration.py�]oۺ�ݿ�SQDd�ݣq}�.M�`Y$�݃�E�ZeQ#�$F���sII�d��E��%��/�C:ەBV,�MVl&�~�~S���bŕ����1QVe"gf��$��Y��%а+�}�.2U�첬2Q$�DÕY�YQq	�U�E�D�x%v��H-��~<����� �\Y�������ܞ���܌b�b�mj��@͟0�;�.���Y��o^�n��r���w���C���}#�UV�I)�t]e���3,P�E���(�L�,<�
>ۄ�Af�E]�u5� Y.��:;�z��q��x��d�'J��0���g0#�=ϣ�&E��@u������:��&{S/���L���bdF�ª-gɪ��|!��1�@�3U�U��x2<̀��O@.>�d�Gp`}�&��/\��c,3�^����){Ȫ-3�F��h���p˪1'2�.�?^�#��z�1�P#E�&�
��Yk���0��w�WLmE��l�Y* �9d4�b3�iQƅ�r� ˃K	����d���;ܤ�7*���:������ ��2hG.��㴖9�VU�f���H��;�=����(�1�[�$�-k�e]
إ��E�FU����{�=,���)����ć�ZR^�҄�����L��tZ+.C�4i�ƝNd&K�K	�����g���H"^��(v�����P�R�f�M� q�"��#����%����!�h'RH�U�+�6)K^�J.ʫ�,�D"+��*j���d�BHK��:��{j�7ib�VX�M����X���7$>���� ��T�-�MNˤ��>M^@�K��j��ڜ>�F��:N��Y��,I�X�(_�|����+xz�����jGp*j���Z�y����j�.a A�,��EqW�</�.o����Q���g4D�nT�?�on?^0�;�t���yCB݄�Od�,��e�gT"q��<�\Ġ�1���r���YN/Qp�|q�p����\�ѻECa�ݫ����X	�J�91�G�Å_�՘_�V�Q�p��j����}�z��$���C��2Z�)���vښ!�jEhvn53�9|�Q��X�J�Q5���-&[(X9�
��kN���L3��n6\#P!�Pv�Nc]\z�P�-v�ms�@�BͳG��B��5�����5�[�a�8��;h�Lh4K�ܠ=�Z�������Zq�Ƞ��c�?R �r������*�2Yr	]�.�E"��̋�#2p7t�<�-� p��I򪖅�Ze
۹�e��l��?%U�%��	T�:�}�)ت;�n��m�!{F�J�L ڱ�kGƩ���yhU�!+����sߨ
�ZP�:�BK�����(��o��3~��<26�?�a�%4�p
�+���ns�"S"Ǯ~n��1�Ƭ��[�$�!�te��8�_���Vr	|Lv��NS�G|nA��o\JF�0����ż�'
M������ߌ-�ȩ��Ӑ/ܵ�"!��k�x0�9�8�����`�a�t0�ޜ]7�E��K�A�rq���-J��9�ts��Ei�ڣ5	��Xwꏩ�]����1�@4�=lW�5�m����Ƴ��r�0J%?���h@�&�A�9�v����HO\>Y��6d�����<p�����w�U��b�P���FM�b�u��뎀����l,��`ή"A�T�n��п����\KAO��.��=��6���}��maw�״N#�XL�L��>���	*��}�T����#e�ف�{����[5-|�fG=�a��n@��s��\�@w��6µv���в�;����
�q��?�U�8��j�c��J���Ψ�ʹ
����{���Q�me���1Ÿ�Ft����G���?���ytj��@���b�dO���
���v�ҍj��a��OY=�I��b�@	ii���W�B��f���:nX���\h��:D���+TDwO��@*��B�!P�_**��߼\`f������9��Bg��?�Q)�.�	���H��p��54ǝ3FU�0�.�q2`�̸��P�ІCc�&���03�f�w���G�{
"�xr�)u����o��#�X�Ȯ�E�ԋ��]:!F��#�H��:p�ٷ��%
v�c�]Ìŷg�{m|���k6r4��S���k��*~�Q
s����y�x`����|	6���9���a��
q�����w
*f�.-�'���H�.npHۓ���b+�]|Ƿ�͞x'T���K�
����%YqR�y��8h��C�w��y��*�:_�k;��{��l����HY�9�K�p�y����1�����iR�	���5��ӥ�DTIV �����|қ������Ֆ��ǫ$��ɓf��<C�;	��<��x#4�?�@_E�Y�Ezhj7�P����Z�!ֹ�u���������~:$�K���7
]܆��]���g
��ًpI*�GzR����ӣ��ehh/Vg����\��c�w���y^r���%�
/8�gq��ed���P]������XL�j�A�&`�_G��ڀ;F���,�
�3�52�O���EЉߨ�==�V,��Z�� ���<��A��Iמ�616��;�׎��6�7�_�����r��i{�N4���z�ޏ1��0�G���2���e��ͮ�D�m��r#�ˌ]�<gHN�e�J�)�0���{G7�s�}8�����؆H����uC�p��
�a�٣��]pw����E'�,/,�]���:}-1�u4~`���k^���PK/WUW��~�	�pip/_internal/commands/debug.py�Y�o�8�_�Ӣ��B�}Z�.�MR��nw��=���(�[IԑT#��3��(�n��C,�3?�e�tR"�G-6��Z���z��H-V���v+�m�*2�׋JɆ��tLi�1ɿY�s�g��a�_��k~K�& ��O�~I.Da��Jh��{g�lY�'v���oK�@��\Q�����Ru���P���+
��i��{�~w!��p��E=�R4��R����Z!���e�:w_O�����a�85Lm�����@���0�k8��~}{~~y}}�E���������1��V2�����d���c鍨u�c)�r
��Y������x\�u�(��ZJi�Ni�X,J^����#3ō�F-�]Xa�e��G�E�|� ��s�V2M��y��%AN�4��T� c�Q}k��{x@�O�WIfɦ�V��>���(�.2d����/R9AzP�~P�P���'C�950)﬽��*:�����-5�ɤI�xpv�S��3�E��|�!�IQSw���- Gԟj-�D�F>@Ҷ{ f'��x"R�W�9�����Q0Au��H,|7��U�$%@�\w�]h�>�;�'�#X�T�8+-
�JT$Y����~�pb�(�j�o��H�4� &h�u	�v�)nz�R'��N@Q&rX	�'1M2Ŵ
���4z�)`�
��X����5�F>)XK6��]�U��=yt�HK��h����	���A9x�L��]
�K�w&���ħ����`��HYCEӄ�gu�'��ݷ-c��P5=rM�!cn*W2AJ�njڏ�p�4���Ο#��`[�
�! ����'���Y6�y����1*���h��?�3�7+��RRŹ�ȁ�I��k��T�-�������ϲ��o8�E߲ d�3D�W�`��/{g�P��#��M,,�K�@ҟ!hϢ����h&4�"��E��y�U�����p6�|�H0Dq(����سfh�	(��n��:��pdR�7}[ּh���Lk�����)�HK1#�	�{e����I
���P��Tv?g	@;�T�_����+�DS����CTxsy��|�.�g��iԝ��j֞f�7I���q_9��C��B�e��F=N�`W���H5��]��΁
���ٛ0�2��O,��ݖp$t7 �QQ.�7:n�VV�p���֭d��`�(n_�>G�&S��[�"��]�6Io[[O α��h>�=��JPr!j,n|H�lʐM��an�і5h;���)sF�������6��|���j�d"T�q��a\3
���K��8I0s(�	��f����S�$0�XN�ӳ����h��0+*�o��ė�#��;1��j�}}	��e�V�����wٙj@Bk�,������p�9���,`��
[k�-N�,��?���DZ�pE4;�],YP����H�Q�*��ġZ����n�[�
�c��L��D��D��$�szY�O���`�G–	�8^�_���A\���ga8c�����0�~ �m�p���q���� :�Л�i��V߭�{7�՚�D�C_�(J�)#�~�����(2��W8>s���{��H���P�ݟ�^���mN� A޽f��8`��\5 ����2�i��ɨy쐘�����z`_Tp�F�<�p!�'W3�X�Fux����@���pF��A$�"�n���R�3
�M� �����昈V�^]w�ۇLYKV&.Xu�G-����V��>��i2ϖ�
c��c-O{��#L�\
㉫��:ww�4Pf�<����M1���1�.`���_��̆A�~�R����ec��c ��0��|UoK>�B�1l�m��v�녲��!$���HdeI=_�y]�
>��o�r���	/���=�]�s&��n���lI^����*t�]��=wIf]��²�oS���ș.1�j!<�#���bxu�݅��uW}� �֍L�Br!m��X>��@��i�Q'�|"6��3t7`���p�5(��P���e
]PV� n4*v���Aa%�G���ы3���a���7�iv�)��S��49�Eopf���i&"����m!1�=���Dj�£���s�ý`S{��_�A	��=k')�l���P0�	/s�:c8��vq�-����7���g��05O����?n/�o��'��헋�K�˸����G�N���y�]��	�#���G�4L��c֋Kw�0]?0��0ۏ��hϷ��[��PK/WUW�V��"pip/_internal/commands/download.py�X[o�6~�� <�[��AH7`@1Kח `i��fC�*I9U�)Rm9�=�-�y�s���V���[.�3�=*3�h�'��5�HX��D�f�%"�-7v�j^�KZ2���G�r_�B��9ØQfϞ�Z��`i�ڝ��d5|�����?��� �]GY�gnw��dS�Se,��Am�������)U�f�����S�Y�:*p$�)Uh�7�K<�=r;(���-+[j�65�A_��\�|�MU�4�Zq�$R�=�+К�b���[7��6���G���
�[Z���̅Z[�X���~-�T�=P���f�`Ɛ7�Y
Ū���S����|>��Q�Ԉۢ_�9of��"��w�̹^ٝ�\V�̂4���SC�7�Ƀ�{Rk�	-!���[U2�S�`*�#�Q�^Y F5��t����K„Q�4�ΐ*��ត��qf�n��r�?�
�*&	0Ӓg���)-aȪ��\+��D�����{8��� �謈/!�p�-yA�H^O�vK�V�Uϟ�M+�(��F��Ciƞ�}�W$�s��"{p�S�S���U�����)��Yݒ�������슘�3� �
�-/�VL.�-��A�TV*ZA}��V�5�ݗo���RA%E{�h�a�Ja��+��ҏt��.�E�c��k�{7J��u���`׀��_~�b�녻؝��8�[lz@�&�N˷���3_U����
�;��Q�t��{|���Gl����:NO����sBª�a��5ڵ���Q��Ί�I���~������`JƳ�D�p��}����~F����=ЭVM��>����yR���~`Փ��Q	���?/G�[\"6e��ɨ�At#=4K̹	S��->�I�;ģ�/苡�s�B ��z�Tܲ�p���	9[?N�a����壛Mbl}\�u����Z=�0#}j��Gc�=�X�r���άk�8�6?9s<����d,u9^�����/}��ȏQ`��6k�)����<|�q�~c��x/�P�Ei�IN���=f�2|:��]�J�Ӝ��}��lE�N��I��)e�����eu2��KQ0�/Z���f'W��>�҅���=
�l'�y|��=!�Ce=*��܃C�E��p	6i�nƱ�i.��L_/�o׿x��zy��hk=�,
h� �O#C���ȅV�u����J�T$ODaGPI�8��b*ASv7X�o�şx݂��z������Kq::���-�XF����-|��v�n��ņ��C

s����Q=��v��:�����^A�ٛ&I��l�3?2�ː�}�v"�}�R�_kG��k,=�Z�����5*?��-nR�7N*78���Vt�n�n{�Ì�	��{��]�q�'�1LP����	���`X�H���AVY�l���DŽvC�7�w�8��ikU�
C����j%|�����/���}S�X&6��T�ʽ��y�Iq�
�E`�ѲK�PK/WUW��
d pip/_internal/commands/freeze.py�Vݏ�4�_aEBJE���"Hh�����/�*r�ikֱ����r��؎�$�=�>���7����1|����i��LD�o\�0�ܣ�(?��,o�-�
�Y�[E.#LQ	�*.�F�$�t-iZ��E��FwWm���ǧD�q�#	��I�������k"ڀ�bo�㌧k"���p��ѵRԕy8�j�ja�*<�^���X@��^б����5�~�j��n��c��Vy؋X$���^��X��}��:�m��D����}T��d3r<��
w�.E�Q��^�cƑ��mX�RZ��{�� ��!��FrD�&�8d,~3Y��߷�3=�(sRB���>{����(�l�m�]͍\���I�g
�̖��B��	R���m�M�?=�
B*��������>�>T9���g��^��٢̃����u4���۶t�r���Vp��_�$<g�|��o���f;AiA�G��l�₁j�l�7�j�Bz�{�ʻ��}���-�����9�4�����;j!�1
>S�p��,�L*Yx�t�.��n��;�
�uT�_�Y��jA����J���!{Nt�Ŝm}�k��I��I����똞k��t�B�l��9��
��K�O��BNº�KP'J��#Gv����6�6��Li7`z
��/����qKyZ|�
�Řeo�|LAO�P����f��X��>+��+|��hv��<��G�W�%�_Qy�\~�5���J�wڙ�[H���)+b��}o,��B��5	= ��"���[�B+�/ZRh`��`zL�먅%-	��؃^V���:��a���m�
�����_m�'��*����q7�p�:�U-,a(њ3�I>�%�v�d�9�DKEhf�A��͠�j�޴��VSEI�>>�b�9�3��9B�P��-�=�'2T��@(�U#��d<�I�td��$4�JS#��՜˷�9����x�q��Ӝ.PK��Y�E��򻹀��_���(Ў�IA/��*�⽥��$�d��*;�ɰ�=�PK/WUW�����pip/_internal/commands/hash.py}UQk�0~����
��s��d렴�t}�P쳭U�<InW��N��i�����}�����h;mi�m��Gb8J]�B��Ѿڨ2�%�s7�h�粇��^;�,�ºh0t��L(FqI)�[`�n[��)�r8~bw�Š���no��}����v�E�NHK}qsԗ����
���]a����k8l���
[LxɊ�WO6#/F8`�w]�{�|b����]˜�-0�FQTHn-�¼Ʋ��#��8��o]��������b�F<����	����J�"\CV�.���-(gI%$�I���^B@
�X�!���[�ќ�g��5y��Z�G��C�J鐹��6�Ư�gP�vgz�J�Zʒ��Y�duNn�����״h���s@r��x��ܬ��5jӴ'&l ��Y�F�l�h��/|ylV���t���.
�.�Q�A�C"^�lM���1��i�[��HLj��E���1���.	
3l(jƍ����K>eK��Y.ӫ SFF���g؅5���?Xg��8@���"J��o��q>��Z,���3_�1ˢ�ިa�e&1��������s�Ax��� ���]�P� �~fQ����f�+�!91��s8�%Mk,�<�o���=��4>kc;����JQc���C�i��Š;Pc����)�v�(39'��"���䝚<�a'zv�6d2�K�=�;H��4r�
��O��PK/WUW�Ô<�lpip/_internal/commands/help.pyuS���0��#�* eQ�Qw/�J��[�^�9a�`�c�YT��;�B���Xo���$݂6���5��M�6*=�z#U�oҺh�4Y.�CR��.����b~�m+T���:�:ˤm�~�χ�=
�^�8����&�Eѥ��l�$Ӟ�"����W��JM0ٵDCEgE���+�3�GC���S�Sd�4aN������za�w�p*��Tb�)�>bo{7e�A�|�G����p���R�{�MfC��\�W@�B^�v

7�����V��
�[E͟��݊�6�o�rW�jPz����u,�܏Mp��y6���k�m�+�������C[pEPȂ��f�8�U�:��%��H�S5c�|�Ti��\�T�h���K+	:���jmŌc���o���>��_�9�8�j�j}���	c�g�ܴ�?#��r�8�X��	���/Ibx�8���JX3]��Ǜ�Y4xS:>'e�xHs�4�B�&��PK/WUW9N���pip/_internal/commands/index.py�Xmk�8���B�R����_�s���(iH�±,F����ؒ+�I����ѫ�����]I3��g^�\(���j'x�x�z,$A����@�=S���v�ѹ"ߴ$G_�T9��+�ns��e�i_Tw�5\=�o����#B�����q}�a7s�~L%P���n�窻��;��� ?��wf�g:g
����Cf��
�A{C�g�tu��*G����>]_/rZ������{U8)Hn[��Ŏ/�!�jbM������"GA��7�&���3X��Kڛ�%�T�
�-�y�n���|�s���e`������s�-_���&]��K�%���,z�IQX쉪��:����l^��%^F�=���� umw��V������*R�A��Z�t�
�O�T�b�Ҫb�#U��V���Rڀs�Kgї�W>I���s&{������0mu�!���Y~�����(|C�݁���@�� 5k�ӟ׽�{�2R���c�
�!�4�˸|��Л��3��Ɯ,4u䳈�J�!�U`����t"56P:�i��H
��KY�n(��RF���5�FpȄ�÷ĉ��:T�r���`h�ƨej�N��� ���·�D��%lK�ա#fܞ#��ڵ�A��J��
��	*H�1��'-�'������M�bk!]*_�<��������C�@Y�@ *Q=�Q�="���A;X���_�$f?W��GtC� �#��5ز'Ќ ��nP��g-��uO��)�`Z�k�_�,���H�tu��ME�l�Wcb������ut����Vb� `@`oB�k�!��kV��s�%��B@1%M��Ͳ�8�V�>�6��Xwm�m��`���JO+�J��K�mV��FD(q���$˲M]�ڰݼ[oG�m�]a��3Ȓ�Y�'V�]?y���n�6Uܟ�(cG�OSoBfz�z��è��Ø����-�C7��k�NO�o8oc6���L1�7mXg�`N��M%�m�!]�!�v�M^���� Rn�q.*㑨��e�C(���}GYx��=�v��:bvK��3n�Q��vh���QшT.NGq6�o��ᯖ�LP\���|�c��b[qA���A�y/g�l
Ly����P-��La�=��?hX��.LAPu[�RM���J�..S���D�&��1]Y!X�HwG((Pu��p]��~��&��O��!":OC�z��ǥB�[�m�����"ti�5#��ebq?U���$���]U����"��,���i���>`��M�1O���v������6�+�u�t�ս�"X�/���P�ƙ�sZ�Q`����Е�TФb̈�SaɊ	��?�����4q��I��	��6!�R�\65�e&�f��+z٢��(��+�	�L�҇Ǥ���%gXS�d1�0U�����<z976�A*��MJ��˶qm��@�\|��'m�<<���1�-ȝ�Ƀ'���c
L`羹.�D�s�9�d�PK/WUW�:�Nt!pip/_internal/commands/inspect.py�V�o�6~�_qP1La{5�[��f@���Hg�
E�$��(���H��d���b��ݯ��"�NR7�P��`t�s7A����6w�-����D��AX�0��J���֦�x��}������5x/C�*�V-*w�mDu��ʱ�V�)M�1r0Vh��,��(.�J���ښ�#��,
~a�n[���t;���aw�%�S{��޾{xXsi��;�p�wĞϽ�l
^�%!��%��qYWK�̺�f����72I�G�4����K
�J��C8�S�EƊ�fSIn-�W��ʍ���g���eY>G�#B���@���'w�
f-�g�3��+$��P�P���G8h�rW���h�6��zA���W*���1�{���X�O����R R"�f�!�(������K����rr�"�ws#u�e�]��C��u�fGE����K�K�e�_f	��<A�D�s�wGRÑ[h�~��Vh�j
J�+'�Avi@�ӍP�e)��"�[��^L�?�Lo�\�m�>[1�oƲ{%O�{�.�S�ĝO{c��2����!RzJ�Gyq�F�))!7z�����.c�M���0f؍�w�4����GOA��'��ʪ�X��T\,|4O�ք��J�&N�޹(�!�s��
+���}���}b�-�����%ƾ�no�峩�����m)�q#d;�~=�NF��M��8å�	��,4�gfM[/�?
?��^R�Ч�03f)���ˋ���tw�7�-X���&���mZ��_(������7*�$�e����b���%����i7Oz\/�!n;�8N�/�ޮc�׌.'8	u��p�����5~��4���+��S?����~UR�x�s?�v�9����PV(ZK�.؆9J����2
�X}9{]�&�%42�$�8�qc����~�&`�B���eN��4wg�z��$�z�Jlxu����2�a˅{43ڣ��{����U�"�{=���Q����ͻ��7�՜gO/��DA'g=I@Ű��z��~y<�n���4O"�+�ÙeE.�������v��jܚ}�b����4)�(J�;�"r�PK/WUW��$Q�p!pip/_internal/commands/install.py�=k��ȑ��WthC!g7��A�8Ǟ$�9�����.%�f��H-���`�~�գ��M65�	��D�����U�Slwu�
�4U}T�_T]��N6y[7��2��u���U��h��[����FI�߼�p~���ݻ�g����y�I�M����L�W�j��ͮ-�*/��ɮ�%ٍ��u�4���4�5E�f����:'�|um!��Z��9>	6-�p�]�4��h��-L�m�Qfm�\�6���kh�o#�V�v�Wk�9>�y+�Fne�>�sz~�7UVl����\eM]��E�^g�R�U��ͦ&Tm�v
�\K��۷o��aS�?�=	���V�_��i�f.^V0nY�؄�)�U�Q���le���6w[��h�
���*UR8�d���zз�&48��,��\��We�佸c(X��c��jS����(�\��L��ï�DDc�1�
�X�S��tk��4J�c�b�Jy�����m�Z�4�OPr?,���r��_�~��� Yq�MQJ�W�ܚ.�Tmv�m�,e�.����e}u��ؓW�$��c[���^�����}��_I�q�R]CP�ob�b�Q�
~�k�V��Μ)��	>��nW�J�*,Mfu�� &';���~��]Z���Ow&i��n�
B�de]��Mַb���YUgWe���	�nQz2�@?��x�9cS7M��8:*i�D��V�eU��Y6;::Z��R�,�����pvJPGQ䒱�+��)�`�ѻ�8ߟ�1Jٺ�F�����N!�4��B��
�v7ѝ��n�/�v�5�}�
Zi߬��rРn`�-ЇPu׬�ț�5�+4c�)v"/U-T�CD*��!?r�!�Dsq{����)֒F�+!s�%�m�W�94�K)鉯��L$׉�%}��6� W��0ϕ���)�D��B�A^�I�L��h��x}��b!���r7�;;��.��>��z�p���"n-7"_�����,73��A��+y���݀�T�w�{["qq�f��C�R*�X-w�k$vyP�f	��l"��b�� Ϣ��"_a�4R��`�5�4��M#蜍;���]٦n���kY�R��E]�8k����0"X}��s�K��a
LJ��#�^"��hρ��+;%���eQ�
!�N,�U[X�
��}�HU�7�X��s��J��~�߃v�?�6z�8�0��k4�n�ve���r�6d��#�C�ڛIU�<C�ni�2a-?�B���ɦF��ÆF��|Og��vWM��(jG�9�1p��h�+y+��q��s�w��B<�dw�>\;�g ��^�.Ë_f�=�9��T�$��9-٤�g��^��!��hC�]h�6��\��	y&��5��g��/�����4up�d{.�;)]���CNc�E`ɇwgo�?={w[m:\{��r颪��vmP(����Ptf�P���7���$��j`R�o$�Ȃ�$s7�'�$��e������W�v���$�s�v��e��P:�7��z�(Me�rY�ЗD�:S�E��[�|G.�;�L�x`�TB���老
�g��^��V�|��4?��k���z���FEO@�ß6����A-�<N&:�E�i��Ǣ��+���
�(0TTPyū�w�R����4R�B�8��!�� kL5��Ypz�0���K��G��Z�"J��5(Q�\%Z�!�j%�:\������Z�g�(�
t��@��W{2�n�&�k�8��l�K������,*)�r=h�����b��0�D��4���E(��o{�zN�5G�&��
��x��]�X�X�^��(�4f� C��&R
��8`�]K���ի�y�V>�iF(jj��O����,,,�Zc5�d�zX��|��H�ٚ�[`9�~���.:+�h��`�n�M6��~�"z+�+��ZPcFV�	�y��|�D�h���W�^�˱4�l�Us�l���MgW+'C�`�c4��l���=C+�MYٸ6[&��_T|Df9�Q�ܭ��~os%:�����L�m~�Ԡ��J{N���p�?�,������N��|�܏�̱p��1q $���3�?8>�I��
sH[�#���}�m��T����2�;���D�s�e�I3��Em�����׉)t
ﳶ��whq����V���`Rt�.��d�,ʯ�P��Pwm�^=��Z�	����Z\"Ο����y�f�6c�5ϗX65�CN#�¨?\�a��Ԣʛ��E�G��#/󑝵
ɮsu-P��@��l�7��%���d�S��H�h!-�쪩��Oj�����Oz4�<��1I/�֟���!ݾ:��eA��]F�m�"�Ff������`,S�wo^��D8@n,Q�P3��b�BԘ��<f:;��s��=�EO�E&"VEy���	�s6P`rX-'�Iy�v
fzkԚ�s�+e��^��U!P�%[�	�#�����Y��Sx�Y|�v���7��[�s��3���khԩ.����r�� �\�K�*U�'�w�G�� �~�ga�(���$~��<�>1���鄽c����&�s9��D<��׉vSз��U�	�z����d M����s��!�8ݍ#q,y.\�w�2�>`"�� v���QR�b#�C.(h���dHg8�|�?��޾~���?���_�^0�bh��; > �g���T��̪��	V�^�'p�>�)�������-0�8ޠ+6�LG.��)���
���G8C)8�-m����5��'ƃM�����eY�@�hJD�=ܙ~z�{���b�5��9,�h녎�,�b��|��	�
��W=#�X��������K/���l?g!\ʓ��@�q��i�byʠNʵa�b*	�B\�#�s�v;���!�4@<~��1M�M-U�#:���/�X&mc�i�8����S[�z�U}]�<��#��Ψ+�]��{��0.C!	�:�$hH�|���x�ȗ #����ٶ���lF��zR�ᑙG݈�u�BA�;s�|�~:jP��6����lTn��3%�`Fh�����y_��ɱ��d26Q:bx�7��H^� ?�Uo��m!�u��_�{ݔvD�C]Yt��Ǵc'Bb��i<��,֏�8�o��|q��"�)�F�Φz�_�3(��ʻ�d�lПi�<:��C��J8#7��������!I�_�p���y�~UtڹQ���D9���U�V��^�j6���15�L�:D1�}n�{X��\R�*��,��\o��l��K�{���
�n�C�^�ҋ^
�?O��rMm���Sr-h%4kA�j[��d0��J'�WE��0J���� �l�.i}[�u���i��P���ʼq���Xú
p&l�?Za4��!�P)�h�#��W���23l��5�vy��.q����i0�$�t���^\��!�Ə���k�� ��G�=�)��=�6�v���O��l�4�q��4�N͗��N<;<�:߿����P���]+�-~�ĩ�?xX�KH��(���~4$��zG��2W�
��c��AS�AZ%�I�1�\0.�����e��Azs����<t�C҇�A��SF�`-^uw��ޜ��y��۸�ƀ�?�LM�_S���s�1��2띴����n��ժ�R�4����ь"x�A��$�n����&�`pզ���C8�Z�gOo��^�g%E�*��R�#�u�-�%
�az
�G��R��$.$��
tJr���zA	m82�#��ǛF��
H�-�*D�a�#n�Ѻ���%��3=yt9�
?���
�I|��ؼ�:&h�9;^ ~����DǟSY^[%��E/��~F-�ȡ
�7�8^]�^S�㕾�>�5�Q4s���gAӁ��E��rO��xt:��QR���M�AAܳ�1۾>mɼ�e4N�I����߂83�H���Z���>3��A�؛!�~���3Yf��x�C��n&In(��j`����Ń0ťt6�v�&/J�(�AXe�}��rp�㇁16��帅ﱧ�σ&`�_�T\ftLy"8�R)�v!pS?1��f�å�4�-���f���Ld~�"�Ѷ�!y67B�I(f	�_�����<�V�=e����v�.�>����ŀ�ǡ(��l ��E\h�
�A�P�]�����(̉�F��Q?���
o�~��I�=��L�8�YP�Mm�-vm��p�S���'V+:�7��&q��3�-�g)e���E�tƉȅ^O�pN$���ؚ����?�������w	��{�ܕ0��u��i(b:n�X�;�1��4��9���������,�YO�t,<s�eW�%�l
�r_�����C��$���1~�_x�?^{H*D{����ܧ�Ζ$o[D�����'h\���@�
������,�T�%]5f����M�H���ˎ�d���o�CL�8@�D��ۗ�g�D;D_�*^�g&�?��J�|��E/i(
uyh�B:%lO��aƨ��&o��o�W=�6�1n�,3,hœ�p.5Җ~��ȿ���u��<\�z'���?ehE��7�ȐD�_��-��˕K�t���S�C*��q�h��e�Ze4p�ߌJ��bo��x�!�����t��f�x�^��7������RĻ��:o���8��񑡬g��@�8�|X:1��a�%E�����M��
`Aءuq���9Rr��S?�67��S��k��n��o���ĸ}��z�ߗu{-v�I-�>�S�ݹ��)���QܓzK	~�
�Sô��z5w�����`�K����q.[�䠄w��F�\羉~�7b����m��;�>�ͯ�p��2�H6:�m}h�֙�y�7���{��v`N��{��6��d`�����l��F���n[j7(l$���R���\�y�j+�٭i���5!�����t�eT�15&c������25�x�CN@��	�����P̂���ǔ��O�
b2t��t"�c��.��\��gO��3��t����gr���`�PeQ}�'���1J�,�;�3��[��wm�_�Kb�u*w���([��wp�HD��=��A���HG-�c�VΤٶ���~�nӹ@��x��9,`����ړZ*iq1"p��@����
�A]#?���u&C���U@d�M���r���CcO���� �[�^c�wel/���s&oJ�XR�:9qi
�Ա�-t�ɩ�n۝:=9���-1`s����h|BM�I%o�B���k�i�R�5�"�ߜ�����d�NY���Na����.3
���g5�յ,(5�l1��=DG��M����($y�Ő��9߁�@C�ej'u�ڹL�Vݬk��xҰq[�/^ѱ*��+�*�����u~S�	�b�}�S_*��˲�šz��"��Ү`��!Ȕ��h<�?{�C�����ժ�`��險>������q�Z�a��h^�yv�� J(�Kĺە:/*�Ŝ�<tzQ���Iv���rGg�2>�UV�7ʜ�O]~�p�^^|7/:��G����6^2�����&�g�vJ|vW_�S	<��Cb�0P�}0��P��Z���2�.�~��i���c��q���n�{�F3
�Y���tf��m>�����L9eXF�
�0���>#\T|�q�,�e�����Ff9�ݑ�ffRwǂ��i���I��k���e!��A�ڪZ�O���J��#���}r8Ʉ�<��"�����~�Q�C�M�'46���z��c-�P��""rʓuޱl�M�G���o�w�M͗��N~�?��7K��~0k>�[]�}���9���q���#��ԝ�;36�H<^�<QG'HAhœ��#e��:3$5y|��;�B�/��?px������Tx�P^�qH��FQ�W��ƫ�r�N.lѷ��6�r�ї(5yR<k����_؅��do*8���.��GbI\��j�V��@M�J��U��a{�mp	���e�Zu`��/��->E{�q�A.�K�d��Qa�7|x[هr�G��x��������&�Ǯ�@�6Ӕ.�w���h�`u���Q{���oL:����y-��UA��O0BK�hIi�F���S�Q��;�>Y!r�syw�q�я1�G��]t��[��;/m�~���.�g��ܣ�ͮh'4<��4dtY1�Q��>Kȯ�e�7^O)����wғ�	�Ã7�?��KPI&��⒒bۍ��JɌLC[�O����e��̈́��֝�����Luϫ�������(�l����;�y�O�h���졬P��D�7�X�MnV��������,�[�߽g���-W9�,��T�/_X߽�[�[KG���&
�1�s�H�q�ug���.#Ue��$��ڟ��Ƅ��a��bAMGez�+&}͉;�3c�>G9�㑖�=(cc�y����u	\a�"�"�S���kQ&�l0S���g��ZPԸ{����D�-])\�V]C���h�ņ �ʇL0�l��w���\'��D�]��Kc4�E�����6�כ�®��,Ny��2`���4Y^�����!&�`7&����Qs���nW����jm"Gd��t���w(��_���K�[p����v@Պ�+�Me��^r�tKo�TK@�D��f���lx/+�� �П5C?��$gϰ�GQ��^���X�c�]�z�\�s�3oߟ*�PE^j��TL�y�xfC�C�	;��P�s|l!�ܰS!�'`�'e}��ǭ�HСP�G��	&h;J~��մe(	����xU���LW��QC���b�{�w����Y+��k������&��o�^���l�W���Q쿞�,�	F�����`�B���nY}�p��
|őo�Ed��k]m��u�#n�U�4�E"�Yw��N�Zy�c
��~o��ad=29*�+T��J��D���	w]��wS�䰣&��"/�`Q���,��PK/WUW]�[�0pip/_internal/commands/list.py�]o�6�ݿ�PD{X����4\�����a(�w��VRI�-��o�_"%j����>x���p8�3?��P�Wٵg�n�������莤�UO�d�n�B��I��z�s;��Uu��W��|���5y�Z&��Ě��R�ɻ^�͚|`�
�ݲ5�8�
|m�Tg�f���em݉�������tmi۵|K�;�Zzd!*opJ�m�G8֝>\.��Vm�㑶�Cz�����l,�JE� �f��?_^���!����0�-�WBt"����b�5
ۂ<�[��\��e<#DV��_��ެ��S�G�hMu?P�z|3 �k�g�b�-]{d�J�4�����l7
�-��U&�"�
j����
����x������ŀЎ=UC��ᛪ��'�1(G.�A���Pz'�bU7�~K���/�|NH���хB1�„��&�m����sux'K���u�T�+s"~�,{�oQF��t�_A���m�^F�a�JP�㬩eq�I|<0��7
�0�w��tM�A������׸��>}*��%�(��=�#�?@np���o�r��$���#+��3-����&�;�0�D��+���$�_�҇���t����0�w�.�p�z-�t����
a<�N��„U
�
����xjM�7�5�m��F�����5̩��$T0�>��	Vp�X+�B�K0'��D���m'X�m��
�n�QLoN��&!/z��ɕ
�מP�v��ue7rp�݊�O~�Z6�!.hN#B�!4{�]����;˚�P�L*���'�U�H��k�2ӲwԽ�*��f��?��������`�Y�_þ�N��0��Y�7s��*���||�>���8!$<5��I ��$�����Š�&uG�Ni�%ٜ��n��a���Wϑ� ���[�2Kl<_���恘�>�{��}�
��[�"� ������������8������-k�k%b�,��u�V�� J�7	N;�G?a.�/�]'�T��PҚ�N��NxԮñ������0e>�l'���/lI���dnJI]iX4z����ܲ�Zs���n~���0"/
�KG�tn(���k���A�;�1b�u�g��d����
A�����V xۚ�ВA�a��%
�ا?�~���<-����4U�Ș��2g��\�T�ƀ����-�ȮO���7O��!o<�g�b��0�S#B}�cc`�T{,�CbI/���z� ��dV,����}��^}Zt��X�V��7uw�yDym�]^��R��w	T-],���;j��K��ޣ�M�N{��z�qSu��~��.�$���7�8;(�A�Շ�g��~�x������h{�j���m�<��PT��L6���OZ'��/Ҵ��3^�Z2 	���zpR��ǂ+�cN&�+'��@�C�/{���t���nx�Fk�;�T����[t=�Eĥ����읝D�	�MM���6�eu��|���8 e�����s��N����_���Ah{`ۛ�ט.��}A�@YV��U̔V)��)�#Pr��ƙy�‹���)���z/H6xd��U\kQ��,1��J�^E�x���'�ܻ�fU@/*_T��I�է��
+Y�zi=��.!ĕ9����ny�0M�c����qQ_%�YO���%
.���q�ƅLʹ�B*��Q�8���A=' ��
�38ƺ��vB@�i
�^ܡ���z��怪����JbY��Ȇm)Ș��Ń�5g[!�nhj�d�B��)�E��/2K�{���1��!�q�~z���-�	H�ch���<ɴ�6���'0��v�%�����=�+M
�aa�l��d{1e"(���a���:@8f*;��r�[
#�"�����d|�ū�E,�V�"�ȿ�j�@��n����<4MvZ�D�b��"�z����\�����;�?� ��l���!v���C���u�L��kH�����0��<��V�$ b��Ouez�$և�;�0<-�*}i���VK����n����Ϡ�<a�_�,��߫�z��ף�hi�]�mI|��Y˵V�%�����'=�%⛳ 2;����/ha(��}�%�t�p}1#�M(��~t�v�_U�i�=�jF�- h����1���J�8�J��ǃ-B�{(=U��/��[yH�
.�0�~}6[f�`��4�V�zD��Wbn���4�
ʄZ�e�\Q��Q��U���x?����"��u�����bc��P��E
�QGwƚ4'/�i���b4�'�$���L����Drϖ�"���I1}i��e����l�G���/k���c[(/�JP�9	�`�:v�9�U�CeC����pz�e���t����/�v��59� #��"?Vu���=��~�I��TՓ4Glx�A�}I�KJ��J:��'{!��$��‰jF�;������a�R��nŒG�Y6Ns�D��G��Y�% h�V���������O�}��%����A�.(�����ҎA��%g��i	�4>�1�����a���tP�ν�N�q�,xt�}�s�v����.�ފ2DS55�2�Z��=յ`�D��_߭IF��׎�yv����{�(���B�V�)T{�H�0�كZN�3���¥֥~��j���w���e��:]���y�%�LF�-�A�hJ�l1�":���̎���}�*����)����MYά����p�I����ί2S��i!�f�VO*�)Dۇ��O�F�CU85B�I{l�����}��Z?<'ߎ�_���H�;_�Ta�_7t���mv��/#��#Z/h$/��_��p�L?�F��Ƥ�A��rf�0!�3�Bm�Js��"�u4}[ֿ%�n���l�VK!�+���߂��8�����p,�-<�XN�36'ԞE����ثc�x��JΠ�G�(�=%r��X���K�ٔ'C;�.&Y<�Ɛ��6�(���~�X���̻�5)�j��*���?�iӷ�GƮ	�Na�Yp�xc,���".�[J�pXs��y�e#�Uh�e�z8����PK/WUWW��/bA pip/_internal/commands/search.py�X[o�6~�� T�V[��śti��
u�up
��i��L�$����w/�()�����s�w.ߗ��$/�[.�#n�]�y^�:(��ك������,W�*�L��F{�*�4/�"��J��d�7|�h�R�T*�	��yŔ�Ӈ,�;7_�f'����qv�ۘ��19�
>�JTB��+y�fwL���t���C��
��8��*���ݶ.4� }J?Q Z�=k/��|�E�/]�9S��1^�.��V��J��5��wy�]���̳�W��o�d~{rr:�	a+V�wjO�,�Ǟi���z�-�ٚmh�댉;.����
f�*�b�<���l�V0}_�ϩELM��f�FR�pi���R�QϊZ��`�i�=W��{�5ˊJ����&��tD��t�5��*E���B��w��&�b�tϦDiY��
B�E�@55�^��r4��L�����ܬ�Y���,2k̜Q�ڹc��xuμ(�,́�0���]	�*�9�!���0�˗��ëD�xT
�P\�=/e�%�¢p�Y<ߊB�Ҥ�3P������#t���X�I���,k‹��jo�T�0�5��t£qgeb��Y�tӳhh���Yt���d�d�LK@MV�<$ٱ��E�B!�O�
�[�]ۀ�3�;�E�����*�^��%!��S;���,�2~9�41��0�٩��cB嶍?mH�&ؐ,�Ж.pOR��+L]p��;�5�UXA�7�3�H�(�e��j�MDw\+�0^Y���n4B���ix�ZJ+�P#��Dv��z<��������X�\Q�q:ޓ`;&�iV�)�/����e���X��3V1�5�Ț�?��Y�/�S`����
��n�h ��iQa��BA'f+Ҍ��-�-� �1	  ��6�6�MU�G�n6n+��9/����1�Z�؋OW0��s&��^����f��$-͇0�d(���1�rM�f䪦_9�R![h�=�c�[��0��`L;5H�2�����I.(Y@�sH�S�_���9x�RL�ê�RΌ��|���q�ʊi���JH�|�&8�:h[[8
�xĊ�T�^I�����m�
��l���:Z�=�|���j[�AW���P�U۷���=�bV�1M��P����
��\�\��諰�#�k����D�YQݖ���^�4�y�iM�
0�~�� aE1����ew���
������
 �T��T{���젺E�o.��x�ԧ~����D�6@���}��������F�2�e	��ح��>�01���C��;�hG>�9]�:�x�P+�P �o��ϼ������!W���bm߭./�����4�8I\��N���$y�S3�p�)�z8���,6?:c�����8�| �
�J8V�O��Q��� B5�.�$M�6��.oڊ�3���
#��.�7���O�L�sEb�s] .,�}x}C�W�9냛�7#-倦��A
|���7��)��w n"Y�`�����A�W6OL&��1���k��~���X�<�<C�y͈k5�^��ƙڪȫ��Cܴ�_��-�i��q�)�Nj��<,�6-����}�	�|O�XF5g"n����pKaE�Ը)Ec��&�����N���,��P��c���=�!G
�-rH�
��v_��)�>nIP�u�&�:!?ukZ ���e?W��O��;�<ց��d�u��?6Z�'s%s�5L�#��8���M��胈�0#����}�^��$���"T�z�a�Oh=�‘ďv혴�X�4}�=!��N��������Cg��)���Y�
�Vp��O���Q�;�(?9w19�'Sc�e�n�X<��6�I2�PK/WUWU D�pip/_internal/commands/show.py�X[o�~�� +��g�^�'MzM��d��!F�veI��dݢ���I��e�FK��8�o����S�5�~/�j���z�s5&��o��`��:��h��S9�������n�sv���<����ײky�2�z��h�N=��r4��l���m�ʊ7�OQ� *d�-�qE������Á���2��X�8S-&����s������a�� 4����?��'8���#/g{��Z���R��Ru�A�zI�8ȡr�ޔԢ�Fݏz���Ŷ.DȾ���$�e�Z���{x���S��mV>I��7R0��:u�h+�Ϡ�u�`�b�NA�[pKӈ�����X�� "��w���j
��[�\6�E��5�I5=���8[��Wݞ=v����j|ϊ�pdr߂Y���!]^A�g5
#�x]�VJ:�f���{v��XM��rQ�n(<C:Q���]��V�;وa������P�64����Vʌ�
oo����&$
�ލM�H-�킸�V�1�zqa*5�*>7ճ*@�P��ܫn�����5���[�fάo7r��ް�!��ߐ���r��N��&��7�ZH�4�z۰O��2b�����S1�q�M��$��)�G՚��6��:B��n�%p���z)]v�X)1es�{�*-k:SM�9ŧ��l��
z�٫P�� �e�����EG���O�h�GX+}�az��MWQ�QK��]���.=��l��ʘD��?\����|���*��'��	�N�\�0����}��?�w�Q5'�|�/]`�y/BW�Y	(��;�VDz� NDR�/M�O+,���6����>���	�����
JUs��]<J�AK
�	S9Z�4��ɧԀ
�.CN�>�0ȥ�����G��w�A�B��o �Eֱw�����w}@h�8с
�鮩E.o�j�i�(Ma�"�'=�A ����J�+#����Մ)Ď�x2���/#�X �XL�@{pl�/j�$�D��r��#79���3�%�@h��F�A/ ��<��1צW
QԮ�zþ�N��R=�R��!��zsؙr:�F� ���<D��BJwo���Z)h���	{@�����K"�0��K�W�Ti�/�9���̈I[��i������J�S�&Y�VRLic²rV�XN	b"�H�9q$�t�G�4�o��5�E����$T]�e��%�u[�SB��TL�/�Ζ��8n!�Eӽ	��c��e
�?u�!�Z|C���
�NZH���f6/��}"�`�Սl����=�9-��� ��7X;N�iz|�#0,ѯ�����w�*�ԅ�
�`��G�I�b%H���,�xyUA4�K�6.OOq����$҂ٵ5��o��=�c{��Fa���u(#ʽ:���C�a=�Kq��u�ۘ���9�a����5��OD���nu�Ĵu�xQ�~�&W�.����̟v�����b7Hfn�q��׸��e~2��/��K&�1m��GZ\RNu�Lk�Zb��ߌ�֬.1�e�
_��
ۚkA�hB\�dD3�f�q%�r;���dž=w]3
tx�pKԂ�1 �L��X����9��
�Tf-/�4vbN]O�5h:L#�Y8̅�M�mJ��}X��I
�u W�yG �:T^�����n&��a��w?����qLe�;���x�����3�2�r���݆<������1`�kQO����p:=�u��h����Jt��w�Ag�F���~�φf;���������$Y���3W��W^��w�삜���L���Up��M`�]MSfx�?�h,�k<�%K����`
A�dEt�wfK�X֧�%K��hI�"'{��2��=KTkA��`�
$'�&�ƌ���穤+�b�RU	v}��']~���'�s��o�r�1����=gg�PK/WUW��t#�.#pip/_internal/commands/uninstall.py�W[o�6~��8P���F���źa@�CЌtd�H���xE����%Sn�		l��~�s��jm�z��j�(��@׮�"��/Q6h�;w�����,�[���?�ʵa��^���'K�SgBi%3Q��+Q�U*�F��e���l�Z�+��YX䙮*���}��b�K����t���W��pFqYp�(.,7Z�k"���$5�ه/���X�5�֭���"e)��Gc��c#�{��N�4X�r��{��g��i3h[.����R�g�T���
���b5�2�U�fSe����-Yy�h�ü�W�0s�d��*�˂�����(	WG�.<T�@�c���}gKP�9Q-�RX_T�K��e����j�I�$|���-[�����\"8
�@Wi��a~f�_�>*�]ܴ�n�� �TIm��\#AG���'��
,��f��'�n	�{��<����4P*t"Nx[s�T�h�
Y��#��6֙��Y;8Q�h��<�f��񀥮�[61|i,9C��
�ҽ�Ǯ���C��0Ʈ���0�{�<0�r,@�9�x��b�w�V����cF���YvfX��[��/NnG\\Rݻ4xA 2�#M|,Uq�)]��4=��;�&���=�u:�9Xy��w{<�$�Q��
�;I�&1Mbq^3�sOxo��8���J�*2[־dE8�
X�-^�9��8�'��j�����������l�_��q ��u�B�*��Ũ�s,1`�%or�<����Bfxk�r�6~}@cd�3-4��ad=���;��z�~=ն:���P2�.�v��55���Y�H��)u�qM�^JU�SC��yw��v
�Cг�i~�s
_�
�>%��{�&	�0�aqQx1��TZM�q���j�&��y��Hl��c��,{��9A/!X����c~)�����:��|\�xg@�B�q����y�#|�i*���븃�$������w�>�CՌdOC�9�K��W�8H���}��=���s���,��/ޓ�3u�[��߉Z�|�����$]i˸�G!�B��Τ �[747hQ�h	�}��hH��䗕���x���&�P�M�1�������~/����:������=v�@t���|��'�">=���
 �g���	�nO�[�p6��I
����S�qMS4���4��}��w�
5�*�rD�|��n�'��ą�vP�>��䙟y#���[��s�PK/WUW�;'�NLpip/_internal/commands/wheel.py�Ymo�6��_��(*��}U1�
(Pl��m��`��ͅU�r�ݑ�,ZrZ3["�ܑϽ���]��cJo6���dxն{���I5[�c�q�0X�K�l�s��]�Gi�,t4�ɹ��Z�����Po�er���rW�n�k{f`n�/�n'��_Zi`�{z��A�-/��mΉ�N�֢�
l'�ӟo޼��i
_Ks�Gm��f
�0�#�V�*|sgDy���Ǔ�)Q�l�tY㬕�ٌ��Ch����wy�lDy�\���#���bJ9��wҖ��mk�W�,Y��N(�/�F��y��]C�N�g|�s+�6�)�yH��Ȍ]�g��	���ap�ٌ\AE��92�ѷe��b�/f�Y����4{���37���k�0L�r+��*8vЭa������
�R��g^B�J��q�m,6@Rv�-=N��`,s1�ڋ���F�����]#��l��=�j
5�́E���{��NS78��@H����c�.�5�:���+߆&*E]��WP_)����h��~�Za��,�,ڜy{�E�밨ܖF�AŶ` ��#�7�FD58�;W�����U���M�Ck���7c��7�&z�-{9��
�r-��by��A�LB#K�nV�z��e��:6k��6@�R�BA��e�9�}�`��Ru�YP�[�b��:�Mj�1��8�Y?�ӻz�/OZV��+�.4�+�!ǽ;�0�|
��r��y��)I�TS���3	q�Yr2�^"�Ւ����N2����BP�!�x�枂��R�^�6��-+�5���0�lqP���Dh�c�`��Ϫ�j�w�K%`�
4?���t?v�0wL��b<~�n��t1*�ե�av�kMy)Dnp��Z��r󢑞B/�1Tj��0��8�j��-M����5�+JV̭��;�™��^(�g�V�/™\�=;Y�X�T�|� .����P-�0]�kp�.�_�(}'�}�Y0�ߔOd�u��
p���,��$ʫ=(�]Md����C�c9���f���;z]Y*�#������[a����z��b�2���=DI|ctۤT��K�cR��Q͜�y�G!��R�?.�[\K8�MN]�̴��L�,.�:�'��5|�3�
��[_�`N�.�̄�y}tT���+�B�&C����]"��<tv�e�a�H����{�ѐ#u���Ԩ~Xz�S���\�?_]6:&N�/NNW�I�)pP�A�_&Oo�ԓ�"�bEw�!o`���#d�*>c�Ozƀ�*���ֽ,����n�ء�h7�5P���ҡ�7�F�]'F���N~���`Ҽ�r�������-���q{ؙصH�N��S�ߴ3pXD*S��Zif8r�t,�a�g���*y����C�i�_�8֒���1%�����{y��;�b����z���Ǽ���Χc�3`ede�e��YX`G�b �y|���1Vl��u	T�b�=	K�b��������������O��T��ާ�lq���&T.m�R�94}n����=N ��HP�P��WA4֕�?
����L�LJ�YN7*�w��8g�A��Kn]
�q꼿�@�q^��J0���a۲Ĵ@i$DH���`ߐF[B�"&�Ev�����T~;�Ҵ|e�`7�S[��6�S>{�P��RI�=���k��ٳ���t=�@�Þ�R7Xi�f؋�fw>�~�H�s;l���IV6�r9.QNB��T��?��i�����pk��"�*�>�ޅ�J�	�~n�`&ynOJ��C�����މ�Ũ%��$j�!��Y:r�~(؏�r�'��m}6��@�	�k`ݭi��y�B]k��PK/WUW�u
.;Z'pip/_internal/distributions/__init__.py�R�j�0��)DwX]���`;�4�;'QZQ�neg�o?%i6�J
9��O��5p�S��
�V��"��6��>+�G���8�K!]��腪o1���(>\�%�G��D��������n�r���A)Ua
�>b���	����9Qc� ]�<='����b��в��!n��B8 ��m�Z���Uta"w:�i����C�����y���VQ��������2�!��:�xl\%������j��dcu�H�Wg��a���n��^�B�h�ů�j���8�|@��g��L�y\�`�_�c�PK/WUWdպ7��#pip/_internal/distributions/base.py�TMo�0��W�,�����a�0�6�lѱYR%yi��(�r���iԢ���#)�m=��Y�V���F��t��x���4”�P-��Bq|.
k��U>m~O�_���G�8󬬙Ì���?	筨��x	h�)_P�3)�� ,���j�j$s�jba��f[��1|K�w���A�[�����AԒZm�c���FJ�j���-1�r�?;{Q��L�}�I��R��.�a'�~pj
�{^G���>��X�	��Ln�z���b��9�NH��v0�x��(��A��;'�;p�3�e3ic��,0��Sع�T>{�`��q�F�I�:
�UHD�i첃�zAG
�4�F�+�2�!��O�n>���l�R(U�j��h�DNܢ
�
��Z5��=R9Qf=I�4dG��%Th��A��a�T�C�t~��$e�$�c��U�v(�M`�-lE���p�A�.ʉ����*n�m�K�>��a�N�	�ϓ���UV�G51i~?~�%{\��B����h����<!�<�H�X�&\R	�ih�A�]j�rik&���4
mlů���3�.�{�o)�9��!Ǒ��9��2A�ɣ����䟭�d�����i>Yz@?%�I�x�����o�=������ٿ�Ӏ�%�J��Z^�M�ͱJ�h��u|av�*�PK/WUW��?xxJ(pip/_internal/distributions/installed.pymRMO� ��WLz�MV~��c�E��fL3-��d) ��{�؏5�	xo޼y�:�C-�po��j��(�Z��b��;!���(^��i.��#�Mx�0�)���#,6g<Qզ��5����ty������Eâhz��T���]�?WY��dy�j�Y���b"~t�A�MM��z�Xj�aR�:G����n��3�E�#��$WihLo�@R�Vr�;�%2SR��JVi�3���Γj�ps���g��+����08
/FS���(Ts��EW�����1�h	S�	��s��IV��SI�P�mL{�1�k��sW�V�9Y�0���-bI尜�:^���9�7jz�#�ƨn:j�U&I�~�O��Hl̤�PK/WUW����+5$pip/_internal/distributions/sdist.py�Xmo�6��_A� ��~h7Ȱ�vC�.-��P*-�6���TR#��_$R�ݵ],@�H$������U�n'��b+�=Ӈ�g�.�k�|S��=k�hj^���+��k+X�#�h�\Ը׳M'�2�����^<���l�=�z�P)��bӑ�m���
��B?v�I��Uo{�4�*N/�H�ȹc�.�}���� �ң��۷���s���y�5�=E�?d'.T*Sݦ�M��Vvu
2��2W�z��:�XP�Ю3��l��y��y�����bQT�h:YDv�sA\��$�Z	
3�gʜfaB����nl�4!eJC˶�d�O��T��[`.���m��:�5�+�.:�)���'���߲ƿ���xq`o�������m�d�~k���>����"���`�2UPm��=�_���m���� ��-�����Ż����PU���H�?��G���dx0�
��D�e/f��L›N�[�w�:z�1ǹg�c�c��Q}$�d��A�M&D�{�i/�d��'["�8�es�[wk�i�jX..����Z��.�/
/Y{�ܾ�Bg��#!�J�zڋ��%y�5���6�(0��$���jDzc]k�g�d�3+&�S\(L�B�vc��,�h�ooږ�В��.�Q���X���X��׽n��²`�φ�W��H`�R��Y��x�{�X����Bc9��3��sm�Q�0�P
m{�ОT�+*��G��AN��䆭<+ g��b�ː�Pr��є�aŀ�J��
�n,i�#x������5Hb��7�5�ދmA�#�b��%W�7C��u#��Z�aRFbɁ
�Du����tn�0��x�v��+��l:J8���ޔ�`��?/~�x��E�,{�X�ʫ6͉d�8cT���{�b�8�
�e���H���!a�!_S�Q�xP�����>�F�1����l���	��]ĝ;�[M���0\tR~�rCN�%8D E��jL	��O�˜,gha�3�@p>]���jt�5�XSTPD�щ����(O+��t�@a?f��0i$i�hK�v�E�}=f,����*MLq����BqUη�j�&�#���v"O�}�
Z��5�x��v�s�y��x�o���C b�t>_�[�`
����#�Lp��>�9�ՌQ+�4�? .�p�Y2��a�
�?n��Ŗ���Sq�������1i+�c%a/,�
��7�%���b2�gk<��W*KV�e��W'⃶؋�ч
,Uuz�+S5�T�������,a����$Vr��x��m���T&=�,�cWΠ��w0ۣMg��:?���a3،Sj/��7�4�4!$�(��&�Ɯ$N�g�?L�7כ��c
�x�6���ڞ�?�)��k�?yj�I?z?���џb�t:��ɉ����|����땼>0x�%���E'�.�@Pa�go'�N
wӡ ��u��<���
�V/�y	tŀ������B2�����'��#z �\ӹ�u|��2�� W=��	�<Ym�4>E��n�z���:�ǎ��59q��KڞW��3gA0��6v ���l�l͐���5}�xe>5�2�8_�X�%cuN߲L�b���
���� (w��x�,kݎm�[�[��R���w��<���4�ٚ٧�����)gl��E�=��3��	�n�۞D�E]4��k���B@�+pu:Q,��+f���)f����Ͱ`�4���F�B/��Y�AՀ���%1�w�A��bë�{b���H�
PK/WUW�Y��$pip/_internal/distributions/wheel.pyuSˎ�0��+ZsJ�!0�H{@(r�Ό5�m��.��iۛ��lNq?��U���hrʜA
�z����5BE�N��y@#�����̵�HJ�����	��acĀ�Ve=��R�#z�[p��rFt�iSqA������G?c|�ѻ��< 	)H�
e�}�1��S�NiS �/�:�H�c<6r�PE�i��-Zyk�����wt
  A��.R�ϋ
 -0�� Jfnu‹X"����cGz��D�P����֡�)�$�ЎJ�&{E�(Y�}o�-~�œ�γ��#��k�XP"G3�;�V�猯�<�g+d� ,r%)c$Գ4��Z�����4��`mo�nA0fP�1��QO��)���~�៑yX�z;��Ϛ3�W���֖�@a'�r���(E`��fr�qi��_G�����#{�?���4�-�>wo��|�s-o;�L���W^�F���yO�,�(�kc�q9�|ڿ�5�
��Չ����5�]��6�H��|�]4��5�,�PK/WUWC?K� pip/_internal/index/__init__.pySRR��KI�P��+I-JL.���SH�OI�RRR�PK/WUW$n�	�x@ pip/_internal/index/collector.py�;is�Hv�+���܁`{S�$L1�Y>*�Geɻ�RTh��
�溜ߞw�	��f�cTSc������FE�ˍ۬�Ůow���Y�nS*�m�����F�/��}Yߝ6U%�i���R��m.�|��"�8+����~]6�2Cv���T*��fp����쬲�m0�jj�\5��e}k~6vR�VUy��V�X+��f�يM��xV+�ޟ�OivM0�U���u�lo��g�.���,=}{v�_�>��i�4��즒��U�w�����ߗJ��;���<�}̶���wf�O;$fV�<T��w޴�5̊g�#�+wIz/뢱���P�	�R��$��'��L�\bޢ�=��m�����==�Ȕ5�1���M2V�,:�xb-���TR�D��(�ߙ�d��T���r���.phje��R����]���]Yك�Y�d�n�TuY׫��� Y��!�vi�RD�������m�r��"��n��Taj�}n��GͥDk�ys��EYd�T��9�nLľ�i���˪�f�*Ē�rBy�ۦk�J̀;�g�!���/ �*<���h~r+��46O�T$MAԍ���Y![�C��RH#��z6�r-�mց4��A"6r+�@�%�X�������7�m��N�_O//"�`0����}2�� �}2ݑi�]d�-����� �hie+�)Q7<31;1�`&/�M�D��������=	W۩}�m�<u!�w8媒��Fp��������;μ�ȖW�R"��t?���d��ό/����t�d�������(�R�踏CI�;:����	A,�"�1�'�$�?É>��4b"kշ2�ve�!ٚ�ZԖ�:�7�;����@��b0�U	6�0@	Yp�Jd��b���v7#ehQ��9���Z�̡ѠD	��}V��yw��B�P�`�0�
uo���b}���f_G��FZ
�o$u��7��˯��<Ҩ�_���ģ8|�^�y�����.��D
���?�K0��0�'��|j2�C�J����3��MS,�z{yy>R���HК.�p엖��:"���A"ޞ���>ʤ6e1ٍT=Z@�TV4���{�L���ACI�~�����+n�j�h�mb;���Tv��u� �L�Q��Vv�i�m��~�6]�C}�U�͓+�]�'HQ�Gs�T��+P`nQ�������	�E�-��X���Pݔ�[�����Ώ9��Z�'��\����G�_|�l\b�<R%��r�R/@��<�e"�9y���*p	jW�eӫ� ��N":8�38�^�-ɳ�A>m���%��Ĩ�}bT�]�����%3������X,a!���@6�F!���!�ږ�,�t�3"m�<Y�����y9� [Ml�/;DLx�6�:FkP?��)y�gm3�:Y����q�`�&�������}���g#�9ƚ�yc���c���J�����ɤ�7��<z#�����V<UQ<9���j������g���>h�EK��"��)�����h���6w�[��s�w���E���wyދ����"��D�
���ub���ln }+@x�P@��g-C���G��?��C�YB�\j ܿ�5�ը��3G`i�ɺ�n�' U���B`���V�.��"0}��p=\���g�t
�;X����ߗ/(y	�h�)��앸9�u[���]�
���?`(F��>�b��������a�fx�^�v���	���$�pݜ���>@>����9��u��CΖle�ϝ��@y�m�w�-�l�.s4��F���=�EtR�M��h�&�o��&0 ���+�g�����6}]��1���<c�Ӧ���`yS��p�NS^�m�b���9c��S‘a�a�=9z�������yq���m*4�i��}�LJ�'K}�)�b������	�	ʸ00f�����Y�vi�<pĉxk�0�^,�PB �� �
�0��
Ê=�d��a`
.!4Dmo�*f"�hFu喣IrR�Y���T�k�C�w�$��
��k&6,�����20z-�D�]��9"/�8�)j��͈����r?L�u�`���i�s��K{u��;��W&�A>�Q���l�|�@�o@[�9��@Q4
�,9��Rs��B��*�����h@W�Ω�Łd��-R9�p5��#=9����t��k��h���S#��i���XPv�@���Eύ&J*W����	Y��xt
am��qEsg޶�W�)pK]���n���Ǡu�#�X�iELA1�Xpy��y�X���O��Ўeݍ6�9��K��̏񤚛ZcP���<LUSſBH��$I���L�9�`}��m��$�bA���0E�̪�JؠRFJX��Xq��7�
:�5�g
���:1���>�LI�"=�ft	>dN͑D?#�qB�����Jɟ]�O����j{&�\���`�r��|ٷ��1�
�)�fc�(6V����Q�+`���	�=�pg�G����B2��#d�4f��s�5�G��'�f0I��Q1%!&I#,��cN�`� C�#��'�C)+�(�9�BV!�3D��Ȩ��J�L�������;)GYQo2�0�Id6w|�P�V�T���3�`�yu�9O
�:!���q:ۣ�V�<��.�X{�(Ax*�Lr\8Y��
�U��C�ה����Q߭O�5�%k)��J�97���ǥ���S3N��lffQ`�"�-m��^|0���9�dB#���F+�8���ݣ��G�>Y�$w`�I�1Ѵ��Ez�5��L�6T�ϟ�[�ƒ����Q�	f��Ѹת����a��&�b��6�r"��C�q�b��-)��vG?d�f!�%idk��3�D�M�oh�jl{06.���:
��O�[�[���#����|�Om���F�>��O�.#�g<Eڄ�@&r�1)����Q����@s������<�`�	��>}x��(b������q!�y��Dʠ�Bā�s�C�ss/8.��r�a��Z����^����3S�[U�F�
ծ�Ⱥ�-o\aZ�94
���M!��RL9Z�6
�'�;���>L��%�k�-�?x�[��k\{u�N�A$F��n�!�I�'�4&]u�:A�ed�Fx����}L��
���0S=�=',FΗ��*Ǵ�[�
gW+�l�I�`�V�h�QY8
Z$�t��`�;����R{����:<?N"�q�h|z�}e��:�%�2��;��~I;�m��[Ew��h�g�]}<�5�� G�i�k#��l 8p(\=�]���\�|����C~�)0�'Bݕtb><L���p�Q�� S�'�6��|�qd�Y��y�=��B��{��K4��͑��8�X�� �XY@A�eL��x�V�\�+��'\��[�V��$H�k6�B�GO��/W/�M
���_�+D�?��dǔձ���0���$�[pW���Sטl�ㆽ�w��5gp��+��7�՟*-Ķ�R"�R=��9�	�+��̣I�̀pĸ�PCT�y��s�RSqה�[��yӖ�	c���i����D���Z�h�pKv#�JRR*�k�5E0·h���'"+
l}�ꣂ�cC���Cl��űm�փ�.�W�$�X�=�A!��=�ϣA�����y�����OK�qbz`���e��Һ̩���/�}�w���ş����Tw�\�b/�<zV�&��v��F�/�vt������1<lM=��(*y�Ů �S�]�p=2�ķEC]\�#'�^=8�93�5#��}8���1)����2��ƀO\��z�*��+(���g�քg&[?\��m�(v��O\k�V���ڌ)���]%@�/~�P6�*�r»
��B?��-5�9m��( �|���C����3��]���i\x�
��MS~����ǂ9}`j�]����m��@o�cxw%�k����p�	,�l[nkJ�T%rH��5r��C8`9��c�S^S���򉽯}{����w��-�^H�_a��hz��r+��{,�;��z��r׷�D产Z4TS��¦�w�c�m�,.�'�[	��9\�^�O%�l�n�_s{��"˃�
��0�Қ�
�X�47ͷ0 a~9[�l��ނ�-�z������[�
�	�_X��y��G���=|�]VG���+5)N�K������h��r���Ue8�?Ű7�tˆ��G��A�:鎑Wꑧh���R��;b�Һaᶙ��!�@>��V7-.�D�&��;����c���˒����}���nN�����~õS0l��@%}j��.:��ʎ&_bG����	8�6K�?r5s�Q�ř\#<d��&�VXD�!��,���O\_�b}!��Rf*�ޑ���2׮�D|�w)���K*\+��kd^�ֵn-��o��R�t�=j�q7*K}��#�[��p�a�j�ݩ̏�n�Fwi���
B�x��u�N�n�-D	;�֬8R�z3�����14o{�ͥ���么g<'�"�_���6.t��s�nP��/�s����!2��ƕO�L4f~�ጳW���#.h�����5���g����?�$͙�at�'�haj,N��I�,z�A!��o���7]#I7��և��5�b�76N��hp�Ы���R�]�G�p���T��9�Psx[�����vI!)]y-Dm�M�m ZM8'Zͱ:8�Bӑ��g����H�����\N�����uO��x�㙦	z����0�Ʋz����B���~~3��@l_m_G_�K�o�-��$wk�
O�
������XE#xX��5�JL��}����%MX|��{��Y���#<�l��_}���`,E[�����u$øx��6}�@�|�hD���(���{�PK/WUW܎E4�#�%pip/_internal/index/package_finder.py�=ks�F��+&�&�Nn�n���[N\�u\���+��ȡ�5	0hYq��_?�=�R|W[W�J�0�����ӯiL&��}_ղ�ܔ�\��/�^<���^���L&GG�v״���~�_��e�4�N?�z�z6�yU��?[y�n���v�T������x�ɣ�<}��L<i�_e�R�3��g9Ϫ��a�WM]nf�^��w��1�]�ˋw�^5m�+�o�sg�n'�պ�m7�8���ΠV��5�mL�eY7u�,7կ��˭���u��۲��g7�+�N���_
��%EU	�b�|��D=�ov$��[�j�V����uח��\ͨ�c�|[������k��i�&���B�͓j#q�槺��p�ogG�N�^������Z�س�~�H?���m�a��mVr��@�U���P�4J��~9`ݴ۲/�Mݷ�FCyBO�Ñވ���H�N������ �����G�=�&0�b��ug;��/�le��c���\����tJ_г������-m�q+	V�G�˾j�V�}��i��2�@v�v��X�4t�����g����<����=/���v���n�d�n�L[���p�m�-u��}�Y��7�r�G$��r��h�n�Z��!8�_����?��<�y	B|�K�9m�H�|.�^֝+3N�����vutT��E!����%����T1��G��7=>~A��O������ц���
�E1=:�i2ޓ�E�U6}���+ �L��z��Ȍ�0�"��������T�VX���Z����`�o��Y�)1K�n�)^s��nZœ�38A�'�y:�����߷��
�_�⼂����9):�l�;�p��˪�%a|�cxjkv��q"@��e~Do� |�m0�����g%�5NHld@DE	�~��?��x[��e��@� ���pC��YO�QMh�hfX����N}�w�{4�۫�Vu�C�Ez�f��f�<h1�Z��]��fS���oG����R?����W�l�#4y�d#)��E@;�}�N���?�&�Nic���=p�Cɵ���'�<E��$��h�:ۖ����#�t�uӀ���5u�ϚNf�{�nk�A��YUk:c{a(��@�͂Y�_^O�4�}B�?-K#G�
2M�0ɺ�#6��p�cL3:��&Oz�sR�<m�0ɣ��:�xReh��'�)��Ud���o2&�YXP���B�hsU�o� ��<��;�Ho����UlT��-��6�����8A9X�.=?
��ng;�3\=��p�Iۦ�%��}��o�V(�X)I�*��M��2ǝ
̓����U��W_��{��W��������M�����U���W`�����P����A	r����F�%����ԁ�	���Eg�E,[	G>l`�JC�U.N/�t��gP���
TQ�0��'ԙ��=�~����KG
��Z�r<�!+@�Bnv�N6xJ.�@�J��؞iH�pD��݉��-�+��V4G]Ǿ2&g�%�[7��+T�l��{&�m��&���9m*l��yS+ː��ӊc͎��ʧ@2X�V���T���-K���sH�SZ)�l��!�Qhv���#�(�xy��7+d�֬��iZwϪ�l��
�z�k��R��g
�&���pQ~��R�A��Y��y�;�(8զ����w5��ܒ/�o<@,�������p)7������!���id{�=���*�X+��(C|��tj�s4(� 6V�</+�5Q�|��gJ��bE���ý�}u���X���N)�e���?�͠�QIJ	Ѣ�r(��))zq���fB�_MI �d��z�y;���b\�
as����hZ&�*C� ����v�x�R�� �`�i��}
�Y[dC_P�t�E�̠����Xx���E*�ރ�� �Ao->Z��}7����]yM�?��9�6=��2:CӔ/ۢZ=b�9-��|�M��TmI<1=��O���9�fh/�������=h�S<2A�_��/v�f�<��5x�����-�b6
7���D��ŕ���P����x��fVu�b&�`|���N_J�N p�4C�i}�'�p��}TUz�X0ƗPgX����/{P�W�
f-&�M�#�l-�?PV"&�֙��XpnQ��@��75N�����'i�f3������A����V	]�A�Z���45~nK��޴yo_��q�v�@����,ig‹ب�f�31��%�4�φU҉7<d�Z�#�a=q�tK�+��}L�w�,&��L�T|��\Ht^�^���'�'��xD�J��Dv��ɏ�ۭ
�g[.��{�
q��L&���nr[���Q\���by.+��u�;�3�_kW��@y�R�4�Qğp��N� �L��̈k\\+��fQ@.#X9�Y|�H*C�3<x�6pi���x��1��24�\�#�e
�S.R�D��w�vY�@�6��@�|��49�k�Ŏ�������s�S0�*,���5��f�iw�4=�Ԏ��gzh��W��c`w!O��2-�iLo���x=�s�Y�3�>�>�^�Ӝ��v_c�E�CN+�$�@�K-J�Мf��L#�f�
��	0�wؖ�!�߉�+e�_6o>�<�	0���_��{vUQʲ�|ͩ��5��?1���o[jȫ�����q��#pF����('�8H���Ozn�
kS9"N������}L1��x�D*��o&�m���Wsn��}҂��kn������.���N���׶��~��d�I�C�maA�z��$�m;��Ȧ����^�j� 	�MЋ1�;)��!SƟ� cP}�"RA��8{���q/�2�6�>�L@��&Lja8�hpx�ҵ�)`
�� ����|^R�[�SRիd���sGǡ˹�m�1M^��~�	!*�}ﺼ./��S9p�b�@�dFG�"E)jyy���x$[ �
�&}/�ߓn�{o�
p"�h3<�葇M�_,Y��p��:8��ß��0��{^V���6��uQؓ�e�>N�Q�
ۓK��4č�0�G�e[�B��5��J�M/t�(����fX�9��:��	�t�5լ	j�v#�XGէ��_�M��k���$5���T<
�陔��C��|����Ɛ
u��
�35hR�:���pG�%O��dW�j٧~��Dj�����y���_QRv&��|�G���<� '��[�-qG�8���˩���)�zG����.�]�?β5K}V–�U�H �ps�(�P4mQ7Ū:�z]^�}G��?��ͱf�2���ݾ݁�PvA�"X�2��A������3��]�,J�}E	~�C�, 	X��ٕ�u�ʍ�ö�!����	�-�/��ʙ{^�v�^Y�����z/�+X���V>q��wc��X�/�^Ho�|�n���`+X\�V*���04��]���w������k�&J-΢��d�Y'�UY�p�f>kNc�N�RJ���#�A@�)d�l�^	.+�&���	���aR̠PJ$)gX�z3�}Ç8@�A=Iw�PŪ��K&��h5N�m�aqR/�]���I�5[�8��.DbN�'(8'0*% �G������e���*s
u#`~'4׹�Ƈ���9qJjA��8�Mҡ�� M�/x�w�(@�4�o���V��>*g
0O�� o�|�|
�g�ú�����_�T���+&�d7]��7�ݣ:ߠ�h��`�l�Fl����Ls#��5�xu��q_o��x#��<�9���-�K��W�+�
���18qtz~��a_y�H �$��6 Y������{�C�HzL8W[���M��g�L�7z�jd�P��^�AF��5����"�%�(Ɵf; �0���E�L��<q���4j&����d���"0�rwE�Q��e�L�!>���~���1L�^|��Ř<JRj8w���i0��L��ENN�@`�;!ƲԐt�J�Vbn��2��t/#��d<?��~�C�ڤ�[�ds�/a2�c|��Dq��$^ω�V����L,��z��O�3g�ׂd��k����@�O� �]�r!1�&[�R�v����~�ؾ&;��Gǃ�k�Ħ cЌ\�
3�v�����4�R�o�H���^��.�g�^uC_1r=eC�z��i�c$̖r��ya3�4 �z!���Nsn��~�5�t |+��������0��~G\,����I��H>�;z~����Y�ܕ����kHj�OJ���ߵ*j8Yf���/_���%����̑�r�:�
=�k��Y�h��L�c��
֖
>@c�%x;n��m�� ���M��)����e�TCRӅem�C+���Q@B%X;�0�hWMK�0We���~�N����4��uc6PG�<Y����YUD$�L��E��C j��Z�gEi�~�g�����I"��G��Q2&U�Obcg
�Yݙ�Ty�d<)��"�T�/���9�EY:Fo+�m������gx�F�������ƅ~G�L�*A��#~��T�Ah�����œ�$ݫ	6>8
Z����
�7�%��wTL�oiδT#���)`Q��\]�E[ ��y�J� 2\n�B��5�8����W\�W8-@)�D��[~�0���EY��f�>b�@/���f�t4�Ce�
�E1#Xxda&�}EsY�:��X�0�
��|�2�������<�~ %�]�O�Qj�@a���y��4M��s����$(��S܄�8��h�25	�&��V&�{mQӮ�A��hD^���$���垱��E|�FJ�(��5�l|Z3�V^)�ء�?]}O?S7_WRd�DO\�OK�'XyF�<��pk!羁߀�~�G�<�tK�8�g5տ`I|:T��1��|��V�k
�~y��i��3>�霬�Vm8`w�n��7���V�[��#/^�2��;8�z1
ܣc��s��	jv�%*3�AH����@s��^8G��Q�!,L��P�ͧ/�9�]>�BUw���m=i�W�hQ�U�sI*�ipY�b#\Z	��x	��QU%���3J��y�!P&��J���t)�?�T�Nj$Lv�d�'kgE�r�>uFn:�\��a;c��h���}�D0�
��s@p׌��AI�J�{��`_�
8C|�U%g��L���b��̄:��'_�*�S_F����%l�KC�T��C��xWg�:��A�T�Ds�_�j"_��4�Ւ5��37-@-k��;N|%�l�n�z&6�A���M���B�.
Z,%^J�J�a�����^����m_�"\І��>���pl�z�?�fV�D	Z9�ys��U2y9�k|��	����q:is��N�Ԝ�Yd�qv��D]�&J��m�&�P�nam���>�;k��rP�1�Mh��
:j?��>�#���_nr4�.�DY�	�A<���!�І��Lco!���V��k�N�+����i�1��dB�g�Y�k&&���K����`N�)����t���^N]��]��g!�W�^Og�W�_[X��+(�M���#>l?L�r�^�>$��\eֹ��Ga�% `����SD
�!k��3�j}F��g;��<�.��j�r'@���x�eJt�dΓk���:P/Ge۩+����ě�V�0�k�{��WE
�Xi�0�c���T���Ȟ�$
�n��uLp(�;�e���g0�$��#�Bt3��$��1�3�0`����y�䀈�$��C��`�����F
�!�����ۯ*R�%��\!2PS0uC:7���Je�� ��PJ5^-�ˋ��e/U�kC1J��`h�3<=t��>!~p�#!�$�r�(���"�^�<��i����2~-N'�����f}�@��1�����m8�KG���`�` ��k��L�G_�tT6��S�0�9`{����]��Яb���3�UuS���
>�U&�f8�{u�'\�
{Sg/��8xR��/q8y`�:7bϔ!�$Y �*�:-,-�I�n�7�"�b�bd�_5�Q��t�0ݤ�I�i�$h��j��r@UK���7�tr
����=�g�ru��l�6%�3f���I��e�\dx�ť_�R)3sGOU���5̘�7χ:�	�ϓ��K*g$�Ei��H~"o$q#LO��KV�:V>U��Xj~������ɳ���!�in�L��~�!�3!�k�iH 
&�����ڭ��
u��(K�����z��%y��}�}a�7�Y`�",��H+o�6�e�y�.��m�[��Bwj��W�+��r���W���3���E ��^��F���KJ��:��~񱱉[C�p4a�n�#��?�"�C��E:w"c�
��s�!jv�^��v����9X����$��p*�g_�\�5u[S<� R�B�qT�s`|�o4
J�v?�]�<��܂�?��2�0���������ng�]���&���"u��^Ir��9��(���]�>xm��z��Lj�qW;�MT�y3Hm�)	��*2xU��0�r���o�nOU�1at��K��U��*>�=o��돰�L���B�;v�'N���<�:?i��g"O�=����F�"=_�-@���;!7��~�V��N��
\,��bV�L��V����䑛jۗ�
�=�ݛB.��Q
��n���
t�+k�*i�~t�S׬!��HoMM$�(2�O�r���H���5%ݹ��iX�M-��(��v��җ4�� �� L�0Ւl��,Ӭ��e3L��o�q������-��S�O�����.%�.麑[��������I�R�/<KL���=lDJ¸��Mc����K�����mkUM�g�D�2�#q�٩(6�3z0�!|I>�������U����j����\���j�2�9��ܩ�����jp�.R�~M^�)��s��<��r�[d���]Gq�p+&��^t�>ð�b�X�Bqc�D���`��ay��y��8E*���k5�\��9��|p��dR��~i7<oS�l))�:�dz �\��� c�WfYSo�`�$T0��ev^i�?��7\�r<O��ZԵ.0��u�AH]�j�ˉ��8X'���i��-U�`����V����sL��+'Ag��+�8��|�n����ϲ�
U��@��
�d�
>S&�w�q�/�<=$��h>L�o�=l��̶�̂l�{'�]�]c�&K�SH���S�8t����op��8D��y��K��SSLp��4�^���7Zp�q�?K�/Mc؀��`�P��r:�@��4��lCߊ������R��f����p�N�Ѕe4�JN�Ȧ�3C��|;���F���Lp8xVX��|�5_^�U��:*}t�<y&�/ir�u�p
�ٖhQ�вs�$�h���c��`,��mr[RX�T |��1�;�F������(G�}ViFCk�Ӫ;��z�'�MUa���ɷ?}7U��/���E�
iry�>F��J��s�s�dt�L�Zr����O?>�@N'$#�'7��6,�~�?�{s�x�#�UW'�n���:�A��3�J��ձiX���c��J���>���J�7�Ö��8��p�^?�(�����+�K�*R�G4���U��k�4LT2�C)���Q��j#��
݄~Tt��}HT� �
��� ��NxX^�?�^�(J��[>�VU��]5W���b$K���ۤ�Ƨi�&H���ScG�]�?c�@n����0w�9��Q6��N��Ђ�W��7�gb�;o˕�D�۹O�+����'��!�k��}0�p��<>��
%LkA���'�W<��?\����5�x\u��8h����70�D���Ҟ�b���x�=M����pyF�b�p�/��s��[�BG���m�(��c��o˄�LS�橔{�1��M�}�?����t�UBV��z���հ�+E����"*��em!�/��UV����H+k��y��%:m�ْ|C_����P�%u7�uQbq�!�;��-�!x��G�ݪ&��@@�}=��o+Xe7�x+�'�>��8�5����xk�nzݕ7��O��g�k`�)s�����E���MC�	j>�����1FSz��zot*�e��]�^�$#F�͓i��(����&K�Srq���r�w"Sb;A��=qVN�n����΀�thh��Ws��k�cB�UB��(��I���v5�~��9i�&��@9���M���ދ�A�f�u��HNj@�����N��X�Uǟ�Ipk��+�2��Fr7��Z�����1Qڙ_zG�Cr�����
n!'S>a(����v�2I2ޞDTo�9�ęp�)M�Y-/%ק�N���7���ll,ZdR樐��j[L”:���w�����דm��`�v��$�5��	(��ht��
�>)񨤛O,ur����C��
O�BU�B���^h�SquO���
�!Zc�����:A���7�˃/�Q8>���'��kI��T8w��O{�.�pB��#Ɨ/u� �w����1��9���C-1fC7���U9`.�X��y���\���b8(Gw����\�py��w�MSge{|?�w״���14�M�a�p���M/�o��W,q��
��j60_��D�(Q�6^.t�SAk��}�o�����k��̦����W�ǔ�
��\h��T� ���9"ԑ��\�����x��n�ܕ�K�™:��\��2J2�_ͫ��USr�:�[���֓�Gˉ|3���>��a�s�
�4��)/Ў��T��6:�Hl�`���ȩe��x��]�����_'{[~�q&�r��e��=�ǝ�Ȑ�kTGoq�m(�T�HF굄���0��Ɯ�gC�w�������PK/WUW�Eb���pip/_internal/index/sources.py�Xmo�6��_Ax*����\��̀�Y�/�!�m�E������7�J�8I�
G"��I�/��L��V�@�Ͻ�s{,��T�V�v'�:�h�g@\����J��%���r��~/�PE*#vu(%_)�8P�T�W9�&��"yjy-o^�"Q‡z�R75�އHV�AK�:%V%01��w��6a�#�s\�Y��x����$)�=O�q\�C�76 �]t=h��q�1,�V��)�r���툢/����T��C�J�e�L�!���:�Ӏ��S�Uɵ=�W�7.7c6yׄ�Is<��F�Kn�0��83��G�#䏘���oS���aթ0�}Tv��d�s�K���J���Z��J�d2�B� xub�A2�>� mP��`��v▃���ЯW�-�F�3�C�-�kF���r�o�1%�Ć<U�cX.4Ϭ<>^��H }wv/�&$� ���XM
a�*�B�"B�=pc|o�"���]����K6����w�;\e��Pri�3���eS�&�حY��
VvNNX�&��(�	�p�#��Ī	8��j;?_턁�T7.�2(�(�*����6�,��[X��A�Ք�P`�A
U0�f�6�(|�q#�|��z_o�#�dK�#l��Mp1i�櫕� ^%����Dˁ�@�!
�G(���B�I��q�
@Yu������;�<���ϸ*�s���M�9��#�!����Є��ʸ�k���ڜ.!�X�l�Ԁ�'��	*��&��˜Q�?"T<$��y=ßitcT����=�ؠ�$60�)��t:Y!�ù>a"�
Kٟ�h���RAw���X��0��{
��.vΡ-���a�+Jd�[�z"���ml���,\�^���@�
�)T1�Q�2�``�ү�>���J/�.���`� ����q�7C�C�V�ppR�Oׯ묺r/�^Y���b�z������ޣO��e��e�kB��;�o*�!����O��4����>�6�ND�����
kC��p��{�PC�B�b'OE�[��Hn-,��-{Z���زZ�21B�A�îH��y��
I[�ۜ0�!�ĝ�\%���������H>�]	�	������2��ْTG�z�����&��2���lYE��<z�<Fp�����G"~�Ȅ�{�SƾasŇC�։?���F�G7Rn¹D’�Hll���,� 6�-��-���=��loIOZg�ΕYOZ�ݓu��Ol����ro�@�">�E���|k� ��J�|�F>��ns��J�Vl��t�$��J��
���lȘ�d�����şS]�����i�@K"�g�Yz��n�:7m`���3n�vfC�������I�`f��,�����8p[�wc�:VЯa��I�J�qwJ���4~�Z:=t��.�2���?��ǥ�)7ع_R�gF��r&z��SB/V��#�K���&#��w���8|)��+A���no�هT��]Hp����PK/WUW�"H�.<#pip/_internal/locations/__init__.py�;ms�6��+pt;+��T�d��S��I�ƻ�㉓�����$HBM�:�������� E�vڛ�L�H ��y��r�兘��ȲDw/$�|�ҹ�����X$jl��>N�t��Y�-E�^a��x�&E_�(S��E���U��4N��c�Jd��\�U���9<
��T&:ԓ�\J����w��?���z�nY(xu�-k��瓳7�?_l�>��\Nb�̾c��t�k�*/�8��}+/�X��T�Q�ܐ�}Q�s�8֎�nG��O���G@u���C��沈��Y-U
_�\��C�O"�{�nyM�(ӷ�,���&˯xU�BF�xrϥ�R�����:�(��$��P|��A���	�ıJ͉�U鯵 �?^%qZV[*s�Xb���8��j�<�����N���.s�Ш}�Ni�E)�+���������+��P�_��qQ�]a_�ZE��"��_��/�ߟ�p�c���O��]x'4��2�2�r(�O���6�3ЌEV&S�^�$ݞ�)�`��LM|\(�6�J;����Z�E���:NJ)2�VC$��ۯְ�	X&�5�^W�,��X�?OƒG�����S|P��Y�I��(��T�р�TN�'�k�eQoi�<{J���ױ�|��!N��w>��-�6R�(��>�X�c��j��@�@i]J=8x���wL%1��+.Ͳ\R�X%��D�K���l��я������a���� �2OI&]O#�:ЄM�@?��G����E�t�L�Yр�,�'�{���G�$��J֢�D|����]�M���2.`��a|��d�E�Y9_�dcZC��b)�Y��Lh��xb�H1)V.r4I�u
�p�t��+	D)
@�b��W$)�	T�z�������J�g�	OD��v���*��
�Q |D���8���x"��0����ѻ��wG_��N�:>�<��g'g?v �ɻ��9~��G�
�,��Q��d4^e�ӧϟ=juX���$���a�>�7*I�d�sc���4��s�p!���Zظ��pE�f������[�ԱMr	<
�ح�O�.>��F�/��"_W~�L�-�%���nSp����`�ۉ\�r}��Y^6fZy��r�P��
��r�@d) M�6Ju94R��\d��eC\y��I�^0��
*�
�|�Ȫ�X)�>Md��v_̂�o^�}ʝ۞=�3P����`_��[�6�ٞ�Xn^�^ T1��w��O=��I0d��KY�$/�I{��V���x��V��|6
���6�@i�Ue��
v�}�-%;�A-���Y
��&^���L���`�0��[>rT����0�u�����n��{��7����`a��ú��@���щ���s*�*NM�"�7�\��)H�&��3�Q:��x6��Z8L�e“l'm{��VoeCS�G#L<Y�!�K�V��y42�l^�������s��G�o���$!gC:��&6�������)EY�$=�A,��e�.hXQ�P�%��)�G�O	�v����
�t���`v&���l�+��'9)X��<��3k؃��kl��D�
�d���95��R�,��XB��50���n�g��3$��D�ֺ[s�������΂�2�"\�P�aƵ�6��E�c ����A�J��1� a�۵��nqz_5�g1�y Sz�e~HF}�
98V��b��L|E}����5�6L(R/8fL3���c��3��*�̦e"�ZQ�U�^�9��aBc�U���p{�%\����dTp�Id��*�6��c
l�^k�uXY_�RLC
/��'m&+�/_�PK �1�#�7�U�$���:54�)�Q�X|:;�y�1
�6��P#��s)8d	��:�� 0�G+3��k�k����N�r
Nx��r�ہ���|�:B5˔�l��]�O�������xr����h�s0�j$@X>��	��2
�xX�K�%8v�ȥ&��y	u�A4b�0(Q���=��� -Z�-%
N[����!�WJ�BG�C��W=�YQ��j{%ח��5�B��%�J��,��$�c5K�8y��?�����ʵ*5�}�ښLMci�;�1���np���'���Ѝ��}�!�����ʟa�FQw˾����Q����S��uo���F�âe��
�@�^���J&S��Æױ$\@]Ր�wi�X�La�C�ia�?�;�YoHP� W*������r(��ľHdZQԻl��;������%���,�\�t��s
H��i.���*K]NR8
5���T�	 ܫw��Wȸ5����OԞDN~�+5"lCqNnDF��,��}��~Ye ���������un���O�р�[<��������s���+�[�P�i��=R����"�C������8GGQ�ۂ%��j0pH؂	^�Z��Ms�M��J�E���sj�mGC���4��|TUv�C��ǔ�
ŷ���8o,"��6���/;w��^�
��=x�O��n�9}C�U�j��<G��������o����px����u-�t�h�،�
�Gn	��*CB�Ľ��܇�C��Q�C0��jk�zd������;z���Y�%��t1��0�̴����)�T�ɍ0ȧ\�����}7;��A�p��ȇ���]٫u�ĘN�!s�%h��}?p�z4�r��*`��.��R�O�5�ݱ���5�\��n�;RS��	�z��R�P\P�]`��#V�s�q9���g�J��t!��Բ���w���L�߽�O�=~^Q�J�"�!Ҁ����rp?��6�p���%�/ܬ!*�Ӎo��x,9H��̎��
W�3ڍ��!�B8ݩ���e3���''�LpֲȪv�|�l������Qm�N�1(��aL-F*����Bz�c�4�!�jM��Z��Ղ�р�g��$�D��3Y ��YH��I��A�3�L��j/�65j����;6Ӽq�ݔ�i�!oS	}�y���w�֢M�������}j������)컭F�؞�ϔӰ��<h�N0=%����J;��a�Z���اYȽr�^��_3��3d;aZ�$�Ljt݆�j,���nW�p`UH]��P��M�+�*6��Q3��&27��,<x6�F�IxZWHlo����,��tgYuK��l۝��������M�c���vݭ5Uﴭ���陑��*}��91�{,/j��!D]6U��
�U�r���%�ݭ��n�n��Bͷ�/8�6����o�����;ϔZy��ιg�WCwH�
4-��
�%f�|́��n��<�wre/�L�j�Hu�&�T��mw�BuI�;Pv����;���^��#�)��'�h�]�3���76_¶�\P���`K.c \�����{�:d�Ǘl�[��#���]j�U$4���8OV�UW|#ê��6���_w�L7ڛƸL�UÁ�smS6�<�-��9���/?��0ǦCՕ��Χ��p��8�T�׫�L^/���Q{���S�JTf�����D��5��ƾޅ���̐�i$�Ģ!=��&7#�����o��`k��j�y`������R�\�����Q��k�j���l�ը^�2x;��C�	����JV�=PL�؞g�$߬r��/�4[7����y�����I.5f�&.p���F���8�ƃ��/�L��lp�ƃ�ǴZ�|�|����o�5r6��@�R��٥�C�!6O��ŷm��R��w)L����.��>?�2��߮~l���]� 6Zb�NM^S`v�0q6�rg̭�g&��Y�V�T����Ef:�{��Ɯf�I)����Kd)��
((�n��e��N���y����jwZ��ᗬs�G���s���߫���]�͆^����y���?H�-�8]w=�\Qxot�Z~^�W���n
P�,��O��\���s�W`��\��}��&8�nq��xC��5��Ŭ�~��L���
&�\��-�b��L`��/�N����D	��ʓRӤ�
d��,��|؇�$��g��a��
.S��M�a�~���C�Io�!�g�Y�6]D�
g�:�[*x���� �C୦�u7a���=B���~5��M�����
���w�vŎ�v���&|UC����ۚ�������ׯ��q���
���x�Zc^o77��
^���Ә ���3�rٹ��HLp?��R��m��"�oP@-�`�����>ҕgIn�V.��&n�hT�q׃C$u���Zkp�K��?s���;$ ^Z�Z���
I>�n'2���V��j�TI���\�s�CCW�geJI�h�g[�c��˱�*"�	�~�f4�n����OI��t��G` ]2��~d�#L�(������Gd����Yz1-�/
q�,�rj�px7������mx���_�@�Ǣ~2�iJ��&�`+C�7��vB�d���'�wߔ���p&Kf��q'�)~f�}]Mk��gx*W=�M���~�7?����ӇH���P	l�Q�v�l��/S��[>�PK/WUW��||	�%pip/_internal/locations/_distutils.py�Xmoܸ�����QX��Z�-���Z�i�)��0�D�2ъ:��zk$����^�v��Ʈ�g��<3T�$oUɭT�a��Ђk���j�Y��ZnM�dk,ofl_��L�d�8cv�M���B~��ef���b��ث;Q1�A��S�e����"����;��]��^������ϼ1�v��Y'�sö�����F�J�+�oسU����&��x ��;�TchG��Y��w�|���0M�5���Z��K�a��T+���]���Zh4;��%5���q�a�Z���3��j+���ժ;v|�VҘ^����<�VZn%�@~��1�	�-��p���7��
a��V������Ni[iR�+v���,sL��.��e�[�Fk�3����lz+����qc�����m��L|2G���ڏ'��{��Ͼh�ㆽ��a��*?�G8
ׯ���o�������"�Ğc,�`Q>�9���l�-��ݩ�h�Ƌ�cG��猽������ؿZ<d���.�*:*lo��@�W���ʝ@�Dݯ��G;`<H�z������Ło�A�]\�����E�VB�|01�p#���g���l�y'4�s� �.#rH�uciQ�|/�b�X,*QO��M�h�	:6��r]���Ŏ��N�X��
�o!�)��R�{�Ҩ�#E���iQ��~�lQxd�l�9շdvP %�u볇8���	b�H�1&#�c�J����F����0�xr��Q������|�%�
}���w���f�oSj�	�I..ZuAwQ���6�����b�!�~*�î�
f��f.�.��ep�DZ���l����	�C��0ގ�l�
$+��D�#^Wд�F��Lqg�k�?�{�%�\��l�ϟ��5�b:�s�rk&@	%�J��@f���(Z�I<$�S�'�cMK��(��29���<�{�t�,��}p���$=N�;�Ju� ��Z`,M�aK�8Zq�A�«GaTD�T���I(#�L����y=g��o�T�-E�0�����߸Rkd%.D]�b3U{cb�w���A�:�)La��CU���5n�Q�^&�a#3�Y�c��!�Y�m߬�i��Zf�i`("���j���e���.��k�|��_�G
�s'
h��>�Q s���K?Sx�1�d�u`Y�#���A��w����S�#zǜ�rs�枈��	q�yb��"���I1Z��o B�~9��T"w"��{��E8PG�L'JYK�Y��3�N5R���y��m�bP�Qdz*s�Sk���S�
��x��ݱ]4�GM�W��Y�ic��|j2�o�h^�]��VD�?ݟ�N�����;L��5�ɜ�8sJ�g��kd)mC�/�n]�
`;�}#�A��B��,�(���P�<{x�п�vd���y�}W�M҇$Dm�_�����p�0Ṇ(���9��o��V��>7�� !���R���|� 6�	�}9���	=szOB�;)���t�N|���LC�.����q8D<F��y�'~Í�UE�坘xf�5��r�7���GY.o^�δ�f�Ȩl����m�\��-�j���������S�7�y��W�%i�}J��Zө�
r�z�0i�	B1�{=0TiU�t�v���*]	��{;\���
���w
]`�GC���/Wz���*$�+q���9㍻�Xq1��������Ю�DM=w�'�u-YK0��|��^�S�F�HQ��3��<��%,3�}�0�%Ӷ?��xz
��5��O�:�42h%�>Q6|��G�KC�|찓�)*G�r	�\S�{Aꫩ�~�}yG����J@	u�R.�q�����o+������vʠC�R�m�h�U�E�c'l�ة�1
����}6��v�~'�1{���ѝw�C��s�<��@f�;����\\b�zv�,ַۑhC1EBq���^>b�lR��"�Tŗ��#N.'츑m�J퀈֡}���Ӛ]�L�K���E�d�B)6�%oqp��y���;H�0g���(j`Z���\RυE�Kv��H-�o�OhrR�t�z����-c�r�O�H��,�/�gl�˦R`O���sh8G��>��@�T�VIJ��\�D&��.��7,��Ċ�,�&��g���+�Uo�Q��
b�l�\Wl��׬&�?(�%��&h���9�~K����ʍ�z��f��zzs�R��Y5"�]���Iqo��o,�߬@�¥6���6s�~�V�G���a�d}�t2�,���b7�9d�	�����”�/���g�|�����WPK/WUW@����	%pip/_internal/locations/_sysconfig.py�Y]o�8}�� ԇ�3����!@�tӝ�d��i��(
��蘍,
"�(��\��([N2��A���!��~�r]�ڰB����n"�[��Wz��T���*��Hf��՚U�JRYQ��H�c&*#U��_|Y>�B��J���^Ȓӂ�}Ԣ�,��Ea?�+�`�*�N�i�o�r�ϋ�׋�����6FB�A֦�(Z�)K��6e.��J\w[e+^މ�V���N�tͿ�:]��D��BR�J?�˚��F��	�W�쬵s�+��4MK,K��d2y��)#4S%ù�8�lٔ�5d���%��r�ز�����%o
�:�Lg�9�e^&�6l! #؟����V̬D-�4+7|ˌb\��sL�B�mV�@Z̎ҪK�xļ�q<,֬������a%�^wZfj�\�
47���f�a%�g��f��,�Y��������+��݂��+�X�l�eon�f�J����I�*p��X:%�rIz��<g�~��j��G��F[��l�3������忼Y��$=����立ԑ�.��L;$r�����������ۋ��/�����K�b17�����!jX�CE1�S
���R�RM���C"zGNg�l�Tq:a�����J@+2�y�a�|(Z�E��-�թK��
`�6�\4�y�A��y��+Y
�j��ڱGW"���p�X)�;/Dy���q��-Y�_�	ɥK#D#Ľ�:y�$��?�����g՟ϑ5Zv|�Ġ������
��,�tl�YL�|�ҎvQZ>�-zm�����k>����΢S5�	%�g��e��Z=���˂/zN�!C�sJlќ">/h�cCVi�"�a�8&S�f��<7ك�ޣ��|k�9šF��fa6B�O��p�FMFmW�Ԕ�#Z4g}	+/Ċ?Hh�a#
��� (�R���4��0�X4H��7(��oS� 2[nJ�܃�N4�3!k�:m�Ծ�Fu�q?;uRt$bšZ8�
��8���?C�S�Av�r�W�H�I[Z�@dɬAz����-��]j8�,w�!��d�������6dIμil#kU���Tt9�.?�k�%6�a���͖��'(�6�MA�m�MK3�� G�8�y��GζQ/��Pr4�?��
@Q�	��Xi���)[xۨی|{�5t?d䖠�Xe<����?�jڪ?���{���!ܔ�f	��-�oȧ�NBV��~Sڽ�t<�3�{'< ݂8��H��2з�ʛ�S�wj�{|{@��W�c��2�GJ�_��TF�qT�(����94
�
SS?��hͳi쏢6m�{?� ��[����Ʈ��%F%B��w�{wXH��a
|,�٨�l�s��z`���k��ɀ+E��iК���i���+�G��`iN�X�AIM�^l5mDJ�(�z�Q�	���I�˵�q���|�s�CCv�z�(|ݯ +�O��Z�މG���G_&.�{�>�������1MS�0��^U���� A�fe�ǰ��)Qŝ��N����b��s2Ω�II��	/>C���1�2�qx�2��"򱝜5���vw(��߿�
D~�D'v�J�y0��s	�8%#j�S�IhZl�o*4��N���Qw��Yei���c�v]��*��Y����.V��.��ӧ�q��0"��C��M�~PRv@�e-2��k�Cj-��>y�;Nޕ
���Y���t�v_CK���4[6�Ш�Y�N���i�n'�6.��D�V�,ɖwDyts��,<QK�qC��j�Nզ�Ճ̅�
��˳��.5�)�fdw��އ����ue̢v\�+�M����t���*l>�vS���˨���p�Uޱ�m�������)�D���H�����.v@�O����p�n�xAg��r���ra8Ѱ����Z�
t��Qڞ���v��g}�� ���v��{[A������O�C����)��aE��N��g�	b��gPǒ���	�O^/�!k��+W�1.	
RO�gtw�}�_'�FV9�����#�hgt�������[��ڋ�~f�i؍����P铣����_�]zw��Oƒ�G�8N�����ɞ-D��cU�:ҁ����T
({=�y���_��I{��1��z�Ӄ(�&��d'8��a�' *;���[�q�w�|2��!�#�g4tY��"���*}�|����g̺�xI�
��jM�u��G��>�}�:��MaF}$Rș?�}��M-��m��w!g�v����� Wղ2��oCp4ڼ}L��g]��m�h�9Fl���dC�6d�૭i������Z,&��l ��W�p0S�~�o�Qf�o_����|CI��I�b'�
���9�s���m�/q}pY������_���э,#WX:�>}ퟟ����+WVN��;���c)y�50��ю����8�>���PK/WUW��ER��	pip/_internal/locations/base.py�V�n�6}�W�˭#�b
H� ��E�'��H��h�k�TIʗ��R˛-�x��3gn�BiK�R�V����P�����L�\�e�a��� Xh��Bq"��Z�<�V(i��|%�ey���Dk�_+��[	V����{�Vh[���m#�K)))e�ur<�]E.Ro�>
���w7�Yryq�y�|���yc7.
t�,]��(�p�4}���zB��F�3MU)A�ҴuXr!�<#�h��9�=�gK�l	{n�4�1�a��6^r�S���R�\̝� �r'�]�d#$�n�6p&�ٯN�8 ��a�ϸ-�$���μ�B��(-����`W�e��S���e\������]��ѕ���9~zc��a6�	ŵ-�m�'��K�h�l$��x�伖l��S�?��V�v®��(�S�y��,��բ{[@u��C��%~�_�غ�.\���~�]	ق;�T�O���	5�Thn@��u-6��̑-�)v����N
i��ʁ��@.=�7�oBfjg��5KizS�u[c�+T����
`߀3H0�!
���2alUY��9?
�X8�d:?��PF�Ê��X*�r#�����x����c+�s�������A�*����Q�}���e��5h֟E/QA�ۼ��><���!t�;�w�-�ۚ!�^�����"��k�v�
�qE6������\/��A����
5Jd!�.����G�~ct�TB?���V��:Yq���q
�:R�k��n�^;�5�SFBR��|�~�P���,#��@��8�cH�>���m\X�q؈'�<8?�P�>B�{!���՝Ҿ-d��9�
=v��p��e��f<�g������W9DU�@x���b���>�+D\�D�8�s�G>LhS��~���<F���Ъ�:?�Q��F֣�l�6
�s��4r܍����B��;~�9�d;��R��M���w��M�fH�dk:6���Q8\��u_�b�m�=BO/���~k�QaY�U��Owge\�c����I��f2�W�D��N���=/-��C�����7W���[��s]V��h�F��Ͽ(�.�*O�D�}��H�AU��!7���6�ӗC��l�+_���<��ivq=�6���?PK/WUWa?y={�"pip/_internal/metadata/__init__.py�W[o�6~ׯ8�K�Nc��n�I���0�LKt�E�J��CR��K��_,���}��#Q�R�ec�{S�u$�e�5���ҽA�'���F�̶�x���<{���/��ox+�I�]k�lX��r��r�M�V��M3�q����Nk��ޟ6��5���k�y?x�ϯ0��"$�2o��M��ZTS5����3��T[�b��Hl�y�"�ߑ��
L��X(id�Y�Js7�7���y�f��,Cˍ�2�Ox��샴{�^�yPBo��q�|ú�d��+
�0?���8������Y~ϛ��Qa�t)���:�3��̰x
�~�ρ4�P���
�\��UX��+W+�
G��Lq-;�s�F�AY[�&��ȣ>鮁�֔��<=;�&���^�")�G�y
�Rhܱ
�9���(
�o[`xb��B��V�\NO�r��)��ՙ-.��ͳ˫Ż_�o//�������b ͱa�#�B�,�уv�4\��	(~�T��FSR�\�S�Hh�s|����K��n�����k���qW�5�HH�aX��c���Y���Y��`O�
w���6�P�}a�8�U��{;��t�:�t����?
ST0�]�bh�·s��J�Vu�>Og> �S���q�X��G��|���tj=�
�aO=O(�	?@�<����`:��i�!?n;��3ΌQ���>�#*7ⅉFQ^1D��øW=���|O�N�LB �019�}bW�pf}����8�7��"�n��R]����q��k�q��bjEk�fN�|E����	ێw1��SF�^��$�y������c'�yS/�'�/sZ��7�����>�`D�ٲ�y����_/�V']��u��9�w*�)�&�j��C�}�w�#$��N`���jE�U�Dq@IG�Z� ��B�)>�E�
,�Q�H�*�2#1�x�o�t�Y�3������,�?7���ƾ��(l��sn(h���^�m�JI�PM���.��Ǭ�;���@��~A�icY�k`�y�� ���F��E�iU��}���(<a�4A Q��|������H��p!�T��'�u����`��� �Z�Ϥh���(u#��t�Ҏ:�<���q����3�^�B
��T����!��elM3�-8��Hkְ��Ǐ�T�>N�t�4�v��e���_KU�
o�Z%�3h�/o�K	��	����sgc�!�*5n��.�}*l�%P�LG8N�O?P�:t�������Z��m_e;�V@�����"�^��~�[f�N���T=�v���A0X��ݷߧ�vd��O�&��Z}=�)�~�%�_�En�~/��z1_��2��٧ѿPK/WUWAm��#
pip/_internal/metadata/_json.py�V[��:~�WX�CAV}[E�#EͮzٴU7{^�(r`n�vm�-::���
l$G��3��3�f�!�������JT�0F���힙��%��ne^	��V��
ͨ��笡��L
�(�*)�!�SD2HEۢ{���@k��~�}l-L#��9o"�`�����™�|X���|����i�L���#�n�WZAD�ui�,!~����좈��ď�#-5�Qg`wN�׌
�KQ�R�I���&�˟ki�,�nQUT5Ӄ@��Isщ�.� �n�U#�Q|��U�LOE���O��+/��O�6�PWı��rI7��龓���'��S'?�Tk�3�y���f
t������ޠ�Ӽ��'�8-'׬�OHM����Ȳv��W����Ӣ3�n<�� '?��[,;0�2�mTH����a(0��ĩ�R��
�D�,i
�#�������[��Y�Ci9�F��RpӢ���Uv�%퍉��L�@����߾��?$5lW��;�ݞ��gkʙa�oA1k���	�9��.��׆r�����,�J����	�39Ҏ��oD�c�r}������uǾm��'>�s�G|�cƟ��eTsYa�
y��/��� 5����8i�����^�5듟���h
�S�����.��RB��ӟr��`�`��'Ԑ�6�?gH��#���S��kK���� �TxsW�X�`�-�v`W�^G��=��_�l��1��&F����̈́5��9/>�Ì��&<@�g��ݩ�(GZ��s��Ў?�o�yv�5&�1tq;�=�--���v�H�/����;��#r1�U��3-�2O]
�)0k8�b
�*j_K(ψ�صN�v�b�8^��VM���Jf��3D�eٹ�\���6Cm�/Vo���1��3�t��xX�H�f�0��w�1,[[�k�ߦ�i�W��Ne���I��S'����l�*aa;Þ�(���PK���W�w��fpip/_internal/metadata/base.py�=k�۶���W�Лc�+�qۤY���N�q:�_k������(�0C�,����>�C��8�OlI$pqqq߸@�m������G	��0I����p#��u�Eu���~�s�g�{�o6I��?���L���Y K�u�ʣu�oE�+��P�&G�������:
�����^���N�y�����$����L���I��e�J����U�gI�Z��2>o
��e���T!Ҿx�ѐ�#F�H
?x/�8/�"��B��_ʿ6I)�2�+=���}]�BF�:���x���$~�_̄��F���Ij����-����q�3�Y�%=
2x��{��a=��0��gB}�I�d@h��/?D�hi!����O�2/���y:�6���R"�URˀ���L4�,|6h��2��H�AS�.�=9{}��<x��Y�����I����"�L;?�!�h�C��(߂$�Q�:���M%�=q���˅x���"��$K������!��&H��J�Կ���ծ�_�@�IiI �ә�4����hV�u����Z���ߓ�8J֮T/����U��y��G�z�[�G�X䫟a%�����ɪA�).��$�����,[�[�`̴��_5�ķ��,���l>0�3z6	Hd��Q��U%�V�4��ݫ�5��N��.ʼ�e��_���O*���b���%7�?e�T�>ۂ�A�!cb�	7
TD��mʼ)>���<�Q�Tuz:P�3K��I�Ԃ+�����g���y�y���Z���4�_`+/�\�&(3��z����/���F�G)�KYQ�
W
�
0jh��	�'y����K�05�!��e��3!��o��6�k
��^an5
���	��|�0�Ӂ�vw&s�7���;Gsk��uSfՂ(��^�zHj�4/�JV�a�:LVI��;q����n��4y}��ls�r�ר��r�*b��r)�V ���+[��{�oft�U]�뼼b؅�ނy䋟h��K���p��~��}��2��M��p�7��iq յ\"�����7��*8QE
,B#��(�����Qh�d3�?��!�kM�T��;}2��"���}}!����^+��	�V�����j��~,&�j65�Z��<fp��6%��F���Y�vb,��0���բ�K�H�NZ�L�Q˱Z P�%�2ln��J���Vζ��gj���e%H���$J�C�O�O*���h�,cZ��j�l���z"nɩ5$	+�PG�A��p�9�ocr�0J=.)t��5���d~�ƺ�B�v��Z 4�D�1�#��A���]�v"LP�C�]>�â�9�!�4P��N4�ī�W��o��y�G�a,��
����_{4��O`D��h�+�0�<R_���X�_g)La��l���#�aT�"�;Y��d���7͸�]���f�+����:�����];�`mX���\)�b����Rʔe��.��~z3a������1��z�aOp"Ѓ��X�~�v]�+� �T:2����L�������
v	e�(v�K���$"�&rC	X�-,�=�o��)�g��3{`X�P�����$wL���ݚ����`�ye{��>�{���Q?	����Ob¿u�i��CȻ���z���E�3|�0�O)��H�<�z��b�DY��l�.B&#��I
>�k�%�	��,r�Zuf��h"tJQ�MapNF),W	�h���Wt	�S���d�riY�B��	���T&�|��c(��4;��J��IJKG�	�H������5]�i	tPA�������J�"���͕���l�~R��F��ó������:2NjLuZ߆��-
�����P]��</3\o;ӯ�m�F��(�b�\ᢶ@v@�u�؛U�
�� �1�0u��VT������
�l\S�M�Z�r2��XV
�X�,�Ol��}���W�ιz�����%V�eb����<�{�DQ�E9żќ�Fȉ�\��jw�e=�p��aՁ㺬$@���4̠��w:8)�	�3TGKN�sz�	��w#��EuTI0�1�/�S�;�t��\�uQ->܀�hV��{�>,��aRU��>��7���tl��ѵ
��c2ܦLn+���ܯ�g y�$]����Lc�ɂ�E]��t���щv���\�f�C�A��+1�'i^�[16Y\��F�V0lX@Tci�5#���6�t93����W�I�4��aR9:g.&�p0�O�&
˙��P�x��T9�o��gm��`�G"^t�9��x�M�M`V��K{Û]'��\�־�]ǤQ�3jmX�eD�7C�W*y�8z���a�Gipir����8u?�l�Q;fn��/�c���{��Z���Z>]�y�T	5��<Ъ"�V�J�:~����zVw\7 Zt	
�x�›��z��_wځT���,-�B9�6�?A�&)O�..2�bHܫ#
	�6�ͺëጨ=
��P�ϼtm�28OC��V���90�� 
a�܀���K�8)�k���I�8Awq@�\�6$X�I���J�ۅ�GV;�31�]���47�Xfq��:��4y�[-�"�\�/$t��T���}�j����=����-F�Vh�T&��q�^����o����QР�$'�h�2��\)K.)]ˣi�����3��8�!�1�eIẄ®�d�3M���ʫQ~���8��*)I�)ױd�/�/��u���M���B�{H&8����9�x^/�5�ꦞ㕨�2�N��&`n���f�E��-x%�a�q��ӊ���F�e�7�K�+fM��4�	
w��0��r�7",c�y)�,V��jszn��=�,�7�~?���9���bI�[ts�~V�-�ڇ;
`��0��t��u�M	k�Ժ�@�~���@�(����a����&@���~���L�*�{�#>��k'|�"��xso&�`��I����T���֟�L�{���Q9��_��x��2D�U,����,�Fi�f��]�$uE��aJa
�##j�H.��qP���JYI(��q�X�i�d�t�BHY�Q,T#CL��F8��B�7����4����2-�=��������^��]�Nڍ����g��D�'�K ��7𱀿ެ�|����V�UD�F�G�х����#������P����o�O�=;}���&���l��W?8��=�yO�$���x�>�#eT�hMVc���P�
�I֙�_�a��]�M�F�3��a�c��@�^n�n:���u��7���u��?��Q{���y{���ɸf4�p�!gvG�$F����_�l�ǃSI��)K�av�e���FH��]%�ˆ�ﵼ�;�g�}�눛�֞M7c�(!��{�݀��=�p�寘�#��x��0E��G~��uU䒹u�3�t�Ĝ2߻���k��pj�OkaC�\t�� u��_��
���`��*��wr��I�[��enUJ��8,��~�)EV,}��W�	]�bڊ�
D�m�ɲ�"c���N!��-`�i^Ƙv�+�
�ZE��
h<�f��x�3�.7�C�Ak�F��J��.��E�U~8XHJ�<�u���U6&l�u��,���TøQ"�5�#���x=(���˅`T޹E�����ÔLa�W�9��?����V昌��Mg��6�P�z8~4���cp��}p� �)
�A���P�83��W�JW��IF�Ac)�{���
����b�f�Ԯ���ܻa[χ߆qlҗ�*�&�ϴ�}��1S��L>`E��8!Ǜ@�\��P�T́�x���g/���GU���ƺ_��n���ځM�D������r��yI�G&i�H�R�~��X��c�Q�m�IT�y���:��l���#}�-�i��^��;HЖRq��4ۛwX��_v9��4�'�sӊ�G��j!����uv	s����4���/�in$D~]��Q����Z�)�6���)r��i^��x�
�6�t��
Y�J����&5�1_��<\�X�ByS�|���:k����`7�G�fC��8��>
�*�$�O
��NW��_Q�}dt�8���uJ����JC���d#hm��ʌa����!�ufc��u[�0	��X&���'t2�6�K�eU�w|�cW@@�N�,�g���&C�G����s��[C��0/<FA�O{���)с̔6G��{��|UR��Z�.`Vj_~K���֙�����j���xD��E��Bf|ܣZX'�I���&S�;��ܺ:��f�s�X��/Aqj!g����h�t;�!,��A�tX4.aC�~����}���p�{���Z
�7�
ʼ��9�i,c���h����Z��m�V�C�wݤ�Z����}a�"
w�h�"G�7����X>�_�Z@U~&�5
,
�A�фy�[eE��+�H�w�`u���M[�#K�~4�@�H��W��09^[:-8���2�a��9���.P[۳�.��Hg2�C�%6�z�ź�] �|���A�շR�xHG�tFF�	��e��StF��zy>�x��d0�#s7��r6c�/s-{�#iu>��ϩ���=^��1�h�,���Jmϫ��������/@W�)���U�	{YNz	�遴亱_���i�a�X0ح�HQP��3�+I��:���]��2�y^�W)�Q����ʔr�����'���F���>�u#�1�G�v�g����A
nBn��ή��>6�$ՃCAinvZ�?��̿���6��d������-x7P�4U"k}�8!�Ǡ9��?��IU�ml�du�\���OèzP��e`��c�e�$��\��fl�d:�fCҥ�0H��C������1 ^Y�����Am&V�\|�a"<�wS�:��dB�Ԣ`?6Ͻ���9�s��r��N���Q)��/s?��}�6|�螺0gG4,&��eU�d����<�.��A�����I|qb%7��J�g#XL��&���>�:�^�$h���ݭ�"���s��ņp���-��/�(����+ZG�-����[�rI�@h�D5���-�۴��#�xY.�0�>�*[��ʃ��)r��-�y���fex�%���Akݵ�ųY�3���	��Xk��]� �U�X��~
�60E��J����J�:9a��ڙ�J�7]p�b�\�H6�E��M�$kd|�;oJA�h�.�H'F6.���D���`��Қ�� ���s�o�O^
"�Kdwn��$�Qa̱8揞�2����?�Zj�=:��g��!�=��,f�ҿ�z��:�a{�M��z�?��A[�կX\����d`^$����K@t'y`ػ���ԵZʟQ>_��;ԪZ�0tImo|��ez����PҾ%D��ֺk�,LSe�����`�݇��
�k�u��Y��z��fcc�������!�m㞦&#��L)>�ԥ
F������)+��r��˼V��_�V��8o�3�پTd)��?�l�����YWD��S��|h��];=l��Y�kn
���8=�5Zw}��n���,�G��ɻ�b���>�a���:@�G��~��%��P��֞"�Ţ���"�w��J�u�X�nxO��lZ��۪�<sw�O��n��C(ʄ������;n���J�1qS��{�qP���G�h�:�`~�ތ��M�Θ�!��YߋYgD�2^��l*@k���K�w�7��|ь]��-{t�J��uD'<�z.�<S��.oF*�PA�#��z���D�W��Ğ�8���}���h^����=�S�v�Z4����$s,6k2��������jby^��˄�oؤ5�$�^d
n�t�ۊ(�÷��E��;j9�s���fG��M
�b�;���ˑ:^�T���:�=7�����N��6-��{s+�mS���[͠��󫦸{��Fy -q��ɶC�ao_���I�+cnV�Nʡ���8o�m}��x�ܢ�Y�Isp�s��5j�Hy^-E�����q¼����b�\Xs�����9|r�v&*ϛ֢��W����0��������+��J;	�ر"���QR���(�a���,ދ�2�3�)Z�*)�W�$�9����r[<1��#p:ݽ�E]_�.Ҝ�|�p�>���/L�l�Z�g��
ņx)dP������w��4�Of����o��d����q�w�E}����~6���6t��M�f�i�����^�|}����龓4�;�ϣ�V�t^�xg����I�i8��U%&_UӁ�<?��ܩ�kr����Hp�=�Bb�O��_|;R����I��
�
���X����"��m�EiKsaQ5Ӽw����_kp�����v�t�@���B܂�3���:�ou��e^Η���yql�4\ҏ�!�`��?P���}2���尐N�\c w��M���ZBsc�C��Y��E�y���FOTk<
/���d��}::�&��GO	)$�A�&&�㲸
��RJ�~�H�»bbZ�mo�K�{��g�T)�R��EFW
�n�nI�`O�(�:U��Z��cH�����Ǹ�-~p�4B��}��+�PigLj0u@�Fr���@�d�9��0�!�T?�up��
�w
�>%�,��et�g�jes��/dV-�*P�������T]Az��<�Ss��A�*��N�uU]�9s�Ƞ8%�P��9�l��Ӊi~
��1�M;��t5��'�W��2܂(�|Gw/_�f�N�D���`�d�PK/WUW�-�FT3''pip/_internal/metadata/pkg_resources.py��n��_AhPTZ8���L����Aw�
-�YTE)^g0��sś$;���!�(����7���sY�{�5߉��j�ڵJ�v���W��Ӌl���m���;6��
�~RU%�N�z�n:��u%��N�K���ݒ��-�{���}��~i��n#��x�F�x�+Z�UߖBOv��G��V����؋����ڹ�}'+w�j���/b��.Y�kU˒����Az���([Ƶy(��!��1�r�[)H�����n>=
Q��T-nE�7�����Z�
nf�Xb-�]Q�ɂ��Eû���*9�?
d/uil�n*~��KV[��i�2�Mq0ܵ�o�s��,���|�A��t���GXy���uO��V��]{��w��,[U�!����?�Ż�z�> W�f������UU��%�n�%K��@�=���/�K���S�;�LkiA�T���$2�d�X�ךynR�8ي�C+4�XK��Z�7��º�o�^�GkGJ�$7v�C�����yGZ��*��B4#�p��x�����(5�Vlϛ��F�j��"��N1�Y��0��ܒeoĖ`J�+�T�j�t�W6���K�>vB�/�1$'��]�����?&w�⷏���/��G�����Z���mE׷5m�Gdx�`(��_ĿXb�w�>'u�4s��!�H��>S���%b�o�U�C��H)�+�&�� �GZV�kgjKoh4yL�����F{�g�2�yC���c}Y���J�3��$���KC�гr����~���e��&��GZD�Y@�C.�F�_o:��bbL�� L����{Pm_�le�
@̋�#VC�;�W
�n����f�rK��6:yʝ� �)�1\���=���F�$�´�4�^=_cz=2���p.oqg�*�k�j6�c/�
LL*6�2��7\�`�IC��e�VH�#f?ĸt�mH|x:�l,��~��D�X�!5�~�[^��&�.U�LG��	�7�ȭ��C��1B�	#�l�����:&����'�$!~� 
�ݟ�}��Q��S�L�ŵ�ܯ����Ճj���x��p0v$#�a�*TA�t�|Ҽ��8 <���>Q�V�
�8T�>��SMl��[�D�w e|0		>��V( �ϑ��w��^}�JVS�<�/c9���8��r���>;]�K�4"�D���#�/~۷k�r�	����QV9��IAB��ʡ^Z�4�
�eo�t7c�Xo�B�2�lr�ڝ�|�L������������)B��B��7T/�)�<���xh�w��L|�&�-�_�O�Ǽe� ��G���l��q�L3V�?�F��*!��#��`\���0��S{AY�8���6tyP�<�^���m�9�e��w��r�ѹ��AU9�~̗f��q�-k0���⫑����a��c[~(b�K��V��	�i�@����hי�=�
��I��$R���27�:Bv��:Z��D<��؇F��M�,��������Ȩ���+!��5��'�d	
%a�3����=Bco��#�E+H�9H�ڽ�Z��B��*ݘ��8d	x��䇰����Fa���l�%���.�A�x�E�����DG�!l]Yf�m��4OS
�A��L<��d>�F���7�=ƙ�Դ�'�!�a)h5�6�̴W(��s�n4��kS��o�E�8n�#W���d�夯MP�h)kS�|��hP2ݎ�0���b��7���=�U_o���8N���h�t,�a����=��:M�4/x#]	�*
���iG<F
��>L��%CRh?�r��{ޤY�:	���$�
0�OY
BU�4��A���3:I1<��)���CU��s�g�K����K�X��復�$��������l�>�H�z����� �
,�4{�,4{�8�؂p0?DƖ=Va���H�q�2�e˯��Fs��7_gr��Ї�����/��$acS���A������`��+d�r��!w7#it:6�)���@��98�!?�Si�^�sR���:Y�ag�$��V@�b.����k���n'؟�szr��,+�q"=J'��Fԥt�YPh�*�p�\��Y���� za�:���(4g6x��M�ٺdZ��`��V^F�l����"j-�4�ͷ��])�[�h�o�e��CN�#��&���i��Buj�ƒ�E��k.��Z��� %:T�+������(�X��v�ݸ��{�����?��	��Wѝ.P3}fv2\�����Gz��#��1CFf��]X�!
=�|�����H��I:,�
W�٠?W�gC��Z�X�G�&GG���&"��m��1{��dr� H~ײ�Нf�h��+M�"���}x@��]xy�~&KW��4{Q��m�E���z�8�~6m�:�G�H�X�G�,Arj����	"{x�O�q��<�]�49�)/�c�&y��u��rD�4�
&IW8�5j�L��V�a��¦��ԕRO���ۙ=���<:/�a�e�y�8'u>�r����ʐw���*Uށ��Z����RU,�6���
�b1fb	��K*��ڢ#L$�w\�y�}/w�t�
�i���]���Uo�V��c�A�P�+�+C��@H�����,*�Q�w�a��s�a`�}�U� ��R0�E�,)`>���^=����'�|��ne:vPm]~�bf�j�j�	@�8F�\�4>�
�
_+(�eg��Df8đ����`��K�z�W�ѓ&(�{$P����a�P����"˼>��)��Jx[�5x2�AW��iQ�5�0~R���e�P6X�Mg+��7��~����kN�_PK/WUWyAh�a�,pip/_internal/metadata/importlib/__init__.pyK+��UЋO�,.)V��-�/*Qpr�2�JK2��� 
R����ye�E�y��y%\\��99��
�
�J~���J:
J���H�b��@ʀ� ��d&)qPK/WUW���YZ+pip/_internal/metadata/importlib/_compat.py�UM��6��WtYy�
-z[ A7�JQ$�C���K�5�)���J���7�lk�
_,��7o�M����?k6u'�[N���Qz��m�uCE���xǶ���o<��i�X4�c�Wܾ�@�?����|X�,�V��Zg�jUF�ۊZ��3���f��*��(G�n�K��%��NFX�)Z�`�"c>��bk|X��n"�Q�z
���Ѷ@VtbF�чs��T~����,fRD��+ORM*EqK��Filj��G��9��?ҤH�w[�zd���D�G������Q�����}��Z�tSI��Į�H�{�o��i��:
9��q�bm@�@@m �3��w��#���Gp�Z��5�	<�w����,�$�6i�/�	���6;C�Hz�l�9HE�yg'�q���8����FZ�R�!����)��T�1�w(G/!
gc8��s�`e��K�[�P���r�9��>��'o_�P�{Ih��_Y߰�E�o��p������2�}��h=����*^�ߚg�0L%{}���7c�X�a�O	��Iͱ�'7�1�Ԛs�cxhz�b���蟳��V	�L��l)������91��7�45���z�_��VF���6��z_7>�2 ��=�*�M|�tH�=�1Q�w�ɚ5���{��a7�3N5�x�w��b��B�5�����Usc�p���/�Om�x?Kz����N���F�:�¼�Y<�L>�����-x7��m��ׄ޷�7��'*$�%`�
�#7����F3��e"<8�Z=�Hy`��%T�+JXֺ<΁m>m0�bb�R��|����旗œ.��q�fv	�=�@W�uU,��ʑ�PK/WUW��.�	i *pip/_internal/metadata/importlib/_dists.py�Ymo�6��_A�"��Js/�u�m�CQ$1z�8Ði��e#��H�^���)i�p��C�����3#Y5�5LT\�i%���H�E���7�����(�~5�la�{|��F��hӪ��]#�۞����Q��ȍT�������_?��RxOF���o��}���q^ڧ�/���X�5�K�,�l�쫨զ
�?�[ ��pB���ю�_ƵCG;#���G�V�����+���kU˜���Q�*Z
R�A���k�#��b�4R��>������pi��V�r�~�u�ະ+K4�=���V�JmZyӍf��w�iw�
�8Ӎ��c�mWo�9��}�l�M� }��Թc�vJ�г��1�j�B���<���3���@�ٝU[+xagN;��%�f���%wB2�[a�m�ɏ��km��5ϣ)��'k�VEg5��~f��51̈7Έ��(��f����2�yB���P���K������
��b��Y͌R,*��.bբ�_iVQh�	�W�}�af+�e�U��.J�T#j:��2���r#���冖�O�n~�&��[9cK@�j�)F�t��@�wn�p�De״��+"���6[nRg�A!6,��&�l��?-��jxBe��^�}�LϻV�+-�������J��Tk�|�v'����j�H�q5;����%x����\��U� +�!�d�7/���f�
@ڛ||�ѱf`�qi�qX&��Y�D�P;`�ˀ{/��͊nI���:T��/��kJ׋z�w�nJi��u�bo�˓7WIP@�ō�������]r�,5�[��$P�D�����Ѹ=	]X~H��Dv�{�	��J�6gֽY9J�9ig�����%E�
��"㵭0][�s�$�*���$!;�ј�Y]� _p8`9x�F�8f�j~^����U>̶�d��`��Q��9�	cRj�:��k=�����&O'\B�Ř���{��Ż�U=�Q!d`#�M��2�i��KX���rD���/�0vW$W�y�1��bGL.��yg��(�N5��*Dufs�w��[~����.������}���T��݂�@��,=��ap��G"��f��	���4�Dj�B��~Sp�M3�G�(��)���K�	��(O�p�<:,#��8�T�Q�ˋ��[s�=�8���9\r�{��Ё��s�j��+��cM
�~>�a����.��aä�ē,8qL�Hk�-'���'�i (^C���r�ݾ�E%!�Y(�M��e�W�h���KԄ��x4 J��s�� W���ݵ�K\c��1�=��fA�B�Y��i�.�z[�p�]V��dqz�v"I�q$��ި����fчwgo�.΢��)�����OW?B�g�.7������}u/��Ii����?C���uӥ�+�
�z�El��sݷ�,�u�]hVp_�}�PM��.
�zJ�!�4��R�\����k���?�G�5̖�[�C�=~�=���1�={o�)����m��bY`}��/:`f�?���e$1Q��H�M���na�C�P�R	��/�@�,���-Й�����3�����o�tVl���p^��Oi'�͂�IFA�b����~�P�9���S_�;(��fU�oنCߏ����>NL�K�g������f#�!	)M�Ŷ��O}5�l�{�V�k���<e,J��}H���D�z��~w���i'Yp�Y8�&�v��<��s���C��*j�`udwa�����d=f���g�m���7J��<�^��5���L6Zg:C��L�l���(��>�t���pԥ���yy�w�EX�X�{�HoS^��S���*��ĉ�Gv�4eP�ǧ�t�b�M�=r� ���H>�D^�<��:h�qM�չX��U��b���2�ʲ�a�����`�3%��oLH�:D-�ccg�i���B��Z����D�bܡ�upP1
?Ki��dT��xS���cB�s�
^4�e�`�ki6R�ɷ��@p�|y�h��8P�
����_��Xp�w�nk����wZ-�p�f���G|p/�&Ж�����˨\�h�|�5]
0�\�p���Jj�M{�a���9@nt7MSlv'hN�]e^vT� �"P�v�+/�$e�����vg��;�u;��V�>
��5�|�<zt1%�0��8�m�W��9�S7��׹�{��_��۟
�6��V�8�Lf�^,@+5-_��0���5�TG疚>y�Ԡ�^^�E�n.�c���g�T@���yEI����&�n6(���:JS��u!�\����U���`�'�޽O�W��w��
��?%#�j�
I]>FtO�f8��hdo�
2{+�dX��{�^�{V�	�+�d|�k=�����'x�V��,�y�j��G�e�JAa;RItv��x=���o��>�D��ybK�}@m9[��PK/WUW�
ޜ%	 )pip/_internal/metadata/importlib/_envs.py�Yk�ܶ�>��� �&m�O.�H��Q��\�X��aW#�"��I��s/���Y#A�Z�!�}?לk�xQ�U�-�Ƅ���Y{�+��oJ{<����ÕZ�.��e��S�����){�R��(^{�(o��xc�ߋjol�ʽx����*��/޷5 Dmj���*���Uv��C�zS���mΪ4��:#S��LƯ�
�b(S����t����sh��=����Lc����*��u��I��@�3�2�u�3E$��+�?|�T
��A����~�^���w�x�	*�̞a�Q���N� Џ��^�Os�:
MUش�����c�l6�1�W��H���wIʰi��l6�.`�KKs�SVU��y)��&�ӗ�S�ʒG�#��?%3�w�8�4ڷM%^����:I�+�#�
T�p����ݴ��|vJzL�sD}�{��J���:����9�Ɗ~e�\7y�݆��۠-�謓>����Y�J�mS[��-�?'>p���Q"
�V�� ��^8�x�*/�5%F0A*��Ze'�T3�'3z"����D��Sr����  kNZϜ8蓺3����d��RZ��Qx�^��#D�*�i�S3n+�r�Q��R�6R���Mcr�a��9��IvS0U�_�S�&S�.ڲ�5��o��{�7���*�W�,%L�̡���i��+�a�<��54IJ�H�P�QQh�#|U�T!pZ�n�yE��I���SN��%@N�^��?����&�q$#M����e�q����^˔]�s�{Ii��4M߀�9�E��:o%#��2A�%�c$��H����#��՘IH1��/Ļ[�$e&�S�c�R�3dw5�����*��ʼn;H��$oٸ���`Y0n���g�l�T%q������4�̝l[w?��,�nf��BO%��m�X��2Ԙ�"�ﭸ��ПT��s�|��3��=�Gx���CP6"$���r<�{�^��2Bޞ�>�K�̊sp�b�>�Y97�{B��>�b��䞔:8�%���܁�� �@u�n�au���zR�)��3�Uy��
�I�䦬�/���K��O��-���9 �Ǜ�Փ/�!"{�S�K7��9��,�i|,�I��Ɍ�����e��tB�ۉd��}f6����r-�J����V(!��K�~��PMv2wZƴN>�,��'�i�gv��r�p��$騣e�g��/��y
�NxA��P#��fl�dE������wխ��f���S�w}<>'hAݚ�>�k��AV�k~�%�}��҅{�f�;�˕�D
5��F�F�����$��)����)��Hf�0
�&b��>�~,3�IwL�22PR�
�'�v����sTd�Ʌg#�8@�j�������靜X�u��"@�
���-����a6��AU��FMuTO�q��I���Γ)���k�{@�sҵEa>�?]����}b���������X�����	=HRg���ko�bY�j�<��Y�O>��k��Z��v%�ꉂu����>�����d�M�~F:���-�{j�!��)���#����\l�S
����ٞIN��fa���O1�H�>��2b��a�u(X$Ѡ5:l�˅�C��˯$��|F��7���c<�/��ٝ�H!6�:p�tZ.��m1���l��c-�hS�E^�:9<�f%Uv��x�gS��릱�of͉�b�4G��d�
�H�G@�4w(���\���q�`�9����h�����?�
��P���)��F=�}�4V�ʌBB��.v(�%��w��\N�|�;B���S�1��|�
������t�Hc� t?�`�����`P��Hs�h[ٟhu�hZ�g�Ixh��UIe��MrԚ�p�D%!N׫��c���!@no�v�l�4S�I'g��a���FzG���{���gn�ʰ6%��4�Y�Ҭ�f��W�I����ؾ�*'��������#s�7�vݭK�iڃ_m1�҆�vzd�hG2���Gp]]m��F����Z}���_��sx9�@��{2[��^��;�F������5��O�b�M������2m�ܓ�����'Y�k��b�s����=�K� ����w���q��� �ꜷ��ʗF�ugewX�=��=���2;�M�Ų��x(
���=j\��ӡ`<�!�!�uB#gth���p�[�q�@˼����,Lrӂ�~~@��:��we �QC�B��X"'�v�y��c�Q���x��Ve�Bz�y�bʘ�5��T��Z[SM7D��y�c�!��
PK/WUW{�(�;? pip/_internal/models/__init__.pySRRrT(HL�NLOU(�H,QH��+I��+V��OI�)�����(qfIfj����PK/WUW0�Oy�!pip/_internal/models/candidate.py�R�n�0��&p�A����>��E!1�%AR�A����G���T
2m��;�o[p�qq@S[ϝ���V�-?��P��>��> �p	D�Ͳf�LDo�歭Q���
�W��J�QQ�0Ծ��Q��lK��M}+��m��M�Rki��4��e�|	R�2���@�1��$8)RR�x����Zs�e^��mB@���Y	����$�}]�kl���B�uSBB� D_B��n�-���5�[���$,OP����`M57#�ż����eSf���َ�tvx��C9�ZN]�r�"���lEgU�hՄ(�W�ɢ~e�6hC�2<ƽ7���?�s	�]�'?[�&=��m�����D�OΉ�?��2�]�'�PK/WUW;���"pip/_internal/models/direct_url.py�]o�6�ݿ�����}0�j��P`�̀���HT�E�4�r���#E���-2?���x�_d�("���N�{��DQ4Ủ��-�ʮ��V�%��5TH6)D�#����t��ꐐ�<S	y���W%K�o��uE˄�
3/�H��
�I�ҲLS� �	�_��������<�H�\�Zx������K�m�����Lv���d�:!��*�'���.�Z�o/~M_���/��e�f���\3OA�%����L/��n6��]�K6�_�zw�^��I�}v��Y����t~��2�d%���Rpz�!c�|�\+�6��YA�k���ϵ��R�Q����
dy
�as��z�v��$h[��s�>o�Mbr��7�!:~a��i�2���W�B��������`3�)<�dN�Z^���?�T+*+�������G%���UƦi�i쑥\�ӆuxZ��/�=�RI�*��� w�d�w�q4莪���[y W�O�Ug}��m*�?-����N^�����;�:Z�u�9å���v/�;�vOv�T`�=#�P�N�}��*)�I�b�!������-�G+D��֮��I�3�о��G�Z�����ѧ9^��X)�&�BM�J�$ؖ�n�Ϥ^E� 	JV�c�y��bԂ����
����g�V��a�K�WZ��onn��BkG�����kz�t�����6G�!#�Ֆ���͜�[o@~t��3���4�Q�|�
p���0��&Qp���U%+��}��z�a'x>�cv3�9&��Z]yY
�6O�	m�0ѐ���
�c�U
��!')ີQ���Ҏ�m������{�Y)�PN�С����n�����b�9���ax�!a�b��@gFq`;%O�qÓcS.l�4'�>��(U�N悧s�I#�mP<*�09e�0@M��0���	��x�PFX&���?�B_O�Q!W��ڈ_p�Èu�|#؜��$E+.HS7mI�·���\��춺�jD�@U=8��^�F�i�5\Ό�c��)��1���m�3�K�lU}�a��㨧j�6ׂ���Y�[bf'B�$��3����?����׊\��&�_�k��W���C
Ӑ��PZ0)fb�v���dSr5�QB��Y��pr�h���IJ��"���.l���iN�l0�F#���/?��R���y�L2�Lrj_�7��=:�1񾠈4�i�Ё�c���&Q�eQ7)"�����|�N����1t�6s}��4���]h	��[���t\��x�	u��\�>'Wu]��i)�j��������)�k��7x�"D�*�Цx:�:B#�<�B�k�}�_�^�'�剝�7��G���p���k['B��yc��d����`}�[h�������yB�]
���X�TYg]5ZA-��P�"�u�C=Kf�7ܬR|����j�ԋ�Oװ�xo%� ηa���c.���\E#4O�!J�1J����Z\��:�E!�&:5MA"R��AҧV�3�Jb�r��*Α�m-r�P����W%�9�D�
0<ӗ�j�E]�X�/e�cJ�4ٰ��!&��s��z�L����,z�ɨ4�t���ů3_b�n\��YL(6Iz����|2ԑ�̬c/[��j+�,� �-É�PJ��pPm�%�Aġ[�^��od��Q�>O�f�b�[�T��A�O[dm�=�U�M%,�恩��f���?u݄��E�/N����4^��F3��P굄��Z�Ip����k(�q�)]�z��{�9Fb@�_�?��b>}G�v���<��Q7J�F�\���N�=č�D����7����o����p�l�㳲����8���|��v����5r�� L-T
�;�X��y��L���2��M�����-��x�ܨ�PK/WUWb�ch�	&pip/_internal/models/format_control.py�UKo�6�ﯘ�-�U����9�Ѓa�4�eM�
Iy���R/R�8@���7�<y����K}��pm�WԟЗ��h�J��nwʽ�+���5��E� �ɶ�TnFh�6Z6Bɯȵ�05�ڣ%�
�4����n�����n�(�\�	��ho��w@c�/T=Z8d9�i:���'ٜ@�H'�C��y����"�N�8�+�a��;��}b%0���|��[<����s^DI��c���z��
%��y{{K^�1W���w��p�=��\W ��6�CP}�OmS��>��J�J��Ҥ�gJi�$B[�����3s���=���
Ѣ�q[��}�E?XM1���^a�Ԋ�.����jd��.^�př��f�=zὝ�z���̲�1	C?Pkn����X�픞��z�=��/%<��Y5NC��ͳC��pr^n�X�*ڂ2q����eӡ?�vay��UȻ�Bq�o5��G�����
s{/���;<BT��zw��T��WH��
�c;�9L}�!�l��Q.?Ң��@\��$ː��x�v��J���l���XM�P�P_��W�F���X�oL�[W�m�	;�oQO7u���n�ˢ��m��+�K	5��e�â�3�Yh�@+]#l���ɟ–"4����}G�bu����^�:�+��"#��~��pG�3c�|#a�k��z�|3F���U~�*5���}R��r�
sJ�9c˧'j����4NHl�������'��l}��l��%�x�,�K��cx�n�\#D�m��{sb��L��gP��(�i�c!›7Z$U%�X�_�[Ws��"�olƌ�Ľ̄���.I�z��PK/WUWߗ���pip/_internal/models/index.py�SMo�0��+F�H)�G��{��Uo����P�:�����w!	[�"��7ol�1$�!9g��haQ�3Dp0ͫy�{��Ǯy�R0&$�L`�C��b
o�E4d1�i*����
NH��Mkr�Ik��_%%�
(��B�-���P����lwV��!In݆��^��8[��z�Z������v@�6��O*��
���e~h��ʪ�pU�#a��T����=U?�\��):˥�9f���*�ѓm݅���<C�W�<�o@�X �/x�-��RC�DBƼ&��1a l�ZOR�+XOl��z8�o��$=�{o�^�E`�1y����	<�%�9�֍T�C7�A�.���Q�zCZv�"�`�{���L{�ͫ�򿪟��俈�"�[��O2�blg��.��#�۬A��V���~\f%�����p���ר��8�D�?&�Qw�d*��PK/WUW�6��>+pip/_internal/models/installation_report.py�Vmo�6��_qp�Ā$'+���tk�m��@��Sę&Y��+�ﻣ,YR�V�a�<>���+g�Z+�Ƚ5.�o�M�,B�u��E�rV�,?�.�ˬ(v≎e{�v�|��J4*���G��{��`��F�Z�N�9��?Z�A(՟����'���yQ(�}�%a�#Ko@YCʤ�!ϯ=�*�h��0~3���R����!���ty����c�My�k$�����By2�V6�]A�sL̓.�L=�M#HA�Yi�ZQ���$P-�20Y��8�²���!{�e���
>���no�?ot<j���?�)t&\Q�v��5��E;��"��'��X������Q�>�XB���,*(DQ�O�2J�= �FklC� �mKB`T�.r�DA:%���m��aa\	�I�z��&ˉ��ͅ�g}fW�\z� 
�3�5��'9
6mV蘩p}�eQ�Au���"��b�&h~��8UB��i���I��o^��?Sh M+zO��;?��b�a�B0Z�w��;�8I
��f$�m�ca$�*Z��1��R��y��K�;M���^6��:/r8�sP�n������Y��Hh���Z��1
T#�y^开:���M�i�T0�eP�`�f��h}f[�[:3ӛW?ޭ�Ϧq�����o�U��<<1�ww]o!�LɃ���JQ�07���x<��*�M��#�C���[�	T�E�e��[����Z�~+V����᭧��Ø�����~3s�=7�K)���iW���s&N���:��)M�c?�C�w��G��F ��#KV�>���bF}����1s:<��S/�0.o��,/����h���Nl%���?/��00��U���1�'��s2~��oެ�Fw��t�a���݇
��T��j�E^sM�n|v�$r+ƒP
ͪ�X�6�w���ʑ���'^�j������t!�g�}mEtU$v�H�Q�!5��M��RS��<ҴH�M�fx$Ac��j]-��F�fp�妣����,i_�*�JB�d��mFż��k"�ZzO�_��޾}3����t�::��ϋ�PK/WUW�ݐX�SQpip/_internal/models/link.py�<kwܶ��+��&��hK��D�i�:J�ֱ},g��Z���
#9!HIG�}�O�#)iNsV�q8 pqqq߸`�Z�M-�j��u�v
n(Z�
e}qQT�gm_�kUܬE�4
�4O]S��y���;��^E�hżJI�N��{��5Lc^&;����G��G���_�������ż�W��Oߊ5���J��u)���u[ԕ(����
ڧ;�Fd]�Ӭ���9�ڢTi.׍�`��M2�>lQ��������W���?z}�����#�B-ݰ�k{�U��!�֢h��W��\��Lt�2C l�Q��_T�-�N޴H��S׹,-����%��
6_~[���������5a�����\;�"�CBnhQ��&��e)���%6?��W��� ;�&��N/d��ڒ,��e�ag7z���o%Z����MY@�ޘ������d.����+x[?�>��z)Zv-��,�e��Q�d�����w�^<;~qtX%�Z�'��4§Ͼ�\?<��<��}��*#�O�<%@��d5{�tr�CM #�%r/�clP�ʜ)+����\��iѕ(;���P�"����WAϐrgѪSmt��6�
�4Q���=��<�sQ�H��B���*�}>{�̗ŕ|Y-�4�~	rym�@��z.����{J6�(���9��¦��������SX��H!�
�&�?�9�F�zL\.�G䡝��
0C[I܂�H͗r~���h-� �!�)��)�2:K�a�L�e}-�dr�¾1�p��H��!�?�7�C!Z4�b��5��� �5����F��r����QU��N��(BI�2�.��[GI��$�	�-�*/.�jS9�J�O�1,7ѥ�k�	h���<�)f�+.pW�DRVD�=K]�SI�\3*�_
��
���yw�sW�uS�J��rP���iA�WvizA��¥����^kA�1�U�D�{��x�tD�Y�bBcF4���ǧɇ��.�R�Nf��?>>�t�C�n��]��,�9N��*����Z&����F�g���B����0��re��*؅,Q�\L��?E��J�ah�A���t�,�)m�
��ι��i�t�\�.&+q������X\�̜҇�KE6�X��3��$6�.>u؂����/QƘ��F�yMu�H�ub�r�
J�F-Xw�kY�H
T��8V�ĥ�&M���
iʆ�횊^�v�h�͌�$�*q`�@�%��3oЌ��vX�,���-�R'@�)Rǣ���n�!�8�
2�;�,���chˆ1��@�y�,��Q]�@����;����,��ƌ!%>�'��[o�}m�ݦZB�0�SZ�9�h�����7��*)H�':�Dg<�Y:
�=qG|#J%���qCa�1E���9���-|+[��Sa=���$��9�
P
�e�{G��j����l��W��G:6 }ȅ��P#i���h͆�Ԛh�lU\��	��n����
�߷�PG�^2~��T���}���S0Cq�q0ۊ�0�6���
��a��%�˾f���]u�Y�:���8�[�8�[�m�@�Q�ޚ9qS�=�П/�nM�lK�H�R��X��?��-�������艊�w�(Ԉ�"�i$�S�ӢY֎�Ơ�D�8��4�}/aw~�j��MQ���?q4<��%X��V�ԮI^w�Ҩ<����)�O�&=�t2	i��f	�0Z �,�Fa���|@r�ȳQ뚝ix
Ѡ(9����O��ߍ��ѳR�S��{��k��	S�lU\,[��Vj������M���eݕ9q깝#zSa�ݠ�	������xy��6
u	�h�0Xs��gm9��?B�e@��Z������cܣǦ�V�ZО�����q����������a4�{��(�+�w��jL��ӟ?:�f��I_����wGϟMƅ7��W�h���2nC�{�vCCdX8�b�lu��@a	c�D=%ۻ��hGo�1�=n*휦����	I�4�F^
��^*����E�R�
�Ԅ�-j��N�$�Dr�
���Ì99e�&�xyS�=``rI��
���0�N�t2���L�����<qDL�,�B����2���&�FE�L��}t�@�@�{K0�I&z�Z\b4C-��
�L�"�i�C�~k(I:P/-���WK�U�Xa����_=gц������9�
ň�{�?:xs��A	����
p��ɚR��:�SφɒZs����ϵ�����(q���&5�3�M��G�8C���	�gP3�f�D?gFO��l��B�֔���]vd@�p
�W�v3唀A���"g��6�g
D&GMΘ�_����&��{�i��l5��x�X����pF���\f.˛N,���$�ng�rf9rE�V�/Ņ�L�'�S.D2�mg�*�Ve
��C2����\����M������ߊ�\����_mDu	35R��	X�S0�2\m�sp�[yqa#n�:f�(곿����*ϙ��v�c?���5�muz𠠯?���CBy#��m8tHE����>�q��#/^	��Db~p{H�	
���ֶ���3��[J�&Ko�1��c�0���ѵ�<|W�n��Z�Mlڟd��ǜ0Ҏ#�J~�N��{K���^D,�趖��ɜb�ϟ�L%��A��0^�s�=�����Cji�ȋ�߾�%����*�w<y��`�=f��g�䗘U�-�d�;�ُ`��@qd�.1��OZ�_@2�\��/�1ф�Ď��V��\���"(�Zm�l�Rc�Ɛ�v��
a���'�*r\#����Gxd��E�2$��W�{�0�R�9Έ������)J�����c?;�+S�|�Fn}�aEsѭ���cAj爢��bJ��Dd�~��"%���E��:�Da�,z༃5��P�uϢE).x��C�N��xF^̪��1�6F_)4�M!�1��L��Թm���Zo7o_�ȋ���U�37��"*���"��8X����L&�L���Y?v�0/k6�c�Ϯ�X���RA]���Ü�篿���(�i_o��Ӳ�3<�Ҿ�o"��@�̇E��ܿ��w����@<�)7��7Z!}������Rs�@-}����g
F�d��/���D�6�Ϯ٧
���s�F\a�ς3p��Z[1$��k�+!��ы����� �`���<0m�Ѿ=���Zd�0��9�I���f��8�r `����$���-�A�)GAל������8#o�m�0����OM��<90���tl��?�Gة'�0	[`m�&�Gp�C�����a���������"��ʗr3�"����H�f��%�Qb�j�"��p��Cw�	�1�l99�#Aܕ`�Ω��@��3�.��ڜ�.k����9D� ���\��'��ͺ�P�s�j&"�8)Gނ�i�0Ȥ��.v!X����ra��{���;�f:�DiC����Kج7�w���\U�>�j��I�M4
ze��vt�����!G0��Q�Hpnt�j���4��v��6Z���3�t4��xz��n]�1{[���7n[�СO7\C�H������8����+���v.�`�Z#�bC��19*e�aH����DbI�Ӕ��%O<p���*r��/��l~ԛ���<�e���	��|��>�=����U70}����R����$�%l^���?���O(��btɪ `�([��]B����`p39�)��@��D_'x��^t9�q8��p��0��s��`^UE���	��Y���ǁ��Y�9ݎ�,$�H$4�N�=�06�!�[YJ���vyY7{��7�A2�n��B�6V�1�4ڟ(�1S�}�q��4Szj�[��G�*T�t�
���Q6T��-yDZ,��y+k��ݥ����ݺ���o�f� ���c�)�9n�N��.�z�"S�5��%Q->�x��f3
�w�����ί��n���'C�)������]�$��@U��3o�~�PڅYoFρ�� uh𹝄s���8j୽�d���3��A3�(v�-1���O��6��?>G�
�r8\s�EXL��G��(��t��
�2��?p~����1� ~I�=��?SQ�?	���#���i9�06�v�!�+����[F�i��6J(�p���x�4�ނIl�k2��6� w����9�ƛ'�pB������ý��N�>�Z�vc���ldq�م*���#sC��
Z�u?�ꙻ��ˢˎ̱��]Tतz�ؕVн<#���2B�G$�_5�RT��%z�4��{
n�u��Ԗ��D]3�����k�y2��>AF�`��\���dc���g����QL�amha�W��hl�k����NF��_�r]V{�+C�y.��m =JA�N9_ ����Xdܗ߆��uC�D��f�j��~���Mw�(ȷ#F�lT8'[7/�w���	''��w��L�'�T�8l���:���"`�~nؑ�nzc�
��$wNdžA�yP�ȗs����31�~oe��ѿdˀ?H�t�p�m�&�Gr�l��}u��y�M���OM���Ŕ{�#H�[:Q�����2̶{U���ki��`v7zVE�mbYחxDz�iEM�HKk:Q�xA��ŗdڜ#�6�z��&ń>��҉	V	����ߏ��L�?X��pS����ܕ�<�l�߶��j����G }I���=CR�C/VW��Y̗Hu�Ə�S�#�
Lr�K��	���o�l!8�I�x�}�T'g��_�!|9t�}biS�9����>Y�n��A����
�Z$zm=��k��:����>����܇�:�k7#�r@ZT�I���#�Ѓ/�ٱ�Њ�=��v�����u�1��I��}�As�kv���m��.��n�]F'W�����d��fs[�v+cc�{��z�`��0;	��k���/��*]�_3�}Өe}���lsg�c$��]ܟ�<>5
6
['/�;��8:�7P&���AJ
�8h����6�;e�2�S�߅��R��!��� �Ll�|5W��|[z��)��@��v�.�(ˌ[�Xp^�!3���;X;%i86�����4J
|IYm��AN)��Q0ɖ+���&�j0WĞ��wT��vs>�e�x<�cW����|�W�OB���^���+��ϟ�_S����nϕ����@t=��VcIW�k�Dy�	
U�A�d�ŏ�ǜ?!��"W|Ay��Ð�J���3�o�2�s�[��X�?>��ѕ�bx��	g,8ꧏE�|v���.LZ(M��|VLEs�(o���|��u�O��A`��lq��)�>����*�T�Hy�HXs��
���}R�Z�����{��"��s����Z��h��屒�@CU�T�?�qщF8i�[ً0�5E���2��)F
��;,%��|���zǵ_޼��5H������
K�W�kD\f��3o
������A�Š�^QXJ`����?>×��NA��9웮��s";b�K�1R�`�6�߼7���ѭMb7������L0ue���/�4:�</��rd�U�ZS�m�d�)�ps�n�����?;�͌�f�"g��@:��j��IjjT��%ncB���/��v\F�7Ff1��7���o�7T\1�)�»��DŽ�	}��҉nsTb��A�A2*�祓�/�V�Ds-k<��=����Di���ՒjO`�G�z���;�J���@��a��
�%~.�V|�����E��JW�=p��0̧Х1V�ԉ��?���n��>��w�}�����{x1�b��v���E9��/7�}?+�o��t7��K�%>e/qo�Tgp��7��}�<���_M]�y���Cs��t�_�{f3Y�m��0��3����bS�%��M��U�g2�&d��o�d�1\�w�R& n>��jލ���K���}ໂ�(�e�Ͷ2k||�ԃ�o�@,Y�%�4އ�Ae���W��O�Vp�/�S��L��I褑N5��y2z��8=����=�0k^�	K
�Q�4 /�+�v� vɗ�Jv��?`�q�3A�}���f�`3�g��"s��$RI	��إi��ĥ����,L]�!�E��o��N����$�ZY�7� ���g]Ì�)�r�����z0�?PK/WUW��l�pip/_internal/models/scheme.pyePM��0��W,~���[���Hy�x��S)�l�u$�HF��x��kG)I���3���4Mc���>2gP�)���X0F�����'n�Ž���T��N��#���H�׀Ɂx
lNBgY/2��\�܎��sjs�u���SoG���>>a*Im-o
��Q��l�_�o�u�s��W3�öY@3
U�	� �F��C���Q��f6�2�G���È�N>XX�=!O�`�L�B!+��=�2��"a@+����cέs��Q{]kf��p�k����ѠB
�ff:LqX���=���ܰ�J���[�z`��n�����s��]}�u����A�������!�+���3�+��'��M��PK/WUW��|�h#$pip/_internal/models/search_scope.py�Xmo�6��_��bc.�u(�؀A4��TZ�-6���oX��#-�5ۀaB�J����cTU���zcJ�Pq�4����Ӝ7j��C-|�.4�,Ֆ��:��YS1�q������Q����scA��	��J�RgB�2Q��e�E%�G���Z��2�,W:������9��g���-m!\�a��rYK����>d��Y��̧��EJRx`� �I�6��^����L�!i�Z,Y)�c7Rج��L-/�'I��O:�kJ�c��`�	���/e�r,3z��
Ta�0��3�𒦮4ޥ)tz��૴T��%k�Ǒ��K�4,$���A�J���a!�;�Y	��ᛞ�t��G�2�������n��/�)�W��,�)�<ӷ���UP���K��~��gb����G)I��)����|�~lT�����	̈́�7�Ԟ9/�w�^��}^�|X%�l+{<D]	.�D� �� )Z���,WJ{���0o�}M{|�[蜩���ϭY�d0望9;H�'�w�]�T�?��JG�GJ'�!��4������d�d�f��>��N?�[}A
~���	�>s�)��}:����]�ˈ��O��~ȡ] ���$n�|NVC��M�>���a�.iu5�c�8���e�a�9=-�Հfl2u
�;���t�0����xwuä�R�k
�f��|������Rd.,��f�K-�&&��qT�3�-G��}~F�B�eW��E3N	П�%�V��^w{<�]VH��fÒ��%��=�)�V��,
=�"Cr����O
*�%�3�7���\�Q���*ι���4(jx�u�C��ox��P%E��MD��vץ������wh~��8\�a����x@҂�}�O	L� Ş�i���d�������@$�$!��!Q'D�ǐ���#�v���;��%D�����A5X�i�b\�pv�K�1֕p��Ѩ�ƓR����J�9:<-��VPjn�Y�`��]S�����"�10��T~9>+|���R����CJ��%�����GX�Û�#d�
j��~@��S?11!Y�%���C[��Q��0Î`[���6�D��mk���Ͽ�f_�}��
ȍt��V��G�lt!�4&��Ъ]aL&V('g�ȇL��(�(ge�5��Z#�wd�=����]!cŅ�L�t	�RV�5s͐�f��TN�\ԅ_��:͜yڙ|��öI�c>��n�'���ؙCG%�ǟ	����Q�4�3:��
�'�Ņ����	�{*�:m��L0�7Lx�-�"�Y�>������yh�kJ�����7���o���jg�A�1Pv�U��.��F�E�}W��r�,�e�J_���t��uƙ��?o0��:���y����5��m:��'$�p��գ'���b���7��/����j��	�9σ����[��*��1�-j���b�/!\j�	-�.�Ma�
M8H�@�2\8p5-8c/K@j�/�[�jW�l�hI�F]������IpJ���c�yЧS��qq
M����:ݝhN�JŹc��sJ���n�j+1�+c�`�� '��E���E'Ƙ~�@1�?�6'��i"M�+���_PK/WUW�����s'pip/_internal/models/selection_prefs.pyuUKo�0��W�a-�z����>�[�v(
C��F�,i��4�~�d'�����}dZg:�{+�3�����h���
�Vڲ�ڣ㳲3
**[�:��h�=��m:,��V�~��:�\9lѡ����g�X��{]K�	����
���`���1;��hy�. 5y�T(��
�<��UE�x�*���x���쪽�[lW�s��8�c ���y�7	l��Z���B>k�r�����{�1z�xJ0����=WS��A����V��ËP=�7Љ-w�w(�
wO�!I�!�#٠#�m���`4��]c
lJ���|��p��o�P~#<��%68�91��W�d-ށ��@�R�┒!mP�1�Ec,�D��'¸@�Jj����;�B{��#KX��w3�3�����8'qy��c��'v�f��/��\��tO��<�%\��ˣj�[�S)NN��_>,����
'�Y�����`�\Ѐ�Q
���)|L��|���2JŢ��dp�4���s4�N��Pp�P~	�)e2H	� ���M�[��@>@b�xf�gg\�pR7���wKo�����M�S��+X�q6ex��Y�F��A�n�ߤ<'�I�dv���r�r�?��UZ5imP��T'ܥ}B!\�o9U�Q��<��"�y�#Rdc]f��&��)��h<f���?�f���8#�m����l��/��PK/WUW[�)�%pip/_internal/models/target_python.py�WMo�6��WL�Cm@K��b�rH�E7��fZZ�l6)�T\u���3�"���ͩ:�5_�73�U����Uat���:��H��T;�/�,��K�
⵬Y�"T�
�y��O��?�W��4���	��X�diY���;y��tm:�;	�ڦ�{�'�"�� P�Щөҹv��V�f���6/�"Y�VYɭ�
�zh�Y��jx��k��2^ۦ�NXpg�ѵ0N�.�C��6A+��UL�7Th��!A�ZY�KLg�/���'\�z�&Mm��MS������Ib�Ӻ�6�N	~�v��Y(E%��t��75n#�"�����_�����]YN�pݫ���\�A��K�M�cEY��v=�ǃu��	��'�z$G8R�x=�%�[P����I�ˑ�G�[���
)�PE׮�W�=�A�~	Vhq�3��ߋ`�MvF�No�o> �@�p#��[ݬ1'�;Q1����"-��Ȳ��R��Wppld�A�����Q�Zt%�G�O,G~P�l��+�Q�ؑK��	yE��<,��C�3�P�f)���N��	A�r�h�`r�bR����YG���-,#d���
�vb�����O_�,2�xƒ@)<��P'w���M�?��,����m)��
�x�?�#����GW���Fe~��͢�b����
cL���4��P����=�|V/}��
��[.�����j(��'n=f�G���`zQ��Xnh���v�PQ{���o-զ��0�z8�n��#m� � *�_�"�����P1�C����c�	}��nzX6���:ر��e�adӨ�� 	��d�jӎ��N�1�*Q+)�<��1T��
Y�
�k�����>$��Lw����A�3�.�{9:�h7���؂9�=��l�H�g̙
�����޷�FF�}m�O�F]���3A�6���s�t/3�0~
��	L�%����Сu
K�+�_q��_��0��>��t��,�R�G�-���8�es����ˀ�+K�F�������s>1�,�g*Ӣ����O��iDf�Y>aI�F��?n`��i��ZlD!p�ɰ/W�dX04^Hc�v�=��.��x�������S����6�Д��x&fbX�,�Zd��7o�hs�Y<@,t�w2�}��+��kޗb���7Z]>�Ig��c�'3������sI��g�=�p�@�dRc�O3��VS�N�b�5j�d��!��?<se��-�
J�&8$��3���l

1|s�(�V�t���
��e8-Jj���֕�q%cdb�PK/WUWi�pip/_internal/models/wheel.py�Wk��F��_1(�ȭ�MJ�twI��]6!��1���id��{��=w�zy�[Z
5乏9�ܗE�U�,��
)�WD�X���,sQ�U9A�ed�pZ���4Jo�����^�ᨔkƒtb%�$�$KU.�QE#���q��ha�Z�}�8���27o9/h"�)�FA�RU�n�̵I*�}�Kv�����䲫�J�)e��.��)]6�o˭,T�;G�2��h�����H���;<0|�R>J
�S�dz]�w��1о��/b�[2g���ݍ��~w>����ɷ��qc�^:ߨ"?�ɯ�ܟV�֪�#���*�k��7����&��T�=�P'-pJ>^\����p61�)HU.McK�b�9�f�:3�3�.i�xb��癑ʢz���1��/�ڥPHVPm�rt��� �,��'YK����sK�Z�R��y����Ƌ�K��+#e7R�m��8��<�&��F��p����ћ*�X�C�kFq�FM;���{z^E��(�γ�%�
q�tp�Mg�u�&�s����,�[m�\�'վ�'h��dO^�|��(&�E{
���I�ށ���<��K�M|X��C6^��mU(GҀn6��	3n�G.��o��5�����ӹ*e�Ga�����a��~���/��Ġ�w����c�;��ZX�o>`>���r0��m�/ɥPE�8����z��<����^�"�1��=?ϭ��%o��K�(`�[ƨ@�t����C#�y���a7x:��n*��HN��}�P�6pAڭ����B��y/aa��ZS}/��C���=O/o�T�Ym�'�`dI[#o$��⭧���,����2����\c������~*k�_tn�as��)V���?|�*\���!�}jr)U��^��L�6�19�Z�v�J,���h�Wv�GYl��mf�-�a�?���nd�c^;�m���
�@FI;+_f
4qXTb��(�u�2T���!�;]�w.��e�w�w�zK������ǽq�A�4��6��g��e�w���T|m\�~�9.�%�x���>��Q�z�F���mq�LhWS�����p��M����cV�e���F�i��O��
ͤ
�:�f�[���Q*��JԈ�$i�Tq
�R�,�	���m�%�U k�ۅS����:Y��+�)hb���O���G{߾�5~�>�2|'��a���V�e���I�Q�ZC
x�w�^��z¬��z�?/�����L�,���1+���PK/WUW�J22!pip/_internal/network/__init__.pySRRr��+I��+V((-JͩT�K-)�/��rKRSJK2s2K2S�������PK/WUWCXJ��=Ppip/_internal/network/auth.py�<ks�ȑ�+���ܣa;ލc�1�^���8��&�R�`�X�H�߯��=H�w7a�e����w�4���	�yw�<�
k��,����O�ٱN�/�V$u۳n]�,��mh��9��Q�8w�m�B�.zV%���W,Y��`�񫺪ۋ��X�
�L`U�?�	_'�B�c���Ev���A���O~q �W.��}ݘo�
�+����X�fj��9���i�U�+:���&ŪL��g?-�転췬��J�Ym�s��P�uC^�F�� �����-ow[��|
����U>���"y^��"y]�{RlY�~�5l���!��f�Ѝ��e�k+�e���`�A���O�ߟ&�0{��[}+o/�B�x�����1/X���2Gt\tI�`'r|�x��{
wX7=c[ô�A�B\.���
���QI�䝎m�#�r\ ��OĮ�{��nx�<�ǐ�*Ev�lA��x���]󃃆��,�fy�[�|~p���|{|�*~��ُ�_<�q/A[��eh'GV�fV懄0`v����/��2{G�[����o��(�����	*:d�
F$;5��TR�)D~)�&+�y��@��^��$D��2�Y/��Z���<��{GS�\⊟,�n^V�ٷ�K_=���'�e�r>!O��1��wL�f���i��%^��ki����%|�Q헑�z��M]n��,�f�t��E��}�
Άs�(�}N[�lA���~`�������~<���v.B�Z�����@�zD��r=�u
���0�e�M
�\$��WE��F�yD!���?f3K�5��n�k��>����?�ff[
����Õ���=`���H��sNָ�g��3��f�l@���[�R8�4����u� 2��ZIϝ^-N��]Ib�GȢ��B��Sİt���`r�m��mY@��25��̒��Z#c|�����[ѳ� -2caͬ]Q^�y�A⊆� c�A �M5s���[��������f'=����ȝ�Z2�4\�>G��N�0��>{�S�7��Vb{'~���Pmא��NY��m�,�D	L�f�;q����a�7�R@���V
_=x��O~����A��~�hU=z��q��Ӈz̞���G����I���u���{���w����/3���_��w2|�Y]WK�-�Q׍�z$������d�����/Z(lP���]���fi2$���F�rx�)�ã�#�����m���n���e�̅T.ꎷ λ�l�>?KO����7'�o^��y�Kzsҡ_�s�pE�ܙ�<�v�;����G�U�.�)�_����ׯG� Bq�������K�go�]�j���+�)��irq�8s��<��]�����s%L|���.�w�3����o/*7	I(��&1���*�u�I��'ˡ�)��1�	�O�a��}\L��4�S�m����?��'���Ԟr����y$�|Qa 8����L]Uc����L������惀�~
nc'V��IU��=Q	kVL��_=+�Ӝ
Br��d
�J���1�}��% ƳE�i�J�C�ȥ�x�bV|?�l�'�4���ع��_���@U��ϸ1 �+_-U?p�-��c%f�L�fA�' )k���$�xo�V`ؔ���э鐱2���h���a�R�g��b����"0��Y�"ք͚�#+���H�G84
F5i�o�7�4�D��P|�T#j�"��%�f�^.�ǟ_��qA��%&l`�CQ-9��x�*�S�_�@��,}Y4�qf��ʛíT��z���!�1p��8ΥB8XZ�)#'�Z����E*���d�8kyW,'�@k�Q{a���Լb=�h󺟑��3f6մ=;����*MZ8��G�>�|���t=�*���G�rZt�~�Ξ��WC�He�ߋf��������j1��t����h�d���������|��@��r�Š����jҢZD��YC�[¶�~�\�JT�����TRf{<��E�#�op�ٹw+rG흄/���L��`��C���4Q���L@���6S��A���� ��XO��Kx��|h�����Y�('�Em9���--&"�d�h)qlV�rt�{�S�
c�)��Q�)��лE+��	�>`��nk5��ə>�R�
^��q�	�9�P������@�)3���Ӣ����؎B�D{T9n�
bp����bс1�K���;�����]��cg@S�B�s �Bh�?M�Q�b�*��g�$�
�q
�P�K�P1�L{�\�6�p���� ��Z|���k��6K��v��D�
y�+��f���™�|�K�X�%�ֈ#�s���:)��9	c�NGi�͙���;��>|p7 X�����<ǁ��9��Z���PyǺ~o�~�b�Ӎ���Q�h�"1o+E�!���g�B�I�lv2��b��AdĘ��b�Q6#�H�;�K@3�2���f$<�:ML��r�U�]��M�;�����@ÊN�NZ��I)).�ǃ�R
�&{���[Oy@-E���:������)�-�Ӭ8��s�ؗ�P�n�Q���o�}ʬI��,����a�S�D@RS��҉ȅ�J�`e���>�����.�v�F����>k,y7Et��H�뤧�A!����2�W�s��kю���"���[�5�)=�񓱡p�H.jHqy�'sk9� ���nȒb�C�)�'j�¬��p;��Gѕ˃����:�R� 7�V�L�e
[�T`�U<�a�"�h6F�0&�����E�WE3�{xc"
t��+i�r��hX��IF����T���]
�3���緯�mї}$e�eV��
��/ky�~�Z&-��N��>�Ʈ��ɬ��@ l���~���8ـ�`�^@2I��t���s"�Z��yV<]�XQ�M��`"��>���m���jpSܣ��A_�@��J=
�岨�k�%Hf��-<3Pp���hH�&��\~G�A�eB�A�q�2�4��=�:Y�N�s,	=��S�]�Kn�]�KS�G�Ӷ(\�+�dZi��D�ۛ� G������8�эӔy���nx遟<=���I=H���S��`�
�nd����۔;�O2ٰ�㧛(Wv�]�,d��~��:T��&t��UUX�^���I�M�䆾�=����������P�5�� �\B��d�������e�nb0�h;���T��[{	��_��̉�W��Z�tG���(�s5/�
���ӳ�N��C��0��
*E�M�h��y��Z��s���{>���ˌK�(E��
I�'ۮX�2���UW�b���c�k�U��fl
&u���I4���B�;�d4e0*��S���x
K@�$,��E%.vaKo���Ⱦ[c�kf-�|a������1������pA��6�r"	�)02���*Je�	�2M�\T�'����>E�@�}���y���9��C�W��u�ԑI���]��aEy�FW�\��V�C�v�˞q��~�Z��t�q_E!��]��{�{wv]X��>��'k٘:������'���٢�6�X$�+5��l���?�ʢjt���-�d���&���t㼢MY�(�m(
��s�	Pk��q?�̠J�0�Ќu�����Y���	���q�=����O}��8b)O*�+ʘ�(�7_�T^���V�ܕ#y!��\u`�����e`{����@�"���A����o���.��n����ގ��Ѵ:�rz�X~���͙[�ub^�~����n
���������koAt9ʑ��-���.�w�PG�,,��\�q�	�U��Yrj�s�ܶة��^UU5v��d�țl0!�L�@�W1����d5�>>�[1��޳�3�o�Ϧ�_��p�w���#%?�h��ךufЙ�}�cY��@0<�$-�'2T�����J�X�XC��2u�	K>t`Ve������[B�ߎ-s<- :�z@H�x�t/9�-�Խ�~?�"����D���3�-?F�e�hr�;�ߦ���gUK��+~Ų�ˡC�^K��	��a�EO�K��x-��$�pey�'\Dr�U����>�=�V�a�Ȱ�\�QaN�ց�DQҙF�}wt\�1��Z������/�0w�[ޠ���a�1Z�� ����p
�|���#R.���J��"�O��Ɗ+1龔��k�R䦇��V�.Ե{�*tBS����#��>'��;��$��ʼ>������[,�S�e��vkr�������
�VS�rH�,
@���#)<2<�{�j���/q��W`�{�;��md���E��z�
��+s0]7Ⱦ,J�摺x���q�b�m7�ܑ�޳�/y&��P���tko�hT�s�Z�t�w�g��g�Or�χI:7��̔5��M��@dNr�|EՙM+8g�>�P}U��)!N�����a�?��B�lC�X�I�f�u_ ����7?5�%z��k�J��bp��[��1D�k�h�[����a��љ��>���Q9�ɭ�"@e�a� ��t�u�pr~�}�g�O���|N���y���̋ݡ���E���Ew!��ݗς>z���"`�gwhw�q;�v)�<�t Iy����B�� 
F��2���� rj������,��|�ƺ����Q��]��0���$lث��S$[:��!
�ȡ��O����\��X%5��Ni
l�6y��c6�uI&:<H��5��l���h*rNG3M+o[��d�t��<��Жc;�{��<VJ@�!�=f����=?����n�f=Mh�@�Z�tϜ��_
����y�w�'��i���%JBR��x���;�D�������5Ko��T��e<��������		��bت�j{u��0���
he�u�|�P�<���A�`�J�|YXE�i�D5́
�7B����U�4XJ��r�ڄ]%�n�r��q�p�+�3���7�����V'�pC��]f�� �KS���ЭA8vt�
��{ɛ6C�����(.�^��8��S�*�]�JfX%U��MX�\I[���,�&[<'s�B�>6+CH_7� nU�WN��)�mt
[�����ى.�9��!���m4Mˀ`������%=�^c�y�^mՃ���C����dV���z�4������C�ԫDGAUX�OK�A���8�q<B.�Ɣa8͍�yD���� ���se���ߗ�f��P]���8�@tx��֙�����
��H�C_
�/���3���g�g����Z�QOH����K�eD�e�@�����
�.�Y�R����PK/WUWO�Ѳy_pip/_internal/network/cache.py�WK��6��W�C�F��>..R�	��E$�X�4Z1+�*I����zx��&m��a-��o��A�j�����-��ld׷ءr�I��d�Z%	-j�@ۤ6��R+����ĝ��	%n��J8t���f�vݱ��v�{)�0��7��
�p�d��D��EI8��>��QU��>d�mt�O�3�{���K]_
��x�S�9��>�`���y�+l����ZY\-I#C|����5�ڣu؍�D�Q�$��u���30ط��4J'm9�Ge��J�$I*�A��yf��1m����(�n�	�Ǡ��[��;3�g��QV\�������]ڡ���*���ml�]Mɽ~���oBTm�5��Q}I��%A�k0V'=��
�����q1	UAo4��|Bn@P^��� ,��E�U>:���C$�9Jl+��K��y�3��-zA���l�ދ�JI�V�z{��'�,CA�Udxhd�P�8
�E�=�f�,��R�f,I�#t���vP`TM9�F:&�'��A��/�Paq�V��,��(!���!0���3(*ãYA�MKv��
�yV*r�D+��/+9���l��C�v��q�����V�f(�Rw��֛e�n�����7_��~�ea��D��'�@K���[Y�
E؉;r�]~�5�3�$�v)Xzd�EW��
D��ä`-�1����
=3^8�6JA��f���3�e*����x���&��j��}3���4Q�կ|x�[KH����BQ!�q�K����cU��Z-*�Hr�=���%2�rb=�T:,����DO�Ԟ\3�2jМN4:�f���P���y�~�s�gRbd��U�4�L)R�:,��o	�=;���v�Ŷ��قu� 5s�R(h��
ci�#Y���cl��&$�zh�u>E���(�|y1.�~�����+��:}ϑ�"~|}�k%`��0�w�ʠ0�&�є?�@�V��� Le�S�Q0���tG?[��kY�L��@b��P��\`u��ßF؆R����*��L��z1W
���ҸH�����5<����f����m����T��|�׳�$xT��1�r\G��f)��t	�aF��s/ZR��?K���m�zD�:�8�j�>���G�0�Ӭ��֧���*�ݹ).�t�;��ɱ�����d��I/��z��4����O�{[ݣ:
����5��遅�:�.Ҷ�3f�q|�2?	��v��?'�j���:� O�ޣ��4�|�\�������9;�-��\��7�:0j�Q�T�v^�����<�qQ9MY=#�'�g��Bj}(���������?t�9	�,��>&�?����t��x�/��o�����q��h��ır�2�Ғy�OO����B�ۀ��ɟPK/WUW�+��!pip/_internal/network/download.py�Xmo�6��_��( o���d��4]�viи� h���H�F�I���}w�HQ��4�>M@����sG�q�V�5��%Y�)r���R�$S����B�,��8�u+�&����jXAW̽��jś�{�y��eʽ*ZJQx	�H��L3IK��Vs��*%�M[�Ȯny�巬)��$�kÔVY-JV)����|��~>�_��q��OL��Q-���`���x�\�TzM+��G�WH؝I&�T������s�9M�
�r"���^dcv�/�g�V��qK?�������X3�������!)����^�7��6���8=���ɧ˔H�˗B�JS�Q��J^�7͍SiTe5W��
j�s�f������F��C	�Qm�5��Q� d��3H��.���,�'Q�lIr�Z�6�f�	>M=�&���+0�z�����$�	1k���֌b�U\�ѯ*֬�:����F�
3�H�{����P4�v����h�������y�&�]��w����}�?%J�42^�R�Zl5S�O�i�[�!����E	�4;"8*Q��̀:Cz 	�F�4��E�����ì�HU������Jl4�j���� ����1�$�כ���4P�J�/_'qf���_��I�k�o1�=���$��R$�g��h֕䥊���H@Ž�QŞ�ό��,�,��O���eU2!o|͜����ob�;Œ��`Cg�c�="��@v�r�
@��$?���룣�[��[h>[�2(Жq2i;}�ѱ��R��+Z�``��(��ͱ������苂������
� �w$�c�"E&�Ɛ���o=�!�_v�DC���@Ln�҈�uJ�;�{�!~�#�K��@Yg�PYK�:[P5��Y|�zs�^k2��29��z��t���PJhS�Π�no�����8|�R���Q
�U����ؤ�}WA$�װ~�}��o<#5�|�uһ7q����8}A~g�a@DZx��V�]�3MJ.�M��Bc���hh�w�v��hh��Y�<&�;/��0X!�=P���B����+�i�A݃�/LC�	/��m�.��er:�_x*��A�
�zA���m��،x!b�K��oA{9�J��3�գ��f�����!T��365X�`&���[YB܇Yǎn�A�%���ic�:��'{Jz�0������*qSb����!c��7�l�)&3a��-kpNv۔e
Y����0�>p��~ܱ	��:�.�p�k��M�[��{�;�����H؜��0
�{5⊧%�D
�)Κ��/ b�'WG�~�ŌY�&��t�T�Q2�h=��Q��٣P]Q��]QQ�nvb]M��P�u�'����e<�����
N�Ӂ�,w�.���PG�P�`�14�����ﺢ����L���
���aw��Zz����*3GG&��(��(�ǭ����4~�&:�pH"�&2G��]��̑)\�M���p%���C��l�R�������.�E�T�u����0��h��kC����a����M�Rҡ���ѱ�#�[���qH��I�@sw�x�	;��@$��f0fL���gw�f��~w��u�︎6��;u�f��<
�Lu���q��b�d5��H�;�Л�Y��\��׏p���:���`:C0�#��g^O%���h�z�lL�#�Q�Hhtm��	��~,��׿`)'�d���?`+���X��oa-c���z{��*;��q�D�PK/WUW����	�#pip/_internal/network/lazy_wheel.py�Y�o�8�_AhVޓ�d}�����\�)��Z�l6��#�&�b���R"%�i��D���7C&������\d�7�ػ���A�fI‹"I؊���[q+��
�|.u[וjDD,Ȥn�\U��q'D����g3��m�i����yu���C�Ve#��Bn:�͞�|+��jľ�e!:�|/�;��:��7��P�r�Q]�����)(��(��M�"�L��M�Ȫ�E��ںc�-���Y����b-�8�&ʬRq����q��B�n�*e��,��=�T&�:�W�p��7�>�%��>�o���U�n���R�K���hx�����
x��E/#���W��'�*b[�جeє�R4��z���H:�e��|�� �.�\�~���PI^�D7�i5|c]K�][>��l�\k�B�WO��Η3?50c&r6Q�!��׈�G�d�Zz�����
� ��iU�8��ƪ�W�vS~;����H7�|�>���NjւJr�~�.���XU��&ݑ���đ �.K��.���ꆉ�j�;�%k�����b����t�&p%XY5��q�RHxDٴ"B��lvZ��ń�>�s�5{�M\��'��V�g
"����΄�"����Hy2�����e�Q�Zt����oX���J�"�M�V~���y�u��s��E$�e����"���@�Y�b�IȐX��1@�8�R�
�!#?��}JL�3J�z�n���4��P���}�2�W3�uQȇ�R���E�����:.��T2��Y���I��N�[�D��V(��<٤ǧ˔��Ո�CUZ(0�b�w�7k͊R6��]�i
J� I��}b�(�� 	$�,ѐ�%&���I"�·��!vP�`���t>	�WN�VF�"�{
� ����$)��Z�_���ʼn�\0m����YG���I+D�@XaȪ�:�.MM,�Ip?�R�&�}8�h+Sވ�W9��Ȓ��L��-�~DB{�I��`sh�Rd�|wb��0�Hq0-��4.JН"����zq����N`s0�-݉�!��"C��WC�}�A�z��u6A�������\��j7q��0j��FHtR�G��Mۖ���1�S�\5,�t`�4m����C��)�5�46vd�]�j'����r��ܗ�����<�!#�d��u��Z�:=h�a�N$
�s�ih���Źыu?
,`T[c	�­Av�����۽�"�sՅS�%)����$�)u-R�KwX
�n����ja^���-M��f�x����Eܙ���5=�E�6
h�,��쟳�,*�u��O!>c�ל
W��h�
��p
���j �]D~cg��e�P���A���nk�Yd/�Lc�^��n�s>��Lِ�A)�X[���q�pC"�
��\��j��0������ x6��Jp8�TZ�=,_X@��h�y5�	,�e��gK�7G
j3���VkW�;[�O�6X��)!��x[4s�m��j���w�矞��%�l����t.��V})�d����]��N��hu�v�Y���"(
&]�ڠ���b��[�t��w��t���_	:H���pG�>a�-�&&vZ�ӝ�������iSVZ5�X�~�W����
lYX����vX��D���rq����z�-d����h�W�H�"���$X��Lt��@4��D���/�)]�%��|�7\H�
��%T������o��(=b�T���1�A��2G�#<�0Wa�7E��S.��Ԡ
���z����`OFP��Q��z���or^�HH�:���[E_X�����9v��s�3sB��蠺0���f���3��A������i���=1����C`���Þ��.FR&C��Н�		���S��$��ast�v�9]�y���>�-�/��4��~������t����6e��tH�}�p8��#ؒ.{��L�(Dx{Pv��"u�?͕�%0!�sm����-1(Lkh���Ӫ>x�֟~�����9V��"�/��;�?���77K@�f�…n�`f�
TKJ챮K�~��mU���>1��<�z�����9��M�G��P�WfМ��ў���%�a,]ԯ��+�v��"|�5@��/���;�U[=�u�so5Þă�8�@t��v�z�}�ȯ� ���TPkx�V��C�D /|��	��NW����]H<�)���lެ)Q��>�/L��y�#�Z����-F�zy��Lǣ����^�/=2��{@h�	3�v�px��`�;oLF�ޟ����}b$�mE{<$Q
���jzU���&b��Bn��l�����ޑ�-�L�V�&[��yFź�znY�Ź��/t1��������� (�
����U��p���>s|t�zL��	�;�h�0��]a�yb'����+��c>�?PK/WUW��d��H pip/_internal/network/session.py�<�s۶�����&R+�N�L[��f\��ӫ{l�����HHBM�|iY����@$���{�S�����b��X&�+Y��d�1�%L�E����V,�1���2�����š*D,�2e����+�?k�*������k�(�2A0�
gb�e֕L�m�y��IRJ��O�g�w��V��}�ȍ�v�h��ͯ"��2/7�Y�q��^e;��]�.�T.‚�Jض-/�j�,�
�5� �o<b�������g��߽�R�i��?^ɸҿވL}�R?^He:��a��)�S�t���b��n�"5?�g0j:��4Vp6a�(�$/-j�d��l���0��Z�)�yj��aۙn;MxQ��qŢ_�}}�vݐ��B~u����mtuyy�����oS�@���oo���9m����N8W���ɵk��<���AUeW50iK0%�0)S���ϻ?�A��D�'\�͛�+h�?[<łأY���?4��La�E�DI�"�̀\�k!���v�JTQ"��N�Hd��̳�Ȫ��D�0�ك�}�����Z۱oa	�*���1��>7�X�N��K�Z��/G�67�RF0�|Spx�Y��28!�P=��r@Ɍ�Y��/��#����B�XsU��?|���Oa��T��E-�$���px�O�x�H1����`Z�!��#@{
Jx���%if�zs�B.��Q�?ď����h�2�[�4�PgC��*����Q��"�`7�—��!0���ڔїՈw���`��q?�3_ey)��f%�J$l����̪J$��\U����p)S �}� `�x%Vy��
��<�9?{}]^����ݜ�6�s7r;�#�0�7U��!�o8I�����,Q�l
��n��/�^��S��'l]U����BVa�;z��rw��ل���T���;�5��z��)b1���O�1�w��P�����/�]@Ea�{Bd:��@��[�Sf#��}>��,o�B	:�9Z�=�R�E
*���-t�e�щ�Y<���Z��9Z�JlT��k0��Cx(��"]ú�#�0��h�,��
	��@�����p��@I���Y����8���������S^�5�F����ځ��𞁄�\y���Ȫ��Q&Bo��!����ȁJ���OU�%xq8�jw5��Հ�$��1�q��eyEڴk�t��A�nP�<~X����r�]�j]/Po���9�J�0���_Fg�������wo���F��^�O�8��6:�|U6�=l
~}?�x��U`9�"{)q�8��E�؁���d�՘�/�^j-�){#��/6�@C�y�VA��y6o��?���`C���<��_E�f���
�?�(�"��x��'O�&FO�^p12ds8����1��ͺ��<� �?K��Y��`��y�|�^��E�嬪vl,�Uh�T�Ɠ���1G ]�xȝߐkbX��€1�'�P���[ 
�G�^t�5��)�v��R���a�ió�5)�o�S���}�e��TF`��J���c��C�E�HR���O}�N��v�����VT�28a�~p����-��i��.v@J췡N�[�����9ȞDX\��~�x�?ͅh0���P�ݻ�:�w2l|�sePn��d7�ۻ=�
���sE�kȊ,K��v`Z1O���lo0�����Q��,�5O�u���k�;����A�g.�����iB"���[�]�����Y�Q�qB%؛#��!�A�{<�/���=q��\Vj:k�����I�Ⱦ =�Z�fM��U.jR�33(�͂��V�mfm�v��C��8��4�'��1�Y$�=������^�_���p��Ip?��ć1�Q���$�uq$�th&��X���x_�]:�
1��p'z�� ���}s�z�.��Vf��\�fĆ�m��w��Tk`��o�����ņ����_'T�2�p�i���i��nD�ѭ����h��W�ݭ���p�E�iF6@L��k�.UC�F�y~�J#W�sxyu������;=
�Y���d���Ќ'!�8��if���:���\��PY�.(V'9�R��v-c�R�c`�� �_j�4ہ���4"x�[r�B�� �̪tg,3x�
����E0����)��C�MO_��|AP[(๲�9pnn_]����Jn@��/������$�:�wL�H�𻁞�^\�и2�洄��U{���*�Ь�gz�����9����|�X��/��<<�e��ٳ�!�Of����D&I*�XÛ`2��M�<��鲛�s��*�4�}�4}V"�{V��X�)�� $c�yJ1�#rľ+:*�O,�M��`����[e�b���YwA�@���#�4ekk02��,Nk�����,�9MU>e[T����<�}��܀�]���? �3��rBRg p3�ը�Y�&	G-ecI�-�쇣�uD;MK
�(3<s�,�1c�n�ߜ_G�o0����NoO[%���zi^���
���4�	����z�:�����>��ѧ Ԍ?�V��Wk�q��¤�jL��"�A�F���`��Ge=���!
�À!e����L���1wc�È&F�C&-F4,[d�U�I�z�_�zܜP�HF��%t�͛.ӜWS�]5��	�G�2���D_3��B:�j8������~whP�OR(g��	sfy�(J��4N@�B1���v�
!1[=9�U�P_{P�V��P�����~7�B]�Bn���RZn��آٳ�7�e��]��@���56��Q��<�uW	5�d��OW��6i*��k3An@��U�������C���Q�<�&����[�b:^(�N�G��*2R�A]-&�z�p�'r)�3�Rو;H���V�
��u�jSi��@�(���5W��
�FjnO�_��,���#�
����w-x�7������ׂ��L�ux�+��n�"[Uk���@ɿ�M��:|k�	s,e��?uܚ}��mC1P��"����i�����\Q%���Q�:i�U&iߢ�e5q��c
�V>ɬI��
O��!������e�\Ք��x���t�QC�H����`��#��L�Su&��J_H���@uv�:��a\�J�)0
�̘n�����p��A���60�����v/	�L�k�F�®�z�`��1�֩�g6��"��F�>��c�Z::�=h$�[��{2��4�'�K��_�M��W��
�����8w��6�^�rx���l��U�u���Cc��eΖq�hx߁s�ꤴ(v��`н"�h�r;9��N�2h��#Y7Gz����f�o_�J��_��:�o��#`��zcNY�x�>��
H���)��җ/�1�^1���q!��V���q�I����w儮Կ�����2k���bJ�@�I3�j��i�V��פG����O�Ү-�7�L��Щ8�V�z��@G���HI�>@����؜%M��S�a��Eqv�{7%!*º7���~8A���,����	F���>t�S���R&�����e=͇*�&\�o�H;����{�*x�� ��iC�1d����(�	p�b���8�֕�P�i�
*M��U�\�,����[���SG㈇Njt~w�.��UEu�Y�������KF��5��]��i|�y0��{V��4��5k�%���jJK��պ����-��ڟ��g�a�ڶ��Di�(�"`<��LS�:2�s�Yd�7`H`k��
��ɰ+�:�n��>�VyΣ�q����Ni(N�=S�KS"̳�5��FPgV7�=e/�0�+]�a�
�j�x#x��<�kk�SWdu���[���`1��F��Nٸ-߅ުб�*޴���O/1@�RxB�� T���k��"^�t�����p���*횺�x��t��M�П��Cח/~b�_s��u�PxpLf�S,�8hv8M�FS��_?�N.AR�
���Ma
���w�I�-�*1�D�����,/-oFm6��� ��2���DK����8|���{w���\��Y��+:N�ҵY��13+R	!�WT�ZہdJ���!�
`�&u��������d�͈�
�f�O(}lD_�,W�M!Uဥ���SH�s��ۋ�	���
J5iQ��<�	�A{9���GF��p{z��5��#,ƍ�_@�?f���`A����Τ)�4�ҁ�̀�"��+z�f����qR��&g:��ճʞ�0�D#�+뚭��#�g
ע��HN�bvkK�h��b�6�Ӌ�9;���!����H6d���ՠ�;�0�nB3	-哧B��8[�8w�oȷ����+�S[�?g��a3��x�9��K5�����|.e�#�dd��.�@����bG�H��aP�p�O�ף��=�>ψ��BU�7���׹=�8�Pi��:�t�<I<z��kJj�"S�nR�MhS(�Q�Q�q�2�����'����N'�:N!�P��h��|Lok��D�z��o]ΰ]x�G��o�L~HG��Q/(���@�GX�n�"$��-Cv
��>~2ax��>�|�E��N�T�3��]�v�Y���m��sJ\f6�F��-�xA�t�x넪w�8@�b�֣���R+ �2��1�1ƒhJ|�?+?�W��h�M�Y��#h6&��QO�4��4B�4�G��m�S�@~��{���+�r&"�}����W�t�5^����bv��qs�V8T��CwB4B�~_��� �B^xo��ɠr��ѡ�z�z��3Ү��}ς�&9;�ݝ|��W�
Г.;���F�}�'��_��Ϲ�-��'1/z�F{�&���w�����;��+�12�pQ{uռ�745*�����i��<�գ�}ԯ}=�k�=~�-��.���ٝ�f�%�bD�M�"`�
}<�f#3�_3���2՗Uܾ�D!�~�W�`���tS������u<�ci��¹C�XF��X�A��j��3�^/�<;�j^��D���DK	�7�ٛ<����o�4������h"&f�!J�+	,���#Ԙ�#�č�(�qR�qB�����,z/1���B6��"��Kl�	g�W��tc]zk�l��
�����ԅ]��������s/��q
���t]s�(�;�l҉�2�W��s�bPXi��y�n��؊��7�"ѹ���kH�|��w�H3��W<~�+'�F�&�BOV=�i�uHcL����M�ѫ�W����Ct��o�.l��t�`h�������j�W��b�clb�AI��cG(�΢S9���t ��C���iݎ����)�N��@*t"����5��̚� ��I]�G�aN�HM�:�
{�ѡ�5�ǡ�`?�3&���t�� ����{CjM������5����]#
m]�h���>0 ��7+�
`���N�ؗLJ�L�h�C3���g�t}�Mf���͊�cuM�#��@y�+�f���t�9q��7}�SR'WyU��ap4��fk�]�\T]��E��kj�S�N[n�q�/8�8U&�W��AN���ڬ�v�~�IE*�Ԅ�t}�fL�O��e��$"MZ�,=
׼@L3�;�&��(6�V/7gB03�g���7�:J�e�7qccYt�����#��'a@�$D2ٜUЦ>r�R�Qr��Mt��"�7���.��Y�#Q�	�����[�p�:P�~܃D(X�!�B�!�ma])>�_�<;����}�c�+8�I���5�ƻ�o���HS��z���{jV�)�N���&�����kx�%x�Nq��nj�!�y�|�J����W2��J��sg_IU�Њ:�0Gݽ��Y�j�M
9�+�PK/WUW����pip/_internal/network/utils.py�Wmo�6��_qp?$l�M�&1�]�-ŀlhRXQ�t�9K�FRq�"�}w���4k��B��{k����2[�Ls�-\�Ў�W�P��`�;�̧��"���)�X3MU���/�����_\�|��mq���1�G���`[��,�L$S�bn%�W*n�n�^_�,Ðo��f/�~��$Q��4��Y7���
E��5��r)�B�EA�%W��"��E[�,�u����Qx���ѹx�2NO_�͎�������8��ϣ�,�O/Hӟ�Ax2��u��P�AFJ�-�!��_��ƢH�*R"�t�M����x�)y,
��0XBK$�*���RaNa*��ڀ�(����C��rYh�6L�N��5J&	d��ILX'�I2;�d��%��ߐpw�	�l�D�2,o�Ӝ�R.-E���!!��hێ�pH�D1�sTĎ�9,�ȼ��=P�^b�֮����=�bM�MH�A5@�zx��jM,����ؠ-5�P���`,��UUeQ���YG]�X*�~8�R\�܇��0�)5��Q#U��	�S��c\$^�E

G�4\>N�g��ኾ����B�N.��'�bFz��`|lC�5��n����ZǞMF؊'i	��8���Ɠq���}�w����&�R��.�2We�S�RN�4O�������������c��Op_��A0�ð���q0P���p.��0����z@�`��R��T��6_ �Ej�dd8t��42#Y�NMca�S��hF^�?nL	k�
�!ZD��Ɠ3
���V�2�hɇ+��F�B��/�d�o��'oiT����q���I�,��!�6
D�f�Ҩ������9]).��|U�fZZ�m\�O��Z��z_���pT��2�W�-�b�Cg��TL+�}��*w�f3xS^�2X�����٬ѱ����x����.I���
?��:q'$B���Z�hP:@�N�����B���G����V����`�]�q�W/�aT�dy�WE�6ޓ�i�1�����OA���u��k��ѵ�ص������_ˉY��R����N��›6�a���w9�R$~���Ldp��:�!*ߦZl(E�������q缦<�	(�nW]�"���lg�~��7��V�s㕇�c
�*���ŗ�vܱ�6n�l��2�aSqO���kc�K �]CJd�Wf��pm��'X��~�o����zI����j8�,7�[�*��K�F���!/%����\��a�Ѧ����ž8���oS���@�ld�=�
�e6EO��ْ�}ۏg���>}���
�/�h��g(j��l��r6�DV��w?�6}��^��\iLR���	bHSVَ�����Q������~3z����	
��
4���EB{�:I$%C�&j@P�Rn�u���Y[�z(s��)<�H��ู�.��I�7�PK/WUW-�{_��pip/_internal/network/xmlrpc.py}��o�0���WX�&�Rf�+��ic�*�B��\[�c��Z!�w���Ї-9�}}�|�.��T)[J�Xn�v���ȪVP���K�Ji�`,,)s8H}�_�Bi-��>�*2�D�doME���"�%�_��������w��-ikY3.���bp*�-���	���?��P��{k��V��L�9������F�W�x��=����X�H��~~�uB��f����q>?א�	Q�Rbp�%��+;��c)�ZT��*I�B	�B�_���T:�ntp�v��m�y�%A��8�|a5y�"�������@ܬM�C	{‘��1>�>#R�p�8k��H��z�?#
b-�/+X��1
A<���V�-y2֣xS#���J���vwJ�Pq:�_�C:t���θ+��&*�
^fv���7r���/�oG��5��\�ɒХ�r��ߙ��ܸ�vg��ld�`��l�hFc�G�8`��Njs]@��B#�i:E��6��<��M������!�n-��c��籽�D	6��
�qjo#=D������?�8��A�h���ԝI�"��%6S�)]g��2)��6�m`����{qդ}��x��u<Y�tqp�X�fF���4���n{����	s;���8�%g����
+�,�ZҦ�y�%7�q�(�}���qt�q�k�”��\8yt�PK/WUW$pip/_internal/operations/__init__.pyPK/WUW�*���!pip/_internal/operations/check.py�Xێ�6}�W^�EHӢ.ܗlͥ�y�.Z�mպ��v�.��;ÛHI�n�H�&9g�3g.�r��B����l�nI�:���K&�{G��1�X.��EYw-��jw���-����<v�71[�iU�M�rY�2!�J��5+>���P�r�`K�.4TWviv�[�jŀ�r�w_rV�F
��ӰvNTt,/�%�N���xe��	����܇���X�wIHN��)s��5�t�@�6|ы���F2�I�/7=zʙP���l�r�|��Y�8ĚI
Q�l�dV�-�+����m�h���Y�K�{�Y�
�Y+��[�u>�NX Fr�k�q�Ċ���8Y[R�p�wj-�T`�,^,yE� h6_:h�>&P����?=V����%n@��ڃ�{�ba��@L��1�B�n�K!0��:1&�m��f[�9����P�N����M��Q)�,J�Y~���Ι��O�z�e\�߂Ѐ�1b��3 Hf�W&��H1�DVD1y��֦m�M�y�H���
n�Jd���las@H�R�����Ћ���X�5��J0�	�O�d�3��J3(��i	I2\&�"�Z�LY�TǵҒq(�u��s��`ꪙ.e�������r )e���I�ר��G٨�n-E}��}�Y'I���7�[��^=SDŽ
�B{/�e�<�@*�
H�-
lP����5��@V����-��W�4%��3���2Q~M]�g�ks&{��I�9Kb���h̬�+�m_Y�kZ�V��^ۮ|}
,�1�|h�P���@~\#��mT$s)H,�pa�V��nC�x���ˊ����
���B�FJ"��Ar���̄�i<���3ڤ�2�c�U��f�8"�l��XKծĚ�̃2
�.ᬰ���V(�b"z�5�~ ���-ԆM��SsU�o�2L$`Dԕ\��?�ʳ�;��Z'�d�q���J�����V�C��#�kҠM(��LƧ'�u1�`G�R>�E��S�M+GA	u[��O��QS~��8���#S�lJ�-T$�<��}��.W�ׇxN�?
mc�Ң�"�A�O����N�g�1�,q��v@]O봭���g��.�R4�BG�\
�)�3�[���O�:�W��/��8Ȕ��\�LV�C4}_0!v\CE�}�If����R1��u�X���Aٷ����l�=�s�.����
��X�^l�Ce:��ݞ��Z=yB���ɟ
ǘ���:A/tZ�JR��;t�=���[YB2���m�\~x��2>۰�<`f���
aͪzMd���hB���|�J�[�ឹ��/�פS��1r�n���p�Z��V�"sM�M
���p'r��74���aN&���֛��r�
��3�!�Z_l8{����S���l�
.|a�cz�Z+��V3��C`���A�@���`��@XM*w�?Ǽ^{A޷E�=��C�����,Щ���׸ߴ��)���3�e='�0Ѝ@��z�O�� ��C�3$��3;!��4��7?�?.�v`��z�7C�dbf�:ɽ�c5G��JRK��n�PBg�j���hSnO����Qt�3S����,����g0�Nd6�C�	���7��Ȫ�S�
o��ه�x�e�ìP�n�a�6�C�Ɠ���	,�8|"�f=�P�/�}��	�dy`Oq��p�����6}��Qp*'3fv�U-:i�lI�XR�sfi�a���.s�d�{p<ͥ���{XH��+_H�ݳ�I3ɂV�])�f������I^�)�g�^������H�a�|�S�r��A���0q>eis�<b"$��c��[p�?3͟c%~�2S��;٩Afꍹ��Vfت�;
���c��&�?��X��^
�ϹI|���?�H�p�PK/WUW�<��5
X&"pip/_internal/operations/freeze.py��n�8��_�QPD����`�<Xl�]�d���y�-щ���%�$n��sx�HY���.�B�������j�r�H����\Tf�混Us�r��
�#���*��/y�h�0��_�B���P�aፂO����m%��ݱ��ŕ�Z<��)����`n�6��YSr����L�l��Z��
��*h]}ay��v�3!������V5@"P��ǂi����N˗|��M	�4RѺ��J.�P옢%U�G �/���6{ܘ�[�r��W�7;֨1$��++�
%�Ȱ�&^x*CGP9n�YY)-���5(&]$Si��f�.���WW��vh=de%�L��;V��'�{Ce޲������`[&XS����	�v敁T��8���d�X5���,�o�-�{�IV�a``�0Wd��,ȕ��kX�|%ے�`����:c��v��W����9X\Λ��"�kx���Ҿ�K&&_�T���'T��y�r�f�/Y��1��jW�3�"N@�d�s�&5�7+�t�������_X��}z^�]%0#��c�t�U`9���ʼ�A-��]���5r�F>�B'�u�ɼL��-�.`�з�v��QjC�2�+㟤���G�'O�)��6�ר�ٳ�/�k��.�icGiª'��e�䂨;F��Oꎂ���R�܉ڋ��p��@�U{y�uIPdd��U
l�`
�'��gI ������kU��y�<Z%�8"S"9y`�a���XK���L��< �wT��p�=ܧ���aA���`�HZ�.%��[/u{-�܊h�9Ź�d*N�S�4Uŝ!�P�#˶G(�Cs[ݣ1Z{p,F�ht^�Ѷe¤� QՎ�̷J��„��3�c�ׁ���;\9z �?jO�<T�[�����~�J�Ý�IŢ���������J��0 ��z��=���T(����Etξ~����DK�g@-=���a{�mՔK��<�:+ e�KH�灷����\�qy�5/��˒�M�P*���%{��Zn },��B=�մ���I�}�=kc���ix�9
s�4�3Z�1"�>
�C� A �$X��~�yђEɘK��l�fD6�r�O��?�nN���k���?"�͇h=�Kn
�ɪ~>*��~��k�a|��y�̱����L�7q�a�_dm�P]B�3��fx�JVa2KX��U� {y��t�u�B�@
TP@$�Ǧ+�����0%TD���R_���d���A�|������-)H�����]��M;�G�A�?�{^�'��P��
,��+���˲�,"��dX�j#}؎�2ADD�;S�:��neKY�vtg}�ns2�����y�4Օ�ׁ4n��Z�U����w�����iހ:lfv���B�yFM��Wx�{�-�'���-�e��d�ϔ�3ly�r�Y|C�5U	�#��	/�IN�V���&�!<+��)���L��
߫���-������{$ B��<^��:� d�pj�iO�V�;m>�#��<�Ӝ��U�2(�"�3��X��u��/�$����8m��OQ�'��Xr�B�#Cq2�\����A�yA>BF�B�0�RԊ�L�n84���U�O�|33sMI`}�=��D���찮�nSR�"�ڞ28��8�4�#C6�L�l0`sܟ<�1��(�Q��\=���t=%[ͷ�����Ѡ����y��uUR��,��S7�O�����6z҈}�=��O���h1}n�L[u�t��1J�Ȝ���ڽrSBM�Q*�(�v��D�v�57�������'�qj�<1O���P�X���E�e�q+k�
G��F��$��z��]�}�]�g;��W���)��J�/~���-�&�>���\�@��wn��⎌n��������@tmM�p��b�Z�6�AP�������b`H+����@U;��wqF!KJ����W��{��%�n��1&|�i����q�\|1�†��Xa	^���R��D7>m��l��-�=
$���1�J��zZkX�"��4���ύ\̍ޘy��:��ɉ�H�B�0-�1n{���.{��x�|B�F �ۡX�1��8.��Hr���=��H��D\>��l/���������0(��:dg��%P-v8p�ķ}��|/
=7�2(d-�a�0G��n���2:/��]*��Nh|Tɞbo�]�+,&%��;h;!`��?�o���*�Q=�@��蠍8�D��5��1�^�IK�7�Z.+�šO��CM� ��{ϼ���a��w�LZ\t�я�[�a�I�Ry�%Y���c1,�R��Jx3}���)�1�iĂ*L�x~f����G��)L8|ѻL>���`��u���4ˀ��3�^���cꎗ�,�����IJ%dt��hu$�a=���ρMc��k{�����������W�=a���@�w�ޑ���=�4#I+���SS���F�g��$�F��i�
��^��,F.�C��S�0(�u�Q��\�k����a�y,8,h�s��8��M&��#��M�h	)>?GC��6���;�8���[ctMn�B/�
PK/WUW[��h��m#pip/_internal/operations/prepare.py�=ko�Ɩ�+��"aef���/�E�$7�4H�v�"P)id��H�C�Q���=�y�PvRt�XI,q���y���L&ozٕ�T��J
}�:Uۈmۋ�QCY�%~q6�L�����N³�no��Z��^6�P��Po�J�^���%|����
�W�p�a8�0�cw���z�h;\����Zɳ�jߵ� ��^�N*�EkS;�e}��۽��aWW+���������O`��x1Ⱦ\�r.^�i��[��Uu��F6��/�r������uٴM�.��W�lʽ��Ye�
�v� ���%`y�����/�
���b�'�5��'޸�q-�`[�3?O`���w}��T�w�:t�\n�4�|U�}9�w�w
 �1c^x��۞�~%�rS�f
����n��7-�XG��_�d#�ܑ�f#?jz��?����g�en�^��L��T���\\�aiF�˂k7�V@-�������~��n�f۞�WW�3�%�~b��NJ����0��M{��m�q�2>�_�~.�����e�2s��7o��Z�.�jH��D�<13BM���J�&2����ܤ��f�X�z�/����k���A�?F$#�z{Z@IK˺�*�e{}�_��;>Y�d
����{��Bn���W�1��3�T^m�$�
���\�P+Ps�q|2��ӧ(P̀�����:>����D�͇�=�̚3�d�O�ܔp��0���<y�A�;�UK�+�l5��C�Z�;%A��ͺY[l¯gg5�[,�K2�����l#�b��c��	��T����1>������՞?�R-��K�j[��N�!y�Fv�<����J�%M�X��.ϡ@���+�;�Ѐ�{��)�>#���j�x���_m�)�M;��m#��s[
�����ν�37%9L����،i0�Qi�d�"�9�>T�?j����4#�����_�db�nך%`�\��~ժj
�x���'
�>��"��C�%-P���R)�rbx��kQ����(���~�y�]������@py�${�]հ\N���s����/A�d���
�g�#�N/p6�����|Hx�p��[8_�����)�������l0������G톡#����m�/=G |��4B
,��s�\*o7��bU�"��Sп�ń�?��nW���}ـJ�,���f�s�b���6��P�\W�
\�D��*ʺ���h����z��'?]��KMa˞@���s�,�4��yi��|����$k�l�F�a��ӹ���P9l-�v�w��t�y����3�%9���%�c��`l��%ZZfj����h:����H�,�߇���阥��K��@����>�fՠ�����Ķ��
ġ���2�?�lї;|^\h���8�J�[P�?���Y!p�p�#F�|�
R �+�A�S�|��M�'���PX�|����m�!����5�4�#����X̗ؽ@X����ۗ+��6�����_�@��U���B��~���5+�/P��ry/�<!��v��1j~B��:(���O�L�p��S�Џ�;1�S찵|Q0[^�wX���u�%����R�2p��ݵJ����5/�?@~?c�ڗ��j���4�c�L��҂3۝�R94�2ƙ�|ܚ�+���n"��]�v��r�m�(�
tmJD��	A��DD�ưf���ĺ������W
}YǬ9�v��'�%�����}UtN�j�#��@]Ҁ3�mH-�6��F��[�i\�.e
*<7�H���3?��1�c��K��f�)��n�QO�Vr�]�H��4C�B���_mS}���4EJ��3<`n^��-��=��H��
�sjSP��ħ!=IxfKz�*Xo9��/#����
�>c&O�٬���SK���%D��+�k�� �g�c��zϪ�o��W� �֛�=�:p���((^�=��7�b��q�X��T���7d��I��a�nA[�Vʋ�۪���`�;fO�[��4�H"�4�E�P���(��#�k��+m�0�STͶ�N�bJ��#��<<�l̪��o )fs_��a�<�$�}@
�&*�xo,�\�|�p&V%�B���D�ydp�t�,��Ŵ��|��>3lR�K��V'���
�����"�w��	�;8uꢸA�_g������X�.�~"mȇ���iw����11�*㽝H92%�K��C��K0�2~�
�H3�u�>.a�m}��r�ri�C'����Z������o�cKh`�
1e�EH�p��<��s$.<�x���͢�+@T��]X[h�;\�c�	#���m���j÷}5�)�M*��d�}_����Q�7��U;�����Un!�6e_��
��">�/��R�p��%ݨE,�>����k/�sU"б�b/N��Q�.h�Tzg'>�
 ���@���(����=`|�f����t�2��r��S>���VҰ�ٳ>"Z�FO�j�b��}���� R?(�,�atK/�<����+�o�_��=���q�.��/ɡ*Ft���Z?R[G����/f̷��$�d�rK�tR!S��5.�_�Y2XXw:/h2�y�]��Љ�8��G�\-MF���6��|�8���Pqf
k6��?�~hF��>0���%U�*�A!��q+kI� t�B���~o��b�W;�v6e5�|�$��M[��q皧ʥS]ܞt�v�q�Ta��▙_n��9��Ɋ�[�|�MY��O�]�<P�0N3��Y�
���8�	�ˆw�n1t���)�f-��H�Y�z���Q!���*��.lRl:�7=v����fw"(�&~s�~�M�|tM5���3����),�%�����A�G�ľS)6u��a���	+ҁZ �^|IK6���㩗���2=&&��f��1��SZOK9+�Vk�F4�U��`6%��;R���M���bL7F^�4���A4��/:�ö��ż"=d��ۉ�lL��p�f�ҙ7�Sx(�ev�����Y��n�ˆ��z)���.D��s��]aLjޖG�}V��RX�W�m�N�ƣ���<����4Lm��3(��W]pR�1�"��'�2[�Q,;��l�ԗ�B2�调y��<ʑ�����%�j�=AXS�<��'�q�o�Xb%!��"Z48�B	���V��7Z������46u���^:5v#�ĶE��aQK�0��L��,~,�6��]0Ĵ�Q�&�߽}�A�K*Z�2:��ڭL&�O���a\��&��԰4e#]e{�E5��e�^
�K��@�pWi��Ws�����h���ƞ�a7�#r��Kj�GY]�۰=Ԍx�,)B�+_Sy�Zt(��}�r��ClG�$`��fTQ�B�-��;s���N��Nژ.\a�4.�(

�[��J����)h
��(c����B�+;�����c�D�g*U�+
a�2Pa��S5u���͡zɣG���i��.���Ar�ʉr�2��=(�: |�\h��@�!�N�i�(h ��n[[�C��Y4u��JŮ���]�GT�[S�m���� �&��!��%�y6��0�E�a��=�����;X����"��jQ`��čo����?K�偕�JLF�v5�V�R�'�!ÊGܦ��ҧ}.F	�}ƍ\2��ia� 犎@�^�`�F�v�'�R���nOi�?��RW;l�kf��-����(�<}#������Üyr�	��	[���E��6xL8�Ð�c('�:}.�!r��$ΝAn<Ǧ�l�~�[O��gp/���p^�v�����E.���Xk+�$�F�/f���gс�E[�|���!6�PYW�hZ`;�s���%�d%s���줅��p�`��oW���6!{m�����$<�\H���N�s��_�lΞP����Z��_=�z����c�t�Y��Gj왮���wv����K(fK������g�Ӓ!k��`{��>�W�j�m���c-fu`�;P�ȿ"�6��Í��g�шj�n�3`2�����=ӧ7�rD�K�2L>	N��9��kx	G�`y-��
<���qT�1i|���<�h��/�o���
�q;Y+�:��H�kƑ�%�F��=8j��i�H��-�o�}��O�����нm��_rioP�0+R�,�S1��.��v���ćNBY��팘a��9wZ,g�F�Uܩ�M��?e�.0����#�ŶcF50�z[�|$fCܰHt���:��58� Dh9�j��\�нz�sc	1<݂��j� ;H��i�H���T����-�i��4�H�r�M��p��A�Tʖ35��v�u �S�xR7�¯���j�N�A|�.F$M5��#�u8e��+fa�=m���x�E&����Z���8��ƫ+���]e����P���(5&�zl�S�Dui�?��z��i
�@��h7��uq@�	5���%�b�(�ֈ�s����[v%D.��wѕ�����f�������ĴΩ!B@��r/�<������ࡶl�v;|���J��yg��N��߾A%�{+YpF��0��<p?�3�y��V�����4i�c�D��NG���I��	
^�o��@]�Q�C�]�r{��O����E��dm� �ȵoNpr ;^L�;e3���`]�sTIZer4i�mf��<>��A9m�'�`jGe�y9CL�˟R?O\����*|1p;V@�hU�C�*.��u�s8�R'f��0!�(�-?ҝE���-!X8-�)D�=��Ţ����4�?��2��f� ���M�i8j��=D�̍]��a���
�jh��ۍ֠�}.u��ZD����V��-m�<�ײn锠(�2x��P��2
���x.o�G�߹���N��}"4_��
�`\���8l�Omji�oK�����bD ��~߽#WNb�Z�5�H':���7�H�N�k��d�$M>��|�.�u�1RRYx/�ubf�n|bܸ�{��+ǟ�ny�?+̍�*u|l��w�,c'Ӕdo����ꫭ�׵�)�oZ]lV3Up��8�&�+� ��B�69z�0�.s"���Ȉ��o��7z�!�1;�w�''����\d$P�����T�r0_Y2PS�ܙ����>ho�j9W����H0}cP��`��bHW�1���b�;��wP۾�� j���#��O@(��q]��F@�7D�3�'b��דh�zb��V�T�m��5���P�?+׊,��ŇʼnN���X��g_!�s���*��ل�~H�^>Dڍ��L����T葒j%�qxfb�V�D��U����~ޟ3ڧ�?ΒcυVۦ����Yc2����%rޣ�W����~M�~k��f���3�|��	�+���5����u#Z��^(�ǡu`z��_�X�}��uD��.�����������樉��7N6��9�&��Rk33��޺���_gf�m�Q|\D�+��_E��Fy�h��y��1
/��r��+;^y9!ΟmlE��
'e�v��<!gߓQO2{J���T�ؤܓ�D1b��}��+ARL����a�0b.�9_�拀H�>���]�K��3�yO����ҭV�s��g,d�J�P�W9~��t(i�vg���-�z0۟��{}yj]���S���y�Tۣ�i۷�ˆ3�:���D`�Ld���4v�n�����c��
�Ӊ��*;C_�f`@�ݎ,^�@�+�\<�4S9
��k	
�3#���]sj!��u3`��m�o��"�U�˾��<y�����	����l��a1����p}�������)��+��M#+��8���]_�C�#뜘ɴ�q,�VL�1�Q]7m�݊��:��_�M�NH�h/s5��՚G�(��=�iL�����q���zp]�9&��
,P"{TM�E���
e�B���.�Y�>��p"�2�����!��$M�p�5�`�a@&�K-ɫ�G��ja���~�"2��1�Fs�N߻�/��I�Uo�7�+WXR�?u���G�:ᱍ�5�:�g��do�3�3�&��K��uNf"�+�@I�Y\��n��X���'-�	�4R9O�5&�U�5V��p�c��=4�:b�dl��[g�B��]�F�^��[33�`?��"�*^���P:g��^�����kJ�
����;����ɷ����{�뚁R��em��

ޤǷ,����\\��D�3�M��`\"z��_=�����G���awX��Gݱ+uU��R� գ/��Ͽ���3��4O�	�]>�n�^j<uS�:�b'?n�k��͌s��4�;�{ٍ��f<p6D
P|��=�z#��E��+aؘ�~o
X�t�	a2`�����7�����R`^\�7�1,Qz����,K
Pw*d���G���'W��v�3�w��ك��
��y��ނMt��MGį~�_̳�M.|��8��S/�kx2/6���#/Χ��N��xӼ_f(������R�V]�,s������g��'��i}�/y���u�7���mڀ�w#��l�0�L]�Q�n�eځg�qw�al�c��ү��]�A�#{*{�	�!�y)[�ְLRt��񎷇�"��4R q�D����_y�⎹�5���8��Yp���;*���7ً�cEy���	8!�%\��w?bv���36r\S����y�w���sߊ0�Ia�9�`����M2�h�B�n.Sb�KS�'���ڜ����o��Sъf��k�+��9�n���b��d�����o$����c=�s?�뭤z�.7��ɹ�w��w	�': %XhB�]j-���ɛ�u&�.����	
�PuK.�xo��$5�
���{������8'��_�ё�>f����X�}OgE+�Mš0���*���+��$v��4�r�i&9��O�GP�� ��5��l�T╊�������`O�Ht��|WG{t�웵�N2�¸E�o��汰�.šw��+�7���-Dzג�ln��m�"�ަ���J�^�,`�p(�u��3���6��b?����PK/WUW*pip/_internal/operations/build/__init__.pyPK/WUW�sy��/pip/_internal/operations/build/build_tracker.py�X�o�6~�_A�(&��=2�m�!h�i�=�BK��F"�J��������a������N�e��c�VN�\!W3�l���z��j�~�v�6�dn_	˚�W�gbų�+<�Ρ�
�����O���N���]9�/b�Y��b�E��,�W�JR	���R碰I!�]k��O�qO��:^��y�z)�kiD)��R���5N�U�KӅ�����~6#D�a'-4�F��,JS�K����l�Gm�Zr�!6�Ś�UΝH�zH�Ӵ9�^�ʶ\m�]2�̂�����/�U���r��q�
8�m���t�}��=�F�Bn����*g�2zZ&^Ei����(�)s�ի�@ Zx�y�.}z��j��� ��77P���+��a�O̔x�L��~�H�n�E���d����[��������e�r�؟��3�L�;2��D[��#7�Ry�V�����v),R(�6rC�mVB���S��jzІ1#G�>R�SQ���^�F�#[Xq�­�i}۩LD��P���*�����c���t�U-�<u`#�4��^��D��
D��?�J�}9�8M�.߾�xv9-�(�v@���N���q1�,s�&��[G��1~ͽP�� ����DwR�'s��&�b�T�mG��j��;!o���@xI.V�&��+�$/�"g��!�玽���ۘu6<RC�#/@(5���=�!�Y��b��yQ)��|ƹ�E�g2G�r�'G A?*����o����ʝ�w��3ekC�ȉ(���7,�J!_1�<d�YQ�)άpu�O����
�@
TFT܈<�z�$p��HK�T�?���v�t⣊��	;�?C�n��e�lV+�W�҆����vxh�x~��+K}{�V�\Y&ʕ�	V8V�2�k��9��5�Ț��ҥiD0���ڸH"I�n�'���n�t�O���9.�F��q5,C�>,�1�~
Ax��d�|�3R{�M �F����;���x8�R�Ɩ�RuM��;n�Y�ϛ��Hu ?=0�.z��S��
�U]EC )���(���;�_���M�8zK����v+M얿y�k=�\��0n�.�(�v;`	6�뒯Z���<n,��y���_Nդ��Q�o�:�X�Hh̗}���f��4��� �G���&C땜2��J��7�f��u���k��bxߕ��ω*�Ő.�j�
K"bZ	/�ecP��f`^�$�� ߍ֢�5�/���+����眼��h��CCWBE}~d�����"Q�	�raP	�.�����]�|b)�0z��%�D$`7\0��}�J|���y��{��ĝs���5W�R�<<�_0�� _�D�5��c�d4�V�d�#8���lfȽ��j̦�˰�@���O��Tnb6�����ɼv�׿�'S��ڦIN@
���s��"�'(��D/�Aw��%-y�|���~�G�_zKO4�����(���_,kF�gj;�P�Q��O�G�O��VTg�d����R�S���<���ږ��i9���pw�f�c��F��/4o4^�ɛ�}Lh��^35��n����˳�ٛ�����p��ݟ0��c�g�,rRY����'�n1���.����9��G;�����D�t^g��>�F)�V��;���T�0�Wy��Q~i���D�v=YC��PK/WUW~�K^�*pip/_internal/operations/build/metadata.py��Mo�0���w�
�v�ݺ�Æb��P,&fkK�$�Ϳ%�i�6�.�>��zH�(���A�5:�h̎:��L�CP䃣�w}#���Fk\��:3�%۴{�ʸ��3w؅�7�����D����=�����0�;�'�i94�x�E�_���=9�G��%#|�Цg�R���v�.�{�plz�qu:0C�zb�EҀ��K~���R���I�}�@�o��4y_��L�Ѷ��,���1<�B��97�j9�|���3<5l2���5(��V��\}�?�$�	>�@�]��I�x�R�=�����ۛ[x��C#��/��4�O��')5߯�ݥ�߆�F"�%��Z�Q��j>\԰̆/uhG���Z�qVb���q�X�|0f�hZ��
�4�!��R��
�{����>�ϙ�uh�{�`��mv��#5�<p��6@/��Ҝ�w\��OH��64P8�BOb��=����ܳ�I �&x�F��6��|LUy��&�q��ꤙ�eg��fe�TO$��\�#>/��昣Y�����V��� =`�y�����PZ�i��Y��O���\j~!S�5w��"�zq�J�PK/WUW�',�l�3pip/_internal/operations/build/metadata_editable.py}TKo�0��W�a6�z;� ;t��
Ŷ�![L�֖IN�?J��xm��^�G��(�����Z�V0��a�-8=�AH�����Vcr2�zЎ���i���Jhۘ���{�Z?88���r7� ����#�s}�<Z�Ǧ�-��J�V��jB�_S§M�1k�h�PΓ�ܟ�#�zt��Zm�(�I��p��Eͪ���k܂���Y�~�(��:#�e����0'�
i3�_�������˹����`��)�����j���� �<�%�Up�)6�2}�!���I��k?p%����T(@*������
���ϖ��\��P"�dsq���L�f�f�|�Jl�I"�*5�G�QP�v�HۿvƊ�1�&��C���oa��_�h��T�!�#�p��[�>4���h�}�`K�m2�8 �r�k�>x���꽇�ȶ>��%1�5�9��Q�c���A�>�G�YR�oTm�H���E�C�ϙ,��o��ƪXT�唘M���O�<(�VmVF�=��
�H��>�2C�Amv�</�j���[����Y.^�#�!���j��^A3���BS5ds��Z�\�b��?PK/WUW2�.2�1pip/_internal/operations/build/metadata_legacy.py�UM��0��WXF+%R7�k�p@�	ny�x�5�ؑ��3vl'���\�L��͛1��8.���;�t/[�iC�y{$VϦ"�uFf�d�RZr��q>���O��Eg�H&9�L*F�>�r�O�^y��S�FP�RP;��NR!<����E����`��� ��S��a�|c�6�3�0݂�����L�
��]Q]*�
�����i=X������O�{�4㦷���R�1��p��qbB���_K���X�y`H��X���[ɘ�#0VE!�#��JdĥHI��Q�����<nЙpEj����"��_��ד�Y_�"�o]�a�}��T F�u+"ѣ%�/��J�K��{ҡ��nͺ����¹&ʎ~��+�N�x ��'��*��e.S����ӵ�C��6@�R�<�/�����
9[ePe&07qwW��R�޻��oϿ��=l��_ ��ݟ
�2"A�l:2_)�!��������H�=9�,6��P���LKq�$\d��եn=�܂�,�ӡW�4J;�
)>*,���bM�Y�S��^F�p���W��Զ8)é���i6�n'���ȕ��}��j��_�y5��mN綼��j(�u���>�Žl�
+�櫙�
�_R�%��]B�SX������4�-�j�ɾI?9�ٍ�rl�ow|I?���疕���V�[}�'#�p7�����,�Q�����D��=b`[l����Ś�(����I��>w�N,�m��-���㜋e1=t��Q�,����&�\z�,NX����.��������PK/WUW��e�3'pip/_internal/operations/build/wheel.py}RMk�0��W��
[A���Ҥ�P��k)Bk��JdI���.�����u��FiF�f޼5:�	�e��i���.z��w�����O���t�swt�>aKbo�s8#n&���>Ǩ��������9�DJ�]L�b�S����h/Bd��1��K����?��f_-��#
�0�:�a����Q����5�xR��M6w��?�KЈ$;IRt�Ǟ�?.2��;�
��0�=�~lsLUU9?X�������Ӎh��d�=���D��>���,gyD��	�$�,��@��6����nj$�1�?���'ܷX����[��Q�u�KR��=�G:e���4��-RF��a!�U�6E����2�8�W�\����E��O鷷��)��z^CNv�M5#���*���X7Q��j�5�֤���X�K��lV�k�%�0��-:��|EaWڣ����'�4ve[.%��^�({�2ӓmOş�2uid�@�PK/WUWק��>�0pip/_internal/operations/build/wheel_editable.py}TMo�0��W��"���z�a����&ʵ�,816�M������`	h}�=o�y �AR��P-i�-i���)z?8��$b��U�
���OX9�i�lOף��5����O��K�f��6�\�	��ttBZj�ңVhg<3*������M��y��h��D����XΘ�=2VBjl�}�C�(���RbN��po֙]ܖ������K=:^s�Y-��@���a?�Ӿ�wf��Џ}��eY��>+�<�#�=\����!<�=���D&u(�(��F�,�u�4Dz �c�5��ǘ�(�{4sw`��o�:=���Z������)���_�J��5�c�g�h�P<���@6�%q
2g����g�|;�&)�9
m�w��gcR�{Ydsr1��"�A/<�Ryz���g|g��P�38&�����2�6���_�C���,��*���\3�&��h��jv�U�|2�,���+>Z�6M��6¤���:���<J�}d�Ra�O6��*�l�j�I�����\�7��}�Bb�(�l]{���δז��>i��4�a
�PK/WUWGL� �.pip/_internal/operations/build/wheel_legacy.py�VM��6��W�*
H�Vh��C��^
Т��B���̆"�Z�X��w�!���nP�>Xg8�y��t��Ԅ�a�|H�{��}Hz)F�O��7=R��i�T�%�e�SYS�A�Z�2Z*��A�e����~�֞YS�Jz��L���n�=6_��fQ�n�%⼟�hA���
c��\�^ȱ�u+Ʊᝋ�@@�jA�@?ڵ��y3B]�I�t�_f����'����=)-���(f=�zG�R$9�{o~�K��6��L(w�!���5=�v�Z�FmY���M�j��OA�<ט�k���B{…����ֈ�*�F\��]pp��f�}�C��<��,'���>����4+ ww/ �iA�A���l1n�_�ԑ�C�b���}�-{��2��2��5�z�J���v�'�P3�����	n���dxw�#
�TwTz-�����"r�������l~�\���Ť$d#O�����
yZy�#�ӈ�P�T�H9Uc���|T�]f_�u��Q
蝥�;��}J��䙴��HO��4�t
���Q�wW����,.��Bxfɑ�F�l��F��p_)2����".~o���؋C�	�d�.C��P���ڃ�\�=�J�s�aU��-�#d�T�T*��g�}"O??/�q�'��(�8����W�.f�…�&�
��Uĵ�ܑ߲�T�����u;5�i�`ͣp���(+u���~��''M���k�'jn�[?3�X�K�	��#U�J�B�K:���X$�[Sx#i�m�.�(V����YEo��#M���W�ٙ=k̿�����f� �R�If.�S���!�e��`9i��%{;��C�~���n��I���O��-�(���.��ķ@ܟ���*�N���,���y鍽Ǯڄpm��W�;l���-L���B��7����q肔B�y��Q��,}h��A�FZ`�K�|�nZ�Y��'A�3ߒV+���ŭ�w�rW�$
7�=�rxcV��r|�V\
�-��PK/WUW��{53,pip/_internal/operations/install/__init__.pySRRr�/R��O)�I-V(J�I,IMQ(�W��+.I����KW(HL�NLO-��RRR�PK/WUW^��3pip/_internal/operations/install/editable_legacy.py}T]�� }�W�Mf�`b���v���M�2rU�ȥ�����k��]E�=�"�̲�	Z^���J�<W�{���58�SY@A_��f�Πм$�2"{��S�m+uK�=��	�tN�0�W9��5�	f�)��l��A*�@���/1�U��E݃���/�+�ŗB�E��}�$��#*���Km�_�]$��2n[�A��4����l�,����S�ӼƎ�͢[d9�OyZ�'�&R]�r��y�g���W��_�:��nbp��m��> Na�S"~ZIp�&j��Ά�K��6 .KWE�-�E��+�p�50!-��87>����5�	�m��r+y-�ٷG����A�!.���s���8�]j�n"K�4NBR7x�~ZGg]��6h����O.VF��?��$�
����[�L�V���m���&TӰ���U|l����n6��ݽI�]�ñ\[�Ԧ����A8�k�M�ƾ�Z�\]ef�]�#]��ݩ{ջ��Ï�?PK/WUW���>� Ak)pip/_internal/operations/install/wheel.py�=ks�F��+&��L(�v��7ʞc+Y�Ə��Mv�C (�q9���5/���ګcU,�����t��L�(:��u�tjU5*/�.+���TY�T�m^,�G��*�Yk]Dj��Y�Su���.5v�d]rE�A�!P��(�˫�u�6u^h�~���>i��W��+��K���ڤκ���h�]o�܎��,7YS��`�T5�Z��Fm���V:�?�B��j����dy�lt�"��)��y�����ּ]�����U^��UV�z������{t�*�����S�{��'�㿜<����ѣr�_�!������ټ��I���w��M�U
�<$\3�e�}���陾9����y�b�
�u��G��%=η�����u�!�	�[^,������)~9-W����:I�u���d	���v��ug9zF?�fW���en:\�.�o�k�ˮ�
{�����]VVe�Ȋ�7���F�H栬
�%�o�xd������I�T�X��ZdA/Ds��R5�&/��kݴ�~��Fw�2�Pk�~�7�|�Y! �A�;���+?ıh��ˠ�dt4���60�S�f�'�/O���^~�>=9�����٣�'SP@l��)n��.�zc����I�ד��MA�j�/�'YY�L�l�K��ݦNW�X��x��&oN�u�m�2m�e��J�-��4S��ڵ���˻=ba���i0�ۦA����b)�mz�w�L��U#s�%��l�J8r�U�R��mJ�K�b�B��vnB�K�m�<|7*VƖ��`
Ե�L�*�?3b�f�h���tYے���ń�e�"R�f������%�z?"�j��Nރv��`K�K���yeF��+�f�:nu���ïճ��nL�Ԁ��.�Q�f�H`"|O��fx�NJ�R�a�#�&���<���g{Y�@c���%5��M����ׯD�ѨY�%t��`�Z073Xy;x_}��zp��b���0��ʾԠ���y�Z�2]�����e���:�c�m�R�1ɬ��xOp�FHk���O�yxM�)��"r�φkf�N�a<�$KM�"���h�4hw�8:�f#T��u,L�_��y�^��}��8
�m�\�7�Bxs�w7 �����*U7U��b��O�2R�uZ��,�ǹ�a�P8Tb@�ؾ��U4�S��|%|��D��9��v��/�wB�*����Ot�j{ؓ	Sw>�wݺ*��u�}���Ss��قM]!��f҄��Q?������nvQ�R�%�f�ն�%F/�=�휬$o�nLxb�GQ���G覘H7Wy�+t�A{�]��l�O�m�U�'�2u-��#ÎhNrʷ�e�`qb�p�6qV1%ŧ`ܒb�Z;�5���n�l�w��
�(ky9
��b�v���=���7
���3���
�BT����:\&jX��ƥ�����4C��I �����*3��n��N�1؇ƍd`����+0nm���l�x���i�wS��IQC[�i��c���8�|�m!�8�����{�ƞn�6z��˦��D]o�(T���j�k@�v�[Oo���z�����|�p"��S��PB�4���dޥ0UӪL_<:�K,�f6R@��&��H�"X��h`��Л�;ed�5���=�L�'ǖ`�%xK<�׺�ʆh+�}S�=��y���77y��}��#C�7��s��@�w$&3�|G�-��e�`jhU����x�la����y�!���Eщ8�Kh~�Lv�n�8�*�����>(��5�_���ٷ)��O�C�=B:.�p��l��=xï�ZV�]��a>�҃2dJ�)�aq��(v`���Ń���q���+RCu�?�/q>�>���Y{L| ��.��*����b�ں�;�~-D��*+�ب6�Z���*4����y����sX�+�I��U��%׀�
#:�JAC~�^gi������Eg��R2��R�5�٧�oGTrf�5�{?��
Dj��M:�'ȁ�Lh~܀I�o,]���o��3D�7�eJ^���1���#ьe��|�0V5�S7�Zt1�]�
�.uv���~�����b6��|jK(D�Q�6����k7D����Z�[�A��TK~�Ū?���>,)���t�z
�}m�E+���!�a� ���Vw߾�nS�X��#ُ��x�ɸ�T=��;�-]m�Qj�fx����(�l@L%��hvWm!��+h������h={Y!�juxXV���wh�RI��e�˸��8�a8��6���u�A���M&ߣ%�y($�P�1Y(b��T���9��؞�Z��{��-
�B�2ёN?SO
������L��J2���(,y1���D-!B��穧��y��H�!��oj�J��ఀ�+`��ʒD����+��j����6��R�VR�i�S)3�i���)�oJ�.SX��e6ɏ�Mr_��3��䇒��)ADN�33��@��f&nF�'90��
�l�_�%�* X�;2"8�&Q/
����-�ʛ�9@k6�����E��T�|�VF=1���~~�!MJI��,�ِ�\T�2m]�KJ~d��p@G�>U
\J�^��P���!���_<��x��nE;I�t�0�`��	��ږ�N�"�IuT8�3����`�����'�(כ��ɋ~�U�h��*�����(�#�j�)�)�����GA'�7�N�0��Bs����E��jc]���1ҳ8�Q���Mc ��$�n`j`�/�P`�_�;NdV���������B�}��U�
��x���D_�T14p
39�M@-%���
�,��� ����d��E��JJnz�.qK�~]�h�1gJ{��a�%�U�7��q@����
�r	���4[w]�Ύ�.��m�	�����Q��Gy�nu{�/~�[q����l�d�9�H3����MPW�ڳU.&H:tU�j�[��o��ŷ��
2*�+%k'��>JvTF����8��p�y�~��%P�fE�
�ӽј���8��U�bչ.*��2_�c��F�%�a��5+���V�e�8C���i&�-���RҦ�ji�d�Z#M��N���1,�Ga�w({�}�嘱¤3j���-�%�X��[W����	���Kc�������%���{;
���/r�pX�������,C5o�d�b�!�'0*Ә-��K��>��H��-ge��~�'�k�yc��N"H�1'&5/�p�i`y3~����#P���D���PS�G������ҟ�U��N�����0\SD;���S6�FlT��<�Env�����'���CE�{�p�>�}��jb�!���-��ZQF�N�����+�t�����0�=14aGX]�*���FT�e8a$�i��&��7`AZ7mk�hcy8��ԝ�r��;��m#A��\c3���`$��PO."̷k����Q�Sߵ{B��fہL	�n��TE�P��7��],���N��j���g0hk9��Q����5�!���
��M�B����!�#�S��Ew�n�_ �l��ƱV�d��:l��u����ŷI�#�6ш,�]�f�:D��?Rb��	�Q��<�ܽS�k�t�H�7[�-�<P��p�"�ȕ�r[�RID�7U�� m��K�`@*�2���*>5�Jp$��lj�'�?���2A�[�5��*�H�m�$@]��g�"�ۛQ�k�QQ�6؂o���c0Us�}C�i�wD쩁� ��"�!R��F���a&ˬ����L��1ƁQ�
����0�j'���[�ͮ�m�eE�����L}�A��l1�q	�$���E��&oZ���@ۢ��j�R.�1��:o�m��ڋ��4´�
��:��L�)��K�d�%�����L�7�RK�|��&�#j+k���U�1�%��\�!BkK1
C�#�#����1f� �0[
�lYC�dC��w��
Гj0m(y@�B`9fwcpQUW4��Q���gg�^��8}�>q~�����?+�~m\8p�59i���RMU�#3�M�&o�
�y����&
�s�����d��;��Cc/�_@��{Gţ��q��%�Ye�~Ȃ�+�%[���4��I�cȭ��?ON�}��s�\�d�P��W�z.=RgH4��zc���e���e�}#x���L�kx�р��lθ�ko{a����=p��x�vǭABw8>;b����Q�k&o�QQ��Nٵ�L`몂�b`���e�����4�n�w^�
hxk���9�{�I�m,�̾`Bv�h9��%@�b7�X������y��_Mܦ���@{1�.܋+���
��Uq���S'��D9G0�0)���`Z�ul��{uc:�OO��nU���Q�	�dE
�|�V��C�,Q/V.kD�zCߪnb��<�O�<���{�֍��$�M���qԓ��j�l�-/���� ��q���߀���X���QFHλ4u����a����
ks�Ts�{3S�ϩ�a.�Nz�q�:|6��AC�=l�������	���@G?�?�ZW8,����H�߯O����(���-Iѝ8E�ێ�l�"����<��zSpC���(����K�~�O�wL�����.t�����P*^�Ȗ�U�X?�	�JŶ8�mWo;�3�7S��
�%�]�"&pQ�m����l�W�N{�
�M�K�o�(�A��q'�*̰���<@�OÁnp����d_���U��ا]�>6�C8�b$��wHf��k���k��?|�`l������m�0xP߀9��N�S�ɱ����6sp�1'ԱKJ;�}���,���p+�.wp��S���*`':� jd@����g+t�˭6�ɻ�M�z�4��3 ��}�
�p�g+���f0Cqb�Y�k&�ׄ���L��җ�oW�ȮH7�+��ga'���3JK�@ S�<.�:�g��
�Rϳ���!C���g���
��m��M�Ϫ�;��#��v��o��>{V��6�6죂�&�`z��8�4o1�c��mW�)����W��6�z�nk�K��6~���:+�I�z����#���׃��.�F����	���+�����q�}R5�G}&�I5#G4�!{BGw���>4��T�����C%H�m�8�L�^l��Z6�~��<�c+3�xpF0���j.E`�ca|�8�R#��nDS�Ӥy�q����`��m;�C;s���A�}��E��H�?�c��{N���p��"gEip�:t:d[��0����;�T�l<E8�ӄ���ɹc>D�G�����Y�Kb
�F��s�W�a�T|�_�`+̙5c�d���IEb*LnUJ|d�����W��Yv�?p	���'�Y4�8�9�t�/ȆIg�7<���a�&"Y?˸�^�HO9�^3#ϸFd�r@�'���:�R�"�V��)o�'B�))�Č��Ӈ���p��4��	4*kP������@�0�
%U�8o^jCy4�9-�\�}�K:���֧\J�Lp ��+QQ�%�K�!����|�-�J�ÿy�c=�t6���#�헕f3F�s/>u���R��ɱJ4��6U^U��SF�G#۰t8
�,��l����aSXY�������4�[${Xm�m������5F�|�զ���M�Ö��$����.�wo�9��|��xz�2�̥�
8<I��/�M�	`�%)�ԇ��#Q��N����)�=�vS�4+yr�2�͂��~���bn+�JBC�/���4�NJT�=U*�2���`���H����BCN0ߩ�$>�9���a���2�����^u��Y�D~d���\�I*r���fZV4���w͈B;�H�i��#�!�� ���b����Y�
g�}o?i�Q�q2�~��!��&�;����l�1�uE0a�0���u�*d?�9!�23|���A[Ɇ���
�~l&��;"O�2�EP?&���'2������3�P�X��mx78d3Z���/(�\R�6�w�B{�ɞPy��а6ԋ�
�� ݜc��!�m)��K�xA�hl���_��Ù��"Wv}�;�t���6�u�O��N��&QRä�9�۹��
�_p��p��E�
��hV���8�'zUB��1���A˷�fdV��I�r��:Z)�e
���%�6W�w��(���+$����d���.~�7������4κb�NN���W���t�*]wT���j2$�wUV7�r���	𝊩�Ь5�>�
��+��s�+	x,r�3e28�����ݟ$�e0�_U���ۓP8Q?Є��{-y�Ѕ����q���76U����yh�V^�zkJ�ɻ,�
����}*ԑV�ۻa,��H.h��=��>�-x|�Q<…�7�0�(R��G�Ō�oM����Jv�ָ::�tHP�J��׏�aM��B|0HntmG�gh���J��稰���T��Áq�
�t���q^��#�e��[�F�㉍_N�hs�ꉬk:B�'}�xa^L��#�'n�������Ò�f3���<s�ݓ�Y���6�S�c*l�&�KO�g��r��{�I���U*}<�{	��:y1���>i��ɰc�p�]x��~r��4茇?]��7����~�w9��D<5�{���/򡔔�?��/�CA7�������}P��},��s���N/K���r�Љ�#�]�4��T�砀~%|0���������G�ꏌ3\��j�+�|?D���\��}Ԧ������%c�_[5�$$��65��y#�%�Y�z�H�j�,��sc���O޷�����o�"}���m&��zb�{ˠ�����a4�rʬ��[&aN;�Ҍ36�O|(g|DvR��t��tot�T�킭�RϷ~����Ê\^�ֶ��O�2,i�	st��s'p�)�Io���E��`�9�6�Wɞ�.R�>�H��b��Ѐ���^��\C3/TU���C
���]��_���:
��H�"5y�љ� UkNQ�K�.��`�������HwG=�� ̕�]3���"�V��#�W�&�Ł"��=�1_�F�GJF�À)�es9Bp��mo����M��V�h��kq3m�x��O�]P�αws"_�Ka��>��O��6�}"",��c����3�A��ӻ}Pj�������)ν���;,c��4��g�������
�`��V2�1�V!���'�C��c�
^/d���	$�䄋�8����UA�9�t���ȿ��{�dQT�9a�W���E{�+�4I)U"�"59Idwe��代J�w� 9x7��;����}�w���JwT�B�˭�L���8�����Q��P`�
M��E�]#'P��^kI�w���h޵���|��>��z<-X�u��W��J�9�3m�������g�دz�.ro`��
���-35V�
���l�콐�#�c��!u
:��I����/+Hp�8]��o�݀I���0�z��]��`sR�5�^���C�_��~kSp���N�D�n�hh�3ay�ٌ��S��w��J=G��~?�
s6�'��k�X��x?���H�W�}��q��x�0���]L9�-�#7��N��:�s�ڻ����������?yy��B$�G��#
��ճs<��S�g�W��щ�UC�ߓ�z��{Eך�e�f��wя)�{�!|�w��$ԧ�zcp�{�����/�4C�K��o�5�|i���1�g���<��W'g�'O�ۭW^i����胔ɂ�z|�B��J��ɾ���=�—Z�E�~.��T���{�u�kd�Y���|# �z�1�p
w{�E0����)�<�߼l"'���tȌc�ͽcql��������c��x-��#ja�^����~��݀
��V��o�
�,��;rЩ���s�4�������(�mv������E4���jG�r9�Ud��O���F����2�Ơԅ�|�`M}��Iʍ��O7vg�CU����\V�kJ��2TV���-�nQ��`;��:�%����?d�9��_���[�~�=��?a�Cm�t�\��F�VD��?�&�
�k����*�&��;�t^<��Cr�o=��zӳ�c���~Ln�0wav����>�H4c�������б�62Ԉ����:����fVr�[�hr�PK/WUW������
pip/_internal/req/__init__.py�Vۊ�8}�W(^l��H���
�P��n%j�#�=iB�}K�d˱����Eu���u�_�-i��Z���t$���9뵺{��;���U�"��؊��*��#�*�id�����riA#�-���M.;���iЩ5<Ӟ���iOG��`��4�	�O�p�5`#.|�e����!O�+_�j:ݚ��-�(	��@:�����4z	��`�YA�dW��̲�̘s�f��w��I��€�+�T�X]����?J�u�C��n�#K�ht0�5�¢���Z�>�)����l���^�H�[�1�;fי)���rr��M��<���|{=!�j����<ݏ�^i�m�r�
��(�+��KO�X�p��PA�R�
��糙;�%V�-da��-{��U~���e"@�R�*�d"�(�;�ACϿ�^��Դ�n6[_�9)%&��ݎ�n!�V]�x����N(Q�Oi7�w{�[B{�SGZ���-�"' �T��!vs*�z�B�Νˎ�r`��pv�+;�)W~���H�����@C�����I/�e9��}bri�i�k.{U̇�^q�{��ȟq��
��ϊ�b�S��)�rAF6s��v;Ng/�^��[��0/t�������~5�b�<Ѩ�E��Ämr�����E�؋��QF�̨�X�E(�5���^�?�fEvFl�8[%{���'=������}ne+���r�#��
c��]�[����:h�m_<-�fz�C��C�w�������'��Ni�-�}ma���ݵ���5�}��^*K�ض���	Х���h��n,������l�Ԗ?�v�֑Q�͸��h�_��Hbu����g\͆dW��<�_�j�/PK/WUWE�aġTJ!pip/_internal/req/constructors.py��s۶�w��Nd"3i��vکk�47ߵk�ɶl��DHbL,A��|���@$%+�u�M��"	<<���A�)]�����{^6i���mDͮJ٤E����kz6��.�s�J��n׍��d�~�Y���x
�$kvi?��j�3��}���wmy��f���'R��^�!Zb��2c��*Q7�n�YƳ|�6�j�h	 \Zz]�RNv��՚�XI{Z��5kˌװ|����ț=H��QP8���`)ll�Ӳ�5W��������%��
��%Y�[,װ��L���'AL&@z���`�b���K!ͷ�O6�س�Pi���W�(�7c��u3c_�~~[ὴ��w.߷���k	7'
�'w��DW 
).���c�C��&�vSݬ��.-����9��Ɋ��M����q��K�%l/�?�9m�Y��M�U]�zl��[�8a��L|{x{�)�o'f9����5|?1$�f���bl0��'���6i
b6N���\�G�'&�M� R��_.��^��;N�����ڙ�qHWO�|��j^�l3y˛�>׶.:4���%�H��؄���!4cpk2I�1I؂]O|�vB�8	�7̎�w+�;e9����YU�a_ӽ0I�tϓ$����)ZP�Ix�t��[~�a4�L2�a	ܼJ��M���>gp+b��+վ�+��x�\�	�=,Ps��f���a�<
o���q�\>�YF�fDˈF�`�_D��N�a{	?D�R$ݸ}��E[��Fݘ���4l��' �	=�y��eo�L��'t��ƐD��� ����M)
�"�W��	#��d�AU�k����=�p�B�s�(�PL�?��
��̳�%�O����3J!�^G�Ip�0�9��U��	�8��-hq	`��K�=t�E�L!Ϯ��X5���ϲ��4����N��D����B�ZT|'Z�G�(��Ab�
$���$X��-
%��.�U�횦��/*^�U9^e,�-^_����߿�X�m~���=�6�� ����iX|������a�,��@9�;�"�� ��WWW꾒��k���P��z�B�[�;r'�£�>=HE
E,)A���.=B�(��fF3�	$5@��{��G�I��g3X��K�,~��U�{ʃ��P}���lN�u4��JE�f�!�S�"��j�P��Swh�P���O�2`��`�D^�\�B��QD��]��bZn�}p�3����5��7��;��|I���ܣe7Vaٙ�@�Jf`y�G(�}�at��r���}��p4W�0klѣ/�{qO��*��稢���"��/j~w����!Vi}�J����lW/p�'`��u��_K���Zv���o���heÖ2��Е����2S��x����_�E|�`9�!èhb�����Ź�
��h�X���(PVV��4���8���oѨ�M7߃����zkv�y��ϊ!������<�\'�����`�=nBX�n)r3�`���u�&�n�י
��L<�iNڇ�D/^��`���9�44RF�!Jijqy���ܥ�X���G�#V�GF>�G��7x�t�0���r�J�_|2�xx�`ϐ���A��-%��1 � �{.-��49ȿ|vڮ�>�o��5�YЃq�Kρj�{�@j9x
��:-��`Wp$e{���T������d̦�؎���)m������)x��@� |Y7�Mb6}x�B�^p���m;`���c@�"�{m���1i���H���S�ɽ
��LA�XK?��KJ$C�A����Ρ���H;�Kr�$	h=CCbő���ߎ�wyq����W�[@D–��2z`����J�T�U0�@�>���~�#О�R�(�ݬ?'�ʑ��\G����:-��+�b���yJ^�/d&fB�Xv�T���m6��]�(Tr��R�<���u?�T�*f�":�J>g������\���˖$V;GmS8�_~�f ��k��!Q�hyO6�7	d��`��M��������7�`������Q��q�`�!�a���	\�.I��!�E��`R4,q��]f
C"eA��\mm��Y���e%%H*�N��8��Q����(��H�JpPZZG(��S����{����-;�='��I�~A�3�
�q��TYm42��k�`�4#��m���&�ՃF���
���:�NJ(�"tO��U�����K@zZ�m�	�h
J�AUa�7cJ�ʴ���1�p�����h���9���N�8qzmlf�(���8�����t�Tmu̲Y���V��U�
�W��
��'r�Vg�X'��m!��m�&@����%���]�3��D�4����?l�LJ��Fu0�`
�+��V��zJu\ASb%��~�R�7^t��P����$�E��hE�%�W�$�%�ɛ�#|�#�RJ�Ҏ�0����T���+���tQd���
��c+��0��/���M,J��.�p����G2�qz;����k�:-Ne�N��!�S鰔�TS3��`1ײ"L����#�'���\5���<N�1u�:����/���,��M��i1������i!�w����H�h���j�R�ӕ�����;��^���B��M���!�x��O�Y	Q��s)
la�>�GoR��z�-�*-]f�R6�Õ12��@����i�\�;�S)P�z�#(5���HXh�o��Վq$���Z�I7����ĩS�Ӛ����S�D��ɲ�Ί��~��=�-�+�bj����)y��u1~�7��1i������~�P���_�c#���>��t�_�a�x.�EW>�뾓��t�8]���V&E~[�*�MM?۔I�j�@l[nY@PB	LMA�S0R�H��n���s*sAB��卶]���0q���C�m&��u�E�-xn@/`B^0y�HZ�e�c��ꁫ�j����ct&�oD�c��&&��!�˴h�N�N&g�._��5�Ptf��kt�]1���qj���@�ʈRJT��x�Π�|D��q0�ػ	����2,7b����Y׏�1_�J��{���/���nM��p��n�KAk�kNr���:��(�A2�6]0#4t��W�N([�-�\�]���.xӖ��Q����^��3���}A��ϋ��c�ݨ��~����7/�L�5!�̰��'Z��yb�*���J����A�,��v�7��g߾�vN��d
/�$~�ow
�Yh��\ʴ>8pԧ��F�$�z��5�fIuеM@ed�&�g�a_1b��J��1��6S0�mW�i��Xb%�C(F���P2�5����)�A�,<1a�5p�1���o܄���~�aV�2tG�����>
�{�r�5w���J
�]ɦ_L	�zR#�7�:��!��W�V|���z;�3�<�f�Qj�>��i�"p� �IͬԚ���U�t��W�p�涑ӫ �94��a��:o�x��cG<Ɠ6�ظY��@�c�c��?hq�U"�1��q�����NM�dt@�ɜЉ�]ϟ5�g�o��B���˦͝7�T	~8<Z�����k-��`w��ғE��`Q��b��_Ik�#7��@��q��,�)�ͧ{'�fc��G�,_T�n,RP��A<Z��gS�����\��3f��8
��:�5��*��݂�`8����To�-@��d�]0nh��:��o��J��\^toW��0�#jF��Z�AJ:���8KO}Ԅ�:t��#FMlnOI��F�Wd<�o��Smd��W���_�*��}�}���햙bL����(T�W�[z�(�ZqLA1���%�MG+kc�v/�t��E�#��%����8��FO�&�����\����q#]�w�
2Na,PC}'��ۏ,������:$�e�mt�^x����S�@~t!o�M�(z��fY��W���	Jpt��ő6��JF���Xu���S b�
�֩���Xo�H��������k��^�e��1�m���=�pu��#�o{t���^d����&�)�Lu�=�w��X#O�s�`�1�Ƿ+���|ežɟC�������z@�&�kŁ݋mu`�z
Y-�P�%���{�H�}#��L��?lm��#T�P�L��j���lH�]j��o!���u����e4\4��r��j�|�ʥ�v'l�`@=NG��l�k؝�}U
BNv#�0�������DaѱR?e
]�y^y�ҋa����<��<���k�X���p�c�zU>Mu�ʒ���}_�t��MW;3Y9
�-m̜DL��  �x�O�/K}Bp�B��:_�Y2*���R�M$�tE� ª��"2�Ć�����#��.a�r�s��v�VU��(�͋���
O�N�v#�3�:j�[ڥ�N�y �X���ҙ��=8��^H|<����q�G7����V��cu.߇{���a���)u�����j��ye��K�ؤ��<_�܎�C#��7��8fd_J�܊�W?/�9jY.i�Un�P:�t���tz���IFx�J���R�&�3��J�ìd�1ң����A�רC�Ć��7��QÕ8��S�����~=׀b�r�d��mOXşnK�7OɌ����L�3�B��g�U,��y�=qj�|`�����>&g�^Sɸ!��#=!fgɒ��y^R��X�"@��R�	�B���U:,� |�7����]/G3��(z���?�hz��H�4��=<F�Ȩ�O-�qB鄤�p��/���̀����	����M�t;�B����]���>����sF�1����s��ǃt�q*F��ueX���i�Y!;�</n�9�p_��F��x��Ԥ���~wy+���Fn��J��N��
�WHM��7�-��x�V��u	$Dc�i	�����@Sz�ƴ���w:�L)�-ͱW�;YV/��q_��N��ڒ�Q��H�ϵ���|cl���F��?�����E�r�☲a6�VK�
ڎ��lb�9w��>o~�Jڿ��qGWYrG3==��$u�2u��}9����[�T�d����6�Xщ���ɶh�/Vb�A�9�I��gJ�[�����XkY�|Z%�E�V�Z�T��Q��_PK/WUWn���\�Epip/_internal/req/req_file.py�<kw�ƕ�+�P�c�� ���L�=�#��C�Դ]Y�!r("�H�q��>�	e9��E���}�}�p:�N���E+�e�)�.J)��UEu5�B�n�e}u�e��n:l%�2�Z[�6��`^��,�˔;���!t��򲗊�m���d"�9���Q��G��Տs*zZm�˳�,��R��Ų�o?�J�yW��z��m��P���+�*/��o��l�ki�&͊
�B�tYfY��UMU�����\k�W��ub�Q�¢����D�ņ��W�T��y��djY7y�Tv�E����n�=tU
f7�N��K���wEi�h�B�l]��QЩC*�e��]��$F�ȝ�M�TW�������!,�Z{�U�Fv}PU][���\�W�M����z0(��r+`��\R�������9�x�.��� �eQ�V��F��J� �r#nd����Z�l�MM�Q���N\���Z� �� _[K#.}N��I�e�8�S���xhz1AyFVzQTRA3������0�\�����؄8��vF��ϱv�R���Z2��)��Q��:�2E,�TI;�{�����~A%2[L���x6y���ˣWg�^��y�����j
�'^"vaٲ�)ںB��M���}�mA9��b������o�OO�?���Q���&T��0��&���
�qG�Ɉ����2T����bU\��G6R<��8I��ak�,g��d]����F'�O��
ͫUޮ�J��������i��>�&}4��?|�8Z���ѫ�p�1����`�߽���G�� |w�t���?�.����4C|���������'gǯ_�.H��[R�i:�z6e-wq��C��s J�|X#?tm��j�U ʡ+0��<;�䴴W����E�~�VqYTy�� �w�5�\�vW�^d���d��k{�&��fk�*{�J�fk	�;_ ��Z�C���*�/>�Ɣ��ӯ��UY_�e�_GE�c�\W�Y)Rz�$'+���TP�X>�+�~8:=�AۤNf)���R�Qd��`4>HIi+$����%Y�‘e �e	���V���H�ȀU�.�ؠ�G�r=�o���)Tf�r!.�tU �Re��}��h�.��q�&+[�i�h��J���2Su�.��5u�t&����E�/o�k�[�̃�yoa31�r/a#�ׇ��94�y	yP#��ۀظ�ݟʸ=!�ȅ�W��W��Wj���"�?G�]�0K���1�U����j5^�T��k�������e���!��RE�ᄶ�,a	�p��i����bUW�������
�kľ#�IB��@|��ƒG����L�?�fsj�/����,��n�V��
���8
��X��mB�vA�!/���O��l��󑪝�(��N$5y����	V���\��6�!ZUK�R��,8����I��y��%�u�	R��E&�����4�`z�u�-w����-�	��1�M�o�cY���9�{�<a&\�7-Ӽ�mX>���'i��X��Oy%	�8���Q�#m���?�L�3u���6���s=;��!�܃h�dFwH`v�mUJ'	�ʛ`n�yh�M�C��B�O;��׃޼`�Wu7��0k��F�[ٴ5p�J��X$��e�7�Yv�>�k�����e6�Î%l2`��.����#F��ʪe�b!�%
(���R�d��b�v��f�q�'B�q;WiW\U�;e`'�������6��&3ܸ�ƕ+�t������$����/֌D��������PֆQw`�`�20��?	�G0—�4���α�t9E����[T��Є��Š�
	m�0_����=�w,�7��ƯtO<H�xt�v�񂫽3;���V���{2�E��c���f#��z��zH�x���갥��သ�v�V���*)�"�PS��7��ț�܎<C�̙�?9k��n�N����P��MZ9�?Y�'%�H]��ϱ�E8�`a�D��ޓ�e�忞�xx��	5�ǀ�?M��1>f���6�0u�}�Y,Ў<���L�9G�����lsg�
�۴�c��Lj<Ho��*��)�p����}�-.�,�?x��-��4����iH���u���KX�$C�u	۱������|˅��S���?&,
��S��"w��C[a�PV�d$�kR@kT%��q�5�_�":z0���pI��01�̜��o��p����
L��k��l3�t����
��0k�����j�Yoԑ',�b4��'.Ed��w�v�:���{n�!:�l�q��`a���(�N��=X� zU;l��l�e�cL`
G�u��$ɩt�٢��y��47@+1awCsF<�4hN�O#gnN?`���U��V�R�3�7T�y�/~Z�i6��ʺ�6�_

���h�'z�9�*Q�����<:�l�����������3����M%9�7+T�Hżo�3��:w�貔�xL�����̼DꡟCMv@r8LAXP���<*�a��Y��
V�NF���b�^��da}K)Ch4��B�.:�K��.h�܃���1b���!�L�y�f�~�拘{C��U�O�P>F{����(:���<�{ǵڶ.�G	�F�ʘ�VϷ��\�ԩ�D*q��
�P�Q�{�71ʟk��!0?Z�h�ϙs戠:��A�vϞ�8�ς�ܙ]�����-H\�;�0��a����Cqf��H���Y.;�
DvT��P��0��Jj�E�4�kӴ�b�|�Y�e��v�7n��
�^�j��o%C�:�l��`[jHZ�T1&ֱ���43�G��	.�h`��l�ic:
�&��W�ˎ5�|���]+G|��i�v��=J�#�f�6��ۨI^v�����E�� $3�6T�j�-N͵ A�a��P�Q�ƭ�`G!� ��+�g{R�z���w���nS$�e��n�ӺQ:,T~.�H({6���?�3�c��u��#9w'3��G�ׇ��mbW��p���
r�f�h����R@W`2V4�\����Tjb�p��$����F�[��wf�����Z�����s}.�O�qDlI��lP6y��������c��t;�^,9����s��G�
}&�� �=NC�3N��9���/��|�붸+���h�$���Pg��i��9~q�pc�)�I�$U;G!SOn~x�L.��$�ѱ�i9�,x`N�V/#B��#��lwB���6p����z��]���1w�C��1�L�#��<m�B�A���m��S�8I��<.��Y��i�q��ki�mm/1�jT���0�
=\|�JF���5�}����鐷�!O8uOǷE�D�.{\S�bײ��ot��kuE��qu��E�|�
z[}�)����t@����	t����>#G�0C&���8Ռ�=|v%A��?�p��ML�l*g��,X�����Ǟ��}Q���5&��d��0������rك���
N��>->�T��)���`�9xȘ�t"C�f|�2��
s�����AGNC���t��̓r�H�� l���2�Q���rd{����1�
	�HH�a�Z�T��%b,��z���ʸ�.��ћ��t�����E模U8�i:���`5�<e3�xU�35��@`�e�@�
}�E�xч
��<=m��|v7x%�6�
����@e�����HQZ<e~�Вu��l�$�� 3h&,��har[����~/��RcN���lbx�eD�p���Ӊ,�=���PQJ]^ H��@q�)������:�G�1aCǿi�Y��Ӧn�����Ma6w��	7�i�����Y�I�=��B�w!�k�0�K�ip��W��zo̩&O]�n��Z�����,	Fx7�l�H���LG��������X�e�`��KN�a��������c�$p��FS��2��m��ũ-f��BJe�&�� _ �FFoۼ��P��������p�k3�8aA��Bv��KS�N-��=����B\o�P9_�-�*}�*ײ��+݁�6�88�!�/�|�AC��p��B)������=� �XL
�
�Fˍk��9zx-<��8�Bge��iK�#�u��b�)�^/H�>u�����eJϜ����ƕ�0y�^�qD�ۄf�t� ��=��<����	otuD�8wz��v��h���-kNw�+��+]�参�if��[a
OX������C�xs�6W�R������FXbF]M�Q�c'}�.�~�t�?-��V�f��&<���€�wl^�Ȼ�g7�-�Ce��GÜc�lk�Z�xP��d'���_�s����?�^�H6��9X��
e>�*e�9���<E|�<^��a!��n�g�L�/�\�2��2�N��l��#Rptc�����󙓽���ٔ�����5	20</)�[�
腛"�j�^t{��Mg&�D[��Ȼa�.:�w�3��Ѿwû��p�c&�[̥�-�/�QJd��0�K��j9<J>e��9`�[��n��u�1k���Sq���;��Z|˶Sp�!�� .\9��V�ԅѱ|œ2İ�丷/{�?���oݢ���"���}��~+����)��s�;{���D���&o����\�5�py��.�@3„M����U[�MZ�W@p !V<�ݓ'O=���'09g�Zt���N;�#(�Ma{QX�D�]�.�'��Ss���i�z#6v���d�>�[�H��3��*Fj>V��E5l�
�e1L���g{�V�x`ߖ:�ɕ���(;5��;���y�]��-ğ߼��4�
��.�����#�>ӓ���U���S��F.a%{b�7���`�\�6g�T���I���	��<��W�~�m&Ã�
:�~T�n79��"$�Z�A9:��8;8@j^�i��OW9x�fw<ij��O���Ч�/8�ԋ��Bi\�ٕWc��4�`�Q�1w1�o���x���p-�t�s�&/��N��'l�^�%�X���B���Y$x_0_%���	
���ԇ�Б�H�…��n�F�4
��\���PK���W��bnJ$X� pip/_internal/req/req_install.py�=k��6���Wp�JY�H�8�ds�a�?n]�M|v�����成�k���1cej���o��qj��NU�H$��F?��е��l�f3��~8�������f�~���p9��^�:��TW�u����l۷���Ʈ��ȗ-���]W����B�z	?��x�y����J���،u۬�'�f\%�Gї{�J^����÷�~���D��7oxt&[����M�YWnޗ8��P��E?���B?OU�x݋�hF]�yv��ЉM����^�'��ɚ�u]iS6mSo�}��(�� Nռ�����#j��)�f���LQqٶ�ug���}�=�R��K��ޞ�����y�.�h!�+������q�J~h�1P��F9�~<o��.��Ӿo�U�Wu;
�I����}�)`;1��R8���b,�r,U��Y���A<B�닉Ș�"�Jl�i?��H�K�+X����*__
���-O�*�(�j|�V�(?#�h���!�~S�Wu�Г7��Z��y�ʿ�ﱢm����o',!
�⣠��G�8��7�݋]�9��tN�PV��(�Ś�6�=��)�qB����n��J���]�ш^���@ʪ0al���{a=�4�w������v�7�n.�ԕ�Qf��6iH��z$��j��p)�"�3��/}���;��f[�^Tq�ǫ�����V�/����j�߰��}y���䲮.?�U�DM��m���r����ڮfJ�(]�8�Π;�[X<�>�`��0]�<oĠ��O
,�⺆v����ޗ�(e0��)
�O�∫_���}�T'fjjp��Aa��X-`��T��P�2+�y�q��#��gg(R�>ɕl��~A�m�E�<;;��K@�ܬ,���.MS��
�y 	dh��\����r�5vL.�Z��J`ǃfQj�W���ܶ��V�E;�	,�^$c�lŸ�hHe/��n:��M����M6m3�����$�fG�#�RWv�L��\l��V�E��?��oW��>���/Rޚ2@�@�l%���WI�4}k�W��<�A���Q����Y�q/{�~h���%�r,N�%'��:�}��Val9,Z-�a5׳1_w����-K>Nw���6�</RElƜ�V��+1�0���$X�����87Rb9ЈQ\,��0uݾ�Glx 9�=��6�J/�����s]V��iQ��л�5�ڱ�7+['X���Cݸ�AC�cC����)TQ!��-�Ł\�[ �(q�k?�3���y�e�"�>�ª�&���pXԱ`�p-����2�怜j��!i����%�"R�vӞ_��p�.��kZ@��F��ምu���#���X��{��Q�3
98X
S"Qt�ɚ�4�Zh/���㫺ԣ/L﹩̝8��Zpr% 5ֱuI���E�8?�s���21p�t+E:��(%��Y�
~Y���@�	 B#�f�����k��o��0XhN޼z���F�o�@��T�J�mX�l�' n@)S�ե�l�;��y��k7<\��o򒋓�˧/�/?���k5�"�9iA	f�Ϋ,A�]��<K� A]k�b#���LX���v�ڦ�5i��d�G(*8#WV]N�6�a� |tmS��ZP�qˮ/�ͥ'&���U{ݠv@�$��ԯ�m���Tt%ٝ؎m,=7���r��G��]�c���P��$�(K~r�P!0��w����#�C��>@@�i_���oD
|����iJ�:6Tz���9��.�����	��؅�*�w��=yM9Ε�g�&1����nC��!(~��}1B�j�Dx�
.���밮�X��vA��0T!n��H7%�7{J����v_�"��C�pY���:���Sn�|�� Gk�}T0��X�cb�j�f�(un�l'\��5%�lE�8�0��p5wl�0�-�aU#R4�q(P�*�7�L��v�H����7�2��װ�a�?��u�a� "���A�۠2�Pa�Zf�|�%)�&Rw��=��xO��_޺`lq�8?������-�j?�/�:��,F�R�'���VE��@p%�MhM|���~|%��Pf�N�G�@A���g7�����Xp��8H�u-�p+��vZ�DS�fScY�q�%�xd�00d�GhR=�b�[@[��{:�`hP_8��3�*�7����J��B��^+K�6�P;����ς�y�x��
��Ri�_��A0/ؒf�� �i�����[f���
Z���.���DY*$��2�~Xzs�m�z�3���A��6�9IJ`+��/x�1�ʚ'�x����X���8%���"�+n�
�U��-�¹Q١M�%�`%]�����$�'�&_EH!��U�~�wL�Ӏۉ�+.C��]������
�j�����8�U��+���p������,���8Z��a��(т���\L�I-�#�)�[Ϳ�u��J���m���#׏�������ܩ��uD�d�h�2&i�b�$2�ͅq���m�|%�;�'��m��X����=��VY(Wzu��T��沾Rݰ�p�ق	K�(X�F��H�J��V�
�Um�T�E�v�|�')�{7�i��"f�_��Q�
	�3mD;;%y��Po�6
Pf˱�"���Jk��|5��R��rY��s�"�5�� ������,mSToT��p��Y��eo􊮐��a��6r��=��c��gD�Ȁt�dc���S�vipӋq�d��p���'+����J��V����7��o��%T���2E�)O
a�[[�&6]{i�ǀ�J\L��.�i�]�j=��z)��4n��f���X�#�DN$��O9��%p}]���m��uRuiX�▸G��A=��%�h�`���/����_��%dj��&��ƚ��j�v�X>��w�P���4�[[7�my�i�@���#��yc�Q��D�DTGlq�%�W�=��3�Ί�2eKp�^b�Q�ˊ�p/t�V�蓼lc�%%
i*3&*Pۏ�%0�;�Tw\
	��W�kƃZ�3d�����I+sD��E�%��*.`r�3�C^�$}�",��RUr�B�T6��]�r.�Iw�����-�O����JK'���\��t�A�f!1��23�vpYི�Rm���ϵ^RO��`TƲ��jhqU-��YZ����
�z�}$��N��7p-�
�?����^AGC����D-�:�GD��Za�Q�9v����y��|]��n|�dYQ�yl�<��pG]e��y�4�F|��d^/epYL��4'�ß[����]H'aW�9
mt�D��(��<'�䬫�Kv��@Q�)Q�M��T��j)�[�5:h�t�+y��=2]9&c��;+u�i�fB�eC�T�7)���s/n�A=��~|��y�
D�+-���-�u�ƀk�Y�<C2u��<c�'Y��8�@����f�i����_f,��	(Z����&��������R7�����,���3L��F����M{ݬwm[%26
E�WJ�+��f�T}���^K^�� 04�
��wD�ǐ>:4���S�AI�`��ْ��9��~F*%L��PÑw1�hͤH{	�qhH��p��XG�ޯ1��̨5�v���Y�6X{X�a��8\��bB�(���Ŏe5 �GG��'.� ������q�C;�I'��$bP{�
�f�ݐ☰Fz'u�Ȧ�>h��e��>�%��x�
��c��/��wY~��DzP��M�}{�8�.J���(5S�0��D@�u�W	Qr�ߵ�-H��qH~|E2������+�]/4/ք��]�Д�6Z~e�!Y<���Y�-e[΢��a�L�Gi�~h�\n/
l!���P����s���t�pB6��Fa�_�C�td�O����GL��l�	��sT���
b�҅[{���v���V̫@��ռ�@�z�6Rܥ��>#��0Hl4(��q�^�'UJv�:�tA"impm�w�f�=�HS�-�Q��6M>�΅V#vI����y1���2��r1�A�2Rt��&���H����#�]jZ=���Di+	^%�Š��݅�$��k@s��#��~<t��
����G�hH6��<ḣ
��a��P���q�[ބ��<}�(�I04�����}5�Bs7�<���;1�٫��Y|��'+�n�A�i@��r�+Dp�q�ץ�CC_�
���&�Q�/7�^��	���L�lX�q��@��Q�<�K����9ŔP3b��Oܖ�U��+%����H,��3+�N�l�w��*XV�ɛ7ϟ��26��NZ�h����B�…(E�>����D	4բ(`(��К��@qp,o���+;H�	Z�oԯ���#3���2�nS�������<yN8E��ӑ<�4Հ�x1H3J�;���vhk���o�OeT&'�,4$��s�B���
�5~�O���.��60���
���	g�^��V�Xid.���C6�Nm��8�1"Ql�;�����|��x��V��Z#�34�%,�k�~ ����4;��h/(�~'�"ĵ�$8�Ƶ�*�q�� :rS�����y��I��J[1.f��-�D��Zࢌ�ȃ؃�?N8y�e2��H�����{�(�F�n8�k(dbxL�8��v��
�Ӛ����W�r�eNwIen�v�R��l;��AL(I�2��L��k.y��G�w�O4H�`I�oWѢm>7���+���o��I6E��zPF��u�D�5N�Pu����3;����޵����i����9��3`'w�fN|3`C<����Q�R�ɒ���gdܤ �ڲ6Kf/x���b%�@��a#H\�I�m5m���eLa�P����#,J����埠�T�Ⱥ������BPt;x�����″H����z+S7�9�a�h�J-�s�g5��5Vv�K{��9P!��}����d߃��
��vv�D�$!��C�m����x�ߠ�Zf&���tU�'��(��'/vX��]��$�-�T8֜zG2���R�Ӑ:�����Y�V��~�þDBѝY�C��r	-�No��n�x��i8�4�	E�Ϥ�.�D�A��v!���D_� #�3�ۓ�lӟ1���}�T(l�zS�G͡X8=
��ƒ���
��A�7��E���S�֋���?�(6�*��r7B��}f2!Ng����<`Y�
��J$Y�io�Ti,W���@���Nݱ`⦧XU�^����i��6�\�����cꢑ��@���	w�C�84d�;R''��k�Re_9�T�i�h�~����eNRY�\�W(�Gfe�9���ٌʙ0��ΰ�%�C�r�P���o��m�	s��������œ��$!�-y>�O�����a�T�}ŝ�
s�^%�J�M-����yzL���;(h�7�
j��͍�= �58ٛ��+w�|#繜�_`~'!�tγ�%9
㤂�zzϊ�*=��5��E�7l�2�_�1X)���i
�i��r�vכi_�+��YA�i0��X��U�]uꃆ�m�A��NtL��P�a	B~��ڸ��	�TytBBnc���L4��7߰�[}���: ]e������6fs@O\��A�n�|��);�|G��z�`V��l�:�H���H����b�〦m�-�cE�^=/��WB�|1#	�{�������}����Is<~W_
�8��GZ��+��J��F�m��Fhr��n�0�3m�W�	��bw������`��;eJb	/��#Jfٍs�̩C����s��R��gn����o-y	����'���G_;�C��$��LXzpI>���A:����L�EC~Au:>H�9gw�0� �?vă�J��k�T��2ZM	�5� i�c~l5%�X��S	�oӗÓ��Н��ԧZ�<GX�6U�(�P�V�����0����u�*r��C���L�v�7j�B��<4<\E+r��u���-b�@�,Z����i���͆6�R3?�ۈi�|���;��Z�j?�4(�|i-�7hJ�"N��ъd#;�POɲ�%'�5� JI�F�^�b�[�	w���)sj�ō̾Pl�r^�Vul7���	f#����yB�(>2s�l���H8��\0��N���-:�"w*�b�D`Aj����\��K9a�9=�/��9V�~���r�c����=(��a
���q�d�\F��I�9g|���Y�b���#�U0Q�RŐ���)�w��-�qЍ^s"g}�KOrf(� ���YkM��|��!�訉JwS�	(]����}��e��t1U�5�֧��GȄ�n��b��Í3`���މC�+c�&2����.X��E�k��.���rt�H6������.m��i�Xbx��l�=��m
�}8���>��,��szE��W��B�:�<��
�T�A@��X��/h��i����ME]�I_��OP��F�S����>��%O�4'�+��kFp�� 21}���=mk��>G��FCt0��d^̺�h11S���ʁ����R��bb����ѳ(d7���5���G����y���C��I�h��u>ޅ�K+�SP�br�6��AK��뛒b��ӎL���������a�ug�с���n���ch�7���5���w��1PΙ9��\b΄�͔~!�D��$$_C)����%�~G%��)Z���HQ�?�O/���zG��w�B��Rd��aU�٪�N���2�oa#�)����X7���3�>�DF���N_����:�b{���I?F��.��K�	�I=>�K�5���^�.ٵN�*W�w{4�4{KF6t���+;)lR��?�T#�$z�F�~����U�1�h�t���n�0�&b����/�<Y�xȽ]f:�~_�DŽ�h���x�c�M#��PJ����}�S
GRFB ��@A|.��FV̺����#U��l/<��ܕu7c�Vin°F`vƩ�lK���<�p���mz�:aڡf���?�O�|������gd!�xQj6{�Aq�����M0ޙ"?H�4>� :��!] #qP����f�\�9�L��Q�B��;c��?��s�	i� �ٚ�FEC���L��HSd^�si�/itҶ�Ά�>~�9��9�	��F��P���/Tu�X��JY�e]U��ir}9��!TVC��s�Urt���i�fN�i��^\�=�.�ţB�3�p�/��<!P6ቐF4�/2pn>qS�w]L��hŖn�E��N!����A���C��>2�ǃ�
L�j�O�_���c}���w�|ѕh%8����4X	674ࣸ����b[hk
e���vf�qԘ&.#+ܔ�+&9i�Ib�
2�X��u f��t{	'RP�:�c�I�����?:\6���T�����@�ì�QI<�d�telj1~�
R�t+,�g�dń:��9'a-S��M��Ri΃{8C��R\�D��(W,l���.H��R_�J��֚U‡iSv(�&[�o[�+�!��͛�׺c�:-m�0��Ե��d��~��#�	J>���At�6�̗�C:��w�-9�p�"�,�I07��s���	���1�Ŗ����\�L�a,�����i���9X�O�dT�ԥg���=!
�s�1r.�q� ������-���b�Pt�Z4���"� ��O]���G-g� �`����u�`N�x���*��c�6�qr�g��36Z�%�G��+
�nn�7�L�>*N��լ�o����th��F<yɓ6<�u�B>���]_�
)�'R�,Y�K�gZ%��e݉��<]\,��0(T./�����t4bw[�5�t��]�e:kx��0�y�����l$��]G������w��q�`��V`��O�>UbI�q�k�N��$x���{y����~K=jW�>̎��"�Þ�Y���A�]X,#XD��}\���Y�K?���i�	Ey�l��u�>�N�7H��
�����g/��驗7K��@3_}1��C���^�*�]�������b���{9;uOq�����5ŧ_����иdA��Y
#����ŀSɠ��Hњ�v��g�6��1��{s5��'$k����4Xd�W�,�}J#n}�D��+��<��ã�O�o�I}�:�g���r����캯���~�0�
G���Q�I�.������)�3�G��ؚ�U��	r��cr�c1 GAѫ�{��b^���^ϧ��q�|��Ư=���(��t)
y6}ݍ������b�%�F�`GL{���
�ߘ��n�=̑8Q%���͝����9��>�9��?��}Bb�9�	�	����F��#fn�
��Ku����XWW�D�U�1݁D���S�s�s|2���!P��c����Q1V� ���X�/�KH��^z*A�>�{i�`z%h���[`����w�s��3oA)���on��c�3U��<m�5mz��S�hu��S���<r�j��=�`v��ά�2���b<vt��y$eӵ=H8U��,C;�l��	�&�~)���6�*���WU�\ ז<"��ێ���-�{l��w^��wŜ��u	��6��u�"��1ۉ�ئ�x��LR�9�����tږ�?fa\ڙq>�V}�FD��a��v�#
��'C�\�R�|Ǹ��C���/e���M]Q�)[��,QB<�r
�����
ݖ�w<�ā��"oIl��}���>՘F�;9�hR�R��r��sI;+m��t����.��Q�:X��B�y��d�Py[!���a�ן?�,	�aQ����{�BK��+��v�A�����+y&�1%�d�b<)�TBU���"KG�O;��[�
����8�L�	y^��o�>�n
���㔩��	�$N�<���;��/�s�J��/�J]
�����P�>�3�����Q�^�5W$α^30��?m��ѣ�����MgKr��Z�hz��͞x�T��M��^7�Z�0��*:��,�]`�p�!��qa�]�>�s{�u.xpL��3���ԑ��h�PK/WUW�j�`pip/_internal/req/req_set.py�WK��6��W��TB]!M��:(��Pt����E@���fV&�ڭk��w��$�a{�Y��əo^ߌGrWj�X�7�6���;�颀�I�,�����@�Vf��q��k:��iݬ�.e��P�6i)�{A�-!�k	�Ž�����Kʕ�E��	���D!���.i>�A�o��0�W*F�"5��:Q����v�ܔ��3͡4�	�m� ��(�`زI|�w��b���<��fY!�e���3�Ok�Ѩt�����e[�J�9�v�VZh飩 a߿aﴂ��(�~7�^110��լ�#��F���w֙�Df>�ŀ4q���u�/nT�R��;D��iO�>͂��˧��|��.!$*Z�E�^��[kC�L�qf�QT`��5Sڑ`��XN|I�=�{�/�[��cj���>0�E�z��*�XĢ�*Ƙ�������$̉Ar~MR�'��m?bD;ᨐ4��,���[��L�>��2])wݏm�`<��7�0{=Դ�֏�5���r�8O�����/Pq/�}!rf͟U�QR��"�Dg���i�q��q�LL�pl�e_��혊��9�W_�ё��@i41›�3��P59?��B0�-�n�V؉�HeA�僠��x���_C����M=i�r_�+1�����_�)��/��P�e����L��b�a>UW�R+���0F�x�ӍI�(ݖ�-�ف�c��ɿ�P�D.�;���hmv����bX�=ƾc���g�Y�Bi�t��<�;���R:����x!p~��i���U O�d�}{�Z;�(/-k|E����6���P����9�ReP�{5o��V��J�d�� ����	�?<��ܵ,��Mۮ��v
�-n�7眯�-T��<
�x�6~Z�-G ޭ�]�S�҆P��jͪ��;����4;�0\i=V1>I��y�ǯ�j��xtW�IX��ӗ>�7v�65�(�~�/�0y����ȢxH|Z*�)N:����+'B7P�_%�f���Fi\��'�I��Uߺ�'\!�B
���$�`���Q"󅻐�Ȃ���*sz�xg�;�D!���&��D�N�%�~×��m�
!���`�j��Ȥ�,x����6�h$�2z�S�*�$��Er�������8^�F*�4ZǼD:��JS�͇�VGWdA���	Pz���������i��q+��Q�[õ�ls�gm4쀧��@.�L�WO����3L��i}D����|�~��վ��Zoy��PK/WUW	�Ab�d`"pip/_internal/req/req_uninstall.py�<ks�6��+��JY�Ht�[����6���N]^5I6��hJ�d�ɐ�5:����o�'}�%h4�F�m�Al��zh��?+�Ac��G�뺩7�l�5;�O�r�R?�:_��d}��֒Ƕ�����q!�ȫ*_Ur!^��a!�&k��C�-ě�ѫ��^}�eS��B|/�����g�-�4+k��S�~-�m����.�~�����k�XǪY�^���UYgm'7����e�Ny����y/_�]��#�X�[���]���Oo�y��O�O7��mV����g�	�'3
�j�[g=`r_�	�/�B���N�ޕ�Zw�����n�W�IBb!:Y�;�×��I9
i��6+��0F�K������NWv�*��ihe7��J�^��a���f�e���YE�Wv�,C��l~vvVȍ�uW�=�gg>���]�zR��v_^���\,��r�55���%���$�I�|��|�b�� �Uu��妔�@Т�𻲒�XS�B���$�o@R`�'�p/6MG]�僬��m�x{�R��r�w����A�X�Ɖ���&Tj��6��)뙢�G�9�8��*L?zTn�=_���N�M�;>� ��Ļt���F�C��P�7����m�jzU/��!����_��yaS_v������I�9k}������_�^N]��M�dF\*/�n�_�F}��@_���I�R�,@�b�X�^��y�|T���V���X<������p��-���Ҽ(f�t>z�����,��y��UQ�L��Q�v����H�>W�τ�%��G4
G+����/�}�jy(��f?,�a���͙�{����\꾩��J��z�<��D#`�ޯE^���F��G)-��Lyhc����a���s1�G��h�,�d�3��W �l _���T)��Hĸ.��B�Mߗ+��
ѐ���7��W_�~K�U��
C�_^\���>G�Q��}+נ�����6]m�
	Y,���/�E���{z��`��FM�9$a�V�F�SW��4��.+���z���B��ӊŮ��䋼�A��G���ЄgݬI�&)Ӓ��
�XI҈v5��6�wJ�@	��0��/��l�ǧ���'o����+<ރ�z�8�;���+1	|"~n�bWn�@��@ň"��
�4���R$�瀫�^,���Z.;i�������ӹC8��_�Ep�O��׸?�*�����F���Z�$31��� sf-�-�0Gl�9!�"�-�|��~v��Q<��SGY=J�,A���@mjg����a�_}����f���r���UQ�K]>8�:�E�}&�f[mr��<0�:�@KpC�����9�F\�!W
wW�%�����V(ELYv�j��}��":��!�
h�
��E~��/P�Sw�`h����=��z�2��BT2-^��Ϩw~/`D�B�OI�͊�ֶ�Y4<'��H�FLŅ���+��h��������l��)p~70����C[�Β���_I�r������aF�
�/=7����4
;i�p�Gg.�t8�ɜZ�P�޲_�*GF�����*n��m UDn����%����(�I�5(���U�վ���Ýd���`r��{	nV��>[���ރvV>
�KP���gn� ��.G.x�,�">���K�2_�j�'E���s���O�N��a�+͉����_rc!���C^�� ?Y�U>JU�T�x�xوwFZ�eN1��1����^�sG�w
��fR�.�茠a��+?�9�: 3�@����7�����WBG�X�;��
y��\V��tI���\�	=���v�{�;
��º�0�C^��t��8��}[@<����p��)H��|�� �
��P�=,���}�� �O#}���wc��p���g��j��﬿�u�z����$�;�@��ff�bi��m��E����A�he��45\H��x�c\PT�^H��i$<Ͳ�0�˲���\���iS����a�OkUJ^k�\���*�����ᮄ���p���*'�N�@�f���z�w5�M
��BV��|�0@��J�H:v�����p�q=��]V�z+G�U��=R�nq��2������
��.7GF	y��{��Ǟ�f����
hP�3SLlgv��)4��,������}U!�5ZW��yVD��}�|
G7�����aRC%JV�X�;C8O98�>����i6s�[�SYF.7�]I�1���D�B�&��6J/���U�e�#QDj�f�p�8
�Oao��
��b_����{0���OB��O���C�
-�R� �0�pl�Vk:y,�v���+�*T�����1��Me�}Q.v����.�PbF�'�R�Oj��ے�^���(q�:#�?�H�i���iY�^��p����i��g�xHc����`�q�
�����Ek�p{��Yegb�/�O��i
�lKV/����� .���0�� 	P��^�Z����+�P�9��3_̅�Ӻʁ3��Na�͘��]7@9�i1=IP����(��g�@CC0G�.R����z��V��jC&��=�_�Ll�/x�N!�vp��{17��A�"i{��/�v iփy��9�>��z��Y||r�5*�_@xs�os�Ϝ��|�r�rp0r p@��C��# �;��� �����CN�33�hy�����V�y�r����+'
#	`��ŔW|_v64�iʍM�<��
���&�źiK��J|�Y[�{n���b��D�j�.�E�D7�oĊo��W2��Aܗuq��v�:]��J��
���L;��Eʙ!oiIc��UuR�y�6K�b��	~(�-���@���x#o�I��M��i���O��b>@�*2��
��d�+E��RJS���@��y�Q�pM�ͨ�
u�=U��?��-&H�[�����߉\0��e���#���e9P��|4���Ui�n1�M���z2c�J�wW�����'�{��P-Ѣ�!��	�BC�?S.�4zb$�mR��஄
�V��"��� �?$��7��X�]q�Q'�TC1��>u��3+{���ق����}�P&Q�����f���e���@3��:
�Q�NDa9��g
N����1�Y���{~$��	e
t�A�wd̐�	]`�E%<�^6u\�Y��H��6��Q*=�&��k2:�#�]�y6���_�^�tCO�XX�7zԠ�J�ۨE|�@�n���I	���~a�
b�]9Ly���C1�v�qs����rR8�t��R�Z�Q���L"6�
��J���V�8�2����~��d�T�*_ߟ�����,csk4��ΐIoR\]�bl?K�f��V����G}�/[G��^���t�!j]հ�\��l�|�C�;���D�� 04��	��h�����v��<����N����а���*_��$�����˼�XCt�]�NILj�+�Z�'^r?�>ԫJ@�㿂���p���٘���l�!�g��M�����$<W&'h�R�0S�*B�ujr�����&*u|Ye�OmQ�V�܀���f-:6���^�{�r7*�Ẋ��*Gh0���mU�~H��HB��9l_�o���֣�s�k�>�Jw�v��/�&��K�fx���t��猚7*f��Zq�g���`L*v�ף�ڇ�����lU��dz��o�l�e-fx��9�>׻
����n/Q��RHV��	=p�Ɍ�:����-ė9�

��e�F|�/D~�c!"��BS���ҙ9XF�rU��%�8U����N/��.��z�,"s��A�QۗK�P��"U�Y��ZPl�:���0�a�w�3
�f8����=�*�8�0���BA�r"E9�S�3.'h�"�Q��͝Y���ȉds]K���R��#��T!�g��1�$`��%���8�b��ط"���㹭�c�ox?��4)�w�+�T��eؽ;=�Y�{�/ןR�$EpG�G'��˺��5�b9<�J��<j��u[�W_7��\/�hT"kF1e����$�յ�F)b�"8M�'"Eb�a�:ؤ���dt.��q�; J
s!d�j�$����[�؊�X��0��-W��a�阁c)�L��
t�D9�����q,&]�Ѳ`��[�y�Q��l��\U�&����(�F�0ϰ#�WPE�h^��ԧ��T�~�fˋU~t�>�/��x$GqЪ�##���bgM0|`T`��N�w
��L�J��g��j�mE��L���h��e�G���nv�RØO%�iK��Em5��=m�P=U�XA
M�aꆈ�c"�֟�2$��|�_c	#�F1\�@(M1�l��e=�邸��JV���$*���@0�@DpU�'焍*�
[e&kD|���)":?�@�D��^��dŬj���e'��7`5	M���Ff(9A��'AR,Y��֣b�K�iy��).D��mT�d���3Sȫ@/��i:�!����'b4U��,\�����33S�!�� 9T�07����S��/�AG �i�<���:�1�	<�H�}H;���-�~�|�B-f?_��h�<)����
��oJǽUM�-�wy���J�]��������l�g�됺�����Δ�Ǯ����T��Ӑ�f��X#MP �pK���K�jZ�E�+1�iB�tX�O'+�w/�+�1g+hWY��T|��k<�	�7��e����+���NwMa�h�4[W�ɴSfV�0���CDć�l�V�C�e}���A!;����U��#�rЇ�N�*�"���:��ɪ�8�CG�Mmd!��(j����V�*��|�����ʮ�1)I���Iqj�%`�*����f�� ���hz���ģ9���n�?釢*W�|!bo�X�œCW���Z<=E������]!T���\��.��f��a��,�i3s4��ԩ�Y��������4��&���1�X$X�D�TD�f_�V%WU�d^��^��#�	�T�&�auj�@�E���룐=�Y�a�Rb7C�2os <��L,2�Y�@�y�:��~u�i�ZY7�����L�}���eJ��`-����[C���EM唱rϏ)��FGS�֬�Tm�(�D5���<���
�@�c*c�h�����*:Q��\��z��܁F���|��0�F|�g^	ؾì.xo8�k�T��'Ϧ9g|�|�b5@����i>��˜?x�����}��s�; �|dRA%�����|�_���B�|�~P�h(�'�P�A�f
۳>Z.�<��K��K���㨎K��C����ikk�� yih&?��,@���L9Ǫ����m``W�@�h�^[<�Q:7�qFՖ1���%�&jм���;�0f���`G�s0/���Rb	NŹ�(��e���:�^ѧƥ�,��T<��n�ot��s��fZ���{��c��]�5hd|�D�9~O���3���w�.FR�����Ѕ8�N���h\J��)o�N�Œ�x(m�j>vN���Nǭr�j$�2|����$ƃ1h�RQ[�Vj?���,U7�y����(�O��	/8I���0�hy�ȼ?j{����	��i6J��7��J��=W��>]��'��C�T3�2��cf�����?�t���~��C��~��Ή��(�L�2�+��^z3ݽ�h��j[�xiA_��ɩ !2y�n�\�$�H�ǣ��w�&��S4ҙ�ɻo"�qZ��!L�߽�N|��':n0�,�u�X;�����|����Hu*
����)͌�p�1��~�i���B��T��T倬�[�b�;�oh�fx�o��մ`CjOl#G���:H]YcD	X����b����}�_D΍m��oP���I�@?�C=�UZZ]6����E�݃c��oc�Y>�3���<�m�:�?X��󇨘@�:�:�^	b<E��!h�Z7��E�_�
�Ӊ���ɬK�M՝�=�Z>��9���ܽ�㩎�pn��tzú0�Ҽ+�ŴT�L��?������Lu|�j�������}C`����|E�9�Q��烆��z��雐��BsA!z��}��$ǜ=�T����Ɖ�E�x�צF�s���T1���_u�Et���_�I��}K5N1��:���l�g+�~.t��b"$��Y�?*��K�)�4���F�z��i��xo2h)u6S?R���M�"�*1���o�P	2Iƶ�r�k:��:����ĝ_�y���/��6A���m-~�l�����1u�a�mܼ�+:{��k����P9�)�!q��7���/g����̏�@u^��p{��8���h|�G^�Qt�9���<�~�бq�z6��_�љ��z
w�Fz%)��˻������A/7M�n�w4��ÃB6�pc}&L�mk,���/tu�d!pn�s�2�.��� x-�w�z���]�w2I�?����Y�]K7�P�δx���E/|�g��:e�F�,��]�Vͨ��n<�"g0&�\�G'�%�F2�jĈ@L�[�{�T�1EN�#�⍽����hwa��E<yWs�~)����nljzk
�Lgb�0�!����-�H��ɴ�w�$<����*Pnzq��{W��K>��gU��?�����2Ef��‘z���ߥ&ޏ�J�7��;`:���7aɚ��{,��	'�mZ'�|�!Q�~�*����=�Z���"㮥�~]/?��;:jx���z����ߒ���t�d����ޞ�5�Hz����X`���K�5���E�,��h�>����<�`w��<w�0�1��*Q�kM��˙�j6�q1-���H�6�Y�I0�c�Ӈ��ݻP���~��`�J��P��0�_��$��tB�PK/WUW$pip/_internal/resolution/__init__.pyPK/WUW�˩�G pip/_internal/resolution/base.py�PAj�0��{L��顥�@iKr4�(�:����&���lc��i�ifg�fj@?�k�@��h��{�	<;�^�:j�7��>V�k9b+�Sw" y��f�n�tv�
��YPG��՘����UȰ��f�d���6�3�<�e,7Ɣފ��ܢ�� ��f�5�,z�A_'�DZD���=�ڗ@y��s��aU|}d�|�������鴈���M|���3�bi&{Ա}�E/�c;3�C��u����2���PK/WUW+pip/_internal/resolution/legacy/__init__.pyPK���W��lD�^+pip/_internal/resolution/legacy/resolver.py�<k��F��+:�F4n���
N{p�g\��s��0�1�H�M�X��zt���'�	؍�쮮�wUWs�\��'�V�-��T]3u�.�RT�U?�u+N�I�J�d���D�ľk��Q�.�L�馑�����u/��ी_���m��R��,E�3
����M����}�H�D�e��^�ݐ$�u�A�����˪w�t�\
���'F\������e����
Pw7ގ-���PKe6��׽�c[m�cݪ�X=ZW�+�,��eQ
A�׋�r�X\	$4Ӯn�a�G\Q�C76���f��"�vG)N]
�	{?c/3s<�ηB
=馣
�e�(�X��S�����a�:�žh��a��]%���@�1� ���iDy(��
��_��/j��+�VO6�Z��?j�6�'	�O
�GP@�����٩(?�P��z_�^]��<33��g�B@D�"YY�@H=����ͷ�$5t�	��d���������|~ժ�ZV�F��H^w�K�z�_�:|�]���o
���ΰנ:?ȡ���p�ܪ�x���y8t�Fj�X��S� �ԓ�������ӗ�05���7�)�t����U�QYS�̴����>"?<�w`8�D*;��T�2��7�&���< r���<p@1�AH�0�h�*��rP9Cr���CEP��$c{�P٥8Yl0`��o��@s4�;��|����s>�jvJ�5P��O�7���!�&?�gM�}���fF4��ef2�)���O9֪4�[�[����`DHG`𾛟$�68*?��-�h������==[�y[e��P����^8�f9��=�[�1o����h�3�a��7��v��[�e[�����x\}�!�[�H���7'��^���[DP�"��&�u_��l���l���O��A����RSA�0������[P��l��̀��@�F�� ����21�8�u�ͱn�˾��:�|�.7G�_̦;=�֊v0-K;�����!��6�5j�*��Nh��]Nb�l���S�D�[�X�18H@W\�'���΁��h+��ACI�΅����
��S���<���f����U�
�&JT R����Q���q���,q�=+��G
%HC�����M�P��՚�p\ ^֍4ޝ�2����L�}7��r����U�h�6M��4<�����U�����mˆ^�+vvGh�K�+����[ ���R��Y/0�@�<hĭx���/�nnp�A�*D�-�h�G���(#�[�̖�o �cqZ��uɡy�@��1��+����/@:��23f��:�}�ZЀg���O�c7O�4	YF������O_���E�d��� E1����l�.3L�auaW�NB��.ʦ���A+7(ZO�H?Q���`H
D���
`sL���N��w:��`�<pz	?��OrX�&��>��#�{��lֶ�����8�r��
|ZJ
 ��0���XV�d�n����|��̐((���<�4V��[�� -�a����}M�yN���׽�ԝz,>H\��^W�Q����
�O�6�K��n>>3d���dX�P��K������}_T�0�sp����F&B9�V�eww�ot
<5����#�j�M̵
�7BU�%�ka���D�ꯝ�	:ų��G�o�z7M����A�*�^xb��1��I0��;4I�7@��[-�KG�a��W�JD�mĐ`U_�py��?<!�0%�49͚�m��	q�~�UY���w���(���Q�jʛşM��:֪���6YI,FR�]G�@�K�6:��dNb�
�U`?���`=�S1X7�y�
T��9:W�F��-�'�#�]�!�39�F���K(�d�c�t �0{lq.�a�֒���)Ae�~�0�UDX����_1���2�����ؖ�v�yE� ,Ʉ[p��K�DN\B���Q�E-�RѰP�tp#b�X9�
�l�w�=�'@�bw��,���T���^��c�~l���FE�m�г�5���-6���w�,���ko�vU���:��*�(�c�9���a���ݨ(
��ڐ$��2E>�z��:H̀��S]-�CFP�
��A�|�"p�����O�i)�T7Z�I��V��M�N�1	�-�zY��P(,��Z��B%�͊�c�.�����VsI�]xa���$�?�6q�(7!2k_�$r�L~@�W,�"��i�����i7Q6����M�:�Ɋ*�
&�����|�y�p�ӚPY�(yF�g���m��NXy9�ub��$Gi���� SY�S��7�,41Ir�9��,�D���[ϫ�� ��pIC�.~�{]'�6�g_�/vf�����[�1?`��2;�ϨH��.`�
��Ʋ�����ǂ$��1 �h(ə(�
r9��";.QZ��Cáx|\�!�n����
Q���j�w�Jh��_w�d��e�G7���j�	F]���=*@���0���d�[������������2fA8J�^�uߵ��c����]��V���,�~���D0��t�(�Q�T�{�7|�$�\M)p�%G`��;b|����ʉa��gè�ʋ;	�ƬIW���2�I�α�����tڮ��֏�'�M�5�Uȟ�
��eV���g������5Fs�Kq���e_P�"4���T8B��Z�'���k/����ST��>��<B�L��Oչ�F$/� ����T�1�?!� �<ʫu���m��c;v�}��Ox�"
�MP5�Xʓ����0��Zqp�l���h����@g|��!a���Y�z�K:�%����gf���8�`�F��h�o���VB4�)��`�—�K�':%����^�L'(-����dV��c��-P�=]Ÿ.�(���3lcߩ��9ZSб�ӍX���܂�:A�?�01�����Δ�I��-��tt�Pϊ>�Iٹa;N�"�ll��ѺI`�s�%,"�s֛�g�t�}����&BS���#�X�,SX�DgyC�8T�6��6�x�k���[�I5�1ԁ��8��tZ�1�~I��B�.�D>���"�L�ۭ'����.��@6������l���[���9��<��-_D}o|�K�/+B�	��
�[<�Y_6xζ66��%l�����t�vDkz���*�h$8�� �y����������_4�l��5���s!�,���w+��M�z%�+5)���5:��p��m���8�Q^�!g	p�--�5�⢳+*?$M��k���
sNyC�N��g
lU��*p�>�r�Vb�yp�լe�As@�
�7i���ߟU�o)�ȕa
��q���X�S݊��%�L�Ʃ�%�Nk���u��^�'
� \�[��4T���Ȇ�f�}5��;}u��=���x������'aE:q1�*F� ���<�j�~�{� Lۊw�(��4�MPے/=��c�T%��?������S����й�NM�?tܘ1��7�T���x��#�k+Q@
]0%�>P��J�/���_��%m�!w2w��t�O��=���ϭ+ 3g���>i+}ٖ�E��%����Xt&�Ӌy�A�Aj�d�r����X,�N�O����W��,*A�
se���L�$V&.c��3H�5;�$���h�Vd��Nk��E��9�[�����J�0f�:�s2��3hO`B�^�ട��ɞ'G'��b&�!>{%p���G�u�sS�8!��i�mSXX��:�DnMs�dZT���5bGl�z��
��Cm�EI�0���F>`H���/�@���R�( �;#��e�#5WN��<�΅R�C0����i��r(3񼵡!�Gr'�	���]_��r�{��3	��);�h�U�;���l4���0FM���`��2XJ1�y]�p��F0�R��6y���a�x��O����í��~T
ӱR���Sq�.���to��c�)���G�>���LUo1`Q� �A��p���PF��l��+ѻ͸���)e����]���9�c��by�1��+�OXߠ�Z���Q&���z��-8���F��Ov��&�4Y�D���j
9�n�^y�۩���$ꎠ�-7 Й/a�=7T�v@x��G���S�^JW	H��;�p�鷽�`[v=@�z�y�H�ř�D�y N����f.����� 7�[tx�s�����ǰ;��^kH"s,O7V M�F�kd)T^w��	s3��F�P���|D�W\;I@��teR[B:W}DK~���G�Q�c!�r8�#%�Ng��^��?��'�����i~����B��"_�>����9a��!셼`I,V(98��F�i$v����`c�����7�.۾��ۿ��`�T��ϦK��x� *�l��I9]��Թh?�އ�ۖ�\?s����]��W����Jм�8o��<:�n���C��|�z�V�y��g�]K�O�rq]����>*u�!i6��8�>.�\a(�����z�!�
��!���oa�X]���`���C4�kO��<>�O�{���݊O��h����c'�z�����?gm�Fح/��-��7��]`�:j�!ٲ��x����V���6ATi���$�I�:k�ѣ(�Wɘu*6���AG���8��ITcm�l
���ŋ��dM �;���Ak�W��	�\fʱ}JR�:Í���Gc�٩�9n���D�
�t%vc��us�������|��KSߠӕʵM�+��j���.NF�w�b�����X+�[�*/�3�#����-ި��C`�}<�-օ�e#T^����� �S;�P]��(�lT>�H��~zk�H�I�^�	A��t
���9�*|v�h6�8K��3ķƈ����/�;�t���}x�
zR�C����.���j�˟}f�B\_9s�6RM
/��]_���Ӂ��7�,E'{��wB�1�Ѳ`
p����;7��2�%b~��	��_�dic��	��€��f�)��o�����m��@ї��&�F�&8ǻJ�O�lNBJ�G�Y��#��4#Xa�9)r(F�C�����g��‹۞7{W|�;w�\]D��{�Y�|��j9 @}��wnC�����k,`��L슼h�dU�w풡���M��Gn��q�wb��@ة$f�+�q`�h�r�{�C	(5YN^���&*|��
��Ͳ�N�B#���Ԛ��i�������آ��']UC��(9���{��|�z	�e���9}�ʋ���j���qx������}���Χ)6�K�Ǖ�5<�7�hk�
aoS��\�4��>�f���x�
�^�� �+ħ�ہ�����ld���:���y��晻Y�+2�3�r�O|������I����Y��OL5:Dv:ʸ�$#�]_��տ�[�F>�b���*�Or}�@!�9�ե�k_%N�Rg'�Z����p��E@!��
}�PT%t�9S��-k5��O��ۋ����¡Xa�cd�dH�'���{����ܫ%�I�,�|��\}����9R}��zJ��=���=�(����Y��"݄$���c���;	�#�=�
��G��Y��٭3�ۑ�[�����
Z),� �%ex�#�w����~p���8�%�A�c��5(xiB����ك�)���o�K!6��+��O�C����shx�c��8`�>��Gp��u���VJ���w�����=�O���^��ff6��x?�2J�ᤕw�
����]zJ�{n~�5��L|����,�~��i�Y#�[LW�?߮1?�[p�:}�?u���O�}���nC��?�]Y�9���8q���1}��!�:��������P̶�KWV�S
�P�<"̅3W����I��Ƥ}�v��GM��/��֡�B��Ž}@PcE�A���{� ��SX���i⩻"ɩ���܃fG�`��S�k�p����"`:��ɸ1���9�+�p�ň�u��P���gQws^�Ռ$=U��jX��&R����H9|��jE̛8�`��G�o�g�-_�P��1�6���7y�?�Dk��weae�t�����}3	A_�O�(n�%}&	�^�F�r�Zǫ�O0��8a��w���ozyD{��Yt�ju_'r�^���O[EÒߺrzss����|f�q�CĿ\`���^�eWrui�@;a�h�^tT���@n�-6�ð�m���ǩ&�DV��o!��,�����R��ԁDcJ�s�nlT��Ξ��v=���?��Dy.�����@�̗��b0@_�h;�gw?}�r���`����W��F��QR�<-�il�Vv�L�g��L���x3�|R�)EI��4���v�y� �b*�?Y�M�>�(���!Km�#���A��/k�t�$�Vk?w��L56�݊'�/Q��;>���;:s�]�<Kb��^7��?\�<�z�E��l�.f
��u���+�����\E+���팎�U@NK&oKi�B�/�PK/WUW/pip/_internal/resolution/resolvelib/__init__.pyPK/WUWF��45+pip/_internal/resolution/resolvelib/base.py�X�n�6��� T`�M` C�b�鐤�Ð�*b#�
I%u���.?DQ��5��aA�ؔ��9��^J��-Q۞u���=����P)�P �])��+�;ڤ�v�§�GQ��{�g�t%YO�z��2�C�*B��o�t~�rP��FW\��a_���-3{�P��hx	���aS�>�)��!���%42kX���sJ���q`O��N2�pA*�4����Zh_06P���<��̷(�@���T�%�CO�,����������#�ד3�z3%\�iEQ	�4�*���3j�S���%�\N�Y��X/�Ͽ��2"��*�q5Z�%�#@
�#.�Y�����o���gκD"KP&��b�U��9����_Lj�h���G����g�%a*�����J��r�ޔؒ-]��RB
���ƛA�;XΜO����[�0�\��E������� lAռ�ؠ��6)i�'���ӵ$��,RT�F��G�j��(�G:%���8��p
��^p���%�!��2c�	��9�%��uvN���Uׁ�r��A��B���z1��zA��m؝�h�y]��pUk9��I��4M�+ 1^�C^&��W-6}��C	�5��M4�W�u(��cu���V��:��s(���
��%���1�r��T��\R�$�U�w[W�b�K���yG�A�-�@���nKZ&�5���%)|V�`W5��A�B��qM���In|�BҘ!�S\�vO���Ò05	��'"i�C=ӭ��3�t���Xh
uX��f}κ2��;4@˭��VqR3x!
�gEjp=�)�(O��Y�zA���w���*�d��ՒゝI�.^h�]5��aA&��xIC�g�b@厳'�h��8�zj�u�旝����'�T�8�oF쬈��	�ż}�,��Z/�[���,;e5�l��fcy��5����N2��s͊�Ev�[geh�lVY���ZO�O�j�
h��YQqc�=i��[���(����\$��pgY��I�c�+q�E/p?�ܟX�M^�S���S�Y���#ԇ%��xg�Ȥ�P{>l	��_.��	=A�5��T�]�9Ou�9(/O�~�_��2�as����K���C|�N��#� 
��cϱ����C��qڕa<8��޶ui�N���uy�k��dbư����D��Z�>��i�z�n~h,�����bb�t/�����)�J��c-e���Q����`�#_^Bx��
��v�<3U�n�⃹FiR�iM�Qf/JN��W��y0��p�]�I2x��PK/WUW��>�HS1pip/_internal/resolution/resolvelib/candidates.py�<ks�Ƒ�+�`��{�B,�|��eSQl:f�'��TJ���Y.L,cR����c�x,)�r\I������������iEQ]^���Q�_�^m�j'�}
��~��o/N�o8��/g��O�B|�T��+�.�Y+�tUȅx^�yU��B��j|���NU{Đ뼎�kYfU��*���e�{V5���.�g�N��*�5=JJxtҵl�i`��7�K���廵$��γ#�R�=m��Y�׳R�iQ�8�U���j-��&��l�,mӳr
�r�ʲ]�Ƕ��f�?�J~+�|�!��5U&yye��/>Q���˯��<��f+eaV���Mn��1�m�u[5=��L�f%�8�Y�ҽ�zr����k�>��/�H��M�x%�`ƺM��H������1x\M���jmV����E0ySiމWpWf�i��p����O�j����2��P�N�r~�"�f������l���j|)���,!�I2?:BF���d��>zZ42���2��"���T_�`��x~tt,�^Wy&�O6E�nQM���V�[)^�_�	�E)��v[�Q|���ߜ�<}������?Kξ;}���ӗ�)�Y_���b��&�z�����2��J�V���qf�:q3��`U�ۀR�|Q��l�F�T̎a�7M�E��Tp��L}a������9K�F�Ħ\{�]L�4?� �vM)�#�ᳪ�����J&c�|�gÿN�j�.��#�KT>g�9����:�yg�qd�ov�x�m�@w�	L5P�r0O��`�0��*�Y��]RgHTW�E.���5x�f���T�Mu��I-�o��WR?s�rUᘷ�y���<���i��y�E�J��bk����-X��l�i��&�L�lQW� �r4U�������-ݽn��>����_�O|�lj�߰�g���܏��c�	6
14X"w�3�+X�]��C'��x�5>�+g���d�U3p&�	𯓁��),����_G��_��n��:��׼��B��ѴF���\�cm���k��(���h���p5xi#�O��H�\�'p<=Gk�@��=u�xL8]�Vi)..��..�#Z�z~H#kpA���q�N��y�mڀN�{%�7N��!͑�u�T%���(�̔h+X"6�]o-|��1�"��#�q|�jCA�a�!v��,�\Hp֫���[Κ��)��z�i
�m���{���'��z�] F�.'uڤ;mC2�5���,� ��@u�C�AH��E[d�~�}�T�5k���#(�
"�N�REn�|ߚ>�J7�2�\\ Dl+�F96W@�r̽N�:c�fm���+�JC*o���>1MRz���{��V#0��z_��']�c�G�3�J,���}���Ջ�� ���iF%���ד�)r3|�C(�c�����t$�1��'.���s@�7]�}oE?fאį'�a��a��hݷ�<�/�z��(��G��0By�p�D�Ks�p�q����@4�l��,0\,N����A����]濝9�`���XtKJ������E�~Ŭo���M]�8�M��d?�|��DO�]����M���57���+Ι�;���C0���@V�̕�UUx��T�l�E�:���wJ��F�O���*b��E��WG
+,(����~
8<�	�qxYz(�����L�b|m�4,��i�Fn0��V&=�I�	h�P��ee��=����y�:&ç�(-bZ_q��k��GvÝ��;��A���j���D�]:㽘�i���t�`�����x�2�Sp�,�95�p�{>��rL|��o4�S���@��\2c2��,z�7y�ΔP݊d;�[��JLY ���^�q�=b����E`��ypPv����g�e8�J:����`�'0=�E�������m�b0!�h�ܡ3A.�4?(=#�6����})|�#k�c���Mϙ����>`���z.Yg̽%�Q�n��&R�<Bp��ES]�ĸY��וM���$�H�6m�th!�]���)�V�kI0t�T� �% "Ẃ����M�e3�
�P���2
�_ǰ?fR��R#���C�ѧƁ�"��ݺO!4�U��]��	����G8���DV��Z�uu�!]���:6�Y��f_U�8�q4r��z@�!'�
�-��l�L�@aX�K�5�Ԙ����	yP������C���Sᵁ��6G�6cs�1.��An�	���%�rd�7?�]���O�j���|6��+n?8
K%5U�|�3w��,O�/e������7�ͦ|� -�fw'i��v�dk&�<����AD��Hw?v�J0�o|�Y�)3�C�\��\s�3��.g����f:I�$�RE`��n��N
0~��X�]P��O�fd�AtsʷUm8�>bH���^����3C���&����h8.3UPZ��,0��? .Fg��
�TG�$�Y�i@νNA�@k^���|�;�!!޼�1����8�Y��Ez[}N�o����u���s��2�G�c���̏>X��f���Y�.}���}+�c��g��9�ڔ%Tk��3R#��.�/��ʪ���Ҍdz��@B?#�֘ϱ�Q^���j��@�]VIFa��3�㟔I�@B\��w9X"���f�ͯ%�P��nж�k��h����&�O���r��1��`�l- ~(���=T�>Z���q�øC[���?�$�0�����[�u�u���3}��<7�� O��.�����;Zuy���릓s��Zt>֥A���ͧ����Ѧ�s~�,8�}��ll��ٱ�d�٠ګ���.@_�9w���x�2���`lLA�P��3�`ޯb� G(��*���S��h��N8(��o(�
Va!�qS����,�D��!�v��T���)J�)�+I����d+�2;���	y����
���Q
昺3�}��L#MG/z3]}٤����;����D�X�H�,bQ���`9wR�{�|h����8}�-��������C]Z\?O��C?���,4p�˦�}���D9�`��*U>jcu��M�٫CC4=Gȡ2ƀ�f��V�ի����y��!��ʄpF�|�m<���L)�ϔ*��ګ���{7jQH���G��h��0�M
V�
!"|�%)j��+̬ۚ�n�+d��-����zn��-�~2ɺ]�3��fc���o�q��VL^
+��B��6g��w�&�%�
���C�	Xq���%��m���9��Y�oҚ���w��l���`%7@)毖:��4}N��(�z$�g�'1]Z*�2��������8D}�]Yv���f����ƼE/��*��K:��XR����]��c��@�G�D�&�	���̶�	�Ғo���nҒo��V"r7�(���"p�"�ѫJGH�
�Dc1f%��:��f0��H��-1�'d���U�F\mD��o6uGw�~�.E87s;���|<-@�Ƥ<6���0�q��lj�Z��ֈ
MP[r�A���Ѱ�������_�v��s�eƿ����,8��3��m��@-a�+6�6�����2.R�,s%��S��T�=���$|/�
�V:qog���c�;��*�+�[tߥI2���(L�hА�^b�U? �C�Z��V�V����sמ�R�n�W��#Mf>̚�NM���^��M�d�܀�C�p���q��T���<�M�UCڬ�j��eK�\*D�i��=���
�+@R�t�w6�_LΆ�9'Ԉļ�����lCXhHəjig��-ۗ132@�+)k0@5�XӤ7�:-:���M�}������B���k?6�!,�"����q��Hz��t�pSu�\��1x�k�XAv�of>�k�B@\ b�h́���ѝH=X�p�^���pު1�
��r�u~ⱴ�HR2����pÓ���j�/Oǚ(� �9F�Eu�����Z5Q㐝��t�&�����t]�9l����{���2����
����z���M���̝��a�=/&K�p���"-ēA�Ct����s��Ű�E�T�epF��������y��T]�����m,�1��w��IP�N�J�G�#XK��}����f�g6>o6��>	�����5�{
~6�dx������XQ�t��6�s�ra�4��f!�db4�bC�$Q�%g�0?������&m�����XL��֥���	��{��1�iJ|u�L���2�ۭcW wD�rzuL�`)]o=���:9l��#r>��^\�NI����Q���7 [�VD��*��	�k��r�ln��9m����B�|��ē��h=`��Z�f��]`�bF�u�=�'��z⣌���ۄE~L���+}�a�A�_���.��K�h�Q��k�Yz��?z���u�ճ��h��ȩ����g	./�0��@�����8-3�Cπ�]�0_���~Z�s�
����
L�a(iDj�zh�7F_�Tu 0��@�2�p�ۃ��8'���'�v&�C��r�'�I�k�+�-��硶s0>Qꓑ(�T��8g�x^�y4������	�|�Ep������}W��	S'�b���?*�q���a�ķ:�^�4�ͳj�E���)<���\��u��u��Չ)^�a�]`����/�[
�z��q�J�P�q�c\
&co�R#>P�����t���{�L��Xx5~��~����0�j2���q���'�t�-���Ҏ��&���{��p$Dp���z�N��Ƥ_�{�?x �8>?���{���Yˉ�	���y���{�^���'�=���a�m��Xy�9�5�]>�'=F�����2�x�|I_8��+��=�:�*P�ɩ���e���䱌���s<=�����hòj�a�d�iԲʶ��x���_j�?2v�ؼ�@!��}|����ȸ�S��x����a0��%�PK���Wly�E�>|.pip/_internal/resolution/resolvelib/factory.py�=ks�Ƒ�W ��	t(�v9u9^�r�z7޲�޲7q\�
ɡ� -��_w���$u_�*{E`������3��]�ɺm�~��ճJ<َ�zhۚ�u{{[5��+?p�O迭n�m�v���%�e�,�ϻ߾,^|���ׯ�nN���փ��U��5�3�����rU3�����7��~_v8���ܳͻ�S��톪m�Z|���ud͚�o��ݡc,��ǘ=��./�Y�i��+�w%!�dճ=k�f���/�j�yu�غ�V���WO�c=ǡ�u�7m��Q��6H�9 ߴM��GE�BH=�m}�`����Ɉ${
8�����+`�ș����^/���f���c5=�uc�׌V��\�%�f_�h�7����\��e]���e߫�=�M9��`8�����>v�m��]�(����).oϪٰ��Ҭ���^a�V<}Ec��7��%g���-�
ۖc=�������k7��y]5w
�7�8/Ֆ&k�v(M�y׳���Ͷoś�,��s��Џ��Vb�
x_`�Q/�fSпNA�ֲ��r�-��l������@�t�Ī������W��}{_M�.	�|��VU]
�b(o��qm5�Mؕ|�t����tk-�(}T�x=�������T�~l�T�ȿ�y/��!�X�
x�S�S�B}��4�l�u���A�m����{�rS
h���ap�=D��IԸ��˒8�bmK�ɷ���p��4>�e��n����
�Ľ��u5l�"�֖a���A���?`[�����[0s��5��1� C�n�gB�s�-�ixQ��e��L���E���<usT<�R�ٳg�y�"^*$1���eٸ��i��Ҏg�t���<DG�9x��)ā
� �ߵ�� <3΄����rA��7�Z*�	�_màH=I0۵�[R�ܫ��A&#)@���(2M(���\�j�Z)�Z�~S�پ�c���G���E�� �`�=�k�ܘ�0��H��������k�J���m�=$^�\,^t�c~��ni2��m-�iůI��y~s��m�˜%��C_���IX�p�*��k���ݢ4��y��d�Z��
.�f8� �k,�5z���u��;�}¸��r�x�����/�y�WcUo�mY�#4Z��:p#qU����h�*N��ͤ���ر(��!�#&�h1��t[�X��c�k7������W���I�&M;�댉��r�%�fN[�DP�uZ���:"㰠�AK�Fz�qɁ�{o��nZ�ԇ嫲��E�q�8uI���z�ɇ�V���d��*2ۮc�ą홱(E�<^qp���*���'�~A~TD���69��~�46�I�Y�Ȩ߶o�cfC�v��(�uj>�=���w�����=�l6;�Þߢ�I�្��d�D+�m3��m���SC��؏"3bfњ��/uS��E��%>" K�-;���BP���-[��9�����Dq��'�6�:��G�p6dA�!c3(F�Dpgf��ɘ�;���5&7i0��|��Ч{ӣY�%rs�lK�gL���Z*QJ�y�q�G�����E�M8�W�G�f1g���F1��ź�(�3�O0i�2=�S����Q�{�04b��=Iሲq�;*9�&�PM)�'��2�����܁aG�z�\�N:�VS?pc�\����y���/�'
3>I)8"��iDk��_�&Հ+6�+My3xlASnZ���[pt��.w\�kk���ϓ��$�!�a�ϊ�6��V��	�CPsؗms�Z@�G�È����1�q*qo��������yd�)�5p�`��4�k�)�~�(4����(��la��V��K��t���{;��f�S��b9��I���ɍC�iҤ���e�Aָ^�#K(�c7�뫛Er}`u�>�W`X6ܤ�<N�#�!m�|L�e7v�"y׏��\�'&]�YX�K���q��Cq�1�8�Qy�F�*+1 z�N��oq?�������M3`���<��)�)w���Qۻ���4��g��4[3�)��N���G���uSm��)���6����J��|b4�ff��1'�+f�k���]*k�5J�6����C*-@�Z�4O�b=KX��z׶�8�Jm�X)pֳ���?O0�ג��ϭ�_�ێu} ho��/l=$�i�0D���'�5/
>����Ŵ ���K�Y?w�ϓ���$�V��6o�lj���o�_}�k��A��ڠs��8�gcBG�F�1TF�q��E�3���ϛ����,58Syക;�����
=����l�%���3%2
`HD�i�HP������@�a�m�&={�;��&J��)����z�\^R���$���9�Cو�$�!��Hx�p`��;� `�6)v�=vr�w���ps�{P�T^h�T}�p��؝��n�.��H�~
όR���S�8�j�:B�V��ZZ`��
���e�h� 4c��q����iA�޳����K4ӳ���N'v��.]�B�@��R��ٔ�hw�f�9"�X&wM��X֋�rk��!�o��4��/��M�x���Ð9(�f�@�{
��u�
�P>ֆ�er�)V�[$S�>��V�X3�R�6�t��<�p���4�;P#����D�a�:�l��[[����"��l�@�K'T�C�0p�k�9IS�<��	`�;�N`%��}U&��E��]^�R9�_�
��5���^�A��,�n��%CB�j�A�!��"�!�<B��Pop+!��EvR���>�7�l���d)�Y.�H���G�:j�s����z�j�S��%��]����v�c��w���!]�pQB�$P�K��ໜ
ި��=��+�\"l2�.�(,Ff����3��91N�I
b%-:���6��~��:�Nے��,5��6'�	~N��9�P��g2=F���Ւ��>#��(Vs+�\2N�
�iG�mD�k���AT���؊u���.a���H2�K���3�d��!�f\3m
��������
���G��Z��0{�����D�\(�9z-�-���u�<D'��oI�w�=�D�},m��q�
I!���ۣ]ĝ?k;�@%$�p���m�Ǝxb��&0tB�4�+�x%��4]ѡ�-{T�o(#�bUS��qtC�뀘�:&��{�
iE�kG�ֲ~(�؃�wӲ�-�g�_��[J�>�W]���_��Ysw�"cg�[n���w�6����ƄB�Jeɥr�[#�l[e��Y,M�����W}v�m�9���˻5K��юWϨ]�z���T�B���[D�bR��u
kb���rh�
�J1���g6{!tLЗ'�����&��;�1��IiT�{f2d+=i�!�ɚ|3�k��ᠻ{�>q�-
��?:/�'|Ͷy��0�ex3�GzSV�>���d]'!u�B	���HO��km�q!QG5�7��.����wE��|�=�P>�,~�J��(I3�����E�W�m�F6"���Y;��n�R�ک�9^]t}��46�f��]�TJ�~��|�]����F$1p"%{Q!V�����N^���IV��&*��A���Y(D-p�h}����E�Ԍc��Ԥ9�G%v0��Cj^X�DL��"�4�'�^���T9�����Pc7�*��X�G6`����$�E�����/���Ϳs��	Q:���D�_|����Yҡ��/6��|
�����dӊ�!Q�>�@���A��BT�ٟr#���u;�C��������.�F��s��h�0��	|����h�{�8mD
�BZ'�����M���t����	
�e�3��/#w�~��ȝ�X7$)lomE���JYlG�B��0��C�=��s�{�s�#��*��i)toI�!Zt�{@�6h�aD���s?��WfM^�kYp�}�a	���9$ԻG�&�q_6C4G��8��Rv���kwK@zO����g8��dr�ؕYڇ��/sA�b�;W��a�R\�+H�� /�`U7�(MаIg��nw�(�Z�6�s"!寏��4w� ����߉x@M���9x:�!�қ���ָ��*lz��i�u�v���6hQ�av���*���w̻E�p�mvq��w2��G���v]�tjA*"����f�h�����Ș�"%P&$���l�K�P������c=��N��!�'X��P`#rt��u@�Ƚ9@��<sT���
/I'�R;`�������6F�E��H���~��s�)�z<Y��.J�mP� mU�IE�BT
$[��,u/_:��"��(���B.E����OI��K_�~"���J-��G�7�E�Ρ��:�)��T��+	{*��j{�T���.�rd���:/�#"Oq��w��n<uz�t>J� LJ��|��vFR�.�9���:���N��J�"��H�$�6��sQ:_q����4�m�A���>������ȁ(6��L�X���[��G�/艳�`U΅�j/q�k�w��� �%��ős�@8����0�u���=�)�v6bD߫�U�5��Ut`aU��`��wIf�0��a%<2���8���i�E�V�#we`�t�����(�$K4�Fko�@�L����"'�s{aK �<!�{-2Dӛ"�����H}�:�?��P��=��L^�`TM@�L߲p}3O��?�.r�K#Y3��ib��q��V�5�1/Aa��V
l�5E�}������z��ؽ3�/q��1\pD=���',�D�g�$��0)��d��"
�F�v�>ְvu�F;0�%�E���	�#ME��*T
-TT�NA[Z��\D����ʶ�$Y>$�(���K����'\�I>�M�3�WV}�_�m'>�FHG^�.�&N���Y4��K춾v`�rW��[�u�@OLc�oG/�HQ�r6E�0`�)����Tͫ��n137��Y���"�ǃ��c����1������J���F�c���ƁŠ������ZdT���s��B9���{LM�5�n�P��*�j�o�;�@KP��H��D��l�+Ғ`qn�ّ1FS���=+)��p���E�Њ���x%b>h�gĕ+�6(�	��� Ҥgs��3�8�o{�G�'whv�ȩh�奮82��ܘ	��a3h���jS&�"�VK�۵��qUѭi��S��5�]�&|-�.�
n����j����ƚ�=a��ӫ�8�w�Hz/H��j-�UIS������`�5�s�䟐�q��;�s:�#��N��d�k�cv��튐�H��d�{��m����s��H����+��w�x�����&����l�oۺ�?�K~���Oc �)���x�bƯ�7r���
dՃ����!���L�u
K]���o�.;sӂ<�'6��P�6��'u��2a����'l�+���:6d���a����=XLAU��?�k���l.,��ڒ�4�3��,�êf�=4u[n�s���c�����C��rwa볋�߽{d�=]�`����C
��
�/��ZTo��:$�(���z�P�
P����E�^G�3� +",��Bӆ�:݉�q���K���=�v�;��*������_�r��N�Α/z&p�]����tb�����K.~�!;mGۡ�	G
P�N���m?LP��;G~7g\NlO93���X��j��PPl Q���P���>cQ���*�X�+�]vэ=�:�耳�I.��W�x������-��A�e���D�	�t�H����<0蟦�>���ɡ�#�u�w{��D49��*����������nW���팹8�J�l��t�
�ύ�f�װh��,-,���l?׺�v������lC�l�V@

kx�dT��%')�����a\���b����NH��p�k����KM�P[�%��b?P�~a	29�N����kf/0ذ���,�\�w%�&���wD���C������K�����CvO�qp�9uu&�\)Z�
��\����H�eD�l�0�i��TK�:+n�,ո��:�)�?*�]�#�ؗ��T����
|r��I��̯�U��M��K�y<o�u��4�K2R������7��ics���S,W[��bW*‘�`�S��	�V��r��bM&���O��RS.�-�?��s&�u��|f�'�GS\RMɖ_�OV!��oƘ魼��QN�Ie95f�(���Z*�A������N:8�&@n���r�(Ί�z�;o�De:^m �tvz�>d�~���s�P1ɔ7�	�G���,���LZڒ'�*N�l-�*�]��!�bH�p����b�1��W@�r��f'�y��j�M�����G�͑n&���zLX�q�珻���Ι�C��g���TO�9^�;�
/8�
��\�8�[����<����ܜg_�ٱA��U4�rbI��GGPg��<g��Xx�9�^���y��pf7Sd= 2��{��¿��nLL�U�
��^��X�3��;↲�n:�����5��g>��CW^uUwUq>2~�������x��|���|��O~���?s�`Q?��0�=:UCE�FڹX�z��G<R6�����V�O9��H��6��������E��>xz�)9�3R�C��Vpj�&>=�3hptb���,.���S��tT*�˔coB�С�b�<���u���=���J-OWQ8�D�!�.�Du�W�߼[$?�#���o�Qfԩ�Wf��}F:���(j
�I2q&��(�S7�i�W"��9�4���/�
�B�B'.pK����xL�13�m�7�(sD��[���\��Ȑ�^�����1���:�kǕ0�Cjor��%{�ʏAg���ݷ���Sq�U�O�c\V�]��i}Oam��(��R"��&�\ �m�trGέs��5g����qj�lCsLkT�Χ��a=;�|����S�Ɩ���}3I�va�5����?p�'T��dZ�)s�79e��k��"�!=A޶�gM��g45)�{^Xk�Y��Z'�q�������[L�>T\,�T\i*�����Z+fn9� ��4W;��;�tE�ܳ�,���`��|��,��\	���<���>tW� ��a_�#�f�ӱ����d,������&��r��nŖ�X�da��״M����
.ڭm{�M,�(1�E����	�A*��;0�&����CAv��Q���sF���f�q����
�<&����ˆ�LRR')�%��c��
���X�~++�i�	��n��,��l�eժ2�]�h\LMbN;�\.�W��H��bo�y��t��&@�zq��Ū��<#�2f���]���y.���>��Lk]Y�.�Ux�j}@I|�9��xi@L0�DQ�bM�e�y��G�Sa#}2lT�g�R�s��u�cЮ�奈ߊ�c�*/��������4!���R:�\EU[�g"SI�����@�~l�E8�s#̺#�� 1�Hmo�f��и�l�aUm
N[�pdb�x������89"c\L¡쾞RI|�"��j�3����I0,�N��|!��v�cH�0ɍ�$�z�f�B__$F�k��@�%��2�O'�9�i��ܤ��wX��^�s �\Sl=�������x�	g�.�/�[�ˁ�,��J�z�YӤ�7��b�6U��P"$DŪ	R�f�i�1;�6?��c��6ba߂�Y����Ÿ���U^�W��Šg>\
mW����ƥ�I�+��
+q���K���9�'�PK/WUW)�Z��I7pip/_internal/resolution/resolvelib/found_candidates.py�XMo�F��W,�C�@!��
���MZ�h�n��h�Z[����R�R��.?%�ѩH]$������͌&��oN*�$Y�P�G�v"3�:i����҉e�3+
]�yEg,#˛^��E����lKf�Ld�:(�<��X�;!˭V[�QA.[��{g��ϕvT:�*<�������k�f�V�&�y0��,v�ri�����r)�IÅprM�
mN���!#`�6i��ᖨ��-wl��g86;cX��Kw"�w�6�;���N��z+�N~�ҕժv��(�ډ	�P:̓RmT>wk*;�,�O�YvH���
���dErSi�DQ���Z!��L+E���*�ԯ�WM�3�]�6�]���mr��۳���0���\���t��s���f..*V��9�����+EQPX�*N�T���U�ݦ7lgk|sO�&��{8k��W8j?kCE�eN�����$\x5���yu��
��\.�T1vq	�ڈt���=(�HY
O<��Lo*�y��[�\\t���@�N��+�Wm9�WK$���j��J���i����8*��xg:�`ٜ_��h�t���(e(-@pƥn�%�;�HL^Y�r;�̅�ߋ9�U�
�w�*�U��m���7g?�Ҟ
��fr��W63�r���c��_,�/��[���+�a_Ze"7��l��2��
b�ٜEQ�S!	M	��J��.:_�j9�O{�>�!2���7O���;1{}
Nd�K�E���\[T��i��P�(U��|��Z�dP��^�Ͼd{pLC �I%�-%�������);�x�^p���f��Yr�Y�	�n�rb2�[B��Bu�\����ipwYSw�
R�ڛ[������m;I*����&�i�O���!.�;��Ie�aQ>�Z�T,�T����#��6ѵ���?l��>ǜ;��K�nuucҜb�C���tmҫI��
1�d!�u��
�G��쁕�}Fh�VV���c��
A<�`�1����׈��U�A��k��5pـv�"Z�R���a��6%���ġ�X�n㙟smЂ�0��F�뛵/-�\+4���8
�*�tY��D�=�h�y�h�����us�(hǼ*�O�MU����ЕyZ�7�a�����tG�nCO�y�ɠ�B��[bq������!NOZ#Ʒ?�N���ٗD�D/�	{O� ZB!OC��r?�Q�e��Ӄ�p�1����v�eTFo%(c������t~L5da�	�s�u6I6)6Z�3��q����m�w5�B�m�Z9	�Nn��͆}0�2��IX˫���A��L�2s�_�y��	3p놝���N�������Ȅ
�#5^e�p��?���"]�L�$ZRż�vC.iZ�hy{��,��=�u��k:D2�_aK*j79E��m (d�Q2[����p�b�yO����d,��فޱ�^��h���m����o��Q�}1dƶ-�`�B�-vlX��ݶ�	�K��X�}6hj��D�ֵ
�x�(t��D[�F��T1-�^����,�a�S�I�%Н����$��S���d6%O>!�+!�{����t�Y�o7ǜn��&R�	d�o��3��߆�Y:^o7 ~NmÈ��w�н�9̟O�Y�cz�.�#�l�,�"�~��+S'Y
�����ʏt�b6S�0N�}4/}�r���������YZ�ѿPK/WUW���z�`&/pip/_internal/resolution/resolvelib/provider.py�Z[s�~ׯ�h"�2���M���uO����l��x(H�d����ʯ�w@�$�&~Y
<8�;W�jc�6e�֍6�i����hc�N4�ZW[�'#��۟o����]�����?g|�F��t�(+W�J~5�_?Ț����/{U���Vd���3��t�y�u��O�*�ͬr�|R�^e�5O�Pֵ�]�\c庹	/�l%�ja^˪Ѕl�L�����U3��j��&\Z���wW����������~|�_��z{{��ջpe��Z�o���Ho�*����I��6ʒ�>y7<ƻ�l���X�1��7y%g��%dz��{�+o��
�{qd�3�g`�#U:5�,<��+�֐a�j�U%��t-V�yVʿh�8�_�<3�t4����F�ĺ��)��^�6�%�R�[7�����&��ã�NXSI\o�(�6b�˛k�+��X ��Ȱ���>�g�< l�x�ʃ�ACb��0f�Ɲ�c���5��.�V�f�O�/�q��(%e��4φd)��t�A�����wVf�?�HH� �FW�ڛ�ⓘ��fb�o��#���d
�i�G�w<@�t��=ɒȵ��jLAz�D-m���E,A����k�d����s��|uX�@��B@�g�UM^�q��ф�="����ӥ�,#�(�3E2@�_8T�W�0�v;����Z��6f�F�q���C�n�_?�� �J�G�lsh���O��2�Q���b��%Ҋ^#�r�>�r�.�E{O��.
K6��V�<�N��h����d�f<}H>�`4�㈜@��6\���.�|y��u�Q1�}Q��s�8��l��
ʍ��ڗ��7t�g��x�O�5j��.4+׏r�D%wJ��<�떶Mm�f>K�>���#�W�zM��*`�燐�i!d����
h3*�?�-�~ ��L��C�8�%0癪f��_���B�7���ʑs1�n��ˢД��ò ~aRY:Ä��Ž�
��ץ�3C�}=���8�9�]{SmRV�VkY~K�O{۝�E�{y%��|�����T�9�<+����_?��Cb�H)A�E�E@6~{�����o�]��_CHKΎ�E�GP��*��"
P9����RB�,GqPn&�
���C�td*��j�X�d�R�#B�Q|G��\T�^���n�n�_���M��˽��m�P!�����\�Hsp0Rʔ+� �X�%n�dS�+T�G���ĺ��ɉ&�;r�qz��>���
^�0F��""nt�v�^;1����z��S:Lz*�s�!w\ C�m_va
;$o`2�&�<�w�|�W��E��5y(�Q���zd��S��3��|�H�.����[.������B��l����� �
P8�������<I�t��iY��u]E�:u!H,�D�10�C��E��J7y>�xT��u�Bٝ�}x|ӳM.�P�y�>žT�ʘ2�+�+/�z��H0R����Tj�&���aъ3x�:�"lwB������l�4<��K��ce�+b�y��bS�ܳH�p��(/5)�nU�9O���6��!�&�i'��w}�<�33
��%�s�2r��u)u7]�sғM�'��g��Ld1��nX��]��:w�N�C_x7>9!�S,+�8����
�������q�5%hk�=ʡD�DAE�a���g
���C¦?Jl�y)2ؐ��y?�Ქ��ځ�5�h�&I��=�Cv	��{ܩ�ݢ�E��v8��;8̆��x��0{S!�Uץs@��=1�M�x&T��Dm8��:��ډR�Q�z��,!t��9I�� dK2U"��1����Tֶ�.!@yJ�b�X.Exl�ː�M^<^��5��~�9��a��2ۓ9��.
��0�
JTOOm]�y�d
�-NС�m�Љ´P�y���ɐ�ES	PN�
VMk�$q�PR��?��_�24��t�&�~�n0J��
งt`1�"��ۡW�f���щ/�_wf��9+zVeY?�U�K�HZAR��1��Y;�v��n�J��9L�4���E9�

$z�	i'IBJ{�鴃Wi�!�7����rW�V�\e��<z}��˪/��o�.&׬��A�\��f�b�
���7n�^Ŝ�����Y�*��fT`:�r�j2��+5��9���C���8��/��W]O�Ħ/�s�*5131�F�Z���w���۬��&I:���K�4!BYw�@t��24<�az��w�����[$����E�|����w�?�kY��b�s"����� r��(�q���Ip>N�&*��$40����S]��|���y��Zc_$�m����ò�8���\��}������'J�wjvI�U��I���|�];G��G'�ɽ�g������Wx�ٓq*� �4��8vN�*���ѝ��	-&�R�߻}��ާ��r�$M���^
��S�%Y��q�J�w1�*�8_\\#���q�|��CE��=w@OF�A�-�ߏS
hhe\&);L�מ�tAA!��睄�д1���R��u���;<��~Ws��^4@�w	:�����1�����6������޶�4sP$�6=2s�Go�]>x�3ﰳ��Ít?�).j���z|�3����0{)�c�)x�0�ߝ'�e��w�t�e;7�%�hR��=H]�Y��0��Սs�u�*�LQ��҇�9���'I��~FBow�~+\B�ISO��p�vZ���"���OK�u�_E>'��v7��	E���6K�,|b��v���Ԟ�����=\-͸/nyӛ�Y��94UҗV
r���$g}1'�ҳ|���h8[��]�\^\"K�r�E�)��2�QC5Q�7���:\P����UH	澔��NW�lh�a�?�B���V��q�y������">�Bo.�����2���7��ߩ�6;	y*�a��3z�����S�d駉[���h?��<�J���B;L�i>p��Uf�#��49Cwq��4M.zcn��8\��>H��LV�bB
�T��N�Ef�|G''������>r.z��d5���9�x�
)u����d��
�%�-�Ғ�`�k�=<�Sɹ]�;?��$����#2�ԋ�0���>���j�ۜ-ѿg��k�<$ذ݂�G�ɵߍ����4}~�՛#da$�N�"�d�<���PK/WUW����/pip/_internal/resolution/resolvelib/reporter.py�V]k�6}�_qq	̰S�ЗbHa��(۲-��.Fc_Ϩ�%�$'���=�Oڴ�&�d$�s��kJʌR�yi�#YV�zʹ����g�����{�?`�m���d�>n�E��JVqz�:76�쌺g%w�7����?t��i��Z�%t.s�yK�S--��A�At9�[��%��f�ZeJ8G?ɪ�^O�6Ɋ�oJS��OӵcUl�������',C�Y��Z�twL+�݉='S�o��[����ID�X��^Z�sp��������Hh=[O��tH����J��J1�#�MnMA�;�M\���c匀�R3=dv�~f�Jx���2���/`�13.�_�m�r��Id���p�����%G��J��ܽ�f��
�*�C����T�Z��~35�r���deͽ�yI(@)V�B�ّ�>��{�W�'~e���u�����,*T����t�r�yh��X�X��a5t��2Ȭ�0�Q���k�#�zh��>��[8�n�+o����q}\
]��Ӭ�M�o)�>#�I;���d5��F*�#�������~
�`,��^����#��Ʋ���tV���(��稡��ԅYG7���Й��=^���¯��w9�g3���CA�k�ho�h�\[4Ә�-�5�Z@m
e��Y�L���!��� %d�I$>��D�q9Ǔ>ގ���Wt�]��9��Nd��c����Δ�5vf�E5D���g{HmK�<�ά�>�'�v�������6��~����IXL�8�&�5;��%���uo�yZ9��&�{�:�����.�(��R�J��E;¸k��&��������.����H�
�~���p/"�6��9Vj�y76$F�I��_����M��LȐ��T۠%L&L��M;C<��i�3u��,#��[c�uD��d�J�7��sxY�Y�Uf�sl�ÛbY��(q���L4�u[���W:z��w$�PK/WUW"O�\�3pip/_internal/resolution/resolvelib/requirements.py�W�o�6~�_qU_dLڇ��v+0���A ��9fC�.I%u���;��D�v�,*P̀!��}<ޏ�wK�ְ᛼�FY)�oXy�.����K��
�Fiv#�N��%k�E+�^�5�+V��3(�T��~��44�����%���y����.��T�4Ą(h������jf�A�e���]��?�\��m���n�k&+^1K
��)uUo2�D3X���� �R0c�͗��%���4z��&@�
�P�v�EjP,�m�V�n�)��JF����-�۵0��&2ٮ���!h���n,�Mc��!�[fo���z��I���B�׭����"���F�"��A��v���P@���4�	������N�f@"V`U/L��
;E�4�͞={
���T�ֳ��tz���ȥG�Z+�@�����D[�+᳦��e>�;ln
�,7�BU��>�7���Q��۵)�Rݣs�|�`�yL��4�T��+:�_�ArF�t��DRYzo)9�sA� ��c0���㾢4h�=N�X�I ��`d���T��J*���x����<:�4��oC�n#�dA(%���s��a[�oN���$�x��>�����C;
~t��Y/���&���Z�kg�R�����iʿ
�C�%�2�=�<�3x���G��<Y�+4�[iJ���V!Y�k&�\�b�I7ܮTm#���.$V����F&]9�d�e-�����	�.�xŮ1�Z �wV�9m��|֥���|���3>��R�%�M�,�^��|	e����^��r�3�=��e������^R`�o �g'//��$�	��q���u1<�7i׿[���'�e�)!igS�.-;Ϲ�6&H(��=���m��]L<���-Qlw@�n�nP��r�
���ԗ���
u�Ą��+h�W0dH�B]�2��Q��| Ò:=eb?A"��\�Ŧ���P)�/���M����ϥ8�@]��wф�$,�> �\B�c��Yl���ek���.�x���CUBS$M>F3МpA���N�BJ:�r6���i�6���W�����`�/�y��Y�n�R�k���(uL����tK~��Wxd�W=��
���b�t��ʰt�X��g��,�^G��=f��7�~�-7�����C���*n�4G��oy�<��k��+�ZȮ�k��/��>���;����mWV<��&Z�[�cԡ��y�`2oڽ��@2#6�������I�v.�B���v���u��l��G��]1�.��l��<�7��1J-B@?߾�)o;�;Hkɮ�ӧ��{�Ǔae�����d�cP���-'�PK/WUW@�q��01/pip/_internal/resolution/resolvelib/resolver.py�[��6�ߟ�up�]x��@q�q.�&i.h�I�ⰷPh��y+K�(e����͐�HY��~h֖��p�͛�H�ǺjZ�Ue�>���δ���ʬ���E���r�Vf�k��hO5�
w���^>M���㟞��l%��]����_�VW�,V���7]]��ȤigVR��$}�ʼj�Zf���K�VƋ�dY�:����JKyT�3e���N���Q�}U�J���������ⳤ��W!�x���ofbڦ��^�'�QY��g���5l�2I&����?(U<�+SCu���L*�����|i����&W�j$��$u�j٨a��:�yTe��ޙШw	 c7X5�5.ɢHq?�`��HsI
t����g��}��j't¦'y�'[�"�u�jb��M�^_0e 2�|�f���/�q��B3�D=Qێc�G��3\XN�ñ4Ė�W-y�7����,s��V�ęc��$������L�b>X���E��:
n銶�9|��w}�_��Z���7�ٌ���xK��|m�2���òB��"D�Ҫ�՝�S�{��~�+D\3_�yU�+��*��UNW��� ���tE7��r�)���4����Q�n�r�٬�"sf�G�p���$evY�<|=��0�(oU��xfuF���I�n��yc���eը4W5����0ĭ���HMZ��CU�G�&�AN�vW��+�Ӛ�����`豫Cq����$Inn�R٩���X&�S��-�J�c@���dU�}�m||
��ٍ<bhS��f���xx��M�=�a���\����Q�_�>�f���d16����e�	��aW�ig�؜!%����Z���1�_DSU��D�ήσ���Ae�)P�I%O��.v-���w��;DCV�%T�@�����z�l��Z�2�&L�#�[��p�؟�V�a��J����	�����Gn�L��,X��2�*�/�1:d���/�WO_��ⷧ��'O��ٜh�2�*��4�櫊uT[����jZ��;1�g�uP0ߛ�}>��wDb��ڦ��6�X�BAˇ�.ͪ#(�C:^`�2�*h��#���q�F|��7��E������b�+s���"��ՇL��䑆J���T�T�8��s��'��GMl��|j��A壖�{,r1����Fj���Q����f�B�i��L_�{@8�J���È;��=����h+�J�����nʴ�{Y`}�M P��9gz��5F���Ս�"I0�%�/�0|���V�CM���]��.%J�[u��t�?Tm ��^����� �6��b�-T0âȺÆ�&a�,&� 9Bm���W��b�"56�<ns)������|��AL�'�޻1*�w�_�|��0;,bT�~<����>�2{��+�j瓭��	�!��Xnqک)������`6��I�����KY�cFax$�#�bZ��}�X��s�G�.Nc�]:��?ͭ��&���=���:�C��e�}���D�7L��!㉎{'��`BZ�F°AQ+Ů�{�L�,�ك"�]�1@�Xמ����RMs`j���z�Vi/n��y��.����۠�8GF���=��}���<���bUW�C�Χq�)�c���mZS����lu�B���7>_�7M7�]l���1S������s��ؔJ��/u4�&U����m�ߺ�8�
�7�n��;�W$4�΄ ?����	�A�ض�:�Q��[��;d���voـ�>|xV-��ĥ\B�#�*��=A�m���ܹq�c{V	�8/s�O&$�6��摈���/�s�vn�Lįf*"�j�Dlz�����;?/
{#0�i����t�Od|�T	`��	���s|4���v3
�1���;��V� 
X�ymրWy����ϟ�,/�0P���:�r5m(��sNr�ߜ��h���4,��PO"�>I̫���d�u�4��v��k�p�E�)�����|�$L��#������+k-�i���q�Gk�O�2�����B�D�m�bg�N��Y��N
o���V[��-���/@�{���&"�<����%�~7/c�_YR�,��	��QI?�*��)���x��F-�V���%�;nV����f�A�f%�v���qmӨ�kJ����vv��3�Y��N[�W�;��v�7�g>�?S�=���,Z��/����A�Q�2���AHA�`"���i�8B�v�����@�	d"���i�?%c41�kH�!ǚ4X�.��4�:��
��|��'(j���kl�B��m�!�.���
�����h�6�����I��슂��ĝ���W�(P��"���Qo����B�[>��'��2L�^L�vxR�l5H8���F��=	�w%����mյ�KmŠ��Qւװtu�J�r�o(rZ��j���t�O-��"Z�D̏a�Hܷ�������Y3<	��c���#)Ԯ
��?��pE��3E2��͠�5rܾK��`0�0��q����Y8X`���$��d�e�~����VI�tSeBOX�zg�e���H@N���"ux�Ըw���w9n�R�Q���7 �W�^ҕ뵔і豪�)��zӯ�<z��lA]_��OɐkzI��Θ�E�xt�I����/{7R�Nf`%Wܟ#���N�s��9
b�s	�ֈ@��DeS����>rw]K�F<@�X7��
7�Sg^0���A��w'�;f���Nݖ#
%�S���s4�YGH�ؤ�L��5(��R�
	��B�:��gT��9Ҧ�+�rO�#-n��
�9�N�zj$1:E�~.�]qz:*_y7	�uQU�0��!�
��,�IA��bx��RϺ%o`��edJ���W{�*BF_�G�a��Ck��n��c$ŀ�E<`i>>`�dh�����>>򮤁Ʀ@_�KA}\��<��b�B'*q�a9�I{h�n�LAnWTJ6�����6c�5�yC��o�̫Ϯ��R�'r��}�Q|(]d)�}���n�VD�T�8{���I��l"��xM=v�Һ�&��=U?�YK�_��*�OG�=�$[���Y2к�+�Ir�;�Y3��3|��K�3j��B)��K��W6�BÏ�q<��=:��6U�f�l�g,�K
Y��)����y���Y�^@	^*ao,�A�b�T�99�1�2Jȿٴ��.	�t�%
�T�L%�!
�t��@+f�%G�E?���C��<�4�A
�5�`��j��e,~�P��%�l@��=<Ĺ�������S:\`Nңޮs�uyŕx4��n^�
��Q~X\�"�.H_\<��l���'ǧF��QU�8�_l��5�V��X���Q�%�:��Q=���l���(�"~����ď��[�E˕g�#���y��������=��&Yu|X�j���CmL��ï}��g=:�4��I���<V.t�[,kQں�cW�E���Xg�0�<��!�������޼�v�@�E���4dN<&r�:*YR��H�,�l[�3�UT{[���)8I�qaooO01!'/_��u:c��Dz�:z�P�O�^�Q�+}�[�&����9��ԑ:lt��ž>���L�n����9'؁-��=�xЮH4� Gk4�g��z�9>��j�|�SeN$���R)����&϶KF��nO��!.�4�A��r"��W٣�3���D�\��(�c�Z�.!`�
��\���=SG/{�k��;�ݩW�����W����H��S�O���4���q+h�+r���|�O�Ns������$3�۷�\˷o_m��~��e�mr"�BT���־[/E��լg��b�C�`�a7��
��J����

�Q��jl�?�����r���4���PK/WUWpip/_internal/utils/__init__.pyPK/WUW�&�k�
#pip/_internal/utils/_jaraco_text.py�V�R�F}�Wt��"Ry$��[,��%�%P0�����Ռ8_��#���%���,��ӷ��N�s���F�����բhH?ICs���I�頑/M�yi!���N_I�nȮ�Z[�S�i&iůϪ)TE����U5�T�|��N��e�<ߡ��dtY�Y)�IV�6�ZP%���2]+iI��y�`��+�I���Ы�
���h���UN���oL�e
-Yek�t%#����B!`����`e��IY�lePJ��3VϽ�%Tá�d�Y��2�ʹ
��B��5q,���u����AX]QP_���z�D����c�B9[��;��*���B����uQ�	!g=k���z�M8hA?o�9�a��:[-��\�\��w�)$u���� vp����.
�Lc�˷��\�l�v�TK�a�v�m�r�����i�s5�_�ܪW�R�§\1�l�@hY���'�xV�%��ɾuN�Yjh�	��}.��O���+S����\#d������\�H���ɕ��Sw�H�P�Η6�(�ښ�	�_��Y����8Xm���*O�c��6H�B�km����M>�M���u�DOi��?ƃh@�p��O�qz1�J	I8Joh|N���G���&I4��8����0� �G��� ��3��SƗq
�tLL����)�]FI���Y<���;��c��
i&iܿ�	M���x�~�Q<:O�]F�4+d}�M/�ᐩ��
�'l�Ǔ�$~���x8� <�`Yx6�Z*8���O��2|�]c�$����E�"���O����Gi�O^&�n�u<�|
�x
S��dx'v�����CM�
_M� 
�p����ʁ��t<O-9�mպ�[�B�mN�*]�JQ}���N=�cзLE��s��1
�4��d�s���|`Qӥ�Y�E�z�d�?��I�eZnz[��_nX��D�rr�\������Q�����;�٦�~|����o+�ϵ>��x&��vÁ�;P��X�n����#�1��t��%�˯ �-��#�1�.��p�U��u�57��$l�+�W���~���.E�o���L�U��R`�FK�J���._��八�uv��
��Ќ�qg�pa�R5��=��p���&T]^� o`�6�v�r�qx�\R���W�b.���AA�
w)�m���*~�h����D��e�҅��G{T��Zj�Ǡ��s7F�C8���o��I�
�����]�.&��Y���!�(��d �1B��`d�m	���/)\y��ݛ
;��}����{���s��Zy.)0I`f��-����P�T�I��c�|��[��G��d�#A\�,;��r�g�B��m5�#fF����9��˪#B"�p�yc�d��ᘰ���=�?��M�v���a{9l$mq��Zæ�|�6�%m��L~��na1�ܼ�]��:�W~�>�� ����_������O�_�}��|�d�д�u��]��=u;��m��PK/WUWJx9?��pip/_internal/utils/_log.pym��N�0��~�Q��T�%\*�J���Z�i�LSk;�Py��qh�����?�e��`���'��m+T���B��+ܣ������6��x����Ŝs^l�Cw�
gL(�Q0/�#%�!�k)��� ����t�$et�څG	���b&�e	w�6nb=t���0���N%iX�؏�@�;��].G�-����;t�
��7����3{[��<���'\]3Ƣ	o1:��	5�ZYr�u	�w�s�0f�Xˀ�BL�%�D�L��I:�'�$�[��:ۮ�:ʶ�MkWь����t,`�6Za��ˠ�/�	)9�ܨ�%R�>�Ԙ\���Az����E;K�
P�P�`�㴑_��op>)/g&����L�l �l�u���7 5g%��zԃl�?���Z��U�!Jp���y%�U��U������I��[3��������n���ff�.+�?PK/WUWrB—�pip/_internal/utils/appdirs.py�TMo�0��W��R[���.;���TcӶV�D�I.������b��#��E�z�5Cn
��C��k�g�
���Ў�5E�xl�G�w<c�:R�i-z���Ҹ!(΃�v��A�DII�y9Ҧ)/ym��/����̕âǦ�/���2{b�`�y��+��c?�AጕɊ�'�qN&mB^cWQ��H�+�Z�<��xϪt���M��5{5�$�Om�^8��TȐM�)�
*�:�,Ǽ�L�^�a�--�����.<�
�7�:Óׁ�0�}m��6L�T'k17��(ӕ����g�bK��
\O�]\�&��~���93���4���0�M�7n�y8��ZҞr(��}��g<$�J���2���5�<,|UG��̫�w7�~
D�Q����8�J�?�ۄ�,DfS��"���5<T��͍�4��>;^�	bu<�B;+&J����L��8;��
+�Y���.�P�m��R9��+��O\����(4�=s�
].#˂8�
���d"�R{oy����u��)���[�O5�������ۻAӳl|y1í�?��� �P��K�0��0��(�`d�_���ߟ����W(��ׇ�����>�=�	��$[R�yXz[j���#<a�"�z�:���<F��oPK/WUW�c�k�\pip/_internal/utils/compat.py]Uێ�6}�W��G�f�u�R�pa؋u7--�$b)R%)�B�|�_L���9sf���ve	�f
^��
p9,QZx�m�$�+i��Z�l�t�X��uGi�QěViBU�ոUf\��DQ�1!���K\��Zf��E<���B�}־V�mw��f���FQ䜢&��{J�+�-�2�̲)]+�����
�L���WJ,"���}X�ߐQf����a����On�+�4B';�Et��h;-����sl-,��G��>�o�1��Ԫ���iv@Y(�vZȻ��c�m��y���nW�lv}��]�����,�6�����wkb���A�!�J%�:Re��9��m�b>����}��f�-��y�	1����
i �G���ݾ�����˱ iqe's'�-r�:�uV���S2t�a����w��,��Ԫ h;RO�vd��f�7�c�
U�]�4P|6��!grba��/#2.��^9�Z�(C��d����j����3/eAT&U-J���6���f�����h9=�q��b��4�٤,��������BtgAd��‰r`g`�dp�����X� ���W8tB�f{.��g@�J���#:�Pp�+=7F�uAy8p)7�9�X��:�4(rȍ|;�kv@x��\_����!~�ã�!�/�Xk��Jk�G��5����W�W�Isq�_��7�q!<
C�L]��M��e��`�?o(���U�'���H:nXX� ���-��`��
Zw��H�r����M���I
��(M*�s��7%qhQ7\�ў���"Wnb�B�!l�o�/^h&S������

�/�������a������فi�LV�?��&�i�P"ӧ������5�C�� 
��Qč.��p���S@"��^Z�U8��k,ݒ�jo0��?r�G��3#J�>!澁�V2l�ၡ�.3vz��89%1���nr$�W��\��{$͹�����?PK/WUW����s)pip/_internal/utils/compatibility_tags.py�Xmo�6��_qS>LB%N۴5��0��؊}���h��$
"e���wGꅴ��u�G�ȇw�=w<:�_y�k�9�2����a+�>��	^]���eQ1-�D.�>���GA�F��d���e-лJ�+hGJ��c��,Y>��M��Y�*N6��dW,�f+\kD�V�#��O;���_�V26C��}H[�r���v�2+���&RgD���U��3)Y�G7�K�*gz)���(��&au�N����1#r�A�����l�āW�2��9�R&Z&�̤�ѩ%j���!��E��A�zj�9��e��Fqh*���R�J��J(��
�b3�i�� �*E�
g�1�^,�κ��5$���1��9�/�iK�N��GFlF��Ȳ����3���W����,�
�
"��M�¨_H�����	
J4�LP�0���™�~��(S[k�A��[�S �T\�^�)Ű�����29�Y�@0�W��-�3u�z9���]�����c���R��?�Zq�36`�ktR�!ǁ]?cFɂ�5%`.�ygX�(-�$��F
wp�a%eFҩy!7�� �����L��cZd��e
L�HM��5(0{��]r{��ӡ
7c��2l�J����[H� ��C'�V����s���X4��t	����u+���)��n��W]v�\���ln��*�6�cBn�I���fIJ��oXk-�����e��f3�vk���U�����a����M��B*

��ҼP��<E�ߤ�Tv������e�Ԋ��"�߽��\=�.��M��^SY*|�H�d�T��u{�u��gg��6��B,��Y�7g�}���ag'�$�)9{�vj��w����{�˷�X
�������n��J!fQzQ;�E���� GO˜<��G�s~�p��y'�^ �3��f�T���%�f�TIL���#s�ܬ��J�3
ͷ�؞u�iW��hzX,��
���b�W���[��z)�O���f7ay.�<s���i߻�{�m3vd|�QXJ
DoWk�������(��N�ɩ��/�:+"�nd^�_`04r5$ �2hCJjPSZz\^UDةq��_�P�-n��3�a#�G� �F���Lp�`'�o;����z�A���癚�vj�ar@5�����m��I�|��i���k�#)���]/.9�~�ic��O��{��G~��n�����s�࿟\n�>���ch��܁B�@-�[ǻ�v�]�rD���K�,3�l/Yg�7�x�]�GP�҉��6u�>�G['���
��
07SJΰ{�SO�R�{Q�/��%���b�e�@��ұ׷������|P����}xp�̎�3��ފ<�ӏ)�=���[kA65��Ӈ�5��w�ڼs�쩇�l`�J
������|X�rn�r���v=�g�
[���!�>���o��Ѱ�����8��ۭ1�e~'�� =��U�ѯW��Bq��T����!�@��ܶE�`vo�#Z�J֮T4{�����s�G\"���E�UM������ߞ���F�!��!W3��`:�eF��zgΏF��<v=�c֡o3�5�~��~���}�Or�A���~#��=�PK/WUWl=���pip/_internal/utils/datetime.py]���0D��� �~��
Ra��В�J�{�J<����ۙ5�\S��9b3Ve�$�'�3'��H�ؒ1�(Lsʢ��%����jp[�n,~�ĻXm�r��)E�.�����ƆPFp��]Xu�Z�Gx�O�m9
4�&�3�+�#����PK/WUWжŎL+"pip/_internal/utils/deprecation.py�W�n7}߯l*��P0b�5��A�"-�`A�$6�%�rC��r/�,-P�H"�zf���yv[S�
�o��mnQ{�%��>�X�
��'a5;K�z���X	/�vE����l�A������^��f~߰���F�g�а�f���}���o�����Ȧ(w�kc�FT_{(vh���a�
�qYvre	�A�ZKy��������<:ʾ��&ҁ[,����77����_?�\ү��������R�9x/���O1�I�9�g@
	�Bi��T�*��<uP����hJ'{�z��z
o#�p�=�mp�ո���$�آsb��������_fA�"ĵ��y����.WR!C0g�xD}���Aj?�̇
~����>�$"�|��%�_#(rco|r�]�E�4���t�̆�gC��.�xM�IT�^:�.C�'���bO�@�z�C���Pj:�DAOI�$����5�O2`VԄ��I�W����A����YX�ѿ
g�<��J��0)R���	Z=
.���7�+��vٙ)c��ywq"��B��� �O�…�F�<�OnD�|~�f3MCf�h[�-��Y
u>Ӭoً]yܑ��I���^��%���ˉu$���}�f��	�-6JTaԟ�2ޯ)hj��w+��X��X_�t���r�z�"�is������}3$�M:�ɮZ]E3��,Mj@��NKu���h6Gb��ne=m�q��$ҹ��Q'P�qcZU�9�2�N�#�PWX�@�EH��>v�G/�E�W�@K/w#��$�=�J�jqT��)���ށ��)q&i��@�o͎Ƒ��� �#E��Ҍ���w�ܐ�5��~4��d�/Nܛ��/^6�p��l�4��x_uÏ����(�Ns�8���{;�L�P�δ�ؙ��=��n�?e�N���EL�jP�Z����_�
B��蕄��D�Mׄ��Z��u)�kv�&E�zIn��Y7�n���qx� EcP�n��:c.�^�CP�b�����rѷI�'c0�\��<���z��tz�(��zIw�JZ��!�I�M����[��|8��٨r��;G��C�V�|�{5A]aLs����*�5��"�*���t�򏒨�,����Ӽ;]��؟�!]>a�I7�*=��D�}=����Ol�a�~��`֜0�f
�#��|��q��cЁa'�ގ,̜ࠗ�:���q����vYP��;�T��`�]?^���)�-y�z����%-�"~��jq�
@8�%�L��VOߟ��	����4�M{^�y&H2QO��~$��]t�g�
���1�֎�A����lq�D�������oPK/WUW&��]��)pip/_internal/utils/direct_url_helpers.py�VM��6����)
A9�%Vm��HQrH���
����ئ;�V��T0��U��vQ��U��Zu�~�|f�땶��
%y����}ViA�,�T��*���Š���]6�O�V)��}�]�n9�>���8m�|����[����qͬ�s�VQ.������n���fK�7E��7��PC
d	�+���=3V'컷���>Q�W��/��*�bJLßJ;����M��(;�VT�B�0��D̈́t���F`%f�v��i�5w��G�wl�\k�L�~��ىȧ�X��1�1%cQ��9�Η����e�������B	�4�V�T]'l!*�*q+h��m�u�3^G�Z��ʣ�ٯ��f��AV��ɜ��ŘC��Z��h$� �u�f8�;��,��R�B�<���#�cx���D�D�J��$SW�A���z�y
���b�]��2Y~���O/]���Βt9mD:���oz�I)��"�IA�4Ƣ��1S�„g����A�YIH�v!2Qqjڢ�e��qP�E��ew�Pğl3���YN7Ł�/x�h����,qp�A��u���I�_��
��
	�]�dʊ1�l��.�Qp��۬�߅&����l17�f��y`�f�꬐%N�$@E�Y,��a���g�,��;�Rz`O5�',���Uk0������W{�:e²�4g3\�đ���Vt��Zm��_�L�}��I
mŤ��G�88�)��=I�-��᪔�v��ܗ���gᒦ��Q���f+��;��`�����5��A鐢r�TY�-u�����sgjPx�G}2پ
E#ʆK.1��q�V�FIN'�Z���!6ۙ�
�) �{�Fq��J�l�����`�<̀~
�+-�o�W�Jׇ���Y�ޮ�������t���Y��������!w��n�9�
�U���O�JV��|��B���@M���.�ٻ�D�H��VL�r����PK/WUW+�J�Fpip/_internal/utils/egg_link.py�UMo�0��W�6�k{Z�
�Pt@�]Zd�bˉE2$9Y��G����[�C,K���H�Um��"ٮ��Wn�ʚ�m-����|?j/��*jMjY�Lj/,�����]����Œυˠq�2�;��x�\���7\	��1��g�1��1vVY8ݽ3m�\�WY�Fc\)��<�X��LI�Ĩ��Q�
oqvԤOM�Q��6�i��困��m
���j�8<����[4����Ú�F�7x�#�@��2�m�׵�b��/8rv��y�

��z9gV8��B�S�F��@�肬�pk<��Pp������hYp%_:��(8�H�PʪVh��e����7V�#Ǩ���ח�#��|�|̧gq��z~R8�xH3��|�*��5���1�7�,�2v�e%���5Ϣ�;r7\-I�xYN��U%t��i0�=�{R�m��xe��������LOY
�Q:Io���jџ����hq��^�o����&YT �^���G)��8Ap
���S����Kp���J�ڻ�S �"�|�����R�TR��t�1�y}��?\g�O��x��x�L�a��c��d+�P�����;&�ѧ�o(ht�.�˔��}C�O΁#��e���ϦQ%�0����vt�&���c��/�0���HGCjaJ�H��q���7��Xv��ޡ��U�h���F���
�dO� ��'t��h�I���O������|�i��r{�x�;0�������"r��rh����ʫ���8�PK/WUW���pip/_internal/utils/encoding.py���k�0��Wꋵ%�I C��.��
]�� �r"�HF�	��w�7a1LO���~}u�8�J[�U�s���R9���M�O�d�R��S-�:�J;���Ƙ����؛oI���f��4�$�	ۂ��?��# �-���n�'�����㲇��V\5�ͦ4��g��ȭ.��b˗���?_~lߖ(��Q���x�3�P�$^��%Lƛc�~��AP�Xc�k`��`���E�0��t�}���=�?��^�q�V*�&l��{ך�:A�->��sಭ�<Ϭ�2�yo#�q[k^r�-�p���*�A�\�����a3>�+��è�B�_�vG��f��eښ���#�'���҃I��qu���St+n
�^
7`)��Q�8���3���r=��6�˙�f�J�0#IhOӫv���\�d��\�od8�>t�?�����C�͌��A€T^��WT��#��VMmB��fr!����7�>�,ʊ���3��o�PK���Wm�<n�C"pip/_internal/utils/entrypoints.py�Va��F��_1r?\"�'>	��^=P�Tד����R{��]'!�{���I|I)-¬w޼�y��v�zR^ZoL����սW��[�Tִ䷝�4�U�/�]�ѢI�NuY�4�q���Z���ϧ�q6����~|s���I�_~�|����������kzN�	�O
�t+~�
��ZZF��1�ۏ��N�P:�%��,T.��ld��/5�8����J3� �o��?R���Qz�	��|w\Kሸq㐲Κ�/��sq�M��K����+�Nڙ��n���-���y{wbWFK`i�V/i��8�E4N�����4M_I�hh�
�A�LS��v(̻,	���XU�Ɩ'O�p�[��h8`B|��eF/e!z'�T���X�*�"*zq�z��� �zAm�x�5��o}�.,��RY
BW�3�Kj���ӂΚaE৴� +���u�B�LwK^� ��^�H�5kp�e��\+�%�(��*�c�kU�ZY�B+׆&r�GL���TV�=�Wo8=:oMgz׈B�Z6݂6�0ǡ�q2U,����D�0G ����Z�!h"���&h�w2٩���|)��6���ބ��_���u��h%���K���rA��Vu~��
�m�P@:��jxAU�ﭤauy�l.�G�)�&'%��wny~~�|ݯ�wλm'�w�v���gQ��Z��~L@=�^��f*����,��Q� kV
�5=(<�a-��5�=	y�(�*(���u�
w4
��N2G���z��O�d�t>�����Qp�s`����vK��7T�{��}(�1 ��j($��DGR��5��s6Ji����<r7N�u��Ki�$�@��$���bL��›��<��O4�����n�?�Z���^�Ƌ�Lj\��X���JY�L)���1l\!f�Gg߳�'�- �����ß�t>�\�(?B���dA009O�Nz5��I��f9��K��C��<ˉ +�=�]��;"�Ԫ�g#�|50��M&:)aA�QP��pN:��F<��H����w��T����OX��u��ڔ�|ytaX�9��?8���I���{>�\Zy���jX\zp!;t�*��}��5���Y���=��\�q�|]`�	�~'��V�>bu��}�ڦ<z��}�س���;
8)�#%q����Ѓ����?
�7�>�
�i%��o�Ï���d�$�PK/WUW����!pip/_internal/utils/filesystem.py�Xm��6��_�s?Dn��f۴�|�6Mz��b�A�@I��]�TIj�.���3���[�lK���y����X�j��\�d�4n��5�,ו��Wn�f�5V�ŃW�`ݣ�Άk�6Jy�ij�D/�oDu#���<��v�ԫ^�'�K��RC��U�~ZX�M�o��}��蔕�Y�od������K�w�5+��=�M����WBq��r��Z>�jjEbVs��^*��f�h�V�������:��^�6qΝ�S�f�JԬ\��.Z1[�,�����.�ٿXa���1|�bok��2��gk~/��;�M4�Z0Qע��35nJ�kJ�\J"���ϔb���;�nbkX~[���e�.*��|g�➶��K6�J��Ŝ˴!���&+���>}��jvc[�n`a1�X&/\�">o����ul��-½�*���?��ĸ���)�
�,�q��B� L!H[+=/`�ر��Vh�Z���)F���E�|�t4����
1ѕ�jF̘5&�dR#h� {ADP�a��1Զ��kaEPw��\[��~mZ���j�Wّ6�ؿܮr�i!w�?��h<�z��ZcO[��+'����ܞ��ֱ�N
1�%�pp/���G?����Hc��l�Ł����v��SԻ�z���ٿ ���W��D��~��uc;����ܮ�%AZ���>��F���������gd�L�;4iq��d��Py��8êA�i�E��Nc/�����Vp/*�
]�C�}��+�,Dh�']U��Ŏ%�Q�v��q��cғ~խw���2tz��s@v��`�l�*���{����.:F�*��q�Z��8�h�e�s:ޕvy�6FTb�*Е��\[��<C:���>������)6�VyT)�X2�C=��Q'�PU�9<���ԁd��jպu����M�v�Lz�J�d�}�nz��\]} �D�s�@�FIȩN0��X�"g:�K�r+���
c��K�%1C���!A'/���#Q'���Kr��
{�����F܎��=��Hs����vbc�R�7����>��P`�A�{�3��
�! 6T���І��p�$��X��(�����#/OY����,�h�������V���!ώ���n��´�7�#��R�U����"(3L$�M蚦���N8�S^>��	t%#��y����'�5��G�n��3e�Rjx.�`ʘƅ$��8�q�2�xEބ��1N>̏��Gj�-�+�yBU<!rz,2�5�n��K����|��hW��E�3cW�%N\�����D��+9�	�뿰p��`�GDp}
�����Z�F�./1yr[�޸jּ>h%�Z��;�Ѧ��:��ov����������?��T9�R8��D��|RQ��Kߠ��[�e�0Y�6�Ƥ_yqh��b�JL�3��i&�O@t]E5"����¸ʯ�x����~��M�ӫ�&SM����^�Y���E�z��8v8@�	�:
��" �B����m�٤��sC�lv`�g�)��\������D�N�+AM4#�;�x$�Ʈ`s�Z���eľG��݊8+<m�Q��C��6�%����{$b�
�>Vxv@�'F��������S�](��)���۩��6'�i����=��`��	�~��*I�x�?���!g����L�C-��iw�&:�����J����8��8J;�٨�4G�[��t�p�U�t���|�:��,�,��I����3�w�ޭ)�+e���g�8�\�~�A?�h)���#�}���!c�uM�w'49a��87f1�0_afƘ��AI\��TӢ����I7��9�{�foC>�P{�p�e� ��)~C��vχ�Hѡv܋O}�5���3C�ė�y��˩�ɻ�d_g�[��o�$����0ǰ�:�!%]͑X�?y�N�������7�I"3{Y��+�"�d���	E���PK/WUW��O-X� pip/_internal/utils/filetypes.py�RQk�0~ϯ8�d��Ga7*
�
-�P�FM5�&%I����Zl��Kr����(�C����H��r/�f�RJHbM
�'�d��!�3%�?��X,�Vs�r/�c�t��2%�8zB>Ga��_Q8���&������y�+�����%;�ynٺ��.V�uA�5�UEOUz,h��o�x#�*L9&2�ߖX���h0���]Q��on��`�2�
,hˁ;h��hM��	Hs���o'��S�T����Q�j�N�ϭ���#	�J�
	���h'�Š-p�5�9��d���(�ކS�`�d���'�0���u��<�"�4�!WN�_PK/WUWZ}�)pip/_internal/utils/glibc.py�V�o�6~�_qPX�r�͐k��dhھ�AI�M�"5�J����;���$J�˃#Qw���}<�vJ[Pf�Ó̬Ѫ;t\n!.�t�+IE_�N��lV������i�7�j�H38��`��<��%_��4�����k%����ݛ��k�>sS)��#�F�i�3i�F�#�Wv��-Ճ+�`-��:P�xqʐ7�n��_=�(��BC�e�J)�O�5�+;7@�Q �1 �CD�
J�VwL���ܸ����P˶���V��p�ʚ��J���`���Q��Vս`gqygmg��-������E7؝��*�/�*M��ry\6?7�b��>����i���%+��iE��X�y�؇"��n]������>��!9�r~��ǫ$�3j�3~�����V�����irq��|�m���x��~����:����?�Ez�0����}%P��������)NG�����i�	nӐ:��b���7��eo٥�J�ps�Sч��l:_O���=#�=傖�A�Vخ��{�B^=��~�}�����w*DI���ƾH�d��I���q	��_��~������ԭg�-d/�-���@-T�dz�m��r@�5�~�Cj���9I�Cr�@���e���9wN��!$2jD-���}:�!�;����IT�:�ä$
��8��;��Z���4|�k���aǫ��T�v��S Ĥ��V}�C�����hŰk_�i��[f�s��2������ЖJ�v��s���X�j�yͰ�,w��w��85d�.����1��<����I��|�f�U�զ�Q��˨�B<����>�`��ǀ��!{J���!޻��]
KGȹ�w�O���H�*U�4���EuB�
��]C�٢�TcO�+�2Ŏ��ӓ�IÑY�,"B�o<�v�>����q�:��C�~�pg��)U0�B�7�����H/Ͳ�GH�>�<�9b̳��������`q�c�juowx<�]�����=ܢ[I?��#�?;��d�:*��?xW�n����%N9��pi�N��A&؎��j�+�����-���5�t���� +/zϔ3g?��2��"���r�D��\⪓��������z/C��D��<ב��?����Q��+s(z56�nq�~�O���_���%l E���E�cX2�Y��ao���5!�P��p��}VA
�i����i%0M�^�Ä���Hh�1��PK/WUWjj�� �pip/_internal/utils/hashes.py�Xmo�6��_A�*���k1xȰ,M�`kR�Y��0dZ�l6���T\���ݑz����6	$��{���2/��l��.��I�U�졔ŖI��Ϸ���_/�^��/��py=c/dbg��
�י��ߤ����JU�l�d���bY�$�ħD�wSK
��H�s��f��� �0�g�Z+=&��23Q.MRKԂo�dWwf2�i�|��Gr���uO��#v�n��t�@�V�*xdO��ѓ�
REv`���1���H��qV���J���3KT^�-k�I{`{iwLe�Y���{�
9F�����k�R�L&���N�� ?�`�e�g[��,|�|�;��b+`H�߉B�R���f�0|�!����l����
��<��s��M^��������_��{�NY`v�ɳ��� �j�#8
�
<fj��R}rB����b�V+���V ����3����R��[�	n,�f�D��ha����a,������zEx/��E
yF��z�ݓ`	v$7�(*��Qgl�yY�A����ư�ʬ,3A�,U$��!���3��K��
�/N�Jm�=�*a&���)�����qhD�μ�y�sLɅ��%#>-�K��
�3e'?у�^ˮ��%�<oD��
�˜5�b��T@mOs�5nE������B�C֌j�#�>ieZ�8Z({���@�؝8LK� �V�&��'��{���0Ź�Hó=��r�s+N)�5���}�և��������?�H�@*`�����+�P�/�o�#�i�������<'�,׮�]){����S.S&$
�˄���HP
�%R�q"/�!��D��A��L%
<K�3�_��U/LP��Iw �D�:o���:��c��IL��k�K#\�(oK(`-�i��2J3��>iFzvI��a�87%%��iѧ̐ĉ¬�D� �i��'�(����מd��l�x_�Ї o�<�s�T5{h�R9NTUX�-�j��X���0E�J���O��i����zJ���X��Jԗ�I���V*��7���nG�Cn�(:�	�^���'oM�f�}+l���Ųc���WxߐxK�˼��f9^��Q�}��M�L���c]�I/�٩�-���Gm:�pL�n����v�:S�N�*����.ºxL|�C���E#)�X�z�_�]C��H"jg��1z�
4Y=�,�4���
�5O�e��_��g0����lP$��U
ŇxpZT���#=rm]� ���_]��0�[����u���[HQi��~ԑ��Y�y�I��Aݨv�1=`^��D>�I��j�8oN$�4}8�?�$������lS�h�w'!j�>h&4�;o&>�%�o�;G�Pmqx_��}�6�|������h�Y1h�Uz�l����./u�ዯ�Dgw��
��nbD�o ���ʃ�}�;��{�3#����or�%u��N��!��'F7c��{t��_�c$j��ӣ~��|�c�9aE0�p�1�`�V����1�a���i�
�e�ۗ�كZ^v�f�׷o��X�o=|��;e*}ǩT�VߩW��y��!�r'*m?d!��c]<�х���ὲ�B&N<n����:�RɆ|�^А��B��jO�(������E�]8�4�-�j��d�bx�����#�=�*�R~�gU�l�e+
h�`��6��O�?�v���$w���&/>$�c�5���2
�6
�?E���#���y�Qc����wO2������b�h�^�4.��t�PK/WUW�9��e
S-pip/_internal/utils/logging.py��o��w�F�T��t:�*�$Nj,�۫WhqO�-��H+B�}��"m�k��h,߽{�_'��e�E^��U&�#�WDY�}Ȋ�;��u���L�ʮ�ڹ�ժ<��˲X��W|�q��b�-iY��@���M�7Q��h�Nf�}U�6ޛ�|7fo�ϼ��"%�
��A�j�.6�,r���)�w�#�j#7qr/�(�R.V1�G�������8�4Z�Z�Dp�܂6�x��v)T�Uf�}Á�Q4@�Jޭ2�$`	;����fy`cG�xҏZ���[������p�k$u��T%Z	r��Jf*N�����닫�1�� �ENgߢXo�#�������0x*6�Xpԍ�����雓볋�䧫�	<�;��0��T�W�.E��r4BU�J�ic� ���h��,B)���xRR�A4����$�*-j��eY���� 3�&d)Ah��R��ɥ�Qn�`�bQ��-�k�LN�Į�v%A_֧��(K�H��	[��D��"!"'�5��\	G���	k-F��{6/�L�4:L�.�?���2g�e
V��"g7�m�ƌ3MjL�ϙZ[VoW�����~%�qx{������ ZU�FM����7�jU�qQ�K�j��y��9����/��L�3�=��L&̊T2��%
1銸�8#�'� �d�B�k���<!3h/?4�;6_�<��@�Cx+�_���	<W`��H%..�΋\�Y��m۸Nl�`5��bŶ2�@�dZ��`[0��`sa�D���!���(&ֲB��LaC�>`��lѱ�_�J�h�.�gh�&�J��G���2�	AT���N�,�����y�0iL�m�h@Y��'���WU6�,�vc��&��pQ��A�>�VL@
8䑤�k�,�%�%8���p}t�^�89�irx�,8K�\Y%I��T"[���^ށ�cVuk<M� }���w�1d�������$4�F�V����B��b.v��̳�k���a�lx	�C牦pH��3�L�`�@�,EӅ����E���g+�� KP�(ӯ�$�<�e%��1���*�0��:H�c'Ũ����!4��
Icli��N0��Y&�E��$yX���6K�!8�sKzp}�e!ƺEQ�M"�ã�L��!P�t�~A�4T���oN.����OZ�7����苉l�*
��{�Fw��WBsl���[Aᆕ����"��b[�uF���(>��,�~�1a1|���ٗ�����e��IAc�����<'ׂ2v��w�N�㒖7�7���<�e���67���=��Y+�l�!�7߁�J���L/��0����ʩsàf-r�-7Apt�}�q�pb�����6֯�w��'L;*�m�m��W�ը����)�����@��
��3���Ai��@��9�&�i+�R,�����q?�����%Ҧ��=w�"]P�6�\~��.#1�^�b��ĵg��=٤ӣ5��o�&:�r���5��@qC�;!���vJZ~����R��9��́j�*�:&�|�`�+���3��
l������t�������_n..�^M\o=�������[`}v�S]h��c�z�n��q�Pl
��Ba/A�4z�E�K�l�����~B�e�lK���U�[Ȱ� �vJ�����[�OW}/��}���C���;U-���"B#�j�T�1ͮ�',�!�+�-�O�m��;D�5��N%Xu?+t���9��Q���v�ijy)؝���Y*�]^�J.u�H2��8�_0�R��ů&���B��6�8�����d"����5T�:��&�tj��Š��p��o�S�z��.:�!�Dۑ�1���l����#c�G�{� �+�������t8�hӵ�ȹ-f[g�,<����[`�b��Ӫyn����\۞����>V�ُvM��+��%(ED{�"{��z��cv"ˊm5:o����f�צ�D��ē%�\����ؘ��O�ҿ�Ji���d��@=��*�Yx��_��
"�+w7�T���T �`����0}]L�,�|=v�)Z�NŸ(�eF�ɫ�vk��h�V��85[-x�����^��2��
�武�3u��x�&�����+��qU�j#�g.a��b��ɗ,FP��������܊�M�ϛ��8{–Z浛i�'�vdԣ����%b^F���X��<�����r-��j��,ٲ��r�<V`�sYT44x,�2�{�5����퓁�n9>�sX�����z��+��q%�+�]�Dg5L��?�أ/NB�ǧ�]�Q�jF�Z� p#�뵚�s��
{�w��w�a�AY�
=J�2�^Z���<I���t��MI�Bp	�<=��y��M�<0ԡ%I��1�+��q�<L=)b�s��&��j�_�&1��
慒Վ4ޭ�Ǭ������^�5{‰a�ȗ�LX�Q�\�5�[Eڡ�Oz�P������?Ƃ5�73(�{�բ���V�kl���O=��ظ1CHs,c*~�臶%y��Ӎ�U����O@�͛��){9��\l
�;�ة
�<M7U0}ۿ���<�����ٛ��_�
�8;w���y��_�t������,�*�6of�P).h���I��E�gP���#���M�Ag*G��Z�1���@b�Hmٹ_7Z���i��Tj�ht6N
,&V<�V�#�~��q*�s��~�^@����#���޷(f��i�W�^0�Lj�z�F&���7:��=U�K^J��T�:��x4GnΉ��,@c��SO,�[��	�z�*J��K�5&DK(��mR��*���Ԋ��&,�;9>nʍ`܂��b
�4��k�{b��9	�G}W���f,>%�ڧpV!}�"�3�+c�6��R�Js	
��+�f��^x�c�Z[3]5��.(@ݲ�t:h�6�#�!")�򚰗�iI�j�M�g��es���g��4�o�'�K��-/s��Bd=��v%����n$߇~�_�>�
d�T���'�v�g��e#@�<!��#�J�=&Ϟj��k1��b�h��	�oghק�0C;�P=��	�\{‬�:�_F���؃��/�
R�b�Qk�=�ZT��P��N�ـ};da��nZ��"���f6��o�Ԭϋ�=�j�U+jΘ�󬩓�������\�e����M#hd��,��K;�)����*�?��وo�Wb�0�������Gz�o���M���@���=�BO��.^�T�T>b��d���``���i���ѷC4�"�H�	�\7}q�6�7�[Q6MM�F�b�>~^S<�x�\�g{�~���y�]3g����PK/WUW߫����\pip/_internal/utils/misc.py�<ksܸ��+���q����Mv9�z�DU^�ek��өh��p�!������~ @r��\��Rw.����h�
�uU7"��F�6E>�����27W�Y'J��e��N�ܶ+�����2���T~�N��y��m���I{}��K@l�[�m]���:���[��J,�2m��PŒ��M��6���M
�����Y{�y�I��T4��=_�EU^I�p�7=��d�Es���K�'��sx8�u��y�^�m
���ក�˻)]|��I}w���^$E����x��O��J��<m��ϲ�u�T��̦�Jw�ݫ\�NoֈjR��9@7C��kәfb���h(?�Е/�N�4��u��2�jX��:A��j���k��eci��{6�n]W?˴��Uum�|��E�-��V�H#Y�7�LҼ�3�j��wS`�j'�G��"�'�$o�E~+��)h��yƱ3B�P�"y�J����E�Z%evZ�@lqz�
�;^�촼���M��+�4��ū�窎Wy	56c}Q�T�V+`S�dz�߽���M�&�,o,�ڲ���2u��&��D\Т������,Wk�g�Rb�!��8�k�$Q�������~Qի��U�w3W�0��N��h�WÚ��2�H=�+s�&릭e�&�Z;�,<u�KV72N�f#�bP;�R�ױ�+�CKk޿ }�Ìs*����C=)k��V����q���c�sh�e.΃���mzV.*|��y�//�M�<5�x9�}O]�Y�\1����k�'�+�D5��|i�>����˽7%����U"���4 u���v�D0���2� I7Nģ� �V߬��p�|�"���*/Cs���@~0H���(࿓P�����yK��A�u)T(��I!���fY�p9	"�z����8S���=ܢ�	7�h�t�b�@<������E�%�o�;��A�`���إZ`#S_�R��CS���<c=�h*Q��T��Q�,A�DL��TV�_4LG���q@W�e�/�,�Y$ΗR�M�|�)��N�f0���P�����C�"W0P��,6o���79:�C���	���HF��$�H�����?�dz�s���'"|,�����"<�2��b�����\�_zҀ�B8ZD�?�f�N1�(a3�g�K���C#���ZBS%69pAۈ�ӿ��?����wxC'Ӟ`�I�Boޓ�����@���g�Q�%u���y�*q����o�B���U$�O<���㯻��ʈ�j���#F�-yg�vH!qhW큉��;o����Wsм���������r��H��R�A
&M�*�Gi0��k�>!0y+ӶA�}/�����Ѿ8�K��y���m�v�P���3pJn����`@���=�� $��Hu�JB4�	й�]�6x�)h}nF������;�N�t�����!�?(�:+��z�{���kI�N��V��y�wA���BO:W4<��L&���f��~%)`Ֆ_�r�1s�L�!��u~I151�Mg��&�|	mP��a�e	�އ�In1\૘ۙ^�t]k���5햁7�i��öБ��M)�r�q��߁�ĩ�;@*���ZXc�=�ƛ�`)���8���N�I�1h"���	/�SOx2��sB���Ea���ST�Sqt<q���eӬ��� �R�o�QU_<���6ˤQ���]�lV��;�f2t04^߽��Iv�X=�&|��VE��GR��eG/W���	Ws���zH�)�S�݌��ƍ��}�>�3��c��ͅ�TI���R�~���C���Į����D;&���4��#J���j�y����8K,��
(ِ��֘@o,W{V#׹�,�z6$T��K�Aǐ�}Z=��F��w�A�n����\�E��"�F��xмPoyQ�E��G3Ϩ)p~�L�]����H?1��]<5aͣ��U�l[6*{F2˪�C�;e����ُ���O]��v�..�-�}�M���%�Y����3��&f�6X���۬���v-��X�p7�Q�?M?��.��\�犲e*C#�=�t�b<]#�V��N^CW���Fe�y���i�+��?�7��Bw�J�$�"W����I�>LA@��C�Mf�����i��*�s6����pq"ŭѠW@��Q�ck�a�
k�)��|')�h�7��;='bv�:W��eBuɝк%@͆��<��{I��:R=Q���md�T�yH���M��tkk&Y�$���Fn҉!`	�i�@�̍��г�u�/�8 �m�ШĠ�ȑ="t�م�ĥR�&X����b=�J*�\IM���3���|�O>b.�U��a��\a��mL������7��g@%b�-tf��@����ʝ��mQ�ƞSce�no~C3���g������f�K�S��c�}�&>{���s7.a�ܪ�Л�"xmF�`xw���(��\ph$'[��L|�s���I����J¼��kbo�YPj)~#LK�Z0�o�,�Zt�i���
8��n6 ��?��\�j��u8�pa�Ћms��[xj]��� J�T�u!��~B���t��\�V�3�}��I5���x���<�[*Ǵn�S
0G���y�Qj5c�Kly{�z��{o\��Ԧ��/C#������>V0nSa,�E�Ё�,:]�PѮ\��c�W�n��+��8�`���Dxh|_�������?�?R�OC��V%�E�w�h�w$@����]�lE��p?�'���O��"0�r��W	�N��b�	H�
�t�B�/(�B��;��AC`�[����Sv�$G]�΂��%�ׂ�������9��X�v�
A^�(y���O��6p�s�]�Һ(���y���8:<<��x�f���^|��n�v@�C}��.;�ہދ� j'�d�䮷!7C;8P�!C�&���8ʰ�6�U��
�&�qWo��%���;m�!�T
�L������˴*�U)p�������6Y�P�?z��i���İ�<�Ah������mq�\�ťN6���ۡ�=���'���ɓo�����T|�;"$O����U����c�VQ�J�cߕ��.��:��;ř�p��
��!��bT]{��#�(���cR4
Q�s�Bd�CN&Q���8b�	���|��ًEP��%=S�ɣ�q�h��h���L��jU�.�]G�?�
�-�m�K�������[���w�4�v2�F����ȰB��J�;�+- HB�~'��lw���#?B,z�d��b�W���+1�i�l�tPe���J	��&ɉzI����s�)]��O
ԑf`�@�A�ӄ0lÐ��É\��jW��:���ۓ�1�&C�h@C���<duj
H�A[^+�R�f]�
��M<��U�����?�:�������w�8�D�-R� 7�D4���O�,2��e
R*(K��M��zDi�j��-0R!N߼�|��͑pܰ{��	cχ�E�f��7�����F�۫~���TU��Xݭ�(g��C���/"q�'oh��*�4)��j���8%s�m������2	�B�v�l
��>����(��ÈY�2.w
r�B{��2���B4n�t��L~C���9f|�X��I0}P��&e+p��E��:��8k�f�^	��B10l|���%'�[|n^�}����7*c	�"ӼT�͖0�L����9��m��5D�"�79�����ʺ��
|<��Y�\���� <`@�:��@����'A-��U�:���{��yY�6`)B�Яv -Ǒ��K�r��A�[�Ϥ\���"�b����w��5�;�\�Z�"�DD��v�o7rL�.�B"]eVd
87�1��d����$p�`�s��E�rƒ��M�ڕNw1+���tp��N
rV���j��۪���ۧ~����;
Z?���1�
ت+�P����6��F+�rh�["���`E�LV?��z
��ԗj�1�+j1Ӆ�L�g�y%�kaZQ��Ef�:L��#�	��4�2}C7��D ���O_���*��P�D���	H�̔��9ЄiEiX0S�ۡ�z��`]��RF�6�O��\oS���d�f��Y�������O3�L8{�δ��K;$,㳮�9җ\�W��rA�2���:��<oe�=z�ф�d���U(�O^�_Y�_M�h��ZͤαA��$ղ	L/�Z?t�}���h�>m[����T��ЃB����T$������*_�5i[�+	f��Q���`b��ѷS_�"W�: ��6;d��]�T���n��Mk�ޒp��_��/}��/�+���D�İt�l��p���go8����EQ�[i'F�2s��h��hC,z��?��?�lY�/,���##0�/!#�b�À@_�	�H�<��e)m=��JW����[L1mɦ�!�E����t#��0���i����X�����d2�P�?��;���h�f�Z�Q�
�S�[�U��\����F�4�xd�.)iOϼ$���'�
d�n�g���qI���R�v<��"�$��.T�*�A�p
!=ҧ2���ّ~ِ�����,@^����
��a!R�� r��!x�ps���kۛz@@\|��K��?�}B��Jm]pU�&�h��t)�}�=P*�n�z$[����!��K�8� �
�"�
:&�6x�Oӟ�^�;��	�F�#ɐ<"�2Q-VLY�a��*��HLC�R��q?;80M-��	�Po[����t�irP=��ETXH�v,���FT3h�>��.B��b[n!lU��ɍp��[����}�iZ����@�S����|^= ��	dy�h2,7��@h-�����=Ι�AL��.��_��`�6"��k
e.�>[!:��l+�q�%|�"�w�Dȉ=,���, ��o��=����S��ݐ��̋԰&�x�q��l�}�DSq��f3�G��˞VCx^U�O�B.~1�>C�����$/{s`q�u;�hE]Zپ�Y�U�<�T��0wK'?��k�L�<��RX~l�Fw�0��oz����v_o�3�` :��ɒ��&����s�α��(�I1�f#R��C�P��9��-;�G"@�f�"��[�=	��#X�!I!xPM����m�M�PF{�w*9�V��ۜnk���]��k�`
:�H��[X��}n�ÙuC�-<l}�ɴ�fM��t�<�)ub.�N9q&mKk�&BCC�}������N������˽~Bձ4�e=7p��aV�,K�8h��;F]i!�Q�W�0)=�@p|>���k�N$�&Y�`*��ը���]�O�������U[>{���!C�vh,�9��=nq��C=�-�df�2�S�@8��]�qn�	�7� ^x�P"W�P=DO���Xo���>��������<2K׋:�¥Б�8�mig��#�5���|T,��ٖ/u���U��[�[���@�c�&��Уӓ1G{�:�/>Y9����[��5Ҫd6�ȹ�F�d���@\0�����ϰ�E���.h	z��Y^�I���w�
膆�K���w��cz������k�GbZ`+Ag9��� lH�vnO7.몽ZRŽ���B'�k�VW%��Mv�ԨC�����wG���7��قeK4rQ/�2��'��r���$}��g�1��-8��������]x�k'�,҆.ԝ��D�o'�~�_�,�%f�g6imRi����i3�n#X���쑒Ō�@o�.��e|�r�����>�]���k/�Z�	B}'.Px�9�n&�;�e$ K����,�-�"��hiUaqI�z���RB���	�Q��#����<}@N��>�K�K9x*�!�Q��J*,H���IҤ˩	�~8J6��;`��(q̪��,����e�ɘs�:%h���ad��;t�u��ą<�C�=���ɖ�q��ͅ~]�o��9}����|��7/b����!=�� l�uÝ�M׋��-��م�9�����O�ww�K�Q`�����-P��3���+:Ծo��-s��z��R;�Y��9�����i�h�~
����������V�ur�r�Z������$��Y��V)s����&Q���J���.��̞�	:�u5�%�	��o�9�!7q��_A�'��2f�i�8Î|�O�GS����`=8��Sp�
�u� �[@�x���4Zp���A}[a��H��p(!/��n���c���k4���
����d�`�N�v~���W�~z����|�݇�?�d�.���r��qx%�[{0��դ��s`�+d)����nWI}-_����=V�>D;~dH��&4�j@���1��7�U�ϗ�C�+7AzV���z�p�B�h�ڭ��S����y���h]��W�4w��+�Z�gS��9x��na�����PB���v�C�8����Y�7�4���X����C:�E��^�/u��w�A�����c�E�D8&M�Jv���;���=�oO���ʗ�eԮ3,�vޙM/3g�I�S}m��Zo���!����^Q�$|t�A��qfeg�Q!�P„��\�:���t�\=�L���u�pi�f�Z�S�5�DMޝ�Z��)w��s���y�A7�v���zd���j
�,&�^�sL�c�ͧH�#�a5�~�ha�j�uvS����lNQ��P��������<O���7����cL	I9Nb�sv!����c�下]>�ժp��d$��B�Γa�/�"�n}�NUm�R���u��{ss����Ƭr�6Z��h�c���#``]�3쥝�Ή�5��T��Z�!I��N��M�)M5��!�O��:�H��`�}����b�b��؞$�Q^�U���M9T��rV�?�@��8���W�Ip;�l�!g�(6��>��8�����b���OR�ȟ���
\�f���_}	~%���zS��&�v���3����gN�xu�M�����?�����
w�d'3n�9&���4�#4�"���d���I	�u�����R�S��j�*�o&��i�ѯ����.��QHS�ˈ^���|һ����H��^�qC��
PK/WUW;��w�pip/_internal/utils/models.py��MN�0��>�ȫV
=@%��BT,`E��L�l����$i�����ޓƜ�O���
�d��Ze�B��1�d=P�Vz���ԁ��w�=�!�g���k��c�1Vj����$V����Sf� �@��^��rd����]�VzP��*���+"�p���!�b���-pq�#�^�C�5��b�P�Ydn��mʒ�k!x���ؑ�1O<����½��EB�aj���=�Lr���E�c
ĞՅ�z����[�)m��q[����7��m���7���,�7���,��M�7�;�
t�[���ߙ��9\E���+.T
��S�yiʓ�k�>�M�ȿt���NJ-��.��`~��PK/WUW�L���< pip/_internal/utils/packaging.py}UM��6��W��ʈM�
z��-�Z @�	�=u��hi$sW"U����H}Xq� �x3��͓j;c=U�.�1�K԰И�V���ZN*kZ��4����ݩ�
��2Z6���t>�t�ّui��d�$���P�b�6t�(?�%,��+�-k�&���$�5������/�J��rLW[�
9o�I*e��cɢf�w\K�L˖����+*\<ec.�N�`t�>����{Dy��˔��n`�^i�!!�C�������Z����TE��T+�A"�G��Hʑ��ȃ�GVgnE�v�������l}ȆLE*�j�
�m�c�>�|4v�*��5s*��Pʢ����X��7�z�Ų�-h��l�kt�+�:\<�����z����7S��l�s8�MG��(?M���]E�E�r:H0�AG<MUP�mj
��F�ѭѼ��zEwHxP/��9�IhC����̎�>���ln'�z1��}zqg=T?L|^O�b���d��x4J���R��k����d�����'���WDc���P¼8��?���c���m
Ud����
ñ��yF������#'�����(��W���/B�օ^�K��A�h�+P��˅�2� ;��b	y�RE~�)U���m����J%���@G���}�o^1U��Z@IH�e0\�,�0�͐�����rT�G8��jA{�o졀n����`uc�q�gr:!���-�N,5�񻽜L�Ɋ3������3��a$��+l��"S��萴%]E�+
�=h�F��څ*��[�t	�٪~G�t��L#03�2�c�ʮ6+�`� �7~Pij<��s�x�q9�M�VԾ���Ū"�_oy�=��3�-��@�>����
F10>wŲ
V���D9�|��T��	�u�(�4�~�[c��9��;x�p�>]���#�_~�&���\exDr�"V���PK/WUW\�a[�S'pip/_internal/utils/setuptools_build.py�Wmo�6��_qSQ��,a��5�"�
tKѤ؇4Ph�ds�I���x���HI��
�/�Xֽ��<����q`�v&ã�w0��F�+�6���J�pY9��(�p�֨2�͞��V��������R�u&X�m��i]Z2�M;�Ҵ�%�)H[��s�K���o�?�^���f�G���i,+��"w�K��A�L��+�����0��.sX#D�W?~�hlJ;�=|]$����û��˷W��/o~���$���π~�(��<ӻ�b��������zK����JV�)�8e���1_�Xd�E�1�Zu(��޸�ۃ��*4΀�3e�q��X���*6��Q�Z�=�w9q];Yڄ��;O�6��F��t%�{��9BY��&�[�q{�S<f���
��Z�A8lQ�# ��
����|���;��D���[#�E�U��<�5�ڠ�{��IVw��5ZuF鿕�������[���]�{-s��.K}`�a}�:�;�d�֥;q�f���pgg>�B��A�Th��Y���DpH��Y����4o�
�&�]ris
ܣ�Q��ԙc�kO�W�!�3���xᅧM��ɴ2�-��'�x���
^��Ҩ���K������OS� ze�׵��E��F�a-Z�9g�u��$\tO,����/]�9��2kU����<h˂ M���켕/N��%vطne�xZ2]�:y`��� "RZ�L��H�|�����KQ;�����nz�	�����>;���!|���q�xZvZB�j�"ܚ�#<�97��d�h��Ȍ[�"1�QMR��Y�pm�'۔�%%�l���BL�`��R�E�j?�쪛g7�8�!�[f�7�0�(�Rg6�*�fk:�~DBШպ.
4���vU��J�_�	�ݯ�gt��HN�lSs��fxr;�)T���vr�I�eU	#vc�����g7���a�4�[�a�1�e�A#X��zS���)h�pq[�h�z/�A�6�{�&휉�i�'%��Q�m�B��?(	�d�8�	qs:7)��m[��*�[~K�Q\G��ѫ�2w�?$Ըw��|,��F@?:h(o�F@O]/V:f���DsSCW0�+}���<�S��X~E-
J(����Y
Z�T>RZJ�S�B;���
.��jM�����r��2QO��!�jw���ƖxlR6ظ�V�t��$�uQ9vGk⚺콅wG�ռC�*j�4�=4Kט	B�?K����hs�UA�(U/i��D��rm�9%����K�g�s�~�~��=�g9��|�u�8�Ϲ����(�{�=9��a
�~b��v��{�Me�B�/��}r!��RWO��œkqj�Ie���ax2��N
�Up�y�:�$����[�|`<����B��|u�?�[�6D�|�u��8"�a$PI�5���mGn ���AF���m��1m�KS���9�:$aҜ�������_NB�lR�
��,�T}�H������g�|Dc{�u��ObH�ZX$��@�PK/WUW�\��#!pip/_internal/utils/subprocess.py�Z�o�����!v�h�Æ`p�K{��K�˵���%:f#�.)����#)���ܺ�ْ�/R'w{mjV�{��'�]j~�m%>��zot!��l�ޱ�q��:�0���bu������ӭ7��8�U�וpW��0��w����|�l��վ�Z��]}Rp1��&N�^���A�R���b��yh�A!a�1�T ��E%sR�06�tחH�ᅘ3�j��Ƹ�υ �Z���h$��z��=ʠ�ees�㇋��W/摻WH2��c�����˲�V|�'�IrFn|�F�W��AuU]6�(�'�~��Z�����_q{���݈�>�S��O���FS�@�=�Ѧ�W�q$u�:�ɹ��*ߘ{��K����fYvw7�LJ�a;� V�[5��ú36�b�"�w3v�����K�e.O��`<�`z��(�<!�WNn����Y���Z�
r.=ߊ�*0(l-x��&�d�*DrGڈ�V�#{P��o�\+N�
WyK
!�ep�7]�$v�iԷ��B�YK$*+�%��U��(-��
J׆�]���@��R�ʈ�1*!��_�x���L�S€컑h��4��� 5ovBՖ"RJ���c�W�&2�[3�(yQC=��l��
�	T���|]�7��sv���x�I�`��ԩ�%	$�dS^xV�|^p�j#�Q@�C
]�w��U��1P� ���B;��a�[��1 �jJa�����BJVl�AM���8�2υr�(����P�1��SJ�ܵL0	�oTUGU�	V�|gAƲ�g-մM I�/���݅�3K��Y3J�de�Խ"��3�sF�~_ε��̻q���6�7�a���$��<�Y��܊.��|��gih����n�8g��#�T�[}\ٺ�M}��ZW��� �=.��&�qb�?h�k�r�`�?����Q�9ˎ�(���J�ݝ���X�����C��F"�X¤�K���B��*Z�1�"�_z�eE=����V�K<����x#�����pY�rEqh������4�5�~��`�.��W�dj���3�8��F;�h`%A���Yiu��+�X�1�t�F'8Ja���~�	J|g�D����x��[��NlxSa�Έ0C��
�Oz��E����&�B+mu�"8B�Te)�}(��<р"(`&�	�ky�CO����t_� ����go$(�n'F���h���l(���
av��.�|Q�d��)�$���z�����N��u��ُ���6�n�h�z�	!�i�BEЛPc�48�ZF�ƝT�J/����ü�V��=��Y���6�`�X��okF�ZHl��ק�ۅ����BP�(O)�¥:xR���6iOO@~�~�	-��Ʌ�VV�I�)�-�(��p��a�$�!%A�6Ïc^�,W߲<��-�`VVIQ��.�ADl.7�2�y<B��(�T�9���� �ZG��
P�:�K#/��9�Pc�"��i����!lda�T1+�t�w�#]L��7Xo�ҽ�%t������!���j���.nn�n��pjט�+t�#[�I98	>��i��N�]�:�Vz�a;:m�&ж�R�#a�>�B��@pF��4�\άq{HtvIMs
��Wz��*��1N�<�V<h�}�-����88���5�Qk���e��s*Z���v.�Fw��r��N�Q��Ɇ�EE��������&�{;�~7����!>�~M�M��Gš�ù�?�Qs}�[�u���A��y�7/(z��ِIy�������fm
z�w�����
�\�`�I���ʼny^�x,<�P[~]�p
�p��Fc��ᖨ0�&����M�*v��- ���M	��a�fH^��t�N�8���y�/a\N�Y{��C�"���^�H���-��cG��$q�Ȥw(p��U�euG(6dq��7V�~c�������	�	��&���S/�@��i>޾��t����w��o$������7������aٚ��v�b֑�t��Fv�q�½.&�h�j�0td�Q�O�^#8�#>����9;X�oƉ�>��D�
���K�X���2n-&Z�;��I�d����i�	7�!��jE$���JB����N�����H��=>�T�L�U��a�À;�%��
���έᨍ���e�V�?r�\�A�$���(%4��1��^_C�Y��'�Dqo�vF�uh��a8�?<�;�8iU�!���#�
�)��G�D�����:m�f���s�l%|a�����#���#��w��i�a��v�����:`G�7�����bֹ�[���Q�τ]$a�`6�v{�,���@BWW�/��5�^�Q
C�*Y�
;�@�2+,���^��V��ria�sҀf$��}&!MV[^����vI�r�<�:��l��c��D��T���_:P�n��dϝ�W ��Z8�,x���E{p���z��pP����Y<=pHl�V�Ȣ�!��+�]D�)̣!$`Н߅Ϡ�?7��ՃYMޙf�^�e�k�o=�3�9�;���Cg�'[�uU����w�O�C��;c�uՈ��.F9�޸N�^� x�=�����s���o��]�x&2��eV��
6>���gCR���"��h��Q�K�� 9�>8�g�s	6<�/<b��N?^ۓ�����Z���Kf���� �f�L�r^��C�����.ՁW�d�y��Y��\����%�ѿj����#���<�4����k��C{�~m�A�����渻�il,6:���s�1���+���O�*x�U���������6v�^J:)�t�+���	�b-�?�Opg���	�|�w��sZ��tJݽH��?�~����^�P8ғYrX��:B�ft�<�EGߍ%��Yx��1�+,^$WCb�����-Nk��PK/WUWH�/'�`$pip/_internal/utils/temp_dir.py�Z�۶�����ci*1u��V�\l�1=Ǯ}��9{�%���ݩ�o�� 	��$3i�6��>~����V�2�u�&��H+�U�4�A��[Ymí2I��.�Z��Y��^�Llx�aRh�g�������0O������Ex���
� ��+܊^�C
R��	��yuX��#^�|S
w�Xf�]=���*�n/��/^�V������P�o�'���7��|��u�JTy�XY�d/M$U�_0��Z���%4[�%[a/��,M+�i
��K��Φ��t�6������Xj��̇)�N�*7Ldk��>�ܓHa��*�"9+�f�����k뷥ڀ}Kg�<� #`�~ �+�Y�˯�_<N�_}��nY�KQ]O�]֯��_�o�����G�֫��wb���	Q.3��'}��GJ�VS-�_�)�t������ZW\��x"}Z�G�E�9f4����ï���u��?#��bv����H���	�a/�R��2?^�0�DĨ�c��c���e�>)d��IF�����A	��Zl�a��t��V�U�ۈ��JńH��)Ā�i:3�,��h�N@|��f�)����
�Dx���ǎ��S�C8�1���ep��f ��*�������c�)^v�m嵨�3sz-�X�t"@T�ߥ�2C]H�N��IuHT%�ੰ��m4DnOV�|K�̽��j�
}��{��R7b\	-l��1]0=�P�-�T�tzR?��,�c�$ߑ�^iu-s.g&S5�G�߇�}\�xNg�B��จ�����&,BF0�q	{M��C+����IK��Aޠ�q�� ���6&n�?��X�E
�m���l>�rZw=e
6v$�uS�� $�Rp�ljp尺]�;i��/9������A���˗�Z#*p7�3wF<�ӹ�Zn+Lg8�v�y�Be�!�	SL��)c�R�R������}�ъ	�J؄�����s���D�=u��M��~�i3CŒ�1�����']�I�[2�f�t&��+�癜���pX��|��\�K_G�9sm�f�t�qM�}�����v��O�w���59w������Ji�z��Ї+mZb���{u����IZս��]lV�=��Q��R�����=��`7PZ��#�Rf�v΁�WU^�.Wd�~��I��"o�赀cr�Ĉ��`C���4M-y@5%#�+�vd� ~0wH�jZ��P��ݶr��a��,�QeEu[���y�`���1�.̨}m�rit���=EoV���D����Fy̽	)���5�Q�P�(������tAi�Υ���;��D�.���u�n�/j
=���6����>p҉��-#.X1��{Z�e�,��]>��9�����KpX�]w$�_YL��9�T%�4	�͏~Od����y�<�I�3�^���?���ݶ'�����g�k�����]�N&�~=�@��fة�3�%G�z�¦c~�|ZV��G�mLM,�2����� r+ԸGD:��$W�W��?x�o�ﱷ��K��\��"Ό�fv0N|4ϡód�'sؗ����
^�w·�iV�L(�l�����&Ӳ�N�
3(tt���\)�M8}6�$]m�Q�p���Ci)եL��*	��œ*���z�a!oWŴ�������tޡ�Mrx�f;�����}3]����ȉ�9`����Z�sĨ�C������T��ၵK��`1؂q ��5�.��c ;%:����hW_r#ַ����-����ݐ~�,�
�E�]%I��<�~Q�l����9����6�hF��
{��L7\W�'w���
�uz���Y5�EIl���ϊr_�
߻j�|�dk��v��E��əb�0���+2_��n|~���}�!uH�3��GsY����apWFzS���TF�[�.�������b�6w9‹�Ob��}����}��-���FM2$��7�L��}߰��MC@�
B�����.⍏���Hx]Cl=U��R,ߠ�����/���9�ㇿb����d�*�hVh^z���{��=�[���p~e���I�D���Ҭ�3���+�����g��1t���s���Mj+K}�x�E�"B��K54�0�p*�\%��lf���)|z��ث����A�l4��Ew�;f2���S-�gN��
��S��GP��t|�/ẕY�;�Woqm����C#�}{5�����}d�rg��)c��]�s�ѱP ��
pځ�;}f;��n��C��y�U�hE� /o��ˠ��4��H�Ϣ$Za7�Z5�>�����~=�}�n�m��+�U����)
G5��rYТU��Y,�I-�RV���2��_�1G>X> �d�T�l/,Ϲu3������_=M=;�+���du��?�����?��/�>],Z�/
a��N�§
�#N}�hA�jمB<��ݻiƒy��o�GP��=��:��n>.�(gfY	=3^v��n�N�f�?��
�
�����?�*⌗[���8E-y�g��7=B��7Ȥ�@~��C2�C�����c��3�#������IA48�����{ucU�h��`h_� ����z>�]�I�_�j+f�^5Ý�G�RB��e�+گ�I���?m��ީ7� ?�C��$�.�]�d�oXߠ�# ���߀"�mŚ�C���g�˱�>Y9�&�M!�g_n&����Y<�\�A��
�Qp(��g"X�=�����]���y�Vʺ��;����n��f�y�Ȩ��8�8	�Cǰ	��m��[YX�p�g�q��uQ܎5���I-|t �݁r.?�yD�&��.��H��>s9��a?�,qj�0Tx�%���=��jK}
$���w7�	�瓻<������PK/WUW;��6�	u" pip/_internal/utils/unpacking.py�Zmsܶ�~���	Y�i����r�m䌦����
�#qw�x$��Ni�ۻ��~���;S��:��b_��{#si��L���1�ҵ�:�A0��MU*��r���ʿ����X4o���p���𯷲�ץ*7�l+���ԉ�/r1g�Km��MedY��Һ�����N�e9�����D��cq�
Z������`�X�RM-��7�D�6�1x���Yr����ɛקs;{�n4���h�����X�{�ԩ�W�V"ɤ��P�B�#o�x%�4&I�7"I��lv����7�Ύ��������೙Q�C�m��}��+���O2�?hef�N��ٲ��ǙXԫ0@�2�ј61�_q��部#�{S�[�,{�5�`_�_�w��o7�a����@9����2�di��(LRo��#���Zv9�	����d���Z�k��*s1��W�d�%�(W2��~ȌA��v��
7�R�Ԫ�NH]At'���Vܬ!NI��v/Vn����O�ð���I5��1�;�%�	8�]‹�E>Dכ#�KYdĎ��;�<#��U�k���E�
[w:ZJ�Bfsv`%9���΅@�Y�ň���`���5�#=��&u�I����/xG�43��4HE���/�UC 3��j
C���2�+� (ij<bY��z��Ԕj�c���;�Γ��MY$�Ky�}
�h��vr�ҭ
,�T�
,����!�c��쪖KG��8��� K��#�`��C��>7���>�=R��30����ɵD�&�B�����$�6vz����ڍ�Ѳ|�˼6��\:.xb�!Q5[���V�ȇa��F
��>���͕�J=�U��{��;|/zi�s9��3�0��1��*���)��unH�"��Z�Hk�!4HM�Cx}��/#([kL��X�R YN�<��B=Y����\�*�l(�kؗ��D6�?.+#�C��ךUPg+[n�2ս�AQ�8�i!|Z>��}��=��bO˃���W	/������Q% �Ceބ�� 	�n�b/^���]��"BL�J��+��ŶQ��&P�qˇ
��kY�%l�#��O���w���hD�4��;�;m]�yQ���$�'/S�`�u	��x�;��yR���Bk�O~�O�P
$HY����'�秘��yn�,ѐ%�VE`����j0s.�鐶jS�);��@�W"� M[|a��=�l�f!�
��yl<v8�h�9#�̱,�y"����
�2�%x[���+Ma��pN>�F���
�Qk�+��;���qA5����g���^�6Q r�0�T�h��Z8� >G
����Џ��gy
c_��|�Y��ѨB��7�ㄑuZ�w�jT
VA��ߖ�_B���I������(���ϮY1���#:?�s���R��!���GL:���!�+�Su��z,�Fh�W��p4�Op������/�1�w0���Ҷg,�fU�FKH3����ٌ�D�ť�&0t����n:��,�\�T�,bQdUf�,�Oo��Xe{���w�N��ԇ���طe�I�g!�G~Uʌ�O�'���ƶ,GO�J�uq��R�C�g�/5�.hd3vo�1?y����݇���`����쾬���c�"�T[��\�b����C���!²�Ӽ�"��G�Y�'|�����"�#y)76b��r	�Yla��,������ZlL>�Z�9[LO�D1�J�¨���խKWw�$j���@�x�d��п�䴸}� V�k�IN7�	N����n�u�@�\`�~����L�!迡mB�Dg�M�z�>��_�}�iF��3��ʄ1x��O�zBjp�"-3�Y>���ڍ��m�:"��;� ��]��E+�݄��G�����EE�����U==�н�oD<�g��5�c;�ݘ�YQj�Äv:	�/D�y���n�8��c�X&�Kh�8[���5��@�c���i��(V��LcA
5jتReV��إ�!ԕH�R�X���A���䲸�Ӹ��}�{3Ը�#M�.፮�x.��q��>��3|:����8=9}Pą������N��D'p>@��
����?Ė<~�^��j/�G������O�;�
+����z��0�\hw��p�� ~m���A�c頻{�o$�^�7��e�S!M-�C{e��&:$p�9ܓ���3t��o��_�i3v��o��~�-�~O;�f*�^�v���k{�_-ҐkJe���d�F㾁�g��3�@
�s�<�s
�nc��^��+X��@֖�;�w�Cm�]�/����y:u�-�ͭ��M#K)_�� �|N{�1o��'��Uҧ�	���H�K5�|q��~�0VŨ	��^�|��B��r��xb�W2eZ��煴�[��S�1�O�
֗�B�X�%�0��x
���c븏t�PҶ	I����,�����K�k�e�\����Lxs����S�PK/WUW~��9�pip/_internal/utils/urls.py}U�o�6~�_��/6r��:)0\7 @�]�`肃�km:ѕ�����|?�`~�I���#�Q1ہ|
��V!z�̻�[k��A����<~1Ģ󴅸��!r��a��v�q>}��}��kQ���5#�C��K^6¡��w��lxl
��t���	��,��8z��8��:�Ē�����C_V���ב�G)�#��(����3r:9A$^u�b�?��z�Nv�ZxB��
�~
d����^?O��q3]�
�P��J�knM-�ڑ�*��l`д�?U�\8�8mZ͛?ɸR%�\��%(��x5'�����E�&q�Rȳ.�O���
�h�]�!�$�:D)��0����t�W���4B���{H�XE��O�RD�7�|�T�@�p-��Df!��%�Ë��e'h�/��W�נ�W۞BTG-���ږ�F��I}�eo_��q��qր�!�A��'o�>x��+��c�9ſ�`�IK\��U�g�8 �L,�����1z)��)�Ȗ/��Li~�vğ�'l�|�r�.S�����9(�q�yg���؛�ձc7s[�.�9k���j�i��_�����9x0nC�������c���"s�X��Z���=k0,;"Ug�O¶��#���0�r��଺ѵR�0A��K_�NIo��g8V�#�1Ϳ��C"eQ'��Cn����K9��D��|�;nu}v�`�dxw
ߟ��߿�ۥ���i�W���ͣ��ӿ�Z�֘���t�ޛgIH/8_5?$��
V�RU�"�ڸQ,u|!�����y|;��<�\&~�cq�r���PK/WUWM���
!pip/_internal/utils/virtualenv.py�Wmo�6��_qS?Dl�64(�A�Ų6hRlCW��t��ʤ@Rv�m�}w��bGI �D�w�<�#7�6*�ZI��dxն}2�>Y�罍J�7�5m���n
oj'�U�W40oݧ+tW~-�2%6�e�({�����/���ϛ��o�ͫ�Ev}q�����M�v�r�y0��zS�
����R�US�bq��qx�Z��
�_��9�&?_��U�ϝi��RT'q4����2�(Eae�*�d[T�d��Ժz揉�r��'��ӥ���K��*���u#\�N#��v--�ɠB׋k��ɏ�	TR([i\#*���j��ٴ=0䇮1j�9P��s&��)ăP����*\�|����\
��͕ұ�Ʋ�r�밀�tk���8���8�G��q�r�lX�����a�m�'H>��-Q�3��v#Hee� �ҙ�fh�F����Ɖ��W@�bE�f��wfy��*�І��vz���:��C��[��z�{�����3DH�2(Z9���P�3�%���o����)WH:��T(�B ��"��Z�:@I�x�� |�HM�),����Z���0�$y�3��U`�E�ֺY���)4Q��5��O}�FVn&�7�袡sE��O���!m����n_��SH<�jY?:���Ig�mt�*9�fJ��uAX��ƕ��x�e,��|(�u�d�Z�w�bI�����3BV�:��o��9���,�Ѧw|pʰ�lQ:[UzI}�e邏���#�D� �p$����3ZB�%2����~A��j�Z[��aZz+�\J~|��n�An�<u�왧�J�xZ�?�߳�+�CS��G@��(
:�"6ф�hv�5(!P�_Z��fY��t׫��v�7��dž|�݋���[�0��&e��4�l�#!+ɍp����	�S� G�Y7��X$�������s&vz�CrD������3rik
aS��]-�++r'������ԧd��3=wN�y^��༴7��6�@�?C�E���a�����
%��	;��#Ѓ�C��pSX��I�/(�&�9Ğ����/���g=�+=���%u�]L�D��R����i�\6���2sd΅<�\�B�1&�`	|W<Z�8������=d��Y!�`��_3��],-�M|�v���zgm8���hx�[}���l2IJ�j�<I{a�܃?r;Ӆ_F��]���O��~�u�r�I���N/��.
��K<��*�R�3��Ͽ;֑���=S�t�
N誷l��V�Ӂ�h��A����U�ѫ؝Yz����2�N_v9zٻ��PK/WUW�(�K�pip/_internal/utils/wheel.py�Wmo�6��_��*���h�t+ִE۵����%�f+�I�u
����Ee�M�-��x�=��$��m�2dՉ�p)4YIE�R}�bM��l�v�XMV�f��%I2�����r��]���
a
�u�0�����}�h��L�
o�7�nv-��+�����x����sZ����$'���mly[,n����8���+:�k�K*��%��7���L�0L	Z�k�Z���Gh��>!����w�_�y������g^>uI���<'���l��@�OHŚ�W�Y��q�V���,,ʩ������wω6*#g�k��to�3?P�˯F��.��
���v�H��-�X��)�!
cF�%ռ���������������~�8D����ڜa8Rq�J#Վ���yU��_��� ��5�g���ڹ���Y�������C$����.<�7��-S
V�{��NDŽ���	��(��hS��d;��������!)\�RL&��,�2�w�a�E)����57�ԟ/do�)[�>����S��Zv�dw���|����r�=E���D�g�x�(�a�WDH� ى*'��T��L���Sj�M�f<WL����+� �f�D
'Ӥ�!KF9�wK8���B��r�<Jrr�]?��:���V`��M��K0 ���nj�߻��tb�QE�d�*�n��x��DŽ:�p=xI���H{�� �?tޯ[0��6��T�9�.�|Ld@.)>K><�[�����x�
$�8�4n�~�n�A*&`���NW��Y��p�,�u�ܵ�m,w��B�[�hC>I0�x��D�(F�E,�l�c�^d`�3��1i�zO�p8̓�l{b�S��P���jN�f;'���Z�=�D�G��"y�	�6�n��0�Tg�p	���X���b呯�~
�JJ�Օ�&J�bY1(Пa%�Hn����H���=>�]+s��w	s�p��[	 .k/�o�Vm!����bŴ2����}t��#�'UՁ�W��t��$���l��_�mQ�RV,�\��a�c�Ydf7[���P�Q}/���J����Ώ����.
;2����t��*�-�
��p�R�V@i
�l���s�����-�dg�X@��{+;��zG�ZHŐ?M1�w�4s38N�1��,����<�t4�¸���(��O���y?�	���G�Q֟0f��N"��M�Ȃk�Z�{Lp.�T*��1̒�(p�(ަ�� Aӆ�����Y�H�,"�GZw���t�8��}��n}gܜOk=�Q���g�I��v�;�F���ώ�!�Ʉ
N�@l��j�b+�5b$X�Z�����yc6t�g��N(�
ݠhK�5���Q`{��k�x�3Rq��f�<7�J������Ӿ�R@�5Z��Y���ﰈ(2O�l�!�V1
=��9�W���a�|��k���M������K��\m�L��4�_�[;j���p\� �/��'Ǩ�*4b��(��ڙ
,��@$��fAO�{ξD{�,Um��C�'�Rs/��J9I��@�.N�`[�@&Y���$�-�>k>:�PK/WUW/���/Tpip/_internal/vcs/__init__.pyuQ�NA��S4� $��ēW�b�.e����t�t�����B��$�o�L>:��G��B&^��3e��ª$��S���0�\4���[
@7{��C��5A��F!��)���BKԑ,:�ՍOJ�0Ԧ]��3|3#�ld/���Շp��V�;7���)����aU{8r[�
cZ��ϖ
�n���ן�<+]/��e��)�j��OD����^#�+�1\��8{۱�`�w�Ӈ�����";N*~�3<��W����:�ډ�?0��>7E��qK�6B�b���5`\��/PK/WUW�
���
pip/_internal/vcs/bazaar.py�Wێ�6}�W
��[�
u�4h��H�}1-QJԒ��N���m9���%�s9<��D�(m�T�����B���S�D��;a�|l�P5�+r�6�/�f#����r
SIk�4I%L֯�M�9��Xȅi$;ц��j���2nLo�b�9�TU�:����rX��Uds�I\�'S��J�����֖�ׅZ��'^)�?(�^�u���J���㿼�wޤ����b�X �\�M�s����bJkVqJAk�Iy�¾0����2uQ�D�/:r�\�^�B�EU���&+y�
�}��C[�Jk�hu)3�Bc�Qq�vF$/������c�Y�m�r�/�Ew�p���2�71���X�$�A�0xH��V�d�u����a1X+��JZ�����rc���yѳ�Nw��v�{J	��A}P5��s�����h�M��A��%@�1Hۻ�g��p�֒��!V�s�,� �P0�NLe�,�1Q�y��6��40RH�G��׏��6&�Vn6�v~�t��:E��zs��a0���(�r�P�V�3�2�pF@�R�K{�t�:�G��c�g�4H�D��೏e92�P.��,�!ԅ� ��{��H ;���cLm�3�ט�X��.؇0R�x!�R��9ټg@�U�<m�u��<�)�'PB�E�8�Â&!L-CZ� e5�����i
��Pe�@�`�Rn�3;P���%��QGS���#�ɘ�x������(4x�̑�E�>v,�Jċ�ϋ����_8}�z�La�D|]�a%t�8���a_�ݍc���_C\�_
�zR�_�R�B<����]��+��C>�: ����t]-}�f�,ω	�>��B^h(�!3m�{������'��s:�V��_E�ϛ�L(�@���#�J�1�oD��4WLT�ޭ?���^gm�4����u:�	4#aQ,�qj�4�h�h�	��C���aJ��
Ӽ����C�]��a��f��4j����ì.�ET�0�@�4�Ô>�z��d�'WZ��JLNF�0a��-�Y���N��<}@�F����K��9��z9����eŇpl��}��_���T�?��;H�~���4,K��Rr�'�����N�������䪾��lٓ�P�>�E�=\v���o���PK/WUW|0�۱�Fpip/_internal/vcs/git.py�\{s�8��ߟ�L�T"Qqfo��N2��MR�w�l��HH„"5)E55��	�d'��:U�D"���_7�&��d˥L�GR��T�����۟����<���6W�g����8Z�ٚ�
Pg��ORc�nS�,�ɘ]��D��	B�"�W��	j�l�y|���<���M�
�$��y���(��`-UdI��q,�+�&K�I�>���J�"���Q�|�g�PՄ��#=��~�H[�+�c��E�%�����,Vo�E6�_b��mV���4�E�^���|�՜T���z�3=�~��iLK�,���*�"̳�q�a.6�ԭa����0�#vڐs`�c�2jb��n��%������a��C��՛�����7�ކ��z�"�nd"4�r��F3�dc�\,���o��#z�/�k���7A��,��eZ��������Mc[�\��m�G�Q��rÎ�L���Q�y�g�\L�K�6�*&�HW�)�\��Pl'�bz\����yV������}��>\�������o��?��5~����"*�J�mpܬȢ,1��Z�&�e���a��g�C��E�M�<��:�l�@���J�c��15�ov���~0�/E�m�Z�s$}�y�_��n�f���
9�]&
����<75K3ؿJU00|���n:<��˵�eĢ�y6�TƸbiV�"cs�W�(�'��g��yd;E+C,��;>�M
��Y����}�������G#��pL��t��w��dJG�X��g�T���W+_������l�e��t-�<�~������^�ppA�d�7��0�
$��<z��>��d��q�d���U�k��V� �ǫ�ؘ6���C�V�G8j��T�<��1o�RX:��?VL�[�g)��\��#OKNv��#Y��ZE�M���M7�
�B��T
b����'�|�(B3.�Cg��ͅ7f�w��.��==Q'/�"����������>�,d��*�m{^/��7��Q��V����vV1�h�5��=��H��,�D�}O�+�,�舉*7��}��p̰of��)���1���+�E��*rA6�p=�{g/y�Ցƃ�`�E(�O|��MvԤ����_�J�)_@��
���:�[�v+��ZpX3
n�Ae()�!�d�<�)�h�w��A�1�%M0G'a��`~�M�58+�=
g���됱�)������� ����x�QS$ee�AIj�%��.JX�#(B�0�CM���R�)�*��'�4 ��'���>��۴�f6�O���J���Y��X4`t8/S����=�һm��i��S�^���]��l��zMo�,M��Wy鼭Y@^f�;ƿ��;fFo�F�aU��y
��3�ZB��9k����Y��#�#"��Ә�2�ʍ2!�i>|:�X�ݞQ<�qx�F���(Qc�xD��vM]��D����k�����-�.d:a�-d�5���O�"�PL�GA�p���_ϳDF�L|���0̈���y�����C�f��4b���_2��X"ƴ��o�Y�/��QU�a�����R�;O' %U�l�N��M�6̬�(Un�*ܢR|)�y�<�y��
��sY��q����[��lJL
@���4�)Y���S���N�����!~�]|j5��BQԧf��F���F��T�|߃�j����7���:i�)�������j8]��*̓���J;̆m�Ƀ61Ę�S���6"��(0@�����p|�h&K�����D˅(����ฐA͖�".K�R5eȰd��{Ķ����iI��La���#�� 
��) ӂ�U@"���5�TԘ���
R��vZ
�P�̩'���
o@�ђ��Y��wW�3�"
�6� ({Od
b�b�D���	��cIz5�)SII	Iģ�}E�![sp#2+U���I]�a�C��vV��P�G8S�uM�
h��w��M�ڟ�?A�[{7�׌�&�b�fo�"d\2-E�E��-��h�c�b�-�̎����g�u��9]c?�T���k��5>�T��%�/�����&���<����rܢ��#1H�r�EoU�]G{���/�2�7`� K���w�w��O���J
gԵ��-� �Uu+�)B�ڃj'��Y.�2���Gm͈+�ၲ��V0�N!���a�[I]<@����}-��h���Ө��ug2�CP
x�6.DaQԐ�o�y}
f���V�odH����m��[A�-I��s��x�n�0�a����JN�`�^����=6���k��7�d�@o�eB�3:�������Fů�}���*?���b�Lp�?@?͚n�o{�칞��j"��OMPA8�<K�$ԗ꾪&���xb*W�9:C���?��Uݱ1z��&��s���/H���T���`�V�J/��É^]8�%[Q�:����*n5��>gNa\W��8�gC&Bc�Q�
	�&vN_�ͱ�����|����mv�NNV\`]��i,�w��Y]�r�oS�r�(�Ym�j�g��c��H�S,E��*sJ?x��A����?Y�6�
�ls���-���H���X
�P��얷\�Ж
����C}L��,��R᤹G�BG�^h|���kRw⹵(U�@��"
	�աD�p�ؐ��|��iU:��{!c"�{IM�Ύ���8��t���*��s���Q�ao�Kf��]:�Ip�v��gF�����*��,z���Fwa��3ɳO������1�Ÿr!�iN�Ac�����:�^�_��)Iw���G�}w����{*�m���5k�~�` 5��N���p����[aS�o�U�)s�?j�pJi��ڷB*���M��P����9�l.cL����+�;=���URm�=�i�Q�j�sd�~���:�6}1v7��-=[1/�
�qD2]d�w�P=ThTʬl�tn���7P|5O�?��IS�����Jh�X\�=���R����D� �=�!���>J4�!41Ae�_b5�k&!����G�@�阝��1r�_L�=<j���B^&X���ip��VOg�l��5��Y����:�:]n��+7D�5߳E�F(e�5��RJ/�υٴ���5���i8��[���n�S�9�'�|��|D������[�OkҐ��1Ȭ��M[��V3�9g=S���բM�]�*Z��PgӰ�u�i�����
��E�;� �6�X�*M�U�b^.}<�3{���o4�;o;5�'��.���{�BBcz`w`mٳ�3C3A��}�[u��'ݪ�7�<��h����1�dz��j��h�m/P�o>�}ڱ��q�Z��u���($�t�
�O�m;1�a%c]��]{�Te/
�1 i:�nY�<�TgD���y:/�qz=�Л��8�S��@wE���'_$��I���O�w��Ap��rA�4:1��)�!:yɌBXޞ
��1��u����<ZB��y!��YG��J�g���������t!��`t
,�ꊇ5#� rJ��̫?�^@�}!�u�o���̕��E���M�9#S\�'(<��w0�I�x�z�������>r�\��_OS��{�az�T���!��
��qb$l��\V�Q�9��|(�:�2��41͊��o��fF���I�LF���]G3�߃���/~��i����4�J<�'�j�n��S��q��f��I%g�6�4Ӯ��]����E�T�}�
n�P.�wР�����C�9�aSnsڂ���yi�C<�����a�;7�kg:���&�X��T'�]o���
�����'hg����.��w6I�(n���0Q�~R�
�&���mP�٣V��-�I#��ѤBE���O+���N��:���|��Y���On�VU��l�0��س�v���|�!���0��,�b1�:Ɓ�X�C܋;l��R�u�#�r|�Ue.߳D,yBul�=r�$*��Κ����=g�71� V��V�d�s�:��t�"ڴbιr�C�|ƦXC��WLkoԡ�}@���`T�?��g��U��Ƙ�S%\M�
��l���yu�a��x��`k�������8��ֽA�6�>&fP�\�C�Z?Th�I�Q�6��G`N0y5ՋP6U��ܻ�=�pحJGhK	�%����}D����r�2�꫐�gXs�)�
�h�EnUۯv��d���KFA��[�{q���a=xr���Қ��A��X���8��+`�t<��6�="Z]�0l�
h�v�SeY���)
hs�M�;�������9W�6�rOӼ9�y:���s1�;{�kl�I3�m��
�^�0Fq�������0whyp�9H���9	�����^��8v0�����vBgt]
6+{����=�94F�{ï�@j����%����m<mݠ���.��߾~#�fc;���~��T˲w߷��Qq�T~��;0�+�� ��JG�z��3����_�X}�c��0�����,,��y��l�ݥ�b�
ڤ��l"��@��{��MO{΍��K�Y��/*bkYL�_D�'�[I�>1E\���s囅��S�<��L�~5�m�j�������5֠az7��uT�wF��T��RV{�/]�0'� �ِk�`�f4X_�t�(瘞*s���=[e��2/],�	ӭB
�uxs���c]�x��_㉁!t�
�\^��?�Ԇ���tx�"���O6�Ь�ٙ[	�d񺜏�cIG�(k�
@��j1^�e�&�;�Y�q�o��D���{��X��O�׊6��`���s|�� ��
�2pOq^.���8i7q{0����\i9��p��^�������ɟ��_O����9�e�Pt�v5�/�rNh�5c�#u�D���n��I��1C���<ǹ��	��'�H�a�)�D�0������ǭK�%>Ŷ�jDv��s���]ҴY��i�!ᆛ��4[���{#��I���1u��Y�VO������7]���Z:���xÕ���_�"���9(Fb���z��ٮ�'�$E�{�8Ȩ݇�n��T:ŭq�����5�k`\3��*y~��m�C瀗�0A?�"�əB�$6�X�0a���.a���s�a-M���QՊ���£��X�e�	�D٦gI5<<����|8���hF�P�/2�[�)��~�@C�� "�O�j
�=ۄ_�����,�>���.,�y,�������qO�Tʲ�����Y��׎�T�B�.����W1ߺ�k�(Ik�4Ϭ��Iy��s�����×<��m��M�b�O@��:���	I��"�YPp�T�[<��&��si�z$�7�G��$���J.��y|�&���PK/WUW�q��~pip/_internal/vcs/mercurial.py�Xݯ�4�_aM$�Fc⩢hpil�6�rwe��i�ؙ�B���Ij���eL���v�9>����ʐB�
߶LiP3�j��r��R�6J6�Z�%���͜�j
���s�kk�yʖ�9�€�W9����#+od�0Q�ɯBV�����TS":�k�7\��_xY�x��D�u[�m��.s�n�*Y��h�@��e�N�#�=�Iqo�aW�|J�)�W�d=0�3���y��[��io<���pQ��T��*)
�R�tKO�'�g�lfC�����[0/�^J�`
P�T��fh�o��NqV����ɴ�()���[�\
[����v�Z
�����b����7��dmUƴ[�dO��t� X�E���ٟ�M���W6=A�L�nG����,�6*#���oqq�Q`:%��&Y�՟H�Wr7�m��?Z��� A'wN���l�C�a@.k��9,	��[c�z�.
5�����@X� �_��H�ѐs��G%��n0T6��-y��hb$���*o��/��K����Q�9ZI�[���HȦf[t����{y��Y%��ǎ�I�GaPG�V+�̈́8�ϳ<x����L
�` �(a�m�,BF�:1��4�9i�9�SȮ-�����x�"�����^��3�'�qɐeqL�}��g�������~2�'����w!t�ԹS�Ar�5��5hn�*��a#�߰��[�v�F�Pz�\+�@�l�H�I���1C���FtZ��]�u#fCoUD� B�ȹO2�t/�����W�@P�t}���޺�9�]�R���14Uw2���ubϔ-
ir#��$B�>��N�„�#�׌���(��d)��A
�t���cr	���3���#n�z���g
�&mW׽
w���Ǜ��u��.�����5�ղpcױ���V��y�#��zs��J�=�!.7�!1���bI�6����g�09y��P)�����,
��)G�y�F��jL�����G�hPCӛLu��tp�ݟs��;n�G�7I���� ȴ���[��C�Dt�ɘ�L�lOJ�U ��])dо-h��� �}N
�
��!˿	�1
�����G�|�t�d�xeTp�J(x�������J����q���K��%
���
�%ŀ��2�ڶ��x�t����Z�:
���0
Zwx-�!�b��R|i�{��B���:\A^q��j��E:^œ-:���>�a��7=�v����5���OE�d���@�b]����rƔ�t��]�����j�� �p5���0r��:u:)桮һ�I4W�X>�dg(~�=|R���4�x/�
	�Bݵv�ͧ�
�"G�橿���y:V���|����s�(9��}��ސ��*Q�kH��pԥ��sIqp�:�l�>~�����U��I1�%`h�OP�lcJv�eo����\�
�i�T�a�j���aS�ͦ"mkũ�g��&1q�{CJ	��c*W>���H2���~S��=����l�7PK/WUW�C�.d�-pip/_internal/vcs/subversion.py�Z{o���_�bK#0y���%�����]��-�^�+�g���%%E�{g�A.v�;E� ��}�����7�J󒋊d|�N��$�_������I�/a�������DzJyA�)��ˌM��2-�(-*&`*��4�a����'�}�&	+��}5UߓT��G%�6z$�Q��3��ѸJ���KY�,��0��B����h]m"�%*X��x:	fMַ��1��2���9-�7b-�$�w�P#cD���LHPp[	�u�|�\+����r^�x���E�N.��VkS��?k�o5I=G�$�+&ȹ��pͪj̏���,�`U$�Et�gQ-�H0X.X��i�C<���{˧�w�Ղm+�!
�VKf0�>%ΖDS���$���Eyp��{ï����3��D�8�pK���Q���R�PjB
5�i	;6���<����w���9�0�#��Rn����tSU��Y�/H�|\��.���b9gՆ'��"r��,�h�Dp�J�R�Uz��X�P6��"+��kr�y��ӼW�(ȕ��9\�J��9`�-�L�
k��CK}��,�������1���\�9�Enπ�-u����IՆ��ݧy�K��� ��)	�	;%kp��9b���bR��tV	�hO�ƉC�^+�s�6����E.P{S�."iq1���ηl�t*,�("�W�
7��:c��z��C���I%iQ3��� E!��1�6�d,!��ҤO:D3�2��'�,b@"e2Z�� ��������mV{A_^���f�`R�o)C����~�na���P.Q|�
&}�1��epq�;2�1bT�d�d&}fq�����:8̜A���@�Q�6X�iٕO���C�$�2eւ�N��*=3*3���o!x���.�6���e4))f��F�=��H%ܧ�KK�V��K��k��'���e�<���#p@������zVō����Z�"�B�j^��C�������xԹ���W�&c�I�d�`P�2Rqr�@�`	~A�mS��j�Y-��t���	�:��(�&x	f3���p�70-8��9�{��=��3cZV�|���D=*&�!#�x��c��bȲ{�u	�#Ǯ�/#��v�(P3�>gK���Ӕ
u�c.=C���1����_+��������.j�d��ųg0;�D��O��o@DxA�R����@�B/x�,�0�h��ԃ����V
�6`��Xܢ�Jk{�D뗭�:�����NZ���
uaO��f7yz����o�l��i����k�[̷�Y�d��A�rQ�K�=�
:�H^��a2��&㳸�b?��Q)�m~Gj��C	�C9@Ƀ[V)J�4K��/@Ne��ѹH�Q��|��v�g����h�z��Z��[da�HK����=��C��_�!jLP�# H��@}M�6)S��=�By0B
����?�aMa���-D���<���*L�:U7ԥ� is��$>�D�eo� `�c�.�e�7]ڹ��`0"h
h���tCa�Lާ�~h숺���'������k�
����1�`�1��_w.�s�`�_����8����bqP��z>��h��E}�jqҊc+�'h�G�LBB@<є��99
_��3��7���SMF�r�F:��x����g��	�p�q�����C�M��``�
�ާ��<�TxA���e��|	�Q/`c`��&���#�����,U.���e��S�e��b���L�A\�(�Sޫo���}1Za�uJFE���h���
MG���4���z�}K�lO4¬ r!������g���*R�õ�u��fY�e�� �5�7��rԟ��
U����
u'{!����2p��5؛S�PJL<��*���A;O��'IA@#�nYL��M����[��E
HaM1+CjR\�9��	S"�-��8��B�C\��o
��iŒ�'c�5\Ԧx����:}YH�e�o�FHA�"��)AM^@O{Ţ.mL����*��k� �
c6)4c۹�9��C]b3o6Ci�r<q�
�E�J@S��)X��Ԋ�9��ݗ�؎C���+ad�Ѵ1�Ǻc>6t�/�^+�u-��t��šk�
F��0��M8����#άW��Ѓ:��'�/�IfG
�O��Lc�d��z��&�ѽ�;�s�/M,��'���ç��Ik�
��ȗ,[�*�}8qXA�F���.��E��w���?�d��,�덴r�[69�o���
)1�]�tʁAM��k��סt�����@
�3sY�B�C5CU�Q�naF�0��+)&�=�P"�D�=�9b]k�<�p��k�Շz0S�-i�	j��0���Z�ؖBs�Ak*�8t�M8��!۱�?���c�=mB�5��޾�4*mh-��.��
՛�t�Y�akRZ▊�z국nn��.�nЇ`*@��o�t��
/tCP"���:,�Ū�lbe#�x���9�e=�k)@k�py����G�'�gǧAg)���z�J�{vK��&��)9:Y��� ����ы�-��YB�.-�^��p�ة/ã<�����O��
r|���N�tqr�8z�Z�3��l]ԏJy�g�Yzw	x�7����Nߛ�Q�狓���/���4\�U5���/�㆘9�<��fX˓�_�}8�8`��L{P�
�� sw�.�����r��
߾�m4��������"��R�*,bZ!��
c�7�p��cBg�v���G����T�ps� ��[��Y��P��6�!:����;��j��`����3���nXA�bO�EwT��d�]�e�;��0�q���\\��	��U�^=EtKS�c{�/V�q�-{Š�S�#�%ܾ��L{T�����\T�N+]L�����r���D�A^�a����%�;wpb���֔�����[ϱ5�~�R`mH�1�U!��4�t�Z�`�I_m��R�J�W��A�7��pxo֠��6�Y��ֆ�P������؟p�1Ǜ�`]B��F�O�Pp3��6�d^TR��T
��;Z���lV�b��a�3�Gc�L;�ğ9d���΂W��O���
�e;�ݣ��:�F��b�/�)����Yv?`�)��氩ˢj��<����LW��i7(���[H.�f�9�dol��-�c�\��ô� ����їLՆ�������3fV�Y����/�4ያ����a�ikLu��k�
7:"�M��Q�����{P9��e�uȰp��߽���-�菗���f�A��h|�PO?����8i)U�-��/�6̏3�_��&eׅ��K�`jKG�X�J�bp�q����D
D�4�m����]�wEvR�cm`3�є��C*4ہ��m"`�TdT���	ŝZ^�-;?Y��
���{(�-v&��9Eq�������o
���v�� �v���۴��b���}�'�
MOd��·=�;��G8I��{9ɫs2�^�*�k�X=�ڰ8l�إ�8O�{�y緗=��_�M�#MlK��P+�=�W��3�D��hPgX��"]z�7[ۈa}������t�/hJ����oQ�w,��
~�S�ɿPK/WUWF�ز�Y#pip/_internal/vcs/versioncontrol.py�<ko�8��+�2r�}i˛��`L�&�$;��f��,^CVKl7�j�#Jvz����*�")Q�x�k �d�X/V�J�䛼.+�X^U��6���f���FVs���N6m�$GGb����77����R�+��ZQ�w��E�T�X���Q�h��-k�;����߻���Uv�ͫ�y�oz��닗�h�՛�7����]+}��P�����o�۵0���wﺝ�n�3W?��bq4?����.�D
��[ZT"U��X�/�l����?���{�5/��vT_�7�j��96x�4���@��t+T��Q��~�?����6���&��J?\��m��Ja�S
���=5�O6��pǻ�˫�E(@D#	wp�m�p�Ԛ�Xu�]#�T��������X�̵�ײ��mV��Y޷���>>8>̩���8�L�� ��P���1H
S��s��_v/�}�o7�J�;�mM�w߽������!�kv��5+I�hU	g� �YC�(�A���(ːH[���P�<C%�
<2ژ�,��g�,��-�2�]�yS�%�#����p���j��[[�5��5C g^����l%e�	�����ۮ�Y�t����
g����U△���÷i�K3�	�B�͵ԭm#��[Ys=,	��u^���5hӶ�d��‹��8���W�)
�$t�I�I�d�����;����qv���3W ���E���Z�W�)g!ma�8�#�%<��H#��{ȤG�"�.X�8��'4�-�n���^���{Vs^��]������&eɍh�&��@��g]�U��x9�o��!G��M����)`Y���%'ȅ,������䣝ħ�py���-?a~Jz���D�={���C����/?�;���	46�^�+d0[ُ�H�f��!�����,�L��7o�^�4�v���0���7C~��a�=S<o�
����(����|Kց@][L�S_hp"��=�f�qm�/�{��S_�P&���A��>Y�u��f���P����@6�&�X��җ��~sd5�7\jf���1��U;	�g��*E��
%ȁ�ü]�e܍�g��R���AeBI�vH.���Ov�	Y�� 
�i۞��M
�g�;"��쪒�FTB#��{�جm`�n^2~����j�,F�N���]�d�Ȫ��V �f�p-X��#���{�z:	��Q�T�.���l_����5{e]23��;��Wb��dU�Y6S�Z/�]<�a���x��-��#vC������V|�\�j0ªuFW
����B�E�K� ���h��,A�:h>�L�Q̊B~h
Η�b�|��ڐ��P�9
⣐�b��Z�RgƔ	������ޗ�O:�8��Fr��$�.���&�699�^K�{���	K_���j�)<�� z�+-�ۻ@�Dx����aRdG�cQW������6z�WG��o�M���������˰��i�7"�y�j�E
]#MTR�u�S
�1�"%���\~�h������`A�}?&LF�sCFVnC�Q[�3@FȻ���(GùX��� �>��E�[�S`�"�a���h��F��I2< <�$<�j��3�	���$��r���*\̏��<YR�=4T3�������w�u�r�k�t���ԧ�g�(X���Yl8@X$NV�8���ShT���Z��kh	�/تk����H�Ccu��7@/�\�WT�i��9c��y�f,|s��O����F�܀�k�g�͹$Wz���}��E�$��R `����_�����񞺫���JԋG(�ǠF���[��~4�9�ʔ�"��卐�b�ԘI�|��鮴S\���� �x]J���
�>�<�
`���&�V��aO��>����*�<3����=	���`8J!��|r4�G�N�Ҡfy�y��^s�W�V��5m�ܻ�:<�1�幝ň�A
óp�Occ�j�i�H��~�\�m�̠3hR/��XB��\yvpJ<�4
�H]b��'��m�U�
�q@��ݥ�d���<�m�W�j��6���:��S��4
3\c
�:�t��W�)�nT��jH��z� ��"�.�	�<Tm�q9FJP HC�b���kǻ���U�F�a��F��eV�Ŷ
�ӯ��%�7�c,���=�)��8��d���ZnQw��L�� [QsM)��~�|�r����^�(t��t��h��~����g��󍔊[_����5q�����.x�p�@!i�L�
h����5l�K>a:3G P�U�Ic�X`�⪉&7��Ɩ��7��Xmw-4$��ZA�H�+��N��lj+���u���6�0�`�|��x=��c�(�Ijk=�7���/P*�K��K�����X��T���H5�N*��5��+y�n�`o�,��`��ٹ�3�pш����֫��x����Am3[H��YU;����{�i������4E+dfx��R��1x$�����F�e��l���BW+`�q`�A�|(G𜨸��F���hK��eI�5����5����A�͚��Մ��o8�8�+���>�����@��k�0���b0�G[����y��CȈ�^��L�P�6��e�N>Z��Y2?@0�4sD�������0H=딮���cѝ�6<P�v �j���R����g�c+4;L(4�A2a�}�
�������<���P��A�� {�Ÿ]dR���G̳��OU���JJy_W2/�H��5�}�]z>��hN�7�3�w{G��5	�8��XZ��؊*o�t�e
�:;�Fe��x�;���MlQN0V�n�p�0ת����3�Ӵ��c��ȷO�j��2��c�
�����/0,�z�wrs�"��Q
���/���(_G;��`[QDtc�{t�IL�qd�3�f���}}L�.��0v��N�,M.�o�la�Ed�ޱr�ڽ"xŭ����Z����_���iO�̓!P�*�����"v�#�nɪ�|��:��	�Rr�|��4�
"=$D�������Á!���@�B�bΌ���V��1��"=�|�K�n���γyhqjm(��dq�8���is?J�:c���Ծ�g�@�G�<�^�>�k���7�IvvaS�A�z���	���p������U�jJ1r�tڹ�$�;
ú�/1���
zW3��*��OX�J��]Xj!y.*�.B�*��+�£�������)��?���wF�|@
V���S.TvR�E�Q�6a˿�|�u'����߂��1��,Co�q�D�2ގ˔y��0!Y]�X�{;Q���P c��o)�܄��d�m��\�`���E��75*�Ix҈W^�Z��g���bA�Q�^�	���DN`ON�X:�E���`�x/��*�M�GJL6����8X_c���2���MY��D;��Q]��f�ň1l�)�^�
+�4q`��̬8��,�N`>?�ٞ����:v�X� ��WO��o�;)�F�G�<?�I;n)[j��Q�Y?�Q��"��iG���}Ǜ�����F�x�iME�+,��%<y��ZiB���0Е=�Vr!���O�-9�K�d6�U��O���{}��ӯ@+ZY����ӯ��׋XW�/���)V�B��Yu
ON����Q�AWI����?wwlK��� $6n�Ӆ^f@�{6�|涹,7���NW{X�h�m[
�_G�|��r�y�'�5�u']�e�{N�
��:Ar�C�G�cv��C� �S�X3�ݵ{�̴��|a ����="pLy�EՕ�o�)H`���"�ةi���=��}�jM��AeK���	p*�K¡p��M)�rXkp64`�8x/��+�<�$�sE�"��Zb� �r�P=;l�/)~k�����Qo�h{�4<��6Q"�����<C�&�Ł�-��NY_^4z^C6���"��Pw�����@�U�	�m}���1:Y��
�γ���A)�8��J�[8K�Q�r�Q�ቛ=�3sl�\<�{5�J��!�d���Oj�c��qy#X�����-7𹴿��J�k�ySq7gsP�B�D�9Y5��m#v���`2[�G�T���̄p���b�k��.��u.8P��s(n��4񺠧ୗb����p�I�!?�ͱ�<��K�Ja�[���Z��Y�@F�<������~�3<��,�t!�k�_�h!��փ����(0<��pTO�-f�N�d��g��];>
j�϶rP���MK��i�KV�;^��F��f����k.���__�0�״?'��t����p�3��H
t�2o��F�	<:iy�@�?�󎨦D��׻��� �~rD͗P�N,f���.���H���)�ai�I�Ҙʣ�`�dZ�6���;�;D��/#��<,F�}{@z�����S4d�:���%7;��m~�]�	�����AE�<2����o�����tȥC`�I� ��$��3R��πx����1��z:��.�g6k��%ϐ��+��=l���1z�_E��̔��cV�Վ	�D(���mmE0���l����6���0t����C��[�z��j�(�	���,8�m�����̞Dy���PRp�*����?R�goן1��H֯ڏ�J->/�(��H�0i�ъ� ��~�m?w��I8���x�1�z�f��+̸��R�ŭЧ�W��1�4-��V��aJ�Ї��>�H4dU�0��(+h�q�>D���^��96��ݵXє�Ԝ����9F(���b�Ws�K�:�������~�e̛i��?�iy�+�	�s-�i��$9��C
3:~vzz�Vh�NwT)t���B����g��_��}��!-qL�k>Ӂ�W${������)xq�0��O��Ў�q�N��������S��AIVʿ0��S��Ӵ����|a�r��*\b�%K�d�����hg'��OJ^�W�XH��X��0}$��^�p:��tp�L���ϡD�N�����B�11�E?�`��-���f��~'���
}Q@�a�P �>�$U\&�ki���~�Ě�߿�HG=��u4Bl�O��.��1����q�y��t}���]�H�����,��Ɣ�k��ȿ1s�S��9m0�G:�W&t�.`*K�YT!���_>Q�9Ő��������6����.�eHt*"7�~�GV��kx��� �
�_A�Af���4���#�v�h��~	*�(q7��L��/�[�{I���F�g�-e�:fZ�IM�٨�|��δ.d	���N�	͏�X^�$%�����[�
������[�`���j���ht*>�
}�~��|=M����a�мN�/����2��s�2#�D鬙�ɺ�-t! 5y@:��|9	kF4%���
F	��=��o`��ayC���L�KY*[~8�1�CxEU��&��a,Ё;�.2+�-��ZI������6HO���� h��}Em�f������Dw�B㗠=�/����b��X+�����=�,���Q�F,���+�xY"�'iY�����,��<�+K�z���#d�`�4
?vě��髷߽z��EI]]�f��_t{S�z-�%5gQ�^�"]��/ڈV�O/��c�[�����#��}�;�p������K��«��*��j��A׆}���7I�{<&��-/� ���W@B�֮Z�rМL'7A���h7��#���&�����/�5?p;er,���Ab
����ȗ.\�����2�@�‡���8�1FR-.;���
��+V�`�����/�Quw��X��:��s�@���\Jt��AmZ�9����T�S^�ҧ��S�0������Oc`��dž����D�E:�ih*SM�W=��[�mN�/*�;���S�#��:ƅ(��-�'j��ibˏ����l�����_&����������ɉ�A�cv'�=j���Tv/�
�<ױa׸�_�0��$R��1��]�7Tn��P��G+nkwK��/���<Tv�L�}/o��p�P[͝�SB���A�0V��m�����SO�ߜ�y�����m��~����@�+ڎ�_(&�Ld�"S��p��ہ�9�PK/WUWe�]�f�pip/_vendor/__init__.py�WM��6��WΡv�h�i�94�
 ��!��4���D������}CJ�6��hQ��8�y3C-��Um��RS+�[|�'Ք�����9a����Z��
Q�jq9���4™�|�"��d��$y�4��Ʃ�zg��]e:]�
��K�Pu�y��$$�*��{�%][H%�sK�)���5��Z�-�:M8^Xʲm�;KY���^ȍ3����$��Km6�o��V�jxt{�$�ĥ�5q�~�M�ubW����%��B#<��(�ǐ�x��TN�J� x�Q*����Ϫ,�BX��8���(��r�9v'��!�p�nѻ��R���'�W������եx%� ���#ܭ�_m�
��+�����H�"r�1�UZlCn#;
A�B��9�
��i�0�Z��"��ֳ�C��}8K��8��\��b��'������M���$Bd�w�U2�zƌ��%�WD:V�I�/U�������]]��.�{Ƥ`/�g`�Ț��!pʲ�*	T���y�p�D�+�-r���߰�V�G���M��
�h���a��ˀH4ƣNO)���4���7Ԅꁗ�ֽ��(���M�����lI�/,�ӑ�����//RT����2F�^�L>�$�5�����K��ٗE
�k�K�l-F�I��v��'��5�F��Cт��S6~�E�WOW���rj�x���5���x���|��	j<Z2bv���z+�C�,
��d9*t�pm�B�T^�$њ|%����Z�D��y�
���j�8��S�jrT��"��PC\/G_]��r,\C����:҄�a|�X�GG >�xI(QЯ촴N�R����X����#O(���j��$t�ù�)t��XOc��-4;�
�p2ۇP�s��ʎ��B�
��`��U�<5�a�s���x�
��>��H����x0�H�V$(߳N�k���E�X�g��v�-�{f/����-cw	�dbt���&���5�1�M�E	f�0�}���	ó��7�{]I���!�`Ԏ����󃕷��X�uE�;&�x��9�q�Q�)��(A�'׍}��@t,�t+Ύf.o`��O�B�����(���M��m��ܚ\����d$�#�k��a@��(@�h��x62�aVT�ͻw��G�H2��>�d�q�K��a�|B�Y�]��c�q�Z����QDz����K���"�yE�[�
�:�V����[�g��\��d��1k ?��$���k�d���2������%i����k)6�;U������7e�a����ȉKńК���aj��qF�=��N<�DP'=�?�f��-����`N6��AF����7
��̷Hq���Y��������I�4��<M�q~��|�
o�Y��l�N���1s:��]+�pV�����tq�����CI�$43��
���^2�µ��:����V�r��z��vxC�k�L�k�UM��}.<L�8��v4��pϞ\�jV��4���XA�rr�a-�M�N��4�:*�X���\����y+s��1��2W�4������-ޖn��!G�PK/WUWAÓ�pip/_vendor/colorama.pyiK+��UH���/J�MT��-�/*Q�PK/WUW�N�Npip/_vendor/distlib.pyiK+��UH�,.��LR��-�/*Q�PK/WUWx	A�pip/_vendor/msgpack.pyiK+��U�-N/HL�V��-�/*Q�PK/WUW���Wpip/_vendor/pkg_resources.pyiK+��U(�N�/J-�/-JN-V��-�/*Q�PK/WUW��thpip/_vendor/pygments.pyiK+��U(�L�M�+)V��-�/*Q�PK/WUWRwpip/_vendor/pyproject_hooks.pyiK+��U(�,(��JM.�����.V��-�/*Q�PK/WUW�X�\pip/_vendor/requests.pyiK+��U(J-,M-.)V��-�/*Q�PK/WUW���!��pip/_vendor/six.py�=�s�6�����)�1�O�%vڻ�ԝ:���>�Nv���yh��,���a[���@�O�rnΓ�H`w��],/�Q�\%��<�7{�߼~��z�x/�?�E���$���;/�%YiđR1�����m�F��Gb�H)���nr+G"���Ē�E<�� 
�[�
Jr�́Pϲ7��7Mc/p���c/_�(s3,q�2V6�bp�0C*Ɨn�]�ՙ�!��q��D�YxHe@^��ȇ��E��@tG
�p�B=�ۑX�~0�_I�[��0H�#�H|�g��b�'#Ă��k��T����{�q�!Aa9Kl�D�b��<^Tk O�<��XIX~��R��^�)�0��0~�
zq�X����
r�i|/�J��(΀c�u�,U��ҹ�b*��h��[�U�<��A�b'Th��63��X\���r89�Kq19�u��^�`$���>��19<��]��g�����>���o���Kq>b�Ӌ��1��ώN>��"����8������9����/�����������~���3���|"����j|��p".>O.�/���@�l|�q���]�P.���_�E\~:<9�€��g���G��Oƿ|���O>C�c����1U;:9��ć���_�	��`
�y_>c"�y�����gX���	���������x$'�K���)V8�D0ώ�
����ϗ�I����]"2WT��;;���s�`q`30����}	��BK��,�����Eb��nwvf	����,O��`�v���!4.��wvT�,��,��T'�*	1���ʼn~OWEV�Z�tg�q��H��1h�<��T%��$~�8��ih���xo�7?د� �ϩ��!U`VPs7I�P��+f3p��L���;��	���$�h}}-�d�wg�c���w{��a���!�l&�ݎ�?tVѭC@�,Qz>�V&E�s��G.���3��Q2S��i��J�NWJ3N����bv�>��_rG��l�jꦒ�ڙ��;���G��d%�G�u���y�e�p���g��2t3����d)v������{!����
�U�}G*���t��T)	��e�?�(���+�9,��D��.x�\�4����.8p�_<�H�_���I��Ɇe�$�S79���4�P�5[�Y͌�DB�����ΒU�X�Y�a�(=���9X����$��*���+�P%q���rbZ?�݈��5Z��o���e���_�����i��.��`�Ʈ/ӐkYP�YIp$g��j,�^#�o�������'�s�+�I_�`;H���j�̝�JJ+r��>f�9o�4��;hN��%��d@9+
u4q���fA-�(�_1��a�sNܿVd�%5�c��h0SF7�$GH�1
��?&ޭ,р.��	�^f؈���qx/��A�K����BR����;h���bYv��cPQ�s����6��A菄{~���5��B��F%�����Qf�:/��VC�:�{=ǨD��f*6mizK�6�F�d
<�X�?e{*��F���F�|8@�7��C�lD���]P�V�췌4��G�M_���d�dX)�ɇ'bB5��jC��H%�Z��T�5�E��������{7�1_�ݜ�R��RF�:�sM��檴͝'�P�y�%%��(�+[�3��l[g���A�쪰��(G�#��5�� >���h
�p\��/�DW7��.8"�LA�O�]p)(C_z����$���jC+����7~�,�Z��퍱(x�%��IG���v�Pm�Y;]�H׹H�AP-��_��`ꢚ�Ф��N����+T@tI���ZWV��Ng�!U+�~ha�s�}Q�S.��S�p�9� ���P,��l�-�F�"�
mlD)�!��9w�L��b.�B��v������,�0"Ct�`���&;�I��a6Q�(������TB��4�Uc.��`���B]�j����D<5�*�]?D*��?��(
LCm4m5/aP"��(ݞNG�W���j�̯%�{�k\�b�C�UҠ�>�i%�e�^���5�=4/���b�0��s̡}��ra*N�f߈��8�*�V�ϩ��Z�n��J�hX��]�ZB��
R)�P�5����L~�ř�B�[2�o�U����\��4_�BŐLk]���+Y���٫��~Y#��4�p6Փ5_#b��Ι,��.6�TSD[�wi��j�5�T�x�:K׻so{4��<�M�F��`��#��UM�)E�.g+���j���yL�� Mp�I�S��,w/)9�Y9�}��.%�	o�7�LU%�nZ��Z� [7��Q"(N-��cRo�,�?� �Ք�,���Ҥo2��ڹ�������lv�^ߑZ牧�T$���r�"����H7�զ�����v`v�]�Gpp�������8E�p�m�Q��P�gr��# �Dr-�σ���]V9)š�P��p�;�R���r-�x�4�9>ǁK�%��"e8jş!T��D8�LsHoB%�z�5s�4V_j��k� Z��o<V3M����NjP^�B|Y��]��I�O	�~�G�8-��Լ|�G���O��8ϔ| j]@hJ "^&�'���'nt+׈���.R�h�-$��Ӂ8���2�8�wS�s��l��Ӆ��C����/��d�`:>pV���j���s*��G�0��8%��v���'0�Ш�yCT�O#�o�?~CC�+XӠ�t�pp-Cr�{<N
�|5i�i�
fM�`�8��K\�#'yD��ގP��q�^]��W!􂒹\�W��}t��,v�J���r��s�?]8��#x�_��1�<*�48%��;~�X��l?y��{���?R�C�\ö7ϲ%��] �p�<����̶��5R�/>֐�E>���붙��z_A�R��H'�Ҽ>]��\o���5f>��q��ӆ)n:�b \WEJ�Oǧ��+)d�B�G��(��ID����Z��&��Y��i3�h��k�Fq�A��.��5�Zr��U%�P!������K�ܳ	4SH�)���8�e\Eh$��pI��*N[�::�E��q`<.��
��\��_����e�l[a�ػ�YZ�N�݌���T=~'�� ���c��n�o�P<�<[��&���Gxk�1`�H�^�����R�k#��*p��.J��N��U�f�cW���1�+�#p����:wڠ��"+��F�ث��g��n�k@�A'�<�����0�H�4f�
��"��Wj�R����00{�W5���YF:�#e��'E ���4��9нLce=���>�X��_��ugwU���Z{ϓ�w�@ZOHМ6-i�5���@I��8�$5�&���$����p���8+�ګb�Lm�����g�@��:~��~Z��~;=�\��"Tvu׸���C��CJsZ�,�D��T�$�{���7๪�$���,P�K�S���U]�wv�u�M��H�(g�x���Rn�N3�&��y�b��6W�c�&�s�E)��N�K��Uu��������Au��au��N;_���vZN�5�r�&��, -��5�j���J��҈`B�pT�X���dۣ3���
�AH%����A�%�	�T�Ž%n=��<ں�bj��ꛣ9�0O���G[��W���mF��u�nE��A���FA�jKܬh,O��+=�Pi���H��b�^����"����5:@���\���z:v�[7�������v"�>���k��^������k��o^��	���\��1����6��lW�J�<�<99�F�{�����8����Z�U_�bqk�/���m{m7�[���n	��n�z��*c�۪���m1Pk#��n	�);��*zU�U��[/��K��.�si�&a� �a�kH�r��������V�_�P{��6��2[&�c�������mj~NB�ச.����r��P���'7��-��&�'v�K��}.x�|˺���9��\�3+r�!N���oB�K�͕�&�
[�<��Y�z�/��l��J~B��oBI��C�K�ߢ�߆���1�\����	�g�?��#כ�g���犑���<@%��V=@y�t�|�
6D���	jt#o�,
�w�`��§�
�����)Ӹ��oF�=�6���V���퍦��{j<]��uM��bj
^��2���2����&X��9u��ĩws���*��&��T�!ږn�ynwD]�w��Ym�}���k�C�Oo�zDU��[��o6	Mh}�(W�]�0V��-��ؼqL	Èr�F����†6WR���J�~������gj�����kM���nr���#e��#�A�
K�/Mҥ��id*S��?C�_��Po�G ��%m|��6O���8oC<=#�x�������ȅ �RQ�����|ϭ>��K�#�K��U
~d�蹤�{�Dc�6�
�����e��:t�p7�3���Ri�ڼZ�Dy
"�ʠ�"�w���1�.��/iT�N�'Q)��m�!���Бqi�U/s��O�(�Z�5�@Z�7'�#�]2�	��h��0?Iw�0��c�zr����F�y��y�I���|�R�3~���T��y�$�|�V��
�*���z�*zl�d�cW��/]U�$t�|�.��׿�]%������lG���g蟛M�
��32�X���u,��
CwJ���Ǟ�5~��,؍V*����w�/VN�R��w��;Et ���i���<��y�;��K%4P�l���� �iW��}a��<]c���0m��Y�>.��a�[��Vf�అ�VuԫZ����!�g��>S1�2H�ZN-Gla�d�-gkEY��
����N�%I�i���"3>R�
<�zV����b
�B����P�FCP���AB�Xnkhb)gՍ��D]���Z�L�V�d�փ5��u�i�n�	�QL�@�u'W���3��{h�w@Ƿ	� {�<ڋ�_��Qhw�:Ն�3Z���Ŀ�V˔�Z8 
0w`@s%��9�� ��(�m�RHI������M�<I!�n��I�`lC�*CC<I!��R� N��a�8��(b���:�96��u����DM:��J�n�h����i{�.'�z�����ʬ_���DS���Km��f
p�R��9h�[1(՜c��S�>�'Kr��f�lw��A��j_ҏ5��`h�Z��h������
��}��5G�|�={&� (C��g�� �7��/BĶ~�����s�K��Bw�0�$;�N5;�3wC���iT�|��͵��@�1v`3��o��[�X4��F
��N�̛˴|��uJ�z�Ȇ�m��X�w�
S��%N�܄C<�:s#�
!�S��B���VG�Z���e�z�Jv��ݑ�xҞQ�qd�K=OR4~��?&�uPnM[8�ҿ��6}~a��4��DЁ�Ͼ�Æ�_���8<��*>��/7�#��ͣ��FR6
�Xm4=
�&��4[��Ο`���0~ƺ��nH�q��S>~NW�WA��CL^��m�4>)���ScІІV�R�!��3h�+�y�lP���օh�嘝 �5c���sX���2��_"i��ʖ�K�lZ?ث1=E�	��g��>��q���
D�~"�o��|LV6m9��f�	B*�lZ%n�� �3��t5{�1AEU��9�U�L��x��á�QS:a쩗�Hǀ�g���ǻ��x�<�(�i���%�4=�`q^�ޭ7��k
n��.f�[w*���u2#Pv9#�!]�U�s�ҳ@�+X´h�`Z��4��p�x�@*�;�FRځ�m�
N��>ߵ0�E�v�*��㸹�56L��.��Y��0qY��
���\B_��z���ŢP*:��9��*
���ë4[��1���p�S+�ҩ�{����3[�L�^�K:�	W�QUi��yV9��[M�}ou��|���f���U�"��8���y�Q���c>;����p`D��7�����4� ��LYG3�p$6D�5�!�:��|7�lik����y<�G\�aD�΀S�i04�x�'��|ΠK��G~�#E���.��'%5!��+2SY7>HiT��\�kX��
-5�@���$��^�k�I$�����>�	�%*�t���!���}8���b`����K:@�Qsܰ���kN$7�9r�A͡�vۂ�A.���>���d(9��W$����U�ȻY�Z��$�C4Jo
`����@��4���h7���� 2�#���Ն�1�;�$��Z)����47n���b�Mx6r�@��"��օ�@������f?�2�`�*N*��$`c�|����RK��������f7
>����y:������ KPf�9f1$�԰k��8Ip�h���*��vn��o�Ҩ�gd���.��V�A]A��G���u�tL���w���Y��ߕs������].er��a�,o�*���KJ��=>�[f�q���Q�|ǹ�Ԋ�OH��F�u�V3�I�TV���R�d����3E
�1�]�g��>��s��ԑ��
W��)�R5�
)j��`�.Lϩ
�R�#�P�����8(�erxqq<q//ǿ��e��������/k��r�ܪ6���W��Bשv��mp�	�y1h"j�mm����B���1̚)�TIݶ�*��Zk6������6�d���x
��U�6��3��V�
�H
��2�������:�X�Ma�k-��+����5��R�J����cNaPFTMSѴ
�Y@�,|M�rKV���v���@-gʝ&|��S(�y�e�Ft-�;�CS��I�t�Cx�p�:rQ�*�=cx�{��j����Q�}I�!iz;�p��8C[�?ϒ68�<�VJ"3�bj�Ý
�cya��.�s��HBH�a@�����o-���k��$�3d}<�[|��k]CS�-TH�Y�
�����{¦�:;\8X	>N�/6��
Z�Hv�+Yl�Qɜj�����5t���K{t��u�8	n�qv�vz�56�m"���A�Vqi���z,�3I�Wxk��;sq{]�=��bm��jlmp�Y��n&q/���ݑ����ݛ�MOFk&K����+6,�Z���o��b�^�tDJ�wi�9��2x5�.cެ��)��S(�:�&�M��5���~���J>-�Q�m�Ǘ&��g�~�aS��e�["7�`���Y(TQ��O����›}wk-�~��]J)�=[i5�P#����,�b��{g#��<�)�tT�i����տ��ɘ�]���5�3�xf�˗�˗z��q���L�1E�E�Jܨ��x���=��n���
������5!MZ��hP�w�gd�S�БyMg�ro���g�C�<Wc��t�x83^Շ���~���d��7V��3��i0}Y��Gk5���5
)#�sF.��T��o���_�[U��I�~��*S�Cg4�U��Ҩ���f���&�~[�Y}d�S����V�7�hsIU0���ϰ@� כ[b��bXE��>�ql���
N�!�3	�<����C���̺�'�{���2F��H�h��8d��(x�(-9]�V���fھ�0A����5�NcI�D��{�pg?B�����H�YU&k&��
�{m��٥�R9����&΢��廒v�iַ��N��Ji?���YDѹ$>0��K�o�����4���\����觥�/����:?(҈x�q Bw1�]��睾b��,)���I�)�
�(�V3�.�s=�K���j��K�0&�	C�E�g�'�
]�oʗ:I}`JD(�7�a���H5>�S�@��D�!���~��0�����$�>J��y"�X��&�f8w����hbءk��ډf4����:C'�n��i�Q0�x?c�D#�u���x!��_�*����n�N� �O�J��-����4�F@k�iDc DS�
/UV^F"j��CM���.��4_B6��UC�x!�MA��=2J�a��Ղ�^�ʒA�r��'��ݴ(!�Q%��(��8�X,��l_��6�n�A����c;�>�2�R�Ap_�衽R�-��!ڪ7���ĠW�Ћ�C�"x�0�k�
b�)�?+Ԓ"W��0e�WT��f,
?,\�Y�v{֠ua�����,�GmDE;xM�}
�c�r���ϖJ���[7F8*'ɘ���G��Q�y�N�@�ٷ��A�;�PK/WUW�����g� pip/_vendor/typing_extensions.py�isG�(����xd#���:�uF�E
����x`h�=ј�(��﷿ܪ*ki��{6#l��ڲ�2�r)/�U�f��W��Y�\���VM��D�\lV�����\�j�P���E��Um~7W�d{�.�,o�)}S��ՙ�u��+���z�i�\N��Av���s/{��{�\�/�^��ˋ�-�̈́�
��c��t�7�/ymW�Y�+��<zQ���}�B�o� ����:�x�F�gM��;�{��X.�C���:&?7�-��j����/��'O�l����pmFf�y�����j5{���UɧU]m�r�W�[�JԅYl����*?+�'���zz�����>�}]���<c�ĮM��j���gſ6����7�Y9kͣ�b���z^��\��6f��f�n`��y1{ی�|�v�O����.�n"�6�O�ˣ'Wm=|Z]@oއ�_,��
�\��/WQ��`R��V�^�Xd�9n�VUx>7�a'u;]��tʳV!�lY��B�ù�<o��i[�fQ��U����n�hc�Ѱ��&T�.��U�$_NO��ʚU�^�E���La*Z��P����#�5�+,Z`1����O��˹}�:h��i��虮�ˋ���Oo�C�u/˼����o����;���ϧO����w/���„��
�;�?�F+k��?V�z$��zSY���a��w��2�j�ӢX��`h;c�i�3k�v8@�a�Y
k]_�|e�>��F¡�ytF���/�H���u�k�R�G����=o�u\߀~^4��ťz�Ԑ�~W\y�/�
��ku��O]������"�a-~�)�jVD�mk��8��_�-�U�<�ES��� �7�GQ�g�Z�_���&c���XU��i$N�Ŭ2�{���ˀe�pX�z�r����\��U����/�����zS�d�(�!L�x^0c�'* ﲺ�r��j^.�a�K�]���:J<�`��b	L	P]�rE�VE1�J�W���j0_́HC!�?�Xd
t�?t4����z="���M��y�Os0/�tZ��N�
�#~����n�k#U����E^�-j�5�s��3y��1�-a�������ŲXi���?�J05|��dQ�]M��<��͆�T	�rx^6��mP~UΊ(��(�$���v.��w��t�����9ꮚ����H�#��
=�ɠE,���Hɸ@i�<o`��<[���
{:�2�=�������u� ��q\,wE�K;>z���`������Wk
���ן�+ꓙ�)���f��ѱm�����-�l.�e2E���Ǚf�G��pxj4C�7كm�!�������-XuXU��"��N�7�XB�H܍�1�>��_�Qs��gpJn`�\#�،�Q��r��o����=�&D��մ\-*���q��H����,�Sầ(?�E�1Q��u�gC&���Qb=�"�M���㬹u����ɺ���[M�	�N5ͨ����LE��4Y���]�M`/	P���?V�B�d��G"q�A��|���ͅ��_*���R�EY7Pu��{�
AV)g�Y��ρQ��$^
�0GQf�gG����p�!os����h���³7��n{�B��r3�>0�)䀊��"R!�)��Z;V������k����zZ,�J�����*,�)
U��T��Xy7Ds���BPG�x���?�]��
��#��6O�IzS]0I�"Ox��[3�S���<Цa������Jؒؽ��B�Q�0Z���p0"��`LzߥJ}'ŀٖb����"ň���0��v��`#�Q���"���wn�
�[�<u��W�D���m[�/'����#�2L*�Ԡ�B٨�p���R"1
���4���D�7�Yu���G�
w/�K�����M	w�_�<�r�V��hsY��z����/�۠:p8���Ŏ��!�9�!�u���=�VGz��v(�S�B�N�|㔜����4���*�'���%�Ap�l�Pw�,}�\ ��H�K`���j�xE��;�t�S��=���U��jaw��r6!�O+h�A��H$
��^���+��;��1��'o9\g�f��6�ɘFÔ4��Izi���o��<@�Uq	+G,�}�U���oI��
:;��gm�
���|K��<m�#9打)�[������H��HuU	M�Y�{d�}F�k2]���Ó�p!K�B��i�pp�ă�	��y�?�����!���zJ|ac��gV+��G���
����ʻi���ϊ%���4k��LL�����-�-EURL�SP�uH)?�\7�!��bp����Y���W����3 �gK9I�K���!�s<�f�Q͑w���̫�l��Yp��$n|-P���"tt�.�`��3���^��vΊI��Vt�I�mS�����y��>߷�v��}v�=��(��k����:���j�b�hL���������Pz{����pk���y�JC@�\�	�9�f�q�=4�aU��uc��O����-�����6��~��/��K�tԴ$G!�g��6�,H�ȷ����g��8-�E�>D�~[kO����tJ����r\�]�yۮ��?��ts�L�WpF�&U}����?}��#K�	�p�3�s��S�*���vY埲��\�P�9���6�uE	��kk��X�'[�c�)bd㵉�<�A��*�&�0�g2�$�{�9b�	��v��|bDܣ�|w&�Wx����C��@��;o=ҩ[\s\\�6�B''�ON�#���	O���6�������ѪK�#�euE���Ҽ][,��v��%�yU�Ǔ2>6��;^.�إo�5s�v@M�V�Z C@D�{Y�M�$�7�
���*�� ͲjQ�Gr@��|�G绬ȕ�4wd�z��M�lIu�k�Y�X����S�x�����t�q|�3�N�&ϲK�|ϊ)$��c��`�h�瓯'_m�p�Ҵli�<�y�%�s��K~�z�f��#Y�w<D�Mk3�b:m3�k��^Th�b�j��F�ʊ0ViG��J[�^1�
ܘ���QR0Wɗ)�*uE]�����#.%��2��SXDfY����~Lj��^�pk��a˚�N�K��̈́�r
$��8G37�Tj�i��%�c(��J�%/Ƽ��t7Ǜ��&��yw�v��Q�v�D��@��M�� �N�^�t�V�`,��K�=�q�ɵ�Pѫ\��]w;�30��:1	��Z�$�@}�h�.���������!�����ֵ��]��1�:��@	����p
�a	<pz��c��P��E��H��$�!��6�s1�P�NL\��@��}Q.�:[Vg�|��0L}_2�|�k����,�k���hG�_�a0�4s�j��8Y����I��[@�Ι*^��t~��1���V�Z���HT3]�M�hsx5��d]o���; �P��)��^�}x�I��g�L<f��t��b�� �n��YWڦ�2��]�=p�h�/�ۭ�+�̲���M�6y-�y��fŽ�@��[��G{{s�q�2i6�d��!���>S�L�r�?�l��?HG�BlBVڪ[1bp��⊕���v�I#JV����n��l�C�=օ�a�t����R:F�_7��վg��g�9x�z捃j��k��+�=��3BuE�����o�kD<��+]p/�U��������ʻ����g5N�����u1����ck�>��i��vT��2IS��it��|����,D[�a�Yô?�k[�%i2��)�S���2�����P*�@}�����!U��55Z�j�`�h]]��"��+ћnQ�5ݚt�G���{�.��D�K���ʧhbM���]�#�T��rU���tf�rRLp>��
2���!i'u�J�!��4ax�a����<xhn��1�oA���?]4ҫ�uVM�T�SPe�`��a��p��e��3�׆p�ʵ��ѣ�ȂI+��|"�P�q��J~��&j����L��15��Y���
L��c�e����,0���r2���*z%�LƮ�0_+.Ώd���N^3Y��3xTܮU���:�S�UP�N���:�3b}1b���k��^c|�`RHV�=@�����-�6�0�4o��֨<!��	�k�fÑ:ׂsy�/�S|K��֧dݮ��,�x���2��1��l]�y&�@�U�A��tVm�M�s���s���o��p���4�hu��e�

�#�^W�k.
6o�D]�#�1�w,��v�
�^Ϻh���u�R7��Q�s�R�����*��xr�r/�g�w����{	�����r��Mڇ=�g�<J��k�-A*��AT�=�X�d�)��xl�*7Ά���_��M�
=�g7�F��|7�`����N(��_=�gG�ӏ���ӫ�W�����߿|�W��4�A�����ʷ�s�~,ڇ%�5H����u�s|�߿$�<6� �B��;m�BA�R�rK4�"��)�B�����=6}|x��;�@�siBxo���ؑ������B~*/��X��3����aU$��\��cC|����'Δ3G���� -U3
Ɉ��U��"���'OXu������x�mm��`�6NzS����7�K�����W���E��*��YU��.�o��L�I��m]����#�r����!<��ԃN�|��������Lm�&J<T�2�Y�V�g�}<�IZ*�"��鷨_��a*9�ȭ��h��1��(���^��0�Z�1����/�s���9���J�4�R� ����7�#�Jc����ah6�j�*�!�Pw|`�68��h�l*�d��t�d�*S�YZH��^�+�<��i1���4�6�vk�����5�,�n���F5{�H���C��V�ƈP�C��&cL���ʶ�|
ٍ�����(���<�/E�
V
1��T�p:d��s8t6��(��
R�*���pK�
�C�{�@�odG��(�����1�R�{/&
����X:q+�"'ٙ����-۠[��Z��z�/�����0�uA6�%Π�w���2�c��~�a��
�Q	�6�dQ=�m)�虌�����-��	��aʞ5$�6��dc�Qb۱C��Ok�i0֠=K�R79gf�p��B��N]m�)���9�eCh�^ݎb��R�Ugg�~|�b�Xƭ�M��P�a��N[]�����EM"@��Y\@.F
���*�7S�4�V�jؠ,1R2<$�#��Ij�M���1�3[7�;
���,�
���7#��ݫl>�>uEs����o����7�b�xf�)�y��/�pE=����(���X�_���Ar��d1=[V�94o��
5��i?|�v�X�o�Y�F}'м#O4��p
G*D��s7�X�\܀�gc-�0��h4\.�Y�v[x��%u���@q�Ɵx��+c��M������ޘ����V�3OB�&2���0@�FxPvr�E�<0pbE��i:6�Ђ+��증�0�����ɧcF��Ո)F�����`��%:=,��_�w�+��B؅��
營^�E�<5�r���9�W��*�"�ԍ�G̡�x�i�?}n�aӪ"�FBı�
a&Z��n���7d �-h��0|��
K9�M��e��2{�8/��$|�Q��3x��Rt#2v�Nr���Ģ�	.�v�.�~��h�U^���b	�RJS[6�-���O}Z��%� K�#2�V��"|��)>��t�aT�[B�t�)@�'�%�o`��v�;k�Z�6F�l��\u�rO�������+��{U<��Vpue��Xw�Nf�E7v:vIWY3��e�T�4j���F�fT�(��yF�!�<��O#?�u>+�ym���A�7="���r�<JY]E�C��Gs��?��0��f��L��V���40�Y,g]Ls���@�o�L*锗RF5��͐i����[|Kv���{���<��M@�!2ζ�d��,�5���Mw٤���
�;bqhb(v�;�)��n�n��� �n3{l^�8QX�@A�ijC���0(Η_|��r^��m#׵�WHT��r�ґ9
9����R2v��~oUa"u_.�g*�I�o�T�F��*=K�h����3��a�,ީ���~��>��-�#I?�-��S/ؚ�J�&��[�X�Z�:�w�����3�=�3�p���FiW����Y�O�C���x���Rh+J&�2S�TeD�c����1T|c��*9�oC�F�8��)L����\�޹�i��F��Sx�'�焾E��m��ѯ]& y�l���)�GP���ad���q�\�,$1�%����$#H�E��띋��G���]�Ǒ�,}��v/CӰ�񣚙ئf�Y\]�b��պ�뷓�;bR���d8
wp�]r�&��m�-�T�e�;�<����1��~ޑ�S��2N�ihz�|DL�v0�2�Sc��]/�ԭ|̮
�}+:�U^��d�\�:Y�{����[�ʱux/\�u[t�kv�_py`���r
�jO��l;R�å���>o��1Y((-.�:�Q�x�vď��a�ɣ��((з�c���8c�˃�N3eby�
�r@l������8-��w�=Z�3yifb“��s�?
�4Av.i'Lj*��V
:��c��H)GLĂ���d�7B[��G�� ]�7��)NdžC�(q�r����d��]�o����w�7�RGX�8}u�L�J2mJ:_լ��c�M��{f��q~���|��T�׹�Q�}:����?�βZ7�����i�ǢE�ÎZoFJCâKcuK+!��8�΀�_Ϡ�qć�Ӥwy[���3(�|�Q�gW���?:N� "ֽ�=�{����؇І��%K��N҂��ny�I0���jx�oD�Y�����)�l�bO,�n�r�H�#����+�-T���Q;���FL4a�no���[��T��t*��Tڇ� ��������m�s�t�g��=����ه3��ЫA���`��.LP�Kt���mֻ�i�1m�m�9x���F�y��UAwj�
��������ӥ�L������J�=��~�R��^p��	r7.�M�!��9��7�ٹ�3L˒�%L���B�1��fu�*��c�r�4ʤ�|3{���Fc	 ��g��'��M�V(��f5���Y�L��P�	E��N��6��`��*�qN氭�e
}|�2ȷ���w���(��@��mF��L��0�g\4�k`����$�ٳH��J*K69�g��
\���SК���l&ؾ�~::<�yKn�P��6\��E.#dr��,v���'�	��[����_n���SU��&�|�N-MM�u�v�6�z�K�n�͂ʧ�1m�`[}���2�;U�RR�vc�hH6�2�jag����:��A����8G���G��X�W���h�2��w����"#F{"&�;7bʖ�9�v��K�]q������}gu��>��U��Mh���H��ÛE?ޓV+Ö�0%݁/���9Bã�8js{8��Yv��w��� �mm8��i4����ge����Cʸqm�|��LGoA�
���а)6�M�o3pF�DwӒ6~0w� &E��.���GC��;ґt�d4YM/?��{'�o&�B� `����wX��vA��4�*��tM��{�	����_A/��^�����-��,��/�3�n�^&��{�>�`���Gy�W4� ̻��F*����4EI
Dq�&�O����z�,9���;�^ō�W����d�&�[�kI�&��<�M—p�w��͛6�NZ jf�貯��|S*�ӿ�i��R��	�MBs��e��#G@w�� ���dd��C}�lz�nJH]�t&'"'G��[Z'�k�lv��AӃ�9������8:,��!O����s��P�v�z����q1z����qQy����qQz�q��I����O��W����豢J1�=8�����r�C�>~�	
�ʋ+���A"���:���������n�˄�Lk���y�a��~�X��
M���у�� ��ゼ�dC��� ��G
�6���<}�!
47@#�1��l�������(e#,�����O`D��4*o�hZ�M �-|��P�J
��I!J����F`�I#m�[�j^�A���4���:Y�Y��M]Xy��^��(V���X�\��ђs>Rgc�W�~2���:ྀ�1Q���4el�<����@[ܩ8GL�MTd(q5=N�����g/l���a�ƶ�IkZ�q���m1�����XՏ��Қ7���fO��U�%����d_W
�����F0��EX�4��$~�i1R�K�@����-���r����j��-�����|ғ�$%����_ܽ�_O���/<�6la�o�6_�$�鲪E6��󽦽Z(�d;dRy��˯w�$��v^�;&U����I5�'a8�:���y�w�ze)����1z$�/^��G`���-�H�N��c�n�>4@�9Y
��3��s��Z��B�$��Q�"Q���ےsP*0�9��낢��cVAk�K3@S�q�Ji;��h`T��~��~yϩ(lH%�s�~ꅛ�|�a0o�tz����o�?�z����R�M�t��m���L\S�&*hyO������ma"�;#�^L���SWT���SD�kB�g
�{ܔa~��S\K� �a�i�o��'����P9����s��Z4*�������	7��kˋWJ#yk  ����3�F0/P�~ʞ�0̫�����7��|7�eNt���m
,���(�"���8���������x׆Bcv�@f	
�i�q�@�g���|d�Hz2E|�� a�*��i�tr
�.�\��0QbBk�]Ҩ� �~�3�Z_qQv�WDW�f��mV��C�68'f��er	����yFU�"L�x���#���.��g���W���%"6�Q
�s0>��!��b*��j1�m����C��X��\o�%�ĵᝌ]���턯}6��\M�+>�6b�Bw���G#\<�����>����f����*�D\�~8'�q=�q���g��Jd��X���D��,��lg��0A���O������7�a���h}���K�%�zF螱�c<��˹J��|U����J��(��V�^I�k?X�⌢�s/�X�n9Ys�o�k	>���c�Nڪ� (1=,���ZՑW�(~��ɸY��mN�AX��A:�͇���d$�.�L����[��EWKJ\K7�c�΍����e�p{�:�r�<x��t�(���{��>;��K���~��ێ})��~K)u���+�ìa�Ua�)6�-a l�����U�3x�I���@ʨ�g�"nޱ�N�a���{5K�ܢY@8�^ ���i�^
X��<k��J�e~q:������38ӎ����b��b9o$��8��eܤ	'�&��ȹ6���Z/��#i.\>!�2�SC��"����A�=����v��e���Ũ�@1�)��

S��<�5T����e���O|#<�N[0�լtiJL�)��D��p������c��0fq�u�5?c���:[��r�>z6���ش�I�=�J?^�Œ��\þiY���~���
�>��T
�Ϊj>�!-�w�S��P�s]�4�z�s/{�F��F��#������� (��`���3�*�gSnfQs	L���]��\)
FԞ�/�)=��6$㖈�	��
���SՆBM�2n���$���E�_���ͬ č��'6���IADܷ�ؑ��J��I����Qͺy����ԝ^qF��4�l�v��Hu��m�
H��CY��)����z���ځ&��([ұq�;��%r�¼mD��.����&?��Czk����F�Qw6x�5�
e#���2�]�o��{n�?ؽ��=Ы�g2�wo�X�<V�
��zB�$RʫTx�(b</ߕs���}��I�cI��������1������9ɫ}=�#h�ضq�m�+F���/�$~�җ��ꤺ&��T��݈On�?�8v,O׋���V̧�QW�~A*�۔�h�AhR�
���5.i6<�:������)�~�!��q��ڱ87!T/�P�5�����]5�B1��O�q����l��CZJ�L0xDِ�#�؜��پ�}]	䩔��y��*& ٜ_6�=rä��ҭ�]E1X㬘�Mp��3;��e������L��0��q��=��#��aw���(��2hy�1�iߒ@�϶�B:a��+J
�|$ns�jh3��Wѧ����∲+��?#�� 5�z{ȩ��E�Zf���G��b���|�Գs����p���k)�>���;<���惼�]['�ؤ!��Q��[�u�~2���3�gpe�t��|` {k%o;�ړQ|��uM�\
���b0m]�|�b��i|������hj\Ij�l8ҷ��ʥ7�5�C����k����C__�bZ�g�^>=�oo�uQtC�N�N���k��zخ��k&�K��~��F@5�|��|��b1y}Q./��m�.9�c���c/i�� >�<|{�z%^�h��	g}lj�o���],�3{��I�r��2\)�	v�}6�G�~Y $��}3V>΄�Bud�e��&�`�z���^�5�^��~��+Pe��9�TК̍\�b�v����fs�?�.>��'S�pzt�^y}��#FqQ���U�ȶ��0����'2�0!�Li&�h��/�d(M�a�C��13��BT�|��1��V�!BP�f�HJ�'s��y�:.�������S�"��w`�a�
z���.�j�pv�=C�����K�M�ZXC�y������>���w�Zc�-q�%y�Q/�
�V\�09'Mr�}S�bFI*1��	�ژ�u�wm�3�=8u�M8Z�	.+s
���~s��+&��6��P�lw�Τ�|2��WSJ��M�5!��Q��/���Tr��l6��p��a��<�â{�l����ta�l0��3VN�:�����S
;�5�N�9�8�ͪ9��`�-���U�f�ͼ��G6����=K�=���L>�j���Hi�s����cN�U��R�t���-�� �>�s���hF���<� I�U�Q{LL�;;X�#'j��3x SpP4�+Z1X�m�H-e�2�o�����1������΁V�3���6l�vN� �wd��@gOH��ȸ�%��I�wl���暉KJ�Cc�1aET�C╍��g�#%}���%W���{*����4,��
_c�X���8:���q�֡�x.Vhd���V�7�Y���O����Oϳ�=��iq��+�eza�
���a�
b�`+l@tWD���n8ۋ��BW3�W�Yx(��b_/��-s*Um���Vu�zej�a����2��ʍc��j�Š�IIvj[�=�z��n���ҭF�K6���a'�f��w�`�q�y�����'�56�m$�
&�%�w?�:<s�'펻	�w�7?tw!����7�.B+O38?´�9�^n�|��$W [��4/�:���k)T?8��K����1��;6�otrD�6���]ڱ>��u&�|��+"yv�v?b�i�ߎ9�V2fO7��|9>������ϳ���Q2�}m�0��L�<����fa7�%�l�9]�����|�b{�ZeT42�l5����0^R�r+�_p*��'_)�HL���<Y]UmhH�̅Ȉu!���:�V��;�K�gx��Nf ��b���}$�4��𶪔lVb��X&M���YJU�`��,�d�]_ +�����#z*t�x�X!�%�!-��J|Z���Vg���]pl�eSY�i��e�a�<�
;ϣ���e
o�*�c��p%4{�g  ~fĄ���zF��u?������<9���7;J6��I�@{"	�|?>���JB0v�F
���7�;%���a�N��m��Q�C�1�=3_�6�F��ӕ&jѿv�C����S�Ψ�(�l�x$��8q��&a��xu���A��͑�7�N�s���=�7
��0��gn�uB�u��Eb8�jb���0��˃�Ѥ'��ݯ滨���9W���h5g����X@�<"K��~N�rL�32,"ǜ_�q2Zx��k�k ��b�ħ�fe�����)F
g @�0`�j�{�u�P�b|.
��b����\%:#�@T�0,�>8��.J>,����V��
��vm4���y�q�o1%	��*���i���?c��}�Q�D3F��V�#?��9᳘�(X��ն?�ǂ�y �k��*6(q��I���!���|~����������DFǿ��x�}:~I��S����&DGy��ӱ(�i	[AE�E�+1��,FS`8:NWdSo�^��!|��8u}|ptx|�NP��#��vP�I�]!�ŘMD�KG���*:v����w��z[�VT(i�'�=4��g��؜ӝ�A��!��-�[9�b��`-��v���Q�;^�s�b�6e�6Xߧ8���pȿ(W��]fM�W��㬲)�	�,��YŴݔ��yr��~��j[Lxz�N$�_�
r)�p?H���F�F2���"a��ta"F�Ȇ�טe�8�80�D��H��"K���	}��#tb�-@�-��0�b,I�a�ZQ�A��R(��(��AA�N����x�@����w�<k�,P��
���y5IE�8�tl�p<PW�!��g���FqȦ�h�V/i�=ҡ8��K�M�@�b.�G�’#�%�	�E5�G���,�g2߭��J]}�.uC�����t�f8/����{ѩ��Sɕ6�(��8�K�q�=_�Y�rB'��^qb��'#��h��=���>�@�`�գ/�����*Nf	b�U�t��*
%�a���Ơ�-E1�������)�=�d�pU������zB��žv��C��]L	|UeP�.0���֍�	��#���)���ZJ�D.���) ��l���ߵtZ$�,�2��a·՟6��m�,Y52�E��N|v�7��G
�r�uz��D�)yʡ��#LRm��hhv�`�D�rC�s��B{� J�`�3�`��6s�=�"M�+2��
�||�ft�u�H�3�������>�	���CHRaѓ��6W�T"t��7\�<���!�G���Z=l�a�婟��̸\�#7jn��/��)l4�;D�7�:�{�Gtov��Rs]+7�^��}���AN�&�\��~�&wE���-�	4���Uվ��}aɇ��O)0)���+��i%�Io�2��N�㒰HT�5�JC�l��H<���#��`�ܾ7�vρL$���J1@�rŊ-	$FwaW��ɼVn�9���z�q9���5N�;�Ia�@rL�}���I'
�ܙ6�f��^��9��V�,��Ċl���e���0�c���k��L�37l��E�)��!8�4{Ó����2�L,��4��e��	0�7���c��؁�������oﮯ�l���,]�J��k�!�q)n?zL@���6VP�s����Gf�L	� ����������tQ��e�?����������=^��8��U&2V�
�8y*~"�5�KL�������ã�X4U�q2��b'��m�z������t��h��s�t��ċ��nQ�S�9;+ԉ��4�D~�'*��������t*�`�#�d�35�r�
uL�wH�t�����gF9G$d�՜M$��l�겵�.���Ւ�r��ي,/��5��*G	�'��SI�M)^�'`�:.Ϸ�
L�1��a�dѿ[����o�4z�vL��s�=���Fz�`�p
]t����w�y~A+X��b����b�9A�FC�L�e�rD�GN���P��`'�ؽ���<"i�>01���@�&lߍY��a��!���`1�����k�����"���0b���uٚ�c� �9E�ER�*g�ˋ�

ē"�0��I��kL��4�U���v�nb����Z�Ҽ(֪"�$\T�U��z�nľ�$�b��*�v��ĝQ��8c���	� B����/6jL�k�N�S�z��]%Ŕs˞7�|E���ƨA$Ř(
���
� Syo�h�:cF0���P"�)X��q��!�5���|[7��(�ռǷ�5_�},f�-��]Ia�P���on�w��y�>=�ו���b�6-���"Vj�Êٞ1R��vCVإ�4�i�K·
�M��n��r��AC� ��V8!d�CY$Ɗ�I�&�P��� I��T��3��:���>VX1�����C���T�$�c�I��{…��/la1l��Ł}��K��"�#r;!w/D�%;剶��Y�R�=r��Cǣ�q�*l�_)CɣI�|rp
O���t����_����u��@cƒ4k%P�RℲ?ߪX��i�G��=tG<Y�^��	hf�P)e��{aT�K�4�fJ�xy%�֔"��@�b/.$���e�yyvNѼ�#�Ɨ��|�Ŭ"�x��&T������
��r�*NME_�.C�����H���7Q/���\Q�iGI���L:��l���Ic$3i_l�4�^��T&h
�T9rݣZS^h;k�J�0T��]QP�}>�O���-g�ž��x��Ŵ��G�@p����&���L	8��[�^�r���hn_�Ag<�o9hξ���,�MpƇ������en�����/�V{aa?�z���L����>g9cH>�֕�Pf&MGWrL��<+��L̡t�}�Yvujc��d�*;���[m�
K˿�}ԭ˳��MpH>�Q�3ږD�b����`i��,��N�WE+�4�;��\Ç����M�CIo�,�X���1�\@�UŒ�Y^^�JZ���ȴ_۹�"�k�QS��ق ��R��8Pg쬙U��a�b�I
�v�?�e���o-�sϻJƸ{�q���o��u�h���[��UeT�6���w���*��l��� �B�I=�����8�_؝�E
x8I�nN]��!����-K��L5�� ��D�'��;.u��RD6xB<L`�>�E`�Z�,6=6s`�e�*��f�	��9C��Y��U��|�EL�x5��bln!�6�m��a�6({!��dj�����������Ή���K�Q��U��|�k�@�e}�Y�&6���;	Z��
�����K�Ɇa:�OS��i���T���}"˛��S8�
8��-Y߯HK\�6�d˜�{��,�y(F)q[|��#1GܩNb�JL;��z;����p|�B\d�������-G�q�g�pU�+^���8Z7ǃh~��@�}�e.
�Go?�+�9�Ȼe�lq�x�f��:��-���'*�~��j�Q��ɐz>s[�xv٥BW��ـw߾�-���FQԱ�$ꅱ=��[����kK�"�%o�f�zƶ�ۖ诨tD�7��o�[�;8g��=@���8R&�fI_@o�<��|c
�K�jO!f'I�p����!���-��
uu@���@Vտ���W~jkm��-��?��v�?E��z���''�v�z9D*$G��
D�/��o,��,s�j��U�E����NF�VץQ��-^����Nkh.��o{tםh���D�"�G��N�hG�"&�ηz�߽�	�zk�{['�'��vĮ����\�~�_C�~������r�X͢�C!�=\O�	�Zz�^��]4I@��R���h�,y�\��ŀ�;
Ҿ�%ly~e�G�-��E�R(�w!//$�/_�ܧ�W9ǗН����bv�*��)�;ܶ����_��P�͚���J�v��d�{�#��U��؍�:�u���#�T����P.d�����c�_�*_^��5�ym�'�#��!�\C�˂�eL-&��*ADI
Q���0���ej�@���;��%yck�
\��yW�J�VBw���Zlpz��D��P�	���A��BM�P��^�#��H��+eۓ��	t�����3��Csx}�0�-�K	��d%2[^Q�n�EQ��bN�kþ�M`J>���aa�
8�NN�.� ���i�H(:6��3/����'�$kh�^B'�Ł�\+�V�8i�w�v_�tTҗd(�?�&o�$K$��������9����|r���=�N z/{NZ�ip.��t���m�x�4�\R�5�@�x��@k�����aus�Gu�v�°为�Q�˒s()��E1 �\���-�fE��@1�+��Qa�(x�7���v�(�uǴ8'�Br�;9!?v��3�!��aPG[��g� ���eV����65<�4��
ɫ��g�Д�ctU��xZb:�v�.[~��g���X�b�Ht����{qԝ�kw�Wp_$��Q��挸�/��
F�L(�;�Ҍ��2�[½����ϣ9�`������ӄ�7��}����rc����N��)����ɔ�uO� i?�˜Ef0U��w|i�+����������������������Nn����yesI��|Sk�t�;�g��W�b�+��<��1G'z:vd:��®
T���"UJ��̬�<��-x�������/�]����	�c{t�v0sTr3<N�%#�o����Pp}�Z,O7��!Q��Su5J]�Ec;FY�\D%bb�?�7}v����rƶ/�|His���o�R��46�cxU�i��3�rN������G���d��v?0�@<���ъl�<��ke�lw����u��B��nʀtM�c��A:�c˕H2��|C9�����	}�c%�~;M�ܽ�])(�\�pV���lkL8c�sz�D�r�k"z�.ד�;"ѓhי���(�4�3�հ�p]^92��"d]<v#��7Ͽ��0�������=�rAr�EP��\�7�pt�5(���ĭ̟��"���LiyUj�w���VD�B[�g��u��=���J}�{�0;!A�}��	�l�e���c�fc.�1j�>��m�F��:�Io|�^��,я���f��[$�y�*Q�-˄��iն<����Jc���\��od��`%�=	���@�?�=�
��VᲒ5��v�<A�F�t�(�j�Kn��,@ ��!��A�LM�qK>٨��aE`u�x%-e���
:0��h��m�7y�GG�-����+ak>�	�ގ�������7��Qh.�m�Y���ގ*�۔�᧻�6o��~l��Vڀ����~+����`ǔ:�,8]^p�W��Չ������we�2�k�ݹ�m�G`�BY�Q����`H�~��t‡�-ok������uQ��3�i����_�k�G��
ȣ��@����vMk�Z�.3�̵K~�~����|v^?�-�����	����lg(˝*s]�b�&�t�]1�C��Ħ��
~���0Ew`f�g^���?w�k���g�Bu�Yt��I��%��.�Q�>k~'ʻ���V����_?~���٫�h���i�7�5zi���ޡ��W�#�WV��r)�$Xr�+K�:Z�4�{
�6�	���H��',���������'�\z���e�EVm�-cO/�=ZXj�xd�z����\D�{�3u�(h���.��|`X�����66DV�eo$@c�[��I^ӥƙu��R�o�
�.��
A�]����as��I��Du�
[vC�7�ev�N�ek`\�6u�f�Nc6���=ě�0&c���G�3	���4d"���Ѿ�-�H��z��g<�!
�\���{A�gmL��c��Q^؆=��݄셑�?�x'��~���d׽����:[�Mr(�eMr��U�'�h�wb|�Nh��-xy���-���p���v*�Ǹ#,�Qs�� ����aH�8�^vaݷ�,]�JZ�{�}�^Bt��̢��.T��3u�N���o�qC,���1�-)A��C���n!��\j�
%_t�5(14�0$��뼢��9k�1�Mz$ȧ2-�,K�`�6j�#h*_�s��_Ӯ�Ia,�������l�L1����`*��|3bg�^xX��/?����?�/�)����AӋ;}�շE^�6�
�$�f���K)޸S,�.��brv
4%�Fs�A�_%@ݺ��:���w`��U��-}R����>�9<v?�{�F��5��6�`��u���o�Y�}צASp�D\:!�]�C�:(��ߵa�Ðu�o�	V���52�'���'��7�-q�R˷=t\'�l���"
�����H�+<ɗ�=[�!��$?�١U���5'���bn�~���xH,�/1?��E�r{r"1�87���Vd�W���C�~F~�λ��$�k�vN6�
�r��d����Mf�����G�:`��h����#�Z��a%5�&|�U:��M<9�Q�]�B}���}w����tl�Y;����9`sNˤ{�a����G �Б�|�yݮ�
9��Z�8^mg�r%�����W�����o��uAF��"[x��&��<݂,������x?>մ��m� �YO��y�%'
�ȼo�����e?���W�U�~_�-~���v�8��K*]�v��~,p��/y�^X�zF|DT =K���?�f[-�h����u�����(����_=����|��/A&����qi)���	#h~�+�zr�ߏ8@�1E��x�)p^�_�>�z����?�I��.��Oܬ�W��VP߻��?>e�7���� rU˹������TJ�_�%B�m��GD�R���AAƕ����[c��O�o���%,�d��bYeX(m���Ф�Rñ�/��7vH��~��gq���p:�b�Y%{A,F'e�Q0�MH�F��9%dH���Y�Y㒓���'#�@�/�..�6݃��9j���{6�9�x�Z{����j�6��1�'�Wk`~FE�M��:��+DDT�7-�A%p�8�ϧ:���rق�:A˟��I�oFL�Qi��O�Մ8^�DH�̤d��s
`XW�a��6D��O6������n!�_g�rY��i�%��Q�TFD���J���g������!�����o�@���"Z-�jN��p�U���lOF~��Ts2oyКLI�&Ż]�x�YC&<��U(&�2�	z	!���Q�>V��\!Q��a����V;_F!�!��{����R�M�.�%4��#�F���
G�{��"#/s�`H���~-V�H%��#�n���`g%J����X��-�*4�M��i��Qp�^NQ�x[1��������pu�o�Rb}}�v�P����xuu<�A�����ı�O�V�ǔY̽wWG�>�%��ttx�c�|�b��fA��Q�kc�"Ȗ�e�a���
�.�)5H�/���<i	���o
�|�[��O��M��I���^�|��Y�p!f�`o�2�������T��1UK��A`�n�[I��O7M[]��>n����f��]�vNeܠF�:9��z���~ɾm��y�ð���P9g��b{���nw��d
�c@D�nON�&Pg$�yU�v͉�	��.-8��.��ѿ�N����6���;#��݁���8榨7��
5�寨�F�Va�ϫy��u��Ư���aF��-P9C��:�۱;�ЗVE6x�S�{�/x�nuP��4Ѝ9��j%];�i�,�(]9*I�x���-}�rAwT��}Dw�SwK���o�%����#.��C3-6֚�
�xs�ؔ2��T�Ա%l�@?�ӂ9�f�%Ɠ��J�۸Z�Ij�6o��	&W����1ANq{f�q�e���{A��b��r_=�Y�xK�Q<~QXZ����IG�i��hj�m��L�����;Q>�*P#x����2T��jȆu�GɾQ�}�pᗸIi����]����.�V�d~;��<Q���E���?}�7i3n�խ��nd���٦/<���8�C&3�Q�Ll�]��noS�qJњ`_��� ѿÃ1��&���;��o�l�܁d��`Ij��^@]�h\����בv:��l�`j3�{���"t�M��pM<�6;/�kl0�F��Ycd�����65��v_aJ{��:Xw�\���-wC��jMΜ\��(�zI��*w�����C�l�% �t&p��.�l��P&ɔ�)��W;�
��.��.�����_Ɇ~䈱S�X}/{�\����)q=�
�ܨC�eV�������Ŋ���	F_Z	M(��8����W�掐rLԸ!v�g����� �s��G�57��=Q��L����=ԁ\=�ǙN/�3�B���}��g,��j�ѷ<M�?�5�Ǩ�x&�@)y���)�ށ�k4��S�|L�GH�E�aU�4���*'r��|-�V���gO�(p���.���<�IV�)ul�]wK8�†�S�h�lȷ%��7>��
ںF�m����0��ɡ3���%���k����Y�
s6�J�Y핈EE�{�h�w�ON�U�ƀ/D*�)�q
���O}�9k���8�$���ԏ�r�8�/��E�����wdp���{<;&��ȌJ6b��e����Ȟ��Ӑ'�/�y�����jgl�.~"Pu��_��j8��Sz`�.65�~���Z��
��a�w��6=�í�"�;�LJ�g��dTnuh<�M4�K:-�ɀ�h��kw��ŧ��|�:lI�Y:H.�x��'�zy�B�a���+b�0gxr�O��;a�
R�Ҧ�Q�P�eC;
<��t�|������ǼKPYv.ȗh!Kmq�^6*�6)�TA�i���<��ج�["U�zY��f�ۏ��"����|�G�(�_�4c;���X��k�Y�0}���MW8h�g�}��Q ҃JB���P"��![YS���UЅ��Ex!��x�2]!�uB��q`��<;��Pg�v�:�Ѹe�F1:y��t��AN�=��g<{�d����R�k��`r`�������z�q��]'Y�r�I�Z�4�p(���P��gT�	�j�����k{>�S-�j�����L��i:�n$���.������ߑ<�؋�Z���
'$v�
��}>3k�@����~�!�K�`,�(�0�3���ȹHh��3d.��]��ye��Ӄ\;qf�>�n��<X
xs��7��j(U;�&�)���VM�&)9.Y��r�1A�6C�hV��y�uڲ�H�m���1 �viҕ�1�%5NH�
�Y��H�rJ�?�P8@3j,�^<w�&fN�s$ee=�hMzh�kj���PuQ�L�'�ICyŭ��r�o���}1+QE1/R��
�瓯�0Y{i�:�<_.�0�*����s����ޑ9>G%g�RM x����<s=kl�ϩ���L�5��|n���<�g80�^��7]]��?��-@R6Z����p��6_}@G�b��ztS���a��_G�ʪ$�H�֡C�U'H1�q$gY��>_]L�5Z�ڒ[
t��,79�{���b���:�?��}̜覂͙�sv��o���S�^��je�%	
�!ˠ�_TUxR���*�A��ج�6,�jĉ}	d���΁�u���
|�L�uu^��xܺu�Z4�q51�M���8�eטgs�]sכ�����u�J,x2�'�{F6�p��l�i��dT�+��~ʶ��6a�����k�H��;�?9;�3v�M�3�{~��%g�e��\S%�a/���F�G�4��� -�є�0
��N`��8����l��	��GK��L���$�/�J���"j>tUc�G̺Wk��[�I�3ƇnwdB�]�7[҇z�їp���g}m	Ү ��gkY��ިF�7�C^�`�.]��<�>�����F͸�KK=A�F���=�V���'\z��qE9A��&J>�����8H��r���t#��hx7��Q֍���ϒKb��U�>��u
�N6��.�۫���j9�<AA6�,�C��^�Y��)Q@�O��>��7�rg�$��i�ܘ�S��451A�Vۏ�m�"o�_��x}Whr>���r��>��͖��U��:��pH�!�cu<\���q��N�z%��=�%���
�6�{�
�	D�=W������9lcL�uՅ��8	��v���I�=��s��ө��SY,�՗����0��}۶w��=3`�/���(��#	��{�Æy�=zmK�Vaۦ�n�b`���
L��r>8��IZ�?F������y�v��1��>9^���ź���9�֤4�0W�C�v�U:�"d��^tMrЭ�2��bHQ�ǯ_N��x�Q�ڢ^A��z>͍[�V��{�\�>�̖�V����L2^k�.¹���#���`����R2�F�b�8��#=a�tT�w���/���YŜ����r�-�5�g�=1�Ns�3D�r͢�ͤ����n�d/�uM��/�')����>�S�"/��\�߃��2��/���ⶍI5�w��kG�n|�Qo�P���N���a%�޾��<0J�.�\���:<�@�.���ǎ3�L��iof����p��{���K�-�k7=�p$�_�e7��S�K9��m���ϝ��"�뜂v����Q��4��08�^�	��4��0���@+���s��E
�X8N�V��J�Mo��M�_�݆.�KH
ԃ�Ǣ�<胀�e?!%o393u��+�+~�N��kb�s��m#?ųZ-���AL�>����8 2Ak�����������F�1�Ae��Ek�'(��ߠ���&L�e9w���O��X@B�D-����:����0�X�{���+\%� �|���(8��$��Fbe
�1�ȓ��c�5q��O����7��C��Tb;A�E����΀0=�,�{����(�?b��O��B�g/�L����Q�\�Sn�J[AÁYV���/�#:$E�{��D��r����s��2�Є�^�b�=)�T�퍕}0�k�S����u���D�n�-t�S��#��dn�-�&9/�KC���?c�f�ָ.��e��
7ʨXL��q,T�`g�Ծ?i�Lk֔=��[ۇ�P���\�8�p�U�n�\��6��K��p���Xr��)E� �n�$ea�c����38Ok��<x挔tK�@�O����2������A�3�0�T͆wpL�ъ�-�㕽$ԅ&�%R�q[.�h��͌$4������T��-����L��
󬺸����|Y��Y�9����C�x�Jc���|]9���~݌��z�ۅ�͗S���߁�F��ds|�+��'WS©\-�c(��o��v��f�����r�q�J#��+�Z}�~�e�ȟ��rQ�%)�a�2Ob��t���˼&Fcs��-9�:mR	���4�QU.���{È�>�X�-o)��pi��&J=?;k|���������}�ތ�a���j�@��f�_�h��>>���P��z�e�}R��6^�,M �p�/s�r};��Uq�\7�Rn��c��vBv�KnXU����ȅ��Ա%��?�ND�eB�6�����4A�E���X0�����X�I0%$&:�� �8�틬-����C��dm�]�@.!��rd�ii��}΋!&�|����jHg)��i	�@�>�d")>�j:���Fd*;"=�XPy�US�E��ÉbL��_�Bn�9n�ε_�ڙ�#7�a:G͢i��$�)��L���Ry9��RWH}��:.�܍J6�\\\YcHI��!R]t.�=�W0}�K�3-��觽��V��jZ·xc8�;
�A�@Rn�o��0��2T�6j^�j��/}P5ijS��W�7H��̗�Zy(��m�g�H��'��w=	�5�Rl��Mb�ɀn%�N)ZI�&5ޓP �!��=<N5�ݘ _2�� ��a�V�2?dlb�Ր��	�1���I�BSb�1�EVuw�X�J�$Gh�&N��u��ş���?�8��I/��b?����x|;�s�~���U퀐,���U��=8�db�԰�5�]�;��6�%
H˪�Ci����<�V#�Q�N?'-�7�7)�4~v�\\�2��8���B��,Vߘ�jÛT���Ic�q� �#���#}oA�4�ߨ��fW
Y՟�ʮqr��-���E�pk�`|^��8u}0_�Oeߙ�2@���Cߍ�>��)����������YWϰʼ�#���S<�fJƝx��Id����y-��L����f���b�*@sxU�f��y�^!&�Z�.�Uʒ�W	5�jE���*`0r�R��@q��`���X��[�b35�=HR��7E�),2	V��?����
�m�A��H!;)þ}�e�8[rp��`xh���|H$or$�D�'ZMsi�j4j��b��w�*�̪&]�XI.�\�W��Q���2|�.����4s�D7k�SH��xe�
�I��&�q�aN�%�E�X�E��O~�oz�����`�A��k|/c���͡1^)`��[b��|9	 �����T//`���՘_��{dń\V�&smc�LPߠ��
�-F���@]���K4��q��q����.���n?,4Ǟ`ܡH��F�_<�	d6�:;���T�l�~�s��GL,}KQ�6a��o�~�]�4w�1��I�g��pE�^J�.R�� F~���ZV�[�.82S:����Wɬ��$]�^��e��RY���W5����'�֘@Z�{����C����Vlܗ����N��a}�f?��)�/S;�)	Q�i�k��s]�r�{=Ǭ��A�bu��-��tـ�t5ws�JFP}A�	�o3�F��ı5�])���HC�Pͼ�@>P�뾥G}ZV���#������͎�J+8�nؖg��� �2��n��L��ì�����$�Y�ۏF��_9���]�P��/:�Op�A�G���?�"(m�u��mJ�"��>������I�݈[�$����I�xYo��;NM��x"�{t%��&�!�ǭj�>�����l3��2�����|�V�[�5�Na.1� sޕt_#�A|�ןƦAS��"��m�-�o�g��:|�]T'�F��H�m�y�a�p.�pȋ9�J�J]Q!��I�e0�6*�/[D��s�Q�8��_��a�@�������H�D�V��[�5�b��@��e?��t��`�L#�9�zH���<�^� N���#
�t�Lb��+�����|W�lF�<{��t�$��o��@���g�5�����I~1N���ѽ�){GFǖ�T��/�d�|tF�=�4@ ��zA�ڵČ�)ՙx�q��Tua0�6�JXؐ�שi�V,��Z��0-ڬTy{��1�:A��j1�2�2o6O��*�o���-�����
�S���S�t�-F~�C,WAD)��u�O3"uH~G��D�cs1@s����؆�V��vc�����qEb�kN�z�m����1��A��c����1��!'p�_a�b%JDm����eam�h��u.���xi�$��x�m�a$p��ǧ/E>��h���%�eA����w���bC���oQ����E�e5��S{�WWoZ��������z�ʽ0Oz&��{e��Z;P��>�פ	������d2����`���Yϒ��<��|V�-���7H�*g���͹?6��f�%��/%E�3O�#|Y�`�~�u�<�}W\͓���c��!_��sG���‡��X3�^���b�c��sS�
[�ʇ��W�M�i{&��{i��^�Uz�0H�0�]����{֋�d;��C�F�����W����E��xD��~�~AUJ���Yo��E�_�U�d��{����j��@�PK/WUWB�!!pip/_vendor/typing_extensions.pyiK+��U(�,��K�O�(I�+���+V��-�/*Q�PK/WUW8J�pip/_vendor/urllib3.pyiK+��U(-���L2V��-�/*Q�PK/WUWM��6�pip/_vendor/vendor.txt=P�r� �
fRGc�{5TW�2���0r@N�a'��J��JW�G�R�L��LF����˒Q3�e�K5���c*�C��:g�@�4E}�,�P@y�����N��c�U��L��@��2��?*l�j톐k[���cQ������|1J�].GҊ��ב�Qv�Fe�\�������<f� ����m��G�{dk���}r�ᰡ%G١���	�Y��GA2�]b^�	�ngDfk�:K�w|��-P��A\��+�p�K�kTA^f&��9]�
Jx֩9I-�^��@+���u��/�Ee�X�\�7L�zq/�W�PK/WUWkwE�pip/_vendor/webencodings.pyiK+��U(OMJ�K�O��K/V��-�/*Q�PK/WUWf�'?�$pip/_vendor/cachecontrol/__init__.py�QMK1�ϯ�K6�/�RU="!�N���$̦�{���a��d��|�y�����XZ�pdSl�;��9�&�|`��Zs�`�$�MF���*'���qt���LN����.��h��9��E��H<���H�:b�]ʆ}�Y]����~�zW��%UiU�J�}�Y)�Eq������6%��x�>�I�EMW	j&rz-��O@0A&����s����%
u�A{��b��u��P�a��?�'{�U�����:�g�>��	�h�Y_�m ����?S�Q25�.O��]������PK/WUW�oOM�� pip/_vendor/cachecontrol/_cmd.py�U]k�0}��М�+���A�fmYʚ��B�7��-i�ܮ���g⤁2�8�=:��{��	����>�L;�s�,i��k��Ktq��ZHZ�%���d�L<xIk`
f�
0M7d�.��0�(Γ��=�x3�Aƈ��K�c\M9SI�:޶��~��0� n���ЛwvQz�~�w<�Y̿ܮ��T�X�e�I�3���5����3-yW��
�ms��إ�A�>�+ZkG��&��mWL��n+,d���Z����=�?2�K�l꤁
R���GY�fъ3�2���`��]`�����u� [����>�Z�o�z���H���/2Z�X�Rfr���gq�W���^uʸ�A쳳%˧ȵ�&���r���YR�����u��0H�4�ݷ��$��XL��=��ҭ֢<;K�Q�i�:��A^�ȶ*��^��=P"�2.�'�Z�L)��#��P�稷f�Tp7N�福0���$�
}�f\<K٥�g��ҵ9ߖHs��9���w����
R���Pv<u`�e��8߾	�J~"�&+�܂�*��E	C�m™�.L-;��������Y�G��ZMH�{J���]�����	�A=��&�'s�Xuf�)S��Ӯ�r��vQ��ͅt�����7/w�I�x�z�wa�S�
���'iP��vLV��M�_RU(��NƩ���$�PK/WUW!c�w[�#pip/_vendor/cachecontrol/adapter.py�Xmo�6��_A$&��������A��@��sLD5����#%��I������x���#���ۿNމf2�+q�1�7�����l�Ċ}�J�lt<:vŸ�
2
'ȌXPv���N^E����[���
☉m.�a<ˤ�F�L�F�غ�VF�TWf����=Kg
�EvSYZ�}>�g�??~y��l��LSX���}�9���n.�(��,�*R�O��'<7�te��bq~���V���̌���Q�+3��ǔ�T�y>��|�e�e_��~������l�r~��!ݙ�y���)\tm}��t�W���7�	��n�n2b���TA�$n<d�sD���"n����
����kp�}\q�ڈ�nj�F�`A�<���o�J��-dʄ	�3v1��%���M����fS�����QȎ�����v�i����"��Gd��q`G�ѐ�C��z<�#�~�/2�N�:r1~�'l�5�U4%|~�vm[}W�ܻ>4��V�C��I������M%~��a�^pEK&V��^��Ccv�՚ԫ)�D�q��ö́Vs܂���i]���ai����W�jpCme4�i�f�~s�(���G��N���k�̪����T��v�&���:3�.�͜�6��F�L�Wof\g�Ʋ<��%/Mz�T�|��G�FlA�o��֩���"O��
��uw�4�{�v�KY���~����˽]JV34�¦���7_����r���:���ȖG��u���Kĉ�
��}�l7����Z���홑$P��
���[Lf�\�p��ޜ)�)�e	�rBY4�_.0��SUKr��A/>i%�Q���w ����nEE^�N���-Kp���?(%�S&"�Zb'�R}3
�I˜��B��l�Y�5�]4��S���s�hK�e�̖���'	�Olϵf��J����s�R4*r�D!�Qf����i\��H6�!�	���-��e9�+Z�rm͆U����X�њ�:A{6uy�Z
S����!z�i����h��̵�m�-5���
MC���:r�
n�;���h��Q{D֖F���̥֙�s��ۋK�?���҈t�����|��l�����F���s	]�B�P�Yl$eȦ�Xw���n������}P}���l���\(G�:�~Tv"��۔){}�[ߟc�
ض�,��; ��4��~S� 6GV��T����(��W4�Ȝ��<�BN��p)�46��mXpn"��}��	�0�Dl����F1 �L���F��+t9�;���������g�!\�X� ���m�X�t�R��@O� \{�7mF^c	��cjC���*�w���\j-�tk��i��� L�-G#�2,A�!/�DX�[������	�� ^�1K戓�)�&�H�}h}����	ˆ�b�O-I�ұ��|��H�x��%���F����._H��L�)�11�w�lpڈ�u�~��F���-�K-Ϊ�Wﴱ�5�jDq��q���@;2��b���kj&nV�Nxv�0q�!�_qc�	�"��@�V�g���	�,���q��'�	=�p�c�#�Ma�)�[H�9ŶdqEy$��� ��Fh��?����ʀ-�V�����'���ш�C�_�,OOb'"
L���R�-�3�p0���5�l���?'��2�XF���oC-��3�'����<)2IN��l��O��iRol����ٷ6P�w���=�-�<��m`����x[�J���wfs�IN��-hXj�\��F	n,xr�J�f ދ��y���^D��<4�r�9�nA͂i����Ə'f��q�e:-c莮^]Y��C��ˊ�PK/WUW?%���!pip/_vendor/cachecontrol/cache.py�UMo�0��W�%�+���
h�n�/�9l(G��D�l�����GI��A9̇���ǧg�noξ�?	�U5Z,Wv��6��w��\�.�6�d��0_�K��i���@�I�����#��l���-P�_�Z8��B�4���X��r"L.:Ü�҂0���4��#�r\`�t�H�P%�M��Z�$ymk�IⰕ���RY�"
1�U\�\��~}�T[����~ܜ'�/瓯ӫ�#��-_H��dL��=+��(�Ek׌�Trc����C�K��2�=61��0��Ƣ��p��u�{4i�N[1;�Z�u����>���1�#��Jh41il�X�?ԅ��<�=�d(���K�2kBEwB��S�ЃN��F�$��I����[�˾�y�~�5�Q�aE�|E!�^D�wD�r:�}O�lO# Y��G.��F��7�oaW	6�����r��'O�W��+oբ��2��M�~@�P�*'۰3�-V\�S�5�u^��
���4Zh`=p-xiG�BXP��b4���1�B<�/���]P��;d���<�Z8�
����b�RܷSt��8�$i~J	V�|N���ƒ�|Ig+�)�\��5�s��YZ�ǬS��ȴ�2H�I���%=|�)��(��Z6[����e�xF\�>d�S�^���f�/��6�>�w�,wc{��]ol�[#��[�&�v�
s�[ݾ�hg�[��PK/WUW�����G&pip/_vendor/cachecontrol/controller.py�<ks�F��+�r�L@����,���-˷����죴
�$"��!������^���\-���LOO�_������Q���l�G�Myß�9;���;ϣ�]�y�&��сX|<)��"�I�"��ٛ�6|z��F#�qF7�6e�����:ͣr�-X��%�*�YUp�OY���EYx�s��[�X����b��-�a~���_FiR�F�Y��<	�\}��:J��c�ջ2�r�o�(��2�9����/����XT�2����ۧ�����t��]v��1�}�3\9۲(��Q�{���2��J}ޙ_��_RDe��EA� @ziR�i,>��������4ܽ��X�#?��QûVr �ʾ�|���A�˨���]�W�?�(����MU���R{�xs��0���O#M�
�٩�o��Kz6^,26�~���%9��t��2�s�����ww_O���GG�?~5�O�?һ���|v0���>�_}x������������������p����^;������.�<ÿ9���鷬�����'���s'�:�	w�gx��@6�@����[��%,J@E3 [��޲tŮޟ�W����@�-��_�T֝H���r�����}�[�N�w��&��K�D��+���>��i���u�VY�kO|��9�I�X<�}y��巯����~��R8��lF�p&�%���~��i^�ge�
b�RV����CF�2�[���ץ�ȼ�"J�r��|<^��'�:�2�I����ƺ/�u1g�4�a�M^+j���ն^��*Ar���-\��k�dn�@�ԩ�8�	RFjZ!��8=��,n �O�2}%Xe|B�JA�a�˘/�;"�#��f.��W�m3�O�w�H2�D>��C���vą�,}���D a����o?\]��9��X�+���. ����;�_��$Iʧ���%M�#`�S�3���},Ҹ*�`Er�=��Gzx{8�E��N�|��7n0�TcK��&�xiU|[�#G/>!F]AIwI�?�%�T��
и	n\�%�sc?Zwp��@��4�A��t��x��1¸.Cv汦��A�%!s�s���(���� '�A�D�)�K�}͜�ё5��6OǓ�P$X(��s",��*��z�f�@�i�d�(`�s0,2���������Hcs�O�O��dF9���t�g��>@�,a�E�\yi�>ڔ�(_�?~���\���;�v;[�i꯹3gc8�%;:q�k�`�z�{�YkY�LW�m�%�T�7,"��
�%������O
��3KSP�i����,�VE9�hF�ϬΪe�-ʣ�=@���n���)0g��h���E�!�c��C�J�u\�K�gӳ�KǙL,mL��R��j ����ec-��W@���6p��;1Y��qc!]��62/ɹZ0�y�p��k���Tl��ݩ#m�e�k�	�K�	����·��;k/'w��w�y��m�"B�B���c�b
f-t��	�b���ݒ�?O�$��;�F9Ku�6fB���p�	�uЫ��}P�X��e͓��$)/��?�Sb�'���޻
_·�������w�'sl�W��_�{�?#
W��V�EB���FZU�n/����pb�r{\�쩴�{դ���F����aᘥC�aü�m�;6�iiǬH�~	�!v��N.���+��AĢ�P$q����{��h�lB	s})��P/k�x����-�wZA��C�*���V�c*��1�SWrlI4H`Ű��I �!���4��[����.����n�)W?9�`�
�N�<�b,��r54���1�<C!���%�b�T����<t��{�[&m�����\H��@�e����n�g��_�;���Z�N�@3�}��U�tP�NH�7�a@��I5F��VM:K�/��i�6̱�>tY�`�:�+�WG��fb&fo��,�J�T{�P"�ch�fJ��E�4�����2�c�0����.Cꆇ��K<�T�N����m���)�}.Z�{A@���P�dwÃ{���(`�9�0T[Ia)��:�k&wE���r�?�2n����
Q�\�K�!O@�a�p����m���a���_̴<L�Ò%@�)+��i�W�Cj�bx�<
da@�=Gy�8�1�.h1���jy`@������9��:=�^Y�	�,��&�>4ypŜm@��d����K]�յr��%R� ���p�����%ΔJL<��@�1�5�	��@���m�Ʋu+`q��DTzE@��i�G*��hʇEB@S_r{ۤ_�N�B��օ��F�z�w|%�W�>���7� ���H�Nk�^sx��_��hX�>��Z�
����T+�3А���
�B�^k�}��bu����r�a�шú��u�wdw\�0R�>bjm���1���qA�UX�
���ĭ��Q�.���屉�ug��]o�z���Ty����zOcp��� �xv�Llc�M�@���Ⱦ"���o����݀!%�A^�VՖ�� R~�<z�Q����Eė��Ւ�.E�2@�;�l]R%��|EL@b����4��)dd"�.#a11���*
cL�E�btJX7���P�Ҭ��b8��
nB��|%\�0	/�۩�,�hő�}�v�HXR����ַ�1�2Oq~�]��:�z������\��W�k@߫m��F1�DB�\��.�R���j7+�]<�#�"�7�c2��K��b��}:��M��X�쥝���k�A
.�������ݏ#��8��B9l��$=[l�R���Y�@���;¥�z�;o�hJ�:SR*�u���H��>��<�9Yo�(��Q���qӺ�`ߵ^�{[���O����	����Y�L'�>g@���1`=�C��+�q52��I�J���~<I��Ƽ{�5A�_7f2g8��*��"�B�����uM ��&��0��M��ɴI$<"yJ�9�tA��ў��>)�	Ҫ_]D�K�F�@2�]�$�a�e�֨�� HA6cƆ�n�fT�I�0¸ÏU�d���n��	q��$�	4�Ff3GԹ)�'c�����[�b5E�0��2X�`�W�7�}B��t��8�~�Q��5�o�q�V-0ϕ�6`Uk!A�a�dPĨ[�P�µ�/��槿ǂ��d	��gXF�Nr�s��gȠ��ί��+&��l�w�e�_W9��bIm�'�5��bg��oF�"�0��b?�4�
����='��� �x��*Xll1���hV�C�:���3,g��.�sjr�^5i܇h�f�03�8���ĥh�?�[H�\i���Ϊ,�ģL
�K��Br��N/�IV��=����
����&o��/��C=�߄;�×�G[~£�T�1�M���'�
�5�\�Q��|s��eʽin����jdԝ�������9{Gф�#�g'�E�scP�߭Sʞ�V�\���&r��O�uR��{O�
��5-eb��p�7<�h�Zč�E
����=�
���F-9\|i�Ѐ.�ST#a���%��-p����v�_�U������f�&��V��v�Qf�4۵;�t���@t>���g�eVb���&b
�y��+��ǀk�Jx��hf��&B�,�K�V���)����c����>ʰ7 �TMؖVߖ��;���s���mL�픕֦�P4��yQB�_�'�ͪ�0`������&]]'k���gu'���m6†��&M�d�!y.c���wk�k�"fg(_vP�td�"E�&,���P��t>�.�9�@�i���Ů��G���ڵ5����d�L����4�:�J]��!���[uJhP@sUTA�i�����W��@tXg>o������}�a�gI5H��p*:�)��+���+h�����n0BU��G�?���o���HX�6�:��2ak��TGh��x��5%���Fta�������kuXIQ�{r�9��Y�)GJ��WMn�������K�=�UR5�o��@]f��؝ܰ����TQ���՞b|�C�T��{U�;.�Oy~�X�����5��}s�z6ks,X�e��p��lB���%���E��"��I=VQ�ҥ#_�I�\뢖3y���ډ�ɮ��_�������7������w�)�1@c(���?o0��^m��g�N�Г��ط-�ҫ�_�h�Jka��1"J�����\�ʭ
�h���'�z2*B��uۺn�~�0S�t����Y"s��ۜ��6�E����@	Fa�1�65�~U��v������f���Y41_d-�5��
�z�u/-���.:�-�����%|�RW&q:`��Z�?<,����i�/�1�ʧɳ��kM�a�Y���tb���=��M�HW�־�	����;�����/LL{vS���^���g�
_�'i��5_�ڇ/���S������֞*�.��O���X�y5{��M�D`��I�q�ByI
ph�Y���^��D�9�+��(^j
ĵYa��J�*?��P�(\-�5��]44�5�uZ�\]�/zF~�����ot��b���#aG:
uK��>�H[�wF0r��lS��RO=��(J��kO����)�ZF�4{=5����3��P
��"�D1��HE�ei!2I���!�$F[��ߌLQ��)��۪�<O4ߨ�]�&��+*+����^4<2R�lt���,�
��b�
d6`��e8�l�q�SW��
�vQn�'j���	�چ��񹟳��CL~�]�`��nT�m1��k`�~r���*�'�5��$�^��\U��w�6��UJ?�
�ώg3�UʠH"������%�lb�"~ӊY����qH��a��PK/WUW0[����'pip/_vendor/cachecontrol/filewrapper.py�WMo�8��W�!6�V�
��@ȸ�3�m��3�����J6')�T���UQ�%�s�=�q,__}�R=>��m��T�p�Λ�&>�k��w7�����&W��Ύ.G������},�FS�su��|C�w�ͨ�V�e����r�L�8���E��a4�յn�}��)Abo�Y�T<��~��:�]c�zo���r����?�4Uwv7U]Uz��)���G`616Y^8���������v�W:[�	��u�WA������j�^)�]k�U�(�����o��*)z!�����.���)-P��,�O��Ȫ��Q���W.�c¢W��H�*�(�y�`
	X�l�sA�2�$�l$oc�f�ڤ�^
6`(�A��1Oa���?m��
X_S�"�
�"�	"����r�*��x��Ҽ����A���sÊ�?;6�p[����9�BG�A	�D��bI�[H��p���H�h#���~P��k��A���0�:�6�#<�V��?��hj��x��C`:�c�b��{�����Y���u2M���VL�r�H�fp�&�C�B@���d$(p^�Z�ǜeeZ	��٫(�L��SAO�?�l�,�]��ݾ��wʧ���:l\[�ĺD�|�|�m.I�Y
�L�
*��ƚ�\��	U��0$�� �!a�~]��oS��Y���#�4Q�ɯ�7[.!ku{�Z�/����*�t��[���E�ނ���CB�H�\SdI�����s(�I��#�K�^���\\k��kB~V�j��6�$=3���	����A���w8fΥ�[.|��7/:R<��|c!�-'�{f����V-	��F6Ѷs�7����B�,+ ���R!��n�p��n�ؒ�B.�G;pJt>�Ś#�x#�w���I�`��9���s.�a~}]�<d
�������wרH@����U���T��uu���g����"��Xa|�<�7���Q������q�$%M��f�*��M$�r�:j,���z���d���KCzͩ�'�9�iP�G�Mb56�@��U��9Jݛ��ĥ��ԟm`��K�b�A%6��/��LR��5��^��XBY����]��]x�=�;��'ub���)�«�D�ު��Y�y_71u��o!ö��5a�s`_�7q����#��Epϑ�)��#U��(O���:=H��ӥB�=|���x�u��T���8�^m��
"���
]�����3X�BӅ%�h���(v{t����ޡ����T�L�>�	�i������0�c���gPHn��n��|\~��{�v��q���I -PV��J�d����(��F��6�5\9��J�����0��.�~��'@t�:�R+�H���ȣ0�/Rck���~����u�?yzq�HN�C�e�2D�,�q���%�6�[�"S�#[�]��s���]^����s����m�����xXm��p�N�z������	D��Y�L��Di�T���G��hSC�`�I�wxC���T�c�Jt�+����:���u, \+��᠎`&��'���k��IҨ�P����
��T��t�p/�Oa�0��c|�l�)]�ܶt��WLg����p.y���c�3�ə�=謓��Ap��5F��KZ����Ǜ��k.�J����< ̰��T|�;kn-�D^R�o�]����m}U���R*��k�)S_>}PrV����C�H�Mk������i�PK/WUW;����&pip/_vendor/cachecontrol/heuristics.py�X[o�6~����=[��ńe@�&M���]-Q1J�H*����"uq�$�����w�ߑv�ه7
)#�y��j��V�h:��ACt���ik��Sl>�!I%G$U4�D�h?���޸�� �s��&
�4�
+�S�j�{!f$��pkER�GX�r�n=0{"�..�xjEH�)�rE�tR1	VZv�2��l]ꮐU���WNl��A�������~��S��-=n>�[~FKF3/����r�]Μʣ���G"3���Z��Ӄ��t��P��t"�Y��g�9�;�~��=]�[�VDbDn3
�ı"�k,��N�v����E�#�X�����QT���|�|�u�'�=�[bZ��-*'(��46U�0'K%���*]yOo�J@�\�<c����a)��X�#�*
�	p���ѕ���_x�o��a�>)����n��h�`F#4��u�Qa�~�8T��.�}�"������K�@9H�U�]�>�Q�2�ohD"�8G�1�vGI��5A�ɬ^)���leңD�W��J�H���l�#I��i���zs�^AК����T���FC��I�i �7`�t�V<�b����l�^L&c4D�5
g
�~�*�g��
�ɧ��P]@�:R���U��%h���ZAKـ�kw��w�>@#<z~����hi�� ɡV>5�x)_�$�Ji�X5a��,R B�M��B��ܖ�G#�}e����c������ߨ�YD%ra��y[�rj{�#i�-�7�s"�3�����5�l�ۇAQ`�+�
K]��C���[e��/m�m�A�_k~�e���}J���k�
�F��8\P͎fA^ɠS���K4�&��Dջn1L�~x�UY���m1��wizϕMg[n)鵻����o�/�Au��5���.�C�Mz��9��Յ��&�;��|�A`=�v4��'��� 	��e���3��r���ǽ��M'�<U�3����Kh��
ڊ��sP��7?�?�>�F��ɉTR3*P�M5�� #���l	�R6O��뵯g���1�h|�Tq�"��~߈�w�/�����m��/Sk��k�PI�t�j���	��tlk	BǨ#=T�f��l�2�m�Q٩Š̖,�)���=�-džk��.��a&�f�`�%�O���n���M;+w��s���O��ԛ!�F�5a�t��`0��d��,�ؘ�N�Q��fk��h̜�4�C��@$ ��
a�z	���a����Q�C9�D�#ӑ�%�������n���z(�d$aH
�(%jM�z��!g#->J�����0�vf��2G���U��4F�
K�+�p%�j֤�vN����8g*��Q�4��L��x<�-f�ż�xY-fu��xR-�u��x�����ڶ]���3��3��^��=���+;�i�-[��Ҙ��\�[Ԥ���o�������c�"��WM�?�g�7��t:��~�Lwb�{{Ǔ����_���/��o�:�+b_�dmD+wفa�e����^)�VΊƠQ�hZ��4��q����ؒ��׭T��0��J����x`��a�FǤ���=s�*��d�)F���<%�i�)��~�����װ����q?i}���}����q�kl\�>{_n����ul�{������ɲ�PK/WUW!pip/_vendor/cachecontrol/py.typedPK/WUWv=�^	%pip/_vendor/cachecontrol/serialize.py�Yks���_��>�tW�e��g��VMGk�v4�Œ���
���:��9�v�r<M;�������>�=:ao�^���+��WEy�r����]�gO��.�Lط\�BMN&'~�2ʈ��T(+3)�,y�g��O'�.vl��*[i�Z1�+mW����B�ɤ��_m�T�f��1�������7��q��똽T��}�KZ��;�;KY�W{��B7�wfe�F�s-~���fn����4{^q#.q'e��{�Z&v���y.�ϛ=�\__� L�	�(�뼘0�=�C#�J��k����'�I�sc�[�%��a['��
�dK��&n"K�]i��_�gq��>q1<*\�/��]��_�a��{���J@��Kf��o~v1��
�B��1��ud��L(m^Kk'g��+�Oz2i�j�����V(ƛ%�Բf)�*f��4�q
O�݊�8����)XU�܊�Rv/��gr�m�Js��-�z(� �DF$�n ��6[��/%�e�̼�ϩ�씣�T$�")�E..��~bv�v���vY�N���~Jg����Uhqí�g*�Dz{\R.��nWZ�T��K�!/�sl�1�'#j�D����%����4�ؕ��c�j������)�A
w䇱�:\�,����>�3�.�b���G�5�V��t������J�Hz��<�iq��J�#�xi����z��bx۸�t�00:;������ևI���z�^a��LVT��>�a&��o"��(�?>����C[���;ˤH�� ؛�愹)si�Q������a}q����KgS�cF�A���#�W{�W�i�@����������X�Г�FA<V���)��'�>��K��I��(���a��B��M%��#�y��<Ds�(f���5Ӿ8M����+Eݔ�BN�Kk�w���x�p�Pe������s_�HP�*��Z����Z�
��y���Q����^�[�/@Kn���E0,���E�Fo�T���
X�x@�����

�b�A�ȵ̩&�Ss��vt\����zg�[nY� �*W�(�~:���ӎ��(�n�O�������>��Њ�y��C"J��Q ^h]�XS>�‹|��/��.BD�Q
��V@�josAT޺�s�QAD�����q�����
�S�w���}�x~�P��5��N�c�g����p2��(���k��6N–7�@T��&^:ߜ���>��I��f�P���6�!��j.a�N��:i�b���>�c�G��N�,Z�\�?ze�ٴN<!q�Pc�����̋����%�����v�E4P@�漇?
�-�ù��U*�&�.8+<�{_�a`O#�;	VN�f��tYH�Tz�Y5��?G����t�4A��/�*��w���0*�l������]�Y��RzG�"���K�v�=�>}r
������p�Npeȯ�k&���-��:���:�N���� �>�1�T�@��'��~O��+�@�"'�Oy�E�$3pO �{Ȗ�E��\dL��kԹ{��I�C�ʵDzz=q����
_�c���g�Ձ(��]��&����F�js�#�k=�hC��
�z�I�|��1[:z_�
��#�*7]�q;/�r�ۍ(�+�*��r|�Mۍt]�,�ox��jDz&�c^(X/�fl��?�V�N���lwon�I�Z�h�
#�-�]����f��0�F�]}Z+P��ݞ3�ר*�	�r�,��P�Y���P�ܟSd#ش��]>��'`���(��=����w���:�7�3P�<�`��R`��q���v�i��C�ZD���E')�U��|]���b ,�2w�m`��2����Nq�)ʦ�͉�J�JE笫,s}6�E�q6�CT���lHK��Ɂ�D�L�O���x�5*QN�Z�bC��?�>%����Ά�GX���K��N�����'O���HC���?��a�q
'Zn�"�'6<9ԥɑv��z�Lt_�ަ)R�� ' G:@�V_�Th%D�ѫ�K�Z��Iͫ�Co�ITc��/��#�F��5��-�m5o٩*@CՆ�ۧV�͢:jDRi�~��vLm�#l�3��싷ڳ��d=ȮQ`��o�!/���m�b�KYZ2����Y��`E2T��� �c��2��6~�%�ko��5�g*zX�����I4��Tq��1�%>�L讷���o����$�n+3HqaD�1�"��0�����=��:^lٿh��_|��=�L5�^��Z����(�ç��x+9�x�A�D7j<�6�k6�_PK/WUW�<e��#pip/_vendor/cachecontrol/wrapper.py�T]k�0}ׯ�K���bp�s����B��R�Q��X�H�t]ڱ?Ų�x[�b��s��:��no�V_��X���
��;�����g��<��L%Ɍ���� 
��2��s:��%KX]$�jO�$��Ґ$��K��2)2�J�0�Qr�k����u߮��wߖ4VB@z�7蒗A�2S:H��J�V"`+t�r��]���MK��)���|XTH�}�Z-Q��
��P�8�3�N<���b�]>A��Js�<5�
n��	
4g���-lڀ&�d���׊�	�����ڻ]ֹZ<�A�%�F���I��ʼ*%lv��&�+�V슙��݇ö'��cMR��[���h�?���)��k�9ɭ[e��=`�2�ニ�Ǭ]]�6��,�z���؍��a��������Z~����_�r�u�����ר[vi��_��G���:���"��^���8?+��lٶ<
1#L
�`��ƒ?PK/WUW%�N��/+pip/_vendor/cachecontrol/caches/__init__.py���
�0��y�%�ڢ/�A�Aԃ B��m6A�����ݙ�o&��vyL����;ӥ���	���VL
�Y���?.Ƞ
�nJ��*B���kSc�gC!*v-x򙺢-g�󌳑]�/!����5��q�W�N��fq��[���XR��:�G�t�(S8�7Y@���Ϸ<�PK/WUW3+Ǫ��-pip/_vendor/cachecontrol/caches/file_cache.py�X[o�6~�_��*eDz7�vYl��]��'��p� 8�ш��H��)��{I�����2/��;�:bw�~|)*8W�F�ei��ٞ�ק���]h��k�����ɑ_|-2���r�V�{[������j�Ҵhl�!M�X�J[ƥT�[���L�X�MY�E����lр��u�5��6���v�j>c��>^��8����׉_U�:I�@�J'Y�)i���K��7pN3v5���;�o������V��u�
���ؼ�	ß��6+V�1�_R`V*�=�L]��d2ɡ`���¬j��Z�|g�X=c�J�,����0b��7�=S�ڰ5��YŜz��0΄3��&,�	+�&���Ұ7��d�>��o�?M�7t~{�}�/��_���*VpQ1�Ť�*�+
<�0x��y�ui~��敄�+��$�3��Lo�2� �]Ns�Ԓ4_scn�� �ͨ޸d��7�j�~���ff���|4d@��dѵ(	>�+�H���Jg_��1\��r���gӽ�O<X�Z)�t���/����i쳾�G��5.ك@ȯ
��#����[!����������|��J�,8�T��yˡ��.g�ˤ0A&K�Z�鵣R
+�����s�e����������X�K��Eh͌K��V�GQ3^�YK~���<BW۱�/�("�2�-ƛa�gh��� j�4�(��o׀jHx�Ï�!B�i���AP���\a O05�	j���(�)�أ0S��ʇ��[Af� �eX�.o |��lM8�E�Ƀ�֥h�A8,�ͪ�1���ߙ#�֋i<dw�շ2��2<DrF�ƕ���{"8��_!�Ce�2��<�-�0!g�G��(��YH�x:�ޕ�T!�W�³�� j�ʖ��Ş��w��&�#�THa�4����Y����*������)����*��%��QmWp�T��rz:�5���4� u~�QU�����|C��.W����(��Jz����}������"�����@WN��?�<��7"юx���f~qƮ�:���NG��b��j<���	F�{���	<��p5QM�J�$8�&۱��nU+i�d��x��=E住'#�%�(,��xI�.O[�~4wT���4���v���!�V`K�w	d�b�gwN��NBW����~���9	��8)�9K06�dz��;��k�veP�cz�Z�ڒ�\.]Y%��j�A��hD���d ��5������d)l�,�!]� �h��ɰS=�4`N~��C>q�ep�/�H\[Z�z�_����/1���_��!��2���I�{����>l�=
��Ǐlkͥ��0��1 �G��L5��nQ�rI0�(�������({������3`���r�4_5�>����%�y�[11�!}1.~�_| ��!v��7�r,D#x0p��!���z�pm@b����l)��ur�������=��l�g�p8�a��̀L��_�ˈ^�وD���t|�뻴D[T�d�	���a��y�w#l%xf�)x�{�m$x6fƃ�E��M�a6}�m��4E!��}��~S�
3Ր�dž�(�)��crd�;���Kh��m�[��Bw������ǘ�n�ExӤG�Db^9�2��fa��תU\/}*�Z$+��л�z���t��!GQ�|~�x�߽_-�|��\:Lf&��b�d��	�7Y{���?�aG×�'��)������_�ww�H��0
��g��&����E�07�EOv����H/�zC����UjUJ�N��"h��X��af��`�o}�8�c�c�"�/4�����;�:�\a�w�jّ���y����n����5�-.Es�d�q[�[���'PK/WUW����Fj.pip/_vendor/cachecontrol/caches/redis_cache.py}�Qo�0���)��%�ZkL�%Ґ�61M	�P�%��µ#����s��d��C[����ξL�����J��6{�Vk���p~��
,�*�Z:oM2M�1�Z�h<ί*4�j�.�w�,�8?gI�������aQ��4�Hc,IR�$�A�$$��>�_� |>Y�1���2�>����X\.��n>u�F5�x@SY'�ऴ���q�+�K����$�s��iY+�{ɗ�`�����UKHV��\�2��"�����G��=�����-�p]Q�*B$\��d���:�o���ɵ��ar�́&��uف�yg������[�#|�k�C��2ĩ�s�Y�i�jYG*���I�aT���_�9�P�^ye<ISb�af��lL4���Rɞ��[i��������-g{V����p�hɮ��"���
5It)`�KO�w��봕�Aх���i�i�����u��*p�:v�N\N�)�7��(]K9��L&��tP[C�K��x$��Cf@�s��<M�y�GE�Q�mxa�bְh,ڃ�@K�S-9a�z|�|;���|��ep���˘�A��l$�Eſ�~w$PK/WUWø�Q^pip/_vendor/certifi/__init__.py5�
� л_1v�u�ԗDH�"A]L��/���*\eH���v��YxNV6&�=�`�D8��o֖����ir~vDh^PK/WUW/ ���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���WK��`$�pip/_vendor/certifi/core.pymSˎ�0��+��H�C-l�Z4(��b�U$:f#K�D��C���I�6MQ��!U�2�j����s�zn(Al�"r}n�'��i��3��3R�a!q<��T�BΡ��!ݒR�OHsķ��chsH���/�J�9�#�Ә�9�W_~�� q|Q�1�>�G�dWP�T�47_�ŋR�`PW����…��K�'����ƍH:cL����$Y� h�7�4�tt��t�ݵC��#�\���8k{�4��ޛ�� |ɠ���R/[/�
�?S��n�B�ە,��8R��ބ,P�}M��|��EZ`�6����P O7z����Ր�ula6ṣ7�
�mvZ�-{���i1��}I>d�TKXʹ�P4H	�� �\�A��`	:�լ�-#�<}C��
���5\p���3�ՉUv�纡ÿ���Z���=�(^-f��3,#��6ʼ��������N�	,E4�n�����O��
��t'ڰK�|K�ׇ�[���b�1ߗ�Q�+:��
���o!S����?�:�b��PK/WUWpip/_vendor/certifi/py.typedPK/WUW�I����pip/_vendor/chardet/__init__.py�Wmo�F�ί9_@r�䪓�D\E�X%ahE�Y��3���::���0�4wW�R������<3�x}rR��e��@߽�
�\��W��ݓ�	�WLA�f��-�߅��X�
���"�9� i���lk
L�OB��Zl�5[1�����\+�dq;�@�*��[ʩ$!<ij��Ѹ��+
DAd�Ԋ0�&v7&/n�'�	~��ܜ�J��x��em�D��%���0�-���-�F�L`<q���B��膅!�(Ċ.��F���n8Cw���Ѩ;?]��^	��W�zb�(d�����-��{��;��^�}w�d��qǃ���p]x���դ���d�0�z�Gi�����\D2���P��?ay�"��<���#0��j
�L�E������a#���ꢗ]}mp�ܱ�9*�)�xh~��&B�p)�6��]�={w~~vz���9��Ýc���Ȍ�Fc!��6b�VMH��*�d�1�L��WD*��R�Q$�!ʔ�P�Q}k$�dߤV{O��y�)�<����}3��*u��:W%;׸��Ĝ�N'!�ε(N���L����~�<w8���3��7�O����Vőe�����g�ͪ��,3��K���R�f�m5�����g�Vv�m��}����%�dM��.�|ۆ�!FvCBE-8�XB����,+�M#N���9�1�s��Kf�j3
��i$&�H�.g�1����=%=N?�5��IͰ��L�INө!{�H2�N�G�'	^�ٍa��@*)Q
x�I�Ȳ��s�J�{%!�Z�Z��H&n�;96%<NRƕ&H3O�T�V��-}U�5�$����I)d�����}���8���SdS׼�^�a�R�6|1����Wk�i�X��b���Y�Vp�S�Y��N��/gAipp��:Ɗ*�P(�l��0�[	��nɱ|���a�O�T�m��)�̸|��稜a¹H(�fᎌ��O(����d^[a��O.�2��ؼA���-ν;p�'���n����,��3W5�*�Y�>u��6��i󯎛���,��P��(��.,Ν{{�_>�{;h�.mW���V�j�%)Wۻ$h�n~�*O�������K}���5���(��Ϛ��監S��)��,)��H%��3�dv4��Ca�,1����Y�l��>�S
/�0�~'w���gYV�����yy�$�V��&H�G��Q��Y��ԋ������>�����I���ƫ�U�$�w���l�G	A+����M"�2�7M�)��k�o�`�(ø���Yfa������>�zU��qP�=���u��gy�	����}���O4�ëvbW���m���������_��j��
��q��{���-vD�#���eL�%�|���kew���pʛf���һ�@|dz6|��NHֳ�d��4��\N�%{9d^��"��/��PK/WUWsW�9*zpip/_vendor/chardet/big5freq.py��]�%E����W��Z-H	�Gto�4���zoPQ�4�)*�����מǢ�WF��"�:y��������~~���o��??�|���ǟ|��'�G�}��l��{w����/�v������w���/�����g������go��/��^�ٞ�{޿y��'�����'�t����?�=n�oo~��x��wo^?�����ë���ǟ�G4�}��?�{����ݯ����쑶~�5�Û흏���y��o����×/������������^�H>~x���c��~���ʶ����m_޿����{[����a���7?<���S���g��2k�?��m���Kt�ۯ?oϟ���^ܿ��c"�l�^����1>��Ë��奟_�����7w�?�~;����������w��c4_���������߽z}�={���k���L}JG��:�}��;������<��w��㕭�_�>�j�v��~�����|7:��2V���'��)��H_l��l�����%���f�}w�����_�F���_�|��_|�����çO?���!�3��˖��)L���z|��ͯ��h�/�<����~��'_�������?����/�nn_~���'�هO�/�y��_}�}uw�v���ߚ����b&_ܽyv��u�������/_l?<��],����Yl��~��Z×���x�#���?l��o���n�<އ���ՍV����a��߿�F�7={�o/c	���z�}4��ˇ�����ox�_>������m�|��W�m�|���G��h����
6Ŀ�|��yX��^��0Я�����'��ct��LJ��ß_=�o�?�y���?��_~y������G�������zl�{�Ӷ��k�%^�c�}i�c��(��K��Ke��z�8���ޏ�s����'/�po-��=e��?�m�w�{ׯ�n���{�F~��Ͻ�Fw>xg���������H����7��;vA�
��N=��m��
��ǟ����NM��韞��|����ۯ��哏?���?=���O>���'_|����9��B}�óG,+��߿x�
�V�‡}�ɷ_=�_���f|��>z�}�#���o����O�~�?����>y�|�&�g�-�?�>o����Vn�C���3~�����x�����m�G|,���O��v�#�yӎ��C�ݶ��X���'l�߆1���<{�(Ǻ-���q޶s��:o[��Ѳ�Vo
݊7����o;��z<��2n��?��h�rN����q-�䌿���#�a�xٿ�xz+ѣi/W�[k��D���v���=1im?��L����71GN^c�;=o���y[�o#>4g�GϏx�;����(�ѝʳ�y8��F��>��z�ϊwE�K��3R*��;Ӌ��7�6g�	��F�缉�Gg�p�:�V�8���׹c�5�G�F���?��#�!�p�����c;1���b)����я}+=�!^�4o�+�1_g�W�o�vk�[Y��~��8����1���og�w>�@b�ѫx��m+�ovL���~���`���G㱧�
�9����D�[�f[t�07#f����N���	��ݹ���ba�u��3�ͩyD�O�����`�pal�qaF#��x��O;��sSb�c�=���b��vt�F���H��Z<ak62X�����x_g��z���7a�N-^!�'̙m�GC,1�~���]����tK;[���W{7l��n��u{Dft+f�1�2��+��o�n0f�6�X�ش8�X����~����j���6�N�im��b�_ۋ_��,Tc�Gqӧ�վ��X�t٩�Ƽ�B�X�蠦�Xq^��������d����1l/�U<+�y΢�ntk�����b��Z��p��􆧈��Z�:��vޱ=�]��:r�NִL�2�'����/�1ɱ��x-ޡ�,^dD���W��qo J���@���'GC��J�8	vcc[�ɂ�Q&ﮩ5��n3:#`a_/�4'�����n����1F��v����]b�*�Z1�薎�&����c��]�#vY,K��:Xn�{��ڼ�ni���S���� ��<Z#���f�������I�����om��o�ep��p�i��;�F��w�\�%~�}a�	�ٯ}�e~]�X�cŔ�xB�Bt����;�9�b���:bF�!�b㟍>�j7 ���[G���xp?���L_��u�,�J�23r�uWѱud�}�ï��Q�Y�oL�o%�,C
��3g/1<PLi���_��݊	p�X�Z���ngt��`ui��,ŋ
X�u��K�I�H���y,�l�d+dA�.�8##������h�G�]pI�YmĜؕ��`t������d<�M�#чP��V��`���$l��Ś�/�O��V��.º���c�?�r*3ā��k����7Lg�Zt+���c�{�B��C�`�+�{�j��!�q\��!���
��nN7K6����8f�=���׍N�C2ا�
pI�
|Wa�״�ڌ8�O���c���qƺ�(:�������%�.t<FD��F*G�;;:C�?WLU����+�0��	w��ߎ�t7t{	Rpv&�h`1Y�O-v���t��c�`w��v�gla04�_ޱĸ��p>�:D	b�a�Nǒ�����7�谝�
"X<h� tq0�@>/g�a�U6l�b����
#b@M�裫�r��IbY��pS�{�}�]s��	.�a���pu��_���TL<�����3�{[�q@Zu��~�tv{,����� Gh���6[Qt`�kl�8�`*�0#93pI�
�tXC�:������(��Y�~'���mv�|!��?2r��F�ͷj]�_pI��d<���4Sr���@Ԁ����q�v�C�;}���f�3Q'���d��
J�x�n��1g��|�������_�Y�~zB m�	�l�� я矸M���Z�z�k'��,�k�4�ubl��NՋ�JIObpfŸ��<��̏gO���l��Jī�=���t�?�� 7 PNSn��}q,��#�M�r�W���@�_��dc���`��!�3ǂ�c�M����n�O����d�2�W�ob��6����@T1�,���q�D>����-|m�[,b7|��6���]䅕Ŧ�ċJ�5��2<keɈ�o�!pIɍ]�y�;�!�6�	fʓ�:5�&e:�
�x&>|
����a�	#��t0��+�љ~�<��Yd$,H��:��>���qXAm���ҜX(�'h�]��a�4�CH��!EO��ƺ0��Q-R^���6Ir�,3#�WR��Ѭ!��������%�!�C8�J
�G��1�M�Kr������N��kX�Xz%V0�Q��� ���W�x9so9����1-'��:F��n��Ǩg��#pI��{�Z���>��z=h�x_��.4���Y�?F?�5�Kz5�c����i��Ĥ{VK�Ø�x��Þ>�2K���	C��.M��#�tb�DfX�v�m�J�"�(��ƀ�k���/�5��
��tW	 `���6�%��h�1-%�L����|w�8�Kf��>���(x�`����t�t��ؤop�)��	.�`a�2y�q A�I���V&����i���M��a9��ig�²n�C��j*	@��fR"�N���_�|����qaK��[N��>yk#F5v���Z�$6u�:3"; ��FIK�f�0�g����v+�u�o���̚�,�0���c�D����|%3r��n��{��1�l!SX>�k#[,;A�
5i�o���?u�MmF��$>D$m�*)�E��c�G�]�0�
�@�����n���
0W����e$��n��K��x�pX�?�2\|8�Is��iH�$L��_(�ӧ��@_OB_���&�|�ȁu~'&'��l7pI],,�x��	H@���j͙&`�����B|���U�d�/��o�����wdd�d'��G����41
���u%����n�Pn
��
�^$��k��v������HK
���Sے�8o�������)9G2�[�]��'07@ғz'}���#�E$��+8�н@�+
��ч�� �ĩ��Kp�$��L�L`Xig%pI�Cq�vKojV��(dAa���o#%��s�DFw�=�j���!pI|�Wb�
�wxov%�}���D���	c
*��f���.�Czq3i�1r��s�	r��RK�%#H��;�c'����v�%E��x�-'y�f]b�Q�͗)�t{3�6�`�A3�6�d�sJ�HJ
�#R�	 d��!v/�|�5Jf5a&D>�ڃ�<N�ĺuV�Vq���'���ε溬3�S^��
\m��}-c!�j��/�%� 	3:��%�J�,>��v�o��}ٔ�/hy#�����׆E���*�†;(�j7pIe�:�(���a	H}H�%`��@̝ܽ��٫U��r�Z�b`�jv�T��wI��qCR��Ne��RQ�P��h�ٝ�15����;�P�5됅l	���+���Z���!k�Ԓu�h�u��j�r.;y`���VRJ+V�{:�|7�I�b	��N�[g��qK����jt��.���#�P�T~H�^|*%��UWa�V��,��n��D��κ�Mtt�̏��
\�*3Aޔ��,�[����Ý�k2y���,��߁�
?	no��$����ZS&���-;���L&:�P�/�#����|yF?w�XN��	�x1�x;KC�*��B��n�
N��`�dMM<g�,9+�uH�I��d~	8.���K
�kSL��V$-1T-�U5�-g�FXL�	�O������Mq���!�L���f2I�]�)N��›g9��k�K�[�:��
�M��`��RX��Ba#�k﬚��4�lA2��0z�I�v�:�
��Lc��́`�&{S��=�����A�����T(
DX���k08	��d���C��h7�^85R�;��x��;�ė)r'Z�t����+�l�k
~օg�.��$p�(��
������Nc:~��@�4�ƾln����kP&��n�f��`_��T]�圓T�y.��dM��5=�Za_J��v�� Z������7����#�etU����fO��$���Y��Ƀ�֟��NXW7�|x1�8ShJ�́,̨�<ܜg�癩ӵ���
��۰�x��Y��Y�<x��P9,�7b���j7pIG�wK���ž�Z(ޙzl-�D$���OJ�@�Ր0��j�Df��֐#�e���,c��v��*x}K9�)���Dd���$�+�?	CjX@kp#VK9�f�l��xBӽ��ծ����=Ee�2޿I�BdW<�����%�F����a.)�6#_#de� r9�E��I�dF��Al�O2�,
_�bY���ҎN�:�nx���2x-f��1��j�vg������\�&q�%ƒOvp������$��rI����:ӟ-�82d<�AV<f�����1��G�%M�Wܡ��/��ͬ;���$�������5˝]R�	�S,��Hl�rT���.��]��7�7@�0�Ռ}g���Z���i�]��bEئ18"�y��d0�n�4����h@#����7TF�뤉M�	�51&\R��bcGИ��ϗ1e@V=z4T�L��SA�(�Y8�hv�ԁĻ:�[��9RȣS�Eڅ�;�vN�#XlZt��b;�p���	�E'3U��*�A�����hr:9Y�:86����p	�����[d�G�!�BQ�tpsV�����<V�Q����}	�|5���A��A���򎔁�P?�I�/�̆��W�"V�ɺ|��
#�NV��c����)ء���B��d)Ǐ��I����)\���]۠]�4h���̔���(��o����_bs�N�x���2�` &�(|6���6��y�9���yŷ��<��"����{��i]š>5�]
Хf;X��_��/!�7=���V�d��lv�Xvš��Uzue�K����%�N����PXR��5�Z���Ɲ�]���ƴ�}ɂ�VTD�tf�ղ�[D&x���Y�n����U)�mӆ�8pI�]�Wh��)Oz�-֞t R��uub��B�"T�Dt�`�
\�q�tTQ�a��j�FQ�(T�����e�X��6�0S�p����IL�4������
C���/:����2��z�h�#��n��W�+�	�kh�6I�M�r �ڝ��o��y�/����I��$���N�������B*J]��(Z��HK�]�&����-�*yp��ʝ�GY��Y�n?�2|I��<�K\�>�4�*!>�S0�l��]-x1]�7�ä���B�xP��E�ZK�e�����v��{�?�YѰ/����ƕ�5�Ե�UD�y�- �p�!��+8ˮr��6	j،��I$PfgO�#yڊ�2rkV2�ψ��y�,I�JѺ0b��=�h��ע��E�
��CS�N�qz���
*D�L-i����q�C��3�
\Җ�fw�8>�В	&��B ����ufSSc��vї�<���d�*��㔏��c7�	�a>���s�95�~���^��*dD��U:]ܩ�%� ��k-[Hqd8�F�eg�^;����H�0DX+�!K�,��Zpj
"cX`![�GUOj�a�]t��8��m�:N�6�KރI!�;�ɨf�J!;�]���?Tt�T��,l&ЬL���ZR�l+��Xc@%��J�Ƅ�3t����-̪�bZH��if���B�����o}�mO��b�Z7��.�~��"s̐��BUP��k:Av���O"L�y>�u�.�Y�J4��.�uHyz��	-tq'�Wu }\�V�[�c1\��_/?ps[�N`]�c�;/���g1��iQ��~#�X0F#]H@:�ˎ�rI
^;����j�`�"��E�x��5���l����j�F�24b�u���0���f��
\2tƍj��Sv�pQ�Pq�u�ܬyl��)fԈ�_��jև��W���hA^��ϪD��e��C
�j���4(�F�?j�Q���/�+�-C��q'��"[�3H*Z��I�����ց+�
\R(��Z��AH�����5��	�7v�����v��0�_Tt��V��miꧬ���5:=��f"u��:�Zd �m��5�K��/�g�JU�	����
b�0_���A|�n	իv��!m7pIG��u�|�̃�Щ��O�U�.�l�P�f�C�h�z�/{@��5k��Q�<���i�.
�.�B��"'\��W@��K�u�$K�%O��VLL,���|(C�a���"%s~ѽ���ŎE��5���FK١'M,,���D��ROp���ճ𓣥�4+f�f��.8�t�Kd��-���lW��)P%��-N���?r�\��^B�7;�Ɍf�l�L��	;C���Kҽ�醕�]j�TE򒍓c[ݨ@CjV4��Vѽ֩OmH͹D���쪔-<���;���(�&U��~���BB\��Rh�D�v)
�H��j*?m��t�-{���"&�H5ڲ�^
��ڵ�����5��-zS����/нV�7��=�4,;�
�5�!wO�!'�z�
А�^�/r����_pIsM�#5oh��s�Gh�*ѯ%�C@H�f�)�z����?ɲ�R��������R#h��s�z��l��/T�h�׺�{����#��tܚd��g�Z��yN^�� 4:&zK���
s��
W�d
�[C$ӷ�<'!����(v"�F��?�{�l�*�
�.l�F��:�O���C=�qE)��p�(A���5�3�p��E��t�{>\M^�$+�P�Ԣƒ��B;4s$�J�{Vu�����m)��8%i�By)�~Z��=Ȇ��Ǚ��#u�_t��Y�;=�	���o��Z)O�<f����Y�'���O�'qH�3�R�?UH�q;�k�^���Ԯ�*�Y9����{�X�hU�~է'Rv�!`��f���M��-ͳ�
��{����W�����B�k��4[�@�>D�=(��t�
���0@�[rJC�?��2	�U�*�G�0Naqu�X-E���R�}8���	|�����-N�tA�j���Od��5'�k�=�{�f:W����ம�=R�����D�l:&tȵ,����*���Ҭ�i��$w�����.�A�n�j%�l�WO��ru�ɃC�D���h�l�F]8�ƪ7�|Q~ѕ*8C�:��%�=�nL<��k�z(�x��n�� �#j��'�Z�h�?B�V��nݩ��C��Bt���L=z���m��5u�����ͦ�^�`�C!zh����^Qٗ�����'tO����{���ɯcF�WZƚ���^Gsk��`N
$�
V��%��9���]�R��ͬ�C��.�Ϣ�$'���"��s�A�pE��p��ze)�!�T}\�[*��"/Ge��n,Uw���u5
B�d��&h:�r��=t�ܯ���HP��ԫ����Rv��D���@��V���� �,�>1��b#@�Z�R���=�ɖ��p��������!�|3F��¦�U	�4\Y!�T��r���g���T�m� �$�<cU<��g��0ˀ��iJ���[�$�c�sSs2OW�=��T�v�M���@�4ѥ�-w��H�:�
E�B���,�A��ŧ���{�dA��IbI)�����7�*�2�sC+Y𿛹�a5�0@�.��}1@l#Oi�dx-����ef,%?oY���	*i%yDX�3rV������PCaz�IU��˗�{@��9������{��b�l�M�x��L�@W�O�u��=�0�/�&�j�����%$�*�s�z�6LJ��"h�� ��),��	µn�^kVĚ֏Q�1ɣ��2�k��8�_ 5�]A��|庩{e@���`�[�|�K�i�L젦�K"C�Yw���A~�y�C�lf&�.u�� (*�Ʃ:4�}�8�q�y_EC�ژ�
�L-�臄�'	$UV��}�.yȐ�`$:f���)�нV�����	���LYvY}9*��c�e9���J��9a��L��Ee�aߜd���ȑ<���g���'�f�
���6t��m�	S�'g]s[3��0�UbtM@V<k
�9z�c�׊s+JoMM��
����r��]
1�]G�RSu��牕ث�5��ǁ�h��F���G����
��+�A�f!	��ޫ�l��8֠����y贛킭@Jdܤ�f
K��U�����[2n�oj��ź�˺�x��!(3�ؽy����@��({���m7pI���Ei	;�:J�E�I��Gn��'!�Z���z,nO���{�����k�dM$��
�����s_h=�(�v��[���<Ι�f�"@�#)O�6�H	Aź��Z�[H�<�
��5�<O
Ex*.�BH2�I�u�{|�%�bldaT&�r��p��:'�Dž0�Eܰ[ܳ�5zg0L�ܧ�p���}F�2�=�
C$Jy^��{m&1���J�\b��I4����"��0̣���=�w7u���2�ߵmXu�TR���F�ۼA	�p�ʛCV�P��u`�kԽ*�<,�b&�����!p���<RbXd	�2�y��	ܴ*��"������^�D0PH!��>Vs�yR�o�
�ޮ���C���M������"�l2�i�<�Y�iN�
��5��͋�̶�-sv�7������28�;����*�nbd��鞊j��A�;=%�M��4�@����4Q�ۛb8}R���~���x��C�M�u+ĤG�	s��+ГT�������U�m������mȜ
4@t�|7�e>r�!/W��X@�GGϼ��{���������ğI� ��C���bh���&���օ�ѽ�n��c�b�G2���O�S����&,�GuyC�0���a�-d�@P��NUj�P(�E�Nd��î�
>�jwz	�v�� ��
’����Nbq�`�~-�#Mm��ݓ�#�3b�MQ�>�c@z�̺�n�;��EO�\�yR UҎ���ћ�W�~@F�QU�`�,P�J��YCB��!#�$T�,�m�P�:���M
���]$A&�s}��7fڋcȖ���kK��8��սV-{N��hUi*KFhS���*e�铕�#'c���{���(�6JQ�JYR�+0ʲ
Az�0�V<Q� �W���u��9o	:%�bR	+t�M#�t�����ZZ�?W��^6S�CQ $IF��0�u�Ė���c���<V��?�$�ס,�Y<�DJ�TB�Bi����n��k�<���	�+���{�]�����I®ʂ��QQ��	Z�+g:}��qo�\<A�^=���LƟ��<�.1& t��1��f_-�cXnHG�꾧.��{���]cd��x�V�:�+������妻T���-\�D�@��}�!�˲:m�1�g�=�?�ob0u�H���M�aCd��dV
|�I��&�,��8�X�e{�M��ި�{��<���'��С�E�EPȒ����CS�g�L2�ٮ�.鰒��L��K�X��v�HW�gu&;�Jx��E`b���K��*e���DW=����D)��"^au�E,�w�Y��p���YB�xote`U��ڔ���V���>��q(�W���u;�V'J��Dw�ꀀ2��4�zӥ�V�P���a�ȄZ�jt���p;��?���L�b9� u��j�1*��Yn/Wѽnd�|��C��j���a�x�PoJƇ��&��շ��}��.Ϸx��↞O��$ڀE�Cm'��3z�a��1�#_8�k�d6%d��[�'r�����U �n��XƢ�_
�F�]t�`�Z=޵A\zu�u49uL� ���bWcO&?��kݨ�4=g"rR!����/Y>o%-��o4�4f�FX&��:7���/���T�E�Rh9�~�γΫ�r���Q�
�H��v�CΪća��&;o���ޞ��O���[�X[�.��8�\�y+�yKG�->y�ϡ�'�����&�R���uu��ul�]ܐZ@��ly�
G�ȑ*��6i:��1�V)�k~��O|Ý"��Wuy�>�kv����Yc��0��3Gޒ���{��zk�GV�L���>�3�x�T�'��5bX_�8j���ҁ.��Z���)0�ȐA\f鍌�Q<E��7����b�f��z���-�yP��أQ�t�e��`37-S�kN�ױ�K.�U�JFכg�����i����^��D����M0g5���%/,b����:�׊�{tצ؟N�7��k�,K��f-S�êzm�u�����r��=Tӆ*Ѡ�.3�XA�B _�3�']Y7��:<��@����1���y��fAj�ox�"�j
h<�Ƹ�W}�Ga��=�;���K�/8
aM��R{^����ÚP����s#f�Y^P�7�Rq=�>�8>>l+���
�u�9eZ)W��{z��C�a�uK+��q�[6�@����=1�Rֲ�H}*w�p	�"�JI���7�Ӑ�Q߅�ɻ1��K������̻9?~=�ִr��jӦ�42�-Rn�4�9:l� �J�(
�.��[ʛԴ(�XG��t�]Z��\Bu͙�ȊV�v��|٠;D�_�pf�y��X�1�K�H"Y��i�AԾ.���ϲ��<�l
�m'�,�S��QQ
OB��Jco` ��y�ڝ<K�B��k��� �V�U��i��*���/�o��z�
�
�u	��q��/�o$v�/��{x�Wr���Sz#� _�y���o/�R=�� £e��YZ�����+��.}r�t���uW��r�I:OŎV^\2 5I����2Ʀӣ	K��q��B.TI0k5�cy��%�.���1�tw��`M�J]fW�
�ї�KSM+�˛��ҿ��-x��r��q(���ʐ�?�{L{V�2*&xy�WJ������S�^갼}�-9�ޯ��&+��v��U@��[�\����ʏ.D����������"C�f����C�/�ҫ��w#�T�%���m��EΙ�͎�P�
kx�@�^QZ���{�9���n�Y^�4�0UW�֍s�E('{���#�m�u^*fg <��İ�
�j��|���<�ѽ6�u�8��f�Y���[R���k�7���pݲ�#�:�e�^��?Y�!�X=(;��UtX׮�vmY( %�G/���3�����~�U��Z��TV��h�S	�⑸6M�N*!)7���.����Cߨ�/��YL���J���	��<kJ pʴ����ig��8���)S/��j<ʡ(�1��4����lī��Ԫ�~;�%X�]�����(^6�R�����R�UnC�wƀq�ܽ9���s��f�S
)D����-
`�Ca������z>�/sYؠ;%녜ۻ�~�� ��E��B  D�SY�[Gg����\����#�ݜu����=jD�K5�7���A�麻M��R%��!�Ao��—X�vH�JѰQ�^Y�r��*��{#���#��·<��ӯ�{�$#���
%��鞩W�6��^C AB�LѸ��y�Щ 6ϓQm���趸�x�Zn2*�U�G����Px�Z ���
�Ʌ'ս�nt���H��f������N/̓��g�d��}�gP�7͋=�DzҗwɁK�5~����<Hƛ��qxR�O�E�%.��$���x?X�c�ӯf��@�o�0ge_��˨8s�3t���J�3�,�+;L���_�nj)��t�>���O^��W�~.�o*��N9K�&���#�DwE
0�������~�t�&�55N�2�:7G>�?ٮ�7Y=r� 5��y+
�܇�;")�+�!�(�nn��d��Q����C��[�W6��[�Dh�k�(�7������wÍ��P�8
���k������o.�Kg�ѽ�v�y5,^��x����Z
s�M��^����
��\��tt�%�,p��+���yCuH�NC�ҋ7
*�����4\���xƋC�py�wt�j�H�����勠	(+��_^3�_Ǒ�M���ѳ,9[K%�WBy0�%cΗe_�
M	r2,�շ�ƽj(�etU��gx��@3�׃��ߞ3uHbW8��5|?�1���P\uՕ����T0Eύ�}˃��/9����^k
&Śdr��i<��,
xˡW�4��8m!��	^�:�>���I�yX�˧��g���h#��^�W��6���{�v�Kvы��z��� ckE���\�"��ɀ����.���1o�!�{��Ҧ����� �y ����~�	e��c^��k�8P���A�#u�&�%�U)�
�T�YKgIE��&�k��˽j"}���t�V�;sp��}�V�\�V%.qM#/�:��?�C��J�>y�B���ry�7̉F^
sx�!����,oۅ/A@[��!�FOJٛ����k<.�Do�!7,Xǯ��~�o���Z��@v�-E~U��<r��$W�rْ��S��p��dy���خXw{�k�#����.c�dv=t�d���W����
�X�̉��)�@�X���U-`u[#PKB����%C�q�A�z@y:�X�����+��Nj�Ћ[�����-�W�Kpo
q`�z:�y���2�~;�W�[8�!�=�_�t^�r��GMf)����`��v�2r *��
<�P�
H
�����m�K�UsV�5�����.$�V~��n���=�����{�G��&5)ЀR���8��I�7�1����<h�8�+뢿'*��=�x��b{��b��������yj��ĖN�O�&��}X��]V�?�]+�GTf&k�M5Ώs��,��T"'��5M���o�t��x����L���]F�Gݧ�	�g�3�ĉ|s�t����k,1��r��ۜ�.����8TM�^�Z����E(�S��,-zۗ'eU�a�>�|�hme��A�䉬�Mo&Y�<p�=� yt����o����<��j,]�:bBƆ][y�"7D�d�}�	�Бjm[�6��ak<u��=��uϥ�M?|4�ۑwu�$�#�h�z�i�r8^�~(1,�+��i94��i�L
F���K��/LaU��$C���PQr�SW�0b��N��0�
��s�RhO:p�!���ZN�Xs2���'d�焩 r~�{��xz"O�v��h��
~8�=�\\߲'~�T�7^\�HWBb�5�!�U�e�S���%%I�&�hnj�
L�k��ʰT����[4d;��׮2$}��н��_���PK/WUW|!��B�!pip/_vendor/chardet/big5prober.py�T]o�8|��X�/6��\/��d�N��$E�ZZ�D)� �꯿�?��A��$��ggWl6�?�<��4Ńi:��x�C��6MZl�fVn��b�3IG�M*%�]������R�$kOj��t���@>�+�cK� ��S�.;~C+�v��;c� ����xfYx�i]�>J���q��S+nS���?@q��K�R��ZG	;�/�:���V�+��r�?!����Rm�,閠Г74����c��Jɵ�����)�+�=Pm*ʄ&˹tz�I�7c�/M.�:�*����ڳ-��ç��젔�X�E7�j�d�Xf��p�1��85Bң���} �ȇ�_�:D�C�w:���!̺%|Џi��
�5)LÞ�ݫ\:�I�=����h�kEk��qQ�PK_F�ϳ傢�3}��$�.�P���L��asBWVh_C8&�$�D��G��~8ZLiJ�YBͣd1���(��2���A�(e>Y̼f�������9{!�;����:T9m�c�Kl	�"���P������i�;�j%v��t�r�oK�u;t�C��_F�>����ۡ�q>�N"`�>�zw����zD���L���l4
kJ�f[a��
Q_n���#\��q����m�ȶR�	�3i�L�#�\����5k8}��T��~�9F6e?�g/�ʳ���*��&����hdJ8�Wz��s�U��(h���qV��cU��/�͇|x\�;����ڗǶW���J����}k�J7���O������Gp�B��ϝ�]iQ�;�^���+��&�x��zS�ͯ8�Я�ƿPK/WUW,-�v�	0''pip/_vendor/chardet/chardistribution.py�Yms�H�ί�K��`{7v^���6�
>^*�K�TB`!����{z$@Hå��ZW*�3=O�t?�2����?To\7[tۼh��
�߶/>�����j�r$]ӡ�$��c���d�J�T�O�#��ȂL9�\�t��Xy)�	Ǜ
��!�Lȷ�
,s*b��s��O=_�`���p�򅩄M��FL�2}ƚ.�j�(Q����+@d����8�aـ:"�7a�'��\�����s�ݙ�W���ȗ*v�Hyt�Pcύ�S9r���6��96��ތ,�%_�2�aE�ky>�O<[<4sm�w��?	�6�n��V�)]W�8�l�H�o�%�@�Дǂ��RW��n���������<�&�#t\�.�E�E����ÛS^X����re9���$]
;����8�����Y �3����f���Q��@k�N��{x
YX��_�$'SP�&��7]���p��\�`E�޼m�x�W�^����U�C5��uz͋�m�C���}��(u�X����e䕉���x��-�)� <��`��Mc󛀛-!�(2"��A>t<w�ϋ%k��&9$�SE����R��ڿE��*�
!��],��C@_9�����E�jX[9�V+���J����ȶj�.�L*�s���MH-�ǂ�8tz��n�]�3(��A�R&�C�Q�y}j����6�:���e�S\O�׷
��O#>�p߼����n�Ӭ�{�v����+D
���56�:[U��I���~J�<Si��.���Pʣ{(
�_V��Z��<�Um4�Ի�C����ov��乤>=��2ol��޷oju��G�	�s�������/�i
d��H-��n���7�e�W3z7�F��}{Io�Z9>��~�a<4������c���T��]�ռ�ߥ�^��-�d5�0�p�*����p���fNu)s��	�e�p-��ˆ6��SE�C!o��͓�Ba5�Z�/4�g0����X�$]��r���V<�O���2��ࣳ�.F�3R����BW���
9����L�|,�1>�R�y��̑>��s1��+�e:����С�a&���X����|>/O�ަ����}�
�pV������0E�.��$׺��814.Ùϥ4�	�M�p���;�3Cw8!Gv��vL\�N �&�p�I/M�j�m����(�lE�p`מ={��Q�9
��p�?\�$b&h�R5t�����U=�$o/
�[>zv���t�16��@��OL;y��͢��C:L}J@ *#>
{�����dv�1���Z�.�ƨ�����ǻ���P[���U��u��`�DP$��=��s8m8�=�U�c�cf�װS��zs�sGj���0��[:^C��#@]g��AG�8E�u\��i@dq��o�l�Vz��'L!yFZg�g.+U�G����i��@FN�k�/�ioL��ߤצ�H~�w[��'�����LZ蝮x�Z��u0�T�hT3ߍ�4�����nᄇ���Kl����K-;R�)�rpx�"t���5R�4F0��!f��S�p$"5�l�&�GvQ�4d�X�Gu5�[�?ަ4& )-AGQk�ɧ�K����$�\HRqE�e+�fRd?��0�5Ɖ<{�cgϹ�"�rU�T�I��k�)�Bm���2���Fc�)����x?�T`����"��sE4\���lߜ�R~9�rŏ	a�]�
dBᣔ"�L8msv�X�39�-�0Ίb6��ی�0K�	�ؚ��
���&���&@E�ѕ�J�*B���-@���Lw�2���F�:TXN�lH3*WEB�!��qX	 nT�[aΛ4�9J�a[��s��
Ɯ��®J^M'�r�����.Z�D�����p�w�̦ܪ�Wr�7��m�]Mk�u@��]l;�`����I�zW^-r�g/J��j��!J?P�q�N���	�J�=��턬Y͐u��†��Eo:25���>��5�������ǟ�ޔv l��ħ��x���p3��$�F�� �c�%-[�k��g=Z����Γ�r��#\�x�8��;3~�?t~�˃����\��e��7��,.�À�W���ɾ��e"��*�!����I�,�l��Y�q��H���&|�{Z��R��7������#�OȂ��}��I�/ȁ�HiF839��ȧ�cA?��Xz�V-�9��fκ�>���E�.�'�9���|������X�7�eO�0�MP�I�B2j����>R1���z�[F\�N�����̊�C`N*;«���}Z��Ԯ������}�O���K�1���WQ��
u��Z�u�i��=�P�{JtdNgWٯ�U4p� xU��pk�F%�q,0^�����ut%!��;C3�G�Q[6XJ�K=�8���;���+�,��y�U)V�v]�c�k��PK/WUW4�!�K)pip/_vendor/chardet/charsetgroupprober.py�Umo�F�ί]t�ą�*5�R�p�C%�SE�b�au�.�]'r}g�
��E�Z�`�g������E��û���`�.�p;���3��Xn)L�0A8d@�i���0�	��v�`>1R��|�qy�X0�0�}�\����D��==�eRh|U{����T��W��:N����X�Sm
4-�^]�����9����0���g�LR���l�V-�D����vp	X�#a������"*����R�24/X�5�2�P4`:�G!�*��d��ؚ" [��j�s
��L��J�
���,Zs�c�Th
D����TjdYd��H"|��5P��m�g�4Z��ͳe�m�^7���c7�6��E��*�tj%(��D�E������)D��o#���t����?��y�]>\�/*�_�)��q@V�c�p?��cD�v</l����.0�Ρ��|9�&�9�V��t1t��[1�D.$r'Qɀ¸N�?`{5�ؒg�m�)É�Gd��\�M�CJA��� �iËb8;8}��"J��6���.:�c>b!B����
�R�z���Ηn�s���X-�r��K���܁��ia��љ�d�a���mX	|�<K��f��u�"h\P3K��#���MD6t�8f�'f\��F��s�u�r�d�O��G�x��ckC�<�;����.6^�`�Nr�͉�q����+M!�#\<͖S@��<����x�78K��T�㏩J��H�xD�	��N��To�zih�hC5ږ�(Q�%M"�+�R�w2�g)o�8�S��+5V�>�	|�"z�P)��%���І�L\(�M�'Ȏ��:��{*	�����b7��K��
�����5�)����9x6�?�9�r�CJ�l�cC=$�K7֣}ש���D�����g���%2L�κ͈���&��%�y\�����1tFӕ��/�8�OW�p& �Q��\���$�}U�ӥw?��|�PF�kz�Ѓ�ry�U��:~�X����ڨ��_��>9d�!�$�`�g�Ԁp�Z:����u�):���`Y����/���=�I<��
�tm��>�$0��Ԇ���z���Hf���j��0�K����,��^l'qG���R6�k�]U�u��{x�:>�K(����4�PK/WUW��`@,$pip/_vendor/chardet/charsetprober.py�Xms�8�ίP�7����9��!0C-�����戰eP��>IN��}Z6����Q�[��ju?�tkNN����ޗ��
��h�c����o�ٓ�	��k���G��I�.�?dqv���;��k#,���5�!�U�JZ	�sq/�8��!�GTC~$��y"��^�J���X|�$����e��u_nE����*�IW��U+�j�:{{vւ����D���aa��A�I7VV�E
�j���
c\߱K-�\�&���٘]n�*VNb���?Ŵ�u��H.4�B7�B0����g�8e>WL�@��~ eW�i�q~2��R��KnY��f��
W������"�>�/���КYP�ɐin��P��τ�>�M��
{뵶���ո%���a�E�ޞ�BPx0�����?��> ��B�Ԉ0��Y�m0�:�����;�֙L:����E(��g��:�$�+͕�p(��M�_q��y0̾����lԛNY<avٙ�ݫag�.�&��i�Cp��BL`yq��H�H��L�w���(`+~/f_��Ƒ!��b�j�ő�L�LŶ��D� =�-E|�
�k�_Z��.B�8ޗ!T��8�
�96�D/:8{���:k�~>k1v5��s?����|N*D��)��(��ֆ�d7	VY�:vƣ�J/��JQ�̐�eʗ�/#�`�]�xS���T�Yo2���Qg8�6��O痝-������u"#Q���٢z͛t�������Κ�?��7o��d{��V�Jŏ���0�’B�+N���x2�^�泯�>����/�v B6�K�|^3"
(%�����w8�t��G�:k~b�X��SI?���
a�3eH��ެם
F_�
s�"C!<өx�U2���=1D4��B�-����|��Z���i
���j���g����f�8�Z��B�6���A7�EZ�T+w�s���K��(�p�X��i
:��
��(/6V�C�إ�5}�l�(ls�*���}pH<�5â�}a8B9�c�@(��)�bnT�yg�%�F�k�
\��Wh�sC��Mm��/c�V�� �U�I�E���=����SS��*���a}�<���<	T��Y�����lt����ju��7��T�_���v�u�=�x���B�6jI�{�bؖ�v�Om?�tՀ�F_f%F۝]c�!�A՘n�zE��:$����J�|�F���9fA�)�b�D�4C�n��&3��>�k��&7�x����'��ĝ!u9�p��71�.�;]���2��s ds ���4N
�oJ�L��(���s'���	��s\�%LW��%�%�ȍ�����o|-�a%�bj�4�^�"^����ž�E��rZ�_>vi��L<&�Y7�e��fJE�2�nDᶹ����Y )
HP�t��(ŬO�g(��e�PA�\f�G�B��P1Ы�b.����,�*�R�O)O<Z�X#��v�uSR��4Ȧ���/��G����g�5�)��������mvl�)��O�Q0> ��́��@q
�l\�!�}]���kċ�:ƈAI��H���B.�0�������X����sr!p5[�'ٜYz�82������\���8��B��b�v¥@�̽}���X�b����/_���8_Oܵ�4���B��mV8�f~l���dyB'yI����������N)e���͇OGI�L29g\�-].b��i%ȸ,�ԙv��n�=�p��j��n;�)s��N����Q�l���!.�%��b��ђvˠ�{���5®7�R<8��|dQ��W��wSA���xza>�s��鮄G5� ~B`�Z��X4��$�^���],ާ����i��.A������S��6?�Ƥœ�k�{�_{;S?R�|���� :�R��yM/���U��#��`y�ް��3X�������/�E�O�3��T&�凔����Iy��!Ջcz�˶��t��xF	In�O�]9�g38M����3W�SKϛ*8��0��eP��݉ľ�NP��M��^�'�ٝ�	+ �yE��-��?
��{��C�,�7/t�?PK/WUW9�+���)pip/_vendor/chardet/codingstatemachine.py�Wao�8�ί��������n[�t��.��V@��V2��:1g;t�_�vBH����Ğy�y3���e�f0��A�?���7�a{�:�ɂӽs�3I=�p�2����EJ�)�ZԪL���W|ťZrM*%��CnM̖KYV�"fV���Q/�����z�9�<���#�Ŵ�Z�q���Q�:?����u����54��OB&=�[-f�U���a���� �\��NZ���v��2P#�L3�v,��s2*�/�֪���y"L��X���4�3��t햊<A:.j�uf*o��t�
"��s�l��1�oE�sÉZ�5����v���@�Z޳{N\`ߝ���`��G���MJ��.~Ts���$��+�h/u�	���.�=~����hƩ0<-d��σɧ��	u�O�;u���s؂i�~IdK)��4����?�}�G�rp;�<���a<��u�;�z���=<����h�yE�#s��S@f
L&�2!MH�	�5P&�`+�2�\���aD�럪�T������s)�ʶ�E��o��@���F��Q�~��_%J0���H}-��m�T�:ӻ.|O�w:�'����1V�Px�?E��B�ܸH5��[�T��"(��Ee,^��[*�{~w�v���vKW��Ҳ���V+�̘=�g-L1��.���<ّ�Nv��06�0����q(7�%�
Ņd���#P�=H�rA[��Q��ioZ=�h��Z�nƨ����c5�b+t�I7�x�^�fdE�#/�M�x��97�l�͘���o,�R�P�)��?>l��@��=:��iƇ˸Af��s)9Ct��!�xu��1��IE�Y��'��q4v��C[?^I>Ǩ4*��#�F+&E�o&�4�9�E5Dc�P������V��	����Wa�q剻��	)��k�׍�:��y`}�c8�����r��1�$���C��B��:W���4F�M6�I/��tN�یy����5\qr����$gIYD�eN�7�W�j^ppZ�@3�����G#ho��[�~�S�-��1���z<�l������W��jȫj�=,��"��hnS
�Y��Ab�&,�*���Y;a�?��t*�2�.�6���
=<��?i�*u��4��e�K��뫍��z긜��08ݷ�zr*1 o�z]4�7�Sݴ�É.xs�]���9��~�h:�YƧ��D�ۣ㚥��ޤ�G�n�r��Ò�r�5�o�Z�_8�����<[����P�B� �mgϤQ����]l�|i�v�]�/~qj�mp�%~޸��l��{�h����=��\�DVg�͚�x��KI�W7l�loS��67�R���>�R�f���m��i`l����=w��]Pgc��-t�sR�v�ׯC�<��n�F��BUĿB�:Ι��ZC�u�
�2i7y��v�(��������r�PK/WUW�0�_-pip/_vendor/chardet/codingstatemachinedict.py��Mk�0���]6���)�>[������Ҙ:�������͚�RhNFz������2P���a������Y��òs��L�Nj2��]��w$�J0�0�2����Eύ5p[�}��O�%�Sk�! �ڊ-���B ��]C��no5t.y��_m���ݠU�	v���	�1����#�+�FJ���QO0z�R��+Ƶ�r��+�ϡ(���F�֗��q�����J���l�6�'ͦ��0M�+kPÖ�,K}Q�LJ	���/PK/WUW�Q�oD"pip/_vendor/chardet/cp949prober.py�T�n�6}�W�p�x��[�q�� �X�ɠ�M,E$�@��=�|I���I���3�i6/���
��$��~4�?���F��[�������Y3IG��!����`��С�^"�_X�[29����w��1LEQj�	/�v��;c�?����=�,<�iU��J؀��p��S�ߦ�����QO)JB����^ו�V�Jol˵?�B4�;ͤ�XY�5��'ohV��ч�!��++lT�-39��W��ʔ�	M�����“��_�E~a�2����k�X{��;j�8YЈ��#k��fV��̐<�k�$��m�J
��@��{u�%�����u��;d,�����]Hl�tE
ݰ����J�$�v��@��1�S�8/U��o���bN��3}�%Io2�C,�����d�S���
�+�8N�_�ѻ����~0�O�4��4��z�|�_�z	��l��Q�|�8�yI��9 %��T�.��u �ִ/�6g,1Q$�Dv��2z��)gA�H植�Ы��L�O�ʹ�}u�.����Ђ��z����7·�q�7��ݛ��7]�E
�G����\"�F#���(�
{�0lh`xE�<�q�'*�q�û��1n�ȶR�1�����3�=��b.s�w֬ �!~\*/�+�}xS������\q���v�L����!5�L	�js�ֺ��u�m���i��X:�e˱��t�'M����+��Z���>��q(|	R_.��zO��:�ǟk����&��r_?%l������a�W��>�;��9[�>z��-�R���_>n�?�ؾƽ�/�l}u���˥���YJ˾����5_}��ޔb�o Ox�B_5�PK/WUW!׼��pip/_vendor/chardet/enums.py�TmO�0��_q�H[Ey��J�H�<BR5a�R�\���l�ď��nË@Z��~�{��������`W�lֆV�����vZ5˕j��R����†�w|�� �Ʈ���K
.�د����g�5�E�T�`���ր�Fi�b���� J��&7��,�8��ְ���x[���5�\U/�i��2����=j�k,��P�[�Z�:�n1��EE����p�(uH�!���!GӘ�eC��¢�o�8�4g�u��:�|��`p�i>���4ަ4��I%I����C���%Q���l¢�?�:�g��,M�����4l�=v��t��G��B����a��'/�����Xx3�tg��L�iˢ��T��Z.�b�[=}��n6�?��8ʣQΒ�N*��:,�yq�Z&W�\��S�nk��C�Y��g!�f鬣���-�7(K��;�J��	�Π�"�
^�~a��P�w���k�Pߪ5:s�+��^'1��⛎p������{g.�5�$�P��hb\�T���5��R�����e}~["����(Q2j�O�����Y���r�vj?�N���v�y��Ow�E�n>�U��P}�v dTd��G�m@�v��;�
�玴ĭ���Ѯ��4n�K�I>Kc R�����BE-h�M�H�ф�d;I�NO�mJ�bHo�ҁ~Td7W�4v��;��=��S��]��PK/WUW��n� pip/_vendor/chardet/escprober.py�Vmo�H�ί%�	$⃜N�$��b�`U���{��]��$G���bڴ�`v�ٙg�����w��C��ą����N����a�@*>�%Еװ�_y�0G�9�dsj��'���y�/��*�1�
��萭�L��Z�.���j%U���a$Uf2��6)��ULY�Ն�Z�wо��� *��$	����1jT/e�t�0���F��n\�`��g�d��.�24`$�6f!E^?Q��bjcY�"h�WJ�6r
!�0�:�'"0�*�/e��5�ED�ج
��.8|🠏�2�����z��<D������E�T�&2���$���@N��T�,p鴋�r�&Hufl��͕
lP�H���t*)(+���vA���B_IF0CXk��I��>x����:�3|���|C��4�R�2$�\%���*ń�P�0p��G���y}o�l��ySߝL�7CF����>�;c=�GÉ�L�-�U$o)�	r)��
��J��jJ0�`�^��"'E�Ym~����^
)	����	���vH}G�%���M}�4�691�9�L(��c��%R�&�Im��C���v�u���x����\���K�V��\�٬8�E]��3L�Ē&<	���8�)�f���}�d����‘�E̵!
.Y������Ğ��<Śf)��31_�9�xB*��3�4�	����֡^�mx�'������7S�7^�./�~��ݨ�~�co�j�0aZ��ý��{�h-Y�����;��=;T��wf74�p�K<�"n��T�$`��
���,�W�
H�����jY���f	fK������)�ޥ��ә�Ubd
�#��5�*i{{��M?�aA�iIA]c7i��y���>���
��|)0��~�6}��l�w@ow~7��;WW@
�����g4��N �r�I�ѣm�o0�{=Ͻ/�9�������Ǫ��ȫ�9�cA� ���w�Qǖ�5+�Gx?���]�3`��N3�J��4��־C�
	FA������#=�>Q��ܩ�$��MQ�:����ܻS�;���}gE�d�rz2�=��Q��n�R��|اv���S�(өZ�	�ëNН���_�N��x��M[�0�-]9X �K��TV�Ь�8�ϩ�D~�/;<�tC)b�R��8����������	m��j��1b�����P�-����יپmm>����z_SVK[�=�����'{�9R߱c�?zڈQ�
3�M�&3��F���{�
�;ǧR9�#�+�+���ڕ�E[���U����%����=���4�ȓ��aʛN��쾑Yo�����q��>�2� ]���qg�����|U�s��PK/WUW���q�/pip/_vendor/chardet/escsm.py�mO�H���)N�&�By4��+i17�7d(Si��dZ�a7���R���*��FBDf��w����4ǿ�u��B��lu�\vz�;H�g�a0���i3�Θ����۴,�w��X�Ϭ�m��LT^�gn93.�1���@}�{��f��ӹm��3�ůb��C��r]p��1���歘 ��o5��y
�z����<4,TҺ�r��g>^���؞0Gs�'��9��3��M�I�S���ρ�›8v��e���!8�1��ذX8sЙ
��Mwi�����?��O��i,�hn��;�j������M�:�Ŗ�
������#���⎩s��\�Q�;y��55D��ѽnb=��K@�Ww����Qp8gt�)�z�X]����kW�`ھ�����!��'�#q��ܘ[Yt@-|on{ht�{CU��j1�X��t2�3�Dc�`������}Km����v�=x��_�ݖ��uO����|�4T�?�����h��bLь��K�
��:�1��i�ˮ?��@k��q�un��kd��i-�~���Ll��!�)L�=8�6�m^G�m[��G��2f�e�(h�pmhm9��o�����b��+�
E�
K�^��^m��g2�p���
ô�\'ϔ����{4����~�F����+�
.�WC��}imL�s����1lv4�N2�n���B���\Ʌ3_�	d5�2Y�܊�⦌܊R7��i�rS�n%r+I�J�V���ɭ,u+�[Y�V!��ԭBn�[�ܪR�*�U�ng�vq+�+YP^d�vf��[�e5r��Ie�V���ɭ.u��[]��ȍI��1�ۈ�FR����n:��R7��t�ۘ��R�1���n�ܸԍ����fH�rí�4C��6�7���x�e�6�|KU{j�W)R�߶,�+�=6�;�7�����B��s�Ϳ�f�֦D���"IG�rf�ޓ8�Ք�J�3�^�\pD%iVu��4m���B.8�64��~�Tݱ��לB�l����0�a��"evZ����G�2���V�<�k�����sݡ�F?:�%�d�U�1��jP�T�
m��`�����Z��ͦT}t�#ws�SJE�(����4gO~m�Z�r��w���ZO)(J���[�o�[��í�nIe!�R���n��B��"�V�,�[)�0n��B��"�V�,�[)�0n��B��"�V�,�[)�0n��B��"�V���^7�����ij<JY;��%y%�o�D�cي�6�z`܅_i�#�wܶ�_�����&��a&�~���
�R�|<D������T��J�Ѥ�Ôڐ��k��X��I�ԭ��,G�\����9���g��߅=#x5�ߵT�������_d_���q�������~����Wܻ�|@���o�շP�p/�����c��c��,��aB�X\�@��}ΰ�6�!�a���iC���7��$o��ZR���7|c3��8ܩ��Һ,�쾜p�<��lȾ��Ge_��W��nz���a�_M�:0��<|ʃ���O> ��{X�1���8#�������>�Z"�.?�o���M~ݩq�u��l��PK/WUW'᪅\^"pip/_vendor/chardet/eucjpprober.py�Vo9��O1JT	t��N�&ju�����EUTE+��u���MK?�=�O6msw�Ha�yofތ�{zZ��U�?�A��N{t5u?�3���S�֜FZ��d!uՂ�0�Q�E���+
�֪e�})���5��rMjI���CnM��K�M$E��P��Uo��_@Lc���@sf��滘��ӎk�����z�A�o�E�y�:aHgkh�
�O|�d�U�j1���uӸ�
�=�_h,•:#Dh�*��Z�4H��fz�TZj�ɨ����.i�"
�$��$����ߕ~�b�sK�\ ��zc2
o�3p�H�K���8��"x .
'fh��̺P��2M��X�K����+��μ��MR��̺�Qͭ6�BTCg�V�E�2�]C{�!��6�9���e6�[���F3�:��ԙL:C���P��_�$6�P�Yi&����7��ѹ��ރ����
{�)݌&ԡqg��AgB��d<��ZDS�3���U"�/A�QPr�-�IR@y
�fOe�@G���^T�P�U�/ ���$�$�m�W-�;辣ꂥ�oM���GFL~	Q�)�7b	�P)ݤ+e�3��{���>?k�9oͦXy�����i���jCv�HUsGg&`��
�L���05�ͺ��{L����Hq81re,qÂ��<Cv㝩۹OvR�Tj�n�fMk5�@����@�o�p�l���A$���p�	j�9�B+�v�w�;�v�c6%rz�ߏ�{�Z��̘d9�ի�0�0�ЌK�}�)�u��e����PI���D�{�F+�k[@�z��]���r����̩�:�{����ca����4&��b.B��2�#(s���lw����d^8D��?�m�%� ����B&W[����2��N�l��/bT��r���ٽ�d�M��cL����&�=��̛X�J���r��"	���b�Y^Ϣn����Û�yR��%�8�&n֔
��͹M�J\YB.etU9ɖt%���X%(&n��44Z��d4)G��S�V+4тϣU���='��/�k\�\k��1N�9iV����fYoU����Fu:�~���<��w���[�ˋ��{S=#e���lx������W��s'��{�kV>����a���pp+���c�"7���s���ڷd}4���G��?)g�<�/���?H�:��P��n�D��ڏ�5�_�-�=��3�c���ca�"��y甚��^x{q�p�����T�j��+��ݷ��C���LɥXppؾO֧w��םy�w7��ep]�7��1:�o����� ���Z������D���P��CD�ѩ���]��H3߰o��X�%�F�PK/WUWh˺�m�4 pip/_vendor/chardet/euckrfreq.py��k�G�����H�/Fj�ʨ�K��+���``��5p0G��aO7���~�y
��H�H.��ʌ�����[��������'��ك�O�?,�?}��/��:�U^�ߕ���������vW������///����o.n���r���)or�ݓ�SϮ�7����������X���7h�'���7w���pu�?�G$���p�޿9�.nvo���R��RGh}��K��)�=�]j�k�������e9g�u9�]��n;yp��9�_�m~w}����/��(��?�ʝ�ޔ�Cy������ST���Nj�g���ە�û�_�����ç���wo����M��z���1�8�ݿ�̫OWos;p}�;~��*ÿ<yYﮓ����y���MN~����ޕ���w����#y�������e�����x�oJܭ_W�B񴤮�������G&�N�?������̻���;}[�W�}���?�`n��4��zW>]��}�<M
9�����_��|Q�=�������'/~�>Ǧ��k�o����1M�m�]/�n>'�I�LJ���3��?{|��'�t������ˣ���^yv��ك��g/ϟ=}��n)�w��"F���o"~�$?R�ow7���m�?�z���˷��/�T��>-�\��|��������g��S~�e��\nN˯�}�NZ���T~��i����e�9�������9��]�~ty8O��
C��s��u�Sǡ���y��W���'?�A��I~~��rW��5���Ǵ�ޔR��u�ț�O����D�O)�t���0��ݛ�W���ϟ!Zc-�Ν/�ݥ��毿{���o�י	C��/zo�9C[ջ�<{��(?|�]�����(Mc�S�����v�_ƻ��d77�ǹW9~rb��p'��-�X���1!��sON�|��W/~zv����W?�=q~v�勳�O^���%����۸{�?|���?�\-փ�GL&�忞ŗ�ח��ӽ�p��4�w_�$����?��WO�xx�t�;)����ߐ�N������zZ������i��~Z���iY�%�
�5��ⴔu9=I
��:���q>���F>��k���:�W�������V�Y%�<��|���c���)Ô�2c2"��&��YI���K�{��rL��}���w�0�e�MD���nS#�ZV��qԓ`�����˚��4̭9�,�1T�\��m�1��+,�J%y��e��x8����lT�.ϼTMR5����1dR��Kha��U3���E&�����s&(�p=��s�wRF��=�బQ�r����և�=Bp���J}�&f�3�e�B��y�ȞED��Ң�|�'5�@_Y �8����U���4�K��{Ŕ՟dPn,�Z;3��v��t��e��rq�,��|��&2�P��c@�(o��/LF:&�V�a^�@�9��,=��Odљ�a�C�C��a�1��w�/���5��!4�[s'uHI�_��:�H;��ȟ�ln_f�mu��v{)���C��!t<e��ךd@��*9o���u!���kuH�P%
8�.���~���]jk� .�&����"��1/�-Z���R�9|m|֑EF����g�>R�;̎��f����t�M@,
�4-HhD��(+�]�C���D�=R����TF�sh`Ө4y7�B�=�"�M���J����'�F���[A�1�R�L�	Vb{8܀4����:�-�n+��p�i!�H ��lz̅�\�\#��06�ĺA�e��
(�̓'��Z`�N�	�(�>��I�@��ʖW|h�|`�l��Xr���Y��q,�t�5�;�G|�-k������\gx���	�{W����[��I"��5N��ip��ꇆyAf�,����?4�e��_��ş�,Z��+6�H��@U�.}7���5T&[Y��>�����#�����Cr�;b��f~J6ZF8x������H>�B#� b��u@0��J�+�c�������p�:��d|$����\YD-�3Tu莱�S�qYt�Z[@�#H�䚛�c�۾S�Օ;j�x�@\6!dV�RU�l��\�ee��2�[�-w���i@oꌐ��wP�����,Pō�i}
�l��u5]��̛:��Ъ�0��uL@\��n�*�o+�f��&ܥ���&؝��2>|1�5I
R�x1��[L�[�8|��.�^&FD%�M6�~WT���U�#6��[�ą�~[֍�D����-C��fG~E*�|'��J���S���\8D����C�&�?��RYu�U_ƭ	HA�k(�����ߚZ����WAƩ:1���懝���(�I�Eժ����)����豢N�@�aF�~F]�l,��(��5��.v�	ۄj#;�s.�HA����>��hF����Y����E�YE�!�tRh@)ƴ�Z�O���KKk�:V��ֱ�|P�Υ�FP�`�,7�Z�2|�Q�DS)䟦�f��j��9��
JU����r�i5Xn�,�a�C������pXI"�
o4Kg�`��*����ӏ@�Y{�)]�cw2�X������2W��{5�ƃ���2���[ny�݀ء�!v�n��L�w��)4��J���z�JA�h_�&T��΁���M�+m���ā� c�)�W���2�O>!��nG�!���B���PV������L��P]
}*Jn4<RzU�dB�¿�3p�|d��g�O�&ɒ��iy����_8/2\���!�iX�g�!�=�l�3f�
U��b(��Ƹ�3����pT�dr�Jd�B�u�u<z��U��~�*'��z���] �2C���d��h�4�'c�����:���FC��R���bFa�z1�Z�4J��UYs�A�T�K�xG��;�G��g��N�4�+b6�g*+HYTV���حP����V{&��	0�yaO��pX���,��*Fk���E�!k������_|�S�8'���v����
G�QyԭP ε(�lY1��aM#�|��͈o{X0a�";�L_Օf�ph
��}����d=�	s����a��r���]~�-o�d��ϛ#�yQ��kA��`a˓]�M���I[u��"�U��g�� �(7Or��**��	J��nJY!�2Y�;6��}�Yd���H��[l�e� k�4�D��[�	�k�گ�̊n;,tX�ʌ$�SZ��z$�H(�D���H'7�Z����
VT{-N3+��v��ZiH������� P�����A���Q�e\#Ъ�N�j�(}�ʮH���ztOr�!��epɨS���t]�I�)ƺ&ZH�6G�Ϩ�F1���~(�C�HgV�Өg
�B��u��b��K)�2��A�p��q==�<����jڴm<�>&i�A�����#�HЭ�'`��ж�ib<M%��0��qF"6E�i3�f�b
6kO����f�QF�MY��s�1W'���HκO��Q�*�-V�\c��i���(A2;��q��ê����������39��$H��8U�!���w�Q�(,PX��!${d�[��|IH��E[2y�QE�¨f�?!���-�l�6W9ܲUh�v�14�LF@Nn�\�J\�e�l�[�v���h���'16���T�)(�2ii�A���h�C�O7P)h�|qe�#^C׈Q��7�\�.����N򉧠��58��220ƨM��᠇���E�\�,�}S�7ę�EAS,�x-��QT��m_!
*QP&A���,(���8�Ј�a��s2�џL�$����.	�L6;RN!����	�6b�.X�x�C�к���p�$ =�����<�@(�@)��F���B,�QTr�gRF�E�Ԧ�B5� �V|
SuM�(����QY�S�#��Ҷ�ykS=d9n��Jj�A6!�x,������PH��e�	JB�h���u�
B��O�<+�Fuu����K#r�|`PQ±:�i B�(�t�LiV)�M�
\7����-�`�E�Z�	Ts��lT�@��V�c��&��e�b/�))��Y��=[+��AK�&�$I<)dA���9��E�4Um�Z��Ȱ&��!8LM_&���!7��Q��g;Y#��xʃPe%,00_�&��`ur[4�Pkϣ<XNQ2��#�0ෆ}~R���yӰ9�++H4
|���&��	@��;[�.��i_���n1<,DF���9g�����^��`�Z2`6�:V���c�|��d�$Y��d�s��"-�/O`g6
(��Q���BL�hnB���dh-���Rka�$8���퍫��&&^h%��0��t�{4��s`�E1n�(!WOX�$p�|0�%2�ʎ)r�2y����k
ڀNpYF	:�����

֞f0`܎����H�G,��N�1r���H�tr:�����O[�v�<<�IB�]�陨�/�a�����r(Ap�#����V��a��+w(�x�ГH�q���̉ĺ,F*��q;��hM�)��5�/`��5N�zf/�٘�4qyT6�a����ҙN���l)*�a�(��B�3��Y7�l��䌑����H!��x��O�)���탶-ϗj'џ>�3����E'��h�iK�-4;�8��8�$8�bp#ќ�m�d��R�I�����<%6OQ����u�U
����:2��ۙD�U_��1�����nÈ@XB��b���3;��'nq�
�*Z@8�N�����/Q�~��O�R4j��G���L\K��c��\����٨ʇ�g؉�iU�6f<���ViUo�*`T�U�� Rp\'w"K(�W�=����h��U��e�&�]T��F��7Z����i�՜��ǃ��:=��G��j��!���P��)8
ʮ���-�E��d�0,�p��+�yвp�X<xg7Y\�hOқ�d��z�0'I��drA7+��]a;�N��P�Y�"41�"�������%�
l����ǔ�xG�֛&F*@�6�g�I�R�';S ʚ�h�n�2�r-j�0��8
j�b3��	�ee�)����N��?�Y5V��G��6uRγ?I���6\��5Z� 8�juQ��Ck�����-O�	�u�6F�Lj��m�ϳH�A�6��6
��Kצ�WR5Cr3�.U��`�,qI&d��d��E4�M��I��	��H=��E��B�˺�Y�Ik����1�^^��ʚB�a��@���$�6��!'�K����d
��*��ҷf��p�J�4�e:Y&�ݶ0�����g&�z��e��[=��F���x8,]�=�^�)�<~� =������Z�#��<_��!؉R�W� 8NN�t�#��M��zi�*[�bZ�M�L%����'A�U��ŴU�lg���Yר2%���ZH��d�{�rs�1�3��U�hR�6���x/r�����#���PL��7�T"�$-�R{���H8��dJ9Y
����]'6�lX8���JO�n��B���zن�<�r�3�'ha;~��RfOn��y4�cU{�x?@�h����L7��aw�C;I���Qf�L�c+�g�T�E�Q>cR]�#���V]L[��wă�r���`U�3��}�q#���x��PK*2�51�s���v�8�^�����􏂈�̈́L
=�0?$Џ������Ӽw"��������1��1K!FҮ.4��j��k"a2��:Ub�q*�jΔ̮��-�,�����-���ы��Q'uK�ǫ592��0)�Wx�y�u�l���5�w���]<o;
���2�~v����lȪ��!�J�8-<��n^P���̘<��2��V�3�!EBp�f�O%U0�0���sp&ݖ}�(���h.	Z4$�k4�B�r?�;K�}l�w	��N�5���L�ø���iA�
�DT]Cs�?����r�59ă9��YF�r��j��aX�y* bS�ޙ���0s8�	ef_^���3�f:����������'I�'@q��o}9E��ۿ]\�:�PK/WUW�V\?>�"pip/_vendor/chardet/euckrprober.py�T]o�J}�W��H��^]��Q�R�d��<��ê�]��N�{�����~��9gf��N�y����~4��(L��dz��^�m6���2ͬ�H-�&g��J�M*%��n(���8�����w����ؒ)�_�@����Ďa*�J�Lxi��_�3v��47�`�,�9��=㯩�
\����Zq�z�߿���.EJQb%��>q~�$6�[����-����_i.��ʒ�	z���}��(����A��2�3�Fa�T��2��r.݁Bx:c,��eQS�s���lKw��~��1;TJ��٢�y�V2x,3֎I8��۞��B�c!44�߫{K,����:X�m�w�vd쐱�>ԏi����kR��=!�%8w���{�-����g���*�E�:`@,}->ϖ����%J�h�x�E,���;0�r�$�ѕ��(�A"�ƣ�c�~8ZLiJ�YBͣd1���(��2���A�(e>Iļ$��(K%s�B*wh��u(P�O�1g,�Q$�Dv�_�P���Y�[�i�;�l%v��t�r�oK�u;�oABUA
�P�*cl���:���y���\����-SX^�h0���#�l4
kJ�f[a_",^�`?$w�9"܉��Fqxz�<֭�Vj>!�'
��s���̱�Y����I���מcxS��q����U:YMfw�q��Ȕp�`>�Z��p.p-��VGg�j9VE��?��h>���*��V���>��86�BQ.���ğ���A�o����b����"z��O��������+-J>��s{�}e5]!�Cr��zS���X�ℾj�PK/WUW��a�91� pip/_vendor/chardet/euctwfreq.py���%ŕ��s[B��%�3>2#ž	c�F��)@-�T��uQE�*������Y���Ҍ%�O�;##b�Z�z�G���?���O��G��>��>���۟>��q�O�}���o_|�p����o�/������ۇ����_^���/�����O/�y������/�ܾ�׼���G/�<�o����/^���t{����?����7��y���u��W/_�>�����>{����<=<�����_���Ӻ׏�̡�s�����1���?����{/^ܞ�k_ߞ=�~x��÷��W/�<=~�Ӝ�o^�����/ϟ���㋿==�p��m>�ۛW��~y�1��T/�~z���Z��n�_}���`�����7�_ޞ�}|���B��=���_=�������~Y����9���o�~x���?������~x��4g��O_�x�f~���o^�~�=}�q}���_W�� �ǃ�>|5o����8��������-���hq�wns���z���?�/�v>�/�s7��7��K��L��=���ϵ���Ή�<��������y�y��_?��_>���{������={��'_����ڹ��s����?N��6g���_����g���{��㏾��z�?��>�����n��>{�������=�}���>���wo�����G�|_���-x5W�ۇ7�_�v���z>�oo�?�����o�Dݞ�#��/�_{���˿1��_���n/_�y���㔝)}�aw�]~��w����;�3͋����s>�_���y�_�z����O�^�Y����#�t�.�#�n_~>?��w��?�?*��ߚ7������u"������L�|���O��%�=�������ϯ��mI�/�/�?�����
h��O��?�W�Zs����7�/��7o~���?�����������x��_c��o���ߎwk�W��������3�Q�~��\�>J��G���hg/l�G�><��y��z�gk�o���ߤ�ů���S~��l>������4���Y���o��x7�'���|�{��:��/K��3���z9���7���7�߾���2�г??{�-��/���G��W���/�}�/����O�z��?�p�e|���OK榼���O((61n�ޟ>���?�_��/�Z_��7��]\3�峯����}�?���ٟ?x6���[S���;�ԏc�<��9�s�Z�x�wn�[����_ZI���E��\i]:7t~ЏymZ��V���wie^R�/�y�)�>�Z�?R�H��c
�S�����9�-���;�z�/\������uuY���5����s���z�s<��5�Z�]w<�/5'�_׃0B������\�Hm=s�_n�#����Pץ���/̫ʹֶL%W�j��p���k-֕��U�m�m^��d��Z����C�Mi��`iק)�x>����aΑ];�M�c��ntu/��x�x=p�!�em��H�}q�_k� �эu�u������Z)�i���~�U�W���Hȼ�eV���	�,��c'֞��sT�u-�� $###l
s�W�A��uKV斏%��t�S[;�|"�?�u��Z�)�k��Z��}6i���'$�V��k��}͝��s���޹杧�[�����5�������5�smN.k�y(�k-������{k�sc����Z˴$|��X�=+�[�V��:)k�SKlCN�t�q�թp��k]詩>5b��N�y!��O�ӌ��-@`��#Q���g�Y��fO�^����j��6Q_�����#t���ï�M�E�שH�'�1��ݐ	�rm���Y���(~w�Z�y��p�����/4��N�{.�r^;��^�t,�R�'�8���]q��F.'һV��'�9dv\�'�>�q2ǍC�N�!O�ȯى�]��ZC
t�z���������1�ӱĬ�X�g�pcU�#8��voNv��a,��\�8�K@C���L��@����IW��Lh}:��9V��C}u"3�Q�7���̜ۄ�E�k��o�Σ.=U0�	37�R_h��v�����ľ_���$�M��n1�x=�:7s��r�4(/n�΢r�l��1ʕٶc�+4nVa� ���bҨ�	���[�N�Z3_C�%tS���Rs u1�[q<0j�ʭ����I�c���b�T�:ج1qY�9��o=�Q�+jb鏄��;G����y��K-VNa�f.I<B�����n :<�:��d`̀)��Ɍ0b,�ߖ��(7>P��kc������l%� �S�GYa;ۺ�u�f.,�(M��h=k*0���1>j�`��.K~ei'.c�s{<o(tLө�Xڤ��1��mWv�:�	�\f�!�ō^���9 �GA��g�Z���p5��6��Iؠ���Lk�)�*�8bt��s���]hK�r��ߏ8$)��tNF���y ��&��4�>�qQc��F������
K����|�0��~^K�$���3.�j�v�`9rRsR�Z��{�n�߲ѝ���S���v�������Ł������C��
�͞��_�^�O�S^��*)��N|[���@��֭Ur`��A@l@V�x����B'w߉�>D�d+JPDr�TFc����W��ລ��)\�n�84
�P*�E��5�]9�����ϧ����m�|�B�U�S1���$�6���c�ca:����Xh��\!n9^�O%���*l�	�ku�������%4��ؤ��s�避��Lp���1��M��Z�1����mo��__W�MH/�|OW8�`цwa��`�>�t)Rѻq�>�-��`/_�fp��N�<6Vs�tT��8�K�n���K	
rV<�(��*}n�Z��i�P�
�C�~�0��=x��C���^�@}�-��aɫҳ$|��^�՚9����O��7��=Pߎ��$ж�u�e@&38Y2NQ.�1�MH�˂�2!, k[¸��%ap�)���1d�r'i��zi��'so̚��IÓ��lZT�(p�
�N���[T`]^795c,j�Vv��'d�|���?��iH����?g5/�+�%��u�;aqRF�`X��&�Op\��QM�R�Ò������F�N�BX�p�my�l��Cl�>?.va��,�`���>��ؗ�C�LU�!G���$�Q�V0�zPH�����5ٮ?�U�eL�����`��4�"�J�T����\Bx$���;b����v��^�R��h�����mr	��%��9K4�z^�΋�@�5UPM��C9&� �W�}p��Y��S�a�O���8^�^M���X--
�8������n��}��Z'��V�����sK�:�����kԺ-��s�@/ہ��N�7V	C��-��M@��ӊ�ѽ����s
�-Ů�/2TC�X���C{���geח�K��
���:��7B��c��'8��ss.,aYT#�*��z��9T������X� {��d�@�s� .��L�YqU�G�Ý���2��%+e�,��qX���w䶇L_�6�UA��)Q�(Hd�)�0�I�CuE��&�"]]|���
l���V�Ǩ��ud8'�$�:�1�
���;WZ�#��Q^jĂ����~ƒ�o�����_%�`ϯ!���n�~mL�����UP��;2����!��P����x.��㽗�wA�bJ�
��{pp��@�1�'�"���‰�}Q:�]�A�c����|b
�6�-��
.!>�w ��V��l�P�`���$��+L>�equ:EE���"�X���C-�a���Z�3��9B�-!�O��E8%SY6� a@����-pa3PR��X��8�p�����C��Vx,3å�2y��խo����d�:�u�)x�HB�D(�@(�;c5~��	r�\��~�Jw	�!���w�s��֌�[R�c3$�
�q-`V��I�
��c��M�m�"��S��,:]�b]Գ��w�<�HE�0�`��D�p'�������g$p�S�c��I�iD�rb�<*j��ur‡�i`�dT�*��Ѐ@��	��AU���O�����
���@��W#��&��O}���ܾAt8O�^�G�����q�ئ9ka����^X�s�v��fZ�zF
�X囆'T�BԦaX��G�q�ۯ�!�2�F��ܤ�������z9C��̹iX�MWe�"�piuUQx'��Z���G����cEXB<'��	�\��֡�2m�t�=�D0���`���(�b�Jq �b�����bZK&� �g5Y���>�=��3D���[Hm"��:!���)�O�����JK�a�	s�N5��0l�&9�^�	Z
�
ג	R���B�T�6��
�3%�-��3�y4����\X�
zzn��k�ԅ�2�j���ڪ���S��P�Gv_њ�|��g�@�%���x�k�Bj5��ӐE� Ůz����E�h@]��jRvףǙ����d�]��L��"��g��o��5�p)�%�
�E�ٵ�7�
KYZ�#�f�
t9s��ʄ���M%��c���$�&�!6��}�ږ�uꫲ��ȆMc���e��h2��TH���;l�)Dv����է��Bw?a�\�S�3�;=�R�(��R�*n�"�C�^H/6ϼ�%�8~�I��#d���@4�,���g �%³�ԬKH�h��jIx��)NZ|�އ{;b�R٦��s��ئ�|~���%PMó�)y�ÒɹZ{�7�ׁ�5Z@�(ܻ*FG��Fd�.6%s��bP}c�w��E�ש�ľ�O���C(<ªh������
٘?�ȦC�gClX<"���Q�����
���^TH�r�����?Q�n���Dx��N�
�]K�.�ۥf�!"�v�n�[o�!��{�3�:T\�uU7��$����B3��Fi!9�b��r@���T5���Y���i	˰FGD[�qv$�M��+����Ÿ�L!{�]��+ ��R�8�P2N���`WtN�����5�$k�����)N�sC�j��i��è0. Y)/�T�,�+�R"5.v�ҽQ�Ko�ʁ9y	X�˶jsd�����e%3d�䑒��z`ܺS�V�J�C�E1��I�� �B��&-z���^�A`�3��˛V���1V�Nk�l���;#~��\ƚgY4��89���ȒX�6v	���.�t�M,��sS�1��v�h.�	7���3�9v��0��)b�~���a�*%q$��8d�����+D��Z�l�n��/�\�h�&9���-�q�gn)8���1�PS�2Ԏ8�8J�!d�WX��n-vE���ng3Ԑ�K�44q��9�,�CI�]gW�my�,����eCӗq)���,osl�S��4����j#m��a��\���	�U5ėdYa� 2�Aj�[ݸ�]n/n��~�-�w:$]�<j��<W��HiP�Ō�3�)mܘ%����̃�D�NR꨸�l�yB� X���0X�k���1{ `�ӑ�/���b
?�l�լl�~@
���H��^�M2��u#D�� ���j�r/��sj�sol�y,5wm�xn�h��n����T\{0�y��hn�n�֎���oxɌ�����8#��.IIA�!�,�_��M3�n�y?و+�)��	p��u’e��ܜ��,H��F����X���	�dCU1�A�:�����֞��2vK3 26����[@S"M�'`�{Z$3��3tLYY�@8��"Ĉ7�1��8X���r;m�V'�@i4�a+��)�dJ98�o~G����=R�ǞuP9��!<�L3��[w�W"�4-0Xְ8tk��g�rM�΄�ؠ�Hn0����p��E&������r�O|�X�8M�Ƒ��d�:���R�W��;(p���

�~3�82g�h�%����'�&5SD��qT
�p�bD
k3���
�?ȏ����B��4r>0�و!ʂ�ʊ��dj�W���M9�]ω���|����� B�X�i^׶��,t(�4�|�s��WdԠ���D���{�
/���e�H3���c>-d����g��pBr��}�h੒[V�4~��>@�B\q����3V e]����t���u�
�c��9�xSI������^W2L7�p�������ɣj�+!�%x�gG����!���dMV�c��O>8�K��#�Cyb���ܑ%zpx6���y;u3t��d�@/[�G��Jf8<�ISxNM�!��i�	ߥ&�<�y6�TYhV���%��=J�4�eu$�a�Å$슓f�b�8��$���W�6�N����E�s�ē��u����|3�B��K+j+	!��|d�A����/�͔��L�s!��z���X�|�$�0ԣ�:i��GEf`�н�|��^��Y�%�'�+2����U��^�Ȧ~'�$��Q�?�=�ڵm��Ò����d��I�@24{�ZQi$75BD�Z�2ЮH�2�r�-��'v�4˦�;����!5�4����L�+S
�v�g#ig�Gz3���NJ��d"�!.�0���n0��S2j%��X�v������Bg��]8	�!5�_�L��:�j��)���Ey���~v�5�6���_��~���.Y��]�R	
'r�P���i5��
`FHLK��p³�`n�$c��.[��i�׃�	A=&Ph�%#�Mia��2D�/R(+*o��~9�է����`�HW�ײ���uLB+$����;me(7�	ߊ-��v���΂ �̡"dw�U���j<w��DQ�^%!�fE"L����f��lI�aՋiXM��ڠ�қ�%��
P�Tj���	�m���r��,(�\#���e,eD",S'L[�m΄��jX҂���$��Fy��n�^\ߙ�P�]=���b3K�e���� ��X�@�B�7�^אܧd.#j��]ՒȦ-C�G�|豨�@�(�\�2;83�JDu�T�#�;����-�4��铺EZUكh�k��3r��FI�p�o0N�nI��4�®�qJ��^"ߌK�%Q����J�D!vV`E�^�8�=K�e㩇�i�c=�sb䦑q=҅�9����[9�)���B,�li�6wT`q���a7��l�c�;��v�0paS��P�M��`n�N&z7���7Vu�A�.r�b�,�pH�I��N	B.�5<E���o��l\�ʖ�]�LjE���s=�Q�A".��$bM�8$�eA�~�[f���ܕ.�tv�+պo4�-&i���&�r�N3d4$�����B��{���s��ӕû� ��j����.���vuݷp��{���GK�04L@�2��Hiu:#�!F2 ͜��l�$$�^�"Ɓ!kF)MС����c����'���f��Ze�c䝷(	=�w����-1�o�b�{Q�ӈb��8�yMU�9��{�?V�Z�H'M#u��ifX?�XЄJ,�[T�Ч&A��`�~�$�]�/s]�8+̂Hsm��:���dȺCB�#����~�@i���l�#�g-u��D&��01�2����j�&T�Q�NvF=�T�*�s5N�9'�q��K�U!�
�e�RU�rؕ/���@:$���Л$}�k@��	~]�g_Yj��J�<����ื�Z }+-�d�:�c����3RZt�Y>�LDC˹��~I0�s�D#�8
n-yҧU����Z4�``�,�ّ�sW���cuj�7&�h圲[H��
5�d��#�{������Kڂ��_R7Z�B$I%댳 \�ÞA��`�ufY݁C���E05E�	e����γj�Zׇ}2�
*³fq�.���dW��z��殠���6���#�¬B�,��bm8�9
;�]K�f7}Hs:H
kfG �m����`��D
KT�ᗓ��Ѯ�I�"S���3BT������ʌ�Lj�h��03�猬��^��X�f!~���Q$a�Vu�(�H������N*9���A
���51��Q3i�qL�<
5e����@v�x �i��@G���]��:Ajf#������@D	���pjfQPRP,@�Io9+Y˖��"�{�%�1�`/Sjկ�1xDI˰�r؈��s��T
j�%��[iW��Q6]QG�p�U�KL�43Ua9ْ�+c.-��=
�|���~8�x����b�� �A�
&�8kh�]�]��� ��h�C�8K�Y���D3��Z���&x�sW�d��J�!�*`�ĒjoI�(v��rGEŠm�?waL�>8��fO�Ч�N�4t�3)s�ٌ��7�W��w��,��2�F:<"�1+�&��"������p�9��^��q�O����fY��6�qH�����(J��I4��ݼ��U1�2�ޚ>	�����ز��O�3D�)48=�-`�Q箌i�SQ�|5�x�pR`�<[կo�%����C��7���.�I8Y*�Ȯ���T�j���k��R�ͿB��~�#�9"n}�ZM���?�xa-��,jN����V�6�ל�u�{i�W�	K3k~��|�oL0pK�r")A��@.)�	k����y/��ʐ`i�o%Q�d�=˵� +��O�&VANG-B �.�)t�i���a��[��b!tcM�͢�Z��)Y'��
�2�=s�J�i�l�F:Q�}�Ll�q�D�Xm�Rm����V�l��i+G�*$�(�=ֺ[��0S�(EU.�-Ӏ��n\��[=�+d�79c��2
��qE�*+zl�$ mS���BA�J�*/�L��P�U�&�t��
W�<b��L�]+uw���^���e
b�(��I�/�l&��jՄ���
��6��z��:&�
��	H"�Ԕ����s{zď���������FA�>��m���X��	��C�_�+p�d�Z�!]��6+zq����Ӯ/��.|D�U�)e��+���e.g�/�� ���m5v�L�^�rT�i�w��)�<�CQs�-�
5:�[�f�a��8w�L!'ԒM��ZK��[�A!U%�[�d�:�]!o|l�nW�d�u>b�\�9���mfJ�Z���Y4H˝pBM��ĭs�[� `����4��ʔ@z��k)�f_Z��O����53	?m>�?q1��n�J�V�}��IQ�����	�6�h&ã�C�OZ_�	�P�ǒ}�HSoM�a��1R�C�|D��ڵ3��,�І��Ha����m&#��K#tQ:��JBw�I�b���ڥ3�Z�`|����m�2�����V��?l���le݃B��:�Al�&D��́D�.�aG��2���[��@k��c�Z^���߀/FHL	��`��Q��a�G�[wB>q�<�0L׽vF��|p(��.�-�(H,dߢ�3��Óx��[Sd�]�=�1�`��8
���E���V;�?n�M�DY4_�:(���]9�I˗��p���w�j�6xҬ�o�C3�<�p�vQ�kgdS�������ZfM)6%�%�I��l,ێ�X�]>S(���ǩ̑F�#6��=���C)5i�0E��,�5��iDZe��(@rh��"-�R��u����	v�Cc�'2�c�k���8P���c��C�)c�ة����3b
+����rڢ9ʵ�g
i��d�L3ѩ
I�\���W������f�j����C��s/�t;U��kҟ���Q�C�h�BQ���`bH���/]��&�c����+���JxXo�=+Вb��:�Pyb)ts��|���n��tg���i�$��+��⻓wC�F�|%���Uf�\��&��� �U)y	�۪�F�#D���\��L>{���D�˵�i�
�YH�xpGb��0h�wx_�Hs�w���+��{���Z��Of:Z\����
�
�k��%u�|&"�ņ��A���4����"��bK2��8�`϶6�E������B7=�hW���XY�A�j�0ř�����m)��=,/[*G�/�k�јZw���!�;��5��ٚI*�!J3��'u��3�(7�v)M��4)ߪp��h{_m��2}y�J�
K�=w$�(��k�v1M�l�د�I�ح����b���H��m����lT
�*e@%��K"�ƀH8iMtg�|����3sy�`�"�=z�+�{��Ճv����aEhg �2%�U��]�Q�m�hD(��u�]N���Cn�w�H\"�'$v�,�jvl�9����`h<�_l��Kj��i�۰L�����L�o���W�
��5���}����q횚Fȥ�2�~\nʲt3MA^0B��5�z!:�=���u�ꯘ���І���Ĉ������FO���IYi-��p*G��]S�<Ж�J��s]
te�S	��N��w��(!�&E����7���Q����Y>H�?�K`��Q�@���0�L[+��	�]SS��e1��?f��E�m����"i���aݛ��j�H�;�[�q����)e�q�(n�pF�`�\a�0@�G�{�]Us���k	c��/�"��٪I�e2�}F!����}2Ľ�ր�,���_�8��G���5�d��e"���V��M�vޜ&�7X�f1��5`��Ͽ�ȵ���fkz�Q���@E��&�ә��Ě�dP��9�Dm!'��`b����a���v]��Î�"����IQ��Ç�ha>
R�>A؍vIM��֫��+<ˮ-��*�� �Ð%�F��b��x�Bw����&�1g��Xr	ZZ!Vp��x�݆�"���5�S|�pK�uϐ\���6�|@k��	+7�t-�p~�h{s
5��G[��7�8_f�[��������~��
�ȓ&���}vl|p�y����<���2��4�r5Sq��#�am�dmG�%�7uK�X�lZl5�3�����!v�~�vg[�=e�
pcm5v��
�vyMU�s����Qh<�=b��3L�2=Ѐ<��RI.@�A�^��&�I'Rg�om� �f�
�p�'����ɲ�S	g}#ᬲ�Y^��&-وjrfj�eF�d�K
m�t��
lVE��S�y��MԮ��TN�.ܣg��Q4+14|��Jcd�c);��F���أ�tI3eȌJ`�d�þ�&���5g�9"+���;<�v��uf���n4�����$�Guvh_3�#R�H6-پ�G��k�۠X��Lj�5"O@�,�cն^�����H�
�X.�D����p74�F�OMM�0�<�ٹ�GR��l-Ʊ[h��fqv�Ma��:��D:,L�]C�(�2:LBU"C
���@x�BI�Kn��قZՉ%y�V���1���gA�����ATͳ��jw��U��Dl'��[^���k�&X����X� ਛ�ە7�G�'����԰���&�~�5�|�	��&#���xFC��V� _�no���^;���A��v����8�dt��X�qO��|�4@�v���K�:l�Q��sj2���AT�����ļ��d%�t�5&Η���넧U�8}�]��6;������~�!�qY"r�Y��8�_����˅e�Ԧ8�d��6��l<�=ή�6W���E��������|��x��K������Q�q튛�v8m
d?Vö�Q��_�A�v�^�)�L���|���5K[M!h_8�_Y�B���uQ�2�.�m�W�$h��&۝�۔���y���5�LJ���������ݫo��S�`oşk�捞b
V�ԕJ1d��1v$�t�K��X�b���� Y+d�S=LQ1Ҁ��u) ��b��@It��/8�`�
�(�b�h���`� 5m��vz�J��lm�d�������8�8�
�مݪE�r��¶p��]���6j$�İCUD�>yg۳!V���|���Z�8̈́[uM,חhO�a��|D�k�r���DBC�Hd�W�tQ��.X����7��U��f3x
��F��i����p�M�̊��@B��a��q0����EZ��M��yN�8�@X��Jܧ��A5�2E�Cq��!��ȠJ�n����V�Q0${��(�Iץy�Z�wC<.lʚ��E�fe	�C����/l�']�Ѳ>q
\��D��J:��
1�f��$�EGDo�x&�G�c�9�7Y��m����2M'��to�E}���=	F�+i����DE3�v��o��1r�o�����Ն"��}E:�q��9�}����U֧�]�����ݢX�ú�*�����#��E�h_���m�T�(�>�>���k@����ܜ�̓P�I���<*0����59���F�:�,�5a��^{����¡l�%Y��W�ֈ��|�鎆�K�6���@��h��f�3�?�]c��aZH�����59��n2�
������p"�)�Y�+:���)�C��_�C�v@#n�\
����h|�����{��-
�����+[%�ʜ*UL1}�Ç9��2�ˤ�ȗzıþ[��;#;��6���`��5%ƙi�Q�O&�@��5!��WU�}��.��x:+B���^�e6j�:_�r�_�H�R�~!��³i��B���cI��:x�jKK.�w=CUz��b`E�=&4D�g����5'�
�M������۶� �;���|!t�-�k�v�]�S�c�
�4@+}�NAf7��lT'�B��aLc��"��,�.��vW�u�IM��yc],Xr�AtE�n�W7
���0�vu�T�e�ƨ�JV#~�NV{�?�I��r� j�C��p�z�6tq4������ ;��0�^0�����3;�f{��`��6����*�!42~��Xs�|����iF�
�G��+u��3��hH��~�Y��
�9��Wqg����f��v�N��4ֺ��hY���	^�5�+c1��dW���m�T�H��Lc�}�d	6��6u�
O�y;,b�h��H�i;���w�i[@�U�0�8P:�4��G�VZF	Yd�-�`��Ķ+u��e�H�"��/%�K���L�$=)x~�z����Q��v�N��b����Q%_)�;kI(2�Z�~��iI�]ޗ� ^b:dڋ�Ku�Gj��t�ݫ*�ΧgF�a]!�q�	^��7t��b`�K�r���uR@���b�A�#�����v�
�0ұ�`+A��L0!m��t%�I'�Q�p2z�h��kn�EV�aqI��ɾ�Ԫ�V��v�e3W(^
W�jaT�����Hݗ������]V�H�q�fv��b�(�t����J���[H�8��!
J��z=���ĝ��v�N�u����g��t���/Y f��D����}a���G���+�]����	��F�8i������c�eA0}�\N4ǥF�(���w�!��4�Ym�i����1_��;3B�9�z��g}�.���L�����_6�9`I���q%>�HO�\���p���{Ne˄1�JJ�z��T^Uj�!|�B��ŧ
_�f�#^a�G�����ˁߧ�s�<a�glk��ɠ�
[�O�m`,[���o�~�G+Bl��q��O�bp��ܧ�Q�]9�	G��M���je��2M����vI���%r��X����)�S���TͶ+ٖc����2<�a5���u��
�l�b�OiBq��k��j�t_�e���0H2�؂���	��1'�B>c���塹���@Z�ɭ�C!�՜bv�^?���|��g?�ՙS=m��n�qꖈ�1�� ��"z���4��L&B�Kd+�f�a�X�����t�*��y"m�©~���o���d�jvv7�5��"[�jY��G���4v_`gԃ�����#|�[�$���{Os(ֆ�x��m��nH�+�6
��y#C�) �R�Ѹ�����V�K���=$իK�&����'�ڋ�w�6}�滈'�cw�>�bJ�9�DO7��UL�c��C�^�Ѱ��2���Y ��>>7=O��
�}=�'Q�.�¢7����kL}�+��I���D��)�V��3Zo8����L��ն+y�<�T��-7��PHO0/88���\U_������*��t��)��
wX�X�A��(R��s���i=d4�<�A��:Q4.v��<��C'�9[j}�by���׫�]i�thٽ�xd�%�#��w�Iā@'���/V�s��j\#��C��e@�ƍ� ��9�ׅ�]�QU��g󸋋��}59K�=���;�H-5�.'GӸrOi��B��n��-\��}a��C��?P��{�FO&A��]��MH�a�S� G�^���d��Z1B}OΙm��Ө{�6��
�Fԙ�n�.�c�5�7�	H�a���Xti���ڃ�~��۷�~x�۫�o�PK/WUWL��?�"pip/_vendor/chardet/euctwprober.py�T�n�F}�W�
8n�E�n�-*+v֨o�dy2�ev4čh��g|��⠭�$��<��n_h8z��i:�G�tD��"��މm�ڔ�Vn��bS0IG��*�}c����o�C'Zz��~ae�lɔ�p ~���b�0UU�e.�4����=|�����eṠMs`�9���k� ��S'������Aq5�O�R��XG	;�/\;���Vnjol�u���h&�ZJ����[B����e�wF���4Jn��MP����L�_Q�=5��\h�\Hw����.~1���l����	U{��;k�8_є*�G�l�Ͳ�(�<�9k�$���.J�C!��Խ'���/l,�?8g;1��X���4��E�
)L���\:-H�����h�kD��qY�KO���b�Q4��(I�y�|�X(
/�wd��^I�++�oP8f�$�D4�L'�s�~<��4��"���Q�M��4Jh�J��t�'J��1���&q	��@ɂ���[�x
T��c�9Kl	�"���P�=��E�{�%i�{�j%v��t�r�oK��{��ABQA
�X��+cl���:����0��~��RX�{h4��G��j��T��w¾-DX60�E�U�==|�p'�q���[�n��wR�<i�̎��ڄd��ޚ
�>��j���Û�_��s�wE���z�xM[�V��sG�ֹΆs�k��(i��8:�uDZ*�t�'͍�?<���t�oq݋�S�k��J���K����k�
>�/���-.���`�:�V߼�v�w�Eŗ�@{iϲ�����͞n�cRBok��7�L�W�oZ�PK/WUW0��$q'�P!pip/_vendor/chardet/gb2312freq.py���n^G���	���yا.��K��e{$
ύAKT�hIt�t�O?�Rj7Pn��2���bŊ��O~�����??��|����>{\��滯�w�/�����u����7�ޔ�n_^������y��*��}�뻛W�w�ś��w�E�����O��<���?]����/�w�Uy��g�o��_\�r��{s��>��r{�/yp���n���������{�������Y��ϫ^?�O�����<�߽����͛�k����뻿]��3������Ͽf����O�K)�����͛��ݼ-����<ܖ��?��}�a�Y�77?�]ݽg�^�]_���W��X��Z^\�+w�/o�������?����/o^��O��{��0�뻷�����P����H˟��]�e6������������}���ݿ�m��f �>�|}�ǻ�,�7��w���>)��m�xY�ן^=0���/�Y����n�}���]��f��ܼ󱯳��!�D��*?_�_�_���2Oȵ�_�<���~x^}�c��GO�>����̵Y�|���O�y�KL�eɬ��=���<~��?�G_>������O���ٳ�wOˣ�ϟ|��7����x��w�Qʳ��K�b��"����#��f%_^?\ݼ��S�1�{��yY^_��:��&U��"������7���|s�o��r󪼻}�,������aw���2F��˲�\t��_�d��o^��_�����,_��?p�_�ޥպ|^�RK��Y��_�W���&�|r�����k˲�?���k���{��ey������p��������?+����my��۾u�����WY��O~�|P�6>|p�Ԟ�2��>X�|�G������p���:>Z3��%.���վ�����?�_���8w���7��5��Ӿ�k%�}���O_z�K �w�z�3����Uͱݾ���?�Oo}���!q��zzq1w��?~��G��'Ϟ?}��ϟ|��OO������G_~�gO��c��o�����?坯>^O{����~������wO��i.��n{�,�8/����m\���c��k_��^�}��ƖK�3���֘��.{��Z[�ˋ<!lyB[�㲌=��su9ss�[���r9�m��gni�埱_��X�|~:�~���
.˱���eH�ܹf?.׭y_�t�[Ɵ7�X^���'�;�˚a_��e&c9//J\�'{>�ǞI-yi��-��Q�e�p.k��Y뒧�5��l#��2��a�2���Gfێ-�\�5�j�e>ζ�1�������fH{^ܷL�X�)ü�zeYF;X��',�޳�Knn�8WV��L�gN�gN}9s����3sȦ���˺y��s��3�u�Oee�yt;[ޙ��},
����1[�5{�d�+��w^d�k.�SGÀ������.o�c�^�w��1�R�^=?f:���:��k6vo�3rs�}M���,6XLF�y�X�{6/;�Sc!+��B�ˋ�d�1���c?�	L��3�[c�q�<���V:7��y5k��1���A�ܗ[��
,�@�;�k�o^u9��l0��e�	4��,R�*k��<F�ͣ뒝)۳axy3��>8f.�^ðY��R�͛b�ٔ�����zm'���x�e�g~�[�5�|��$�����6��p��6�'���Lesp��8�#��
�)��u+�ɳV�a���b����ag���_�o�vcS�XG,S��;��g
d���l�U\6�0o9��x@ƿ�R|�p>�RՕ�[x�~��y�ȢeS�|#T܅,P�ـ��^�&��u�!��qmC���uh�Q,;�'�[�Q�rޔ��F.,���K�3��Of4��
�-X��,���2�
��wF�^�bZ0��;�e�BfŊ|>@v�6�p[��QY]v���c���~����}��#��+H�	���X�F}9᮳L�ciy`<�`�{2�c*9x���wa_}4Ì[��������Ӫgv!�V	R�ۨ��x�2g��Hyje�7�4fa�q�pbi�y7�`��]7�ı��f�U7+�;�q��6�̏�'~�T�k�y�X�kל�T�g`x�D`���L��C�����>�`�kaSF����و^��9؏=;8�l;���lKV�g3�R���M`���&Dž:�޵���(��zlgp��+SquA��u�y}!��m;gn)�9V��e`:	m
l�7��V�!��-@�K�,攵ހ�Λ�G�d#�s�BE��n+��]���}��_1e6���$���9!/�UP_�v����C��7�p����K�Ɯ�+�D�j؜r3~�$�q�pb��z�Bg�@l�`��
�pD�3�]%=�p�}UBm�Me��<�!���(�c,e���,��
��bD�TL�"�h4$	xp=7��<dm����y��7��� \#_$�		�`��$�mz5&~�숅�!�r�3�g`@�O/��D
��8=�M�i��I�!�4�h��jY�1�J�FlL��ͨG�
�
��I@���a�}��%�x�mݼ��XV#��e���5�V�2���T0,N'�żD��A�br11�-�(̶�a���� c4�t
�qM<\�o�1o��F`�cF��.��:��y7vYJ�'�ͪl:�q�
:zh�vX!|�xB�X�ʼn�T˳� ��ō'tB+n[Y���Oc���K�v�$L����N��.:c��?�sn�߲���9e1���T���aֱKY�	�ޘ|�-�2�M�V>tQX�E���¼k����P�ʂd�@�,
�=h�A
T��kb��)+����
�ۃ;.x�`�.،�lJ1\�l�h҅,�E���}�0��^̚�}�f� $��ΰx*�܀�FBP�0\��]uO��I�Z�F�7��D;���f����Aa�H;��
>:�L(�O��n��X	R�ʼa����dhm�N;+ۮl��J�#P. D�"d��Q��x]�H\�Q�B�-\n��xY���l���朝!�cc�r����F����|��n�w���k$0q�*��Ҍ;�w��*���7���-e��.�3tt��t1Gg�ȟ0	�Y6�dF8`rA��!?�p��+?�Y�[��N8�4ȋ7�q��N�V��x��LU����l�ss�FB�ģ0Vv��Y�x0&T��+7����D"km�����&XB��Z�dܝ��'�$&��iI6p�_��7s��U�v�}6���[�pز���"�+ԁLK�w"4t��>��PW^��L��)Y�.�vSYZ�y�^�h�Q�|y�\�w��;�x ���ӣǬ������
k��v����td"0��"e�䒃\�M��>�r�
�re��V^L�WNC�cq�,��A��9h�k�(	�\�$����0w��'ƈ'6\Au�||#�!�8� �}�P�aYV����a�/J/G7�E�RρŐx�����6�Nx!>U(>��/��� ��|H���F>�;����J4&$�++�gH��q������G�n�V�Eֹ�a;���H�
IA�	7�"�L�?dU����@H�X��D������rҚkH4��f�V��.F$@t��2���JLD�*��&�0R!d��¼�P�=�����Zb
]�	��ċ�4s&+&���(l��"yX^v�˕#׃��(?;n�,Ţ%^>z��@#�qo2�E�G���I�XUp����M�J�04iF<e�
gZ�p0ۍX$�?�lz���th�h��ljL0 m����Ꞓ <@a�if53G�W�����E�9��\� �)֮պhs��CDQS^ܥ)�N�a�wֵM�"��]��T:b
Q�:q6��W�mxӱ�N��'�.%��
�G�4����oS�C�[�(W`�x���-&�1V�7�����rH�*(X��{@�8,H70��y�n3SC���Ȏ�#<t��G�~J�H���9tNl0ѩ���u{�=�4H�XA��P�F��fb���ߞ�<�M�����M
_��T�_���ͭĢa� 5Ь+�9�~�;*WFh������]�ou�g�a$St���T~��>�A����U������I��5�Vҩd�����I.$^�o$ҙ���6*e�F�P�Fo���P�h<�J�BA�"��Bʢ6͆����)�.ϯMvє�x*˦t�Z�K�žOW	gC�/@I��6��)�@(O$P�-Rp8};V�)��!y��^�qY�%gX*2SF(~�ZU���Q�����/F�}��ަlcY����r%��~#�k���}jA��ut�
�)�������{X�,M,��ODvh~������:Cf`c�����4tk�f�(tK��ա�e��%U$p'�7L����1Ն�f�
�3B*��p����c:z����aG���8Z
��w#����ď1�{��e0Nu.���1�A
����0߮j�HY�"�p�'U�YS�Si"��p=4w�ĂٔM�&=X	6�i�t80��{�6
lHU�0q��IV���AKU�����q��!��l��ߒނ��,�0J�&`gR���IeԀ�=�	����_�6JBc4;���j��!V(�/Nns�e)ڄ6Ah�Vm�b��0�2��>��#Pv8݀0wt�.ymvϨ�*8��6"DS��Mp�+�NH�O�@	s�j(��
��hO��T���5�%�"5�ŔV�s��%y�\5ئH��h��DB���o�(B��]��Ij�L�mS����#,$_V�q8�)�]���f>�;�^�+AڲjJ}&��f?TEV�FM��Jp#8���<�u��i�J!�b ����n�)c�IE׌C��
�ʈ��?�V���[�b�V+�l�`Y
y�j�W����V�gum?,���X��N�Sv�J��3�/�lS�8��6G�%,&d�c��P��]~8STnQ�C`
Ρ��_H�GyZ��eE��h�G_F!��&�T�h���i�G~���Bq�D��"g!��V|NI��e��4gb��S��kM���V%&�?�����Oc�fj*n��HH��Z1d�(�"v3�P8X-0u�V.�1��b��MԲ�UP����&��F���HOE���ϋ&X�O��R��(�&�*�y^�1ڊkTR���\裈c��P�f�c�Q�����4����9а,��
B�Il`DNy %L03�j�����v��U�wC�-x�~���R��S�r�@;�:`�Lkq�&ۘ���ɯ9��/���)
�3B�?���a�OtDvS�E����B$2~Zf��wɟ�xݡƈ���ջ�l{d�� ���G�뚑��(�`g!}3%���G���Z�n�84g�<˧�B�d(dI�~�ք`?��e�I�j���C�]s�^��Y��Vul���NI�C^�R
�@EH�\U�M��gx���X6�2�Y��]&���h�[8����fR-D���aE�B�^�2��+gwZ�j���3����Ւ���M��A�2�Zm>B9�쬧X�ǡ��զp�f��٘%cw����lK ���gg3;�*rWr<�*X��%�1�����K�$�D�a;��/�\�d`�!�L���6��w*&���Ǒ�Z�;�����iˡ���)�f
T=8)�ɦ�*80J�I�4O�[�-�s!�ZmA�d�}�j���$�dW�2��Dq��!D�wS�g㈖�xv<��`�/�ߦ�!�u�m2t��M~�ګ�C�/�3�O9��GV���h�y)Y���P^��>��h7�,��10��B�����̍��	1�.7���AJ$�i�eU�q�>�<$qQ5��ѝh�t߭4T5�q[�g�N�V��n)|;�t��J��P���R)�m51A(�CO�]�y���5�i�l�A��n�J)�Z�+P)�5�ĕ~�a��
F��)��[>��~,j����E`��ެȘ�	��4?Tb�C�;ȟV�I4�m��;��n�g��R?�����1��̈ͤ��W�V{��M�C�go���V$a�4o7�1�P�ʪ���tmSϵ26�>6`��æ��]���Eq���M�#Y����6U��H6��
��.H5+���b��E��Q�E<!��c6!J\�&�0�z֌��1hC�R�qM��b"�8�G����;,�B@��dA�[ǔ��5�3/�iqL:����es�ai�4��,!����z�5�]�C��C%cp�>4#�i����ַ�I/�]�Z�=�
H&5��ͨe��Ȧ,AAO������Z�����t�u�z��?+��}2��m��%``x�m(�Oe�(j���U�h����-�**������a��~M�Br�.i���D�CuU�!��^l�3�b���4F"Pn��qA7�Q�Y�a��?u�g�5���M͝z6e�D�y��]jQ��)������z�P��f��ŀ��Bh�=pvH��HeUn�8�{2L+D�Y�j���H:��;����C�D¢͊�Lm�N�+����p�R�A>�U�a�;����|�+BA�н(oȶ����'qح}�pp?2�qZ���7;h���EY���l���X��z
[mmI��fX��$4ij�M�7��fQM
�"5'�H�a�e�cS�C9���Ť�8LN�N=�*�qph��M�F�e�De�;Tz�s<-K�rö[C�E{�YîE�wB�h�mQ�&����/}��ɪ�� ��[�9'�Rj�è_���}F��~�n�5�;ػͼ�
:�E����Z8m�bL[�5�hUCf2�H�b
Biї��b4�}�V�T�VmC�A����X(�,��������g��h�!3�=�!陇�Hd}E5�zoi����UQ	�G~XUT��@���
a�큸#ձ[�Z�A�2�4Ԕ%�Ͱ���u�P�yY����q{�\M��YtDL�P�'6
4�y�L�lXXf �b���.[-ͩY�,��ឿ�U�Ϯ��s.�.��/XR�����Q��� ##����Y�b��j0�vz��6lc;
���6�)��v�RC��.��\B�HhM�2t؂I�>mU�T�b�fA�Q��4��v2Q�rM�[��X��~ըvԧf��,V����s��̜��bbm�\�gBA	j�6{�
!mWk��jR.4��Ox?�J�5_47�j�i��mL��u�E9g���ΓaR]�'���_���p�6c��y5́���DB��A'{�Y�t��
�a�D���ʫ�,�VP��E���6v(�P�U�S2۾�|)B�	ɩt���,*l�&��@~(�3[#VK���hh��ƒ�������"�i3q���~1��A��C�����
��lSh�z���bl{��Ɉw�ݒq}�z�P��9�2�E!����ө��u+���
��j�qhl���[�n	ݺ��)�c���;��>�� ���넩�]�M� �5KT�c�p���B��-����E��;���2O$:�S��&�boʘ�5�H���c̰9���f9ɷ�-�
���=u
�Z1��

;xO�3[���p,��{��~�k\(���4�|��%�`�Da*�ap��Fp�I�N`�
J��d���.�?�:��^�Ep���a7�%I��V�xU��1�FTtx�<!"Q�S·��(P���4��#8�+?��$(q�F�S��{8N�ǦSO��]!�ӣ�_��#m��Wf�X�,3$��8e
�u�࠽���e= �61�C�Ey̴Ҥ^�{�ʶXs%�;D�nK�����?H�u����x�Awl�]AK#p!P�.�!�b�Z�㔬�i��:HI�hv�x����-�L�4eu���JW
,
��>Xʆ��B��n�CL+l�6ӑ������Ǵʋ�2b6�H�LP�����īC���Fmf�ŏЄ�VM`�mT5.j�~��#�fU�\�Ѩ�l���K����	�i!�2�"��g�O����)�pMҐ�}�l����f����E�
*d�L�&"[	
;,�s�47[ܱ"e!l���.��3��m	X_C"*�ž�\[l��vN'�	0�+�vwAc�+�V<�e�Un�T����t%��c
�j���[<��fi7�]zT|*%���l2��:-8L�6��H�q#��FO�D#H��c�����Qj�ͬdz�"�S��wZ�IyQ^��I��ڊb�X<�ȉBfaG����i�1�]�z����
8���gW�M��z'��b[�W
֪��(��SH�oG��F.^���ǩ.�]=	��4ѱ�|�:;�=VHܷ�����8eg{��f�KPi����܄f�g�Q�K�}YR���n)���r5Ek��?K��1�i]dž�FOms�G!<�aw�F���Ru�����$��Khͪ����<&�ۖBHΤ�)�<��G�Y�w�Gq�C �𼰯I"lZ�n�&��H�y�˲�8J�F=Q�"����i$������!�Ԩ��zL�6e2��n�CI�~a����]U�yf^�ؖ/�k��=8e�KY�=��X�� wLfeϒ� ������i?Z5C����4�n<;�<}e��k����fEv��=�nC<G�Y�;]�!��y�ž��yT�YN�R5F ����Y74) `��Y�$a��᡽I�=!@��TZ���ҵj�)��4���1��ϣ�6���?;�F��n8^c�J~�v)�*����:\UQ�1�z�2W@O�+OXϯ9 Y9�j����D��J#*᧧�<bB�z��6NT�L4�
4y�kCȪ���rx�^�
2V6O��"`�v�ӴR9�^lm���%=���Oe����"�,��6��}Az�b�f�fߟ�K	�N�����G�Q�n�Z�u�l,�TDE����7L��H��[�{>�*X�]��tJ��:�/�]��
C�&��]ezՃd@�!���̓���#�h>�/ѧ��,�+#��G���p�p�����6�����ʕ�U8Os�&_d۞>�l����m�p�h��jk ��Ѧ�`�Hj2;
��~����E4+�c6�?�冩RI��M)�,�*�����x�.�5`۹�a����Z����>sc���K�y=�"�̯�P��Ey0�$s1�ّ@��R��Ѱ�3�$_u%�Ҵ�c�UX���_O~�j=�i˶=���1�s�j��_(LVK�V_�g=�TJB#=!>{Yp�r[6�CR���6}���V�&�%��N�z�xP�s�	�Oƌa��z��b	l��Q�RZ���گ����q�\ħݎR�Y�\��ЃjX$�c'p�/��X��O�ϱ�"&�����8x�6��̓	���sXx�Uq�R�VRj�O̤)������6-V��
O-w�PrF�5/y�<8���ZBC���N
8T@�b��ZK���}DcO4�$�_���/<���Ӽ�t�z
~�z�xU��)5��Dc��.=�q��\�M3��D�R����xZ�<9�q�<v��xD�l�r�����*'uA
;塙��\��@9��A�C� ��Eτ5)�F�� ����0�I����K��݌
��K��1e�j���Ck#�N}�gUI����6.:[:O+�O� �"v0Z���k���~���8.�,�6���ݜ�����:�>��̖Ɯ�-Oe~��!���&��/ˁV+�!��v��G(v���S��ߕ�IJ0~��C�vv�y4hDU+�y�R��j�inNX�)�����M~��췴�?P5;줵�J��h?u{�0�ٳ��6��6b�Ff�7��7W�T�/>��/�zw�PK/WUW&��>�#pip/_vendor/chardet/gb2312prober.py�T�o�H~���
�N�^��)*�AU��b�a�.�]'r���������O��|��|3�f��C���(��($��i��ވm6���2M��H-�&g��J�]*%��n(���8����������ؒ)�_�@|��eb�0�e�e&�4�������f��e�9�u�g�9���kW#��S+nS�Ç?Aq1�K�R4�����>q~�$6�[����-�����h&��ʒ�	z�f��}��(����A��2�3�FawT��2��r.݁Bx:g,��eQS�s���lKw��!YҘ*��l�ͬZ+�<�k�$��m�J
C!���ս#���Ol,t�흲;d,���c��l���aO��E	Ν�$��v��B4��5�5S帨T�������rAQ�H_��<J�w����b~&Y�1��B���`2�ǟ�����h���� Mi8�SD�h���q4��r>���.Q�|�8�yI��P�J��T��#��P��i+�c�Xb�H��տ5Ce�f�/ gA�H���г��l�O��y�,}���=	�Ma)�CY�z�����C�$��׻��-SX�zh���i6�5%u���/�
�C��}�O�CQ;�#?��8�}+E���O�x�I�gr�!�:ds�w֬��1~R)/���ޔ�l�=c�+�]�*��&����hdJ8w����|�8X��V+���Z���Mן(1���
����ĵ�. ���P��Ͷ^�
���+4�)>����[�E��7�D��~���J�����ܠe_YMW��Wo1)�7��K�v|�PK/WUW�=��8#pip/_vendor/chardet/hebrewprober.py�[�s������*9%YI��ԩ���)���Hr=�GG08@4����;�@�����gژ����g��W������D]��G���:��>�Y�Y���_hu���8
u�EZ�F]e���$P�Y�o�E�]�H:,�\�X:8p�i\�X�N?�$[�\e3U������b��I��ӛ,/�,5*�uP�HM7L`�r�kP[m@yQ��yW�����5LuKk���F��:�ϳ���i	q:���Y�
�'u'�<^��Z�+Ud�fS,�Ԋ%�4�
�j�k�L6+�`���J��u!��џ���Y�6�L#�C\:_������Rp���T�榜&q�͗q�S�U`Ԋ��E��b��2�.2�H�?(�=�M��u:8q�Y�=�v�����V���7*�5r�sЪ�Z�H�)�]@��B�5�IM�*���I�V}���x�������v8����B�x�	�x�Jb�Ty�0W����1<_��?�����N]\ߪ���ޏ�?^o���ۛ����S1)�Mɕ�g �̠I�|'FD��0�Dj<k�9Ԉ�H����7�0��9ˋ-�BP�L�Y�S�<��v�*�}{p�p�S�O�(H����/�H_$Y���Yf
Zz5���ӓ���w�'J}�Ó}�h��Sɫ��Y�-U�Y�V�йfG
�����l�ʳ)4dמ��.n��]���a�о+������òD�m
�$�|׮�2m�#�fX�A�lȚ�<�����y�5�V���@��@-tB���"w!;�ǝ|��\�)�ub��Rv�q����eZ��Oq���)خ2JE�Q��v�b���߿�[��C�����z�Q�6���ׯi�e6��Ɗ�@ܾ�k����?���O��NHk�IG/�l��zH�L�CT]�|�0�$/�i�u��mN(��)i6î� œ�L����9@�`�;f�|��Y�j�9�bqaf�*.�!����_�?����e�-�Z�&D�Nɱ؂K�C����-U��J��C!�>
K��9��8B��E	A��v�LH�D!_��S�d�e�yC�Z��9+��n+�lI�C�=�@\*����_-�4��AЄY�<�Q�/A̔T�*� �ծ�$rM���0֕R�3\bl�1�U$��"��>�d`M����ez�W��j�:q&eD����W��D�o�fNU�F�+�Z������I��#�E�q�!3J�n�RKHiDF�	_9�d9��C��M�	KP$�Q=T�(����]A��<�I�KPm5Z��x�c�
�pN����%y�na�0:�Q��o)�('U0��%j� |[�7���ˆ�F�Rsɍ؈�De��'��$@�[��7�s�B��Š��;�zX/�D�k�T��(�ڶ	�o:T�=ZG+����A�[y5�.�#uHgG�T;	��P�L0w#1��j=Y/ ;W:���g�E���`촇6M�]7;���0�c���Bn^F>b
=�R�Ҭ��i�gd[�ZP�0�$�XZ|4�.�H����w����V`?��
����I�A��qFm�N�� YfTj1$J�!/�֩�=
Jn�"�fM����ϔ�����#���wK㰲qrl�� ����4CQ[�r�˪6�f���X	j�}����,�S�2G+��Q+�LA֌�6���_��W�2��ф�M"r"�F�^�^čh$q�_A_�P��U�C��v�$T�@�
����I!ҽ���qc�����d�)���hJ��H����,_��#�K�I[(�1�)��4�iρ�T�WO�
8�\��qs��}���"�AG��N�pA����(삘,ߪ�6��GChZ�	�`k�P_�'�Ok.DF��
\���v�B
�~DX-�����nT9��f��
Ի�j��;<I^p�S�C�hô�_{��V�/q��ͨ� kl��G(��x!��Ҍ�W�ӳ�,�I�"�Q���Y������<�����Z�`Yp>�Ҍ� 6@mc�̓�Rƌ"�4!q7J)�x�>�ʕP�ž��m�]�S�����b)��u��2�Lr�"H+���B��jY��))6���?|U�34�zr�rS^��Ķ��>q�UB*1y�!u-�J�Z�̷�.)���%2K�	#h[4�\��EZ����"�Q�\����*a=��uxw>7b�_jV(��i	�s]��K�����GJX���+�m��XI-l�I���9ߕ*H�Ps҅��+jWl��"[dpd[�i��]$n���:t^F��S�R���ߎ� �-ڄ����	H�j2;0��FI�Lj������j[Hr	�k�^�e�X�l��6yBMYš]O"�*��~6�2��\��|�͹�Vd�f�_�Ȉ����{�C��a�dX"�(SI�..����!H�]�K՛->e*�0&��b�„2��l2�|N����r��6�9C��X ������Gm�qm|�_=�Xˤ�����+��iI�Ҁ&�@�
уdl(�
������V0�Ld�%�p
L���ԣ&�b�X!pSSY��x�\���U`,2ޑ���M�'E�������\��kG��`5�YW��|X�d�UU�h�m��\,���R���Qcye�Db�	���$l������ȔΠbخ"?��Ն4�c���Q�$Wz�^�&�wS[Yh$A��VZ���-�gY*�AJ�T�z�N�©�Sg��=��\dlAWX�􃃃�M�iH�id��������[u����j&�?��nc�.�a���b<^>�<�`b�!?�\�^�Oϼ�W�+y��_Z=yK''���_�^{KoD����៽��wCt������{����+`�%�2�D=W-[c�$��FF���7K�L5*>W��%�9�LM��l�Kޒ����:�j<y��?oߍ��6��_A|���;�"c��◙��~7��EZ=��1���>��nG�'�+z�;9���~?>�]ֈ��z|�����߮�&H����4��T�+�؏l�G��G[�Eq�|�R)Z{W�r�����q�T#E�_]���󦺤y�sm��H�-2���
��.��J��`����(O�F��/�|I�qV�{��
)����- �i�-�р�\�HA�<��<j�'�2�h�]�T�a�Ɩj��º0��4C^��%����`�Gc���8��ֶ��q�zÖ���~��4O���/967~�2�F܋�-�*s��4˒�)�*$�?TO��r���n�;����nF{_q��~iH�f�I&�#���7A;��y�Ed���_�"�ƬyfH�}��Q��EV��Hu�g�L;��.B�E��&�
��,�F�R�x�s(il] ^�#�'��vݗ����uCT���2��J�`���(�cM������jJ���.�4�-U;hy�9��xV��jgp8?��������j���3�&؁._��d���:B_,WG|��U9E�|:�h�GwI�V��s'M��׈�7|���3ek�}]פ�:ճ��I��2�s��ز,�:�/�͈Kt�1i����%�_J���7hR���������B���f���L����Y�N�F>�x��Fӷ-�/b�W~�5�(��7&���&����f��|i�뺟��u�,v������U�k���t�%��xɳE��B�O:�%:骡�	}	�ь:�2�ȃb��L�@�n��)�T�#ה��#� ��cZ��4I5�t�e6�qn\A{���b}u��&w�q�6�����Pũ}"�����˞��i���^�����RC��W��t�e}
5#�-�sLMk��IJ˨�;)
�؀8�tv&�՚��Ʉޜ˚�|�2V=�<��W���#/��s�<��ke��`�IQ����sĭ��+`��zÁ�3K�(���
_6"�}*�;X[��*��rQ�X�P��ua�����I&�yn�_]�
���(��x?ݙ�T�#�Ql�:�K�%���P��M�v�~�f�"[����1�`�PO��4n4�\�5�Z�
YMM&�]�t�i+�政��7�[[�ϟ���)�����������C5C�}ۨ!�J�(Zu╓����)T@ǣ
�,d��2c,���V��VΖ#k]�sM��쑮�]�&��[խ7��’������!:��w3���h��w���J�gi8	�hg�Sm�u��˧ɉ)\�_d����[��|�kۜ��!�sܺƱ��K�x��I��!�A1~蟾!��/��7~�}y���Ȼ��~�A��[uҺ�n�}���f	N�$خ�_^��~����Ž�:1��'�%9$���'����K����ݲۺ�"���K^�CA�����1�3�wb����6]+�ߨ��#�ѲԮ'^���v����8��c���-��Q"/&��;Ur�G�%K�0H�8�T�-��ݏ��Ǔ���II(6U�ao�~���5�&��E�d�&�Ɯ���9�{R^��׊����;��'o� ��e,��~p�S�$=(ӭ�W���)���f���^�؊菖�az3�yC������U��w��,ܷ���%�|�]�(xSy�^|Yk�ߊ�;-��t��Y�v����"��T�cm���@E�����˺�㤑f<u�1���z�1��=�6S�>�C�Τ	��`3h����,vjW�W�]��Ar{C��g���f֥��	�lL�g��j�=��}3�'�Y����¨�&�>_��'�[��ӷ�������Mfmw�܅��;�!���J
o��f��D���V�zi�˅��PK/WUW�$�!0�dpip/_vendor/chardet/jisfreq.py��_�Ǒ��S$ ,`�-MED�c�d�C�,iI
��"�Vc�ݜf�^���,����C���ͬ�̓'ND�g���嫧x�]����O�{�|��_��������_��7����-_߿�.7�˟����U~~����ͫ��������|y�볻�Ǜ��^�޿�~(�o�㯌�����w�װ7�w���û�}ȁ����W�W�ׯ��5�?^�ꁱ�}�K��X~���֚9į�����<�������~����LJ��?�c���ߔ򧫇+?�����m���>������_����ϩ�������#��������ߕ��ʫ���p���>'�\ݽ�������͛�|���u>w�x��9��w?�o��睖?\�]?�����ۛW�ۛW�w��������yq�H��>���\��s�^?��o�i��v�xYr�s���j����y��m��ç�_����I_��;
�K�}���-aU~�.�_��p{�#�o˿>{�/���<����_�<�仗�]�6g:�5�o�t�]B�uɧz��{��7�����%{<��ٷ�^�������xQ���yyR~x�峯�����Ï�����/Kyq}�i���_���79�����׏W7���9��}�������_�s�_]�$��Un�w�����/z���	�]�yS��/��n;��X����{����ei�?�����\����79�7���������OO���f������?��<���F峋����O���m������O��X��ܛ�#�n?�}���K�!'9�GN��w��_��o��Qs�ǫwWw�,�����{�x���61{�nc#���|�_������ǯ����\}��x�[y��!�ݗܯ�,�/�[9��X5���?}5۰#�j柾Zޣ���髑Iǣ�O_��[��c�i����h�~��S��}q~�<�7��a͞�c�$�c߻���}�����ٿ�/?����_~|��׮��_��?���I���x���o���/�?��ǗϾ���O�9d|y0]_�r��\'���/֡\��|��ӟ^<��O�G�>�����?�u���c����y������?}����E)��L�k4����l����.�|�_�]��v|W㨗q�yY��/�z��f�Cn�"?�e�>�g�j\���t�~َq������y���e�n񓼧��z�=n��yw�-o��ʟ�E�8W���8�k]�8���߹�|U�ɃT�������y��Ҏ�R6�)��Y4�&��F��@GN��;w^�<C>�7�M��z�vh��z^�z���4���hFͼ���_+�儶#�!���A4�<.�k-E��y�u���L[eBMc�Zz��>=�!�|f��G���|$�+G�q����o<�%���#��&(�`�s�q�,~�sM�k�\��]�9��;үX�ţ嵲aA===3�����:h���>/�C�M�i4�f�Lz2�f�L�T�kF7�����fc�[k�kt7�;ݝ�	�l���tzgP�
=�A��G��0n�u��g�3��z=+=+=+=+ת����F<w��ѳ�3*���������v�u����ӣ�=��ucggC�N�N�N�A�A�AO0m`چP�k��o�=ss7��9E`0��fތ��Vq-v�
��-�eõ{��x̵�=�5�׋~cgꘁVNov�
��K�`w���pNA.[8���w����!�팋y�	����=�W�B��|����4<C">ݚ�v2�̇���cw�H[ha����}Ǹ��+�-�3Z`���&
0�kװ@�>��H�6�cF�V~�]��Lӽ4P��̖�s0i���m�}΋�>�9L���,�ј,w�3�C`;�4r��r)��*aO��b��%X�Z����'~K,�mn����{+N��?�!��6��C�u�_�Qa4y��V�\��̿��A��0o����F�ɦ[�e/���{�e�����xfu�*ͥ&�k�f��m�F���?5�ܪ3�i��톥q
�n`V�V��6�v�l܉�@~Ȟ�
ul��
�&h*M�a�5�r��qs��.aF�K�T�
w�9nZ��������+�s�UC2Ӭeg��_r�k�ȝkF��Y=X7�Z�Ę޴n��s���B���1�.G͌�L���`�:����1�;�=K���to@��������D��̀m<2�%n����t�9�KX�0=�@���;n�h��5����b_��v�سz�C�w�p���O6�*X�¦��i��n��6?��hZ�A��P�����3:����S䶲&s���Gt<����xD���*���g�s<#,z�P�3BͲ�xD�2���G��y��K��q��l�{�t�aI4�k��
yOxT2�bp����gL�_���Q�[H�Z�ee+S
�&��]�ՇvTV+�����6���?�;b�E6<ص28`־��:��;=p���~�/��
=q��G�;�q�ةl�uܨc8�h6��{��Z� ������5�n�^fCO�*NJ�4���5�k�/	LN`r�Ƀ�6��Knp̆�o"�����5f�1���P����%cp�2�e�K\@6�x��1�c�������2�e���S 0��(P�0���L-N���%�����`%`jF�	0`$�H��#�l�F��u��K&2z����	0`$�H��#F�
6�p���c�u�u+�{E��U�\?Ϳ�$b���,F�����=�9�DĶg^��j+�573EV��Dc�ZA�@1�b��1j��Hk�͌B�~�d����l�	$�MZ�b�(V�̦�t�A���H^��	$+���fCO Y���l�	+OSy�
+P�@���;#yI~�'��@��
$+�$�mvMD�Y͆@��
+P����K�=�d�H�eCO��
+P�@�E�t6��(ֶ��H^��	$+��@��
$+f��
+P�@��
+P$8m���^R�d�P�l�	$+����
+f�b�*\���
F*�`��s�&�V*X��gCO0R�H#�T0R���50�H#
������%���M�4���`գ�D4�|�/�_i`���Fi'���K�=�J+
��t4z��Fi`���K6�#-����%���`�����j`���Fi`��V6�#
�40��^���$?��4��0[
�40�H#D+�p-0��)z����MxI+
�4��0[
�40�H#
�40�2G6�#
��3���VX!�ʆ�`���|6�#
�40�H#�r��8�
^�J+�t�I#�b
:�йP�������5�cbYP�]�%��h��2��t0�H#D~�p-0�H#�t0�c�ۂ�t��J+{�H#�t0�V?z��F:�`-K��K:X�`����=�`��hn6�#�t0�_6�#������V:X�ؓF:�`���F:�`���F:�`���ł�t��
AIC�ˆ�`D�V#4oDύȷ�Tv0�H#�������V:XA���h�&h*M��4�f���02v\�C�z[6�+{2��#�02��#�02��#���#���`e��V�d��F`d��FPs3��02�Ȩu�/`e��V��$w0=��#�02��#�02����^2��+��	�fC�Ȇ�`d��F`d��F��q���z��V�d��F`5�!�4�P�5�PZ!z����u�� @eCO�2�'�02��#�L02�Q6�����n/�`e��	V&�d��	F&�`d��	F&A�ˆ`d���yI��nH����L�	jFZTz��	F&�`d��	F&�`d���y��d��	V&X�ؓ	F����'�`d��	F&�`d��	F��%f�	V���'�d��	F&�`�.�F&�`d��	F��%f�	VP)�b6�#��l�	F&�`d��	F&�`d��9�u��L�2��+{2��#�L02��#�3�I4F�4A����%�,����ž,0���#�,0���#�,0���g���n/Y`e��V�5z��
��������#(�mm^b/Y`e��V�d�B�l�	FY`d��FY`d���y�9�d��VXYؓFY`�7z��FY`d��F��%��VXY`eaO����'Y`d��FY`d��FY�\7x�+�,���'�,0���#�,0��y�Fʩ��6��%�%/��7N4���t�A3i��Dm����a�0zl^b��FO�������tz:=��NO�ZN���#��ؼ�2�q��AϠg�3��zVzVzV�U�Q�Q�Q�Q�y�e8��Vz6z6z6z6z6z6z6z6z6�����������yI��#���������������\k�c�c�c�c�c��p<ǝ���������\\k�c�c�c�c�c��X�E�EO���ѹ:�VG���Y�,ZG��d�:Y��&�);Y�n'/�8���H�$Ҝ�p��S�·"��)����y	�Nꭓz+Hf��8��"�8d�� ��dO�W���zX�
��,��-O�Um�,�䋂q���d'np�B�D�{���K'n��(o���m��h��%����1�2#��JRjF�P�t&ʼn�̘�B[�$�gpT����09��Zp<��Z،}T�J��0*����7P�\�Bj���&7y�����7
�P� R-�p�Lp��\��<����fg��y����,�/#��$�
1�5�	B���;V���P�4n�8{�P�
�(���W��*��#Z�aOC)=��BZ��L��
�)��
-'�S���p�C3,�a=�f�
�6���I*�:x^�sp�M9?�EQtdbF�Ո�#�B��A�c�W�ʥn�7�6/�3���{ܠ�.�x����cBG}/PY'x1�K!�u�,9y==7]���}��V�I�������pυ-Ki�qd�N��ە]E�3���(�д�Qwt#;�=����JD�J…������$�.��cM
���8	cC�2�ѦYu%��`�{��c���:��<Y�yr��ɬ���P�)�ÛrF�2��&�@0[`��I�t���}ȧB��~I}!��R���5�MkJ��x9Fg�]ɟ�G�s_d���3�M�L�JF�1/�e��6��B�6WX~�^�57yI�����BKD�����Cu"�����sL��,[�֩/Aa-�Ub�5s�gV�R$N3�(�(�e\���7y�q@���u��t
�׍|��]�`-dK;0�M搂mf�n�p�u�Mr���*�O%B����$���_��B�!�g�c�I3f�3D ��'_8z&L��M�mER���$�M�;f싄T�-��?� PHvh��%
6k����8E��s��	��a
s��ڷ����v�z�C�G���G&_BR�XlC�pD��q�8$d�X7��U����>i��%�e�0[H��\�G
���4ҾN�PP ���3�*�a
�_�䩓�H��"-��\V>}��8�S��025�<oT���w0`��F:δ���*o��fT�} v�@T���9�_��q��rU��,�^�I}IS����~s$h�l�.$n�Ԫ��tt�Jҥ�1<G��c�)�wgݘU\K!�XT���̈́C�(HI�L$2?�N���+�R^B(mKF]�u��]�1�_l}�ƅ�U�s\��%ϐ��(�_d��v��F��!{��=��g��e�p�J�!��	��v��\�J� ��M���R�o�rh㲠T �=B�b9e�'G�.(i7y�`:ٿ�kjV�A["�nc}35����kMmNI���9.�%�a@�2�T��cY�)��5���D�V�1DX���@�X�n'~�Q\v=4�k�t4�BV�H���� �.'SE�-�v���5n��:�QVI�:�Ђ-d��TT�=$�*��ՍRD
Z�:����>&��>&+؂B��Sdg(��Q�lʀ� i;T����C��\��ȏ�4QG���軪u����TK%��Ļ%d�Y�����P�x�*��m�C�I�Ḱe�q�*>; ��
���X���W�:�E�"4H�=�$qG8E�U�L�Éo
�Q��yWط��M_���|���T4',։�l���i���F
4|sn�ʨ���Wb�h;€qM#g�D���cU���AA�z'��UQ�-Hr����%~�C#��̄�F�\�
�)��C�-���RN�H�~��$�"J�pS��p�5LtT1R��018��C��;�#�9�c\�^	��M��
5��(}p��j�
Xº-
�uF�7Y�:-aD�pF�$΍-�2�/
���p*לrC)�X�0���2��p�^��[��GrM���B��ڽ`��|WL�G��,5���y�۱�C����)Os0�lM��� �����P��B�)F_��/��ׂ�k
��Kl��B�0/4��0E�ͩ�(H�$���xU�1n��W�/��pWģi$8��,P��Nxw���I��ueW�+)'�9U;�$���B�C̮c	O�©]ׇP�`*V�f��%�'&T�'rM99������%Z´����zd�7~�{��?GbE�B��ȿ�mu�!2>�xP�mД"_J��M^R�OjTJ9H.�	��w���-�`c�O�7�#��30|Ҹ�sѸ�K\�ԁQ���[�T0̬̖�307Ғ��J?3L��^s�|����dU��;��2pm� #�!8�Ͳ&�h��@	Ű��;Խ:N�Tn� H�{�Ŗ %mDW��l������2�)�
�@6Q��KD�mA�ǘF�
�U��0�L�)�}ҩ�Mr�!�*�qF�kN�$I��f:٠�
�e� "�T,d���/
F�v��]��ӓ��Ap�,ۡ(�M��^�BH��`Ȼԧ���"�
�t�DDWph'�T�*JA�EB�T>��ތ	u�N����}Lݫ�/\�4v%.��jC����
6�S�	߉��]ɇgƥ����lS�3���Bꂌ��Q�R�Ċ%�r#�Q0d��y�N����T�m+̫�j��֎�����dIDW�T����M^
�����ٟ���
1O#�G?�,�i⼥�}yp�W�&/1j�
�,=���4
�GE?�:Y@�/�jb\�}h�b�*yl�7�^�2��O
���}h�+��}DY<��с��w�Z#�[t��+�DQŒ3�˂J�)�2SRa0�vQЋ�i���	��1R�w�ߠ��bA2$�KwŶ4!�Fr��� �~��ϭ��m[/�"�r�1��5��m��R=��[�t]�Lᙏ8u��_gB��qK�	%0tZW)8Ƈ��-�J/Y��ˈm�CݫS�^��5�������cʦT3�0Ē�� C�u��4v�:����r���:f����qP>��L��u�;Ӹ"�p0y�O����`��T�M
��H��)�� �I���[7bK�
���Rw�ԩ{�)�&ӧ:o8s�����.�Y��a��$�L�X��ҳ�N�k	��>*H��<�)n��Ǧ�A���q(2�@L�rY�ԽՂ��lU��2����c��%1���:K��y뜚��q�Š��ȹ-ɫUGav�Mu���X%g�YhӋ��+{~�{5&������%Q"�%�����t�v(��6��Ba5�&/)���I��q!Z���>p�-X���!q�/Ysm	�x㌺W_�XH�Ё>8�T�z�mQQ�46�G��^Z��YJH�ɫ�{-.9v�*�"�db���a�h�u�N���
!N9{!�6?�$u����A*�(*֩���54�DM�(��N����-�*����Խ�N��*4�a\r�NFjA�q��ס$9����!�K,��3*B4n�o
�b��bl���z&���1ySpVPtH�-\��|����H���$H.T�\�a���׽��Ulw��;�	�sݒ�t��g�'�BP��"��K焼O�i,%��U#���NݫIa�"�PS����!�D�	T)�*���7�_6e�"ϩkP��;���
0	Me��au+��b�v�d^Il��[D�8�0uNX��)Uǣ��6�O#��!�Bw�Qž����>��Խ�����Lh�rJO)�)�k��dX��)2r�^z�`�6�K��9��cQx	�_�ᡅR��e"%�b���疐��b ���ߨ{��g�/B����ت��|aJ��P�2ŵ�U���͎S7��5T��!5W��$��awt��9'EV�P@M�a��!}k>gK�+�H�V��nى�Z N�O9s���PJQ�:+�ϣ;u��,�r���1��+d�*�Y�x�cR�lt�
�┽�d�m�Kݫ�e@+̕�:t0	�V�^�8.�D<&R�E�¥]��g��S�jC��)L�CTN� R�MJ�
Yĩۮ*�uݎ�MQ���^7�^��22QZ{|�)߽���'G)oQ�	�3�OF�D�*m燜��B]���Sa�%&�|��<��
&�]��_c�H:YwԽz�qvS($����!���;�l��c#(�$�!�"�g�c�������r�,*��:̉V��q!����m�5��l(e@��e����Ѵ�(�桩S�l���l�@��fSr�f�)�:�<�z�����Uˡ�����OWB~*��T���Y����KH��
�-���Qz��=]�5�ncU�(�	�%�C6tt��s\�,,s��8C��/ڃ�b�v���%䱬K�/�hL�b����ߔ��)�.}R�jq�SQ�B�Z��ݠ:�0;O�z
D4.�]��
�e��)�!�(�v��F�Z��[E/):F���,t�q��`��rXá#���\EIl�.�F�C�KeJ�*�S��P�%�d�7R�⛲��-Z�l�L��Ψ��A�.v������\T	�r�ʿ)�*GU�5Ft)2!�JFGbۡJ�a(CM���E/!a[H:�/�j���!�F1�aOB����\�4xHS�<U��痺W������ܤ���3+D��Xii\�~���pe^�9��8]Z ڄȐҭ�t�)����Ȗ�r6җ�D�=��rJ.� ;�8}�p\1a�%�(����8>�ƣk���S�ޞ_�^�k[!=H�W��������@�+�\r����q�/��3�E\��>'�k<�q�L\AG���>{�ZA(jW��V:���K��x�����2.8�h��g�7���p1sI0Us��e�}�jކB�-mB�Ң�V\�VL#��M�QP�kd伙���ώ�3���Tj�u�;��'��M�G�����a
�Tqøԗpr�C�Ft�L.<�wt8Ŀ�R�QC"0��ߗ�z'�]OԽ�J��(�HH��θ!$51bK�/�M!?Ɇ�T_�	�u�����t]�h�(����j2	��J�9 RH�����R�WJ�|�415L5��_m�C��]�^���U=Y�58����xQ���Tu2�_D�Փ�������>�µsVz���%Խ��Q/l�U��[�WF���AF(�U.J���Ԧ�W�oԽ=
�xTŪ���y�g>)ۊ��H�\G�Ƈ��$�6��Խ*M<D�� ��>(�kJp�k�t{,��qz���HY�D�q��^cnF�y.	Ԑֈ�ɚ�)�p�|�=���`(�q�c�^��o���%ң�����+�(e(T�YՑ|�e�W�N%�)�p�u�^]�C
\Ų��q���JX�ƻL����E�X	
���g��^��:0���ڤz���>=)��i�g�*��B��|����@�k
)�Ce��bu�{�?F�wg'�Q�+W���ձ�!�8����Ʌ��F5����"I���/�Ĥ�Z���/�-��	���~�7�^m;�Al��������&�7]�/T����UD���4	JS��qaP�j�
�J���.*)�"�@��*�!/��e|s��䩮�J�r�T�^
���u�Jؤ1���U�?S & ��^5iRq]%��݉սJ���)݆j��+;��r�ɛ^��5_<�.R�/e���ߨ{5���T��썲�][��Uy	�Wy�ޓӔ�S���?�%���ч��H
%�Y7��xX�Pp��K27�1�"7NZ;�1u��T�'�"«�F������i�,h���Rd�U�}��$榾Z-��\�����D.�K8TQ��؇�8Ue��J*i�g�{uIx�x�Q��ʇ)����P��T�� ��!�M[]:�
OL�ki��'t���h9v	2M��h�}.	ӯܨ��/T��$�`�P]A�Dd�����)���0M��sSٮ�k��Bu�U�l� C��TT�n����v
_���V��.������WC���z�H�]@^H��[-C�/�|b�.� H�aȶ덂��2U\FI���E��h���0e)2R��`��$m)S���]Խ��؆I<r�
U �Uu U�T3(�g�
��m9O�;�Խ��5��I��XF.5�b
���h��8:��i�1��
����Bu��FTA"�32z	%�E�;R�)�8T���ڻG�4��W�~��K^R
%=�������m�YB7�
'�.�a�����sj1uGV?0�{�t��U�tK��漟��"-�1�W�h9�u�Ee�gI����ڸ�:��1�V%�$m��Mc�(9���s��'���)��ۇ:h�y�MS���q�J4)�Qق�a��)�d��VD�[]Jkl�^��K�#��];�d�%	���w]EP�ꇪh�7�v*T9ݩ�X�OӢ�G댁�0P�e)n� �>^�%���aS
��B�C0�֭�m*��z	q�} n�*p�����N�@�!W�O⯪dP�4�\Q�A(�zU��$�1�"�EM*̐�Ƹ�%�=!��+�͎-���G�k� �)=�džԆӞQ�J4ˣ�~G$Xe*�U��#�=U��A�2(A2U�l��J��~�%�}�2�C���)d�QD���2�w�h%C��KP���C�QaUo�̮�^)*TI��,(�R91�uY^Jĸr�R*c�/aW�S���**s�U%���G�X� B�]s� �,m��&/q"YsUzȧ��^>O(�G9ဓ��e�Ny��ଳ��{��wn����a�d�cm���+!�mR�F�q-գ��w*u�����4���:����#mʠ��֕�ո���d/�1�H['�Խ%9FL�U��5�q����%-��a-S�W2�j�1���]��R\Yէ��VGţ��KUgz� �*`+nR�8��̓Qڗ�W�	��t@D"�j�=*�'�#}]iT|���Z�*r�u��%�[tR
�,���E5s�ݪM^�����U�™��l"�CD�8ϓUSg'�.Ǯ�W
���U�-��5�J�'y�T�q
.����^Ygm���,��+=�����#_�
����/��<�^<��VM�%*���'�m�t:[��)ե��ՒQ�+�U)7fR*�y��%z��.8r��Ha��
颍�fU=�:
��B�����J�k(m�zL^XiI��C�
EС]�*<�F[�+���D����&/q���%��ҫ!�d��ɔ
�.)��B�*9���AT�q�5��Jݫ+X'ZU�'�C�a(��U:[�չ:��Z�Gk�|�e�s\x	�|�P�������FC��o�Np�$#�t�H�H���u�U�{�����~��R�d��q����*�C�'�����N�-�m����R2:%Ez*����t�J��vuU4�jp)X
��9�����WS�r���t���R�����T����!�%5����}6�9ɸ�t��I�P�`v*�t-#	ey\�F���%�k�7��Wj���UK�b��J�r~�`��$v]��s�
����@}	>5�rx�#nA�F�
�G�:�ͥ) 3q+����~��礦�9n��|v{��Q����?^w�PK/WUWJT�1� pip/_vendor/chardet/johabfreq.py��Q��ƕ��+�
h��d�!cx�L[3�$�$�d��KV�[��ꖽ����8�������\ѕ�Iƍ�����7���K���矵㋯�K|�e�����7�o~x�|���Ƿ/�\ڻ����?����o޼�?����o_������������W�w>��ח~����c��7�~zx���������޿z��������O��C?��wO��������w���T/�Ʊ~�����߶�]R�k?�?��O.ۛ7��w�_^<�x���k����퇧��~�o���i�\����o�������˿\����._���wo���To�{z��˸j�?=<\޿���?���_~y����˷���׏�}�~!>\^�}�_�=��������߾�og������_���������򇇷O��|��wo_�������������+uB�~r���������8�����K�$�z��#~|�s�ۗ��>�?���������ӯ���^�󝾾<��a�׾��~��F�������������~������?~��7��?_�}{�b��?���n��_���H�?��K����o?�҅���x��_��g��͟���g�|q|�����v�j{��g��Ϸ���}�՗_�\._?<�z���g��^��!|ׯ��/߼�[�s��]�ח^���O��^Q��}������y���z��%�������w>�����N���0��(�~܋��'_����ۿ��S�u���~�w�>�Ļ�Ư�i믽攮��n�t�|�u���_���o>z��z��??�}�˥�{٧��Û�G��w��*އ�_��ߞ>���������"�����e���7z��G������7_���ۋ�|�b?^������^��G}�^��c]K��r���1zI�q������맗	?n�^f��^���O���ۧ�?N�^*~��M����3t-K�–.,A�ҕ%H[��mK�?S������M����}�.з��e���j���x=���2���2�m�xзu=��q<�ۺ��E���E?�
�Z?�
��}�k�x�w�߇���A�1^}�(�;F�@���g��{?�}�~�&��O�w��o��{���'軏�A߽��}�^�N]Ϝ�s?���s?���'���3~�/�����ϧ�:V�\�s���J?~���n�[�o��}cq���@�X���z,�7�c������i���~��g���^��e�����a������_�o�����w����
}q�?C_���c7����V��m���zV��o����O���+�X��u���~�
}{�W�oǃ����7�w����+��8h�B�X��
�cI��qk*]'�M�:c@(�iO�۬c�����q�dK+�%�X[	0ي^�c�$�d�#�'�x�l��� @ʶ�%P��*�X	T��m@�:��l�:�t�(�,�XY	h���J`�V�V(��c�%�e�/�/�X	��ƂK ��>��m,��lMg��]��C���t@���l*\�f�I@ͦJk���q*
.h�S�&T��M�����,'Tt@N�-;�9�*tb|�J�N�]<;�:wBu
�>H�<��zB�
��&�	M6�c�M�Oh����m�bl�	���& (Bg�R ��Bi�Oy�P�4�CM���5�P�4
`Q�s`�4
�Q�4GM�5}����Dj�$5D�R�0�R�*5m(�R��.5�S��2��I5MM���T0�SS��NM�<5-d�i!P��@���
D5�l0������6Vv��]��t@+�Qm@+�Q�������}�AO������oT���Q���F�;�ڋ��8��~JGIe0j���}�Y�Te�Q����v��F�ېF�cn3����ұ�3��
���B�X���Cg�Ҧ�@����}|d�`Ծ�F��CP��Q���JU`ԡ���uL�q*=T`�1>�d0�P}�Q���:4�`�16�F���:�'+u���:�G,u�X0�П�`ԡ�[��c|v�`ԡ�u���R�uh���C�
F��r��>u�O��:�G�F�0�P9�Qǡ�@顳@�� 0��F�U0`�]sF��2u�fF�˸@`�]�u��`�}�
F��v�P
FݵÀQ���FݵÀQwM6u��P�
�������0���k���*��Q��kz2�'���8�ɨ>�oT&�J>��ғQ}`�8U���'���m|O��"߮P:���J�U�]�t|�u�B�/�t���
����J�q�B��?nW(]�
���㖠tl��c��%(�:����c��%(�tP(tKP��P��2��
�e(��_P���2����4�T�pe(=tZ(�i�2�m@�]ߺA��n7(�Pn7(�Pn7(�ݠt|uu;UӤ��7w2��,+�{9U�`��dTJOF�}c�10����C�ɨ��
�cU�&(-:(��5w��t�1�T+j�R-�J��f(]�1�Z
3���g(UY�P����Te9C��r���7Э@��@���nJ�5n�RUr���'ϭ@i�r(P��z�������@� ��dT�*��Q}`�dT�8U�*�dTo�dT�1N�Y�q2��[�zI�8�
�*�J���P�rX�T��B���JU+���nn+�js\�T��
���������������t���������m��ڶ���M	������ٟ����P&0�6��S�m�K&�3�7�`ԭ�%t��	F�ԏ�n��u+�3@��?&0�6
f�n�`&0�6
f�n�uݥ	���:��
����(�	��m�@��a&0��P��P:v�	���
�c����[�P:v�	���f�&M5i�����{3a`���Ƈ�	��4�`Ԥ��&M%5�!���g�	��4�`Ԥ��&M65
zL`Ԥ��&�>5��_5�O[5���i�05�>��I�FMUǀұ�L`�Tu(�j�A��a&0jRсQ��?&0j�&0j_�L`�4v�	��F�o�&5���I�?0j��&0jR?���)�Q�:�`Ԥ 5��i��IM?0j��F����y�Y
t�S鬝���ӁQ���F���F����YK������Y���U�`Ԭ��fU!5��Y�F�ڃ��Y{5��~'0j֦F�ڔ��y��&0j�.F�ڥ��Y�5�]j����F�cJ+g0j��f0jn:�z	��O�3U�'���`TQ��*j�QE�b0��YFu����j`�@:����Uǀұ��`T�jzC��?f0������2>��`T�U�ʮc@�.2U�J�1�Qel3U�f0�Qel3�h���EF-n�JM��IF-�0j$���e���Z�f0jy�����Zy�tPl��Eg�ұ�g0jQ��Q�f�Z�R���e,��Z�R���e,��Z�B���%d����A�TF-Z�`�:�T����i��b��(�f0J���=i��H��(Y�f0J�����h��*��(يf0J�����h��,��(Y�f0Jޢ���h��.��(�yf0J~����g���(Yxf0j��(�zf0J�����g���({f0�N0�V0���`��;`��;`��;`��;`�
<`�<`�-<`�<<��������Q��0J��F��R�(9M
%kI��)`����3��Q2b0J��F��P�(�
%7C��U(`��
����Q�0J�F��_�(5������/`�6j��Q��0J�F��V+��
�R���Qj�0J�F�Y_�(����`T�"�Q�k
FE�Y�TEF��_�(u��f}�Ԭ/`����R���Qj�0J��F��^��f�ک�ٵv��F��^�(5��F{��{��Qm�5_��6��F�_�(���V|�Ԋ/`�Z��R+��Qj�0J��F�_�(���V|��&�j�90�i�(5��f}�ԛ/`�z��Ro��Q��0J��F�7_�(���

�f}�Ԭ/`�����

��}����F��_�(���v~�v�:��~���/`ԮZ�v�:%@��(`�n�&��p��]�L0j������dX�(�0J����G`��X�(y0J���G`��X��}�=��Q��/`�>Jj�Խ_�(u�0J��R�~�Խ_��c������R;�����00NFc�0�X�(]t(���G`��X��ö\(��F���Q�,`�,%�F�῀Q��/`�:�u�-g�Ԋ_�(��0J���:�z	��
e�ԛ_�����.�1V货һ����>�������>�(Y0J����%`��X�(��0J���R���_���@�F�῀Q�����ۨ
���(90J���`��X�(90J��d�&�r2j�`9��῜��:F��x�'�69��Q��ɨM��d�&�r2j�`Y�TӰB��a�RM�
���J�'�e�R��J��W(�گP��_�Tk�B��~�R��
���R�T�A��*c>��`*��`*�ڻ�2�_�tl�J�v�^�tl�JJǟ��J�:(���,�J�:(��
eMP:nCY���,�ɨM��dԦf�z2jS�~=��Y����Ԭ_OFmj֯'�65�דQ����ɨM��dԦf���t,�5C�X@k�ұ<���~J�J�JJG%�7(�4��`��n��ұ�7(UIݠT��ܠT7|ܠTw|ܠT�|ܠTe9A�n�t|BY'(��u��]�8��󾞌��y_OFm꼯'�65�דQ���ɨ>0�r2jS�}=��Ѿ����h_OFmj��3�j�g(���P:��u��Uǀ�Uǀ��h_��]j-P:�X��{$��c[��}l-P:���@�ض��U��:r�R���*�JUt`TVI�QY%F����Q��`���+���
F�{��Q7U��
F�{��Q7U�f�
F�7��Q�ͯ`�:�+�F�
F���Qj��`�Z�+u�I�`�z�+���
F�'��Qꉯ`�z�+uXW0JM�����S�n��T�(u�+��y��5�`�T�=�`����R��Qj�W0Jm�
F��^�(��+��y��5�`����R���QӢ�@骃B��*�x���`�Z��R��Qj�W0J-�
F�^��i��
F�'^��iTa��Mg��QA�R��Qj�W0J]�
F�k^�(u�+��y��$�`����R���Qj�W0j�P*��x���`�z���'c��F�I^�(5�+�&y��$�`����R���Q�V��y��5�`Ԭ��f�6��z��W�`ԬZ��h�`���R���Qj�W0jކ00J��
F��^�(��+�6z��F�`����R���Qj�W0jY*�&y��$�`����**)0J]�
F�k^�(u�+��y��$�`T��Q�W0J]�
F�k^��2>T0Jm�
F��Qe|��`���R���Qj�W0J��
F�R`T�c��Ԋ�`TQ}�Q�ͧ+ ��|���#�;����}r���^�T-���Z|�/`��v_�j�բ�{����}�Ԭ�|�aD��Rg�����-u�4/����\n�����z�}�u��R3��@�^�h�]�W�K�>ͺo�
����G�9tv l�5�r�V_CPl�5Ɣ
�GNͫ�*@����d�y @�A�`�3A���S=���s=����=��z�}�u��DS��@��i��hֽ�WPM��t�VW���Z�����^�@��u
��^���R9�4{�oj�h��Wn��� ���U�w0�z�r�5�U�0W]-�\u�t���UWPW]-`]��쪯<hW�N���u
�U��W�*A��5�=�!�y�%�z�5�z��{���{�|��|�	�}���}��~��
������W��w�_@��~}'���W0�7�_Aߙ~}k���Wpз�#�b��H��|�9�,6�}�<��7�#�b���H��#�F
F|�#�FV�(l�����BG�����l��>t$[l����DG���[�n��^t�[l����FG�����p��~t$\l�!��HG���[�r���t�\l�)1��JG�����t����t��NuD]l��6W8�\-�`s�����8��*hn>;4�~4�>24���|7=R/6�N�؋>��}�=�/��*�M����#�
p�
XB�Ŧ�B�Ŧ�B�Ŧ�B��&@B�&@BFѹ�Ay206�B06�R06�b06�r06�0��Y3��>K38�;~ܽo����
pp�.������ܽ����ܽ����ܟ�l��kܽ����kܽ���k�7iw�Jpp��w}6F<ƶ{�����)8�{�����)8����^�࠲R2��kܽ����+ܽr���kܽ�ݫ	ܽv���k<�.�Ay36�36�"36�236�B36�R3�H�H��_�`�g���ǁfU8�36� �3��Y�ࠜ	���	���	�}D1H����͎[�-������ÉK��Qudp�z��'B��&gEB��&kEB��&oEB�Ʀ�0�M�		i���46�'$�i��pP���D�M���H�Mƍ�L�M΍�P�M֍�T�M1
	���	���	���	��	���5�]����ʲ����]����5�]����5�I�ݫ�{��w�p��U�]-࠼	I��	Q}D��_#!lc��R�AY8�66y8�66�876�87��j��`\}�O����`�4R1�s��������:������P:CB�F\}�O��	�q���@������,���f�f�6+4{�Y�Y������|7h�u^��+w�f����rWh��]�Y��W��
�^��E+�q��k��`$�哃�̯�����OF�U=9ɫ��`$�ٝ��4���}Dy�'#9���`�C��2$$s�\	���w�f��]��Y!4k�F<G�J����iy	��S��	!ABFG�`����?!�#�9H��Y
r:B~�����! !�#dH��5��:B�����PC?!�#�O�����N$���+������Z���ɞ�7�����{�b;B
�܎P�<!�#t�zBrG��-�	���zBvG����O���<A���;�4�N��3A����^)4{]L��u1C����=F��'_瓃1�:�����`Ѽ��#>�i>9j�'�y���99�g��`L��͞��b7B=B7�'�z��	��{B�Gi�f�;88yŁ��+�\	���J'�8pP���|�P�=!�#&�JpprE���+
�\Q����M��\c���'�88���I"룏��f������y1��N�m���9������ӡ��K���2$�~��38(AB�GL�J'�����}�4;?����|	�!#BB�G�4��	 1;��]!!$f������Z�Ab@B����E!!$dIHH�ٹ�����WppV�(�@B>��4��Q!!��hv����j���v$���
	� }D���
�<$���L	� !�CB.H�pp�'a$���	� !oDB6H�{��WAsuh/4W���  $d�HH	�."BB>������"!$���2�A�$Ą�RrBb�_I
	96�BB������g#!+$d�H	�$���|	q!}D���#!0$������@�n�Ь�f���<"	�!}D��A�FrC�����Ӝ���;88{�g�-�`�.��`�.��P�Ss�.��`�.��`�.��`��	�`�z��;8X������JpPΘ�8�(^��`�:�IH	�a"E�x-���k,^��1	�"Q������ep�x-���k,Z�	;g�.�G�@�V�E�H�4k�!a��T�@���@�n=м��ЬՄ���o9#a��F¾$�D��8�,�#k$��6v� m$�A�H������#a�"G���v!t$�B�H�O�!w$�B�H�#�䑰G�#}�hv*;8h��G®!ď��`vpp�3n@�G|vh^	�~�
8���!�#�F��)�����>����K�����U��8yp�n(����PH#	��G�G�N�A��H��D��c
�$a�2IŽ)�����C�X���
�$}D���
�$a�I�*d���\�hp�>+ē�}V�'	��P�Y!�$�BDI�g���X�ͮLp�>+Ĕ�}V�)	��T�Y!�$�BTI�g�����
a%a��J�>+ĕ�}V�+	��X��\7�]���Y-�����8����j��vy!�$��BtI��쒰��%�������%�z��B�I����s�"L¾/d���XBLB�,	)&�D���P$KB�I(�%!�$ʒ�d��!�$�1C�I�YI	a&��#%���]g�3	�ΐg��!�$�1C�I�9H	�&a�2M®3���]gH5	��k�O��CC�I؇�d��~�8hg�M����`
����MB�3	�&�g%���hNB�)J�8	=�(!�$���P�MB�I��C�9	?~9'a��N��B�I��C�:	?qY'�G!�$��!���:�����y'}D�􃈐xv"�$�D�I��Г��'a bO��B�I��B>	��|~��O¾Ad��}�?	??�'�!�$��䟄������~��~�"P��AJ��?A	?�)(�g� %�uDJ��?B	?�I(�p�~Hd���0��Ci(a�$�P�I䡄�D	?��(�� %�D&J<?�|~�8���p�?���3~������O���>?���A?Ьoe�~��Q�L����HH	�1��G|����N��G���S��#����g����DRJ�{�����Y)a�%�R�NK������K	;-��vZ"0%�DbJ�i�Ȕ���)a�%BS¾J������M	���v-"8%�HDrJ��蔰��)ao!�S��B������O	{��v"@%��C�J�ˇ���*aBT�.8���=o�Q	{ސ�v�!H%�pC�J��(���
Y*�g�$���nHS	;����!O%�<��@���
�*a"U�>4d��}hU	�А���!V%�CC�J��`����*a��U¾/d��]^W	����vy!^%��B�J؝����;	+qxv�A{���v1!d%�5B�J�#����#9+aG�V��bD��#Y+a��V�n����>�[	{{���GV�@�>U"q���ȕf�2W��=]iJrIH]iv� v���ܕv}~jۄyƈf��`���+Mq-	�+���4����A�J��,�$�4��Ү��+4{���Z���J���y�Ь���Ҕ̒����蕄(�f��X��Fci�!���k�8�f��X��Ediv!��)�%!���k�L�f�BY��FHeiJeI�eiv!���}�`��`��d��d��h��h��l��(��p��,��t��아x���D��~``�f? 0Cs���y�Y{BZ��QHiivC!������f��Z�"T�Z��P�jivC!��������$��4�$ĵ4;�����tB`K��	�-�N'D�4;���Ҳg��`˞����n(Ķ��x��l�[Z~~�#4??������������������]	34�fh�����B�K���@�Ww�f���^����4{uh�Z>9�n������y?9�n������y?9���B�K���.�./$�4������B�K���.�.��4e�$ĺ��
ڝ�`�fw�]��Y�viJPI�vi�k!ܥ�l�f�np�.�4;�����B�K��/�.d�4;�����B�K��
1/�>+�4�����B�K�c
Q/͎)d�4;����B�K�c
q/͎)�4;��Ҧ�g�B��
�1�̗f�B_�]LH}iv!���Y�ܗfg�_�}DH~i�!���#��f��_�AHiv!������fo`��=H�i�� ��ۃ�foB`��=H�i�� ��ۃ�fo�`�};H�i�� 
�ٓ�,�fO�`�8H�iv� �ف�<�f/
a��-H�i��x�y���ЬՍT�f_
ba�})ȅi�� �م�d�f
�a�](Ȇiv� �م�t�f?	�a��HahvE���� !��え�fo2b���ivG %�����fwrb���iv> )�����f��b���i�9 -��瀸�f��b��i� 1��W�Șf_2c�}�i� 5��W�ؘf_rc�}�i� 9��W��f�c�]�iv =��������?�c����i�#A��׏��^?2d�;��i�#E��'���8rd�{��i�n#I����(���6�d�{��i�S#M��O�8��>5�d�z�y2}d�ȩY=�<��tF�LS:#O����'�ԃ�ȓi�8g��4u�3�d�:�y2M�<���sF�LS�9#O��㜑'��q�ȓi�8g��4u�3�d���y2Mތ<��oF�LS�7#O��Û�'����ȓi����~:8�>?��@tpp����G�����D���Û�'Ӫ���Û�'Ӫ��Û�'����ȓi��f�ɴ�����p�z�A�j3�d�z�y2M�ڌ<���lF�LSg6#O��3��'Ӫ���Ǒ�'��u�ȓ�#:8X]c��P�F��S��+n�����+n�����U	n�����U	n^����U	n^����5n�ApP�nj<�������8�yU���W%8�yU���� 8�y
����8�p0<;�`x5�������8�^dF�L�pP�6�ȓi�=�y2-�����`�~��p����j����W8^��`x-�����28��fF�LSO3#O�����'�ԝ�ȓi�Nf���yƈ�\0R5�`$4rjVw2#O��;��'�ԝ�ȓi�Nf��4u'3�d��a2�d���y2M�ʌ<��~eF�LS�2#O��_��'�ԯ�ȓi�Wf��4�+3�d���y2M�ʌ<��d��<���dF�LSw2#O��;��'�ԝ�ȓi�Nf��4u'3�d���y2M�Ɍ<���dF�LSw2#O�)�$#O�)�$#O�)�$#O�)�$#O�)�$#O�)�$#O����'�v�38��V��ݵ
�Lppwe�����]����wW8��~����
ppwm����f��4�j3�d�z�y2m�.��%��ݻ8��lF�LS�HF�L;\	���y�8xxv��ó�p��.�����^�࠲52�d���U{8xxO�)8xxN���;8xx����W<�����;8xx�����;8xxu��w�8x�|��w�Sp��u
޽*���W%8x����w�;8x����w�Jp��J�pP��<��nrF�LS79#O�����'��M�ȓi�&g��4eGd��4��3�dv��3�dv��3�dv��3�dvu�3�d�ȡ�|�� OfW�8#OfW�8#OfW�8#OfW_8#OfW_8#OfW_8#OfW_8#OfW_8#OfW_8#OfW_8#OfW_8#OfW_8#Of�zN34�:gh>�;�,V"OfW?7#OfW?7#OfWvDF�̮oF�̮oF�̮oF�̮~nF�̮~nF�̮~nF�̮~nF�̮~nF�̮~nF�̮~nF�̮~nF�̮~nF�̞\�'��ʜ�ٕ9A�+s�f��ͮ��]�34��ȓٓ+s�fW�ͮ��]�34��fhv����=a�f�	��'h޴4{�(��]�@�w�ͮ�͡�+��|dhn�\�Ye#OfW:#OfO���n����kg�f����vhv�/��?9�g��>�#�ܳk���]�'��
?9�gW��=��O��~rpϮ瓃{v=����]���[�ٕY��{f�f�j�f�j��UU�ٻh�f���CVhv�WhV=#Ofד?2�d���E�LY4�ͿͪC����g�����w��Uuȓ�գ�ȓ�գ�ȓ�գ�ȓ�գ�ȓ�գ�ȓ�գ�ȓ�գ�ȓ�#ֳb�ǩ�pP]��<�].�ȓ����ȓ����ȓ����ȓ����ȓ�#>4�{����g����
9�dvu�3�dvu�3�dvu�3�dvu�3�d�Hh�W�W��.�'�+�%#O��H8x�*@��.�AF��.�AF��~�o^������ #Of�� #Of�y���PK/WUW��u�?�"pip/_vendor/chardet/johabprober.py�T]o;}�W��HdohU��Q��Hh��.��2��`�k#ۛh���1�D�v�`f��3c7��?�
�GS���i:��x�B��6MZl�fVn���&g��J�]*%"c7�!5N�#-�D�?�2;�d
�8P?e�2�c�ʲ�2^�����1͍=�3��sN�z��Q��]����Z�6u?|x����JQj%��>q~�o��r]yc[��7"Da��\���%]z���}��(������2�3���[�ME��d9��@#<	��e,��eQ�P�s�T{��;yx?]Ҙ��=k��f^���ˌ�c�v!�g��AHzBC������p�[�����ӎ�2�Z����.�]��4�	]���iNR�i��?@�F��F�f�����u�x�-O�k�$�t�x�Z8�,�w`��NI�++��!�A�"�ƣ�cP?-��4��,���q����8��2���AD�2�,f^2�������9{!�;����:T9m�c�Kl	\�]�G3TFo��r6�dA�=[����6]�����gQ��uQ$�7���e�2�v�g���؛7���u��M�h�"��G���|D��FaMIQ��e!²a��}�=Ľ�1މ��8�p/��y�[)���|B���4d&��R��a��Κ5�>�O*�e���G6e?�g��ʟD���j2���F��s��ֺ̆��v���J��Y�Z�UѦ�O45���
�P��Ե�) ��� ��V[?K����+�>�n���[���}����~����J�����ܞe_YMW��V��^#RBo*��/�/�pB_5�PK/WUW�ޤ���ipip/_vendor/chardet/jpcntx.py�]ms�F���_18��bf���٤N�%[Y[rIr�\."A	k�����@4����e}{o.�3=����
H��=�Q?�:9UoN�N/��Oo���F�>�y�.o3uV�7�*]��b���Ro����e��ݭW�,��R͖y�������闞��:w+_f��eq���X�: ��?��j��g 6/V��Z�e��	V��YZgsu��J�[�e#��mu[���=����['"8}_,�꼙[�����ټ��X�e~�vf�V{/܈Ro��z�/o�N=WN�ZՅz�X�����U��L���k�2�TU,����X�Y�Re6ϫN�sD���E����|���WsgN�u��wU��W��՛�r��W�*+�5����|���g٪�TZ��f��<u�(r�QDN|���U����ޟ��r#���~��ĉr��M�F�f�S�Q-]4�~�~���s��Z�����	t�>8X��L��l�^N�7W�rr���:8��~98??8����<��u��{��rV��~t�;o��_�?��9���h|ryztq����Ձzwp~yr����z������ѾRYֻ�qf����yW8Oγ:͗Ug���)�����s��<�r�(����M1\���^�dp�*_�UQO�C�;�8��:)C|'�J����>-].���|�D/�������n��=pk#�u�\�H+����QG�/�H*�vveq���ܙ�֤�����\�/�ޯ��;=~�q���M�J�y>�MKUe���V3gsz�,h�^�ﮝ�MY:�U��A���K��+��y�f`���%^����cqW�p�X��L�әK���Z��vw\���h����'����2�(_�M:��q;�}Z�<�n��m;B_��35�w�I�?�~;�O0�WݟX�D��bq)� v� Ilܛ�����{�w�I�ܕ�ѧ`%}41�S.�M���`纇�/`t'�������I�I���s���G���2�p$!	%�Y�6��10�c�R*%B	Ȩ�}��}�w�H�>�{�G��Igzj�j
AA�w''JRݧ0��z9��Ou�i{!C����"�j��k8����f�J=l	(�1|�r�}_!�L�K�oa�C�:�S�k9%i
�˨g����1~=b��5�@�����!�>"��Q���ˊ?Ɵ�j�,�1�OBh��gZ�h��L%�<�z�]�~F �uľQV��3���/+f"�k�`@�'�����`���m0߀�>q_���0�
�Fk��Z?|`�-Ȑ�v,M(Y�Vt��͗�A�3߲�3�203�[�GYIH��?�?�P�-����<FN>'�b,�d�
��a��q&i�H>��h��dr�#�,���UD8Z��t.�mI`-�0�I	���S��?�Yֿ̫J�O|�6WE�Y�(�P>:��dAU,�1 �?`e��ڷT���<�`��:F���H4?�O�t"�7�Te��Vkq���XۣA���o!�opB3��ܷ��Si�#$v��54Q*��J!��%ڡ�Y$X�=����-,�	l���H�5ε�"Z�}/�1?>�"���`�g��O���(�jF,��
���(��A�C*���M�Pϯ�!�ȇ])F���6c~��%�#��R�Y�@ %���/��3֍|Ӱ'}0�0��t��&h0�$!���B��R�8!�m|(�g�A����Y�� 3d�D��h!9����Y%�Y�����##̷�|�m}$���LC���ڏ�&h�-��*1ֲ/Z�Y>R����Q�@�!6�r�ie��\D~�@D}V���&P�vŽ�H������e,�0��^do�E�[<��A��!�#��#�{	̤C����$�����]e1�I�s�ۉ@��cĺ>�3?) �� ��g���K�F�ւ�|�+qΰA#(DjN:�p)����� �?��f���'+R�ͧ�L?B'�1V�h�	�	�DZӢ�K�(PD�j��"Z�E�#�g���
!�D�#�o}ͱ�o�R�x�#c`�0��X])�D�F���C1B���b�jcdI���}<���QC�I	,�Yd#ē�)�?RR�]Z��d��16v��J`fewa�0e���ϑF�y)|I��C���I k�!��H�F�@���b"`���>�oa}���h��\Ǣ��~#򽇍��%��a-�K@+Z$d���x?�Kz�2�b��mƿJ�1.�Dbw�B��-H�-?�J|(�v�\�|�>U���"�m�B�G�0t�̧2�YA��o�}.�<�w{�P|�c�Z�Ե���Z1�>�5V�MH����d�������8g��b��d�X��߂�PQfr#�{1xf@��G���lz٧����$�W��	�Qj|?��0q���[�P�D�#P��?��f����b|e�r��؁�C�`>�ӂ��d�‡Xg�<[��hk`I��F`�k�z,Ahkv�k�cw|��[/2A����n����o�<X0������0��}���]��g��A �	26#db�TM@8�f(���̿��'bI�MB�ˇ�z�1�3vsga2s�t��n�P볖�� 4�n��'�%�^�Ǿb,�1|,�%�p~���P�Hx[�S�[���M����q�bH����ro��;A�Ƨ>ƟXe�E��廁luX� Z�	Eaʠo����Z1F��<�A��b�}����b~��r�
I���d�l2�P�¸֧�R��Wm�36�tc�Ȕ����*�3Cu_�:�����B�X���Xۃ\	5��@���Q��Ѕ�X�AY�kҍ&���|��&1� 
!a�KH5�W�|YP$��b_ǀ�!
�#�7�|P���o<��X�0xG�r�G�cy�md���jc,<,�n�$��a����_F
���霑s'J��L#c�`��o,ꌁ����z������4OAo�x���#В�D[_#��qg�����X�nv"1��$��HI^�K���1@��t6$�Q�'Lr�zT��D��C�4_��"�K
�Iل f�;��t��3#�ؽ�|���t�J7�x��oȣ�_.9�
�yK/�U���Q^W��z"�_T� ����3�7�	6BD��QY�_��j<n>�sd��bg`�Ax��xΚ^}�R�����c)��k���RkP+2�
��[�Ϸ}��%0n}X�2<�]6�o�o;��|���Ʌ��X?�ؼiМ�x��$IC�zR�F�inAs��7�P�".1H���0�^�`�a�2��40��r�����eDQ��؂�5+|h>>�Bvb�D:����"TXaG�<	ľ����$d��E����/�������2�1b@C�i���<2��}-x �I,pF�:ɬQ�!9 �
����'�Z��hA?���?��Q�/V���Ō/�O{���šEl�P�C2�t`4�4�"��@r���������ȯ70��
�+��G��!
Mj���|�a9�;�[f]�H2!��z��?Y�jN�X�
7����Dxo"��4�$��c��`���=����*��Z�ݒ�*�>�1��@zb�5<q¶��2��o&P�	mKX�L|?c��c�3��f�߾��k�q�F�7"
�m�ľ�������`�Ȩ���\���B��h?p�HiE:#C"�!7Ɠ�mїtk`�5탟���Úa�E�ș�Eʰ&�*��.!!�0�#Q��x[5�mX;����l��D>��!�X��5��Zlt��LR���"�=%v$"��H�m��#G@iвPŐY�@�Šbr�%���T���O�u߆>e�C���l{�mO�Wgl0X}�>���{#�{�@Yـ�^g���ٙ-ӪR?���*����t�X�Ջ�W���Nώ���G���?�Կ��/�N/�:=�ō<������W���Go���Ϗ.^��y��(j/�=��е�œӓ�n���ތx��>�j:�Wy=��V�r�����N�U֩�i���uQ��i�-��]s��*��_f/�׉~�W�����M\e��I�V����]@��_�]/����a����Ə�e������ֻ{���ӭS�j����e��E�jV�]��jҽ��ٞ�8���j���7��O�\�-�R��]`8���jܤ��V�l]��k��׋E�6֪yCm�~�aZ�h^��Μ�����&8ͫl?��u�k�-ܬ���&f�>����&��6:4���F���e�9/�U�.(z��^ŻX�7��.��v��:�4��f�w�W7IWs��l�nߪ|�V �:�V��y�
[��3�EѤuʴ���s?�NꆛW ?^M���N��
"�s�v��?eV���hڸfX�Xg`Ҳy�w6���Bt�a��r��}Kr}뾸����j_�8�U6�qAQ��� �u8Bxa:
xk��6]\ }�������>M��ƖpN�U�۬���%k��=�-��}��f�����^����i)�3r�S�fg������U�\I�HZԾ/�I���S���.��y�&�$��N�ckE�e��◉��n��,n�Y��+�ϙ���EQ:Oβ�?�[��=��Tr�G����6�&�BӥK��؛���s�G��\90�V�jϓ��~����������CƍQG���G�n-̥͟��ة��-��f�^��ݰ�n��1(1�
�H	?��%<�Ӱۆ���y]f�-���b�A�\}�
��
;d,t���:��f�b}s;��u:��X^�s̽�
�p8w�-�y����e��/<�^����6l�.g���j��VE���ا}S=&�8�[�>�`D<�������^A�Q�黦����MG�]��M�7iJޕ��涌�㋟O.Xk�;�2o2�I��ڑ���>���sB�6�3LW�]�B�\�>9��:]���7G�ND�H[�aۦ�����}��b�K��`��G�����1\�7�b��?n���7�-�^��&5���DW��n��Z����E�~w��[ѯGQ��!�R�=�׏]T�Y��ҏ�$}<��ᄈ��,(���x�i�;�j
]��`:�	�"��]��T�Yͅ���\a"��Z���QR�P�"����Q���P�7)|���w�=��7���Q҃`�=%���-D����S����;�I,ۧc�@?�PK/WUWsJi�_r�)pip/_vendor/chardet/langbulgarianmodel.py�]�Ev���({�ʬ��d˶$[�X�Ev��.D
��vw	$� �a0;�:��`�}���'ȚGГ8#*Nƭ�;ogDevu��(**nd��S�ވ�ccx��>X�a����p��w�6V��6O�����7�������ƨvb�vf��¨(���ё�JuϞ�j�}��7����o���]����j����o�}���3=�n���|�-�.>p���#�n��pm��Z��wy�V��vu�j	�3�fk_�>AO���h�?DO8��S��DO��~��^��uS��i�E��iM:y��u
�@:�j�E22��H'm
�LZw4�
�I�_�N��JZ����d��i8$_�:iM��
%��7�HH'o�|�ۤ2'�&0�oLF�[���Y�d����>�L�&}|H�N����4����dZ����h�S2����A��I-
AZ�AIжn��#���&����M
K&U�ߑ����I$��kx)AǗ4�'z|�X��t�����,��&�<H`=y����a�Q?B`��gd�z��%ѐ�|���'��?A:�ݘ�\[wr�b�{���t|1�����I޸�y�F�h탼�w6�F�l�����
�l�7`��� o��
x����
� o���
� o�y�Dހ
�l�7`��O�7�i�j�7�i��L�7�i�����
8y6��Aހ}�7�\�-X���ک;�Q7��l��S7Zԍ�u6��ԍ�٨p6�F�٨��Q7Z�
ؠn�u6�_iP7Zg�n�u6��A��\ԍ����A��i�jP7`������#u��A݀
�n�S7ZOS7g�nt1M�a*u��n�uC�ԍ��t7�\��'u;�݂^/ΰ�6T7.�A݀��nu����n���p.�]z궨n�6�#1��3Q78Ƀ�N�L�yT7ϥ��IՍX2��t�N�L,�]dS�<�ĉ�n�S7FbP7`��e>�N,J��ۧabQ�<��̑��2Lx���n��m�n'�	��F�w&�Nw�=R7Ku��l�mq�-ԝ�v��4u��v�S�N�_����I.�v�v'yJʗީKp�ԍN樺�I.�F'>�nu�c�Ң�-���L�$*=R��킺����n���S�>�nK��<�-���1z�n�^7�l�]�m1L,^7�0�nu;1L��n����f�)-�
8S�	Ou[t�Cu;0Lv(u;Q�h�Eu7�&�
����n���Sݖ4%��#M��˓�D�\iJ��v��D�L��B�h�)M�/�_y�%MiQ��i�t궤)�&`�l�	���gKS�T�-�u�sGݸ�>�nu�n'�	Z��0����B�h�����_�_Xx�p�4%��#�P�<���m�n�a���nm�N+*M�Du����n^���u�u[TwiJ��f�)]�nԍ/�Qa��f2Lv1u�T��'�M��{]��.���g��A�N܁ټnu`��W���L�
��Vם���f�n|����e6L,&`�\�	���tB݂�.ΰ��ݔ�p�	��ӔN��P���I�ң���0����U����b���nP�"��n����Ł�����w�a����u�Ҕ�0)�a8��ͪ0A�y��b�XҔ�nuݬ
lW�Y[r,��B�N*L�&턺	�l�*'ԍN�X�]u[T7��ĉ��u;Q�<�NWݬ4��.�n���K_�KS�,sq�`���i�@�<���Fx'��b���4�?��u;��fm�w���)KO���nh�M�dg�a�KS򨛗�,=u��HSzT�.�=�,�v��Y��Q�`��+Lx�	�l^����3L�Ɂ�2J�%�B��ͣn��W��gK��q_a�N�@=����>���%'��:���ؒ8�&h]ޓuq �*MY�Ē��Q��0A�9n�����)y�Iz]���n�G�C_�Uw:u{KSZT��0�Q�Eu��Ӕ��P�.$$Pu[Ҕ<ä�F���0q���i��?M9w�{g�t@��I:u[�n�i�nK�Ң�}Rw�Ӕ�n�F�	�q6�ۉa���Pw^���@'��Eu[�iJԍ�yvS�&�-�	�U,����,��Eu��%�G�N��v����S�.*M��Y��˓�tb�8�n��I�,��E�@��0qb��W�2�0�&<��$M��iJr�.�Fx^���_����o��P7/M��u[Ҕ�T7oKNz��Bݼ4����Ӕ�Ł��nt��80=Mi���U<��g�XҔ��U�hÄܨ%{K`�˳%p�)1��
��ڒ�P^7��;]u���p���Qwy�n�a↺u��ܑE��S�N������3uc���'��MY�f��rP�N5L
��>Ä�z%;��<�ۉ׍��&�s�nuW���[rx��2Lx�
8����C_k�1L|�)[����c%{7��.��vb�X�p���Iy��������&���g��/�[W���ɻ�^0�F늺�c�{���u�*L�
�ž%�'ucx�B�-9�Y@�&N�nu.��W�-��(M��P&;Cu��7·uq �=��j�I��%M�ֹ��I.�m9��gq����Rh�0�Q���@���ܨh�Z`&�m�E݀KK݀�/lk���ޏ���n^�	��-��	u;�-�mQݖ4���w��P7f*S�	�)u��LiJ��g�X��c��T�ͣnt�+���}%�(�턺y��O�v��y����y[r*�ε%���Y�
8u�o�Oߒc���w&u���8P�%deۏ0	��W��V7������07�JtO��7S�$�[��
8S�	�Lo�a�`n�َ0<��@3e)ӏ0I�4�&�ӧ�
�`n�s6���܀}07����z3%Y��8}�"�}Rw����Gݬ�-�mݬ3_-��颛w��Et�N�J�n�&�~	��AS�D9���[��w�胺�^J�X�!�yvI��efn\��f�t�]ds�Y����,�man��v���v���+
�07�l��
����C��$�ҝ�]��HݻBt�S7��)/Z���NORz��O�&���>^���;���@[�d�U~IE݋Nݠ�L~�Eu���bu����n���:����-IJu�T7��@'�ۧխ0!m'�V�]1w9�۲�_�Ҳ����l��{��s��$)y�q|2w���,��/��{a��"�ө�痰�n�_��+rXEݬ�oE�Nv��<�����^��VB�d�T~IEݻ��=�z�/Y�]�_��R:9���+r„��"qW_�cn�v��0�e;�O�l���ܻ���*�.#s��/q�r37~��II�C�T�{a�۲'=I颾�w�Tz���	�Bݖ7�pJY~I�kX�
��Ja�IJ����/Ѫ�\w�~�e|ԍ�TԭF�p��*
�՗�o��Y�.�Kv�~'~���-���{)�Tu��n]�M.pQ�I���R�����&%/
d�_¢��
9T���-����B��Ġn���^�f�^I��.����+�='�f=5�,���Ģ�l�I��ө��6xu;1Lv�^Jmu�KV՗���q�Ṷ:q��bu��RZ�{�(�-V�����D�%Kiݼ,�O�퓹��&�ڏSz�4wV�~�E�/������/)�~�@��!���u/u�����IJ�]����$)�~Iy6�[D����䥔t�+殘{љ�,�{G_�yǂ�%Ot[��"�Kot'uә���b�Eg�<�Bs���9vI���W��FKkt'[��V�]1��37Ks�`��l�/�A�<��<G��A�:[�Fʊ�+�ƴ���@����m�t��]�N|�(���	5u�i�TwE݋N��9J��r��’��*�Iuc�/��(yg:y�o#����J��0!�W�����I�Ս�3���/qa�X��;8��AyI���+/�I�h��W�ԝ_B�TwEݻ��K^�Sݬ���UwIN��U�N��yݼ�^A�^�{
�&U�]Q��n��va�XҔ.���Ous��
8����0�n��Gݺ�������8��f&�y���oQݜ��t�v��y���0��n�ԝ삧c������Iݖ4���Y��#u[�n�6�p���骛C�>U��0��nu;9�ۉah�MS�)+�^����@���@;r\:��Zv�X0�f�nK]����iJ�uWԽ0�
4���Gu�v�n��S��A=94.���Q�Oä���t_QwE�C�՝��b��vSZ��u�Eu�Ξb�)�
|a�_Yu�<��;{ʢ�y&N'ŁArV7�:�n��v��e�X*LX�=w��B��^�ãn��S��ZvS�T�O�n�ӧ�*�]Q��S�?���y���
Թaԇa�x��B݀� '1L��p��wWܭ���',
w߻g�U��Sp��J���Z�v���F��Y���V+����??��k��Fo�6X;S�Ϗ���0�66�3���m�I8���Ξ�֮Y?�vzt�7׮U�����S�ա�lX�g��"?([��֕�g��pm�w��&�}�魯���;�ڿf��}{n9ql��iu�[�o;|��8�|���/�zl���o:^�_�(�A�n��<��'�L��
��p�6���mN��	ښF[�=��'��4�4A;�hg�v):R1�К
\S��)��Vp�v��@#4�l���P�tp&x:�@�p0^��8�N�j����I�c�,��1j�����y���D��Q]Q�lD�f;4�T�Q*m�0�T��0�T�ݐQ*'�����HaM��UX�`W)�M�?V���Da��@a]��z�侨�vר{% ص
�q���h�0�u
�q\�0�
�q�Pa2喨���L��V�`j����5*8hL��V�`ji�ZS��&�Z��%��٢�c����������
��c�Չ�O��T��0z=�ZaqKK耂�0��tPAq��:� �u���ݨ�8�%�M�)Ŧ����&���қ&�Ⱥr�~��8�%��[$�Ž���Faq�ɿU�p��j$�ǰԞ@G��UzTAq��c��E���'
!tTo�0Bg�WXBW�턂��ԗު ��T��),�������UP�y���U���„��Q���!$cP�O
�K�F��ɓ
�k�_F�ҿ*����
����),���Ƣظ��V���+��u<��qm5+��0����a�Օ�î.��@]�3�z��O�	0��������S��ӭ+�.�bQ��V��U��}O�8\�Dı,��9&�U�>�P�o�w�q0�7 ģ����&np��$2W����Յw7@����{�Q��?P�$���
o�@��.�K�?�5v/@�� }��<��uvȕ<y��#�n���@�4�db�G����
�!��oo�و��&��o�֓,hg	����"�zo�\<m�:�p�ĩ�x!7�
��xq�I%P���j����=(A]Nj��� H��b��2�x����$�.�_*� �����*!H��b��R�x����$�.�_*� ������!H��b��r�x���B/�_*�PNj��*"��b���u���&Bo��E���7�u��<y����"T��T�I��*B
�D���	�.a6`'<T>��ࢇ��H>T�@��"�R��7| �F�P�=
T�����������Lf
&h �G�D<T��x��q"�'�2o�@��ĸ�G�D`�(
�I��Y�q\M��8,���E��ǟ��4��@h�.�ED�K㈚�����0!��n�T�h $I��*@��6�@����@��E�9gL�ED��7�5�����Eo�#�ch �I�0@C�N��g(�I3�@�O0�w���84��ϿP�����8��ᜆB��0�$�^|L�F*�4"#��|(��R�(�S����BiQ;:Byt��I—�C ���h���P��
�L����
�X�}L<����)��
�FQ	O4EG4�%jvᇆҀx��u�@š�4��PZF�A(����b��၆B��4Jd	�s�" �x�Pj�����46t�B~��4ڣ�Z&nh(�G�S@EP����@eT��qX-\�gʛq=T�c4MF ��h�*.Xu�Pq�@-cŠ�T��K@�O0��/�?�0��%?%�@9S��U�T$�c�wO��z�؍7����Y��0��Dtd��_�F�&���hy�w��o�����[{'	���ڙs�3�?<�z��1譩\
��+��峽�����;���Y1�����Go�z�pta}p����>��w��7����~C��m�?�d���������`y�?���V7�����;���======�"z>z!z1z)z9z%�e�j������������o��F�D�F�E�GDFEG�D�F�E�G_D_F_E_G�D�F�E�G�_�7������C�Ǐ�6~t�����t]�g������'��_8A�+�r�+g\b�3^9����	V9��r��ج�qV�U9���M�>��'%f�|�㖾r	��|�����KZ��{�����-z�����r�r	��|��:\��G<��W��t��h�!`i�i�k(�XHW.}�(�aD3Q>����|��Q>����|�'?�a���R2���h'a����Ll���A����&�@7��XK��`\�V@��+��4JA�̆�õ�Bex��k~�c��;�k����Ok���ٍ��pbu�5,ljэ5�P�܉K?ms'#|\�`��g���5�����ނu(�B7�0}�`訑ma}�%7���K^����]��jҶ�}�\nܨp�'.����������������@��F��BI,ap	)�Q-�>(Ÿc`�=�'Fu�8H�Oޡ��g@���9P�m}�I͞��V��$�n�-�nwbm}4��~wb%9����;e������Bjc&� -o3� ��L
A�����������Pf
AZ�f
aby)iy�)iy�)�x�)�x�)ix�)ix�)ix�)�x�)�x�)iy�)iy�)iy�)�y�)�yϤ��I!2�B
d&�0��"� $�L
!�?���� 3)�AfRd�q�B�{���� f
A*3� �f
!���0S2o�d�9RRu�)�{�)�8fRRo�)�6��t���4����f
A�3� $��Bh6RRR_�)����@���`�&�u"� 3�0����f
AȊ��3)��I
AH���P4�p��E���V��l^/:چӝ��ݵ^��PK/WUWIC[���%pip/_vendor/chardet/langgreekmodel.py�k���y���`���[K!@���֖ŵ�d�=�e)-,�^-�\ʖ�u/ő�u���؎����!vb��\�~跂�����}��S�;���h�w�x�`0�oпX��m�<�o���]��ၭ�꿶����Tz7��a�to�Ǖ�(����x�__Y�[��|������?�+�z���W�vV��Xǟ�+'��ݨ���SG���9v�����'9VY�l�T�5�fە���>_$@toK��w���>S[���X�5&mw~�:w�:���\o���z,?��f�<�Z3�)�w-��f2k��m�Yֺ�?c�tc�9ֺ��3�������ٞ�b�E�I;�_b�0�e�	�_a�˯���&_c�Y9�3�����l�!~����y��d��wc�a�{Lf��~,���|�Z���ɱ��
��Lf��/��:��X���l�>e��Z�+�e{��X������&�c�%�Y1_�k5V�f{�Îz��&V�]��h�~��"�b�p,�G|�C6�z�u��GXc�A7�яX%��"���cl��D�(7�я�̪�1��-�?���4Z�X�0�Z[�\�![G�a�q�\ ;��0� �놝LW-�-�';X�]�a3�0�m��Ê��7�R���LW-�-�щ�û��f����M\������9���0�����͊È	�v-���O�0����p�G;FW�Ð
��ؽi8\��0���aw
�I��|F��k�pX�n�&�Y[[G},[.!pr��P�����rq]$9�N���9\�s	����0N��!�8�_�Sq}�89�a�)CNqr�ÐSF9�8�NR���0��!�89�a����a�i�0,n.��$���8,��0x��0z���I�&��Ì]�s�B~�{�Ð�a���Ѻ?��Z?,̗���0�\F��0�.���y���9�s:����ڄ�R�s���a�F�8,�at2C��|���?,pXx�����2p���KX��p���簐K�C��Â�l�0�EqX�����%�8X��0v�C^V?����0�Nq����S�p���a�|����\�s:���0Z��0�3�F'�p}䚷�cSB>,��=#�a-g���|	��sȇ��|~x������8�˘/!<�C�|���?<c��|��HŪ��%����֬�K��s�%I�o��.�9]!���a�s	\zS�s��N�ð���q��\���K�qXk��B�M�XX����K���2s�B8\�F�S�[+�9]6�yN��Kㇵ8��u�a-g���3|N�M��.·��z~X�?l�����͗�N�F�e�����I�����4��x�c�.�p����|	��!�����D!���a���4o
��y������p��M�����r�qX��B.Q���t�?,pX�%�8���8f��];o-{��n�^.ўp�]��ÆsxQ���as���a�|�?�֋�����a�frx�~���"8��f���~���5C�?��ާ3��a�ːK��a���a�C�j�����:]X�%������aa����8y��q�%��8�8y��g>_B�%�F��V�s:��8`eg8X/�|��_��sx�Z��9ݢΗ���z�K�0:Iqr�\��%��%Η��0J�㇅��
��z�0ZO�^�^.��S�p���]y��aa�p����̇�0X��z�q�⇳9\���p�~ؔ\Œ��	�^�K.���q�Kl�8,��9pX�%�9_B�0dcח��p�% ����4~X�%��p�s��\���q�?����õx�0��dg�yA9��ḰÂ6>�(����6�=�s	�����ur	�|�lޚ�a!���avј�!����0_B��}O����	�K�alr�\��9�ṄV>��a��?y��Kx�wB��a>��ց��Ð�X^�9~X�%?y��֊��b�[+���Kd��8�7_bֽ���p��%�v7��N��G!~XxN'����z~�0_B�p�~X/����s:v���a��_X�0�2�OWH.���2s	c�0�e�%��0�)�a�S��z6f�a'�0;���k����8��!��aȻ1�8�P���9�|	�8��%|�r��q@.�{͐���k���a�Nqr�Ðg燝x�0;���[[��0_B����]$��h<
�?<sgϗ���a7�;U��c9l9<���!O���T�D�Khq},�B�q�g�K����9i����.�p!~��\Bx����h�rXX_B��h]�'f'���-��z�qh}���xX�.!`OmsaXX�g�Ξ.1k����zvX�5!���[c���ÖærX�,��a�.�u:�1M<,�Z���-/p�g�:]y�vr���8��Z�Of����qr>g�a=~�g���)~���!�a��B,y�ך�8�`'��尩^�=�!�a�C^V?,���a=C���x�v��x�b�Tv�������J�����f�^�xX��KV[�g��s��a�aS9���Z�^n�MY]B�C-�cZ��at���N�9.��6�ÐM�=���}�}�p~Xg�p���v�p:�g��k��尩.$������Ø���&��f���E���[��BfKd�a�E����xX��)vXg�Ĭ��2��;��a'�-���Ö�K��gKhqX���3{LW�֊%t��c:��zE*�;�"���X[[G}�՛�Ł���0��p�G�
�p����acb	'~���]�a�KXO��s	�C64�<M.a���{�C��&p��\B�m������%,�-��>ʍ%���yJ��3zJ���"f�gS�p-��lTw��6��v���=�[8\���ő�m���l���6Ð�Z�'���2]!ֲ�%ΖȞ<��/�	k��ӼL7Yj��u�æb��Tb�nX/�0<�TB�p���ܰ^*Q�d	�%~&D�Cb1l1l1�Q��f^��r�:sք�f��-�
�a���T�oS	�aS9,��퇚+s
���wi	�e�ÐKx��9�0���a�aS1����짬n���K���Ҧ��>.��O0��1�Z[��[R�"�p!Sֲݰ�a�
�Yc8�
�py6�
���lϭ�6�Å�a�)kE��z�Cʶ�”��J@�m+K�}IH%;?�c�h9l9l*������a�7��u>?��I㑞���a�3�e�a���M�b9l9�`.1�
�^YB���a�a�
?�8�`��6��z���G�����pds�Bg�!!�@���g���-�-�M�0Țo֚�A$��5k��|]��!=k=����P)��ÐK��LǺ��6�Ðg7{X��&pr�ø{L��.;���s:c�;�z�{NW"���Rk�����.䰐K~�ĕ���K��y�-���%?�7_�ǯqܰ������<Z���z��8�.1���ٹ�!�K@�k.�������5��ކ�V9w�;������BwXY�U6�Ê��5��6*�A����8_���ѿw�Pw0�u��9�/
6"9�r��ų���-��6�
/u���ƭ�m�ߊ�=�Ug�ʃ��Z��8T�W����Pc8��wM�!��r����v����u���[��{��'�=�q½�=u��]�C߻�T���9UY�lG����7�3�����8I��nRu�j-���j=��Ǫ�T���H����L�ͱ�J�����*��g�^��
S��%9U�9�k������6�j���dq8Y�C#�$�sh��vR�1v�ϡAv�5:4�n�F���M?���MV��@��*�6ɩ*��&��4�n�Jm7U��_�*i�k�*i����#BUH�1�wH�3mi���`���d���b��֎�=�����*kw]+�n%�����:��4^�m��:����8@��;�EuЭ�N�z�it�zU��i�9L�s�s�
ԘFg�Wg���[s���L���k2��H������=�x�1i�x��Əǟ�Əǟ�Əǟ��Ѣݻ�$5%�J7�;HS�~�D�C��e�I:LRXE�5��*�3�������Nc�%M=ŭҞ|�4u/v���I��H�9��4�QV���H�hSw�H
�h��'I����ia-�xO��"���}����� -����)��Z���$�%4ho�&)�����qph�IZXB�6p/I�0P��"I��*iM�!uP�ߐ�O��%��Lgΐ�Ϧ�#��MO��;��H�h�!��2�t����@���^5,�Eg����F�ix&��Bgnwհ�6��yha-���*4R=h�`���������:H[��
�����}XH�6<1a!�m�4ig6�E�5�'��"
v@���-ha%u;�n�Mjw	��4�$>1:�h�AQDŽJ�M]U�@TׇC��!�sk"?��"?���O����g.7q$���>�dvw?����`�W_���7��~
��h�2�ZB~r=!�
�KȯAnd�^3�h��l�N4�v��ո�d�n�Z�T�j������<�d}/BN«/AN�0��c�4d'!?9�D/q�M�ά�K�gB���fA/�MX�3����M��#P���~"��v^��/��7��+p�M���9������P���y*w?;�8MV\\r�ߴv�m�mk�2�dtp�h&��*/�۫�BNT�ˬ���#���>�����!Gy
�N��AMT�	�Du�BUI>q���E�D����M�� ��5q�<1QחPú�[���J�Ea���*�_�P����~5� !�w��,��ò<����ut�k[��:Z��V���pd��h��O!�U�S���\L<"]Wَ��{bXRzbX
a���G
��"DU����ė!�� �Q�hD��rul��)�8��&�-7zR��^GS�a�߀�Tǖބ�ν� �%y�0�U&��azbX�����ŌW�P�qq��2"��$؍�����R���(�CMBT�7\��/�zq�4
��!��)�	��
I=�s�����u���W�dA���AT�i�CS�`�_@T��}	1�H�W�z��kh�C�o ���4�~]e7h�����l��A��*��CH}]�4��"�u��1�5h��ԧ5��c`3�!�c����*QO=qs#w�"~��[4 >1,�Ic>�7���Duߥ�Dŵ.���K�Z�
Q��<|�Xe�r��q~ݿ���W)�ix������R�-���^�W�<��X�?��_u�g��o��q�R�|��G�?��u��N��:����W���sQ���ݱ�O�����f�\w�����
{���ʢW��-�2?jt��ov�[�z�κ?T1��w��[��o���g����z�h�X�x�Dp#�I�d�T�t�L�l���g�s���σ�����W�W�ׂ׃7�7�����w�w�����������_�
>	>
~|||||||�ftu��ã���]�h������n��u��ʝ�OvZ-��i�x���o�x���L��6i6޶�X��^oo��܂�I��[�<��{�'u�oՠ'}L�=idZ�i5�'�L�	=�eZ-�I3�jCO�ۅ��V���W]=U/��z�^\}�T��z��6ƿ�����'�mc���z��z��6ƿ������1�^��6��K���{�z�/U/��KՋ�R�b��T�/U�����<ix��A�v*�;����'G�@�ۇ?�<�D|���B��8�ڍI�'�%e��e�@��c��j�h��o
]������M�0����8
�_PK/WUW\8R���&pip/_vendor/chardet/langhebrewmodel.py�ٗ��y����PI(%�B�L&��Xt��!�0�N��
��=M��D9���gk����%+9�$�-�3>'/~'����.�R��4�S�"�X��
���E����zcg�sd�t0ޚL�\�6�n�#��������r0m���L��ƅ��vp�,8���`vf�lol<�hm|c�;����?�G�GO۷��GO���'�h�lpu��8u����=���̹'O76{����k4h���êډT1W�0U$�V���D
X��D1�s����m��u��'G6amE�v�ڦ���Դ��"m{#U����.�z���_���K�_�n҃�뤛ʟ�������N;��)�H�ʟ�N�����~��3���?a2���#�k���ݟ���S���t���J��_Y�i�ᳩ�H��Te]<�>0��Ti���8��!|�����.Sӳ$���/�֬��Y�T}�5fu��3�56J��:k̺~��KZ����&�>��[Lf�6�Y'ﰾ�P��Z��z��NO��}&�j>`�t�r>Le��G�q
���
K�΄��{w��N	w���V��g���l�=֞�m�c��g���I��8�N�/�loif�\f{�������ٸ���f6ZW�ِb6䥘��%3[�ٌ�zf{��|f�\f�K3�s�^f;���
uM|vq�N�Y
�-�w[
}��4�M��|�����K�l�}0�
�1�xf�X3f��a����}�2�_�g{>;��&>{yfk}�p�v̎U��5��	S��ى� �]av��4���s����l$�g{����F�
f;��=W��b�-����0��<{yf�g������l�l�1g���	���Xf/�g;��M�|�c65���N֍0ڵ���z6R�u#�َ����M?����3H�5;볋b�[��=�q�v̦Nj��/�줽��$�f+��� ��Sc��Z?���l�l�^���$>���*yv������/�ٞ�َ�8�l���k����V�de+�g�m��E-��Ƕ�]el���ƲېlC^d�TېlCV�
9�m����G�P�6>p���lC.b[
Z/����rjA��-a[�g�>����m�ڞ�=�mm�y�u�6.���i�m�k�A;�kA�hC^
ڕ��F�6��+�����}�Yh{�����m��9m
�5N�H�W�f�H;��9hW�P\�m�P�m�xd
�-��w7�i���+
m��Qd�Ɂr��k�3�pОO����mt���PhCV�
9m�YhCU�
Y�6dڐʴ!+І��6T�0��<�DkڐhC^�h���Z�6�,��*І��6�jC���#��4a��6��6Ui��V�Xpښ�#FN},�h��ﴭ����^���&v~�;hӄ ��V��8m
��v�K�4І�jhk����#fK�4N;?�6r�X��Lv��]�%5����N��G�z)h���Gl�#F���#F�nA�(���!/������#���#Yh'"�E�Mv���ڐ���
�m�i9�L��ik2m#hk2m#��m͒?3hk��&�F�Ŝ��F�G�����A�&�A�A�4h�=���8m3h�o�,��L�]��4a��G�@[�������#f��ꑵ�G4N��G�~̡�G��Mv��6�Ŝ�h�ȴ��6Z��?N�*ж�8h9���#�BsЦ	s��8m�Z�]z<R�ꑪ@��i;h[������i��͠]~<�Vo��A��N;sM�/�ro�+0I^�/m��UA�im�[��D�6�
ڐh�ڐh��8�Š
�(��U��·�&���G�vDj��V�T���qЦ	[����6:Y
ڐ˴5��-8m���=��6��#rE�=b�!�w�,�V�i�A�&l�
�.m���g��k4�6��n�5�.01��Q<���&�m�x�ښx$��G��#��w̦�����̆\D�
R*̆�z�m%1bv~:��
�!+̆����
�!+̆�0�B+� +̆�e6T�ِ�̆�0��l�
�!/�����lȋ�#h�0r��PfC�2jA���N�g���#�6e�p̞�]�]f#_�ٸ�֗ٚDۈ�kG�d6��m
�5[kJgv��j0�O^���dg�i¾�~ա
T.�h��XI�5�:)�hkVi����)�hk�i�mek��c�"�vՂ��	GD������4a�hW�iۀvE���&v#h��m�*�"��qښD[�J���#�+�������/2�f[I�5{�!��hk�YY:�F�.0��'�fk�BV<�֥#Em?����~���6�]�S������#.�^��|
�a��SH�Uev�>[��Vmv��;���#�y��X�I���F�8���X�I��7�A]�ZVF��1���"7�����M8"Rh��A�&�bkGV����z�uzY�D[�5k��CVe�ȪC�֎��;��i¾D�]�ǐV��^�iC^u<��wښx�th�;m���<��D��
y!h�oa/�1�-��0�}�c6��:F��m%�>�KG\��"m��"�t;;)�i�j��r/��@�W���h��kG�w��m;ء.����kG�v�C���C����v
m6��4a���
"m�t���#�G�6ґz:�"���HG�D�EC;ѕwE%�f�;f�|��1$hV7f�td!fW;���J�]�ǐ��.�H�w�=��U=��+��@^���#P��jE��@����~6��k��@��nHM���`g3�M�U�E��h�����`�x8�1�fW�hW,��-�l��i�V����2�v�z?#���+��!+n�5;k4F���ȥ튭�"m��i��c�zn�tN��N������v�+�N������6MXŶCZ��fg���v֠�U���8hk"�@��v
��v֘��8��m[�!�x�
��6Mؗp�V����a�*�m����#6�]�=�f/���A�OD�qtЦ	[U<�2��2m�����V2m�^fk�Q��>
�Z�ɴѺ^�6z�H<�s��7��sЦ	[��#f�Z�+�ּ�O㴋{�_��͋GV�i;��mM�-�fムqЦ	[��Ӯ�ӆ��ӆ\�M�PKtڐ��Įq�h\�a��#��6�4a�贋|]TU��&�.n�كH��ˏG���v��Gl<�̇vMV��N���M���G�;���v��Hš]�%�y$q��>�L�͊r̦��"f��̶�xČ�@�A\<��˴!�eڐj���[�%���=��U�yD����h����A��l����ƕ�@�{%�]��.�E.�6����#6ґZ@[c��ײ��ț����reÑ���#F�v�Cf�6���#����h7�M��#��E��}Y������r�^=�֥�z}��L[��t��2m�^f�ѫGl9mSj'����/�������K{m�Km?��~.���v��
���k �����ޚ�G��5��H�V7���%���R;�kj�\jG�u�v�>�ҽ�f͟�kC���F��zm["kB�NJ��-��v	I
�m#!1��P���vu����$�kC�6�۽������6T�)�<!�Z7jC�������S����R[�YnB�Om����'$��5�v�׶Am	�:ymMBb��f	�����XX������i�����8�j\�6��̂�ncvm8kl���ɬ����qc6�ƣ���,�5��}t�N�����+�ٍ�8���۽}��d���΍�ٍ�l4?D�N�ݸ���Dv6iܜL��(��H��!����lu��<��S��pgG�������ݸ���'�]�0Qq�S'��?yqp�ԣ����;���fc/90�6���EVs�Ϫ�\mf��\me��\mg�\�d��\�f��\�e��\�s��D".�E"��R�e�����e3��B)�n�B��I���	p�:A#,��	b���4�~v�
���Q�(��
���?A��g�4�~�J�'Y�����TI��+U�h�J�䀚J�4�M�J�f\%-_k��d���b�!��L{���~��.������~�:|(1�I��ZL{�4^����c�x���x�4^��x_!-��XI'k��4:S���4m��9��
4�Fgg��4:5�]|��lw�F'e��4:#�|>������{�|�)i|>6I���g��s�|�iQ��\z����>���UѥV�I�����IQ
}*�$�2*�G��$E�s�1�����)��������H��GЁ�%i�^.�3�NZt�=�N�$��
?CRt�}�Dϒ��s���t� I:8��H�
�u��y�����IQ��q���{t�O�&
�G������"I�N	��4i�=*�o�#M�����4~�=i�,�t�D~�i�4�&i����/�$-����	�Q]*� ܏��dsC�Eet��
/*�E��[��ѥ��}ΓsA�]�&'�>���
�Z<4|�1*�O
���Ѧކ&�{w��ܷ�;�,�.�	�����M��"��oA�*ig+�ߢ܅UҢ������M^����ТB�tJބ/�
�ӵqZTH�
�
M�N�Q�oC�'�D~f�3D~j=��[���3.��b��==�{��{�� K�ҵwv2�VI���w�U�-y�x��=U^389��yrT\KMb����{P߂*��:�߆,~�Pe�^��'��
�뫕�Dr?�E�F���}^����ESU��y�*'�8�Ԩ�^2�/�����/=�@��ku��5*����P�	���|��4��/@�wL���ƵQǿŧ�ɕ��{�q\\W).~�
�{���;�S˹�$�^��TUN��Α�M8�$�q0�B�qŦ�NjPG�@���P��Ù��ǐ���X�UV��i'�t���P�{
�GP�z�_̅�
��>W�Ty^B�O�qq(���n2>�KH���1�7ĸ6�@�a�~qyI� ���jL��gP����Ti#�rDыKÁ��,����'P�y؟�S��lB�TY��}\������o��I�D��*/9��K�r#���M!�E��9DYN�_C�ۓ��SHѦN�v
i0Z؎����G�t�*-���IDŽ�SH�Ѥ�E�)���!���� ���h�"��x���lt����Y����A�
j<QP?�O��5TI�&�ށ*˂H�/mG�*@��Ǒ&5�7��.ܿ�O�J�cZ�O�����Ϡ���?�B�+��A�������
-ul㰁n�g
�����Z=U�k�j�F<U�ࠣ��ٗnC���^M��%4h8�~�-�>۩��ُM]@���xw>ė �$$�e�,�~Z�H|���A|
�􉤽-�;�o@��A�oB��(��xk3�-�����WT�%����Q޳0�A��N��!Ʒc?�(B�!�_EH�Z|�"��U�����ſS)�l�gL�\�1'@/�밿x�lp��3�Q�s'N�nl6.��W��c�g�c/�3��`���3����xx=�<ts4ޚ��}D�rh��p{8�zcx5��S��ip�d����`2�
���Ý�7��7�.b��~��c�㝷���]nv&�����`0���w��ky�_�=;����h��d���n0���ε��`�y(�N�\�|�B�b���{�K���+��k�����÷·�w�w����Ï��������E�>��;PK/WUWCcU��)pip/_vendor/chardet/langhungarianmodel.py�o��Y���S2`l��z�
Ȓ#)�VF�b�e�K�f�ݑ,E�#�'�q���'$����bg畿�>	]�TW�q?�鞞��7��J��Tw��έꚗ�Ƿ{ýg��F;�g�����&�\�w0��폯
���{�I��ptcw����t��W����c�5�������� ��:Ѹ0�5ؽ��<Ѹ:ڥ?�����~��ع�[gO]>jk�©���/�y�B�d�F���'����z<HOͫͰW��&j�i��N�։���3�(�9����O;=�lg����9GMڞw�
l��8m۶�g��&�z�i��v�Q�ڶ�:��%GM~��X���o�^qԎU_pjK~�U��dt>�mY�wU�~?�y{�(�n�9M�V��Mw�QmӁ�AR��N����M����ڳ��i�t�DM�V"&'g�9��4�v�֊�DLn������*���{������5�;N���u�JF�Ӷm��������E縒�6}����b�e�9���t���MG�%�םND"���A"���s$�8r+��uF��Θ:��wd���Nd"�v����N�������{���S�4]��U�Xy�XB+bA, ��d�XBKbA,!��� ���Xz�X@bA, ��@  ��� �*?��� ��XA� ��8� ��XB�I�b��@L��I�1�s V�$ρ�:�1�s &y�$ρ��9Kb�� �}0�Q���A�1���b��K��#�X0�,��s@�p�b� ��8�b�A,�q���~��I��q�@��눅�#�ф,Ă�Us��qA����Ēb_G�V�E:�"A\�#� �l|0����F̉&8�� �d��W!#� ���XB{gā�#�фD .&#fD
�X2@\rF�b2�^ �p� .2#�q���e3b�� G,�Ả&8 ��&�#� �8b��9�D��b�x�3�b�4�A���x	 �9b�)h./#ּ{0���'���;�r�	���
�G�bU�+Md��:ф]��m1 �8�VMb�1^5���+7#�v�J��G,s�8`�Xz������L��I^>�3VMd��Z/���;+�s�	�#��:b�#�_5��� .s�� �ф� ���bߌX"�+bA�3bN4!�M�@\dF\��	M���1Έ��	�#^�h;bQ�#� ���RWM��;�g�E:�S'^q�y�D�@�`�*1��#� ^��k�5Yq�	bF4��3b�#�DEf�Ĺʾ�1���&ЃyU�EEĜh�\��|m���Ҫ��;�d��1�qF4�������Y�f1/t�ɺuv�q����3Y�3�2A��q4��o�d]�A\�W�3@LFy��:*�qĪTG\݌�����|��U�:�B2b�h���h��MX�V$�y�u�h�C v�Q�7�q�f�b�U�XBKb	A,�%1�&1^5��Kb	A3b�@�WMp@,!���j�Z׻�% ��u(��G,
r��EEU]5�A̘��uIJDG��E9�G �p��g�x!�8#��9b�|�A�fN�Gx��MT�Wv�Z! fDK��[AS'�͈3��e���"&�,�����i�� |A�����X�w�0�`�G�A, �� ƛ���d�^�d]�#&y�6#vn�Ħm� �D�#^G,��DQ�&$ī��3ļuċq˂ع��ش-}��g�1##.u����WMbY�#�Ă��;b�
b�d�W%�N
�����8�.�gQ�#Ģ G,*b�1���@ ^�M
��[������y�uɈ3@�M�]G�ܤ�M��#.
��+b�
boG�1v��E��}A��,�Ģ�f���[�:��q#�*�܌�?�((#�1t��X�bM`32b�b��: &����31/#f��rع�Tr�-�:䰀�$rX@�a�L�a9, �䰀��rGĂa�a2�9@���0N&�0���q�� ���p�8 �d"���w���K��a	9�_�Ë&x1�k�ݡ�sXڈؽ�j�m7�8"� f���7�%�� ��A��}_�S�x�	�L@CC���0�9Ʉ� ^�\�@��>�����M��o�5�A,�!�/�9w�8"�1N&j
b�z
/�Pe����	b�E��#�o8��k� V�	b�\]�����5義�i�� ƎX1�*�*?�a4��B �ф�#.(�� ��Ċ���I��I.��݈�;��p�v9�
qAq9\G�C�9�^ш8��++k�����i�� Ɔ'�1��+&"��
�o2!�X"㈸�dB��31��8����o>ClM��}
�m
b���qD�H&�\4�	��5� �7"���\� ;x
bӶ���:b�Ă�1��[�#ο���E8��G�g��qF4�r�=�{)�����?��1��#b�~3L&J����
1^E������y�7g⌈��a�2�6�p��Ħm
b��]3����	�Z]5W��k�s@�1��x#�	�3"b����T�s}�6mk�nB\�"bF0�k�!�+�+�q0�os�	�T���}�ùם�қ�r�8����e�]��D��9�:+����ai��ù��ĵ!�DCg� fxq�`�U�L��[uY2���:^0A+)�"&;�W�aӶ�)p����k��	�.]+��`��aC�^3u�0�g��kv��R�9�erX��K}�Λ��^1!~�7 �T�+&2�]㭘��Ku6�p��Ħmm��OE���
&�r���`��;������_0Q�Ku�]�Al�� �?I&|��Y�T]1K&8�x���x!K�x�N��W$9WB�aӶ�)��f��a�N#!^%����B�L,����`�=�5��5��O�+&8����tm�6�؈%�K��KװVv�K�� 6m7���!� fL�ᄘLTs��C, �LխhBLh-b�K���bj�!��e�9�5�M�M1vĜ����c����~�#ο����k&���Mvĕ��k�]&�sV�ش�DcG��d�X@b�˄(
��3@,��k���XMg,^+��\�#��7;g��i�� .�4W���*��Ɉ1�W4�����x�Nڌ�95�M����}�V~�cߵzф�dM�Z]˂��lKHb	I,$���
�XBKHb	I�w�Q���X1H,!�$��$�K�%"��$�d�HbI��E~�l�a�"�`��7�����"Bb��_"�I�#1�s$&y��$/=�hڝ&ܡ-�Ē�k�$V5��%q�7�8$��9$��$f�Ą��{�"q;���V�KHbN:�I��	� ��&��$�U���X@_�tB�'�@$��"?��X��b=<qMbO��?�`�䎮 ���7�ĥzbIsb�+'"1\9QL:!J��,מ� ۵��q:�!1�cמ��K%��'f�zb��'��wN\2�kO\��v���uO'�%�X_W5����鄯'f���5�+@b��['�Ģ���Nb�N`4c��!��I'�$q�ׂ�2Y;�T�'6m7q=��$��SB{o����(o3L	I\̞���1�%$�'���k{�S�|$��^$��a�G^�ش�I��۰1H,$�۰Us���cO��z���=�"H$9�{�5�㶛HbN:���3�	�Hg�|_v��^;I��)��+���z�*����$��n"�9_^�퉽��(��'q�鄄$���x!��E|y]�;��&�i��$ƞ��b�_��Ę����N`O\��t"E���A��{M��&������$��$�3v0��$�뉽�v�Ob�91��k'V4��NN��t"y���&�i[�X�p߱������ľ���;'�ov0��Ǟ�?�XQgx�%q�nﶯIl��$�?�]1�I��3<1$1ܞ��㜸מ؃ļ��G�E��-�O<�E�{M�mMb���7;�Ob�N0��`����ov��I^!O��c��G�������h�Ӹ~��߿>�4&7����p�1O�{ÃIc8jL����pt�1ܛD�><����a���S��;��HG���k���{wF�'w���x��v<8���6���ƍW�;�?�%4�n�?�՟�&�a7ɡ��>Mj\����z�mw���'��x~�̥�lK���n�=u�������N]�~����g���8�x
��*�V<8/�"�Ve����b5H�A�6�j3V[i���ڎ�NZ��j7�vc����lX�iD9W�A��+Ͱ5ZG`�0�s��ʹ�]e�8I��N����b�K�f�U��I3�*]�4���5J3�*}��g��R��V�*e��sU�瘚�Ҍ���Ҍ����<ʂ�*�xsU���*��o-p�_0Z�ю��h���h�h�����Ѻ���F�%��Ǐ��p�=a��hOͭ�W����Fs�x�hnOͭ���u|�hQ��d.�h�^�̕��f.Ӗt4s����G3Wg��h��l��\�ї~�f.�V����r��	�9���_3�q�ǯ�='�枏�0�{>~�h�-��:�)k��h�}};��XcL};,��J9����V);�	Kh��|'���K���=�)�ѓ㽔�OGo�{G��S潣�>�NvG�͔m����g�G��{7<�f;�ֻ��wL��m���渌{��7���]���o�G�2�1�]}�f$�c�G�6G���£o�V�c���8���؛C5���^=�g4��y�%#����ͽ|��h��m4�v�C�%���oO�05���=`���rB�d3F;���OR�"L3z�	��+L��5���&ia
�J��KH��",���[$��K�$i�^U"��ޜ@��K0ŏI�%��v��!�6��H��p�z���9�$��W���Nod�Q�T�������2!a
m3"�H����4�a+�f�T���D�j�c���U���OHt�/���I�v�l�x�#Y�s�[��X(}q�M'��E�*��9�XWF����?Pc}���$��,ѩ{��I����}�����vo�7�ϨA�L�u�S���+$2=z�_d��ǔ8�
�}+:暜}�T]a�T8�����)pf��u:sG��ѱ�}���:=��I���k�{�䰾��o����҉}�]#�g}��&���������sm��5���u۳��K�AgJ?�eמ�I�v��}�Ԩ@S��I��g�y�?��z�Q���@�$]�}���N�L������9���k+ {t�_#U��3��%����^'UW�3��%�M]��'1�)��_I��3%��R�%�d���?P”|�R5�)��nk������aޔ|�#R5]��&5,���C�ǴeP��{�Tm܄���,k���/�G%��T]��?H��5? UG�ß��K�'����K���?#U�SR��!5zPm4�S(z��ͯm�����t/jg��qDWpd.��:��T]=uft'jѢ��.Im0���N4��àg�U�I���.��d�#�H���R44N�.L����Hi��Ȃ�5�ڱ�(�R�� �q�
R�9#?=�+R�9S4^o�VFO*��T�<��oHՕ��Uued���J������O�%d�gT��!-:�7I��
��H�V���i��(�SQ�@�|���F�!i�"KB��#R�����v%�0���TE��.��I�"}x�~�T]}��}�T}�����;��+���H�l���ò�9��ꪚtb�hkB���H��Ց���b�HqD'K�z�O�ObT]�tE����]uQF<�&�aQ�d���D}w�]�-�����Ti/b\��S:}ڊг��o�����
R����X��I���k�/I�l��]�EFf�âh�g�W��Z~@bt���)��ƢϨ3�8j��ߍ�
ݙG�h��z�D]
�G$FEѿ��n�0�'R]w�qxX��
T/^:�܅��ƕ��������Ne�&�;��'��tj{0�l���'��2�_9xZwt<���n�����ܝэ���?2���d�=���o�����{ݾ��d�©����
'������{��dxw���s��^��:jtk0���\�wA�|a�� ����������SϞ>�ܧϞ;���^��u��W^�����]��|����vo��{��;w�8}m���W�oN�>}k�����Nߟ~0�p��쫳7f?���Óǎ��ri��m��U�e�β�,;��,�β�Vg��βM�u�]g�u�k�ʲ��K���i�0[X�LMg۰�K�&γ��ҕ�z�� ɿ��"��$��&��D��!��d��%����#����Z��sr�P'3g�I�t���vR/�kq���K7\�p'������G��ܶ��s�z{4�Q�ݱ��h��}�;���u�z{4��wtm�=�T��4�nܭu�T��4���;�i�S�w���B�P��O�ޡN�
�C�:z7�uk���IH���"�T�mgP��:`��v�&G�m'fRᷝ��~�i���@~�0y�᷍�Sᷝ:I��v�#G�mgjr��vJ&~�ɗ�l��7��~N��;R7!��'c)�7���os��TU*�&��ig�7��NS�7�ש���Nu*������.�
�a�ʏ��n���<�~��3�u���PK/WUW�Hs�x'#�'pip/_vendor/chardet/langrussianmodel.py�k�Wu��ϯ��Il'�tUOwO+QY6���p���Hj�	�eflKQ�5�H��،b�Ws1Ws5k��򹚟0�$uv�w�K�uܧ����K��v]���}v}d{�b����V�n���~��k�燻��kg�{i{��p��~���n��慍��Wv�G��p������ҽ�Ρ��v�wן�j_��p�J���C��67�O�C���k�����Μ9v����#'߻z��#�on]]j������Z����>})P��*��ˇZ��_ֶ�(�m랒?�ɉ��5yEɷ���vr[���|V�I���)��V������������m��59?�T���کzM��J���'5����Z8_Ѷ���vN��������&k���E�MM��4���ok�[�����T�U�kr���iQj��?�]�h[k��T�JM�k�#%'m%�X�J��&w��Sm�������sM�N�Z0j��6ւ��vZ0�Rr~;R���q�6��vR��[mcuoi���N�hO�}�>�]q�>��xY��i�P��u�lh;��&��A�>����}B�U,��<P;���%u]F�kǭ��4Yݿ��p�%}R���֟�v�S�K�|�]�_‹���X{ -�ƥ˸��zƍ�-�\ϸ��eܐ�2n����qck˸!�3nlm7d˸![�
�2nȖqC��8�qC�e�0˸�˸![�
�2n�EӸa��qc�qC6�Gm76���i�؇e���4n��q#˸�q���
��qck˸!�3nȖqC˸qܖqá-��֖qck˸!��-L�j�s;�M9�qc�2�&�;H��g�Sȸ�4nG��gܐ'g���2nȖqC��q�7�1�q��j�O��0n��� �v7,�2nȖqcߖqc�zƍ�-�F�c�#�6n�WK�G2n*�5o�=���ϸ,��J�
y���a܎��ڸ��hƍM�3�a�T�ȸ�$a��\4*q���N�Ǹ��qc'D%���I�c�API�7���q;�ø!�2nH-���/�w�=�ƑL���Z�K��;'�͸�˸!�C%x����'���e�^�I�q�(Nb��QI�q�0,��Ʀq�a��qC��{n¸���Dq�8wW���3�)�?�C%�'�qC��DF�,*q0n��.N�ws�j���ƍè�qW�݌J����3n�J4l���f�~�d���ITRm�T�0n?T2ی!�2���䤍��7�v�?�\��lܚ�M	��1��A%M'��l�*qw�����>n?��*�QO��;��J�q;�ہJ����P	�YE%�Ӯ�-ͽ�IT���ʸ!O�8���B%������?��@%���i�8�d�P@%���8�7�y˸��#�6�bܚw5��
yfw����>��2n����@W��Q�����d���+'��8�$*�<VWI�q��Z6)o�vd�T�g�T�ȸ��;*���B%A2�&�*qw��J���t'��{��I�1�Ig�w�q;��Ռ���u7
Ÿ�̸gǸ�d�A�ۏq;�;H��0nGƍ�'��ݠq{e�8�)'�2���$ԅ�*	�rґq;�[u���p��`�AP	�{,���3��I�R��qόq{���JBw����2n�d�p�VN:�[
�����0י]������ɸ�
yV�@��U�`�s9�k�$,z��aRcu�`�z�J����-Nvٸ5#iz���\�>�¸�D%~��˸���*���$��:�j=T�0� ���~��0n��*N*��ÍJ�d�TdVIT�q;�J��J��82�&Q	�P�#�a܎��9�CT2���1�Ցq���j��8�5�֬�X�,7�h�r�@c]p��8c]�P��q{��8��TR�q#;+�v0n*�<�qc'�2��h0��f�3�q���qO�8"�3�'����� �1�ϸ���J�*����ʸ�P	�Y��g�~��{拓���
,y�ʸ��e��x�)`ד��ȸ�q��$|����Q�t0n?�+N�X��U_�ў�?�0;w��$�8dJ��YZ9���Z�^m�Ռ&5���v�_��(N:�['��wJ���w���aܐ�2n��;�$?�0+ƍ�r���@%p��6nGq�ϸ��I�9�{��[O0�b�3�q;w���@%��֋`�P�ȸ�Nj����8������*Njd4n/�vd��z�Y%�Bq�Ɍ�Q��|�
y�;@q����U2���q;��/��qkO�]o�~�{vPɼw���q�Jƍ�h`w5*�*NV����Lt'��#��Jz�8�=bw�qCn�82�&��w��*	�q;�J4���2n8�]�J��;D��S�ڳ�!�v�&�����=�퀐���pf2n��3n��!��C
�Y3n5P{h�
�rd�~}�Mf�~�{
]%�˸��&2�)���r4�V4�E7�eŸ��#X��g��:f�r�3� �
yV3n*���qc�7�ख�;��g�G����-��3�)0���U_�����L��7�	v�82n�8S0n���,�˸�ø�ø!O̸w��d�.NVw��;�q�kƭ����>nj{�����&��wT�0nGWI�v��c�y����h��m�#�<�ƭ|[����Ȼ÷�$�Sh*iҷ	7�HJ�־݀��d�6d˷![�
�֌)ȖoC��ȖoC6}��ې�|G��
����Z��8>�c�6��|��ې-߆l�6�	�*���|��۩�Mj��<�)	�pC��-�,�c8`�3���1U�p�}��q;��qW�c8`u��c܎6n�/��}r��8�[��l]˸�pR�W���qG�^t�v|��+�v n���a�^w�t��M:�r�ဎ�[�eܐ���øUmR�)�qG�^p��T�e�8�ȸqu��k���q;�#��$�Q%��2n�I˸���h�Ѹܸ��q;2���z�lg��+�g%�v0n�q;P��6�d��JԺI�6��}{Q|{>k��S��MN��8&�,Xm2�o/�qk7T4�h܋b�~	��0�xmҫ�۫��g�M5)�w��p��"%����� %�-�V�I�Ή��{��{�����7cR�vلq�!�&�J�j�*��n�)��Wߎ]�ѷy���I��vq�Ҥv3Ą;&܋b�~�JB��a��	7��R�S�@J���1��a܎�G3�ø�J�A��/��Z=%j��vգqG�^�ktd�^��'OJ��}wR23]�~�o��a�M6V#n��I��Fߎ�����AJ�z�dqz��T���v$�~�&�L���z��D5j2w4�hܐݤ�+�v,����7���CJ�4n�e�AL��&�۫4�e�֮X����ѷ!�kKI�^@�o7F����_iґp;���[��p�ok�&�v��E��\|[J�z���U&紥$Q	�v�qG�^�Lb�|��a�ظ�'f�2�ڽ�1%��y%!z�y��~��oG�^p��R�`�=qP �p%~	w���~��%���k�;kR?�s����o�s}�1�np��<��l�4��A:J�L�
Jz���)�ߎ�v��)��W'`�
%��	��۳�P�W�lҷ����'+w4�1�L:�B^�O�����;*��k&;�pkg%w4�E1� �IǚIl=��d���C
�
�U��k)�/�F�c�d�(�뭙�k�v�T�D?w4�7nl�bw�)%!P��q@%>ߚa�A�|d����ۑq7�囔W��qF�ƽ���e^�&4��^@�9|ƍè���3� n�c�y�غ����ƍ��eܼ�](w4�Ӹs��qP��8�x5��B�qW��Q��*	2^ʑq;���\ϸy��~�Ѹ�qߝ��q{�#�nθ'�U�c�A�J��� ��qA%�8�b4�h�n��xrw��
�4n��2nx�i��v���c7�z�[�U����7���X6"��v@�X�qG�^�Zϸ!�c�~��j�ڀqC6��i�Pk7fㆼ �
y,���*Nj4w4�7n�>�p�N:����I�q;2�I�q;���>n��A�ۑq;�[�x��;�bw�Q�!VNz-�qd����ȸ,��f����ȸ��&��w���b?WK���]m�x���L0vb7䱌;��M���*q'�����@%�����^}�ՌہJ|���}�AVN�u�8PI��I?�[��2nm�h�1�^�[��3��B%��C��q;PIc�w��M��*irɻø�J��;Q+'_��]�$�"�*ip8�<�*	�q�`��cܳcܐ�w�q_[Z�7?����<?����|��k�k�v��;��'�v[��Ϸ6�v[���;�������������.��y8G׶���.�}z���&�m�s��٭�����<�������r�[�����Ɩ��V�����/�ǻ�`k@���<G�6w��ݨC�}��:�v�8����޿�c�X�VO?v�̱#'W�������Z=u��GO����	�N�[���/���iIL5)��T�B�j�P�Mu�P���-Ԟ��
�o��B]1ՕB�ꮌ�B[�����J�
휔;�.��h�6���G��@��`3�D���/��8��<ǩy�y�S3�D��Ԍ1��95�_"�sjF����Q&)[Q�IيR��ԊR��Ԋ򼼿�(��XQ��ݡ(�ߴ��Ѵ?�ڲ��#����+��������gR[Ѵ?��@i��wO�\�����J�iHM��/����R��x���8���CR��x��(��f]h��S�mM��i7�4y�vSM�t4Mޝ4s��5�]M��e��i��5Mޑ]�z��v=�+�=���k��������7Rӯ��JM�'5���������,�{Xj-K�9*5����m����K|�Wh�J�?a��������+��^����˃B{��ďخ|�����2U�{��8p��/�<��<��Ra���ZF_FqRJ"
��)��"
<�����+����(�2��R�(d�g�FQ�h?(5EOF�������h�Qj"����CRW�'C�'��8z2�����'�g��wտHM��\��m��R�o������JM�]jy }�4恈�/c��<����ӌ�_[�ї�;1�����^}�<����h��Nxb	��:4qI�o�DqM�������-�]ī���7�"y�lA˃��^�&��?!�`��D�3�MIJ"o9�'��|E^�'!�X�_y
���Vd0O#a��ȿs�xTV䉼Q\�y��~�]���d�
Q�ˮA�o�����N���m@�Д�$/{X�G"^��vzb��#��e��}�yP�;`�D�����x��܀<�Kx$�]߳pG"^���U�""y�:���Q�ȴ
��x�wpB^�(~�Kđ�W>��x�wp�_�("��F"�0q��D��q�6�އk$����Hě�k!�D�����x��@�3����_�.Da
8��!����7�ǫt#	�l#^� IO�o@fm��$8�Cƀ�����,����?�&$\��C�Λ�x��/������K(��?%"�E�54�����ƾ߂F��Q��@nzp�5%�2l�$�d<ڔd���i$���q�Rv0���-�� ��q�S�0X�;�4a0���B�nCƳ"����(o!��j��\E�iQ���.����(o�D␶�-��mD���(�ე@��>�?�!ڈrO�����HD����� �(q���	E�p��/�S�	G),iE�p��B�����>de���;�E�	_�oBQ&|-�YD��4de���{�E�)_�oAQ��!�(S�Rޚ)����de�Q~��2�(?YD�r��@Q��g �(;��E���E����'E�x
���Qޖ�/%�w���E�xG��NB 8���@�ޓ�� �Q�G���Jj�@o�=�~LI�9��ō=��K��u���s��gZ)�r��	Q�"8��!
#�z"%�RĹ�HǢ�)ql�)��D��t�D|�S'r����EH�8�<~@�5��I��&�Bxӎ>��vx��h	C ��U����Pŵ»���H��	U\.�d7`3��Cr�6dJ�exw�\��6�kr���}�#[�ĩG=�:�:��yac��ݡ��g��'��7�=	��3�]�\�8<|O��{�j����'�.���'wv��6�.���ݭխ����Ջk��1�k�k���Ӈ���#'�[f���K���6V/m��?5\���p��A���_y��G��K�k;���W7���D~���ΰ��6.=�vv�{��������+�g���Vv;�l����٫��/f����})�r����ײ�g�Ⱦ�}+�v��������g?�~����(�q����ϲ�gof��~��*�u����[��F{�gFώ�]}l���'F7F7GϏ^�8���S��F/�쁥�;�ȩ�Y��$���yx��Ey��"�<<�p�Eyx!6�Ù�e�[�
M@��9$\m���1kN4F6ҡ�Bd{�0�����l;�:"�H�ߣ����)#�g���ψl���@d�M�ļ�[j��R��y����[�E�D��_�J�@�%�Ļ��ԑ��c{�0�駔���|�]*{��	wq����0�������e����J�h.�u�5�.Ĉ��D��� 0�
@c#�K�-���!�c#pH���� A9C�7�rz�R��>Qt�b��O��Xv*a.~� p�����\��.'�jr��!.ܟ�@%�%����D��	n��P�o���<�'�%c����Ot���/�S0��E�`�'��Ctx��N�}B'���P	���1�&r"���l"'�Ŋ�B�Պ�B5(W�L��JPgzs����6�s@<��-�#7��%��=��
���l�o�@S��KEJ�y���"�()E�Q*R��T��G�H)�R�R$ v��й]�$pn)	��EJ��v����]�$`n)	��EJ��v��P�]�$Pn)	��EJ��v���]�$@n)	��EJ��v��и]�$0n)	��EJ��v����]�$ n)	��EJ��v�2�{�C)������"eí"%�p�H�j�Q�,X�U�,X�U�$n)n)	��EJB�V�� �V��H�U�L�5�oA�����H6좂H5좂H4JE�g��
�f�EJ2��vQ��RDQ����@�x���M*�
ݴ�� �RQ��
����E�k��O��^�<���΃b7����n$�Ee�ۍ��Ⱦ#�&-��Ⱦ��wdߑ}-��Ⱦq웙�ɾA�
�� ���'O+pS������!ý�]��3�+�7��-�}��3m*�7~Jq�91o���?���
䍟� ��/<�Մ�xi��ClBވ
4� ވ
4��pp�w#6nn'܍��ڍؘ'�Fl���Fl`��Fl���Fl`��Fl@��X?`	t�;�W�?�	s���]m�%jH�A�w�
%R�`��ۥ{JJ
�
��ӆ�p����9�,����K�(O�[�E�P"�D��kd�\"�ܑk4���\�Y\u���#�hW�F��
e�j�V9���	Di}!m��k�&_�G\5�=������E:QZ�B������l��s;���ځ��p�l�s;����FxiQ��2ʄ��-|��pn6{ùq��
��m��/s{�����
��zÑ�s��H<lvٮXD��4i�M�	wK
���d�T^���蓆'ۤ�r��~X�it�/�4����[]�\�1��K�JB��dJB�Qfx��w+��{����z�W*j"�Yo��.Aه
�E�Q*Vh(A��hE�M�E�aW��{���W*�
�vp�3�8ġ���H��%^Lܮmy���E�Q�T�A�vU�e���]��z�����5ݪV}Z�fW�̾oV}��5������w���z/-��Ա��ӑz��w�ޤE����"���;Ro�E��w!N�z+Vb`o�̞o��6��b<f�73��{�ǙM�șo�ef�~u�7�#��[�����ͮo&f�7�����߼���Vh�l�f�h�~3Z4[�_�A+F�m����܉m�~��k���&��[�s���ɓX��o����~�F�7w��w0����^����<�D�fzf6+jt�<��M��(�h��Q��f�M
�jR�2E8�@�آ�Q ���Q �n�Ρ��]�:�%E8��g���(�6p������D�����+�Np��B�
n����$�L�^p�	75��C/d78�<��+�����9fC8��0;���-�<���	�YfS8S]�+�{�);��H�N�Dى]���.��*95���6��Y��K�����^S��ح�-�"ZqE�Rj�IJ	gw+ȵHRlH�V�`-R�znWͩH*�s���ܤ�?7���%\a�ؤ
�&Uc7�,E�`��)lZ@
��N�Kp���1	O��R�)��^����ƻ�Zd�ŭ�#a�Rw��Q�b"qq�pH`�Ԇ_5���vo>Mi�W0�����Ad%��Mi��*4Ů�Д6�V"��R]����e
���J")�hJ�]R�)mv�@d �J1q�(@L���U��j	u��D�����]�%�^5���x��w�R��u���b������F��t��ѣ>}��cG#'1"��I�H<"q�E$�xD�B�H<"�B�C��P��]9\�lx:N/�J6�i08*6j IG+��I���ר�$]�\Óc(!@��'nPJ�j
�)����&B@�s�	�jx��l�jx�lTjx��l.��d�L��X�A0��%p�6^x�+#n*/���j�U����*
�F�e�j�a'Tv��3ƚɪ(Tt���

ql映���d�*���r����p�X�A�G�p�7\p�c�B�|��\ȗ�P2�H�ǥP�w���E�`QN4�<��-�\ע��\���(��-�7���pԞ>S��G+qG7m~��&�!�-��:G<��*-pn`_��j�SQ��b-*�s�����\}���b.8���q�7�Y8Bn�:�/{ܞMu�Sĉu��`��,�.z;8W_xs��y[�$�eVO?�p�r�7�|bw�L�_�<�:�X�EԻ�"G��(S��x���]�ƪ���ڹ�W��76��y����~/-;sjue�;X�SP
1���I��;�o�E��w��B��;��B�@?��W�
Ṏ���u$AFKx�w��=Ṿ]o
�.t�+<�{���\�C��s}�����zgx��A�[�s�����x����\��gt��:�A�=<�q�����/p���\�7:�s��h�u��G<�q��&�\�7��s��h�u��O<�q��F�\��:�8�F�x���⹎�o4��:ο�.��@o�u�Pk`8���[ƙJ�������g����;���
��Ùښ�y<�>0���90|���r���<��p�c����
l")�D&R*��\�T`�H��&��R�����6���
lΩ*��HIJ6���
l"))�DVR*����T`TL� �^*�
*:?���
l���O���HNJ6n�h@�ݐ)�R�'%(v?��PJ�E�R�&)J��T�(��Qj�;�E�R�9�Ms	��4���R�vRAsE�R��D,����/�t��4��l�As��7��m��V�i�Ms)K�h.qq��Ưd��j�+�����>�9�&m�̠�Z��L��L*̠<�r��̑��>��SV��d��g~&�C�+�(�_�䢘�L.՘��#���еJ����9���Ƀ�``��@�ʗ�PK/WUWcp�Mv�$pip/_vendor/chardet/langthaimodel.py�]k��U��_1Ȁl��鞻`Yvl�.A��
��v,
^�.�#GB����c;�����F�BB.���J~
U5u�9S�٧�v�L�l����5�u���~�֩�/���m��n�2����?{��pk49{p��h���{s�����ݟ4��wno��~0]0���hriwk�}��c�ֹ�'vƓ�+#�\������ٹƋ;�������kw���_ؼx��s���<����F�ᩆ��s���x�q�����x4�Q��d��fx�f�gfx���cͻ�<����I��eM�ᯱ�ÿ8��=����O��7�c��g��y��o1���0�m�O���6|:ߙ�ـ�󫬟6�]֞O�{�}����'k�������0�j��u3`�6û9�����ٴ�Ά�a�1�l8�d����b�g��m6ʌu�/��k���~���2g��;û��wY?���&��~X7�g�o�h����!�l����g�ؽ�1���n8�S6�&��������u��?b8_��l�����f��1X���C�`l-~�]�=+���:M���}o6����t2��9��ѿήڝ��!'FT��x�l�=�������r"~6|���m���p@��?�$~��_0�}@�h_��1�i�x@��> ~��/H���p@�k��1����M@���G��}@����x�^���}@���?�	�x@������@��6 ~������?�ď�����?���4�o)����Ŧ� �+?�9��/)��ď�1 ~4�6�K�_ ~I�KįU�����Q$~��G�_"~I񣟀��ď��E$~Pm@�h�����x���x�
����Nڗsz�H���%��e�>𒼏x�������x�-��/��B�4/�h_P�KN��>f?�}��x_�N9�������~,��,��}A��
xL[H�u���	��9�?nK@��-ň��~-�c���◈_rz�MI������n�Y�Z�ݗ���/8=Z�G�i,~-�k��X�xI�xA��#~��%~˵D����pz�|��%�xA�x1�?�Dď�J�襤�E���9=�?�YL�.��Ѿ��^�?��#?�J(���9��v�vS?�{B�?��/Y=��x�_ �X{�K"�XV�)��mE,~)��j���O����3���g��_����ۭ��x9ŏ�	���+bůMꑲ9%�/�vowI���Փ8��r$?�HY�+=�X�/��Kď�vB�_���f6�d��8�i�h^��Q*~-�Dzz��zR{��Ki�h_������T(o�֊��įT��׊�(�'�/����%?�y��H�&~P[E�@���A�L�3ʫ��OM�n�5�7C��+M��ǿ,�_�q�����9�E�ܭ����7w�D�xV����Q����k�@��=~�aD���Z�7N$�׊�V��^�WM�1�?�����~Q��g}�_[�!�G:�U=���W��a��QRm��~� ~0�j��(~Ls)�Z��F����������Y��ܭ���YqNF=�2cU%�ʼ�q��գ,� ��k�9�'R��Z=Xm��գ%~eU�X��F�U�1��y�ڒ
��2kk��x�<�%����.��c��^L�k�2�4�j��T�*sj��8Z�'u��H�`�,����%�/��j�H�K��_�r�mV��QI�r����jVO,◬��%�GI���O�ճ�_k�H�R[=��R��p�*Ҧ��YM�GY�?�ǟ1�g�q���BYf�VOM��cU��?nK���Zů-�,����GR�� �KV�/X�9qɆ��_�zо�����I}rW"�8�zR+~vr�QC���ei[�?�VOyů���������///���Dd�$��eI=��}�E�X{���>�O����_ܕ,~�;,��,�X�a�
~Ls��]�[�K�_����oi�o)�vW������[��H���>�{�+!�3V��=�� ~!�G�������z$����H�c�d�+�_Y�-��n�/*�_rz$���]���fs�zR����wXrv~�=�ǨѶ��]-�}@�XmV�ڤ��#%�HN�6��b?����/�j�v%�?���M1�G�{�����d�D�Z�_K���U���bٜ��]�ﰬ��_�ů%��Y��Vz)I��,~�ޮ�◈x5*6H{�h_0�gE,~���/V�ۇ���=�u��������fs_���H��`6���#)~��%ſ"�/X=K"���ٜ��SgsN��z$�4_^L}~+�◬4_�]I�+����D���oI�������Ѧ�?�#��5�X?{檧����U!~��O|~pE?�J(~��c)�j���*~�d9~���z����b�/��6w�ls�=[� ~��nm�ĵz�Y=�"��8���VO$�/?�'��&)��z����]��˞�x%��hj�G:��D[$�'ֹ]\7M�64/��������R�bi��+�zb9=ڤm������^2��\*�II=�i!�g�i���/�ڜh_P�}E�_�#~)�_��K�+�_��s����oE��t~K"~m6�d�Ǫ�#����J�s~K"��E�g���xǷR�~j����}�S���OA�G�}�]t_����.�SnkW��K����_�]������K�K�v���}�֮�ů<�����,�����m�4�_"~���~�=�x��D�Kr���I�L��??�DN��e�����b[����&s�kNOj�G ~)�?�ů%~e��4�vkWrz��v#9=��G7i�T�!�⯚ӣU��ҕz���V�1�%��{�G�
ڽ���d��_�z�_V�-�++�,���f�k�D���זh��_[�A��������U��_aA�!~�Փ8��6^lMfmR�d�$.� Y=B��]��jsj�m2粎oűzR?K�a�s}=~�����,ď��6w�D��+N�J�G�܍E��K&�OC���D��K������s�����S[=�+,l�6�@�R�I+� )~m5~)��/��IM�O1�GH��Z=���`�D�ʬ��VO�j���z$�_"~�ꑈ?��W�hKL�9��a���_I�x���W%��S��%���%���#��M��)y���_P�;��`�����
�+��'�31�B=lU�?�U'�-�O��Hi���vc�ەx?Rb�/%�h�oI�����#��>��<��n*Q�Ǯ���.�����F��[�p�-~A�N��/?گf��uJ�/8=�+�Ɵ���L�)~���fsb8kF�Z�_R���J�?V�tpW"�8w�{�Zů%~e�)�S:�+9=kJ���9����߮���.�cX��4~��_���I=�n��-�K�_y~+�գU�Z���ꉥ����_+�5V�J�?5��x��c�B�4�/	~�Vնvc�V�c�|h]�R��_i�_����>�/V�K�vה��%��Ƿ�%�[,����#�9%�G �UO��8��C��j��TV����:�+���k�_%�_i�'g{��>�Oꉥ�%⯚�_��<��jsJįU��,��������ͩ$~I�������nZ�GJ�I}|�?�_�2�n�ٜ�����z"Y��*���G7Ŭ-�k�o���J�i+��0◎oŪ�#�J[�'��o��]v_�ߒ?�W��IM��Ճ�u6�/ ~���dvqM��V��'~{>:��K�_Wſ$��fsV��%ſ�į=�UM�ӫ�����<���I�������գ<�+����z��6w��zRo�ƪ�)X=��n�mժ�#y��ks��gX�|Ƴz���S��]�[�3,��O\��a%?&�"���pM���n�(ş��A��˥sJY=�f����[=�/��6�G"~I����G�J�hK}~K�ꩭ�u�zW#�sV���O���X����D�h_���+��Kf�/��#�sJĿ��
��S���z��g�p�\��9��ه%����T�A:���T�S��IL�h�(�S�z�tΚ��W���3�g��3,B���S�Zu����O�tS
�p��]4�HV�R񣛚�k�D�������3T��mYl:�*~-�+��V��+���G�4�ߒ<~-�KY=B9���k�^5�wf������|�?�W�/�?�:��&�%)��.>�x�6�'�c�'~�W�tN��nň_��Ml���ܕ�@����R?�)��Z�?+�������[��zR;=�*�)�~��[ڽ]�-)�S{~K�}eU��5ڴ��,գ��T~����b�x���|�gz�]��}�O�����zY�v��%�G���:��rz�?q���~�m'�(s�e��+�_��S��<:�?q5~�6�����D����/H����+ks�E��Z�s���Ü���zk7%���v���ڭ��v"�v�:�������ϲ��/j�w����Y�&~�}M���?�� �c$��eɜ�bj�w����Y�&~�}M���Q��gF���:��y�͔���5zi�3�jܺ3�ޚ���;�Ick���ٝ4F����x�1��w�;������Y��������Ǯ�&��wlf��ݛ�ۍ���ܚ�Nƻ;O�nwG�ߛ��]��n㓻�[��7�j��}���3�7�̆f�}��Ը4�۳�>��=z��s���pm��77�?���ϟ��y��敫�<{���x�·�z�3������d�h6E�y4���y�5E��h{�v����Σ�)ڛG{S�?���耣������p�-�x�By8��%����G������g�y��q>�2?�|����|>��Os>�2?�|����|>�l�� ʡ��(�l�A�~�� �-���(�|��(�|�\�^�5<�b�/y�Ͱ��0�1�u���1�W<�gدzl0�N�9=}.����Y����x��1ǯ{����xOy��q�c<��y���I�/��a~�v����U�$̯�N�0b���tG	�K��a�_���	��c�_�~?�y�ݏ3�q��oz�ߏ
���[��=����x�����{���ٝbO{��-6{S���NXӿ���}���5��liͬ����{����#���]ӿ����c�����vc��w=����=��0�S��\�)v�c6�̇q�c6��劧w���sa��~�c6�����L�욇L?�=d���x�c6��O�x�F1�C��(���1�������FA3�'��O=�Ս���<�W՟{�?��O�_x��c�<0q�|��&���!���6��t�@G�c��kڻ��y�_��
f~	�&Ю����M$}?�c�l$�N��@{O2�_&�C+a�0{S�>����7��҂0�Г�K��f�ǽG��)4�"Ю.?DV�"< ��B�&��G���=�����M,�'I��P>����Phm> �.0���&�/����7�%�*�|��-��Ur�~��{�ܸ�'����'��^��	'�����E�
0�u�m�-�w�QҊ6x�ph1��nc�5l�>�6\Z�n��f��M�N���4Г�v�Y?��9U�Ϧ�@������;u�cz4�N!䘇M�U	s@�o�B�3�ɷZ�?���Ʌ|֜&�I��9��w�!�dh�t�1	�|'��(i�ha24�NF�0i�|'%Z��M���Y\4�NR�f��o�m�����^��y�D���K̬�h���"����i�m�mB?C���O�?l���z�%��P?G���K��	5�u�\�R�Y���^#��fgNr��G�l�k#�75�u0�7	5�u�K�����-BMl�D�#3+@:���	5����eV���j�I\���ژ�w	��>��jbk#��	�<�b�9E��? Ա,�jS�1��jB��y�1�ʤ�eV�t0ܯjC�վA��~�@�Z���<C���ȺaNYfEJ�k}�P���j�J�}���	s�V�a���ʕ6F�]B�ĝ���y��r+Yz��?	5�aƾO��
M��P+�p�@��
�!�N��}�<�)�?"Ц#�b?&Ԓ&.�B�z�SB�z���Xz?#Ԟ�p?"�{�m;$Ծ0��%�Ҥ��0wF;Q�J�7��66��2�޵�#��r.�6<ޘ;EC7����J�v��;MC��L��*z9�͝���r��7�r����+�O3L�hn�My���1h�Mh]��j�'�/j�~�P�A�A�]�xX�$�ņ�=��V�t��[�Z*A_&���T�M�	��9�
�6:�}�P]7�ns�Wz@�%Ծ݀�G��Kn����o�
����ݲ��>$�5.\�S�#\���`(�}�Լy{��3�^ll4��wno��~0Y��hriwk������������h��S�秧���Ý���-~g8�����dwswk��yw��!���l޵��p�.����t|�6�{�[��ͽ݃�d��hs��ͳ���2���<�mn�Ǜۣ���7>>�>M��p{����h�q�H$����1BLj�`�^1��(#;��0zˆ��,0�����ݼ��{ۼ��ټ~ͻּY�kԼ3�Ҽ
ͫϼ��Kͼ��ʼ�̫ȼw�;ƼP��ü*�{���~7dn��д�d��n
�"5�i(��!?�t�}�^1$b�Ѓ��ܛ��<��6O�y4�sh:󀙇�<9�11τy�j7K۬c�h�
5��,=����z��PK/WUWT�-��t'pip/_vendor/chardet/langturkishmodel.py���uſ�_�PI$%]U��	S�,��pqb���@$��`�%��$�����,֑bٱ�*�ɱ�����Q���}��TW���X��4�U7~}q�U���nk�r�����dz����tg4;ypC��h�?��M[���uu�wkw����l����f';�ݭ�GZɩ���l��(�7u�ua|g�{?�gy�u}o��M�j]�f�ۺv��s篞۾p�ҳ�/?�̅����V+��Jx�j=�z�̣�@�xbYMzV}*W۹z�y�O;���gr����)�]�>�[Ǫ�#��{>W�ª��U��9��]p�7?�E�.9j^�eG�[�yGm[��Sq^�UG�V��T��ם���g�3�M��1��sܼ��9cv��,ġ38�)�p�n:HOA-���#�^p^��er��rԎUo;�`ű��|�_t�L����=�����w�Q����BN�3ȇv?W󺦹ط�A.�8s�*?�{��W�%���������s���wJȏ�E��藍���#>��#矩�W9��k��.�o:�c��s&�-9�y�s&�95��1��yu~��p�t~��8o���:/Ώ����;��|d���i�.���a�a�(�e��KoK�eu+�İ�Ű�Â�a�0,İ@�bX°��5`��a��a�޲9K�a��n[;m�
�ܰd`XzcXrÁ0�qñbXAK�a1��İ��a��Q�X0�sõ`XB'u��a���c8^7m(�
�H�0%�a�a_7*���
��-� �Vr���jncXY;`�a	1,�p���ư�G�
C�lXV�pR�	İ�İw6,�1� �E
n����l�7�x���rK�a	1,�d�
bX20�C	�q(!!��0%p6,!�%�0'�P�1, �%���bX��a�a1��0�DSt��
�B	�tl/7�C	�°�ִ;\���o�Jnc�?�P�ܰb`���aN6̙��V�w��0�h4���0�0t���
�n�?��8�`e�%�1����,a��`(��0��]�0�`��9��0v����
c�O�q0�C	�	^�v���p�N0�0�0lX�"�����般�0LQ��;�o�ئO��a1,�1,�"��):F��0v�0��n���f��0���<7yÚf��2���o��=��[��+e�b��
{cO�10�ݰ@�7C	�a�(��D����+���&��ai�aJ!1���UV��0v�	�	°�N ���a8��}É'�9�0�H��ᄁ��øS��)�x0L�z�}�m۰��' ��bg�1�a�fn��|�a�a�Z 7(��tJTφSt��p�
k!;%JB	�}��y��ʆh���Fݰ���
��q�Z�nO�)_7hO	�a��8����°�5Ey�pR��#���
�P�AJ�x�.����Ý�а�p�tJ0�o����1�
C�@�
k�o8�N�Z�0ì�5�]�.�p�w�D(s�8n��Ü��n�ñvJ0V�	�°��pĝ3��p�N��P��볘��}°��XvX[77��7�0%axswX�7��	�*�kY�Q��������6a�áV�a7,�1�Ɇ��p�}�ޡnXc����
C{�
o��!� �E�|#��
'v��яá�0�0%���Ca�?�X�l�I�lb8L�0�0x��P�7̛��|�d�����p�C�9�7p�'��a�F}��p�ư�V�1��oH��&;%�p���q�ư���x�.�N	^(Ar57\��0�K��-���s,St�
����aJp:%�u���n�Jp�0Á�p�[�DJ`7���%.qìl��7\����-��
k��g�Ks����
c�N����z���^�%B�
�ҰF�^}��p�D�6�9��	%0���n6��n4��PbXD�a1,�c�aOc7,uÂ�a�\��D	��0��)Ѷ;�9���8nO�I�C�7�1�l��zmt�h�Ά}C��0����7L���y�K0���Ү�s>v�n؜�C��0��
k7�x13�0�
K�a�N	�0,�c��lx��pSt%�7Xn����_��l��_�Ca
7;C�0(�
3(��p�
�Ha�k0ƍ�m8A��`
�a���bP8aPX6Oᒶa���ajzk�Q�ae1�~�"1����j����w�p�;�`��f�s�A!��V��j�L����a��3��$0�k�`�6J8�������RA+�aN4�q���
K�a�h�
+�aN4�Tǰ�ƙ���>�bXB�~5U�8��q4ۆ}ݰ�ƙn�n���p-n�$�e%n�d-3�>���sÔ/e�Q�|l�>�
b��~5���q(��q�0�
c3B	
�P���v�8���a�ơD(7�k
�↉��'A�7r���h/��06Ü���aN�p�h�;�8���h8
�2�h��	:�I�7}$�p(�[4�RfN����bF�b�Ѯ(�fF�ޙ�b�a�a�xc���X�$�}���{�1��j�f�v
s0,�cX@�hb��L�{)3�Qf7��$�1����+�$�j΍���_�Ѭ��a��0����
8C�p�F	J@W%8�0v���p4�#��K��[�
�Kaܮj��I��aN&��5̠p�v5�I�U��ʣa�#���I�6�(�0/�}��a��swn���k��F�}�:�q&��'�
s���r&�d�q&���G
�2C'��}�9ƙ�
�0C��:�9n��I��n8L��0t�գa���7V
��
�(�Z�Q�:�;w\H
�v�f),֌�4
Ha�v5�v�Ӯ�Ma�IHHa�K� k7�:�>��a	]�ڍ�Ͱ����+�ڍu�p�k7��0Ì���
%��^9�9t�c����pf�&��m�
:ɠ𺭠���i��t8����p�tՓa�	:l�q29��1�u4
K�I�wL$[
K�9�I`+�a1� ������bX@�$Du�a1,���
�aߵx��'!���
�0,�Ê�aB�h�~$����OB٭��{�x�Μo$�-�]���'�3�0�0��nX"�@�t��I�0\�c铰+蜻 ����&��$d 
{w�a
32	L��$n�i�Ca����
�$V�4�)\GӰ�N¹�$�8�h�?|ɰw��w2̡p��0�W�tß�x��
�p-n�M��
��εݜD�]�^8
{wIpVnxS����	��8�x�uM$�iV�m�e���j�6	�a�m��ư��f���p��j�ǔf5�ņ�a1, �9m뺩OI$p��pbwv.��a�L�x~��&��q&! �°�����3�1�1�6��Vq��Z2	�WݭֱtΥ�tsܰ�á&� ��7�Eu7�0l���1�ݰ@��a�0�$�0�iXx�a���
��&A����sBbX6�a�P��
��2s�$�vx!���dþ�t�AWwø[M00�qÑg��`��>	=އ�H%Bax�B�P�I�l8P���N��St���M�U�\
��xw�Y�7j�N�l����0^B� ���V�
b�����9St
b���NB�):1�V�1�C	N��0g?�@��1���0^B�S��P��%t����%�c�r�t��~���*-���m}�!<��FG�J��ÁR	9, ��'���TB �a9����O%D�v��T�䕇öc��z������D(�-%�[�0��$g�a��^�,�k�!�����} �a,9�I���p�.�õp����üt�d�a��;(!9��9�s�P~��r�?�X3{���x�5�=%0�a<��p�\�c��Y�f]�\��:\��kn���x��P���q.��\��aF.��p�\����i�ᇽs		9,��4�1�p��D&s� �y~���8��%���2cɇC�+�,�E���0�%�9,�0�Ì|��KT���������y:���R:;O��s�3H�|#i[��,��aΒfF.��4c?�XҌ9�����mk0�`������q�psmk]�=�x,~8?|~��m����?��\�a�b���D֕�a���_�9�rK�a<O��0·9��e��a<O��%����2�y:�9�8p>�%-㐐Ì�t
r8�Op@�a��/���ø����?���[�d���ì��S�p�|Xڽ%�Si���B�a����ǐK�ZN��a�fp�K`C?�9콜�{��/�� �9��p��������/��cUsb���,�0g=](?�9���_��YO��%8}k�����/�K0~���0c�N"3r�P~s��	s!�0��<?\�/Aĭ�a�n�|�=x�a��Üu͜\B08� ��s	쇛�%����Ü�tx�a�8�`��|�a����t?,����鈬!�5���ӕ����;��Aݣ�o/�1,��0ưۚ��x{	��P��]�K0��h����v�����q`K���w����%�D��X��v���%���b�9��8�DvXy�a�a;9,��0�m
s����X��3�骷�a;��%8?��.�0���u��X��}o�#�2��*��7sb	����0'������f�Üv	��KH�a<M' �a,�c?\=�،x8d�DI<\ҶVK<�j�(���c�W��Io�t���^�vZ7o�Û���5�=��v�;��ɬ5ze|0k��Z��p�7޻՚�^�e�yv8����F��2�ݛ�er:R��ޘ�ۿ�wsvo8O�7�������N�&��'ӝ��=�z�5�%-��do6M���>��o���}}B׆7vG�<~j����~g�=ؾv��s篞�>{�̕�k��/_y��+�ӭ�l�-��,���YT�BUEU-Ԥ�&�]T��ST;�[T��WT{�_T�u��3*�Fȥ�>�Ri���P���\*�T.�f*��I�buҌ�,�'��AQ6c��O�AV��eU�Q�aV��'�8�b���*V)F^��<��R�f��R�f��R��q�,Ui�;Y�Ҍw�V�2�[��ͭ����1�[���-�����Fs
:��-“}�c�����:~�hn�l4��'������:Nͭ�Fs�07k۽0�N�u�۴��a�ю[Q���ܝ�skv�:�}�q�07eǭ�ܑ��SFs����_5�[�i��u����:~�hn�4����3�]m�{G�M�h�
v���
^��k�|/-�St�=m��Khw
����')��^z�ݢs�i��-�^z��A����5(�^z��n���ҳo;9��ٷ���OϾk�F�g�^HƷ��+4��ז����ӳ��z_��yG����w�y��OϾk�[F�go����{S�q���m��y#����ͽ}�`4�c�m4�c�F˿��Ea��S<=儶LŬF�<
���_�̟��M��M{�����v���rB#�.�\�I�%���ii�h�$i3W�F ����>�o4:!M_	s��IK�蚿�=��"L]���OxS�Ii
�F%בE�`�Hӟ��B����/��w�y�WH�Eۧe�(/~���!����$��ӫ$�7��X|~��g3/}Az�LM��V'W���^��dk���׳zB���z]��I��=z�|����^��]�5�z��{��=e�>������z{y�C�u�ݼ^r��w�n^/}в/2ݼ^��eF7��>qYP�����B���w@㟭h��z4�Ylҵ�h���k��g�I��;���V�tl��l����?�J:v4��.�;�,���q�g�g�p@�%��|h��H����6-��ǁ�?�����o-��W��c=���c�gH�}	����I���#��MRu��?���Rzh}�T]'=����T]%=��Ej�P
�"UWHϮ�o������w���Dz����f��q�G���,��Iյ%��i����d{��&UWGn��?I�h���!1-��s�.�im*�$f����ݨ���T]ZB�R����$�ObV��OI��q�/R�UK���������H�W���G��K����u�=�i��T]=����T]={�H��j��?"U?i��K$��
����Ĵ2���OH�W̼��OI�ꢃ����Hoob+��&!�9�iY3.� 1�j@��KuQ��E��`dW�M���^�7$��%�\�B��^���[R�g4���u��"�4�;�f�P�\�ߓ��"�H�W���IՅ�����ia&��6.��D]������E�+��z�C���Ya4^_3j�a�^#1����)�b(�)mc�T�$�U�i���Ĵ*z&ϿNbZ=�(�T�Ɛ���Ĵ&z�ϿIbZR��4�Uڽ��ϿE������?J��3�o���A}�D]
�wI����=��Du~�T]��HԷ�R��G���*mP�A��*�NȜ��%Q�|�F􇤦5�ߚ��D]���I�4�?!U���Ĵ���>�iM}��$f�e�$��J�2�󟑘ENo����4�$��d���ό�)�b�,.N���?O����[/^~���ӭ��[�����F:��:�]��vˎ�݃�l{oxwt�Dz�'�A��XL��n��J�ӵ{�;��F��=�lO�;�����/�-o��>����g.=�8���f���7������l��h{������'�gT��;������x��;��H�����?w�oo�f�O�y����|��s�?�܅��.?�����7n�^�u{��ݻ{�����K��8����̿:�������o�ߛ0����x�΃w?z��7�!x|�PK/WUW�?$�#pip/_vendor/chardet/latin1prober.py�Xks����_��@���$�n-�!�.F^��J�\�,{�B�
β�~O��,U��t�>�1�Je���{_#��hң���V�
M�Z����QsA2�K����C�$t����H�#|�4�PmX��A(��څx�Z	MjAf�i菄�|o%��\�C�{F�0£^)?�0])���ZxF��n[ܥ�4�Zm@�`��Ԩ�l�0�W�A� �1�F4��Ob�D��hy�F|ը�+D��~�+�k���������yPa�1y�����*�7�P� �4�w����BA�Z���mԚ|/$-�2J��)C^8�Ui�j.^Z�s��a��Q�䯣k���W

���] }���a$ȋh�k�C��>;2I����8�_HHș�ˏj5�-�XG�T���r�X��
P.�!{SPD:'�fP� ����;A�H,�A�K����)uG?���x�M|�.J)
�X��U aQi/48����
��`8��`��7�P�S�����v�tu=�r'��+D�bN�$�)^��R!��$��$�(o�9=xOe�v՜<t�jsT
���R$�����駖���Nua��o��o��Ԇ�>(��\�t?PJ��\E�U/��6[��<��M��z��C�.��X�BcӘ�J",T����Q�vW"o�Vw�N��`q"�U��*�p�M�*�v'�hY�qӝ�Fח�_�`Y�}�4�*�Z�P�-w�
�6/�xt'Z��E��ة+iP�@�'��y��B�|g�X꣆&�?��"�܅�t�<cg�ǒ<1��'���H�3�oi�g�c�MY(�bi>���]�3N�T9�L�»����[.L�l����;c\�h��|��|6���󵘯u<_��Z�󵙯}<_���%>4�k�}`�	� ��>�Ɲ2��^��;e�ӭ�&�]���>f|�B
�}���0_g/ߋ�u��S���z�{w�|g���]l���q�w��T���'�×��%||��8�t�~�2_����e���|��w~<�9��|��t)��a>��&\v�q��d|nn�$��.^�s��y�|�~`��7�0��|�Λp�%�1_/�ss� y|}����>���|��U��&}&FŽ�����(�
�ZX�^�
�L!'?��o�%� �a��`?�e�/N5�]b?b�������\��·�\oԄG{5��[֜�l��V8���;���.�Q�짋Rf��*��DIi�du�8�яM�PH���9�U#,jt��T(9�5F�j����
��̌O�3?=Xe�(t0���x�3��|#Csݛ�mU�yՀ#�/Y8�ܿ�i����g杀�<�gs,�M�Wzf���R�a�+��¬uH������Ӊ�����k��yY1���v���~2U��s�,󀸹�
�Dž�r�EN�/Փ���fƻ�����:�>ϴ9m.��Vv��7��:�%W,�"7��}O���F��ȶ�b\Lc��v�興�r^#w:��� ���]宺�[�����-��u�!Q2�e��G��*\ȹ�R�,�"FD^�9�=�mg$�l6�v�H2J�'���n�E3�U����5I��'�*�D���M��T{�m޾-ةѯ������_�b��>�
0p&�x*�oLnL�T�x�L���t��D����^H�{��Rii6�}N�Gw6:���/4�PK/WUWg�{�%pip/_vendor/chardet/macromanprober.py�Xis"9�ί�h����ݶ۳�9�k�pOt8�\[�Sv��~_�..,��/_^R���`��κ��tq��G]:���M/��h���z*�Y
�T͔��,�!ªț�NƵ���4�w4�K��+X�*�5���9]���W���:��R�W���H=��`������J�����j8��U��'�9���Ր�Kk|1�
�E�|X�#��x�cwÆ]�8�c),܃'v'��Y�|	�K�v���;�k�
����42~��ē��l���l*_1B+��Db*斬�K�u("�⠢{'z)�G�R�}�BH�'|��:r��%�"�<��и`����.�1��$�g�N��R/�m,��$�"��D4�]��ZX��"��f���qh�||�_Ӆ4��HƠ�Z���B�22�PSs3E�{l�(5�z�]�NI*�37W
F�Q�2�Tc�RYX��1g`F/�ZaI���A��T��> ���p��Jw�F�A K��������[�a�?�y
Y����D�
�/x��.a8\v���@���/��?������7R��Z��y���5�����`ԭ!�Rf!�`�
r�T���z*0��?�^�)=�'�4�pJ2_��@G��_@�����Q�m��c��AyneZ��V���Z�=��1@
F����{��q�δ�,z����'�Y���Gy�C�~�{�A��67��c�q�xm]�2��Gau%�t�J��L�����Wn0���"��YTc��v�3i�Ɠ��%��>�Jם�ԉܲ��HNK��wz<��
h��h�0�RX�se��@Z��G�o�&A1��dn�Gm��2���;�3v�Y�Oԧ����f���1�r�o�����@=�`ɵ"�s)�R����9a��l��)�����e�T�pO%V��>K����|e�E��V��e%�;-�0n�wa;�g��'�8�j0��N�ʻ �IdT�����Y,
6hB��iq�Z�ͤ�
)(��{���.6���[�I �(�
�H!������9Vc�g��
ج���p�u�C���KxJ���"\��Q?�v̰޾0�ټ��<f�fk0[co��5�fk2[so�&�5Wذ�ߺ���>'l�@�0f���v�l�;�^����|�u��}���D�0f���v�lG;�^��َR���jv�Ǘ�;f��-�غVo�lǽ�`kX�N���M�l'�v���(k1[kkt:٥@�qa���^og�v��������m���[�������m5���n3[���19`f�捕�2m���u�`۰�.�u��J��Ø����i/�(�z��;*`�0��z�R��u�Jh��p����2o)0�X���	43�t:{x���%�H�{t7d�q��m7O� qĭ�qv׫o��\����s���C�����E����{��%���a��aɏW�7�.t{o|\v*y��޽�:ǼK��Zێ�8����D�L?���f��'�u$�y��N��J-��S@�& �n1'~ڎe9-d�Ӝ�8�	��N7*�����]�%���K^2��i��V�&�p��4h��X��i��7��u�g����z��5��/p���n>�+b�}67�hw�'�'h܋~��pvZ��p���4��W<�ipl�zi+�k����<��o�PA76.bK��#��E��K�X�-=�\Ϥ�:�*Be���
ߛd�_.,o��գf�9�"iM����WL��7�l��d>.����6���Zm�:���k�Ŋh��ޔw��G�O��m�p]����q~^7��W; _�M�?O.�[��X��Ҷ��Z�[�
��Cr{�7��\;HR�y�q@S4�13�Wjeha�y�f�w�����^�{�!��u��ۮQX�/�n�$�Gµ:'#i�M���oK
����\�ƅ�W���
���#����N�^ft���w�\�ˀ�
�xQ
��龨첶ˬ����Qs3��D�PK/WUW����:�&pip/_vendor/chardet/mbcharsetprober.py�Vko�H�ί�"�Z�B������-FU�F�`�aT3�f���_�gl0��v��U`��s�=�a_]��0�p��f=����۫�y+Nc-�B���*�$=��"�ͥx���&X1m���[X�)�i��GHa���ՆkR�h؏�5�p�׉�BI��z�t��4Q:;4g���ئ��PL;���V�j�:}l�ڀ(5oR'�i�l
M���Y&]%����L�'DOL����Z��ВU4�ڕ���l��+w��|S�R��V*�(!mt��j�9���Ii�ɨ�@:��U	L��0)�g���w��V����(�!Dp�Z��f���hNCn�=p�58M�E,8E����mܙY��;"��+��5�%.p�b���	}l���v�
@5f��9�AzK1j����2
I�v������$-8%�GI�l��{�=ꌞ�kg:팼�[آ>�E�3$�����J3i� ��޴����`8�����f3ꏧԡIg�
��agJ��t2����8�{���e"�G�\+(��a"6Y��(��8�{�(s�1j!1��f�K5��\���� �-���B�����-T(��f�٠?�0b�{�������R�Aw�Xg�ԁo�c�ݺnj���3�\�Pot�/7�U�iL��n�B����Fbq�m$�]f�tK)oא;�.���;p�,��v�F��=�q;I���1�4��f�JH�[�73w���\�L0�;�!�˄-y_�h~����n
�{�J���`�&�w[�O��N~a3a�P�ZM����&闐G���k��Q)�~�2�9cJ�����W��/4R�g���$X��z3�>�|�~�@��q�|��ӑ�W��R�^A�8E˪�1B�>�>D��k\/����ڢ����U���xP�T�wdȌ�b��WE����*"��P-��p�/��G��l_�o�8x���7��#s+̞%�V>�iU�-K:���ܖ��pS�miymϺ~*؞��		�*!�_6�K��'�(˩�瓹n�����4Z�{��K�$�dY+��O��!����z\k$�'`��Sm�:f)d�͗l��1�w�]n"���tr����]�O����q�IɁ7�)�c���ѽ?��3��bp'�㥢�5K$Zs���jE�V�X�"�!�|<_گ�	�l]>����5r�E^<6�J�ُ؋��o�n��o�~=vi��������Ja���9)�}��u����漨��]*�s�����;��7Ӑ���B��T2!����|�8�zݹ�{��~�O��_s'�m��Q�e|�(E�b�|��
-�{A�3A*PK/WUW?�%-�S&pip/_vendor/chardet/mbcsgroupprober.py�U�o�8��_1R��D9`o�ݭ�$��KC����tB&q���#�i�����+�Y��̼y�y3vnn�/�Fc�&co�G�O��O�
��vC�5��+��$O'���G�KH�h��7�x͌��x촡�V�0V�	�~�7.u�
��j�}�l�2�f�+3'���4�6�S����OhYl/�b���
l�vT��m�;��
oQOJ
K���[n�x�������Q_�6��B���+B����-!CGNSP��V[D�.�0�K���w����L�H'>���Xf�R��pNV����Q�s��"�awIA>GL%h���NDZ��\%���q���G��&ܢ>q�
r
�1�'"��rb���f�G}�e"�>j�o{rG\�_�]�,�mu�����̕�c�2�����9D^��XiBBmi��^@�B�1���[��	`�i<���g����=�|,�/��c�L
�*Ô+�8�w��^<Ϟ���?�"NC�Q�gco>���`
Z�8��K1���!q
ʍ��89LH�+��HP&�fom�9�ZBc����R�ն^��#����w#0;�ً�����l6�s �^%Z!|(RP�֦I}m]	}�!���tڷ�O��<��w����x#��j��Ij-��sf���u���l-{�NZ�gU�O�ݨ�TC��~=�0U@\�8F{���U�V|(�;"��l��{�4y�j.@?�s�{�͞*�ղ��ӭ�F��V���5[VQ�^��/�V1��8�@r�~�B��=�V�%��E��D���@q�a�SZ,��Ţn�L���j�n�v&0}?3���?h��_�k�w��9��z��A}B���q��ޭ]]���(ױ�z�Y��9�����uڝ+a�!8w����8�W��r�:i��럪&?AWo�PK/WUW)V��Q�vpip/_vendor/chardet/mbcssm.py�ms�����Sh�7������}��N7��0�3���`,'�Ő8����>�ǩw7��D���|$�����ᗋ+2�8^M��tt}��hG
2}��ڳ�-ǰə;�����Ӳm���	i�G��±�����G�wA�
�_�7�G
I��ʱL#�\LJ?�G�����x��Q#�s2[��2<f�q
�z���5�`B(?&'�M�L�1���D�&g�x�l��{��GH!��� 7�}�YK��€.�Y���ƶf��Y+-<J��.�g��Od�i8ģs���!b8���_�sk�fI+g�aWPo��m��ꖌ�WJ�P�zP���̶L(<�L�>ydi�æ��مL�!�.�[���s?Qχ�>n�g�,6��F����#+�.zMl�^\�X���Ή�f���0}�Lj�(Y�t���`������)9��A����'W��@-
�p��%k�h[`j�N�������P���bt1�����bz5�L�����������vt2&7�����	�q��5r��0�t�%�40,��U��ׇ���x�p�Mj�ExE�[�C�u��B�M�~"ւ8n�$Ϟ�<}��V6��	�y�$���n���[0}n���$��0��	�Uۭ���4�E��R�~���s�N�qt���%9���r���a>X�f�n#{����	˽也!7*J���2��Gpѧ_��X��G,��l4!���G��VS���
/��g��a��3QB�F6����d�+Z`D
wfDgFe�j�s��i���1k�Rkmf��/�1k�Rk���ZӘ5�[k7�;�:�Z�_*c�:�ֺ�Z��Z�Y�Z�1k�Rk=f�Wj�Ϭ�%�x����>��i�w��̚�/�1kz���6(�6`��5M���`�nM��d̚�(�͘�Y���6+�f2kf�5�Y3K�͙�y��9�6/�F�5Zj�2k��ڂY[H���������'Ӥ/Ľ��p<�7SI�)�GQ�,+�MRCU�_�I����p�i�u�JԽ�n��&5�����ݠ�y`���hxu@4�� q8�9��rywy�y8�X����3m��cf�wI�j�8sa�@ΐۍ�C��.3��E�ΦN�d�#�c,��ݩu�}�<�s�g7��;�0!��_���r�.s�j�/u�s_�/��w�ػt���ٹ�N�.)���̋���g�����fO0/�U��I�~�]������U��=�E�1�h(Ý��x$$Ľf���M�(�"�z<�D.�a�o���/��6?h���.?��:?�I=�d�+���m�P�{ʽo��"3$z�$_���=��l���|�^�	����!O�{몱C훲
�0���j�J󌇌�ի�}�j���q7��m#LK�F{�-j�oB�bn�B�=T���a�PC��L�z�)R�ޤb`�b`���p�Kb
G����E�$�p�K&CQ.�G�d2�*�Rk8�%��(�L��\�r�d(�%��(�L��\��Q.!�k�(���r�d(��-�P��*�rId8�%��(�D��\2�^��(�L��\jS�g�\2�rId8�%�t3Q.�ߡ0��s�&���Ű���/��(�U���Ӯ���Xu[sdzHk�t%rV�X���h�J;��\����Z�A��[S�}��OO�>�Z�>��Ϡ��>����6���, ����0��d~$2?2��ÏL��G"��#�!���6?2��ÏL��G�?EC|�
~
��{��ÏL��G"��#԰Pf�~���z��E�փ|����oI�GYW�<�$��i��N�;+��9��~K�h�N��8v�_�?9�>4L���[>p���f�i�ʧC�d*?#ȗO�����ڲQ�#W�5[�-��)��O{=A~�����~N��rp���g�[;��zM��і�ez3�e���짶������c%�G�J��=�0�&Q>�I�|���n�e�P�9@[7�~��;�|�pD�����[���!T#���oјZ�%Hk�4AZG����i}A�.H8H"r
/�&:G�&h	a��u»Xe��ǻ*��m50V��)-Wǂ��]�Ԫ���O~�F$À5���B�����\�B��ε&B&���Tܡ1��*���>3��~��a��S)�ЃQR�G��X�`��de�/%�0f�d�6%2�2��L봬t�u�Yk�az���
��0�
繵rt+�Kaȕ���D-��m�u�L�\:�-�0e����M��'kU�zu��f�
A��H�Bj��(��
��:���r�h�i�u����1NA[�㻶y��8�Y�_��I�/W���T��T��־���V�O��ks�Q3�H�#�����k��pʐ|^~?�D���N�/��qM"ø&�!\��0��d�$2�k2�5��L�pM"ø&�!\��0�	59\�z���n\��ޘn��}xZQ!E�>�!��V�EiO�}��;�9�B�k���V�0Ls側���t<��B�"�p���/H�-�a+����E),���@jR�gY.[����Y(<�h���%��l�^v��y�F�£�YQ�\�1�y�c��l��L��J��b�58�P�B5�T�g8��^���3��c2q�3��"\������P�M��8!��($#[�
�$�
7n��I�[Ĵ�Jd��kb��<X�����S����2�D���Þ���c��
.�rL+���V"�L+�!�m�?�]�C�l�؉����7tZa�����%%��=��ܥ>/j�N`0�
����e�B�	}_��r�籎��'������l�'�+��L��ߐt��-ט���N��K�����U&�D9���Čؑo3�<z,�Cp��H�"f�۳I[9b�`I��cHF�0c$��d8X�k�1�t-/C�!��C͏v$2�k�1d2�f�1�D�C&C�!�aƐ�cHd�1d���l�"��2���2���2���2��}ծ~�.���}��v]��(��|ok�Wq�}x(�UcH��V�5�Q�E��&3Xᖣ`R�1�˫+<o�)���#��TEˀO��h��_�+S~6��
�$�i	k�A�����S4��荀r��(+{#��썀��������.����
zҼ��v��P�%9�0���z�P�E0T�ʆ�C�vj�� i$��v
�F�AҨ$�� )W!$�6��)D���[�H�Y��x[��l�J"{[� +C�������'��O�[�\��S~��X��I"�$����0'^�e��2��2�,C��b�B��_�Zl,TC�ྶ��b�i�b��n�G;B��9�(F/�3��[)g��.�<m��UR�4���D����jь����
�e�P�Fr2<�gM�m�7v��J�[��+������P�]U�x�tu���=}���J�[��+������P�}U�x��u��*��]�骢x�麢o�<q��*�r�*�o���^�y��r���r��;?O�O?S�ف��LWf���WYS�a��yЭH����o/�a�D:<"��M��	H>N�
�F�ʂ�D
b��|a5_1A�T���PK/WUWpip/_vendor/chardet/py.typedPK/WUW�����!pip/_vendor/chardet/resultdict.pymP�J1��W<� �xP<�����ED$&��`6��e�ޤk�T��0�ͼ�F�Fo\�{	���c��^>=>o��d�	[UF�cu�\؍���Ȅ��0.V�$�[l�Ա���n1��;ͪ��B=RG 	����S�B��#������4������v�ZҊ��8�T��3~5�+EN��7�o1����Q�E5�e�f�
�����U	;	��qU��PK/WUW\��Q&pip/_vendor/chardet/sbcharsetprober.py�X�o�6��ŠA���N�����9��u��悜@˴M��������G�m����ș�p�����K�f0��]����I�fNc-��g��j�It��R2����;ކ逇��!�B��i��J�" ��/\�פVֈ�����vK�m���B�^�Ni��t�t��i�B����J�Ŵ����MH�)�w:gQKަ��41�Mx��_�7�+?�b�~�ഋ�;���^ȵ[zG�0�P�>�(�RL7{�0�̾��k-�&�b����4��U�
�?�^E�1�4_� >�
���_��V-�jo�"���k�\o���7�9
y���
�����B
�C�q?��ڙ�`����(2M�k���웳���B���Dbw�&��p��0�B�=I�K���Z�7]���
�� }E�тS�U$[�Z�c0��g�=��ɤ7�=|-\�]88�$�;) ����P�I���p0{0�_f#g:���ztߛ����7����~<u�p.穉�1댜�x�[K"I��A|��7��rI���f�#���!����T���,�A?�X����j��AxV�)�[�
�ݢ�31�Y�S�_�D_K�t�.Uһx;�gg�wg�vΈ�S�{�]}#��4+��	�;�k�k&���M����ؖ/g�N"��6��lPB�ż��vZ-`�DF�S��ń���@�<Di��Vz�"C5�!VZp�����g.�F�e���$��J��}ȓc�粙�
�*������ݮJ�#�.�:7T���mw�v]k�G����T�s��"I�8�6&��tw*��p��j�VR��R<s�sY�	�J�A�JI���n�<��<z�ؾ��[r�i��~���H��-^�t��x~s�N��;��8����
g��߈f������sˊl�����x2��g%�N���%97���:
K��+r]���M�b���U+{K]��L���2� �f����p��fq�X2��F�O�N��'���u�P����L�Ӓ��8. ������c�ᕓρ:�D_�@�:��X�9��O/�#
W.�^�X�UHa�>�J���0�'LM8]�����a�& ;��8�����lĤ�����i�Bd��&-k6=�"���(�_��i�!ܖ`�`���wʕ��J����alb�,���3V�<�ܫ _{mP,ں^����=ɯ�}���)@��~#`�ȣl�~���^���BD���>3�s/d�	�{�݁��j�k��H�U�v�F-�ͺ2���*�=�M�xK׌&�ll�Z��\�܅:ݸR?�� ^6
��*^���"^���]t��规��x����+�9����@�:0auK�V��J�ה��UR�8��
͔4O�[��[�j�u+ݐ��d$:g6<�.ۭ4鉅�*�g���‭���@����k��N�\&M�ڪ6a��ʹ���Ӓ����s7�!^1�L�.�C�ߛ��ɕ3���е�Θ��7�x~�i���@�}���b�t��X���_[��L��$B��h6�ġ�nM�bv�2]|҅g��!?l�qY���nŵ��:��n�03��������]1R��E��)��Qxa�8�"!B/v�?k��\��e�T �g�s��Z�BwwL\�i��J����zU{BrJY�WKji$b��4���>=�jU!�[�H�VNz����}������%�I�V
�T
_�:_��c�����ӟ
F7�����S���jCd�J,M��j��&_m�օY�+9�I䍀�j�Fm]�E�n��?e=D�D�����\��*�U�\�W���e'\����`V�C?X�H�ro]��".�+��53�����C/
��7J.A�C�̒��Se������s�m���3���s��dm�ALgm��so�x>��e9�:�����w^
��Li2�#���o6��������r٣$1��O)1�,3;Nk^W�����?o�3ا�B �<l���!���쿒yJئ`�=�MFx/��)[�$��j��Y���j������Zq�%�/�z�>��;U�������׍�PK/WUW"r��)&pip/_vendor/chardet/sbcsgroupprober.py�Wmk�H��_q�V���K��rԦ5Ԫ$J)��dԡ1#3����$Z��k?l��u�9�y��e�G��P��:ߡN�}����4^p*1	��+#NBӋ�W�1�I">�Ҡ��47q�C#�`m^l�D���c���L4��萭8���4!3B&?�J���i$U�*��h���U1e�V�Z�u�ts}�D%{��qL����q���rO�21JLS�W�x!za�F"�+��+�������,d�q��
��XZ���E�B��bjc�;S���3����)�,!�#�s���!�D�K����lc��$���-��Ro��4�P�k�BO<�
�G�4!��"���4��^|�����У|�{�t�ۦ/t�lm��
�J5f��H��
�a�b�Km%��!��4"�d�$� ]��h�)�|��
 ��^�qo8S{�F�m�k�o��E*@E�s$�\���J��l`8^�ۃD�����ߧǡGm���۝���&�h�;M$��m�m0�����K�H�I��u�ҫa`т}p�9�誈*d��Rc��3!��{3J�i�Z	���(�@��o]6t�K�c�������1�R5�#���/m�^ߴZ�W�?�[D/�>rg�ˋ��B�4��2W2]���"H�m�.(>7O�2�(�ȂO_��{�[�-f�|��s�K�F<�2��0������I����A�2|p�
���a������!ux���W��<y��\��>e,w���'u��bHȞd�T�W��r�&�����ŷ�����g�J�>�}a����&���zK�����
��н�*�K��}��>
��\J�}�LQ�d����`�k�G)3�z�8����x�=�~�$��E��+��<杍�E�E|q�Lk�;]�j�m�ee����@`�AM�xV���h ���S,�Z����Hy�q?K���9�v��p��<�E�����vm���#��Iؒ
~���0?�–>d#1�0�&��&����|��z��0Ʈ*�:����O��4�Ф,��!4~��cΟ�׀�U��x��M]��^<�Ze��y�=8�n<v<�z��e��+1�c��0Ieo�Mk��׸?�e�L�=c�AƩC�z���q�Ͱ@3 �F"��
�†�M촥]�2�	wU�Z�+�")�af
���t���/ą)��K��\�վd{�2�!�mR�+�;`�	X��4����x�t��fx�ߥ
8U&��V�q@�<S��$>S��@>W}Ŋ������ӥ�}��%����_�t�@l��{���'��@����2��7yˈ$�k}e��Z���폵�p�b���i���{��3"p|������,���-���q��j4r�S�6
�l�PK/WUW���>V�!pip/_vendor/chardet/sjisprober.py�Vmo�6��_qHP��/n1`m�b�_w~�$��@�%��*�I%U��z�-�˰	b��<w������n�w�̦�����l9���^�.��QXJ�e��0>� ?X���[�p��*L��i��#�DC��D���T+��).EQ̙G4\���� 1����=I��>l������k����������G�F��,c�����'�g�גmb-d[u>�
���o�b�V��#Ԡ��<��	�F��I)(�g��G8H�3�ѣ���Y��������ZS�Bû�fTa�pG9���*ބ�C�y�+
D�ެ�]���b�D }��
P����
W�m�_x�� $��6�c5�����@�%�2���v���$�D���`C!V4��.2�-|�:�˵��|X�`�<ܠ-*��X���E��!1f%	�	��5�G��v:�:&���Y�m&K�X�t��
,X�����lJ���M"�H	Tҧ��Pe�?`y��#O��Q���>yU
C��i����ϒa�`��TY��v��^~���B,���	�z
!�p+�6��b����W�w�}���+�/F�p�\�Z��d�0-��9:k��;=oGd�*�
s#�����8@��#���[��#���p���fg����c<O�U���ua%Ŧ���=��ף1��~�G�D���z�Xق?5�M4�M�*ݭ0JEunמ���h<k�Z^H�JW3P��g�&l�\��sݶ�aЁ�O��f��Q1μv�W�u�-D�b�����A�s������l�N]��C��>FI�K����_�^��*�uRzʫ�r��!&Z��Tǒ�����	��d����dO8F{Q�Pꧨ.^�������]e�fh&�)q��+�)}�8�p��6Z6�BU��eY0�r0G硦�"�N�y� L��"����Q8�K�(�C�ǃ��[��:�V6G(�[��O7�}bb��7
�/?�;�ר���qiro�E���Pk�̊~h6a�˝�tJ��U�-��;� 6���UJN��H��{�\/F����^�΍�n��
']�E�XJ��?Z�Q�T8tˌ��S�*7����#:2����#!=���M��h�ԇ�n���p�P��x\{����|���P��ye������d
f�]m�I��F���?�%8�@j��.��\�+Sl�Ժ�݃c0;�3]�}8n�f�B���x�s�s���G�������O�G�S�n�/-g�v\����lt����x���:����P�|��n)�2�S��(%:wt�nn��y��ޮ��=��PK/WUWJ+n9�:(pip/_vendor/chardet/universaldetector.py��w���w�[������һ��������I,���D��	w������JZa��]�r{wfvw�gvsz���e�z0"�A�7����)�==9%�#����]ꐮg1bsr�l;%���|3���b3�'&�'1��k6�]�'�x�oA
i����t�`h�]ۤ��~�7�/~������30��w�bq)�#���Z�ڭ�v��Zp�\8�GXN�g���I����<��Uy�#��P�����ҷפA`�	<r�V�+ ƫ�G�伂C����=���C�.|���v��켐��%>�l.�N���w��kϲ;
]΋�
���1��Gd�8�\3����]8wl����\��d�c|����G!}���!̆y\�#�m���"�u8+����� b
6�#�ˏ1
-ғZ�v�~�p�-��3r��:PX�n0y{�0!�������h�
��(`,)��ca8�O�`7���[��������`2�Ǥ{O.���d�}^ܓ�����q��2���cr���\{�I0j;\�=������1���"4d�;J���.�y%e�b/��u��m�Pςt�J*�:X�i���Q����o/�t��<�N.= ���6ۭV��:k�y�H�Gz�����I�R9���a�
x��p>�{�x�b�:�rG]��
U	�7`���1�
��@��-@��b��qrҡ!(��ɚwՎ�E��k)�b�՜�+PW`͗u�⤺���}�lA�xDԔ3����E��	�����6�����o	�.�_A�6�6H7�u�ɭ0I�ԑ��$�y���́SZf�,�ƙ;1�E�Bg��W��&�8�:Rw�%����:A,ذ��q��]��M��]l����ؚ��7u��7Լ��,���v�\v�E^���N`�f�݋�+�@���XK/�Wg�,�ä���I����@�!�-�7��٬�/�E��(M&1
CZ�-B�D�� ���F���C�!G�
�т��
��@��܈G�0Ha
�n �n�s�N˟��C��m�0hJ
9z��nGR6a����E�TkYc��U�ޚM�;8Q~�t<�rH�5�)����⇛�hp�p3��������i��b������7��Mz�	���d
�[ol�U�?�7?���*r�޸[
]��<;��~�E����ȿN�ƷSD����_��Vl�5��_�n�*Ryg����V�e�R�@�sPM-��TK�*�J�}�Lu��z��z��z��j����~��T�r�
ȎVA��ヒ5��f[Hf�K��ߝ�t�x���9sxD��.�@�Y����:D��P���b|�� �X�
����Ȝ�*?Bn��E��/��҆0c�	z�:6o�j7+B�y/˗�YK��e�y��&��G'�w�_�V��y6Z����3��DB'�~d:Ũ>�V4ΜEJ��r�q���S���q1��2���'IM���C��b�:�#�i�HF��:�-Sy�ȅN��$Q�C>�}�H$G#�E�L)A�.�;"s�PX�ç,��%�e�KJ-�Y
.\�Φ�F37�D\/ ��݈�1�sG[z��]Z2mcr2�D��������`�À��<
�ɬ�D0�����MB�4΀89c��ThѴ�[vE�tk�2f���C��
��yb�P��rU^����,}���2��ä4�dJ�f0����8%�Q�ur$R�!y�P̚qE�l%%���(��|'Z�̩�Ukv�)q"8�
"�g�c	Y��f�W���{"k�\gG\&"IBqd�h�Py�ޜ[�2G��L4Ҭ���p
?D1$P���,]c���jv|�y|E[�:��sg<XTbr�9?����(P�D!�"J�:K5G'�x�'c�$�U`�QB~\���[�}z�&&�K0��}D%��r	���8�{�F˕Ze��aO�
RU��],�cU1�!Y4���0W

�>Q'd�
P���g��
�%g��4"�e��\ jU$��K��@E��F�G/ٛŀl��E~ը6�I"ɾjʡ�r�k!E�J��:[��N�=�n��vfg���V�þJ,��Hx�~��jZ�&~�zWk������=Q!�l�p���v����Tc<E7kY1Zt���Rڧ�o�<�t����.���͇M��n�|�#��c�G7��j֗ewvJQ]�n�C�M>X�N�L�xY]�LJ0$*bVe��S�8��B����Kr�'H�q�,Y�9�¼��D*~��+u=p&@���_����ԯ���"���^�/{5-��}��f�N���ı��a
�Z6u�L;�P��O�r֞�Z�$*������J�@��+?�{�|�����*z�#��/�$tCB���d��{	8���h�k_�B�dr{uۑ�N�#��
7���,�
2��N�y^/��*��|��UC�����]()�B�@ʣ���"R*���ʢ�zq��#���B��ȹ��N��D��^��8Dǰ�9ǀ��C�&�T2l���!]�S��BhO(GY}�(~��.���"9�dE6���-����
�2��cݳ��E�V(a�^ِMʢ�q��_!r���L�PR%t��)vy
���JӋ�W&	͢�V��\���������k�?�4_R�<\Mnh_�-����|R5�e�L��%��y�J�.�$��x����lȶ����T�ɨ��8}�vlq��j��Z;)j\��K$�ލR&�ѵ^��DD�H�@��0��&%;"�Ӯ���p:đk�,�@
U�}
W���h�$�fIއ��.Y$�Vmt;�P
���ť���o��vE��/6�KAu�{�a�?��v��J}�E�	�Nx��
/
�;��n��Ōc�cb��L��fI"
$+��j��Zӛ����?6���D4��7�RR1�o����(�j̨GZ)�Lц�d)^v�&�zZ��C�����.�'�(x���{1&�A}�E2��B��A>vWEQ�!�kb&34�-Cޟk�r����&�26��ӧL����,a�+���U�ἲ�xc�>Z���__ye�ЕgO��Mj�"sxΖ��c�-��(&
��;��s��*Њu
E��FQC����'��	V\�Z�������h
��*=��ɆkUs�;���ʫ_}�r4r�]K���pĮ��5�m?�9�S��R f��Q�Q�+�Y�_�'&�ܗ]�'������""Oz��QKr{�^�����K���xf�g.���AkFt�,�\B$�i+��̮x'~�Tln��C�#GFَ�9��eV'�T��np˰�1}J�<�ۀ�=Q�բ�b�.'nq[�smU߳���Ǵ���c�b�pY�����OI�P�4��؂��A,��rZA�Tb�,��e���|mr\"��ͬ�-z~�p=�5�ǜ�@��5�ϱ�J�~Aq(�������i4K�tT��U�����WW�IݖK�hy�P��sB��2�ƞ�NP��UA�P�/���tA{4^W
J�jJ/���|�d��Z����bꯆ��%�Ge{�J�<@"=�J��r�.�b"?�p��G�j�s�Ә^_��۔5�N��GV���K2]_<����zX� ��:�Ul��Q��Ձ�ӱ�^��!�㝴Z���&���q8-���1��QP�k�0"}7���2��J�k����	5�[O+O��-���W"+!k��Z4�8�b\�h��G��F��x�[,$SOl����Z#N_�]�.J�����f}!ÈK��P���p��4(�cU����%^�O��_������nY4�()/T�u�?q(�&�ҳ����G)��^p�*�p�
��oxɭ��U2��;�ë+����sxIN�ߑ��"�ez8�2h��.�r8�R�ij��PK/WUW�Q9!$pip/_vendor/chardet/utf1632prober.py�Y�o�8��ŻV��J	�Vs���f��Ъ�ۛ�"�jb6vJ���!I���ju��`����ggo����֧N�:�n��W�?B	�����
L(�QaEWOp��U�d�l$�d��� � d��rZ�f�B��*���1a��"�D
�?��(�̘���D���O�;��Z��'�I��Rx�|%<hLÔ��a0�|m��m���|.p��~��h֝�j	b
TfH�Ԕ�(�$C���B,5�,�XMQ�1��3!%8D����!��O����w}8�~���noϺ�/�֌��G#��T
F�B�9
��[��#��y��Bҷ;�n�׃��-����m�sqwuv7w�7׽V����d�"#�&�r�ВCn��:V��W��rc�����(OM�/�T���,K�~�C�L
f���1*�]DY�������;�X� �=do��R���J"�|�����4��Æp�Ñ�Z��-Sho���|*P+t�

��Q���܉��ޘ���i�h���{������DB@3��3�;;;�dZ�]��6c�J��vww�
ؘIS<aT+������Ea������
3�p]���x�1�-�l�)��;|!9������6�"�l�C�b���Z�6��@���,����ɤx�P�5���@$�W����6�����
�� �[v�s
�v	lp���9�(P�K��P�򞣽�R���|��#7�cb,Lm��a���J�	C�|�<,#��Tܧ��9�$��_y`�S������麘�=3۽l�[��uN��HVdh�'TaȸB���OS�Q]"�5�����<�bI�?UZ[����\�u�ޞ�B�N����X�!��uE ��V�0~�?BW<8zt4�p��S��r
9��8;c�r�qQ,��o|�o�(K�8q��)Upv5s�񺟲�?G,�A�5K�q����������"��谹�a���6�I�՘�j�
�S&B���[.�V�e+�z5��x`C8,����Wo�K�7���W3O� ��܀M�2�1Z�n��ڥ�,��T�K"zBn�0�]�ާ��Mr��A�{��7B</�/!��h,��n	j�[+m6v��w�L/Y0�ب����eƲ)�<�h[���sK^_*fr��Tq�ټ=��z��Fs�j�f83)�@)��M$�kc�Z�u��rd�>&�e{/5���sE�J�jL��_3(��Gr���k�����+���/��)a��������o�v���6���5��^)�;z�]Y�T׌���΀�����o�\���[��Ui����Q�71`���b�Ix��8�,5�6����\�N�Ž�ׂ�~q�@��4��r�v�x���tK`���5�b���/X$wg!�3O��}��i��I���'�!�L1��eJ:6f�OxP��1��5��pt@�b)
C}�qD�Q�i��B��:�#���f+�Sd��ZЧ������x�5~š�2֚˒SF?��
�Ѡ����4�4p^��L5(�U�8�t�y}�w&VW��9^V��`��GA�	�403�k�=Y@���6�+��f��5���7�I�
]N���"�+���9��+)�,�ǡ�x�����CZd�<�f���!RJ�8Dγtill��D==\ƫ]�Wk���?�gP9���y�
�=�/�I��;Nnp��&��[:�y����q��ޢ��q���|��9*P.���	��=}Л�y\�V���kRi�z� q�9Z4c���+�h����9}��M��a���w���3��b5N�k{={��h�5���V�N�������m}��s� d���NzcK��WC4�� ��˖�8H�Z�u)F˿3����U�ޢ��ﺗn�����{��������da����9iF����W�Ԝ��7
���kޅ�+�`��#���4�G�Z ��@�tG�J�>�^^�/���c�7�޾ЮO����o�jkh���H<r���*��������k��p��Ѩ߭G��h�o=s��˔\�nG��nK�í�5l,{���PK/WUW�?��_�
!pip/_vendor/chardet/utf8prober.py�Vmo�F�ί%_ %n���ҜJ�$�`#��U���kX��E����m�����O�<��3�!��x��̦#��mx��������9
�dk�I
#S`
2�7KSb	��mVg:�L3��W��-� �'00ޡZEdKєe9g�Lp��r+d������G�McX%�q)"
ֶ�R
�Q��7q2܂a��gbxTQ�J㪓��Z�U�����̉|�Kגep	�P��(�F��&e+IdaTJ$��D�ߐ�"��p�4f��G!4�,$�g"fIaL9���ZS������fT!Sx��J�f��Ra�E�+
D���ԦQjb��5��/ս��oj�R����`W�F샐�%���inMbI��4�.�:)A�i�����@@l�
�VrE�<�#�·i��.:��m�yC'x��XT�8�
�e۔!0v%	�G��퍞0c�0�M�g�~2
�a�z0������l�b�-\߶|Jw1O���8A�L��1Մ��j�ǫ�`Æ�RsDn�D�Ňf�
�.�ŔF�;`	p���&�n��t��o�>���y�A���8�',A�I*��ÃPڄ·�{u=\]>]
�>Z�{�v��w:��b˰-���t�	�+����J�B]�}��q��_+����h�8�G��x敧N�<�/���]eX�.���V�Rٞd0�	�y8w����D)Q��V��-�x(�N���!n�.<�����)1M ޡ0�*�&=��
��J4���2u{�>�׸0� D��'Z���(D���Rlë�x5��S�?��:M�H�
Ǐ���3��"�$�
�(
Iu.9��:��9{(%|����@Κ�J�2��GT���W;��yW������]j�ͩ���ۃ�]��	e�P��8�KW�n�k��h�޷6۲=�ڥ�wվgl9n����|��4��C�'�������x܏�cځ�k\�(��r]�aJy�_��8���Zܟ�a�����j�8�{L��/��I%�SQC���O���A<y6���M��Mo�6�a��$� �)������u�V�W��ͷN��W�u)/.�Z�5��u��~UH�}��PK/WUW��C��pip/_vendor/chardet/version.pyM��N�0D{���]cAAsBPЀ�6r�M�:�y���D�C���W��޻υYƖ��j
)�(�5�tF%�L'.3l!��*KAi��
�0,��dn���Ͷp����D�"����A[���g���!6[��S,�1��Ň9GNa��w~�v]w��:��߅�p���������ۃn?l�߻_PK/WUW#pip/_vendor/chardet/cli/__init__.pyPK/WUW��7���%pip/_vendor/chardet/cli/chardetect.py�V�o�6~�_q`Q�l�)�ڰ��V K�4{�@�%�&B�I�5���#%Y����[�?�������F6�[�o��aA���J�T�x]��6�T�m�4P'r'�HԹ.d��Q��W^5J$I>�!�r��JxLzшa�����.��./޽�n��KY����� ns)O�/�Q�Z�N�O��;���sY�O�nZ��X���Q�0@Q$+r�nn���F^�t��ON�Vb�Һ|n��5WQP��^1�v�X�eY/jkIk\�ha:�?z��N�f���[�?B���F�Z�d��n}p��/�����:)0�%�Jֲ�*���
���"��V��Ȍ�͙����a������'~/��o�kM
���X���)����V�t�ʾP���u�lj+���w���+8
�<�2{0_�y��j�u��$��R
s��Ҫ���!|�˰$$��䇇��'t�o�J�,�n�+Q;��ȶ̀Պ��ZMR�bvO�nv"=�8� %Ƌ"���E|��/�>��~���|�q)D�l��`\�}�[_�a�uC�|G��>�ek�`��o��[ō:@kE�*�e�:/��~��{<��6.��I�ר���J[1Va[�Џ6�Q�7ԀbB�;���;N%'��7��O��N�oP:��ڛh��zD�Ƞ�:n���gHz����Di�����+��o��!\}��Ba溪hn�d#V[QM�Q������en�HӦG_v}?l^ �S�l#rYJQtè?kIgŧm�S��\`�#sDŽ~w�ܯV -�E�5j��1KF�3����$s�G���qm?;�;����3GD��&Ƴ�o�Ӊ|d6���l�yQd��ǃ���l�g+T���t�~���U죽�1%�!`*J̰�8�T&�|H�M���-�̘Y��Q�F
���F;����-Ka��-�-�]{�xx��s]#UL�ы�`�E��g�A���9�
�l���<1���	1a~,�o�-�
[@Ǖ�--��������N��F�P�
��h=�̣aV�4(H�< 6|K˝;��Sjn(eӞ���[�3m]S
G�P܀c=�	u����;�����r��^"��p��\�'k���Tr��u�@	lT�tЭ	7͘	?aϱ�(�2ul���4��G)�b��k
a�T�8Cτ��-r����S�-����u�����_0eN��/�~[)^J���N���d?���?PK/WUW(pip/_vendor/chardet/metadata/__init__.pyPK/WUW7R�-�4)pip/_vendor/chardet/metadata/languages.py�[�S����>�����R�W��ʌ(
���T��lHK�;�/pp�*�_Q���x�:�=5�=4��$o{���vw.��	g��ѲL��^{��^��־�����	�L���EF�w(L��"� � AQXb�"��,߁����+i�o8|�G�u!Fl�r�(��(U!T'(�.���"�C�FB,�@�"+"�*)i
�����3����Bᴵ��_)�5�e��8 W���W%�{I��l8"�2b��8,�`�# �D\'XI�@�"2+�WR����?U�j�At��v��Qٷ�U�-/))	p�$�)�K���� e���
g#���V*�W�]��x&��Q+8R��#}vڸ����5��r�78�<w)d%�Gq�F�*�Qc�)�Õ{ێ"�$�~t�w�����nV���?`8�����	���$#K���¬5�V��=F��\��@;(F�-u��(5rH
�Ê���0��D��AO#S��pu��e�'	˒3�'ԍQ7��H��D���( bF�ȉIAtw�Uc$#�=�_���?��1�A67�&eD�Pc;�1c������?��
���
L!��P�e9$��Q\S9�n���Z��v�>IfD��<�X��� � �K%*��S�n�7��n��{�R��r�	��m`�!�0�D@?q;�@���e��0מ
jgޤ'����T�N
�+�[\./��=��ldd�PjˎD�^�N{9��?��:��bYyU����l.����}��^�?�
d@���\��d��@�ž=OMuN��Nѕ~���&/���!p��[5��Mg�w��0��N�
�(�e�M
�)����#���XS��˖�Ҫ�˗Qr�2��,�����
��=ʹ������="����6MYG#�]ah)R�*Pʶ�K�\�S���K��Y��(��|A6�V��8,��PL;�ls�nV���\�d?���v�Re�e����0��.���1�r9pBɉړ���kh{r��Vd�l��:���r��&-P�5��X�1�k�1̾؃�a���	���.��#ۉ�r�P��VVX��|`�e�"����5 �Øn����{�T$��.��	�E!H\xr3h���W��j,���}E�*�V/�~ h�x����_U�Z��P<T:t�p��4�5��?u��r��s]�}w>���
���4����x�x�x�x�x�x�x�x�x�x�x�x�x�XI�&�&���j"�XOl$>%>'�$~N^I�&���Ɂ�`r(9�I�&ǒW��ɉ�d�Z�zr�tk�O����^���~XM<N�%��߳�����G0Lj��a��q	y���$��0>���^�l��v��Y����ںnMY7�i�u��f��֐5g�[�뮵hݳ��e����Z������zi��^[o�k�zk�Y��)�16cE�uk�d}��X?Ǯ�zc}���bl 6�
�FbWc㱉�d��*>`�
�[m+�k>�>\՟�����P�F�f422����Ɓ;@�b?��Y�Y��<�)�Y�Gcc�;��
�w�aw��F�^�56T�x�%A�y�t�'����}y@��^mY�Яi���1��sƲ�H[7�h��/Z�>�Oj���6ak�Ƭ�d<����]�sq��sL���9��|D��eE I	xadv��l���Xܗ��3,*��뱦j��!mV,�QA�� ���E'^J��oo
�S�~�}�>i�~[_���Nq�3+����%UK"Ɲŀ��{္ݲ�<�{{k��o�5��`~4U3j���'��y��f�f�f������������|e�6�l�oNlN�S�
sڼi�2g���9gΛ��h�3��e��}h>2�O̧�3s�1G�1sܜ4��sis��Xm�Cg�`�j>��m�"�%<��8�I`yx��X_3<�"����e��7O�_�A�+й
�]��=qޮ���7��P������(,:�!�{Q�Ʌy!"J�]Y1^u]�=R���7=��9�?l�F�퉦���ϴwZ�/�.���L���a�B>�-��6-�	��בΪ��=�^ik�:�ϔ֫�jڴ6�s�i�e,H?
�,��+���'*�n)�\X��r�
�TW��V c�"��+���3b��j	�#�&���݂�<�=R�p�x�7�k=ۦ�r��qG���PY���;�_���pH�G�(�oui	/|�ٿ.�) P�|�D�C=�e��� ��K)�V�E뿔�'�K�?	cZ[��kO��0_ko����=7nhW�>mX��8�]��mli�(D����Y��w��0��1���2`�0Õ��w�E�]���|�]/���$~=>���ߌߊ��o�g�s�B�N�n|1~/�_�ߏ?�?�?�?�?�?�?�?���W�o���A��\�Fs�
Q`��$���F�΋�Ԓ9������,U�Ct�K�4'��>���H�2p�%�M��P�~Ҧ�̌%���-K��e	�J�@Ab8��ۮ��2��*���s�hf�c�&YcЭ�ŕ��I�3�u�~���(�/�)�����(3\qt�^ز�i�OIWl��n
s@��_jo�hq,��e!�2�WP�`��lS������v]�x� n���-H�p���w[VήzC����A��ghP����W���YF��>��9�6�R�MO��7֌t�o5�d���E	⏕
�f�m�NIx��g�K�1�Vw���7`=q�~�ͷ���F�Ic0y
���Ӱ:y���ة��Oa�ʠ��[��N%Pp)L(ܮ�v	y���-ޞ;���ޝo<����Yk��|���\��-�k����cl��|�ݲ��,�~���
�ؼk�k�^ld�
�
�vG[���\��t�{A�{o��g��B{0b3f�'��6{)/_"\nRN1�_��r��ʷF/L�S�4���gϝ�`D�
��)9����t@���<]���Kƺ��B-�Li�E2R�ѧ�u{-�J��%\쌐'�a���I?��a��cv�rV��P���@�~���]���%��.��rn&��6�8�eD�@�]��È��׿����F���:��j���gE��`/-����=�ݷ��s���~�;�zڙ�os2C^7����o�;��"�;<���y?��,s�M6�
6�e3J��XNi�.���}J�k�%�hi�#-핾���Z�;�s��jiα�6�G���`K�i�t��vz��L���2�Y@��y��δ�'>y��g�H�ŭ��b<�=��~z�4��u��,c�ވ�r���#���y[���}�C�Wy!�Gb��^N졷�:�s�#�<}ȹ�c_��^��C��t�Rz움͍Hl�y��^�����D/��M�J���B�PHIx��{Ƴ0�˜�oU�^ݲ,��>߲(]ز(�����Q��Pk�a�@k���U�vM��v�������
��[��!j/Q���O��u���D!�(QLjz���D� �$Q��:Q��z���D�I�[D�!�m��u���D] ���%�"Q�u���D�O�D}H�GD}L�'D}J�gD}N�D}I�WD}M�7D]!�*Q�u����������DU�%��$z�D{I��D�It�DIt�D�It�DGIt�D���8�N��$�^#��$:E�7Ht�Do��-�!��$:K�s$:O�ŧ�m�UN
{a{F��"v/�����͙��3���R���؟S�Λ[D	��>!��WSܪ}��zOV�O]=�hͦm�j�A�",�W��f(�.����@K:m�k�n[�������b�bY��w	y!��}jSx͏�B�Da9D�rRf�3��'��P���]��n37ӌ�[s��*W��9L^�~����K�*�@g��)���Y���p	��;m��Ⱦ��'W��a9����`_�*R>��kk��]M�Z��N����{���
���������f��%u@S�PX!Q)���Aw��/�'�}�Q�L��+�д�z��SF�2�Wx�A�wvA�Ns�=*9w2�@��	�\W�ӊcVy��s�U��x�L9�EC��I�'6/�se�Ɇ���r{��B��v���"���<h��f�r�%/B8�Q0	�G��"�Z �p��	���N�g��}U�v�
��Oo�	"G�'�v��{^�t¡-�.�z��=�j�!�w�,G�A��Y�gO-]���' �T]�e��4ݮ��M�w��@]跍7���oS�.>�\�/PK/WUW�^�H�
 pip/_vendor/colorama/__init__.pyM�1O�@������S� 6�!� 1���iM/�ʾ���s����>=��F��v��M�&xA͑&X���U��mq4��%�
��_��G���#y׫�9qf�\�<D3�I�K�d'Q�N�~��Cϧp䴑��N�I�����,Z����W��)�Ҍj���Y��^^O���3r.�RcI!�����Ϝ�PK/WUWR٭���	pip/_vendor/colorama/ansi.py�V���8��+T5C-���$�Iq�̐0��&��Kc7X#{%���ߖ��T���{�n���"~��$�|�8U	��
����%����S��@R��!�L'~0[d�R�Z�m[��I���]
dU �p���(��F
���*#�`\1��H�	B|�8Me�ZܐD���xwϾ�bF���\�յ�
AF4�P��,�
���������^�m[�`jV�Y1�M-��B]�l�U��"x	P;����H%
�[��JP�bب����tZ��{g����YS�"���-lzMi��i?اܔq�U�G}�QJ%�����oeO�@�J��
Cƙ
Ö�t]�uETD\�K)�R�=��1�%DC|�}�gX�<�'�KE�ȩb�ڃN�7R�#8Q�ș�N�4ы����)d�Tbv�>�S�w�ꨵ��(�E������[�)����
%�t������;@�m@麌^�p�{�ŞΙ#�Z�]?�����<��O�B���cp㊡}$�珳�PG��|�8\�_�+�h�|	u\Q?͗%�����C7è����>�3�〔j�)�xrb�w�Ƶ�D�5��"fu�g�/�t:��2�Cp&��~x�V�S��/����&���)�]�:��2�Y%�Ov=hk�Dz��LS��<τ��c�J@��'ٺ�Gؘ������nez���[��WE�n�^�
(ze��9�R��^i�W�{U1^W���1���F4��^��5y�k�����^��&/xM^�~�\������i���4��u��:M�p�&K�N�KuH�Xhb�e"�����=��ᴌ�3�S�wı,��1��AԶ��1cȶejx����}P˗C�PK/WUWT{�g<x+#pip/_vendor/colorama/ansitowin32.py�Zms۸��_��?�J%�v:��WM*+������Mm�S��E�G����$A��u�z&#��>�],�]�9ds�m�q��w2�z�S���:[vrt�j�ήްW�y�%XG"UbĔ��|�x�`�8��x��\�\�Wj��K�V�ܰ	OU���\#s@ë3}2WWz��C�s����Oq�E�)�E�~�a��H(��#v�� Ds�Ȝ���yuR���2IF�˳8�B郃�r�){/Sphe�X�X*5===`�WKځ�!�G	W
����<�Dȇ�D��Fm0�/�T�3E�,PE�f\��Rz8b<��>�L����"�\��e+�3�$ŵ��B�h0������r�Oy�E0���Fw�"�\�%Ӓ�"'��L?�cq�4O#�_��X�0��X�a�D�@rs9bQ�k]ſC�d��t)r��3R[�F�`�,�{�#�
��,���+����L�E9pB�I���M°����5:�]8p�}�F�s��<eV*hk�]8�yS��������:��(�I9������=l3�1�c���B��N��֙:}��4�$��U"�&�ܼ�W��T�<>�㫓?��/����R
��E?���f,�����B��k�E'����8�&C*�|���a>�ܵ�b3x�:X~���d��x�¨������a\�(t�`[�e���r�E�i�A�5ͺ5�b��cV�;1�$U�
"���Kf�E�z�7������]�������|"��q.�ʊ[D�&O��k�s�
0��7���w"��6ѝ(]�E��:�6
^h\�Y�����$ŗHdP��Ų�s�7��h��D��	��k��2�ߎ�3%R�寝����A'�Y�M�pҐ*#%J��;;&-���"��� ��[��IaѰ��[c�J�r�(���@6kX�Ok��䇅��"U�TM�Gΐ�N�)
�b��õ����]j�7Y"6�$XJ�JX�*����X�'�-|�*����9��<�r,L�T(
�2#�knD�+�;+���
���ZH�TQ�>ղl$�+Yi�4�M�,�hD8��H�\ og�z������wG�^�����ӻ�����|����C�8y=�LBq׹Lؕ������g4·�y�8���?�=�q���}���������\n6�{[�)���L���P�"�Ҫl���v3�2�@$�D-�t�r��̰I��6�-�kY$�*��	`&��
���E���¦�Zf����ƨ��Q"�\J(��%F��lZY����4��*�D9�H2
�L��
P:v(l:e�Tsn0��ƔF�`u�~8g��ym�wC	
��z9@�nÑX���e�8C۝�y��	��q���G0�][��R䡂%�z��H01fY1�]��a��K���䠂�ZQJ'j�Нm�3�-�^95��R*q�����J���z�i1���!����"�=Ք*�c�y�)X-���M�Dm'�lI!'��Uy+!R!�a��{�"�84D��ݫ��^�m���mV��A�?��F��-s!JhV�֊"%��a��*9�3��2;z��R����e�b�d�����rMƖ�R���r�U��U��4l�
`�(�Q6$?�F���y��	�DM_�p_7A1I�y	Y2�m�˺d�xS�Pe��?l
e!)P�P��SX��|�VXGFH�G2i�7fT�1Q���j�m� {�3�(+U��
Ǎ!�!W�3q�6]�Ʉ�(R������?��!æ2[�eY�5te��"Mp�/�I�[˹�I�<�?�Pu)¦��54��oH��0S�R;��
��w)s�l���;���)�M*�jג.rzgO�sk�P�(M.W��pvqq��1!kB�G@�Q����o�EeN�ʳ%+Ћ��]����f�F�b�Q���b6��AX�[yVf^��_.��ֆ�}��^.�wk��>�����7��~�\�9��O�������n+Ї1�8�	��Ӿy{~��D�c��h��i\`RSR���?�6#b�g� Iz��H�0�X$�'�ɞ^8#�'f�3A�q�'�M�^8+�'"fZ/
�EY��<|���7=��������i��&������&�oq���M�7����M���&�����&���H��vwq���&7�>�]�ԕ6�'_77��hO�n�J�=Ѻ��3���ksSG����M�ɷ'b��:RqO�n�H�N�_��P�p�S��mm�����v�f�P�.wz��B�Sgw��8��)�J
�vZ��ƪ)��j��f�x���[��&��`3��h4t��$�W��'�
���.��9��6�Uh���y�ڏ�޹�=���O�t*�l{{��m�]t�\���f}FU��FE��[�Q}*��NJyi��������9�Γl8!
y�ʼn�<7D�V1QO�Δ��î5NCD
L��#�ԡVZ�g�3�c.�Læx�>X������NG�Ε�㶷�9���k�ޒ�)��ﱈk�A1��	� ���Ȝ��J�n�'`~���b5F蚧z�{���1�s���V�s�v5�a�.�D�f�l�Z8�p�;XD��2=Cg(��$��끗PO�8�83{�@yX}
h��l��g��⻝y�l�٦�;��~�^���~3h5lG�oIϻ@����g�0Z~M6o��P�^gFu'~��]�@�N�΀T2�)i�?x ҩڴ�qKX�;�@�R�=ꖳе��i��=ۛ���:��6�eۓW������~煶l�DΕU��*+�-���1�!��"�S�?�\Co��I���1�J&��&`�dT�R���1ke�!�H�JÐ�"?i���l���w)�����>�),�7p�
sC�ˈ�'��3�8����;���
��
����[��}g�l���B��Q�
bC�����k�w�C_c�+�䧤rO���w0{�@W�eG�3��Ug���TdKB$(_}���3��.&�٩s%t��"}��5։�?>1Ll���v!Sla�]X�5V������ڥ}�Y�)V��V��ɎZ��%̒7����V�^'	Ms�מ���PK/WUW̃��F�"pip/_vendor/colorama/initialise.py�W�n�6}�WL��[m�0�m��)��C����hkdsK�I���Q��d���Ϝap��Z����J2{d~g�
����c���W���
V��(
�� Ÿ��w�w�q�q��Bi��3���^Iz���/�6Q�i�C̤�VU\^_A���>}RO�SE)f�T�����L$ƒ�$S:�h�Y�n"���P;&@Q&d��Ү�������%q�̺�!d�YQ`ڣ���$��7�J�nG�N�1a�&<�Y�*�Py���ٕ1��uS.���6���P1#/,h<pC�ƴ�k"�K٭-5�	b��y�����J�wZ+�)j{T�n��)\�P�T[����J
;:ݸ�(�1-z���S�k��b}�o��Ɣ��?݀�}��5�{��p�r�x�v�e@�U�o#��%+��K[_�c�W�v�Щ]�6E��H���K��\��;0��o����Z�WCm5�Ԕ��(��//<��m˨_)ۣ݊Ce������V���f3}F�7/3��.�[���;J�}��
)�.�؞n����0iM#˗���U_Cp n�j�K襀��?pcs����
��;-��7S8������6G��=�^
�����S���g�ڍ��#�R��XN�r2J�6<�B0K�(����O�wAg�-���g��O�H�L�1[�<��yYē�&���N���;�5��2�r�[)7i�L7��R�|d�8�(AbEbB�3���S��:T�8I��$!��y�$nE
(َ&9i1��"|xx�S�B��3�n�1Oq�YFR�UE�DL��|�ے�Y�����rTi��عP"�[l�e�J�C�� !�t�_��|��c����g:a0�iH>N���>N�r0�^�}4R��p��ǜIv@�[r���,g�[X^�|"]^�W��N:{�K�����Hۈ���IQ��(��{�d��y�DM�l]��͟�~��t�����/cG۩�m�4�>q��*q�^��]���9���
�ҚP�q�@$����I��kY8h����tY-��kS�>�N^HG��^��!�PK/WUW�=8��%pip/_vendor/colorama/win32.py�Xmo�6��_A��,u��,�i](v`�K��d���ɢAR��_��$Kԫ�t*Ft���xw<�
��큑�P�O4vE����D��rt��D7�-z>�܄c��c���d:��( 6�7(`t�v$^���^�.>��5:���/��2}����5u��-W�ǖ��.�gs��a��Lm{6����h4�m0�p5@�͖2�<q�b�RR��q�"k沃E]��	<�V��L�|$�e�]�@83���
���`d�<e�2�R��E��ڛ���	�9��
�E�X"w��]�ι*�A��G`.Z8p��U���Á�l�O$6�s��7�9�y�JN��-�>�3���-z��9���l�=YN�s�����t���w�О����OɈ�R�Gc34�Zp8���0�gA��v��l�>32�t��<I��r"�;wEd9���x9����Ne��ǖ�,��U���l�M&����?�q $��qJ���0�/FC�o��C�iY�H�f6�Qy��`.֫aTk�*�w��j��N�p �*�ԩKّ��4�B��\��ѳ,w>`a�����R��5��,��KS]n
�.{�
O��"�ne�ei�E�Ae�Z���[kZ����c�7I`6���h�)e'@d.�ɝw��3�u�]�[p�XX9��nY��٫慨+]���K����]/�*k���K[X���~`w$�r�E"������z�q���^�0?{��	5ݫ���s���K�n�S�~<��nV���n������0y�WˎB�4�{Z��{�w-
C��+;s-���8����@`� �A���v<���Y��V��<�& �3��/O<s	��(��f�=#�5iL/��3ߚ�H�u�ߪۊù��*2����Ƙ�V8��&��A�;��+n� �a���׹����8EU��ϴ�Z�8�K�
���
mn�kTЎ�fڜ���Wۜ�_	�+����-��Okҿ7h ⒙pD�h��?�k>E1!���B�����7u�X������bx�:�&q6��a'�+E��18�F��K�bؐ�ܞI٬J]���RR��"�p�U���\X�;�X*��х�b�w]�T���
�g�w��>�{�FQ��"�X暑�(�;TE����t�k�	�/9���)!]b�l0$۸�2��V!��I��Ҿ���sJ�t�bj�dC"?����e�u}�_6[j��ı'��4�̌zV�Ǜ��K�8�8;F��q�y���€(BW�d:��e�\��dJsY{���:�A8-̶��3���Ԗ������*��%�g�:�o��
��>=(����_0���`Q~"�EJ��Ք�~�d0�c�%:�xE��Չ��5��gɱ{�ښ!��J��X�ך����1��m����ߦf�ȝ�7UGR�^��pB�kǞK8F���3�֨��^v���6��~��PK/WUWC�G���pip/_vendor/colorama/winterm.py�Y[oG~�W�)��P��4�D$�ֆp?���l�젙Yc*���g.��,CW}(/���3P�6�/Yt;�M|1���3�%7�'u8��ɫv짜@$����;�a&QL�%���J��	�3��	�fs�_�Dx�OPx���\@W�u�L3�d�RV��ޑ�Gh@�*�FӈCē#�(	��Z*���z��N�K��6
WM��R����(i����$F���i�w�nAì�;��M��t:=�>V��iO��sz�Z��N/:��)�Q���e����ɻ���0t(���^puz	���o4�a4A�EM=����-�ij�݋��
�o�s���f��t1�_��
�[W�c1��6[�����$�W�$�X��˺�~ԥ�Z� �MNc2!�Y:��M&��	���Z_�
��q*wEr�5�x��Pݬ؛PFP�~)[��9�\l��2�9�Z�e�&@YH
d�ƾ�
'#�Q�}
�{bbJ��*iuKܐ�/V"Y���)$T@���?�EɬfIC��I7qc��}���K��\�P��� 	�������m�:��|47$�^�d�JL6������AD�+{��J���|S�����J�[75��㔬ի)�	ϱ��mS%���=��n��j$�Rɠ�n��7VcZ&3���cc2MP4Vk�h�f�~�!�݁E���F�%Cd��ʖ(��?����P�²4��b$�jC~�^�xs���2t�����4�СӨh���Uo{��*�('%��v��-�{�ZVqʟ���b3���Z��@;`g#��r���+�	�1��}{�7	90��M*Գ����k��q��-P�a��-J��=�P����[Ɖ��D���ѯOv[x�����r
�2�#F8��BE���	3�<ML4��n��ϰb��ᢝ2N�'�k��	��Y��x�h�N�Gk�����	-�Ԣ�| �s�845w}��x�M����9Z��B�(�ňe�}
'���I�h�G��1��x�g�(�UQƎ�&g �����i�zA����s��v�_�R7�y�f&Z�jB��\����`�+�O��Θ�ȉ��$�,��]{��F�zh��td�L@VA$���kMg8����X��)M�i�3}��ըs"�z�"إt��{do�%bLn�$�žUб+H+�hk
-f8w[�+�Z�8�����\�R~$�L�R�`�w�@�" q���K�����fI��M�X4Bڂ<��"XS/��MA�v�c�&�L�	��Z�&6����Ul�b'D)�p�.�XE�:?V
��;+C�TH�B�^m�Ś�,K�;,�%����Fu+��y��u��"�X|xa�BeƮ�,;��;R���O���}@�'�T�S��J0�#8��Y��}�Ѕ<�5��9�j�ѿ��jԸ���ٱ>9ǹ��ڞ=<�SaC�B��	!!	�=O�8hV�>��P/��/���.�˟�8}�(h~+Xm�����k���F��h����\�D$�˳z��d�F�h5U�TR���xw8@3�у�$4B�f���0��\�aD^��=yQY��T�69�KG~�w���XA�庆W�z�*�
xSs�)
���;=��xt���Ko�\u{��i�ow��n�b�l�p��Y>�[�
M#��f)C�O�9ZΉ�+KM��
�F��#�h��pE����i�6����j+ے�PK/WUW��OMK&pip/_vendor/colorama/tests/__init__.pySVp�/�,�L�(Q���K,�H�S�H,*�I�T0204�Sp
vQ0�u�I,-NU��LN�+N�Q(NMU��tv�vUH��I��PK/WUW�E���'pip/_vendor/colorama/tests/ansi_test.py�V]o�0}�W\�I�A�:�R��l4��T]�I�M��+�6���MN���Sbι�{�9�3�m���5�/4F|�b�E	�p�۳a0A��0B)�������П�|X���lie�Z%tiL8nj��\�"�� [9ȶQ��2@��.|���xa��Ľ��/���QY�K��A�Z�`�'�N���IJ�E��ˈ�ڇ�:W��Z��?l�G+q
���e�X����O��i��gH-h"fHH�2���/���sؑ(G�$i�YOhw`�l�Fh�n���/��l���O(��(j�l���:]�zǘ*�tJ-6�1JFt�.�|�\w��)@��u,�6��}.����=��<o[��A�~�B���}�9�V�a�
������� �7�� �,�f� x��׌����y��|l�����������Vg�� \J��
�|���N�o��0�N�1���۹�:��si �"
�u��슦�׉�+b��i`�����3����=�S
l���:���<��M�-���H��'ګ�X�D{��*�Q��zI�8�^����D{�*�I��z�EO�W/��%ګO�~�Z����hU�2Ѯc�wE�]�@��L����C�:V�J��x��vsT��u\RlשH��R{G����U�מ�'�ӻ~P0L(���h=o\|[�a�68�Za(�Fð�7,��;�PK/WUWj��7	�).pip/_vendor/colorama/tests/ansitowin32_test.py�ZYs�8~ׯ@����{�\�G�h+>*�L� �k�������@R$R�8���CBݍ�O�:D�4yM��5G��1�k�8�!yE��p�_�����oAa�1B����j>E� $no��QBS��<
�ٵ�n��]Nq��T�m�s�xN|��Xȍp�x�z�C��>�9��EN>}	��c��G^|�p4��OӔ���%�|Mc42��i{�
��s�K����Կ	�Q)����uq�N��x\�w_����+G JpT��u+�ӫ�_?N�?f�n?���N?]ή�����t>�]]dl�,�,��z~��n#c����aK�B�;�I�˫�H��+��Gج��Si��/֞�\X��coytEc���]P���6�;�8^��Ü�(`�]++����IH0<}NN��\���	��*"j��T�Z�0�V3)��qz8}`�s	N�A~�7p��A��L(S�l}�ך�L�a�V�v'�#If�f���C��R�GF�ͬ��1~���5OC͹Y�xQ��,X��V��v�,6���#04%c>�fW�Ip���V2 �RBJMU)-aVA�S{lM7�2�^*��h\,�}u|Y��!4Ԛr^�|a����?ڹ1J-h2"�mY�����T:����f��ݭS����3�0s",��o85$|Fi[{+Ƒl)a�����2��mK���n�b�_���j[>
i�#\n��3BJDV�]8	<0�8Z,1z�d藡��̘X���%}f:�2qUo���[�jF�y���^+jL��eE��o8d�z��|BY�[��R�E�j3F6qi�����:UöI������q#�4DT�T�(ƶ���Ks&�R�!@�G������ 67��+��į֜
f��V�����ݟ����xE}T��l�ry�e���ʮP�՛w�O���<з�B�(�k8�����#*pZe(�a
�*�e�����8�6��Z}� ����%���`{���H�'�	� ~k8�6�D��tj��_*��;͘�7��8��j�W-ԉ��K�1|{W�eB�/��.�,Ǽ6h[�r���/��;ر<�˞��&�}����/Z���7��C��xZ�T�k� ����6�T�$j�L���h�nT��Ǵ;�w�{��x:����;5Ih�)�%��@����3��:���P�Q�ԋ<V�è�x����ƞ�|������(��dx�<�ķ?,P�S�s/�J�d)�4��p�!��Z�j��Os�`'�(p�)�4��d�(��֢��lg�N;
&���Ѷ.:0U��>����뀃�KB|Q�U�#bv�X�>�ne��U��PJ
����|�C��cr���&�/]r��^�4������k/2��+�t%�_*~P���\q>p�A���vg-]-�WٽB���3�ڡovT6�2��̞:z!
lso��u���S��7dQ�h7T������������G����Fe���AL�ea(�UI��$�'���3q��A�N7��>��Ǔ�����á�F#�Ñ����Qqo8EVۯm�+E)�����Z҅�3�>R��It������W,�P���3�X�Do`��Z�=��޽�bc����n��0�ƭ�q�᫮���)TE�s�lNI��|���pq���|'�G��}��R�C�^�Z���r�����d��r��^�?��k<|����_^?���!�ʺ8ml"s�$f��D�lu��S
B���`����V����$������i�� `�.@�!n���U�ꘅޡ��c�C�	@vC���觊��)L�6�iT|*�_�t���+�,i�J�nb.rK����L�<l�&�AZ�\–��ģ� 2����&,�]�v5�1���^0@z�����x�n�C�%�-�1�^\TDžnSF'���M��a��eJui��x}բt�@D�Z�!�CRl��G������M�~����5xW:����$�"�57�sA8��
�%��A���T����+�_�5�>����i�֗wb-{}[{�P�ѯn�,������b�Su�^�7W���~#�G�2�[�x�T1Z�XY��d�/@����A��%E1�k�>����cL��_�B[��x���"��ѱ׻�.��,�I��N��~-��3
	�J��{&V*���f���q��{I	�-�'��4$��1��,%���U�?!cx�ށrW�T�j��V��D��<tz�,�?��<KuS��_PK/WUWcx#i�U-pip/_vendor/colorama/tests/initialise_test.py�Y�o�6~�_qs,��&�X�fX���ty(
���+Mj$�����dQ�h;]�
#�"�w�>�#8��Z�ۥ��R�$~#�p����/NR����<;��8˩�4M)�~y~����4b�B*z����+(3�j��5�|N��0�����T�(2j}��f����F� &_&�?E�!���K7s��T�vH��*M����{&N��+�(Y�(RT5r�`�3���_���&[��M���r)��~)hƄ�J�iC�Re6���4��ƢԂ�PSт��f�uI�
ԝ���™V�l&�R��EQΉ�p��Y����i�p���:n
�Lc��$�Q��!
�������7�|,bM�bR�m�h���!_R���l�R�*�V�
�y<�6�%ꕼ}{��'�
��S��TXyȵ>T�5��"���[⯗��vC/e��0�p_�O�ZC߹ʚ��@kת�1�L R"�/;I=I6�v�gd����Q8_Y���.���ˍ]���M����������\r�Ȋx<�*�U��뵷d=�I�R0���8Y����N�b~�>d�ivg�B�K��ۮ�_	�t��6�",�����A����̲��x$�ț���b�^�?=\�(_I���杸X��d�D!�8nۑ��{ȁBj��4>\.�:�z{�Vf��GpC!'bl��}G`I�
�]�з޳�c�qKuMJ?ԕH8R�|����l*|��ӕD�(��F����j��9x��v�Hct���;6ϥ�b���!I�bKgS�f�K�;�"�+,X�$t��z��`�_�^R׸5�|:�V��!B��ኚ������f��!f�X�I�Z�X+�.�ؐ>Xg�[��u`��0ϮoN��!f��_%�1�"ެ��H�Q�:C�
6m�{�C��^|���_Ɵ8�����A{��s�����h�~�x����8ٽ=P�I�?�Q�����ϻY�+�^a�b��v,�hj�,or��~�'-S�;�.o�������\,t�
w&�>�~�̅�����77��x��=��̆X�W��̭�o^�B�It�^��F�z�Q{0���� <����y^�|7��[f�妣�w$xy&��bH-\���*��R�B1��1Y����q����떼�����5N��5#��0K�WW
x8���D��1/5�R)����ɲ7�R�Χ9�xڣ�+��T�x��gJ%�;���S��dB�U^l��QÐͪ"���X��`l�4�c9�R�Yyu��
�F��̖"�|r�Vg����qg}U�[sv<�<h��\z�m�䵋�C:Cmelo�G�Č�:��3Kώx�E�w	o="	�0����sqX�҃z���������f���]�v`�4Ep���f��
���>�~O�z�ɛ���w��J�rQ�>�J�a����h��m�@�܌��yn%z٭�6��`a�f��deL�0�2���,W�eA�PK/WUW�lh�J)pip/_vendor/colorama/tests/isatty_test.py�U�j�0��+z�
��mn�ڴ�vY�B�'�&�@��$���+�v"7�7mj0Hּ7of4��������%�]3	���8��s�����gs�j� ���	D�{;��[�@�f����LcH�U	��֢���n=g[2.Ik�eLn�+����ra5��Q��B=�Kg��Goсj˅魫f�f����J�%��f�V.4.�[�<�wJ�!d�pC��IL8K/�G���J�,&��f�0K	Y
f܆�7�cvd���9��mbP��8̶_�
3nj���d�Խ����u��$">�b(N������Xc���e�b�DN:����
�l�;�_J���+�:�|B�vL����c�+<����k�wD�#em1���o�G4�5�����'u���,���Y�
�� �`��q谔�%�R<�VǴE4��vn���Vi#ߥ�0ӎ���&��KB/�R�J�f38���(=m��7��PK/WUW@�2�7#pip/_vendor/colorama/tests/utils.py�R[O�0~�W4�’I�{31Q��ft3��b��0����E���r��4��p���s�<����R�8�*�-�PJty1���Ο��Gq!Q�0F=.��ʟ��Pp�D�E�)�T�l�r.T�d���ZEx�J�[�����l��,+�XJ����i��+�C���J���4�9T!
D�.+���S�;���1>.�1�����kM����_��PI��{�q�E@Nq�VOX��J�Bi�~?�.$ё���Nk��go<��;p�8��8�	���¦�2�M���ì��T�A�c�m~͝�Q�E�)���^�獷�}y
k?���7�Ξؕ�q���`�G�AT�_�F<}��6��=9��PK/WUW���}*pip/_vendor/colorama/tests/winterm_test.py�Wmo�0��_a�$���/���BY��	RU���R�:	��R4��쐐@)��U��8w�{�;�����)�F���#*G4"g�KSҬ7vm���ݝ���"5"�y�ӽt�0�� �\1���$Q %If
����4���}0��a�O��Oi���}���52����X���t9�ya��MiV�=	"	<�Ln������j ���A�0<F���3�a:�w�ݬz�	
i�_}�6��6�O�"30��ӼQ&V��z��XJNZ:s�Z����&�
��7�O���>.K�ڷ}
�G"f0�8@�N|x/�c��Lx�>R���"�N4I�{!����r��Pfj��s��`��-U5�_k'�ZZ3��bb��cF%�m!�]�$�#���W��pxH�r�x"*�2 +
�Х(���I!��� V��k%��H�@�T����W���=?��y�υ�Kf��fǧ�K�xu�\��(�+ibc�.���SF^v(�v�wz�|dN���zÑ�ncl�Ǿ��5?�ؗ�`\/u��n�awϷْ<+5*���s)rW������p�4_1}^6,�a{�*k��	�����N�7��@��{�Ҿ��Xjc���R>��r%ބ���>Kz�m������UGk6�35;v͵tW�у|ZnsH�K�s,�5dl���ҽ8JK��<�9?<���ݥ�N��W�,luN����҅�-���ÿU�
/�!p�T/��(��B�\-���&�4��nDCp]�j���|�[M+�^�_PK/WUW�F�^Epip/_vendor/distlib/__init__.py�Q�n�0��+,q��֊u�4U�2�4$e�V�uK�6�\����-e�6_b�<??'#n�\nlÁ��C�H�`��r���|�&wQM�>��'H�iB�-M������N�wW�&�w��f#�$H�e�e2�;�JB��r�� �r1���y�Gms��W����}��$(<e��C��R�+���H��HS��xއc��J�-<��+��3l:�_��
$a)�t:���"
äա�^�M���o�E3'r��e�c�N�7���U�7�C=8�"��=�X�@�9�����I�f\�쫧
�;�Jy����T�F~dzY7,��=楩�5��?�B��%��}�PK/WUW�&�8F++�pip/_vendor/distlib/compat.py�}�z7��=�/�ն�\���8�<юcy-9ɮ�aZ��Q���d�7߷���w���@h4I;���o��&�@�PU�
�}q��@̊8�o�DS�>�_�����q�Z��͢��H<y|����L|���Z�G?����LgI^%��Q/�z]/�\��>*�h�8�S�
>$��`��.��.��M�$�$��y�����'��O�]-�<�g�.ޜ~�����9���e��鼩�2�NE�\%4������)�ۓ���T&�S�����r}�'�O�Xe{ɻY���)�rR�Ey$ľX���2:y��%%u��b"^yc�f�*��4�����+�G�?��h�ߜ�)$�w��L�*�`��J��1=��w5=�gM�#�0w�P_�Yr�
�J��3�2�>�^7iV�9���/�������먬������{;lSf�꥾��S���*Ҝ>T�,��c�l��k*��e�O���MQ�|��	��C�=YE�"��	��Z<��c�\
bxQ��� t�T�=�'s7�FG2�>��Xu����X��hB�.Ua��`H�m8�-`bM����=��L�'.a�hʼI~n@4h��*¾}�RN�닋����櫨JgϚz�5,�,�=_GUu_��77�[��$qZ&�Z���E-�"�I��Te-�|3�1�%p�R���]�?�[f�j��MҐ�Z�~}��K)�z$��=�2yI�5�/�2��u�jj��BN뤬�"�k2��X�R�O��Σ�J��4q݁f-�V"*Q�9�ؼ��4�e-�$�+��)�A��V�2��Z�60�UY�(�?��Ӛ����jC��`0h���ˣ�O|�'l�`2WÑ88�R�
�c14ۄ�}��Q��e<qiх�#������7�Y&�X�@;ÿ��џ��
�R�˨�-����/L)zp�6}o�/��p,���eD|,��^��b9�b�_��~�&�gߕ�j��k*|��c�I]4u��z+�,D��D�V�W �g*��A���Kɪ�Ć5�emL��qQ�����ja�G*c��A:٥`G5�m4DfKi�Zs�Į�A�CQ��wЂF������k&�Z��w��}Ha���6[a�{jŦc�,���tMeWR<S�*$��@�9�Eu´���=zg��v �FY�
s�z}�u��q^!S֗qΚ�qZF� r����ɡ��7��T4�� W�7/�ŧ�O�k�����������#"c�&�<,ʛGȇG�|�]�e��iiL�F%zye:{yQ�8�M�T�/Z���K��!i�`._���e�J�L�QJ�ф�@�0����Z��H�Pu������l�~i�׵��U���g_|��HDwE���"
X�IyA��^��B�/��%�Q.���qڐ9J�wB<�q�%k�	�2���j���U������s~��8����
,Jq�&82 ��9�$���'b�(���S����HpG#@n�l�ڠ#:QmG�չ@�=�	��*A�G��P����
��f�>�����U��x�e0�2��D���9r���5h��8���KMx���ۗ�ū���pE�f�'��T�
�:���	sq�Hg �� �Q�P_�U@%�,�N2Q@˒���L�P���$��w�:�+��-�G0҂�b��U���(34>�u��[������pZr��Q���q0��kx�����2��{�֋`�.?8�,��Y��;��,|:=~X������@�dy��1@�)��H���ުsl��eN�9�ҿ��@�G�����'�,Z%�"��$}���P��S�%Q,4�s�r�+�Eބ��ᇌ�*� �/�?<�������8&"��Gݩ����A�
K˴V�����G; ��L$����φ���?����!����=
O��������N�Qrmdz��Pc��޶��&e:_���Cl�P0�8�	E��'~�^�`΋�mR�7I
z�D�h��d�~ԓ�?�ĢZ]����1/2Ԩ��`�^#a�T�1�ipE�gb�AZ��&�����Gi�����
�@�y��Zwh^���&�\�p����?��(/`Z���7�&���������a~IR"II�o�r|��bz�����ճ��~xs�oOߜ<�"(�H�)�@�Lh:(�4�O�3�e�+h�Yv�����Bɏ��怞Ђ
Xy����CK���n��y�f�3��U�\E�j_���ȳ5��x�'�
r�����9�D�*� $�E9�9�
+7Ȣ4��;g��k?i�����q��� ��E�D�:X��
���5z�lf��ŏ�l�Q\W=�WۥB�@��_�[��v���J�ER�C����A�m�@m؆F���2Z���$F�Q�32����?(��0�k��Ї
,!`OY��A@+7��<��
�$�z���i�x0�����9@طZ����3$�$��}K��ed����������@k��ɲ����E]���ј2�^����TO�����G�M�n���p:��4
�U�d�n��r��^�|a���c2T���T&w̖�,�A�U�bz��>}�Ɣ�`צ��;�[D�������.�֞�t�P�!,'��4+8E��m�!��
�`cEDU�����haan��W~D(?�<#`/�Й_(~D��V��V�U��Q�N�]Z9ى�5f30� *H�2�"gO�
��D��'�h�io��c2��y�1"�d�B��u�L(�̌���q��2��G�#���DjQ�I��Ԋ�//�+�j��?L�Ѹ@F������GSz�s���7$"I�.��
Z�H��m����8&�_�b�-� �ɰTIad>iP�j,�����Y�G@�2B��2�1sd:[w�{�X!82)fYfY'�PضL2X�w��6��� �5�B�\����骕�t�'m90Yƣ��gsB/u�]��&>.qQ����ݜ�'���� !ئ��^�vx�:� %!�d5�P�hk�0h��i����mv�.����&��g��4B��R��G��;�y���u��mk�Iu�-��!B�\�}� xS��x@��`�!�=:V���5��m(�i�|W��%0t�c�H���D��,ơ��d���Ik��<�`E�
�A2pA�2���!1Bcj�!�F;��J����H.�Nt@ͺ܄�BQIH e�i-���qD�R[r>���4���]YO����^|B�㴀�I�\� ��Wb]4@2t)�vW"Ko-iH�M;i��f	���<}'s��Y�9o wU��04!�P�
[r�:���ц�I��n�j���k)�Y�ÉV����ZM?qu�.��x]��aǁlٵ5��H�����-rOȱ��ce-w���Z�I
��Q�����ſ���u%��P��m�n8�$��3CH)���פ�-]�|�U��Q�
�-�R��"���.�w���SLʖ��p��*���]�N����=#bh
�F�=�=֪���c;��������C����b@,@�x>lfY�U�V=,W�r�c
����HSc@�|ʙd����t�
,Ph`t��!�m�
7���C�-7Ԯ��o6�S{��C6�q~^ �ܽa�"é-�5c�XF�o��ׯ�CR�m�W���ٲ���O�]4����i�emH��/�h��R
���U��c�`Ϯjko�\���\ڳ�菊U��P�F�6+��7� ���UO3U��)cz}����u;�Pq'�-�M>������<���9ٞ��m�/�8B'���ruJ@A�����h,�!K��%{K�	5��`��x�c$xω~�2�2N�hH����a�b0\p}x(^P�
�Z��!�K�J�iܽ��w8�v��d��/�ĕ�Xc���(����
	�J�t��l�E�
*�������͈H(���5��!�Ωd-�4�H[@�����e������U����(��
Qu�j�j��v3��ja���2�D0@�T�]����^C �_ߪ����B�u��!��g�*�vr�3�X����(�b��X�H�؃j �~��x�$��r�ӑIH^�B�I�1w`I(�JH'�]�&y�7�u�I
CN�b�������Wg�L�^���sP͊����e�O�dZ&�&��1�<�\�P=.~��>
Y��b�b�e4��(���vN�)u �����Μ��3ڦ��0�.��w���'m��¸hS$
�G�O�tЭJS�Z�du����2~1�=?�^^���\�0�`@
��M������E�M=$�	�_�9�8����]{�ֲՑ�L_��n�^Ƅ��e�7��X5���d���f�E���B�)�]�W���XM9K89/�)���MZ���q�.$�0�m-o�Uą���w%��2m�DuQ��S�ߣO��:��]�l����Og�]0v'�q&\U���,�j.�Y�����1#Rwd,��#�a6vL��s�|.d�t#��'خ�-�u{
�u�,���*�du�ɧO��s�OYn�P�J5^�R�qZ�96��8_�S��+>���)Feܚ������#8A)W[U	��Զ`���O$\�=u�F�-��T�
ǩ=:�Θ�i�J
�P�Y.w}����i��a�V�6	�OR�,s`B0�NC�Tz��>`V��1%J���r���.��CMpb�r�	a:-�iU���C��\-j�N.gv�Nk\���πq=ځ�<��)�O��^|��s�m*V���T�_&�4Y[��v�"F�{h`_~�E��P V
��g�ǧ��{c�,Ǡ�=��\X1@!�-�@,�2О�7�uN�D~��x�¿e�j��˴�jg9�;�鼕D�]���������er�[��R7������Q���	Q`@���_ٷW�C$nS�_����b�x�k�L%W.Pp�}Imz8)�P��Et��=F.�Ye%c0�ʼv�^%!LFnc��o��]5\ޱ=zޭ�
�������a���'"��"G�U��8b'��A+;�_�9�n�i�9�D\��u�,�1���_?k6@4�à]��/z��AI��	M&��ja�9��8F��ᩅ酫`���f�l��@9����޵s��T8��ځ�����g�MHPܨ���&�l�im��
�l?�mn�ov���Kl����
����)�;,q��Q���K��r�O"�g���)Zs�����M�4�]�p��H�����597�G� �U�﵋���n��nd�uVx��7��#X���.@[�5hY8���ee2k�wh�Wt�vj�Ĺ����A��Qu2��M����@�B>r�P��m�{b���yƐ��\�@oIy�&�D���-�Y�Ӳ�s�����N+����˾�4�G%�"��͘�6�g��4c:�Ѣ�u�Y�̯�
P��C����J-���EA����,q��@"[<�ҏ�q����GXHرL�aL�Q�U&^'��k5x��
�{�$U�d.���"n2��e�죭t����
�����b����s��p��P��
�r��j9�[���3��m:+�ܾV*2�����`}�g����
��<��+����%�F�n`rf} Vk���]�\X��+x�&�F�3rt�PF��
.eh�Z�����S�ͣ��P�5���,�Qfgfd]t�(`�ǂϺ�1"�z�'�8A@ۺZ�^�I`K�Q*Y�Jp|H��?�L�54�R��L�A�iΗ'Eh��˴N*E��tq�%l��ЫXabA���I��n����F2tm�)�I�(`���z�z�\I>�hY���9e1��;P��X����6SY,��9�p�c~��T��P株�r��/Wm�}e����I����)�82A��jҷ��d�.>�Q�<͹�\I�Ȓ��*�^[�/!!(�0ƕ�|�T�Ci�d�!��JO��
R�KQ��@�xp�UA--�6nU��ʁ�T�07<Ǥ���&.Vsj����|&Nk��7�U���m,�ɨ̥&��C��HN�L���]��Z��X:\��tC;n��r��B���&a��.�:P"²iIe2��l#���O�w;r ���	��c-���T�_�����t�ޑV���p�A?O`	��-��JU�,�Ӿ��
Ї��ᱲZ��r{��p�I#� 
h�����5&.�f�j���Ur�"��K�H��;�����x�h^qt���,�hJ ���		#��[�E0�(��5yL����5�-�L:�G.���>�>�)�o�!���US-���&�1}b�:;��/����]��$g��1'k���A���f�����2�
3���	��)��4�^N񢭺�N��/J1`�<�v.Dpz�XP�]�n�1|��~��!|���R��R���N�#���!8�*|�,���܊�H�/A���,��B}$�0�p�vn�IJ֤Bћ�ߝZ�
dU��Z�KSl��T�!�xh�Ĥ[
�		S�Ns�U�w�I<����5�֛�5�1��w2R�����lI�SMʚ`w��8�wr�'5g�l�L��TV=�Y�
�r"�����c�\��ċ-�]77Sy�0q@�(K>O՞^���}��
Ŀᴙ�vŸ����G�F0e>k	�ݘh��\:_�l�C.�4���k�c:t_��^ݱ��@!�8jϊ�#���UR=��g�~���G"(��틯��-_�;7F2�@�}�P+t�������O�Tp�Ky�^�����pcx֍N8UMZ��L�YQ�0ف�q�,ӆwD�d���m���0�t������\-����r=�
`6���z�>��M��1_�!?�b�0~܊�qGS���3f��yo3��%^T�M\@tp���/���"�\E���-�(ǽ���!3�,�U�5�b΂@+d{���[ t"�����Uzsp&T��N�J|����*��er�dQ�f&�T�^grt�Q��he�2,�di~[q.+.��
��Z�l9��l 
�i*x����N�xR!?(���+y����\X�HߊSM?�g+<ހC��e7pp�� O@=ZTa�.��1��
�.<�t���ɷc������ɿ]���S�)�xK�JJ��0&}(�yz�Gx�8"�p��|���Ca�:��S��w�B,��S�\z�2�0���U��i]"���[�
�3����N�P�I�j�_�E|,n�8�-��8�\�Eag�v(�r��&,�wy�6���VBsu�š/�<��?���v��o`\���3��3k����I^T�	E�F{Wd��|�c��?N&_�"�L�&k��x���R\�	�J�Dk�K�n�Pp��UcuH����'kֺ����L��pD��#�9��sx�V:�2��X��L�_UJR��>�<�j[���*���(����	M�u���Q�y�Dq^7�r��؎+�~}�2�9����x��E�b�?�[������RR��C*�,)��\1Wm�h�$Kpc:uO5���Ϡ�����T0�u�
B�b�d�����b�
�z�2�u�n#���A��=����%s(�Z�#'E�Y~񘥒�C[�1ߴ��	�Uw���F!jw��+�rz|x�ΰDs^%�Ym�L�/�j����>��5�i�U|I�/��t������t�<�\
�΋�Ģ�����x�!�<��mM���N�����ugW�T�A��֘T�kʺ�Zg��+�-h�ѸM{�R;�e]�13�����5�����/Δ�5g�> ����S�w{���ea^+��ql�I�8�4`�%�ݑH�o0�J�I���Mk5���hO󹿒�D�g��d!�<md�^�n�a;`SB#<q3�7���'3a!�r��#�\�A���h���HクyLV����R�"��b��{Q��N�b�g��T�E�%,�"�&�icܳr���F�5s ���;�e��*�T
�Qݤ��������n�qmG��Dq��P�<�a�x��r߶��~l[��o�~�д�=q��L&I���e���~,�h*$�����Ȇ'���������x��T�	����8���K��Y��e27���N��˿E�u���@[P�D�mV.��l��Y�y�Gϧ�+�M@�M���?���x,h�/$�b&�5zԢ(��P�؄�!َ';d;$[G�2��x�%�?�?`!Ҧv�1�3�0Ih|�N��|�����:�6;#��jd{(*W��@�q��`�/����g�	����U�\��GPU�}Ή�&"�jY1��x�z^�]��SK���/&�
�~tkX&�̳���0�1��r��}��%��{�3�\����e�]P����={�*�E�3B�U��7�dL�]� ]��L�	v��$|m�y�Wo�~}!Cp{9��HgߍU�О�E.:'��J�jU�t2�7�]�+�1��+�c�E��h^�g��#�[5��v���e���V��r`�O�jmghuX'5�EH��L���-���Z��ce����r~���qa!h�f�1!�ܪ̢�El��]�ѯj���:y�bm,�f�}��u�|Yy�LҼX��ݤ6�ט��!�}�!�y�H7�|B��)���RADjnO�l��a��#�l�&��qo�<v}Pn��D*SR�
\�=s�
I�̒����m���E�s��Z
�f��n3�ٵ9G��D\^����K;l1��G֠�n�,��;�����X
�5g�:R�[�J���O���^���o�"HL
(�Ղ/hUu�=ᜧ������.��Ϟ����ЖU%�u�;y��+��M�44�2VL~n�1��z�v�y�7a�Ų�qJ�E�k5=Ϻ�wr���܎��V�d����l��M&�|\,WQ�V�})�췞=�kP�@�����7���{�mb]����.���)�:��B뿚:��+�&�Ȥ�-C}���>���Kbޯ�֥|�l���}U�p=�N�1��C-tuNj}�Ɉ�y����U�Z�I}@��ʊ�JŶ����ͅߜT%�7u���m>f

��`�ͽ���@}��&k2FR��C��(�$��]��77X��B�۽�*ᗎ7�-"ݗƲB��>?yuq���������o�+���ӫ���/�2_hej��{	�Z��X�U2Hj�Nod���#�&�V�#�D_Ā+IJg��˟�X�X�������<�_��$�7����M����Q���t�<)N�8aa����D�$��_ݱ��ķQ�e�t:pL9[.L���xͧ��Rb�n��k�`8.L���E�m���Vo�3�T�+5�h��%[s��/Q��$��ӆ��䋎Y��bQd���f5��v�m{�D��3�-��u�R��W�7��G�M[.���K�R�~�����wp����C����""���J3���3N�t�'^P�t�
T���;��^\T��lNhx�]	�n1��#��Φ����K��ٚĿ��Jt�pԐ�oHRnj�q��S���;�f������w�
�3������8�wa�o����߉��t���Uވh��m���JSm�����������?{����&�[m�;x�+����`�J���]��e���n���8��΋��놋��px�:�u�)(�g�U��n�����o�7�N|���/�g���׾~vqq��s���?��#�e���cΫOFG��|V�����w�����<���V�p���7������C��s�����.�^?\9Ý��tÀ�'�|HH�ʔН�������8��U��-��������&��ɤ��Lo`g��V�W�.~��MA�Ql���v(1۞�8L�����8
K���,�昸����Rj�X��(��D"�ֶ��o����񕏴d*y���Ȅ]��b^K��0�8�����oT�N��&�x4m�w8k�.&䌦dޘw7x��� ~%EX�e�!�"�{�m��Ka�np�[��bvo��m��.��(\��e��z���n3���d�W#<9�i��f
�n�R�+`ګ�-8X��.�w�����p��e4K�M%t�ҝ�ޜ2C��e㻋d�����K��A�Ǵh]̊,t��R+�wr�Ph�
�؂JU{�R�j�&G�4�S��X�_��}�ۜ҅F�A9�z\i����\�!�`�����%_IR����|z���v�>�DM2��R̤\���	���ƿ-7�*�,þ��Q���[8nn��ه�� ��e�ǔ����L��Qy���E�E��Z���c��ޅ�Jq{$�#�?�|�Dh2�tu]�n8o��f�������rtU��JK�7|��v�ȳ�$�N���oo���>]�;�;h]�����[/��8+����A���BG�x��C����
�8���i�/�E"�Ϩ^t�6�-�=t��}�%.6;rrE�Ғ#�;�{��V=��*Tv|b��Э���J��n���>\�^?����q������z���$G�8)��'�Ł#zE���WN�,-DF��,n
TL�H�V�����_յn�D�
ciӄA�j��u�
ν�����=h��)_G����()	�M�[�yK	����b�)��r3�Q� �+n��kt��S���W��1>n�\@���3����'>�a����¡����^0��7�޷���H~���i	.��Mz�������.9�]��g����xg$΢�`*�hNׅS��p���`�c�WT|y��"�lb��i���q�zU8�v+Ȍv$ī|���O�Y��PK/WUW�7xڲ0��pip/_vendor/distlib/database.py�}kw�ȱ�w�
�>> ��wr���Ul�\���ڞ�ܣ�Pٔ0Jb���o=��)�d6�]�d,������������Q6oe}u�m�������ٳf�m˫�>=g_|��G�?d�E�v�_7u��Y�wE+�o�M�(����P�����^�?���}Vԋ�ٛ�޽��޼{�/���G�ޞ�;��7Y�ZWb%ꞁ����e۬��l��7��ͰL�٦.��bV��h��;8�.�N|�e�U�⾯�K��训�UsuHP?]s�t��Ջn����\�_��S���e�m����4�Z�5�v.:Yrެ�*��o��o��[�vPK}����_~&�u�Y�[���:kۦ�W�/`
Us�J��d��>�>?�p:���˳ק��&��~v�r~8���˳�N��gXa,[��e�[^m'f��yS�4��l^� �u۬E�o'�������䰣�X��=��&�]�o~>{��w�]������fEU�d�9NI[^np:�I����E�PB,܏v�y�L��]]����@U��[���#�		M��%IqS�ݗ�n4cT̠�g?�}���{�b(���x$G=�����y����hI���U=x��*�
����8}���]����ٳ7���������?7����=;{�NC��~�������}3;���qJ],�г�yUt]6{�2j.�~|Lm!+�O���SQ�*�k�^����.�.�la�@�[�%�.��lԉj)�����J�EUv�J$�z.����]V7�
�c�5�ȖM�	�_�O�4
۝�!�/�5�!�J��`�÷o���=�y%�vh,ϰ@�_KNb�#��U�]V�p3f/vtz�
��~ǿt�X,����D�O��p�{��cz{|�XQ�cW~h.>�rIe�u��6�:vh_�>�5>��GX��؆���Q�,��x
�,����SP|U�k�,�]a
�tf��%z&Y�_@�P�F6��rNTҌ�>�/�	�<y
T>��j"X\]��L��v�,��$wc�5$���W�|�:P�tO-2�7�i���Ȁ��Ȁ�ӿ�`bֵDY�m�Rt��Œ��[�y�,�"!�	�Eа��c���@��u�tܕU���!ցl��1���BJ���3��N0�t3`W�ѤK+I�j8�.�K�FePᇙ8vJ�%5P��u�df�$�8�YB.R�q�HoX��oF��r���"d��<���ɋ�lA�P&�mQm��?�bh�'�X�ŽN"͎=�_w
��Xn	�tK�罁�`�q�`�O��-E��9T>Թ�����),�)�ћ$���<�~Y-��)�w�\#w"��i���hu>+*TM��_�y|V��
�,��=��^��l$�WS��\\�E���M�o`f[��wcD0(`Xِ����o`�_��`�J+���ٲ���QߖmS��=��
?A�iMr^�I!�,�)�z�S~5��3,?"��Tt�zQ�B�� E8��H���<��|�͠��Ǵ�f�(A�ط��	��F�T�m���oQ0Q���]*>�ٽn�ߢA&{�@�׀"|e	ui
�EwW�T�*�8�x���k0��7�C��ē2B?&��\*�X�	'!h)�h J�)���&aS!M��j-9-
�GN ����%p��d)z�0M��RHf���:���q�E7�+��h<FE��t��rf����p}�cHf��4�i���=]����('�U��ӕWf�"��)Z)�
���qG�pF���dH�D��@��~B0ZMT'@�(�F9
E6�����@��~�[!��ڂ��8���2�CrL���C�2���&�
P�6e�È�D�u��ņ�]B15��8�(x�����q�@k
3�,�;��MV�e�G�P�'�����?��ĭ�N�p�\6�w��������z&	L�Yo*4��NLB�`[���#y��W̠_ʢ ��R.�g�)�fA|AxH
��zҭ��$POE���ZTTo�,^v�$kw�E����e#	��Ri����.��Nt|#˂`/֑�7Zհ����&V�r1�^��v4�`�_`N�79A��8Ă�D���aF���#�a��3`񐷩l�-%������1�8*�b
P���E~�_\�@�f+�U1���&�aa��aE��B�"�|5S(����--;O=�Dj�[��S�7�K`7f������1j�f��-CVQ/��cz�r+���'12���n�%4�
�G`��a���h˹��4ЪP֏D��r�k!���fJl|�CTxb(���]�dW����E�{81���4�`c9��	a�uEw-p���й�T}�B<\Ǽu��LX��>&5�|d���;�.�-a�*��U={�I?7�B�
�,N2 {÷�>�R}�,���m���.��}o��\��AFۈ0B���L�݌�X��E�k�Bn���=����.z�[ ���R%nu��Ȏ>@��د3)oa 9ٙ�+	E��'z(����xb+�K)2�ȇ��}_~�DX;�(I�
������]�헚�*�q�ƨli}@��rS�e�j���J/�FՊ�
�h�@��lմ���-�h��e���X(��5m7u
����@��+n����d��LbT�Q��Q���*ʽ��Nؾ���P�R7b��p'���lC��|����J������]�g�x���0b#m��ڿ]]<l[��e��Z
��Ԓ�v�R{�į��7P��W��0F�����d��j�4,���ZK]VU��ҥ��)�_���~y��/[��:̅��54�]��H�u8@O��Jq��s
R5�g\EՊIa45�Q'%8`���-�wP;�A*�P�P�'
����'�~�={{��W_��K�T�l�����fwX,Ę
��Q���g�oM��Q���FO�q��Vr�G���'���"����?�i��5�@)�lcMۓv����t;4Ɨ�MC
�c���s
�����y���C[ܖ���{.��/���
{��Ϣ]�����V04�N�rS:�N��l(��Hs?W��w�f���*��g����g�ra��~\�"׸�3���C�h8�5Z'�WKM��
"�,76,��QcO�>�zC�!��kD8�>���*��w�eP+*0�o�KB�c�[q���#OF��&]n�6r�7���U���n��LFy݄�p�Ȟ\�RF
cWT�!.\�q̜X��^�Nb��U��6�А��#ÞŘ�I��j0�����*Z
<�c�G��_8#�(���}�p�2���&>�E��yH2���I�ֱ�=������XD���!��i����P�q��˔�
Q�W�\m��=�A�x�%�;�6��m4|+Ј:H�B��Zv��F�"���J�[R�V��g�Dz�	~Q�����{�ta3�@n�Y��rS��җ����D=��@>{\�E��|���M��Q�ݥ`b-��,�#��y�^V,{�
{�C
Ntvh��Hn�J�/��
vq)_\�W0E��#�D�A%������5�š%���Jx�������'�$*鮖�i�]$Ou�aQ�>/1�S(�G�Yn%��z���@��\.͒��v ���U����>N�"� �׊��f8~����F!�DI�Q�}[v�崣�J����
*W5sr�y�9}[�W���I�m��O��1���-E�g:C�n}��nxl�����ѡ=ْ&�[��٦�� ���|�����T�&9)\Ȑ+)G*(���w/ib(�q7���sz^L/�b�G�<�3!�ϰ�Ѝ��+�^���a����4�`T��쌽���mg�\P)Ԗ[�:��50�Dș�y�v�&�C���P�N?<�H��A/�0��]s'7�
�G4����#i�&ƽ�,�RO��N4���^�Q5Ѕ�·�/���`�����>{Q��9�<«�r�W4�i�02W�.��|O���
cǬ�I=F%�
,h�If�D�MDvPO�A#�X-��X��$c�vbq���FTЊ�j�$
��Z5бY�2����g�ڂS7��I�؆[9�(0�����M7���ڂ]��f;��K���
1)���ݠy	(-7(iU7&SVC
���*�U�Qd�3r�Qi`\!�3:��Ä��9S���FW0�*�Tv���Oű0Mg��j�c}}
J;t�k��O㊱Q��5�4���[zijF˻�1�V7kH/b�������>Z5��dM�u�r�zAT���T�CՔ4�yڸ:8F��p��=|��
� �KЬ�-�$�؛q�AR�#To�{`�;��aL|�ӎ�����D�'y쌿�w)�[4\9�ֽ��˂ҡ��!tDC���,{g+e��T������V��*x��cO�(��e�Uo�m�\����d�O����x�͂
7�t��q��mOD&ը'ݟ�4���h��@�P�'Y�)�-��؎�Y��ܑ��
'A	x5���cs����&ǁ)����>�%og�xJt���K�j�b$�.����Ė���[\ �#F�r��+�Fy��!�]�L9��1�hI�ٵ�U%C�,�LW5�54\�xNx�>��-,�^ػBgJU �-�
p�
Zb� 
c��el8/�)`�(ܩ:A[��`<����t<R.(�KA�q0��)�>���]<��:���C�M��o�4�����Ҏu�(��o}4�V�%��*uOST�<��9k�+D�8���1S�C��"w
����N�?��a��5.�S�N��ù0I�MEXW!�?X<�sL�6GC��́�m�Ԡ�$��͟j��^M�Y�<iJ��+����ѫs�1)3���w躾���Y��+���l�P���jZ�G��4�S{3���m�O����0��嶷�!
���&�� ��T*(ʥ�����$��Z�Q���@Xf��V\��E�]��I`\�/��B�ח�_����7��j�k���_`�/Ǔ)vtim���O�e���:�J�C
�:��\L���*k��.�F�${����@7�#T(��"�^�ؔc�dwpŊ{0\�e����s�o2XV
0���Vn6
H6�l*t��'�ow�6��d���Z�O�߷�\S C�p����u�^i0ʽ�֙�2N�|ҝhM���^�#��ooy�u1�~4E����o�5�@q��Eb^�.�Gз���e	�~�=��B�Nd;F��k6IV�9��"�C��	�i�vL��`�M�T�l���\^p�<��Yq.P�@��W;}��AI���	2DX�q~����8�2�MEr� j�G��؏�����k:���'&3�!��hg��i��O�~t��s�>��p7Gy���Q.Ko��(+:B�Xb�
`�P��[?��&�ǧ��ȡuk��+wNYZB�<���Yсy't#I��⏳�@�G4�����Ϧ_|�$��j��[O�����Z嗷������<"�I�dɁ~�q���}L�Xn�>��I�=�a�e�Y�W��mkY��K� �I��)�v�Ek���b�>5�>��p��Y���)&����{@F7Z{>��f-�i/s��e$̈'�Y,FF�Q�C�/����
�F7�vj[t.��s�-����~8e�8=��<�f�t�v�![{�s�er�(�H�K2��=�OC�ة��o�]����ʿ�)�P/���ǒي�SZ5���6?g�q:�R�A�
��nZ����j�n���+�:��8�<��zW�j�T��qU%mG*ɞ��_Ɛ��N�8�"�
Q%��YK��5��VŽH�-�/���e��Y�����Й�n־:�k��u�ˎ4�{X��m�(�px���ʎLz���*u_Iu��J�*�/l<ɾ�S�0�R��n�<	�z�{=Z�W�+;���u'%ӹ���>>�4� �N$B��vP9����:-"�%F�Q�n�N��v�~j�#�G��|�S|iC����()�u�F�<�i$�	�-�Z��eyF��0��}�Ӊ�w�˦�B`�]ɯ�����(�m�۸"w0??�#u�Ć��&��h���)=8��BMKk�yU�)(>��s*��j�����)�媭�;�,MvQ���W���W�(q�\t����E)C��s�O���ua�E>�L����G-�(i F��h�-�?��j��Ti4-�S�y������7ΎyS������F)��-J�m-q��ll*��&N��t��2&�{�Y�Y�6�À�)��L�kJ���%����h6��q�
����x`�e�v��3��
�t$%�/��$�'�X��R۬���2;5O''�d&�F�2-D�3�?�ָ""T�ۤ9�.��	���B���K�NB�2�%i5�L�,�:��6?�����V6vz��������&�&J=�o(l;7�D"�Y�i�!�/�����������V̻����v�n��$d:sTm�m�3��k�����6&$y)�����0?n��d�8zQ[���j�󕫝"�JÛ;��6�HES�]��"Qc'Ӥ���L326�����&D%��I���p� -4�a8.�B�X�a�Q>�]D=g�3�#�L�zK���U)���lx�]�^��O��&���z�j6�2Y��ɷ��1��$�=�
Y��M�&'.v^��Iq����֦`N�q��<dbI�d�'���`��C$��[vڱ�O���i~�V���/�ҫM�J��HɏP>
	z`�9���%�'��3�A�M�	-�pLhS���Y̖���n�*�0"�ūFr��$�i;�S��ת?�klD�h��yNl!bL�BV�j�:<DX>#7{��|���R�te���ٗ9�LzTqL�mߢ���#�Tv��պߎ��``��J�fg(pu�aڲ�_���n�2��:Y�hpr��2G��r$��g�*[`49�F�:���܈ ���OB89y[LWУLB��O�<���Д�C�e���s����q�e��O��U�(Q��Y�:��N��K9�b~8����\=�=㰽N�
�x�,�t�}���֮����#\'�aZ�II��(*F��]<��X�%ݼ�Q�
�Hz��EZ���H�$�I�D��$>N�	��	�$�<8U`�2��"��?iQ�+�C�1�(��8��a��0�Oz���k�j#,��tw
`�}�;V��&��wQ�9��[����M�>X�P�Dky�\|
F��]Jk���dӟ�5�iE�t��UZ�U�_�i��Z75q��-�(),_���`x��Q�7$9�/fS���ta�
RnjXx>���DF��n��Cv��#4GgW:\6�f/j��QB�BAF��P���(IQ�s�)G��izNU�੣��`�A8�ˢ�PQ}^��s�f�D�z*q[Խ��QڧV�����wi9���nI��k�$GZ��wxY��c���n=��7%�cEޓc_@x�v�̈���
}g��.I�.%'Υ�!0�e[����1�#��YT6��Ͼ�ɿ�ozy��� ��G}��6�~�r1�7��_�s4�`�iD�<
iFC�}�|���f~��7:���Fǘ���]�����%RG��6��;�1]7�o�$' ����ٮ];����\0����ą8�
�W�'yC�j�tq\V�`zFZne�P�T�d	(�'X[�Ѵ���.˒��T�
�ie�-9?�@W�I?�0#k9O��oƻ�uQ�J�Y6�Nw�'�[��<�Z��ԇP�����b�}���)�B�I0�C�":��g�5���8����I�aQn\�+����T��{����3w=Biۑ`��ը�I�bG�y����NL�Щ�����"�`���0l��q�����!�l��9V�ы���ő�0/��{e�'���t靫���4`�2P��zv�ƌ�Zi@z�0i���P8ǩl��\ƅsŒ��02����˜#
�,O��c�7a7 f��:���t�}柾�d]~#��)�_�0q"�X��M�}q�v�>��j5��?��w���\�.K�-;��y��jL�W�όs��V�}6�����ci@�t�R��"��gt)5%���p�_w�MMg��>���]�!=�T��(��Ow�فq��*7?ޖ�m.�Cw횺֦=���]�E�����d�M+���Y)Bg�~K尿a���
bW�LL Iud]�CER7�Dw��3���E�|�u߯��>����zڴWOAG-zӟ����ǜr�N����}V�"��9n����9���eZ��S�-?�6�x/j���K+l��{M���{)L&.x�-�r�8j����|w����p��D�J/�挤l
4�t�.�	�0}%�
�a�'d�F�⛠VF����y-�8��
3�M�z��z��S�k�5�H��܈H�� Ln�[�6^Kл�s���~�.}Y���t��.�a�N�)�\�V��3c�ǰ]��V���8{-�`�^�%��ǁ��⿤�>�L
�Ŭ9�;F��"��g������2�{����r�����쫾U�UT$d���g�d*l�!�><Vܯ�D|t���H~�r���E��)���g�G�_“Hv�=��Y�8�pԹ)�k1���r�@/����% ������4�ϺyQs��}tQ�G��n�g>�CQ��7�הBl�\�e���Zm���&���(�Jq��PY7$�KZĆ{K��t_�J�0U!i��dy��&��r�q*��8��,2)�4E}�|�r��h�"uL�g�hr���Q"ogW;�����r�9���q_r��|Iۧq�=XL4K[��T��5��2�%��1�Dܖ����>�ܒs�WJ	���p�oT�@t'/�
B9"{�N%���}�hdYQј��GY�暨�1��'�� ����mST���lP3u��jU��u��C�a<ξ}��3���E�n��Tv���k���K��`A�
���N�_�M�0���P�=�P_����4G�iJxj��>���<k2t�\���\'/���S�AZ���$^�'M&Z���$/uN��!�7P�O�;��"�KN2�al��g��&�Z���}|��ig��)L89�c�A�tf��Ag���`Jm�rzf�2���ZDAzl*o���X�f}D(�Tf��x��H���j�E7���rj��d�y�~�X�0M�,�;̬����(k��K		��ō /o�,��_�������q�Is8��������A��&�#����V�#/�.�l�{Pd�lJ9��������f���a͉X�_�^dZ�ч��u���c�V��cF�ُ �mZJϙ%@\�e�1W��tDU��ֻ��o$O�ŽN���ėG#�p�/z.R��_w��HLk=?d)F,t�@�C"*m�aB���>��6�1�,i�)��,������#�ϖ��"�����R�w����?��TP1+������`27���Hʋ^�SD^"E�lt���I�K�ڳ�C�z�w�����e�`$�i�tEF�jF;��D�\u���pȘ�&��D���cp�eZ�]�
CxX���擻�{E�.�
�=T�(~���&���D���4׷E�a�/��3��@*7lh���t7FߝԌ�[�B�sG�+�V�a��""p�H��\��nʵ܁�`�r����O�ְ�{	�g�uI����ZbG6��7ū��o�B���>��B�1��`����O
S�;b�3�9�G�4��-���U߸�][���w��S!����V�Z�s/��ǔ��T��?�|]��,�I;X��],~*�Xt�b
���b��ʽ�A'�B����Ϊ��2�"�ǡ}���N
j��2K���\�B�..�'�+Z���T��\Z�$
�W�C�ivZǘx�
��rY�K���-RQM��b����e�/�0G�uMK�ܠ���\\�s�A��1��桑��`��&@1|��+a�Z:L�(�h���c��:y��}@�jJ�C���7��"�$���чd4-с�CL5�p���8�nG�1�f둮�}��XqL~�i�f�3f�>�LF�I�h�N��չl\�����ޞ���v�C�FK�V����豎�Ʒx�g���e<��
0ȥ�ԇ F�҅=�!$�������@���
:��G��$�JV�R�H���{����K��R+����ʌeM�n�O�&����#��c`'PD]5Éq�&����"S�;�w7V`{��vŹe�V�t�%�ɶ��ֆ�Up{H�[/�?VB�Ⱦ��Q�m�3Ll6�:��4��Z�Q`Nu9ʿ9V�Y�p%IQ����j�P�S�Qnn�u�Za(F���V�f6�IC�$�C�9�.	���w�H o܈;��%��mI�}|O=X�$:lD5��/��O�_�{b�V���pso,Js7��+�NI����
�	��.I$�w*�u@�ʳCFW�{J�A#���o.5f�2VHWH�>*�=媾:���:��K�tu3T;���cx}�>;�,:�٢Qt�C�1�hM{5'h��!S���7��kA��1�nEΝå�*�4F��C�H�s�2
�t��U:�d�i�1}�uMhz��GE�ay�.tl_�B?��GUy#���n�\1��$��]��,�QG^-JF��9����#���-,�.���mKуY��������Q>w,�壿�uAK��È�wl/�#�-�_�6v�G�%|�=g����W<�6(Dli�|Żz��ho�Z�\�42�l�<���/�ٟ��mœ]��{�.tF�I��U�Q���ռ�>m��b�4?-�l�lt!�4�"Af���D���佶x�zU�1�,�ɷ�EO.�4�Z�R���pR����^����y"��9�i�X0�8F!�!m��Y��M�S���E��=���65���=���ņ}�|Sdn^�|�k����D�|;�v�j���Uq�1�5��ټYo�57s3���L)&��!�9��T"��	]�(�-�B��A��ݱ+#Z5�B'�i7�9�sP� ���0vcT�Cw���6��Sl�&��]P#��E+)8������J,i��L�Jr��x~g̴�Q�z�Sx-<aH��q'I��h�D_��a|�Y>�q֎�oM�A��Pv��w
ű^�v��WLѼ��<�N$�B)��
]��|t�P�{�TbKpbS&�����V�ȍޒ���~W�D}�U�=��S�ӊ��m�dF�������&Xnگ(eWč�)��ޘ7��Y�v�PY5�1�s�?�QM�P�������V"w#���S��5��g�c��d1*O�m���|E&N�t�RZ\V�#
���A���W�,2��rSV�����@�H�a9�w=��>��B>p�����Z՞J؞rˋ�"����4�
�2��6���g&��mAb����.�d�<�-�d1.'�����*0�C���/F�0/�
Ҭ��v�s~���s`^m,�c���"ܩ|�ޘ豜�k}T�/��D|=����_{�T
�w�"$��h攷OWU��͎d�v������C�G���o��M��Dk��CAY�Nc#V���n%G�-/9	!��R�!4�45�b�]�aD+|�'Et׬ѿ��x��<�f���bxI'�J1l�v*X0+�L�T�t@gHU9�?�a�L������{#�;���N�(���NIv�J��|�`Z]��B�RB�%<9��C�F�
��F�����Kܛ����2T_]
��Q��]�h��	��/L��JI\�3Hi�>�M	u��l����#��q��]I{_��j'Ƨ�w�R�k,���E�jK�{G��QA�4�5�H�,g�m��Ь�x4�L׍��Ѯ,W�t�9�����c�U��jzD$Z��Vz.6�}6��I��暷�zBA=_��
�ӥ�v4��520B��V����`��p[��c�8Oɉ�T�7ۏ1��e��&��Hғ��k-���jC@��p�=��+��cr���w+���a߅jk#��`>k��)����Cq�Ե6��
'T�ᓯ�nD1��3����;��{��`s���EK;^��xx*�U�Eh�b0!aI�t0=l��`�↮zc�fB�	�Y�p$pw%t��
�nN2n��$�o1:�-�y�T*3���#Z-�Ӑ�������WV�KE��'�/<��j�Ƨm�V��
PK/WUW*���bQpip/_vendor/distlib/index.py�\{�۸��>o�@�Gyl��u;H�����`2io��,ѶvdI��q܋��;��D=�q6���
AF�����y��Cq�Ź��8��3QW���ӓ��gŋ�ثd����b"�=y���K��{�&�1)�x�D2+e,�\T)^�M��7��څJ�o�:��*�3�H%B�U*Y�U�_k%�Vf�z#�xy���՛ˠ�P�0�ŋ^�\_�����o�!ڝ%�"W�؄�&M��g��� ���K{Wn�*I�_��Py$��}%��*I�Y���3�k��-�Q2$������,*q�/���L���P�z�D���;�Z@q�����q��>�&)+uɃ�k�u�o������nn^�),��y]m��R���Z���e5�uX��\�߯Քq\�J�P�r*�u����)!�l=���,'f|���I1�4|#}����3b?�{a��e�����yn�|>9;�����o_�̯^}s��h�m��(g��"	r���iw}����N?>�R�%^��m��WP�~��QF�DK���f��B7V�P����нB�	u���2�b�T(�뫩���&x���o���j��ys�l��9�U�Ip�:����*��6���!�r%�x�T�_�t5%�\��3iHrɢ�
m�0MJ�	B�*�"�5
f�j�%03�A���/E�b��@\����
���U"cM3�[aNDR�*M����E�����#�n;�9�*Y׊��?i[D����d���2�6�?�*�*��S̬p��b���-�de�.܋n���A�
I&|�Coj��sXO�
����{IvAĤby����g�Q�Gb�?)̤�o�$�n��L�W$���b}�|����K�m��~^����4�;o"�R�Iv�%��xri��4��
<��((
���M�/ݐ
�3`sփ;��`�H�,�]Ţ7���f_t5ֹ��f=�d��y���
�y	n�����[���}�,��W*�}'�}�r�̅x2�)i%8>��Zb�������uF{��#<'ө"L��Z�3�i������"�_
ӉŔd�Ta�m̥��ⲵ
3%�Ze3h��[���A��-��M'
��r4�ؕ#�^���� $�H{���B
!�˙@��"/�4�d+��6R��[,��e�^���v���-UJ���di�v�v�9�}i6h���V�r�+͚�7��):��=��;`�ܶ�Y�-��6�4�ٱ��`7ⴵ�Z��H����R��ǥ�����%Řh\bZ�b%�9�n%�r)1g��0C4a*Җ�DTq�ӥd�xN�t�∜K�D��yjdܰj8�N���d��w�f.-�̈US~�]fغi�&YI��q.�]W�5�e�;Jg^��p�Z�%�d�:X���"hG�60�7��G"�6c�:�ogD�C��K�A�X>�ێe\�+x�cLhb��,��]���6E�d='q⟎��R+�$��İ�v�atj���s1�@}���<[4Q-���`���!�P��n���"��K L�˺�m��#`,��p�qiU�Ѫ,�$n"�܁b��lYj���d�����#*���D��0�Q8"���}��>�ܷ�9s
�(��s�9��0���Y��rn��q� m&S����d�az!튛>��a�Y�'��������…fJ��W�!�%��e}�0��]�:ˌz�����f=���§Ou%�pB��Z��@'p��&n-�S���,�/�O�>0�\�3]18#M���e���@�O��{ʎ����̐g��p��+x��0�4bf��@N�#0FM3�����n� O�Qu�旤������Iw��0�fhH�H��7��ME����$�
����Z�k�{T���7j6q��F>J�R��,�e��:�;2_���K.�P#���V�90E��0�<sH�IRQč�i6Č�P-ZZĔ���e����j���21�w–��_������h�`�(�b�B$�4 �pꥯB%w���K��9Â�Ȗ�-���7p���F.|�pm�u:����X�"���m�^�+����ReF���:+z'�$n4�7%h�a}�c"^SIb1>ّ�a"���2g� ����ULi�3��e�yU�ni�1"6o/�E�1ݞ�)�*���04u���v½��:�H����.�*�h�Z�54?�*b�-]�ۘ��*�
��2 u~̯̓�/��Pi~�v�Nė��2r"�j1b�hsNtiC�͕�E���z�ek��V;J�k�P�5�Iv����(�K��M^	���}��M��)0:Vi��3^��Z��8�XX�>e�>�V�5\Ap�I:4�@AO,�|s�
�J�匦~g�S6i���J���52�2&s1����Z3�!o�<U]�c� �@7��C�v��Z;����ho��$(����Qᄭ�'��J-X��]������x37�y}��r:h�ǚ��kZ��
�w:��q�=�d,߻πP�Yу��`�_|�Gkg�C�WdK�+r��uF^�� )��D!��I�
��b��;��(��_�V8(:e�֦=�:��+�$���&P�����/з���X��)ޅ�My�g'�'y����
��(Z�d�N!����V��P�؅I���� vp�=1�􍞛�@�SN#�Ev��:�|0�Ɠ����`1�I�d�,�7uD�ȶX�"�� n�
s�@U�ɚ5�	��}:}�8����3����!	!��Cu�45�&Q�#��,E���6���X�iIkM�;K�p1y���%#��� ������z���q�I?E��������)�Q^+(��r�*�[F�OI�@���]P�YT7���:bUw���جZ�Ѓ�]��$I4��YRM����2#ʊ�b"Z<!�S!����`�����bI?�0�2ucVCH�ɚ� ���H躚�Y��R�*ķ��pc�6��=vy��G�A�@O3��s�;�#˃̀�R��}<!��K�*j+H�ʪl���
���MP����K���g1���a˼��3�����?!ߔ�0aפu�\W��50.�nl.�R��c�6�����0�h7���xj�����hR��\�	�]J�7���^p1{+<�^�`#?�&��6��}=쪟��;ꂕ��zۅ�����˽��Uy��~��4�od�>^��>�}ۿ��iكF�~)�eU��N=�Y�JTzx�{d�0O�ce�i+��ތ`m�J�����v�0�ꐂ4��%޲5oB�1��#Jnǜt���v��������솙'.2?i���qմi��k�F�xK�c?"6!f��0��wl�`i�3��0/��et�R@vP'�X,4�7Ֆvi�2���'�0��(����	���9y�5bY��4��i���|d?!�`���C�G��N�_�]u���y�v�lo8I��T�� �Lccխ'+��qd���>;����_jpv�����tXt��ǭ�F�SL#�X��ނK��m�B��?��?�d���5Rǖ��):��+�_۫?4�.>ט:dz�Uo�_�Ju+�_תO^��5�N���mͶ�"Ƃ4Cr��K��;���`��
��%͠�z�Ü���oW����p(zq)u���*9�����n�pW>�n���s}ªG�ž�z2OO�5U?}���
s��5Mq����J�;B:��i�Y��S����1�c��|,�Nf���M`d�m��4�{�V��Ֆ�q�-����!m�&��6y�ƴ��Bܘ��9�g�-�7���2��"��
r&�i��ٞ��&��$b��i�J���l���hF�a�}��;����y��ch�ǡ��K�Y@s.�k�'M�]i����z4e��\A\�K���m;Cs ���fJ�j�n-s}\~(�XNN;�鬸8C��>�c�GR��f�%!������q�pO�UӞ�h�\]a^��q<ǧ�7#	>3��-K>�	���?N���M
���Y���׹�l�j;�[_Y,�~�-sx�G��0����Q�Ne�!����<7�T���c��)�A�b�x4<�D��d�r����.��l��RZ���)��j�LFNhZ�6�`}sB��H��ˬ�!"��ȿ���<5�&�e��oztۅ

���D�]�d<t��tJ�f��#��Wi�@a�
�68܋2�Vd�m��F��-�\��B����-��ۙRn�*�gx�>c��Y:�Iz�>�V�i}��g��^G����LQ�[���U��{�hW��I�!�NAue3z�w�ۯx�ih�iݖ�?)���|6R��w�OG�h!�CO�af�v�%�SW9�����Ml���[�C�U�i��㥆�~H�@��ܾ�-�Ӗ%Sx�Б����\�o <�Lzĭ�p?���� ��`�j|(��w�Qc�ˀH��]d:���7T!3�}b�D~����Y�#�͚�u�c��&O��kT��q]	+�A�M����I�9���%#���
��C��ģ�NȐQ{��r�?>�a��cM�PX���]�K۸*�QU�i㈠cK��eJw��P&�	6�Iɸqd@�~���t����2�y�ƩZ�*��e������3ml�8�c6Q����������4�6�3�s��lVR�Œ��'�e�a���uxfK݀D(��HӮ�#HR�k�t2��øew׵=��?��U.۷9K6�e2�~(��n����}������0ȋu���v��%�y�]XW�K�hM8��
�jH��P��d9%vhl�0���5��8U`�#��aV���>�g;;N*O��
�鳍��A�u�x�Ee��nj�����Q�A2�V�t�mf��Z���T����
!r!��O��WO�v��������#�-��i@��5�����.~�TC��?�0p���{�i��>\d��L��z}�蝟{�ˆ�q������3�/lϩT�^��x�|s>.��I�XK�᪻�>�IWr�n�e�h��}��Ø����C��a���''pj�Kz�Oz:���'�n�є��ݖy�?��w��̬j0(��Zq�m�V	�z�n�_���.�Ƀz��,G�.�����E'M�mGȒ9���.�ǐ�1�vlu��L�1��t|}���1ꈤ�S\�*�ruʹ�nE��|i���܂8���g��C@����8ߡs(����O=}<q����O[��Ch�Dږ�39U�Ѩ���{�{T��PK/WUW��M-3�pip/_vendor/distlib/locators.py�}kw�F��w�
D/���-�1��(��t<'�xl�'{7 �	0(�i��}U��P);��=gq��n�n�w�:	N?<
�e��I�m��7G'G'��r����uDOF�����S����oy�삗�?�Mž��YQgiДAs��w�uY/�Es�TY�u�-Ҥ��|Ȫ �����gۦ�o�*��Y� ��Y|�����^>��7M�i���^�x��^}��%��rGG�zSVM��%�-�r�e �k�����?�P�W�r	U_�Z}ڔu�f�4��E�5�nr�#���*Kp���7�l���Ӫ*�I��*Y��IP�0�۬2+��z7� ��6�I�_V��G�z_�u��R�0���\CoU�h[��Q��8����3��-���8�"Y�7��^������m���?o��Y=O6�i��W��dEV�T��ի�/�4��y�
,�
���ԙ�z4ٛf���֋:R7cJ�<~x�-}�Lf%3nN�L����=��M6M��_gM�0T������MVyJ�J%��ғ?O��Y:�T0/U���U6�WI

֛U�L�*��_f
��LĔ�nZ��a�ps��˜�M�j�ˬ��ϫ����(�5����M��A`�jv���f�߸�9��,�c�o�2�z���V���2X���b��-���<������/�y�b��h�N�,EU��觻�F�er�xt������ѓo�x��[�O?�ίqn�t�G�#��o�K>}���N��<�����~�Ԇ">�n֫��kN����}�^A�_=���߾�>�?B��i6�����n��e����Q�-h*�ՊpL����mz�]Yd#�+���G��Ͷ*������]�v@��盘*M�5n�I�
�.신\6KU{<VK`3��Xl�+_ xX�;=�ȅ//kR�*L����1�F��Y�m.>�������p�z���n��M��)���8��Q��F�|U�Y8�bGs�nu�И�Cw��pM�^weu$�+`R���2�˵�i�����*��l��2TYX�Uq1�6�ݶ~G��T��xӛ��0��6����*�����Y�m�h\��r"3W�a2��^l��|U�l�l�.6A��j�o� �>,�\n�q�0p�lq���u�]�B���Ⱆ��n8�jL�[&*��m��}��?�i­��f�!1�~��<�������`���g]/�2�z�.8�8o5aVDy1/+\��n�h�]5�f���UP��>]Β���%l2�/��l?��y��kǺv��1��v�o��M���•��'�Vyh�@v���M:[7"%.���N��7�-��jj���#��3�4Г��v�1ȑي*"]-�1�L��"�.�@�e4.h��I�T���6�d�M��;��H��.�����Vu��&��]�%�(�p�	�������c�ſ�/����QVQ9C�C�^qI�����S��ˑ�$
��,�ú�V��ZAŸ�CQ7I/��Ag������y����~	y�f��]^�\R��MF�WR���6�̭�I�Xf��`�M��I��w��: y�v�6�K���X'�:&�T-�#�@N��pr1�-�2ɋ�!RIm��Rp�7�L_�E��b*J���pPB��ۂ-r�qJ���%j���Ɠb�!���(%���E�d��?�z$����M	d��ĪqeOx>�E�uR���a:�������\�2���W��3���p(K����"$1�I�ga��WeyCh�.k��(�������m�"c�E)ZA��4�O�b	��z���E��}��|
���)t�\�����/��
W�2��«�>`9c��H�!`���]��|��Y�`\�xJ��?�P\@�h�Y5Ӏh �Z�	���'5n��r���.��(���T	m�FE�-�޶Ʊ����Q�sa)��++�FF��������A8�9%E�) 23�8�J����(UR��(u���b8Q�X�R��9ͩ��!ƞ�J@�lU��3h�'G^�߈+�$M?�/�72�#��І��~Jq)v�d�q���z�	�S?bUY
�:p�
7PHbQ6f�l�iv�h�Hc��!�4������F��ܥt@�w�S@L>&��رn�h�ʋmf�`�k��f�’D#c:h&��2�AѨX�'X���d�k1�@�'��g9N���=�C8*P��\WL��Ar��l42�d����i���T̬7m�n=��.Ԧ�W���;�jrE?s}�N�o��i1@�U��[$ۊq�F#g��oa
�Y��%�H�A����l�0x��Q͇p{�v�V b��~��u��VDj�� 
��H����3	[�i�R��6=��W+��T
E

HPz�I���S/@,'�.g�TAC�C*,�]�<kC�(|N�x;J�t�q�I��d o�A�k�!�w^+��_>��1�!"��@i�'M,c",Ĵ���j�d;�Jv�E%N��?� ᘒ�=�^�:\ۜL6����
uj4���d���Z�
@��Ie-�>z�>j`f�dڬ�J�𼬥��UF�8�*�~,���ר�'\O�K+��3�.K��M�-2�h$j%�E�%Ϳȍi���x�Qiq.Z�M�^FM���҆�u��Μ�S6g_h�1�����%����x��r��B�!E�l���S˨��=R-��$��XG��i0�4d�FYY�C"2q�5@���	g�c���ɱ��@��ۈu�.�>��UfT�J��4�f�,�"��y
|����,��
�U��ID�����&����$H��9Ep[�/�fdѸVMӤ�M���4�:P�R zoƺ�@���������|eNd- ���|�7� Lj�/��Ж1�����q�[ߙC��Uj��rHҹ��y��ྀ�]	��ҙ[K~��;ܭ�Χ8�@�B�[��<�����M^` ���8d�����UZ'�r0��M��IV�[�ǽ�H,�S{�CL��+X޶{��?C�/��O�R��i^,ʖ4<R�qǢ�!g�@(��]�"=�a���v��v }sro�:Tϫd���"@/!(��ld��0�9�?Kd���A}Z��lW�8��qp,S{�Ҕc5uǴ�0�j�1[
��e!�A�)��x>r�ZB��F�<?����t�6�^$|�b	�5��k��*�� ���nXS�=^�whr�A����ry��ۛ�A=�
�#�����	m�>CY`!"w����`8�Y���20��=��jY�W��8�u������Ʃ�3>�罬�%�5J<�b�O�������kb���h��@EjG�{�(y��[3����pD�pŚn��@m�,<�;��I���]�w�BA^W�<�5���i
b����oHo��oxBl���py�z��
L��衮�y�p=�%P�
n�"�$��ro��C��p4�ә
q��v�E^Ͻ�_��E�Lt{y>y=�E
ƳBޙ����E��:Z#�P��-u�T臊œ���H`�X_�m+V���!���}�<
r&����<ZKQӭ������d�|���h�@��۰CS�pu��2��v��цGT�|�kC����$N�4�P6� �k�ې%��0⦟�
&�D�nL�j3}G�=�N|��OʨtK:"�T� ��M��/$��ܛx�sJ�ƀ"��Q=����n3D���zx�/]ŽV5��Љ�tA�%;�����)|a�a#�f��8eS6�
��>띘{I�����v�'�/<��QȐBY�o-zj����bhN/$4-	�O)� �L1wD�Fڍ���?x�ƕU�&��Ġ�!yy����O?���_}�Ǩa	��b(�#�Κ�8�+Z��K]ڦ��k�X8䫾N�G��駾%�b����S�ik��KB?�솁���Lާ��JDG}c����d�����S��n����)�Z_a�=�UԔ���,n�~�=c��G��7�:�!$�c�2.�����r���EP�-�r�%E���	(����v=e�4͚�-!B6o�MČ�]�A�E���]9^x1
{���R��?�H]����X���	$RȈG���Z���]��&�Z�����k��T�~��u4��F!�,x��fI�ad�~g7���У������)̚h4��4�M54?�Ԕ�ݱ���9n7���u<�q���T�Gb�8/s6d[�Y��^9p�%��Gݬ��$&���M_���eDg�Q�[p�U�ɦ7�����E���9���~<
�n�1Ak�������1-��S)�ݲ��7%��x��8��51��]���6I�X��\ԓ+�O|��(U˜�
_]1�
��ۮ��s���q._�������5���<&�{ �U�$`m�ª�Mo�:��	y�0'���$A��"�bo;��&�Q'��(+�c�MY$�Fq{NGA�1m�R���V0a^QkUUF��9�/L0R!���E�$"`'(ݶbwB��xx����b��J�+f�6�����v�yjJhۑ�n�������
�PDNǭ<٣Az����O�	�s��lt�PP1���5���-(vP�վye����\��F�8��8����4��
���
>'{:�e��79����.�Sb�`d���s�m)���p��5�QP�F��p0�[?…�����IEpc�u�Wm���r�1��!:����R����b��0��Tk�Q*piz'ԣɿگ]iS+�c8U��i�ij�%�FIV>z�*m��]k{Ba��F���}w�-[ʵ��i�@Elf�v����5/%��uz8��J����wN�ݒ�xdGÓS*��uXE�:�U^Qw�T?���S��FT;GT�g�
�sYq�I�TL�1�^�)�#X�ё2A�+�ʈ�#��Ͻx3�`��7��-��!'\y�:��gh�e���$x�#�9�Y�hL�v��He#{=�O�b�T��^r4�O�q0��O��I����T�ls���U�$ܚ��TL`["~mI�+I���TqeQ�Q�h�B;����/��#�4n�b�y%2�x+���t}�W����X0��%[/^��̃�j3�����WHq���.��
0���Jk��z	��uO�z�^��Ȭ'��a�U��a�=4�X�����G]��vʴ/�f��C�$V�+�z�5A����4���,>�G������(���}�!����?_~��}�!���¬4Y�H�����)v ��s9��l���B�G1%�4�H�n`�t��y^�M��;1sl�nE�?Y
t���k�:�aɶ&s�v���%�������(��Fm >LG��/��ǘ�&�*����ȜR!�:�0v&Fᵎ���s�@z��vY@��������>�$�?Iߗy��2CtY��T=���Ύ�r�T[���C����S[�I�Z]9��S�v���}/�?�'@8���+��3��7��	V���@�� �z?��zۯ�o�
��.HM�M=�6�TQP>y��P>uK��t1^�<TiQ��+��:��XR�ɍ
���(��3�s(���� �u'.|�f�c��A�����Bt�:9<�C�f�}�?XжAǖ7�&�	ۢ�1`��/k�"$u.2��'K��gЁ���$|Đ
U�8j:�ơ�:�ߓ�	�jhR�W����I^�NU�K�-�7|,��N�s]=h
x�/�ט%/n��{M�4L�����A�-���,͓&��7��L�T���Uf�
����P9�H�'��xd�UR)sVZnQ�$�3��`�W��/�2`#)��p8	��X,�fop���#Si`�U�ُ��?QZ6����8������˿��pt�6�7��&�7�[y�1����T��|�h���ҁ��nlxxǂ/lxGB���'��}��3�F��悷��%���q}JIu��uP�s|
ݠQq���4v���F.�|)�����߼ئ����Q*����%c[��e�L����!J�6#.\-��w�kM��,Gw�4ԡ�nr�":������bZ��^�=9������}4~8��ŗ��<�������:� A�'ߣ^$���2��J�G��r�Z���͇�a�|qBɬܒ-;�\
1��(��hS��FG���@m�J%t�ۅ)A\l+�Q[mp�@�2h/�����qf >�����#<e(Еu\
I���i~�;%E��2���U�M/0�,���N���T3�bdY���#�����H�˹��c�����Y�S��g��{�Vb
�m����cG��9t�MJK���C�aЈg�*Y���@>x��
Z1@����4��E�d�N����3�J")�.ɳ�!6}p��:Q5'����h<X�V]�2�f4��^c�jva[��K�[���9l-|�M���Y��[�6�h�@���N�!�fն��,��߸�8�~�'�"j���u6(m�H��eY�D�7�&DY���noI�VV7�����Yn�gI}����le?�zU�� ͒�ۤʱ��x�O΄-��V�+�7R����&[�܄��Lf�5	E-M	1=5�5�M(_u���k�:�FA�B2VG3���Jf�(�[0f�㯽€�D�Ä�v=�i�Q\�=zgo���uFVeٸ�.��Z�3�)_�L(A�H1�ŰQ2^^1IDSǽ��OT(B9t�x+��<l��+c��g�b�iH��lf����"���=���v�5����I�*���Bͦ��iFo��i�G�]6�?5��D7�]l����#<`0�`U@�Ŗ�e�5��7�)�z78N��=~�z����ɧ�Q���͈_��ݾS��T@2d@B:&M�9�/�&�
�i"^l��1B�j^��k�j�I��i�K�y��,1}��0�]��)��D�9
�n�0�4���ma�w�8^Y�M;�<-�3�gg�IsZ��_�h(M��5h��\D:�� b�kP3
�9��ʤm�4ō�枯�ktXkܼ�%Ё �c�JV���͘���%5R;���N֓K�5�=�m-�K������N�E��lM������;)����8���N� :�,]
�R��A�L�v�^��&�'�f�9�����m*��Z�s]��t�e��ʼC��ܰ����7\��X�0E;�.'0C�}��%��=.��ģ�j:H�6J��Ȇ�wh��c�r���F��2�g����J�Np^�^�f�7��
dJ:
a�疣
r蔳�|a�vL$q;��=���v&~R�|:���ֶu܅�錕��D�i�����,c�O�����4�J����7�l��'o�j�?�=,\�
�`|���&��OFo�ɼ��L��)�h��̶��c�r�o{�}�	��bйN�� ���^JK���La��2r١�)�R�L:{;���mޜz�7p��X�r��n�l	*^V��'���sh��Rk��f�Ρ8h*$9��@K��!�1Ϊ��H��
�˕m
�](K�hpTs8��#��T�[��+]��YY!�ݨu)��rCI��|u`߁=�d�����)Hs��s��&b��N�#�B9�D�2��{����͌������fNW�a:%�@��}-�]�b�Mϖ�'&*d;jB��%��d8tR-�d���u�U�|�J:V#�*u0��x-!�kޜ��I;j-�'��/�:�N�����)���y�;���W�*����^8�/�1�;YL�m�4^��^%ق� �u���0�l#�4���I�^��:����wB{�aƁ�\
��3�Q�}�-$
'����7q���]�O
���
��CO���*X��sT�����]��)��w��I,�ͽy�XtRY8���Ŀ�r��Bry�ʥ�
�cJ5�D)oZ�{~�a�س��������1a ���1��#|�K6�m���P�פ�M�Z�\f�V�u98�/��R�g'���q&D�f�_: ��d��
H��K�z����|$�@�huO�[���j�g�z���������
�t���H@,������g�u��>�
���z'����o�J��$��w��D#�J|u�i|6�A���ux�M�&�azwx�W���dNOnKP�eLN�j��+
�f���'�*�T��`��
�!��8g��$X��}��_L
+�1�.�1�W�cԺ����l]����|K2�����_}O��D]�!I��:�P=�êo�h5uE���q|�+Q]APU���h�t��,�"2p�jhE��W����H��ބ�T�1+�����߸�Vt�̶ț����n�`xz��iR�aV�9QtJ������u~����[+k���u�W�!X]Lʮ���	){O�W�_{��8����8��us��ź�\�(H��J�+{��t��z C%8z��e���R��c�[���2�v���\�U�3tO.oe�V�2��g�x�T�4O+f��Q���҆^Vi��L��3���y�-Ѕm�cjz��`<m!nZf@� e�_R¯���@�W��W�0�Ҭ��J�KO%��	}�}{� ux�h���2>ݣ�E��N��{F'#TP�eqޫUW��KU�u��#Tw��d�0%��ayΨ�6�������&��*{��\C����FH\_��ܧ�f��"�5�so�=ZW��<=�a�66K���hJ��;����Π�x��p�o��DY�q:�0�.�O}ҿ�h믝@k���P�i�CB�M���5;�v��H�"cT�"x�&����a8r�ƛ���%��##l��A�t�T=nDk�y`����߿x�����?�����ӍH��I�U�6����^��\O��
�@�P4��=�=1��d���d'�r�FD'P��� ���NB�U8��58H�v�u$sO��a�o���yB�X��m���&'������+sEo�PX�^��!FonA׿�;6���y E���v�3��<�H�~&���TuS��dsL
:���l�U;���H��,{�C\+j2s��Q�ݤ<�b�qc��Z�oɬƿN�lٙ��GE�7њ�2�`�n���P0��4��1K��w�]I0�ϵ�>#'��JԠ��Y��{I�=E_���"`8}a�{��m[ 
�M�An���э{=H�R�]^�����C潲��E�YNTG�٪%'�m$	�!L����c���^�%���Zm������T�k�f����bL��hG��@~��z�(�r�6\��lA���T��2r�*����rm�r����/���Q��F������^b��ۚ�u�8(���S�������),��ސ�t0g���1���w�C!:Ɋo������Jm��3�/����{3�sm��G(��|�=,W[K�2����R�#%3�y��(�����>� gݕ[���Ӿ���e^kMU�^�[��T6�Ӥ�@F�.�6͗%���.Y�Y@t�"Q���K�x�l�f��h��!���4��3���O���K'�R���
b�ʲbܡ����c.�[�u��r4$Hz��"[@�tK�F�~�hwH��N"t3g�d�os�@e��d2�rH�|��3�k/#יi���B��E�ev�n?�O��¥���}a�<�v_F|�T]�0vj�F[�M�����}9@u�ٛMY5v]y�SMRHP�>FYO�
�����X��Ə�y<��
15[!�s���L��^X�خ�
]�c���g�x���%���N\�Mz�M��ŵ�(�}��q��d�>cJ���3�(�h��0�S5�u{�(⪠ ����gQB�,P�˞=<�y����z7.�2�BߺtO�iƝ�{��^�G�z����B=�گ}�M6\���f>I�~'t7}�Ӭ�XZ��r��n�U��l�(�l�t;�0<�l�ё�9VG�	U��z;�P�Z�̔��b^v��Gl�.�VI4��6�_�P���@u?�N�V��g����\��Kz,��	���\ؚ B�E�Z��|�C�J����Um��
�;o��
l8펩�"�rnbO�T�-A?�G?@TF�S�O���������;�$��C����)�f*d��»cd������#���f��\��3o(�>�Q�R~W�M�ac��a�=�1�"Ov<���7�^�O]�'��5Ɯ��j�'(t��}C��~_޼����D�V��,f�,)�y�`^Y���8�{`���yd(*0Ŧ�>ꒁ:����FZ�:��LX},�.cg�:ӆ��P�U�M�Ȱ�K��q�5ݤ���c�7����Pr2�3���$z�W����h:��8��� g��
`܁�_�<,~Sw�c`dR���Cފ�咢o`�ܺ�	Z�uG;�Ʀ�1�)�	��1O�-}��:���i٣Vg�ʮ���/�2��/2���rE#,r�Qnx�W��˟�CSa�/b�܌��|���=�b��ہv���\�s�0�Ƕ; H�,сyA�0���\(���(7��֖$<�t"aY�Xm�MX\��쑸+A�1s�S"]J�ӛ��N�
$�b���\��k#�v��h9]n�����O�GNH9L�G5��Ҧ��ʉ4C������p�+9��;?m��tž��qY-�,�e�4���d�S��tI~u��3:eZ��J[t9O�?y鷒J˴�ѱ/�]�OQ�>P^�{i�c��o��ƫ�V�wqN���"��D���k�^~g+�␤�m�i�m=s�8M������(f�%�`��͎ӟn��T�����c<H�j�W.qC�������iզ��Ժ(K�G+Ѝ��S����lG����Xs�r�rU�iPu�����k�9�i�u3k�na��99��?�x3��q�=�t9��ñ{�=%zX��i�暆M:���VekP��o/���r�`�^�k͗F…�G:�!xG%��t�����u�����zg�Sfj�8��y9��g�R!]�AO�ӆ%��Ac���>��s�j攰�Qk�͹�!H	�lK����
�<j߷7ƺMFfF�ң@*χ
�_�U�Y�#����l��A�J��g��fCY:�ƭxl�Nb0vҜ�1��U�QH|�����9��	��q��./��U� M��z?��ۘm��D&&x�j�t�A�������:#��s�ُ��	sT�L���FuK�(ux�=��<��d���M~k^j�m������/�)>`Jd��u��Z?�8ӄ.��=��v���YE����1�k�>�+��W6��x�f��tV��
�+��w�;fS�����z�4�z�0�%@�C�]�#S�Xge���:y�FI
)���
!�Y�N���Z�D�;�[]2�s�׎+k�]F�v626����\Kj0|O�Օ����0dݽUc�mxuE#�j��.P���3Ǚza��#����Ê�����{:A�x��M٘�$�I�5�^����V�[���l�@��W�I�lq�����Z����k�
l���X��_�w!;�,� ����Ȟ���$��;�[�ײ�m�����-3����c&����<s[0mK��"������+��T�I˵]�Eĭ�B�ov��G��N{I�j�*���Uu:do�����Ǭ�t�F��zp&���@����Q���4�q,���6��v���h�;��c���p,��Z�Lm�1%N�jjI�m\���!Y��T�( iw��T�.Z�œ�OG��N���t�t�C����E�G͌�@	Q{��@.�6w���I����l��@�ۗ�.��z���\]�R"�����ym���Ѓ�)���@W�X���F˃���
�:]ۂ��vB�KT����0���/ج
4c?�*lJ�LľT�Ơ�ئУ�QY�V�[J���9�ݛ\	r�Wf���d�<�H9	z�Z*��0WW�B鍎𹺢m6�d���œ)Z��m0�P���h
��K���S�\d��%�	�wz�̮�;�T��M�9�7�bB׿�
�E
-�h��J607�:}&�LUѐ�*�4��j�r2�'ǶFʑ�>�=��;Qr~��|-�y�|DǼy�'N(��$2����,<T�&�'��i���2�y�ב�y��8:�(�/d"��Z����4��`���{#h����v�ayJݩ����d"���"�U�c�m-�
N��+��V�ɞ�1٢��5����7�C�F��L�\Gr�8EVO��"�8���weڦLKyIA�&63����DeJ�k�ŻJ�E���r���n�>"SN���yֆ��:BV��w���^�+}6��O��xS�Xs7�>,�^x����p��<
Y #wL��$W���b���f��=1��M�.s/o�L�;��E�(�)�\SVuGM�َ��"�BZE����٭�U�3�L��O����W6H�=�{K�Gd�2��ZO�4f����FV⭚ַ��g�YN��(��2�&�1s�|��!���+��8�{d

�%MSz��0�������:L"��R	K�;�_�hg���e�:��0�UJ����2|/��o*�{:�7��,���е\8鱩���W��*0r�B	|k=�}^g�Bu)��4��j��}eЌ���,�D�x߃�YP̢��O��-����y����ӓ�H�U����x��ޗ�����bYXzfqW�ͷ��h��^w��%k+H���sʻ��)x��͐`
l�b��7�M��6G}�@-���>A�e_�����*�RT�A��yj���(���2���bU�q�S�PK/WUWx�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�PK/WUW�"@D�pip/_vendor/distlib/markers.py�X{o�6�_��qHJd��]qŢ�M7��`cĎq@lli���D"U���w�~���C��[�gW"3�7g򜜾<%�,��-Hk����J�<zN���noH�6%ߜ�����E���rI��&�{^0�YI�$f���� �rk�b�lEI
�5x`�P8O��Z#�m���0��1��j}��ͣ!T������?]}�x����NNN��4p�<��{��@N���+S�ԼP�b��#%�r�rA.V�۳�r�	^K���m���f����]!�t��XF�ӛj�jY����*�#��L��nr�|`�LeA�(�*(�(XE�{`'���fX.��aϋ=���X-�0�`Zs�ط��-Sh	�4J�b�G���:<)��[l*j��um��I�%n��94L{@kx���܃2��ƹ��@e�1�k8�V�?�����:�6ZU�
Y��1X��F1��������⇫���5 ���%*N���Ur��w����e��M<^���9�,��qEd���p(��."�%B�n�m�(X"��!R!���2�J�w��,�-��g��&>���;f6�::�T�t[�­}�0��rl�b�D�;�#y�g�L��I��l�� A��e��$V(*�5Y�Ӫ�@L��V����\�����1�~�=6��U�Q������9^.��h}WR�Â<BؓCև�5�' �G�f�}6�}6d�= Ɛ��x��f;��͟���4L5�z�I5��>��)���Y0s��?�c���f�6�x�����=�^�����*��E�ra�����`+�bۊb�+6���reo�_;v�7ȇ�a�r`���g���糧�{��G�=1����%���^���`T�)�gl쥞��	��sy�>����[�U�A��.�y�c���L���aG)�B`�LmUr(�l��l�۱�`�k���Č��p_��Me��J�m�r���&{�;��y$S�m5��Ë��%��7ݴ<ҧ���H^�Cq-*�P�e�@�̊	�|��)f�إ���7��9�z�'�3ޒčm?��cIq���Y�L����(�������V���z�����7��tƌNi���a&�î�
��)uЕAB�{YW��Ë~"L�}��,���zp@�/oG��O�?�_]��"hrl��G���M�*��]5�m헗2�b+{چ��B�φ$��~����34�G��rlfݖb��.��U��Z\�1�6�� ī��a�}���I��jb&O��nO55@�/�����}�w6G�Y��C���O1�f��)%�D.H�e�I��/�c�~���[h��a�'N��Յ8���ܖ���dr:I��nnF�fV�'iB*N�F������נ*$�&@u��$��{ӌ�c1��0���z��/��!$��p�2�>Z��w��I
�.s�[��N�~�#��~��m�wA�M8O� ��W�h�d?������տ� �&EJY5^�"� 90��u�d�JlGY��h��k)�h�9ddž�/2
�_2��p��\�OD�2n79�=��O݌cS'��E�avP�N��Df�̿�I'E��_ۦ�u����(m��Xp\Gzbz��zoHW�c�CV��O�5��|ؐ��-۞п��GW(�V$�m���y��������
�z����%L>s*���^�&7k'��ҝXa�h��v[c�`6�b�מ
ƨ�PK/WUW@�]"u%y�pip/_vendor/distlib/metadata.py�=kw�Ʊ�+P�>��'�U��*6��Ė}$�UE�!b%�%������}c ���\�6�������y��b;?�2͊��`�\������ry_eW�M�ӝ�ipz͂w��uY'�es�T,xU��4i���@�Ƃׇ/fG'�I�	�"
^�=:=>��ӷ�'��
���˜-X�P砼��5	�K�˲�c-��Mr�����]=NV�eY5u��y�0:,x�NvF��d�3�|�l:�%T���p��.�r���YU,��l� �U�5X�g
����|:�y7�H�\�X���b|_f9�=�Q���=/�����ϊ
�D�y��M�]�>���1�nYUïq,����2id�����oGAM����գ�a�]�Z$�
�ݲf��X#^�=�Y%�&���o�(�bML���'#����kX�����;��÷G��l0�Y�*ؗӟ@���,��"Y݇@�y�ԵZ�7Y]C�YU�UԦ�po�,��UV�Ts@V�W�
�EY\�ټY�i�b�M	C$i|xW;���<��]a1p��U�O|#STl^^�?Y�-��:$�)n���cJ�������I���)��&��!�2ޕ�n��L'8xw�w%ҵLW��q[v�~p�a�Q��������xv����ã/���g�f�dz��;�sfVp��jXE��(��{����IP��j�.Y�\ 4	�*��r��]����:)�X
�aMA&e1gȰ���?���\�`����n��/�@���hF
��w�)���S@>
,��㏿�C�5���#��������'�,R&B"�6��G��Aa����� ��KVϫ�x���kvWVi�-�*l���@$W��1	C��ٜ5�i�Ow����6֍�%���/pf ��Kصy���o�_��o/�2g
�=@�U�m�2B�K�Z�����nD0HG��Zx��?�[�7	�6�?_���`���w�E�X���?ؼ�����z������ⱺ�>��.�\����F�vy�==��#��.�M� �ϧ��?���9��&
Ӌ�@����/��'�Y-�'"Т��~��b��[x8�FmT\.]��p �0$�6���|�0�2��
�K���A9���R,�+0=���km4N��b��R�O��29���J^ޡ�F�
J���C�^f
��'�?�qP�>ߙ��>76���>B{bF1̼���ࡗ�c�ZH�'\7�\�����?�[߃c�͍�3~�Q(��Ys�$0�@˃ׯu˚5��|6Y-aIXd�W���n�x�t���&��������0L�����U��X�aH.ڏ��}�O���}���/!��o������@z�S�br��x"\��R9�d��{�1�o\UE`P�^��������k�륨�}A�O�_�����v�ܖY$)94����������&[�{H�-ڤ�%�K�d=u	����&?x'8���d5�E'�;mJ#�����N�A�68�rU¡1S��f���}�l6�h�u^%�H��`u#�+�.�v:_�x�7$�B*eKV��\"
�]Brr�?��Nꘇ2�v_��0V�?���,���-Ξ#�UN������fz�}�
>ȑ)b"<�B�c�}QG�� �Mtvl����Go�;>*6�����
w�,�jH�!�fY�%q�3IB������\��,#���A�p[���'8S]f�����)�<b7�"O.���H�/�x�8.�>����vI�"��™�M"��#"C�-�HMRv���@��|h��$0�'�Ј�H��@r��"��!���#�ŗ@r�k��n��tc$
!*����"��H~�h$��-���}���muX�f��TS/���%�`	נ��#���>u��{��0�aq��JF�n�H�>F�n�i�͍$�v/�mٱ݉�Gz��I���X?��}?����"r����uT���l���S��w�
膺���|��R�X݌U;(
�����-��z��6�	͸��Uʪ�~�J�]��qr��n�+��%'�p�3�6԰��~��섥�2
֔��)0�`��PP����=���p�
̦�~�^�e�XCɬY�D|�`)����_S������}��C���Y�O�Sԅ�`��X�J
�}���Xp�ܒ�̯K�#�pg�g9t&�2~���G�f������aE �H�ع��pWV7�*��Ǧ,�ڂ����<�����(����o`JI��ч-�_*0�Y�G���`J�,s��F�
�E�5�� ��sj���1}�;<�Z�i6�84K���^�9��؋���9-Y/��4놡؍&�A~c����L�6S�����ZYT����9���kP���T�V=�(a��M/j�R��C0�.���u�,�g����&K��M���Y�n�-ٲ��w@H<����?����))?��?N��NР��!(�e��Y�5�[��p�ޓUN��ձ����m��$q�^�4ME��t��B@z;\—�/Ngf�׉���g;�9H8�‘�K��l�"�t�vrj�2��v��fm�'V�i�^�^�E|;�߾�x��uBoD��o޽��$4����������D2cd���7G�/޾4A�0�G��#�7�''�����#|������U+4���`��d�ϝ�'���-P��?��#i����)��߯��|���N3L�YNg�H9��h.#/-p$���&�G�Wc�m������@z�	0�sii���V��K��8ɗ�I�Z�
�7�
'�g~�`��`F��Pu�T��
��$�4�&x��`�%�et[���S�+ì�	�@-�^]D0ʈ�hsRŰ|M%���d�I8Z�I=S5x�K�3P^��d~/
���^uL~ʩ�6\K��T,gI��b��$eN���_���yIQ�j�qJ2�'�<�[�*4I�d�޹5C�Ҫ�h�OIu��\�:��@��S������;�J扙̒3��i?
�2����q��0����+(�9�K�d���~�,����`t��xʐh���ҺK�M|���� -�4A~�‡�$��a�0Y�
�ց��Y�5q�,�	�1�6
�t�_(��=	��b�Ў�!XQ;a�×"{���i��!�C��kA��ɩ�d���1<S��$QS���7"I�&�a,uW�e�<�����B,̾��9kb'Ď��Ia;�2��r��{�h߂"��E���C�����j�����ﱧ��B��G��(����+�d3�\���*!�0~l����	u�@ΡO�ca�:�a�:�5�-H�:1�M#.��������	�`d+Z��>l��P�n x��\�G��h�{�	��<��
�2�0Yh/�6�|�RC�u֐3���k�ʑ6]sl�5��Z{�@�е�����#On�R��y�8JG�=W�/�RKߦ���1��z�
+�t_,��;C�I{@�����_��cfa�A�����/C[(��Hu�2�b�K�̏h~���8��`� �
��[�Z��V�;,�?�7�
����K��*�2K��6���A˪\'�Gd��/G
�1Il���� ��\�&<�<Œǟ�K�f��r^��3��G��ʇ=�s1f�Ֆ�h�)lf�%&��}�)��榢֐�8����xև�c���@�G�^}�=Z랤Vn�-u@9�|ɴ�V�r	�*�	�gI���ie"�y_d'�裶i��m/3r����</kf�$��i#<b��4�����`�Na�����g����B9��V��j;��4 ��Ъ��P�p������Oz�LL��gD��{�[=ms{o�x��x�gs�=��'��>�Dz�%��9����9�N�����ߓz	�V��A&b�|����7�J(����UR�D"r�D��D0	�v���z��t�*���^܇&�a�g�.��LvP�J��c�U�`�ێ?Rr�dyr������S<#{�mA�-�5�
�N�"e}팁�s;Q��~�l4V�?�#���l�q���&[��hЧf���K��R��X��=B�J��d���#$��r�@�>��΅��"�f����5"�-���q�•�-CUI�zdZ��|-фv��l�D�3�w{0�Y/�{�|E�y6�E�~z��Y	���~<d�A�ZP����^�XW»Z��/`�����C��5�T.����t.B���j���n�G�P۵�%.J�'ŧOo�ꪶ%��)�M{��]a�1Ϲ�����8,����ݑ��AA�o���{���T��{<r|���.S�F�`����+�{�����P��U��
��&
�8i$ߊ>ƄJ��}�3%��D�4�5���NK<�9�����5����`0��{�̉�֛�C	���_�{����7��v�����#�qh0=�5Cġ=����D��d����4Ẻ�ѣ%,�#��G�?"0�_�	�„R4q��h�M"���d\~vs�� �0Q�ܭM�����NpRk���no�k��<����6�M�!��"�JŰPS�3�!r�5)������Š���N]�u{�u��Is��v�-����Jb��m�����wn3d���/�5��y��,��(��We�������l
��'�f`[�l奎`t�}d��8V�"����]�^��^w�i���l~��%��P�Pt��ܡ2B�SӘ<��[�c
�g;>CQ�r�,(��Qg;��
����#�PΛǿ�UK/�[��O�b��h�Ps��:��͌W�W���lr�3��Tt��_Z|f.Z;�e�5�,�&��^�b��렩�l2p(���OG�G]ZzI��PDzM�Ɣ��I+�|J��Rxq��9�h[&V�������v�:�2[�V�_�Z�ڞ���LL���X=��K�H�m�N�L*�Ѣ�C�^
�¾A8��C{{t���`�;�=E�O[�#���Z��~�K�=X���va1'3��r�QH'���D;�l�|�]zL��X��x����`s���^��{FV��Ժ��8ڼ�E�^���.��^�)A6)�	��>�3(2��i�:-�������k`E,y�b�� �v���5&0++�錬H�M��;L�.GSI\#4
��|>�L>��5�{�{<_X�Qtq/�i�0�0$���ɗ���Ɣ.��b`����OuB�¹>�*9�'<y��+�i��t}�&a�E�
���k�!lR��bIL���
�xЙs���۱�IWx�N��d"�M��s��n�!�����*�,���ζ�^=/�F�Zp.QF�g:煶Q�x"#�\�YNQ�Fި�:��c���e�gUU@�g��=���%�����e굆%[�]��^s!�"��<~RoaΙ'5�� �7%�0��Ѹ'}C�%%2�Ԉ"�2J��]`ܜ��`U�U����bc�f�'x���'y���6���~	Zl��>je6	�A��(���J�
u�jD(�,���A� �fgC2K�!�B��BiJ)����a~�,24p:v[��WJ���)�>c@Y~+��U�w��(�-C0}���L�>�X��J��~�l
��wC����Ҕ�-����MI��a87r��_E�ה�|
"�i@�$T�&����U�2o��G��g@~��	�����Z�4�'��d]��7.�Pn9�!��,�)H�
�WC0Q@���+֌v�C6��������E�ā��/O4�2�y��3u����xh�?'QІ���K�4e&柟���)g�K��J�x"�
�cN(°N�RK���������U���J�py�i��5|��l�:��SW8�g_����T>��9�r����b�$�;rA_�XJ}U?��R�X��E�r�#X��J��!��#L��ͯAi�x�"��+��-�5�E�B�FoN_|5;n_U��O�'������r]���C������;��/�d|�T>��!��ɡ�Dڡ�	��;�����7o��p���h���\ۄ�5�헳����[��� zRq[��sXG/���׳NT�'���I� ��6��w�ǵ����!/o
G�P�G/g��A"����9/�R��гYC�.�7)߈2�`)�Sj��3k?�TܛG^������>z�F��c�%qR��c=���b���7����f"HQ�яKy]�7(q�S��6��ԕ���G�����>��n-r���%�ډ#Xts�%���edr@�`�]�jm��.���
�8��Ipg�y	�i�c�*cy91��B[�Ǘ��RE_EW,,��k��Ņ����O�r5�pYᓵ�XN��F��a�"�F��ә�hm55=�2��H��U*٢��~/�rzQ_҄oai�\Dy%(�H�T�L ��.3� ��<Gn��<g#��(6���S��"��GY�!jYZ\�X���ˀ;~��`��=8��g��|Ґ��%��v�X���)+�O)c����|.���C��9�v��P��$ٛ)�$���r�?������	jȚP�gvlA
�{�M��1�:�9*��v3i�Hzt@�
0w����9=hexƓ�R�í]qF�C�^�F�����1>ֶ�|���tڐtM�^���F�9U@b)Ўb��
��(�v*��5�Y�.�&��������q��B�����W\��I[��D5.�5�����o�+���!]l,���.�\�S�W�Ā�~�����v�F�i?��ܾɣIm����/!nw4�L�&c4��׎6�Y�ц�Ƅ�s1H-�%�.Hl�K :�"{W�E�oq�at���!k���F�.W՜�^,l߯M�W�Lmc�wA���4(sc�oO�%G*�3A��䬯�5�tt
�-b��{|Z�����o�x��/���i�~S�x�a~�m��'O��#
�&o��W���G�C��T?:6�o6)a��-�@ʾ�0��=�`�w���>kŮ�:�ɓUqe�:?��ۼF*���C$T���?�c���Z
��e=k�����;
\�Ң���m��B�@ג���
Ք# �k����!#[
jʳ�qSg��w�w�{��w̪�;�<�JF�(K�_�2�
�q�C���]��e!��ݣ(�/Czp���>]���uw*����ҲŽ��S�8�G�����a^�����ZmѠN���m
�aU1�1~K���W�E":R���+��z�V�V>��R0�̿��V���-����6�HMU��[k�����>���1��>_�G8�2F�F�
o9N�O��ۑ���T��mJ��í>��8��F���sG�O[����:CFKy��ð��|c���L�EXײ2F��;
�
���1��Ⱦ�����x�T�#���l7u{��L�17Q|jW�Ȍ]ePU����ٷ�#���+��,���,J�{t	����V�X�ၛ�k�RÿJ����67Y����`��(Cq�5�<�k�p�u��y��,%k�eό
K4V@!���9��r�A}�Ȝ���L���
QmDͩC���쥠G0�)ip����<�#���G����8�c�m��4��l?^>��V���S�n���9��sew��#i��򞂽`��K�AA�R��<�-�*Yp���
u!�Z~�l��a0X,d:��kL�m��8G�Lx35Lz���L&���1ˮ%��@tL���u�����f�����~l	GA�}�+ȑx(���&��-�q)�v�b>��c��ܟ)�p�A��+�*�Q�U�~#>9�oͨ�=v+:���k�[������~�����*B�����[�=�O���x�q���j��D]�1�NX��5�ƺw�,�ǫ�c��[��G��k���^(
2��LXu�p���|"~�@�n�<��h����C�����^??����zKGdf;����W&L�K��#�C��s@ �"+�e���L �oո`ty��:���4���ՓZ�p:��{=d���l�&8�ю;�Ed��6�m`�1J��&�Y�����V�%����(�aH�u�;��$jϛ��#�!:��JO����j��r��@S�1�1XT�qӾ�Ɵ0�R�T΀��x���9vb־7q�7��)tJ�l=���g�e8�ί�_7b��bf^}/�7_+4��>�g�������<�$����,���X�zz	���	V�H_��UJ�2��Rӊ]�jV���ĨE����h��΄��*i��{X���u_�b�����UN�(�+((��$챣׉?�O�URm���5���A��i-�K�Z78(�9d���(gL�勴͛&e��6Ii�4oUw4�K����SҾϟV��S�K��^�vӊJv%����|�B�o�W|�
�V~g7Z����g\�x7�)�d
�?�V�4��n��t�Ǽ�����(RFq��O�X�B�4�(�1(v:�R����-A|7�����J�j��:�͹K^��g?�F�����%�d!N�O��I�֗(��>�sφ��5���E
��^?כV�I�mE�ݐ��9�=��#��dן%�oS����+kq���DW)R�%���������}�G1M~o��`À5��ҮZYWX�L�H��hh����"B9g5VX4Z��_�f~闵#���;z<XTx�����۬�5�z���Zd���B̨���wFrP��R1~}		@�I��Q����;�^ȣ�G†$�l=��Ќ����5A��b)6{'2�I�(�;�&�e�����I��Q��躥�Ƹ�²����,���%�jj�롊�}z�^l��Ч�Z��|�z��j��#~3�?!��>�F�ULZ�r��W1�=�?���T�\q�G�3�_iY=�<?�_��E�>�d�n�]����b�k���t�t��m�L�o��}��GV�8дH��O�1����_&���}Z��d��#�1��֮LW��]��/1��25�l��=��� V~-�N��l��U��o\�7ZW����S�fW���v5�E�]>��`f��v�i1K��KYڮt�Va��ǹ]{�͟ǎ���p�j��	<�k��%/�����7�ʺ_V$nڛ<�ODM��%"F�L�R�t�XF�Qn	��bqRϳ��u����}��j�ϵ�XS����K�t��"���x�pW��Q7��?��8p-�}�"S�wfBX�{��wɽ��B�!���D�P:�b=���;?��B�)B����՟x��יѧ��~�I�VMb��0�����6a�
��G�;Y�/�ƿ�6�f?C�Aw+�I�yh!.	���7�jC"�̆���X��zQ�=B�5���5��GY+f@Q];.st�PK/WUW��Հ�D* pip/_vendor/distlib/resources.py�Z{�۸�ߟ��q�|�����0�m/iRH�C6)��B[�ͬ,	�����{g��zx�w5��-�g��Ԙ]|{��E*����ş��h<��Ey��vW���}wy����������/����\�\����w��t�wE�n�M}�+�^�<嵄g�ET��|y]�ա.�׶b/�e��޾y���ͫ�~��S��޼���|t�MU�Y�l��I��,��K0E$��E�35���Tb]�_��߲b����B�o��P��TG7RK�~|���6�*�V�HUgr��a-J4��LK���H��*JQ��ۊ:��Ɋ+1c/�h�:�׮��1н�gQ��|�OG�qջ">c���a]�w"g��H�.�J�B�j-h�����Gȗ�
xV�N�H�l3c��5�5$��z̤��=�'�a��S�����2u�A8|?̙.d�^�_Ɓ(��V&.y���2�BGE��M*c��M�S'H��Q`3�m�ؙ�����R%��0.��g�����3�����+A�l�϶��I�����K^����@=�E��f+�>�!��Q%͈�X��)�H&�F-���<9�U��٨kJ�ǽV�u`��;�I���َW)�x^eb�����T4S�aXŖs�O��7�Rvv•?�8R�`Z��u�q �ԙN��,+��:@ b-g��X��&he�)"g��QZDN�!�A0�w#"SCtAʠ�c]V諞)��$�U�MMp�`����3O"=QH
6�E�H�B�a����[�Q��'��*;sW�ιkh�@�M>9y�%|+��QW֘�W�u(HV�\+����Z����ȹ����ȍ�36�_M��+��Ί�ML3;�c���|Z\���
Z��@{n:�g����7=^�_�A:��3s�`��|��i�J@h*X�8������[�^EV����#z@�d�,���a�E��Yv4���WGvP�=��s��U���8�+�k��34U	��y��`��+D;\��׀JD3/�I�
�nr%��"�1*���i%N� ���/n�q	��3�;0.1	��<[�������Aa��7����j�(�&���[�U�{9�q!���۬X�Lg�_>]��VO��B��I]�mgzLAJ��rv{��HU�8ShC�v6�Ҭ����A�m��}Gy�daY��eiL�!�����M�WM�L|E\f��}U����h���_�neY��⡆�
�i^�&qy\O� �߂���Ea�9G��6[�v_���Si�S�����Y�u���&���D�%	�L(>�l!l��{�PB��	��Fy�~9��I�H6a`��
��n�� �C���I��j�&���x9��
1�l8p���W����.`��	�$�<�PB�$J��He�b�1�i?�k9jW���ֲ��9kͥ]��W�?LN 7M�Ӕ��$bUBJ���iH����YX����o��S�?XW�����;k�
jk-v��0�f�7�<U�BƠrmXg!����%55Io�xu;��XyH�]�.(iEu���>�@����,��Y��h�I5��~j%-�m
J���b�i����������>iԚ�5ғ��x�&n	;\�T�wYV܋4�tB�f�6�w�Xy�mP�$:���
�<�=�"�ۅ�=�^G��n���+3�Wܸ�b7�.ó��@�`�0�P`�B7�뽀R�F���W����Z�p�u�LNT��@c�.����aK�Fa��	��MN�
�eQF���Q
h2��3�)��ѿa�z�B۳�x�� bٜ]�.���}�Q4�0~`_����!���6 	Z��n�Jwl�����a�� ��a�n ���Z`�iD���7WG�q�l!���H�-..y�U���U��=�ґkG�α�at|���\jj���!p5gX@�kv�~��[d(�c�?YZ�Oj�h �3²����x͝㣆Xa��6������~�AcOC��$r2m�:
!p��&��$�Y��q_�ڨA��ؽ]�>�y�4
���_��C�uz�a�Z���$��7ucGz��d��ѴWK��)(wS��GS��ӭQ��D�C�N��xz5���]A����$~UUEOQqb�4�
Z�hȥ��T��hB+�6ܝ��7��h�fA��c�n�{_T�O�{S��C0��+F�T���
���6�3�'�S���(O��31�,�����:,�ϓn�w�37�r���X.�/���8�S]g�u;�K�1h���ҵ���R
4֓�/$���vʕ�_��n� 8n��..�2�WcW�S(���@�dƮ����a��#�ߋ��5��DxC!ѝW�%n���7,�S�SßZ���u�}A�h<ɳ���~~&b<؊�=|�tF�
D��̼G��F��1�k�Ȟ�?̠�W�W�'Z@&W��݇��x��:�3�7�����.#��φ��mg-�A|c���[��K���usM�ˋ\�f�K��"���?<�TG��*���$���nj�X�e�6YT�`���8)̮��,$5:�i����I1��Kw��y�X��'?�b�4S�۸�΂"ڻ����&��p�0�3}������{�o/�쩭{�"��6�9����@�k0�0��L�������Q����ML<��:э��~�;��U���9�w�������R4���	�9[z#XJ7��ͪ�L��10i��U7~�zeÛ���0?�)�r��3}��7�^�
묩&���?�4>��%��Ez�zC-�������Q�!K������N��'f2b{}nnBܕ�yϏF�-t�J�%�-�U�{$?���2���G����U�b�G�w���d��jK�z�t���f����!woH��.2�݂�uk8�7t�Ks0>i��I,z����o��5��0�PK/WUW��tԎ�Fpip/_vendor/distlib/scripts.py�<�r�F���cjUb��$�U���6U�,�,9�=���!9`��(���Q���ޓܛ\w��@J�N� 0�������~7da2��r1�	��z�u�n3�\I���g�/����7[v|���E��ϙL�\qv���$f��Bn��������nx�X/���2�_ˌ�5�%º朝O^�/�Ǿ��,�����ͻɫ�7���!��-�d�D��:M2�^m%�'�=�3J�K�O�3�˻��w�̊PV���)�\��*҅�x�ƿ�t/��z��:
$���b9`s.y(�<VD��3���e<O�,�y9u!�(�m!ET�pq�eʳ�4`K@��
���v�T����X
z�}�)<,d0���F�\$�z�D<�����!��/��p><�g�tk>�¨�������Ӌ���&8�����u��X<���������l�S�
��$���_^�~�gі��8��,>��_�p-�,�A��@� _�w�}�b���\�e�U�&s���[���4K��y��f�J �����ӏ�w9��p+�)�nD��y��e�?���ؒ�i�P�t��pɌ���r���)�%��#���vS��{�
;��L܁@,yn=�s~�#�ߣ~�O��g}V���=�/�(�%����G��G������/��>��H]��	o�X�z/rQ�~ �"�A'E��F�<�! ɠ	Ȣ������|r1���Le���rgο<�K	�族φ�?�~d��g�;�?9^������f�����;�Z������d^Dܫ4��U7�X�+Ձ�@���uJ4uNH��d˻��>�]����w��@,��O�����B"�Н�9ǫ��{!�CwQġ����C-��|z��"���j�����D��W'�y8%��,�g�p*R�]��a��;\�Θ���yv4�a������4��7_�y}��A�9B�[9?L���6�k�6^�"d2Gh�c��x'���gfP�g�M�.t��=k^Mgs2z�8��3�~syB�\�9�Z"�2��\�e>i"�+����U�4!�`)MiB��W�S�$���dA����(q��,�q(<�ʈ`��)���9�'�Ioږl�C�a�F`��5��[��MfL��W�r��@JB�c f<aW�3�z匫g8
�W��<�XhS���
j�T�5�TD�a�z��/p�Z����2W�P��S9��9����b�����>�ϧQ�h��n��wx�y��fE<:C�?`�$��7����e���=�^�?�Ab0�m�HB�~F�lF��M��Th�rQ'�7璁��l&��1����|���iЈ�I�ĢO�\�;r�z�%���j�`�M�62wA&��\�.��w�k�*��8}h�a�����D>�%L3�K���k �޳����_EW �ٌ�i���F9	"ɳ8�ݖq3:MRR2C<�����β@(�
��4�z��f�r��������cP�X�Cfmڻl+^4tC��r�QQrJ�#�=�R�r�/��]�r=�à��"%�ݲ��o�&��@0,Q�"p��V���@ڒ�1H4Юk�q��!׆Ϛ�bF��>xB���w9H`�ވ\���d
z�E�lr������#y=x�4����q�a*5����2!��<��"R�-��s�"ik�FH.�1q?U��>5�Z.��q�֝C�:`K�[������12�9����\��=Jx��o��0
]��rA/���M P=�2 Q&���M���AK9{�׈7*�EvD%���y��=�����c��5�!+7I��
2�d��b���[;������
ͧ��w�=p�&h_j�ԗW�N� ���DeW��@�Bu���-�=���Y�pUʄL�z��O��*�� >�D-�6��T��8�B���26�d"P�ґ��oR��t�k?[�Єh��!����q�K钒�=)�����We�0����Y�-���Y��H��2�/�驈�B���c]
t:9a+)ӓ���f�xXDkΏ��yʃ�г'E~�7qt�x)Wҏ�r��Z��䫀��O�呾�X�	�#�GR�G� \u�zI�ğT��
����{ qO&q�N�s��ȁ�|�����\>/�ȶz���4���)=1E�h�<��
� Sq�Y��֢??oؑ�vN=~�/�	�3L�Ps��{D��6��yԁ�g�rH
���%ʋ����騟�v~͜O����,���c�S�wWsX��uY�O���_�{�a)��imdՈF8�0�U��Xx4ÈZǎͤG'�M-(]mWф���]cd��P§0�����P*~m@��~@�U��,st"_�}�*�T��mV0L�좯��pu��} �lA���1�(�u�x����ұ��6u;�:�c3"y�'n��{�W��7�wۨ0W���A�6~w=��x�{�Ph�P,ʝ�}�C!�p�Iv캇0M��dNn�lPVص`(Ī�2���1H�m�i�|=�;���=���s·�wnە��V��I�v`ӝ_�ɊQI��gDXB���D��חoߎ/n�o��cR'�b��0:�hX���g�^~	U/Px�l�� <�q4���O0G) ����,�����>;�`��r��*�Q�<��hK�BD��\H�2<�8<v$�v�x����d��Q1"�����bn@��ӛ�{}z5�9=g�㛛�;v���+v
D}��x�籧�nE2�+����»~{zބ��g�ޜy��r�о�:�����϶��>9�s���
�ah�=�)!U��\̑H�"4��@^Hc���b�MA����BP�LT�g����1ʀ��Y������Db�P���'l���^-r
(`[ �!�D��l�ν�*�f�\�s�@ب�6�>Ձ�����p���8��dI��4<�=�Ё�r�!+�*��›�s[au	U�s�N�hb�єE�jxE��<„Yq"Ɲ�F���F�N�w���GK�Y�Z� ��,ei>�Q5H��I|�!��q�=�'�\�_�$�1����4\�(p0�R�
#9g&�M&��8�:X�:�D�^��<t��Z-���[����%�����oh���s���-�
5��9&���+k�v�Qܨ�zms���̤Mdb�e��\*l�ی��Jcc�j!�$�m�����~lFt�E�)�4�Ͽ�E�c�#Y�tO$v���M��S:�U1�C�	ayw/���h���t:j��{�>��L_�;2��h�@t�D ������o�
,•]0`[=95i�2�Ⱥ�H�5af�V�`���I�j�C�op
��kRd1`s5�gر��%��(hutXZ�x�q�S�D;��T�J���[�L[+XUY��N+��Jh2�n�5��*AY/�1��Tnjێ�X���-�Cב���:�@��`��
�Eٓ�گ)��q�;`ӯ�ۧ�)�J�p���;��:��|��x���f<_]���i��`���}(A�
O����\.��x���N8_��ntKYU�C>pmP�7������O
ds	��M�I�m�j���W�����R�=F��
Y�$�!�%�j"��`"I2	6���F��nNP��U6���Q��ks-2��_4��e�� 5;*2�^����s����Y��5�3Z ���ә�!3�g�.�R��H׻�:`��ס,��!W��ڈg�\`F���݇��(l]X;���`�T��s\J�V���`@9c�R�0$+�^�2w������Z��"���K�~t`�G�-L��v��
��vO�c�/ͺ9���Sd%Y�:a2NeZ�`��8f�Ԁ�4&�;G>N��J���!Ys�%|%�(�K�3��G�T�T?�Uˠ��q��S��t�ڳe?t���$��B�!����P3����T��[���k�7�LO;�(^Xnqі�?FZKڗ�`����u�B�܏z�ύ��2���� ����龯)D��o!����k�+PF m�4��Ȭ�֡�T�Ϭ��i�fN��
���0DS���m�
�߿u�Z��U��|lfՅc�ǟ��g�8�tG�a�5;N!��V��L�'�`4eu�)�nM�=(��ϭ�ߴ�\�st�&�B*|��_�3�j��C[=ت��4�K*P�X`A2�}���F��J�
�r�.hlTC�>�f%��ll�ﰽe:iv�\c�ʟ[��!���lek��u0�RP)�щ[�m�m��'HaCm���-He�^�[����1��r���o�*��$�X�0gn�e2�D̫r!�a���G%�tx�:�/Xߝ��0�+2N�T�l;�%�E��a @�
w �� ��T��@}h��*�*aەf��:��+9٬]����*@T<Н�m;C��h���̧T3��w��e�p�z���f����7H[֩ܪ@��u�K�d�u �Ha}���S�F�j+�9��O�UL:���a�K��zX��6��_fI�����[
b����$C�`�J�ME$DaYS����@�і9-�]�4
hgi���TA���ΰ�a�:���N�[���m|c��
ҖQ�.�u�����ӝmU���j�G�H��p�ջ�%�'Z^f��Sv&��c��p�����v�
R��z��TwIW�Zs������hH�*�Ԅm�0��5?�i�bѰ�#��oF���~��q]	������7���U�L���3!gEx�%u����~����V��Q���*[+�܊x��pO���a���
a��d��p��!��b4}{T�����\�~��]�OuW��A�v/��mW��oD��aMZ�96��@Y�.&����0h.h�t�#�j�X�cmt��,O�Bb+Gx,9S��=
 ����[��x���&�N
Ě:���lZ.0������X
�˄��B�������m��||�vz$4�%����ڀ�����s�^�0WM5
c3q��)��u�ͳY@�+(����iRO���E"d�W�H����0�-��[ǝy��y��_VMF��	��k�j��ר�t3��H�GV�J�EY�
�������2���o>=��Di�;�=U;@�A�[�YF�B��D*S}vJ��p��SI�}��6��P�m���D�D?�]`	�TR�R�p�M"������9�X�"�����p-4��p
�e�qJ��JUmѨs�=��bVav�_Z����r���uI�F�ڱ��c�FIN��O�)��=2��z�W�r��]�'�^i|�4�̖�aQ��sG@�井�O��i��jN�?PK/WUW
�]�G�pip/_vendor/distlib/util.py�}�_�6���.\{��i{�m{�
O����=�mͮ^{c{!����|�,���s�g?mص��h4͌F����`���U��UD;������/6_<����ஹ*�਼hn�*
�)�4i�����Q�o�vv�����&H�i����p�����!�[�f�j�I9M'��EU��{��T�z�~X�m٢I?6yv���7\�2/�U��~$uP7�1�PųR}�W]�{^^^fť�Y���n<)g�,�T�[]N��f���V���u��~���&أ'�UUV[A�̫�r�lE	�I+��Q�,Z���yUN�Z�Q��MR]�4�ln����V�|��WsU��{��� ,f�����m��Y��c�z_g5�.��*���I�
EuS�qs7O�!u����j�d�0���qV��08��{�CB��$��t����rQMȢ��yZЗ�|�j�9`5>��j>��~h5k��������O�t�,.��E�4%<�I�Xm�M,(�$Y��'Tu�T5�z��a�O6��r\�0%`Z�Ze�]#(��d�N^�/��
=���"���1�Z��y*���`mOlu v�W�_@ٕ��w��}��{��4��U�?�����x����~V��=<��7����gm����ۇ��n῎���K��ˋ���~=��'g#��v���Co-�6�5��5k���esZ?�
���Ű�N���;oa���w�ӣ��]�Ptz�:w�ݷ����}�)vrZ#1~�-<}������W��������?�k��_�<=9=C2���izA��gIu
��<m<�WWW�����\�Dp�6���Wӌ$lRݑ<��"�J�q^��!aN Q�un�<W���V��0Xͯ�Uji��oe��Xo�j�I� x
�k	.�dM�R�[���\J�P; �8 }��<e	+B�(�0e�*���0J8�>�	��I�,9�S�J��B,k�?�آ3��T�`>1e8���
H,dYʝ���g�$��gI3�2��r4�e	��"o��,���ż�'�gN�C�(�OfqZL��V[6�<Ir�J2`��;��G�ZQ�(`0a�z���HT�h��`>Xh8���4\
�:bЃFV�68k+xR����CC������t�'�4�0�p��=߲Q����P����
�{-�yDs��jQ\����dv�DMځ�2)�F��n;�9����F܅P���~��|�|S~x=�dܶ�ꃓ���������p�2N���ddz��=^�X��1��N�~� ��a��LD�w��R�BS�����w6��Y�@���9�;����u6��j��yI*	�-V�ް���
_��^�kr��6��Q��C���1pŖ��'���a�� ),Wi����^"�a��u�Y�'�p�j��)�|���U9_����?Ũ��)!�����<��`�'�V����?��������}c�L]~�@� ���|����;l������Ig B�Qx�X�m¹�~��y8����z����G��e���,��6�e�T��
�}�1x*ˬ�kV��"`�1X�bi[|���D
�:_�1��4T�(�hx���C�-�*��Cl�aW�F�N����-(�Q��&d"��̄.�x4j����4Ӭn��O�>��ҏM���]4��MZ����*S�/A��E��XQ3��"�v�3`�疱�
6`�K0a�d�7;3��G�,x��eE��3Gd�]Q��������Y���>s{�d���b�Q#x�aP�V���a�Ӥ����8��.1���D���}��W;����Z�5!
���{�W���D��Ud�)
�ݣ����W���줌���� z�� zQ������('�0���B�OZ7.A�����b�ƴq>/q����C�����X��i]�.�$�M�j^w��opM�*�.X���r�O�x�T9�kr����%j�zr�	���������AC��⨆�C�{�t��`���2m�JtG�e�S��G���G��9,+����T��n�,�9��.�w�]��9�ҦC“�c���q��g�/v?:u��JO|��u�yj�tm���?�=>�<��1�Cm�^b�������r����#TS���foC$��Eh������T��`@,�p�,x��o?��U��G%ȡy2�N.a^%7�[�җ��ǥwrܒ$�P,��2����`�_<�Z�$�g�;��~^3�F��#ع��i�I&�T��ݸ-�}�+�;f�i�ֺ��=�+ӧ�l�@ѣ�������D�o��(5_}ւm2Hq
Kr0�ԺG���:5$/o��z[,f�b��В�<��ƫ;��m޻�,�f���{$��t�,�R�Fy���M��Ty��3Hgf�E?-ߌ]~�@^�+лDy 	�����=�<lr����-��0҆�������<ºAA�׍ޏ��7Y2
`�ڭ`�$k��h�N��Z��sb�x�q�4>������
I�|,�/�x�އOj����]o�sҾ�� ����V�z#+�v~Ej��dw���#=���Ȅ�F���9䣪V�=U�:�x
���wU��_�%�:����!��(ҵu�+U�گ���H>�'
���Z;��f��?���1E@�6O���u
�$�HsՎ�D�?z��c,C�
c3g��K����m�Ķ̉B��N���4!�B
�l����"�Γ���!�C�!ҷd�W)���
_b<w�T�O��1>E��1$g��b��4��+�l!� ��,��,���Sdj��錂�]��L5�]:�]ޤ�R4�i+Mp+1:8����x^�#�!�ڨ���b�T}�؈P��Ѹ2�뾞�X�:#�.�<Ch��ԔQ&YJCq�������Q}G�ip��Bk��dU�H`~���v��84�=�w��O7_�Ճ�c���
t��
��Q��ɐ���t�h0���F�W��?��}�����w;�w�cXm�IJ�ڜ5���6� �"M��Ij1�J
4�0�����<ȓE1���Y��6GB!�qۺv��(��YV����Gx��@�˓�\��&�mV�$Q�Ѓ�u����gUYA�!0ޟx[:�J<��v���=8�	�7%�/�ZL��b'jӢ})�4\5k�F�
).�c!t�(h�?�v���u|��I$�T䨔��6�0N� ��ټ*��R�RP̘_�P��p�@}�%M�s���O�C�l)�͍�Юk�bi�v�/����'OH�ބ��T9�5'����w&L�t��IY��xZ��6�I9�.[�2�!!�kҌ�����]�+[yg��fܴ��9�?1E0G��?
$������!s/Q�O鋏ð7��`	�Fx�ɬ�
2��%*�_����j�)������-�	��y�VSTћ��/jX��1,�
�ɄbE��h��0�N@
�<�\�l���dr�����'�푥V�ME5**=¢�N����_�ؼ��58T�$������I8�M�XȉO�WK�"tHJH�nt5$q֤�:r�"b�����*���W1EF�����f����sQrEe�i�{}Y���5�wu`CX��}�`���d��hslZ[����G��0�V�V��>�
�ӄ�&�X��rW}��s]v�[��b>o@�J�Y,���$���x��q��4o�0�K/��K
)*����Ġk`hF�m]��X��}�
�U�	���*ɤ�_P@�нI�E*��ߡޠ��X�nTu\��q����(G�����p" 2�\���N�`���RS�=�An	(F�+�@���zn
�Jc5�N��j5w�d
l�]�檌L��\�����=�M@��䒬��c����n3k�V;���ȓK����I}F�k�wdTu��h�5(�s��.��mE���ړy�|�%E�q"S�f�"h3%��G�������]��S(�܀�Hr�-����F�tp/�+�b*hLn�����w�Rձ��c���������\	�1�eYL���W
A�p#)�H���{�u���~P/z�>ثI����MQ���\������̱wc�&Y3G(�@��ӘP�0�gh���v>�gZ��h>��5���xVN��5-'�ՒYqj��q�-�gd�:�x�"\����6��q��?�E[b��Q�_$T;L�x<��}jY�:����x4k<>�V����&!��5�ւ�}G��}�^X	�՛�w�(F��t:춬H�F�zqnRv���0эSe컫��%V@�`+�>ޔ0&t>�#2tT�N�=x�2�)Ax����� xG^�@my!�&i��ˀ�̃zRe��H�{ԋ9���`��us�N9č��y%b�>�G�r��<u�U���N�[(���9AoT~�>\:S�
�C�u��{�̐Bx�1Z�ꫀ�S��1"r����A��)L~��J�����\]���8�G�dֻb��g�V�U@�Fg��d�J\�B��vP�8��|Ѥ���i��_����5"
T�`/���u��Ũ�Ov{��_T���U:���K���u�����u�?���T��Vu�H�Vw�jQ��I@'qe��DC��ٯ�:]T�dKcX�YYV����s,�6ʯ(��,8Aƨy�i�o(U�'��4f����lj"dpv�P%nqq̂"�QF�V�
)���:��D��L���e�1����T���=�C٤j*�b`�s	���l`����Ё>�wN��#�Tȭ�tа�*�B&=�\�`a��fյ�b�&v�	�~���r��j
���ڏY�2ٚe��%b$�Ф�ػ���H�*���	��O�X��e�Ҡd9jN����W=Y����怚<������oǪ`�fJ�Vi�*|R��	�Q�=�4HNZ˥�N���b�M	E<�O�Q��4
>��P_�ԯ�~�N�I9�O	M0?i��M�BV��gf'����`<MC����:�,d>Xt'���q�#C��QgW���(�#A� 'Y��H�BD�|Bv1,'�;�6��__���Y��N]���<+�5�=�3����Ͱ��R�S�;ܡ� �ܓ�4���U�*�\�IEه��֞0��ʎ������kg�RH�BB�w����\>t9��ŭ�X�L��3����x�l�gz��+>��l�����F��aZ�HS%�=w���)1!���4V_lЖ����=E=\o.~:�s͎�������n�R�zHnXW}Z���<n4���I��Z���VM��8���xхs!N%Ǐ�'��p1�hg�K��\�ui�֊�R�F��Z�3B5u��gu���CV)�A�1:��>��E��%7	��t�vȎ�ԍ�Q�[�����C���ϧ���������R�/c/��w�g!�1e�*�#��@��!�'�*��Qa�XsD�#��U|�+�a����†da�8
�?ȅ<}�:ҥ�Xmq��<��Oa��[���;��W���f�9|������5R$�����)(��J�b�m�
�?��j��c��6l w��2jj���(T�Y�
�&�i[�~�������5�4��A����@z��N��)A��e?�l[YU?د/qWI�~T������A>���7iE)-���L�SGk��a�{�ְ1m�b������'�4K.�����^��3i�]-iLGQ�E;�[�x|}ƌ��(=��8y߸M&��d�(�ā+�͞�&p�!!zy[ȱn��zw�ݯǯ��^[-��7����7�>���5��)�待�a3�G���c�b�륹_tYV��,���i4M��Qx�H����θ�$M;�zS�ܿV�{Z���J.)�"c;���TAW�v='z:fiQ�5��}�,�Jd.>t�8>~����e��z�X��{F�v<Z�蹓q�!�N\a�Xً�*�N�݃�32�`S)��w]�u#�8���',��K�f��H>-�cnEP(z�Ǭq�զi�J�w4+����P�g:�έ�R��`�� v�b؝ŶPv���*���\
�;i�逧��.�~��᲋���D�rXC�\��h���4�7 };T�P�J�t�ĩ>��X�c&^�攨R��I9AҨR��&����*���lT��q�0��P5�n�M�K�<&t�qC@��Q���Tp�%�F�Uk��=�ڦ��
4Bo<�Y7�˩�0d</�,g�+�iP�r�ġ�e|"��2-��cC����-A�lzdPH���:1jI�k��
�1�:�M<���N�s�f�,��T�I�ڠ��A���hC���O6
�r�\N�6�uਰ�?֜w%w)xk����۔�R�O�h)9�IMT��5�B�Xr��Do��������R�oN��F��&\�����@gh6oŝT鼒��sq�ÿ
$Lq��/9�K�gh��ޒ���� ��}��
��ȃ�"aD�S�����&�z�Uu������@����$�������UK~�SK�JU"�]�,��1��c</�C��	L��wLJ�v�O�a��_��_F���������R��OG�?V��B�#V{6�N�N�3��tI���DjSo�<9�]?{���W��7�	����x�:�{��?��G�̐Z�RNȶ�}E���ς[唘us�)����|�`A7Gx�}���\����MQ�b�
F�x�dO�i{c��N��􄒾��h��Bq��rR�|^�֔I�(`M�
-�*3r33��[�mRw�t�Q�o������xi��JkRE� @T�jP�4/|���C��L�i#�Qwtu����_�}z!�0�u���D,S�z�'�Ȟӑ<�en�*�K�qwD"`�t3���Hg:�O���=��i�B�A�t��Og:�$��N�L�M�&$���Ԫ��˷q8]�a,��r�8� 
J�b������`�B�7�;�o���>�F��J�χ��D%�⃂�r�u��q�#�h��ݦ�M���;�2o)��gҙ$����ޏ\��h��D:
���PVa\����-�K�(�8�X4
���=8(Ozp� *�Zԍ3��@~�I-j���]�sP�(���J9`��ގ��?����O��;�ZN�x�*�c��ch;�O�z���LG��$U���W��q�4�P���'�]MNrV��}��!\aX��AH�ݐB҄. �{*������I�F*+K�2R2F�%�Q�ތ_�}�r���֢�
X�祬���K��b�Gq_�&��¯5�H4�BG�)��6�Ӿ6�;��#�\��@�	w:�O�Pv��jf��   XΙ(��Ny���V��!�搞C$^r���B|Q0ءȊ%}�ڊ�D��ո)eu�
�������K83+`@)C���`��3^b9��%0���`��dk\�-A�)�	���~R"iZa0>0��w��%\__�x8�P��p���v���#����YĄu��9ݞ�.З��д�mLF�}��_b+�S���:�+\����,8��~����gP�Y�pV�y���#� 6�=1���k���k�9���Jme���A���GV�Os��c�[��6�Ά#͵O�hC��"�%�D��['52�K���dMLl?JW�Se�&�\�U�u�ж�`�Qݜ�p�GF�?7�_�9UK=�Ƹ�����ʽk�F���j�r�/6�/�~�$߂���i��COH�S�w�XI�Qd q��6,��lT7��p�������,�i�K��uN�:<8��ݝ�����w_�%G����d���?�ϞE'����OO��M=���}b�=�����;?U�>��N���W�ӯ�˵�?��P��P�t����g'�r�u����B5N1l�K�� *�@�O�X@��$M�6Ѽ��&ۨ�ډ�
Z�I�A�8DW�M@�P�5�D4�(�e�=D��1pP_O�f����]Xt&m�0t����e���hQ73�qV�㴞$�S�
O��a`��������7mw���I� e�T�Z���щ�=�Gz�d��`���ˁ��3sA!�T���N�d
�Қa՗lSR@��:
V�o���;e����*)c�%��'����/p�,�q�ĵxy���z�
�J��]T6�h�����)��.��0%��.���'m4�9�Tn��y�
>K��^�I]������RjO΂����$�B$/�2��Ǜ��)r�4%%��5%J�nSZd����{�½<_�����jZ]
u>�OC��c�~��R��OQ�tTҝ!������Ԃx��"�i�3�;�2"9Ka{�K����o�'����H���Q5��!gE��&���r���}��mI��UD��dc�{/��p���
���@�ݐ�E�V,���ܨ�J�z/Z�F�7�I�GP�'yR�B(���ݖ�2�
�(��W���W>�mR��x?�..����P�<7M�_�(�{Qi�K��|��E��l,Q������
ft��rE`�/>.@BU)�v��5S4�M*	����Y|�}�!!3�4����srQ7 �T��k�܎���I���(S�H��\ھ�`��f,��&0�E�~Z��w@wq6�'x���
̕����Ê���nƼNjB��d�,c:�,K$�
8�&��KJZ�Xү�zv�6ɓ�U;�,�i�EqV2-�q�0�#$J[��
�W��)��4>H�'�	�y�^��t򟏡8��6�zkc��0]��TG`c~7�6D��6�,��h���z��B1��J��I��9�/�Z��~�W����=��ϊ#�97~���׽����O�{:�B��="d����0vнaG`���f�|��_d�pR�4e��ɡԦ0��̪�8�W$�A	�J1��Pk�"��|Y�2�()u��w�Mԡ>����x?]Bw0o!����^�i.�[U���n�	�G��A�$?^Vʼ6��� X��7mZJ(ӹl'�'n�v���<�Ǎ�<0���0KCR�c:��<�U�ӡ7���ѹ���nz���κ��G̫����)�F�{@�L�I����>+t�goܴ�v�'�uk����WeL�9ve��K��H���$��u��u�44���R���;��9[�^�
(��u�	n�.	���]�=~ٍ�j�Gd2����
u�Ïu�������B��0�!��i�"#l�j#�0k���#ЯGLS���t0_�ø\mԋsLds��o��rK�qtc]���-���<	��n�ū�9���oO��u]��v�+D�a�Fa�l�+�������k�n��
�ʆٰ�@���ڂ��i����p�ɉp��#�V�����}
�<��m
�U�	�4PE��i�`�:e�~���P^WԜ����2ݹ�@���k�	�:=�?���6�&�^�^4V]ͳ"zض�S9����*i��N���]i`�&@��)�X-�*��%9�4�������0���if7��=�#��'Ù7�lKWZ�R�!.���=�RX2����99��W6c��K'�k�8��<g573��8.cJM��+�O.����T�Iǭ2�ی��=�|Y89�0A����6�~_+=��C*����N��ry��V�x�TOW�z��jC�vo���ݳ2�4��'�\ �뜟U�/��N:A۷"<C�9�z���>��-��{�1���+�1���)���~#��xaٚ(HG�z_v������9���d�}Q��R+_4=�c��R����T&���3`vC~ȢMЮ]n}�2�˴�'�m�j�f��m4("�����лǷ�XNo1I,2N(=4W㳉��چL|d.�̰5���٠,�;ͪd��4�d�?�~�7�in����C����6	��Q�T{&f�UuD2���o��_#,3�)0���7;dԒ��Z�H���hT;RY�ms(��=j���òF�2����;�s����U���EB��u��+�fKwd�mlD��}��rw^��Z3A�ǰg�PX�P���9W��k7*�ǭ���B1`=��)���H���'�PZ'�d�9���u���.��B��\i��є��~R��d�XL;l�|8bi0�|`ϵ�Z*����1ƅ��丩pG����yeqKJ�ex�O]ҵV>-�]�HO}���$+v3+�8�)��D4~Ou�
a��Ina�8ż�������U!�>1t�t��,����S6l�\���J�P?���#�h�dZE����g(∥�����c��x���,.�@�B]���Zk����ݼͮ�y:͒��.7���qR�+)������T~���U<�l*+Xc����b�~�)$ڪ3�ج�mM���E�����9����*�_�+E��%��9*�g�� �S�l������T_�5C��~�L��PԞ���Ƣ�{ը��J�/�g��#v���!
]���pA�ۧzɰ��?՞.�G��ڌ�#
&�IW�jW1r���^��-+NEJ��EW�JxC�.�d� �n2��S��P�ut�~)��YVD�á��ay�ܓ��&�l_��
�K�I�i�QV#�W�F6�.05�=�=Ճ�hg��g��q�;�.���(G��l;�"�t�2-(�N��������y�%�G�9RF}|����v F2Q���j�g]�j@�[[=���=�h���n�d��R)��;�̏��,�2{IvtB�����#�;��3��pZv2ô�I8�x�6�%t�Q�����悷����R30Y�����_H�7L�����n`i�N��Ž���y�f����g��Ɋ�"�~��Q����9�n�r���>�y����x����w*y�)�JǗ?��7�����;��}>,,�j��_hK��.�4���6~�1ŝۡ�&'���֚��i{����~>L�	����h��d��q��9���ݟ9vnn�´];?�P�M�|��>3���|��F�W�*�kn\c��xP�PAl
aԸ�B��9OÃ�
�F����O$<���{��!�jM�>�&���~���z%�F�j�|��t8_��yo��m��o^�[1[������^�F�o�c.��/���r�H���A�\������D�>t��|Y�H��#��C쮫�j;�ߣ��>RеU۾�h�K��v��!��=���zԎ�'2V�����y�~0�rjG�>������4�Hh�^	He�$���$�SW��)�$�k�H/�왙�3ܝℽf`��Ma���=L�Pq�s3y��%}��:�Hڬq�`�ZR��\aDأ ��t��'$h���{o�._B�-c�c�f��?{�7��lc%�R�����N�Ɲ�}`)Na����8xe�}QzP
�N��[��KN��i�����̉�����
mA)A�N%�ޮRz������I��cx��'����$��t����`O��E��a_ܖ=էJ�8�8��mu����Ι���*k<b�
�7z��S%��yR�����1눸~�����
��1���R��{\Ȣ������.�4�Q��&&���ߞonvw=���HP��'_�B�B�)cL�P��/d�!M.���wi��kz�i��"f�����?�����r��-翎���D��$��:ꭍ�܁�2#Y��D�auޛ��!@[�h:�¦�-ƦI1�(�Z�2��t§8��
S��qu�r:_��7��t�1|a�)瞼���s�JXm%Fn�}�;���5T�f�YO�=nC����P�*=m�/�!+��$��Wx�yq��
�8z��G_�૯�.;�@)h ���`���36M]�yO�O^N�'OPٽY��@���4��%Y��L�~�D��c����\�7}�9:Ҩ��櫯�迖<kD۶)��]y}}��[F�6�J���.H:�O^o=y���zsIV�.<;'�C���g+��2���&�N�+��V�8�h0�����&P�1�]�m{�f`�w/+����vh9LA����ߣ�5�J����6�^�e��?_������%�p�J<�$��rs�)+q��4����w��iڹ6�G�^Q�)�'k�ݣ<5EF�VҤ��9�_Q�mvDZ�`�
$�L�5)A���`b*����yy�=�y���z����G�O�N�����)�'�t[�pw��:}UN��qz:�������_�~��Y������ch�h�ح�ϓ�r���_O����SQd��;����5*�T||nzEU�9ݏ<}J��r�<�?/🗿�F�0oU��m���mA�� $�'�t��FO=Z}�t5�an4uD+�AtX��[�~n�Ҥ���q��tT���ST��k0��_�������v�p�(v�˩�lr5�[͒ƍ9��L����]3b<�(��r ^�vu�V5FZ˞”���ۊk�\gj�
�B�P��Z�!�A���׾ӝ �ӖUt��i��H���C��L{F��h��.v6iV%�l���e'��$���gIpn�
�a��v-�;�n�_�E%tk�,�xXP�]غ�|�sN<~X��S��brEx<�sv�<�uە>�翆�=�&�ny���}�af�(VVp}�%V�Ψ����?����G��=�^��ԩ�-}�>㫲&w�$�;0�9�*�'���t#\ޤ����I[�ޠ��ᴜ��W>�P��:yv;�
�L��$��ȫ��LG�v@E����Ը+�=����}�,�"�)y�USf�)C�/`�W��z�M{ֺ�\b�������H!�R��L+?8V*s:�@��-P.���V���L
����4� ܠm�
yZ|�X�D6�;8�HfA��GGov�A�?���w�ߌ�͋�|ՍTP��?���+�p\RN�9P�
���r���}�~��ڀ�|<�JԁQ]Oh~��v'�\��P�����s�n�����R����~�i��RI��$AGV�]�d�
��������&i;{�2
kABWiv����-��m������;��Ұ���I��|�^���_�q�}0i*l%Rs����T^�u�D�TX, �d����C�O��"!r�=���?��n+����;;�Z���]S̫�>f5pCK��t���#4]�2���SȖ��O;���3(���?���J$��$�xo�q6	Z���l���X�;�|>�}(tͪ�Àa�7?�����ޘb;�4�F�"'�[S�h�VC�H��8خ��1�F�j�yJ7�Si��vE>(Vܪ�Ph,<$uN����)M�U�K���,xP�)�jOu���4�sMI0�:�H]�
��H+!�AG��%�H"NGu)�7�<vnИ\�%f� ��z'eH�ܡ�ֳ��+��4S���[ޞ������.�'
�ۡ�˜��L���Jb�m.��H�,d`������N�!�j����`����t�w���b����˺���+�̈́��BS�
�8�>!�=�a釾��
BCV��1��#���w7��8\�$`�NxӖ�1�ҏ	�G֘4�mR����W�|�M��Y��Nv�	F������/)�:����DŚ�T���oߨ N�#���~0@�Ol��h��J�EC������?%f�D��FL���(,�H%�4�[����uM���+hJ�@&�R�:ʲ�E�O��S��$�1ӄ�R��0S�YC�n4h,��@+��چ�Ѯ��"e��Aff5m�de���'ȜKL�'0p�EuO��R���x@|�f��`GR���R�#��U�pO�q�W�	Z��Y��\ӥS���6�-F)&{+�M���;m���
MN��ƅi޶��U��_m�Y�W<��(�'��y,̀��	ҡC��ɦ��(�d�&�K�<��Fۗ��m��]Y��g�cB�F�2�[�r��1~�8�cm����~Ԙ�M�{G�}�MЙh}��2Ť˭	���=���i���odz��p��_�Zƿ�<?���Ι,�>�H�*�
~��o\�NO�d
�h��
x/O��f7դ�I�<O�8f��5�F��-��QH�L�5h��F�d������4킒š���|aOLbQ�#� ����I�R��u���4�C�҂J��qH7��Ӛ��KK5=��[�y4�P-�-[�Xt"Q��g�2x�#�,��5w��{{�1����Igo��O��hR�H�Bԫ�fE�/*�4^��h͑���.N�$�]�����pwg��k���:]-4�
�E�Q�����{_|,�˞���mB�P�Q*R<r��Ј��l�^��D�kU���.Sb=��4 p8��t 璤���JӀ*�B��F�hA��C�6����8�$ ���f�&�i�g3�/n��fC�J����Jh٦s�q�s7m@^Hi�1�W�[5��m]Om�F�~�FA��G3/)h�E8�C��eL�h7��7xJ4��Su�+�k̵;3�k5�9����,h�2`2>}�<����D��d0�M�/Gn�8��Z��F#=��ժ����\�#�t]vOH�.�
�gܼ	Ϝs	T�͉\�ȏȀ�TgW��u%l�p6)h��-(��263 /�N0�\�����S:�x��puޯ�/L��dt�s0�Ŧ{o{Ş�m��Ř?T����9��O�?o�1�Pj5��cΥ�[e��N��C���V�@���"�2J��$�&���E,�h�[\�hkz %XA�T���B�ݹJ2�F��yAJ�5�
�t5�[>v��O¬��r_ԋ� �	5�iw�{q��jm"��2�V���|��s��D��N#��&p��:�a+��J�l~)�A��͜t��І��F^�:�K3
ap��S ����_ބр�\\&Y���%B�(ߥs3����UKpia�\���"�~>$J�/2H�~O�=�=�p�s���D��զ���H�����<�X�;j�'���npS�Hy!~��Yh'f��F�>"�8�IKjO�[]��)J��z�ǁ���c��Y�{LxG��%���Ab� {M��N���'�\!���Jz�sr�Ƹ��,�>�,�f�aku��4
c
�@�nfc�*,h���2G}W��@)�s霽'��!��[���m~uuU]l��N�
շ66��M9)���!�{O��ȅ��M�/���F�LR�iIՠ��a�M6R�-�3.%�{��E/��iq.W�-I�M��8ܢ($۲TK9�a�̛�JP�Ux(}.��d�ts�9/��q��uVF������7��>�6�`̤yZJ%���,�	^��v���J�9��)S	�fdH�}֤�BAT6�����E�I�i�ס�����\�X7Ё�d�F�-R�-�LJ��דE��vH���������,礃}�<�;x����*�#wο��Ï�X=F�ԯ][�ͨs�/�+����ψ]&��%��I9�M�V
&�h�2> �A��I`ґ�r�`�5�٩�Y����^!_�o��
�'�j22�N�`;�0�Ŕ�!1I�<W��^���;Ç/���6ɬ��|�j9OT��|l�B<��jQ��
ǵ�~�l�eWtZtm������w��w��x�^�xb��\�#��y��6_*���q-JK7Mo6����7��ƚn|�N�V�4��n}�=�3�l���oU���H�DO��Z��JV^:QR�mt�a�X�he=�;��vʶv{� yH�i���h&U�B��*;_ ԾҬHry��pg�[�
x�Մ#|��hՉ�}����av�xSͯw��~�3�������N��
B�d����*�����X��[����YT��vc>���{�Iϵ��_������פ�+}���z����t�
^Y�u��,�`Զ�nv�������|����=��Yw�F�����28�dkU�'�u<Լ�AGR����&��J4�/*�>�y��R�Dy�bB�fm�Ct�@�u)�Y�
'�Uݜə�8��sְu��ԗޡ��"&G	�I��F]r~=C�u�j(m0�E��*����y�|�|��z]�5���}��V|�;%���=i뜄�����f���8���g-�$�2�ދ��O��(
�Y�⣻3y�����.@�����cW�����d�
_%)�!LS���(�[ꞡA0K��sX;2.���@,������\%�o��Umޯ"��.�W����gEJ�>�C�hht��U�E�C`L[o!� l��Ndo�Nz�A���ҡ���A�38_G�xV�>0��F
��~Jjg�{_�z���<�;]�-�'x���%h�xe>�����ѷ2��>����d����&�G����nI��
�{�_浒�__��o�b��aOig�ꅉ�{�#�;���^洛�GQc�~�Y���dkx�y�����b�ҼyO��<,&��lp9���)綄�����-Y�W0�@M=ۣj��z��U�aIn�1Vc�#"��q��{�2+:Ii[�ؔ曨ZcЂd�wdơEm�1���/L��3�T!����t��U2��A�
6t�g��5��E�:~�f�l|m�I]c��,+�
�6�ir]�(*XMPu���؃����Qm��T��=�D�?�X���-�S�p��0���r�p�N3���_���]^c�@�	�`ʊI��
��G�Gp*7`�J��@��	��G炜6�x�輸��;$>&��t8i{�A��"4(A�/Az��7Y��h�k�4�xex����h��"O*�I�D�ڷ+g-P�ת�5kz���z����'I>�J��+=!����g��t�m�|Y��|=�
%��G�L�͊�d6��� �����u�'�o����u|���g����Is�����O��Aڴ{���(mQ���TC�C:$���d0�o�6��]E�0�$��?j橇�S��t��+װ�PC���ZF��IMh9PB�:k)m4�r���N��)Z����
~�j��E�g��>X&V*�� ��
�RN4;�J�:�ӶƳ���3�S�[����������o�߮J~����*�
�a��II8oZ��L|�(���e��+5���?�)����q"�R���1�1,���934�M&(W���Ͼ��";���CHx�NS �,���
Ho���L�AOx��*�Sެ��Ŝ�&��N$�jN�t��!^u�<1!8|=Ln�FV>�Iaŀ*��y��G�������*�gF�P����|�f!@E�f`\D�̃�����8t+�+�]?���.0Ią�PoSY>�Drw�F����]�M�xs���njz/����1Gۇ�_�\�>�ןԫ��I��3���lu�qY�RG�^�6�W����ģ�~���X�v>=6���	�?�ƒ�7j��h~�y��Ŗ(�� ��|߻V�)a���yY6��'s��<���>>��ëT�<�S=���ԋT�WW�V�Gla�*x����?���/^~���[���8��/^�|���͗�}����?��&���.��W��I.D�'8�g��:�ٸ
ﲇ����X�(1�e1M���ϺPw]A���D����a1�Kf�$3��T�1<��8b��#-�N5߉qb���4���e�h�e,ye��Uj%
0�����1ein�hF��VL��,�g�.f�sg�%�u�y�����e\֚VC�4�Ad+��!�[1f�M=_Dv'zZ'h�u�E=�;ه�H�6��:����Sge|�}����x��f�uA��-R*@9�CT��L�G^��Ѿ uf���Jk������[:��c�P�W�̀4�Ƽq�K�h����ۯ�����c��#��z�H/�0FO�`����5w��PK/WUW��2�~�[pip/_vendor/distlib/version.py�<kw۶��+�9$c��d�i�q�4�fO��n��ʪ.EB2�TIJ�Z7�}g	��l�q۳nj�x���0�>�>� 
�d>d�b�K:��}�6]n�h~U0����������+��6�U���tV\�g_��$�(M<�y�9���ۓ����)�������}��ŷ�ϱ�u���:�˘/xRPo�Θ�f1���1gk��P
ȱ<��fl���(���r�f��;;9���N΋ղH�8��b	0���Q����N� 8q:�C�z�x�3��� &��"�V�b��l�*�XU/�,瓌���2�V�3��q<��c6�N�l����<�^�a�L+��/`���vX�c}��~��:�����r�ZsU���DR���$��;�y1t�Ɲ�g0
I)���2{2I��L�N��~��-P��x����WQ���U�M-����-���/����GV�gl2����L��3��
�ě��i���K۩5�e,�^��RZ[;��"�<ʣ$/�$�6�w0a��b��{�z�e	��o�G9g�iQ�
*Z��C]�*X����WS���T�'�~��I��@i��
��4�:�ѱx���к�j�L�'IZ0d��6���b��1��ք�T.R}�
�E��<�׳�\�cK���%|�p�A���4q�ǣ�r+���i�e�M�c �1gr'5����P�*4�UQ,�O��i�{K�;^�͟f|�3��)(��<��@]���d��&
w7��J[[cR_f[{�=�m�1l�=��08���SR�5$�����;�>���[�$ٔ�|�̀$p�ˏ�����=��Ri��V�f1S��i�Ւ�Q£8�.%���z��RE(�����g�i��~)�`���,���gk�.[�vMPi1�Uk�WF��ǭ�@b�W�]�M��ۛ���l�M7���*.\��1ǯثc���a8>jo���W���R�r�X��V������@k��p���g)�IFƚ��t�M�	�oijl��j4m�Ia:ȥm���Iʍ�/y�6@	�)Ū��˘�ӡ>
a���]��N���C�\�:���YFf��Q�`��װ��XhB0�.�1<�#ZW�Σ\�)�q�hȎu�30����"7'�_����?������-�t	+��hD��O�D�myO,��H6L�D\j�.uili�N�K��"( Ȁn!!km���$�&�K�.���v��M�k!�3��m��=1�'ͮ���j�k0��?h��@�}�|ɢBTH�f
�A�̢�Ѱ;��"[�-���
�B G�oZ'B��*$Z�7w��N�d�q����+�ޖY_W��d�/�+�DY�DiTX�V������}�֍޴�<�f�md�
���'!�¦��@\����P�q����-�
�Wʟ��-��r�%�z�����Ð��7,=`��G2JU"	Z�!z�s!F��C"��_ҿ�WK_}.�L����֜��^W����"\�CH%a��=��k�j��l�m�f��9���I(��/�L.��e֬�u��ʲQ,�l����R�BR<&�eW�b�:�]��l��ֳI��H���i��D���A1�c5m��0e�j�3��hv�e��,���OW>h�i5D�c\��h�����E��#�@���\������'�F��/5��y��k
�s���Ug���9;9;:�M�?y������I9�Q#X��a�ھ9�Ǿ���ım�vz�f����N+����LA�.�� �#����^�cDG{s^�O�&:,�r���հ�Tn�(iP��*Z4�BnQw׷N��YQC��$�y��������d�������!ŶF�$Z����e`M[Rz�q	N'�9�1K!��m��qs�*��(T;��>M9Jo\����A%�Q��ٲ+A��@�'j���
I�lP?�K�]W��ް?�q�m]���$�|�$���blIZmQ�[���g�4&�B���u���/t��6�
��E�.!�XP��A+�#,�U�UD��bd;꫱\�mC<����*�E�R69���<����_�QX�#Mw0.Ax/X�wP��MW��l�]E[CxSrؼ'Þ�E�KVs�"�k^�����b�д�R}�r�Z��ڽկ�ңمH���Z-���RQH\q?_V��Pݔ��O��2��y0�&KH���g���(��ԗ�	ٜ��S�&R��T<��V��^%�R~�\�VA |�{�1P��$�z��_��xA�I}B�A=�hn[k"��7��9�]
��=i���4-��U�UiO��T��#�/	K�/Y�.a�"tW0(�IR2ND,HWee��q>io���{�E���*.!}ï�4����c�TF�aM������m�����C`�Ok�A��;*�/���o��°�䋦+i@���j���Q-VV\�H�)L��j�6E��<f�~\�k)�&�+`��hY�W[��oP[?=|�_��E�у�"F�3�RNq5d�����
�:x����V��1,P���U��z僶v���5�\C���r��Al0 SI����?�'�yϼ�S�#�hF6u!�ZhU�v^��:� Tʮ۬'����D��7XTbE�����'_O.�|uN^`a�HZS�ௌ~Î���o;���.�KJ��ǦpW-�A�ci�!'bE��m��*2�F�s#_7�ιAf�4�)#�R:ހ��R\w�D���1������7���R y�HSGY��ֳ�������ƒ$��]K?��ZąU;�R5s����J��U�z��jZ�:?�F X��U?YR-�W�}��a�MH�A�;�;��2Sݓ�5QV�u`� �4��P2���b*M�p�``v�Z78�V�^�黙6Dq�K]!�<�5��ֹ�U�!$L𢷃8"F���(q�𔥂T�?.�
�_I��T}d��ag�5o���иI�qRK�2�f��.p:qԔ^k-롽֐dM��cVV6�E,�5��4J�J�H蜈̌n�=�	L�]�@;
��&�}����e�������L�6��o�髝��Z~�>uCO���]
@}��6�L�v�j��휠��D+�]���p���P,�+y�A+��+�c�?|U�7��=�S�������߲J�w
�[��<�3k)�]ǰ�,m��j���ֳ�߼=�����A�z���5���O,\B�����E
�eX�����2뇑7�/CAeVϻ�ׁ�3�cQ=��c
<؊M�Nw��
+�O��K��8��'�6�$,'`��^
�ږR�e��N�$ā��@���.��z+�����2p%�y�T�hE\D��VI��%z�M�.���[y�;�S����R��V�/y��LP�#�T}O� �u�YP�#�`�Q�ga$7em<{�_����Zf�&��}���c��0~�&�cv0�}9��O�{ty9��%�Ur�S^Ep�gm�>&Ln�-@Ж�p�1������N�nC�u%[���wߜ��vr��֦~�k�VG��j>砮�
�*�
:�ߋL&�R{L\Swz@�.H�V���V�Ǖ�h��2�S�0W0�[2�>a����KB:
U��:�U��T-N�@�₡&0س%���|5���+���Q��5�g��ԩ:�@�i�P0�̊����c�_�*^]�}ET8/�T�����km�e���|�L�S���|5�B²��hQ�fG==��l9°���EM�ī�mi��r�8T�
u��3�%�#�L���)���j;�]᧲�v�B8:�ǘ��A	�ix8nY�;��l�=�`�;`��J�C�$��4��ܟ��\�6wS���BCsc�b�HI�#\�I�y�B�u-A�xqm��Ħ�����:&Q��đ�@���j΄)B��M����i��)L�+��<Z����=A�w3�IW*ri6gDF&�CB;��UG`2����
&O��.�b4���9�p�~�hc�:b-�j��$�ę�uyuPI�
)���=T�9�A���L��Y�l
ƽ���iγuy{U���`���*`�)��ls��c_0�������
�_�wWDγ�[x�z/\v4��9��4��]68�����{q�X���Q����!�+ψt��_)�m!�H�M�=?b�g}�wT���Z�b���U'u�A�?9�9�h�+{��(k,��+� �:g�����"�%�UJ;��Q��妲.2��i���p�@�c�z�M���7_�r��\�f")LR�R:-"���@���?p���gѼ�{�m	��B�2�鐐ލ���.l��K�+��C �o;�.4�kG+�KpP�5J��Б�#⑂0h)ɢ|f�᮵ҥ,.V�{�̶+�+�.EG�ǫ'baj)̺������{��KZhZ|�0����VN��ժB �[!Brso��!{�2�p��B(�RHc�ȿa��p	]Ƌ@v�9��0���
�	Ӣw{�O�1&o�.��R8p�l.��s6 S�0�nv����x���d���
����>�?�2��>����6���-�a2d�]z��]��(�Ij�xǯ��KﵜV+�ua��2-/H������7�����z�
 e"�4�EZ�*+V�x���g3LR�UƫB.��q�y�{:� �qʇ�sf�pP]�/��"����e�l�7�N�bW$iy8�N�����Å��ޞ���/5�����}JV�ZP=c�s�٧��EL�Iƛ�쿪m$�d�X����b�?��p+�K
��6u��ߗ^��3��8, ��P]�2a��Bf��<�Q��"�ٹ|&�hI�b�����GW��p�>�|Ô�2㪾{��.�[�M�wǘH��R�AHX��	EQ)�R�6
u��i.{�x[��,���9��T>������p��ߓ�XY�a�~Ok��;<���!���X^o���[72���v���Z���@�PЇܗ�^�:m�@su��X68�"�8�ͼyT��v4�����Ԁ��z��@�̆��`��z �vJ9��o�[@�\�C[�ٚ?E^����w.u�-D �2Q�i�ݠ�Pl6J�uį]$��v�|���>�-���V½�)�:xU�XA���
���-o����(3����>(q_���l(��漲��k�gy�S
�>�C�/��J���������'���)S�޼�h?�R���xrĠ�&����h���(��0Ž�U�̨��je]|#��UE`��-p����^ȏo^���
'�4{����(M�nMQ�g�S�F'��ו^Q-O�+uR�}ɥ�j��1+��Z8K�Ӱ
�c|�^X�W�q���3�۟=�1���X�-��eF��i���7d�	q��%I�W)b��;�؂�dj���D@T���Q��Uٱ���r��tY��؞�i��
��Ȓ�"!W��U��ZB���kqZkl�ߘ}+��V�5�}���n��n=o�뎥
Z�hk�zyVb�z��q��6n5�|�[cEE�4�0

B�=��Z�0�v���F+�ʓ�I�w�Qj%_^���!T�@G���\7smy.��P�w�g��;�z[]���QF��(s]�8�aa8k9'�s��4Nۄ
�2s�ш%ic4�Ns/+�}Ꙧ��+p�
�~� )��o@��X%����l�h�.��^�Ey���cd�WR�.������չ��Zj��<�;��@�֕;� 'B~�.X�9O
���}C�L���])T��0��v~�?���CVu�?A!�1I��"�Nߠ<�O{�V��j��
(tQ���y2J��9ṿ�*�ρ�.6>�QNTPiT�B����YвR�4�f���q���BG�#|�=�#~��k�����rP*��c͸J�p��[!��S��u�A���M�X�F��NWQ">��A�.�tܖ�gX��2��2��F)�Q�;��A�׶��v�١O��xt��n`{?�Y�[�������;?�	�r�*���8���q���(�)h�޴��dV�0��X>wt��uv���Z>_}����j(������O���9��H�:��
����7�Z���\~K���}���E<����+Q��8���<���`�%��I�c-���¯rj�s붭P6F���'�f���bC��`��ܑ�W(�$�x�g�*�߭.���H66���[��������7'�U������o
�Z��m^��z�V��H;�gp�p���W.�k:��B�$�h,a)y܄�Kj�.K���3�""��#K~����T��XY�g�m�#�#�̑��E5���/ϭ�Iz��o_�7y��i�I��f�?PK/WUW�g�8*z�pip/_vendor/distlib/wheel.py�}kw�8��w�
v{rI%c;���{�I�n����I��8�� ��D�ew���$H�N�ܹ��L�"�B��®7�?�&�4I/�e5��ovvwv��Y�.�˫������G����=��$���Y�)�C(�"���S�ʼ�Jxo��U�zg٬ZŅ�g�tW	��?D���^Z�xYe��b!�
a�	�8}z���$�>W^�N���_�{{���o��%�ۙ�‹�ٲZ"��d�gE�芈�I%�x^�����?V��̤T�7Q%�@�"N�
�B�e|)"�͒�Pu���j����Oe������%S��t;yV&��R/

��ZV�\�Z�:�X�f�_�ɸ�
�(�E	����,)+����D�HuYv�-�q�na�\��%�s�9�f%�H3�f?WQ���e2ZJ@�I����e��b�mҀ��-DcyU6x)_��'�;����8yu��d���ɋ��a�s?/N~>~��v��l�[���aF�|��jU��{z��[ô�?+p���J8��i���C�RT���2C�x���r9��&����q5ˊ��[��B�|���1��?��i���~wRY���Vב��!�A�(J������
�^e�@$v�	`��ՕH�T���º�����`�=?_�k=˒t���C����">��ߩ��/�Doޞ<?���繿#� ���!���*���S|o����;�/�y�o%!�Jq�6�o;������?�Wz��4��gt�o�%ͦY��xiVy5�C�)��^y��{�3���;o�
���k�{`����
����ۧ��ws����c"��G��&�o���^����k,�,���w�Ӟ0�1�N3H,���E�D�AX�����ޅ1RS1�"X�ɍ��qH����">GC���Ϛ���YG�N����7`j�a��"���j�3gO��M��k��Y
A�?{����c�y|V��w~;}�K��/�_�x��@Ѐ� ��~~�ƻb):�����Y�ם{��>˲�04�_�>}��$:;�ۉ���9�{ Y��0�J�E�Y
	Xl���sx:pj�ni4\>R��OY�Tp`Lok�ʩ;7���]+z{
A�4lVA�N��o��.~:����`g�?oҟ>L����^��W��b�����:�����8�O�G\�.�%>�����v�q���ӟ_�~{����o�
���3�cwi�yv����6-��r���ϭFDž�������?ҋ�0P��3N_�j�=�:����������`�|��2 ���_^���c�fT~��o�וO[hV��ȉ/<�l��"q���i�e�^f�7w�(���kٻ�����I1�1Z�_Rh��@p�52�JRQ�ݟIT�!6���\�f�gQ*F(A���29/1�w<X�$߄vm�5�F]j��_ށ��ӏY�ə�i���5]���L{�Jz�]着�����i6�F+̊ˇ�BE\���]U��.��j��lYL�e��ubR��}��nv!��o��	�M���*tpB�T>�l���6~�P^����k�"�9�����"�P|��{���آ��3��e�� �
���lREQP���`�3�>�z�)�	0�����C��k
/�N	Ӆ)�(�@����sU;_�i7.s�n�@! �5p0ڭ+�~�B"̳<��t-\7�C��N
�޵`
^�w�g{S�
H>���ў%�T�(�>[��;BvatSz�,D��W��5	�9o��LɘI��F�֓���݅��T͋��P��'|'�5�Қ$u
D�4�J�2�}=�4֬�~�Q�Y]=^�뎸 �Q��9��#������9j��&1�B�@�O޾���<�\�M�
(�wyt�e�PN�Xg������f'�~�-���
]��d>%�/a;�G:6UE��(�������P��?h1*��u���]��^^��}�ד��gd=H<Z>02�ez�<����'�5�2&��>�*��D��;�N���y����@7:��l��q��Ƈ�l9�F���?�2D�2-�`g}����t��#������w����\��8]7���J���'&�i`�\��nu�`H�t�X����zh��p�Q ҍH6�~��T��1H,��*P�[�ơS���oxYd��$Xs}��&�}~��/Z�v���fN%�:����S�Q2&��|M%n�&�/j�=B]}ԅ�1k��8u��%����GN�z��=K�ܴ���P�zNJF��:z0�5�OSZ�!��w��x|�͡w��=�;I7~�ED��%��/�i�st��u�v���o�kq�P���t��I��6��q���kP��P6dCc�6�a��?ћ��+�z�����&.�lYz��L�ҽ7��h�Ξ8&����*�����:P�-&�X�4d:�E�Q���(/�"��dQ��C��yq	t���fN����e�W��p;R�C+
��@��>���tm���i3�H|�S6�.oc��dӼ�b�����I�EV8;0���V�(���+!�~�s��"�w��Q!���ps�u"`�4)'�n8q4��g�`�mnOEr�ȩOӣ95��f�9�9"��ՠ����j+���@%�e�&�M��@�@��1kiIH�_Pk�~�p�|��eQX{���@ۍ�%�2�Y��
�e�}�G�qe2ŖNA��zIV��=O�*H4h��n�ͮu�?K�=Ov����]�G���k��v�$/���;�b�T};�ܚ8���P���W�ڽ�؛�v��2RS������Cs��,���-�4o�3w�T}�S��H0��۰����$
��y�꩕�d�n�Ê�n�$)z�)�d�򱔥�A��]Ͳ,�k<_
inPR(-H؅�$^B��K_n#����,)Td��@�Z�*po�ф�1h�!M#�������y�����j2��ML���l�5=e
���h������$u˒�
���w��n��X�M[J�D�NM��Qy%�qz)g�6:��^�8�z�1E�^'�ij��g�l����Y%
�>Ԡ��j]p�s��	��~��
;k�L.�B*�">A�W�Es�}�d"9���
-dm^ D\ɠ�t\m�do�2��<o���6V�II.55�R���|��ƺ��9�rv�P
��wd����с&��
!�w����h���Y�D�(`������	�8v^��/�߂2h&�Y9)�������w�>uE���v}m��\�)�bl���?�k��am�ux+j���hhZu���XK�"�72)%�
D���q�qr±�w���/����ˬV�PF!G{��2��퀁_��
�8B2\�2��h��c��&p�AX`�_���8(�q9I��F�����
#���S�?J���Cu
%��ƈ�:�$z��8�"�b�����,�h��6k������X(���Φ)l�z��h�l�<Z���z!������M�R��!tzL�B)��9��%�A\���O]�{F�k�vL��˱�6
��GB�.c�Lr�Y�rQc����Rݑ�S�1{KǧL�����7A�t�5� ɍ
	�@
>yS2���=y���3c=�XZEtV5C�T�<v�Z*z�j���Es����Jdu���nzǻ�P�,���!Ðÿ���=����w'Ϝ޶��_�2^^�oEV	�-Бw�BFH6�[P�I�@~��nt�r��R��,O_s�p^��Zه�2X.&�,�,@��d������p�)�w�$E�J}�#����P��a��2�RGEi��X+f�!݁]�}��>F#@�*��K��^	�.����:Cgc����H�9���YH����v|��D�q�u��(U�rF
����cӅ��o�[��#�,	���
P�¢��պ�6jXFr�aT�f�ڒ,��4�y�
�廓��l���ө�o�����r�ۮ�<)�sW�l�W	�K�<b$���H60��@��0��H5/��r�OU6#�1�jI��
O�$i#�V��D����T	⏉v�enWE9�9�^���z��4�%��U܏��{�g�Ǣf�X�ט7�֚OϾ�&�)2c��x���UK*�65���q�s4Ȩv�kN�泵��|�䠎��[���Hԏ�j{Ն�M��U�j����zYuE��8��Ψ�*Q�r�0�jI�M��]�r�
=~uY�+ڜ�,���$�,��4,�Q��mî(�a��~��DTQ�4[9�u����r�g���ˎ�6M�E:�0��3�f�=�ؠ�c�w�E5�>��y�ī�m��R�ټZ��q�8�6+֠U�p�ݐ�O�;��\n��h}�e��s�ˤ�ȼ��a��z���˞�����.�*�]<_�;(���i)�۶�Nv���zn�X���V���;.K��t�s,��tP)C"�(a�6K^����^�L�#��֝l��s��֩�m�7�O_��;~���-�8���	���6ỷ�z�9���:w�͊>-w��v�z���)Ibv�"�ٓi���K�g���C\`�ҙc�'����98:-GoXI8��h]�����{N����ͻ��Ւg+(�&y���t�Ի�s�SZX����
�D�VZ<>�^I��ax���x�*�"a�V�'}�
(Ɲ���P�B�%�R�D�KڢxmyU2M�]z�0^���UR������a�C5�di�.�%�7�c`�&���2�Q�̰�*�8���?K��ô�0��#�@������b�]3��	�t��
���"Ɇ���I�=8��i���=��ȰX�I�=➴%+�<F��(4��!��'P�UX���F�<�p�Q=&[i	���F�p�TA�t8�2B6�E�u]�c�}野���_�t���Ⱦ�e�jڨU��P�RY��q-�E�q��4�<���Ԑ,kMkXy]��$���!k�N��{������z�t�c�" ��ԯ>9φ�Y	���,�К���i�܁gqA�;�Sg^f,��嚠���4�6��)bB��z�Fu�
.�x(�a����Y& a���=�u�غJ��ϡ¿9T��<L��!
���*}��*Ѷ6�*�er���
�����|FAYe6��i1�NA;E8�Ǐ�l�?�[�U~�
F=co����P*e�Z�/��S�Z����Bf2M�P2rZ�@S%�z�J��SNӠtV�Dh�ɈIl*��L�0�B�q:Y�b����ۚ�2�)�@i�i�Cr��˰/
�
�H3�4&�
GT���CR�i
}(M�R��~f+�c��.�F���x��I�\�aZ�3��`����5��uE�*99�4J8��N�x˺���C�	(�fi:�H�Dt�aO
��Č���`t����@�	z����r��`�#&�Z��h$�C:�s�љ?�q�%z�s���L��k��E�{K)���Ǐh!���f���P��b�"��P��EEZn��1U��!8(���k�|���k\��@
��P��,�:�jShVwF=~�о`KU�Nߍ���ny��\[#�E|����"Ǡ��<;*��m�A�����|a�����4^��h�:@�v����`�ٲ�fC�)���K��aю�m�Zu����ƭ��g����,1&rg�
x��HA��uq4�Q���n��]TɠhS)st�<��vwi�����X{	�'�h�:�K�Q�w�-)o� 踔T���k8���DE��_0�D�pSV'�c�2��Lu�
�H��^wY2�=��
�Կ$f�|>�'�n,3C�0Ƙ��<=
ZE�ި��,[�I�T\�vu#@�}�݈��X�PZ�/�"N%i�@��05hB�$��D=(�P��IG��e�ʊk^I*�Z�����
'�AT^[�@;�ˠ��t��T�<��e:�%T��eu�QOJK/dyCN_�<VV�v�J,�p
�}ʾ8�1ڲX+������B�)�\��'�tح�j�̦z0=F��} �y�z�˨nI��,���E�5�4�sҵm@��A�Ө�r�#��487$����GU��(6	w>.ҍOWh!�G-���si
��t*>>ˇ5U���߃#���~$K+��-7����)<6
�G���ݬѰ�>kǜ
=;*��{YƊz؏V�pI _7`��A�C�5fZ���&5�fn�@�C�wy�𱃼�C�����n�&>�+,)#�+y��zG�w�ӣ��5�f@7��kJu*�дJ�n���f��n��f��Xz$�v&̠3�����`#�]ٖ�?�[
5;FG�Ck��ֆ�ީ�Ce���PO�NFF�G5�z�ݕ)I�����`<�^t���wJ����?z9�KR��IEV+�������5M�Ȇ��\ē��e�(q�
��(����K�d
mt�lF�Jh��j�
A4��'N��zK$���������ッ��\=�2/C{�e<F�����]��IF�/V�s���+0���5����IbD��mm��Z�\-�i �y�ɍi<�0 ��'o�����0u���׿�%n1y���(��q��F���q�v�8H��CY�(M��m��	�{�c�6�|����������k@���_�1�g�]�N;�z|�|���]XРXh�8��ڄ�^5��|�)d��$��`HΑ┨nF*���A_�S����m��<A��$
���t��#{�9�(2b��5y'�r3Mv������#A`aWq^�������#�<�	�'.t�Կ� q(��Z+�"��RC
@��[�$�����\�u��wc�ʿ�X���A�A��8ː�Ö0m���!"�v���>Z�.��aJ�e��I��'t�r�=�r�M�*�:�.�r�b�>$�LЌ�a%@��ЂO�|�d�P�B��z��u���|���x�a�C�J�SM��
���+�d��>yɑK|�Dx��@,�����'k��`DH�y��g���Ln�@#�A@|NΛI����.��R�~��#��R$��]����}{�d2�rx[�xyE��g�gq�w;v�8Jɼ����1c`ބ�c��fZfs�V��e�i���]������ж��(�)wo;�K���G�WtO5���掚���>��ɬSvYK]O��>�֛t�Y�y�݄�yӄ|0�z8���)7��p�����C�7J`�#0=�	U��nE�v�MS�x�3��<V�Szn�Uo��"
��o	J���4r�%��[�c��������^E���03�`
	�v�|�:"G���˞��Y���^���r��ќ\��e+rI��e�R��j.�_��M*`�`���� �m��9���/
��s�[�}�}��>/W�݂!��%�J��$k�fl�ڳ���6��!k�}ؼ����A�_l�'is9lH�_�%!��k�C�g��U߬l�[O8|d�$���{��o��hq{:��5�&$��=T�����:e���:D�OWr��yG[�%��h�OO	�8�[V���Wqz)(��-Ânż?D�UP��t�v����	F�$�<�(�@���+�@�;#:���qJA=-���7B���׈�8X
+�m�j�l�_�����U�𬴇���w޽e>R�Vv�4X����8*�0>��c�I�Y�J�E�u��Bٓ��r�qe�F�%ukfo��g�xΗ�闸Cӭo�t������y�M�L9�6t�|Hf��{���x����j�S���C�a�#��6�	��&�����������M�Z��.�k��m��圙��n�6Vg�22
�2Tթ����U2O�K�q۠��\��E��
i����UDp�.��"�raX|�$C�uC�Bo
�G�J�X�Y�mv����Og��g6�=S����(/˴#����f�e�kld��%��^�v�X��NA;"�˽�{�}�3Z�5��VW�Ά���?�"t�
���BL����oY���.T���{Ɵ[�PS׀�S�پ�u��nD"��
�Msy�:O�S��ˮ�1���#iRF|�n2����&3}�+�l�\[��#,˔l��Zs�Tw��۷�[�!���q>�1����1�B���C�4�]����G���z�=yV#L��s�4~��r����b�}�JK���Z�H��-���S�a����XR
q�ևM����N��1܀4��10�.-Q5�Mvy�V;S��Kl�9��9�|�f4]�y���CN^��J�s��Hf�ꂀs:�saC�[W�5�֑�����g��J%���:S�(Tu�W��y�:��jA�yC�2�����4@��[�#�֖�D��{�=�������k��1�
��w}��}=�|���Ae������ǝ��޽~�Z�,�e�����#q�9Ƴ��;����N��u�#;��pB������+���FPr�r���d�
^v�2�hL�1Q���4��0_{�`2���٤����X�W�g�(iD�l8tӰy�z:��)@9kB�U�a�
;�q�2u	Կ���h��8\�HUg���G����t�j��
G��xl�Na�[�Y���m�I��G��ǣHv曟Y-]dS��lR��_�ސ��=a��ce���g�)^ �x�xR
՘<{��Y�]dΊ�YU&H���/9$��Z��D&2qшW�t3�ݹP�c�8�Ը��ˊ�"[%��)f���e��SJ1f�I��_2�ep����8F'�"3�/�IAŬK����`n-ڊ�n��PD����Q}��r��lJiTj=D�d26`�-\t"��gx���|yC5
�2�X�I)[e�a�e@1�YY&�Z�*�^7��a�|䜓�c��Ǐj�r�#a]+s$���~p|�hT��JY�\�K���>6����ӘȖy匪�,	�����?�d@rdO��j�&QU���/�R)P��
�|n��mfT��2/m+x�S�/y(U��(+���K#Fm�X7��?��z��r2��\ {������v��UiX�,�J9l✍G���6�y�X%�Wsd���7TOe�v=��n���zG
Q���y�1NW���C~�(��<��!q��n!X��N
Q�
%����h�.���W���/(Y���T��ar�}}=+HZ��W�;���57r|:����)�1�VR:h2O�P*��z�xo�I��t��Y���"Q��a�\L��Qи�X�k��[y�g����y��d(��?�*6M%�����.�t�A�
BoO�W�R����ģ*��6y���@��0�lo�Q4C6�N�W֎č�G��1g��VkȷWN�N�ƧS�vn��E��r�wi��!y-:��dg�>o�BP�`#�T�d�:7W�m��<'�@���?�L��th�)�����ъV����J2�����+/S��+duy�P-���䭑%ݒ�(�5��KX4M�w��]�x:Őo�۷�C�0em2[�~w�h�~���}�@y�
C��4�.3Wchc���;N=�)��t6�E��,�O��t��sx���`t7Phz�]ژ]`��"�9L/�<�e�������&�ks�bc�`=vNwY�S^PO3�6m�j���v��[/4G�Yd\��4�Uґk�bԝI�-u�kI��ն^2 ��G7��J�N1��Zy	�`�׶�7	D*�A�Y�;��ԫPU���fbB���=N�H�G:MM�0����v��T��FM����爅do��"sǠ�
B�!�w��L�oe��օ*s_p�I���z�6:{����_�X��S�ĭ�+j����V.��dj�����$�I��M
R�;�9ڗ�.T�$�q3%�1Sr��|�aJzm�Q��R��"x���R{Й��#�$�r~A�ON��7��`�d.���i}>ܜ�\Ɠ3֗�a�0rA�v��ӸX%�5�ro��?��z0��S���O�1l�_4.Uf�]�
�����ȸ]ٖ�hR���B�3�ĝB8���E �>��{�N0���K@����yL������o	�Q`�nnFv{�h���$��Uj�pG�hk�&�~�f{�+L���ӑ�EL�,��۱��������&#A���J\�8�=�d #��"�)����a)�.��"F�v���qb���]�,ԑ-�"�@��k��3��X��	��cd�6�<�ӗo�7oO�KkcK	�z0p_xè/�t=
�sk�j����`<C����#Y��N�,u��T�K��H�x��tJ��ep0��B�F�mp_�{?�®�&���������Ip��?�����}�b(m�?�f>ܹ��O��1���,�{'�ɚ��՝3>iF��8���kķ�R�������	��;3?94�$M�f���L��|�=��Yj�������7��N��8���|��m��y��)vлt�꛲�֦�_j��,H��d�9�\h����^R��`���L�^ՠ��ky�u��z����wͱ���w2Ӯ�9��j�7��/׈���[ڪ�PK/WUW�`p�#�pip/_vendor/distro/__init__.pyu��N� ��}
�'M����T�l=ī
��6@��o�,0���2�Og�_�d�D�h"��6��Td����燮}{j�i��cmS�I7<�p?D�	5�6k1�Nh�1�7v)<g!�y���S3���}��KN-�)B���>#�⛇�r*`�cI;F`��M�K�p�+*G��Z#�:��Kh��S���g�궪��䞼_vJ*�.�2�Eg�;�!�C]��O��6D����ʹ�}�$3Z���j��k��^���3��-�{�a��X5ǿТU�PK/WUWT�i<@pip/_vendor/distro/__main__.pyK+��U�K�,.)�W��-�/*Q�M�����LS���K�M��W��UP�����+Yq)����PK/WUW�
z-��pip/_vendor/distro/distro.py�}mw�6��w�
,��ɕ�&�m{�uw��mu��9��vo��)	�YS�.I�Q{�ߟy@%9/m�=W�45I`0�����_���$���X���"߻'�u�^]�����6�>�>'i	�%�bOө�+9�|&KQ_Kq�L��?�e ~�e��x,zX R����ºX�E�yQ�U%DZ�y�I!�L�i.��b��I>��6���$�R �I�@��/�in�IM_�r����m��qQ^=ȸP�������� Kş癬*Q�Z�%ts��p�&�0KnEQ�䪔�.��2��j �b^�&�(����t��Bi̠�v U����\��#����|0~]|{��B�xtvvtr1:>�g���ɓ������G'�ߍN��2A3�ͲD��I(gH�s)�#T-�4��S�W~�J���*^�2�,i����@��EZ'5�iu*�ۋ�h��\^R��K�A�=�]U��px��7≦@�eY�Ng��Ks(���D2)V�j�̬*"�E���x��^�0����4��Lf�D�D��j��k%�VsЗQ�\�K	¸�����̒�����F��>�;�J�$�.��*�/�d��1�_
,�
���^�v`Q��2I���X��(���]B�	4��d!E.����\�]���'���L�lL9s	`�*(>�?�n.@f�4Y\I�X��j ̨
轮/���^�[�D��_ۭW)�=��Sj�4�[���N�l��(aH��$_�ic��u:��K�����sO6,!�.�0laHЀ�T̀���x�ɣG{_���@[LVWU̪����"_^����!WdP���+E	T+��IYI��s,Pg��ʕ~,*�Wi�Wי|cV�y�6����Z���b!�G�����;����q�e(���$���d�y�d��sЂx�O�M=:U�����z	����r=�7d���SJ~D�˲(�ҽ���TEO���x��x ��Y�Wfk�L�>_$?C;�zJ~Ls�q�J��8_-&R��0G�� �t�TWH�^�A�jh#F���F6���L�0vu���'��@��dt�,��tZ���8�E��h ���F}������j�;UD' K'X��||v���x����c�oQ���$5 򽡸(���x,դIq$�8��d6�ѓl��n0��|iX7�Z�j@ PO����J�����٥X��)Њ
�־�N���Ic���7M|�
g��YqV���	v.&`�n*�(�j
üjڦf��DuJ��7�����GOG�y��9z��Y4��d�I�;��)�͆L�Y�"�K*�^p��X+����9����c4H�o�
cﷻ0��_��2������BxX:�&cMb4���ߙ�V3�m8�<$v~N>=��a%[Y.˴��_I��cSD�,�R���IN�߸6X�k藩y[�7�X���W>�����t >?6E�0��C���k�&z� &9h�Pu�5��~'�4�2E��-�5�j����HPE�A�>�JW��djT�Nu�!�������Q�P���f��� ��O��4-rdi1E���y��jP�
0C�'����9 �������)e���)��?�/�����ߋ��/{��}xw~�T��{�r�� 9�J��IV	 R�}�ԏ��pQ�,5o=h��M\]����G��W=濕���P��i���	(�����ޒPK��1��{���$����y��D
o,0�ZQRN��wH���j�~��s9
㿽²��v�Uuq�ܴڣ���pyxO���ǟ���2+A�-�v�m1�Y�/���&�87?P����y�^�Jf�^�\��/qyE��E�F�(uY�� ��I���	z��E��^��4ݻuU��G�W7�K�i,��&���Q�=O��WY���:)�:uQ�d_|ɳ�Pl �?��O�Y�?��	�p(Ɵ���'��:�I���&�Fa�T�2��d8�5�V��j06���P<]���]��D,�1�Ѻ��ʠ�?�ݗ4�u?!=�k900{D����tU�����.��F>���^:#n
��80S���%�!�����XUCF`��ڗ�`�Fs��}��<���q��ZehK�Bt����i�F�0q���!�s���.gU��6ua[&�y�[U+��q�5��58DU_$�\�'��BG�x�HA�M=1�+��}�y2����1HP-���4���Վ2U�%NP�%Q��aRZW�s@P�,gI�Pl�ı21[�&��4�8�H2��M)�t+�� W�r��:ɝ�x1(�^S;@h�f�|.I�F!�=l`����5�H�eQa@-��e���1Iy*n�n�&���?�A*��MT���"�4��V0�U�+��x��k�T�
�X������#�VLS�b��r���J6Q���r�%�O0ഭ�u )�?zF�E4�V�l)⨁�M'���Q�Q�t����
S�-K� �J�F��~��U~dj4�`5�����>������d
�Mms_4��ٵ�����8�	����*���K�ܯ=���Bke5#o'	��ZՒ�?С��VH�S
�ϊ�
�(zl×Y!�Pep�2���R���QLieV���qH
6�a8V�0������~*t��*���|��d�׫H��sz��G��	=*G�{����[����'��cx<=�g����}hYY-�???V�	�;\`�X\����,~�-hG��У��t���L1۲(j.�~T=̊ՌF#}~�����|�{R����n��E�od~Q8��b��)���}��x����=��P�@������/✜�J����3��ó=3���Gw��O�h��=�d���L?�����gi��2������G{�f�9Ѫ��@X_I�4���#�87�6�f��͜�G��5Ů��O ^��M��FC�_�?�o���O�D��Ӽ���5<�o�t��
����z4�i2���>:"���$Z�~R��r>|�J<�Q��Ϝ�ܯ��5�Z���ʀ�kt��	�ٌb�P��Sp��qd��S���6��j�1i�9��fl�ȥ��o��=Z�@0سZ�J9/ر��Ɏ��������r���O��f�ש,Q���a�̰��2�iY�l7�<o2p��(w�1���.g�Z3\7��"@�k�z�����b	^����1�I�/�2�Ҋz�ytW�)��G����6t��r�&�`��D�T���cA�5NF�a�eRUҷ��X('rN���u�=��_�r��e!ULEj{����Z�ZxփS�|}���4e��x�q�yB������ |���41��\	�m��+�m��rU.���D�eS
g�
.5̀�i�E�{�`U8��ts핥�5e�MN�Է���F����m��%��@�>I�^�SSm��fq幅q���x<��ܧ��XU�ڒI͌�P��ݝLy�t�O�h���&��5�O���A��9��^Aύ���o{��F���P�B�a�IG<h����㞌�b�ɦc�f�r�Z�Pjh4��咶�t�������{����jkx��/�n��"WJ�{E��P?�c�;k�0�w�������P�8���qP"6R�����ſ�����)mm�#)10"n������dFJ/�Bo)Ig��\�;_6aB��oD�7#�Ֆ��������`U�Q���a����mF��aD?�?��a��3��qJ�?�f���R��1�����~��ˢoZ>/ҋ@�x���X��`)�R�-��&d�|�QP�b�-Ô8ج��λ	����y��	S��Đ)�&̓d�&UbMc!-�JcȄ1bN�@W����|e@�;���K �ք"���*�W�{#�@��'��`����-�}�FS���H�M�h
�z	��&�<��%X�␖�&w��i�>���&&��h*8t�`��ZBG�27���M�a#��l�,��I��ڢ��K���k�hFXh�=��M�D0�L�Ե���r�8lk��<�x
Q��r�Z)5n�mü�O�NOƻ�ﺠ��%ݷ��YP]��NV�4�1r��H�Y6�0
ܽō��nɟ+��Mk������N�˻!�ݩ�&6�-mw�P�E<;�k��.{����:,���;��4���^܁�w��i��u5�J�k����X*T��v+���3kDH���@}ux#��M��v��Ba1^��C�.�������rl_Y�(P�Z���!�Xd[�����+�!�e�fE}PI�,jt�����Ȗ6�
[l�{+� �?�-N�-�c4����K���/�h~�P}k���Ӷb
�/��g�?!OZ�ov������@�e2�V�p���1���lH�r�4+*����@�&{�b��*)g��k<���p�\��,�Oz7�ں�N�2��~Vk����%�}�|<ݔ�1Mf�#R�'
�Y��M;���)�Ip����s@(�ѓ���w��f/�X��9���_X�7qm@��ŒNe��x���|����E�%�m*�%Hz��}S���7/F~ˈf�7���$�O��̠�ʝn�=MmχN�Z6�~㒺!37/%m�k����H��ޛ����矎?�k���f��B;�����cS� _s|5��O���U��4#[��V�Jc�q�|�]��]���b�z���K�43;�f�����}A�+6���d�k����݂x� \p@LeI�[;�|�R7��YN��|��\�����\���P53�c5_�.��t�	��j���tv(��֙����M����㎯�LC,!ǎ�{��+���M_mC���;E~�A
��x뎏��=���b�7k���5����K7�-ΰ���IJ�����s�.�s�nLi�4[#퍙��b���uR�꜅Px����nB~/ۊ!�1�S�6�w����m��*��>uE�(s[1�B��a�c���ԁyU��l���v�̖��NK[�����:}LeHS��4��p���m�M8��}�&`����~kH��Б(�x��i�;���xރ�ι+׮��U���kI;�E�C��̽%C��j�U�1Y}n%h�p����OA��>��#j�{� �1W���G�pC��εuz�=��R^�m�k��	3k�'wQTv�a�T<3�ݲ���K��C��z5L)�U��������.�O�,���F���-kfGT�wֿ.cC�����[7��W��U
��
O7~0����?��c`X�X����4����V;�f����BsE���1M1
�l�,��,��L_`..ǴH�!��K>9ozx�KP��U8`���&�q��1����$�*k�_؁sD-Y���a�����7��W� ز9�}�f���p�����fl��	#�����^%��@̇&�֋G���So��1rR�r�H։�s�P
��N�ǡBX�o�J6-�����K�9&��\U/L���6��ŷ��:��A"�n��܄xZ�1F F�45�9ք~a�}��c��(��?�j��A�g�\��L��m�O:�sV���`�}I�$�i���UVL��t��g�0|���`���6{��9�֢��[Uؗj^��"Kg�l��geϫ@���^*}�T^�K�Wkh��f��N*ֵ�s��F����PHSY�a�e<�����
[�����C=j?��_�2���mq��hh�v��+���d�}q&͟�\��*�G֝8#���{IJAW�z���GiA�sg6�k�-E�L���Y�5�_7j�%����!��ب 3�H#��4�f������c�88iԛ��4�#�I�Ҟ��UL���\![��3��=J� N�[�4Ԣ�c����V#��?f�!|��W	���G�-Xضŋ�T5�R�!7�Ǩc�-��3`��Z4Y-��N��n��A�4��i�%A'\��e��Ǎ�i�U��X{#]�\!�=ẓ�%��!��2���h���XhZ(���0���/8�w�rڜ���8=��b�4�V�k�(7.v	�
%��D�����<6y�QmV83Q�R��4G��p���T�oN�a��P��n�Wm�P�C��O���9�I�%>�M���;�$<�`lIS8�H�+�E|���Y�2o����'l��‡�B#h�(P]��y�����kZ�v�cg6i *�)���!������#�cl愴
�X\��kw���-gK��	���	��d󁥁إ�� �^�J�EG��z��c�h籵���奣N����-�s�2GZ�T~�I�3X���t�YY�M���~�UP��B��~�{P�-`�-L��J�-H>w��&x�?a�{X�9'VX�!dy�]��C@��%��ٳ���.����%�`��H4��\-tV�A�5hV$3�=���W���ReC�=ހ�J�s1s��F�����]�t�G��� ��*�G�*�߻����8_�7��%���,�_N��/)�I�ˡ�s&K��꼥'u�9�Z���s���=8U�<x��� L��!���<�}%��#G'_'x��|�Z��5�mJ]S� �G3.��**s�J9u!{�I0�lL4��t�z��U�܎.Ҽ�DDY�QX2���)f]���g�D�����l�d��h��7�
��y+��fz%���SE�y�"�8��M�A0i��Ԅ����n˩��sӋc��L&j6�EK�(���c���8'�= ��@ƮSLb�^�ѳ��p��Y�Q����8�iZa�{��J�]��[�� �K�a��m6t`��FKZ6�B�@G��h��Drb��/*��ЎLc}]A�	��=�B��
�Y���l�l�Pf�#t��^4j�ͽhD�諹zčQ�6�}ܓ)gQ0��t�x{�,��R�
�v�}mfC�ُ
iY��S��{[�]�u�p�ʳ��/�S���j޸+��`Ŗ�0�ZdrWz��Qt��p��>����͟Z�q�Z+==���72
�俔�
�W10<U�KzTE�ͦ
�s�
��TI�ɫ�ކ*jƩ�1Tt��TU����C]���T��>A4��t��MG_�d^G�wP�ŬkH�I�CrH�ꮮ���7��G�	sk�l����	m�N�q���&:��Y��3D�u�k[�˰�T�E��w�AuVk<|0�o�I���*I�ѻ�#r|�Bs�f�@a���O�����}�Nn:�`��<P�1�_��F���j�)���v��ڸB�,��y�~�n��E/�G�%j�mX��l������3��t���` �{�6���3��"�Wm�&�u�=S��/�	k��м�j/��xdͼ=����{�g@�#,�v�eX�Y����iW�Άfl{�v+�;0TG�]�
cOɶz՞IXG���
'�q����lEv����n����n�m)�:�I���МG��_U��Z�SO�Q��Ӷ��c�K.�~�Ms�-Ժ�O_��akRE!�=��S�tPL��0��A��.���0.�d,�c�jw "o��p�$�`���
3����Ir��uJ���U�g���QRm/�q7��~2WIT$����_��A7"�Efd�S���@W3����L#J�96��q8�q��2��2K�^s�~w���5N��F��uumn�����Š�Ztt�s��Ĺ�G���@:�Ô�P���IdI�d�mg����uRyа&���.4+�f��>%
a�r>��[��2tY��9S 'I᭓O���@ګ��3�a�]�>�|�t#r0]��.�1��Ը��;*~�P�`�E1ؙ/uY���C�*
ۈ�k�-��C�;�$�r���ߤ��M�%�����כL
C�FO[;�ի3z���-�^��s�3������gXD����w��ܝ�q�2?{~��m�7�|p%ߴ/I�}������g`���CXL�{V�-�M�l�aw�8hEՊ��b��zmoK	�
�]&�Q^��,�q��]%l���fN�龃�iB��~�Bc�{��+��N��w︓/�v�ˏ�6hu��B��ޔ
���lx��>ze�CodwT+ԥ���^HY�%�x�5��;��*[U{�r�n�Ca�{�l�&�Y.��'���JMu:�l���:�X)�E]�!�u`����M�~'x�5�0=
q�q����6μ:d��\['�<h;OC��l���(��z�,ʊ���h7m��ڻ�O���hܝ�n@x��[m�vDٕ9�<T��`yV8���GƊ!d�3&��W�ۉ��m��ڹ�Z�#*�Ck6�~�Rv�ˢ���(�P�	�_�y�q�L�]�ʼ��󺼃2�5�e��l(��V���]���i�ʈ�'!��Pޙ��B�@���V��?	5��sp7}݅lMi[#Zq��}���O����6藦͠n&��=�MY:9�)r���~�+o�~)�k�@qްF���P��:��>E�����܍$����]�8��H�@��R�n$��j��i���){M��^;I�O?���?��f���uDZeC3�t��Y��<갇zb ��^{�sh�����U�9Xx`�F�z~�y�W,vl�oq�W�,�zu����*��?��=��
;��--�P\�7��tg�>Cp�t�~������U�#�@S��,VW�`u�.�t��GX�N��{�`ebx~���#J�Q�6��Z���?m��W�|CA�����_��/�L�x�x|{
�Pn�1-(�
�M�����Z�K�=�� ����k:�9>�,ҼP�k�e�<I��`���DJ�
|�<!T�t1��Q�	7�kUPJp��B�%յ��4Y�>L�0��:�U}����8�n���6<c:�+YS��+��DErz�Ē���}�Ajz�R㭐).�D٧t����*�ʩkC|{H���+�P�LӲI�"z�����##��{pF�]��+<M\a��r�8sF��mut3�AV�Z��
�/#	~q�w���EA[��/Ci���y�h\7}'{ﳭ0+��z9`h͇����|��^�z/�|����j���
c�֫�SHG�B�B/3�R@�~�ZV\��w�����7�� e�*�$��'_��2疏�x^I���5�$]�7����̩śo���������mV4���F,��N=��]�Tu���hj��zQ�
�n�͊N��h5Y�j��#�J��qj��9?�۳���|�D^:���nxNMT���c��
ns��-J��/ם��q�P����%��VV���ڋ���r�A�-T�����?�s�{�	�.�2O�8y��i�x�h��S��%61�EWMy�Ք�:<;�Q�<tr�����E
��H�l�\��qG�^%�����i����i7S�������9�/���9�j&־/�I���.kzh���x��BR7@U2��Fo^�뙃qF����#��-�=�̯n^�qң�16N����7�9��v3�=L997�&�[�g8{�޴O3hO�<ՙ�o�Ѱ�6�K88��V��w�nT��ZY}(Ŧԓ�N���a�v�
Q����t�P�6��o%q� Gw!�;ف�����m�t��vP�E�&�����GncQߎ�$�4M�}�5f���/c\|GY��L����N3	^��h���[�0�h�\�U�\M}��:%���d��:�����/�W0y�>�x9{�������WZ�=����T����GU��	�/����hI餰���e��^u�ۜ��Lx�}\¿���̛-�^��:���ٳ�J��s�Cu�9�E�MtC��q�z�^MY�P13h�q��T��Q0Ba�SC�	v��ZT푪�j�u�Qd�C��om���gtWO�ݮ?�u	�N����3a�:���4GtG�-^����[�U��J���[���R�=Ђ�1�7�e��xUQ҆��0?�V)sU��%�|+}b�k�v�|IZ|p�^��V��Վ�Q.���
u�Q�^�F��BPGѸ��%�>2p��\=:v]�%���2W�)'y�<�S�+n�����ۄo��l��¼�uNbYT��v��5�>4��?;��8>;Q;�5]�3,�q����y�>~�~D�6S�3ư4�rǰ��g��c(��:�ww����Y��� 
M�k?\C�6R�Zo�1�wYSOa!�:�;th%�32����1rKa�e֦�=-�&�
��߅��b���@������Y:���(�RU� � s:4x��.�j���I�=�2̏�������s�d��Z���q��Ӕ�m�NcEv�v��iPe�7;"��%�
h�5��c@�2��y!0��9Fs�GkA��Z)t�Zs/�B4���tƗt���"oͮ\���@�xG5����ζo7п��P��SV��ɻ�����ѭ����z���Vh՝ڈ�%!Z�צ�����!��D[`�3W�#]���e��Y:ñQ�hH�����v��ue�G�o�R(���+_�]%i����b5c����|�Ĝ2/�^�,�	�A7=������D���qXa����@[av���$i��30\kv���L�8�aʦ�g^��?���0�׸vl����,�Mn"�|@�B��wFg��Q;z|�*;�6�<���~�
+�]�Ew���U;���c&����M�悓�7wJ� �A�O�N���:qO��Rx�z5|��
X���|e���%�<��QG�a{���@H��u�)�]F�~��!���-p���#@ߎT���_|�9o�[�ǧ'�'�?�,���Z�㮱��]�4Q�`�D@G���Q'��֊z8'8{�(d�H�[�Q ����I�n��Nm<�ֆ�x��Z��f�(b�f�Q�SC�3���� T=�~������G�
*X���[�
>c����?9��7N�d6�Cj�)t^��Z�KR�e���@,�����e�J=q��
x��Z�`8��Xo�ib����U�������̖L��7G���;(�L�a��e\�+u��}w���tjiݓ�Ox}�!j�f��qm���*�H?�B7q9+AtO��@��}E!
���P����w:>��p���::!(g�(��)�9��gΝ���Γ(b2":���x���
��.nWQ:��J�)�_��j��(_���QA>��&�c���wꅚ�F'�6�?���q�;;Y���u�&�N�6�r�A%j��av�h�|�&�#m��t]�H)�e
C�����x�b묬��?PK/WUWpip/_vendor/distro/py.typedPK/WUW�x��Qpip/_vendor/idna/__init__.pyu��N�0��<E�'M6��7�z؋/`̤�Fʔ��ѷ���]�4�e��W[Ӌ�A�N6�tRP?���H��z>��Ř��総�W���Zc�+J[�HM��T8b�OO��,�ԲDjբ��W�}�;��`��#�A��$F�f7�V��P�G�y���ɍ�O`��C��E�w�I�<	4r�ڔ��7kp�lٯ�Jnp��^�<]��@<��y�!q8n0Wk��/:b��nS��UJ������d�&� 'vAO�n��)����(��KMNS�y�9��W�PK/WUWe0�3!.
pip/_vendor/idna/codec.py�W�o�0��0�!��EH*	�	$`��N����F�َ� �w�?ڤi���&r��}��{?���J�f��ʺ���Ȫ��[)�+�	i�z}���������KBP�z[3�����m}�5��A�l3�˼�j��g��q�5���E3�<�E��ES0��a�J���o伧�#��'�§)��B5��eB�����qa�cr��9_m5��0�o�֚yX�ɳV�=6��LA�N���&{ȝ2�P�s��b��b�E%K�#g:���?Qi��Ѝd5%d��m��Q��A��-*����|��Ţ��Q	�!P|�Ǡ�6��������'w=�;$���t��re���o	)6?B^U|YB�fp`J�Z�L>Z�{�g�Aa���:U5g�����	��^�n��C�>w4?��=<���G"9�c�ޅ+Б꘼�I]i�F9ߒF�,S��
�8� ~ +��CB�#�;r��j�ٝ�f�ixu��r�`��䬤��A�c�Ⱦ�_c�8N��lF.��]3|�\����0��Lo���U/����4L��d�vcrvȩ���*�}�h�%Vi� .�>��1@�O� "����x���x<|��g?���Z~�L���+f⯻i��O{�*=�O@����P����x�M$����
�Z�����f+�Lo	U�Tf�eш�\�m5�:�dʤ��mG{p-a�\�0�o�K��ݼ�t�W�)9�ۋ�Q�䰖F�e9;�z%C���'�V\YԿۂͺ��H[�Y�JN$�PK/WUWE��Apip/_vendor/idna/compat.py]α
�@�O��**�$��]\�I�6�����šo�ZDo�O���
{X�,��Y�~��P�`�1�%us��eʲ[8sy�UU��]Qe
�-�;�Xd���>����{ӱ��oZ���Н�1�m���C�=2�`�c��9ԎL��1�Z���#)6�|R�%�W�
4���j]�?���kv���PK/WUW�8���2pip/_vendor/idna/core.py��n�8��_��<�BmÉ��hh�t��i:h�b��a�2ek"KZQ�e���=��$��|�N]�#�<���H�I�4#�2�K�юz^�yY�G�/�>!e!dOI�
0� �z�]��/
�Ae)�V��؊��G
�Ng~�tCa`�"9�B�99'�;s��I����c��;��"l��3>O�J�@$AȺ��s>���~>�?d�=>�9n�#Ό�yy��q�(a�w�!�9::"�(g�=zL�D�8%4ź>�`����flI�4^�l�q�������U�$������fha��!L@�7,�8��mg��,�~��QF�4��X���J�2�c�P��<�O0��H�I�E{jf�{a���Ă\
h`6�F�V"��'�%u�d����+	��Ѭ{P.�z������8��*5���#�a�j&~R
E>�0��u>FwQ�oMS�e,E�4h�Ĝ�,O#r��
��{i�d���="��m��D_[�n�.��^�	�O���U�<zB��\���1n ���q�|����pq!xb,u>>�2����3��P��*
�ϥ�,Ze�x��(3t����T�l��LƣJ
�kr�r���@p�vv`��m�L�AA�j�'g�8�/$�!'g#� J�5���%
�E��D-�@,�~$�H����:�C�(|"Fh��S�L)�L����ו�r		��*P�a��`�%.Z7��
K!�Hj{�Xc��t�G1�V�@m�9q��~$$�apǀ/�m�T�$J"�.w,���'*�7x��K���
�'�O��˟�f$�y �R�vʒT��ޣ����:�q^^��gf�fH\����4Z���"l��d�9���i:�������43�faM�׎=��+��m��^)��4�)g��+�qK�=��Pڠ/P��"6�Hd}�(0�K�ParG%�����b��������J�'�e8[-������W���N���7���ڪ%U%hxQ.��L7B�(I��:�gq?d~&�Z��t)���r;��Ѻ�5X@i���2�ΥLv�L����ė
j�XiW����&\"��5��Ƥ�A�Ҽ?��qA#A��}��p&�n����<���sG��O��A�>�a1���mM\OU��!�Z�o���C��I�lVQ��莊�mUT�Y@C�M`�VA�8c�Qz�OU�?��tT<�/�
�(��xń�vT��Y���_?%�[��w[�$�LN%��g�I�r}�'���KQP�텡:��JI��`*�C��bl'n��Ů6�i� @�JX��b�|���FEF�Fa�oطܼ�wP%:س��PI�ln,*<�5<���ɨm�F�r�6G��d~�{EpܫIA�ܙ[�O5���'á71�?̆��pb��ھ�@@��x���#���J?�]-�a�PXb7�l����v��XbT��ܦ��|�b�F}0��!0k‘�tn��j'��@gC��)@\;P���.�!�
�kq?���;CQh���.�~���ȳ�o����)WK~�]��,�wi׷�aZ&ԣJ�UzU�rk+��p3.~2ZaC�B��f{��4�W{"��3��3�^�uF?�Ml0�����F/՚r&�P`�=e�N+M����a򫍞�(���6����_8�áD���bb�/)��5E�;��z�
�a[X0�H+8ՊF�qQ ��@�k}���"�&3|����+Q�8���L��t� �c�y+if���ׂ4��4�0��M������0�ZOH��E�J�R�)}��K��CŜ��+{#]{��抮��,�lL���V�V^mv�k���&���a�hiV��6hU��)�A�m� �?+V[
�z����5��-�LQ�O��>��~s��,������Er�����_kh��m�T<���ښ[��_c>�x�˩o���mk�B�n���*,�̾��B�c�h[�>(��?���,u���p���P���꛴o��
�#)�PY��f�,j,
b�"�@j��R��Nj�܆�;���1�x[���P�r/�r!� �%F��Y?�S�Eg﮳8&a�ꅊ��yUq���y0�Q�k��2�<+�~�V@��خ	ĭf�⬎Qۧ�W�<�;f{Hv�T��m�����3e�����v-b�{�����Kۂm!�ӠH�i�>�v��z%\;[]S�v%�x�勽lf���`����!��/�JYQL~SF��,Bu�"����1�^筨�����t(�U���gj��W;(�mܦ��-���k
�gZ^���@q�l
$�Q*���x��
M��x9���-Gsq�_n��2W"�uh��(]����=�\yͦ<�/.ި��������x��t���<��W��*���%�Ţ���U�Iq�A�%xv_²�f!,y�+a��%s���a��R�4~�SԂ������rr6�V�5��q�3�#�n	�\6��t\Wl�
(�Y�B���5}5���8YwD
P��5P𒄓Y�#XEqZ۝w�Aa����XV�.���n��>kG��ʴŐ�@��x�N'~�u=;�d�X�Z`��4��	y�����Ũ�!���h�׹R��T�MC�(T��Q�Z���U��0|e^����қd��5U�����#)âFV�^߈�^�����'�l��͎(�%j��-�0��3��d��.YK�TK[�Ґ��������G�H�v�ٚ�!6��f��_G�ZOm\��)=Wek�ܹqO��!Mg.�@3�K9�$`�6h,-�y�Mc���ܔ/O>�sO��Ss{I�u����I��%�$�[�Y��M���lrS�Vq���(�M�ɺ|���ͣ^�X��Ki:����sq�{�s���dH���&7�fn�]
��;��v�
ʡ���,�?,6�k{�����ś7hUf{�_K~vh�e[�z���xx-��N]C�v.��.혾U��PK/WUW6Ә%W�pip/_vendor/idna/idnadata.py�}K�%9�ݾ~E^��Coi/��/�
�#��iW5��4�߭�:��<'�N !��_�!ŠH��g�~�?>�����i�����ٯ��������~]�S�ӧ_�������G��i��w���Y?����ӿ��Ks���w���?���_6韾���}��^����O���}�]���J�DN W&ȋ�!׋�5����A.L� w&�'��!�'��C^L>����k���e���iz�L�}����_�u��Lw��t��G�}��>�
��nB��O�������=1���C���>�t�3��y�V��:��5ݻ3��%U��_��-�r/��m�e�0`N4����N���Y��ͯFӲ���o����-&���z�߭���n�7��z��"�Q�x������m����d5�z��Q����#�-�}���-|/�e�K<���Mx]͏Ŧc0}9�L�m|�T���6˅3A>�K�b����H�5?W4o���EWO��E��������3˻�B_��L?ӿ[/���7�CO������sE�c��j�Ѝ���<x�w^\�g x�iy����1�����K`
`o���>`?6�Ft?Ag�D!�	��H�.����zc�lxtvu a`����>һ.'b���F�	��2���C�������?���_����A��q��������u��
܍�Mܭ�����o�O����/�������W.<Zy���h��������MWww���R!r7q��
���oh�e~�����7�ԍ��/]ǣ���od~#�����J���od~3�����sTx�
�d�g��N��]���sTsa̅�����f��3Xy�*�Q�9�<G���U���sT����������]~?����6���6��6����ۘ��6�����x~�o�m<���k<���k<���k<���k<��l����k̯1���ۙ��v�3�����og~;�ۙ��v�3�����og~;�;X��;���<X���`}�σ�y�>~~?������w��;y~'�;�����d�$s��n,���3x����MsT��R��hʊ�9*.p7r7��f��V�6�_�swpwrw�_��w�e~=��_����[���ƣƣ̯<��_Wد+qr�Y8���X8���X8���X8���X8�r��!�pR�.+Cb�$�71�����of~3���f�73���ͬ��?3���!3��1�Ka~ف,��e���]�0���-������da��Y؁,�@��W|e6�e��ԗ�WfS_�ԗɒ��9�5g�$'Kr�$'k�d͙��d~'�;���N�w1���]��b~���.�w1���]��k���j���r�W9ī�U�*�x5f�r�n�75��ܝ�]ܥ9�l�+[��ֻ�������ֻ&�71�����F�f�9�lT+��F��Q��Q��R��j�,�L�H-�l	+�ҕ-aeKX9��JW�+[�ʖ�ٹ;�;���Kn@��oe~+�
��<G�P��n�.=��	����Z���,T~*?���k�}��X�8ҬiV�4+G��#�ʑf�H�r�Y9ҬiV��6�n���1�iV�4k���<�iV�4+G��#�ʑf�H�vVo�4+G��#�ʑf�H�r�Y�ˑf�H��w0�����`~�h;��+K��z�i��ſ�`e��������oF�~��I�KHJI��~����� ��?�A������� ��?�A�������(�G�?
�Q��������(�G�?
�Q������$�'�?	�I�O����$�'�?	�I�O����,�g�?�Y������,�g�?�Y������_��"���E�/�����:��A�Q����7��/x���2U��|T��*�Qe>��G��h2M��|4��&�ф�&�7�	�M�o����߄�M�7�߄�M�7�߄��U����~�ڿ��ko�q�v�H�J�}�7Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y�L�'���d}2Y�L�'{�O%���2�[�S�WBPBTmH<���-����h�SB�?J�_s��^�¼����*�`}Y	E��6�ChJ0%t%%L�������RyHȹ	�c+�(ҥH�T�"]2s�
�^����/��"*!)!�5���^��]	C�d�/��B��TM�a
�L	]	
��-%ܬ�I��Z��%&g^^	A	Q	I	Y	E	U	M	���������yĦ����p*��p*��p*��p*��p*��p*��p*���*���b��l;]���l�S�W��[�n6!)!+�(�*�)��Е0�0��� 2���#�<��#�L��#&~��MzѤMbq�H�^��E�^�|sѤ���3Wt��\љ+:sEg������3���]U]ѝ�KW�u�XW�u�X�J(z�Xo�'��XW�����*�q	0ui�!����K{�uui��P��V���A�K��ҸWOz�	�	�]<����������P�P�Д`J�JJ�JXJ���TN��TN��TN��TN��TN��TN��TN��TN��U^��U^��U^��U^��U^��U^��U^��U^�TA�TA�TA�TA�TA�TA�TA�TA�UQ�UQ���j=���n�4����?�?�/�|UI����_���Cԓ��\�F�s�T�]���&*o�0C5��^d��2�)](e��"��\��@��«�̕N��K����6�Dv���nǸpK��nǸp;ƍ�+��n�F��V�y���g��=���n. u�=ㆢ9V4�z�-H"��;``�(Xw�1�@���0@�L^ s�[Du`��A��S��Ʌ�x"�UdQE�J
�#D�XT	�J,��)N<�	���	J�x�K�xn�Gm����ܙqÚ8)����
��8;wf����wf���R�e��bKW��0��|f�Ù	�0��|���Q
�-�+���[���5����*jV��`e�8x�U�X��*���!i��4\��f��44�Ә���2��PgRي[���1;y�T�B!������
X�9���t6�w�e�-�3 ��2����o<��0p2�	��N�j��&D5�(�dQ�)p\���O�ps)��s�x.����΂`?��by/�{1n�ѻ��q����[�r�ny� ˹�R��)y��<<%Ϟ�����S��<{J��gO��S��)yxJ�=%Oɳ���)y��<<%Ϟ�����S��<{J��gO����)y<%^�z����S��<{J��gO��S��)yxJ�=%Oɳ���)y��<<%Ϟ�����S��<{Jgx9��g���,���>�}�ed.#��|K89��'dz�����\�j��\�#d.?����b.��O[�ο�p0��/D�H�E�Yp;��7,�+�;��ᄕ�h҂�l$^2�ĵ'_{6����[�<a�
���>����z��z��������>������}��l��}`k`��(n�C3B�p7&�7)[�ZE�z#���^o�����z#{�^od�7���Fx�����7���FV�E����Y�#���^o�~G��X��0n�},��7?
ǍE>n,V஌�p���▕oYqK�zc�-���Ʒl�ecQ�G��#�Q5�9�aQ�7{Ա7p�:�vdG;�ю�hG8ڑ툳��1nnc���G�ߑ��h��kC��w�θ;pw�݁�3n�;�3����G8�3��rr�� &G��3ȅ���d�3y�̶
Q�^��<!X^]�`�ܶ8!X>�,b݉��D�;�ם�u'���D^w"֝��Nĺy݉Xw"�;�N�u'b݉��D�;�ם�u'���D^w"֝��N����9�X�"/G1I�$�}3n�*�C���+r��DU"B�ġJB��8TIU�*	�J�P%!TI�$�*�C��P%q���$UB�ġJB��8TIU�*	�J�P%!TI�$�*�C��P%q���$UB�ġJB��8TIU�*	�J�P%!TI�$�*�C��P%q���$UB�ġJ�nb���tە��τ��;P�ⱍM���ml�C��#�,����G�~�$Ɏ~�q\a�(#�c��nb��"�B�@�����f��<'���H�y��!���!~����fX�^t�Qy6J���=�F�UY}pB�Uy{'�^��Y�8���+Wk� ��M+�
kC��[6v��9��j�#7Ȫ�k�k��j����[���x��a����c��dd���3=�]��o�C��A&	6,�tl�^�W׶��״v	M�^ �-
��JbXI��L>�5G�2�u�ĥ�#X���AL�-����47٘<@�L>\�,�U�_�O�7J�}�_�X�-�k��#c�5h�q�c�X�Ơ��k�Xc�5h��[npˍ5֠�Ɔڠ�6���X���x���'ײ�4��<���C5;�f�j�k2�H��jv�fg��P�Ϊ١�=�-���u�C��e�l��Y�:�v6�o�:��e�l;�c�-���~3�䓿;���l5;^@u��;���"
2i<;�a����K����V��w����:�ގ�"#��:+r�E�l�;��"c�������9���`�P��6�l��m`�t�������
(�H�����	2_+�`�P��� ���:8x���:8�����l��`=0x���~�ɀ�֓p𛽁(zLZ]�_���Q���Qh�~��s��Z5�U��dBO&�Ʉ�L�r����҄Q�<�8���<�o�'oN,��bB!&R=.������]���xr����
��)���3��w��t'��;��%S<y�'Ğ<�K�b�h�d��Y6N��I�f˵8\���|m��?�
,^��T.�T.ީ\ة\�:/��_<;x�t-~.��œ�`P���
�oz�y�ų����28&w�I����
L�us<�Y�ُ��Hu����\��ُ��u�����'��7��7җn^n,�
|��3�;�|K8"wa��9�a!nN���ܬ�7T��L���ڼ��?����ܼ���eG��M�n��Y&�t�%�fEF�$fJR�;3SN��Ȫ��N�w�
�t^2��N^�Pd��
�\'�:����%��W�^�>r%�ǟpf��2ف�s�G��r�����u$I���/���A�I|\&$Ʌ�G^�$�!�u�	��R)�0�,.��x����߳g��ĺ��~�����+�o9[���y�3E�C��lĹRXΥx��:�[�B�Gp�|��}��x܁ݲ~��I����
a�H�;�������"�5����'پ�حЏ���Z�u�ny��]�d�ᅧk����s�L7�7ɦ6�$I����K+��F���>X��2v�����/v�Q6~���z:D�����u��yv� �7x�w�(߭	�؍!��4FIA'�
Y>E��dz$/|�����Nb��\�.���줻�r:�u
��n%s��ڭ�.�r���x^s�V��{��J���v+�g�ݭ�/��'ђ����a9�
����,�����0,�b�~y�~)cX��K��~)dX���ay�R��_j�~)fX�E?�~)gX��%z��KA�
�~�tX��9]������yY�����(�#�G��_>Z�"�G��_�̊�/%�g��"�K��J�/U+��+��I��R(��q=�kw��Tb��Z�.|\o�?�2�K���/�+��K��R0�2�K�Ă�\R2�2��:���-)�X��jb�uj��U�_�=_E��/����_������bU��U��
�
��W�
�U�W�8eU��}5�o���
�şYg�|�r߆��gږ�R�����
l�8٬qح٭�� 7���߸r�Ҏe���.�;�:�K<�:�w�߁���R&�:�߸�7.����?�~�7Y�%]����/~��?��!��O�?�
�	�O�	�S�#�Zg�	�/�	��҅��.���~-xY��/���e�ּ,�ע��Z���_�^�k��~���Bܽn����~��
��࿁_Jh�
�RC������f�K����x[���v?��(�G�*;��F��Gx�c��oYg���[)0�~��I:lJ:ٔ�}|ܶ���cs�]�t�+?J���}|�W��>>�+��5O~�ȯ�����/�A��G~�ޝxp�����Fa�$O?P.3���}��$Ћ�+�M�z��KUF�}���K��Gv�U6��:U�Sq�[<^y�6��^��@7�w��}	�>�&�o���&��7�߀�	���偯/�&��7�߀���~W؀���	~~��&�
�M���7��с���]�w��������.�;��?�_���?���C���������?�~�p���?��)�'�O�?�
�	�S�O�Oq��K�/�_b�졔�S��||ܸ�|%�}�ɔ�y�v[�>Ag�P��g�ߟ8�K&�G��n�^A�����w����Q�(Y����=�,%!�##`��w��T#c_�˾�W_����$�oΕ9B��L���7��K��ς7���/s��m��r�H�����K��v�Sj|�9��S���&HU�,_���D�������z�У��Y��*��	���x&�K���������I�'�O�?�	���O���$��g���?��Y�g�ς?�������"8O�[ᫀ�*���
_|I�p��
_|U᫂�*|U�U��
�$%9W�o����*��M�7�o���
���o���I鰼�H�μ�Y9�Y��{���G�'г��שBo���;�C��%�#�� 8pJ}	�gNɬ/8���g�(�,b?�g�Y`?����Y�~��"���~����٭�,b?�g�Y`?%�a��_�g��,b?�g�Y`?����Y�~��"���~������,��E�g��,b?�g�Y`?����Y���/v����7л��S踾��;\���"v����v�T�Y�G��rr���]-��E�j�]-b?�g�Y`?����Y�~��yi2/
r3�i�i�Ӏ�Dn���7�7�o�o�߀����w�~��\��RS:��E>��"�<C��g�|�3D>'�ح�π����O����\B>S�3!�)�������&�g��:��Ѫ���$�햟$$[��|*�R���#v�8QB`U�Գ��!�3�M��w�U;��)k�g��G$?ʐqjZy��)�P�9hU���OeV�:���u1f'0ޭ\8�:�0�������*���v��;���j�+��.��tη4f�w�[_��[�ʝw+pg��ط��/���yA��@�T���$�н\��:^��q/�9~�n9�����s�ὐm-�7�n�8bxM�Ёy�f:��r�r\�u�,�v�}�$�<�@ŀ�G�%�����\Nw�`٭��ڻy
,x��$�j��CԿx��������+��+nм��A^8o�{�7�W�|D�R�0��1r��G��v�.d�\I�g���[v+y��@ׁ��L�ג��2�xEx� ��w~�8雐1 o/�����{��"y�O�>d��6W=t�^M���P0��'����p����Wp^�}�U�y�SC��Ǡ��!b@��>>�9��享��M�:6a�IǸ�ޮ��!a���9����T�Mhg@�㔩?mׁ#v�
b�4����Y:+��{b:TK|��n�c�U����B���%��BV�V�n�Ւw�T��ē݊2,�\S�����"+�h\�\t-������y�4m�B:��(Pˀ���2�G^�㰜��'���=vI^Q���.�r��
2�.�3K�eZ9%�}0��J�Դ�D��9��i�v�<;=�ٝ��QU��Лm��ԁu�]wRϟV��*�����L��J��&�{�����h:`X:p��7h0�T�ͥ�G�?�L�p� �r���kY��U�*��`��c@op�p_{���3�7�`@o�!B��[E�p)�7B!ף�
g�*��{Hj�C��~Ld��ӽ[Ӂ�pr��ù���t�M(>����`��l�RI2+7��n��:�&$W��rY��M�� ��e�<U�2�'��i�/�߀(N�[ܙA�zw8Y�i�Rj���=_�����.��}�&��&4�{����%��K�3M�M(h:p�������q*�V��a�9�c�$CsD��9�/E8�sn�� ����M�E��3�wD���~3p�M<%]g@����T��'�X*ݓ��[I��X�T��'�ح��|�`�:00�t�(��@��n��R6�	M���2 �x�^�R��)�;�/�I���jn]�nw&�VY�p
�f�!��i���w+�׹���>�K�����������2�_�9G	<+��������e��lbK�ٱܭTzf�8������ [׿��]�Q]�[�%$����n�;((0�Z���n�4f���9/p��.���;j��5�n�|e0`z��K�y�1��� �{��hI�=�/�̒�������c�Q�L�Fa�~x�r�:��雁��,9�����^�b;y��o�	��!}�A�m2�0 �y?��O�"��4���H$��V�ڏo��k���πx��^bO�e��i�k'�p)Q�Mpg@j��0����۟�ߞ��l��-:Pπk2�Ҡ��X�_;�O�t c@o�.E֚��<�O�1����-�WU�Zz����:�W��Ӳ��*��T�i���S��O[t�b@��^�.O+7��y�lɪ�)���8��7����~�б���yy˒,��|ON�B��-����򳷴cm~��'��Ĝ���c�W������ݿ��O���l��v��?�;��~�fi��?�	�8�WL��uI>V�+���r=����PK/WUW�S!Ypip/_vendor/idna/intranges.py}T�n�0��+�l�1��4�e�.����L"@�<I^[`?RR;��Cb����#��l�}�P�%�s�=Ѻ:�"=_�'��aP� W�	�@�-[��G��v�F;��`GX{��G
��[t����h�'���]�����P�uQB<?��CUU<���v/��C���E8x��I��ʣ�B��̀�e��3W���EQe3�"�]o����|v����K*/Y~H	�C�0�ZrY����n8I�?�2��ɾ)`�c�Xr�e�P�_g=��PA$7R�z�l��bp��Y}��E�&*ذ��Y	n؟H
�'��k.���b��y���5.Kx\�c���5p�ĔU�~zJ�M�-��H@u������e,���g_�2��N�u$=�A\X�ST���
�֛pV�L/V��`^�;�*���9W��lQDM�"Ԁ�������$��q-7�ZMo��ͼ��C��b���4�LA����KF�DŢ+�$`�D�#F>A\/6�4�z^o�ꢸ�M$�Qv�~�:�$��8��l��K�M\�[�y�_��ƍ/b�^�#<{Em
o����#������>C�Cm����s�iݴO��r�Q�5��m'5r߷���}�0ϟ�4�4i���x�'(ِ�S���ElFox�����ƒO
(Ht���yT;b�u�J�6X�P�LI�}h�%V���p
o7�$�7Sy��u��i&�'�Û�zk���*���Q�3���V��>۴w�oe;<I�^��]�J���������;�W��ǜ��P�PK/WUW5�(� pip/_vendor/idna/package_data.py��/K-*��ϋ�W�UP7�3Q��PK/WUWpip/_vendor/idna/py.typedPK/WUW������&pip/_vendor/idna/uts46data.py���sב'���{f,O�n�ro��wOխ���x�L�G��<�VZ$%K��̛$v�ྃ�N�$nXam���E�/!��;�����/��Сp�wu*3O�<�y�ݲ}m���^Y���e�/g����Y���+��՗W����5/����]��7V��+^Z��/-_��;����~����,<����xi��W�ΚW~P[���|畷�X�l�o�t�e+V���[k��_+�^�e��Λ+_�����z���������w��-s���n0O����q����g?���/���{��?_��e�
*?l�a�w���˯,���/���������.��.��+V�W��歟��Ş����;�����w�Z���x��7m�_�������ߡ�w���WԿ��߉�wM������g��
��\��P�.��h���A��h.�
��C�hN���E��hn���G����5?B͏P�#�5?B͏P�#�5?B͏�	?�I(4A�#jS��M5!҄X*�PՄDj�P�͏H�#���~DZ?"͏X�G������Kj���I��Q_���%I�<��,��g�W$5yF}URkϨ�Ij�u���Ϩ�����uIm<����u��Ϩ�%�|F}C�ζg�7%��W����z��-���k$��I��}WR=-�����T���J����$UkhEkhEkhEkhEkhUkhU�ت��U��?�V�`iW۪�Um	��T�%�jKPՖ��jB�	
MЖ��-c�T�D[�D�9�|N�eL4?͏D�#�H4?͏D�#�z�h�K��%Z��w�'���$�jB�	�&T4��	�&�4��	�&d��Є\
M(���Q��k~�5?�u͏��G]�Q��k~�5?�u͏��G]�#}j��,�T=iR=iR=iR=iR=iR=iR=iҚ�z%]ϝ�n���ڠ�ڠ�O�/��
JZb���i��ie~�%�/~�_��u�O�%Ys.Ӝ��NK�_�I��+}�ٗy�"x��3�H.�^�ZD�m�޳x�${�⽣����1I��}�${�����II���{�$�;�y��e8\�e��=����Qx�wV���;'��9|�${Q�wA����d/�.J�w߻$�9�xY�!�AI��$r�d��$C�W%r�&�z����
I�G$��dpzL��i9�spzB���II~��|�e�>s��P��P��t��t��t��t��M��Wh�����M��K�ms���B��B[�R��(5?J͏R��(5?J͏R��(5?J͏R��(5?J͏��O��]�%h����k�m~
��Etͧ��O��{�����	��z�k�m~򽿑�A��x�o&��c��'�}D7���mD7���D7���]D7���=D7���}D7���D7���~�~��a�~���Q�~���q�~���I�~���i�~���Y�~���y�?��-��������)��.��)�rZ���&�D^P+~It��*эX"��:эX"�@�?Jtm]��/��][� ��D��6�����4P?h'�^|�?�$�^�?�&�^��?�%�^�?_M�W�����( ���(b������!�ي�5�? #[1F����V��!��ي�>D? #[1Fq���V?+�'ي�g�$#[1����ddM�1���dd���U𓌬�U𓌬�U𓌬�U𓌬� U𓌡�$U𓌡�(	�9Ht���&��g~�u4�� ?�蘈c�`Ws��~�@V� ��[��j&�j&�j~@V31V3�VS�d��v݃����ir�<S?$O�f�Z�L��<՚aj�3��N�{[�!�Қ��5��ۻ��U�6���g퇛�nX[����g�m2?u������=??�Nt�*��t�b��/��R�r�Mf�n�T���DԽ�n�!��2��I�{Cq���+��!�ŮC4�S/����j�B��&���l2�&���c�%:4�8��N�%�|K��H=?$c�c�z����U�y��&�d^�?�@t�Ï�uA��+D7�b�^#��2�ÏiFeк��CD��	��!��[X%W���x�j�{��hэB#���VIύ0���ӂ��Gdhs#��>"��1��%�Qe�>�Ot���}t���<#b��a��
o>"C`�vA�#2&x^->"C`�xA�
�G䇙`^Px�����	��ױ��3������
��	��׺�~Gt��	���ɇ�+(a�s*���&�����
gJp�L�	�%8ãҜ	�����Z�B��nu]kZ��߭.�k�����!�ִa�[뉮�"�wk#�5?C��n��t^*K뼄&�"�x���FN'��Ft#'�o� ��‰�v��	��[{�n�p�}D7rB8���9!�x��膟'�:Lt�O�?<Dt�O�o'��'‰�N����[��n��p⭳D7�D8��y�~"�wk�膟�ݺDt�O��n
��Q�[�D7���=$�"Dwk��z�
��p?���S�/C��v;ѵ�"D��Z�{���luo":�.dc�����h�t��*�8]�8���D7ځ8�m�^&Nf^;^#2XKB�g�K"{��Ed�	G���{{����В�-Z�E�-�
�sQH�M@	4Ol  p��Z��	87�p.i^+���6��0~Cd�:�)�ˌb?�?�%�շDf�E�o�At?�?�"���r���>Q�N#���A���jD��8LtSY����4B݋��u�����Lui��(хhQ�f'��D�?t��D�;�;�)S��ZBE�
%�>�@t?�)=��d��~w��E�{+��%�����MD�ux�zw6����n��OHO�^+?"��W��|��
�1��ܾFt��O���}r���6)U�%�w>#��9��E�}2At�O&��9���]E��!��z��!mLu�h�z��� ��N�{���"��n�{���!��^�{��YOt�;��9g#ѵc-���K�""�tG�="Ԏ��"��Z��1��L<�P?�߂h�d,}SB����>��0��s��Ɯ�v�N?ѵ�!
u�0ѵ��Q�s��f}��p�8э4��9It��!
u�4�
?��s�膟�B�9Ot�OD���7Q�Q�;d�M**��d����Wi��B�q,���e6ui�Xw�/�cZe�Ũ�[��&������9�G�ϥ���9F���V�{~��Ft�ϻ>�,��di����[��;h^Zww�K��.���pw7ѽ���!��w��K��>�{���Oto�� ��w��n?ѽ\�"���]i�bĺ>�Lt/�O�����=�?&��W���U�{�z���^'��7����=�?%��cD���t����<AT��I�{�*�����k��y���W�D��w��It�ѡ��D�����Kt�z�C�7�����MD��o&:�ѡ�2~�#�1�r�%�^�c���=Nt�fĨ˹{��z%�Q�s�4�J�.��Y��8F]���D׫E����D�+q�������W�;��dI��=��.��s��s�K����c����0u91�r��0'��$[a6�q~��H?��Cb�Y�G��f���=�S53N���l��qb�|��Q͌/��3��qbo|��;v�h�6%)1��h���c'|�VjS�c|����'v��hu�?�?T[b��{��׍����G����(��G�����C�#{g
ab�3�c�3�c�3c���#{gJcb���#{�~"�~��9�#�~��]f����=�w��'��ޙ��1b��ޙ`{�s���ޙ��1
g3�31 �#{g��
��q��>�@
��q��>y?
]����}�{z����>y<
�{�q$�>�:
]��8�}�r:��N�>�7�N(F��>����!�5���F��O�77z��}��&B#Bs�쯉�Ĉ��'�k"41"4���M��}��&B#Bs�줉�Ĉ��';i"41"4��N�M��}��&B#Bs�줉�Ĉ��';i"41"4��N�M��}��&B#Bs��9#6s�줉�Ĉ��';ij�b��';i
ƨ.�Ov�Tň��';i�21��4�E1�4��N��
"4�]����W��H}i}���Z� *��ZN�c�]˩�H̃�D�r� �`#ѵ�*��<�Lt-�
�.��n䄈˃mD7rB���~"��`�
?_y��膟��<�Gt�O�T ��'�)��n��8ʃ�D7�D�Q�~"v��8�
?5yp�膟��<8Mt�ODJ�%��'b$���ёD7�D\�%�~F�ߪD���8��ώ�{]��q��D���g�m�8��ѽ��<���ѽ�q5O��#���>#�G�۟] ���>#)��鳋D����H���2��A���CD����_!:����5���׉�� :�?Bt������q���D�'���5�����%��紲����D�������w��sZ
q���n��.Es���*��N���!�������O�4d��8N��kT*�LB�0�2�a��}��m��Y��*U����`�۞V/�/O?�S��p��^�x�|ݣ?mnP�iΖ뒕��9K�t7�$0��b-�Ĕ&�.�H������n_&�^�tëZl~S1}�*��k�w���TM�2Ӎ�f���z��
ӑ�l��8���ĮG'�	�ۭ���e�j���r`�4V;���%���M��9�Y7�Wu>�ۆo&\Om36Z�g��d:LT�L�8s����>o:8So�s
��f�
�����	��sәA�G��>:ErB_�G��i�t��!�S�ԯMs�za$nZ�K����k�'5��M���l��@K<5�4�RHC�9id���֛��}tf�љq����)\�Ggn��2��>�i��25u�i�g[j�f����)�Oc�3SО�Z�R�"�h��
Kxf�₰�g�h���A�>T�� ,q��T��3��T0m[�Ĉ�d�RchSchS�h35�65�4SchSchSchSchSch�̌�d0RchSchӆnܙC�6��1�6m��5��w������&���i/;3f23f23f2k�S>3f23f23f23f23f23f23f23�03�03�,3�,���3�3�3�3���3YE/��p�.}t�Z
���1�ٷiT
��U����f8m�Bf�Bf�{YM/�q�2Ӑ"3�s3�3�L7ܬn�j��f��C���a��Yj�ôM�R3�[63(��oz��L�03�^f2��@��@��@�q3�f�ef��h��j��h���0��h�h��`�A��Rwh5��aLIØ��9��0��k6�)iS�0�FE+f�b�c�K5�!i��W���1$�DO��)�j�=Z���1
c$�uhסa܂�qfR6�[�0�����
3)fR6̤l�w#725��F�]��q�uh���(��L��Q꿓�ɝ�ɝ�ɝ�ɝ�ɝ������������W�w�]��}΍>��Zn���,��Ys�=��1��Xn�u�LG�rS�gZ�r]�f<FW�yC;yn�eڵ�F�sӨ%/����FWs��77�¸���Y�l~tc�0�9�\(������%��T���w�k��i�l\��t+R���)�+R�b�0��Q�Gc�����-�K��0
]�.��.��.�����0��xME��B�F�?�GXN�Q�L�k3JclK�<�H����ݣ��G��	3��c�ꕦA��أ�M�/��Hd=�ئ~m�v������n�k�b[l�&�_NT	�X�h�*a�9wU�g�)*/��GC��"����+�!V79�hr-a��ܣ
F`rXcu��G�W������8`�hr���|���4[�GxM�����MU�6[�2|<�mt廏&��_����*��l�w�[fX6�oLf�� h3�"h3�۠
u����fDɑr�x�m��6�)�
iS�}�M3X�imh� 4`��S�����G2m�Š}cž�l���좂��{�H�o��j��Ah"�AhB���V)�W�3��,��d�h��ɾ�,�Ah� �-�"�mp$z#�Kݪ4
̧D���c;�Q�(ѳ:�l���<�I��*�PO:�w��:�AFR C�d@�����H����F�ck��f��H�i���Uˠji�YbߘX�&�ւ�$̂�TIE��Ab�b\G�M������Α��B%&�H��fb��Abb
�d�31��8��U���fx_�7�����$3�Z����Lm�#�q��W�ќ�"ݪM�7�ٮ�5;M����޺W=��̠n�]���j=6�U�wԫ��uS��Hz��-����W��ւ�u*�����T��J.G���>GjgmjMwjP���0H�Z�Z�������Wj��Af�+���3�e��[V��	:�i�ۈ�'وL+ԧAo���H��s��@����toD��+<4)��5��_��3�����������}1��C�S[	�lc$����Fb ;���H�nF {�sӱ�87��sӱ�87i�_i`w:���H�#%��H�|�0"�s�!�c���ҤB>'�9Ɉ��)F�|N3"�s�!�����cD��<#B>�`D��"#B>�}��	�\fD�g�!�!F�|��a[�	�\eD��#B>����#B>�����	�O0"��V3��
��l��Dú
��l�*�q�e9�qK�)�7����	��D�%�{�y��h��πW�W��U�5�{�Y�t�.�d�W�י�Ue%ӽ��b:n`�Y�sty���Ԟ���o2�k�[D�I�5L�����f��=+N���;p��60Y��3��:��.�@8��
$��c�[Q�&݁��D�Y�Ldߑ�X{pօ�g]���9�	v�=�-q'� �1��+�y,��W�0���
�\+"�YQ�:u���T���E��2K䕓��G�h�9��d�ꔣ�5Pt��0����hC� Gk#�T���g�����j�����Z�9�����VgmR3������m�P��L�5E���—�uE<�ቾ�t��N��>�f,��P��)��;�pAo�c��1F<�?�	��o�u1���vX�A �;�O�P*��y����m�s��U �x�|�k�N��)�!�g
��3�[�60��
�\N��)��I����;�{y|��1�яy=�7ʗ8�pF?a&Z_�@K�������+�ԍF�>h`0u��{�zL��a���6S7�3b/�A'���w�� a��fF�u?�g0u��{�R �����@�y#�ρ��.F,���=�X>���|�0b�>�3b�>f��9|滪���E(���Uq�r֖�-�{� _�e/~.B!@�
��\�B�|!������N,�T����Z,{Ys
��Xv�YDB���XFB�Ì؉	>_e��9|�Έ�s$�<ˆ�s$�<ƈ�s$�<���s$�|��g�/�F��ǖ��\N�����
|a�[>�M�~slő��6���ˑ��6��2��ȩ6�6�_�i��~{%tQ|f�oo�.*��l���Ѕ�䍰�wC�g6��z�"�̆��]T����K���a�o����3~{UtQ|f�oo���3~{atQ|f�l�.���l���EU��9��
>�}�[��*����]T��>�+��D��E�H��>ۋ��D��K�H��>�뤋D�����3�gӼ֑��>����$���f`�
�F�>�B�ټ�Q��n����Q��z�ɽ�Q�ϵ��Kܩսe�_�DOߩQ6���oP����(~��ő �Q6���pP���(~�Ƒ���Ǝ$Ȇ��;] u���IF��RӜ?t$��o�̀�r��?lo�.D*p�M��<�9�Q6���B$�F���$4�M�i��HB������$4�M��]�	�Q6Ŧ�nP���(�b�Hב����9A!ry�l�ͩ3G|fSl:�:��3�b{�t!�v�l�M_]G|fSl�.D&o�M��<=����cl���
�y�M��Kȑ��16�
���<Ʀ؜�����b6,�q��[L�����1��
���<���
�\�-�i��H��l1MO^G|f�iN-:��3���L�#	>��l��E.�̮�����8Sc�*�S�A�>����mޅ�3��E.�.��>/r�w!��y�k��g�ϋ��]>�}^�r�B���"�{��l���[���(��}&Gi��ȺWZ�B�l�Ms`Gd�o� /J!@6��E�#	��w���{�
����U�cl���d�o��4��eI��u�`�����`_0��jQƻ���w3�Z�qZ'J[H\ڲ�R�}Ƿ2"�z#⫷3"�z#�w2"����L-ii�K�?ˆ�����/8ƈ��㌈/8��������bDȍ�ai��Kr�̈��AF�'1">q��W�x����H����elUS'xB��dj�'��N�DU��OH��	����	����ViK�K�2Ǒ��yVULUqYc��d�neE��=�U�@bj�ܞ�V��"r5�3�*��g�`M�����&�X<ê��x��p�ϰ��D�a�0��s�?��y`����t1o`���,]�<=<�~���K��[�,]��㱎��Q73`v�e�M�:��Z����qq&�-���2ޮ1T��wh��x��P�4ޥ1x.��C]�x0鷅K�-׽���՟ø�9�˞ø�s�?�q�sW.ʸL�ƏhL(�Q�	�8�1��5&�Ƅb�ԘP�S�qZc��|_�9ߗ>��|_�9ߗ?��|_��DHoB�(���'�{��D����>���'�'�߄�>Qp5a�����?���|_���k<���|_��+[�=pU����e�s�g��ݾ4d�ϕ�xf)*�'��1L�W+j�'٫A�	�.^��B�yO�=�����+��#e�G�O�?��8��3����ޅۺ>��!梆�`LSG�`nj�.‰�u�
^�A�	�9�*/�!�h�N���/=��C
G1��(q��'����a��4�r$��z�{��|���R>���[W?�٩��c��?;��x���!���G(3x� "w���rYE��&o
��^œ����<��D7}�I��q����՝�µ�[4d�*_�N��wev�F@[g›��H����M�3y��<�6!PY)U�}8|�\�鏙��;ғ��O~�d��	�Ll͑�c�x�VF�ґ|�0#z����9��:��58R�����#E������A��h�#U��U��	��<X�L-|��
:��HB=��Q߰-����f��~�B���P�z��U�9�<ӷǑZ�m!4�*[�
)���f&lCeOӽ�`�n��H^-b�{���t�U�{&%L���to�LO���������x��1ӽ�y��^���t&z��	�����~vFLo!�Z	�ZH��B����@��j-%Pk!�Z	�ZH��O�!
���hu�E�9�g�o���A������3�s%�=�W1�s��
�7��6�ڻ���F�f}8��[�gM	M�f�o���Z�V�_X���Ë�@�f��Q=���
i�4\�N��]�g�~���QT��ÈW:��v�U���+�x�x��^=^c�7j�&�[V0�3~%�n���Y�t?EV3śG�_�&�w���;�b�>$8W�*��X�2$N��Q�輻#y��;�?*�	�;��A"T�Y3!�?_g���{'��L��+�R�"L��Dv7@����x�T�1T���b+��_lc�O�/�3����l��7 ����0�m�Zp�y����8�񸗿��p$Ϡ�����BJ�?	�_2�2G$���:���%�1I0b�+Gh��|��XU>�0ϟ�b�G����}U���X,���kȱ(,�Sa>ęX���#�����
��F��V�ˀ�����KU
I� (3�Fd��K�7�/e���E���D:�'$��l���HZI#i)���4��HZI#i)���4�V�HZH#i%���4+
��{a1'-Ĝ��ih�H�3�#YG;�6c�L�^Gұ�00�������?s
n<����ދ�?�6
nV���#&-�����jȦ�2�Yψ.[�P�b
cS�H�T��L�<d����쎙�'w��~rW���v�t?�kL�Ӻ�t��mx�ꋱ�O���o������/P_�u�?v6�
��ah�r�ِ�|��>�y�c�o_�7�/D
��b��������U�����B2���c;/���NЦ���B	H���H�R�X��R�X���+jBL�5�)P̨AP��F
�
7j&�����:�����/*<}��,}Y!��+
C_U���B��
7�0�u���+�_�h�j�@��P��M�@>�R��B ����a$�|�Q��B �_+�B ��*�B�"��鋶�st�H��t�H��t�F��tl���W�"�o������5�_xV0ݯ;��q�u��Ug%�����~�Y���'qï�o2��WL��}��^�o3�v
ӽ`�a��=����L���
�=��t�
���9�8��gE��=Ǩ4aE�Q5V�����^e��?�[�x�&�����q��)�o8���ۣX�pr��
������[����k�o�da}�6ַb�f}���Vx����*��
51�o��a�Мd�6�	�[�Դ�
S��?�я���
�P��A�P���p�13����H��*���:�yu��_��J3.2b��A5��+�T�\e���1�
������H�#)�QF���<�Dvy�l�/O0R�d{��7	A����ZF ��u�@>��@>��@>���@>�]�@>�݌@>�=�@>���@>���|70�nd����3���gp#��`!���VF�|�1"䳝!����dD�g#B>���È��o�On�_�6B!�}<!����`D� #B��bD�0!��Q�p�Hk �t�<����Q��
0)�FUH�#&�ݨ
	�c�D;U����Q��N�<L�͋�I�y>!�t�'�i��Hb��:d�*9��@���U��`�/��?�]���ņA��l�Q��x���j�;J�A7]�Bq=��!�䦫Q(�,y<�&�f��<=b�m�9f�m�|ȑ0���Z��CaG���6͇Bqi��!�M�|(��<b�l��⚔�Cl�M�P܏�x�M�"�Z]�M��`37�<bY�|�>�q�[>���*�VG�����[E��(��<:Έ�s*�|���T�4#�ϩ��YF,�S�g6��Q(�4y<4���s*�|���L�M�iu��K��4��Bqm��!��M��P�W�x�]s��(�<b�ܴ:r$�gv�M�#G|��Ҵ:
ť%���J�VGaѥ��l�M�#G���}&wj�/6p��D���0~�Cɑ �a6���R�@���0~�Cɑ �a6����#A��l�M%G����Ja#d�oz(9� ~�Cɑ���J�$�̆��Pr$�g6����#	>��7=�I�
��<4r�g6���R�(���J�$�̆��Pr$�����-�_d�$���E�	ȑL�a��yh�0�-C��A�ܴ���LĿ����W]��U?�J��m�>7��:�o^7��<?��A��l@�^���2�qç��_ٿe�6mSG���Z�H�o����m�H�o�o�Ӄaa����-c)̭�aa}���g/�	-��
ś�<̈Q�Q�on�e$r���5F" 7�����i��:�:�
d#	�#�Ԁ�2��3�jl���t�d$r�olg��Ɂ�f������L��3=W���e�!j8��#^>3G��ٴ��
�!�g�/	K�#g6��x��l^�H
�AF ��g�෰����*�p�L_/#|�qF �{���\-��9�ʂp��	5‘3'60��`�"9s�4#��aF ����@>Y)����2E�p�r#���c�@>��_�|/2�2�\�	����u6
�˛��
�3�'�|F��|F�l��f����gƮ0���@>��|�u](z��L���cm��_������J�gnv0��3��3=�f{y6���z����y���
7?���a$�3@��>�H[�1���=��a}�у����=�|C7�ك�����5/���s�7;����Ҏ����9��K;�|.�l��Ye)pb���k��+K~h�c����s�$@Xq��;�H�`yh�g}Á��zv�pܡ�^q�˧��#^>�-���@h�_"���)Jo�;N1���ܹ���sH�4w������5E��ݬUH�4wog��ǒCΤ�o��g?�%H�4��LQ��<���|��Bi�9��^�0�,$Q�'x�@In���H�4O񺀢��Y�%8��<ϼF��y��@4ը!�a56�g��M��$t��`K��hN�#���IV��ֲk����Z�� �4���I����Bd��ֱ��X�\;Of$��z�5���6u�1��T��3�?��_�#�s����8��i�፹�<��x�[ώ��ϭgC�in�fF �}� 
5w��Y�;�_�l��Q�5N�ϝ�釤��)�d8}?w�5���3<6�����o��<D��9�=����8�?Ǚ&��o�*;E8�?w��:�Vs�X���on������SDL�&YߐŚ������$ﵑ̚o���-]<�Ӛ�a^���|�R[�=�=^>�X��p��f=@/�����#�5���-����g��|�^���o�_��r��/y�~��v���Y�$��F ��"6��5.S�?�_���q�*�v�g+���)���{�;yH�͟bW%����� ���|�{���s���Ȟ���'d��/��EU��^�<����3�#@�k~�g#���Ֆ��Q�� �Qvϑ���
)����x�@�k~�5���c<��c�����[�|Ԧ��㼁CRl~��U��l-����U&�d�Rd�l]P�=?�Ʀ3(Q��d��3K��G�C��N$�oM�c��-�6�@P��%��½R�$;y0��l�bD���X7�s$�7�߉�L�I�M�SAL��c�!���Ԗ#y՜n�n�@��WDm����t�aDO;�I:���pS�kA��u��`��#h�����v_`�y�A��F�u�������bm�/3���݃���d�#h��=���v_a�x��".^��ψ�O7#B>=�@>��&��Σ�@>���|:70"䳑!�M��lf���������ӹ�ȧs#�O�vF �.掸���#�O�qF ���@>�H�D���S�@>]��|��0�t�e���,.��T^$�Lu��Ot�W�v]d�������T�F���T\����*���T����T$w�<���p$��Lu�dDL�]�@0=<u�=<u�=<��=<q�=;�`z�0���cDL���@0=����a{3"�zF�C��v�a�x�&B><A�u��<�a�x�[c;yz$°����v��H�a��!�����ƪ.���ƈ�8�ȋ�9�X��]�o�b����Z���������%�>ýRX̽<a1Y��=��W��8�ٯWqt�qt�$����5H\����D\����B\�����w�F-�$
UX=V����P����8�
Un�'���77x� ���
�1Vk�deCX��h��)���]��fN�1@Xm� �T��&
�cvQ)ͯBl_p���֮�P`
�֥�X`�
��GaU��WX"��
�	l���ۢ�T`}
��Ua
�mSX.��
C�o/k9�
ß�2@~�xBa�ߟ�����t�� �?]ީ0������yW�� �?R<C?��|��� �?�\Q���g�����wi~B~>�y��y�?џXH��h��0��䟇�3�
�sj2��3�
���T�
!����U��d��y�Axߌ�+›ټNa��A��!��\����^V���o*%!��5i������� ��='��9��P�E�/���'&��lݬ0ȯ�~Da����Q�A~͓JF�7�A�3���;�0�of��D�73pJa�_���7�J_�s���a�pDB~����m�ە��b��+��!��%�8ذ�PM���x7#㌠Z	UQ��.���(����˱�1�7׼�����|���E��j̀�[Xa�S����K��aXg�;�Q��ԗ�[��r�
F�˽3�/��`�_.�z
EЂè�ZpH4A|�U�7�fD�{{��
���VA�P�.8�����B���^(b�E�C{!b�icċǹl� v�6F�|��ƈ��s�����9���9j�x�87�/�1���\4F�|��ƈ��s���q�#^>�5c���v��^D�k�s�z�K��/3���D!Bj�"t�v�aM�tY��P����1����aM�ty�"�G%���H?#"��Q���Wm:���Y
a�:X� ���S�֢2?
Q��5�A��s��r� ���l1��z�fFPy�~���m�`I=�R@$¹X� q�����댠�N
8	�ugA$�S�
���<qđ�a�)
|���o�Y�(����*��3""E��&�����?�Ƞ�g�)F �>�(
|f6�1�,��=�@>�=�rU}i��<E���0/�(�qN/!(�9q�/�ȻL�h.�u$�h̾�"��P6�/����}1
�싡f(f_%C1�b���C�P̾�b�BQ.�/�Ž՗{Y��˽�+��(
�G�Ph ��@��l 4r6z9�
���BSg�����
&�;̋�W�z�-�xY��.^V+׼Dꆦۏ1auC��lLP74���uC��l�Q74��K;N�O��AE���K�Ԁ2����lPq�~��*#^�p�~��ct��ng������b�����tat���`og�;x������&DO��^��r��/��`��!�;؉Ao���;�;�t��r���Ah$0ݱ�ȧ�����`׸�|:1�t�[X
��֠�a����9W
��+�|xΕB><�J!v�J!������Rȇ�u����Rȇ�i)��.^)��3��b	��3�I�6i�;�Mw�+����y�M��G�'!�dx�c���Q[D?W�ڄ
<�&ӓ��~�R���I�	�xj����	��0�q�əDž���_����x�"�幅��0�>��?j��·�c�!��!F(9�d��	3JaQ/,�D��$|X��(�qq��QH����擋�/��O��Xk~�_`� S�^y^�������W��;�>�<Z��D���"
�ک�x��
��.�i 4�����/��\F�X�f��P���Y�*�^������g\(��'C\.�$l�?Y��̥P(�-3v#�8���#��hB���]��Xdz�/�b�Yo>Q,5F��Xm6(�@^BӱeuW�t�-�@'�b�Y0��yC�J��m]�/�O���'���];G’~et!j#�	gb�yR�O֭g攍~ѯ�/�FBv?�N��O��U��0k������C�o.�FB/�+8�j|bz�3^��x25YhQJϛ�+�w�q�q������R+^
�8�0D�u8�Y�ɿ�䏳,�6̍C���/t��3��4��O�+*�n}�W	?�6jQ�>�`�N��
E8�̒����O���>���[�:�n@�`p3��'����P���dq�q~�"4��S�q��K�'B��Y�F�b���R�	_0�����װJ��'�e�}�|�P��<�JۚjJ�K&
� 42�B��@�`�@^�Uy'B�f /غ�pٖa��2��ar������a	��	2��a���r�3�D�,_��B�/�����.�|��
_�Y

_�[}���x齤/���0���o1�ƻx���"^^/�b� d���jڀ,�B�^V(V �12<ۻ�A���h@"�_O��N�����-�ԥց�=973��~�����U�Fw��|2�\����+�k��`�k�*x-xU��j�JF��n /�7_a�Kk��z��
��W�2Z�/��@��1��Fp��F�X^Ո���T�1�2dnW)�S^2�+�����ڮV@�a)7)W�*�K�u�rWeO��}Q#^.��`������x�h���(ċe���]o3V#L��KGY�l_׈�*��f7�x����%F
�ر�
��#y�&?���j��HJ^Po�"��jT��@N
��Q@���j�fVMª)ċg�0}P�xB\�w��H�������I^���6�9 ��"k��/:
R6���u$x�� ���o�x��y���d��b�j�$^��V�9�����J~ԕ�r$PW��lBu�o��PK8ҧ�V���7�gǛ�1�;O;כ��01�E��mxi��s9�_��#�r�/-ro�b~�)��0/��+DqׁE�(nА(nА(nА(nА(nА(nА(nА(nА,nИ,nИ,nИ���`�k��;�
&���Ҵ��
��aR�������ҵ�����R�������Ҷ�����B#�/^~���ؖ/�)�|AY�勗߫�����4^���H�(h�U'�M������_U��v�:Ft�G
��Ft�G���.Ft�G���=��6�TÏ�3���8R�odD7�q�~���ƑP����]��V+����|�>�`��"�������F,�+���|�>`��"��ψ�sE�0#��U�磌X>W��3b�\|>Ɉ�sU�4#��U�糌X>W��3b�\|`��1�o��)0��9X��M���͑���l
�}n���gS`�ss$�n?�s��#�u�����	��Ϧ��s#�m��Hr���gc.�K�u!@�1�8Gdc.�s$!@�1�8Gdc.�s$!@�1���#	��1��8���
�e��&�5;i���4�kt���og��2A·O2bx����ۃ�1�LPd���^&(*���yF/�|{p�cGT	|{�#Fg�H�n�˺H��*#�u�`�uF,�"��F,�"��1F,�"��	F,�"����X�	׭#f�'�u��`��Y�n�]�X>׭���g��g��Y�n��|�[�fF,�����Lj�pݨ��C,���ֿ��g��b��Y�n�{�|�[�>F,������g��3b�,\��ÌX>׭�(#���u�g�k]�D�n�lr��׭�M�u���ɵ�["\�~6��uK����&׺n�8&��&�j��������ؑ��(#��eG��c_UA�ߥ�^���s$�&�ʶ<lb�jΩ��p��y��p"��Cl^�;�w��W�'�>��պ�	���Ĉ�2��yRԌ����@�Z&µ<�6к����Y��b"��Cl֬��o��5�-&��=�fʹ�u$��!6k�Z�4I�ج�k�I��͚�Vؑ��͵Ž$��f�\+�H��l�̵Ž�|�^od�3���T��������}|����grx���v�59�gW�\5�H��슚��I�͗�jؑ���+j�v$��슚��I�8�Js�p� G��a���aG��f[inv$�睌������Ƶ-�$xs/#��#a�;����-��x�����4��:�NX:�eF�;�9��6�þ=�����Hж�lQ�}���o�L�
^d��9�0���WL�`���q 	�>�2d>��Z��BX��+j�|r-��JL��f.CMk
jO~�_���e��^����+F���W�'�yu�����#֑�߲��f�RwwKS�I#�I���،+��_U̸Ҋ���ſ2�W�iiƕ�i�_�Y��Nd��[��[���,\�W�f�}��*��r�*C��3�u�<>G��vB��ͨ��x3f�gU��D��-GAC�-GAC�-�AC�-�AC�-'AC�-'�b��#h贅�-�o9�:m9�:m9�:ma�f�[.0�-ؖF��v�EF��xmK3��x�eF�|�bD�g�!�+��\eD��#B>��'����0"�3ʈ��#B>��L0"�3Ɉ�9�6�S}k�|��1��3��u0��u2��u1��u3��0����|��3��m`�����ӷ�ȧ�-��S}[�|�(���B>[��ƈ���T�g#B>;��ň��nF�|�0"䳗!�}��,z�w�ė�W
���dD��!�C��S4"˄�ya˄�ya˄�ya˄�ya˄�ya˄�ya˄�ya˄�ya˄�ya˄�ya˄�ya˄|xa˄|xa˄|xa˄|xa˄|xakXW�0�if��;�qM�ΟƇ~B��ʔ�Ow���R�Me�&�{A��W�M�t��Cp�k��n#s�hD6��'�snJ�{��vc'�{pZ�Bp<���v.?���z�1��r��!�(w��tv��{��xh�H�
FpZ{#�™vFp����܎}��]Y3��>έ��:���!���AFpq��5�*#�υNF �^����s�!�|0���f�ne�o�g�d�fFp_���@>�3�v�={�}�G3�v}j����=����U�Z47�3�v��.�!h�7���)v_g�6�Ѝ`vK�f��`M����{�y�4#�ݟ��g���%s��V����K��ǃl�K`~@=��s�-�4�mb�O��Aπ�#���bk"��ob)�ʁo�t��݌���q�^��W�E�<j4�[�D�u����J��x00��y���bn�M��i�
���l�)`fP��N��@w����q�q^V��y��e�<j����^�@��3�ٮ�A��d8�?��ʏZ����sm�ȧ�)����K*3�.�e��gv#s�"��z�0��y56/�on�0�y�
�5f�2�q�����"Tm4w]fs/(�hc��$��p�L�#��������,m�gw�������%8�?CQ���8�K��7�����ml8q\�/��j�^d���&_�8C�"�9��uQ͹��j#�9��M*���]��g�"#p<�X��j��0w՜=�ET�9�z����z�H��?��j��lL��sQ͙m<O����}��䳇7�j��d�!��<�����nvg՜?����1�3Q�1v�՜�5����)}�x]@Tsn�g#��3#�!ETs��]9���m�胾��9�}�8#p�XG�lnW�s��zD5��{՜[�ڋ���)F�|�v�CTs~��\�Y�
����@�Aߠ�䳝7}�j6;�"!�9w�����&�>�c�kD5gn�<ETsv3�?�j�^d�!�ټ�sQͦ�v"���o�D�~u&t�o�q���T˾h�~��D5gײS��fs�I�lnc����O2D5�ֱi@Ts������8您�|?+���G�9΄��$���S��j�w���p�g�Q�Y��\�8�x�t(�ab^Rc�ļ̎����9����v3Q��as���}�D�vp���)�dW�A��Y��
���<@m��6
8�?��%B��y�n��;8�?;ʳG��[�0v�p��y�#E
���
�I���9~��!X�z�o8�?���'�g���p��
j�f����Q��q��1T�G�g�x��#��Gx�™~�y�����<�p����N��le�g�g���ٽ�����~�Y8w?{�#p��{�xl����v�p�9�E��;�_��s�ي���`��5طMl�p�~v�W&������O��ong�#�s{�=8`?��������Pn~�cU(��=���}��_��.��7ϫg�|�x��r��oxp�����c�o����Q���QDt��_��w��8D?�KRH�����a�m�#�?w0�}x7#�o��C����ˆ�oc�`��Ĉmf��S��S_
��nw������7׸W�
�2E�k��~Ft��#A���с��u$�cy�֦s�`>��ӉqF0�N��`>�<��ө>F���f"���d�nr�]�Y��H-ng�29���7�GJj~��1��9��HX%�_b���,�W:q�ϵ�k�2�+�w�ܐW��O��y�o&/2+�q�lO�x>#�4�9�y����!����Axtw?#�9�"�4�������Q��+�Sψ�5�Р���;�.�K�G�w�cJ�W��b^�.�q�+Ͳ_�"�4��y����1^%�W��ʺ#�������q5X�.��?����lUM��`�r�m�?͓��H�4�"韓��"�s���?|՟C�^8����)���gY{��i�[�V�K��
�K��i�`� ��Q�|&XG���[�Z���\�#�ҵ�Aay�)�<s'X>H�̝b� �3w��I��<$y��+A�g�
��<s��A�E-/H���%��/u�&#Xe��g�$�캫�x)���F������eD�~�)�8��`�I��n~w"V��H�|3�z�$�L��83���"��Fgf#��"����<�%��Ž�Ӯ]<,O�JE�ee���c�,�-fA����`s��4�:�#١,^�bMܒ;�_�����YF �I6$��v�#;4��f١�N����%Zܒ�u�L<�x����SqKnK١٭����9*�C�����y�[r��";4{�#p������Sd�T�7EvH�%Sd�f�� �1�J";��d��k�aFvH�)�5�[\ewl�Dvho��7d��������_d��;y	@v����d��{3�AmEv�K١&�Ԧ�5��_���ϦI��q)�[r�)�@>��I�A���*�8�QB�9�&�8��Agn3�S$q�XC�ę��$��I�%H�̝b
AG�CH�̝c�I�eFg��u)�8ڹ�ZU��H�̝gK�$�vȐę��Z�$�v�Dg��G&q�^�$N7�LH�̯g�N$q���I��!���%
��"��]B$q揰|����"�8�XG��Q%�)�89v�ŀ,��x=C�/���7�^ds�<�7kyQG盵�$����z�� ��üs@&�/�U����F �I����2C��W�yeŢ��_������J
�c,O��z���5�3e�J�Ϯ|v��X@'��<C^��M�?����'��O�/�}~�!��PY����&����^�_le�K�xn}��ϫ/0�9��A<���g�s�3x���O�>z�=ӽa�������P����@�d~j�"��!�q� �m���kBڡ!�i�� �]��vk��(D@�ث�SiAV�5Y�duPC���#A>���2C��#��}~qTC�C�#A��!���?9�ҿƤ9�!�㌆ ���<�i���C�Ƕ�o2�)*�\P��7ʀ �p�?5�1�p���_�e���!�3��m{ȬAx��w|E�+�;�N�;��`��f��8���f�f~���|^Ͼ�e��ˀז��1��R�E����0x9k	v�_�h�%���{دYK�Q��W�,�b��V�k�q�Q�y�]���oZ���ӯؿ�3�5+ƯYeP��5�U<_�<d�e<_{w���%����P�5mu3T�|��H����<TOx)~y���5}����C� *c�S,�8��:�?XjS�0��Ph�5M�F�ߗ
4����.��V�h���z��!�|yF�* 5�D@��#�H�0���#_��#lH�0�!��a) !*>�#���/ϫ������]�9H�+�z�uA}26E_^��!���uQ?�
H
� �5��`. ��(�!�rX��/��?�-ٗW�S��55Bl���`, !�f_^���?y]�OA^74y��C^#�)�kT?y�ꧼ���OR�U
����u�]ء9�g
vh♂��v5����wU��U�z����^�ة9������S)Fe�v2����\@�
�:��ss;7��Q��S�;8���s��+���R#L�Fyu���F�
H����#lH�0�!�խGX
�G(vr�j�(byأF(�y=�](cq�zW, �.�k�~WU@���.�&x'�E27�O�H}z* ��0��^f�vPCP��z�!�e7=��X	l��
i��m�X�Oc!����mS�
���A�*bH�ۊ���qP7C5�h��Kg�T���G�	H�RӮ.
k�FXH���0�!�o�#Dtø���q�8�F��0q^�a" 5B�K;�(�q�a* 5�L@j�0�ڏH�;�����Jf�G����h�,��e3fG�,�(�1�-bLf�E�Yokby��%�G�.X�n�5�<�n���X�n���K.��]��1fE4n��#T� <�h��:���byT����Q^�C��օ=T.F]�C���E4F>PC��a{��!����<��H�=�a���a���a���aH{��!�~
�қx�֘M<�k�&1P��O�v\?y�z*���)�W��q�C�\�N=�q�Qe� �!/����v����~WU@�]���ģ��l�Qlcv�؎c���.��4�P��>_3��C��竧�>����|�����P�c6�
���O��Q�=f��n�}�Z�b�����Q�Q�cvѨ�1�h��U�=b����UFm��*���l�Q�c|��M/�'fӋ���Ey��P�� �ddd���=fg�t�����N��L@�R�yi7����s!�
�)�6�)29f9-�FA=%F��^�
�0��`h�*�̑��S0�W�S���S��hE�8Z!痂Z�e
�x�0��2
P
�S?������q�ہz���.������O�����O�v+�z�& ��6��J���*6����V�+��B@�)̲~*ٻ~*ٻ��P@�)̲���X@�)��~�* ��tg�S5���,cӗ���6}���]aӗ�읚����]�-W�&�OA^W$�w�4y)��E�N�|.�w#����-t>ٻQ�T��-t>�UTOI����VQ=%��z
��:/�wZ�E�N���	�'Ww�/r�"��$҂z2QZP=%�!�)��O�}�~
��'�H��$҂z2����L�����"-�'�H��$҂z2�y��*ZW��4߅���r����#-�S�9҂zӛ#-�7�9҂zӛGIKnD��܈ꭹ��<�uCC���2E�yEF�U"��؊�B�B�O
_Q���t�?[%������P0E?I15?+�<�+���0�"'��r�Җ�B���j@ ���O@�[�}��F����̓R}�<��(�U���R�u_�Yp�Y�D~�ѡD��}	�z�dL ��x��� r#����OI��k�L	T�TV�8,�d&�pH�2�j���`@ �Vd4:�<EN���Vj��0�B
�)2a�HEt�O�T�����"!�eԤ&#/��d�E�BZ�'L
i<��2)��D]�嵈E���E����}x��O�	TO�����zF�zRDT�PFA�YQ�g�V�k���
��RfA;�)�P�]�O�r?��(��R!�z���roMhHj�b?b��w�̮����ͻfA
��x�E���R���f�� �E5("��ب�jMٟLZK=}3^�ԟ�1m�Ā��ˤ��"KI*j@�S���=�?o@b�i�'�9F�
�6 �%4("�杍�9��q�
�1OҖC��ͱ���܂[�]uD9�Շ�|�"��v�A��TY��Jw��\�+��//1,�ԩ[�Z:׸��9.;u�5G��a�{�S��|��u!��g��٫�-�G3�܅��˞��“jd�^��MO~���B�,��B����}��^��|;P�swE��~����^yF��W����	����=���0�u�e%/Qx�v'#!��x���C_`����1=yF�_L�=��o���j�)�]�d@�2�����F
 )��!�U��k�3"�n#��v3#�-��@�ї�;�g�O��Y�3�������H��2TZL�J˩V�S��bJU������R��<-��_�̺\�F�u����B�d]��o�^le�o�**Byy��r����t_1����e���^i�t/��t/�b�nN�U���ox���{��G�{��W��9�D�u@���Z
�
c6�i�Z$1~�v!1Ǻ�����@q�T*C5<�V�')V�R<�F��'�W�x��L]�!Q����R<�B9_e��c�C;�����:ɀ(9dQ���@��,"�̀�'f@d�;��������˩���r����Se/�.*ECS�;n0 �1 *��C���Z�vā)�.��Bl��.D�x�4���]Y���ܬ�d+E`SM�R���*e�O�Ҵ�(�h/P�g�l����0���e�w�����L���u�?2�[��t��w�V�����{L��?3�/n�to���t�?`�w-~�t�X��Q���t�>ӽ?2�[Ĉ�����t�i�2ݫf�t�7֘��t�﯒���H���?�@�`�ӽ�c�������K�vz�2�v9ӽ`�t/����ӽ`_f��+L��}��^��1�v���L���u��M�J������~b�f�7�o�o2��WL����o3��
�=��a��L���5�=��t��2��wL���S�{��mA�	�3��	�2�O�������-&@�b�-&@�b�-&@�b�-&@�b�-&@�b�-&@�b�-&@�b�-&@��������bTZL�J�	Pi1*-&@�������E<�D<�c����t���?�=��"7�D��ܤ�DA{	U��Ĉ�vmfDD��1�%1�1�H�#��e!�� �~�D#�O3�hd�YF��P�A��C���D#;h�P�P�t�8#̵c�i?���~�ȧ�#�O�9F ����0"�s�!�AF�|�����~�ȧ}�ȧ�k"�}K}oS�(�t;��S"2�~����*Y�;:��;x��d�4�[���������;�4�T�t�D\�;�0�w�1�wlgDL�]�����110"&&uf/�bbfD��#B>l��B><��B><��B><��B><��B>l��B><��B><��B>�aP�aP��i^s#b��ej���Mu�e$�S
u1S���Lu�3R�3���Lu3[P�2��+�U�:yR#�7��k:*U��/3�a+���n^m���f��:e�o�-��VJԥLu��2!6R��O#�_�QfB><����\����&/�a��	���˄|���d��M�N�:���d�s+#�O�6F �N6��it[�Ld�����.�N(��b7Qة.�[(
��b	u!S]l�lQH�s�S]�M�X���S�T�T�?����x��L�T�?I���yn�S�\p��~.�{��]����.O�\p�'x.��<���wy�炻<�s�]���8�{V)������gnh����8��{֧��ڗ�ֱd��x�Q8�Dd�� ��L������.7��n�\5RKQ�(JT/Q�H��%���ـ�d@W���z(�Ո��xo�ȵc@�ށbOF�^;��#wB[��]
���O��Eв���Nv�H�&��v�����~���x���Dw�[��&����O3�M�!�t�;�<�D�^�o�l�q(v����e1��fY.�}�������6�jY[��@?L�^���E�q�z��w��?�ٖ}��^��K{DE�{g[V�}�?Q�*P����%<7<7��s�:P���J��r��X�/I�ݒ�,P/�ߤ���� о��}�e���K�������	�<l����n�x�M�R�E��ۄY�CX�aw	�=�a���'����=l����=$���j{DX�a��X���	a������a������a��^���a��^��oj'a���v��oj7a������oj/a������oj�0�~S��X��oj�0�~S��7u�0�~S���7u�0�~SG��7u�0�~S���P���<���顶����¼�>K�7^����k�<a�xM_ �����6�6�h�!�/Q�<CL_&�s��Y�<G��B��H�W	�iz�0ϑ���9��<a�#M/�9��b�Ġ�l����OZ�>1h!�Ġ�l����o?Z���h!����l�ۏ��o?Z���h!����l�ۏ��o?Z���h!�|��BV�������GY�ۏ�Jn��*0Y6�&�I41��۲$P���+7u&��c�4a�x̜!�����y�1s�0��3�	�<s�0�ϝ��ob�g.��y�2a�gf	�<s�0��6���9�<�\#����<a�g�s��}�-���:a�ݖ��v�0�n7	��v�0�n�	��v�0�nw	��v�0�n�	�-��L�o����v[!̷[wn2�o�DŽ�v{B�o�����)|{='̷������oJ~�b��o��e�@�~��܄�/�>ד�s�'3�巶,
�3���
Գr��������	q��)B���!Ίo��l�f��@��io�q~����᝽�6i����Sk����F��C��!�y�ӄ@<�C���B���.%\��!��o��p�7W	qF3K�~�g�_$�M�o/�L���ƙ��^B`���@7	��n�)��~�3џ/%&�CH�`���!�[�=�Yۿ� ̙�ߞ3="ę��cB��~E��қg�d^�&	svz�g�7���v���:!�NoiB��Ϸ�D��e�Y�-u��O��$5�g��q�y{���N�o��q�3x�c!�6���lR.�8HX�a4���&%,pyON�yO,��һYV�zI��}�~/���N7��$,��	<��Q����s��-��y#7M��W�^�}�ܘ�<���o�ȍN�"��(��/7&E_ڣ���2�jc�+{��X�����2��*{�e��(�{�ӛe���i�Hޗ��[�2�|.є��6����Ӗ
:�:��m�.O�0�,��-Y��h���R2�8r�H��3�x�,P��'�~xn \�/�� ��A������0�Զ��0�Զ��0ﴽ��0��0��0ﴽ<A�w�^�O�w�^�$�;m/ �;m/$�S��杺�杺��杺��杺�����^>N�o�)�|�� ̷�4a��N���a��f��w�0�~g��w�0�~���w�0�~��w�0�~����U��o�Y�|�]!̷�U�|�����a���	��@�o�E�|�]'̷�a��n���&a��n���6a����ۯ��
�p��=�|��'̷���:2��Fo+Mz�^P֫��^6pu`#��I��6pu ����;ד�̺����V��FQ�	�	�w�� ����z��m]v�z�
z#�'Q��V��&��2�?i�Ć��(��D[�I���m��fڇ���e�>SkU�QiG-P������(���eV�Kq�H(���DQ-6fmY$�5�}q��ȵ�Y&$�(N��sُ8ֶL�#��DӖI�ƹ$b,�/�e�zr�b�xQ\�Q����֖��][&Nvm�t��'��DB�iˤݒX�s�qN���%rbH�Ŷ,�9�eb���T�4I�Rі���~O� p߯-�W*)m���Ĉ�u���X9$6`_�@�er\��R#��L�/��Ӏ���~[�O�J��~���Bb�r>0��[ T�_l��V.đ���L���ae�-�rՖ�zY�Y$�,�v�bi�Ln<�,��n@	���G����vy�.�b�MX�a{K=l/a��f=��;�m����C3��A��MVx��J;HX��6�ÄUv���Î�xر.��q�0�S���8A�O�i�|b�$�'�)�|b����4a������,a������<a��.���"a��.���rLP)�-��BJ�m�P
�29�Rڎ
)m�er�PD��Fr�(��ږ���!��Ln��Z�"���l[&Ң��B���Y�W˅�L�e��裲�<(Ბ�P��29.Ÿ-��7�!�h 老e��T�`�� ������f���H%=��k�^�*�o�QFU`���~F�㷥�p=��d�2��Wm��7����=��U�
�֧c�����p�@�UQ%_��*Q��>{���
�U��YK%'���t����l�wڇN�[��
m�i�w�6����5�6C�����i�'�xn8Aũ��S91�eb�'�ؤb��I���q��T$o��� -%
�7�r�����-��iK�\[1~6�m˄=�2�[����2Ƀ�,�{�j�ZL\��JN[&��:ۗ���	�-���1Q۾<��eb��[a_�������z��7f��y��b�JX�as��v�0�a�Y[ ,�E�r�NX�aK��v�����$l�a��<�6a���!��]���G�o�����{@�o�e�|�=$̷�
a�����1a������)a������9a��^���%a��^���u̇u!�O��F��l�2�Q�\��TʭL�Ӗɍ�m��6�y3�g�u,�Ѿ<����Ft�0�<H��>�d�9�����Bߖ�m[&$��LL���&�S��~��C?�R}[�'��,TO�-��GV\l˄����P����'��
�Nnm�8�r����S 7h���@���rP�/�WT&�18�`+�,Փ���A#m9hdځ*���'7;U �YE2}G[&N�U�M���n��'ܻ���đ��{���Չu�R�8P��Iu�S�4P��>RE�^[&6}U䩄'����‹�x�/��S
���@�&�;4��[���#B�U$C�U ]�rC]�r�_����*�B���\B��V���Ʌ�J21_T^���H�78f��Gǟ�8�S��o	pۯ�#��~F��x�=n��-�?�(�O8.��G�&�1�8��� �Ưp��5��!���k�=~K��ǿ���;�=��g������=��ȨALD:
b"ri�H���,�D��pL��ƶ9���������AGJ�8�qő��(�LDq�� �#�=QY��H{OG�{�8�ő��(��Dq�'�#�=Q���HOG�{�8�ő�(��Dq�'�#	>QY��H�O�->GL����1߾#&��w�D(=�D�<�Dh<�D<�D�;�DH;�D�:�D�:�D(:�D�9�Dh9�D9�D�8�DH8�D�7�D�7�D(7�D�6�Dh6�D6�D�5�D#��U
��H}�Hq�He�HY�HM�HA�H5�H��G
"!�DB,��8M	q� ��@$D�|"!�	��H��DBd�'"9>���H�O$Df|"!�	���CdS!&"�
1yT��H�BLDb"ҧ�;����)�DdM!&"e
1�R��ȅOLD�b"ҥ�+���D)�D��EL�K[�D��EL��Z�D�����nsr��':C��Q�~���Qo}���Q�{��Qoz��Q�x��Qow��jQ�u��RQot��:Q�r��"Qoq��
Q�o���Q\�IY�xc��Y��E$�b|[��h&��en8�H�,ID*���"Q7�*��HT�E�J0\L$��V"�W�%��H,�eDb	n"Kp
�X�;��\@$��!M��zHT��C����\y�h��m��2��,��f)��D.H�D.d��Y
)�h�B>?�^@�����X��}4A!wQ���z��G�C�>��������L}D=��#�U�YiJd�)���DV�YiJd�)���DV�YiJd�)���DV�YiJd�)���D֚YkJd�)���D֚YkJd�)���D֚YkJd�)��T";��mN���DM�5���$�Z�8)q~hJd�)���D6��hJd�)���D6��hJd�)���D6��hJd�)���D���D���D���D���D���D���D�y�-SDH�SDH�SDH�SDHӓ�7�SdF�SdF�SdF)2����D��h"Ef4�"3�H�Z&RF)
����D��h"Ea4��0�HQM$7�&R�E)⢉q�Ċ�hbE\4�".�X
�!?#@QM�(�&VF+
����Ċ�hbEa4��0�XQM�(�&QF�(
�I��$��hEa4��0�DQM�(�&QF�(
�����e��hE\4�".�DM"�LU&UtE�*��I]Ѥ��hREW4�ԶL����Ӗ)ڠImФ�6hRE4��
�T��Q�A#ߣnˤ,���mw�����h���Y�E4F��QdAcY�E4F��QdAcY�E4F��UdAcY�XE4V��UdAcY�XE4V��UdAcY�XE4V��UdA��1�*ڠ��6�e�'&">BL���K2OLD|���)���[����1�bb���^>ybb���^Fyb"�#��L��D���\�����\������\������\������\��T��D�1����?z�≉�"Bz9≉�"Bz�቉�"Bzy቉�"Bz�቉��D�BQ"M�(��P�HS(J�)%��i
E�4��D�BQ"M�(��T�HS*J�)%Ҕ�iJE�4��D�RQ"M�(��T�HS*J�)%Ҕ�iJE�4��D�RQ"M�(���(���(���(���(���(���(��/����p�3�OT$N�W$N�W$N�W$N�W.[���D���D���D���D���D���D���D���D���D���D���D���D���D���D���D���D���D���D���D���DV�YiJd�)���DV�YiJd�܉4�&GV�Yird�ɑ�r'�TʝHSibe����&V֚XYkbe����&V֚XY+w"M�)���X֚bYk�e�)���X֚bY+w"M�ɖ�&[6�l�h�e�ɖ�&[6�l�h�e�ɖ�&[6�l�h�e�ɖ�&[6�l�h�e�ɖ�"[ڞ"[ڞ"[ڞ"[ڞ"[ڞ"[ڞ"[ڞ"[ڞ"[ڞ"[ڞ"[ڞr1������������6RL)���F��i#E���r1�F��i#�b�����6R.F�H�����v�}����HQUm���6RTU)���U��ʍK+7.m�(�6VP+
���ƊjcE�����XQ@m�(�6VP+
���ƊjE�����DQ@m�(�6QP�(
�M�&�jE�����DQ@m�(�6QP�(
�M�&�jSE�����TQ@m�(�6UP�*
�MԦ�jSE�����TQ@m�(�6UP�*
�MԦ�j���Z�(��(
�5�j���Z�(��(
�5�j���Z�(��(
�5�j���Z�(��(
�5�j���Z�(��*
���j���Z�(��*
���j���Z�(��*
���j���Z�(��*
���j3E�����LQ@m�(�6SP�)
���f�j3E�����LQ@m�(�6SP�)
�ͤ��n���'*Ҫ�i�抴jsEZ��"��\�Vm�H�6W.y�\Q@m�(�6WP�+
����jsE�����\Q@m�(��PP[(
�-��jE�����BQ@m�(��PP[(
�-��jE�����BQ@m�(��TP[*
�-�"��	q��	��1-�=�wܠ�{@��w˄�a��7��Vq��!n��qO�п{�E�y��7���F��sB��{A��w/	q��!�#޽&Ĺ�7;	q��f!�:�>��!��盽�8�|��g�o&q��f?!�>�LvDk�9@��ϧI�9l����0I�a�"f�$EІI��
�a&�@57LRDn���0I�a�"x�$E�I��
��&)8LRDp����0�a*"V�TD����h
S��"�5�&w��cٰ��a�"h�BԆ��V�P�nR�nRܤ����oJ��T��V��V��V��V��V��V��V��V��V��V��Q��Q
ߨ���BD왍ꙍꙍꙍꙍꙍꙍ�s0��"f?�E�H \D$�/"�fI3D���YO3P���4CЈH�!jD$�6"�f�I3���"GD��#"i���4C�!HDT�%"*f3ĉ��ED��"�b�P/Y��c�Eln��ب���ڐF�"�M�Hs�,��$�T7�U7�U7�U7�U7�U7�U7�U7�U7�U7�U7�U7�U�Ī���#C��(V(Q(Q(Q(Q(Q(��"�"��$E؇I����&)"?LR�~���j ����0I�a�"��$E�I��! &)b@LR����1�a*"�*v��������?�8"I�q����%1�L��Q'Hē�G(1[Q�!�Ķ2�}��F�?���Q�Ϩ�gT�3�����F�?���U�Ϫ�gU����Y�>V�?�n0fbϴ�gڀg~��dU��YՁ��@�s�71Ipb�"��$EȉI���A'&)�NL�L5�NLR����<1Izb�"��$E�I���Q"&i�I�DLEă��1b*"$�TDL����SQ!1���<����!6j�)�bCbHU3�������������������������������}J�MJu�x;P�:P�:P�:P�:P�:P�:P�9�D$�BJDR/�D$�BJDR/�D$�BJ���&4��O�T��"��U�{�*b��"�{�*b��"�{�*b?bU�~Ī���U1�����Ū��^D�8�E���}Miϼ��)�8R�q��"1P'H/"E�"Rdԁ��f-d�
T3 "��EBd.�q�n��.��RL��7�)n�
n|-nx3�����-ȕ�#��=/�������WZ�k���s����.Q�\��#�D=Gh�z����9�?�sD���p�K��}������Z�y��Q�9�>�s�|���P��#�C=G��z�p���9�=��R�y_�@�y����zބ{�4[U�r&,�u�2�ն,����7ݭ�JV�D2�O˯/5�HzV�~Ֆ��;m���r݋ė�2�ߺ�O�e��m�HԖ�@�@?�V��G�s���	q���;;��K�H�{1��?$�y�B���D��	q��	!��?#Ĺ��8|����_��kB�~�I�����T��	q����g�{	q����g��8�|�O��χIB�}>"����B�}>%�������8}�!���B����D�3��v��:F<�|26�,d���kA�fׂ�ͮ�]26�dlv-���Z��ٵ��@Fu ���&��� c�3@�fg������26;d�	���@��!p �5d��q��p�g�?�$����g�	�@$�Z�A˺'�B[��W��(�(�2�H~ �-�ύ����2���-_!��>�ڭˏ��q)�&u��u�����և
��R�U�:
�^&?�Xo�����lm�Hm���z�u&?f[��u>�[�����U��!m\�v������=�a����z�a��	�v���Ö�=�a��9��l�[*�CK�A}�M���Vy�]�j�GX�a�I��|b< �'�2a>1�c�0����0�O��0����0�~/��0�~���0�~�;	��7�]ˋس�n�<���!L|�.R9����m��P#���	z���m=�ˉ���zU`�1�}\$���uBw?�"�1��]B�'6�2��o'	ql����Տ�	qL�����o�X��BG��K�c�q��v��Ώ˄8n~�z^����]��2+�8�|��X�>!nF���g��7�}n��!��G����G�8�||B����g��>�g���q���+�8�|K���wֱ�3��3���R[�l��~B��ױ�_�Qrm�b�b�b�b�b�b�������'�$�$�$�$�$��l�m��D�@u�2/
�B�r)
�;U��=�t6��
��a*=Kr���LUb�*1��ڨ�4*%M�F����j[�R�LgT��'�Q)g#lԉ�� F�b�ڪS�U�nck�)��֪na�m�U�ê��r|m�)֪L�*����L�b3�ϙ��,0���L�b3u��T�g�g*�3u������MF&U�:S���.�\ݒ�*�s����%�U�Սy�n�s�Cr�Cr�C����|�zH�zH�zH�zH�zH�zH�zH�n��O
�O
�O
�O
uK^��R��R��RֈR�r�r�T�\�����Req���TY\�,.,.U�*�K�ť��Req_eq_eq_eq_eq?���Fp�?��>Ru���}�=��{�U����W�C~A��Bw݈��s��b�{MO2�^!��镁z2���B_jz�]k���@�*P�)T��*�l�b�/	��G"F���{$a�|������H�=bɿG2F���{�`D�i�/jї�;~��ܐ��ܘ�1Cn�v��!7j;~ʐ�ː�ǐ�?cȍ܎�g�
ݎ`ȍݎd��bhࠟ3T9���������C�ׯ��~��5C��o����!��w�^���{�`�?0�f�՝'����n�1n�5n��OA��?"b�M��G���@8�^���@8�^���@8�^���@8�^���@8�^���@8�^���5�(���p6�&�
�_Ά��lx-Ά��lx-Ά��lx-Ά��lx-Ά�D���3~�3��A�5�4���8���s�*�#n�(WA�9��=���fu6��a����&�Ê�M�s�O�+
�M�J�i5Q-�Z61Bm�����:D�#����?Bc�+	���;�� x4�}� ����9gYݳ� �.k������#ȹ�xq���DP�g]#�9���,A���{��8�9K�������_q���'��<�^Bz8y� g����9{���L����!bK�9n�u�)A�^�'	r�<E����C�^kOvT:@����]	��/T�o{#�C0jt�8�m�x���сi�`��]9{�/=#�:>I�����!��4��$�.�:{����Fax�A�^ÙG�^��d��������х[���̷Zv�
�_��aY!�*�~!�*��~*+���e��ӲB���EY!�q*��u�&����+����K�b+�����x���5�
d�Z�䍕�G��O�[/<w�U��Ƀ��+bTO�fl�����f띡n���öL�^��0k��W���5y�ny�=y�������ח|)�-���@���-��6p�?�ҔY�2`Ӕy�^.]�dٗY��ѲH�*�XSV�8e��eh_��e#��r_��R��Y6}�a�#�MDnގ	p�uB���S�lp�%���n�	p�aA�e����[)G;�J9��L�h��e�G̺�,�[����	7��~��Z�ݴ��6�%A�'9ˮ=�E.���J�/g	r^{u� �9A8V��M�3�p�3����}� l{�,�t� �M]=q� �o�=��>���ڄ@'�΁�}�–`�c�p7y��°}:� lT��xx�	j�w1y��!�`����d�3�,�&&��EL6�B�$/�L�����`��=9��N��GAb0������ٝoB	 24���'O��O�t� �YG��!�6������s�a��D�(x�[{�"�:r� �ؑ�.����M�8
��&�g�q�[�u� ���a��p�ۘ�=G��M�0�����?Nf�
<�
:��8-P��S�L��n�'W6�	�N]�6���	Z�pN?"Nx�8Ap�S�a�<E�Is8�� �{��%�3dR����1���iZ!0/�k�!"@b^ ���<<KN�yx�a�η�4%y��9������Q�`��,e�,�;�D�^���,�˙�Yr&�;�JS.in\��	��a0�M�xvx��[�]�v����?��p� �
�q�y�qn\9�0�l�����'&�N��;\<CL��@T��D*ˇ��2�֭I�`�[�����"�r�6��9��=�A��8���.�����".y��:�D��{D����2���<W/�1=���(�4��d#\�.�$�x@ލ+�W�����p��d���p�s��m��Vh��-����0�=�BL��AWg��yL{\>!�]�!qt�t� H�W����N�#����v�h�����gDx�>�uWC��i����7���b�����z����4���x���{��4V��:G�!�{n��}n|n,�Iw>�/�ip���S�\����:_�0�����q���
��8|M�O$v�Q�M��kt�U��kt��]��n:U#�����!$���[��}�=�6�e�죳0.�����7Z�_��x0K����
� �˭�	��p�u��N��:�O����~�y\pM��7\G����с����qut��˨�#����[d�G��RG�h�č������Q���rt����W�r�a��4� )�����rt���\�N�*�B����`�)���rt���̐�)�P#5��mV�rt�T@$���›�s;i���F�i��'�F�i��7�FgIAr��[t�Dz��9:�!��*ou�br�&�I&��t"��p��($�]�mRM����d��ݷ	r[;F]F��Y�rrt�&$�]���N�.�4�ē��� ����1�>d�\�M�D���e����rt�<9(GW�*�B9���~n��(GWi@2��,�THG9�F�"R��!�DJ��<�HJ9Z _AZ��"�=��rt��D��ܘ;ǿ�I�@~��{t�B���-b"hsW�� ��6
�h��i�Hݦu���2�i�;D*��FwH�n�-�
��!��q�!	(�m����h�k8��=�E	,G����en$��y�a��]5��4z�� �l�1Ap��]�f+K�f+O���#і�������C��fO�7{z� ���w�m�f6�	�}~��&<�O�7�>�"Tx�� P�%���4����4��(a ��	�pGl'5�����0Dv�'g�G�dD��w$w�v�$�D$��`҂��=9O���>���
�ځ9œ��'.�/3�e���O^'�/'W�u��	��x��$a����VOǽv�����I�`�#������x�c<�EPE�B�m�MI���O��!��>E�Blm}�>A��	"�w�r���k��/��[?y� �պv�aFS~��	�`�S��U�˄�����۸��
a#� (�1�k/aغ�~A����N"8�g��iA�lc~�2a��= �4��,a���o¡.м�K��h�@[�HBm��`��).T ����&u��v��z�9~�0��ZAA[�ڕ	
D�����=4��0gÚ4O�7�]Ν#5��A���caUZ�I��K;�֗h�Em}�,��7�4?O~a<��X$,�� F�6�� �Y�Pw"[�K�B�l���p�j��f=�<�QB�l}��1����/Z�E���e"Be�����_q��OX�_��ô�Fm�1�J���?!� ������(����;�6�f�p�޽ <��p�z�d,kGhJE�nc�c �K�P N��p�C��_��������
�<�`��4M/�m,�$: R7�E�E�nca�G���т�{[�#�� T�v���P�x7-wՍ��!V;N�Bu�4�^��ms�h�hRȽh�%�;�~t�0O�<J{:D�8�U Z7����u�W��#Z�6E�$�u�t�C�n|�����AZv��ex��^��a���+�� ���U׋�-ܢ��!ڟ#�7>���!�A�o|�Nn��_�`G�c�`�cD8��S]�@�o|��ߘn��ю��1��[�
�͍�/��XX&wG$n�$�L6M�A$n<M�A$n|��^��m,���N�9����t�C,n�q���St�@,nc�u
����=��@4n�
�q�tB4n|�,�h�,qѸ�Y����c6;G���ho�`��U��f�d�`�-Kƍ/�@��.�n�؈"7�LVDn<KS6�pk�����B� �
��m,������(�x��D�����(�x�v�­�xN��]WI�Cncq�fm������0��yڦ!7�AÈ0�&��Í���0�>�Q�m,> �!7~@LCn����n��6�	.<$%�1K��m,��c""|����@�o��v��R��1���,!��sR��� !���i:E��ň)�}�{.�|�����罴�B�o�r�>�%�!�y�����=�|��!����2�|��Ѭ� ������m\�K��|�g� �-�/"�y���x&c#ȷ�Hs�|����A��#:o �����m,��E��&��(���A��%�\!��2Mv^�o�8Mi����hK'h�� ��ٮ�JD�>�.�,�<"�4w� g��[������`��E��K��	�/-�"v�{� L�K����:A��N��L�/	�b���b�|� �K�Wh8��ۍ=���-?!�ɍ���rxc�G�t�,r���9Ax?qe� �S�0���!��/���ًc�f/���n<|��2�x�4	���DI�o�e�$N����G���[�t굛��~����G_����כ{�_�/��ގ|���g�g�g�g����v��u��w�YP3�YԮ�Q�"jZDm��q�.��EԾ���Q�bj_L틩}1�/���Ծ�ڗP�j_†��%Ծ�ڗP�j_B�K�})�/���Ծ��G�K�})�/���Ծ��g�}��g�}��g�5�}��g�}��g�}��g�}��g�}��g�w�}��g�}�ڗQ�2j_F�˨}�/��e<�P�2j_F�˩}������W_������/���;y�������/�PK/WUWC24�lpip/_vendor/msgpack/__init__.py�SQo�0~��8e/I�i�� T[��J���yM���n��'�	}H�|w����|����.`���D�lK켶�@��ufLj��V�~s�0��n��j;!Ɛ�ɢ	!������)\&"���,���B��eĹ��r��^;k�}}�~�~��c���Z��n��%`].'mj�m��Kx���@�VMS�r7�^��.����*R�t�P��!?a���m�,��(4>�+�{
�|^BTXC��6�U��l�{PnKI��h��a�wXz�m�T��G���<��bȾF�E�(�E�Pscm��:��Y���`�\9��T8'ɉ�������3��
��G��#�S���_h}����0���0ϩ�2��R�� �7��[�U�h�i��W���A��Mش�V18�dl?�89�<�S��hb�g��h�.m�)��h�x-�#k�[��V5�.w
J�XU�x�����}۱?{�F�?PK/WUW;;�ӭ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_PK/WUW{W���pip/_vendor/msgpack/ext.py�X{o�6�ߟ��b��:��im�ņ>�[�b�֡(ڦmm��T��>��HJ"-�q;!������#�f�8]����㧝y��p)I�T�Y* ^��\B�V|&�u�;fe�$��.6��(�b*;���ӛ���Eq:�ޅ�a<�A��IF�'Ne$7k.���/=H�t�wQ!��|�������Y��|�_Zl����G�+"~7�k	?J�ǓB�y���{�ʌ'�y���ӄ	/�����A�f�ۃ.F��P�}���-�C��9<���@��s��5�� eG���(��ț&�Gy�=%֯=����Xĩ�,�rO�a�,*zrd�
���\B„,�]�TRۃ�Fr�\"��*������!��<i�;K�V[��Ò�sY�)�b�sτÕ?��*�W�_tq����_Xu��7v���,�?��Y�)�c�S�q"�c,��|#�Y�+�����<C��e�ΠH�ǛJ�M�������_*qJ��؃ѼH���E*�7J�Y�ү�sN�g)Վ\-c:`1u�U!�$�#x��tfX�y�)|���
IKY���AT-.�D�IEX{ﺆ�
�b龷� Nc�i<��J%=[�8�`��^#C̒���2��l��g�f9[�K�./�Մ��+�0�S��p}�-�u6]��#��W��g�B��'!�:N	g�R�8~eu�LƷ��6��]�Y$�T6S��1K7�e�%�s�?K@5�-[��U��$���/��	u-/2� �0�+��	�g�v�|���yLTNW�}�L�j)���=���C5/jQ����`���/x��	Z!�evbQ��hs�C?<:�*����V��U5*I���3���6,���H�
�2J��2y�k[��]�S�n�����\F�%�W�ؘ0���%&Ɵ��n����w�I7b�W���o;�?T])C��ϗ�)����f$7z�T"n�-��<-�
OYE�
G�t�pS5�Vv�nf��j���Q����ݵ�z�"�����2A�o��S}�8(*-�V�dbل�a����?Ѿ�� �M����z�z׫k=<�;�*l��$m��k�k��[%
k�9&#�d�$c3eM�B�I�&؂k��M�q��W�dW6ZrutĨHcoѴ�&XBH�%bW�Nx��#�����j(�xh�^��_po0��T�л&��������Bۿ��%oZ��
�wޅ�9ye�=f�g���t����h��ޞ����,�����9`B�W�b���D�H�9g�L�ɠg�X�9ώ'�T 20��)�F[vZ�U�嶵e"\�$�C UŦ�����25�f
x�������N�F-�:����iC 

��Q�v���Ա籤���;����ω�g"8�h�����6��G���{�gf�������GdP�d��΍̭��V�C�ښZ���a޴hhJ�%�!oHUŹ����F���gO��w��P��vC�s�Q�K[�;�~�Nu.�.J��/���Ul�m�\t\��Q��w�uKC����{��1q�(֔�"!�M�i6*��^�����R��g�]¶q����[�--d��F_P�ZCS^eح�q��1R|xT"bӑK�W��9ʷ�O��V�4��P��.4Rz4�oW٬t�g0�̪����-�qvWv�X�����`�%厃����ѭDu�Y;e��@�IWht��g��ڏ�}�7Q�� U�=u�꣇-W�m;���DY�u�?�K��4���d�S^��U�W��`ԝ}&�:Z��PK/WUW�HϪ��pip/_vendor/msgpack/fallback.py�=ksɍ�+z����Mq)�k˪��$Q�UE�=n����P���af���T���c���d+	�lq��h�F��f��8�'�A<�c�y�����6�X:�M�i�Uq��c>f��fP�Fcc\�S6���J�	��E���E}x���
QX>��kU̇�����o۬�%�OIQB+Q���ݏ��c�����O�UQ�8KJ�Є�6���Mk�
Gɘ��a�UR��i��x=�I5/26��b��L���
���<K��(A��<qv�/���
�F�'�_�k�ُ����f��nAҝN�^�'�9�E^	��M���(-�B�&X�L|j��~&I�L:qqS�P�[Va��XZ�YY��0p�=mJ�U��PT�}Z�6�!�ΧLQ�Ϊ[�<�d����5Y�,�	��m\�UU4A�m֘=�#S�
%㋪H�����+'�=����V�8.�c;����'�h�`�/Y~�Y���d��NY�qEDH$�I��OҲ�nQ��*5SV�΀c.e�G�.���f�O8P����<�Ȫ�}\W'�~�..�����i��ԏ�ˇ��,�Ț���ɰ2:��D�VQ�,��T�7h4�0*�7�AxI#�jQ�D�-[���:�l�d#�����_�5ah$K�8�%?>/Ƙ5�&Ӽx��&��@�ha:U>�nm�tz�,.���G��[#�����O�)�e�k�Ѱ���R&z,����0�b�?�$sx�I<�bV�M�؇�0�	Q��9�l=4��qR�'�6{?�ޏa����*b��8/�18��
*QVT��)��p�Og��џ��?��Q]�~��p{ux��p‹�~�~��[�|%��U��3�zgc�򷳣���ۣ���!�W��P�#T#4�p��+U����w��?�	�qc�t�uz	m^�_E�'oO�hkX�9�M�w4�E`�a��f0��^E�Ws��{���F,jV-�sT�bl�p���$�0/"��?��'A�8��=��L҆/�L�¾��i���A
�o6�q������pݜ�'U��C�qC&�&A2���Z�&�����ٳ�{�Cy��!ш���L���\�Z����HZɮ���^_���$c�8�36�3�@� �ؕ5k^mp�
st�ĩf�P=���t$}?��B�4WyC������k�^�	6Hx��h��@H�	)]$	ۣ�f5)�������X���	�|X�A(V�z��y���2��B���"�����Q��&l����9Z��B]�q:IF{F����\j���`E�A�.��4��
�Ҍ��UD�C��rYQ�����z�U�T��+�n�Wm��e:�-�&̾�6�{]�Ѐ���$�P��"E�$7��QD�Ts��1�]�(�5�D����{�?�]]�
��^�|��1-\�ۿ����=��j3��G�����=�T��/�P�K(~��'��W���@�L��w�(8����P�#a�����
��^��ˑ��0Ȱ.�k6��#͜~y,�Q��w9��x�%Q�/�%��x�#Q��x�B��*C��e����g/��D���p9���K"�e�"%_BC�{JdxJdz�ɉ�}��p�a�G{�y��x�D�y+��
�eO�������f���0/{����l�7��w�9=�W��J���'Dx�ԣfֺ��������h�d��S��t��p&E
��_q��(<㊂�=ĴwMS�����c��1�yL{��(L׊N�m]wXli���р=��n��f��u�jr���і՞�,��D�)�F�
8rI	ki�#p3���!ɹ4�Đ3@K�/'�Ԇ���
0���0a���<��eI&�I[~�T2t�$�WTݷ��.���P�ў��H�٦��%[P2��q�X���@�H��)vt���;�x��5��Y^�Pcj�u��Z�cͫ��V�IAmK=-�3�����4�Ewɣ�mZ�0�f��Y^�UJX<D��gs@5a���noO&8`�x�n�N7�+:��脑W�����PYUk��,TT"4�AL+@�",W��V�}@���D?"��Y��\�Yk!�8-ʯ��G\�nR�Ϩ�/�
v�XG��5�x.A����l4��S�H�L�=ן�[�:�����Q@���\'�	������V!R�J��h���%�q�I��i:M���*P���8���g��<Mbhm�ٳ��ͭ�%�/�nu�d��?�λݷ�AKW���^������8�%��cڪ����+!��P��j�:@յ"��jvl�A+�y1LM(%�`��P?�APf'E��9�|�TV0Su\� .V߀�h����4�:�ⵉ���&'���A�^+hk��a�~�a;��v_R�r��bN���\=�h��boo�(7������i6�^��'mqh�W�$�Pϊ|��e3_��2LK��D����٭�\0�l��
?5�h<۶�s��q�Xy$�Yo��d#["��H��j�ZN��[��J��<��-m;h��Zڣ�-c!C����~)]�j��h�^�RΩY��$����y2N9_��۾�S��Ȟ1�#�
����E}���z�[r>]x��J�����޷��:�KTDdt��L�5xW46LLJ�Hh�&‘�:'v񔌼=1a)�;ٴ���_D��L'� <�Em��4=��B>���vOĝ83S�0N�����#6��0���W��,/S�E���	�J������p4�+�<���%ʠ
����{�����jȰX�-�U�N	�Ǩ��ś<��*'����Έ�e'|�m�pz�;�Y:y���2�闘
r/,������!j��d �洚��Z�qwI�m�~7tF���#��'�E��@k9�
�W�ec=�Y��H��2����@��A�����3P$�p��b��
~t`+�	�����r�Fe@�L(K3�Ъ�#��� ��o�x���[>U��t��W�G/ã,d&`.aS�0�bO^?���]d��!S�QN�}��5�7��Ms[H#������@����mڰ��5]�gЂ+(i��f[/�$�!�q�s���-��	h�u�xS��…‰��jv�O=cq
v�_��5��q����d�����`���@Oa8�9ih�Ω#��_�k�Rs{���;��s���)g�G���UQ>��oeu_�)�"Zf�\�ӣQ�je>��@�f/l�\ڸ�Z�ެB�_�]�	�XH�bB<��#3����jt>�k@p6��駤aak�vEIK���B��!٨��"k�I�>_D.��:.�sfM�W���pތ���4��.���>'�W[g��.��cj�L:X�|Sp��[$�༄�<:��ؠ/��umF����?�+~����^�F�B�_�-n���M@�M��ɻ��ãh��g�{�m'e�=:��4�V�(CA'5�O�g�W	-��w��N �7���h��T%+�����R2�]�F`6!B�yϑ�b���Da�og�8\�)����|U6�%���p�}Ԩ�i��|�ژK|3���C�ϫ|���ו���r�������iWt��?L���Fǵ�7��S"�y6���i!�AtMH�1��!K����i]��"���𠿷��m����8gqu�'��-��܀�`W<���j�MϵJ��
ߜ	+Z�QRZj���U���=F�
�6l�ϵ��<�5�7��Zo��+�*�����n�	�����hD[s=g
�g~X��
�*��#1�Uu�"X֓+n�{�1�	CB�=a"d��.�	��s[���s����EU��B�G�2��-�ޖ3���K�V��*�H��8���n�����������>��KF�_�;���.�8��	�wtA���ҵ�S��&.U5�X����n��CC�~쑣�|�������6��6��+�����ߕ������u��p!�~A��Lp,Aw�(�n��εb� ���F!KG�'uV�2�X(���g���m��
��[�s-
[����ap�X����s5�N���pL2�ձ�G�¶}�Yg<�B0�t��?B��r�h{�>
0��)?دv~76n���e�Z�6�]�j6S����+x��K*���
$j�H�kT0�����_�KO��w��?��e��,pQS	���]&�S_���;5�GN�W@��6�������>QIU�b���|?�7ɹ��i�g��ecv1x�[6����ȥ]�
y���솃���z���)�$�٥��ܥO����_��)��=��ew$��><.y������D>�A�maX���bu1yH��*�Ǻ�p��M��6#�{�B Cw<t*�˳B��ƌ�V����,b6���J%ϖP���/�	�֢:t=߲���2�>�14M���
	ur��Mh������c~T��,�F�f�e3H��G�G�TN#�w�#D"�H�I�)K��+�4�.��c�V���J��{��P��	u�ث��4�-h��!%��7ssW�e��5��;�Nش"W������l*��>�m��Y2�bJtk�T�ǽ��Yw���=�4����%~w�1�l����V�a��TO}����,�O�b`�	h�d(�����Y����E��ƙ:h'Q����	s��Z5^�e���-U�S�D���i%�Y�&�(��^��\�E[���m���i��̨8#�1S��w%q��<�*?b�v���(�(���;t�.i6��8�m�i&�9FǪ����w�ۄ$:5��t�g���M�=��O��h��l�'��T�����.�	pQ��M(�����‚��QFY��k��Y�<�D��jVU�V�(�C�[�f���e��i�n�w��;L`J��[\D���I]�A�i�/�Y�L\Ӓ�N�iB���j_��*E�`�(D��Uޥ3WP�=�v������?��e%�P`����n�b/���j��������\%���L)+Lݼq�w���M�2�ID����y�Qx<s�;Ƽ��sO�G$���*P��PI���O��+zr��S��]�����έ �X�<��Z>̳Oh� �(�M���xU��g<��[�$�E���c9C"#p�:e��L���~���`���	ܔn��C!��ѣy\Yd�y��s�O���L,�$1��ⷜ����Q^<I�"��L��w��}[�<|��YD:;|-.F��7��b��!E�p�ąLe�
��P����R��c4�;��x���tI|��!'�$C� �vW�:p�A�=&"�[h�<���^~I�}
��@�t�Xr�Y�NwX?)�O𒆦���O��Ǥ�2:�0�Z��h�0�I\��k�L]�Ex�>.F�"����hDg�(횢��KJ�7�L7=��s�D+1}��M�xCȼ�5$ũ5[b���3�}@K�T�	��D��+]VF�&Po����'��wy%�.����W;*Q�����4��aW�����ε�C$������k[�[lֿ�C݋��
����Kvuq�.9����R�v�3>"�(�<�}H7�Ή�����N��;��c�=8�x��~5�;G��)�)2'(�4E���^hab�(�G7)O��ɦ��P�=�Nr,0�GR�W�][r�˟?������J�g��%�V��5U��Ou�����{�vE�=
%o�Z�2�{��Gؓ�������W���(U��}�����NfvJ�[�{��ɞ>�#:c�f�k������^K���b��e,X:�(�v^>�`w+A��BI����^-pϿ�����*�DGw��>�>:��G@)y�׸���i�fK�l/$Q��D�N:Č�?���q-���A�6��K��݇m��'�4X���QZ���B�������~1����x��B.���%��'�����g�]���'k͛�[���n}~��'���<w}�݄�[O9��K9��I�\
ǫI�['
?�~mJ��%�������!{N_��f�׈J�6��8s���n~�?O�@�8��%���b�:ɪ�<=~c>�2i#x�=�[K�/t{&�%Y��V����-�P�U��I\��;��
�(��iE~[\”8���Xjl��+�ǃ-�q���i���7n���u��]z[�eV�_Cf)&B���Ob��q�|e濒�Pv���l̍�~�)[ш#:!r���s2!�`WҠa���mn��#?�S�Q���S��+�c}���
�<'~���<���\{�?��
�G�凎����׸�ͧ����u�~\���z�^.D���W�m�\�n=��n��&�Wmv�v�ߊp�w�Z�!+;��ØW	�h
]�jx���#�W�uW���+�	��Lj����c�\�t�ʬ� ]�dy���-wJc��I9��|�/m:=F~� �Y�C_٠Z�|fK�_�ѻE�.�8�ig>���`7:N�O��C+�O�W��?��U��ʺ�!��0�}�]�^�}<Zߦ�
����@�U�5O㌂�!4�xy4��q�fB��5mL���:�|s�\��/fڻ��~d�� J����e�8����{[(��/�~�y)H��C<~W{C��3ڿ���/ʼ����:��Q��K��s�YޖBn����`$�����K�[�9��}�
�WSV��[ۯ�ms)p���M��c��p@������
�#q��n��g�RF��	
�k�c�������*1Dm�J�P+�#,�
�R^5�~wS�U�uU��^��Ӆg됽���8�V٪�cfq5�Z$�5�ҌA��NR��u/xk�xi�]��a{�'��X�o����>�st9b^>3=]Ȼ_S�G_W��˄��_�Z.cӫ˄��^��_�3>F�ͻ6�D�WL
�:�w��Q��pg, /Ҡ��f,�:���F���xeC\��n�M����
����`�y�b�47��<��ǝ�4���ݙW�/dvlY|�@+k/��u��\���~�~W�YmW�+^��s�ER;�H�'2�]$�����N��_��T�<�=�4��9-w��%��5ң����D?JD꘸�΅�(��f^^/�D���fK�W'�~�..�����i�����~s�8���w"S�c,�������PK/WUWF�cf�"pip/_vendor/packaging/__about__.pyM��j�0��y
��[���.��=�t�2Fp�s�`˃��l�ݜC���~I��{GZ��l�� �Fe��4���-�6^�Q��0�-��%��l���jb��qw�)���e�=�/UdFk�r{m��}�V�u?Hd�Y��E�U�����>3�O^UL,����X�Œ)r����d;E�q�MJ��5SpN�j=���G��]�x��ַ8�:�Y�*|�j��$1��;�ހ�I�6H���1��,�ĝ;~.�0�L
dIWA�Y7�^p���
ٵ-�m�j���k����������Gu�o!�o|�Yn�p�w3�(K�W�Tɘ���v�_w0�9���d�PK/WUW�����!pip/_vendor/packaging/__init__.pyM��j�0E��
1�i!�2�.��Ea�&C7�7Q�Y.���:�7��W�G�6@oB�]4�mq�A;d�A�}�x�L��e��9X�N�Cf���s���� fxy{9�7�u���.`�(X!��_O-�ɡ t(ƺP+�3y��6�Ek�~"�S�^�Qb��U�4�l)}�*rM\@���+�����J��.Y�#|�a�|�6�����=�b��(`�Q�M���PK/WUW*:c��,#pip/_vendor/packaging/_manylinux.py�Z�s�������`
A�^�5qRY�lMeɵ�U�9G�*���%&���Ҳ���r�������2ɳ�ba�"�d��#�o��4��,nod�B4�ʪ�ê�Z�$w�He�(G�"KX��q�̳�K��$��cg�(x�����y,<v�� <���1�����j��,�D�Ҭby�}��`y̫yV$L�����C�z>��i�O��Z�*/�K+9��R0^�KY��u!X6W��:%ᙸa]�Y,���Y"X�KQz���XE'Hd
��E��'2�q�b���#�B��i�tۀ
N�����,Y����X
�`�2��=v�����_�>9?e��?
c^�,��S���X�#������<���'oe."��Xl��I{Ā�Q��n�ũ��K�O�3��y,#k?�g��(�b�����8�zP��X�4o�K���i�[+�h�7G�Ύ��o^��c/��������ACq|~tu���gS��n�4�~:z�s~��O��Q�ݛ`��.w�˫��z�>?z��{����Ӂ!9%����ٛ���)�OO'�3x�|�n_L�7��_�^��I��gd�.s2�U����R�!b�z��Dy3f[?��,�MhQ��<�u�IuHA��dZuD�}C���$��O.������R�&��x���ec3����c��߀�Y�I�=l�>y�o|A^�.Z�e)a�ovV�{!����zr3j��N}��$|!CHlDu~8s:>r���O/�ݡ��W�[���D{��d���(���x&�<f�8��G�j�1�*ҡ�Mw�6!����Q%����Z�Y�g�1� �
�9��`{����,�����Yy/^��ޘ����ΐ�T�ξ����_��=�����I���}�ǯ)�]#�P��#��~��5$� }�E��(!t�Z�����e6�?��|$�<��1�-)�?��Gy4mZ'��+��g�h�(it��t4Rt!��踪6 ���7:�X��NVK��"u��4z�)fΘ��3S���7p��๗W
R�g��Ǥ�3Ս@��w�	��A�ALX3�E��k=���P���<΀��L��S6
���:`K���FԆ����ZV�ǡea�C?̒m��@;{ۋm�!�G�Ѻ
�T$�=*k5�rd
�*�`׭Z�3�g]��/�v�&��˛��6	ً�s۳Yt�k-��Z6�`c�?`���ҎJ��y�<xv0t��z���n�?��#�T�7�.u�]3Щz�G������4vִ��:�V��Z��ؗX-%��ܫ��A>�tS��%�D�v�|R��9[�r2����%O�eU���;+�)��K�W���4�C���FI6���}GN��i�u��e)j�f�T�bYV��x7�J|�R��ylQ#�u�,�b)���'��
��C�(�D
�d�r��
C�W!���2
���yX�j��9J��sx�P[ER�xx�U��D-a��G|�}����q�����ݡ��
�e덋|��gk7��,��j��:�����n�c
�2�!1֗�}�g2b��'�M�:(ոc�s3vx[����S,D��d�7lY]�߬�
�b�����ů��^9��4s�
ܬ�����e�t~�ϰI���豼��p����"�����RYSM��	̶X�Nu	�D(��P&���fY���f�dQ�naP\0v=S55W����;���<�O��dw6ߛO��I�
�m7<�|��|�t�|�lw���:�W���������` �P3�&M0GG�?}�t���Q^|�}�'�j�A�n�@�	<ցv��/�XV��ÎgvT�vVW
&kq��1���1{�9���#��9���s�T�9�}�>��Μ���Q���A݋g@�_:�-N������+�L=8�;�c�6;#�\�?�\!�T�<���,���p~>F�L#B�*���Q��
,O|�$�\P��rJ��X��"tZ!�;��ʿK�rCx�.
�8&��)(����i"���]V�R�˅�>ו�G�*6��h�2�w�o�f�?Kj�n��*c�"�H�4�kQ���n��J�GlG����ݑ����}��'R����Bȅ�.Q��*U{��ƪ�1�#(n��g��"&��.{�ʣQ?�˪Ɏ��Q�Dٯ0�3|�E��5�h�NZ��IS�U4)���_�_H�6/<,���Z��G� XLy�,�P��/.��J�U#uU`�0��j��J��C]�1��N��UX"8��]�d�&"j��K��A��D�W�z@�
��K���z��X?P͡R��"����l���������p���j�̲X�J�\���[�x��1�qh�~�Ae�������I���g
܎���঵>9�E���j�AT�d���B��a���d/Q�V-�W�T�8!�P�=�����N{����G��:��D��P}��
�P�yg��qA�.z�Ge�lҜE�m���4}�P#8=\��(�M����{�A �=�[b`���ZC�Fb��b!�sF�A��E�V 1�D��HE��,CJH���3�<���[Ÿ�i()1>רT���-��5�n�� ��*\�h�C�Ҵ0m�g.�է���Ȁn��s�G����W�!�3�ڙL������J@?˭�g�l�@�=$Ą�q���[��z����/������x}/�=?�
���i��t����}��Y��fiG<0m�H_��96�ȪC�M�o��xջ:�d"��e鞍�ihk��w���_Y��������m���m_�qQ!�y�������{��>ۍ�ğ����hV�����j�ۓ�l��/�I;�.��k������`�Q�J-F3AZlȺ�>����e��)J�RV2ʑ�u��xt�F!V�	<�H�.�~���Z4b/y	TP�7��{O��5J63�n��iMc���M����6����p�h��xZr2��i���a�v<��;�0���2mRD�0 6J6�ѐ;'��t����W
���	��&`�֣Qp~�������/�g��ooᖿ71�}yŞ��m����R���es���g39���&O�=&;C&�!��>�}�c���طXL���� �&���t��aFS���1UQ���q��K����#�Hjy����s�+(��+�j�����O!��RM�ʲ �#���9�u`���^55����)��mz���!Y�@���Y�=-zۂf�m
���T�B}3��`����]��͌w-Ȏ6���[��r8�+�߅HF�_u���o�v���\��B�(�;{�ּग़]�v`
�eR'6�)��T�R�2�Ih]�ueZ�4KiZ`M�5�[�oF�]Jֲ�Ah#�k�5�I�k�j�����I=p��F�����n1
�5z��^�p1�;{_����
8G����^�}��In���g�G� �Ͷ��};�b��XCj���o$�-EF��F�k�͎0$�I/†2�:8�z�Z�wP��;�uF�	��otf��⃄J?S��������Y��K��3��=[����YI���^!��э;�9|����fy1�o�b]��Uw��=�V�C�m�����z�@�m�k����u�u<��/j�c9�PK/WUW�t10#pip/_vendor/packaging/_musllinux.py�W[s�6~ׯ8�<,��p��N�Y��v�5�&�Ƴ/���HPšYL�f��{��/mg9��p�߹ ����k�8��6M�-�Ln��@U�m)@VM)*������l
��"� �[Y�5�{ЭRRm�zo��i&�T�"��RUk�)p�×-���Yh#�ih���$���Ţ.��ʊ�-�[)Z�ٺ.M�P7Bs[��aG���X�f��ծ]g�N�������2 ,/>Laa=�)���oZt�>4u�h�[�L&�( Ղ�i����q1C��
��BQ�)����=�R*;��j6|���VAY���H���8�a'�ef䯂��$�7\��yJnMɜT��H'��}��dt��>�.$����q:�=k��;W�D�Z�.�x��1zP�l�m��x#�ei��euu\���8?9�=o��_go/�����3.��(�w�.z[4Z螡�iDfª�u�r�"���m=��<{y�mϘ��lk�����q�Jܗ�{�zd�8���8N!:��!�b����Z׺�B��V­a�8����
�2Kq�����M�F��,�g^�*�	6U[2�=�5�����"J�p��O���Bb
#��϶R	�~!�B�FNx"uX}W�
���5`�l4�B@��l��Al�:+��Q�C����K�z��.
#�����מ�Sk�%N=3����>='3��>WWW�m|�_�g�p���P�קGkiو���?~��StO�>��y��8S[�0��VC��[�/ �4��mҍ v5�I+*\��,N|�^�;r�#��+zߓ�$���UQ�;��[�-:~J�V��#���j�'��E��
��D�As�q'�%"�'
 ���@-�dr89�Ȼ�!�:4����cc�����Z�U�`�{��]r��l��I�o.�s=��+�xhs�w��0��
���α����$5�Mݾ���^�����[�A���<<:�d%7ҟQ�}u����Z��������0�B����6�u��PT�c����a��He�U�Hүy��4���&N�ZuU�*v;	�
N	���ժ+�ޟσ�RF�e1��:
�B|��Ln����⹞��N0ŧz�k���yu�^�+��u��'T��wG˧~Z��a�b�n���̍���>��BЏ����p�VV�Ar#'��h(M�Rvߍ��e!q��+��+^�DJC&�T�kE���>�FeM=�:��+��Sʱ"Ԩ
�E1����M��h��m���+a�$���b6����U���Ezq��f��v�N�?�C�ɉM2_p�L��r'�'KCcܠ��:{�JPw�	J�4p���Î}P��Dž�ç�?W�5�����y���N�w�H��e�����=�]/�/��*I�e���j�݊d�JO���<�n�nJn	Z��s�m�|���_BѲp�w+-F�j�k����
� #��5��{Y��Ȉw��kE���h����K����g�Þ��ww�ww3ox>�#�c9o+���됍����d�r�)�ɮ������4�|3�҈��G
�3vA/l.b��G%7Y���4h��u�p�!�r�K��>qo}8�&Wg�i����N�0��@���kOC��[����/�^�'���~"Ma��'M+T-M#gE����34�9���n��]ȍ�<ňҨ[e�.p�wF^hN����RG>�tň\��g�jj4�̰��o2� �h��5����P�<�0�8ԑ��)���;��hzO�����QDW��6�A4�$d�*���~PK/WUW0��`�$pip/_vendor/packaging/_structures.py͓=k�0�w���YpL�h�)B���B�϶�"�ҹ�_YN�?�d���t�����������HQY̠V���-�ܿ�T<uӦ-���Z3xLb�*�e���KM;D��Y�����yC�׌�Բ�	V�
���x�6��c%�2$.�M� H%��*J�i�p��C�"�2���,��s3Rm��pt�%�e7)��MM�lіͻyI�t�uf��_�����#��{���S�
e��#����'���f��d1�ɽ�{,&�8$(,Έ^6�b�I�`W�pDV9�.����*���v
=ٺŝh7����
	w'�跘n��vc%:��dC��l׬r�PK/WUWm��?{
'! pip/_vendor/packaging/markers.py�Ymo�8��_��"!����b#.�v��`�I�0V�cmeQKQIsi��_$R��^q�K��pf8>3zI��yM6y���Z�"�XY�5i�5Dn�L�j�7�e^�~N4YLn��s^N^����1��Z������$�15xr�aqv�0�jLp.�l�@��׹���m� �U�����yQ'�I�����	
��{m���J������l��P��-1���!&hQ�O��k��T��y%�$Z�亩p�c�&j)U^%�+�\$�CE��NhH�KR�蔜�}�˄��o\�S����?o*�x��c��&'z���ŗ�����KV7����
�l}%��G��?�\0�^��E�v_�$2�Dƌ��X�or�>��qyG�|}e'b�>N&i
�JS2#K%40ԧT|f"�+!h6y��`��k^��].x�c�<�;f�}A@K��u�0��L�;�"v�K�0F3W1��yd���uM<%�Z4l!�T/�w^B8*J�S��ve��Ĥ��G��7�"t���������ۤ�c�q�w-��]�M�d�
���%w(��d�Y]@X7�ڵ\>�C���(BJ��-
f~bh��[�[��	h^�kf�����P�3�fzQP��i^�2MÚ�X8�C�W4�*��$�.�iʉ#�݈Q���q
&Q�X�	�\nH9�d�G��=M�)i
O�4}
���A�.��B�䰫�f�Ӽf`�<������mi�u����ۢ�K�-��`�J���ࠕw^�T��_�ߟ,`_C�� �.Q�R��`�H�E
����An���p){�p�<A��@j{n�
Fk6:���J8��sp-�9�fD Ц���$^'zo"HR�����=AI'h��N'�ϓ�6>O�g�ƙ��BF�Y��l*		�&���C'�}��v�!S��7?9�_-� �uv�Κ�֕��5%�����d}Z�.�֎�i��r�SX9?���|� �<ù���OkJ�:��.M�&�L�r�nb�Ep�o�W��g�����f3ؠ���>�k��ڧ��:����8�_���L�qw=E�WV^Z|��e �9mH����#&,��������mgb��˽???Q������\�.�h�͢_��\Ku|�82�=C��tn;�X/#��[JK�ȭ�'��řV:�Q�`uF�Kg*��z�^�=1����s4�5�1�,ت�D�X�	>:"��C7��ٞ�V/X�Ѓ�Z�
�g"c)��������Xz�^�K�>���5�W}w���lIZf�
��� ܲ�Q-�H�U9V_F�J#��f�š�)��T#d}���5J�a�*��b�$����M.ju�t��Tp�{-�u�A	���v���b�N��:��`�����wT���;��,bP�~fd�D�V�~�g[,|�6kR��	�6��L���%�\"���(��Kœ@��qrX���%���yeĩz��]��iJu�H�5'0�9�{H�D�a%�MM���_�H�މ���ݺo�rQK�z�J3�ٌ��&T6w]iià�H�nv�dO�NT^����/���7
���x�ql�lL��#��	�?y^�j��ɏ�!��p$
��J;j�V�r�txy`�*�*5��@ �`�B���@^u0'�[���b�Cl��Tؚ���&���Y��(�I!���6	��a��~�
����7|�{�q�IM
;pGX���
��,c��������N}Y���v;�n��]R�V&�����&��
��]�5����A��A�����f��
e��E��!�(����Xob�uf�#�^�'L5��>bBx�9	���\(�1
{zq��զ]d֑�կ7�^O�tܠ֗�n3���������mnS��Rb�)4���LGP�ו���D6�#.��4Om�[>��A+���i|t��d�����<��g���-b)ˬ���ݷ\�VZ��t{�MTu����~�s)t:._�Y%��X��y��<r����j�S��u/ؤ���-�zŒ�����=F
۠�3�YX2�jx��-F����U�j߳'&��7���K��PeKU��˞U��N���Y͖+�<��!�E"�3�X������d`��$��+�رǂ^f�S����5��rH�����S&�S��E�\��y���~*�+l�R�/@0$!Z8��5g�З.Q�lscD^^1_p��#��P��S��)�6�!t��W�msS
;sXf
�p�U���t��7����Z7h�Cg�A�8t�ș4n�����0Bo����7=B�\��Sw��;S>�H��a��+��,=߹��i�%t��$Ս�h9�i�
�:sS�6�4�SM�g��� l1k���<Ĉ����y0s�ܺS��1�2���5���g�~E����Ik��6��\kΣ~�a���@����%K
��)ѿ���
$����W�y���2��_`,40{�A�]�9
��y�(��H��l�]��Z%�QP?�Z�Wު�[�18z��_�E���/�I��[�M��U=p�B��|�w��)?������+��}�k������ã��I����d�J��u⺩}6��E��^\,�����N�j���"�� �ы�xLp4�/PK/WUWpip/_vendor/packaging/py.typedPK/WUWn�AZ�D%pip/_vendor/packaging/requirements.py�W�r�6}�W �ɱ�I:�LF��02�j��+ɹT�p`��R�@�]����@J��z,��,vdv�
�L3F�lhF�t�r���Ɖ�fD2��X�A���
�X�|d\�E��_�gB�D����V2�2�'�^4�F��\��p�.D*~�e�ɢX�3&I��i&�IW�K�V_B�4��F�e�e��\0gɋ�wk��r}�
�!㵄�p�
2�*�i����˓��;�fax����N�_�X]�9�� [w`fjt=:SvE��g�܄]�[�����ḃ/��^����[���fҸ�=�J�e��KO���*���C4���g��RP��"]���]��ݴ�A{>5i�"�B�~��fi2a�7)g+�K�#�6,��~W[麮�sĀ�a����-D_�l��E\�L�,U<�,:#�>{�`��~G�Cr���4�?R���	����N�އh�mϝ�~ 6�5gBx�3i,^4g�$�%���Z�K��p��Nse
���`\�{�\
K#�4����Qov�z���}���O�Ѭ���zt�Ś���ۆ�g!� ������p�9���k��a�(Fض]�ܜ��>�&ac�q�'}��K�qw��\����"c�d���A%�0�����5�1��R��^}�G���,4�~u�Ў[Ʃ���h2=1��ŋg��u�1W1��� 
 �v�$�S
��G�I���_
��a�K
Ժc�����-3����Zz��XG�/����LK��oE�O�U:F#�'�(2�<~G3$]�sz�t�j��,�AsM�W^�-��
Ǡ�}�l/����N��B�y]]&��A�]"���N�	��ҒVJ���·��/����f%�=ʬUχ2����Zh+҇��fR�'��R��A
 ��z�f�
�hgce\�~�EL�Hٕc�e8:��M
��{f�mnnP�{��� ��$��?�����Ye��{�p����h�*���Ux���hF�@��
g4!�.ћl�^�S����Mui'� 7X,H*	�W�gw�dh�F�?{ae�s�<�v~�b�,�VE���
B����2�r���iTW�l��.A�R"��fq�z��1���F���3I1 �
��ؓ"��K�dwOѾ�X��[=�U������q��h�8�L��f�9h\��0�~0G��&U�M�OJ0��/�\7��I�k*Oȩ�(`A+�W@Rw��"!FO�@Ӎ�64ݰL�xj�i�O�'�zYlL�v��s07*RL[��m����K–$�U`ű'X����Ɔˮ��'O_�Q�3�b~������H����n��V�`-
*0�5�
)�[�e�1$ ν��ڜY�@3�G�����v�=V��ᰁ�;�Pq("59��z\K�K=�.�邦$�1�]�cB�����7�o�5x#�P����;nw�ȷ�7�������~3��q���)V��i0�`B�Ǘ�k�
Fk6g��؏�Z1(��u�Q���G������[��]�w�!pAj"�Q�n��w��6�K�p2ٯ��"곎�21R�^��_���z��o��I��xJ�jl
5|-ڂ0)��4��f���ik�wV��?e�щ�-1�Dt�ù�{^߯ǾQ6O
bU1�x�%q�	.F�
T'�	�4Y�Y{}�}%%�]�� �m�])�vl	~
�xMaҾ$a[��Wr�p� ʣ�	��K���okˀW�F�F�Lnx�Rk��}��9[?~����}���C���PK/WUW5����u#pip/_vendor/packaging/specifiers.py�=�s�Ʊ��@�Θ�i<ۯ�<=S��͸v&v�y#�,�(D��h�r���w��Á"�I�h&������v�V�ћˬ�.�\E�*ɣ<KUQ�y�*檊�K5�����><]&)��Gߩ�����0z?GI1�a_��ڌ���J���Ϟ�|�\OXг�,�
TjY�YSV�wQVQZ^/sըh��$��� �^�U%��z�*Ҧ,��<�c�A��o�*�bQ\T�u�l��!��
"�y��y2�՘>}��
�v
@���	�O/�Z�z�l�I�IW��J�y�Z0o6K�]�����W��F.^5�b�\�e��I����7��<N2#_�E�n��
Gˤ���7���~Mx�3;�y���o�r���n���I/�ѿ
�7�q4+��&�,��	��Lf�a��9+�)P���yR��iq���^�4��T5�.�W�yU��蘈=�O�n<8��h��
�l�j�'�/�U>>�@�(�o���c�L�UR�v�k�Zz>v��~���@#�'|���$m`�e9��suM��x:�*�ENp���D�Uͪ*j%�T�ZM�|hˢ�}��r��J���߂�k�)ȍ2����D,v�aM�I})��E%���ޑ:ز�}�Q�Ԩ��VWk@�2�]���-�P��/���i�u�l���R��'h߻V��J�fc�SW
ШU����3�����x�(�e�/a��!�_��0��>�|c�^ �
�a/�c��c�,-�eY�0��K~ܷ�OZ�pd�A�1��X����	Pb��;8�k��6+`����9�J�a1��R�P|�B��tÖ f=d뎭�;s5��.%���>(a
�I�p�j \~M��L*�:�K�D�o�e�^Z`��w�������u��g7�I��w>�vzsZj��A�X
���GS��zl|�3��BAeE�X��������\�
�uҤ��5)o�d2���!�ف�w(P4�}�$�U׺^N}z��>������r����h�xQ���p`:�08[G��!
��F����l��h����Z6��ޚ�7�9N�)ڊ^��thp���M&�|Q}8o��u��ҬP���n
�ԩ�@Ox�锄`:�ߊ�ZM��^��&�8:�n�b��?|�`�a�G-����l�Ժ�4��1Tg���CP`!�z(�<:ɵl�^�8F�p�t ��z�nf5ؙ&)R5�Ѵ��+�M�q����n�o�{F_�F./�'�e�W��eٜ���\5��T��Goo	a��-tiM&�V�A�j�N6�_�B%��Ǎ5���!ǝ�@bZ�re���L�&f��چ�ry�Q
�����bAi���e[��q䟧p�Ω��0o�n�j>I�����GC�Լ�Y�9�����=��‘�>P�*�@z�i/��ܱ���zC��Zec�Ԁ���[�_��>�z�����Add�i�^02�\(�jp����Xr�g�\��K:ߨJD^�aB�8L�A��=!���U��/�%�%�PTM�j�@����u����d�xЊOa0�O	��= 6+@µ�z��HXJ����DkP󒔆��o��!��y�Q�U�*k��\d)�n`:��#�WG9D��Z�?�в\Ⱥ�9�k%i�4m����ü����t`�撂�k�&`ɳE�?�ܹ�A��X��|��V=�i�k���h'�d*��<O�6������y���U1`p��uG!g��7�J}t���5�B�D�N�7xN�s�R���`�S*r!̕8�
ptP�ʘIOb�������i,R��������B~\��GGGW�Q��;�N�.��>�p?���FPD5ҀpbPW*����5�2։9лBB�(��jF{Gd%������ �ΛD|�>�a�^����89N�KU̻.S�����}�s�-|Z��4�*���+}΃\�[����H�xH��Z�E!��:���rͱ�e$m΢��
��U�<X�+
+H���"���A4cF��8T���o���̒[g����K��	���-���������.-=�ct��:<ŮH�F��U6@Eџ)�*|~��cLN������'�����D��G�;�ٳ����]=:?�`K���I4�	�A+�m��,-�O�;�>Fܙ�W5��n�a���
��z��/n���^&)*7���AZ�eA_^'�������K�4/k�4pW����E�mU�(
9�BBC�dI�7�N4����44lS+�w���v�l�77\���d�%T���N���%�K��?�8���~����?����o�?{����u�n'�L�
(�1h)5����L;_=��rU�St"�Nh��Rh z�<q`8o�/�/?��AW`��Q���,a�Mv:�_\S4x��#O%��N��a	5%J�U�T�4��x/�z����K�B����Pa���^'���	g;E$�7z��(�w��=&�����,��eU�a2��6L���c�*�AB����Ϗ�{��I��G�ɞu5���	9?
�ÓO%��@�O���G�d+2�I;�U�K�o�Eq,
<�_����É��.��UC�J���B�߈,>Y�9
����P͟dպZM@jc�[��Ë�>2
z��8��&~^��ɭ�#��P������Ё�
��XM�l�ֵ�%�`�;�:M��ˣ{�'0u`󒆿O�Ƹ���c26�
@ԗt������!萋�Ȫ�N�ee��E��3���!��:��!��V�F�*A�ʇ�L���Sm^V�pO������~a��#L��j \juW5���7���:��m[� ���|J�	���?���q������k.頌?�E>���6(�ku�ַ;r��$��ǎ�s��]��L�#Zן#���3��s*�x��r��5�
 �8h�7^U��P�6�t��6�Z�P<�i�o�Lz|���b�T-KQ�a~x(��.�_GG4Z��!�HG�zߡyL���]l	fr;�Mo��6ɗ��A5�-�n2��g�HK�Rk�Vx=e�l]��@S�I���[@���G�Kw
�L��T��b+�y����`�8����r����T���P���[v�\)~\�CU����vɀ��Җ�	�;���Y��Æ�>!���Ɵ���w�#R��x��h��h��;���t�UMFeSƀh�d���
U%γE֘0v����j��^��U*Q�!	`��i�����[���HlP�巡w���
��[��H����;��i
-9l�^�(���F�3,9}~ü����R�^ߘlj_��Q�]�	��RǦ/��h$�T�ltR�/ح��M�I
�H��B`�a���Ő�7F��^Ud6;����=�a�ީ�w��w���/J���ޭ�Q��0�Ɩ`'�,k��ڸ!�?�ň�ᬖ�`�a��a�uMlJP�	���$9x?�̲�^�9���:��a=��-Y�A�'���Iw�����H��e���c� uҬp/ⱙ�ɳZ�.! tϭ�l>�F�19�|�f{���'x-u��l�ʵ�&�%1�je��)8����wrM!�/c�Z����€zu����^����L<��/3/g�gu3�����Eu��Yg���2\���q�����s�bO�saf�|3c4\F�
� �t��N>��AO}�S���8v�|�~����y��F{�^o�?�{���\Fs�<��5����+1и�c�	��M�Sf1*!)/|`���<�^V���oL�V�H�\��,y8�Ff�yX����z{�.Q�Eov$+����EN'J���ǘ:n֘�K��>��{P�������?>��ු+�klU��H:8���SR�WwX��%�',ۃ�����h*�ˣQg�Xߨ�ޥ��N�\��b�a���hi
b�F�+?T�ƒ)�B�f{�
�W�Hd�%��G�yΎ�a�;�s�ߠ�Y����B��U͡�@�룳���-�<xL/O����It��m"<���W��?�����&��v"1�/u���(;�ɠ�Ld��-�xU����n���ʼT\6�c���Ux���0s�؋�!�J�ϱ�꬘\`L/w�k��y9x1��pkN~���F��&9}*-l_^oLwH��g�_~u����na�2/_�������-2��Ç����	q��8�1eR�"�/(\bjW0O�y�ތ}Joa,>���޳�����o��'?��[-�Ƴ��#����k&�?�	I�a6�京����sL��;��N�\<��5�]��
!�Jm��� �F�ðI�M���	�� ����������@��D��ރ��N=޴2t�b����\�xc��u�K�v)�0�^��&Q�
kJ��ց���=��De��ߎw)�&�a��N�e�
a��Pŋ8z���#]�-��[�|���C>��n��C�j�!/���u�R�o]�����`���NɬwE;zj
�eCtIۉ�N�B�Pz�]G��v�����vw�u ��<�yZp]F��?�@��Ք�Ŀ��:�h��nvTUF�}t��Z��Z��z�Tae���ۢ���m����W���r	������Y�:��z�MK(t���Bg���9?�q�Ŷv匆���߃�b/]_���%nS!
�ϩ�.�x���P[
��ý��w��ltQ�ׁ5��jl�-�jjW��b��EAn��]�G����<��,��b�]�hz��@U�G�6t
"�Ygνk�Z�����s�e�JjT�i�F���`/g:f-��Et�q�1e�Ɣ�S�o�I�s?j���`���P��y��;�6��S3�spĻ��7�vn�I�ajėhg��<���пQ\�4�j妃�eM�K�* �=(-]t2M6�,��S��'��*�P(�Q��)�}{2�C�F�<6�#��[����-�����Y�C�R�*o���|�B�arz�1� �LazO9؛�Sܺ@lP�����fE��z(�ͻW���h�Τ7��6dq҂C�)r�K���p�<�a����R:b���Ҟ�?3��J�_twt��[2��������h�$F�_��"�}
�?�Ǝ���/�3;~Υt.��LC��l�\��I�8z�G���ј ��v
�>����\L��
��&>گ����{��G�Ҿ�Q9-jsr�āIp
21|�1x88��@*����Q����V� 4�Ƚ[��Hz�d��4�M
��	�;�j:���:�w)�k��wm�����s�`����'z�]u{wF��
j�h�掍dͤ��
�4�OF�b��࿬)o/Eȃ�I_i/�6]�jQ����x0"͌=����C��`���ZdU����!���x��1U�$H�;ꢒ�P8�ƞg�{I��T�T�7h������"�g�A��(�S�	���|	[F
����	���wQ�?�Mr�1�:��%�cF�;���&Ҏ�: �����\��~&:���ܘ��#��ŜN��N�?�]���>K�ı�m�1]=���Z
{��#y�sߎ�AN�;r��\�oW��{�14-r�B��6����^�U$��hI��5�%A��u"B����t�踲��n+�oAc���;0����uԾ��߭<�KO\�fе,x$:q�Y$[]p�̦�:����:ڨ�����*tH�P�}w�P�ПE�:=%O�gIpL��kT�ԣ����v<:���Ol�M�N��w8b]�s훵�:�J��[�)ya.Fn��ѺS��b�6K�#c{��h�R�w��`^�eI{�!]���m�ܨ݃^�d#�
���‰p�B�\�:�-�8����D�v���gd;4��kL10`~�J�f%�ӉZc0��O�M�uu$
���uw'�� t�M[�֠6�a<�F���c�]��c�w5��W��H��P#N_�{���)��0e���<�t���UN�Ox?�xi$��U�{8m�۞v�.�?W�׷��[&˂2Ǧ���Qf�(/�+ ��@S)��]�[zm��(�] �[% �qs4ф��s!����l�;X�D�ɢ����5 ���G\|�(Z�$�L��T4%��	����^��D�HfitY��E���N ̘��<�/��8m�1g�i�[�-��J6�ec�]EJ��)�4�wQѻz���gv����h�m@��8y	�#�Ul���fcn��6�CrjW���dS���6������?͂%|�M�*`��-��m�<�����+K)$�+K���WTN=����^�^ӁCC��4܎Ñ���U��T�(�m�$����:J��b�d�����z~��'z�
��5p:6֌l��\9�b1
�$�n��e�=D6���K��>#%�sT`BDԤ�2[&��*�S��B���E;��K��DU�"Ek���_�00��<�m����R���q�:N�+N���;�L^��LN4�̙���݌���J5C8ΊXmB&�ˑ?͓/��-���=�;`@��̟]>$��:(	'aw�Z��浶��2��E�
��o��y?�j�Vk����$�T2�0��EK���ݭ�͚CKߩ���n��2#��A����z_.1S��;CE��(��,Z���KX�E�.�m��'�]?+ ���l.3n���c�>��M%3�PK/WUW�	ms�S=pip/_vendor/packaging/tags.py�;�oܸѿ�_A�(�
vۛ�R#N�$N�@.6�N��C�%�͜V҉��=�{g��D��G{�����1�=C�;��-E�|'u��T�<�<au��U��U�\I�/�f��b����f�o��"�&l;؜�(K����c��ᧃ�������=+�R�����U^��2/Y����W�%��D*��D����X�_\����iT�����ki]�y��e���z���`+/���	�wp�9<������Րj]�Tʟ0�� �jFW�W�s}{��Sn����'!5�aQעT��_j��z�I]��_2�R�q�c�ER`�	WQ�NEV��ຖ)]O&��߮aTp��O���,Z�0\G��2ϴ�r*��l�C���*|>c�rr�d�ǣ��3<���Ǔ�����;ĚSY�3g0��4���Wތ�
�W�q���-@\x33�qH�D�y�B����7@?��L&�b;|wpZ�9� �)~���.�fϟ��6��i$%;�.vFϣ�=�˒K�UJ͘B]����Ո]_r�����3YE�Iɢ��gR�=�]�ժ�PA���
�2���4`����j���Q�XG�ʜɺ@��$hh��0�i^�0��z!���@4|��0:�m�npN�L�O�p�LTa�K�.I��#y}e����߲�y���16@�u��5h��>GޛY�\� 7��qX
.���Wh�8	L�)_� �D���)���]�4e��*J���88V��W�Q�$���T2QI�5H������W�⠄�TA��U�F�(/����+���U'c2��=MĊ�#�`�?KR/�?�C�%��z�"�Bi�����ч֕���Ȋ2Oj�P).2�0;x˂�.hNe�_�B�<Z�.�+�AG:�q�~�~Of��gqN�J���֍FZ�	#i��*��ˬ�oca��`�1��Ǡi’ec����r��V~����:���%�,��(@w�7�i�}Դ����W2Q�y2�R�;c|[n��u;%5�G3�Eעb{�{GJy�|�=|����6xi��!�o��n��+��i;rj�^��Vp0bDpi���$��n{���o��5׆w�=Ƙ��xC8��_حH��[�3!͌J�Cp
>�o=s���Spc���@ѯ F%�|\�k�^�3p�sH2�N�_98�%!D7
p2��R��\���R�_j��/�Xh�\Jq.(ؑo5Q��Jz�wA䕚*�8����:X���d���}o�!�ӶBAd���,��=�+F�c���C�nhb�DI�s}LJ��l0N�
�v����T+E�_���**}�t���l�\p�#���N��Fv�6*z�9u0�]Kb��A����fl��r� ��뙼��0��r�g��S��1����w�:Ί,��\)d7H��,6U�9���_9Z8(���Z�i�иz����c�fR޴}2�O� �E n.}���W*��aNމF�?��WP� O�D��5�JT������#�x���])+�LX@E�8��kQz�)�:�N�[��rV��ow�����f�:���G�<��X+a�5�E�V�)hgǴ\S
� ��E:�J-���L�s��`�H��B}��}6�n�3�
�᲎�K�Ҭ��,4P]����w_��+�f��/㼆ԋR��� �Y���C�WQj���`?��1(�s.�g�X�l6o*b�V��D%�P�'���k V��
�
��&�B5а�UUȝ/.`��y�^@��(D�BHYs�b�x�ؠkx��6�n���W�n�S"��$(։��8Pzk'bq�[��c�N��fjyW#/�rK�ސ����i*K�=��tp�}x��>}:|��զ��T��\�oM�<[��E'tԙ��\V��*��������(��hv�Kb|/H9`�,t}��#�͛�͏����{ƞj�n�
��-��C�y-R(��fQuq�G	�;��:X~��0(����,�}y<��6�)�p;��=xs�%�ҋ�[-�;m���!(Z�mΚK{�-�����xw����Q�\ڽ2~����!z�\̈���цAE�
�^�����N׍V�ku�pl��g
,H�#W�B6�����~��M(`�V�@���QYtz)u�潎�v_BE�H}�K�pLz�r��
,>�rގCb�~ ��C��ʸP�p�����u�I�<f��U�j���,]c+ K�-,Ȱ�YQ��nE
:>o�H�$Z�Jˁ�p
��9fh����v�gH�34:
��03-�)�M��E
0���Dɔ�3j"#�荰�֥�9��`qS]ew����kT�Ф"[�"L����{�%62J.L(�*;�Ex1���T�6������g�N��]
6���@����
$���@w@C�y�:�U�(4:���&̈�.��r�'��U~�}�������e����
�~�:����]����E�U��p���N����"�W4XLRHiC�_*ֶ��!V�|?>ѣ�=q)�
j��l
ЕQvѭ4N��n���|��v?�p��	���@ܱ�.��g3wA�i]�Ɉ��e�V����\��0��N��>Z�{LJॽ�兺*֯���
��6opv�خw��S�ħ�
o,�,����&�E	�6������dyWu��6��C�swb葵}��hg��>2v�S����%�Z��:��l�{&�9�����@sk�+�u|��������C�g�8��HN���ݬ�M��a��7�ˤ��e�`0
or	|F���E�3��9�)I�KXɕ�k�NO[���9yfO�U4�����~��M�:������k��zAj>��)�Jt�R��J4lgU�޿Y�=�C?��>��J}ʀ���Sm��>�Y���L57�cԺv���H%�f�Á�m(���W�M�˵pø߾���������`O�^�'�熆��h,��X<�[��J��Ů"�/e|���2\l���� N��[�v���az-�����&�UTVU��"� =�O쎍'�_y6��"��u��V�7��=�3cqQ����z4�~���j`/ϻy�*|��s�S�/��9c/�7�uQi�P�.�O=�j�rYF`W�m�LW�t� 6��T����@8+6�������e�btj�y^Wl�=�`GG�Hp|e^_\���`��CKy����)����39���}�f�����:�G{^0�[/*WJ�Z��vF�Pg���mo�F2�*23bR���Y�$f�U�i�C�k|��� �a+�2ġ�;yd�F��挅U�I��S*���WM�W<#�8�sc_����`Ֆ���ksXHak�~9�|2�����Wי��?�B��b`&�w9$
&�G%�:��W����j[W���uY�Q/�
��&⒧g��'�P�W��2�z�J���2mS�����iKݚ�:@����nS�ŭ��2P5�E�ͬl�v�Y��OF��1�}��N���#�A:@��Q	�A�SI�4�y�*8U��]��+�W�P�(v;�XG�u���;�Ej3�\�Vf��p�9�n�5,�b�2|��;��bK�u��&��MxK���o$���t�h�n��]g�3��]�n���5<�זcLz��P���ʠ�ȶ�d]Ql�Z�ԄJ�������
�H9��َ� �q��b���8�`�J�Y�ҟ��Gg-a�<��n�H�����6�V&gxs��p�p��D,�<mm��d�{�;��Bh&a�2kk*�O#�։��h�����/�+�����n4F3Ԙ���1"���Y����9*da���*�i��zh3��#.w�Ռ-l���m��72C�
�~C#�?eH.��k���ul�3�ct���H�t$����߳=R OƓ�4&��<V����@	A�pH�У�5�p��]�^KC,
>��r�=�I5�x���J�.�M�!<P1^}�*L��$���d�!��[�}��R��Bӿ�j��3���3��|�n͵����&۸\�o�	�@�x�Z�c�#��Nr�i�����Me�**���!*�Ef�K��nulʏQ4��u},=�c��5��;^N��,R\W��2>�Z�0����5l�6m��Țȑ�͡���i��Р>�f����{WdE�G-�:��2n�)�΅>Khm
�)�P-t������A2�-wOw뀢m�}ώY����ĺ���.�B
�(��=�!�X:�!�7���cʩi��V�i����"ϰW�C�
:��BAk�JNv���*��a�t�ҿ3�����G�(7��YXFn�X��aG�\�9G�Z�;g16gg;�Z�.ZxL�?��PK/WUWA��3�hpip/_vendor/packaging/utils.py�W�n�F}�WL�"c�p\�@.`�p��IU�ɑ�	�ew��/�wf��)��KZ����\������=��r�b�1���P�Y!Tk
ra��)����j�>��B��$Ef��^�odb�@��g��N�/N��ž))Mm�"PXJ-�T�do!�r]�h24��u�yb]JeH�[(�s[�b	��wX\���7��%ExY��>fi��W��&Y�F�2YFP&J㜎��u�\#sZ\'��\�]���J�Y�������̹���B�F�f޹Tk2s��y�FRq���oB���<Ѻ�e�� �	>'y�'JIN<����
E]+��5,���J.��T�2��U��.���'��𷸵��E&���4k�D��gߓ%זe`Y��!�Ӥ��H-`s�K�!,��3�)P�t<�g�~H��r�P�#\q����Wdx]Qh�$Tߍ0+H KabonŸv[�f�a�}�Q�Dd��?[F���h��w����;`��}}�k��5L�w$��*���)�(�s�A�VM��Ta�=:�j�;�v�����幅m.�aX�&
Ҽ-�"Ol-�j<���|�V��@��
qA&Ty,R��l�6�-�.�u��c�I�k,L<�A,(QP5�T�C}��`�e�m��_��g���a�a+�7)��hd�p����5�Z�]!-�W!�`a����ֈx��h:��<�A'�LW
�R�|�����qR�Xd�¿�>��m\�s��;=;��Lp�������~�⃑�R�yz?x��ýʷ&>�_P��?��oR�nB�7<\h��a��Q�؝ne\*;��s�G��vHFz��6�9�G����}O��=^c.K�v���y^H���8�t��T��[��ٿ﫴n\'7�Z��^�jgм���j�Y��<K+���櫖~�Au�~J_g�I����)h�d��f��=�ޥ�9Rwt���nT;A蚏��(��}#���R��q�q:���,�+ԽG4m��0ÇM~N�Ӥ�
�"x����Q�����rQ7��95��F��\�z.�p�pXg���@�Voz0s��[��ZZ����	c�ib=�(�
Sc�5���ψt���:1�x�����,��^�p��JE,�����OB����~8���)��ˁ
��k�h7�j�^Ͷ�|���5e���l�E�w����ә�f����ϴ۰����9��:G��J8L�bJ�M�	m�A/�x�dU��0��y�����ml�5�F8�~�����8�Ō�]9���j�Ю�8����]GKl����K�ޅ���>��g�G�މ�6��l��^��x���~5�d�:�_��&����=E]{�!Q�V�]	���$tt�s�t�>�ʂ~��.FΌ��������Y�~2+���Q,�Vi.n�j��D&�>�oR|��a��N����<qB�PK���Wd�Y���8 pip/_vendor/packaging/version.py�[ms�6��_��7��yvڻk5��4�u<�s<q.���T��d�ɒ�m%��gE��lO2��i2�H�.�}�#�]D��E���.e,�(TI��b�LU.�%J�/
���E&C|��`�^�E�&��4��L짳W&gJ����/�NΎ̄	��ӴԴ�A�����4_��,�E�.�X�JLU)��z�h��y��8Va���*�e��Ջ\�_�2O�d^�fy��*Ã0c/e�I�������^��&#�2��eF��q���A�'�uk���(�eX.sUX���,J�r5�~�[e�;QsYFWj=�|Cp��x��cq νL���3⦟���j/��+G�ڛ�Goώߜ�O_�{w���zfEs�ͫ8��!��Nsu��+uE�MTM���`��Ѩw���NCoC�H���ڠ=�OG���O��p���Ѹ�8s��ɁC��V��~��Q��"��Zam5��J��'0F�J���
̢5�1Wm��f�3��v&�H���"�˚�f�\V��l�F��1:�M����L�5�
�PӒ��T�x���<BxA���XImSuE_Y�Op%}�$����j&�f�W�֐6����׶�؟���������c�a�9�!��r�O���)�a,�b�����H'�a�L.�8<X0��L%S"�i�Y��Q���`{�G���a�#f�]଩�W�JA
��+/���M�2�du��Bu��&���2��2^��<Osߕ�,L�V+���N)"�@,��E��I�3�M�]�zyv��O����Z
�ij��Hs��Y\��B�3VOk����5��8e5�Je�uShv�!�ר����I�~���1���n8�iK,�Iq6`�$VX�*]"�B�$�"1ȫR�S�5�ޅ�S1[&lbvA�s���4����v��	��5�ٮ
EL��+�3��?t<��IZS_�R�5�X�P<���C}7b��d�`��&�ڴ� >6�9�s�p#�N�=�n����\�G�:���Z(�Vӊ�'i����)�? (7���X=�X�q�����SY�Ru��ǖ[v��(.�D�y�\�<�D������c���UE9[N���T����0_�gN�C��&d�m���-�t/QŒ6��/@G��؜I~~T����]�7t�)�b+!��P�LD�g���٘R�:)aJ��\��|?���Oĭ8��G��Cp+v}�ՀB�ӛ�#�M&ː]�x!3��39J���CoP=_E��y�KOȃd�k_�Au���gS��*��SY�'�-��L%@}��,m�H�������Xv0We�@��}�	L�r�h��
�4)�d�L�>ooo��������়�d�Py�2Pp)d�D4�8���ڙ+(̰��O�f�*)�9�S�2�.�_'��
QGES$�Bbt������:5~�٭t�F+(Փ������=���S%�GR�iw���@�h�S�
�X���4�!7���6��K�N=4d�{��]CRB�fT�^)ɖ����������J�B�j&C��`
�1C4'�N���b�BD@��/K���#�2Հ^�Av4�j��Ky���[\���[��<TE�Qmv��(���V6���Iʝ4�C�dx)�T���$��Js��8���u�Fm�`[�����?lB�5zZ�7� W�M�T*����������*�K�>��X�Eq����� Ʉ�1���W�"�Ҭ_��e.��D�Q�i��HI�&��Hq��4s�lgm�|:x��K���-�5f�"�d�;<K9ݎx����m�,��!`�d?\Ӗ1 luG�]��rB�@
{�
IM��rV�m`����P�_��p�����������g�����'�#�y�VU�����3�=�h~�o�.
V�
5'�vhA�Lߢ�]C������`��yg��þ��܆�yx�����-�nM��{K���õ����k��Pt�	�ݵ�ɾ�����R���y�|�������'O�"���I@�_���Ϧm<ք�﷫�yW}kD�0�Ї�Z��d�7��ʠvt�m�S����P��lHsu��E���༣i�O`�����"W����'o��|�Y*Q��[�aG���%%1�ll4�� WEEX*�H!�VxYr�E�((��Q���f�2J� #L����К�ǟ��Ϗ=��Y��ʄ�Sd*�U�{�X�f�o�}�3��Xy���y�������N*Ş{c��@���#J
2���7y9�f�w��M�t"V%�v(�k�h�M�$a�h��K�L{�� ,�c���n���}VȎ�57�{k�l�Qz覩�c�؎�����ȳ�	�3_Ζ'�2`]�i��f��8�52��Ý���N=�%��}�:�m�6!nf)�D���V��-3�r�]ۚ#'��y2˺Vxt �\��d3����#�üݐ�8`��oi��kx��������������Gu9M��Ӟxۼ Ә۾yRJT�7��c�O�gWf���4#y�B�����g�'�՘�u=�v�Φ#�}�{�i��Lg��J��4�V���
���7���n|6N�k�a��Fs�,#��V����r޼`Qc�̀-��b��mb�i�V���
j��sjD�:t��w3�!��sZ2�;gm4��y׍��U���f�gs	lk�ݧ{~�#	p�6?z��x�?�}���C@y�gzH���YSZ���ʉ@g0�']+�Dw!K���P�������J�X�At*�oj��SEɃ���<��;�
��S=�<շ�T����A��t@ݽ	=�-�j�*�6]��wW���4�k���s�"2�@sn�M�mN��(D=�G�$��&sc���F��{�#��u}F|'�:�����契r��3v`���[�@���\�����;�"$��=��v�{Q�%��|ZXi�J��)2SG��e>i7�2�֨�]�l/��9����+�FgEC�2'!�T��:1��.�@x��k�q�{ҫ���&�xX�9��o�S��&By��R�o����_�q�qV���*9i�A���1!w������>��w更��-K;D�찦[��ML�f�[ԫ�}�l����*)��`��`ow�o��ܫ�k��s��q��h訳h���?�ݑ�7�S��4�j�Uf}ֽ�N^B٥�6G���$���Z�t�F�mQ��('�h �w�1F&K�F��k7K������X���Fs�B��D��ul�<x�LMR�H�ma�[�zf`���=�=�70P�;���1�ހr.A�5�y�J�p���2u}���
��BA8>�	��Ar��/}&6
�Y
2��,�D]�Ә��Oș�J�kC�L��Iņ[�z�a�HP��7A�1��4�8�y��D��Z�	,L�C:̟d��,+*�[�:霜��i�Q�Lہ- a�
-7L���~��-����\L�R�����
�8UNlNP���e�>��`�ᥧ#��K��4�v-�ι��(KܳG�x��.�}���ENVpk'Iٰ��+�;�C�q�#�P�e&� |���!�c��|����Dc��J�6����/ce�/�C��\s:a�46�q�n��7)x�bc�F�𭿴h��a�t�
6j׻�X�\ߖ<�MN`%��DMkrVV׋� ���!��qYkKn�j ��B7õ�q83:��T4sDZ��=�����H0�-�Nk
�.�Y���6��`�=o�筼�"���m t�w�A�>P�<�	�����M��-�S!Wgߘ#(�yu��ͬ��P|ztZ�%��/(���Aⅳ����cu��<��ED�W�I'��Ԃ>��(����q8��d^��y%;�Yt��,��Du#�#56�'�ӏ�`y���G�M"�o��Z�܍�ג�z�cn�P5`�0��6`E�z�PK/WUWS6�Zt4�%pip/_vendor/pkg_resources/__init__.pyԽ�v�F�0�_O�P�CҦ�K:���(�ܶ��׉��v:�#kH��$�H�@�l���H�ξUծB���̬9ZY�v�v��=�^e��"O꼩6�<O��z�w���{�M�%�ꢘg��X�ɼ*۬(�ErS��E	��z�T�k��l�E��۪�&�e^��y�$o/s�7�$��ƍ{Xf���k��2��BQ×�%���vM�f�$���f��^Y����Kxq���C_�70΢��<�h�l�<���ZT�U�$��*+��f	��hX�Y^�0���%�Ů`��^�a5yS\��7U}Ń/�z%�l�6_���^�_\�I���dS�;��^�T���<��X6�vfY�
Z�lK�,�
���盦�Vɫ�W��re�����&�f���&7�]��t���h<���Z�ta^�j�Y�<�5�:nL��� ���F��!4>�+��,�R�F�l���^2�rF�=\o���6`ӄ��`��=�.�54�V���2���*7���v��mcX&\%�'�f�du	��M��w���Zڗ뫋M[,�Ūھ�:0ϫ��
q�5)\�w�ʊ% l
�k��u馘��	�������v1�O���l�moUS���v�׀)2y� V�0�����%�#o��^�~����9=:���6�ɫ-`Q�|�>�y����X�V����aH��0��.
4}���zZ%G��7�~oN̺��D[�f�m�D'
��Y�6�'\5f(�7���
�|H�DbGuY�W{�����O������oao�M�c]J8�5�]s'ɺ�β����L�{r��-�a00��װj���y�4�,sC�o���>�#�́��@ճ�=���{2�lGN���٦�<�[E�&�ȗ���,a>��۬�Tu�u�N����i�E>��yQ�fe��:����2[���M:��
�j�gŌfD�E�\La/��E]������l��?�����X��?&{c��u^.���<,x���P������t4T-S�$�ˮ�^��;�ţ_��ŝ�����8׻}��꫻����{�9�m3؛�*��d��$�r̛Zg��כ� m�h`�Ǘ�|�E�W{"C^�x��|�wPS���b	�h)��M�\�U-Ή�am5����9�@H�kp	/Z�Ĵ�[�([,��kB�)���ϼ�Wݴi�<[���e����Ծ?��t��0`S@�:��cJG;���xr3��N=�ͮ��5`u��*o<��9Q`���0M�q���a^�O�,��W�=��z���)���v�ZQ�7A��2lɀ[����m������5]�)�YZT���G�>��j9`"�L�ô~���s��WK`H�G��,�M����N�}�z��/0�:O��Ճ���f�ͫk����7�'�xz���7�<y���{��7�sh�a�Fr^�O9J�,�?"�zs	w1����f�3o�%r �xY�A\3�v�E�!��!	]����=�Q��QҡX�_�_\䢠qF[��#<���L����FV
X�{W729ԣq�Y/���
�y�(�m�4�*�6�p����t8��?�����GE¯�S�`��2޺W8M��@��N�N��p� �4L�'ק�x��j����vT��k&�s,Բ;
꺑��xa�#���GC�Ƶ�
Y
�����z;�J=QcXt��&��Au�"�e���7����u�o�׹|��}dq	!��,1Ñ?���l�%����94${��e�SsϏܹ{��mQh2�� ?e��fe�`���a~
i&�)���q�E��α놮�UQL�s=���/��Wm��ͅ�<�=���8WC�0p���^�m��$ɟ6-I��
P��l���/�9ތ>O���_��
��`Y��+'��^�)�j�C�A����4(WC{{�',��hi��Β2���3�>V ����i����o�7��/��V<?��voQ��b�4t�r�THM�e�6�6�$|L$6m.��v,�ޚϫz���ԣ�) �٦Xj��'�ԫF����v~9¶���n�x�k���3�c=:J���)ʁ�'V\0?2�!u�����&�'�a:L�[M��
�������$Y�u�Y���-4a�-7Z�3?�4T�Tpj��3=4�Nah'"��)k��S�������%��yu���
�
'�禜6�X��	�ֺ�.����t�9�_4�����U��>D��<�ppvd>�{e���:/��<g~��Oy����E]�(WdK�+�Ւ�07�e�(�q�G=�y�쥷�vX~ټ��ަ���f�N� Z�v6���-
oK��h8	�d9#�P����'�����CVu��xA��N23��q�_)��u��C�$����i2_
YxZ��@D�X�/���
�v����fy��h`WTC�O~23j��n
��[��?>�"���֬%3��l:�o�@l6X��az4җ�E{!�W�'��`Q{�9�Q
;�2�U�T%�0�b��y���
�%��}�+V��MM#+�
$������ 2�G�"/��$�Bek����Ϟ�yk��'���=z����O��GO�|��//|�=|v����_�����+������s8�p#�J��u~�æG�Uu�Y�,'#}��h�_4��9\�T��̳W�J�㋋Σպ݆�r|�!�/6�e� ���1�	�{��2�g!��#KwZ���򏣘��uem}J����x_]��n�B�C=+�?8�N@r_cU.���*+�Y}r���峀��ZA8 t#K7��!r��eMN��"_#�Uη��\��DZ���1�k�幒���OA���L�Ve	�~F�(=8�= ��`����=p[/�h��C�b�Fü'r�H)�u���}cYL�ڂ��}�`{tϠ�`��H��)$�,B>���N������'��~�y���Z絘pʮ�%>yx�9����G�{�=��-73M���ѽ{d�w����.�6�S��mh���\7b&�< R31cȴԂ�Y�BŎ���d���h�  ����p5{���."��H��õ���J���%<_�0��[�r����ë(ۄ�5�,��(��
��	ν�e�Q�߽��A�v������T6�nE�ǎH��~��D��T���"�9~���!ȇ�w�J��(��Y�������9�;	wug��7�#�͟W�
�5�<�v�cN�}h�ߞ�Mq*��B�ʝd-=�c�w�,��)�-{�d��O����qFSsQ\�%����2bS�)�%.r�`~���O���ר���1��qh�Z��{���_�)��~��X_��ў�“�{���De��F�w2���o�6��Mfa���\�k�O��o����t���*�y�`a3�!2���05��t6c��hd(�Fd�ZH8'�w&K�1�{	�h'{s�1�u�ٌ�BX���Ȇ��I��=��ߚW#��������u�%�bץ��g��0C�s^4ta���{�h6�{��$E����k��E�#UC@��N�xD*>��9Q��'���K�
p����D�5��Dw���a3TGz	{� ����"�>�c�hmJ��z���SYk!����T��D
��bdW@2�†��+T�k�nA��ZS8�H��!����Y���O�:���HT�N����z`�q�HY7�Fc�3iy�5����h��a�xE`#��q2[��&�mj���_C��WdTheCԊ{@�;�>8	A�KhJ���e	���@��A}���*jL<�F���_�ĝ�7=}��n����a2\��x�ғ)�>�6���G4�(�ĀS�'���f8��yz �ڹ�W5���ߒ�l�Xn�P�-��{�f;mM�e��Z�6�2�
�V\��%�}Qn��e@zy�8���R��Ef=�ǬA#0e��H�"A��ŗ)PW8{(l��!Bct�h�P�3NxmdϠ
�
Rz �;E�f�)$�I2���U��H?_|��"�=�ek��p<���Q�Ag�V�`_��Ec��l�C�H���	/}��H1a�g
R�V{YW���DfE�(�|���tMY��,����]J���{c��ί���ud��R�����5��Y��Gr�-�6�����u�e2���9;"lNB�6 ��o�DMüU[or�ܼ����l�Kgv�d���2u�_uG6��etS���7y�S���̏����vGG����$�B��!�D~��d�3QK�@e�P�w�K�q�'n8�[`�)��Ը���_��P:��A5���d�%tI�9be����0�8��a��i��r�]vN�rt�I|���od��=sZ�\Ϙ�%���Y2���
����#�tM��h��Rh��w�ϛT�5o��t�xG`��$��Q�h�A�P���<z�~1�6G�����O���.��O�$�N���$��~�Of~�ͷ���+Q���=���)Ye����L�.a���!'��O��Ql�!���f_��:��`�w�$
&ͣe&\\"��\���k0�C��kzb�]F�rH�C
�L�>�3'U��{ݎXea=F�+N�$�'d�p��x|
��~�axk-�:
�L����lD�D�sT��V��S�|�6�{Z6'Cco��מ���?�_���M��T�W
qp�u���`lV�[X��׋B=v���[@֔���V��&̸����[�pi���ݐ��$��`�Ń��W���i�9|��#.���"��oĩh@�������f#C��6I|�͘1^jG��<��'��"Ğ�BcW�	fCd$��O;���Q�c��HA�so�����m9��
�����m��P`w��<�������Fq�}^��O?u�4�`MY���8���ˬ��8�����Y��% ,��a��I�`�xe�n�v>W>k�0���~*�G/�]�I'U���w���+�M�_�.���lA�!Z��,�C��hٛ/L�z
��& �����g�3�$�s6Á�5��
e~�Q;Ȍ"�P��#�U�+@�g�x�D6VԺ�|�$�eq�1�F�ưƳ�8ޗ��Ez�^��v���!.fV�h�u�뽘�����|N�Xv����=��E�p�'�
X��[���i	Uߣ�QFC{a��^.��xZ�U'Z��`q�q�b����h�]j{�����^m�9<�	�{	��)B��Ň�ޔ�6Pԟ�W
��0@S���b��'�V��B��W�"QȒ��71�bq�c�!M�a�O�}_�]]xDÑ�_B4B�]������C�|O�}�E��k}�A�_���m�U��j�)��M��V$��	�E�hNEz~
��I�[�xA׃�|�7�<���Ȍc�V��l�%'��7�)F��x���D^X��Ŵ���n Ls�g.F ����D��Kun�fj�[�̠�nKC�k�>X9��G�s�w�ê�U�6��|��x��1q��XoT�m�'1_j�yG�N;<%i:��ƫ��NC%u'���Sb	��~����H� ¸���o-ڳ����ֱV7���t5�OT��c`2�.���@uf6�v�:$��qt�~ǾsX3�R�YHAF�@��"t]�B�X�j��@c�5�Q_�m��@D�F�%.�Zl<9վg?7�����x�-6��m��5�??�Z)�����/)"^�bg�8�"k��bA��*r�7���{���;��e��"��7��
�Юj�%}�m��'���V�Wn"*�.��@>�U�+#����F+:�Ա�^V���ͺ!<�	)��D¼i8VTi^Հ�;{�����#�%��Ą(Ɍ^bP����a�4w�O.Go&����5�nm�g�֨��y�����lLj���()V1��YEd.s�٪��v�h����1F�sr�E�7�8J�:�"t�l�>���7�}A[}B�1�e��W�h.�!)A=�7Y�Ʋ8J�'�{+v6���8�Z�hQ
W�ze�+3)�J��������2c#� �[��[����L,�˚��Qq���"���;��l�2L�A�FC����Z���x�`��F�S���h�	��]�(##L/܍N�g��Xs�L�d���L;H��H�kVV��fF��8�F�N��1Et�!�lB��cD=׀���t"��T|i�x_�:�z��}���J�r��C��'x)�D��ϥ��7�Dg�QkG8OM�ϑ�q�r\��2")����B��@�����yHހ��ɖ��p��Z�.I�V�M����׬�*�#�����x����QY0gj��r��IÂ�0��?jT0��_V�7�Ҭ|�C]^�yi�*"�1MwJ�g��F�[��ۥ�djmM�3���tDH��ɬc�5Q���˸�?w1�Q�^#C�m���؆?�5ݸU4��̢M�t�:���h�k���ņ����`wdP�$dd�3W��Q�~{.�R�hc�k+nr�aA��ao��</}����ƹy���е�����}JVS�E��$��4�$W�^��e�tv�9�z��v�y�u�,�	�<%��X�uPsO�P���rGL��s��Y4<p��w�\^G�M27Z2�u5/T&Jf�}�k�dSZf�쎕s'�7��Wf��[�/A�}_��M8�m-PT7��h�?�(�0�6>�?bY�&#O�@��J��-�>�flJ~�tٴ�O�az����}S.�v03[�8�x.ꑆ4!��i�L���s�ds�d�,G=i��%�c��)��7N����c�>�Ŵ�PYk+V�Yȿ㎾pۯ-DF��0Xc[�j��d*l�x�W^o��6V��a��T�>�'Ӌ9��vLn�*���S�����T�]>�c��+�=�Z~#�ɲde*��]��IЏG�W�@SE��Ԙ[d��@z@<��x����hL�F+��5�[^{�<��d�i^^3EuC�`�:x.�151ʰLp0��j�w�ݎ��L���|< f-A0&n����P�sg��I�(V�)��l�M�(3�����Do�1�NT��l)=��֢��=W��*��Нqfb�m.�r�vi�p�!
Ռ����l�͡C���2t�,�Z6'�.��)�Q=��J݈u=��pƲj6�y6�N=���R�l����{��2�#&,���D���j?���	(�*������լ#�Dz`�A�:����hgܶ�ۄ1�6q�:l�/�&ՙ���DVzːBK��՗<�F	�3�8�*����Ycj���7���Ҩ(�ԃ�Œ��#9�^e�s{$l�\mQG��O%�9^���\��9���?	s����~L֛:_��R��gK=<��_zb��l���l�^�]�yG�$�����,`!����͚LxD1���'���NP�Ģ�Y�#�/�ړ3��;?�ڿN�rҹ�vp�	L�hC9J�@A)��e��pK!!��}JR��Ϗ�/گ(���͒�L�5F��G6;C��M���kJ��t��T/�,���1�-}�YYQ�J��3�|���/|��ɑ^��z�V��l��
��qϙ��o�0U�X�B��ù�T�R?�N�ܾS��A�����Aj��TX
R�w}�	<b�$�4 �|=ql��Ac����&a�6ͥ
S�Ye����48��g)Bee�s)3s�ͩ�F!��@m�wt������pD����"֬�I��L#8I��X7!�Ӂ�8/����b�	�85���Q�\F"-A�\�jtpʣ8�Y��o�}]i���M��j���L7�D�=�.�1���l�{�b��6�Q�,�\\�ՉP�#��A�����iM�B:�l�Z�#� |�C��,�Ϋ w���s�x[!�]W�b(�"�75�`D�4�%�D�',�����gƍ�U�{"�g:J�ٔC��]�Y�i�����#�:�V�#��~��Z<��uv�Χd�&ʡ/Ub���Z��~���j�p"�.� i��<�N�����]����ĉ����-���KZ偾��E���rs�/�X�kJD#�V�*l>���Jo�� 
�B[�1L�\gJ�?~�a�1�><�r)�Dҿ�GK�}�Ϊ�8��I�����D[��[��_gM�����N�q���%���&�q1�d���&򙫲��L|�[B�z�M�!�q�p2j�#~F�Vm�6ɀ{u.��
0O��i�*Pi��g�J�57����u�:~ؘۣCa;��99��n�
�&�a%D���hG�a=�	VL֠�
V�^T
�۵�[���A�z�|�յ��-O�:���G�V��	���c���rG���g[�J�;7�F�r7�'�Β�e�b܂�u
����q�I��i1U]�6����[�	��eoZ/E:�Ub	�E����}�y������a2�yk6C�#
>��q��A0h�U��LT9�T����uN1u(\9�H����Ա��{��\Mː��tほp$Pk}�oJ3��eoqYF	��"'Ì�8�t��S���+�m�]
��ZDs}��Ĉ;�Q���5�ֆ,j�3��ө��/뵟-ח�Yޒ���;m${�7}���)d�E�4g� �!R}�����������:5õ}��_92y�-�����O�R���Pmj�N_*�-�^��ߔ�/���­,�	��-|ו��͉��z3�*�e��h|��i��-wp�Xr����rM%�q������Z_�{ŲH@��u��,X��4O��
��Z. 	��}�tQo�~o�Pѡ�"�a&AT�V&�q˻��urQ��P�wY��.{q�nv$���wt�΍ѷ��Ǜ��"��C�*o莎JE}��Ո�fR%�k��O'�{J�9t�9mȔLx$q��k~X�����`�Ήη�K�w��X9P��F�i�3`'K�[[��Ʃ\�D�]�&�.0���'ְ@<z�Z���|�2lva�8K�21��_�fyN�f���:_��Y.fVk��|�!���N��ĺ�c!��V)��q+cj�p�\��3�n�]��ɢ�s*a$41����J��d�Kfs�#����HÛ�9��kN7f�^�Қ�2х	V~��k������4��%O��%�y��1��	3����v�Ӡ��^������CW��'�uqIؗ���I����pA�HQ�������70?�?[@����lZNuؘ�t��&	v���$����U.N�-`��
�T��[�xOo�6��~�a�{N���u����X��f2�![G\/*�$O7Y��(����S�m�S�{��w,I����d�2iypl��}�����*�����%Y���γB�!K]r�P�*�Q��Ѹ��u�%%��js��)�2�0�-���G�#Gq��!V�<�1��OH��X���Tl�2�����Ԉ]�%�Y�x�c�G��2[7�UĂ^Q�>�$��x����iOucD)kH���&T��Ȥ�&�>J�1��sk
��I'�����hg.���ڕs��T���R���7k��>�5k��ͬ�L���0��GB��l6��Ɖ5v��쨪1�Z!��6�d���fAƙ�N�<�v7�L��yCJ��J��<�Ha�_��:����c�X��&��jC�C�" �Ԛ���<�H	���.١�ж�Xp@[.9��:��^(~��./�j:+쩭L�T�n!���.V�`�8�n��t��܀;9���D��Hu�Û��B�I��Y��+�+kp.�JRE����oS�#q%I��n���T��*_#(�m���„��)�����v[��z;�
�\ z�E����ؒ�wlvt���_!nl�X�$�Z��������w�_�k���t���y��v*��� c��	.T����c�@"a�E�ۯ��a�tLfh���(t�B��hl�s,d�>q�B��'
���UȺA_�d�+W#a�}��$&�[�������mĖ���:@�c��F^D�L�S&����j��3Vӥ�_�5�ѺhЎ�݆62c݊#9�ⶱ̸�(R�n��F�m.11=�I�����0��jg9I>%`��N�
S׀8j�nЮ�EE^�ݠu��H���Do�����Q�a�!s�IcԡT�SrLF��{Ocg�����OO�IT���"~R�BGGXX(k�:��Θ�gS����C�M�s��(���]GI~ʙ����q���r�R�Ԩ�*T���Lsb�n�&N����ڊm2

�}�I��]-��!:�G�&����h|�:Hn��1聣�1��~|m��rp�7�tLD�bX(r� J���:�,ݑh��q<�ֱ��4@K������W�.TN*��0�3�h�,@���#>�qR�"�<����]M�h���]��&�o��;���]r:��q�,E���ax�b$�A4�����P�7_g��U�5���dQݐ����G�S�ދ���>y�i�K���n�m43�7��̎X)�}H��	�7��-�bG��E%FC)��L�0^$��*�c笍T�����xӉw�W�)�!'�T�{����Cp�Cd	>��3]�����/��F��B��Xx���L{؛Hh5�����ݍ�g�ێ@|�>!�iS��^B�{����(y�E��v�9t:�'8��K�0���qi#B�ҁ�.�������4��7w7�Xv�G�H�2
I�qW�wi�뮈&k��bDV���ju��<�O3�p�1��Fd��5"xB�(_���ݢ�g�w+���3�/��8�(��rYQ�;@s
�k���تc������o(1~�B�I�/��{9u�_U~�zS��*��J�f�ƺy�a�Ӛ��N�R4z��r�sg�4U��uS�a�f��l�Vy)�k�*��@(�����E8tq8�M6���.����(���񬓀]��t���7���V�y��߱A��NJ�XS�{o���hB�ƪ3!�,҂�@k�6/���Y���V���!�>8��Kp��d�
�;�;��& ��S�IO\:ӿKT�K'�3YrdJ6w�/���	��(e�����ӎwn�`�J5�]��맿;M�����
`��_���5~���H�lM��_<]Ju�T��k�k�r<�����t�D���
���w1p�ac�8@�U��e��Q㲆�O�\
���~���G�.K��&�V�C*��9.�=	��z	�b8�M
L�"�x&�z��~ғ;�<$߽��2�C�Ab��X��Db)��qKI�A��cw᷊�@U�-
ʱ�]�n���2[7h2���Wm�Ϥߦl�ZU| ���@84�R��ˬ��D�x�h��Q����?�|1��O�<��N���Y]��
�;�9hX�›t��"�8]R
����E�5`S�"uӽ�R�����w�m|�˒282@���?8pB��'WW9���y�c�	g�B1����!����x�]̘"��l`ҹ����n�oI��'C�r�����n	�(�Y�5<��ԥ_��/+N�
ge�T	KLP����X#���:z�R.
 ߃@����/�4]��SS���&��� �X�6lJ����Ű�\�٦� &���l�3N% ���!o���Qr�w��u��\�a6��9YJ�|>�T���3�y��S����J�,��,7��ڼ��5oɅa@�YMw)C05=�dd���')���'�=��rӳ-��M��Ԟ��깣q>v���N�/ku��^�r�)��<���M*�PKa'jx~�F�|�����8Z�Ú�C��;$>Gv�%�P�X��k�>g�C\4��$	c�0w��68�`���Z�hq]��:�mJSU������_���<xfTUY� 2eX��Ga�[���O�D��	�hnJ���ƍ[�ٛ\�������J���Ew�^3?`��Z;,ۡ+��(��jW���ד�
Fi���@{��+�wfX�5�6��9�KJ��ce����'��Wk�ˡ�0:�2�z?3q����@�
��Q�D\�ژ0�5��VXy�=�.cc�VTx�׍�_ۦo��z���	�����ׯ�EZ5o"ږ�.6�YR&�4W���S��f�klRV��gT���+*�&������OaW�@�]�2A�HK���]��CSzx�Mq�����y��r�Ƽ�M���`W&��Q�ď�wO+yj�B�d��,�O��K/�m�US��|X304�
�S��K�yrT�*+�oXTe�UX��ݡ�4�嶽��ْ/g��<_�? ����x��/���T���2��T�	�f5õ�Q�]pӖ}_�|�= .me2̆	ú�i�[��&��q$ᛪ����c������z	�-C�R� YF�(��1d�R����ܗMO�q@�c��Ð��]��EVi�E�<�<�E�M3�b��8���a��_��t=�~?�p~	
G��3���=�V^�o��q����Ͷ+�Ҷ"�����?'�]�]�n��$��6��э=�p4��YG�}�q���P���s�y#g����fQb6a:�V���CKLP-:"�v�;��Us��f6]�J׀7���{����`}��P\2��f�}UJ&��3ז�p����$-���&�
!��ν9�N��`�M�$A �A0���`o��<���ȗ�����K$�L�l9��MVg ��~�K_g6%����+1y^�
�G/�6?���t#!��Y�yq��˞zQ6`�u�� �9;
�V��r�չv��aOa�v�䆘���x�<3��4��D��	�2�A(�t�MN!���,�B�2�S��ߟ1��{gɮ�����0J|�-�댺j���Vb�:&A�iQ�� �"H�z�)y�|m�C�ko�����"�T.
���@Ipc<�"RW控;avV �.7���Nt�\�27���~(�K�O��#�*8�E��?�d*���P�s�d-fԇ�i׋@l��4z��59�mp���"��uMx��C�T��;��!'�7���F���V�$�椁̿Xm|p|q�Ro8r:�|}��c���5)v,H46��]#q4T�魩+N���Uğ��3��>+Z�$���'�(ȄC00��pv,B�YJ�(A&}��:�|�d�0	�}����y
�hx�O�=;�����������N�3��o�w���G�O���X	���5luk�	�e���`�|�v��y	,S����l��
��5
\�t��ٽ�f<��S@>�у�wy�5!�D�f3�3�֋��Z��`��믿��p��������M�n
e���e�ȯ�o2��'Pr��O���N�?�4������7�ŀ�R|�"\��%iY.nsJ�Si��wH�v�L_����N�}�z��/)�XD�ƨ%�ʯꈟ���ur�' }���X��}w5�4x8����1
�*|��7�%#¯�)۹�`�������K���}�����F�����B>4[!R�]�����с���#����wi�T}c��`��p��Y��Kn)	;��u��i:dÔ)�)~��@.�6<hq�{��d:��cī�V�{��ζޝ�K�Dz��"���� o�ٚY��[��p�5�_
ftb�d�O�̠�+k�q�#t���{̉���HA���?x<��t���� }ٰTW��w�l��5�f�{��KQ�<��� � O�E	�\�\����Z^��`5�����M'�k�R�f�YU!'n�B7ɛ`���)`H��KR�|T��w 5n�\�b�;�ɦ���z���?D��f�k��]�H2h�?�ۦ�6LH��^P�^� y3���É��1;�����H�Fc7�-u�eP��$ �e�����v~��1����9�ϋ�i�p�Lr�g��n�Љ�{�%j��}{G�����M�`�>��%7�� �����C��������|-L��Hy.U����/{���
��iQ�ڶy���d4�x���1�i�G���ˠ���m#~{}��w��?������췢����'1e�h���B�0U��9�e:+�������|�2D�ǫ�#�k��t�����Ϋ0����Î�ŏe��Q+w����V��ގ�@I&Z2�%��HS��m�}[W��e�\VW��R��P!Ԉ�XH���n׹oÆw��d
���q>���M���`hl�l��V�B��<E�ى���ڥ���(�~���>�ԣk'���ѕ��ؗ����P��|�i�O~�D�~�G�Ԥg0��ߞ�ڬ���~�_�|��"��ީ��!��<&��gQZ�Rj��0s�8d��?0���ԉM�my���倦s�:`��$t^)��jLI�8J��K��D�w��y�/�����+%?�၌�~i����O��gQ�a�Lh��2�K��_���y)�%V�#|�Ds�œ���@���|�x�r{>�:��G@a�Fnw�tb�;G�)%��n^�ќ��9��-ݺ��1�x�}����+�2�6�+҃��i����OY_�o��f���#S�U���:�"B	�6���39�1�oJUfX�������?aDa���1��\�X�_2����B�[�&�Mq^z��/���9��[���~���W�u�>�ACa�B��[͕	�m���
n�V���]giQ=���Gݴ�W�,�^���>̢���7�(���s�r0�Et^����Q�s|��iJ�v��p�)�
�"���5f��ꉾ=?
ϫ�YV��6�����ؽ��Y(i��Qݺ�ڤhG�y�l��;],��_9V���5��S��YBj�uFɌX�۴@d..ۃ
��6�zB�7�a��w����OּѪ��sT]�w�2��L�i��x�R��^����.��\�n�0�d���>=���x����+��% ��tg4����*�衺��DV����5zb��e��;�KI��!�d?`(�I����'?L�;_��	Ǩ�[@�f��1&��m�ɒ.c�&I��؝|�i�`�W����:�RIu{��@7ވ;3s�����'�����:�Ą��W�7p��Ȏ�hv�M�ɧr#���N��+ș��`���3���#�&�b~:��g�P��q)�'W7Z��U�N�T�J�
l1���7�P���85ML�͘:�[}��h<��=��<�~#d�xW�u��AY��8H	��
�s!x�=0!��6ɥ�>;��n9��ÐϽg���*��	֕��&fr#o�vR��Β�n7�R����w��F6k4̦���Xgb
������4Zz/��o���27��D
��g�}��B����V���n�0��2���	�m��<UD�$�Αr�
%xb#A���
B��`N�/�ѸH5���A��!|�T~��~q�-�%����k�"�/1�;L�!�D��� 䐧5<��/�}9�|VW��N�w�ؿ�����5*`[(�_'��G�~��D�XvJ�>n~�[~�L��!��Y�X�tW%-ld}6��
�t[��!��x�q�O��Z��PB�P5y4_�IB��9d��oh"�|O톓�{�%���sN��k�KN�fN�=�c��l��0�_���1�K�Nr`ֈ]>�$�s���Ĥn�5���w���!�9���+S��r�t�r��L�|B����]�:[d�ÙC�v��)A������%m�0KX'��m�`�o��R�{��!+�s\�X��k<�� 9�KS4ѮX���u�F�O��/c��b��F�݋�z{ۯI����Z��**
�q�-���#EgNGGzP��Xt�'!'�†d���zg�㌙p��k��7�{\���� ���5�{���
1�yT��t��V��D&�U'Ӗ�@0�7f�a��i�5�hr� �/�<����k:o)Ѹ)��!�Xl�!_U�?�a��#,�#���ZTn�=�9F�r|��%����	�FC�
4�d�0?��Qp���w�w��TvG����(��f#v�$
��g_�ߡΝ~�	�8�h�5��b!9Fe���)a&�!H0��Kmm.&+&]�܁3-�z���[NG�j:��	���R^��ІcdP�G�$��c��pjq�Du�[��+�f�D�F�g>�W$�p���9�	�s�E<xǣc���-��c�Fl�X�9��}�|��f�u���q
���Q�FКIkvj��մ��L�i����z��B?�.�q�j�������z>o�6�,^c�7�ߔ�N�-�|�(%�l'����`�d�(K�)e��� P
�K�u�o�y���v_<��os�����ڻ����=���?Ĉ_����k'���]���S��E�J������j��"�����g�Ƙ�m92:��hB<�A(LRUo��*�ޛ�=�⛜kn`�M,�Z�
��p��,��v;�6z��j�
��
n�G�2$~��C�0C����M��=i�U���dRq�����4���0��}7m��ib[}/a��Qbސ7;5V[�]-.W��EB��P��ԇ��{x?=�$��#�/�����p8�10��?�'���-�tu���,�β�/&4-^�������0*����C�CQU��/�����[��^G�Qi>?g���?>|�1�b�M_BD�>�[�1�kvbDr�"�6��4`\�ό��,���GU�z��Mf���N�s�#��z����x/$�?�~��x���W�^�~#��_�����yF�.�o�eQ^
lN$G
����1	s�C#^��Ґ7ٍ4�EВuC,B��;-WCT�J���e�Ͳ�}�զń<��5$�+�O�#�H�/���D	pb���#��oRJ�3�D�/jM�O1� ����YM���D�k��NVd�w3�׮����4�۾�����G9�
�9u��Y�9���}�W�,�#a2�~�J/� �e>�¢hg�u�C04̐@��%����eӢ-�%&�t�@��~E���l��gr��yǐ���ORy���w�l�2JKpp^y�v��d�?�w�7�1-XL���j�>i%�kW^��*��$���eG��*
���@��$8[vhq��wsB�G)^ܷ�b�������.��*]�����>�=֋{ɮ)"���[����${��fk4	��S��y�
,�r���| �Yw{��5��pr�W�Z�aI��tY�5�Z�β~��q%�]/��_�?����.�Q����L�LTx�W���]_0#��髐��@>GR.�ںf�=�WNbwq8�v
%�c<
�X)@�ű��X}�=9���2�E黂�c�/xy�MOM�A���<\�q�����1�l�z4>�"��9h
��v;�p���#�{Gi;ޱ
OX��z�ם�
��hvA��r}����H]e�K*W���OO��s�p�X�
�u&�Mϻ���^HV%���PU2�3Y�}�C6=�����%\���r�-�۫���S�Q��*���9�<��=h��I�F����Z�dp$C3)��mcz6tGh�1C̙�Q� ��)����L�g��HkVH�!A���\�'���5K�i�tL�/�!�z�RGn֊�%�����e3�����/�Vt�/*�����0χ�l���TT�sZ᳒��
��$ v��xs4�� �D),��O|0)�7p��Ř��	������2P�6�FS�������{֕N��ON��>�e��g�c=<z�R�0���ۃ?��g���)��$��,W��+���0�L��Y"C��������'���|Y�)�Z4�K��{��@��a���F7e��Poc��c�ԛ�2I��`��w��<t�8����'O=�zG}R������͡��;%j,�;/_������j\�Ƚ���vNE*n])�\��B0��o�x��SrtV62k����ڹ��}�<�<�t��î���n9	���]�6��vxJ�,�ctAc\h�(��K�M��%��&M1�5��0�ק���p"�$�+6<��/���������!:��m6���cQg:�>|4��3�Wv�"N����}C��"�f�K'�Z�x����μ�m�r�EFPJJjr���HFD�'<�Xr�GH	\1��S_f�|���sGA�lbf����o�ѭ<�759r^`�
ȎU�W�f~ "�p*�|1g+g-��gh����{{�-$���V��ԍ�=�!�e�W�4{فm�`GUe)�=� ff�v�țuj�t���ౡ5��`M^�i*�B�_��Z������:"EbX��
п��D�wŚ��W�\�ֹ�KT��gizc��r�����r��X����F��%.>�
���}CU�'E�\���"�P�Sjh���7`��OuQ���ߋ����m��WS㘓��ڐ����Uz�x�[��K�G�E��挎�⋻5�C_t�#�ֈ/�Hp���|�}���P�S�b�HzOL>4]9� w�X[{��E�jS�Iy��[�J)#
�:�6Kq'\�=�(���r�P�H푑NlO�"�G�n�G��K���H��(ֻ�.�`��L��;Ӽ[�>�m�+�S��G�n�0�]}��s��Pm��H#��Ȇ��n�Q9���j��f�cq:Z$?*q�����_.�ם~%.	S���^���i���忑��ȧ\��s�󶦲1
]#�ZSt4��ϒ��	sS���|�g��oL��Pd�Q�.)U<��W6��+HЇ��"2��=5y^	3���7��v�ϴ�>��;�9�i^��;��O��'f�T�h�'�ڃ=�Sd5R�
�+܃'�DXHO��[tX�zwe�Go��uN�Ф�)����0���zV�8/�M��}���ۯ�3c�M��`������Q�3��p7r��-�Z�Pb%��0&"��Fc/)���O�I�.BT[y�k�*`]�,1��J���lH��
��+[���y�>yf�=C���/��2��'�/J7j�R����'�p�ʰj6���/�|�/GO��2a#�+=~����I[�>y������oc��������wQB]C��[i��(@y�>��.�Q��0�T�`6��C믒�X�s
*�h��$�P���Y|T{��v���9\�8*A�Fg,�	&3�������_���j���KPpKtϡ�?V<G��P�ԜW���Kg����`C;�!�R_x����I�2����-#���!�$Ǧ�ݢ��P��䉁�t��2b���N�9���9A��ܼ�����Kc��5�N�G	G|άXM��;}�K�.V*Pِ��zԽ'�x<}E�+(d���WI0�Wh	<����輆V�yi�����w�H`q�'�[z��O�h��ME��j�ۛK�}T+�*(;
b��N#RN���G%���\T�h�A��M$'�0+�_dR�Џv��A���pi0�	#�����e���RĜI�,��j?�H�MA�.j
GA�h�)�J)�@J8�U�5�V�������x�Q���/0�F�%Ų�7�u�$�Y���_����3_�]=�2�¥nvx�S�ș�o;mL��sJJ[k�R��;	�\ۋ�ch��u�yc0
���r��֞[����\����~�X�}�9$5�"���}���#,�x@I�Ĩ0����w�R��(�^.�G����\S�#c�N�m��~l;���-{���&�R����
�g�u�1Z�j	"���+�1N�ؿP���#B�ل��4߹a�����}��&�\�p�d46��9Q��4���-�-u:p�R{�=?R�Xîy�i1&��rU�����썂C��(T߅�&I��ձlt�h�p��Zτѣ:n��L��[ ����^�Ɏb�2)�֋��	uN1��ȥ��1r�$�Z!z(U]c��2��s����P�CN8��\�R�vt��L�J�U
�}]�*�hQ;�'����Wƨ{�2��ֆQ�s�+M	qud�I�}�����j28"�/?$
���/�Yz=���Tw�'&�*5c�9��v4,�s����-�(��v%�U5!)�k�4�v��6y�Q2��rF��z���Z�MK�c����)Z�vP�ƝY�ѥ�x�#��E����uh-����]u,���Ql��᧷`�iyj/��1F�Qp�&�a��޾?9$�F ƴ�n��D�
KB=�cO�3a����\�P52��\�rcs"��8�MQ�*	����>�.?�?�g��!��S��Wu�H&��`q�v�#>���q���C,J�5G{�6�Y��F��;%O��q�@}�v�T�)�_��3����;��XIt&�_-ѡ�����Z��ll;L��GV�B���E����	I
� �r>D�MZ��SG$"�삟�]�0��5�:��S�e6}:��FD�);ތ�):|�D��@ck��L
��2_�S�\�_���E�uh��38���G��if��@���Y�l�������J	cYK� W5�s�"MbL�m�/t��M|�Ը(��0/b�$�qp�&\8��h��y���?	����z�K?J�v���}�7��ʠ�*ic�Y5f�udq�ŋ���Ӓ-Ћ��4���E�����k���#<G7�� &�~W��2zK�?rL|�$�.�|a���o������aw�i�Zc�d8[ec�]�jS�5%������]H4�"@u]���mQ?O���Yg ���:`h�Т��̅���~�Z���5z�ϰ�Ya��N�J''}�O�Q#{��5�]�.0�[5�����x��Y.�z��]�3n6A�&d0�ě���[���t�'�{�ذ.���zS����j�:�����g�8LD7�o/n
���Ր�ւ�Ӏ2����b�����u �>�J.�	�櫗o��-y����#yJ'�*��,��c�smD:^���&k^�M��ؘZ�f
�E��X�
�1q��qY�
.[�&O�⩭�C�B�oH_�����3��P�0D�G<�X��2�-��s�6t��x���Q8�藦�(M����1w噐�#)�I(���}h\*�6��I�ƸRA�
'�ݫJF�mNl�$��41U�:Z'XX�����t�#`���>"��gy���
�C>d���,7�K��4v�q�Ql��Hԅl���}��ʯ��#y�(G�H$��&�&�(�4����.�Իn;g�����$��L�_
�st,�MΗ8G&��j����mh9|�5&�A#i�#�I�ܧ��	���ُ���HMY�z����]
����8���4�O~�V�=}��߰ӯO����X!��z�}Co�[|OaM����A^�o��_��D�%����?�|s��'��/_?}��x�gfh�PG�
��H��Mu.�~�o`i�&G,Pq�3Y<�J�E�U����]l�Fc)�Ϳ�I]�
�$�E�΍��Jr�ⴱWP6*oA�`��K���{��ߌ���ʀK���i��	���84v�t�ٴu�
Aan�#����c���.Ŏ7�s��!��'е���`$'�7�C�p��S6l��*b]���a+V���z�so��H<�0����x�	r&ɽ��*
��]��o�
l��ɠ6y���Һ�mO�Fb��~�_A����j�0x�հ�m��F
��*8S��P���qQ�.��H2x��mX^]]���ͮB1�¯/�6S瑘:y3
���6ܘ樳Q�G
���+CY�ȁb��Ɋ+4I��#�o���*U]x�&5�GXVaY�I�K�pgv;6�l�9�s�|���j�u�}3��k�ºВΏ&��O4M��^]�>Yyy}�j4�*,A���pM�L�%K�b����*���?Ii���V��<�����]ފ_
}�"�Y{��Γ���2M���*Gw��U���s�"��t��L�q��L��Ц�IV)���-'ݰ�T�p��@쒗�@�)����k}ғ��-N902U(8�%2� �-٪ȱ8[rə�b��`����6���&~
�<�2Z�9�FP�f
�,��F���֧�e�ń�1�7����f0|���?-���f�;����ɻ�����!<�VxvM��70<��ߝ��ޝR������J4�<�Xa�l�ND�H��Zx3�1s��X5k�e��l��k�i��}�a��7](�!���ONh��dO��O�Z�L()�c�D-Nx�`/x�6;$�8�y�w6�~�Sx�29	6ǩ;8X�܄��|�V���.(o#e����6
e�(�dHId�i4C&�sc��~}8�X}!�+kJ��T!B��u�T���ɶ���'C�}��kN�^��S%�IMZ���Tt�����uG��O���wFѝ%���j��������
�g��kG����GFX��/)>M��fE-?ɺ��{1O�~���m��2}�FE���w������SǾ��%����:��?�3_�ӆ��MV�fܱNMrAr��0���?۠q�V���U��y`��Ԩ��V�_ܾ�x�r�-�Z��Lg��`���;o�������O�N6iM�nL��2�3��";�Q��;ɉP�E��")-'	F�-����(7�v[�P������T��m���!�(i!>
�v��'�T�!���MG�����.��Z��! �ƪ�s�%6u˜��!�i�F�q�+w	-�OH�Ǻ��1�'��`#�Ԋ�G@��,s��T�1���q�аT�ŠYP^J	���
��``%<�fN�o�'/�:�g�p�;B���@�7��f]\	Dž۝������9՗�ʽ�W��}����	e���_��R���-���tPNf7�X,�92`���^�(���@���,�ѫ�Ox�_�V/����Ćv��V�u9��h���Fp��~�9Ys�]�2�����Č�t`w��
t{n��
�����.��l
�'����!���H����|o����q���ztÙ�&�	���B�1��bb�|��f���8A�ɽ�w���m,��i�m.�0d��A��N}�NsE�N��ԗwHP�bD��BFB-#^\��.�y�x];��]c��dH���;�Dyy���iڝ@�p.G�ļf��	�0�Pk�71���F�S9�jN���z����8�̚�j���(BG`�*�X�Y����˫|y߮�&!-ƚLxU�pʽZ{|92��qe�O��RD,BOT�4�7ne�� ���ŧ
���>mP_�T�s/(a��\@-L��)���K��)y�9c�+���X�I����)�Ry��]�cb��^�)yM[��0�X�ny
Y�:T�O��Lʭ������M�5�ك�ٮ�V���$i�N8�B7<z�
�㐑��0�i��f��8T�ά�d��OK1(�ϭ���Gp��;,��T%�{��O�"5t��  ��g�n϶����]���=�fj���[bZ���0�
YO"�+��9����Cg?��&8����gJ���sv�LM�%E��`���������vt>�������v�q !}�� �}x�{�}�}��y'<R���VP}w�L�����Mup��)m'�����n)+��A���w��{y����W~�A~�gFY�)��]h�ۅ3�����NT��,��?�e�V*+�}�m�Ǚ�t:K6�������"u5��цT�UI.��A�AY%����S��.6Y��-V�{~�l�
����э�t��SC	�/LܐO�t���2+��������Mnzr�A�M�!��C���[�pQ�ϼGZ7�?w

�/�!��b�ъ[�_����ZHNv�-}�A\�i�t,(�$�7���O��[E�?`.$@��_�*,��)*<+`J>z9k�jnr�G��牟��t�c��=��ݹ��B��>O���l�pDДOI����H�=;��ֺ,<&��N8�8'�q��A�̂�>�13_Z�au�1��3��6��W����9^���X���I!�ָDf��ӂU �م:O�J�&�1��(#I�MmB���c�%�+�<�����؂���!���F
�0[����k�bE���~����<4)�)��̊e3���\���,����#��4�$�����=(�����6x�A�/�R���?F���q��`�T��Z/�ē�]�a�+%:�ЅŪk�2FáqF1���O�w&���Ⱥ$\�Ut�Пvw��dj�ī�s<��M�����>>,���B\pnL5Օ^��DK��)�`	>1�c�;��,3Հ���F%>�B?���4*ߙȉ���Y�bD�[L�,c��_
u9�3b?��/.�G���a���:,ҷ�/��S�I�`����+߲{n���n�G�7S���
Ǫa�s]U��
`�匡t�xPo�����B�kؐB����4`���pjtE�É�k �>��1dk[ͺ���{��?s�+�r3�ӋQ�$ɥ�)`�4��nq0�j�$S|t.n��Ǧ�(�1<qu�y�|:����E��
PFǷ�4�v����Q�5�F��co�$�0ю��5�wV�cTqHX�JUzc�ȥ^bn�q!�3EuXE�Ef���qd���$
��}	h=��{Z�p 3\�w��@
6�7�Y[���A�wE�
FB����8.�'�>�$k��e�L��!������K��WX��
���r�#5o)|��[o%�ÿ�*���Q
}w�eԭ6�����z�ـ�}��`��z�y�ã�b$͂�E{�n
�D	^ãϛ��n{���d��n�HO�M�s��h�x�e8��x��K�M��?V[68�0�b�µ���QAQ��طS�k�'��g�Y��/����J�����b�כ�e1�OH�%0픇
�6��x��f�̗�)����Mp7��BO8�^;%I��yiGp�X���@
X�'}F�͔.�d�1�cc�-�8<������/�7���,�}���?�y<�fxV�\��7�]��y�)o��fJ|��ضGzķ�&c�O�(�'#&�I�h 
�0%'��cvt��"]�(��~*�pG�����l�|�slJ��r��հ+X(y����</U.g��	T'�H�BnYT��F�֥��Z�Y��8ڍ[Ү� �ѱ�B^��^��\��)զ�q#4JY���Z �2��C2 �C��(����[l�S�
���G�@� ��f�a�b��B��/{�L�8�Og��@��-L0m�%£�#��Аt�j��3�ӆ�f8��Lo�V��x��4	%/�'�>��LJ��Kyo�pJj�V����d�英���֝�A.wqa�+������>����%��+-���s�DRx�-5$��0i��
f���x�Hm�4q)�N��
�2I�2��Er�U<��������3���<�%�tJC��cFe���`9��F�qI�`I�)l/tt+��]�Y�EU�)��"j���w�����K�5g�ra�;K��k_��l
�,|�����}`_Y\S�5y��*,�@����s�g�Z��ר4�;Gk.�K�2�J�y�=�؜Wy�Y��=*���2E.�uD���т�q����?]&��r~ ��[F�%챻�0�
2�=P����!F��Mxxj޴/��I��.:�w�o�yI��	�P	
�Ń�������7o�P���h��qں��0=�ۯ�Z�B�i_���4�7����=��t~eg�<_����G#�����)�Fe����]ܻ��>�]GB��adR��8�d瓐��'kS��Y�N�q��ڴ���kͿJ���V�N��vs���]�����=��Ƹ�t`��i�O��?]�_�E��-ק���o��t�}�]Zq(9&�g�{4O�y�].�4d���*��`�������$9���YS�yK�8� j^�U��x����_=�1�D�D�h�öZO)YEL�d���d�U��NS�{X�[ZD�̾��ūh� W80PGC�

��j��/�Db��(�sO-�RI��T��R!N;zB�y�c���^(\��R?ݡ���z5�&7�1"Yi��C�y��dJXI�c�x~�p����5H�|�E���ې�wY�	L-T�Yf�G��]�Ĵ�<������(�KtJ ~����%*�����Kwo(�j������g/
��$&��|���$�Yo�˪|0��=��_�x�P����x�8�!^��.OE����6v���P5���-�
'I/��g��E"y�)����c̢�g��|aCS���X��G��@K6���n�'��u������L���!��I����ȒȌ-i���r��*oO9���_KÍ�V�����..����Ax�m��H(�e�\�fNҲ�l�s�6���U$���İy�ުs��]M�ˮ�/��kH��9Wa�������
KV�3Y�Y��Q�f^����Z�5I����E~���/�1�0P�~�^O�8���2�/�w�N�j%RE��^T7�X@(W�Vzx��
��gW��N�T�)e�.$呿:D����. (�`�
��:�d��.��b�mw�Ѯ��^��������=����P�I��Ro�a�����gO�>a�s���O�krt�n49�t@�w��e�LލOǃ��o���E�
�x�,n1W�{w�T<��v��UЎo�.�e�Gt�\eŒU�uJs��M�f�
�߷�=���m>�sN�>���p���.�y���̤a�QA������ M}rr�QKV�3�~��zJ�����
Gu�]c��t��l�>~�2��9��=$��4ܯ����:G\&r���u�Z�b먲L2:���_�_�q�}�J�C��#�6���pC�M\I�bj�e����o���/(�be�6����J1�V����eW^1G���d|[��c0�@�^{t��V���-�ـ�v�jƈ�<�ӎ	�d�:q���Ԓ�&�q��
�y?��K��+��&{%%�/(�Ė�$^���R�!��x�X9�}��(tݴ�qn��d��c�,��[�)�嵬���y��(���#�,��F4�qz>��R���<��fj;*[>܏R�DV����jRUGN�ik}N�k:��l�㼇9ܠ�\����a�$�����2I�G��,�+�xg��A�cҡ�˰CU ��hno��Ԩ&	�
NEg�l���
�n��j�l�.sI
]�l$w.z�Lp��Ƭ�S/ �F�%��7�X�}]v��d�V_Ly����ɋ�o��O��>y���o�_<{����_�=~�K��Ͼ"��D�?�7 ;�x[`�|dD�����hnJ�h�ܦ^��ެ4�i�3���������#{�E�(k+L�7�UrC1׀�[V���d��ZYJ?�m�H0�SL˄O`�����vh�;����乥|o\�L���mnk�j�H�sNy��-��-v�l�c�M٠���W�e����F��sS��Q�����,�K7�6�����E)��Lw��Ɵ��	�E���BB��M��@�鉗g��.64�2�߀k;WЈ]f׺H�x�\�
MJƙ7iMZ����&W���$�|����\��[N��˺�I���ݳ�(�{^�.m�'V��������r2���ˉir��N�B�U��\'.,�c�hHa�U]Q]j��Z.HrO���
 �Nr���$=�Ô�R��k3�f0W$���ՙ�uϞ�h��v�y���T��Xm>3�[�#	��_-�@�9uX�f�:#{�(������@,���{�,8����˓�T�Nuy󩵄%Qt�7�$�\MЗ�C(vߪ�ő"�Z�ʲ��Uv�Ëf$o'fZ]���;t�E�sz�h�?��pkp�#vd�c�U�N?�~��x���W�^�V�����G}PL�9�����1znSQ��L��Nۭ�}e�$�6�p� xm�H���u1M�u'4�����e���ӾF�'$��jK�e�.���׀�@�G��,Zt��3@�d����f�dJdA���^�2๙	�
N�ɩ$�e���f@�t��`9Dcr���+yjrV�Pa}9z���M�Kb�[?���sc����G�xԔ~;���xt9j&�R�	�G�X�ePQ
2[�����e�T6�I���4�u����8ĺ�
g��%D�NS7K�����hN��-�G��s+k�pz�]��ҵu(���b�Ĵd�N��#.\�|#=k Dqu���uDE������/��L��U���k#BBQP�KjjA��s.���[��0��51��B��M��Yg uƺ������7H�|n��N�p�82�Ml&1�I�
�mC[�%����Z
C�V0��f`N6Yʣ����1�k;P-� ��,se>�@[�%��l#��%Q�Q��?$��B�4�Q����u5=
�0�ί��aE�J��$��iHZ�5�eCl��N�l춵i�/ǎ��G��Ug���>[�#��&G-i��$]q���s���4�u�I���F	ihf�ַ������V�>s�G��h�%��\N���4�3��x\/���8�Y�ݺ���q(Z���նٹV�sY�Ia�7O����|ϴ�]�4�oܫ@D<�jK�A�ô�Ƥ�!8��
T����>I���s�����;�9��@e<�U�yQ4s��%s��6)3�K�h[�?)��ȏ�>�M]�\���Y�yx�v�}g.�����䜠��ψ��̚:�0ՑӬ!\:�H�	#0IƙY�1N~h����ݒSL��]׉SQ�:/e�aE���Q\��Wd
Έ�S����+Ag�p�(�P����ڑn���O��G����w5��ִ:lsO��=��~���Q���ɟ�Aߪ��w+M/�ح�>$z�$��:�ةr^�
W��DH���}4���@�^�{SUW"�����x=���f���'�N��z��Ξ��I���Ƈ�c��"leRa�Q�����G�+��:�:�5��|���W!lc�T�}/d0�P\ ܁����E���W�5͑e�Є�#
[P�ԧ�ĸ�5MUM�ˉaV������-�G�3��,u��y��_)`a0G�r�\�����2��*���L�px�h��?PK/WUW���\�N$pip/_vendor/platformdirs/__init__.py�\�o�6�_A�/	�*]�Ru7I�b]S�)��(TF�mb���TR��w�H����X�%��<��D��`�}�4���&���H���t�p��4Ē���HH'4D��G�A�fRfbxx8�r�_�!K�K�(.�qd�c�������	��\��IƸ���B��<Mc�|sQ��LY��<
�ߞ����o^��㌚��ڨ0j��X3\.@�a
M�E2�be3��C=:q�z>���YL/+����0��ۢ���8@/��=A��Q�PȀ�e�/�/�W
\���p_q\��X�[�h���҈q���<є�y��@���������)�ȗ�m�:��nF��
�i��`x�Mv�����ʬ?u��9y,��E���5%8d��?px���ܼ��<�ߍ���{-�8�	
�L���'�g�N����x�_a�
X]��gg��-IbMӕ�����h���O߼�k�_�RN��c�⩂��ѨB�nG�{�Y�>* X%��R�r+���uMF�)xh�d_)'۰4�	�	��y7\���F?z2D�9�$���P�+��7�2-�����?טG���jB/�:>Gװ��[M\�1�*@���^`Hqˀ��(
J����\�w8~�y�!��:C�u�H�0$��]2CO!�@9:e��*��ųg����%�R�2�N��,���_�u�a��z�*�}�-�ʍ������לG��4�%#�l/'��mȬ�XH4yg�<�ِV9���[KHӜ
i��Q�thKHv�+�%~@�
S��AB���I�(g�c�j���*L�;6����t���Vwj/�����k���g�J�}��Ƥ ��	�VT=��|LTZn�%.��+G��aH��r^�R���GFշ[����0C�N�O��΍K�e�neҬ1h��5@f�8��yg|֩� t��g�%xq8#+E)�`���5�.x�C��h��[T�[<U��c��������<{T�<*u�G�#����+��r����^s1,�8]GX�{�Y!Іe�V���S�S�<�B��#"����b�0OH*E��V�Z/�
�O<�3��C[�k�u3-a�f��!�>ې���jf���~f��l+�hD�BJ��YPk��'���"���Wzl�<O%M�=�n'�
�S�@��da��U��^j�ƾJ����čUq��u}0�0%/YQ�ڨyY)"����
�wU{���jdn_ɋN���O�;΍K��T}�R�����>m� 27�楑6��ܥ��`o�}��@=@7�=ж����j{`��܄����H�@UhML���Fs�@�qͲ�e�@�@�.MP��>M�"7.M������Ժ4�X��lmW�K�_nU��6Ô�,a�)v�����B��VT�.w5�Q�Q��]�rW���v��B�e��]u�J�J\����a^n�"�-K6�A��8 ���s���jp�$��Ge�
m\��L�ܐ�?�p��/]����C�J��.�tu���� ��k���t�!W5}ժ'2t�b{��/=�S��ˁmz�{�pa�l#npbG��n�����S�#[d;rۮlQ;�x���PK/WUWqV�K��$pip/_vendor/platformdirs/__main__.py�TM��0��W�am��n���޶
�B��֨��B�{Gr�:��Cۥ�ɼ�7zO3�Nj�w�ڄ5�
'b�!:%�ɢ �� �F�ټ�j�{eztk;�0��z�b{�����{�<Ʌ`l{�q�	Z��ǣWN�2HAz�Z��A?���v�@=�+�K}�]�(��	�hF�}�Xݥ)�������
�E�t����Y���gx��f��j��ZY�м�h�f^�}4�*��xi�0rR�~w���,cء���8Yi�e�:*Q
�i���E�O�4�x��
|~}}�T'1�YX=��i��W�*WuQ!Ȓ�b��������f}��,&9@t y�sZ�:&���モi
����&�>�2�S���z��!	q�����o�ӯ�_G���܈Yݾ���4L�b�-�n�
���|.=_w�PK/WUW�(s��+#pip/_vendor/platformdirs/android.py�X�o�6~�_A�/6�II��Mw�@�`�Bf$�f#�*I���?~G���$�U;�K�`����>R<����i��壟/Q��*�"D�9
aƸŠr&=�>㲺���+Y�H+�3YE�D�8^�r\�r���`���ʁ�z|�a�r�<�B��x�gXJd����NC_��,��$R��M0�	��IDt�P*��0�6�p|K��fs�|�����<�E:ŷD�B�S�L2�y����L`t�=t��<��JϯDH(hOk�<	��rG��=�[������ܼ�ωP+�+!��QD	V8��I�t�~=DR����},����6E`J�r�B��)n
�C�	���Bm�G���ax�C��҄)͈��̔jV��?�tH�	"�&a��D�5#[����ЎPd��R�%D����$�p]��*�C�r���2���ZX�Y��k3kYu2s��y7Jw��^���\�Wf傤-���TD6'�g�Z�/Q�iU���t3[�us��ʾp��fB{/B�g/B3�&�v(†e�Bo`�2�$^�/Nc�I�O�/2�Û��ֺ���N��[�)'�d��� ���j�&D[�34��"�j�^=�fe0Ͱ�9nr�\�.��)�;P/L�zI~�ctq�����ѶݯXK”���;8q��0Eɲ�t�ý��tI�eZê�,�����~�,���,*X���i���}��̷��ºw��0���+M4ޖ���i8��'pwR/��BҸ'zc�%�S��
����(���
���}պ=�ު����&���¤}�V�k+K|'������<8tXb�wt�q����C	Kc�C�m4�%�'�OgEuêbt�=
�T�QbU�����K釚�9Qe�po�!88�J�(_}f����4��k��M��9#8I*r���np�W��d*��FpЪ(�L���6V ���:�P���S3���G7�g�"�ɠ
3����&���ͻ���~�"P��L��2H��J��g���L��7�$�U)���
��\t��kt�/�=��ߍ�?&��A_U���l�)`�T���v�`�U�0��m�j#c�gT
�j�{�8��o�S�n�A]@͌�P|9�O���m��3�Z�W�~��
W[���7
5l���~��	�Jg�㮰�Lk��g��U.����w�u��uИ*8>y?�\���':>�\�NϮ.w_-D��<��m�*Z�}�q�`�!��l��8��"���ޝ?�8�֋��G÷�89�jÝ���4�
�ʸ8�\]��>�0�x��j3ڲhz�SŽs�ZMخ�(�n�v�)���]5��;Dݲ��P���B�7Z���C{&Bp��:8��<��.�d�L��V��Dβ(�%��2�}�PK/WUW���r�pip/_vendor/platformdirs/api.py�Xmo�6��_A�_��U�u�R�
���Z��5CQ�LKT�V"5��#�?~w|�K�8�렅H���û�=LΩf���mtpp0ʔ,Hg���c‹R*C��PåУ�'�C�E`g�/�0�F���,e�0%5˜/��K.���O�/����GY��lD��cu
T�<�qt͔~1�$�/�ɔ�Lf�<"��W�!I"G�e����]�?���)�[�5{����Q|�D*U����0���m��Q�S��ENM&U�+
a���/��̇�,0Wn�I���+��8�6�va�2H%�������x��ѳ�'
g��l��hY
Z�v�#�N�K����ah�U=���ϯ)���2������lFR��՚���_�_O��fYQ�c�=t���XN~٥���\��`7\�����x���t��KŨa��V�ɭ�Q���TѢ��������XHX��:�I���:�ɓ���:��l���&�g�[���޻Βnh��# �U�G3r�d�Nd��s��N��u1s��x���=c@���@R�Ee��,dZۓl�\���K�	��zJ�!�Mɕ�e�,J*j륥��e�H٩�IV��5�`���A@�.r���̗�ڏ6B�$��<�lӇ��
&�J�q�[����Z��UA��р�^�W���
P��u{�-J� ����CU	�E��)0�눼��|:uV��S�m�q�|���_�:��CA�s���|�Ch�h#������p$�RC�N l��\i��%��3*0�0�:J#��
���P2U�*���RɌ�L�}�
b��x��u-���\^qAƚ����3�|iL9;<4,Y�Ǩ�Zf&�b<d�q�A�U�a�����'��?D�G�����tO���i�f|o�ٖ�@t�:$П���9|�EuCVK�,��t1NL����p&��B24�K[�6
«K#r^���Q�Z#,�jX�Kʒ��6K�޷�s��0ŽtF��^�&<g̢���}���(~�d����|#��}<�u����±�~Sp�mAQ��R�X�I´=�ШR	��"��Zjݠ	ٽ�0�ފT{�q�1v�ž����W#{���Vbm�`(0�c~>�}iomx���C��]9�.n��#A@{�0䱓S{��l{�*�p|�����I�*w�����X6ٌ]T�&�c�:�U��i'��ֻX;A��_gB�:������Ǿ�^�˗]�ov:q�~�V2ej7��+F���-�3��-�Z����}�ȭ�k8k�	M5%8̻�����%D:N�z��ۭ'Rd�j�{���A��a�0�dɆr@쾃���P�3;����o��?\!z�}�2�𺩇����;���%M���=�-�!g(��3�k�29���AQi�$`�{���^=��p}D�m���n"{���&�𗅋`4��F�����lh�w���l�29�����*���;ds{����`ZV�v
U��{"�+����:�;����C�h�vF(�C�����+�v.�$n�(�ڔ�������.H���:w����J���u�۩yMJ̫�����vRN�rrB�#��F��Q������ȪsϘ��PK/WUW0e���^!pip/_vendor/platformdirs/macos.py�W]o�0}�W\�>$R�k�E�Zu��h�ڇI�.\�5c3ۤ��~�lcҥ�Y��`�=�^��8nH��:��8��h ˪Nw�h�
��p.4�TpE~L��%������t@/ѕ������yE#J�¦�<z:�E`~6��O��-$Eft��x�hQ.|j�46	\
�ĝr�UGK�G+?k[�P��k��\��Z�V�Ҵ�52;�Q`�I!���[I�&%���ӝ��2\NVh��sa���#�=�v��R�$i��!�����A�ӑ��
��Y�.���S�r�rÏ�����=ydi���M��Q*�< �#��ȕ-��J����<O�k�o�uZo�]���'��h��)'
Y5��sPZ�e��gMA�X�46�)�����Nu����_�_C[�p+�]k4=��G^o��g}2�l��@����ِ��5�-��}k�-�I�7s<��.~�,o>����䌢_ጪ�4��n�/jk�A|��{��
�+�
݃���-C�;�����޵yч���?��,��\wP�M%E��T-v\���u��꓍��8��^���'Z�.�2ߥPi{�~q &B�� ��ߕX��l�����*�U>��\���
~^�6&+�3A�p)*��GI�1#������P%<L�ңG�BF�X�ݥу�$,Ě�����t���6�����n�#�ˎkڄ�y=��>�7hVf�9Z�;�(����(�c���~w������oPK/WUW!pip/_vendor/platformdirs/py.typedPK/WUWLw�!i" pip/_vendor/platformdirs/unix.py�Zmo�6��_Ah�8���K�6��&�n�&b�= ȊEټH����{�o�R�Vly�-�bY���pfH�b�]�^\۶�H�~�TKA}��$�B� M�
㩴���ŕ|�Fq�ӈͳ@H*
�3}�F�3RY�1{,n�e��A���q�".�s&��36�,�ONN��b��f[�OH#2�j�Bg@?��c�?��P���C���<R���o��"`���e�XB/�����e�XRcR��e�ֲ�YH��9-��$������ː�(�x�Q���<��|
�A&�8�3��B�L{��_,b33!n$(
�|R<s��{�F��?�#*��PI�q�d�����z\�L�`!K���Lq��$+����L�4��"ρ`�cL�1C_�$�_^�@P�S,c��Ta��%��4H(�w���*�� ���*x�k�=P��L���� 1���\������h�y	\���%K��1����l��3��7�,5i*1C��J��o���e0�d�gT��2��[ᇁ
|0�HG:��UN���c) �c�:e�� ���6���s�L�xn�gA��D�w�O�w�3<�.J�p	៟NN�/���.�N��ܜ@��yx�����0fAeP�@��r�5]�2gP�n��2�%��9v�= ��OpLn&_����"��"Ȭ�����#&�9,��5M�)��O�y����UO�$���M����)�qkH�X�~~y;EA`@�g��.���E� ��)!)�3Pϴ�(>Wc�%��A�-��]!��L'�����5䠎v��Yv"�K
1�*v�g�H{G-�ƨ��6_�@�~�p�ݡ���=�Q���k�Qk��>ư\O|��P��7�|3�T>�AԎ�䭃�[����:�ߞY�
z~3�cT���z�7g&���魫��U��F�g%6�}�������{+�5s�-��_S��2I���WP`��:L��{	;#n�ښ�V�ך�o�E���{�|+��ق�Y��7�Q�G���OϾ\�/�Kk{N~��	zs^Z�^e�<�d]י�
�.,�9}�ac�I8��{Zi�3j�]~Ɠ��⯲���؟�z�b�e�)�$7Ύ�Ct ɴӂ��,��>�D`b�$�")a��w
�i�N�~��Hq�k����x���k�{KH�l��ٓ�R�_x��I�C�ڍ�����tvwuq=�B�aY�do����Ҙa@�|_@����~��etz^Ǔڂ'c3lE��S��Cs�K����lrw{Q����,�,��/#�ǯZv7�^�_�j��-��d���l?��Pt7���Ɨg�����i��j}�x ���a!9\��i�wד˫ԥ�Z��g�~�~�{#X0�*��}�"+�������bQ�i���C��X1]�v$g�p�%���6�#� ��]���]��
���!w��2D�<i~�R�W������ݤ�k�
�w{M%�����綣�Cԩ������u�w�7:���d�	�9w���4V#�J�Ccs_��r��)��&�z�4Eb��!�:�B�N���6�ژ��@jO}��1����􅜷Z����}��}B����w;�婮���>�����٤�����|G.[
D5�Qa�(�l4t��RuR]��U�?<�Iҥ�T䖆ݱ
Ca���i�Cq�̞|��Є@G����*����#z�USԱ�Sj�k��JZ�Xk�ȭ��X
��D�ޤ�e�}��~��j���֨��~��
��k`!�o��j^��g4s������$��KƔ��}q��=1o�#���/���E�T>�
��#D������x�n:e�i�c��y�������p�vxr
i����4!P�(��_��
B}����PDe�^�	lX�:����>�V:w"��}�W����Z�8�Y֡�_��{�쇦�y��[5Z4�
�{�����{�}�����;���a�	<1�V�^'(��Q�>� �=
�mu��#��/WL���Z�PK/WUWp}�Vq�#pip/_vendor/platformdirs/version.pyM�A
�0E�9Ň.�
��nz�!�c
�IF��[�H����5���5/�|��^OS-�Zz���7�[���NVc�#�\[VAR�������c?��?���q�3�ƀ)`8�/PK/WUW��/�	e%#pip/_vendor/platformdirs/windows.py�Z{S�F�ߟb�{)�~�	N�5&Pk��a��0%���!k��1�l��_�C��ظ(���~����g/p�3��|n���`"&��6��!e� ��<�3�1
	����O�3������Ml;#�����7_:-�y�j~<��-�),z��ŀ����&�1H�4r>�ϡ�O����HD�>~�I.�s|�92��d�(����=�D4@�#�qA��!r��h��I��H�����'�\�{������Kx����_����LJ_H�;��*��A���훳Z�^�V*�Z�ZV�|Է-��~$M8At�8S��xLЯ���[���9�,Cy�/Ŝx"F�e�մ1�a����PƜ�ⱌ�fNCsR�M�5
e�I.qM^<.x��Qߊq�.�2&��DWF��6�,p��h���4�����#�hAC�x��M��+��U2K�XC+fC�����u������;��뵩��^�q��x��
��ȸ��(�"�Z����[j�9(�!�7��'m���99�9�#�^�(���hCԾj�HcQ!#�D�%���$/
C"�g/��w	+��3m���j6�M�1� ���8x釒���l��Џ%d�d?aB�m�'�����`�,<���>��n\8#�{h���HF���Ҵ�c���'���V��&4S1��")�8�q�/���/8p��dр�2)I�(I��l���-����(@x5{�w��︁:7g���1�
e[�F2�F� v��Os��7W��I���bU��#̠N<LU��H@&7�^��!أSxy�&�4cn�m^]\\]��m������o���xm��b�����2;�n�jm�^��,j��<�k
+uMQ�w�����F�i�oQa��.z�><�-A�E��?�\�-Y���&�����l�t�Ɍ鹮p�W��WB]#hsTV�UY��u��e
�\�b��e��o�
�ȧYP�e��5�~jx��t�!� �<�$�K,�(�޺�K��y�b~u˔���6�
ԙ�I x��ѯ�k&��j�I��_����i]w�.��2M������2��.��N�>_���O��=Gn*d�+"�ެ��|�U_:�͛���F��<�ЬFi��M���^gЧ���&k��9�Q���r!�^g��m����6	�7�z�1lo�2~C��!|��%U�3M1P���૕Ez�Ȟ�.M�f�m6�O�/8�s}[��J�=
��FD4��9`�
dME ���rz�Q+�'��3�[�س�l聑��u�vf�$�E�k�!#Iɀ���’޷h�|tY����$i�-��5�XdIG8ԍ�
�,��2S:��i#�|��cu����י�o�,����H�b���(�#4�SJ%5X�U
q��2�bI�UK�rV��&�[�����!��%,��3�Q(�6,�0�8�i�8:����)a���_V�zw�D1���
�/KF����z�۪cƎm�I4��'��WG�Է�E7��5��-5Qmz�lo��$Y�B6����=���=Bv�H��ͿAQ���&�G$�3
��'�$���B�;c��r�^z��)q*�����3�NT�C�l������7$����Q%>�R����,MD�Y�H���4@+9{��:V��J@�0._�����_k?�OZՃ�n�Z;ݭ���=���������~������$5Eq�-!5ɤ�T,#28WD���b`�k��+N!��9��(�E�
:C&����&J���4��sP�݈8��}�3���	x��DN�\s̱�:�T��C��JO\��VI~���H�d
�;�L|ɴ`��}l}����׭��b�.�g�H�":��%z�	�K >��^�%�)#�ו�G���P��l��%d��τ��v�KT+--��!����铇m}@��p��15[ܩ�AّǾj�D;sٱc�[��yh��*��Eu��jU^�p��N�w�pA�I�Gɼ���̂��duh���C������� ��{���v@t��*U�o.G�����󺚳ȟ���5��R_S*��E�^�P)�n�n5B=~�@������Lt�
�m�R�ֵf2ȐH�m���+��O�-�C�|_t�3��'깲i�F!���BJ�i)DժV�rDgr���R�a%�o�K�8c�;$�=d��41�eH���:<@�@#�G�p���^&�(8�(sN��*���ݔK4�I��Z.�c���jv��Ռ��H���TX|	�~.�������R2�[�:����։57��F@�c*��x{��vT������}IV�F�7f9�4^Yz!�[3�T/�YqZ/W�k��CB���J�M��6"���9��h?�C�U*���� ��|��ܙx�gڲ����b�#�'���PK/WUW��U?�� pip/_vendor/pygments/__init__.py�VMo�F��WL������A�����$�բ@Q�+r$mE.������v��>⤗�P��7of޼���و�Ю+Vքw���IC�L��x��\oJ|�TkjD�k���ֲ"�p�nj�F�;ϮY���g�iU�,Jr�=�(K�JU�Wd��	�ϸ|C�C���\��vr�0����iJ�+ke�n�%�\����l�\��v:g��S��)���Y��-��d���B�`��UU+*��!qlVUBo]�IU"V˸���境1
�	
_%��oj��
�B�HC�\�0����(�miق�JH$U�N�/��)ޝ�� E��=j�9)W-Q'�S;�8۟H|��-���O�^���>��&���OI荬*��+����}O
X���wwd��c���Ƞ
gIJd�Mʊ��T���e8�J��B���4
K���;Ə��-�Z�|�Ml�|Ô
���j��7����X�X��P��N����U��Y�Iϣκ������..�u��]4݉���F>�E�H���^��z�sČgyݴ�':��._������w^"P�~X-�*A͙^�2�}��!�0	V�g���Ǹ~w}���&��a::�/�t]���蠲��ɻ�	�i-�����b���@ȋ]�2}�}�j���:������.�Nsa�Ɏ�Q7��>.�i��8��OCS��F��W�-?��b=�U>��랟(��Yl��D6f4������(����B��p�	��4,�6-`,l�E�R�vZ�qH��-Fa2r�R���5�E<1�f�?��A}��y��?��X��
�h]��t�NKc����w�ޏ*,�-���F6)���Z�������G^�S��pR�0}�&a7��i<c�2/�1��c���~>�2�ݞE���B��t�������g�j�S�$���Q�N4QP�Xߤ�i=[�J�|��V<���6-\�U�`HWP*��C�����QC�(XE�� �g�3��q��S�s��	��v�o���\�LG�����^ܑqG�����s�t�!��2���*��\L����J�^����P��I�Jw��2�:̝3�`_�;��[��?��[�`P=9h�7F] l!4+$�d��}i2=�@�Ĝ��	�y����u|�ͥ9I⋑���C��X7؃��0��~v�����N���nʇ���ʴ)u�\�0	Um��y�W��w�T�_�R�6��,�
&X�',���;��g�Bv2��tz�=G|:�PK/WUWy`ʉ�a pip/_vendor/pygments/__main__.py]O�n�0���h�:xk�
��v���XHl-���v�!���ݑ�$	�X6t
5y.���bBo�M�kd@d��HMp4��ꍆ���U�Eclp�멀�y�=,�,��C�>.: ��xDx��z~�,�l3�����Ӽ�m�o�vz�E���9Kb*&�5��ώ�ħ��℺5�_�6��F�����`�t/j9�%-F|1N��Ni��ܠ%�c8�ڵ;M�܏��*ePK/WUW�����\pip/_vendor/pygments/cmdline.py�<�v��v�	��* b+��0Y�"�>�%Ւ���hQ 0$a��$�_�?�u�=n$e+��|�H�m�/3{0�|V�����e��)������ӣl�҈a7��gA�}�xf�u��!tT_���/G��a�5+����X������Շ�7g�/|9M�<���x�l?y{t|zq�fY�"^q"����/WY^�L�ob]}]�E��_A>_��{�<[���}��j�x0���U��'w<������'А�8K'�-����#z�Qq���2�<v�*`��<�r�EY(�<N����2/����Y��_\v\X�i�xL���a.=Ň4L2.�g��+�o�:����{΋I�$�ԣ��}2]O�`i���z�$"Ս��	��7陜`��w�d�5o��+Ɓ�4�y�-F�ˠ(pt�@�'��x9�HʼnĈ���v��I��E����hѭjm��jhӯj$���v���5�|��9<2�y��e^�,����N���}��wQ�ޚJ>�D��/{{{��	��IFJ+�:�bxH,�������~�3�f`���쀟�e�R_z�֌��%mu����0��aՊ�0K�8-�y�M��!j�*����!W�^rE�^�S6���l�G���C�[����H�-�;{1�B}��J����w��!_� )9Y���W�5L�RW�!_�7����S��5�P���l��R;fW׶h̺ECu7�1�����8��i��?SA	�̖��67Ԣ>��4r]5�!�W4�pX
n�5.�Z�Q
45�����{�
�!��5q����Cf�ihD�����K��zҒ��
�ɲ�’/�Q��%������]&�ړI�&6��:v�e�w�Ռ{Rx�1������ �@TB�(uw_`�e�U�T�e%<�]_ R��u�!\��<o-��.�I,
�O��&a���P,!�cCC%��,��~� �I"�����0�N�ԃ���(�L�9��,N�}b�Y3m���`��:��a_�j.�2�'C���Sg2�m�1�!�p�n�Gň6v���X���`��OcE��
���l`�nLB���Q�HM�����v�0��=T� ��%ᑋ0�G��b�������
��di�F��S:�
̴9� "�5�)�ތ�k��I��:;I��:��C'1(N�N�
mw3<]���q7!Z��?�M�<	���R7�@Z�h|��0�c��2)j�2�tc�æ��A�V-�l��c�xɋ����'��sa����:J�C�T��Y�Tp������^�V!)�u%)$�
��3����'��O0�DJm%�eI��f;�l��n!d�c1�y�J>��":n���w+G:h �� �4iO����?}	[{�O~T.W���1�fe1�6o��$NS����A�im*���~��LY^���V��]�'���S�m��?�H{�
��
ޟy��ُ9��ށ�/��K�2�s���(��%�dP4�A���6Y� Ej�b���Z�.�����c��k��dĽ�����h�J�$^���e_�1�W�[ &��ܨݣ�o��Nnn��:Xh��,�rbh����6"����g���������Ƚ�ܷ~�"��uN,7�jD�s�v��4´�u%N��9�I	�rc�E�!" �%Q��+C��/ε�D�d�`�c�T�۳=�g,��MJ����'��m�\�*9s"_����u�4 G،`c� �X���|�$T�ޮӈ� ٕ�M��2fg��c��OW0&�У�=����YoZ[�
�w�8�K���B�J�)�V�w7������ir�lt�ԎݞY5����Ɩ���ӻ���<�yPVV8�R�s9�²�3,��;ܙ��ixϦ�M\�+�����H{�v���S�I�o��j5ևH�u�V���j�Ԧ��M�Y��fۤ)�MM9�@�����35�ӡ-�r$8��#�'���!uб����G��Q�#;���1q�O����!��jK5���Sy���ז<֎k��ĸPĸ �Ӷ肞�g�&�����j#fM�J�Of��&=|}{z���ۓ�+Z̶5^�|Tz"K��-)]��.�c���|�%�Awml��
�b/��C@�U��.Xl�܎�(�*���<���F�*�5-����Sg�q �k�u���T����F�P��Ȗ��A�4H�LU&`�P%�R/p�D��JdXy�e�Z�$x��BNJ��b#%t'""f7( ?T�jqB�Ij�*B>�x���$�k�tIP���X	�v&m‰6�՚��e;Մ4@��g�}S[u�سbsO��s�N#;��:��E$u/ �a��-�-i<|�\_v/��DU�ņ����{�f���m`O�TO�6$�X XF�!��	mBvQ�0Yُ�ʮ��N��#�͟S�?���[�2ﵥ4���?j'BF� :ۭ+~���G�SIL��:O~jn�ʫ�����T�-�0t*AJ�HJ)~�I�q>ڴ�.�c#�L=��RSg�<Uk#܌�f1��.	��EZ�?Ng�1����>��2�8r�|����M}E#ll������Q��<`��.���nmɭ�M�ڬ��Z"c�
��gho�D��`2����������@���6��C2@�Tv����Nu�ق�����	��K����d�i?-���L՟j���ڛ/
�X����;\�¤�p���rEgx��V�ZA�9�YUګ�a��>X����k��N"NC���H���)��O�;y~Φ�	ϱ7��J'���ILqJ�zJZ�i
�@��O��Z`%��:G��dU�x�����l���M��*��.,�4�rL�G�M�-pq��`ݒ�O+���ֳ-@X�� &2���^-�wγ�r�0�.����Ն�8��C?]巿?���1v������3�8+˷K��	��}��3>�H�fU��h5��$�f��'Y�U_�I6�CdQ0�C:T����r3���y�%?��}e���=�v�$��?��-{e�������Ei�"�ŝ�����?+z�C�1���H!��O���v2چ�K|B�S��~�!{��ӻ8�Ry~rtvr���;�s��<�+���$����E�x�fu���M�:Ŵ��/�26����u��2�W�I�ٶNU	BUn�"V�#.�J�L�M�X��q�q��M�Տ��:�q���r1�����2�2KR�Ov�\��F�{��i�k �fE�U�
���5��Z�:�o]�sk�;rr��b�Hq�> �v+=$�*"�&�A@���O�+f�Iᾏ�oP������}��.�IT`�K�@0%|�|�B�D=@&�šE�B@l&�eY�S����܊=_�!l�W]�3D�	m�4P��Z�N���4~��E$10,�~<�7-�[���Z�
�U�߱��R'�pnK�
a�,�cD�cT���XA�/ƯX�c8�͘��_�s�����.>Wi�
a��q*@fo���j3��<�+Ȇ�
L�c-�p�X�5�AEt�VM2�.gy���p�	��(��J��`��Su�]Z�?�]�u����j�E��&����u�gx�jOt����w��/���2sm�-uqfON��~�[��������Ahm�V��"K��zi�R�0[�z���*WW'U�,J�,�C��4U�Ӣ[�����ö�<��̧k�_a�����.������F3g�G�I�̋�}\�g�J:���3��e�3���}��xm�ߑī�[���콅���@�X�ؙ%�XtE/���Nng\W��)�o|=͂<z�o��U��tN��R��GU1/�Ua�~Q�_{�0��d�'B����9�}9��-aα�c|�e�@��p�1��`1�X��ւ!z�]zә��c��*0!�����+��`#�<�b���;�ۏuS�߉���-j)R�T�%��B��;E��z��;�Rc��ևPd�A��׺F`��t�7ZC��ڧU8�}r�T�)2�e���z�I�)I�W��D�ϩ���K��w��QD�*G��WE�u��>�< �=���V����\����U�RVV�D����F/ˢD=��܀��w\�SW[�
`�eK^wA>vN�;~o���(�֖�ܩ�s��乬�jg��2<�GSZU�;�Ny7�늖D ���X���y`-:���q�ڽ $�:î	&�-�~������w�����U����������r �@�pѐ�Y��k��ߞ@nzu��u�-��J�"���62r	�)�[�����eR�v�.���&�QJ�qJ�r�R�ଆ��w�./��\o�;	%��ƪ>M��Y�C�W�\�0��04�PU'�ִ3{��t�f2�������T
HO�
wb���<;�|{v:�B�+��A䵃���
v���.�Ζ�|$82�ŷ��Bso�z$+�WA���s�,W	?d7�36����{�u��,Knv��yvD9�c�yb2�
����X�da��J�x2����0�k4&`&�$�<���ᆥ1Y�!�9��%̴�O��		U�<<�`Y�`.U�F�:���t,S�[)ܠ�?Y��iZ�nu��S�����P�Y2A�@�Q�0K����ߞ�L��{/�v�0�t�&P���;B>
�[�{)SY^����Sɹ% j`�fe�^�5-�st1t�]΁,��!���.�U��p���(�%��Y�g�!1�9�ڥ�>���
2x��"۰~:���Gu�xY��g����C�'��oUOj�G�	6�@�O�z�+CT�w@/@�p7R��Þ6])�%P4U�!ܨ���K1��j��:1�G�'ٜ����!�O��f7�<�ƘWv�mg��:��#/���%��d,t�sW��)�c�I�B�d�3�dAF	��c���%4Ui���ǵ�����ʶ��9-p���W(�C�#��vb�aʟ&��W��.��5�*x�v�����e(�q%��wkZ�fX��d��L���C��"�I2dXRÓ�M�K��7�锇�Y�߄��Kz?�r��8�]�X�ɘ�/g�~Utk-��b��P6�~,ӰB(K���YP��*S��'X�#�q�hx+�.��$�eD�s�u����M{)L��K�Ն�j��-/.�zr�Jo]+�4�t3�H{��!���v�U��$Ɏ�3
SU�.ot��8�9���"U/�'�޷��ͫ��'���
�o�S�n��n�Ѩ���DෆD҆����I�U
�xҚ���g��`H	Z�EB�18�)�8R�62���W�ڡ��Q[���O��dg����<�Q/\�l��l�O�9q��
b@ka�(ddn����Z�M˫�ӜF`z:@�!h��t7���N�[����,v%��e)���[��vX�;�o�`!?�X�:��̹��3��f��C#���#I}��}���e����k~�BX�bPA�f�1Z4@�����/��I�ġx��.?n�]�ᜏ[����Y��k�V�W�n�ab��Q�sc�7�`��S;x �-�C�H&��s�ʥ��R(O��y��P_��m	���޷CPG��c�{5��y��̒���8fZ-�~y��!��?ʸ�<�p΂�����
fS��x������BD��;l���vK9��3bYH�h���l��?�jS�!#�`yT�D̗GqUB���X�R>�����[�J~���y9�!�Z��Bˉ�?��P|s�O`���pԐ�j��w1
�-��?wW����Zw!�b�ީr5zq�zc�:�!�~̾i<�x[#�w��}*!_�b��5�3��_�ξC|�����Z_y�=u�N���lf�B:͆�}&k��RKo��<��ڇ֠s��b
�ٿ(I��J;f2��kK�w,�/PK/WUW�y��pip/_vendor/pygments/console.py�Tmo�0��_q�4%]���c�2��!� �Jպɵ5u�*qX3��$i2�����^���|w!�}v�:E��a,E.9Z�Gdz��2K��Xr�ad�v�:L�]���FEpS�0Ë�q8����A�Xe�4@�/�|~����Ѕ�,F�c/�^9���7���na%3HPQ��G�-<�c��u?ZN��sm��ӉSBf�Oj5���f�����*Ӛ=%Kɓ6$�
E�����+*ݒ�r�"��3������m���ߏ�/L�	Ͷs;sw��[2}��|��0B���{#-y�d`��:$�k=jqI�#Ӓ�<n��Ib�ۤrj��)MZ���W�c%��V%�P�s�aJ���I�ٝ&��V3��Uu/��\7�VOXJ��-7��\�Z�,j�k��#���]ϩ*P��g�+��*
��2TE&�����V�o��w�WǨ
d�5 �9������RY'"��
Ճ_,�o��{�6@]=:@�Lr�"�lY(̣�k��p��;S8�꩕M��]��Vn��cPߪ}�<&�-H}}��+��3���-z��|6������C�ۡH�J�&�g�e�P�Eg�Hr�dݑ��1*G�֧�HE��2����U���_�~�L���~PK/WUW��s�pip/_vendor/pygments/filter.py�UKk�@��W.�rPDH���i4Ц�NΛ�4�VZ���kJ��;��,9�!{�jv��|3�N���ݯkl��*!-j/�7>/���V"�
� �DoF�%V����,����XolW�.��?�]�_|������"�S0�p���ǯe�HQ`c0�/�������~y���r!M6�R=�	e|��{r1���;��)H��zq���>�4"�h\u�@�v�J�*�ހ [���U�y�wo�!���
΁|��3:��qi�.�{���Up��"��	�4H��\�O�(MW"�%A��1�X�;{���J�:�d���ϰ���QD��wpta�VX��Ѷ����	�yWGp_c�4��S�P�3j���m
+�׸Ą�|�g�y蹗��R�P�`bPV��]���96�:��o1�g.[t(���١v�c&�Qu��Tc
��d�m,�6`�Ÿ>ƌ��Oc��Dmk	�t�0O���*������G���ԙBrc �?n�h�aٮ���p%���֧a�"9��*(AK#��9u`��L4�2�uz��E�%�bba�\D�����ݐ�+{��.,o�V�q=&��$�父�+r�� ,J���X��0g��
BW?�r���@`�=�ZUs+
.i'�Ll]i5
�TE�.���S�KH��J�[�[8�j���Q6�x����&-tၦ"`?;����ZX��)��fp�b��3�1_1c���{�����:�I��w)i+�P
�T���xm���r��m4$�|�PK/WUW�\70�R!pip/_vendor/pygments/formatter.py�W[o�6~�� �م-0�2 ��@�K�a(
��(�Ej$��{�o�9�%%����)��w�s�r�\0�t�c+�wyml˽���<�,�%w����Tܹ<<ڕ�;Yyl��]
?ً��ؾx��{v81��[4ȼ��9!������Ƀ%K��ر�7���o�\�zw�
�Jx.�\B�v�zV�J�n���iY'�|/tel���T,�>
�?����!�I	7����׼��~ϕ�����]�d��E%j�W��]Z�zGʚI'��\��	��m|�+|o�S�Q�br�N�&��%?��e�����ys'P�������&a�\czU���GVz`��F���D�>bJۜ�6�	��`N�RqK�!㥱V���
v����V⳰�[�.��d0:��ޤ�ݎQ
"Z;m��\�b���\I`���T�|U�Oӳ�k�!�@%i4��؝8=[�>2}�rn���HåRc-�lY���U��w��F�EA�.���=m�x� g�a�J����a��W�S�+��e��\���‚�1G�F�¶Rs���G��^��cB)GQ��\4��z-�U�$�6L�"O��j;%�@��[@�^�O�RN:�+��<�t���x]A�c8ӊ)�c�5WN����3l��),�W�x1"����'ļI�%�ԑ����t�%�BC��T�M%�
k{�)��
���1�	:g=�;Y��%�DZ�Aq�pB|��gy����1�����ha�8�^<X	�$�>&j�Y6�5.l����� [�N��O�������=��{��
��Zl�i�(4=��w;v
9&P�.3�n��o��B���A����� ���K�$�fj�b�Z��i/k�$��B��caZZ�C3���M(��Q+�{]��D��Fź^�ևc��7k
r����u�.��HȄ�y�ݠe�`#���K����)i%~���l�Ao
��gm11z2�y�R��;����
��6��=��"�#I�‘�d)X����Z��~�jÞ=��z2Ň鋟K,�0v.:<���;��ۃ��St��q�l&�BB�`�Hw(�
DlkihHI)`<��A���4+�9w��.l0��(��
C{�3_x�!��*��lòX��z=ׁmTL7�Ur5ç }M�z.z����C4�=��Z�#��d���.I�s@�Uv�[�S6��b�MrOĢ�hx�밂�v��#�l�>1���������}[H��Q<��s��T�,7P��"ׁ�Y���\j�oL�W�S�a�5Xfy��z驵B3r<�M=�0=�h��'�o�ao
�4���*�V���M���NJ׷��M�K��!�.��+�W�_��c�h�B�
�hnڐ*�h���
X4�FXrP��6��6Č�a�K_I��g!Ǯ��7
������+��-j��Oe[����Z[���C�N:���!f=�F.4"�hqЖJ��@Vl��ʨ�(�b�&LH�l���XӼ�"f�b�DmkacAg�RŠ�\1�z4�t0m��Z�Xc���K�NS��(�e�:��6�<X�
+��������L`�u_��СW3��Z
	x��М)�}�IDT���[�PK/WUW�կT�$:�pip/_vendor/pygments/lexer.py�=koG��+z-:#9,x�ǹ5Ύ�ؾ�A�!�)�y8Ý�%�b�_��5�r����ġ8���U���Ǐ?R���n6:��i��uI?�g�yD�}WZQ����Ք�V�vW�7��L=3_����Ϟ�?�B-w����'F�:�LT������?���͔�d�J畞���|��_�x���7�պ(U��8�`��0�G�f[��*��V�*�N7�ѣuYl�6�N�u���.s�f5,BZ��m���o�D�@_��L�]K�r7�cz�o]|й�,�r���z�^��ܦ����JO�-�~�����i�OeYټ�D�+�k�G�V��{�&���qg�*�q&?4uS�7���y�WE�o�R��{��,-�o�ѣ�<β�\]���K��D�~���5��I��:�7q��7��T>�Y�׀2l�櫬I4����rwSͶ��M��K}�V-h�^�MF]�2��Y��y�G׏�WXC���b�M3��O��}>�u���M�ŅF��{�~�\�k�^��q4��5^C�~���4���`khE���k�ԇ���_�i@���� ��DUmV]�I�śe���:��F�TPD�W�Y�Xw<�A��ydP�?�qS��&]��Ԫ�?��b!CΑҋ��a��uApx"����tu���.�U@.`�\��"���8kPP�I�X���s}7�G�lzܶ�$2g��k5��2�)�d 2�
�\�Z{+�[2]D�tߤBG���-\��$:cUm�*]Ʋ8�i�-��
�8�
5K��lA�=�uVlq�/&��Y�?�dH��B�^�'��肗�~P��G�_�e�l@����	�hu[�5I1l���pYl�4���J�OT�˴h*���a��2�tJ<d���m���8#�
���||���x@cv�i���\�Ȁ���p����b��junu[4Y"�U�$@�Xґg6�Ҧ�z�D?�{Ѩ�"g���2��sU��
6�v�Fj�V%(��<��NX	 ��`�	��X�&����ܠ�̅	R��,0X�ͳ���7���QP̺#�����R��z�o�ZE"�f�m���ԇ
���9�pgUyk�
��A7A�����y��WR�Mt(����g��Y�]'��m�R�bUl�A;AG�53��K+#1�E@PW�?	0p���C�:^V@To�/��&��sS��/)W��ﷄ6��G�s3�s{�OԦ1�$�6�HLY����R �#a$�?�~�) �QF�]��54A��ֈ¼���b�[��’�n
�ň̪�d*��%$�f0�2�޽����s��e����K4�.��+�8@�g��Qj�*��6�]h�*���ǿZ8Y�,�r�-!��	��^�t��)%�����4@H���z=�nLj|U����)|�l�/a����E�/ՏE�-�o��W	�k��m�<	5�g�e#��*+�F�u�T`���@�Z���m���.Qh�]��l��7q��]����s���ԅ�ܘ܀�?a)��D�i����h[�3Q9.�qo
Q�'3O�������7�N�L����"`M{c&��	������)�L�a5&PBa�	��B�AQ���[��D?�S�������I8�ru,+7P�9=�ΰ���o_�$)��$���edTg�x�dz[o2�/!=ޚ�ҫ����X��$��Y'��&�pώ�1,B�?��013߀�JQ�2`���@�^�;�ն1A�����v�[�	#?���)˳w��H`�6����5�	��XΕ�����)o�b�Gz�	��(��eZ���6J\�z��!<�i��`�{T͒mR@봄�tAV�]�ࡪC�D���!�j�7+ 0�FimL���A��6��lky�[P��1i���d��h�y�hZ�����-l@~s���4Ӝ���F�wt:G�vWB�tp(oe�PxD����0i�#��
tr��B�T�f��!󩩀]�l���q>0؂�n�����`��H�Vg[��#Y�w�7��b>��I—Y�EW�X���XO$m���J�_OoD�����I0��0ӢbJw	Ny��9t>�,�[�����Gl_�љ:�1���q��Hx�'(�%�G�ŋ�y��0�h��!�g	Fl�˴RoK�0&��JV�	�?�A�jz*n�i��H�*
[�$�|��P@�yO�蘏?!G
,t��hZ�rH�0�bA�vX��$�#�$��Fz�(f�+`��"�DrdG�pq���1.{��Qτ{�mo���0�I���a21�P��O<̶���<��š�&���G#%&��%�&ڻe�*ۋ��=����N�iKk�Q�&g�[�!�Q���6�w\��(�%�]0�k#p-w�ό�g����N0���Q��T³M}��jn�-:��ZB�we���ό�u��C�]Q����@d@&n�Xe��m��y��F��E�Sw7�DN ыu?0e����3O�R��xVRn>i=b2U����.DI�%��,���c�J6|M�%M�B'����z���3�0���5g�N�����G~2�0��і�P�:��׻Mr/�d��k���8�0J������Cp��~w�7Q���8� ���-�Sg>�U�+)a7	4�Yݲ.��06��W�؜( �uW0�l(k��R�%Aaj���#��m�0=1���E��CIY�pL|q�t<�@2V�&����~��F�n�<�6ʋ�-wƄ�j�V�ՏF y,&V�泮�`6��t����0�4�KDŽ^'E�ɱ�����@.w�-9��>s��'ّ�Wz[�Ԋ�4q��~�e��"��F����7���uF+�!u�U2���D��8���0q[�������H�
�EQ�|�#���'0�^} ���W�vZ1=�ζc�e��8���
�ь�X���+�?��h=�~W�ι�T8Ό	��4����g	�Շ��#TM�LPD`�r��`
fV��=�Ӈ���
}8JJ�jvq����1��/�I�c��_��b�[~�� �Axb3�A)�K3��n�^��������Z�ף��� �p͝/ԝ����7�m|����N=I�'�����c���T�
�9��tv�e���FŅ+�P��w���������u>�R�i�w�B�^<G�j�'�Py�H4�g��G��ؕg������G�Y4o90�Cp��m�ިm�L���m��>�<	�.��s>�M���`5�F=�"k���[��K�-4Q}d݀Ę=���$0mJ�l��"�&d�YJ����I� �71<�t�P]�-Ip�0��w6���O�ga7:��R@�P��>� ۃ,��/�GK��?�S'd`ج�VfQD��e��G����qz6�uY�ɣ��u�b��N�@���7d����HQF~����9Y��߁Nc�y���0r���� 刿��Sr0�Room8ߞB/������N�ѭ��~��3Adv�#�e�s���'�����0
m?��2���a��<!���ӣ����ط$�b�lO�P���X�W����xc���r _Q=��d�����Mf�δ�0���LGY1�¸�^Zo{�~>O�m"�NI�6����>qI"��b�D����C����\�u��~�K�$
���|tbũ�rF��u��ei^�T�V��.��Q���t,#d_�	j9h�8W��T�MfrsbP� :��4���\r@g����hԃ��������Ǜ��IA}�Ȁ��s��qd��r������'#׬Ԁ�5�#^z�//r��%�t^�]*�l�����-8'7���+e%������S���x�G�!��U[z$����ǩ�����Iq�'���zB�8U��l�S2.ѡ�"�Ảz@G��B�����-L�r~m��p�MH��X�6�Q�P��ƭ6�7�I{���@�����|���2��|Z�q��F��v�|�K�U�fM�4��+V2��MԪ�o�S�6��Pu$�:jm�}i9�$�4o�H9��D�}����.�$�c�Q��1K��5��lܯ��Cc(���,xB}�����ɿ�
AC��p�N������D��������Wԇ4\ؘ�hO����f�~�0����|�q�r�/;�0��o)g��
��,�3Un2]���u�M��SI
�M�NR�rb��drB.y�h,;��E��x���h�U���&)�Sy�q�:)?�o���#�/�Q"�R�>e%P)&��	�%U���Q�d��$�h��^�/V�sCǖ,�Ӝ�UVr�d2^I�`���3���MJ���-#I�0�K�zJP$a�� -|�����k�:�߭g�J����2'j��Zp�@�q�kZ.B9{Sϙ�� 腅G4(�৞Z�����6�����΀�q(Y�gG�B8�t��u�Xo�c�!�I��?L�����3*'[�=G;8�i��ocJ�_QN�dG0�T�5T��/��2�W���V~[�uZ
�@�������'�Df�KVHd7�1���[�?�r���!��WYc�H�#�(�I��j�a).�S8��M.�4�G��sXҍ&��;V�kL���O@f�q'Rx�E!�S��)��6���78�	�4�d
f�!�@�s#+����Z82�	�&]D���2w��u�����n{J�n�H< �t�-ݴ����xY&�9��w��l�I]�y�(o���{���z��4�F�~͂	���N�/�U��m4��/�K����3��BD�ї �8�����N�����]/t:�.q�.|e3�pߺN�&bаk'Aks��<�Gv���%G�����}usZ4� �+�o��7U�+��O�q�-С�b�f�����AT�5��Q����J��l
=`mG d�K�?�$w�f�q����g�47^9}ݻT^�CV�'8x
K���(�P
��)
��r��ž�u��aB��iI���mҽ"�?� �PDlF���Ĭ֘��{%r%���~(;x��&���~B�n���s<�4�)��DzWM	b�.��t���A ތ{r���i�����{�\;��K��Yx7���f�ǘ}¼�����9^���_\sZw�4�~2�Hj���f�"��a�UA�z�5�T�9�u��������>�<	)�����Me�.fa���.��rE������]*{әjr�"��٬�Q��yl�x����:]�ϯ,��#K[���1�oN��0��[���Bm
���#�{6�Ci�}���p��v�qb��#�ͧg���h���&�nŃ�0���u�'�%�!eK|ʍzH�1<:$���y|WFR�M���1�W XR�_�6���y͡��ZY�
lA�cpfn��
�v�P6�m��s�7�}D�7�!�	�N��Oy�^s��㊝pRx����V]�a����x�Ů��r�(R�F*�
�=Gݽ��>��^�N����\�5+L�(�}�.����a ���`V�����0�w�{�?��ɫ��s'���q|{��$*����t�%8�.���/�3S|B������}�Mj�rfQ�X	���"���U�7q�$�"@�E�$Q�)
-(�_?����[)]��|�Q�a�>nr�ŝ��9-)?E�,4�O˙:�`5�������P��d�&Ѻ,[� ���v����u+���p���������7��ƫ�ןt�n�{���Y�d����TUN�8�ħ�ZD淪Nlk[<�ňJ�!���TZ׉2A��Y]��������;z���W�n�B�jK��ג+=�6�6ڨ�
z��r +�.o�Q���.ES�W?��U&`���k�.l)\�GLr�*[蒏��n.ʉ�҃kdS���y���x�Ctɠq�ߪ�>�/.�H��0/!�.�3�0��'�Jލ�j6��¡k�X4�J����gu�cS����m/pԱ*��̛�ԡ���ܶHs�����6WXc���I���@����MY�糶� ��"{��|��G3��hI�s&t�̕HȔ�j�|�jJnyi��+�J���v���8Q?N�S@�A?_�ܧ7�g����*�%�
�K�ު�T�q��M5�9A+�z^���z��:Q�F߁W�]��}�H(�h��	����_��8{���
&'�7��v��y����C��#C�����R�xd��ޮbA8�`O�E���y�[��So�~S�g58c�&�cM��^���Tҵ��V��uZ{���Xfk\y�y�?�&� �e'���@_�-ވ���IK�
��үc��U��x�Җ��k�U]P^�Rg�]?�m�z��o۾i��o�9�}�3�����|��"�^&%�$-#�=��(�9��$�8�es��Q�!f����	X�X:��
5�m`�X�'��]F<��ű
�c�XH5�+�� ��Q��lL�]�M��I�36��:�,���*����b���9-����O�Z�gTM�,�ǭ���Pꌫ`�u��`'�7��K�B���/���B)�䝰r"�\9j��N��n8�*T���'C���l�Q�ɫw/߾x����R�L�P�h�'���z�R�'���ꃛ�T��
���Ţ��R�̕c�������&��<�8JSR��|l�eW�������v4SW�ϻ�地��N����?����X؆����UlҚK5(�y�5�y:gU�x>#x+�
/W��x0�V�붕񂠁e�$ �`�CS��IFU�&DX�yQ�+�b�Ѽ8z��E8cb�]*�p%��L2[m�����ͼg2^p�|{:"Z�-�|:Щ���n�U����{�!t�'uW��3N��dhJd{la��)��9��di[Й��$f��<)Bㄮ.�y�C�.Z}��=t;j�e��&@!C �M��o����iɭC��%|Tc
��lj���2+�1�fPi
7`�8�4��I����|:�M_����#�&�I�B1��Ɖc�k)nj�#m�ZI�DN��z�
��� ����n�`�لIsi����7�(j��G��)_�/;BW��*�����MY��N��^���q�8��Y~���
X��8���?�a�5��u�:��v �̋��R�KHפ����8]{cCZ��K�Xi�+1��$���g����?��sݘ���Ör�#,����*	u^2]�=����܇���r۟ ���̶g��P�@?��c9z��is��H��0�͇K��80��Íx��X�X��x�� 
P�xv�Gk0d�]41��~WMÊ�G�+T���NJ�9�\��3�����U�7ܟ?�P�,+���6�&B�3�W��]�se[@����$���zx%a�C�2�i&Gz��Q�9>@���n�y���pmSr���B��2#Oyxz_�RS� ������ ��R�\�̽��M74��2W�48O�}���'�5��~��#�2�P��6y����0�̃	s���~��P9��>�,;y^�go$�Q^3d�9��{G3���~0�o(���/�bq\]Uo��)�(L-�w������5�G�@��%g]�e��
8�3�K�2s.���#�s���b93�t�)�ˌ%��q������}TF�@G�oLy�)�'vIo.dս|�Z��� b�[V<%KǂB��/ѻ��R�.�PO`�2�Sc:QhB��c#o���J�v3Y��������b�"���泪1�Ж)w�cNW��2�Q0��ˀr�m�-p�]~����/0��N����~�G{�#��
��o2I�p@�rŭv��v�Vt�>������٫X|��� ���c�:�b��.��{�n(1��-���H��{�g���E��ݱ2��X-.N���zv���`���_�`��nݧ2��Sw��;֧��K��ͥQ�����*�ȏh��cf��eVc�X�ze���3�c�ޙ�jo��#?�KCc|�T���-G����W�7B��5�����^<��ʇ1��j��{"���i	�;�lqK��c���)�+�~��M�L� ��9���v`)��KN���\<As���1��)��
����д}��k0U�T����€4	K_�qeqX��<Ĕ‹[�M�������D>r0�4��b�ɖs��)/
V���j��V���3`�u9�g2�\.��x�Vz�!$������y��F��w��*"�v2N�b�����ϯ�j�5t�R{�R�{�%ip�eI?7K�`�G��D�V��f�1�w�|�Bp3N�:Si((P6Sˡ2?B��44K���n�S�_�#l7�s�&o��
3�H����v��1!����q��|���0=��$}M���Wu���1�;��hA�G��R�⺗o�\g��E�)�C���lI���;!�'�3�xت�e�=�,�v2����^^�Y�չ�L���S�0��Q�uM��XS�T���P�XXg��7��2|�Me�^�~U����ښ	�%��D��o@(��AX���{�n�O�L�
K���J���rm+Q���K��BXɜ�Ms��yAe0$�ծ�n�{���f�u��Y�1n�����)�br�a��D]�O��-��>G�5��)��r�Kzw�YҴ�s`��x� No�vo��z�`Z��H���)��o�G>ߺLɁM�v��e�=Ks���1�mG���(&924T���r����]��ߪ��O��.y�2���7ڍ��ruN���<�Jʭ�&Q���e�՘��`��YaZ^�&.N�up�B�.ո�x��4�,<�ʡ�K��x7��;����a��4���(�Hm˨�W!4��ʥ{1|���G���_�I����z���|S��|0���s�
�[f�c�N�.s�e<4������2��L�_1Z58��J_�^��l�
5�~�=����&J�T.҉�m�u2ƭ�GvcG��V&a�4�7��Ւ�� �Q���݉��Mvܙ���qq�ypz��R�g_	�OL��*5m2�e��sIj�|�t��3.41�
ev{���߯u���k�GM�,�PK/WUWgL	�� pip/_vendor/pygments/modeline.py}RQk�0~ׯ8��KL��=�f���v��^��(�9H���QC�o�Y���]'�$���Nh4�V�v6Qu�Rh�揯�
�H�
7
Dn��Z_����u��ݹn�-�&����d�6-��׃p��,"\}����>K�j�)\gC����m���6P��Bڄ
�0F.k� cyΥ�s��j�E�WB�k�+S�|��*4�5c���$����UC���Co!Z��K�M�f|�؟�.��x(/ ^@�ɅU���$mm���x�=�V?��~1#�Q'�cy}�-c2Ub/]w6#%E,'���;
���@\7��Ѡ����M4}]"4&�e�?zI;w�^OVp�o/��M�^,p]������ލ����29�i�-���D���[���O���X�3]��I4�6�#7��w�#Z����5\o1:J�`<�8=ep	u�!���E�u|��/�<���[j-�PK/WUWc��]
pip/_vendor/pygments/plugin.py�U�O�0~�_qb)�H��cE��QD;ih�R�\[׎lg%/��w�C�4��iy�����З�Jk�L�.����ś
\Z�s�`�
Hq�raC�Kn�j��W�tƳ_eJ[��Z�2�f��K�,�,��.��إ�`,�)ө�%�t�ˤF�Fg!(
�j��rg{ϒ�r�E�G
�P��5��"�	a�(YE�=,b�F�:A3���T%[.���$�",�;X�@��x@N)�V*

0� K1f��"/��G
�B��~��~�r��)ȱ7;w�Js��;��e�A:���/�װ-����z��6�"|�/`�”H1�'t��D ��he%ˣ2o9[���H7�r�#�YVZ�BZ��?_c�[���*v7vqO�Q�%!���A�4�f獉W�
O�OTVh�X�>\>
���ۓ�S�/��R]J�l��ŷ���$�4�'$�����
/ד��1��…����h�}p���w��xx=�{[�\�o�^L�{����&ӻ��Y���8����N����c��E�)jC�p�U�Œ����~-�\�t�O�M&g��	f�n{����q�<~��%;�Ԏ2�E�/���Q��<��h��6<�0���QץF�k	?~�I���{k���P}[(�G}t����L=��k���q�yʷ�~�= q����4v�驈���|$����u��T[�70)��C�ef�����H���p�[X#�Vr�͙c9�>>�m�!��L�^�ط��_��Jj�d�5r%*�u��i�2E�`�ʇ�p��M�x�h������k���H�^%K���K(PK/WUW�r'�M pip/_vendor/pygments/regexopt.py�VM��6��W�Jk[��@��v��4XoO�k�6m��HzA{gHJ�Jr�>$Zr>޼yr0x���|�x�U(��)JmV�k�<���C�
)�1}L4x�e��t���w`"�ʾ��%z{�҂�J���K�F���h�B�"��Y��QG�X}��d��nr�lΘ��'4O�(�����|Z�6L*�<W<�_����sk�u"R�9@<���Ԉ���"���p�MJ�Z��L���YV��{��P9�(RU�dq*7g�^O��m�uv�}<�q��/>�a��C]������x��r�/W+x��Z<����?>��%�?	<���=�/_o��T\���TAd8�\�d,f0�:g�N?M��.�,�\�v�~0��
���f+��f���k��|�����D�ܥG��,��zY��Z���"7=V�ʉD���u2p�ݦ��6rqI��v�H6c��J��P����~��{ȋ�Ȃnz��;2�r�{�j��Y��Ϫ@�dU�Oy^�l�$E��a�;Y��B}��� �Y���Of�:�yV��3^ix<�V��>b,��C�ܳ~lD��ަ#;�Z�)G6��]�yo4�"r*�}��j��W�"L7+4����f�ڐ:i¤Dbvh�ʆ�8v:^���%�c�sR��>s8&/�G��r7ʴ����)U@��SCh�� Cc�z����IŒ�o���7|=��v5ч����X�p�=��(��<��h%S�|�eI3�:g���p��%Up�[��]�)t��}��лԝ���R�b�:¿~b�<݀P4�%եN{Llu�"�%�C��(O{2Yc�x�m
Q3n-/���v+�ѹ!��ˢ��?���A>�5&�‚��.5��)�snO�TԹ����e�+�]h�(z�<�6l ��i/�v}t��檏�9��3L5�۽j.�{;�誣�i&:~MR^W�z<\�يg�n!~�< �i����A� !T�{e>��¦]XO�q��
o?LG�u�������z��v�\�[[ǭy���J�<>�16��2��܋��`aUo�ы©�9�\�ݬ�z?�L͜�X��PK/WUW7����pip/_vendor/pygments/scanner.py�VKo�6�ﯘ0v�*��8����뜊B�J�c�H*��h{gH����=V'i^��uqq1z�}Y��.q��m�}�̂���Za� �Fa�K|��pX@'�����e+Jt!��O��(�ۃ7�����J|Ep��gc�>xؠ.�h!�F{|�	��\��nv$'����3�ɭB���%D�P�u�{h��e�*a_��C��mDKG��s|ϊ,�|�c��1O@qTv���d4�K� 4���3K	n���Š��4{+�ʯ�m�
�WW?�x}u��>ue��^�C��Ϗ�>>l�F���5���E���������X���\2��6`��'f�Y��sp����Gbw��j/k�����:���:�AHb]� ��'{�|,���F$f��l�*o%�)}*?�j��
v��=���{�H�ᩛ�x=i��[
W��LA��=Z�B{���#�t��&6Un�F*�5��#��x;HS��OӅC�[�dW�S�t7W1S���֢��8?Iz�$%�*Ӫ�}2űc����V�s����3Τ^�M8�T�*ԥ�HO/�Y9/�Oi����PuV���TPQA=i>�����4��4�V"���@�BY�m��#�\�C/�lҦɔ(���zL��	E�Cʍ5
Z�_��eI�&O�刐�̟�F��-r�4jYg�
���������q�l�3�/��"\�tzN�ȴ$&�e��5Cc?����"9��HPv#�@U�q;,�.]@�R��0Ρ�����b�M䢓�&��<[��@��CWCu'U���k#���W�P�)ҳ�]'e9�4��A=,ު�j��?���j2ޣzX>�����_Q�qmC\!|���S�,`'Q�/��W�Zd���(��q�H]Ȝ�]?����,b��c�6.o,׾Դ�tN��,NY�
��c����"�zV[�1�/h���Qc$�iXZ�D$�LQ;�+
:
7����C�o�m��ǵ=��^��Fq�Mʹq1;�W����0���8��+�Ǫ�֩�Қ�Y�,�M�Q���4��=s����{Z��.9��ðΓ�r�Ga����$h�`�˥����e�z��8S�4�'�)�iQc��N���3�㻍���PK/WUW70���!pip/_vendor/pygments/sphinxext.py�X�o�6����0P�T5M�a0�]�rM�p
���--i"�cA���ө��C1��E����!N&���]�Y�d$�Oo٭2˟�g��
2�J��He芥���!Z�lM�Q�ť/@�-�`�������
�R�h��%�wdL�,�+��JM��'������s���CTf#��:D�1���ū�7�#x�)�����~9;=�i�(a�r:'����PH�I�[�ژ�`U;i�0�݊$��i�`5ݟ��s�z�9-�>a!UMy�+~�,�u~��#��ifR��	䆫Q\	0��N����^��1�����l:E;@���g��t(cA�����WF]3iV���ZBn�����ܬ�������[U
e�>���S�a����a�����N�Lx��zG�:΄�7D������
��5���V��&
��먣pE%��2I�����VD��.�7!��*-��3���:���l�٬��ur��ɜƬ#�
 2g1��?Xw%l��2�%��+�ѯѲ�K���m�p���Bd݅AFs��`����-�Ll�8�
��m8��l)�k�G�kV\Ci��#����Y���\24���	��yzMOPm��ݤ��cҀ7�u�CL݉�
O�&-��v�����+W>~��jkV1;�m������!�
�ΆM��LO{������0O��IJ8+����	KcG�I�/�FM�TY�Fw�[$K�<��^r@��R�C)h�jj���Q�6�\@��R�S(3�����w�]%Ԉ4,�m�KK�:��Y�&���S�lY�H��.e�S������<"�౬��@P�N�4��uG2��|k��
�Sb]J�N�͂��q�R�ޚ��Mj�O�[g����T���Z+�K|y�Y�/�@���%�����:�4F[�	UԀ���:$�r����O��@�����)��?[��Hd7���Ctq�{��z�5�p��qа����U��$���q��ÚO;^�,
[*t�!sc&��!��nj�~�@��ړ�w�������F��k��-�;*����1��[����[<D�.�]$<��l’�
έo��1�Ɯ�V��K�@\��������"����E`�^6
�-��������m�{�tSX	��w�Rԃ%�#v[� nW
�����u=���s�{����4�V�j�Ƒ�XB���9"#�+o,�q�  �&��@�� ��z�)�����1�����ލm�Z��3�6��2�u����f*-	�VH��H�e�ߛ!�Z8n~L��>���вa	�4�����le�&�:EG��xj�*.?�kډy�,.�?o��#RT#CF��֦<HM�a(���]S�*����������U*���߄B�i�-u�t��;kzU�;,�q�#b!]b�k��_�BӅ�)��P��Li^"dX]rp��'�h����'���W�ZW��h�v6�rD`[Ka�.y
�o
�q�0—�HEmm�H`BN�Öj�3Fb$�4
 ��P.�EP�~��
L�=wЗm�]��dJ�
��q���*��B"�g���mp�E�0���VT-����Z�w�ۅ�Нs��ӻ�ۧ�sوr����{��.��p�fm���Tó�����&��fZ�&
���@_��8�y�U��{�ƀZ%@�	0�UA�4s�X�R��Z���ݎ�i0����=��-�u=[u���7'/..t���b����u�>�x�k���gDc�������ȳ])�J�c�y�D���ςꂷNs�%�[�k��+��#�X]��;UEvn�f�Yl���6��E=`����r���t�`)sdWf�/�)�.1}ܺ�P����_PK/WUWbb��qpip/_vendor/pygments/style.py�Xmo�6��_A�(do��8mR致�[W4ه�Y�d.��Qt��~��"R/~�Ԧ��x�G'Rggg=�z��h!�q)w9U?�W�z�Q�b�0�/���k�,��`�R��G��L'������,vD.)�j�I�Ո�����~����X��,�EIg��퍶����/��H�I��X^�{g0�^*����z>�"�b\%!�#-[����#r{w����Mx���O��^���4�䒬����)���=??�ɷ_?���\@�yO��y�I�G�5@�"���`F�����3	���*m2Ai�}��v4�V�]��f[�j#]��ee�}d�Ս�.���-��vh�o��I��*ʽ�jI�Dߪ�610馭t��K:M�.�4�F�HӶ�+tA\10�o�.��6�2��x
I�Z�8�4!}�-MA�zD�hE�^��JC�%�~MGn0�̈6��j��;�������ljݤ�������+�����[;�vUhߘkh�U��Ҝ��C�"�i��8��ZY|)� ���k5���$�C�M�,YTGuk#��pV6[u�t�(͚�J*�S
{�^�GeIn�Y��s wk:��~�Д�!�5��)���"*)�X��=�����K偽����x-^,5��K�B(�*�83
c�+�{�T�*��j����@�g?~�H�r�H�²
��>���!8D�mg �j!�|v�2GN���Hq�&�f����
��c��=��L��jp��j�k�*a�	b(}��Q$d�er9�"	��i��<����L�a�K�� ����Џu���M^�3�J;V��,�Ǎ����Ŋ�>$���z\�s&)T�h�O�xż���Ж�@-����nl�8^GZȈ|���\m�M�,��λk�x��.�R�ꞿ��<Fdb�p�о�R���bI����<*磶o�2��~�q�Q�A
��r�
�-��fPў�w��R���Jԍ�k
�E�QU�F��yr�I��9?���'SNN�d2��1���f��S����c�x�T_�{�l���Zd�c�o���V$��v��uebqi��vo����XpĽ��H�/Y����^B��?F����UyO�Ur�s�
���,�P��A��NN}�Z�Dn8t�{ae�6R[d���'��̎M=);�J��-I7v�>��1��U���̮�a�����[ˉ�9�=����y���Nыl��b5���(�Ijł?\�Q�.(����ζ�:n��y}��]�p&Kh��7Il[Up�
�i�N#����n)���u�h����W����a�5�7t��;䬔�����(K����vb��
�j���h
'\�z��.�s��~�hn6�#�j�9��hp�j�I�Dl��z��������ݟ�DE��pH�3��ws�pȊ�*)����O>��4蛗R��eK�F�@!*s�"��D�جR����j�#�[�N��Y�4]Yy�;�rMc�N��<͋؃�G�ki�.F�EP�zb��â��9'�%����/����q�O��l��T9��Rs҄���o_����_�W�ɝ��_��W��U.�V\+K��bg\�6m�_ߍ��<�:m�'�&��kU����ٜt��}�!}��MB!Iut�PK/WUW���{(pip/_vendor/pygments/token.py�X[o�~ׯ 2tZ�0;���l�$A�vQ-�2k�D*�Q���琔,�T�R?�&���\�sQ�����PT\����n�'�$v�i��!�PsM�̉�q�
�bM�������(vfA�����Ǐ����O���~��Y5'�sr�����2ubJ��P� ��k�������lUCrn�(��3�&I��iM�+TdJ�L[��|�e
�D>�{%�S2�[��R�������i���ߐ*簃�~�u'J�
��J>
�RV�\�3��P�J�vC҆��F���P�M�H|x��R��ښ0'bM��|�Dr��!+K�ۚ7iw���T�\4�̓k2%��R�W��rp��
�;�!���Q��!�^b1f�5�)��Ǣ�҅�'�<�~�[<0��PMlmt�J�珏?S�g��àyS,y�^�ش�7�_�c�Y/������󁏭���9=�� e9�f�i��^c���s�i��Ֆ��V[Lg�R���
��J��L��r?�Վk��!�
�pd[�����B%7J�q���׃���_�X'��S?�e�3|�d������"�c'�5�0�q'=�$7:c5��er�4��~Wp�mv̐\q-��K%4�� YJ��!�xZ��v���&�����Tѣ<�B��TU)�k��Z�
(�A�I���
�vw֯�{V��Er65�nӯ�%$����m$�m��Ju�n#ylefZf�����^����=�F��8ڻ~����%o�5�FJ%�!��~m��,@�kf+�c��\4<3$�B�C���"�(+��êE�)�d��^�"����A�1I��zm�`f���)���c�i9���g�}~��ʈ��>?���Ͼ/�7���ӆe�Wh��T����VxHIi�%"ϼ��k(������^0��d��##���gPa�&!��l���"��˗/c�3�ܚ^�vSrz,�Q�����Ϥ\�w�;��O�R��ʆ���g(���2d�d���g�>�/�s]���
F{wC�<^�ӣ�j��5P�B����[�\W�#���Iin��y��	f�wV��N����S�(	e�i���W�%q�!<@&��o[rP-�&�����	�|����B@b�JW��8�%0���#5$����n,��Ad�p��-��d�����x�^���x�[�u���L}(�{�@��Y~�OL_=��I���Cb�zGA�4i[�;ȷ��g��t�z�z�б�t����b��V����M-�%��#��m�N4��z|�I�y�c��1�"�ӽ�܃ʽ�NGĥ�\z��dC�e+J#bT�rFL��z��|��Lf0?TC �O�v1&o��>��J�2^���|��SH�m�~g���l�!�QP'bZ�0�1�&�X�����әH���b�Ө4C��Y#�Θ{^b�SvЗ,
��T6���Q�7ߧG��O#�Ru���d���5�kI-��D�V�K���r�݊��D�B�%gFd�1��M�ڱh�i_û釗�B��E*/G@��٣�1���B
�S��joy���T�B�7	���$�T�8�T���'^�xd����1c~��TC���r�=}I���2Z��	�_K�b��!�6j3w!^DT����;�e|��#
�T��o�Ju�åD�^;����h�t-n�����G�Ӻ/)�Ut��tY�q�-ӻ
;)4ۍ��[hĥ��)%�F�G�?�i�Ь�����܎��ٯc��?���=����j�qX��9�����7U��Q��c`|��E3��+X���b7B/��~:�b|hMݞr�j�q��c�z�ڢ"��zl7��=�hG�U3�/`ijG�'�PK/WUW{��L��!pip/_vendor/pygments/unistring.py�k�Ǒ���X��.AWUW�h�X;���1E8D�t]I�G�׻��U���zy �E��
��]���?u�g�O~�w�ڿ/����W���٫�/�=������,��^Ի��w�~�,���.}^����T^�Ϟߥ�|�������_�*���xy�Ex�>k��5�+�'�w�e��<<���iy���?|��������l	�/Y��篾|����w_������t�/W_����g���_<{��|��?��z�����߿|��g�?���p�9c�'θ�'��𪘻�%|��ݫR������?|$����g�<U>��?>��˿���ꣿ����
����U�;�Hw?�{��1O����雽6�Y��*Q!?��l��?�Nm�4����F��~eS�~���𨝺���<��n�il��Nk=��Om����<\�r�Z"ù�+�}y�΀�t�p����)�s��Y��	��ӃB.���^�%��u1���G�G�s�
YO�)����Z$��N늧��ա�^��=\����ቝk�S{����]Ak����q�+T^̽��	����xN�C��3Z�B��1���˙(˙6�)��x21��d>V<A�4+���F	����`{΂�9��»�P2��U<~���	P�"�|qu�9���J�������မ��X��U����:
�Q�r��|�^��*��G����3��H�DC{Ej%J�Dj%R+�Z��J����G�4T�&��D�&��D\W�!�Y��F�"5e�ă�PQ�~d�ē�s#�$�'i�DFVd� Y
;TRa��R}1�I�aL|?QJ��H-F��HG���"�e�DZ2=�d{�u��~��U�+����z��DRR#�I;EJ;lTB��"��(�%I�$IIR�+��!zE�^�(O�J}$J����eʖ)H� y%oy�Y�\gr�e�˴c�����ɛ�A�<ff��������I�$�{=�"ɓ�\�S��L~�>]�/K��Vd����|l�*�0Ӗ���fz[	�<��]��%�^Py�r��*t��i���U�\�L���ƈ�{�n%�~[4����h�^�g�=���ǻ�j��<A��5J�*+A���э�ȋ��DD��DDo'��.�(�%���=w˞��=��xN<Uީ�S�xz�v����Oy{t�޻��mo� h��,xV����̻�J��3�3�B�������j	:�ر���d&���#�9x�t�;��E<d���_:��͹�S���A���7�|�'ڣ�0X؂�Cу�z�K�oZ8H�6>�@�%��4#=(Jj�L�JM���Ѵ��<ة'��6�T�m����Λ(H�
g*���d��J_�����W/1������(���j��u&r^����͔�f���L{X(��g���j{,�D�O�O�%i�S-޷G����zwu~��r��fm��,�G�������i�*?B.9(o$��=Z�]v�Wn{$hOgΛ�l}��w�w<L��[�-mw�q'ܔ����.��Wv<g�T���j� ���պo:����ʰX���;��Z[,�=�����,���3�'ç4�ɷ�g��x�j����a[����↽�z
���b?���s8X���p0A�G�4[��p23�G���L	3#�
����ݽ=�0���
��M9tZy�_���V<�+1��Bt;7{���S�f,x��^���K�x��������C	+�K��U���I���x�
����JjL־ic�7q{t�|����ڀ&�\�ᷥ=�2������eۡ��E�A�l&�����U�6��[?��C<g����LL��,1Y<�L��d��m����Ƴ���jMs����2\�O����]�:v8G�5c��oõx
\4��wΤѧ��I���i>\�1�S���V���/N3��QG�ײ-Z�>���9jnI3�4�x�S���O�S��5�>
�5M�G�~�k�k���S7}}�F>��h��Ίg85p�������C��~�<̮�s��Տ�TF�}ǒg����;g�蠁QKqhuQ��P
��Zq��9��S?~zM�Ԧ>���3\�<9��\��`��^�����E3��
�+��7�s�-�3P�*�aT��k`�9*�f��spƙ���|��'�:����95�tx��s�Ơ��-�~=�b&m��CIK��s8G��s<dy�u�Z*�v��_���U_׉��	��';\:ƚ�Wr�����I�,�
�A��mG4\~4asj�>w
��ԩ��b��sD���z��Q]V�����u�kܝ��I�9��5PK�fiu�n�7��я�s��X����ō-�U������Z��o�:g��,3P���o���z���N�͹�k�g�4��%��u%ui�xm���^��g��U9׸i`
�f-��L�mVҦE�tX4��m��Mg���4_��V��nG1w�4�)�N�V��(�qj���9��i�S_o��'��C�-���JZ�D�j��̦�k�v����׊O��4k.iWH�f���]�1��]���_�㗸�F��;ߜ����F��YY��gKgm�m���=���V��I�B?�m��:�:�y.��M]:V����dNZ���kB~��s�^�]�la�U][��-��[H�Y�
�%ʦ��[��E��c�oqsõʸ���^��p9��w���w���Mk.]Dl5+gq8�l��xhA]P����p��suu�Ĵ��G1�Yw
<N
<4P;Ms��
�W$�R6�Y]�u�W4�1\���1;m���������˪i.�����u��<\��iյ�@��}�҄bPW�4^^�ޭ�F4�`\���:~I�k�`�ʧ�9�����u^�V��ќ�3��p�/���p�R2k�k�Უ��3�s�Z�5�]�/�#�AӜ�p�]���csj�Ξ͙�k.i7��CY�,c�S�3�Zԥ�����E�ԕ�eoյ�@M���^�i�V�ت�[g�VMf�dVMf�ɔ��4�M�f��&���ڕq׏�Y]Z��~��������1NƢ��W��U�+����kੁ�j`4ÕԕեT�	�Z]7�n�q�]�
��\��:=�i��34��B�:����U7ͧNzuˣ͚S�fi+�����M�pj`�,�����Z�C�2ͩ�:롙?��yh`(�:�N�Щ�u�V�w��}��å�x=�&5�g�49�"��N����ENK�9z�k��+.�:vm5Qw��Ö'�S	W�w�Xb�
�5�n���.F]N�4���:m���*'��I �q	�	��@h��A�h�j̨�Ι�%
���%��s_�<m��Ol�WY>���;kx�>}קor�(խ��ѯd����Bw�	����+���o��[�A�X�����w�(�~?���}��s-�4@�_��~�Ҩ�z���r�o=��|���p�orX`v�4��bA0�
�
~v���������CYuJ��kQJ���=`=(+�h�A��f�I�	��'��\ �S ��]|�BI)�9P6RUQ����,J�]��<�\hQ(y�a������dl��a�,���-TJ��L��0���*��
+��я��я��я��я��я��я��я��я�qk�0��ǎ~��ǎ~��ǎ~��ǎ~��'m�MPJ�趎n�<)�S=��S�V���я�:��B��ѯ��Pw�����B�-Yz��*�� �@k,4�Bc-4�Bc-4�Bc-4�Bc-4�"���Lʹ��ZN���9���x��g8y��g8y��g8y��g8y
�)�g8y���~��w؍�� =��P�yj�3��I:`x<#���=��3�<����`c<��3�<
ぴ�?�?��f�]<�'��
z@��p
���Ӏ>��C�V�=��iEO+zZ�ӊ�V�=���`�<M�iJ_�g�yƝg�y��ʸ[w+�neܭ���q�2�V��ʸ[w+�neܭ���q�2�V��ʸ[w+�neܭ���q�2�V��
R֬}m�[@8��&��x(c�%�	hW{�w2?�mj�x�$���v(��/��
�@W�=������P��[�|��DW��8��~����?x���������������$��:���̤�*~?���¿¿�Ϊ��*+�+� r������?�%n����;�;�Tz�������R����y��~ 9�����=�Tс�@r�����*�J��M=V"��?x���$�A��k���P��g���g%ß�
U@u����_�/����
��R��S���
?`���(�����3D�N<�˺�g��x�Wuݥn�/�]<4k�AXi�z����C��(��|iTRQb@@�h��W�j,���*����j�*	ʭ��q�( #VÎu�c�ږzB�����+�FبΛ�3�:Fƥ>`]	�6�
ЎpJ;L�J�?Hd��;=���CO��d(����~X�����T
����@�6
�DU��G�#�`�R�?��u��	�?8,���Ÿ���2��?X�����g�Ao���+�_�bm�ǃ�_����(د>ӆ�ϙ�.��COh�
'�����~�L�
�
��������������!��|�������9����CO��f(�����4�/,�����/�ک���۩���۩���۩���۩���۩���۩���۩8��a��v*n��v*n��v*tl��l��	J4��S�;��S��O�c;5��`�v�t�Jw�t�*=��I������ <�#��t	��"�U医x���8O�f]����Zǁ��C�����D&%@�:��
��pيoz���gDُs��:�U/���^�rN�%I�qr�S]3:kt�O�x���f��`/��̭�64�z���q���C�CӼƙf�4��-o�?oN���-g�f-l�4o����qm���z��+���
F����\�_ߗ��p�zo��Ͼ��PW��#�{��ɩ��S]�Ԫ)�_�A��ؙ�߀�7��NE��Y�Q��H�-�w�Ѿ�Z9���|o�]p�O���;[F�9,�yhߕ��B�KE$����,#ӁeJ����&0>��^3�����W��nv�X�����$��$3�c���8��Q���3A�Ph1`SۣOX��ق�/;���>�m��B.Xf,��"p��Dì�\)��}��懳W_+tg
�y�V�Ϝ�d���)=�9��&ќא��9Α���Jm8m�/.Q����u|�����ނ����n 'k��͉�&r�3e{t�
<��8��v�a뽱�ފijs�v�?�ds�w�q�"�������,a�`G���L�t[�C�Ћ)�Cv�������,�ۣo�O#R�9����"�vr�r��7'G��
�H��H!r�t�"��Y�.1Fbw:��g�G>�q�)����$9�8E���������1B�.X�Fd�wI+����a����hDW�`\��yA�vJ�79"
R�Q����%�ȧE�4p��$E��d8
2
8=�R�؇�|��n���D��%�H��3R�(匋."�'2`q��I�]$yQ��E,�� !��?9X�'l'�</��yc�l"+EJ,���Q
�
HR�Di��=J�d@$J��%S(��IOM}�c�t{�G&�_��&�_��&Q�$�I4Z
���w����`�Iډ�A[�0��B�d
���d)@�2"����[Ebpݠ�F&��g��Y
�O�N�a.�"7���2��2�eN�;�,"�ă0����r�᠈��!�GG�|Ĕ�<�A��EL	�
����NE	?�?K`F+��"c���H����q�Yd^��� b`� ��(߯}�k�A?�br.ggy�a9Y0GdDڣ��N����Z��L�	�q<"����"�c]Ql4��'��3�7j����sr��8>t"|�8zrr��z�4�ijB��O�D��\8N�����7�V���ѣ�Y�� ��G�OG�[��F9���n��p�����V�T��g�v���
#�b�r��&P �]����Gw�p�v�����ȟ���Q��O;X�|�~�(�G �O6��3��s�S��A�JS�,�r�t��ޞ���I�)	��I �^�A2� ����2�Zo��@�U�t�Y+s_{��Al�8u[��2���_~���JBڦ"��qA�6q@���m���$Ά�uYΎ����!��� � ���E���D��Ĉ0s�a"����Yb21Yb2�˾�l�΄l��DO�N��A��Rz�н��^���������� �p}	�p����S�>�Q�7�dBh�ZE�˳C��9pqVa�g"V<VD��ڜ���E�����%Q'�~���"���'@/�9�)C#�L;}#�OI����,A���,���w���i�y��]_��u����O��xX��$�I���+�$���F�x��� �����]V����"�DZz����.������W��m�^Y#�.��=>2o�0=��s.�ڃ'�N<�x`K����S��G��N��xz�W�CjG�6��Y�h�˳���<��<�q�eQ�ED�
�{r
�ϼ�S�L�h�#��a�PE�@���.҇��UT�GDLO�3Z��V��V��C�Yr��rUN�+��UN�+���N��L��.v9a9�Q`Jw�`�������3$30|͕f`V�ʶ���Ъ��T�)7�9��T��4���/v�u-N3��u�8�u���e_�k~}�V�8��똁z�6�T��Yg>W��\�8`��SH����Ma��4f�f�6��4��a�u�KE��E��ޡWǒ�5��������pܬ�C��2�!cs�8Ҝ2��f�0��9$G��������Ӷ��Zg����)Ԧ�f���w8�5�Sՠ�!�4�Ë��Q?4OL�Bs��������&�4�͚<��%��C��T�u��:��}d��a��$昁*]eT@Ѷ���b�֎i�vd��ҡ�%mԥ��;6jtR(�4�qh�\C��M��.M��|.�19�M]����ؑ�5��N
<g��̸8S�*Bf�ȕQ�-�����pi���n.�Ҳ(��fࢮ��eJ��/����H�����ʲ�)�UX��:T�b�d�9Wu���|g
�fV��h��Bs���Jdmڏ���6PԲ鹜�o�t�,#uE�Z�=lPy���N�z����cQ�6G��'sư]ɕ��@n��
�ܨ�4~�ڞC�<MQ��P6*3e���J��YȬ�(�)g5R	¶K��������7i\[�'���І�t�y��f7r�8>^&g�Q�*�Ϯ鷑�m6��/��t��-�X�P՜����D{��k:ޢ�m���z}s�����^�v�aTM��m�\�KoiZ�T�hrvl�嚜i�t�t�1��)��h�2�T���	3��|�Y���+�Y
T���Pɮ.�)�2��R�3W)��_x}�+�W>?��&�"2e�y\5�U�j����j�*T��ݥl3�M�4A4ͩb����}��\쳦v�^�Uz�msh~
*�f=�lm�0[1��a�~��{}�c��˥�l���x\�[�5�v�o�k�<vl�W�vl���ugh�TfV�$��~�$�]r��S<��jG:5N5�Ҥ�S����7O~��M��ߴr��?Ao8Q�k�p�m���Ce�RB˙�E'���[�-��BZ���݁��;�����N�w�;����(�\�Uj�
��rf=(m��d�٬�N̢k��\,ٕ��g9��\XY��-W/�����������-�ѯ��GE\_�u
���T��-�_��ʹ����U��Q�C����X�{�\�X�
�hc��CL_p��̳(e�܆� �p>nA[4�Y����ی���q>�Fo�|+
ƞѬg[4�Y���n�5��҂� �-`+���B.���u�9J�\�[.�-wr��Y�<�-���:ۏ����_��;����;����;����;����;����;����;����;����;����;����;����;��-����,���NT�:��9�o����h=]o�ӡүm�q����5��=�"���w��^��"�f�%m�p�� �X�X2i�|ͷ�|ͷ�|ͷ�|ͷ΁�C�`�t�[8[4�	��@��3=c�3=c�3=c�S���AOu�~Pq�����f8�m�p.�<b,�Q��2ϕ����#��b�!�b唞�=ϭ�g��?�O�kiϵ�G��3�<����~���I<@��g�yd^<�>	�� ��i8�̋��<��i>O�y���|���4���<��i>O�yd]<W����~���%�HR0W���\�+Cpe���!�2W���\�+Cpe���!�2W���\�+Cpe���!�2W���5��{%�e�k�7/���h��zQ��~D�ҽp]���
?A��O�n�X�-��������EQS�~����%cq�;�������Y��=��m�����.��)���~.�
�X�n,��==v��N���疳l�4*\Õ
~n��S�w��p+;�;���D����rlQ)k�>�\[4�6
�	�	�	�I87d%��u^�:
����Ui���.�?��+\��NK�̷�J�?��ʭ$�3��?W�%ß��z�d��(i/���k�½])�W�Y^ ��ϝjA�{��=[�,4��r�[A�S#zG+��Ջ���EE����&L��`ŃX�h�k<r�\(�E<EV����ŬC2�Q�x"�,j�ūC��S��w������Q��#���b"�٨ �Q���YA� ;9��(�I
���i�FŰ�Z:uP���[9p$�!X���q�;��	�	�	?w��5�I {'�����X�)����f6E�#�~.iS�?���6%��	~�nS�?����7e�3�~.tS�?ß������-�蹣>٨�=t��[�U]�_�_�_�_�ռ��.t��������������?�<�<�<���p�I�'�'�'�'�'�'Hp.o��qݠ`�Ă�q_�\�\�\�\�\�\��vjl��vjl��vj#a��vjl��vjl��vjl��vjl��vjl��vjl��vjl��@e4
��|�.�Y���C��$D��T�H�~�*q��v�o��;��Ij�g ��?���+���w�{D[���L�L��xmE�z'��>?P�f_��w�^ҵ]�B��q��������){�
kT�d��T�5焻+N��l�kBӇ��:g�&fBQ��͢�k�fs5���LE7F5��-n^�Np�jU�΢�\��2u�]y��lNMӫ�?!��3�z���Cs<U
���_�,�8�͛�U��)�}�hxE�o���������Pp��2���9�v���O��)n^J�Z���`9"�7�m�Ա����iړ��ɏbW�	s!�SO��]�y\x^�5�g�1?pr�u�����c�`A+V6���d�ex� �CA^I��5�L���G�#;�(Z"Y��X��Š)Mb�9�(x�H^����|���n���)H�·$�G���)�+�A�����
0��]Yx~M�2e>��N2��`7��
d�Be
�%�d��9�ДA}��b�$#_]����lG�Syag�b�E"�c��D�H�a)d�
��.P��R3�ߍ�茀)9�4�Y˜ۨ��ط����8��l�Nw�4��~��\��LsI�}��i��g�
�@��v���KgL�؈3�X���-�Ƃ���MJD�7r
g1�bA&ۈTg,,/A��;��gD69�ɉ���y��6	s�~IJ��/FT�;���j8��c{����~�N�����xA�@|�&v�5*��C%�w@�9��/z�qܢ�<��1����"
�:ы�c����I�7�ƌ�Qs�k�U�8��7�C�u�
��~^��}}���W%�Qo�혢��j7��u�y���R۩6Z7o]QU�f^��y>���Iv�S���&/�~{�z㮚֚sޞ���e�����ݻW�zD��{v\�ŏ��*�\qF�:��^�ZU˗]�Nm���k����t�30�K�	�˘�^r�����y�ӪkD��mr�$٠����mX5�T�

H��T�VEߏ�+77֪�T唚S9ϑ�25��\[իĭ��lUw\�Cw\s��UA_$�k���ڣ� �+4Y�s�y3E�w0�7�$	5�&�F�hX�Ǣ=Ю!��+���U~�W~���ŃBLZ�Nɯ>b��'	i;$��C,���q,�Vm�*RT�$onvQ�.��rϲsڻ�����Vd�P'rX���í�١�xxG���>�2́<�QD��C�q�s�ŗ~c9pz��� ��&�1ܜ����E�ƓU���Y�-�tۢL����|�n�b^���l~L@��`X�C<H�����X /A�h� +��
)�� d,�x�,ڔ/F�X��|��=~�i$�IM�M�d��2�o���Qi�J,��,�ES;�!�A�b#y9j~T4%�`�k<�R��K��Y��`�&Ƶ2��R�L�2���������7hb1`�Ai.�z
�C�x�J]d���"ư���Н+��P��(!"�X�y
�ᡛx`����hTDl�X)V'�q8�6��'��a�S<"us��b���G#v��&�5���]��z���5dc�W@��G_�����9��%���}�g�]<�٣�B�f��`E�
8�F)��E�GF�X��琜��@��)2 '�'��ڃ50��	�����e�+�]�8�R?��ŭ�:�*���rW���x*s9�:oE�߲ɲ)��>�V���c�(+��Ky����,uQl#r{�qB�T�D����G4��"U��,�E�9!�$3�ΒD�
nj��"�ts�q@Q���x�S���B�Y<U$��$�H��(
J<���T9��*B3;'�\�K:�GF>��s�9"� آjĢy�c[�_�*��u �p P"?*�AP��ȅ�l�!/b��XʣJ��"����Nj$9���5�v,�=��Vp��$R�`b�mC�@��@\�� ҫ����ɥ�4H��Bd����(ȳt�[�= lQd���"�]�@ds*ڮjq�Q����+��ߧ��]�}5��"��D`�垠ZN���p��Q�Q��V�F��P�Vv�D6��l�h���Q#�ktcTG9��c�3�Ϻ�5qш
C�L����滣�ե�[�[;�wĪFk>�4�`uoqn���pn"��,���8�ќjZC�Ъb�m�&n����Y��L�s��;�h�#��i�4c�<�-Ӵ+�6�R�9ɣ-��{��T^7������%݀�i8E�������]UC�]�:�:�\5�5O�<8�E3�)�x[f�&�i�mA��A�fqӼmjZc�ڵ��l;-�>Ԑ7�>=�Ρ�cVjNEC�@�AM@�Y�p����U��
��~agBj�d��a�0�0���
Z8�=�s�����!`#��3�k����ꠛ�iC"EE`��хӇk����^�ly���bF��Y]�Y��VW��:�Z�ȧ2�L�$�&WۮO�F��-.��Ua��;1����ι�������{=j��E>��;��X5!�t�7�8��Z�s�̳w�0&���W/�9�'(86�q�!z��sSס�òVs)b֌���Zf�W�6�¡W?�9>t�a�����tպ��y�W��'���3��i����}���D��g�O�� -�Xe�ȶPb��h��`_���dGL��DL��ݘ,1X6lK>���ISD���"lv#"�nPe)
uڣ{v��=D�!G�[�ܦ�S�'������Hj�ԢH�G�@Q��h���,k�A�$Z�DpuC��!��Gf�'����#1����D�N ���(1�bw���:�*�4ȁ�Zq�)�5��kԮ�ѱޜ���_�S��r\�*.7_w��|lN
��{}}���rnSfj��>'�]K4%
�S���f�4��3p��Qu��k���-���f��4�q*gs�}~.qV�ua��y�8��?$���A�{ZX��{9�W�]7�hk;�Hf'�F͆u�к������[��-���7��M��o���
n���:E׍hىhi�n���GTc��(L��1��YN�АՆ2G>�m沱�^�&�b�%Tm�v�
Z=����gD'�A�%B���� /Ռ�g�"��`���F�]�b�S��"���~}q��ߋ��`z|q.�_��آİ�:D�
��i�ю��5~6�Ҵ��1�ضTӠ���[�L�✇}3jX�*)b�fx�)�&?�iVU��̩X��Tӓ��E-��B�jœYe��ș��W�q^.��2a���0�6�r�홶)u0�Y��e���LԲG�^��eOj�è33U�1U�Э�M�<�oα	1�U��3����c��&6]G�j�P��V��E�����֪v���ܦ�V�r8�˱��Ҷ��E
�i�Y��)il>�+�@匓sܰԹn�.i�!��O�@Fo�Ê�3+���q+2[��6���q>d���i�GV�+�Q��cg��v<�JnZ�m^�М����:�N��Ц�i+9pXW>0��`=�K }�eͻO����2�Eh?�����>_qy�p����.p��a��a��a��a�f)]�=�x����:V8��н��'`���	����F{P�֨�����Ȓ�ў��'G��r��r��rW��E/����p�ouj�Q~�,�N+����h��]\Wוc�
�����\W���t:]�N��a���
��n�%ܺ�������d�'֡�ݡ�݁Bw(yw�no��8��]:	%�����#ME�pw ����vV��gzz�g�'�Ó���ɣ��O�����ۓ��i��&����n�g�;�/��u��<T
��xj�YzX�!Y���\ȡv�=��C�M{��
�����(��6���X��=���j���n��6�ˇ%�~�ƪa�UF N�
�Vu3&T��
�c��=�� �ή��ÊlC�r��]��*٪Y.>y��eX��/��jB�	�@m~�,�KI�1���zAN��,�C<(���{�YQdQdO�uu�3D��ѿG �A��͋���=BD�'�;��;yK@��l	��hж�#[�$9F�3N�>��$6`#'`#�E��N�A�Z�nM�S�V9�-���X�*`kVU�%��;�'4���2ъvu�7=�ø���+^t��
.�H�+ѿ�����ɸ��U���y�*i���~���r`!ؖ�@o6#W(�%����M�7����VG8P�z����G��P{p��j���Ռ�g��Ewj�-HL��.bA7���J�U�V�<��# +�'U����F�xv(
�0�P�)i4HPdP��ߺU<��]�Q�Q�ʕ@��S��(T���w
FJ.�6��s3��ԩj|T�Ϻ�*Um����WS���BLе�<�2a�5��M]jB񜁪ץ�EASu3i&8H5u��i��i��GO�'��z=�W�okw]:�	�J���)�U�6��y^?�7��&:E��fR��m�5^���]�ޕ5�s�m�6-�6�FlzĿ���}�H=Ν����ܛ3ޤ.��t�<��t�A��ւ��Z�G�����ǣj�n�?na(/ڢ*Q��(�U�C95����a�5zNՔ��/6g�I[-`��ӧ�V���S$l��L�+�O�7��X��V6�:y_mPY�&ha�i��Y�
-�
��[XXر�ڱ��CYOb��$'�)NLS�l�OLS���8��BY�VY%��B�)>��c1��x9:A
�ao�	����P�Z8-��}�����ǨNŨN�G��5�թE8��Q��9��Qee�R�,6
R
���V��{�ج���mM��XP��"Q��¶�*���V��g�Pd�.�����Y��8�3��ÁF9~6�}�Y�J{0���-iۤ���G�$[����i�;�_m+N���F��A��q��q����Zw��r`����vU֫
C�a{`6�C�b}�95e� ӖŃ��Zăm�*��j��Q���J�#�݊T�x�{�R}Gb(�,����&���h�}�Q=iξ�5���y���UNj���m�{sIeo4� �j��U���1��_�K8���U���@��#�'��Q[Ш��1�QQ��(�w���$Rv�O���Â���9�-�6\z�8���BM�c.z|6�܊M��-+k���l�S�{�I��^�+��,��D�#Qp�L���%��М�p�Μ�8D
jt����,*��m}] IV#4+��*��.���)�\mIeJ��j�j6AmN�od�Վî�&{�GŪSE���7�
�[�;�_i�I��a
�kE�~�ԬU�6��"�9pm�
w:�,yd�e�2�D$�Q�6+�bC�{��^�_	]e����Y-��������*�y�
�u*�^1�(�Q\s
�u,�ܺ,����}�?�����H�q鴢��a�ԡY�?
H�:�:Ԯ4*���Y�i`��a��a��a�ԡZ�Y9$B��C?J�b�ɋ�'9p�CF���caIt��lh�uhiԋ��]<��`<�B'�C'H��l	ķ=v�Z+#������ƈԂ@`�,��9�C���;�Y/����^
�UA��GWDXW�3̑C�Nf���M��b;A(;���n�:�l��!^<�[���=6(���(-�V�F�REN��\�"�*ֶX��0(4L��i��G+���Y�E�ڕ��Ʋ�t�+��-�(�#������3�(�Yh�E�V,�G]�D�}�jM|
;��벡�(_�.W
��d?���+�����|�N�C4��B>�{80�t`�)��A��eSd�j���`�2�*��.7�z55/����p��t��,�^�a�̻G�\[�}�^��I�-�0"ݗ�i�ȧ=�U���L��<7�YUU6�Jnڡ̫�&HAQSWe�
3�u���H�)�i���<�Uf7��kdn"��2p1y�i�zے�27[�Ô<�b ��Uqa�].i�:k����f���XN�0�n�s��ʍ7i��q�g�h�jU�k��pS�j��|�2�Ï�����n�ت�3p�NU����6ǑF�
S�!VZ�ek퇨�����[���^�Nŕu8��30�|�P��ʹ���@
�c��gu��ǡ���:�[�S����cK_�Y��x����ݵ�������F��Lh�?�y�؜ʙg�u��wU�m��낾���{�To���
;�.�T���`�ͯ��6�E�W�<˟��_?{�U��7��7�`�F�u���YnXm����.	���&�"��E�V����R�{z�.�,㆝��!�}���Q
tߺ��}���!�{"H�U'5]����&�ܓD�>�o©]�G���l���X�D�.N"[4L8![��L8=(�$�D� X"�q�|�P6��n�%���8�6�c?l��\�#O_lB���h�Id��T����z�Tԅk�/@ŗ`�QT����I�?`X�dn�vA����֓�*��[��S���C�����NI߃^F���	�U�r�?�������>�Q�w�z�G4|K��md!wX)2a�^�?�n�%G'*�;�U*�a��
_��E��hϯ����_����.ټ�43��ƅ��a����AL������t]ҁCĔ��
��zO5���AR���a`�v��I,~�—�)�b���}��=!�$�C��Ό��]�����*�xY��eG�ķj.4�A#+�5�U[���T|e?f�gG잾�E���/c�����1�=��1<���o�0vO*�27vI}��$A`8���Ƀނ‡��{V��	�!=zO5
�b�]��)
*�RR��R�%_�g���&`]l�>(`*f���'�'�Y3��u�l�a�V~{,:������FET�sO�ғ��)�
��k�%�3jJ$�܊�(������o���Nj�ċNp)@���,1�BE��*JȽ�*l\`~�v��L���F9w�_����(gDcD���xb<�����{:�Z&���F<�� �zt�����g�3j!���>D��&�&C,��¯ߴ�|!��7��M��i��~�V�e����L�}�J^���J�/+ybOl�=$'M�\��MFs�0lFX|���Z�hH�o O<"<}+���߰�wIR_�D��}y�Aw��bl��\����Ļ��#��n�m�M�a�}�v�wI�.�K"m-���m;)i\�Z,ko�c����$����`Ob(B��c{�P��6���$����`��oJ�C����q�8��(����>Nl�M��{�*���� ���P߿5s|��H�kk}7����>_�5ѧ�����D����4�{P!�W;Uƫ��W��/e�O���^��1�G�R��V��cY
|HǮ�޼�ڮ����?$��]�ި���
9k��ҡ��D��썖��{�A�X?!�S���	�:g�T����{2��Ò�C�;~4����A!�{:BT�_��*���q�LT�������^�ɍ��iQ�A���������þ5�x��d���Q[rc�QՍ�Xa�zI����oL3�b��E���x��D�<,$~c�Q�j�*W��{�G���Hf�U�ȟj��A�$���C���~|���rn��|?#��Go�j+yP8��٘�;��7Pn�x��h�o��*�[S����Z�C�
4a��R�����e� �s�4 |������[�bj���gF_/��\M��Ŗ�۔��h�UX�=���5�ܚBX5p*��s�:P�Cqsi�U�Vsi�?�����sX=P
m�R#H�s���k8P[�
�l�,ۍقez5[���֖�4�����\Z��S�n�\~*j�%)�u4=d�a�M7!Ɗ�kJc.�_
�հ�������B�m|�:�|}����4���o
h|�mu�QX�wA2��x!�$"ȓM 
K�T$�6LE�u���l�!p"��N6D�*�"˜f%M��ŁW��������"�|;�)
N �"�с
l��#1?���](�I$��?'�d���
��L�V��D1�<�C�>�|��/�ˢX^�h����m;�����O�	V�<���#���b_���7�7Pk��n�ܦ�4{6 j�%Pi����g���d�Q�^�s��1h�FF^X����5���F�J���4xP͎ڧ�~@gQhY�o����2<o��]h�xM��m�0<%&
���`
�B;Ѐa;K�]1UXfi+���%��"�*2Kڮٮ�+��ba���u9@^�II:�w�u!C�	*��Ă@]��2@^��s���y�
���UD������-��Q�[oAl����/��j�|�Un@Z'�� 1|�;"���3w���bPo�ly80��5`IX�8����u1}��`�r����9v� ��w%�G��ᬒ�=�&}���l��zAEW�1����jC�����p��?:��1`P�Q�`��u���D�!��	��ۣ��'vk�R~<��_aZ�
`Zå������ƈ������ U�Ϙi�H�B昁j��A��r��U�[ �Z;�Bݘ���O��}�O���0Oy���H��@I7P$�/{0R�������
�H���+��F������>�HM� ��d�
��,�.��3
ݠ}T�=���n�9u��"�L��^�@��R�7���>��3��
^���M]�5�04We����<��EƸ�3hNd̟3\
Y�7�|�+�D�����0����A���U�V��*��N
��F���"=z���/*�9��U������_��~������(�*Cy�W�χ��|��gP��[���?A��G���~�%�գ߾��O����K��/_|q���g9�w־o�73K�K/��Ϟ��.���ջ�s��,��z���ѣ���g����>��ݏ[u����xy�wϞ���;�P����&�/_�K�y��U�����%�'јF�z����ŋ.�[��-GW#S�|����'/�z��q�,����g�^�����O�|>�"|p��E��./�P���xf3�T�͙�g����qz���?��3����O���O�o?���|鳗�_���'���\��-��{��ݥw�q��_��}?|�ey�?N����7_x3���]�En,�
z��d~��|�����p<�٫'?{���gw�{�qZ��|�<|Q>��'��O�Ϟ�ɣ�7ͳ/�|��u���E.�#�Cxk��鋗�J�e�呂�ZR��{t���*������^�Jx��'�Y�$��wW����=��現z]��޽��ꗳP=���ꗭ����]I��./{?��?���g���r��G�~��=�{�?��?y�
��[�{��?-��d��MO��{'댳���ۊ{����?��[�I�o�1or[M�o̟�ǐ������/��+����^��Ս��}�Yi�XR�y�ٳO?�Zb��z��ŧ-#��Z߻��g�]~�_m���{�$Qt����ߥ�N73ު�Պ�=�5BTBʻ_/�߾J���>�iys�Ey�H�-�:;�����b��_?n����\7��ӻ����'����?21t�/�ӯ���~��m�`�{�eI�����W}�n�Ex�>k�r�ڳ�:̳���|Ջ���_����ms�����|��V����o�o�{K��@�����aw��[ߣ�=�#���߽|��<�w�G�x�f���|-��P#y�����e�?.�ޟ|��mNk)�,<}��93m��}�&G�O�7ss�c��ݴ�`�:}��U����^�l]?���|���g��H�3��I��_={�wJU&�w��PK/WUW�6�bs
�'pip/_vendor/pygments/util.py�kw�;�b"��]$�iJ,��z�:U$[N�J2�-;xfV���o�wf_�����e��^mmm5|f��T�F���Z�o�Ӡ����eidb��Юw#9[�x<1]v�?��N���ng�9,�����`F�i�i!����/޾-�$�D�E��zwd��N�����Tl(���47��L*Ôh����X2�r)����ϊ�fB5
=�{3n&=%��#9�ʼn�wվ�f7^���,f��Hy��֜�<���WG���xs|����®x�_/[��ݸ�N�7�v�?�28H��	�3�OX��ח?��y�fw��>l�lo�g��|ؿ��oYM����������?�?�<=;=?�?:~����q�0|���~�� �u�}�ÿ/ڰ��5-���=�������w�Z�A�~��"J����/��qq��p��5;�ϥ9�Y:��I&���*�U`oy�Ő�#&S��,�j��O6���g�(N���)7�$Nnj��dG���p�����%6���Ě�|���$a�����Â�1�)	�YIM<"8H)��C�r�g�!�ҰH*%"T4�b����_�2�"�MĜ�h"r.�M���w"jD5��{'<�b��SK��X���g�Y�<���9i`�����L�� }��ߴ2a<e%
��a5�5%L�RW��om�j��O���_p���*�Y�6Zܷ!����v�;:�ۖܪ
xdsw�F�j6ʹA�;�{�=�t���OI?ط�"�ԟ��J
�Ӱ�Er��6JM�L�sU���LM��N$�&(
���7��6�0�"	��6�`�
��L5/��f����˅[\;&�(j��B$�#�U���A|�r��$NKW��zӌ�M[mn�;͙�3��<]F1G2籙@Hp��`WXm�b
}� &����d}'4��icQ�!�
]RD9��07>bW�I���*}�
�c������q���U_�����s������J�=�7�y�?��˧Ģ���bH��P�/��X#�B��k-7��X�qE$�/ƩY���܉��M�
����}�Z�P~��~�=�༷����v��@_�T�^@]m88g�aC\`����|w*\�c���`����[�ު�в6����T�D5��Wa��9`�h�A�֩�_DZ�Q0��
�/5�b��Q�I&�C>iY���w�B�����Z�(�Ս��v	fKr�#_�l�F(ݍ!6T��~�}[ʊ�g�0�$֟gO�We���NN��(�g0q���=㑠@_�V���(�IP�2$� �93�,b�"���z.���D�VB��vB�ïD��>�Ѵ��0p��~g ԏ�"bf9$A�i�ڛ�z�����ǥKl��zp��[�޵�P��b�n��D��]����Jh�"N@�k��n��b#
M��b�jG��h]�����V[��1�	c�oE�Cc��܀�F�6��F�&����٣��yk�Í��Q"�ӏ.1�����G��Z�%��@�#{�dԆ��C\��	;U�*�ݯ�\%�����vBȍS~�w���]�Vi��e�XQj
yU*�� �s�=A-L��ȡ_���ROĀ�U�2S�l����Q�@#�ݢl0�S�x$K�F��רT�v�\nƕq��
�Y>��L
?���6�֦[��h��ڭe6�'_�3�ڃ8m���R[x��߽����W��(��B�
���a�T6Xl�Z�y�����i)�%��Ej�r)0�0d˟_��M�4-Y��g(l7i����:"�$Б�	����]��5&���or
�!�|�6��� ;@Q����{���uy^�5��s}^<N��<
���L�w�ҙ/�d�q��Z�͹4��J�	X?f<3r�~͓d���p���㼈�Ÿ[�Y�qNcWl����	5^��0H[�Ct���X��S��h{�uʐ5��Ƃ+��U���Ԇ<��rgy T���*�M9a��HL��dB��gm�쪚��n�f5_�>@�=�o�(�k䴼�檵s��O����|a�m��cym���CL�S4~p�	�0�ƒ��4��ޒz ���T|�J��X��]KU�jT���N�Y��(�_g�>v#� ��2�w����|Ù�۪܀y3M؛���N�V����a�}ty���}���AZ�}|��՜`
�Xy�K�,8��)J�.���c�p�d6�wj#Ū�K�!I�w����)Y�������|i(o�j,Hf9�\��,���auA��=���w�s���Ȭ�?D /�e����<@#������pD�,_e8�-���
�2]U�~-SWp���-�M,����T���&�a�k�UA^uw:��M�B�;3���n�oXq�b���3+?*�U��eiɡ�A�d��D�c�C����)��
b��Uۢ.s�J���;�'�Fqϧ�v���� t��ĘY�ݞ��#+�j���h�yΆ�*^�s?�Kԁ�ɏ�t`;��I�Q�-��uFA�BZ��.펫����/U��M��d
�ĝH�:��N�:�ܛ�_6۲Gff��º	Q�B�==�o��~~��x*��I�v��	��'o%�X���Kx��_V�pi�Op�]���,�[��V\8��W��#�_���˂ݜҵ�X��e5���
��魭0&$'�(|=X�����%��	͖<�.u�m���TU"7���Z^����t��L��b����Nv���H=-D��K�����v���s��QW�J�v?6}��/�U��
��]3Ѧ4T$��|�T�#6�نӑHY~��I]s�LM�V"!�,4Pj/�|X��)m���',�2�	P_��6
�R��Ku�$�������b*Ɓܷ��ϠPS?
Ûx[g3��Xٹ������C����2�.I7��HF+�I�@:��7��y�w�1ze&B|K��6�n[��i`���;��	�����<i}��-ÜS�8����V�/�;_���m�"Ba?�Hh^D���yd�@���v�83�&`s��$|]N-MӸ�u�q/3��wg͓,n�����TaE���W:7����v�Y��dO�,��B�����jTѬL�VYi�3*?�͙�	�԰�m  ?���z?z:�q�W"�χ�^�
;���9R����%��B�%�#��{��W!�)��P�&��cXkNkT�@���q���B+﬌}k��a�F��@┝˿W�r]�n,3����l�<ʡ�S�oe��2�����g��i�H�	j���~y�y$�����U�@&����(b~X�v:���g8J2hI��PK/WUW��$��(pip/_vendor/pygments/filters/__init__.py�][wܸ�~���:'�[�W�c�P9���(#[�%g�؎�Fws�&ۼX�wgV�e[�f�
�왬�3�H|��
�n߾}+����r-�,Ҭ�e������>/�M&���k��i��&ʊ�C��M��i�W����\.D����=1�%��L���(z�������a4��ꕌ^��E��ݨ�2z���W�SM�&2��Q��c���ѓ�O�EQ}�2��A�[�zS�uT�[�e��6�fr�I��lUPd�E��D����n􃼹*�n�B��n�,�r7�q�ֲڈ��|UxY����f#=4[�D��<ś:ͺ�KY_fiU_`O����YQd�/×z��
P�y�(U����MR�mT�i�<�7Y�L�:Z����<�����-hy��<�L���#��i~�]N��ΐ��U�I�J�M�G/�\F�"���؜�n�6]D}�p�����ɫsS��)M��}��$�DrݐIV�
��w�����1"ܿF��[�O%C���Nf7������o
�U��V4�W���T�r�rк�i8p�RF�4���A�m�)��}]A5rn|�H+	��l��xNJ�W���߸]�@Q��l�K��ʬBj,5?7�Q+�o˞�Q����+��6�#�e)jh�bA�NG��jk]7��@��Z�!6s�c*Q�[�.K�� P\V�@��kv�O"k�R.�5�1�Ҽ����G���L�gs]E�-mP^
���ey-�d��&�m�Y�X�E������A�h���	��;�%��?�5Q���Xķ����'Z����&�j��ߓo儇���'��3��y��m�\^��	�c�OoA�C'�鎪�����j���#1�D���*�I"7�|G��TU�j�FG����([d�C�<[����X.��E��2����R(^tU��"L�o޼�Nwᗋ��g淧'o�?1�~���t�E�N_�]��V��$�f�$+���`�ؑxQ\A�%�2�hS���������v�K�./Ǖ�<�����ۂ�A���q�ڍF��G����~FP^iG���P��f�?J)#d���	T.�K9{ؤ���w��o��w3�F�=��T���-�8&�J�F�����2+c^���~g�W��;�:2y-!%C��iG_�{�q�}��!�PTM�;+&T1�ޤF��E�U�\�:iC(�"z_r�\�,�#�:("Y�j<7�v��NǦ�k�Ɔ��Bã"��U�\I�O�@t�4���b/x�wqV�K��
H�����>��Lf�i��wv!U�T\�7�t��T{:8_)�R_����뢪���� xf�m��x~�j���* {/�z����
2ݛ���@#����R�Uє���s�Z\Fs�i�:)9y�$�2�*���թ\�(��Hh�r��
Ĺp9���t���A���Ë8���<��(k4�k��迶&0z�Nd��Q�8�W�����lE
� ����,�z�ph�2s���;6�t�*
�ڀ�A��gy�-c	L��0�
H�Kl�0[���
0)E`����� �y0��i m�&H�X;���#tB̻J�~kM����%5km���]&�f��b�	/M�Z���Xk��K����>�D��CA�Q�w7 2�����7!�{@��e �����O-�ْ ��2d���ːi�ֳ�ib�\�^��? ZR���oD�>�p�@�S� L�h�4$Ü�p����UH�����>�>���l��-ג���[K�H�����Լ��)�>���L���~�%�UQ|��>u �U�Lj�TzS�����~Z��@{QD�ٸd����#0�=��F�P�Ĝ�6o"���\��Z��h��6^�����o$�V5��Hp���0fk����`�ϵ��4�T
L�.�!����H˖G
I�w�`��4�E�(� �RXdE�K�{$j�Aɗ�Ǐ�!͞��2�#�YQ������& =Е�/Y�a���f�ҁA6B��~��}F�����-�Rd�6�vY�:��� �;p��ެrO��]q���]A�~��u�VL�t�i.�������b.3��hf�|�R j���
`�Y��p�#��m���� ,-]
mfT�����-}K�꒗������s�|�]F���$�L鈌�D�w^�<��1�$~p��63>EA~dThC� W}tI��R )vl�0��|tI�D��t(X�v`p���)p�@[������ أ��ѥ'L���@1�qQh�u�7ՠi����7��"$}4��h�6�dZr@�D��(fS8$��`�f��(�wH;8��@&�������&0��qwHKˏM��E���c�
��h�U\թ'��46�L��4T&��S�-�	��P�Je6�@�֩#7�R8�q.붲{�pC�YڧS�`��ۛ�h�$@g���kām�ƥ���:w��~��gY�r)=�2�8@'sVޖ>8�+~e@G칋�5��E�L�ܚi��ԖZ�5ӂt=�9�]*t��Go��E����90�"-]8=S�]S �Q��ϗL��w��l
��*s��0�z\�ǶQ�v"I�&�	��������pA0��4_�7>�%�fHW8@($$�M:8�w�NК9��b�+)ʚ��:~؈���ZE&7�Y��C���7��oD3�\�2�z�b0Ȝ
:����E&�
w�ޜ�T7��½{��+5����=b���V˖��?�ء�@6Cý��K�L�Z�r�H 9��!{���/N'`%���Z0�zUʎY���r��k�����A8kQ%M�E`
 �����PI�6�3���
,�������ȐHj0�h�R�	
�p��rYړ�XK��l>��>��F+�,���zܟ+�c�‚��+")D�a��xQ4�_�����\�`��q�^dYP��$s�,b{�T�!�+G�B6~�C�<�������<
S���8���$��!m��am�gAƨ������$�IT��0c��CH�����?+���0c�ό��ҁ�/��.
C��
k�R9S��r�Py�̨��9���cB
�MB
�/a��
C����.MR�YB[?	C�����#;�pBml�P[!t�:^�!���0���Oa��a��,�6�ChLvdB�a�3�!df"ބ!4&C����7��R�!�_��Pi��/���/WA��3v&�6���MB��sB��;�D�J�N.1���#wr��Qڔ���%�B��;���/O��%�Py�N.1�������O��%NH���ѝ\bƨ�p'�B��ԝ\b�����AX��\b�̝\b�����C���ɝ\b��W��7%m�swr����\b�����C���ٝ\b����%�Py�N.1��/q'�B��Wwr��_��KL���̝\b��ĝ\"������C����m���\b���;���/+wr�!�I��%�P�ɝ\b����C��d��C�����%�P���%�P)��%�Pٸ�K���Gwr�!�_Jwr�!�_*wr� lN�v'�B��q'�B��;���/W��C��\��K��r�N.1���gwr�!�_�����Q���Xm.�̎:v�z{��
U��`�P%���)C��?�e�Jv#,U��e업%��8�
Jz���

Jf�1�`
Jk��9v�yB�ҵ��p�:�7A�!)W�����Xo=�*�Mw��)?�PKn��̦;6+��B-9	C�%_!�d�
ٯ16|��-j�8.���E�+�G%�i�_�~�M�,ْ�� ��I�σfI�d��Ac�/�Ö9^
��ς��,�yr�h�:>
Q��d�u�x�O{�\83<H�+�6q'�O��2�CTX�ݼj�~�[[�{X᫢�H���dr��A�-�eas}�aY�Y�
���NòP��wR; l�w̷xk�B�i�
���mތ
�d�g{8Z��q��{@�l�w�N��G�����yB?ʏ�
�.�a;�c{˷K�l!�l��0�2%��� �a���NYX
go�v�“+��۠0�Ri�{b2��
���|�nwh�:��	ܭ1:൷��4�2X���yT8�p9`#��?E��>�B�VF��Pa)\�VF�.r_���[ǯ���<6;�=��<.����p_S���q�0*z���1��<.���f�c�>øC��ݬ��>�dڿ�aeLQI|M�����Tڽ.�4�亨"߈�C"ߊyr]|����ׅ�1��"r�L7��iۇA�_&I���E�J�/ߧ1�]�}�^5�܍���b����|h}��
�q�5�0c��u�qU�4�a����EB��v���.�d0�}�J+JÌѦT�x{1v @��(�	/�֋�-��T�/�0�%�a�ߜ�dz4@��(�J�O���:*�!��H�K6�#b}F�WɬG6��}����^7K��~�)���.{��~���aC�� ���O2���gB��Ӝ[�
a˂'AY�i �g+���6�>:�`�i�9A�@ũ3L�2v��C���a�a�]�s|�¦��I^%ӣ`d���T�`�eS�{�bGp%zA<Ra��/��B;�1��O5�A~*�]�Q�EWk�YؐC�E�>���.,Q,��WL���:�/[L1�x���=�ձ~*��XL��~�~�k}z�Al�?�B�,�þ�>;�	gҏ�d.��!�h����q�a˂jK�o����ٸ�ca3�j[s�Ƙ��N�a�ج�V�&$�3u�B O��o�D�Pa�(�s7C���*4e�7�a��ʝt0�-
�N:���D���7f��LW��U�B��ә��s��������{d���-1�bg!;`!.�^I�X��Bv�B\��$�
uds΂¼�pLv�.�><pc�#��	�=�c�e������q�*9�������DQ��˒���^�}
��`�ҝ�0H�������x{��c�x{��0�*Y���3vCܝ�0�d6�Ч0���{s�o�}��9�	��Ӵ�=�a�
;�!֧1�da�1��%��h�lOd̔�,\�{$�e�W7��c�7��/"�]PL���>1�VEۓ<T�r�u��s������^ɏ����~��j��H�8�_@L������'��L��
�B���FV�3�ThS�-�]�7gZxm�F��I6�Fu���1~�Eܝj1���9��'ۏ,�"s��QvqH��|<y��Vy����5NG�Y^���0�t��)6�Q�M���O4E�Ծh	J��4���0��0O!RV��d�>?��4�f�BVM�e��D�&��i�����C�1X.�2�h��m�,6NC�̿��
�m����K�u��מ!d�l} .[��/��w��]Fe��Q����B\T���>��PT������-_^��F���ߜz�n�޺�{�~�u�qT���8�����{$���m/Җ����)���?vH��)��W^��+����	qѷ���૯8l��~$*���)�����J�	`���f���MZ�[��]����j�&+]�Z��-�U
���[���Q=���&"W����r���n1�6}	)Yw9��w���0s��'�:s_j��%��M&�M:���Z��i��ި��Ƅ+�u���o4�n-�i��՟��n:�*���T�-�qE��\�p卜��Py�)@\�ӧ�/�ܮwS4������+��[Nۛ��oΨ����8��XDyQBr�a�X���m��Nd���J�����t��!�cE�5�'�B}�Ԛ�V����Ɍ%��<���hQ�Y�-O���ЬVAMVQ=�=mr=�� o�*PO���FRM)�
�n�F���m����gss�����ZM��Ef��CF^Ĵ0���|�%�͆?}Cs����/�O��"�lSɅʐ�ya_�<�jMqp���P�Y�v z�*U/E�Z��Z�����2�>{�k�IҨ�㕟lծÚ����}|�UImD�rpҮgԮz�z<p�.f�V]����m�	�ǣ틑u������^eT�Q�e]\n�����5�j�t�o�w:�(��s���f3݅2\��ߓ�,Jm��'��A�V�
�ߖ{%�J��}�X�˩�eW��YY�V�.�,!A�t)U�i�@d��4'�5��F�Q�׈�a�Rq�|���77K}��Ĵs5��7���\�þ7��op�^�2�&��zn���7��$�1�ƌw���2��HE7]��L�%�r���u|T=V�֌�m�}�6û5%�CH�>�1�iP�8��^�v���
F�~��:Ґ��~\���E��V�,�?�Rp��HB��Z� �����z0�������6r=��q��=��'���Vt���o+n��vĵ���=�^�*���)7�+L�
hO���
�[��U�UU��/���~ܘ���ڞ�<~|�$z|v�3�uG��U��"T��~�ڬq�SUC7*�*�*I_ĮC~�ͫS�n4kj+Wj�j'�5����鴭�2zu��߿<;yqq�����;���g��?�>�xxqr�"z���;$����%N�(jyd�f���?h��*��0��v��=f�$�?�� �]%����D�4��V�EK�0ShE�#G��$���jdk�Q�Q%1�p�M��˞׎ѝ]]��Z��Ey��r��1L�&M�f��C����,:G��M���4^��>zu�ct~�셳�]V|UYY0��R��J��$C�Lֺ�I
Z��aj�s�v�!2{v�W�]��%T�6��n����X���^4��Q�r"��5Ӫl����òT+ ��g�7G�\�$��.^5��v{����xd���(���Nh�4��.���Dg�j���G;��nx%)�aTۉ�kA8�v˫Z�Tcݙ��6����D���>��n�Ak�PPſ �uA)M�S'�w4�#N���(d�Ҿ�ܷF"&熗��
E�;�F�o�qG��>��S���mW��z���<����T�H�F�
�+���d�cP�!̙>���m�Rz�FV9��c�U�]m�
yL�օs�p)��J�r�N6H39.Gﶉ\��dlc���_U**:rN�ѼS������ӊ�J�̮�V�4�$�W�i��潩��ʗf��Ǥ���XG��&/�P>�u�&ٍ���3��m3y��Z��4��Lp���]ۖȰ�J�L[m�`�I�j=)'��ݭe����I+��K,w\5��LΨ�Y�;„��G��y��aɳb��Xļ�ľhJ��u:b�r,E�&�R��J�v�C����bcR438�Ns��QzV,����FW�s7��&����A+۩��Bgrh�B�e ��k�U�H!��s3빆��LL������G5�*-�
��l�:4�ig�:Mq�E��*�X�'یE���L�
v�ʌ�P�c�m�kC��n��xԓ(֩��A�	r��[U��=P�0b��Ue��o;��#]�1����}q����F��QKu�/
4��^�u��t����	te�s��v��:�~u�G��ĪL}�Wm���di����.�v�}�:��m�,|�Ju:���j]kĎ�n�J�����&��-��"�H�}�vm�?���K��1=}�\�ˡX��Ujr��IS��O�.z���oh�ߊ���ʫ�1��#������nv��%{�5���_�;��x���~w����@��� T�Hc%�kS�U��( ��sw��ӓӋ'�η�9�TW�e���Z���4�br�Q�����u)��B[p�X�V�Z�l��O�AM���+m�~��V=0��7Q��~p6Җ��V�ۖ��ޖk���+;��2?�_PK/WUW7 v]�0+pip/_vendor/pygments/formatters/__init__.py�X_o�6��8�,w��e��!�l@�I�=EKTBT�4�Jk�g�II���)0`�����x�����3��:<�2:��zύ���?3��g��!v;봬�|x4k�l_������N�~��̣���+�B���_>���NL!S��Xû����_/�n��HȄ�3�x���Wem��>��*��*�>���C�㊛G�{;���{1s���b�$TV��yb��U%�C�~������ۻ���y��eɥʘ[b��go�,Z�˂k}S��Q�l�/
��6�azylw`t��
F��rY�k��KH�z���(y�V�b�A!��z#,Q��4�)�����
����kpVY*��f�L�rŬDŽ�r�����-�VUt��0M���@D�V���B�H/+}^�s��u<����
�4��*��L��(6ļ��Z�i��P|���+]p#"���V;��R#�#�S���HC��h_fM!��{c�G"�}�B�.�d=M�&:f0e��̃ktg��Xx�
nJ��Yx .��"�=�C� �=aoݴ�x
Bik:b5��m7��yc"!'໷�1��#�p�R���)j-��C����y�F;I�]���WFy�A�ItZ�� �ci�}��O�hD���&�m~�v��~��1,�鶷�A�";��?e۩�й�*��I�,_p�)��:�g�����`�|a���&��Q�9%����)>����J"���kln��s�L��_�I��A:�nC���7/��Jx
���c��sTE"f�W�mYY������c�S�p�
(�xl���$�nE&��wv�xD+=!E�q-�W�֗�1C��� �H�ĕx�@a��0�Ӳ�û�RX�/�:��xPT�����R�׌t�@��e��w\�u�zѡ�w��p�M4�bϴH�8<��p��ޟQ�+���
y�� ����Ѧ�w���Ly��@e�z�^U�O2�{��c�D�Z���$iS��*�d-RL��S�	*�hF��=�<i��I$U��)ښ,�$\2I���ڈ7�Y����>j����l0��<��)�E�->��U
��D��/A5c��
�RR��Fbޡ���u���I"p1Z&	���d�w~+��5����z�����.��<T��+P��d���}�^�Y|6@��=�����$�ʠ�ejА����r��xjϲ+XLӅ�K�AXw��ض��NY	�|Q�K�0·ِ�Gy\�E�Ց�e�;���I8�Z|��բ��I��-)�#G�z"A,0A zd'�+�J;�89*J�'h���ke3j�F�nB���.(cI���!�&b���1<��I4Hi�]��|��"��?�/��E���\��Y;A�
��I����u�ؠ�)F���m�ߺՎT�,��,g'����r�����;0���h��+W�]�]j�S������׎����ǰqd}�״�v�iM%�Y��]�w���n�3�r��A�M���X����[����"���s1�\��%p
��]0�`�.=�����{|�ꂈ©�j��N���~�"Z;�3?���E�;���:
��!��!:�σ�:���җ���~���BCC�d���r�a���lV����:v��fkcۙ��������onjQ��X�T}WqB���lR8Ju��=��?�����D9ݻ���/PK/WUW���� P+pip/_vendor/pygments/formatters/_mapping.py�W�n�6}�Wv�-�.Zt��7 �Ջ�`�<�(���H$KRI���ޙ�$�I'] h��͐�g跰_S��2Q�
,��N�CڀϜ�����+aUJ?��x�-^����������?��5$��{	�}J� E>��9����/G�9����&���c�C�n�=�l���~\t�~��ڍ�:��֓i:z�3�?�kA0�R{�Ua�	�1,V�Kh�Uz	<�I�}$]	�@Z��DH�p��o�15dB�J-W%��q��v��u�^xH%�#��;)���N�hK���J,�A^UK"��紲�:��TT�����$ip�$"��A�>P8S�x�8�<1��
���2!>S��A%������y-r��S;Q�˩-U�Ըmu�5������q�(�sY���:�}o��O�*{����@��"8�Wi�c�>4��i���0WhEHN�g2N��w_�G@�l����$��[�Nb��k�@.Q�a���"nx(Rg���wJ��u�u�ë�eY���LruӚ�nZ#Y�*@�
�&`lPF��k�vy8��!+��|aS<U�n�w�=��o:����g��H�e��'?�G��5�!}h/�(q�8���Pc����ݼ1W'�~c>����6r�-6�g�S�>]�>�3���Ω$3�p&�7��OQӒ♇�7���\��y$�Bg͍KN	�U��GX����E�k�X̶c6T��B�0�l7b4�q�7M��:ؚ���:&�����'*��r��t�f�\���n�fɸbc�¾pލч&�����н�x8Q �N�+uN���_N�g�vAK�@Pti�g�N�ręVR�|����0az�BP�"I�č�pfS�Ũ�>ϨX.pM�-�#����]�!"��(r��� 6����c�Wn�:>�8+ƌ�t�'^Ѭ]^tCZuQ��J�Bf�y۰��%��)���o��;{��S��e~��.�����΢���?rL'X��]�9��w����Q
yg�S��(�p$��JK0�$r
�kEEP����n�\��Ir��i i����4���W(MB�t��]�=��Jc�Ty-�>��r�?�U�h�퇏��k�L�CJ'��7�lG�<QD�/��Ut�C"Z|8�"�Q�z7�Fx"g�8C�A�9%����*��hyK����XTH�ƭqפ�s�e�P��8�pC��x_.��^���a�j�[���W�P曏�@�vD͗˄��CˇL�g��u>���u����8w�:E�%�Fb���;�PK/WUW�|{�)pip/_vendor/pygments/formatters/bbcode.py�U�n�F}�W��6\���	�H��}RrI����]���+�wf��Y7Ջ�ݙsf�\���j�+�Bjgí�
ᜬl�$��$_�s�7�ՊL�s��Ej�C�v{����non��p{s�$p{	�xrpRs�R���~������U*��X��������O��tB�6�\a2�ɶ2���'�3S�ǹ�*JS9��\p���[��tQbL��M&Q$�<�`	�`��C:�`�����^�L��ق���h��GL���{Um{i;u�����$�Vf�c!�q�:�%AbD�Y���Ԑ

{�?��I�7u�J��9C"���|i,3*G������^پܰ�[��U%��2��0��T.~&�ʰ����h����(�n�ɉS��p����I�:YX��pB�/W�dF���H�*X��+�N($7c�e���l�@Ȼ����#l1�E�����ݛg�8
���-EJU���{�����+Ie�L�'!�ɕ�����3V��&@ۂa*��%v�t���%�da�d��e��D�q�Bi*K'�Ec[w�e��M�%��Bz�9�Db~�U��
�g['�L3�u�N�,��'&Qž��G�&\U#YYs��}*�7q܈��p��"ۊ�J$�<��g�D�aTN<�22m?'/��u��p4�Z`/��\	�u�=���`��K�{C���`�$�<EJ+ES+��޽�U���w�&<k���Eq��Ѣ�zS�ɗ�Lٽt&U�;����cw�,J�_�G5���@��9Y2��%VS�-�iOқ1��+��{�*�.Ֆ���`3v��ߣ�m�o��Mo�~Gn�m}���Ns'&�^�N6�y��2�r؁�+���L�o��r��+�%��$Ǜ�9������z�M�}�7�[g��ݜi��k�uTk��&�3ռ���iG��:Rm#6���ϕrr4-���]v�[vۉ@:s\��	�����r�ӯF�ɩB�Z�+�g8� zH7�6{\���7X�>co��B<�i3���GW̱{��;�����:���x�O�!�0JO��32�l6;�ǩ4��b�ag�L����O_^Sc�������<�k�����]#ȿPK/WUWqH`�(pip/_vendor/pygments/formatters/groff.py�X]o�6}��`=�Ws���@��[���{�
��(��L	�4�߾{IJ"-�	����9���d���S��L�*L��@�de��<M��g���7h�`$�eQ�P,⼸/�n/����ų��Od{O䞑?�D2z���1��/����&�4���؂��y���p����;�8a��
'Spj�E^J��'i�H��0�e"�˰�.1�/'@��Y#�c2��y兜�7.$�L&QD�,��Yz�`PZno=�L�Vq'�v,��S����+��q�7qfUL!�I��b�0��$q�AH�H 4B�J�g�d#�-��&	Kr^\��I�%�d|�AEh�B����(�����>�	u�f$��l���bG�r�D�z����:���g���7o�	���C.�1K:�RH=ƂȲ}��v��g�[�N�E�q�8�[��R&�Q�6�2�Yesޕ����7�U�A��`1O9��H�b�J�G��n3��-��V<WJ�
QAj�Su�O4��X���̓�W���X�3�h%��l��DP�\F�_�,���OMI]��z
G�'�0΄]FA��z|����f�$#p9L��	���c����ܝ��R��-N���O��SjY����{�9Я,��>���=��V�K��3Zb�W�ty�y��2q��_--x�gI�|����(n�‚@l�R����Dž��5I��^赨�s&A#◞jk�څv�se�ayV��g.�1�P���}X)�N�o�v�^G��-�Ulw�
�G7p-j<t����
`
�J�Lw%`EJUe���)Yկ���I?p
,z�����\�O�`��h]!쎾�
���[,j��K|
\>�	�.���q6=:�q�ے�O+�9�A��5%��AN/&�vLϪ3�<!SȵH�ܺ=o��GV�BM�ph�}qG�+�8�x((|��I�
�޺�4z�^�� ؝ړU��ZU�(|�s7�7�9+���g��Y����؁�`�:����.�K��Sd���Q�4�Cz|ͥ�
?*��(فr��R�;��;.�N���M�T+럵��.}K���V��dY��V�t���
�}�2As[�+6F��yKf�.ECa��>eGxTkZ�dߤU�
J�',Y��C��
�]����k/ɪe�� B@M�_<��:�/��t����w���`5���8}��|\e(����P �fӼ�L�y��WZl)>�$�F\�v�Y�P�c2����Opr��.
���ɡ죽&nX�`�2;���tۊ�Ҩ��):u���2f����P�N��$ҕ0'J��X����b`59�R_�u���YͰ&,\ƻ=�[$�����ϫ~Yh�+����y�H93�����=����s�ZekX���;H߂&@��0�q�1��	X�a��r2ȩ�d�	��Ü��4�ӝN�Gj��B�u�sT+^�w΅��"��o0��ߛ�I��p�����"ZrX��J��SU}c_������>�=^���^�0��PK/WUW�i%J&�'pip/_vendor/pygments/formatters/html.py�=ks�ȑ�+f�R���d�Ȓ.�-��e��Z+�KyUE� ��i���׏y�AQ�Mr�I�E`������3���a)�̋rյ,�ɢ^f��z>z�Z��W|}��oE��W�z��/�b�-ӇE}!^�?���W���_��V�)�W�ZF˱��/�t��w?��0�,�e^�����߼�y��Md�Y5aF�t�*�Z��y\EV�����:'��^�e�i!��u���|7��t5�~�yR��6�t'C�����u�[�2��c=oo_�y��W�ۿ|�v�u�fƒ��3��X�����}�r{A�T�:z��c,W����ݔeQr#z+�ě"���te�t
��__�ywx+�8Z�)r̴�f����LQ&a�`t!�_D���`l_���^���鐟�m]xχ���|�[|��I�\8��5����j#:�����+񋱸�kUb#����`JQ���X��
Y�����^���!'u�U�2�j9K��0.��T��sA_'U�u�I�E�Q#�dǻQ��ΨԎ��:8�3ՈQ�"�gQU��<ϣ%.�ϓ袚iԩak4zJ#(��f�zZ{�Φ�1�J�;>���#?��ѿ �%H�y��.��`������|{3����߾��!ă'G����3A�e��墮W��ɉ΢|8���&�oY�%b�'�I��8���Uwt28�z�IX�jT
���w/�_߼xu���x�D��?������ɟ�|yr����_NN�NNn�/q^0��f3�|I�������ד�N������m��3���Qr
s���:�ׇ!�;�.O��ZBG��˿��Wø�k@�9f(Է�!�6QṈQY��0�y\$�$FՐ�њ�:����Nkq�3\%�vB���rV$[����
�+=���ۛ޼���kV��G�,�߃�fWC"W����E)�W��(=Oq�a��O���ᄏu$�Du9�YS�)M�����h�M�d�+�*L|qY�����^�ŝ��o����:C������H� 
�zsa�U)U�H�Jf`c�h���M��j"�ٺ&�A�y�M��i���Ӻ�7�SP!�
�j�b&�{��(K�4��}3�װX2/�[���aHvqx��SI+6I�b'�<�Δ�4�<-�������5e�![]o
�d��W�
i�9p
�؉|����K]:��I���Gp`2�V�m2U�.c�
..H��!��hW�h���P\���e]�g�4ѽ倍�AAd@�G���x#C��B9��� �z��o��U��m2!Ay=��H�j�E[���|?�!�Hp��yx큠�:��_��CwF'u�3C$\H����}P�(%޻7���z^�e8�J�-R ��V���u�V^�x�NP:x�C�>pWQ,�e�Gk�!���q˴ގ�X�莋bN�gj%�t����4��/�)52�`��{�܊]!b���(skEO'ggz�?#o�:�4�1�R\ c�R뤤��K�s8��,�F=L�[9X�Ty�ɶL+&0ͤ�*	��	�4x�ؽRܮ�xH!���/ f�G
ɭ�"����#���-|�1P'b�uEC���"`!J�'��c��>`�`��3��)�b��œ9�"���(a�P���\��1�>�ͤ�EA��16E�~Bږa����ȏ���X��dD�����+@�4"�̊��e�|΁[nҊV�u^�KI�h�B�RF�:Q�%�������0*�@"�J������W>t��J�2�[�?�r�0�JM\Z["Ւ(;b�!`�Lx�kQQ�Df�	�
�OB��^D���Q���ܕ�:�0��@+�X��
"��&�����YV`����,+6z�
p��&�6B��P�s���Fr�dVd�s�.����ק��sG�x	]u����i7�X{�^D���B�D�!�15@*GYUԒ����`��+�h�x̮
RYN�F%�y:.�L)v��ӏ��C%�K(��A���'��#��E��'����7�1��5*��(��޳�`�`�lc�����	8^v�s�_X�`�+c�G&j���3}�?�_v[�%:eI�5
��g��k8�6|/�u�8���	�
ԙh5d'TO�P9��5��
�)��8_[ �je#1��Cc�@�O�ın���JM��Z�]����KYQT�@0�a��Q-���Gʎ/,*�c�30��CcxY���b�:�5o�I����n�80�zF��:)+��t^9��.��g��dM��!��iӀ��%��B�|�뤹��t�A�TæJ�vq�";eSQ�A:}�x���>��E̋�l����#�4��i**��/AG,�dU\M%��{��V��%9c�����}�<.e��O1n��]��ȸ�e��6���#	OV��:oi#���ň9�a9 ����/q�<ļ[�.��t����XJ���M��or�@b��1!�Hg}d��r.<P��D��Mձ�/�6*e��,����4|S�J$k����E��S�j�<ۦ͐\�Xh�F�*Φw��m<vt������U�,��qph�6�>[ϔwHN�� �E�ع��o�`�`����<��0���?iN���.8r;"�XŜS��֕;�?e��Z'���`d�����V,���`a&?�^=i�\�l�?p/G��o]���|��s,n4�͑ҹ��u8E�%\�<8z�9�`0��=�x=~�FI!YrH�c�hV�ڱ���M���Ms%��=�UM�9_�]V�h5��2�&)c@�9�k )1H�@ooax-�š�0p�8b*%̖*
���^��+��@�O0�M��1��l�T֯R�y��T�������I� ��P���ag�k��=&a��AH�?��Z#��0gͲ:���f:Үt�����C��7g�k�HF�	��&	���T>OhK�Pd�=�u9������23�m� �!a#�599l��ܖ���֬���9���m���٫0�Λ�,�k��[+*��	Y6E��d,1�N��k��J�r���(�7G�zM[�K��t�fi��:�M,�2K1n���[�:�lmQW[��!H�����"�VQY��ܨ�
���]�p� ���1��DZc�$f ���V�9����m�8:�y
;Ty��X.e���Z�%�R�d�iqPc�MLR�@p�a-(\�����17W���@[��*���>�p�1��e����*K��9�A�}�y%KX���ڛ2���(�� ,U�����1�&�i�S��i$B�8�LV�"�(�hk��i9��HH�۞�R�*8q[�"�pz(g�O�-�p߭����X�e�8h��C:
Ov鑆��kq
4o��0��qDŽy�JT"I4�D�=
�t������YUJ.��P
1D�v�y�L3/fQ������~ܿ�܄��ʂq� ��r�TȻ$"Z��Lc�eRXV<�R֧^�lK�1`�;�p�/L�R�n!��)�C.�ɚ)�F�"�>��YW�_/J�	��m� m�Fb��OE����
�q�ΡjQڋ,�\�gߓD�Ro�j���
�y�<Lh�S�!x9+��[02���T���tR����qX�@�1Uƌ���(:8
�1.4��FƮ˂;��l2�T��Hd~Δ��������II�П�VKys2��8�{Ǡ��5�5{4�s�b6�_G
A;ntx��1iY2�~H#���CT�e���A�T���DIÌ��yVft]���?U~ު�G�
oZs�M&Q�au��:��x��LG��Z�HTѱ����U~zr�C�uK���'4��&r*v߭��
A�u�1�Y���:K��	�s�Q5y�����m~�Ҍ�Q�r>]���I>���o*���
�*�M_9��+O|xk�Tm.��a������3�{�F��di� �:�=��	gY�w"(4O��0�V�؇wA�U�;�mv^�\���ke#d�#ᣪR0��2��p��s������׺ă4��AL�V~��w��D�(>8K�?�@�p�e��Rj?c�kT��te~�>&��_�0:����>�0L�l�0��2�Κ'��j��{�^3fI�S�zbә�1)��x:�GGo�n���9M���ё�A�̷�N�Gm�=HyC5��3�%���h��� _�2��FH"��v�y4g�}�J��l>�r�U�3���V2F�`�Me�T�'Z�U�X�Ĉ�Mt9\?Ú�<A~��NEKCQ����xaJ4�F�'�~u�_��$���E�3`�d�MLy���,����`��j��KJ���"�t��_�h	�c��S��R,��H�
f�M�L�[bʋ�\7�^R¸, �޺i�ʃ�$y�Hq�ʪNK=����]Xa��@����1=xb�9�&b?�����y��P���@��
+�*s+�`X���S��O1O�J�h<��*�W�Ȍ�7Z��E���<�ti�H7ur�VK�8�a���6~�F�u�M�Kf�^��G��R��,`/�_x�}]����{���X
0G��INaR��1S$�ZL�����c�m��: �`p�i	Z-�6� ̨L
~�n�X�w�?���d�r��{���� QY=;	Dr�N�����8��ڝ#'�H��Դ5�\Lftk�d�,�=4���ŵ�?�m�e�¨���Z�N!r?���/a*e@�fC�*V1�`m
����U�*��bZ�|,�S�~RD@��t���׵��Nt�	��G(
/[���ጇwP�wla���/��V��_x�WO�Y�NO)��6�7�mlڒ4q�ĕ���=��RœCۢы
ts=�j�1V��{��NZ�u�َ��Ig��~t�$p^!�fO�u�7e�j���^�
R�4�	�[3v
XfCs/X�u',�ߵ/V�������{ݼ�=�c�pӍ;�s��}���M��4ݸ�v��[�	㈩�iBOT9��>��Z!K����vd�������3x����wj�gn�k�W3��C���у�o�l����ƭ�	�W43�Wl4�C]�;	�J{^L}����������lB�P��a���s���l�hca��,lf��]��/�(����]ɝX��^�
��fU�fu��i�8k���:��\��;���괭ǜ͉*̶�K/����%���
r�]�ի.�e�ȝ�⋮^^��^����DR��y,�ޤ{��A����θ9��S�k�_��8#_��&�Ꮃs|�`-�����k9��*��q�p`�Ա\���ù���u�XՋ��U�N�_'6���:x�Ш\��5���o�9.�!�ާ�G�C>sz���� r?��g
#�>Ĉ3��� q�3�\'�8���]���O�
:ܝ���}AD:�ɆB��^$M{��<�D�^�~�刍�ؖp�K�p�~�z�x�FJpdj�(�thS����D�:�9�1��+jv�UܞWE�DHc�#
�j���wr#~�X���O�h�<��P�����a�X�P_c�uu���aw���A4�-����$ܾ�*'oi'D<C|��xI��a��B�=�ASk�w���%p��dž�6�l�QTE�&=C)P��:X? ���+��@TX���V�=�:A���R(*��X����x�a�e�UTnIZH�GUQ�Κ}�>�
���C$�„w��wc-l9�7j�Y=�8�J��4+Ui�w:RW�h��*�d�O�.=uf"ڏCp�3����}�*��ݢ�`G��NH���a��)1	���n�f�%ùJܰFޜW�>ګ����q�=�s�����.�=���H���X��^0)!��c~J4�F���4�����=Ƕ�����p0���X�IZ�e�L�S#���*J���0�/8��'�(�89��NP���0�HM��W���w_]ܵ��O
��� �\Y��_�n��VS��=LI5�Lqg8�
"���F�U�6��$	`@+��e;��7-uT�Ï���{x�a&Ƿ�0 �B���	����{wz�cyfM�­���S�G�y�X�3���"ӱ!������F/�1��K�}& �X��&��]d���lb��w(��#�x�����Kxƀ�~�:1�`�re����80���W�hz��G����R@��0Z�Y
%ԝ����	�4�H �$x��3P4�1pZQ�3�%*1ԩ��2�1q�kE���S���h7����[\x�V!��,~������+'T:��r5��2�B�-�_���2<�/Y�7Ie����'ȏ��m�h��)p�[9O�σ^`��tb��b��$�Ǚ�Ð�Z}���Ō���F#E��Tjt����p�]q��2s���=�ͽct�gY|e�H2�㶭e��R�����1�C�K�xx�[�>d�D�5����9*�5�zx�r�[sQ�tN�.�w�/�j�LW<ؓ�f�����QQ���m=����1~�j������У0]�ܘ��$�Թ���ɮ*�N
�T�n{����)�o���u����l�SJ/iJ�%IK|�v�q�=oe[�U��G��4t�%� �x�H�Dֲ\R�n0":޹
p5�
�̒b�-�����{����<�����xԉ,�T�'o�Vgt:Dl��CO+<9�Ρ����\��l��T/5W
�R',i�ݽL�~Gu!��p3���� Bǿ��x�/
1�~%��-�����\�\��Ͻ�F�;���{K̈(�z�q���֥�F ���՗�(�r۶�6ʫ_|fʭžK!����q�w ^٪��2�V��eƝ�"���Ұ�Y���3N�,�ՎE�is2�x
|�4������f�i.��^9B��t]�^.�ʰ�]��j�g��:��mv�RcsT���m�f]
뙻��DCI�:�7eZq9���r����,\�Q�ӱ�'�j@a���V5G�+�7���u�&�&��広�Im��3�:�xlw��:��e�?����0�gj�
W�L��$Ő�F�~�5�.�j��x�Z��us�-؎�f(��QBn�r��6N�fy�"� .#u-�au|���˓�:k2�
R�J���a���{ZS��4].���i,��jxX
���|'�O�ނ�
�R�_��mWg�����{��;�pV�tR�Ae�ZC��t�x�)��w���9�#�(��]�m1:�nz�t'������T��@�9n	�^Ѻ�a"��x���˴v���hI�k�ci̦5��v���t��~�v�1��d/�t��jx>�˦�;"���%�i�ӹ��ϰ��W��I����Ro1@ٙ�6���
ur��@0�Χ�	��X:c ��Bݜ�a:�w"��1����i�_���|��\���<�Ws�>�y��"���U<��^���-޵��[ge𵾚�����g�7���.�3?)�Kغ�ڽR��x��/�Z(�N��l[��:	B�`������"���I���p��
MLv�?s$�k$�W@�-�ͧ�>N���.��p��IiM��q?`��] ��A����w��}�����!��"��N�)��j�3y0���w��d~/C�'�\g����8V��¢�eEw�`�Xs�5����=�g�5�Ev
E�(�5\u�׮�guŵ8����=���L�d\q]ʑ9MiUs��Dm�G�i;��.9d���C"wzk�l��##�	�#�����jX��(���c��o-Ԯ�>;|�!�}Vз�j�;$#o�R�)�O�w���>�(���=�lB�2��h���Fĭ*h$���������v<򶀵?�E4;���ZT	��|���:%�Eg7��`ޯ�j�5S�E�䑨wزr�B�}�]98�B ��p���4s0�1Қ���1�����i�\�j�/Zg��5�	���uu|g
Bҷi�Ex/�
a.��&��Τk �|ȋ��'��
/ȱ>.�x5<��n"��[4,�Ob&
ƚ��o�R�1�sOV����$+��8�2\F�~髳�ӑ��4�/[�z6���!R��3(�U��e���9��rÙ�j��*�����{��q%��w��:�@W�7Ի��'��Sg2�%�|���|�^U�������
�de����az�$���.�SY�E�����P8��<�8Z�9.�.��]"�q�)Vð�8����}3��]�۞�W}�;п]��,��.ת�}����v����l*S����O�t�p0Pv�26r���V�c�B���B2��X4N�{k�Py�<%3I����E��bў�[W��<=��L�1v�s����HW�4u(k�V�hD�nܡr{�R:4y�����n��A�l��LY��4��c	l�n�`��ثPQ[����v~�c�~�S=�99鮨���}�*���x�u�9���?��\�Yt�|5�;?^��;!P����G�h�� f��;|���i�
�f�n��[���+��g���C�7���fS�x���sb+�%���ջڙ2�O����$~o!�K�WP���)z�D�4t��u�|x���FB�ǫlI�PMb����/�B�*	�����a�j��Na�	}���S���"ul�"��'�T9Q���*�͌p=�ہ��ҝ���m���
s����#t	�DZ�[	�!��t=~L=W�P(f7�D��-���?��h����~#���IA(��Ҏ�Ȯ�5뙬^�&����G�=?���t�
4�W+77��Q3,/�mk�}��<=�nc�;!���p�[s��m�p��v���@�(R'�K�d8�{%:��S�wt!Lp7�_�7d3�]��
&������챤�a_;?Gi��s��/�j���s�sUT��,�>��(.Z��$t7,��=���1��Flz�FI�Z��$�\�.0잳Z��#_b�GCl�J�*��(�iZLgЃ�䟙��.�㟱D�Q����.�+k�?=G��P:��x����*�1|�`��Ȍ5K;7z|�=l��,����n/�#�2�B���=�e��v��-R���fJ#�1����ѽ������������y����h�4Id��ʬ�ԤZ�O�D��"�h�h�b�߶��m��Ru�g�ٕ�X�h����:��.ȭW"��������b���}�s�d��&����R�^ �j��U7'��7z���c'w,�����-�F&щ�;T����Jv�*�W��I4��ڟ��`�yuj���~�C1��1_�{^Г[��
i�9����_K�W�!*vc���E�>��T�J������)(<�a��Z�t.V��\���M�7�B5���L��ԑn��k�!�`t�4�=��e85c��ur����m/%��$7���~�We�)�Ȏk��M�̽h�U�_'ŸepJ��wM]�ȸ�7F8�6���yc�ßuWIPs�Z�h˾`˯��@��\��wܼ�1o?]����b���x;��=��<2�Z���kx�X�Q�}�h����e
M�v��X�ܤ�ׯS���PK/WUWʄ2 ��U&pip/_vendor/pygments/formatters/img.py�<ms۸��+0�dH%
�N�L�:�$N�ml�}w�q<2$B���%��L���. AI��:���L,���b߁]j00�d��J$e��|��R�E���ܟz�V�g0�}�V<ciUfU�dz4���bY��+{~x������`�
+��}P�R�ՈB������xH0q4I!�٫�7�קW��9%��"8���U��%K����<]�,ʂ�g��itW��zY[&Ue��QN�iOҬ�U���E��-�͖)�����4�ә(��G�L�,�Q�f<�*�7e�9&D؇�����_����&�k��m��R�Q<េI|6f�y%��Ld�Bu��i~���Dž8h�+��u��b��ȏS/���~�8 �"M��Ʉ��d�7�Z���7b޻h޽��lѾY����j�������J�*�O�u�r��4a��7�xI	���E%�a%F��AI��~z��/��..?�����	덇�}LW<�/����^ 
1=�*洀sF�ʻ�d{g�'��5��i��8��`)��W��ߨa8�U�ֳ�|�Ht݀�7��<`ms^�%Y�*
E����bU�9}{�����ˋ������������X�+��<MR�1��:����B�]��O^�s����`��_��VZ�P���%p
?-E��\�#8J+��9i��%i�j�'O����i���)�j�&-���r��R�
2T����E�H�m��<��k8�W�,/Nl.�TT���dĦ ��,�}��	����L�B����$|%��"���6f��zp�������R��۾/�Y"ϕ)׮a��d1/�E��XG����=�J5%U�g?u�ũk�)�x)�������4����Y4�7�����$z
�ð�&2��{R�r�K�g�i&�ƛϞa�'4x\Ӽ��b�3�>j�B��m��!)���>�" p^���a�<bapx0KW�*�f�f��_z����Q���cvh�9��� aEG%�3�=)�gQ"�t���{S��,M�т�y��m�5Q`X%��<DI�<�X�(��z�ENuc�\���2��
�C�Pe� cH;�12���(zkcVː�V���m0C$q��
���r�	a�Z.���)��~��<*� C��.%<Fcx��.c�1�8M����u�1R9���Z*VOmI���v�����A���v���&��5B�
?]�)
%W�9X)��d�*G���Lu��������q�t
��>��L[�O�=e�{�fԾ%N�"��î#���q��V��ѓ0�IoS��@r�K
!.��|��_��0d����w(��;o�%xxߵ���(�m?���A��5:8j:)"��ҟoo5KF�Z�^!�`��F�.�`܄�����5H�BI|�,績��yC-
�+��D�����W�;r�
�N�?��4��2ژHo|/6��0�Q����똎kZITQ��уT(T!��	�5�wثC8Z��:�1?�y�����y���(e<	1(<�����-�ϸ��d\�S�|�#�+q��N�|�`LWD����u�d~:y�s��|��w��b��?.�j���հ6p�fρ�6O ��5�ֺdH_j�@f���gą���kQ|��ӟ'����v�?\�~�ܻJ�%�Fħ�h��\}�)J�t]���O����~y��'
��a�k�,�/_��ǽ��g���z�Svk�*�����N����u]�&��b�?Q�F�k�V01<�h;����I�M�[�zͯ���v������֝��'�&x�?f�}A��E�a����Q^]�����+��J7=�'��ݴ=Jx�X�6��qZ�FP'[j�BWƋbK�z���l-����z�����XX��CA�z�C<َ��}�O0�'lJ�A��uʊ��8��c"�n�t>�YQ�,�e/��&'�%"g-Z�[GH8�\+KD���.Y,xQ��B�pC�-Q���b$�8hPP.y�*��*ͅ����f�}Y�1d��5O>y�6p�L�*�V�R�����H��C;+Ѕ	��%�kq0�a�gα*� �C�ϕ��6��Lo�z	8��3�����C75���$��/K��� �M��D��o�f�?σCW���5˧U�<?~q��[�	4��>W̑��T��vp����b�N3�zd��c�(�^ԣ*'�m�⁹bj����v��a�{���rvد�5�>���Rh��晴(dA�H�|֑�"`��êrf��@e�3UvTH�L	 y+	2�]'�0�J�,�@�"<>f��ѡ|v��\��K��g*`�qG�Nd��]͡�D/�a����3���b�.��i�����X���U(����'l�0_U��擿}8}70o�:�`]�;{���wX��d<lH������*�!7}<�7���P���-eQ����H���s��N�l,d=�R �U�r.�F%�����X.pC��ã�"
SQKb��P/�
X�L+�#x
i�&).[��02Pa޵��QM�P�`�TA�{�|��	�#�v鞦|��$�L��rp�<4�'����棋ڣ��v�7��<b��-��R�"\H�Ì\u�@:����T�)�����R�P�*���d��:9���w�O����m:8&Tʳh �+�G9�)T�s�+2,ޑ<Zc�B�GI)��5�}��aO��~�S�4Kc�6�����x�Ǘ�O�z9�
�<�8��3�ܕx�*�룝FA�T�GB�����5A�M��8��p���?�ta��7B��
l)�۸9&t�%m���9ďm�̒����}E��jlܷ�H��'9���b+D�g��]�\�Ԩœ��:�����%�jHF��_g���L��_�
!*+�Ym��m��J	�J�:�Tt-�	u4]�VdC�*J��ړ.!��1��<t7�8
�;��UVnn�������d�xS��n��
�5��!��W	�?�9��}���\f48Zwx��LY�>юV�n��B���Ml�;��d��P�N��L�'�|B���������*]��Y��ٽ�]O��d�g7p%�C�In�ΰ�F΋�,�	�ӑa
P�����PW��ݍ��*��t�r%$���\���̃^V4F�j>�bXmr��c�'���!pH&�K��YC��a�l,�$p��Ln��-�o��4�M��>ⰙJ:Ca!���e��7q�Bi3��^gK;�f[�j�����rC:
���]DT����vS�tYƈ�"�elT��U$��l�M��G���z��;[��χ�t��0��dӤT�B#!/Z��J�gTO�6�޾ ������6���։H`�+zo�.��s.k�g?E"1s�\����m0��|�`P����>g��뀵E�%�{c�ŀo��fY��Ǯ6���	zv�M3���T�Â�qxg���M�`ZpC�{p ����`�'0iC���d�#��P��5�zk������T��<1m�'��(;���S`�ÚB}��5B��c�O��xe��̆]��V��s�$��@�㍡��#��(�h�:�[T��St#G��j	��9�>�l̸��|Oq��V��iW�J�`o3��ҪL!o<[e���L��h�À��J-s������
�'
u|��8��(��|v)s��_궦��d��xx�w�8YkاT"Gbj��)�kt�pz���f�"b�X�I����aS���1sM�
�[��്wx0Ԥ��T�VJ)�6��4b"��2�dz��#�\����bW�t���]S�1�PM�բ��a��C���j+<kP䒉��c��^jĮ8j�r�V���(t(�v��¾j1r��q�4ٷ��O|�z9?Ey���Y$M�\�J㔃��H��yؾ�6=��߾�o���n�>�zҖZ�:<4\�.H�C���fD�$�W�d���Mj�3��-�1�Z�p�;�q�C2���/a�,&���˃N!3h
�j��EO�^��߶�Z�Qv_��ר˝Z����%��xq7�t3���ִ���.s阦�H��K��pI!-����9��{�5�˱��F-I9�@��ݔ��/��V[!��_�/U��:Ixk*�ة<�]잻��=h59��b�82p�.�ռ�IG��Z|�mD~�4����[�e��4��KdZg�:��w��x���[a�7���%�n�&���*v0C2�\�̘���To6R�����fa��Cjʮd)�Y��b�����ɁG�y���9��c�7���P?nP�Av&�Pnh���]_��<�5݃��r��O��'Xc`K�_��c,��rp%J���4U�O+:-�*JHmpr^�d�>)�
K��ȃeza��N��Ę�����z(Y:�"8����mԻ]9�x��b�H�唖�����].:#jR �S8ZbK��􋤹zq�S�~s�ny9��=vZٲ#O�w_HB�S�]����[ ��[��r��S��&����܋���6�I�зi�Án�fltn���[Ʌ� �\0j]��Rh�H�p* ii���[1�:�S��ZL��H�Z9��.ƙ�ұ־�:��#;�8��\w�v]�
�_\I�>%ܶ��HvÉk�*1�8�l�i#��ޡ��B&��+y�O��6ⴟ��-~���o����kVvrL|m���R���V?Z�p��!�&�zS���t�f�u��{s�*[S�
���Y���a�Ɩ`F��t@7ώn�gk�v��g�cd��ar���p[��	�H�2�=	�wSW��r��
،"bpС�h�A:7��"&h�v�:v'aK'�%�(�,���;c����@����t�} �<9��	�wM�%��́u�M�	d@ww���;�Ń�#}�+�f<�U�uض��xGzE�X�R�kh����S-0�fU5�RY�D�rH��e�m��I��$ݵӳ��/+mA"�v��}|��s��];��[[�����&��L�m����б]����W=�?j9�Y�Ug��3vm���[���Ɏ�^o]��Ϧ�[�6J�̪��[�c=�����Oy�����s�T��D��mX)��۱�+�u��.��� <�?E+���c���� dC{��#�d���d<�n�jתw�]�Lۏ6Gƒ-�T������Wn��	*�)����SCz���L��"u���=��ٜ-��@���g����lt���K���a([��@N����<߾�{������ëG꽛����͛`�4���#�y��uG5�:?#�'��m��=�~���xS7h�Y�#���&�<���<�F%����E�]�pob_-�������PK/WUW��Wy�u&pip/_vendor/pygments/formatters/irc.py�Xmo�6��_qpPPJT�N��	M�$M�bmZ4�!
dZ�m����TSo�~��/�)�IS���=���x<e0�~��l�*%�)�2.Df���1��> �~:ި�Qv5�x��l�8m�p�����&KPs�wP�."����Wo>|������X%Y'�����g�g�k�-J�0������:N��*�"��
�EͅZH�j���-yt�"Li��"�T��f�	�E_L��b���C�UZ���(����>��dM3vO�*����4�sd#�5r����,��� �]B�wxOk��e͐`TS��2^"}�h��f�4�C�r*�j�}�	�T9����p_��?&I�I�O@H�?F�V	'��LХA��)�I�N5F/;�����@⏂Ղg��dKZ��r8#t0��k�&H��u�PЇ�WHn�A~詭����_@t�Q����.>i�R�O�3���T����L0V�Z�����
H�ͦ]���W���TJ�Sc\#[������W1>4��,��旄�9S.>�O*
:)Ydž`����Z�K�WRѮ�8V�&�b?����%�e��k���QȒ�%���s�д�u̝%o0��!�%S,O� W�l�����^.�+�mu�B�0���do��0�iM����[j��eAdϺ�kX�û]�a^�cV<���Ƒ12D��m����]c%��W��6<b�9�Q������.�ÞT���S's%��3'hOϝ�S5��_8Ak�E�_�T���(d��,��`�ӯ��L�k!��6�n}4�M��G-61|�ÈW��֧j����VG��.y�����WΦ���&s�F8�|Wabԋ)���!����`��Q62��߲��_BZ4I	���L�P�Έ���פ�:#F���[������%��k�������	/�-ކ[���!���]�A�����yW���x�r��
Zmxx~��l��
�:����.�ǰ�K��o
)��s[����,�A�� ���3,�T�t���C��A��^7a���(�� ��֡ϖ�c����yI�q}��"�Zc��|B�QIK�ud����_����v�N��=�[�$��aUƤ�gW8����)ղd)���1,��s�
9�Q��Gm���fA�,+�tY�=�ͷ1V�v�̌��t�+0�q�t���%�b���d6�X�d:x���c@k��GU���Gg�ׯH¢�hI�WQ����M��g2t�
-2��[�pya�(*�XVu����ׁmT�2���B�p�g)��36_�a�~ Nt�d0��x�t��#Tq���+�h���9k���>����;�VF�i)m$�}��о��U���ō�d��**1S�F��LO|z��,��`�\����~��EU�4
$+���q[�wvuߩ�:p�[��Q��)p��dF�s���^?:m��D�B"!9a߽�i�sc,8��Т���˳{��[r[�nʼnт٫��S����G��-9���xLcO��&=�zƱ�z��Xl��Gç8�
�Q��-8mP���.&ۣx#2�-@k��K���)�V��������~V��s�ic%���l�o�UH���F%5�����͆��-�;���޵{��M��.Qѐ��k�KE�
=���0�z&�M�.,��}Q�u�1=ip��&r{�&�{jbK�:�;�A��0�3�i�o�p�PK/WUW�d%�I�K(pip/_vendor/pygments/formatters/latex.py�<ks�F��+�$kIZ0N�nv}��e��TR�]���V �`=�����y`Z�.S�I���gࣣ��O�����:+�AY�B�IP����3���4h�)����A>�+�Ue^���9����77匽�_����ϯ�g�?��#+o8���a%���w�s���.|�&�C�
>c�}�A����/>/�8�����l����<+JvQq������_��4�
��
d$<�����X�-b�(�,`�얧�x���ݏ��aq����2N4솗�U�%�,/=��%��E�$�;gW�Oh[#���#�f\�A�06��C�m�A�_��i��eU�'�ϓ ��|>��p�pv6�lN폙�S�&_��W�_�G$=V�'��+���I��O|��=�S>��8x6��Wϗ�8�>�[���~c�7�>6����'8�
��Gɳ�_���
��̿>��Q��3�e�����ˏ�����G.�p8̣,�0<�I ��d���X��J�<o�
��}�}fIV8��NF<
�b�X\��6x�����`�J�X�(�L���o�t�����C��/��2.j�`��!�Z�Q���1��B�d���β5�T[.[�$�g���xp�.�)ptg�`w��Z���hv�T�d��x��Z����&7��1簫�c���+��xd$�πnP�lEt�G@����!�%7��&��&�&⴨
�n���׸OyH��@�)��V���^+e�k���V�mR$�-'��/��ɒ��&�Q����qN�_\0rD2��oE�oXl<F�!�?
����d���0�(��\kу	`�5�<����4T�̖�AeY��TiVj����x��K��g�14"���Y��?n`wL(�`����T�ݝ^��Rp�,�VH�%�AY�Sڄ
�@���_~&v�N���β��� G@��p.pDQL`&:#%��=���NV��B�'�� ٰ�%�>Avr+@���
p ��O��$.Y^y2�����Mf�5Z�bf�>0V��QN=b'`J"��0C�{��+��}Qb��$�q�R7��m�MjUCbw'�7tUzfJ5	��?�"#�3x�E}Ke�]�=���'�*�t��?8�#�/�<�Qd�%* aH�1E�4.��J3BN̋-����o��y��O�ؒ��(C翁�R���`�B�İ!�U��2�<.���71v����F�����'��h��IE�x�"��a��g�B��r}
5�bp O��"KɗƎ�B.̚B �U�eS��:�vbb�� ��|ҪFei�I��7�Rq�bd����FƆ�mCR�%��(B;�t�8�I�Ή@�Q��@Ɇ�$���-�*��*�r��͛7
����O���a>��ᗟ���6�u��
ny�/UUs0�6�|,�/��0�����I�짫�zzrB�=V%]e��
� ֚��a�{<��Ci����	&�yDONw�x� Q��m^>�y"�樞�;���q�!�5��F4_�.�(C~�(�Z�]��]�H\� �]-2R�����x�sl�MJuZ��;��&%��X�k�yx��!���X�P����;��}c ���P�?�Pͨ�o݁�x�@����0�ɉ;�y�@i�^5����
Tf���t]
�I�	�w㽏�H��$��Cem��R�{�P�jw�>)V��^��@2k�~�;%&S\#���kZ<�>�j͂�Jg��4��=���BT�'�ͰiK��~��^�D���䚝�gf���L
���x�94������7�\9R99 3D�B�}�h����-�&������iIhD����V+T'���%x�$K�z�,�yz��qs\.��+p��R"��UO'���I
��DV!G|���D�JU�i��+���ϊ�|�����_~���w�S{�����n�e����VA�ϜBV�}�	+<CU)�+��B�sVPj��H�x�#H�`�֒�"�vTe@.��7HJ"F��h���1Y+H�DkD炰ے�#�l��}����K�%ԛ`�Ȳa����B���.hѪ��|�TXN*���F��M]b[b7X�5s��l�R-
�dp�B��4��(tx��:ݖ|(�+}��(]���IDc;���)~�E:�V:6����Y�y����ƴ
Ӥ��r��\,mp�L���,ѴU�\�u�\`p�h
gw�T�Yy��E�tŮA5R���~@�ޥ�\�1j	.M�.�iO{���j���@�'Ó!`q?Tφ1��$�R�@U9s��p���C�>�X�T��W�+���q�Mm�rj=�NK0�,�i��!�%���*0
ŭ)v5�N�C[����n�Gd
a�'�L�c�*C@j^Z���à(�0�6q�$�K\9��*�4��<�}�ݺ	n۫��x���+H9�ei�]A�qд
i	�ma�̆\/.��m�t��+=�S��M<�n�%]<���qhR���c����j�qw�Q��h�Fx���/����vJژY�	�ݠ�� ��7���q��S
p�jP�@Fi<�˸�GP�U�Lz�$�P/��M�;qt��2ea�~ SP�gAt�\��K�(��F�O�����^�+ӄ�<{�L��(;n��V� a�� t�5
?�NU�V��;�P��&ʖ*JF%�<HM?��ƍ5ҭ��?UBB4����##BaC�+6-1�O������P���ψ}c�Sě
�=�A6ɛ$ؽ��N�WL7@zZKJ�亙�î�Yk<��qiW��)��4ɩ���Bqrs���Y�d#+0�J}�CI��4c|���Z$�P��T�'D�dm���
ݶ76�5`���z��gZ���0V\K��^�Ǭ�x�� 7�A�>���q'�Q$O�PJ�|'i`T��<�� I��[#
�ˉG�j���f�S�]�麒�+�� ���:4xJ��Re
���ᄗ�Ho�rx���b1�4�c/_�M��[L��Nv�%_&�@�>�����6im5�u�
�j١~���ܣj��~��M���3�&�pke�"X��u�����ɸ
ϟ���]H��k�K	i�'!��?`�zV�:��� ��a�
�|X�zبN?�zN;�7E��
�)��Z(��M�n��=_���ήۓ��ٓz6vo;5R��zXFԖ��1Ji��x�.BXa%�����7�BL{��SNS-������;��u�$�Fzn���H&Z�����!�͊2������x�����:hCo�#�����ğ��*"���uG_���5,�?����7�g��և�Wp7�y��i|�B��j36��a-'� �9E�qOG��\4J�ݭQgf�M��-�QZÁ��*K��u�Kx�g-t������j݃,.as���d]\���0���T�xfSu#-2p��"\+��m6@�~&2ѧ�m�f�6d�^c:l��2<���H�W��w'b�;ƣX6�փY����劈?�����C�)��|����Pf���QQ%|?<��p�&�`v-"����@%i�&�!�h�M���S3lԪ�<ό�tu��_UN[7��K������ƥѲ��ӊwG2���6��ԅ�Kv�+
�����it��
�z�k�e��sHjVu~����eV��-��OCn��x	������J�M���/����]G{j�Ғ����H�w�ַ��q��c�Q�#��v<��ލ��C����^,��x�$��-����W��m��hs�E���M��h�tx��g(ċ�T��dy_{�4¢J� ����GQ5K�cv�����z2U&j���i9�F�̢���k9��Z���%�A��7gF=�ﲏ�f�.Y��ڿ/��޶<�B�d��l�>��c��~؊	vaՎ	T�yL�\�Z�k�e-�Ϟj�c6��wF�bĥ=�I,��O"�e9
Ɔ�\ �D�_�`L"�V�U*��V��ٵC[�Me���s0K��}9��8������;�3��/�_�յ�K[%��4�eA���5��qgnM�nsqR��VE!O�a4�{��6�Z��I���P<b��Tx�W�5�q�m���:�[Z2�;���ru6�\wN3�I�=��ģB����n6�LH�Y��Hܑ�؟Ĝ�����٠s�4��EU9�g��i5Xo��`��@�@�o
�+�uk��le�n�k�0�wk&%o������pHr�R��7�o�sۻ~'	���<�K|͠�~��a=��~��;���p�Ooʎ��aǑ���B��w̗��0X��t!7z������������`)�!�~�t7�"F�H!� �Lꀎք�+��L�����F��5=L?R3����5,��A��6ʓж�O��a��:�~:\���=j�!��ې�t�}�(O�ܕ��G9��d(����x�����CExw���?~,��苐Jt�E�'P�n���8xQϠ�[氤OU)�8_`Y +�vz��:��<iFj�S��0�U����j�jҳ�b�:N�����'B�<�t��W��ڈ��F��^n�njB��t-.��q���/�u�3nZ�_���L�_�����v7�c��s&��`�0H�|YI]ċ��)��>���~���5�D�]+�Q$l��B_']�b�-^������1�f�w^^.�c�0���*Z���ۍ�(K�N ӊ�z���Q��z��+_�ѕ:>�l,�qX}�j^1�x�W!{��~��Gk@��G�Ht�����U����7�#�[���2�Uo��߁0/Oyꝸ�TEEld8^q���_���2�!��}�B�@�W(�P���S��nE0+M�����f=c�
�
�nZ4�\�wI�.D�$Vt�@_�,�=�b�����&�P�D�#W�bs/�|�^�Ӆ�芖�co�t��9�{Y�}3y�ǹ�S#4�ē���
��v\@3x��v���7�/w@�e��
����e��\Ap:���*��R����鲭�4�ŷ�7w�U�:RqGj,�����(�[��mJ��'�9����O���F���d]��*z�5r���_np�-�|p��+�_`�;�t]����B�w�ʨ�B
ic��kԡݓU�uF5�j\�8�\$=�![Z���y��M�k�����ο�1��~�m�J�7�ا�}��\�
q��K*��!R��#[���A��* ?<K*b�UM{n�r��V�
���^�W���,o'1�ƅ�轢��j󮧱���1$5�'8��1�q��(-����ht׊��	������X�e�v���U��������+ЎL�9�x\���F�h��z#��C�53;'�liY{J���~l#��P�F�.�:�i,�'���ګ��X��8er�II��ǂ;v$�5d_���@	A�w#m���mb���A�!@W��_hKlEY�R���	Dz;5�zQ�$�p��5��s�@���6z"�Z���?PK/WUW8�Vl�(pip/_vendor/pygments/formatters/other.py�Wmo�6��_�y$���f��M�$s�`E<$��	lZ�mn2i�t]��~��H�͒ݥ��Ɩɻ��~�^�xֻŊ	���T+jS:�fɔ�������s@�6y~S��{�˿�(��8H�z��bi�x%�gg߿>?;���v�ɯ^8b]��f�\�6�yt��8���Lh6 W?����û�!
E2f(�u�@�`�䊬�:�|b"�*i�N�j-�!��G�6�����I�� �D��&��(��e��Rh���<��T���dB�|2!�c�0x�'a��8fڤT�j�)�4�Z7]�o���d�1덱^1�!�.�X��l�YJآbW����-芁� �J��B�LsBi������p{�s����41@��(csX�Y>�kY-7*e}� �W&RA�^e�{*������0���U ��9b5���G&[�
�,�;�E��
�k�� ��K-��<�
c�
���(�%���Y�p)���@D��#�_
�L�����	�d:�4h�w�˫��Bďb:M,�t��RArj|!�1�_�)c$�T?�Ɛ��i�����i�S�g��^Y2���L�IHε!��~?� Ĉ�J�ʂ	#4M��8�i*Wh=-=q;�Aˁ���9�N	X	�g���O
+�W��}�!�K��mM��,W�α�!H"�c�ɡ
�!pB��fʔ�jb3�K:ꊁM�>YB��m�l��7ںvI}�H�C�Y!��.���V�m�XRy��$��J�,S�Y��MЙ��J/K;�! 1�vw�#�O���J���BU�`2ႛ��ׂ�S�Z�:�A�[����4�����m>����p�2\��o�lR�P�aQ��Z���8q�=*��
o�r�\�����ժ>�-����6!#p��#ЛkME�=T�������{�0�I&�@�5�e�bZ�2.��_�
�-h�~��x>��	H��r>1���;�������& Lֶ��*^>o��K�j�W�;��%$!�=��fԮ]���4�Ň}��E~a�!���嚑�1�-EԻ��<���
���|�Y�#'_�ȾL��ޖ��F7�+�C����iXnF!f�*�L-�c6�T�HxT���*l�I�6"�?>�u������7�;�����XA���#�n��<��e�"ͥ�(X�):�Q���X.�l��fr��u����g��K�M�^��;`���K =G|��Ԍ�?����wp�,4Ox�ĉv�E�D=���$�C�),��m����ёj�tX�{��-�[���f1Du\�� �ח����ft?�B��e53p=�Êq�Gdx-����\'Uc�%F���.o����<�o0��l�Vw��������-Z��к����/뵒k�a$�V�P#�Vs�#^{�;O���c�E��<�oZ�`�\V5];o5w�y!S_�v��zô����C��-�A
H��r��W0���7U��f6��юU�Hk�Ey�@�&���\�
��DG'0�����(BL���}��m%Ҍ�qb� ��a��%���(q�:?�(?�z'LE�L5T�aGc�=|�N�W���!�
U@q�����Z�p'��Êt�a���PK/WUW�Y�T��.pip/_vendor/pygments/formatters/pangomarkup.py�Uao�0��_q*��n�LEB���`�c���i����9v;�4~;g'm��]�~Yt�{��ݳ���_�\�\YC�:O��<74cj�S������/�IV��Hp� ��]ج����:[�bqmGp�����ѫ�ã�K�-�^s����Y�������)-a���2|�����g'���Sϟp˄44��`��2��薫D紫D����2� �"&e�.����Y��+��M�2Y6�S�}{:O�d�F@�Y��!a�ai]�!>�
�d<LF�5�M��_6�<i�Fŝ�(�S	��/{��j�9�E��!R�3e$��_�a�d�&���WM�X8X}�{fZ��S8�3��`Ʊ	��'X���������-:OhŒ�'���5��P,u�%M�O��p���KB 
�\�\H�@|�U	�&EB	E}��<���Yl�Tr[ަ[��u�;��.�g��O�r��Я��jd�t�2t#�%�0����Zj�e��;�ұ��|�S'�g{�wL`�B�"�p�Xp�"[��i��hbvL�S�v��+�w0�����T
�w�O�I���f����]�vf�8E���]��2]y�t��<to�3vìx��-�m���]f��k�kOV��.�����d�Ȳ�0�,�e����]#R�J۶�Mw����_���σ}��*g�VЅY	ƍl|E}�5�f�UX�3�:�c�bu��U77��{��î��&kk�V��sU�t��mz�[�?��j���PK/WUW��,��&pip/_vendor/pygments/formatters/rtf.py�W]o�F}���p`PrBVw��iڠv�A��}�qD�i(���Q�o�3$E��*9s�~�{������)w�̭	�Bo��R�P������m���ٍ������JC?��Te҄^t�N�����M�H�����l:��V;h��v���	)�>���סW��X�F����_��?߽������
%�
���)B;Iu��R���V�I��a���e�-�m9TY�5�ki�*�ˢ��ҺX#�R(}rr�\�,[.�>m��n�g� =��Q�4�� O�u���L�'u+���F�N�Ee<��wTT���Ŵ�2>��%E\���)���Ȑ1�{��I�	����H%c�4
�ԩ���0׎���X	���X�H���W脿[�5>dRIy�S/Q$�HT��"g>��zg
��g^��:/�L<>,c>G����7��Q�Pne�����N`��\A��x#���_k��:x��
�&�����G��0�[�3"Id2��4��� I{)���q,K1/��d���D�'��V��5"'dZе1��cf��TT���z�(�ׂ(מFi��T��`&!ޢTl'��)��m	#Q��������Z�&�B����Դ�L����U�U�mT��"��,���6�V����N%v�Ϩ?;�]㍊�1���Ά~���2V���Ck�RY(F�*�3�f���K/6����"���b���/�,��Z1��@.p"S��q=�Dk�*3������������r922K't~^�e�/�n,>Ym�)��{vz��7E�%��ֵB�w��&T3���_��M���C�"ݢ�t0z�.�骫{����4l�f6@ǟ�e�,��z��=ML8�[.Ds�o�W��;��Cd��F���q;r��
�Cޅ0��[����˹�l�Mu��Z ��z0�v��)׫��&4�����<��>Y��v�%m�s�jYf�>
��|�i��L���7/��i�{/y}[���� �-�A�i6��`ǎ[�7*1���g��.n]}[%�F�S=�9Y��Tw
z�g�v�_�xW�&����U�r�ߴ�P13��n�s�1�qo�b�'����	}Q�vl
$�E(�7�R�}2�	��~����<j� 砃fZ��nj���,��VpV��ls�fj�)���\\�J�ax}�݋��e��c����m�;n���12��q�gr�Rh<v ��#�*w��40ww8l�a��Aу=&]����I�εhx���.^,`=�0��b��48֌��	&
��	�5���@S��2�N�̏����qF(��37�S[s#|�'��w���)c:|���[����`~�o���|ݔ[nN�tY�m��aj���Sz�ɝ_6�W��~_�4E��v��夾���ǽ���8��w{�ρ{n&�j=Xu�a�0�8u�b��Ã�?���)��her�,k-e����g�ȃ%�(9k����-L�!<��z��>*;>�\��neB��&�`��~�	K�Y∧{��
~g�DZ���0f���
�ٍ�=��
�F��Z(��f������{Ae�C��]�+տ�9�_
,-�q�X��`~6�<股C]J+�|F�h>�r3���{�J����l��,y��*x輲��?�A=���A ����J��A-��A�6+�h���RX����x�jcY5Vh���X�������̐kE�?Ҷ�I寮����n{#~`�/PK/WUW�X���	�&pip/_vendor/pygments/formatters/svg.py�Y{o�F�ߟb�ABɖ)�N
D�\4��H� v���D�K�0��r��x���~3�|S�}9!H$��oޏe,�:`����@&kWk�(G=,��?�?t�KAπ�]��W&S��1�O�Y.Wz�.���d4��dtr��+ξ����z�����o��z��(�P|��]_��.�~��"�>�n)�s�D�Y���_&N�8�c��J�G����`��k|�y�è�^r=[H�d��+�fn�fl�n��e��}wpp��q�1���:�i��	y,���j��윹�mx�*ˈ3W�̗����J�9�ͧ����;�:MC`'�q�z�g���~����؟DY���gDiC��9Q.�Ai%*L��)-�B��o���E�R'Jg`���Vwk��V�������Ї��,^&n�
=p]q�f���gC�#Ʒ1OB��\�r��B���'}��.�������9�G�	�
 �C
[8�����|NX���
c�I�
1a��50eа�B�����1��kT^��2(��M#�H�4�T.*�`���^J��‹R��#�Ŝ�|�N\JA��xP:��H��r������ܟL��yk�~���@m���x�5����˼̌K)lp#<#ɨp��
t/�:[6@��',�
���ǎina8$Ç��$�co�	�ue�fF<P�?��2(��,�L�0�&�$(��)>��ډz��(�ȱ8)���yZ��<A������I�H5��7���RHH-�[MUȎ�[By������UqB����|>��Q��t���b�mR��߂�n�����_�EA�(mN��x<nh�86ȚQ@��Q�8�@Ƅ^5dB)�	�H��.b�zU��n�u�f����G�{=qz����1�4�d�������n9���*�D�H�%(N=nI�^a�o)��AΨ�F�c����?�&��ig¨J��H�!Q4!� ��1wE	q�呂@% �dDI���{4��Wʅ¸�8��z�.��wr�D���WL@g��2f�_r�_�̤��2�$�/����Q 8��.�+�f�2���V2��6��t��\�J-rI�����[���hj�V�xƝ�#�|S807�Z���+/��z-�5
Q2M<nr�Ջ��1o70�W�E��H�{��A�
8	�D�D3���hB�8d����8W��ܔ@ "�Ԡ���%E�=� �S&Y>�q�O��U�ytx�L��s3X��b\u�����À�]�1/M(�S�=�|��m�\���(I#H,%�T7�4�O�
���ޅ$�M>ZEg��X�����Ulz�F!���
f+,��F`]BR��1'���l����zP���1���Snj�^�*�p�����^N��9��FA�����8Գ�\L˹h��"��ϑ�Y�/����u~죊3@�6�:
R9�U$P��r�R�p!��(ybu;9>���$��O�
q��^P�7��B���dԴ0{�¬��@�D�p?3���숽i���fb�$��)�B�'�>~;?���f���؃���.�+�}�fR?�N$`��a��֌����zU��9�R�����ܥ��N�-�V�EC�O~���k<��A���V��#\�|�a��זI��pˡn�I��&��~�+Q��hP���-լ������*�Q���kp7�il;;-���oy�Y�
��Z+k�W`���`s�?�y�
��`�׬�5vF+���Ke�t�����N���o�D�5Hp�����7߾\1����>~�`��p��Ӌ����F;`
�W�Y�~��ZiO���f�lN�,�7_�'��x�����������5"u�#�׾��
�:�.�t�
 r4�g�,Y�F�c�-�~>�^k�
�ã_ɯo+_L�}�M3��S�a� 3�fL;�nDOz�˴J	Ęam�ze����H��˖vS6z:Ui
��~�h�=v����Ԃ�j��TgCz�����Q��A�ů~3���G�n?�
�Oa30�����exjk��6��Qc���zt6�7��z�o�w_�	�i2��BRb��m��Z6�L��
z�|��BH�۠�y-���h>m�W�g��ݶ�
��S ѿ߂D_���W�R�̤{K��c�$Ur�8
aY�t9Rҍ
9`s�=���G��tR�Ö�y�M�.��'}G˺Êm	�?��.y;R�S�P�O�#~��&��y�(��0r�����M�z��-���X�?���G7���G�I��NWym�r��e��1�۫eSr��m���2���V"�7��Wf��[͈��K[���u��fE/h�Ϡ�;��7C
.�x���"�[ۓ�L컶G
�bGS�6�&vKk�BF��#Bĭb����D	5\��'q��e�k@�`V���N�E���PK/WUW_��LB+pip/_vendor/pygments/formatters/terminal.py�W[o�6~���\�3MȺa��,M��[�@��c��Lj$W�߾Ëd�v�T�E���o��#�Oݮ6��J�Bn�� U�6������3�o;$A����d���̮������ᦅ�[�Vk=%�O����^�����-�k ��șn����ۏ�Ա�X\�����q߯�..of�V�4e��ţ�R�:���B�������;�iq���V�2!7t	��1D	�i�*!�R
��/V�f���� �6�Ɋ��
ӄ|Z3
��<�@!�t*P��3�L�Y�V��b-Ѓ���h4�2ZUYF���h�C�{"�C�S��ę��02�P��KR�
��@�?�T6�������0�iq����%f~����uvq{�QE�XY?L��(	ߣh��lڹkP�$m-"�mz�J6��Gh:�H�AB-E1u���|����C�')G9X/
��t����'%u��~�ɋ�
]�ִCz\w�&m��
�4��!���6��L�^�J�Ѝ� Ę?A��(3l�^�l'+/*�T��27��B���Ꝏϵ�
�z���Y�g3&�E%�y�7$�^�����IXǚ���Ĺƶ�7�Ϝ9]�Y�����5�a5�QU%�=�{�����f�[���
4��PɝO����^�0�$�<� �yqtr4�G=k�u@j_F�j���r���=%Ɏ�>'��ņ��׳�������^��"�?�M�V����}p�@��
�~�'v���q3.�&~|��� �J�	�&A)�㆛��IMW�'8�6�{�̥�BW��7�H�0O鶂����'��8�(i�����k�V�P0\eC��Ԉ)ˌ����PcY�sApb9w�ͭ�6hGa�;^�Ũ����b1�Cr�X䆯fR��j�Fdo��HS���U��0�����Ek�N�sR2ۻ�lɆֵu�p�ǖU�K��+_M||�i�q�l��P�PtF$w����r���g.���CH�m/j�1]�QLGlGG]�Vʩ�q�M\*v�m�C�~��)�Uh�ّ�p���ٌ[��Z�
����Y�*�,c��,�T˄���'��vE���o���Cꢂ���\�Q�|%=���sd�m2l�;��N&�����D��u�����M&LL���|Cv>
�Y�cdc÷��}F����n��s=J4�����(p��H��ipԭ����!�"��xF~�x�Բ��/���_q���KP? ʮ��O��8���Z�t0�0(��0~���9�Չ�vШ�-���K�1�.�����M��-��]M�5W�R��u�Kǭ���4J�P�=�I���jI��V84[l��&���\��&4~������o��$煞x�F�w4�$�tP+��������DsT�����Oܬ�����y)��
hh�K�A���<�o�M��y'tzhugt�k����r��rNU]1m�yl��dzО��K~1ϰdv7��b+-�&e���d29��G����1e-Nke� Gw���q
��bv����d�=/w���>���PK/WUW�M5���-.pip/_vendor/pygments/formatters/terminal256.py�Z{s۸�_��'%eK�ïDw�L�K�L�I'v3�G��x�H	9v;�g����d�י�.��`�
��0x6�5�Dj/�d���Ԇ�u9��h�����;��@־�𦅱x+6[��b�^}�z�R��GOm)���_�E����Ob�ً�;�(�#��9���g�$^�{/�Ew$E�qȬ���`�H�������0�O�#�A�yl'����$�}`���҉��]��ʮ�S[6R=/�<$�r%&�~e���?��Q�Xq�g�q��8{���?|�teK1a��(����'��7o?\�%�\8A>3 ��v���f}�q#����a�x��27��6�y��p@��ha0�$p�����ci��2B�I}��F�
�ap˙)�\dbͮ��U�b2%��d	���c�Q�pܐ7�s:�B�9	g�6�Р bF�Qg���.!U"ߐ�!m6�^)[s��"|�p���i���/�@�~����$�A��(B�5�� Ƣfq�O0��jp���{k�=��˕��³mH,��M��gw<��ĮOX�7q"����1�B�x��o'��S��@����fN�f�M��|��l0{,k�N��
2�7 ��4eoS���+�Lh
@t�lD��ͬ���[,/>�x��^ �/�9a
�Y����+�⃲���^,ˍ.6��FP���U���Ao�^&�@�|�d�4`5,�ai��`�BY�f|.�	���;5�3~0�_�@Sc���Tɍ\3o�„������d`4o��h�����e��4Q!C�T���A<%�T��	�@�s�DF�g�ݛh0��&*!u��pa�Ո���	�|���ܮ�#lg���`���xrr�-�qH���� �e��Yl����`ϵ��ݚ��=�>��~n���ѐ6��Q�TV��aG�a�+�v��5��k��E�pdԙ�ɺ��SN�l�65��U�x9M��( Og_='�,�$�>00�c:��FՆ�M�1?w*;�+s��ܪ2�U�zX�r�}WٲA�/Ʊk
)��4���	����=�4��Kj�o*��My�PE�C�tuq@��*�=Z�T͉�e�B$2Ȑ��l�~���ڤ̊yUI�RQIBvE�:+�ʐ�ˍ����}�z��6yI�=>(�p
y'�[��Ғj2G��V���bN�sUK�"_��X��5V�cS!��#2��b�1� �D��ϱ�4uK��	L��̲P����<p��g�!�F�Ʉ
��.o�:�X���ڦ �耴P"k?A��"��p�;��{�iy�l�C"�!%���!�5ė]�x�l���d�
�i�W2&��k��dda�5�G}��b2�:r�0�sP��m7>%���\�Pp'
0�b-�b�
���e$9I�d�,��'�H˔h�,I�+EFc?B���2��$�u�$K�S��8B��lV霭�Y�AH�X�{N�X
���8�Fg�֕+�� ]�H��j3�s��s��(NsuW��ƺq>�w�:M�h�v��,�iV=�p`9�a��ʌq�=@��UIX�.�n�9 *�(S��0pRNۅY8�Ad��/��䆲�*�K{L�:<�KGbd�n%�A뙚��=Mn)���@�������I�U������jތb|3io�@Z#/B2��&c̀p�K�g�n��W����e45��Y��1�<�(˃za���KR)J-��S/�f�;@��s
��KU�Ð��%���!c$,�X!��iXț�P+́6ihۣ�	�1V#�ٲb�����=�v�ý8=��9z�N�/9�O�Y�<~�89��'O��K��'�Ss����O�N�)9��<_ ����/��\,��|��qj~�	�%�d���E�2�υ�h�4*5c}Ji��~�Tk�zک��љm�������?��m]���9�'X�ʑ�vJ�_��C�Ҙ�b��2K��xt^=���������u�svV>�X6Q6�e N�ǖ=�v�
���N�'l�8P`��u���+C��^�# ;,f�n��z������7^"U;�6<W	�:��l|z~���q4Tm��?̺̈��?҃[���|ѻ��u̐�ӓ�1�MՆ8
n:�T�R a}�3V��˼{T�:�����r7�A�H:\���~���>�1�]�,K�!�����$+�L\��fKw#*~�R<$�>�̢]�h{tPB�r��8B<��z#&
L���ٿ��8�B��e�({r�����S��A!K�>)�E��B$u_'K��:z��U9s�G����a�$q�&hة�<�\^�L�;Z�jK�&y�H�r�����ʜճ�k�RJ6�)U*0+NT!6�"$�B�^v�:8����X�J"Aѳ<��i'��Duf�Q�7�ܠU^�(��JM@��9S�M
�g���>#pw)(�h���F%m�(�/���!�e-7/��c�Lj��Eq�.�
����k�����D��"C�����RJ���^M��G�(���/I ��ej'��!~�FSc����Q�6�������?ax�b������x�b���ܢU�PG�#Od�m��&��j��,<�\U4ۂ����	���ֲ[�z�)��T-�	c��,1��lA�\CџHY2-5q=#�8|*adƏx���#�^���G��B/m�iQMG�cqy1hPު�ר�)��%҇��D|�M��s�aaJ6�
�D�nX�p:���~�^�v=TsW��`��p�Nl�B�nϹ�w�`O��i���i�h+8k��ܠx�'Y�s���Kh�&465(Q���CK)���w!g^#Q�†�GbOk�ik���e}�jC���}(�)P�ߙb���sd�=[墭�78Vӭ�ZJ�o�z������[�zjl�~���v9�����`t�.\�_�����G�0��SX����v��A�#�MU��*c7Vۍ�Z0�ғc����z�"�fy2�(
�?��.P���@�	O�PK/WUWi�x�A
b/'pip/_vendor/pygments/lexers/__init__.py�Z��ܶ�}�
�`���zvТ��Z8��pbþ��v��%N+*"u�E���fHJ�v��8�]>=��p��urr2��띬�IK�A6���s���÷~�pS�t���Q�[�/åx~v��/��=�J���ne?��|7FJ�⇋��y�>udJ�����?����}���D���6W%�<���ucE#Õٛpi���n�j��vR4z'�I��n��ʍ�򝜸�����VVݤ#���.�kU]���_��ջ����,U%Äki�B����hZ�j�B6���ZU�@��M�e^O�Om�*�ėen��~��j3׭4&��5�L^����q.��:���ۭ��zML����C.�|-W��f4v�|>�i2ɲ�,��\NI���g$��\D�j�Sx��v�ִυ�M�nJ����:�Y�Diz%��26qJ��[������5���i��L�l���d���Ȋ*c��&)*��ԫقy�a���m*q������޴u]*�ċ�m�&�'!�:"l9=�>�
&-*m�`��A�>qI����Z�j�O�+���+S�V&��#�8�=��Gc��_[&���$���^P�1@�.��$�pS�B���$�&
�����^3g�YS���u�9�V7�r� ��J�"���A�Dץ�
0H�!��hV/��f.1'��$p\{)�Qq/��i���]�&�`R¶u);A��X.�ɼT�[�A�3;���bf�%� ��T�n��-ĩ��T(cp#Z,�migs����0�8�K���B�ajy#����:�&�
)�N���r/V�*-�A+�'�ue�F6��)HY��m;WMo���z��,7<����*���Q?�S6;�1Ş*�K���u������t2�*G�dh���k�D�����W<s+�R�>�٧�Q�ZQq��
&j�[��C�B4��c�]�]~`�l�<�3Qj}�֝#�@8_94O��߃�̝���C��C����a�,Toќ7
fֈ-p��U��(<j:�Ap}���&<{}LHH�I�r�XS��"�<sI�*�+/Nqs޶n�3�����-�#�ku�iy9�֭�h�rI(̖�s�I�M!�49|^,�b9"��,Y��{��ul��FD��HO<M�-�t�o6r�X����+�N��m3C�œi�2)٭�y�֛��=���[��0~�VZ�;�$3�m(�I@G���k�N~tt��}�R��<�t�{sqz�k;��
��;�Zr~}�O�T�e*.�A>?���^�X"�w3#��կ�q��[���Uқ������to;V�%GyE��'/[c��]��/jU�׻���8�E� ?�rM��U]�^#mm�Q�=p6�.��M�;�� '2��j0U7{$ϭZoYS9|Ę9������p�nI�ui��b�������A�u+�(�T��{����	.jWD�\�Ƀ<�?�[��:�
?��@�Xys�eY�e+UU��y%�yk�#����v�c��Z~���*B���{��ߑ�����R1 ]�P�E��U)w�&�*Qc�<9��'z����]�j}�5�g�F�4�Έ���\H�,�������X=Y?���𖅧kYE�;mV�i��QO����&A55&<�xGfi����Xv.�tFα���x72İ�R#7�Ǚ�V���@�TW�	� �I�ż�F��B�u�81x�M����"�T(`�ة���G�q!�^�X�4)k+޼�4�`4M�HZ���hI��‰DD6����x�+��ƈd��	Q�q�,ݎg��}�F�YK2�]Q�%}����}�%)�����C�Su)C���kT����4`�����Y��&Ԟ��w/�[D(>�jj����xQ#Z�
i>�ֱ�O@'GpK譝�KgU��B����7���c������H��wV}�f�{���⌏%��CP�$�L%�)9D(�d�1���_Dc�Ax�e��X��E#��4�8G�v7�\`�Zrs,��.���E[)n�"L�|�>��<��h��NTU舃�B�#��d��o�o���t�!��0yz:
�ё��Y�[]�
rcH+@ew��dĨ�N\��������e�ԋ��T���a�Q>G^`�"�Gc���%�
��ۅX�,=�w-�кQ�5��Hd;e���,�5��1W��3�"E*I�������A�Z���P�_8��}��+�Ɖ��!X�F�����u�B0tH���yoH1Xy���BYu��Q�4y�쉍��/�|vuyvuP
?��b�G�D��>(���������q�tˢZ~z���T�1��0@�C�3r"ި�Hftg0n�q?5CzŸ�����,.��Q�~��A8:2��3��GO���N�S�jI���hX��|T��رI
X�M*��q��E�=�6Ch$v��`�: ��{�pz�>>��H���v�
��cs���х�<d!�e�=�c#��(��M8���ø!�v�.1��r�*���xG����$>v��&p�zL���#�#�#���j�eD��V�y�
ls�ywL�,;l�-�ﺵY����#�K�c�FV����82<%g��A���u7�p�N&��+}o@W��ta�7�����^�lә_wPz����3�O��=�i�ٸ��a)�w�:t�N��#���8�&/}�'��Oμ��7T%#�3:�|vp�;�Q��dvD�!�ߗԱ�ܿ�[��*���?�c�s��Ѩ�|�R�VW!6���<��2�⊡�Ԅ�?��U
��8mp�1���``��IW��=�h��8�w�c/�]�t�
UE��������#1����L��G����I&*7����Tp��rI7���xL4���e:ǡ��!��M_�x�`j��Z�X�k�Th�����e��?�+�7,]���``��+w$7L����ߚ�8u@�ތmbU�
P�j���9M���i�f:�����O�	����H�.<mm�iOM"!B}�Q��Nj��&�#��ɭډ�[�B5�}�PX���o.�$Ȃ�z�gip����	r1p�~����W��cKsT)ʞ�g�C�#��,���\7�ÈYCѫ%�(0�f;�@=xvE:���ص:�wyqP�VF��'k�vp8�2#��o.p��4�o��(܇�>v�ɅC�$̲�Ȳp�}���<{������N�!�!�p_1�;�C>�3�;Ǟ7nZ-��'A�b��h�s����j��H�/�7n|8�e0��r�4{���0�!�]M*y�?���gF�����,m�
}��v�g���A��Gj,�e��í��݂Nw�
�PK/WUW#�l̒:Y'pip/_vendor/pygments/lexers/_mapping.py�}ks7���7��K%�7��s�|��%�̈����V��̐in�E���@_���~]e��@�i`0\��&�}WQ��Q��'�L��K��r?i�&���[����U���I�?��W��w��ww�W�w���&oOo.������w�n2K'���'Y�vi����/W�>��]L���e��MO�N�W�.m��k���߷i�T�Yiٵ'��nO�}��i�N�
R��i����_���Le�
�Kwݷ���毈z}�f�>7*�u�T#��D䬍�������=���u��Q�X1U1U23��주ZO]���*L�uE�^V�jU	U~���\�*�״�0h�3X�V�2�F�4<�,���D͙F��)�ԢBQ��#6�z�"��(�厖��3(
�䀂|����H�@���l~�T?����}��,�&-����y�M�I�}�e.�EIċ�Ћ��ͯL��aZ��}HsxA�T� d�2��Bn�>K۪K�̼�F�"<�y^�� ��Lj@�@Q�y���Xf*û(�=����؇�pa���atܲ:O+))t�CT��.�jUD��>a~
��>��o�"�KU��jj�����r1����r��Q����@ٜ�ܻ�9�?���U�����v�k�m&N}5�;7
2蚐��xQ�ϕNu��DM�%��5T(nu�V���U�/�c>Q����?��)�vX��Z~~��!��![��5�w�T��mz�%e��KX-����&��A��k�
B�w���"|�È���m����k����ڷ�Y��[VG�;^��Rc�2[�&,��h�!�FXD6(q��8��D���^@��|��u�҅BG��kМ��4�K���y�dz�M�geX_�����@����ThN`Q��)t覒$�PT��iP��o����?R����!D3��6iaH�8���DMQ5i@Q����LL��%�'m�T{����?��?ݐ�nZG˙@��g���O˸�ם�s�f�2RU��A[�N��ߚ��ք���S����[�}Qwj�<#�7Y/;�"�
�}{_Nh���i���1�G�P�������,�:θ�$�tU&:���W6�����S��䈥��jB�u�y�9��!��
��U�)pҠ3I�f
O8[0��5��[�_RG��f�Or�pvv~�Y�˿�I5���a���rcb+���@�6�"j�a�a�FOT��g��T���ec���s�迸��l�43�.� ��<:��� &�@Z�>���:Z��������u�^G�^�}�}ԒE�6��XV%�~�7���E([ML���|"�N��ֳ�"H��I��<A:ΣW@��&m�v���g��ј�m)��1��ı�z ����o��_^]?U� �<U��:��:u�P��,t��T�EM��n���S����5�SY#�F�!e�h+l��Ň�%#ڣ
�C2��T-���h~5:(J\$cP�3�&I�[���w����w��(�RA�IW}�|;�
&�T^'���Y�&�#��I���e��험���h�U#[ޥ�p�h�LE�.��w��T7ϺOG}Y�u�#�/M�X�yϫ<K�}�I�S���+t�QG�Ye�jC��
�Ϋ�©�/����;2�q�FΪ�U�e�
V�M� *��
�<%UW����+��7�@Yg�/�V��+l��d	ѐJ˰���r�ǁ#G�� Q@��r�Mw	�c=���
��	C�Fi9N��޿Y�=L!t'�dU�@�J�9�i��jqx
�|���ֆ�$�AY����†�+�eL���i�\xC�cx��e�����M҈1@�ˆ"+�u�»e���ˬ:�i�UV����َ��wR&��Z%��:Wc�`�w��/����L�c�B��@	"E<a6���a�y���R�[��?���b��oa���
�Ո<W2�}�>7lBh[
�"�ց���"%3�[Z����NPۈ���
SQ�d:�ءJ��E�}��+�����g��7���ڒ���Z,�w���.Z�ƣ��_c����
���@���bPK�1�r�T]��J^��*�R��rb���J��ِ@k����ؤ�� �!�d�F@<]f��!p�GC�gד��������b)����PIhs��m?���8ωT*�0P��C+WA��$4$<�1�*-�Y����u��ׯ@�)����$^�u�����
-,�b�ˠ��j�-���ʈ8�g��>u��(��xS�V��(N�4Eha�)P���&��|��]���=�瘅�3�13 ��Y��`J3(�]��E-��}���!M��]C�qJp�yJe�['d�Ȳ�DVU*�۠�sǖ���Q��[j5�|;��5,�Uh�ԑj�]A{mݍM(>[��*����k�;�A8�|]?jDݬi�0M��e��F���Z�_n��
Y�G��6�?Q2�f����J��O�N
P@h,C�j�-$�so��W�}�b8}Aq�V�=wƊ�ſ�>vg06��H1���=nW?�=����P���GU|تe��n�tU5E���/>w��Jg:��V&D�.�)��]yOQ�=ЂY�
W�T|��9���牂V��*=�q�iT�f�'g�3��B�q�E�d����ׁKn������*���ٲG�7 d! |X�"�p��p�J��]���V�F�nɋ(��w�a������a+@ny��.�>l�J���i^�0r�+l�Q4t�&��`y�rI�W]�
y��}��e����' O:�&�4������z 4#)��c`sؤUf'Juy�6��:V� �q���Dl�B����IK�A��>�@49LJUG	U�kE��Z=[�]�|��&���,�al��MZ�!"�%L\Ìw�N�!�~�R�oƲu���?��:�?׋���G�$ֵ���u�1h>'�kkC
����?�zl=�)B���(݈��HM�`�f�DlWn`%UňT�/�
P�ǬE�}݅~����CP�5i��B)�W�|�#8�q
��� `�۪/��*�5H�F�(`�	��"�7K,�Xq��u��x�4��d�5�hMX^�"4���4������h����A�@#++�E��]B\
j�����u��;�Y,���?e�=UC�<1LP�}~o�����4�#_����gf"�~�,��,�AW2/�t��Ů6�BB�I�v�5@�ɝʞ�X^,��#}B[�@�r;�c���o�$����ι�����I["`�E5]�|Œ�bp�1�܇����/p���smq�-��V�o�O]��:�כ4�x�1`5�F��$�=}i���@��B0b��4�0y��%Ddn�Yޛ���8�3|a4�C��ȉ��8f|�8��d���szdds5q;��J���10r�9Zi)%j��B
j��R�NZ�
��>j*a��5&���w�9�-���z�8]\�#bii��	��#��:t#�u/���q�}1/�e��U�5�C8}r=�s<�L0�	��%�2̌���`�4���ϐ�H�""9��%�Ԧ�̉(���GR7N���6�ӮI5	�
EHk)#��W�4	�t���H]ևvx�p׶��6����<�-�_����L]�l�I��o�&ǎ��8;����%(H6üp��ۆqnj����� ���y�n6�R:��If��|�]���ޅ3J�ᷧ_����0X�i*v:� 1�G#���*��������=s�0�v�L<��M�͛��0�ib�
3i5��hR���%q������d%0$��k�E
d�������BTM��ъ�A����d��C%@�yujKi*�7A��6�j_ 82N�J A�R�KK=��4vֲ^EM��	=��Y��D�**4[C��^S�^?/D�B�k�t�~8�VU�AR������ee�ݱ�#����8�v���8u-�_�oOh�����(�$zh�xy�˚����Q/	T��d��鑲��s٤�C#��S�8|(6�S0�Ow<�Iq”2��!M�Ҽ�Q�ѫT*/@�ձ{L�f��Cݎ��Rg�Rg��|�Z�a�R��=|k��R�x_'eB���s_L�u~��#��B�Njt�!e^Z�wO��I�Z�6GnV�?^���r�׫�3m������+ZΠM`�|pc'J�I�l�!�,�y�]>
v�Y��8�&ک���;E�3e�
����c�~�i�`�0�\)�QWZm�4�Ǵ��;A�M�?ޢHh�V������N
Q�2�+LG�R�z�wȩ����&���IMU#����=+S�$��Gى�;�ۉ���
_�U��~UV���E~�`dPC1tG�]�aB:���
�\���(�$!� aς�q�v�5]���

jLT�n�5�]�T�uU�|eҢ@%D��ѷ�-�F��	I�U΋�����;w`��vY���2��tU�gT���:[.o�TJ��
���|���Y�9����C؁ֿ��l�P��*=d)�*�c
�i���@��bc�C,�Vye�b,��"Jlc�'_WM�F��I

(ʽ�.i�v1��n��u�K��+� H�UQ�0H#��tP�&t�c�)�L����V߽��'��M�ה��?e ���C}ꬪZ��D��
m�������v�@j�oѹS�x9��4���ƛ`��I����O�
��a�2�2d�R���b��`�� &�-]ߩ�q�)�$0"5҄�{�36��9�4�.@��3�^G�\��A���
\w�	�����ָz���N��]҅��M�$@��5/ޭ��e*����ؕ�%��+#%	�z뼵C�mʽ]Q��kwT�f�K��}4�5-�A5��u��$�|s���ީZv���څ[�H�,�����uRC��9��u��z��%~t�X;�7hġQ��>�ү��X�=��a�f��e\�u�Ն'G�l�V���g� Ɍ�Z�A�e�ժ�Pi׭�52���>T�V��241��_C�z.��V�M�<d���--��T�Ӹ��bI�T�qx��e_�Uh7&{5���ʹ�rweƦdG���FXWf��^,�Eĺ�*���"Z�r��D�Ur�O�.�<kA�3�RY�p��bke��~�d"�Fx������N����@[��������w�`E&$��N(�
�lOˎr^�F7�m��ƬR,��EDR�N�z��,�F$7�m��̅rU�u�f�P)��%E�n�������nnC~��e]�uXecT��Եچ��#4"��!��(��QB��\}���ߪaȱC��4���!&H��H���ﮯ�/a�d��Yk�&4c�b�m��IFZ�B-r�zU��c�JU�˨i�d���b�<�F$��<Y2��X��i_��������L��|�c���o�����fѦ�&л�s�R�7���A#��چ����$	�2np'j>݅�6n �эI����n�7�p$�vqz��w�;a�6��e���,Y���o�|����a�h~�B5�̻ͧ6��2�5�2�{�5!��ƫ�;?&'�y�T�w2��{��B%�"��ט��`�&&H�O��]{x��]-�i�8�P���l��.E8]��ޙrt;�&��ś��*^����wߤ�gw����?�z�q�����m�o
,��ŨU�eѻ��÷wwT��h/�n]�s�C�K����.-F`}�f�[�������NtmF�@n�ȷ�e�~s�$D��nx�k�cA��8����^����2p
t���2��,[��q
t��m��,S�˘�b��b��\���q/����"#���RU�&�g��,�:t�4[���7G��u�d�{A��J�� �h?+��WYL~Av�dd�d���SC��栟��tr>��h�L{�����r�ݔ��T�נ��{WG]��N�����%"�\�����fp�""�bUO�'�zՐų�-�6ڪ�*W~��'�U_"�v����n��辎��W��.+`=U%�-N\��,U�6X���e�8,����}2q����y+K�U��G�,k#׌g>�C�5�U�S~�.o�'y���Oio�ά}:�M<�n���B���h�n��i):�:��@� 2ߑ�����W�y�7|_�-�N�4q���}�}?-�����_A�2�*p(:�3�O���>Z�i�=�hg�nq��,t	�>� �H�x��ޯ��;�e!��WJ��.�����9��6��	�`�`�<�,R���;�|oO>߻�?��|6	�
�y��?���@d�Ώ3T��Y]��#�"�X��H��gk��V���G
{��X���K��O�߷b�,��R�a�V�7���:�n�X��	�C��B/N���#<n6���ђ�y�����s�y��Y����1�?~�~��d��)���yQ1���k�?B�ϋe��%��1#�;t/�J��q�~���Oq���g��[��b���T~g��v��
��x���^�q�y�{�!��ݪR_�w(�i�7AA�w7VvJ�4N��B�ډlgWX檄�m45�۽@Ġ�乎s�?teAj�����:j���O򊬆��1t��d&�,��U�m
-T,iv�gKz��^q�P�д��#��徭t=�ltK���?�yd�v�%���Xc5�㺏Ic
����c��X��px���+�a5�.�����H�6@�&2�7�D|��a`���9L_�wn�����1>x}�ϡ.�����"�Z�h�
�4�"�:�K8?��k1*yoCjF��f6��6e��(���K����$+MP���G9��.*��Ifj���^�r�_��6xWU`��:�N��ha�JͰ�؇��N,�bW�_������w
><�f��"j��f� ��@&��]�ab2F�C1z�g��d/�+Ư�K��x�l/�酥����UԶU�㩁�&#n0�#�B�^��pP���⚭�Q`3�9����?�3u����n� ���=Uڟ��Yf8�v�n���m!��H�j��$Ԫl�c���V��H���#���{���+���*i�ĸJ�P�o(�h��0Z��\pW�ڴ�.�&�	��Ԣu|�c<|��{���;�1j�ݣ}��yU�r�����"I�FA����ڬX�nQ�+�e�DI!��0{�=��P�}���Q�Fဤ∠�Q�%{���'>�$<��	�Y��k�_n�u��#0��X����t��`j�Ѭ��Pz��Vi��4Oc<�0wh^5�}����@��YS���X�˝;��r�|FK�*�~��y+��m��y�yߜ�}�CO�W�6���]]}��|kO��"%�u֜UI���lv}y;ђ�:+�f�4�����Bq�hL[�j]60X�Ȍ���-$w�߽#���퓐P����u��8��@�c\��Fx���5��Vw��c�����5��~d��$"-����.���"+Ӹ��t�6:��u�^%a�s�V�E�I����Qԥ���0P�1��P��4L-����Ģϻ���'�I���cF����/���Ydu
��P݊7��-3��ޅ�-�4G����s��g����,�����븍�sw�����BFq���>��P�!*���;�x�xb�9-���ML$�G��Q<x�8��?1�Aon�s��tXB��&�Z��	��ȗ�_2�gL3���jn��)3����!�|bN�y���QV�֜ifD������o��
�?�?qQ�)�Y."qfY��z58��D����z
���1�C�80-xϪ�����$"TiG;�Yˡ탨�ֳrC��;��!#Gx������~��
8��w
�D�6XwK�:�� �S)G����E�exZ��ȴ\�!(^�'��\����z��(}B�I�"'�';�n�`��ɵ����(д�0i�v�2cH�8�0��\��F>��"����`�9MZBJS{���6S+�<���4�)R��N�� �!T���n�dP��U����q��*���!�Mzk���$4�5~�2�����&3��
^�(����3�@"�������%I‘<��œ@@��e�#�"g/���v��b��b���Z(���f��m⳥��o�(��&��s���0C��G��H!t)B]��}� �u$?�
@��=zP���<�P�4������4�*E���RL�J��2���8�gꢭ�IA�]�!���Y^W��MZ7U<���L�+��S
�م`!��W(�F-��(�R1�P6JL������`X\a��~<�L9���i��p9�P��W>���cڼ��+��>+�b�;t�`}�_��F��������1���/���D��MVV�6^��&e�d@/"5e?����~~�a��[-0��T���샏PFf�OL/>�A�b'����E��CwTJ������Bo8~�R����G�;(�E��%�
k��n���?��a5�q��Ǟwv�d��F�@�87���`A�c&��(�>u�w4��������Ts���`}�j�{ʃ5_��PG%�q�ʥ�P.]�ұO�Y\�W�W!i9@ja��G�e���3�.f�
�*D�a�r7�ؖ+
�":l�׿g
�K�cn�K�0;%�2Pbfjx�N�t#W�ݤE�_��^�Qj�hz0G[��BJ%�hm,����z��*�.M�]�	C+J�*H�iJ�.��M�t��(�HOxk4 �䚫�u�r9��~���"�nm�F��|m�^>��dQR����`�uV	2��3*u$�z���}󟛬h�@S�Ҥ5��И�({���u�Ȝ� l�e/]�-1�6�L�\]v���u�`�j��e�y���Q_����uc-����W�+2�w�J��5�����g�>�Di������`br�/�?��:Ƒ���\{�ŠeZ�]� ��9#������|k�g�¸�b�YyGv��c�³s��1�A
1��n�
t�N6#��^�9]��ww�[}9,�����Y���P��S���g��S��Q�B̾��oՔ���>�`���9���b���t�����]�x��.
�~���*����1Zj����}
�����U���@K���er�zŻ�7�K5@lVQ�N.�U�>"��z��NWU�z&�頟�g'���>�
t�V�� �b���)V�[Z���C#�ay���ʺ�	����|��ۉ�&������e�����(T7պ��Q�v9w8��H�c��}W���ugpPI�g'��e�|9�Q\���YQQ���C���\s4���E<�"�&Z;"�Ujr=H�B�D���q���Z�V��M�:���y�D�{�C�'t:����l����Ycg��ހ��0V����5y�/��2"�Դ��&z��k�hx�H5�W<��)~$"稂��(0

2
SE�؀��mCI�U7��y�3l�V�������S�	}��5�mB����
N��:��'�Ul��B�7�L@�0H�	�
!����PC��~����b#���#�x�o�G1�L�	��&8�#�Y��(�m�g�3�6=��Ƚ%�ċ��q�MY��|�u��\��p�z����zMK�u^�G�mcUY��F�m��LPb6D�r�q^��S1�@�=�_�%`Y7]�=�boX'9��C�xN�c<ж;�"�l��"t��I��M����+R��L�ZE����9��׵���T5"<���2o��X�E�y���(t�?T�������$Q�2�fa�J!oѻ��PE�ky�z���jn��A�9�l�(�r�޻��V[�Vm?���)m��~�
"�
rd�7����o�=����{�u�Y��y����w�ܵ�3����+kRc�(
�j��@"��E%��jL��]]5WQ��5�\�54��	J�<�C�=�3'�X����z�g"1���1���IVhS�ޚ��Ѩ�H�B�!ˠQü.}��8�E	���"h�9�,�^m�9�B��:���<��Rq�O��*mH��Z�+�aw�P���o���vs�w����~��_����fƒT����lvd�� C�;��>,��0q�c`�{"	�}]�z��62������r���ϯ��\�뵯��i�L�Msg5�k�F�v�&/NpJ��*/�_7���:��1]Fq�!��&�j���6�2��h%Q���w�Wil���;�\Ufj�ShO���	��ۢ�:�a��i[v�'"p��cH^;ֿ]G]ӛ��x��d�ɼ�g����K�=��e�	,}w��b~z�
g�7Z�2��%�F�B��|鷺/mt~��X����h���d���E��K"�<�u�R섯�;N���	�/g�8p��l�A�@<2�:3���]Ll�À�K�_�K����]�ɭǭi�J����`E�)���{�K����<3O��U�п�,}"�M�6�s��q�s���;V�%t��)]������#|V�<\y�}$����ȍ��N'�(/��=�5'�HĨֈ�aS�\�U����ޜ�WE��Kl���4�v��7�R�YI�iSrnJ��v~��J�5�BQ)��9����!��#�a>�_@�H�y�zm��"���t�?�~�4�ٮ���J�b����O�V-��۸~(X�{ӣh����1�x��GK��U�L�$��lI���@�5�C��+�qG��qA>z���a��[���6NcX��%�.�����>(9���<F�P�x��'����V�&;fA3�Z�do�,�`3�ط�ֻ��Ce�}~B>[ ��� h�D�6���J���ՍNj�xu��TX�Uj��yI�K}Y�С��)�1��P?ߪ�y�����I�'b��B3��_��U�6~��%�!���朮��+/�4�֙���=��߮}�T^O�L���m�7q�SC�>�j�XKb1g�y��w!��nZ�1��%���i��"?�ܮ��w��o�khM���
w���
7{�:?�L�����f��2��D�J�9^Vn�.��d�~5P'>6`�0�0ղ�M�����"鉑td�5���
�/�x��CWHG�<\%2�FE<��L�����jg[�[��csa]d"z0�M�x�=�b�����X݈���w��8�D�m �Sޢ'�Fx�m\O�M�"|��If�o�IUṳ�
؈�(~�[[��z�1�Z���I5�4+��ո=h�D�U�U�;`���A���Y�&������f�8`3���q�+4K��W�6����eY�R����F���Md��kW��	�����Aj�x'�I����}�$�!RM�
%��dҹ*�m�M�涧�22�q
��\wSJ�K���i�a�62�/N��	"���V��	!�ֆ`UN�uޛ\aD��h��ӓۍ�T�uS�s;�M�m�T��3����fv�C,A�:I&�ږ�:p#F��>�!F+̣[Z�j�ξU�:�!��c\"�*wsx���bO��v�����3Vj��X��[����`���9�����
�	2r,�6�3F�R�6C M0l�q�vK�������E���,v�ʋ��[�~_�,�3�\�I�%y'`\@��Sɚ2(� ҫ�MZ~�h�dIEM2[����{|�Sv�%�B�2�CI���Q뜡'�
���/�'��^�C�"tn����`���[�K�4������IiUؼ�.�5��H��tmM��i��A��.Rqk۠���3Πmi�E���30�Nj�P
Ed[��h��Ve�6
t�f+T�,Ɉ�u�֍�W��<R3�q�X3�*ˆ�.�dR?���&3$"PTJ�E�Y�1u����0���g��lr�4�"��,�4d|f��i������Ӕ�"Q�yL�|{�F�=�⁏
�k����;rv�</D�9�}��0���Z�V! �i�7j���j�P�;�O͓��%mL�h���эz��i\���d;�6�حI�Hi��^��D-HY/P�&�!JS+�F��1O�>-�P�RZ� )��/�I�gIp��bj�di��B��H�&�֤�4��
�f�t�(+��=���=$��;���U:�vw�/�e��E}��K�%���H���	u#8^��Q��Fc��)���FZ,��G؃7�3�m9k��:]�ok��}���Y�0����11�#BC?����c��_�����ǜ�(&�G�?�|����E�R��7�K+j��7]x�u��J@��H��q%
�W���O/���g�]���
Ѻ�	�8!|D��K[͚8+W��M-$6z1��6`'���˛��福(�d�K�Q��k��e��s�^�	��	�Z
;q��d���9m���.�0�+a��
�#b�u���
Ρ�S'��X�uڜW��2�NZ-��QV�J�I���6�u���ї��8\��S�
��8�"��	i&BT����&�|�p���B[0\������̾�57>5���c�I�8�v�O��[�ۅ'�jݝ�C_ז����Q����ɴ�&p��+ake_WxLir�K�
��K�`�Օ��v�Pw�B�|E��� �J,�A�/�d]�]��W[�(i_�����դ���w���K�E����Kz�j�~�jU��RS����)F��p��;r�����w�ֹ��Bo����]����::A�lݍA��53�UG��U3�N�ڵ���u�G,�w3f$k���έiI�ĚF���.���;|�W[IC��"Z�*?�K�J$�$§FM:�ۀȺQ�i�/�t+Zr�E'E7�A<q�R���;��~yA�^G��#�M�)�7NhB��M�J)�~,��:|�'L�B7Ѫ
} .6H8���ob[��[�Y��y�9C�k����a�K?�zf[��fݑeT�#�y�-0�PXhs��2ߓV⃹s�B��滍���g�/�I��-�H�)�ф���m����� I�ˠ��)���$��9��>�N��x�wxZ�Ԭ���$�{�����.���g��d�F�ͶJ�.��H�|(�����4h��4�*q��&*�(���܌�Ftf�����]�kҴ�7�G9&���L��j}�������tX��:��ŗ���{B$�,��S����;���8��B�co�������Q+
�*h#���i���ɱ�Y�T���^ PYU��n&�2���,ꇃ8�ԍ���)O��T�/C�m��Y�aT�'��v�c�����p+����.�g�ޱOG�X=��轕�&�C���АD�,v��9V���o�E���ʞ��-i�#wG��_����Yf����Uz�~E��9Y�#�����h�'�֘C�_�
T?|������!o
��%1��]z�T�S�<�P��ۨ)3��~@��[1���އX1\��JjQf�\@m	��aX��(�����e�>�S��¨���4�o+��J�]�]���b�l�fW'?�E��[g�$����=��u��>,o��D�}}�df[�2�KB5͉ڈ���
SQ��k�Z�Cu�pvR��� �($�j	�m�g�k�,=�[��X����U�}٥"���m��~���8�.��\�[�D�a��o�p�w��o�-����r�],�����K�6�N�	~�F�p6�XQn��d�j�$���`
#�-��׿��؜�;$���R���eY�ގAԯ�*�I�J��4"F�'`��"d�5�yJ�[ݦ�Ҭ�LM��6��"�<x���\p�85]^^~0z}VR%x�%,�(���<O����O�(�ʵ����=�aFިQ]`_�d�t��'�t��x�=d]�R�]�!9��i�ނȬ��o����׻P����_�&O&�j�k����;0l�4�����	�b}j�*���X�A����߅��;�
��BPu|�ٰd������{�>��_�/�s0N�>��
m�_42�1�ASU�G���9���9Fk�$4M�9ξ'u�R���P��{�*���� �����U��)CAv;�&�Z���Zg�5��1��(ī&tU�/'��\�;�'�|
����:DA7���vt�g���a�2�#
�sO-}��Z粠��?��
��~�n��G�(�1v�U��ˢ�zT6���U�?W��3gz����Ʈ:si�:�>0u�X5�c��Ji`�W*B�Fya���(>�$��|mv������GՄl��+8���rn�A���6��|�Ai)�A�n=p��;	�(RM�賀,�M������<=|-�If�U�oQq���o����qqg��Tx�����NtJ�X���l/k#E���B�qv��b�nŔ��5Te��xV�?�=<x�˵�l��&��i�Z=���eöt�Rvd
�z��ġ�RA, ���t�	C��[!����'w�哳�I�	�����D_�Q�]�œ$m�u9��4 *�=� Nx�-*������PK/WUWMH.+��%pip/_vendor/pygments/lexers/python.py�=m{۸���+�N��lY��k{u��yq��f7y�l�w�"S$qM\���D��~3�I��;�V�1��`�vvv�8�f&��K�^t��yH�~���з��ڙ��yM97�81܄M��
g�;c�'S{<����<9v��stp��������I� ɺ8	s]G0�<����^�yۓ`�c�`�Γ���/��|���*2a��P��펿�x�@�t�]-y<�sg��Qot��	�{E8*�3������u��
��K�C/H'�����Y��Ht�T@�.Ti�A�u�dx�������M����!���7�o#�q}
��tg,�9F<�Ĝ���xs&`$����;v	���~�:�"�	���]���|�.��o��Z$�}�c�_����.6��Y�{:>��1�q�'LD���.]�4��#w�Fn�F�C�%)�P��:*���Vz�.��Ʈw��S��O%9*e9j��X��Y\�����;w���1���	�sL0w��{�����c@�/`hF���ˎA���޺�	�;�Ã�7o@_�z����!_�(S4霝�<;�9΋�	 ��q/`,��aO@6
�
|x���י�vQ ��S�mѻ4��<I��{��˥b5=�d
�u���荮�n"cT���cƩ0,��f����a�b|i��뼻��7�b*���s��R�tUH�*g~��5 �Rxf��s�^Ry��~�a�_n|~�m��pک�,�]�I�w��vahu�r���'?<�{1���ʋ���|���o_?~zR��/T�q�&�r��mi\@R�j�N\��@�O�-ݻ���́��!� rޯˊ�#�2�G�\wN�C����|h
�ޥ?	@4pF�xsB�:2?�&h$0>ɷFq0�N�%j��/f�� N�1�<�	^�@k}+ZXp���8�
¼'!�-��		��~����mڃ�ޠ����=p����Ӄ�?�V���N�=��N�U�`�t��OO������p��o�-=�^�	�#t����l����S�'+_Ӟr�Ku�[mlK���jNO��ý�|��N}���|s*bwH	����oC�:���۽��G�=gؿ�?N�:�.��B���,�կ�Z�Ɋ��p�0w���u~N9̙4�
�,�"�3fN��8�y,:q\'�K8����η�pj!�[Ii�aM��@�0�L6��%V�B��W?v�>u2�%�@*(�@c��0��9;a��$�g�mz���X�t��M愬֧�uH�^�QXs�8�;�:H���|���W�֝WRjs�
���d 腭EQ�A��0q/e�z��a~MZ�k�R�~�$\�,�f@TTKx	���k?�LB��UF��˩>VS3e�Q���?a��'Zz�MZ����h�z�G23NM�9,�<i�H
1�V.�V���=���i�&�a�d��I��v������>D:��M/.�9謃O��e{ƽN��k��V+/"���-�5x|�����Z���7�\�T����	���> �0�\l��J��R�@Q��,���d�.��&�R�x VP��C&��)[7�J8�)��p~�����6�(C4\^�����H���F�#[!��
c/"�d4�ǡ!ҷ�Ȼ���ҙ�K�T�m�r�ӎ��iLC�~t��v:��b��o�b�
��܈*���i�2v�j47k5�#���V�"6n���a�L<�o�����&�����$"˔��xؘT;o��͍��&�{{y|��&1^���gq	���ԱS���O�X�_���k�I�]uK��qX7
�`eu3��2
��@e�72-��Rf�Λo�F�|m-��Fb�� ��P'�
��J��..�X�ò�7����x�t�,k��jy�$��t|`��y�z�p���ѣ�����/{�v�}����߯z���������v���SLg�L؄�p��+�B�tcv�G�_�����A�j���s�,ܙ���`M�������@YF./�-��ӏ�2��}�嬲�y�T�L*8��Oc/�3a�t��H@߻a
��H�?��៊�G���4��k�ʳ�w@�F<�7��-�������v�b�p�w5h[)���)n$	�G�������1�Ki�W��@�n�%���6�ovںy�$��T��������+w��������MY�B��C`L`��<Y�6P�v����
=�l:Y�~�b��?ſ��O\��J�
w�1	�)�6;"���!�o\F�>G.�Zճ�.N��]U��yȪ05���aR��Z$7!��	+��z�1s�1�O}h���0Db�
O��]z,"(S?�2�<��
6�x����K� Bܓ��f7�1�_��e�Sۃ��Ŕxޯ��{p�sFZg]�̃�sFk��љ���������� �vJ�Awq�y�f�A���)
sgω83<��	��K5Ya5P�0���I9o�Y�v�ج��8�"ۡ��^�W�{z����_����`�i�"{��n�z	�� Z46�	V�c_���u�����2�Η�/��6wPn-��:��@q�C�(�傧T5����U^K5��]�G�En@�`C:R�N�p��A�La���&%�6b+�ܲ���)�jF�V>7gJ����h��i�S�*'�M�Ҡ���[��8v�lßZ]���	){PxNe�N�4�po���O�T�h��O|/�O�XHH���%��p�)`L�up7Q�s�B1��z`��D)������B�����>U��4����G�Y[��ؘDiUMF��#��ȥ)����l�<���ْ��a��b�\="Y
)��uֈU;�2�ɕ�BB�D�(�O�)@h�B9���QT��C3�˩E���B>��>�����9<��'�v�G��AGN�o=�Ms�8��fY�Im����$�H��{��@��'6Yy��kAV�`���}�f=�aBd���a��뗿l�cX$�7U0(���K�'�vg���эq��3�V&�\��U�'��gN�?�!�=g��z�����ST�1jB����>��rԋW���ja����ܛÀw�Y8s-8�6�n<��N�Jy�%��i��`Ş��W$�,ϫ�y��e-��,�@�l���h1?���I��.}��x`�g�q�ۄG/�ߪ6�zK�5\��-���ޭ{玳��b�E~��f^"g4^�������Z��T'��*[��V'Py8��?�5��p�4�����ւ22��"_�,���?�/|�o%?i$8JDp�}�dt��k��-��s(�ZOA�������%a�Kj�z�v�k��<��1qy��UT=�k���#��� ���+Zϑ:�Y��Fm^���|ԋ)�`�T���a��0���]�?�����Z�b'�;�G��#���A��1�1���O�J�q�{i�D8-@���!��3�f@�(n�\n#ς+�YN&Y�h�ǀ�d_}�Bs(+e\��)��0N�u�<�1�	�4�G��,�� �A���g�0#1�g�E�8�d�c>l ��Y2Q$!��"���\p���	�n�%Y�Nb�n��Ba[�}��}Ձ֕O�
~ �4��C�i�Gy=(3

y$ǟ��9��k!�Fz����0�4����Vp��Ȓ#�O┙M���臕G�(�%��ܨo{A��h�I�1�e�s5p�<4��|1O�ռaypYxY��Y��AM����xµND���Җ	/.�.n�Xlk )�[J��,���8.�\���cd��Ǹ(�qQ����E�5p6n����ڬ�k�i�9���,�盦���[MEa��"��1Z�d<[�G�H�ڡ�Rd��i/(�+|/C��{K��G2Ϋ��:z�,�_��P;�c�
;@h6��?�s�����a���x��җ�=�b������؝�\�r�L��Q0��z�|��;�U�*��Ѫe�);�����\�0i�֣���|(Om���z��Ր2��i���s����Ot��B�'�M���������s4�0s��]66+O���u]�Gϖ~�+�Bk����K��C����#}�>������m��JW�Q,����n���ǗJ�S�~�X���'W㭠�T�SLi)ʄ�4i��7�]ѡ@�[���5,��k�zdڼk�S��*��iw;��%7=�U��Vu,��a۱3�dr`�\��AJ��6��2�Uz�[w��ј�=\�9�p̡U��CG|Υ\�c��@�L��ܰ+D��'\GNU;(�f�������a�nD�%E\���G����YP���⨤*txc�ـ/լ��&Q�|�P���p�>��4����Ak���K�?<������a�>�L�i-t-^��{����Uj��V?��X����Z)��}A
eP���V��Y�qB�ou+jq�J�Uk��B+e�歖�z���J*|
�~��`g�ZJ]@�Bb~B|���i�f}TFd
�Xk���)i��~GվE�߹�ګ���������}�o�����w6E~=�V;),ì�T5�6Ej=�5VJq�:Lىt{L�$�촷=�nO�r�^7t�+�Fh���?U�ޒ�JՅ��T�[���$��&�(~P������	yO��e����yh��(��8�ܡ�Q��t�Qq�Q�C8wHv,�֣,&U�,>;Jo��ǝoS<�H�r�#�%�\��	��S�Ci�'���D'l�^d�$Uf�/�*1��\� ht�ȸ��#�n���l�>�RYj�$.���$_�=�ы
�l�0Ae�D��_��Cy݂K�
=:ܪG�/쐠�o��_���@�v�ŷ0��i��JJ�.[��5d��D�K��#dÉ�[�=a�W�4~e��識�6w֬���a��Ʀݤ�����_��U���-ZU[��M�j藱j���+~��<ޘ��z+��UJH�d������N����3���j�r+�|\;He|\�HkˮRͯ�T�I��B��j�U��"���b�����o��o���޾$���ϔ���Wt��0�j��ܯ��h������o�����\����_��_ؠ�_���.GY�b6I�	1\K���Z�6��*�-��+Z�U�i�+jN�.��e�biP�~{FxRVk@�m+�sC#��F���j��h�lP��,`�@h�Y�Ffp5f��T�ݪY@��A�+K�j�M�`�
h�������N���B]o'pM�/����2�Q�<�bH���54����6�eMk�|qj3ԭ���uE��w���M��%���ja���sC�٢�MaS��l�U .�d�x\�sm�W�^�s��>�Q��T��
���]V��ʴM���z�ֆf�
h��,��&j��m5�kU��!_P��MU쪮�n�ZS
۠��4���K��[kZۀ���F��ӼV��N��P��H�I������������P�\�A�Z+M[��N����K(U���
�I�f�<T��7Pj���liB��[!e�4*?o��lh���z�{�*�;�^r�Q�5+�u��;Lzþ���Yo��ʶ�����X��=ټ5�Հ����w4,w[��!m-������0����䐅�:����((�6�<w[�.�t�C�6l�q{c:��ZB���������e3���B:��R��v�+g��n@���}6A��P7�I8���ކ}]^%�=��S�����j�&�����2�x��3l?�6P.��4תW6�J��7��5��SD�j����W~I��#�]	��t"G��p�Y��dGH/�6�?H�Z{-t��0�h=�����+G^��vV��R�|�׭)].��i��C����=�ʮ���κN�o��2I.���3�E��6Zc�G�9�vo��q��.�뽆i���+H�7�XڶVg9�/��Q���A֛���r�¼a�\�f�C@r��[�)�|�o����:���4�H�P��7Ǯ�.�;i������Jt6�O;��Π�����nP:@�ɠsLC��U]<�V�*ތ]o���O,��+�C������;X>lW&®oe�*�^m։Ʌ~���z�ߖUE�d�/X�e�ч	&9ª�Gp��U��vP7'�.��d�H%i�H�n.�LJ�pFT�jc��k�Y��<"JK���]9|� �\�4���!Uq����n�v�^�zvͧW�V%�]9�]q���K]wܧ9>v�����.NS�[���'�v�kjHҘ�й�do��m�Ƭ����L����$�?�ˇGY��J���w&�5���q�0ǽU�Ǔ���NJ��)g��������OPd�8�Խ�>�>q���4�P\��w`�j�+��|����e��s5
%�D�߻��Ÿы
�ϼ춭v�@�59��S}:.���*�Xy�)�q1E�V�,)-�A��}T���##�'Yr�-
5�G�TƐ҇�(NK��?�S�D�@f�^={u\�-�<E�4"#��Ć`��s@��Gg�xG�C�	��-W�֧*|/�;��`]�w(��zP�C/dhjB�j�q.������Y	�oXR_�"'�~�����K��˲�^��I��|j��SQI���a,p�"amd�t�wiȁ])�h� >5wQ+��QW{91�ҧk�M\lF�%�����|IqJ#��R[
�pc	�����n�i0��jb��L�-__k|�%˓��f-̙",����~��a��ҭ6u
J�9	�E��>ϩlei��a�3�հ��Z��T�!�4�|T�*�K�۴�lS>��u+�Ζ�4�����Z(�}[U��V��UE:t�m��!X�)�����3sGU���*�<�v}�>�"kw6ho�
�!/tJWD�n|n���}[��/��6(UY5��CW�x�3�,���w�A;5��[ۉ��(�x���(p}!-uT�'>q�3t���?��y���(�ޛ��{���?�����@I�@T�Z
_���ý.��~ݾ�� �Z��`����/n�~Ko:�����>��p�5��z�Q=���a�Sn:]�a�d�1�5d�\>�=z�Y[k���8�	H�Yc|�(���x�r� }m"s}�`qX���]�'�M)��^V6#Y~a�����&/W:W;'r�['d���
D%ʴ3��}��i�2�ۧ��-@Ke~����g	Ҝ���&�Ϟ�ey�r3�`y�}Än�=�˳gusVM���'s�i�rǧl:{�K��&��]k�Y��K�C�d!a�jx
>5�7�����T�lr�����f�zљ�z��,��4:E��A��z_E�7Ḡ	Q7���y����{}�@��YA�>�@�fŦm�&��|#��6@�ʃ��&V�^��4siP�3]TJ���+���'S5�nSg+mXu九3��O�!�� YUj�mb�WRr\g��QH������N�x*��^t3H?+�ĩ�lҀ�^(�c��˄��~&��\?
. ���uA�q��c*�t�o$��n�t�/�-�,{ۢ͂��ҵ��n��`[��{Y��j�T�����t=�pe��M���X�׸DS��2X穀.���̷^+W�d�p��ܩA�)w~���fP��w��jXγ���W'/���9Mk�G���י|y���������n�
p�{m��k�!|�����p�����
�:����	�`��������Z�����6�P�
!
q��^�:O	������o���F(�B����%�%��#T�m�,���
rg	�s�*�g	
���"�5�쯱�l�5s������j�XI����/d���A�*m}��!J� �`}3�M�5 Y���_�!�`t
�qx�e|�lr���X�D��I��+�e��o�V�x������݇���귳Jmכu�ʖR�[_����*fK��R���~?n�jh�	���kk���ܧ��c�*;�_�x�3�����k��'ۛk�ҧalo�yv�l�ץ����w�jm���/�z�<p|�wxpvք;Y��gڪ����#��r^�H.�W:X�?!7�D�7ҷs���7�)�:����m����xP{ W.k��Y����ư��í�J�k[[��`o�қ��ԻZB��qPW�Ʈ�Qx~�l���efb3��̮3U����;R�<�iq�_��],p�n8Kݙ�q����B��L���5��P}r?����;�|��z�N_��V���P�o��_����x�,��Kw/k�B��9=L:kB��X�
z��f�:�)b�b�M�ؔ�ڼ�Tp�����x���V�P]=�VO�d]2�[��5�-�v�Ӫ-��QE��,W�W��g;MJ�q����WK���;�~�o��7���;~����ꗿt�H��6��̎@��S
��";��A�z�`=\P��F><1��Z�^ޅ�h��c��)q�Q.����6W�U��]qH`�A^�Ց����v���KX�m��9�`�q��.�[�E��*�:�ܥ��	�^?��E�8�
8?�����^���'��My0	�2��%�������-�[JgR�M�j��~����:1=k�ug�T�޹�Ϡl�=گq���yn��+B�Q~�$ψW�;�eV����>�����ʠ@�o՝���YPK���g��j�<�U!ix�m���q���\�m�Ԭh�DfU9Yv�W;�U�N�yo��Z[Eh��Ӗ+�հ�1��+�|P)oE�rK_�)T+��͊�f��+R@(�ɲAY��)m�\މ5�i޵�a�7ۡ�9��D��Uxĭ7���M��=��qܿ��HU������U�����/��Wڰ�y}%ۦdq��X[9I1�,�?`�|�����N�����2��3ե���} EWd�W]^�7�T�KE�>:��|��N8���C�>zA`�a+����pە�����{�x���՛go��r-C�R)Ѹ��.�@�7�)dJ�D�A�nqM�ߡ�_���K�<%�J�qɋX�T�b�D*r�\�_�^�B��w�+x%&n&����q���h�'T��� �xy�(��3]mn�7(.���f�a-yek(
�h��S7(T���<���dLD���$���`��ټ�y��)���ڂ�"g)OuJ���
�-�Ҍ7��b_�I����Z�t�J�MoG�?*vT�ݗ1�aW��؍�SbJ�ڗ�f�Z�q�1�z��
�_D��OPp�;d
ybFyl�.U4��d��a�V+㘻O�p�<"]��y`)W�锹"�H���9�R��S�$F�"��W.`ն�ᨌo\̹1���A��%��/fB�CFx�F9D��tV\���\���ҥ�c�K�Y� ����5��/
�b��&�L�bj	"�V�!�HS���wiP�s���~�O�v�?�����z�/�I��I6�&�'Z;n��U4>�ː4�QR:�b�w�g9�q�:������C@cX�d|U��Tq�)��S��ᄴ`"E!�i�Ә����@��~P0��\~���O�_G�q�dk�����A�����.�ծTI�g�� 1��n
h�6�SŰ�&�q��pt�_uLs��L�a��$��2��Z���Y��ޛ��{tU�D�q�F�˵�eD`����C�S���O*2�*۳؝เ37)�L�et6�m_
����Z�i�L(�Kə����ؘgcc~Ɂ���|�����(�_��*��P�ߓ�(R=xn�Z���pE�bR+���`^r8)��^Cʄ�a
c,�PGpD>o�z:�]{�7!�e/a�R�=&��)���7�Qk֓oC��P���ȓ��~�W�4PJ�e�9.���X��`�:)`�d���@� ���
�%��b=�

�Y�>�S�@r��g�qx��
�
�z��Q5q��D:v�EU]p�$�QM�0���@�\ȹHG�9��cs�l��5�f��O�
��,�;��,P�+!��h
l�E�A���'H鉯�¢T�Q‘_���D�"j�
��;��
h���څz�`� �5�2BȖZl�`���K��x<�gL8З9M��8�ək���ݴF�x6��T��i���F>��R��Dj�G�3I�90�rF�8'��K��p�Cja�A�
�y_M%�Ġڷ� �¨�A�W��b�rA)Jh��]kx,\A<9���'��4���Hy�,�N}�B�y���zJ` �S�4���ȟ�*�?�����>��,�
��E�Q��s�>6�}�4T��$����49�ct��lS�E�kr�ChH�| j�F�9���"���$/�I=BY��֑scC��gP<���Q(�#F\J��"N�;�>�
P2�b�P*2)C��K8�������9�`OUa�E�9��S&���W��g�~��P�r�fA=�E���Z��`z�A�B|��)\�3(��ҋ�Ye>�┱���4�aV��|ER�0Z3]�\Ht��NoN��&�z�r�i�)��3��/QBo§YH�&<�F 9*�4�n?ȯ�z�!�*��g��)��_$S|G��]2�=N䡤���<����9"��Z�p53����B��*<V��/8�P��/�n�����TRz�;������r����@�I��(
�����&�!g�a=*�P��R��\�]��T�Ō���6��ϟ���$U��vVf�����B�֪��PD�EB�
Y�^e+@�&o��?���Zxz|xpp0̾)��u������)])BD!ϩ���J�z�\B�dr?6K�:�����ߛú�PK/WUW�zHt'pip/_vendor/pygments/styles/__init__.py�W�o�6~�_A�(젩Pt��C��]�4
�l�V2e��H*�:l���d�ΰa~?R��wԹ(��_?�[&�)�3~�7�JZʥ!���}�%	ex
kՏ����FH^�z���ׯ^�@�؎�۸��nO�a���|��ǻe��f�0 o���������(M�6ܳ@�g����}Y=2�(]N��bh�B�핶d�eS��*��Ϣ��"	^j̍�o� ����s���JR=�9�)�Ҿ�
s"閡�ʉ�Vs3�[����j�z�Z!Y�������p~K��> �m� �v�2���d~�lK����rCF�h���yxѓԪ�t4k�o�՝�����Y+��fN:a���2*찕އ���Ѷ��1���ǜF��1 #�
$�4�޺�/����z�^c�� #�L�F�=1b��r"5���H���cF��T6^_�oȈV�up8`�{|fI-�[p�ǃ���!��s˾��<F�]?|�͵=�m�9������h�{3��
W��T�*����2��v�1���K��Z5,j��W7d$�*���0�{|���ܨ��]v.��B��Y�鵛=)�P��/���%N2)���a���$Z%��c!��T��K8�!��f��G>ad����������ݟ�A��%Nr�5�S�F��(F	��w�LA�V�	�l'6�Sr�Gd�.'��4�M��Zm6�ɚ؟"u‡��r�OS�,��	C��Y$�)����GQ��W��	SLx�p�r�ߙ����~ �zx�շ���]G&$���C�c7���™ ~�xJ���!%;.0.�^�M�N3M��ݪ��V*�nd?��ϣ�~S�s֥_�]��]��xVﺝ��?g�~�I�lhb�z�\�p�����1�BhlC|��Z0����\k�Jrߥ{ן�~fjg�.��X�|
����rj\V��ą �cط���k�ʬ�Z�!REc�%4XHx�a�he��I��C�۬St�`5���_J�ns���DOn��bd&l����u��
��h+�7����ؾ�gg{r���pf^���������#���Ѫ�QXEԠ�I�?��eOyT�G��R���˭`��>�p�V�p���B�\U��a&�Q�G�K-=?�6_B�1Xo�{��Jk��N�C�d��(.� L�����6�<�y�zq��H��v���]jh;P,�����ޗ�ɱ��x����z�,s���z���*��&������o�����1U~�$�����)S�)\+ۑ�؄,.S��������TC�TAE������PK/WUWv���y
�#!pip/_vendor/pyparsing/__init__.py�Yms�6��_�(3'��U'���x�L��u�%U���29"!�	I�|����߳��\{3��8��]�˳�%����E��ljn��xi�d#�co�Kّs�ޜ��p������<��j�n��̋�Z<q�%�'C�%l'b�޳m��T�&��B0�aΎ�[a�T2�Y$��:�^��Ù��6݁Q"7�#����'�t<�̕N�0�)I�x�H�Q��.���� Wp�y!�	VL�G/��,e�H��s���E���Z�b��^.�({$�6Kp��$z�_��E����	.�G��Y
rBdG����^�,�O<<h�N\i��@�Dd�47�����A�<0�&�C��:������I5ڰ��/qD�
]�Ε�)�0���A�Ci��2��Z�FT99�JvGX�ݵ� ��sŤE�"<8"���>�@+qm���ru7\Xl�d�����u�z�%�=�ݍW׳�Ê�p���f�l8��~O/���o�\�ق�o擱ua��t4��O��{��Vl2���v5S"sfc�.���Z��A�Oƫ&����l�l>\�ƣ��p�淋�liA�0����ȱn��
'�dP��+�ly=�L���-ΰP:�f�����]�&��-h7|?�������p|c������R�f�Ps
�-E��!��V�ٔl3�MW�6��bUn�/-�
�%�r1�2,���Z��4��;XDg�]Z�>�pnK�^w%9װm$�m�s��m
�9a#	���p��Mt�n�P�xr�[�/A�o��c�
z�";q@@��(�%wv���zZO%^ao�������4�:���x�~��dhR��d(Qb��|���\� �R�d{�!��>�Vh��C�c�Ȓ=��	k���G��:;"ք�)�k.�(
E,<�t\�<Vp���Kw<U���d�I�@�%c�'�����p`�B#'����p�z׀Jڝ�}�E�Ac� [e�Np�����M��i�~g���u�LB�{ѻ�G]Xg���,����Liv��iÉgs�^�qA��=����Tu����}�U���-==�m���w�L<y*al*�Ů2�ih���v�[؃�_����Aĩvn[�:��3�`��Ĩ�
��2Ta���EQ���x���,R�pl�KK�%j�L��Gz�1{�zf���=�wG.��o�R�E8iz����w@z%c��okK���<A�A��2���V��!���c���7Yߤ_j�>^�?i�:�sdͲ���0	����2��z��*Cq�ʾ9�C|��:=X������.<I�hxW�����oo(3/�8I1S-�g��,F`�C����[R���>V�D��B$��&X���X��W/Fci�uO�3X��Ԣ��ތ�$��~RI�+�4⨹R�p
��
R����p@j���
�=l�hC���#�A۱7��~܉�=ƞB�T<�I�DE�	����:��L"��F�n��({���p?��>*��H���nj�LGcD�38V2�$�'�k�F�.uM�4�ƕH��˔�d?1N�?Ư^�)H-���k��h�M!Q�X�D4<�I�$���#F��A�x���M4����ʈ'N�Ouz;�qd��ZA�5r��Ө;
��J+�^�GP��r>W�)���
�\:���_��+@ZKUH�;��>C�ހ��j���!b9�od,��+f��g�j ���h`��t!�.��0>oP�gKb@;Z��'&C�ay�X�S�>���ҍ��K[��&�$"��6q�W���=��x�MJM0��)7�aM"5�G�1W#jG����:)./(�'�RY�B�[�p'����ܗܕ��8bNI�Mk6b�L&[�U�)�舣Y��ZU������H肂v���^��G��§���9T��9tbY
c$�ʨ�F)*\�k�^�?H�^��)0�.�������5O�;*	�'�}�e��� �n��=��^���q�y���O���;?g}��V
Y��?�Z�S�1�{恌^�v��
	�!��T�=6j�5�i�V)`��LkS��3��}�Ʃ���̩S�S�_OB/�ԣ��>K/<�}>��"~������w�ñB��"�_^t�5�x�w��(f����ȨԤpTW�F|�`��&;5caxl��F
���߳��9}�{�׳ӿ��ըW[J����V���
�m9X���E�7��A��������2]���H�w8�J��x~����4��H�p�f��Iv>r���ڶ�/^�BO������;j�����-�I|Dk���~꒩�B^hh%�4ۤ��Ba�]^k�H��%��r�9�-�͇6
��n�`������b��9Ctyi
U�4A������5�Q\���4Xt�f�t�H���5w�<�Xu��<]�e���;8V�^�(%��\�/=�S�����;���^����s�%���&��1g���	�`l){u�ieT���"�}��u;_C��{mب�zT�"e+�N�b�n��L'�j�+�Ru�
b��,�Ծ��y�[���&S��Ò��D�����Ư6z����[�M�c�D�\���p��(1p1��+9�~��\Q�]ơ+��}�|)��s����1l��u��t��pG�u
�湠Le�:0�0,��MzE�Щ�ѐ��j��>��^9�K��[}ZE�h��
��Y	�S��f�A�D��w��[�m����M{I��z�\�/�\�����.h�dH�q��M�/�V<��/Z�r�8՜ߑ�,Rg/�
��`����ֿ�[~9��}פѰ!���ճ��V�]a$
Bk���+��po;��vʷu"��A�R�:��ű�p�U�}a�%Y�էB�]�6VxU���yb�ݞT2�M��1�vEQ�Lw��m#�O$���v�c�5ܡ#ܭ�����N<���b���}?iP���7���{�Q�x�ȟ��>�_�K��1��8�
Q�2��Eh��I��t@���ب"5?�	D��'�D��oL�M<��q�
a���u�my�n\}�-G���~ݦW4��bB=���g�1�B��}�]�Ԣ�)'�I��9�q�@>�IE�|ܱmz�h�:r��4+�u�'�ozSZ��\=LrJ#PR(;�eELcR�+�p[/�����P��j�O�
�z?�)/"�dn�̛Oo�!���a���} K����b5��$ύ�@Eq���X��4LT�vӰ�K]>]E	�%AR{uW#D�4+������jb�L;�KK������=��H�/��j!�om��:�a:j��<�
%�ĤH��\�4���%��Q�#+��e
ETrw������+�C)��k$|�N�9�&I��H���7���<9��9�J�Q�����PK/WUW}y}3r� pip/_vendor/pyparsing/actions.py�Y[o�6~�_��@-yǓ8�C1��5-�pS$MP��#Q3�u�H����C]���y��+���9<��\��	Y]�fVn&��*21S��*yP�,*+��ʨ�v�YV[���"��J���T.7a�ʟ&�I�Jc��y��=��|"�x�ǿ�*Y��IQ��6hE�
[���R®�FH��!"��*�{�f/~�U"�P�چ�oT�LE�캈C�	���8٣,�C[�,����I��ẌT.S%����!���X�"S����L'4���@*����C&�=�2uj
8��[N��cQ>T���e�*oYvS��p���
�u�(��N�@�K��Lq�-1U�z�y��h�"���4-n��H)"--x�@`X���E��Fܾ�	I�I�C�Q(m��y0�*%<:�2,AH�1>!�$U?�(b��FZ�"�)U�QT�Y.t�鼄����;�{�*�lX,c��^D9•ÄV�9Z��E�����0M<�{�3�m����[6H�ekL�zx��ڧ��j̨�2�s�)
"��k��j�*��k��j&�[�݈ڨ�N����=$��9�������	߼fkTg��Tng��'�3��٭�0j>�1����b�&��!�:5�Tf�X�������e�f.���UX$�w��T��z;8�L7�g��l`�!�&�������f�3��)�{/_�/^��+~�@��q��)
L�.�ˑ�7�5�f..Z�_vpȊk~���?Nn[p6��i)z�Z�p&�+��4/��s����<�=��PDI����TIt�u^�c� ��nYs��J�O�5�*Qԕx�MT` �������r�0=�)�@ھ�������
v���OX��D�E�\��Z�Q4 kC�em� �`vp@Ca��G��E�BEA>A�1L��̛�ҥ�YV.�[�2
}3צ�L^��6KCZ�E5J><����L��������Tɦ��5	:��l�L,:J��G�ׅFn�"G,\Z7H3m�eL����?�=Y�����h"�
2�.!1�<51Nr���]|�Tf&�s�۰�Sm,�$:%�w���m� ^Ç�Jmn�k����5<
����s��c�ҫ5ڌ�b�����\��2Ց��P�_,Hi Bڢ����<�6Eg�{¶�����$U] T/������ޛ��"S��V�%Ę�~�h��A������^C�|/7GHĬcLM��;��jL8��RT|�8�?JTQVhhn�bS��� ��QH�H������~n[N���Zkj㟡���#iT���7�3���w�,��Zǁ�жn ���6�?Mc�z� ;��-�
����en՚ bF%Q��?;=�+�x��?� �tI̵"�V
y���Q;�:��'���p)���	�)ձ��t��W�8�_?{�b�X�k���/�w4=zd��]�k(�L�k��Ɔ�`f��P��Z����a�m��s6F�`a�����Y�vx���"��>�3�l�WGôUtM�"5T��c�/�J�
��G4���,��n��Z�G�v� ��p�h*$�#w�eE��~F�G�B聾�(��\�曯Y���+Y�H"��;��F!�}����Y�d�U�}�Ų4���T���C���fK����>�F�N]�p�U�,N�s��(�+�e��Lf|�{;{�_M�u�v�7��]��R�5�Ն�����H�S~��!�2�K'�b>�ѡ�9���������
`.o���u����p]��.���~��V�c�;����kv�
�CuϹӥ��mQ1=u%u����n2>^�]�v9�;Y?�TA��*��+���(T<j��P��o���J��m��������zj�'F&�ݾ!�ީ�5	X/9O���C��
I�#�G`�H����_����V�H�r}��R<��v�����ڟ�����\f�*�`�S*�CFW �'*�7�0�����r	:�^�xw]�o�|�ܝ����P3LPۧ��\tI�*L��q����Ot-q�^�Tۍ0�lY���Αa�ɿ���`t�o?�mX0�˭�N��UF'����z�r�Z�e�=_�e�{�7���i\B��4]���7E�ѷ��'�PK/WUW�('!K4pip/_vendor/pyparsing/common.py�iw�6�J��d,R���Z�n�8/y/�5�m%U�H��WIH���}gIIv�=���\���]�DA�V�ܙ&Q@,'J(�8Jy��fԏi���7��Q�������8�i8f��xr�(��(ֻ6��
������.I#�،&d����'�>Nh�zQ��^xC��&�c��8���$�a9��Qb�	�}��g3/%6����v�X/c;�9c!y��GӴw4�8Gb�>]P�+6�	�%�Мi/�x�5b3ev�r�� ����f�p��s�4J���}�\���U�f_ή[$C�S�
P��c��vo
È��<�X�62��P��8�n;�U��9���u�.ewQrKl�E-P�可8
lg�
�y{�8<��š4E<��r0��O/�;�b*�
0�F���5��[!�[�2�0�̟~z��t>���*�6S
�]⃡�r��X[9O�k�Ǘ���vp/�b�K
�&l̢q��u�S?�نq�p�0*�:%e��g,��WӚ(1� ��amЍ�Be��_��A��~&.~��f��Ohb%s4e����W���.�p(F��{5KZ��I�a��rc0�8�@>–1U�t;�٬����{�=:Q`�V�G{*fjv{
D06�<��d�v�*��禼QP��	�n���'�8���t>�B���i��B:��!<Ft>sO㩻����趞s�R����t���u>�Q�0� �$���wpxt�⥉_L�[>�F4p���r|���lyx������U7diJ����;��^8��
���*��fy��[���"��X��XZ 9RP�}Q��Aǒ�+.70;��:��J��r~-%��*��=�����c���<s��
yE�X0�X����A�8�$φ
�\�L�Z�����d��mITK*�2�%�kR��R,8t-֌z|�+��,2D���A�y�z7a���� �
��cxӋ��\�`�Qt�
�*�"���(��22b�����ʴ����r�'�`���}�<�$)T�T�<J��؄��;��H#:Χ��փ<��0�
�l��f[�l?�Dkk����m!gR+t�Cl�&�Tֆ�-�bt�d)A%E���HԠ�S���`�ڄ�>�:#�ƿfw���J���P�jI��S�t��L4�y̅�
�W����"�g�̺��q��XՓ�h��Zkl��5Egj�YS\:2�`����}p��5t�����LR"�XO�
jkd�y��0u���o��V�6��^��Xa��"W��oW�س��Q;���:��Q���}j�2�����"Ov#'%�瀹�Qt����؁b7V$��zw��s-�Vd��^�s׼VrR�2�D	��(�n�ǘ����dl�1��s]��}��y�tN^&E�-�'8ęՖ�D�?+YF��H���N�R���ۏg62�7�x4�|l������|��l���5Jv�f0,�]�+���Ѡc�V=�s8�_'�U�����m�}hm�d|9x�j�ۉy2�Z�����"/$���s}md2�y�����qۜ�6�"�Z%S�	�x:���ܽD+�0�]�k��9y!�-Ԧ!2���B:ɬ����b5q�	�96�$�ߗ�����5�yTEX�=?��k�Ry�'p��]��3�D�״�~(9�<��:c�AN�KY}�ZQH?�Q6jY(q�7UA�CL0���
�j�dդ�&ɍ�b"��G���� "D�M�pҭ2��%�����貿��A�2GF'pW_������J rߗ�_��~����d���Q��#n�v
"e&�w)�N@����K��� ק���=���,0����/�S+�����с� ^��{s]�d�?~��2��[��,�N����eO�����@0��9E��P�1ۦ����g��u)D��HC���p��D]�N~�b9Q�ԍ��s�������w���@&4�kݓ���3��!�gk-B�5���^�t�FF���7�O!ÆC�[�$��K�*��?��;�󲦅�h6Tq�CcF�a�sz�$`C�(,h�[㝌��W�@M_PY#?B�'���-����?����z6���WyF��M�f//��E�!OQ�|�װG�'��7�+��oS���~s�;���?@Ov"NWv����щ���N�����s�U8�_�Q��G�����������Ѕ��PA��l��[�\{)P��7d��Kq$T���%|� 0]�Lw��&���
���h�H���9��H�R��8D�8
f�����d8�?狶Ȍ�7�-�X��j6�A2�T�e�ov:}0G�D���g6:�|�+���F��G!-��AC�HIv\_�]�]_c�_	|��M�5���ݔ�A�P�(�nO�=�/����Q��c6��?R�����W�1/3�k;rcl�^ᑆ6��z�
p�>�cqM�/\�G�B�MՓCi�C�NhAf�����(	�KtG'�o2x
���yW�'���f�B< |��V���S�}��iD�(�Qrj�YB���cq�o�o<6�O *�"TK��[O;+�O�A�
$���m�c��`WFҪv�FS#�'>�`��P�|���H(��㤲u��a�A��@�p��d��!���xy�x��[0V��1���o�T,�SL
޸	�A�������P,J1]+���)��dZ��|�z�u�U����xH/BWo���U�)8���KǼ��j
J,��Y]#C�7돷Y+�^wF*��I�rU;tZ� ����*Mnw5]�]*W�.�o�'�M�!����h�<#Ӵza�g�vV��L(,��Ϧ���ݭB����"\p�坰	%��R�ZE�܌i�(�1+[̚�MB�V�Y	wYR�J��%)��+׮G�_�|m��B{��Z �N���D�<*B�=��t��5�m�y�	.iXq�hI����k���N��"ODgٗ��I�"'�g~v�DѥJ�`���
��Q巹�H������83�3��j�b�o��ö��0Oi��J�|o���z�fM<d�/O�9&W��E�3�� �P
agQ�*Ҿ�,:#<^��+���
~;����f� ��v;�n�f���}�x2bT��s�O�V��p�=�
����ʲ^ò���k����
��$:��浊�n������^*��"f
�F��vn���Y#�i.���}o��W��;\?=�-�$��k��6��@�z	��q�$D j;3q�b�.(g螯��cG�;¿�?մ�*=���=dt\ Z��yQ����V��Vꦠ!�hn�^(�V��Eh�V�+*�+i�c�X{'4�A����?�����aOTV�7s��c`��N���96jG_:�デ��0ahk���m�)��p���ɩVZ��F�C��h_��Շ7r�B�nЧ0�S�I��0��+;Wq'~0{S��x@�iX��ZG�*�.zϷ!5[���A�=��|���W��6��2��4���O<��8�H��}���� ����3���2�U&�(e�ӏ����c~B>������q�#�����KL@�JL�^��J�����w�Qr�P����'���x�RA�mv����)�ť��7��Q�A=1��ވ7kL4��_w�i�k�+,#_Ukխ����s�"
��31%+܊T�]����i%�ۊ�z/�go;�����v �pDގ]�˵����а�9î�7%�@�:T_�D!�\�}���PK/WUW䂺S��lpip/_vendor/pyparsing/core.py�c��� ���
��;�6E[v�&��V��DW��IJ�<�JB$(!&-���o���O,HJv�>�[6�H`wvwvwv�v��Ɲh�Io�ظ��1.�)��L�a��Y��Y^T�(�m�lȏ�Tߪ�,�.�W�|��E���ǓI|1I��I�q���EZV��U<MF��*x��fC�K��&��#�nJ��A���0F��Y|1T��{�߅�eU��j�TW���$�|�
�w5B(�#�_��$߯�"�W��O�(k��Y�8�`��E�Lr�ZhMD>cL��i�L/�
 ��<Vy>�3u]�3�[]I<�&�E�лY\]M���5����ͫt�Nc�y:��� ��cv�ϳQ2���y6N/��I|Y�3��'�3�U�/��2Q�rϒ~�\&�Mx�E9��+�pa�2�/�|�L�(.��|W�@��_;O�P��&��Q�bџ%�o�R�%���Y�w�M<>.�r>�J�ȢL��Y7��?J����L*��,�DU�-fP�$/66�/�~��:�vqQ���2�G��������߻Q��;��mxۍ.URv6`O߉�a���L�=|�����F��$:�E/���SX�X�uRLӲ��Fi]%Er��.aj�dԍ�E�D�8�I��6+@q��`��P!���7��i�`��
�����@��J�� F�|8�&Y#r�q:Iʨ]]A_�։�iu��Qú�^�W�5 5����FSԅB��|�P&�4�V�D��Ɓ}�F�|���oB���/&).�;�(E��
��x�dXFs6g�L&#��ӈM��@f��J�Em__�6���ρ��WɈ���_��0�0���_�ކ]7Jii�����"�Рx޳��sOp6ff��Uy:�@�3��y�ul���^���&�,�o�=������ӟ���Ó�����<�Z{'�Ս~:<�����J�:�%:z�%���g��_��DG�����/�u��W�/~|v���)�|ut�8|yx
`O��Ivx�����?�����/O�F�O_!��v/z�w|z��㋽��ǯ�N����WϏ�����NaD�2<��?���^���~�1S��^�r|����G/��çл��/��W��N|�w��=�{����;8�TPz���Z܃��O�^!n��^��O��������A7�;><A�<?>��P�@�W��=zv���Ǔӟg{/�	V��'wc#5z�V@?��y�ϣn�Mg�l�l�i1��
<ժ�F2)��
>��З~���Q2�hK��a����cJ�_�� ����ɩ��e�-��ؑ�Wy�x�@�`�����L;�,���G�k�U���6�,��Ԝ�a�rP�J��bN*yYn	�#��^���ZD\q^����h���*l��*� �m�ݙ$q)��"i�=]���
A��'s@������b.L��21M��
�jgV��;i����C%�I>�3� �����tnE��pV}�O��l|�[ ȃ�D�a��Q8R�S+�e9O�;_?b<�c�_R0��.�/�3DM�8�%P���E;4m;ht%�gPJ����N�=*H=�ϗq5�z�e5�N��±�G'T�a�r8��T����1ll�G�x����1�z�{����U�P��R�1�G�}��m9�I�0��4ε�w����ߧ���$B۝H0����JDN��ou΅��ii j�7w@����rnw��4J�˦��Kf9,����f<�JZ�C}A/���x��F�Sk��ꑁ���F��"����Lgբ�</�ͨ^J�nN�sbW�l���!丗��#غ���k�򅉃�����Oʫt�P��]�7!`�b~��Afߔ��g[R"�0���e����
hh��[òǏ0	�_h���')��d�N�N��$£ɜLv�P���=��=Cn�[�W��_�Q���ڣ�m��� 9Tğ�%����k��Vc������]b�X�X$@Wmr���"�8/P/�"S �.E�Z�����iH�s��j]׽���l�\�O�C�N#�Yg
i��5i�:;��
dr8�p�@��j�s�(�-�'�Rx&����4.L���(���o�qUg�-�U��Ar�yЈ=�� ��E���#n������	
"ۙ@�tãǏ�!,t��k=_J�W�@������2ȐyQ���s
$C��H��z�#��,̕Džӥx^�[�/�B��ʩ�9��;��U�I/SLl����lxį�P&����u81���C���T�7=�塋����>���n¼<�1㲽��pm���Z�ʗ7bT��)���ʟ�Դ�h��6q��4ޱ��wZ����(ЛI~��-�6�W5Ȧ�D�:=�bu�ᮻ�S�<v�^{7��3���tYz���������Ro�["����Nt��mG`��~�)�eH��*�O`U18
���۝�dM�XSz�Tp-�wyy'ٻ����e��N<�2���<��X�1>j�Y5�̤j��`w4OyݏE�z����QOz��Ur�z���z�pP!��ߋZ;�iuDtsX�֎�:g;_��_��{��:)���N["�.L���=œ��qo;��h�C���N����,I��z�VOus����^�aSSF�U�a���e�
;|"3ڍrޥ��2�ڭ׿��;F�+TZ�x����+T�:{1����<���IZV�{�8pc��J�A�O崛��	�-:$"��l���������OY�4Q&�2/�&!�@���5���XKe=��Q�_������76���By��!��"��~�A<��t69����l�I�������@c�
d�"S�k,R�N��9���c��U��ι����.B]���K/��-bIG���i�L��`�ƾJi���8�h��j�.6�2,<��7�!�p���f��'��pd��g�
t��~C���r�^�76��E�]1���r����8�a�����H!�؀�3����kF��`T��)�.��b�J����V|���ї_}��o�mm\%��1��#i��������KJ��QэY�Jڋ��*{��i�>�����W�ÃkHg�yy}�VI9���9P�><��K�=F�����Ѓ�5|{2G!u�"��N��_��"93��b8�6�#�H�d�}d4=��4�A2�*l�!����&�S־
Ϳ�b���
����ePc��渓smO/FqKy'�UnW�d��hIf��}n�U&ށC/�΢��U4~�����Av��9�0��4R�]"\Ŧ{nE�ع�.�Gbbi4�6qև����@�5׭ҩ��x
#��cvl8|u�v��9	\�M��G�"�g~p�%cd�<9��/�NI�ħ/�^���@���?�	��ϧ�M���1�(z������!��������]�3/�����#�yx����Z=0���_�b#����a�lk����Ylj�i2�=�~�};X�D�nt�jվ����reyF�f{iuy�F�*�
���iU�pȊk$7tF�v�;���Jv�Jo{��~�^+2E8�U%��܁�[E���eIq
+}2ӈ��0G%7y��b��Ačm�]o�:�
�ް�7T��@��z���B�5U]���5XT���&��_�_fu�-)!T�z2��9sZ8�yx~���J����<����F��h��a|K
&���Y�\?\��R5}Pϛf�f���Pd0ST�܇�� 9z��~��L�2��j6��f� �s�D+���uQ4&L�Q*D�.�%���G)�E<���i�/��BNԖ���T{C
x��NF��
a�_^�Q>����
[�r�k/�~\�'^��l'r9�n$RqX� �F7�U<�!�O��c��W-�\�"-?fUGy:E��HF)���4<�2��)������P���=�a�<���է���)����o��6)pԠ
�G��F�EV$���v9�(V��ȿ26�g�����}���4����`�lP3�M�y12�c^�i#M8�
��yY�V�h��
���FEڽQ���%`@ȑ�}D��p0��j�`��@��H����&�v�P�
9�]\#�&�ކ����%�75 �Z�!E�0�!Qk��
y�-e����`�Dd`(t���K��t��L��a����,n�j1��"5�8�|�#B�ꭔTt��?��/��>)�D�m�{4�ܱ��l�z��ީ�{������M���(�m���˄0�I2g�{J�[`�z}�~}D6�}�>�?���m����|�~*���7Y�k'��_2Xp3ڌ��Q�c����2p���灥��3�)�4=%�ay��$D�m��
��$�s��I�l3�/8>`w@����ت�FӞ���6����@a�iPЀ��d���B|w��� &����D�n>˷�f\^6��Q�w$�����%`悢�Q��r�����௽�tߴ������#�N��A�����V�g�~|q���Ӄ>��'4���M��zS0����p�Ī{���Ac���>����z"�%��Cϱ��j	�_3hӿ�連Ma��� �tD~����1#V9���cdxvv\�NcU25��n�t��bQ�䚴(6���5h�n�s�͎�=�x�[x�z�]^�ѯo'�6
#<ۄW��h��x�����S�V��į�^�D�]�!D>c��2W����ju���!ΞG�s�%�͛�;�|6B�՚2R�iۊ-��e���'5�����ym%§=��1�~¦�i��%i,{��'r�K��lg�	���J6֣����y�A��M!� �4єE�
��/z7�.A�dֶ�^�S{Y��O�./%�ݺ+�R辔m�I\�2�m�߄��)��W��x��l�z�u��o�����mk��C\�����m܇��D�����UU�/&	4��rs8,p�N�%��g8��.l�ߺ�ݻ,������vۿ��dT�+&:����ů5 ������V�������1���������'/ahj�z�(Z�·��ٸ�;��N�ǻNO;�]��|_���LE̻�ҳ�B��b�^%2+4U�-a~E��y�s��n��1�6���L�50��1��tE���x�~�]��X���J��`AѭX����S_�a�fǭ&n��oq�W"��{Eަ���	�i��H�[yZ{���~Sw�� 0�÷tM��4�j�H�s���B�����3�ù�2o�dv_�᷌�:�yAy�LӢb�?�D�l:!��/p'Bg�)Z����I2�������r����;��$�M����5T�����Xe��X��N4���޵��x$8��E�w˳�"�>U�3�O��\�%Q��K���C�E��O���l� WȜ���>R��;��]��`H�y6�Q@RfS��4���ׯa���ް�3��N��5��>�ӗ�d9��B:��_G蠺7�;�w
�g��P�d�L�K�9A�� �aa{����y�IR�n4���C�ݩ��!�m
���3���]�5��˖cؿS�����b5�r���k�l���V"P/]��}��p�7�w��٨mO������Y��2��T4�.��NM��ټ���=�p3���-�T
�c˿'�۩��&�tH�"��erE� �]�}�-�5�h�m�s{�'���!�cU]����zכ�3����l_���8��QM�|&t�.TWE>����x�$�tyqT"�槒�.�is����١
U�n�n'�+�t(��.$펻x��w<y����/㷉y?h'���2�'4�$���Q:'n�ˏ
�
�D��2�0�C�u�>��Jo�����).��+XI:B!�%;����V�*~;{p�aY��ՈL�t�;d7j�(Т����_��hg���V�����F������t�����i]m��|�Wh�A��=���%#��?g_m?|��j��믾z�5�}��7_>��˯��4P���w��,�)�h�J�vg@we���s|�0�?
C;g8�#��3��~k��հ��;�-~Q��٥�B~#��C�)\�/�b/`+	[G*�E���ȔT�%����ILJO=��"{���P�>-{��Q}i�H�"
��P�F5�l�Q��+�ḩ`���i�1�@2h�������d'v|^�s�)�)Z|K>>1ƀFWIާ����,2�7��ߋ�Q��H�r4��T��2
��r����!���W�ȍm0��Z��!G����bة���h::=�	Bӎqt��]�zM�Çj1�a��u`(��6��7IɌg�rp�r�`����F���\�JǙ�Ц\	��ٷ��;6��4q�x˄O?򶼸��c�g:�+ B�ZX�E�P<,*Yۓ����a����
N��B�u��]lc��li��賭���R�U����VH�Y��x�iۧjUH���Rt�Tdx��zx����}ڼ�]`���_��v�Ү�O���\{��%�<K��:�������;5w�3ⲅ�v|�A\ڶUb�V��=���ǻTt�N���[A'}��c����݀}��[��������<1�c1���b)\����n|�!�خCGݨG����tp0�`$⯥�w�%ֹ#���B̨5rg��W�a�;��#(���ͣ�	���r�����a��S��TL�Q���a�p,Ct�����\�QҹviY�J�H!g�HF���t�.AQ�����zl{����"�a�n)kZ�!7P��a5\�%yTZpѱ2�i��{c�
{�8�Q��A-KM��=}w�)?�=q߸{W`n��ځ+�@�K0)HJ�M->H �O��udf��+W�ڑ�媞�޷��-�Β���>�]#O��bㆃ�����4?TV�|H1��8�$�"�3���� �b�#��1�h�s�`0ΘA���t�FYđ=�zd�)�jP��x���p+��|U������gC�1?�ư�Ã~��@�g�ef�<~��)�5e 	<����1��P���ɦ@}������g��c}SS��h�B7�o�K�Sb�ݖ�Nq�f���l��3C��=�j����\�!���9
��1��k�0����Z�S҅v#V�1�>�g�{���AG�$�%DȮ(�㋹��S?Ax��0�*q�X}�M�����\���C1�G��̈\6ݤ2�
�l"����8Sp�)�R]/��$�`��I�^���L�!� ���g��K�Y
F��eA�
%�$���@�F,�r�h9���uN�Hd�	�ь���aX<���\wR�.2
�׎���0�DIq�,JU�/7ν��$!�=%��/r8�Z�)X�-	���M�o�ƈٙL����.;���K��+�vp5��fG�)P��X7Ӆ��T�,�~�h�'����a�:hdw�t�np��N��晸$Z�$���WI<b��
Q��X��𢠰F%�_H`5
����x7��t�A�Y5��J�Gǭ
C��v�Z�D�-��� 5	���:mxc��j�+<d��E�N��N�v�����k�1\:q]	�)S3Ғ���^��
�,�G��WqeS�ʣ���o�f��C	�S��Y�:�
���=t-3z	[�<�%�̏��A��)�iX\��i
�U	K��!���8����jG	�R�w)�96�Q<�~d�t9��5v���f�d>���%G�U#k0���u����;-�_�s���Ϟ�5�V���[:� ��j/H���+�60�w�U1���r���U%ԯ��3���f�+Il-��9�U�ҲOo����zH���8J�އ���`�謺�7^�mƴ��~m0x#���]�A��>��7<p�o�=ڽ����fg|����[xN��+��?�@����ԍs�2w�^�Y�G,6S{�X����,�)�
�t	9	7�[O����Y�1ީ�p�66}��̓�psYUրGʐv���>WְG�G��+�hY�A����3
��ڹ�V���L�JpûTD��H1"l-@Q�K��{�NQ"�az�P/��]n��W�%z
�S�m�;�[]�x��X�@Y��Q3j~F���h��<�&����RK�N��s����f��\§]iߘD� �<�M�g38���P�i~?mnטW}��>��m޵��3&�rg���kϨ�8��w;���a
0~�&��D�NŁ�}U���'�-�H{�FШ�'�>�D��t��HF���^�U ������}�e7o�wn��ݪ:��"�(2�_oa
��MD@�h��`��#�Vg�Hi�m��?Ñ�/d&jN6�R���ȓ]L��@߬�m��|�M"��J�@�F�V#��w#K4�7�����N���Qc�]�E�ӭ�r���)��6�a��l����/�9��d��+�$��q��^@j�&���i�
��]�nW��d�9����&^�)ѱ(�]��A����*�"�M�[r�&��XA���3�l�ƥ��r�ӍV��f��tѺ�&�&�nH�����>��5{����U��˨�
�7�`X��՗��`j���8���י��רRN;Yκ�^V��W[F�/�2�D�e�\����h~�l����]�C��Q<7+#L X-N�[��P���b�d��l��%�N���t�,QL�5��n{��e�g�j7�^)��es�L`��ԅ�F�F0*��aK�|:EJ�uU�pG��gJ����q��Af�_%8Yz��;�X�W��Pfio!z���t�Py�4֝�s<��A��$��P;:����21F�
h$4
��;�b���P���FDc,U�AK``u�/3u5��Z(��A�W*�_fE�y��ξ℈���M]O�:�!+p�mK��+�ǿt��{��?�A�w�C v#`��"&Į}woh�T�1k&���\[8��L����V�|�[ Äs���:�k�evU�(/�z�<>>H�(��A5�+X
tH��C5XA������Y���1��"����ph@��j=s7��
�h�tePv'��h�!>�uTCx�����lOM�m0����%m�<0�mny��W׾��?n� >�elF+SB�P�Gِ��D�i1�z��F�o�ܰFs���z�
�,����&��t�Z��Hr+A�mh�-�Ox�5ӝ5hΧo��m�����sn�0�?aL�W]s0!�ŮW�ߨ�k��wk���/�z���|3{������j���A�Ss
�F�S�1�͸��2��Z�F���rfc�L�;u'R�V\@%�g߅��⧶�urQ�`��j��o%�'�2K��j���F�4��Q8�+~PC���5r&d�����ѭ��CY�+�����}���P���V��m��T4)�O�&]^����f&�#ETc(pyaNg�	��t+F?�c6��Oa8���O=�u���)�ZJ��iD�	�g'N�"L��(ݒ �C�nF�nA�>�1�qX�����$��ڛ��'-{=�h���f��q�j�[Z<<�Mۍx4��iI鄴bvE��:��'O�dZ��7�*~����ߦ�(�}���6�+G�Y�WΕ�Y��5J2�X���6diu]�A��G�Bb�OV8�=+�Xœɒ��rMq��^ζ �f�P� �8��vڵ���'�]��M����w8�n �w��Q_�fYB�A��- ��C�y9M��Ɍ�,VgF5j��-i�dY�^��n��N��0z҇�v(�>�z�٬�N�
Qu0̫d2�ȵ*��S^����rm"p^�..���ˏ�?�^�-^�W���dZs%��P�[$����s0+�Rv!q{߲϶	��7����Ev��A�<$�J�.*ɜ�hw��W����ݡ�DZhw`�'%�.C��ޅкr�u��=�F��l'��R��d�WAt�E���v�hK�^'t����	��B�%�;9����s8G�t>�.�"*�L�N�Ej4}bj�O�T�pxڍ^��������&�2��	���WP7D�w\	z���E�u���S���r=r��N����K:�v:-�3��3��y8�J����j���t��b�}?�������:��R��0�[��%�O#��h�B�=�t�}~\WP�15j�뭵	��q��m����fڵ!'�^
������MlGK��K'���Y]*}jo��9F}��C`�����p��b����f�2D�7E��,s�XwZ���0��V��Z���]�6c�������ԕq�&���<�/�A?��ZK$Q�9{)��H�0���E��Һ���fZ�ՓŅt��Z��e
kA�P�]��\�WS�
�J��y���ںtS���0C9����G�o�'^�%�SY����B���UJRܽC��:�F�Џ�XK��s���iY��ޅ��K��y�2fIJw�UY�
��%��yɛ3�����>�H�K�����67z���j�����(�7U����iC�U��Pk����
z��v�������$�U���w�����@:Lv��͋�GYF���҉�Zn�#�n�I~��/r��P`�j�Fq��虓U��g.7��a��J�r��|Z�Ta7$n�8}ow0;#)2&���"�)�n�a<�mx�U��g#%N�o6s���
=������@oP	~���Sg6��%�
�K�n�ց����S.A�;�o�
�q���E��o���(��z�*�7��¿������
EH=�oR�{x����t��9Ѥ1�KJ�����b�X��xa�����VF�l�������!z��-8ӆO���%V���	E��9g���(!��%%[y�
-O1�B=����)Ӡ�$1��8[
G�,'�8�O��Z�ę�]��O	8j[�c�n��Z�Z�{*t�~��T�0`&�lߘ�#_�!��E7ܩ%a�:��LV�e��\#,�=��&Қё�u��d6�`����@�콅�H�n� ;`����'���i�T]�U(��_�5�Ʀ��3hݽ̫s���2���B���L����]QB���=�a�/��V�1�.��>�u�S���_��!Q��H��
F�v��,[�����L�1,e�n���}���F `*Y��&��hT����N�I~�{EU�I�oS����U	��}�6�sEw����1V/�E~�C.��!�;���(q(�I�Ho�=�zI<up�梲���*�R�}��z�xÆ�s�x��q���i	Z���3�|(��$vO�鋍ZY
�;��v����ۋ0/�玩5K�ߍ��u,X�4']$�!�Hx <R[�.T"�)�U)R�+v��$�g�,6!��aL����k`:��>�#�6DG%r��G��M��9Ơ��>�`Os%%��	���b��:{hvA[b��Hq�\�.A�.��.��-��GP��!�g����������j��Ff3�G��ȁ�����64[��n�׬�k����\��}��]�=e�����<���v�H%�ZKǠo�)IK�:W����_A��}�WF�`���8�C�& H3T�Q-U��}�4_ߍU�G&�H�S��F�p�����ǣ����N�0kn�f����C���3�p����M� %�O"!��A��������轕N���ꓖcb�8�x��	���հ��-]�W9�cqDO��c���~�9��
m�t}�OB���;v86�X�2��0��|��@}qD��]�Fa!QMam�$$&k�T���Cm�`���$�_�&p#M�p`��v
2�����Vȭ�)!���߼�
�,YUk�Ƨ��Z-%M�*9��A6�y�;6�\��-0ت���ͧ�u��Jp���dE�J�ٙT�z�R0^���sBo��2j��a'�J��܅1�(����!"p�s{��ĝSJWd�*L�q�B�9r(��=�$ʳK�����RX'�<@R�M���A�0�9��2̈́�sԬ�+�% ˖R�E�(��>��YH=TQ�U�ܶ�ZPH���l��<�Ɲ�]ccC�2�YG&�S}�P�!Y{�nj���jb�����:�Q��d�#g"�&�3��.ʗ#����2�ӅZ�]N�<��C"t�W���'O���;��f�U|n����[Q��I���מqa;��
��1D�����X�a�,���Ґ�*C=硏^ӑ����U:���Z�	E�%D!�T�1�fV��8��G�
k�䐉�u��ӫ�[!�bo�q Q9�DmR���?��3
?ck�=a�:V�#S�Ndi��}�
���y���?_u�n����{s�
}�A�{q�W���V�Ӏ��ykUo���E�׶W9^��
��j����?ps����X�9�c���ĖSZ�6e:S'r E�}�k��a߰������EN{A,�eݛ6�q���i���2"�!19�.r�D��V/��z�Ni�� �Gjc��\���Ӿ��.�A��Q�<���{�V����{?�_��B�9lϚ�����w�T�z��)��8�h�g�S��Q�;&��yX;A&�v
Ӧ�#aTAN!q�(��o
�I����^�f���	�P���_�bs�ak���5
@�&�R��*��6�ӘH.�O[0e�D�JMy$T���i#�!S�2ЎF�=��!�,wEUFጓ0��)׊����,w��M(N�ۧ�HIWk�J`�(�x���~o?|4)G���v��˯���_������_����o��r�2�\�G���B�Ux��)OfW1�"�6��	���V6�ͻ��{���7��=��֫pg�@�ጛ���w��A�:��z��G��!�(�=^Q�f ���$;��z��Y�<���c6�v|
F/�1u���ʈR�l<��ƴ�g>ⲅ潤�Ro���Ӝ�1�ָ*+xծ�JUl�a���裉I�>Gΐ�������r��QL.�d1��npO��
�}n6�����;�7{ғ�u<zB�������w��y��;�I�Jb�a-r�b|�v"}�]@]/j��7Ԗ�Y�PEM��:��h�����:	��iv�$(�ri�G/���b��QnmU��Ӽb}xK��j0���F��ו��?@�Ҳ��J�45O2!��d�`�}��	�+%��~n�������Jfju�/!�ďێV�i™��-�s���&2�R��th�qU��T϶B��G�+ݜ��U
`J��d�U�5dwX��^\&F���{@F���S���1��t�:D��p(E�p̷��C�;��K�@Thk訊`�#Ɠ�ઢ7H�s=R�=�
��+�K0�^�V���g����Ѣ�%<�k�E��CM�(-�ʀ��i<J��I^���|:�;��^-��X�ȋ�=DZ5,W���KR�����#h�i�%���j��{�`�	�U~����(�N�������$�J���þH���ӎ�����fx�}}�㌬<
���:�8,���o�����Zƪ�s�ys��Qp�9�A��j�'ɞ]�ZeD[�4�(��]�7 w:Udt�ѸS��U�l�=Ľ��p�N���2a;��Z���Б�C%��=��.	��q��v���B^��Z��QՌp߈X�9_��I�'�Z���j�z�� ��h��ۄG�>hcֆ���������l������*{��3Y͜�)]��(�({+�sT�RE�d;
X�v��Ϧ#��Y�$]#?����*��E�؅d�R%4��A�!�'	�]�eCq8���N|�O�l
�����|�T*�	Hù�@�ܕ�z��g�E�ꦧ���$ٿ��A�;�d8�}�x�#�-��;�ǝO�ʗ
܎J�,�՗�v1!�8�M8I���rׇ���!�dQ��6����nt����7l��!ly��6�]�+��C���|��8>�V�)��=
u�Yu���F�8�ϑ��H�Z�(�j��8|�KԜ�A-�?wk�Nt�]?n��ϑ��
��+�n򑂞I�b�'������ǿ�����	s���uǂ�w�I��
�:&m�P��r��*6�
�&
��i���2�<�f��<0�|�&V���~�s�?�<�SZ*��z�[(`uI��sW�;���r��x+Ts����Z�t�"�#��E����I�*����JN���lGt��Q>Eqw�j�	V�:<���e��uR%:V;���{CvB
Z�-�}�F�u1}�gP�W���;��Γ��-�Q��^6�0dj�V&~ x�ä�wJ�JLmn�E�"�}>��K6��qY$I�)X�{Q�ۂ��_��ݫ;���_�X|2�"d��p��t}���㴃t�I�p3t�z�_��}��^�3"��s�E���BS��G��`�dj�ڷ��4�]ķ7�
�D4Ac�~��mS,]��5r��ݢ7�dt��YҎ�U����(!�|�T 7���D�J�١�!������I��*�WwU&�����ܜc���YZm��b�`�M��3E�_��4��mř �ʃ�5�=�5e_�0�٩k�W�٬��M�^-����h�YD�cӰ�$b�o�#�x˙�WѬ[͝,y�5ŗ:�ؿ�LrO�����9�[�v�ǐ�QjL�4m��8��a��>]a;��G&��l�?�o���d���������s�J��<z�|t7z��~Y�V��v��"�^�An��x���y)�������@V���wP�χi�w�Y��#�H.�X�
�ړ ���]����wkA�mg,��鰰�v�Ѱ"��Rw�d��ȏ
�մ�T����5�0'Y�|w�UT��mP�=��Zg�.�p�`����T(	��d��RGY�A0e�K��M�e�5y�(��⼴GoO�S��b��dl�q�����`-
$�����8Q��rT<j� A�]�5�y�n�3(r�K��Mڞl��'g;���.P�
�
M��l{���8:�����+ؒ�FD�&��:�U��+�΃��/�k�Cu�1���c;3�{.8CW,���x�vq5[���=a�Jς)����f޶�4b��A�~䜲�}�>�AkH�*�k6�ڬ�]����_������Uk�>�V��]�����lD�5�������3m�J��@b;ȉ�py<�䒽�I�u��C_�Vm�2��OEFV��/��B���os�[��E�Ү��ӄX��Dֶ�-`��r�U�SU +� U�Ar��E�2z�j��8�>,�:P8|�~�+7���\�;졯���g��m��}�Z��P�Vo:7j�qӡ�l-(�D���c0�vG�K�Ǒ�n(M8TD��ς��SB�}�F�l��qw�⤦��A!
��y��Hy'b)�w�V��ō��n��E�j5R�M�}�X3=��o������ߗ�У��	�GŲ��Gb�?+�ﵕX����_�W2��w�*�g�Y���V��lԂ�O��]���{�"�S3(b�wtx>�*`��G/]�]/��B)�K`s0��_ƥ�߿L*�:���&�J9�`E�|�
qPvY�,з����_N9;'-�(y��W�ٸ
����&�J����g��kЀ�M���J��5mQ��s[
�j�\F�
��u�gлU��k��OPJ�	>�xȓI�z��*�m
�f
jmR�}%,����?�a��Z1��A��.��{0����G�-���*Z�
���E�5<�j���.���~n��ui���t��m�l���:���{�W����ή��dM��W��0l�@�R�ϗ��i2Ґ
�D���(��]ƥw0�
~�$|�ݬ
�7���n-�A}΅"_�J}�L
-Դ�1*�:[��}���X?��5�R����Ŕ�y\\"0���C���1*�ğ�;,S�onHgdA���Q`�|=���f]�:n��dm�a�P"��Ԑ���k@,�|u���x���>�V?�oz���-'��;���F>޻L?�l�D)
��x���HfJ��)�V�uț�œ� j-���-�깒=�zk�]��f�!ق�f�N�M�ٛ^_�I0&1�����'0Ĉ�@�1֙v*Ob7>'X�(�J��K��o��&��k�Ǵ,��`���8r9�:Xgc�4�*<h8]i����b �@���m�Jr�&M�9ES���x�l��_�r�:�Z��e>,�a�{�d[;�|���?>(���==6i��Xs��`T�3�Y�
`��}C�D��U�|^!���)�%��q�9�o�Ϋr�V�)4��d�נ��f|%���3�r�s�c��o��W@�)��f�fI�{�<���A��Ю�)g�1
��ƥ��I��S~�`u�e�N7��^��l
���Daw��H ]��I�w����.M�6%SX��-��C�,�K�V���F�ӡ����C22�.�����\�*���s0%�u�i>����������Q�S{��J��I�X��cՂ�0)ch1(%��\�7���8����H������{vޥ��}X��}�%t$���	�l!��q��@E�>�!�jȎ[G�[��.�t9V�`�7$�
	Z����]x0�(��
l-[L�lG>�P���b�;ZR������
=�C\���$5�tn��f��������S�֨�����*�����s#��'����X�9G�*�=ŜeS��IH��$���� �QJp=\�D&T��5n�AI�ER�Z9?R��$�5�Ww��hR��u��rbw���/�h�2CC���aap�?��n��en�q��>�m_s9����*��iҊ������A�)��hSEw›vj^���SK�[��7�B;����	>��V�9)�����/��tni}I�.����2�S�8�g����/�3��ėI��z�{*6{�'�ܬ���^Q�B��P4t��lg��ΚM��J���R��1�F^
�w�`�د;��4��^��|�;
6�3S75���Y�8����j��#~!#�n�C�W��_��ba3��yM��f7������ C[��ӗ+��3뙫����h�k����tk���]��[*َ{b��Ѕ-�>�?�|��-t(]���tW��Y�iJ|%V��0�	4��u �.r"2-WJ�횫�V�2����2֐�����
ȱ�h_��F|�s~�e_i�y�7�N�V��`�O-�����]
~*�032���PS���;�&���#��=�@<'SlCq~^��bm?|�_�#�����7�_rD�̘�1+���۝zITU�«
7���@~�4�HH�>���-Lm���K?��W��՛�4��Z#��7��m���OT���h��l�M�)M�҂ 8
��h���8RaL��F�!�L�%yް*��V4$��{���T��%���wX�A/z]��,I]�N�����B[�SMPl�[���X7����ٓ�c�͓�c@͓N�:>1x��i%��6�W��JF%%�ɨ��niUզ��d�n��f7�W�E{�\�rI�)n$6��P@��<Г��4ζ��҈K�0M�M��-�(�(��>7��L9�&4,PD�}D�L	L]{��V�Â�R�+��)�=�dlA��dT�C%������[���j�گ�Rg�(o-��q�L6�m,iQe<��
�];��+t���%���,c���P��X"��J�T�A+���q�B�E�t�j
��M�d������S��ԋ)��K��<3��AA٩.�V�����A��!8�*i�i���[:�G"��QI�MM�g#L�Wt���sj�*�+t��Z5��c��ئ�k����97��rY��������B���,<��cN�����Ԓ��kݴu�<��zM0�CT,v�}�Ŵ�����$�C�)���}�Ɨ���s�{67d�ᢗ����h��K��6�|N)[����?l�G�;�Y�@�
鳮�'Ci�#ʩ&�Y<��-��F.�c�A��!�#c+fG!df{95��Dui���+���.�5�ZyDV�J/�I�j�E�m�c삜t�}���u�6�3;pE÷:���!�YaZG/zPzk��?�*|Fw��v���gQ���W�ۚ��w�$������oW{���K���qZ���J�p��C�jI�^��'�he0n0�\��*{��e"����au�n=tk��	E�f啛������|�-�Cx&���O��=q�$���C��Ӧ�tf{�3A���Ic����峎���h{WW��4y_�[�l���:I�o}c
N�H\#���(�f��0za�ka���
ሣD�B��
�?�����LQ|=t0�U	keJ�L�a*��H3��#�~cY,�I^���*��SaE��=+�$"�4\���M���Ɠ٭�ԁH�{T{��{8�v��pO�z�����坒p�I��u�V���u���t�l\�Rj������v���8�L����]\��O~�nդ�Ed���R���FM{6��P��;�KR��yޡc	3���˳^JA�-]���j<C:�5��GURz��:yf]��n�k,-Ƈa��m@x�6Oqy@��	�d��%�N�-|�\3��s�I��-�<���@:,r�@�9�q�V�c��8�M0E��J[zz�.J	:cx�KCd�B�����ر�1�ہ��JP�������d�L��d=+�[���R$���wޢ�\T��Q뤵��A�oh�A���S'�Ȫ[(�؛�N/�%���&:�t�^T�	�Ml�tx���|_CG�׍��6��v$C���yBcq4��!#��n(��V�2�06�KI�S��>e�3����9�d�p���t<��s��u€����g+w��NW����T�'�mɢ��׍k���>�c��$e����c>ث�iN[�
�t
���Q˗p�!� f�?t�f+. o-�D��!�����ҖD�T��%�%`
��N��2GG4:g$컇���JRkf��&��Gi6J����Vn{��b�J��w�O����vB�=�^�N�4�Z�|�
��4v:;�1�1����=N��"�oB�o&�R��Sd������'Zlyha�F���MIk�T`}��X��0�BH��H�Z�h귦ƵV�Zh��GK)��i�>F��d��)W���.5�a��b���p�w�u*v�9uu�W���E��#�R[���*k��)Q����(Xޒ�XxTFYZ�c�\�=�I�&f�ȡ~���$ہEX�$2A�|>�O3	�h�fnj��\[楫棣"�2ɔ���!2�n��{�u������8���.���������-[$qB&.�S��RM�*�����S���g=~�\�Q�*�
��a�677��<C��1Ԋ?��C�5U�
�O�X2\���;�t���*|�{�0y�(H�9���lm?�=���e��m��\�+F-$�|�9��/Z��h�[����+Pm���=�$1	h��2��l�Woi���*GW�l��eo��oCX��'���ao����<8�!,]���z��q��Z�g����G5�7Z��|F�<��y��eK.���<x�w��27&وy���19>�M�_֒��h���>}(8%�oB��#���>.7�z�i�E�;��H
��-�n#d��:'+|�!�PQ����<5�ͧ�Z�b.Ltt�uŭF���A�NH�b�ĢU�U;��捕`����7��1�X�� 
R_�,�L�K��ѫH�x���@@/��!nO)���9������G�ը(W_����6%��~l�7
�؆�S8M��R8�����D�Ѷ:�α�pUÕ�f���A�$�ߌ+�N�����:̆�o�z�����{�p&,ZSm+��i}c��Ղ�e���P�R3?X���KsҪ��|r�:��a���
�:������Dov##x51s�8`�QU�j�Y����a�h�M�9nVh%�7��V���ꅅآ�&kuz��F66�閄�tS�Me:���os�T#���`��DM�8�-��+W���j�/Q���D�\��~^��ʏHݬʨ[]�4���դ�v�.֞3�W�`�2��<�G���@qɗ\+�����gH6�0
^���V�W�G�t}�u��r�O��'K�٢o9�c���TEUG�;�'eB�c�a��P}QO!_�&L<�~ x�����j�}b�Mw����*Ɠ��~�w�����(�,m�s,��u���Z�gI��	���@��-���
�*�^����Ϫ��\�|{���_]`'�����6�L}#&���gq���g����Θгu����ãW;�:ҡ^��Z�~�#<�[�<̡)��D�wqt��tni+�q5s�hF}��C}f�>��=ܫ<�:N�.��+{`U�w��w-:f�ػT`�amT����:�gia	��p-��إ�
������$�%���/ø�A��sEs�����?�i���$}�-�hSh_QG�e����ĺ�
����%U�X���L�M=cHg���x�dMg�q���N��إ�"������x��F?�.�_��N��F�,��,�Y���w�^��eiYf���*%8+�x	F�m���O,da�$t�E�@�&5e�B�����	W=�����!�fl�r�lAO�W����S9�E�	9}�6��5YX�YޑWy��M
x�]��k{t��6�d��Y!��UBA"�@�ǖl2�/&��[�=lqv̊��y�4��/���W����_�l�qͳI|����P�R>��Nc�֚��n�8G�9]=��`�ٓn��ѳ_�0?�����/����s�bn�ݘz�+4�p���e>/,�=��Luם���N�h�����V���|�`���
[��F����09V\�᨝��\��?9�0`�o��G���O��^$�)[ץc�R��V�܎�=�gZ��em��ɂ/��Ȗ8L��P%O��"��&�g���C p����KZ>�9T�����v5�><E�b �ׇT�|t)}���\8��ȜD��`b1I��7Ϥg�9�ZWhU>�>�,�8�<�Ԛ惘mK�vmx1��	?���/��}�@���0�ص���d�}>gv��Fޠ��·n��~���4��N�ֵ�-���Mw��g�6��+���j��F�h����3�c���ҝ�:����{��n�+�0��;ە��޾�ܗ�|:���"���"*Y�-���O� �E�/%<C�B�_D�6�_,��d�M�=VUf��Ow�;�{�ע�+ė���@^�	�o����u�%(eGr�2��m/�^�D;(;%�u����)>Y����t�k�X��+?
(xssP�4.���WO�J#����y���#3 ��Ƶ�k�-�������Ғ�ͯ_�[s��M�z|���5?^�Hmu��@OO��x��1]�׆��9�7�&���U�?�xm(����W?��O�C��`��F�B�6�e�S�� �H��:�	����+��������@֬]��k�[s��C�s������u����z�ڰM�ȼB��.���*��j�l�{�ѧ�[
�u�ֹ=l�����q�nb�Е�;�r
EZ�5�60$�ƒI�x�4�IVx�Ԩo�HhϮ@�3L˜q�B�q]��6}�i庨�B��Ns�b�ؓV�"zԂ���^�+�
�,)ڨ�h�Q�#A4'e��I��?)�R}�.!�������LgY�	.�-z|i&��\
����(j0ǧ$���*+8��n���讛B�EA(Ūz�e�U�������}�l�ͯ��}��mh��Y�e՛�33��J�]�*�˺���&�^�;�amufJЕ�6��Mx��^�����BP]�t���y;`�ֳU�����iԹ�t��4�#�t=�A8�A-t�&ܘ�K��]Z,�D�>�lA�@A셏�ûFiMQ#�w4>ŀ�A��j��$�KC�r��G/��h����l��M�_������_	
.pr��Y��6h��T:����Q�Mv��� K0=��S���i�`�s"��0P�ӯ�Ƨ��
��cF=�[ 4�V�D�"���n4ʅQb[�Ғ0k֫lu�����YBh>e$ctpX~��D;����*8���+���jӋb#u�e�y~���<�D�˂贰�L���e���P�_�+Α���>��^��UF��4�zC�a�"ۄI�Wίjr�y�Q�:����'��+��s~?Ի��ȒkX��I��F��̸d[tu�^�xo�Ex'z���E���g\���P(�H�R��<2k���/�	��s��"%����o�j�K8��b�D�h���~��i�lp��l�!��r�EyL���Xz�E�n8@�V���$��mB������(��衔���U4kq����|l<g����@q?ii-�ѷX
���Bs�	�/�ʹ[r�ɳ�����l�7�+Bg�ϟ��>�>�P6�$
ŏxs�#
u�R�JOB%����&�$JgWY�
�5�T�:Fռ��i���NQ��V���,Jh��ėKu��:^��1,�٭�����\l�'�*�K?��'�K����FQ��',�%+p��:�.�-ٸ)k	�i�'�6��x*����WK��4��>04?7t$�ߜuI�J�#G\�g[�E�һ�!	�"b{��+�6Ѡ�f���[��΄�nz��M�7,SAO���Q6Y⫞����n�;/��{ӵVl�����n��.�	������Φ��7ąPF�un]J�3φVem
G?1���a��0�=�t��� ���nH�V�,���i��\�U��Ԍr�9&�6��3�g�)k^���/`Z���;5.S���(����.2E�u�%�=ut��bh�S-;�oKxX�:|��ἵ���?;x����_~���Y������
Ɍ�:?�n��
��!xf�,M�i�g�!�i$��ym���z��	�����!��P�‹Q�����.�j8��r��R�*����Z��>������1Q�O��6�(w�R^+/7�MѼ��0�*����?l���-�Q��2��Y��#X�
�bo�J��e~��t�0��3>I1��e=����/�M�uz"7�\�%�vB���šf؜�j�#�уH"����m�I�eV
�mv�F�Oxߪ��y�Fce����w7w��
e*���;����`cYO����
=�,��	�+���2�GX��<�;��]g4�HTiDM���
,^��������D��;�Е����8��ב�j��n�{��z]Ə��m���,M7��"��z[/���d��r�/������,�Pbp{��Sa`ͺO�IL�~+2&� ̮M�o���Z�-���j�'�W�R69C�|Tܸ�J%�GN�i<�Q�RQ+l�5]vKC�y
K�T&[.���qlK�r����HT�;D�&(ܺj���i�,���&�r�?���g�NC���t��h:ڶC���0s��G���*�R�$�
2�7��ifohظ�<苸!i�F�kt+$���u�Y�%�)�c���OP�\i���u��S��l�G��zYw+�����*�W&J�5���{F+�>Ϟ��f�V�e�埦����L7�%}�]޵��jŃ�]��!�g�0Hzʡ��?_��s�Q쐨EYZ�7�B����l��z��61��vp��壻8�*��4�/q�v�����ꠙrt�Җ.CԢ&2�3;���&�_�mQ(/2��p�mu�}_�L�U�u���mm	E��|����c�SS�uܒ�$�gT����
-I׵�zR:�U�I����0�4�2�H�J�FY�T{6�݁�ؖt�6/9�M=wa#��9�5x��N��(�is�_���t��Ik&��;P����<�5D��-M��a�
��L�џv���Z{����{{���g��zZzS�g*��}��<�<�F6�06w���o���B>�t��<�����C.PبM�}>ùض�vE�3��!�z����7�M�Y5V��)6Zm�Ck��O9r~6��}x󩐁��t|ٍ�^�v,ۯ��O�4�V��_Z�9&�v݌�kg*�	W�����?����ȭyL�O�SL������־��֦�Po棽�L~K�?l(f9�ؼ0n�8;���R���;�F3����+J��=*V�EKx�Q�]
~��b
Zca��tj/4/X���ƽ0��Qq�S���c���B��mKj;��sW0^��-�!����!u�KPH1�!�[��A��0���t�A�
��!*�9TN����#�G�vކՊ���˽���D�pK�3=�l��)�[y�R']Gi\�N��T������*� 9���D�P�K�;�8W(V�IY�0ϒ��Z0@U�J�Q�?C�6x�(g�-���c|oE8]��f����vlj��!������{����Td
h��>����������+(��1��D#�V�S�@���8hg��X�3�&M��9HNU6���b��"Y�-ȸ� ����ѩ,)(��_W�s���ж!~�|�p9����9�C�K�j���%�L
T��}
�bM��v��&T�I�R�T�Y�Y��
N�O%ۑ��B��E�r0�S�Tм1d_I]�܅�lJ巂@��;�׹�f��o^��,��2�m$�qn^I��T8)o��M��K��Ԙ�X������$.�[hA�q����j�
�;h�vݜ0T�b��l\��#b����yt��E��4��I+�O �e�P��hM�]�]�P����H�^�8vVTq4"��tq�W��N��|������9k�lXK{su�#����M��Yn��S�)����\i<��6K��iy�l�����*���G�i�u���!R�y�`�O`9𞢓��L{�/������o.�j�>��H*X!�`U��ʒ�~���ï��M�E[:#�\���|:���ϫ���l�
�=�^�MiKZFb5/�$.�0XL/r��D�^9,���1|�PEeC745�����X�˺3B%j]�N���ذ����a_�l���~�1K1\�er0��D �s�e~�w��J�`y�I�	;�!jk~�����P���>���ͷ-
*MO�$��-x�	�-w��0����G��#)rR��B�xud�-���� �X�����F��U^V��n<���zH�D�d�o����t�q���N�@�c�aD��';[��P]9�ps�i��=֭,�N�o�����^�\4��4�W��%nN�ͮ�|���R3f�R�춺�[h��2�aMK�d��Y��+8%��s�5���~s�y]���M��������s����K'^)��\��P�|��J�j����S�<5��s8e�3/��YG�'�@ͬ8�g͇�&��[j��W]QC���b�xkz�6���#�(���3gF]���c?�\��F�vk��cky�Pc/������sN�����CK��[�H/���X��S����@`��=_R6�SuY��Z��176ZG���ቕ�~FO���X������%˛ń��""�p	G*�d�5m:N:�O�-)CC�$�ͻc��}Ҫ�~'S�H�
�	h��1]�n
_��m��mx����H�����iw?��|���83��o�J�~�R�e�/�~��:�p��(�Vph<�]�����^
�߻c���Uֈ�Q[)�`����t� -��Bf[.��EW�c�����:ee��r�'.�m����maO	.�b�RsL��p��q_J.�"�%%p�I�N�A]r�u��?�'�x�m�}
�~�w��vHM�E�|��Φ���U��YBz�ֽ��k21��s뇪7��j"���]{w,��ƭ>X>v?lnڤM����e{����dž@�˽��;�'Nq�
*V�������'F�Zw��q�r���_g]�͊�:x�Ju�|�i����sK݀��<6ˑ���fl�z�\�i�V�ڂ��*܋��q$�q����M���U��8|��ai�䅳d����O=�IJS(��b�zs�y��ͅ7�`��GjxTLJ
(�`	ϋ�=N �M`bKvv�a�,.1G&"�|��/����n�SBo��?��^�#��X�+��o�F�+O0¢w8�K	Śco��]��%�m�}>�U�4��:��:�j%t��h+zt��1�Z�<��s׆[Qg[��tSj�q망�q7Ѝjo-�j1����D�a���H	 ʀ����'@R0˻ua���p�+��z��Ï�|�p��rٱ�k��<��i�5�I�.��zK�[#�M�U�A�\�[�������:"��f�J7$�1C�����.R�T�PZ/�o�n�4w}��<ɉIU��21�q�[.�����ȯM+_����[���qA�9Q����*	x0�7κm6�<�'Q=��3.F�Q��*�r�lm��Ƣ��(���-�y����Q
�nT�NY����55�d�����-*���׬D��L(m��L(i���U^T[�y%!��8m�R�v�;�[莄�/+&p�@�SJ�čB����oƿ���VkRy��	�4���M!�Z��y�Z����?�e
�,�c�}��]v�S>
�B$n'��%�-<n���ð�d&'���,�@ӝ �9S� _1�`��2���DMҋ��������9���WU5+w���ò7�������>�(�bq$̉�d��}hݐu���)宍�Ak+�?�������X�	pV��:�U��\$���x���ĄwN�
p8��a�d�2��u0P�]�sh��R�Aq4J��@���"��r�d��05�N� ��t�G��ka|V�
F=;�����S�H����a���<T���=�$�d�)l^�E�����ߌ��q�߁��H�4%���%�x�_�4}��yRҙq���z�����Q�C٢e���߶Ș�Ev�-1��[8��xK�Y���b�W�|��A�ˏ���?��ٟ�ף���������Y~�����~�۟�������ɈC��:4Y��אr�U0F�RL�iW�"��'oF������SX�W�����`/���K��D���CQAl�&W61��~$��%��n4������V��g��=����_Ab��D{��<�d��J�	��Z}�٠�/�mwJ�t~@!���:rZ\~��^,���	�u� I�D�ⷌ�I<^�K"W%�x)q/���z�kTcl��<J�ڭ��E'Ib�]��$VU�/�u4�&qۉy���
y��'qL��K�,��Im~�Ym�؟*�߸�uѓ����J7k���[���T�.j����lS6W���j_���,
���o�#�[�
��v�]�w�P�0�h�7L��WOmy�����
�S �w�����S��&;:��i��(��	�i��(&��H>>�ۜ��k�f�y�����Yhz���{V<MpTN�_�D�l����!��4�ϊI���L�2D�:+4�B�\������5���
-5�b�'�6j������	��-K%b��.+�r��{eq9@i�$ƺ-�I��������z�̶m�)
~�|Mo�~��o�3�Y��d��\��):20��(V�C��rC��m7z��益V��r����[���5�W��TX���vVld��ڧ0v^���)���㤮"J��l�`3�L��P�r�Ύ���D�[Č����ߎ|�%G��X�4PS�-ʥ�[ԥs�C!�n4 ����(��%��\���{w���iu�CE���'o>���h��րz~��v�j{gJ�Q�
z���0�2j=��~b
>������6�$�z�2�gH ���[�4%Ѷ�%Q��xfH,
&�BW�hI}��
�I6ny�*�vO7�-U�����Ȉ/�	{T�J,����#Q���y��΁��C#b�({q��0�ɸ����L��z��(��-��I�l�E�.��t�����m�taB3�u�<}�JT��D�Z��-pC��u���4���An��A�ڤ/��x��	g2����@҇G"J�����$!!V�z����H.5���V��"��g����ʾ)���h��QvH���
�2i����S����LB?[,�(pP����^e��EFQ�����,����NJ��k
�˿<i�r��8=���Uu�+:�(�mC���� -h9Ӻ
ʎ@jH�tJ
�nSZQ�-+0���~�Lo�����w3
�(M�3�L����d�;�mOL���!�߂�oG<��d~��cD���i�x�d߼�񔾑�����0��\�>�W�}pXF�Ѵ �h��k�u�R����0i��<��~6�mOw��]/R���N��^��Ǡ|C"^����4�&?�u)�:�գ��P�z��{�3���
�d
YbV����K{<������I�{ikM
�B�>R�Mm���b�_:��@�9��io�@�,�9��S�sH?��gA?bb��������y�)v��U��U�����P{�M'�ue���U��T2��Rn{�������eY�ǤC^,돿���&��Ae_�FEz����<�t
Z�����wj�ݐ�{���7Y�݁�?�0g�,�D�2!I㕳L�hG�"�W��V�tj����o3ށv�%,Gf:l��\��9�sL�W��UMq�uzBZ+,r��o,�Ƶ������Q����12d��f�fZMu�r
gÝB+6��'�4�M��n❌F��ܣ3P��T���������~V�ګ���ӣx��7���R
_�I5{��V0E���e)��J���J���\���t�=s��h��@5ڝ�N�;d��Hl���{�ʥ2�}�B�Ň��pz�^
��neQ�S3�/X��\wAH
�[ݶ[]����.��^҂�?�jR�q+���;��DP����IhQ�h�������N�a2*Z��q"�:��v��>�vw��9�\_���-�PKq�[���~����������'O�;k>��^�R6�d/
	�v��x��H�UMFOI�`B��f���w#�p>w3��Ǒ�����[d%Eq�B�;]�$���;=�վ�T�>���FQkz��/N��6A�l�=H4��ZQ�c�z���6-�h�%�v_�3&���A���u<�8�4�К�3�;L���t����TR?��;���-� �3u�%\��V{߾�]��^uӮkt�F ��FA����ZN�h�<�9�|������`J�
��1��7m�wi�a'��L�-�������G���v#n�X_��+�&�Z(��G�[[v�������>�@�3���oЈ"��Pw����G�9-�M6c����ؚ�Z�W�Q�ʫ�)���
�X{��3�.�n�ΆV�ܤ�)Tݤ�imn�Lyg
�w���7�)z��X��/q,�t§����t�ۇ�/a��z�3�3x���9��7�,
���?Ժ��j+''S'��_dWa�6���������n�e��d�X-2N�M;<=��ݚEG�^�ӖBt���ߎ�^�|e�	����XJ�;��F$'�Q�O��R�NM�x`b�M�)�"� �'%��.ǘQ���oH���x�㾝�����|~ ���G'�%"3"�Џٜ\��U8q'YJ-�P�����I�ō�<�&��O
���F��4ޕèlr�)���
�RR���!���I���G�:�L�t>?B��b\v����a���I���鋍���F�uU�!�,��o��A~�$����]K.�����7�x�)�a��ծ�C����㒨*����LR��_jt<籧���h�y��pi��A�HM��j�i,����ܜ�	��{dq
�ck���s��Ӳ�a쐙�V'���!Djү*�;_ j�C�hRT�G�/��ި���6>��<kM�-<�U��H!��ӊ�,t\�j4�(��@Q��*����ٝ�UP
�ѾT�R��L$@�}n�4�ܻ������57�W)^d9gP�ϋ6���
<��Y�!��2�8{�,
��FW��λ��J��%����Wv#�Q�FDhD�h���8>�61?�Gp���9�:��	)��/	�_�38!�>׹�~x~�Ԅ�sZ��7��nҸ��w�x�&+�����?��}Z�Ӈ/ܧCz���v����Eo�=�]l�
�;��������>���~�o�(���g?>y�����?<�<x��b�աW����>x���G��m~����Mu
��U�+����������)��n;|�bI¯x���t_3��?�~qP��J���^�z|X��o��+S�S����J�R������O����"��<M"�dg�K~��i���Ǐx������>F�h��.����-�`ˑ�]ٓ��w�g/����䊁�-���q���F����^�h����ۑ~>�Rq�y7�m�y�2�ҷ�U��]1e��d��҆�$y��>f2�4zf��@�p�����eJ�1Dwܪ� �V�ܪp�j[�� �=�`�$�9B\���eK�|�	K��C�*���i˩���C���T��E}ʌ�?�A�F���5�yzFp1EF�e�Hɰ�F���Osb�ktJ_�� �����[�s��ǥ �~c���q�߶Fnĸ��tZ�3'4)7���c�̲�0]54�11�	��C�jK��.�J����w��$�7�a+f}:�D�p=�Jڣ��}W1��0��+��9gjK�%���4��1堑z�n���ݑ�9�˙O��Ǯ�	P^"��h�zj�rܦ��5N!9�Yv>�N�)%%_	D�kZ�@:��#jcW�9�f�X?���glw2���r�t�
��Hv���޾)}�����<_�SB-L��G0��Є�	Ԛ���|�ê�=
l�7�Yi=�Q9#�N�4
l�D�:]�j.�g\&Bb�Q~�P���K>X"nD�k�w0�S����h
LlF(B���=��l(��s��q#��i�6nq)�(��Sl[�������L�:�H�<���X�.~�,��1��^E�ՎuA�3}}!7������e�_�������*�g5)xs�j!�9
�O_�+��VV�;~z��U�M��/��OMi)0o��L�����$��N���A*	˨i�_9k.WA]{v�	]�p=!@o�D�gvk�S��Ͷ/֮�@7�
6u1��Λ� �/���F��L"<�����m�����qJw2�0;������9T�7:j9��!��V#�y�	^l��K(�慎
��\�t������
�>
��=�cת(���h���_���v@�6�&�1p����2�eoҷ��"�(�,Z�7ݢC�Rpf��� q�哠���)`��v�2��(1d/�х�GDX�X�F1ݢ��v��ۜ�a��5�t*T�k��˼�s‚�ѝ~���c�'���Y<C3��t�l�snQ�y[V��n��<=��g�Ͷ�̫I�K־����3٬zFb�_��O�V^�����U/��"���� \�ֹd�CJ"����+|۴(Г�x�2Ů:��3���X�w\�o0�����R�g��'�A9x�W.�8#�����m��L,ve���oΊ����$8T˗MF�w������#��hk�6���Z��߰�<�g�
q�qi�}q��B�J���d�k`���0Uj����{:�3�C)�V�Bbc/��,��Fg����7��EЭ`^����ǁ7��ßpk��
�P˫�Չ45��aG�jƽ���폠]01�,J��+$�8��u�ȸK�pO�[���[BƟ|o���ϋ�����(J�K���z���RYG�V��t6C�(f9b�աL"]��Y�J����m��T"��su�� 9P3u����͡�h+��Hٹ�$�qe�@�f4}��)]4s�\0�s�������6�ֺ��tB�颮��6�¼w��"	"���v�C�
��7����`������m0W�]�h��\NN�;��Ō:1TzS7�^�����>�Y�K�ni�%�]�ΰ�k
˒�ò���F k�����Z�z�:_����̱χwY:�S�)�z��P��x��Ac�
j�wص}�Ud�H��D2�ȵN��$�,�Y��O�aK��v��v'���6~r|��U^�S�V��Osa����/�R=(�YZD[��Ev���U��뎬M=!��
ookX#��y	���։�N#Ǹ`���+nT�+���D�)9��W
�k	�Av�8_vt�-�SbQrG��`�$t@^*�8	=���@�ye^˰��j�Z6�����ᴅ\t���
�?�pV��9�p�8����[��l���$�=l$�rM�2-P�Pv�g�p���N�.^f��,�],Xw�������p���|��<b��'����������xo'fP>� bU�i0�|`ttҶx��++lA�3�h�0D�~���::��I�[���=�l�,z/E��O�H�����I���3����Y�2�P���x<���K
XP�7�� ���-�䖚
H>�X��M��1�N�G@`���Q��&[-Ed���3����$�(ϥ����'E3`S3��V����:&�땊�Q��b�?��q��4����N���vD�8DQ�6�Y):�=v��u*�����K�&�����b��E�΄�N�LS��ލ��l5J#�1�����|2�~6���j�O�&��N滈�C?�$����Uo�;i�G���=��U8�w�nW�BZ����Wqjv=���LO^d]��It<��='ު�x�(��a� �u+l^@` �&GIQ��0���Uར�K韦AP8'��y������MҞ��۴�u���$�cP�� �iA`H=�γs`�E���%�RB�k��,�G�7I�	�Vc4@(tM����H�H��u���YZ��`wY >F��r��!(�����A_x�H|9�g-"-V�׹��x�y������m��<T>E,���W�8XL���U��=��5;P���������2KE�y��1+�<���,^���Q�\�p�޹����8q�ˋUs.9�o�&��p^�f��i�'&��)��R>�p����b�]q�?Б��%�U�2�o�=���8��r�����7�沷~�������[X>]`8���:`V`w�I����t��L�'u�\�j��pǎ�{�?�2�qDƍ"����J��a`����r�d'��jzGS���n^|'��2�H�m6\��kwD��N��T�/���]��5���>��z�y9�µԖ5SN��O�dIRQQ֍�z��A��+]�i��i��3��h��M���g9�0���ۄ�Gx�V�p�`]KPf5�3�h���+O��r�qQ����\o��S�=��(�w���=��yUo�~J���zU�Q�Tz�cFh��z/���s�#A�!ȗ��Q���b��F~:'<x��]QT���`�&�F�:�Y�c���?�70���yf��밵୅��F�PN���8�� A��6z�[x�r���sʡ�7��/�fS��`�3�Q�m4h�6�o�>g0\���M1<`Kh�S۽=�4����$�;X9����l�&0^ΐ��G��AA�k�$LN����5}�cl)rt�)P#V�bO+zpq��
j�U0a�i�n��i�G?Z�b�y�GJ�X�[٢f�k��5��5�}�|���"XT�]3�
g��Dzx���9r�iT)Y���0}Av���c��M��6���fb͞C'�̭*���8j��0���Fq,k���M{��e���x ��D`x>��ڠq]s��!H��m��4b;`UΑ����Tӌ����f����U��>���(�����t����
'^<�Ւy�Z��4�*���C�S�z�^��O�f���z�>O�"�D�gn�j-�F3}m�gG��W���'���D��Y�|^�gGG�[Yϱ8Zb`Ta��\��LO=Ý�+���|�=�����	��1��K" ���L�Zп3�d4R�n9��g��!�z��O|ݛ͠*nI�i��4�GM{���\EM���6<��`:c����� �΅����U�h�M3FG��y�����o7�������&��v��J9��A�aLx'i`X�Q8,�/�]�F4n8(�n�¨��n��2�mُ��~%�~�J�����/�G��Hn��K�~n�ٔ�j��Q0n��;,��YMR8F�y���x�t�g&�ᝤ�E���G�fRJc{�nr��}o����o���>jB�&�b�����C.;����~o��N���!�k�X���ZKv%W��w�,��Rx9ӱ}B��"��N�`��+�pc%�*�ec�4��o� 3!��	Rmn{�Ef��@�ꜻ�a:�J��P�Is�ѭ����lf�ҝ9*�����m\p#ɳG��s�{K��Ӹ�0"3��դkLHU*z���
�q+q	2�Bv��i���d�և�v�Z��E���a]�>е��hz���K�r���X��'b4l��ѫ��`��i&[�(k}54a��A[�rg��2EB����+%��M^̕4�V�r�)�P;Ю��S�Z�"��0�p[U@N0�ʾ\A�%�q4�|�D8H�G�t>O)Ќ؞{�LF�o��y�Ahs:+�y�_&�t<���;y���:tTKK��Ev�[��<�xr��6��H�+�&vR��;6&�<.
�Ȃ��6�w��ɮ�B��L����K3c��t>z����)g%7VɳG���D��酣���ȝ�lj:����e�C.�	�
���m��M���"&M��)�P��P
��
���3��Qp.�j�A�ȕo�|ɮ�J��R�Ib--�.�RK`c?M	���S��Nu��2��I�#l����������`�TK��X�=�`B�;G!�� �ϒ�3��,D%�b/i���t@!���&ȯ"q��#b��|r���&�Y7@?t
C���'Ƀmz��Z\R'�$?T�xV��]3�4b�/�3�qZ����|Tt3_-�@�=�@m)s	��g}!�h\B-Fcܥ�Qp�p��&#A=U&���H��L��L�3x�cL��N�|���Z^4�¡���e�K��B���L����;��yuzs.�,����v����B�zXT+Y��'�]#�yݣR���>���X�n����<]O�U&֦r=��Ռ������ϧW۪�J.
K!�X���f\${��Li׃�NKM�vՑ+�Bj6A�en�m5�2Q�f�R6(���U4�녊7����)�{`4V��zϋ��.*�(�](>�}B.���g�  �w���;�LDs$ֳS��|O�O�t�	�qi��|p�(뒻�%��C�`C��z��l_���S��*|���
P��{�����ǹJ�?�}��:MA�&�߷Ψ�@�-[�1��?��-{@z��i��%qi�#ܒ� �ê]|�!�}��#���ne�,����
F��޽�T;�����v�~)���E�u�����$4�Z��ce
֊ګ]J�/%��+��`�v4X��)W\��?�n�:�ܼ��ÿt,�ұ�ۇ��XB��ұ��t,i��
ڕu�:'��p�d4���(�2ʿ��C�]��e���ˇ�Ƌ�G��g?$�u����O�/�%��>H��~��|�������/zf�ez��2��,�/��z��A��񋇐�Ջ�@��|��"���?�8|�>|�-R�8\:*�0��%P,]~��ZA��,��r��hid�w���4m���F�ݢ,9�:M�~A���vό~�*?vv���8�!?�¤��3��mSx�>��Hs�*�#sʢԢ� ��m����g�#S�к��RE���á�$b:�߬^���p6o�ni��r��I���i-h�F-tV:
k"Ӈ{Xf
_����I�w�b�d�QO'_n��0�9��[�oܬ��g<e��rz�R֝��=7�_�J���t��<4���7Ή�(3~��MRnm������S���K��ڵ���
:��v��n�M�4}݁���y�e�/_n����/M��������2��e��D���l?�����nbM�Dϼĝz�;����Sv�ov���)�vL3���(G:���w�N�A�"�*t�d�J`OE���Ҹ>�C���`�P֠]��S�Շ�r����~Y$�U�g�~���l�Q���L�H�@�؞���:�#g�g,��Eu��- ���e2&�q�L�ħ��GA�#��K��c� ǯZP�N�D�w�俳"?,��E��{�D��$<?�>�C��L<
ک#��f�����X�r	��qO.�#�kt����rb�s���S���{m��4��\֜��TM��d��]��+qg/��a�`'����g>�=Qq��p��}CQ�!�!	4C��3�NB5�8��w����9��Y6����2�w��}����ڔx���Q���wG��d��q�$�X�F_�ɡ�[@Q�ӈ_/s6��5����J��ݙ�]u�G��:\��hh^e߻�V�Y���]+���M��ٜ6�6;��(0�TͳjklI�n���b��Za��҃��5�L[�U�4��V��O6KH���bś/��E����y3q�����Q�8G�-���$׼��D/񇍧R#�K�{��R�)�2i���l{*nG;�4�S�(���<��mF�v~���R1��ܩ�ePc�,6k���0PJ|Q�ߢ'�y�5�DS��c��Bk���F��@SOD��7q��ok\!:�yFL�P���ѹPyN?cp���:�U|����:��
+O�c�Wm,,x�u
�<,7�V�6����x�����6t����
��zmo�Ź��$*������TR]-	�hj��ӗ�(�6
��7�a3���2w��:�;{R(�⸭�R5XO���$��UO�LU�UXs��,��`c=�XzE��Q#��o|��Ɓ
�m�C?	S{0�\Y�Y�eB�� �ư���l]+��	�t⨴b�UnN�T?��u�e�X$���/D";���eK�����	ߊ6M�	�3�G	
�Xč�ݼ����
0hq&3�^h� ��!��J#}��4r�Ό��g� y���p���Vc�l��]�H<�庀xR�$~�?}���lX��[��Yb�����H|���i��b��]�&qt���Ip#cw�p�5Ы��?42��݊��8M�O{;:#�_m��pD�ЬMhrr}^��p1f�t�3N� �#�NAȋ>����#����Q���
�(�E�G��A�tA���J��"bȲ]�B[;(r��q)��L��zc���d���B>6B��!}Z.$��G��PiGZ��5�;i�9W��fo���y�_D�C��$�c*�e:�D������1j%�Ng�BZݠy�u
2H�j8˔c��~a�#���3P�x�d��Hs!�|s�;x��h�&���[d2W�\o��w�4,�=[z�đ8KrʑmU��dƱy1�t�1H>�+���w(`���X�RZ%�U�2��mOA�y.F���צ�kfGp��4�ߝ
1sЀ_�yqAc��r4-���M5v�hZ�C#�ʽ���/�\uv�=n�eEo��a���Ӕb���S�/_8�	�в��2F��C�&�VE�E�FvF�7�;��������y��d�Ym5z3����X�,��ך�b5�t�P����=��;��Q��c���7�;�R5i���{�']8�"������2-F��Z�U�4��X"�Z�{�ظ�BV���">�Z��
w�\xa�}GF5GU�R]3�F�LT�<[���]
]|(�-�]�v�pUo��y�C14��sn��yZ��e��
K�F~���YvCC���{h��\5ۦ�-��L�ـ
���uxrD/N֧�i}��]KO3�ʉ��!-���SR[���ꋽd��PBo�`�0‚Z^b�6B��4�T��QϿ'��.�}�;���30�ݛ�"��sRS��3g��f�yl&�>�H�y��o��ߡ�v��|ԯ謤c�f|O�n�
+��kٽ�ZMdbe��֤�a�`�<��H敎GD��4M�,�u��遦��k��L�Ki�S���\H���q~	b�U=����C�(���|�4ˋ�ʧ����)���6�綖�պ��x%�{�0pՒќ�6�f�h8R�KBgD|4�v���;�w��R�t|�^)oPțL S��(����SlWג�X-��(=ֽhꅠN�^z���x�P��|��)�3��H��	��L�>Zz����P�?g�)N�G�4i���A:O{p$n�g����Y	��s	h��苦�qv���w��G�Ej�.��|�˧{��M�t��4��Ćz�E�@��V��-�DKR�6`A1��@A-�1�V"��g��!y|d
X}���L�럽����`��6�v�q6W>��6M`�F�ͦh�Y�/ق�yH�e�g�Yvj�Y���9M���+'�ٲ;꽈�4ɠ-�ϓŔknl��
Vc�g��u9�)@q\�@V�N�յ��߿�߲ǽ�njr]���qo�>�p]q�FÁi{�$7��9.�?5儡�p
8—��7�j�*�F�Yh��x-����T�>K�D�%�0{�/3NO1�zH��s4YLv�|���[��c�ر�*�U1�����zC��VG��j��q��A��
�z���
��i����Ǹg��#��,zP9�}��5��whՇ:i3����Tq�4�j���R�v�C�d]�P�*9x���	;�̀Z�u���M�	H�%n���D��ݳ�X�k�ǃ�r~5Β�i1B�J�"��ȹ�f8zg�az� 5����� o�ٕ��^?�L`���
7�4&�ai���*��������Joqm;�]���|�����J���1�s�ޤ0���5M9W3�T3����N}�ƈ��W!e��IdA�C�N)PLaJ?ɦ�V�O$���k.���3S���?{��B�>�:�e�L_Mi[+�Q�Ô�f3/�Q]p�o&�(��@��pz/	Y���e�b�rR�/�氆0~�<���9A?�8�v{Eypok%�A�й#�'������pB���[xNf�6�r�
r��"�:�
=G�.cvk7���K�A��!2��^v�Q6;�(����R�A���N���d��VذG�r��׸���!��P�.02L�^�Ѵe2�.��l��5��D�jB
�������8����><���'�Yz"��1��������ˍ�wc[��?�B��j�C[];����.g�I�INJ+X�<�9����y9
�@#��i�G��(�kKu�O/"t�B��l�'�t0`�lV~�(e����=*�u}�ʦ$�ɒ�I�\����+憔&/y/QF�+pO|O�Y�ȡiA6/#+d�6Y	���4�m'��rR�J.16+ڌ�}vԡFT(8"�yzV�VJ���j�a���h�	r9�͍�/�`��sw|Q~���]�����N#����#z��fU/D�0_Z��o�
�������w;wc���K��ɨ��%K�@/ۏV6��E��T]�4!�o��'�|G
�(�ӷhB���&C�R�O��P"���o�t�S؀��J\1QM�6@E�Q�Թ8�	;��ܗ�4/;2���yB���I�A�ݟ.��_�a�jFe����~�,�T��ŭ�k�iݏU�(�+���2�5'"���$K�Ҕ��Y�|v>WU��P]���o�!��?{�I_��|�*�pt��Cج��	r��$
Hi0I�[�@�n��yz�웯�r��gL�$�i���_,���2>`)����"�s^48�R�~+&	fHr"e�
��*��A�r���&�a\�fyA��&+a�=gd	�fɴ�#1��?��R���ѻ4�2U�IƩ����[��_��P�o�B��TD�"s�;�=���p��sG��!B���j2�;����e�m�Cu�N��"����r�NI�E���J�̵�&�=�a.�XG%�u�I��G߬�Z�3�%�)�D�^?b���%��T�拾�[��w
뿽{�s�v�yj��՝��)L�(��e�.T�UN��34n���Om
}!D�}f+M�C�Ѧ�h�p5L�J釉��~�DV�S�	��I�WzD�p z���g�%����7��f`��wVu�dn
Sӎ�Sv�d�&E��#�T�kI��?֏ur%�9dn5��w+O�H۳��%g�o�N�o8a�ZxEƨ�bD,QbI|�^�`1����M�E �!L{�WEV6ր�l��@�yl��&�2��{�9�*�#S��jt�X��Td&>�?�Q���dc!ky,`�^>L�6��P��gHZ��Z��ٱ��y�$U8%|���7�b*ֻ�n@�U��U��M�zQ4��
`ٵw�@D��~�`߸H,���c�+S}z?y��R��H��B8��LH��m��\��&����<v\�k�Po�����q���n�LZv?��(�
�0�g����y�Ͳ�H��;N��i����|�6-����&�Q��ZcBb�e�<'�0�h��/��"5�F�M�J�\��!{1��*$=Ze�.R��v���c^��=!i�u�e7�
:�����qcD�mlQ�p��ņ��Xg;g��8��g�ȵ�"V�����d@�Cw�:x��T�,\�X��%*�e�c�nf(ֲ�T%:��vm�n�!1�v�1͘=�ӳ}Z# j�{�e1�RP?���&���v�/q+�/]�-�/�IhT�����c���q�
�?7tʨ��g�.L��d4N�LO]��i|Z�W����t���@7��X3'�kxY�!Z�d�|<I>��d���(�(NF�(�̝gT��V�E�Q�Ԥ$�SK�e�G��^�vPkph�L߭��Zti�ӎ�R��*�p�Z��M�*"p���k�̆�`����:�Q��T���&��3�N�4���3�2��EP�x	R'w/�qMC��bs�M 4	��+F��gWt�G:��2B�ހm�ن���?:�)LG�"h��)��V�KR�E���HDc,2j�T�L.ժ�W�V_����b�
�f,7v�eze����uM(V�:�jct�<B;c3��
��J�JE���l��&���T�UHD:Ǐ��m��M���Y��o�l�BU3MQF:;�@A���2�o�wt���
�51N�=K�"��w<�}�p�ѣ݃S���*X�0�Y�׵��B=m��-���|��H�ߏ).�v�?��B�=0��;�([
G�ni���>%S�wP
d��T�*B� x�c��ځ��+���|T���K^t�R��'����'M�'��%�V��8
t��L�h�=�;h�:M޹�cK<ً�%��( �m0�z�NҲ�|�y���G�<��f��*Zh��}��se��:�Bh����7GaG�6DP�#��CN����sΗ?����'�ɶ>&G�?&��+�資���xߨ�z��1٫ے�b���<�{�T+7��܈I��>k�ɉP��ҁ���	x�ި�ا�yNP���y�KB��&Bl�_nF�y��h�If�EiJ�'���n9�ؚ�����Q{_
�G���T�>��{v��U�qaOj�ߏ�S��$�;w�}y��)�����K���������gM	�3:o���믾�tA+M8�ԗ�~5�w�Q�Djn��Ϊ6=���!�F$?���?~���v�]�.�۵��MZ$_��n�:�ݦؠ�_y��^O͛g����
�YK��2PY�3�,��d�G�X������lPCC
sI���O�"���s�������]�j�@���!^��6�꽕:ї������!2�W����&����&�N%N�7�b7-��L
�P��(�U�jqkyv�դ���^]V`�=�0N�ޠ���J��lP)!�Z�ǦQ9����L��d��x�y�����oA�;A����
�8 �|ۻ��A�Y��	Qu���H�Ӳ�ˋ��U��8A��t�h1#y-��GA��՛�b:���\ؕ���{y��1O�s8^;�!Ņ�V�\�?D��*J�HLTDo4�Ta�t����!��"�4�v^N�9�>�l��G(Q|G9M���T`M��d�Ry��`�EIuΠ�e�A;F}����"ǝ���m��Em��F�o�{J2Ěh�������IuW�R?[a�m�	Ài�n�	���2}^�H1��z�,�bBA:/41�R��?U,6��V��EF��{A����5t-��,1��N�7�� |��r�gV�X��?l��GY�BW8��I���g�w�&~�l�u��N��$/(�!T'|}<�;�9j˫r�M�~��ob5U����{��%��Q{b��� �d�̝�+�9c5���i�!�}�#�����V'|ɕ+�k��q {OYA�(<�UZD�}�˿���/��z�懦�9�/�72�GWu�S�jN����t�T-*���i�g�&P��'C�j4�����@��h��8�S'�3�8��ŵ$~T
uW.sb8>�fݎ�Q�l>�h)�a��S���#M��|�Q+_x	M����q-�CL��L�Z2���8�z0���`����c�j���2`_,͡k5��
r^6m��wA�UVs<=��1_<��,&���&,t
0/+�W.u|�Uӎ��뽋o���:RVZ=$��c��nߵ*g��{Tm�%𽱔�4 ���ë�+�hȷ�"�P�����b_d��*���_W6^���:�FAe�Fq�ݣ�*�t�Sw�80�U7��B>�2]����Gr��B���%%{�LQi��:`I����>,��#�a�C?k�u�-���#"�{��W�S,��u�[e�X�L������sxU��ohUN��)X4!������^?�Ҕ}Ʀw�N�u���z'��
�]�P��6X�!g6�Ԡ�.������6�6��7pX[jsyY������F��:ԈhL��W�<{����������)&��[�(�H��Ӱׁ�nX16���:�ގ���6��yBU'�ٳn����jC�����Jޢ����(�M:%�������� _���S2N9��5�+����b4�yF4Q�W'�)��f<։9���Qn����l���F�j��s"��I��߫xA-�zV�����$��If��i�
H���-r�Ow�j�&L)��t��G|/��
Q
$��!Pv�����{x���YE���qqu.�Rc:r(V�����To���{������gp6ܵ\�Ite�,��ĕ?�'�I>��k��|)�_2�)�N�@�
���sV~2�P5�gp�L5���} �!9���������(�%��+��F�!�v����]Qx)�3�Kp��Q8��k�1;Zݾ��n�<�MV����
|����9Ԍ�XhL$x7����?�xV5��[/�a>�Q�ˠ-8Z8w�=�ڸ���L�ɰmV�Ю��,sr���ļ�+YT�1��!����#i��	�iˣP�1fmQ߻�"�&+zCT�#���k�t��kQ��#��l���0��CBpFK.�7�[�q�f4����/o��ӽIC:ͺ�`�K����
��>~��]Q!��ƅ�Y#��)�&N^lA��]�4؍���O����ymW2P	�g��+#���I�mN�X@i���`҆Nu4i��>��2��j:O�:�ّ��&��fa,]��;'5ʃk��񰇵��J��	l��9�a��y��S�UCY�kt�ݸ:7��� ��ǞaѤ�Ԇ���Ү�^0�A��[v�B��T��/����"f�$�f���$�+��C0��?�x|Q��=+p��-�f�����C�f���t`5�D8��A�ӵ�Y�O�ʰw7����W>C�d���J0��cX�Q��0Slo��d�4M�9ob>����:�86�m�d���N�#��5��hxZ�G�̸��;yW�
3ᒛ�,�Ÿ���@��	�WQ�c�wѵ&�j��7I6`��/x1�͢m�R"1��e�?��h�'�u�S
���Md�%F�PêC�]�X���*~�����-gk+��u�a1!p��bB&C�on�ݚ���q/��j�b��hS�]q%�ἨAD�]��$�lr���(�aq��Q���:ԧ|0��	�@�%����w�j�D��=>2�_u���8�R�u�7����Nuh�I�ʐ��]u���&y�N�lP����>9!���P_t�b$�+�Kj�͠� �!��ASf�5(�a�"KL�5��Zv�U�aSX�6��a�83��a4�:Q�&?I+�+l:��2	n	T�o��
�|~Ix��n�#܆L�MI�p��US�)�G��=H��
�[L���U�
V����l$Bfv���PZ��0��9�ͻ���x�D��&�Eߪ.OK=��1W�m�M�NF+T˨&ł�Eus|�#�	�=��5��,Td8�g�n�êDu��`�e�Y�!��R�l3�K/B���o	�pI����E���sc��E���qߊ�*fȄ����B�qy.����� ��F'y�
�Q��X�uX�੐2��H�yE]�i��۴�o��C��������Qj�Z
��H(G;�~f�<�9��|�������F.�[�Y��2Ni��<�r�J,��+{?XyznPW�Qa��k��.5�c��|�f��cg2�k�"(z���y�oK�I�eF�"8�C����Qxׄ���7}�:җ??	H��#�L'�7�k|)be	R�~�&)?Z�۩?gW��	�E��"C�M�j�l\wN�]DGn&��a���C&F���G�}����܄m7��f��)lY�U9��u�W_xe�R�L\�_,ll�j�ԓ���-�J��i��}T��u�vM�v6�ۣ$#�JQ�:�u�iH= �$� 3&�2�z���f�<�EF`�4U1��c�Q�P]<MR��̴��R
�t����?�W��7h�H�Q�
�Dx�m9P�kuZd2G�ok�d0b�Z4�>ήZ�ѫbi��f
����,�n�fE6�Y�l[
�Jo�.��8��1�q�X�)�e�!j���6sp�J-I�qp�w�Ƚ.�/�2i��WW�?��d4nx�`�KnQ8����m?�ϧZ��>>�[�{�[�S��Y[�*�:��7#����?�\d��/`6F%���@�o=�%uZ
$q�:Ƶȋ�\�M�竂cz��岭��������u�1t��J!G�Xmne]OY��-"W�>qW���P��G���F��E�{I��������2�B���e��0zi/ �=-yz�GB�DU��G
�4V�g�nu��itwk`�.�I�'O���Ip�����x��í�
�n{ԝ���::���F�O�h����-���J#�"�d�iq��[+��d�A��݄1�LY�K�a]0 +��aBi��	����Q�����0�Ճ�����M�5�=�����Zŕԩcj=������u���Ӱ��~�K&���VڼW�O+��SyzbA4R�r�8Z&���'������Xor=�g�B4F@E�z,�e���?"���̀7H��j���ō�>k����z��O=��u���%�7�c�l4F��j�O�&��N滨�����͠wvR�웖/<�]��'W�iG�UA+�1~�f�s��C�Z��S�ۈt��x�$�;�rF�zڡ}�o����v�m�Zx�h�‚`�Lu��#ݤ�Z��2]���OQʙbltv�q�|W�ԩ �H�G��f��(�R���&G�ԨWD���
�G��Dm�j�+�r;=m��_`�L�#�qԾgfBp)5����l���,.�[�nw��WͶF{���h�&y�m��b��]�ڙi��@��؏��,+�oh�k�Z�
Z���:�LtIkCЍ��@K�\��Fefl~�mmm���Q��Y7>⧻N�KDu����D9Ȓ��s�pQ8$�R�Ʊ�ւ�mG��l�/���j�5fj׷057ɏ�.Fv<?���m�&_Bs�>��2�0X�-CA
u���eQ�TV����뜓)IE߹��*�G|}��%�k���4B�F�U�Dr����#4B���R�V��>�6��$h���5��$���w<G�G�
I�P�%�	arz��n�z2�c����B�::�o�,���x�]�~@�#I�B�MI��a�_i
Z��q�ȭt?�au����L�Vm�6C��VC\o{�����iZb�Ȳ8_��!�t�5Sy�"R�]��W�79����dv��GDžʝ[E���h�m,�N!!&9�LgN��i_�b(;�b9�{#�� `��$^�I�ݰ2�N9$�~ơ��zk�ި�j�̩��
��ȯ�Ɋ�'��4q��׈xȲ!�v�3HRp����SpHGW�31i�C�a\)5"r�^��.�z<�-��M�D�ALg=1��|-Δ�(ow7+ܱ�.!2�|0�ː���&h�#f_l�%��B�2;�-Y���}��{�`�����
8�hڳ�P�@�~�� �$R	B��Nj�T�7H�K�!6ҭ`�تd�H�Ә�����:�eƄ�uFH��q�g�b��"�f�:�3�_�X���`2�ݳ1�`9"��>W����1N1֘��s눘���st��J1o���p���lWJz&;J���Z�LlM-R��EW�����T�Z���l<�N��	S�e%�D���+�U���`sRQzZ�0��@�Ǐ��"p:��c�!���H��E�z�;V�"R�
B#���f���df�����g��KL��qZ���{��j�ߏ�-�0<�n2��h�MɲU�IK4m����7��EV<�ή%�J�@�I���D���O�9Ĕ^���
	�^��9k+T��Rm��?(�A����ΒB0V�/ע��G������
���h�mG#����s����p���h@]<� ��%��a�s�Æn�x�ԧTE��]�2�	��o������:��QD�c;�%Vb�
���L�D���W���]�ڇE>�t�5#ծe��,J���G~���qjq#64ŦQ�\<ݳ B���I��q��D������-�0��x3��Ө�FmЫ0�[}�Y5�M�z��J��s�yp0�^r�0��IT�B��H��.+P6x�J�\~�!���3u�P���*�0)��)|��wf�_V��
�
�/Q.o5;�����P��(����hW�#���GCΊi�(�%YC��_�ܾ�aR��U�96f3u��x�!�h��!�
A�c��o�n�9t�P����~ic�ē(u9��F�^32�c��'^���
��8{KnH��٣D��'f�Ɂ��������
2�����d�A$�ҠwK�CmdU�� (5��;x�
Q_A�(E��Z'�PG+��[_�R��K�/�����H|mV�����Q⤣�:���Y��Rtq`3�:�^��_�=����Z�YN�J-K�V!}ZuN�u0\�M�]t�����z��,��S����1\i2D�,�΍�\�1\i�1׻���IJ�T�\f��\��¬���8�r�a�bC���Q����ӳ����aP>[�{i�*����c�w�����H

b�����w��h�d &6�4�qC�{_�!I|�I�s��'�0��]�����PHC���[6Ge�,WW�}�%��lD�{� ҋtE�HW"n�>A�$����	ww��O��]��&�۬7X���™����&뼀}#U�9�H���-�rP�n��[�-^_t�K�r|1��LJ8Z����`<�~6��;�}�'NE�i%�j�mlu�֑$!]�x �/��������_!��k�@��������zdnJ����I/E8����(��n����K\]���04!��=���~3��h�����|���w
mɾuRa��E�L��U�Y�ECFg�a���*�G��d�
.�_���������0^����c��w�%��w�O��fTM%�Vf�F��w�VT�ae�4E�ÿAS}�_M�.i����g���S�1Q��þ�M�p��ZzU���Ć�ꄣ�c����	�x�ߝ�&�J�8���`:��kH) �6_͇��d&��y�2L�����~
�s��/���]�h�'��x�q���w�>��V�o�I#rS@�=N'g�T���d��h��V[�c�q���������mm~�n�7�?��r�7"��Uh@r�]��I���d�>��â�ԯ�Y��.0�o����������扪؇� �&k��;i�(o�T�����O|Kak�46) ��r�r���EU�	cֵG������t��e�L�s`�:�ܢ�����c��)�j�ܺ�Y�,�T�$�0��pb(gi��%
���̼���{�=(H06�6fD�C� /���D[�y���cN�ZD���M\�Ax!�4[Y�uoଆ6�ٷ(H�W_�m#L�n�jR�g}�|�f��d��Z�����wW��s���y�s���07���r��8�KƵ����-�;˶mT�;�*L`��EyI�x���X"!
R�\$�eSH�L�j�4t1��4��dՀ0	R4���9�Y�1�LK!Ϟ�o
Dl�r*�>9=m�D�d�	��8~��tZ@���6���G@�/p�h*mJ��ncC�T���lCr'�\�7*�J͵�y��y�R��s˭�ֽ��}OS����*=ٮ�}�d@��&ě�"r����]S�+	��=x4=Κ��ŕ����o�7,���TbbO�D�q_X�l7��B�w�1�2!�2�C���5���%3��x���'�~�E"��L[e��� vs��߰�o{��v�(�"E���j��M��vJ�n��7��9����5[��dk5l�T�:=i}㷙����8?ҁ��5�T*�P�F�Y�B4�Օ@S����?)];�C���T����{^L&��.F�ua(z������V��ߪpr� -��N�P��r�I���$�N$��;l�q�ѫb� )K;K�����Hcj5�h�����dg'I��4�$۩����]�Gp��j�|V�4ݶ�ZN��7!��7y�yT����j7��Y۾���rm�SS�i~���K� �E��*J�$�
�A/������f�?�_��EE;Cuò�<ڂ	�u'�{��/�D�I��.��ʺZ\��Gͧ��:�??~�ãç�����g���������t�Q��}\���=&�@��!���Ⱦd��1�%��,�d���Yڒ�FD	�\
g�T3l�Ƀ$:I�1I�0!ϳ9�b3�o��1-�7��h�;����9`+���,�}ͬ(��-�e\�֯��9�֍����%�9GF\@�
��2�Ge��G�"O��8��,���U�8���o�E5,��:*%z����ޙB	Q�M�brD�?J?E�ҫYVv��7hQ�qsO�`��!�ͺi�Z���]��t��]�?d���Y��A��'a�^|��S��ٸ�Dͳ��(�����ֿ���8���'�W���?�����ɇw�!��nߦ+�f�y+TP8��A�@��G�j��|�Z5�TvӪ0�%���s��XV+9��Z�֨ue�H]��uBkX��]�'uG�l�����sCD��#y	����F���І�Rh~��������.t�qz^�Y���'�?y�쀻�QѩJG�۽�{�N������J���f�Ӕ*5���y����:��5��d�ǟw��\7ˎ��i&6�~��ZLG�|��3��@-�3�Ď�&+���HH�{ߜ���O�E�N���M�w���
~��!��k{i,g��iΆ��kL�5������k��@_�&	�4���r
DA��@�U�� J���B�n���@��r7A���͞�X{Ce�e��6�.�s��ݐ����	�F��rC��-'z`��2�>��m�Kl\žu���~��Rܿ]�����R�+ս��UZ[?/�8�Q�ߺz�O�q�.���&�
?§|>o)h��@x-�6����H�|n�e��~�_�FO�~�F��B�à�PK/WUWmX��q3%#pip/_vendor/pyparsing/exceptions.py�Zmo����_�ep0�H��k�Du��p�5\r���Z�+�5�$v�v��3�ƥH9�]��@��&�ev^��Y�a3֨��2i��IQ5�PD0�$��=�}S��d�uE�V%�3�OV�3�P�uO�6�)̗��,�J�Tթ�|ˤ��)i��t�O�<�M��(^du��i;�B"7A%i�v2�d%���v2�\��'�&��T|1#��"x~i���]��W{Q�e�M���h�)���TJ�fGy[Ir��p�7��;EzvAz+�ZY������dq_F�	9�	�������?�h�����^R�</V�(�ְ��b�n�tZ��*�����
�I�91&��%)��/��.	h���7�F��d�ji�)��{B�H3+^��H�b+���mS�K 6��fn��
-q���p�����LSP��L-*0ͺW`5|Ef{�=v�d˾Ó��[&@e�#
���nD�m�%���Ǥ��c�͈��5c
��R��Q���
M@yN6T*�䵔źdz}�6 j���������Yo�n���sڍjÍ����]8�j����N�<l��~�� uRHM�[���fu8��0E���8�}�F�3ѳ1,���46�Q�=Ě����
�#���չ�	�8V�.�cx��T�vg���¢@��k"D�D�k@4�$�=�%U�����j�fd,��[���j𶲐��6N��&�(���PE2�J��Uݱ@h͈�L%O
"���L�e78�}��m���E8�@s��VH��򠄡Md� �f������b�S����!�s��$ѶTh	]3�G��\�X%jU�y�E���:
Tp�c��H�A;�t{%�Ҧ�H��E�����Y����H��}@\�E��+x�*�_IE�5���;����)�]}�;3��T+@{�T��b���d�j�
�X��L�h�����D��&��nSy�eò��&�g��ɾ��$c�QX1SgX�$[��Z�&+��Pq��a�_^�d�S`����0�N����6
�9nHP��c"��D�����8��b����ǖ۰���5+�$MQ�iz�$w0pMGrNN��e�E XAP�mTI�9�,d��IS!i:�L���8�$���8����Զ)fd�A�`XL\��˹���:О�z7��ӫ�p2E �yQ%� ��ڪq��L�:��7��2��+v'�9OWkY�5�1��m�v��N��M��]Ք�[��7�+��X4d��?h�����EnE�j��JZ�5�yw�Cc���&E��hߴ�G�|�/�qO���D/Oz��!`�́�Ѹ2�\�4e���;Č�*�I�ryXظ��y�BgE��[��	������s��S҆'��b�h~Fcq�0h0z�Z0z=	�r�>�(�G]�\�����+�$T_Y)��cG�._Bmtϵ'�/�$� �=ɀ!��i�O蒤W��3	wPV�	���\�����\�[NA,�"l���$[հD�k-���Ze�L1���J�A��jS��_�:m5�_P{�*�U�A��9��:2U�.t���$dr2����� �
,`ߟk�U����c��IVslms�rW�v�-#��;$�_Ǹ����3_�<���#�����^�@Ю�n���k�b�ȸ<<p�Qt�
w'P�<@z����vy�
�{��(��C���n��qfLht5R��-�m�=3oP���\�D;��@����Оpm�Z�Z4&ԅX��~���VTeX��
K�N��o���~2�q��M�V�m��OҎ����[`��	Y\=����+����4�w���>|�\�;ކ<����-T0W�߹��P��=��
r總��H�q��C��=(퐉�i�,p�vPJ��nv��nmS���Y�ѵ��R��n�;��j�w/�"�t����h�إ3;��&ܰc�o<����û���v�c'V@�!�պ.�1/�/�B=�k��@���%z�=M%5J�6�OZض�]�ڻ�u�s��~d뵁��n��28�o��'u,���Gnz�^nS�Zi��콜c��?�r��o���]o�A�a`�e�B��s������>�1���N��0��fS$�0����&��Sr��g�.�xT�;��F�V6.6LT����^#�
�M���F��,AUx��2>�?���wrq$�g>�,L�y�Vl���t�k�n��z�v��ge�{�cRb�M��f���L��VB��w���Y�X�@,����@L���K^)¶��<��bS�u�"N��"�*!?`/y(��͉�y#6ܭ�]Z�
���]PE��a&�
�΀~6D�JO��>����Nj괔�[�zQc"E�=�<*�r�non�Q���z�jem	z�ɖ�gl ��j���6����7���E~r�ĺ֡\�:#�E�V������y���M����ƴ�����g�+����E_�$Izdy�So���蝵�C��ؐu�N:=��f��(bj���gb�
po�e�4�%. ��疉hz�p/_���O#�C���hd�rw%�S��=3��nu�,�4�BӢ;���x����W�h��	<v�������-��ƌ��~�/�A�o�ru#{���b���ټ<`������})X�[+1�_3��t���=�Y��I�j)˄qH��>����I�_�W$>��l�)t�x��C�5�xI5¢B�u��ǵ|m���R�o;�8�?�hu&��h�5ݰo�J�(~�/�cq��k��+Z9����Pvk�k�e��-�Qs��Ɓ#b���
`�����@y�4~�ٕ���x�k�W�����\0����D�/�'���-P��k������S�ɿPK/WUWDka$R+�� pip/_vendor/pyparsing/helpers.py�}�w�8���+0��i�r���S,�9��;���\���w���$�fL����N���>IJ��z��ޝ^�#@�P(T
U�q-��,��r��.�EY��z�
d^�u*+����[�6�2ͯvv�e�����,M��X=���E��٪N3�,��'U�T�}�1ϒ����%�i��q)��]\&�����IYqq)�Y2��x���r��N����d牸ʊI��£���i��k���e���ݲ�wQ�g�\��t��1�H?/�ȓl�U�#��%7�5m��4�'>C���4Q��R$z"K�Zs��*��P���RCW�*h�D��96�����b8�
i rI��@����0��0��Fe�2ˠ��V,�|m�*���,+n
3	���5�_7�KY�J�A���1�
	"O���JG�@���\��ԯ�)�_��奞��K����t��Y_�����*��	v�^� X�>A���Z,�b��"%s3��I������d�̤KR��Z��0ɖ�IE�J�U]Ba�H$1�	9�EB<A~��I�/z�Y�‚|}>0P�;����^���2���yR���������iRc[�7�A�����(����	�~$h\����hP�:�%Sd�0K�Y"�!���}qE�P߬�Q��&��>�xsQ��J��*�X[��ęH�524�k���y���!vLk���Dc^Q8g�Օȓq���6�2v
5e��U���I�g8C�X�mZ_�Y'��N��z��K�0�#Ki����6�=_-<�wt	�i�l1�u:�')x&&E������|�d��߲DaH��j��MzQy�<�N���@�|�:�<G�VF􇢇���v:S���!ՠ1�O��}Q�&@R5�zb��e��#;�y�g����iːȰ�������ۮ�#d�\H�8[,�u9C���(��aU���
d�)��82�L��i9�t?TK
z��Q����R�����!�A�Ļ����R�H?B�uM��<�+$��7�I_��x�B֍�r=B���ŁKT��=g"�0�0��
�Y��{�4@Y��`B�sZ��8V-�,�He�b���r���:[�z3�֘�nR�Z��A%Bc��k��;���A��V��9&���
���@�Ҁ-M9O˪���UXte�EMmu��"��i&�2g@s]0���apy�K /j~t��r��*IJw����¥�`A�
������I�?�R7����"0���(�35N�D���
"�Y3�
��v��@i
mzS���
/�<�dh��
�l��Z�c����ʲC^���/��?��ġ_��<>�Y{�[q��BYzU�J�5`z�փ9��C��ht���7��j�Y�5�bc۵�R�`5;�.�EE�0�H��7��ҕ"8�
1��!��-M��%%D��crd�v�KJ��rn	ۉRm�yNݝ�
���4��6Hyg3-��(h@d!��7I�9,`1�
5���y���5s�dC����G�A�Ι7�ǜ�� �����e�������w�s��F.��1I�Chy��M%�
�V-beBo�k&����m3���-h�q(�Ŏ'�6��[x�3�@�@�b���`���c�y��se����
�Jf�h��I��ˀ��d
Q.�I���[4]-w
��������[��#�AL�H^f��M=lK�٠�ܥP�3��F��7� �����}�v5|��|{-iwZ�C�O�<K����]�rF�i�R�/A���p�Q*��������Ǟ.I�N�;#C�T�O�W�\�WJ��4¹9��c��%�]����CI)��h����2I��߫ƺ�������K`W jf�GJW�
!L@ۤ������(�>�/y�
X׋�ׄ��_�J��A-2�\�b�	��΋[JM�
@7y�1�Y���h�R@��K���1-�t�"	�R-�H`Ul)(y5H�-El_D�ÌO-��q�_��L9i�s���=���=SaV�O��^�
�J`Ԅ�<��w��Ϭ
�t����5M��-���ҙ����
*r�gp��\�#-��c�~"@�@Q8��ω�G+��Yv[;��(��_UE���L�"�&��sۣG
�L������</������g�������Z��%�x�{���9<�d�NOͣ�g��*�#(uj����a�p��Q��3T3_�=��5���S0s�9��^O�Ob� �@0�DdfO���)��"Z��W�E`%��A��Z��@��%Q���W���P_�-�np���_}z���^)����Ԕ�:�{ma��}�g���lId�et�C4��U�ZN�}�C�VKැ6���1誛���Te]�@�S�,)֠/Q���
1���e��Jiv9�6��p�.��Q݌�F�M��bRd`���	$�ڎ/���2+*N�Q퀰���h(���X����'�*��A���-���'mq�=d/�|
�%|X��eQ���62��2���R��(E�z�>�9��4���Lȷ�K���ɀQ�'g��	x�m��s��h�Ɍ@�4K�vF�uQ�`Z)�!�"Í7�>4��	O&p7JO<����T��]�!4�@k�΂��(�E�~j��u
@Sq,�
:�᪙�P1��q�j��O}u��J�0��C�Tȡ^D�}�
-���z�A������:;�UB�Ik1�^����j`yY�a�?�n_�	�Q�wp7�Wy�avJ9x��۟ߟ�<�p��]�O����u�KV��"��mg#�y�qk7���jS�iR}��������z�OE��O��<�]���*�p?@@�i#��q[&K^�'�D2�.�XyG�Җ��q%��Q�ho6�p,��I�����-�8	|T@xA-b�����H�{&��Vc\�*�6���o�Q�)�ix�;[GD�����Й"�*�.�Y��Zp/�"A/��5Ȋ[�C����}���m�R���3t��Z�r�hϾ��>�-.I�:�'�K?����ۢ82��&�4#7���}��u��U�2��zEO��S�Ӱe�l\#��,���"g�,�ָ���� ��⹆MW
�
o:�t�#�!��kt�2��5���;>$��T
@`IP9�C�sr��!��v�決�;�>a3��/Y?�h�_�#����b���s�,i3F�Ȁ�gW�N) e��fR(�������|Z���VZ*�?�%�؊4�3}v���������*��=ŠD��w�ˆ���;c���%���<�-2y��m��1�Cn+��u�g���/���IJ����i���,P0A��k1�`l;w0�We�,�*��z��bž�����=<�9�<�!�H�(�q]���GԨ��'X׹�e�.LJ}1.�`
D5j�HP+F��_�AA��w7F���Z�8���0G%y{)�,�kF�ha`��w��:�� Y#p��p�#��]lhK�@�f�@
C@�7E�
Hs����@R�8�p���q��&;2�?��P~Nl��Q�@q+1�j�~�5{�͜R^
ngN�Z8=�Ĭݥ)㺛~~Q���̙�/xD��q��z���o��Gi.��r3�ST/���F��=E�^�y��9����"�;߁/v��C��a�{�2
A�L_�rr�(�P���uMD��9�����U�`���Lɦb��8 ?���F�ہu]B��+��Pi
����Ġ_	0ђW�	M_ޠ�5���|J;nr�	X#BA�c�~\6�Xy�Xk͉N۾	5n}NJ�V5�� 	�	�*Җ������i@q��KX�?1)=7�Q�7��*76���æ��?�s�OO4�`���q>�M��5܆1:Ḱ��ą|�О��޸=���̀*ϳN�uڿc�g_���R��O���4F��*�$a����Jz�U,�	j����l<���z>����
����}��u�LON@d3q�� %��q|Os�wϗ5)Ȩ�E(�`|��m6X}9�E2�JI!72��ZV!��=
j�ؖl	d ��'�����Bá��0(o�>�m�Z	�la���$'��J�B�w�ӟȞ�z*�fc4!n�)m���\�g.�ݍ;p��ZyWJ��sY�U4���!<��
+��.\�"<��I�J��d���s6h[��q=h�)��}�/Ǫ���ρ�)�a<$/2��,�]��E4�j(՞)���Qv���k�cC�GM�ʔ���:|�&P���)o��U~�f����t�B�4�큰M`�+SA�ͱT�|V�̂^��� ���4�N2YTI
�''�`��T��|_�h������QuK.����T�b�q-gg�����Wg��y~�
�E%P���T��?9Q	�(����F�Mun�YE�:[�m-2���n�B�Km�=�N��T*)sU��������kݓʏ�
�Ѽ	k����l
5m[҇�pM�������*��3
4S7*������/N���
z�������giP;3���Iu�Qq��6b�:�H7�-�ogQ�9�T��Gϲ�j��������訩BY��-����B���������%�
����\
]C�ѳ��3
�x��B���U�I"޿�>L ��@'F��M�x�U;���ґ5�z)�Vii��i��R[:���[	mA�Ή�θ�r�+s£r�X+�r
��mU �k"?;Ϩ���_�/$X�lo ��N8��Ήdg"	��2T����^xy	D41*@#���X)�h[tO�	ݝY�jG��8ō����䃣X���q1E�M}�!=����}2�p���s>�]�E�wB:zG�rC����Ť��tvLe�#-A=.ku{�{�4���rT���Oz=o�z�$�eY|Ng�N�#�T�&$K�ׁA�O�%u���z����f����ݝ��̭����l�椹q���ђz���F4ӉDmr�j�,$��b�3a{{�b�A�}Q�@��<V&�攐�>��B�"o@+>N˽���%�uh?�mQ����Ov�RE+����ʔ�s�\�T�YW�0zTM���5��18�	��(<�h
>�@��yV��̊�
� r��.���b�g{T�=�v{��1��Y�l��bP�&?vD�Y��5B�`�P��z�=��}���}_�����_��g�����xR�0��Uؽ/�8��e1
}v�*�1�YƊ���i<�c#\�#���]��x���-�p�j*^i��1L!�*��E��|W�!2��
�c3����v�;Ū�b�٦��y�$|�b6��?q�/-�t~��wG�s���N#���]H�|���b�!blh�iO��\�E{������y���s�6���V�o3���ӽ&��nh;ݿ\��`��A���S�	e'������"0��)���p�UC�rRU����A��4�6<��ש��=�����=]��֬�$��D�f8*�<��� ��jѰU��棖��Sg��>��(��t�v���T��uY3O�s���,خk�QfA;	�	�.M~H����ag|"~�P�Q�\���8m��򀪌E�C�;|��o�e�'FYN><���R� ӄs.��
~��1�>{�%�O�-��r�܏�+:������Oys�����g��O���Tށ)4:�^q���T�5��Bx���]���b���Ğ6�<?����v���6D��ç���r����]�]ݙ��YZ��?S�ns�$�;򹛺��U�r��{��V��[��o��8�U5~�V���-6�|ن�?&�G+�=aC�B�W��Uc�!N����p���=j8���]��{2�v]��6sCk�͌��\�~@;�n��M�[��|d����)��-:���q��)�R�3F�r���\M�N���z����P�s�ZF��@�Y�Hp%S�?m�b2������C�/���i]�o���&;[dL�����D�n�.f��T<�l�Ş5�]խ�͞,�� �afq��q�3���=5(��&W���G9��,����`D{SwDQԄ���� �kw�hL�ɸ�%�"�jK5�Q��I
�;D�����+�1)�eB`U;��h��S����N���Rj`�w��-����)��8�p��Q�㛵��V���{���V>�'eB�<�ڨ�FFp|�i��D�	���>%SP#B_�n�8�����d��1���1@ł?�(�,���e���#�׺�4�R�E���E}[
ï<�Z������s�8n�y�Q�ߤ�И��0b���ąʙy��j7�Œ�E|�Չ�����+��N�A�lh�Ԅ�*���(ri�燛ty^�f���
Ps_�O�UJ�-��|x�Zf�?�lV�y�e@�1����r�Lp��&W� S���YhK��t���A3�h>bc<��+
�}l���w�es�}︞�PBr�����q]�(���e5<8��^V`�Łq�;�nӛ481�����`M^���º�4f��v��<��,�r&A:��8ɦN���ۑx���u�4���	
̛�OڱIF���:�A���p�P
}��.OܩUǝǧ'�*a��H�$xzr�4�L҇]9�=m�T�?�xE$fH}���T|z�=n��3k���S����V�Vv��S���"������~`Wzc�����8�y/HRu��N���r�7�'��d�B������E�l�XW�`�5�~�!A9���?q��͠d@�<���3���_���u������ѷ>�c����d[��������>t�c�<h����L��YV)X��F��e8���ɤƢ�A�?�OZr�l\�t����d�L�5"J�F�iU�����v�R���\%EC%X7ŋ�t��>�Rd�Y6�J^����mQ��Us<���Ӭ�b�8W�.���s���~��Ï��p�{Z^��)1�j�X�Hp�v�E_l,�ع��u̝I�
c�EO���QSbt�T�è���s��Bq�?S�& ������̣��ԕ��0�`l�4���0P�`�#E�cC�<~�*��")��m� �f��� ���8Y�o?�ʙ�aU_�Ṕ���kc��aj+*�}ߔB��JL�ڷK�X�9[��
��c�.j�kؽl�BH�ULJ�+P�4�W��Dj��x�`NW�ѝ�gY��L�^���+)�]��h<\���J�T_���@CNR9*@)��3����K��3��Yv >H�Vߡ����K� ]�ZP�K�������WIDˈ�^f�N36
�?f��NZ�N�t���M� �����vjr��
�"��T��
B�t�o�w��h�#���Ptn;�&��C@�hj%V���c����`�q��ݎ0��⫍	�g�	@�s�w�@#|N,d�[�Q�a?)�GG�MU>-�D_��\�El�h�u�̊�Y��_�H��-|�F
\'��
*hN3�3�ԫr�࣡�����?�o#��T����9�=��g��9K���h�C{W���m�T�#�j�zӷ�o����[��K��d�[�-��ˁ���H�4.�@PX�+SM���W9�>%v�Э��_H�%�EZC��s���eR�VsQi������i��U
�~i#���8./[^��9�1S#���fN�+��0[C/Rb�Ҡ�<N���I�S�^����h�9v�;��{;)T4�aC�y�/�{a`D���F��� ��8'#�\��<����"_�xd����R������F�ҡU��i�ch��ltU=QWC��ノsLJ��-�KN1£]�S�꠮g��k�K8:�@��9�U
���V
��ktJ�rDM{�����،�_ao�Y�����$T���]qЃ�;��QFn��'���ޤcG5(Wy�ɴ0����?�=�W�Cx5����z�����a���N)���O}�ۃ�c�ƽ]��Ϋd�(�m�g����.�]w5��Bդ���64{GX�����'�P�t`�=�dH�6��Sr���X�Ƭ��m��:�����)�<n���_����
A{
�,�� �
$�̝���Kh�Ll1 ���5���k�.)w�+�n���-q�iF�E�M���5m��H[8�B�$mˎ�e�-IV=Y��D(>^r/�{�Ҝ��+���u/��F�;���/Y1��(|J���DiF� o��՘�����t�O	j�7��Ir�>�/�\�
�aʏ����a�h����(��BH�W�pn2T �J�ϸ�8��xn�a퉐�բh<���g~��݌a�7v8k�͈Y�mc@�"�oi�7�pB9���U��VS7:��j��T䒼�#�u� ��F=$��Og��kt0�h�-�ۢ��`���OF�4�&���ml��.�o��PC�W�7��+M>��F�ԗ�oT�vՎ=�����G
b�?��qk:#�y���B>"��f��"����3/����\_��*�iM</���S�F��N�S�N�4��
y�V����}Sm�BZy6N�fM�R:B��+$P�����|S��Y�ok���]v,)�xX���aN�zf���y�n����1��[�n#�����'����T��#�a[u����} X/�u+#��}'?�[e�M�o��M�����7���n�5���i��p=�&1�H�kCWÐ�%o�\Vm��L�IJ�m��V�����&p�~����@`�.s��ʜ��L�fӖ!���v�I�~]������.i)����v��u�Yu��'�Z1�`H|M���݄���C�=���/��?F|=�B�Z�t7n5_��i�߿�ϥ���۩���6�2�yW�t]���og��(��Ww�h'_z�RojP�WT�y���n
Us��J�[O�Z�j:
-�k����u}{o�����8��}:L$����L�=5��$�ɚ��&�H��Jz�R݆&����+����e�::1��(uԤ3��k�[':@��s�
�/w�t�yY�>���ֵ��\�mH7'�J����s�&ϻ�ހD��9������KNju��T����	v�@�]�7����w�4F��Gs���q�9&�uY��(���Ʈ���i��'O]/�q��S����Խ���x���E��'���Ջn_\�4l���$9l>8j>�ݾ4�^y��X�w�uS��}mWWU�
��x�)���06���Ơ���˶1�獹νM�|�JN���0�a��@+� T���K�U#�����`�=�0__�<��Dkn.[0h�Yx���Ⱦ7PCz�w�hP��6��T�ͪ15;:>���%�W�-N�K���h#DCu�O��
����v�bQ�V��NA3��!p^J��S��c�ݳ�[�7��zd`��{^�;�~�{!z��?Q�«9�k�{��tY��~��O{��������<p�#���/^t������!�FaL �S��95�
(tY�6�!����M��=#A1�5�;>�x�0�(�,���ƀ�K��ߕ��n�d��9^�a�x��8^-X��f�>9������rz�Nʒ͋�gx��-���"��<]��n��Y�)���J�0�lZ[U�d{EB�뵡<� ��
��y��!��%�g��`ii\p�`V���z��S���ޟʻmD�j�=�_���>�|^�hf��&�
��9�\��A��Nk��U������؞��ڿjo�Ro�	>֘��t&�뷯��bn�nC}��^D��"7қ�ѽ;;{��~�ƒv�(�h����\�B�孇K����k�j���A���f�Cl<����j������)p���w�=��1|�ȹ�i�3���Wa©'�t}��%l��Ϳ6�
���!��?�׫�w�`ю%��yd��Y#��x�=�7n�M�UO�,���,����6�[fMg�2n�	l�z��|�W��R�[�8RyUbl������^I�k�W�W�P�#T����
�]��3�bvwk9i��9Qwÿ��{���� �v���=h'J��X�$��
�-z�K7��\^;;�<a�Н�a�����b�/��'^"	�J�~6v��#hN=���bg躱=
`P|٪#'݃��vB�Os݁�����Ǐ���|�/�`����ц:�t��H�V�F4��r�q�h4u��h
a�E���^c2}lU#!��q
v�n3l��c���Lk�;�<pF65� �%9�Z�49��y�>�-ctf���	�Ko��R
~�iގ�5�y�eIq��+WY1�O_���gz�+����q;1M�E��塭�)J����>p^(�r�w���FQ���RuJwlH��c��w	 {^�Ua�9�c��j٘��W�4��⾹��8��M�4oǟ�����j�K��H�k��0�6V�>�-���
�����x�
kL�K�P�kr�q�}[��Q�C�q�[��6��O�|Q���;*ԇ�8�'��?�� ��A,yi�ֽLB���r�L�뵓�v�p���ҡ!��-u	���oXһ����E�a[��iv�L(���"M	�F�.i����UF�,���\�ٿj3�1D4D��ئ�67��+�K�,�5�U�N�ɖ�t�'}N�U�Û"��e�T�8~0(I's-8hRm�����<�RW��,2�<�Z�����{]�/�bj���s��=��o#�8�+���iz�j��6��r���W�����#�l��u[-l�PK/WUWpip/_vendor/pyparsing/py.typedPK/WUW�`�PDh pip/_vendor/pyparsing/results.py�=]s�6��X�R"gh�噗Uũ�l�w��ͦ2��Z�D��M�"�%�����@⋲&����c*�D4�F���h`.Y�žh�hw�X�Ֆ����&�J1J�+�owUݰ���}�.��t��˻D��~H����{^��|�C�봩j��.�CU6i^r(�/T[�]���$�9"rM�_���'�}yL�w��I������B4���D�M�{�F�ьݲJ�<6\��;^J���G�ٺ�ٜ�%��8���X�l�SZ�������/��̈́z��w�Ł	7HO3#��\U#�shj:���d|
�y�7�y$x�N�n<a.����ŲE|vd4mV�
c�wc��m��&o��m.7�ּ��e�{�Ϝ��I����3+	�R�^���t�Œ�e��'Ya0|l�
���a��5���!�8�›�¶<-��,]�8�l*9f�\��X�6�DR|�R�RV�4�h�(x)��b+��Q�e�?!��M�t<[,ƛ�Ȩ�6M�/�
7j��V_�e���,*8g�dA,��/�����97�jd���n���|@������,*�[��L��G�փ��f�7ö���f���0��u�,=��K:#?�0"
N���(
t����p�}��+�@�%$u��
(I��j�z՘3����L$�`���������h
'��&y_��5���\‡tg�<�gv�
{Z��E"��K	�%Y�x�� �}%C�۰�|D|r�TT�*��0I�)�~��bЏ�4�$�0g��G��t��&8��g|�~};Μ��cY�-��7n9���o[�!�Z��a���{->�WW nljM�#�&v�Ρ��uо���r_s��=z�5Y/�?V%,�SЈ��(4�'8R�'H;�fw��e)`Gp@��et[ei1a˪*䋦��N�@f��	Y	SZ���[����jr�/$�֫�4�-�e�Q���(�N�E.uH~��ٌ���?���c
�huY	�������^/h�:)u
]�0q_틌-a̓��>�E�+,�i�~:6�UI�ɂ
O3\:��ڪ*�n�h�Z���-�I�χo~��?%�g�^o�]�ۍ>�wH42���.W:�?V�c
��
����FJ#�0̉
���ހ�;^�[��� j}I�M�%K3mb��ƞ+602N-��6';K��Ka�GE����@�بq49>ʲ�ͶFԁf�fd"���s���^Dv��E��_}+���-<�������C�__{�7�����l<�)��0F�1��E`W��L�-��2K趨&����������z���}-'�j�qX�k��|��w��.�ׯ�ǐH���&�j�*u	�눦����^W�݂=��-R�uoq1Z�bK
Y��|^�G��Wpq����u�#���+g�`��x�����PV`l�G)x�Q�0G_�Ns���A����:��	��I���Ϡ���*�=)�fM���)� !Z�H\Z2��k�M5�i^\��3��j
���)6���z�yt�(`��$U3�4��*E���1i��T� #�4"EN�\6�e�	�`�G������H�dE�b�?���ǧ1�"3U�����=g�4���8�t�@U�l���|����ƒ@�
�0�R�i�cp�~�5zW�
��KX�'�ј0^���
�p����؆��̅�҂W5�bc��2c�(�7��E�,��h?1R�A�����w�p�}���$��D��,�ў�OS|iJ�좚@B����w��G=�hH
B%N�G?j���h�9i{U�I��_���Z��-e��K
o��N�H�����C���j�)a��]�L����HEx]яYG7�N�8a�M�_K��+��yz�"�|J;Z�e�t���xfW;B�L��⻆E�G2��*H����'�^�P���~�>
{+�W��椡7OEs�)�'�]�+o�\-���'��
����K����x�]�!
�%��Fg0b���b'm1j��C�r���C�
�gO)��:ƫ[��,8o�N6�~	�&s\gsr@�$�α0��7n}�Xym��`�{JO�r(7���‘��'�9�=�6�2�'��mw���j�Qh���	c!�hR~ͮ{�D��VR�WD>a���r;$�`�,�Vr&a����.�U״��ѫ|�`#j7v"�Ҩ��}�#��u�i����$�Q��L���@�Q�j��k�e�j��(�=�� ��DV���s�L�-�HL�y�ߢ��#��ˋ%'دZ�J����߰��2��)��[�R�Y�`�iT�Cch���x�`b��[��$�C�bl����*����`0-�,� )��Xod{���J��_�k:��Bi`���ك�k;=��zOMz�RHގ�H��������>]G�q����.�b���Sv��l˛���M��ح��<�R�9˻�ʸ��U�D+�
�O�p���i\�R�M�:Y8#�8G�z�|W���`��3� A.��-Ed1���|�KM����@
���
p��x��n���	�m� G»X ��Cpp��|%��X ����a��AB�e���{���_�[�5, 
{����6h�к-$Z�J]Ȑ:����k��!��EC�*j�+�}m+@P�^F��.Y��Ⱥ���g��`*��tD�E%E����%3�FG���R�*�aL�a/c$y�FKRGzL:�!��O���{���3gA�}b��=_���[��f<��Rn/^�mŷ��x�{��r�V��|��2��X��pbwP�mY���/�E�t�ͳ�؁vr�J�)�E����L���X�!�o;�Nn��Q��G-�Z�Qh(JƐ�i1d(!��B�+�X�m��h��`�N��l��Y��Y���IP���@�B��o�L�P͓z�F��S���*��k��@|�10X���$�W�a{�n��-(�3��F��T� u�������H���.�l_�O�:��	,֏07:M���]m��NMK�6����G$�cL���&��cZ
�,2�h��)��q.z˔p��I[�x,'��`�cBv�:�ʈ��D�઻�f��.��6mV�8�q����/V�_Na�Z)�n�ۯ����N�67:��4��@f��I���ʁ�N[,��1��EZ�SK��%�dvq�K
�fyy^��gdm��jRi;�OE�Z���p��j_6 +S3�Ca�>��j��9�	d'<ߌ���N�
m�;���z�������*���6i���UJ���1�5({$�,	E�^{뒬X�"��w	�&G�-,�e�6�4C\��9�(#����zŷ��-�4�f�Ⱥ�VlI��^k�}�k�?'�%Q��"��e1%7��ڊ%�|�p�1?���d�>���Y��!/x;}Az�*���N,[�X���I����=�ۭ3��z#�<1�,'fP8�̼Y)Y<D/��z4��(����gNή�/�\�%�ݻw��N���N��Ɩ3��yJ�ԡS�~[�S��>���YB"�I���ZNȢA��'��F")`N���=1A�yW���(��Xe4UqGkU��Ž.�p8z��R7u�/�y�;W�M��DVl֬���"Y����M���l#�aP@��)L�7�HB�9�g�k����Y��k�zU�Q��VMR��jZ)�B38��oCMzR�F�
��_i����ґ��؛�!m�w��{�zK��ZzC���E��|Л�^��������)��3r�dG*t��,t�Fۯ�P��	]U���Q�;l��¡H����hP!Y���Vf�vIOV��쁗w2��T�Ѧ]�qp�Q津`8��%��Ğ�:$i�ȇ'K��w�qǡw���	-��{<s>|tPE�2��R���uئ������
���� P���bB���n��{m��jf���B��\9w7�kO�_l���B���7F��
nZRq��F��?���2�hp��l�ϋ&/��;�}�~���ң�Ei�C|&�M�ٍ�>����n����a[d�1u��ѓ5����&_�b.?�cK	��Ŷla0��_3�E��A��<5u��~2�%�R� /6�G9�<�`��=c��Y�s�K�G�2舅[�w�s��N�1Q��s.Q��UQ�g�u۷�.�{y������^�s#�_�zMbp��������q�V�l�"�]�B�0t���G����$�2!�:��L�/3�M�6�0?E�mX!�/}wb}��cд���w�ʠ'lr����P]�%m���d��bѶ�b��a��<ਏ +sX
iqYLj��Q�)������Zp+�=pD^m��s���'oJZ�Q,~lq���\%ʚ��Nɓ.'�=%�S�Ҏ0g�AY���G�@�z,�̬�BZ��*�U�7Ud���t������o( ����x�:�~�+���9۞��6��z��	�F�T�^���5ֿ���@/�%T7��9��:����DFxP��Q���-���i���f�cM,����pSk9�ׅN"�f�ڒ7*�	�-o�-g�j/�J.��}z@���`,ɓ�y<���_��p�{�A�'��5AͭS����_~��W�i��W������Γ�f��ގ��A��Q�Is���k�ژ6��cۨZ>�[����|xq!׋�򡣖�	x����R��vq��g$Y�-�Mt�:����S.��@3�Ur}VHݥ��#�a5�	ed����j�~ݹ�>v
1���CD��W��ñ�Z����?��׽O��Q�N�sY�4��xD&�F��R��L�nd���|����<��u�X���6��9��
�O)��N�@Z�}�p �s%�kC����C�G�q����dZޔ8�[y�sԛ����p��R�গ��`:�?Ђy?R�L�{�}=�y�f��CZ�PWF������A|*�b0�?�0�/������u�
i>�BK�{8=�̚rw���븹�}֦UV	��P�����1iH��)r��Ʃ�,_�9i���`��^e��=m�4�j���z�7�`�(��,@����z���j����X��m�k]]�Y
/�V����E�m�z��Ka����<�1�a���q���I�GP��QA���;>�4��[zûV����q��6��nn����.on��:�Q�/�h�J��E+�`�'C�͇g_J܃��	��qe^$��9�\1`�v܉#t�G��\b��R/�߷$+p��C��s�קc�:M�
l���Ӧ7�fF�C�V<PfH8���ց��0>�Ɖ��΄����v��.��+�%���M��p�H���H�wdu:�lEL��2�T�O_�aT''NE�J��l,�s�Ҫ��v���|�*����~$l���u{���i�]�ޕ����[���2"�;J���[����c���zwt��"//-�b!���
:�Tt����Lk��ym���q��YF�fhD�AG�������W������(�uA���g��O�1�>t��,�ns�����~�QZ m*	n�4j�t!�e���������M�Zw:p�RiZAG5"��obL�>�	�HLȞ�@Et����?~[�z�$y��
�Wj���W�i��O�i�����S�u'��9H1~�Z��N~�KE�!���������J��<h�r�~+�t��w8{<������@BAJKN�"S�<�L�v�$�7���a�ʝ�}�NG���s��������y6�_��#�V�c�Dޙr
�%�Ƒ����C}ȯk����A��D>
r�Am�9{Z�$�_�����~%�����w�|�O2�������<
3#x.�A��S�?��xE�jE�h�wW\'*��B6ɾ�o����y�U+���U�ݛ�o�|Y����7���������|��ʚ�y�����t���.9�_EեUi<���d<�H�
�~�`�/WP��F���~!D:\3��/���$��V��S���_����b3��ʫ@TNg]�,M�I�.�l�d��u����!���c��|w}��
�93z��p齚_���c:\����a��yh�X��D�q!�������|�*gV��x�n�T+u#�W��
Ԋ��5mh[眘HW�����+v@���^�d_�O�Bw���L�TN�m��H$$�t靹_�&$�;$��-��]������g��nD�<Y^�"�����C��͏���7���PJ�c��^�
T%C�� ��i��h�V�y�q{��w�A^q�^��苣�����^k^��dP�v>:��`�u�/X�w �(�i��m<��
�%W<��f��t~M�.�'؇^3G�7��JT�z����S#n�Ҏ�%ZCA�����-�2t�ST�g3��a�SyJ�k�Yu�t5�֦���se.�\�m�&W4�u���{�ۡ��]?����v2}P��9��y�!�f�f{�9Φ�����j�W��>F�n��6�\1�%��w��U�2{EG|t�S�-�L�wr�^�r����F��G�ٮ�H^D�	�Ņ�Q;���zSG�/|�c>}`�
PK/WUWڼy�
�4 pip/_vendor/pyparsing/testing.py�Z}o��?���a��s�8׭�w=\ӵ�a�w(���m���D�7�0`�q�d�CR)R���
Hl������F����|;/�''���HT�5���dM��,����ќnYu���֩E�X;�?!p��V�UW)�X^�[W�+���o���b�#�nð�YIk����D)圔���E_����Ϝf��4bD�����8i8�4)IrrW%�2i���"�V��:�)+H�:S�^�A�lDꂬ���ݎ�X�zGa~'�}��z�l��6����hu[�
5QYM��E
��cN�6�Ik&�[�hE��U|�x+�E��MJ�HES��
e�M]����d/�Mow��A�
�����Y��岿��]R��6���\��	�J�*Ḵ>l�A��&�l+�e�"Њbg�N"��{›���Ƣn y��i��׊�;�^-N��0-#+�ӧi��< ?˟y����mU4%��~���)y.�\����48u�yF啲A�c��N��*�E
�
�<�y��nY�-�����$-��2�_�Xt�:�/D�ϧ�,.^ zoF�O��錜�=��ۧ�B�����{���A�~Qp��Zn��=,F��-Mr�5�� ��煡��$T9��Z���M8|��kO�P�;��H�0��꫗�^�
����W᫯_���h��9C�].h�(�Q����?|��KE�ak�=e�Pzx(<�3���j�b�+���.8F���m+{�a�*^�,������r%g���d;cVa�V��F;P)��y�D[Xc�W�X��Q2��#��9;ڦ"d�-
?���.su�ujlS�ֲèhS�����%ٲ��u�wՈ��j�a�l��!d�P���cdi˛i��HSՂ�P�ho�UFs��)Y*V7U.D2c��8W�{&��V�l�b-JZ���R�؇�G��c���Q�̱����Xj��/�C�b�PP#n�]!�$<�G���	�]��Q!ǙL�f*�z�L��p��<w����e�@|J�3{?��Á/|}j�����r����!�ʉ-G�؀�\�{+��?ew`v�}z"0��`QG�G�ƨ(����	��*j��p�d>o��c#��(|�X�2�܅�&�\ԫ����+�g�cZm���m�@���o���7�C��/EO����K�%����d�q,
�#�\�+�.f�����UI�dl�����m��7C9�GQ^����-�fJ�6C����@ڽ8��{߮�i`5]u�޵]���hDu�x���gy��{C����Z6�4'�8%s������n4�{��q:�,-��I�����|R'�h�$ᢝD��T�Ry�
�����!~���1��LQ�_���L�tJF��@��3��*�
@�cR��㫷Us4�^aߛ',��஢e	s��
bұ���1X�!�˦&�HxG;08��4Vu7$�TB���-�Ш�/��@9
�b%Zl.$V�
����L�
�/ay�����c����Cc`�����%��/�Oę�ogB�8;&L=	g/�0�Ɂ�1��ir̦��3+6�8R�P��9��L�Q%�_7)2,ơ$"ES#��M�������1'߀FDd�bc0�{g"K�M�B�(m�50B�PP�P#�S�Dq.
E&ԟ��lHdR	g� Dr����8�2#m�V˘4\�l���*��|z�����vU��L8o��Aե:'�q�k^�
hf�R�㯋"��k��fFtY	4h݃��}�k/������ma,
�2�J|k����)T��ݱ[Y�������%Hƪ�hw܇��U���}��6��4l��P�1���G�����L�6��x=�g�]Ѥ1>�<�0�&�x8$}��`I�N"z�e�@�zNW�nh�6�P�r�e*錮$,+뽒�.?�I)
d�#�Ahƀ�{�_A63��N�Ixa�)쉟I�Yp`Ir^SH�8k�BPwZ����FD�͝�5:�N�;�����{�@��7k��ȑދGinD�%��l�;ro�I'n/赴��&Ѓ���ʾ%�g006|�c\B��f�֍{#O�ƫB��W���,j,���&^O�$:�2x�#�lm��!�:C�O�}Yn�{9]A����yS��������^4��IH���J��ôC�k������xy���-�~T=zֳ��J%xr��^����(�$����*$��nKP��yͨ�5<`h#���T��}�����ϖT�g�]�Z_^j�k
����+A~��F!�����8�H�n�􍑽�����,+��q�I+,��G�7ٚ�ψ��y�@X_�b�R�5�NU/׀��1k����ߗ϶�8c}3pc���n�`0��8�GU�f�m�bndU�G,	�����}&�5KK|K�W�E���v+�Du�p&����v��\��:�L�,'j/�V��!�����)�k�T�7���Y�X��%�׸&İ�j@��@��n� ��$�
n�W�V�`H���E��$�2�m�ˤ/�	#M��~�hɖ�>�xY<�Ӛ'r��P	8�A��&�Y�#5.).����-��ۼ1�B�ѽ/�b�	/S�G+�g�PI�I�s��z{	bi~&��}�	��h��jW��Xwc\��?ɜc�98z��ɓ����!��ˆ�X�;9��}�.R�H;<T�{��ۿ��X<��B|�����wR�l#$��9�߀�H\-,�޵!���exby�ho*-�QF���	�
�g���h���X(����̬�O-�rG�G���5��w1ƬU����塊>n~��W=LlP�b=���3Z:_b�+Z�F��;�/�iͷ�?��/��V��/>=�[�	�����׋��0)!���=y���3z��R�$`�l#�S��_��_�7��`NS>�--´hWq���"�s"lb.p�N0N�5d�N�Y�*D��cаxd�����rX��r)v����/^<�f��b|��2||��lءO�h���Y�2�{]7�"2;[E"�dI�?gd��
�85���b��?k�k����?�.�JkA�Lj���5�gdA����Ѷ|O�Z�|.��@�4T��������:�NE������ʋ�.�!�+��Ugf;`N���0Xg�Y�Вu�3�A>&���9Y�Lc�\^�Ȭr��@�������>��N�)�uy���'B�;�8?t�sT4A-e�A+2�	.��=�; �?�a�~�!�k��bysa�DM6�=���h�u7
S<zC��3[�`��@�` �@�-.^|��?|���s���C�
�.�IK�|#�\$�����ЦDD��f�+0(�X%�x
U/|x����w��PK/WUWI�u�) pip/_vendor/pyparsing/unicode.py�Y�o�������	��z(0R�6I�eɺ�0��l&2��tbwФ]�fݣ�ڬ[�m�Ӧi��]�:I@� ����d�a�v�I����4`��w��}�%!+�k{Ni��˹ˣ��`-���2qC���A@$�w@�[��#µ��-F�7����h���z�\�XA@��5�s�G�vmo���s���u=7�v�3�I�+�]�T�{�1 ������v9=L��e'"�r�u�d��±"�Ajq���
�SC�I��b�cL'3�9�0$KV`����aE2
�ݼ������Jr[��S��7Y�C����f��e2�����]���w>]�� ^�1�� [��
����Rj�Ø�Ѳ�_�BsѤ��9�Q���+��ρh:"���-:,܀
���h��7ӊ P8/c�����X�!�
�P:33����a��U��d��
B����습��#�v��M�Ї�Y=j
F�G���[Y��85z���F03��Jr��h, J]�鑅5b�S������3-jN�?7�*3�+��vX��l�#�J�z+(���!3a��(�g/+ػ7;N��̍y?_^-��r��{�)�QK��>�*�rq�</V��[�CN?��v��ťp��(q�)�Q���v��b�6�+E����j����f�uCf���4dye����-9�Z���%~�ǘ��/�O�Ϸ��Y�|�Y��!��M��&�!�K�y/A2aN���6)z,P�.ī��y��SD`qo�ue\JV'mf֩�J_�����uT�l��:!Ժ|�0�$,9����|`��ʐ�p�U�ɣD)L��9{	��2l��+��?�ÐBa�K�u�d�k0�2�͞\�=3Yv�v�T�pq�b��nf�tl�z�����RrΪ(,?�8��2�b��˱'�*���J19������,C~٤�.��C�ɹ<�9���`.�de�OA����q{�r5pq�$��V���	k�V���
o2�6�&���g;���̮��e�6E#�J��v��Q2��m�c>��'�8����|�з�����l���;>X����A�r����s7.޸r��LK�<=EO���G�%�2�1}���?��ҟҟџ�_���/�����
��&�-�}����M�@�H�D��?�uz��Cߥ�{�"}�~@/ѿп���C����^���*�F��O�g�s�E�P�id�&��6›|a�[���C|��b��!��ƺ��)϶D�t���:��OƁ1�>\@��Հd��W��ˊZ���f��'�>��I_sv�-�a��<����X^��(��xب�md�6�Ys����gu�;A]9�:�T �&*��=��uC�4��J��b<DQQ��t�J��#�R"�<�2s�qÈ�q��0��,�Lj�mW�=�T�S�<Y��l�lf�3�e���P��"�G����_�B�ُ�Eg�:�l�T�����$q���ekU�#�p�+	=t+p탬�l�3�<f
�őT�l���� i&�sI{u{��	_^5�J��?`���l_P>~V�\�ظ�&���G�p�I�>�h;�D�}M�Q�ɪ4��Uߩ��� kSȪV3e}�w�����4xpI+U�K
;
���h��&QC�U�65mO��#&i
�j�vPԔš�8���
wDŨuq�>�z@�%�:�����
bR�6%j`�*�b���[E�����,��0U̚��
�l�%�M)�^�P]�l�h[�FC��Q�hs�i�5�uM��D꣪���Ԇ�b��_��5�ve�*���^Y��`Se<*
M�N�Ҏ�6�5�\{�'���ű*yM��ՖA�n6Qc��j4�����XE���Z��bh�*�2�쨼N�=��˷p;�����W;¤j��B��i�5�̫(m>��t0T��j�HdV;m�y�5
w�\�-��Z�SkH�@4R��C��&�"$8�W%^A�Z��W� �|« |�#�U�QAj��ob���.��;�6	d]:\��Mm��X�F�ь�.��Ȃ8�췼cn��s}k��,q�o��qx����T�ŧeHĥ���O�̨����)i�$����#*2*Г�_�"Sl�ݴͣY�)�d�\U�
��P�G�Zb�6l�s�ٓ�i6�6=	)z��db�lv��d
GcL5�����1�3�Ǒ�5�=�j��eUM����PLY�3G���N�?r�G5q؝�#;��i;ǘR�J?�'�|4�$���K���/�}z�_�΂-y��仧߿{����3^K�S�=���S��=u�(��ώ�o�2%��!��\2�H�)������[���k�O��;߮��<}+ӡ�CQ�Cp�P�"J��Dz�lo+�2��K����@ŎmZKL�Z
���

i��.�6�uU���c��|1�#��f[hkx̶&Q��4
9�@�r���W�	�<F�ZT�c��u�����d>��ŪyXb�hLIsx�������?�tD)*w*�K�N�hM/L�Y���NNYb���Q�g����)P�[�:��eٝ��/�9�sr剏�}5k-��R�!�̙��pf
{/`�
�`���)Q���J�.�z�#M;P+Eũ�%���9�ʢ�� ��9��y�+����ZS͵&��>��g�#��?�.a�zɧ���O ��Đ�Ϻ��W/޹z��;�:s�=XBd��q��/M�3N�u��Ɨ��ڸu�6�|��e6@��#n�~�:�}r�Wo^���M-o���Ƿ_�}��y�7<
8v��{o}��o9�����o��ʥ���1kXx��ͫ/nn���8dV�q����/o�_�\��������˛矇1�gǿ�x��PK/WUWwV�Lv
�!pip/_vendor/pyparsing/util.py�Z�s�6�_�cJ�2/n_r�:����d�q�^�{Pt4D�j`ʶ��~���:M���X"�X�.~��	۵�J��L֍6-��6"o��57J��
���C��
h�V�+�
�j]�Yit�ʝ����천�[1g׆7���"��W_W@�휽W�œ���;�'n�,綝Ͳ���ݲ3�oM��/��9|�Dqt��Z�Tq'��,�)�eY�U)7YY�]��DQ�F�Z�W�Q�ڰB�-J�
o�ZV��3�
Z�6#.0F�2X.S�vA�,mkV �r�Ky#����Y!l�"'��p��_�%�W�v�zR�̊6�+;g�+^�D��Y��kPЦ#A:*�	���x4�?etK�ij�ݥ����ם�wLZv����>{�$�5�0qrM,@ιR�ek��0F�P��ڶ<��ĕ�ξ�&�'#ڝQ���߶�4{${0mG&*+Ɠ�V����c���Hifw���H�z1wQ�W(D+�����@��7���΀HN�B����5=���5���Wqv���d�8�+�/�nर���M��|�9}�H6�,�#��]�صl�`v�h���-��וT�2n~�7���M�㻭`�4��S�z-;M��~�-(�!��wUˀ�E�k��W�&����q��E���]��"fka@ �	�D�]ct.�M��D� �/.��0�T��S��czAa��4A*x�ɹ�Ύ�U�]������xqq�`�Pl�G�V��6�Ԫa���|M%�5�e��(:�w��l.��V�M ot�n����&�KG��BɬwAv���}�K�_�b�8���ꄝB<��AE�\̽���h\�~Ξ��o��W�Q�=+��� ����
������O��B짂����?����6x5�9;}��|N�G�dG��M;4%B�����n��xo�t$$S���l@Ց��\�0l&�н�g�����V}A�^Q�&�s�뢯j2�B�e�U9(f� ���U��=���n�PN�,L>x�럡��}�8��K�Or��C�l$��N�i3��:�4X�0V�D0f�W*�ljV��+��N�Vb<��De}�=y#�X�͉ 9�3M�Mғ4S3h L�v��,�C@�����@L����w _����#a�F�t��}�;#��4߃
b���Z���6�hTp�ث�OF�coť\�	ic�~���Cz��b5�i��m�����{Q�qf�rd�寈Κ7���E@b��"�
ϡ�;V�*�Qmg]́Xk�9�~V�a�=�iϱ`��rz.��C��!��^M,J�C���lg=s�T���9�,�t�_��};�W���[yu��n574�?�H��:���C��v�D{^k��n8��\��orѴ�[���ﰛ�Lk�k�Vg�,�z�:n�[g �=���GKz=t�#m�	ȭ8�C�|t��~�8k5�t��[Y	�>tL���h<m�(�X��ə��ݴ{��b�A�2�0��$買�	]9��!.��G�^U�!L�gT�f<��q�Q���-ұ�(o�0G��
?"\����.�'r�_L�_F�!^R#���.�,�}�|�9�p�������
��a�
g�
�o��=�4���D��H<��#����6����'��16.#-:Z��q>,f!&b��0�=B�3�ƈ�9ÿ�2�/&H�\��􂝎��`r�WJ�c�o+o�)`�1l��?�(�)�x�vBǬ�XMM�k��(jΒ�-hyr�[����?�h��1�"*Y��j��0���c��Y�Q�v��>,N0�jxr�Yp���]&�ҟ��8�
�l�?�i",�Oh^�/�uы��!�Fe����k��R@9o�A��FΨ=
�#��쇇��������#[�1>��v�/-|B�:����'�����^D'�q&[��1�O�)MO�\�Sm�hh+pQ�^��cC}3�):9>7�r4FƎn����� Q&N�Zcu<��x��#y�� <v����%{U�`�D�!���1���D�@<���B:l9����;.G]
�C�u�����r�W�#�^�KH({�վ��>P�[���S>)Ղ��^�!y����r����p�5�Q���B�'���
������a��Zl�\Բ�c�W�;9�w��y�
������;����S����V�񢌔̲UJ����
�
]�ϰ�z�
m?D]N:B�@�t%�7���*D�%��&ͮ���z�V��@�Ҋ��y��n|CK��&��\��P0M�Ŷ��ȿ��M;�@�Ea��6Y>[-�>�%]g"ͨ��[᪪��1�����5~;�ߓ��۞x�
�����m��8����Gc\'[�R�#�l����H�im��^�Հ�j�#���H��P�w<�%���t�I�X��:|�:�g�x�ᵇ5�2lݱ���7��w~��ٻ��-�Cow]|�������z���#�eǫή�F�f����R���l���<�q���r�A���_�\D���yPq���K���J�K��5>`�V�G#�^ra���,��(4�A��PK/WUW�a��^)pip/_vendor/pyparsing/diagram/__init__.py�<�s۸r���@�y��Kz�_�(���8sq�i]�B���3E��e�4�{��e_:���	,���&��z��NDy]�V>�m�Z}T��v��ʪUYq�l�Z4e�.ne]�V�ͮ�Z]��vF�k����vhr$���݌�}�ֲ8�4���?�Z�e�?�w�����?����cVUٕ��I���:���)��{Y����]�\��*�$�+����k�wg��֍̻��#����ąV�6�b.&��}��(��V���+Y�?}=z�?��x��߈U��^��dV��	@5�#�޷W��Jw�J�v��Z.<��H�/�}�,U�=_f�V�U�t���q�*�{� r��>_�0b�#t������"F��y���T�����.A��2�n3�Im�j�ǫ��y�i=�8\�j�Lz�Z��1D���U
д+�
�_z�cKR�m�t��C�#0���z�Ѓ7-A���ʄC��3�B2�����J-����$.�ӣ�c�Au�!�l�D�*�تMU�+)2Qd]F����M'��Y+��4x`P?���?�Yh�E���:Q(��������g�0��O�D_$��NfBw�t&�Ia���������=5 @�/iNY�f�u7�D��9�;�@�����Ć-���hS���Ŷ�V��·,d*�#yYK%��	���$�d�
QH^?��NOx�0�4�Fw���f�N�\�.�Ә���&���ʚ�3��\����v�6�q�JP[j	��p��Z֝�ӆ�QL��+t�hXY���̙�*�H�X�(��W�p�/0`�SAM^��inr)��[,-��L|��Ն$��	�Qa��J�	πM�t��lU˅jk ��#A�{��A�e�LS���2G�S�ў�5Q8W�Ì�d�os�S�9�b�r�J�EV�d��!*�:A���8y�m�h��lr����$���Mx{�z��d {~S�ݏh��J���8��4���T'�M�wJU:mx��(W@�"�j�@[PDm�q7��M+5�o�@2�V�FmZ�˚փ�G@�D;�!E-A��n�$L˳��$��4:�����6�5R��f���c�w��������
��5��Z)�
�]�2�t�|��4Mg�r&��Z�%��7[����������N��'����a�B|^KP�C]�n4�+������¹}-&�I��[i�ϻ�ة
ѓ9Eb�'��.M�9۱�X6Yf��H�-�hܖ
8mH�%3M`�z��xA�etTh�=	޶�5C���4���\؋	]�`v��	�]��f�9��,�熜�AM��\w;�4[$D�H��<>_�m���c��u�̛۬ڠo�T4G4UaW�S$���Ӎ�9aLs�쒞HN=l�7�X��L�Q�#\5�Mz �A�	�P[�$�@o�\��m�X��
���L�S��)�F�P�0�t�[�(���l&��%�rY_�g�Ss\�7�Dz-;��B�;q���*��K-�e������5mT��{��y��&�s	��oߢS�*덟P�v�{hp�����*�8�P��\B��B⡭�!�p���0`	g��_�#�vܖ�o��&�=m1#�'�R����'hڂT�"���o� �q���%�������������e�'���z#��
V��'�]��Խ"FJ���g�`��tۂ��A�*@%)_�!�9��O�w�l:q�*`z��O�~{�z�S`5wSP��hE�8j��R<�y"�V�n��
dL�5
7ɗ	
���`8?'��O0ނF!�P?�d��������'d�:g#��L�FΆԪ�����$j�|�i%�7�oZ
�\UW��[`�����Һї��OG���r�-��h`:x�Λ���3�:{���և��b�7���N4������`��al�.���M����4�.�<p��/��OF[1���,X"�hd�,���i$��U���C��I�.K�?Z�o�ǼF(V�
�\��%��p�yHHA�"H
��/��.�
��HvN7�`�ݏ��ot��x����q}�d�+�Q��$��ߞ�ԙov �]�,�Qnw�½�Lm�Nİ��?�����\j��i�+�D_<?X'gL��Wda<����*�.F�!sC\h�9����f��k�	B�cM�!!x��g��Y�(�pv�ρ�k�	X���W�ހ�jǬo�ҠJ�r��J'r�v�A����\���;f
ຏ�Xv`}�؉�	�뽒����.��.e�W�˜���/�yߚf�[A���U�#�9eSCFѪa�bvnSS��J��|�d1ۮTe��
�D��#h�hB��
D�s;O��0�OBY��?�/_Y��e��Kz�+�~�9������{uૄ�����v>�4�Ğ{�y�5�@�EY��[$�i��8�,���1Z�s]�=��@Dx���EIP^"�){��)t'xڅtI�e��Xg��t��	���33x�f!���v#�6���rP9#��^��}���9�K5���إ��w����1@{K1 �:
JNX���&�h�T�/{����5��ԦŦ��01x���x:��4����U�nY,,r�i�9��e�,ǢP�sCb��lΕ���98p�ʚSP��0.ӛ����0���i:	����'�a@���C����(��$^M��Hx�t4 ���^�-"�O�Ȼ1���5Rԇi��	9�HF�hÞ�&�T-n���VVm����\a�����KP B(
OB�G׆�
�pb���՚W���h�	�˱�����V����Ȟ�Ӫ&�g���쯭^��.ٻA�2t�I��p̑�p���1�gN�:�&8��g�7
@�;�x������.��p���}R�"s4�;�%r�Z4�T�ɺޖ�؞g�s�\(�|\o|#"� 8���2�W#g<�<do|��)g��d�-�=أbA�/�yAu��=�	��O ��� �'�ʘnj��h�g�ڤ�����H��E�4�t��9�#P"�x=4]x���=n�ل�[m?�`5wsD2��hə��RzW+k��[�C�%���`b�GN-�3"�7�pX��ɋ97ڜ7mj���].
^��I2�M���3��S��"ũeA׺,0��=x;~@��A�j,g��ȍ.��Mo�B���4�f��i�����
��u9�˒�0��P�0��*,X˩��'j'X�BcnH�O�$&���`�1��i<�#�� ީ)�A���H�Y�-s$	��)e4�`�%��\'�Y�Ba�^�OY�@��n�~o�t�d��'�fS�4��7<nbRo8����=��W��@i^gmQI.��KK��I�Y
�e�X����<���>�`�l�??�8_��;��$C�)z��z���*H
�X�( fb��ʝ�fot5�g��~�u0x[��-�&����ѡ�%)�\ˬ��P���d�b�w
~�uF��@Vex�r��z������:�|�̖'�=�J�.��犫֞l���i�]�!	4����j��M|�N�!I���-�h�|BB��/Ӈ�i�*C�Z��B����^�uM�EM�r;�E<�@���S�T�����SJ��v�l��0�{(Ǧ�w[���q`kl��e^h`�����}���q��w?1:}�*��/}
����km"��B��c6����pׁ�G���|�5��Q�|�=�.�;to�e�/|�V�V._J=F�М�e}R�]��|S.%|J.�戾8��J��8֤�Ag[?�S!����8!��q��3'�4
{4���������(�G}��-�/S�*�L�<�iN�5��W����l�ˆr߼����f
v�q}������2�~�-�t�h�3�p����2ʉ`Xd3t��[�9 0� F?��è���{\��֡;-!<�`F�O=v��:�A����v�V�Y�y@�\e�CPU�S6^ ���trb���.�� P��Qn=�mT�\t[��%i$��.���;�A��h���Ց�h�*�}`�r*�7U֊�J�7�aW��j�����J�/��#:�sw�քU'�&T
׏����	�]0�K�#w�$�B�f�����>/��ǨwA�c�}ߑÒ=U@ �):h�;����)�lR��ͥ7L��רJ]��&��D�$�2gC��>(G�F�f�H�����wP�B�
�%�.��a��n�7"�@`.O���G���RY��N9�Gn�Cy��ρZ��|X�+@�mk?�O��xGKV�P�����:���S\doR	�6�A�hi��^����غ��K:�$HS.�9�z���v��9��\�4{�s6��Y�P����,�A{q�)�Ce
�����O�q�}�7�
�K��׼��Sb:��["/>R�	#�����~+ɫ��͓Ui��/f	��l��@|@r�&4����]k�'��q�v��wC�?̨/V��D�������:�x��s�|b�tj�Q�'hxmX���Q6c�H$	/�W� ���Ipw�Cx�|y'EaJ
���t��_�dz�U0-P
ty�*�љ�tWVb��$��R3��PM�@jυEQ�ĉ�N�VEV�f�EO?��cC��5�@��Ϗj��}#��и��3�7+
�U#e�J�F�֪�Z
|�k�7`�a-<�
3�}�؀ӺHԛ��S�m:�wѫC����W	�a�5�^���L��u��n��\����C��I����0-�8
~��ޯ�cZ���m��ұVZ�����������y���)+XJa�Ks&�:ŭ�E�^sQ=*SA���!޸�Gv&��
qf��W��7sM��e]G���U��vA��RC����ְw��M92
����k�FB�zr����\bŢ���nB�R������^L��Z�����5�x7�4��j��RB+Ӟp�CS�n��J�V|�G����t�K�:�������ʮ�'!m"�$��qh^�tg�Yۗ�o%��-����*�Lf$ئ{���m����ݳl;*7��#�tIZ���������4�_],�@�X�7����&�/�LcS�ԥ����Y�����0N*��e	�Y���ѯ��D_���~�,�W�6��W;����ɕc3lh17���^�$}e�@k���A��Fǰ�a�u�{6�,���{ǾU-��xP?佢��p�s�X@[��>ż+:F�z�M�x�ЖʀH3�zI�)�����<Or�F[���/.�-���[�d׸�w"ng��6�h4�u���+��N�����8��Ϟ�c�sODZ��DK$��:��ć?��y4u_g��qݾ��`I��32}���s�(��eق���5�M�����M!M�3�,��P��g���'I�\PZ
sl�W�j
�"���M˒u?v�͡v��o��
V�W>���}(]���m�j4����d��ZtT�O�&�]ڔitR&��@j��a��^��L��Y}�7�5���[/e@�Jf(6T��C�GL�����BN%v7n���
g���\�S�F}�Z�!��m����0X���ω�X�`,F�&������VIP��,�qH��OJ�k�^4�,�?�<������74%g��
!�-߳���ȍט�.W�
�8�pպ�A�R��I8�p��כ>F��@�e�����d��F\�� �
	f_aV��3�Dr�U������2��7��=��� 
0���_>�T�_tL��@eJ��W�������~�����~be��1C��W��Ô�jcgv�Х���³��_�ԼES8
m��E<~��L�����=kgW8��=��]=O&�C��7=��;�w�a.}�Z��r��g>��O�y:x�
{ e��?�����=����OO@�#D²�fh���/�><�mCFH�\��d7���?x.L|�vƮ���{���y�M�<C�R�&�23�bB�.8��J�i$����}<�Κ�r��=��}‚�b>iّ�=x���z���?~�mD�C� ���-ʺ�vS��J8���nBS'��oә�CT�Z�^����x-^7���X�\AfQ)FP���5�mo;f�Yޛ�3��=L98�\�K��:��)�5gJ�{wd�D7Gb�5k�!� S���_G���D��z���'�w�
W\�Q�ys�+��r�l;:$�1f�T�k���$�օ@�Q>źG����kX��^|z8����Ҿ�C�c
��l�`�|Y������]�^
���3~�O��w;>��<
�����7�k�x�m���Ƞ��>����	�Аa�7~D^�aB���tz�cX�i�щ_B.T�����/�i-'�9�Na��y6ϥ鷢l���M�-[W;L@��鮇����et+D��S���ٝ���R��ω�r�n�5�A����!�����ʼn\�u�z��ɕ��w�5Z
d���iZ�&�ny὜�5@b0"�d�
x�7���׎��WЭa^<�bb����C���gMG�e�CE���Og:3���q�ּ�10'��d���w.�� a���PK/WUW�_���'pip/_vendor/pyproject_hooks/__init__.pyu��N�0��~��/�D����S�!ko��c�D���41*"�a%c�gVJ�1�	������?P���{�a"
]1�'�Gr>�?�VH)��G?@��,��1Õ>���'7�5zs�vG4;K����8�Y���&%�>f�s���#�/���nV4�جR�CO)�X��N_�Ъx-�R#/����;hn�m�m�r�y;94�4�?�R�ҳ��ů�����
�!V���PK/WUW�kre�&pip/_vendor/pyproject_hooks/_compat.pyM��
�0C��IA�M�_)7(t�XE��(b.	�%��fh�]"3�M�C1K�AO�9�n_�$!� ����0t����/�g�O�DȔ->mR�$��orPK/WUW���p
�.$pip/_vendor/pyproject_hooks/_impl.py�Zm��6��_�K?X�@�¨�4�k�k4���B�%j�Y�TIj�����HI�f��;�����p8/ϼP$��R�NK1����7}���K^�Y���R��T|K�����^2娤Nkj�Z��sr��PMj��(t���̙�-ћ�翼=[�����YN���.S7f�&��`j�(ӹ�ɬ �Y�J�Wܰ
���%��%y��zOե^�f>{�ʚ��
��%a"���yc�'���A�&�y�E���2���V�nid{d�ۖQ�4J��*I��D�yEA�g4�f�x+�
��V,y�>g��R��=z��*�eDQ�YAxI�#[7��Tip�)�����xK����C�2�77Y�hV��Fќ!�E/5���Y�DC�_�Z���sp��{J8O�	�c�/g�(x�nj��E�1iIb�B��[�s���:Z��Ï`柹ր��0�d爭4I�,��.���ι�fԋS���V�S��D�b�sЪ�ީ�V#�_�!E��t��ն��U��k3r�(xN
��¨q�~R`"��Me�>Ae�̒�
�H�b�J
��CE3&n���>�;�=#@���ฒ`NCǡZ{Ek0M�ә�}v��i�*��6E�7�L�qZ���?�A�ҥ���s!�5��7
<H��'��	�/�[�0�ݬ��z�7���|?�"V��J쯠>!@k��]Y�h�9����Ӧ[m@(�v5����j�Q��C�e�r��|���0
�[��C:ԌP��82C?�s��^@x*�����1����0E�a�|�\��p)p��n02%U2�����'(��WWۨ��AV�a�)��e9��:��k`�mb�'��Z5�RR%�p�&�F�4٪��;�d^�u��6�u/b?=gg���Izޡ����oH
�#��������=)�"��G�:�ǀ+��CJ�H�g���@�Sm�������4����ͯ(�B��c�����Z�C�AVO;dq92>�55=�1+u3z��J���/�/�/�P����,�h�E"�=�+��`���T�O�4~�ۤf�\j����i�|�ˍT���ש�V�e��AX��]�������%�hإ��3c�Y�lB� ۰��
 Ew��+�%s�?�
z<y�&&�s,�9��F��W�iQp�^�rI�	�8s�0���ɭ�І������~����7>�F�]E��e|j�Il�w�z�^����A>@�&�{�E��mV�^�4ȡ�p�T���f9��9�(���y4��aE������:��-PԬ�L.>�Ǐ�ro�@=܍����00��|�?�W��=s��`���0�9�c�q�?m���E�%���@$�yŋ������I{ԥ)�\�'[�A�W+��,��ݭ�6O��x���"�ew��tl�#}�b5B!p��?(q�~��d�!^��YՇR�!�U���Q��u;��dJ$�1|��>�pO]��}zm�����-_�Ɨa'� Co$�	9�K�LJE/�%�K7T�3�Y�W�Uŀג_f����v�k�/f�kC�j���k�gnK�K[lJ�
<WN	
U�3Ǫf�jӱ;t-���o��⻟o5[ٹ�ڨ����.����c�e9Q�
	*`�[q���{�c!op[�ޝP�h6�ƾ}Ea�c�4��y�{ЕѪ�櫡�:��](�,��8�}�`�M���kG�q7C(&�Y�>f}���^;Y�̛��_u<ᢔ�
����5|��o<���@�I<��71~�$�2l� ���[.FɈ�cU7����m�$���P|$Nw��X����@kTc��e�;��T_��ȭO�T�� 7�ک�M�l%�M��[��ܛ�
�/�#~v�}��
��0{"�m�ƃ���l@?���,'���w��j����=U�-�F-�8q���6��@�͠_�b�%tM#|bQ_�
�Ih;�5~�j8�0Y����js�6ˉP�˦�ð=D��"]`�L7{.]�W��3���\֜�� 8'l�E^o~.<�����zL(�x�3A�>F�F�ɠ�D�`��:�&��d���z#{��lq�*_z���V���U�/֗��;�)G��8D��끛����9�Y�B�[�a���!Z?i��1�h��H�6�>�W�͵a���_m��;1{}�a�0�ăv_S��c�c��T-�ش��m)�H6t7\>ut\O%��X���2�G����^Z��*~�K�)���~�}�={���ϳgO��ū�����,�Q���M��Z����f�G
��睈N��ӳ��;c�dױ�[��?Z9<o͞�k����F�n���3�}�����d?m�p&���>I�b�X�,&��E\6�ƒ��:!�
Β�Q����N�`|��y�s��֐��	G2"�Ϲ���mT�$Y,"��b9�/�'	�Qѯ���v�/��n�פ��b��~h2o�K{�C+w�b�f_ϣ�Lc~r5!ې;����?�TA����7R'��\��Ǵg����0=��<]��`x��i=���f�X�wG�� ����Ӳ����`�v���*
N?���t~1�/PK/WUW���d"3pip/_vendor/pyproject_hooks/_in_process/__init__.py�P=O�0��+�2�Pt;��Q������bȿ'mO�!��2���p�4���u �G���cpYt@�)aPNeA�R��N8sK���JmcNu�G�c����)�,B~�B��'����#J�vj�����D�A���I;�4�1[q�仄�9U;��^��
Գ��3U�_�³j"�_R�A���P?vOx����HZ���{|+!QT�����75�i�]�^�c�~������pb�h�;�ط��i^iyi�7PK/WUW��4�"�*6pip/_vendor/pyproject_hooks/_in_process/_in_process.py�Z{o���_�b�ÁT*3��nU�I��H���C������6��,�����of_\R�,�nPTb>fgfg~��]������e+q��K(��4/ČIIJAf4MI�`dZ�4!S:�aYBB�Ȩ�;+	��٬�ǽ#�R,�ަ<c���X�]�!���,D'��q��Ȗ,+Ɋ�NSL��}�ӳ���޾�_��|3>5�b�g��-ZM8�|=�i��$�,�-afk^.���z��(��gyUF���P�#��F����KE_��zLV���?RT�jF���,^�F��^����e.��(:s-d}����WrQ�<uw7�,茡3z�B,�u*�ļ�k�T?H�{���K�T)�4F���,��x��@D�<e���R/#���吠�5C��sV�_�2%���G���R�5f<��U€��,F[�ţ`4��J-�,�7��^�� 1�<$���<y�=5���~�Y��:��D³�QP��?���b�(�DI��5���Ȯ�C�;d�%FCKKM�9���"텎��]Q�b,����K.2#PtA��0c0���l�!�� �p*�<�eC(�0/�A����2����,P�d�f�"&��=:-!��k���<}̕��5��w\J0�~U��>��R�+��151�Pv�f`���C�C�����\d
�+@k8���4����ܵA�
�3&!ƜΛ�f ��bS���R�Іf*f.�A�|���e�����r
L�G�(�3*YhЩĿN����cv��Zo=��ߒ͠X�,/؜߆���^
�hT�#Ū�bam�S�U�bk�d��@N�tGe�j�Z)������	R�Ӯ�X�7#b�5���d�5+à�z��.l�v��A�[J`��E2Oy����(69��
F����JN���\)Z��Ne�@*�sd9�)J�q�f>P��956�Kh�ir�"��)�qQ��ˌ�]9Х�h(�e\B��~���n�mB����!Zvq��ɠA���ٖe-����a�e�ܓ5�e�	��ʜ�Y��iY���61:U�$A���LҲ,ꊩ4�q�نd1�h�(�dҋ�M���r�"C��E�PǀL7~%���4l ,Y�~��K �tCr���aZ���g	/Ad��c���:�Y�Fdrem��RYƐI�)����2��)�[��=-�1*x .�*H027
���9�ױd%V!Y�Lu�ʄ��4��IՒ��'W��*���0�e�F�+f.EE����lͧU�ڡ��f��Rɶޡ�-K��̣�2�_����;��4�
/!�$��[@v����j��3����XǶ�����]r�7�����Y,S�@�R�}DGI�YY�|5T��,�eoK=t�)�a�]/�lA���P�8R}�9�Ω�uS[��*Z~O=�#�x`Z-gB�l�f�~`2��Uѕ�@��P����g���)S2+e}XIX-���a�R��Y��j�L/m�km�#��YS��j��"�醝/q�
'��?(]���q�ҡ�	�M�;�Ԯ�T�>(H{��%P�[*�))Z�v�u�nݲ��p�;��jf��C�iyx:�����:�{X��_�D�c{�_^��o�Z�2~wr�f|&�K����W�4�i`;��oXͅZIe��x�E|A�纋����a!�&�� S�������-�F������k��벗0�`,�f��&�~�������O�O���
�gقkݭפw��űYW�
�nK)쟋���E�%z.0����w��ɼ�0l��d��Й���:��,�NmND�Ë�c?L�I/�*�`{��d3_*��H���� 
Z{�v�7�;a�����N�m��~P�/E�}I�t�Um�4�w�v���?�u5ʇ��ڼ�	�J���*� $��w��g(���Y����c��1���OWv��4���-�����Utʝ�L���f�a��pP���*��6:�`J׶ȭH�]S��di�tf��8��隀/̒s���5�Nl
��j������<�`D0h(�xx�s��NU��׆�@�]	c	rS��^m[ĤVǸ��<�!kY�%�������9�Ұ]qQ	ZE-����>����h�f�?���
�G�L�N��~����E݆���\��Y$U����(��.pw�z����-�:�!1]�Z�O��a1 ��U.(V���&q��k��s�}��b���S����z�$C�2���m(���n�.mC�j��{����k�>��"�qQ�A�C��+�q���u�7l:���`��E�������U��-��cOSb7�c���_������j���m~��S�k@���if+�0�f�z
�a�]�3w�>g�;؟
\A��@'U��&��T	����c�׉R#K��:dO�ULt*���5S΁�ر�^�p'�&,#[X���.��<��~��M|~�n����.���.x�]=���xt��ڤ�O�Ensd�QDZ"��j ���Z���ϵiq����?zh����@�s���3s$�ma�N����Q�o��'�n���&#�k�����db���1�Q�ɏ5�Z�������W�>FS{!�#���@ן��@ob��~	������Q��i�[���Ah�L|�+�J��I��$ПIW���>���4뒐	���ˢbT.��SZ�Ts�S��d�|��O�%eX��h�1�'xG�ة�N����%O��|�O�!�(��:�ly�,�h�<�hH���}'�M��8z��c-C�q��q�9!�=� z�PK/WUWH��v1 pip/_vendor/requests/__init__.py�X�o�6�]ś��e@Ub��
F�kӵw]Z$ي�(4Zbl����T2o��"%�qv=��Hl��=���G="�<�����#���#J�<���=&ˍ�|j���(��8�.�o-�F�����V,S��߇>�,4���:���0��$jz�5kY�t#��
X�\�+�E�1-
����Z�V|EP���Ħ�ʐ�;��Ӟ���I&kc�8:�����O&�j2�%2m�iu^Ȓ[�8�-'�fNj�\)��@3�X�j��Ī��B�0�X�k��(ʲ�`�wW׃�
�V��P��I>���tr˪��&)a8��H��A��#���R8s���(�a�~�~�F��$*3�w�FΣб{���&^:V5�N�8O��y�ѿ�;~���5'i�\u>�p�XC�I���/�1i���:ֈ_2z�V��h7�!�Ȣo�Y��P����:�,��E!����YPRL���?h���tɅ�#��(x����7�����8uڼ}�����E�FBݒ&*D�
��G�S���(�QrC�h����%�<G�*��g��o�-:0��x���~���b͔�&��V�?���JC�p!k��Qۅ�|��
C�MD�&?�Q��q��JI�-����������t�4p�RT�looH�W����v{�-�=�(�n�Wg��bأ�u/��)}�K~"zD?q%n��	�\ON���*Ġ�o%L��W�*6\�����-r�B��?�@gO�Y�E�*^�1��S�/B��3�5�I|��/,���6w��v۰_�J	��`�X�̮V��؂^};�����nf�v�v�?;���-huvJ�l>�fcG��T���ـ@`�[X�l��q��f?ʆ]۹�>
����O�A�+A�l�O z�g��S<�㑜��4�ҳSJh�	J�:��n'^y��׀qX�˞wmXD`ߓ��̽��̓]dP�u��y(�I��l���~���:��T�W�P,l����
����-A��&�^a�գI(;�N�'n����X�VB[�����F��z����=�Geݡ�M��ϠC�>�����O>
��ЃF�신�]��?�L)[*X�u%�JyWgqf�f�~��l���{��>$~�>|�ZO��ҝ��v�ׇjJ�C�~�F'�u�E�e�C�s�;7�#����5�W#���=
W;>:ю������lԌ���^�o{�b�à�*�c�т3�㲰bF�ٲ�A�	���\2��z���M�bq�8!��:��G���tR/�&ZW�����-�@��(P�-2�"��hQ+��U�Q����AT�6av��A�S�C��Bp��B�Ca�NH-���5z(\լ�Zc�.LC������w�Bvײ'���Qϗ�X�ºzp\��-����	۩`^荫н��~��w�#eqecƨ�)ů�_�pL��+�ŧ����7����)��4[���
��=)���0P�{�d:0����(v��p<�y*t�*_}�<ر78-m�Iq/�4�lQ����f��ev��#y��r��W'
��߈
A��b����ۡʌ&u
)k+c�fe�d��P����V
T��od[��P�E�wF����.��;�p
���w����c�yƮ��9kq�U�t�c�AM��VT�0,�g>���@*�.�pD5F�j4�{��P������}�+nxj�*�5.�)�Σ�sԘkZ|�k��7��7�b8���kܛ$�r�W��d�w*�}0���ջ��ܾx/���J�t�����r-���^�R((�;ꏗo�,H���U�Q�q�c��{�-�}�
��^Ls��h\uc��=��]R��Q��Ӿ�z�G�I��l�N3V�>T�Q�&S�-{HjZI
8�;�B&e%���Ut�'�]?O�;�i�PK/WUW�E��#pip/_vendor/requests/__version__.pye��j�0��~��9�+�}H)Zz	�Jzت��Dl��Oi��R�4�"�ݝ��A �
�߹ ��[��"�_�۰
m���	�-�Z�jR�cͲ�q��4������<�Zn��Vi�99����
쵁���$���΍�~��"Y�v�["ud?��ߛ�KB���eߝM�E���4�̇H��T
��W��;�.q`rN��(!��!����ŧ�q�P�T�Ǔ����2¿4Ύ󅝯V���(��^QHN��PK/WUW�(���'pip/_vendor/requests/_internal_utils.py�T�n�0��+Bra�У��Zm
4m`;�8Vhi��H�K�˷w��I;��H��fgL�O�ƚ(Ң��L��a�<�]hu'r4�m`�df��l�-p����U�àU6�i`��`�Bd�X��AI�{��BBmq�W-	
,k�B��
�V5�#�â�������VD�!�'J+dj�f,�:�4����4���'�I:Oҷߖ	��BK%�z�����\��^��ׯ��	�b9?`���/_-��=����1�ϸ�m6�,��=1<�N[��8��OOJ��{&Ij�гi,�N�*�Q���a���Rɭ�C�
Bކ�g(3���Y�M&D0�[Qj�����C��|�̎)�\�%�t���u����_�Ѡ���!Z�v*z!i��y3lv2�/�i&r���ý�Č�r�D�,�3~�L�f3p�uʪ��L�0
Ѵ_�a�4���)x4'}�Q�R:L������Q�+����w�e�#�"8)<.&m���I�"
~%$z_{���n�W,�����k��D�Ѹ���S`P���"f?"8w��	��|��p�؂�n�z�%3־Z1l�*�d�ʁt�<����[u����$�Q�9���.��|�k���I�J�V:>���T.�PK/WUW�?��L pip/_vendor/requests/adapters.py�ks��;J0�����N�YVMeɕ�v����"��sъ���]<8��d'�4
gl��X,������?��n�g|ӈ�����V�f�2ks�e�pYԬY	�T��7e�03�y�.4T���J���,Ā[�l���
�hdY��`��`�u����<���F4�=aE���o���`���5��M�ފ"+����\οNć��T��e-��e�WUYMؑZ�J�E�6�x�]]��I��,�O�qR��\f�	�	�ky�р��\pl�;�[��I�o���TwNә�Y�;�o��)�H��c����:�t��r{wy2�����uyy�acv؀l�y���fG��F5M��������627�N������^���
y���f$�mV�#��Z.RlJ�F�!Y�kP33���V���0X���),m�P�E���)���K>���j��k"�zwq�5^.Vbͽ&;��B��ȗi�5������U�;�\�i��4G@�PԲ���\4z,r�G�����;�J��W��^��o��S��,7��hk�s-�H#�]�(eT]+�������'��\"�˴"��ElHI�U��]�k\
�1JM�k�@�g��<A{�)��_/�Z�JB�	�����G_�꺞�����ⷱB?����`4|#�H�p�@�%���v��&C��0���S�g3�-ρ�n���?���3�zq|uqr|	�ϼ���ɛ��wW�qV��9�k�
��P�G�=8�+��ή��C�z��,d��#`���;�h3Nl���◍��0q´��0�Y��3��5Jf��݊J.�fWUQ�v� #=\��֫A���i���� S	�X[�50�c:���Aqʐ4S���}�7�����\ �a��Rmv�F%�$���?V�
c�Kq�^��� M'�w��%,
��\6$e�խ^(cA{x�a)ص�E���]g˼� �YlZ���HGHf����LϘ}���@������Cs��h\���w�d���$���/&���J.Vl�,ݪ�V�w+4$�:O�)�^��ɥ��E�,�n�?sC(6��zt��m�A�
�v�7�Ky�:,�p\u�}+���w1B@s�qae�2��ƒ����Y&��q�ψ�f��G�W�zf�l�B�`�A"3�X
_`@�7	��A�Ƅ�ވn((�u�u����V��c�ƞ��2o�]8��0���#�QүE!*�(�ºՒ/ͱFj�"�dt�X���q�R�p�k�lN����80��B	����V��xu�s`p|��@��c�.J��4M����hQ�|�z�FV@sR缣�\Ѯ�0�\R9G"��v��%�5�P˟��rݮ��bd��-�����=x0;�@��9Nw3�Q%-��ˬ�6�o@�6`�A�н �Q�qjY(Xr�q_�]��,o�
xwuij�\����Ř�	+�������*���-�5�AhA��)��Ww�K�͛I'vY	�e�T`�p�ᕰ�%�+[�q�iks^C��[%ؐI�KY���+��E��I�X��)P}o�
I��/���LހK%e�u���SX�rf�G#I��9A|WC86�����K�����SCd3Z] D�pw��$��q�r��;����-���U�l���S�cc�zi
�X�i
�|�H��C��R^�-i__�N�~a�P7�	��>�W��C��P���a.{�k�<��I?֓K(��Xn7�l0�&���ل����8h��AH�ݕ��G�Dqf|��w���9�S��a��H�7�fhv��16R����L��IX���O�5&J�g��+�pn��v�����}DU�����q�N�3&s���^�>��}r����$O�zO��\<m�tSΗgx�eO=�=U�����wC�'��NV����|=� �n��D�aY�����j�ϻDf���C8WaN�ȃ[N(���җ�%0`�1��N"�h�/z�#&��T�zK��f��:�G�'���C���29	9��R�����x1t��A8�����`��S�h��<6�!VQ+ĤH��9�[Qv�gž���^�O�_:�~�X���Wd���m�~`����W7�P��c�f�q�-+��Cu��#iNH!��e�#���&`0p��D%yH��a�����ꘕvm�̕]__�I���:�
1���שt���;<�Ĕ�3j)PO��D4 H�TN��L'_g� ���`�ԕ�1��;u� *�t����ʫ��V
Z6Њ���yI֮�?S{�r5Kj�����iO2�|�#������@N�rKAxê���Y���3�|"�A�ט��fa�{DPǏ���d�?NJ<��̢��(�̗pH��;�v0�؂�;���{8�Wt�_p�f�[�Һ��9�߷=�-��3�����`\����IU�u��bt�g�*���S��^�3y��v�"=C�ߊ��}��O�ʁ�2�BRj��ʄ��;
 ,�Lxwq3���R�wɃ+\���5j�1Ef��CSk�aF��a����'�0�d)t&X�sX��o���AQD�Ż�i�tΪ�	}(8׌�;?vQ;�������g]����d��!*�~II��F�g9<�*�����V6��x�L��V�1a����k%����O��^Q��bxt|�i���;�8~=�R�PB֙��BA�)��^���?5�eb�Ù;�sv~v<��0�7�{��@*?�H֘���Bu&N
�N*�:K����a�7��fo�{�D��>$�1��F�B*B�G��e��j�aU��n-E�m����
`�c{1���sE�"0�P�#[w���?�x�c1�c����<�iz��o
=�qˉ��@�<�Xi�/q��D-���G�;�ӡ�Dm��P�$W�7~XT��0�}Tu���Vv���'XH���qE
G9��G<E�L�жN7���lo�*�kׯ۽9S�9���
��:�:)�"��f�),ȮB+�Lw��Ts�z����Oco�K�0S�Y�t�m�tk��i©�����M��(���h��yǑ�:<��Q�̌�#�~K2�<
�fy���3c�K��TWl��9$�u�m�$P�
�#�nwM���_��vuIu�V��9�0S"DX���iCm����YLd|7O[L"�[qK��yqge?��G��I��m6��Ƀ�={�:�j��U�ڻ����o��K[�CV�	�<A9N?k��b"7jU�l�R�\^�=�S��0�B��x��H'f�P5�sS�T�t8�~ё���ʺ�K��n�1��-ya0`�^m�$�T��9���������[K+V1K���7saR�2�J�\�L��hq�|��L�v����e)��0�a��1M��?���=Eq�_4�F�o�p��d�e��_����NUP���{��Q[U�h�;]�Ck{�cR��j�f���y�_:�� �hܠpk��x"�f�P�.�v�u�Կ�U9k��L�"q���(�G��9��ҨHL�`�=]�#��y�=�N(vbkQc�UW�
=U�^��%P��6��s��+�7�'���cD��X
���K���B80,�<�B�ra��Ƴ8��=̯Phl=�a��(�Pcr�|E*�m��Xk/���1A��#3�˱����cu���Du;�N�,Eg�v��Z��A�a�t���n�o)��WUVo��v�i��2�I�f�-fdEZ쪩ۭ�E� (��⍃�.z��z��4bнW*<�����hix��A��D^�A�
�9Ȩ�T�vv4a�d�o_$ϔ���G	6�B��;u��z.����+��a��@���[H���ch0]<4��D��
��̄�1�!��q�I��V��;� `�)�7w�Y�i��Ѩ�OG(��R^V�vsS�s�Y�k�@PpW�����*��@SB�h0#���}�?���~��Κ����&�]Ds~vv|t�yZ�ò�0�9ҼRƲۡ>A�;!ã���M���]�6���M�^�!������t4ě�ޫ�����j���A��T���^u��*�i�˼[�m�^#�ձѿF�
�[���v瓪����{��A�~�5|3���u.�k�����~!�[���><t��^�K��lpv��rCО�y^�6���e�eT��Ԉ�<@SJw���ͪ��9��U[�P���eټ̨H��&�%�#e�NEqݬ��$f�;�ș��({���DH)R�AjB0N���'�U�y`f��.��IޮL_7b�šM��G��S���;Il�a3�#�(�/O�e��EV2�`�J4?�&ۗ�����߽�A�6�q�%c?��W�<�=��++�S�cV�:@�!�–Q��W�X�$�1R�X�3�K��|�|8�T��=!���ZG>A?�-r(�Ʈq�J��TG
���K��F���o
�#���hC1�w��i��?�b.��dܫ*f�{��1�a���^�����%��E�&R5�]��>�Bp�.�Fl"����gɳ)�`O^����`^X�ҭ��Ld�,��o߆���Y ����Wr~�f�:ݐ/X� I�qȫys�&��kv�<y񂎞9[U�G�~w�ķ��K;c�ρ��a'\�-�$�8��4�_;�9`^�-��\����s���=1	~Ti�b؁����V;W�F=`�X�A
N��zEH6�U���PK/WUW�yCCS1pip/_vendor/requests/api.py�X[o�6~��8�l��e{�i�-i�$��a*Z:��H�FR��a��;���(I��.E����s��sa��nG�kF���?�}:��J�UZe2/3̱��
�u8��ǣN'JT��r����<�v�x�E�vEۥ}?�D�L�0�~)��� ����t:��ҤN#�h��̨�%;�r�J[:`�T��t:). ���I�J�P�lO�\��^�A����:au��ŢHIH��
�$�Dqp���^LN�ѨZ��G���Q(p}SDj��C�8���g��ө��h��W�gӰ�^���xI�pr2�Mb2�-�a�OcE�6�*-EPd8��[��2IP�!m؀����*.'�?�pZI��U�Ɣ�f��ŠGjz�.���L^bc���6�6h�ҍ���*Zv�����)	�Rd���7�t�wU�P��?sq4��Ñ�֨YKʙ�'J]J�-��v�޽����1���8�"�^�E�Wd☎1yomq�����Uf%���E�R��W"5 ���LDs�����}��;���SB8w��w�z�*,���vSb��l��I�u|Ie������jPo}궒���O�F)�1Yp�p�@M������w�+��I����q8Ԁ� ��4�ǚ��n��m�u�� *�j�J�q�N���d|(�D��3��w��Y���lK�ZC.
*&HF�.
�B��*J�+�
���4�q��B�I4�!^����i\Dq�d.�	Cjb[���<+�{?����|'�Ż-��e�Z�՘J�����R�b�q*��5�q�cn
c�c�
ƾ��i@-�������E+�g�¦O8So�1'�v��ow����(K)m�*Q�a0��^��M^�I.6-�*8�0̽�C.��LV�ӆOU�2�i�6�1Hj�q5T���L!Am�B&�b��g�*r"������XJ8؇yU��Օ�{��}%](򖯒+�"3�E���hJ=�y��YƆ�<'h��l�Z\�0m�wr�ip��p	a2H2ɒy�/�Q��`��1=����[�U�K��t\�K��4��m??�W{�40�"h��z��.�XbuB�����>p�
=�ݭ�z��Q>��+kK��;��H��x��7h�5���;Ϟ��W�~ޔo�ņ���l��`�0$r�q�ꈩ��͍�\��LLϊ(�A��R2b�+<F%�HdQ%n�G���K�~2NU:���v5�jT^c�Ҵ��=��
��7iް�K>�89����zM��?���F
�=��Q{d޽69ﶧ�0bS�� wOU��flM������Am�џ���ɛ�ng��˲�oD��8�L�؊K4�<�Z���`v	�n�����m<}M����5-�c��2D�{�:�C�Cуб���Q��7�7��r+��)W9��Qݽ!t4��ܨʒ�b=��YB��$jL !+��J�Y�|PFdo0�߽�(A�܉7�!���P�x�ŏ���A�>1��;�gP/�#5K�+����`Uu�T�1��+��"Uw��y�MVE�J~%З@ ��#(�b�b��c̿F��#�_PK/WUW8wf�|�'pip/_vendor/requests/auth.py�ko�8�O�{k+��ia�Xd��6h�I�CQ�E�ldQ%�8� ��o����8��a�s�D��ys�(�:�}/��*���w�~:��9Wd!�2cd"rMy���3��,�|B59��<͘Td*$9�;���E!�5���?I��\2��|V��jqIeK�3�bA�T��gĭ����|"Rֱ�q�s�dN���<SN�$��Y��D>z"�1 m����I)��J�*hq�YE��hI':q���J��n�$)�9��N�dz˓�����N�_?�H~?r��㛓7dD"Z�����`�\@��Hd��FM~y�|:>�D�E�i\���J��`�Nʦ$�]�I�fD]tK��Z�>H��Rȴ7���	ϙ.%؝�_�����n�D�`�\�<D��Ԁ0況�v�wp��EAĔp47�W�[e��/�1��k.JI�KZ.�d䖌䌥��d �5s�@l�&6A
&
pV*8Vv2"S����g@ޗWTQ�ƽ��I�7g�K�Б��cr^�*b��y���G��CIƯ$@K�e  �װ��4އ�ʧ$�}
bK�|�cԾ�́	1>t���Zg"X�8�� ��gL�$�,�%�,>^IԤee$�2R`�_3����76��V����x��Խ�����Z���J�j�ɑ$$�3*ɴ?c�M�O�4
)�[�8�ѝ�����7 !^�L���~b���Vg5`�z�T b�H�u6X�ȟ����k}[���9y2�FU{�9�SP���ke��Q$�����ͮ�(�򃨷�^�Mz���q=̾����fֈ<Y�Q�UU�;��Q�M�.q�z1�]��L�,�yB�d�`�90gU��Ÿ�Y3	��w"V100dqc,��L��]ULiI&��$]Ųi������3�O=-��H)d72Ee5��Ra>'H��SŨ/'����OFW��׵�Xk:�Ln�z�*���3��.��qk#<�������xR`�k������s�˲fJ���F��1��!�'�_��`���<�ȺJ¯�'�5�`w9۶;L��,
��*�ݔ�b�HH��1t����s��7w�k�#n�I��[�v
'��{|���Gy�cvk8��{~�g �b͂����!�+ qC�*W09��(à{X��Z�X�Q}^�͛n��f3@գNfo�>v�j),�Ne�8�P��aPi�*Tז����x�H,
ح�G�`��KY�m��:ɍLP��m�Fe����O�F�w���3�V	�E�l���S�Si\�,�:�;�9�[0���F�����!��zO4[`��~�_"����u#���Ij#x9�HT�8͠��z��X��EA!z�aZ�
��p��lh߹p-�>�6�5	�>�y^��e�!��9�V��b.��qJ�8�T	�Ú�
9�9��:� �
5Y3vͲP�������׃����h�iH��H��toZA�8��M��?7�ᛪ��������w7���9�brc��:�yA�*����M�9��6	��K/�]�m�)�����?�]/��??8ܰcX�Kw�d�^����lJ �O�a�ҝFw�~x��G=L��N�'/�4rX�ams"7S������+�!r�tm�\Æ�U�H�[?��b��	����"n�;(%Gc�܍~}M���r�'sЉ(�Ԉ'.�(�<�pCJ��il�C����P�:����'#2�~�k���� �]��ś
	��}�����j
��.$��P�
z|���k���]]9^[��>hkw�@���*���F�'�43�ثm#�p��M�3�F(#�6���]ȇAptO�ww1��R�<����5��j������h��o��[����a	-��{�v|��F�7]��G�x:�c��vMz5]���d:��	K�*2}T�ݸ�cө��"��c�ENO���K�Deow�h�soOp���o;�\�^Z�9�5g��&{�͘����jD�3���!�vN���/��\"����)��mS��mn�E�\1C���>�1z���f��Q#1f�ݾ[B�!�6Ǜ	T @�zn���d3
�b `[�+�����z/hq2������H�
F�a����!�``�-�,�M����O?��L5�d�L1M�'=�ĘīOF���
�&c�*&�3q�$y�"/�n�z��WL��TH-�z��e������\�џ@��sGd�yt��Nk>� `:{v]Y*̳����/#s�5�ۛ�_�c�'�+�t�s��p�bj����D�l����q�Q����"���
U���*�aH�v�ڕ�s��M6S�
���X�[^AbS�<��\�`�
�{is߉���SO+M�5ҋcW�j0��G3�#�z�g�x\��$7jժȺ�)+�L��%����m�+r�j���<i[
��Avf��A�]�" �4�35�����>���>�8�m��D+��]��r܍���mߦ��A�u �!�!��πwҨ��5��>�|�s�9�p���f�N�7�9[z�[?(��I�8���f���B��X߻�D�-���~�E�ؿ��$�#]������4)��h���ۭ�����%?m3_�<Ӏj��H���41��6H�-�x�q�{Ӣ@h��
822t�%�D>��lNZ̈́�e�Y��Si3!�@S����p��	��^C���B0����_A�-)uӱ���� +�˸q���S�����T�,v�n&���XC!����v�?�W��zH����7�:��rjk�/b�NخJ���R�MQ����?���>V<w R�L���S�5��\�*�=�-"g+��q�s��x^�v#�'Dnqz?��[�ޏ�σ���M�PK/WUW���Y?pip/_vendor/requests/certs.pym��N�0��y
S.�4uw$��`�!e��Z�Nq`�C�<	i�	!�Sj՟���g��d�'^"��p�e���P�/�we���SJ�Zr��:t�>;�-� ؠ�PccB�a��A
U�#����kQ�)��,#|~%�n��#��`�gs�R���6���S���l�,�+`�8�CM��'ː���ȪU�Lb�G���C�>`Z#�4��h<���9q$9��X�Qe�z�C�C*�+���
�������ju{w����]l=P\��,u� V��@C�_�k+����v�����sj��mُ�K<%A���5\^FY�b���6���s�PK/WUWɊ[pip/_vendor/requests/compat.pyeTMo�0��W�a
�Cs+���mmt��`�6�(�%U����>�3�*���%��BE|IHLY��Y���~�
A�dBģ�l{�*��:���g��X�
"U�+��
ck���3�c�Xk��>B���W+Rs���X�=��C�B>b$�]�҃�F_C0!ˏ�*	�U�EY�SCJ����/�.|b>5��	(�t̔HFش��pin���fj,;}R���\�M���l6p}�ZO����n/}�7��e̚˽��')YJ�x ��.�k{�K��p�t�џvQW��.�����x^)���u�������K_�}l���Q���5%�76_�+��Z,YF��N��r�}�����
�u҆�[π��=s8?@�l�#h�5ř�����{	m7~�>q��NjWr~,�q���:*�etZ)Z�7:���U�T���$+^��<�D=N�"8��p�n��M]��	�q讞YɄ���Y�ß���r��$3[��stG�����N5o�[C�S�M^4A���E�J�X6.'�~o��*��m��V�&��ݔ���Z���r��hʜ��񯌈��z�K%6�0΃K�PK/WUW/P����Hpip/_vendor/requests/cookies.py�<m��ƙ�WLi+�2��\�zI��ō��B�#-��ΐ+����6��Ү�8T@�g��m�I����tڶ6͛������o��>k�۲*ۣʛB��Q�Ze�}�Vk^_���7��3�V���S~��~��-+��ݾ1�U��ԝ6z�,A�3�7]��eVz���fT�.2�7���ޖ;}qA@�UY���Y�
��W5��W�5e���9��&�j���B��Z$�U���ԅ�.Tg�}��[W�����.|�nwFgn�?�zߪ���4&�Xt��q姫�k/.�*�����0#y1�������sXf�Q@�rW�8
Hڿ� p}�Y�e}B���^�-bS���,���)��M���S	�.���V�}S�9h�B��N��aW�Z�t��dj�ըV��հ�&�E���ڪf���Z��.�7�(jL�-A�~fs�T@��ESWǔi�J]ˀ�7�-Q�7��Uk�����t5��z(��[ݮ��J��k‰��7��1�ޔY�q������[Я�:d��cZ���f���9�N�L*���yٮV3����<g��>OWF-��`$��|��ǽ��N�g-����@��qA�q�
PNt���+�۞X1�m�۪�c ,��x��{�c�u�U�j�����Ł`�#UїV�}�*Y+�u��e�:LϾm~?��`aݴNB�H�%�2	�R��`�$,��(ھlQ����V6�R��5]��m�v��yh����U���c,oJ��D`�2��͋�L�ɯ8�B�o�!g�	�@Äz��E|z���]�����SYa��̠�v��0�9�ݘl��O��-��)7%��}m����2+�-Ρ�vz���;��`(�nBn+�v�����rJ�y�h�`L`��dE�~����U���.}`C��ͩJoK��S
�����BRS����f�=Z����B5)�_OOV��4-��J�,uA�=VȄ���骂���di�j��ҐQ:��ɔB��
���Q(���݀q��X�a\;�M�Z�_�i��4�`
�|~
�gz���p?'tD)ǃqNv׶{̧���~�J[��TZ��4�z�/���iz���߫�3[B�[�^�#l@��;�[E�^�(��AD�E�|�rȎA��v
,!���3�-6�W�=�r�2�p7��/�?W�=�+0�/�C�QVͶ�,��(i�["2�>�9.�YŞru�A��i�,
f�<��?�&�]�gWc�gf���m�%7��G^�����tL<��ޅ��g��JM�j�YH�sd�)!�ɔ�	�O����+��C����$��1�:�$d�-�'FI�fೳ�53a�����W�a2����#9��g��l�\ti�r���`o�~P� �e괙��e�=d��6I5�h5���0��#;{%�X�
c1;Cy��[�T h .$�s:�B"��U���6M�A9�[P�(�)��u`��"b]�
U�8f
N_
V	W�.�̜c-��A1F]�Vۤ����m�7q,0z�@�+�n�+���$fHBBY3�8�ib���o�����ۣ,�/�̨=5�w_���fp,�M:�4���U�Y=O#�(Oԏw�Jr5K�"y*zsC���_,	͸�����N��eD�i'��1����qxH�=�a��G �<H�j�b6�Y��!�.�D���<�e�=�	�Q��xe�.��i�MU�����j�[я^y��+�2��=4�緐@�*�en�ҥLY�5�¹
�7"E߂�BU'��V��u^u�v�����F�[t>���i�6
��H3l���:��w�
�T����N)J��=�{Aسbއ�2N��
�E�1@��'�\�PT������+��u����$K*V���.A�9&`ݞ��@�´�k��]�A�}t���-�=���k/�z�Y"��C�er�
h��a30U_UU�
�J�rh�=��&���C2eA�h��Dͻ��o,����i����	`��SY����m]��m��*�g�TıB—}�߃E����r`S��]]�ř9�fC���#R���zNR#�n���~	����a���z���	�ꔵzp�jA���A#R��Y�NS��Y|�~���<�QBa�S��G��sAiA:��K'�s�&w�(��R{U7���d+C��0�2�ޑt�G����H����*����t�k�L���w-��3�'��7�)�5�1�\3��Ě([�'(k�{*uu�"ka�`�s>Ə���K8���"~����������g�_�!g���eL/�����Vq<qK�5*��ϲgy?$�4�1����i��$��`0��P�Bpy"^�݉��+��f�ظ��lI�%�z�z�I���y'N��#�YA��(ݓ4+0�v�\O�v��!��������1��(0����,y�O�0�_%�AK�	�����sD�g	4&�3��P�=&O��Q�|�n�������0�YMsqB�O��"S�ȟ-��J${�.$`{�EL�f�ƕ��T�xhY]VU����κ��Hp�g��OХ�|�T&�E�K8��(>�Ʒ-'�|:�ߐj*�s �2*�
�~���oHV�Y����`/WwG�GQN&�@���g-;��I�\N�'pc�k�g�B8M��vy�
x#�|r�,́a��Cp���U����a+^Zn�MSMj�ϩE��`�~����1��k(�� �j�(���0�.��>������'G�_G95|?]'P��9�}��7�_Ǟ*��°5��ѕ�)��}e$��N��<Y��^�$r��I|�n�KW�18XN�a1���	��x4<��B�@U�U�yvQ���� �du���<7� p�͔Zv�M8	1>�_�@Q1��B,
���Hs���B�w��W��#���BP�:,^	b���5+h���*��g�j����f��|���ğքxJ�ar�Npw|�>`�_�3������j�K]���k�x~��v��S�slX�F�*t���J�:8���z�'o$�/{�����9v�e>5=�2��
��T�X�O����Ef�.C�P�m3�Z����DC���3g���#�!�ML69��
q'׳˿�=�<�Q�t.,l_�`K��n_�A	)��v4.WL���vyYM�.>�83%�{hUpo�ף[�hF��AdԹi���&����̇�j��]�'��`����ނ}3re�~�<�X/�2�޹�nI��ߖ���]C�/th��Uk5�H�
*��
a�wj-z�8|�j����S�אf	���\�ω���DR�\:6�!��I tye(ؚ��s��/��˩\���\l�Z <!�^����h�nӹ>�l� ˏ��/�'o�/="������dhN�����u��֔(�8���)x�s.?����T��jv�;����!��z�F*�³�)L�����4����R�%�Ӊ�u�6����?5���	l��!V����Z&�ܑ����yI��>���'�Kg�+��-qv~6�ՉB�Y(�W���'G��E�C	l�n;�7��@I���<������I���M{�@P�5��׸U�[�Z��A&����IG�Qe���r�ɨ�Zq��+�Y<�uQ��ԛ�>�J�a��f?K���
�M$�8sP�.x��LrD�K�i�P��]+2Z=�7i(\��t�w�R�U�q�T�
���+�r�ODް���v�[A�$J��%1ޜn���hrPI���S�]x���b�k�鯫P�NOv��\!g\I)�ye7�3��rF�Mt�"]0Lf���3����V��0̯�=� ������ޘ�a�j��yPk�M.�(����˟��[��,����C7��*2�f��O9v�W�䎺`�w,j����Q��'���k?l!�%�֭q+�i�5~{Q^'����KƗ��fE���ۉ�V��E2�
h)��2�P��H'�˞F[���T{��x�$�R��k���q(���'r�<��"�r��ɸ��ùx�}>�:�B�V{0�?�K�zxi��0�-�` ovر��|co<{�ɷm���dʧp�&�ͯ���O,�۬�{;Kꊉ&��>wf+Sۦp{}�뉄e��:;W[��W�7���ИŸX���e�����@����myG]y=O��=�p<��װ�ϭ��^�Y�*��V���$M��R����Ɠ��}�g��NR�,F7{v� ���/������÷*�RmS�/�5��R��yX3��w�.��"����̑A���SH�P�_ғ����oh�Sg�8 �j�R�\�|�\�-_-�j#�N�9�	dWP2�+����B=/^<�}�G��۫篮��U���ur1�ٽ�O4owL?Ԣ{�h�E�]2b��K�?��s47��t1Kҿ��y?Y<�r��$�v+��/�D/�o?@Y:�K�F?@ɹȦ�)/co��p�B�_g����&p�����O�� ~>d��� �Hl�Xu�Ū�+g��R�
#5��J�����������K� �U��g�}>�-e�_r�?�_�
v�R�/�|)w��1@n�N��D�
����WAg�9��7N×��&�ᩋ`��H���ki�z%�̨?�ZXЇ��Qwg��Y=Σ����c+��>�h�{{,v��؞z�%���_��7��x���Q�芪���d�k��N$������|*h�	�N���of�Q(�f�*�@W��`q�@3���z��<f�p7��$$��������p� �#[�fɏMG�_��A�Xj�+�hG� �0����ʆ�)@�wQd�A ��<�����II��ӂ���,o�v*5�8�>oD�q�� \~J�PK/WUW�@2J��"pip/_vendor/requests/exceptions.py�WKs�6��W��
/�e��Dq&��I�Vۣ
+1	�hY=�ww��פ�E�����C��t���
C	��XF�l��8�L&��(��r��٨�
3�����+葒ɔT��+�4e�V;�T>����=�`�����o7�;*�{�;��0I�R�V����_>`�4v�"0z1�L�\��Zy�j��~�������#l	IYP��l*W��)��4��G
��P@2eun�v����5ia'�q
��ƚ��8����F�M��7�[~jinݒ�Q��,���<5z��ZͿBI��'p��RZYuؾ�ߠV����M����8�ם<��]j�b���`�uoʺ(b>�@�a������[s�buĚ���yozU��]']6�y�(sk_(�%T��3�s�P��RDRЂ�x9�Ϗ�W�pU��U$*�[����T6:����d���4
��ƨ)��x
��P�yw[8TF*Nr�
rd_:@nj�����{��ԬMZ�W�q�\���}��
��Թ(0�!���8�$���d�ȑ�$�b�}��q��)�u}�۬���e�R�k���˞C������c�,u����%�B�0��@W�3N	�F��5�|RW�B�4�y��j�&�!��r1����>�82'���i���ܣҝ�(
{#b��ֿQ����lFS�;�R��q�1ʅ�E��{����,�*E�"*Bj������qv��Z%hӶ|�Uew�UT�^�:�(.F���UV6�l@�?�?����q��R�,ͥ��@��IS7��r�l�GM�4Hϱ�1��[�ҝ	�2�fX��9���j��9Jlo�K3L6	d1�@)��p;5�@]�w��:���"�:�w�_��W�f'o_�rl�Oj����\��۶
�i�D���^vZI&���6ix�T����uG(n�Ye�Q�X�!��K-y�T���i
�`����]�K���@$!�^'5χwo�GE�D
�Y:�
.�q��=zT�u�S����X�@XѤ�t�d#�	Z�d�`�d�v�]��
�V�\�nC��Z�t�qk�V��;}�뛜jWȹR� ��.����Ί�~����$�UB�b�|�J9[9���7a�H��Q�Z��> m?4�ȡ�h���ػ-S���&��U������.�H�ϕ��� G���(S�
�L��B�;a�`����vx',df˾�J� KQ��e���zl�PK/WUW��Z.�'pip/_vendor/requests/help.py�WKo�6��WLكm��� �]����Hv{)m�1�TI*�j���P$%J�]E�ď�<�ypfD�,�`���P.�x�e���Rذ�dj�g)!$I���>k)���f-�6�ֺh��:I�Jn��e��2�K���=�TQ�兗N9C6��YT#ƿ*���$Ym���dт��\��,I��/��1�V6g&a�+V�i��JI��?+L=�ԆT�e0Pֲd��瘉�#��{$=>��V�.�|R��ԁ�
͜��O�ӽ�$Ir����2L��NgNf���J	���7n6`6��H}1�"��4i4,�|�9���nY�gx^���J���RH(jP��ՙ�o�3�N-�P꣗�H�9�n�V���(�M���%L<�d�R��d��p
�J��ޤzѰ�B��YG���.����UUP5��K%�tY���i11����N~�QR8u�T�h*{EC��EUodU�h����4��4�[I��Goh�B8Wom�n��+�Ӑ�Pq
�Z��l@�J�E��G�W@|\�+���pG��'�ߊ���s���>m�Hj�P3me�{�-붓p���>K5?���sWJv������b��^Y?�#k.h�|�m�>K.���ן�E�g���Sv:=��=�?�Gi��O��I�����vz:�_ŋ�o����z��7�r 7�%GGA�޷e���b�)jXC�Em��N�a����N&�
�7�EĻ^R	V�a[���Q��~�_1�'Ŭ{<7����o��Q=���>9�Ղ�q/��~P�p����v
����H�qm8̈́>����<�c�1zo��A�z���8��� �1����N��9nh`̋�`�3��&� f���w���q��xs��}�����}O�%oW'C�İ䌚��"��Y/����2�R�|�k���ߏx9�=T���F�O���&!M����"�}�1v΄^5��dT.�;;�����*�[d֖��߮ݑ#���.���/����2]�2x���CQ��XT�V`X�q��l�CMFG������CZt��*mF��>�����1�O���m�v���o��ک�pN�i�W�RO��Egc��j}�EU��E�%t���8���GJ�Ud�Ł��q���PK/WUW��Gg�pip/_vendor/requests/hooks.pym��j�@�����|!�B�B�6�t�c\bv��B��W�I�]����� ��ϖ��Q�����b]IG]�5Ac�Id�U96���t��R/�0�0�g��	�|BY�~#"��F+KY�Zs����tT@i�p$G"`�/I�K�cC�BT_��.�s�Y�6�Z��B'R.����o xܕO�NVI<ِ�Y���|�q��
���C�����%-�������,�����y���A��Z���,�%[�FR�3y����Ot9�l�r��G{r���ߒ�7�)h�9��4ͱ��4�M��s7�a{����9�_��[���LZ��]G���7���<��S�?��PK/WUWe@��&؉pip/_vendor/requests/models.py�=�s�8z���@噆Je&�����ryܺ����No�iF�E��"u$e�ͤ{�@<H���LS�$�@����8�L���n�6�Թ.ۃ��?g�E����jUW]VT��.��6�&knU}�g��,�Զ�эzg�L���b���N�Y��b��	�jU�Eu���f��Ze�u�+hP��SҲ��M�ͼ7EwYT�u����ݪU�k�����v�WMS7��RW��*Ϛ\��y�ÆYA�L����@nw�K�Q٫͹�s�����e]��Tku�u�v����;OW��Ѷ]?2�{T�-|y���<K̈́��ڴȫL�C��_��z���o�M�QEmf�jw[���7[�d]QW\i[l�ŵ��IwM	x��O+��:��(���Х�yϨ��zE��fM떿m�^եS�px�S�:����g�5κ�en�"���)��n�Z��b�+�b�5�b]7��lĮ+J�|�\��Z�(*��*+X���`�Z/ڮ�ř�]UP�E���UQH�l�]�F?����}���P(ρ�Y�EV��y�u�|���hA~ɶ[�~�g��a��]��ph\���՝����v-�A���+$b,-�'�9X��؞���TG�vaѶ��,��z{���ş�f&はl�ȋ��Н�t	��6F�/.wՕ�_�^q0���*�,��/�t�Z��F�ϓ�:+�� .}�����Ȃ�C��<�0���Ro��Zfs�=���Fp�
 ��mqN�K�����u{iA�R�`�k8|[�~���n����Г��U[�y	k,u�]���Օ,��]t��x$�QL*@kRSn�
�l��2$^عk.+`+/Z�����UYTWR���\��9��f��s��Rg�E(��"��-N �R��\���ku��5њbd2�X���U*�m���
0���[l�mj}��F�
�vz���˓w�^�-NϞ���c�I
2�Z�3OAb���zW��'Ny
r���Ny�q�@�-L�R�7N%@�&�`o����_�z����g;ޟO~99��>}|��ͯg�~=[���\����+(��z�=������;��w�<988X�Yk���_�OE5�a�0��n��3,:�N��r=�Z�-�9s�K���
���)� �&4��?|�K���0A���e�<Gp�j��[Z�A�w��S}���4��+��p�:�"��������d:��Z:�4vtHJ�\U�O�wH��j�A��-�"�a�e�6A	죚�
��5�KQ���^i��"�SQ��^!�w�DһHE�9���0S(K�E�;�ZpO���6Uo@26��A+��w�e��mµSYs^t�\T;�����I�N��mZ�G�r�	Q3���V緝n�S�dH�1e ���2k��k�u����bA�r�oA0��c�����5�^���Ӿng�3�EÝaƅ�GGe>�=��=��]�خ��0�k\o��׺�õz�M2Z
?����*e"N& ���M�V���)�#W�;�]��څw��t��t���2�0�f*�[���f����z�$�NPƷ	�?S1S�y��Һg����8��-�}u�5��+9�ߐ��n!�Ј=�=�J�vDs{:SOǟ��L9~�u�����]��(W���~�p����
 �������5-����@�_`_�����"f�𕻺x��C=ਠ�LqK�Ŷ���BlU�ڲ!����e�T���u�\*�������Jdeܙ?�`�g�~���rU�
YjV���iVr�{0�C�����ᾃ�*y4�v���}
Z��:5næ����أ��X����k�v~����K}'����	H��e�{[��)����ێ�;W�[�o%,�G�.���)�m���x����$�9�_|�C���/�*����
�*i]1��c�d�j��;T�����~zO���L���"2n8�	����+����8<T��<�=8��ݔ�dM���sM|��u4N�8���R��Lc80f`5�l�QQ��}���k(t=�	b���5K��c\"x���@QZ����qM&"-(/�ם_=�<���T��XyK`���Ϥ��t1�Ь�	�?�M�Y�/`��@���3��`J|��-��S�V X�VZB��x�Ȏ&��r{��q|�v�WL�&��
dX%5�L?�LL��0�uf�i��@�>���[VpT�� ���@O�Dt��p��e.�6@_�:/��,�F_��upJ�eۼ#�i*�8"T�it�6���Pj�H�{��1���
��P.�ߣ�\�Y4������A0���i�V������p�����ǥ��Ĥx��BW#:���g��[.�-����%P�e��D��"������5�����fҜ]���x��j`�͍7@��CaXs2&���p��6a!4�l�����/��˖H�:�!"�����.$���N�b����́E�\~H@�&��Џ�%b��
3E֠�ހ���&0j�-���F�&�9>����Ѫ%�Q����r���{�x����1��/&�	?W�W�%���p���L�r�^#	�tӨT��Y�#6��dE���.	��Ѣ8�VW��f�LvFv�����aI?���	D�����@��@������L=0�]�{^Ti�\<��݃�"~`U�p���㏆��<$GUt�EofW��x��&�¾J�v��e��EL�A!�BP$�v����^r���^>��ȱ'�7�����$��%��K��eA�l�x>Oc{se��զ�g���l`~{M�0��m#?�&\��p^���?5��8��(��y�J
z�*�!��@�5^�u��TY�αr<v�!J0���"4�=6��=�U�V�S>&z��u�M):L$�?0l��в�aǂ
��D�XO~k��gC_>���f��Fd)~�~���ɪv�1c��hDQ+�����@pHfk��G�`�)�>�5f�'��k��`��/���8�]~�1K�3aW�ωsY:��RC0+bg�&�NC��Z�3�P�r�]�:�.^vOovE���FX%3i ���5
�)�JV=G�Q@�z"F��/t��F��R\?�[Q�!����ޕ�q��q�l�U;}���������%߭��U�n��@��z�Yd�]�D2���!�;�SM�كզ-���N�ԇ'��U~s(���Q���6u}n�9��������\a�jAn4��� K�O.�����Fc����&3�]\�F�X�sa3�ZR1u ���'f�`��;�L�B�}�\mw�
�sjs�5�F�pl�e[c�ȕ�t��Av}TWl	.�la[ʄ"!�\�5O�F3��W`�E�o�Ra�EqM�Fc��N2�fB�����L��`��d��H-�bb�uõ
�������Q MD�HeDvB�W�)3�@-�g1!ةl#� _H2�(�!J9SU��3稏}r�2[��M�\a�)�*���ad-��yz�.�1`�)���`Bʴ,���9�vڂ��kT�H�����p�K�lށ�<f�m8��g�.�Ni_�ط#d��w[���i���rݡ�l�������j��
�u��d����q�[�q�yj�^�� S���[} a�r�<Nwۭn��.L��Dt��ȁ�ɦl;g�a��ѻ��0B�Ab-��"�]��K2C�/5>y���!0�s�&��+��ŋj��EYFz�eEO��� c��h�މ���ZK��½�Q�&F��>�O�A�j/q<`a�eQ��-G�%���V��к���]i��ժ���aw�}�n��<��Ŗ3���'oXw�k�}����g.�:qB�P��:�e�V=
�	s�$�'�(��J`?��,��m�&����KD�6� q�B���eg--?K�5�YTG���bH����dE��˙j��r�t��")k03W99�4�%�fA�&B�a/l�޽~�����a�JGtO�t���5�܂��gm�iJ�^�JH2���P��~�9u�B��-�}E��F�Y�u�� B�L�r���Ψ�s[A�h��
���
^zK#��C,�!�|4b}��P�Ys��Br���Z{Y�qZ�z"�r>�P���2�- m�W�&����2۶�ށLK��>��6��w�y|�ġ�&ޞ8��	[�F��L�`� ;�Oiq���(+�Ca>�h�w���''t�%[�F������dy<+@�Wu�i�4��[Ի&U��$��u��Ra�4�J�Y��m��s��u �t��6k�r�|��ǒ�S�v6��9��*�?i�z�1�P��'�I���Z�!�5���J�rD>��K�O���0!�ٹ.�\=���<���d�&Po0U�}8���2k�@ƵJȮtGܶ�`�(�0��|Ez�O��ñ��n�RR+��� �'����ĝ�����,�nH]v�����H�/��E�/��:�#=����V����T�	�Q��m��Ɓ��1G֓�����|�Y�p揁�7�y8����x[��'^:#���e��i`���4R6�%�
����l{+v��Q��[��a��P�e��(ҏĐb���E֪0�;�m*p(�r���D�j���F��J.>D�� �1�
���A�^�ȧA����
٥t��[�P8a�D/��8�k؆�.��u���g��ѡ�zwq	�&+��4p�tE��t�А�1H(�uB�[(�
��F
�C%li������/����Ƀ����n�m8�� ��^	�S�SB5� ���m{���M2�c��?�ޝu�Ϡ�9�cy�	şX��Uǔi4(N�%T@���'������Cl*
<I�q4���%A�Th!�\`g��~D�X��:�!V3�N�	�X��s����3%I�r�y@�3��d>�=t�RW$�N>�4�x��V�a�P��=t�~�;{9K��qfJ��u�鲜����O�G��`�ɬv�W�]�;�Em�4����?�q@$Z7j���]��.QМh8B"��jXapi�3K �E$$�X��zs:��:Sʋ�Z#F0�(�6�p���T�O8�	��=��KВ/��SC0/R�-�L��WL��EI������8?�u�Q�3�ç&|&b�sꝛ]GQX�k�k�Ӧ�e���<�'�'r��g�=AI�\`�0�0�{H��a.�쑉��Ɋ/
��:T�`���*]s�b���I�Q=
�� �=f(�M���:��N�6��Z?�8W�~�4��z���x��������,�S�y ���cR��	��P=�s��u���=#;ޜI� ��;��2�d���Y�Z�<�(t���4}��#�c-6�별�!�U��Ҩ�H9�&f)q�-�
N�рF%Ӏ��	�:�EH �w	/V(�T��+n���f-����#F1W�$b�Wq.�x$1�
�<��^���W�_G��^`
T�$��$
��Q��NM�
"��ǣ���*�84�����<�)�4t��"��q:0� 8�i<�}x�<���8T̔k�Ǔ��/r��_dMq*3 n`�Ϡ�C�2�$��v��%01���^�
�[L�#����%¯n�{�M�1�;ʸ#�zJ$�[�{;�t��<Z@.P�z�F�e��mG�C� ⺤Jf���Q��ݭՅ�m#�d��9T�x1kZ�R�����dYIW-�@$�-�:A5z�}?�=�=�OO�84�V0����h�+�Wf�zk‬���3ιzh./%]j�4L�P����X��eG�\"���;�D���1)��a��>� $ӯ�}� �۬D����s�o�sܙJ��*v�,�Ȃ�+m�f���D��|u�d��W� ��[|P���C3_.�%\�4�so����D�)�>^�	#����dž�����0�7z����&S�Y �7�[ĉ��y��
��n��3���s��p?����)���|�3�B��h�i.����#�V�Ĺk�q�֗|}$I���^A�-��g΂9Z�nq�H.�:��cth�}����u������@��=E@ި�^��\�ƽ�Oas�2���齩sʎ�S�$�>?XrWm��!���셑����p�HS�	+�N	YI�X�	�.x�_\Þ'�Ki�\n�]�E ��&�޺E&���CO�S"��5,�-�ߎ&&E���5��f�擏�O�/]7R�(rW�Չd��@�k����%��)�ԧ�"U�>������A����>0^qT���K����S�)m_�uن��˥�
�]f��Gò%
ȕ���Z.�o��ؒ"�1��<}��ljy�@=����.�ɯ����;��a/�MvC�G<)��%;H)�
����t�w��wf��J��87qc���dH&��l�W)0���~]`�2j�&0�.�x��M5��
q��q]�C�Vi���i
p�ۃ���^�Kt��:�\B��V2�k�.�8\u��`v[�SO)۝����5O�2��{����?��5��IT��_k�k(B��]�|�+�kL_�P��'�3�A�z'A_���6I�Ϣ�%�ܯ�x��
����Gd�
f���-��h��Pn�2_.�L��Y�xG�,f�/�n&���˦�&2�������n�3�
��V�B�"3��<�HX�e7nU���Ÿ5�M�v�N���w�р]��ʊ��U,#z��\��a�{�kb}�l��\���Fd���H�e-��Uϩ�d�8^ʯ��)ώ_���\�0�1(
1,�\O��R��'+�g�!��2{U֭N�tpЙQL�<J�pE���ŋ�/~pxg@�e&\E����h�*f֜#əܙ,�rL�U�UQ�D�|��m\K<;f�pT����nS��}q��ؙѝ�nX�22�L���*�	�7���X�-VWdq
��k�\T�m��&�&3�_�4X&�u�P͙�ϡ��X,�뺌A����1�[:��"1gA��;��ev�}Ɵ��6�EkX�����}��Il0���,�r5���b>�T��%�F����T�:�9��΍#�}��V=|K��!��9���2��-��ɛ?.��&��9��]����]7��/���*�^)�y����w�8RGIJ�I�늀+I�y��ڈn;���zZ	/��_G9��g��#
��]y�����o�=I#�Q����B�ox*z?�I7�,)
kk�p�ο�8��H��5�y��	��st~͗r�T��.��_��E��Mm,�Ig�#g��*���Q|�����@!}��[:�A���m���;�I���m#w��Z��}C{8L�3��yr*����������Y��_���aNưZ7�夞=�0�@�~H9����n���ſ�G�r
y%��C�J)�3�c����O�</1!K/Z���86�+$�Л�I'ar{L�BEJ��_jc�@|��9��UNIo�iM�X`ap��0��7�QX��R��ӏ�O��h^
�%���v�sM^�����gHY�v����@��-	MQ��I��x����>�7��#߽�����D��M)#l�JQ��K1�V-���g0�\o�� .8��ΎI꬙H.�g���5��B�`ǚ�'8hw]i.���!h�ӵb�Hjf/Sr�d!������N��"�͋�w/p�\"���[�묠�D6ť�kq/�0ch��Sl+
l��R^
��s�q4��F
KC�P����x';����$=]٭-�
�P7Q�W0
h3�zON2<x}�~����:|O�}�/���}�^���rB��9j����׀�g}�1ts�	����a�wܓ]t��h�r9�6�Dw��'�0R󁼹��P�BJ�#5Q)q��^-L8���]o#J��)�����n��J��;�Y�C�3x<3��<����f�3r~w����L��c�;L�����maâ#o���[lR��}�Q�^�lQѷ�a ��!���e��#�G>��o��N%ƩM���S�.�EH񼩞��ChX��Ҳ� �c�F�U�ՌT~*DekP�{Jם�V�h���H��q�Rz��K0¿B�+
/��+[�IU���a�5)��Ҋ!GEL�0�Ϭ����G�>��C�2��g!�5��a�
�@*�X�<��'[�>dS�@
=U�$=���蛏��ӳc��?�U�V��Fw�
xl���4��w.	��jc&�kE�%r��� �g�!�`�ϊ0�1�Z�ʉˌ���?�#�ƮB& o9s,&��'���\�gc1eĹ��1�6�>z/~����9_�4;7���y�.�)�%8�����bp��9s��R��.�#*��tz A+���v��=!����^f;���`q�]6׽�ůb��= �hS��o/�k��
Δw73�#�Fc3Y �e�X.�$�z#ϭcT��Yg��ע��+���j�R��Zsҕ�g��6g��>�'���D(u�o����ۚٔ��e�}���E媪o`A/�M�Е�G�(;g23�P�.��E/`&��j6x��H�J'x��G$�!��q
1t�}D�:�nN���~_7⸌=���^���^�#�<��&=�[���&i�X�n&�dlB�N��G�r���X�V��W������䢉o�J��7�z�?�<���yvn����X��{3mj�Ka��»x�8�/t�l
�ʰ��*�Ѱ�MZi?�p��B:����E,溨x��{��H#w�$�E<m�^����$F4c�#s�ɪ睙�9�����{�o�\����Ҧ��l7:�M�`�#��>'��K�[煹i��9�.�S��~I��0��{�
>/?�H����Z���将�>V?�o�#�=�[J�]�ċ����o����O9
�E�Kx��-<��?{}�l����1=}��Gv"�@r��t�� ��
e�54�c�3�(,�6�jIsC����	�+6v��g�8d�0Mǘ��b`����n�q�b��gwFWџש����5u�˘�K.9p�rp��O��4\@��?�j�i�s�/�/P}�I�j���#_m�)������w?�<0+$��.)t5��C�F'ܼ�Q�;gШ/h�Ԯ%��!0�#��s1�j8L�C�[���3�%:ݴ(����`[�� "�OH�Cdp�1��G�L�y*3��a���\2�ᅯ$���}[
f>���I�C�<p_��X��Wv�>򛜛V�[g�ŀNΒ����J|���"�"�9�C�����vn����;��m7^}r��Y�j1�^�[��x������"<����G�y�j/�ą�Uak6m"Ò�Oa�]O��u��HO��r2���=��N9|�y�d�ӭ'&�V�!�9fM�4�˺�c'�/%�V4&IZ.�K�0�ߡ�H'˩g{Jي�����=�����$HxDl1�adt��j�޾S�O�{��_�A�d���}?�W��������s���0U�DZ��Ǐ�{eCr��i���������	��B�2z�"�.�������k��|��}(nb7m�םYf��LD�;Jg����iO��Ļ�L�t�t���d'��5���;s|� *m�؋�}{�]�$�����!^:>W��+)X�E�x��Ӧ�a��;�A��>���ҿ	�(lW��0�ְ���<���[��OPK/WUW<ށ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�>���PK/WUWH�Q�Y!�v pip/_vendor/requests/sessions.py�=ks�8��+��K)�N&�ݬj�*����.�����ʦ$Z�l�)RC�v�S��~�����޳nTS�@������^�n��Mb�1YY���ǟ���̨u�lr�6Uy�-�Q�:�.���I/jU�j��Vi�T]�����ΊKh��Jc܀j�(��L��J��j��?ß�do��֛��Ui�7�u_�l��VU�V�2�ah����瘟���e����2�5�P^���t��'���uU��������Y��ٍ����H�t�n��k���#~f[�r���Ej��!i�(כ��mޤ�
�+FH�]�US�?�YA_6ie��I8�]�{
>���cz��i5������a��0�/��J�L��`�?�Nk]]j�f�7�q���x桏���Z/O�E��5�TU)��K�jQ�ԝ7���4ϖg�+�N��yY�I��^f���
f��\�U����23�������@��
�o�aV襺V�J�ϛ����J]���۴Z*&Ev��Y��1��u�C����9���>zL�}y��ч��ӓ��NO��g�_�yu�kq��Ώ�_�*�Pj쓭]��Ӻ1��eKa�ý��E�T�����W�хɐS[�OV�k	�ߝ���zu
2d�᥮�}����Ǻ�ɪ����/
]W��e��5���S� YA�J�f�rvQ.���\�M��Ԙ�-���΀�fy�8��W�<�E^.��@f�:��۫lq_@�&.H��ՀoSu	�+P��z��e+��l�F�Rө�ܞ|7���;Ό�QSR*	��P�Au���lMZlo�.B'�r(�=V���(��2��݈��R�� �u7��M��J�?	�]�6Vuz��@��\c�J�����"s�qV_�s�Q�cK� +�O�y�^�T�4�
p�u��ڎ��V�fy�.4# ��M ��1�gޮ{n��G_�`!�p��@o�	���[�m�G�w�����bRT�u�45��e�nt���#;�:����X�a�ز=��^��؆ut��3�ݢ�k
#�g6�@H�
����W�v���V��0K��D&Ak�ޭ��*��Ko�l�����<�/��(	mR|�P����T}�&a���!�F���k3!�n,G|"(�
�`�E9������ޞG��}�	hs8��΢�m~w� ��H�.J�J��$Lxnd��^�[D�^��ѠA[m�s@���>��
�z�>~�Br�򅺨t
-��������	q$ò�3�`:x��R츃��㧝�N}:b�"xq�!�iu����_�$H�}��ћ�sVL�&M{l%�fuZ�l��Wh꘍'���S�$hzT������,��>��B4�爐��R��e�Q�P��&D�+ �m�P�� �8"�3n����%iv �E
�;�p�r��P���T�)y�(��2�\Y"˺�m��<�S��MsapJEݮ�A���%^GܘԢ15Mk�2�Dch�QW0&�<�����cP&��T�ty�5�;ec<��m3Ѵ
7�I�D�nV�=�H
بo@}z����������&Ɍc���q�M���s���S��:n�>)j�8��X��@�yU����	0 ڤJ�F�`4e�c���Z�&�2����4"�MsyICڞ#�a�F���S�6�������+��JqS ?� �N(�����ɗg��>���L:�Hdf���c0�I∋�"���A�bx!��#��Y���,`⭱�E~8��D�?럐Gb�5��������b�vh{�ՠ�Wϼ^����<b�c�
��wJx��l��%�A��q!4A?���(X�K��0��\}���_�Xy(�h׀��6�s�%�.���t����x҇���l+�_��1+%UI�t�m�$���[����[�c�C�$vk.��G�Vu�U�?�?|��X��5x��D�u.��8�u~M��"�7�Ao�t[f���R�e�/����m���@o
�y87��h!~A;�^[riA.����=G���"Ȧ�k�@?}�$�=�%�)�y{j~�=C|i"��b�4P�/�ؠhj-�@�hR�ig�!;�NO��Ԇ���g���/#��C���K"��N�>��'t����'��D�DZ��dkh
Vl���*։��h��紥
s8�hQCjӃk6�_?�����zJ�n�b�l�)"�}�>��Q�p�����R���L!���#>|(���K��|��y���a�Ul����y��1�H�k�7
=�k�=�U	�k��"V�>��bo�`���6[U���Eow$�;$���v{��dû��6ܳ�#���dQn���^��@���?�s�2�+�����#��.4k"s��@2[�M!$�f��e�f=o�)5��x�)\E]mC����I	�m@�rq
֖)�t^�}E;<Z�z���������)P�ю9U�m"���:�92G���b�ca��_��ϭ$��f`�Ǒ�a�~V�X�FK�.�/��S�����2r�-`���Ц��=|�)�<�R~�� ���9[�`+��=L��M���=��[=���87X4a88<�����b��D�Xn��
�A��&Ï;׃(؈W>u����i���$��q=kt0��PNu`0�I9S�C�8�.�e��, ɶ��%XԀ��b��k0�@����Bm�iH8�w��3L���:}�6��w���b?�4BQ7�v ҩ}��[7jLn�؝�����8����a]�F�T��0|
�P��=89<\��4+�:_vۏ"��`0���l,�O����m4t����S�!�E�kXa��뉗-ӏ�cb��xF���o`	w��P�'�J_4X���$(��q��%౹�#�ÍYZ��03�>~��i�BˆwXF8E���z:=Kj��`i�u*v��%�p�@�-{TսW���ue�� ��7����^�Ⲿ�o7�>��¬tu`��AW!b|Z<k�L8Lw�\`C�r3��}�VoW<ÃŴ��i�k���4�o�$"~����Sr��(�����Nǻ,
sj�L�����
�)P!
X���p����&��~�B��:�*����o��}i*������%��g���
��Ab-��V���P{�R��!;\�T���;�i�&��Z�V����cJvk,
`�S_�U�a���9�_xFeԜN����#s�9�;�%f�QK���M�7vC�s>�N/r=wǠ���~�!�:>ۙi;E�LJ,do�C'Ն�Z�0�-�>
WK�D�y�	�տ�2C�*T�&�Z���C��:�xҸ&�8�jt:�`���;{p��>��e!tX�3�w�qWٲ��1�sJ;�G�w�G�X����Xy1��*� ��$��7�q�����%���&������� $����^T��?���3�bs�.���C`_���
����Tc��y3�\w=y�|S��~,�7酪<��1����F}�
#�U�����n�V�X'�����_9��T%{`��p����;IE�ʹ"���yvɧW|t�j�J����1*�~K�`��L��΍َ87^�?��CF��#���� 8	T%�֣w�_:><ݼ1�����O���y�CT��|rn�t���~?�g)�n��E���p����lBdj�]^�d$I��
(
�3�fgَ��aj8�r���4@e]5�R�Hy�`�&�^�x���a?g
�X���+b�b�%e�n	���y<*D��P����`�[e�
纠w�"lN�l�����~�Vn�&V����>��`7�dp���f�O��_�C�5v�&Q����,n���Ȧ�0>�g��ރ�C���@����X�.�i��(iy��(4(6�|�c�K���K�b<Г��lBy���p8.Jԧ7F�
��8�8ʮ�m�#Q�
�+�Z�����w��Ux�
3K��-��Ho�y:�1���$~�/�M�{@����1�gO$��_�o��Y��I�
?����(��r����L�
��R�,ޒ��|�P�Grp��Q)�e�9I�.��*Yo���)��ׇ]z�"�by�ZO�C����%D���a��ml�e������������P��deտ��1�7>٠P]�`�d�^%euyxU���j�������S��n��\ө��ֳ�)��2��M��Ǔ�����nʃ?���	�,��Қ%�7jY��hf��-W�$���+"��G�>S覓��{	�����?0�3
̒Me����9n�r���hS��c�mVKv3��_�
�������S�$ny�q<����~�J9��[)F�q��\�V����Œ�a_�`�z�Z]n6��ޖ��'c�w0ek�E���S���=��@��>`��Ĺ�ϟ?��Q6	�1��`���߀R��L�YA/\��{{��>~��ѧ�<���s����s-5JU89b������@��_;!;�af�����6���C:���Z�[����rK�6i���'�C�^ƑZ'�G�'�|����S�+�fY�ճ�#/t�`����;�ں?�YbO�,_h��Ō�b2�GzЗ�s�"�gf�:ل�����y+�d3�6]T5�m���tzGu��)���ƺ��"����30~��5��AS��2���wg�lx-o�F��a���/$���*��"�&O�l����-C��o�������eٛ)����n��_��>�����ϔ�����V����Pm�0�
Ӏl�����b��Y}�g�1}h��N�,��a�uZ��7��īd��"��=����
K=@�����k�gT%��;Z1 ��cX{�ǙYŶ��I�1�Ȩ��Vl��HY�5ї�h��
���b�9�\�ec��邼<5���
����¦���Pl����Q�n)uLS��0�%�U���a0ը�5��j�FŮ�7M�	T�����&v�Ζ��1|��oF̜>�C�wE�e��+"�a�0��/!��SNs����3d�R�d������P���K����&�Q8���X
��-j�k�g�fU4C�ޣ�ޤ��u�VE���U�_e�h$�] GR/Mgoȳu��nN��\��re�d��AMȘdi.=Yp&ל&;
K�7�<y!!�s�������\�����8�3��D�?�W��4�Su�a�#�*�I�����@�lj�L(*��y�7D��>|�u���H�w�鶌Z}��##%�6��wJ#ׇ�Ja7m>w�݉�8����{P�*�i_)��/����z)_�|�M[�>��凣���t8�V�`�W�G�[�6�?ԣUk�Y0��*_�?;3q��Y�ׇ���a'���(>����HE���X[}=x>���0)�)�_I�kV�>��\]�Ɖ�d��W{4r�kKA���4ZL�64��s?jI��EKG
<蠦��&b�d ��jZ���Q'Iz--�[��>��1�EY�>��M�;:�2�h֝�Hdt6r��u��7T�H8����,��dD!�UG�GQ�Ƹ3�(����E!�Xw�l�7�
-J�ϰt�?}tGJ������xP��+!���l�����#y�kc�bb|b�dR�f�A��hSo��%Z)ƽ�������G��'S�5��?r��M�� ��4(�$‡���io�xcߵ��#բ�|��#{�A�v�F�tͦ=�щ+����S��w3�{�ؓSd���	Ca�=|d)>��
�2S������8�!,�`���$᣷�$ZD���غ}t��������=�ػX�V��z��x�.�[������:���6�ⶻ�6����
�����:5,�MH�Qb����C�6�%gL�击.�!�,�t�F�1�Bd<���D��\2U0x�B�IRڧD��:�`>�����_�n�(waz�E�?��DV�oLD�3�&"����HOܱ��|�H���7�y���)��%s�
7y�.;cӞ��A�6����P�-�_fX�}x��D��K]0܏��K���MAAX��h��lg/YZap�2���q�Z�*kbr�I�^M�C�To>V�7#��|3�n���m�@��0Ԭ��Py+>���s�<u"k<P�EY��û�.�Zp8ڎ%ʵ#Xܡ&o,�ض@d�5�=��8Y��|A�vd/P�2	c���
o_��'���tZ`��DX(�$#/���ܸi�j�̥e>0����0���Wg*��8E�B�xHy|�.����x�`���Eg���8��?��9w,�[b�6���?#艟�F=Q|(\nc��D��r�jr{m��F��Bc}�Q����3�ٍvӹo��[�����rBXs��i����ɧ�UL�a��k�R�O��op�������y"�M�~���u�� ����~dI���ُ5���9ؿ�q)�P���q�	���UwFe�EQr�����x������)�m>�jǏ��v��������R���(r ��`ҿE��h0�w������bvž%������C�w7')�rn/J"�=|(ݼ0$����&���r;v�����ׇ��M�;�*
�l���\f7��}���[�jp��bb;���q������rWbܶ�g�h���ޟ�z���7*|kwPU�7�3�~�AK�:�N"P6�n
lJ��6|�R�F�{�����x��!��r^/Q���"N��^�jv�����o���h�Gp�~%ɏΏ������ٗ:�d*�wy����Nދ]��2yA�@/V����0��:�N:���!��Ϲ�x}^쎗�P�kǹ.*�oӭ�Z9�z�]�m� '�ϸlZ�vr�M�챇l��8���M4�����y�mfWp���v��~K���}tm?��E9����w�D�]���+E�4T7������,j0���RQ�����J�.SLN``r�ギ@�b�0Hg��=�Cķ��5�Q���R6�Aea�q�I���fӖ�{�Vt]rt���/2ȕ�|/���@!=���5O�e�J'��YX�mesz��aM�,P����%q�v��ث��G�(? �VeQtD
i��ٚbۣ]uIT��eE��״zz��3÷��zˇs^�xo�n�c�f8�x֮���3Qu��h'������^Ţ3�w���1�:-�M�Kf�A]P��wG�XI*@�c���i�$,᱗�Ew(<����~9~j��ô<�:4J��y=u��Eb6����T��
|��_7�.pO(@ԛ(AW���EV�,�->w�pg�bEW�Np7@�ox�^�_�Y���a���W����c@�88�"����]5�_�M�]TQ�ZF�Pi��c��^�{V�u��������9��C!�&�dd���IfUZ��[��tZǕ\�P�F�>F�>wk�x���;��,sU2c`��^F�^m^��
Dw/(�i1��L��x����dF�cL隌�+N�Z��|�N?��'�{�k���r���D�|�ۋl-/�FԐC�n8��T�8%�<�;OB��}?�ҋk��/1�k1�1���L�v��b�� x�/\_Pً�us�
�:`��<�e���(NQ�8�ݝɰ=a�����u/� �7^�}�o#
�rt?�_B.
�ăi���.Fn�Y� ��^���(G�>i���'����U'�/�	�ܫ��P�BYyO�h��U���mi�'����_?����͎�f/>�}�����;�Xu�Ì�ӯ�?=��X��l+�{�rB����ɜ������m9��}���:\R+����|�+�<�8_j�*k�O�z����)����Kp��i��v($��
�n���K�[NL��w/�ϲ?��7�L�z��c;	iPPъi,x(n��xޭ
Ѿ��p/���$�Dل��aK1r�����o˾��P���q���TW}x!.���50��SU�n�5��W��Ÿ���K cw�-��Rw�D@��6�K�`���;�J�
��=r+�{fʪ���6���Ě���xa��5X�G�����ޒ�N���~�꺃%{A��H}O_�ȳ]���h
�?Me�oG��EP�2���n�=�l�j��p��~�[;����o�4W�%�8�ބÏ��7|,�+f��4=��~#�1.c�p�'п�qy
M@�8�{�~�~I��a��r2Q��Gɣ���2�B���L��8���Y~�#:�~aҎ��H�[}K�S�[��vR���;�h�ކЦL�+�
�m�O���/���UC?�Y���p�\�}{�PK/WUW�t�.��$pip/_vendor/requests/status_codes.py}W�n7��S�ZG�e�q$�6E�m���KI�w�-ɵ�y�z��I:��.)�D{93��7�-˲x��l��L-�j����<��Fi�`��:��lcM�*ӶF3-Z�m�e?��;s^��IWx�N*�t�J�*�0�{�DUI�Ժ�L*��L�r�Z�t$Ԫ��ha���u��x{+ڮ�E�������XϬ���λ�>fx�g�A��V�z��O�/�4�Rt�#wy|���K�"�Z��E�δ�<e;q-Y�7^��(�^�lm���]'�s\7�>+�$��ց��M���V2��z�~�I
�ѐ���Z��귟�
T�/��RP�Y+]g�`JR�94=x2+BA���|ۆ��b�U�}I*
N�f�1O�O���f����M��h�t/ˣ�Q���Q��Am��o*ӸLdD��u�����du��}�,pOo���Ƅ]�����eA�� ��C�8Q�+Q����������I�TY)��G��G(�^h����X�Pג+cP�0'8�$-<�Xf�X�O�'}b2"��gda�M.II�eIJ�T3Aj(�$\�{*�;Ǡ4�:tg��<8�K�P%���?bCf���a�jg̸儲ҚkYsh�Vh�"1f�y9n�|mL��L&�I�M�.,�b<oM�6J�1�I(��}�8K]p����`��D]Iɢb��r�=Ӕ�P�Pa��F/�3#ez�0���0f-5�@�4;��c�k���Zk,%qII\���^
.�rpfIY�ul����.#P�}K�ك{51Ғ�J�]���:S1f/杕�SI,)����k�"*S���(6���0���^F`��c���0(CI?
��x:�Z�`ΫV��
%~���"oU%�Xc��Fgfc���~�6�#<K�V+�~#T3؞����'���
�'<v����Fо#D=�T��BY���`�'�Q��A��Sa�z+1���6������+{ǃ�
�m�(�7J�G��RB}>|).2ְiAp����:j�!��h
��lP�2zR��kLu�[��L�ݼ����U��V�tL����R�i�4�tn�'y좾�ZQ˃ֈ�$y~�;�j\`+��X�Q�6G��f�����]^���Gv.��Lw/'�d�$^Q�{@s;��>�����AL���q�ѐ�8�-^�pp�!�z���a�	y#� s؁yA�!a�����W�qT��NZ����~J��4i�Z�Jp$�iw�/��%]���>%���x	��U�)�[�y݈}Ɗc�^å�g�Sť���$$�X�;�;������97��Z�V	�3\˭�+��.+�4`�f�*���0�3�;%_��Q5@s�Zpz[IY�#o<��=�*o}��,|��Z�c��6�r���á�(��Az1L£�uI7Ez<�Ӣ(����dz��We`1��&<>4#��	�A���'f��e7<2'��"G�~z �6�C|x���7\�v�II����N5?�}�O��t87'kS�`���y�Y8a�	�2�M�Z}�_V�}�����d5�Do5+�aO��ԕ�)�P�Pm<yۘ5��9��9GR��s��h��mX���4�=f&��'d�4��t)�1��nd���#%�?�PK/WUWQL�[`"pip/_vendor/requests/structures.py�VMo�F��W䃨�fѫQ0�
��E��W�H�xɥw�V� �����J�����7o���r6�%�:���֙�t�A�|�K���	�@��A�wh��#�c�6��R+����� �V�

Voe�zP^�%��I��l6|�X)쟓$)��n�����J'����C��*�Q7P�RNp(��,��R�G��B��7�P�
kl���趺��7��y�šӢaa�dH������(r�QV{���gY!�)��R:�-AB7d��{�j𿖢�
��r�ɑ��n�S�P�

w=	'Mq�3P�3�2�QQ�c�Ri�hJ\E����S~�:~0��D2�<�NR
�n��M(�T|����M$���<Wob=�#%�!���WW�R>QY��IE,b���,�u�Bϩ_J����|���B����z
pw���FI�R2\0>r4�<�6�L���BnQ��9�Lz�Ħ��; ���6cG���|K��o{�w�Y�4�$O�@�ы�0�B*J�[��hD��#�j#7�!��IU��s��� 
2�M>��J8d	pVO�P����T��nV��a����oˌ~X@63^!a$y 	tM�k�p`�`��-,���n�L-�u������7�;a6�_�cL��I��U�E�=	�e���{�k���2�$���o$���'�"]�»���~j�"�����꠴~�Z�Ъs�O)h	Q0^(M��֌�x7��"�x�>�F�G�y}v��s���>�\�W���,�A�i��/#I}��
�4�X�Y��%-���6g}�YDv�Z?�%�~�k'ښ��;��v%K�8��c|B�N^�L_�,���d�Oc/4��D��,H;\�?���~���2�#�=�>��ڍw0V��o�r9���0|熖�X��\�a�B��v�#�_B��ι>|�����T�)��y�ҞM�4���G��#�M:����0�~O_6��J���<ސ�f����A���#��g����5�:���>��s�"��`k�s�Fw�-]e�6��agY��r��É%�wԒ��\��3l<_�)~���T�S�F��PK/WUW�Ue=Y)��pip/_vendor/requests/utils.py�}m{ܶ��w�
�:��Ίz���l�I[n�:���䴲M-��]rCr%+~��~�
 @rWj{ϽϽz�zI`03��Al��ץ��*Z�٬�����qr�Uj^�˙V����R])��շj��'uV䕪/�Z%�V�J��&�/�\	�
[�̪�L�35-J�?պ̓����|��������EYCA�'U���f���7Ya~�V�ͯ��\��>��r�<����/���6�I�<�/l�oO�bc�ʹL[�ߔ�.u�"�\i�-��Z�iQF�r~H6-�ɕ�/u�Z$e�c�'�#Sm�K@��^YA�ql��W��.�<��k�La�
�n�ӊ\���|YKSyE�p�L�`�iS�/�9���6�y�b"�u�Ԧʋ_��z�hwoC�_��G���^�xv���8��o'�U��'G\�)���72(��)Y,�>�'�6������5��:+�|���p�����V��Wﲮ�,���+�;|�U^3p�6>�]$��}�ԯˢ���?������O�\��	W0aKf�1)c,�S�c��?M�£u�K`���5aN���d��?҄�W�G���4/�M���L�P��eY�͸�C�e3�簐�y��*CJ`{}pr�<~y���X�UD���I0TA̿/^>;}u?�p��ū����:�Tt��:�޾9:Ah�\�`���<�]�ãG� ����!��5T[�b�`u��+]^����Y��T�g�<�Q�2�wed�{����ۓ���7/_�	z��G�,g�:���a�U��a2���		+0>)�zp��m�:x?�4���������1t��p?Qg�F��ģ>%F��~�u+n*��H����(g��6H��>�8��
/��pO���m�@|&r7�%L|�
�R�V�R��K�U���$�t}���:��;��,t�}z��O������GG�O���W���bZ����~�&eQ��;�Ի�˲���q��P��H�{�To�9�
��r����?��W ��׋_��� .�g��Я=0�q�������l�>�m):������{�Q"�$�y��ov��“b���mc��^C1�h0m	��(Q�P���)�����L����M�O���RO��5�Cц@�������*�g`�	���z:+&��-� l^Ԛ�"'qs��)��@eբ�Sݛj��E�A�٢�*x�"t�o��+/nd^��
S�'� ]Sj4��5�{a�����R-L2�`��6�D��C\t�8+�2�+�.�H����2x^��J��]w6|@
��pr��Z]̊sU��O����~�m��@�Ɛ�?ė��.�P�%ܶ�Im�;�T��V����4��a�4j��9M�}ZD_$5�i����Ы��d�L���DBr(-r�2t�B���U�#�3�����l��^ԦbPe
M������e���mi�¶�S-iR�F2�ˤJ�S���b̫��`
t�F�ug����Z.@���<,�]]Ԡ�Û��������E�*�c��E��6�cw-��7��o�k��\��fy�S0�
�១����dEt
�݂�G��	�w��AG��z���V1턀�rQfJo�Bai5���%������%��V���������}k�!պ$,@��H���TZ��u��Z�Y҂��$)h�u�Lj�>��S�+د���&�!a�a��2UѴ��:�@����7g���0`�Tgj�
t���0x�s�����\���4)�iV�W5+��
��@�����ig~����-���FW��@�?��"���ſ�B�j�Y��?����]�4����d�C"�b�lȈ�ҙ��vH�ր$���ε�
�hm!�{D:��?��:�Zr�\���bcRr˚Б���/�z,I+�qI=��&l��p'*����)�`�]y�[��?����v���ֳ�Zq�#s�[uŖ(�m�D�
Pdα*�:+S �zI­Bԁ&+'��RN�48�'��-
7ܛa�"�Iu5)�E
؜e��V5���BH�m89�:�m��i�o��
U��^�����@}�3H(����-!g�}B��e~��� ��{�
��<��\��{��6^#[+
�
t;R�[������I�?|C�~@���L`�@`d��шJ��(�j���� *:�m��k��[���
�
Z�s]�hj������	�h�H�:#�+Qvష��d�[7��j��v'���VL�Q�֯n3Q���'D�Wg�C�F�햍\q��/�e9�#@�U:�8�jL�}W�D�2�^.�xm8��Ȯ��k��A�nr��ŋ��X€�qrX��tS��ŸOxlV��i2��W�o1
���y�%��OQ�9&A!A��Y[�k|x�fQ1P�F��E�(�ޑ�:m����� �e"`������ԧG�ſ��ĸ���4�f,���7?����eHx`�Yf)��"u�A@��hg�|	J��v�<*ʋR�w�?R�e�]���<Gs�΢���ͫ��'��8�n��i3O8[U!`���T�T8�q�k��#��§�)�$X�f�$M�{�v{�e�0Fx�Ё�1��"̗�s]V�:a�$�6�!�FQD�\��Jq�TΦ�)
4��[Z"P��ao��`KOM�1��2��Ҡ��h�H8�¨σ�w��#o�,i�V�Nc�3J5�I5�2ǎD�1�'�ɲ�ɴ#��j������fUJ2�0"����]���8I,���\c�б�(��Bb\��*����[e�	��4?4-��wO��${R��yh�;	y���IQ�<kT{p與��97��m��c)��t,���R�W,sP�+&,�$�Q���A[w\u/w�Ta)�;��b��<^���V� �q�9�ӱUvL�8m/y2�!(��xR��O�,N��9H���jFdLMTa���U�����`H���"jr'ỡ�d��"�-�A�j{�߹�P!*#�
��(
rȏ����T!�����9��t%���q�;��P����65�(�C	:�	^RN.U�F�^���z2 �I��5ح��8Db��0O�'S�:�Jil@�l&�ެHw�p�ʴE�jrT �I���}(���|�1j�,��ڨ�6�faoM�tJ��1	Ӟ	�aFPK�D�H4�@�˹�gՀ�]*��!�m���*���D5aטٶL~E�Ʃ;h�,�>�O�LoC%�
V�h�d��O�z���Lѧ�S�>T��\%�"Ύf��'�v
ʹ���OŠF�t>b�)`�a�D�X�/4�U��%'�d_2�bX�T5���l�B���G�G̓]�`G\�g<U�n�C"OR����g��t(�%��{�x�6�Ȁ�*fFHq��
�uCH��a0�����F�H�PC��|A����N�R, V���PaZ��N0@Q:p��"n�':`���)�P^���q�a��I!�q` ��a��I��p�e��W0 �	6���ť�)(4�l�E�=>�/�Ng�uHpK"sh�g2z�(�����H~Γ<���{�;:�o6��/����D�0D@�UW�T��%L��qX���)
�Yv[K
�
����YC�M[�Ơ{
$���:���
n��*�"�6ӳ�-����̈�V�0$K
� ,�O`�@��m߈Lѐ��s�o�k� /���Qi�m4�mpA�P���HfR
Zɑhq"��)R���I�n+4 
%L�ND�P�FC�
�Q����w=�9��ck���ю�kj�C�bMk��w���R�B�'��LPp�/\�`�w^0B� F�|f06�����R�1��4����}��-18m�� 
%Qǡ����Xc���{�j�B�1��9u^p��z�n��7�	�1��t'�t-d_��Щ�6�r�^E_K��Ѯ&�v�Z0�����<��!��H��}K��Oe��:�j�×h�gu��̮��]^���*���Ι~st�M��A��R��M��ߪ������'꘣�վ�o�lu�,gI)A�"<O�+
O	2ähJ��i���Qx��� (t�e�d�S�j�̈́XEJ=�_q��G�#A}�{��p\��ʭ�:'Tr"�,��Z���pI�0Y����\[t8+��B�'u�Nj����#~}`�W�`��^�vh�y0y��%��/gu��:��`@R��b\}V�`RKsB�@��b�2U�	0j5���� ���K[uq�sPv�-ipƥ(I��-1˝��R��o*��E��l�A�.Q{\�2�R՜��BQ����e$2�2�^/^����g,%�x��Ӎ��Ȱ=�>��P5���7���`��D�c�- cR˽�=�4c��a�R
O9��SHP4��B�9�4�Bk�$+�#8���Z�t�A͈̒���:��JݑmM�b�O��2@kY9�K��s�V��`��t����Ƽa���yB
%�nD�s��5����w�c�KY
441Z�uxBu�D|���˂��p?�H
&��瞒mx_�π��"�H}{���Qˀ�����m�6l�b��w����'Y��D�I�����X�@v{�݊j�燕�o �r?��e�3�{�2�o��
���{��V�4�-Ւ+3J�G[T%3B]�>>"��G�Na!L4��dh꼬9�,n�h���$���p���4�]�Nu��'�@�(�x���;3�Ӯ����n,�8����4��n�W&`�
�F��RZ���
F�-/�ޅ��@N��ԥ�ӥk��9�*��F��,�0x�@��%�Ŭ�S��"��(�7x>z��Hͨ�T��$ӯ�2y��Or��	�q��0v�eJ��|F#�z (�:}�\l���x&R���|j��X&��ܞ�Yq�^��őjK^>R��G��ڰ��XbhN"��l~ط}'3Ν��~��L7^���ߢΩ$Fn�Sr�o>����F��p1�SDZ���mY��MD:Ub�``�n��f�u��q�dڰ�����n 
�;�HN�3�c�zNm�T�q���)2�|�bb��2�����$�	֥��!�q	2�gQ��?�ߑ���(hp��$i�PpAC�n��i��з[�&8��e�5h�0Rh|���D��"����}|{(�.�N����n����V���P��"��g4��Vj��B���V���CQ><�׸"؏�&6��TWO����@�~(j0/P������棣6��ɲ2��ۿ����q�B�}[��4��T�)�a
������س녽�Y�7�K�JM7^��Tn=��-�|/5�g��������� `0h�ӕ��(��y�#P�}k���i>��O�}%�ު�ѷ�4K��;B0�+�Vm������ģ�aXDTe)��Fe��bh
��D|�k��<#��]V�W#�F�U�9�P�4���q������d��(?9i�32���s��jx�8[���y
���r�>��C!�Ρ�,�'�j�[# ˥�`�c��t���T�o�ΑZ�w�`����� ;@�] 9ࡤ��n�=�J�Zҹ�u6j�1X���
���~��+��F��,�+��v�{��[ow_u�*�TsCZ���V����[�W�i�z8���ܳY���C���+��5��,�]�n�56��F\��.�gA�[�?�>�U��[�g�z�	��9��o��<�����[��,��f�cU�k�l�g3sz�r�	�W�FǪG���sd�Sonn�L�S�h-��k��Uu��kD:�-A��;C^���'��R�A=��P�c�Wr1��]�vI~fG6S�m��T�.������[�}�Dɦmk��'�Q�֊9U��`�%�듙�MW�P"�9��!M��Z4�u��/24	J�=�X^�y���U ΃�y2�T=�,^[\��*�d �%ʾY�C����A܂�Dq4�ߢ�(|_�v��������)4h���H	d͒�����nY{���덨�W��Hec�Б�B�,6
��=��4H���=���e4 `|�	�‘@t�kЫ
D6`Xf����t*�ӽ�2���id#U؏�]�4T4�i_�N�1��;��>��Jߋ��4��9���J6a�n�X%+��k��22��y��[r"�a)�t<�
;aէ�N=*Z34����!7�1�h�`��_���N[�q���Ev_�.s�T�G���,ĝ��7O6N_�|�">>8��Ӹ�1E�~x����~<��_^���ۿ������������e��j6ϋůeU/�o>���	v��>���>�f;��l��1/7��eֈ��|[W����h�������o�м��b�=_�|�p�5n�l0��Ç/������ώ��I_�Ʊ�J �뻢{�9����3i�1��ސD55p�.YQ������h���@���r��d��(��Y�����^#�[��s���C��x�{}ȉ���(�&?S8
�a������/[A�Lf���I�ۡAO�3�����;w*[����?��/�@�[���pp��'ČB����|*>�y��b�>z�~.5���+�"<���M��av��vBA�"3�,Sx��R|BN�oš���wPr�L59cYX<�n�?~���p�������<{��Vu�A�-�x���_ěO�,g7n���icxוliA� �e���tBw	�~�5h�Rj��SC����+OL7��N��΄�z��:�e��z�B\��,9�H�b�`�sm@�8�BĆ��
�rH�E�n��scQ0	K%�tҷJp9I���y(�'Z��2kc�!�Ac�.�M���&t\�قnV:�z���Ɣb�Œ��C��o��
yP L�~2���j$c�ȘB&4��}��=~�E{���{����ȗ3�@�gw�!y<��gfD^��w��\���U0�4�Q�c8L倵��r/�)�JF<;1�
�-�'�1�[Z�&���S�=!������+fCA�-��/4�4��7�#Yz��%'k"�s��'�z4�˧O�"���l�����E���_��v׋VY��O/�O��
��ӧ���V<�m�h4Dyy]$�`���a�+=0�Ȁ�׏ba.9»�Iϓϝ�k����s	��=��/eJ�1�dii������l%�{f���M�Ԭ#^�.b�u��&<��b���;�y�3� ��9N!;�`8WH���5WiY�i��=U{�Q���\��Ԇ�V�g�݁�f:�,��W�Aw���H��tu;�7�ML��`v�Ֆi��|��1R����ͽ)�-d/Z�;ݥ+$Vկ����0��=!:5�06���x��P&Ո�5�q�iR$��*:�Cfil��f@�7�L�o\�(�p�'��͜����fX+S��z�;�{h�+�a;5�W2w�,l���/�	�@ư:��6��= �
�.���0���jL�D��������ł+I{ �+��l|�5vY��%*�qx���M`�7@ge�{4��J�:�ۢ���h�4i, tÕE�����ʼn&�
��ÕM�h��֍}���0���kAb( O˼��mI��p�;�V�S2v����A�{$�OېI�la^���t�����d@�pt�D�pZ�����(�,E[Sj�5���/���IJ�[O
�qä2��j:P�}橗���G}���d����DQ��``v�!lɘ.�s%:2����2����(#[��v�I��QL���"R��D��P�����2Jg�&��؂]����%�9�L�t�����@z�-|Ɋ��MZ�-��q��\Ă��J���ۢo�]��S�6f%����`�+w1��zF��&_����	��PZ���V��Q��Uaբ���8XfX��TΘ�d`o����l�X���nZ�|
{��\*�@��jg��z�׻ݦZ�`�!���6Ü�&���Qie��ii�"��ʆւnO�I�{��X��n
�ͯ;;e�!_#wB_�JǘR��i&���zJ�@i����^*ϸ��8���^վI��#h���uRR�U�gt�R2�N%Y/UF9�n|��^B(�W�Do���v��nm�u���AE�A5gm�$�zA��
n�
��]uOp��\�@���Q
�����S�V<̡W$�R�B&���fa��G�	��t4\ը)��nN��������L�arg��Y�SW�cOZ
�l����r1[�}U̮�e!%��!��eE���u�q�Sr�M�j�Ik�pMV1�O��%'f
�K2E�X0I�������ŗ�_�1&��4L�l��T�~�=z�_#��ӈ����92���ߖxS�G�s,&�,�G�84i� R=�%|�HtWL
��<Q�s�]*���ᚳs5�M��4y�<�����2���ٶu��M�W�I���Dac3���Y7��mɂi�#3�VC���U}e��r��gk'P60i��5�e4;;
�E��ĘK'N.0��+|�p�f�6\���M4LIz�á&C��q_v>;�a���kBVXk�線O�D}߼�鿧Z���Cp
s�~�sF}�l�A
��gd�gdFj�wkz�A��΃��M�l��UQ���m8�]k�3��;��J|�l��WU�Ϊ]\��A�XلV��*�c�
�G�)�RF;Q�P�u����}���ŷ�<�9�iK��4�V�6��o;M�d<�43'�F�1֠�Ua@%��	8�ҫ�%8��pm���kB��3�OՃ��o�ſ��Κ�	1��M��ws�;yZ	�BK��e�z@7�&���w���?5k+d�	 �GdE7D���O�X�����P�s�ҽ_��Jl�>�SJ�nl��KX¨�o�v��[� �0</W:�~�\�1F���z��C�?�����&��s����i�$e��L��}~��y��K�h�ӤNVHζT�T>~����6��]�o̰��:`c*~����J���Ė�<Gf��a��c.\ge��u����7[_20�Գ��d�o~�~I��+��9V8��ѣ���'W5sJ/��OO^>܏_U��݃E,?�p�P�d�H�N�F閫�I?�'�Uv�8T?�"�ˆC�b,@;��������=��\9���3�U�uAG6�(�@"�FT6ռ`�V�w_�}�|cf��q���t���L9��x�����z�@��)��z���{@�9�7Ջ��O!�}�̇!�{��6���cwڈx؋���h�V����޷��Y%ά����|��U�� ec�T�l���!ԨAK�FH���~2���y��{Kc�̈��K8C\���/oc���0��nO96�hBw	��߭�Z�ic�0����Sh��
�_��mC��Ŝ�����&�A�ۃU#+��ɷI�m�)_�x�6A��q�Rb��������k
}����{���3S{	|��ŷ���"/8U(��D%P�w�~���.�E*����
����w8���﬊{�b����r���k�3���$��̴�U�li@�v���#�q<v�,k�UD�h���):�@�Wzv�~��� ���a�D�M�M!܎����2M�s���[����|��
���ܫ�8l�O7��anD�œdGEWƘ����an�-)� �E�6�l�ŧ���sk���Si)e�X��GcC7���Ub�1�B�B?��	Vt�
���-�c�|�Nv�,�\X�Y���7�Ń���X����7���"����N�)���My�-WZ��qEK0R膪����2r}x�I�� �J3���˲g/����Ҡ(c��	��$v^;?ѿm�{�;b�\��z�����/J�љ��p��z��g���
?;c�]�e�꾼�Һ�3
�h�<�\�x�?�������L��'fݿ�i�#_yt9�
��&K�y��4Z�~���A���e�a����6��j�NF�gg>_F��U|Ϥ��? ���oZ�CWB��+fc���t3-����G߻����O���$%�Wh���M����R�$�̙��s�Ͳ5� 4�$�K��y�ކ�(�b�l�'\�)�j��E�#P;[�	l8��Q����1�/ok�r^3EѺi�)q|Y����SS���c����6W�s
M{�y�~C���!2�'�����ٴ�ƞf;��|�HN���/�w�U<��gC&�驔?"č�n�#	�v|N�Ӻ����e�Ka��PK/WUWb�"pip/_vendor/resolvelib/__init__.pym��
�0E���ЕB)�.|-�Iq'�v�@��3��o���h������Jɍ�
^�T��RI�Iۂ=�ҟ	[S�z����fȡA�vr%:6��v��������i��=��5��j�~�p��W>�
2��¯wA<4��	1�$�l��!ĝ��Y��ei�sHeL�oR?~hN���2d�S�r�V���fLbq$;=��nJ�R�PK/WUW,���4#pip/_vendor/resolvelib/__init__.pyi��A�0E���'��]�3�}S�L�)��*���}o�j=����s�5L�:�L#�0)�zb�.UXM�qPF~ؑ[�P;��E�a2V���N��8sbq
W����Y���$o{�^2t���kv�l/����L<tl�`�B��q�It��@��c�O�PK/WUWO��:�#pip/_vendor/resolvelib/providers.py�Xˎ�6��+���3p�S�A���hP4A��h��YˢJRv��=�����"�MÖ�����1�yc��C��l�^��ߢ���o����~��r+X��[���ٝ`Z�3J-&{+t�k�Z��+����+y�5�e��[ٞFt�r��õ���l�-�6�*��g<_M[��dJ��riWo��/;i�G#a��.M��+v�	X�O*k�4�Scװ?:��ff�W=pm
;��*�>~�\�>)�r:'Y4�V:�g+�zТZ�X$���+9���p�V�ޤ�1��3�#HN+��
��T{��
��,�D�	��(m�^�]��.9Y� ���z�<)2"��8.{��ݽ ���ӧ)���oD���Z���[9ɝ:���\}y7���{xPzҎ������V�T˸ގ.�ؖ���C�G�\7A)lڜYU�b����+�(�H�q�5b=�g���;<>�d�K�G�QY���|d�%WR�z�˽��/��P[X{�}�PL)F`�[�g��"���jV�8JH|�άV}��ڲ�����X�Ձb��A����)�dm��[�e��t�~S��L.�E�(�"ld�&䵚���
h.��0��ȇ����>c�k�����8�6,L�P���-sr��	M�X<�}]E3��y��~�p��i��:���<&���LbUE6%�S�Y-7�
dƒ�	2�;	n��t!�s5�(k�0
[�*$����W1p���z�4� �&q�A)����������ȵT#����ZwcC�/z���0c�9��?�1��8��*T�nG�d�<�u��S&�7u�ӎ�}f^[O�3T��a<bp���
�S���{?U�?��kT���W'�RmG�u��L�������Չv�>3�FӞ/&���LaUe+N�mH��g���%{a[���y���*����hu���U]�)1F���f���oܜ3v.��J��ѣ��ag�Iv=v��}
�
����4B¥�u6���;
i��kǾ���C���0��|Ά�|N_��\ȕX��s-��`ꑦ����e���3h���i ,�:L�@e���kCuPfS���#d1�ymfytI%*�BR���u��IIQ�e�qmz�) ��¦,8����|?e)��fn�H\;–�:0���1߃��0cF`^��x_f,s�R��&��D����r��B�@��h��&�6'��W�
�Ϥ��<}�0�o�=� �������
�C�u�C/�z�Da��Êw��B�������R(ǜ�9�qWNh�����+��A�;�$@�'5�
|
�g�8��!�[�$7�}�&�S�1�'�L$%HEZ��N�\3E���^�U�U(�<;lu3�5��U�X��,Eט뙰]Od��2'����|�Mc��x�<�Sb��8H�N��A ����zs�Zc�n\j|�."��a�?Q6e�8g�M���S}a��������)-Y�f=q�6��F�N��+� �ӽIUEC�j	����t��\1bP��S@w&:e�Ƿ�D���o6�t�4+�˱�E ]ޤ
��5��W���..�(~qqGuAw)�pB��^~�{��sw�馎�y
��{��}�����ײ�v��' G~2w����մ⦯�i#L_��0�.���?q���/|/.2��%#��M�0?��K!Y�%���&e_��[+��{�J
*|�r돨D�k��;r�
;M���fO�̍
���!�n����H�
a���!��?>���4��#���d�h�ÎW�D�0ixM���J���CY����5Q�k��_PK/WUW*���?$pip/_vendor/resolvelib/providers.pyi�T�j�0}�W�1o>���nY�
�7}
E���%�4)��wt��4�v
�=>s��u���ҏL
���V��Z���4X%cp�`E��"Bcct'F��֠�����{-�o�Z]��|��_��~uz9�8ӿ,rj�T�x�;c����ڃ�)�fW�-�5�w�����p�xB�s[e��*�l�c����Aߕ|[yi���k��+��l2�uC��DBzQ-�U�n�GtJѨ�c·sG�X.�nU+�(Xy���X8C=�qn%��W@��TP�&H��}��sU�~��Y����=e/��<��/�0���j�|��>�*�	dG�$b��Q�j�)��!�����J}��4�H�+T_�2pO�=%�w��V˛6���F�ٝw�F�ԧ$V	���m]�~���7��^%�~T�;�����1mO�n��XE�?��1����/��T�X��~�PK/WUWpip/_vendor/resolvelib/py.typedPK/WUW�G�*5A#pip/_vendor/resolvelib/reporters.py�Tˎ�0��+�����ȱ�y,�皖�D�"���4���v�4i�5'��r8���=|DO/4X�ml��Dxڭ���z��4�1�,Ξ�$���K��졷x�[}"�e�U��ԃ��6�t_(
�'Ԛ$t�t���P���/�����hd�n@I���@(�2��5W�Xͩ�\K��፜�б^r[c_�!#���D�@�*�1�q!|?y�T+Y��̑	t_=A�lg4N���hBn%�ʠVo��4�Ϯ���G!�W��3_e��~��ёL(<�J:���z>�)(�`�\gr�,A�_N�PXɿct<�i�$P�-�^@2`Ǜà��[�4C�p�xB���̉,�D&��[��Y&,q!jȓ.�ڶ�o[@6‚N�2����>[C��y<�c���
�*�s]�G�=2���(Jn���_rD����J_�*p���q:�QV��CXh?�U�s��dWLΞ<&�s�oa�V^�7V9E˴ӡ�?����ŏijm��Z6�5�u���qسױ��ťE�As=���3��[�@6����=+�~PK/WUW��J���$pip/_vendor/resolvelib/reporters.pyi��Q� @�w�~j2w>L�^�(���v��^675Q'?��ZJ�Ԁ�m�ĦM����(\mE`o8D�Myy jY3���6�1PU�GʑSG~L,!�Ǜɛ~���o���f���	��l��^��� ��EF����|��b<�_�l��ʓ�q̓��&��~�&����D��Ne��NP����R�;PK/WUW{\��P#pip/_vendor/resolvelib/resolvers.py�<ێ�ȕ����%C�f6ٗ�X�v��n���d�ѐ(�Ԫi�dXdˊ��sN�/Tw�L�`�ɪSU�~#űk���ں�A���	uK�ڶ�7ڎ����پo���QT��Lx��C_�O\��#�8�9�;��a%^��/�Ò�
�_ʮ��mGQWk\}�(�i6��1œ#o��f����V����<�j���g�����%����#���+{�u7[�f�]]J��	>~�����ŵ�u��mKə�+���7�$�K!yŶg6�dǶk^�h�G70(�q
�<�c]�-g���j#�{ל	�v�nk��p�p��'0������J�J�q_��xǶ����f_$�<���A�l�����~�v=�
�K��8�<�%�y�‚q�|Q�Hw�{�m�L��[����73�����뷫B���N!�W?���������#���Ħ?����馁E��y�P�Ex5�.�8�J����f"��-��R��ξ~�cU�%kځI�V�?OR(���_K��f¼�
ǩ�O��0S��vϺVJ����t~�50<.ABw���Q�m]����rz�.�Ո7l#���0���4��u���,�>���Q �c�D�UQ���C��KxF��9�
�r`��c�n���������2{�tM{j��o�����ZR/�[�gd]��+4!HP�������-Aਸ�%��\�����nl�f���rAT�c$�6���Rn8jhP��
�6�t�
���8� �ip��l�
v�������\���է�,պ͋E����N\?;{?D��h�{�{k�g���q(�h�޼��"�7o���Fٜq��dϡ��
��5zJ�%�Db�b�׌����B�� ��_�h1��πJ(�	=�Yy:+TesT�K�(��ZXm�Ly.�`
�:��j�܁�bv��k����-Q�ym?��lp�"���:�4P}�K�|w�t�Ǿo�IË�Sf���(�y�eȈ�J�f,4͵S_ihJ��`�Q�&�be�d,4�e��m?p�=��};6�z�N��&G�g�[���~��`ӯ�
3���^�Q�����+z��vT��ѯ�
�Q���a�t�����X��^��@{"�}c\��o�^UFT��
%� vx�~ h֭W+���q)�u6.��F����ʾz�f5�P�c��X��;��=�Nz^�h�|w{��/�2��VhH,�C����z������m9o�>}!ƍ���d��QZ��\yjgݍ�n�i����$�!���P@f�`Ϛ��n�I�8n��|"�&<D�a�Ղ�B^��qo/�7���i�H-į��ђ�B���ص�y��j#*j��+;4&5%�{{}��9�)`?�q��/�LeU��vmvƞ��7��H��N0�*de����b/xo	�����n���<|��虐�,�0w���b�Ƈ��sP�f̽�'q�� Ւ?
ψ�b�aw���{:[��͝d�~.#Iw��*J��|�\&OL��8���V;pT�2]�>��"������z�ナ���	�~����\0�����~2c�>[_�.�KN��s�&f�λ/��^�N?�/�거/y����VQ�r�9=a��ʏV���NNIy0I��v��{i�L�ǰ�c����k��;���i���.C{���T�h[�XۨBG/8�<^�Q�#I��cY�� pLw؍��l�Q6���V�^�=���F�a�A��>�D���G��k���2��R��'襮ٍŻJ)��&���c;y����,�q�*`�~^���Ɓ���r�AX���w���

�5U_��:E&|�/�=�}�z)|���fV6!'�v6��{I|�̂�դɂ[$w�R�]�쑶�lʺ���;��å4�6���L�vu���#��8����4��Ӄ�BK�V�M�=�/܏��J�ko�Yb܉�B�wc�<��c�u�� _gH�2�q��"�$L�o~�i��T���9�\���%�����s�{9Õ��L�,�I] �G�Ы��u=�Y;����]��D(�G/
�d|�2��CW7]��<X15�<?$6>v�G���������Bs�n�W�w~\%" ߔ7�po�*y�fp��s�B���������sW��y(�4!ĸ�ެ���r3�Y��{��m8��@�&(ȕ�a��>bd�R�p����=�
:I
�2pLD��@[�+���`sU��Ծ���%�N:y�<ٲazD`<��4q�j¾��R�`�^|aAD���ٿ���Eʌy���Gɗ�i��L�EX{�n
�H�Na0_��ׄ3�/�O�T<y���Sre��"f��C��q R�6��%�^E��5��5��@��A*0�A�S��  ��.%�ɢ)��a�c]�͕�D/p�ԁ	*�9��T^�w�ֻ����
pӾD�5BP�e�t-&�G�b>F�D����"�����TM��GDž����V2OH5�#;�߸$T�@���k� ��!Vnu��'v������G�� �kL��t4�7&���c�o�@QdI(�C��l�nj�(N,C^����
tT��2[��Q���.�HM�1����iTb��ѩ�v���3N�XJ���秝���s+ݗ��^��B}b�%v��4u������~*(�M�U�&�8J�>�u�P�H�؟��K�j~���#�DZ]"(��[�?z߃��!��;L��0�{5~��p�n���xͯ��u��P�:��À�}`(�j�'�99~��ܕ}���h�Q������}�s~
�����g?n�����"g��D�n�,�p��_�'�X��d=�iOnG�%E�_SM�b���dЅ�9lj��<Jo��ڭ�e�n��CE���2]]�24\�)u������|��n��@��F��,�
F�J���z��Rꀻ��
bxmB������S3��,v�2n����]޳���@!#봌�ǵx�"�l�R�{���:�.��T�,��A� �\��г`��b�]��R�K��n��U�xU�N�a�D.��(���zz�k��b[ƺ���O<!u��h�5H�8oH�'[�ܕ�}���o춃�::����Nx}�>�S¤a����b��i�E~�&��iˈ;&�e��@��f�'<]�ώ|^=/O|K�d�����C����|�2��dT�t'�����r'�KU�y��
�xD�L畃��������ދY��.�<@ko����n��&�{:0s�/���6cA�z�/�J�m����&�w��Y�Y���H�F}j�DFg�����1����x��C��J��Od��S/&��������ˁ?�y_s����_�J/�ׯ(���£_P�mN�Ⓒ}}x�*��mC�i:U(�$\S�K��&�X�?�ͺM���ʋ��2_��եz�۴+�\�+x	;>Q
3Wzt���}�7� l�2@���G���m�͠R9߱���k�t��i��"��7+dR|S�~��	6�A+Q��2P�=˗|���'Ǽl�z���B\��0�9۞'�'��6��^2����\�r���f8?�X�<�l���hz���yu6+UWqL��Z/Q�-�c�4S���1��v��7?��t��e:����+�>@X7��e{�f�WR&���k��WXT��G�3�(��RN���֗���/)�\�
x�W!>5?$��Y���S���
��J��=zi������N�hiub9,v�SrE�U��h��0�j��E��v�Ӯ�[D��r��R��h����Y-0�"���=�ge�At"�F�i�����q��Si�끟�{�V�\M!=�e*"���w�ȓA�붡,a���t�)��"��U��͞8
��ݿ�U9�0A�t�l8��^�Ҁ�!�I8�b�v�0�Vֻ�&�!�{m+4G���PX�!'���`oiD������C�J���-Vn�1�(�k�x_j��׀�E3O�^"�\A�u�D�*Y��j�	���T��\B�Ԩm�[��]��}
f��4Jz��K5��Q1�^2����A���0P��Dn��F�h�a�����[F��q4�T��_��j*��|.��&'L���^�y/ʤ'�~�w%�3�
�g���إ�2jh�g��
����v&��j���P����v�w��n0���u<�T�_D����	+'^.�JqN9�u�$��q9��ׯ7
�.�f^�:��Lί�&x��?�Ou�>7:[N�9���b?hu�%Fͱ��.�
��Z[�L���`�N�wxmצ��%K
� "�1/�y��l6��١�xkਗя���p���H-1=��W*���>I�$)����N���y�rt珥f���R^�����oE5��l�K�`h������
r|�I164Ћ��@�/\:.g��-�/����X[�\YVR��ږ~?I��L\��B��P����!H�����[߂YHV
��<Q�1=V;\��U�:O��*�HyҀ�S�W^��L��۸a���rkF�fUo��@d� V`�煄s=����3:Ή�ϴ^���W6�}B�z23��Hi�>Tx�.�	�L#q��������\��%%���KE��+��ݴI�\�7��<���{��Uk�w(T'�zV5/��X�/Zؗ`�=am���K^	i2j���~�F}�^��3�}�4[v��,į�*��N�
���	���#�IR4��54v�Zkh:)=0�[�q��P]5ݸ�����u��a��k�|���n�h^ʷP}CdI���6�'}�oI��b���� ��o��솩�F�3],M�ǐ�\��8��	��[5�:T�|�U�g��R��Er/
b���H��KE{�6H�(��ރ/ٛ��&<�e�x�2?��B�
ع�!qY��mP]�OBm�'�5������[9v]�n���Œ�Lpe��{��4@dI�M�a yhO�d�T�D}�3�M�A+{�%��҅�o$j{����>�u,���>�"�Z!�B��ɠB��Ev��i�t	����d�h��J����7�b��3����Jdߕ��;�S���N}�F�� E�Yߨ�"�"�m!ЀY6\R�	[؂��ݗ*
�£T=�ѰT]� J��j�<�#�0����9qU�٢w��y)s(�8���G�1$���/��+�C�x�]�e��ս"JaLդ��"�2,9�v��PK/WUW_�)���	$pip/_vendor/resolvelib/resolvers.pyi�V[k�0~���%�i�:��FZJ�.�{	#�q,*[�$���wdE�f)�-�`�:��w.J*EN�SɊay)�&��g)8�X3Q���

�,���I#��Ү>1���gZ\��Z,�}o�y���Rܳ�r�?FJK��ٹ%�=Ƚ%nV�n�k�\��L"mH�$-3�a�����"�)�2Q�D@(�BsH�U�������Ig� ��dTၨ��QMJ	�P�:@�L�R����4��-��!�E>��ӓ��|~�v6_�9;?[x1�J�[�Y!�QVE*dN�&m��ޘ(��Ӱ�M�6!X�T�K���{{K�0d��3
9̘	K���q�ֲ;��9�c�lQ�_D�3͌S
���g(sRo$���m'T[�5W��f�*&�J7��@����)y���� ��@����Ʈ���u}�x��0��d��t�*c�Ki�1�U�|EZ��
��shM��ο|��f4i����M@j)��33&#�a����	3둪ڥ�B���%
�q#����̜2[�!�NK�6�d��OL+�����[qP���&�"�����
�ϧ�7m�rpw3��[-t����
�M
�=�k!=ӭw[����H�#3�4��7!�Qй��1��m�)e��́Z�c][q}��Qw���Wy;�^$�`�L��,��<�
��ڔ���(1��ONZ���c�PK/WUWV�0��c!pip/_vendor/resolvelib/structs.py�X[o�6~��8�^$�հ=K��[�aX14E dY:�YK�FRv� �}�u!%'A[#(l��w.<,+k.0�Bq^��*��(�e��yGNyQ`��d����j����+t���"���}�_��
�^��;}R�&U�@81���
fw(#b\�s�cV1ǁ�"���G���#9�R�pI*=r��)�&?<|?�}
�^������%��y��{��=�^eP\Wép��YY�=%��J%����7@�͕�!��CkT�����;��>)
~2|�sP{&��,�"\�Q`n�C�>˖��=M���HC�S8l�8F��Ev)���W��)M�\���h�K�l|]�YF�Ux ރ�.����,��	����߄�"X[�xϤ�k��{-��Q{w�5n�v{�}<\�!|�%?�9�*�`5cd�`C]/��+=E�;�:����}Oh1��em;����Q�:p�[�1�=�T-��SZt��t�x&r��Լ{����*��4X�og���o::��jHga�w5����פ}R�XI]�:�C/'4œB`��cT��Ҵ�T\���Ķ�tu�v)e��gS�G>��lSj��3���tϊL`u~ĸ���d�i�I��G/���\"N�1Ք�J��r�;n�?�%Q\�E����M�s�{vEo��6���Y�}ӥ���w���n�i��o�WC�W��S��7�~x�ޖ���ڏ�����p�e���^��] 
,�:WG�s��h�:�&.x���*��W���qL��j�Vs}}}�j�+�1���b�sn��j�C��hT>Q�D����97�q_�k5�	o����B¥�0�n��)�M�
7���hu�0|~,9M�K��1C�,�X�Ѿ�ѡᴥ��K�l��/wi�R{�ΘJ�6I��Z�d�?2<�^��N@ך�Pw"䝐5Co�]ۜU�Q鞆w��e��v]}[��pT�fQ��xC��UG~@su5U��h�Ho��&�;tDZ^���+\�4�פ��C)9�C�3�H�o�P6�buAVY�r�FAAcW�
We�
u%%R�@I��FѮa�zE9��*��������-xg^K�>�����9<:��"=�_>H��ɴ�nv�M���8�@A�Fw���7	ޫ`h�0����u7�)c�3�mRH�=� �������
}�n�p�����mr_,'��F�M��C!=Ǭ���زW��^޳��i���j����������m�S#u�Ղ߷�#iҡc��n#�#��۵aCEE�B���J�.͛����5����u�5�Yk�'��jx~�NL����QY'}�Ubs>��/����7>��M����()�V�ٙ��x��ܽs�I�rTB����Z�ռ*,/k&���wa��PK/WUWe�{�a"pip/_vendor/resolvelib/structs.pyi��MN�0��>�U6�r�J A��ʢ
l�(r�	�Hl���ޞ�OCMj6���{���A��m*z�C���FZ��쵐o���P|r�ul�A�#%
>~��O��EFpŴ��A����kxez�Bɔ�	Y�氖̖�lN�}� �hYG�:k�؉z�2�GH��I.83��:jY1�la��My(�̋*��Q�/U!M��q�;T��w�,RZ[���Л���U��Wd�֯����>�8�K��%��80�M™aBU`9�����u2B����T�4˲#�y�
i~�OzXJ�a�������X�(���E�f1�8?c��$������PLX�=�Z6��ߤ��/�����`��f{��V�1�z�3�f+:>�<S�drrVN���x��X�f�[����#�[���zDZ;�v��PK/WUW)pip/_vendor/resolvelib/compat/__init__.pyPK/WUW�.gc�0pip/_vendor/resolvelib/compat/collections_abc.py��O�ɉ�W�U�V�M,(��KW�QP
N-,M�KNU���*)���R����\�������b�Ĥd��܂���^�N�Ԋ�ԂO��kQQ~vSp�PK/WUW����0.1pip/_vendor/resolvelib/compat/collections_abc.pyiK+��UH���IM.���+�KLJV��-�/*Q�M,(��K�QN-,M�KN�PK/WUWa����pip/_vendor/rich/__init__.py�X]o�6}�� <k�-�d�
d�d&-�3Y�t��eqFU�����}�%�/[����%�����~��Lf�W�x����yS�\��VV[&+f!��/W�|6��Zi˔��Z�=�NԷ�?F�_O���ۛ_��E�:D솗%ߔ"b���
`�g���GY%X��ZZ�R�,�����7�R�5����g�$r����̷�&���*�<bs-��m��g�ee�EV���ڒ�FU�O�Y>^�z����p������
{W�
/Y+�m/���[�*��f֮m���ep柰�U�ꃟ7������sr���TfUs[����s�ol7�g��r&�����N��A�;�T٭�J{�7�~�
^��͝I1-fG[&JaE61+�{���
T�X��?�n�~0����kc��ܘ����`Y��U�'�e,�R�bυ4,o��:���}�e9�j�W#�0��#7!q��f��׺����m��A���� l�+�J7��;�ujw�a3��]�t��3Z�|�+�T7>n�K߫�R�	��D^\q�5k�TWW_�ݧ�J�l�C?�8�o�LI��K�:��l/m�*�꠺kB����f�l͞������NT�P�p3y\A�ߠªG�i'�U�Jg��֜�:��W	�)����V%��rz�տ�u�,��U�d2�.^
���`p/n��|F�
&wMF�kf�&�ds߆�tmT�1��`s���Om�	2ec�5�(U����G\�P�-���,̒����U_%g�����M�Hf�)���"D���*g�M#K�yǩ�c��;����f,nl`�p�o\�$��L��Z"���@����[̻vO��-3k���"�M	Rb�BOcX��^��@�{--6c��ʙjl��#�?`��,���#d��=�U���t�[���1􃋌2ٟ-�#�0U���s���Ec^��A*S+w
�9�EGs�?�Bs�B�eSt�H=1�,�!t���Ѧ���	b�/�����}�6� ��{��#�;uʊx��u΋kG��X����r[����>�&@�/�N���9�P�4'H�I���O�~IR�Ӧ�z���'�&�2o�������꺣Xb`��՞�'����
����Ê=:6!
�%����Rf�k�q�4�і���,{[.+z�[i�P�X�s?X�m�"
$($�TeT�M�zoO�p6��C�����(�R�ˎ=�������V��^�6�E����Ճvd���>�hˀ�lÍL�|��dz�eS�5)�Q	��[/����\�t��\ 넴ȅ����X�'@���=�WCޣB�$��5�A�K�E�²44�;����+"�ޞgY��F����ލ�<�t)�wN8���TiP�>8B���;���(��Cd����b���\'����
��-:�sܽE�����v����*q��<��T�q��;�L�^G�;��-$���4�-N5�R*DYO%���&sG�R3�a�Wn��*���!
Lg�)i�G��ޫ.z`O�
 �^!\u
���?~��y�i�\�iv;��Q��*W�3�Q����Ѝ��G���C��o��f�
bT�K'x&hz�Q"�m���0t�@�7)���yPo�1�k#��r���PnF��a�#Tl�G�LаW�q�[������}Z3?�fȤ�y��i;y��Cv�n���4��C#Yd**�ΈN�]���/�Z/|?7Ƣ���c�V󺸘����	:!�y�r�$���fFAdC	���<ֲ�&�HxĜ!/��	��h0��\�ļ4	��s�n0/��8G�������Ǵ��,�&p���:����48�o`��%��F�zL{C�?g�j�#>$]
q㏌�󇧇�����c�8�C�A��0�@��=v���1�X5E�u$Z����PStL�8<�#��1N�.Ï�����c�ۖC���g����3'�3v��b6O�-I2_�Ej����8}������{��n�~W�̮����PK/WUWm}��!pip/_vendor/rich/__main__.py�Y�o��οbs	��|>��e�X���P`Ǯ��$Ⲽ[�k�+w{�� @d�m��h���"N��I��i
4���6FR�ȿЙ�{�����i�������7�K�A$��AO�Wc4Q��=Fҹ0
l��5�r�CӺ�|'�ۣ̈����'0�2���`!�.+H���.��ÓA���$4�e`e�ls�l|�ʼn+���ю�����"rF�$������#&�$��$GHc6DA�."��.8XD8���)�h�@�e��8XD�vs57��h�.�c�˧��N����IJ��JiY�\�������·�rj��d��$�Z�j'7��;�$����+Ym��nA��"`�sG�j�7"]`Y&3�3�.P��-r��8V�d	&֚3�Q� C��[����9r!�+���A\��̕9�m�O�}/�/Z+��*��a&zY�G-к���fO��iV�"!�\H��o/2��u�`׵on��*�u)�+�72���w�*�"�t���f��i��Zs�#�a)�����N"����������Gw�%X,,�F�.���S5M{�	BAllD���My ODxa�O�>�H0 FA��*E���*��0�R�����Ŝ!�nF	k��B�i��3�%�&��v�׵g�:X��qDC)� W�X��`�������[s�����
��ԕ��VeG�'��t_|f�3l7���}��qi6ck�(�s�4Gm!7Si�YWI��B%���7��![r�È1�w�x��Ewk���k��n�z��ڣC�6�T��S�w]0f�p�	s�`�;E�e�aˇ����&"�[v�
�R�X��r�faѬP��̚�@@Cj�*֌���R�r5��R̜u]B���؃��Z��?ؗA���\P��=����a!�D`��O���ﰞ�#�D�#�14��r"���-@�NO�+�V1l�y�����#��la@=&l1[ ����6�5a.&�y��������!1
9�
'"���hJU0]Z �Jc�&62^C�qƠ����BS�p���4����pSb7�492�ff܍͇.)J`㲁(�F�V
��<u�Rip$[ć�һ0Q��$�[�H,#ʢ�FY���o`�BUalj�R��]	"� Dl�L�R�l)LB۩�M�@FMI�[�1�H�wz�`@��%K�<i�1�T��i��׋����4��b��X���]�1[� _���A[�SV�Z�UY�����ڇ���K��쳠O��v8 ��9��}z�*ö'!6�e��\:��?��~����ۿ�s��/����������n��cx�����)<�[w~�����R���:�~{��?��}b����}���k{(�����G��{��zz�����oL��=���t���=�?�d���t�ӽ?���Y;^����$ރ���7>�s�ɝ�7�%n���_}���P�;��]x$�y��-�@��޼��ͻ�#��ڃ~��O�z���UxV	f�]�2�J�Va�0[R�c�sɴ�{��8Px��2��$o-�{򼒧aZ�+�HBHQU��*�h%�����0�ֶC�O%�>�~�aGQf��hN$P��8�]�zA�V���#-��6V�4�-���b�2���|HNPH�ڭ�
�[���.���-+9���9�땣��)Hb�&v��p8g)~d?u)
(��?���\9_S�HW���|�ғ?�9J�da��8p����U���9f�6�f�+�3e��4"Wh��9b�2���6v&c��`A/h�h��+++��̟��V���j��~�R���R��e�������r��*�SMM�3'��j�8qr�Gi�fj)��暉<����ue��4�y��V���Rm��Չ��z�q���)���fk�1�sf�/��`�uD��$�����>�D��D�5ߌ-c��f��<i�Z[�x
�$^�A��|~�tӞ|��myh��Y.�N�F!�!�օ*�[�=�z����� ��^~���I܆�ID 9s1��7Y�UD�*?�K��A3����M��Z�k<HbE�>v�%	��l�Ub*�z�r�*)Qp�(�)��eL�VU^�X�bY���*�@�DݪZX_)|>
B��w�0['!*ssz�K4q�Y1�T�9��.�<����yT��d i�T��K�p�^iš۠���Lm{ϔ��Ï��Nw�غ�p����++�7�q��N�ɮ��d��PYÉ�	��7,u���;�_X��cu��[/����Y ��/uY�ۍNj;��F�Uy�=B��K��,u�mY�5��s�ӈ��)sC٣M�!KKeKKYR�~xz	������C^N���<�E��.�N�4��>�Q���B#�Z�5rlf�F�U����qr�{����t6qL����l5?N�Ni�!�"�:.���>�w��	6Bʀ_=�48޷��c�E��3��ܷ,p�8d.zЦ����2�U��t���b=�
Q<\����g�����*�U�[�iU�}�r��͈ȘF��=RHCI�\��Ko�56en��fO��ud�� N뾣�UA�z�TЂ�e�}}�b��_6@�R�W�䞈�AT>۳/KM��M�b!��h�R�ϫ^L��Q�oj�ŬC�fvA��'8�37���.�l����.t��Z�9���F׎���H��c!��-Q��J����;dD��H�0�,/��H�& Ѳȹz��V���NFT��E'_6����d�x�z���X����ކ�*r��Q22	����$1��סVȟ=8��.�>ٖ���X#�c}B�*{��fa0����x�]�]���r�V�ǡA��͉����׺�*�3�~��J�ܖ2��D��ȄU&���勿x���窋���v���?Fu��?�a��;�lC��E��P~��/�8��.�Β���f.�S��PK/WUW�À7
p' pip/_vendor/rich/_cell_widths.py]�M˦9���+p��J�+�p!*(�N��H�2�:��-2��:��7'CO��;ߩT�y��?��O�}����O_�����ۏ������滏���o��������?�{���~�Շ?��7��^�|���+��iy�¿���d}����돠�W�~2[��k����9�\]����%%�U@Ӓ�	��Eh
�Pꜳ����pU4��4���|�6cB.�hȖtɖ����1�7�>�<�@ɽ�!��K��`�[�S�C!Z���V��Bt)Y;Z���|k��ִ�Ɔz9G�:"�	�P�:���
��Q��(ҥ�;`W�,�M!�9�y"�2��1�S�R�X���h��j���P���R?�,�e��`�!]Z�a.]����\���%ùHy����i
�-�|MBٟ���]1!�N�F�%�7R��	e�6��޲�66v�7�%��${�t��N�#���<`��< �#�	��Y����
>�c(\�.�R�TaBJ�ƞ�Xǔ'�] �<�"4��Yj.��
0�@썐��%)2J�N�����'dȦ�<�)O�.͡�3O�LJ���u��mؗ�0r�y�+��~�;�6�Y�,��pun��;���*i�2!��s,�̛��v�q5��:'����HF�a������
�5t{n�Qg�~�ԒXܡ{~TL]�)V.�9��`�G�
��R��%e�D�M �I�;��1�ۏ��y��O�5rĤM��90�9K�������!] >ia�S������Ky@�U��-ڄ��⊋�|�W^ȡ

���R���K�Z[J.8E)ߠ�<�Ԇl��Ԓ3K��:�q	c�M�d�i�6'd�]��u�%�M�<!V��P/�G;���l�J���"F�
"d�`���l��Z�"g�xǥ<� �J:����*'�x�CJ������R���.�"���_�x��G6���E(���[��$<;�uH�r�5�����n�!^�v��]��iI�`�I�N�Pg�v�~B��R>���O�Y�F�v@��4BSc���CB
t,D�-�
�&uz'�< B��Oy@cI�
;aW�	�K8A)O�:"g?��|�u����{��]��b�\�AiOj6Y�&+V�Qo�2�Z���ub��Gx�)dzF�o|��Pi�C���B�M'�o4�o86>f��!É(9��9�ֵ���i@ɃB��,Z��F�+s��`�V�Yz���9�U1'6bEY�H�ߦ+����vp��􆕭�b+"
nٹc�N���U腭��ق�
%�X�qAC�wج��3��zA��<�{bW����'Lu�VXw����mh������=,݋��=�C��r�"�Y��(�}%x%�&G�r\������j]�;M�aZO����ubg�k�kp��� }e�u��M2�퉕�X+��>V녳t���J�m+��I\�X�T�w⭘M�:1v՜zY��^o1�	�4��To����J�
#���l��(Ci�2�@�f-KJW�#T�pKܫ�KrMzt����4Jk�\>�
h�u�ш�ąW �����

�]xˆ�4���-ҞX���N��'�=	%!��
�R���5�<x�nDž��t8��P��y�����{��)�Xڻ���A���8��F��u(�L�^���P�Gz&?�<ŽR�_x%^މ% )��t+Z���zԉ�M^�J�k��#�PK�j��x�X[(�{��U;h�M�8ĉ۸�J|U2�o��"r���ěQb*��X����-�Ha��ˬ�oa�9����L<wƫ�k%6C�(+��u�Ψ�I@WBg�޵t,�5��H|�Έ�_��%u��x>���+K���s�k%�d*��u�XJ�<��:ŭbmC�p�%�T����;�nb�"=�i�3j(^Yzi���U��J���oJ7r˵l��lO�Y�Ժ-G�?� m�e�Z���O�w�t�O�[�~�Xֲ8�v9�H���RV�G�{bW�C��<�P�žX+�m���y�jq]"��ç��E�[={ԉ����JBI�>*�Qgi�CP�F0,t���[�^�W��=3�<V�Y�h���8 �n����/|<�^���&N���JSK�'�P�+ڮ��w��K��݁�Z2@�:_3��'���ZV(H���`��пohϟ(<Z2�u�A�|���ۓo%���3m7/:��:�?bR�;�J�#���{G��7�|����"Ld��g�f�N���
/�L}>��iO}ftc�Rk�e�0a�y�~��0Z~���F�u����W�~��WF� ���W�%گ�-w��7��'%���g���1kf���5���d\����0��qgp3l����(O@UG�{����ǝ�U��W���P{��z]�dF��f�}?wmI<U��q��yúڰ�
:��1��k�6��[�3c>mܳ���}*kׅ��۟����WF�E���4���q����T��5����W+��/�_i�O(g#
�*K��v�5�s��4�>�F��u��_���<�^�/a�_�PK/WUW.�,q�# pip/_vendor/rich/_emoji_codes.py���r9�(��_1g�llfl�V�=�ݳf���fk��o�,,2�bdDV\H%�Ew�$�I�7]�J$S�F��H�٩?a��',�D𔙪T�K �������������������f�8���������'�����?D=|G���P���x�<����N�=/��ٿ�X��5V6��`��+S�n'��V#�C?
�̗����
;�#�;
X�AG��_5h�!]?�Rc����$��#
�C>"H��5�2?�f���	A�A�{��u����0�K��c�'A�
�κnN��G��3&	�@ۈ�2{�����vY�|��4��A8�4N�f���@�E��Y��������O�x��n�h�C������<�c�A�D�
@� �{,"�@y{1f����B.D��@� !�s
�����C����e�G�3�a�L��;q���#�R�\�,�g�x4J�^���`�,�L�4B��!�|H����^�'f�e��Kxs�L$�k�Òb6H��K%�ox�t�<b��
�Á��<��2�~#��ygHO�n(US��5
��
HO�?��=ݕ�X��`Ŋf�ln�|���H	H2��5���˒�<܃�1�fY�c��7�3N��
~c�#-bW!��)6u]2���ni��~i�6�;a�E�y�\չҎ�����W�����0�O|��$|!����p�sV��&�/���c�dU;*X��t����S4�׊������~�(Nb,aЙ��a�%OL�y�K�e�O�t�+GH�g��8_��ֽgx�w���t�_ X��ᅤ�'�oS?F0m��1��g�N�3>�������>f��_�	f� ����Ǣ��� _B��^���ǭH��5�{�n���
�ţ ��1R����Af�Ë�ts�D%hBh�a��8C�Ur�(�Et'x�3�&*�]����~����ß��������cu�?�5K��p����]��)I����j|.ṭ���|*��Tn��xl��2��$[�G���ϱ����5
���ጐCE�_`��I�=n��r���@{������DXk��:u�B��.��VR"��p�T��I��r�
k��������%��ہ��K��&4�\7�Bc̗o��@	_)&H�44�^)�i!w�PKp�UK�%���`�����%�%�~�g�0�ǘ�1��P�WԞ��b�_ȥ��	��Xe�|0!�:A��9B8��)2m�~���+ܓ!����^�aU�_��Q�f��`oF�+���������z�\�Ԁ.C�&|���$|@�ς�x@�D;ί���Q�'h�v@�(���728�p�A���b�W�e�����
�v���l}7Y�<��e��M�i��9󕆯��C��wNj�|4��'��j
�맙r/V��\/?���)��[5�^�v�<�̾}���a(uqy�-�;���k��ͭa�Z
gG�0�x��޻�5�(�f}�{OL�c3s��S���k�׏��r���&����O9��Ыp�XG���K?Pft�i'��A'Ș9iOa&�_�l��#)�&,3Tc�@Jfy�H1]�cO�n+,��1br��|[�%�J���,k���q��s�
^�g�yf�bZo�C:â	�j�3�c��X��k�L�Ƴ�)>�vu&����5af�&�n��&���^�L��;� ���G�+�)��r�_��4Ά1B�&&:(r���P��%�e�6�������Ei�ܫ׀�
s?|��m�_a\I�d��z���R��=e��z�=}�Ge�=���v����^8s��b�$5x~G�^0����xl8�{��3�����ʪ�{['�.ݏ9C�O͹��lB�3Fҝ�Y��~7�Ů��(��I����+�({�,���"�`�Aqh���u�
L�C�I�K��4���'4/<hS��6���w^7��?�!^�oU����=n��B�ƚ`�`����������4��Z�Htp��r��¿"y�Q�؜�:�א�	x��(��<6��>�g��t����g��^�
3�+�@�g>�1?`u���	|
��Z�
�s`|�%���}�2��~ΘQ+��adC���N��!�ʑ��F>aV0�?A�&5�1m��ck��frF�-��0I--P�UQs� �n!�┦ q�,���f���4�q>}���G<q��0ȻCyڴ�۱1����>�;�k�zSz�3`�XA|*�p�-&���A2�}OLc{|��z\Β	�i	�Y�;�g	���
'���7�[u���Y��jx���M�cl
�|��mH��7�E�XRc��Gb��t1�z�Ɠ)��Ԁ��Χ_��=b�oG8f�,���aM|sr{[C�A�e�Xs p4{�5!�K#)A�`�M�A+^!�o � ,��c�3�@�F�;CA��Ad�ԩ���?����aU;�*·��8���
j�چ{��Gݦ�����{S�/i�>����JCa�٤;da���	^ �@8Y�_�_��<�|ba�K̸.q/�E���8cH�-��c����X&�Z�2�:*?�����/	��1^\N�.C�|+����ї�(�����9�ZO�1��?7I��o��m�)��e�ߎB6Rxj�G�#�",�W:ÍD�j�f|��#�y���=�r����:Z�D�S8�a����q6���$�,��hu�f~���"lSlf3���@�*R>7m��+Ь��Re/Vpb譎��s�V��3�s�g������[��g�@LCa����4��g����8��U�
��U,���+%�P;�Y<6��G�sZH_�2������>o�G����3��˵F�cʆ>�����o�.	?�!�;� F�/�}������y�)�|~�o�nk��q�z��,��7� $!��y�<bF�xd|�N
�|P2�"Y�7p��/T�{S��=��ڴ>_��r��X"z���}���4Y|�+�>������7t���W��|��ψ�@��̸�D4S��|O�'�!�?��Ń^�O~���v�o}�`��0�6�\}�'���|�ÌY�k�l�ӑ�Y?ʹ�B��
��8��ʂp-��yn0}��
X��o�W�!�ǒj����m@[�����P�~ε���ωi��{�C_�{����������<>�+V�`��;s��]��*�t
�{C���L�k�@R�
��(H��w|8fX�\�'���2�4]3IOw��=��t<�o&�û-п��v��>��O�W���@��/$cn
��w��b�	f�����1�]�fM~z]6��w��nq�|n�rצS��8�݂�@��ڙ�(���I �l��C8�߅�T7V�q�u�bˉ�n4�J�W��e���9�w7�q�yR���`����?�!���L��_R�Cn���I%]}��X��E��6Э�+A�79�M��6�{v]q�ȿƉ:B����4%T^�k���j��J,wl���ۼܐϤC_�.{_1pw�3��q����F���|�lj[�[�>�6O����:�w��9���p�)����:ų�Nc��,��Sl
�N���%�Swt奭�}B��SMBt�?�d�ʧ�T��T��E�j��3z����� �+�8�m�׋�qZh�K�l��������,�./�2n�b�L+���d��A�҆��i�K�N���o��F��K�w�s�w�Q�
ɠQ�$��2-��ڈ����Omd_2p	��6�7�ػ�(}̇��(�|,�o7c҂��F����H�S�D~��ȁ��#���LHr,l��;@�CO���ZG��B_Aa�;q�5x��3r�ws�Ky����Z��^*�6K�	�$��{���֞���?�Ыa�Y����;/�jy����;Fs�=�+�{Y���|�au�Ln��'��+�Q�e��=���O��j�{$�O�.�]�p_}+gu>ej'p���2�;D�k�j����U�H�C�d�,��A�����Ez����H���a)�|�A?�Xy�PFB��#?
���M�`m_C�	r�W�a@���c��j0��4��n�$�w����0)\;�M�P�t��:	I�3DR�q{W��:&'��
4q����hS�������z�y����R87�0ny��߁zl�%��h�T���z��;(���H�-<�Xz^ח���W��C�K���O�=��X=Dmٰ��?�����`'��A�Uv�	ꇾ��G���	
���x�Yr}�g"H}IG�:ƒ���851��SFE����+� n�x�qԻ4�a;�����;��dņK/���<mEN����[+z�b/�|�{gN/��dp��[ŵw��]TI��܂�!�fjZ�$�0��^�	��n��
Zhp��:܎O-n�ȭ�i�NL���ά�#�b�����m�<sul��c@�����Y]�Y݂����a!ѿ����g����j����\�@ո�"�U���X�Hx�Xq^�	�?��[_��9�7�	���sjEk��)���u<�J�d@\��$��*f��h	�6'���
��m��M��m��
����C�f@ڀ��ШwBK�qc�]�3�U�q�
���f�$�oԚ٤p]�5�1Ig�੓�$A��Q�)�MГ:?�Tʀ��0�^oMٙ�>�5�g����)=���S7%I��Ƿ���q�N�B`���͢4�@m�ߣV�K�Ӄ�Mqm]�$88D�3,2��&�)�>���"�T?�7a���	2�5�� '�*��y�Js�Y�w3}uqz^�
2�Ի�V\J�"�؈:��]DM^��rﱻ��3�^�Q�Ok�#%Q%Ӈ��;fk_�<D����"��C�Ԃ�q�=C���w(m�v�3�ic��'���M;xvQT���:�HH��TXl�nTǬ���r�ak�q��zX��QOM��op�ԥ��1G�q��m�OQ��Q���c!�Xo�0�E�Qvt��z�,7F�Xv�:B���XY��t�g_FJe�W0Q�$�D2G����;ԄC��r2n9Rq��rE��Иsɤ�D�C_���F��n���jL2�'^(��፟LxU�wl�c�^�:�|��c�9�S�C�W�{~�F�k�����u�}��	���7��d��'�E�Zg`��a���&jV���H���
�R�с�uÒ���ܺaB0���)�Ob��	_�I�€�"��Q�B����|e���a��8N��9��$O��RSu̦���]0"A��+�eȐS,��l6��v��eL]�XF_�&��$�m��H/O��\��&�P����Q���ĆK*��KX�4���

��C�L�)[1�ˤp��+���t��:	I�3D�Ս�q�rz���F������*��1̔�8���c4B�p�+QsAZ�ʊ^�M�a�BL�{oػ߯�F~ꓖPܑ5���s>w�R�E�<�XD?-�ex���&;"�,�B]<r��m�M���!p��\��4R;��g�]_X��H��Ҽ|�}���g]q�%{��/Vwc��N��;�qa��/U�Acm�Q�/�.J��T� R킯#6�2nq�}��uG��ps��^�
B��Y
8J	}^B��Q<8[���q��[`08OM�}��.v�̛��}���6c�
3FPѦ�a�2�A�l4;��ӧ��$�(K�Л�b1[�C@���͙~�v��>n�NY���A�j5�L_��o�x�/����,�s����um��F\�>�f��]#���*Ї��kV��Ԡzr~�h��NV�	��3;��V��/ʀ8���@�m�5j�^=n������F#�e ��*j�(�>X�V�e���+�J�=#�\_&)n[ˏlU���~���H�
eO�(V�"��ͤ<��U�~���?Z����?Z6��"�:�����w�
�R���ԏ
kR!q����&���MIҜ�h�c�,�b�r�T��绛�oI�4L�w*�nt��0��@i&|4�m���]���J�΢��P�t�D]?>�hRܯHA$�(����3 ��\��Cc�7sL\�̕ѱ��o@d��x�
�Gjc��)��n��9���K�qs<�c�~g������0Hn����%�}�j�h��ӫ%Ԙ�O�EX����y_e@ݠ����)t�@��Eh�`O<��J�gw����H3�B"J�J�A7��� ꔩg��jd}Xy��3����=x�b������Q�����@�VGv��仕��S
���O/�G1��C?���y�{=[�0F��p 	��R;-CV� ��Gq���W�lq6�+z�L|��<������F#���7��U|�j�+?j�[�D���>��b�#�x�6P��*o��shˊ�t��KJ"�Δ����"9^�P���f�˦̎�W쫧k0Ի��#h�s�.��E���\��)�� ��1^.`���Z��l`�9n>+�(�l�T��Of+1�V�(�ق�8ͥp��&�IJ��	��({
�*}��^{�ކ��έt�7�B�γK"� [���?P.��-hT[�먉ު]�6L`����z	4�V�:�[����M�a<�jP���Ҏ���"/��Am�ěī:5'�1��ڜ<��DH���������'�����̋ϯ��{�u�]�9��ó�����Cu������!�c�F�|j����:ɚþ���PdhVطD������G�f���i������0.����6�%��lh�)�5W��
��"y/v��Ub���I�h�����D���8�{�:6}���r�P���1Q�j*��nj��]������SpzM�����S�,�fe���
�ԟ���g��Lq*U����k������GA�[^��d��_��\&G�_�\���G���XB�D����V�v�t��P�JE�&z.#�\�����<�4��ܬcq+揼~��(V>��>�X��K�����:&q�y���d$���K�_'��h���m�����>!�ѱ�F5P��]��6l�ذ�x���Ŧ�Dt�]l�t;�S
��<����ۨ9�j�}�\��uyc��Z��*�ހå:��uR
�$��L-�$�i#�G����r�\rh+�T��qʨ���k+�2K���uM�Dۂ��Zt�*ã�2Dl�:a�NU�v�Q2k#����!��F�$�~����J{�8��$����_��)���L�I��ga��59�4��ppSf`<70��z�>)Drj�\m蠒��y��RpiDa
���[)n��ܐ�Un�+$}��J����
�vG%�ZY�����9�����aO�*�H�O�H9Yˏ
�8�ŶN��6`q�u}6p�ǮϵHY��W������#��3�6h��c�8�T=��|�����Z�7m�1�-�GO"���ɚ
�h}]:�8�G�Ǥ�O6�����Tۺ긠8R���dz�����A���P{:���!��xe����/�w��	�C�"��]6�2_NI�s���v��X|�	nhA��If�ܩ�������ߖ@��kD}Oy����U�0�ü��oA'jr��Z��R?�ɳ��{}^|��R�a��÷� ;)���c�2�I9�7�|Ǩ���(*��Nd$�i�
?�1�ͫ�`k0��1*.(�DA_��}��򑑸�(�G�,�D��4qFB\t�W��W�������%��y�AŖI$ۚU�tՀWM��
��Cr/��7�����BY���n�Bxc��$P#K�iO�C����w�;w�tDm.�A�s��l�,A0�9�q^��|.��a��_�U�@#&�0���.���b�^�!P��Ot���^�2lt��M#|0���H���}0�S��EOP�}�͇�Y�iS�F��Dht(}�MC��
�O�I��v�:�����Wi�T��=���w�X^�`�QN=Y�`���R�wq��-��]‰��LT�KQ�U}z���%�}�:W^eP��E=11�P�C�B�*B��N�
נ_yt���o�@=�C�������3����cm<�U��Ea-eSWL�
�eB��Q��0|Al��~���T8O���7l��B�K�"���W+�5��I��Jef���sÁJ|����ު�qy�|<����TM< ��]7iG�a�
<�#�n����x^7�F��?��IL�1�x���_#����Z�"�e���,m"�~8���l-��\D�aυ�s�2.]Ο�8A��4�9��
u�,.�ʔ�`����x<�� �ߚ��^��ޚ���my��g���?���P�o���[lW�פ�ZqP4�O-O �ŗجx=G:�پ˛�=֍�l�?1�p]�TO*׷	�(��9?B��2*>�4��vN��W�`oU0��1
ο��D(;��26���Xe�����}���ūVݍpf���R��
�84X�/�l���g��A��5�$��"L���w����Wh/�@Uᶫx���\���w�71ܛ��L�C�Cv�aP>��{��dA�˽���R��7��q��#��C�
u@�>.�ʸ��G����:�^���<�q�y�E�F�Xv�:y\�h4b�X�$�wP�V(iW��:ioV�l���ҭ�?)*��Nd$س8�J���y*�U����Az�\|���s�c�>f�]����!���d%�g���+����ņ�'��^ݓ+H���Fci�"E�zU����ҹ����ʅ0�my�+����X��š4H���EM^qwAΞg`���1$�����=TGX</�SJRl��#�����_�o?�‰I���j�벤�f��N���{#����M��q�B�8�A���	Z�n~�8�<Q;X��t���>�"��
c�
)3!�l"E�%}��_M���!��6nw�R|I܃c�fݲ��\fz/��W�� U��z�v9և7V�qR�
�K�Ό�w���=hU�c��3Sψ�5Ԥ_{��CD����?�������O+��#A?�$��{��ۓ
���$��$����I����?	ПHП��$�/���P ��u�s���P58W�������]�p[��a��o�$�J/Ua���m��b���1��*��(�L�Z�F!�];2P�l�Ka��o�z�*�����^?�յ���ľ
8�j��~ǃ׺��]��P�/�2I�%h�Mīo�dc�1��'�Pѹ��-2�ɷ
�7~61�N��+8��>�ܲ"��C+�Ɖ7Ts.�w!�r+�E[%��"_���8�~.�h��IB1l�7֡��#��@E���lp��^�k$�=���h\���o���$:3�j�61�k�U�7�F2����
�0/WK�i� ��n�\cj7zM#��K��1����mh�^���������J(sj�*u�/&$�ov�D%	���m�E����� �����IX�	�bR��	"R�EE��=���.�z��aw���!�p+��n��&��U
�O7W8��l�:@B�cU&��W�^�)p���G�p�՟n��\}|�m�
�Yvi�ހ�p�������TI���0U�xb�����
�$�&��V�Ȁ����T��˜�S�=
+#���g#��m�c#�Y�F_6�x���F�2�mg~J���gQ��M��֠?�\�,�I����R.������˱��"��]�	���Ю�Q�T���p���p��jQ���iq1'���|��]'浐ѧ���u$,�������9Ixf!L�$���&�ݫ$Zq�([H�F�Z�
Z���-Z��HO��~}��v)�ݏ��?G��O*(����!Ԃ�Ly^��w�Lv^c@��i���y$o�Ȓ{_��
��}q�� ��]�]��=�Vp�˛�b�]���C�sZ�w�X�e����
]P:�<נ��C�sM
]0p�v��U�]n�����r�
.�<��l��>݉K��˩<q	��b�U���]�a0�h�O���hwq�)pEJ{y[Na+Z�[��t���v!�,Hb���)�.@�H�v.��haӘ"���#e�Ź�)��|ԕ3p��;�h��D-�=����g�m��Y���I��#8
����ym��;L��S�|57����m���oֈ�:�S��g&�MQ�jB ��&GP3�#gP3qc��,9���s٨QB	�#���ʑp�E֘���#!E35���F'"Jc?�{v����]"�Դ?t�-&w�f�.L�]���΅�w�\$0}�>Af�:n���I�b�rҷ^��pi���`�^ѪP���S7���܄��Z�;R=���S?�)�Q]��qZ�-I�B_I��z�n��r�^V������҄���6�J+m�P���}���E�pe����I-��ɰŒU��s42Ҳ�4���,9퀢u�y������	�50Y��V�`�k�#�4�	u�g�V\z4n�F� ��q�5"�kTn�F��b�ud6$��(jS�s�
.-���o�(�-��2\Z�a�\�i!x�6�`�|V�*�E����`��ӯ����*��3�\e�zy�=[ٻ��ɣq(F~��c�u�40��h�	&�w7L��k(���ޥơ09�<�C�}xl�舑HL��ŢS���~�蔺$u=�XtJ�d`�]���.]�*Ӊ�x��s��t6��lE�x�ن����s�PR#v��]ȍ~z}���Ġ��ޒM��ގ��o�sě�,O�q��q�m����viy����vi|��k����~++{��3�Ƌ�b�AqE>��2[*�J)�U)�L<�w�D��"���C%V8:���q�0�-�
��9�F�AÈ|�r
w���5�⩰�� �!�n,�\�c�̄ �O>V��J׉���ɑ��ށ�z�H��t��+�'7��$��"��tL����$pԏ	��d��U�dБ�x.�(��*�Y �Xei��+M�zUu��XM]��U�N9�k8_lS]��z�P�Ii�p^&Ӵ.mt^$�r�w�j)+,Hb���~1�犤��U�=�֦BAoq�$^�@�3�_e����s�����%�0МH�ѰNm�����X5\�w�9��;��۷�v\�oANZ�=b���ʌ����jq~a!lqxa�l}r�oql�d�>���6t�@v�Mw�S�
���V50����{-U�
l��*�]p�#{����D�N1Q�V<�%/��ZQ[L6u��"o=�Z0i1����'�I?¸�x��ʸH�>�������A���>�����)e�2M���o�U|�'��2'5�[��eOj<\>�w�A�q�w�jQ,�H&V�����P}�j/z
zP��
bBK�Ͱ .��9k30u^��5M���.�8ƫ�a��n�M����A1І�s@L.��9${��A1"Y8!�p��r}Z��{nx�y�M���C�ycȫ��p�y�Vъ�SʂI�{mpi!;��9�3��d��%n���b�U���]�僮�N����*��?u�Q�N�S���ˇ�z���+v�׸��v��\>[�рFG�n8E-)�p�
��%�+�s�)b���v�HZ�h�n�"��K�M�B�&�`!m}p3h~prh�?��ä�e(���6�H;��m@K�Z�gl@�r����j,�ݰ�o�Im�� �w��u�6�(�6�(��Z�n��N���
a��XTϜ�A �%I�F�$a{a���H�A� N�2O�%��V�-��E�s�KJzŸ��Եh�tN{����Iop i�S~.�����Mx�p�:��H�v�)]E��]�x+읰��dA[�1�;$�W� ��<�"�ڼ�"	�?�r��yC�w��*ew�a< ���o6�6�g;q�����}ܹ�G��s����I����x��U�.}���H���k.Caл�v^s���3V�A�!X�Ƭ?�"�ӽ4�Lx�%nEI���$�H]'�{.!Wػ`��Ɂ���v���4:���%ZEIo�?�D�H]1�O.�Vػ`�Ɂ�������,O::�܇vش����ɀ6���69�,���I>�٥O1"Y��H��EB��f^���75�nmʠ���{=V�^�	X#�"�9�\�"�������9Ih�O��G���etTy�� <c�8`�����!PW����WwR\y�1�Ƣl�e����8dE���t
 I�o�^���=�Qٶ���ψ��W$}UbZz���I�Vr;�N@!/0(*���}|T�h�)B�M�4��l<�69�<�&��*�rz��]b�'4��ėձ�/��b�����%#?�����z��Z��k�Cl/)*z�}��$E�Z�b�� ������;��EU	^�a� A�B~Uk��i[H�J�^�l̒T�lyX8�V�uH���($+�C66Z$��%�L��dߣ��WU���ь������Kՠ�v�뉲�(��>	����7�m�(���dߝd�ϝ��H
�"�E:U�i���L���*X/ 
:��׮Nm>��@�} 3��>�u�'����W��m����KE�`�/{̀{�F�[P0G}���	����f+.*v�@1Jy�^\VU�^�ـ'�]�����˨�鏹$��h��*x�ڳ8A�{&�,�rl�]�ueɀ��Ы-��e<q��痕^|3 ����j3�V'd����5!g�?Fp]�шGCT��5H��!�=�L�X!���������pq!N��
�b��-S0U��S��M�)�A��fn����f4�*�ä���"@t��{�����V���C���#��:�S��g�?b��WF{�"��Ǿ*���\�̨Ӷ�+@���Gy��Ճ�Xw&S���MhN^�EIj\�a`s���Z���E��(�!�[\�����/e�Q_��e�1�V�^v�b��F- �EY���|o5��< ����2!Yn#�X=�Ǘ��q�����!�Y�o4(߽�A�Q�BY �8�$j_rSU���A�������0&�@���7��&�\���4C�v�:���.T�{��^*��M;˭k<�u:ϊ�	|頻3�
q7����XՅ/b]�qIOHy��E�9�<P�tM��ۑ^�K���a��l=��z���L���Va�c`�yU��16�V�8�)H�3��+����?������qU�>�C�U$�Ϝ�hHl,Q���+M�n z�Q�Ʀ�Waht�>n�"�*��S�v*D"g�}��U%Q?���LK�]C���R
5���@Z��r6�i}�kH� p��]C���s�.:��F!�<wU5���J�_�.���Ke8T���t��;�a,���¯2vh��o�E�R/@_��B�$��DžsV�z��J��
�4=�v��Q��Nc�Щ��D?3�G���{�5���*<�Pmp7^ٱ�Eb�% g�F���������o��r����
���.�
,����Ze �=�s��B}�Ch̳J�c��sr�~&��0@�&���.�7掳~H�q̓b�)�\.�x6n���#O�7n`��'�DY'���"@��U�b��GHEe�,�L߈�oE��p�Lu�Τq�T'r]�4����Ϟ6ђTg@���2�Q{���Y�P�2�D="<|�Z�{�R�~��Gn5�v��L�A����?�b����������Cա=:�SGZȒX���u��	��h�%�Uz�U"&Jɢ����$vi
7���p5s�_��!j�XZ�6i�EM]p��&�:���:Eͩ�|��&�bqJGTj����G�oӵ
��X��U=�x"�
_)Q�X~��)�-����?��Z��:
s���c�b��T����SIqV� jm�P��T�O�e��dV��jZm����	�m�.�E��h|�=�)�vu��d��Յ�X�BA�r�8j^���%���*\� ��*����t�2V��z�����nQbk]����ɚ��T����<��
"G��K�	�]�LG#1IVCՎ��V�����#c��‘(�F�wK�8ۧ�wS�4UAR��(���.*G6w�Kt��]0w{35Ig!djw�8���y�]d.�v��U�fj��.B2�ˑj��Бa���u"J9/ϧފIjj%{�ˑ4��Б+���%TZG/����&T3:
u�>�8R�[(\�)��Np�$$I�B�&/Q�UeTI�Q"��d��(	I���(�d��U�cБ�x��Mx��؍��l؍�.Gz��s_�dA&RP;����t���nB�P�B�Xz�6�$eU��L��#��‘w�F�ڝP��d�uS�4UQ�D8|0]��-)g�X�4�
���
����!��mŀ$��ܒ�ҍ�Ht�@��o�@銭B�x6�VHҪPm���	��(y��H]6�;!���~�8��6��s�5":R�5�:2�5�D|�����ARפg&�����oG�7�k�L��u�7'!IR��́����r$ps��G-BL��LM��DXO�f�p�ds9R�9�\��SJ|J��HL�Մg�Y����jGR5���A	�u
5'!IRR-��
�H�e%q��Ҹ�τ�.�����$�	,�s��j���&��:�#YI�,.��Iɱu
$'!IR�a%���sd�p�7���u�T�dFnJ��*��/�뎯#�]�cЁ����0��J�S�B`W	���W%W'&�j�#r�8P)s\T�L9.2Wd�%����i�&�"��j���-Gb���D��}'!IR�tʼn�ȵ�s�Xq�n+�xф*m�IJ$�,	�5ci�:��8(���@��q������Q��i���U肸n��~G�׏H�*�a�
"����}��M*�����x��F/a������
pN��^�(3l��2��4S797�����%�Нo����*����|��'�s�(\m�_\�D�R�:E�i�FR*��?��+��i�#�������B�X���u�T�NB��8�{J�V�Pk�Ń���;����sH:i&?,U�)��7�To0��.�o����>��{�=�|���=��ˍ�0K&��fi��cA?��W����et�~ݙ�^�#�~�0N�	��l��d��A�G~�����۩��b��歡�&�k+��PL���S'!Ir�H�y&��&u-[������f+-G��r�H��r�钛yO���$ Q�L�T�?��Ӗ��S۳���OOݏ�N�?>mx�tR����A�IU�<��2:A�����'�&����i���?����F�P��ރ�t8V�6�-�s��7��U-�;��n��ي=�v����G���'R2+��*��7�-��#�6`~W��.:��+@�hu�Q	�����QG�aY�SiƎ�]
��(�uD��P �jׁBۀ]<(*z���YA����.� b��O��I��
�z{��.��/<�K�$�Į��������1lIT���%l�^�ң�)�{�0lZSbW��V���*�)��°�F�nCmU䲲�H飘ŪH�>	Y�J\�/�U����;uёH<�6��
4)�}��ci���Ob���o�"����B%�˂�z�5�I��8}E�I������(����q��CX4�B�	m:�0���-j�$��h)L)<���Ą���>n/�Lz�Hũ�+�1��<`H��e ���e�:�S��7'�z���D/�t�w��?P€�y~�a�QP��I�NGo�<Y9�E�Z(�5d&�u�I���\Y$��pT���B�PFK��gYbnҷ�"`�S���u��5Q�w�����?�	V�si�t�נ��%�DĄ�$_GCN���Vz�7r �i�e�ȅX'r��FND+����M�$ՙA����N��y�������?����7��ys��BY�T��G.�rr�Î
�4��XW�i��l��������cy�@�6��`�E�[M�a 7X�ث$��zl�$^��zl�+���'��C��ca��NQ�r<Va3�#��_p[��+0E(��p���Ag"�)̸��Z�"Q��gu�NY�S�~�0y��;�>/�U���+�Y����W�8סM���5;�f�q��E��@= ?x�Lbr�
�2�GJIt���M�u�<��*FuxگYF��}��Q9}
��XEa�~F�Z��c��Z^p��q�J��!���
cB>D�Be�����<�3v)�/�� �p�ʝ;��K�A{�W���f+m��S�H�@��Bb��qNa��?pJ��g��m��.��D�vg�LgYd���Հ��hÕ�|�r�GfD�`��Iz���U��;�QLS�]���}�DA�À��-�/�5�bq;"����#�.�.�T��E�Td���˃ǎ�Ҩ�-Հ]��[G�$�ԨKo
��u�����1h�#���Uh�}�m1��t��"�th���a�b��
 �;��Vz��+�4�R+�D�	d�����?{�DKR��
������0�3�H���Br��r��>�6�&D;��û�Fc�V�H$R�˼A?#�H�6�LC��3jc�ʡ�G�o��U�:��[�ڹV�JE^f	���_N���-��U�V�]�wn��U��#�	�ƣ�|͐�y�!�5�8'�SvX����P���%6Q9u��U��<�J�$_�o�^�c�����u�vkɁ�~��M� �w�9��|=
w�&3��;�4ҩ�WQ�����;"��+F
֊(����c��GY����8�LT�v�:�on]7�¦�P]7�Bw�غn�:��S�v*��C)��G7q���oߨ��s[�i��0V5`�Щ�+�~u~��3�Q������˸�+7�LŻ��j������x�*)!@2�_�PiU[�j��n���:!�4�J"�5��5p�|�|x��8�G*VCn��q��!�@��@�}��n�)��%}t��C{�.�>=��6[�9֑����~Ȣ��6*`q�=�}\�@�c��cu`��7Qc��xO�Pk�yy&����0�a���p
T
��[V��q3��s?���n�2�d�Y9P9�A/3_����Ԝ\J�$W>�I_��]Y8�-����?�Ä_.�삪�'���u�Np�!r�JS�B��c#0�ŀ�K.�k0�g��|6o��-,^�����s�$r>-�
e�87���A�~�/2�$z*B.-�U��u���q^
q��d���'�����	��G�X��P!��1�C�Q,~C��GI��:�*͞Hk��U�4�&�JU$kf>fɐ�B(�'���P/ч�$b�"�)j,r���07�tNM��͉�t/)�th�<��A�g�}�2&ʼn����!��"Qkڻ���}���m���Q_":�@���3e�\����hx�.t�[�0�X���H��#��R��W���m@�&�B�
5�$dz򜃢�v�8�t�1�Z�
f�T�����"����A�Ho���V�C����rU|g�
�H�9�GL�9a���8����sa���~�����V2?6`�_��|�I����2�����06}��x���]�k��z��S�v*����N�֖jZK�8r[m�%B����!�����!��Z:�HW�p���Zu���7F#��� #qf�4�|�=@3����P[��[ht���xg#��ܟ5�
���8�6N��#hN"��,0Lk�-ă���3�݇����ŧ��"�Z�v�FuLy��GW����)@�v�0vrV�(y�F��ɏn��8�@��e��Y��[�d�|��6f�K
��w�W`>k=Ú�<��0V��m���\o0ɴ�r�c�l�6NM`�8�<���̸�m��/0��A�s�"�4is�^b�j��0p.����T·2~��^�6�s�Aq�V.h�j*�yT8:2���<�GyjN�u��4����Q*R��]�||�0�p({�>���U{�`����[D�/oCsʕ��
�����*pmE+�+͎��ULG��*�+s�^�W��)H\ml�OV��FI\~7^"hx6�$2aw�S�*���>[�@�3㮕�M^3nZ�h�=+���S�b����6�����B.˯
HW���B��ed�]_e�\�������r�J��K�0W�x��� �lN&>]����d8�#{If�ܩ����7�39S��8�P\�l��3����<�D=�?�z~s�E�O�k�� �rfe"�N���C��&��2z���݄��j�~׀��?d�|�v��γq�c�~�q���h�n)Ad�ԩ���G2;�?�t{�v�-�_���z����ׄ�ʋ���&��G�k�u�"s,�R1�����Cqb@��ƭLʡ�R�/�w�� v��#��@ྉ���W!�Zm��M��u��Ƥ�pV����K5W��ug�W>�e"�>��y�� ����!��3
��FcȻ	�VM8�fc�Ĩu�
B2�(X�!������a�׼U��/��m��g���D���9H?�x{�H-�FQ��pi�Y~Fa�&���ⷕ�6Y��[��P
�����8mŀ$=���������
�+�-Dk�m!];qk7�h!�&n1W�ͺ(T-{��(��Hꨖ�H��}���QC�%���ALTV�O�	�uV�2��\i���*��\�����Q,��˳4�9*�4�:��4Һ�-4	�e)��,Hb���/��^Z2p�}i�ug��-���#��k*%b�1�bZ;
Ǵ�vź��޾�Lk&$�K�qT\�(���m�\r?_��v\>7���>7�����|n;;{�\cd�Grr�*!��҇:N?�$k�B�t��Gu��A���=�Z�A�TbFZI���ed�4	\�Ì��$��s�.:��JaS�
˘�=�'���n��&��?v[�&xA�@�z��ajL�]q؃*��aX�*=r"���#���=rX�V�Gn�"r��Bz��!N��Z+dG͵v��k��<�C��/V��"|Hn��O���W��W.��\�+^��k_;>-V�V���a�E�.�Nw]c��h��ۤ����ٻM/H]�e�I�{�ZHZ�~'��^/~��Z賅��[([믛���:���F$�/�X����Mx�A�&�� obmf�&��ȥ!�Z���th|s��ĎR�-�]Q��sѾ�fk&$��hX��kO����9�a;
u�d��ْ�k�n��肕</Ĉd��z}�v؎R�-8�~�����m�U-�1"Y8��ښ�Q,�=G��L\A����ū�^�ɥŰTj��&p�m��Qy�=װ4Γ��#�(/��kX�*�ΨMs��fZG��fb�S��ɷ.jږI�t�3�_o@���z��JZ��7� u)���b�.���8����fC2np�{ߍ޸h�иhf�rGКQ㮠-'�΀��*��G�F�(^{.�:�a�
7l�g������Ź�|�%���=�Y�:��i�,N�yq��NvZ##��:�֮�nk����y�4�A�\��Y�Lc9�
X�B>��ZXFe�h#mm	���nn�Gњ��]��X���"rjׁA�E��In̈́$w豥<��}m_,�=G��L\n�=�X\���Ey�\�#c��&�H��;vv#��o����u�WP:�g԰�+�c2j��1�o�
R��G���QЭ.̛S�E�J�"n�mo��"�����7t�Dw�§�T��k�;T�uY�<��
�/.\�¬��rͺ�@�s)�+Y���O�-�����|t3h=)[�i13��qO�*�q��H����(h����ٿ����o�4��
��-E[)d/5��R��w�ɩ1����n�S����������c�caF�q�Ŧ|�:�գ���t�n�Zg��q
�Y�A�s�w��0�ؑ�\B'���w@l��Q�5�{�00-�xAV$�y���r#"}R��4%-}&��$���u>��$t���Nic$�C̸������x�>�`@�܆M���%��:���!��	F$� �O�P�ҧ����ӆ!@�C��a��i���ػ���%��H����hD�#T7�.i�Ѝ�KbWD�F��M�n�Dm� �bN���G�/-�m� V�6a+q�8H�6��
��*�0�x;��iT�lxԴ���$�]�d�C�{Wz]�Bһ4;�����>��&7M�&7M�Z���mr3����F��=� Ր���F��6r�����A�:94��J�'�r�M�b���w��<HZz���`$�k���`L�n�����v���`o�V�6c҂�� hEL�Ļ
�V�.Q�mu���#.Y�LHr��E��!�:����Y����{$i��Hnm^ 99��E��;��0��7;n�ȹ��M��E�>nނK��y3���y�AP���5�@��E�knCb0�/^s�����5�A���;�0*#��ðT�6":2�6�:r�6����o��-��!�9?D祟���'��-h���"v�<>��\aa�C�&��%f��8�<��Ts����C��M�!�� {��˲h���S���X�L\"K��py�.��{-�C���Ԃ�eV��6���� '	��q�v�>��ju=|c�ǣ�~��:BE%�N����C���*U��[G����@QnWnZ����Q�<�&W6��7��
Q�]w��/+��
��$��<N�z� I(���D�[�$I3{��x3����A_e�0�:��FOd��9�D�Ȕ�F��̳m��0ЭZ_}wY?uꠢ�O�D��m�R�:��o!O�ߟ<���e�*0���	�0򸥛5�$�֍I|i"������&�L:���߼a��)|�YG�,?�1�y�ñ��(΍*R�:��9�u��,�v
yi%�-�6�c�(I��c�;���� ���/6��̻�V�8/v��nC�d����!Hu��
^TH�bEi�?��E���G+�\1����ei��Q>��]�*��O�"��*'
�uZ����*p2衧8	�F&a� ����^��Xe��B�I?�|�h�)d)…ik
y�t�Yk
��\8jM!����ҝYxњB.[/[S��c�Uk
Y�l�uk�˒�Mk
��|�mk
�,�kM!��)���5���[SH�`�5ŏ��Sk
�[�ܚB���re\�Қ"�_[S�J�o�)�$�ik
Y�
��F
�eh�{k
��.h���]�r9���F�P�V�"=�f}]�uM�ϝmT=DW���m�WԨ�"AAqQ�*H��,�6_��(˚q�s��wmh�+��p^\9fIQ/iN�ܼi���"!kݝ��e��V������#�e=��l��t�t�=���'Bm�-��G4y�}�V���jDm�@[oDYQղ�cβ��k:̳,d]]TjEϮ^��{�Z*,W%6׵�Ǫfo��y�T�Ѕ�����1��>'Ԉ\��pu9@�����.�i�^GW�ݼ��.��t'Pտw�C[w�
u�|W����R/#�Пo��t���I6�*�˺�V'�$�{�D&��e\�b?_�?�杲�֎�(���CSa{q���B��4(�@�D���ٵ���7�e!aɸ,"����SG�XymvG��|��u����j�+�Q5'��Gz�|�	�i�+G&�ׅ;���<�ƒO�/����_xc~!Q����P#Y����QY?Ch��c\�D�l�hRj�4UU�+�D�^�F��4wp���S�E>t���:S�p�(̢�jD��A�h=�/�E�i,�g��@���+���\Td��4>?��pƻc�I{��?bUr�) ��K�2��0X�@�n��%��t�%Q�k����f�(�o�~һ�n�W>?�â�M!���ն=eݤ���ڎk��6#]QTܨ��k�uC�Q��_�f�b��6T�I��|Y��(��?5�e����k��
@6����6�e������.[7����f�l�6;����u�h����l����?i�_�v�z������;F�5�c�]���L��ѧ�l�3����.[��+���p��	��{����=��u�QLR�+g��k������e�25��W���b��Ti���p�2N,'�v�::Һ#��	K����O��k�����o��O[�y�)˩��nR���J��!O[O�+嚹4���͡����?׽f��/����"���y���J�����*��kWY$j���|� �yØ���A�V�t����r��!�[Q�S~�g�;婿)7�b��&>�f�`PH�'X/���Z�sc��x�FL�l?��j[�r��]�FtT���)0�x�auk��PJ���
}��%0�@}�͚0�^�������_���$��\Yy����<o�'��X���'��*~L�J*X>�#Ɓ�Գ��
4
�꽸R�����ӈ"�)]�n�*��𣉖����C��u$�]f\yQ�;���<��u=��(��z�A?�� �����^6����Aȴ�HZ}�6R����ru��j#�\� ⪝��]`"5�v��v��(y��J�+ok�q�7�c%���|1�\k���̯(�2U$n[�gl������J�=�<��ⰭK\�܁S廷�vq&H��&px����tN���h���щx�'pz��PI:�۩�4������n��9� �X=Ҿ{<�����ƥ\��V[���0�Cn�Q������!w���g��U��W��Ȋ���qd���]���M�ѯŝ�KS*�r�8���W.�^C�|���4_�z����P��>x&Խ��j�5Tlߊ�o�saT�pp�!Wx�X:���17��KP<}�)֕q��d��@6��L�������>a>�Q���>�yG�pB��"�V\��Ř�I5��I�q��Ab��
�(�����L/�'
-��b��=������c�c}&�F̔�{'�`��:�(+l�<"E����y�%~h|�+�e�|��̳���
�z��#�t/L���8��<�yE�o�ǔ�hu���{��i��\��;�3�}/p�S8�<C(�����#�:MI%�s��Sr8���M}>t┫W�!K�� ���ND��s��T׿N��򝉡|S|>��?�\��>%:�7��Ђ���ˊ+�	o���e�5��$�l���r_�9M;I�u�C%~b��'|m�mOc�X���o������W�/�%�CQ'^ׂ^xF�
7��֬g��›�zM����|�݈�p�����tİE,㊆OI��'�f�ه��e�����}ķ7c�I
��Gu�w�=\�.��iy}��_H�!@}-�z]��C��ȸU4'�3|���>2��g����n�zY>��3�����ƣ8��j�����=��r!c	է�&���S�B�Y��%�/��@���n���ٯhXt��+d7O�ߦ~��ꖱ;�2�V�y�Rj\_J��}����N0��r݈�X��vK��.�^���[����ǫw9�|�����Q��HUQH��{Dj��|1OЌ��1LT$���w����g��r1��ܾp�1bꧼ$�wf��akRW#V�c����d�
��ꮷ�y�Îj]3�~8C\�{A�@�ObF`և�\B}��A���R+��'"�����R1�w�$ͺ��[�I�th�؅��=!K���γ0�u�����~I�ї��X�]�SW���Mghʤ�n��L��X�a$��axI�@��\�8�0^��o�z,��1�`}��h#�P�k������'� 磛�s��nj���D�(|I���j���9,u+?�m=_������Q�=qi�:{_�z5��_�0R��p��7��z�U7�<����G �2��I�o�
�a��1b<__�Z$z��TP��#B��g�BVz[�P\�E}d|�.� M|�.P�S!��O�C|��a}|C~�?�]yCΓ�,�~C���q�3�ԭ��?��Q��-�r̰h��!�o����r�%��L�Ƴ�U:#�o&��sq�ϳ�I2��W�\�ܡ���w���6��HO d?�v_�ԃ!K�l#��l�
��#��L0F�z��3�p���l��`�;R�
�[�< ��t�]m�ޓZ�1X98�ɡ�b�*[�V7a���R��2I��եőz��^�ߓ̑���y$VQ�Q�"w���%+��=�.s�;�?��x�V�Y#?�^�oJ��2%Z��oR�7�3uYg�;�#ؕ�#6���(�&l�_��k��x��n�G|i3�V��Gbk����p$>� ���I����SZ}��
n��V�f��y���W��#�	�=�*�G8���E|�s�QW�HT�E���}�@jz�漮�96s��hU�@JAl���k�n��@�.0��W`}�[�(�C�Q���pƌ�Ժ��Qť�vuoi�
<����`��$�SWB����)�-|$Ug����c��r��f��4�Cܱ�������%�}A(u����/����q�2AHuS>f	�%u
���`�n~�A���c<&��P���sf�5 �	xL��q.�v"#��T�ч��'R���=>�ʓ�ij�ԧW���Qꪑ�v�#�I���SR[R���zfp��3�Y��k��R���Z�'�qK�1@t�M�C�Z[NH;�b�����V ��@��\0V]�9Vƥ!΁#�X_iӐ/�3�(��[ �C�Ҷ�"�W�]���4��R����q�f��@�2������sAwX��Kz�
���O�:���	�oG��i�$�h{̈́�߉��l��Q�F�pMi��\�X��Z7Km&Ȳ�K*b��
αük8���r���D�Q}�hc��L�c�x]!&+��
"q�I��2����T�����@�?�S��Yq	��\.L�ĘJ�`d:'N�����J:�z#����|�FI�g�PNc����ţߎ��'�������
������`g��p
�����y��|!ő
},�/���/{b���_�9�Ń!��b�0pU���N��������O��jdq�7�IH4)d�|��GC̺n�2�����2�}K�@�+�@�<*�T�aQ�C<�X~!�W��EX���K'�Q�E�u��W������pO����X�3�C8uqsi�����(��6m\ɹ)	ĭ�^���EN��!�_�ŀo��_����|���+9�fE]�,G���d�~V��G�.��yn�}�U�l��Hҿ�*;�a �s
ǎ\}���<W�������46Ҷ�;ٹy|R�WR��Q���1�T�y�	!DmY�~��~>˹��1n�ʅ�|W_ �θ��:�����)�˕L\t��������Zz�����j��wH{�ʀ��z�� �6�ׂq>*o����z�5C}�r��c}�Z\|�W��`��~N��>G)�U�]�P:H��߅�“�Q2��Q����|M��6�d��6;�C��d]?A*�ܦz߼~$k�+��Q����+q"�>�x�xS�^�Mq�Dy{�ɭ��G�ǁz!�o��d:F�G�/,��ˮtC��ǐ[{v�!���kH��'^��d���G�&i�x���<��޾|C�|p77��U\�(�T���;��` .0���++�2�(x�c�&��@%޽ep��)#}�{S�^�/����ø����z��'/��a�iUi^�-�]��|�
�D)窞[ݸ�g�)&�4�ұH@&�{>@����Ʈt����ϫ|����Cr$�5��W��M�"%R4%Q>�����68�Ë����GHWw�W�$�����9z�뚮�,]����Kh~)Kg���������{�K��p
{�n�:�l�n�Q�s�ʲ�/��{�(g�n\P����b��.6�NM���;QN?�ZQ�#
��#�7I���޻�5�>91I��'�F�QD Y:~O89�!?���,�4��,�M�:%���ƭ��������5��A�}T�4��@��~20z����#�B!��`m0;(��h�,xI!Y�6�@6
�
����;Y����2�Qw#�jr��1��˭[��M�f\� <
�ǨW9��S웍�R���I�_����ht���T'/&�h�+W��[v����+�v�]��$˜!Fw��m�A���X�}��R2��/��Sf\u�^��u�w�!!�лP}�-��/����ёh��dÞ�%��<�F)��]�r�|�NP�{��;呷��lM��%e������Ш7���g�+Huyb,5�ه-�	�.}���.���Y��h���A��ϧ'�VZ3OawR�:�c�%���Y�����:�������m��3�����1�f��d���Q�R�	��&��}+�QĿ�/a�FO�;���$����B�#��2ٕQ���u����C��5_�˚�k� FͣByO���n���j���#��%� SIs���+�4 @�*�BU�͍g�	����}1��5M3B�tP�S��]R����p��g��g�#k����<�6�B#�K]O�yu���m�̯x}���cPt��*����1�'ɒ|�(�!�2d t�Ԋ�řG-�R�PrA6Y$�C������IF`{v_�����r���ǝ�)sS��	Ғ�y�>�5S���_{�v?�!�
ʞ'����4o����.��DieON%)�M����2���B����G��>�[��AH�}��q������>p�����
 �����l֌���T%UI�euW����	]<��XT��
@̘�:Q�n�E�������y��m?���cf�SG�$%�Y��?� �WØ�Z�n��)-4_�/�ԏG>���E9,���	N�~H�������̍[��%�D�թ�42�FAQ�<�
�ki^��*�W̵߫��R�&�
�_�e�����.w ���=��^_�
��N�)1�� �Y�@s�t:�3vK%���s��@x���fE��֪J�8��� �a���L�ЛO�F�t��9��%��/V��FL����ܐ$���ϺH�|z}s���ruХ��)�ӓ�c9d"O5@K�<�΄���Y-���l_�G&����\���0��'�Qe�+QO'�&�/K�z����������K�
1�N��_y��\���3Ϥjs@��[<L�pX�2�0T�z��p'�&?(3��wo�0��v����T�qt�!�O�A$�=����[<�G���E��G�+3�A�e�yi/�c=���?O�x����! ����9�ްn�0��W��t�L<�9��~p�!��G%���Y�o���͘c�~��;�4��b�/>�a��?+1��oc����{15^)�}����Ŀ|-��=d�p����k2���d�鎰x{�d6GXoIRkv� ;`�1Fp$zc�Wod�%����y{��_��l�ꚕ�
�����"`��xpbWx�#��i��DF?�Hi��w�"jP�NU��B~��%�>�*�d��SP��T$k?HJm�A<�|�JξL 6��^@8m��ծ+*
�A-;p����3�蜺�.eɕ�j	+�?mQ�d
F(Bl9�-�Y��\�@�Tt�S<H|�*��ga�֣�����;��h��V#��Q��bf*���zlڧp����!%�(R�^�L�S�MU����
ju�g�I��-��5
�%�`uN�JZ���oN���aI�;
��ǯs��
8��B�`+�yo@܇ѡ��k�Z^�[�A�L�6&��D�$�Z���1�VS��k�<�o��C�&{���z���y�8N;���ᙹD�'�P
�E�v�_j�����_h�@�����%5���$���vs�q8��p7�c��<x�Uu�Ћ3f0�T=����:��9��4є�n�������ӯ@�?l����7���s6�q�AX��p�i��w�8�x�!0�7w@x����s-f��_fgs�/�����f�~r�s��]��ı#˪��6Tx��M4iqФ�A�6M4iUФ9A�vM4i9Ф�@��M	4iФY@���0ϗZ4�o��ؿ	��&p�>@�_��?PK/WUW�y��("pip/_vendor/rich/_emoji_replace.pymR�n�0��+�l�g��4� 9ځ@�+G�$
��h��]Rڎ	(rfvv���
�cW�{��N�U]�����/<t�ҭ��0�X�xq��~��Bﰟ���c,{�'kH׫���y�D"{<@��t�����!��c�n6�b��2�j�� ?�t�9�Rg��h_��^(5�Q��f$��骚�]�l�%L��jU�`@��&N#�SCm�we*�����-��-��I�L'��5�3��Dl�>��X%�mo��ܿ����Dr随���o�L�+p�G����2�c���=��
U��g�U�,󈩙�����v�K��<�������ND��1_�O�N\`��P��\��G�c�0���H~֒�1<�ȭ0�ѴoUC��ދ�{���r!Zs*n��iC�"�ŵ��FH	_N�g�����	���<�Y����m��
]�9M�a
EH-�"�PK/WUWC�I404"pip/_vendor/rich/_export_format.py�UQo�8~���tm���u�nH�`]�t��hr�
���'[�,����I��di{��
Ӄ%�����LN���ח�����rz};;[�B_��������9$2ec'H�Ԕ�!L�ȉ��S�
R۹�22v*3�	!�v�x���r@��3.�P�\���EէFq���
���m)��v���������`-��y&���m�3�1�?zO���8�a�3~�y�s��ф�W�<�J��qH�8yDƕ�ցo��W0�F��*^�3����8�d���Pa�#$h�����f�!x��|�7#4�T%�dRC��Jd�`��LJ�\}�,K�|�q��O����E��$#KAIe�
	����d#��7�Q�k����
]Hڴ�O@S*0LT4�ig��p����V��dU0,P��ٵ�ʰ�F�}Q�����x�3z����O��x��q|��xf�W�by���ӡ�F>F���gb<�L۰]i�=�W�A�Q����gѯM�F�
Y�`�g
�3	�k/f��"�_��Q��<��.}�J�!���K�����Άь���Ri�)+s����\�8W�!�c�) �ᄤ�=~N
�?�<�i#�D�Z�5�#�m�+�Jw#E$�m�	]�`U�h4B�$�bW"�7$��+%���g���tٔOM�5]A�-�ߢ7�	wǸ!�(�D�X�
�PD��2K����gS�a'm���k����=��^��;\�=?�P#��ƻE����Q�9]-�ӳ���ϺC�>�+$����l>?�/onϧ��f�q��|PK/WUWIԷۛ	pip/_vendor/rich/_extension.py}NK�@�s�&n`!`a��¤4�T��^@����:�,'�hL�W�EQ���(�:J�a^x"�R��*8_�&�$�~�X�����al�I�3��#�ڭۉR�K+Z+��^f�8C<��o�>��?~"����`k�AYm�.�PK/WUW���pip/_vendor/rich/_fileno.py�Rˊ1��+�ًf��LX�^֐�f�X�lmd� ����#��G�� ���*U�>�m� C���=��{-�}T��{����U�O�9�s��ړ���5֑�Y�Zg��"%���M�珰^�o�i������$�@5
�.���x�9
�����щ�о�=g��:�sU�.�!�	r\�`���X���`_(Y��wr��H'`3)�5�?�-&4H"sn>�B1&]�~~y��(��^o�L����!{�E����V5%�.��MJDj؝�9$��M�P�x5�zG?;�/eJ��D=a{Fl3͞�aj���-��6�dD�6�vi���������؜�,�N�@� �A�'���u�P\�Z.:g���E�}��?�xȿz�c�8��+�;���
PK/WUW�~t�%pip/_vendor/rich/_inspect.py�]s۸�]��<������ag|w�57M�qܾ�44$�m
d	2����� ��5s�D���~cp�TG�ey�v��2V�iߨ��Z���ŒR�b�.rD3/g[
.w�6f{���(E�
�-�R��X�:R�^r\T�jOu!��ԍ<���,�|Qɘ�oE�7�wW�/c���8�p���_F�V��$�/,�_���cv/�NSA��m�҂
����(|�2��b(�?pb��E�c6�O]}r�~ӯ��B��K�/�	_�D#���Л�j�q;�/vB��&x��1}����N�,ˋF�Y��ox}�6K��&b?�
��O����������̔,�� 1��K�k�����e,�5r@��)�{�F��������X[�N��}:��J����$B�i�J#�Sm�X�-���
Q*I��Ye\�hv��K~b�����+A�U�>VR�N	td��_D�aJ!*N
DY�pSU����C���,5��`�,�%{�"#������Y�(@7;5�ԭԮ���QV�l����E��3oJU3!�^2"��t��)��V�ӄ��-��@"�ež���K�X�˩mՈ�2�xn!gբ�Z�C-
�\\Da��,A�tX����oD[��O���gY����E���ӱ�,�e� ��˜��S�Bm���D��n�-)��#?�~�-�L���j
��%��eɐ}�"�ⱃ��FW��P�x�{g1���f��g�a�̐�g�(��KO��^����0�1ǥ�qXg��d6HQ4����h,��T�����b b�1�ᤥq��+%���˟�����|N���/ӌ�(Y��&)FS2�?� �Vr|�Qyw��d6��A]wI=Z�N��d�a��S4���0	M�D�(�M��-�h���D���|4b���t�|a��`����
M�=@V@:�$*n�c\M�@uZ���S���Q{0�l:8�?��@~O@چ�X�>`�w;H�i�6f�%"G�^��J5 �QP�4r/��=�����.�j�7�� ���a}4�r���‚�/^��nٿяo��j.P�$I�	.��Tc8LU'v�VdX�k��ZVm2?/��M��a,��L|���O�
3 P;J�0�0=�b�2+2ݓ�d�����h�B"�d������<E�Adk��p���744��lei!/ŎU�-�O�^�_�AY�gbzy}�uD�C�7��p< d�O�K#}��Xa�!bd�ɲ@ǀ�����J�sf�;�\;Bż�r�p/��Ì�5r�kWQV�n��R^��'��ɥ�_AZ��N䝤r�"-�Nr���S�8z���#Aُ��=`ׯ��7J�{�1�I#@'[^���]eW��Ob�5�h�v>�������q_'����vۓ�����~zΖ�}
i��f��8�?���_Q��ܺ�;-��"3�o�gq�Y�	�h�@�Hn.����Ac$�`�R�ADIY�о3b��"�a�Y�8<ҹ��hw[�c�a��S����3I��T#�1�s4�t�1H�b��]�F����]d�z��Q�V�ꗶj��Ȱ0
�*DH/ʪu���Qqߴa�7�g6��lв)��v`������+�@���ٶ�$f[W��d6�X�䲞G���#><i�����8�H�xrlG�>@J��Q�o�]8���[j.w)u<�z o�e�'E~J�7gB���t�	�Ck�8�j�����fi��� �BmRXx�"[�M�}N�(w�Q��Ԭ����/<q�k��b�3��?�\d�fO�HF箣R� ����vx�����ߡ�`�k�$���R�U��',�s
��*��]�*����s��wo��>�J��v�a��V�$�|[Ͱ�*�x�gY�]A�S�LR�k�3�>��?�	�^�=&�h�����H%����^�4pJ���&���?�/��s��WQ��)������\e&(L�

b��d��\MQ�Ҡ��� �F�Tw���Z���_�l���C�=��c"`�y���&�m�}Oq��{Fq����L6us~t.����Y�\�8�i)�u
E.�uP�o����a3�6`����L��`�3�b4u*|�f��:M��}[:��b���@�)�ls��h�+;�湫��5V�=q��:��mu�^��U�a��5�3��;�V�����c�&PW��qF��fM��>�WI0J���
�1&�fN����mJn_ۆo��`���^���W[� �Z��uC��É��0�Nj�B�
ㅮ�q���*�ȕ2[9������Ă,�`�+K��c(�h�{t^L�_"`����7���Q��(��,"����^�����л�z�I�& FOb7��ɛ�5^���	wɬ�L����ߋ.����=�ѳW�:_�.z�ˣ����1w=�&��s�R�r����[eǦ
錖�4`e��(�O_�g-�
A�$���X�,���supI�����H �NWWx F�}o4r��;_^����}L~J��I���G�����V����m#�a �v�P�e/U�Lw�UU���K_}.
C��rZX03��zM��&7?������a@��±��PKot�PW�W�f�,4�����>�+�`t���g�PxR��ӱ{�ʏ�,N�>^���w�M�v��WWO���N�&$�m���*O%F���'�!�����V��H��N
�>�o��w��@W^�B����E���ژ�P(�r
��OǤ1���04�"˱��x�7o�GL�h/4�"&�Q���㱉#�"�Ī�V!N�^�{5�ޖx<�:�C�3z9��&�{�Kj�K�u�y�C��PK/WUW����pip/_vendor/rich/_log_render.py�V[��:~�_"B+��z^6�PTde��t&�iJ��{�w%m��v��>�&��oe]�J�*�f���F*�Ǜʬ�K��[������%�ou��4�˚�m����ܼs����w	�^�|�n���tl�fڑm�;�����,�����˺��k�醉�����)�-�͜7��z+Չ�-�뤢ܫ.
w�N���ڶ�<tv:�%�!�暐�Θ�e�J��Q�C��[)�٪3��vDŽ����"��+��T֣��@�j����;؋�����	P�a�vi��+��Nr�K#�eA�km�_w�=�}�5�F'�����^�Xc sc�ǐ�D�ư��0;����F ctyT6�`�9�M�C{��z�e�!�'~<����
���
�� ��0�S���^��y6g�3ܕ�I��.�=9�.0�Z��n�E�9�m3�C����)�R�k�!��Ro�Uu���䟝O��QC��j�LЫ8�`S��к��/B�Р8��d/�TG���c���/Su!����q�l���R�9�(
��_%(`��j�2�;�*!�s\IQ���oN��z�p*y��[����)vמ�+!�ܧT�R��ĕT�v�6'�ھF;AҾ��(��ce�:R��26��0��UT��=G
�UY7CI�T��&��Iݵ�<�Li�@#+#��A�����8��рoF0O��3���ЮY�7����EAˏ���b�H������w�p�\a�oQ��vz��o��
��#��?��H��-�4��c�r�T�wo�Op��#�=�/�8'������k�63@F��t/�Ϫ�1��LHM!�)(L�	�.Bp���(z8���4�᧸�MJ�@�T���ʏv�jo����>W�i���p!kt+�l��	!���<��W�+~8j��P���PK/WUW��%�pip/_vendor/rich/_loop.py�R]K�0}ϯ����G�g�/�����@���v������Pt:ļ����9i���N���YO�@��F���gt�$�%�C��Y!�h�m��[�{�wR�/��*��n6G��Zx�j) �,�x��i�C3
@q^���ղ��z`-`�ۀe�$\�i2S�5�1i��a���0���#Y�\)kNX�4x��P7P�!d��7L��]�(�^������~��Sv��+�yar��?wu��v�>�?��*�:���Z�؊s��'.����[�/q��7PK/WUW��(�kpip/_vendor/rich/_null_file.py�TMo�0��WX=��I㊴&�T��;UU�;"B�w�~����i�95�{�γ���=����
����<߭�iP\���e1��k��/�&�DX�`y ��T� �%���s!q/SK&Opk��R[Y��^�a�^.�:8rPC��D���Z6X�Ts.-6�|S1"`LMA(�7�T|��=�\����PXG�b/hxd�ak���w5�ᕙJi�(Y�]-����E�o�[T9vU}�{�׮�pK�l=!Ȕ*��gŏK��Y��gϦ{4����Yص��M�ƿ4q_����1�D�;c.�i3n?�ߕ��Q�ٸ���^dyG��O��Y�WϮw�Q��c����cu�em�7�e�^]hG�6k���sE�]�Z+r�O����G!K�}n�n|)��L��[|&	����5i=��/PK/WUW�W-��pip/_vendor/rich/_palettes.py��]k#7F�+�I�$����z���J�l�(%��76����J���{K�J��j��Q�ݬ��PW���tڨ�c�;��'��h4�I-W_7[��{;��ǟ��7۫���n�Yw�����~w}��x��9������z�.���z�����zٽ��^���n�|z|�t���ry�~�k]��������EU��k�ㄶڠf��U�
�W���xjG��j���X5f��Zd��f\�?�-�,,2��u�f=�6t�D�}b�'��P�=-���l�V��T=���7���lm���W�&V6[վ����]>m�w�P�{ti�ܜ��FO��zuX�������۾�[w�W�ϡ{};�W�n�=/G�˛�ۛϷ?p��4;�J���8r�ȡn4MZ`?-���]̵�
6�-Jb4p?wq�a��i|Q�s�N�n������o�/��_���|^=#%N�^Ь���>;��%�'�7֎�kz�O~��νe�ZVM	j�uEP,��V-�[(W�X�mh��n��))�T:8,$z,-��44jh�Ь�YC�F]�F�FO���B��R�a�ƴH��5�hXr�Bf���SM�0�T
�xx(  K	�H�RC�$P)B1�\�PP"�@A�9�@\"�220�J�L�R�B9Ȉ�
2��A�y�[���a�C��5��#`�
D D��
�(r��A�t(JI�(LI��D�"&%TR %�TR%��A�b�@���HID+bR�p%R�x%�BIS�4�Ks�<ֈK�AC��S�|*���A�0�`�b�0_�@J2_��+H����
�0_�J��X %���I���D����?K����2kąH��!�(�@�"�W� #�1�P��Q��)�|ELJ���@J���J2_��+)��+)���j�� _I�� _I��.�݇�W��X#.E��d�=y@�<&ʗ��B�j8_��+@��$�0)Q�b��(_�@�X2_��+@	��n��\��+H��u�No1V�O�o����[6�!��tj�k)��ZJ�'��tn�k)Ն���Zվ��~6�Z������e�s������}��&}�ܧ2��
v�����l�����uY��Lf貓���]���eC�����`7�`o�PK/WUW���L��pip/_vendor/rich/_pick.pyePAj�0���Oqh��PȥǶ�ZJQ�U"jkݕ\��#��&�!�3;3Z'< ]FN��Ȓ�2&��Ƙ#9����ܯֿ��(v���h�yDyu���y�#Hg���M>�$�@(M���LPݭ���,T�ZbUF��pA��	ة�P$���L�Bojr����?R��.��1��X�ͮ8,�C���䅎3�eT�P7W�,fפAoh��
e����\���PK/WUW�d�`pip/_vendor/rich/_ratio.py�X[o�6~��8H&o���/�1+�v(PtCS`A��es�DM�⤿~�BQ;i�0`�X"�;�i��6-�{��ި�5�r`d�!˥j��J�M!o��T��^�6�w����&YU�p���t�����dnu��k��r/6=����z�9���ƶ6��BN�vզ^%���l��Dߵ�r� za�s��+�*�E'�EZ(��u��Q��;rvv�����[�-�{�B�sSi���.݃r�N�ۮ]�Pf���|�됂kS�7����Ҽ�(\X�Ʒ�Ui*Sve"���b�6e{�hg�[��Uo��
���@n�p�vC4�̭�4�8�Z���v�={���&Ř�ʵ�B�n%!~�kht�5�Π@k`srJﰺ�+2PY]MvĬ������]]UhL�i�8VJEs�l��o�(�z���
�s�¸c@d�F���JfX� pUJ��t	ZQ�0�O��'��_����M�;tc+�5Z��!XT�
�V0��ݣ��Դ��<PzP�:�KS�I{p�Y�	�ya���F�k{mv�֗�e�sRb�H�#��r
����-z��{E�ayVA���E���np�6S���-~ଌ�P��'�A���T��UG�{W��P��z�%�uK�jl;T���Y�-��q�>��.��2ң�F�Nz2C��kޅ����%{���]��1٩*Ү�b���e'��2$�~G��B�1�E��T���hJ�ev�*��b�s@����ב�6,�'b����J�]���t.��t 46������'��T�4%�>7�@?���HZ��GJ�҄
��p]��dWŎO��z0�����s�;��,�1�d�4�,y�@�Θ�ȩg�y�@g�Y)���;���V'��t)!c�S����gLk�t4�g.�K��KB$����)������o�Q�x&&o�@䤦�X<Ft]*8�̿D_~y���Ӿ���c�FA!>���>*����Q|$q$� ���򿏣��V&���@������q7�4&��nl�y:ҿ�#���a��BFh̶C[��m�)�-k�u�Jdc�*�v�Mc���+���$Y�&Ś٪��*�3{�?��r�2=WH��x6���T�
Qr����)��O�g涴Yt?;c���Pq��HrR9�4����
��\�d'�C�p�Ÿ��8�u����t��3�H�Tw���K�a�ǯ��}Xq��0�akմO#����'��~�D[�
QCP��|F�z�>ʩ�;/V%�a�p�m%~��
Y��s䪃]�Ԍ�H�a���3>r<��Y	z.��y~�������˛�(�0��F�1��l;�4�Q(_�'��粇��v&
A�T�4���Y��o_�w���z�.W���q�/�~萼AQ&?���?�DZ�٬#�D����t�\��f���Vv��Gx~�r�!��	g&��r���/Ѱ~�>���3�����?�N��&J0qJ4���Su��$�P�馝wUgW��{W��яZ���Q�����c�q�}L �����$,���l�BW����4��=�)��YV�蔘����]�_��f6:f���������I�z���@i���j�ૼ$�T��68Kғ$g�:�_��p^	�~����ƭ�__�H
5�L��BM��4>�&WkϞaw\��H?΋42�����nP���Uca�PK/WUW�1�T_�Mpip/_vendor/rich/_spinners.py�msG����)��fI�q$!7��Za�Xu�ŕL��$Ŏ�=���+�a�e�$�6�Ϟ����� ��$�*`����6a�[�3=3����J�9�s�t�t�4
�B{#j:�d���Q���6���7�dJݗ-)>�#�Ǣ�R��T�Y��wh#g2��PNڛ|CJ��~��2C�Y��Y~��g���T{R�io������JfX�fU--�YiH�(}g�����)�m4'E��)9$g�6)�Ir��4BS�Z_NV�jzP��$͉�un����@�4k����lVK�2eJ�ZrtXI���9�����77�H�D�#�ԯ�)NT�ӗ��i57���$ژ\FM2N5J�F�Y.euJVKQ�;/X��9s4K[�rn���~u��UxGF�Rjv�M�W�o4G�Y&����󖖑�J*�*�_���,�k�+p�T2_:=�
׷��k`4��a�ӯ��q&��;%�cR�2��R�i�̤��WY�J���j�>�s�7�8<�Z�f]̄��H��K��L�ѧ���+.״.ò���P�4�ex�bOW[�^L�+"%bG{O��)����cE;#�R(���6�d��+v�W��pO��R��X��hOg�����H"!��R����h��X�hOG���hχ����WD�^��AK�h$���"�.z>�~�&���0�Q
K����hlj�p�x���%"4�N����H�c���v�ʤ�G�DJt���y��	ڊ8ϳ#v��x�î^�+����#�]�Hw��yH���p�X��>�0�=c�禥,OvE����WGo4�Ú�����6��xo�d4)�'�&Xq��c4+/��q��I��=DM��D��Og$�MY�R�����}kO�x�BiKK�f�~-�
}P:���B2��)*}[U>���f�y	�*̧0w`~s�M��`^�9*���������簿��5��@��}�W���j![M�
�k0u�#�t�C���4�i>�y����P��0M���%��v\��]�g�-����9����^����`NzG��U8��孵���{A�ˡ�s��K�y��-v�/������\�o�.�����ĩ�w��c=���7�w`_�b���]>o����5�B_ s f=�m'��+�k2����&ϱF�a4Y�O*2.��|��!%B)��[J�)"��!ᜐ �����KB�P�!�-%B)#L�������ބ��t���5�Ԛب�	cB�+�>&n)��ۢ>��D�%n)�!S�C������Ǧ��Mq煄�A��yQ3���A��yQ3���A�ǔP+�L0Qs�OE����](-K��n�cl�z��a>r�<�N�a0��]���$�`d��:��|y�Z����0���  � K � :�{̕�x��u��N;��b�	 W@������\�Χӂi���FimILb��  7@n��μM��;0�¼�K��a~r��; wA�|	r�+�4{P^�9���0��l�<�y�
��1�����g0��M�-{���&]��<y�5�7 ߂<g�X:O�ٔͩ��z�8������`��}���lަ�<k���iX�a���={��K��a_�={�QX�`-�Z��K�e���={�"�%�˵��:l�^�"�u�UXk��a]�E��+�Wa_�}��u���r�2aX,���nºۄM`[�m��o��	��۰��u�]X�`}	�>,���
��w`߅}���ﳵ��	��-Xam�z�1�'u�o�~{�C�۰�~L��v�럯���s��`k�����m��
�_�]�w��UJM+�U��U�'�}t���S�~������ߵ�q/��!���}�WY��#��Nץ
,�`iKKXZ��4��ai�ɪ�#)�����E���ьvjN%��?��c|�%�-E7�y/:�_�X�S�V
Z�ٜ�q��k������X{�߫D����?�Y�H�#�-;$�˞:uj�o����#�0���F3���	��\y��-�lWR�h�?R295��)�}��ί���~����/�\rΑ$�ԥe�?i�\K�f��@�}�%�S�'��%.��G�>9�Ҵ��(��Ej�b�yS
9���Ձz?�fLk�8�55|I����W�i��������q��Ƽu�
�u��;��*��>G{��˨rz0���װ`�06`ܨ�ʙd`Lc
�	c�5��wR�$�q]m�NS��Q�N�0*g�-�>%w�;w��&��0�`<pD�?�ɉ��a<���#�KN}�����X�1c��jv(�z�w�|��Wڠ��8�M=���S��g�]��H�$�n:��	�&w�C�:|�
���+��{N�����?��CA%��7�s8�<�/Øvx�>}q{M˜qx�?nq��85��T�ǩ���)�s�ܺ�[�N���%V��N7�0q��jnt	���u��c���W0����zJ��po��;�|IAɕ�k�*]�޻X��V��R�:� <5�ϙ=&F������#�;n��ZiET�֊JR��I�Y�ً�ԎP���	{�̹i��XzX,=,�JT,�Jb�$����B�0��^��[��̳sR�+��zg�c����a�TR�4E�P�Ub
S5���37��u�vaXM)g\өs������5�a-�{��A���Dɽz0Y>��)tA�^���WK��僵���i}�xs��WRZ��w%�}X}M�����s"�H� .��K"�H����H�"���W$�Q�:ɽp{��IӗK]2=S>��a�:�~[�C
t	�	�}k��d��Z�y�Z�������#�hV��Y
�g�^+�,��˓�2K����
-�~Q�q^�Vp>��q?'k�E���bYM�^4�Q�K`5�{9�`�Kc�^&ˏ�K�k�%����{Y-�~���d5�f5�\5�{���q
�%�G�;^UV���«�_�P�bC�Ɖ/���	V 񥲂q/��ka�󪲼p�K�{%X�.Y�׃UxuY�׃Ux=X��s~�,��|åg���y=`����}���R�`�|����끒�(�9x��,��%�칚�G4��o���>s�t}�]��,_�Tx�M_���ח^�r>�	_}	�7}��&���G�3��O�� @o��I�?����y���vS����S������������J���!9���ǣi�hg?��T�?qJ��<�ꭼ��<�j���j�|��V~F+_����Q�*��hdĭ��U��[gm�:���0�n�oS4�)��ٔM|l*&�6UO�/�Z�:�S����?��=~�m��97�x?�أcX���ݍ�.�6ܶW/x��p��D��/�W'~v�g;5񬟠֍v�c�%�2j67,���E����6)i�_������ݙt~K ���vː�J�q]�L8���fD�e��O	Q�E�P` rtӈF+�	���
L�_�9Sc�����	?�9����3�]��g
�c�T�����
+�u���Y��n����Z�H[Ջ�e������2�w�J�ެsjr�;�M�/�����2�l�h�A���64����Z���PK/WUW�Q��_pip/_vendor/rich/_stack.pyU�MK1��/{J�-�ZP��EDh�Rz���ɬ���$k��6�'�;�1G^�
_�>��x��7�K����x�rЃB\�)G6�o��>��@=�0<�x��d=�e|�ֱ
p�UBt�)�(�ҫ+��d!7*l�W�􅸵G��5�~&�s@{z����_��2u������-���W&t1�$�Dk�I��u��"DO�~A
%u7H�ڭ�l.%~PK/WUW`�\��pip/_vendor/rich/_timer.pyeO=k�0��W��g5�t˖)[)E�Ϯ�%��5!�=�"ׅj�{zO���j���Z9�Кq��Q��`G�<T"�g��*=Y�iȏl4�6�I�a���Ko�6j��;t�'W.��~��7�<�E܊�������v4�ᄰ+�}�(�X&�+,��B�2��R�e{L�L�E�إi�Za�?��O��2_�P�u�S���\�K�mҦ:�w�D	PK/WUW?XU�$Y"pip/_vendor/rich/_win32_console.py�<s۸���S���'3�/��y���WO;c9�vR
�&!�=�TAʊ���ow�	Ҳ�kn�3�M`��X�.�%���yt���F����:	Y���&J��g�i��1g����G[��Z�E��C�&��r-W��96��0�d��B��~nFz��0
�K��@Y�*;x�Z3w"��y���9O�����<�l����$�#x�����vų�)�f��H�Z��N1��m��h�؄]�	�Es�b?��b�&�ߠH�=?r@K*�yt+|�=O��G5� N��=g\~�qvF�O�H�3����=�?,�.���b:y��r>�V1�i.�A�|�n��χȩ�e�g�Cv���*�!�8.��'�W���9P����E��b�1>L�YΗ-�Y��y�<�z��ˏ� ���wzqxt~�tvu���ܻ>�zv|��<>�N�.��^�����,f�z�����2v��`��$%{�9�+Ԋ���
�Jxy��"�?�S	B
]�Y���#
��g�v�>�,Is�|��%,ר��h�Hr�j���� �\���|��r���A��e�	��?�X�����g�0�p���2�>_ܑ�I�$�i�����d���@O&�K�/ҐB>'���/���ِ���~S���7Rԥ��{.�+�!�z��05��Py�DU	E�XH^$~��� ��ma<�\���Ć\�硸�*f��ǜ&����/JVk\�j@G��5�W�Oj�kk&��<4����˿ᖒv�_�`�4.,𠴈�ˋ�%�������;�����wv���)��2o�8�<��O%)�n��/�?��C��x-�T|H�M�
�9�sݮQA*�����2!E�M���{W���5����r��#,��8�x5�T3W��KڼKnN$���OQ��F�����zoy>��w`��H&jSq=���m��ɖK`��f��gد��w�'���,��;��L�6���"o��+���-e+D ��:|�����39eʰH�95�NS�q��e6�-*���wv~�L�Cʂ�a/�e'|���6!�$���A�gM�(��S�6�?�ژ!�,����}��P`�B�l�p��4c�n���J/4`��WhG�)4Y����Z��W\�Lao�����|��P�V��j�ʲ@p���V��f���9��l�Wg�d���Fw�fP�	�C�I���斱�"��+al�Ad�)'J��D[��Rd��
M!�
�ί��ƾ������OD���;mf�
�[��y+g@0�:x�j|���㵪��@7��!b��K!��#CnK|����r�a,&�Fx���ü5�.m�h�o�8Vc.IO� �$qc���NT~_���l
�F�����˜�툳�%�?\�]@���w:�n���1�#��i�
������c̓�|A��P!�XIsv�^�k݈(�},(���������]Ŝ�g��(I���o�Z�m\VA�[�Pa�1�
J�e��Y�g��Ӂ)J)�q�I���q�Rb�|�\mҰP!u-���Q���G����3����SHEJab�����<	�')�h=
aÿI�T��bp$a�lɱh��XL���L憦��GJ8w��
ߧuw��2����]�v�{ƙ����G��r�n�/�K���"�7�yfڦF��h�����J�vs~���-�p!mµ#Ž=���;�9�lʭ��1[��?$����](�8.e��ߒ9z��T��#.�@��B��MsM@�=P�O%��6�v�)�B(uOK��Fv�MJ%z��$��ؗ�ؚ��\���bz������>�e�{�?w���VO�v|��e����pd7�C�q@wQʊѶ�	�9�Ŧ�9E2�,n	0(S��7G�+I�]�I�����e��i�+����No�8��*u�Ǵ�e�mG3�Z�cJ�9"ќ%�3�Q�B�R���gAEN��ޮy���6{�.oc͒q��f���-l�
�7�:�kl�l�h{�\P�G��FCF�C1�E�`j��l�2�æ���-���r�'��ER�;2�j+�P݊��Nk`�S4��]���wn;&h;�]mo�8|�Ah���ÖD!Sf�;��BiʀO꒺94��۞�iv����=�g��mv��i�m�6fO�\j+hfq6��ExpO��샿l�.���Fb׭���0���rˢ�o�ت�[�ݞ�PVYR�s��ZQ�[�(��V���2��"07��<�Qm56�j7�n.$�6���FaU�FQ�d ��nM-�a����a%�8��Ǵ�8���c�Q��{�P'��oty��,��ꏳ��(�^�� nc���o��W�&�·f�vr���2�(�s��%����i����q�L\�����`0��v]s�,�?�y���Ǘ�l�|Aܵ\��*;�륌E���f���'��HY9�Y`^0�ŀ�⥘�D��h����Jҿ���]�.��LQnQ����I'"�'2�Y!����T�l=���2�9���<SMm�E,Zkؤ�A��:E�B�!�v��X)�%j�bGWgo�]{GgX�J�=cgI*�xx1=c�~P��1�p$q�*g�F��l\����w}�ݜ]�\�L���������gf��6��e���)G�\0�w���󔴬��" ��Gbbo.�N�^]~�8��?���ϣ�h������>�#w�+��xʬ����G%�?�-�i���Ā �/*��Q��<��c�kz�7��?���$�K�����tx����G
������'���o��M��
�xd��a�mj����?���T�-�m�:����Gu��}��A�3�{H���z�Ծ��M�׼��ޥ��뽸dU�K���M}3�p� H�r�s2χ�/X_9QY��u።��Y8�J����^	�Ռ)��X=JXO�R��\��J$k4j���^(��k���h�6�c���#{1�T\�X��9�_�:ô{MhQ�YK {��?��٢�U���|[���Wez�Ӫ73$FŲ���@�%�n}����Z(ʔL�	J{�/�DXQ6ߕ`�Tt��uK�*b��͋t3�L�8K����7m��u0h[���$�I��Y�@4�]]��.
��&赕'��ɂ��Q,(Ҿ���i�x�b1��f��\C��J��\ݠr�d�� �;�?�3��H��+ymB�����nVc0��,�\�a4��02����Y�O���=W�H��ھ(��qp��g�����.u�| ߇针_2�ˣ�ń�ٚ7�~�#9���Iioy���C��	-�
���wf�z.�#�b.��"2n2O�C
��K^Ĉ���Z��jS�t>�~��U%W��<F؆�/  �c.�W��M�"r�+�l~8`7��|˩ަqh2Z��o�J�9ʎ(���x�����%������J��5�Xc37E��9TE��	S �_H�~�fd[��;��׆�*���>ֈ^*1�Y�[C}�YT:k)����w쓲`�R*r���K��:�w��������f\�9H�P�TЕ��E&|SF`��7���|��:���0˫h��̤��o�X��QG�^��brCo���M��nY����4�l�����M�΂U���)Q�
%���'�qFr<+�1����jzՠ%�)�Ik�'�W�4�֚+p����h>�E+ d-���ӯ9'���I�D�D��:*a��l����pbr���&
6-v�K![����8��vk���ߡ�pM�xz��:'_d����
#^i�~N�i�-_�N5=%�ݫ�54��R�6���Q�C-�
��!�d�T�0�tBbi�C��W�Xm|AW��/\O��Ѳ���U�W�V$�^aa7쐱,}�;�.�yX����1X���パ��I���ItV�֥���#��'I�H��"��#E����#��F�vٍ�W��H�L!�m��s	�O��̊_i�HƵH�5a�� �*	�<� �1�	�ޱҸ�e��I 3�d�M���Q�X��֬���1Z	����"����>�AnmK���5���u P�72Z����iS0u�{�]>bQ
�Z�����bH�y�wL�t�}m��z�	�m�͘0��ol"�(,֦cI���$5ߏg�b}���wǍv�� J��G)T�V���Bf�'CV|�B?�krLyU�8�:�\�E�yX.S���r�zR?Y*�2��0�H'�uB�Y��G˦W5B�c�!?�V��T��MU��^���/!�-j:$ƥz�8��!8OJ{E�o�^+���֗�ԟ�5G�dQ��"���jb�ˌ򰀯E�W�Z��,���N��
�V����*�*�v`^z����������e������'��7�J�m_�R���	�(�&Es�
�ZU\NUK4(�J��Q�'�N?��U��#h-�)&�š��O%��`҇]���>��!��P�U$P�B��/8���?�ۗ�<]�F	��>u@���t%p�����3���k’��� �%f�W+�4Ue�L���J#�b���6$����hi�~T�1����I�4���;&fA����I�0���}auE���]ڠ�ўچh3����A�|f>�
z6>:��G�g'���'�f�w
���+�X��iT&��
�wXc�G�kw�
&�辄�����W�d�H�����b�Wθ��z�N�ݥl���Z�!��Tξ����@�]U���i��ɼJ7s��b~���	(@V��#�v%m�r:6)�vK�{��	���ojd3���[��V��OQ_g�)�nh�eGR!��PY���}ݪ���O
^T=D�5��=�����Ό-�ܺ�
1����q��M$�"�q'w�P��y�/�l�����{�3F��;�ʱ`��Kp�J��(C���nfb��;�KMH�8�Ӧ�.gL�?PK/WUWCk�ڽ�pip/_vendor/rich/_windows.py�T[o�0~ϯ����D�	&���nT�
��x���d3$qd;�*��ĎӄъI��u���΅�������r)J�1�҂)�p��E����_�W�xP�R��K`����=���NM�NAؖ�m
�P���>'!
�KV(p��{ ��KTS�X�]�,e�[C-HE!�3��>����"�2N��e$���	�H&w�`H��[��`:�$qL�^���m��wV��F���!Q�$4ր����Rɸ�0��R
�K��1���}��n2�<����F-]ZA{��}H��v�Z�%t=_]/�x���|1��Y,�&����X���Fg�bH�c�k
��.<�P#��֒o
V=LqBnY�XExn3|і�ذ�G[�,6�N4)�\�����\c�AN�@ӎ(Gu
����hW^];�L�p_)@Iջ`����
61��j߷�y���`���@x2���fU
D�̢!��~o���`�I?p��Kl"�6��G�ISPm�8ͽ�k���v������=[��v��q�C�������'Oa/�Z����K�E�����j�Ƀ1E���d�Q6%�O	�#�?^�lq��q��P�ix��)�ޞ�;�	�1*[o�d�6�oG��C�(�X	��uKi��G��m�n����˳,y�mTs
��V�t�ˤ��_�I80�P�=��oPK/WUW��=��
%pip/_vendor/rich/_windows_renderer.py�V[��0~�W���	K��77qv��#��5
J�f��m��m/��Q�9��0f4��I���	pf�,������*X�jara���In�w�E�ٌ̗6Z���#�ӌ�W`}��1�qk`�ZP��(e�B��	D�)�Dգ�`4��H*)o�M�u�@�0"C�)�E��D�̜�����ݤL�Z W�v]i�|��p�y4���
s�ќ����h��WW)I8�B�#��%��	R�blCwق�(�Y���iW�9
���XVH^�Uv2�-�2	f�dFJ�B�	Z�SvU�S&�>�\l�(���u��2*���z�L�Vj�5##�{|̓p���*S����9�>�}#��۝?��tS�Ta����
�p5u�c9xx���'�i-\��0�������z>z�~;(��l�@|X�Qdr�M=ϓ�!"�Ч�u��yN�7���W�S�5�sm2��l�<(̤�.�uD�\r�}���A����q�����5n�z�^�3�M�,h�d�h��J�Un����ϕq�G���`���t%��uȢ;��w{�>A8�ow2���z^�r��HO�*��O�Ç
p��Pcv��w�Tx:S�%�*�[j6|�ƗI���� q���A����a�
I���vH-RZǹ����c$�� ��d�����
��*P.B&>�x�	��mv4v�5�7�n� "9�.�C��@����PK/WUW+,��0pip/_vendor/rich/_wrap.py�U�r�0}�W���L[��3��[��K˵�h�XI�$$�M���$��4)�ckϞ�=ڕY����i4Ѳ�TLL���CKuq�i
G��N��( G�K��{'�0�6�)�1�©Ha<C��E���Z�r>�J1N����'C|ƃ(�J:�2�����z�����|JgL`v�����,\Jf�a�o8"Rv<�A}�����i�1�f�wb��p,
�2���J�����*D2hau�=�T˹Jv:ȒQ^��R�^aؚ=�4��슕�p&h'��β �D�2�K)9ҝ�9���svj��u�>��B�Pt
�
os�ɚ��i�i^�a"uS7i�4{G?�V�@שuJ���Dc�L%�NV6���p�a�V���>�bj��q��kvEKPƕ�6�O5��X�nh�ٻ��{M�_N&7c�/��ӎ]�lpwBu�^�͈�l�Ğ�B�o��݁9�ݕ�E��ۙ}z0�a3�f���X�Jsǰ�C�Z#�ܔ��w��[�p���v�E3�x�`愈���@�CL�b��8xJӪ��n����:�t�
Ha$^���� |��jly���1�w���#���I�ݽ�O�Bq9�m:c�~�JH��}~u�\�<{~����o߾;z����'�_�~���'x�8���(�(˛8�ݝ�X���PK/WUWkEQ�zpip/_vendor/rich/abc.py�R�N�0��+V�H%��đ�n9&^��"������Q��ٝ�4����S`���EaF#<Y3<��c�݈�@u[���,"m:fJO!� |�bSd�#1���FpqL��,��8�ڤ2�.K�1f�T��l��Խ���G��L�!| &Cc"��Gl�YXZ��F�"kg��Nj������H#6>�ΕUKJ��m64!��{�A�x�20���(�)e��<�p}ѸΔ�����w�a���NR�&�:j�P�(�JLu��TY�Du�JPy%6�pz�j�n8i�l�d�~�t�.���,�O��[ߨ7�H�I���_�ϱ1l��v��-%��]���0W�	>�){9��^tI@���e�G�PK/WUW��nè�(pip/_vendor/rich/align.py�k��F�{~��pvej���jTt��mUQ�ۋ7ɂ_�7ǥ��ޙ}���j����3���y��m:A�]?[uME�`�h��'\�,7��jM�Z^����?��O��=��LJ�R�# ����V��l�WHx~����^5�vF�R�M���L�ytV��jy;�/X]4�\!��R�I�\B>'mG�]��!�X�)!�KepN�
�b�Y�I=>��b��v�@<P��������hŮ��O���eR[�N=�%Ӎ�:U����Tާ�1�G�i��Ǭߖb6�S�u���MS����YT���R-�G�ᯎ�7"z>���/i�Q4-BW�(J���!�
g�eI��H��W��{Er�P�Y���Т@_�[�d`����i���$�n�+���P�dA��76��T�{�ʯ5#͊�u�tF-���,[��}ܼ�OP4��m��b����u�l��1u�5Nbs��9#��f�y���t�R4���턲hS��lE�;z��!`8^ZZ���A��#x��Ke�W\l��BRO��G�/.�h�c��/�	���\s8�
C��L�m�H�vP��x�0��h�'L�5Ќr��~+.�˰6����1�=�\�wZn�ݮk���ٙ������0VA�˖-+���ss4a��5����9+W�/H�(
]}A�c�}<�f�MϬ[?`�ׁ~���C��c�\��+�+i�+90�]��TBnܖ��2�X�	 ���$��&���Y���ȵ)�
I�Bk�CA����k��Y�&9	vH|�)�$��օ[�����E<��/�H�%4X��D�{�=��<R�̔��%s3���UTf�0�e��k�2�ᒎ)�vL�w���#��Iy~�ۮ&+�
���AK)y�DE����̰�<^v7�0g�eٿm�����m�>]|謌*�G^��&e���K��a\�j����\fOS�
��_�R�&S	2XP��ԗ[J8�
E�\�Z.��x=�19��62i}�ky���F��=�щ�/7��F�i�Gt�B�w�tcy:�[ZOզp�r�|dfGӾǃ\k���w2��%����Y�S�B{ى¸���I��0���EN@Hdt3�@��p�F�?߶,֦B��o)��5t�|�"֣�yߖ�vȥ�H�$�JSb���f"�7�e�Dob釀iH������C���A�K��(#<�.Wڼ1��tah,(y�w��k=��Jmi�5�$��׬�
���OK5s�g���a�
�|��[���|N�^Rh��%��PcK
A�/u9F�ώ��P�$�:cT>`Xi����S��x��]����Zk#�HD�T������b��\s4�����s�>��neC7�@���ns�&��(M#���B��=]�	��7$��-�7��H�r��\�\�8�R����r0G9���{|C�F�x���|��w����}j8/i�����8��	9A��%�=��ɛ��hRT�!�jl���1�����f[CI��q^"��S�
���;Z��"�2�c�1hʺ�fe2�J�(,k��MZ�� p5��C'���)G_25/˩&F6���ALJ���Ĝ��K������[c�A�v���d:\_)�#���t$_��4�)^I4P�|��Zr����ھ����Ɣ�^�io(��@'�	�{��Jԃ�bY^8i�f!���::�>���λ>uZ��K��A]�Ks�٘��A_���=�G�^N�����M�R�r�rt��
��Վ���j�Q��cK��q��ݑs����x�q6��
�N��s��#57PT��R?�}�	Cg�r3�-7�/�R|�˧#'=�5����~�c��<ab
�D��d����i����~a �3"��-�����2�>?~dpu�oi���_��o6,x�$m�E�j� ?��d:v��5���x���TfYH���i�q�^����^
�Χ����P/1`��,0Ա�U�ǘ�8
S�
���T�WP��y���+)i���[�.��
ҽ�ٶ�6p^J<3�o�CT��^@ni�J����|�ِ�����k+����,+	���sy���G��Np�$JխB�7kShji��[�“+!Z2��Ⱦ�5ȼY�Ԥ�����yYp����B���y�A�q
	�:LɨI�];VDf�����7��PK/WUWZO���pip/_vendor/rich/ansi.py�Y�n�6��`�?Rk���\�;ʹ��ۙbhCP,�#D��N�ݶϲϲO�s�x�O�E�(�����w.$?����d����7����lU���$����W���Q���ˍ~�Zr��|�ޤ[���j|~[˼*Ӣ��VUQ	=�+���\����z����{=���lr6�`p[�z��������nD����.�Y��E���ǻ�a���n�
_,?Y��g����0쁍Ak�G߿z���ͫA/�z�"m�\�ܷ�/�h8�0�ov�d՚F����y�) Z"$ݺH�r�bp�(k6bfB��WK��jV��z���E$ѳm�E�l�����:�4�o�@�*�,/{�Q
�2c�on^CYd��Z'�Ŧi�`3��g��k�$Y�RK�xd㇜�c���%��I�1�4 @�#jTL�&�AdF��X�x
��M��=z��,Z�e�C�lLC������!6�vh��i�B�s^��ծn���[;�〝�#����0���7
�{vZ�C�}��A�СOY|��y���0���)���[?r��[ija�t���
�@��=�H��
7|���%�7�|����Wɷ��4�!��"S[��Y�U�3��2-�L@�+3.���Jv������?V�K��E��\�2��i�$S��~�*�؝J�#���02�t���w��DIa�������Y/��b|�ľ+�{����g87`�iYld����lldgFvfd#�ٹ��م�]٥�]��
9�C@'!C���Į���]��>9s��d⊍�sWl��\�b����W&�V�{s����e-@��\�bU�}��[W
��;�K�`���J��ڜO���<6a�ڤ�&�S��؄xj��Om�cީM|l���<_Y��評{���㑗k�:yٶ�㑗o�>y��#/�������ia)���H%�'�"	D�2"g��)I�ȗI4�X	yS�ξ�bE��-��]Q��hLd�����m'�s�,�y��:�p���,WC�S`�i.���4�H�f$�n:��ɪ��w�1}Hu�ݒ/ߦ�b���0�>�g�'8	��
p�"�4v��6�	���(��6�h#L;⚶xvG��ew�GԒD��;.w���5}BL���$KG2]�*�!*(RXgpᲡ�t/�����{_F#�q�و��	��Һn�#�홗�9}D����p�8\_�H1U��DX$�J�#���9[�)���53�z�a��4C{���yA'"ҪH���]���Z�pd48�6�
���|���x��@CG�`��
�T=�{lޖd;Ѯ�`������;����3����
	<��*���c��MY	��L�
�=_����'�KK�V�9�ݜ�����^8g��@�"����C	�>z"j�F�1�bL�ɀwU�'rB�Q�d�4Cf,����m��R�]#��E�:�"8���.�A��/����6�8��yŔx\�:U�F�]3NA ��uҁ�SJ��7�'^~��������(N��:{�a�o�K
ndU�ъ�-@7�+�����S��n캑v��['��uƎ���6}�6s��xO�vZC��uj�g:����v��/;��[%����e�z�{�؆���s��k������b�D��J��j�D@B%�[����<��;�$��C�l��&�.�Z��m:*��&P?%�۫�W˽��D�U��İ�����62�kr�*z���y�ֽ�
�f�:�!��;�=��"z������!�غn�GO��vx/�����~*�\*6��x��I�S6���嫶�j�ws-��V��t"�=��K �;����wr=�R4�H,���s�U��|u83j�:[��Iy�^n����a��PK/WUW���'[�pip/_vendor/rich/bar.py�V_o�6ק88&e��p�����I
4�`�,Q6W�4Hj�W�}������HJ)+]̀A�����URl@ﶔ��n�Bjx��T���GU�f\&dK��l�\	F�+�M��RxAxI��j�����N�=�7n{A�(o(6$W�܃_���B��ٵWn�^�]'ؕ�D��\D���H�OrFW��P�s����
5�|r
Z�����F>�& �j=�B�� 8��s^����8:�}��rqv�����|v1�|yS������Q
˟C�_�r�.������-���7���_��[~B��^��;0İ"DQT�\)8�e�$�"��h4r�T�z���d�x�\�#K�\)Gl~��@ ���u���9�����'���eoy�dEy�tf�[A����[B8<�6�)P^�Z��I�a�=�7�KK��yRMR �k{�	��nn.'77V�M~G7����	�r�ye��Pu/���m��mN����޳羑�Q�6#�v���EL�oVRԼ|/<��y�a�����"�<MX�~�: 
{p��:8;NCOd��4G�\c�c��138P��u�E�7��'Y������^������w
���%P�Wj1z.�N��ö�M])����I��3m��w�$[�n2	�<2ZvI�kɡ�t���]
o;��;�]Ā��z��X��"�ڂ�@����3����Y��Fg��a�h�
v
��6J�0Eڧ�螅%I��\'���׏�{�f؎V��(���N��ser?˘QN���e+IE���-#�,�iN
m��;�)�=�']'} ,Vc��އ=��i��]��'��e�(w*�ɘA�-�/� j ����;�H{���/��q�0=ÈT�����*�(é�'�����Z��Ri#ڃþ��,C�\�`T�ljl犑�8��|L�J��eB/b�*D�u�#xʑ��\+���uS�ù���t,�3�ջq?�L9���?#"!L��)
C���0ZPoT9�9ߗ�ǡ$�8������|c4az�#$�
_╈0�[���sC�NȮ��W���Я�͈���^o�>�a�(��^�
k׽�9��eڇ~����+�PK/WUW0�P_
r&pip/_vendor/rich/box.py��n��]_1�>��j	ě(��vv�x��ڛ�v� hi$OB�*9�q�\��MP	)zM��mzK��M�ȿ�KzΙ!9C���5�a��9snsn3��L�D��,m��x���TDc&��ѽm�����֗<	C�a;"����B�'��#_D����c��{��m1�T�H&l�0��TL=��G�8����J!鴴��kl��I�eQ�1��j)
<?��i��0��Z���N����8��M5ܛJ8
�d�nŧ���8[|$"���Q��2e2f	��	;�Oy�w9��r��r���}@�j�G<j�/�?�������=��ű���p
���OAb)㉒x#�JO��.�Me���B�I�n�l��^��!�{�a��d� ����;b�H�Dq����a�8
�<�
f�d��JN�e6W�
����|B����p�A�]2v�3E��P�S����l7�x�.�|���m���H�S!l��z���M�xN=�W���E�xI��i($R��S��;D�Z���������c�e@1>����%M�o��ɯ}�c� ���	[��^���~���8�c�Q���Ǒ�I��M$q��6���n�gq��@�.)�A+Vyδ�iZ�k_
e�ҭ��y�dcw��3�:����ϱꌟ#4����U��	T2�bU6̋&m��,�
fX�Rli���ҝb�P�LM	�&:5Q��T䝄�Y1j��y^�Jj�y��<o���a*��I�ӡJ�i�9v!s@�`��܈Y��4N�
R�~N��٣8aA�#�p�˅d'q�&��7�%p0'���Y^�c��hA�kˉ�F��Ő�H���ٞjU�������H<�,��oD�ImF�$�ȓ�����^�BSw0K@0�Q!C~D
�2NҶU���a��֖l�����G�$0ȏ��`�q�[fU�9JE�%��������s�SX����������ݭ������[������}o�%���o��O��L��TUy�න�����rt`��E�c��C�"ZV��_n8�)h'��c�Mz'CjA�%��a2���,�����q� uyH6���y��="�8�V\LD(��`X��Z�$�H�W!���}%��G��	9�M�"	�l2H0��F)!��R� V��V���F׿�����U�*Ѯ�;튞<Cy�);_<�|���m.I!X�;���!WMgCbQ���E��H0 3���$J/�'"�Z��)~�A"A7�K��g?~R4��)d0�����Y�j��BWţ�6 ����*�۶%z���m!A�bl"��C�%�U�]+2U�v�g�{=�KZ��z������JG)�!��;-P���l�	]��۠�j>ۥPM]�~�nhl*Y��@o��M=K	�K����p���VP���LP/k�*��b�BKܽz%.)�eE���
�~W/pv��aN����^��R'#�H�����V�'�ŷ��
اC��Ա$��z�Z�v�ĉ�(%'3��������u�[�>j
I�9���`T�'U���a���d�����:3=u�W˿ie�8�^U�׆����}*����!�BOiQߥ���U��~�u�ƍ�sv~�:�q��|ˇ�ȪH�!���v[�^��}�zF�z+
i�[{n�lS�{!��Ӱ�փ���մ�+�Vq��2�{�uH�/JUq���-~�\��\�a���J������ة�����K�R������JX��;˸e�P��5�_�����O�9c|��m�LY��R���{;5Ά/�y�5�2�!���7ѵ��r��U؃wX3(�|g�~�;{�;�5�m!kF�`��ރ]8#ׄ���:����^�U����L��-�?&�m9�	�2�?x��.�l��!}HD����ܒ��޺]�� ����h}��x���A�[�E>&e��v%�Mz�k�)��\|� v?����e>i��!���-���h�-ɧ�$��u��~��CR��ΐ���W���6�n
��ͷ|�wem���S�I�_t�f�[��h��}�uJ���yŧ��.DA�7�y���*��*��);թ���@53�V�z+�_ݙ��Q?�E�oCG�B�Uɗ�YŌ4�h"�La!X���X=�jI]����`�}���?�Kc��V��I�.����hذ`Dp���p`���	<ai������
�� ���T�$?���+��^F�M� N���vk��۸����Ӹ*S�������UH���
��U�u�)|V!5���	7��C��\Y���*��^��
YY��G
{b�7���t��\��a�8�<z��7^��<yϡI��a��R)Fg=gA��]A���R��˂����ʓ:p����?�,x7!�^SpK>t�Ռ����r��W�G�W4<�,��C1q:��_��H��P9����Q}���ܡ�Ǟ�{�W��_b���`�r^k;�<��O���sH��߸�e˨RHeN�w���ɛ�[�O�1lw`p�nJH"���!D��'4�v�k�ls?=��^��PK/WUW�Vt!��pip/_vendor/rich/cells.py�X[oE~�_q��a�q\ǔ�$�E��H}0f����ݝ��l� 
孕�J��B\���R���C�'�	�3��Y�IU�\��vf��;���a,		���a�E})D��A�y}�?���ṇQqy�+`
8�Sii���gA�m��bN�r�w����.Z���Fl��З�1��jƢ>19f�TB_����?��/Y��Xjy<�R���u���<1�c��}3k�ڭe�81�w����!}�Euq|��;���6
˲^.�u��^:�Z6��@�
X�H�#;��ą�
��X�/۶_eR���p�1Ĕ"��O؀�4�] )MKqn�y
!�c1?�wS�3m����{B��RY>B�䐅"�m�Y	�4��X4�J�XI�\���"���\��d�j��"P�iؤ���Y,d?<���ԧ7b#����2���t�褐~P�Y蔌N���P$F��H)t��D�7�`�U��Bۀ2ޝ2˻]��5��"�ɋg�
����!�pa
^XiW�s'���i�n����zU����^��
/:үP-Y�9��I��j�oq�ޘ	��j�
�3�.�~?�9�o�6��)�`$e��X�h�n�W�Or߁rʳaF�+d�C2��ʃ���uBK�{LRs|�E �1��D
�β86Ψ24;zVtYa�;�d_2]8vڊ[?��L2VY�J?�
�>����
�J�Jv�����f������
��bAM�i�K�;AKX�IHY�#O��������&�5S[]�V�+F���9��|���mc�FS�8��)~1Oq���Q���$a�r�v�؍`į�h�7�TC{/6��9��f�����Zw���8Y����0��V�1H�E�+!j�5L����w��4!�G��P
���s�jT��j��bee�jl���⑟�b"�	�]Y$y�È�儏��A��FcA����-�"#�T�2�l��aŀeӛ! Ǚ>ԧ�p���+I��v�����s���0/r�RiO>A�!B��XĨ��8�gq#*zt�<�|G�����9�d�.T��pY��U�p����c�T�c��K͢�1��G�}��s�E���<R���{�ZX6�SԎtN��"7.��C�ݢM���v��c�&w�|�ǁ͒�¼`�y��eH_�n��jh(�\/fJ\o~�+ܦ�&�+�h����]���i^��.M"��m�#]�5�
��*O;Mjt̢oiHK�k��o}���\��-���0M���[�aq��g�+�F,s�um��6�i����7r��
ܢ�E~�<��������j|q�B���3���ǘ��9('�>���ed
�F=a���������G?ݝ~����ק�L���ۻ����ۿ_��{_"��ӯ<����N�������rkz�㽟�����|�`z�#�B�
X5��!+?��"�#��g���s,����gFl����{�&Y�ZPK/WUW�D���0Gpip/_vendor/rich/color.py�<��Fr��spRm��[��+iOVŖ\���R��’C^�P+�Nos?�Ty����`�����8��L�����t��mwiV�]�4۶"~�dk��[�H�4����MP��&�y\&��{�����}�(�463�l,��F.�(Y����2x���}��EG�
�ry��Ų#^�(M¸#����`Ʋ(����ŏ�ӗ�/?]^__vě�W�/����__�z���7�h��A�E@���!�a
/��L_�|�E�M�
���6v�b#�Rc?����_~��/�~~�����˟/[�h�~.�Wb���mx.��Af-�Sԯ���Ǣ�X�Z-�17�u���b>ޯQ�L�rPq�笆7���>�5<�{�H��0#��*���|��e�R���:�œM֦F�0�Ȁ �W�|����W�d~�T�r%�~���Wm��{�s��L�,+���	q�	x�gϦ3�#��1�����N��PԐ�M�f��(�)���:QN�?u�<W4Ժx��e@�.~�D�Xƛ8\�z���g���i�I���@=d�wv��Ǒz܆k�!@�
�8�H`��6Q���,Zo�@s1u����j��=nx�ĉ��������?r������Ρ����. 	?�Z�e����R�5ݳ}��i� Z���� ��UF8��[�˵�CxR�~fۚ(h��]1>(�%��~ߧQN{M���A}Ii8��D�Q�aIp�W�jQb�K.C���Y3(�p�4B���)�3ˉ���͍�����!c[P\k4iX�4{�9��6��qxf����=�Ǝ�x�L�!aߎh#h�v��#��.�O,O>D)$Rk��Y��i�lT�y�!��@�
D�W.=1���&��L��d��6�D�`�	�"�{v��Ȗ�x�i�`�8�;1�(������ՠĐV�"͒���84�1�3�4�E��&�i	�r6����N�ͮ��d$%"���}�
���vE���N{5��������*��ז퓛
��u����P<s��8]��$�i�8
h�O��[L�<3��<�iœQh���&ÂAV�<��,���U��UJ�@����t���Q�4�Pzc[�i}���w��ĩK��ξɵvD���h��O�3�I���I��/2�e�0lRe�9�����Z�!�~����T훬�\��8��� hl�£0�DL@٤짌\��i��D��p�4D#�&� k����x)�,�Y���۔�d�Q��`�,�#՚d��:a��^9̐�M�F>x�����&��Q3�R�[�E���U&3�m\��	����(
j��>�	��<B
6�/6U"�ze��>=vJ�F�>TnS^j����
m�7���3�['|v����T��z���M*+}���T���b�
��0aR\	�C5C�����j�5㛊�+v�ζQ^pj����b���Ix���=iܼ<�p�j��UU��/�S�y+��{�1�n"g�#nî10&M�a)՜Q�o[�a�����*��g�S�C���I�edd���t8S"������[@m��;ɡ�|�*�DW&[���ros0dfJ�0Y�!sЯ��ž��&ߕ���1Q� &���GL�0��ps6a�g��q.���_�A�-�
iv�(b����H��2GD�
�^�`e�6�$U
��]QU!�pF���S��z���^�
�1��S֌@�y���3zfa�@�Ŭ�Q�-�b��TX��gcUA�E��l��@�0��0�_ք@��k (��Ց������$����u_A���ں���Y�u_�w1���k �⮋����ձ��2�:�u_�vl�,2���}
$3ṟ�����f��̲4�/?.$5��^�F�>�"��K�����b����%m]]�ݙ��"��X�D!��h����{2����|n���ZD�O�����;�g���[��;�EX(�@��.���~s�ia�����o�����׭DY�U�D(h��Ů�9v`m��{�<��+�E�F�n_�"嵻��6E*�4M�֦\���l&%�������()ރj_A��[��;"Z����fK��Y%?|qbѶ�S��\h��W�����y�D\�xj�OSUo�c��=����6�?��]rRB�(��@@�
�l����D�E�\���7�PA�_��q�XG`�Fno��
�w�G�p�S�Y����#X��E~�s[y������߽���9)���y�{kf����_o�:<D���	^h�+����3��[��4�zT����.Kw2+�wuse���x��*h�P�U+��uMek�\���c�툺�9wT��m�3���Cؗj�v�Y��>&k��q@!E.K�o�4v�}���[d�&  �3چ��x�H���0aGv�(1�4��8J�ohn�:���Z�8�xz��P3Lf�}�l�󯡦/��$B����AW�V�kVOǰ��\g�>Y��0p
D�\�*��"��}}�cF�D2Ѱ�e`��ֹ�}|!�;<BXV̷K9�m,O1�S�>�Z�]��8@��
\Fh���Z(>1�xe��s�p.ny�])X�^�]+";j�-R8SB�M�*s�|ҵ-вw��T�I�&�Ώ]�[D����.]�
�6옇�^s�d͹Ջ	zL�Ǘ6�����[����[k��#◲B��pD��dz�nʿ���+%��%������i���-0�����Y�<�T���ۭ,6�҄I,sԵ����e#d.��H��z���J-���b�ꥨ�:�'7ƾ<Rc'�������;]=���N�D�i�Y������w��(��v!��P�0�oX	�Wg�O�T�BCc��@�(9��	��a�V
9�2W�T��;n>0؂�:����oM�,�j���<䲽�O�+����OF�L.;�z��7P��NT��y���7�(�59YY���ȏ6iCh7���Z�l�\��4,���	�T���d�R�VqXQQO��=�vO����%�Y8�.KbH���&tk6����6��kf>ul]���d���qlG�����`�IN�o�O^׽��Q�RaX�M���A�Ѐn�05<w�<�=��W�|���I��y��߆��r��
Fm�
jb�X0{y�U
��@-����fњސd�9c�a�O�p���m�T�sa�o<Ta{R9f�@����T�]c|F�v���^�eǁ�u;5���,������l.RM'p.]l@%���%�Qe0zc������j7��O�c`�E�2�|��Wcm0R�L���څ��.R��o`u0jN|s�R��M�m�|�FP1��F��|���E��
?T[+�4�ks����xY�|������h�"�v�S�����P|���
�G�/���sV(��Տ���%N7��Q�{���X&~9�-�4Ç������'?� �B%�K����5�F�j]�q�C�i��?�%��Ə�R-ډVv�D���M�La�"��y�j��=|ov��:a/e�sW�H���6]���d��n�}c����"ܡ��S؀O�
�e0a𸾬�
g^�q�ͼN5�5o��Pg�қ����5À�?�uĨ�v"͔������
��HI|k֫�K�h��Co��#H��u���G�o
e�7�{��X�H��R��ݛ��1M�Z$nl8>B����3~���������L�u.��F|5qn_>=><�s�B]l)^h�؈��c���[��$.;x�2Ď=��vc�����|@������(�`"}�U��rC��概�xI��D�{x�@�{n7I�-��;s�/A���鍮��%(�?�gdb�=xZ_&�L�k� ,��� S�~,�����kh@�1�W'���Y�?�aQ��T
�4��
tr����p�z)b�+�斶��:M�3+�0���<�����K�/b6F����;���x�6 �z5�,������OJ<AK�L�є�B�`�J��h�^�A�N���ݔ&�u��\�(��:�#��;*1�G�M���С�Q1?��;�)OG}��/O�˓ݓ�]~��7�o��'����e�1��\ES��SNؼ����5���4G�m�kLcW��'�V���2O�Js���j��2�`lc�чA�!ll^��0�S3��'\2����t5������1��O�'P��3�Ģ��t߸�i�}C�ڭ+*�r�����=���zIwF%O�s�'բԠY��
�_u���2�[�u��bHy��j
a_ldyR�P,�����Gq����m
�n�?ZO�]p�>3.���~�i)��Z�n��>�y�Y1o�1�F[���=�R �a���'����I��o>�G�o��k|�_.�4皜��`Zs&���.X�)��޹��Ar��sj۔�����o_�:pZ8�uJ�?Z�{2��]�ޱɯ�K��v�V��G��S�!�s�W��-��s�c�?ʏ%*�0�&xq��0�n�;	39��
���m�L�v���eM%�Ugq��i����������i�M�Jp��}�r��4�V�=��MX����O���_�sT��,���u:b�}��~��ʫ�=���VG�~~ћ���l��q��{�����&̟ �	>���q�'8)��q!�&��BDmjƫM֥W�}b��oPK/WUWiD
N�!pip/_vendor/rich/color_triplet.py�S�n�@�#��q"�D
��.���kc��Y�%� �=�g�MA��{��Ό֩�k��U�|]j�x�ה�6eA��y޲��
c]h33���NS�x����P 3D*@�,�
a�-�"�t�؞-Sh��Z���/�)%
�> k�}�Xe�R�ڜ!'r�+��:��΄^@�������)�+�v**�.�P��9g��զ�u~�?~~�Ż�u���B�z�QH�������}��:_��(�d��bg'�V�t2B��:��;M]��A�'4*��(�B�羴����w�,��|��ݷ��CP�����+�P��4��辤��9@{y=�c�՛�jO��]�VX���En�o�雦��U~^Y_-�.ҍi��W��72�at,o�v<y�PK/WUW�LR��pip/_vendor/rich/columns.py�Y[o�6~�� <��m^
�@�l��u����X��V��T����9���.N��!1u?��9��]S�CS���DSK"���)����*�A���#�TӔ���DmhM�;��Α��:q;]=��>9�`��W������w!a�g��2%�}[�ٹa�8�n�-.R��W禰\��)��{o���b�eJ>�0��?�ܭ?r	�P��B0��2T�ɾ�`��Bˊ"P�/�Lݗ;��
�q��p�����e��O}�t����x1W�Cɤ�˾�%
��vE�^��lK�D��$�ٚԜ)�ܹYi���$�6����9qv�l�m�D�z!�#�(�x��e���M6�WQ�3�!&w��Rt��,��ࡕ�;�GSs��z�Sp1�!w&�%���E'���v�9���xY���M�M�lp�H��gC����c_�F��V�@f�O�Lo���'�.�M�K�o|8�"��ɏ��j�$!d�$&��Q�`E!���guf5)�Q!���J.��Yr��z��ؿ�\0�s�rF�IQ��rP��]���焮��uJ�x��h}�T��:"�_l=�NJ(�c�2u>�"�wIf�$�C�\�B�9�%/��\
z��R.�I�M�q��V$`5!�_�qj'B�N�M�o	z��)i�K�0
�x��YbҮ
�T`푀�/�L�;��FNل5-#%�2>?�I�Ŕ�̘3&�
�9�d[N2k�Q�|fL����";���22���>ccM�w��ό�}����7ա��vԴg�s[��0;��`;~�n�C��L��O�T£�a��VA<$a�w�s;�Lr�X���2����h���3�~�CԞ�[7��l_��n�B�*Cđ)`:b���T�t�!'�``V�Zc�
���W7**#1U����mS�)�M�J��l[�6}ݲ�gf�OW���Oʊ=R�oQ=#r���O��Y�x�[A�a�k3��
]�:�.��j����O��̥���H7���Ffg�j������%l)9q�B�'�Gro'L=|�	*��с�ɷ� �)t�
mV��7Ep�z��28A-;3�<N+w���s�}����de�:v�q�/f����߼���v�\`��F�Ω4�{�N�jNe��=����T���:�9<�*N�kt��L��S>`w}3�Tk�{��s���L���߷�&��9-�%��́N�/4ߞ\���!�f��p�]-�aXފ�X�갟5�����B.lzRm��a��{��\�,K��q�y��$xYL�o�ac���藚$k��'l^������BKZ��N�W��R�MeE�(W.�삙���>���Rsߑ���ͩ�-6�p���X+���}�C�U΋��ԟĸ~F&��D�T�s��ts!�����5f:4{]PhqO�+/X|ƦFz��
#�ș?̃O���Y�<����}~�C�YG�i94Pʗ�rʩ�p�u_P�,��̽��&��ɩSɵ��aR�}e�6�>@�$�*>]���툁�d�o^�P�w~��X+���s��g��=[�OS��¦��r�\6�Dck0(f��1���/���4�>�k�Tz9&�۠zQF��"8~��Hr�K�I
��ћ֤q���!7��|^Y�1���,�Ƕ����)�%f�7�1���l���J/\Jf3�"��	o.�|�+3�W�R�a�m��6$I/Ϳ?�1��B�3m<z��������[�oc'u�k��k��Vx�Z	�ɨY����u�W�y����v�T�-�P�7�
�'�F���n2w�A��Q�9�����6S_J�/��+�ىS	x������O!�o%vw���k��M�Zf�;퍚)Rs�����~#�X1����{7_�G3[�a8�7�/PK/WUW�YU��pip/_vendor/rich/console.py��vG�0�_OQ
�]2]lw�p��m�G"�$՞^�N�Ȳ�*tUA$�Gs�!�	�'�2.�y�H_�w�8G"P�y�����Kq���6)�f���{���m���EU_��͵y՞�y6/�3�����ޢ�.��t����o���玲�Y{���՜�̳6�-���]�<'�"_ڂy[\�����u9k�ji�\�٪�wgy�R���I��ۋ�~�7�l��x&��6����fY̸�E֞�糼X�S�񋪬ڪ,f��ze��]�]����8y]��K�~�f-?�f৩��\��K�������^�����r�{z�[^ӗ��r��.s��������}��h���l
я}ջ��z���ڢ*�%7�_�����-Ui�:ˠ��=̪XMҏy9��I]��'i�^.�E�4����ի����+���y�(xiQ.���4~1N�� ����eS]M��j�g��V�KX�tv��>�����&d�Z�Ƙ��n��=�5a��̓�Iz5J�ϒU��]d;IY%�J��'gb𳮫Zm��<��'i~Q�T�u����̖�����)l�̠���W{�ǯ���=��G���i�&��v/��~Y��f�y^���ը
�%���C,�ղeqVZ?��� 5���~]7m~1N�r��g��d���Җş��F�ڃ��"+[~^�����[;�}��?����0_��׼��땮�Ӑ5�-�׺l�5�ڬ�k�y���8�w<�0ez�Wٙ���1Nh�.U�m{m�ᯱ"S�Y9GT�%	CM���Kas�:?S����/~�̪U�5�g�}����ү�3�yG?���n�#�1�?��Q��SH#�Z��BѤ��.�b�ݷ������/�w_��?��S���כ��c���Cu��t����q�šc�s���H��,h�$�,��4��G��p����wy�*ThD�e�1�T�c.^5�*��y�_��훿���z��z�z�(�&O�|�}�r�=~|�Ǘ�/~�_��4�m�Q2�&����=�`^T
��߽C��N���d7x��|���u��k���w�y����v��.���),�k�VCS�e�v��r���bY]�`�r�u�j��X5E����\U�w�d�z~��g| �p���Z���X]`������r���x:��Bp:�i�*�(M'DU��j���?jF��p�GW�v;�N�'.���hu�lک���=x�����:{�{ FN�T|�XC髦څ=
8}p��`
E�;������ۗ�t��~�G<R6{-ut���b����'�>�g_���x��嘘3G�?�Z�9�hj5Q��a��bޞ�(���!���Ҍ�Qe��3���}���s�Auz��,ʼ���a����ט���D��$M�Ġ�i�oo�Ө����0�X�g��Z�Ɲ�T�ۺ��n��ΰ3�"����4���EY\�/������̮b5���5�Y����q�Vϋ�Պ�Re�� �8�ԫ��h��L��d^�*��vEI5�=~�K+qIw?�?d6)SP'Cur�m̊3�`~"
�c�w�~�d��5x~�|̖j�����<��LTń[@wi�^��~Y� 

�gWC}Q4P
�F��vg�.J�����)[��vp���Ŝ���tRAS�`��j�
@,���[)��#V���(Ҫ\^�|�%�!���EA�
���H��Z/��Za*I��J;��]J�m�'�'�m�E{>���`t��Gq��'�
�^��h�VQ��=S��5�*|<�&�`Oe3�{�����q����/�t�>��T���՜R���'a��#W�s�^��
��ʚ�W&bĈ bhF�C38������d��u�*4f#KG<85��n΍���S}M��xm�@o��;�-"��f���$�E4B{x�Ђ�)JE�Y>Dt����T���
�y��M=S߇�DŽ�}�8�j�|{���yl���T��So��@uA�w�����F�\N�o=0͆�ՔTp��%����z��;���ռ�����ცp*�E|<��S��.��F�	�4��W۞+��x��X�5�<�#�7�K5�[�y�3�!4����A�+�T1�vO&Y9��h���o���ZҴK/h/�A�~�ڰ�|� ���zEZ#
�q޶_F*�$��w����|��l
o�tMs�+����X��[=s
r�V��	lʓ�M��o�����V��S��#���wCѻ��V��/�dw�-��os�xp�?�;3����Y�����w�*�?�mj{���{��i�܇[���'23K��nЎ�LiL�A#�WcڡJ^�3�]���w�Wm�d2�e���6�(�G�]��4�4o�����RjHF&����쩻�y��m�Y����΂������Z��䞝	��J�46B�m�b��N�.*[.A��u���q���5�/�]�[���-�N��zS�J�z��\��u��(��ƫXП¢ryԦ�E�EV�]kU�b!�|Uhv`\�=p��ꇢ��"��6#7��hNhTP�4��.;�d��﯎gf=����\��^���o� y �h瞮	�T0�u��jb��Z'
5����
�X(2��&gư�Z6��~��+>����͔��(�ݕz|�>Q��tw���a{{�ۣ��S�gS}>�'�()ii���r}�h90��y�
-1C^��(R�*���̊?w���֡�Z-�
UBX:^��<��s��hV��j��0Op��J�UP�M�'��bhҭ�z�7�7)t�ˎV�v�n'zH=[�_�N��Mu%�=͋��u��>^�r�G�N:Z���g��ࡅ�I(�4p��PL�W���Q ��͚��[�/�
�&Ŕw�z�O%`i:�^�������lK���0�r!%��v����CUDO��̊��:���3�rN�@s�1��@͐}�
��O��Y��Tk�L����]��U���7@�
�.!��Ʉi�y��zd�A[t�(��T>FE��6�(��.Z��SK
r��g�~#��)5��V�K�ֿ��L�{P��jݜ�dm�Cw�s��![
���:`]Ts�^���V���c>#�g�!d18M�m14mjz�-�}�N�їw=3Ƞl*�Ȇ#�Ili&���ȭN���_ܗ�Y�>4�@.j�!�N׋2��P_ͺ�U�@��7'�j�!�"�1��9��`�|��>0ϗ�f{>����ڤzA%V�4
�!����	�{�R�4��GA�|)۠�s�&�NOLW‰��~F�8��&�b>�lԉ����]�iKz��tu��I�TKUf-���ԑ
ޖ<FO��b���u�T5ѳ1ѐk쩦u0�n��h/��/������r����b���ܘ�x�Q����N�k(x��L��;F ����S^�>ݨP6�^T���SNh�r5w5`�};v��i<0C@���5I^�1g�ཫr������!5���
��m�-�$܏<�b�I�j_W��P�.��K�<γg�::��w�]�\X��s���"哷�}�x(*��O��&v;4%<��p��ETRji�|u(��ʠ���hd��"�\j�;����LQ�l�S�M��9��3Lk�ODvs�g�I��k�؈("6�Ԉ�cR�#���E���%^�A	S�C���l,!X(�lHG� 1ߩ��B@��@�Cr�4gQ,�B�nVjQ]���Y��	w@py�N6��!��tq�-P
U�G�4EVћ�Mƃ�UK>�?��D�~B1V�)1E��0w��]��
��U{�b�*�gg�;����!��4�:��P���Xtg��ë�ѯ~#WO%�?JEsP���kt'���d2�~!�z�^0��|V�Y[1�˄��b4x�Si�%K�b�a�.�v�)�"������5��ʏj��i�64��z����t�?�Z\F�c�r� ��FW����'v[�B�%$���vJȾ!ݝ�‚�/�{�Y�شhҟ֫k�I4&ԝW�Ҥ�2�:�uY��*�:�� �+@�����/U�\��j��rizWf�Cձ�����)�?���i��5Щlb8ڢ��<_�v�:�4E"M�$Z�NSj`!x�YU��eL��r�d�aAX2�I�LT����p�b�x��×��(=|���^���ã���
wM������%�����#x�4+���P����2'�lڋ0h(>�І�bP���/��_�\F��~���7Tz�ף���)
.��Y=�te�RO�����VMK�'���6����+�N��8�:=M�w_���
y�]���$����pĩ7Q��>�x1c��W�LM��-�,ၽۧR	>esgl^۬�V�7�N�
�y�H�Oxץ�èC�oL
=��z
,�H�Sl�<��w��
;N������o�ۮ������o�s�Jc��B&J1o��il�ËǠ	2t�pxX^`�!N��N%%���^�3OJ�(���q�j���R�L(�C��:^Ts0��e�A,�*[*Q�D�1&�.��y�%��Q+���Jv�u!��
��x��n��Ă�ĝ����7������}�-�S��:�ꃢ�@\K��^�q��QҪu�e�a��m�7��:�fm�9
�Bo�XN{=��y=rcڃ0f��������*�i0�R�}̗��A�o`c�6��L���.��c�׀�\�M����Z��+��#y���ɉ=�NN��������=�NN&ɫ<��j�&[��nU}�	z�����3�n8b�h�ΌP����,���Ԣ����^Rg���M_4�b�;��%7�����mz"�)�a���@S-Z��k�(o�$�q&|�&��EM�6$t�!'[����X@��-�/��RQ��c�92�F�A7N�v�a!�*V�_*��nl�g �''��3݃E�b%�ǃ1t�/ܱ�cV�]��r�<�=;/��*��m���"72�m�[� ϐ����{�vQ}�����p��1��L���X�6 l��\_���V�v�I��R�ET� a�Z^�35�B��e�!ݼ)�t
/���Vl������7��6�����*Õ
���|=����]"���2����g������!�6�W�	B��S�}�|<;!G�9'�8�~c�a��;'�4��']z!<1�Q����5=��)�Qx:��@�������`��0ƺ�u�p�"k��-�YO�!��U�f�U�3�#PG1����	ͦ�V�m��r�&��O	8���6���"�DӢ�Z
�B���/���0�Ԡ���R��2��'F}�1<�Q�t[%�.���>D��/(��?�"+��;�o7ָ���h�$�j�ː�l����U���fK�yx��tp��Uy��R��Ǐ;�:�ph�#�eӏ�|��Y�}H��dpϦ�Ox>هH���‡�K�Qc�ե��H���_��)�]�S���5�~�vMhDO���Ǣ����v[7Ẅ́�oo��@��Y!E�ƞT�ѤPrMژ�ec�[͗�ꇞr�A�#�_�E�-K�{c
�cwY�%��ن�1F`c���)`�<@+�
�]@��Љq@���\�Y�8�!p�7Τf����k���q���KX�A�N��2�ad�l��(T}~�3qCm>�t`
ܻaTH� p�"�s�}�+���"2��Fm�|
t�J�q+N�C蚜vU],���Գ4����[K\g|�N�O��$84׍�Ћ�C5�������L���aU�do�ʠ�sq��q�����Jv��] �1jg�{{}a�ou��i8�a9x� 4U
���T��W}�gE;������+.�j��շ�tā�g�
 �=]��g�0�d�T�����t��x/�yš��%%��a#O
�w�;ez�L����T��5%�{��w�y0�#���t$�^`	9��Tke��/5��g�su����r潸����;���Eҵ��ؼr��
�<�M�A����l�MVh'Y��7���x��aU�S�2z(�'��n����^w�����_�S�{�,̡b
l8�p��p��4�S�d�9$M�ye��[��8��7f4Gph�cP�w�|7�3C��r���ɗ�*�'z���W���7�Ƨ6��K�И����A��{�\���u��u�q�cA~��9�jY*F p�������v�-�h��r��Ê���`�xx�idn���`^����.����� �IֺfX�$�*)8�t!�s�sh��85o��quHA�ؙ��Q�g��mq�ާh�"�K:6,.�Z3���BR��	s2w�"w�jϑ��3�И���<�>�
�&+�KW91���>I��j��{膓������8f�b���jz����&$dh>=tA��>#�.oݔ�e�פ�
�&�h�{��g��w�'.!����{��M��m=��8}v��!\�����uՠ������l���!H�_�SA�6g��`���*�g,��7�d�#&ϙ0��P���z�Ic�0`	/Z�;�
¨r,�md�N�ﱿ'd�e��hʯ�j���4�/Qد1��F�nT�
��A��<X"�I΄MC�ΊhS��cz�D�αA�cӂ�F�\��&��Ko����WJ ��u�Ћ6�s�l3�)J��7�����yW^c�#_��qv541j���!nF��c�	a�:e׃C�w�y-G�eu�x�� 8�s
�+��_�� "n������]Į�dꛞ_��c;�
/'�*��v�p��z=�C&��n�q�9�/� NC��k�D
&;EPqm@L6�LXń�CJ?�$�#�#��d�k��(�Ŏαd#��#�#�{��'��u/�Y8<��=��W�~�`�`����؏��g���r�Pm��M�
ƍ+b���=�x;,ʿ5(�Aw�~r�ױN'��sy���wK��x�_n�2Iw�`
�wt88(U��G�Y-�k؏���f���D�S�-"�/�K_��P�lwI���7�F�↎����3�x�v�sf,y@5m2O�Do@\(=���M��-,��I�Z��C�!6��G�jE&)Y�-���&�<�;ݶ��3�
^��u���e��=��Iw
CXb=�����w����ZH��-�����q#�u�ݷP���҂�6�|.-�l�24}��M<:0����'�7���2Z\��Co��"?����&Wm�E�hz�vbD�!X�&����&���V�C0�a�.�H]~�[!���`1�b{c���V+m\��w̗�t����n�U�,�u�$��G��hVy�-ů��������a(ӖB��==f�f�(7똯�p�+�c���^�+��ў��ZՅ���u��7j�񺛧��*/�.B��1�Z'�ܔ�z��"I|�s�ɣ���E7޴�oq7tS�U�1�xk�
�r��bؿy�M�h1��	��f��:���爃����w�C?�r&$y7ϛ�z0NH#oSQM.���Q�e��"��t]o���.��
́�P�y���0�N���8_���"���B8v�;�$����6��e�5�;Az�|r6O�u�x��`s�<�v=��^��j/��@=�KC����w#~w̃�%m���*ؠb�����v���<�e~<�������0�*� p��1��"V��X��֋ΪA�m/�5c�U1\�g
-)�R-M�^`��4�لy9��d�4��A1_����v�S�|�Sͮ�@y_�aF��9����@�v����0�A�:��dV6�J���,n_��u�4?s=ס;�{6�.�Hz����ў
��⸬�ZW��K����/����f}�;(���2�͈FK44p�ND�����F��m#�F�]��h�^\�H�@Uc��VŸa�s�
陴��i�BL��=o���]��?�41��@�Q�%bG~�]@�T�yz��Ã-ZM^>:H��1w���e
$�B#����,�Hŀ�_Q��q���닪�����(1u��=����	�K,%����}���
l����|�����	T~(��rу+{�5��}agэ?����H�)r���\bk�L��G��T<���q߹7%���[��z�>������f�
�_n1�S)��K�J���e�I~�|S#��B�kO�N�,@f夅��:��|mz�M��tl�3�M�~й���;-�����[������_	x=^��朱ܳ�o���tel�)��!Z�z�A|�w�)V(Ƅ�X��qrp�_Fث7uu��k
{o�^���nZ	ĄE��S-�Q���<_t�[�k.b�|�����t���γv�oiA{w�٘�)p#ػ���~�ǁg0|��|��

xPլ�|=�h��ƂP���{A�z�vt�)%v~d
��'B�,C'^�c�b��2L�7�Ɂg�ghb�"w�c��7��&� \�O��K��H7���d�8���������s��tx�����A�a�c`��
C�f��(�����Hi,s�[�����u�
=+�ק�u��c�4�]3����@D��8�1�zߛ<4:�A��MiAK�+�{���O7b�e�%&\Yg�}(v_	�k�G�@�d� IF����@'L��M�d�y�~��L�=���y�U�2T
Q����H0�X�'�BE�-�m��ʔ�#��]�gϞ��#oitt��^�|]����e�2Xw�dB��?=�L&��
C>xwZA�05a�[����*�����w���F��Θ��hSz_�X�so}p��QO��Fi�e�TC'��"�;�J�A��0��/��/�3̆Ӈ���#+��s�6#v����9�.&H�(��)f�LR?��c5>���涽^3�U�
��e�r=~�1��b|�e��M}���D'����t@P��`43}uI�6D����r�BPA�8~��� �E�����F/{a�
�VH�%E���q�}�dӦ�L�0ꊷ��%:��X�Mo��6H��=Feݡا���1�ix;N�qpP��|�ܜ�?��H�ً��dz'ܒ��U>���
�	�)�.�q9�Os|蝝�0��tHy;��	�^����6l�&3�qv�M��K�s���߇�Uՠ��W�pM�wI@�u���&�&�Dյ:�:�H��6k�~�U���d�{٤Ye	��6 �¼j�A�:��ݡV&\ĩ����R�=y,C[,e?OW����O'_���#l��{�O'$)����Ž�6#�Q�W2̆B�c���s�aX,��MΨ@V|���y‘�2E�R#/h.D��t��q�u��h~j�!��_Pb���'*�]��ǚ�Aq��:6W�
kxM(d�$B�>��o���mr�:(,,c������Dld��Gކ��\=
qSwC�՟���˔�R�_~A��S�ߏ|��4|slՂ�?hA�D�"��$$��Mr<�v��K�ݿϡN�yR��Ǣ)N�e�^	���VZ(��:�(�vƪ���N�%nx=�M�E�6HŐf[�ܞN�dpC�K1��U�C4�3��
(M��eCɕ3�뱨���|!o<a^�8��cüq�2P�6���i{����U�z�������34ǡ�DIf�l��xEmUl���"����:\�#Wz��zP�c���6���4�3omO����-A	$`�s	�6E��F���0�����li��8�pw4�H��qr���uA���|K2��X��Ǭ��NT!��y��F�`L��
��[�vXO��=��j��Ƅ
e�P_�R$��U�Z����լf��ǘ�1u�	;�eܜ��p��dv���?5�g`�T]\��Ե�����h�Iq�4j/���r?i(
Q/V<��	���E����ާ��}�S�j5 �\�IQ|��m;��;b�G ̘Ȯ�����8Ӧ���=�p���p��+`���Jt�2�@T�ˬ����zn*[�֘��(�WI�p�ө&a�\���*ogKp�O8�f.��(���&��\�]uP�̲)����§���Os��T�Br1+�Y���A�ݽܜݛ�F"�vaS��R�DH�𬧓4��fIu<���W9]����:S'3Wv!����5*�ʇ�?���h�k���h��B��d�%�4�����Y4:�<�m��VG�M.���{+t�����02�C���E4("n�"�g�7�3���M%P���Z�n��B��f86�}2�=fذ���hY*f��K�[{{��a��S�מ�hc-ӫr���:aZ�"��: -�B�����N6Ή�h��U�so'ډM�6�dj%▕	N�Z���9-l{��a���L�{�4Ƙ���ɷS���ѡ��]3A�F�%\��:�̧�B.n�O���Q_.j��q	�q$'.�β�T��5�E=%:f��Ai���z�E�ڌ��� ���/�.��Cb�e�{7g�	�=1C�7s�J1����I�I�bT�=�d��V�J\*�Uq+�S��e�!��eN;�SH���
A��k���P^���,N��۰U��Ѭ!����ήԵ�(k$�'��{�"�Ӭ4]zGo��B��37�qFG�	���e�G��<��M��ѥm*���o-�_Q
���\�2{�tUA����
a�^F�U=x�=�;��Jӄ��fM;�Q��"�ă���_v`c�
�@\�M/��x$�%��g8�Y������S]41p����+#����q�����2�1�	�75h`�9�T`�>>G�ώ׿�S$�!p���$��a		ŕ��e-���ە?ԟ�-�pK��(ޑ�ߓY��~�5m.,31�&�j}�\�'=~
��Y�fF�Y�07<��E5-�J�Ε?$�-ճ4��#BP��&W�z�b)9��A)�&@�T�*��\�S�g�����Z��C���
��u{�Ì�2�2%�;ט�Xe���`J�C���!뜸uQ&H�&:�NIv����lBI�[�����8�źF�1�-;��Q�-��:�]���ZIqSo��b�A-�uv	"�iU�aW��_��gI	�E���]
t�Rb0�*o���Fc�i[f�9A7$�aT���dl*7Du�m�t�����n�9�v��<��HQq]��jw�To;(a�A�1'���' �����	Z�V2�{��hҴ5���i����¹�	��̃� rН�мgͅ8/�h����	mj�uŭ��ʃ���������%֢Y�<|=�f�,�4�6u��ψ�՜�(N������l����]ImΩ��]@��F���qY̳�0�\l�Gu\ԙ�&�0Y����f%�g��.�9�ĝ���p�����{ǰ�C c���˿�İ���ܲ�&�O���6ah�ぜ�������Z���2Z�����K���4�f?���XHW�?ӓ�(�l��,�`bj�*�TiCN ��iC1�Oiے�=�6��烗DZ;м��{h�f#(�}(�!��t�x�S� �q"�,9,UN˅
y}m�vu6a�,��L��r��
C�9EBC=��w�kc�}�/��o��q�d�5�`�Ic[$y�~cZ�c��sn(_.�US4[��)?7�w��A�5��%֔'…�ӕnn�J޾�ts#2	��hjSJ�E��,�>�t+aH�2�S$7I�y�
E'�8��M{VZgt|>�ȑ��� �k�^�B$��EP�Wͼs��ݞy|2�q�T�c����ƨ
��2;8ESgj;
�HS1���[e�DS���?���bѧn�T4��+'kR$_�}���Lr�™���e�1O�oX@�u���b):��(���K����0}\��8?Ĺ��;��xUd5 �C�d���[s2�V,}5�J��r+J%<E�ԕ-/N�$ع�FȈ�Xx��8#X*NJ�L��G��i�Ёm��^�}��+3�/��j
^c���
դ��g��f�_�;LƑ���v�>��}~]��W}�0���8�4������A�]-*9G��}�4�Qd��<ApG�؅�quAwZ?
�4�AE��p(hMY�78Eq8'_k�YY�
]�mv��r�桂]A���	�<����u^����ƴ��eŒn3!�)��
L^c� �O������R
����VB�庤&�A��k�����'T��d�%f�Z~�'CV�0T�=1����L��)e#LzԚ���U�V��I']1y��M0��Ό�l�&WGF��>�y{	I$Uͳ6�8{�W��Юʝ��A��҈:$�H�D{~y���l��W�Az[��bd���H�h�Aԅ�Bm������0�5�NT7�VJ��[t`�S� <�C=TX�D��p}�0LdL�J(��BI�U��Ό!���P�������7��.@r4�hр��4�u7G#O!f�&��Yci��I�җ;J�e�Yd�Ot�Ōh��1i`���E�IE�r���J��䧪(�6>�@������x���ؕ�mWx�[ہ�q�F�MCŽ��$k,B4��9�������EX�1|�e�0�Y�ЧH/�PgC�i~��P��}�eѶm�Q,f{��kF~obrC��V����fP ��w���‚�m՘MqU��#�<�vT�lBQ�}(�ڗ�*aH��"�)@E�>�2����8������lw�=�%呸�Q�9��>�,��4xQg���/�5_�Pe�(�i��#�n(_�j�Q�BF�0��s�����ݰA]��`3�����@��z��o�y�pD���q]#�/9\���)�u�>�o�v�>\/��o���\K��;�S��q
S���^��jpK�ZH����Pq�{YbP��*"PNd`�R7���)���<�\V��;U�[�X/�F�'Og&^?��Zĸ��E�b�3��v@��C I�ULo�n�(�#�C�@�"�B����鍧]��g���������)�T]>\��er���|G,��"#u�Do�Ķ�䲂��+<+I^'�%���U�y���P��ui�<jȕ�%��EN��i�(y��M��X���F��%� .��B�
�.ܿ�O'��W��s/��?�կ$����'	o�-8�lv��zO�U$����&q��������O��3������B;ԊL�}��0�ySV)l��k�	si2 S���.�cY�
b�b:w�eH�oa��QK�O���	�-����̯Œcbp��n�mR��F:m�è������G۪Cs�?�*:K~����IgxFF��	���a~�v�6�0����$&-�����{K_V�9��N����[�⯢�ޢ��J)�EW8��C�^���\k?�]��CJ�M{����~*�]�0ۆ��+��^��8EP�e̗ɾ&V�D^
\���҉�@# �`���M����4�}��I`�ߐ��;�p�*́.x֌-��!'JD��NN~w�dT˫ϔib�S�ƞ��,D�ܾf-�yh�5=�]�"A�TuC@;�K"MBCL�cI�����|�r��4	��o��E���䫈aV���hh$5�KWs���ݻJQ�:8��3�]zƠ��F�Y�4΄��Q�N�N��W�߈,�FY�PH���07����#L�C�U��v��ߋL2%L�r&����5�0�kڿ�/8�Ӑ{�	R0��\��N�s�x�����W��f`��f��m�$��~�|b�G���y$��#��������ϓ}�J�H���2�����G2ƻa}��K�@#�E"��u'|�%O��a��,�`o*=�]z�E�)VS��ukqȧ�����콤6ct|r�
�t=�����F�Y-O����T~T(��P
F�}�� 7�C�_�PX!_HV���Oe�O����C�J?��Qwb����fͬ(����㬨g�eVw��-ՙ��Y��>49�y+��
�"�,j���A�R�*����G���U���4��hŜ^�i+`I����Rz��W8���ua}���
G��veY�f�՘��C��6^�
Zs�aCG�e��l5�vY�`������I���ګ�%���Q�C�����$��z�̲��\�}��s��i����3�������;;%�
���le��%�6s�ڍ����P�,O�4��tw�{8�'ǻGX�S�p����OXGB=Uv���1����1��y1��5"J�W��b5I?*z^�����GW��MG<ԛ3����w:���^
6x�������,Θ�OS�-&I٭1�?¢.�Oݟaq��S�-,�88
B��A�e��o]rWxf�@��t�g���	��A\|��BAR����������?ԟFɿ��lF[ ODx�A��2�ʈ�?o��V}��o��#�:���)��c��g�����֭�����8�J#�&g�f��&�9!S��]Zӻua\P�:T�!?B��0v��E�4�e���#����D8Wz�NU/M�uXﺫ��s	21�v�-�	E�&_�Z�Fg��ǽ��=�16�xo�)�p�+�a:��� �0�A�;��o��<�F��+$���xQ
�w󎔦!!2�x�K�N��qr=|҈��B3夵u�XI��p�]Aa�����#��h^4hV�a�"v4���k�o&Q4V�^z'Z��"�iœ��E��$V��E�T�?mMl�O���讄�ƯG�IJ�K� FBz
.���0�E_����
��򶆧��q4Tv�ȓ���	�����c�2K^ћ�a�n��4JpC�6q�
��YVj:�@�������P�)�V���C�CR���.l���z�E� ��<�&KHif���Ğ��[�)�����c��1;�5���KC����2�P��w�sm�b����>\�/\��.5��!*��ڄ����y����q�[��^,��v��F��¾[��n@�EЪh��¨t1����%��Hx��נ�/�LC���96�0�͡z@ �l��Nj�:�*.���߃�Qa�T��K	Y�fN�����T���T����ב��H@2��S�}�����jj���c*����;�_|�I�S�U�78V�3Sbη`�BFG�����&�)���F�11��^�j�X~'��jE\��^�X��
lOdMA)�<b1��Ŭ����b+P�	�d��~;f-�.���N��5��c?�U��qX�b�8t@���MP[E���.r�B`;�ۇ�&�E,�s��4�J�m��T�c�b�S���i@��2B_=H�Z͊Lg[�C��g��JH��HĚ����
��%�k�)�g�K4���Q/���r%n����L~�Xo� ��+Y�|�>K�6�u�ù+Q��t��N;O�|y^�W�؃
m��/��C}8�.^9QnЌ'�w�n��Y�Z��o��J�F��#�~��I=�6��4��(,MT�
G�hx�;{��&^���g.�vߐWHo������d�fo�N�]RqR���l��Έ��̋e� �����/��׉N�O�������3'��vÒ���z�V�����k�){r{tr��#��n��
��Da��(1�w%ꄈ��K[����,a���wS��9|�9�8߿`�X
��3a�6�x��#��e)(�8F�����5`�0|3��k�L��$;m��P�v�2H�^)Px���w���'U��l���M�o���+.m9��a�U�1��T�L0'꨼h"�/�W�ª�3��'(��&N܎��U�|hũr��w�{z:��x��K����bw@�px��4�`Sc�
Zfx2��h0��:
O5*w"��oaAw1\���I�ս��T����ַ5���	�m�g#&21�Y�0��!&gw g89��t�8��� �D�!��a>9�������1��H�u�&�0�I&y<9��,e�P#���3E���*	���[�O7I���j�:��O��7/E�t���r%2E�L=C�:��:�LC����/�>Yb� �@\�w��.��/�[o�u%DQ��p�P�)moߜ^{�^�E7PW�tK� R�Dk���U��]d;����$?Q��մƝ�-�Ek�K��c���E�0~�nZA��-�y�?��q��Q�=|�|��s����?����5�vwK�A�TPp<��	����q�^��6��7�ozt�B�;��}}��=~�x#�QQxD���0�Q���΄���gr)��Yt�n�h߻G��Ӎx�M/+���Z�:��is�(6u3:��1W�>N���!��K��P�`��w�y�N֟ϒ�s�eh�޴sЃ���v�Ʌ����98����!V�x޶�f�ѣ�����9XN���Q�4�?}���})�L
v}:�U�̣�EPͣ��>���`?�&�n��*�&���8�����E-�|��oP���:�����X���F�E�DX�	>���
���2�=S�](�5W�ҵ�G��er�N"�X���_��}��_鏇/���f�i� y��ɣGɗ�X�G�}@�9"g��Զ��*|pN�a���g�ПӬ���\��0��S�F�ş~�۾OS�#L�>���إ��펷-|�*Bӟ��W��Xx �4+[��-�v\D=D+���AYoS�VSi�ҁ{C���m}>���UM5鷜ӟ7���%��W�(��˦/�~S�a>�d1��O>��|���*�͐�<y����_��??x�r��)R(x{]�y+Q B������R��8�6�@��o e?w]�%ք֣[���X,��y��D�IWj̼�N��������R%�9�D��ï&Rx�~���9���;$�)5�桧T�ܢ.�>5��pcb_�L���ǁ��0��,�a�8_S�*���qJE�L^���+�q���5�)e�O5[����]ŝ���3^m�xٰ\Cg	iI(�h��	1o�^c�A8(=3D��|n7SQ��#�����j�	��M���l}�ʚ;��QbЗ�G&�� �
��8pn/3�'Ȋ#g�s4��'��K�d3.B��Q,�ev���A�#UQ�7(|�o�K%C$;�u9�9�vO�aL�U���/��Pk�$�&`�";���y��2Ge`؆�vNԔ͡�	ۮ�<���E�n��ɲ����`��@.`��0r4��*įջ�z��A����
�d��M��l3����l��!����9��FCd��!ap<w ��4��\b�P�ĹN��$���n���;b�;���#`�թ,f�B����:�+�������c�gf�S07�o��>(���1Oڔ�lp��	��L&zw}�cMe"��
�-=ͯ@�E��9�X
�)�쳢t�̑"P4X4�q���MrtJ��U�z=S$d��ٟH�|��d��!��I�iر�S���Hr
�@Q�u�
�|=��oH���2r�����,GAh�;�0��s��A�|4N��a��`�"�T�Z��L�(#�A��d����"�x�4Wet�OFjc�a2?���iLa��nod�b{w���PK�]ᗶ�|��g�n�0 ���������*�	��б��.�\�S��[ӥশ�0��=�H&��	����
mc8���n�5�OX����7���צn�,I��<�pV����
b.�28I^�n$\�A)�gQ�3��`0����<�:��х���y{���'�h<f��GB[��.���z�lr�,J�n�a���_���qvtf�K�"ްMa��[�s�o���Z�����s������I�U����7
L~VW�r��~(�߿w���h~5瘔U���oh���t�N$&���:`L?i�����:�a�V�p�9��E�AD
l���[m�gMAy�gk��W�*�,���n�����|>��u��6;�A,��"�\�)&K�]�]�0P��	���Z����W��b�ݷ������/�w_��?��
����f�r�L���G��R����׻��e�B:! �j��]yI�@�g���Q�s����EQ��ص�kW��4N�"ڷ�ޜOD�5zt���J3��ԉ�a0Y�c�c��*wk����
~���7Yr^����V�4xv>}�({v�W?J0��pҒ�
�@@�wϐ���+�h&勎X�||ZJ�hpZ���1��Jى�a�5x�~�l�ו��%�'O~q�-��ٟO�;c��|w;:�!��P��/��f���G*���@�O��,nQ��e�N�=�{
�n��7{��͍���ӧ���{��'WrG����xJ�0G�ԙПpC����q1��]�گa1�Ni�M��⚜�Wa=�2�z�IW�_^�w&����'+�����Fx�ۊU�:��
�}H)�T��&:Xl.��w��w��.�Iq
��U��� o,��T!u��T|w/����k�`��.����@NJ.�a ��෦�G�> ��=��7�5(_w�ŲB����Ol�uY�}��żO�Ul��+�L��^�o��RX�ܖ�R�Ց�X'�����T��I�����[R�spsv�+���ل��Q�0�u��]ɳ�Xvf����j�&��LQ��2��Ġ	Ȍ�8�5�4�9�7�z�F.�:�L��5�������Øm�yo��?
Lj����84�!/�axNNL��`ר��
�$4�D�7Q�9N��#}RaFA�b�q_�bE��i�@�j��S4�d���wE
>a���b����P'
Ĩ�ԉ}_������$�h$WR]�R0|�?�꫺:Ux��1/���b�M���*)���zY�6&���Bi	��Z��LN��Ϗ���'%0��̛�t/׎9G��_%�V
+���O���15:n�|�)���Z��W�,_.�	?R%��J$nͲ�y�J�#�u0��d���ik>���5�(=������_
�HG�9C1
�6���8i�=�t��.�%��;��
�3p�]�׵�
M�b~V�Y��}M��bS��3�Ӛ�R-�da�gu�d�S�x��g�ዋ=��Ђ��mǢ��v4F)T��IL3���b�m��c3��E�J�P�b��g�C�XQ�/Gql�U���;ɍ��}Յ��i��8�@�^�:+�r��h�e1�$oY��o]@� ?/�
\Pd=���{v��\�>2��>l�"��|e��7V�pn7Bb����g��������zspx��%BT�c���n���NMX���,� �L%Y4�֓�ӧ�KJ�;+ʴ�,�O��5C^�Vm[]��@���	��Q�<�6�|�Э|�1̈́�����v�d9%?w[*�ɒ����?Vݒ����5L3b�?w'UDUx�Zݭ�łPh�Yuӛn9X�Z��(�0����_��
06�C9��u���Y�S8��\�6���]&/5&\y���ٓ?>v6:�i����]�1Nq��+uȕɃY�hЩ�$�����5�תI�����E!|��L��5�5ӽ&�.����mǛ�(�l��4f1`ԡ��1I��UgU�a�j*��R5Д'�bvX�-��|�,ah�� ��Ka�F��F�}�i^�`d�q��J�j4���f����X�Oɍǧg7�^��yDExO���M�G�ѝ.�EPx�ۻn�]$n�폅�Ю{�Du+/E�d��
;����@�8����,��I6_�O;:�-�B�ZǶ���|3�P��nwV�u�טD���K��Iţ�mX��o�/7��zl�n�r}���ao89G��g:^�O�o��n[�M�?��ry�#t�����[~��Q����=�|�5�뾨C,Zڜp��!q
��������#���
b	|γF�I$Y��8��Ѹ皰���#�u�N��l1.v�85"�##n7�B05����l�l�Lz�u�{��6��+*�L|��C" �Ƨ��@�؝�n�ɜN�\%�g��bR��g��`=�M���^)��JQ����ת��>W�W��(+����ˉ��O�nh�9v��Ħ�Y]4���Y��L^W�� �d�`F4�� 
 ��
h��$�
�'%����p)��X��iCs?���_F��n��*�W�-��V\�r��1�Jn�?��'��+8F=r�� (8)�X9dl{��")ū���,^��;�Ǻ�e]�h�
���t��<ê7����_S��8���Dg�=;r
�y���̗qŀ�&ρ����ىyZ��)��9�ѢƟ��$7����|�4�T������Y�~t_85�G�-��κ��"�I}	Vݕˡ�|�����Q��Y��hk`����6%�稟����鄧���WJ�>��A}v�
�~��X�{<��+ORa�t��{{5z'���ꗼT7˝i�c�7�n��j��8��(���ۆK��-�x>�Z\��3�9t�\F,�+,F�@t���yUO�|�s��;�z���������-|b���V*�L�n��O�8~�t������`�p5<$�k�����M�����W<��iG�t�4���O��}����3��Q�)!�cN��S��32Dg�u�v���s��O�`G��I&O:�0�8��Ũ��CoMl���8�J�ސn�*�Jy�B
�@]`CL�J�QB��u��5�?�j6S/�X�Pг��1��`����n�Zm�&���A����P,�O/Y(��A��f`����n��ؿ��Y7䅤-�s���T����6�O�'�
�8�_�[M��p�a�?��8Ϛsx�^d�A�!Fn�1�:�%d��tˢ��Qٹ��^sm�ENC�<ҹ�.�W��H��?/?�K5'>�F��zǤ�:'o<5>�b��馾A0�{J�KQÖ��~�R�t��^�S}l�i�⦦�Nz������<O��ț�ݣ��b��D�v!/��A�ij?5UY�fj8���Ǟ�7�t
�Y�B>W_d��:�hT�%:�뼄�_>��������<C����/��6/���ɛ����ɧ$�X�C.=�*Sl���â�.���oԩ�^�W��{/s�j(�7@����Z/��L�p����7�0B�vX�����H�.���k���%��M������bΓ��,�����U�!�v�\�i��Iv˳�{�����
�W�9���ZD��J?��V#���Cާj�3�(0��@�>�<\@b��ۥN��`�WJ��"6�.�����b{��M�䋭&�ID���P��n�'O����m�?NTϿ'_n�/ﺜ��'&M�PK/WUW�L�I�pip/_vendor/rich/constrain.py��Mo�0��'���c��V��Q�FI�h/QT!/�# ۴�_�
�����;�<3�i�`/�g`�S���2%)/���<|�9�}}�M�fВ���Xԓ���޳W&�B 5��Iq��M֬]w	���*%��s�o��s�Q֨�����D�s�!�85f��2�ń�ϗ��|�E��jۂj����*�?�_(A���v����V�Аd4��g�m��gk�|��:�`e��2&m*|stx��2ыEQ���%��`�wW�T�����d�ٲ��pv��q�§�����~�����<(�K݃���G�k�/b��c2ͪ�C�WQ���!��d�waF�1v�L��H^7�
3�r�ua��ma���論�L���D����1S&�D.�����^��o@�$t �d�b�?����Z�_g�����Je�h�ڴX,�K>e'g�Y5�.���4(�����?PK/WUW�.��ypip/_vendor/rich/containers.py�XM��6��W�
H�V�s4�A�i�Q��a\���P� R����Re�N��PT�)Λ7o��x�F�LZ�X��a��uc�GY�JWa����ա�/</��[ݤ��F	7z)�uooj+uŕ�Z�����Q�����q�u��/��g?>���?��d���xrE�Z�ӕ�J�����}HO'%3��+��W��~�~�oO�ߊj/��´ʞ΢��O�V�َ�5�/��P��8ȕ���Rp�6}h�ܰX_�u�Z]G �b��1�d���)S�f���(wG��Jpn
-�f5�G���/e/
�粒6���PEꁜ�>㛮$6�X�h��u%�H��[�F�Y>BŊ��3���4�Җ�1��`�m���6�P�U�F�?�X�*J�vu5�B��0��v�!`P��x�����l�����*qu���PR:�{)����D�I<����x����K�0��%(0����q�-,�ddY�&����ۭr
��|�V#�Fض�BV�2e�s^��5+�]�cd0'˶$J�,2܄�n���>a�$�J	:(Z^נE|�'W�t�|Ζ�<Z��� ��
e�f�v~��N�@�x�o8�^B������)�u`9M!\� v�HrVo��ހ�4>5D=���fQ���W͟I�I}��(\R5��]w�ذ�`u��"Aǻ��nS���A�e�(���6�y�څ
a����u���J Ȇ@��[sV��}�ŭC�NJ[4[
���h����/1�:���E1�9���H�;�;�p��c����	`q��k]O��}���43YD2
@߹��${�h&���[��GW��������6���
̵�na�ѥŅV{�xF-H��g��P�z\���E���y�N�߮y�}|ɪ�ұ�,�v"$��Z��my���;��,v�5̠�c;���D�vW��(8�z���5^�Ϊ�E;�xE�oE�T�`E����FY�B�3��%:�_x�5�&�
r?dm�9�IK��x�H�]�u��]��ӄ�Pӡ�R�%>$�m�jǭ�)Yiں{IY���
Z<�Nhx��	�Ėu�|!�3v�=G�bgȮ��m�������x��=�A�s�8����|a\�������L�EՖ��Q�3�<��ل&�r95Çn�ɗ[��
������qĢ� �.7�Ŧ-�^�ⵠ�p�!���M�w��z{�{��_�Yt��
�"`��T%�{4������q8��X�|��kj�t໡�8n�#�mك�L�3�\\��_`w��,�9�������OKl�6S�Pb_����U�8��d\�������N��r����)�k����u�H��0����
K��:�&rns]&��~������A��\�{t�X�x�/V��X����;n��,�X?L6�g�MW���O��u@ ���se37X50J�wZV�s�,�PK/WUW;!��pip/_vendor/rich/control.py�Y�r�6��S�e/B�\��l'�:NW��XY�Hr�NjB$$���bi2��9z�W�#� )R�$'���$p��$Z�\H��Y+2�2Z��L��u%s��'?\��{�w���]��8�Ә�p҅�dŒ�Q��$�I�������$Jf^���܅��v���U�и��UH�(��{��\x����d��j;��T���!�pd�2:y�/X"�.O��q��(y>��S�
�V��{E$/@�<f45t��a*�p.�Pl&F,[ƈ8��zפ;LF�>�{�۹�gp��_�J�s�z�����,��s��z�{&d�VI�f�����f��f��R!":g �\��u�*�0BMF���ߙ��>h��R%�
�0�qQ��(��Z[�b�w;�;�/�`�{G-��G�|tz����3=���z(pX�ْW��Ug�־y��m����<2)��J*���~b���T�N^�T��h���ȟ܌�
���rx��@O���M�}�3�&|��J�9�ӟ�qw��]ߝ�������c��
[Ǘ÷�{3w����WM�.{��M<1��.�!��.�03�>�����÷�Û�oF�y�]��ݿ���}s�b?���{�L������z|y��u�k�:c�������xsT�r�ʅ�f�y�a�7��؟�����&��2�1+P�N���'>�A�Q�
b�e�ɴ�eu0_���=U�&ü���iA�"��`�Ljפӥ�]�+K�q�x-������S�;�ӆk�E*qc��b�Te9	,��L Ӷ����"
�Ul�#�d�̑�d�~r��\|V��$�?��ds��gð���	�b.3BT��r�֝Y�	�$����gn�S�T��Zm�T�;��Rg�5r��@��ꖲJ?[Q�`��2<I���ɪ���nNJ����C�)��/�D*ɂ�Ȳ)×��?XhdFj��~��d���*�;�ii��)eB�m������N��^�,Ί��]��Vv�`�9�jB��<,�s����L������z�H]��'�"~�)g٘D�x@{���z��׫M8���Dmyi5�B�CB��UB��j��@����?R8�b*#��8%��b��]�\�~+����c��2&���X��\.�GZ�-�_��V���O,��+㼰��I�#�ֶ�`�"�ΥH�gՠ�Q`���{�:�C�w�+�[�Q�K8)"�FTA��N3{��9ے��+I�5@����z���F�3$ZZy���Q9;�oH�8;���"�����<��Jstw�TA��SS��5�0̝U�
�p�g�@{ �dj�;��PpÙ���|�ώ����m��}@���y��5��
��p���禹�b�W�Ot���nX�&�c����v�v,��G6����B�6��qW����ߕ�u����;��Č�#���ht�f�`�Q�S���g�����0g�&�0�<> ��ԍ�>
��� <F�Jg�\T�ۍ�J3xHxKbladg�*{G��5��?�2��@MFE�rȚ���l��vw:���n^����6�,��$c���R}ʁ�T9�o���%!���|(5A�M!a{P>%p���\�"vL�L��Ek��6p���I����#�{���ҭ��b��*�c��˟�BƾՇ�����oS7���T���ձ)E��Z`��j�"M2��b6οy�RM��=ܵ��SM3�o�Q��WWd�����:Zd�30�g��
�n�"�����_%	�
���[r-\蕽n張x�)�m�8�EYД6���U�V�L�X�63�i�mM��\$�2��_��{3�:����+<�ys�wS�����<:�}&j�s,ZͰ�Y���{d����k����:�v<J�ڍ�
|�_?�4?�}���b�v��~#��>�?ͳ�N~/X|)v��,��D��%<��s��q�7��/b��!Rށf�3��ĩ��h>x�!Fb
�����}NC<<�˳�)D�:����b�R���i�PK/WUW�����"pip/_vendor/rich/default_styles.py�Y[o�6~���P�&��.����t ��0-�2�TI*�;��ԅ)�I���<�w�s��!��JԱ&�LHUs���P��^2��w�[�c�����?>��w~�x{c�I%R�;�$�.��d����XC�j�Z���N�2c�O�)���QC�2��rR�#���;hNw�1�%�x�a;,(a8P�����X�@C�Y���Ƚ�|���F݉w�� �Ayb����ŽԘ�aN��iy�w}�V�9�&��G�nu��H��x�;�
���.Vn��/}���h���8��C���bXG��vp�h7�N\
��`;�S�ǘv�U��L�1��czD�lf�<��c��c�d��!��Ī�$\���L`ϡ��8�;E�m)S8M"���GV�P2b��3���=�t��[P$��X.�i/��@Q�Ic��z6%z�y1Y�:��
ζ\D��g5%8�p�Zy�Ey�2�2�l��؟b����q���,�����L�Y�h7vD
U�f�+�\����)O��#��a	�Xa�H0‚<�y?�x�� ��&=AN�X�UVM�U�bE��T��
K��WXJ(��j��Q�a���o�
S�H����jC�a�&�:���[��H��0�*tC�73���h~w��qC޼{)�e�U�̥BB���1�f��;������&*��5���NϠ�K�х���0QZ�9JΛǜS���L������nk'Z'�����*J��	.r7	�4W"��˔h�3�Z���ç��uiҏ�C��z���8�^4
	��VM�CTݬM�O%� Ot��'���zN�߻f��}�V�I�O�$g�
�ż<���������G-����(��#��v7����(YYV8)pPVg�%v���#F, �[�m�|d��yV��R��j����#������L7�$l�λ�Y5�[I�P��vp=A�1��-jϹ:�*0�h'�\Eg�'Z5�V��0�V�ʰE�\w����pfpkU�)�jq
���=v��9�K�]�c�S��c=_�N�bjy|�wo[gM�EpLG�r�R/��.���(���7?�W�ҋ�7k��'��C�!8N/��N�.|N�D
��$PD`�RB��p���3����L�9.z���*��d����	8�����F��^cQ�]N�GE�
���{�֏ҵn�	��˚0v��.�9��,�w��5/����.��I�R��0
q7z(��\t`�P�џ�H��3MH�zDb'� tvdK(QǑ�S��=�{�oq�\����(�i���[�L��ixX�Y�s(��F"@�D"*Ͷ���r�w�Qv��;�}�"�ȋ�	����e,���������A>����Y��볶���y���@,����梄ܽ���	3�.-�	�H��������.��^��[��~���\�o�X�}��w�<O6�d����9���P+t�0��3C���j������|�I�����)P0��������i;���1���c�v%f�"����ދ���c��j�2��娕���^TE!ƨ�M��.�����~��,?>Yg�䧻_>'f�K�I��Um���e;��}�苩]���u��t>Z	\@hs����a�u���bCxv��ʟ[��	DT+J0�@=m�a���\-��4Y��{����#uʘ�H���;���`͍!��\� �=�Z�V�n�m��j�E��.�֢a���؄ אaz+�F��{m��PK/WUW9G����pip/_vendor/rich/diagnose.py}S�j�0|�W,��ʐ�|�KMȑ��i�8����-YM(��~�b]Ӧ9?�f�h,�N�'�Tu���6-!��-t����N����F�T}�[�5)�j��yvj'P��G�xǞ�^����+R�P��bh�
Z���;B�+08`,��? �
�ߠ3�n����>�!�>Jia�� �!����i�
���7�u-U�|�Vj�f�FX>	{���el<?�a{��9�$�:p%Z��<�wyH�{:y�g�2//�����X��l��E����Ϣ����Z.����xr�n8��)�xq[��/w�'��,�K�:-櫔/�|��GFqV��L]�cg����G��ʹ����ӹ,�0������S���G���
&��O��hբ��Z)6
�4��\u�����2�_z�-��荛"��o�9$	P�[!��zfC��_PK/WUW�
E��	pip/_vendor/rich/emoji.py�Vmo�6��_q�>L�<!ݾ��H�5}q7+0x�I'��$
$�E��w$��]�D�=w|�΢��2�[�ȕ,���� ���_l�͛�ͻ���K�X!��XŸ},�I�[��7z�ă�:
��+�k|��^h��=t���"x*3Խ|����۹\a]$��a~�X��f�Pi��E�K�^A��~	��߅��J!)Xh�(բ��	�L��p|0XY���;�Ur(�*	�$�gV։�(%/r,ƍ?.�_��!@�C��\nlƟ%�񪏿g�l	�HvO�i�h
[�,��C��eW��V���Z0��@���`0���G�9ׅ4�s��g�Άv�k?xzL��8y��5���ݮ�w�������ݼ�\m��ϡ�z͞�U�9�0���i,��p�b�F�WM�黷O�{
�*Y�A����O�l-�d�C����J�M�����')-ZZkuУM�ư��2���L�7M�,�%�n8"����<!�h0ҡ��%B���&1��ą>�L���7�B�h���"����3x�+j.:
��Q���w�"m7�6������ۍRRͭ�Mw�|�}�f�h}�PO,̨o{xBSC��?��ʟzzG4A�hM���o��J4G�
��fW���%���c�n�y�e��65�+̑�R�kYev�5��st$��&mО�k�pn] 
n(/�C�
��X���6~�&�BӨ�̹��W��^{	�m��g-0e�r1��~`3����f�}���|��W��q�0��M����i0 �#�&�����]7�Y��z�����6"iY�h����ƮC��8���INs��2�4�/m4�㯈˻��Nۭh�qM��7
.�C�����@!Q>[ݩ�^�\��ƢS�Ǯɟb��Or������
��+�:C;h
�tu���@zV?����s��qH��0��D|t�!�V������)�kxO�zC���MY������?PK/WUW"H!���pip/_vendor/rich/errors.py��AR�0E�9�&����:LwPf�	�S�J%�4���!PZ��7O�	(���[1/VG�:�o�*H���e��G0c�s�9v�UU�Bjt�'GrR~��!*G�w��Rb�-�0��x����`�^�Ǘ^LZfM �yE�x(��u
�1�F:`�s�5鳋6-����y�S��fL$���'B��%̘����hS��"`j�R)���~��v.��J� %;�㷱��?�NPK/WUWj�o��pip/_vendor/rich/file_proxy.pyuT�n�0}�W~�1O�ú��
mCV�M'�ɐd���%����������8tJ[*i�:�=uB�@��
�|�)�_o����o����c���4b�_�g�T�z8��b��
}'�hb�U�t��Q-���3I������V/�L(���>q�y�H���
!C�c`N�[���e
k����ZX4`�q$����RHa�23�6ňYA:�J�hE6m��O9���Jb����r��j$9x�W���o�+�OC���9�u����X4"�CE;�:�4էE�/����W��Uͅ�1�ha@{�ެ�\��\���q��[�'+%?�m��'��Z�
ق0��3�o���lf�Ό4pR�!���́�Q>7as��Fk��&
)hr�?��p荅gt����Ks����4�xC��%Q;��VH4o6��ws�k���(J��2|�-��/�qm�Jf�/�2Z1ń�ƻe��)���̂���"(���E�&my��y%�0�y�T#���_p)��+�X:
����"
�	]�|sWIp+}�t�+����J�Fi��F0���,w�|:Ms�U��B�(Ô��ߴ���;�<Sqc'��˗�h�Ol��jl�ޮ��hv���EKyy_��'�PK/WUW��B�	pip/_vendor/rich/filesize.py�Umo�6��_qP?�6T�I�n���4�3�%lZ:ل%Q#)�^���;Ro��0#�-��so�_@�2Y�hl�� �M�Z�*�Ҡ�V�rY����a��V�0�\����&��w��m��r~{z�蓱X��S�?���!�md�B���ReM�`��)2�62�稱�AcRa�@���Q�`�ja��]r\�!�`C�r�b?�c �$vQ��T�R�+Y��f51�)��*:3Ľ�obzF2�3GΎ"݋#��Y����Y+�_F%�g�_�A֘I��RVB��"��gx�e��S����i�k�ܬ�f�ע(�k�����-KQ�A�JgO5��"õ�ll��46��5{.���8�sX[��O��zB���lr��&��	��7�T�v���T����	�@����X���#�"�0
��꒫�(s_�:���G�mt�lOC������c=�&��Ja'����!�6f�/VM�T8����4x���˹X|�a�Ply6���'>�j����>�O��c���ǧ��e��Hd��ܙ�F��w{x�/�_#pg��7��Pj��laM}��ܓA0#��ܼP���:��{4m�l��o��[ݧ���9W�;y�6cS1��7k����P���%bdg�MLۅ_��+(
?����mǠ��g�F椦��
�ʳ�b��=��؋���)�Ul7�͆�d���lZ�鏧LJC���%	4���{%����b��x*j�J{b~Y-!/��C����՜�0���n�3(QT<���Hm㬊��e�4�����b�6	��=�lv#R����f�:|7����_���b����o}P�����s@_zB�]I:���z�@]��R@�ɕ��($+��ٳ�Gu%��PZ���t���?��A���Ƽ$�N?;e���cj�IVH.�^l�'���dC̮~�����>�����^�q�1��B�i�y�z/Hq/��T4�f��hz���&�f���n��w��8	�0��ƭ?��έ�n}��?��2�]�m�y�
PK/WUWG�"1Ap%pip/_vendor/rich/highlighter.py�kw�F��ńtk�B?�ƨn�=�6�I�'{"���D��2(�j��}��1��d7ەm3���;��y�I��$����I ���Մg���8��l�&[%A4-�~X�$���8:�FFo�b�}�EMr
#GGG>�w�GADݔN�z¿(�0҈n�uD�(�+K<-�#��xBrD$�a��0!���|G�E1A?H���KE�A6#^��޾�>P���45
�;崈r��� Rs
��c�u0����T�i��W����c��I��Y��d��m�1H�*��IЎ�0�H	3���R��R�E20T�a�J,�1�-���t*�?�a�����4�̥��w^����UBH��ӄDqFP#0.79���Φ�8!����J	A����K�0��!ۢ�&$`��ܛ<��Y��\.�%�͡���u��1�2�q�Rej����h��z�D�s"�o� �~���i?K��2�Qʠ�KS��A�>-<��F��Y���[�Mѵ��Ǭ�}�����r8&�&恀�3�D!��h��^d�E�Y)�K�)�aA8�y�cʢ�l+��VdDɂ�ZA��y#(<k*�(���e-��j�7q6C��+��{�%谂<3غ|�ȓ�v^K��z���1��"��P���ciBD�|��˲UHy톉�Q��_WҺI��/%b݀�Q�:�F[�+�zm'�X3�L�.�����-�1�ד��*b!���J�]]Pq�^r:��5)�T������d�TX�q��+����CX��qA�$uݛ"����q�3��p��J���}�yS@���~�ϑ7��@w��u?<)��q�A1{�,���|�֔fE���,K�QN�Y�ûv��|�.��/^������
������������AՆ2���e�ns� �ҳ��yw���`�Й���=}��,������D=��z�ڷ���@�΃������@�1�=�G��>����w�C��NJtP��y�H�E��@nЋ]~�=��������5G݂qF<��8t�B�.�3���'t��x�f"��6Q��x	���S/�h�1���ނ^>s��o���y�6Cܜ� �a���>���v����w������6oq\��B-���f����U�mډ��d��*80u��kh�|6pg9�8��٣���q��r:<�Ð4���?՘x���8LC[E��gY�0~�_2�e��M�ֿ_��q�nT�i�[������u3h�vX��|��͓WD*k�s��K�S�b���x�m�����3k�̄�	bc/���E�;�����w�4�0�*�����W�~�;�(M�8����)uk�'G�צÕ=_�;g� ��yn�q3��]Y<��bhTm����G$��;�O��
uQ�_O���"��Ҥ-��h��ɕ��i^H�q���_)�3���t�JT�+@��]����]�`>��@1V�,g_�ۍKщm�Z�6���{��� �A�
M&�����h!'¥��z�/Rc�,�	vȧ_(QjNc�!>=�m A�qI�[s��4 5,e�AeWm�J�f�K�EӶ�ޘ��Uf���]-���(���v���ř�S�m�K|/�N7�ӢD�����YӔž�"��B�].�F��:bذ�[aٟ�Z_�l�]�w��8��������v�{���xf��yn̲y��\�O�Q�%깔I��r�9�ʃ��s0Ԙ�c��y���2[%3����R�,6+�yM��C��݆�����aN�F�)gn�e+�1I�kj����f���@Y�݁�.��ΐcjR�M�J�F���2G����H�~)��
�A$�T�QI]h.��0s=��D�@��z�����(�P�)4��=�z�>���ا0�E5�^!x��B�ʺ�0�ٚ8�x)�K����{{
�ް�c(����CI��*�i�[�v��8�V�
�9���Q*"��r
v)��4A�\*F�Z��gC��>}��SD���`���Ј�wX��E`�4򲸌ÏM�0���,Ӕ
'̋�[�x_<����V?�:�.j��Ф�,k�I��'�{��޷N_�ȽLre
�$]�҅��rbF�� �񟍨'�qͬO�ꮔ…���b��$�~l��'r�߮Y:êXC��_�=����͠v����;6���9S���Mo�H4�l,.�ؘ%tLV���>H��-2���;&��O����$�x�]���	�`j�Z�*�
 M?���G�bA�����*�d���3y��{���Mj���ێ�<��SM����"��@4����(�1���y��}���?�q�\��$����]�7�7��@����k65�V��ꞡE�{�����R/��$x6�4�^�4�ċR��b�P�zZ��cתX~�b�yn��}�ʚ�}�+�����R3���mU��}�Ӳ���K<8g�+��[�/��|�u��u�Ow]�B�&�7�{F�8�BS�&�WDc1���x%�v���,��c�|�H`W���`�>����
g<g	�g��4�Ԣ?
�Xю�Ik��q��gj���$����kK��%�7�t�-�]
�X� @�qPF�z4 ׯ�&O��0�F�c5���#��×F�N�?�Qϧi�����N�΍n��l��H�nB��-k��EHiw�
�hm�����>���ּ�e�������Bd��r�u�ev�M���aNO���!�w�pvq\�a�b�05}��S0�!��g�G��xe0�~К��i�]�5G�PK/WUW�
P+�pip/_vendor/rich/json.py�XKo�6��WLu�Y@st��F6Ŷo�dO�B�%��F&���.��w�ԋ~d�M���I��h8��7#WZm�avS��m���[|�T$�l��Vk�J�@��6�K�r���5�k��y+�du%�L����g���vy#��zc���}X��X��z�0�L������(���,�&'`��ͭ=�EH�ӉS_���ϝ56VO�N	�,T�K(�ei�&к��S=,�ij��p�T{l4��mWxUA�a���:�C
�x�v�u�W�;�h@�R���Hw�^3ڹ�;>�2������1u�2p2�,��`Ō((�<4�;���*�f�y�L!�9M���,g^m‹��
/�B�bW3}�5)@�4�J�W�^p�R(���%�g�.HK�&K�CVB
���w/-���c�P��`7�B���h�n�#J��w��{��[��r��r������
��.�����[����
��<�(�y<���UTԜ�"9��9����*9-�9��(��'�������,H/�h��8�-�=�=t`xx@VDV��t<w�Ӭ��n
�_���PDD��8��NC��<9�|hSr(�A�/��bJe}pC�8��!T�����j۬���f���.�Y7(LO��t�7�x
�Q.���x@�w�ll�(�V*U�׬iAsFA!#T�>��~s��J^�}�Q��)�C��zt`�]�Qo�Woa#*��Ʊ�����V�>�ºT�+a5q��m�`ѥbt����8*߲È�[��w�)�v�P��c������%�Ķ89`LhCB��Gl�m�4\V��_n|�t:�C�%�QPko9};�o1��x�pP�k���_��<���K�?%��O\}kд��S�y�X�i��L�� �s�8����	��|{68U�4$��<�:U� �O�yBc��t��=?��%�m-h�d[��e�	���ݶ�+��uô��5s0^�I(��V��q�E��:I����•Zݎ���A���J��2g���v
F"`O��vq�~���u�9e*�J8>�0s�il)d��o�9#��l���w��뛻��:J&�E�=��i�61�؉��Wco�E�Qn�vr� F�ܑL#�4G�)�N	
)r�QH�m֮����ɲn��;�Z�T�DQF�m�i�a����I]�	M�($G���ᓺ����rTgT���ѯVq���ۜ�;ן�X�q0�3�N�: �U�я=2	_�w����_ܦ��h�G�������i��"�M�{�t����)�u���ژ�PK/WUW8�Xȋ�pip/_vendor/rich/jupyter.py�V_O�8ϧ�r�6E!�h%�`�r�'�8d�d�z��9ǡT��~c�I({��=] ����͌3%��%K‹R*M�nf��bv���!9ې��D��R�b�9��Wx���j	xφj�G��%/#�"�*R<YE��̡uw�oQ���yV/j����q�
��
�5G��.XN�
�������Ղ.f����+����g�u�_��|C�b1�����OdB|��;.�Jos����pX�,��G�	T����s�j-�r.�p|�ұ��`�Q&�>�X��m<��pt��5�c�"s)�(ldU8:����5lFa�L�̟�$2�����u�a\��%�P�/u����i�"'�ZqĈ$�a��.rsrDH
�R�#k�(��J��Ҡ�<�R��W!����NɵΕ���:�X�!�h"��q��T��<�"́��p��u
q��{�x�O?8Xo�ZV�A��e5po/`��S��⛰>�9��xC�0�mZ��~� �;ڮ�uL�H&	�!y��eEX��
�Fm���p{�o�k�Po\��U��Cs��E�45ha��b�^0C-��I;�q�1�(�r�+J1�`������Q��O�~tt�P��h	�.���5�N��e
�8c'5r��e�9~�{u�;�������%]3��Z��:ˬ���q��?t;���h�m�{��,��q�Q�VB0}��딙�����QF`��O>��+�#�S�-5�������������Ɣ�?X.+K�*m����G
ϊ5�u��b�~0�
@�޳��J�&�.WQ��4�ٶG\�[b�1,�!rQ�[,�dy�k�z�P��AˉL'��S{���q� ��1V^q�6.UÛ��Gk�
�e�k��'�%�5���JA�^z�W�h6�'>}̙X���t��zSA��I]
�E}�\]e����e�b�Q
���sش��i��W�����7¾���_]S�ܐ��hѝ�3y��	��&�FM�m_�������Y��k��"��ԑ�|CF�>��) (5��Rε��W�L)�3!~!��7�y$a���
Tst��0�T�y�,T
ᎍ�Z�"�r��,�!�:�׹�g�8B��qÕ���7J>om�QY]�~��ڥ��w;��PK/WUW�a���
�6pip/_vendor/rich/layout.py����񿞂埒	C��T�q�$��g�@!�\I�)�%)�)�{��M�T}�����)�9M�V?�D�����|�j۷� �)��е�<��E�����x�-[��Fяm[Y
uU9�v��Ƕ�c�8��S��E^V͎�_��{5vꬁh���_޼�^|���߿�6�W�T�(�}h�ZȧWՠ޿��|w�x�O�X�M^˧��G�j����d/$9i�T-�CY/�����M��5Z`����8�C/�c�_$AC\���<�;u����p�G�j_�y�j����μV�]ވ�A���'=BOj�; ���'=�Y"AI�W�>�3��A4#����<8�����XT[wW�$|��U]�}�}�k�c/4�w�}�Xu>����G)���w,��a��j��CU�:�	<�	>���I��̸|� KҦ5�Q\m6���1���:����±YH�fAl�7+/���w� �0��b��|e Nr��n�vu�&Y��k��
.([1M;�8t�eo���F)8„�`CJ@���q��䊇�3s��m^����� ˪��,D�MԞ-#?Ҩ��%@�q��A�����j�W
�;(us%1���+�J�YI��Ơ[i�KϲiQf[���*�=������.�wb/P@�z����/B���4ז��X�ĵa�,/��piv�!���.����Й6l�q�D=�yG���*Q��]�d�;M�zI��5�$�!�*�z���E'�d�ו�jw�� G-�赇��a�2�/���"t$o+�/�d���	���9HIlaKsm��nP�K�'5���2�CŅ����*PQ�R>�5:��#D`�D��\�Ҋ��7ф��G�UL�c_�%������m�9gKDr_��zԍ��7�2L����6�a
@'�=
��!]��ݰtv��
"�V��8^σ�x���n}�6ED$I�y�(Ƽ����UKmN��\��ZI���z��&#6a���U�x.>J5���}�kKR@���?�f��/�]��2�{�P��~V:���t-R��T�~��v��~�I
(V9K���H.�[�K�E�;qI�]���NaQ+Ew����B��E��+T�Ӌ�>�_�QM�Q*9�[������/Ւ�S�R���V.E�9�R�<I��IK�l[Ȟ�^*�X,�2�����4�N��M�VwcG�ua2�
'U����ȯ�ZU��K���m��!A̘�X�4�FlsH��!�K&M�@�\;�I3V�
b"��_‡�YUD�>)ju6u�����ͣ�Q�^�we���<qr���P#�h���,�i��A�g������?*F���t��"�Ҏ��vHK��=���W�Q/��ճ
,��`&}�8
c�͙��~X0 �)���K,��*q�j潒�2@��J11^p�$�,�Z���l�}қ{*֊�q�\9̸�R���t�T�qj	`�Z1�Qjӗ:���G�Ϛeye&��b�4�g���[v�;�6�����x���Zni�]��oUq薅�}�(,wY4	m��f(�>e�C���ʟBİ�@��z��'͙�"�-ۆ��]w3�2
��2_@DXb��$+K_���ųU��:}��!���Ŝ1�9ײ(�Q��Gn��`%ޜ#�ʗ�פp�](Vp~�v֌m�u�6�_�%��]�Y	8�+!c�Q�'����[J�
/h!8`��
f�51���D*[]r�j(�
a�Դ���9V�Ǧt�/�Κ&��tCT�{�F�2��,�2���)�98O��{F%�w���!ٞ�+	��E��خ�
8WAX/�rn�iJ�n!�SJ��{�A�d�s�6VA]E�q�zRa�S�x:cSXi�
�w�(4��ݤuط�L�~,`5�Kͷ��ET:���)#�����oOm�3<�<���.�i���r�����A�Cf�Vv�;gT��Kw}UF]^��*zq"	��؟%�ƥ&�H���>��ș)�IW0,�C��N<%>r3�(#d/!�\�L	�M���a�֠�Ҏ�h�\f��򺎻#T��
����,���'�M͕�	�0}�Eq�!⥲�i�}&�ď��Q��5뫈3ؕ�Q[Z��'�'
Nz؋r�r�-��ɐ%U[�2���Q�-�,�s�>�L���d�id8E�Un�XN1���N8>[(��2TtE�x�T�����Oi�2��U���v�T����#��
�q��G7�ob?�{-W}�ͱ[���4*��?�	dL1�΢,�tFq����I>�YOL�HT-�!6��8��t*�Y�Ƀsy�E�e����&�65�k(��'A�:��Ez뜒b�f��k�����
�n"�^��>CB�.�I�.O��yx^���
��!F���(�ROT~I�+�,��ڄ�N�_v�D���S��L!�K�{ސB�o��g�X��� b�آ�9���3{���E�P�mdE-����3�KK.b	l̋�`�t�E�ȋ}���X�*�Y2<6�c���Z`#���Q���
H:F�&(E=�T�R]	3�F�}Gwk��&�=�KB>�4�r<����Y�8�3]���t��h��Ŷ�>
�zXO�%�Pݙ�Ig�V�3�A��\� ��x�5�H��{&9��Z�h���e:�6�K
���S7��6޶�YN.�j�E���QS�Y��W<=�":^%�Ta��ӄ�cC���b��Mt�3>�S6C@�sۋ%A��s��TH�S,�߄N����!/2�2�F��ܙrzP:u����@#̓�*Ѝ�#���^y@NuySՁ��&S�����*�ԁ�3*�]��f�㰧�M�9ͻ�f��N�w�zU���,&�g�|�S`|>��#�b��9l������d��W�覬�v��!b���VW�Y$�Ss�"WG�������?�Y���))Y5�aF�9c6����$�~e��*	ދ���Ӎ�,Y?XtP�jȱ�|ÇFqE�B�[��\='����w]��JO`��<vi��
�s�_�Ɵ#��kۅ͆���{��u��������bI��B���A|�sL*��U�s������r�Nj�g�x㋆N���Q{�gG�3Q�N❵�1�I�{Nx6<?%,�&K����m�������uLO�>��)�Y+���5;�|�͹bd�S���X|4���>]A�O�D���Ew4��4#�̛�s������+{xJ!��J?��x&6f2s�T@q����Բ��Y.�W�fï�?�eB�)g��w�9�a}nu�<�@����Ğ�ct�?bW�rr�&��|:;2��@1�EFF%G��g���TM���~�1��%�����K�:����bgP���T+P$o�E�;�{(�?X�zF�VW��r"��f_=c�m�B��pQk�b��ޔCv�`�K�M[��FI˗���F�"T7ج�������6O���vZ��y��ql�0�_y�tڄ�<���j��&���f~�|_�[�-��]��nH�PK/WUWʠ�ӵ�7pip/_vendor/rich/live.py�]sܶ�]�e�c2�i9񓦗�"9�bG��r��憢x8"y%@I�L�{w�H�"e�z�bw��~/`��6� |�Vm�!b��b��[����{Z��\~lʻ�\�i
��Rރ]�EIo���
����O)9�w)9)����hJ>2�?mk���Q �HIYpq�(e=�[*�yS�52=�N�0�����j9�Z@��7͝�%ڦ�h�PO�XE�m�<���~��v۝�m?����Y�!*vO�V.�C}�O����L[�ʢ�tO�U�<�Dźч�񲥴��>ˑ�pn����*8'�%]�����b�+9: �Eѱ�6�*�wUq�*�8!𩥷]U�5l侨xX}IW$�Y�D�ǜV����H�;�ҞP��m�)��
���ߑ󦦊�A|y8d&��SJ6��"-a��'f��8�֗�4���hbv�E���
1��3N���vu�a
�B�FX��k�*��ĠKL��Aey��B�[�Va<�lNA����ʃr�m%�-�(���IQ����n�,ڽ���mU�H����o5iC������0h�I<��F;��\�AE㬘�S�*�Jp���-8�5�Ά�z��Z�wN�?SࢨK:��T�^��<�L�0�Ų�Y\[u|�4����Z$QA{�M����~���"
!���C�z���
O'�)�5��SM�@�@��&MK���)��b�����e-��Ĕc�ϻ�
xH��6b�hh�58-�G�ỏ���9?�9�����*55����}!t��%z
�Ġ��^9�t�Z@˕�â��3nY���7�zۂV]_�
��
%����פm��5|�{��F�&�����{�R�^V�	ˣ�f�TCjتQ���rѪb[�xdx�d��}b1�/�~�7�Rc�
@�vL���̳��y�R�#3k�G�A�B���t�,d�Z�XJ-�
&�.�^�0����=���5@�I��Zj����E
@M��(�"�Q�4� �1���l=�b#0�seߑÔD��M��/Dna+��R�Q�!XA���2�#���,�$��|�r:�̴Œf!�)؃	��W���=�l,�	<�^-�g�٧9� �0�T� ��(������v�?�%��E*?N؝97�(ZA���0&b)�@qk�H	�S�(�Sy�ŷ[	����<�ŚF���pGl�<�ld�c!YU��*���`]:q�NY���ӹ�?�ʃ����1�VR3	>J�8�'k
��r_L!nPp����z�����]�0�e��ae�ay���N>>U�'˽8�R�>�:����%v���%�8FI��`8�ψ��Z���O�����b(�W�J���v�M]�)ɆC�~R���
�ς�x�������=E`u�L�x���f6VEr��u�]˛6V��Kej�k�=$��%�|
e��`���L�'�ݞ�ה��i�Xҭ o�/�?���n
��U<%���e��lue�&�;��8�Ȃ"@���|�;��54E嚪]�� xVKh�7�8��6��R)���M�KV���-�"�[r�~�P�.��:8�PYF��PA6
�¬&~^�pdf*�i����mwC$h��I�Q�'�$��riO�'I_�pe��5C����b�q�{�Qz����[��i�
�D@����e���I�\u��N+��Uy:�le�k�R��q�-r����Z��>ʑ���@��^l�����{���$�}3�M�=�ہ�x�u��e�~�{�=�l�ǨX=Vg/�����bt����S$�.bJG��_[_nē�:�'��d��MY�T���L�`?_�����|�B�mq�)���V�u���
V}� ���ju���j>��ϓ���uw D�xfUY��Ͽ/82���E��5�.��Mؾ][[v�4��\�P4nB$��xW�:�vP��c���?�M
&5�/�J�Uw�c�?�&�p���50�Ч�vZ đ�����b{C����q$�%L	��%�R1�-)��m	p[�|�?�G�
��(Ҹ	t�ِWF>l_3�	'U�M%�s�a����PM[�i������{A����ȭ�Z�K�G��h
r:$�-������Ό���Ԏ
H⋵��`��3�wR}+�4~Ƿ�_?���E�}�q�:��M������n9(�P��Һ�^��i`����ȢM�;�
t~(���V�<��y�_�Y�ؽV�¾��u_�CL0��<��fX|���|���
��i|�zB�9�؉uSg�>��=�A�����ϧNl=1T�N�$�[�`�E�hk��O�����_H%�*n"ym�_)���������Y���_��?c��>�@��?���j �7�e�B<#���Q,�3�Y���b
���U�__i�/��ns���{B�`\?�W1��xBd�0q6�,6R"
ݦT��_#��.�;1��/n�e�E�9�����3��=8>�!Jʹ�y�����,?���f���8��B-jSV�6d�CT�)O�wA��-Ls�N���t�wc�U&�N���l�"�.߼pR������p)�|z�V;b_GY1���X!]]�;|D.���B�g\�"��Tc�G;[7�P[Ó7y�[���
g�\=�	��-���-@�e}N�+-L�;��g[g�2��0�+�S�Q��^��i����i��Z�{u��yNf3�`u�G���%lx�l�/�nr��4�/ 7�t�++k�}�{�J�?½�}&�ޔ�^���?��d/�z�v�ة@�EM���8�&��P���|W��qx+GִP]����	���4BNhz3M�h�/ЋVM�ͱ1�U�~�L(Yί�-�1�\%�W���DR�#���������Gك�K
Ś�ՁOi^�:߶���鸂���آ�pt���;�˺$@�)Vی���R?-��L+t��g0-�h+W�u6u�Z>�3�pH�U�BB�@��*��hկ�F�ˊ�2o��8z����?�F�P��0���t*>wԹ�"|
ZHU���}�J�Nj��5[Z7����|�zB�x=Gv���n�2�|�M��YMV��- @�_���_z>4�]�X���+�h��M
+��d��_-��^C~��.@s�n�������.�o6N��E�؀��+v��҈~�ْ&��R�k��.��t@����ߛ��zQ�t��O�I[���v,���N-��~���o�8�/���/��Nj_���{{���|r��Ν�N?|��﾿���_����v��s��C����{������ҧ��������J�J�9Ɖ�ǜ�o̗��d|�>I�#�z���~���Y�RD��^�EB����dR�c۲_
H+俒����5Y���2`�ڠ{��uf�i=�аz�0�g��tfo��vEdf��/,S�0!'��K����6��7	���T4�x��tJP2��W��5�8m6qB�&�~����~B����,	���Hv�eh�Sl���+H�<��;��PW�S~�(#�U����<�&�M�m�8��tmI�Iׂ*wQ`)�j*3�Ƴ}����1�<�PKr���%��[�†����l���n����g1v�i��E�9�eoV�Ga��'�CѶ�lۖ�hf١*��[,��K�S!7��ƶLóRރ�r�PK/WUW���0Spip/_vendor/rich/live_render.py�WKo�6��W�E
��^

`��"�6)���  ylsA�I{�IQ�Ivs���y�|�ءRuV�V���5;��]��h*���c�!��ְ�'�
	�5[A.K������""�,���4ȊG�L-ksz�f#d�(���1��D���H+�ݡ*H#H-Ѕ(r>��z�Ny�tG�Q����Wn�����AK/�-��ԑ��<Pe�Q������{G�<�so��#jL��=�{�
R���w�o�ދ
)}j��Z�6�H��V1e�OL1�%~�,՘��'pA��q|%�ҠHEd=�J�Cu&/@��6yd%Vr���y�d��� ��2���P뼗u)H��3":�Y�~�1jA���g�h��ﰭ�D���8��9�7�%a�4��`�6[����`�o1���ԕ���Fy�jA��|J>]�[�@1�/�W>��\zJ�ߘ4�	�f{c��U�a�c�dO�ktF��UO��*�t�-��}#��b��A#��5�9ƨ��5?nLSRZ��K{r+3�Q*!m�6��ďB�����Q�
X�0��I���X��Ėp<��� k�G�L���Uo�5JWM=>í�ڙ3��i�C�	S�]��D����� 0)�����h�æN��j��Y}�����m6cNB������/7���%��_��Y5��3W��5}�+#?/(��S�Iw/H���Z���wҠW�R�������qT�*tWR5��n�e�m[	'&��??׫�\/�7��nRD��N�d��v3��#��w��b2�WQ8�Q�C�'�rr���l����%�m5��Y����Bj��A{�s��7#m�)��p�4:T�~�r��^b��C8#�����(��p�ؿ���1�<.[���\V̰��OŒ��л����v�A�w.Y�������3li����y/�K����E��G���<�
��p!���CRl��|2��ϼ3ۼ�8��vL�����(i:��ݕ;�GiO�qɞ�@�Y&�����ʬ��l�O��Ҹ�g|��y�s�h��2N�;�PK/WUWo~�.pip/_vendor/rich/logging.py�Zms۸��_��M�����Ӕ�q'q��3�����i��EH˞��o�.��/��:�C�����b���U�&y��d��`ͪ��IM묠$���]�*R�>)Ӝ�1�Pm��b�$�%�6��4�'x��ӎr�S�69�C��x��	�H��EMYr�S��zL.wuV�I>&8vL~.�@I�v��i�"���Ѳl�|��r3�����ՈH�oh�\U%�r�O���.0�L��X��sX��$ϕV8y$R�3�:���*�m����l�V��iL��Y
jTMkM>�g�̒�KV��O7�pM���ڹP�?��	�����Vv�z��D�'US�z+�Dd��D̄����A9O6�"V>a�����MIV�U�7E�#!9ȡǞ��c���^���SY'��]�4:\>V5�����R���&'�--	-a�qVzs���7;���i��S��(���M�@e�&k�
�%,Ⲫ��FX	�E�˚UyD.�$!)��ڕ�'�gY
Ì0$L��/
.p^�Ӛ�IV��O(��8ʊ������j#��Oن�s�k
�X��1�5��J��h�&+�"򆮓&�9�+=����|�z�™�����o��H��#B{����NJ�G%W��V�(e���4,�l�ꮏ���n�N+\ͅo��R�dxWU���5�Wi�b?ke��R�YC[�U�Հ;
h�
ּ��%P��3l#�Z0�I���j�R�
��X<���~���`�a��'Vp�q.E��U�CB�	�*$[��U�j6�1�9I6@�4Z��viO9u|��D)m����H�j��bp�ϣ��m�s�5z�Ҡv�Y)HH,B��]8D��+��>+�e��g)�v[3>6��-l�j�����c�|U�l�����
8@��[eKh,A�BGfir���I�:A�(n�8�e,���MAKd"�z���k
��rϒg,
I���&�Wv��?�5�<	.x�3����%H�y<oĶ�f�c`�$��_�{t!#�X�6绹��W�(�4�
�Bȣ����喉���R�e�<������<fE9��6#�/���psw��C��㸆SVVgU��-���W+�=n�Wh�(�F5k�UG�����nʉ#z#��R"�N�&`�*Y�a�Ǻ�����q{����{��(����"�b�ɼQJ�A6X�x$/~�!A��=}B���l�.Њ�$����>��$���[+ˍ�~��^^�����t�+'�13Ǎ�@#���daޝσq�����y~�����~s��|~n�\~�_\~����W�gͧ��{�p#~��x�����_-�>�^�s@�ZX�M̠{�\R�&�%�r���׭p�g�H'��n��PѰu��qZpK�}�h��A�Rij��'�ls��[�������Xs��ݛ�L?�mo'"�FmK8FmOh\��ah_��pf1V[>�؄����F_1COf�0O�M8�̶􄧇�D�4щC�`�v��_@=4�Y.�q�Z�a�������ȸ���X�9nk��IJ���Fء����I�ؑ�C�.�N��O���*��i��y��=$萱yr	�]�;����I���I��]G�,�w4�=Hq�sC�����.N��^N{�18�N���,3��C�a�L�B��@;���ex�NP�>�q��ie�����!�>ʸCL��h�3��4<���"4�)�����*0ˀ-f@���m���X��	4�I���?n	$	$bF�%�Tb,W�nX��"�"��nv955q<Ǔj�[d��fK�{��m�ԡ5�XH���4�q`!+���:<��:�y�,��jSU{��߂Ogb���v�( ɳ;�;L��|����x�d�*{t4�#-��[��گ'�#[���C�;��^u���o �
X$��V��k8��{|zH�F=ړxV�)�
<�`�ԙw�NH$���y��跢"h���̣�GΫ��w���}�2{C�>��fo�h�QIc�����Yh�
������h��H���H�ܣ�
����2r�Z�T&���l]JpE˅���i�X|=O�1�\���^�T�&�Xh��$h8��#���g��|]-}�5���6ٱ��ՉW����μ�I�_#_ U*�jd˲pF���Vx���]��,b�ɘJܺt�>���T`o2�#kh'�V����ߪ�XNvO��*�c��bTݍL�?ʘ���Qy���:��;Q���lYÙ�HD.J@��K��x��6��Ou��=��`\.T�5DMdP5�-�W�w5�k�u���wyC�G0yEy�Xż`H�@9���o����е�<e$ �: 0�S�d���
Ͱ�"����A�$B���7��EdD�k��/=�T�h�kX��$��Z����%�ެf�}V�NQ�vxZ�6πTKs����4�=��>r�<�sH�%a�]Ԓ�f&�
A;[�h��cuk��&�JS�>h�-����:���t�X�u.�Z:�lX�vj"c�3VC���)�TV e��z�P�Ҫ/��'�VqƤ�7c�F�e�=Ni�q��eѲ���,�u�6�
{&��K�����6��_+l��|G�7���^<	�
@�h�k�?;�1C�g�%�6��o�gL��c�w��^�a����Iq�tr�� ���$K��(S�I��ʯ��_Y�ӟ�XE������nλ�7���ǩ���lzH�L�SWSs3%���`A�*���\�W
�P�,�XW൬<Y��;va�ҫ��u��َ����`��rI�K�-Y�\3L�v,���pU=�t^Vq���xN�Nn��˫�N�X�~ab����ө����kN^��)���{g�F軄g�3�qT�:Gȫ ��M�m��y�­����x���R�T*bq�0P��#ea#��u[�й��Ձ�apMك��L���"��Q�+�T�VU�m]�f����O�!���NO��/�ԓ��|N&�c������я'�$IXl�g�aUS��y}�m��ǯN~���|"*a<��^�}�p&j�:y��#�E�������TRz�X&����է30�/
�ҿ˗_��~	�Ĭm��q���C`���4p�0((�R�_��-k��S�Vp��]�]’��b$��cT,)7⩀��r|�Uͫ�fL@�ѫ(�9�����GK�o�D<�I�(o�:��0P<����y|똪���$Uٵ�Q|� ?��$i��	����/{:��g��w��L���k�|��	��œx0TAG#1�0���Qu
�K����1�����g�x=N&�yU��j",�ׯ_
&i��0�)9>:zu�g���s�}L��>�<���фg5��ĕfYJÞ�k)?j�ɴ�& ��Z(Va��!�!ߓ�a���Y�+!dvU�s�T2'ZR{d�J�X,�)?�%�!>��'���j�0F�o̤Մ]��Vx����F|KQТbO��)$��.������_N=��]��7�\�/>��\LDC0��8�VpDg&�У��PK/WUW�Cb^�	 pip/_vendor/rich/markup.py��r�6�]_�2;2��Mժ��x�L���i��b9�ɬ)�KP�U��}�$ݜ��.l8���/`�����-�j%�nE�KEުF���oV5,�U�Aȶm��0�o�u^.��7�(�P�����ׯ�nC�Q���P|�+�}]׸�n�E(��o%���n��U�g�6�.�\u����:�|�]6�,�n�i�Fwes��/p���v[�'\��h�]���Z��)��F����wWb:��ժ��<��y�?�>����=9{���ɳ�A�f�`*����立p����zq�l�?�x��۟�ѳ�� x�PF�Bj-�ʥ?�4u8�\��R�yU�
�[��l�����m�a|�V���P�2OgU�=%�e{`W=�m��?��
�e9oY�B.�h�"�s���HS����V�"�F�X�T�nJ�� h��D���\�OU��*��~�;�^O6`�^�
z|���c��y�Z�1�3�U�JԂ��	�f{=k�����l��3Rۄ&{b'�ܣ�R]����L+��u��@�W�T�0ֳ.����.�$�:/o����}]�g��B�e�$?����g1��*l�#���0��av�Ѐ�h��٘��)���@�������JQ�����1��
�@B.iŦ*��b�j[������]���7K=xo	�c����b*�H@�ÊC咜�"����'6y{-�ײQb���j��UuBQ�;�5d�k�}��,�
g�Еv��"��&-�j]k?؍ p�y�N�ƃèq��ߗ)4@��:���7�FZ��#��]��)�`��͑�+��$IzG��;�؊��!Hij��ו����	1���3�]z�r�ʼ4?��0�M���c@Y�s�d�튢��"H+�^�%p�)L��y��,Fc���b])K���$Nz�캕
b�Y��2[�(H�܋1vR�6WE�b�����ZNb�;��.%�sL����B���t���|n��t�y�5c6��#�7�z���^��(�9�A�]�H����F�i����б�1��r�X�f��F���g|RY[�q���������̄��>��K���A*�~�'�r�?�=�'v���e���U��1�ϘmB�b`��8�G�YU��ZY��-��V_g��H���U{�>{]_;ɤKc�%���\�W�T�cr��D!�)�7�(�ڲ�̼ʠ�}�r]@��P��H�\��g�c��7Z-)���4N���ꑂK��Z�m=�Y��dw�1��Ş(+��Y��Qn;�2�b1G5t&�8������
��|�kM���`R7�b��k����ƣHլd���ғ�F��hpo� Y�i���,US��S���[�2P'�!�Ӝ��ܤ���qȕ�w��n��[$8(��Y���8j\���0���3�e~�J�b��:�y_��B���_�r��Y�Uu9Ke��(@/7�画y��t:#��r��1��NG[}Ə�Em)d,��D��I|1/ӾwA����bSh����i�e�x/�%0u�j�'6���a�`5�q���X/QFPcc/�xt�9{���܀�X�ΐ�
��qY-�ET�4v�w�A���E��*Ƀa�.���8�0�־1��q�'��.�9L1s8i�r�������f��vM*�hᴥ�;k�	������A�Žl��((>o>h[<�G��?<0���� �Ji���K�喝P��g��vJ�Jd�|��]�����
��i���,9��kI1B��9��m:<�������gcYcGY��$�t��g�i`����cG��m�p�ђ?�:N�s�MJ�$
��SG&����NN;>�x(��������I��c���,|���s�}����LaO
#�/R�C��~�,<�n�&cl�~�<`��?����'�h��ǝ�G%���?9OK��D��K�Xu�ɲ�e��	�G�-��۹�F���^�t��C��`�Y<kT�"�h�
��?�T�O��L쩉37I9�w���f�Ḻ��W�-˰�&�c/v����X#�t�i��d��:���S��L�[��'u��f
P��[N{��Pμ�{q�,�̇��>h���P�Z�Y��Tnq2��?�Y���
/�}z����/�Pܨ�d���{D��;閾C�r�|��NS��*��GV��\�1�Q�+	���痿��g�a��%�UQT�_USd�.x���K��e��Ybg.~2L^ß8o�v�D�
��(�o������yy3�n�Z���6�M�ɋb5_����/3	w��%��B���z+^�Ҧ7�����#&A���1���O�..���Ӡ%fvŬ^�u��8�Aqkr��p�0,j�c�&�l�`��j�Dy��h=�v�2�v��3�5F�kl��fhiSm|�~1���A�oG�g���PK/WUW��l�pip/_vendor/rich/measure.py�X[o�6~ׯ��$���zu��˺`h:��!0F�l��x$�4�߾�;)�N֮�)���/TÆ
{°��~`QA�-�������[���/������_h��߷�@׸#��a/���z��=��@��$kaac�fs�1TC�$�%#}
b)dF�]Ya.��6���O�TCχ�X��^�A����A�<�A��j1��
���HGz�y]r�!M�`"‘��ўv��F���h-ve�G�3\��x��O����	��p�+��Po�����{c�����U�m���Q0Z���LE�
8�B<�UM���8i��8���,��k"PM��0�jtO�!�3�2��Ɖ*��둄]س/�RO���:��?��"
<�N��K�������՜��|����N��=��/х��9/B�ܳ�R8�+��=l�S����n�*�1�9"�����<�v~�bW��ԅ�lS�0;��g�B;�
�5&C0,��j��F�`ۑ��	�P"_"�5�*j��O��<�6?�Cs���dJ����7'��4_�����&���֢�lk+>�SO�ͣ����3�}���g�`�
�r=�Da�:��p�Z2G��J�t�F�'m(���~KN�Љ{ҍ�Fw'廻C
,��g�-i�\6yds���L�y���/V��QD��E9�'�,#{FaQ���!��3�'��&1��������P�ІI�v��c�%J�d����p�̴��$o��)}N��Jj+c�'��Nu��r�C�ˆ	A��c_���#�Y��r�e�b�� ^T���;Ι�?�dHTN@����Hǔ���z ^\�s��{Ktըb`����5��)4Mia�!�a�WUF͈v���df��2�g`�`����l	N�B/�#�O
<t��(�(����{,�9G�ld-�f	���pL �=�pد�&rY���Z���p�I�l��]hqG
��P��vi��4��*��v{�8�7E�ɛFv6��*�LZ�J%��e	Ȳ��5m�/��h.���5BVٛ�qU>K��W�#�:\�b�����z3	o��a>:�ӄ@<�Yu�՜~Sz&+��Z5�P��ԫ������C�T6�?} }�����L���RX5_�ҥ��	>%�P���Z�(+�D�F�^���j�x�L�a��}����M�똳�Ru����֨���M���g���l(���6���D:�	��v�Uk���69$1�����w�dž6�R�i3jƁ�'SZV�x�-���8�E}D>)y�ؖ�<lK#��&dW����'ky�
+���_
��<�p��S��T憦��$�b,Z�PK/WUW���jpip/_vendor/rich/padding.py�X[o�F~�_qJ	Fi�'ڵ9nӋ�(�V�k���aw�08�,������k�U����|�sJ�� o[������)���ﯭd
'U
���������|�C
9N�V�'��U*�l����)u���t:`dvn��;*Ȧ�n[:G���f4Y���b���y�`7��5%]/F�.�cM��:y�~��	�W��)�Z�ޒ����s�,����%��:P�^y�),
���+�V���Ǿ1�qtE��]K��hz��DŲ�^r~Cj���;==�V��x�^Ӫj��g)<OR�.XG
�M��(I�K����q�$G�	E�F@#�8Z��x�OW�`��1dӦ ���6��M�AK+ZJ�9\u]�[�P�ݲ��|f�ߤ�"�s�b��m��oN��U��"5D�x56/��j�ү��nD��T�+Z�g��C�N#OoZ�~�i�*�<7n-�rMX�����!� z�S$��ӎ�P�3Y.�:Z��B�r���E�"���;B��OS����8
}��̇��#��#��V&ٴ��3�skτp�f�Yn(����M����9&ϧMMBC��1$��\[͍�_�t��<4�1u�T�V]��ϑ�״�189�9`�/�':҃�N���40ؘV��y�~��U��b�oo�z�k�����L�wT��O���rL���̷~��W�����*�9��X�L��ߓ�����@	�m'stXd���Ѣ��F��j�0�L�5l�nʺ�r��FM��Ӧ���'�*�5�a��oB�BU޵�q��j�А�ߣ��B|.t���(M.�Y�P'�M0�ܣ=5Zj �,���
�a�Ղ���o{����Hu�I��	���I�����{سkʣį킶k��E��X^�in�{�I�J�c����}z���`,��]�I����ž�f}��=�EC��ܘ=�0U�?�y�o��6�SY�ؕ�^���[("Ye���z�u#,�{j��`B]�	R�[Gs�i�J�LV����N���f�3k�%'��]�owDR�96�x���8:�T�;�7�`�_j=���~����;ی�������5,>⊊q�y���z8�<	`:Qz80�_Ӏ�f5Yؗ�:�>��z4,�#�ో������W��]�m�
-�a�Gw��Gx:�ϔ�$l�h�+��z\��<����}������R��A*�5���-j��G�Bkn�v�]�Cz<
{K)C�Z�
��5e�Y���l�d��͇Ξ����6�����P�/����c��\��*��zƒ�pӸ����\�>Y�t�C=	�~7=��n���"�`\�
n�f��r�j��V5E��+���Ck=[B��1\�)So����1ޖ��U���
u�
D`�(��k<�
��I��	IrM��Zղ6+�kD��5|��_J��>���{#�݃�N�PK/WUW��s<pip/_vendor/rich/pager.py���n�0��y
�]@�x�Nk{�&u;G)�	��U�͞eO�����b��ߤ��u,��c�����[Ur�|2��'�ǡ�͂�QQv�^T�6u�Y!��$Iv�B�6�����Ӎ���:�KJ��Pͨ�f���Fc�E��z���
�Ӊp:�,`?_��ji�ԈU~-��<�������}#$��	�(Ī��}�|��~r*=��W����>��^���>�.�Y�� e�#R��0V�L�<���f��u������<G�:�N䧦�����)�k %l6�H٫VK�xs�Z�o-�`|n�zG�H,Ke�+Љ��0r�p
�cn�i�㗖O19�x�6���ٺ�������i��oPK/WUW8>_�D
pip/_vendor/rich/palette.py�V�n�6}�W�*Q����t7ئA�v���"٦,��xI:�[����t8�n���I���;3U�P�&Ynje@Uf���l[-M]��*Ԗ/�e.ܾ�od�n6���[Q-Ew�Ma�~�ȯ�x����7�/�V�(�"�Q���wnm2��Pu>���Fnb�(�U�b%�yl�E!�;�1�L�E�5|J���{ظ�3HSY�.�1
LHr%2�\V�pδ(�ȋ�[��{Y���;��Z̝$^��FQ�'T�r!���pv5pH��٪j��N�g�;������?��rS��{�zEA�}�/��#vm��k�#�n4�^�Y�L���J�h�������x��Q*D�T:�\�#�*ɂ?Q�~ ¿|�Tr���3ɝڊQ8��V��@Y�@�9�Fƚ�s?@`�J�����Պ��i�'��F1�
��=%6��Ȧ
 �����R!�`�5)%��؆�����8��,<Lv����%�"
�.�S�b�T"��R��@Z��b���(lL��}۳X��C$Ӌٛ�-l}˼_�s+o*|��t�>��i�d��W����~�Ne�۩�]�Wk=�f�|�9�X��m��Z��+�]^��?�/��1pk�m"�Ԏ�m�\��^dV��J�
��b+�M�ke��"�JäYĮ���n�4�5Ď�
N��WR�{��ϮSfE���a�g��4Z`�&Nq�o�̛3s�̐_{�/�C^��B9f����9�%Q�d�Hf�K���ȗ(�Xd,!qn>s���B!��4c�r:s�s�5jY�����H�ޠ���#2����;gX�M|�c=�\ʊ�s�<|g��쨕��.��q*��pB�Ϋ��C�@�y��6涑lT�.�9T5&ţpy�G�;v��[��sk��.�t�_��9�J��d�v�Q��M����6��F�/)Oj�v�&�������,�'Qm�'m�;jG~>fe�-�ơ���ð�sa� uˆm���|;��q߶Bvy��9؈�:QO5�)�����#*D�����G��ޣ4�|Oaz\m�¶��v�RL�8/475
�<�"�i|��a��^з5;E6�6��H?��`v�)8N˸y[��q��f-P�������X5)΂��;�\
��IB���{��1�).�&�|oj
2i�����x�p���Lb�PK/WUW&d�6�	N)pip/_vendor/rich/panel.py�Zݓ۶�_��%mZ�=~Ҕ�ؾk���3�e:���$脘"9$��K��{w�A`A�Nw��/�D��b��������h��8tm/���8/�~w��/߿�6g:)ڦ���.�Z\5��5>��r�nM�����?���,go�ӻ�u=�~|(kޘ�_�ݭ��~|'n��8�j8��R�ӏ�Ȝ����͖�պ��Uۭ���cno�0`��~�W����m���G~ć\�]�v��H~3����\�*���Q��.���u������hC9�8.y��|8�r�Xl�j`u
�S_���+I���N��侒l�W��غ�U}{l�L�GHPð\(.�7ա��f�׫W�,�e׋F�Z��;�r����}��]�ez��jp�=1R��lŢҶ�_�F.G�p����U�|�hlY5�B�
��m?�v��͊Ӂs��n�s�u0��)���n&���e�g^�;����Rɴnۚu&���쫾ڀ�#\�~����-kv-�m��U��e@y���=�Z��]��!R]�G���7]v�
�NQ*
th/�\�l�=��=2��3v#=\���C���Е����A�Ʒ���4��T�W
�1/`��2�Ҳ���6�=�쓦mx��G��Σ��f���R'?�/	W�c(���r}L�:�ٖK��=W{y�����8�f�D�K&Ko��sN:���2@�Z�d���FyJv���8b��.�I!�pF�v���TՃ�9g��YY�FȲL�x��#�g�~�܏0+O�1��}Oܭ�i�
��0�P�*���D
����{o��>��%>���Vs�ϔ��#+��Љ��S�]�l�S)Wɣ�w7�rO�D����NWӄ���9{��S���T��{�J1_$-��Txh�Dk���ЅFC�+nC�����{'Ѓ=�(7�Ɗ#��$�� #�"i��*���%�!��x�]&����š?;F�™\G�oT�t�5-6`��Ǧ�<<����d�W����5q���rê��@J�U�@�?nd��m�z4��~0�8l�c� ^x(fr�Z�
����th�=%��,�M�۰����qao�n4T�~�9{�%S�,t1I:��O;}�������ێ���Uju)��27q�Kgu,-�車h]m�?�/d�ĭ\y����.u|�	1L#�5�(sU�L�9,ғ���mJɲY�\Eh�A?l6D3&�y
�A��M���%�S4my�W��	fQ+e��YV`��y���#Gz����-�O7�/��@�q'a`t�``	�G�;Jb�i�t����F �,6�<<�v��}i���m���B:7/�ݨ���$^��a�,R�RĤ������/T2Of���3�Ӡ���92�T�ܦ��!&R��Ym%f�p��ԑ:u����7��tn�O�x�ʎ.�(zy�nJZ��eT����O��{M:a�{C3O�B�T�v9c<Ƈ�AK�eX&�����m�Qr+a�&3�'�U%cj�'lY��ES	<5E�:�O�̳_V9 v�
vP�|��Mï5O<�A\2z���Rd�g*j;Ӹ5�|�A�V��d|=L���z��7�)P�vJ7j�Ҿv Q5?�)]eX���&�A!�U��(A锽���`�C-O�������fS~$��o6|����&�l<hO] �B��N#Y���;?���	�*�.� �L󤿞|�7u�{B�3H�懚�S���xX$I�?�z��>(�Ԑ�{��+���h�_PsJD~�&�W�"@��?P��`t���m��L��7qAe���(=HHM+�3*�G�r�$1��4;�C����e<I۸�""ޙ�4+�tj��M-�W4&96��-�<-O:�������x��7z9㑑�����ZHa+��S���
O)'��jk��f&�.>g�z�s��6�CY���N���[�n7��FG+��5��㶂��E�V�7u��)Usꣅș���bq����n�5�AlKI㕪��Mv�.��٣�J�C�v����e�	LTI	��c�^R��
^o�
��m�~�q��	4��$����p���/�]�a�����:�Ό�{T�Qϖ��B�x���-��LaI/�s2i�-�h��kW�)ئ+g���}n��g0�<��m��C��&�07��hH7�����9Ѻ��=<ҏB]��J����t�a-^���/�S���Vf�Gy�=:9��!?�a�!ُ�����I��4�ҋ�e����l<N:hr�RƠ=I�އT@�iz�ĸD�3�*/$��n:9��.�7�|������wM���*��8+O�)������I��b��Pc�����Mm#<$��3�#��l�W�e��P��,�c�g]_]��g�导W��BM[x☆�x���?���yn߁zD��4�N!?&|U�-�Υ~���,�뽐?�Z���ma}�xn����/�2��e�PK/WUW�H�%�pip/_vendor/rich/pretty.py�=m�۶��+�C�DV���I�����n�c��y�a(����"U��Y������ۂ%�v<�>a&g
X`�oX��f[խX����f���˪(�e�W6i���H�&3IP`P�ge2�}3Z��F�u��J�2�կs�V����[�����V���7����hW�����d=)��s"�yV��߼IL�,�0�e��mU��-�j��omS?��m^^�����7�a@ Q��#ϛ�{�,y��gO����JzR���Ӵ(�E��_�ɞ�����40��2-��8:�2ӿЛ�V��[	��x$����i�.+WU=����ζ�F�$��߯����zF��9m�Z��H�%�T�]�� �LJm�L�;��l"�|�G�e�m�s��Y]W��wĶN/6�(+��wY�W���h2Չ�F�"k�%�UU��&EUmu6�'0׭����+�����^e���;�J΀�_f����Y��.����93u�8��&+�����E��1����ky��ͮ�!ʟ���j������h��]*�Ө:"̥Y�M�1�&H�kl:����]���Y{Y�l�O0�뢺�˞Jj��@�#X�"���'��-,��9�E4w�4١(��^f8�k��B�k �e��m��y{)$
IB�B*[g�.9����!�)d�����A
���$�qq��<rjz�b�f�8����Vq.��j��Ev�C�ש���(��d�`�����	�z��l��mS蔨�幰T�6�L�^f�k�z*�“��93�
-�X5����b����$!&�Ի�6,[�l5�<B��z�)K I�z����{���1�R��U�=�Q2�m֢`�������Ĥ<+�2�F�j�M���M���&��R<}��/q��pS,MU˦i��%	�,�U/�
(xN���lƥ!�`N�PE��>�Hlz�u[Uv��v��>�vV-
�L�OmFy��H�,$F5U�#��!�K|Ch���II�˃��<�x���̟~�t�)0L�9I��4�?�&1:Ȋ�ulk�#T6�rU�6C�zM�C�K��-/�[5'�F5ID�����lz1����A�E�1��Ks�d��1���%�j��&���Y,0��U{�v����-Ni]�..m�[T��ES�D�XyD�9��T
3�Z�5��d�7�"�'�Uu%�廴�egV�S"��hg瑒��\Ͷ��$<�+#�򋲪a	�:�j{Ft������,��b���&�Iߣjr�^2|���� TB��8�2;XU�~ĕg�C�4�shkBe��#�,[�)���襠Z�rW�ZG:���!f���9-��}#��|+P�=���V�B kkBLΪ$3��M��@jj�Sv@Kc��K	k�:-wN)�R�fjl<�p�����2�B5��ʷ���lX�N�XW�J�h�� ʮE�����7����nL��x<�&o����)A;)�w�S�Ԛ�0���m��2����YV3�l��̾������0-��y��"���P]5�4��ܬ��y����@!	�hBT3C����̢Ȧ�ՂÞm����=PV3�т���{`�u+H2WHR��Ͽ��4rP��~�f�xӖ��kX�����e�B Ok�(��QFF�Қ��Z��WuBR�Lq.T�'ҤV���t>�Z���)��e^��	>�R�r�ާ�*��t����Q�VB�!C��b�(V��S�pT����c�Ęe�0A�尉t�(�K�R�H�8�6*@kT�?*PA�HK�XߢR���T�;������F�	*��(�EZΫ]J
�#�ա�ʨ����Ӹ��tk�slk�yf5���=+���̀����qk�a�U;�"b�:T�#�JH؃�Z�1̙S��|����*k#�z��"x�Ɣ�8��C��l3�r�����<!��i�]��
��J*��Vii�7*���d�hyb��%r���F�;Ԫ]k���L�����u
�~C�`����� ��0��k\�)J�e�H�Wq� ����sm��35���!��W˾!�h�Gd؎1b��R���vIt�OUa,6 bLl+_�v9)����>�"\[Wc����`z�a�(�*��3!��9���*�tT;�%>���0�=���iZ�0|蜄�)z'>uO
:@�ԠGuP�az��O�Q:��!	�0yhs-���:��W��M�,�Qg���Aխ�>��j.e9X��f��ߢ<P��[P�SGV.��	�d���Cb�7K��D�F/A�|����,a.�$n�b=�����OU��׾�+$�X4$r��>p!QwN]L����4��E��-,|..|�����ە�fl��&����V4�uKa@�ͤYs�:�P���;-y,8[A�6�j�
��߹�,�9bL����lc��?�ݲ>����z|c7��ʻڝ1�1\iڭ)�Y����¸���u ��*M�[��ᥖ{f����q<�~�����|��Q��-��q�n��l}o徟��
@^��Qք���4^���&�ɍ�Ur]��͘�J-��z%��_͗_͗�2_�i��nA
X*
���|�j�e���$j"K�"�2�{�(QY'o_��)����&X�k��#<�j�э�a���v�1`�$/����Q]�2U���a��=�a�7>_MB\�wy�Ѥ��x�7�m�`�L��RL��!&�:�<��l�k�]�C �z��eЏ���{�����Y�S�ĝi2q��x�9�֗�L?��\&�8��`��D�%R�sk�4��D^ɘ�K;.(3F>>�b�3F9>�d�3K3.c�3F.�z����t{fՌ�
�(�0*S��,֭m�ٚ�56M9E��"�YB��� �~�j�JN���CE,|����q���[�Q�K�~ʠ�̸�,�Τ�p҄q���7dm���w��� ��1���)ʶ$-��H;�n{j����e�U%���-�H^,ld�E73A�1_���tBǚm�=���쉷}�G��/��k��fy��'�ٷ���
Őq�ߚ�	e=��m�`�H
�|�T�r�cTmZ���8�o�p�*0�;ԣ�6�<O���x0�Qc��h�&N�~��E�{@�;2#����r'�7�^b��(�1hO0��L����k*����5@�y��3#�)S̻�p��X
�H"c21�>]��6�"oI��e'�Z��-+����"3a�9��4(���<������B�1Vu�j���F�S���by&����}�*��(�u�l�z�E};77�MD�c��ZnMѾ�҉�ш~�x܁�[�2��I8���怅87�����WO�>{}F�*�@
8'�&A|�!�RU3M����#<�t�X��v��Lf�7����I��+��,<T͈��p��A�s!�TGH't�G�0e�v�U�-H��dc���V��#'C�A/�W|>X�d�~�D�`�7��K��|�����l_LTl�#(�o���^B�6f�0|�tIs����O/�<y��٫�@�2�X���U�G8J~|����߻��<��~��gi.�7�dิN;G�I�$����ػ^�Np�e�v#���X&� �����i��H)R7�\������Z�R��d�h�G{TJ��_�b.�~ʭr
{n�,� Ӹ�m�ɗ�nj}PS���$,τT)�`�C(��f��-��eQ5Y0��N�q=
�#�?�eC���˼X�Y��v\���U4�n��&ۦ5�� �P�90�V�óhI[]� e��T�;��H��*�U�"�[P�NZw�43%��8�o:�UϦ��b�H�.��?Ġ�ow��,AyPF}WTa��Ne�08��1���I�S�9�7��)�w�l�hy���{8��
.�#�����F�I���j[!�|�	��'�X�]JK���VP���j|��j��Sr�>F0��[y�ֹ
�!�X�\��������I�1
�kvG�Z w���&(l�{�|����FLg���da(y�[����ǸU��rWT���~Bk�^�x��:�����YN[�ia��|�~�	ΐ�C�.�N�_��	̘�=?���ϴGENTl'�ZH����� b��<�D��ED��m�+���ʳ�L1ێ���o�i�N���$���똷Ns��&-Ё8��}��n����p2[�9U�l}sϥ�ԯ1��!Pӻ+��Н:�'�`^G8��T���\����2l��;�0=��x��~&��P]U2
<w
$e��)&��1�?�oh:kH9�)�\�ϻ+ӧVe6���g�`$k�IUe^lHen��t�kq�PWHČF�^7��葻<���R�OЫ}ό��B�!��f��ͺ&"�ij5c��s�m *9������Ea�QuJ���U���$մ�xt�j=�~���V�6�۽�a��2�G��L�ul.G�U���+'Δh��Xe�^p����p��!fC��uG�	�vigdo$呷�KU�A�;��q���Q>d||�|��x���8VG���&rg\�6v�Z!5�@E')r�k�4�����l���w;غ�M	Ubȉ�=�6��a*�]꩒�{\'v��n��n�O�7�4k��6alf��o�ת{�&;�O�m�À8^ɡar�࿯����x�N*B�Zw�5\�:'��Q/�_M�md.��t=�d�Gğ82䑧
�6�������GڟB�������1��A҇����#�yG�iK��6-�mK>̾sk@��;���ʥYg<q����Y��$�����^���|��mt`�y>C����
}�q|�ݶ�W�����B���ZT
�tWY���0{��<�o����6�y%�u�nY2�V��D��
�^ޔ_�N����-ls�nc(\^��ϒ]�{!��K�r�Dٱ+��RjHž�:���2cA�0���[!��#"�0��{x�9٩n��	��+�#yh����;��;�.����qѼ&�7�@H�=N��w+%#G��X���<{���d���TI�m����~��g=�̘��BOO+vI�@�ŲlH �O������e�.�>��!�Ccy�4^�D��Sgׁl���r��028�|)��fF��G��_��uI�>�<Zo��]i�n/ AOs��<�+�}/�-�0T0{eP�=%�k�v}y�&`�f���PA|��
G�u~f!�_Է_ߘ
�\��j׳ѹo��t��u��?��]�7�g��1��3iuAI�`�/I�j��N?͵hWzv�e���-0�I������M��{5
S֔8��a"/U���������E�P�9h&���*G��;�Z灾�G��;�Z�����Xe-4��B�"�M�Y4�N���F_�V��G�5`h�����f.�e��`=��L}��dMMf�6vS,�y������R
�%!�!#�;H�+j���Vr�y �����O���zؿ&�2��Ş0RP���mg���M&����|�����$H���S�t�H_>�垍E[!�ߛ{@�;���%;��ӫ���B~�g�с��^g�U����z�~{]��Z����*֛۬M�~�?�݃�@�~�6��9�cc!�8�깗�:R|�Ff��
���Z���`���7[a|X��Ui��^+���\�Ēw%�]��+.�H*R��u�&D����C\�!�Q3�]7�C5N��x��$q�D��dyƵ8�1��dE���`S�2
��'z������<�]��č�-��Qx�����C��@��U�ڳ���z��_'�ci=>�&v�_��c	5��`��6�a��s7|��=e�Ɵ}�ƒb=�J���[\�=\�Rj�3X��#ݰj��*m4�6�����~\�[� �K�����(���r��3?�?�ƶ��.&ig�h�~�;ґ0�G�a?�~1V)�:+�oՙ�v>X_n��M�wRBC�F�9�*U�e�0y�n�Fb	\������7Pv�ΰ�Btwy{_�X�`?��Ǿ҄�1y���5p{�r�݉U��''�I�`=�~�����Ջ���\Q�y=��a�>dqc��<L}�Q�:���CO�&	=��ζ5��r���s��+���ڒ�v�E��tfqX6�GZ��Ax"��!�?*|:

���b4�ȑ���-�k��b�h;6�c)=^x;�}O�"��U,X]�F�nv�]|�V��ZNP�l=�N]���/�x��z��v��5��E�jj�A��@x���,VD|�v�b坚�x*����@_o���x0��h��_^-ra��I4�$���Zi,��#�
 8B���,W%���0�'1�ږ`J-N1��zs�0��ap�. k%e` �30[ϱBǘ�p��;��q�b��s��%'/��K?le��1���w����7<�!O�c�G��E!o��L�,E>�����_�x���;�Y�,�=��]f��)�s��/H����J�E.�!:K:??�s(�~���D�y�>;c�����3��f��ԑ{�5?l�U�����3_l�څB/�=\���,����Mu��<�}�q��sŝ^~��b㝁��0<n=
E *���/�޾I���3]6��\���&�([�
���:������&!^��< l�����h(�bw����Y�6����n5f���f��"k�׻���
}n4�i�A�Py�44&���x��`�ȃ�*<`����0���N���lϺ�.>v/q��c�M���j[=�k�x�d�S�Y�U}�i��w���nx��3��1_��_�pvb��R��ѱ�S-`����>'�I��w<�e�{xf����⅜A�%S@���)�Cג��8Lؓ�#�$�{����_�0��h���?��B&�7����{'�w�WU������u�.���iD�ӂ�m��3�~�wY������n�s����.��G.�5��SE�/�����6�M�@Di��*m(�^gTQt�	}/|_��W������t8�4k�u�?�Ӊ�����!#f�W�;v5����{
��.�N�?H����&�7ZqWyp]�&�޽c�^�h�mt�jtn�~�bě��'�ξ�����.|?��h��w> ��	|:Ǐ��5�j�D\b�/ɝ��ß�8�+s�O�
�r�n>���k�G�+邡L!�Q����.�_�K:pB_�-c��h��~<�9j�?��w?�HW�5�G��3�?G��3�KD>�c.�v����h��֭��ڲ@<v�Lm0���|G��«�����5�Y��	KQ�����1j|�߰�i�Q!���׸!��GUB��!k��]H�9�hd��_h�(�n���_�!�V�ml���Dv�fY�2b��2�O`xS�zƣdU�wA�e׍:
�1F��0�'G;�|!3ΣuU���L����oŇ�τ�tߝ���YQT��U]�����g	�?x�&>|�p��a��� ����=7���?�ߟ��p"�	�ͭ�cA��"�]v�*u��_��|d����D�D�T~�0~�o���������?Eט�.�TA�����mhDKy�lt�/�u����t�~FU��E0g�!&~��n��]ڞ����yZ�E0�n�<�Gy�&t1Vg�h���(f
���_:.��ަ�}���:o��R�ޒ��{J��B?��!�r��`��{��uʅ��#�}L7鿠�/p~�7��x���<��"ɝ�c�M��ݚզV��Dǘ��/�A����$ѣ�5/�?X�����0����x�yڛKT>O尚�w�����������w�+�mSAj+��PK/WUW��d~a.:�pip/_vendor/rich/progress.py�}�rG��>Ejh@��g/.�^˒G�Y�vH�u�1`h�mݘ�(�BqOq�qq�w�M�I.?�#�P�<�="l���*�+++3+3�\��K���v���n�*�+�v�7���^&��4Q	O�}6���k�i�,��z�y��bQL���Z�wV�e]p�,���"o�¦�O�d^���Xt�й�yV,����Z'��oO�6o�Q��]��c1�qU496��/��Z��B}]�+���kME�F�,�ꪻ�\�U�2���`�/o���Ujw���Lg��mQu�����f���d�u������̧7o�Ip҃~O�͈�-��ٜ��o���"�\꭮��]�2���o�q�c9��EQM9��:n`|_�*�9���J��P�b����r���XI5Uio�
����-�O�����@���A9G��-�>M�j^'_gI��(�/����Kl��X��ȴ*W�	L��n�\`�*�Vb�*�$_$�&�Z�'IU*Cx.�:�\m��0�WE7��z��k��t�g�:J^4�z5J��n�r�yI�0�#n�||]^]/�h�����z��į/�w���|[�ν��WM}�m;��M�Էos
��Q�,�������k|��7������Ǐ:���xxѿ��M�ޜ>O2�`逿F	�=��RL�l
{ҁ�>�|/��
��& �~<;;*������`r
I�clr:i�5���J&�Nox��G��`0x�V��	P����S�y��WH�=�c�{@�f�<����d���b>2�N�1hQC1)g��
�pE'�-��!43��Q��fPpq ��Mv�Lλ�uVW8�D��ၛ8�����0C�#��@�plF`hG�YW4 ������m{f�,�`����h�N6����|~����0���c}���N�!��z
�hIG�R��+�I��9ـ8z��]f˺ �h�j�F��C�0(�۶)�gj�R91�����(i�9���4�b(� QѨ5A(0�+o�9l�
"���ݺ�(�����);2oŻ������!U8C��wӂ>��������ꁾ���n�2F0�bU[��_��s��C>�{֪M����3�)�I:	tP��w՘Y�N���{�Ms?��nn�V����՝�}��H��ɜ%_w�D��IrY��܍fEԎ)`�MӅ��
p€�c�<'�>���{�j��I[@+4�\�G��v������9�i��3&O���*��\{]�z��*�j
���L�*gl3@:5>V�Y�8 ��k���I�*�z�D���Ѣ4{Kr�I���1C�)�
>�y)>m�Z�᜘��'�S�i	,T���d��`�l�ur���.W^P�cS�@�$d�Ϙ��zN�
IR!��;���9d���E�b�^[�Z)M�S�LI���F*j�b�xI٢���-H���gȁ��A�)��Gz����q�uZ�ϑq,�鵞��r�S/�c^X�Eldwm����;L�k��S�K�*��6�Bx�͛��Pd����e;����������Y�D�j�H9�B�Y��E};>�u2k��u�t���t`俑�\�dP�<�2DF��$4��a��q�d�q���jrS��C�l���3#)Xm<S@�e�"��%�g�^��'iY�yo��e��E� �N(Nf�VU���¥�\�@��"� ���!���q"�|DV`yV��䦪o=,���q>������i�[�+x�5�.z�ȶY�$ցx��3#���7�m�2Xg(HqJ:83# ��{$��ˇ���,�6����9�I�c��g�F��?�iU�kK�ѿ� �]n��fw�M澆��
�ij�q辢��uj�'��~1��W�2/Q����|�B�n��j����-<c-�H�;���L���U&_F�����p��̓MԌ^�F[�}���h�j�f����o��ڊ��5�J���Y����ΈnF��$Jg��峸*t�@�Y�>��B�"�k8Ajckg��Ҳ{\M���د�D��t�W3�*]m�DG���'	�2Z,jXf ,�	H\���Gh@����Y�֠�+^݌J�i�z�˓�K�wlK�fi�RG�/�!Ҹt�k�A�/7��R��R�+c<��VY��H�N2d��0���M����6����y���>i�}C%sUۢ���K*�Q�ŰI��>�+����7�zVXp Dm���� U���0��
��AZ}���"btڢ��#SD�A	e0U �1�z� �g���8�ė�zz�5��G)�HT&�!.�g��вZ5�R����y��Q�,�u�y[�#:@Ci=�"a�S^UuS�U���/�C�:"ɼ)gŹ���t�*��G��nv~��WA�+�ø�w�MШ�K��b�?q�h��E����^7�q����Բ�is�^�	̝ݮ�)�E
�q
�x�[��!zT�x4��ͮ�[�_o6N�ݭ��pi��z>o�Q�l��`�QH�W�?n����}���˥���l��b������2Ȏ�&&/A���*?��Ru�G�g���>m�ɧ��rQv����4�X��:0DM�e
y��Z�/�p��pN��i���q�  �le�&�=5l;�P�8���<(:^���i;�}ӝ�֍T����W�x��H�V�����C�Wl�a9N0~���
�!���ɵ�8k�=�p�(1��_r�
�ʹ'T e���u��[��7�F�"�V�+���;�g�D)F���'��/ŴC��%� V�;1@]d9$�.)ȿ������������O>�8 P�R��a����JIl��?�-��׷,����*�E�Q�+��2�c���?��؇
�Վ���j���o�Q 
�8q�f֫����������unegz6h���u����|BRueevN!���w�#beOX4Mݴ�rT�-��۲<��@k�|���&�̶��u^��y�����p��!*��}�Rc?���?��gA{��>����{U���㯠.�7�y(���Z-��un�'?V���miI&�z�N\��Y�F�r���~n]q�Q5�� 9�����EY���L/�P7�PM�j5$�iZO�tkW-Dz�4V�;�G�vV����Zy�W�5��"��θJ���F��>,y���)y[��TN��DlubT9�= �,ۤ&
|G��'xD��l{P�=(�C*��D���A}�<���w{��$��'��K*#n!d�2�4
Vq�D17��q|v&Sň	-bl�wvŤ�SL���!Y܏(	��scK�z?������#ye,������LjZ�� �"��>b����[�o�א�L�&���x�t�#��,M�����������)ca�$p�\;\z	���)sjO���3-	�6k����݂1}��sWU�oq�.3�[�A�`י��t�fTS9�"f���|@ms��i#
θgo�Q��po,eDMA�Q1|�U��)�&�ï+��A�7��ɱDǍ��d���������;)t���J�5[��&��0]�gJ��srا��0�S6�cM���2��et�Fl!�#|��=��]�	���	���j$��� ��/��#�
��I���|��-���^N	C�ʹmN��_;��ǟ�����~��9��&y�=G�F6C�[`/�7�/>
~cIj������z
�:�b��*n��ui��>:�Vm�U��e	�o6*5����m�+8V��宋���A-��on��N�!Ce�`�<�s����.��j2��#dU�|�!%>j�]c<�aj�Ut�}�����䑊��f�T�f�=��M�
>U02���-�+?���Ix�@=P�t��%X�d�._S�b��B>E�S�R#ƕ�0�v[��h"��z�N��vt�B�s��@n3�t��.��������Njj��5�.0�2�F�Tvv��h�r2$�B�;Q�'b�Ǩ��,��f�J��n��}V�r��8�=���Q�$.j����5{�E�t�X�qC"d����i1���x�f�(��V��.���^�
�$EI"��WB�'(f<HF�.k@��[���DM���uB̑�.�7�t	NwY-j��
��&tH;w6��#����b�	�����U�Ě��㪝��0㢘w"#S�ȡ%�D�5�pE�5��R��@{�b�qH웛���*�ClZ�����Ci��&��s��� �B���	�l���ދq���`�A�B��-�G��Jg-ؠ�~C+ߌ�H�s&g�VJX�����/3�"�>��[�V?۷��j����-�u�p��b�*|�ܖ3<v��3e����A$!��b�Pq�������7r�r'�n�!�8���v���d����.#�ݶ���ϠU���]3���ɹ���7N=̺��~p3K��|N\�"���<õ��޼F���(X@��bu�2�q;��eh�+q�j���r��3�
���������6[B;yY<h4-�QE�a1s����x���7آ�=��l��缳�Fz#3GO��)�}�l���H��߸�]x�ކ�t�Mk�-3O�=�g�>�r�Рj��Brb2�'���@3V�R0�!�H��<U;Uq�2��:@P�Mw�R�ᶚ��q��Pa'��U8f���fZ�\q�(��@;�G�N{�c��ܝ��۬�|�~8��������l&��z��s*r����H@����u��[�=k�,$�b&���תq�r�%�H%��X��0��H{��}���'��4*w9pE��W�Y���+F̕�NR�vG���h��m�
�Gr�O�0��$�����t���r���[���I��$��W��(@�?�g�'��g�ISU������ZU�D�����Ib>2��f�e���|C�E�#�.ڑ֎z���-��|eȫ��v���G۴�鳾��o��>r�O��iq%���{dӷ�&��5�d]���;�.���L0q�W��Q��e���a݃��?��������}�7��o��?�n�㣣#��	��+��>��G9���-p2>�x�]����58�b�1�tt��a�Bo�Q�.����z���UF��$)�j�5��m�Z��~�c��귘��.饀�`�}
�.e�Q0ˁ��"�/_��~��Np�C�\�B�\��f��w4�h�RnR
��7�}��Ɗ��$�wk߽j
��"���[Z�`x�۟�R#�z�/�'����t���\d��}N]���b����I�C$�}�1�r��r�a�غ�����yb:���op ���}�x�wRڅ�z��Hj
�h�~]_$h}:C��[�'O�\����<�2S�\.��'˼�e��n6^�c�eY���|�H��5+�.�z��;�Q�,!EBeTa[�@��>�j�=���b|�	p
��ї�'�U�m�x@��
\��ѐ�iP���o{
|۞��=�0�'뾐ᲀ�u̼�"9�Y1��ka�W(H�j&%��4P�f�Et�a��@�TA�Z�}�!�a{Y�x�Z|gd���{��n�q�9�'��?R<ɷ����}�
�� �����/��ʮ,���kX��,:k�6�-ik�gm��|;_2��)�,��歫M,�"v)YշؑzN]֩-V9_:)�>�E6�6(�1����͞l=CSQu�F��d��ݽo�e��Y���vo����Y�^�Y��
�ȳ�I��.s�F��tM��[t5��}��Zy��>�@�t��'��/vEΔO� v��9�Z���J�EC�ب�&��O�����Q��\�H	�FX�?È*l�2J���v��,�M�n�IZL�j�a��	q���X�T����g�b�^(��
�@�1BC�P�����U����5���BqٙL���W>�ӷ���l@��\�?/�������?�����9A}��WpC�W��
���˽��r_���Ӟ�JŜ�Q���%^��4�;!r�%nj%�!�NH�*�����[���\�d4~o�0��M��x�	q�$�c��%���l���T��~�Pp�����L�n����7�?$Z�9!HU�6�;�<�w�w�h�w��z��+ɟ]U稍'U�����:�V+�Ը:�mOE�?D��� �8��pGE�ƹG�!��vj��J_�I���Y��S�t�W&6��r;GƁLY�k o�cZfD3��r��ތ�IRߘ�…i�i�i�P�	?�7ץq�l٥� _����n֨[��~�7d�P�'�M�;��xQ/���Ai��9&m=-I�KBP�m�C&�e)��R��a�P�	7@����h�H�s����u������B�L�ق�Tz�a8��5&6�w}�e�s�ܝQ<d�@+�_�˯�B����6:h�-�s���P �ҏ��۞)f�\L+�Ue��j���s��*g=�V�s"��ΘǞ���&���)@����� �"gPF��enPK];`k&˱��r�'�5����2Ť7Ū��a?6��a�Q��j�
7n�]��^����W�h��{�����UF�5�j��L~�U6�w<���\znG�n3�,���,?��P<]��@ΐ��
�V�~�!�$y�=�I�u٬��:�i���nN���sD�lϫR��j����|l�V$�{�?o�^L���6�ҟ]�Ғ��"so�v�I���)�6��ٮ��0���a�shGuH�͌.!~�E�ev�S<���E]��Y_��i�G���<\lK�58Jp..���<^�t�fl.�0���Xز����(.���~��a�)�3ؚ�lA�ݯ�-2���u7�[;�=�
E67��1MN�C����ɑ7�D�
�F��h|�̤.v��h
��(R��\�UJ�#2���-�#;[�|ᰶ�x�)������A�0i�`�"hg	.�S^ع�^���vu����
�qh��w�T����Q��M!W;A�:�c��\x����9 @����z�aك�D�6J�H��O���3��@�c4�D��I�bmܦ ��M��zZ��F_���mLtߔ�l���I�	�ڊr�ZOϐL�%�����`#UN+诫^q�x��#�+�ܭ!s;้���Sc�Z�6��/�we�q��j�$�Ȁ��?��\����Rca����-��7p%�T��nV����*�z̥��h�S�׀���knAUp*��\���Pv����V�l�Bi1JE)S�B�p�i=�D����$�'u黼�]㚚�k�a��%�M?GDԦ��M1�&<�1�j�uN���#<��X5�^@֖�UW��m.�Ңi�T)��ڪmR��q#���Г/�<�Pk�p��0dw �@�N�%��Vx N�(�n��\�?֏C�t�ӻ���O�v�Z�	K���>Է�H���#�fk���z�i����\���.1��(�.:�p1��R�a�:9��a�R����.�%���*4��4~B�NˀZ����	�v��w��E/�L���VO�����?�#��Fm$�6�wZ���M�ףE���=�q�Q���8J8@��~�#�j|�Db�z�0�±�� ��3�jȼw73�׆-���o1G�Ck5�M=
햤�Is�:+}�&���s��-.A1�.Z>���.�%��ؕ$���9���W`�+T��21̷9��!���r'�!�X����-��S�v=IM,��:Ч�F+�HO��r���q��L��!#���܍j8YJ8N;f��y���q͛���A���;���)���|��@�����0A\q�G���L���KS�esd����k��/ԎP����w$$�?�m��n\�ahb����:�<P~�'�0-t���敎>�xeb���p$�'�S1K#�fGτT7z�+�(6�#uU3l�ł��]w"*:���m�R��=��;*6��;tY�k��Ň�w�`���x�I��4Y�U��j�Q\x�R#q���sLG�z���VM����eՀ���l�{��[�,����nK��Vv|`~�)6�Zw
8
�,\�r\�P���R�hV\Q��М3{ߡ%�� oA<�ɖ�1][�;�1���:�
�G��C��\��(�lN��ښz��1�.�Rq�J�d���39H�oc�vx��u�^w{��o������j��"�[�z#f�q3�PJ�=�4ܚ��Z�s��&�MX"��Dqdט؄�_�ʳ���ƹ�*��/����8��`3���rr��N���ȣ�=��ʔ��A#݋���k���BՋ�
�qn$N}ES�y�
97
�Žj����*�)��G��Ɓ��9rI��sC~kX��u�:3�K ���yG�xYt��7�&��J=U' Ϯ(=�Q��N�7���7P+�|�&_�e1J`���[���,�?e��5Y(�j�]�X�XM�D%��mW��eC�ɱ�Κ �Vp���Yv�p�bDڽ'�T�hE��t7��n��'�wsܜi�xwV�0Ȇ?��3G�eE�H�Yr�e���[���x�kL�a���ɲg7�uA�l'�x�1�v{��>�l1|���h��.�����:��2i[Эڶ��ww�r�����T6յ��S�kw�?z���;�G"�ҿ�o]Q�\�p�{CeH�'���fp?{�'n�鲙Rkcʾ�K3/���ϸ^�N��g��P�ҡ�T0� �"ߊ���Z�Bj`{��@6�E���˕��eJ[?aoX
!�khB�վr3��дe� \����U�
��Й�}>v�5�\&~ڎs&f)����7Q�b�g��F��vUL1"�#�h�t��y�Q�|��c��(��6`�Oن5_�������%�F;]�m1�;�/��ѽ�Y7��$�������fg�=nw�|;ox���<���7�_g��{��Y�o�.�~��S�G�&�ך�;ݴ�0�}��j�c5�[5|�Gr��o�u'���}��d��[�%�}ޛ�-�~�ۿ����C9E
o�n+����u�r��U<�7�jd
Zc�:OFs%�
��8��^�i���7m�\��F���P*Ǝ�R�U���i�h�QښV�w��ˡ]K���;�w0���޼�]�a��◡�_�L�����Q�e�A�3鲸�ߖ��!���r�A�.����'T&�fRMc:��̀t�n^O��<rl��Z�����s��0���¤1P���\��������u�
П�i}A�'G�P*��8�$�L/dr�&f``���g:�[W\-B�$�>�qඏ�m�#��֮�G��"Kr��P�)ÅnH�oI*�'���.��r �H�dF��G����ٛ��ZK�j��)�)�����V*p%�z���ϐ�*v(�{�x�ኊ���a�1\�\{��\�m�į�ֿ���%m���kvb.h�v{�Ќ`�4h��m�ӹs0}6���i� ӣ)��,�Іڱ�'˟e^��EĆܐݧ|q���ŅZ����..vF�v����z��wۭ*/�q\��Po��IKÔ3���=���Y�W�$�2�6�yS�����F��k�3C��0��͆�(h�p�r�IS��G|��p/a��,^��ؕU�
����ۥo��dC�0�o��?~��3<�6���N�Y���1?��{�j�0-�+�5
���Y�
O��q�,in��.{�����L?F@=��} q��'ĭ��3�I�Vf셦CtD��VN���U?�o�/|�x���#��2=o!�yI
���U*/4
u�R��/�Qv`l�m.�V�yϔND��
9��  vAP92�w����9b���ɢ:�ѯ�D�@p�c���\������|���)sg���ĝ�	R��t�pGa4�<���l"d��!8��ő;� �mvl�3��-�t�f2��>�^��3��	��
�4�P�͛�=���߉pnT
!>C�uL�ME9����l*���Qs�
"r�l&v�h�\�� �aJ�>��Q[�K�>j$-`R'�'җO`��{����P�	��ݹ�;0P{s>��䯶v���)��c[��X�o�5�{Kfj�{p�[�Z�d��P�B�6 )v=V��J�\�8�:s*����y��{24��W�P;��v�'�\;�r:|�s�Ξ[ʽ0D��v鍌	O�
�;Y�;�H�3#��5�sϮ�@�l�0bA8��E7�0�D��k�Ũ�cdW�0'�OJ(��[`5}?���"DoN�<��q��_E;Ŋ`Bw��Ø��?3�\���A�mb�}A<��}l�N�bP��P&Q�B�(m����,�\��vd4_����+B>]�s��W��5D|m!�b��L�ϒM�^��#.��g˨�	���n�h�2���.-����M�:B=X�7�IgFqLl_��s{-ɻp��+����4]W>����wk���;w0`�*o�ujU`3���pCM}k��K�)~'��x�n�5E79y�Rh�̄DG��V�O�Y��	��F��T�~�V3a^�T�^E��!P���#��┾�X;����%4r� ���r�>v�`����q"�j<����!���)�V��
�1F.��цi����ן�?5���U�~��m�:�S7eФm��?�o�:����O�$a2i���b�B�_�h���q�T�
K�����.ۭ�z4.��'�Y8��-��t&̸{"�LEy�=}��!�DW}ɜ\�fE<��(N�岘��b��N@5�D��:+4 �PG�0�����Q�<����}=h�kn�V䨍.OV��5�J�؆Z����
T����W��|��e�L(�[<H���X����^0���Vo:a��&"�4m
7%�B+�l�,LR���a͌���&Ny�ّ�8��m�wR�G�\��n�4>����ǫ�i��ϟz�i�3��(~M��󨧺џ�F�6D
R�mqg��N�Vv#��a�Ƕ���)C8}.���bW��I�ʗ�dB֥�	���L'd���W�=�0�R�A�D�Ф֮^�/�x�<��A�*�'|���mN{�VzANj7U��Ӊ��M$+F�S�X�E�T	��=z�Ӹ����QH�^�5���a˜|�9?�7Ȩ`(�^�zI:̮�6����@U���(+?|Ù��f#�h��[��m\gY���	�Jq���0�O�e063�����V�d.NL��
&�R��j�]ו�&A���2I��sd�t0�k�������@�
ǘ�%���@�;����m�ܩ�RT2$��@�����
!z:8���b����y�9{R�K��7�us#CN
^���h7~���H|N�jϞ���F:7&��'��nc�[�z
_�n����{����*~ra>�fтra�j�︆���X���N��\PļV�W�t3�+X��bV��46eC}��k�t��=���4ȥ�_�
�fíECdڌ[éy%Ŭ��N�P�o�^Lq{s��x���zpֹ�/�&�tI����Ρ�ӂb�m�U�M�XԷ�o���FB��fm?x���=��M�0?6�&���;�)���a��vQ+�=�8P�~6�?�I�:�"������{Q_�D�5���PK/WUW�ؘ4	� pip/_vendor/rich/progress_bar.py�Y�n�H�>O�t:;�8����8�=t��8m�B"��Ӟ1xl����p���x�����mO����I쮮���տ��8�l$�r<�j�I=u��-'�\j�TTeu�r}l�T/�������ih��^�f��ܶ4%�6|L�黲]I��۞i��!%@��
�ߺ4�Ț���G{'����-��1�H�<%�=e�(�Z��/�pM������OM�(���3̿��G�i���I��G�8��b����?w���V�����5�%++��ɖ�=��b�ZN� e׀���с�#_���۷��7zKr�z�Z������=����d�{�d�"�E��'%�E��m�2��ٞk�C�ײ��%�s��~,[�m_�g{��d���tud<P�7�.��v��:C����}G�/��^xh�9ufW��z�@�!�e�-��f7H�t>�?��G���|���~�@�3/���t�|�He%�x�x�al�eZ״}6_����*m���l����,9��p>#N�-6�d��B}u.����g��&��a��M_��]3z�S7]�t�R1��qF�^���T�F#���/��m!2e��޽��'�N�Ҏp
	l'xN\K���!����y8�1-ctGkRpܱ(b	�֩�h9#r��mC	P8�� �j���7�kϩԍ̈́@aA7W�8Go��A����t	���3>^���D��<���ͥ#�%-���O"V.�/�$�ˣ�K�4���B�/|� 6���J��'�%����G�X���{Uz�ܸ��� .�MB.߀1�u
���:RG���I~���3�w,?Z���7*�~�r�l<Q�T����`Ūa�U�VS[���a�a�kb��.Nky9Gf�	��r8&�B&�ŝǦ�a5�*cְ�I��Y�˴�1����h~��ĺiO���26H^��%L"g�dG)s�1`����2e9�Ϋ�Y�cŸ�<o�ڛ���.Zu�Y�C�>��'��}���ȗ3�P,�P�~@d{��Uͱ�$w��J(��������p�4���.$]�9G�mq�Dzە�-�h�?�Ŷ�ad[�����wfc�W MI�EOf�<^c�%��"����DD�[�G�-�$o��8�.��,����z��fi���7>ॢy��5��2#c���N�{��
����I���kY%~�-+f�2�B�g[��KJU=�Ts-p��7��И��,���.�v�.���\�K�2���u��~�h`e��\�C�1��j˕4����Zg7��5���<��0��.�"�d&���*u<	9���('��U�q���U,��1�$�W?�L�
�(N�M��X�DB�+!$���#�-�N�Bu�|,ۉr'�C�4�?o>9ez;ώ�wb��&�̞��-OM�n*i�5�s��@�b��f��.JV.Y���L�%��^��1A��U�Q}W�\H��N��+���P�J�j�V���>���bֹ�w�Ē��8m���
bw>؝lh�6
��=s���}6�(�c��+��a���ey�xh`�
�3�B������D��v��v�?�[�
�2��ouAW����B�P2�x�rb�k�ԓ�1�US�����Ӛ���ѝ�
���q;>������
�Ӂ�u�E��
��)�ǿI��%��{�l����!c��"YTDž�3XS
���B�i�o��\�8��h�c2N*��9Vq�`�(��t��OvĹ!i龬N@��G���Eߵ'{�C?��B��ΐ��ӛ7�9[���#��ȕ�y=�/u��`N�����ڦB{5�A�I������N�x�Dr(ۺR@���7���ZZ���O43H?R>��
?������E`(rv9����F�b��L�
��Ydn�sԟ;�/I�V��D}	�/@�ޞ��Kw�oQ~0��o��ʮ>6ߞ�ٲ�xb��2�R@��08�Ц�����'�x���ŸrD/����X���=��~&[���@d�쀅D��H�@�up�
���Θ�9sa��$0�'����V>ًt�H�7Uš��c���D����>�S&S�y9�It<��\�?�Ƃ1V
�+�`�Cr.
�ZQDB>�ɭ��
Hs|��R@7�����L���T��o�jx̯�k�����gֈ���X@��{�QE��Q��c<p�^_Ç3���j�����w`�D�|�n��A�GfN�-���-�޵��%E��D�U).Y�PK/WUWp�Y�
',pip/_vendor/rich/prompt.py�ێ�6��_�j_�B�$y1�i��il�	�l��0Z�fԑ%��fb��{o"%�3�d�ek�%���S��@ı��KR���=��G�2^)��DJ���Zڤ�=�(^���c�~�<%�na%%�
�MG�ժB���v�D^t��5L��'��[�ެ�Q�@<l�z��M6�8��F����c��q^�jU4t��y�y�㋏�<&��OE��Ӂ���8��>�YC+	CC;,���
m��z���I!��#u[��#�]��^b��;Z�+qU䶆��(�0�>N|D��LG��o�rZ �M/Y�� /��hÏ^#�T�v\ib��Ʌ�[�����"y^����x`M����dB����ҵl:!3s��lqQ�1^i�r�A6��L���P�T�w�c�-{;��n����d��80.u]��(�؊��H]L
]pV�����ޣj�n�&z^IW�Cp<�j5SV�>�C߰!�mr���M{$�CqB�u2�M}@[���b0^k�0�4^����˥�
�\6ݞ6��M���m�Kﻮ�h�ΰR�>�h38Ȋ��#'1�!��݌�ރh�f4�9��6/�r��_a��e�d [�{>�Z:������8Fh��Z�삗�ғ��s��>@��ۆ�1�V�E��GILuӰK�hL��p�3S�58+��qi��֍T�Ġ�JV�)��XU�G�xM4�ZJk�m�V�;D=��Cҙ�LAO���oӹg8�jg0���^�3,KsM��z��4h�!�B��ȩ@j|}c���I�q������?(��r~��z�c!M���c�x��
���"��1��֑}?�ʄ�����9��@�N��0�BCm��
6�J�2�Q��2������ۊ��d�p=	�h��/c�RP���A 8��Uk��H�WE���8�|2�,��΃��p�O�~�������B�,���D�y9TP^pQ@�
e�G�r1��|l!����t]�ު"�4�@�V~.T�G�/^��nXK����]��,cke�����ǔ��
���X׊�J)��W,g�UJڹE?����\����
H��U���6�8��Pńd��h�;��
D�8`�iȾ6�;
���HC�����6�C� r&��L�άY�
v�X�{����v�-7�6=��m��Ŝ�&�c�75+]�eP��`v.*X�uO�4�F�A�Nr<�!	Tg�����E1����J_�P�0M\E���)�R�K�L��Y�53
�\A����(C�PR������
�:��+@���6B����=����~�D�V�>�N�=��?���]�$�t\E�;���.
�zF{)e�Y��/��j�/�|�A�|#S��d�
��隬�r�&�z�d"?	eٓ������E�}N8���+_8V��|T;�n�N��ج�0�h���y�����j�/)����M2"rx�Có.</^���`���j�Y�t�X	�(��x_�@ɯB�M�)��.M-��e�e�<���+V\k��!T����ܑ!O�p����V�(\<�S�€^�M>�A���q�Ϡ�$i�ҙfrp/��
�8�����$q̅?�p�s��PD�}� ���I�����lC��Vm�f��R�
�)�$/�pAk��MA9�M�l��BeM^W�����ej4y��n�{0E0�gZ�@�d:��RXgj��W�]O�V�s-|�&k�c	6ac�H��|��WC�;'�6<'N��9`v2+�p�T�`*�3�eZp�4�q'�8l,9UZ��(
䔨�+�af��7q�g[�"f��][<'
⳽���*F1k��b�4A!tG��p�V�:qC�W����S�]���С�#_{ݗ�J�x{?����y���~ߦ�%�L�N�IA��-�GÔ��Hq"'u�F�a�S��a>�y7�����a݁������4
n�ԩ��级�+��1���JK�V*X���+���u��t��¢�p�֕����{~5ﳄ�B��"�O��"?Ϣ>~t�HN:�-���S��a2Yl®�nG�
��I�H�]���]��p9��\��B��fU��q1�������91�GsH��\��?�KJ!z�O)Fj�.�Yr�#���{�"���(
7��CN�hleI�ʸi5O2������v<��T+� �~��H��ωH�C�8x��9��nɆ��|�T�ɏ��\РU5?�R����
�'P*�#!��%�L� �h��W��$�xc�����D��=F�ˑ�
�B�a�6:�D��v_m��Nn���^�p�1AZ�6���(��V�'��r�6����
�▝���$B
��4.����y�ܡ����e請'Sqˁ)Be��Y��2��P���L�5���f��)�=d��`Uc%��8�e����<�ք��D/t��XW�MV_�Y~ڇ���埬f��G�0��;���zb�w�5�
Z��A�Ju����ϋ֠�k&p���(��-c@�~�l�d���><�'����E�	y�!���|�<?]�=0׳*
k�h��yW�}׭���Q4�A`�khW'>{��\DWE��͝"�;�<%R�O6�Jts�mq��.6DBVA@A���PN�(] ��&��5(통��OP��?C�s�Z�E���
AZ��̯o�'Ί��8u��k`K�Nh�	���R����ny�ܼ��_Ι~igX������n,�c^�#t�yE��m�PK/WUWX���9opip/_vendor/rich/protocol.py�T�j�@��+�"��C�^)$�IL�'�ʲ�F������wV�,�6�VK}�fF�Q;p�r
b��q�$�	dܺ	�#}}�z[���b�c��%(<AH�1sCج���(��Yt5-t�(se#�2ɔ���NcE���Zc�����b�|�GÐ��Fl�_����RO�V��G�t�>��n7yA� r,�4f��QVb�e*�P�3o4�/� U�j+%��C��p	-v�����Vށ?ų���5�%,���'N�:�Q�@�-w�\�B�|B���>�y&ŧڇ�ͨ�avrָ�ɇ}D��p�5|
�*?8]�>6mТtI��<����M�ѩ�h�!H�BZD��j"Hu=�(}c�r��,f{c�������d���sf�J�%��
��4�t#���� 	���L!$��RJ7R�R�Y][{�	�� �y��������]:5���� v�q%? P�(.�H�m?���2�5�x�zH���ۡ+UN������xJD� �GN8�s�Q\���n��Wj�o��.�	���B3���f��S3�aqPK/WUWpip/_vendor/rich/py.typedPK/WUW]®�u�pip/_vendor/rich/region.pyE�1� {^�r�4y���)�|�N��Y��l5���d�QY8���i{�5�1�%�;���e.��`dY�;y�h��Jؓm���FBw�Hn�mN�EO<&�y�8k$Q��PK/WUW���SOpip/_vendor/rich/repr.py�WKo�6��W��!R�R���	4H
��ba#�6�2)PTv]��3�([�g����p�9�M)�&\T%˴�TrC��ȴ�EE�=-�Ҝ�ToK.V�(����62�kZ�`vw��:��y����\
Z�ݬ.�l[�~��n~�n��B�<�Bϛ��1���7eU]h�;�s#<G�&\.ܺ�*"CK],�)��SV��.@UVЪ"xv��T����‰1��+A��e�R,'��L�5�+�QK�T�"'�(@�A��97��-	������������b�7oI��Z�8�&"T�ꂪ	y��WniQ1��m�"G��ۢڰM� �ȱƖU;���HG/��h#{m���L*�!��L1�ISd��ZaؐLp��%R�1�ր�m�G�b\���b�
+<��3�Z��x��`��c9CE4�H�PѤ���D˒��;���u�VLÓ�v�#"�7�~��k��R�9���p��5K���V҇��@�/	��Ri*��8"�6��X��	�I��o��Q����r���0�A�x�E�o���`��R�y[�ЧV-#F�7���L��b�5���2�/��/��X�^c��߁��dg��R{�o���'7t�9��tOZ1]+A�����
�����t��tOv�"�Sr��	�o��7lZ>��.�>x�{��冫�Ș*b�N��\�d��Vg+_�_yE�DF����_X��=;H&n8�[�+�������ݘ�w��!1��U̡
V�x��#NJ�4�_�������LJ��t�������2��LF���L�_n>��8�9:#԰ۇyG��	I[\\Tp���s���Q��Rb�XѸ���@7��D�1���NOyGyŎF�A�-��\�#t$Q��@vF��6�̨��%�ɚV�E��Iv;��v��&�dhB������ewm�n��n�;�A��	'ڧ�z�%'<ho4w��0�7L��q��r��
��on=�b'��¯����]О��iKm��o��0��_��\�F�;4H��އ��o��6� �t�?V�O'�3�d>1^+�	�ϱ����2sC�����������V���RM^�u`[�������L�;�Z����	��l��������`�)���b�[�
=���o�_L5���{�2��1Ū�e�>ð$U���0�U�`��n-�;K��bU�wNUnKT��(��E`ʉdK��'��u�删c��rP�US
�t�ˣ�c�j������7PK/WUW�imE�pip/_vendor/rich/rule.py�XQo�4~ϯ�C�#�QtO+�THҁTx8N�o��e�`{�ݫ���B~	c;��d�R� /���of��f���q���n腂�:�wI�蕂�|ӹ�K}�m_��kֶ�-뛪e]����I��9Ӿ�}˜�K{��?
���XW3q��U����Q1�~go_��F��r/&��v�:!���Qߌ��{�'I�n��p�o	]e��J��\2�K��O�C-�
P���;E[��ˊ�l�i�����R����.���A�le�ht�xj�r_��"OR��i1᮷T�5F.���[#2��d���ձ�p�����2I�o����S����D��0L��*c1��!ޯxu�e��{��hk��4��Ig�L[֨4�t�Za�C园Jg��S��'�U�;���x�X��q�W0�2�㭞�'ʷB��6�E��"D��y�y�C�'$$-�Y[���M�,���{��˖7S�k_…7җ�\2���{��� Ѫ!������Z��-�f�O���Zmu�P-����4���l��^�v!�"��msƻk��Z[A�j1�r`��a�	I�ހ�n��'����x
;J��x)h�2�Jld۴�J��tK�Z�c�Yi�	�-� P���hu�yL�EMj�孏3��v�N;j���j���rcv�����j���B
_>J���m/v�P�gɩ�YB\��<�
�8$*לW}��"��³�.�ɲ��(���d�ŁI�j��'�.��ގ��ߑ��������dB�-Iq���I�K�IE�5#ޓ�h�v2+�y��AT~(!���_�^���a�v��i@��)����Q�a�/&a�!��f��cWcY+E�K8�=����BS������_xt���T�ʉ�H>������_b�o,�.*A�K77�hN�{WE8�3���f�i��2Eu�Ar��!J^{���i�yi��?ח��.��ӟ���.�l��Ŭa5��"�w��1�z�k��	y�A��ޛ��9�D���ɠ�À�bFXl�<x�<���!�"��Ѹ:턵K������'%�E\ĩ�'3'����`O���|��M{<B-��`9���}���b��9Y�?I�S���.�d~�������t~�C�Ȳu3ӻ�Y�L���T.�C�)2�m��('��c}q���E��l�pEGw��H��v�CU�+�Oat��+|Ub,(j�8~�ˣ���O��Eu�z�E����?v���}<��'6�o/ޙ%vX�A��x\9��Ŏ�����^��=S:���G��y1�1�k#���~�#6�Mߧ�X��E��PK/WUW��+tpip/_vendor/rich/scope.py�Vmk�6���bP�x�kn79�[p!��^)w
i��e1Z[��U�\IN�����$۲w�!Y3��gf�֪�R	�J˕4ݗ��Vi�i�ryX�NǞ�z=�yW�~�����/?�p#O)��:T��ص�-¹��G�����k����+�T21�ܻ�A����Q��z��{�Ơ�� `/v��u�O-���y���Ε���&o�����bQ���(L�Z���~�҃�5V{\v$��o�?˭@����r��$Z}���^)��G�2���-�X����

})�{�����]8-�C}Kk	���"��=hO��$<Q͝�`�@���d�FL8;�I�r7�_c;JK�t�(Hڠe*+�3�h�#
��[��,cNA��O������E#ؐ80gV��T\8�nYc��\m��Y}�6Ԩۆ�;7��ƢB�U�Y�L_x�5��1�A�
�Y�4��k�ĩKk������.��6j��O@�f�՝,�BA7��j��>0�i9顋�t]��7P��Hk�Я�����s&J�a�\���-y���y����0�<y��j�{AҪr_���*H�]#�����>�D;GdrL�ϟJ��&�g�?�a/�JvL�wGT�e%�n�SXsm�,��cHE{�{fyI�8e��O��4��qW{�!��:��X��y��� �����a�g�@C.#V%a�CfA?��.�ד�c��J����w�⥛i�g���{F�a
f�̚8�6H��	`�kمx��wn�@NF����?�YF28k���
��;n���Cz�=��|��T�qS>{�T������ja�󸜫]@ӷ��䳚��5��!O���{��lO(�K�HT:�E���S
l���
�%�~�
���q�X�'�@q��A�۬���R:Ӽ<�	-&m��e2�pˌMj�6PEq$�T�k?܎�bKnl���1n7N�U
���p-�u>�+�'&��?�ٍv*^��3+	���5&LVي�F�wz�x� �4u��}��#5�\���6��[�w8~#`XJSy���lUÄ";�F�Z_��q�r��zu�Ç��cI=��0���<˄N![�{�sd��������eW�k��*[]��_�
�PK/WUW?5��R7pip/_vendor/rich/screen.pymTێ�0}�+F<������J�۪Ҷ��Kխ��:�e;ݦ_�6��!���9sf�^�3ثbbvVR[��,����?��7����_���b+C�3v�~����^9]\���hp6\J5;���c�,c}Zj�>>���ȈY8�����<}�OTtT?Qs�vk%'�0���(��Cj-R4��jJ�����%�H,�s���I���z`\�A��2@��Ԙ*s(wz0���
�H��p�V!Ւ��.�K�av�6�N��=`WH�%T��@���ؘ�K�!O鄈���4L0�4q"��>
�.˜[�2m"��t�j�.��8k�؜e�Y')9�}"܄����Ң�n�SU�IH]i֎��rsϒ^��XjP��ڥ�~�o(um�c�ִv��~7Cp��a��y�&��)ȣ&���Q�W�ٱ���a�H,@U����M����@m�lEl}x�WJP����f͛PaU�:bi��	��E�9Ԭ�Lg�J�5B�q��
�ҷV���ꣾDʷ�Å�� J0E�)S!�"諣q��E��<�w�+Nǹ�\D���.���&��i�&WF�.qbr'>$ �upiRL��g�PK/WUWcU1�2�^pip/_vendor/rich/segment.py�<is�F��+0��h���ˊRQd&Q�,�$y])�ADS�0h�;���}
��<�$3�J,v�~���}.�b�|�
�UYTMp�7S�y�Ċ�:_4E�ժ6���"^��OQ9��4��e��"+���N�߉�JDŵE)��)*U7M ��o6��8<��it���/��ߍ��M�h��Sh�f����,?�W"�^���l�"�3�u%���B�Y`כR��.���	/DfF̈́Ei�@n&"��Ҥ���9�,��L����q/`Y��#����
%�(5�.E�ΚQP���+$L�l2�����A�t�8�N�Ȋ�.L��9R0���'��^@��o8@2���E�5�n�"C��Rņ��`08/�e��
�.X0(���:x�D��8�6AS�y�ō�"8>�:e�1�9 |�L�΀��������it9�~wy�_P��o���t6=��_de���}t�������o����T6=?��l�]GW'��)"�V�ӫn�rW�#z����]���=B�~e~{q����
���˿9>����®x{����":�8{���S��<�����4:=��Nϑ�y�W����9�]�^�Q͟A�R�'�p("����Y2����#�
d=
ꦚ�� ���Z�áԩ+q�y�6*u��X��X���is@�b���$Y�X����AY�z���f�Bi|P��c�B@�q�P/�t?]BPLPۏ�
�y��n������U j0�U
�g�:{\��L:~Dp퇓�5��b�'Ċ��!{���d�7#���M�ɖ@H\�hP�"����
~���H�EBV#Ϟޮa�S��;M�|�@	��}�jQ��x)�<AFh��fĆ9(*�q`�ʆ�d;#�m��� wS͆~%bi��"[�_�����8pr��8$;�w�q��n�
T���u�ś1�Y
ϥh�Un�?�	�� '�c�sG�FAD�i�Qg��^�WAjd' �끆�fx�E��Ȱ�c�!v��,1����
��@����(%�_u����Ak��ڪ���C��<�-�v$~r/�n4�����y�e�Frф�G�>���B��d
\����⸤�<�J4����u2�~���� 14�N9i��E	�$h�5@#��M�þƪ��'-��h4�j�H��*��Aa;�rl�ڪ
$_�m\���#,#�q8���H�d��&_�g�ˢ0`S"5/mb���P�h�"x=���ˢ�>�v6Ds�F�
���5���7��c����ÉQ":��w�2dB�N��2мp)E+>8lP>T9c�?�GF\!�:p�x����i�|?]��I���&�i��yp����
4����qsq
A���B��VU��)����
��,��X��vd�"�T��m���ʜ#6�*���a�]�E�L!9X�z�[�){v�e�0��YhNū4I2J����E�Tڵ Tsv����r]�)6LM	�ଁ��������,�&�����A
��1��[�QW�O�?��Y\ؖ���W���>w�o��q
l�a4<7v���S3��ǂC:fB��7xum�1�	��;�PUw�Qo&yؓ
��di.0֓]h3p��m�A�~�⁠��x�@~��z�)���{�m�y�T��^2�:���Mx�&��8�����1Ϳ�x���rZR�e�biE۲� !��b?�ge�h�77\|��~����X��3S��A�ǧL&pzBM�&�c�9�[�X!���7q-Դ��X�0� ,�T�!Շ�ʝ��hK�G�}lw_���s���"{�uz��RB�����\EӧHcЙim�8V>�2�X�IE-�F�5hn�g��� u2ۇ=~?��=�NS-:z�9�ڲ�'
ěFY�?<~z����$�+�p��������H��+���3HFz�6p��=uu\��lMy'4�aKD�>�[���$9@���6hY�.��u�j�	S�&���L�A��r|�U���;tM����4ŘW���z)tRy��@�?J�Uﴏ��]�p �C#^�>�m��֯m��`^�.9�5�U!�+�*}�{�rj��T>�|ʂ���s�вh�ߔ�=�*�Q޴"�;�׮�t�Ʀz�f�Q����/�f��šI�˜�9/D
*w�8��!��5	�j�ژ�Y�:�K�*��l|ʉ�3a�<�C��ZH�O=�yҫ/��\�&E�y���~�_��ad�=�ŧ��G�+��BZ���OWK�6@ל��H�;Q�K�E�.��G��(�}?+ۗ�x����)@��xt]���4_d�DDJ>���N��f������J�<��yAܥa�σ�|�M�0����MG�w"�
}�k�^��J���}�7����JE�C��t
I:�8ߠ�p��iC�pȅVӜF%��F6����N��ɹ�;�m��ܑ3������l��u]s,4+�`*�n�n��V%v�ž��:p�~��ܦ�9m�I$�vW��3�x�)�ˑ�)������O�$���a�Bjl�V���8V�8���"��9t�}���n&o]��"R'�Y���	m�Z���XD:e�9���ċ�!���l�=nl6���	Q:��$$���b
{���=��v�ao��km�V
4��ZO�E(%�\�RQ���8����y�^��n(`�E�S���P����p��yk�	h,Ƶ�u;�Y;��U�=���
)���v�.mm+UȾ|��)ɦk�
����a0���*�|aw0T��|��B?��F"k���pC+W�	����^9u�wG�B�^��="9lc�R��v�f�]�7�ãV��~y���C5"뜦\N�*ѶQ���}�[�?lYb٢�r�EAl�NxD�M���D��P�	��4���n{k �C���7��$Q��^C	a,��,���/����7�s��ڡ�l����Z�*�F7�g������,
�Ģi�$�U}��H��bj�7�
l}��+8�����
CY41��!o8��a,4�詒�%�_l�m5�!�)����^�w���>�([:/�O�R
��?�v3���a�b(���Y�,�z�|e�����j��IBn�uT˿?��SE]��H杕G�<+u��=���*	��s��K$�zvѯ��M=��Mf���pRCRO+�SMd=h
mġʀ���w��W*�C`�n�E�e�O9��N�.�Y��{4�wsK��^�e{y䜎x��8Vɖ#�?��oY���ZI��ƠS9{.-�ݤ��
���BJ��.98׳�����@7
웉�T�D��4*�!:$`���26IXkvf�!|a�2#�1VB{��8��*���&�Yz�GMQ:�mBwu�3�g�;�\���z�cY�V":���B~j��T�MS���C�Z}�oӓ�0��;"����9���{�\���ƥ�=�r��}��%�xD�8���}�5����g��U��w��qw
?�->�v�߱z�/7�r=�<�
�)�ߪ�!^��`2{+����%����@�Nir{�/_����;�9/��a�S1�zs���z�:]�Y��<� Y�����-�Z��/\�K��ź�l��ab>��w<�|a��:׫8� ����V<�m�쨱<��� ��/�V��}4զ��⺱N1�\���:��i!J|�(il�-|�e��Y��Z;*N���(�Hy��l�p���%Z#�7�:�m`>�q��yh� �gc]ﲐ�"�
��f�*%�����?{�R�(��t����6�zΑO�=��;�)[[�E�? ���Htⷩ}��T�ު�WK����
ܯ%�a�+�.~k��\�L�F��C�k�oKpТ���â�h#���>{`?�I:�!.s.A�u��J�_��£M�}��X�A=���ȇ���Cd��D��b1�"��?�w�frw@���=��Wz�Hԥ"L^j9b"p�,��B�g�V�>���S�V
K$eV+��t0-���O�B��=I?��xܕ��ک��93	������!CƧ����6��X���-��[�鼥��X��Y�)��1�+�`��C>Zn��bM��m�ؙ�Ӵs�r?�L[�okLjϫ⑬Ӝ��������jz/!Ϻ�@����M�S$���Z8���Wfj���첄�=�E��C��c��(ܷ����?���-�!�ʷ2��ˑ�JD�:���w
͗���l�y'&Gb�B�P���ţq�=�o�t5���ߟ�e$�x�������4~�9���H����~�=k;o�q5	X��1��>[#�/�<�7�PO�I�+�n%x��?���-��j�;Z�Ro�Qp�X)P����Lc��x��ϭk�\Cbǯ~m�u����-�4��A"U�!t�F>�%��DQ�9��պ'.7���n��D�Q�h�!rk��e[�?��4�F�%O"���-�S妧���Y��e_����#�u�Q5���i=R��&�@�K8P<�M�|�s`����N���z_���<1*y2Ɵ-
�_��Y0�tU���F34�������x/�ړG>F�=�i�ԍ�G�X򎕾զɧWs�l�J$�F��T.�#J��Ɩ�[�Q����:��0W�nq����i�o)Y�/�=�Dgd�LS��5�]F����Y�u�z��Y�	}��O*���O\�Or��=�Cz48��x�q�� �V��Q4��sJe߭�	m��ԼL�q�xXTcz�����L�~Ø~m�m	|�O�_���V�(Q�G��&�#�1"��W�e8���b�n��*�A��E�%����
�
ۘ-O
�L��U��K�]1��PFo1�դv�0Q�&���5u�g��F�꙱K|���$�|O^�EGbݵ�hf��0�)��j[hY��x',})�mŚ"�(��Mpߒ�B�筏p�=�5�·��T�I��4�a.�^�B� ��9����L�Dvq�W�Џ���!X�_���9�{U���G�n���!Z���P��?A+>nq2��=�7S�>����i&n�y��Ľ}ȋ~�<
���0�4b�P1�!�u
#�Ѡ�PK/WUW�*��X�pip/_vendor/rich/spinner.py�WK��6��WLU�����h���
�n��͡0�kS6�H:��w�����E��PvE΃Ï3���`N��;��S6L����{oD'Y[��oo��_o�_�����w�g��̫Z���J�.�߾��������Q�Q���4��a��?�`�O���l&�4����7��]pt���6�K��r����֌#Z����ȝ6���Va6۴Lk�w�vdY��Iq`�V5�—j���$;pȵQ�n�k�e�����w�@�;dE�=XT�4�����KP^����}�N��=G����ei�ƈ�Sf�ֶ����y�(M��,D���=0Iv�wJ��<��s���i;fRVа�A��	w/����G����:��W�;�����cOg�����-o������>o�29�¤�����G����2�x��p�y��5Zxe
�,x(D(���g?Y��Q�0p�n�K_�+
��
�M@1�V����M&;���L�QfE�V5 b�d5Mi��5��'��tE5Z�z�srRR��Bj��۹��/�����I���4�Cܗ���p]��XeN#[��:��p��������r��mj�q*Sq��Z�G;է�Z����lu,]\�Z-��k�MH�y5O5�c�e�ף3R�r����,�a�Id�����@�Y��,��,$�I�v��rL�T;�0ˋ�,��j�E�")a�:�mNVqsT2������u�`���u9a*F��E���*��;�K�k`D��W�ݏ���-��	��Ð�:���;���M.�`R$��G��co�c�N
�yB\����Hǔ'�ȭƳ�MWQ��|�0ie?��y\/�p���p}b����p�|�P�w�r�G���}�?mY1;C/)��MB� Ǚ��H=gk��>�0C��3ѥ��0��l��NjS����f�Q=�;�8~�Tu�PBH�K-�'9�:֥kV��ۼg�-��Eq�Y��V��q�kD�Y��
������]������dw�E��Ƭ��4J<��,�k��=��ȑ�l����s���(~����%
p�rB��u�q �/k���lz]��K�<�SS�p�b�uM�d]�S��h���l�-��l�T�����s��'�1�[�Y�rl�����#��Iގ�4��-޴��
~;ϘE�a�}�2^%{^��`aw躄��D�Sa1^�Na�dEJ%Q��%f7���W�I��:��n���:F��?!�hr��>
���[�@�1��
zدF�}��l=��=��)�(��uO*�+Y��6H~H��{�iF�MR�N<�WH�PK/WUW�(1s�Ipip/_vendor/rich/status.py�Wmo�6��_Ah*������ېà%�-Q6;YD*�����,;�6m,��^H�#�#qGt?�Q���d�����Ek�i����w9RZ��Y�YG�е~�џ�oȈ7�xŷi82Z����W�L{#��G��;�6�98�{�;�j�;p'_��u�9�/XL<
�e�O�$_(:|�#���Zc�F�D���1�� ��=�$J�j�r�$��Ƒg+te�F��R.F6�ɳP<׸�Y��,��c���ڒ�r_$����-�	j�Ƕc�Y�}!-�:����,�ҩ��-��Z'�QB����h���&)�M%
<92V鬥._�a�5�<��|Z�8!
Jێa���2�����b�K�:�v$|W
�m�.������<�h �1��P|*l
�bjH����TTU�"]��Jl5k.��6���ʵ�)�5*U��yFVH�div����
&Eg���D��b	���� �%�UDBaz�4$���*c�碲J�a�T٢(�I͗	h�R�Α�-##�,��WM�R
4�Z���B-���o�xLby�)V#�9%�(��)��t�4�T���w,��f�ݏ��U�M1�}L�)@�GKLQ&�W3qGܘ��֠�A}����7R^�Y�DRn7'�`��`A^j/�2q�w�ۅ&r��M'{�6�v]���Zɉ�V����5��/���lY�-8JO�9򴰡�;O�P�������[3b�ņ�o?iO��K�j#�%�;���7�mݑ�����-�����3�^�y�V�2��������A	ua'�g���܌w.F�ق#j��3�v��q�I���T�g�}��8ܼ�Q�q}4b�亚˦��q*,ŀ��`�Yl��l'-`���U�H<ݖ�2��	6O 1�J�~�VT�����y�+yEf���3���皨��u��@>�AoB��>����4�T�����P	����c�WU�B�4�x��+5�أ=�%ݻ���7J-a�J��p��j���K1M�x	��k�H�\5k7�	y���$C��m�)=J?��Y�m��F�%�q�(/_
��I�Wj_Y���
#n���m��z+��
��P�Mpb��q�K��>����K�(�ݫ��Mp�y�_^� 1P���F��P�g�z��6��4므	��rc���$>���6�e
J��ּ,�']�Hױ�$<��^���*���"5�mGBzW>P��Tׄ�v��:P�PK/WUW�8<���ipip/_vendor/rich/style.py�=ks�F��+&ܪ��<�����u�{��:)I��+EEC�PD\����~�u������=�֪Reb�����3��$�l�b�<X���v٢��d��I��|/�\�o�\ǩ�]�6�r��<^JE�-�ُOIV��j�M�[�*ۏ؏ɢ�7/⛔��YR��O�*ɳ8��Z�e�8b������‹"/$��"O�B��Ƈ���g�"�l�ؗߌ͖��Fb(�V#8��.n�d��c��f7	p7��|��|���r~yz��7o_��/���ϧ0	}���c�>������/H��Զ�$Kp��Zp��*�$\��얣��}��	�\�k@�냃�E�%��!�����+@^.�d[�������_K^�X����Hnvg7I5����L�ρ���?v�Љ���Q���_�g���ǿgo����0cD���%��XҸ�_�jD��ç�
Wj�DDi��
��!�����8�c+ٷ���vE&^	��of�����0
"$OZ�W
#d=��������i�i����G�t/>���E��ܚ~h�Y����P�a�X�[��h\��<]�XR�i�`�Z�h����GΞS1<M(�V^�x?vz����b��#�|���?�i)
�尯��A;J
��Ћ���_�E��\���׀CN�p*-K�⟫1���bX�%�4k�R4Gl�܊��"�:�i�kT�vq�L6������F��
��i��fL�{T7���R��h���
�Al���0� �0�:]pГF�$@Y�6&Z�.��5h��<�m��n�C�sUě���I�H[)�n\��.uUݸ���ş��[ޝ���R[�4���L�
���Z����l�d/E�k���u\�-D�.�d�4�2��x��*�o���:`��b���"9w�[N�˱ӅҬ5̓��,��-��AN'��i��;
8~� ��;pX�%z`W3�ɋ?��m�Z;�<Q@�͝Fwȱ���'����X�O����O��x~f=?���������_X�/���rx� �'6����b�^����N�./������3�X��T�c�vhC+����j�{�/�/ܬw)�66Dc���DaWt�-���ة~ڽ
�r��^���mh�;v�_v_����θ�!�v�}�Yc��a���;�o�_�د����@����C���6k��5�+n��^��%�ϩ?Ԁ@�;a��v���$��5����	'�N(e��vsH��	���P)a'�'eԒ�gP1[!��W��ө��q�}���QJ\P���;��_�y
��9��dɊ%�JFT2E2d�9�{����x�D�K�'������z8T�f���F<���E�3~7�3~����k@#VW��!�(ڞ�d��C>�C���~^1�x��rR}�U�;>��*橱0	p+����N�Z1�r`ZD#56�&�u�Q���i�mV�f��ǹ�9_��s����Wo�?�G�Q����$��F�#���(#)`��D�}]`�z-pJ�޵*�J�)�Oj\�AO����S����N)Z��8�e
����?�)C��C[瑥���Ҝ�� z=h��=��
����+A�{�e���C��h�^��������`D��T�M���.
�f P�\���y4@R��OY"��aG���B�:_j�G��$,�����+�x�a���쒏qʳ�bUl��#L�M^p���*/6q&��
�JH�;;�St��bHj����<o��PNN��v��5^��O2�)�ւ�8�r+=6:zNc+]F�v=V�S��E  .�C&�%�]QZZ�����O'��DL�����H"�ʳ���x>YA�DmCRx�5�]�?��.���4���U#�YG5[{�b�����
��״�vk�Ý��#At��#�U�"<xA��qw��颒.�
{�=p�_�N����﨏R炦���V�fЁy룑�v�T�<룫z�?<\�R�̦�ӭ�7i��8��T!1K�O?Ǜm�]e.���1��,>��4�ٜ�,��=@�^
���L?�
�k���Fn�"�ǔ�;���ы����8��`��D�$��k]kYÊ�h!G,�X��Tһ����-�x����Gw��w��~0e�x����|���a$ߔ�𾦀�7�}��(��Q-Bt$^øE����Ɖh41�l"�o�J���V�D5��F[��g�U��;�*����@c~!:D0�� ���.��|�>Q������z��m�<RZt����D"��])4���E�s��e�;t�r;7dd�E��9|�3^�Z�U��~�M��&��/u�]������յ����ʢ*�\�
�|f����[vts�����e�
t�"q���Ok@�.��S�yD2��vx�I�2�������<��4TɈ&#�)=�dp41��
=V����;�m3(8{��8<23IKϚJ���I2���'4�A�Y%uz�I�]��R �ľ� ��41��b
����b�LӒ[�!%�uG��Q?�y�W�'�������i'+��4Ea�1�݃N��O	5)m
5
ԃ`�~�O5AmZ
A
Ԑ%�g
*�[�)�Y��dր�:��D9ȳ� z]E:�j$Ѱ#9D�����f"p6��'Yd���j69�a�hlW��l_�gC�� ��U.h�&�d���6�G� �����#��4G���e��r^Rm��.n�ƤS�����Jr��50o�z�_=d����&��E_W�l��
����A��s�i4�_�G�y�Ag��-�yar���[/����Ӏ�
���C�����u3L^]7-٤/��Ȟ�E6��y_dOz ���U+�! )�X=z:j��!"��oy'<x�� :|p/F�����C�.C���-�2����R����f8�b{k���f�ٵl=9j���Ϩ�<X׆�����Ki�` �Ԛ�lȯ��/�D��s�����p�mM���ENfUaW
��
Z_Ͱ�q��q�+�Q�<Q����|�Պ/*Q��K�֠�/9	/+W7O�8��R.�祗U��)�`������]�`�
`D	�R�e�-���[uhL>����n�4 D��F�q��E�v��M櫤(+1��� +�����#�љ�
#4��c��	Vl)�F�p���Fe�ڔC%H�q��`I���[�������+����v��ۛ7����K,~�zb�a���p��XF��m�T^j,#�pG�QŪΑ4��S;��j��z]jY}j��
Ñ��v����N���U�N��Uզv��!�IM

<�rS+"
Ù�S7�Cۢ
HV1:�pV�D ��%�-��1���ޓ9	qC�dE�Ϫ�#�X�����6����p�6;�΃��!��V��hƿF�igT���"ɪi}���qKs(#��ޞ1:ns^����(a�]��n+m�p��&(�݆>T��ڳ�X���0��=^e�c��V��L5��B'�Tw���D�@;R���]�|8C����%��?;��5!�]4��B���ё!x4���fp-���k��$��lw�J�z�싌M��E��t���I�y�h�BMD�2��Љ�s�iMf�����Jr3�Yk<D�Ḧ́{\;L��Fxӕ2;� �U���[;���xG�Vݜs�w�#�ymޮzk
,�Uso��d,	���>���z+�x����a]*ZS]�z�i����TS��Zy["ʭ"��}��Rd��yk�nE�w�H}a�S ��jU���:�u.3�H7���]�@����zb�~4�%b�1��06E�썽��@��p�'�Vɲ+~O�ߛ充c�dU�
T��w}��yh�b�LU�VM� ���ޯ�]i�W����~�)�WT9�ݽ~�������JM`����ۦIeg�V�?$��-*�P�p������6 ̚��ʳA=��2p""4�Yf.q^"�D|��F"�f&�'��(�hղ-�Ͼ����=�A�ԋ������^�
!�
�� ��+�U.vv��}S�ӷ-<��%�#
V���7�+�AK����"�g��˧�|weV[���i�y3x~����@�T'���!���17����?��=k�������ޝ��VrZW�hS�m�)��Q��W���I��O�(D��/�ߺ��u��Tq21��G}�t$N�L$��s�6���O?��&�����KYF���2-���/.���^����A��W�_6��`RG��Ϡ\b�&��b�����D�sc�)�X	^�v�Ԇ(�
I��@�w\EČ	a"�!h���h�H%��楰��M��VY�s$Uel�h|�D�E8�FH�{"�������,,�5�|?h��d��% .(��}��p�A��F`���b�F�=yԇ��
•ǟxr���~u�[|���k5��ʳ0O��`��[Z��x,?a��������*U�m��o�on���֦�@�~].x�A���`��(p�G_�qk�"M���U��S効����h�%v��Z�MdA��We�[���y��P�VJ��D�ro�2�w4�y�"z�S^��?������a��@1Z��$��&K��d�Sb�����K�J4<�@F��D�{�qL�7$�s�����L���z'%M�������)�B��$��/[B��'
j�*O�o��;C~�+��\_��x�-�
U�H��"�+xs}�8j�r��m��-�Պ�	��Ї�[m��!D�$����鳈��P�����?��a��&����r;�7o��"@k!�h�JFt�D����q���-'��*�����w��:���2�����$[�J�M5B����=Id��j7���8��ԧZ��g�]e�VAP��Kx�W�A�.���zՀ�N�H<�T�)��2]KbQ�cQ#漥N�&9˥t�]�P��$[���b���ꎐ�o��=5�˘��!��_;�|=�Ƣ��3A����/���� �~��z&�~��Nẗo��n������=�R�IZ���ʝ��, �SIVJ��&�I�5L}�R�Kt�D�I��p%�A�]!"~�+G�W�é�.�_�-�.�obY�$*�:�
��䆚�k_��j���'@���i�>�o��Timg�x/�r���kO\�e����ߍUvp[�V��\?��k�p���0�M��.ۏz��V�z�2�n�~�7�6������;h��o���j��
{���4{y@���P��֓���zx���kp�į^����TWJ�3�H#T�k!t��rwx���<G�����iZ�ňY[��c��R�����YX���a_��du�1����KP�~aL���8,p:���v�V��
�����/�x!/�RU`���H��? �\��D+����<�&Iy�Ȇ8��A$� qh��P�o5�^��tg�������2wW`�fp��ɏ�Г�i,�|k��Hs*u_=>�F��ɏ�i��rЄ������
���z;Ub2��@Q�A����܍�{�z��_�Tn3�|�&۟A�)�{\�V�L�E\<$����"r�����R�I�
;�<7y��PK/WUW�
�P��pip/_vendor/rich/styled.py�T�n�0��V�� Qi4����v������	L$H�����o�T��S�g?�1�Q#�Yك�2^ߞ������LJ,�<�9�n�G�_4G.mL��V���vV�7^gͳLt�lu�CN��6��2�i+ܩ�g./�<��6�h���!k6M���	!'���.��Ѭ�*[`'�OH���|����$�?�0|��IN���+�/�Z|����R!��4��Е	���EJL��R��;xT�o��@UR^�݃Py�aSIF�W���X%��F�)��v�I��%���M[����.�D���
�sJ���
X�I+7��j^�)G�|��ތ\�|�]خo�]���QD���۸X*nԡ!E�,*���N"4
JG&$���ڰ~d5H�p�m���.�2��4n�6���U�I>D�7�gx߄}�ON�|)J J�ps��>K�p��?PK/WUW�Z�L�e�pip/_vendor/rich/syntax.py�=�r�Fr���#�I�%���Вl�N�U"'�1 �;˅����=�%�Wʓ�?f�,)˾��.=3===�5=��f۴}�t���G%?n��_5�F=�B�u�N��C�ۣU�l��z��_>M���b�oD�n��MT嵂{�-҇~�-��~v�uZ��yV.z�{ы���?�,;��u����V}�vۗM]T�t&���B�'YȀ?�o��w5L��G�r���E�l�t��و���J|��%>���sz�_���N����:�H���J�:�~_	U�=]�F~��J[���Dɾy'j{��6���{޶M˷_�Z��~/��M��J��6עU##۫�g}� �����e/�m�C9��sח�B�iUt���������t��}Q��@���nz[,�����D�<+�ب�ͥy�4[��0�m�˯QU�]|f�շ�j4�=Ň$���y{s�a���)?&��B�D��u}�ڿ���Do�ѾݮR������Ǐ����g#�n��^�#R]t��@3'?&�S`'�g��A�@���X!��g���$J�������}��|R�+YՋ�leY_��v�ѳ�_�~��<?���o��yW���у�|-�USU�-���*���2j�h����ѣ��_ﮁ��G��몹~�)��vx�8=���?��,4z��m�i��\4\ѭ�F7�R��>{��|�7�'$/4$�.�?������Q����?�JNd�,7�y����M+�m�p*Z�Z�#�q]��b&*R!�ޯnS�6�E��~�+���'j$��v�)�ݴB؀�O�jTc�p�T %L2QA�8��J=���b^��EC��	��Zz��[і�:�R�XZ���苁F�N{��׻~j	�qY�-o�}nr�{n/p��HWLp�T8@�J���?n�膂Qw��X��`���@ԥ�;�]�mȃC���ɷ�5@z�`CP�9��?I!�����?��ѣ],�}
Q#뻃���lB����?��b(P��4��wJf���MVc#��:7&���O`�|>%�F����XO~Y)�W���Y��>�L;8�y����o�x}~��l�c\���WXu|
6V�eѾSP.�t�W_>{�?���w�^�ʎ|s��ً�_C��-p�Eg{ �0&7b��Ў�K0##�s0*��FȨG���_��-�����U$l։j�Dt��$ڴ�G�_0���עǖ�g,nJpp�ɕ6�T[��8�Q/6`w#�X�(Dуh�7��$��hѼw�`�Aܴ�qw��y��LDC�s�ä]fc���a�ΌQ��zR���� �=���</��s5Nq�qv_p�.,��H�
J`�T��X�Ŕ��I+WQٕ$bF�'0��|�����/�&����&�e~�+�[�R���ۉ��x��Ж�:a�;Y'az���Iv���JRz�2�g�|7,��mΏ~ɩNa��Y�#�,����}޻p���,�χ̦�4�]ZY.�
�9i����S��Lx)������}|�ˁ��_elV�>k4��A=�(���;�<�+N���q
G�B�R%a��5��Ex_��}Q���+4�u���*:Ȅ6F�ȩ�V�O/?N{Y��-�����@M��a�f�ԇݤ��^o���S9��"�;�nSv�cn�ɩ5-��wVw�Xl�l�w�n+'dY���_Kf>`��TDɽ.�%m����j!��7
��M��\�n��X`l�)'қ4�ū��9�.Z��x�E���xe�*Mq%�5����V�������VoYp��\�/�5J=no�A��e&b�L�fd�u݊�Ew�^�?���	�_A8��y�t%��:�^b8����+g�o��"w�mQ߈ٰ&71�{
�: ?�U�b�����S��W��J��+
�~�\�!V�`��4���H��KTQM�7�;�z1�O��ɜZ�Y.
�:�A��65�]�n���Tw�H�ɉ���/��IdS��@����#93�brRУ�-z�vHۖ�w��)-P[,Eʘ��7��;�A���!J5��h�3�3;����%zY�io-�E���D
S��ڌܡF��h�H��xg��<4ë7�����:.���돛�q�(+.3�<���OA�^��K\֚]7Me��z��ְp�@�E�ꨨ]�WY=�7s��n�Oق���d��u9��h��).�(0^�a��3-�Pp�l���Vs/V2�Э�]����-M_�+X@�&"�Qь�Z��4z_T;*�
)
͵�$�e4�3��i�lq��{�
���jN'r�H��;v	���X�]L�E�m���'���-�t��r�z��ՎV��Z�@�6���~]]�UTU��6�ڇ��:��?���"u�kg83Ǡx���̇ � �%=�ٛ�*Ë�P/i�dYpd����&Q�}~�+�"4[��ͭ�hr~�����xu�wXz^�A�P�WI��u?�qUU�J!�՞��?.E�3 �jT0S��E��$V�ɨ�
}�E(^`:*xdY�vX�3Y|�E]�Ԡ�K��3*GP��~��	+���C��.��˩���+��CY�#�dy\��X��5Eb�R5R�B)8gx��%.�F��2Gw�D8W�f@�>c0�9!�EO��6�����b4���KĘ4Ƙ6�S��/cJ[�~RIIՅ�$�#�+茶p���,)5V�'~��>f�1���IF�w\f��2f-��4b2��G�
�,�pڤ���ƪ738�r5n��`��xݰ�0��`i��鑷��
`�B��q�@t���A`/�K�8�Q
���v]�C[-f6ڠJ�e��@����4h'�?��@�%/�:&e^=B�%�J��SD��63�NrK~������\�]�:����z�z�6 '�bbvB�j���wR8�M��E���Ɩ�3�O˥��M��b{ϊE����h�8JrLVŞ�g0۹=Z�����$֯酧�q�KƥnKp"�����R��1��tb�#BSa1�&`����bS,����z�<��t��Y�	u��묳,����O�J�����?ϥ��n��]�_������x����n�-�f�X�`i~���J1�)���������!_ʟ7�)�H��Pv��V�S�gJ�g�f>`��-�*[%���œ[B�������.�B��7a��ė����O2*3�!F'n�a�
�ɔɜ�dDFd�m�Й�I“5�w��<�l�d|�d�S���;|�O�{���`�(CȖ"���VE�^Te�)Y�5ye��&��-�E���ؐ {!%v	���w)���z�HH��uY���Q�2j[���� �6���-t��+�>����S!"WW�����Muue��@]��`�f�w�7���#��UG1V�pI����x��%b�M'�vl��wǯ�GKj����?SK �q��I~Z�jX��:�Y�R�%u:i�J�ޟ�%�{i��vIK�^�����A����ck�a�*��|7I�;�'0d'Vb�kEJh�V�&����F$ ��V����k�ba5�ȞI�r}[2��d��(q�c�:gj$���%k)
5�a�PU����wQ�A������X�(Hژ��?�+�/�kn���>��s��i<O��D�_�Ew��L�I���z��.�`/۹��@y����g��9-����d���� ��I��`��<z̹x[5;�s.)���Dz2�o|X[�V<YQ��Z���ʼn�SBvh�9�4��cB_�m#�^I�C��E\:��;�=|�M ʔJ]������K����_�!�m��h���479r�"���P�?�	�W�24At[H�oP�-9�{UJS�a��r�jE���}�<�[ۙ�ВK2sf+jF,?�NxÌ쇑�4_0y��l��r��2'�.q;��+�y�F�o+8o��sE���:��I���'Y�"<�t
�����Ļ �amuj��1-���d�G[K)�ӱ	�(���ig�I�=��Z����S���O�����qx1EU����n[���Κ���0�/�g�{l7#���_�����_tb.�
��h��U����r�L3��;�P�-�nG��37���"�6i�݊z9��>߈(W�L�Ã�U�"��C�;K�:4u���::�M�:����I�o�Xv�ǻڵ�bP+7�dlC��PX��Q���}���7���H����W��~'�Cf$)�A&R��Q'�6I1�
Z��S�+�q`�F2/TA�r��*���lY+m�w"z����0���8��}�WɰQѳ��6 J�N�EzU�si"a�ڎ�S��k2��
�K�Z�r�δ_��{����v������V���TM�ǘ��9qQp��g��x���?m�8zØSգ�-��v�0݈�BA��Ƃ������q�D�h~Cb�q�7Dg��m�[����h!�C����5�g��hu�g�F�;�6�%�*9�-
-텞l+�
�.渙�a
э–��R�9�mٯ���0E�t�������[��R��
�o�3��1���,����`Ԯ�z!׸���~?�^<�;(K%	=�1���]�@EA�>����^� j8�fr��Rj��*��c���b{y%��bgB�L.����Xz:~_���e��m{^�N�O�Y�D<?�˔���%0`u�g�ƞȷ�i%v쳐1E���e�m�b��'`����䊪X��Ks���'�"N�|6�F�Ò3ĤW#S4�d��_�e�������5'�Nۧ�.�e�����M�X����~vV�$įʨ�a�"��(���N��\��Wtv�I���5�����(�3O ��Dڦ���G��q��
2J����]·~�@ B8h@�M��h8�0�"�܍R�-='Ya��7Pu��U�J�}�P5e�!q�n�F=kw��5�}P�I�E�t]�*��b�!?��ØR%��F~>�3�/��?���P�̙��u��Q���М��:9iS{�hв�������؍U����O�y~����TW��26t�a4}0�H�M�:R�;�3��D&E���9�E��Œ�Ǐ�h1��ְ��[^�'s@F�h��$S��44�('޹U�̴�FD�0���0f��O��VO&ׄ5i��H���Bn���qxC������#*f(T	cQ_��<��:�3����x����&��8D�&�C�9�F��z(��	�n�H[�n<L5�'�z�fIKQ�v7����ƃ�g�ٽy�)R	�a����(�&��[���L�z;d�S��\���-	�n�Rn)�
>*:Ϋ����zn}��q1hZ2�׆+��v,0���v�)>��I�����LDb���NƖB{+`IE��8¹�+�s�q�I��mm���<����#�E2}|�l9��N#s�8*)ޢc�-r�ҡ��������,�դc��~�D6L3���э�:��Խ{�ʐTc���LRL@Q��E��0t[.��Ѻi�?��X������Ԙa3b�t1�H����L�*�y)Oɤ��I0�ƛ��d��	s ,_�']�h�����e�7u^W�Z���,�ç�5���*��
xA��6�+K�Mp~
��玳��>�����t��H@
�]��h�Z�k"���%�&�τ��Ʈ
��»��˴A���-3y l�蔭cT>�`�p�O��@qn�-�2Dž�0�q�	ɍ�ܪjf/�*���S�j���[��{{��ٙ��e-��(7DF�n�T�w�eы��q}(�g���[@m���n�/��T��xw�Z��$���NXj𰳁j�p&^j5���I�Z� �I&����h�3��:$�<�}�]�����׭�Y�p��*6*Z�E�6|����,u#�1�}���}�˄��R�<2fI�%�٧��#��w� !G�Ȱp5Q�"RVkXw��t���TwFU'������	��o�X���%����R
���^2YwJZȮp��1~�	a�A�*��w%��d�{>$�uQ{#�gɰ4I�\���&��]��G����ؒ�2H(�(_�]a���.��.�L�L������
f���C�W[V�����r\�I�+�-�3&��	M�2��m�R����G(M���l�R����J�Z�z9�G�m��4����2<fq��G���fuG�B5��F3XI
/5��b���G�C7�i	�K;�P��k�l��}FZ]�qu�3.��3g<��I�99�L�l*��>��1����::�0��� ������&#�.�����)�]�$�������-��l��|���\9JEW<�,�Ʃ���kՁ~�.�{veܑ�P�D���i-�p����!��2�(��C΂YhV�DF
9�eq��:0��i#�S}�VJe�u��7�-]U����Y�i��uj�#o�Q�X�Wy=Ag5�q3�!�QN�Mc��z'C`�;m+��Lˎ�G�*��z��9T,�Q�C��e`A�e�>�bu`h����v'N���/SI?�"#J�.�h���V�j��TK���cu�C�����O�����g���
�l�Q.��(�LPȺ�Hq�ڲ��q�UU�t|}����/_�~n�\�r�$)��-�.m���\���&�vɈ%O��ȓ�����;��;艃C�'�:�Ů����T?�G]���%wO9���\��'�F##A��4�q	�s�=L�fש�:D�-�S�e6xE5�� �*�U�>����n�}G�]^(ϛ}(>��s���T�{�[�H�S�܎tNypZ�
].��ȥ
o��gQ��)��kA�7z�������'Xk���:b�U`��-��9i��[K��Vf
����$���sB�̮<��Yj�k�W�D��0�g;ަ�"�0gpϞ���WT����"�]d�;�O���w
�K����z%O
��>v>��<aB���W���t��BUN/��H�BC�<]@&�2.u	6���O���>���g�"������6����=?*c�Q�c�\y�
�#y�N_�%�AT��m�hu�Vv��n7<j��fQ�-T��s��F��ŪB��`d�R���<��[G���V)
oR��2/�1S�U�X���	�ڈ~��R`~����+�*H-Pؙ�K�ƈо��<`r	�&@.u���+�8z'�so��a72�+Q�	��N���UD��m~�s�Y�<߀����I��hX�7���f[��0�ᯡ�3}����JAb�Ч{C_��ݢ-i&f�[�~��)�no��Z�7
�`l�la�;�=���h�5��oNϿ1ޯE���q@!��cim.�Zߥ��Qs||u,�1g5��cv}ӷ�V,�]ߴ������9GS�:y��JP��V��Ӆ��/���	k���p6�s?�6�@���_��8��}38vW�M�-m����[I�/�p�QV���1�.�CܪA�lA��$0o�1�����A�1��:X�IBU�<��^��l��fջh@����>M�-�Q�Pn8�pV�}p�11���V �D�2<q�':%̬�`���<��I5qGD���⎜�-h�� �)��!�g��v����Y���5k|�.[&��z�j<����E�vx�Q:�Un��8�@�G�s�����`:���:!â ��q������<Z��G��4y	�9&��J�KSB�)Ic��e�5�RnV��T���{s����w����96ba*�m�?�#B�X����]���!����a���sI2��f�`F�Z�tF>Β gZzg7�}p�w8�Q��9ʑ��9��G���n��C��h��������q���E-�Ӊ�3u��V�ܜ~��PK/WUWf%��d�pip/_vendor/rich/table.py�=k��Ƒ�+pt�JkW��x/HE��ع�NI:�R{[X,	��	��K%���1���ܵ���J+�3�������3\w�&Y�C�lʾ������n���d]W�*K�jה���kw�z{���G	<o���Wŋ/_��ﯾ�CF�^�ˁ?}5T]y�T��Ou��Sn���N�|��v[6��M��}�]�2���=�?br����C�T]�v�*)����b�\��
�ې����w�����U�6��+�8]J_���C��7]��k6-ʦ����U�P/��9���nڕ�~��i�?�ׯ��VAl���w�����n���|W�Vΐ���f���`{`��ˮk�v�6�B�������kĠA��W]8�5��7�%����tC���~�3�K�굔�3X��:[�:�>/� �_�����P������nݴ���צ�H���u��%� r�~kf�#�T4�͖{0��^V�zs�L�T����M���|�8��ywݟTC=@�S��s*��E��jJ�ϒ�7��k�ɀ_����Z%�o��""J���o�7��jL˒Z<5��
��
X8��^
7IZo��I.f,oʮ\����3P�K./���Kl�����܁2�o�m��kMrT�=�z��(r�	X×m���P��IR���� ݷ[3\(�C������%�8
���򖀪�5�N�WUr�U��r���@}��G�C�
ʜ�Q|��w-��KKk_���6\B='���i�����l�n?��uk�]Ң�oW�m�4�u��KXV6$���4l�=j��ķ��a��bi��i��z����2�����j����z�Kt�I��Ν��6M���`FFd��<a`45xٵ�튉��~_6��Y�#;�@7	�`�Mɬ�îܑ��*�
�^��˺��������%�{y	mDw[��S�g�m�40�i6>����7�P�&��ߴ��MU�҈�JA#���W(���Ժm���Ty�T����x���$�W#��h�C_���=H-M�1\xU
�U�M*X��������~s�r��k��y��j��W����wy�͏�����-�
���f[PX3�:PUP%�
�s6頡Nb�
z��G���@'��n�ŵ܂�u�\���@�QX���d�;��Y.���@��tpE���.r���$\1���f���=�'\q�Id�<�e�w���U��T�",�جӜ2�
و,�!��%�‚Ϛ�4�6l�ֵ׶��Ҕႁ&�P�����
�:U�CY,ϒ���gI0T��9���Zգs��Z��Κ\,�?�^�p�S��&�y�fa���oOMZ�ރb��6�$�*�b*�@�Q��O�-��)�6��\33��ȼ��:[�ffy�^��@C��%J�B�������DH�*�wS�VM��q�n�O��{GXaN�`���TsѲ�����͠�
����/��̓&z��7��Lb�'Fg���^|�21*:2����C�(?O�NA��{�3�8T�-����h4G���(d���6��m��+wg	*b���&	߁wҁA�p;e��g���%5vyi��VU�]׉����Lv��i8�۹�c����].��ӵ�]��՜[�"huw�g��'O��8�1��
R�þ�R�|X��Z�A�c�1��R��"3?�PH�����;KXt�0쓠��:�Q>�`u#7�+4�qL��C�p
/��1
�M��2,�4�.9/n*�&*�(��O�j�Q�Y{��d>tz
*�
L-��P����9%��_o̼1K�?�ؠ��ہV�������J|�x�B�AQ8t�^*g��$g|�mU���2�T?�0�
�M��'�7�*'`cxt��!6a��FBCKE7�T9���]	c�^����eC���*L�X��s"�� ��B,����6�59��c�����UUcD ){c^��<#
�.��p.W��a��ҷ�?F6?F6?F6?F6?F6?F6?F6?F6?F6?F6��:��.����B�x�&�~
~ԅ�}p��(l����}��t&�q�tڃ��2��G�NDe��P<K���;��U�V��VA�j�?�O��l�N�.e��W��3�*;�H}g�ld������:����łi]�"�3&0b��p<d <�KE�E���J?gQ�<w�bj��
B���T�\G���q��j�I����GB�,�*�_H8O�E ؝ι���g��
��,�nhn5�A���|m<��(	`�\��~���T�%��;r����+������ "`��]-SԘ�6`sGWH m
�ZW�!��<ПR� r�/�H؁�4q�e&��E�K/.l�\����8�[Td
��kqb�
�8�����Tc��V3��q��*����F{1T�[�I��ɹ�.t�w����l8���^G�R!{f.�L@�r��s^��P>�k��oS��yPC�6՘8(Oaȍ���w��+k�-����ۤ�rr��"���n�l�qÅw_(<�9Lt�e�8��[w�J�F��]��+��Eð���Q'��.�%c!���}�V9�]H�"V8��a�H���-�<W͇"����FE3o�jȥ9�S���&�!�_Hp�Ƚ�j�yf�� �
���C��E�{�8�����W��7E��]��55#73���(��newo��S��SG��Pu�,)��7�F�pCW�ej�W�C	PI?m���N�6*��{b�` B��H�4���O��Y��l�<&O�S����KP=�4+(���:�[ؚ�+:1�0d!��8p]
��[Ԡ���3�#�O�,�Y
D��u�"�DG�h({��Xl�M��;&���T�I��\`,�N�s6X�St]���̼�vr�+_,��Z�hg>M��=&.!rbZ�0�Qۊ�5�}���̬i�B�4��!`�jca�(�y�1�b!~���ʊ�z:����Q��<�}��N�T�^*C��%
�k���~��j��,��.u�*���'3��+�^ۮo,WЬ=�Z�4�3p��R4X�l��b�l�BmGv{��;�/�^7�p�#����I׹;�A�r���T���Ѓ���<6�@�+邏���X}��`�ov��jƩ0��(�.>��sN��O��E밪?n�訇¯�=+ĥ"�p�F=�7S��7z��ou��TK�l�M�i�ۃ`���6�1AaY����-�YǶ‘��?Ֆˁ�Z'�?��j����Axّ��`�3�`��
���s��Ȋ�#�ne؍
�^->b[p&�u:��0��}0�O\��� �`�{�^;�Sk���\�AH�M�Bc@�A8;�<��b|�S m擷uLS_�k(�����Zf�T>��!?
 %Z�$�T'��h�eǘ�m��������0H=|Y�5�.z��2����6�����y��A1���(���@������U�79Ү�������?);Q��� 3)$Ai�XBX5�Q��Qz��f�
l¹���/�Ox��px>�YDi��Qm��S��67�b�(�p�)U[>Z��P��Ϣ�$���<��,��9��񹓛OY\�s�)�1��YLFr��/4	7�R�	ókoG�]�
���0dꍞ$8l�`4#T���0II
�C����9I�6 *w��{ �>K�{erpHf<
T�F:i[�
��ʸ5��{l�Ҫ�h�0�2�+��;�X]��Lu���l�u����7�`e��;K�Z'w��}��#r�ү�%�__���e\&<�2��������G�J>��#���BL
J��vG�V������q��a�<�5�W���DxhJ�P�?>GN]$���E�<���M�A�%��f�v��oC6nR�q>�o�O���������HYa�R�T����+Ig�y���u���|Ղ���p��G�9J3��Q@{��]�?�Aw��Z�Jb\-��R|ֳ�Vop2����+��EQl�MU��/�1��:#�8�̵�,@�-���F�5,������4w>Ͻ�U��A��5m[���:�7)��;!�І�>���a� ��^,\��y
�&����h�3�
�ٙ���"�M���1եc�����r�	i�v��r��o���	~���D��s����ı*^��L�$��VGf3�r��y)�ڜ2eB�r���[:�*��	�3s\d�f��C��iq�dSJQC��g�
�N:�
wBAX���.2�J�Ѕ����$6#<�Bҝ������|&*�U����t����c[	��,o��݌t�c�gf:���"���U�-��p78�xk��d_��}���(�T;�c�ș4lRo2��{�Ye��J�-(dmF/̕�>�KiV9u�\����.�,U��pܲr��'�+��c<�S칚�Uo?u|+�,=��l[B�S6|�=���g[�T�)o�J�0�	�r�˜Q�S�!�'��N���W*�r��K���A��?T��2*j��(�j4��%_��as��ջ�e�.���^�D
��#Z�����E?6
V��G����>!���N��)���6�;H�aFп�7���;z�Rc���U㌲e|�:�⮤rr-�w�c��.��C���2H�}�8�~G��
Ţ�B��پ
A����c)0�>\mΥ�*��Q��U��w���ّ���qv�P�$xW4,�}�
���U�F�?͝���b!>Շe�����$\q��O�ncYr~�1���^i%4T3$���
��7��L%��:Q�c��".����drqt�G�r�׎�2ɠ��ͱ�Hژ�ZsQ�,�qF=?)T�k���p\���,���~h�I3�j,�
L�W䅻,�3&���r�'�<�����=���/\��f��۠bO�BQ�Ϭ��юG�饺��I�C��k�A��}�at�+g(�=E�L���$��� �3qhKs��)���jP�*��*��n�Z�Ev�����.�o�z�nt��^
Rׇ��y˹�9ٚ��v?�orE��S!���1�9�M�ۛ��D�����M&f_�QTn�Q�eӴ����MCl�&��+���>	�c~���1�2'�f�ץ#:�\�U�^W�K)O�^����M�SZ:�؈֑�s��q���<4�U@�q�ʛB��mӫ�*�ET�T���6	�{�ʃ,m�[�v�m��S]?��򑥃V
����#b"�A�̄~�7<�an�;��w#R�
�,EG�4<����o�=�I6���⼶�6��Atp�X�LZÿ���f���������lLe�3/��MuF?ksΉ̼��V���f����v|��a^*7H���&N�0!�xHJ��FR��b�60��"�w*�L��y���O���l�xvL�#W;
�4'
�S�&n�F
{�z��`���A��v��3g|c��A����y�r�N�Gk[���ŞM�=�"Yי����Ek���G%�‘f'd�,!��[q.�g�(���\�Q�/�1�")DG�e�٬ ��^@#�����@��t��F�Qo��R�LS>��8
�r4BJ�K�U�*�׆h<0q:,�������шwA���0y�8N������F�2��o7�\zGI�~v<�y�dI��9�n���R#ɑ$�@�M��	�(�E�\'##W7&�O����Љ&f:l :����"��)�%LBA΍0�j��7N~�~K�R���u�Y�G���}�ع��#&Jǫoj-�Ztftr�7�pe�E�^�Z�͛����̕zb��yaJi�;�p`����
Lqo���h���yZ� ���AS}���~���bܓ���=I{�.�����c��O���n��w���:�ڝȠ%1�,�+�=�B
E	r~bO
�=��*�V|/��MG}�����Bi�d� ��h,q��
�
V~p�ޢ�JNЃ��-��o��]��`b�~��)�|b;�Y=��hّ�x!���H�[?Z�ZS��~�8�i��oEF�0_U`=ܹ:,s���
"h��N� ��t����l��h��t���ǎIw��NH2��vK㽈QO u�aS����ݑ��d�%Q�3�u�
�w�S��Sћ�����;��{����WF�U�,�)�!�Ǣ7�#�.�t/.�W�P{?[�(����o*�'42c�LmZ9W���$�^�����Fwה0���Z�˔�A�/�1Y���XM�ۊo��P8iv�_���xW"z8%���s�$��܋(�D��$�Н�ѽ!щΩ��~�fE\�/
���� }���hR7d	Y����#�M����<��qՏ�:�w8���}h��OݻM��ê��}hׂ���K��Q����jfhw6�C�iB+�	�ڟKζ��JO^���P��+���^X�r=
 z��ϣ18<�sh�8"����SB���T >6��ko�E�/�;��J�ЪK�H�x��!���| �T�˵��D��*:�-��P�+��t��ND�𑷒�G����'wmI��"�5��G҂g3�b�+�8z�B;w������h�~�b�g�5�p�X�~��S;�h��;bA��|���X�I���Nhf%	&��cz!f�v��EF�ԟ�Aq���E��c�e��T��J'��
>���Nw3���{'�`s�FN-��<^��I}�E�ڬ�o[�Crs�GDc�ل����5�Qc�������F;��֬3tF�uu�(��}��R�� �*��o��|��p�9?������M�ьSB�"���Ds<ட	틏�%�����r��_�PO�ҥצ�V0�h$��7B�K�̦��z��xi;/��tϰ�YF�.��f���8�'�	c��W�7DV���]i�L>?1�li��C8N8���'xg�sߌn��1sp�����[�CQ�s��5��r���ڶt�xO
 Z����x�p���4�>�ZJ���Δ��	��e|:�ۖ��ו�b��ژp���B��!Ԕ�AL_|Q�u��r`�vo%"��j�\�,�*�����F!-�Rq4c:�	ayt�ŝ�������p}d3X�v_VOtȍ�E]Ѓ�~|�F�"�xo�xt�yӀ�V��d���!U@��޲]X�l�������M|���9?�F�g|�o�%�N�Kk�F�Ѩn�?u@
+T|��^(�[�W�+.��K�O�1��u�bO�
�+�#Jo,$���#�r>�G�U�zB�~Qlp���������My���-�7��8���-��0��nA?סH����nHԖ�Ds��\�u�뾴�'*�_��jt)��}xd�-�������M��S��W����ۑ�M�F�F:���e������}]����N���k�Շr�k�M�qH}&>��b�9�
�������us��p:�+�fW�f��+�3}��L}�1��%���-݉`�ٔ� ��l���@��]��%��;���j;��V\.G]}Y-�g'�;��c��5��xeP�N޼��-�w���g_|�,;==�~�ʼn�{�����]��s�+���M۴x,Ȋě����g�}�Yv��i����P�g��/G{���-��NOO��B��ժ��?{�}��ٯ~�3J��׫�b�Խ�H��=����/|�^��
�;ʶh~t����%>�;^�[�8"��jP��hY��Iot59�C�Vytw}rP�?��;��1{�t_%>�1(��W�͜R���������,����y>?	����'��=�$^#�^��r����<9���
�I�M̋�\��
��fɧ��ſy�nq�]Se����z�o�I��/$�gB(��.����PK/WUW:#ӿ�*
"pip/_vendor/rich/terminal_theme.py�VQo�6~ׯ �do�!�%h���q\��V�7�a�dH��ݑ�-�r�>Ԉ��x������@�c^<��p,+En�ZM�����'$}9����s�P��*SU6�F�Ccjl��q+�z|4���_�$o�&/�v��<�a��k���C�<șG�suu5':��J^j�H�y���� ��Pu	��[�BM=:��j���ۇ����x$��$�3�v��������)�M��8EY�{2¢o��iN��M��ۀ�չ�n�3��*zV�!NHو��nB
"xU�,�	?�$�<ʭr��k�۾�U�N8m53
<�ɲ��U��N����&��H�U&u��`Қ�.�t<�'�
�N-�q|�7�������י���lfz�5	�_�c;���B�١��Z�����5Z�JF��il�1����i�.>��w��,�Y�8�3��XNH��MF���O�9����&�b����x�f�	�!Ԟ���{'l��l�;ɟ��k����t͆¹�j��;徨P=W����~I���@�ŕ�	�Џu|�d+)2c��m�É!;���T�S�� |R0?����&�D���O  �H\����Q`�D?���z�IW���j���^���f�����!�;8��!l�Y�\�WňYf�X!�	���9�]{�(ţ��9��a�=F��D���U����b�n�ar�%��F������z���kN}�zТ@�3zf�TW޻�4[�u��|�#���R1w��^���E�!=ai`�����X�ZҲFZF-��t���+r�m���������ܢ��׋��؏���rI��ֆ�E��_�K�[���N�QC�yGQW]���ŗ��O�_�`��4�8[�G�I�JA����K��C��	p�z�ZcH[X�(�˦���C{�K��ќ�Ǣ��(�^ᗕFL�ne��xSQ�
g���5fƹm�
����v}�s��f�y����PK/WUW�J��'ձpip/_vendor/rich/text.py�=k��Fr�W���JO�-Su�-_t����wW�5Cc��]X @�VE�T~C~C~X~I�1��@�q�c�JK3=3====�B��5m����m���^�MSuY�/vEۗE5���Z����)p����f�ڢoZ���J��j�}�+�+�6?��:��|�����/^�aF��շ�㳢���J�����_/�{�e���/��ڜ�w�ͫ]_65t�[r/�T�����5_UM�3��߫��z�rW��Xd����Ǽ�i[sS�-7jU���Ҽ�ʫڼ~�7_������U��7�Jճ�S����_�uS�nm�/�oۦ2���-w+��nlA�m�+M��x��-�������kJ��o�*ߕ�.�UE�o�)��n�ѩ+�3^�y��V��k���۝:9)/}�8Ͳ�d�����Y�d��-N�w�8�����`�f0��//o���@���='�?��ٟ�<[��O��^|�O��ī0��d�.�}�Ol�W~��_�����Q�˦�LNNNV�Z�\�J�v�Z��VA����Ry;��{�7 �3��G�{��s��Y6�Ǔ���TOH2����Xt9��~n����'k �.{�+�ܭ��)�p2�<��ܾQ�l���]�����٪����P��v=p�Sxٛ���ӍzGe�7qAx#J8�å�/m5��}�.��xS��U��]�`^�`y׮Vy���i��)�$^��m�]RW�XhN=�0��gS�>j?L�p���>j��ʞf���UeO fYsy	˜E�hbΩ�1��`�tMFNV"p��&��D�]�oU��;$�k�g���9��8f���X\��Ž�Pe����!�x�3�
�P��C�!]z[�9����ԫ􉭄�T�53�fK͸���-���y�	���֔_�\�|_܆�wc�^u>�4"sl�4{��^�m.��u��y<Li����!�kPv�4{�������)6�[���k�	l.�u�di\����1Q-q�'�"�-��aok����J�u�=��'��eo�j����(U�
��9��+/�۬�'V����-��u5<�\�,��bv$�\��n�WL#��\Wc��*nYN��l
0�9o�پ���?�c"��d.P�h�#����S��%tj�w�c�=�[y���v�J]��c'kKT��.�U��<'~��\+����f���A2'�(
�_���]Wv�
�
��9n0>�ˎ�~�?�AaJ��0�e�1��>��f�������U���	�1/#q��v���n~�-v��o�f��o��67`���o�ws��wY��9R���9,�
^`�;8��K�7�r��F��ZuU�w�,�s��W����= ��&;��Ј|��U><�[��lE����ᪿ֏�RB)�	�a��jOQ,B�T@Âbf�B;B�/-c]D�,Z5�N 3Ǖ4�D\q9�7���8gq
@��w3��D	G`~K�;�c�]�����+�WSoN��`闲��_5��_�ȉ0�ʆ5-����o���?�,ba'$@���y5-w`�Z� ��]�q*���B;�I���~|�K^�@��$TwW��O���;phѷ�S��b@��`�{�՞���/:k�V@$)�6�^��
��Ɓ%��PF�p��G�u��ͧ�sص�B^X������l�[8 �&Am��ሚ��ԺO��n�İh@I�+hwp�ł�׷(Q��p��^@+v��#LLz����LU%a
�C1
R���:%Gy�z��AvU���,K�d��Ehy��>�
Ay�Vt�᳡�B3_��x��s#�Y\gpq=���gٓ�*/���C�����TE�/V/��8�‚�~CŅ���J.A�����,��I
��De���:���(�f��+�Z�Ҽ�7�ˉ��9��݅�q�E��4.ja;ÐX3�������1P��'K�}�{�~��]�]v��
*�"�(I�i�7(j��{d��\��M��(�nn� �"�j���<�v�(AvF��m�|B��h�$+ZEP���j3���w-j�[�6��y`�	���ܵST���t��u���ذ���^KzF�z�j�n`�}2�_.���=B���m�U�kz����ٺUE�
��K�V��i=����N���}��Z�A}-JK�^�!)�ʀ�6��l9
�ڙ�����jl�I��GX���V%
4��Y��Z�<�H����� 7�nβD�V0��\=�Y�@��&BK!n
��j���s��ɲ�!2|ض�-�0M���mi��Lcf$…bއ'���.'�}OE>,'X\����4�5����5�N"tEJT.��.�X�aW/���^¶�������C)�NI<����z��-qܑ6��,�s�m�g֤,C
P�E�Zf6�L[aţ�O���
N�eN�S0ѹW����&�Y�Y^�e���Xp6|h?��NN�O���S�#(���3Z%ς���^�U��9~o�'bM3���{�[h&8�I^�3e-��i�QX$�~9;q	�_2V6��(v�EG/J��Q��M�(�Y�)2f6�^�~��#b�b]> Y�Ƿ.���0���Ҡ	�G�6HJ��-1#Eva�y��
iO�R�T��.��M��B��%)`a~�Rs��g!�(�'�0?f�Y0��/;��Hadbܹd�Z��`���D,�$i
e�Y5	�Z8̹پx<�ּ��u-���o����R�/а�VbU��fN\��d�s�!}Dq��4��=�$���.	$�+6t��Uw��ȆJQ=�Rm~2yr�-O�����.��y�q"`��	�5�P��*=5C	H?F��Ž�%�lh��A�w`)��ύ+9����®3���jw��ʹ딣'v~�� ��
LX3���.�<�g�mʠy��Dwq�{{���O}�W��^"6��4K�/D�3�N�ր�E{�G�h�u�F��J�Whx��C7p�]3�C�;��O�*�lgX	����g�O�_�WX`S���B�N��uð��m���H�naނI�^�tK`��r�c�V�J+&Ц�Μ��S���W8cN�3��iG���is:��IJ��4m�����]b���3'bY����65��E����.�Vt�J��Uv˖��vo�>��]��)���VT[��/�H���C6��̐�WV�N�Ġs��:Z�v��@�!9�G0�c�l��8Z��m�֩]8���� m����,�������o[n�ؐZ��%0�9�Y�}�Zڧ�|Xↄ��q�c�J�`'���m��	�f�E�<�D7�yL�{�9�FpQ��9�pkL/֫mH�a��)1q��(?� �/�=�O�혅m��^��3+�L��O�K���+�륛�����\_zmŬ�8m
��y+�	�����';C'K"	ҩ���#�q�_*���`V���s<����,a�ЬQB���$��f�⤯�}T��ݓ�B��#�[��]��u�O�C���F.5(�h�5ݘ@�Z]}�Vq8�3v��b�˫��/O�~��l�_UL�_|�?�~dg��g��O�lj��^-��	�$�C��B"�HUL�++A�R�:���(�T{O��z�}��Y���У S&�rh�%D���Fkpo�h�i�lW
�����v���KJ+�x`�E��YQ���ܢ�����+�ו�y���NJw\���/|����"^��V�L~�ޜRА�`�
(k �m�G$ҀQ�1�M�1�9;N�J+�Z-���s#F]� �Ɯُ�	g\��Rm7`iD�E�VS!��Ƅ�a,���%�X�{]���}a}�x��)�V�r}=g��W=�)*}�'ת�t��6�i��p������m�n�}suU��c�����މt�bk�aڕ��umnP�ݑo.�n��;�>����ĭ�zǙ�^�٨�4#b3k��mq���G�� �FfX4;
���|�ޠ�߿�n?LNuL-�x0ӷ�=�@�]�˧:I���;Ӵ
��W�i�t3����*��B%I��g���~�E��v��|G�px���S<v8�9��&4x"8�6a.(�4:���_��9��֛�f��b�V��7}��d]�t�� �cb���7�7�:Z��팭Y���^~��+���ls�Y��Ç"�YF~���y�Mv���W���_�z�*���Y����750C��9�ɬ�����F��rv��d��#�Y���7������LV��HE�=II�����̸-&�����5,��E��Ի�P�V�d��n~|Tөxv������y����Љ�7�rF4R�^��wx��0�^'Wm��eu�U�OXP}�QQJ	�vՑ%)q��5�G4ư4u8u'Ak_��f�~}��Ƶ����5l�Y�^��J׺��@qtL�9s�i�9JOM�u�g�!&���s-�D���]����=K�	�h��J�Ȧ��f��5N]�%��ފU-!�B�σ��-�F�]A7{�؊aFx�c��k�"80�Y
XN)hAӍ�,a���}�Wl�aT$ɘ,-O�8V0�JֈI
�S�۸iv��{Lfe�#!ADm�'��AP��X"���x��"{������\>�c�&�,FcN1js�!FM/Om�6�\uE�����O��L�V%b@�c��F5�N�x���_� A|�b�o~5t	��59��Ŗ#2C��T(Ɲ���j��ͨ$l���m�mt���0:��:��`s��f���p_�N̤�(����n�9��zb8��^����g�^?��B^�\�9���5cN�>�]<J��Kz	�dwV����3�����Re�b�
f����
�P��Oa�5m�&:r�n�H	�E7RX�\��vg�o
�G�l�Q��sH��)nyDZ^zE��H}�һ5�U�1�|�yI/�r�_1�.2?Q�SE���Be%�KCly1��͂��@x������J��Lc�3c(�	�D"�x{����m/�*r]�Z	�NE��V˙xd����S��
Tt*D�.��`��̊0���0�&5�G)I/���A8x^�T���0���
pJL�L�Ȝ�]��r:u��*	]OC=2�xY_��lu&M�XFwK>
�r�hj%��%�,L�� y9�~�̗Ӊ��v�¶x�"F��y�E�w���ׁMD�{��{�|OS���k�J��z2u�b��-U��q]��\G
,y�1�꼱?��ijAn������1�&=��Pbۼ��&�.�9��ԋfa� �$*8!�F�A�VY�m���<$F�@�����~b��� �ݘ0�&�S=<a�Y}�s��f#�e �\
�R�lXec�k��zx��Ζ��`9��<$/�<�QTc�CF��oڲ�UmLj�o&吕���N�|��ur�A��`
/�J��G�']=ӥ���|�?��R'�#������WU.�ժ�o1���Xo@tV���\������-�){O���@)3VP��M\��!{�x9�h�ne�x|T���Q=���ް�A�b@=N&�8��C�X��>��0-���ە�0���H�ev��`C�I0_�b}������^3����zN4UĤUF=�O��Źca��V߻>��z�G0�������*&6�]��������rG��PTn�4��{��$'��y���Us��8�Wk�b���߾�	���dâs��҃�`UAO`��V�x�ڀ�A�g�n�l�����S7�!v�|r��&�0��cR�mSǜ�"�H�����ns�Ó��.+�rIвw������aE
�0c�I�u�!�?6�3�o�O�<�s�'b�'ȶ�`R�
,�9�6J�*��pc�|�I���86�3
�q�ߙA�2����z���S��`��h�a�Ո4�"/�"y���z��1�!�f晧a�^ka���;d����BP�_B�xף�[�Πq�ӈ�Kw"��1�lR/���>,����5�LJ4�ȩ�LvP�N�lp�`@��E֦��0;��lq>E	ظ�T"Q��C2G�@�W�a�X�QDkID�fw�U���k�w�. ��0/éSpL+�`��Z��2>Rp�xཌ��N0��v�E�����~b��8@ ��Σ���u*��)R�zJ!��:���AL��,�=��^�Y7t'�Xa�[n���k:�S�5<[W�
��&�@	8X��H'�Z��pm��H�f|�aܗ��,Ӯ��'KXv�l�LV������.�#}]���Q����i����mex{�}��dtᙞ�t�D��xT*����1��BD��=Bt:g�PB�*�(�GC���^��סy:,�ݐ�6i9�W΂]��6V>�:E\���t'�6v�}����2Z�������|U�+����F�>��Pr����9M?3��z��M€�����ԋ�d��&�ڑW�À�>MÀ)�G�j�G5�t��h�Mʫ�iU�cْu2��,�(O��X��B�>�,+��j���L�1 `����5���k;���?Ú�F�`٧�v"0�v̲ t߰����c�?$8��d��I�/k�.Z�
�p��V+�x�c��[��
���G2;r��*�q�@��Bu�"B�<��ȿ��ݵ_(��.�j�,���0wDtH���l��n��i ?�����<s|�j�Izn�[aB��cv�a6�����h���/D�ͥ�妙��� l#S�
���,�3q��m�z�x0c"d�+��,�7��o�Q��
���������`��m�گp#<}�K��|5Dr>=��~0Q�w�S�
s���>�=
\�씎'���
:�y�M�j��[D��(�=)~K��_i��,,�7�m�Э�+�}*?w;�ġ��G D&�c
���\�����$qf.�uR.�w�\������f��9�r%�Y�:�QY#&�
⨢�"E0c
�nB�A'	L�jh�� k�ǰiX���o�O�;A�7��>�X=R}�E˶?��2Xu��u�R�6y�5!��	�l8Yơ��@��F��AZ�#�|r�6	��d��sf�$�.�����}��S�"$�B����(I>��{�|�*���+�^.9��yP�a�5k��c��z��,Agw���G�+��m4I^q(ZT$�{����ǹ2"���D�_�A3Y<_ܘ5E�qO^���F��g��e�TU�&y7G��e�	{G��{�X��ס���J�̙~�5��d�қQٱ!�ӑc���N��~�E+�o_���q�@���l��#��֕�ֶ?2������dQs����.���fv٩����u@gn:f����)����f�|G��!x���#�Ñ� A����a���&�;lد{h�F�a8Y�O���Hm�&ѻ��������G�7�H-��Y$R�I+J04*a튲�N!�E!��N��`'��\��e$��]1�B�r��oJ��<TI�L�QP�:]#�����v���i!-��>	Qo}|�%�_'��|߆y�`wk�٣?���XR�>O��:hbf�䒅Q�<̑�������Edm�ك��f�tua��)['QAU57+�A4�~I�lr\������:���Mi�y�ڷ�~����ǫ׬�!gl��t�����\���OM(Ũa2�[��
��7�3�~�Bu�;_��qVG�_�4�wߩ�h���WMb�B�����*���j9�38�;4I�]mw��8��:�;"Y�=�	.?'0���1y{`RJ���J��%0���)-���X�⽤�sUFK�4Ȟc����>}8����x���{�y#I����ʰ��9rn��$���\�z��C��\��N�/Y|%�e����t��ϺǼ3�~&�6����9Ք��VFF��PTȣ�S�"�n2
u���p��3�[~�n2�V�w��o���|L�t��������3�N�_�����dz쁹�N2ν'g�����By�,�M^�^�Ƞ�^:��I�ѡ�g*�>��/J��S�w)K�
Ǟ�>� ��C;��E=��١�1�xTӽ> � ��	�� �' �.�<���tZ)��7��3��R��hy㹴ⵇ�w��� ��2"��7%ćƔ�^��z�ޠ	C��c����1s�5��hߐ��
q�;�?`d)Mқ���~����?L��úhU�&��~�\������H������ʦ{���HTs���cT���%���N`k���K<9�:��tF��E#��)�H��1Dcx���y�x7J3<뢔�(Ͻɟ�}OȨG���"'6��1��L��Gv,�b]-���F���������k;��o��C�J[wf���J�d��2mhׅ��3��>9�E4�L*�����n�k�~uv�}��X����G���w������?%��^JdA����\_�P�1!8���PЗ����t�|
��M����g�w|�^�2@���}�����F>����|�����U���;�i��{����Gilf}i��=�d� �;v"\[��&��x�l=���ɰm'*�2�Y3�&;��5��ψic.Cm�V�𑤸����1.VNߠ��h9��&�eH��`�z1��#��NY��,�<� Jd�KGH���!Ѵ�M��o���`�����;$5����iK�m 2��ei��v:�%}Q�o��P��҇k�N'�/�?S1g~�Y�7��X�1�Z�:���)�v���l�� �����|	��n����F�jݯ0�9��
��>��#���
���|��:J�hm�$Q�h�&"����r�K��d/��}a��y�`��L�f��*
���}�ŗ/^>w0?�l{��!'��S�ٯU~���ι���S��c5N���o�O���cߵx�;ȱ�=�NY⽐��Z�iu�/7j0E�.4P��y������ǵO�u���r�]�J�2{ڏ�3�����X�`�����a�c�s2h���7Ap��@�PUG)��_$E���0�铢$j�cÈ:�&/MZ2�J�2P�lD��K0�`GS������Mċ��$�4���8�hRn�)�d|���̽.c(ꇉ\?�5Ec6�]Y)���),�n���&�ia�a�'b{�S0R�Ӄ˽��Ҏ�+M*[;�9=ɝu2!?����tK&�IB�%{�\��زޫ�B�]��}G5��n�_va(c���P:4.���Q�ܶ
� ��ז!��� �KXx�C�����M��e׳����YԊ�H�|Lz�����7�F��*��R�E�e(:Mƺ8н��@����-��D�Kj]
��n_a��jE��
'|����Ggvmq�-N�S�k�	)w�n�ivӴs�N�Q��Oeiu
��w��\2�o�/�H���]�즩�Lb3t�甞�9�ˀ�rWvk�,z�i6P!S徃-`��URn�
����~UϠ�]�.0��}1��^<����NYlg�{r�ôw�<T�.5�Rl�
C�BeWbK��A�L���Ч�M�V� a���{�	��Ķ]��IT����3U�őf��-a]V��hk��,��T�Zn��<{Nb��#�z](8e�į��O�B+�*سl��W�Ǎ��r]��\��v�T؍T::��v���	S;������	�͓w(K�@e�U�6,����r�ż�ó�9~�J��uS�Ȯ-u*9��& �&�gM��(g��Fw�&IUwD��^�Y�w��p/8�9XP(��I��n�PK/WUW�d����pip/_vendor/rich/theme.py�WMo�6��Wԋ�*�j�E�nZ,�n���P����蘭D
$�����!�/K	�bu�>Hg޼7��Q�B��V<5L�[�j��F�'~��(l
7�����`

�p�X�$�~UV�-�W67�Pq�-������:�_�ys}��)�{zI�m}h�b�(*f�w����E�yj��\�Vi6$>׌<Iaox	�X���Oߴ(v.3��ٯ��)[8�W��x�t�c�vc��<��B�������چ�%�q��`U���[��o���]�/��@v�;��q-,ďJU�]߅����6k��Y����O[�yD~�A�)l��=
�ڦ��6��������\|i��y�J�8��rd;0��h�9jqb��+��x��ٶ9�n���پ)���h����]��e�(�i,��̀��w�=gN0~8��II'�i��6s�����U�ї�'��F��k{���S�	\��Vu���w�Dm�Dn QYX[Qy.�b��]ڵa�
�����/���-�[	9�s)�.8���h6h�8/�ar=���v�ep% ��\s�SeՑ��}**���n�sK�E
��0�>���o��P4��F��S�+i�¿Z�U�Ρ��5.4=��I���T^$ʞ���*�N������ل;���v��I5�e�3��%�,X_űv��_b���!�SO&��r�^��s2�Y��0�����E]:z���U{TzOd�����䍼�(�E�c[��}e0�V�>a�[��)�3�7��Z�y�e�J,������ڴዄ�	��ț;zFn�������F(G�%���	����ja�J�	�x>'�W^���% �Ƅc
��Q��U��3��6ڵ-����8'�DŽ����޲�k�������t��/OA�~wR�4נ��%!E0��
s�t�Aw禅���ti�`�ֻ~l��8���>5~=)`�D�3*�sS���ݜ�O���?;�!9^����jlis�恾�n5{�˭���U=�.Fz��:�*�QWM�c�Kʝ �~��Ar&g5��+�^k�u)�3��g���c܄/.&X�pq1��i�WGC�9Ӌ�g�sY�������f��g�@�L�P
S0]&mF/ke�Lφ�����N`��7g�	��\��G�2���G�b=�N��K�A"��4�ɭ(�k�����h4{�ْ��3��9��~�Fic��j��_PK/WUWQu�PGfpip/_vendor/rich/themes.pyK+��U�KIMK,�)�/.��I-V��-�/*Qpqus�	���q
�J+-�H�M��q����*l!"�:5�PK/WUW����R�spip/_vendor/rich/traceback.py�=]��q�+���R�i�AXhd3"e�H�d,��pv��nt�3���݊ ��y�� A$F����������ش򔿐����H%�<������������uSo�,[�]߰,���n�(_����X��'�}SVl�����P���n�w���v�Nֈ�Ȼ|��ۖ���4��%��k�[�	v�oN�n)J�;���7�!|�Ge5|U�eu$��I��j?���M��0�v�\u�ם�5���e+���ue]����}ҳj%��;Y���_�_�|2�pbv�.�����d�?ڲ�k�
;c���Q��6�o�0[�V�[6���OX%�So��<�=�?��b݅��o�]�f]��u5�z�5����}��@Z��C,�p�s����(�Q��ݻu_�g�,�5���c���,��T�D�
v[��%�
+h��u.�!n�} WC��gm�5u�3��̖���>����x��� ��;{OG��� ���)}�/��]�;Տ�h��,���E�.?S%�&�:fc���c�U���d�ѝ���}� J�|�mǶ�,J�h�Q	}�N'���s��7������un\7??xx���o��7�O&�������O�k|6��[�yx �jޭ+1�Nˢ;6�ʪ;���r�V�g�����A�7x	uӨ	C蠆��6�n-�ze��V��)��
���yI���`zWGH"o�c���T
�s�Y��e���GiPT<lz��Hu����$͎z�o��~Ӳ�"�2H�!��j>D��W���J��44���F>8�j����ي����z�k�-������t:��e)ʣ�\��q^�$��A�K�c�8�j�a[+@�d���hV�{w����7�5��7�s"����W���d�Ş<ϣZ|�-�&��::mʎ���$���9(���UHk���D���%�U�F�8=��>���V�9�0���^kf�F[$
FOc7&��,̷�0⅀oU�F�
����ؚ���
" �6p�;D�G(׏E��884��ru�Z�'�r��F:v�0�W��4+�:�b�v_+�c�����l�HShԆ2F^�-��h4z��P2���D�H}����~�r,�t L�%6��ˆ=AϠrCz��U�Fa]%�m�	R��E�����髕C�lB��<y�o�P����m�uy&�@Q�8T��i	�e����m�й������q�H��ć�Iz��0��D�������^j�V��n	�����1�*n�
�7 �}.Je(R�j,�6A�=.�5�P�0�s�%Z0�`�X!0�"�
�R&us*5i�v��&��Ϣr��w�rAc�y�q2���*��FLz��Q쵞�m�q�ۣըG�B(Z�i�d��T>�t�}�ys\�'� �EZy��|���Xc�=X����z�{�WU���6�t�•�`dj�m(՗����?��"Z.S��/4V��hW���
4!��T��!5~���vO�/���JM�/������ƫq�LQ1���_��h����M���hc4�?m0=���S��C�jS�}��<�=�|G�PH��6_ಸ����O��0�Z��Sl;\�ʊ����e�w4��j.m��+��I����Oہ�[�F�^Q[��DL�$YS��MX
�D׮������4+Hh@��<�@�뮓��Fjh�Tu�M�C�P�h9���4�!�-�Z�1���c�6ǴX
��0�7{u04�hi�||�:�[q�ɎX�B��0��f`��IMF ���űn�a\���˞b_�M_?�(`��-hX�GM�V��^�[�Y��z�+�[��v]��`V��2Y���3��љ�"��8TԻ����}��ܰ-�y� ��vи�1n߅;�S"Cìɫ#+���W��-�Y���y~�@-�j�+����"�=@�!�o7�[z\��j��b�Q�n�m~�tKW�]9��X�d��E}���f9Ư[��䁥W�et�N��usb����a��mCTSUQ��P\QD� �L�r�Pb�/)p��i���\>f������I3-�L��Bx�h�’��G���h��.4�i4U~�o�E9�oqaugh:��5w���Rxg�P��ɡ_��4l�OM�g�
z�ZKT�g4��a�G,)<t8h��Ш8�|k�m��͋DCN�d����0zQ�5�%����F#��zS$@?-�c����F9�L���W&�o�.jN��YX���QUSP��Rz�"#��J��
w�x�>�
�Pj�A?�F��tqͦ��9L��=⅁�t��A̸�HD�E�7�����M�h�9�6[�0�ϻ!"���t@À5i�+�&�TH���
��B��"��o�+��K�!���FB�n5�eCE-[�䠙���ܾ�\{c��� Oo'�ͦ�Z�Up��
56j�����Ř���aP��ńڊN܌��GQ��W�]S=x�|�|Dת{d�'(z-�|�$��S�c���=4
���(6Q`��;8z�(J�"�����X)M<�=P�
F�vv��H����#�_@��AӯJ��h�Vu���J�Q���1ڼ��[��u)G[^3��T��~�������E�t����<�A�i���gnc�g��%������ckؙ(x�+x�e�e��l�f�]��޵������#����	S���S3c{�ԏ�ag:_h�8���'���nx�
�~�V�9�.�]lOk���[�a�W|sm��#�{���~�u˵���0�"��9�M��w�&ِ~��)М�JH���I_6�z�)#�B��=|�;�z�������J���0ΰ�PDz vJmɆ�v��R>[�"�lJͩ� '�&	-���S���ӼjK𢛓�C��{R=�m�~I�P�	�6ER{^ؠ�I��`��X�S_���tPÕ�P%���H�o�r
Uy�]o�g	�k�n����leC�T��5�a��J�sG�Q��<�Ԝ���g6���'Nկ5O�m��L;��s��Dz5�;�e�1^�y��%E٠��vRhOc8�=(��l���-���|��;�3�۴�9� UUp8[s&E�����ⴁj��
��r��y�[�C�,��-�����z���< ���l`��[�bb��T��T�9���i&	��ΌN>@{B+J;�a�lv�)kJ�{Ay���Hlճ��]O[�MyU�V�E�Ů��c%Δy��5�^J̄����&$կ0v�ͬW?��7���Pš��!���WS!!Vq��T�ˌ����V�����ё�覡\�]�C�[��:�81��S�3�o�'��).�d��+�|H��]:����F/�jH3�?�*F���M���9?��P�؅R����M
��\8i��0�ĕ�įs��f#N�7�Ƽ��$�W�|y�����O|@+���a�t�\�e��_��[��f�]�fQ���U���U^Q��)ё�&c.��Q��F��T~��&��*�Bݳ�t�JN��|���w>�e�p�������Y:i>z�����j'R˔'/��2D�e�g<$�����y�����EJ��b�ꕁ�"��-^@l�h�c���a�`�Q�l4�y�w^R����b�&�$Y���,�e+�hW�O�,n1����f\�A`#llFi8�0u41Sx��f�N88��R�L"�@��u�'��%���D�ߜ����%��0��tZ[h`����9���R�u��Q^����@�I�ۨp���N>�Kp���<B:F�=B>Cm�;�ˁa&MI�4����q�8a{p*˦��2�!�"�'™�{L��ۺ�AP>ӽ"\E��y$�+��AL�:�va�%0�M��O�l:@8>�ЗU��iGy�68�t�myCΐ8B��m�N�&pI\ ��X�P�6�%kJOV���!�U{��"?X�k��B���$m,Q��̠Z��.��X	�
h$���Q�{f;�Y�-;�1&J�����I�a�t�e4��0�60�X8����O�r��i����`f
�I>����r��ܚ?�%_��+C�H��m��H�I�P�|hc��&_�\D����>o�s��`k-<X8�V�-�F�i��¥Rлs����gi�C0�(X�eÖ��� ��E����M��Xr��,V0���r�q���[�2J��W��G\�[Ԋb�~���"��5���-�Ϙ���!�4xx��ֺ�2"#/u�>�t&z�c��+0��xƜ��x�z�A�;^�1�iY�~�9��O҉X�Q��;�E#�cz�)��w��
�`\�'�80���c�-?�un�u?:�d��c����"�g����xPUd��CS��[h���%I�*�~"�O4Β���^r��jʗ���l1V�8�����	�@���V�K�S�_65Zo�W+�&^_��+�F��:}�kخ�ZNq��,z�_�喟�B}�p���spLT�xc���4F�@m�.�ʰ�.�ʁ�֨P^C��ԥ뭠������b�r�.�pu�I�;��h��
��(|��ت�7!�V�<Oʞ�{9Ǭ)��	�~�y�X�^*fh \��,�\����S7��
#���u�f"���K�3ퟁ8L�O-��ՀN��l ]I��
g�⑉�]ە݆���L_ul�X}o떖.Li�DZb�l�Ӡ�K]}����!ҩ&C�m�;ہՑ�{#�ˋ����<��o���нt�[87�p}TR�s��*2k�5i4��6"+\g�c��_I��nЈX*6[�i��]Y��R&�qi�Z=��+��9O͇o�k��E��Ϋ�,`\RLނ��G1Ƥ^'i�?]D`����

�r���;]aՒ3@o���X@�"��!����o
�n@���cUrG�QD��ۼ9�wó}���<�;��%^�7a�N)�⤤k)�ӅW���'n#�.��_|����$�������iG�������#���β��W��iX1F=}�ݍ*L
rԂڑ|4����=3�]��hhf�g�50
�9oU�ki4}��@�=�lsege۵qC`����s9zDKS���s<]X���
���"���澷5�B�Fvs�Y�L��c}㄁A[&8i�+���A���Ф�|y�
.�k`�h5��E��э9f����E�,�����T%�W�w�ۯ��L��Sp0���dO�հ������_�q��9��)�K�HUf\tc�}�<�O����x�nSbcz������u�IHA.�ʪ���/��q�d�6(��;�:�&�f{�̍VS�G��m2UĊ~��%��KN�#�(���܀�j7��9���죢>�x����Ȉ�x���b��}̧b��l�a��C���A/1
�=���/ 6�C⥍T��7�Շ�g�k��ؕ�Mg�y�}O�K������s�-t
g�9S��$�'
]��D���,���Dv�uIy�U~~������|
�kIxF�Ȫw��,�TeHG�r~�UlM�����x���s:�����Q�7/��N�N�3︰��5��{ѻ�o�N*A09	$���Nj�|֥<8DS�I����%�j52sF�f�-�N����7=��*'C{�\���l�XF#!d�d�s��#��%z�2|�u��ؤgMP��ꘖʌ%�g]�C=[{GA]]��@
���߰�K���7���Ē`�@2.P��b�m���R�s���'����%�[^x��U��Fq��d��h�.����.|�✮C��9\�LXڒ$���`�xgO�1���n`Z|ܷ]�ާS��P�%�ֹ#�/�*E�� �6�Y+I0GE�YR�y������L�yI��0��6��~���T|.���h��枙*=���
	E{Y����89��=���V���K��5/�.�0�B�p9^M(ŕ�c{��9
�76���f��l����Z3�$����p#Ҟ�aSC\Z���`��
�-N¡/��u{��_���6��R;������qF[jMXj�XEh{�V�f�~�h�"�)�:����j.�2¢˯ĕ����p�\�33z7�BD)v4��sv�̨t|�Ĝ��P�E}��k��<�͠Vq^�����z���}��p
��o����0؋�e`�.�Ň�נ���=��w�2}kg�V|b�ٞ67�O���]>V>L��#a�{0Z���㒋ϵ���v8^,��n�H����Q���q`D&��A�;`�we�e����g�O�q��q��bP�X�y�{�?���|��~���/?y���������?��g�����=��~�����?����
�<��_?�۟�����K�����ۏ���O�?�͏�
��g�~����QS����߰��oD����u푨*�P]��S���|���k���0�7�ͮa�<���;��(�e��7'uz/��_�i�����]�)���)w��4�˝���Sq]��
�3�i�ͿfBJ+u̵`�&
�ss��P�l�'���d���a��Ɖq��y��z�{"�7�PK/WUW>��W
�#pip/_vendor/rich/tree.py�Z�n��}����y ���/k
�[�k��^H���d�P�^�^,
���� ^$@� ��/�'����l�$%�2�쮪���no�,a�>閉$ϊ���xVYᲯEY��m^�,
c�]�y�g�
�xA�e��`#
���8,+E���2��&}.?]�"ŗ.;�i#_�b�s�}��:֢���=�N�z%?_��*���e]4����	O���o�K��O�Y�ۉ��+Ϋp}��qv&}�a�f���/�E��mN�Y�<�e���Q�m����jVVE��`�ތHO�m)���K3�k'g�.vܔ�@������H�zڍ:.˔�A��lܢ$v��������j�mk��"��g�Hy9"��C:��CP-b�e���'q��H�y��z'���yQԼ���]��a_6}�)m�A[:]���q���/��"�aA RQ��ڙ���E?Λ�Oܮm�1_Y������;�₡�@��q��i�IG�+�l��a��7Y��=��Ի�%�ŗ�v��p�M5�d��B�%.��/W]�&|��]�6&��}�<�����a}4�k�]6E�ж�����HC�Ո�-����,���,fMo��|k���`�g�����p�q������r�!�=7b��Yʯ���e�;�ޱ�	y�.�FK�Hl�<3j��4�8�$$�a��C����RR�3��M�c�ʀ�Χ)��pG��w�/~e`0���in%9��y~��v-IA�"��9����&�:�R嘥�l�T�f8`g��A��0Y�K��2�	�W=�Ρ��%��m{]��t8�:������f;�d��j�R�k�ZAu7d��=l��1�Ŕ�%�Hr�丒|�r�Zэ��oN��B����7����oϾr�� ��-�*��?�2��ۗ/Nρ���|d�J�><8��_�o;勳�Ӗmى�Vȇ��m����O}��_�;��������_��4�j���?Ÿ����2x�8	��[����hO�+�Cl�y�`"��Y%Q�*�.�*�~HfzY����7aX�j�xa�"��x���g�4�U`��r|����.3�_B��m�q}�PG��Й��*�CS��o�>���eץ�����*��.�Q�2��d�R�"%00\׮
cm9�*���n������q���2� zy�fΞ^Ǝ�����3{��t���_�,�X�%���W~�m�ט+��%Fh
T*��ή��0q��xR~S٭�.;�Y�\`�Y.!�cDy���D���*�/��`�Ri~I��#��$����]�MQ��� �T"��3����0��1eԡ^�.�;�d����C��uQ �=4�Nԛ4^gw�����q�[�Ww�E�3wآ6����4������F�IV�
�����:�ŠE�s-�j�k�$�	�e����ub��ޚ��b�na�c��9F��(#��g�����D���gd�<�M���Jl�X����^t���V��Š(�9��7ꮏ
1�ڣD���jpi��n|��C��C;������*F'�0$|��Q�����Ƕ�Y�ֈ?�/�y�q�P�u�����I�'��eV�?��[զ
XC�\�m�o%���I��+��m�2���jGǼU��2�f2��]����@������:����#[:���(��F���x��������D����`��>�ظY0��Ʒ����"�R���&"I�P}���ͰM݇��Un��y�g����tw�*SQS}ٰ���%;@���뭉�x: \�Z�ZI��k}K���)y��%C�v�����'�q,��6F�I����7�ƛ�h��`�4�b���?j��v�uG֘�����3�V3��.�4L`"2YA��`��Z0��?�&�P���rS:�E�� �����ܿQ�2n~yW��M�KA�}X�1I�
~�B\��*�in���N_�~H]e�/��"�V�����l$��rR/��`��u������<�T=�[�}�Z����0���ؙ`���L�-�0����ݰ���X#��}��j���8J��|A-�z����Ѕ�cT
���.,Jyp&J:a?��_��/���O����}z|8�I}�������fq��ԍt��bO�?r�O��ǟ��)Υ�O;Sd���~>���\����G�Ă�GG�G��gǷ~J��"�Y��9{��J���3	y�m�,��Y���с���+��]� =5���{#�%WEw/�f��Kż����	�l�}��0��R�fW!� ��K^�*g����u٦h���#�T�h��6O�˾ˊ8���3hќ,�̒wF;�n�f�j4u�G�
ֿ�����%�P]���]o��F����[?s����ѽ���@�6Y��ү�:�,X�28J�j�*pFD-�o�j_�N�,�Ⱥfz��@�H�ϿWÕJ/��ڼ�CXhk����i���@���c�*Z=o�5ɴ�G�4��uD#�ݗ�xQ�֫w<���kպ�/�o(��s%AfpAj�	�q��O���e��vxy!`��{�PK/WUW���p
P pip/_vendor/tenacity/__init__.py�<�v�Ƒ�^�Âc
���솉���hl%�&g$g�WGi�M3��(�V�ߵ?�u�+.�CV3Dwuuuuuݺ��u��U�rՈ�O���1����O�<S�x#�����E�o�<�j��)�Oe��w�������TU˴�^m��^Vy�mw�)��x/w�2�����������\l
h�J���L�?�3�ٲ�_�'"B�����v�F�ҢlĦV�"��"˕P�Z7"+DZޭ�L�۬Y�4I(~�(�Y#Z��>��
�j����/��m,�и��_�T�����˫�c ��,rUעR��d,s�r
��r�r+�J�e���)��m�5Y����\4[Y)�2���f�&`�����d!FgW��j$^�]]\MLJ����x->��vy}q~%޽��]����xw	Oo���O���o&B�`����~ 2C�9��J���E��k�f�,�uˍ\*�,�UU�r�ZUwY�Yys��gwY#j�,*>::�˪�M�6e�צ��ٟͪRr�mCv����g��hL����Uy'�,�����	<e�ܩfU�&-�tSU�h����S�;+pѶ/�Ӳ*7���Ȇ��R/�W湘m��9�}�TS�Nبe�j⢒u�����g�PO@�L�����a(��������灲E‡��gA'�Y,)�J8��s��a�ݛ�9�P�B��xlC����0�a�|&�G��\�!�`���J�[t���M
'4����My	g&�߉\4�JdӨ�u{���*��#���.H� u@�d��]������YNme��)���2k�t�&1��T��@�=֤,��L���]d`ʞʊ�Rw��3�E�<}&�8�s�3��s��������1��3۬�v
���$/�\����7`�:E��€z>{]Jz�~m:��Xg�KfE5ğ=Czh|�ֹ���b����0�ު+Y͏�rG��.��Xgk1/�yA��g�H�'\V��������Б7S������*<E��],�0��Cs�ND�
�f�(fz����	$�)�$�
��<5,�I���+_�Y&b��������7�	WH�`pc!R��Я/�S������&�ũȖ�<G�_��������nz$��9��3j鱅���xX���~��w��?��7�}���W�`�T�5�����U4j���n��h"fȄ�&~
r�a�MǰC�Y��Üi.�e��vgK��ѹ1�cf�h4:c���MR��8�kh^D%!��0�^�Kޟ_�����}�7r��)�X&x�5�y}W(��"/e3�@f�Ѵ�Bl܋�RZlɡO9h@����T��*�}]�uhH[�d%t�q��1W0X<ݱH����M��e�c��R��� @��T>�����}���8����Tz/���:��vDk�㲚Q��f����*�U�k��g9��b�9.�("X�X��'8:�(J�@�L��j�7^{@\_A� ���w��<c�[��1�x�p	x��&	+��A�Ɍÿ�
ڭ�` ��(�X��-F�ĭ��ǥj�	4|�<�K�4���#�{c�챝���!#�$	1;I�W!�T�<E�����ȧZ	�x�}0�H
��1r��ף99"�>�8�"h�JX�4hm�f��~K'ID�{���59t|"zBZ!4@�/8�4�"�j�	#���X�nHCL4�-����LYs�����aTƄu��X��ccȸ�*�>�s^�r
���ð��G�l�
%h8a�=�ev��h���l��g~*Fo)@
�Ӈ���p�VU4��D>��R)R�N�FM|Y�6�y�}����r5w@�u���Qe�
�����<v&~����
�/�'�����vA\����/�6���v�Ԡ-�†Ѹ�]0����������� j��&�	�߄�	O7�-�A}`e��6t/�M8*wИfR���9&���Gz�>�vV��m a�lv�v��HX��P�ڜ�ᄻ<@��l�1�B̒v]m�5���ޖ[a�Ŏi�CBB^�
\��_pz�9���?A��T��y�y�����&�s?HA�Dg�^k	w@T�&��؍ѶY$��1�	Ѷ�o<��p�G9B�pp�^��,Ά��x��jg�ȷ�Y�KiMoa���Ptu0� pkӒX�z��y�ƃ�yB�r*��@�[	b�bY��l�N����q�Q������z�e	n�?c��V�$,/a#, =���Cإ
��ٰ�cf�_}�C��؞�mُ֩��i`!=&�S�g�nw�
�m����=F7;��?Ϟx�St��s����f���
b�`9Űo�Vf��K�7�)���>|VC�:�ں�`�<���kZ}�F�es�PUm�r0O�|�
�����V�z�+xqx�˗�:����{ֲ����JKE�B��\'
��p0�;���su�/l)=%�+slxx�8�؂���C���i�4������RZX
��2�dk5L<��;I���>�j���H���Q�$P�},qB�a���*�}�p��}�u��}|p�BKe(���$sd#N�9�><�h�BB�h��i"�$��V{ x��	�aI}t�����IF�㣓���7�6W�]W%D����}�n��v\n�7Y�`:�h�@�px,��g�Y��Z	���{�������,<��gJ`̹�d%�
}Ve�������E�L����X|@xN�ìT�P����}Vn�|�0��R��D���t�ɘ�6�Zlr����^\��:��I�8]G�SM�:�4����Z���V@��=Fı)b�N�+��S2?��˗L�˗�'��ەl�]��sL\F�*�㉀�"[+LÖ`���_����f&l��t`�GJ��
�K-hG���y���RҼsA���{�Y�&-$S��"�h���7��k�~l�kg�G^�P;ϕ�D���!��Ai^���6,D���:؍�!��7�.���d�A���V�Q5��8��A����*�.:���M��<��VIRh�Ƽ<:5J�+��l�����T�oFAž�K� �k�T\&#��
�l��\(�#�\Vj�I����4�t�B�3�Ʊ�U���nڶ5��M�=��ˣ��<�����,&;3�|��z�(�	�'�uu��D<>��'�Q9˶��6)����C�~�S�u��o/x�Z����)9u����~ь�A>��÷�^+f*n��t�.YD/e��u�yz��v �ÜN�y�(��]tT{&�����	
�����-�Eefm6�����c����
&�m�J����3��I��:��)P�C)T��XӜ�N����HVM�}�!���JP�e����LrRl�f���_
Cg��K�;q���9(�̲�A��Ŝ�KK��+{C	�0��,�Ӆxi�!'��p57��b(1k�̀�7_��+�<�̰��N�E&P�o �f�����ǥ~�07�ceHn�E�������ㅓ��
��wڟ�&��/��BE\	�5U:���F�f���ְ$��гf����@��˾���w��!��zᎎ(��F�J�Y�0jMB��n�OwS)uՍ�
��ݿ��m�x���&���z�fv���kԾAF��/�����y�^�[�=a
�^�AN�U\�an��K�o�.Κ�;U�n7eu�q�Lg�Z��MG8�wk�\�����)*6���O�]a%?^%����:k��s�%PN�a�Ֆ���QiBȂ��Qy�L�=��'�_$R	ˮU��a.+���i���Q|���I*��ۮE��P�Q��ɻ�\/��`^���}�W�U���te����/��IW�3Nwrxj�բЇ�=V}���Op�:�[+σwRt����W��M��W�?�z`��k�zW��J0{��]�Zc�m���#�7�vv���zC[��g"e*�D�zMb��W��S�{�˕9d`��P|�&��P�=r�<3��~�B��#)"�������u����-Ucc�-�i��\�Vb��֠a(�^���x=՗oݮe����@�b�PY�t�=G����;�A��ц��b08����~��]a�g(P_I����*]�պ���am�`|����A�epІ>qHCڄs��Pg�|T3D���B�fU��az�\�l�]A)0
*�dVG�|;gl��>ߘL����q�W�֘y��Y��2�$
�(q��N/�K.X�w�i�Q��Q`���њ�3}/ZY�C���,���Zn��6o�.>)�U��#���m�j��p�)����`\k'�޼�)��*4:�A20��5�:q"�UD�l�S��Mj(w+
��8�d=`K����2��=:z'V�)��c`,/�kmt�Õܙj��0r�U#���]�M�e�x�2Wi6w�|	1{p@�
��=|�D�-�8ѭy��?!�������t��о䦑��^���2�_t�a>"���l;`)�4uHqS�S{l�S�CZٲN�ޕO��(&@O�g Cc#�Mev�u��+k'�_?}���ML���_�InQf��r~=S��:HC�GGN#z�q���P\��-=wN�i�'�z�\�t"9zt5�}����p�]&3����dR�O���Y*��$*|I*
��D|�U*��t��v��h�?>�A�S��4���/{����0�(>�Oh"s��G���
�����X��^eEh���xp����ϮU>�N������'�
�ɿ�.�W�I�S��S:H�q�jG}��C��?�Yw7�s�������u�:���֯�b�w�=|�O�Q�i�emޚu�/f9L��@ϣ7��O�ٍE�o�	)_`L�o����o��4�	���l.�]�ȇ#��sUDD�X���`_�Cns��ɭ�����j��A9
ja�-{tHe��ǿ�37�Xܓx2�P��G��ƿ��2�V�}�+z쭬#>��ۭh�9��P5��3��)�a�ux�(h��v�<���u���G ��wgkY�i�P�����_�E_��Djs�|f�a�I�7��j��7*u[�T�eub'O��1�� �^�A*�y�at������T=e^A(�e\g�8�Wż�b�nz�H�iVڏ��,����ߞ|=������2�è5�V��g�̄�`�7�%�M�k7�ح�b6��q���n�ќP�9� �t����;�z?h��^�	�g�mA�r���2���%���������{>�b���U���J��}�#h���-�'Q�t‚�(IO��l�[%CԵ�݇DZ-ڵ2��+aC��������}D�Le�y��80
��5\���^7-^f%hb�M����>2kZ��޳N��Α3�}���G�PK/WUW�j6��
 pip/_vendor/tenacity/_asyncio.py�W�n�6}�W�)��4-
ԅ�:���v��w�E`�<��UH-I�q�~@��?�!%_d����"�g�\I����W��.ο����p��f�w�/�s��\3�I��^�2�����mz}�loe6C坐�;���8�B��B/g	�T+!| 2\
�����j�|O+Y��
i��H\C�3|J07�$�!�8	’��SS�D񱂐S�H��|N_�0�/��;gg��2b�h$�,+��ٻ�U8귉�/2�~.�"3�+`9qIؔfl	R�+�5#-ץ↋yZ�f�ʌk���05G������*&���`Ԃ��h0
	�n0~{�~w����p<����n�׃��fH_o�7����! ����S�,"ɭqf�5B�HeIH��'d��l�0����9��m 5ћJ��a��4��<�Je -Db���zB�6C��-6�`�T��D�%�E3��+�r�G�#��T�A�nVk��1���_� ��e�K���Z�����e��%�#G�EA���eو\��w�(�p�F�B���`��*�L����V��pD��TRX�&�jl��GQ�po�(pv��b5���%�<�Y��=��)�x@��Hv@��L239�=3L!���&�}�Y��LtB8=��Jj��VZ
������#XP��A�Q��lE�B��%O�|ۄx�f����>RὭ�g8�����l|O<wH6X����~\;u�S�s��fV�`�ڦQ��_.��'LLwͪ���k_!�D��.Y.l��bǓ.tҺ�r�ܺ���3j{xJ�Z�~��d�-���niN���"3���t S��҄f@�Ou`ش�!���
���Y.�;�8�jcJ��ĸ��S���r)�~4ҁx��Ĥ�%�x̰���P�����!g�s�����s:{bj�'�2~�k��EAZ�Y2E�����!�L�ڥ@�PU=�忉~B�����=<te]�'[�q:�l��+%�����oT{���li��>�:F�H
�&�gqS{�	��`S{�x{N�;�=����0����_��aF��i3���\�a�;�
��m�|A���/�F���몥���1�m�sI'���)��b�����+w�b���B
0	٘*L�\�?�I7/{[V��;+�w5�m��7����lu��T2�=��ʧQ�AU�����~�n�����{���ZS�\��E����Nm2��M���_�-R��<�~��`{K��#�
:Q�PK/WUWƚ���pip/_vendor/tenacity/_utils.py�U]o�6}���P0��I�=x�-�w�3�β"Z���P�JRq���}��[�7Ӄ%]�{�\�������[xW	�.������ޱ2����B��y��~��
��J�u� �y��`
�$�BT��n���@m��p���As�#�ZUP�T*�D�
d\ �K��.!QE)8�	šەwӐ�D�PK��_�[��f���d4Z��!�BC��؀���r6�<&�~+?U\S��XIZ�$���Ai`�F:��i]kn�̇`Tf�L#���X͗��$�UF��(ULB�a:�h>���n����]�]ts���9\����b��^���g�f����bHi"7�Rj��Dr�BL]����2%&<�	�%���zF-)(QܸB������z�^Pa�G��`j�>ں$�^�U)�hy�О�s�²^��飰`/���z�$e�bN>r���8W�EU�3՗�����%��ulEl!��Z�D�~������v��N�s���Lc�S.���IJ*&���Ӥt�4N|?j(��?�S�|K��ѥ�7+G��	st��u�%ͅg�4n���zwi���V����Pt�'�PcCO��2=}�ջз��+�O�S����C	�o�d<h*`�W�%>7�/��
k�6N�K�<Œ�O���'�s:p�s��5F�~�:
���n�4D�UB�ǟ*F���GL��ӌ��7��["�Z�UB��G��&��G7����4XM\nP��n0/PZC]{��-V��̶Ǵ�J�)�q�D9�q<�c�O#۬�K���rt��t��+H�U2���n˷�{����@�쉣����2]I��6Ȕ+._�[���i��7i�/��;$$�UPY��u�����m<�~��s�G�e���-ø���~���
y+i���(!���um>lg�`�dj��,�����Qr��W�U�6U�6p���`���#b૶�6�
PK/WUWp� /H�pip/_vendor/tenacity/after.py�TMo�F��Wh��v���
��J�֐
Ii`�"��6�]vwh�0��;K��Ay���7oޛ�	,M�Z�o/~�	���D
�B�c���Uظ�p%�2���3��v��+�R��	C�e��a
��#�aQ������F���6����C(������dRmj�L!dR!�+�!1e���	B#���$S��H�т��e�q �\U���i"�	����Ur����j�_����Q+t,�[K�6�-���$��
�h�X�E���Z+I�|�d��̒JGVk5�A�}�V	
�b�}�-��9>�Wۏ������z��������n��,67��zs9�6q�VY��EJ�BL}���#���
�Ʉ}�9Bnn�j��R:?H��RfQ��$�;ye*
.h,��AfM	����ujlD�E"���$��lȉ7����jɞ~��πU&�;V�]��m�B�=�� R�@d�6�+�hb=$v>>�p�N��=l��^C��	#�ǘ�e�� 5�` �8*ƪ'����
>��� �=Dc����Oԟ9LbS)h�+¯����e�ҩ:�5������/����[����3%J��fRKW�
",+��y6�Ћ����3�g)Q���0���6��j�Z(h:g��8��[(��D=�|�A(kGP)��e[�#�L�Z�/��/���M�߇�T�E�'|��Q���E�M����}�ǡ?;��;W
?<4�
O��n(
�p�Qp���f�I���I�5�������^u�m#\7�%���Tj�F���Ǻ.�h��@�{��+B�J<y�������z�PK/WUWEc@&pip/_vendor/tenacity/before.py��Qo�6��)�Cl@Q�n؃�po�؅�,�B���̕"5�U(��w��4J�	�������(���T��ő���?�����J�M���6�X�V���g��lE�Feh������j�K@G�y%R�
;���I��M|/��p��ZSCɦ���B:ȥB�O)VRCj�JI�S�FұK3��lq?X�	V�W��?ׁ��HT��ϛ��E[��^��oV��z�<c�N~�:����2-��YRq`B%0Da���x��J������a�]2���CM�F�G�>p���p���.��n����n������n�����r�-,6��~�Y��o0_�ß��U�m�4�����!�o!f�_;�@nz Wa*s�r]��E�P�G��ˁ
m)��c��]�,%	�V^'4��ڊ� ���JVq�:36&�"��� Lj��q\>�����dq�\pM���k�*S��_���ɶ�Ԏy1�s8 ��	�#;M��$�f�#�)������C�ax�EC��ѱ�h�~A�t0�Ƭ�c�G�Y�*�n!�|Y��GT3>I�eZ�Y��{xx�!��>|�;J�)z�nf�ˊzZ��=���՗n@9<�s�X�Xo�ˉ�H���S�H�n�ȯ��}���A�P�Q-۪�:т��_j�Q�F���܋�_��y���� ҏ��d�?}
�;��,���3��$��,�񧟇�_N#_����D>pdc3��Q
Kt]�N�ɲ���&y�_Q��H9��z�j�/PK/WUWDŅ��D	$pip/_vendor/tenacity/before_sleep.py�U]o�6}ׯ�Pf��u����㸋��)lwEP-]�\iR%�(B��KJq�|�-�8&�=����#���Ѽ�Xx�����Jp�p�俪
�]+���3-T��c��+,X�Jd��#2��)J�T���n�%K髻��Ԇ+	/�0paw'�FU�%P�,T	�ȹ@��K\B����L�5���	⪃Pk�Ț�}I��C;`��X[�NN꺎�'+]���Ȝ\�&�rzLd��;)����d�`%qIٚ
V��
�tg��Zkn�,"0*�5�H(7V�ue{��cFz
(ULB8^�l��x9[F��~�:�|�����b<_ͦK�\��r~6[�.���
��W�l~R�(ޔ��'�ܥ3��%b�@�ZB�Ĕ�<%]��X�P�kԒ�@�zˍ+�!z���Y�HTPi�)�?r��P�2N�QfJ�%K�m�3L*˅!���WWo���|:!M��Og+TQxTw�M�Z�L�K�Ad��I6&F �	5߆��Y&ƙ� �C8~
s%����ǀ�L�
HFECY`2�:Ԙ,�
J"ɩAM;Y�?���D�5���m�h4.s5��R^�&h�O�˞#��Ç�B>F^����A��kl�����ef�ⶴ�4���9��P[�8��t�N�컵��;{'ꒃ8��l�(�,���G3N]����[�j�� ��h7�m
�pjf��
��F�xc�z��7�!ַ#w�і�A��)c�K�`�s��^Gp�D��z�YA��M�$�`�$	�'��d7�؅A���׻x\������?x��L���^�SdhgV�>`�tL�����7��zC��T��lI�gz�旫�P�7v8���?Y��i`CQPF@����X(��)�P.}���?*�I�Z��#_���Z���k�5K?��A��A��k"ޯ���v�E�P�p��mv!�cz����~��hPR%3z�p���;�re��a�`4�*���ި��F�̂�PK/WUW�l���gpip/_vendor/tenacity/nap.pymT�n�0}�+��L4tݴ�N��
�*L����	��&�3vf;M�	���خ��AG�pb�{��M�0QE�y��pq����m9J�p�ڰ��}	�\
�5��<��̶d0cZ����3�{KV�L�u�K���4�B)i
�a\���ve�HW.�s�9@�.���P�vD*��� Qp��`a�KHԮ����v�˴$!Qܷjc��z�q�����
�UU��
�·����|2������[)����lnj`iI؆
V��r��f��Zin��`Tf+��XRn�������(*&!�0����x@w��lq����r9�V�i�%L�|5_D����=|�G�@����S��~�]����b�#�j���|ɼd9B�QK��7� 
�K�E�����L��Tڂ�;���q�R�ކ����d6���O����jd��wR�Ģg0Q25#Ȅb�g R��A�1vP�D�ż&&f!E�jC�`R:��4��?�!�݆�SǴ�$��\/��#
�vO;p1��� �T��]i=o)9@�!<�������_"��^��6��dٽ�S�*ƭi�ţ]���6t�^�z�I�zME6h�#���S7���]nC�p_6�Y&Ğ�"���s].d&��s�q���b5�m���G͛�}E߂W�[R��;mz�)r@�f�y���B!@��?J|���A*X��&CW���l�~�/PK/WUWpip/_vendor/tenacity/py.typedPK/WUWR��/�*"pip/_vendor/tenacity/retry.py�Y_o�6��88�Wi�a2�M��]������h��L���;���/ˉ��݂��L��/���p��ln����󯃧��e.���U�کQ�K�c'LjY��	����
NT�s��A�W��2�>����9B��t��q	%�y
"h�[���R1,T*q�BD0���!�S�0Lz��̭��A��)�����C�6-�3V�1a�\:�*�(=��h����tt����e��4��fNV�B��c�0`KP�Ls�3�t]ja��� RS�d�#�/"��$6Ge���et���`8j��h8�!ƛ�����������������p<<;�o?���-�2<}��nB1�S�ITR��O�q^Q`����{b*<�K�b6�0SW\K4B�"�@F���(�XÌ]Y3�i�P�������Y��4�������=:9>B��?S���q���v��f)�97zuĂ`�z�V�����	�x�;��G���n&�h��mH��|��g�L��Aږe��0Xʶ�f�|���)����]��`�KG�L�U��]x�L�
]���V	��c)���$�¶ \���|���-KPzkr�Q�\�����c�YD_KL����m�O�\\�}tٳ���c�&��cv
�"���0�K�ʾ瞡l]�s��=/u�O,�(�Jz�*jw�ְ`�V���$�_Ȟ��sRɇ5Ż��&�nR�1�[[Etx�K����cX�p��.+��uC�&74��'��q�e�5�TI^OHN����_�����`W�ſ���X��ciĂk�t����=P/�X�8dHK�����2�)��WE8l�)ܭ𡈂�јMez'�6?�@���U�i�V#�ɹ
b����M)�b��z5��rw�!�p����>� hu�E�p�
�\I�^aDE��_-��F�t��o��C<!�0��8%�KL�|7Y�t�jJ#cm� �C*�N-&><R"Sg���@���y��S�c?Si��],c;s�%�T_�j(��<���p�k�;ŐE�
� U)��#ɢ���m�ke�Z˧[�ܛ��=����5
�cx�/�q0o��E�2Eٷ��V4l<��;�0���>?mV��/D��4�b�+�������>]P	�ZNto��α�+0Y޹���nf�WSY�x7՗�[a�\��-'��<���,�Z�<:����s�L�]��:��K��*Z�r�avN�7v{�-���҅�\}�W�;�ZUo�NCڽ����['����<�����Er��Y����n�������n9ק0y�Yt\DFS?�(��I��
���g*3�H
�>��~���S��$�K��
�}�l�[�n
�K~صػ=щ2�괋�R��u����V��tǝJ���P�&r�������s`e�,S��cIp)�H�u��Z�lv��y�u̡�imvH�c�:U���ٔI���*��9�gŻ*�g�KӘ�|X����3��ӛmmuKhy�c�������g����S�Zv7���R��эp������%��Y�yؗ��+w�0�{����O��6S�¿v��K���ת���L�a&�_NY��I7yyK��k�
�=��0+���ޭ��PK/WUWp�pip/_vendor/tenacity/stop.py�VQo�F~��9/P'�V}�ʩ�p
����E���c��캻����K:�6`���Jy)�wg�����@_k#���~�篿/�/��2���Z�?t�X�Gm��ar�:����~��XÍ�S4�	�|�	*�)����-z�H����h��
.�sh�AXo��a�KX��J�!-d2G��RA��E.�JV�-|�$"��BϜ kA�=eM;�^8Wt��V�U$<�H��Y^ٳO�`4�Yo~�r��YJCi�� 
⒈1��
�17H{N3ו�N�y���J$�TZg�t{Bm�Q�M�J({NB��M��a|Non��7�F��`�c�ߎ����툞>@ot�G�@����sa�?��,!���q�@�+B��Df2��Լs��~B�((�,��BZ��J.��	�W�H*
(�6�,�u낐� 3z	�,��	U�M�P�D�5Ԇq�dn�@f�O4��m�o}��n�ـ.�����W���̺/�|B�1�$$�u��g�b�G��~���aoF��ކʜc�-�s�6"ӊ��!j�%��N�z��qB��e1�:�W�&�L��>��
��a�u^Q�OA��Ub���ℲM���	4�P��(��4�Mxm�]�����z0��+��妼w���a�٬�|��y�xe�+��m`v%�@�Dۛ�૗h�J�`>�O"�鮊�RI���;v��]�x	FZ�.y�������*~�+��j8�};>���Eo�U~E�<A:��?�P��E���UH�%iF���d?�����q Y���Z��iC�آ;ZJ6�K��M>�V���4��+d|Y���6���>��f��X8�����W��%us��/��xU��]���g�T�._���o�X�-:O�a���)���*���W-?e�X����*��խ_�C�%���?:@�~|ZjGM-�#˶���7�fcS�:Rl%�Ey����FH�,�K�y
�Ѧn�����m�tp����a��Z���,�#�PK/WUWV�*?�^"pip/_vendor/tenacity/tornadoweb.py�VMo�8��W��(J6�E]�X�q[cg;)��!��H�V&U����C}�r좻:X"g8�ޛ!�ˢR<�����w��\c3�M:�|�1
�	�"Af�0*XL���3*ͥ���<��&�O*Y–U ��R#��R�#�k��. ��"�L�;n6u�6HH!^�rmy3�/h������Ƙbp}���BV
�ʮ��I_��'�����O"G�A�+�����%fkB��H,SH6#-֝↋,-S�c
)JµQ|]�#�:dķ�@R1�hӹw��tP����燧|=>�f��d�0~��OӇ�>�h�Ng� �Di�P?��VBL�^s�#�l�c��x��dB&�D
T[�m!5�K(Jη�0SϜ�
�Je@W��4UA�'Ur/���D�Р`17��wL�#UY�_z�ˑ1�-�q��ů��c��s��-d#�`��|2�2mi����&��dL�4p����0�".�Ba�KSR8e{f���XU��Lyngr}�q�Q-M�N�/���M0�(ₛ(�4�)u��=�M`��^.�\2�
Z0˙�Z����./�Q'gz���ʇ�`�����%u����:��B`����~;���-�J��y��f��LHBE��z�b�O���Q*�
�0��?	��e;���*-��wE8���!�y/�j�3�Q���:���;8u����g��H�%���k�r��f�tH*����ڟ�÷5�m��Pe��ui�����
�A/��������5d���Kdp��qt�P��Ɇ�.sC�+�yBT�ˆ�ivO{���3�?�%���p���'��TB�&�n�G']H#j�Tz��Ą��N�N��F�8[C�k^Ǥ0?'f}ޝ���.���HૉXS�T�F��.�,oQ����o�O��R�zٿPK/WUWIhլ�	Xpip/_vendor/tenacity/wait.py�Y�r���)P�!�L%y�SJ--˱�����(.��A�0̘��y�<I��Rr�]lh4���F�;�����*eLJG������Y$�bo����γ-*�^�U��;n"���~1�??�K�a�t4��$��P(+�,SXb�J�I�C����?��R+v�t�n������T�eV���l!#��}(��I�B'��*l-ӕ�&g�ŧ������	~-�t��N�U�&��h�^�	h�E�Ȏ~9?=��:BXG�QE�Zfį�4Ps�a<�,!�Aˆ��6�/��^�Iֵ��T��z����2�65r��
C�A�:L��N��U���\�_
���݇���fry9��>?�b.�釋7���.��-�\|b;�x3`f�5�>1$?��dB1'{]	�`��@6�\�z�eƗ�-�Wa�a�0���H����X�<u+�
:\�M�,,��q�+�$`��,��Y"�`�U`��P<����,���E~&����黳S(��q���(�K���)��+-:�NqXf�e:�q+z4��>�{~�nw2�Sx�2�f��LEGm�b)�
@�qg~&<?�t��n}.l:
q�tڳ"ZP�fjI�1�6e���/li�zY��N���Kf�|
6�.����ܙI%�+ܝ��uF��5�	��N��
��Ku�J�g��/���%AE����(�	~�9[��,�Q:D~�,f�L�x%?�������1�P��\*m�-�7�j5���xrW�Y��ܶ����tn �k�t�N����ur+�����ͳ��`Hzww�Ѕ��^ɼ�ћZ,n`(���̝a<֙J�f�Z�@��*|�ǥ�%�lj�8O��L3�&�:�_h%*�:[U��6�I=�"�jn������{���i<!{��^�͵��Oވ(��f�z�e#o�6X�M2 g��t���t�ѷ��.��R�b~�׳���X����~��Q�(�ҿ� �BNqSk$`����o?��������� wQ��^���V�-OX���S�6�'9z��mU�řݸ�h�3ja��䏷j��{��'��}WJ�c�j�j+�t�6�
��5u71eh�ռR����:C_��h�3��k�*,�A�ck9��5�q�~��09ӷ��+��J�ǝR����N��5 ?��K����;��Q�Z>uǞ����oe�ҳ�R���߯R�"�R�q�{bP�z��|g����8I��������m��f�n��������h/#�W �	��q�&��,�	3~X$ToK���K�$t��q��m'^I�3��)&UhD,%��B�7II��*=�y��ȕͳv3.)������<ʄ�����y��Q��9n=:�
K�;@��%(��9B]�Ր�1:Eǫ쉩F��_$�
Y���{��a�~oe��>���fr~=h���!Y[���٪����'�ݭST=���'���E��exwvQF�)O	��C���R��2�73L�x���27��N��~ыEQ�\'��9Qwt,C��?x$$��F����X.B���1�N��VD�}�D]���F�����/��S��@���W>KX��i��G2���X��z��F3qRB�c\�]�h��F8��
[�Mf�A
4ә	E�.S�+�Q�v���׊�3��<�|�Ӄ���+�J�ℸL�	ZU
q�L�����]�0�h���\ݭŨ$��3,�4�fp�|>n>ᛁω;���.���v\���S@��'5�����6؋?
�BY�_@�����ʋ���C�j�; �5/�y�4��j}f�6�-F�s�i����3����B^�ǩ{B��M�*ȹp#ŵ�:G��j��
u�'���\be_��xjm�Rq��>����G�v�gAl�eO@7!�[�X+�֤�"r�hc���\�`�3V%|����|q#b��P��P0�~n@�6�k�C�.
�R�1F�"
j��7	�EzIc�4�ЄێG#����oZxy��̎�	W2!�A�j�s�i��ٝ��"��03�wr��5n�(@T�������{
�Ӌ�/���o��).NqY{�����Gۮ ��:9^:�#d'w��eXn}�4>����a�Z���={uh�u�zQn�H�ز
V���W�7R�]n�������!�SƏ�rK�P6��5e����UB�|
d�TŰ�0�9fF�V,�!�r�o����\�5�[�n�g����,�����'�w�.�=���2�pŠh?��fCx�����
�*��>o��0��<Xj���.p��K1��Ў�����tBx�������=4q�X�x��]�
��x��h�r)�>^Z�b���H�K�<�eWCT�椐����W��L��K�m���eW��kWI��FUx���Յ�7H�N��E�N�PK/WUW��%��pip/_vendor/tomli/__init__.py]Pˊ�@��+�x�
����`"�a=
c��`2:�]��w���ttUuW��ߥߓB�d:���Ϛx�u.��s��5-l��ru��n�x� ��Zc��nڐ��Qg��/ћ�
k�S�,#�0Q�EA ��k)񅏰����1`�b�.R*mE������;m�C��4������@��b��Q��dsH����N}��/="/rq�>gpf� ����߫�ֲ��1�Þ�|��#�^u��Ժ��Wu(���o�S�ER6��kz��Ҩ���PK/WUW��i�iXpip/_vendor/tomli/_parser.py�<�r�H��j��d�bK��3�XM[��#����]��`QD�8,�5����:P�����e�-�ʫ���������Q��se�"�ɀ��'�W� ��1	n�ل?dv|x|�&^�À�������4gY�>]}`y4�	��ieI0˳8a�ۄ� �Z�$^1�]�Y�p�e�j'�(μ,��T���0�>=�{3_5g<�f!o��)`�nE��q�S���[��ͧ$~x����6���~	"/y�o��|
�E뾛pն�b���d|>�gO�g֓��翌.�ϕ��K7�ݹ��,X���0����y��f<鵺���p������C{|�Apë���=�\���ġ�:�2�]���X�ċny��q��Ujvt��n��z��l	#/�M9��=��|���-�7�cx�wi��>�,�#�P�<I`��G��yj�i�% �{)r!�Ff��#9�������3����Խ�\���/��5����&s���g����h/7��0�Ɠ�%�5�6�U�wS�F�
���G���[���g�?��1w	C�r��݋�?!4S�e�2����5Ң��i}/���
y1e���σ� ��΁p�b<#T	���iC�_G���}<iƾ�R!������Ƚ}:��Phعl�~������̜�����{%�x��l��V?�V�73�G��P��8.8����ѩh�q�ʭ��h�{Ix��%,f�۶o@d���h���"��&�N
�p�R�g�.���S҉�܏�|�$q�//����;�3��'`A���,�<�s4�,Hq���9��C�?�Fj�����Ǟ���m��g8����恟]���^O51Ԛ�0���d�������=�l?����p �Kϲ�q���B�YN�����$2�Ȅ0�$��%�_}�A�*O36b�<BqE��`�1޿��|���"��Y�
�=�Nf��G��
/�H��k�I-9�߻��S�:`$�o�<*P��
��χG�� �*�>6z�.��k�3/��{�'�b�&�	��Z �W���c���~�����)�Kc쓂?��#��H�C��4�)�:���XzLX9l��q��{�#��l�g��f|�X�t{�C�ݦ����H	�/��jb��;�ނ���=$�'!7P`�!M!�1d��+�]q/J�9Z��<���炒�%*�$�y����Q�]�k�-P��4㶡I���/��H��O{�_H���� �C3z��͈@3���l&5�9`<�c#��
����+?^��ʏ��O_�X�HI�-�����0#;�����	z�?F���D*�}�n$��Ch���b9!(�}�DzC�A��P$�5���I�4���d��3Z�����	)����	;��B�D9��]���*�	�F�E�0��WON��tk�lV@-�����^E��I��GsMV4���!x9�Zݶ� i��>�y�&����]}����;�����$��N��F�6�|Gx��[�}�h�|�*�%i�/���a��q$
m$���֭lL��+
��V[.��`BSg���L��n�������/kD��ĉ�ӼEF)z!Qbג!Y	3�@��T�룖��ܤ���pg+o��&�-D��6��"�C"�2|�j�gh!��:AD�@0�="O�7��
S����.�O�A`�%d�3f�?�01:�)H��8���DB)·�l�5!�:,}�2�A0��������Մi�a��Ad��Iy���
-�}��K�b`D]�m
���K-�
Q= A�ΰnqMu� ʦ�
�nA�7�k�`z8QJ@@��H����:�;ճk`�ع���P�WÙ���y��z��~��W~��C���C��1�t!�*ɣ�\t�$R=P6'�t�Mm�az�Qb-J��R;����^;��Ԣ����(�k��#z
�(ine���l�a�t���"�0�9B��@�J$z�T��L��WjR68=���3�Ys�o� 0����8R�Xk$Lt��Oh�!^W�#]�yy&QNi��,�"H�-�ua`r��bc�/	o@��E{�$���Cj+��B��k�ĵ�[Y��mU��F��o�i�	��L�IbN
S�uL3��np_��zO�E��V	���r�E~<�ٿ�
�+j�L)�U�c�o��RB�C��xb�+ʹc��"����X|�|GR��Sa�L
#+��j��H�Ri���[S�_`�6��2T��f�W Ƌ|�.=J~���؃�
\��
��%�U�(�90긂Bƀ°_@Z��g �[�5o�,��Ӱ�Z	0����Qeb
Ԡ֙{G5��ɨ���^Jz��6R���(q�j&�iIB�H2q�l��&�/�yz6��rBh�L]?=O��W�1�H&I�d``Xz(SJd
�Ne!R��]�(��j}'���
DV�%j]*�!�e�
9��3s�ul�GY
��)oI��z�s/㵴/T2w�hP,gw�[��ayz�
|C^���6�2��enk�Z���<蚺n�S�.�AQ�O���gǬ[��ɠ��t��ǁ��q0��8��|j�6�&�%�h�̀Z� ?)tć��@K��CI�7�es)j�Mc�&�f�W$�e5V%,}�T^J��v�g�ȉpu7L")����R���Y[^u%mh��8xX�"d�2�s]�\�����)B�N�D�Dž�
k�`<��%!���^�3���n]jv���n|�u�(6���ri�,
��1P�MƼoU9�M66co����?8��3����W`�e������U���2���ȇb#�ʓ�$�8�U��!Zr��,��eǙ:b0vE�
o{��%$��e��%2)Sڲ�g�������VU�E�zl(�Y[�Q����R$i���+�!��]4��{Qm2�
�-�����٣��@5V�~���EMJ��+�fy�C<�
>�G��S0�!<���,@5;���fP]���?�^0���(���-��؜E��0;z��H=s��q����2'�ďˢ������w�,u��L.�6����$��gK��`G���� �����9���H��c���7+�K�߉�8��L�>Ȃ=<�b�J�a�hiW@w��O;
�o����%�퍦°3
˳c./�JZ&z�CQ�F��s�Ӂ�	{ ُ�u�B:r]6�z	_uW;2-3��t���̶�Z�X�ژvGsnc}6�ܴ겯u~S�`��VP��,"/�!]��Y�mT[��X�+�$%gE�Q� �=�PXV@��mB�d�	[L�Ɂ ���>'�5��Fz�)�Cs�ږ襢^�!!�E�g/x������z��6�>*�n����~mrS����<�MeS|�S~+�<'>(���8�SMzݽخ�fk�lR�-�P�e��7آ�rb���Ϧ���+�����oy^+,[�+q����!{��Ď�����X̰AU���)֠�v�XԮ���K��Ii���m����w�g�3/
�(��e����F��&�;���c�Y,}�ةrу�"�p��ΑLJ�A�f�
��L��:��@d�'�zڪX��B�=�;J���*G&yw���Q��cS=���b����pk1�'��6ڿ2�����^�>G~�z'AslΊmU�0z;�`3o����Υ��%K��j4V,~S�͢��Z�v�Y�D���&GS#�筊lT��6��rk��9FnI�^�ڪ����S	Hd�cJ��j��4����s��3j�|H
�9'�Ap�sک�B3�t<O
p�2��Ԑ~���Ր=o1d���!����2q,��s����R�O	r��4xڙ�<�����܏����BĚWs!���T�xj��ce�4J���O��
��+xM���g��E�u�-��?d,���MF�}�,�c��hf�Ҫ�=H��\�R������~�ڳ����n�o�xM�߾k��{������w���	��ț�Q�Ҿ�o���^�a� 7yS�����@�����P�ZS�0i�x|�Zc�ҭ}+h�F�\I�`\=7�J%�ep�a�LRL�VL�yT�۬%[a[�D�����.[wQ��{4�t�����'�J':�:&*��~V�QN�WS�͔Q���VP���ͣn� ��Kd�!{�$U�0��D��>�L���6UO�+��H���Rm�)��z���$^/E�QW@0Ji�t�n�G��ziׇ��Z��\-;h���I�)&=EY��ش�Ito����b�	vb�sB��-�<0v�-$j͢V�.�~���n�@�^�<(��漢�xmz��]؅�dcjI�Ds�ZJ��5���v�vҤ��R>��;�b��ѹ��`��Xv����Й�':���eڔ����Wga�E�Nl�#=S�ђ��x2�M�4#%!֚3I�b5�}8�3�l.GYmX�#;n�p�&Q)�m�FfpZ�Tl�-�bi��Uը��}���2l-k.��Θ�\���r����*��ZM�4�e
��ɪ*
�U���l@.iz�q�v]%�����h*�2���V+��@u�.YəK-��#թ�gc�z۾��ҿ��ƽ�[j�0�V��	��e���DDP5>�du�X�K-���?}��/&���|���ڵ�`���9'?��&�H������e��_�\�I�*{X;��VjP	y���У\=�}�Erp&�4�`���DI����|��*��>x&���Bt����m����G�L��8 ۡ��cS��!�ݫ�\7%�z�����T�(�UA?5�.�7`x�a��s/%8�=f.]U�ϸ�OϪ�Mv�
T7�g��m*���:6�JY�8�7��}���K��
�r��,M��>�`u{�C_�f
L��$�R��P��+��k�:����d�����:Q�������]��^��=�1�{��^FC�x�#ݹWd�����}�@�@P#{x_O�i3��t�6���p �b� E܆gJPܱ�$>�}Ev�ˊ��ˎ٦~n\��K��Bb�p$�	v�����7��b��o-��yVe�,�7
 ��E��{ޖPS3�| Q��������u� L)��&����C"�֕(c���3�*J��	:��^
2=����޿�py�U�����i��t���1o�Kq�RqUm��&n�׍�xb��ߊCW���)��Q��΋#_~�G�,_
�Lj��%ZCHW>��HĝV����F�›��f�v,B���?��'�ٱ�)�7�p�`��Y��'[��sW�JS��Ж����o�'ה-�ǻw�?���,�wy�m�����[���o�㫲J^�Ԛ:D+'^�
&a�/�/1���t���6,Q�g)�O�=0����ʉ�;��P���y�k7l�^�ɦC�"�(�w�l��mm��D��ξ�H���`�CZ-%C��/�[�"QQ���RV���}%'���=L��H9h4�
ND@JKp��5���O�왮��w�ᢖ4\�>�<������a����9�޺r4�z�n������0]��M��w�z6��]7��
c\�@�1�߬K���Vk:�9o�/PK/WUWu�1~pip/_vendor/tomli/_re.py�Vmo�6��_A(_�T$gka��� i��-�y��H��U
�*b��;���نa���ǻ����u��o?~s���v�R\�<�1
����8�Ǘy�/�fK������h����o���y�KPW�R����Du�b�btAJF�ǚ�Η�5\�FF�EQV���(B�zC(CqY�����Ic�Y��Z��F�o��厔\��ˌH7Y]&����~
ZGI����KM����R���[��	n�ocZ�˂�̀��҃.��d��w&~=�ͮn���4��ݡ1��5����w���;Y�!�ܟ����&��%�ρ���c{b������Tx�^B�`�2��i��o���>q�s�2v�ȢIgo��Z�'��y�J3�*��z�ˎ�����C�#Df��ޘ�q����i������Ay��jjS���q�V�#�{n&�k7���e4N�R�S�s<]��^uӱ�O���Ik���$+�e5
�N�>|��:p�\�8����փ�x>��I3Σ���۵|��>�h���HՉ�L@(�C�����;7�Ӧ(�3�b�܍�Ec��-�����hP��%YVaj��HF�3��Y���t�[BrHn��F�v.��R��a�|�����+�N��Ӌé/~����y=�5.j<����V�R�0�PB(���1�y*�-A�x=����չ�1�*F�F��ѹ��x��H=��˚ᾬ��P)����vuQGb�6"I[T�˲��oW� l(h������T�m��'�[Ђ.�4�hz��A��С�@y�>A[�M4��R
��]Ҝ�:
3��B�>uM>J��N$�ʲ��+��+f�u�零�Cm.*�|���6��;�γ�kij�Fl�V�k��B���^&oz��A7�U��^��]�zAht��˕�f<fc@�h�!!�!�L?�c��C������T�;<��bz��h B$RoaP�l�3E�(3��@��Ѻh<F�S���ĴqKJ�Q���U����A���d�=�n�;������-�m�tE��nɾ����;�Y���tdy����a��+�����&Ѐ��P�b'G�l�1L�`�tZ]#��&&��:ȷ��PK/WUW��g��pip/_vendor/tomli/_types.py=��j�@D��\���!���6`���æV\���he�}7m�u�̛��׏�;}"'\Fd�+�n�x���������/��n[�<m�����`��n�ȥ�'��S���6��b���q.G�sW�,G�	h��;�4>	XA�Ā���<��7N��
�
^��s2��epo��1<�
�\'����PK/WUW+)�pip/_vendor/tomli/py.typedSV�M,�N-RH��IUH�/Rp
P053�PK/WUW��9	�"pip/_vendor/truststore/__init__.py]�Ok1����]V�H{*
=�^DB�Y;e7��(�o�d�0�$�����Xk�I��#Qny�Ή��+_iHJ=T�I�4
%k�1��h)�'��f�?��$q�C�ɢ¬�.
�ω�2�W"Q&v��!t:s��A?b���5��.����J�Q;d��ׯO1(}i�|�ߩ+].���O��En��/��k���C	�F�R��HK�!d�M�=���@���~>3�9�u����`+ث�E����]SɰM}_7�|PK/WUW�g�a	�&pip/_vendor/truststore/_api.py�Z[o�8~�� ҇ڀ�>�/�Mә`�&h�.A��ms#�Z�jj`~��CR)K�34(*�:��\x�yYIe�����Te�e��L������*.6��1�W���a� |#�bw��d�V�$	Ҥ��Pa4��	��T*����ͧs)�i�7����oT��6�0x��ȁ:+��	�TO7��-��i���,����\��I�-�4�ғl�A��|S���I�L�.�SSF�@\LX1��U 7VT�L�55�E�d����?�����{ ��U܀�Ji
A!��7*���5S��+�y0e��o���z�%ՎO�����a�����
��
N5Ym�����R'H��?�;xs��d���B�$U~ks��TOpN���
vww?) �'9[.��2�ra$&:���?�)<�ggg��B�edan���d���A)���d=<X��낁V�$NV�r�@@��W�5FM�hN�:��9�f���UQ���"�D
�p�Z>	��c"cD�I��skI������d�	5���h��M
R�ےԆ	v���en\^s���XeȥU{��T�-���
�B`1�G���Ƒ�E���L�� ��a'�i�?�^�`0��aH��:�;���6<[��$%��}w`ۻ�K�\��]%ز��g�
�m����~��Bev�a�SgT�N5+�6���u���Q̖f��
3�*	����.c�5ٖe�:`{zEDr�`7�[c�����O[&�elB�7��;�G�K��	�"�Iˡ���8e����5	P�œvFf�X`���r��bQwh�}P��:I3�s$����Y��������ZaS�z�Ӭ���v�3�r�7Y��BҐ'E�t�%(�L�צ��˒�r���-�-���G�kw����H윊�v*�k�,���$�i+ux���o��B�D'1,��/�O�7�k��M���Z��
Wop_�O4�L�������r(�]��и�4�6����/Rw	^:k5�!WR��#��PG��J�K 6��`_@
�V��u��f��ɵ#��Z�̗KH�q}�h���{"�QoȬ�a��L�_Ƒ�
��$�¬ۦ;�o���۰ޣI_��MOê��Vhik��L�5�c-�]�y�f;������+S��0���m��@���h�ep?J�x��0�-ˑ��	�2�&��_c�����
Է�y��G�������:�$+��E��2����W�؆G
��L�0߹"��J�v�/�:Y��<DpB7�E�z��o	����룶�N
\/PϨ��R8��K�BҼ��B��t,_2��E�gm�"���nC_TdN
m�����R`��6ɰ�G���|����6'���A�t��wo�.so��]Z�Y/�Q�lK�
P�P���#�
R��V��;0�[���;�!GB��ͼ1w��֞es3
�к0�k�1b��U��u�k��u�=%7_�_|M�}���y�Ŋ���:�y���D�,��e`<�f�%�^�a��)V(�{ƈ[�˙��x�Ƅ�?�����T���P@�i���l3�wbw@x��n{l��@d�3�������m��-䩲q��f{�r{VЈ��;*�_a�ƨ��jY�vQ�R�ӷ��c.wvZǞ�$IW'�]�i`!�=Ò��^���T���%��UL�e(_Z%ϐg��Z�+�C��ty��!��"��@^�l^x<��a8�iN~Т����X�1��ԝ��j�,�����^�����:����e!7)N�1�,�c��{�}��t�N��Q��*�O^�%.��W~��}���?�bO�W��8��s1R=��紾5I��̕N���Qo�.X��EXz��+���� ���=Ծ�=��DY��}ޕ<��g�R�S�Pv����<x%�X��d��f{r�m���c6���v; �X;jV�q ��������uL�fY����$����;����d�M꺠�^�o>�ZB~�#�fO]�Ӂ���u��$��Xʜ
��Ə���1h82�Y�j2T����^0��v��Ӓ�#X��o��0ַ�9��ix$8�l���Q{�A�N�
�)��� +�n(~�"^.���
�_��@��痓����G��E��O[X!
�R�|�)sr�[�Z�o[,w'(g�g�����$�6�۟;��|U6���^�҆L��|	h�#��s�/Z�(i��� OܷC����?�"�K�7x�It�F�O��{���qg���w�p��rV#΀z��8��T���݁���SRի�gnpj-��r~�����釋�3� b��;��?
�.i\�s��w�PK/WUW�wM��E pip/_vendor/truststore/_macos.py�ks�6�~��\�9Y��^��9ߝ�ح�;���:��"!�TAȶ���.^R���-���b߻�rUpA�"�Idl�czDlV�4�VY,�_��e���0��9/���'�������H~{w}quwv�~$Ѭ(2�=Y�<Z�_,�~c~dE~o���'k��C�R�0t)��9s����|�S��l$�͗"΅%<*�0O�-��l���EJ{�h'8R�"''�5c=<~�|�&�~���UF�x5�m��;e\�2&�q8�؜�� ��Ɉ
��y�JJ.$�g�\q?�u�m�-�/9���H��$�����SR�WD��A~��?��?~��E��^/�@dV�i��Y6��%=&��#pEy8�_E�X,���Sj�"���_hIb9Hf�Fdgh���'"
�)/s�h06s��,��9�{~N^�{r�愕D�d��pm��!��y�d
��H���\,��r�̨��R��3�єĥ�ivc�rU��>h�?O��_
+�
P�������Ue��KJU�*����ʂ������|*w��ѩ�b�s)��!;#�y^���&�>%t%�"����w�}��;��3H�!�A4�X�!�F*�����d͙���S�d��G���vS
�|y�p�<���ʗf�xn��PǴ��X�i,�i�3��l[�p�
0�M��Hc\X9���"O�@_���f��I����X���Ġ�'����)���z��,�
O��xCw�XÑ�7�M&݀�81N�ƆH@�I,
�&XD���[�u)զ	u\rp��\�cC���S5:4��?���S��g���k�[�ϝ�J�<��KW\��S����5f�!�zWd,�l��W����u&��4�i���Z��ɞr
fb�L�^e'�/�����BNK�H��ۊ�Xm��)1(*�ֆ�R)�Ҳ���2oy��#�
�7�qI�Z!EyK�i�,
�쥬���hxH�|Ef[����I;I��C�Dؙ���8[X;	ƎB���eqv�B�����V��7�&�5[0x�b�vno/��5�G��m'1t]Y2���V%���
&�mC���C��E^-$t֡�p4��tW��PjUk+��;���r?=&�>�4�C,?�|��4mY܋
�{�t����\����/�i�9}���[*E
�m�{C]3N�%�Ԧ\A��9R�kI������5{�:�q;L%��6NFYʤi�%*(7�����;�����"���s5��C]��LÖ�ւ���	^c��0
��J�����l�#Am����N��)�:����uD3�2J*[�6K�!��]k���_�^,jdx��HwEI�^o
U�ӂ�e�)`�Tm�y���S�Z4ƯA�j�K��9�	�މ.����W#ڬ��^+׶m�t��y��kuͯ!�g��u�
�E��d|hW�7P��S!������Qu�Y�H��:�M�߲��u�H�q�L8[5$�]��c��>9���cH���9�1fy��9T�ˆ��0]�f�Л�6,�5!~�5n�q�+���^�Y3
���m#���rzWΏٮn���(��uz�a��:t,��6��o��Sg�����/�<�hT��̻\f�ǤjMD�@g���������W?m7_��A�J�*���n�|��)���"?���b��t�MӐ�����AV�g�G��sr#���it>.X��^NUY�8/���
xw~pD�m�jȱ���Q
l$<Z��K��K�@�M~�ԡu���Hb֦�h<g�@]!��"�x�����ۘj�ɪ�����)�*��1�ˋ�!���q��]D�%�wP�i	 ����AG��#5��J��Ɓ��!Q�B��ƴ)���kP�#��?���EB��(I�I��t����S#����奱9%�3�ύ[/�-ⴠ�<�'Z<�<�*Ȍ:��(@��|�Fs�m�F�n�,� Ś�%IMuO��0`MTO� i���)w�B�d�f�z:8�|���S��E��p�8PT��HV8�U=���a�v�^��͸j�B�U饝@�רCmj,ݨRUx�y�ʮ�'1�M�8�:�fDC�~/p��\
"��\)�
3�yI��p�"�L,�F�iN9K��c���1�DK�	f|&@�����"�q�?���Az��@��+������%����J���='��e6���T2ի���]F`k���'<_���03(K����on�5�~���~�C����l@5��I���`�49�L&����M 6qϗ�E�T��������o�E)��%}��e,���3�ƙ��i�8Mլ��#g�U�Xg�~���fR$
���G��Ң��|�nJ�^�q�[���R9�9�ooDŽ�<�q�9P�m�|S�2R9܈d4WTMjnO����)����B~g��x6H_�E�M�}8���w�IH�n����+�;%�E��Ɍ�Z	��0��rw��o�VA;s��^ ^�q";�Е��r�|�l�HP�PF�k�
�aHʪ��[
wk0/�3��^�s��b�?��1y��g�md�Go=��/j��V�bS��'���T��*��3_��+�5-d���������Ӻd�C��`��/ȩ�4���3%�uN�ͷ-	ПN~�p��'`d��X@]٥�p�_���Q�3 =����G	���{c�a ��I�J�Az�����:����e�n����Apw�4�k�7g7�Ɣ����թ���P�RC;G��[k*�w�T�)�9ӹ�A�&�=�/s��c*�m0pvin
G�	����7���e�7Zc��H���a�
>�׉�*����#J
\?��;Y���&Jw��yϼ����9w��UCm�N�mº�KF���R%�l��<F����Ѳ�k��WkQ�!�2�]wt>��Ь�b�o�wu�z��.��
��v���=0�:� OǦ��1�1w!��)�Ԭ�j72w����UKh������tܻ֓�S��T��ݝF�G�����]tu}u6�jF����m\�a�ql��V�r���
�0\u��K��J�܋�aI9�d�������X&	p�
��0�	,4�P<�om67-��{Ĵ7T��r��V�v��ҠF�X��A?.��a�E ������m�^Iթ��5�͟`8?�|L��}�=7T�;�P!��\���㹼���?��\��Mo.��g���Ӌ+����4��i�K	����N�j=�k50d*le����!u�,���[��C_�=�Ͼ��l{�hZZ*>�֜��r�Å��nW��˂�v��8�}�U\���7�6W����]4�Yc#��+3�e�\�s�=~„P��U��H���s@����GJ1ح[+�.��cG�*S
ţj�jZugL�P��jaBũ���_�;��JKn�H�A��K
�5�ܞb>�=&�q|u*�W���`���,4_j�)��qK\V�q`YUM���0��p�󽳫Y�q*i�Ӕ!D�iIJi\��lڏK2!���^c�I] �k\����i�
�/P�_�Z�"F��.���c�'��4�%�S������OQk[�r�*�r��2B�k�j7F�u�:Ss�#X�7L�i�D��j�u4��	��E�H��}3���th�mԲ!'�m���x,�$��>�Yd�i�7���޴Tb�<u\�!��y��;>x]�&x�u�<Js>$K
j���g�;�m��	9��e$�q���*\���lAS�͒n8KTj���@����[>��F����}o��U�N�-�jwA��n���(F-L(�m.Π*���+�kN��|�i
�d��=�O�F�*F�����9�C��J0N��c�7TC�$��N�����7god*��}����s�-��v���z�sk5�H#��J�r��
a>ȇ�� �'�����R�,�Ԛɠh9��1^,*(y�׉~-X)�%���'�6S������fR�=��Lh��tW����n�q�N�(��i�����j�K�j'��nj
~ZO��;c;~@�^�֕�~m�6���1�.�D���U��r_�d5�7���>d��h&s���)��+�AH���$���gs9�q �<�r�Q�VY�+I�����YFM����p�V�`U�9n3�A]{B��غX�au�mP:*y�'���&�� �+�M�P������)�:^]2ӽ�]��#]+�PK/WUW7F��	"pip/_vendor/truststore/_openssl.py�UMo�6��W�k��\�=4ASԵ�@6��	zHS��F�TI*���w�!��z�Z$��y��C��2PHa��4<��ߑzX)VZ7���:.�Qt%/�A
9�X�P���t�M��i!۩኉i���'z�
��6R!�;�׊kÙ�k�-�(�ϲ��͒����bv��%<D@���1�TQ�p��T����>u(~_�Ű�^�9�Y8�h���R�D�a;���`�K���>�a��|ڸ�#���Fng�9��}���X�_=W$L��ya��� D��Je��7���{K�M�`��E�ls�\d��Ωw;����KRN��B��џ�%�,�f����?��Gj��M�(��P
iX�L�-���
2ګ��W����¼^��H7���ߛ@�s(�teP1��í�x1HΕ615O�R��Q݀���1�HR�K��R�uy%��[h�Z�^x��?#��X� �*�`>�o:`��MeϨx��:fj7
Y�Þ\ڨ:e5pN�p�b�)�!�s'���3<3����`�bi�Cx��ȫ�S��a�iZ�f�ߜ)|���'(��_��X���+�,�M-��J���Y�!S�t��qq�Ő;M���t�}��jHC�(��ўwI1d~��:sN��L|I؋�?�_������M�����`�VGg-��T�?B�A�AS0� ���mI�CgQ�����ؑ�3�FV�ԒK����O�dj$+}�$�2 ?�ԐO���qlJQ~�L�ߥqd��A���'3��
���9��bZl7�k���6 qZfR24T���H����(~��W��@4H,X�&lC�O���yJ4�zl��S:x�S�w��{n(PD����ތ�q�a�����- +j�,�|G�G�Q�"�Y-���\��c���>��%�.��zWsR�Nm!�A��5��@����%xPM�=oL�E���ᾚ�0��V�x�[/�_����e���o�Y.
i���7AǴ��PK/WUWi�\��j(pip/_vendor/truststore/_ssl_constants.py�S�n�0��+���H���^��/��^�B�m:ѮL��_�vk�HvQ��r8Cʶ�1:e��!�~��Y:(u
_����>"�`���ʙ!zxB�A�0�e�<E�� ��I8K�b�}�Dpw����3��\_ځ�׽�B�W2�!�	R,���l
�����:I��5�Q$�)5*����
�=yھ���a+b
[.��h.��M�a�%7U����M��%;��dmrcI.Rc��Ғ���5�p�#G�3S
��"Z��J/�L��{���^��
���8O����%O�}s���4����Ր�+�X�i�{����竝y�_V�~n���Ν���P���	J_�������Q�G��9���6��k���";�}������.�j
�/��Y�ūSdUd�RGz�Ѿ�Y\��܁=��~0�a+Z�,�zPK/WUW}K?�s<D"pip/_vendor/truststore/_windows.py�ko�F�~�w�A�4�����T���ȒN���A���"J�:reYm��o�Ar���8�
Sܙ�y�v�x��r�DY��+N�N��ER>��6N�;�<�8|A��G���r<v�7�;�s�����y���8�MG��7��/>�w��}��h���K�����zh/A��O9
1
vieK<�V+���m�0��"�e�^�	��B����t̰.��K�x3�\�=�<�N���l�/������r/�\���bt[�τ!��b**�Y<̼`x�
?�`Ag�:��ZPv��W���1�����l@4���Л/�7��ě\��g�����\z7�-f���`�]��P�%aQ8+NA�?/��f�s�X��Q�,@cR%���r?D9�R�0���ݞ�}��� Jk��"�0
���6Ś� j1pX��\3ܜ��k�,`3N�7���=w���;V~�]>���8���v��-~�K�����"9*���}����7��)�0��Z�+Z1�`6��������w�
��f�QQ��4B�,��C�r�'s�����"ޠl��䬆k�2G/Y�8K�rT�ST	0��R����
�h��8���^J���W�����<��徆�J��BY�(.^�.�)j�h�]�'e�Q�:�6q=vPR �\�FCZ��E�/�;�x3����!ީ����썽[or�3m�e�,��/�!p��
\Q��B����&��-wD��t�"��[�:t�cQ�ů�+F)x~�N����k6
>�������j�iG^�6�m.�V��Ď,6��8.���&,��SkC��q̸G�0�V���8����!�"�6�(��.Lb|��V5.���Q���Ғ#�a�Z�?��|��{:
�U�_�;��f$+HYI 6{x�|�C�=	��t��+ߘ|S��Խ���C������R�8K�����P��u�Ʊ��D�W"z(��a�"��|*Op����2�~��i	F�jt�
���4r���y�aS5�R�w��ia���eL|G����ɋ�u0K*i�������5��64�]�l� �p�<��%�ao��.��tk�5�������rF�ʶ��ά�İ%�3�YR���Pb�C���ߟ�#�d����u?}=e������~0�����̀�n��霴�Nn�&�'"����<���_���u�"*���t��:��e0�0�9�0|o�ћ���
������Y����g�����|v�v�̽���`1�NX=\\� C�8�|6b�	���;8w��	�o<&S�0��
>���xp�B���>�0���hH4
1�>�E��G�$���>��|�L���t�@x��d�+x�����my���;b9�V���E ��ME�WF�0�,<��#-��Y�,G4��'(���2Ӥ�l�F�w��s0p�>�|z��»�f%ƨ�U��3��K�t�8ԃ88s
��U��D��}�+xA�L'��B�}t��N/=
RI�Ť/6u��َ�l�Vl�q�Ve�m�9��`�m(Fna[2C+��d;��q�-����w��$w��S�|�N(_q�Ng�VN��e��0@$[�B�K��eI�	�I��sA]���O���+'Ͱ�q���ƙd�Fa��<�T8S�A�+�r'�!�3�Fx��K�*�7!��J&|Fդt����ҁA�R�#�:��
B�@3M/}�S�(%�o�m����3�r_Y�<��(NZW�D���U4e1��[�ҴLe���$�9?0q�Ãj�J���@�d2r�PeG
H;�_��A
���Ul�d��j���#��K��R��$�#��j��o�X�8��t�N�OU�'�I����H�j���Z�ʰĆjѭ��mZj��R�T�P��S=M}��4L�+ak�G� ���JV%��:�.k���2��GXY!^ʮ�"�J��H=�J�	v �ڠ:a�]cW9�<�J�	Ɗ,�o҃k^��o�P
��o^���-�:��!e�U%G��[���[�`Q��:W]�6/
_fm��"�G �"�7ۄQ$�"8'_�u��W����I�z:`T<���#�����8��t�Q�@$I�#K�NNNؾt�	�;�^�c�:��d{��-�}�f���t�Ћ�C߯G�4q��11�^����a�sN{����8?��*�j'��,�
,La�톶<�[�q%.��(�T�+p���^�V]-yAW��s����~�g����k���z��Z@:0��
��Z���
k��%�"o��Q̧��bDM��,�c�W�У⩾��t2Wtl�<�P{����y&پ g�G��IĚ�2��/��—vŵ��k'�g7]@!ήL��9gn���S�3���ʉ��Y��Q�h.��J�k��D����h�{��.ZWt�����A(�,�͂�.�:+���ڼ�3��Ŗ��Q��K����Y��+�{���]�l�
��>̓�֢��5�WWq^`'�m��l,F?0$�@�w	��Mq�C0"�|'�2\(SvK�M#ܾ<#@WF���[��1ΐ|�����3��V��)��j%\Ϫ�.��k���J2��_�mUu��'�I�<�@������r�J�p	Q�e��9
Wz���^~����7��ÒQ�*���N�r�d�J�`��>
)Ǫ3)q��*�uKz��0��	y��"�!�.�v���6])$�}��뫓O�-X6k���l��n��6S�tc��#�Yw^�Cۓ��
4�$�ג�®E�i�hR���H�����T�x[�Vk��*�s���m�א��k���*�A��R��\�hw	_�$^�%�ۊ^��>'��V�l��]�"Q��k�Ye@��s��y�u%K1t~�})�
��T1S�*�.n	��Kd�]�CX��x#�m�b@
�����隕�O�8!��Y�`9^[7kE=�����!k���svzA�c�TŢ�x�V�}��Bn!/�
6B�"�X�li/�&�0�*��ٴ$V�L�A�ַ�`Q�d��Y�K\4+,�H��l�/�/�����t����]�F):�:�ڍ.�hX(�h�'�p��n��=96v.h�ѯN�MY8����q>�X51���A�
����uO���,������n��UBA���_���h4I��J�_�SReok��ff���38fc&��8�h�	�)5EH?��_W�V"j����-BѲjh��X@��t��~�ۄ)��p>%�ٰ�*m��{:�Cf�x6;&��F6��պg��޻
�ġ��=]=�n�H�Y�o�[[���Nm��$3^
��(l���G�(vO�q�bܠ>Q_$NӵԚ.#��f ��G��F����1^t��>�r�� L�:/�- ��y�~K�F6��d���^H�`�ao�d�GF�o�e�y����k��?�Q��4h
�C��C}rat�U��V���h��
=�m���Ґ�EB=a�Rs��"U�����(�m[�:W9}i(��a��RJ�V��r	�<�Q�J_w���N����?�A
�BW��{x}���qD�;����;k�$���l�l�+R��:1fS�����L���b�)����0����$�J=[�*���T�3jw�鮙R�0��Oj>J�,�@&�y?M�n�75i���[��f���MK��b�o��45(��
���Q!��[DT�DhW�N��);�����!׆�����u��R������F
���#�s|"����#I��RFR8���@�O�3i�$-ޱm����\3b΁�ڏYAƵ
\G����PK/WUWpip/_vendor/truststore/py.typedPK/WUWO� (j
pip/_vendor/urllib3/__init__.py�V�o�6���⠢�]xJ�
�`���&m�����ۇah�ls�D���h��/K�cE�!��~��=��i���N�p�Z-A�b��7;0;���A�
B!��I��R�z;�
H�6�ۦ��L�ը`�8֥�&��*�0I��F�
�|ӚVa�������5�{:I^�-(q�Za@�햬����	l/y	�B���e
�j��Y��r$�w%"��E+ĕ�K�@����4�|�J�\�<2�<H��r6�o�'K:�8��Cf��[��U"ۤ��G��B��W�+�0e�TU���|�j��4k�gM`��}w�K=4�P7;��	� �.H�k��g��|GD�93TaA���S�+��d�ɡ9O�h�%��l6����%�>���r������-������3}�I.2��D��ʹ������S]��C֢#qJ(�Mj��`��bJ���k*�����[^g�nq
;c==?�R�k*��<h�s�)Q�o~��uB�O�_)���&xox�k�okj'"k��M��ϯL|uµӿTJ*�0�=yl�1r,�Kςſ�ſ�ۤ��(,�
�v�A���/�Ax
|gӱϯ��&��誙�@�.�.�!�%/�5��[���E�Z�Oq/�
+��Q��x�8I�4M���T���R�a��5��M�ؿ��h�)�	^ ��W�t���� �p*X3B8��}�x�p�'&B<��5h�!B���s���V�de�kC��r;{�'�P<�&`k�y���v E�ش�Ή�;�Cĥ�
�:#����Q�׬���3
 ���`��Ƥ��&�G�|D̋�߿��F����BѸݢ�k˩p:c������X]�;��<r_4nZaN���[IMѪZ;�����ؿ���đ���R!�i	5b���u�Hy�kn�<k:{Br�1?�N5�	h9m��;	�8%uf��m�Z��R�Qay||T��sN0F�K��kt"�i4�D�1�Z�B�I_��.�Zkx���sT�Z�c�����̜�ɏǣ�����S|�<�
��SxIE��+w�Q8��)�2xKs���ɨ$��{�$�4\C/ٗ���U�j���4k�"r����l�ܬ���A��0W�ݼ][z'[Q�g�ԧ��5N������1U����5
�>hD���B����8��ܹ��G]إ���x�3��¨%`&�Ӱ�4�7���C.K�HӪ�c�^�rؿ�����l�Z[����0J{o���K�ma�Dx�|p���yq]�����!�QJ���}I����-<�����bCW���<��3��iq���%��)��y�>��pX�C����ʮ������n���՟�ǿ�(���8�PK/WUW?r
;*#pip/_vendor/urllib3/_collections.py�Zmo�8��_A8(,wm���@��no���m�C.ph�N��%U������II��8��Cb[���3�7U�e�զ�u%V+&�eQi�ת�j-V��ٙ��g�
-H�,��E�b�N�U?��\k�΄�|&�(5{g�~�����P}W	��f�ǟ��~l3��ه��MQm�����R8���muf�'W���+XJ�ZT�U�D��u�Ub�Y�� ���3����R�w;��x�+��5O�G��=d��U**�~/�b��O�.�&2�:��Q�؊ߊ�F�C�I�����ދ���wFdH�Z�,C�,���H`���e�k.sQM�l������$��ʬ~������P'��+g�1&Q�~g��db����L�w^\(�,�^�L���a�;�ܱ->���%Ӆars��%�77��$�L�bO����O�e�+�����r�kq,��,�qpQ�o������ ����v
��
��������W$m�)��,�@��I�� ��
�srԖI�����.Y<��ە77>��w[`y�4f�o(>��.���>1oZ�]f
~��K
�{Iጳ|�b����ȅ�D�5x�w�s�h��g=N]x,�7��̀:C%����.��UA�	}��^ �R�\@�P�KeK���k���-y
9�2����R�u����8|�W+.�2"i�����Xt�����k���Ι��N&x�����'i�2](%���2�9H��^��4Ŷ�`a˾-���jdy�I���x�6lO5&ͧډ��%��V��iv�w�|�*�cg�
k�
3U�x��ٵ��yN�]|t:�1��<��2c�ü	�M��1�c�C,�\��^����4�{�|!rEM�m=p1�@P���A��";�o���n6ON*��CI�!N8%�˹1?�s�T\*H�|l�A?Q���VsS`
t
��zӃ�Ωs"�kѠ#��x�r�dI���hx�QYYHBQ�ˡ�X�b �s�/���C}RgɐqQI;����<��"H�N�a2=��LL4��Ceb���A�;C�)�Ɣ��R��H���z�e�b�rT-�e'�֙�;K�r�Jl�#�&�ۡ�%\َ�+���"��=�n}i�TR��l(	�OiB7��f�e�u��޸�jz��\�tQQu%�1k9���taݐB*l'�!Y�q&y��[����K�ݫo_Ĭ�����(�-Ö�"�#YO,����N�_�ss�jh��P�`R~_�[e�I;sݨ�ė�g�;X�
�sd�J����D���[��q��|�#r�ag���hV��=������h�x�4��1��%gYQ�N[��0��F�~c��C
���/'&��^���mHs׉��%��:�\F�hP�VXX����Bi'��ׯ�C���OB�F�OB/.��^��M7E�\�j�1��HZ�5�c��>��WS
|���˭��ƙ~7�}��s���<mD����pե��nW:��|0�����s[|�_��C��M���-�^н7�xt(��c2!	z�z�g��ˑ#���8{�@��"$׬���z`�8���p����g�����p``4�=�>�8�j�\wx�6�S�>&�����z��C�;puث��_���r;
�+'���JT���O|i9�*��Υ(��P̛㰙)6Dr�׺j�OLf���`�Ƿ�S)Kzl�s��#�Kf}P�������iZ�x�ڄp�VT�"�f3�\�U��'X��c�t��Ń6v’���C�Jg�FJ��|e�
����UgC��`�^�͓��E�#��qѮ0�au��u:���p���h���(�i��h�f�9�FB<v0�=G�h��/�h��J��h���4���v5O�gl����{$��I�=�3��b���y�������o
�s�A�-�7�p!w1�����hF*CH�V��z��(����h(0�/��i��p	���h��J�Yc��@apRu4�C�a����Ł�{�D�Af�hjX���@��)i+��;�"�t�ud�a{���gsH���#��<��LfsYguv?cձ:�Xt[�gS�C�<ށ!ƴ�W�hY�>����m�FX����C'�e\s�f`=����Z�n��f�
�"���'��f���IJ�n�!��E�o���q�+ˆ��2�.NG6X�*i���>�H�2�fz���tY��"��Z1~�Y���g%"��cС#6�/��b]n�~%Zr��b�[�,֊�
	��,X�����]@8�fc�9a�Q���]@,�^����1Ϗ�5Ӡn]a�>l�M�K�@)s���#;�S�;�&�z�|{X��h��b�dv6G�)���5{��,��3�9�2���fL�{�5�b�b/ɻ�1�d���^%������>��t�u�J���S�������S9b��!�:97��b=D;���J��
Q[S��8*Ax�ۺ����)��
�L����H�Q���7߈���I
��t�llbƣ�x�%:&sz�d��Ѵ+���R��Hۚ��t�zEj�=b֮�;�lK}�L��< �7��4��Oα�?R!��#��j��?��n�h.��8g�	�]֜Gi����ƘwZ��\J����w���"�C��H��z�ֱ=m��W�Ft���c�|%ʱ�7?S�35��g,�6��"e���qk8���Bwh1>A��v��y���2�L;:$‘pξ/(Vsa���;s�Z��7����M�bH�'�p\�o��w�[�M�dE.x>�{6�ʆ�ۥ+񽭐���Xػ

w�r�~��'Ym���!œ �=��>�f�A56t[0��C�z��du�)-ꉘ0�Z}��_�o����ԩӨ��6�\qk�jnn�P�H[f<+W��$3P�ߊ���i�aMY2�Ǽ�k*\å����Z�W�w�GD�fJN�%|���;{q ,J1��n[���ld"͵v�>�%c�[+��?����rw����YI�u�~+��u����������Z�6E�˼�*kKv41����t������KN�xpaF/���
�J+���"�T:w27ʻ3�o�X�5�O�Z`o=������M=�PI%��w:C�������L�O�Ư�8w�<5yF8���lc��dW�R6��lP�$��E�iQ���0��^s|�:ehG��wlñ�yM,s��l�CA.�3E���e8|;~`O/+.ۑx��z��{N���!0��ER%�h6�^MH��O	İL��:�\ �_��������� n;��.%�PK/WUW�Ǭ@@pip/_vendor/urllib3/_version.pySV��,VH��IU�E�%��%�)
e��
�.���~�A�\��e�Eř�y��
�
J�zFfz��J\PK/WUW�Q;FLO!pip/_vendor/urllib3/connection.py�<�w�6���@�˙je�s�R����յ��Ҽ�l��HHbM�,AZ����)'��{w?T�)���Ve�eA�����A��m���"O��`����U��{���I��_s��ʦ�ȣ[^�o���`���|����K
vM�s���	���
��/��6\s�����Ƈ&��Ӧ�� J�5�_-�O�,�Q���	�φ6�񂀱,�
'����O��JR�(�{=&*90:��@�4���`�U�� ��|[$)��.�6���=c��7���Xɦ���ND1��Pۘͪ�L����}D�^�a����(x���h�.r��
�/�K�Q
aa��KÃф�ᧀ�9)j\�jlz66�
ÿ�y1f;~Tr�1��6�`U9��-�d�%��0cK���cIa�r�N���@�����Ĝ��G�eMJA���M����uRp=5��;5s^k���L
.�e�J^S�_�0��iUZޙ��2��t��%fI�4�;^
T(�
A�zpMO��3�WY)����Ւ���Gh��r�4I��^T|���摡��wg��W���jL_^Ͼ9����1�\[A:��l���e�/�2�*I�2u����V�.AR���\�Oyzǃa��'��*^����2,iW�)�۰�6�&J������<���o0"������9<��|��!K0kц�)�y�Vs8a/�=��_���g$�9h�~ԏ�@O$��.Lk�V:�D'�����4,�<�(��,��K`Ȣt@ �*LR w��6@�?�-�}#@�q�ɨ.K����\�O���t���<�o��{����1{�Ü��ˋ�����.σ�W���
��܏�1�����?��ї_��n��_�����9;���C�3��j{#��Nc��x+���+��ׄ�Ln�Ӿ�U�
ᆁ`�}��v��Q�EU�(2�\���c�AX%K`d�gi��%���qX�<c@b��<I�#|izf`�g��[���e���R�IJ�^#ݰ �}��k4��I	\lZ��vig�
n�J�(�c�L�1���ɀ�����k.�7Σz	�Y�R�跈�<O�����z^���J,a�o�z�@�,�r'#������v�L�#��΀��=�賳yT5��c�)��UX���w����Y��{������&�6�ǂʼn��U
�E�N� H���͖y��������t~>���P�,E�ث�j���(d)�a�%p��E��,Y�}^CP$6T�rD¾�`�4���vB%u��j�P�M֛��D��}�)����?���Dy�xG�I�b_�w��xj���2\_�|7_�Y�|7������0Gc2nG�׈/KIp���:#�%�ϭɱ垦�b�:�-PW�/3��k������o����\�����4ފ�v�w�+P�����^]..X�f�p�ԁ6� ��S�Y�����J�L����"E]�&j=�����/�T�~�2�7�{ �h�F6"�O�Ӏ:Xeb`�np�DOI�TAZ����˰\������e }y���K&ow~��P����ZQ������e�b��@&����Z/�&�	[����O���F1��8��Uk���2��!ccS���H5l�^;�{�$:\��w6	RZ����k ��;B5wΉ�{$E��+@��p�tRwC�t���oy������e�Ff]�h\m�B���$ۍ�ɘ���=��[��2��/1������9yvTiD�Ld
Y��N��Ou�J=�s�)�S�RmjA�r��C��P�(ْ��m)D��nj
p�yH=_�$eāι�Hh���X�Cw���8�J�4���:�DrA3x�*�q�5��L��O`�bc��xN/�e&Q#y�.6�<���CK��-���QY	�
|W&�N\�ֹ�$ ˜ހOE���e$���R�6��X�v>�\�
��l�Ӽ���ǂ�l��C@EaZ�����k!ɖ�͹y�����H�!W��0NFK����
䒢�o�Q���-Y<XH�#8Љ�
\���b�jhɫ�̤	�LP
�h�������sW��2�:`����
�aږr��7Qk� ��p�-դ!�
���0�n�o$�(!�H�T*2du��`(Wy��#DHN�a�^x��i�c�N�~��\�Kl0|/�9h~�9oV:��\[�]jA&$Q�����z���4�8�GN?ٔ��;L�1c�Gm�z�;�k�ǚbw��� C����lo�7uC�A� ���Ҷxv��0���S�v4#��
��5�û�j�U��i�梧fե����:4jӠ�eUR�L��f���Ӈb4�x�&m�W��?ifs]��}����̍
_�TŶl`��c'0�!������0���s���R�*��m�C��fE���{LW�I�s��p�a
I���Y4J�&ͮv�Ed%/ Pm
���52�D��M����Ux�����2��dUB�Ya�=E����:��ip8(���N�J����,�-�����>n��@�k��Y��XU'
�9J�lu�\��J��a�`�lSm�lN�r�G�$��.y�B˶h�b'��%Ë�7%�3��N��W��Lߑ�*x��L�]�j�ʯ����E_�A��62%��i���h��{IVf��X���6ώ+�M�	K�[0d}X2oE�8��nM��H/
��!�*���#��&2��Ԗ�lh�B
�_�+����B�ϐ�x��h��XԪ�3�cө�Y@��m|����3�{Ik�s���x�	��<�هXƏFD* ��V|��Z(�����K��N�����������Vo�����-�C�h4��.�=����-�杠o�x��P�!�T�ԑh6�������B�`������!P>�e̒c��7��� H��8W�L���R�.I�,_n�aj��K��BC�
�:��]��l���j/7,y3k������QO~�{�2LC,����WC-��#۷�X�F�bq�;�w�7uFP1��灮� ƀ0�Υ�L�s�V�C5��
��
���#�A���[�_%����`m3pw\W��|�aS��2eDV���d���b<��X��ci�P�9��w/���ڔ%��� �^y�>}I��r�AH�;AC�
eӱn��	�=^�mC����,��)�TY��GӴ�qܢ�6O
܏*�Ae�%h}�)��Â��C~k�"m]�{?� iv#L�5؞�K�X=��|�t�\��Du�� ܊p�6$�m)�t�|վ�$� ��U5}ż����C��R�h��C�L��o�Š�!��}w��;�W�-~00K��j�LP����z(%hD�T��i!�7��Ջ�3 ��3Y�|�F�wO'�;�! �:%²������8�`����߳n�at!������S���lUqY��F)&c��a���mB�xË�".�w9|��	���ml��>�����j���&W �3�gO���I+Oal__�<UMZ�ȅ�O��dUgQ�
�1���|���������E�!�h�k��m��l7�����c7��*A���R�{{����m��J+�7��t�M�=  �Ns$	�cw\;<!ἒ[tN����������of�����"X�}?�|�0���]���q�bBE_Fc���-&YuB��5��ϸ�ڨ�5�P��h�ᖗz�;4<D����04;��QӖ/�es��f3�b�ŴWZ�t5��~[���(�����6*R��h�Ҷ��ES�G�^�L���w>��x˙��<������ʣ<�����s��H���gJq��.��
8�J�HeW����9�L���@�0j5b��i,s�%.T�҉���y��J�\�.9��èb�fyǏ�T̯���oή���O*r��I�%���R�pK���VE��$}��Z-ں1US�74�`f	GS�oG��n��꜎���̨�X��_iw���NKowۣuz[�<bƗ����?�sO��BP��v?�r�t��׏։�1B�0�:S�eW��~_iٲ�j��u�M�`���H���D]y>H�b
�s�&\m+t�^��EY�KV���
<�������(�3��/�I��CR���Ђ�Q(��=]�U����AWޓN����G�lW�
�C�&A��6f��zO��Zt�(��|�rO%�UC�5b�͌��&i�`�
}q�LJ�M���q(���c�0AH���)w���_F����xϺ��K!�����.���W��3�;�n���������[�xt�D�mS�W�c�N651w~ dq��Mm^6�ɬ�S�c���jWl���›�z���=[�mr5�k�5�UC��x��m�zxcڈΝ��]� �70pP�˾(�(yx8�]^7��cU�	&���g��ۼ��`���m��N0O{���?�eU�l~�9M�g[ou��ɟ�	ݫ۫Gt:}6��-}5�X��F�:�8?� �1��)��l�`�=�-$]Qbxv��i��6;�q@��X��ۇ�w���d��pcG��<��t6�}�v���a´}l�X�y�t��B�`�(P;fƍ�v �����,��	f-զ�w,d��(����.c��2:�vXq>E�]C�
�A�o�^�q*�-Xܠ�q�y��C�*�՜��ғ�x��_�U"��G���i{�M�8	yc�I�X򿐵��t�@�»{�?������a ����ԍEy��<C&�&QR��Ht�>4=�$cI��}��l���t#ڱv�&{I��7I�ּ*8/���L��#���>^vO�&i�O��oc��l_ȋ�T����w���rn�7�\n��'��MOU�j�*�cIo7�?k��xEEs:؁b�����aH�C�yWg7�c�9ȳ)
⒎�p�]�hZh�x�i��Kp��	�����3�
1�<a'	���Ek�;�F�
Յ�R*���~� ৿?C�'�O��Ѧ���͘����A�8���u8,<����L@�w���WW�=�̅��E`�l��K0��.�e}��Ab�3{��=}�䅪tR
s����H��ە���5,��GϿ���� �1�I�
4ԩ�^�nj��#��{�[������2��?���ne����VDW�A����d�n�@{'ݪE�3`�.�K��jTW�R�v�����fJWF�\{a;7j:�lZ�Z�٥7A��6�f�l�\ji
�+c�@�s�'3�ywׁe݈����K��{��E���k�o�-�ˎ;�N�iS�K�MK;?��N,���f���7`�?H�'.w�d0��#v�0��5�Jz.��	�,6@Y�Ny!�*t��į˚��d0O]z��	�7:QR'2:��`��{�#��z~z��=�����Ї4�ވF;B�kU��)���x��m����.Y]�
��9���h�q�F��H���O��4�g����#��u�C����b�삺еy-R^>�A��_a̡�-4�|u�~�^U7�A��3^���p�2n���=�O�9�Ww��ߥq.&���W&�6�i�i�%�=['�/!�&&��ds��n���R��ݽ�{P�o��9(�<���~V��Qe%���<*��(�����6���@�S��OE��?@�(c�Z�@"�V:P*9�i(�Xy��Q'}���n��i7��kި�j`��BH��M퐓T_��gꇪ�O�T�s��<��/��x� ��Kw��2�7PK/WUW�'�;+6�%pip/_vendor/urllib3/connectionpool.py�}ks�ؕ�w�
U.�^
��$ݣuʱ�ݪ�Ck�q�zzI������d&���{^�
��'յ��"��s_�9X6�:�͖}�7j6K���n�$�n��Ԍ���u�4U���jUT+��Q�[[/nUg~m[��>k*x��[b��,���&���.��ϡv]�Vu�ٖW|a�����Ԣ+�J?1�K��U��o4���.��r.�����+�/�xuu1t���Bm�K�a�?��X*���]og��F��to"�Pp�O�UY�*������z�m�k?�,W�Eִ����^�d�J����U@��/�j�O�M|�M��p$���]�����k�Υw��Nй~��]����>��~���F:W������d��l��B����N
��u}g�,{%����%K�Vu7uޚ6��B�F���4黢����ً���7���lp!tk�)��~g7]��u=�(��h
��7Ų��Μ�E0�Vu�eQ�٦n��o�O0k[�yCX4�0����5��ݶ-g�[��nߪlm��p��s�)}���>�N��)�ݏM9Mf�ZԹ�uY�R�ZΪ�Yge�WE�A��_��@����fpko&z�$��E�uK�r�n�'t�\le���&x*�m�r���؅�:ON��T_�ミ�캦��e����s��5|�!�iԭ?6s}o�s���eLʗ�����u��),�����l��;�M��f��2�����4��=8P&���-J@��R	�9曓��h42�:��Kde� �u�N��_���'�d���{�'Y��
.�)�Q�rt�ǂ�k��QoT5�$y��:�L	s�����CF̄3�����o
s�&}��=`�2��}��¹�S
A��g�������?5�G_���^��+EW�@�*[�f����d��*��lܪr9M��S01���Yc{?MV����b<zWS�D0W��h�g��S���1��rJ
���zFTt&@�OZ���A;Z�ӄE;�kd��<��M����4��'��Ǔf2J�$�n�Q�P�O��Nfj{��}�&�ݽ�U��ggO�6̰S�v��r�ځC�.PJp澏����E]
��ve�f����L�����#��9�K�Сœ�r��t�ͮK̍�&� �
X""W7pb�_���ƴ�����*�L�fu���G�鎾ɲ�����z���Mq}Ē$��/�����캄@�f$���}K�^����4�_��|�o޿�Ͽ�h�(�Tf��D@߮nஇm�T!a#���1�W��P��JsHGrz��5�a9D+�t�&#�hV�ãɔV�)��6�4q�U*#B:�G��mGr�'�#AB�{��
`/��33"Kc`d_?"8���ӫ�#�/����7EE���V�H��Z���x�!م&���@j�u��Ď��gH��c��tm�� ����mr_7�p
*�S>4}tW�X
���_&�,xV��bU �̙��U�wE�g.��a�(X�,Y�u���"(���@mi�uO�*�1E�թ��L��
��Zs]�u&\�/Xb1q.��
��&kX�u��m��u
%�i��,�j����
��Ec��Zg�@�A����/+�-bɎ����:����{�__C�0Y�`Ҷ�KXXXoBa��-M��4�F�[��9I�d��#jsٿ'
=_&�9���m�H��S����@�a�H�Sq��|����́�-��oz4xo-h v%`p2�����T5���:������F�(����M�O7�5@Z6J�,	 gwYQ"S���#�b�82�^YD�hn�U���E3�L�ym�Z.�D|�ŁF��ˬٹS��
Ƈ��H���O�������7E!Y��6��C�G��Q����}��g�>YT������@���a��J����k4ZX<��F�ϛ�X]��{E��PN��V��Ūoh)􌯷(���Aу@|���"��eD�c��MX����
l7u_��	�rP�0�)�!��u*"��U�mV���z�E+����ɚ-O�$
�s���bP��_O�"��n��9������H����3��D�9�!`qӝ�<�fsC�w�7#�,R��X�� v&6t�Ǝ�B�Tm�O�=�ZG��X9e:j&3�Sa���_~|s5�:{���m(����^"
	:�c\e��8�#7�����G��J��9䮌=�C�E^`4T�{W�Ӣ�h3�U�js��WZ�(r�裡[�H���N<���H�qQXn�2��{�v*���|'ᔿk�~,H(��7Ж9X�ͩl�=�������>�c�}�ێ��"{ef�Iښ嚼F�V��$Aj�0_����J;L�gH��Be���Y�t�w��L�\�(�Rd�-PT�Hq$����L^ɦo6�Ҷ�?�_�\&{�<��ݕc7�rQ�.�?���"�]�*�����汦	��5S���]
ZA�Z6�j
l�Xi��D���۪�ת�|}�,G�D3]q��l,��ޛ��)3���>���h�d�)�{�x�=̤��4��gg��G�2�~������=����uMdu��[�>�"�Yq��� ��e��A�C~~���U�$4��^��A|������q@�a���oy����K�
I���E���լU�\��*K�:���a�y]��D�}���_8����.�5�h��s8�ʎ�Z-Y�W��ME�&���tP}�O��l�32SͰ?��Ni�U�R���!���в@��gI�:M�M��^�Dl�Ҏ.;T`�a��';j�I>9I��'O���t8�—d�e2�!}�́�?��Q���ѓ�tGG$6��{ZRr��g����f����O���ߙ��&fNl����^L͸����?U�<ɧ��$A����O�bF�t�A�x4wk���@�x2gfO��|N��|N�,�k�&!��}+�3�8~v���s)�! �Y�铼b
�ohLh`C���`(�[ks껰��@�!�F�>��y��`��
���Z�V�Ip@���o+QYT�E��<+���苎d���x�y���>��H��u�'����w�8j�_	r?<�-��� ��~��qA[n",FV����N|Z�|�
P�����d=4#��4��˔Η�F�V��4~�G�	�9� �
X}^�r�5K�U�&5���@��}��ꈚK{gH�G��hae�֑!�f�l�7�J�w�}��x�����c�bq1�W�qc�Z���p\���)���+$Ҡ1U&c� N�`�2�0�u2�oi׉
�T6����y��#c�a�.�����ιt�izBB�(��*$���_w�"B��/��A���X:��0�9\��5��@����8YsU����H\���he����$�n�'0�ў�E�8Ng���VP�G�r>�x�ɨt���3^��K1w��4lK�9	��`�H=0�a��_y���b|��C��N5[ 8p�a�9�r[�4������]�Qf�Þ���k[��#�(P���A#&�{1c9X���8%����S�4	�!H	�fb��ߞ� ���o⺿�y�H�aSN�1��x��ǂ�!ɖ�����#i�+`���M��1�Tf|R���,W�$3.)�j��C�s3�
��p�*3<�}�1�ZX��&�(��#��GD!_V����*74`/�.�s�|�A�;7���Mt�Qd���V�(��}k��-�1�o����h<�p߲7�;"ۢu�:#��zQ�7YW\e�m�<��ج<)a���1~єI{F�_�k�i�I��ur���sf����z�᭸��ߋ���%nd'H�r#~�	4/�7���Ƅ��CSak]��$�F_@�IK�<ބJ��K�1+�5�n��L��F<�{rn���/o�;��	�E\`�$JHȯ��������ʁ�F�-ۈ�UF,}���~�p�@�_ג��Io�-P�u!��E{_��`�5ʖ��h���΀Y��*��R�nV��Wy�ꀖb�K%��֍+*ڶW�Ϟ��]��Y��M�NL�v���]*�Sh�&����5Jp�'#�$��o��J����:�Uڤ�������	ɩ�Өk�խ�ŝ�<}�k$_�+y�j0�a�5ZV�ɜ0�pA������w���=���T����a\�#�(�� ��l�
��x@v�ڐ�K�(3`��6׋@��#Z�l���
9����-<�F�x�9��e�t8DV��<ld5���Z�^�Bx<�Űȁ��Z�w�>I���Qm]ީ��3�>d`��S@�`7)<S}�	=��{��ٵ�_����Pm{w��L��F���9���i)y�h�B7)H�m=|p	��SED�4�HN݅����]Lj�	ք�6�g�x��N5W���Xm��9J�m-�.b�)����0��y`�P�`��iܡϤ��#�C��_�X2
!?����e�ޓ5� �*K�����$a�����T��0�H
	�ETzV�ZU���hL���:�>a �0y��
 S��U��l^1;6�g9߃�L.>
Nڇ�)����t��y��:[��<zST��-(�9��������V��_[�s��/>��z�'x&\�ɦ�����D ���.�ݹ�Ӣ>!ru���o�������(�1����<,�C�*?�MD�a�~>�UM��C�}"���6��o�:�[�^��
���a
wq�L��A�x��)w̐Y>�l�%��-����MrV�
	��(dT�6�F=�?��b��4	<S٪ /�����߆5H
վG�0��q�,���|�Ő�F�n]:+@Nb�4�Ȃxm�$BU�[bp,�;�/�Z��A�9��D.`�; ����yC�()��jj�
b��O�GhQ�G�A��c{�|�p��]-r*x���#hm_A,K��!�ƺ����7&��MQ�SeI�������?�D�e{��o��n�]`�&��)����%�L��O�h���i�`e0���/�
�S�����j;ȓ��n
�籣��0�K��wf�^���>�����L��=���	\	lx~ɘC�q�)_�벸U�����s�M���c��}AVߤ��[y4�M]�̻�ْ,��,�J���H�S7�}H�z�?
.�����<w�,��Nc�N��iȉ8a���0�X҈�e~?�c��r���f��������@��Ι�n<��_�׻�+�]pg�q�Kʉ@_hT�j����D's0
{�\���*��F(v�Q��ev�m�#�(Y)���0F��gf�M@c|`7��x���Z�D#C��#��P��c��gֺɺ�8A�#ޏ�Q�a�S�D�N	dJy��V"��&u��C�
�*���b�����4��|�N�(0�/��������7�};�ɢ����S����kau��J��p��+N�ʀ8�L,cB��P��,@��o��h�"���1��L�uMA�_�?�����J���ΊV8��-[ q��z4O;�r�Z�*�c���hcʣr�%Mۙ��V��Hl�A���hѾ�IZ��Y4n:�-�LT�8y޶�
Er��㪔�,x�`���(�x�),g��/$�����I	8���0�7H�ԑFq�Q@c�7�܎���d7�������|��77�h%�h"�gB�iQ��F\���KT�\��mp:Ju�J� D���x,(`4k�bӦ\f�[$�vQa��:��`����o9�n��+�Y�07`�a�M��r�=G�cUPx��:��]��6x��M�?Qgnjo�#��p&�t����8^��)~?o(�λ���A�E׀�$�j��#�H4�>�Q\aM���vt�l)�f���� \ӎ�p��%^d�h�ؤwa�W����ir�����n�N"�p�}�W0��ސ&x�%L�a��κ�s�\3e
[�h
J����> ��u��T;��1tu�!��������X�G{�!ia^޴3�(���n�)�LԷ]mZ�)Y���×+�MyPΗ�HOߢ���]�Dc�0�魜�
��
��)�H?����:O�kpԥ��u�x�Q�,~^I�,ˀ�� �yd���zm�����w�³�Z_s�&�g�\`��|��R�Ac!'L��O��DEwᇾ0[r*�q��ʡ�~9�bI�,@@	j��I�9p��S�r��8���8�i���L-P�07��%'����3�'��Ƴ��1���{+�x�8ȑ=�چ��T�·סּ��qI��e[��fZ�~�7�tkQ��0�ܲ6�9�^�+a���=�E	��y����k�0.z
�mn2L����U<���&/�O��<_<{�W���������0_Ԁ��
屋
���39]p�@Z}�`0k��'J[�$u�Ô�"�2�H��!�k'��&��ª"O�`�6�+,(��c�V�O�Z���5D��T�%0wA�T�*�����B��Ԕ{S�X�!Se_8>�u�u��md������J��
��Z��� dFk�}�HQ� p�|D��8���H�8�;a"g��ᄉ�D$��DT@�(}�@J�+�Es�Cn�E�qJqp~)������^.Eb'>�7x�d��\`���0��w]��΂g��g�@����H�#;���W�� ��
�]n���O���e%c��1�7��%�	�E]��F��S��,�#9��G�㐂=Y����`��D�'��4Fa�J%G��^{bx�x�5Y�.��Z*��&�-xH�.U�#��gs��`<�k`L�ZS�'�",��y�y^HYO�r�-kq�h�Q���+�*��@b�F)���e����=��	���_�r��?���M��K�B����bu���R"�֝O�DI�!<"~�@8^Z��s�\`�T5��h_�uA}ZN(Vkfʔ����E@k�`�2k�0���>T�B��)W���^�
�5�}�X|�P"���-P�ŰTd���iq��'}��t�~LF[*��t
G�2H���¾=�F5(،�z<],��W�s߫'ˑ)����H�ڝ�2
3���QQ��T�eoiN%"�p�׳gG�L�HD��4�9�n�趺����-�y��,ȑ�G
V�n��~��L`� a1Z������bh$
�H(�vd��i�~���J�+S�.âYh[:��F	�*g8��S
Z��ݙ
��1b�0A��W�x��k5	4ZR�	��;�1�bГ���8��g��ap�l�:�K¸��H���Kp�#��]d��}���ޢ�S�Z��%r�R־�ߘ:ߥ�t�����C�V�y�)�ƌ��sӄ���3ר|���٫+Lp��-E�z�e�I�0�O,�D<�jM'�W�^z���DV���8Q!�����(�٦!uZ�]lB��VO�n��+�P�?4�T]2�.保��c0Pm�|�l��
�\R��NJ a�`V8��˦�B�Ic!R�QS#�	@M�d,��rg������bJ��y-$����*z�x���a9�p�u_������O���p�!Hu��L_S�݂ S��p����3�#1�ǵHH2BP�}�&[��x�}]�k�O��K}5�k��i1�"�Ȇ�	�JjP�'� ����J�bK<p�}��4��k���1��^�(�.����yƏ�n�for�oo���[��h�4'��8��]'�xK]
��OZ����ne܈<����-����1��P���um�ŸU-ܰ���|.T�D�e`��C���DU����
3��K�Q�jm��$g�+cH�V^�@��Il
╏F �’�ҵ��-"�>if�d�;�탉��&��M�Ks��CŹ�k�W��ֱ݃�셎<���to�����T�����R���)v�O�5�[j��V͢��["�v��#CYa������er~ �pS�>r��E�(�zЩN�|�A
{L����I,�2C�Z�A�:*�k�pF^�?N��c�-7��{�@��%ʼnLy͵B%�
��N�Psa(���o��R�;�gO��w+���Cv����_3$=ي�eY)����$愘v�tȞ�Q�:J�l-�|����?�}�<�n����?�}8@'�<��l6��g�F�BBV�Β�PP�2Qp�a|�E3� `H��3�n�:�=�����Q�g�<�F�-�n<��d��K�0bWH��bGd븣�~F�M
��wٽII�z����Bڹ�vD`#Jsœ�
�$"�kIr�S�
Q�(��n_| ���m
T%�쌭s ���q����̓ӈL�w�o����'�ۛ�9֝*��^<+8%C�P��[� Ⱦ��b;*\�ۏ;lj6Iػa�۩6mJ	�v�=0p���{�v���c�v�a�&fB-��(>����s#��Z�#h��i�d��n��p��z�bF������K?c.�_~��b�7ݺ�r�`�Xi��
_�ƏFش/�J��F��~�A�\&;����=�Lq�5p�I��_D��+���ѩf=b¯���w����c����MGe����RsJU��$H��^�-m<fo̬���`�[4o��vۦ:�}<���(���Tj3�ȱo4��[l&#���[a��5����^A`�}'7H�����8#bI@F�ܧ��)�1�����&	�g[�&��h.E�:N��q�>����`L[�){29MWB,��؈bGFq�Zo�)�\J$a���r�0C|��2�b�/��VE
��"�4ѥ��w�H=6/&`�Y�;a����k��X��J����pQ
S�W�����Qtɿ����7Ze�Ud�=�	Cn5��m(k�]GJ���ڃ'́�}4�7]����nj[Eq��UF�M+;�ҡ�/�e��E�ECаB=��É#w|�yH�
E��/��J�~�s�{sK_����<b(V��Q�F�Z��܍�vD��|5��^<{S1�|����ȧ#�I��C�����S]�Pĸg�^��$��P<��,B����<�`�,���\���d���p�q�~r�SC�g���I�~��C�5�_�nD�)*�۶�!|��������̶{SO�E<�sg��<u����3�W�0��4訃N8P�N�!�&m4	���{�f�}�#v����O^x"�~���Bo5�t��)l��L��%�D�b�kM�w#���r�2�ĤSL{��Sʅ ��l;��<O轝R`o>���s��
���\���=���9��y>���+��u�sǝj0�.�i{��JLr%�"�aig��L�c��|~���zGw�|��A{?��V~f3��کȕ 17A��i����{�Δ�	Ȇ1z��ɺ�O�1^��)7����IÈH��vt��8��b~�ͪ��IeO�"FpYE:�jg;����~Y���z�S�V���l�:b��B�#����Y,��e��sj��C|����̝���1zШ#���+h�:!����A����t��
r2��k�A ��'|I��8[����ژ�&�F�	~���%]�,�/%_ B�6��o� $���/�Y���4�2��AW��sq����Q��/�5���Q��K����=ZX����ho8�����&~��;WPw����Gbn*�p �s�-4����r�!R��G�",����wGK�{>�����CΝ�L�h�S�44qw>���H�/y#���OGp`B�φ�>�5.N�i��}���| ��~��Eë�|Փ�	8�5T@�t�*]:���L�6��h�Lj�!��}t�&�'H�w
�������9�P�8z�{c�,8W]�/��'�ڷ���!�[���.|-�+�������B�������*0�d��"�_L}ݯ�[{u(�ĸP����Ͻɋ��i��H�Q���/�R�o��v2�N����1ޗ�5f��Qww��nٽ�vuH-�[��ZA��X�;u:��~�W>�7=�3~
W�BÐ�ġ����ʚ��=�?0���27��'������<L틞�H4�0�6�U�+&�i(C�n�9�%��(2@����v���D�O��[r8ƄdG��JC���'��.���=x����`0��cm�Hd
��QW+,����gGՀ�s��
��ҢF�?!4�U�IZJ�>1����q�e�=��b,H�#���\�v�����=��q�*/�5
��4^�{�7��I%)�����և�T?�Cc)��]lo�;-�(�	m�
�:5�����4��O��Db���_�6��z)1I"A�G�X�s¸�r��&����*e
}���&qc���׊�qK�-eu6=��Z�ԩff@�f������I��j<
D(*�k`��iˎ1�P�'�����7��̾��;7L'D(k���Hl�}y0�nt�e�ds���F��Y��)}H���U�p�|���@io�v"�>�p*��>D'�����'���}�[r嘠�$8�
qS��H�E�}�On�o�O��C�0�	��9�s�:J�;���b;h^�"�~r�k*��at�PƏ}!*n��7��Y4�_�tż���L�/=Z�@I
CY�<@�<u_1c+	��;y�����Ai8?��p���/���Thk8�VQ�IN`<e��S�:iB�����}����ຉ�?�k�膪r����o/�~:>9<�K]<E	��i7�c�uÉ��4I��e��L��k��ٕjd���7h�E#��{��WT��t���M�Л��+�_���PK/WUW^�I��	 !pip/_vendor/urllib3/exceptions.py�Y]o�}ׯ �E	z_�:@��4'��qM�R�]rKr%�o�̐��][�CĒ�������wctƢhS�ˆ(b2˵q���N'"�{4��Y��G�vf��,�{��s.��T
����U��<N�
�0nNJ�:j��Fo��
�|�E�Vv4�)��}����4F�I5x91�7�i�(��Š�����e�N�T�`ֈ�� �%��(����ّz�O_!�֩���y�ҍ6L��bN*4(�Ybj
�؀W��.�&V��)M��LX���p�]ќj�2g֑4��sva��M�R/�ڍH�X�U
�o�W�F.�����k�PM0�Iyâ�P��)��h%��^V�݊�:`�V�,x�;��{Afu,�H�o��HfN4�o��R��
���.���`�rI��
�X'72�؆��2�AE!�b�VJĈ�P��t<K�ۉ�8�4F:��j�uS�t�O̔����mz���Le���vP������[�x�p:}V;�"b������3�d{�E��5�Q�B+���λ�:?C(M�Vg��J��0���s���d�������2؛9@�3X�i)g��@*ix�����	Pp8lt-S鎳Ѣ��2`��jص�>����n�3!��d0O�Y�1Udka���1R@[�
��d�9Ϲ��9�kcE�s�n�s�d��?p� c�6�C�K�
#+<4Y0�a���d�@&abEivV����ʯ,T"LzDi!$�КtEѡ6?N�_F�h8-02�T���R����l��e��0��I�/k�M��Sg���L��[�ڊ����O�:"U̇[�,�M�1ǿBnہ�s�D����
��`���ь��l�S3����#���J�*��d&t�V�,"A6@�A��p�d�
��΋�'���<�Ɗ�+%��f:�cÁ]p�Q��'d�B�l��9��+ȦvK��>���Jšpr[���=O?=��筵鮎I�ǔ��]$<0(S$�X�=��pᄥ7�f/�	�YPmD
q�tYaEĸs<ށ���#mѻR턑��ry����1��֦��m�̊�փ�oġ�f&=&MYO�4��/��u*�4+qh=��<M�l��yss��z�Z~H��,wǺxA�/�) A��^�]���0�5������_�"��1y���Ɩ��
���J?wЮ�̏I���k
�l�;O��1��){�*��A���h��d��V�aF�Ty�^��76�pjV��"bg8,Vf2�&�9�#@z,�IiPڟ��X�Hn��E/wk�֢��R�d�Ȁ�+8뙸W�J�ٸ�z�� T��z�cI�`�)�P�#��P�� �?:�}w+CE~� ���ZS�/��=��[Ǔ�Tp8�rP�\C�I1�S�ުck����Y�~_D��۟���p��:V��5vL�W����_{�	���#�>]]5����q�QoT�_�]�GІ��W�</��U��'����@Q*�Я��u��[�i&C]�V�oX�"�EH���#㏡�)�P#�\9�tu��>���*}��Q6$�+lh������.�ܡ�^7@
���W��j#���!}���@T������!n����9;�J����1��چ�_؉P���M�M��`(�j�m��l˫�p���9MO���������[�
�(�I���^��b!��]�I0Akdx�hx�����o��u��T��}�f�
i���omg�j�������GO�_a*��b#��[��V��X�~�^��6�����sx���k�ʝmU��Bm��X��[��Ƥ����Y� 7oTh}p��>�a��rl�N&1�݇H�N��O�kh�b��*H�����ѳ��Ba�F[_��O���ܐ�m=I��ڗ��9��7�㎃.$[���O*e+�tOP	�rui��H���lu�tм�^ a��2@(��'��Ҭ�r�4���k�Zۮ�:����Z��+�d��:
HZ���b��T�~�W���x��-d� ���r�����88q�7+z�6�2��(�/�%�Xq�a��\���.��%�gk�	���U��\A�h�C�K}DU+�b�����_~Nܻ�1D[9��9r5�m;0D��}��_��ao�AH��z�������PЅ�ĩ91��6�VK�?|���}

��Q|��k�Dw7��x^V�P�V���v�;^Z���q����\�h+;N]�_7-���&��
��ï��+�"��J�L�o�=m����L@���]�;�a���_|����ye꤯*�*�E\Y�Y�X�;7���.<Ǘ9�꽱����t>�]�/����NB?��:��)��8���"j"R���oo�2�D�y�#̺S���>�𾭿w�hL�k9h�
\��G��";�;�e��+#R%Xc�6�_xq��\���Н_y�J�/�Z//�[�Ķ�PK/WUW�(K, 
�!pip/_vendor/urllib3/fields.py�Y{o���_�b� ��ֶ|A�*�s�q$9��mP+r%1�Hw[M��ޙ}�ˇ|ɡ���˝�y��^����ẒU�Ð$�"/%a+����~��:߱$��LRa�vɎ�}�녒�FkdKݱ
��HF�Q��dSq!�(�$�d��:Iy�v|B`�R��XQ�I�d�gGy$��
Yr�����<��#r#rˉw�YN?K��k�2�#�q^���=Js�����D�Z�+�d2���|Y+���F����5��.��ed�Y<�����akM���|�5~�ڸ-��Ƿ$/�#��.iǬ�r�d��,�e��	�u4�����;�XZ�~�i�K�����hF�e1���%G��RN4o�xs	��A�؊��I�٣`I�c�d���9A�߲R&Q��2�5_W)���,�6��`��VDK2�!˳���W��:bB��NC����$\�4��f��8}��Z����[)1?:�y�
�p��y�9��]z���'BL��˰
�>h�Z�	P�h)�P?���ȳt� R��X-
p.�SC&�r��K��ᲄ�ڀ��ݙr��2ծF��,��A{�M��B�,�e������{�נ9@˺��4���*��������N�hD�~{777�M6�hcR�����Txc򔴰]��!l�)ϴ4LDI�5��C�I���.Զ����f�%�ׂ6�	�pJ���UKP�{��ٜ�'��^n��C6�R�l���e�E����7�����B�U�O�����[aȪ�φC*¡9��;��E��r����ܞo���g�v@��p��y�����󋫋7��g���n����̛�ϧ�=1�zNj�EPdn<r��-���C�\��fa2�2=!gi�RZ���9ROU���c��'�䙆�3|��	J�"��뫃?�F@����E����x��/�!��nv��dن�(�DK�9i���a.l�Q��~�e�"��.���i�.2�㔋�d�젞
JHk�K䋶A�Lbq���M�W��j'�׀j�4�w�a�ã�$��5����=�oT�б���j��29�OE��bm$w�������+��u�U�U�[jY���w(�˒�u�Ӕ�c:���-C��B��+�e��*fT�����*���hG)	�����
���@�W+��m�vAUA����Z�B�����S&�(�	�8\A��H�����r0
$�v >�U`Ҿ��`*�ge,��P`�Y%i"��q��f`��4@��A^&<��|�\ۉ�3���фqr�����x����w�k��Ϧ�B~�z�=�mN�r�M�2�v���8����ͨf��
bh;�a�qɩ�*ڌ��`�$Y"���l(�܈���m_\'&�f���TE�nsT�19�1rP�þfgf��v��1�ϗ1�̓u�C�+��&x���O
�͑���:b�&ϜMF���,��bj'vQ"*�/�@�75 �H�
�%}��u/�j_����
��o�!�������=�'�z�<�]�M\(+H<R�t
cN6�|�13�|��H����P��duJ�)���dI֐z�r��<��B��(]?m��}U�u��|9���&_w�R3j�Ch�L��#�ٛ�j=�ġ�T����ڽ^B��WWDU����\EZ�
Y�p�5+���h>��1^�xN�+V�'�7쎣���m�VJ>���=�@5ͫqС/9Kkz�����fC@�g�]�Q��b��fa�j Z�c~��DЏ�=
Ö�
\�Ec=\���p�/�솲v��5_9�3N�F`�wd� ���b½���B��?������+P�F�w���0��9���%�3��H8~��:�h;�Y�Ѽ��z��r��;��nu}W����������Ե�g&J_�4ҟ����ϟxY&�����3ѡI������-rM7�z�����;�;�=�kZ|6x�gm�Ϡ��2]�	㵦�Փ~�m�a|u�s3���ݚ1�ت�B�&v( ��0����Mn�K�����S�zNvuk�����4�g�w`+S�V�.�؅,�=V�;��Nާ��n?f�R�N�J"�׷M����X��>���-�*u3�0;���;a�nR��u����|�C�&L��t�Oa0if���G7S����
�f�|4�&:����S;��֛i�7R
ҧ0��4]'t\!^&�7�Ao����:�e�n[F�<��5���ݦ�n8�Z�uB.ԯ����uA�򜘻چ�e{m�o�.rZE�FIK2���{+y@�6�@��u�����!�`xA�j]CQQ8P���`W�	q=����Rj ����ྂ����������"ݹZ=�\�c�U��t�HՃ�;̻�M��%h�$�b9vOw�#�[��֠�0�r`<h�V���{�>��T^}�m�[�����u/D*ϛ�{��ӄڏ���M�K�T`�v�����z�:�L���xGo3ׄ�_�iҫCg�?�PK/WUW����~�	pip/_vendor/urllib3/filepost.py�U���6��+*�
�A (\�%h���Hz)�B��њ]�THjw}ɷgHQ�-{7�%r���{�aktE�n0X �^��Z��;I�z%���w����m�z<�'�7{�v�1�Y+P6v��_��_�=�o�
�&V<,v-M�U����ūI�o�>K׮O�_��$I�-�;�-�T��>�7	Г�i��8����pk������(�`/y�*�6Љ��Ҳ$;�V)��4��)�}�-W���<؋�����mLn�3�J��,
���o�T�M�ړS�]����٨���-�q����т%a���{�-HaI������"�U� �Ux�F���릖D�6)E�*�ώu/c�)�A��qUc�u"�N����ѯ��
(-��z��$�x!���<��O����>`�y�4������.F�_�~&�#Z1
�k��l�%{��@Ŀw�i�Zy
��t��v;a�T����2�Sȉ��"l�Ѧ<o�r�;Q�b���7D���E��-�O}�7�;-��ns�UQ�#[t�t���d�5��9���^�
��
�C�$��T~Y��eI��"��/|�������:�"���]L�@ß'�q\SQ�q�z�v�i���C�m�x=ւ��(}EE���0�P!ܠ

ތ��@���H�u�\.t�j���y
�a��G��mri��`�NI�p�eU���W����R��l�Χ^��x�e�-�~�T
���iDc�x��'4�����#���(q��q�:Lr�_�
���PsԺ����ퟆ���+ܾ�E���`OL�#�FӋ���иyN�z�8�V�n��n$ �p��8�+�f��bߠ��r�,_��'�PK/WUW�DddU(M"pip/_vendor/urllib3/poolmanager.py�<�o�F���ا����0MR��3�y��
��A���������H��������O���ޝ��wwvv�gv�M]�D�oڦ�U���Wu#��TEۨ���F���*
�jtU�hӖ���
�����ty5mv�Gk�j�ʦ8�b��*�KU���,y���?~������=��>����V픅�nWj�`0	�yS�$>��,Z����zF�������ѣ�uu{�$����eu(��v��՚�~��bj��յ�R�o;#<�v�
|j��K��r�ٯ�.�Z��U�	䥯oU�����i]d{�Vxf:��@���ۦ��ME��Fj��%d�!�Ã�(�eQ�H�ŧ1��,�`�x&�D��;��#D\:�<�@�`����J5o࣪'y^�H�t4��|����o��ß/a.�t|��.Ԙy0^)��8��d��wc��F�ә��u�
6�q�p�4�P�k?M�+�V�A��(�G�eQ�	�p���U��0��JdN[��R	�͍^��h*��;��L��4|ff��iF[�U]�n�M&>n5��ah0h��]��3T@%�L@U�MJT�(`�x$`]��
<Fy�Ǻl��F�TՆ�zST�>|�0O+��f�x������c��eQ���L��+��d���hp(0�7���K^�ao(��SY4�z)e�F�+%������Ǒ�lj^�Z��h<��[�S��*	�g�������G�J�[#4�Y��Cm�OX�����k��[|�Rh0�p�I�nT!&��fOJ�ޠ�/H��t*�v_�8A7)�A��4�ɟ���;yU���!M��7M�9��|M�25� ��6"R��MZ���s�fK�H���]+Zm̓.��-ъ�t�w�.���	���!HN�v�%28p����J��r8�A�k�~$�e��y�pa"1�-`3Z����l��-�z'��zBڇĞ	���sf�xL/j%YY6�Q���.$QTe
��־\�*:"2����~���S�%V0��,���0W�]�F7�Fe	ĤV@'5c�Q��d�fɡͭ�!Hx$Yr�N���q�Zq�fK·� ׼�Rm��;s.�`ɢQu��YA� ��l�r� �(C(�XX�����$�L}��=��~�"[U�ρn����%�&Ȇ�wЖȋ�Á�X ���T*��as�+a�n�Б�p���<)�5X�� �.4����1�
���!Ƣ�	[+�޵�K��~��[ Y	g���s�0kt"��ĥFgsPb�6�eD:n�̵"�{�)]6��X�.�N�L�I��62�L��y��t���B�d>?�-� Q F�S�qIHJ�VH�Բ4��#��J@8�h�j�{ �Pq�q�q�o��w\�4ȅ�8�@��;}����*UX��f�v�x Ӎڙ�4&�H�)a��G���)��F�b�����ҧ��YG��30?���e���G|+�l��\f�BX�x�'l�pHb�!��
d�BS
*�Y#��y�	�WMv�L�Y~�ue	�X��}f�m�X����t��ݒ?۟�s�EEb�Ѳ��Y� .��E�ģDH#Rޒe�5&"�ӐA0�e�f"��
��&(�0y��9�E7�-d۴�{�H��xy�a��[��5'i�6\���v�
�Q�8 ��s���yM�^��VDY-�1��v��sCbut�s��8�vUTK8�Q���<N�k
>���K�ݳQ�7E��vc��y(�`ՠѲ��bf�lOg���~����IeRnC���@M��ثG�5�N��lu�`W�K
�8`=���@�H�٨LW{�j�������Ǡ!�IC����4��]�[�t�@�@`|R�\���f%m�O%�3d5�.�����}���������@yJ�D[��2| ia��_A�Xz`�v_蕆��]��w�VWE"�_�8f�֤���q�}z¡���_v�Q��e�iI0K�c��X�^�������w߹�	�b,G�g���d:N�K\}mr�ë�g3q��z���UU]�?[U��g����ŗ8�mU
m^�r��������������M�;M�PQn�����,�����3'=s\2Cr��T{�`*����>@v|���"V��p�90D�U���Bp*n֤Q�C:�M$M�^"H�����	f��rx ]<���\�q(�jK����d�m�u��1��O7������-n3>0��ea�[��I-5��%z���"B�����0+Ձ�fQ���(��/'��0u~|r`���,%�1������	UF���i�7By�b�9�nR�r0�~�� zxq�8ԇl�#-�+�r�p�a�3��C�ԏA���cIcy��|�+�/���������@�0�r��*�BkH���r}J�F�6� C����ߡh����8�����Q�I�S�)Q@V�����&��8��G����#�GǻY+�� x�T�^٘��J�tm]�h6��W��(&C��+VP d}�����r��jn̐S�l��]�����_%����.�wR�%73bJDWL
���8D{p��(�sr�Co?k���Mb���[
��Mc�ƒ�j�o�6�eb�!jdC��!��
��Q��QTFEV����a�1���]>��j�A�lNH����N��+?̎PUuZႣ��?��c�V��{�٘��8g΄U#�û�
�o�p���CJ[�ٱ�8N&sz
���@�!`�g�LG5�ָ�?�,N!�^]/���Ӂ����
v��|����g����b�!��Z�6��;�9�?�5v�>e��!��:��L��(eH쎚S0п����U\�6{��
�lj�ȐGT�D����'UDkN�l�0v��JA���N���N��j�3���w�E��}z��h⇞��(�E������V�_z����sG)�P��k�"�p����#��+�u�H|�G˩�i���MD�Eu�s�2��^!H�����SU;��(_�q��>�!����9@.3�<!=�ɞ5q�1����c�<
�?�F|$����:�@x�o��tIa�Z��[�et%�@���n����R�9����J3�и�;,��J"����=BՏ0Af�"�+E�r'��R<�P1ƭ�Qq��$�	�ی,%y�1�@�y� *���4��9�
�|47���令8�A�K��Մ����U?�N~n`2��!Ws�Q�$P�6? a�)_r6O�O�؟�y��Ok.�UZ����R�t!kR�1:��CYh?�K�+��>�'��H��n��8\��
g���VX��T?):Hӗ����0��~��6Gϥ$���������*�4H�:��sH��]$VJf����T��H\*=2�E)r��7}�3��"��6���6�3��)@,n�g).���J�[W�;!�oq�7�	���s�m©*B'�s��j�7Ǔ�Q\����E�_�G�c��ȣa�60�6�
1���C�cӐ��e�2�;cz�_H�8���g��dn����fg{�OS�X>��i�6}p�9�O���O�ݻ��duaN�8��N�U���H��7����]�E-|8|B�_� t
�7�>��-�%0�,����@�H�Pv��L��ޱ8�[x
�8��v�0e�$q��w�.>KK���R��$�n�(=\�V�����=}թ�
�͢�&&sֹ���X��֖y<�X ��f��	��ł�mȐ�(�&5�A��6��+���%�	�D��Ãzl�U��A�$m��B��
�Ԓ���۪�.?�k�/�85�����6{�����4��+;Օ8�y
�90�)��}���"mA6�TR�!����}0g7Z:]�:`�\�8<eƉ�)�H��[���
� �B�c��=`r�Dq�y+��1p1O�= �ۅ��ɶ���ʘ'?����"6�y0�\�8`y��:Jpk�;6����b��]{���ev(X	Jܮ��;`���5(���9�k��;�|q���C̄���<��!�zH���>|۾g��r����x��h4+��s�Gq���|vg�z�3�<����M�ك.*{!�v�h��_�w�q���v�"�Ô�[H����s�7{�+ ��zA5��d[c��c���:��Jϝ��כ&�I��;5���/��ĥ-O�)�&�&>�?�W��&z��<����>��Nݞs�%nOt���(��+N���ғ�F3R$]6a�7��Cr�K����:;Y_�/�W��+v�ܵ���	���V��m�Ps
^ܝS%�M���P���K����Z�� �
�$X���)�]�i��Q���VL$)/�X	�I6����D��D�c���a@G�BP�r��x�m��!���-31-Ӵ@���cx�^oVt(sU`�}�1�����o���^.���K��12�t|;���}��&�I͑ޑi�'y�2�1�&�Bw�Ϋ�&�j����B@3Q�YX�?�c��<�KPiSM��M_��;�=�CC���S�厮#�A���IF�WN���N�����_1���\h�Y�U1�Pq�<	�B7�tou�l�.�&���U�iC!{^8p�R��U�Er9�I��=�Kz�mu�s�ͩ��Ʌ�6�a�2�e�p�̒.�����h%Ŧ
ۃ}u�N;9-�੣
�������wa@%<$ !�a���Yv��O����LOLǢ�W��岠�y`j��Y�0�Q
άO���Ӥ��\�b+~S�vRK䞐[0���RɌ��;�����xe��#'V�B#�mu��u��Ie<x�x 0���v���D���c�N!�`P�V�,��sQdp�Ke���.�ޗ�y����;�!`4
�l6����"��H2!^��Eٙhd
[�7!�z�:����� ����V��Ř
3*��@)�7x��4�z@����V]
�<��ֱ�v�Ϟ���}�����w�>�o-�Y�2�ꫡ�\^���}�����=�ݛ��ܻ�C�̩�A_tڇ���$ٜ���&=<J��Ӥ������ȴu�O��9�0o�Y���Iv��T�3t�H?�������+=_�~��Ov�w̠���qJ�;5�dVR0��Ҕ8)��4{�z�l嬛���[�[�Jw��n$rשּ�m4�i��B"�J��"���[�"_H�����ЂH4������z��<魜���N�&�O�m�PI�zzEޫ�$��O��O#N�{Z#��u�ixI�������
��m�����"����*���ﻼğ�f���v�E,n��ݱBt�J[���Se�SJ{'�<���R�4�Y��Ff
`~���̕��\?�����#��+� J.}��x��?~�x�{`N��Vz�ی�'v��V)�O�]%�.�WV!�Ҭ�cax�{�Ɗ����pu���p��k��
{����u)�]��s���ݦ���U���+d<.#��} :e��.Z�����H���t#��^��vn�8�)e�Q�v�a�t�"r����:�F�lH,��gx==.���v��>�Ա:�����J���b���R�P�g��=����A�l��PK/WUWY���#pip/_vendor/urllib3/request.py�Y]o�8}�� ��3�t����nL�`��b�-dڢlN$QKRq<E���KR_���`1�FP[yy?�=��ʹ*X�d���H&�Ji�ڨ��"�ϓI73�d�&�d.*el�D�����s++�m�)]���0��'���o��ћCq����y.�x��h`��1�$	�sh{�>G?�����;aw*5ї�d�ɹ1l�b�ֿ���/'�(��{U>�RB�`�|�%��̭������sQ�>a���+(�*Q�X�D/��7;'��t��$X��������[��A�|�x����s��/���'nʃV�2�.k���ʑ���mTQ���C�	*c���제i7K��	���f��Вfv&E���d�XmD��S����燅
����$���4NG#J'*Lq�D0�F�J'�/L<ow���ӏlF�$W��q�n��>,؇�����7w_���mF"��/���6$�6��~N�>oA���N*<��?�?W��o�P�U9D���i/<&-��<g�RO��H?���ҪҒ[�E�4�"OQd��I|��bv�Zx ����T�-��<��
�`;�*��2��F�N��
���$Z���Nt�p�o±`u�d�¦��Aqa[��l���*�i�C�f����\�sɾF*тE�}������u�!�I�$3#�l�hq��w��˸����ړXa6X�h�W�Ϙ�=�ܮ�P_�n�d/u�{ݑ�Z�e��Գ���{�/��Z��ƶ�5��Geo���Jwf� �)^lȳ!�B_wF�刹�L�K�jٴ�Ӹ�;�p�/91��7t�6��'O�^@����j�1�;���K7���V+�
�YsbQ�XV+�2Ƒ�i�.�<���`�^-r��iL�I
g��\ph���RR��y��#C�ۘ�Z��%��ێ譠Rm��9�!��@.���*TZ����GU4�r8��,�`W(d�	�%��N�%	
��l��T����w�E�	8ǻ@�)R9��Hţ1޼lVW�г����%��F�E_���D�5��R�#4��]�Va��y�);Ķ�����H�w�ȍ����8�����sb���	ZY4k�6[�UY���}�o����.&�f��TSR �����<�B�a�9��_x-�e�'���b�����C0��pɢ�E쇮�����}h5qӳ�F���0��(�}�����
�7���h@a+��۫ը3�����/h�N�eV�������otL�r��[ߘ�r����rh�u��J��Mܣ9WŸ���΍�v����te���|������u�����̺2Hgbׄ����	�vj nT����6�D8jQ����a+*�J����Yhw(���!�	v'HnK��^o��Umw=�?��;�#a(�<�C�m�x��g���"h�6���V�%m�/fW�}�̌�KH[0‚���];wΙ�_�!�)$��/f��©�\.'V
�9��IɚfJM�l��z�y��$1eFS�wl_�t��!��D^M�#2����}z2�u�(�<��Ǥ��iO̯N�Z���0�J9r$R|+.~��vT�RQ`–k�7޵G�{="��뎬.�V�ۊn�ı7��2@X?)&��uM�/]q��)d�N�<��Zk�7���q��{FA[�B
��ijb�:Vc��珈�4�w��g8?#	�ZZ��ㆇ�MB�6?=�bh����`M�)���W0=n���N4tA�/��v��7�~w^F��rZ�9���&___��r`8"_Dċ]�]�ڟY)z#'�֨�>n�e�����:p�OYOiS$�S��Fw�9�5J��O��>.������$��.߾?7����4�#���No�6��I8�L�wnt��ȭ
�>{Hй�~�1���~~{}�^O��[�4�a`~2�����k�'���݊��z
��"[�u.f�`��4���6I��I��&I��7\wU�Wg\o��iO����3�>�1�-]?�H�T�5`�Eׄ^�=��_�H�\��D	JKZ�Q8���ۭ�-�\�S
�b'�J~7���Wv������c���iVGMo��;��s�_l|/�\K���nEpLZ����Z���oT#�Y[���E�
O�TmL,Յ(/�%.�ߝ{P��ok��xg�|(6��;B�7�/PK/WUWP �:c �wpip/_vendor/urllib3/response.py�=kw۸��+���4�9�3Ow�N�8w�8�lړ�H�ɬ)R�Ê�a�� H{����auf�.��������b2Y�U]��D$�M^T"��yZWr�����$׿��j�d+��ܕ��m\d��|�g���8�<�*����z�dg�Jܪ���-dQ䅈KqC�/�k�]��e^WM�[~��7+rR��wy&��o���U��G�y��r^%yV��?�޾�I�Y�J�j�θ�n�2.����ܘ:]|��
6Q}��n@�|^�ݻ����6���|���d��1�}%�B2Xz@�����z����0I��!N��]�ݿ�٪�s��j��{�L�� "�9�i���K�)��j,�潑Z�&���V�U��g�1
�~����f2O�@�7�`R�;����"�h%�7�,��I��dG{{{�4.K��2�+�H+����K�S��B.�̓,�&�a)ӥz��M�IQV���h�E-�׋����l0�^�0��<ZH�XB	�0�fd�w\U�|,p��
	�/���@V
H�
���,E�W�yh��/����͔�Ui�����P�UlE.=��^�������8-eG;���BȲ�2�$�sr'�	<B8���틿L>����q1�B��G��"]�$��4��}����d��
ШlNy}y}s;y{���5t=��W�?]\��7��yƇo�\}��zq������g���߈g��ܷ��@o�����������*E���c��=0y� @{��Q�K3�.I%��'��'��G~��C�ץ�k����r�兤��xY�BTwR�d����;���^�/`ߟ_�C����_�i���I
�M��b�S�s�Pj�H2��b
���<MdV�Ah�{iZĉLj�Io6��j�u�u�5�)��A���_�%�GեP
_RҜ��).�|�%�rޕ�z��I)f�zq��6�gq����t��e��%��N�w1Pdl4D<������
�0��wN_l����
S�@{�������� }L2��U��bؒ�wq�3�A����Cr4M:$��@,�2@�"�#g�˴.�B��X�-���0�Q�c�����:���4P��kT��_�{��r)�4�9��{I��h7����I��xV�GU.b1�?F;b�tf��lAl/��Nw6з?�܂P�d�1�hye��ja@ݑ��S��&%7�NB�{���F�Ã��xxJ��JX��Y�������ů~0\GeU$��hDc�s Q	V�x0��$g�H�>�����),p
 �\]��)�薖�ξG�rV?L�uX�^~kq�R�=�
�����z�JYө�a�YX��
�e�
�z�Yn�I���6>�I]^���/ldLT��8:�x�����q�(�ƺ�8�)�q:��;b��NŬ�����:��`�Na�<��,h�+8Ӈ��'�;��c:�-�^��6��v�9�hXDĂNjƗi����ˁZ+gDC�;(�)`�t��S�_�T�ifsC0�92P6$`z�~d)��f[�<+��ȗ��	�͋{�֋Ϡ�����M�����뛊]!�GQ�$�)Ğ�ى�7�D�t���J���$Mq��7,rQ�W�5�l"g ޴�q&����0w��i�Y\Ҟ;�@�;��@qUw�HVh��G3�&��=b['EV[V��^���c�w{,�
Ps}������j�z~���^�M]l������
@TQ��]
V �u�!/Y6���ͣ����|�Tf�Y)��s�9�#�Ɵӆ*�R�A�n3i���e��Cf�����IJޱfZ��H9~/@�ߣu�e�p3��d�^�k��:�,������,������#W{cV��f��ջۋw��W�W�؞��<�t3⟃O��Yf�3,�{__����8���ܾ����Fz~t<ϏN��s��-���S@�;�{l��i9����'�<E;�.ώ�'(J��ڏ�m����Y$��n�q�3:і�h}�e�hz�m�<�5^a�ź\yO�{O��yF�#�/Q���]�h�pr�7q]��g�V��7�h�_P���Pm��s���
��D��,���{\�zP�A��v��T�o�o�k&x˿���`0��t��4�?�3������B���s�qС��r����;3�%I���&��E�Ь��kB.�	j�	h��1�����f�,!�|sh���ʌE��l,�e�2[M��F��4FA#X���Q�g^�?�+�sf�sg����I
��i��_�#iҳ�l�a�òڥ$G@���%��)��NRuh����@^���@me��Q��@�h��4�Q��[i��ū<;@5o^��m#�L@˅i�Q��E�dF�V��,�r
,�J���ثgb_�}G*N5T��e�9�сBC\`#�Q��^*�k0!���<�^�
�K��
���v�r�=��R<����2�ed��f��&v��{�]3��Гz�W��E;����R����|��<��a7wy�.��u7�l�}^l�}�Ty����vM=����x+Xe�4��~H%��(�i�D`x!�����(:p�t��g�
Q���a��-Ū;��C=��E:�1u�i@" �h;[{��թ����B�
�J�YW�P6?���O+�)/@�͂�1�Qi6��k��H6�ԑ�H*�(K���j
Q���3Uv�ܲ�=�]�7N0��L���9(܃Y��ђ"F�x
��Gi�h�=)6Q;bܗv�M�ݦ?jD��|���5����2.��,�2��Q��z��A�;9N7W�^�MwB�<��Q�G]kl�����v�
G�	������H+��}�}5C�%��3�+HR`��NSt.<�����(s���H��wp�� 6�
�u^g����6ZOQ�N�ڼ�g�q��S{WxR�vU��k(��X4��Q��t;�eJ�ғ=���A�
]�8Ւ��pT� y��"~���_�=�͓����؜��~A�ۦp���#��l�LN�%̕`�y�?d�U��5l�������԰��iZޥ^�/vl��0י\b���e¤;E��i��T�ذ����ZO�h˦h��NA�3C��꫎p�+�h�O~&BMwH�d���������ۓ�Gc.�Gϣ������sRx%%?*��,6�5��.Xzۯ�_>u��՟`8�Y.	:Z�(7r�,��]c@���H�x3)�'8�(�
zc���X"�����d���~���ˬ��D�t��qr��+M1ɪR�$1��9�/Ø�L��|<�cX��د�P���Ç*����yx���P���~��
�%�>�"�����^3*h#�q��b"
�5:i������]:ʲhH!L�Թ��;�t��5�]9��	��a�K3Y-.��a0��?p��pr���J�
G����8
��iiQ��\/��@��v�4�"��R`�d��p�@�+�⎳B��ŀ���}0��ݿ����O�Ԯ3�%�$ii�]�2��E�C��9W��$P�(����Bec
O��B/�W#4E�������>��4�-�)���ŋWw��G-I��\�j�A+��zC��x��Ó��J�9%�{��.�=�1T�TsH�EQ:	�
9#n�aX�J�]�a`�G�`ލa�'�v�}��#��y���
j/�A���:3���	h�p���6Qn�e{ ۓ�1xh�v.ߒ�)4��}�a�r'bZ=?u�q��@���C�brq}}u=9���<��+eK6�y��GBJa���J7"Pc;#��h%R�=���5�Z:N�&Kf<���0P�or��`�+C���yC�n�a�S�[��?M��s���:�A���a|����_�;��Ie���
C���r*~����
�
�u8�I�ۓ*Bm�_O[#��#��9���1)�N�a����<��ۼG��ƆJC���y4JҀ��di��|��FB6������h�8��}�7‰o����I������^������u�~̝c�η`q?�Tl8
����-\�Cm�*���
W*��(��f Z:��#He|ϼ�N�KVw�O�I,o��'����;���C�l��L(���ͷf�f��NaT��{}�����r!�en�f�K?3cu�i����@�;Yry�b�4�!P�ЅAU�{Q$�6�������9S����(�ۉ`�.bJ��ke���j�#YS�?��b��[��Ur>����f����� C�!��:g��!�T �	�i����9�S��{^HB�B�zlB=��P�?����v<ܣ�`/Sd�yúHƩv�AkNf���$R�B�"u@��I %WwE��	o�2?�ɂI����Rg�fHҝ;M��;�g�b��H���x%��Iw4�L2I�DE���ׅ���o���+�
�p
�
1r��t���*W~��BL"�v�
����� ��bv�0��j��<!c��#�O�n5�h����^5�i��`'/Y�\&s��Ǚmp�^ ��I)k<w9*KI�O'o��W�yZ�B�.>,:
"BS,���.l��u�R�|`���AS:Ɠel�N{��X�{p⮶���PhCY9��oz3���zuW1�+o|(Vd �q��B���~���>?9���$jc���!�I�$�w2P��{�PZ��
�a(j�%K\�M����-��>�Z����)�z���i0cb
c/�9�.���W|��5�F�BfGn��X�����<�]I�*W�x�}�-�p#�����ݨ����/�\��Y��K�=����e�������wh�F��듯������ș��&��AӶnvW���!+<�_K.9r��8>b�r���\�-�{�loX�D��0���`�O��d�RL� �X�JM����׶��0:?���m�P�0�7c�_�M'@��N��\�˛�������/�ݼ���m���z����]�+uJ!�����cq|d��ZvԒ/I�ģxy���,�S���	�b���N��#s�L�)Ǿ����+؁���Q�#ri��Af;R�=ʋ
�]�V�5�dO���%<�'�O�K�
�5��H%���}�¬����Քt�3��}q�7�-��/���5hr��j*>��i�լ�^�4q��뿝�\������Â��a��'�"��gM��#�h
i���]ZnT�D��zK<�3��7L�ѶH*(�����L�!U��9&	�����^�f���t���!O��/�BXI�JvyE$��2ٳ�������*@4��Ԓ����\l?��I,d�w$�u�Q�R8�*=8y��k�Jl��-	�Hq���T�b��3���t�Lp:���*���H�	���Yjh�4Z�X���%/D(Ey����2X%���l�:���rI�	� ��?L~$s�e���&+���������XM�5�}�(Q�g�B���1+��R�p4��N+�Tj�R��
�bm�����t�;�LL�X���OBe8�p<.���8�T�[�����m7/�,.��j2���NUe�5��ȑ�8P�$�h�/s?F�ce%�6_���G�X�Z PC�p��.s+�ۤ���։�f,�n0�^�UF���~�p��I�r�"�f��+r�r-�ۖ-���~���9%�����W����h��;�3:E�>��e^�ך����j��E'�)T����G���,W	��9�a�uB��l3�ݒe��_ZbBLؘ�t�S��pڈ�8z��2���P�W�Wr.�N=�z,N��O�'v�_eİ��X�qu���ߍ`�p\T�,�y�h�c$���[ �s'8`0Ś+��0@��Q ��F�kWG�ѣt�?�t�	u�F�Mܝ�s���[f:�i�
s�+N^P~�����改��X5�c90�S��86��I�T�H|@/bPn0l��$B�(=��~�d�$��j������ą���=[`Q@8?;�@��S'LZ�љY��
K�Rf�a�p�Q�
}�\�%U�o�
_�u�rh�-cTj�S������N��UU���vy�-M����o��|��B�j�ͩ��y�7Tk�]AS$.UȎ�}���Vn8��'��P��~�Gu|���k��蔳���PH�<*�� ���v��`l��gܤo�e��KJ��+Ȋ���:��":�v9&j�݋�N��Lh6D�������y	��Pn�r���Y/}��2h��Bwa�F�XG�����!!,��Ϙ�j��&؎��;���H7�!5���D	������r,�ƾ��\dy���J�'\� t�+0�b:��[G�����VxL�� ��pj�^X*�JV�)�[]x1�O��tڮ�/��0!7����.����x2������—ʿ~}�z�U�9�ުX�O�\y��=����ԇ:����Y5��*�?D��tE��Rml\]��Cث?��Ⱦq���d��]�nq(\�Q_�w��5�>�Be�/���v����5�*��u���*@pn�t�7�{����~�!�L����o�ίa�}�$?�IߙL�1.��g�1B���K��|��۪+p@��1ϵ�@::(�pGGh��6��9gnj���t
\<⸫�؝�R��-��+iQ���r��N���s��X���D���봥x�rD��xDWe��k�L}�[�30|��]��"�<�O���&qcc}�������QG5�xxlF�T,�j6c���.<��`�ܺ�	��Țgj���)��BSw�ED7��-5��E�A����{�s��,�XI�#�(ȧ�V=ڣ��F)�2k���a��J��9b���}�:WQ�C�<x|���������y�t���r�R�K]�־F��@�u\�5�@{�pt�E��moE��w+����6h�� �[�K;[M)��q����#;�����k��۵��|�G
BrAL/�S�y~,�Y���a�*Wrn�k�6�c9�#f�^�����ˬ���:�!�����'	1�,?K�P���"�R��{A*��S_�
�6f��6��/}��aR�,�|wi]*M!�M�vS�3����q�Že��0�.�+�-���j��*�k�K���>tj6;�ހI+'�2 S^����fc��֜'+����h�‰Uv�����̽��{�29��:�wCX7u:U8L%W��ؠ���b����*�f��G8}<j����p8�%a�$B���<�pr_���j{�V�>6h��g^ʗ���`�M�o{(^����6'U[�>Ԟ-n����t��I/e��ha/TAb
I��U:�Ɉ�_^r@����k�B�2kR]V��7_���U��t����i�c�O������؞�Yؿ:���OZ$H
�P���/&��r�ƕ`O����?!_�ɩA��@q֛
J�����ēߛ�bʐ�%�۱R�tB���}�I�f�R%v�֨4��*�;¸��C�����@�?#�
H�m3K����u���v�`�	Ev#�M�i^O���
��n�mJ���F�2�K�Է#���=���6�������}E���]H@�KZޫ�\�lw�n"�g���*(z�i��~r��rig?�
��R��<�w��(��e�����k�,�A��A�Y���iV�ʃٹ-I�]�O8Sו���L��{a���(��?'l������&���>���}��ՕH'�w�wvQ�u-��E Ȕt�P3��3Cx_���]����$ ������@0�
�'��l��w����dvd���'���x-җĠ5)��o٩��1�xK�y��g-�*��t�}q���	&O��;������Ax���.�!�Y@�=�;��>p�U�{+��\���r�_�T��B��{AᵒG8����p��V�Ye^���%��e�ޗK�>~������a�CK���]�Q�i�\>��۟#���v	:��L�ʋ]���k���SԺ3��a�[_�K�Ask�Q'St�qeХRtu�J^
\tߎ�g|��d��6�q��-\��Lb6Dϓl�s�g���'����z�>�I|<>���ϝ�0�`tBhPh�����	�@wU�BU���Q_���/�ƽ�PK/WUW'pip/_vendor/urllib3/contrib/__init__.pyPK/WUW*����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#�PK/WUW
d+(pip/_vendor/urllib3/contrib/appengine.py�Z�s۸�οU&c�F���Ou_��<�\�X��N{CC$$�L<���vڿ��x )�nZ�$���b�}�d2��[.I!�6g��ŎgLJ*!rRВnXM�-mH+��{!6@xQU��������X�n�
�w<e�Oۦ���Y��6�7jR���VS��2�ʳj�lEy��|��Qt�@�
i%,~~E>�Z��U��X��:�99_�&��Dݐk����(=HQ65_�N�t�*6s�e�I�l%�4|=�r:;W���l�P[Ѝ�H�wq}EVl��l͈LYɤc��$���LQ�\2Y�zEJ�H�Xs�������QokƷq�~o�l�'�/�'srb���,��f�¿ۜ��
�|26�Yt�=�VC�_Z�P0�%��ܐF(u�I��"P����
h!�
 �V �Z�d/ښ�9O��1��o�5cDTZ~�n%/7�E�(�a�}������D7��4�R���xK�y�urǝ\y%�9e�5K����{��:m��2EK��r��&*t���
S@e��!�^��Q0O]��	�o1n�jOXIW9��
X��Lh.��]���l^�T
�"�,�@�{�O�����+*9(��ba�^������,��B�,1|٢��K�z�е90C���ҷ� l��E~{ks���r��h�TLv቟��ɗ����ӛ�.�7ɏ����99iꖝD��\���ŸB��E������&\�g`���l��r�(�uY�.G��!
v�\�M[+�e@
��kQ�l��;�&Pa"���d�6`�$�	����ۆ%�{�q.�S.6�4��%|��c�����4$Sei��e]�z���ꁏ��3k�Gs]�F�"��nn>xߖ�``32�"T4�3�X�;x�qoj���&xig�j�~�_?20t&;"Y�j���ٌY���9�./��n��(bH�W̌+��w�Ԁ����S):�!WjX�Js�PC~%��|_���
k>�#T�$)i(�
)4vu�:�
���r���
��S�L8�α�/t����ƿoDY2�r\���aP
���
��q��/�^����װRn.e�hF��$��	+ZГe�H��IHd��`.�2�6�͒@ϗBS���e���bh밿�ҨȾ��C?C>^�Z�<�IM9�rX//�B�e����<�Q�c�="�S�����N�0�ɯs�ͺ�ta�Ҹl+���(�a.�?T5.�j'@��/H�6t�o��f8���P�Vۮ-�x,s2
� 7	��t�������l/T?(�AJ��GLs`{�N0��[C��%o�dꄓ,_ϻ���j��,Ѝb�?��9��I�ꆯ1p�b	%�#��J,��׋C�����a9�H�R� ҈�`�+��$`0�[�b|�����4!��k5]r��!\s��6j�6g4�x���Y�h��a
s S`��\����e����Y�֐"�5=�o��M�Ǔy��P��<Å	9vxS0���ǀ�gl8�؇L�Eጎ�>AAP59~{���ˇ�+V�=��Զ.À���*m��+��@3�
���5�wЖ�f�f�6��a�߀�{s�T_5����E�N2Axv_V"�"�)٠f��`���ik�������O_��w�ټ�����_��ܘ@Cb=<5�N��G��EH,�F�~6� �,v�X���Jb�([:���a~
,n?��f��vڢ﻾��_��?�5$�Jm��F�BgH�7�b<��}�!�D��([t>s�
����;�-/�E8�K0��u~ykd��q��L���l��
���̯J%��Cl��M!HN�
�`M�m����?��᧫}��p+�e2��%�2�WaZz��X)Y���Wg���lĢ�Fnz̘o�}�aq̔KPP��8>¦���x��P)��6��d���?���76.��u���;�z������A�a;����Jۭ�Q;�`ҝ�ڈ�`�?��^��s@�s[(	;�=�Z���u���)e�H�P&;:w5�ղa9�I�YZM�?Jq�����@�X��ޔih�ס��7[�ީݵ[������j/:5���ɑ�rl/1�Q�{ⅶ���n�IX��/^��cvn2y��D�Aҹ�׋ƼLk���߭��s='	^�Z9�g6s{�=DžV`x������.�f��Mn%�9cU�T0�O�i�r��3�j7��g#n�Kr�=&g�^099���B<^�>~��`ă��j
�2�S����1��!�a�:���>����;N4��'ȉ:H�a�m������E3��̖J����a��ZA��`��E0Y":����'�^�4�lXNm����y�^�r,A<1����ɡ{6&���c��(��(>�nt��ϐ�}8�
�à����J<�_pY�#�5�6Y_|W�Ⱥ��_����Z}.���@�}�2�񄚰2&>�6�����q?'��Q}S�vQJ�ӗUn�vOP�1�7qD�P�0�������T�B6�L��(c���.���@K�f�#���~a��S][O�H���#����� �̝�=���'htչ�����5s�m�;���؇ň
`)C޳�%��3��*���P�I���1��h�_���ObU9w��o��}�	7��
oD3s	�1c�݋�n�v-Z�4W��I��#`�/p��i�+B�߄@W鋋��	��4
�6l{���,Ƭ�����f�Q[�����(�`��ᄎ�0	���o���<A��G�t��GY�ņ�ݕ��棁�lq�O����i�7q���mbO��v�����P�	^؋�"�{���S��0��'��#��
}�S�(4
���8���tܪ�X��YY�;�J8����F��X��Ip��{V��2<�\�yuԪW;�#�[�-@¡A��5;�^�Jdt�� P{{2�7Q�����W�1?�2.�hFO�R�)��ȩ��+�!���hM��=��b��%S�\�
�nr��M��Wۂ����U�S��?�7Mk�¶$��~2�}�h엎_��~0	����f�.��g�dÉI�+�#g+��?PK/WUWi�7R�'pip/_vendor/urllib3/contrib/ntlmpool.py�W�o�6~�_qS��T�IW`0`A�%�Ҵh\�!	Z:[l$Q#����}GR?-'�0,/�����ww�ў獮��:�\�i�o�"�!��|Uj�a�(�}�1J�%�G��J�GS�����a$b6BlR"���LS�zs��u�f<������#k)2�u�K�a<+��VJ�tx�G�j~�dN �ۗ���@�7�/i��-�:��53�����<_.?^��<�Hs����&���U��� 42w��WO8�j|��G@�2AxY�T��a�%d".S� �B"E�(gy[���B�hΏ�s�x�3x8���"S�7��)�B����X��B�e�1�rG���\Aʕ9���rQU�
�I�������_�����E	L"0(Jk�	��ZXĔcYf��i���D��8
<ߺ{W�BK_��h2Q�aކ|�9�(�hi�L)0���xO�'3�s�/2g�(��C��@E`�ӝX��qj��i*J�'��,��l�k�|�s�c��ڷd�Pl}{(����E�^�oͨ�ۅl�*s{T�1%��O� ��`ӐicBy�	�+msǠqd�E&f�N~��F%Ŋr�׻�O.�noͪ��BfL���m�pl�����0{���l�`Cgt&]O���]^Zd�|�kf�˒m�E�I��a�$߭�H�{���G;gnj��w��L�*7���m����oAl͉�Nj�
MZ����|Di�v��M(�*a��b�0"9u�mf`�H��u�[V*mt�
$9l���J�r��8����,lOP����� �U�7S6�ך(0�m�ۢ�P.8�[�9P�����c���L��լLF�0Af��o�MAo���듔?���1'�B�Ŕ�	9��e�����c��n_wD��ts2�ѩ��Ǽ�Aw�f�A���ZG���ӫ��N�{����eCA<Á�AD]�����g�'�E�~q}}r�9�J�C�0�O.�j3s�_Mz,U�������+�{6�������8�$�	B�#=�����u@i�K�!6ݜ��������w�L3{�Mw^sT<>�N'���o[��(1�l��M���j"��7U}�
eAǛsS�����0�"���[��{���k+=��uA� �S�v!��2���3G'Դ���)�$�	z���KKc��M���j����<���U���LO3�e9_�����b����<u��y;kŞ���OP}�q��-"]6"08����5r��ϴYU��G�>�&=�C1�y���E���f%>�{�6&VVO��JNN�O./WgO�ɀ�=�bm2���w�����|q��8}R����w[�_w��;��cU�!�/u����[����H;�KU�ƒ��p<�ʷcA5���hX��5�U�%񫫳��l��L�%�_����2��؝�v�.[�\�>�;�ٗ�=�o ��l�*�.2��;�)�>9)�����b�4_��&n�{O����6�vkbg�N��Mw*��Oϗ��X�(u���:�j�;�a
l�f�+���A�v�x�`;��]�~��d�^�3˕娩N�f�o����Q�PK/WUWNZ�;��B(pip/_vendor/urllib3/contrib/pyopenssl.py�[ms�8���_�Rn*TFf�dvjN��Z�-oT��>ۙ�l*EA"$qL\��������H��dg�>܋��"��Fw���t�z��[�������G��2�l!sv�-V2eov!�DnX�J�8UE^΋X�����%��2��$����A��bː�\�E���@�:</e!ȒEb�ˤ`I<�ya$�W�,^�����>N���IS!"��x�(O@�����I� �!�˕H��ݭbE<I� �9���/I^U�$���^�i���Dz{�~2�0=Y���88�#�<�f�\�<[m�l��\���m�݀-r�f�V�G)w)�dž����wr#���z<X>��`Q�x�6�x�r_�,�$�I�����@�\�Ĺ�ɖ�D��de�V�M�����������K�9����
m���iZw.�k��I��D�h���p�f\�<��߿���'G`�8�x֚��r�����(N3��.�t>��g�'�po��L�<�� N[�qZ��PM����XFѽ��@�3��^s������&〗�����qf`i�b1ΦSb^�B��_�t�eT&|�`<�2	��Y��炷Y��v��zb�J�O�V���#��alm`m�"����kJ`� |/�y��T��zM*-�N<�EV�	M6�s��d\)ϻ���5>��:�+�pf�2_ênu��"�w�-6�Ab�6+��#Z�e�֊�\ԁ~|�}���3t*<+�sE&a� ��#���drQ��,���%^C��۳\(��?�+���������x�����)Ti<d�����k���>�D�@�����!��|-�IW����E�|�
��,�2��m(�D�E�U�Xs�l6N�3c�5��4�%Qb��KH��j�����5Eqv$
�0\�E��0��gJ&e!B����s��=a�)���dS���w���6X�_׼f`A̟��v3�<G4oB���P�劓YS�"?�Wo_L��$g�K�K��q{�IpLc�	S�xL��~;�Ibi��q���J?V�?Da_	-qK�I�.:�`�,��P�k�P ���T&昪�Up�k��u���.[��:,� H*�ɂ�nk���X���q�?��E冉\B^گ��ǭ�7<O�HCL�e'^K�Nŏ���p���������Mx�~2���<;K�|Ұ�roiS8 ��
fRJ�3L�k��z��^:<������1`7�c���i�T)��GG0�i�z���{�� �R��ѹ����VV(�z	��d�f�h
C��CF�s�c7�
XO<9�M\=��y/p〼��[E�R޻�����]^
���3�>V{���("��@�X7�9d�B�G�LA��m��T�M��?H
Zfwi�n>�޼
?���]�k�;���1���q'�!��O����>��U����^��ƒ8���(���8;����|����|I��?9(���:�̠�\M^OK�����-����M%��"W
!�X�Y�C�g㛻���r�t���7����ŠI{u}7��<}�I=ߴ�o��qr3>�KO��v��8��' ��=��T3JV�H*|�a��T���榽������c�ۀ��(S����~!�N�᧛��8����_n'��'߿��;ϓy�1��:�P����9�4
��ҠXA�V�xiv�`)���Q�~��
Cۃʚubp�O�2��#HQP-�F5[�Ž�Dhms ��!�%v�M�Ρx!�ȯ�XC���U�"kix��6��]�́�������%��I��]ڔ];EeˏP*��Wˀٖ�z������5S�+2�a��;>��p([����	jm�C^cL���'Cl+��^*�8����|�a��2T{�1 >w�\n�:`q��+��T������찵@�����!S4�;��Ip2�=��<N8n�@%�*v�����P�Bz8W�1@Hl��W�=�ðB6	��AH�G$�j\��0�c�z�ѡ+]׀�t�����ʺ��b������[Vf�$��Y�j{a;#�5�I/X�Tc��w�%��M��u
&mK;�ӈ.,�`!�q�+�A��F�D���H�zW�6A�8��.�_�-Q�6����,
��E!)��%�,�l�?i~2i��u,F��ݢ�/}�ڊC�'`�B�.]�bρݖTC�&�gS��c�քZ��嗯q#̂��4�yd��[�*�-�E�1h۟�N��`��pe�Lclo�\wn8[�Z�G��wQ�ܧ�g�	�em�>���LԐH����$.66�p7�.�n�aWIVr���)5�,ù6~�>Ĝ}��8�����6�N�
��~Ԅ�HzK��m���>nQ7w�J���^�l�g����sT���,ޠ�K�Q��\�_%�zV?�G/�Za�
���8˰]f��>܀yB=��K�?�ߏB`�
�L����28��fcݯs��	d��.���^nR�e�~)�_`�[���h��C\Fl*R�+"?�����(�m��Gf��<�:����qj��OWº�V����#���ޫ�H�z_��&�l�$b5_�����-߈�������Nr��ʘ��q5�c(X�e�%��z����
�e.���i���0��I���Va�mr��=n��X%x��r����S�MԽa-��8�XO���R;l��ݴ�HJ&@��*0I�BbO�;`��"9�X�{e�8���gl�G�w}�7�IA �τ��L+c��•�n'�>�?Ę<�A
S:��*��ha�kl'∹Ik]�N�&_��a&
��N�'���@ժ�ʷR�P؇\�=�^4�U�A��,Ҭ!�v� *�Y���o�����|=Oo/O����,���#��9m�
�ֵ:��]g�S2�����U�.`�꾙�6�t�)̏���0[p�v����0�W�
��3]4�k�A��o���P3�=�!�
�^��B�x�g�~���Q�5�ΎF��<PE���_܉j�DS���HLTs*�����9�!��HE���n�	�
�̔���>��*wj��*Dh��(��%�7��@2�K�ʵpإ��B+H>�֦I�20����%A ����0�(�1��ޠ�J���[1����}k�=����;����MYH���^�,��ߨޠ1�Y�~���F�yW!F<$�>�����Oz;��!��4"ĕ�s,Q�j��~�EAIݢt�^�pn���zˣ��1;���)�� 6fQ�i�Ł�
�;�t�ᵿ�k�0QN����6�\t
C���� ��{�B��e��d��1r�}b�;[���� ~dP��Fe�o4Ѫ�;�vgl�����(5n3z�����-q�x(��F<e�]'�s�$������x�V��L���w��\3�a #_��~C���L��jI���<���{�`8���|}�UC�~��ADL�gC�{˧n�@��
r�#�n�
��3dչW!�r����
� "�K��+V����/���2I`x)0�fێ2"�!�M'��QF��9��>�'�r)�Pȅa��
tէ��^��Id�G�}�e�TH��9�i.r�z?O$V�U���cRI�w��#p`+\q&3�?��$J�6Q���|.�͕�А2@�P���jωp�C�?��&d�":��]FZ���ª���b�`<�ϗ�o�^�o�#�N=���i�}@��lڕI�i�� ���hNc��t��l�pd�c
%'+3���ulf}g��v�Ĵ15��sw����:t����
��QuY��Qͱ*�HnR��Q�h�f|6��4>o�}�;��t�ߡ�!�?���'���cv��C�l���ˠ;�����V�l)zwt{�G�s}�
�E؉�������?�<y�ūF��H� �/���S�s[�������%�-�o����5��2NA�5c��7�>`]ôVs�_���b��
����=�?*l��T��tD�o��3��;��o!��q�=V���U_1F$�Ta'��"8>��ķ�L��	��;<l����ov�]W����5�8-�S�?��ꩺ����P�%I�z��IHg`.����qk0�����]`G\d��a;t�uܑh����tǎHGk��Z�������}�~�[X�^zT�4�c!�����]��Rj-�F��C�`'ψ�VYP�Oh8Dw�X����0���Wր��f)�
�'���[���*�L�L�k��Z�����X�8�E<V���ڑ�s�������4�]���2�{��b������4~?8���N�IA#��$K=�ʘÈC�d{	rYH���]3=���j�ű�I�m8���Ɛi����U�^�s	�ɫȕؖ�q�5���I[��W1::y�	ZVw��b:��Ew4<��|������r�S8�5��)�o_���	�kƫ��j�>���tj�L�L�	�P��$c��ď��<U��	6�
�/�\ؖ��%�鴖����Q37I�\��ܧ;N��k���v�cڗ_Z�0/[�2�Q<��a��T;m#�IS�pnt���`)�m��as(��T���F`P䝌���;~_�\�5�L-��y�\��1,������z>j�:����O�ö��ik���޻��i�����Sbx6�zh~
i���v֭9s��y���Em/Ukf�X�o�ҹ���� @'��t"l��O�]�{W\M�����R�&t��ۜcza����������[Jp���*+��+z?2���|�y��עY����n�^��3��y��y�E|MyZ�t'�N��P-�
@�{��U���H�W<N���m�{�u<���y�^�Zi@).��\i�-��R[���j �3v��8;��*����^wij�DC�>3?��Y�٫pX��:T?��g�`9��1!^
�M�H<��
�֞�����)�3��g{�~���'�5�vo�Xϭ�z�Z>��o(\C_|�|ӿ��k�*�~ɰ�҄�r
&��0�wԴ3�ݓ�w�[�Kځ�+#�#�f��Zk��<���Gj*�Ov<�	ٛ��g�T�l�9q��'Z�v�Y�Y[u�Wu�����OW���F�}�Kt=Z��o#���^ľ.%�������f��q�1��O�1��@��b�y����\�oBM�/M�<S���@���
����i4-�����PK/WUW�,q�%��.pip/_vendor/urllib3/contrib/securetransport.py�}�s�6���+���y"s��$_��F�gT�X>K�s�T��(��"u|X������	�������+��I��h4��n���v�2,39˂d�f���
��L3Qfq�O�C���md�u:�U��up/s���ڭ������]ME�Dq0��(�
@��,i���Tl�b���(V��D�0@��D��<A#�A"�5"$��
�S�e`�+nv'7Ax���8Yȯ�q�>D�"�ӵ��É��8͎W��JfPz�YFY��\e\��F&��U�X@�U��	_�:@O�B�����/RK�G��i��6�!���A8�<�CZ18&L4��)2B���`b�1�d)��֨E�j���2�H2X�/�^��	��I<�XY�yA���*�L:���6�A�[��I���A�/�K�i�K�a�QZ�@�8Mkg��S��� mW�FҴqynF7�oOa��X��%`�Dr�H����9
b���Ug��y���,{j�I�Es�EKO�/mZ�|�q�c�D�D:z0��
�#�CxK
c\ū�ߧ 4v���`]�e�z�z�G���Db�bS7n�9s�B<%�!�Z��u:~�;X<�*-��S[�S�z9�O��G� �#��<�x(���
d��l6;�@�?(��\ �A^�"ʁ��s\l�IHBj�LK�����>M�Az�a���a�,�v�$B& ~��`�Ή̚#Wњ}��A�(V���4�M�� O��^��t/�E�<y��5�<���<�0�i[$�B����
��������<N�{�*�t��@��woO�;��}_�Z������~�Y����[������r��L�\
WAv�h�Nl��H�yD	R$ X!�'��,�A�S�<
�`���5l�����w.z�Zݩ��=�8l!�X����w���m!��C�0.i���q��x� �@Z�	�>�~��%MqS��(_��2sY���"���O)�} .@�`��4�J��H+�C���ޮ�5�+�T�
H�,��f�X�@B�����%N�i��r�(Ђ9p͋y�$��d=J�z�ի|By�	(q����e�F��3������S�Gb:��}܎�x*nn'_�.Dw0���}�e<�8�<��vp=�YL.��g����/F���v4���-�����zx��b|�A���ד����lB�*p��~�?Ÿ�����g^����a_Nn�@�ng������|{3���}=�����F�F�3F�gb�7�CL?��p8�7�3�E\�pr����Ǚ�8����#�p�j���W�񧾸||Q�	@�ybS�T|�8��8���Ɠk��pr=��?�0��Y��x:��x
(�4o'0�zM�1$$��J���<�8]�Ws��^���2>��e����WJcNJW��w����r�_p��&�_2˒T����&(V��|Z<���'�꯼~QdeX�(V �Q$�[�gr�a�
�Qϣ��%�X��V��wƫ�
�=�'W>h'|z=Sm}W��#���:L3y��)`F6WT��߆�NJ}�@
�1X)��ף�A�ʬ��z���?/�x�q��}�n?�L�B5�S�e����
���
3\�4Lz�����9C=%�e!1P���ܩ�͋lw&�+q��|#�h�gڬyG�i޼�z�>j���aG~
�cz3©>����A�sq�&���#�?����=tN���A��N�J����n�	�|��h�������1�Z��3H����q0��Ṙe%@OA���x~���P�i4OcțL�A^���8 �OV��8�wJ��@퓊�-vl�DQ밒CkZ�=1�]�����3�kex\`kˢ:B3ei�b�Jv�!�����-R��?�ѽ��k�I;����������[9,ЌU� �4�[��Q Ũ�c�WB��])s�S_��_*#]��64�l��A��F	n��Gk{�&���
�������A�*$5�sv�؎D���~�BK0�Y���G����Vh�h��jW�Bp�"�6p�'����~6馌��rX�$�.��,�՛W�kpSl=6b]�U�b��ܱ�K,H;2*Ȍ�p�q^	��i���`wmRe�0��<�e��x���3-qAVA��.��k0R3�*���? 8��My�2C	 e�������Ê�|�39�B�r�/��߂��Ք��q:���y���+x�.�+q�֬P,ȟ|���k*��
Y���^�
�{zb4���a�
�@��w�T���UY� -q06-�#�9è��[0��W��O���N�?��ێA��/��P:�+�j�t1�|�����
SF^~��ݓg�(ԟ��rF���H
�ܚ��[�	tl�-
[;�!�`Ѣ���ݟ~��LQ��yn�b��hx�q���|����h��{����!L����'�~�]�᮷/�#Ȃ5
��{��L�~>9}���P~n���5[=���%�jt}67�~����L.z��u|&�=u~�:>�c�%3{�^2����ӹ���{�� ���m����d�J=�!��*Y��\YZ!Q�U��&��HP��NQ�1���&.h��Kԧx4�!5�g�I��K�.a�2� ���*�:D�U�Ж��aHXנ�է+'o���`i��>�5�(��+��M� En:�g�g��('�k�|�B-~����� �"��^�M�����-��:xv�_��s79�Z�������O����Sq<}
����H�t��A�%~z�Gq��t<���1}_�O�t?k��/���K�zH�bP���&�rw�	
p���-9j�~�.��c%|<�+��@Ё����xB�:��#*6����h��v4�\Oo0(��66��혦m�!����m�eQ��w�lY&��o-���c�l����5�!��=в�f�货�2u}�}���;Z��"(^.�x~O��zW�|:Օ���i��j��pPm:Ӈ�2/X�(l�qT�R<�d��h֨*��x���pj���܈�w'�GUg���a8N
aG`�,�'�wW��A.kdl�
�uj�D"h�=Z�㗷��]�h-1>Ѐ
�T�z�) nҎGE�H���5@�t%ڮ0
l4�����A�T㨈��i�џa�f��\��� ɐf��=��}
�M/�򊥈=:g�F���5��AQ��Q�&�ku�{�\�c�����P�d�2�y䑼�L�y�u�����$\�ɽ�G����A6/��	ʞ�5J-���sf�RS`�jqpek��n�N�i.@i�e�B���5��qI��#(;h�="=>��^�^ś����8&o5'־�����k5�y�2oG������f|3j'���ub��
wPM����������,Z��a�{������<��|�^�V���t�(�e��~P
(�KA���%�/V�`tq�h��|��π��S��]!st0��{U�������Y�j=���oZ��hnj���˿Xc��Z��V���bj=x��ei��ֵv���?�(g��|��.1�mJ6�ǔ|t3~�&Z�%4f�u�o]�w��gbx���YGy�^G��) ^�Q��K��Y͔�w+;����F���h�5m�����p/����1��x�@��$ē�8z�t�L�� �ć���&:�T��2ih��� ��i��h?�sj��
 �����k�N1���V%Rx�W���`቟e��S��9gQ�<~�:�ì�_�R�(��6��B�n}�q��_����c�)��,_x���\=��c
n�ǘ%�<��Z����:w2E�B�����VTi=����_d�wć��V�wD�r\|t�Q;��l�u*L��x�.��]mG�/d�Z���2^�F�V��^�����^�U\�Q��Ξ�G�}H�����/͍�[�s~�/�e�c;	c�YՎvW<`��R�-�N�?�ԏ认,j��U�EP�C���!���(�uv���-�C(�p[P��N2ZI�Q%�p:I,����A4�%�e
�f8���2�(娋���˻[a�7���!�t��!�&j��]x��������/��ڍ/�A^7x�����ٝ�1�A"�9�T�/5�`x��i[�dQ���䰼b.9]
�a7�T�"�?M(�VAr+Y�xifa�:�g!���9�����D���J6ۀ��R�M�
��d�¢^��O1-����N���
8�W�1�`2T58.�̍�����w�6�������0B蜸R<��{�E�4�&�JU&���hTMËd�Wl&��I
u�f�P��Ād$l�Ğ�^{�X�&A�'}[�UD$*�l��
���!�a���b���$��*�R�@C��2��U�K�⯖0R�`%@l�\�S���c_[\��̋tMrr��׈�����@R(��"/ȷV�^A��}Nke��EΣJ֫J���H>H0�lM�mdS$˜�ii��s���uҳR���zo��)�#�m�g�`J�b�V��+XR�5J��a�^�on�v�8r8(�7Iu�+���	<5����;hM��n��ro�Nm�}��j���i�!��(��-N��"AMtkx{kn����Hة����V��=g�z�x����F�I�5z�U���%�{�k��-5�����[mA�AQ��Q�n�Aȥ�B�(ˁ,�.�7n6�Q&Q�G9���K�0�n�D!=�h�D���gnQ�Q*�ӈ�g]��^Z"S�}*�jjT
)�;���3�ƞ˪L�V>��`��D��s�q� d8Clo�]>'��@.�O��J���g��_)#��>��=���Ѕآ�i3h�l^~D	���qLo>\t�E��7�s��t^Ӌ�^y�;~�����Ȳd�(���:�O�y&�������b�6`H���_)�RF�O����� %��Jxd�JfBc��r�E������^Ϲ8�c|:z@�+-df5�G���kr
�>i.j�5���\�@5.�nu�8�۽>�=um�9E��O��vVᑏ�a��>
�@r-#��)�$C��{�tp��_�FS��s\r�S�:����Jf,Y�2�m�q�l��%�ˍ%:T���>��@�JhI����E7�w)ڸl�5�%,�ң3]���:,�w�=c*�J�,M
Y�J|@�Q/�])P��L�و�b��ʎ�Z��U�9b�yr�W56�òڀ�W-�_�n�0f�Nglv�!��.\a��S+�0bPfb8�9s�
,ҥC Xt�`)��1�<�?��a� �Gވ��"B�<�a$ì~��𓄔��!f�V���o��fo�$��w�7�虶
�(�H�[TA���
IqG,�f6�B�n�@˴�¢��H�a��s�H�`�'��:I���^2���[6%��������.#%�*�4\���uo�i���d���.3]��{]�p��w���=:,�u��Up/kӍԁ����
M���_(Cܖ�Z�WO1�R�{�a�Јh6��]�3˶YeAn�h{v*�rO�L�\�r4��xiNE�Ze%Ȱ,�@��k�������Kt��U���(2G��6��r5�K�1����GE΂�2���k���t7����9�bU��\�n%��hghg�j�Kc�dF�@6n��1.�4Z���q�;�����Ύ'xr0��~(�w�+�g����
1Ւ��M�B�u�-��wb�0�h�hy�W��<���T�{���DS��*�b�ܮYI��d�#��Nۢ��QY��/��_FTA���`��@F[[٥-��T�a�[��ɷ�������H��L��h
�
xO���890����;�2W]���y2^V�@	XQ	X|��ycb<0M-��
�DW;�`�Xa�se8�3��O8
�:�d��^�,��?<�p!�9v�bz�5�h&)�m`�q?硭��k|��[�8��	�rΊ2��iG�8AF�O*�u�K����Q)m�{�2��{|�\�54�s����_��je��]�_`��(�y��;FE-E��}3D�r`P��4(m?��+DgB�M�I�N�]:2i�E�ϰ��-�Tr���T�%;MQ�O�r�'
G)T���PܷTSI�M( ��.lQ�f��H�I2%�
`��f����Zr��m�nRɰmR���}�ou��rˊ�p�?s�s}�����a� �^�T�e=W�����ua�����1�c��Ҋ���0oɡ�$`p��'��L�������e���>�X�Z�E;jI����C��H�()���vi�I1
���{��$u�Y�_i;UC�t��*�cp�
]��o�U(��o�c���ࢴq�[J�Y9vsI����& >�o魣�rX젢��r�G�0�j4t�өC:~�S��N��GeO�`�YO�Q�����į�Pf��<C�f@��p���
�bN��Y�k4��F�*��R_4H{��zwN�ce��/�O����ω������e%~�t�?Od�B	��6���ĥd]��X��cDe�?�����w�uP]hJM��ݰx=���w=1U�|���W	38�+W�v�FM_'�Vo���4��b����$�*�b���(J1f�1!�����:
u��1�J�kX�7�t:�p�{�)�@��62�n����Uђ�
�����]�e]v�dc
�s�cyHʖ|z`������o׍(7Zբ�a���|[���5�g�.O�_��Ї��WI����j�RP�8ق��Qk�����$�uqs�8`6 ��q��ۋ)��(��K��	^�̂ǐ�.��1�X�!?�wN.�1a�x���L[uy2!���1�Ͻ1|iRQa�R�V�ˁ5a)™l�z�2s����Hu>�(�p�/�o5�;��o�2��=�~�'�
ew?�XX�%L_�Y�!�5k<IBȞo�ġ��v��~��J���<�CM��o6�R�-�y>�r�B+�i�~UcU1yU���et�ҤN/�H�=�L0߈���~���ln���\Ve�I�y23['$�Z�;)�^Z�lr19�bf��:�%(i�	�`̘c�E���܄�I��Pe�7b��'q�d�n��,�^�sQx��7�����1�h�c���Z]Ht�{v�&"�LeG�����`1��o�F���%����>�v�:���B�%ԹQ�*Dxh����s*,�6���n�-I�`��S��69��Bm[�/��6=�(KR�y:�d������_�<b��5'��aʃ�C�V�jP�gB��W���l�4���ܮ���\��
�8�a�^�t�`�,��l��UG��c�hs�)Ӎ�`�Q��ȷ"���$#s-9��ѭXc�LHᡯg6
AM!gt�in�5�*Ŷ���)���Ŕ/������=��9�N$��Ncr!wVz��:��)���Kb�4�=#��"C��H�[�����U:�{xWl�ɍ��MM�lr�@A��G���
~�C��P{��Y@G�`;�k�_i��W1�:�4�:l2:��I����\���q�FF�[���H�s>��JL^&'7��;�SCN8�$W�8*��%��*`́tL� �0�ə�Ͱ�
QY�s!��V�dڒ�`nȚ�H����W�F���\�=��9ʼû��aDww�l��Y��t�ԭn�i��-P��L'�L���6���`F^�M�+�oI���y���Z�
���m��ETq��/O�3J��g�ԇN�zkO�ז@�K��6:�����I�N��&6����=�
�F�(�
+A�t��AO�8j�����@��Y��>�&=|
�����qz�g�5�'$��(��im��lt��������fVv�L�_˻���8�������=��� ��_;��(<mS#v�j��:�U8�N�h��x�z��U7�v�C�O~���ּ-�,�b�r�{���f�8�3x�I*�Ԥf�j���g��yI�X^� ��vW���jx���͓G��R���)�n�.�>ד��'O!��Hm@�S9��M�/����u��h�s��|dw9���~����"�ڬ��zmiA�?D�v4�QAsF�4�ԉ�="`s�R}V����w��J��uT����STm|�ƥ-wm�xú`���͹��m���h�C��N���`��8��&å���^�]6x��$E�Z�C���ư�D���V_E��o��W��pAj�H]�QI��Y��Wib�V�vO�~��-���:T�T�
N��K66���J#�������N����bp�Ցӕ�d��e�
?�5�M�%�R=	$�],�W��62�t�z�nz3XG|�_��o�oW[�/��ٓ��1�/Z�����]f�+�o!����q2�@{�e�k��r�L�g;��F�Y
�� �6���kYZ��3��O"��FHK&�C(t�B���镞�Z�O��C)����,��^�Sx?������
�}́ܮ$��'���C�0�%&�R��\v3��gz]>o(��>�������t��k�d�5ـ唏�f�I%X]���̿������Em�(!GuwU���H�fwg�ۜ�#Gq��ȕ��ċ�PWG�q0Z]��`�X ���T}�����[�-[v��V���60Cu䞬�����2P��7>nUߖDR���=NC�
1 �]�
��/*�J��R`�@��&8�q�a	�H��p:�H�n�1n5�z\�|D�s���Ȯ�0��\���3��h0}�����h�Xd��
�)V�l�u�C�A:/��/mW�ٸO͵�K��Fp���7Dt�8�<����ˎlN4o������?kׯ����[W������?��>�1[}Y�������/�#�v.��9���9��N/V�}ifN~"b�o��uYu!��pmZ���O��d {��O$�u�O�g��d�W���(w�ƹ����tnْ�\�+���j�"�S39w�NW��G_��h�����f�j��U}?�f���{���\�ç/(�P�g|�pѸ[���/J���1����&Օ)>��g�U)*6��"��'}
��w�t��b�$��;
aY�_��᠓w��	��
M��<��%���#���|G�����k���f���e�V������u�j��ձ���#a
I`�xa��wwr��t��M�/��a0l��u|���!TEK���!x��T�W$s�JR*�T�|��|4,���D_�u�:S���B,ܛэ�����G�I_e�*�╊���=�u���������Ar����<��<v�6�����D}
�yr����Q�no��R|l	t�z���Z��[x�LMܶ7���w�u[�{������*�o{�Z
_7l+�����9-zv�PK/WUW�R�?Y�$pip/_vendor/urllib3/contrib/socks.py�ko�F�;łAPɐ��"*Z��K���\Q�YD(.�]Z������|��6�`����y����Ś�"�˻�5j��'�a7�\��Ț�T</%�jq��\��`��*Q+�5���_[���d�Z�)W����(��?"�ӳ���]���l�K��ă���X�/�@<CR�A�wH(G��L�)W��5Ci/
v}ފ�d�[B�d`%!)q��$��[�_�(@��+?Vm@|:�	o� Ś�w@�Zm��jj�{�/��H�(�	�n8�8֝-noɠ��n���]��2����e8	7{f4��(��o�Sh�sx�H��sh>�;	uɏ�1Vq)O�Τ��ZT��(b%��cd)��RqD[g�1%X#[�h��?HȮhs�L@1ܐ�Y4�J��F��Q��hmQ4ڟ�5%��%���*so�	xFN�a-���%��0љȆ#�#F6� �>j���J[��]:߷g �nzV�Ո2|?%��B��F{c���!����=�t�)���E��v���!�q�wk���b�`�.��a}�cV��A���uav�|n(���]�T�CJ=�S�L������dSZ:b���f��V��c��nӤ>S]�������@w��:2�d�P�HJH�y�N�0$�;T}�G�hF|J�R�^{Uע��x]�Q�S��"�����%Tt*��� x���B/�ӽ���p��%J
�Ϣ6�M��E��L^ga�Z�D�b3YA���#E�����ט(��&��|���
=Cr�*��p��ƣ��d"�Q..���&�����%��:�Eu,�hۮm��(.W���bfk���<��)P��@� ��e�)8�A4���1�h�C)Π�tss��]]��m�0F��(���qgD����pVL�׊��S���E��K~G	�P ��6K
Sx��H�k	t�&N�,f��
{�e ����h�K'ۢ�������YU`^+���*̳�.:�[�����e�B�R�/���e��d!�د���$�\|<ћ���(ѱ�k�
3`h�j�7�e��TP/Z�4�e�
0d��X�)!����L�&���+ry@�޷
�a�D�4tC�|<�b�ٮ�{���r�B³ӈ�{G�a����Hk;��N'�Yo���S��;�md���BH:u���0�w��'Sz��#��a���z�c��:W���#�L�š^#�0G��3M���R5�M�=�M��خBNSp�p�euF�;�_g��ƥ�)<��
��C]\���m-/�u��%�~��"2�W���h5|�e)��J-<6�����F`��S�G$������q��	�k2�+W��37�4T�'6�9@��g��/WTЏ��߁N'�,�ؕ�i��>=���L�%R5D=<��.�#�M}��F@H�d�g�`j]ϓ�1ez>å�v�{�����hW�g96^!�!���ћ��9��n�a��Ĩw��kG<B�i1?OĿ"ވ�\:���K�Ӽx�_��CDSd��k��X�B[O�p�1�6[O�{���+�t�
=a������w�}eY.q4AM� R��e'HT����̐r�H j���L~�����=AC��RQ���Db�M��%_$���1��Φ�3L�������w��h��9E�2.�Y9��oM$Ɲ��&�x�w��/�K�[|QP�9`:&����}<��ң�+���l0��m��n)�����՘�p�bH�6յ�y���o�ihI�� ��91WSԹv�-͛a<g�UP���)�?'Ɔ�|�Ql� ������ǃt]S�l�	�(7�|ݭ����5�ku�ʧ���ӎm�V�e�wrR+@|z׋�E��M
��B�~:��a��k�#���_�y8���m6��qepҭ:�6����e�bb��MP8��o�۩�??�������W���q�E�׼�(`z�r\o��qL��ϫ����r\��SO�E�����)��������f�_�c��9�f�s��݃���yq_�~���s�3�n�����ւ���������+nO�BOY�v@��]�s�o�+����Aܻ���'R�W.��=#w��� 3���PK/WUW8pip/_vendor/urllib3/contrib/_securetransport/__init__.pyPK/WUW.�-M��D8pip/_vendor/urllib3/contrib/_securetransport/bindings.py�ko�H�;����j@��k2���1�&��VȘ&�bl�y쯿�n���8����hw׻���_�f����!�{�ء$iH��͇�"��mwCL��o�֎x[����!1�ۂ��F!�޾aP+�20����K�;J=�!;Pb3�~�=�J"�s���}����YJ!��l�ԍl�q���`VH���}d?�Q�F/dB�x�y��]��m`y&�I�&6vH7�!�Fő%�z1�]�`;���͇�x�����c�3x뒁K��{/Ɇ�#$�Mླ�@& k��v�6�&0m�5�a����7#P3���a�;/v6dM��`ʀSe
��k�E;�~#q�@gB�ˢ.Zd�!��K�A��o����H�j��^��#�s�)I��?�����]�F��xs��	��a^��a�^A)�ڙ�#���F|0+Zu���0-d�R���^p�Qb3=�6�&�xV�G0q���v�[[88M#�h�;�0�P�=*��lؽ-F��|�@�oP���{�s�Ԁ3�������co��T��c����8���p�@�萂q��
:$.&�d���
%&㾻��(�Z�ɶq�k�
L�8��Z� ���@̡��;��M������}��"�����g��t�;Ht=n@���U�TP����kN�n"ǭN��h�0X�dl��b�m<ԇ�90��!����~Ib1�.��و������C�_��0�l�ȍ�擱��6���_�
�NgK2ߍ�@x9cLrc�@�w�B����x2^~��6/�H{4[��˱v?,�~1�:�1���t�N��>]v�3��|�v0� ;Fop�,PV����㯷Kr;�uh��A��D��@Am2�u�pp7��3�P�z"(��<��،|�W[�gSTI�M���Ƌe��06�,����\̀
��f��NuN	ͯ�����2
��hH@F�6�0��AV�mA�_���G�=�fſ���w����%�T���9l8��q�F�Sm�}���l<]��a�֞礿�"*~c�Z���v��S��x�ڿ�U$�b.��={��ڲ��8�4�Ƚ�9v�L
��v}�z24�_$L!]�Y�aoSct÷0��V���4�f���32f�zxA�9sa�ܛ��t�>��M��h���:#
�+hn��&��*[���whko�-P�#��n�;v�jv��v�T��IZ�^�\�e� h�l�	�p!A�_H�׽b�ǥ/4`E@*s�)�6SܟHK�rw~��f��pcC�P����q��k�!��^���+ߌv�����]�O��$��t
���^\��L	�/�������K*��ɍ�H�8`5�v�m�¦߇R+"/���&�"}'X�5��d�(�c��Cq���,?���Cѿlg2�&�u�)uBZ� �13e[�#��*�2���f�8����2]>H.�!���vl<ZH��[� p��e'�W���`��Ϣ��΁��[0���gSt�&�ӭC��KчX�jCay-����U��`Qz2�OF��4<`ݭhK���84/�#,8y�Sd�4y�9�PE��(��7�*���y�lh������s4P渏��)��u��oh�{^��0�V�A`��Mwqd�Z�3�%���HiZB�-���\F&~Ҷ�dp-�ok�dP.Yf� �Ԙ�P�_������'�m�T�|/om#�Yc;g�<���V,T�%�I9j�wn �UV����f:1-���(|[�pQ����P�kD�t`峇u��FR��:լ{���a�v�<b&������1̓���s�+Z,�A�`��,��<�"����1�l�IFlG4���5:������Qp)ᰙv	n;Q�	Y��GԢi2]\��Nx����',�5錘�@e��d�E�5�5��i�u��4��Fa��c������|���AR�JT$����C�•,7�HK���_i��b�"�R���ȦE^"�2*�����@�C[R](��`G;�<��:?t2�<h��L�B�<,��H�D��M��P���${1
�u
{�~�4U��/'#���s�keF��J����j��`�f��(<(O��y�S(WA]��y��[�zS�$��!I[)Uj���=�
am�SOeZ�-A��m��f�O�=�(�ec�q���dA��(v-���&E+���RG��D�-�>��@5U���(K����1���x�LCuP�2�#��QD͛P!x|���� ��s��I�mJ�&�j���89ޙה�|_�ȣ�h�A�M�?�}"�E&\W�ԥ�x��{�d���Coib
e֟��:bܚ�&ܙO�YeHuX`�O��P.
������/�ӭ#��x��ꐆ�p�׸(K���`h�P��nM�ʓU3�`Ź]Yr��R
�'�rIj������_#��_�9��r�r��'��@���?hN��E��#։������}�<bW�[r~�d���i���&���.M-�e{E%�S��)�$���<��0_���
���8x|�"��2UTAG)�J6��P�"�Hl�F*O��_��N�b7���gy�ΎjqD���0�Z�b��5wg��$L����V����g'���Ϫ�W�Krˁ[:w*{�GJk�p����[f�I��>&�@(����~P�ϔ�|��C9�͑L�SA��rL͈Gi�H�8ɹ� Jn�7�N�r�xx�n����� ��m�����-�|���%��t��F]T:�������r�0�4Tny��RCyzL!�W�t�Sl, N�
m*�tZ�O��t42�w���k���|[��!�j�d���%;,I�#�d|���C-wD�{�7֕;i�F��s'��oQ�Giܔ @�ϭ��3�8��P�������/>BҾzI2::}7���i��2Y
�b��y�L�_�;(�J3�I(]S�*��������cȾ�(��I9nᗜ����=)��<D��$�	$�P�1���P��`V�UX7o-�P-�U6���Q���:���=�6Mvxr��ĥ�o��C�wQ�_A?e��3���2�qQ�ȱ4YB�~���y��*���A�"Ɋ�*��&�ݦ�)�	-�˲�nbRa��ݔ�E�H��>N��\Ͱ0�����Ժ9J`1���c9��T��$9ƐnM(r��I�R��TX���Uf�'FO坺Z���s<zS�6�rJ��Ƞ�R�$yKI��^% �.��k�Uޑ�-r�G�bo�K�v�U}~��vm|2c�Wb��^�oX,|�����Z{�]Vg��?��̴��T�O�Lv�9�M���g�j�T����r`?���rt%YK4�z���^���2��2�/PA��<�av�i�4x�����Vl�Bs��z���u91DkZϋ���،�������$r'ޡO?@$�������>�������vT䃲�{��;�5�1�&�?Δ�,��̴�!�����ڊZ|s`���1u-�9������}��0��n΢L�~b�R����Մsȅ-�8�~�o�^�;r��Ƕv��m�b6��*�k��	0�.n������P���L��2�e�1q�g�#�v``��|E���,��x��ei��W?C�I]�f�f����L�d'囯�6���7�"{������ݓ�_ʂ��;��cec�@�d�Aj��Y��|�)a+k�d�W�hB������"B���zݻ������Cq*AL�\�l�[/��ȝ��[;r.��)[z��Ü��`�Ch&���]�d#<@�B8���=8�3��I�^�&�r���}�8��;�KP�f�[�{I$_��7�P���tջ����81� ��\������L�M3�?�Mx�����}���i��ƶV!��x6H(��m|r��/|a̼г�����I���
�$�]�ᗓ�
� �|<���V]�۟(�O�d.9�_\�`�?����,VL���Q�-u�k�[�5+|)������r�U�[����sLx�Z�T�!-������^	$�|n�)GU��n���&�g�U|��v�*E�c�^���D+@Џ��v��F��(Q�j�I0z��L���a[%Й�7����Y�h}v�͊(�j����r���a)�S-a��|
����VM� ���E����Q�	��/*4�x�+0%&��
`�r�.J�T���PK/WUW�*��Yb69pip/_vendor/urllib3/contrib/_securetransport/low_level.py�mo۸���š��җ�ِ��]��)�t��+Z�c]dQGJq�a�}�)��ݦݾ,@�">�od�����<*՝*�J��2V,��J���[����l�M#�E�(���F�+e��F�w�f�+�l��)tea�l�K��(�ʛr+�*e���zUܬܮ��.�h޺5*W�J�ʼn7���k|�hs�
�v+�*/��.6+]*1��WB/E�)�i�^�ZH�I�& .�\�>�F�6Y�Jި���-r]��E;V���-�Q��Z�F�\�	(b`��"d�P��\*yki����6�5<צ>З֪e[
	��F��!s�q��B��1�X��U??�oy����oE�L�u�
���(�dm�=6���֨u�,�����H����~���LE��)+J�lG��F`�Q7m)�P�k���(L
pc�\�;#`��E����z3x��ί�g�չ8�i��5 ����Ǐ���/oλxuqvz}N��UI��_'�U�v���Ό�!���>}�z4�F�Y�������Fل�oparL� �/ŝ��~�T�F�l�Q/������Y���o��6L��/W
��4ߒ"�,�I���jZS
D�2�3B�9�?�I�g�N�R���ZʶY���
)&8w
�q0O�Q��%0�`P	ʍ�u~���P�u^�s*�b���m�O����G4���é��`��U[��;Y�ʒޑ�+a�Z	m��4�D$�ǣO�
i��
g84��9�0hGZ�`�W�՟��M��pQ���`�2Ǚ�*�-����:2�޾ 8��FHU�������o�W�����;���~PZ���Qs�)D�=#�`]����B�|C�3X�e��Y��&�;̼��1,�E�:��!��=�a���!�����s��@�ˎ����d��MJ���C�e��M�i9/�)B��@�C
��JV�C�x��f�ύ+�TF%�=i-��[])���<ޑ��brX�"�V1��Q��g�5j9t�.o
�~��{*���1���$�PZC,J��+$�rFU���q]"�#k� �h���q�$��c���
V;�; '�ӺVՂ�I�̙:�b�K�ٲ�X��IE}�U݈0~N��/I+�q(�}�x��#�
5}/�Ȃ�ŏv,~��N�f�|�x���*0QM��윕LM��Y�_Rb�S���=�l�g�")�ء��(y_z�&&���Xq��� 7]�kJ�}}�y(
`:Y�ϱ������Yxgi&n��]^��>�J:��k&.�:z�_T�\�;0�NP�_�Ł+
q[q�zM��˥
C
;h'=��<>z�,�e����؛��Ч�߇�� Gz�f�_��9ef��ʱ�H�f�,����껬�cvv�!](R�q�,=G�3��@��,�tF���Sg���,/a�	�64���MA��"�f����
űS�f-��сE�a:O99Gǁ�N#�hJ��k�΀�$�7X��(��>���@�]�
��=�c�	�����g{Z�.�u��h���v|9�5�i�s}�o:���5�ᄓ�Ӻ$��u03a�����0X�Z'�/�P	J1���Ի�R��ZB��B��G)*t���n�3�*s�H�|�&Q,8�ʼn2Ԣ�=�`�SbQ����-dv��F8�'�Կ�����U2�f~��<��j�d
uYƤ����W�>H:���3@�6_�7F�u�x2��Acȑ���.��р��K�?y�S����Ğ8�V�1W��Ų�)��Z����^�ߚ%~K�d�ߛNB�X�_L�v�e
r��
(�=��L�&����Lb������!NC��K�/Ȱ!��l}���G<Z#q�+��9�ܘ�E�`�9?�$z��Թ�"&�h�2�.;�>K�������q�΁2L
��4��+�87�j�B�W�uQT� v{,4.��Ai��+����%ǔ2�){��g�xQX�����p���_�V��E�7�� tZ�cW���a�}P�!DP/�(��!��Ghb��:�f���i����%n�l�k�]�[��`�(��j�������̅_��Q�!(�����Q�("C�����-�7@�գ�����|/(kwĖ��m�-�H�&�D��+y���=j(+��o�;?a�C�on"��e�$-��;��G0g@x	��*��~+&2�*ܐ�c$�Y����jN,�t
�k8��Uk-6�I�
\I�V �r;
wb��C�i��~?��E�@���-X��Q��[���*|�V�2E>�R*.�zRr1u�6�!��F�#��E�/�Id�#�
��n+�R�����e�{��Z@���^A��M�,tP�+vЬ �R���QmtCz�
��!2�@n�'�-�
ώ"��ˮq��'B۴����uG�I�9>�YU�9��??�4�[�u�5Ϗ?M�7N�)�P�>�����;wK׷|N\��l�H��*|Jy'�iG�$uu���0�7]ls�q�h�*�i���i��ܥ�i���BD�7y�N�������q'��?��w
kƩ#�WyG���YD4O�=Oj*���"lܻ��/�D�c@��"�a9SE�$�$�@�G���p��XLE�mT%ο�?Pt��t��ʸ���Ď;�08wY�L-x�|3ޅ��k0�E
FAN�O��}�'� (�\A�A�Ǹ�ӕD�W�܄�I7PK�f>�`?t� �+�P@�E����g�����&�#}7�}��
�_2L\@�.�D>ƺ�t���"�
>�r�1g�@�o��'�����T�G�Hu)}(,Y�BW��`�~��cW���ˎh��|�,������5�+c�.��=�+��۱[�7�M�`��� @>���5`�B�N���=:��xqPQ=�]�Ƶ��	w[��6��(�V���3��(�t�ngP��5]��>7F��뽊s� �@U����=��^�J�b���������i0����DK�B.�=��摃I�m<K��b�G}����(p��7*	�N�◎�������6��&�}��ޖ��et����ԏ���9>#%
\q*��3S����7�=���;�e�A��{�q�*�"���a8O�H�lE�,`7h����O���_^ê8ҽ3��+�_�N��v=�*
��*�W�웂�ʒ��×��u�U,txVQ�ZЯio��TFc#|����+y���w�Ԁ$c�j��DH'%�/o�5b��4����RÀ��MH� �o������tX닭n��@���o�fP��C-��M��d+I��`ڠ��g]��D�3B	�D~�xnHg��,{A��X�[i��ڦ��M���c����ʂ�q}	�KQmO,�b�(r��:Ӑzʓ0d�8�{jCZ#��8��uY��B�y��T���4�F�S���q.��e�DT�(3��N�H��dގ��`QYC�����P7��C���@Ԧ�C�aîK�e	j��N����(S���7-:+Z��2(H�P�����W�E���؁�[��]�����D���֖lV�Q���\�n
�p�IWp��22"��i�k�nmp�Ɓ�����s�{=R_���ߜy0�!�S��yD�r�GQ��A� Pk��yQ0�Y���tݒ����)��;3~.u��Zs����7��R	6�eW��t��*�3�RGm��v5�l�zFm3�ѥ\;� ���/�2,�~E�[
�~��T�!$Q�r�q��W���4��C_ ,S�z�=E��w�6Y\���}�L�`r�>����x�ݓ�.
�Qʍ�ʻ��69i�i��*�n��@�>�~�_�/��G}��B~l�\H��jz�ru{��א���I�w{��\��	����ӠC"c����K#c���&��̏��)n0���bn��5�08�q����7���q:u�u�M"%s����$
��<䇱��C���@��o��7/v��r^}0?Hgx�H��"�L0�D.�Fh��z��CM��*���k1�ܲ�Z������I[��_Q����@|S�5QPS4
�쯗�}��Tb����Y�������u��������ۿ8ɇ�u�d|,���x�$L�Oq��T�At��
>�S?�$~↟��}
Fƒ5���
k�*�e&K���]��ʯ���
��ͱ{����ሳ�@e���}�dc{����ɵF�<R����5G���З���)��O�;�xzD3��]&k�&��f��_^�O@�@M<��T���x�Hs�F�좍�9��g�����Nwx3��Nğ�1��y��?PK/WUW(pip/_vendor/urllib3/packages/__init__.pyPK/WUW\��&!i�#pip/_vendor/urllib3/packages/six.py�=�s�6���)ө�*��N{w��S�q����N�^�M��Ś"U>l��|�����d9w��D$��X,v��g�(^���f���l(�^�z�b���K�VFx� 2�IG�g�g�,�4
�H�X�DN��&�L�#1O��\�^r#G"���Ŋ�E<ͼ 
���
�6[�4�g�^"�^�Ƴ��g�RF��a�� ��d)��
�?�b|�@��\�)�l�Hd�%���h�>��`�2�đ9 ��P�v$����WR�V�4��H���$��8�bA]�5ND*Cd
h�=ո���
6S�J1�~/˵	��y�DP�$,?�Q��Y�)�0��0��
����^�j�+���*q�Gq3����UV���PL��
r�J�J��4=�P��
���a&>���W�'�b|).&翎����Kx�ħ�Շ�W &�gW������w��ٻ�8��br|y)�'@l|zq2>�������w�_�[�<;�'�����:�"���%�;=�}��÷����# �~|u�tߟOġ�8�\��>�N������1������O�����+ʅ4q�+����''XP;�u� ������W��ɻcH|{��=9� jG'��ӑxwxz��1a��!2��ӇcL�2�����+st~v5���ure�?�/�G�p2�D�����b5Q��sNd�����m ����ؐ�O��%"sE5�����Y�ƁN�A)�x&=�%h����Z�WY��Eb��n{�y
��<��"X����q���{����y4��8LuB~���*{Y��tm���J����z9�@i�_sy�ǩJ�yE�:qr�S�� 4��^9�~p^B
@S9�C�<����^�J��W���4�L�B����{@8s4� �ǟ_~b��۳�1�uc���/�1���C�\蛞�?tVэK��������I�	*k�W.2�A�d�!��#K(mD^�֩�u��ƌ���.�}�X^zi���0�ͼM�TrZ�"���v>���#̺��:�y��6�5����*�2hۥ�.�R�@�?�;�?���3��^x�S�CR�����1P�,���+��b��P����B,Lt�}�9�<
%����%�$�/��b��fâH���mSwaq�������z}ּ���ӌ�b�g�d]*��áI�3���9h����$��2�3���P)q���rbZ?�ފ��Z��o�^^3U�K�7�`����oJWr�b�ƞ/[�+YP�YIp$h�]�n��F�(q�'<��Q���g��$� �q�
�!��ę;�<���[ʂ��9缑jR���Qs����(&ʙ)���]�۳�l�(��1���*�x���t��u�u��L)�HXܒ!�4�!��,�Y�Y0�	1_fh�H…�8����EěG����B��Ew�-��X�Ӯ�[A��<�s�߄*BPݒ���O��S�F���7V�$r� E��s*�j�A��V%j�w�����V�mI���e`��BF��թh��F�6	aL�T|�Ms�M�|�*�:ؽ���Q�H��0Si��L�<y��B,@���uZ�*.Rɭbz�ʰ���xFX�bQR��{�9�+BW3Q��wQʈQ�U�)�l�������;��[jc�Ԇ6�g�^�f�[�~��;*�$v���
�E��
�w�O�_0d�7�p�K�P�Ӧ�~�ʍ�0S�Sb�E
�����$E�[X�$�lf�Tgi�dm��)X����fS4��l�Xr�E������s㴑 ]�v �A50�u_Ѐ���WC�V�[���Zo���h�j�ߍ��x�VW�!�h/����aOd<�e�p
`^��CZ���L�P,��l��,�Dbp�PJ�F��q�A�S�~���Pb�������=1"���3�g�b�81���1�&j���=OP�!�AJC[5��7j3Z�����T��0�Q|�l�"���U�V����H<��i��R�@�z:=��i��R��V�}��k\�b�C��Ҡ��q%e`�6�1"m�z>0/��b����r�a}�����F���Me�1(
#����ݪYj�n{;��aU�7�n�;/H�`@ك>ٮ/�1(vg�n�n|+�B��ׄ�g^Js�T�4���<������m,�5��!H�gTgr@�k�˕�9������z�C�JcL�Ux���*����d�Aꮼ٭w�����߄idI��<1����i(�H:�\�'�R�UC_��i&�	�;Ip�Bp���7�ʑ�;�p)�Ox��5��T�\x���[Z�bL�n�1-�DP�V�Ǥj�,�?� ���,��tiҷ����\�F�֚�.�ͮ�K �4Γ�mPu�^�~�KMZQ�Y"�L�mۣ�ї���a��pծ�lda��k����xC���Lj��ej�T��ɹ`ON��w�Z��׍O�<�g�%�(�n�]S�Oȕ��?�����9]J/A������P[����2�!
e0꩙V��6����(�_*��+�k�:�Vyƃ5�)��l���5p��J
�ȁsk�Yz�n�)�i!�0��(N��95/�ѧ��Ӵ?�3%c���WI<�ik�/���`��a��pw������Q�!�k�(�J!�N��Ϛh����
��P>��qF�`%YT���Ղm[e�B[0>�2y̨i��Y���u[YE�lhT��%*󧑋�-���Z�
6����M�0.�wHD�7�@گ5�R3^%��z7���hܬp�����_�{BQK��7��G�Y-�b�%){�O����-�i5Wc�N�R�����&8�to"ve���`RxT�ipJ��������L����������Z0e"M�/�l�M|�?��e�/����"{���+�i�2tq�8S��@�k�L�c@Z������¼��US�a%h�K5�&L���]l�-�P�s:>=~[JA ��6���Bi\N"R���2���gez��d�Y�w�U@G-e@h�VL	�U)�Rp�L���BT	���Ç���K�ܱB�S��S~m�q�˸�PK�Dᒆ3e���Mtf�얣�q�OM�2'����&�D�����Ƴ[����~�Ψq;�_<��&�얂Y�R�`�xaL���yRy���B�v���V'c�t�Jg	�=�V�K���T�+�u$�(�c=��W��"��]�F��N��ՏƂ�.,hw\�
Yz�4����|��L�F�
�q2[ı�����)����r��8��z�� ;�{[V��IJ8�#�l�͓"��^u	�%�L��ҎS~��ł�VU{�۝�7OB�Kܱ��נ�qZq*
�{�.���:IjM���Iv����2��qV�5�WŘ��D�a&���p�r����(���m�vz2�8*:.E�躾��P��A��)͍�`&�"Ve�n���^���SI�鹤����zW=��|���M��Io0(&�x#��)S�7(�W�^��	k3O���T��g�I~Sʰ�{�x��⣾:��~մ^��s}5��{�|Q�f�?�V�i]��� ˵Mn��DZ�ы�e�i�^���g)ޟ�fe���=�1�;:3�g��pd��aR���GD;����MQ�;���SJΣ��6�hƫo���<}<n�X�Bܭ�b���d�K��;H�D��*b��&Б��<��Ԙ0�I�;�f�t�����G��6�5��ƾT]���	D2�����-wrt�n�����m4�/�N��K)G��]CLP�ٝ�ͽx'_���ZI��[�)+����z�6��樀��p�]�
(i��������u��*���{c.0ѫ8�\���Fs7T�����),��٩��|�Jc��,�~�z4)��٬����f_Me��Ҫ����╌�5OѺ$c�0t��lQ�
$p)�
�%�
��z���4�]�od�J⇠%`ـ=Qٻ����.��9m�c	t<��܃�9�^�;6ҚH��y*^Թ����0Bs�O��8��8�Oo�
�OA�P�5�^�܉��4�o�A���a�-�ZɯB���P�{��ר�סD5�zL=��)p�I�O�ț-�i|�h��S�H~�i�
�	o�n��f��|�6������E���(`߹�q;n8�	��3��;v�L�V�y����-��.�V�;�
�3�n�n�@�D���tE��`Zg6��E�6u����85�	VCjN�>�9�M
���hQF���q*�J��<�=�.�ی�EV�Z��h���Z���vXBY�USP�Ͷ`2�0�bm��ك��W6�"c{�� �~���[4���-��������*Ǫ�
�ؼ�h����
X_��r���7jb���Z��C��T��RIW�L�h#S���Wx�	��¤��3"拯/Q��GMS�����S�G��:�-1M_�p��F���ږ���W��|��p�y����W�Ŀ�v��v���WB�RO�i��bs�/�S����S�������yQ΁ȩ2�X	�I*�L(����N��>��GO�J->^�p�D�<�]\6�,s�Ϗ���\ؠ���ق��7I_|#�֣!�����/�\�\rr��u�Vj���q&Ab��'��ՋAg�b��ᩜ���H���s�S/T �!���U���T��Ƕ
��M50/mU(%��~�^���������]�	�C�S������}edu�2�����V�l6f^zS��]?v��a�c�z�^�`�㼳�Lj�{#����-��)UD�I��i]5%�ṣi�G��O��:*��էy����<P�c��+v��O�ti��,��i�4�b�qъ�)}}Z5��5ll�j]X��8pd�)���p �j
jw-���\X6in�Y\VI}V��N�ת���)�hj�v
�ȌO�T�Oɤ���ck�&;�X꽩�$j�:���� �8�����U;W1t�kD�][��[Tp,�׎��*��/lGU0���N�V������!�! ���i��f|�D!�]t�0T>�\m�g(�.��X-[x�4�߀��ܾ͕h��|��nG�l����ͭB�H�Fy\�0��$�jF��Q��Vsl��Q-b`�*q����6��0�Ć|�Ձ|��'{��
�6fi%U�M���;I
�+}Z�	���,	ʴ�V�?3�_Z���t���oT�qR��=<�18�\`��s�1?Y�C�IQ����4NHv.�g��m���Y�j<|E�=���%�<�K}��/h+�
0j����f3��E�
0�Ď~�����sԋa����SÒ������1R��q@��e��W_ď╵Śq't��D�ȇ������0*�u�e��ުh��Ux�RF)@�%o[����U�ݬ�,�Oqr�%���֙�^������-6(�:Rv�:�\��L����	���!�%W�3o%����
`RQ��iq�C��_lwo�}0��#����ρƳ-�|X������?�\�}hۈ������˖�a4�`Y��~ke��O<���&Br�!�Z�:�|����f�*5VG�<����{g|RMV9~�AkB�إ�,��\�EcSiO+g�t��\�&�X�=sD'�X�p�$�><g��I�U�l�:��Ȧ�s�j�cP$��z�>
4[Y�>٨08�M&]�Χjeӆ�i:���ܤo�M��-P�>"<b�LW�G�
����\��$�O�A��p(u�A�n��K� �c@�3�G����c���5�f��u�t�8M�W��k
������n{���W�`�@�Ŝh���!��fS�L@�"��*���e��܁-�t��Ǭ+%�^��*�[LY]-����D��.6�`: o�J���8�ne�5����f�K�]�\��-ب��^AW�u:�������P�F8���J��W�D�E��C���A���t��}ɮ�+�	;�xEQ�
6]��q��N��F�e�\����-r�{�7�9Gte֗�4ŵ
��#�%�d	��Qt�=���C(���$upLJ��SejP+�bqv�ԇ5 :ҴZUV3�|�h�_����BXj����c�Q�Z���x]C��W����Ѫ�HQ(3��q�E8��i��xИ�LeU'!�V?t/re���dV�h�&u	T��J�rc���,�LKg��?v	8������e�fxR-��7�x�ڌ�u�c�Wj.鴀Z�%��V5Я]s"�e͑�-j�p��
-rA�6�q�7,@��`��	��`X&��ە��
�NrC�G��0�K��T�M��ڌ�3	�="�ƓA��Q�li�������D�H��Ph0�����V����Y�E?
�t[�Z5�2�xZ�>�E&?̔���@�H�$`�+J�Qȥk�c=P]�#�h���ٿ��<]T�cLxr�(3T�X2bj�ݴ;��H+�f����4`+���T�e&�f�,��Z�A]�A'�o��k��8�{܌�oo0lys�Z�)�+��x���Z��Z�3�,��2�z�M(���.3��s}�*R��^kjf�R���e]�5Pud9�}��B�wd����sE
˱6i�s����k�7�ԑ�5W��)�7�;)j�߰��s��X
N	�J�_$h6
I�^\O�����/gxI�e��l�x����X�V(��tieͫ���zG��rG�mqE
��bh��֫5]��
MZ.߰k��R&u�Df�Ty�X����?��j:���L�s1������uº��ͦ�t`FZզ�S�6&�g-ˣ�rEF�ӃB��S�02̨_CP�T�F��rz�Fʨ���-����h���_�H���e6-b��b@�OT3jS�4�æ��E1ο�B/���ސ��N"���w��Щ����Oz�Z(�dHׁ�-.�~Hu�&m����/r�UsV��~3<����Z!����F+w�,L�
)x\8G)~=h�`��4��!@S���A��x��G���x�+h˶�
I;K<1C�=�GϽYSgF]�9�D�)N��:���J��=*�S�>�ơ]]u�����x�N�7����@���q[Gԇ�CC��\�c1��$���]X��y�/�Y���`����hJ�=��h�3j	O&q/���C���ϒAӓeͤ龜ż���Eۑ����]r�إ�w*Q��y4L��!��_��˜w�hx�<]�2�{K�z�q4�
�t����K)���x`�>��:��g
ư.���j���=��9o�*��H��`�S�����`_L����P�d���S9*�(k���I
eD�V���A:2�]�<�������9�3:���/x�<}�\oR�.�T�6��f�^�k5¼/~Rkt��5�r]@�Bpr���:�M��--j�N�,�#VTtd_ڴZ܈c.��'�<�U��@C��p��J�o�I��̼�o8,7"Nj�ւ�s#���V�(
�_��"�9�q�2�KE+��J�ż߅���^�dJ|譀f{���i�'51͂᥾u�ݺ���V���1�����s%I�0��O�@� ���5Ѽ4(���S�G:�-s{�S8v��G�\�{z�-�Cܖ��=TaH�P����.N�t\Ry]<s����.c3KKD򣝶�gLP�����
��X���U�: ��P-c�8R<AV�	K�I8�5�ny[�hz)(U.f�RG,gQ���UA}6����_q������hpoE�@S�+/}`��`f^�J{.J�F1<:���J�Ẹ��v>0iD���?������F_`d�zO!{���!Rt�Q�ǮfR]_��}�+���j��`(Ƴ�8{��5R|����-��t����P�o�à/����}ߧF��Džx� �>���a2!�o��%��J��y"�X��&�f8a�v��tP���A�Y�u�c.KtS�%�m7��!ӊ7�3�!*������3�>KW�pY#�ADGʵ`E[%1�/SG����
�MD�g��Zq
��E�6�;bp	���Y���3n�K	�^
�?�S��(�KD��;�JK%�ҽ�d"�MM	!&�H��o�a�b�k��g��,(֙ep��,�`�s���h�!�J�eݓ]�}��]�uu���[��E�Wk�Y����k�!](o�L	�����W?�ρ�(�=��ze�E݋FgB�7]�UvZ%�0�Z��N�)��'��&����Ŋm�-���=o���de_BJ>�"Y��8�R���?0�{�PK/WUW2pip/_vendor/urllib3/packages/backports/__init__.pyPK/WUW޸c�H�2pip/_vendor/urllib3/packages/backports/makefile.pyu�]k�0��+�xK���R_�,��XK?�M��ǫV[
�</��O��׸�h#��<��ձ_��v����9���}t;�RJ�l�����a�X��ߓ���$�p}0R�{�l��=��7h�K���V#t�<6�V��̐�	��S�Z�|
r�w&���ƕ.I�d�q�֯�W��+HgY�n&죱�������mU���_��)�֤�RR���\�_����\[��d5j�o8Y��K�ilof�:�ࢀ'��ܟ-���G1n����箻	���y�Og
&R�PS��յ��(���O���:ō���U.|��؛(cD��w躌i^ȴF{椷�at�SG�>��m�7 2���7��$��qYGޢ�<L•G]�OA�O�Za��]��Op
���f#	�v\�e�y��t��n}y�X�oַ���S@Q	q4�����AhE�`	�XC
M�m6F͎��i�p�<��~��6p8�e,r��f\M,��;x�B���u�dEI'=p?�p�^b�����ю ��@����W+�{��"}$��C֧�q�/���b�PK/WUW
�+v��:pip/_vendor/urllib3/packages/backports/weakref_finalize.py�X[o�6~ׯ �G���!]���
(�a(Ї Ph��YK�ARq����;��ŲӮ��)�|��C]��kV�R��
k]u�3�$��"Y�b����� �Έ*���[$��~I�:�3����m�b?�����E���-3RSݰ<�Z���L6(���u�D�O��.�0N����Y/#��5I��5�ew�c+�I�5��o�z�Qny�0��߈�҆�$�����׵`���XԊU�*V슛�����oK�F+�8+'Ɉ|��x�찕Ŗd]�� ZQ¢PH��en�|[�
'ʌ�ߊ�Xǜl���lA�tL<��NX��"�P�U�FIFضv{UAH`Eڹ�R�r��$�A�����u��?�Q|@�P����
O2���.��|D�s\0lx8#א?�™V��3�bR��G13%@�@FPP=��`�8%9YL��^.؛��~Vj��c[�(�u 5D	T�1�NǸA���n�Nt�K�Z�]�g�[U�^�T��i��H��A�P���u�r��C���Pp���+j�������Y*���:��a��g�d��+=,���s�J�cU�z_�Y�[墰R�Mټ|aD����ɑƧ�?-��Xۋ[`���>�i�t��^,��3H��ry�ZQW+�L�d�еȑ��g �� X�;�)�d7ꢎ�h�uʡ�U! no��1E������X1�tt��-7M-��0ŮJ��ɖ_�"���k�j9�=n������b|�)||E]N��4��L$>�B@@����6�1��Q�������Y�e
�(��g��Ѝ��tw��=���i澋uAjG�XСr1�E�����������!g��a�f;��C'��^�fs�VDzԃ��d������p�ˁ�P�iL+!(�c�^�QD��8t�O���Z-��Ŗ0|�W��W��<�>E���|;�e����s�G��.�~��'�m�ݺb#��}:�t/�����9�%�!{8Ӻ�U�������?D<6<@Av<ɧ8����W�[���hH�#��op~����
r9�`|���΅����p9Nٯ�z�4�ӖM�q5boB���5�����K�x����jH�.�%K]�����
\ K�4�0}�t��/M�׫�����Q�1�!vP�n��nĢ�������2�#�4{�E=�.�_�f�G��y�s4�`v�K�4]{z�wxL!�H�+� ����M��x!��!��*���ͺ�8�67���{?+���:��97Ĺkf�+8R�.գމ��S�//
�[
����5�Nu]r�h%�0\Z�Y�Fb>j��9�S(���b2�S���x���o��'�M�̷*X��\!}e��s�Mf��D��"a����o"�?�\
wu}��z	�=�rf<-b���v\"s�=����4>G��:σZCj�N���i\9��d����B|dJ�h�B��
:Bis�!{��{��k}������D�g�H;��|m5r������
TL�b���)q8��s�yg�%�
�w�wz��󾳝�<�V�]z��%ݷNK�¬�|��a�A���:�Ǐ(��W���~�O�h��l
>b�¥r�aV�����{���?�PK/WUW抙���$pip/_vendor/urllib3/util/__init__.pym��n�0��~
!�l��7�!�<4h�vz؉Pl�b[%'��O�EGi��%��ҝh7�MNȃ����8I��ߚ�AV���ڊJwF:uP�r�0�Ϫư�
w�Nk�8�8"�SҌ�=U��rJ�|��p�P�6�M�w@�8�|]��-eEz
���MH��N��(k$;W�F���U�mt��֋1�����D�o�ɷ���n�۔镽,K(��)X�����ٶ,73)��[����w�~�\�\�oY���?7��Z$��ߑ�>p�$ݞ�Q��{<��
�nN�.$
X]�����T�z���Oa*��{�Rj9��T�����>�H�������Kօm����M�ʲNoᅔ�$�m�g�9X��.�G,bg#��[Vn^2��fv�N��� �¡</��J��/�<�d�s<�� vf��Y�����k3���w|��>������q�PK/WUW���%&pip/_vendor/urllib3/util/connection.py�X�n#7}�WdnJ{f2q�xc'��ه hQݔĘ";$[�����[-iv���⥮�N�2zE�j\cxQ����8`K�e�x��Fq�����]��R+g�2�*X]s��\��*�_J^;��Mg?���3���M:[��ywҊ/qkτK��_���/�>i����b�@NJ�6���F_���xI:��h���hi2��'�^�~kk^��(G�?�����1<h��4�
܆C/�C�LU`7��,�ԖW����̰��7�~�����b�\��Rp��_�󧏝���_�g����u4ق�n���~��E{!%0�g�������/�&��$Q�A��7���Rkp�)�>���<��a"t�Xsǜ3>�S��x
^�ğ���h�_=��Y�R�舿u,�A� ���Ohc" �M�fa�E\��$?NI�kδ}�.N@@��Rb���b7�p�rFw���s�pq�cь<���-׍��&����H�?�6]���jT��R���,y^� ���S�6x�]�X�a�B<�L�[,�F8��mU��1w��
)�
A���`���GŁU��&a�+�%�܆9�㑝XSBU��v7`��qcQL%l��oT�V����Զ��-T�[u��;�&����=K��$���!�g��Ӏ������Ϗ?�~.~��t��y^���{|�OcA4��E���:�*��Cܘ�R5E��W�򕧖�H�1$���
I��{9�Yq�wߺ��r_,���.�F�:Y,&�Y��O�?���b���w�2��m�>B�P�P��2�v�Әt��C�!�1-��~J(B�ئ�r��_���z��¼�F�N+Z��.�3
�,�3G����E����l��_
SL /l�$!�z!�!�^����!���E�$ХPl�k�v�]�
H>)���� �`aJi���gR��oѹ�����H�Qy�X��1=�ٽp�l��x�S�W�!2��?ǑÌ�-�w�r/jvL"�z�aR�=��5Ŋm�l�Ib2��u�L����e�Ȇb/	�
�+���k�
d-U�{��˴��4��
#��n�Gis�H���F�Ys�[-��DI�
��F���KWW<�J��
�(A[����g��0ayA�̺m�9���f|�����dK.�J��(8�a�j=�o�5�i�\��&������r�i�4{~����y�����a�p��5���h��P2�!G��=�1D}݅8fLD��P�>�3��O�炊7v�".���5*�c;Ue…Z�1^,�$��p�H;��HS�'J'�_�2C��۹�8/&���c5C����lxrr�<� �l����gz/#��[��H�LJ��F�I�㧽�f�a/�����$Mg%�j��p4|=4;�Q�*���a�����p0K%������
ăT��lP�����
%;�1Q7t�̄�	.�s�MO9��>4
�d��S���t�1�s]�	�K��A͍�0OՖ3�3�*rs`l�H<�'��Wǵ����y
�/�����7}��\6���n�-D���ׇ���0ΜHb����@(����1YR�kqV����!���K��jr+:a}�X��sK�0�7ڱ8jEi��.�G�Uw���Z�g�)���L�"B�!
_,)��?RCg�'��V���>s�_[vv}�Ɔ�,�3�׍�������6�^�}��&���
9>�E�/��lr��'��y
�᫮y�`�X�WϞ��h[���扛��@Խ���dB��%C@PJoW�ęr�U43o)��fJ���1����a�)�o޾=sk٬->���\�u��������c���͙��{K�L�ʠ{��Olw�ICCj|�2~ĉ�m!�$)�O�:�J�fo��
PK/WUW
�\^E!pip/_vendor/urllib3/util/proxy.py}TM��0��+F�DB\z[)���V������%bӱI6��c��\��|��f�
�=�t%�}��BE(,�u��~/+�,~���XVH�$�gf�? �U�$56�Q
+��:H�,[k��|�e	�ӓ�<�B˵V��m�.�j4V*����=��d��3�i���hR64 �l�8C���f�����j�~��]�}�"�{Ab�� NJ�qf��AQ̛��<�Bs����:���kC�u�J쐊�'5��H1��0��vy�����=s��V������DJ[�T;#��Mp'����cG�,��H�?32򝁟�3��J�@
y|�m
�@Έ@t\�@��(��j���%��^�u�������Y٣�����H?.u��h'�Tf���b���%���A��30��w�����^��t�f��a!���y[ǕA�eK?��;�h�+��V5����k����ھ�B^�4+܈����&Ni��V�da����A�X���'c�T\�����6�0���s�e�"��&=�7�c6}�Er;9n��B^LDt�$}|��^�N�Z�"�9��u4����y�"�[�,��9'�PK/WUWN����!pip/_vendor/urllib3/util/queue.pymP�J�0��)��	Z���WO+({O�4�e0ͤ�Fŧ7I����@��	���	:v��؋Rv��m��^P�f���oJ'L�������"���>(Hg/��
р�1�Z�����^��
g�zI�]]?蒳��a�@}4M�&:lf<�y�<���)�:׊��,�*uy��y-4�i����f��Ɉ.8n�ILh�Wk� �K�CLw4�G��j���C��ӄ��tzS��z���n�
��PK/WUW7�m��#pip/_vendor/urllib3/util/request.py�W�o�6�����P��l�Êb0��N��$X�}
���1��H*�[�������b����V9��MiK
q�D^(m_����96D��^�lh֯^�LT
�m�c�J���԰2��NU�_j�tC^��߁��xl�N���@�v_�	��57�q�c<+���
�V�-��Y��U�܋�!�
ynjʁ����f5�[��i`<M!e��*�V$<���n�)��2�� �	�V�EB�Ζ�>�Z��ȾZ�W��o�e�O���$�E��o�������wv��7o�x'�:����Ų>�A:��g��ϐWJ�VNY�E��]�*N�� X��-�o��������_I��gQLS�d�B��������o�$v������C\�`0��1���\*	SwX�7�x7dN���<"�1�[���q�J�!��	O�����]�a�o������m�f�4w���W	�6��G>/���L%�>�Lح.��/M
%JJ�
�y�Xf�eT�����{�%[#��Z����L;eh��I����Ϭ��P��z�gnԑ_���,C�-���Dt��,Qy�;���"DC03)��A`����6
�Ph0xCv�$Րc{U���)�-�o��bo�J�J�eb���ѫ���˼3�!����#M��,��N�й���Wi�W�r��D�VQ��|��'g�?�A�۠$�B�j�͙T3w2@���E�y��z��u����&S�h�Sns.���'��/^I��l�Ŕ�:<�]'`�
�B�������k�4]��}�.��xa�0B�eCC���IGL�|{�w���4Ԕ�aD�;d�xz|Oʠٷ�u8�΍��44�:�ZA��Am�~����z{��'l*����*���B�c�����N�d��N��nf� �Uǫ�Ux�����i=��zܤ#}���_��%M�C��8�p��ׇx#Pn�� '�k\Ŧ;g
��S��`$���[�
���&�N���F8j����h5:�
ӓKM�Z8	CQ�J�2�Z*�h�wq�Vɘ��<ڂ�A�zu}Z�2\�H��@���"W�>�?"�W�n�e��+��N�Ս�1(rZ"QU*6�4-�w���`�jG�[��p�l8�p�3���
+F�N��$��&����f�3��#ޖ׃���xR�?E��O�SL���Y�r!�W�\k�s-p�vK%�Y�4�a�{m�h�0X�Hz�w�Y&�^U+�[�A��}��I�t��ћ��7�L����(N����Pm�j�=�9�����t�n3�[�-�Ƣ�X�����ʹ��芩$)5f��[����.�U6�,>�'�+�����H������I�^Wq
��X:���=��ҭo�������^BY�:�����a��&�~c�53��;n��L�g��@�'��PK/WUW6(մ`�
$pip/_vendor/urllib3/util/response.py�VMo�6��W�Cl�Q��u�n��!۠�.
�CK#��DzI�^�����e'Ȣ@u�%r>�����4b�([�ZZ,�j��z!��ԭ�E|�J�G�TuF�뺝wm��ZZ�7�*��gej��賓���'��L�iw����br�e�5�5��oHd�uJ��9f�w-�'�"�9�5k̆z���"�i���Z-G�QA�PnQ�qTL���|$�����ɉmE�"+�X�
iQ��Nk�D&�nD����
�F�<T����s���x����i�G�R��Gx�0*-r�H��|e�(9}�#/���l���q�\K��߽�[B�5��c��Xq�UK�>`�Om-�{%㍒�	S�*W�ޟ�4�+w�Ki�$��T3��$En��J���AM�	�}^�J���y�k܅0yU�uLO1�l������_ɭ�W��x�r�|4���ɬT��gY�q�d���˚�>y�
�ӳ4FI|O�ጬ_T����B���h�x_�"��ܐX���yNΕm]�;d����Woe{�9�����]�"�T�)�.Bj�_4�n�E���oqq�_��Yl�ѿC:���<�c�6dU����N���\�&{.1����MǑM��u�o��(�V�)�=�Bn)Ԗ����Z�OJ	
�pM�Α�-Z��U�-���A�r�B� �5h���R��z������i�uG4xG3�~�]����}�O6��F����P�i����%7������xZ"
v������E��zo[)�(��0�X��-��be�}+��q�5�݁���N�tf�
Tw�V*m"9RP�ą�H�t�Q���T��0����A��80��$,�H�fb��y����ۗ�Lv��jC 7��.
�T����)vam\Y���UP�#�C6�t���t�a�v�D�������4v`����#%e_�.�З�E�m-�pz~"�����l�|�.��4gIF�_�#֝�=?
�
w�Zi�0;JS�f���׮HÍ���"��j@=�f�<�a‚w�u��͋�q����}8��Vc���K~�ҡH򳗅?��|�!?sa��1͏����t휼���pL��u�@�}t,����$�^��١�˃����v�M ����]6���4�A�V`L�R�\_�?M�b�n�.j��iUϥ�Z��5f�>���Qk�J��݈���Up��MR&�Q�W�N� !�f�8����w�s��
X��28�Pe��Ѱee��p��U��Et�cp�������1`@ø��t?�s&� O�S���p)�3t�;�0v�.����笅���ay��G�PK/WUW��c�U!pip/_vendor/urllib3/util/retry.py�<ks�F��+��K	L(���˅���"ѱ���%ћ��@��X�Q��ۯ��=('���{� �������kz�.�-��u]��"�lwyQ�xQ�i]�H|��{���T}I���$�U_���d���q�A���ƙ�y��e��Y����-_U�.�KR���Tw��|�I�]tC~��;H�c�9ϳ��`����E�Cj����4Y����Wo�k^V��E^�B�ս�� 4�_�r����@�s/?Ʒ\��L�{=��(څ��z
���)E�^���]�U�ʪ��������%�*Ǫ
g[^�+엯��k^V%4�Ȋ�N+�d,�g�2�]����ʋX��� ^�����}�a���_)��!>�U\�%>|�@�(͗12���'p�]]\������9[�,f��qXdR2�
OY���e�%�'Ն�W�W,�{�_Ljք勿ŒN#E��7$�v|0&���+�H�}[�5���<{�z���^]]D����M__�̂eZ�A�QB�C�_�ޕH�#�0�w�A	D����'i�\�d�̺;
G!{Wr����W�N/�47=++�Ёy!'z�*00��Q������K^�&�"�켚������)z������zz>�^M�.��7�O����)�����z���/S=��/z�'���<!�F�K�3�	��_ƈ��'@������ٿ�Q	�@<1�\�O+�lI�/����w@�*I�|�0^�"�8�H��^�Y����<�l���-%��ˍ�X���}E��/��*=�ԻQ���)s�.�9=@�2^��`�%_��PΡ�LoxP�D+�������qϖ%9�.��;�nM�jr���W6��PuSU;������N	i"���*\Z��B�_G?OgGCv�/�ϟ�xd�̷Ϗb�W�
~,G�|w +OQ$+^��j��Á����3d9
�N�x��l���c>�%�ϟnP��B���ݴ/��N�1��x�?�b���݄N�2gu����"�!��^�%'�.���@��81�8��E�W�V^ũQ+3�ʲz��4��U��4�!�A|V2��|ų%'V�f/`��YU���7gj��g@l|�c�dzb\�u�k�(���	�Q��G�"U�TX'EY�H�9Br�HZ������ωRQ�EzS�M�ɝh�*߳m�=��쌔�2A$ ��Y��m �#��n�_�9�3��j��X
����Uɋ;��G�a m���
(�,�QE��'��b�;�i�g���F�!�bT�$j�Za���u��h�H�I%i�+^8$��.�$q@U�Wk�����BY��:��5p��ڣ�qj��j"*�6�oC�:�&����.OP���H*��h`i���E��.(11{5��5�,�0�i]q�bt2�?�������f����P�o�&_$].񦈑lIŷ��4$��r`��C�m\-a�3�����iRVz�O'O� �a�����zm��)�w�R�	W�8 �
n�6�&���؟'ث�o�[�s���dax"�&8�`m�#�G�y��1�.�٠#ڥK�Tz<u��w�H��[Nֺ$9o�i\�����hbs�
��o�%�4 T��Q �����.$_�"���NWmV��
�c��+�H�)-��o��������p5���%��$�C���0�I��F
�:���Ahr6g���uZv[l�rݝ-��d�Cd�>"~��.���C��(�0S�&�\�TCb��.�1��2��N��G$$]!Y����gl�R	(.��[�B@TN�$��`�(��X����R�����\C$�@i�lժ�T���G����'�R�K�u���q��u���U^��-L����2-x��<Saci���î|�
'��@�o�e�+� *H<����X��e�5(b
g��l9�(S�w�)_H?���̾f�)��~2�=�9e�>�cv�b(�z��2D�����B"���8�b����x�z���U�~�����S��-�
��&�\	�(c�
ҟ�٭��f�J t����-%A)��h��BU��C���
G�9TRo�LʙK�G��7�U���Ax�n�T�	����w֚a�� ²����@�C˗N��2�آqF�Ky����N���8d&�$�7!	PJ�l�:��@���r���k0MO]:�bq�5FWD}��h']�P��Z�lj^�R��]ƨ� \B�dKP�`��!�K���b�Ȩe���.`�P���@�8�&2X*9����X
��S8R���hC睆gRD�LQw�@:>#m%���sl�ILi@�>��ή�#:{9�^G7��ٻ���bz3G�a����k,��dYj@�R
k�����)��9��1�f�,[%�s��� HȦ����N�
\ѕ�|�3T�D�۳1S���)"��a���\���>,�~�Eer��^�Cן�3��������Φ�t�vvy��
>ή�Χ�4x�X�k�6��H�up�Y�oO X���!�n��Csj�������Y����y�L8R���o�ڬ
4n����`�:��	��QO'���(2,*y�6
����ddިT-:CK��U�p�ׂ3�K
�w��M���0�����C3�5oi��u[��m�ۥ�|�B҂��A�о�P)�4뮾s�AX��-���� ������k"��`\B�@��y��	`G�G-�9zܑ���0rm\��R��� ́�́#+�����s���X��!V�n�GW�9t|�> �ˏ)�����mu��EbҐ*[�Z�]x�`Q'u�zXSto�����&~줞H�D2��m����LY�	iS�AZ���yn�H�M�K�>e
�C��So|jh�Gn��2�����F>���(m���
3q����M��޸ݽ�n��o�-�5�uѼ�޸�7�nM��p�}<�-	���r@�[<3��߄H�"�?�A-�
�;0�D�y��[���;#�����>��9��Q���}��̂��&M�#�ni�-�tۅsbvZ�h�	i�rw�癴����更m�(A�;By6�����t^;N�����b�]��f���&wK�� b��~��1�-�}�6�3�^�h�Y`���YW4�� �
ٯX�LV���L5�R�P5�
�y%e-�SR$ѡ�����e�ShC�OJ{A�����G¤}t�(=���xЬ����:���A5��G+�<�sE����ϗ8Y���"�7�Ay"]�?�a�m�>�:Az
;�A�r+��|2��_-z��g�wQ[�u@�Y��/���|(HR	M��,����°*���v�]$iR=��<5�5<l���
Bb
?@&���$U�#�'p��.�r���D���%4�$���lHB��.��6sb��> ��uW���Y4,(h�Tף�6\�E}����t7d�3�1��`�
�����`�G"�H�4�HIq8��T�1qyZ�{�W��1��ϸ@��S���@+�cq��N�D���A0���K��N�*O\�fya2g�Y�"1.J�TL�uunۦ��@�4�.V1��{���J@���!�'�m���0��$v��Ov�*�#Cd�6q�8i����K�<��śc�d�QY���;��R�j��r��i���
��z���K�,o+�ϟ�u�0��p���M�M���/F�JY��"<
�u�EHUA���,�~?:���7��O����#O��n���~�[SU�n�i#��J!N$�����K���:���3ε��/����A+���������AϏ�y�!c���<cg�����e9%1CuK��
&��Jb��W��{~?d6��ԉ�:T

Ÿx��	���_K"=GU/���M8U���e�X��͋%���S+Y��84�;�~Â�p��'��^��y¥�|(���@H�S������6Ȩ�k�暑��/�G\{�3U�pY
��8�C}�a�"�'p(���-8���_1���
ċ,wYP�M��l1M:x�xR��K.V4�OIM�|\<�˴�n�#�BG����*�c��T��o�N2��;���d�,ۨ�����������Pi�}���ݚ;Y,B��:��e-Ġ�%VxD����l:~�"��?Y��~)u���n*k���*�[b��H��A7̉��T2�JO�_2�5�*C�&��s�$��詉�/qf.H�鑔�t���M�V��s(d�͡yRj�K��������xveF�o(�p���qR�?Z�TWv��
�/r��**oR!aR��y9C�~���P��X�к�0Њ6�(�YJn�,N������^�h���/���
Z�+1�B%0yAGb"K"bv�p*|
/�-H�,Lj#��IցeиB�޻x8�p�x�us��E�|×K:,�i(����[D[+V�De�w<[&k�oYıL�Hg 	�n%ri/��a�z��^��U��"X3"tx40V���#�g:˅�4��P�Qz��LԺ �JH +�e
a�֛�*�#)��s��N���iF$:�E-|�V<<�T�T����?���4��.R(�І*#��!C��Y�W��]wY�&�]��7�,�Ievi�H>�"HoU���..qK�UťWL�(�[HC�0�rk�6���d�\�4�Ii��m�M_n����TYR.���~����\
���iE�)�H�2]��:'Yˢtܱm:��-��p*���I��*����U򬗮�0'X�N�i{9����6ڃ6<������wt�aKn�\��8�0W�~�#,O\b��E�a�}�!^�ݡc��󺶓�A׺)S�NR�T��t|�[�D�ԗ�b����KȿWrTiK�]�k�w�X��Q�GU�K�+ת��*�Ƅ���(Վ�d%���^�?�
~H����(o�&�s0�|�5Q㮪�������ҩ�|J��˧��[�U���C� }�@Cǥ�Wh4�1]�ij_�$�THx=B�(����[)�5���Y�3va�å�SU�l!.�ƹ+ш��N��6�ň�-[VE�ʴ��dm*U�鋗����	;1M���k�
B6Z�X
n�O��Ci\ඎ:�:U�c�YV\�%�~�}�:�{p��9�i
L�$�GH��/�A)o�HM���YѰ�D���f֙���6;]&���o�:�&ɰˤ��C�T�Qk���"����َvnL��%��L������FO|�V�
��S�v����n���s�F�����pq�
]��FI�p �z�.����W.���u�P�w�|�[5ߍF��=�.�h�:p.�
�mr9?�<�ez}yM�����j�i��hЃl5d����^�����K��P����[k��q��b>����
v/�*@�C+�6�p�Z����Xp�4���t�5t��W�Y�j+�k��S�f�"3�|E�:���un���ڤF��HJ@�c_��#.-7V8�x���}�Uy4���9h���ɾq�?�E~��R�?a���a�ρ`�'�-}j�~�x�q��v|>[e"���J�^|�<0�jW��&�hHI�{v
4%���$�C�#f!��i�56����|�)R�����9�4��F=~���}��b��ZVɞ��1GG�
N$���(��A�dQWb�)�	0����T^�J.�Vr�-��8����ߝ�?��\��a��F��PK/WUW���ǧC pip/_vendor/urllib3/util/ssl_.py�<ks�ȑ�+&Tՙ�B�%y��tW\�^�"K:Q�-'������l6���{�A�[��RYx�����^��E�b[mEL�7yQ1>/�t[�H�w:��j�cs������/2�-���e��XJ�v%^R��l��K���*�s�N�X�������;
,�K,6�̳��:~&Y)bX�}ʫE^�Rd���_��x%��sVn78N$���v�I�%�zC�ӛqQ�E�雩7<~�Ka'.�~�-R���h|3�N�����������wp���Q�U�bW�6�>y,xV���pip�����L������-���������vz��h_
o�o����ǻ����������yx�s�s�>�Mɪ�`�ȖՊ��Y"a}�r���y*ho�b���v�)�d�`�,�$��Ϸ����&���b�6��ہ���z3�t:�X�(�m������)T�،����ڍn�KG
�U�\�\"��[���Ȍ^��B�Z��K5C�[X�\��j�������eH�t��
&�%;�W�*`<K�Yo��,E�QZ�r��n�"����S$�7�	��U�
�\UH��䦇t��{�w0L����+��G��#�v�+����i n)*^UE�:`]�}7���;���;a��W���II�e)S�jT�1�G�GP���<y_lW�MT��:J�لI6�,�̭��Uy�����
U�*�����_�fybL�i��\�x���
t�2|�J�����f���>�/.a�<�c���:��	L:��&G�c|}8�^���.h4���o����I�+3��G�w��������m�����Q
�
2޾����./ԥ3ƙ��	�"�8�a���d<ID���+���
�;N�N�~†L�S���%	��4�1�?��u�d����/�/�j,7`�A��2�9���l'�d��&Ӕ�y�<�"vY��xE4�����F�v��)��l������*��`nN7���,/�Z����>O�Z���R\�"��O���ӝ���4y
�j�ψxtK��\�
�D�`�M!��ke�V��/�!$Z�(@'2
¡YY�x�z��g���\D��@���\T�Ƅ,�b��ٞ
���G���V~/�*$����d8�1�˰v���Y�s�m��@����)�c� ��!���u�)d�,9���on߂��`HZ��{�i8*v=�*J����:�3�D�0��k�%���&��{H����Ǝ`����-��)��rE1�m'�j�ౠI��sQ@�l�����o�D ��� �f�a���g.S;����7��hr�q���;��e��?Y;٥�8<��磏C��x�i�?�xZ��̉��'�a�X��}����=O@�{�}��N���D�`)?剀���{B�ࣝ��|����}a���5�����W�t`D\�q�FhG@��8�������4�=����6�=�t����Q�S���I ����U^V_�
��ĐxEk`CC��n�n�-Hy�"_���:�H�p4]�T�$���7@���!�yB�E�^��0SL�n��.s�m��ez��4W��4Dp��B��fë��Ix�馕���
Gǃ[����E��x|4�SpHHl�뎆`��Uy!�h�`�%�tG{��̉D��9qзO�L-��s�J��Ȧ�r�J��cu�
�U�_~�ћ����\�5&6E�/z��!�
�@);c8X�	3���g�H%���i*��
@>��K�c��7`N6����I���)?݂E4���L�Jw!�_E!��oatƶ�e��<P% ;ذtڂa�
%��y�,�8�-�"r��8���`�p�I����Dvv^�_�x�1Lr�-��S�ׂ�#:�Q�1?�V��O߻{tK�����&�;�l��]co��W-��XP}kT��ZX�ȷ�o��1�_j��Ձ����w���i��*{��o�~�[�߾.���E-`SD2�U=\e��'�z�-�R�B���r#T��Q*�!B��?�N4���E���e�i��Q�|��0��H{AgV�%�K	�I:7*"���A(lE�f�*r�]�w�1���D����4��)!��]%��Z��I�Z���[���{�FsfF9��3py+��62�%����/�PY�&�N�O��Dd1t����i�fy�ol���X��_��\^�MnEj߮��;Yhp�II�l��,�D���=
���Z-�9x�Cj�Gy�)���XtMhB鐍_ ^E��E>l	��?�K���CH`��.��#f�(g!��G���@��.n������{���K9�.dl�ۭd�2ڀ�4L�rUӂ�1�鳵ד(�H�
��m�K��*�&/7��d0�1��<���n�T��B�T$��I(��Umؖ���½2@�3Ӵ0�UPu��sp��\���7��^�]�y�����p�'��YVo �h6�f�Qԫ�	�����^�Dm��y��zT����!�F�uo
� �L~��}���B��4;0�"���o�l
�
�KA���$��D��%���c�I8��*��lh��^��E*�ġ�zf�n�����gbZ�HG�h_)i�!�Mje���ufj�ꠃ��z/�ij�R	f�Y�w���CB��3�����L?�JP�Zb�U��X��<�2������j!
'ġ^�Fd:�)�S�}�]�&�.g��kUd������i臀���pʦ
r�yH��6�u�]A����
5^�~c��|0�S-2��	ac�$/B�o+�:��Ȏ�m'�G��߄�E��b���n����X
k���px�z�v^V�"a�g3�$?��l�lF�g3m�Y�!0He�u�?��?:�Yk� E	5�e f�( �6��$��)i�?͞����	�u+�\a�b����<�V�Em<�V����4�%��ۈ�E��{��U�z�?�� X���B�Dٌ�]֋Mjm1�Z|�̛^�@=�TW�,�gNU
�S؝��l4�v
^z=Q��V���/R��<��B��(����̨EZ'�R:�F賋-��a�aA��*0��,Ѩ��=h���9��u�O�31����n�>�<��ߔ������Lt���S�u�=��-%�"P�(���c��5Ԣ�YF��'��B�!˝m�>"Cs�p�F�ɟ[�K��S��7�4���[O��G`�K��Z�?a�Im��u�;+^�۔�$��|[ �����l�s��H�3��€E]�f��_:��#�,3Ⱦ������ӘA��1�G�l��<|����'!�������3�<��=M�!���_-�E��M*c	ap������
�]�A���R���9x�90g'<g��N�TaG)¶
��D{���~c�()�����,�0��cI�HJ.�HU��X}�E�]��+��zr�{{,H�Q��P��=�s�����5V~w����
�^�8��~W��U��T��Ǐ��廐��Y&b�^�iL�H���թ�������Se���ma{��W"���b1�&�eeK��6Be]

�-P�L��r��P��…�kd�K*�PmGL�0|�\ ?��߽����f`�MEu�]��Fф�w������c��,Z�}�5FX�e�q�z�O�ػ�j����AB�ٍ�po�A����\����糔|a���͑��9	���\�5��`M�G\]	��!�o2*b��0+�e� Lq�MP�n�G	Qd�,
��Ls�o��oy���GZ��:�vgt�2�`�Kv���=�4�C�1�9�8H�t�|!N�[^$n�c�y�Du���p���+�\���?�5�蠒L0����a��Iŋ=Ͱ�M��T�	�N�mG�(ʞ���Ԃb���y�=b	&	�ʖ���V`T��l��_��C��~!�t�^�o��9}c��˥.u��-�W'�,9EY1�Gr��dD�,�<��3/$b�(���0�rs����M`\�>kH~�4�XϪ���n<�
�M��u�k�����2d�^����p^��`*�w=
�^��:h����*~��e��"I�0��#p�"݉RU��<rJ'��69�Z�����©��p��é�D�S�<’#x��
�����*-�/E�G�l�N���Wz�u��[U��K)5}�؂t�L���ȃ�P��uF(?t�G�r�O��Qgx��>�NsS����ԣ�S�Ы����������I3���bP�����g�%�|�F�"�h������W��)3��N�z�R�zh?ڊ���(�)�=���o��˲�5d�l��
Sb.X�{�a�7�⛒���t@c��%:�U��p�uբ��J�޺\��v���yẹ9��&�|¾�!>��3�~���>2�ýņD�a���R%��s�%�V���ϪwVH��ZU `G�Z~
2vJ!�˃4��+��)ؘì1}C����)Mm�q
B3<D���1�s�mu�������4��#��M�m�x
Sb
*�-�d���D�	\��#UVDŽ;��p���=O{V	�0�B���Xy�����=��b<ܵ���7�S��)]�Q���*�D�\u��tb�a�@Dۊ=�����E!D0 �֔�t�w�"��d�仒�L�TE0X�?��'��*��n�tp��+��;<�\�8.�|��<�b27q�k��*#X{A�7�0/�(IQ�MD߬
LŸ���XK� T�-L���v͔�6���,#|���%�wx����r�K=�	�~u���i�']G�u�䥐md�"���Ó���zq��Bxi�=Mk
t�:��M��'�.��=��2�J(�8���H��[���&�hPS:���N�9#�g-ۍ�����M��+	,"�(�n
�P,		��v38��1�D*������w��T��R7�Ȩ̤�F7	A�E� �r���5���T���j���Õeǻ(:4��
������h��2H�'�ܘ^�h4�ת�G눵0U��7���ּ��x�Z8m��Z _9q�f������d��0��C\���22�z�{v�����,�,�;R�����M���e7�6��2�*4�=�q뢇�@�0,�yH�MwO�(��Y]:���#�
��D�?��?����6�|����ȔQ�����F�H�����'ʜ��eknӒZS|��U"���wS�F�}�����d&K[֢ΰ�Ou�ɘ��wh��{c<C�5�&�(�עT%�?���\����*�L��̉����ڙ�[ۣ�<x��[Ӂ�/�ݏ��`��y���-��^�T��0}8M&T0ɟ�N,�X~k�A���{�۴y��=�xH���B��h�	j����"' r�_���䂺�Ҏ��Yl*]
��'���2}���v��Oq_���#���������
�u�.�C�-(F��@��[^Q+���J;�e�4�$�Z��\���ݑ
w��R��K>���|]@�H}n��V[2�9{���=j��:\�k#�M��5ͬ�E5zΫ��\.�6��?��>R�rl�	F��ɿj��l�7��w�PK/WUW?q���~.pip/_vendor/urllib3/util/ssl_match_hostname.py�X�OI��EiPĘ�!�m6g+���"e��^tٜ՞������__uϣ
l�{��~T}U�գ�$ɻ���p�b�0�i���ʕΝ2���,�j��|��߄��R;%*Z/���U�����dI��F;ta��һ��T�J�_�B6���5U*��J�/��_Ki�6^��F����<#��s���0���vf����V\�p�j4R��4��}�˨T-��vZ@�\�\�_��,�:ʞ?%���V�w^�r�]i�DU�\ljc�\N`��C������W���k�������:v�������?�~���f� ��jC��W�!.p/�x�Y[\]9Ue�V���1�� 8z�?�%cdu]����k6�\J��zߌ�].kG�~��iL��w��j9�f�ς"���=�A�Q^	�{)�J�'���7Q���q�Y����Y�-�椅�Pg�N���UU�)��a{d����<7M��`���/����2p�y���x�o�$r�T6Sҕ�C̜����N{k?�jU����SpII�8*t��?�t�F�kQY���U �gv���h'��J�n	k'��ȥP>WN 8�u�\��f��@�[I���Nv�����Xb�8�~
�z�b����f�]��ba�p��Pv�й�`���~�lJ�֨�
�Q$,��hn��4�P*�� G	)��^�]6�f�j�8%�BNmX�DJ�+e��D��`CbiBAbzW����%�0k��憈.7RX�!�ha6�*8/���������ˇK>���SJ�)��
�>;��Z��S(о>0������!X�j!��>���N���\��f�Iny��N����Wtq���á�{�'/	�Q(p�=]p�("	g�*_��pG�����)�\7�6JUb.�P;�u��og�+���%17��]jwo�����\T�ʪ�0!<v�V#��".®�8���دqM�D]K]���d����#�U�"���-��N��'�����۱��q�����Aso��	��˹�a#���~�X�n��#

��QT�_�^�P>3wk#3isQ˴s�s����.�:���C��Pb�hP{0�d��z�{5f��J�%���dB>֨�}�?zg����#��n4�m��4��qz�z�
P|�S�(������N}}I~ϒ�Q:e)��w@���/.ߞ�<�>�����Y�3�]�vf�ҊG���?��Õ�����<���HY7!(]��Ǔ-^��7V�|���/���vU����g�~ �C�0!���D�\)�*�Pۓ�Þ;$�h�O1��b�!�3��u�iD�aa�`s�?�����?�����YP��$�вs�t'���� K���nL�<ZzF��/�]�bl;�}J.W�]禖�8ۚO�`
7���xB
rh^��r]�2�Wp��O/`ڮ����^)��atY���i4
悍hG�-g�q��f���ӘH��H-O�����"N:�����L��:�C\~��*7�3��=J�_�d�{���Tai��w�k��.��]���՗N�N�^�{���|�`ƪ�ڃ�/
O����)ⷹ�c�����
��O\}�L�$%�BNӥF\!Ȣ�0Э�	�Z��[�iG	�6�"��3L���"F�xʙ�x'n��uf���f��[��턤�m�ޥ�go��.�ޝ_^���{~���_ߟ�={5D�_9�F�OK��vOʶS�gU�>l{N�(������0���h*G�b�ӯ����E����g_�3	��~D�;7`Ղ�y1M�����UE��cL�׼���� 4��#@�Oi_�-�x�?4#��:�@��a�����i�Լ
x[�	����l�e��������1�R��[�u�g�_i�����'>y�ޤ�vUF��J"W�/r3�[��
W�1v��o�d66;�Y�V�{q{�j�!��l-wu�2�<�ۯF���8`�߉#�C#��A�/�p"&�m8��N���z9?{�T\\s�0�����h�=(���V�Cܷm{���C�w�Ç�
�Z�!�}�s�����l!D-W8�~��=؏B
���CH���n_�h���VR�݉1�D��;�7��}{�
u�[xH��
C���J�o���F�S~�Oz��q�����1�
�~��mlO�{�:��}z��]��������k�@��Ge����~Z�"��PK/WUW�����(pip/_vendor/urllib3/util/ssltransport.py�Ymo���_��pX���e���8��n�\��$�mQ�L��J�KRvܢ��3CJ&-)�õ���ř���NǤI����p�/[�Fk�+�e�;'��,���||,�����w�P��/>�h��|�o��ۻ�x�����������FEɭep�0\Y��a��3����V$��`��2��x��I�	�ã��e)�V	0�B+%
?�G����Ȝf�G���
�Z�6�q�dz���<c��R,;�ي-�����tX��1���F��0�q����ɢ.�)���b]�L�	O	�r�k� ��t[��k��
�nY��Cq���o��	C�ج5'}��E�
��+z�k��y)W܉��N<�|�M�J�K��L���wR�(�<pi�����;��r�#DVp�Ʊ�@�ZD�L���1�V`L#�QK�&��[�1"�p���7A�R�7-��F0Ub.rʚ)�ؖ[�0c�l�$0A�g�~�>ǏA3
�hҡ&yN6h������)&Sv��b�@k���N�P�)��ui��QZ�
�sYB�c0��Է
�{/"�>�Nq�-]��D��\�B&�X�k+�^�|�x%�?k%f�����
�l�*zm�S�H��F@��u�m���X���buJ���Ϥ*t��sd�(*m��7w�iJ�k��t)a������k2o��٩-���V�����f��]Ϝ�n�"��b��@u�F��%�Z�-�,�TJ*�R�ֻI$w��y˓��"�='�(�p�Q�P?S���u1�eE���D�kY
�_V�a�
Q�
���Ż�glY���P4���4kÕ`����;��p�.�C��9�H뉯%�e-���f2Ƅ��0:�`�F��DA�(Kl�t�x�J��D��t���4cjyt†���T Q"=�/�6/��3W�'����7͡(��%���^;��<Y��P+�$���K�-�Y����}�c�x,n{)�oʸe�kF��[7_��9����TH^h�qC�vIhYЋ��G�k��Q���'����v<�7s�O��?�x�lк@ͿP-F:�E�jrR������1Wz%�c3n���S�a�D��V�PJ�;�Km�]���R�LY�DۈC��oF�h�PTV����X�G3���!�A4c~3��R�L��R�VВ\
C��і��wG�A|
��Cm�ǭL߶���
��E:�m+�
W�g�0�Z�&h�){?g�"���g9���bI*Z(�]�k�&~T�1ȷeV�1����iԙ1P�P�a�!E1��pj�S[�X[bؔ����s��T�
�Q��]�@�p�X'��C�����a��8����2��<�c?��
q�s���m�������t<g�0�?/1��ُW�>�.��O��W9n��@�N
���0�^đU�6��GT�����у����T~����>���K�]���4�"_D%���G/"���v�r��>��!�'������y���iB_����'�v�MM�mJo[u�	D2�,��F<?��Z��v>��d<O4���#�Mg����`�f,$�ېj~�'Cc��!�X�+`7�R�Gx��P����e�@��i%�}X�x�S9,�N�|�c��/���C �^�Ĕ!���h]}��c�DQ�d%`�ѱ��4\�'K�,�yy����Es%
(��'��c��?t�c�tKj�����
�����ب��+fz�xK�q�i"��4v�@�_=<�=�Ww�T��W�4/���Y� KH_x�Y�\i�kU�B��Ʀ�fx�@o�o��c���̒�;��ڗ3��iv˒�=[]�+�Jj��)(�h�=MV��DL�Z������}���xS�W9�̩8	�6I=����E�p����9xz�Y\M�����E�h��"B�̘�W���Y/��ED�1[�b�@�7�Q�P�K��J��_��u:��?]�;�NԬ�b���dPk�.l�E��$���]Z�����}��
���f�&��g�t��PK/WUW��3��'#pip/_vendor/urllib3/util/timeout.py�Z[s۸~�����4å�M�m��ΦI6�Lv��8�G	"!	
Ep	Њ����s.D*v�v��C"����|�
�;�c�ź7}'&w���+��ވ��}v��gg�n+X%ּ�
Ӫ�(�+՛��ZTlu`[c�Z��QL6�,��l�a��ٞ��nE)���2@(tgk���v�/^�y��go/^���Û����_��p���0�G��n�s����ўȝ]��?/�Nu(�3�Ecd#jv��^<��4ϰh�]
b?9[�p
�ej�wQ������w�QF5�dr�=�5_�"?+��n�6�pܘn�?3vv�g����˚k�ś�#������{�Jլ��8*%?���f%o؊,���Ƀ�ת�_�Ruaw�9��7��T�=��j�;�xm����x��6��X'xu�]~3��.���3o�FX�a�?,�n���ܕw�^h3�z���*cW���������jw}5����X+�o�6�oe�e�^t���&S��o�y�8����̫��+�w7�	�H�!�iho6�׵e�w|'��4�w��E5b�|ߍZ��rï��Y��H� �w��Ÿ�F��j�DZ�8�o*bʓo@p��{Z�������#7��� 
ō�cĮ59{���@I܃��ذRf��wxM"����x'���1�%d0�{�&�Jo!��!9yx�VTy�(sч��fs�
sh�S2*,c�ZqC,��N����'��w��TPk���l@����s<sϥ��@�ir�֡����R���NZt'ȶ�z���q�{g[}�p�ߑ��S+p�[��M
���)P �?y{/p��nr�C��6ץ�~������͓�﫧z���?^����@�~��韗�<�C�[�����s#�\�
z��Ĝ�N!���\	�����]o�`�6���l�vw!"����)�~:��GY7�J���e�Ċd��&��_���(l�K�:�"�zM^�>��fE�����	(�"�l�_����E��'��y�ޑ:�4{��{\�jt�JA����YQ�!�r����co�G��KC���MrȦ��j��Vn�����~�=om�\l�}�P�[��=������^��^���[~kt�
���$�<��q�2ґj�;�5��C�qNt�q��w�RB�ol��i���Y�[v�"��)B�eM��d����n���Bv�_���"bl0���6e/����AS�������}i��z�z�Ϩ�!�c�쳇6���OX�`��C�
�,�2L�G5(�����+)���B3��p��T�i���i<4��
4O�z�fc��A��(X*��Ҁ?{�|����L��r��*.�We(a;��E�;�����|��(��4�Adu::�M����#�X��0B7I��A}�?jנ\<����t�&���:�xvu��J}{�*S�s^D֨��W��7�%+h�|���\h�ܷ�	����6��;���I�a+�?:Uޙ��!X
���"��K�_�P�_vNG�Ū򲛟�K6�G��,�|�h !/Y� Q��+R���3<w���N�X`|��V�V����]EUAq%kѴ�o�
�[R?R��VUAC.1-0{�:�!cōF	�9��(���Ң�!$~��	�!3�*C�G��=ߊ�͇|�D�U��S3"�W�ł
���=�{�x��Qڈ��F$B�NlN ,�)�0��@.�{=H�պ=�S��"<~�����u�l$c�%��H�_�1�t
����Y��D'K���@�6��!�a�V	����ڋ�����!,���Vhyl��pcτ�>>�Qt�:��B%�L�<�F㘦Բ�Ӕb��s�d7*6�k0H�0X�
�{Q�$��{mخ��v>ލ˛��
M���t��E�fEVٱ�݁���,��e�j��4��]aHp�YQ&d���/��s������
h������Xzf�H�P`�LQs�ECD���n��c?;������Z�ߜu�qS5\���=��1��K'�v��Y�da�^؈��������!�	Q�狣a>t�hg;�Ә&�r�N�\�0�gnNW�C"uM��$\�(�a��	],�ˡD�E'e�p>�n���M�K�d��
Q��p������}SF�p��9�%`SӴ��;S��sD(�}�l��@'dC�TZ�ǃ��j�����]T��A�PD#X1h-q\Tƨ*`�8p|8rϡ����H4.�2����g��V�����4BT��5�n�5�DC=5�Ō���Ď{����pT�:��hP�gE�*�_��ag�\�"�WB�t��s�:�Z+~�G�_PA|����]�����M@\T�\�y��m��c~
2$i�o[���w-�P�GhJz�	T������u��U��N6D?���ik?7Պ.���M_��Z�@�EL�č��;k(D֊��K��>�,��z7W>��O�#>g!YN�	wn�L�`�_%��dž��3�!�pQ���	��јfL��-Zj�R�AMM��TV,�ÖSn�ґps>?��G.I����y�� ;�zxb�/D��0.3�S|�����#���ͣ�DI훐+�����Ð5P|[;��ChC1�4�s���5G:��
ẋ�JK��*��v�c��:k�ps6^�;{�0>9@�yz�4�d<�/�c	�I[���r�h0�'�I�w:<u�<��xU�;i�C�'F	ai���0�n���9�}I�Ҕ��G%7j�kԨtݵvz{|��[����!��Hg����h*���1�&�\�*7�OK��6s<oB���z�*�����
2T���?%���[Ӡ�3~��z�P�I_��`��>	Ľ�…vL\��XΖf'}�S4�ܟ,��h�l���١�ԓe��>?�_7t�2���"��	�/I���8�%!���O��l:V�.cM.�,"9�F	�(�z�~��&��c��<��{RʿPK/WUW+��^�7pip/_vendor/urllib3/util/url.py�;{_�H���S�e-#�nB��pG�50�p�l��6��у��g���n�eɐܝ3Xnի����'��8��.��8ɘ7L�0ϸ+~�Zr<�1b��0�,��T�Dޔ�Y>yK��6�Y�$y8p�%)�%I�(ؙ7����2
Z�<	]/˒��k#M��fxy6��I�f�����?s���a�xwSeƠ�Za��,��9��E�b��������}	�	�"����ܼ���g"���6�1a��':�AU���q�-�;�l�e3�uz�pxr���IϽx�wS1
|M��E<�0'�!��,��3�U�P��p��$��>#� ���h�ח{m6��<��O�n��̇�(�vgs�7Z��g<�J��y���wz�{ V�p��L��ko}|��vc�������7�~2��z��q �km}��y�Z�y�?���|�ـl��X���n׼�ts�=X�Wڛ�O4�A���ԁ�b�8�W�#Ƹ}uz�����������I��p|�ǎ{~x�#�5)a����ƶ�m/���JP�Ac�7|�/O.���[��m�����߂��w˰Ǹ	3�%��w�J
����7��pF�no������{I�3g�f�ž��l����`Cr��Ү�LV�X������J��Q4 ��L�q*4w�4��!��������&�/6u:���u�˘m72�Z�l뇘}��l}_�p����R�=>�p[g�^4q�YΩ�<�i�ʩ�a�G8��2�
S���5�_FnO't��\��{�����V�~s�{�����ɇӳ�/.����?����|>����N�x�g�f�����׍ͭ�ݽ_^�j�7�m���ӌ��֘�h���ȼ~`�L���<ӎ��B`0��N{��Ffuk�q�Bc�d���ŷ֤(�GG���o��qMXH�y�up30Z��;����nO?�\�V4�5�/���a�]��)}2���W�<Zw0�`ە�^�5>I�wԄ���t�*T�B�+�����wһ�p������5Pd�nk�f��o�	���ť{~ֿ��N�j�H��
������&(_x5<��%-�i�K�K(N��c�K=��xQ�L�%nت�7��7�<���3�h�^�G����_����i�X��>/ ���۳�&�#[$���1��`��K�*!�y�1`�~���|�?|��25��A��h�F��B,��fz���E�lY�И!Lۑ�A��%�~2"	�%fFYݩ�C\�]�gz)��	��{aNHD���ȹ�a,��[���!���T��^�	�����(@�q�H
o�|=�@�4� �e�h'>�Au���1�]̇\7
�,����%�`�xĿ���/��i��!��ǰ�Ĭbae_�\cqȫ!R�0��mX�~�1�!�EqF?�4�,�TÄ}�A+�hݻh�NK.@�1�XE��U�Ɛ]��{��i�	���
��Z�j%�i�C�됮:$ZGh�S(�  ���,��U6/VI��6S����ҿ�m;����:��� ����`7Ҷ�!�k��F���g���lu�Y.'�0�4��4Ht(f�(A4
s�q�,����@�5�"��	
f�٪,#��.%�Y�}p���Dh-N�M.�Y��uʳ/q�2qצ&�5�Vʾ�i)�q�*��X���7�j�8�M���r7�^<���{�5�	�1��T����֌��B^��K�Ɓ%	9��$�#�p&6��}�n�.'|Ar�t�M�9-ݐ3��p.l���,!��,�L�kWЩ��a�� Sb"�?�L3�*6��X�ܾ���9Q�`�Ћ>Ӻ�H�������=�-��L�ΰ��8��R�����
vo!��Ƣ��.$�ߝzA�m[uDկ�.E��*V�k�)O�F83�Q}ĝ���F�B��m���aC@:&���R�Z*X��+��y�A��JA�q+�����A�!�f$���1C3��e�kg5E:�f3�-���L������7X��Aa֔ӓ����Y>�O@����K��9\2
m��r����Y��0��X���gɖ���v���XA���P�`~�̢nQ	����\�; V6���<��B�'��H���m�[���;��"���D.�� �79�1� `����Y�S�J0�Rr	h���܏D�a(D�s�e��|
Cs<&%�Bꌐ��F�P�\�e�4{�fGWQ{�ݡ���h>������8�A�F�9j��,R�_��j1����O!�����2����'��S0`�>�B��C/��u��rO��
��6ȭ"P}�X�D�x��S{D��W���mT7�(�$��GIk��d��J�����(�}�������
$k�V�j��׎D���V$��&s`��-�ˣQ�s7��g�;��51��x/�`\��0���o��x��Q��s��c]�<��
JE�"�`��9� ̘" 8�!���lV!��;V��*�騀*���cCj�}��?d��V^�������Eن�˝��.���TR�Q8<���)�W�Cy�LW�Jct�#PK��<l��W��"6��R`�$0E��&R m	%W��b|�k��|�)T�M��',�#��;8g��#3L����Yđ:���%��rل|��/�kA�I|��C�� u+R�r����/�@��G�94V%
���ˌ�^�xs�����B$^t�͍DԑY�4���W�%�( x�b��7�����b[�ol� �pL��:��6�#9�����5�g�J�
B�#h�DQ
h3��pA�7������}N�b�&*'�̄�֬��5��f��͆�����,c�JH�z���b�_Ǡ~s��u�U1tu�rRj�X�ĉL��@���M9�,��#r�+삋F)��Y���ll��]w�MCդ\IE�y}�޲wh;�R���:�&R�<ۗet�T1!3AqĤ��)�����S��2����z���Q�� !:��1�p���(I$�r�K��Ҋ����v[!#8��X-��w�
��dj�
3�8O����f4lc�;-�Fs����JH��P��$�>�$��Z��B��_��"_�`:��4)�q-`NX��g $��w�[�5�g$L�i�
�+�$N�o�	Ș��9�[BT�D��Zc��Š|)N�XR�!I�B�h����l*�iTIH��덁v���XM24����þz�
�Ӣ=�g�P=��pE��x�cY7��eڭ&+)�s��d
�n�ŕ�^Ȫ�=]ٽ`��(�.�q��Q6)i�4�R$
�)���WW��K�n6��+Jid%���G�j�M&�k��Q�	�!����JS�&�-iW��
�JG��9�B�T^�@2em�q��_a��T=W.��癗6K���8U��^���HB[�D�fWџy�	�������@��x`��>�OSO[�o����ll���g ��]#Gje�M,;��QUR]"���my���q�`)�y��Y'��5��L�
�	��A�xK�����ë����f!�����3h��a����:%�p�͙����Y�
�N�sH'�,���6ȶ|~�ZB`"��M]���)�|�z��aʖ:�yRUf�
yh�,�t2��7����͝(T����ai�"O�Ǽhnb��`��)d,:�~�d^�3]�3۽�c�-��!��+�%<vL����B#��?�.��k�~e�4�"Q��̑J6Ѯ�QuͰ:5���X���iJ�"M[ӥ�0rd�l�2�9�����4`-*������"7Nq%۫i[�mD&ba���SN��s��U�q^:
�Z(dX��L�TM@6����{`�N�UD_�I���*����`W��� J�"]M�ᕌ���A�li$šG�ŵ6����W)H�+K�R�@*��d���OU�̱Z�@��C�x�־J�[���^���x,��B�ȃ{�8=A�	U�3q�fo�bB�$���S�t��p�Դ"
	N_��ɨ(�OE�0�#���	�`$:�<ĐA5�R�C�6��}B�:�}�&�R���,�Vw��b�G'吉�fL9�R�	pʰUVo��M8��ܪ^���ܟjTa�I�P�&�
�.q��*��Жt:�g��q/I8/7�y
��8���hW������K�e#gQ��(e��X���q��2k�Y��4���eܝ�9X*Wv�d�M�*��@�<��8F�.>]����lqd��
6q;Y4dT�f�)3ٲ/:c�n\�E�,�h�8~�V��WL��*:��XO���N����6�W�UC��8���*۔h���]Z<F,t�I-�h���pR�f7 �X�HU�$����9TfX�N���������]GIl�B�Qb#���~��𽷻����bh����-%�)�uE��+pV/=S�kD��(`�@tl���"���EX�;��Gtn�I
ˠ�o��bu�a��0����l5
mX��vZ�n�
{+kT���:���d�� �`��Dw��bQ/k�"$+�]�f���C>�e�LVY��J�˳�3��i��
�l΂ Ä{��Ij�~��-��?�_�7���9�	# a��.M��(|�Z��,�6�`��݂"o�K�+�NL+hQx�ˏ
��j�Li1J�w�Z�I,���{����P²C�t€R)��_�:i}�\�8`-\���S�p�.ДC�I�L�W3u�.j�@jP©t�a^�I�Qq]������2\x��>�r��L���-c�,(���Vw%��PK/WUWV�Vտ pip/_vendor/urllib3/util/wait.py�X[o�~篘R�\�Vk\��8��T2l~b�{��rvg33����|g.�%E9�[K��e���/���X/���LT��HS�o{7���E�5�7F;�NZi��z2�v�z"�
t^ՔIj�oUL豠֋��w��K�,݈u�ZI�W+��No�g����4��)v�s1���2veI�G?�Vy�~�L&��Ήgaf�4WQ��`��4�p[��R�$Y�F���~�\��~K����0�x��{ӉB6�s$ QP�f��Z�-�dS�U��,μ�Tu:�h�#A���:�ٔ��h�GrM�p�V��K�[��'�,pm�J�/�-5A�|�FBϪ0VVx#vD��V;�Ś
��eMy��]-ʢF�	�pp�[�t��k��@l&H�����p���$�������i.��u$a�z�`�S�d�;�Z4����D�G\V uv%�L���j����s�E������5���9p����qװ��ⰓZ�ҨGr�q��"#�:��
0!$�Na�H.hK�r�����f! X%�f�ho6��<�Vm��MW�����Y�+�j��.�Hk��٢�B�W�x|[0$nNҲ�������>��4=(|H�4&�� �$��~�Ґc'��<������m���W�
�� ťw?bό���C,��rl�gM�7�j�F���9(�PT�y=����C�H��}�%��D�,#>C+�+��Ś������d���A��f�0�j�8����J/p���+�TF�})f���T�.Ŀb=�6��x��BĀ����z�8�d�}��g�b��*�z;���f:�����U3�g�	�/�C�d�$�n��]���#��4t8�@��/	}��F����^
4��p��s�g2P�[Α{۝ �o�:c��1��)�ͯě�h�\�ވW��r�.h I�K���GH����1�wQz*݅������͗KDJ5*!א�qm�v��7~����O�8M,޽�����` �=9y����˃Ǯ�;�4
�7��<�1���,�#�[09Lϒ��w�ق3 x5,���m.x�Y�����&��%ݳ�[�8v	,�s�%��/>v
�ǩgZw(���BU�CE,w�p?��?�̲ŖP�0�}	���*��n��M�ʄ'r��P^��<E������Z�4����#<\^=�(pjÍ�uE�
�O8���+�q�`�Z�bܷL�����*/RnJy��zJ}+Ѽ��$�JU�KOD@:f�Z��|�jqD@���)��N����3cǭ�.�$댆��^�W5pO��g)���<yg�l�ߓ�ّ{����ށ���cA\c{�En`��)]�T���t���<��p��e.��~����3q������m��b8�#�����F!�m��]MR `�	���xH3����`���qԹ�Q�f�O�r����ŋ����͡��h�M��'�rV��Cl�i�3��\�x��S�7z���o��)�~�ԃԼ
���\���ϒ+n�H�h�a�z�"���&:��J���0��Wgx���"ϙ�
��$�#�(;
�baMS�Mgc�j�,4��[����mT
+��J�|5����`v4�|5�u�#���M$��[��#<��%�O'ʐޑ�h:Hǜ~�#����%i���^�vŖ?h�)�B��\t�˕u��DO�6�U���e���������g�uN�"Pc���Z��f�N���3<����
W�^�c��īG�$+�|B
2& _�u��]��R�=�:a�r�L'O
���g��L��W!�A��b��8��c�V�kN8j6a?{�\�W�?���0�����3�N����ͤ��쩇bgl��G@Q��A �;��p�*�`����&�nzl��>� _�r�Vc[˺��c�C��F���Z�C?���PK/WUWx�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/\�PK/WUWǭ�#"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�����PK/WUWP1D$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�-��ޜ�)��yPK/WUWg8p���!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�PK/WUW��֥�*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���WC��'j
( pip-23.3.1.dist-info/AUTHORS.txte�M���y��<ڇ���0����Zݽ-m�g� (��d�(�\$������H1���!���80�ח�r�a�#ğ$���$�n=��T�����S��O��Y/?IFt��dd��ZօIGy0[S&�y�*�I�&7!����x�:���F7����,1��|����žڪq�MF�Y�G�qծ�g����]b���Pg�t⃫}���t��m����L2rU���)��hi�"��1uc6\+M���\�mh�Y��ua7>8m�D9t>����ai�uz�V�Gi��$<��]4�5��om��ߦ���|���U��U�l���K���v=`Y67�<m̢�[g��*�!�M�f�	6=�U0YT�.���`6�8ķ�>�`��ʥ�\�(Vګ�T�I'�5N��e���h|�x��V�cS[rA5�['�
�:�l��{��Sk�k[�ޖ{yZt<��K���o�{ִen�Z��uzl�Wű��U��e=�mn���}l�ʅ6�p�CSk�*��gf5�l+9k�l
_u�Y5�U6��u�#�����e�l��1M\D�tTn[�1c�d�]�K/m�ql��ܘ�j���(q��5�UU������Ϳ������f���5�3�uW�q�۬h~���Wx�6"4�
m���mz�f��i�[8&�䄶��Y�zkV.1���,Υי�]�"b���P���o*�������{����5�OOV�%�fݸ�a]��%O:4�⹧�=�G9������:�b��0T��;���%�����l�rei{|���e��|�Dab�#���u��jW;��FtcX��k�Lu��!��Yɍ�!0-�,��6�PeB��Lg��y@>=|��������-�齳�����o�
s����eK/ت���#�(LI��<c�צZ�0I�͛7�!�E��2�$C���\��|��ZW�� ��pl�`e�F��#_[
��>�
a�5,���`lO��j�­|z]��u���V���&�u�z���|�.�I��8�N�E@��6�p�N�[�3��%�O?M�p����!w��`:]���2�XEO�qf%ٗ�:Y�ʅ�u:�������Zb�t���+��6�
�N�lB�Է":k�f/,���r���� OǾ�m^��l������}�`{9z�Qi�8���̺��Xq�f�^�ׅL��Ǔ�u~�䠘V�:Y<.~��?KxJXIIS����Oir�����Q��G>��?rbs�gK�{r6�� ⊊�^�s�������|��a ����2��}py���qy:f��2����O�}�^!s
��=oqJ�o�d�Q�D�ǤI
��%DŽ:��?�/Z<�t���l�I3���%M�Ƒ�\ݣ�,;I6=ùd
�EH�G��H��g�(�C{�K\v�n���@_�9�%ť�6=�����[`���&���L�d�1��!b(�RQt�Br�Ȳ��"�����&�I�oH������]��QtY,��7��^Eه�v�=V�1Dfkp�#���Y�F3�KE� �<w{�
������m���y��s�ڇ���D�d�؁n�vm��`�RD�N5�i�1�M_�Ifפ3���఍�zlk۴���U
lW$�))��s6�Z���W��)�.��"��"�+8\2��Hu�gݍYC�'`�H��˔�c]�j�&��]t��W�����2����E�]�^�?�A�1Z����[���c��bGEg�I���5d��иYK=����R`�[�]z^��W��k�N9�$E�%8�6��ځ��a�LO�%e
��G36"��˓ҥ�E�%k��;:e$�(ʾ�;F��$'��[�^�B���m	(%儚(�G3b|B��3N;� 4e����m�4�O�B�Lu��5 �^kB�-U�)�]TN�Ħ.�s��H)�t���U�lN�0[�ȝ�`��J��=?��m��]yp���,l��q�^��}�g"�Qc�K��K���R`“��8z�X�cYϞ�-V��\ς',l�)�%�	�M%n5�_N
l@ɮ
�?�Ls�ƴ��SR�z�R���U���Re����ie��W�ܒ�5�d+��1ԥ\j�Bi��=4e䪏ƙ"��n��$ɗ�_$�f��PA��9�kܬ)�Irz=�Vo@K���8�<��n���0�Ϛ^�W�?%�ʢ�Ɔ\+��Ԓ�W��]���P;m;�ؑET�f-99�w0�O>�,��!�c�B$�&[.��r�#��u'e��$jhy͢BT
Fq���V�M���-�)~h���Cldo,,+OI�r
��J�L��mrV;����۸�%}]R��
�uT����8�!����Qp�&9#,�䒉�y�r6(�\F2e�^�P'�O��5ͱ�?�!�꜒�>1nw$���"��y�|�\�:�-�9�jb>�Cs�N�^�bkv�|
�'V��ne�L,&�)���;�cf��/'�Q���4�`N�i#n�.��~a~��KԠ�FvrS�G�$�+�\�e˭�b��`j5�=��jO9�V��&T�/"��N5�W���S�H�
`��8�%���8*#(`��8�G�u�IY�"�Q
��'~��	e)��fMu�{21�⫃[��ade�(zJL���t�p�_BI����:y�0�����;W�\S�%��y�K���"!�� �-���n�3�"jW�S<�p�!������SȺ��&{�0�o�(�����(qFK�3����G�t�i�FMibK���!�[}A�̃�qK򣩊�w��H���"2MD|[�?/
iL���8jL�b����m&Czii�Wѥ,2z��A�lT�A���[��-Q;tIN�ۨ��Yx�%Q��W�x���_�1)b[�X�:C”eztj�"6��j�i��;�pX.#�x�濗\P��A���I;6ʐ�0im�DŽ%u�*0����ɒ0jW|oRZhz�d�GZ�Z��i����V�bL-����С��b�̻t͎�+�b�@�:�p�^���PW+[6���c������[o�n\,���-7Z�����,YR���(�o�w&��d1Q��N"4&���2��K�}�f#fvi�]�IKu}0
���F@�U����\��N"�X]?�82#]a���^=�Zv�
i#������X�8`Y&"��Ǘ^�{F!,|r�.X���Q�e�:�Y/�wq:��E[��	����г:��R��q/�^��.�|z�ҟ~מj�O�B2y����DM&9~��=/��xfVeWE������L�2�}����	q��6��S�W�>�>�-�C�����_Ďe�7fS�(\S(�$�h.�}c��:]��o��*�#v��5Ţ�p��R��ِ�͂��˧P�^����3��]��n�V�:qU!
�ǯ��3�^�(�^q�U2��h~���]��{�v���7H���8������r���8�k"u"�؉��P6BJ�o;�ޭLg[FZli3V���H>�-�%���oaX��݈��3����d�8y�cO��f0�ƥ<s���r��}�ŭz��{��'��ӯC�	.��?�J�`Tј���]LK�%���-ܾݜ8Ґ�Q"�,ٝ�>���3��7?�x���7A���)u75��LZ��y|4��~�O�|i��۷�+S�٬�4��W8���oB��_
uK�_��=��/����d�������7qQr�����g��M�bu�Vy5�S�0p�s�BI0�i�GC�fn��xL"g�����"��@�BO�!��^H��
Lo{��i�!`�u[��f�kӰ��(`8T���`�Ʊ��D�9Y�ʫ�0_<�&W�)-
F�T�l�\�ϮoG�/����5�:��$����P%Ѕ��M����Έ��?`8)t�z
[�o>(�:J �8�m��?���D����%�+��A���@��m����\+�����^P��'��.��*>7�>B�ls��=�3$�-uR�Ǘf�@Y���K'��e��5�;�-)�ԥ����^�`�A}e�@HG��&f��"�F��l?��=NF��A*u�&��C߷UM�zk�5l���J\K�p��bA��T�V>}p���S�4�0�KW?��_R����m�AC��!f��Z��B˜J�7=��2�x��b@~�}�6!�n�^<}E>�+��T��R��hM�'�-V���8�Z[�ʤ�q�7#�>�lh4�c�O�&k2󍎴�j^��0֨�U���M��rچG�O�\��Zoh�l����Bֵ����'
���
�萅m�L�fZؖk�?�#��F�l{��Q�����&�hX)�a�AmI��
��_n�/���R��G�h�qlP��fg���?c��A�=��Nu������A��R"�5���c���C!�'���*���PR�A�+�0��-�U���NTnK
����vlu�*��dv����e�^�z7��o*<��Ma�J�y���z��ũ��q��q�'���
A�\j�s��5����W
�����CO��3"�4ǾbaJ�V�z]��4�� qE�7x��I;<�Vo
&�#5z��C7�Y|PG���u2��~��m��2�_�[�Z��rpl�_L|��s�%Y��^2&���d��,���hSTg�����u���(1I-Jo��t��5��w�wZ����E�;��jb�b%�{Fz��߷)�JR��q>���бH��b*&˘��*�L���{��v<�veG%����s�K{���B�� �L�N�$
6s��3U��:DVE�G�F�.^��!���]���
t���߹��u*z�A�A�a�N#I��B��!]R��/?�4��7�o�O:�o�M2�W�Ug���Ni�;gb�觺C��*<@�zL��h��Γ0��-16b�k\��zc���]�4����DZo����W��Lp���.*-A@s�u����/4F�÷�S��M��N��ѕq�Ԫ��q��
�0�S��9�н��ԏm�L
7ݚ���ϓi�#3��Ļ��{zv>9��xt?BY���yl��9 �$3(z��X��]�
ϝ�uMP��=8
�.n�[B���/�&b'9(�e�m>\����ί�N�f	/=�S�Y<с�E����(Z�N�:�Gm��&3����x�~���a�$B���ºU�w���C���Zztj�P�>d�����Ze���C��}�N�����䰓Wzi�o
�s(yU�{���U�0��f���jz���q��#\gA/|�)߱��Y[+��pۭ�l��Uꎊ�\vg���l�ջ�;�ht��JYe�f��\[Bo�u�9����B0�t����+Pg��G�B'��wz7�A���6��k9�d�q�_�P*�J��=U���_����DX���*n��5/���u�'�}��Kjz
�}����Ȧ�X�0�R��s�->�j+ݤ:�^��D��sH�r�t�b9[um���d�Y�#9���_���
��m,5��h2�4[���Z#Dm��n�;�����z���$���Bүu�t!#�u��:�k

�ƒ��Mᢹ�q�d�!�������g앒o�S����M�����o����A���?�/�~���������Z�����w��_}�����넦1���髳�r�����PK���W�V+�E pip-23.3.1.dist-info/LICENSE.txt]SOo�0��)�rj%�U;M�9�4�F�i�#'x"a�Y���#��NBB���!q��h�m����==}�2�ƛ>�n
v�Ƽ��
f�����+��y��`;�E�O�{�z�Z3��Ǫ���0"��n��hb��
�n*��UP��-�xw�j48�@彫m�|и�|B�U =r��Bk�YyC�'��T����ņ֝`�0ښ8b��sCޏ;{�7�Oy"={L@>c8���m�X�y�Y��Qc�z��i�6=�0�W7�7]G}OY��T�*4�*�t/�;}N��c�����:�lR�m�@,4~p]�.
%��R"�#��r��{5S��л�V�����ގ|[�������.�[}�3��x���8�s��+�\�-SD	��/"�)�X��Y[���FN(���%�|?E���U(^� �u�	�� �$ۤ"��r�!k��TK ���[Fk��.�BdB�bX
��ILi�l2��بB���(��ȗ
U���z��(�P�X�MR����%��)�Ұ�Y�qs��L�EƯR*ɘXǐ�5{�J"���ۮ���z�D�G�I"s�pcJ��A���10%J*d�$�S���	�r~e���Ӎ��7%�{I9ː�$���y�PK���WW���
pip-23.3.1.dist-info/METADATA�VmO�F��_1R?Tj�]��g��4��D�U?��=��X{}�uB�}gvb8.U#!��yy���VdŠ�/l��U���R��@-�`{|�ʹ-KѬ�-���'�`���3�Z+X�de�PJV9	�BWP��A�h��\���=����$qL��z]�H�88iI���2\��5�B,�T	d���JeB#��k�'�M\�+C�?Mn��F�Ԇw7	�u�V+,u��T�M�[�\ڢ�Gq��8T��	n�����3WW�2q0R���H�}����5�$�3�@�6e���i�&���?i3�U��6�&�/�e�%��8��F/I5q��\Tnu-S��]�@�V��Ĵ�"�y#ʒ���R�Y�7����h_yb���E��eo��{k�����*�T���§���*��up�_Z٠	�d�s��6
Ϥ�!���N/���}��nN�nϯn��&`*	;�rn�=#�8��&8~�Q�d�ڲ�,��Ufx�i�e�tco�y�M���w$�Lמ;X8v�BY��=���h���[�
�1��t����Ef�tj���x.���:0�JX4�e8CB�I:<��u��/�wKd�^����u�G�n!�Ư�7�O��.���>���*M���WVp�P�M+(�@X��Y�S�U�1���$A��w���g|rg�?}
�FZ��U[g����J4j}+Z>�6tYb�fMdW��&�3�L?��3Z�	�.L���Ti��l���)>&XSVlx�����(P�@Ѯm
�Bzp��m���p�q��fP��
�%�Ѻ4]v�i)�
��<��4))�	��*T��Q�&7��
�7�|���aTQ��)�y;��0Z�v<�:�E?(mo�
��5] �[�Ad[�۲�D�,XVzm�����P_�{�E>"ܠ0�?�p�	�S�]��X��Z�$=V�n��7.s��Mn������2��k2�ހ4J��!���3������lg�{��C�}��y+341�2çg��=���K�K�N�?��RS�V�=Y��M�[jNr0eoi�0*l���4�A�q�]�E�N�C�5[��-�ڈ{���WǮ��|淚��O[c���n������҃\I٤�_��6U�����JWJ�i>"n����?~p�v��
)O�gw�$E� �+=�i�xt5>�]��FW���mTf��PK���Wo��4\\pip-23.3.1.dist-info/WHEEL�HM��
K-*��ϳR0�3�rO�K-J,�/�RHJ�,.�/�Q�0�31�3��
��/�,�
(-J��L�R()*M�
IL�R(�4����K�M̫��PK���W��n9<}%pip-23.3.1.dist-info/entry_points.txt�N��+��I�/N.�,()��*�,P�U�z�y%�Ey�9z�9�z���yV �˜%z�FTPK���W���"pip-23.3.1.dist-info/top_level.txt+�,�PK���W�_Z�Z;�pip-23.3.1.dist-info/RECORD��ǚ��Ү�?�"��7��@#�$����w��?h��TR�Z�9{�Ɯ5�h��$�_DFRM�/�I�tp��i�]��0������U{�b&Z����jB�j��	���0PF��Z�;#����t���z�`����ކ��t�J��j�1�<����vGb����*�ت��RR���#��̜/�Ma�X�={S+���;EӚ���	� ��4]4�r�c�b!�����b���hz},��q�����v�[|�R�uYdH�!Ij}����q���$*�1P���+��\2�;�ހޘ�V�b����tltG"��.ak�\Y�Yj?�2g�7��&��A �"oL���7���8p?Ay_n,��z(ՈH|3�e���#yD!u�!�Ϋ�(���Һz}r'/�Tz!�%�����@�°8�����qfwB"��>��y2���W��H��1��l6�t�3�1��B���~��!ޠO|�u�Y�!)�5fq�J����F::��Ă�_�7��|�!�7K��Y�/�b(;��*V���g/�)�`?]�K ��RfҨ^����;¡7d�S�C�a�l/��_�P�=i�GnPt����@�l�U��o��P|[R!�7���a���{�"f!D5%����ؑxe+l�3�蕹�J��H~��"���\�����N��e�)���J��bՖ$⮗f��mX�;�;�_�M�ٖ�uv���>N�L�@EV��}��*�
R'K$uuGe��ԇ�nl��Cg��n�Z�x��.\-ﵰ����%�u�?2���:$�e�H�p���A�a��b�z��̰�g��sUC��><0�m6G��wA��{�۬�}�Z�&���<�����n��zW��yY��Y(��� �o�o�a����Pr��}��ǀ�~2`<��A�A������@���4n����=4��?x�D��P���TO�Y$��(V�T� �S�C�݄��f����@7]��
�D��.Z�I��>��_���H���~A�:�¾w�����k���zf�V�����( ��r=8Uf����b���(���va�����c	��ⴅDBHm �i?.�Ҥ�7��Nr�� �����7�s|�orI����9&��#
#b�C�Ƞz��x�rޅ�a�3G�a�)�+�g9�tM�k'2�;�_�۽�ϜB���2�ܢćE�^���@��ڙ:#�O���7���9}�t+&JY^n��	��CH�#R�E��lrt����!K�X��h��������Aw���}Ú!*L.�����8L7�����0���W�zH�"��|�m��Ћ��Z�x��(e��8�=��G�Q�W��&?�Ŀ��o˧=6F�p�H�H)̖��*Z>�
�榑.����Q$���Bo�_º�D泦�ސ4ٻ׀����s�b.�e�"�����7�z���}u�Mf�$W���[)��Q��*����Y[�gY�䌺���)G]�����Y�tK1�v'�5b��V��9u��ե������E&n��*��<N�P_؀KI�T�A[0j�0�+��}0��T�)*��C���E�}W��y��Mֺ��և^�w�W���t����9���VA�x�D�z�i,�{�wU�_Ѽ(��=���O[�0�{,��N�P��q�i�7_�<뗁Z����a��ˤ
�p�.j�u�胈P���/��^ȃ[/d�����y����?U|����~�5+l��?Q�h��.�u�Ĭ�f,�9�
�v���#���[ Mv���Pے�~���F�{�{Jk�b�ڎg�g�sK�%��z�t�t���q��ԏ~�'����,u�շEM�/��\�X�D�,�:��p2���w8
}�"�c����c{���
l2WPaN�Rq82�
1�ҡ3��\nʺ����c��;_��^Y䥌���T�^9F�$�R�+����K~�m��;7�^Y�z�/���~"�x>౵��S:`�a�dz
��Y���	lx[oä+RrK+߭�+�)_����S5��l_�]�۟#_t�
�̓��gn:��͵?r���?+��:5�λ�*Y�`�H����"Rm�ih����gs��Ŀ��q�r�'�(o�2b�es�KaJMyF�V��)&F�w8���W��KJ�σ�f ����.)��4GhP`�=�����+(}�2�f�и�QB���=��w�ƽo�|z��.��F݄�T����/9Ϲ����څ?w����@D<Upa��Ј�T"�n�	����or��N��+~�J!&c~ʜ���[��~b¡�;׎���A��k���c�aD6S��*�I��1T��8W�]/V�%su�tt�cػ����6����O�Zq�P�Q}�qnh���ɡ�Ń0�:�� �����i*���S?X2. V�9�g��VW4P}Z���6�'�	o���w�~��K�[ݼг�t�H9F`9,6`5PI-*��,S���ʕY~�\x�wN�ʿ�o���%���*�h�&���yXd�G�;���Q%����e8�[.�~��Tc"7�paȸ�Nn�l��Rw�4/.���!,�/�g*�n"�Bg���7�[��7�z�l�脜I�����07��q�2���ᾭ�TDp9KǓ�K�4<���V3x�����5��o���8�Q'���䱳�Z�]7ٌ�z+Li������e�ě�2�����%}��q��g��l�n(R�U�L3
�G%�������X���Q�~W�Y����)���8�ӡ�tLja��\���8�"�W���i���!_�m��|�1���V楀fs̸6��b�DhP8�i����t*l.-��w$��&�"���,��6�]`�U�>^0k�clm��'[�.�ɀˍ�#�O�߲���0�3p�Gs��h�Ǻu��z�Y;�u��{xգK�F��������Y#{��O�{W#��(��u��+�U�dg���x�fV�E�Q%�?� ���׭�
���HmBe��]j�a/W�ԨSm�=�M>����j�;�B���Qݕ��x�կ���(v�mIR�-]Ud��i���$��1j���R��]�v%���OQW?��,y�@_����1qe��c��Y��9����(�b��Ocycծ��]x�p�I�s����	�[o1dgw�g�g��]i��H���?�9�
(t3	�^��X_/|/�M@t���ԣ���w0H~H�?�~���W�@XNm�#3:}"@��o�T鱗�ˁ;���'Ԫ�M�����_�����M��e�?R�(τg��F|�"L!
"�� i�W`H���?d�?�Ly�tӅѫ3J� ���G3-���0��JC�ԫxO4�_��n� 
�p��aS���4ː|�0���SFm���ZA�|&�-�d'�#o7�e`�ܡ�G���.��]��})]G�Œs!�8	��i�b��D�WM*��Cp���p��.�6�G�1`��!֜ޒ_�Ύ�q��l��*^%�Kh;��#C��u��5=3���`�yv�A����X�����n@3�}�[l.�%� ��;�_�{
%i��Zf�Nܔ{1�lN��m/:(�2�� �d<rs�P��_�7Ua:Zʻ��	�|9,WQ���r��'A'N��(�w8H����]�������\�y�r!$B�	��1&pV]��1�����ԇ��e�a��>�I=�H�^��0�0����]�N���-zv�*�5�����..q�;SdYSxx��l§�YVY��P�7�Ѵ��
���(���_{Uc�c�`�oK�s�+���q��iOD4Q�&��{ԻUlQ��Yp�āU����8Ʊ��Ȅ�jy���F��y$�G�ܽ����<)�+8�"�)��ר�dJO>a)�����f�p��w�~7��G�l�ĿAG�p����1m�'3�5�^�Z
�ʡk\?G��x�o�[�k��}��|~:g]U�����l���b�
2R-G��+�s3��]������>��-�������yu�.$�ů{��Z�>Je��
��w	���ɏ:��8��kꠃ�y MDm���e ��lR`��jWه�k�u_�;����p� \�x}/WY&�$�lAb������f֏�餃(�0e)�\�8\�y�"�]yM�Є!��,90DP�
��õun�d�5���>�`�z�:#�G�ހ`n/ӏ��Kw����'�e<�+F���0s1}�t��~��~�d�y�|��Z�Ys�H.Y;��O���‚톐��ے}���0��z1T�wc�G�r�P��;?�ȜW�ږ�\�Oy�F��f�ȼ�\���d9��i�K��󃊀��[a;9�9A(��7������q�P%7�Y�sOB:
4��#��c�|y��߈����雱�
�Ť*EjT��8�-j�lU�W�]�-CV����Լ��.l�["����~�#�H��=2כL�ĥH��:�Q�{
-�"�o	���|R�����Y�z��.�\�Ew��~�fL�ʸzܰ+ZJw�%s�M�|�>�;��1J��'va�(_��dO)����ԒV2�4L'\�<ָS��X��/��d����'%-fw\3IL��<�RU��ծ���C0��}��gT
���9�:+ P�qw.`��b@Ø6=�8��Aܤ$J|��B��q�_x*ҭ�Y3t?]8�)ϧ��Vc��#���6��:(�Q�~2�_%��~�B~�ĴE� 0�����JH�>v��fa?�¾�]��^�w��u^��]�����_�/�$7Oyq Z���
�)[|�7�����y��D�u�?��_�C����_z��A��Fc̹�����}�$[L�v�}з�~�m��-@~H������
��o����U��hoq��4��CaF��p�f|tecٮ����|?T�>��k FȆ9'6�*�Yj�3[+�u���ON1i�?SK�<�T�?�S��ޕ�,�dD�]���5в�{�O�c;�d����J�aw�o�ߏ�t��~�ʣ��S֍��'�ނ��O�PP�O4�^���AH"�M�Ÿq�q~WE��cs%��ӊ8���!g��+B����VB�����-�G��8�vaV_*��=���ӯ��
�<�:]���Վf�V3�{��g�秱>���sU�k
Ǫyk���;�pD���t�o�
�7�	c���+c�o;�h�n"�vޚ����qc�].s�@iAd<�t4�Ռֳc���C��a��1�	�u���؞��e���A++,Q����&i��G��o��4A�e����7�s��Z�
�����F
k[�j�r��w�q���Q���e�q�8�4V�졳ڃ����dB
�X�<�>����JM��H���u�K�V�ʓ{����b�g�KE��
��"����;�8�=�3�Z]	C62Ӄ�Y�_C��q�/�
c?1�jN�F}��c�-��?�_����rZ�hUY_�P)p�G�,'�wW-(2@�!w�0���γG�k�A�w��2�2��s��g�:��#�y�i>P3��-F���#�q��E�����,���A��L�P�L���٣1�0�<�iX�[�(���V~���W�n��:�3Ka��Uw��,`v�v�+�q�p�{�W_�{��/w薦N�Ʀ�X���w@�v�8���u)#OW:�9����g�8�~j�~釰|=�K��e����g>�%��Mn*���Ī���ڸ8<jfr�t?����߯SNI�V��c�ƹ�Z���AKL����f�Y�
�22�ݿ�-7�B�kI	��#����HB��=B@���Wk�o0
z�ny�+���g�ї�*�9�[�֔<��[Ħ���p�;6*D�R��m��o�����xZ��`Ч��{��{�€�j�!����4�����2�_W��ד�C%�[wj@��G��q��[�d|<���j��~�_���M���aj�t��l���m��R1F���M?���\?:�~S��]�V�΃(��h���)������	���w=�!���_�-������w�k�c��-��B�|\��["P"��2IXݣX=�k�_����P�*��?z����uI�5HK�����B���
�bX�Ɂ��z��'��]�Q�G}�7y��ق��!�I�0<rݨ���K��!ӘKH�{IlF�TtG!�7V����ރ�+�wI)�`%��5�v��n�����W�ݑ$��.�E��E�7�M��t��-G�z�r��5�0˰���l�þ��)��-�^����{��&=�T!�Q��>r$/"�"�*\����!������e��:��(6�-�9�X:�4�`4>kko	gW͏�T�����N���ʤ�im��z�1=����N�@]��Zέa���lT��x�	���u_� �F
�	>�1�o.�Zs�DE6e)�/�i"��7�8}U(L(�y�*�ϧ)�i�����Įѝ��,d2�h�&h���?�e�c���+�Z����e֢ ���*>�L��=�eV(�/��m{��o��wm��bJ�=)�)��V�</)��,bt�=n�Ճ�D���A��}�'���X2�>��0(,��k�lj�X����*i*��+�{r�$�g1��
��[���e���sJ��j�ۙ�4��ó�U�#��pq�J�
�x~]ԝ[>���_�c�ޥ��.���^��7��O��X��O������ܳ�a�_iцf���NE��gk8�I�^x�+�}�/������&�ir��'¾@���&�"��~�#X�l=��ސ��
b'nO�?�}��8)D}	���<K�:�6J|e.��L�\K���M�{.xfF�����7記���q�}���j�$u���@w��&�)W��1~i��I��J�]1.+@�d�$���L)��$�&������/ w��5*���D�$Į��1��I��k�q>GjJT)�q�rR|��yR!ܼ*G9�a��g�D�Nm�e�>�l]X�owi�[�7�Z]K%Y*җ��>�S�J���Tz��7/���<>kBO�-��7oI)!\g���{�@s�f�F�!��V���6��‘Wsw�Yԕ�.�Q<����s%��r�C��'�����@ߍ��_X،r�'L{��+C�r���9<�p������7w���s��_�]NW�A��P���	��Xg�	}�q������<�ž�>� �����8m��D���w��l`Y�O�خ�t�z�w��U�e��Z[$��f���(��jɔ��}���O���'�>-��5B�v��Z�q�6�
Dɖ�g��������Seɝ��5j�Dz�G(�g�{��P3̈d����XP �ONy�ko
i8��@Wr�s�[��ŗ��!���}K�ܛ1�����-��i�Nǜ�c��G[���m����w�gV4wn�|@7��/���t_�à�<����W�F���^A"l�w(��V&	�ݺR�����r�FC�ˆ�:���,�`��>ięmx��9�w����?�K�a��)1�/��` ��{���J�-�|A�C��I|�@�;kNo�y�	�g��z'=�1��ahD��
�κ����9vj̗#�-�[�]�����񷌹C�{�W������P�8n�C�3�?C<-�y7|d%�t�H
S�=�r).G{��%��>AF�XdM����;����҅������v��)�k~ÝZn=�`]�qI�py�\ � ������M�
i��%V�ɀ��v���8�\����`��\��U�s����ߡa:
��ǃ�C�u7dV����)����n����]��b��K�DUE����.�v�PkAv����!�E�Z9��<��g��'q� ���Gh��?2�r+��ry�4O-�D{���Z��������o�^cѦ_^Ө��.rɊ���5�.��+��ai��g���n[7L�?�7��}��zQ����	��K<q��뷻��r� ߝ��Tj|l����oɿ~�ܡx�dOZ&���a�k���m��P�ώ��С��'�3�>�?ЇC��c���$!�{���H�Q�jRY�D��a��∜�۲9;a�n����3�D�%0�og�˃��C9�Nܞ���%@w
o*���a�ywZ}�>'r��g$��CiX�.�����*��z�E1ُ��,�!~Z����˅5pwB
��t��g���iH��G��8�����J����~��B��3I�ˌ�#�w�*�;�H4��m�Ⱥ���Sf��_�oߢ�j,_wMce��^3�Ii��$p��e�7nߺ��d%�0�c���DN~o�a��VJj��p���-�1�L�=ߛ�i�fzʭ�&5A�	ܿ�l�v��T�@�7��!ҁg�<)�.i��I��Q�ݖ�K¿���>��lW����k�:C���d��H3���R���čB�w�
�woA)�Q���o�W���r��c0i]�}xƈAR���'�w�NR�g"P�8kS{�x���з�x��[�$Y�..���0�Mv���Br��mʉ�l�rE���$j���{5��nsܖz��o��>=����rGГ">:�ͅ�a�tp�8�Dp�:���'{���f�R�.�� X��Ny��䝈�#���zQ��)�����}�������CW��i�p���7��Q�����;��ʡ5�R|c'�ׅ�KB�#g�y�#�;]�3;[x$��[��8�ɣ�{OI����[��$���ۤ9ȼ�%=�mn�ի�Sso��J ��m/��{#��l��k��d�ȞNu��E��V��"����Q�����gH���j�XӽAͻB̓�OԍB��5��T6r0�+�}��^�	c"t�-���q�9�cU���wY,	�U��1���L����p������|��8ᵸWz��]H���z?�9�J��Y�bi�#�	�:tۄQ�~��1�.�w��	ol�L���ҮԎ�E�!��h0��� $2��H�=G{����w>"X�+���V%f�Q��t�����a�⫦I��9�s������B���'��&=�՟2`P�����ќ������o�%�����z��<�N�ntw�Ė�fw���ef
�|��;�-�C0	��#����	O,�t�������*q>�9V�1
�������?��_����>y�����ゆ*eŐ|��]��}"�5�o�cs�
��|[,�Ɉ���>|��0�-9�T�ٓd�(�����(6z��6��D,ޒ)�{�I��.��3��U��6n�#�rX��s`�Dޖ��ܡA3h �柟�$�a��~��Do�#�m�}�S؝x@����p����|8��I�����ָ�}v�پ�Ί�k�l�I��pt���+E?����_DKb��`Ƿ�K�-��O�Y�JD�l���8(C�<��3G�����.��bx���r�t�$W�{1��j.Rpb���u�bIL0`�&۾����T�Q`J�%ga"_���gA������֐��
�qs�����|���ų��S4^�:��1/�""�iun-��Q��~�D�m� ��:Fʪ�(~o�b3q�
��R��;�i���f�'�U�<�q��/������ԭ2��/"�p=Put�)o/�4�P�b�&.����v:�#�ҥ����%���2#Dm���(�H��7���BuGb�����,A��0�4Sqٶ&n�!�j��^'%�-V��+���)Y����UW��r�󼲓թ��0a�p�P�g?�}���b����CZ����c%k�)�Ӛ�&��6e�G�
�G q|u�C�	t���;�!��w���������n���K��1�sMc�=,�@���qME]�#�h3{�n�2��!��}7�9��4j�� �6�-��2 J���b����ޏ�P����3��\����ԵnP6dGW
��`%����J!Q*p��a2,?����+�3t��B�W!w9�.r�{���Ž֠Q&�qw���SDX�q�u>�^M��ó��H��B�La��>,ՙ�<�p�$�K��F�mH�!0�=�}ƶz�fŘ~�6Ș`�l�j>���)�3A�;"��Cؽ�^�%�BvIqZ�O�}^��a�@��lsD�A��L�i�_��<#��3�y|�ٕ��I�g�r�t�7��%&�i/�d�w%����7��"��_
:����<��w���څ~L&Jg�
�=��rO�̚��?�|?�g�CyF;�1QD��p�e�k
��H��ဎ���t�t잚'~�����fއ�{���E�E|��uT��iR�k���`sV϶*"���	�W�g���͘_G��0.k�.�a��>�?��oL:ٓ�p1��#{����~�{������-�P+kR��E��\N^��&?���:�o��3}�~[߸�-%��6*s!�9�뜋x�U�1T�Iz����!��|g��G}xf0,8uWzu�Rc�rǯ�
1�OUD"`w؛k��~��Q�t>�YN���,�tFFr�x�E���e�כX���g����r���BNZ���1Ԇ����k�a��nK�� ��:���1�K<!+���I�����E��g��}�g͡�0;c>�Կ���_I�zAi>�<��ڪ;_�@��\���	.��f�W �U��)7z�.E}��[2�F_��R��.��}]�u�{�!�ڈD5��cenbi�/}�Tޛa���ݹF�-���b�����jn���y掀��b�=��Ff���HV{K[i��]�ldx�����}O����n>�y��
�7�w�E�g�>HC�⥸U��@ٛ�X�2r�[{�Y�S��o�������Ks��
�L�-a?�1,Rw�WdJ���AS�Vw��{~���+P�� ��bU�������M9/I�O�WP�zڀ��"��8����7�q�va~.i��kV&�%5���{��麐�)�|#�[E�/���N�vj#���h0�b�\���v�f���q2����w(BR����߅82У�2e���B��Y{4Ǯ��A��̖L�/ɯJ�ԏCCo��H�Z��;��~\�+�룑T׃S�G	�W
�n"�Ӄ7����B�3$g�d�%(�tE�8C:�
�e��y�׈nRE��-%ȧmm�^r�շT����L��K���5=xp/r��7t5��!7�"��~1��2}�GƋ�)j�e��M�]��PE�A��bp_W�ޅ�MŽ���v��Ϭ�(s���> Ӣ%	Zu�[�6�=�zNa�-}��#~9υć��Қ?�zEhNͰ\�G$�����(�n���
�f%��{S3k�6��P;ֺo�a�D��^�ݴ�![bSh�g��h�M��nK?�Ĩ-�E#�o�����s�%����e��c�>��������|'ĵ���}�`֬�o(��ÊCߢ5v]�Z\�;��@��ߵ�q�Q�m���M�1�i}K�?O��'fZ�����b�o{+��	�?��ߙ}��IQ���?�E�Kba\�6�^r����'�9Z����7Q��d��ҫ?Ss�����^o ����*���S�m��__o[1�"�br�y��]�G��NW��
#[ň�K�o��,~��[���k�t���y�`�MT%���#�Ӄr�\Ԛ�e:�p�����ܿ������cZ?����E �ܪ���`wH2/Qdk�"	�ir�����<J�1�#�G�ȱ(S�6�'@v����1���z��U�'𦋖"��W)g�^j���&���Oi(��:R�&�A��_wP��>��;ܑ��vZ���o��a���TfN�6L+U2�N�y��ۆH��}�}��v]�һ�<���a[2�k�U��.�aq������<_A����S���;�6yn��1���b���ft�����>�3�W��=�?-�/V���å��p(.��Κ
:���Jv9�f9FY�su��C�Q����/��{�i�~]
YS��녮����N,+vG����eSѱws��Z�ח����U���+���$��KD]<lc�>���SEs߫��E����S���2����vi��]�12���U�l�^�bO!��P�i����>�}8��+��g�����s���%��(p�|�>����'���lСȜl��><��-!�E
'n����"�m�)�M�5�;<����^�־.�#��KQ������)�GHUY���p{� �v�F����u�Sc�`@S�c�ݲ�r�<��!1o��ԦbPF}~���VAW�����ò�4�x��?�S��Yx]�r��"�Ue)sG�o��Wv�Z1�n��-.�����ܲEO%�/����5O�05|v[��_����_<f����~V=���V~��k� ��AM⃦���1��b��5Jð�h��]��_��:��t�	�%=��Y��;�|��|zM�NwC=�G+
™uu�"�[w�.�[�Ց��a��N���yN��_�5���7�h���v<�Ķ��?��<���ߏCe=OF��e�ާ��Wpz<�:LI����"Gj��8EK�'8�$i�{{S��7	{����ʰŨ��
4r�0�:����
�7�BC_x�w���A��[��Pq�]�%ъ;bJ\;r�[	�FӉ��@�>�%�8���4]��.�|�n��c  �$�s�J��%�PPq� ��>��^;����׮�se�r�Y��J ��� ��S3�k��P� ϯ� ��_߿�J��L%�,J��(k3��&�Q�)Bo���N�wGw�ޡл�%���7�\0���甘�Lª=�5@��E�^\K��8�OɈC?`��}s!OgTn�|}����{��ZƁL�LC�~i<`o�j�l��6��e+�%j�>�T5�e�NE��q���Tr�?<��E�^�{l��n^5yC�\Ǿ͛n�:����n����ő����Kg��+G���>�ȫ;Ո9"0�4��'m�B�Δ�=;̡�KCK��y(N��m��z|�"�=g�	��K�����9�I;%�z9p��0�{c_��>��A�/~���R��i�-p�"� �+b7�g�̙
�დ��a���<|}m}x�K�O�3+Xv�%�.��|��dxr�u�����C�{�۟-�_��r��zڋ�$��M�.ڡ�5�/��X�I�8�{����<o�9���`[W��*�j88�6hҳ�Ö����cฆ��+�oŞ���&r���M�8�|d=���`�+q�2��:�H:!����߻�?#ŷ�8���N�@�dω�R$mR�]��M7��ib�����u��m��/bf��F�8�~�Фr(.Z-rmQ�0�5v�{�d���3.����g	�e��y�b=҇��wJ�M��%j�/���w�秈�:�^+=y���:׸r묄X.��WvS���F�G�<�xݖ	����P�Z���KZ�Z�Xu��Ł���E�SZ���]��t<n{#��f|3@Z��K��v����rh�,bM�b�-�B�:òi�l�/�ۡ�y���k	��v2����87a�o�\���Ɖ#/�<O�	u7[}/�~���ϗ3�_E�nu�%Wg�o�`�d3Z2c�%�L��.�@��5��<B=$_;f.�<���{�CE#���K�ю[�l	�o��'A�2@�Vq�̯���;��R��䒠TD��ǁ�e�V?G�tR춭-���r4w0��_��WCuipr���K�#r�HC:��#����H�`��p;�SrU�����~z��@=�nK�Ѵ��aDqN�;�8)�!���L�;A~�Z/���eZ}�n��@�dZÕ�&��i=���h�^=Z{D85\��4t�3��Ϗ�w�
��]DX��Z�3�ޭ�fa:�,�}��I�i
��}�� �%��
�&�)vv�*��%�T@`���&=���J��aEɟ�?�����У�sW�ԏ^!�|	�V,W}B�(�b�fq��-7��?||��'���8�:�C���7[~�8��6���hH�N;�C~�~ɇ�7��2�A��yd\���A���EW ���%��}}���!UB��¢!{T<|�{� �=0�X���֎��ϯW� ��{��F�x9��xQ�k�%ϔ<�*�2��g��z2l�;�ߵ�_��|Y�@|a1�9�`<x��<S���;+�<�@X�1"�{�����c�F��K��2�5Io�*���>�/�M@mwނ
������m�}����~]�A��w�3�v<�ٽ�B�ړ�c�R�]����ѧ�]��u���%^5|j�[��J��܉ğ�2�|���_, ���*�:[*XZ�%�����Rb/&~��pт���x��>o}��/����C��c�!���8�2mi�x2�ڝ���^�q�j�9�2P�:�yS�o�)�/A/���y��N����M�f�6,�-4��|�n�c�W�MO�����+8���i�x�մsC�*z���Mݑ8���wn��gW��p�m�:Y���W�wl9�m[��[�[x��J��$�0����� 2O��B��j�}��F΍�Y~͵�P/Y~�«T�;a��W>�k���v��?�[ gä\@�e\�6��E���)�T�p��b��}�$FY-�W���-��-x8�Vu��.U��'�ü�S���wm�G ���w�l�n>�qNP�d8�-b;�x&����b̑{��7�&��o�>	��J�L�M�	yX���������>�$��]�=�2'�6���~}~^�������D�W���[��d���1]ZQ׍��6���E~��s���4d��9�]���ce
�|�ID]gtN��Y!�����v׉��	՝�tE�]�O���s9�Fk/�(M��)ڦ�b?@�Cw��+弔-�t����=�-}�OF�H��V�r��Ⱅ�����i�Xۂ�m_�6��D����O�;I9F��lDa��Mi�~�����f�vG�2�v�/�A���M9X�\�@r�?p�a�_�L$��P�3���lbIt�_��f}I�� 
�ĝ�<~+����tk�~"�6պf�LŒ��Å�X�@16O��>@{L%�}`���틉L݇�j�pՏ~�����'�S�r)�Ɓo�A��m�ۋ;���ӧL`�!����(g���H�.�N��歆Cn {��GA�"_K���U�
8�916�%7w����ޔa�����gP�4��2zS�h:/FRٕ�݃�����/@��d#��Gߎ��N?\��{����a��=�P&fD>��q&��a�����F<�dԟ?���~�F�p6��I��p��ԲP�o�KI�L���#0kN��N�n���?��2��o&�fY�{�ከ*�;g��h�	��(��|�����{&�W\�0�V�����
�ޒ VZI80���-��!~؉��Աa8CZ��K���z=a��1La�/��?P�'��6�
�^�����^��p���2m�7�6�Q�|�ԋg��UJ�'���Ϛ�pg�Vz+��8BP��-b��v[/3�~{c�N0���o<@Q��\	gXW lg2�L��#�N��w����P	Yse�h�Jw�/���A`T!�G(F�-
(�N�dh���
}C��3�ٲa?`q7���ڒE'����
�}�ũ�{������绗�3��6U���h9�D"mo���d2L{�O�o&�����f��!�~*a�xZy}�>�O`w&��f^9�<�6��*��h3����q7�b�ٍ�)�.!�̈́\mZ��~7g��J̐�iRh�_���f�C ���wd���Gc�,�;P0��g�,��RP����n#���|���>�8^��9ǧ�R�{2d)̇9
�"{��|R	�ً��M������@��D>������MD���P���^S���R��5�����5�
2�9D��ř̬���#��v(]]��y�$p�b�������MG���Qݤ��>1�96p���~��[I��ݥ�	���&�nѩۊC����aR�0�R0�%I� q@qC��V�3�Q��_��iG�l|5P_�I��-�6g��x–A�좴Q���6NKl2Sj�6G|�-s��d�Q�^u��$�n��#�G0��Ws���4�<U� ї��/P?,
gJ�>�z�
�S)EnTw��	�s�vnXJ��B�&�UWh�U�Ի=�:K���d��Uyf�4Rk�if�^o�kZ�H�
�Rp'�zQ��J���؉����7f�6���F�r�>wI3\Θ@�*�-#Wz���M\9���_��96�J�n�J"���nR��'1�n�j
��/c��W��C�5�У��Yy���q)��;��rŖ�l�X�����b�ê�V[��b,�f��o��>�]ft�w�N>��;p�R���K�/��#�k[�M�h0�.l�r�h{��A��\#��Dļ�I&��7�����R������JCv3����IV���<�3���\u�ǭ��Љ���!��]�6���
�Y����j}��[�?ywq�a}/�l���;# ڥ�A;��O{�FrK<+)ۘ+D8���!_��O��-�y"��#$�e��"L*m��҃j,ć!p��=�>2�_e�/��5�~��h!`l:��x+N[�iϰ���*/Ҧv��!��?�}��R��,�R� �yC���pL�����֕*
��З�/ȮI���dY���؁���R#������#)ڦ΅T-���?���w�t�ğ~;��'�h�
�D#0��f�&�'���"`*��V��J��5�q��4c-,fO�kU��c;]�Ƈ��i0}4_��ݡWďWv�_��z��Ш�8�p�W�RB�]�F?Ώs�/a�i��Ku�!�Xx�w��{�S0J/#�q4�Tα+��Q|ko�-1l� �vKt+�d �����T�v�'P���ǪHU�
��vHE�wsi8k�"ܳRخ.L��.��@�5{�Ճ�oi�J�v #�,��-,��������mt�f�
����~�$�M�f+�`Qo���xðU�u�,4?�w:�-��x�R���(O�(tf�lQ��H��-��'eՖ�9����Fþt$��!�ٺWL�'47r֚dA�Po�^��D٦��o��{"�v	�[�U�5��])|ь�&XbZ�tBw�c�z��;���O�d	�D$��c�e�d���*��B�f�A��$�6��7�}�(��!0�襎z�B�%"�1a��N�Ld���X={���հ�7/����k�u�Pi �]�ࠇ,hPU��+�����F³3����k~�?!��M��iR$�<�����Е%��F��:��M'�=n�<�{�|
<�(�JI�|L!(ҽTq8�\.�k��z�ǝ�JJ�������;�co��8�g'�m��c�>v�aLo��ևT4�Co.�ap�S�d��t���֯�s�1�*�ɼ.݀gv
�mB�Ħ=_�:�Q��Yڻr\b���c9��(�r�ى�g�Ĺ�\c�Oږ�V�7��e��%���P�х�h�wj��
!���nP��w��{��}�8��a�E�J�~U$B�@d���#N~*c���gI8���犲(W�$߼�-QS�O-�n��0%�J�9�����)^Z�HO�ꎝ��Rk0�A�S��F�W�l�d)�s�S��`Qh�9Tkڥ����=n0�A��n���'b�>��b���>�g��AY��6Z�,U͐����~<�~�&`}���'7k����A_����
gꪐJ��x;�%CW� �`dx�^��`�gV\*����Ӿdn�6�m@�]�c�y�u&4�f�{(oܦ���q����V�AX(F��#|r�G���{��1P�d�ŗe��K5�?V!�Fdݓ��[
5�Pq���{�ĕC�2N� �+��0PI;X�Bo65��#�K-׼C��}z�7�����-P8aS��I(�_�>��p�zx�'��X��G�Uk�1E& j2�<a�b�W
7�x�旁o�h��_Oh��8�}*Fd�'<��Ή�b�&ȝ��p�6=�5��w��%���^����_�hDT#X��j����Pq���w_�m�> g�+o���x�k^
c:B"�cQL��%��?o9�א����i~�@�Qʇ��IV�F%�v�n�Z��=q���-c���\�2t��pa_��t#����8!��w�D�~�:ؑ��b�o����o��
^F3庰�]����^n&]�@�Ə�����RZ��֞K����?�x�^gً�ʡ���V��eDpk�ы�8 �,�.��+�o�O_�d!V��8N�#İ����,��y?�^`ħ���[��]@�q����i��((�2��ϵ�L��r'�#�uM@{���vA�x�ԛv�ʯ�.<�֑�MW94�K�U�EJ��~f�)���.5��o.��e��3n���*Ԙ/���Vx�[���rh�k���!W0I�$�l=�w?�7��l=�|�D������M�fA��Y��|�$X�P�f��^���
\>U��`yQ�IA��۸,mA�vCQ��/��		в譝��KZ1���X��s�q��AN��=��x�y��3�L�QB#
}���(��b�|�k�9��uj�[��-�f��ѪP��Γu�����i���Ȑ[Wě#j���ȵɺ?�
�/s��u0޶p�����&�.���kg���[��_�O&#݋����#:vU���
e�͑[����L�����u�QW����'�̪��;Xͪ�
(��f\�T+�t��|�i�Blçjw�����L����r�"N������J:O1���:\�M
� ����1�C%��蛈���C9R�HE�(R�����;xXwFa����j)cy͖ȝC�r�<4=~s��(|�N�Â��Ê��j~%��J�x��R#C{Zf��:�l���-
g�s�V��(��a�	H���A��8i%��p}(D���_�#N��W���'e�3}��?!�6ޅ��z�Z�SC��BN�3R�M��i��щ��gco�{��.�W�3���de�o4�X2��.�04\��h?f��s^�zܼ�����v����M9��H�~�Mֽ�cI�LjC���U[����u�$|	e0DRT�]c�.uh�No\9)��=.f9y:,Ҧ���˗�)1��@~���d+)�H��;I�[�_��W{w��腅 ��^��ҝ]Ov�'Ѯ{8���LKI}h!�?�xs�?�Ts��G�z�g���s���&���3$)A-S�l�x�غ~��w���e����1�ʼ��p���=ק=57��D40s���w紊��5��gX��B
upT����:(
�����+��%;)���A�.�a�i�vX5������N����<=�\�/�Y�-"���</n����8�"���B����s�s)�z�� ������$�6�S}1vG��ˊ�D.�~��^��D7g��5��.�'�b����1^-t��s�6��a'����`GV�\|5[yÛ6R��&uF��UG���}�8����Q�0z��
D���ѣ(��ˠ�´SM��L����)&�[nﯰNW��WK�*��HY�~W�7fHt�u�� te�ἔ#�A(��C�^=�.#�:V��x���霶cn��5������,wP�2?܆��U�r�I��lg�sʙ�ʋn�Aj1��0�E�%�Ų/�E�u�cm5Ɖ�t�ԮJ�X��vlGG�T�p/v���M�[��rv�}��r�ܛ��?��u[�A=��W��)G�����M'd7�7'Z��u����Tl���L��a��&�i "��T�\���G|�dr���+�xၜG�|��u��'TJ���q��bt?��qfM%��՜�i�n��T]�����J{��m(�?���0dP�V�CpWS��	�����˵�W�
�/[�Q����
�OlFd�zP�t���Ҩ��r�2�x���V��|`��l���'�(�*�'����@�oQy=�z�l��w�z�I5[l�5�s��cO@�0w���.ع��<	B��_g�����m�w�t�˞TG:�����gx4y��D��6�}#��C{]1�#�s��
���M�@ҵ�X�ˉ� �=6��=��j�E�*�/��4L6�rMg�$�an,F��(t�͝䲥zH's�o�𗖺�ȫ�^u�W/�p0l�޹i
�X��r&���2De��d�R��xY��*__���3�ջ/�#�F�\8nS<��N�y?�����DO ��}bޗ�綠���J�Y�:�΢�f	w�DҨ�:zF��%��_��1�'��=��ݥKo�J��R���w=�l����9@R��(o��zx�T��F|y�p���|
�5Pi.L�;FA�
� nu���4LB��;i�x�c�f}�*��������>j�PƠ�ΙD15\U#x�0�H�eE~�Ч��^��A]/E�닿��pN����*��bv"�p��Ca	��,���oՕ\-'|��B7�Sl@�M��J�T��H�8[D�2K�h%QU1��m�\��Ja�z���T��F�~���N���ן�����v*��=��H���_2�� GiXO���ccG*�Pq����p!��"f���u�"ˠU>H��0�������=�fq �C��``�/
��$�w�#x� jhm���a��ҭ^"z`J������	�Qmg���X]�3���S��jom���y�`�.F�jG�W��gqJ�RAR� Fؼ���I��A�'�[]��_�6�ܞ�xJN��|G@��W@g^�'�Z���u�=-K�qb2c5�A}��uz_�/5��oC��8�B'�ƴ}z:�Z%�¬|�����G�͋n����2��L��Пu��/�i�����8c���\�H[?�.љ`��>�fO�^�u��/ʗ�y,��J\��J>��M���0E�1���C1��0�o�~�o��:-�V�SI�i�Z.��Ϯyָ�)%��Ԓ�Kfʪ^Y�^W�B�h��:���jb��Y�*�|(x
q�N
�
��#|T����3�Y�Eѿ�������]-��뭦lޣ��1�j�+U�y|J��ԅ�ңH�����_�?|_W�V�{��n9���\ez���;���1p�ѧ�[Z�nS�ʪ��9���qŢ��"��,1�5�g�XR]J�V�����t>�aP�H-
~��?�	�3[��y����@pbn#���c3�D��$�H�����zTY�7f����7�-�m��w�����{�H
��j� ��z*K\+SʁN�+ƃ�2��h�H���ѿ,5�nކ�m���q��n����x��} $݋�i*��r�x{�O��
�U޺~|y)�����bPl�����)�R�q	���i_��T�W�'�&v�aRWA)�L��!��5�E�)1r}��:�͍�|/�>�_��cTUVj<8	��Ѧw����&_�]��y�������.��X�o����ǹ��~��R��ޠ�Y<��C���u��������<=�~�ҳDX�Q�v��^Ƃx�"�g�
��7����V�IM��qJ�]�ML�M#���V#(Xka=_Ս��޿���ϡ����~��X�b�˙��r��#����r�r�V_��r7��kN��\KM�f/���8���f��5?�>�	��ˎlȥ�����d�>ő��m��J:'c���KJL��D"kь��gc^'����;�z��k��N`��C�
^Vv �CɉC��"6ڌ8����_��V��\��Ow4Pr�(����{*SKHl :��:��E`�j+��|����d4K󄂕M�\p;iX;1Jv2�,�k��+��֛0���V�'�K�*:�@'r��V�Ԭ�s�C��Sx\t��	����5Z�u���Hȉ��A]�Y�=~u�c,	��:�\m��q�hW�f�����{�D�#�z�w}{����i5�@�?�sNJ�'#�ޢZ�� ��A��7�%��T5�R��%�Ƀp��0ǓS@G�j 	�٪�_d���l�����d�т�1�B�� 9�I����j�Z���=���[���['X_��0[N��%(���EF�86.Y1wLj`�Z�:�	-
��XD~�0��?�6�s ���ӆ�?i���s���d�`�
91���$e
FJ�S�&=R�*�#�[�����;�Ad���l�
ݔ�Qmy��Y\.�����9S�O��/��.�ϟ���^�9Z��d����gO1bIj�C�bw����RS�{����� �/��;�u��?5p��LL��
�#������rJ�����	�;�����_�;`��������	���;��f7�al$��o�Q�Ax�M1/���-����ߖ���0!�W�"Ƥ�����Dž0�&�[Z%�q�F���q5�=i����?PK/WUWN��e��pip/__init__.pyPK/WUWo��׼V��%pip/__main__.pyPK/WUW~%�����pip/__pip-runner__.pyPK/WUW��5���pip/py.typedPK���WԈ^C���pip/_internal/__init__.pyPK/WUW�c[(��upip/_internal/build_env.pyPK/WUWy�"e�(��pip/_internal/cache.pyPK/WUWJ1�-�6��H!pip/_internal/configuration.pyPK/WUWɗ���\��2pip/_internal/exceptions.pyPK/WUW'���T���Mpip/_internal/main.pyPK/WUWi�j۰	���Opip/_internal/pyproject.pyPK/WUW1�� $���Xpip/_internal/self_outdated_check.pyPK/WUW�
�`dB.��Ndpip/_internal/wheel_builder.pyPK/WUW�w�4h����ppip/_internal/cli/__init__.pyPK/WUWQ@�g"#���qpip/_internal/cli/autocompletion.pyPK/WUWʐ�1�
"!���ypip/_internal/cli/base_command.pyPK/WUWiZ�H �u���pip/_internal/cli/cmdoptions.pyPK/WUW"GM-+$��x�pip/_internal/cli/command_context.pyPK/WUWfn�����pip/_internal/cli/main.pyPK/WUW@�ze� ��.�pip/_internal/cli/main_parser.pyPK/WUW����1*��Ѳpip/_internal/cli/parser.pyPK/WUW
6O��"��Ϳpip/_internal/cli/progress_bars.pyPK/WUW��&�)�G ����pip/_internal/cli/req_command.pyPK/WUW��Yɞ���a�pip/_internal/cli/spinners.pyPK/WUW�zKXt!��:�pip/_internal/cli/status_codes.pyPK/WUW��1�*"����pip/_internal/commands/__init__.pyPK/WUW�
�����pip/_internal/commands/cache.pyPK/WUW}���M�����pip/_internal/commands/check.pyPK/WUW�Κq_�$��E�pip/_internal/commands/completion.pyPK/WUWbO�9W&'����pip/_internal/commands/configuration.pyPK/WUW��~�	���Apip/_internal/commands/debug.pyPK/WUW�V��"���	pip/_internal/commands/download.pyPK/WUW��
d ���pip/_internal/commands/freeze.pyPK/WUW�������pip/_internal/commands/hash.pyPK/WUW�Ô<�l��3pip/_internal/commands/help.pyPK/WUW9N�����Ypip/_internal/commands/index.pyPK/WUW�:�Nt!��tpip/_internal/commands/inspect.pyPK/WUW��$Q�p!��$pip/_internal/commands/install.pyPK/WUW]�[�0���@pip/_internal/commands/list.pyPK/WUWW��/bA ��(Mpip/_internal/commands/search.pyPK/WUWU D����Tpip/_internal/commands/show.pyPK/WUW��t#�.#���\pip/_internal/commands/uninstall.pyPK/WUW�;'�NL���apip/_internal/commands/wheel.pyPK/WUW�u
.;Z'��wipip/_internal/distributions/__init__.pyPK/WUWdպ7��#���jpip/_internal/distributions/base.pyPK/WUW��?xxJ(���mpip/_internal/distributions/installed.pyPK/WUW����+5$���opip/_internal/distributions/sdist.pyPK/WUW�Y��$��wpip/_internal/distributions/wheel.pyPK/WUWC?K� ��hypip/_internal/index/__init__.pyPK/WUW$n�	�x@ ���ypip/_internal/index/collector.pyPK/WUW܎E4�#�%��̍pip/_internal/index/package_finder.pyPK/WUW�Eb�������pip/_internal/index/sources.pyPK/WUW�"H�.<#��ͷpip/_internal/locations/__init__.pyPK/WUW��||	�%��<�pip/_internal/locations/_distutils.pyPK/WUW@����	%����pip/_internal/locations/_sysconfig.pyPK/WUW��ER��	����pip/_internal/locations/base.pyPK/WUWa?y={�"��e�pip/_internal/metadata/__init__.pyPK/WUWAm��#
�� �pip/_internal/metadata/_json.pyPK���W�w��f��/�pip/_internal/metadata/base.pyPK/WUW�-�FT3''���pip/_internal/metadata/pkg_resources.pyPK/WUWyAh�a�,�� pip/_internal/metadata/importlib/__init__.pyPK/WUW���YZ+���pip/_internal/metadata/importlib/_compat.pyPK/WUW��.�	i *��mpip/_internal/metadata/importlib/_dists.pyPK/WUW�
ޜ%	 )��t!pip/_internal/metadata/importlib/_envs.pyPK/WUW{�(�;? ���*pip/_internal/models/__init__.pyPK/WUW0�Oy�!��Y+pip/_internal/models/candidate.pyPK/WUW;���"��-pip/_internal/models/direct_url.pyPK/WUWb�ch�	&���4pip/_internal/models/format_control.pyPK/WUWߗ������8pip/_internal/models/index.pyPK/WUW�6��>+���:pip/_internal/models/installation_report.pyPK/WUW�ݐX�SQ��)?pip/_internal/models/link.pyPK/WUW��l���Xpip/_internal/models/scheme.pyPK/WUW��|�h#$���Ypip/_internal/models/search_scope.pyPK/WUW�����s'��o`pip/_internal/models/selection_prefs.pyPK/WUW[�)�%���cpip/_internal/models/target_python.pyPK/WUWi����hpip/_internal/models/wheel.pyPK/WUW�J22!��+npip/_internal/network/__init__.pyPK/WUWCXJ��=P���npip/_internal/network/auth.pyPK/WUWO�Ѳy_��c�pip/_internal/network/cache.pyPK/WUW�+��!���pip/_internal/network/download.pyPK/WUW����	�#��T�pip/_internal/network/lazy_wheel.pyPK/WUW��d��H ��l�pip/_internal/network/session.pyPK/WUW������4�pip/_internal/network/utils.pyPK/WUW-�{_����1�pip/_internal/network/xmlrpc.pyPK/WUW$��(�pip/_internal/operations/__init__.pyPK/WUW�*���!��l�pip/_internal/operations/check.pyPK/WUW�<��5
X&"��B�pip/_internal/operations/freeze.pyPK/WUW[��h��m#����pip/_internal/operations/prepare.pyPK/WUW*����pip/_internal/operations/build/__init__.pyPK/WUW�sy��/����pip/_internal/operations/build/build_tracker.pyPK/WUW~�K^�*����pip/_internal/operations/build/metadata.pyPK/WUW�',�l�3��b�pip/_internal/operations/build/metadata_editable.pyPK/WUW2�.2�1���pip/_internal/operations/build/metadata_legacy.pyPK/WUW��e�3'����pip/_internal/operations/build/wheel.pyPK/WUWק��>�0���pip/_internal/operations/build/wheel_editable.pyPK/WUWGL� �.��[pip/_internal/operations/build/wheel_legacy.pyPK/WUW��{53,���pip/_internal/operations/install/__init__.pyPK/WUW^��3��'pip/_internal/operations/install/editable_legacy.pyPK/WUW���>� Ak)���pip/_internal/operations/install/wheel.pyPK/WUW������
���(pip/_internal/req/__init__.pyPK/WUWE�aġTJ!��U,pip/_internal/req/constructors.pyPK/WUWn���\�E��5Apip/_internal/req/req_file.pyPK���W��bnJ$X� ���Upip/_internal/req/req_install.pyPK/WUW�j�`��Tzpip/_internal/req/req_set.pyPK/WUW	�Ab�d`"���pip/_internal/req/req_uninstall.pyPK/WUW$����pip/_internal/resolution/__init__.pyPK/WUW�˩�G ��כpip/_internal/resolution/base.pyPK/WUW+���pip/_internal/resolution/legacy/__init__.pyPK���W��lD�^+��_�pip/_internal/resolution/legacy/resolver.pyPK/WUW/���pip/_internal/resolution/resolvelib/__init__.pyPK/WUWF��45+��;�pip/_internal/resolution/resolvelib/base.pyPK/WUW��>�HS1����pip/_internal/resolution/resolvelib/candidates.pyPK���Wly�E�>|.���pip/_internal/resolution/resolvelib/factory.pyPK/WUW)�Z��I7����pip/_internal/resolution/resolvelib/found_candidates.pyPK/WUW���z�`&/���pip/_internal/resolution/resolvelib/provider.pyPK/WUW����/���pip/_internal/resolution/resolvelib/reporter.pyPK/WUW"O�\�3���	pip/_internal/resolution/resolvelib/requirements.pyPK/WUW@�q��01/���pip/_internal/resolution/resolvelib/resolver.pyPK/WUW��zpip/_internal/utils/__init__.pyPK/WUW�&�k�
#���pip/_internal/utils/_jaraco_text.pyPK/WUWJx9?�����%pip/_internal/utils/_log.pyPK/WUWrB—����'pip/_internal/utils/appdirs.pyPK/WUW�c�k�\���*pip/_internal/utils/compat.pyPK/WUW����s)���.pip/_internal/utils/compatibility_tags.pyPK/WUWl=������5pip/_internal/utils/datetime.pyPK/WUWжŎL+"��c6pip/_internal/utils/deprecation.pyPK/WUW&��]��)���;pip/_internal/utils/direct_url_helpers.pyPK/WUW+�J�F��#@pip/_internal/utils/egg_link.pyPK/WUW�����nCpip/_internal/utils/encoding.pyPK���Wm�<n�C"���Epip/_internal/utils/entrypoints.pyPK/WUW����!���Jpip/_internal/utils/filesystem.pyPK/WUW��O-X� ��Spip/_internal/utils/filetypes.pyPK/WUWZ}�)���Tpip/_internal/utils/glibc.pyPK/WUWjj�� ����Ypip/_internal/utils/hashes.pyPK/WUW�9��e
S-��>apip/_internal/utils/logging.pyPK/WUW߫����\���npip/_internal/utils/misc.pyPK/WUW;��w���ڋpip/_internal/utils/models.pyPK/WUW�L���< ����pip/_internal/utils/packaging.pyPK/WUW\�a[�S'����pip/_internal/utils/setuptools_build.pyPK/WUW�\��#!��ۗpip/_internal/utils/subprocess.pyPK/WUWH�/'�`$���pip/_internal/utils/temp_dir.pyPK/WUW;��6�	u" ��կpip/_internal/utils/unpacking.pyPK/WUW~��9����pip/_internal/utils/urls.pyPK/WUWM���
!��c�pip/_internal/utils/virtualenv.pyPK/WUW�(�K�����pip/_internal/utils/wheel.pyPK/WUW/���/T��F�pip/_internal/vcs/__init__.pyPK/WUW�
���
����pip/_internal/vcs/bazaar.pyPK/WUW|0�۱�F����pip/_internal/vcs/git.pyPK/WUW�q��~��u�pip/_internal/vcs/mercurial.pyPK/WUW�C�.d�-����pip/_internal/vcs/subversion.pyPK/WUWF�ز�Y#��M�pip/_internal/vcs/versioncontrol.pyPK/WUWe�]�f���pip/_vendor/__init__.pyPK/WUWAÓ����pip/_vendor/colorama.pyiPK/WUW�N�N���pip/_vendor/distlib.pyiPK/WUWx	A���Gpip/_vendor/msgpack.pyiPK/WUW���W���pip/_vendor/pkg_resources.pyiPK/WUW��th���pip/_vendor/pygments.pyiPK/WUWRw��9pip/_vendor/pyproject_hooks.pyiPK/WUW�X�\���pip/_vendor/requests.pyiPK/WUW���!�����pip/_vendor/six.pyPK/WUW�����g� ��=pip/_vendor/typing_extensions.pyPK/WUWB�!!���pip/_vendor/typing_extensions.pyiPK/WUW8J���p�pip/_vendor/urllib3.pyiPK/WUWM��6�����pip/_vendor/vendor.txtPK/WUWkwE���&�pip/_vendor/webencodings.pyiPK/WUWf�'?�$��|�pip/_vendor/cachecontrol/__init__.pyPK/WUW�oOM�� ����pip/_vendor/cachecontrol/_cmd.pyPK/WUW!c�w[�#���pip/_vendor/cachecontrol/adapter.pyPK/WUW?%���!����pip/_vendor/cachecontrol/cache.pyPK/WUW�����G&����pip/_vendor/cachecontrol/controller.pyPK/WUW0[����'����pip/_vendor/cachecontrol/filewrapper.pyPK/WUW;����&����pip/_vendor/cachecontrol/heuristics.pyPK/WUW!����pip/_vendor/cachecontrol/py.typedPK/WUWv=�^	%����pip/_vendor/cachecontrol/serialize.pyPK/WUW�<e��#��@�pip/_vendor/cachecontrol/wrapper.pyPK/WUW%�N��/+��f�pip/_vendor/cachecontrol/caches/__init__.pyPK/WUW3+Ǫ��-��b�pip/_vendor/cachecontrol/caches/file_cache.pyPK/WUW����Fj.��H�pip/_vendor/cachecontrol/caches/redis_cache.pyPK/WUWø�Q^����pip/_vendor/certifi/__init__.pyPK/WUW/ �����h�pip/_vendor/certifi/__main__.pyPK���WK��`$���C�pip/_vendor/certifi/core.pyPK/WUW����pip/_vendor/certifi/py.typedPK/WUW�I��������pip/_vendor/chardet/__init__.pyPK/WUWsW�9*z���pip/_vendor/chardet/big5freq.pyPK/WUW|!��B�!��4pip/_vendor/chardet/big5prober.pyPK/WUW,-�v�	0''���7pip/_vendor/chardet/chardistribution.pyPK/WUW4�!�K)���Apip/_vendor/chardet/charsetgroupprober.pyPK/WUW��`@,$���Fpip/_vendor/chardet/charsetprober.pyPK/WUW9�+���)��Opip/_vendor/chardet/codingstatemachine.pyPK/WUW�0�_-��Upip/_vendor/chardet/codingstatemachinedict.pyPK/WUW�Q�oD"��yVpip/_vendor/chardet/cp949prober.pyPK/WUW!׼����(Zpip/_vendor/chardet/enums.pyPK/WUW��n� ��E]pip/_vendor/chardet/escprober.pyPK/WUW���q�/���bpip/_vendor/chardet/escsm.pyPK/WUW'᪅\^"���ipip/_vendor/chardet/eucjpprober.pyPK/WUWh˺�m�4 ��8opip/_vendor/chardet/euckrfreq.pyPK/WUW�V\?>�"���pip/_vendor/chardet/euckrprober.pyPK/WUW��a�91� ��a�pip/_vendor/chardet/euctwfreq.pyPK/WUWL��?�"��v�pip/_vendor/chardet/euctwprober.pyPK/WUW0��$q'�P!����pip/_vendor/chardet/gb2312freq.pyPK/WUW&��>�#����pip/_vendor/chardet/gb2312prober.pyPK/WUW�=��8#��$�pip/_vendor/chardet/hebrewprober.pyPK/WUW�$�!0�d��pip/_vendor/chardet/jisfreq.pyPK/WUWJT�1� ���7pip/_vendor/chardet/johabfreq.pyPK/WUW��u�?�"���ipip/_vendor/chardet/johabprober.pyPK/WUW�ޤ���i��8mpip/_vendor/chardet/jpcntx.pyPK/WUWsJi�_r�)��\�pip/_vendor/chardet/langbulgarianmodel.pyPK/WUWIC[���%���pip/_vendor/chardet/langgreekmodel.pyPK/WUW\8R���&���pip/_vendor/chardet/langhebrewmodel.pyPK/WUWCcU��)���pip/_vendor/chardet/langhungarianmodel.pyPK/WUW�Hs�x'#�'��P�pip/_vendor/chardet/langrussianmodel.pyPK/WUWcp�Mv�$��
pip/_vendor/chardet/langthaimodel.pyPK/WUWT�-��t'��m-pip/_vendor/chardet/langturkishmodel.pyPK/WUW�?$�#���Ipip/_vendor/chardet/latin1prober.pyPK/WUWg�{�%���Ppip/_vendor/chardet/macromanprober.pyPK/WUW����:�&���Xpip/_vendor/chardet/mbcharsetprober.pyPK/WUW?�%-�S&��`^pip/_vendor/chardet/mbcsgroupprober.pyPK/WUW)V��Q�v��Abpip/_vendor/chardet/mbcssm.pyPK/WUW���ppip/_vendor/chardet/py.typedPK/WUW�����!��	qpip/_vendor/chardet/resultdict.pyPK/WUW\��Q&��-rpip/_vendor/chardet/sbcharsetprober.pyPK/WUW"r��)&���zpip/_vendor/chardet/sbcsgroupprober.pyPK/WUW���>V�!����pip/_vendor/chardet/sjisprober.pyPK/WUWJ+n9�:(��,�pip/_vendor/chardet/universaldetector.pyPK/WUW�Q9!$��H�pip/_vendor/chardet/utf1632prober.pyPK/WUW�?��_�
!��۞pip/_vendor/chardet/utf8prober.pyPK/WUW��C����y�pip/_vendor/chardet/version.pyPK/WUW#��n�pip/_vendor/chardet/cli/__init__.pyPK/WUW��7���%����pip/_vendor/chardet/cli/chardetect.pyPK/WUW(���pip/_vendor/chardet/metadata/__init__.pyPK/WUW7R�-�4)��5�pip/_vendor/chardet/metadata/languages.pyPK/WUW�^�H�
 ����pip/_vendor/colorama/__init__.pyPK/WUWR٭���	����pip/_vendor/colorama/ansi.pyPK/WUWT{�g<x+#��q�pip/_vendor/colorama/ansitowin32.pyPK/WUW̃��F�"����pip/_vendor/colorama/initialise.pyPK/WUW�=8��%��t�pip/_vendor/colorama/win32.pyPK/WUWC�G�������pip/_vendor/colorama/winterm.pyPK/WUW��OMK&����pip/_vendor/colorama/tests/__init__.pyPK/WUW�E���'��F�pip/_vendor/colorama/tests/ansi_test.pyPK/WUWj��7	�).��z�pip/_vendor/colorama/tests/ansitowin32_test.pyPK/WUWcx#i�U-����pip/_vendor/colorama/tests/initialise_test.pyPK/WUW�lh�J)��.�pip/_vendor/colorama/tests/isatty_test.pyPK/WUW@�2�7#��`�pip/_vendor/colorama/tests/utils.pyPK/WUW���}*��!�pip/_vendor/colorama/tests/winterm_test.pyPK/WUW�F�^E��w�pip/_vendor/distlib/__init__.pyPK/WUW�&�8F++����pip/_vendor/distlib/compat.pyPK/WUW�7xڲ0�����&	pip/_vendor/distlib/database.pyPK/WUW*���bQ���W	pip/_vendor/distlib/index.pyPK/WUW��M-3����l	pip/_vendor/distlib/locators.pyPK/WUWx�5gl�9���	pip/_vendor/distlib/manifest.pyPK/WUW�"@D�����	pip/_vendor/distlib/markers.pyPK/WUW@�]"u%y����	pip/_vendor/distlib/metadata.pyPK/WUW��Հ�D* ����	pip/_vendor/distlib/resources.pyPK/WUW��tԎ�F����	pip/_vendor/distlib/scripts.pyPK/WUW
�]�G���l�	pip/_vendor/distlib/util.pyPK/WUW��2�~�[��GG
pip/_vendor/distlib/version.pyPK/WUW�g�8*z���a
pip/_vendor/distlib/wheel.pyPK/WUW�`p�#���W�
pip/_vendor/distro/__init__.pyPK/WUWT�i<@����
pip/_vendor/distro/__main__.pyPK/WUW�
z-����.�
pip/_vendor/distro/distro.pyPK/WUW��|�
pip/_vendor/distro/py.typedPK/WUW�x��Q����
pip/_vendor/idna/__init__.pyPK/WUWe0�3!.
��
�
pip/_vendor/idna/codec.pyPK/WUWE��A��e�
pip/_vendor/idna/compat.pyPK/WUW�8���2��]�
pip/_vendor/idna/core.pyPK/WUW6Ә%W���t�
pip/_vendor/idna/idnadata.pyPK/WUW�S!Y����
pip/_vendor/idna/intranges.pyPK/WUW5�(� ��(�
pip/_vendor/idna/package_data.pyPK/WUW��}�
pip/_vendor/idna/py.typedPK/WUW������&����
pip/_vendor/idna/uts46data.pyPK/WUWC24�l����pip/_vendor/msgpack/__init__.pyPK/WUW;;�ӭ9!����pip/_vendor/msgpack/exceptions.pyPK/WUW{W�������pip/_vendor/msgpack/ext.pyPK/WUW�HϪ����ߝpip/_vendor/msgpack/fallback.pyPK/WUWF�cf�"���pip/_vendor/packaging/__about__.pyPK/WUW�����!����pip/_vendor/packaging/__init__.pyPK/WUW*:c��,#��߽pip/_vendor/packaging/_manylinux.pyPK/WUW�t10#����pip/_vendor/packaging/_musllinux.pyPK/WUW0��`�$���pip/_vendor/packaging/_structures.pyPK/WUWm��?{
'! ����pip/_vendor/packaging/markers.pyPK/WUW��t�pip/_vendor/packaging/py.typedPK/WUWn�AZ�D%����pip/_vendor/packaging/requirements.pyPK/WUW5����u#����pip/_vendor/packaging/specifiers.pyPK/WUW�	ms�S=��pip/_vendor/packaging/tags.pyPK/WUWA��3�h���pip/_vendor/packaging/utils.pyPK���Wd�Y���8 ���pip/_vendor/packaging/version.pyPK/WUWS6�Zt4�%���*pip/_vendor/pkg_resources/__init__.pyPK/WUW���\�N$��m�pip/_vendor/platformdirs/__init__.pyPK/WUWqV�K��$���pip/_vendor/platformdirs/__main__.pyPK/WUW�(s��+#���pip/_vendor/platformdirs/android.pyPK/WUW���r���ͭpip/_vendor/platformdirs/api.pyPK/WUW0e���^!��|�pip/_vendor/platformdirs/macos.pyPK/WUW!����pip/_vendor/platformdirs/py.typedPK/WUWLw�!i" ���pip/_vendor/platformdirs/unix.pyPK/WUWp}�Vq�#��I�pip/_vendor/platformdirs/version.pyPK/WUW��/�	e%#����pip/_vendor/platformdirs/windows.pyPK/WUW��U?�� ����pip/_vendor/pygments/__init__.pyPK/WUWy`ʉ�a ���pip/_vendor/pygments/__main__.pyPK/WUW�����\��:�pip/_vendor/pygments/cmdline.pyPK/WUW�y����@�pip/_vendor/pygments/console.pyPK/WUW��s���
�pip/_vendor/pygments/filter.pyPK/WUW�\70�R!��I�pip/_vendor/pygments/formatter.pyPK/WUW�կT�$:����pip/_vendor/pygments/lexer.pyPK/WUWgL	�� ���
pip/_vendor/pygments/modeline.pyPK/WUWc��]
���
pip/_vendor/pygments/plugin.pyPK/WUW�r'�M ��� 
pip/_vendor/pygments/regexopt.pyPK/WUW7������%
pip/_vendor/pygments/scanner.pyPK/WUW70���!���)
pip/_vendor/pygments/sphinxext.pyPK/WUWbb��q���1
pip/_vendor/pygments/style.pyPK/WUW���{(���8
pip/_vendor/pygments/token.pyPK/WUW{��L��!��9@
pip/_vendor/pygments/unistring.pyPK/WUW�6�bs
�'��?�
pip/_vendor/pygments/util.pyPK/WUW��$��(���
pip/_vendor/pygments/filters/__init__.pyPK/WUW7 v]�0+���
pip/_vendor/pygments/formatters/__init__.pyPK/WUW���� P+����
pip/_vendor/pygments/formatters/_mapping.pyPK/WUW�|{�)��d�
pip/_vendor/pygments/formatters/bbcode.pyPK/WUWqH`�(��&�
pip/_vendor/pygments/formatters/groff.pyPK/WUW�i%J&�'����
pip/_vendor/pygments/formatters/html.pyPK/WUWʄ2 ��U&���
pip/_vendor/pygments/formatters/img.pyPK/WUW��Wy�u&���pip/_vendor/pygments/formatters/irc.pyPK/WUW�d%�I�K(���pip/_vendor/pygments/formatters/latex.pyPK/WUW8�Vl�(���,pip/_vendor/pygments/formatters/other.pyPK/WUW�Y�T��.��=3pip/_vendor/pygments/formatters/pangomarkup.pyPK/WUW��,��&���6pip/_vendor/pygments/formatters/rtf.pyPK/WUW�X���	�&���=pip/_vendor/pygments/formatters/svg.pyPK/WUW_��LB+���Gpip/_vendor/pygments/formatters/terminal.pyPK/WUW�M5���-.��hNpip/_vendor/pygments/formatters/terminal256.pyPK/WUWi�x�A
b/'���Zpip/_vendor/pygments/lexers/__init__.pyPK/WUW#�l̒:Y'��'hpip/_vendor/pygments/lexers/_mapping.pyPK/WUWMH.+��%����pip/_vendor/pygments/lexers/python.pyPK/WUW�zHt'��o�pip/_vendor/pygments/styles/__init__.pyPK/WUWv���y
�#!����pip/_vendor/pyparsing/__init__.pyPK/WUW}y}3r� ����pip/_vendor/pyparsing/actions.pyPK/WUW�('!K4��d�pip/_vendor/pyparsing/common.pyPK/WUW䂺S��l���pip/_vendor/pyparsing/core.pyPK/WUWmX��q3%#��P�pip/_vendor/pyparsing/exceptions.pyPK/WUWDka$R+�� ���pip/_vendor/pyparsing/helpers.pyPK/WUW����pip/_vendor/pyparsing/py.typedPK/WUW�`�PDh ���pip/_vendor/pyparsing/results.pyPK/WUWڼy�
�4 ��^pip/_vendor/pyparsing/testing.pyPK/WUWI�u�) ��"pip/_vendor/pyparsing/unicode.pyPK/WUWwV�Lv
�!���-pip/_vendor/pyparsing/util.pyPK/WUW�a��^)��8pip/_vendor/pyparsing/diagram/__init__.pyPK/WUW�_���'��HSpip/_vendor/pyproject_hooks/__init__.pyPK/WUW�kre�&��xTpip/_vendor/pyproject_hooks/_compat.pyPK/WUW���p
�.$��!Upip/_vendor/pyproject_hooks/_impl.pyPK/WUW���d"3���_pip/_vendor/pyproject_hooks/_in_process/__init__.pyPK/WUW��4�"�*6��8apip/_vendor/pyproject_hooks/_in_process/_in_process.pyPK/WUWH��v1 ���lpip/_vendor/requests/__init__.pyPK/WUW�E��#��btpip/_vendor/requests/__version__.pyPK/WUW�(���'���upip/_vendor/requests/_internal_utils.pyPK/WUW�?��L ��rxpip/_vendor/requests/adapters.pyPK/WUW�yCCS1����pip/_vendor/requests/api.pyPK/WUW8wf�|�'��8�pip/_vendor/requests/auth.pyPK/WUW���Y?���pip/_vendor/requests/certs.pyPK/WUWɊ[����pip/_vendor/requests/compat.pyPK/WUW/P����H���pip/_vendor/requests/cookies.pyPK/WUW�@2J��"���pip/_vendor/requests/exceptions.pyPK/WUW��Z.�'��:�pip/_vendor/requests/help.pyPK/WUW��Gg����pip/_vendor/requests/hooks.pyPK/WUWe@��&؉����pip/_vendor/requests/models.pyPK/WUW<ށk� ����pip/_vendor/requests/packages.pyPK/WUWH�Q�Y!�v ��C�pip/_vendor/requests/sessions.pyPK/WUW�t�.��$���pip/_vendor/requests/status_codes.pyPK/WUWQL�[`"���pip/_vendor/requests/structures.pyPK/WUW�Ue=Y)����7pip/_vendor/requests/utils.pyPK/WUWb�"���@pip/_vendor/resolvelib/__init__.pyPK/WUW,���4#���Apip/_vendor/resolvelib/__init__.pyiPK/WUWO��:�#���Bpip/_vendor/resolvelib/providers.pyPK/WUW*���?$��OJpip/_vendor/resolvelib/providers.pyiPK/WUW��nLpip/_vendor/resolvelib/py.typedPK/WUW�G�*5A#���Lpip/_vendor/resolvelib/reporters.pyPK/WUW��J���$��#Opip/_vendor/resolvelib/reporters.pyiPK/WUW{\��P#�� Ppip/_vendor/resolvelib/resolvers.pyPK/WUW_�)���	$��Zepip/_vendor/resolvelib/resolvers.pyiPK/WUWV�0��c!��jhpip/_vendor/resolvelib/structs.pyPK/WUWe�{�a"��0npip/_vendor/resolvelib/structs.pyiPK/WUW)��ppip/_vendor/resolvelib/compat/__init__.pyPK/WUW�.gc�0��dppip/_vendor/resolvelib/compat/collections_abc.pyPK/WUW����0.1��qpip/_vendor/resolvelib/compat/collections_abc.pyiPK/WUWa�������qpip/_vendor/rich/__init__.pyPK/WUWm}��!���ypip/_vendor/rich/__main__.pyPK/WUW�À7
p' ���pip/_vendor/rich/_cell_widths.pyPK/WUW.�,q�# ��|�pip/_vendor/rich/_emoji_codes.pyPK/WUW�y��("���pip/_vendor/rich/_emoji_replace.pyPK/WUWC�I404"���pip/_vendor/rich/_export_format.pyPK/WUWIԷۛ	��lpip/_vendor/rich/_extension.pyPK/WUW�����Cpip/_vendor/rich/_fileno.pyPK/WUW�~t�%��
pip/_vendor/rich/_inspect.pyPK/WUW�������pip/_vendor/rich/_log_render.pyPK/WUW��%����pip/_vendor/rich/_loop.pyPK/WUW��(�k��pip/_vendor/rich/_null_file.pyPK/WUW�W-�����pip/_vendor/rich/_palettes.pyPK/WUW���L�����!pip/_vendor/rich/_pick.pyPK/WUW�d�`���"pip/_vendor/rich/_ratio.pyPK/WUW�1�T_�M���)pip/_vendor/rich/_spinners.pyPK/WUW�Q��_��^8pip/_vendor/rich/_stack.pyPK/WUW`�\����r9pip/_vendor/rich/_timer.pyPK/WUW?XU�$Y"���:pip/_vendor/rich/_win32_console.pyPK/WUWCk�ڽ����Npip/_vendor/rich/_windows.pyPK/WUW��=��
%���Qpip/_vendor/rich/_windows_renderer.pyPK/WUW+,��0���Tpip/_vendor/rich/_wrap.pyPK/WUWkEQ�z���Wpip/_vendor/rich/abc.pyPK/WUW��nè�(��TYpip/_vendor/rich/align.pyPK/WUWZO�����3bpip/_vendor/rich/ansi.pyPK/WUW���'[���jpip/_vendor/rich/bar.pyPK/WUW0�P_
r&���npip/_vendor/rich/box.pyPK/WUW�Vt!����=ypip/_vendor/rich/cells.pyPK/WUW�D���0G��Opip/_vendor/rich/color.pyPK/WUWiD
N�!��Q�pip/_vendor/rich/color_triplet.pyPK/WUW�LR����"�pip/_vendor/rich/columns.pyPK/WUW�YU�����pip/_vendor/rich/console.pyPK/WUW�L�I�����pip/_vendor/rich/constrain.pyPK/WUW�.��y����pip/_vendor/rich/containers.pyPK/WUW;!������pip/_vendor/rich/control.pyPK/WUW�����"���pip/_vendor/rich/default_styles.pyPK/WUW9G������	pip/_vendor/rich/diagnose.pyPK/WUW�
E��	��pip/_vendor/rich/emoji.pyPK/WUW"H!�����;pip/_vendor/rich/errors.pyPK/WUWj�o����`pip/_vendor/rich/file_proxy.pyPK/WUW��B�	��)pip/_vendor/rich/filesize.pyPK/WUWG�"1Ap%���pip/_vendor/rich/highlighter.pyPK/WUW�
P+���##pip/_vendor/rich/json.pyPK/WUW8�Xȋ����(pip/_vendor/rich/jupyter.pyPK/WUW�a���
�6��H-pip/_vendor/rich/layout.pyPK/WUWʠ�ӵ�7��o;pip/_vendor/rich/live.pyPK/WUW���0S��ZJpip/_vendor/rich/live_render.pyPK/WUWo~�.���Npip/_vendor/rich/logging.pyPK/WUW�Cb^�	 ��]pip/_vendor/rich/markup.pyPK/WUW��l���Jgpip/_vendor/rich/measure.pyPK/WUW���j���lpip/_vendor/rich/padding.pyPK/WUW��s<��spip/_vendor/rich/pager.pyPK/WUW8>_�D
���tpip/_vendor/rich/palette.pyPK/WUW&d�6�	N)���ypip/_vendor/rich/panel.pyPK/WUW�H�%���уpip/_vendor/rich/pretty.pyPK/WUW��d~a.:���.�pip/_vendor/rich/progress.pyPK/WUW�ؘ4	� ����pip/_vendor/rich/progress_bar.pyPK/WUWp�Y�
',���pip/_vendor/rich/prompt.pyPK/WUWX���9o��/�pip/_vendor/rich/protocol.pyPK/WUW����pip/_vendor/rich/py.typedPK/WUW]®�u�����pip/_vendor/rich/region.pyPK/WUW���SO����pip/_vendor/rich/repr.pyPK/WUW�imE�����pip/_vendor/rich/rule.pyPK/WUW��+t��M�pip/_vendor/rich/scope.pyPK/WUW?5��R7����pip/_vendor/rich/screen.pyPK/WUWcU1�2�^����pip/_vendor/rich/segment.pyPK/WUW�*��X����pip/_vendor/rich/spinner.pyPK/WUW�(1s�I��~pip/_vendor/rich/status.pyPK/WUW�8<���i���pip/_vendor/rich/style.pyPK/WUW�
�P�����1pip/_vendor/rich/styled.pyPK/WUW�Z�L�e����3pip/_vendor/rich/syntax.pyPK/WUWf%��d����Spip/_vendor/rich/table.pyPK/WUW:#ӿ�*
"��Xspip/_vendor/rich/terminal_theme.pyPK/WUW�J��'ձ���wpip/_vendor/rich/text.pyPK/WUW�d�������pip/_vendor/rich/theme.pyPK/WUWQu�PGf���pip/_vendor/rich/themes.pyPK/WUW����R�s��j�pip/_vendor/rich/traceback.pyPK/WUW>��W
�#����pip/_vendor/rich/tree.pyPK/WUW���p
P ����pip/_vendor/tenacity/__init__.pyPK/WUW�j6��
 ��2�pip/_vendor/tenacity/_asyncio.pyPK/WUWƚ�����W�pip/_vendor/tenacity/_utils.pyPK/WUWp� /H���n�pip/_vendor/tenacity/after.pyPK/WUWEc@&����pip/_vendor/tenacity/before.pyPK/WUWDŅ��D	$��>�pip/_vendor/tenacity/before_sleep.pyPK/WUW�l���g��g�pip/_vendor/tenacity/nap.pyPK/WUW��|�pip/_vendor/tenacity/py.typedPK/WUWR��/�*"����pip/_vendor/tenacity/retry.pyPK/WUWp�����pip/_vendor/tenacity/stop.pyPK/WUWV�*?�^"���pip/_vendor/tenacity/tornadoweb.pyPK/WUWIhլ�	X���pip/_vendor/tenacity/wait.pyPK/WUW��%�����pip/_vendor/tomli/__init__.pyPK/WUW��i�iX��pip/_vendor/tomli/_parser.pyPK/WUWu�1~���'pip/_vendor/tomli/_re.pyPK/WUW��g�����,pip/_vendor/tomli/_types.pyPK/WUW+)����-pip/_vendor/tomli/py.typedPK/WUW��9	�"���-pip/_vendor/truststore/__init__.pyPK/WUW�g�a	�&��#/pip/_vendor/truststore/_api.pyPK/WUW�wM��E ���8pip/_vendor/truststore/_macos.pyPK/WUW7F��	"���Ipip/_vendor/truststore/_openssl.pyPK/WUWi�\��j(��Npip/_vendor/truststore/_ssl_constants.pyPK/WUW}K?�s<D"��Ppip/_vendor/truststore/_windows.pyPK/WUW���_pip/_vendor/truststore/py.typedPK/WUWO� (j
��	`pip/_vendor/urllib3/__init__.pyPK/WUW?r
;*#���epip/_vendor/urllib3/_collections.pyPK/WUW�Ǭ@@���rpip/_vendor/urllib3/_version.pyPK/WUW�Q;FLO!��pspip/_vendor/urllib3/connection.pyPK/WUW�'�;+6�%����pip/_vendor/urllib3/connectionpool.pyPK/WUW^�I��	 !��G�pip/_vendor/urllib3/exceptions.pyPK/WUW�(K, 
�!��q�pip/_vendor/urllib3/fields.pyPK/WUW����~�	����pip/_vendor/urllib3/filepost.pyPK/WUW�DddU(M"����pip/_vendor/urllib3/poolmanager.pyPK/WUWY���#���pip/_vendor/urllib3/request.pyPK/WUWP �:c �w���pip/_vendor/urllib3/response.pyPK/WUW'���pip/_vendor/urllib3/contrib/__init__.pyPK/WUW*����1���pip/_vendor/urllib3/contrib/_appengine_environ.pyPK/WUW
d+(���pip/_vendor/urllib3/contrib/appengine.pyPK/WUWi�7R�'���pip/_vendor/urllib3/contrib/ntlmpool.pyPK/WUWNZ�;��B(��7$pip/_vendor/urllib3/contrib/pyopenssl.pyPK/WUW�,q�%��.��N9pip/_vendor/urllib3/contrib/securetransport.pyPK/WUW�R�?Y�$��Z_pip/_vendor/urllib3/contrib/socks.pyPK/WUW8���gpip/_vendor/urllib3/contrib/_securetransport/__init__.pyPK/WUW.�-M��D8��Mhpip/_vendor/urllib3/contrib/_securetransport/bindings.pyPK/WUW�*��Yb69���ypip/_vendor/urllib3/contrib/_securetransport/low_level.pyPK/WUW(��A�pip/_vendor/urllib3/packages/__init__.pyPK/WUW\��&!i�#����pip/_vendor/urllib3/packages/six.pyPK/WUW2���pip/_vendor/urllib3/packages/backports/__init__.pyPK/WUW޸c�H�2��B�pip/_vendor/urllib3/packages/backports/makefile.pyPK/WUW
�+v��:��گpip/_vendor/urllib3/packages/backports/weakref_finalize.pyPK/WUW抙���$����pip/_vendor/urllib3/util/__init__.pyPK/WUW���%&��׸pip/_vendor/urllib3/util/connection.pyPK/WUW
�\^E!����pip/_vendor/urllib3/util/proxy.pyPK/WUWN����!��R�pip/_vendor/urllib3/util/queue.pyPK/WUW7�m��#����pip/_vendor/urllib3/util/request.pyPK/WUW6(մ`�
$��y�pip/_vendor/urllib3/util/response.pyPK/WUW��c�U!���pip/_vendor/urllib3/util/retry.pyPK/WUW���ǧC ��]�pip/_vendor/urllib3/util/ssl_.pyPK/WUW?q���~.��B�pip/_vendor/urllib3/util/ssl_match_hostname.pyPK/WUW�����(��wpip/_vendor/urllib3/util/ssltransport.pyPK/WUW��3��'#���pip/_vendor/urllib3/util/timeout.pyPK/WUW+��^�7���pip/_vendor/urllib3/util/url.pyPK/WUWV�Vտ ��7/pip/_vendor/urllib3/util/wait.pyPK/WUWx�q2S)$��47pip/_vendor/webencodings/__init__.pyPK/WUWǭ�#"���Bpip/_vendor/webencodings/labels.pyPK/WUWP1D$���Hpip/_vendor/webencodings/mklabels.pyPK/WUWg8p���!��sKpip/_vendor/webencodings/tests.pyPK/WUW��֥�*��kQpip/_vendor/webencodings/x_user_defined.pyPK���WC��'j
( ��XVpip-23.3.1.dist-info/AUTHORS.txtPK���W�V+�E ��mpip-23.3.1.dist-info/LICENSE.txtPK���WW���
���opip-23.3.1.dist-info/METADATAPK���Wo��4\\���tpip-23.3.1.dist-info/WHEELPK���W��n9<}%��[upip-23.3.1.dist-info/entry_points.txtPK���W���"���upip-23.3.1.dist-info/top_level.txtPK���W�_Z�Z;��� vpip-23.3.1.dist-info/RECORDPK��(�PK�![�V+EE,licenses/alt-python313-pip-wheel/LICENSE.txtnu�[���Copyright (c) 2008-present The pip developers (see AUTHORS.txt file)

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
PK�![�V+EE&licenses/alt-python313-pip/LICENSE.txtnu�[���Copyright (c) 2008-present The pip developers (see AUTHORS.txt file)

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
PK�![�o�E""!doc/alt-python313-libs/README.rstnu�[���This is Python version 3.13.5
=============================

.. image:: https://github.com/python/cpython/workflows/Tests/badge.svg
   :alt: CPython build status on GitHub Actions
   :target: https://github.com/python/cpython/actions

.. image:: https://dev.azure.com/python/cpython/_apis/build/status/Azure%20Pipelines%20CI?branchName=main
   :alt: CPython build status on Azure DevOps
   :target: https://dev.azure.com/python/cpython/_build/latest?definitionId=4&branchName=main

.. image:: https://img.shields.io/badge/discourse-join_chat-brightgreen.svg
   :alt: Python Discourse chat
   :target: https://discuss.python.org/


Copyright © 2001-2024 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
usable on all platforms.  Refer to the
`Install dependencies <https://devguide.python.org/getting-started/setup-building.html#build-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/main/Mac/README.rst>`_.

On Windows, see `PCbuild/readme.txt
<https://github.com/python/cpython/blob/main/PCbuild/readme.txt>`_.

To build Windows installer, see `Tools/msi/README.txt
<https://github.com/python/cpython/blob/main/Tools/msi/README.txt>`_.

If you wish, you can create a subdirectory and invoke configure from there.
For example::

    mkdir debug
    cd debug
    ../configure --with-pydebug
    make
    make test

(This will fail if you *also* built at the top-level directory.  You should do
a ``make clean`` at the top-level first.)

To get an optimized build of Python, ``configure --enable-optimizations``
before you run ``make``.  This sets the default make targets up to enable
Profile Guided Optimization (PGO) and may be used to auto-enable Link Time
Optimization (LTO) on some platforms.  For more details, see the sections
below.

Profile Guided Optimization
^^^^^^^^^^^^^^^^^^^^^^^^^^^

PGO takes advantage of recent versions of the GCC or Clang compilers.  If used,
either via ``configure --enable-optimizations`` or by manually running
``make profile-opt`` regardless of configure flags, the optimized build
process will perform the following steps:

The entire Python directory is cleaned of temporary files that may have
resulted from a previous compilation.

An instrumented version of the interpreter is built, using suitable compiler
flags for each flavor. 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's 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.13 <https://docs.python.org/3.13/whatsnew/3.13.html>`_ document.  For a more
detailed change log, read `Misc/NEWS
<https://github.com/python/cpython/tree/main/Misc/NEWS.d>`_, but a full
accounting of changes can only be gleaned from the `commit history
<https://github.com/python/cpython/commits/main>`_.

If you want to install multiple versions of Python, see the section below
entitled "Installing multiple versions".


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

`Documentation for Python 3.13 <https://docs.python.org/3.13/>`_ 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/main/Doc/README.rst>`_.


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 buildbottest``.

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/testing/run-write-tests.html>`_
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/python3.X``.  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.13 with 3.13 being the
primary version, you would execute ``make install`` in your 3.13 build directory
and ``make altinstall`` in the others.


Release Schedule
----------------

See :pep:`719` for Python 3.13 release details.


Copyright and License Information
---------------------------------


Copyright © 2001-2024 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 `LICENSE <https://github.com/python/cpython/blob/main/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�![�o�E""doc/alt-python313/README.rstnu�[���This is Python version 3.13.5
=============================

.. image:: https://github.com/python/cpython/workflows/Tests/badge.svg
   :alt: CPython build status on GitHub Actions
   :target: https://github.com/python/cpython/actions

.. image:: https://dev.azure.com/python/cpython/_apis/build/status/Azure%20Pipelines%20CI?branchName=main
   :alt: CPython build status on Azure DevOps
   :target: https://dev.azure.com/python/cpython/_build/latest?definitionId=4&branchName=main

.. image:: https://img.shields.io/badge/discourse-join_chat-brightgreen.svg
   :alt: Python Discourse chat
   :target: https://discuss.python.org/


Copyright © 2001-2024 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
usable on all platforms.  Refer to the
`Install dependencies <https://devguide.python.org/getting-started/setup-building.html#build-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/main/Mac/README.rst>`_.

On Windows, see `PCbuild/readme.txt
<https://github.com/python/cpython/blob/main/PCbuild/readme.txt>`_.

To build Windows installer, see `Tools/msi/README.txt
<https://github.com/python/cpython/blob/main/Tools/msi/README.txt>`_.

If you wish, you can create a subdirectory and invoke configure from there.
For example::

    mkdir debug
    cd debug
    ../configure --with-pydebug
    make
    make test

(This will fail if you *also* built at the top-level directory.  You should do
a ``make clean`` at the top-level first.)

To get an optimized build of Python, ``configure --enable-optimizations``
before you run ``make``.  This sets the default make targets up to enable
Profile Guided Optimization (PGO) and may be used to auto-enable Link Time
Optimization (LTO) on some platforms.  For more details, see the sections
below.

Profile Guided Optimization
^^^^^^^^^^^^^^^^^^^^^^^^^^^

PGO takes advantage of recent versions of the GCC or Clang compilers.  If used,
either via ``configure --enable-optimizations`` or by manually running
``make profile-opt`` regardless of configure flags, the optimized build
process will perform the following steps:

The entire Python directory is cleaned of temporary files that may have
resulted from a previous compilation.

An instrumented version of the interpreter is built, using suitable compiler
flags for each flavor. 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's 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.13 <https://docs.python.org/3.13/whatsnew/3.13.html>`_ document.  For a more
detailed change log, read `Misc/NEWS
<https://github.com/python/cpython/tree/main/Misc/NEWS.d>`_, but a full
accounting of changes can only be gleaned from the `commit history
<https://github.com/python/cpython/commits/main>`_.

If you want to install multiple versions of Python, see the section below
entitled "Installing multiple versions".


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

`Documentation for Python 3.13 <https://docs.python.org/3.13/>`_ 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/main/Doc/README.rst>`_.


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 buildbottest``.

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/testing/run-write-tests.html>`_
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/python3.X``.  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.13 with 3.13 being the
primary version, you would execute ``make install`` in your 3.13 build directory
and ``make altinstall`` in the others.


Release Schedule
----------------

See :pep:`719` for Python 3.13 release details.


Copyright and License Information
---------------------------------


Copyright © 2001-2024 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 `LICENSE <https://github.com/python/cpython/blob/main/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�![_��$doc/alt-python313-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-python313-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�![SE���$doc/alt-python313-setuptools/LICENSEnu�[���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�![�S��
�
5doc/alt-python313-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�![���$CC-doc/alt-python313-setuptools/docs/artwork.rstnu�[���=======
Artwork
=======

.. figure:: images/logo-over-white.svg
   :align: center

   Setuptools logo, designed in 2021 by `Anderson Bravalheri`_

Elements of Design
==================

The main colours of the design are a dark pastel azure (``#336790``) and a pale
orange (``#E5B62F``), referred in this document simply as "blue" and "yellow"
respectively. The text uses the *Monoid* typeface, an open source webfont that
was developed by Andreas Larsen and contributors in 2015 and is distributed
under the MIT or SIL licenses (more information at
https://github.com/larsenwork/monoid)


Usage
=====

The preferred way of using the setuptools logo is over a white (or light)
background. Alternatively, the following options can be considered, depending
on the circumstances:

- *"negative"* design - for dark backgrounds (e.g. website displayed in "dark
  mode"): the white colour (``#FFFFFF``) of the background and the "blue"
  (``#336790``) colour of the design can be swapped.
- *"monochrome"* - when colours are not available (e.g. black and white printed
  media): a completely black or white version of the logo can also be used.
- *"banner"* mode: the symbol and text can be used alongside depending on the
  available space.

The following image illustrate these alternatives:

.. image:: images/logo-demo.svg
   :align: center

Please refer to the SVG files in the `setuptools repository`_ for the specific
shapes and proportions between the elements of the design.


Working with the Design
=======================

The `setuptools repository`_ contains a series of vector representations of the
design under the ``docs/images`` directory. These representations can be
manipulated via any graphic editor that support SVG files,
however the free and open-source software Inkscape_ is recommended for maximum
compatibility.

When selecting the right file to work with, file names including
``editable-inkscape`` indicate "more editable" elements (e.g. editable text),
while the others prioritise SVG paths for maximum reproducibility.

Also notice that you might have to `install the correct fonts`_ to be able to
visualise or edit some of the designs.


Inspiration
===========

This design was inspired by :user:`cajhne`'s `original proposal`_ and the
ancient symbol of the ouroboros_.
It features a snake moving in a circular trajectory not only as a reference to
the Python programming language but also to the :pep:`wheel package format <427>` as one
of the distribution formats supported by setuptools.
The shape of the snake also resembles a cog, which together with the hammer is
a nod to the two words that compose the name of the project.


License
=======


This logo, design variations or a modified version may be used by anyone to
refer to setuptools, but does not indicate endorsement by the project.

Redistribution, usage and derivative works are permitted under the same license
used by the setuptools software (MIT):

.. code-block:: text

   Copyright (c) Anderson Bravalheri

   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.

   THE USAGE OF THIS LOGO AND ARTWORK DOES NOT INDICATE ENDORSEMENT BY THE
   SETUPTOOLS PROJECT.

Whenever possible, please make the image a link to
https://github.com/pypa/setuptools or https://setuptools.pypa.io.


.. _Anderson Bravalheri: https://github.com/abravalheri
.. _Inkscape: https://inkscape.org
.. _setuptools repository: https://github.com/pypa/setuptools
.. _install the correct fonts: https://wiki.inkscape.org/wiki/Installing_fonts
.. _original proposal: https://github.com/pypa/setuptools/issues/2227#issuecomment-653628344
.. _ouroboros: https://en.wikipedia.org/wiki/Ouroboros
PK�![�u,�0doc/alt-python313-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 allow for arbitrary execution, it
is difficult to provide a reliable user experience across environments
and history.

:pep:`517` came to
the rescue and specified a new standard for packaging and distributing Python
modules. Under PEP 517:

    A ``pyproject.toml`` file is used to specify which program to use
    to generate the distribution.

    Two functions provided by the program, ``build_wheel(directory: str)``
    and ``build_sdist(directory: str)``, create the distribution bundle in the
    specified ``directory``.

    The program may use its own configuration file or extend the ``.toml`` file.

    The actual installation is done with ``pip install *.whl`` or
    ``pip install *.tar.gz``. If ``*.whl`` is available, ``pip`` will go ahead and copy
    its files into the ``site-packages`` directory. If not, ``pip`` will look at
    ``pyproject.toml`` and decide which program to use to 'build from source'.
    (Note that if there is no ``pyproject.toml`` file or the ``build-backend``
    parameter is not defined, then the fall-back behaviour is to use ``setuptools``.)

With this standard, switching between packaging tools is a lot easier.

How to use it?
--------------

Start with a package that you want to distribute. You will need your source
files, a ``pyproject.toml`` file and a ``setup.cfg`` file::

    ~/meowpkg/
        pyproject.toml
        setup.cfg
        meowpkg/
            __init__.py
            module.py

The ``pyproject.toml`` file specifies 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"]
    build-backend = "setuptools.build_meta"

``build_meta`` implements ``setuptools``' build system support.
The ``setuptools`` package implements the ``build_sdist``
command and the ``wheel`` package implements the ``build_wheel``
command; the latter is a dependency of the former
exposed via :pep:`517` hooks.

Use ``setuptools``' :ref:`declarative config <declarative config>` to
specify the package information in ``setup.cfg``::

    [metadata]
    name = meowpkg
    version = 0.0.1
    description = a package that meows

    [options]
    packages = find:

.. _building:

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


.. _backend-wrapper:

Dynamic build dependencies and other ``build_meta`` tweaks
----------------------------------------------------------

With the changes introduced by :pep:`517` and :pep:`518`, the
``setup_requires`` configuration field was deprecated in ``setup.cfg`` and
``setup.py``, in favour of directly listing build dependencies in the
``requires`` field of the ``build-system`` table of ``pyproject.toml``.
This approach has a series of advantages and gives package managers and
installers the ability to inspect the build requirements in advance and
perform a series of optimisations.

However, some package authors might still need to dynamically inspect the final
user's machine before deciding these requirements. One way of doing that, as
specified by :pep:`517`, is to "tweak" ``setuptools.build_meta`` by using an
:pep:`in-tree backend <517#in-tree-build-backends>`.

.. tip:: Before implementing an *in-tree* backend, have a look at
   :pep:`PEP 508 <508#environment-markers>`. Most of the time, dependencies
   with **environment markers** are enough to differentiate operating systems
   and platforms.

If you put the following configuration in your ``pyproject.toml``:

.. code-block:: toml

    [build-system]
    requires = ["setuptools"]
    build-backend = "backend"
    backend-path = ["_custom_build"]


then you can implement a thin wrapper around ``build_meta`` in
the ``_custom_build/backend.py`` file, as shown in the following example:

.. code-block:: python

    from setuptools import build_meta as _orig
    from setuptools.build_meta import *


    def get_requires_for_build_wheel(config_settings=None):
        return _orig.get_requires_for_build_wheel(config_settings) + [...]


    def get_requires_for_build_sdist(config_settings=None):
        return _orig.get_requires_for_build_sdist(config_settings) + [...]


.. note::

   You can override any of the functions specified in :pep:`PEP 517
   <517#build-backend-interface>`, not only the ones responsible for gathering
   requirements. It is important to ``import *`` so that the hooks that you
   choose not to reimplement would be inherited from the setuptools' backend
   automatically. This will also cover hooks that might be added in the future
   like the ones that :pep:`660` declares.


.. important:: Make sure your backend script is included in the :doc:`source
   distribution </userguide/distribution>`, otherwise the build will fail.
   This can be done by using a SCM_/VCS_ plugin (like :pypi:`setuptools-scm`
   and :pypi:`setuptools-svn`), or by correctly setting up :ref:`MANIFEST.in
   <manifest>`.

   The generated ``.tar.gz`` and ``.whl`` files are compressed archives that
   can be inspected as follows:
   On POSIX systems, this can be done with ``tar -tf dist/*.tar.gz``
   and ``unzip -l dist/*.whl``.
   On Windows systems, you can rename the ``.whl`` to ``.zip`` to be able to
   inspect it from File Explorer. You can also use the above ``tar`` command in a
   command prompt to inspect the ``.tar.gz`` file. Alternatively, there are GUI programs
   like `7-zip`_ that handle ``.tar.gz`` and ``.whl`` files.

   In general, the backend script should be present in the ``.tar.gz`` (so the
   project can be built from the source) but not in the ``.whl`` (otherwise the
   backend script would end up being distributed alongside your package).
   See ":doc:`/userguide/package_discovery`" for more details about package
   files.


.. _SCM: https://en.wikipedia.org/wiki/Software_configuration_management
.. _VCS: https://en.wikipedia.org/wiki/Version_control
.. _7-zip: https://www.7-zip.org
PK�![�rE��:doc/alt-python313-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�![������Adoc/alt-python313-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
`GitHub Discussions <https://github.com/pypa/setuptools/discussions>`_,
or the issue tracker (for specific issues).

Discussions about development happen on GitHub Discussions or
the ``setuptools`` channel on `PyPA Discord <https://discord.com/invite/pypa>`_.

-----------------
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:: ../../newsfragments/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: https://www.sphinx-doc.org/en/master/
.. _published documentation: https://setuptools.pypa.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``.

All the dependencies specified in these files are "vendorized" using a
simple Python script ``tools/vendor.py``.

To refresh the dependencies, run the following command::

    $ tox -e vendor
PK�![$dگ�7doc/alt-python313-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�![�0�C9C9@doc/alt-python313-setuptools/docs/userguide/pyproject_config.rstnu�[���.. _pyproject.toml config:

-----------------------------------------------------
Configuring setuptools using ``pyproject.toml`` files
-----------------------------------------------------

.. note:: New in 61.0.0

.. important::
   If compatibility with legacy builds or versions of tools that don't support
   certain packaging standards (e.g. :pep:`517` or :pep:`660`), a simple ``setup.py``
   script can be added to your project [#setupcfg-caveats]_
   (while keeping the configuration in ``pyproject.toml``):

   .. code-block:: python

       from setuptools import setup

       setup()

Starting with :pep:`621`, the Python community selected ``pyproject.toml`` as
a standard way of specifying *project metadata*.
``Setuptools`` has adopted this standard and will use the information contained
in this file as an input in the build process.

The example below illustrates how to write a ``pyproject.toml`` file that can
be used with ``setuptools``. It contains two TOML tables (identified by the
``[table-header]`` syntax): ``build-system`` and ``project``.
The ``build-system`` table is used to tell the build frontend (e.g.
:pypi:`build` or :pypi:`pip`) to use ``setuptools`` and any other plugins (e.g.
``setuptools-scm``) to build the package.
The ``project`` table contains metadata fields as described by the
:doc:`PyPUG:guides/writing-pyproject-toml` guide.

.. _example-pyproject-config:

.. code-block:: toml

   [build-system]
   requires = ["setuptools", "setuptools-scm"]
   build-backend = "setuptools.build_meta"

   [project]
   name = "my_package"
   authors = [
       {name = "Josiah Carberry", email = "josiah_carberry@brown.edu"},
   ]
   description = "My package description"
   readme = "README.rst"
   requires-python = ">=3.7"
   keywords = ["one", "two"]
   license = {text = "BSD-3-Clause"}
   classifiers = [
       "Framework :: Django",
       "Programming Language :: Python :: 3",
   ]
   dependencies = [
       "requests",
       'importlib-metadata; python_version<"3.8"',
   ]
   dynamic = ["version"]

   [project.optional-dependencies]
   pdf = ["ReportLab>=1.2", "RXP"]
   rest = ["docutils>=0.3", "pack ==1.1, ==1.3"]

   [project.scripts]
   my-script = "my_package.module:function"

   # ... other project metadata fields as listed in:
   #     https://packaging.python.org/en/latest/guides/writing-pyproject-toml/

.. _setuptools-table:

Setuptools-specific configuration
=================================

While the standard ``project`` table in the ``pyproject.toml`` file covers most
of the metadata used during the packaging process, there are still some
``setuptools``-specific configurations that can be set by users that require
customization.
These configurations are completely optional and probably can be skipped when
creating simple packages.
They are equivalent to the :doc:`/references/keywords` used by the ``setup.py``
file, and can be set via the ``tool.setuptools`` table:

========================= =========================== =========================
Key                       Value Type (TOML)           Notes
========================= =========================== =========================
``py-modules``            array                       See tip below.
``packages``              array or ``find`` directive See tip below.
``package-dir``           table/inline-table          Used when explicitly/manually listing ``packages``.
------------------------- --------------------------- -------------------------
``package-data``          table/inline-table          See :doc:`/userguide/datafiles`.
``include-package-data``  boolean                     ``True`` by default (only when using ``pyproject.toml`` project metadata/config).
                                                      See :doc:`/userguide/datafiles`.
``exclude-package-data``  table/inline-table          Empty by default. See :doc:`/userguide/datafiles`.
------------------------- --------------------------- -------------------------
``license-files``         array of glob patterns      **Provisional** - likely to change with :pep:`639`
                                                      (by default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``)
``data-files``            table/inline-table          **Discouraged** - check :doc:`/userguide/datafiles`.
                                                      Whenever possible, consider using data files inside the package directories.
``script-files``          array                       **Discouraged** - equivalent to the ``script`` keyword in ``setup.py``.
                                                      Whenever possible, please use ``project.scripts`` instead.
------------------------- --------------------------- -------------------------
``provides``              array                       *ignored by pip when installing packages*
``obsoletes``             array                       *ignored by pip when installing packages*
``platforms``             array                       Sets the ``Platform`` :doc:`core-metadata <PyPUG:specifications/core-metadata>` field
                                                      (*ignored by pip when installing packages*).
------------------------- --------------------------- -------------------------
``zip-safe``              boolean                     **Obsolete** - only relevant for ``pkg_resources``, ``easy_install`` and ``setup.py install``
                                                      in the context of :doc:`eggs </deprecated/python_eggs>` (deprecated).
``eager-resources``       array                       **Obsolete** - only relevant for ``pkg_resources``, ``easy_install`` and ``setup.py install``
                                                      in the context of :doc:`eggs </deprecated/python_eggs>` (deprecated).
``namespace-packages``    array                       **Deprecated** - use implicit namespaces instead (:pep:`420`).
========================= =========================== =========================

.. note::
   The `TOML value types`_ ``array`` and ``table/inline-table`` are roughly
   equivalent to the Python's :obj:`list` and :obj:`dict` data types, respectively.

Please note that some of these configurations are deprecated, obsolete or at least
discouraged, but they are made available to ensure portability.
Deprecated and obsolete configurations may be removed in future versions of ``setuptools``.
New packages should avoid relying on discouraged fields if possible, and
existing packages should consider migrating to alternatives.

.. tip::
   When both ``py-modules`` and ``packages`` are left unspecified,
   ``setuptools`` will attempt to perform :ref:`auto-discovery`, which should
   cover most popular project directory organization techniques, such as the
   :ref:`src-layout` and the :ref:`flat-layout`.

   However if your project does not follow these conventional layouts
   (e.g. you want to use a ``flat-layout`` but at the same time have custom
   directories at the root of your project), you might need to use the ``find``
   directive [#directives]_ as shown below:

   .. code-block:: toml

      [tool.setuptools.packages.find]
      where = ["src"]  # list of folders that contain the packages (["."] by default)
      include = ["my_package*"]  # package names should match these glob patterns (["*"] by default)
      exclude = ["my_package.tests*"]  # exclude packages matching these glob patterns (empty by default)
      namespaces = false  # to disable scanning PEP 420 namespaces (true by default)

   Note that the glob patterns in the example above need to be matched
   by the **entire** package name. This means that if you specify ``exclude = ["tests"]``,
   modules like ``tests.my_package.test1`` will still be included in the distribution
   (to remove them, add a wildcard to the end of the pattern: ``"tests*"``).

   Alternatively, you can explicitly list the packages in modules:

   .. code-block:: toml

      [tool.setuptools]
      packages = ["my_package"]

   If you want to publish a distribution that does not include any Python module
   (e.g. a "meta-distribution" that just aggregate dependencies), please
   consider something like the following:

   .. code-block:: toml

      [tool.setuptools]
      packages = []


.. _dynamic-pyproject-config:

Dynamic Metadata
================

Note that in the first example of this page we use ``dynamic`` to identify
which metadata fields are dynamically computed during the build by either
``setuptools`` itself or the plugins installed via ``build-system.requires``
(e.g. ``setuptools-scm`` is capable of deriving the current project version
directly from the ``git`` :wiki:`version control` system).

Currently the following fields can be listed as dynamic: ``version``,
``classifiers``, ``description``, ``entry-points``, ``scripts``,
``gui-scripts`` and ``readme``.
When these fields are expected to be provided by ``setuptools`` a
corresponding entry is required in the ``tool.setuptools.dynamic`` table
[#entry-points]_. For example:

.. code-block:: toml

   # ...
   [project]
   name = "my_package"
   dynamic = ["version", "readme"]
   # ...
   [tool.setuptools.dynamic]
   version = {attr = "my_package.VERSION"}
   readme = {file = ["README.rst", "USAGE.rst"]}

In the ``dynamic`` table, the ``attr`` directive [#directives]_ will read an
attribute from the given module [#attr]_, while ``file`` will read the contents
of all given files and concatenate them in a single string.

========================== =================== =================================================================================================
Key                        Directive           Notes
========================== =================== =================================================================================================
``version``                ``attr``, ``file``
``readme``                 ``file``            Here you can also set ``"content-type"``:

                                               ``readme = {file = ["README.txt", "USAGE.txt"], content-type = "text/plain"}``

                                               If ``content-type`` is not given, ``"text/x-rst"`` is used by default.
``description``            ``file``            One-line text (no line breaks)
``classifiers``            ``file``            Multi-line text with one classifier per line
``entry-points``           ``file``            INI format following :doc:`PyPUG:specifications/entry-points`
                                               (``console_scripts`` and ``gui_scripts`` can be included)
``dependencies``           ``file``            *subset* of the ``requirements.txt`` format
                                               (``#`` comments and blank lines excluded) **BETA**
``optional-dependencies``  ``file``            *subset* of the ``requirements.txt`` format per group
                                               (``#`` comments and blank lines excluded) **BETA**
========================== =================== =================================================================================================

Supporting ``file`` for dependencies is meant for a convenience for packaging
applications with possibly strictly versioned dependencies.

Library packagers are discouraged from using overly strict (or "locked")
dependency versions in their ``dependencies`` and ``optional-dependencies``.

Currently, when specifying ``optional-dependencies`` dynamically, all of the groups
must be specified dynamically; one can not specify some of them statically and
some of them dynamically.

Also note that the file format for specifying dependencies resembles a ``requirements.txt`` file,
however please keep in mind that all non-comment lines must conform with :pep:`508`
(``pip``-specify syntaxes, e.g. ``-c/-r/-e`` flags, are not supported).


.. note::
   If you are using an old version of ``setuptools``, you might need to ensure
   that all files referenced by the ``file`` directive are included in the ``sdist``
   (you can do that via ``MANIFEST.in`` or using plugins such as ``setuptools-scm``,
   please have a look on :doc:`/userguide/miscellaneous` for more information).

   .. versionchanged:: 66.1.0
      Newer versions of ``setuptools`` will automatically add these files to the ``sdist``.

It is advisable to use literal values together with ``attr`` (e.g. ``str``,
``tuple[str]``, see :func:`ast.literal_eval`). This is recommend
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,
using :func:`importlib.util.spec_from_file_location` recommended recipe
(see :ref:`example on Python docs <python:importlib-examples>`
about "Importing a source file directly").
Note however that importing the module is error prone since your package is
not installed yet. You may also need to manually add the project directory to
``sys.path`` (via ``setup.py``) in order to be able to do that.

----

.. rubric:: Notes

.. [#setupcfg-caveats] ``pip`` may allow editable install only with ``pyproject.toml``
   and ``setup.cfg``. However, this behavior may not be consistent over various ``pip``
   versions and other packaging-related tools
   (``setup.py`` is more reliable on those scenarios).

.. [#entry-points] Dynamic ``scripts`` and ``gui-scripts`` are a special case.
   When resolving these metadata keys, ``setuptools`` will look for
   ``tool.setuptools.dynamic.entry-points``, and use the values of the
   ``console_scripts`` and ``gui_scripts`` :doc:`entry-point groups
   <PyPUG:specifications/entry-points>`.

.. [#directives] In the context of this document, *directives* are special TOML
   values that are interpreted differently by ``setuptools`` (usually triggering an
   associated function). Most of the times they correspond to a special TOML table
   (or inline-table) with a single top-level key.
   For example, you can have the ``{find = {where = ["src"], exclude=["tests*"]}}``
   directive for ``tool.setuptools.packages``, or ``{attr = "mymodule.attr"}``
   directive for ``tool.setuptools.dynamic.version``.

.. [#attr] ``attr`` is meant to be used when the module attribute is statically
   specified (e.g. as a string, list or tuple). As a rule of thumb, the
   attribute should be able to be parsed with :func:`ast.literal_eval`, and
   should not be modified or re-assigned.

.. _TOML value types: https://toml.io/en/v1.0.0
PK�![L���P5P5Bdoc/alt-python313-setuptools/docs/userguide/declarative_config.rstnu�[���.. _declarative config:

------------------------------------------------
Configuring setuptools 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: my_package.VERSION
    author = Josiah Carberry
    author_email = josiah_carberry@brown.edu
    description = My package description
    long_description = file: README.rst, CHANGELOG.rst, LICENSE.rst
    keywords = one, two
    license = BSD-3-Clause
    classifiers =
        Framework :: Django
        Programming Language :: Python :: 3

    [options]
    zip_safe = False
    include_package_data = True
    packages = find:
    python_requires = >=3.7
    install_requires =
        requests
        importlib-metadata; python_version<"3.8"

    [options.package_data]
    * = *.txt, *.rst
    hello = *.msg

    [options.entry_points]
    console_scripts =
        executable-name = my_package.module:function

    [options.extras_require]
    pdf = ReportLab>=1.2; RXP
    rest = docutils>=0.3; pack ==1.1, ==1.3

    [options.packages.find]
    exclude =
        examples*
        tools*
        docs*
        my_package.tests*

Metadata and options are set in the config sections of the same name.

* Keys are the same as the :doc:`keyword arguments </references/keywords>` 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 configuration has all the Python 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, using :ref:`package_dir <keyword/package_dir>`, 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

In this example, the value for the :ref:`package_dir <keyword/package_dir>`
configuration (i.e. ``=src``) is parsed as ``{"": "src"}``.
The ``""`` key has a special meaning in this context, and indicates that all the
packages are contained inside the given directory.
Also note that the value for ``[options.packages.find] where`` matches the
value associated with ``""`` in the ``package_dir`` dictionary.

..
   TODO: Add the following tip once the auto-discovery is no longer experimental:

   Starting in version 61, ``setuptools`` can automatically infer the
   configurations for both ``packages`` and ``package_dir`` for projects using
   a ``src/`` layout (as long as no value is specified for ``py_modules``).
   Please see :doc:`package discovery </userguide/package_discovery>` for more
   details.

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 each entry corresponds to a key/value pair,
  with keys separated from values by ``=``.
  If an entry starts with ``=``, the key is assumed to be an empty string
  (e.g. ``=src`` is parsed as ``{"": "src"}``).
* ``section`` - values are read from a dedicated (sub)section


Special directives:

* ``attr:`` - Value is read from a module attribute.

  It is advisable to use literal values together with ``attr:`` (e.g. ``str``,
  ``tuple[str]``, see :func:`ast.literal_eval`). This is recommend
  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,
  using :func:`importlib.util.spec_from_file_location` recommended recipe
  (see :ref:`example on Python docs <python:importlib-examples>`
  about "Importing a source file directly").
  Note however that importing the module is error prone since your package is
  not installed yet. You may also need to manually add the project directory to
  ``sys.path`` (via ``setup.py``) in order to be able to do that.

  When the module is imported, ``attr:`` supports
  callables and iterables; unsupported types are cast using ``str()``.


* ``file:`` - Value is read from a list of files and then concatenated

  .. important::
      The ``file:`` directive is sandboxed and won't reach anything outside the
      project directory (i.e. the directory containing ``setup.cfg``/``pyproject.toml``).

  .. note::
      If you are using an old version of ``setuptools``, you might need to ensure
      that all files referenced by the ``file:`` directive are included in the ``sdist``
      (you can do that via ``MANIFEST.in`` or using plugins such as ``setuptools-scm``,
      please have a look on :doc:`/userguide/miscellaneous` for more information).

      .. versionchanged:: 66.1.0
         Newer versions of ``setuptools`` will automatically add these files to the ``sdist``.


Metadata
--------

.. attention::
    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         file:, list-semi                                     **BETA** [#opt-2]_, [#opt-6]_
extras_require           file:, section                                       **BETA** [#opt-2]_, [#opt-6]_
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                                           [#opt-5]_
py_modules               list-comma                           34.4.0
data_files               section                              40.6.0          [#opt-4]_
=======================  ===================================  =============== ====================

**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 ``install_requires`` and ``extras_require``, values are parsed as ``list-semi``.
   This implies that in order to include markers, each requirement **must** be *dangling*
   in a new line:

   .. code-block:: ini

      [options]
      install_requires =
          importlib-metadata; python_version<"3.8"

      [options.extras_require]
      all =
          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.

.. [#opt-4] ``data_files`` is deprecated and should be avoided.
   Please check :doc:`/userguide/datafiles` for more information.

.. [#opt-5] ``namespace_packages`` is deprecated in favour of native/implicit
   namespaces (:pep:`420`). Check :doc:`the Python Packaging User Guide
   <PyPUG:guides/packaging-namespace-packages>` for more information.

.. [#opt-6] ``file:`` directives for reading requirements are supported since version 62.6.
   The format for the file resembles a ``requirements.txt`` file,
   however please keep in mind that all non-comment lines must conform with :pep:`508`
   (``pip``-specify syntaxes, e.g. ``-c/-r/-e`` flags, are not supported).
   Library developers should avoid tightly pinning their dependencies to a specific
   version (e.g. via a "locked" requirements file).


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�![��A�/�/@doc/alt-python313-setuptools/docs/userguide/development_mode.rstnu�[���Development Mode (a.k.a. "Editable Installs")
=============================================

When creating a Python project, developers usually want to implement and test
changes iteratively, before cutting a release and preparing a distribution archive.

In normal circumstances this can be quite cumbersome and require the developers
to manipulate the ``PYTHONPATH`` environment variable or to continuously re-build
and re-install the project.

To facilitate iterative exploration and experimentation, setuptools allows
users to instruct the Python interpreter and its import machinery to load the
code under development directly from the project folder without having to
copy the files to a different location in the disk.
This means that changes in the Python source code can immediately take place
without requiring a new installation.

You can enter this "development mode" by performing an :doc:`editable installation
<pip:topics/local-project-installs>` inside of a :term:`virtual environment`,
using :doc:`pip's <pip:cli/pip_install>` ``-e/--editable`` flag, as shown below:

.. code-block:: bash

   $ cd your-python-project
   $ python -m venv .venv
   # Activate your environment with:
   #      `source .venv/bin/activate` on Unix/macOS
   # or   `.venv\Scripts\activate` on Windows

   $ pip install --editable .

   # Now you have access to your package
   # as if it was installed in .venv
   $ python -c "import your_python_project"


An "editable installation" works very similarly to a regular install with
``pip install .``, except that it only installs your package dependencies,
metadata and wrappers for :ref:`console and GUI scripts <console-scripts>`.
Under the hood, setuptools will try to create a special :mod:`.pth file <site>`
in the target directory (usually ``site-packages``) that extends the
``PYTHONPATH`` or install a custom :doc:`import hook <python:reference/import>`.

When you're done with a given development task, you can simply uninstall your
package (as you would normally do with ``pip uninstall <package name>``).

Please note that, by default an editable install will expose at least all the
files that would be available in a regular installation. However, depending on
the file and directory organization in your project, it might also expose
as a side effect files that would not be normally available.
This is allowed so you can iteratively create new Python modules.
Please have a look on the following section if you are looking for a different behaviour.

.. admonition:: Virtual Environments

   You can think about virtual environments as "isolated Python runtime deployments"
   that allow users to install different sets of libraries and tools without
   messing with the global behaviour of the system.

   They are a safe way of testing new projects and can be created easily
   with the :mod:`venv` module from the standard library.

   Please note however that depending on your operating system or distribution,
   ``venv`` might not come installed by default with Python. For those cases,
   you might need to use the OS package manager to install it.
   For example, in Debian/Ubuntu-based systems you can obtain it via:

   .. code-block:: bash

       sudo apt install python3-venv

   Alternatively, you can also try installing :pypi:`virtualenv`.
   More information is available on the Python Packaging User Guide on
   :doc:`PyPUG:guides/installing-using-pip-and-virtual-environments`.

.. note::
    .. versionchanged:: v64.0.0
       Editable installation hooks implemented according to :pep:`660`.
       Support for :pep:`namespace packages <420>` is still **EXPERIMENTAL**.


"Strict" editable installs
--------------------------

When thinking about editable installations, users might have the following
expectations:

1. It should allow developers to add new files (or split/rename existing ones)
   and have them automatically exposed.
2. It should behave as close as possible to a regular installation and help
   users to detect problems (e.g. new files not being included in the distribution).

Unfortunately these expectations are in conflict with each other.
To solve this problem ``setuptools`` allows developers to choose a more
*"strict"* mode for the editable installation. This can be done by passing
a special *configuration setting* via :pypi:`pip`, as indicated below:

.. code-block:: bash

    pip install -e . --config-settings editable_mode=strict

In this mode, new files **won't** be exposed and the editable installs will
try to mimic as much as possible the behavior of a regular install.
Under the hood, ``setuptools`` will create a tree of file links in an auxiliary
directory (``$your_project_dir/build``) and add it to ``PYTHONPATH`` via a
:mod:`.pth file <site>`. (Please be careful to not delete this repository
by mistake otherwise your files may stop being accessible).

.. warning::
   Strict editable installs require auxiliary files to be placed in a
   ``build/__editable__.*`` directory (relative to your project root).

   Please be careful to not remove this directory while testing your project,
   otherwise your editable installation may be compromised.

   You can remove the ``build/__editable__.*`` directory after uninstalling.


.. note::
    .. versionadded:: v64.0.0
       Added new *strict* mode for editable installations.
       The exact details of how this mode is implemented may vary.


Limitations
-----------

- The *editable* term is used to refer only to Python modules
  inside the package directories. Non-Python files, external (data) files,
  executable script files, binary extensions, headers and metadata may be
  exposed as a *snapshot* of the version they were at the moment of the
  installation.
- Adding new dependencies, entry-points or changing your project's metadata
  require a fresh "editable" re-installation.
- Console scripts and GUI scripts **MUST** be specified via :doc:`entry-points
  </userguide/entry_point>` to work properly.
- *Strict* editable installs require the file system to support
  either :wiki:`symbolic <symbolic link>` or :wiki:`hard links <hard link>`.
  This installation mode might also generate auxiliary files under the project directory.
- There is *no guarantee* that the editable installation will be performed
  using a specific technique. Depending on each project, ``setuptools`` may
  select a different approach to ensure the package is importable at runtime.
- There is *no guarantee* that files outside the top-level package directory
  will be accessible after an editable install.
- There is *no guarantee* that attributes like ``__path__`` or ``__file__``
  will correspond to the exact location of the original files (e.g.,
  ``setuptools`` might employ file links to perform the editable installation).
  Users are encouraged to use tools like :mod:`importlib.resources` or
  :mod:`importlib.metadata` when trying to access package files directly.
- Editable installations may not work with
  :doc:`namespaces created with pkgutil or pkg_resources
  <PyPUG:guides/packaging-namespace-packages>`.
  Please use :pep:`420`-style implicit namespaces [#namespaces]_.
- Support for :pep:`420`-style implicit namespace packages for
  projects structured using :ref:`flat-layout` is still **experimental**.
  If you experience problems, you can try converting your package structure
  to the :ref:`src-layout`.
- File system entries in the current working directory
  whose names coincidentally match installed packages
  may take precedence in :doc:`Python's import system <python:reference/import>`.
  Users are encouraged to avoid such scenarios [#cwd]_.
- Setuptools will try to give the right precedence to modules in an editable install.
  However this is not always an easy task. If you have a particular order in
  ``sys.path`` or some specific import precedence that needs to be respected,
  the editable installation as supported by Setuptools might not be able to
  fulfil this requirement, and therefore it might not be the right tool for your use case.

.. attention::
   Editable installs are **not a perfect replacement for regular installs**
   in a test environment. When in doubt, please test your projects as
   installed via a regular wheel. There are tools in the Python ecosystem,
   like :pypi:`tox` or :pypi:`nox`, that can help you with that
   (when used with appropriate configuration).


Legacy Behavior
---------------

If your project is not compatible with the new "editable installs" or you wish
to replicate the legacy behavior, for the time being you can also perform the
installation in the ``compat`` mode:

.. code-block:: bash

    pip install -e . --config-settings editable_mode=compat

This installation mode will try to emulate how ``python setup.py develop``
works (still within the context of :pep:`660`).

.. warning::
   The ``compat`` mode is *transitional* and will be removed in
   future versions of ``setuptools``, it exists only to help during the
   migration period.
   Also note that support for this mode is limited:
   it is safe to assume that the ``compat`` mode is offered "as is", and
   improvements are unlikely to be implemented.
   Users are encouraged to try out the new editable installation techniques
   and make the necessary adaptations.

.. note::
   Newer versions of ``pip`` no longer run the fallback command
   ``python setup.py develop`` when the ``pyproject.toml`` file is present.
   This means that setting the environment variable
   ``SETUPTOOLS_ENABLE_FEATURES="legacy-editable"``
   will have no effect when installing a package with ``pip``.


How editable installations work
-------------------------------

*Advanced topic*

There are many techniques that can be used to expose packages under development
in such a way that they are available as if they were installed.
Depending on the project file structure and the selected mode, ``setuptools``
will choose one of these approaches for the editable installation [#criteria]_.

A non-exhaustive list of implementation mechanisms is presented below.
More information is available on the text of :pep:`PEP 660 <660#what-to-put-in-the-wheel>`.

- A static ``.pth`` file [#static_pth]_ can be added to one of the directories
  listed in :func:`site.getsitepackages` or :func:`site.getusersitepackages` to
  extend :obj:`sys.path`.
- A directory containing a *farm of file links* that mimic the
  project structure and point to the original files can be employed.
  This directory can then be added to :obj:`sys.path` using a static ``.pth`` file.
- A dynamic ``.pth`` file [#dynamic_pth]_ can also be used to install an
  "import :term:`finder`" (:obj:`~importlib.abc.MetaPathFinder` or
  :obj:`~importlib.abc.PathEntryFinder`) that will hook into Python's
  :doc:`import system <python:reference/import>` machinery.

.. attention::
   ``Setuptools`` offers **no guarantee** of which technique will be used to
   perform an editable installation. This will vary from project to project
   and may change depending on the specific version of ``setuptools`` being
   used.


----

.. rubric:: Notes

.. [#namespaces]
   You *may* be able to use *strict* editable installations with namespace
   packages created with ``pkgutil`` or ``pkg_namespaces``, however this is not
   officially supported.

.. [#cwd]
   Techniques like the :ref:`src-layout` or tooling-specific options like
   `tox's changedir <https://tox.wiki/en/stable/config.html#conf-changedir>`_
   can be used to prevent such kinds of situations (checkout `this blog post
   <https://blog.ganssle.io/articles/2019/08/test-as-installed.html>`_ for more
   insights).

.. [#criteria]
   ``setuptools`` strives to find a balance between allowing the user to see
   the effects of project files being edited while still trying to keep the
   editable installation as similar as possible to a regular installation.

.. [#static_pth]
   i.e., a ``.pth`` file where each line correspond to a path that should be
   added to :obj:`sys.path`. See :mod:`Site-specific configuration hook <site>`.

.. [#dynamic_pth]
   i.e., a ``.pth`` file that starts where each line starts with an ``import``
   statement and executes arbitrary Python code. See :mod:`Site-specific
   configuration hook <site>`.
PK�![@SRϻG�G;doc/alt-python313-setuptools/docs/userguide/entry_point.rstnu�[���.. _`entry_points`:

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

Entry points are a type of metadata that can be exposed by packages on installation.
They are a very useful feature of the Python ecosystem,
and come specially handy in two scenarios:

1. The package would like to provide commands to be run at the terminal.
This functionality is known as *console* scripts. The command may also
open up a GUI, in which case it is known as a *GUI* script. An example
of a console script is the one provided by the :pypi:`pip` package, which
allows you to run commands like ``pip install`` in the terminal.

2. A package would like to enable customization of its functionalities
via *plugins*. For example, the test framework :pypi:`pytest` allows
customization via the ``pytest11`` entry point, and the syntax
highlighting tool :pypi:`pygments` allows specifying additional styles
using the entry point ``pygments.styles``.


.. _console-scripts:

Console Scripts
===============

Let us start with console scripts.
First consider an example without entry points. Imagine a package
defined thus::

    project_root_directory
    ├── pyproject.toml        # and/or setup.cfg, setup.py
    └── src
        └── timmins
            ├── __init__.py
            └── ...

with ``__init__.py`` as:

.. code-block:: python

    def hello_world():
        print("Hello world")

Now, suppose that we would like to provide some way of executing the
function ``hello_world()`` from the command-line. One way to do this
is to create a file ``src/timmins/__main__.py`` providing a hook as
follows:

.. code-block:: python

    from . import hello_world

    if __name__ == '__main__':
        hello_world()

Then, after installing the package ``timmins``, we may invoke the ``hello_world()``
function as follows, through the `runpy <https://docs.python.org/3/library/runpy.html>`_
module:

.. code-block:: bash

    $ python -m timmins
    Hello world

Instead of this approach using ``__main__.py``, you can also create a
user-friendly CLI executable that can be called directly without ``python -m``.
In the above example, to create a command ``hello-world`` that invokes
``timmins.hello_world``, add a console script entry point to your
configuration:

.. tab:: pyproject.toml

   .. code-block:: toml

        [project.scripts]
        hello-world = "timmins:hello_world"

.. tab:: setup.cfg

    .. code-block:: ini

        [options.entry_points]
        console_scripts =
            hello-world = timmins:hello_world

.. tab:: setup.py

    .. code-block:: python

        from setuptools import setup

        setup(
            # ...,
            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:

.. code-block:: bash

   $ hello-world
   Hello world

Note that any function used as a console script, i.e. ``hello_world()`` in
this example, should not accept any arguments. If your function requires any input
from the user, you can use regular command-line argument parsing utilities like
:mod:`argparse` within the body of
the function to parse user input given via :obj:`sys.argv`.

You may have noticed that we have used a special syntax to specify the function
that must be invoked by the console script, i.e. we have written ``timmins:hello_world``
with a colon ``:`` separating the package name and the function name. The full
specification of this syntax is discussed in the `last section <#entry-points-syntax>`_
of this document, and this can be used to specify a function located anywhere in
your package, not just in ``__init__.py``.

GUI Scripts
===========

In addition to ``console_scripts``, Setuptools supports ``gui_scripts``, which
will launch a GUI application without running in a terminal window.

For example, if we have a project with the same directory structure as before,
with an ``__init__.py`` file containing the following:

.. code-block:: python

    import PySimpleGUI as sg

    def hello_world():
        sg.Window(title="Hello world", layout=[[]], margins=(100, 50)).read()

Then, we can add a GUI script entry point:

.. tab:: pyproject.toml

   .. code-block:: toml

        [project.gui-scripts]
        hello-world = "timmins:hello_world"

.. tab:: setup.cfg

    .. code-block:: ini

        [options.entry_points]
        gui_scripts =
            hello-world = timmins:hello_world

.. tab:: setup.py

    .. code-block:: python

        from setuptools import setup

        setup(
            # ...,
            entry_points={
                'gui_scripts': [
                    'hello-world = timmins:hello_world',
                ]
            }
        )

.. note::
   To be able to import ``PySimpleGUI``, you need to add ``pysimplegui`` to your package dependencies.
   See :doc:`/userguide/dependency_management` for more information.

Now, running:

.. code-block:: bash

   $ hello-world

will open a small application window with the title 'Hello world'.

Note that just as with console scripts, any function used as a GUI script
should not accept any arguments, and any user input can be parsed within the
body of the function. GUI scripts also use the same syntax (discussed in the
`last section <#entry-points-syntax>`_) for specifying the function to be invoked.

.. note::

    The difference between ``console_scripts`` and ``gui_scripts`` only affects
    Windows systems. [#use_for_scripts]_ ``console_scripts`` are wrapped in a console
    executable, so they are attached to a console and can use ``sys.stdin``,
    ``sys.stdout`` and ``sys.stderr`` for input and output. ``gui_scripts`` are
    wrapped in a GUI executable, so they can be started without a console, but
    cannot use standard streams unless application code redirects them. Other
    platforms do not have the same distinction.

.. note::

    Console and GUI scripts work because behind the scenes, installers like :pypi:`pip`
    create wrapper scripts around the function(s) being invoked. For example,
    the ``hello-world`` entry point in the above two examples would create a
    command ``hello-world`` launching a script like this: [#use_for_scripts]_

    .. code-block:: python

        import sys
        from timmins import hello_world
        sys.exit(hello_world())

.. _dynamic discovery of services and plugins:

Advertising Behavior
====================

Console/GUI 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/GUI scripts work similarly, where libraries advertise their commands
and tools like ``pip`` create wrapper scripts that invoke those commands.

Entry Points for Plugins
========================

Let us consider a simple example to understand how we can implement entry points
corresponding to plugins. Say we have a package ``timmins`` with the following
directory structure::

    timmins
    ├── pyproject.toml        # and/or setup.cfg, setup.py
    └── src
        └── timmins
            └── __init__.py

and in ``src/timmins/__init__.py`` we have the following code:

.. code-block:: python

   def hello_world():
       print('Hello world')

Basically, we have defined a ``hello_world()`` function which will print the text
'Hello world'. Now, let us say we want to print the text 'Hello world' in different
ways. The current function just prints the text as it is - let us say we want another
style in which the text is enclosed within exclamation marks::

    !!! Hello world !!!

Let us see how this can be done using plugins. First, let us separate the style of
printing the text from the text itself. In other words, we can change the code in
``src/timmins/__init__.py`` to something like this:

.. code-block:: python

   def display(text):
       print(text)

   def hello_world():
       display('Hello world')

Here, the ``display()`` function controls the style of printing the text, and the
``hello_world()`` function calls the ``display()`` function to print the text 'Hello
world`.

Right now the ``display()`` function just prints the text as it is. In order to be able
to customize it, we can do the following. Let us introduce a new *group* of entry points
named ``timmins.display``, and expect plugin packages implementing this entry point
to supply a ``display()``-like function. Next, to be able to automatically discover plugin
packages that implement this entry point, we can use the
:mod:`importlib.metadata` module,
as follows:

.. code-block:: python

   from importlib.metadata import entry_points
   display_eps = entry_points(group='timmins.display')

.. note::
   Each ``importlib.metadata.EntryPoint`` object is an object containing a ``name``, a
   ``group``, and a ``value``. For example, after setting up the plugin package as
   described below, ``display_eps`` in the above code will look like this: [#package_metadata]_

   .. code-block:: python

       (
           EntryPoint(name='excl', value='timmins_plugin_fancy:excl_display', group='timmins.display'),
           ...,
       )

``display_eps`` will now be a list of ``EntryPoint`` objects, each referring to ``display()``-like
functions defined by one or more installed plugin packages. Then, to import a specific
``display()``-like function - let us choose the one corresponding to the first discovered
entry point - we can use the ``load()`` method as follows:

.. code-block:: python

   display = display_eps[0].load()

Finally, a sensible behaviour would be that if we cannot find any plugin packages customizing
the ``display()`` function, we should fall back to our default implementation which prints
the text as it is. With this behaviour included, the code in ``src/timmins/__init__.py``
finally becomes:

.. code-block:: python

   from importlib.metadata import entry_points
   display_eps = entry_points(group='timmins.display')
   try:
       display = display_eps[0].load()
   except IndexError:
       def display(text):
           print(text)

   def hello_world():
       display('Hello world')

That finishes the setup on ``timmins``'s side. Next, we need to implement a plugin
which implements the entry point ``timmins.display``. Let us name this plugin
``timmins-plugin-fancy``, and set it up with the following directory structure::

    timmins-plugin-fancy
    ├── pyproject.toml        # and/or setup.cfg, setup.py
    └── src
        └── timmins_plugin_fancy
            └── __init__.py

And then, inside ``src/timmins_plugin_fancy/__init__.py``, we can put a function
named ``excl_display()`` that prints the given text surrounded by exclamation marks:

.. code-block:: python

   def excl_display(text):
       print('!!!', text, '!!!')

This is the ``display()``-like function that we are looking to supply to the
``timmins`` package. We can do that by adding the following in the configuration
of ``timmins-plugin-fancy``:

.. tab:: pyproject.toml

   .. code-block:: toml

        # Note the quotes around timmins.display in order to escape the dot .
        [project.entry-points."timmins.display"]
        excl = "timmins_plugin_fancy:excl_display"

.. tab:: setup.cfg

   .. code-block:: ini

        [options.entry_points]
        timmins.display =
            excl = timmins_plugin_fancy:excl_display

.. tab:: setup.py

   .. code-block:: python

        from setuptools import setup

        setup(
            # ...,
            entry_points = {
                'timmins.display': [
                    'excl = timmins_plugin_fancy:excl_display'
                ]
            }
        )

Basically, this configuration states that we are a supplying an entry point
under the group ``timmins.display``. The entry point is named ``excl`` and it
refers to the function ``excl_display`` defined by the package ``timmins-plugin-fancy``.

Now, if we install both ``timmins`` and ``timmins-plugin-fancy``, we should get
the following:

.. code-block:: pycon

   >>> from timmins import hello_world
   >>> hello_world()
   !!! Hello world !!!

whereas if we only install ``timmins`` and not ``timmins-plugin-fancy``, we should
get the following:

.. code-block:: pycon

   >>> from timmins import hello_world
   >>> hello_world()
   Hello world

Therefore, our plugin works.

Our plugin could have also defined multiple entry points under the group ``timmins.display``.
For example, in ``src/timmins_plugin_fancy/__init__.py`` we could have two ``display()``-like
functions, as follows:

.. code-block:: python

   def excl_display(text):
       print('!!!', text, '!!!')

   def lined_display(text):
       print(''.join(['-' for _ in text]))
       print(text)
       print(''.join(['-' for _ in text]))

The configuration of ``timmins-plugin-fancy`` would then change to:

.. tab:: pyproject.toml

   .. code-block:: toml

        [project.entry-points."timmins.display"]
        excl = "timmins_plugin_fancy:excl_display"
        lined = "timmins_plugin_fancy:lined_display"

.. tab:: setup.cfg

   .. code-block:: ini

        [options.entry_points]
        timmins.display =
            excl = timmins_plugin_fancy:excl_display
            lined = timmins_plugin_fancy:lined_display

.. tab:: setup.py

   .. code-block:: python

        from setuptools import setup

        setup(
            # ...,
            entry_points = {
                'timmins.display': [
                    'excl = timmins_plugin_fancy:excl_display',
                    'lined = timmins_plugin_fancy:lined_display',
                ]
            }
        )

On the ``timmins`` side, we can also use a different strategy of loading entry
points. For example, we can search for a specific display style:

.. code-block:: python

   display_eps = entry_points(group='timmins.display')
   try:
       display = display_eps['lined'].load()
   except KeyError:
       # if the 'lined' display is not available, use something else
       ...

Or we can also load all plugins under the given group. Though this might not
be of much use in our current example, there are several scenarios in which this
is useful:

.. code-block:: python

   display_eps = entry_points(group='timmins.display')
   for ep in display_eps:
       display = ep.load()
       # do something with display
       ...

Another point is that in this particular example, we have used plugins to
customize the behaviour of a function (``display()``). In general, we can use entry
points to enable plugins to not only customize the behaviour of functions, but also
of entire classes and modules. This is unlike the case of console/GUI scripts,
where entry points can only refer to functions. The syntax used for specifying the
entry points remains the same as for console/GUI scripts, and is discussed in the
`last section <#entry-points-syntax>`_.

.. tip::
    The recommended approach for loading and importing entry points is the
    :mod:`importlib.metadata` module,
    which is a part of the standard library since Python 3.8. For older versions of
    Python, its backport :pypi:`importlib_metadata` should be used. While using the
    backport, the only change that has to be made is to replace ``importlib.metadata``
    with ``importlib_metadata``, i.e.

    .. code-block:: python

       from importlib_metadata import entry_points
       ...

In summary, entry points allow a package to open its functionalities for
customization via plugins.
The package soliciting the entry points need not have any dependency
or prior knowledge about the plugins implementing the entry points, and
downstream users are able to compose functionality by pulling together
plugins implementing the entry points.

Entry Points Syntax
===================

The syntax for entry points is specified as follows::

    <name> = <package_or_module>[:<object>[.<attr>[.<nested-attr>]*]]

Here, the square brackets ``[]`` denote optionality and the asterisk ``*``
denotes repetition.
``name`` is the name of the script/entry point you want to create, the left hand
side of ``:`` is the package or module that contains the object you want to invoke
(think about it as something you would write in an import statement), and the right
hand side is the object you want to invoke (e.g. a function).

To make this syntax more clear, consider the following examples:

Package or module
    If you supply::

       <name> = <package_or_module>

    as the entry point, where ``<package_or_module>`` can contain ``.`` in the case
    of sub-modules or sub-packages, then, tools in the Python ecosystem will roughly
    interpret this value as:

    .. code-block:: python

        import <package_or_module>
        parsed_value = <package_or_module>

Module-level object
   If you supply::

        <name> = <package_or_module>:<object>

   where ``<object>`` does not contain any ``.``, this will be roughly interpreted
   as:

   .. code-block:: python

       from <package_or_module> import <object>
       parsed_value = <object>

Nested object
   If you supply::

        <name> = <package_or_module>:<object>.<attr>.<nested_attr>

   this will be roughly interpreted as:

   .. code-block:: python

       from <package_or_module> import <object>
       parsed_value = <object>.<attr>.<nested_attr>

In the case of console/GUI scripts, this syntax can be used to specify a function, while
in the general case of entry points as used for plugins, it can be used to specify a function,
class or module.

----

.. [#use_for_scripts]
   Reference: https://packaging.python.org/en/latest/specifications/entry-points/#use-for-scripts

.. [#package_metadata]
   Reference: https://packaging.python.org/en/latest/guides/creating-and-discovering-plugins/#using-package-metadata
PK�![��s"�3�39doc/alt-python313-setuptools/docs/userguide/extension.rstnu�[���.. _Creating ``distutils`` Extensions:

Extending or Customizing Setuptools
===================================

Setuptools design is based on the distutils_ package originally distributed
as part of Python's standard library, effectively serving as its successor
(as established in :pep:`632`).

This means that ``setuptools`` strives to honor the extension mechanisms
provided by ``distutils``, and allows developers to create third party packages
that modify or augment the build process behavior.

A simple way of doing that is to hook in new or existing
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` for some more background on entry points).

The following sections describe the most common procedures for extending
the ``distutils`` functionality used by ``setuptools``.

.. important::
   Any entry-point defined in your ``setup.cfg``, ``setup.py`` or
   ``pyproject.toml`` files are not immediately available for use.  Your
   package needs to be installed first, then ``setuptools`` will be able to
   access these entry points.  For example consider a ``Project-A`` that
   defines entry points. When building ``Project-A``, these will not be
   available.  If ``Project-B`` declares a :doc:`build system requirement
   </userguide/dependency_management>` on ``Project-A``, then ``setuptools``
   will be able to use ``Project-A``' customizations.

Customizing Commands
--------------------

Both ``setuptools`` and ``distutils`` are structured around the *command design
pattern*. This means that each main action executed when building a
distribution package (such as creating a :term:`sdist <Source Distribution (or "sdist")>`
or :term:`wheel`) correspond to the implementation of a Python class.

Originally in ``distutils``, these commands would correspond to actual CLI
arguments that could be passed to the ``setup.py`` script to trigger a
different aspect of the build. In ``setuptools``, however, these command
objects are just a design abstraction that encapsulate logic and help to
organise the code.

You can overwrite existing commands (or add new ones) 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 project:

.. code-block:: ini

    # setup.cfg
    ...
    [options.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 (documented below).

Once a project containing such entry points has been activated on ``sys.path``,
(e.g. by running ``pip install``) the command(s) will be available to any
``setuptools``-based project. In fact, this is
how setuptools' own commands are installed: the setuptools project's setup
script defines entry points for them!

The commands ``sdist``, ``build_py`` and ``build_ext`` are especially useful
to customize ``setuptools`` builds. Note however that when overwriting existing
commands, you should be very careful to maintain API compatibility.
Custom commands should try to replicate the same overall behavior as the
original classes, and when possible, even inherit from them.

You should also consider handling exceptions such as ``CompileError``,
``LinkError``, ``LibError``, among others. These exceptions are available in
the ``setuptools.errors`` module.

.. autoclass:: setuptools.Command
   :members:


Supporting sdists and editable installs in ``build`` sub-commands
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

``build`` sub-commands (like ``build_py`` and ``build_ext``)
are encouraged to implement the following protocol:

.. autoclass:: setuptools.command.build.SubCommand
   :members:


Adding 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
extension project:

.. code-block:: ini

    # setup.cfg
    ...
    [options.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 SetupError(
                "%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
``SetupError`` (from the ``setuptools.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
extensions to define a common argument, as long as they agree on
what values of that argument are valid.


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.


Defining Additional Metadata
----------------------------

Some extensible applications and frameworks may need to define their own kinds
of metadata, which they can then access using the :mod:`importlib.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 an 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 for more
details.


.. _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 an 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 an
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:

.. code-block:: ini

    # setup.cfg
    ...
    [options.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 ``logging`` 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: :pypi:`setuptools_scm`
- SVN: :pypi:`setuptools_svn`

If you would like to create a plugin for ``setuptools`` to find files tracked
by another revision control system, you can do so by adding an entry point to
the ``setuptools.file_finders`` group.  The entry point should be a function
accepting a single directory name, and should yield all the filenames within
that directory (and any subdirectories thereof) that are under revision
control.

For example, if you were going to create a plugin for a revision control system
called "foobar", you would write a function something like this:

.. code-block:: python

    def find_files_for_foobar(dirname):
        ...  # loop to yield paths that start with `dirname`

And you would register it in a setup script using something like this:

.. code-block:: ini

    # setup.cfg
    ...

    [options.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 ``logging.warning()`` to
  inform the user of the missing program(s).


.. _distutils: https://docs.python.org/3.9/library/distutils.html


Final Remarks
-------------

* To use a ``setuptools`` plugin, your users will need to add your package as a
  build requirement to their build-system configuration. Please check out our
  guides on :doc:`/userguide/dependency_management` for more information.

* Directly calling ``python setup.py ...`` is considered a **deprecated** practice.
  You should not add new commands to ``setuptools`` expecting them to be run
  via this interface.
PK�![
���sGsGAdoc/alt-python313-setuptools/docs/userguide/package_discovery.rstnu�[���.. _`package_discovery`:

========================================
Package Discovery and Namespace Packages
========================================

.. note::
    a full specification for the keywords supplied to ``setup.cfg`` or
    ``setup.py`` can be found at :doc:`keywords reference </references/keywords>`

.. important::
    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 is a good place to start.

``Setuptools`` provides powerful tools to handle package discovery, including
support for namespace packages.

Normally, you would specify the packages to be included manually in the following manner:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        #...
        packages =
            mypkg
            mypkg.subpkg1
            mypkg.subpkg2

.. tab:: setup.py

    .. code-block:: python

        setup(
            # ...
            packages=['mypkg', 'mypkg.subpkg1', 'mypkg.subpkg2']
        )

.. tab:: pyproject.toml

    .. code-block:: toml

        # ...
        [tool.setuptools]
        packages = ["mypkg", "mypkg.subpkg1", "mypkg.subpkg2"]
        # ...


If your packages are not in the root of the repository or do not correspond
exactly to the directory structure, you also need to configure ``package_dir``:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        # ...
        package_dir =
            = src
            # directory containing all the packages (e.g.  src/mypkg, src/mypkg/subpkg1, ...)
        # OR
        package_dir =
            mypkg = lib
            # mypkg.module corresponds to lib/module.py
            mypkg.subpkg1 = lib1
            # mypkg.subpkg1.module1 corresponds to lib1/module1.py
            mypkg.subpkg2 = lib2
            # mypkg.subpkg2.module2 corresponds to lib2/module2.py
        # ...

.. tab:: setup.py

    .. code-block:: python

        setup(
            # ...
            package_dir = {"": "src"}
            # directory containing all the packages (e.g.  src/mypkg, src/mypkg/subpkg1, ...)
        )

        # OR

        setup(
            # ...
            package_dir = {
                "mypkg": "lib",  # mypkg.module corresponds to lib/module.py
                "mypkg.subpkg1": "lib1",  # mypkg.subpkg1.module1 corresponds to lib1/module1.py
                "mypkg.subpkg2": "lib2"   # mypkg.subpkg2.module2 corresponds to lib2/module2.py
                # ...
        )

.. tab:: pyproject.toml

    .. code-block:: toml

        [tool.setuptools]
        # ...
        package-dir = {"" = "src"}
            # directory containing all the packages (e.g.  src/mypkg1, src/mypkg2)

        # OR

        [tool.setuptools.package-dir]
        mypkg = "lib"
        # mypkg.module corresponds to lib/module.py
        "mypkg.subpkg1" = "lib1"
        # mypkg.subpkg1.module1 corresponds to lib1/module1.py
        "mypkg.subpkg2" = "lib2"
        # mypkg.subpkg2.module2 corresponds to lib2/module2.py
        # ...

This can get tiresome really quickly. To speed things up, you can rely on
setuptools automatic discovery, or use the provided tools, as explained in
the following sections.

.. important::
   Although ``setuptools`` allows developers to create a very complex mapping
   between directory names and package names, it is better to *keep it simple*
   and reflect the desired package hierarchy in the directory structure,
   preserving the same names.

.. _auto-discovery:

Automatic discovery
===================

By default ``setuptools`` will consider 2 popular project layouts, each one with
its own set of advantages and disadvantages [#layout1]_ [#layout2]_ as
discussed in the following sections.

Setuptools will automatically scan your project directory looking for these
layouts and try to guess the correct values for the :ref:`packages <declarative
config>` and :doc:`py_modules </references/keywords>` configuration.

.. important::
   Automatic discovery will **only** be enabled if you **don't** provide any
   configuration for ``packages`` and ``py_modules``.
   If at least one of them is explicitly set, automatic discovery will not take place.

   **Note**: specifying ``ext_modules`` might also prevent auto-discover from
   taking place, unless your opt into :doc:`pyproject_config` (which will
   disable the backward compatible behaviour).

.. _src-layout:

src-layout
----------
The project should contain a ``src`` directory under the project root and
all modules and packages meant for distribution are placed inside this
directory::

    project_root_directory
    ├── pyproject.toml  # AND/OR setup.cfg, setup.py
    ├── ...
    └── src/
        └── mypkg/
            ├── __init__.py
            ├── ...
            ├── module.py
            ├── subpkg1/
            │   ├── __init__.py
            │   ├── ...
            │   └── module1.py
            └── subpkg2/
                ├── __init__.py
                ├── ...
                └── module2.py

This layout is very handy when you wish to use automatic discovery,
since you don't have to worry about other Python files or folders in your
project root being distributed by mistake. In some circumstances it can be
also less error-prone for testing or when using :pep:`420`-style packages.
On the other hand you cannot rely on the implicit ``PYTHONPATH=.`` to fire
up the Python REPL and play with your package (you will need an
`editable install`_ to be able to do that).

.. _flat-layout:

flat-layout
-----------
*(also known as "adhoc")*

The package folder(s) are placed directly under the project root::

    project_root_directory
    ├── pyproject.toml  # AND/OR setup.cfg, setup.py
    ├── ...
    └── mypkg/
        ├── __init__.py
        ├── ...
        ├── module.py
        ├── subpkg1/
        │   ├── __init__.py
        │   ├── ...
        │   └── module1.py
        └── subpkg2/
            ├── __init__.py
            ├── ...
            └── module2.py

This layout is very practical for using the REPL, but in some situations
it can be more error-prone (e.g. during tests or if you have a bunch
of folders or Python files hanging around your project root).

To avoid confusion, file and folder names that are used by popular tools (or
that correspond to well-known conventions, such as distributing documentation
alongside the project code) are automatically filtered out in the case of
*flat-layout*:

.. autoattribute:: setuptools.discovery.FlatLayoutPackageFinder.DEFAULT_EXCLUDE

.. autoattribute:: setuptools.discovery.FlatLayoutModuleFinder.DEFAULT_EXCLUDE

.. warning::
   If you are using auto-discovery with *flat-layout*, ``setuptools`` will
   refuse to create :term:`distribution archives <Distribution Package>` with
   multiple top-level packages or modules.

   This is done to prevent common errors such as accidentally publishing code
   not meant for distribution (e.g. maintenance-related scripts).

   Users that purposefully want to create multi-package distributions are
   advised to use :ref:`custom-discovery` or the ``src-layout``.

There is also a handy variation of the *flat-layout* for utilities/libraries
that can be implemented with a single Python file:

single-module distribution
^^^^^^^^^^^^^^^^^^^^^^^^^^

A standalone module is placed directly under the project root, instead of
inside a package folder::

    project_root_directory
    ├── pyproject.toml  # AND/OR setup.cfg, setup.py
    ├── ...
    └── single_file_lib.py


.. _custom-discovery:

Custom discovery
================

If the automatic discovery does not work for you
(e.g., you want to *include* in the distribution top-level packages with
reserved names such as ``tasks``, ``example`` or ``docs``, or you want to
*exclude* nested packages that would be otherwise included), you can use
the provided tools for package discovery:

.. 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

.. tab:: pyproject.toml

    .. code-block:: toml

        # ...
        [tool.setuptools.packages]
        find = {}  # Scanning implicit namespaces is active by default
        # OR
        find = {namespaces = false}  # Disable implicit namespaces


Finding simple 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 returns a list of ``str`` representing the packages it could find. To use
it, consider the following directory::

    mypkg
    ├── pyproject.toml  # AND/OR setup.cfg, setup.py
    └── src
        ├── pkg1
        │   └── __init__.py
        ├── pkg2
        │   └── __init__.py
        ├── additional
        │   └── __init__.py
        └── pkg
            └── namespace
                └── __init__.py

To have setuptools to automatically include packages found
in ``src`` that start 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*
        # alternatively: `exclude = additional*`

    .. note::
        ``pkg`` does not contain an ``__init__.py`` file, therefore
        ``pkg.namespace`` is ignored by ``find:`` (see ``find_namespace:`` below).

.. tab:: setup.py

    .. code-block:: python

        setup(
            # ...
            packages=find_packages(
                where='src',
                include=['pkg*'],  # alternatively: `exclude=['additional*']`
            ),
            package_dir={"": "src"}
            # ...
        )


    .. note::
        ``pkg`` does not contain an ``__init__.py`` file, therefore
        ``pkg.namespace`` is ignored by ``find_packages()``
        (see ``find_namespace_packages()`` below).

.. tab:: pyproject.toml

    .. code-block:: toml

        [tool.setuptools.packages.find]
        where = ["src"]
        include = ["pkg*"]  # alternatively: `exclude = ["additional*"]`
        namespaces = false

    .. note::
        When using ``tool.setuptools.packages.find`` in ``pyproject.toml``,
        setuptools will consider :pep:`implicit namespaces <420>` by default when
        scanning your project directory.
        To avoid ``pkg.namespace`` from being added to your package list
        you can set ``namespaces = false``. This will prevent any folder
        without an ``__init__.py`` file from being scanned.

.. important::
   ``include`` and ``exclude`` accept strings representing :mod:`glob` patterns.
   These patterns should match the **full** name of the Python module (as if it
   was written in an ``import`` statement).

   For example if you have ``util`` pattern, it will match
   ``util/__init__.py`` but not ``util/files/__init__.py``.

   The fact that the parent package is matched by the pattern will not dictate
   if the submodule will be included or excluded from the distribution.
   You will need to explicitly add a wildcard (e.g. ``util*``)
   if you want the pattern to also match submodules.

.. _Namespace Packages:

Finding namespace packages
--------------------------
``setuptools``  provides ``find_namespace:`` (``find_namespace_packages()``)
which behaves similarly to ``find:`` but works with namespace packages.

Before diving in, it is important to have a good understanding of what
:pep:`namespace packages <420>` are. Here is a quick recap.

When you have two packages organized 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.

Now, suppose you decide to package the ``foo`` part for distribution and start
by creating a project directory organized as follows::

   foo
   ├── pyproject.toml  # AND/OR setup.cfg, setup.py
   └── src
       └── timmins
           └── foo
               └── __init__.py

If you want the ``timmins.foo`` to be automatically included in the
distribution, then you will need to specify:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        package_dir =
            =src
        packages = find_namespace:

        [options.packages.find]
        where = src

    ``find:`` won't work because ``timmins`` doesn't contain ``__init__.py``
    directly, instead, you have to use ``find_namespace:``.

    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.

.. tab:: setup.py

    .. code-block:: python

        setup(
            # ...
            packages=find_namespace_packages(where='src'),
            package_dir={"": "src"}
            # ...
        )

    When you use ``find_packages()``, all directories without an
    ``__init__.py`` file will be ignored.
    On the other hand, ``find_namespace_packages()`` will scan all
    directories.

.. tab:: pyproject.toml

    .. code-block:: toml

        [tool.setuptools.packages.find]
        where = ["src"]

    When using ``tool.setuptools.packages.find`` in ``pyproject.toml``,
    setuptools will consider :pep:`implicit namespaces <420>` by default when
    scanning your project directory.

After installing the package distribution, ``timmins.foo`` would become
available to your interpreter.

.. warning::
   Please have in mind that ``find_namespace:`` (setup.cfg),
   ``find_namespace_packages()`` (setup.py) and ``find`` (pyproject.toml) will
   scan **all** folders that you have in your project directory if you use a
   :ref:`flat-layout`.

   If used naïvely, this might result in unwanted files being added to your
   final wheel. For example, with a project directory organized as follows::

       foo
       ├── docs
       │   └── conf.py
       ├── timmins
       │   └── foo
       │       └── __init__.py
       └── tests
           └── tests_foo
               └── __init__.py

   final users will end up installing not only ``timmins.foo``, but also
   ``docs`` and ``tests.tests_foo``.

   A simple way to fix this is to adopt the aforementioned :ref:`src-layout`,
   or make sure to properly configure the ``include`` and/or ``exclude``
   accordingly.

.. tip::
   After :ref:`building your package <building>`, you can have a look if all
   the files are correct (nothing missing or extra), by running the following
   commands:

   .. code-block:: bash

      tar tf dist/*.tar.gz
      unzip -l dist/*.whl

   This requires the ``tar`` and ``unzip`` to be installed in your OS.
   On Windows you can also use a GUI program such as 7zip_.


Legacy Namespace Packages
=========================
The fact you can create namespace packages so effortlessly above is credited
to :pep:`420`. It used 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
   ├── pyproject.toml  # AND/OR setup.cfg, setup.py
   └── src
       └── timmins
           ├── __init__.py
           └── foo
               └── __init__.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 ``pyproject.toml/setup.cfg`` remains the same.


----


.. [#layout1] https://blog.ionelmc.ro/2014/05/25/python-packaging/#the-structure
.. [#layout2] https://blog.ionelmc.ro/2017/09/25/rehashing-the-src-layout/

.. _editable install: https://pip.pypa.io/en/stable/cli/pip_install/#editable-installs
.. _7zip: https://www.7-zip.org
PK�![���Xp?p?:doc/alt-python313-setuptools/docs/userguide/quickstart.rstnu�[���==========
Quickstart
==========

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

You can install the latest version of ``setuptools`` using :pypi:`pip`::

    pip install --upgrade setuptools

Most of the times, however, you don't have to...

Instead, when creating new Python packages, it is recommended to use
a command line tool called :pypi:`build`. This tool will automatically download
``setuptools`` and any other build-time dependencies that your project might
have. You just need to specify them in a ``pyproject.toml`` file at the root of
your package, as indicated in the :ref:`following section <basic-use>`.

.. _install-build:

You can also :doc:`install build <build:installation>` using :pypi:`pip`::

    pip install --upgrade build

This will allow you to run the command: ``python -m build``.

.. important::
   Please note that some operating systems might be equipped with
   the ``python3`` and ``pip3`` commands instead of ``python`` and ``pip``
   (but they should be equivalent).
   If you don't have ``pip`` or ``pip3`` available in your system, please
   check out :doc:`pip installation docs <pip:installation>`.


Every 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 tool that provides a ``build sdist``-like
functionality.


.. _basic-use:

Basic Use
=========

When creating a Python package, you must provide a ``pyproject.toml`` file
containing a ``build-system`` section similar to the example below:

.. code-block:: toml

    [build-system]
    requires = ["setuptools"]
    build-backend = "setuptools.build_meta"

This section declares what are your build system dependencies, and which
library will be used to actually do the packaging.

.. note::

   Historically this documentation has unnecessarily listed ``wheel``
   in the ``requires`` list, and many projects still do that. This is
   not recommended. The backend automatically adds ``wheel`` dependency
   when it is required, and listing it explicitly causes it to be
   unnecessarily required for source distribution builds.
   You should only include ``wheel`` in ``requires`` if you need to explicitly
   access it during build time (e.g. if your project needs a ``setup.py``
   script that imports ``wheel``).

In addition to specifying a build system, you also will need to add
some package information such as metadata, contents, dependencies, etc.
This can be done in the same ``pyproject.toml`` file,
or in a separated one: ``setup.cfg`` or ``setup.py`` [#setup.py]_.

The following example demonstrates a minimum configuration
(which assumes the project depends on :pypi:`requests` and
:pypi:`importlib-metadata` to be able to run):

.. tab:: pyproject.toml

    .. code-block:: toml

       [project]
       name = "mypackage"
       version = "0.0.1"
       dependencies = [
           "requests",
           'importlib-metadata; python_version<"3.8"',
       ]

    See :doc:`/userguide/pyproject_config` for more information.

.. tab:: setup.cfg

    .. code-block:: ini

        [metadata]
        name = mypackage
        version = 0.0.1

        [options]
        install_requires =
            requests
            importlib-metadata; python_version < "3.8"

    See :doc:`/userguide/declarative_config` for more information.

.. tab:: setup.py [#setup.py]_

    .. code-block:: python

        from setuptools import setup

        setup(
            name='mypackage',
            version='0.0.1',
            install_requires=[
                'requests',
                'importlib-metadata; python_version == "3.8"',
            ],
        )

    See :doc:`/references/keywords` for more information.

Finally, you will need to organize your Python code to make it ready for
distributing into something that looks like the following
(optional files marked with ``#``)::

    mypackage
    ├── pyproject.toml  # and/or setup.cfg/setup.py (depending on the configuration method)
    |   # README.rst or README.md (a nice description of your package)
    |   # LICENCE (properly chosen license information, e.g. MIT, BSD-3, GPL-3, MPL-2, etc...)
    └── mypackage
        ├── __init__.py
        └── ... (other Python files)

With :ref:`build installed in your system <install-build>`, you can then run::

    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 :doc:`upload <twine:index>` to PyPI_!

Of course, before you release your project to PyPI_, you'll want to add a bit
more information 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 the additional but essential information you need
to specify to properly package your project.


..
   TODO: A previous generation of this document included a section called
   "Python packaging at a glance". This is a nice title, but the content
   removed because it assumed the reader had familiarity with the history of
   setuptools and PEP 517. We should take advantage of this nice title and add
   this section back, but use it to explain important concepts of the
   ecosystem, such as "sdist", "wheel", "index". It would also be nice if we
   could have a diagram for that (explaining for example that "wheels" are
   built from "sdists" not the source tree).

.. _setuppy_discouraged:
.. admonition:: Info: Using ``setup.py``
  :class: seealso

  Setuptools offers first class support for ``setup.py`` files as a configuration
  mechanism.

  It is important to remember, however, that running this file as a
  script (e.g. ``python setup.py sdist``) is strongly **discouraged**, and
  that the majority of the command line interfaces are (or will be) **deprecated**
  (e.g. ``python setup.py install``, ``python setup.py bdist_wininst``, ...).

  We also recommend users to expose as much as possible configuration in a
  more *declarative* way via the :doc:`pyproject.toml <pyproject_config>` or
  :doc:`setup.cfg <declarative_config>`, and keep the ``setup.py`` minimal
  with only the dynamic parts (or even omit it completely if applicable).

  See `Why you shouldn't invoke setup.py directly`_ for more background.

.. _Why you shouldn't invoke setup.py directly: https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html


Overview
========

Package discovery
-----------------
For projects that follow a simple directory structure, ``setuptools`` should be
able to automatically detect all :term:`packages <package>` and
:term:`namespaces <namespace>`. However, complex projects might include
additional folders and supporting files that not necessarily should be
distributed (or that can confuse ``setuptools`` auto discovery algorithm).

Therefore, ``setuptools`` provides a convenient way to customize
which packages should be distributed and in which directory they should be
found, as shown in the example below:

.. tab:: pyproject.toml

    .. code-block:: toml

        # ...
        [tool.setuptools.packages]
        find = {}  # Scan the project directory with the default parameters

        # OR
        [tool.setuptools.packages.find]
        # All the following settings are optional:
        where = ["src"]  # ["."] by default
        include = ["mypackage*"]  # ["*"] by default
        exclude = ["mypackage.tests*"]  # empty by default
        namespaces = false  # true by default

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        packages = find: # OR `find_namespace:` if you want to use namespaces

        [options.packages.find]  # (always `find` even if `find_namespace:` was used before)
        # This section is optional as well as each of the following options:
        where=src  # . by default
        include=mypackage*  # * by default
        exclude=mypackage.tests*  # empty by default

.. tab:: setup.py [#setup.py]_

    .. code-block:: python

        from setuptools import setup, find_packages  # or find_namespace_packages

        setup(
            # ...
            packages=find_packages(
                # All keyword arguments below are optional:
                where='src',  # '.' by default
                include=['mypackage*'],  # ['*'] by default
                exclude=['mypackage.tests'],  # empty by default
            ),
            # ...
        )

When you pass the above information, alongside other necessary information,
``setuptools`` walks through the directory specified in ``where`` (defaults to ``.``) and filters the packages
it can find following the ``include`` patterns (defaults to ``*``), then it removes
those that match the ``exclude`` patterns (defaults to empty) and returns a list of Python packages.

For more details and advanced use, go to :ref:`package_discovery`.

.. tip::
   Starting with version 61.0.0, setuptools' automatic discovery capabilities
   have been improved to detect popular project layouts (such as the
   :ref:`flat-layout` and :ref:`src-layout`) without requiring any
   special configuration. Check out our :ref:`reference docs <package_discovery>`
   for more information.


Entry points and automatic script creation
-------------------------------------------
Setuptools supports automatic creation of scripts upon installation, that run
code within your package if you specify them as :doc:`entry points
<PyPUG:specifications/entry-points>`.
An example of how this feature can be used in ``pip``:
it allows you to run commands like ``pip install`` instead of having
to type ``python -m pip install``.

The following configuration examples show how to accomplish this:


.. tab:: pyproject.toml

    .. code-block:: toml

       [project.scripts]
       cli-name = "mypkg.mymodule:some_func"

.. tab:: setup.cfg

    .. code-block:: ini

        [options.entry_points]
        console_scripts =
            cli-name = mypkg.mymodule:some_func

.. tab:: setup.py [#setup.py]_

    .. code-block:: python

        setup(
            # ...
            entry_points={
                'console_scripts': [
                    'cli-name = mypkg.mymodule:some_func',
                ]
            }
        )

When this project is installed, a ``cli-name`` executable will be created.
``cli-name`` will invoke the function ``some_func`` in the
``mypkg/mymodule.py`` file when called by the user.
Note that you can also use the ``entry-points`` mechanism to advertise
components between installed packages and implement plugin systems.
For detailed usage, go to :doc:`entry_point`.


Dependency management
---------------------
Packages built with ``setuptools`` can specify dependencies to be automatically
installed when the package itself is installed.
The example below shows how to configure this kind of dependencies:

.. tab:: pyproject.toml

    .. code-block:: toml

        [project]
        # ...
        dependencies = [
            "docutils",
            "requests <= 0.4",
        ]
        # ...

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        install_requires =
            docutils
            requests <= 0.4

.. tab:: setup.py [#setup.py]_

    .. code-block:: python

        setup(
            # ...
            install_requires=["docutils", "requests <= 0.4"],
            # ...
        )

Each dependency is represented by a string that can optionally contain version requirements
(e.g. one of the operators <, >, <=, >=, == or !=, followed by a version identifier),
and/or conditional environment markers, e.g. ``sys_platform == "win32"``
(see :doc:`PyPUG:specifications/version-specifiers` for more information).

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 scenario. You can also specify groups of
extra dependencies that are not strictly required by your package to work, but
that will provide additional functionalities.
For more advanced use, see :doc:`dependency_management`.


.. _Including Data Files:

Including Data Files
--------------------
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:

.. tab:: pyproject.toml

    .. code-block:: toml

        [tool.setuptools]
        include-package-data = true
        # This is already the default behaviour if you are using
        # pyproject.toml to configure your build.
        # You can deactivate that with `include-package-data = false`

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        include_package_data = True

.. tab:: setup.py [#setup.py]_

    .. code-block:: python

        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 :ref:`MANIFEST.in <Using MANIFEST.in>`
file or automatically added by a :ref:`Revision Control System plugin
<Adding Support for Revision Control Systems>`.
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.
Here's how to do it::

    pip install --editable .

See :doc:`development_mode` for more information.

.. tip::

    Prior to :ref:`pip v21.1 <pip:v21-1>`, a ``setup.py`` script was
    required to be compatible with development mode. With late
    versions of pip, projects without ``setup.py`` may be installed in this mode.

    If you have a version of ``pip`` older than v21.1 or is using a different
    packaging-related tool that does not support :pep:`660`, you might need to keep a
    ``setup.py`` file in file in your repository if you want to use editable
    installs.

    A simple script will suffice, for example:

    .. code-block:: python

        from setuptools import setup

        setup()

    You can still keep all the configuration in
    :doc:`pyproject.toml </userguide/pyproject_config>` and/or
    :doc:`setup.cfg </userguide/declarative_config>`


Uploading your package to PyPI
------------------------------
After generating the distribution files, the next step would be to upload your
distribution so others can use it. This functionality is provided by
:pypi:`twine` and is documented in the :doc:`Python packaging tutorial
<PyPUG:tutorials/packaging-projects>`.


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. :doc:`Here </userguide/declarative_config>` we provide a quick guide to
understanding how ``setup.cfg`` is parsed by ``setuptools`` to ease the pain of
transition.

.. _packaging-resources:

Resources on Python packaging
=============================
Packaging in Python can be hard and is constantly evolving.
`Python Packaging User Guide <https://packaging.python.org>`_ has tutorials and
up-to-date references that can help you when it is time to distribute your work.



----

.. rubric:: Notes

.. [#setup.py]
   New projects are advised to avoid ``setup.py`` configurations (beyond the minimal stub)
   when custom scripting during the build is not necessary.
   Examples are kept in this document to help people interested in maintaining or
   contributing to existing packages that use ``setup.py``.
   Note that you can still keep most of configuration declarative in
   :doc:`setup.cfg <declarative_config>` or :doc:`pyproject.toml
   <pyproject_config>` and use ``setup.py`` only for the parts not
   supported in those files (e.g. C extensions).
   See :ref:`note <setuppy_discouraged>`.

.. _PyPI: https://pypi.org
PK�![��j�J(J(<doc/alt-python313-setuptools/docs/userguide/distribution.rstnu�[���.. _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` 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 <https://peps.python.org/pep-0440/#pre-releases>`_
or `post-release <https://peps.python.org/pep-0440/#post-releases>`_ 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 release candidate
``2.4rc1``, which in turn is newer than beta release ``2.4b1`` or
alpha release ``2.4a1``.  Postrelease tags make
a version be considered *newer* than the version they are appended to.  So,
revisions like ``2.4.post1`` 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``. Note that ``2.4pl1`` is not :pep:`440`-compliant.

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. Note that only ``a``, ``b``, and ``rc`` are :pep:`440`-compliant
pre-release tags.

In addition, there are three special prerelease tags that are treated as if
they were ``rc``: ``c``, ``pre``, and ``preview``.  So, version
``2.4c1``, ``2.4pre1`` and ``2.4preview1`` are all the exact same version as
``2.4rc1``, and are treated as identical by setuptools.

A post-release tag is the string ``.post``, followed by a non-negative integer
value. 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.post1263`` might denote Subversion
revision 1263 of a post-release patch of version ``2.4``. Or you might use
``2.4.post20051127`` to denote a date-stamped post-release. Legacy post-release
tags could be either a series of letters that are alphabetically greater than or
equal to "final", or a dash (``-``) - for example ``2.4-r1263`` or
``2.4-20051127``.

Notice that after each legacy 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.dev41475`` 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
``41475`` 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.9a0.dev0`` are
  identical versions from setuptools' point of view, so you can use whatever
  scheme you prefer. Of these examples, only ``1.9a0.dev0`` is
  :pep:`440`-compliant.

* 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 section for more details.


Tagging and "Daily Build" or "Snapshot" Releases
------------------------------------------------

.. warning::
   Please note that running ``python setup.py ...`` directly is no longer
   considered a good practice and that in the future the commands ``egg_info``
   and ``rotate`` will be deprecated.

   As a result, the instructions and information presented in this section
   should be considered **transitional** while setuptools don't provide a
   mechanism for tagging releases.

   Meanwhile, if you can also consider using :pypi:`setuptools-scm` to achieve
   similar objectives.


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.)

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.
PK�![�8F�M�M9doc/alt-python313-setuptools/docs/userguide/datafiles.rstnu�[���====================
Data Files Support
====================

Old packaging installation methods in the Python ecosystem
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 **inside the package directory**.

Setuptools focuses on this most common type of data files and offers three ways
of specifying which files should be included in your packages, as described in
the following sections.

include_package_data
====================

First, you can simply use the ``include_package_data`` keyword.
For example, if the package tree looks like this::

    project_root_directory
    ├── setup.py        # and/or setup.cfg, pyproject.toml
    └── src
        └── mypkg
            ├── __init__.py
            ├── data1.rst
            ├── data2.rst
            ├── data1.txt
            └── data2.txt

and you supply this configuration:

.. tab:: pyproject.toml

   .. code-block:: toml

        [tool.setuptools]
        # ...
        # By default, include-package-data is true in pyproject.toml, so you do
        # NOT have to specify this line.
        include-package-data = true

        [tool.setuptools.packages.find]
        where = ["src"]

.. tab:: setup.cfg

   .. code-block:: ini

        [options]
        # ...
        packages = find:
        package_dir =
            = src
        include_package_data = True

        [options.packages.find]
        where = src

.. tab:: setup.py

   .. code-block:: python

    from setuptools import setup, find_packages
    setup(
        # ...,
        packages=find_packages(where="src"),
        package_dir={"": "src"},
        include_package_data=True
    )

then all the ``.txt`` and ``.rst`` files will be automatically installed with
your package, provided:

1. These files are included via the :ref:`MANIFEST.in <Using MANIFEST.in>` file,
   like so::

        include src/mypkg/*.txt
        include src/mypkg/*.rst

2. OR, they are being tracked by a revision control system such as Git, Mercurial
   or SVN, and you have configured an appropriate plugin such as
   :pypi:`setuptools-scm` or :pypi:`setuptools-svn`.
   (See the section below on :ref:`Adding Support for Revision
   Control Systems` for information on how to write such plugins.)

.. note::
   .. versionadded:: v61.0.0
      The default value for ``tool.setuptools.include-package-data`` is ``True``
      when projects are configured via ``pyproject.toml``.
      This behaviour differs from ``setup.cfg`` and ``setup.py``
      (where ``include_package_data=False`` by default), which was not changed
      to ensure backwards compatibility with existing projects.

package_data
============

By default, ``include_package_data`` considers **all** non ``.py`` files found inside
the package directory (``src/mypkg`` in this case) as data files, and includes those that
satisfy (at least) one of the above two conditions into the source distribution, and
consequently in the installation of your package.
If you want finer-grained control over what files are included, then you can also use
the ``package_data`` keyword.
For example, if the package tree looks like this::

    project_root_directory
    ├── setup.py        # and/or setup.cfg, pyproject.toml
    └── src
        └── mypkg
            ├── __init__.py
            ├── data1.rst
            ├── data2.rst
            ├── data1.txt
            └── data2.txt

then you can use the following configuration to capture the ``.txt`` and ``.rst`` files as
data files:

.. tab:: pyproject.toml

   .. code-block:: toml

        [tool.setuptools.packages.find]
        where = ["src"]

        [tool.setuptools.package-data]
        mypkg = ["*.txt", "*.rst"]

.. tab:: setup.cfg

   .. code-block:: ini

        [options]
        # ...
        packages = find:
        package_dir =
            = src

        [options.packages.find]
        where = src

        [options.package_data]
        mypkg =
            *.txt
            *.rst

.. tab:: setup.py

    .. code-block:: python

        from setuptools import setup, find_packages
        setup(
            # ...,
            packages=find_packages(where="src"),
            package_dir={"": "src"},
            package_data={"mypkg": ["*.txt", "*.rst"]}
        )

The ``package_data`` argument is a dictionary that maps from package names to
lists of glob patterns. Note that the data files specified using the ``package_data``
option neither require to be included within a :ref:`MANIFEST.in <Using MANIFEST.in>`
file, nor require to be added by a revision control system plugin.

.. note::
        If your glob patterns 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.

.. important::
        Glob patterns do not automatically match dotfiles, i.e., directory or file names
        starting with a dot (``.``). To include such files, you must explicitly start
        the pattern with a dot, e.g. ``.*`` to match ``.gitignore``.

If you have multiple top-level packages and a common pattern of data files for all these
packages, for example::

    project_root_directory
    ├── setup.py        # and/or setup.cfg, pyproject.toml
    └── src
        ├── mypkg1
        │   ├── data1.rst
        │   ├── data1.txt
        │   └── __init__.py
        └── mypkg2
            ├── data2.txt
            └── __init__.py

Here, both packages ``mypkg1`` and ``mypkg2`` share a common pattern of having ``.txt``
data files. However, only ``mypkg1`` has ``.rst`` data files. In such a case, if you want to
use the ``package_data`` option, the following configuration will work:

.. tab:: pyproject.toml

   .. code-block:: toml

        [tool.setuptools.packages.find]
        where = ["src"]

        [tool.setuptools.package-data]
        "*" = ["*.txt"]
        mypkg1 = ["data1.rst"]

.. tab:: setup.cfg

   .. code-block:: ini

        [options]
        packages = find:
        package_dir =
            = src

        [options.packages.find]
        where = src

        [options.package_data]
        * =
          *.txt
        mypkg1 =
          data1.rst

.. tab:: setup.py

   .. code-block:: python

        from setuptools import setup, find_packages
        setup(
            # ...,
            packages=find_packages(where="src"),
            package_dir={"": "src"},
            package_data={"": ["*.txt"], "mypkg1": ["data1.rst"]},
        )

Notice that if you list patterns in ``package_data`` under the empty string ``""`` in
``setup.py``, and the asterisk ``*`` in ``setup.cfg`` and ``pyproject.toml``, these
patterns are used to find files in every package. For example, we use ``""`` or ``*``
to indicate that the ``.txt`` files from all packages should be captured as data files.
These placeholders are treated as a special case, ``setuptools`` **do not**
support glob patterns on package names for this configuration
(patterns are only supported on the file paths).
Also note how we can continue to specify patterns for individual packages, i.e.
we specify that ``data1.rst`` from ``mypkg1`` alone should be captured as well.

.. note::
    When building an ``sdist``, the data files are also drawn from the
    ``package_name.egg-info/SOURCES.txt`` file which works as a form of cache.
    So make sure that this file is removed if ``package_data`` is updated,
    before re-building the package.

.. attention::
   In Python any directory is considered a package
   (even if it does not contain ``__init__.py``,
   see *native namespaces packages* on :doc:`PyPUG:guides/packaging-namespace-packages`).
   Therefore, if you are not relying on :doc:`automatic discovery </userguide/package_discovery>`,
   you *SHOULD* ensure that **all** packages (including the ones that don't
   contain any Python files) are included in the ``packages`` configuration
   (see :doc:`/userguide/package_discovery` for more information).

   Moreover, it is advisable to use full packages name using the dot
   notation instead of a nested path, to avoid error prone configurations.
   Please check :ref:`section subdirectories <subdir-data-files>` below.


exclude_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,
consider a scenario where you have ``include_package_data=True``, and you are using
a revision control system with an appropriate plugin.
Sometimes developers add directory-specific marker files (such as ``.gitignore``,
``.gitkeep``, ``.gitattributes``, or ``.hgignore``), these files are probably being
tracked by the revision control system, and therefore by default they will be
included when the package is installed.

Supposing you want to prevent these files from being included in the
installation (they are not relevant to Python or the package), then you could
use the ``exclude_package_data`` option:

.. tab:: pyproject.toml

   .. code-block:: toml

        [tool.setuptools.packages.find]
        where = ["src"]

        [tool.setuptools.exclude-package-data]
        mypkg = [".gitattributes"]

.. tab:: setup.cfg

   .. code-block:: ini

        [options]
        # ...
        packages = find:
        package_dir =
            = src
        include_package_data = True

        [options.packages.find]
        where = src

        [options.exclude_package_data]
        mypkg =
            .gitattributes

.. tab:: setup.py

    .. code-block:: python

        from setuptools import setup, find_packages
        setup(
            # ...,
            packages=find_packages(where="src"),
            package_dir={"": "src"},
            include_package_data=True,
            exclude_package_data={"mypkg": [".gitattributes"]},
        )

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, you can use the empty string key ``""`` in ``setup.py`` and the
asterisk ``*`` in ``setup.cfg`` and ``pyproject.toml`` to match all top-level packages.

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``.


.. _subdir-data-files:

Subdirectory for Data Files
===========================

A common pattern is where some (or all) of the data files are placed under
a separate subdirectory. For example::

    project_root_directory
    ├── setup.py        # and/or setup.cfg, pyproject.toml
    └── src
        └── mypkg
            ├── data
            │   ├── data1.rst
            │   └── data2.rst
            ├── __init__.py
            ├── data1.txt
            └── data2.txt

Here, the ``.rst`` files are placed under a ``data`` subdirectory inside ``mypkg``,
while the ``.txt`` files are directly under ``mypkg``.

In this case, the recommended approach is to treat ``data`` as a namespace package
(refer :pep:`420`). With ``package_data``,
the configuration might look like this:

.. tab:: pyproject.toml

   .. code-block:: toml

        # Scanning for namespace packages in the ``src`` directory is true by
        # default in pyproject.toml, so you do NOT need to include the
        # `tool.setuptools.packages.find` if it looks like the following:
        # [tool.setuptools.packages.find]
        # namespaces = true
        # where = ["src"]

        [tool.setuptools.package-data]
        mypkg = ["*.txt"]
        "mypkg.data" = ["*.rst"]

.. tab:: setup.cfg

   .. code-block:: ini

        [options]
        # ...
        packages = find_namespace:
        package_dir =
            = src

        [options.packages.find]
        where = src

        [options.package_data]
        mypkg =
            *.txt
        mypkg.data =
            *.rst

.. tab:: setup.py

   .. code-block:: python

        from setuptools import setup, find_namespace_packages
        setup(
            # ...,
            packages=find_namespace_packages(where="src"),
            package_dir={"": "src"},
            package_data={
                "mypkg": ["*.txt"],
                "mypkg.data": ["*.rst"],
            }
        )

In other words, we allow Setuptools to scan for namespace packages in the ``src`` directory,
which enables the ``data`` directory to be identified, and then, we separately specify data
files for the root package ``mypkg``, and the namespace package ``data`` under the package
``mypkg``.

With ``include_package_data`` the configuration is simpler: you simply need to enable
scanning of namespace packages in the ``src`` directory and the rest is handled by Setuptools.

.. tab:: pyproject.toml

   .. code-block:: toml

        [tool.setuptools]
        # ...
        # By default, include-package-data is true in pyproject.toml, so you do
        # NOT have to specify this line.
        include-package-data = true

        [tool.setuptools.packages.find]
        # scanning for namespace packages is true by default in pyproject.toml, so
        # you need NOT include the following line.
        namespaces = true
        where = ["src"]

.. tab:: setup.cfg

   .. code-block:: ini

        [options]
        packages = find_namespace:
        package_dir =
            = src
        include_package_data = True

        [options.packages.find]
        where = src

.. tab:: setup.py

   .. code-block:: python

        from setuptools import setup, find_namespace_packages
        setup(
            # ... ,
            packages=find_namespace_packages(where="src"),
            package_dir={"": "src"},
            include_package_data=True,
        )

Summary
=======

In summary, the three options allow you to:

``include_package_data``
    Accept all data files and directories matched by
    :ref:`MANIFEST.in <Using MANIFEST.in>` or added by
    a :ref:`plugin <Adding Support for Revision Control Systems>`.

``package_data``
    Specify additional patterns to match files that may or may
    not be matched by :ref:`MANIFEST.in <Using MANIFEST.in>`
    or added by a :ref:`plugin <Adding Support for Revision Control Systems>`.

``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 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 manually deleting 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 also manually delete them.


.. _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. For example, if you have a structure
like this::

    project_root_directory
    ├── setup.py        # and/or setup.cfg, pyproject.toml
    └── src
        └── mypkg
            ├── data
            │   └── data1.txt
            ├── __init__.py
            └── foo.py

Then, in ``mypkg/foo.py``, you may try something like this in order to access
``mypkg/data/data1.txt``:

.. code-block:: python

   import os
   data_path = os.path.join(os.path.dirname(__file__), 'data', 'data1.txt')
   with open(data_path, 'r') as data_file:
        ...

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 :mod:`importlib.resources` to access them.
In this case, you would do something like this:

.. code-block:: python

   from importlib.resources import files
   data_text = files('mypkg.data').joinpath('data1.txt').read_text()

:mod:`importlib.resources` was added to Python 3.7. However, the API illustrated in
this code (using ``files()``) was added only in Python 3.9, [#files_api]_ and support
for accessing data files via namespace packages was added only in Python 3.10 [#namespace_support]_
(the ``data`` subdirectory is a namespace package under the root package ``mypkg``).
Therefore, you may find this code to work only in Python 3.10 (and above). For other
versions of Python, you are recommended to use the :pypi:`importlib-resources` backport
which provides the latest version of this library. In this case, the only change that
has to be made to the above code is to replace ``importlib.resources`` with ``importlib_resources``, i.e.

.. code-block:: python

   from importlib_resources import files
   ...

See :doc:`importlib-resources:using` for detailed instructions.

.. tip:: Files inside the package directory should be *read-only* to avoid a
   series of common problems (e.g. when multiple users share a common Python
   installation, when the package is loaded from a zip file, or when multiple
   instances of a Python application run in parallel).

   If your Python package needs to write to a file for shared data or configuration,
   you can use standard platform/OS-specific system directories, such as
   ``~/.local/config/$appname`` or ``/usr/share/$appname/$version`` (Linux specific) [#system-dirs]_.
   A common approach is to add a read-only template file to the package
   directory that is then copied to the correct system directory if no
   pre-existing file is found.


Data Files from Plugins and Extensions
======================================

You can resort to a :doc:`native/implicit namespace package
<PyPUG:guides/packaging-namespace-packages>` (as a container for files)
if you want plugins and extensions to your package to contribute with package data files.
This way, all files will be listed during runtime
when :doc:`using importlib.resources <importlib-resources:using>`.
Note that, although not strictly guaranteed, mainstream Python package managers,
like :pypi:`pip` and derived tools, will install files belong to multiple distributions
that share a same namespace into the same directory in the file system.
This means that the overhead for :mod:`importlib.resources` will be minimum.


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 **inside the package**.


----

.. [#system-dirs] These locations can be discovered with the help of
   third-party libraries such as :pypi:`platformdirs`.

.. [#files_api] Reference: https://importlib-resources.readthedocs.io/en/latest/using.html#migrating-from-legacy

.. [#namespace_support] Reference: https://github.com/python/importlib_resources/pull/196#issuecomment-734520374
PK�![�)�FF;doc/alt-python313-setuptools/docs/userguide/ext_modules.rstnu�[���==========================
Building Extension Modules
==========================

Setuptools can build C/C++ extension modules.  The keyword argument
``ext_modules`` of ``setup()`` should be a list of instances of the
:class:`setuptools.Extension` class.


For example, let's consider a simple project with only one extension module::

    <project_folder>
    ├── pyproject.toml
    └── foo.c

and all project metadata configuration in the ``pyproject.toml`` file:

.. code-block:: toml

   # pyproject.toml
   [build-system]
   requires = ["setuptools"]
   build-backend = "setuptools.build_meta"

   [project]
   name = "mylib-foo"  # as it would appear on PyPI
   version = "0.42"

To instruct setuptools to compile the ``foo.c`` file into the extension module
``mylib.foo``, we need to add a ``setup.py`` file similar to the following:

.. code-block:: python

   from setuptools import Extension, setup

   setup(
       ext_modules=[
           Extension(
               name="mylib.foo",  # as it would be imported
                                  # may include packages/namespaces separated by `.`

               sources=["foo.c"], # all sources are compiled into a single binary file
           ),
       ]
   )

.. seealso::
   You can find more information on the `Python docs about C/C++ extensions`_.
   Alternatively, you might also be interested in learning about `Cython`_.

   If you plan to distribute a package that uses extensions across multiple
   platforms, :pypi:`cibuildwheel` can also be helpful.

.. important::
   All files used to compile your extension need to be available on the system
   when building the package, so please make sure to include some documentation
   on how developers interested in building your package from source
   can obtain operating system level dependencies
   (e.g. compilers and external binary libraries/artifacts).

   You will also need to make sure that all auxiliary files that are contained
   inside your :term:`project` (e.g. C headers authored by you or your team)
   are configured to be included in your :term:`sdist <Source Distribution (or "sdist")>`.
   Please have a look on our section on :ref:`Controlling files in the distribution`.


Compiler and linker options
===========================

The command ``build_ext`` builds C/C++ extension modules.  It creates
a command line for running the compiler and linker by combining
compiler and linker options from various sources:

.. Reference: `test_customize_compiler` in distutils/tests/test_sysconfig.py

* the ``sysconfig`` variables ``CC``, ``CXX``, ``CCSHARED``,
  ``LDSHARED``, and ``CFLAGS``,
* the environment variables ``CC``, ``CPP``,
  ``CXX``, ``LDSHARED`` and ``CFLAGS``,
  ``CPPFLAGS``, ``LDFLAGS``,
* the ``Extension`` attributes ``include_dirs``,
  ``library_dirs``, ``extra_compile_args``, ``extra_link_args``,
  ``runtime_library_dirs``.

.. Ignoring AR, ARFLAGS, RANLIB here because they are used by the (obsolete?) build_clib, not build_ext.

Specifically, if the environment variables ``CC``, ``CPP``, ``CXX``, and ``LDSHARED``
are set, they will be used instead of the ``sysconfig`` variables of the same names.

The compiler options appear in the command line in the following order:

.. Reference: "compiler_so" and distutils.ccompiler.gen_preprocess_options, CCompiler.compile, UnixCCompiler._compile

* first, the options provided by the ``sysconfig`` variable ``CFLAGS``,
* then, the options provided by the environment variables ``CFLAGS`` and ``CPPFLAGS``,
* then, the options provided by the ``sysconfig`` variable ``CCSHARED``,
* then, a ``-I`` option for each element of ``Extension.include_dirs``,
* finally, the options provided by ``Extension.extra_compile_args``.

The linker options appear in the command line in the following order:

.. Reference: "linker_so" and CCompiler.link

* first, the options provided by environment variables and ``sysconfig`` variables,
* then, a ``-L`` option for each element of ``Extension.library_dirs``,
* then, a linker-specific option like ``-Wl,-rpath`` for each element of ``Extension.runtime_library_dirs``,
* finally, the options provided by ``Extension.extra_link_args``.

The resulting command line is then processed by the compiler and linker.
According to the GCC manual sections on `directory options`_ and
`environment variables`_, the C/C++ compiler searches for files named in
``#include <file>`` directives in the following order:

* first, in directories given by ``-I`` options (in left-to-right order),
* then, in directories given by the environment variable ``CPATH`` (in left-to-right order),
* then, in directories given by ``-isystem`` options (in left-to-right order),
* then, in directories given by the environment variable ``C_INCLUDE_PATH`` (for C) and ``CPLUS_INCLUDE_PATH`` (for C++),
* then, in standard system directories,
* finally, in directories given by ``-idirafter`` options (in left-to-right order).

The linker searches for libraries in the following order:

* first, in directories given by ``-L`` options (in left-to-right order),
* then, in directories given by the environment variable ``LIBRARY_PATH`` (in left-to-right order).


Distributing Extensions compiled with Cython
============================================

When your :pypi:`Cython` extension modules *are declared using the*
:class:`setuptools.Extension` *class*, ``setuptools`` will detect at build time
whether Cython is installed or not.

If Cython is present, then ``setuptools`` will use it to build the ``.pyx`` files.
Otherwise, ``setuptools`` will try to find and compile the equivalent ``.c`` files
(instead of ``.pyx``). These files can be generated using the
`cython command line tool`_.

You can ensure that Cython is always automatically installed into the build
environment by including it as a :ref:`build dependency <build-requires>` in
your ``pyproject.toml``:

.. code-block:: toml

    [build-system]
    requires = [
        # ...,
        "cython",
    ]

Alternatively, you can include the ``.c`` code that is pre-compiled by Cython
into your source distribution, alongside the original ``.pyx`` files (this
might save a few seconds when building from an ``sdist``).
To improve version compatibility, you probably also want to include current
``.c`` files in your :wiki:`revision control system`, and rebuild them whenever
you check changes in for the ``.pyx`` source files.
This will ensure that people tracking your project will be able to build it
without installing Cython, and that there will be no variation due to small
differences in the generate C files.
Please checkout our docs on :ref:`controlling files in the distribution` for
more information.

----

Extension API Reference
=======================

.. autoclass:: setuptools.Extension


.. _Python docs about C/C++ extensions: https://docs.python.org/3/extending/extending.html
.. _Cython: https://cython.readthedocs.io/en/stable/index.html
.. _directory options: https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html
.. _environment variables: https://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html
.. _cython command line tool: https://cython.readthedocs.io/en/stable/src/userguide/source_files_and_compilation.html
PK�![���ee5doc/alt-python313-setuptools/docs/userguide/index.rstnu�[���==================================================
Building and Distributing Packages with Setuptools
==================================================

The first step towards sharing a Python library or program is to build a
distribution package [#package-overload]_. This includes adding a set of
additional files containing metadata and configuration to not only instruct
``setuptools`` on how the distribution should be built but also
to help installer (such as :pypi:`pip`) during the installation process.

This document contains information to help Python developers through this
process. Please check the :doc:`/userguide/quickstart` for an overview of
the workflow.

Also note that ``setuptools`` is what is known in the community as :pep:`build
backend <517#terminology-and-goals>`, user facing interfaces are provided by tools
such as :pypi:`pip` and :pypi:`build`. To use ``setuptools``, one must
explicitly create a ``pyproject.toml`` file as described :doc:`/build_meta`.


Contents
========

.. toctree::
    :maxdepth: 1

    quickstart
    package_discovery
    dependency_management
    development_mode
    entry_point
    datafiles
    ext_modules
    distribution
    miscellaneous
    extension
    declarative_config
    pyproject_config

---

.. rubric:: Notes

.. [#package-overload]
   A :term:`Distribution Package` is also referred in the Python community simply as "package"
   Unfortunately, this jargon might be a bit confusing for new users because the term package
   can also to refer any :term:`directory <package>` (or sub directory) used to organize
   :term:`modules <module>` and auxiliary files.
PK�![��"Fa%a%=doc/alt-python313-setuptools/docs/userguide/miscellaneous.rstnu�[���.. _Controlling files in the distribution:

Controlling files in the distribution
=====================================

For the most common use cases, ``setuptools`` will automatically find out which
files are necessary for distributing the package. More precisely, the following
files are included in a source distribution by default:

- :term:`pure Python module <Pure Module>` files implied by the ``py-modules`` and ``packages``
  configuration parameters in ``pyproject.toml`` and/or equivalent
  in ``setup.cfg``/``setup.py``;
- C source files mentioned in the ``ext_modules`` or ``libraries``
  ``setup()`` arguments;
- Files that match the following glob patterns: ``tests/test*.py``,
  ``test/test*.py``;
- Scripts specified by the ``scripts-files`` configuration parameter
  in ``pyproject.toml`` or ``scripts`` in ``setup.py``/``setup.cfg``;
- All files specified by the ``package-data`` and ``data-files``
  configuration parameters in ``pyproject.toml`` and/or equivalent
  in ``setup.cfg``/``setup.py``;
- The file specified by the ``license_file`` option in ``setup.cfg``;
- All files specified by the ``license-files`` configuration parameter
  in ``pyproject.toml`` and/or equivalent in ``setup.cfg``/``setup.py``;
  note that if you don't explicitly set this parameter, ``setuptools``
  will include any files that match the following glob patterns:
  ``LICENSE*``, ``LICENCE*``, ``COPYING*``, ``NOTICE*``, ``AUTHORS**``;
- ``pyproject.toml``;
- ``setup.cfg``;
- ``setup.py``;
- ``README``, ``README.txt``, ``README.rst`` or ``README.md``;
- ``MANIFEST.in``

Please note that the list above is guaranteed to work with the last stable version
of ``setuptools``. The behavior of older versions might differ.

.. note::
   .. versionadded:: v68.3.0
      ``setuptools`` will attempt to include type information files
      by default in the distribution
      (``.pyi`` and ``py.typed``, as specified in :pep:`561`).

    *Please note however that this feature is* **EXPERIMENTAL** *and may change in
    the future.*

    If you have ``.pyi`` and ``py.typed`` files in your project, but do not
    wish to distribute them, you can opt out by setting
    :doc:`exclude-package-data </userguide/datafiles>` to remove them.

However, when building more complex packages (e.g. packages that include
non-Python files, or that need to use custom C headers), you might find that
not all files present in your project folder are included in package
:term:`distribution archive <Distribution Package>`.

If you are using a :wiki:`Revision Control System`, such as git_ or mercurial_,
and your source distributions only need to include files that you're
tracking in revision control, you can use a ``setuptools`` :ref:`plugin <Adding
Support for Revision Control Systems>`, such as :pypi:`setuptools-scm` or
:pypi:`setuptools-svn` to automatically include all tracked files into the ``sdist``.

.. _Using MANIFEST.in:

Alternatively, if you need finer control over the files (e.g. you don't want to
distribute :wiki:`CI/CD`-related files) or you need automatically generated files,
you can add a ``MANIFEST.in`` file at the root of your project,
to specify any files that the default file location algorithm doesn't catch.

This file contains instructions that tell ``setuptools`` which files exactly
should be part of the ``sdist`` (or not).

.. attention::
   Please note that ``setuptools`` supports the ``MANIFEST.in``,
   and not ``MANIFEST`` (no extension). Any documentation, tutorial or example
   that recommends using ``MANIFEST`` (no extension) is likely outdated.

.. tip::
   The ``MANIFEST.in`` file contains commands that allow you to discover and
   manipulate lists of files. There are many commands that can be used with
   different objectives, but you should try to not make your ``MANIFEST.in``
   file too fine grained.

   A good idea is to start with a ``graft`` command (to add all
   files inside a set of directories) and then fine tune the file selection
   by removing the excess or adding isolated files.


A :file:`MANIFEST.in` file consists of commands, one per line, instructing
setuptools to add or remove some set of files from the sdist.  The commands
are:

=========================================================  ==================================================================================================
Command                                                    Description
=========================================================  ==================================================================================================
:samp:`include {pat1} {pat2} ...`                          Add all files matching any of the listed patterns
                                                           (Files must be given as paths relative to the root of the project)
:samp:`exclude {pat1} {pat2} ...`                          Remove all files matching any of the listed patterns
                                                           (Files must be given as paths relative to the root of the project)
:samp:`recursive-include {dir-pattern} {pat1} {pat2} ...`  Add all files under directories matching ``dir-pattern`` that match any of the listed patterns
:samp:`recursive-exclude {dir-pattern} {pat1} {pat2} ...`  Remove all files under directories matching ``dir-pattern`` that match any of the listed patterns
:samp:`global-include {pat1} {pat2} ...`                   Add all files anywhere in the source tree matching any of the listed patterns
:samp:`global-exclude {pat1} {pat2} ...`                   Remove all files anywhere in the source tree matching any of the listed patterns
:samp:`graft {dir-pattern}`                                Add all files under directories matching ``dir-pattern``
:samp:`prune {dir-pattern}`                                Remove all files under directories matching ``dir-pattern``
=========================================================  ==================================================================================================

The patterns here are glob-style patterns: ``*`` matches zero or more regular
filename characters (on Unix, everything except forward slash; on Windows,
everything except backslash and colon); ``?`` matches a single regular filename
character, and ``[chars]`` matches any one of the characters between the square
brackets (which may contain character ranges, e.g., ``[a-z]`` or
``[a-fA-F0-9]``).  Setuptools also has support for ``**`` matching
zero or more characters including forward slash, backslash, and colon.

Directory patterns are relative to the root of the project directory; e.g.,
``graft example*`` will include a directory named :file:`examples` in the
project root but will not include :file:`docs/examples/`.

File & directory names in :file:`MANIFEST.in` should be ``/``-separated;
setuptools will automatically convert the slashes to the local platform's
appropriate directory separator.

Commands are processed in the order they appear in the :file:`MANIFEST.in`
file.  For example, given the commands:

.. code-block:: bash

    graft tests
    global-exclude *.py[cod]

the contents of the directory tree :file:`tests` will first be added to the
sdist, and then after that all files in the sdist with a ``.pyc``, ``.pyo``, or
``.pyd`` extension will be removed from the sdist.  If the commands were in the
opposite order, then ``*.pyc`` files etc. would be only be removed from what
was already in the sdist before adding :file:`tests`, and if :file:`tests`
happened to contain any ``*.pyc`` files, they would end up included in the
sdist because the exclusion happened before they were included.

An example of ``MANIFEST.in`` for a simple project that organized according to a
:ref:`src-layout` is:

.. code-block:: bash

   # MANIFEST.in -- just for illustration
   graft src
   graft tests
   graft docs
   # `-> adds all files inside a directory

   include tox.ini
   # `-> matches file paths relative to the root of the project

   global-exclude *~ *.py[cod] *.so
   # `-> matches file names (regardless of directory)

Once the correct files are present in the ``sdist``, they can then be used by
binary extensions during the build process, or included in the final
:term:`wheel <Wheel>` [#build-process]_ if you configure ``setuptools`` with
``include_package_data=True``.

.. important::
   Please note that, when using ``include_package_data=True``, only files **inside
   the package directory** are included in the final ``wheel``, by default.

   So for example, if you create a :term:`Python project <Project>` that uses
   :pypi:`setuptools-scm` and have a ``tests`` directory outside of the package
   folder, the ``tests`` directory will be present in the ``sdist`` but not in the
   ``wheel`` [#wheel-vs-sdist]_.

   See :doc:`/userguide/datafiles` for more information.

----

.. [#build-process]
   You can think about the build process as two stages: first the ``sdist``
   will be created and then the ``wheel`` will be produced from that ``sdist``.

.. [#wheel-vs-sdist]
   This happens because the ``sdist`` can contain files that are useful during
   development or the build process itself, but not in runtime (e.g. tests,
   docs, examples, etc...).
   The ``wheel``, on the other hand, is a file format that has been optimized
   and is ready to be unpacked into a running installation of Python or
   :term:`Virtual Environment`.
   Therefore it only contains items that are required during runtime.

.. _git: https://git-scm.com
.. _mercurial: https://www.mercurial-scm.org
PK�![�=��I-I-Edoc/alt-python313-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.

Each dependency, regardless of type, needs to be specified according to :pep:`508`
and :pep:`440`.
This allows adding version :pep:`range restrictions <440#version-specifiers>`
and :ref:`environment markers <environment-markers>`.


.. _build-requires:

Build system requirement
========================

After organizing all the scripts and files and getting ready for packaging,
there needs to be a way to specify what programs and libraries are actually needed
do the packaging (in our case, ``setuptools`` of course).
This needs to be specified in your ``pyproject.toml`` file
(if you have forgot what this is, go to :doc:`/userguide/quickstart` or :doc:`/build_meta`):

.. code-block:: toml

    [build-system]
    requires = ["setuptools"]
    #...

Please note that you should also include here any other ``setuptools`` plugin
(e.g., :pypi:`setuptools-scm`, :pypi:`setuptools-golang`, :pypi:`setuptools-rust`)
or build-time dependency (e.g., :pypi:`Cython`, :pypi:`cppy`, :pypi:`pybind11`).

.. note::
    In previous versions of ``setuptools``,
    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`` supports automatically downloading and installing
these dependencies when the package is installed. Although there is more
finesse to it, let's start with a simple example.

.. tab:: pyproject.toml

    .. code-block:: toml

        [project]
        # ...
        dependencies = [
            "docutils",
            "BazSpam == 1.1",
        ]
        # ...

.. 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 :pypi:`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.


.. _environment-markers:

Platform specific dependencies
------------------------------
Setuptools offers 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:: pyproject.toml

    .. code-block:: toml

        [project]
        # ...
        dependencies = [
            "enum34; python_version<'3.4'",
        ]
        # ...

.. 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:: pyproject.toml

    .. code-block:: toml

        [project]
        # ...
        dependencies = [
            "enum34; python_version<'3.4'",
            "pywin32 >= 1.0; platform_system=='Windows'",
        ]
        # ...

.. 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`.

.. seealso::
   Alternatively, a :ref:`backend wrapper <backend-wrapper>` can be used for
   specific use cases where environment markers aren't sufficient.


Direct URL dependencies
-----------------------

.. attention::
   `PyPI`_ and other standards-conformant package indices **do not** accept
   packages that declare dependencies using direct URLs. ``pip`` will accept them
   when installing packages from the local filesystem or from another URL,
   however.

Dependencies that are not available on a package index but can be downloaded
elsewhere in the form of a source repository or archive may be specified
using a variant of :pep:`PEP 440's direct references <440#direct-references>`:

.. tab:: pyproject.toml

    .. code-block:: toml

        [project]
        # ...
        dependencies = [
            "Package-A @ git+https://example.net/package-a.git@main",
            "Package-B @ https://example.net/archives/package-b.whl",
        ]

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        #...
        install_requires =
            Package-A @ git+https://example.net/package-a.git@main
            Package-B @ https://example.net/archives/package-b.whl

.. tab:: setup.py

    .. code-block:: python

        setup(
            install_requires=[
               "Package-A @ git+https://example.net/package-a.git@main",
               "Package-B @ https://example.net/archives/package-b.whl",
            ],
            ...,
        )

For source repository URLs, a list of supported protocols and VCS-specific
features such as selecting certain branches or tags can be found in pip's
documentation on `VCS support <https://pip.pypa.io/en/latest/topics/vcs-support/>`_.
Supported formats for archive URLs are sdists and wheels.


Optional dependencies
=====================
Setuptools allows you to declare dependencies that are not installed by default.
This effectively means that you can create a "variant" of your package with a
set of extra functionalities.

For example, let's consider a ``Package-A`` that offers
optional PDF support and requires two other dependencies for it to work:

.. tab:: pyproject.toml

    .. code-block:: toml

        [project]
        name = "Package-A"
        # ...
        [project.optional-dependencies]
        PDF = ["ReportLab>=1.2", "RXP"]

.. 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="Package-A",
            ...,
            extras_require={
                "PDF": ["ReportLab>=1.2", "RXP"],
            },
        )

.. sidebar::

   .. tip::
      It is also convenient to declare optional requirements for
      ancillary tasks such as running tests and or building docs.

The name ``PDF`` is an arbitrary :pep:`identifier <685>` of such a list of dependencies, to
which other components can refer and have them installed.

A use case for this approach is that other package can use this "extra" for their
own dependencies. For example, if ``Package-B`` needs ``Package-A`` with PDF support
installed, it might declare the dependency like this:

.. tab:: pyproject.toml

    .. code-block:: toml

        [project]
        name = "Package-B"
        # ...
        dependencies = [
            "Package-A[PDF]"
        ]

.. tab:: setup.cfg

    .. code-block:: ini

        [metadata]
        name = Package-B
        #...

        [options]
        #...
        install_requires =
            Package-A[PDF]

.. tab:: setup.py

    .. code-block:: python

        setup(
            name="Package-B",
            install_requires=["Package-A[PDF]"],
            ...,
        )

This will cause ``ReportLab`` to be installed along with ``Package-A``, if ``Package-B`` is
installed -- even if ``Package-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 ``Package-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, ``Package-B``'s setup information does
not need to change, but the right packages will still be installed if needed.

.. tip::
    Best practice: if a project ends up no longer 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).

.. warning::
    Historically ``setuptools`` also used to support extra dependencies in console
    scripts, for example:

    .. tab:: setup.cfg

        .. code-block:: ini

            [metadata]
            name = Package-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="Package-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).

    **However**, ``pip`` and other tools might not support this use case for extra
    dependencies, therefore this practice is considered **deprecated**.
    See :doc:`PyPUG:specifications/entry-points`.


Python requirement
==================
In some cases, you might need to specify the minimum required python version.
This can be configured as shown in the example below.

.. tab:: pyproject.toml

    .. code-block:: toml

        [project]
        name = "Package-B"
        requires-python = ">=3.6"
        # ...

.. tab:: setup.cfg

    .. code-block:: ini

        [metadata]
        name = Package-B
        #...

        [options]
        #...
        python_requires = >=3.6

.. tab:: setup.py

    .. code-block:: python

        setup(
            name="Package-B",
            python_requires=">=3.6",
            ...,
        )


.. _PyPI: https://pypi.org
PK�![c�g���-doc/alt-python313-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�![�ye?`p`p3doc/alt-python313-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.

.. attention::
   Use of ``pkg_resources`` is deprecated in favor of
   :mod:`importlib.resources`, :mod:`importlib.metadata`
   and their backports (:pypi:`importlib_resources`, :pypi:`importlib_metadata`).
   Some useful APIs are also provided by :pypi:`packaging` (e.g. requirements
   and version parsing).
   Users should refrain from new usage of ``pkg_resources`` and
   should work to port to importlib-based solutions.


--------
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: https://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 ``bytes``.  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�![f4&�g#g#)doc/alt-python313-setuptools/docs/conf.pynu�[���extensions = [
    'sphinx.ext.autodoc',
    'jaraco.packaging.sphinx',
]

master_doc = "index"
html_theme = "furo"

# Link dates and other references in the changelog
extensions += ['rst.linker']
link_files = {
    '../NEWS.rst': dict(
        using=dict(
            BB='https://bitbucket.org',
            GH='https://github.com',
        ),
        replace=[
            dict(
                pattern=r'(Issue #|\B#)(?P<issue>\d+)',
                url='{package_url}/issues/{issue}',
            ),
            dict(
                pattern=r'(?m:^((?P<scm_version>v?\d+(\.\d+){1,2}))\n[-=]+\n)',
                with_scm='{text}\n{rev[timestamp]:%d %b %Y}\n',
            ),
            dict(
                pattern=r'PEP[- ](?P<pep_number>\d+)',
                url='https://peps.python.org/pep-{pep_number:0>4}/',
            ),
            dict(
                pattern=r'(?<!\w)PR #(?P<pull>\d+)',
                url='{package_url}/pull/{pull}',
            ),
            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='https://bugs.python.org/setuptools/issue{old_setuptools}',
            ),
            dict(
                pattern=r'Jython #(?P<jython>\d+)',
                url='https://bugs.jython.org/issue{jython}',
            ),
            dict(
                pattern=r'(Python #|bpo-)(?P<python>\d+)',
                url='https://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'setuptools_svn #(?P<setuptools_svn>\d+)',
                url='{GH}/jaraco/setuptools_svn/issues/{setuptools_svn}',
            ),
            dict(
                pattern=r'pypa/(?P<issue_repo>[\-\.\w]+)#(?P<issue_number>\d+)',
                url='{GH}/pypa/{issue_repo}/issues/{issue_number}',
            ),
            dict(
                pattern=r'pypa/(?P<commit_repo>[\-\.\w]+)@(?P<commit_number>[\da-f]+)',
                url='{GH}/pypa/{commit_repo}/commit/{commit_number}',
            ),
        ],
    ),
}

# Be strict about any broken references
nitpicky = True

# Include Python intersphinx mapping to prevent failures
# jaraco/skeleton#51
extensions += ['sphinx.ext.intersphinx']
intersphinx_mapping = {
    'python': ('https://docs.python.org/3', None),
}

# Preserve authored syntax for defaults
autodoc_preserve_defaults = True

intersphinx_mapping.update(
    {
        'pip': ('https://pip.pypa.io/en/latest', None),
        'build': ('https://pypa-build.readthedocs.io/en/latest', None),
        'PyPUG': ('https://packaging.python.org/en/latest/', None),
        'packaging': ('https://packaging.pypa.io/en/latest/', None),
        'twine': ('https://twine.readthedocs.io/en/stable/', None),
        'importlib-resources': (
            'https://importlib-resources.readthedocs.io/en/latest',
            None,
        ),
    }
)

# Add support for linking usernames
github_url = 'https://github.com'
github_repo_org = 'pypa'
github_repo_name = 'setuptools'
github_repo_slug = f'{github_repo_org}/{github_repo_name}'
github_repo_url = f'{github_url}/{github_repo_slug}'
github_sponsors_url = f'{github_url}/sponsors'
extlinks = {
    'user': (f'{github_sponsors_url}/%s', '@%s'),  # noqa: WPS323
    'pypi': ('https://pypi.org/project/%s', '%s'),  # noqa: WPS323
    'wiki': ('https://wikipedia.org/wiki/%s', '%s'),  # noqa: WPS323
}
extensions += ['sphinx.ext.extlinks']

# Ref: https://github.com/python-attrs/attrs/pull/571/files\
#      #diff-85987f48f1258d9ee486e3191495582dR82
default_role = 'any'

# HTML theme
html_theme = 'furo'
html_logo = "images/logo.svg"

html_theme_options = {
    "sidebar_hide_name": True,
    "light_css_variables": {
        "color-brand-primary": "#336790",  # "blue"
        "color-brand-content": "#336790",
    },
    "dark_css_variables": {
        "color-brand-primary": "#E5B62F",  # "yellow"
        "color-brand-content": "#E5B62F",
    },
}

# Redirect old docs so links and references in the ecosystem don't break
extensions += ['sphinx_reredirects']
redirects = {
    "userguide/keywords": "/deprecated/changed_keywords.html",
    "userguide/commands": "/deprecated/commands.html",
}

# 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
    ('envvar', 'DIST_EXTRA_CONFIG'),  # 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:exc', 'setuptools.errors.PlatformError'),  # sphinx cannot find it
    ('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),
    python=('https://docs.python.org/3.11/', None),
    # ^-- Python 3.11 is required because it still contains `distutils`.
    #     Just leaving it as `3` would imply 3.12+, but that causes an
    #     error with the cross references to distutils functions.
    #     Inventory cache may cause errors, deleting it solves the problem.
)

# 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
# sphinx-contrib/sphinxcontrib-towncrier#81
towncrier_draft_config_path = 'towncrier.toml'

extensions += ['jaraco.tidelift']

# Add icons (aka "favicons") to documentation
extensions += ['sphinx_favicon']
html_static_path = ['images']  # should contain the folder with icons

# Add support for nice Not Found 404 pages
extensions += ['notfound.extension']

# List of dicts with <link> HTML attributes
# static-file points to files in the html_static_path (href is computed)
favicons = [
    {  # "Catch-all" goes first, otherwise some browsers will overwrite
        "rel": "icon",
        "type": "image/svg+xml",
        "static-file": "logo-symbol-only.svg",
        "sizes": "any",
    },
    {  # Version with thicker strokes for better visibility at smaller sizes
        "rel": "icon",
        "type": "image/svg+xml",
        "static-file": "favicon.svg",
        "sizes": "16x16 24x24 32x32 48x48",
    },
    # rel="apple-touch-icon" does not support SVG yet
]
PK�![J�ٞMM9doc/alt-python313-setuptools/docs/references/keywords.rstnu�[���========
Keywords
========

The following are keywords ``setuptools.setup()`` accepts.
They allow configuring the build process for a Python distribution or adding
metadata via a ``setup.py`` script placed at the root of your project.
All of them are optional; you do not have to supply them unless you need the
associated ``setuptools`` feature.

Metadata and configuration supplied via ``setup()`` is complementary to (and
may be overwritten by) the information present in ``setup.cfg`` and ``pyproject.toml``.
Some important metadata, such as ``name`` and ``version``, may assume
a default *degenerate* value if not specified.

Users are strongly encouraged to use a declarative config either via
:doc:`setup.cfg </userguide/declarative_config>` or :doc:`pyproject.toml
</userguide/pyproject_config>` and only rely on ``setup.py`` if they need to
tap into special behaviour that requires scripting (such as building C
extensions).

.. note::
   When using declarative configs via ``pyproject.toml``
   with ``setuptools<64.0.0``, users can still keep a very simple ``setup.py``
   just to ensure editable installs are supported, for example::

       from setuptools import setup

       setup()

   Versions of ``setuptools`` ``>=64.0.0`` do not require this extra minimal
   ``setup.py`` file.

.. _keyword/name:

``name``
    A string specifying the name of the package.

.. _keyword/version:

``version``
    A string specifying the version number of the package.

.. _keyword/description:

``description``
    A string describing the package in a single line.

.. _keyword/long_description:

``long_description``
    A string providing a longer description of the package.

.. _keyword/long_description_content_type:

``long_description_content_type``
    A string specifying the content type is used for the ``long_description``
    (e.g. ``text/markdown``)

.. _keyword/author:

``author``
    A string specifying the author of the package.

.. _keyword/author_email:

``author_email``
    A string specifying the email address of the package author.

.. _keyword/maintainer:

``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``.

.. _keyword/maintainer_email:

``maintainer_email``
    A string specifying the email address of the current maintainer, if
    different from the author.

.. _keyword/url:

``url``
    A string specifying the URL for the package homepage.

.. _keyword/download_url:

``download_url``
    A string specifying the URL to download the package.

.. _keyword/packages:

``packages``
    A list of strings specifying the packages that setuptools will manipulate.

.. _keyword/py_modules:

``py_modules``
    A list of strings specifying the modules that setuptools will manipulate.

.. _keyword/scripts:

``scripts``
    A list of strings specifying the standalone script files to be built and
    installed.

.. _keyword/ext_package:

``ext_package``
    A string specifying the base package name for the extensions provided by
    this package.

.. _keyword/ext_modules:

``ext_modules``
    A list of instances of ``setuptools.Extension`` providing the list of
    Python extensions to be built.

.. _keyword/classifiers:

``classifiers``
    A list of strings describing the categories for the package.

.. _keyword/distclass:

``distclass``
    A subclass of ``Distribution`` to use.

.. _keyword/script_name:

``script_name``
    A string specifying the name of the setup.py script -- defaults to
    ``sys.argv[0]``

.. _keyword/script_args:

``script_args``
    A list of strings defining the arguments to supply to the setup script.

.. _keyword/options:

``options``
    A dictionary providing the default options for the setup script.

.. _keyword/license:

``license``
    A string specifying the license of the package.

.. _keyword/license_file:

``license_file``
    .. warning::
        ``license_file`` is deprecated. Use ``license_files`` instead.

.. _keyword/license_files:

``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*``.

.. _keyword/keywords:

``keywords``
    A list of strings or a comma-separated string providing descriptive
    meta-data. See: :ref:`Core Metadata Specifications<core-metadata-keywords>`.

.. _keyword/platforms:

``platforms``
    A list of strings or comma-separated string.

.. _keyword/cmdclass:

``cmdclass``
    A dictionary providing a mapping of command names to ``Command``
    subclasses.

.. _keyword/data_files:

``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.

.. _keyword/package_dir:

``package_dir``
    A dictionary that maps package names (as they will be
    imported by the end-users) into directory paths (that actually exist in the
    project's source tree). This configuration has two main purposes:

    1. To effectively "rename" paths when building your package.
       For example, ``package_dir={"mypkg": "dir1/dir2/code_for_mypkg"}``
       will instruct setuptools to copy the ``dir1/dir2/code_for_mypkg/...`` files
       as ``mypkg/...`` when building the final :term:`wheel distribution <Wheel>`.

       .. attention::
          While it is *possible* to specify arbitrary mappings, developers are
          **STRONGLY ADVISED AGAINST** that. They should try as much as possible
          to keep the directory names and hierarchy identical to the way they will
          appear in the final wheel, only deviating when absolutely necessary.

    2. To indicate that the relevant code is entirely contained inside
       a specific directory (instead of directly placed under the project's root).
       In this case, a special key is required (the empty string, ``""``),
       for example: ``package_dir={"": "<name of the container directory>"}``.
       All the directories inside the container directory will be copied
       directly into the final :term:`wheel distribution <Wheel>`, but the
       container directory itself will not.

       This practice is very common in the community to help separate the
       package implementation from auxiliary files (e.g. CI configuration files),
       and is referred to as :ref:`src-layout`, because the container
       directory is commonly named ``src``.

    All paths in ``package_dir`` must be relative to the project root directory
    and use a forward slash (``/``) as path separator regardless of the
    operating system.

    .. tip::
       When using :doc:`package discovery </userguide/package_discovery>`
       together with :doc:`setup.cfg </userguide/declarative_config>` or
       :doc:`pyproject.toml </userguide/pyproject_config>`, it is very likely
       that you don't need to specify a value for ``package_dir``.  Please have
       a look at the definitions of :ref:`src-layout` and :ref:`flat-layout` to
       learn common practices on how to design a project's directory structure
       and minimise the amount of configuration that is needed.

.. _keyword/requires:

``requires``
   .. warning::
      ``requires`` is superseded by ``install_requires`` and should not be used
      anymore.

.. _keyword/obsoletes:

``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.

.. _keyword/provides:

``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"``).

.. _keyword/include_package_data:

``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`.

.. _keyword/exclude_package_data:

``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`.

.. _keyword/package_data:

``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.)

.. _keyword/zip_safe:

``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.

.. _keyword/install_requires:

``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.

.. _keyword/entry_points:

``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>`.

.. _keyword/extras_require:

``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.

.. _keyword/python_requires:

``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.

.. _keyword/setup_requires:

``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 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``.)

.. _keyword/dependency_links:

``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 during install by tools that support them.

.. _keyword/namespace_packages:

``namespace_packages``
    .. warning::
        The ``namespace_packages`` implementation relies on ``pkg_resources``.
        However, ``pkg_resources`` has some undesirable behaviours, and
        Setuptools intends to obviate its usage in the future. Therefore,
        ``namespace_packages`` was deprecated in favor of native/implicit
        namespaces (:pep:`420`). Check :doc:`the Python Packaging User Guide
        <PyPUG:guides/packaging-namespace-packages>` for more information.

    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.

.. _keyword/test_suite:

``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.

    .. warning::
       .. deprecated:: 41.5.0
          The test command will be removed in a future version of ``setuptools``,
          alongside any test configuration parameter.

.. _keyword/tests_require:

``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.
    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.

    .. warning::
       .. deprecated:: 41.5.0
          The test command will be removed in a future version of ``setuptools``,
          alongside any test configuration parameter.

.. _test_loader:

.. _keyword/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.

    .. warning::
       .. deprecated:: 41.5.0
          The test command will be removed in a future version of ``setuptools``,
          alongside any test configuration parameter.

.. _keyword/eager_resources:

``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`.

.. _keyword/project_urls:

``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�![V�UZ660doc/alt-python313-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 :ref:`MANIFEST.in <Using MANIFEST.in>` file,
  and without having to force regeneration of the ``MANIFEST`` file when your
  source tree changes [#manifest]_.

* 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",
      ]
      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.











Forum and Bug Tracker
=====================

Please use `GitHub Discussions`_ for questions and discussion about
setuptools, and the `setuptools bug tracker`_ ONLY for issues you have
confirmed via the forum are actual bugs, and which you have reduced to a minimal
set of steps to reproduce.

.. _GitHub Discussions: https://github.com/pypa/setuptools/discussions
.. _setuptools bug tracker: https://github.com/pypa/setuptools/


----


.. [#manifest] The default behaviour for ``setuptools`` will work well for pure
   Python packages, or packages with simple C extensions (that don't require
   any special C header). See :ref:`Controlling files in the distribution` and
   :doc:`userguide/datafiles` for more information about complex scenarios, if
   you want to include other types of files.
PK�![{8��mm-doc/alt-python313-setuptools/docs/history.rstnu�[���:tocdepth: 2

.. _changes:

History
*******

.. towncrier-draft-entries:: DRAFT, unreleased as on |today|

.. include:: ../NEWS (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�![��jKYY+doc/alt-python313-setuptools/docs/index.rstnu�[���.. image:: images/banner-640x320.svg
   :align: center

Documentation
=============

Setuptools is a fully-featured, actively-maintained, and stable library
designed to facilitate packaging Python projects.

It helps developers to easily share reusable code (in the form of a library)
and programs (e.g., CLI/GUI tools implemented in Python), that can be installed
with :pypi:`pip` and uploaded to `PyPI <https://pypi.org>`_.

.. sidebar-links::
   :home:
   :pypi:

.. toctree::
   :maxdepth: 1
   :hidden:

   User guide <userguide/index>
   build_meta
   pkg_resources
   references/keywords
   setuptools

.. toctree::
   :caption: Project
   :maxdepth: 1
   :hidden:

   roadmap
   Development guide <development/index>
   Backward compatibility & deprecated practice <deprecated/index>
   Changelog <history>
   artwork

.. tidelift-referral-banner::
PK�![�vM��s�s9doc/alt-python313-setuptools/docs/deprecated/commands.rstnu�[���===============================
Running ``setuptools`` commands
===============================

Historically, ``setuptools`` allowed running commands via a ``setup.py`` script
at the root of a Python project, as indicated in the examples below::

    python setup.py --help
    python setup.py --help-commands
    python setup.py --version
    python setup.py sdist
    python setup.py bdist_wheel

You could also run commands in other circumstances:

* ``setuptools`` projects without ``setup.py`` (e.g., ``setup.cfg``-only)::

   python -c "from setuptools import setup; setup()" --help

* ``distutils`` projects (with a ``setup.py`` importing ``distutils``)::

   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.

.. warning::
   While it is perfectly fine that users write ``setup.py`` files to configure
   a package build (e.g. to specify binary extensions or customize commands),
   on recent versions of ``setuptools``, running ``python setup.py`` directly
   as a script is considered **deprecated**. This also means that users should
   avoid running commands directly via ``python setup.py <command>``.

   If you want to create :term:`sdist <Source Distribution (or "sdist")>` or :term:`wheel`
   distributions the recommendation is to use the command line tool provided by :pypi:`build`::

       pip install build  # needs to be installed first

       python -m build  # builds both sdist and wheel
       python -m build --sdist
       python -m build --wheel

   Build will automatically download ``setuptools`` and build the package in an
   isolated environment. You can also specify specific versions of
   ``setuptools``, by setting the :doc:`build requirements in pyproject.toml
   </build_meta>`.

   If you want to install a package, you can use :pypi:`pip` or :pypi:`installer`::

      pip install /path/to/wheel/file.whl
      pip install /path/to/sdist/file.tar.gz
      pip install .  # replacement for python setup.py install
      pip install --editable .  # replacement for python setup.py develop

      pip install installer  # needs to be installed first
      python -m installer /path/to/wheel/file.whl

-----------------
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�![�9���Ddoc/alt-python313-setuptools/docs/deprecated/resource_extraction.rstnu�[���.. _Automatic Resource Extraction:

Automatic Resource Extraction
=============================

In a modern setup, Python packages are usually installed as directories,
and all the files can be found on deterministic locations on the disk.
This means that most of the tools expect package resources to be "real" files.

There are a few occasions however that packages are loaded in a different way
(e.g., from a zip file), which is incompatible with the assumptions mentioned above.
Moreover, a package developer may also include non-extension native libraries or other files that
C extensions may expect to be able to access.

In these scenarios, the use of :mod:`importlib.resources` is recommended.

Old implementations (prior to the advent of :mod:`importlib.resources`) and
long-living projects, however, may still rely on the library ``pkg_resources``
to access these files.

If you have to support such systems, or want to provide backward compatibility
for ``pkg_resources``, you may need to add an special configuration
to ``setuptools`` when packaging a project.
This can be done by listing as ``eager_resources`` (argument to ``setup()``
in ``setup.py`` or field in ``setup.cfg``) all the files that need to 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``/``setuptools``-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.
PK�![�$�AA9doc/alt-python313-setuptools/docs/deprecated/zip_safe.rstnu�[���Understanding the ``zip_safe`` flag
===================================

The ``zip_safe`` flag is a ``setuptools`` configuration mainly associated
with the ``egg`` distribution format
(which got replaced in the ecosystem by the newer ``wheel`` format) and the
``easy_install`` command (deprecated in ``setuptools`` v58.3.0).

It is very unlikely that the values of ``zip_safe`` will affect modern
deployments that use :pypi:`pip` for installing packages.
Moreover, new users of ``setuptools`` should not attempt to create egg files
using the deprecated ``build_egg`` command.
Therefore, this flag is considered **obsolete**.

This document, however, describes what was the historical motivation behind
this flag, and how it was used.

Historical Motivation
---------------------

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.

In the past, ``setuptools`` would install a project distributed
as a zipfile or a directory (via the ``easy_install`` command or
``python setup.py install``),
the default choice being determined by the project's ``zip_safe`` flag.

How the ``zip_safe`` flag was used?
-----------------------------------

To set this flag, a developer would pass a boolean value for the ``zip_safe`` argument to the
``setup()`` function, or omit it.  When omitted, the ``bdist_egg``
command would analyze the project's contents to see if it could detect any
conditions preventing the project from working in a zipfile.

This was extremely conservative: ``bdist_egg`` would consider the
project unsafe if it contained any C extensions or datafiles whatsoever.  This
does *not* mean that the project couldn't or wouldn't work as a zipfile!  It just
means that the ``bdist_egg`` authors were not yet comfortable asserting that
the project *would* work.  If the project did not contain any C or data files, and did not
attempt to perform ``__file__`` or ``__path__`` introspection or source code manipulation, then
there was an extremely solid chance the project will work when installed as a
zipfile.  (And if the project used ``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 for more information.)

The developer could manually set ``zip_safe`` to ``True`` to perform tests,
or to override the default behaviour (after checking all the warnings and
understanding the implications), this would allow ``setuptools`` to install the
project as a zip file. Alternatively, by setting ``zip_safe`` to ``False``,
developers could force ``setuptools`` to always install the project as a
directory.

Modern ways of loading packages from zip files
----------------------------------------------

Currently, popular Python package installers (such as :pypi:`pip`) and package
indexes (such as PyPI_) consider that distribution packages are always
installed as a directory.
It is however still possible to load packages from zip files added to
:obj:`sys.path`, thanks to the :mod:`zipimport` module
and the :mod:`importlib` machinery provided by Python standard library.

When working with modules loaded from a zip file, it is important to keep in
mind that values of ``__file__`` and ``__path__`` might not work as expected.
Please check the documentation for :mod:`importlib.resources`, if file
locations are important for your use case.


.. _PyPI: https://pypi.org
PK�![9�΁�Adoc/alt-python313-setuptools/docs/deprecated/changed_keywords.rstnu�[���New and Changed ``setup()`` Keywords
====================================

This document tracks historical differences between ``setuptools`` and
``distutils``.

Since ``distutils`` was scheduled for removal from the standard library in
Python 3.12, and ``setuptools`` started its adoption, these differences became less
relevant.
Please check :doc:`/references/keywords` for a complete list of keyword
arguments that can be passed to the ``setuptools.setup()`` function and
a their full description.

.. tab:: Supported by both ``distutils`` and ``setuptoools``

    ``name`` string

    ``version`` string

    ``description`` string

    ``long_description`` string

    ``long_description_content_type`` string

    ``author`` string

    ``author_email`` string

    ``maintainer`` string

    ``maintainer_email`` string

    ``url`` string

    ``download_url`` string

    ``packages`` list

    ``py_modules`` list

    ``scripts`` list

    ``ext_package`` string

    ``ext_modules`` list

    ``classifiers`` list

    ``distclass`` Distribution subclass

    ``script_name`` string

    ``script_args`` list

    ``options`` dictionary

    ``license`` string

    ``license_file`` string **deprecated**

    ``license_files`` list

    ``keywords`` string or list

    ``platforms`` list

    ``cmdclass`` dictionary

    ``data_files`` list **deprecated**

    ``package_dir`` dictionary

    ``requires`` string or list **deprecated**

    ``obsoletes`` list **deprecated**

    ``provides`` list

.. tab:: Added or changed by ``setuptoools``

    ``include_package_data`` bool

    ``exclude_package_data`` dictionary

    ``package_data`` dictionary

    ``zip_safe`` bool

    ``install_requires`` string or list

    ``entry_points`` dictionary

    ``extras_require`` dictionary

    ``python_requires`` string

    ``setup_requires`` string or list **deprecated**

    ``dependency_links`` list **deprecated**

    ``namespace_packages`` list

    ``test_suite`` string or function **deprecated**

    ``tests_require`` string or list **deprecated**

    ``test_loader`` class **deprecated**

    ``eager_resources`` list

    ``project_urls`` dictionary
PK�![�} $v$vAdoc/alt-python313-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.pypa.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


: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.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�![f�`�((Cdoc/alt-python313-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


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�![���A��Ddoc/alt-python313-setuptools/docs/deprecated/distutils/uploading.rstnu�[���:orphan:

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

See the
`Python Packaging User Guide <https://packaging.python.org>`_
for the best guidance on uploading packages.
PK�![�{��Gdoc/alt-python313-setuptools/docs/deprecated/distutils/packageindex.rstnu�[���:orphan:

.. _package-index:

*******************************
The Python Package Index (PyPI)
*******************************

The `Python Package Index (PyPI) <https://pypi.org>`_ stores
metadata describing distributions packaged with distutils and
other publishing tools, as well the distribution archives
themselves.

The best resource for working with PyPI is the
`Python Packaging User Guide <https://packaging.python.org>`_.
PK�![�Y�
&
&Edoc/alt-python313-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�![���e�K�KDdoc/alt-python313-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`   |         |
+-------------+------------------------------+---------+

.. 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                           |
+--------------------------+-------------------------------------+

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_dumb --dumb-option=foo

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.)

.. _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.

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.
PK�![σ�744Edoc/alt-python313-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` or by pointing :envvar:`DIST_EXTRA_CONFIG`
  to another configuration file

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.


.. rubric:: Footnotes

.. [#] This ideal probably won't be achieved until auto-configuration is fully
   supported by the Distutils.
PK�![t����Ddoc/alt-python313-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�![�^I\��Edoc/alt-python313-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}}
PK�![�G3���Gdoc/alt-python313-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).

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�![@�G���@doc/alt-python313-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�![��[��Qdoc/alt-python313-setuptools/docs/deprecated/distutils/_setuptools_disclaimer.rstnu�[���.. note::

   This document is being retained solely until the ``setuptools`` documentation
   at https://setuptools.pypa.io/en/latest/setuptools.html
   independently covers all of the relevant information currently included here.
PK�![����fzfzFdoc/alt-python313-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             |        |
+----------------------+---------------------------+-----------------+--------+
| ``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)
    If maintainer is provided and author is not, distutils lists maintainer 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�![3wF++Adoc/alt-python313-setuptools/docs/deprecated/dependency_links.rstnu�[���Specifying dependencies that aren't in PyPI via ``dependency_links``
====================================================================

.. 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 if 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 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/",
            ],
        )
PK�![eO<�x�x<doc/alt-python313-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�![*t),�	�	Adoc/alt-python313-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 60.0.0 release, Setuptools includes a local, vendored copy of distutils (from late copies of CPython) that is enabled by default. To disable the use of this copy of distutils when invoking setuptools, set the environment variable:

    SETUPTOOLS_USE_DISTUTILS=stdlib

.. warning::
   Please note that this also affects how ``distutils.cfg`` files inside stdlib's ``distutils``
   package directory are processed.
   Unless ``SETUPTOOLS_USE_DISTUTILS=stdlib``, they will have no effect on the build process.

   You can still use a global user config file, ``~/.pydistutils.cfg`` (POSIX) or ``%USERPROFILE%/pydistutils.cfg`` (Windows),
   or use the environment variable :ref:`DIST_EXTRA_CONFIG <setup-config>` to point to another
   supplementary configuration file.


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`` or ``distutils.core.Command`` → ``setuptools.Command``

``distutils.command.{build_clib,build_ext,build_py,sdist}`` → ``setuptools.command.*``

``distutils.dep_util`` → ``setuptools.modified``

``distutils.log`` → :mod:`logging` (standard library)

``distutils.version.*`` → :doc:`packaging.version.* <packaging:version>`

``distutils.errors.*`` → ``setuptools.errors.*`` [#errors]_


Migration advice is also provided by :pep:`PEP 632 <632#migration-advice>`.

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.


.. [#errors] Please notice errors related to the command line usage of
   ``setup.py``, such as ``DistutilsArgError``, are intentionally not exposed
   by setuptools, since this is considered a deprecated practice.
PK�![ƖH__6doc/alt-python313-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

    changed_keywords
    dependency_links
    python_eggs
    easy_install
    zip_safe
    resource_extraction
    distutils/index
    distutils-legacy
    functionalities
    commands
PK�![V��*�*�=doc/alt-python313-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 :pypi:`setuptools` on the package index
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`.


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 :pypi:`virtualenv` documentation for more details.


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�![n��[��@doc/alt-python313-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�![SE���*doc/alt-python313-setuptools-wheel/LICENSEnu�[���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-python313-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.

If you want to enable valgrind support in Python, you will need to
configure Python --with-valgrind option or an older option
--without-pymalloc.

UPDATE: Python 3.6 now supports PYTHONMALLOC=malloc environment variable which
can be used to force the usage of the malloc() allocator of the C library.

If you don't want to read about the details of using Valgrind, there
are still two things you must do to suppress the warnings.  First,
you must use a suppressions file.  One is supplied in
Misc/valgrind-python.supp.  Second, you must uncomment the lines in 
Misc/valgrind-python.supp that suppress the warnings for PyObject_Free and
PyObject_Realloc.

If you want to use Valgrind more effectively and catch even more
memory leaks, you will need to configure python --without-pymalloc.
PyMalloc allocates a few blocks in big chunks and most object
allocations don't call malloc, they use chunks doled about by PyMalloc
from the big blocks.  This means Valgrind can't detect
many allocations (and frees), except for those that are forwarded
to the system malloc.  Note: configuring python --without-pymalloc
makes Python run much slower, especially when running under Valgrind.
You may need to run the tests in batches under Valgrind to keep
the memory usage down to allow the tests to complete.  It seems to take
about 5 times longer to run --without-pymalloc.

Apr 15, 2006:
  test_ctypes causes Valgrind 3.1.1 to fail (crash).
  test_socket_ssl should be skipped when running valgrind.
	The reason is that it purposely uses uninitialized memory.
	This causes many spurious warnings, so it's easier to just skip it.


Details:
--------
Python uses its own small-object allocation scheme on top of malloc,
called PyMalloc.

Valgrind may show some unexpected results when PyMalloc is used.
Starting with Python 2.3, PyMalloc is used by default.  You can disable
PyMalloc when configuring python by adding the --without-pymalloc option.
If you disable PyMalloc, most of the information in this document and
the supplied suppressions file will not be useful.  As discussed above,
disabling PyMalloc can catch more problems.

PyMalloc uses 256KB chunks of memory, so it can't detect anything
wrong within these blocks.  For that reason, compiling Python
--without-pymalloc usually increases the usefulness of other tools.

If you use valgrind on a default build of Python,  you will see
many errors like:

        ==6399== Use of uninitialised value of size 4
        ==6399== at 0x4A9BDE7E: PyObject_Free (obmalloc.c:711)
        ==6399== by 0x4A9B8198: dictresize (dictobject.c:477)

These are expected and not a problem.  Tim Peters explains
the situation:

        PyMalloc needs to know whether an arbitrary address is one
	that's managed by it, or is managed by the system malloc.
	The current scheme allows this to be determined in constant
	time, regardless of how many memory areas are under pymalloc's
	control.

        The memory pymalloc manages itself is in one or more "arenas",
	each a large contiguous memory area obtained from malloc.
	The base address of each arena is saved by pymalloc
	in a vector.  Each arena is carved into "pools", and a field at
	the start of each pool contains the index of that pool's arena's
	base address in that vector.

        Given an arbitrary address, pymalloc computes the pool base
	address corresponding to it, then looks at "the index" stored
	near there.  If the index read up is out of bounds for the
	vector of arena base addresses pymalloc maintains, then
	pymalloc knows for certain that this address is not under
	pymalloc's control.  Otherwise the index is in bounds, and
	pymalloc compares

            the arena base address stored at that index in the vector

        to

            the arbitrary address pymalloc is investigating

        pymalloc controls this arbitrary address if and only if it lies
        in the arena the address's pool's index claims it lies in.

        It doesn't matter whether the memory pymalloc reads up ("the
	index") is initialized.  If it's not initialized, then
	whatever trash gets read up will lead pymalloc to conclude
	(correctly) that the address isn't controlled by it, either
	because the index is out of bounds, or the index is in bounds
	but the arena it represents doesn't contain the address.

        This determination has to be made on every call to one of
	pymalloc's free/realloc entry points, so its speed is critical
	(Python allocates and frees dynamic memory at a ferocious rate
	-- everything in Python, from integers to "stack frames",
	lives in the heap).
PK�![�L$�9$9$,doc/alt-python313-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 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
}

#
# Leaks: dlopen() called without dlclose()
#

{
   dlopen() called without dlclose()
   Memcheck:Leak
   fun:malloc
   fun:malloc
   fun:strdup
   fun:_dl_load_cache_lookup
}
{
   dlopen() called without dlclose()
   Memcheck:Leak
   fun:malloc
   fun:malloc
   fun:strdup
   fun:_dl_map_object
}
{
   dlopen() called without dlclose()
   Memcheck:Leak
   fun:malloc
   fun:*
   fun:_dl_new_object
}
{
   dlopen() called without dlclose()
   Memcheck:Leak
   fun:calloc
   fun:*
   fun:_dl_new_object
}
{
   dlopen() called without dlclose()
   Memcheck:Leak
   fun:calloc
   fun:*
   fun:_dl_check_map_versions
}


#
# 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�![UvF��� doc/alt-python313-pip/README.rstnu�[���pip - The Python Package Installer
==================================

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

.. image:: https://img.shields.io/pypi/pyversions/pip
   :target: https://pypi.org/project/pip
   :alt: PyPI - Python Version

.. image:: https://readthedocs.org/projects/pip/badge/?version=latest
   :target: https://pip.pypa.io/en/latest
   :alt: Documentation

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`_

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 IRC`_

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

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

.. _package installer: https://packaging.python.org/guides/tool-recommendations/
.. _Python Package Index: https://pypi.org
.. _Installation: https://pip.pypa.io/en/stable/installation/
.. _Usage: https://pip.pypa.io/en/stable/
.. _Release notes: https://pip.pypa.io/en/stable/news.html
.. _Release process: https://pip.pypa.io/en/latest/development/release-process/
.. _GitHub page: https://github.com/pypa/pip
.. _Development documentation: https://pip.pypa.io/en/latest/development
.. _Issue tracking: https://github.com/pypa/pip/issues
.. _Discourse channel: https://discuss.python.org/c/packaging
.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa
.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev
.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
PK�![�5��8O8Oman/man1/python3.11.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 \-P
]
[
.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 \--help
]
[
.B \--help-env
]
[
.B \--help-xoptions
]
[
.B \--help-all
]
.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 "\-\-help\-env"
Prints help about Python-specific environment variables and exits.
.TP
.B "\-\-help\-xoptions"
Prints help about implementation-specific \fB\-X\fP options and exits.
.TP
.TP
.B "\-\-help\-all"
Prints complete usage information 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, \fB\-P\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. This terminates the option list (following options
are passed as arguments to the module).
.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 \-P
Don't automatically prepend a potentially unsafe path to \fBsys.path\fP such
as the current directory, the script's directory or an empty string. See also the
\fBPYTHONSAFEPATH\fP environment variable.
.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's warning machinery by default prints warning messages
to
.IR sys.stderr .

The simplest settings apply a particular action unconditionally to all warnings
emitted by a process (even those that are otherwise ignored by default):

  -Wdefault  # Warn once per call location
  -Werror    # Convert to exceptions
  -Walways   # Warn every time
  -Wmodule   # Warn once per calling module
  -Wonce     # Warn once per Python process
  -Wignore   # Never warn

The action names can be abbreviated as desired and the interpreter will resolve
them to the appropriate action name. For example,
.B -Wi
is the same as
.B -Wignore .

The full form of argument is:
.IB action:message:category:module:lineno

Empty fields match all values; trailing empty fields may be omitted. For
example
.B -W ignore::DeprecationWarning
ignores all DeprecationWarning warnings.

The
.I action
field is as explained above but only applies to warnings that match
the remaining fields.

The
.I message
field must match the whole printed warning message; this match is
case-insensitive.

The
.I category
field matches the warning category (ex: "DeprecationWarning"). 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
.I module
field matches the (fully-qualified) module name; this match is case-sensitive.

The
.I lineno
field matches the line number, where zero matches all line numbers and is thus
equivalent to an omitted line number.

Multiple
.B -W
options can 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 (though, a warning message is printed about invalid options
when the first warning is issued).

Warnings can also be controlled using the
.B PYTHONWARNINGS
environment variable and from within a Python program using the warnings
module.  For example, the warnings.filterwarnings() function can be used to use
a regular expression on the warning message.

.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 importtime: show how long each import takes. It shows module name,
        cumulative time (including nested imports) and self time (excluding
        nested imports). Note that its output may be broken in multi-threaded
        application. Typical usage is python3 -X importtime -c 'import asyncio'

    -X dev: enable CPython's "development mode", introducing additional runtime
        checks which are too expensive to be enabled by default. It will not be
        more verbose than the default if the code is correct: new warnings are
        only emitted when an issue is detected. Effect of the developer mode:
           * Add default warning filter, as -W default
           * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks()
             C function
           * Enable the faulthandler module to dump the Python traceback on a crash
           * Enable asyncio debug mode
           * Set the dev_mode attribute of sys.flags to True
           * io.IOBase destructor logs close() exceptions

    -X utf8: enable UTF-8 mode for operating system interfaces, overriding the default
        locale-aware mode. -X utf8=0 explicitly disables UTF-8 mode (even when it would
        otherwise activate automatically). See PYTHONUTF8 for more details

    -X pycache_prefix=PATH: enable writing .pyc files to a parallel tree rooted at the
        given directory instead of to the code tree.

    -X warn_default_encoding: enable opt-in EncodingWarning for 'encoding=None'

    -X no_debug_ranges: disable the inclusion of the tables mapping extra location
       information (end line, start column offset and end column offset) to every
       instruction in code objects. This is useful when smaller code objects and pyc
       files are desired as well as suppressing the extra visual location indicators
       when the interpreter displays tracebacks.

    -X frozen_modules=[on|off]: whether or not frozen modules should be used.
       The default is "on" (or "off" if you are running a local build).

    -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 PYTHONSAFEPATH
If this is set to a non-empty string, don't automatically prepend a potentially
unsafe path to \fBsys.path\fP such as the current directory, the script's
directory or an empty string. See also the \fB\-P\fP option.
.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 PYTHONPLATLIBDIR
Override sys.platlibdir.
.IP PYTHONSTARTUP
If this is the name of a readable file, the Python commands in that
file are executed before the first prompt is displayed in interactive
mode.
The file is executed in the same name space where interactive commands
are executed so that objects defined or imported in it can be used
without qualification in the interactive session.
You can also change the prompts
.I sys.ps1
and
.I sys.ps2
in this file.
.IP PYTHONOPTIMIZE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-O\fP option. If set to an integer, it is equivalent to
specifying \fB\-O\fP multiple times.
.IP PYTHONDEBUG
If this is set to a non-empty string it is equivalent to specifying
the \fB\-d\fP option. If set to an integer, it is equivalent to
specifying \fB\-d\fP multiple times.
.IP PYTHONDONTWRITEBYTECODE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-B\fP option (don't try to write
.I .pyc
files).
.IP PYTHONINSPECT
If this is set to a non-empty string it is equivalent to specifying
the \fB\-i\fP option.
.IP PYTHONIOENCODING
If this is set before running the interpreter, it overrides the encoding used
for stdin/stdout/stderr, in the syntax
.IB encodingname ":" errorhandler
The
.IB errorhandler
part is optional and has the same meaning as in str.encode. For stderr, the
.IB errorhandler
 part is ignored; the handler will always be \'backslashreplace\'.
.IP PYTHONNOUSERSITE
If this is set to a non-empty string it is equivalent to specifying the
\fB\-s\fP option (Don't add the user site directory to sys.path).
.IP PYTHONUNBUFFERED
If this is set to a non-empty string it is equivalent to specifying
the \fB\-u\fP option.
.IP PYTHONVERBOSE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-v\fP option. If set to an integer, it is equivalent to
specifying \fB\-v\fP multiple times.
.IP PYTHONWARNINGS
If this is set to a comma-separated string it is equivalent to
specifying the \fB\-W\fP option for each separate value.
.IP PYTHONHASHSEED
If this variable is set to "random", a random value is used to seed the hashes
of str and bytes objects.

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

The integer must be a decimal number in the range [0,4294967295].  Specifying
the value 0 will disable hash randomization.
.IP PYTHONINTMAXSTRDIGITS
Limit the maximum digit characters in an int value
when converting from a string and when converting an int back to a str.
A value of 0 disables the limit.  Conversions to or from bases 2, 4, 8,
16, and 32 are never limited.
.IP PYTHONMALLOC
Set the Python memory allocators and/or install debug hooks. The available
memory allocators are
.IR malloc
and
.IR pymalloc .
The available debug hooks are
.IR debug ,
.IR malloc_debug ,
and
.IR pymalloc_debug .
.IP
When Python is compiled in debug mode, the default is
.IR pymalloc_debug
and the debug hooks are automatically used. Otherwise, the default is
.IR pymalloc .
.IP PYTHONMALLOCSTATS
If set to a non-empty string, Python will print statistics of the pymalloc
memory allocator every time a new pymalloc object arena is created, and on
shutdown.
.IP
This variable is ignored if the
.RB $ PYTHONMALLOC
environment variable is used to force the
.BR malloc (3)
allocator of the C library, or if Python is configured without pymalloc support.
.IP PYTHONASYNCIODEBUG
If this environment variable is set to a non-empty string, enable the debug
mode of the asyncio module.
.IP PYTHONTRACEMALLOC
If this environment variable is set to a non-empty string, start tracing
Python memory allocations using the tracemalloc module.
.IP
The value of the variable is the maximum number of frames stored in a
traceback of a trace. For example,
.IB PYTHONTRACEMALLOC=1
stores only the most recent frame.
.IP PYTHONFAULTHANDLER
If this environment variable is set to a non-empty string,
.IR faulthandler.enable()
is called at startup: install a handler for SIGSEGV, SIGFPE, SIGABRT, SIGBUS
and SIGILL signals to dump the Python traceback.
.IP
This is equivalent to the \fB-X faulthandler\fP option.
.IP PYTHONEXECUTABLE
If this environment variable is set,
.IB sys.argv[0]
will be set to its value instead of the value got through the C runtime. Only
works on Mac OS X.
.IP PYTHONUSERBASE
Defines the user base directory, which is used to compute the path of the user
.IR site-packages
directory and Distutils installation paths for
.IR "python setup\.py install \-\-user" .
.IP PYTHONPROFILEIMPORTTIME
If this environment variable is set to a non-empty string, Python will
show how long each import takes. This is exactly equivalent to setting
\fB\-X importtime\fP on the command line.
.IP PYTHONBREAKPOINT
If this environment variable is set to 0, it disables the default debugger. It
can be set to the callable of your debugger of choice.
.SS Debug-mode variables
Setting these variables only has an effect in a debug build of Python, that is,
if Python was configured with the
\fB\--with-pydebug\fP build option.
.IP PYTHONTHREADDEBUG
If this environment variable is set, Python will print threading debug info.
The feature is deprecated in Python 3.10 and will be removed in Python 3.12.
.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�![ĩ��]r
]r
0python-wheels/setuptools-65.6.3-py3-none-any.whlnuȯ��PKk�mW�}a~�distutils-precedence.pthE��
� �~�۞B�ĭ��a�4R�Am���P��p��m/�CiWA�ػ��I���Fm�'�Bv��i�&B>b-Y<CggzLeq	9(������1$[���ny!�{jk��p�PK1xU�.�_��_distutils_hack/__init__.py�Xko�8��_A�,��G�p�v��:3A��~(
��h��,
"�Ļ��>璔D���Ŭ�6z�>x�=�^j�rU�
��JՆ�r�2�M�ek�7��'���v�J���H�T�j���8�WI2f��uq����2q*�����b�^x]&�Ԧ1���ZhQ�h��'lܽ�R�V���-�_-LS��T�
/s�|#j-U��r���Xt9e7�^x��[�P5���YSf�̥�/�u�O�:W�L+�n+�53+aw!�e�oeL���f�u�����R���{;K��Rq{1?��J�����v>�I/���Ϯ/��������E�nV��m�5+U�.gZW�ѧ����Ap��!���"��N?��
�EE�R�����Q���6mm@O��x��Ԣ*x&\|�w�����=H�=��fk�e��y��(d$Z�<�d*V|#U��%�WV�o��ɜ�v�wݳ@W����\�"CyO�(u�͚Gq���O��u���i�N�[��BA�,�2���K&�ʺ�5L�T�3���ςY{��}Ӽ���t��N|�є!tu���?���ǁ�.�ǧ+C��3D$����[�{l����c���S�b�|�f��Y�v�k�|�w��"���V}��%�/o�xz��SQ�d�@� �L-��J���Z�k0��Z��x��e%��t��Ka���ӗ���~��|y�O>|||������x�ƅ�x1v�rij�ܵ/;�����@5���?��ؽ�q�G�_����$~��,�Ț�ia>��+Q#�k*~o��x����G����9�zQ�uP�q�H�>cG���ٵ!���\G�w��ݕo5QP�݆��Ȟ=Λԧ�:�@~�BVE�B`��/�Ǵ��MA`��$��D+�$YHt�d:��C�����3��D���2��z���Ṿ;��E�]@	�Aʘ69����Q���-��&Ş�����x�w��fd/��`�r~q1�}wvޡqM�]+#7�@4ć��^K>���n���G����u�Tˍ��g�R�L�$I@/��Mōu���&N�����Ӳ�&[y�� ��.��͋�6�v�
D�d`�w��z��O4*�[^4EA6%��)1�W�~U��;�2r-�m#�����1�Ԓ0mT��-�ؠ)
c����BOn�?�XŒ�*MB�&_���|���nZwC��x��G�{�0�'�+3A�`&�iU�>�����޼���2��C�A�k�@�|���x��J��eIJE�B_w�4$��K2����qџ�r�����y�I��JM�Z]�H%��|4@��a�e����@�s��9�C�5�!O�5*�ž;haG
�T2�`��v޲�Њ*�`,��RZ�'���v 4��P	��E����\��{���׼�USX$������<k�Q��@Rנ�}c��g��"�flI�0�G<_)���`�v�
Q�&�z{���G̢��Q�A`"�rj���|7V�?��N�D��hP��{�S�v<�7�-,ϕ���R�a
�#1I�}��-m��=����s7,�a�d�C��HVR���NN�B��_�r)�;��������A�Ff�]:j9Lm���cS*4ȷ����CM�e���ct����s}eߎ.�΂����`v�r��^�q���q��ͫ��JV��*���/�~`���MI'{DӔU��&v�������r�ݹL�E�ƐI��U��؍!�v`n�X���e��p��|w)+��}�c����٦��՝ѩ9s��Y-+�����Ց���|O\�^n��w�&���F�Z��쳉M��Do��=�u�q�,�T�
��q���(}v�?Ս�P�b��7�Bӄn�KB�e����� ��V���kR`R�Z���zw�7BX�x�,�b<q�V�|�	����Z_�
�=GnDbA��1掶�!<�<��}�OQ��F����A�����k��:(C7A���2=���d)J�P��e]'�|���ό�A�E�s�����N�� �	�{37�,�/�[c���?���ߴs��~��������������q�	N�{������}��c���NMt�0/�ڟ�‘|(�
���p�lË�e���F�޶m֡J�����-�Φ{�kU�:��}�ϭ���ْs�?�{�V�k��PK1xU� ��.,_distutils_hack/override.py����-�/*���P�O�,.)-��)��HL�V��Kɏ�/K-*�LI���PK1xU���s�pkg_resources/__init__.pyԽ�zG�(��OQM���$�}�G�G-��uƺKnw��"YM�
F��?�~�H�
��Ȭ,��=����"��"o��q���Ã7�즸*�u�6��̞�yqp��98x�UmVd�檚��Z�٬�7EU����\W5�_1�q֬}�v{1���lӬw��\��e�e�K� KV~XA��?��e�l��x_"�j
_n��khז�o���d����t�=��̓�^�/��C_�70Ϊ��<o2h�m�2kڜZ4�TM�f�󲨫�v�ܰhX�EY�W0���T5�Ů`��A�a5�e[]�����_7�,p�k7�R�o�yyu�o�YQϳm���Sy��flƢ��3�jY�
;�� �G��ou>۶�f��9}�}��3X�b^�a���Y�]����&7�^��ɼ���tz�,7��<?8�:�����6��6ղ�����nU��0>�����ź��w��M��]nk��f�^�n���j�D{۬�k��KXy�{�,�����I�nՅ�].�j��nK�\�k?�rL`S~�ܮ��[�M��X�-�Yo
]�M[}�����L&(�3��Fw�Y�d�#o��A�aV�6�zt�^7kns���~���g�K贺��fgA�?Y�2$��0���P-�>^�A1=D����[np���l�t��0�ٸ����Z�ҋ��8O�iu([B&7����h��O��̢�o��w߼xw:y��7��y�x�ޖ{V��㴆Mӓ0�V�梸X�(���OOO�p�G�<�G
(X�
6���L{t�[{����À|Ỳ��@]��?���2�b6+a%��f]]l7����H�e%i�rQ쐖���k ~��M��|2�՝Lz�/��̫�օ��(�ls8*��$z��xrt4C����|;�d���jȺ,�
?�{S����zKd||0�ӗ�/V+X��L�'r�&�� 9
�4�����F�R�겂O?�u���]\���rY�o>�;$?��Au��_�:���&��l��8�b�ذ.*8��lk<��%�CGt�@�/Z��3��p��a^���Y�����B���j���Z\K�6
|����;��q�W�/J�Ĥ-7����'��	{&H�K�[}�Vb�n�e���EY�ە_���	�W�YF1��]tM�$�_mH�AnD�3��_�&+8��XpV)8xq��(�n�c�K���	+O���$����/ү��q�V�=0!����
�ȟ�F�o��"�u{
�KbU᜶�d�����q"�/��׌�"��t��>�2��'h�^��2�u	WW�u�{���*�m��~_,��4������{L�����)��n������^������0sX�D�n��q����7����p�t,dC|��݋�uyU�vfI&ȼ���"?�$K>��ί��9D`�������j���
�0 �ռ�mr$�7宅��L �F��'�p2��Ou��N����X���W8}�V�8Hg7��l0i�Id�f�χW�ɲQ[7�֏������쎂�n�k3^���š���иq-aCJѹ<�g�j7tJ=QcXt�/ƙ�As�#�\���O�+nt�\����4ܸ�s������Bb�5$Xb�#,��ż����,�
?pl���Ӫox� *�N�� Y~��ۥc�A�֓r��
�X�\�ͱ]F`B�%v��5��j�)�x�����[�/��b�4A/Xd��� Û�nI�w���ˋ]4�,��vC�uvT��7L�g��o�Pr@��o���G�I�Ufx�?Xok$,POЀ0��/�-��ͥ�����#Ϫ
���EV��@��~���$]��1Ͷk6�\��oe+^\�_9�6�bߴt�z�5x�ݍo8�զ%H�	�� �`\�i{�D�1�=��Yϡ�b��&����b[-,��{�+`�M+4�-u	\�fv=Ķ���%n^��t} '��zr�΋�mUzz܀f8����'-�7�>Ɇ�|�#[>��+�K���'�����2�Z7����B�K��Z�Q�h�������gzh4����D �C�V3��Q��m����Ae�A�Y�^e�� �`�n�I;[W�
�E�tݼ��#ҿ-�_�ԱXM��e�
 3��v�;}q�4���)��\�à1��#�D�cY��}�nj;�)	�͂!�u�?�cXo�����!�,$�%�0��/�Ph7��b��Lf ��~�o��?;�$;�82bJKF���"v���-O@٤�E
4�
�y����Ig��)���������"yA�0�gr��5�%�?�d;z�l�؀T����FrW��RQ�n��v��*�賀7K\�z%Z|tD�kH�.sρH:֧*�F�����<q�ݭ�d�! P�B�	�00����4�(��bfz��0>)�}�a��Ѵ�"�z����o����B��"�]��zV�!Τ�(���O��/޾C`x���7s�}��7�Nݟ�|���_��=x~��ӯ_������7B�3��/�hQ:��+'=z�h���
5�2�/�M���7����#a�P�~�����`�WW����fga����Y��j�X�V���Ͻ}���M��	��Z&x�#�oYk>A���@��2��v�����—� yW�^@ ,�#>��zs�u�,*:uO�բ�3�<$��N�h���&��>�h��d >G4/WȺԳ]��=jɛuK�5~�p�kd����#P�S`�i$���6�����G9��#7܈.��G
��h.�{q�;��-��g�en�A$ce��=|�6�7����:��*�2���D�/�,,X(=��&�")|<���@��`�
�ͪ\�Zw���\�G�}��;�~|~`�#���r�i�t��< p�#ח4�@�	��Mur�3�u���ťm�lo}Le�c(���YDA]�������d��c#�j�YZ3{���-"���wT.�c>OI���������� ��A��6&�F�*Tœ{^����h�a�s��>� ��Ӡ+��`*k�;Q�3O$S�W?�yj��hA�f!��O�ux���?߃="M�$C:�&��O��_r��
���ciGZ8��Y �+�Э:�ǂ7$˭!�ѯO�&8��נt����-�q�M�փ
�S�l�]�j�U�qU�/kr�`-��&� 7[���}��˧��7(���S��O7��4:P�~`�W�����ߏ�<:�,,<8~,��64����gUs�m6��L��t_��gj Oy�G��5�?��{[8���t�̷���r2�2Lj�31�q*"��cu<)��A�
ϱр�q`:����)ͅ���%��
?3�DEv<H��WC�z
,MG
�K�~?s.��2t�p��
��lOc�Auϒ�:����4}
���w#�j(�{�OH_��g�s�R�>���]��2fV��G��aM ��/�a@�P�h�Iƙ����#0Ll�X@��S�=�QN��e���c?S�N���Э,��P
�?J1�
/���n[��@��*H8�H��%�����źX�>k���r��IJ�	ߐ�7�t"9뽆�hv&-���]�H&,�ol�7N�]�
�	��/�������
i�72�����~�0�� �%4�����n���VP�;
��`��XϮ���q~�in��g�'�`���KO&���X�^뛟�
�Pƙ�3�'V��e���>=K�,�Z^������3�,vM(~�fs࿦ӽ�tQD�bF]���������2 %wH��C�ʧՕu�r�l�c�:��Q#�ާN����+�=����շݱx�
4�A�3hGl���oϑ�Y@���qv89�T9T��<�d~�I{��7�����q��1<�|��Ѱ�G'pya?ђ��6��,�&`t�K���P�?d�G���\����u&ޥ���4t!	LA�v ؁u����Z�õ.����s��x�?�N�~�M��# Gtv"�ԁEϤ-K�vJ�;�k�ޟ�™���P�j>�F8؜�8*x� ����F�y��z[��Uh�����G[:sc$�&@.�' ��Ї:2��ǟ͊ۺ���^�-ې�XtN8��y&x�ڝ���o���haE[�9G���͵D��S�]"^�16���q�'~8�;`�Ff�D{�=ƯE���X��AU�8o	]
jrF�DgxXFp��ܮȥ7{���<{
g9���$�4�|Ȟ�>�N�������*^x�]��LFN����,��XІ���	sOőn��b�}<�r%�i���O�\�3o��t�>K����
���z���?�??D���ѱP~�巇iV���O�t_�ͻ�n���$;�����)��y�Y�e�f�p�U�2W�ӂ�nU�ߜd�B��&����������q�����n<��D��
f���B�=�1�>#JP+$�1%������U��'�A�#V58S�y�	�g��l����A{L������lRے_H65�Ni|݊�N��W���/'��m�a�n�j"��ׁ�U�?�_�R�O�����qp��>�/s
P�����P�]���	�5�tc�|r�$—V t[\���h�-d���I+X����-ԁeusVSA^���Ћ��)�E�jbA�ܳ�Yp��~'2:l�,�aٌ)��i.�)}Š$B�)�4v�"#Io�����c�}B����WC��x�<nǩ]n����~�
�B��D��=V��@,��H?�+���ä�DkʚɎ�SJ_�d)o�f�2��Mɗ��: L�U��BO��>��(�t��q�B���$H�I�z��M���䶋EQ��ol�Xw}]s��Ц�`A���Ն-�x_�8W+���v���M�I4��t�� $��0?��5F� K�|D��6@�`
��M+1�mbk`=����l��n0�O�ak4���}��X���e1]GD)���DM�
��]ﵤ�aק�E=���W�9:�.�r���qp�X��"g%VX;��X��uEjv�Zu6�>m;8�q�.ٹl�>�t��ݡ$���WDY������
�);�^��A|ۘ��ʎ�7P�z�

��0�����b��G�VT�B��W�"Q����W1b�8�3˜"'H�~��Хs_��������t_�J=���r��Ӧ1��_2աjȻ��&"�)��!1�m��Ś�pj�	��=wL�EU��O����e�yJ��W�&�gC���8F�Ä����$;;��M0Ƈ����&�¹,�'�f2+���>831�����#�T(�a���H�=�ݖ����30rH�W��s�S���
�e����l��
�Yc��7��ݨ���-Nb��J�vxB�d�B��G��LbUs'�V�(��Zp�\�tH&~�6�04��ۤ$���
��j�{v���u��m�C;���<t�I
�����.V�>A�5:�};߅	�f�E�4:���c�9��])�+� �Q�x�:�.G!��X�f�Q�~��옯.v�f4~��a˂��έ�����=tȵؘ6�m����x����?�*:���9��*��sB�eՒc��5u��(��
;��c��"O�?��
��f�#m�m�郳'�V�Wn"*�.��,>�U�+�����Ta���,t캗fP`�i7|��:&�ܑH��-��a����f�a�p�b�r��n�N�;"0IK�z�}8@�ⶀ;�M��m8�}�PÎ�rVл�ş�;U◳5�өnLjV�r()Zћ�YCd���ڦ��n�h�1*��	��<�C�O�M>JR��΁��M���^�j���'D��;��JEo!
Ix�ɚ���1Z<��;���nH�	֊F�jP��+c�I!�<�?F��g喎�|z�3p8�?"^a�d(A\�4m��k��?`�7��C\f��hB-b5j<��ײ,%�S-񥂱�. �N5��2Ǹ����0��7:q�<	㌢S;�1�st�3� ��<O�Y�|용��s��,���b�h`cL؄(/�G#ň�����t"��L�e�x_ۏ:�z�|��m�I�r��c�m'x)�D�aȥ��7vg����k���F_^f��E9�F=���X[�IC L�j��q�F�7��e�ǜL����KR�Sng,��5+����lh��˜4|�nT�E�>鄜>ylxiҰ�0���֏5*���/+��ЬB��\A���t|�ؔ�;��3��Aޭ�倭R'2w�&��uy6��M��d�)ۚ(��[o^�gZß��ר]����f6~�gj��P����&7]�ɄQ�_ܝ�MqmPw<߲���R�ʖ���yz��5��g�&���4~�*�x�ݖej�EX�6������ElU���P�5K�-r��NSI(UtNQ�Ngg8��(~�FX&0t	Π�99çZ�Θ{����̈́�;a��[�ޜ ����N���H ¿I�BG�@�nf�I��,~Hp۟mk�Œ��qr��������6w���5�*��ɏ�mC��M�g%��/-��ڐ���q[�gG$o�r#L9��|j36$E�c�\�
�'����8.#$l*��o����e��Ӏ�iHc�FN�$l`"�&�$3%�I3�.�ͭ5�x��6Ʀ����Fhd��X���G}�_[����X�Z�j��d*l�����¯]p���W�%
|F;��W5rX���MJIw`0�x��\�_>�c��+Jז;~��ɲ�d���}��Yԏ�#���p��!{]jL�-�lw = >���Gc�ј��UBe|�ח�OlF�w
8�M�	�������^D)�.�LC,��-�4��oJ`�C�${�/���]�h���0���µRv�� #^��\��	��W2��f��v��F<��*XA���e�N�
Rlf�Y��~:�{��ձInCf/�DD!R�c0��A�����r��pX˕�,ܞM�:ı��77JTɪow��©�Dl@`Qwk�N�s;�/qƲj.8y:��>��k��c���W߆�F�Wt��Y�C_�8���h��~�q���<�jbi	4�3+2�%���F{�F��Ɨ�������r�P�}�A��ʾ�4N��G���!��D4��r|%.Omu�r��^[�:U��6����T��l�|Z�����`���.���9�;T����8���~��l:���)a.��� G�4��\�����;<����c���gK��d��>�:��B\٬�>oW�_
<2S�sA���Oh#�����ɓ������g�	�L�	�!Gĺ޵%)dL;�'";(XEN�	PP
�EY�t��0$D�eHI}H���j�Xt�]�����hmr).�xM)9‰͇�ᥜ~03f��E��1�#+����x��os}L�M��Cv��U�>���!?y�R2��f�L��#�@�s�p�)�D���4w��7�~zM'B�� E�����~�Ֆ<QRo�)!��8�is��"�,��}u���$Ƅk;���:�s���E�*�|Kb���%��Z��x�3������#���z�l����p�F�����w���r�&O�Dv��w���c���g�{��?C�:��لXz��sv�޺���v�ij���C0�3“3��z�lLv�sR�'����&%E�����L�&*}��9�^7��3���fm�],Lڧ.i�W�z�C�����1�A��|d���g�^�Ȫ�ih�lG�X���D	���%�(�>�3����ũ<�1��@]:��`E�� �������~�%�Nn���d�I���)rv �>�"�su76�a0��H;�\�j�(e̛KS��9x�Zl��N�ԄEv~5�3�H�I�Ԯy	N"��3,��! ^�c*��Ό�}��@�'�}��8cɠ�>&Q��	�����Zws�"TDnA�~��.ڤ���e�>��A�K �;�M��1xF�
y�5�|���	���S-�8.�^�A=n��.�im�6;�^��顕��)�f� �"=��;p:TB���8�Z�`�9k�]�b��*0׹Ħ��Pw�i��E�����Q=�/rX���U����Q%��n%�e�9kХg�3޺��<kT�Ң�&"�Mke�P#���\aL�{��(�P~�s�ȸs��y%��|:�.�Ns2����0�y'�Zd�)����Y����Ԓ
HЈ�6(eu�	�v�;͑�����e\������ɓl8
�l��<F4�nY]Ժ�ۈm��物�����0b�P��ފ�1����Ug$j��\�
n�s��$P+��mkS�r0��xv�|y�1/�T"�^�B��h�U��o	�}rR���;e�b^�Fu�i�l���.��'�Gt��9����uqQnHDl택���,�>{	� �r�0}H�D���s��~zbnr?����p]ߟگ<��.�ͭ��	S��2��uo�k��^�-�^��ߔd�7�y���ʼn}�-x�5B�O��Ιr}�?̇�
��K�6�w�w��=:���'g܅�b��Q���GY�^�O���}����8(9�7i��g�O6D�J�/̱�6S�����VW��{��Iu�:�r���F�*wS����'��&��]�b���D��	o�d��ok�#7F�A�	Hg�E��Euy�&�����>�K4�~5�NL��w[̣��P'�)G2ǃ@C5���D��m�y�ܬE��Lj�k�0\5m[]CY���ș��ENU;�⁺�h���V��8}>q��j��5sjƞ؅Ik�
�Ʋ�K����%�Q�ʗD�������X[;�l�%	�8'�ub^�/�X��ӇIF~��^L
�A��@�:����J�
zGFB�Q[
�E��
-��<��[]#�o��L>�ݙ5{^Jkr�D�"X�Ţ��ı��W�\R�D�J��BLt<9tP{aƾ��'1ö�C�{�!�9�P�;��>lQ�tJٮ.D���'���v�y���_:����:8aZ�p"�����Ť��(-�X�=�3�8�7�qfcЃԊd'�_�nUi��r�ʅm�ǚ� ;y��e�8Xc~�w3}�,V	g�&0r�%U.�ߩ�l����Ɯ��?���
Bl�?d��C6<8�w�.uv@��7&���������b�Ee�~��9#_�l(M�h\��Q��d�k]��.F�)d��/�f����f��A��*
w�q�륌!�UC3b���_;ޖ�$���.V�u��I7&O-�$�P��7TE����餯�ZH�VTM�D�R��V��3��#��N��st��AO}؛�Bu��%�ƨ#'+�#k��uzak�tYE�.�TB��{����G§pf.����:���C�O��u�c��rY�q&��2�ō�p�jْw�֤��̯rX���L�#�=�g,a���[�%�S��f͇@]b��~��쭅$i�l8 3ל|�=� 2���`���S�ԥ��A���<�	o
�Qtc�M��zp��D�d��PCs̥o&��z'E�� ��\����4�jќ�߇��0W����BXKe��1��<)FvMUD�NY�8��C��B�V�	op�.��,z��p��D�iݷ�ɉ�����b%��2h�s"OPJa�8O��C�u����,s/�z?�\:��eA��] �:
iw�6��<Dª�w_'��n�����[���VQ����и��XCG�#qu=$�'𙩦UŶA_�:��F)9�L�	�����/��I-�	=�U�-@Ǜ���&4}�\SΘ��E'^�g���Xʕbn��|F�U��:`򶴑kP<�q�����[�H�-:0��D�8&IeVQĔ�:� ^WU�E&;���
;D(8�.@��x
�A����w�VP��(M��M���*�.0j����I0c`Գ��OZc<B5|�BZ�4��7K�i��C��q���oBP��+��f�c�XpL�3�)\ϖ�%�Źp��Y�>�.#W��FohD�#���#2P�r���j�"L�S�+����8�@'#g)v�!,v�%Y�0Զ꺆��%�kV�(��S��m�<くV�o���|?�&�8x6&�J>�k�H߰1�F%�}d�6v�D���xΉ+Ը�q�	��%	]ln�I��+@�,'��%s����l���
b�
f�K�Q,�{[�G�8@a?�ױ���d�~Mp�Ka��=K	����02�d ��)�է��3Zm�tOL�C]�͛[2�?��H^�}�DK�wB�b�Ҡ�sҗm��g�"���
7b��!5r&P��
�N���H�3�jY���k菛�5\PQ
N
���҉oPPb�Ȑ�@
*}[�Xt�Q/��5��^������8߰w	�jt�
Gt/`:��������f>�jK�x7V\��:���~Ҷ��͏|8������Q뎥 ��s��tvO&�p:�{�`n+�|i#b�ұ���˹���¤��7�6�8&�G�I�"	��QWFpwi�뮈%k�D1�/仺��NV�g]���~�Fd�녕xB�$�l��ݢ,dup+���1��/tcN��ͮ(zYs:�sJ�����Ԫc�R�@G�]�R��D�MU����y}xX5}�Ͷ�T�2.�)���7X��h
S��E]6H����Pr|�?ˤ�PT�n�IM�{$�l��r)S��Q��
�4�������}7�#�K�0�YWWU],&���_��Ȓg��D�}��.kP����u���Ŋ<)Ȣ��_��xK�|Ws$D��5�SZf������q���'�z����%�%��O$�	��;�{r	����S��\{����s'�5�t�Ќ�;Q�`�g���^�R0?w����I��� i�����/Z�/]L�KW�;øL��1[�/�����ӥ�q���i�q���?�:O�Q���S���fCq��T^��
G��>�7�4�9��(��7��1:3Qa�^u�f�+:�J���:���p�\-�[�x�]�>/1�mh�1�:\���x��eȃD��v�<-�^#� ��ĺ�z�8�(�Sw��@E�+��Q�]�~�#�o�u�j�̺F[a�E�@M�M�)(c���@̑��ph���E}%�-��^�(7�.z�w~�j�E��=}�������J�)p�C�y`�v�IXa�/�ΈQ�Æ"?�K���g���QL6�
�9�2b��
Ċ����Lo����'���e>N���tA.�x©�Pv�!ӉeR/���3�H�)�tiT�dOǩ�YH�9����cL��C8
o��(�����k���E�9��Y��zb	�=7|�T+��0î���a 3�U��+�4c[i2�\3\�7<��� VX>6;��@�y<WW�ֲ�M=qM�E�Ld+��/��<��]Rr������R2V���Q��|>�|���
��We��- �G#G�B��U�n���-6���AAl�5ݥAo����BOR�i68:0gh�{jL.v��7��w.����ԋ�V<A���=�����ɶn��r-G0��C+���ᅩ5hؿ���nZ����C�H�1��v)�kPP
��{�>�C\�l$c�.�=Ҷ[8�a��i�Y�h�]�[��mk-`�7���Q�o�5Y��
-+� "�R��EX��)w�
�<����e �{�mP�M��q��E{[��ev�?Ac��y�A'�^��nM-;�7_�Q�T�n0?]�g�[�\�#������5�JbU���Dȹ^P�"+ˀ��vF�8s|�\� `�f��!sA����>�b��&��G�b�jcҾ�*�=Zb�c:􈺌�9�Y�]7j�a|�&;y���w�h�����M�H���xD�r��f;KJ���
w@�s
�.p�5u�);Q%>��o6����Q����*^��X&H�h���qhl����L@�Y�${7��/G	n,h ����ve����x���H~�+�w��
�0���Kxux��j�cKy�rT1Uc���D-��Bq|ü��/㒬�t��B�w�k�Z,�r@�&�����l��-��x���IAf�4ÀP�&ЪkQ]��\a�6��m���w���ڵ1F)�iV&P��^Cd�t��j�e�9�f]�w���C0b�ֽ
��;�ЧȃA���aU;�]�ze�T�0�/۞�,�T1�}Y�ha!����|����
�J�tU]e��=j�����G�?�O>�]Cá�|���uO�Ӆ��[��@�9��n����t���aXf�_��/�.�
7��*I<�~x���vtc�CG-M��ڑ'`�w�����; ,��]���4&e�i����N���$�����E_D���sGo�fF���t_�r�����oZ��h!�7���%�inWց�f�=c�m������2��x��M<�uř������1&�d����ө�	�Vk����k�rQJ
ː_k��D�ʄ��ܸ���2�����e)�ۘ}e%H/�Ѡ��U�)��tD
5*����Tؼ���N�(��9Zt�o���5�n�4��zw�̰���w��rC��<N�<I��s��G��>y-��#b"9�k��R
��w���9�����q)�YG�e��B�N�=񥸰�6�"
��9y�r�hF��bn]A�y��r[��*:JiB��ӳ��D*j|�\���
�V��2Y��?nV �.��I��{�<ѢԄV]��n���|тjc�H��*I��fPa��L��׭G��)�Zr��79�]��d�L"��mQ��z	�	M��{�)�!���kąs����N�]qNK�nY�||zu��p:A�^V$��A<ā'��j��9�B��h���T�f`:��:8��X����4��E��{C��4�Q�xA6���-gD�R�Υ���և���פ�sM�'8<8$�i]�p�g�����xt�/����1~�h���������~��2觎|t,aX7V�
s�1�D��O��%
�n�5pU�\��cpq3.�J�x8�p��A�g���x��ҙd���A	2�'��g&V(k�<q�%oc�s�{#�1��d ��#�ϫ�i�ջ� 9W���h!�dӐ�[�?.�Y�b���{/�7>�K�LN�"�t�ф�p�hҋ��_�=F@�;6!�9}�}��w�d_j�6s��\_.��g���&#�g����.O��V+s��������M�\_��� 9^��`5��N���[��^LEv�4xGj�7��I��"u7�K��h����w���;����{_�^�ٶ��3X�0I�?@�u�طI҃-�!���x������=4OA	�{)Q�^��A6'o��9l�>O'�Q��C�-����T�|�;������(��� ʫ�I�p�LҒ�g��~_���{����������M�`���%7��3�2K���C���(���y,�Y�>�����<fd�=�~B��j�?�6e��P�t�Yz`������#�w�e0��s	���ໟ�t��j����?��P�ix �I:�-L6Bc�L�!L#�Y�(�~��kC�?f��G3�����c,���|^Κ90������u��S+�~�������C�HP�5pZB����r}�Y7[��@>n�vc���'Ņlr.��ݪmO�x������dď?���&�'�`��V���E+DqE�M� ����t�:0��I�c�tf���|��u��}����Ul��<:�w���k����=Ѱ���'5�Lg�ѷg��a��hXGuR+,7g�wj'|���٧��$�		)5����EI-�÷���7럨�a��B���M��DŽ1̑3�&>!	�$�%���b�__#[����}eD��-�Q�/��yV����)ϥ>�a�h�H�C��N;$͗U�ʌ�NO�-��yTw�-4&��$5�#��^���䖳!0�k���(��!bđNJiS*1%.�����Y4���ᗅd�q�h�y��fH{ݙ`t�����2���sYʞu,||_5�*�����Jl�$ r|�ڰ��)�)b^�����1�F���wӥF�%���c��^t)^| 6/x��2���;Ã�+=��
��u7��O3�.�v��%w�\���̌V�z�Y�O>lap�M�,`j�U�W�ò~���������[����rq��f�����W_��
eA�����<\�r���զ��B�k	���J�1j�~���^�o��φ�˦yxQ��͇MU@C��jrP��G�'ݵ�w]���ta����X��ˏ�C�{��x�hӖ����d�����oѷ��pk1�a���^�wk ��Ru�l(�}�:'2�-� L��P��	��j.�5Y���\%�"<s��f���&F�����EQ߰0+a�ܤ;����WM},�
��$�b�j�g��S���u���њ�L�~�P4=V�8��'�'��\�lU��o�/D�7�7qs���]JJc2M�{����6�8�^]�G�v���t��33ﻛZ�;�0`^A�Lʜl���D����^ۍu�>ꁦ�CW�`���}��x(*�3΁,�8��k�Vk����P{^�e���(�2:�.JX�ߎ
x.A���"5i���f2ԃd7�׈��8צ�j잨�
ʍm8,߁���eG�p�1��	P�ڄ�w4ң�+�FH#��a�!9�f���~sBo�rr�!��X�21�� ��ԌWW:�a0S7)}����}��l��q1M'��vlWhk�];i1��.N���Z�^Dі@=0�\���D���c���$��
9�Iݔ�t���,,�V^]��ƫ̬�E�����O��+�ԉ�qk���ŜXf㮐�b	�!��->��k�����
[FKD���ש?D/��;L��D�
�(���58�ӟ�_����A�u�8�T�{��<�vP�5!��k�yo����P��Md�++��e��~��A�f	��/3����zW����^7��a	���a��?�R�����t�y8[�%B����$����v�kz�*@~�Λ���Qx�6\8^y3���j>e�֢��,̱U��-�� SY!R�>�f�
=:
�_C����}i����x��P�����w��޸���嚱+�_SA�E����LJ'��ޏ/���G�x�˘��L�NTم�cHr�d~)��Z�,��!U���
5�.��B˕�K�-�Ҿ�ѣ�[���jY-��*O�{Q�:�I�5)R���=DE�0�k��0�H�����T2:����F��q)aH�xg)�(�v+t�U~=-�PK��a�xX�eo���(M�N*��5�C稇@dB�2��#���V��a�a7k�%'���O�������
���£H�����֗��k�qe
i���P�
}�1ƻ�F|�(���[	���	�;KLMe/}o���I2��0b�eGd�r�@}+qm'�ٗ�<tA�M����*;Έ/��#�3o\I#媣hߜ!N�D1�:p�vO��k��ഥ]�1�>�U��p��%s��+�&e/�k��E��?!��Ze
'��MOG��T��篫%���� 3�)7�"5�3=1�L�m��G�i8�m8��0c<a�>z��	k���u�y�XB�����2��5~��VК�ל}C���Vm�\�$?�q�{�l<-��7ge2]c����y�`y�&��OZ�ҥ�퓖�r�`����o5e��=�����l(� ��"��
�x��Z��v�_����6+@�O�`��N`RT����gX���s��c,�u��oƿgy�s[#���V�'=��e!��;u%�p�SDѪu�1�x WP��9�ĵU9��,�^�,墙�D�2ct��}[r�|�@B�����|�6
�s�a�Qy�F�l��]A�X�����dR@v�*הz�?Q�p8�H���F'�J{���
w��Tt��n�I�M��DN2}C^���l�n9�^�����w�u�>�Cqp��O��#r�8~l������KUNin���c�D�&��/o🡃�Y6�Ř�ŋs����__�>����.��›���E�!>�l�ײ�ё�����œ�ٿ<z�f�]�a7�qva�jA�3�H�+���I�n�rL�P���ɑ[� 7wL]��7���?V��;�i�����[��AL5���Ż���o߼y�ͻ�|�)�����ؘ�o�EU���%�F�k�?W�XDW�j$�he���@ٛ<��&9z(��hZD�C��yVN$�g�Ƒ�H�}t�C��v�)6(�*c�7��\%����m��+ �I�(��^>��)�Ɛ���x�����Ֆ�j�

��_#`��6��~�g�]��8#�ߊ�C7ɒہc�����zP�d�?E����B_�3�l�����J��]����tѼ/�*��Qʹ�V��.X��iX.�Ѽ\`*>�
ֻ�W�%=ʸ�?{&f���o��$�O9�|z -'q��P���uU�s`Ä��h�/aY�@���a�H����'��*L��eF�f���d����:rLPP�_3
In��l���%�Џ
�&�����N��j74(����N��v�����
>H_K%5ݽ:��������l���D%�����2��	�C9	��…by ��#>KɂjN�8;�kx��&|��.Z�]BoܰoviJ��|�
;ONy)��x���B23��?�9�ĄFk�����l�*�?��Qȑ�󰰦.s�9�I�.g�<��G�FA�aa�*�%�����VC��О�]�d�t��]E����<��Zg����Ɵ87i�踺��hL=[��λ�v�¿���9�ɺ�����vS���wj�3��ŨxgD�
�3�}�C`l2� ra���V�~5�G.ut�a�*���W�Z�_��qSig&�~��o(�)�[G��R�f`B��}�]å���.�ڬ��k.��wva�^�o1~�Ӝs�I���C���M�P��L`�3�K�m�M�×l\�Z��N�3Ĝ�U�\��"�n�ػ�I��8��$$��G�M�aY�^H�-GNw��@���A�&���V��4��\H[0G���^�ѫ��l�í�TV?4�2�HU�{�>+e=k��DBe�̌�'�b'>L1QK;�LJ�\�@AM�P��F�fsSߋJL��mr�&�?�`���,9�6&�/��$�?��-�Oa&-��.�S���x��Py�.�=)߃��$�=�E�
U{ss&�I�5GdH�~ueS������9��6+�6��S�Ҹ����l��U
O��+z�M�&��(�Q��3U �
fz�]��C�ÎO��~t��<����V�'uiK랸�<Z��SbV�����y���j
�L���{�W;���Q�;W�h����qq�~�1���&f-X���0;]��V ��.�>����u3�\�'a�o��`�j�gtˢ�G4����M�䯑�_�t���.����$�`/�*&V7��x�ܾ���^t��~� �?�:T�G�YPS|��[A�<��'�Zw�!�r� q�%���"�#p�h6eLj�&2��j�t���-��D��$���HP���P�ȆD�'<�H�'HI1r���^�1�
"���q�<c:JWGn�7����k�<����X�rc����i�H��%'�Y�L��Mg�hroς�DQ4�J6?Qt{�j��1٪����h���D���:S�[5r��蟾3><6�f����Y>5MCP�[u����������c R$��~��K��ɥ�"Q��ߗZ�c�$�ۆ�v��h�@Y���c��^/��S��H��ĝӗ��o(o9%8�D��KVj+
����$�`�o�Zџ梴�E������<�o�ơ+{nK�!=�%Z`��r���W2NN�$��u�w��
��b9�!.+3�	��~|��刑S�b�Pz����-K��z��;��B�)�N�!z$,��ġR�IeW�_g	�!�D�k�矄`���-o
�Ԟ�Xa�!?=��x+b$��$D�K6ջ�Y�.H�b��R�ahg���)y
E4�O�0��.�ͫ��eeF�B����Z)���g��./0�!=ǰZ�qQP|�eC$l?�9��,z�=sP�΅Z���8�yw�o]�������������1	!Y��e�C3��_a��]#Ut����N�ely�&çRL��֭�T\��5��j��$�>�IF��moI�;�
qS~���
M�,�n}Ġ���^�8�5�I��|H�=��q��;�ޘ]õ?�)D�1��|{��W���DH#1�7��%@Gu�ĩ�zܔ��HN���m�M��f��`O)N��
��8��.�3��-��L�[�LPd�o��M�S)f'PIt�m�$=�k*RA�6�0��X��I˓}�0	(���y�m8�a�G�EH8đ�,XIQD�Z��2�/�ٚ*4�(�i�k����K�z��&�
�:����a���rN��,Hj�˂kә5�oT�&�bO�<A&�qO̢�/q�7��j�dF�qw�x�`�;4c��'+���R6T���#�Ѱ�L�ӑQM�a�rak\�>t�4��������6�Y|�鍕�<׫��Oi�Q��g�)%E焱�u��(ZI��.�cVh3��{T��TL�<9���s��-]%���|v�P"��O �����}I�Щ�Rr�A�U��#9����,�K���L@+6!۳k2h�0U�u9���v�Tô�5j���4qB�GE��(������3�q��|�je,��L��wiӋ�I	����q�Ɍ�6O�+��gq������T����U���&,�|�+���v,�+���Փ����uU�-ޕ��W7�7����W��=�
��ϧϞ��u�z}��]*�LGxS��s��.Jʄ���W:p=�P@�clP�K#4�>�])p��{���Y{S��9EE!{�(�aP"P����M{��椸S���J��[�+�0-V6��'�O�r���7��/޾;��;U�&E���1qƘź��Ԑ�6aq�M�7!68S��҆�f����?y\�[w��]�r�;g)ojj� V�C��+����D��8O�e���JNX��ЗtK ��\tiL]��=lj���/C�dM52:c0w,ݣTc�� �հ{���q
j��b��[RB����h���r�"T �P��K�<<N$x�7J�{��r�U��>#�Kq:����n.�[����8�i�2Mu�aJ�Ah��3�ĠBcԢ���Uk�	��.��J�Ș���"�aT5�y=������.�+�\��d� �LJ��ϸ3��6U��Rq��`F�*̟WH!Rr˭�XMp;[�ݞ,�*C�i3E�x�@����!�����bAa)�/0�|����ջ6�E9��\wx�ę��:mT��N�`�<�zğ�S���e�1��K�ĩ�0��
�J���$:r��{Z�q���-��S�1�!���#�*™���9S�<���bP����荺�(�16t�.W���yLj�(��:)e�-U<8z?�]�Ώi�^��3�?L'�=���=o��Bn� 1���r���M:�<��lBu��n�-�B�4��͹BE4.��;@S@�D<m��^�C��NR��yC@I��-;:-�`"Z�Mj
�0<k�cOD�sE��_���8�t�ΰ�v���6mo6�L
`�c��I"S�px�~�k�����o�I��.)�	6�9���\��b��ׁҬ+u�P�Lfo<_�>��U��2$ņ듊���6�h�D8k�@�WMm�ZWk�Q��/�^�C�YB�,�s�cR[�8��͝�&i�w��X��	�=��GDA��x����G���v�
�4yS0.��l�����F̹J~U�/ø��I�ċ��BhY]�I�����r&��z�#��ydiK�c����(���N4���1IPd���E�N��f��[��vs,�֒Z�Q��ة-��eQ���4�Ԙ�K��Ի�gO���)�@���Ƣ0�‘Ѐ�S�\�|q�b�g`������A'/f�Bo�uc�`6( ���J8�#�-^#-_\ 1q�V�M�F,�}%$�rT�ga��5�V��W���Ω�2	#8�$�&�͔��ϱZ���P$ŧE�@�����i��h�~yD	�o�[�2�t���R�g��h�%IS>~yl�Ȃ��E�mW�굋�ŅS���Ʋ�(o�=�f���R��]��m{f38h��D��X\A�G&�8�A/���Ĕq@12(G�#`,���"��[��q_�]`}��J�k=�jK��]%ǚSx:Q]O+;���ٶ�ݱ�yB{�B�����CJx#T<Kn(��L���V�e��~����I�]:��1^��ߔ@<�?k�v�Y�\a�w8[u{�˦K@>�&�6���P~���%�� T�G���s�t�g�s5�й��6���p�|�jx�e�k�!�)ՔTx��V��v��zN|�z�Gg��h�^���/�|�i�)A���],~j�}���|Q�&�HB�tT^P���S���!�Q��Kֺ����j�^��8�m�L�����y��8��?����mE���ș,{P��պ�ZO`���}$X=kj.�R؛�o_�5��ѣߡ@�� �QA5��g��G��kE&[���{W�y�m���u.��
G�-�Ux��`E�֋jYq	�<{�4OrC�z�~KZ�պ�(�#���nT:@t���O..������%^�0E`.0ޮ��j�ҳM:p_?	<r��#�"9y��rne�'�㫟�T�?�^_2ns�J�Y=�Fq�+"j
�S
_���v�#�÷^	3��r��ޚ�+Cd���.7�}L�4v��G���TҾ`#3��Ћ7T�t�ɻ��I��dI6
4�2��Q;���r)��u�湷��D�����y�����|�sT�I젲p��¥��O�����=>!�h��>�(N�����~}J�$ך����o?~��G��p�sbX�ɫ�/�Ƽ)�;�߿�W��}|���l�1���}CoW;|O!������O#���D��?0���M���o���i���Nj?�z��鳧oO�:C��:�7�������.��J;��b��^+T�M7�e�E0Zբ�qۓ�h̩��W��ZAB�y,޹��qW���RJ���a0�(�\�4�����6�)��2}�_q���k�Fm$���z��u�
Aa��M(��1�<L���IAT%�	��u'з���`dg����`l��SV&�N������ck�~ԟ�G8�V�'�3�c�
�Qz�=(�X��[��W�J�x	�%��c#�_;�j�S���XFA��_��G�c�ꖳ"�o�5l��+��ܣ�`.��y\jr���u@R��\��W����Js��wU�"�>�˄Hy��D<����AnLs��p�Q�B����PrP2�p?Y��*q��r���u�8�ȋOޘ��f�+ �#��<�x�E�7�j�A`[�8�`]η�r(ET�� �f ������%�(M��'�&h6R=߇�]]�>Ye����l��^�|� �i9G�R�������?Ju2�x䊐���!�G���O�F�"��%9m��lw���xj*�r�C
���cW�}Wr|(��]:��&�b]'�Wh��$�JI����nY�*C�E�9��5�n+�\{�`:o�,r����Ka�ym��{�%�a}!+6��Z,�j�M��P��0���G�G�M_Z�DF�<�;����`������=�,�b>s?j�&hh�`�h����c��O?�ޝ$��q��������x����j���`xr_}�?���Z��@t�'Y;�oF��Ӯgi�
q��:�Z$�����?T��Y��7���)ɞ^((?���n�B���8{��Z�eO?;���sęPB*�̉Ҝ�j���t���t��i���,d�lNSw,� �	1���!�F'�fT�Kjxz>![n[�T�ـ��20ӨCd���0A�◴��B$�ʜ\#�����ĩp���n1q�ـ�`5�d�5�187"���7����>N�;����ʭŽ3��b�P�'冷�`^&��`�?�d���O8�d�m/�����@oVB�򃐬�N0{��d��1;E�u���(ӗ	nTD*z}oa�Z�,şz��� A�u�����Q��ʝ6\|l�Xa�a\��e��S��Y1��U!olW�Э�@����Lޠn�d�qր��=ċ�v���� ���4:��Fh��l���P>��,Q�dґ�t�����U�0��.��5)��
�_�8���q�`t��j��z[�c��
�:ʋ\�VeA�����}!2�����n�ѥ=���	�n*<�:;�ot����8�U9�6��\�*����[�i��:I�6��c>&���j���`C'��jݘq4�T�Һt�OS�g �>}�ej�F��r�'BA��R�{B>%<u�1�$:롤���b�HW��p5̻ۧ��@P�6�*Zh�n0�?���ۇ�����4��56AdBI���.릈v.���2�ѣ�LX�pۓ7��|�?_3vU'_�p"�b(Q'���I�2����X#�ͭ�����vඑ���v~���vD���-@�@���e��x�8�6�E;]�4=�\\a�]^��8��V����!���t�6Ћa�g��:����� �\x�$�A�L���暴�Fg�AD�A��:bH�BFB-�[�.��t�f��>�犽dT�_H�L�MZ���!~�''pdps�g?5�����}:�[��t�.���/��W>�h�g�Uϗ]r�7��q�h�Nb��M�K<u˜��i	ҰA��bH� (���U��ˡ&���>]x�
��=Y����_���@*?�I?����W{ }ܠ��3��^P��V�Zh-�	��ɤ^��9LyO����h.����)��R}��ց�p�w��I��
�v��;��)mz=gƨw��[[`v�5� g�+�;	�ʳlX�e>�n-+v4d�$�@9=h�Q�a��K����p�?��|`T2w�p�%���>A���O�g�!5K��A=������{R�{�6l�oˠ��qOI�@�Y��U1����8/�R�k��/?�C��F1����~�{�Q��5Wm����ܔ�뺚*��F߇�WC��0��G�y�s��Å%�nPM���wdfxDX���P�JU�{^�رJ�\;�
A��u��P�����>�F�!O_l[��v*	��m���,��ΤX������§YUM)�IDV�i�Y�V*U�q�JRw�8oA��x�o�V�?���)�(�Q��E��b���l����^�$dw�2U����=���|���Vl;�8�
ˏ���b�l���W��_p@D`a���Q�(�K(�g[X�eYϹ�겺Z��4�|��L��
�8Riؗ���F�5�a�9<̊�֓���0���{	w��O�cq�1F�,�z��i��Ҵ�L#?����V%XI��rUtK���"-Q�Č.�����Z%�.)�P�!��ǟ��O�A׻`���&3	V;m�=ꄚ��	.��^O���{<�:�+Y:����;���fXGݷΐ<�4O�8Q�E�����%�>�w�/ưLM(���Bu���A�:������˞��\(nE�O/�BE�%0H�����:`%^?��}�nj�	�,�7�G����/#��z�qߒ��i���W$o(�(���0���H;��?�����%�?�Q�s�/��RJ���YT�v���/�&��]�GZ���Y�+3+Qa���4��0;����W!�TgW�Tm���=6�R�����2��^R~;���|iS� ��e�ڡ����4h==F:�3��å1�Fنf�.I��+�5�ݝ23ݖ\�*�]��=�d�g�k!��XO��"R� .xg�5�V���EK�ӎ)�a	>���1���!U&���RM&���!�3�~�QT�.���C80���OZJ�R7Y��]��,J����yt�~t����}-Wq��|B�"PO�f�� ��}�ܕ���]w�.Tu�,%'�M��eMm�iv�_��U�V������^I�ҹ���: �L"F�HJ�&G���6O��qyڀA[���]H�06�̟9������U����C����0�N��#�8���+R� 9?�{�j��JV�d���#�s�[�zk��ZjoqQ�H�)NeK�v��M���GP�a�$�0՞��5�vV���ZňP�V��UD6
26�����(j��k.+2N�����"�Mwҕ=���i=���{�hT�W���PH�&���Z�y�<���ʗ�6l��/s�p|I�!���^Ӣ�	�C�魋S�5}\�}i(b7$q�Ep�������N��{���;:D�;�UGw�iB�]�L!�T�[-c�X�ct�
ǧŇ����	h��-IZ�7��vdn��ɨ\�
7�	��\y�\\i4
A�c:�����<S�c�c�g[�K��a�ָ86�$i����Iy"�G���KTvm8¶FM�UM!߫�Ţ��'$͒�wj�E�
� ��H3
���a��&�K[fa�	�E�5���l�p����p�\�EUW��>�r���|�ő:�`(�U#�qb�z�}>�a�}������/�,���ώ����3U�B���k[+���"�N��3��f����1�d��~�����e0b+��zr�B]�g��B�w��B�^�n��pO�J���!�m])���s8F�$:�O�T�$b��P:-�<�ڮ힕=���P�mR�7�[GKt0�
�劲Z?B�H�
%�F�ٕA��Yr�#���h�a���Y�;�x%d:�D|4��J1sq��c��d��4����@Z�-̩�l��%£�#�	
��f�>e4�
�Nq�ө�&��
�]JiF�<���/O�d� �����4�i2�,�����#7G��{��\�Ғ	vW7?O�g��豝��)����X�^\�@����cli!i�Jc���-�c�,�I)�<q�!��ͩ�ƀ�"�C�M�|7�n$/\�wt=.�v�S�!���)
S`�~���S6O���sI�hI�!iw�l@%��]WW�8Y��f]mv�A1����o����^j�s ���`�YJ��}�Rmtk���'ܜ��.��p�ho�y�7��fX]�����H����F��,���H*s!
�&��]�?�|�0��vY�xXG�(e�\�f���Ӓ�O�d�L��h�J߫�����Ÿݟ�G~��L=P�����m�:<<3o������B���ݹ��RR)`L
WDB��.��E�B@߾����[�a�p�ş(���#�a�7�_C�"�f�3]"��Փ���$VJ@��
�-  ���i�fM}����Gr�"����궩�Fu�U��]ܻ��?�}GŽ�QbR���8�a瓮��JS��+�i�1nK-ż�[b%�ٗz���*��r�n��{W%M15r��'���������)D�K9ҋ3/����9�-q����t��F�A�I�������d�W��,��=U]��X�k�бv�fٓ����%�mH,�$m��zTtM�T�v�G����h���:�4�	�GH�k��m�(m�:L1IO�V	�sBI��A�T�
h8��a��'�WCJ��}�	Mf#��ҭS��IGo(���� N	V1THlm��粶��}��B������&��>�}�G��r�d��Hoh���&K�7��	�hc�M���#������Y�y,*��pQ���!��s:&�@�P�-Nn)�5��4�С �q�b�ҁ�v)7�v{�n�͖�:���(ZQ_�f��m�s�c�R�ҺA(�j����E08��s6��R�ғ@Kz�r7��'�S���u~F��/b��@��`)X���āHK��fܭ��гyɚ�בBu��jl%\F.S��Ջ����|�]����	����^cN.�$m��FK40��I3�j�3���5�w��,�A��X�R��!����uKi�aòe��(�8�}��=�T�D�i������Q>/�?���?���(��y=�ף\��r����Ʌ?M�˛j�-ϛ[X, PK\+�<�`��v'_�vS� &��$YM�:D��n(`(�:qG�{�Y7�}��x�����$}��q	�\��:���Rs;�|�PX��"�;��/O�=}���S�<�����I�g����e��<@)`�g��G��޳���85a:e�<#<��xi�z�*��٧�5�;��|���?qYTV�s��f��h"U�ɋ+~����s��q��u*Mݤ�e9Uo
D��$
����Ǖ��G�wgg�?Y�$��<�^8ge�߱D�ز��ie��r���	2�o�#�B�1��x��U:;���v���Ș��K�%�5硷.�B2Blݛh����,!��:����0��)����?T� �(U���ͺ���ZL��M�Y���\�֕b�Q	�|Ǯ�a��=&���)_\vC��A{��V���
�k݀�v��C�6��yǐ�����lDjj��n��ё�
��~�b���� �$y!�~�\!n2
>��
#c{FU\-�`�SU
�8l���u��T�p���
��X��4s�'ͧ�ܶ�e��L�A�EJ��J�䩳!
{�_Nd���U�<�Ouj{�Wr8�1y V�8H��9����|�!#��ac�<��8a]	7(���J� u6EX�\�S�.)L!9���Vd�U�b�;�K�3�Q(�s�Lό���8Ä��������j�p����h��ڝ�$�.U65{G�V��f2���=���j�V_[�|@���:���W"�b��y��^�~�={���ٻ?�x�}���g߾<}���y,ٟ_?��0��X0�����&����%��F���]�M���9G\�8#H���x�{z�+J2��58��Z�#�Tl�&8������١w���r}�R���ضE���gI�ʘ��y�]/O���wpA���ɍ�"�^��$6ũR�jw�m���sΒ��D��E��D�'�Ftc��	�a�jC�������ϵ��bj���%�ȑ�lshC���� ��
A����s�=���#��8� �-vLC��J�Y8N�������@#����r�e�
�,BK�:�f-��F"�8ͥ��p2]�f[I���9<�u�e]ͤȮ�$��A�KL�)��a~����a��K<��Ps��M������P&~#�'�u$d|�n��D��,��$�g-��G�r��*�Hρ]�
2AR/y��j�r1,��\ؚ��N�FWj�]��@�?�Ŕ��S������p�w�6���*h:h-�D-9���t�q��~78��ع��`�/�6�2w��YN��9*�a��y��߁|�P~�N�,�	<o��M	/ڡ�3�Is�Ljw�b���Ѿ�~�|8��(;���LG�����Ż���o߼y��1苻�k���8��r�ԙ�s�'�Պk�73���p��%��PX�tARU�k]#sn{�E���Zh~�5���u,uJ��е����B�-�7�Gϸ�W������c�;�
�*1����T0�J���'YvKov����L#އ�g��\FⲖRzS�3�@s(,�(X.E}#O�y�*�ӫ��h�\��q� xQ^�	XdHA�QS��݀�#��崗���K�'P�Cb��`�
d�^ԗݵ
�ʑh���gq�m�����M����o�p�ieb��4����?9~|�������gA]�b����r���t�8�9�8"�.ۮ2 ��WK�h�Q\�`m�UB���䊚�/��Rd��ͺXWX��	�DDA��A��E�#���-���XWF<b�	��_m7��5�S]�D`�G�[$�3>7A�.F&��KO�� x��eh��ƞv�@[��%L��H�[��ܑ��i�J��W�A.I�]�J?�D�@[�`٢�\Jjլ�"�b?0�E�9q���a�o���>�n:W@�O�����y�|�ߋu1krW�"{�.5�`k&E[���e_]��t
�n����Z �W�0�:q
5���n���L�����y��.J�����<n���|��M۞dZ��%?��u6�H��9�U��]��h��7�{P�0i,��ߋ���*�:ɥH�
��
��5Y��'d�����=E�"+.0o��C!{:
�x*޹(j����z���iw4�)[���ﱊ���+T���+h?N��P�GS�aM��Kڔ��[�0��#��u�
�0p�W����1[��Acǀ�-�&���w�D�M�؎%ʖ�2O��Ed�z��m��e�X���Qт7�
�qD�0�6/1�Q�V#l��M���
���#��^�֡�E��
�)M8*ɳ�&������p?P�^�sq6u�[u��I��E\�t9�~@xIJ
�y$��w�ᳵE�sd,��zb�"qHh�5�6�,D-������2����um����ꄝ�E�k>ޫU.�9�G��u����w+N�`vW�΢P�>&Ys#'	�r{��pހB��`?�+M
�pϱ�������I1�aM��c����ҏ�(�Y�V�q�X��a��^GI[��*�l�f��=LF�א�Js�MdoŔ�?/��3}��	�^�t
!K�Ѥ�Da֡�81;P����P�J��=BN�u~�f*��s;�%R�?PK1xU!pkg_resources/_vendor/__init__.pyPK1xU��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_ؗ����PK1xUB�q8u
� pkg_resources/_vendor/zipp.py�Y�۸���NXN��-0���I�P�Ţ4Xh(�s�Dzf�b�>D~��I���(Yv�A;h76yn<���в��^3ٮ��ԵJ>u\O�+e%��R�^�m����m�xҕ̆u�$�vV����A�J�M*��e`ѷ1���z��W�m
aU%r
Ŝ�۾�(��\�D���Vَ��Z�)��4�‡�{h^���B�,�x/�"��黺�2��E>��qc*{����DM�L	�q-
�
�wN���݋F�>�Z�T��dz��ѓ�a{����ґ�c�m��fcv?�3z�n��H��@J�e@K*bvIx�ϒ�(��B�fL�D�J�"Jy�����t�^�컶�!��O$<W�y$�!�P�s�H˲���yl��Q�e}٥D��D�8sg���좉�,��%niyS���^������%�K�%f�ˊMغJjk��B�N�"(߄
��f��D�L2����3X&��^6�����\J�,!��j�DS�L2��=>�r�o>qkERkZM_G��r��F6�V��e�m�rê��x��U����"%t���)!'4�4�;�Kyŕboں��oe�"���?dw�ggz��:�o�MڋFz�M+��)d��3�2�(t�#?�;���#�^��ׂ�l<���G���y-�-̊	�S�p�`bU�� =,8���{�D?�ռ��3+e�pe�CJԱ���de۳�Lw�#��˾(L'qT��3q���$�(��0J�:"M<���9�r�%�F����̙Z�;�΀�o�A�
�=e eH �{W�����	�	s��&��0LH�"S&$�.+*!���o�E�ޥ�#�ȣ� �ص��=خ�ʹ�:�ۮ��TB��}X�{�0j5�!mқ���|�?�(�(���Ϲv��,����Bd���w.oF�v]�v�$0͗��;q�+���*�';�d2��P�q婬e8���_��M�����	r��~�n��H�v�hJ��+�W����!rg��)�=��-�B[�ڣ�Q��m!���&dI���X&ך.�'��Pz�6Zp��Sxn8[XΥ^�TVL<��M�4�.X�;YT�_B*S�cw��'!NE�5ڀ�ş����$���tZ/ᢇ��_���/��������^8�-
��$���������Q��OK ���HSJp摁*���T�Lo��jط�&I�Q��ACxrW��2MKE�ԝK<��l���{F����L�ռq>x1n�6��D(asD��7�$Z+�|�b��@�C�!�zq}=V�y�|��/����1��'�v��$-F�|B?�)&��=a�|^pͩ�i�?�P�n�Ki�S��LFĀ^�q�%�=�r�ڜ������#ζ�y~��؊1e�	�c�Z�[��Hp��=�{3!�3�\�*�|FwG�Ạۘ���i��D�Jw���Q���C-���mG#�y
0M�Z	j]�����E�����g�ʚ��MA 2�B%�O=��	�����0���%�C��j�J:��X�%���|g�jq��J(�*��*���0?c[D��3�_6'�Y��$7(��*�ySZuΚ���A
����	�YU�� �^dNQK�F��Z7����i@��i�%
��}��=�ʯP��X�U���U��`a��j;��
�M:Q����vwG���o�wwv���s󠹼�ؠV�]��+�0��6���^�ˆ|�U��_-�W�ww�r
��x��K���:���[�j�
�-H�.���&Mi�@2_��ݬ�s�B��ٝ�m��?�̮s�/��#JS��w��zlܸ�]]����"2�
|l �<Fr߸�f�?
�5���T
�k�%
�����ر�;����L����c5c�҉\"/>�8�af��=�}�j/Loi_.h�3���C6�o�I�rT8��
�}y���nF�痧9Dxl�3:��fJɉ��1�@��ő����=�=z�����"�}|��3��L�d"n	�"�W�R�4��5o�����F�m��R$1�mP���x�xa�>=�}���1D��P�����u��驜\!��D4�n
�S���g�������L���o��uF��iF�
SKj)��7�)�Ԣ���Q�ԫ�B{6v��&���y�;�۰Gѥx�8O�GGx��p���
=nYL-ǘ��j3=�ozq�y+|EK�s�g�{7n�ɸv�9'̯�gv����_l��ĉ
u(K��X�S5v��"��B�P�
��:-�_�
j�zN�@�_��]�Թu�
�s��;Y8�'�l�5L����	Ðz���
ӫEs��*�sv�/[�����eU��3p�A�A�g73X�SïW۫͆0�y0\�FG��/�a+1��P�b�.��$�>�`�h
E�YQ�g_j�p�8?�rt$q���0|�-rs�LNx\�cB,}Û�6�� ww~���у�޻G\D'�ߧg籿���.��/8*�w�,p���TT���z���Y�.��&��Qs�n;{�y)��G}��F��P��[��.�g���(fVș�'�����+?m
��i��V`~4O����p�6�R����lZ�Og��|ꁡ�g����:՞{�x�|7�%��K�t��PK1xUoq����5pkg_resources/_vendor/importlib_resources/__init__.py]�A�0E�=Ť41�;��4C�Z�֨��RAV�_��/�,	k���k
���h,��2�3F�l�,���n���n�3��G8�>�1=�f����k���q��Ԣ�����d�br#YU������܁�F�wܜ��	�Ce0b��T�|]+���iꅼB)�{����^,y��Z���`��Òò��b�ٝѦ�J���<o�ڡ�]|PK1xU���'t�6pkg_resources/_vendor/importlib_resources/_adapters.py�XQ��6~ϯ�����k�+;��p�b{C��ZG2$%w�a�}�d˒�Ks�~Hb��H��(3�V�S�ƒmĖ�C��e�ض�YԴ.T�������mz�W�~�ow��b�pc��-�~U�����v��Z.���=d��|���3(άb�=�{`G��ͣ�w�q8Ep?*�YY
)lYf�z�@���m��÷��8���.R+�鍓H�8.u���;��Z���{ԒuRY��	�X}���m���ށ�Z�����$*�E�,^��p��p�Y?��kuh�[��x#0��󢔸v��������(�fU�f�Wkv�����/��3%j'�6�R�I�v�c �M���B��{��0����~�Z�,H.��oD�N$�V����+�<�����3��Q�ղ��>p���wh��igj�!���0����R�W��e}ژO�Ӎ
�#�#C��]��Q�����}�D/���
�w�.eV@�M�96��E��F߷�9%xh��:��u�ۋ�� ��Z�y�!x���P������]bJ`�+�y0�Ƣ��& �@T`�ey�xjm�8���"�2�\cw��|@%C+L�����b��|�qSR��m��7%T�@a;����]G�`�ǹzN<g��A�{.]x<���ψjP~F2a���ɾ�3���PI�1A8���k�p��$�zxv�$�|�5F�b�M����<��G�*F�l��!<�p�}�>6��>c�S��y�O%Hק9:�1��I�$o(���W��yO{z�9x���/J����r�0C�`�\����s���k�k���3�N��b!����uE�-�vi��
�'Zg?�73
{�F���'��΍ŷ'�����x2Vw~n��U>�W��a���ڗ>�."�հ��������O;�d�V��C���W(!b!�z_��7��[v(Ѹ��,�~����x&��x&0�Y<5�P�7��<#7b��v����������Ò7�1H8��^6j�=7n4�ʕ_�8a��ܸK7_w�K����0^2=a�f��%�������c!O��뤅D=�z�CkN�"��|nH��/��q��Mt�����{T���\�����PK1xU0Q}��
4pkg_resources/_vendor/importlib_resources/_common.py�V͎�6��)��al`��Emr�6Xl�C�MϨcK�$��軗ԏf�
�e��ȏI�a�Ɓ���Q�c/���p;�c��&�8��Y����[�\F��ËO����:�m�CI�����-� R��I�h�d|FѢ�Ë�h��ɣ(]5z ���و��#6Y�I4'q@x�|񎕿�v���{��|Ͳ��8H��A�x�=�|,�!��
��,�����сX���΃wT@4��2�&��D���y�*��|��҂Q�/����'��l���q�98厘|�Y�5��@:�W�)7�g�F����b� �����4GlNpD�Pc#H�8
�� �tMU%
/^Uy��>�Y(g�ihG��D�vdV�t�a�Ol���E���S�+���hAiv�6�잓:��sX����_�Ѧx9-�@~�1���aR#�e�YZU��Gίp��|V�����������	��M���-J��5V���5#���Jw����+�����|�X���Je� \����R�+�R�U5x��ê.�k�{�#�.�
�h���"`��R"��B��<V�o
�Z�HY,"�&c2m����Q�q�<��2<w�<	%K0_Y�9V�n{a�0��:S7�v�+~0�ܸ�+�t	7��n_[��zʶCF@;��!:�WT�X=K�8�Y�My�W.�efS��e��q9E�o��bn�`�S�ɷ��nfݓ��Ǎ"	�Oto��Lba.h%�AOV|kG�c��e�Ԕ“�v���B���^Sy�%�~���Y��>K�곍�F��|	\��8W<�	����dy�ǘ�+�E~-�|�my6�a�-��b�$
��V��A:�d�}ԟ�.�6�����'߃ލ�{�4��V��P��9��}Гj}Ul-�4���_P�	��5GOa+O
��>z�߫���Qh|�Fc��ҡ�pE�!�‰�(��A��u7�ڲ�����s�CyP�1<H���k��o�=~�*4<�k<�WI��忶÷�d�PK1xU�k�hw�
4pkg_resources/_vendor/importlib_resources/_compat.py�VMo�0��W͡.��zقuXVl����n�]Ŧ!��Ir��׏�l�v�/`�đ��G��r�7�~��ãHlK�-�e�<��iKn�R,�\�-����`�?4'���h��Ό�P��D��O�_L��۳Y�<�_Q�Bb�� �
���	�}�3�Bi�P�X3F��K����}ǚ^�b�X몰b�I��t×���C����W���E-��<N�9��@�4�J@����ʪT��q����E6�r5��Trc�NswE��
U���3��NNN��<��I�7��R���px���k��6U[��X
)입��4���r-�r�a��kU����k)P�=� ��k�d�Dka��%K�;J��Ѵ���(�M�ؠ̧`JLk]��6�ۣ$��`���.Q�}��
�#tl�m!��b%����D����R�(�;HA�@�I3����Ǩ=�#�Zh��u/�$�
���j��,z��v���2���47��<��gJ�	�u������o]��ZnUVIL�)]'R��!U�!Y��B:����u��F���9�?�'�!y>�>aS�Ps^s�)�8�L��5asz��µ*p�ǽ�M�����[4���N�`���Iu:�H�Zw_�"d� �5��Z�&d+W�Ѱp�¤n<��0�?�&q=���5����?N��Bs����T�wѭ�W�J%xi�u��q-���!�}؞��'�s)�<��]Ϗߘ��^�AC����ьi'��%GЌQ mDN�����{S6|���f<^QO��J�	���o�@�?�-ͼ&���(�CN�Qy[�ġqIZ;�o	��+3>�� ?|V�"�Y���X=q{� �x������ϡ�����@�x���d�%�s�L��{�PK1xU��h�t7pkg_resources/_vendor/importlib_resources/_itertools.pyuRMk�0��W����������[�K)�m�a�ؙ�v��Ov��YW_b�IO�ɩ��Az���@֍�*�(U	吱*�������StB)�S���:�D��.zm�4Z�.zG�]Vm��\��T����I@�2�E8	+3�XI-�c|=A��U�1��֔b�z���9��:Dݩ�g�Š|�W����M�qӁ|��Ґ��ep�8�py�瑀
k����XthOa�Ɩh��FP�C4b(� ���]��\�Oft��b��߄����a˛M԰�-���Se��^���"��&��,;�i6qQ�1I:��-�
���z�e�S���/��4�s�7����,�/����̔��V�*�!A��)ax�Ɂ���'s�Ml�[�#���
�PK1xU�.1���
4pkg_resources/_vendor/importlib_resources/_legacy.py�VK��6��WL����,=\$mz�C� ݴ�E`��hͮD
$�^7��I���C��-q�y|��pd�i��U�nl"Â�:ᶍ��n��(�	��z�IRݲ�� 
?)�U���4�ïZ9|v�hr�E*a����pG��F�bв*u�j�$D�H�`�{G�w������3���huoJ�G�I�TXC���R8�R�4[$@��1�bgDg�̋��uh�al77�;~����/�%���'_X[�Z)��j��=r��O��
�4��CA����X��a�\g�y���131L[:�X��R�i���7dкyo��b���U+�p�9c�g
>�r�6%Z���d��$?Q�6F@;�
��ʭ�,5����ǃ$���(O�\��hG?�OiӊF��+fc�?1
�<!�u2����C�L��@x�f�lo<IgD�~�%����$l�0>Q
%1WP���� ��!�|.��B#���.$���{�A�r��ڡm�
�5ҥ�Ѱ_��ȁ���)�3F���~�?����A�fO��`+����8a���P���P�6�L�m_�����E�30��b�c0<�5�\������V��̈�1^q1`�Nc[(B	E�2��SeP�eK�fC�_F�v_�fO�u&��a�P��&8������n�F���͟��Q����`�'���g?M��ifGWH�H�	��e�g/�{�ǂ��i>�^��2�%�k}�&�?��u�f�BB1v�s�BO�6r�7ȷA�p��Ss+����,�B9YRg������ګ�T+��4;mp;I���l�8g���C�}��C5]ԧ�h3�y
�  ��(g�H��h�ޅuT��h�׎���@4͸�/n]�?:,e-Kڳϡ��*]	q����i++4���a���Ү��4[S����G@���:��-��|
��p����iZ"���>������(��T0NL�}���c�/�$��͑�1w�G�{�{�g�K�E*ޞB
7���g��c�Y'`�'�P�C;p��o,3#@�\t	U�l����0��u��_p�fo�޾��x�O��8��P	oB�P�m�>�~�����3#�g"ە^r{�a�Ҕ�P(\�4^=K�9x�[o���Ox�vOcn��y��k�w�j�����9�
B�Q������c6ȍ�︌����x�yԩ�'[2NQ��䠴3R��3��y���!"{^~�%�PK1xU}>m.0pkg_resources/_vendor/importlib_resources/abc.py�W͎�6��)����,�E6A��$X��p(q�bV"U�ڬ޾3�(Ӷ�?m�S}�ei��7�#�v�8Ƌ2��n�:����I�Ͱ��f�
��]��]�ێ�(nz�d����>H6��R7Y��
��݂ս)���l�q��)�7���7VW�����Ma��c��B�
k4���i�� 03�d��;b�#L��ޒ
>"��Z_@�tj!��j=!^y�W�ͯ�C���-��(ƕG�f�l�M#��� }�\���^�M��"*[0n�z�2x��82�@�B�@�f`�ka���OP���:�Eɕ��=@�Bf��G�>пߌAZ��piA�M�/HE4��p������R֡yLW�yٴ]d��V#OJ��!ą�%FS9ޠ��џ	�t��a�I�:+�jG0��(�)�2|>��v���D���$ B>.v@W��P(xt�b,e%1���$��,Jx���\wM'n�?5(5�=��$)
����ؚ�=!T�-���5�D�}�	i0
���#��|\�����0(g�uޢ��D���4=9�`h����b_;�C���/▽=���������,�8�O�{�b��.��8��‚#F�h��3b���c�<e���46ܬ���t������݂X��W���CB#R�F+������Eq�+�)p�SD�$˸e����<�������@�ڽ�}z���ꈞÚ�T�i�]�
^K�p^�uR/^I����9[����5�j8��3�)�jx��oZ�d���l�ٸ�Z�)�şN���!M!v���8Δ �=A�˖��X�\/�b�.q$c����NWgȒ<k�@+c8Ш�htjLi6�y����M��IMK��� ����X%��K
jj\��5�O谼b� �A4G�����K�:Y�	�W���i�m>}1���h'8�)��(�ɫ4����B��E�o�$O��oI{�=������d��(cs������a��o!G�d뗧�{�YJ2�O����A�s{�,$܈���G�L�2�t4x�G�7 ��!���S/3���F�վV&�d�=����j���{�=�r�R�^6��2�=\iNЖ8���g9��Ŷ2)��|��PK1xU�D���
4pkg_resources/_vendor/importlib_resources/readers.py�VKo�6��W�AR��\ @lSE��b�C��BK���TIʉv���R�h�.}�j�E�{�����q��RB�Vv#�Q��A�}|�=��lZ�;V����xT	�i-m|9(���X�jݡ�(��B_�ͦ�����f襨�����_n~��(F��$��GӀ�敨]IN�a���%���	o��d�Q�o
����N�L
�
RUB	WU���Ԥ8���T$vkURy��
�6��f�j&O��Ldz�v���	9��3`v����ɜf���(~�YB^�2_��wB�1�P+��8+պ˳ާ�[g�9����C/�)H녓���hbn
v��d�:�2-_��?�;�愷��V8Apɳ2+V}4ЊG���ϥ�^���ݻlDz�Y�^�/���7�Aa12,��RU,���;3.i����(O��fx��w�{�1F�-�Lra�O�k�n�/�� �}g���®��^L~�����}�~=��D���p;eB(tf�D�t�V�ã@t�@?v��à�am}�Ċ�>�5؂Nt��cpӡ��&>
�E�i�w)r��a�N���*+TO��}��N�#�2ݲD��{$8�#���QY8�h�6	"�I��A(����xm4�¥�6J���v�Th�K(�=	��=�C�QX�G��Q�A�8���4	�j9�qi8�|ׄ�y�Ҍ`��yʝ�3��KwE�Hq��Shc^�A٪���]��Ғ��@+�p�>iB&���b�X	o��9���,-Tmqn��ׯ��Vi�6�Vr$��iY3I#n�tT�~d�n,I�Wȅ�����d�x6\����"Rq�^ǫBɝ�a�e�h�tM�:j����݅ʷ�G�|B:
��fk�]� Q����_�������-�Z*���
�6��,��#��m�A��r���
�2/C��cf�\z�t�wy��)E �2���`�T$	�D��A�5B�<��h���0Ԏ^>����e���hB�<�e�!��hW4�XU�X�ӭ�������8;����f�W3%G�K���H�t���,o��G:}ʶd�]sE�Mا"���H���5��j���l��g��"\/�-}���&�N�M`�5-\���^�e��S��~v�PK1xU�c��3pkg_resources/_vendor/importlib_resources/simple.py�V���0��+F�e#qEZIJ�X	����j������ۥ�؉]'M��K�x��̛��Er'Sk�`�=kXK�|�j؞5���Ld����*��ex"o#e����-�C����w\�:���k��&%�x��{�W
+◯L˝��N��jPk�F���By��6��,G���e�r��][D���b�w\���~��)��^L����+mV�l:
��Vj���GܰL�f=���6�5d9\��
+���+�e �`�ys�x��jK_�jAa�e]� O���le�V[�Ԋ��Lm�~�q�ӟ���W����b6���E�{�]
��TRX�����j*Ke��L�Y��3B#���x��.��E㪱�����O�$�\��pt���q�p�}]�yî��'!�=��u��Q1�S�������,-��ի��G}�~BQ7,��yҩ�yB\(��Ҥ#-���,�C;$i��a�%���z��s�E��:� -\��Eׯ�}�|�R�#;��k*ƙL>��ؖ���#6:���"neͮS���F����'��P�[b�U�Ӥ�
��W��t�����nv�AsY>�?��ŽĔM���yc�%���l��&T�5��;ax�>(%U��Eay�^]V1NG^A��D���$����I���h��@�}~:�[��ݜ8�yF��p=�<S='B� ʉ��T���hd�N�j�R�ڃ��|Rw��`�Z�f;4r�W~"�p!#����a糭s�az����qt�%�?[�=%A����D�rGI����s��������zT����Gs�bt:O�3{��j�R�\��V�ʤH�J��{�߯�q�S�l�Eg����N����w]��m����n��\�Ϩ�t 8��/PK1xU(pkg_resources/_vendor/jaraco/__init__.pyPK1xU2& �
,'pkg_resources/_vendor/jaraco/context.py�XKo�F��W,�I�"��RP� M��E�i{0eE�č).�\���3� ����C�Z�|;�ov-֍T��v"�S�-%sh��\�v�����\KY�"��RTЃ����%P\K5�L.��=�y�W�&,YӵeB%�&?R���u�
t�-��.�Y^���4+Z�}����;��5���u�M����\-a�^ŝ�RZD��3{#kH�������u������@3�!S�x��	����
��L�\���QV��:�{�P��^���̯v�L�$b�#dMH�����ѣ�u
�0#�}v��-����ze�z;��#b���!�;����2[�j�
a�)h*�Ce(��>E)��Ѳ_�ZG�o��gCa�~J^�C9c�!���&�m	U5{�:��O���x���h��k�M��V���b��ֺ�]Pdͪ��P�f� C-7$�
�K��9=[�
ZZZ��(������/�[��NA;@cyl��j�-���mKP!�~��6u6Lq������D�}�u|~�᪍��H[��6Q����n1�wl��F��/g��@�n)jhy��xw<���%=V�.��Ţ�u[��q6���w$�x&�%�y�b�/e��g+0�����!������Z���g�=1Ts����q{�3�I7�Tj�M	�\�ijj���s�J¢e;,a޶���"K$�E������-�~.�B�D�+��j�ͳk#��MC2C�u��4������w��c���%J�&�n�%�輴��S�G�q5#%�ǐ:N,JF�`-7H�vdej��A�_*�oM4��+z��[�*�R��õm$=+Q�5�x��_�y�a�\Ͱe�9>9�҉b���^�B�㑷P��K7��hC�)+���\�f=�A��x��s���d򅌷�S�d#�zك˷]�T���)d��.���Av��4N5d�t���es���
k�J�=�d�
);*W��Cx#��Ɔ
�zv�]W����W1,yD/{���v6�c�!.C�.�h:�"���@Ylꮪh�6P�~ֺe�
­.(�^w7��^Rn�c��86u03����w��5FĮX�.���ѫ]
b�+ތ��Ž#����ɉ/XJsLx��p:���v.�4��L�y��J���6�#Sl�uoT�e�����O	c�Ǒ��u̗l�`TNa~�1w��Ϋ^)%Ճ�b����]P�R��g_��#�>����ج�Z��F��4�)�A�w�>y8J��\��89�������
P��QD�<n�Z�AQ��~�4	�$��7tBXt���MB�6��V��%.ޠ���P˼_W__���PV�qqC/����]�s/`�s6f���9E�QS<9,gĴ�F 'd:�?&ڑ��ƇN9�����	4�g�ɰd�3�޺Ѝ㐲�ƙ2#��s}��J6��owKr��*m{�?���3�fr�^!HL=K��G���84=CW�����iKs�'U^	nn04��v�Kz�}����5��Ԙ6�D�Y�A�
^q��4��+.Q��-����x�K�׈s($�>ɃIB�P����0g����F�Eۘ~��{�h�*>�#KK���-=\:��a���5�Ц��GR�fM:�<�gg�P�4�Fu��.^
z��z��>X�V�_�W��A�>T��,<LV��,EY~����T0O��E��bqp��ki���}���%9<��-�\[1�G����g�e28�]���{����A����L���)��*��{�@���oPK1xU�ܱw��4)pkg_resources/_vendor/jaraco/functools.py�ks���@�G�8�[wts�K�͇<��<!�1E*iK���>�(ۙNoR�$�žw��u��h�ySץ9(�CS��{.*�V�ƽ�버ע�:��Z���Q�q�/�L+S�z��Dm���j��v��"*�{a�}�e)g�J�5,���۵����x��Y�V��}��L&��g�ŷ	���v����p�&�:����~?��VT�j�������2�p��R��T���!����H{~�r�
rT�	��	��X�j��\UMlɜdY^ϳ,I�t��d�g
hܞ<�T�퟾���N=�4�Z��Ϟ�ʲ~2�Y*`H��6�g�5�@��h4rH�v��E�5K�l���Y.�抿ǛTTyq_4fz�m`l8���X`
P���?�f��͛�D,j-6+���U|���$�zs:�H�������;�CO���󞿿�?��^{�!Я�y���Y�Y�Z5���F��%&GGO�t%���,|�s��N��۹��S�JmU}��e�gs��ұ}��
x5\�o��d Υl�SQ������
�Mm�j���f)�5���2��'��֬cc���7l#��Q����_@��{;����GD�2�3���p˰(|�M��x*�%Cq�����heSW :�8`��j^k�(�̬h"��V�G`q!'�[ڰ��L�^6Hj���L��_��+S<*�U]��iЍ8Y*uU7b��I�0�̨�Z����$,�!
$(�θi�V�啐o��p���~d���ӳȍ2'j�=D>`��Q�-h��̜�Jj^�z
�h+��|T9F��l��얛�`�	==���ߟ4x���dD��I�L.F�8� #h�-�NF�N�!o;?�a°.z�o�����X�~,�!;�R�܉�	�V�� �Ƹ
�ll.�ō��]��k�K0��r�U��"v���R��_�|~r��g����n�����O�M��4|kY��(uk�KR!����J�h�4��S�$�C���F���	��iה��5`���σ�l$D�b�6d}��0ac��3���=D�h�Zj	�y%���|�r�<FY̋��N��@�VڀR�k���̯�t�"�f�Ʊ�Ɛ#L�*����K`��a��#�
z������
�7�iAlT�Hُ$}�D�Nx�7Sq�3n����
$YzC˞�%�]�w�O?}��P*
��M��������G�=�����gj)X���>H�,,<��^����պ鐱nAd�����W��1jf4n��@��5KI����K�5��|�6?�0֋�
����V=����5���4ˀ���̟�00��bW�';��YiN'���  `����=J���F=���+�^<�m�H ���"�[rC���O�"��̶4!�E�����gjY',}v�������!x�$`$�8@�0TE�ت���iR�F:f�O�e�h��b%�h�M�B�W�
7��Wrc����[�c	8�\�a3%t*W�<�Ǘ)�%�t"g�s",�RJ,�,��Е����u�%XU;_�&��G�A��"��m��Q+Y5�ܠQ�گ��(�)�e�4뫷o�u�&�u �uj���[���Z�����.Ύ��J�j`챧�t��i�1o¼eUE��;�$Pa��t$�1�����4Ţ�K�'�
��t8fښ*x�e�p͏]R�
�]:����#Y�r�va-�v:��F�����4�h;'񳙅�1��4�t��c���<��8$��clm���Z`F�U��}�;i`otO���b�6JN��~��vA
�'�a݅V�:'�t2�	AR�#D�]�v@E���^��h8&�ڱ:�6[!]��e~��	o.Meip��gp��ſ��l�?o2AdDnFg%�e�X(M~"e�k��PٛT
���S��A�Y]\���e���l%��@Є�5�RI�Ou$�#����t�&斛-G5ldX	x�c��܃��3�3�Bj;����{�1-���paᄑs�j��05���6�,J�+�$ܧ��
ѡ_�<�7�F�?��P2_#�Y��ݳu]���j)�;����8��o$�).P���>`�O�TYm�Ui���*�{�����9�Ckn����PU|�j_#'�Y��k6s�e�\��:|�F9m>��<d�4v���\�$��d���6R7�$�0��+��A�K��$�P���'�锅i�p�w��}�>�xw�A(ׅ��h���v�4l�$�69\Ǵ�M�V�ٳ�Y&��n��~Y���%i�\_!qNf�T��.ru��B�����
{]�����"���w�օ;2pZC���:��z�T=�׾3�q�U��s�
�]�	�_��3ͪp��
�n�/v���,���Ђ�
5��u�Z����8�{�^֡��Z�E��l��,����t��IH��:>�z��/]�K��=�ۨ���`��+@�]c�C�b]-iI$};(��"�4�A�YG��ȍ6AVw�SC��	U�ɋq=p��]�륮��TzpV&y\��	%��\��Yx���Y�<�2�p2��r���Oe-�8��ZDI?>��W1��
�ݞe�%1A^.&�h���I�}��F��	�
�k2+l��'9g/&$�&{��k}����i!�:��������ӷ~�m��^�O2<r
pA�:{�?1w;��VPN0�T�0��!��֔J��q���$y��=!�1|:>C�R�6�Bf$bb��@�t��c�|š�*���Oy��+1p��HM@{BB�Ȉ붱��6�3�������ɤp��	֤�����ыa��|��	�9r�������Ua���$��dn�+Ԫ]O�
��օ2S��s��8����;(��*�; *��]��A6�kt�]$"�3)�yei
O�=�����:
n��Y��х�`A�)�^�{l��`�bi�o�@�B4H�SZ��J�u��S*l�jA��E�8��q�;!�Ew�#��T%̗x�L?NB��G:s*�����[��Jc��ӎ��4G*Lw�����p���[dp����g
��6W��w���Wی�<�L6x�
���N�C���@O�RY�r`��>��\s�e��F�MW�:O6�1㩦�yB	F��U��۷�6�h�-T��|�B�����ͽ�낽�w܄ɠ�̌�=&Ћ�z=���U  q�7��;"���rD�*H��Wr����ahWyu������@΀���֍CSޭ8{+8C��U@����w16�c�rǘ�:q�s���k`��n�`�}�8¿6���1����ʋD�}'��*.����A�L��vF�5?j���\
���`Ô�rAnO��x���n���d��-���Z�áਆ�n�N�0c
u���w��4kg���tkZ�J�Z:ղ0�;��浢�3��
��HP��[[�mǃ����\��^k`�L�DLw�{���n�7�&~�۸�q9�B���
���j����\K9<��2��|7<�I2`9��;r�����,~�;�8���W<S���U�<�SA��I
߾��*�Z�ŋ�%��~҉i�&(׳
a�>\u�{�pK�s�Ԃ^=��^m���Χ�uw��i�c����Qb��ck�z���%"�1�ď��.�ƙm���.��!����o|��)�>��z�����~�Kjo���H�w��~<u��}�������r6�@
��?G�|%	�YsmV�������,U���w�n�p��.�PQ�(,����v�`膐�@�u���Ŏ9}5���M�\��?���w����Gq����}s���Y7d��o�;��v�
/�O�nӮKGH<\��5���C���sњ�����O���<F�>�1�&��s�?��=S�	W>Y|�U���}�5tkzm��sѝΏU�)��nS�2� 	�D���t(Z��,[�n
���f"�F�b��-�j#������<T�`�Ľ<����|46p�=�|����������Ի+�0fz����'{h�t�J�3�Y׏��[̎5`�ww ��;�yn��n"ռ-e���s=�A?Y���m���u���|�7�=��iM���q��tJ��kt�`��x��Y�]&�����/PK1xU�.ɪ�<-pkg_resources/_vendor/jaraco/text/__init__.py�[mw�6���_�&(�2���s:�8��t��M�9M�=����HHBC�*�Vg��s/�$�i��͙�%�\�7@z��+u��'mUc�4a��[{��M��h��-8���H�ߢ���͗z�6��m�+#�]�x(�v�N�^V5NT���Xq�k�m��9�5�F.��DTu^_��?`�~�u�S���*�N��y��aX��F�u�Q�5�5keWu��2_���늘�|���zK�<:*�B�vn��-
O겘�J�LS<x�T�m*!�Pؕ��F��بfQ7kLƐDMˍmt��j�R���YmJ���p�ٺ-���=����o�{E��_[U�J����1�lT�[�2��̄�
�7JZ��z�������oy���>D'ɢ���H�I�31����d:u�S��CB��� Rce���I�b6\�>�S$7�RCKil?��,@ԐT�Jy#Dl-��ҼP�`�U���B5�^�=�bb�M�&C$��2xT�҅�@ֈ?C3T�Bb	4j$�3�cB�ʨ�h���W;���S��J^��_Z�]�<�[����$�8�7+U1�uUnŵl�dNi�'Er'*#ܒ�*�Z��MY@��S�|Ǔ?�SצU���<m0{��>H���W��*��$��k���~&�7�_z��ۀI�zJg����?�
�ܬ$}�FY�\M��8����`�k��CMVzC�d�^�,��F6E��� mqa�z����ګ�^�b-�*du�X�ekؘ�-4~A�
� T�֪�N kҢymW�+l'�DXF�0@bJx����<���#��8���%m{o��Y���5�'�/�T���N��q�\�\f�ALF�|6U58��btZ��d/���$̝;��;䜵��)���*{��n�0�l2<&�B����h�U�@���U��6�&F����z��"?G�iYߨf2�ܪ�=���8H�CR�~$����*�Q�>��J����&'1��VJh$|�qi7�7�H;�E�I[�C}�F|�9
�J6������0�$�(Df��/�&'�mb84!� �³�,^
�I[n]��z���%��9bDL,�G.�������E�>#]9M|�Z�����F҂�3��b/r�	>*��
"����	���1Z~{�Ρ���<����.�[=ט�em��P������On�r-@�lJ7H)���T����r��e�*Od3J���?	qPV�@N��!&�����%�J��TX��i�gϓ���b�=�]����/F��W�IH���+�l�M�������@�	�p����]�����>a�`�M�؞)#�=2��_��)�2D��ȩa����d��
��]!{��Č9��H��L�"N7�(�ܓh)�^��dfݬ�ڛ
�o!JCk�P���z2=�.��-�H`��ypY]"u��ڨ6�˥����e�cx2X��'��*o�!zS"d�)MNƅ��d^���2Q��e��u�
aO��[$]j�$\.�u{n�#)��ۀ{v§�(�יޘv��W4"x�.)��VHa^�0@�r�,�F����C���!��2ݚu][*�)��H��
$:����D��#k��J
YjT����H!wY�Qӗk�L��B�U
��H%oU�k/̶D��:-�6�4W�h���V(���18Ҧ�%��-RTݴ��ѭ+/�M�PƠ6Ӕ܊�l7��k�\(x1��|q-��%jQbA"h�ԻJ�rIJ��s�rJ��
%ʴm�Z��PD�l�&oˍ$>@:װeTC+�uI�Hb�{��u�v���7��^�׫���>��/�F�5�Z
�-K�`�2oM*^�zt
�P��Z����v
>� ��j�F����k^�0�5��E����s������D��H^�Z*N�����jR:�1�͡���-�p
6�^�+
��ښ���2�:n�d\!7%�J͊ꕮAV0��.���j[�:� ҙKϫ	�纑�z9�
�\��{(���Y/TC��ש/L$��ͦ�o �A�N�ʴ"��Q�}��Q�0��	�f���`�|"������*gl�k�@��9�[���9a�μha�e�A\�b,��.�嬍�I��Aq��sԔ`ٯ>rUm��������{�-�$��D$�^�J��:�;��
9@V���W[�j��y�H^�W ��_Р��4iz��J�Ħ�^J�9c�A8�:�K|��Ĺo��p�T hWI�K��Iy�����u�H��C�����X�V�h���h�jR.j�f>!��`��LhRW�;
N=;j�	/���tsOwK�#N�;kv=��n�i���K��R{��7,�OQ,x9�%��i���D)u�����W�� ��c�Z}��[}s�q���+NܖNe�e˝!�H�&�m� �KfI/G�[
3�.D Z��m�6T�lah8wЪ�]����)����W�z�P��#�a��?��gPj���)�Xu@�R�r��,��B�R�(�/F	$g�n}�(�h���2UO|�����⍲�	=:�>�:J/4�Đ�Rz���iC��%W���|��JQyOʘÞ�Ф��� Ҫc�HK�����#��CU�P���S�g꓄GH�4��G;���t;y�vb0l<˛�ڮVu[T���\!�ׯ:�<@�1xFP��Jv�m���+���;���7�!.��v����&��ߓ�
��t�q��t�A��z�e�i!�&���K��\�۳o^� u�Yo	�ph*���Jn����X��-w�(|qF��R�<?�*���R`�ae��9.�ǔ$��)+XF`����Sy{��C�{K�Eʵ�.^�#2!�
Re_"�<�����O�� NV�W�q���zq�o=��œ��;�
Y��†]�tÚ�'�*�j���T�R��BV�JV��1�d�&m�S(��t�d���d��{��ع���f�n~ϱ�Ĵ���!�ۣK&g�s�Յ<�������O'_}�#�i5a`�
K���ߙ�d��O\|g�iׅ����d�D�-��~��O"8��$��}��s���亹n��S��[��雵aM�n����Wpݓ�����ԛ�i�tQa䈞�s�?YĠ�H�l>޿ylNv��������R��u���w��[q�ʽ���~�tn��v����Q�B���>�p��v'��L��#j�_�?������
7J����Y��'����j�+n�N�;����yf/��!�;�|���[���A�������;�rD.k.8QFb�+$F�T��_^�Yzow��>���4�=�dD���t;N�
;Ŀ�$�]�u�8�%7�Bv��6_)��X����.P�p$�6
e"]6u��<v���\7��O�p��0������P����н)o��d��c#<�2O�4F�l!P
�,<6��=[�u�����n�w߽��U�|��μ���X���0=��Dy�k��Y|&���xn,R�����6�
M����������q�d��؊g������9wy�D۴v�������8�g*X�yݳy����j�#�}�����ѪA�܃�A��B")}��AN���ϯѧ�<C���5��ޞ�z厥L��c�ڟO4*I�
>8�7���$jF��ބ�����}:��5�|�/�+u��VM35�4��Y�����n=�R;c���|�'�)%�<�����tϡ47��zc��$!��G��7���+��s�&r|<�B`�Y%�d�>bN�3,g�r8���Ў�[���Ԍ�}6\/���vfI�d�F���hWW�&�)��_��^VEUWp5�3+v�<��)��y6,��3�w�P���r��n‡O㥩�9
`���iE��"	H
�:e4���/�#�+��%���;DA�Ǘ]��<����K�I?Dy��;��MP|�h7C��#	t���.�ay\G����Ǻ��+p8����R1��-X�=OQ)�9��	8d��w��'C~l�t��^p`��6μ��o��۶,{�7��aZA�=zNܗ�����z>b���y������]�"7�cF�w+?�"-@ *0~���?<���B�0O.Nx�=�3O÷!���S�Q��i�{RHt.<������S֥X�w�B#�fC���|�R�\�$O97Y�p2���E��f�ž�η�6V���d@�^]"�ҦW�X�:�Ҵ�����a^���⥇�PR�.5w��'��w9v�qNŁ��-p*�:G�FU$O�e�!sk7��;!)�W�|�{���sYՕ�c	s������s�̼l�>~��@t<Q%���t�����q�N=初	�J���C�e��1 �'�e��O>�����_}/r㝜R�p�<�g�x�e`����(1��6�8|�_�XCҚ$~��z�X*����V��p�������ﴆ�Y]�Oź�Vz��7���xW�]\^t7m��'ăw��e��G>r�e�[�;���M<���z�h�C�8d����E7���Cq�2J�"y�Z���#���1�$�����6\�A���
|� ��p�R'�3@���g"Ӡ�ESo2ϪI�{�^b^�����q���r�/E����3�.&��Z�~02�a�_���vs��g������;V��(J���q��d�|y����N�<����b�72�8T��sz%���Lu56��#X����H����?��>�t�x�5�:zGy���o����΅U42�GHr���L��_����7d{
�}H.aˌYQn#̖5�h��@��Vs�V�ï!H~En�N�3~n���~��{��3��>��Б�J\�,�#_���ѕ��4�����njz��|�ҵ�/N��^u]�O�5ڨ����~ol�9'�E��vV�
�o�c��PK1xUaʥuBS0pkg_resources/_vendor/more_itertools/__init__.pyK+��U���/JU��-�/*Q�RPPV��/L�J��&g�cJs�Ǘ�g����+�*�[���sPK1xU:$ν���,pkg_resources/_vendor/more_itertools/more.py�}kw�F��w�
�}���%;�hG�c;���&s�f��� 	J�H�@KJN���WwW7�$��pu��Y]]]]�|�-�&�M�"/��G�VU�I�z�-��,�$���]�d�(Yf�t�n����?�Q����cxh*�ŊEƅV�bє�ڶ�M�&Oף�ʖ��w[�ۚ_g�Sp�UW���{�Re�u����r��r��G�Q��4/F���@ݺ6�`z�~���*��׹�yU����:_�C�J��I�M��Mz���L���o�벸�j�5�!o��ڌ6�ێ�U
`�0�uY����p�2S��f�0�>��UZ,����_�!�+�UYm�t�ͪz2�v�������z7%W��k��������:�{�U5�<TJ��G)��;�MY�MY���q�-�m.`�n#�Z�S���6ͫۼ�W��z�j���L3O�U�M��z=�&���齘C�o��,]��Z�`��٭y����7�t����UUV�e�|�W4�7t���'��}=ͥz�!���|���l{hp�.n��}x�+n�e�g[�gy�ح�jZ_竦��as¾ʼߍ����E��w���ν(�l�k�ٔ�@��J���.����/��*���I��@�ju�% �f״_V�|ר���K�k��M
s�-6D^��Ս~���[�O�U���fw�l۸�Ume�6��j�Y�E,��l�u���Z�}䅐
�M����G���V�����FZ�Lj�t�Ե�.�
Byk~m`�M�٢$��n�|�1ywO��)Ȯ�&/�r�_Es=-��>Rh�=�JhەD��S"w�aY����t��Bg��d�,���F�����J�^M�/:(�Y���yʑf��Qy�Q�)��Uc���֍�F�rڞc
�f���t $��`A��6%�n�װ��i�jZ���<�=���qK�����֮�WW�={���U8��!�2�'�2�}�G�t�or�W��ȋ�-�.o��M�-ޮ��
�}���b�G܆k�FR���6$�d9�yU�˅B|H�~P�V5�����]�UpΕ�w��}8�˖ꛣh��A��;�k����5����p(�$CSr��R%k��uR�ƶdX�Q���/�D��s1%'��t�<%�Gɧ��c0�.Lx~a�\r�/�@3�i����>�ְW���6_��k ��*FJ��*���N�ٴW�A������:����Ok��i�|v���+�I�-�]�%i��(/B�u�Ok�e4�3d��ft�d�,a�i̍����%�&C^y,D��fo�]6�����8bvf3��<K��-��vU�Z�QVH��ċ��yN_���gCD��f���r`���zf��
��k���)��7�~��p��c��@聴\�2�n�q�T��y�5o#X$;%���փ1f���<)�e�5�.]�C� p���a車Gاip�6�Y�NC�15�F�<��hķ\q��Х�G�Q�JC���<&������c�8%f�y�J�΂�ic	������5*�4��7.is��/J�W��S��y���+2ٴ4�v[}�[3�ݗ;�[)\�
�:��eE
\�QS��T90�����w�
|����s`7���z�����t�z}����2Y�=^���]��ٴMu�B�H�\�%�5��J�]$i�d޾��p��Ql��3����G�f�S���V����k7aF�2�?�K��f!��3H?p��a���A|ÜF
���K'��q��]Q�\��	��8�\�O�������er�4�����o�����Ӽ�w��g�O�ۊ�Fq��i�Tj���݁������� �?�;>=�����q�N2���������`�_
�LpޜOvʲ�o��%@�����L�z�t�koP±����G�j��ܿ%���gxٜrR��}J�����>�����q:�_�/<�.��]V��n�z��O��;���	���@��NkW�*�"�Y>�+�{�m�.˛�j�
��b����$��������g3l~�X�3�����/=�c���1�4�lIM�&�?���8y{
��-���H�̈��qL��`����`�=Eҩ����z�=��l����@o�i��0�����\Hp�섛�������mpw�no�Y�g׻�5��/n���h]�0��9����,��%\�n���u��UM���JyA�ez��.J���Qs�	nT(49�]���E��ۛ.������H�l�9^)Q��$Ǹ.2�M��5Kx<�v��W��?�St\��5{��-bV�����L��tq���m�X�6���e�f�^(^Z9l�|�]�(���D���vK��Q2�ѥ2�M+!0�{�M	�ۤ9��|�Y��jᶋ��Mz5~���]~U����5�K���m	W�lq�[i3l2oX��U;8�h]>��9�=C��vܑ�R�7�����6�&������Kwu�/�L��f:���z5�;[1<�b<�#��E�����y
�.P1�]Z�%|���r�.�1��Ӏ��WQ�dy�@P��BM3P��R�DmR�����'���$�O�ͤ+8(X$r�lՌ��b3��Ȳ�!�:6��	����a�Z�`���;��`��<�B2��xl�v8�֛��
�1#AtK.'��� �/�wM
5���9�)��e�k���-�f
{g�d�d��[MdH���hkY-4�H��!��-��@6�B���`6�B��0��8f[�$�!S��O����˪��cM�q�)�����^�	�>��C)����V�"C�s�ߔ5np�o�E���A��@��'޸��ȁ�?1�(	�Ԁ�H��<l)�l����=J���P{���:R�i-A��Hu�)ߩ��C�E��I�uYm�u�#�p*�C��j�'4�&C4���̘��}@B�Ľ�&��H����I+<o��&�Y�Mx�/qDba�5Rv��t�"y���]#;����������#l�}ZzZ0�p���1�J��x�gi�_H�LS�[��8p<^���3�~)2�/@��Tcrn‹2�D����~�|~u
�.��c�}
���ӧ���8��n`���((��*g����O�)Ÿ�>���̋f�g1
D�����4F��,��O��/��CUT�y�I��Ź���'��n�#hP|r����dz�KM��� As�s@B�,���ǥ�ܝ#Lܞ�A0�Ni�{�T���
t�s��Z3cĬ�gë��/0�E�n�$ӄ�y�Qm?`�X=����t��k4j�?�jԚ�h�H�-��x���+�����UO+�{/�~�/�~�;~|���?�P��}�c��%7Y�E��ok�B'7MX6٦����?�y��wxDZ��l^F��Th}@+�n�M0C@ ���5;~I�Uި�� 4M�7��mUQ����f���CS@���B��PD#(kJ�w�1�rC���f��e>CC�~=@B����l��P�"�>a{��Mp&�=�:�Џ	����oY��T���<��?,��x����)�vM2�h��v�}AԴ��9�UL�f��K4	��α��s��8�r,�
�Hw�v٦50iGy�V
'B���:*f7tf���v*e8Y^@#/��H�A���t��D@�,)��u�ք���d�<&����{�_�V��/�	�Ud/���ͦ��yD�$���#�Η0�bo����WT)N�,�b{�>��Q�/�1 ��]Sn���E�
I��G��N�����cYZ+{���پ�Ne-��%�9�)���UW��٤����9xB%�\���͇�6�ȯ���Y7IV�5�o[�nƽ�x�������Qҧ	b�&��suҷ�
r�2h����s�WeK%?�B2�
��������I�_, p�8L�El�%x�[����V
�
ČHȃt��T
�)��6$�/!��?˯�3���!�j�(ſ+�,�V��-C#��-�"<{���t'{-z��p1P(2��	T��
���h�aA2`�O��nw�:��9������3
#%$���j�[�:śk����$UС'\&X�x�Z�&�s !Hc�Y��F�U�V&�x4p\�7����
����pS����3qfSn��!7��2o����wY��-o���'
��QX�<99�t���\j��)���o��?�[�Y���4?� a�)c����	�F|�j-�lF��|n6#$�r�zJ�q/?2��Xa����R�JaP�9ܝ%'C`�Qi:9b"�18$?���S���3X��������28�"D�i��5�e5-��5d@�)��J��=m�pz)
����B�W`��T.Qq����?:�Y��U�:m�=���2����:Gy'���˘���)���M��Ž�J�|�;���>��'2{��0����h�{�2_�I�i*Ã�h�f��ᛰ�r�q�x��,TYh�;`ޔ,��Q<���۠���Q�ڌ�'K0�	o��`���'�240N�%Z���x��E
P�a���=B
y�w�F���E�"��¨�U���|;ACQn��d���W��I��d���J�B�z��&���s�Sً��R���"��h�}�8�o�c��`�� ��M��L�D�E�!�n�#xuR�]��;�!��,����7���o_O_�׫�x�曯�_�~���W��8\Z�97�3�N�X��@��ط��|E��!��YF�{��*��z������5�v�Yہ��|�o�uZ����/���BU��C��C���ŐڇAo�e�~��ڠ�x~YPi�b��\�y�%�	�?�Aq
�)A}��>��[`0�ۡ�;�������7.z�uوi�&��	t���ƠI�^s�B`xG�6c]/�萺{'M��{�$��Fu5��C��ö���>\TkC4�n��l{�s�m�>�b����l�¨sc�|�m3��}kHGo`VZ|���n��(��Cn��+W�<|ܮ&�D��'��Ԉ��Lz�A~�C��H>}��^k���(�K��Z��7-��vO��)��jZ����[J�Auc���K�2׹����rP0N��h[�m�\�/��0v ��5�{epzYf5�K�
�
��D�L{�ʥ�)�H���"P����9j�Q~w0kw}������I̺�+�w�gm�a|%<�f�az���y�iև|�܌PDhf˒ce�u��`/�Q��gx�j�{�d��t'�C#���p��-�Oeȴ onLV�XvS���2A���̀k9�58�D2`����$��ڭȞ��ď�{2%��""�d���B�a,߲G~�1���*���l��@ �fɼ�I�zU��D98\��,��C�>
�l�#yI����I�G��d��m?G}��љ9ؼC�����v?i���=��:�Fd��n�������A���wX~�� w��b��&qA���
���y�Zj!�P{�p������1���Po0:��b��b:�Q�݀�
[��>�8��񑠼�d4�g/���|�_�y���"ق��&�M?:K��
P]1de�tZ��
���mz?&9��QX����+[͢Kt�ܡ�ыd�U��34I��_�.}�����Sk��p�t�`&�v����,5�K��C�4��M'H�����Ab�?�?f(��g��x	4e��]�VTW���L����4��hNJ��p� +Sc�JdV���\
F����|�,p[�0|C�?i!��8�n��Ûf�s:�n�92��}"�O�G�\y��X_�p!�3�y;��o�'�YF��?��z���^L+�-�&'
��@r���/B�@��~��Wc�E�Új�H?��m{q�_&��*]z
[��G��e�IgV�`�{��0��"�%�Ǚ�apQ@hH6��T��6]�?!����]r�3^��3�wmP�k�
���w{�����t��JiG���'�.%愱h���!��Y
b֋l��և-�n5ܽ����4w���2d�u�e�����@�69��8;CG��ڔK2r����6��e�^������~��o�h�ݠ+%�hT�6�-�I�5���Ugn�d9�r&���x�e��hq<�&[P=�/��ۯMp�-
�*����KG�������<���#�
^�d�`�Mz�ov��t�!d��>��b��6_�F��\��ϑ��
D��F�J��8���&4m0#.��܂P�m�T�y4�̑��B��ԩ��Q��a_a���L^�l�s�mX7�ɨ�y�%�ޞ�a@h��s�4G֏\|��?����0��jꜛo���`��[9�2�[;a�}|x�ڝ!��S���m�Od(L�+G�u�B�=�&Wn�g}�,���ڶxE?�1wK����Tt���3;���tվA�a��4e��@Tɟ�i���7n���+4"�tv:�ǐ�t+_XN��C��h`�a\��~�*G	F����7�ŷ�*s	I��0I7%�೘
Ë��}��ϳ�6F�.~�1�h��Q����ȿ���3������?�art��,������,�BS$��<C'��	�d�N4{�G�9�`�X�L��H`wS�Uп��D있AR���X��
^��cq-G�LF����\dh;LÁ��wyp�N/��
HhZl��A���*���/��;��y�[;R_�$�t�j75���@���7j�cE�����+sj���2<���$��p�x�<��Ut,4%�޶��&�B{d�_�H~)�5��!�sM����\M'�3�Fn/{��ć'��%�2����ᗽ��R�m��'ŧ�ǘ9��I�@Q)���,��mg6��_����^wgc�]d(9�_G�x:W贮�EN�V*P�'�+?N�VY��f��}����S����gi�l�e��k�,��pJC[�V�J�����w����,:-H���T�����B3�=ј)�k�1���5���[euV��M#~�����n�ǣ�~��*��s����,�f���/-2,�n��aQ��e�=d.�i}M<�ٖ%�/�N��"������
�Dx�S�1�w���I�}��M�suV���dc'ߡ+i;_ɷywIG�Ϛ��r�徴<�N��t���@��ri�N9�*���#$&Z���,��\���{�[ �|��M؟��Zb��>.`�o����#i1�5����|RU$y�~���\�{c�*C�k#\�Zw�-@�bI�Oq��N�Bbm���&w�C��\�#_g�M��=h���E��{��
��W	,��86Z���4$�+�p�:�q"s��^m� ����n��)�Ҝ�NB#M�u�e
� ܔچ~?V��6�!|��~A��{@Fc�KU����
˟$f��N�b�e�o��l��[#��쏩#�ܓ}�Q���H>��.� ���p7Ho��!$��H4�R�A��&G��(1G�@]Hzg�)Ε�h_�s3u|�gZV7��UF�۴;�]��F8P��V��?�7���T:܎UC@�<:;
���!�#�2,$D�p���v/����]���S��S�h=%��m�-�ԅ���P�wI*yR�#�+3*zgY��w�X`��@8A�Tb7L0�[���&*��V�H����
}4Q�`��~pV�|�:#�pm��	~�E�b���@��ˏ;ÊAX�n=�Xٹ���D2�#*�r�d�룤G�k�*U�H�t��E��P蓤�la��1a\O���_���>�0�K.�s
8ϲ��/�H;LsÎ�4���Ԙ�GH1��η֐v6�$�)����&ho=WT��o�[�[��$�����@
���.�RA��k�0'=�y11�a[�C}ڌ������F���=�lS�v+:�~�
�
�m'�m��J�uN]��+�2z&��]��l���Uq��Fɳ�V�%d�B1~����*U&#�5��v�� �/
�g*�w����5�uID_�L~E�&�?��#(`��Bnrb߅K�*3U�4 �a�5����K���9�N��Nj
�������>�3��>��40)EV����,��\��.�/��%�C��	�p�V��|�;�2qg[ɿI�Ph���S:U�d�
�e�+�CN"1
�%O��<�?�߅@s�`gIXY�aܭ�%c�Գ�K��A�/�����]��
K��9i!�S;B"��Q��(�1{�V��#����s�Ԝ/�x��n\�$�|Ok)�s��gC�rX<R���-:�^u.�
��p�›/�0B~�_�N�`�X�X"���*V1sZu�W6ѩ����%�?&�cO�Rz	H�m�4�	��:��)��ڨ�{`t��#�ù��_�N�x���Ȉ
�O4�@$I��2�ÿC�K2��3x��Nڌ{}���
hX��Z�A��g�)9ɊL��-�<6h�m��?/��}��V�����?2�e[��C�p'��R,5�B�Ke$������l��X�6�v��mJ�s��>��q�6@��,�Q6J����rv�:�%f�2�fS�3r��as�DO�yЃ�� %w�%�,<w�!��¸�r��6y��v6(�%c��9�9�p�%UV�5lk�
W�Zm6���fC��ܭ���#�P�L��a":�h"�h6�Rs���k�_46�S����W^��'5�	rإ�7�,�zV^�s|��oe��U$nC�\[�q$�u�o3^�.[�ҿ��#!�׻ɂ���A�Љ>e��b�!��G8C���cB,��)�+�rM��k�hT�r�Wi�RV*9�̾db��5�6A@B�
X u��z�p��<P?�^1AB9�`'�-Q1�J�b�Ĕ���QFj9�|I�rn��n9�x�\�W6 �W�A��w��/(�l
kF\^��
=nzW�~a��Q��+P�*����`gSPV�`�d@8��d��gRa�xvK5�{���r��T��r{��Xm3|T��AO�j��[��`���| K��Q�b��A�=�v!JP��t��d6wN���I�7g���E	��8�s���3ib�=�)[X�����ȅX�d#�/���U7��b8�"P�H�59Ӣg��:�ե��H��H�ʬF���`����p�#t�i�m8�����jg�
��"�T��I������bQ�T�CAt'3��.���.��g�1q-琕�]tְi6uJbU�󼘱�=�Lj���S�n։�F
5�!�L���D�Ù7��a<�Q�.hdɴf�d��*�Y��$��)��N��W��£|�X4c�a6�&G�����ZZ�c	���%�^
Y���A�d}7$Md�6���0bh���E��=:Z
�l��K?��O���Ȯo�EbW���q8^/L[肨:�g6�bL]�9) �
�l�	�h�m��e��M�/cG�Od��=i����g�Mj����
�?C=�3���$8���_��;
�,:zQ������yiD�/�֩�N7	�8��Y��S��7���ٳ��$>b�j��=�u��T�=s I	����C���O:�e��Nĸrò��]�nMIG�O�����,�>k���k+R��e��H;6c�2'Cs݅Q�R�c�^���#���Z,qC̜ݺ+�<�5�%���L�:\�#�>v+!U�"*åp}М��X{�����Ee�U�ְ���7�A5��
p��H+x��(%=*����D�\7�T���z�>�~�M��{&gn����n���P?Mbm9oLHrp��Z�$���TNY*���8d�w,�2%B�����ۨg�$�m)
�����]s�5k���z,������J.�^��2������X'D6�؆N����U+���<�*Q�&3�q�IG	1�����<�@F�#k���Z�7B�x�>0q�}r�#��Q��u�H��N��bS����Y���e�[�(�彸ҵ"�IC���W㑑׈4��'����=���vq,��
Y[�2���������A�Bښr�wCY��	L +�`�Ok�(o��Hl�����P�'Ǔ��\=ޖI��̗�X�\8��4�f������ނE/��-W�+g�����@k�GZjw��C
3fF������@2����X���:=k�������:�_�0`�"+K^�;d#�s�ם���Fv„���ĸ���i���8�v�M�7��\�|�����������,���G�2�ZFT�&���dv4�o�H�~�bA��VS��j(j���}�/pOm�M�eF"��[Z�Nr����i�X'�y�����œP*�b����h�4[��E#��]!�왢���a�.?h�4�M�ɒ!�4D^�HF6��]�G����~��\y�f�ҭ����P0�{=������};��������	<ªG*�Cf�VΨrȃ��m4w��VR�t��n���溢�'�^'�]��q�s�an�e���\8�)��MwG$�^�əZD�K��˫+��#Fᷭʫ
�Y�Sd_PrW�S�2;��	�N������*�x��j-�8ڻ:٠�U(&���G�K1Ŏ��C�~�3}��l�����O?{A��lXZ�1[l=u��q�ф'�͖����9��ab�4���y�`�ϋ�9s���az̉�GZR�����sEh�o�j�� �y|n�?8P>�)���ۻ�j�Y��Iy��/��i'�?���`����_Z6�)oJ�z������x��'�1�z\��;:�w-[�ntD#�������`�t�Έ�M���mCT���$�^�C�)K�ے�M�� �F�+�#J��#FB�]-7U7Ȉv���M��ܤT`�y�`'D�t�o�Pt�ua�/n�ME�~H�(T[�k)G��J������]���.)�N�E��X�sN=:��-6��j$�F@�U�O#6CJG�� �{v�LXV��|�+�18>�y��6ܘ�Y[�=A�Ͷ2�ty����Ԏ��?�H�� '�eJN^�td�MBŘ5,`�%�WP�2�ͷ%cC�c
q�d��St���[w*�pf
Ѡ*(!�$��j�.��Gly���-�ݴ�@���IĢ�B8k�Λi�͹��+1'#�;� G��nZg۔�Ɖ�<(#>?��a�L�Ï�s`�H?A���c#eQ�L(2�!
m��Q!3�0X��0�v���xI�\�c�u��X,z�i����]�$C�Eq�����:A���	�X�����E�Pء��׆e"K �eZ���������5�xtR��K�"�8z�,��t�X�C��"Ѥ���(m�g+
ʋ�z�l��U��{�;H&=c=���G��F��Y\�w��<�,�#2p�ztv�~��|�r��������d���n�к�*���דQ�eXWOv�U�28��~����^<an�C��mw=7oM*���C.)aěq��6՛��N�u���2��7E���t�^�%�8�%o���� l�F(��߲c�2)}uI��q�^��ߨ����o�yؔ����3���G��	�AD��0u�5��}�p�i�i_�~kR�F�����4�l�Is[��y��T��2h�l��8&�(���	���OJpЌ�3P�ٷب�%�n$�oK"~�p@c��?���Y�P-��1X���U�qx���-�1x���&�k\1��ƣ(T��=
Ʉ~X��A�6� ����%��v���Ӥ���!�+6����ʡ�f��#hiKm����t�7Z�r>5�����T�ӏ�{d�H��ު*]^��=-����<8{[Q'K6m�t�n(a7�>U�"D��x���y$��~��3
�`��t�c��\�C�P��@��߀��o7�.��w��
I#�7EQ�]�����cx�8k�d��X�'F��ɐZ���]�Qo�>����NG�F�G��9?/}4��X_L[�6,��.q���c+I�b�̞��G+��W�3w1�%>pr���fz��'�"���f�Cg�'����#���UH�)f���ӹvBvq���բ8����QUb�����
V�6�U�%�
�`����&�YV,������8WX����F?����?�����cA�E?ۋ�es���|����7����A��Y�g��[��y��	�C���oW�'/
�c$��)�f(�uU�2�FZ�D���-�nS�Uţ��*$���*Ka�xTdQMmK�����w��яtـCζ��'���B��?A���d�is�ډ��y�.u�B.�O���0��j*)Yir�lI�#����I�/�*-xy���[���?0%���}$1��8��{��4�QY�)���~\G���ѯ=P�*��ȥ�5��T�I���	I�4��e����$j(I�����73"�Nǧ#T:�HCq>t�R��hJ��]�4���[c�`��8?
AJŵb��J��91��?'�šX�X+�[�Q�Ӟ�#b^�O�+���b4Z����s����t]��h=C���O<f����ҕ$L(O��j��/�l�^�ƣ\��IK0刿nc�w喈EX����q֡�n���嫞ҷs<e���x�>|���K�g�}j�B�R1{�F�����C�֓4H[��GQ��l�8 k�}�����q�Y���X�*������A�k$�<��9�{%J2:�Ұg'�@��%����L7qq���B�`ߐu��
d�l��M�����6@:�;9�u�ҾW»
�u@7�k,,1J)����L�N�T
xa���I+>�>��IG�,��?�W�09#��ۮ� ׂ�L;�}ʗxY\����r��
.��������`ר�jqk*��$�I>N��.px�C��J�mp]O�����s%:��iZ�=]����7��zX��J�a�{��tD��+�D�3A�8��uf���`����(N��kE���8�l˜��Ou��9�Ô۩'L�v��R�O����X���L�q�I��<�S�Z�YS���\�N�c8d�[1y	��
ݺ<7nn:$V���������,�5�D��s�,��W�A�b��D�
eZq!�A��1����7�!s�Q>��h�B�Xb��	%O$���N�~&6}�o�a�bm#ik�,���#�pA��ӂ�˴�z���
/�y��T
���n�w�ʶkTLj�<[��[!��������	������I��B��ՅW��DS��P���J�J�)��Cq"ؿ�^䥓<���a��]�h��9*
M;+�_U�WowLJc#.&�?�Z�~cH)�9G�DD"8.3��U�75�2�#y���|��((�x�:�o ��T�Q26�Q�{g���sv������M��70�-��P:�^(��zG�/c;k�a�0���(g�3ˊbăR|j���A{�GX��|\��U�>��+!�Z�k��y���ȪH�ؓR�>*P�e�_(��S�����	���X�(�����3ʅQʽf�������ڀ�C�UAC*���>D9�s�&�]�n�x��8�n�kk�jۅn�5��)Ii$΁��g��v�STk��>1��]��`me��V��@�0@�	G|��[bE�1��v,4���o.��=(
w6��[���r��^_�r�U�͢��j�{��Cq���
O'64y��ޝ�Z��"�27=liDuB�����`D#f>{����ㇲ<|,ϡ\`����7���o_O_�׫�x�曯�_�~���W�������F�t�U�����"��v���{R���8�DgI�ycےs���_gw&�&S�;=~q|��S��#�P�U��K�0ܢ=,��e��X�P�`���&�DN�y�i'��Ԅ��v�@5h�q�A�������_��cA���y��ϖ���1�g�]�Gy�B�!;X���Ž���r�P��ONN) >)������n�q0}�~¶�����
�=[���1��m�)p1�W�!4��n���mF�p�N���-�G�	�
%���2�ƈ3���)ٝ��+X�5e��S�C�(�xw:
�1z�E������v��j{n ��6�So��=:�)�{����;b(��c@��c�t�o}�2̔3��4���C���6klSXY�N�tT8ם���/lR�g
��ӵҊ�ުo�g"��Z<�w�-D�k���`�4aN
M�p��5�9��bt�Hˣ����I9����&��0����Ҷ�1�ٽ�O�d����z\��lx?��R�����]�$�m"D�d]7G#�����:�.:K!Cu�f�.+�qHG��an����j&�|����CO�M������͎g�1
V\}��̘��Ȥz%qu �&�N>N-.mc�lj)&�I���
cҠ�g�X���x���ֈ��
��j1�v��(U�uy�4�k^�7Y� �Nj��c�F����
4	��ʈ��=�KW:"�c~�-u�ڡ(b�H&�&����7x/�i
�E*��Q�V�j�,�hW���O��F'��9�=%���?��H�`�i��%���DӸ�s�=�wA������Lq�!
KOT�8�>toV+X�0�6�՞�kAg��~d@=�&�#?�������Z�c,�2�D�VI2;�)t;�^_Q�\��nk��}{z��"�1���LG]`I���x��O�����\ts�r��䍛��9���`��D���'���b���0�t3�Dj�5As|̲��^�pN^5�ܒ��h.�/[��:�
8p�lI�����'���}\Rt,a���D���Ak6ٟT�{�m&4�N�0��A�`�#�>�P ���^_�|��0Ͼg�����C���ϑ�W�/��^s�	d'j���)^Ǒh}�2���0��D�"i�)�Sm� }K�N�:7���ƶ1��I�#��j)�L�fD���s���n��k_�D��L��=�?���Z.�Y�n$\��h'X��-W��M
QjJQK<-�@�Ny�wK�=	c�Q"�9�8�b�	�C��M�)��1%~!7��8G���5�mC�\�Meg��a�J�‚�1D��-#�`ȅ��]U����C_��*�k̑��3��]��À��Y۶�K�!�ww,W�����]�/�&G�y@��?&D��n�Ѐ<�yZshh*�e�:�p�xk�ԣei��?
"Z��t
�����@�Wi�6� \�T�n�1���JsE�]\ȍ+]L.c��N�0"�C{,����k�ZI�(
$�q��V�6����c��H�����I)����&ƕ��tvR�$ʔ�5�:R`��Up�h���DB%���FƧ?΃�F�^�d�A��塵O�I��k
�D
�0�C��p�I�ħO������0~�]��y)�����c�<�ɯl�K��i�ڵzVyům�G���㱰>��U"}�t8��g��ҷ�ъ�<Fo�M`ag�gL��Ƞ��$��݉"�-�b~]�<?���wq&�l�VZgd��2����≞c�s^�M���� А9'� �� �,=��������'��X�왓?�'b�����9��hi��6pX!�?BI�mz_;�w�t@k/���
�q̋KtM�(��{J��P Mt
�h�D�;Q�&fP�ŭ������j�ۅ*LJ8��E�_�|F4�9Vz��@�qQ\�?<&{�UYF�e?�������`�숩��m���q�,
�U��[J+�s��Ʊ�����d��S"������{u;�y�h`�aK��[d���5ȻB命0�ւKT]���1a����f)��,�ksP4ԗ,�����ck�z�cǏ0y��/6�L�k�DžZ2�h"M�	Xl��:��R��	�K!�<p
Ee��|��1M��Y�wlG�LʕX�Ou#̜��pצڛ�����n�����]V�m�^�K����U&
�6��qg�ͩ��U.£��c���%�	v��|������zdzM��v�+[x�NM��O}��c!�|'���S���*���zю\\c�0�T��Ζ��3f+�}s[&dp?ѣ\���\'����|H��C99=�5�t���RDÁU���2m�dmA
���nsy�aS�抆6�)��\V�+$�-�gP����d	L����$j\�$��"!�U��Ԗ�E�B-�����9�EZd.�O�L�;�� U�c��n��i�X�i�ld#:���2�U��m��YF���%����Cy�F�Üc�M��R��T6BH1/��*s�t۷;�T�3i�
l����\r4n<	�l�z;����7f�2-2����0${�I�#��͸�%�m�ڴ)���'0j/�%z���K�E�{�xF(��5��3�F�`�\w1�uT�a*�$��r\�
MV�ƖW���#�%�ގ�����`4�0�*H!�i8H1hwn�$n@�'omw\����YFm�'*����;/:� �>	ɍׄ�0=9�=�
����g��Y	�{��/�^��k���Oݜ%7c	�iK�Y�r�ϒ�c{�˹1��WgI�7~W�_��N��Ri|����A;MY����䑏�b�ۯR6W�U��U�6���F)}M�u�{�MڔRFd�hÛh��UQk�@���"�fc,�I��Z�DqGZ��q0��Fم0&�ޫR��.^�kE��cüZ"��j!{D<C��ۺ���H��G,c�'�@�ɩ�Uv��ܿ(�G��վ(�	J]��'��:P7I�7#��,��GWHI�3%�c���5̇�X�|��1'��{Q+fta��U%!o�'�P��ʔe�[����,�0t{�.��K�1������QA��W�a���E;m�[�6
���Jﶃ�=���X�+%mC��D[r�[�H��E^�!G��|1e��s��X�7	����׾R!<=O�ٌ¤���#�[g�e�� ���8�v%�x�,�C��
Aᓴj�-$�B�+"�2-�Lf3V�K�I��3jݬi{�]"|ȝ��0c$�q������|h�2��`�#��=�#uK�j��<S�/��W�a�]�w2�Fr"ֵ%��JD`E펨������5z�~��5<e�#��H��l���5�#�An6��BY;[�H�
�J&@��<�BѼd�<�-|Go�6N��Ġjk<75^�Q�$�[�m��W�o=�a����E�6~�#����}�'�=%��EJ�cV��0c<�d-��k�Vk�)1k����q�1G�f���Hڛ�v[��PrPY�@�K�;>Z�K�F�������.֩]zi���1�/���X��j[���P�f��C�����n��kӍ�����J�j[

�}M�(����?9�|άO�&�pVȼ
v��ez�93Cf�X�U��d�+�q�Qھy{w���81mXL_��?����/��;Z�!k��(0�9�B�t2�S�X��o`zc_`*,zײ٤��S��b=��y��QU�<tiZ pr���J�Ê��Y�F�jm�XI��>��F�5xబ�
�#N�o�e���D�'�3���[�J���M.�8C��_2:�u��Աz��d�.f��:���8W5c�����P�S���a��xn�[�����P��i���2�e+��`^'��gכ��
-��m�����1K�t/�Q-
{��4��SQ�&�\�=�
F�⋃F�k��a�#���@M��T�4��B�<�|pj]�_=��I7��NqMx
��x)ǎH� �BK5�BDW�L�r�7�Ѣ3�
�D�f|班�bzZ/��;����;Z�c���m����)EZ�M�v����^
ہ�(rGn��N�wM����� �1�t
[��}��'m
���0��bfk�t��?
1�K���(���P�J�F
k� @(��/LɃ+�m�D$v�����~��p��Al�m4�졹��}Sѭ?c��6�����j9`%Ű�!���`fX�����:�/#�k\N;"��XbTpÍ�St͛N��z��;9���>�FK3�{}�=���!ޝ�V�aZ9�w\~�Aw5`�c��"��>^ǥ;E��<]��<V|��wβ�ֺ�-5@��=�!ʻ
�� ��!�����`<@����Q�+��eSMd��
��Ow�E����6�Er�G6���g�(W;���v�u���B��W8�Vմ��p(�e��`8~�0�����/,}�D�����n��A���vl݂&��ا�?�<�5x�:;�#��G���{��ˇ<	W2!��-;׈�I^}���*�W	7�Qt�TCf�ɼ!��h
�@�dI�Jр��?�6�}���kx�:�����w����}�׾���I�iB����p��
N���ք�Rf^��1���{(��W�v�
��ܜ)L�{�R���?�Y-�W��X�����r.�y�<�a<�{c��_��@ā��+|�4�U���^�U''��Q�G6�<5�x���g���z��ݰ�5��L��rp�cJr��>u,ǃUi�i�^���I��'�9z/�J����Ҫ�_�o/�1��A�D�H��s��ƾ�I� 4c��KG�G&�~��~?�� �=�yo��02��Fܼ9�����F�L2���zJ6$�mM���]�,\�e\��gsN1�/��~��{��pػ�fk�uY��
�*k�e��Z��]� _�5\�S
x&��M�Џ���,]f�r�.?z-K("��X�)�pl��:ġ�Kӹ&�	� ����G���R�&��Z]�@#�`�����yeyj�p4;�m�Ę��
���#��g�>���|~Yo�9M
�̽'�~͟䄐쫂�����d�Me�˅vF�l��l_���5����XuY.*�?�/5ɓ�RB���R�F�@]M���]s}��o��.��P���m��g�ĝCV���l K����D�^>)y����Ҽ�4�#�{*�X�c�� ��Rƫ��`��)Tf�l;[m<��Du��H�lݞ[���)vJQv�#�/�&T.����7��r8>�?�I�HK�`��X�eNo�q�4��sLK�H9q&o\��`[3�a�YH���3��O���8��Z�bm�����\d��eMa3*�|]�*���O��*�ces6�L���O��=B^: p}nv�g��8����oFu�h�Z��KK�R8�1��G����Ӗ+�Z�N�*�+��g
�<�ߕn�?_.ʡ��=~	��xޡ��(����) ׭�a����!�
vI��dz��7	5A���������~H�C� �ALf�M�q��~�*�[/w�x*G%�`��O�w�8엟�{��se���&6��k<�-���U��%��MM5��f#q�K8!�^x��Bjf�[�˪ܒL5�1#xe߇���m�)����$p����`UH�РB%�G�a���2�O?�쏏7C�)��=\q�ʾ�_v-����LF껀;���=B"�+E����c<��MT��2U�đ����lV�����D?��hll��8���1=W��y�2[�;��uL�\k�U��5TvC�Ok��̝�#����:�Č��ѫ�=CSZ�#=�QTp��2��#�(s��]<3��[����V@���ޚ���Jn�e�ɋ|��Q��rA3S��m�0�KR7>ҝА��٨ɅG�i����0� �<����3��?���		j�-s �W
�NI���m��%L~Ѭ�=
���8&�L|.&�g'�_$��f�/z�1?���g�)}~�S�G�1quh�v%��wd�Y�^l���2��l��f���]퍄��7k̕H[�l���B����y��6����m��|�QpW-}����͍�`�碽��z6�Tdmd�V}=v�e��[m6�|�F��[�
ET������j=�L�4*w�^N��j�m�f��t��̠�b͓�Kg���:rP�s���tRBvI��A��6l����� ���n��Gb�����C.�|l��hryq|��Vi�Ǐ�1�XJ�=�j鶬s$�^ɜ��]�v�I"��Ag��vo��D�R��n��H���^�����:�W�C��y�D`u�l|�&6Ҟ%����m>��a��p��f##�Be��e�e
>ꐤj�XC�[�$�&��
�02}�
;�X�b���8��1�4��`1��Ua���9ˠ��Q�f�$����Đ#i\��a0�����o����OjhGb��6T˴-~�!# ��8���mK`dVMp��\�h8ݦ�T��{V��6�_������9���^uk��T�[���������7��	�=�|��`��m�[��DM��Q'Y.~��f[Z-�7��M�Ƙ`�AK����1.�8���o�h��i���^�֬��j���)HoGDWV@���q��0�{
ӓ�,��܃����b��Բ�qZ�V'J
��O�c��I�o��
��EDMWf��z��ڈ���D��6s	�+�w�r"�Z}���)���ِ�o��7? �.��2
	Zsga�8@���<6H3zc�2	:}ɴ�����4��&G�訽ɨf7��1�P>u9�4T�	C�l6�k~�N���h�����%-^�"���qdY�^�b�e	����kǀ��<1��*�r���:ζ�4��TWғdb(��v`�t�A���\���
�x��NE���Ʊ.p��橑�����O0��a��{#$�p�
I΀a!��������<�H(B;9_t�`LB[O�N�'�hE�-v��YDg����ϕ�3
s%6-�MD�u:M���Cӓ��{ټ$��m(��]�d(�W�0�șh��$���a(��	v�w�]���#��r��$�+�)��,�1PN��b�����ej�1��/�Ž8�T^�[�Hn&ު.�S��}�CRO�8.�A�όp�x�5��40h�˥v�����h��������]��ęRHd�i���)����VX��b���כ����,^����i��4n/}�"�Kr����Q�Zc�
~6붧#s�f��K�O�k�z3�X^X�@�/U)�'�JH���%o�-���=5U����J�i��5�k4;E�AЋ�-�F�a(����l�'!k\�>ğ�d���RV���]�67U��|Y��K�^֞��܂Ӭ0�lf�D�3�f[q��*)R;]��/R��ގ,V�H���/H�ו+����.�/�w�Q��A�5��)^K5�D�"�3'],v�����;
X���O
3��
/H�@�*KO&������Һ�u��+��ɞ]���2L|s$ª��PO^�b�ȑ�"6��D%�3�f5L�>,m�><��F��9��Ę�^@����(y5J�ў9:��Qp0x�b ߡ�K���P�
yY"���\(���d���>!���"�$<����p˾Ge�ӧ�A���D��~:��l�!n�[�s6�z;���p}�	b�:��r�7�e��U"�E�ΝE00|���юc+�t)=�^�G�����i�JGd ܎���`�$.���{
�Y'�y������2�ѥ��ˊ��1D�x�Y:8]��h�g��͏vp��uD�0T�=،��2�������q6ӝ��L�=k[�߫m<��ǰ����b�Բ�a7Qr�4Y��&_��vt=��w�M�6��KPnf��b����Ąg3rR*�N>��� 4?
�܇0��h���AӃ�wsd�N{�$|����rT��٥�פ�(i�/(?��8P���R�>�l��T�֔����e'���#L��.�R�Qk:��Ï�?;�����g1�v�z��$i��)1��vf!�:�R��gP�j�	�r������8G_"J{�>A�str�h.2J��jI��L��X͕��ї}�pZ�.�m�~Ae.��6�ݦ���R�����~�X�ʔ��tjx��҇�tƪ�Ҷ�t�_-J�E2��∹�tqs�VK�{x��*N��h#	m\�V+��[�=׍�Q�(Uv��@c�n^�4Mn�8����A%怃�,�N���SXK/��2y�����z�#���H�߀�d�E$�Aܚ|�f�=��R����v[��bFl�p�-Vn/<X@yrB�L(�a���A��&�I:qA�m*ٽ�VceMTQƸ�Zk�%]v;����;`oj�'1ί�1�L��>z�Z{dK{��K{y���%��w­���|�7�O�׬799}��7쮯�!��&��R�.|<�@Im�m�G��T��Dڤ�lz$�hX6Q,9���|r��xd�\�ؚ5|M^�j�E�5���B���P7K��yP�<d�'��,T�M
�%
���"K̠��ݳX���1�
#�32ᴱ�4��b��
󘤻��D���c(¤E~1-��*���_�x��`I���c�x�Pf�k�Qj ?<`ͱ,��<����ye��x���b��9�{f���'��(�Đ�	�#�b�Z��y��'e�2w(��5�4NViE����E4����Ikm!Nǧ1��'f��Koi����Ԏ�L�T�x��!�i�C�g~J�G����_�=-W���������g}����͇�6�E<W��}��	�}t�SD3F�%��̅j�sHG&�U��J��G=�8f�L�x�ʬ8��T��~���δ>j>�:���T�|D�,����
b���
k�3�̇��Zq_�G�]�/��ii����fמ38�.�l��GGK�k����{�H�T����-@x����+�<`IVm2��YQS����d��y2[�ݡ�]1eُ�Eӿ���\�e6�αY�ݢ���&�=�P��ܛ��6���s�kXd9��q^����)�ݯ���(�1�x1�ߒ����b���7ߚ]_W��ۑ��ڑҔ�ّ����=�f'��6����B�E���ťx���tX׉)��LT�t��y@;x���S�����N�>��G��{J�O��0� ��tn`'�V���Q�j��U�#�[wG$�#��R�2��
�w�ޓݥ�4-t���H�DZ}��6�-���m���֡��Ţ���B,/u^� ُYt7�����\"�t��:	/�u=%#'~?��}�YG�p�[
�># #M�F���!&�U�Qt�k�)[��6�s�%��2�+Hԝ�=���#(@�3����h�^C����(�:_5��OV�[��1R%�*�
Z�y
���3j˄�H"���$��WRx�g�]���7!�`!� l��@�D��_�м��W7��(	Q��r85��м������l̈́L��Nr�24�w�d~��(3�U4~�i]�Cc]�Ky�0��.,�*RZ�r�ZĽr	q�ta��z�]� ݕ����U��
�'�ƥ�4$���B�Ģ�+���e-�I#��L�"���܄(k�"]��@���.-*̎�w��qG�*rD�pE
��ī���W��	(�$^�L,������R^#��m�s}�҇�8��]|:J�4J>3v9oKN��j���'���GQ�i�U�MJL� �h��Z��mX��,-����
,�hY��g�ᑔ_��߁o@Mq�<��0E�!j�.� 5A�N�-%uZH�0��YaI��D���n��J�"�[5�m�׍A�Н8�?	���
v��K�l'�I����M�<(E��E��
x��T����gO��Ʈ_���l`_��<���)�S���<zدD3�e'Q\��p CT��=�W�*�Q2tPC�-
��
�@�
�ݶP%���Vk�Ol�ϓU�p��7ة9���U��'(�a�H���w�0�ƀ�{Mؘ�
2�U��z���o�jY�b+Q��&�}(k��6�-�D���feH��MvU���;��a�߻İ� w1+�t"ؑu1`o��f�V����ߛnJ`l����ڜ/j�N�O$�*�.����Ȫ����*�e��k+�1�^�cSҢ�ZM�T��JM	�sǴ8}_B�ً�f{i�_�+�Ma|��u/���;�0�h�9���h�&
�Hh(;�p )��(xM��PAJ�Ga�1���9�T�l�/����#�9��<�`<�)�H���81p�ԟ��5є��(�aOyp�Ek^¥$.���\����qx`�����j�����~��e�_i�/"�f�d���3��p�oI�\i�W�R�ذ��p���&bKr<;Wt@S_4��٠K�/_X���?���/�� �a�����m�c̟���Z�;�IW)Zl�cw	8̭]_g=b��te�|������̇p?,�����r,�	;��ejd6�w���(�J�A=��М��g��,�O�fS�T|���x ��䣯=���޽����s˅�r�΄:x�b!���9��
�z+���:k�.���zq,}kŬ�^ܐ�S6	e�p�m�s-�u�Då�v�]��q�nZG�%�p���p���\M��*������=���]��j�fIR�M`�e��؞9��~È�����6.��yڹ>.x)����}@{(��zbH��N�s}Kv�c8��AL`n��m<̇��g3�lf���e+�f�~���[PE�Y9U�c��ޤf�P��5��d�
|��f�X����.�#;6��}��S;8B
��Rޫx((o��(B�0%9�cq�e�۾�m��'�۴���Y{�G���,'ԯ2��
Þ�᮹#����[����rGʠtS�輚��1�4تe�G���Hy�I���oO��{�����C6��Z�~W�"��*_�t���v�a]K�0d��������v'm(� ���c �?i��h�r�q
7�7�T�&c��/$�g��Mf��:��	��f*�#�:^����$�<9����(�9��H�@m,����vKa�FRgAة[JM5<:�1
��Oe�>(���0G%L�ͤ�2��ap�lIZd=0!��\�4�8���⦧�%��r)�r�G�w�ƺLjY�2<yb(LF�"gF7�1�L�I_�#��̋��<v�$��5"��u+���.vU�~��T�̤�U��"�K�&��!�r�7�%,�I���n�A�0s�FN��!�K̵X�J���z!���DH�tk4L.TL�'�^5oG��{&��x�I�S-@�-�ot��2ѩ��?�����oc_�ɏ0~́�&��Ȅ3�Z��;�ݠa�}L�K�#�"n�+��c:Y	_c5(�ңpP���ݙa��c��{�,)�p���p�TK6<�x��r<����-��"��Žm�����q��)�P4�-k�ș>B˯�z��J��Nsu��e�g_�����������+��H�ݭ�,>�ť�Nbz�[����ȡ(tO�+�lMf��n�N�>�Q���Z��#�����1^L�5}�P-���2F����ꣳ8l3J�:¼��WF��Ybhy��(�	�#,M���r���eA��fH%��/7C�9`b�2���?�Xy)�gJa�ޛ��X�f��x⬠@(�_i���=�۹'r|���F�&.?�7n��
���}�*�SZA��!��ڝ�l���kH�u��|�D-𵙷^��+�9j{���l�'���ե?���D�^Լ�I*��>��0����9�3��	�o]1=/.�ds����V#-Zr�TA�Dʹ޷g�%P3����/�_��uv��C���Zy�8�W�<d�{��a~`Ec����S{�|zY����M���e=dn�/SV�������n�c�-����;π#�	HT-je6���r�`(ǴJ7P�Ň1j/�5��M�u&	��5�$!�����p�D��xϨ��X�G��i��j�CE@5���!g����‡�kq�hvж�:[������4�����8�0'є[R��ƀ
ْ�?:Y�oD�7�1(��=�]�5���&	��K�I�'�t��1�Ԛ�p�|SQ���
�v�U���LF|@t
of�D�;J�B��;�_���M\Y�� ���ߝ_�ϒu/TI�����p�ؔE���,�A!�1������EwH7>?�9O��"�[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�ɛ�}�ͷ��������}����/_�}��+�}py%���Q�C1;QEF���݄Β�w�l��*��b?(e7���Rt��HL�d�F;:��5;6��x`u���\��$0��``�$mATV<Q<�ۜâgE�c�
�>���=�S����-�f�5���H6;�&_��b.���<�Y�F��љ05&b~kq0���BXE���.��`�b۵�1̪A�} J����|����(f�����i9���,x���S����������⭠��A{	<�M�.�*f�Y��b�BI ���lB]��2�~	<1,� >��uF��n(nˊX(�j^�MJn�)�� �D��<�SCR#�)K�I�3��޻��x�V��V0�&�h�;Q@��3.4,��(�����6��F;����g�����ZLO���lW����}�s��Q7h���:>�3��vث��_1��t.�[��Eh}������Q�S���.�S(�Z��
��DͲ��o�^E*���HZ#!t�19Tf�x9������Q��0�?�m��Eu�4��u�h��J�DY1*%kK.��ˑ�V�(ɨ�S�1�L{�oĥ��EЭ������"
�jUL�n*%���jh���FQ�W�X6���}Ȼ4�\$�E�#�@�?�r �Y!WR�F�3���5��cE29��N�$Uy[$�mz?&���Ĕ�jVYC��--K9���*_�0���G��Pڷ���H0+�n�����1��ۃ��zeՁ�9n�l�9�i�Y�2�`�9��ŒUm���մ'ÄM�����*�x������@��|y7J�f��j��C�V���L*H$�#<
GV���&zA�Тq����b)X�*&d�����P��F.���k�W�U�Z���B�+�Q�~+��k-����I;���ӧ�vh�/9��#AC{_���Q�<d�g�"��ċod"17��M�k��9Β1 ��aBj�c���n��t��C1:�gx+�T=&7#s������P1[�#�A�+t; kYf�.9�K��U�R���R#w�1�⪓g=g'�/vq�z�.�
�d��_��
�#�2�Į���u�o9�"5��0�7����-ۑe[�-о_ k0�Atk<���(�\�ir�X?���$CPe��Wӡ?z�E��w0�{8�˱W�CP���g�.�Z@�F8+����p2_�l���?����D>�񲊒�n��-�tMn��6%�x���3F���W����H씥�޺4��^4�H���⪊�.Mw�����SCZ{�us�y��{�&m��N凪�m��#�\�+Նw'������pc@��YdOy��.����v<ϯzfc=ԗ)�A]+92�7�f�	a����~��Z$	�1����w<>氉��g��O�~��/?`�}�{��;�/�	�8!�X�B�d�5��ڲ{� �Z}��1����
���k�Zk�7�W������ϟ���5�����;؜_妥�ߒmF�WG�a׸umSt�{��W%�x��M��O>Y�W��������X�5A�K��;7��\�}��	�gY����̼3Ǘ4p�cn�.��7���]�,��n͞X0��]�RiGq��n���I�%�}%�I��P�(��.�l ����7�6[�鸬��⯧�`�-N�}���}��?$OI3̝���/��eЃQ��+
(���Js���;D�ɚ*_����;�����'&�fh�0���R�Hv7pEX�K`�����Ir�|obk�L�&�H��W#�'����Uס<F�~�#`�w3�ۘ���f�������r�����}2�\M]N�
�=Œ2`
��+��1 1b����K�^�m��"'�ǟ:��z�&_��:��K��.�֪
u�Cu�����ȝ������^��k:��*�F.g(��k�~J+�2*0�(y9�0�ת)�p�Z�H��f�h(�I�F���,��{�0�j�Nꅶzj^:�Ց���n�x��l����t���Ol~@g8�
J]�Q4��6��Mj�L����Tqᐕ�6�H�y.h�-GP��GQ,;M1�w�?��R6
Y��5X<
[�fжa�ȭ�'���FW��]]��t�Q��$I��?���5PTN��0�H�46=�:�"�
ۇrd�
� �4O�z�=����0��+�Hm�4��GI_�K�u0�� �843�ۗ���#�Jf_�����g���ٜ�� [�R���
+��	�N�=ۍ3淚=�B�o�FOaBZ�c��t��o�R]�����R�C����%ZDN2Q:>��V�xW�(p��QQ�	���6�Y?��]mo���_A8(x$hZ�-��v�A�M]� �G�$�E)U�)�߻�{{���F����}�}��}����)�oܱ��N��A�oc��>����.d��ӧ�K65�_�n�R1�>�qK����&ߓ���5��������u�yo�Y����2)�2T�(�g��nq��U�Q��%&�71x�Qd9�-�-��X��u�|�xИ��(��܉��_-��o�%$�O����S5�
<л�z�t����
�*<�7��*:
�����^И�^u��=rP<h�h^hX�jK-�W9�P�xE3���e��9����1�зxe��ۀ�XEz�.�r�/�W��lw`"{}�\�Т�3w�� �܆��Q�Ȕw�����)���E"���]�,�
��^?FėJ)r���Aƍ$an�(���� h4�V����=3��r�����4�D��|��%�J;?ل�)�Q_?
M�伢쒞��˫�8df-��!�n{�d�닝��M~_oZ�U���l�RU
��@����'�>W��z��.<�)%D�D�!\xz½O^�2�ɕ8��Q +O���u��@�d��x/�a��l��`�bBu����X����=\"�+p�q�xb��"d�M܂9�%��-�8X����x�F6y�*=go�)���)�Z�.�nAg"c��.�x���qh��J���_��W�x��F e��Ǵo�Hw��F�ꤧ�Y1w��cn
��,KmE��4eE��ĺH��f��ɓC�X�K���p="WA���w���,�j'�o���
�/�3�tN��S4V*m���f8z!�'8��YK�۫���b-J�F%���v����T8,��/�<zT�a�rg��™V/�~OW����\�B�+�y㭽���0�K�>7xY�/)�*@i�+{)6����c'�V�P4n��MX��.�����f�9�1ȥ�F�J�|z����ʌǿ�[�B�_]��\1��@�<R�\��͂��k��G��?��1�şC��ֈU<,mr�ì��[�]�o��A�v�w��llM���ϊ�/
	��'6O 0_����Ծ�(t���d�Qp!zf�|y�'��lvNx��d��%e�ΐʩ���Ӑz���v�ȷ#8���ho*�~�ב��H��>���e��܀A�e�Ġ� �]���g���7���;�����(��D�(�L�����at=���A2�оK�m����i�'j��3k�S�.>Y�ϲ�����~��u
�3UG���HQ� ����{m��W�e?����GJKا@�t�C5-��`�u7�o���'ˬ��3I�9�ɢ܄�7��@C��\\N����M�),2���n��z�-��͵&�f2:�=mf��0y2&��p�׷#��S�=
�{����'�\`���M/�y�ŢUKO�9r�*}�`�%�ow�PC�Q��W��!l5#��i?
�?���lR\�U��Ģ�� ��*��8����ljN1��.��Б?��hQ����x�V@��j�3q�k�N�𖷍nH_{S\�<R�������/��E�t�V�L��N�)�g(ab'�•��y�>Eς<ݧ�A�0̳#�����m�D2�����9�)uX����1���F���2O3�b>��k�3�<�c��)ّe�.�Z��L/�)���S��ie�����������]�8��"~PvNў_�j���$׏��u�zÝ��F�H�B
>��~Th��;Y��5��8���W������昳q�G�;��_h7�]FV!sUY{Z̖�--l#�X#-��s �IV8ia��L��:G�D�`��c}t0���宋�T�-�7:��+�J���`4�P*t�n:Ӄ���q�K8+�_dX�V�m��h�ⷡ��O��O�u�ż�H�-u>�k̦�RL�h�|���
�E���X&	�=jc&��~n�%0m
��̲E^a�A�V����f��2F��<�������W8 ��Uꍏt�Ih�C�>^�M��`��d8]^���
�8�@M�((�n|ΰ��H���9�_cn��F$ԥ�.��Vo�:�ܾO&j�[�_e<���B��~�wI�ߖڃ�Vžv*����\��Xz�2#�'צ
R΁
ߗs�Tyϳ��i-��� l����=p	z�ٹ&�ƻ�o���84�k$�Ab�J03XG��=�c
֍�U������zQ_��0�f�Ӿ�B�?=;����u6��s�*�I1���2�F{�Z�m��(�`�||1��h�����	L&_ӱ�<�L��'��ic��>x���K�{}S~[���D��eW'S�?M����طZ��b~+��0_�����N��޳�j�?��\pʺiLQ�|�U�Rg#�rV�z)�a�h�4��9d�;�t���
p���$���Kȡw��
�72�֊�~�z
��l/�0��A���r��o��;♹���P�|
�Ҿx5��F�nX�a����F-�ŋ�U��v�k{~LO��Y��Nhb��י��13D`�k&�bo$��)7`��i 8D�����k’y���r�S�6F�1��2��w�!�Ĉf�)]l7x�]]�C5A&i�N�x�X��
3?��2��ְ{D�W_���~�
�iӘ$|�7ד%�X�
w����5�k|5z�J�w���ƕ
�h
`��ؾ��2�CV���1|����m�^kD���k��@�y%}�p颯~�:��ٍ�k�Ѡ��>ʄd������8,h�=�=��p{��S6�pӚ�x�(p7*\�HWdla׋Co�ؒ�ɚ��@T�O��_��`�7Y�]ݶ����a;F����Dѣ�k�o
��*+��ME�j�x�Ř�e������=�C<�#4x��n���7�?_�'fԮE6ZM�r�N3C����m��6:�M�v��b	i2G�_=���ސ[$Re^�<7>E�	�v��	w��̻��B��$��['э�<�#����I����%^��<�xN'�m T������b�X=�-��N���=�2�f�b��d�� ����MY*���ZFGS���*m����a��r���k�F���
�q? 9�O"�N�e�H;D��}��8$���:���������O�>Dg/U�?�b���^�8��<�pm��P��n��~tn��;�]͡����vc]�?8w7ڛ8y�U3^1�'n�t�vn��*
�����V�8��[���n�VP�Y�[�gh�<[��f�����A�Y'�"'�����w~�;�Q@g�߻X_&w~F��ޛ�]��FFp��N�E���I�e�H�6˒FlY3cZ�1��c�pD縂��7���bɗ�t���=ɻ��c �)���������v'(fX諭O�I{#���{����=v5���������C��	u;:ԡy@���%|�(��/��ѿ+�n{�D�dHb�7蜪4� M��싨{��"�-�fX�w��V��7���y�Ņ������2��WW�#��5�V�^�&m���`x�Ox[���g��⪝�B:`^�)���,-�(LPi��_�t�`�p!�p�B��E��2�.6�H�����1i�7�Z}{�dF�j^V!"���^����TCvJ�|�@*gr�cB��E�u?��qG�*�=�(����"�4I�&��60��6C�{�7SA);%�8�BOP�)?��v��T����[~����K�5�(J�a��ȷ�%"��0�9GsBE�_�;��%�O�dL���7\6����i�#���;�#���sH�Z�]l�//rj����WS��
8]�c���Kմ��6��r��_m,z2�jUt	��&����>c�j��C7=l/�ᬵm�]�<<k�1Oo����j�mo|C�l�����=� �&�e>�¡�O��kw�s'�|�`��Zh�<��Q�|�p����L˨���/g�;bR}�d�=�����������DT
��;�����e
L�"&aJbOؿ���~%o�j���V����q
~@�/H�˟�3��(�� �HŽ��y�1�Ty�ؙ����3�?�fO�'8�����v�[7X�f*C�aB�J���d�
�}ā�)��þ�o�O�����0��$�e1�N?�㢚���H�#�G���6gnrE�{#:
���8V3B��e�&Nq(V���ʴi�
�=4�<�W5"�?#��\�j�����p�8+��_�Z����U#4\I��˨tߘ�d���j(<z9��׀���^2]2{�g\K�-B1[�ܠS�>pv�;��.!f#�\������LOUV�U�0�C���֨)����!6�f�qP,�~��/Ja�ڛk�M2~�/[+JI'j-s	�Ո`�V�O�Rc���Ҳ�#`��iȵ_�R.D�zr�\.o1�D�l��03���9�`��)��ʾ���f�ڍ.�����0�yx�]�%춿�w�Rn�y;��^��o�	��{p�1E�5�]�v���]ڤ-�"�r;�)�Cκ���3��s>�P����dǴB�/���y����<��&�ԅ&���J�N�f�W^�8u/���g����Ǔ�8�47��`��8��:����x�C��������4U�-w�r�&q�e��{�C�B)ʐ�o�*���[����~]ѧ�'d�6��M&?N��C��B��{��V��ATW�S�+�|^�A߇w��ٴ� ;�xT� ��80<��D�
.,@{�Bh�B�F�A-�~��7�̒��d�b���%��$��/}�H�8.�Q�vX�4D[���j�,p�~�̂#
\��wϿ���̱�&U�|�|�|��$U��%ˍ'a��'܁]Ż�s��r�qQF�ֽ�6��<�gG��a�L0م}i��Dr��ۣ��\�ui�jKo$7�!��PM�L(�sD�(4��'�~:c�u@W
���~�@s
7�t#����6��{�ԯP�91i�NS^>^�I8�D$�8ENI"&�@-
8vj�!S%�ъ����.B�Տ�{��we/}���O`|-զ��7��Duư/�s�����G�j� ������׽����s�'9��r8R�Ӣ�U�9B��/��Y1�1���xAi�ǯ_�pt����H(��w���)6p���'�s"���ZeU.@'����u����P�FG�3�p{���ː&��u�!7ؽ����<!��}¨�܃OG�5���DoXn�=���q�(��,�yg�U���n+���1�
(�ѣ�W�Ҁ�����3�
覀0��eFl)�ĢF��%�r
i<��$$Ms���Q7��rU�e�< [>��a��d�|��r��t�kLpb��`�.F?�l�����`��u�M=`K��ݠ���L�|�|GZ#�zg1���d"�P�/Yٻ)�֗��|i��·D<�3yo)�S���@<���J�ig	��7~�!�JMM�r�ŰmɄ�sF%�$<�"���(�<�PK1xU�B΀�G/pkg_resources/_vendor/more_itertools/recipes.py�<io#7��+�*)e�d�{&Ƹ�>���N��1kx%JEI�KU�bɶ���ꐜ�f�5[�"��w���ϿlweU�L��r+��Z�2¨e��B�+z�kU�e����V���㳳wy.V��FQ�U��r��du@���nz?�}-�J,���IV�Ų��`�E���ȅ�u}z���G�h���0^��[�)�h<Il�zw��B���-��+��+��xSo�o,�gg���g��"�BksF�,�<W�L; S�+~H��3?ˍ�E���B�6���~<,s��U��-�E�\/�J픴�M-����Z����,/��20l��(w��uY1��,2ė��7��Ra�v8�%,yv6��<��ĭ�#��
�|��
jUVj fr��K�t$��X�{V� �l��ݓ��L=�����e]��}%����3��T;� ���Dg���̊�P��Y󻮞���W�n�/�Te�G`��)2��T�zupߙ�1"�'
���\.I��m�Nl�u�&_Ycpw�'�rYU`�,%l“{Z��D��w����y�AibF�
�b��;A����{S��ggg�Z��H��v��}>���T��k��!F��lMlDp��FH0$���/��۷o�U*H���d8��&�����g|!����W
�e���ƚ���`��,�A_���1�8D��ぶ'"��IX����s,���ߔ�B};���!`X��Zg��kb�|�0�>��Yh�C���Kx8[�G�j$̦���d��C
Z��=+�ˢVk�DVkr(c/��Q��0;��+
^J��]IB�.�d,���� ��[V��`���
�F
��K��2{�Ų#'{�+r�]dR<߈g1���(�6�g���jؕ�u��D��.�$�I��Gb%Oa����W�l陋0�� ̉<X����?}�~0�I3k�~7�4�A����~jp���e��[����6���t��/�*��w,�g�89�V;3&�)Hs�s��k�4DW*?Xj?�Vz��a~�y#�@5X�f��ז0��Q�{�}�h�9.�#��O�2z�����E*s���"���8� �ntzJ��-�=��٘��� ��Y�'m3�c�pX�����g��[�T\��w�?��*pq҉d[d�)^�E�����v�'S�[z{��X�F������~�׺�}!cb[ķ��&�5l�d,$�Vݳ�x��3Ք�74����UK�_��a�ۮ߈3*��h��Ì��Q�h��8M�D�{w\���;�0p��\d��l)~QUy6`]ol,��F��6��f��Mck�q��j�Q��&;D�6�+
�p��s�鑋e��^6%r�m�(2���sD-Ŧ�0�tN�ҍg�Y����Y���f�j?������9�ЗA�����H �=%�R�']�B��O���(~TJb}n�2����X�b��LXk �gk�
ݡ�h�g	�Ф|
L�yT��ÓuJ��,gi�����E�� ��n��u|.�`S>��
>��0*�Kp�`�)�������{��W��'�v8�]B�#�XI
n4�;	��m�Tp��q6��:8PG;�Ӱ�7��x�u�ۈ�j���T[��](��5�0l�{��`�n�N�́so�,N_Ğ�)��	�|��H��#�r֔��@n�LTʑ�l眍�4�=�1H!���T�ݹ+~�8�G#�-�1�u>��]D��C2���{H܂r�yEHГG�y���~�`��c�|��k���<�z���t�ݡ%��XE��LN���d�AA+���ܖ
���?�os2,��Q�P�9d���ʐ���qj��i)=	ͭzG�MT����{��_E��$wFA����`/����,��m��D(�P��c�Xv���)��-��D��>���	��~da�,?�Q�옌���=,��sF��I!�O��f�O�|�b9���&M��Z�;�sӔ��⸲����"K}ۊn�@x)���#�4�:ǵH�L��マfoY��G�T�Qu���K��G(�tڵ�o�X9�*a�L��rY�.�|��_��5�}I	�I��u�@A��u�F���i����/
��z�0s���1���5�!%5���NC�����G��M��z��;7x��){��=��h�/��в�B��j��j<��C��w�&��2ט��ֆ���[���$䡘�+Պ�(�Y������/z��L�e]�o�eo�0V�K�3.�
>w�TUe���[
�0��sD�/���U#R��g3P^*q��Ϭ���s3n^��0�����Zr����*s�r�/f��\>ľ�,�[��[R4=��ל�;t���ׇ���#~��z��`
���9mt[�h��j�Jw�1�I�c ��P�`�kӨ�r�v'+�U�—�
b�%����@=�` �
�!�3�+[�;* y1ދ�}o�@t��O�^9���/$E��o�K�lY�(������u��'<}�Rp_t���EѰ�>b?��
�|�j\p�n}_P�`�&�.�}��"��4s%���P
�M K0[�}*���o�@F$����
�&S��B��d�r,$��8a8n�~��5��<�������J|���TE`V�����@rb�a�_�F�u�[k"DS�ZvPso��@X�k�V�Le��5i��Js����m�E�&N��a�&E��=�j'|�ɹ��#�T���^��0�z��n>�V�������u>G<Pۡ���u>l}���vY���,kU�Y\��m1#3�,��;3�ͳ�?RZ�XˋE��n�d��*�N0���
F~�LɚC~��T|w?� �`� �m]�.����t+��P�WD50h4�x�
G8��C=#p���#>�jQoQ,�7�k��J;
�ځ =��	��И�:�Zi#$π��0�]��װr}i#�h~#�N��o�\��~S�o�T͆��88路=.�>����WC�f������>��!߹3v+	G�gr�ǞS{�Ԃp��+��%朘p6�%���|�RŠ7�\s3�),ct��A��R�Pqǫd�h
�ݺc-<��፩hmQm?�E�ƪ�c�3�V�j�d`)�>����;;�;�}y��{��b�I�/}lmZ��[����-:O �Ɉ�c�q��CG�p|�WM�+7��.	Ƚ�=Z��t�fH�n��q
׃:��m�K{�N�*BZ��G��TY��L�����������Dg6�8�G����t���9J�%��6�BÕ)��M�F�
���)ǂ�BY��`ȏ�pѝ^BB���b�CR���p��i��l��J������Z�LI�����P�	�����7������P�I�Xe�S![��i��sV�’H�ʧΉhp�l}E�=��}�k;�y\�
+�5��
Eh�1��p?K��Cfm�[
�!%�b�$�vV)2��s2�A8�@e>ǵa���
2�A��y��ф4".?-y�f$�!�ih\�^("�I��LR8g��])�����o<�&P���alLC`�`
o���R�(�0��B��g&v������7�x�hU�oI��
��ð�ӊ�R6���SQ��غș��_^�a�]��IlC�؏���(r]��_��Z摇mU=��3�=�[S��K0���w
K�ӕ��Y*��%֔B'���'�Ĺ�wrQ��-[����ˮ]�����*T�Av�αr�!⦨�;������\D�f��|�D�v.�hm(g*��*�61�v��dZ�@�d��L����B���r�v�!չ챷1G��ܥ�K��g�7�ǽl�\��;U�z'zΨ��@r��_��5g�]m��3���A���%���ވ)DB�<d�4��F��-_�A�&B^d�o���]
�
����9oZ6[��AQ��<�ޡx�a[Gتz�G�&�,��#G{8n��-=i|8�d �hw��C��lâ��Jw�>���z��GatX��ػ���u�}E��pzʦ/���k6oㆧ7��c�`�!+.փ^���~��6����m����i�S'#>PbC{;
"�X�'_(��;�%c��7�l�C��j�X\��5 7�Ͽ����Y[2Xڳ4��%�nd�=�����i8L���M87��*��Dd
*,�.O��`C8�j��!#Ұ;��|�Sf�p������yt֔�h�wK��y�tlG6Xrn�����'j��x������3��D�D��֮��w��v�RG�H���S�8�4��R�UsWth���7[�g�umݿ��
}��O��'8g���q�N�/}�6cX�L��r�JN��*�u����dUGH��Sm0tm�(��X⥝Xp���G5׿�L���*�"���
B.K��n�90���Y5��6��|�Dy"�9.��՝����ǹ8��7#e�8�T��E(��(�.�Iۑ�+�����sk�jp����^�~P� v~�T�u�,�=�����,�jZrtG�h�����i]��exjXc]C��i
%�k'�z��r]�Ć�d���������E�_�Qs����p��#����@���P0��	Aأ.�\яIj�q����j4ѣ�Ffj>�w��)���}������5�}D�@��
W���uU���Nw	Ͷy
�S�y��k[��m
�I%�$&CD>���������3?��?c�k���)���ZRk�f��|����$8_�x�J�3�шxE�=�&�Q����׷0�CC`�ݔX	%B���ؒt*�h��L�_D��
���k��#���0^"`Ox�J%[��)�(��gú�hR�I۹��/�r��Q
rC��8�`v;�D�V&��s_��X
��_W}���O8&8�	��X����|�
�H���FGL|���hƌ_������E<㌮&'F��c���
V�����#na��B��<O$|��s��"�h��0��~�m��|M��
~m9���V7QR�@>��2�+`���;�!�x�I�VeZ�U'�N�p�s"�c��h���\X2���oxӥdx����e�_�M`�쟥�8c�A'vs�7���s`׋�����N�}�|�/{��EwA�+�'7�I�c�(١�uܸ�
��\a��ܡK��^�LU���1(��ɶ���βO��7_�K3�N�xP���.EX4�Ǝ�u�`0���{h�{�x��Wĸ�3"�'�=����p�E����̸Fɋ-�v�x��
���kX�euv�0P��d�tZ�cu�u���L��n}��.��Z ���O��T�|��O
��;���y;�����86�{/�^��۰@�[]7_�'i�2�7��n���v�;(��l[�<\n�=�h�;у����hKmA23�H!���kG�%w8���)�Lā��p����`g;�L<�Ӏb�W1��+��8|3ĸ:n	�Y��!��r����C�Q•�濲`+O�6��f��ڇ-G�j�i�LW0��%��m5������H��b��;>�[>�_��;��[��]�� X~/ڒg�hG4�[l#^�`M(�PK1xUF�cf�,pkg_resources/_vendor/packaging/__about__.pyM��j�0��y
��[���.��=�t�2Fp�s�`˃��l�ݜC���~I��{GZ��l�� �Fe��4���-�6^�Q��0�-��%��l���jb��qw�)���e�=�/UdFk�r{m��}�V�u?Hd�Y��E�U�����>3�O^UL,����X�Œ)r����d;E�q�MJ��5SpN�j=���G��]�x��ַ8�:�Y�*|�j��$1��;�ހ�I�6H���1��,�ĝ;~.�0�L
dIWA�Y7�^p���
ٵ-�m�j���k����������Gu�o!�o|�Yn�p�w3�(K�W�Tɘ���v�_w0�9���d�PK1xU�����+pkg_resources/_vendor/packaging/__init__.pyM��j�0E��
1�i!�2�.��Ea�&C7�7Q�Y.���:�7��W�G�6@oB�]4�mq�A;d�A�}�x�L��e��9X�N�Cf���s���� fxy{9�7�u���.`�(X!��_O-�ɡ t(ƺP+�3y��6�Ek�~"�S�^�Qb��U�4�l)}�*rM\@���+�����J��.Y�#|�a�|�6�����=�b��(`�Q�M���PK1xU*:c��,-pkg_resources/_vendor/packaging/_manylinux.py�Z�s�������`
A�^�5qRY�lMeɵ�U�9G�*���%&���Ҳ���r�������2ɳ�ba�"�d��#�o��4��,nod�B4�ʪ�ê�Z�$w�He�(G�"KX��q�̳�K��$��cg�(x�����y,<v�� <���1�����j��,�D�Ҭby�}��`y̫yV$L�����C�z>��i�O��Z�*/�K+9��R0^�KY��u!X6W��:%ᙸa]�Y,���Y"X�KQz���XE'Hd
��E��'2�q�b���#�B��i�tۀ
N�����,Y����X
�`�2��=v�����_�>9?e��?
c^�,��S���X�#������<���'oe."��Xl��I{Ā�Q��n�ũ��K�O�3��y,#k?�g��(�b�����8�zP��X�4o�K���i�[+�h�7G�Ύ��o^��c/��������ACq|~tu���gS��n�4�~:z�s~��O��Q�ݛ`��.w�˫��z�>?z��{����Ӂ!9%����ٛ���)�OO'�3x�|�n_L�7��_�^��I��gd�.s2�U����R�!b�z��Dy3f[?��,�MhQ��<�u�IuHA��dZuD�}C���$��O.������R�&��x���ec3����c��߀�Y�I�=l�>y�o|A^�.Z�e)a�ovV�{!����zr3j��N}��$|!CHlDu~8s:>r���O/�ݡ��W�[���D{��d���(���x&�<f�8��G�j�1�*ҡ�Mw�6!����Q%����Z�Y�g�1� �
�9��`{����,�����Yy/^��ޘ����ΐ�T�ξ����_��=�����I���}�ǯ)�]#�P��#��~��5$� }�E��(!t�Z�����e6�?��|$�<��1�-)�?��Gy4mZ'��+��g�h�(it��t4Rt!��踪6 ���7:�X��NVK��"u��4z�)fΘ��3S���7p��๗W
R�g��Ǥ�3Ս@��w�	��A�ALX3�E��k=���P���<΀��L��S6
���:`K���FԆ����ZV�ǡea�C?̒m��@;{ۋm�!�G�Ѻ
�T$�=*k5�rd
�*�`׭Z�3�g]��/�v�&��˛��6	ً�s۳Yt�k-��Z6�`c�?`���ҎJ��y�<xv0t��z���n�?��#�T�7�.u�]3Щz�G������4vִ��:�V��Z��ؗX-%��ܫ��A>�tS��%�D�v�|R��9[�r2����%O�eU���;+�)��K�W���4�C���FI6���}GN��i�u��e)j�f�T�bYV��x7�J|�R��ylQ#�u�,�b)���'��
��C�(�D
�d�r��
C�W!���2
���yX�j��9J��sx�P[ER�xx�U��D-a��G|�}����q�����ݡ��
�e덋|��gk7��,��j��:�����n�c
�2�!1֗�}�g2b��'�M�:(ոc�s3vx[����S,D��d�7lY]�߬�
�b�����ů��^9��4s�
ܬ�����e�t~�ϰI���豼��p����"�����RYSM��	̶X�Nu	�D(��P&���fY���f�dQ�naP\0v=S55W����;���<�O��dw6ߛO��I�
�m7<�|��|�t�|�lw���:�W���������` �P3�&M0GG�?}�t���Q^|�}�'�j�A�n�@�	<ցv��/�XV��ÎgvT�vVW
&kq��1���1{�9���#��9���s�T�9�}�>��Μ���Q���A݋g@�_:�-N������+�L=8�;�c�6;#�\�?�\!�T�<���,���p~>F�L#B�*���Q��
,O|�$�\P��rJ��X��"tZ!�;��ʿK�rCx�.
�8&��)(����i"���]V�R�˅�>ו�G�*6��h�2�w�o�f�?Kj�n��*c�"�H�4�kQ���n��J�GlG����ݑ����}��'R����Bȅ�.Q��*U{��ƪ�1�#(n��g��"&��.{�ʣQ?�˪Ɏ��Q�Dٯ0�3|�E��5�h�NZ��IS�U4)���_�_H�6/<,���Z��G� XLy�,�P��/.��J�U#uU`�0��j��J��C]�1��N��UX"8��]�d�&"j��K��A��D�W�z@�
��K���z��X?P͡R��"����l���������p���j�̲X�J�\���[�x��1�qh�~�Ae�������I���g
܎���঵>9�E���j�AT�d���B��a���d/Q�V-�W�T�8!�P�=�����N{����G��:��D��P}��
�P�yg��qA�.z�Ge�lҜE�m���4}�P#8=\��(�M����{�A �=�[b`���ZC�Fb��b!�sF�A��E�V 1�D��HE��,CJH���3�<���[Ÿ�i()1>רT���-��5�n�� ��*\�h�C�Ҵ0m�g.�է���Ȁn��s�G����W�!�3�ڙL������J@?˭�g�l�@�=$Ą�q���[��z����/������x}/�=?�
���i��t����}��Y��fiG<0m�H_��96�ȪC�M�o��xջ:�d"��e鞍�ihk��w���_Y��������m���m_�qQ!�y�������{��>ۍ�ğ����hV�����j�ۓ�l��/�I;�.��k������`�Q�J-F3AZlȺ�>����e��)J�RV2ʑ�u��xt�F!V�	<�H�.�~���Z4b/y	TP�7��{O��5J63�n��iMc���M����6����p�h��xZr2��i���a�v<��;�0���2mRD�0 6J6�ѐ;'��t����W
���	��&`�֣Qp~�������/�g��ooᖿ71�}yŞ��m����R���es���g39���&O�=&;C&�!��>�}�c���طXL���� �&���t��aFS���1UQ���q��K����#�Hjy����s�+(��+�j�����O!��RM�ʲ �#���9�u`���^55����)��mz���!Y�@���Y�=-zۂf�m
���T�B}3��`����]��͌w-Ȏ6���[��r8�+�߅HF�_u���o�v���\��B�(�;{�ּग़]�v`
�eR'6�)��T�R�2�Ih]�ueZ�4KiZ`M�5�[�oF�]Jֲ�Ah#�k�5�I�k�j�����I=p��F�����n1
�5z��^�p1�;{_����
8G����^�}��In���g�G� �Ͷ��};�b��XCj���o$�-EF��F�k�͎0$�I/†2�:8�z�Z�wP��;�uF�	��otf��⃄J?S��������Y��K��3��=[����YI���^!��э;�9|����fy1�o�b]��Uw��=�V�C�m�����z�@�m�k����u�u<��/j�c9�PK1xU�t10-pkg_resources/_vendor/packaging/_musllinux.py�W[s�6~ׯ8�<,��p��N�Y��v�5�&�Ƴ/���HPšYL�f��{��/mg9��p�߹ ����k�8��6M�-�Ln��@U�m)@VM)*������l
��"� �[Y�5�{ЭRRm�zo��i&�T�"��RUk�)p�×-���Yh#�ih���$���Ţ.��ʊ�-�[)Z�ٺ.M�P7Bs[��aG���X�f��ծ]g�N�������2 ,/>Laa=�)���oZt�>4u�h�[�L&�( Ղ�i����q1C��
��BQ�)����=�R*;��j6|���VAY���H���8�a'�ef䯂��$�7\��yJnMɜT��H'��}��dt��>�.$����q:�=k��;W�D�Z�.�x��1zP�l�m��x#�ei��euu\���8?9�=o��_go/�����3.��(�w�.z[4Z螡�iDfª�u�r�"���m=��<{y�mϘ��lk�����q�Jܗ�{�zd�8���8N!:��!�b����Z׺�B��V­a�8����
�2Kq�����M�F��,�g^�*�	6U[2�=�5�����"J�p��O���Bb
#��϶R	�~!�B�FNx"uX}W�
���5`�l4�B@��l��Al�:+��Q�C����K�z��.
#�����מ�Sk�%N=3����>='3��>WWW�m|�_�g�p���P�קGkiو���?~��StO�>��y��8S[�0��VC��[�/ �4��mҍ v5�I+*\��,N|�^�;r�#��+zߓ�$���UQ�;��[�-:~J�V��#���j�'��E��
��D�As�q'�%"�'
 ���@-�dr89�Ȼ�!�:4����cc�����Z�U�`�{��]r��l��I�o.�s=��+�xhs�w��0��
���α����$5�Mݾ���^�����[�A���<<:�d%7ҟQ�}u����Z��������0�B����6�u��PT�c����a��He�U�Hүy��4���&N�ZuU�*v;	�
N	���ժ+�ޟσ�RF�e1��:
�B|��Ln����⹞��N0ŧz�k���yu�^�+��u��'T��wG˧~Z��a�b�n���̍���>��BЏ����p�VV�Ar#'��h(M�Rvߍ��e!q��+��+^�DJC&�T�kE���>�FeM=�:��+��Sʱ"Ԩ
�E1����M��h��m���+a�$���b6����U���Ezq��f��v�N�?�C�ɉM2_p�L��r'�'KCcܠ��:{�JPw�	J�4p���Î}P��Dž�ç�?W�5�����y���N�w�H��e�����=�]/�/��*I�e���j�݊d�JO���<�n�nJn	Z��s�m�|���_BѲp�w+-F�j�k����
� #��5��{Y��Ȉw��kE���h����K����g�Þ��ww�ww3ox>�#�c9o+���됍����d�r�)�ɮ������4�|3�҈��G
�3vA/l.b��G%7Y���4h��u�p�!�r�K��>qo}8�&Wg�i����N�0��@���kOC��[����/�^�'���~"Ma��'M+T-M#gE����34�9���n��]ȍ�<ňҨ[e�.p�wF^hN����RG>�tň\��g�jj4�̰��o2� �h��5����P�<�0�8ԑ��)���;��hzO�����QDW��6�A4�$d�*���~PK1xU0��`�.pkg_resources/_vendor/packaging/_structures.py͓=k�0�w���YpL�h�)B���B�϶�"�ҹ�_YN�?�d���t�����������HQY̠V���-�ܿ�T<uӦ-���Z3xLb�*�e���KM;D��Y�����yC�׌�Բ�	V�
���x�6��c%�2$.�M� H%��*J�i�p��C�"�2���,��s3Rm��pt�%�e7)��MM�lіͻyI�t�uf��_�����#��{���S�
e��#����'���f��d1�ɽ�{,&�8$(,Έ^6�b�I�`W�pDV9�.����*���v
=ٺŝh7����
	w'�跘n��vc%:��dC��l׬r�PK1xU�����
0!*pkg_resources/_vendor/packaging/markers.py�Y_o�8��`��H�*�{��¨�]�!�4�&ip8�X����E-E%ͥ��~3�#������C,�3Ù�p������5��#�nhA�<ce�֤)�L�eD2��	ߨ�yE3�9�d1�f��y99 ?%�bB˵"{���I�%cj�����ra,՘�\j٠�`�s����pA2��
&Y3I�N&�|Wq,(��>U�����C=��#���b���CL>Т�����<�1�\��J�I���US��M�R�ۛT��7"cu¾�wʤz�(���r@J����7������{*ֱz���M�Or���59�#� �-�dL)�]��)d�G�h�d�K)`]=�/&�����ﵚ[�k��RR!�Id�I�e�&�}���w��חv"&��d���4%3�TBC���[&�R�	�g��l�v�����`jQ�傗;V�S�cv��LNYGS����(bwq�c4s�Ϝ@6�
Z��S2��E�BpM�2A�~�%ĥ�$;EJ�aW6CL�}ToyS�!T7x<89_���_�IZ9v�|��:�a���TJ��`�	Pr��PI֜��!�wS�]��3:�|��"�����`�g�����!�%a_��u�f&C()�n
�:�k��H��e.�4�Y����S<�y�hKC�H킙��8r`ߍ�
��`�%��������M�M�Q���2%M�	���Oᡚz:���\�v��l�`����ǘ��_�W�-���!t0�Ct[4�~ɾő#L�Ai��@[��Ϊ��j�����k��b��%�4�w��	"5�)l�O���å���=�i�M��u+����s|;�4�����lD��@�ZFw���x��!�� I�����%��Q;��z<O��<ٞ�g�O�g�>0p��$$���f�����C���o~r<�\\B�=��d�5%�+��9jJ�04OM�0,���].��ӎ�����r~���=�	�XA�y�saAw�ה�1�$�]�2�Mn�����?��_/..��N���s>��`���G��}z�>�h���ѵd������Wp�S4xe����[B�ӆ�k\�O>a�rqX*���apyL�v&�h����e��ڪ�E��r��,���˵T�W��@��g�p��mG�E�2~Ki�X�U��|~�8�J�A� J�\���™��)����h�A�a���
p�j�1��+GD/y�߾%��#7��ٞ�V/X�Ѓ�Z�
�gP%�X0,Ȇ����b�zU,��V��l_�ݙo�L�%i�1+(�*�hp�.G��#U_�X�A+�܊�
d
k�*S���1���(���᪂Z"@�I�$+�7��թҥ�R�u��P�A%PC��ٮ��IX��M�2
8"���%�1����3��w�34XĠ̽ed�D�V�~�g[���6�S��	�6��L��%�\"���C���Kœ@��qrX���%��ۼ2�T�����4�:T�����=�Q��&a�u����7�wb�#l�n�[�\�`�^���Fd6#��Ɂ��]�GZ�0�z!Ҳ����S���%��.�3�3��B��8�aC:e툣a@��O���Z�c���e8�=6�spƭҎx���%^X����JM�2���*���e�-�W����7y��B�[`�'����`��=�z�!�V���vt�
�����0����KK���i��Q�8Ť&��#,P[�^a�1�c��܂�F�S����X�j�a`7�W�.)i+�L�iM�Nj�k�.�I�sA��挠}N~tw��o��|�"{S�_B�s�7��:3�W/���G�1!<
��FEc.��������j�.2�H���a�'t:nP��z��mmiz�R���6�)�~C)1�MNJ�#(���~��K"���CO�'���-WǠ���4>��^f�cm��zb�3{����eV��Ō�[.W+���Q�=�&����\�C��:�/_�ZU�\����Y�I��r5����:��l�uI|a���C=aF`j{Xc�#�mP����,,�G5�����|}�㪉N�����Ss���k�ܥkb����*}b�eϪ�}C���k�f˕�h�Ң�X��]i�ln20�m�p�H�X�cA/3�)pk�
J�?9�Q|��)�)H�"J���m^b�āĴ�
v�
���I���vͣ���K%����W̧m�H�=TF���T&w
��y]�l���T���YC.�q�}l-��M�$�{y��
����~ �$r���)�w,���>�Co���M��!�#�ԝ-�ΔO?��tX�.�J�:K�w�ƴpZg�]{4Iu�!ZNZ����ܔ��;M��B�h�7[�Z��#(1�"`n̜c��$j̴�L��A�$���Y�_�(���伍�0ך���D�A~i Pn#�|ɒ�gdJ��y�	>C�?~��Ut�䣌��
��zP�E�~NC��{��F*ʂ`aj<�tW�V	�{�c�Ï��7j�r�N�� �mQ�"����jR ��z*nT��q8��]F�p�!��5Ï�
}{��Z�+ ������@�5B��:��<cu��nj�
�{��G���@���=���Z�v��o2�`�b0M�PK1xU|%X�b/pkg_resources/_vendor/packaging/requirements.py�Wms�8��_!����7���.C^zI��e�G�����AR(=��G���N��%�v����juDf7� �4c�ɖf$K,,!�<a��F$�kA�������u�[�EZ���-x�!4O����y��)czr��E�iT�/
i��g�B���w�[�,��&c���I�f"p�t�)��j�%$O�U5��,K��
�9K^����@NJ� �C�	�.dV
:pT:f���*�L[�`"`�Al���rD��u~�b}�欣�K�������хr0��`z��M؊}3��
����/�|X����*�N�*��4Dyb��r�q�2�`M�g�V�0���&q�b�!C-+ņ-�ej�؊.��<�:��s���4K�	��M9[�\zoi�e����K�u��#�:v��'��nY 
;d+�/��fJg�� ����Ӡs�pp�g8��S͠g��X�i�D�
��'H���g�r��D3,x����l����ICx�.�I42"����MQo<�F�iJ�Ѱ���gMiX:�9�\\�z��p���t���8p}��f�W}�ѣsk�~o�Z���J���2ý��JO�iˇ_�pa�N�9]3���M†�q.'}��C�qw��\�����Dc��d����$�0�����5�1�Qip
U���Hz�
��rX�)�T��m4���i��ɣ��:�L�H��4���1��5��'Q/�F~
4�^��5P�g�o<Rd��H��j�a8�`m�>D6�A2-�C>i>�G�y��|�(����P}�^��m��	���Ӌ��5�^y�v��7l����-h!�I]LÅ��2��N(��.�D����c�'���5�E]]�_�珯`�*��YRχ1S�a��
��j[3%�sD\A�� ��z��	ܪ
L#���ʹ���BL�i��7ǎ�pt׋[��(���\���=]A��I��e
Q+������U��k��g7	�&�uYb����vEW��@���g4!�.ѹl��Lq�C�}ODAn!,H*	�+Ƴ;L2�[F�?zb{jZs�<��J%ry�Z�l}��|!ԾR�=խ$��+�W�	�J� 0)�_b��Q�����W�F��3�2 �
v� E��4����[��}o5.֍�>�Т����Gsřd�
C��A��yt�9������lFV��_��সU{`vB�PyF�0g@�]UHݯƊ�kM���
�t�2��ɯ�=>#�N�u�50e/vv(�ܨL1M����W�/	[�8V�Ǟ`ٲc�.��S�<|NFE�Lvh���n�~X����$�>�_�f��mu��ֲ��Pg��R���Q��E���B�� +(n�<�z���.�΂�X�7p}�*�E�&Q[�k�t���z4CД$1��~j(U����:��/(l��)q�S����6�67�;�<8=��/w�9]wup��.�x�y�~�d�fs&A��.��T�Z��ܱ��~�ҎP�r�
KBk��#�HM�.���t.VW�R3�L��'d��K[gCY�PoOϯ��Lk;d~�7��"�m���m
5|�ڂ0%Ǝ�tU�F^yS��7::�� ����B��}Et����{^��+�>Q6O
b�e@�6K������x~�ij�~�HJ��٠�A̿���M�cG�����T� *�G/�J���D�U{��@rɡ8-m9�t����(��-�q���B��z�6?�r���>�������u�PK1xU5����u-pkg_resources/_vendor/packaging/specifiers.py�=�s�Ʊ��@�Θ�i<ۯ�<=S��͸v&v�y#�,�(D��h�r���w��Á"�I�h&������v�V�ћˬ�.�\E�*ɣ<KUQ�y�*檊�K5�����><]&)��Gߩ�����0z?GI1�a_��ڌ���J���Ϟ�|�\OXг�,�
TjY�YSV�wQVQZ^/sըh��$��� �^�U%��z�*Ҧ,��<�c�A��o�*�bQ\T�u�l��!��
"�y��y2�՘>}��
�v
@���	�O/�Z�z�l�I�IW��J�y�Z0o6K�]�����W��F.^5�b�\�e��I����7��<N2#_�E�n��
Gˤ���7���~Mx�3;�y���o�r���n���I/�ѿ
�7�q4+��&�,��	��Lf�a��9+�)P���yR��iq���^�4��T5�.�W�yU��蘈=�O�n<8��h��
�l�j�'�/�U>>�@�(�o���c�L�UR�v�k�Zz>v��~���@#�'|���$m`�e9��suM��x:�*�ENp���D�Uͪ*j%�T�ZM�|hˢ�}��r��J���߂�k�)ȍ2����D,v�aM�I})��E%���ޑ:ز�}�Q�Ԩ��VWk@�2�]���-�P��/���i�u�l���R��'h߻V��J�fc�SW
ШU����3�����x�(�e�/a��!�_��0��>�|c�^ �
�a/�c��c�,-�eY�0��K~ܷ�OZ�pd�A�1��X����	Pb��;8�k��6+`����9�J�a1��R�P|�B��tÖ f=d뎭�;s5��.%���>(a
�I�p�j \~M��L*�:�K�D�o�e�^Z`��w�������u��g7�I��w>�vzsZj��A�X
���GS��zl|�3��BAeE�X��������\�
�uҤ��5)o�d2���!�ف�w(P4�}�$�U׺^N}z��>������r����h�xQ���p`:�08[G��!
��F����l��h����Z6��ޚ�7�9N�)ڊ^��thp���M&�|Q}8o��u��ҬP���n
�ԩ�@Ox�锄`:�ߊ�ZM��^��&�8:�n�b��?|�`�a�G-����l�Ժ�4��1Tg���CP`!�z(�<:ɵl�^�8F�p�t ��z�nf5ؙ&)R5�Ѵ��+�M�q����n�o�{F_�F./�'�e�W��eٜ���\5��T��Goo	a��-tiM&�V�A�j�N6�_�B%��Ǎ5���!ǝ�@bZ�re���L�&f��چ�ry�Q
�����bAi���e[��q䟧p�Ω��0o�n�j>I�����GC�Լ�Y�9�����=��‘�>P�*�@z�i/��ܱ���zC��Zec�Ԁ���[�_��>�z�����Add�i�^02�\(�jp����Xr�g�\��K:ߨJD^�aB�8L�A��=!���U��/�%�%�PTM�j�@����u����d�xЊOa0�O	��= 6+@µ�z��HXJ����DkP󒔆��o��!��y�Q�U�*k��\d)�n`:��#�WG9D��Z�?�в\Ⱥ�9�k%i�4m����ü����t`�撂�k�&`ɳE�?�ܹ�A��X��|��V=�i�k���h'�d*��<O�6������y���U1`p��uG!g��7�J}t���5�B�D�N�7xN�s�R���`�S*r!̕8�
ptP�ʘIOb�������i,R��������B~\��GGGW�Q��;�N�.��>�p?���FPD5ҀpbPW*����5�2։9лBB�(��jF{Gd%������ �ΛD|�>�a�^����89N�KU̻.S�����}�s�-|Z��4�*���+}΃\�[����H�xH��Z�E!��:���rͱ�e$m΢��
��U�<X�+
+H���"���A4cF��8T���o���̒[g����K��	���-���������.-=�ct��:<ŮH�F��U6@Eџ)�*|~��cLN������'�����D��G�;�ٳ����]=:?�`K���I4�	�A+�m��,-�O�;�>Fܙ�W5��n�a���
��z��/n���^&)*7���AZ�eA_^'�������K�4/k�4pW����E�mU�(
9�BBC�dI�7�N4����44lS+�w���v�l�77\���d�%T���N���%�K��?�8���~����?����o�?{����u�n'�L�
(�1h)5����L;_=��rU�St"�Nh��Rh z�<q`8o�/�/?��AW`��Q���,a�Mv:�_\S4x��#O%��N��a	5%J�U�T�4��x/�z����K�B����Pa���^'���	g;E$�7z��(�w��=&�����,��eU�a2��6L���c�*�AB����Ϗ�{��I��G�ɞu5���	9?
�ÓO%��@�O���G�d+2�I;�U�K�o�Eq,
<�_����É��.��UC�J���B�߈,>Y�9
����P͟dպZM@jc�[��Ë�>2
z��8��&~^��ɭ�#��P������Ё�
��XM�l�ֵ�%�`�;�:M��ˣ{�'0u`󒆿O�Ƹ���c26�
@ԗt������!萋�Ȫ�N�ee��E��3���!��:��!��V�F�*A�ʇ�L���Sm^V�pO������~a��#L��j \juW5���7���:��m[� ���|J�	���?���q������k.頌?�E>���6(�ku�ַ;r��$��ǎ�s��]��L�#Zן#���3��s*�x��r��5�
 �8h�7^U��P�6�t��6�Z�P<�i�o�Lz|���b�T-KQ�a~x(��.�_GG4Z��!�HG�zߡyL���]l	fr;�Mo��6ɗ��A5�-�n2��g�HK�Rk�Vx=e�l]��@S�I���[@���G�Kw
�L��T��b+�y����`�8����r����T���P���[v�\)~\�CU����vɀ��Җ�	�;���Y��Æ�>!���Ɵ���w�#R��x��h��h��;���t�UMFeSƀh�d���
U%γE֘0v����j��^��U*Q�!	`��i�����[���HlP�巡w���
��[��H����;��i
-9l�^�(���F�3,9}~ü����R�^ߘlj_��Q�]�	��RǦ/��h$�T�ltR�/ح��M�I
�H��B`�a���Ő�7F��^Ud6;����=�a�ީ�w��w���/J���ޭ�Q��0�Ɩ`'�,k��ڸ!�?�ň�ᬖ�`�a��a�uMlJP�	���$9x?�̲�^�9���:��a=��-Y�A�'���Iw�����H��e���c� uҬp/ⱙ�ɳZ�.! tϭ�l>�F�19�|�f{���'x-u��l�ʵ�&�%1�je��)8����wrM!�/c�Z����€zu����^����L<��/3/g�gu3�����Eu��Yg���2\���q�����s�bO�saf�|3c4\F�
� �t��N>��AO}�S���8v�|�~����y��F{�^o�?�{���\Fs�<��5����+1и�c�	��M�Sf1*!)/|`���<�^V���oL�V�H�\��,y8�Ff�yX����z{�.Q�Eov$+����EN'J���ǘ:n֘�K��>��{P�������?>��ු+�klU��H:8���SR�WwX��%�',ۃ�����h*�ˣQg�Xߨ�ޥ��N�\��b�a���hi
b�F�+?T�ƒ)�B�f{�
�W�Hd�%��G�yΎ�a�;�s�ߠ�Y����B��U͡�@�룳���-�<xL/O����It��m"<���W��?�����&��v"1�/u���(;�ɠ�Ld��-�xU����n���ʼT\6�c���Ux���0s�؋�!�J�ϱ�꬘\`L/w�k��y9x1��pkN~���F��&9}*-l_^oLwH��g�_~u����na�2/_�������-2��Ç����	q��8�1eR�"�/(\bjW0O�y�ތ}Joa,>���޳�����o��'?��[-�Ƴ��#����k&�?�	I�a6�京����sL��;��N�\<��5�]��
!�Jm��� �F�ðI�M���	�� ����������@��D��ރ��N=޴2t�b����\�xc��u�K�v)�0�^��&Q�
kJ��ց���=��De��ߎw)�&�a��N�e�
a��Pŋ8z���#]�-��[�|���C>��n��C�j�!/���u�R�o]�����`���NɬwE;zj
�eCtIۉ�N�B�Pz�]G��v�����vw�u ��<�yZp]F��?�@��Ք�Ŀ��:�h��nvTUF�}t��Z��Z��z�Tae���ۢ���m����W���r	������Y�:��z�MK(t���Bg���9?�q�Ŷv匆���߃�b/]_���%nS!
�ϩ�.�x���P[
��ý��w��ltQ�ׁ5��jl�-�jjW��b��EAn��]�G����<��,��b�]�hz��@U�G�6t
"�Ygνk�Z�����s�e�JjT�i�F���`/g:f-��Et�q�1e�Ɣ�S�o�I�s?j���`���P��y��;�6��S3�spĻ��7�vn�I�ajėhg��<���пQ\�4�j妃�eM�K�* �=(-]t2M6�,��S��'��*�P(�Q��)�}{2�C�F�<6�#��[����-�����Y�C�R�*o���|�B�arz�1� �LazO9؛�Sܺ@lP�����fE��z(�ͻW���h�Τ7��6dq҂C�)r�K���p�<�a����R:b���Ҟ�?3��J�_twt��[2��������h�$F�_��"�}
�?�Ǝ���/�3;~Υt.��LC��l�\��I�8z�G���ј ��v
�>����\L��
��&>گ����{��G�Ҿ�Q9-jsr�āIp
21|�1x88��@*����Q����V� 4�Ƚ[��Hz�d��4�M
��	�;�j:���:�w)�k��wm�����s�`����'z�]u{wF��
j�h�掍dͤ��
�4�OF�b��࿬)o/Eȃ�I_i/�6]�jQ����x0"͌=����C��`���ZdU����!���x��1U�$H�;ꢒ�P8�ƞg�{I��T�T�7h������"�g�A��(�S�	���|	[F
����	���wQ�?�Mr�1�:��%�cF�;���&Ҏ�: �����\��~&:���ܘ��#��ŜN��N�?�]���>K�ı�m�1]=���Z
{��#y�sߎ�AN�;r��\�oW��{�14-r�B��6����^�U$��hI��5�%A��u"B����t�踲��n+�oAc���;0����uԾ��߭<�KO\�fе,x$:q�Y$[]p�̦�:����:ڨ�����*tH�P�}w�P�ПE�:=%O�gIpL��kT�ԣ����v<:���Ol�M�N��w8b]�s훵�:�J��[�)ya.Fn��ѺS��b�6K�#c{��h�R�w��`^�eI{�!]���m�ܨ݃^�d#�
���‰p�B�\�:�-�8����D�v���gd;4��kL10`~�J�f%�ӉZc0��O�M�uu$
���uw'�� t�M[�֠6�a<�F���c�]��c�w5��W��H��P#N_�{���)��0e���<�t���UN�Ox?�xi$��U�{8m�۞v�.�?W�׷��[&˂2Ǧ���Qf�(/�+ ��@S)��]�[zm��(�] �[% �qs4ф��s!����l�;X�D�ɢ����5 ���G\|�(Z�$�L��T4%��	����^��D�HfitY��E���N ̘��<�/��8m�1g�i�[�-��J6�ec�]EJ��)�4�wQѻz���gv����h�m@��8y	�#�Ul���fcn��6�CrjW���dS���6������?͂%|�M�*`��-��m�<�����+K)$�+K���WTN=����^�^ӁCC��4܎Ñ���U��T�(�m�$����:J��b�d�����z~��'z�
��5p:6֌l��\9�b1
�$�n��e�=D6���K��>#%�sT`BDԤ�2[&��*�S��B���E;��K��DU�"Ek���_�00��<�m����R���q�:N�+N���;�L^��LN4�̙���݌���J5C8ΊXmB&�ˑ?͓/��-���=�;`@��̟]>$��:(	'aw�Z��浶��2��E�
��o��y?�j�Vk����$�T2�0��EK���ݭ�͚CKߩ���n��2#��A����z_.1S��;CE��(��,Z���KX�E�.�m��'�]?+ ���l.3n���c�>��M%3�PK1xU�	ms�S='pkg_resources/_vendor/packaging/tags.py�;�oܸѿ�_A�(�
vۛ�R#N�$N�@.6�N��C�%�͜V҉��=�{g��D��G{�����1�=C�;��-E�|'u��T�<�<au��U��U�\I�/�f��b����f�o��"�&l;؜�(K����c��ᧃ�������=+�R�����U^��2/Y����W�%��D*��D����X�_\����iT�����ki]�y��e���z���`+/���	�wp�9<������Րj]�Tʟ0�� �jFW�W�s}{��Sn����'!5�aQעT��_j��z�I]��_2�R�q�c�ER`�	WQ�NEV��ຖ)]O&��߮aTp��O���,Z�0\G��2ϴ�r*��l�C���*|>c�rr�d�ǣ��3<���Ǔ�����;ĚSY�3g0��4���Wތ�
�W�q���-@\x33�qH�D�y�B����7@?��L&�b;|wpZ�9� �)~���.�fϟ��6��i$%;�.vFϣ�=�˒K�UJ͘B]����Ո]_r�����3YE�Iɢ��gR�=�]�ժ�PA���
�2���4`����j���Q�XG�ʜɺ@��$hh��0�i^�0��z!���@4|��0:�m�npN�L�O�p�LTa�K�.I��#y}e����߲�y���16@�u��5h��>GޛY�\� 7��qX
.���Wh�8	L�)_� �D���)���]�4e��*J���88V��W�Q�$���T2QI�5H������W�⠄�TA��U�F�(/����+���U'c2��=MĊ�#�`�?KR/�?�C�%��z�"�Bi�����ч֕���Ȋ2Oj�P).2�0;x˂�.hNe�_�B�<Z�.�+�AG:�q�~�~Of��gqN�J���֍FZ�	#i��*��ˬ�oca��`�1��Ǡi’ec����r��V~����:���%�,��(@w�7�i�}Դ����W2Q�y2�R�;c|[n��u;%5�G3�Eעb{�{GJy�|�=|����6xi��!�o��n��+��i;rj�^��Vp0bDpi���$��n{���o��5׆w�=Ƙ��xC8��_حH��[�3!͌J�Cp
>�o=s���Spc���@ѯ F%�|\�k�^�3p�sH2�N�_98�%!D7
p2��R��\���R�_j��/�Xh�\Jq.(ؑo5Q��Jz�wA䕚*�8����:X���d���}o�!�ӶBAd���,��=�+F�c���C�nhb�DI�s}LJ��l0N�
�v����T+E�_���**}�t���l�\p�#���N��Fv�6*z�9u0�]Kb��A����fl��r� ��뙼��0��r�g��S��1����w�:Ί,��\)d7H��,6U�9���_9Z8(���Z�i�иz����c�fR޴}2�O� �E n.}���W*��aNމF�?��WP� O�D��5�JT������#�x���])+�LX@E�8��kQz�)�:�N�[��rV��ow�����f�:���G�<��X+a�5�E�V�)hgǴ\S
� ��E:�J-���L�s��`�H��B}��}6�n�3�
�᲎�K�Ҭ��,4P]����w_��+�f��/㼆ԋR��� �Y���C�WQj���`?��1(�s.�g�X�l6o*b�V��D%�P�'���k V��
�
��&�B5а�UUȝ/.`��y�^@��(D�BHYs�b�x�ؠkx��6�n���W�n�S"��$(։��8Pzk'bq�[��c�N��fjyW#/�rK�ސ����i*K�=��tp�}x��>}:|��զ��T��\�oM�<[��E'tԙ��\V��*��������(��hv�Kb|/H9`�,t}��#�͛�͏����{ƞj�n�
��-��C�y-R(��fQuq�G	�;��:X~��0(����,�}y<��6�)�p;��=xs�%�ҋ�[-�;m���!(Z�mΚK{�-�����xw����Q�\ڽ2~����!z�\̈���цAE�
�^�����N׍V�ku�pl��g
,H�#W�B6�����~��M(`�V�@���QYtz)u�潎�v_BE�H}�K�pLz�r��
,>�rގCb�~ ��C��ʸP�p�����u�I�<f��U�j���,]c+ K�-,Ȱ�YQ��nE
:>o�H�$Z�Jˁ�p
��9fh����v�gH�34:
��03-�)�M��E
0���Dɔ�3j"#�荰�֥�9��`qS]ew����kT�Ф"[�"L����{�%62J.L(�*;�Ex1���T�6������g�N��]
6���@����
$���@w@C�y�:�U�(4:���&̈�.��r�'��U~�}�������e����
�~�:����]����E�U��p���N����"�W4XLRHiC�_*ֶ��!V�|?>ѣ�=q)�
j��l
ЕQvѭ4N��n���|��v?�p��	���@ܱ�.��g3wA�i]�Ɉ��e�V����\��0��N��>Z�{LJॽ�兺*֯���
��6opv�خw��S�ħ�
o,�,����&�E	�6������dyWu��6��C�swb葵}��hg��>2v�S����%�Z��:��l�{&�9�����@sk�+�u|��������C�g�8��HN���ݬ�M��a��7�ˤ��e�`0
or	|F���E�3��9�)I�KXɕ�k�NO[���9yfO�U4�����~��M�:������k��zAj>��)�Jt�R��J4lgU�޿Y�=�C?��>��J}ʀ���Sm��>�Y���L57�cԺv���H%�f�Á�m(���W�M�˵pø߾���������`O�^�'�熆��h,��X<�[��J��Ů"�/e|���2\l���� N��[�v���az-�����&�UTVU��"� =�O쎍'�_y6��"��u��V�7��=�3cqQ����z4�~���j`/ϻy�*|��s�S�/��9c/�7�uQi�P�.�O=�j�rYF`W�m�LW�t� 6��T����@8+6�������e�btj�y^Wl�=�`GG�Hp|e^_\���`��CKy����)����39���}�f�����:�G{^0�[/*WJ�Z��vF�Pg���mo�F2�*23bR���Y�$f�U�i�C�k|��� �a+�2ġ�;yd�F��挅U�I��S*���WM�W<#�8�sc_����`Ֆ���ksXHak�~9�|2�����Wי��?�B��b`&�w9$
&�G%�:��W����j[W���uY�Q/�
��&⒧g��'�P�W��2�z�J���2mS�����iKݚ�:@����nS�ŭ��2P5�E�ͬl�v�Y��OF��1�}��N���#�A:@��Q	�A�SI�4�y�*8U��]��+�W�P�(v;�XG�u���;�Ej3�\�Vf��p�9�n�5,�b�2|��;��bK�u��&��MxK���o$���t�h�n��]g�3��]�n���5<�זcLz��P���ʠ�ȶ�d]Ql�Z�ԄJ�������
�H9��َ� �q��b���8�`�J�Y�ҟ��Gg-a�<��n�H�����6�V&gxs��p�p��D,�<mm��d�{�;��Bh&a�2kk*�O#�։��h�����/�+�����n4F3Ԙ���1"���Y����9*da���*�i��zh3��#.w�Ռ-l���m��72C�
�~C#�?eH.��k���ul�3�ct���H�t$����߳=R OƓ�4&��<V����@	A�pH�У�5�p��]�^KC,
>��r�=�I5�x���J�.�M�!<P1^}�*L��$���d�!��[�}��R��Bӿ�j��3���3��|�n͵����&۸\�o�	�@�x�Z�c�#��Nr�i�����Me�**���!*�Ef�K��nulʏQ4��u},=�c��5��;^N��,R\W��2>�Z�0����5l�6m��Țȑ�͡���i��Р>�f����{WdE�G-�:��2n�)�΅>Khm
�)�P-t������A2�-wOw뀢m�}ώY����ĺ���.�B
�(��=�!�X:�!�7���cʩi��V�i����"ϰW�C�
:��BAk�JNv���*��a�t�ҿ3�����G�(7��YXFn�X��aG�\�9G�Z�;g16gg;�Z�.ZxL�?��PK1xUA��3�h(pkg_resources/_vendor/packaging/utils.py�W�n�F}�WL�"c�p\�@.`�p��IU�ɑ�	�ew��/�wf��)��KZ����\������=��r�b�1���P�Y!Tk
ra��)����j�>��B��$Ef��^�odb�@��g��N�/N��ž))Mm�"PXJ-�T�do!�r]�h24��u�yb]JeH�[(�s[�b	��wX\���7��%ExY��>fi��W��&Y�F�2YFP&J㜎��u�\#sZ\'��\�]���J�Y�������̹���B�F�f޹Tk2s��y�FRq���oB���<Ѻ�e�� �	>'y�'JIN<����
E]+��5,���J.��T�2��U��.���'��𷸵��E&���4k�D��gߓ%זe`Y��!�Ӥ��H-`s�K�!,��3�)P�t<�g�~H��r�P�#\q����Wdx]Qh�$Tߍ0+H KabonŸv[�f�a�}�Q�Dd��?[F���h��w����;`��}}�k��5L�w$��*���)�(�s�A�VM��Ta�=:�j�;�v�����幅m.�aX�&
Ҽ-�"Ol-�j<���|�V��@��
qA&Ty,R��l�6�-�.�u��c�I�k,L<�A,(QP5�T�C}��`�e�m��_��g���a�a+�7)��hd�p����5�Z�]!-�W!�`a����ֈx��h:��<�A'�LW
�R�|�����qR�Xd�¿�>��m\�s��;=;��Lp�������~�⃑�R�yz?x��ýʷ&>�_P��?��oR�nB�7<\h��a��Q�؝ne\*;��s�G��vHFz��6�9�G����}O��=^c.K�v���y^H���8�t��T��[��ٿ﫴n\'7�Z��^�jgм���j�Y��<K+���櫖~�Au�~J_g�I����)h�d��f��=�ޥ�9Rwt���nT;A蚏��(��}#���R��q�q:���,�+ԽG4m��0ÇM~N�Ӥ�
�"x����Q�����rQ7��95��F��\�z.�p�pXg���@�Voz0s��[��ZZ����	c�ib=�(�
Sc�5���ψt���:1�x�����,��^�p��JE,�����OB����~8���)��ˁ
��k�h7�j�^Ͷ�|���5e���l�E�w����ә�f����ϴ۰����9��:G��J8L�bJ�M�	m�A/�x�dU��0��y�����ml�5�F8�~�����8�Ō�]9���j�Ю�8����]GKl����K�ޅ���>��g�G�މ�6��l��^��x���~5�d�:�_��&����=E]{�!Q�V�]	���$tt�s�t�>�ʂ~��.FΌ��������Y�~2+���Q,�Vi.n�j��D&�>�oR|��a��N����<qB�PK1xU2��I9*pkg_resources/_vendor/packaging/version.py�[ms�6��_��7��yvڻk5��4�u<�s<q.���T��d�ɒ�m%��gE��lO2��i2�H�.�}�#�]D��E��;]�X�Q��BM�2��\�J�*_"��ËL���Z�
�{�Q��v��`o d2e���^Y�@�)�/_�<:9;2&�.O�R����"*�|z�4a��bU*1U���"�E��%F�X�%�.���iW/re�]�<��yћ��B��Œ��q,'1�r��zQě���x Ζ��	^�[f���֭)�̗a��Ua�'�(��ՠ��n��D�e]��x�
��z�1�Ł8�2��ψ���V���8N�dMko��=;~s2>}�����o��9�Q�6��|;��v�;��iZ���=7Q5A#�sHc�.G���r�:
e�
)"�g�k��>]
xD��_�Sñ�:gD�:��ET'�Z�k��F����_j���؎*�:�
�+�+60�֌�\�ixwh�Q�(�Ḳؙ"M��ʋt
,k��s-XM��fS���6	�zc3�׬7H�BMKb��Sy��{���r�b%�L���r~��(�oL����^o�f�m��i
ic}�{hxm[��:j.<����Ts�~"="G>��]�`��P�r!�0�eQ5��7,�ɥu�W��dJ�1M4�;*��l����T|��^5�s�L۾�5��jX)���pa���	UF���XZ��2�z=^f��^�Ku��i~��i�j%��)E$�e�w��H�1I|F�)�K_/�N:�	��0<�T��6M�1i�x|!���_�x�J�i-�`" ҾF�����R���n
͎BY"��QR�2	կQ4�48&�
G<m���:)�l��
k[�K�P(���V$y�Bjr��һPr*f˄ML�.(t���fq���at5�y�f2����	"�z}�8�����4�:I�c
��@
��+�g�~��F����l�W���W����&>�N�n�ϩ���MZ�C��+V�(]��1�^�<�jZ1�$MԚ9=���冕5���`5^�|�"������{�+�g�������+�)h_Gq��tr����Z����R,�o�U�� �2T1�/����_W�P��
(κ�(��D�y�ܭ|���??�=M��,O3TH��r�� 4=��6�	ca�9����M�f���rVV���bɿ���#��l΁�?*�X}K���2t�)�b+!��P�LD�g�ѳ1%UXuR”�orЛG�?L��[q.w?��ˇ�V�����7gG~�"L2�!;��Bf �I�T� .��O��U���w��Nƻ�U:T��G<6�̘뙊<�E�X�`ۼ����0�A!8�f�DHQ����h-�Ʋ��*�:`���6��X.��x���0M඗�$��������~������h��n�kL��Ga-wvW�B�@D��3�����0��0�h�O<a�׫�X�T	�R�8����R�5D0��+Bbt������:5~�٭t�]+��˒����X�O�t���#�q���uB ^�
A�2^�
Hǐ�S����Q�N�?�{��
r�T���W
D�e��x�030�/"��"��E����(���k��I���1Y!"��綝������L��PŁ�t��j���R^"�ss.��Cq�t���3����TTښ�|\��J�h���/��8��2_in���5d�ݨm�]l�8�Vy��MC C^G�EZ�7�@g,�T*��������Z�*�K�>��X�Eq����wa�d����ƫDdi֯y��2�QL"����[�$v~���l
��9T���g>�u�_ʌ.���R��н)�����>�>y[2rs��/ �)��e�[����,��P0��E�BR�os���`���F��m�\=�?����{���3f��|o�������k���Y�M���C4?��7~�m���e;����[�o��������C0z�3���a_�Nn��<�e�|K�C�&����%Vn���W�Bjs�5�pN(����Z��d�N��z�Di)w�j�B>�������'O�"���I@�_���Ϧm<ք�﷫�yW}kD�0�Ї�Z��d�7��ʠvt�m�S�ރ�PT�lHsu��E���༣i�O`�����"W����'o��|�Y*Q��^�aG���+%1�ll4�� WEEX*�H!�VxYr�E�((��Q���}�2J��!#L����i֚�ǟ��Ϗ=��Y��ʄ眎.Sd*�U�{�X�f��9�]��Xy���y���H�iM]�T�=�Q`��@���#J
2���I����L:�y\U};��5z�@��&m�0�
4[��%��=�vi�1��sm��L�>+dGК��B�Ԋ(=t��IulG�~V	�~�YԾҙ�m'-I�h[�4�~Tw��$�w�J:��`�d�y�0�a�8��m�����uφ��V��-3�r�]ۚ#'��y2˺Vxt �\��d3����#�üݐ�8`��oi���y��������������Gu9M��Ӟxۼ Ә۾yRJT�7��c�O�gWf���4#y�B�����g�'�՘�u=�v�Φ#�}�{�i��Lg��J��4�V���
���7���n|6��&6��&H����YF�
�8T{��y5����[l����ĎӒ��!��Ԭ��Ԉ�u�8�f�C�b�d0w��hW��u�pz��v����Z�O��>G�l~�y��7����� ��V�����+P}���`�5N�V��.��m?����4$VZŪ
���}Sl�*J4�橞�9U�����橾����Pt����M�A���W�UI�k�,G���GϘ��]��_�+����s3m�msj>G!��=2$Yo6��V��5b���Id���0�Sd�Ȣ2���F���/�؁ݚ�Wl���Gbpe�S�Vb����8�XT����A�mD�.��N�ia�+�B��TLY.�����ɴF���S�A���$RP[���9�˜�<Sy���,�#>���q��ǭV�����]Dj�mět�ae�t���ShN�F���J����oF�;�-ǭ�Y��Z[|�䤅��2Ƅܭ�n.���4J��V�,�ѳÚn�61���oYP������z;S���7���y ����}���Xp�6��s�-�Dž����΢�?;��wG��pHN��Ӝ�V9��=^�Z�;y	e���g]B��0��kӹ]y�E�&�{��J��<߽��,��1��݉�>2�^?c
�b͑��	T�gԱ���
25IU#��;��E\oe�뙁�.3���@m�B8���zʹ�
Hֈ�+õ2�����od7�{BU�@'��i�5N��}�@�� ���B�AԵ?���Sr&���kC�L��Iņ[�z�a�HP��7A�0TQZ���"�K���p�!�O�2�X`���-�j�tNN
G�4è_���0��}Zu��IG@��ÿ~,��7C$�p�{�5N����R.EY���<�qx��He���<ͱ]�sn�1���*���eL�h���v����IR6l�����~\�4�jY��5���f?k��:�s�=3ј����&����X���P�4לN�=�ͦD\���E��M
^��ر�%|�7"͟MFM�`#�v������s�3э�	�ķ׿imB���b��27bw=.�`�a�-V
D�R�f��;gFg���f�H�3���[~�������i�!��6t�f�L��m�W"t@���
�.��5h�
��5����N�t�m0��@;ru��9���W�\�̪a�ŧG��o4خxA�ou�/��6���(L��."�i��<��1�Z�g����9�q���c�:�d'9�nT�e{��n$y��Ƶ�}�,������I���_���ݘx-ɩg9�
U�
mmV��?PK1xU�J�_
�#+pkg_resources/_vendor/pyparsing/__init__.py�Yms�6��_�(3g��UO:7��ęSl��T�\I����h��$&$��m]�����.��f����]�˳�5�����%���*���do��^����`��ر7doOO�9y{��-cw<�j�n��<H�^|'�(P*�1ۉT��l��8��6�Ln����V�,���{��Ta�\g<�!|8� ��f;0Rr�=�T`�ϸR�882_zy$�g$q�B��l]�`Y�� _�1�	VN�� ��<c�PYx���"/�}�G� ���B�=���A��d�`C��pI�������:�@VD�DL�p��eʔC�@{}�ZC�r�$!�f����睌�灩6yC��%L�e~^f�І�C��#Bl�t.u���,_�'�e��M�I��bJ�8��&��A<l��JI�!8"���=��(q��j�0^8l�dw���K�
�K�6{��n�+���l��ͯ�x��}7�]�ŝ��r��6���N�K�Mf����}���|Ŧ���
lWs-�`6q��
Ln���
���d��fW�Ռ�^��ݍ���t�`w����ҁ
�`<�̮���:�Nɠ2���f<�jq�{�a�u���}\L�oV�f>�t@��@��c��>R&NǓ[�]�o�׎�7��^Xh�p�h$��{���gd���l���l��/V���ұ�x1Y�a�s �b�\��Ιc���Is𨼃Et���S�s錧ඤ�MW�s-�EҺ.;g����Ц��v"�1n�@�����&�M��!�X��E����?�E�p�`@�!�3��$
O�TroGZz����e�
�{KEm��F:��CN����=����MYCh��DI�6y��',�?pa��ZM��e������ @(x[�g��@�@j,ڴ��x��������,�|
|r�q��TõWx/��L�B��a�'Ks!��`L�K��n_�#˺�8������6�T�d���S٢�hCp��E�����anp����qߧ3	����ua�a��Z��3���#���U����G�%u��L��ꏲ��3�׳ǣ7G��H��1�#ׅh�}��$��g�֡":�j�ۖ�[�+jG��=���<�-�D��v�l���Y��&E��C��%+�(�0�qeֽ.Ӭt��+��%z����fa{���W�wGn��o�O�%8]v�3���@w-c�]�ӛ��H�".P����p���gn�b'�٧#M:�ّM���xu��kByF�ڊ"�J� 2�al,�>_��Ѧ��ۨ�8!�19zoR��<�(��V�t�=
D��F�����-e�U��3������f8����h����\�cr!Tf
�LO��b�b�j-��W{b���<�*=��R��1FТ(��d8#�Z�R��a<.�Q?�M�[<+z�R����|��)��p=LC)��C������~މ�=���L�d<R��	��XGM��w�����il��2Ȟt1<T��GW�E�Ř1���c��"�FC-��\�}�T6jDk�S����`�e]�Lk�̸���c��@�h���NkGG����ǚ+��H��I̥�G�rE��,#v�T�����N�N7w;�qd��F

X�j�*5�0��)�^�/�4��j�P�-�n��
�X:٦@ߔe@?kd�~���Ď�d�P6�h�+�!���?E*��L�f�t�<�LSmƒC0`쮜>@0�8Z�=I�bIl"hG�0��dl4��]�L*�§&�|�DQxK4��%�"g��Yk,�����۔�nRlz���!�(b��
�d��j}N�VP�N<�a𥶻/�5O�S�؁�`���b�m�o�`�m��XU&�f���aDŽ5�:�	��2Mf�W9��0��ĸA�����L�S�?��i�A�z���)2I�ӓ��4��5ͬ҄E�^��%0�-�p����
Or;�2�u�#j�x�w���63ߤi�
5�-o:��_��`�^�X�1|��t�;GW�
��Q{9�{��m����x�������YZC�?Uk�V�p�o��a���5l�y�[X��H���,�5-A���$8���_��Ψ���ua��Pq}�A|翼J�s|?
u���(�$&��M B_��
V�a����<�"�ʦolvj��ۥ�1Z]�P+{�Wv�L�������-�_]KiUWZ���Uɴ+K����H��V<��wIy��6zS��?�� �=o
%#\@�I�*h���y��p����4\��5�B5�g��,++����娯aA��*�x�mS�m��P�[�|��,�,-��+m���:e�{3X�x+���������g��d��zM��bAe
]=��&i�����L4���f�t�B�Ww�5��<�T7��=�x)�888ր�(���\��=.2�����ی�F̧8�yq����Ж=�k{s�k#T����C�x�L�����݄��e�֔2Yj�I�r����̦��$sk�F�;���K.�㊌�X�d6�+����%�m�7���w�d�rp�/��Р�W��Z���sM�w9�ľ�?|���$v@�w�ְu���ң?�ûTx�ojX��%e&5�f�Z^��5!��c�'c��a�ԯy�8���n�<��ۚ)�c'�-�d��7T�f�|��9��Q��-�R���/[��(�~�\�/�Z���ٚ�,i��Ȋ'qm�L�/�V���� Y�j�95����<�g/�-���x"���@w�j�5�nH�aKV}�k�Q��ߺ�<R-Bg��:���x�z�T���IDw7iں}(��u�"˰��h�ˢ�Ŋ�NQO�a.OS^�����]�>Q<�5'����Eɥ��
�p��&h��K�JZ�Ӏ`���EYKߢ~�O�� a��V�[c�t,Q�*�"�ES��E}9 BMW\�y�!f���\�:�Sa���YkC����b�o]ӓ��q%m\?�҃d5����D�o��7R�'a�C��$ĥե�.�'�o���mzGm#�TJ�V5�sM7��#��$��ⶭ�V�%��v���*�ʒL�-�\zFtqը9o�5
�}��I�M�)KNíZ���WhB`ЪE��v[��:��=[�ܢ���y]�zm���5CȞ�9w�Mc��{�t�i�V�����j��(נxK
ŋ.��!oV�S���P�c��K /	Ϻ���>M4�W�Eq��E8�';l�.a�w!L�í:8�c�����c�]t 殀�0�Ĵ^��\��[1����A��1��w�{,m��>�8tl1����Oې��R�m�a��Bw4�>xX����᪆��?M$�y[�}��cգ<�%P������O�PK1xU/H��F*pkg_resources/_vendor/pyparsing/actions.py�X[o�8~���(�T�:j�a�m3�"�E;-A �2es�[I*�����J��8m�ЇV@b�<<<��\�!���F�f4JM��H�&��A��4N��ƪ�v�!���Z���F�Q�Ik�E���H�t$�A�����*eDZQ�v�p�P���n�6B���,SK�'*�x��R�"�u�]�Ve�D�ʭ�eLk�~gz��I	����3:���n3�ȈEDK�"Sb�'
��.�|3�̬�KF3�d�0��=�t*���l��1�֙��<,l9
���|4����jS�,�)#5\0�k�?h(��_�r����t���y^֎�*������ӶE=�YVސ��R&Z:��Á��P}׋ދܾ�I�K��c�Q,]x��x��TFx��eXb U������T�Rk����t�E
[�D�:���B��E9u�`�Z�nX,��
f/����aB~���⧙(v��ב=����*xҵ���T	��8�A�V�ƤFU�LT|��:���|ӨI��p��ZD$��o�3�N��k��*⌭oDmUZg�f
%�$/�rޙΝ��%mH0��
[Ŝe*W��v�O�"G^�[	a�t��VQ����,C��qhǬF��3�/���6��]Ho/.��-$x����4Ο����`��i�uTȢ�F!a��o�k4��8��(�.#��+�^�/_��+~��8G'����]�o�6�o�kR�T\�����*�R�N�p��v�0p��(�Ւ�si����L�d�})�N�qg�ņ"K"MMp����$���0.�D�Yc�k>;G�ҖC�3|
��T���MJ�Yg�'�_���6�TH�W_��7�؃���������s�����q�0�do����
�Yf��4/u��`��(T�����v�zSe�4;K���+۬o����+��YL$sQ�A��ٵk�#�'v�χ:���R���~��$ �
e[m��[�3"�J��ȭ\숅��i�M����������w's����	M$�Ef�'d#��&�iO�BR����O��F��
{=��њTg�n�ݮm�A�&��ĕ�� �"VW5�kx�#X���Z������|>i�D4���t�� Tx����CR���4_8@��3jSt���'l+�oP��_R� ������`���+se�X�c^�����ms�jW#{����{ ���x"h��Գ�Tc�����<�M�<��PUDe���NĦ���AJ5�)��ޑTQoOw�ܶ<�8-�t��"���?G;'ҪR���/��fT�;�
�Y8�/��=9�m�@�
*�_۰�X6���!���dV�06��nߞm�ek��UtTم~tz�����<���'1ߊ<Zy(�Q��={6h��,���`�\��:�6��+���ɱx-^�c����,IJZ�z�J���������P�(y�>:?ԍ�����*��f�0�L��s�n���"��嵷>���C�G�׽�gL#��ឆi�4����;Fj0��g���JWː�[4���`Q.7�v1���\�Ԏ�Nj�B�=�î�2���G�~`)���	ŀ7��b�-�M��V�,�D89w(�b^�]F|,zfe�m����=��ɭa[�O��vu߬<g����Ҿ�ndB�n�/j8���U�LN�S��(�=m��8������^�Wq=f;�Y��.��J�5��´��H�~��!�2�K�1���p��d�|�F��w�m8��[��}�z�pf}U�x�.ZN���[�D9P�c'{����V����=�L���s�+��u�潜�ٺhW����?ox0�$��G-:�[�8���Es

��RuUw;m�:��T���Zj��d%y�+r[�mC	 ����u�f�
i�U`�D���]��M/<�����՗�xr�������_������bf��q��)E�#������;ʛW�^O�_ԄE/���3Gwص�|E� �ʉ����D��û��Tt��2��B�ޟ��'R+�:�n#�&_��5W`���
�G����Rd6�$
\+vK
O��<4�e�'+��>uoˌci�x�_PK1xU��e~��2)pkg_resources/_vendor/pyparsing/common.py�iw�6����d,R�|$�:v�&y�{�Ưq�o+)2DB7�JB����;^I�v�=�X�\���K�(�ЊW;�$
��D	#^G	'Os؜�1K��2�<�܉良Ch��D1'�^gw��o3.�{A�������%i���,R6[����	KS/
Sb���ݰ�thʈ��4%!�e0�0r��F}���s/%���iL��-�W1Mp�$}�C��4�-K2D��l�>[2�+>��tE��`��-��L9M8r��@.Dq�B>��L.�x�EI�} �\y!gנ����U�c(`z��hH9�:`�f�1�8��)�&�l#'�U,���:�A��zn�^�.�]�2~%�	u]��X~��Ӏ:�|��ۻ���/�)��1W���>~x~ܳ˩h6�\!t�wgW`nn�\a]�L��3��ݫ���s#�(j�6�
�T'%PXc�"�=���'��H�}�(�K����]��M��7~D���W���A�>!���|��%�N��e��g6���&�G���[�>�"�U�1�}�+Y��,婾��WN�k��'Q"�d+:p�I[@��@�1Xm�x ᫘)h�^O�7�:��vl����bf��W  ��E�ٟ#�w��U�9���qj��0-�-�*ɛ7�Rp���6�Ŝݮ*�y�=|����b�&&ǒ}��Ɋ�l3�8j�����R0�st�4�� FDø���������&�0�_�����C��a�O���
�f\aWih���[�k��)uw
�~�@����P܎+�/�L[�嵶Jl�/dn�
c��ci�B`�HA��C��=K������Y�Td�\ۖ���ZJ���:��=�ن���C���"I�h�ƄGE$/��$�B	��r~˩f��2GvI��r��s���d��+D��dsے�VTҭd�9J\֤��	���kL �dD���J�z"+'�:(XB�S�:�tRx�Xɗt�oz���K�3�δ�Ye;�>�O�{YFF��/���Lg���#@n�D��󑻯U'�$��������P�w��9�bD���h=��F	���Ȧ��o�ɖ��'ZW���l�Z��B�Z�D3Y�����%ӕ��yO�e���ʟO��K	���Ƥ�ߦ=��~%�R�X*w]��}�!�:�i&��"B���6�O�,��̦��q��X���h���:l��5Egjr�P\�r�`����p��5r���s�hw&)�x�'�uod�E��0u�(a��f3Y|Ȼ���C�z\�
c��>�~%d{��M�/jG1�B'u~��p�@��h�{a����g���n�$�0w?�>�d�>gv�܍5ɿT���w��Š��6�K`�Z��*N*@f�(x��M����*�V�m<4F|>�Սo��7���U2Q6׊|B@�9P�d���]�{%�(�U	��9@Չ\&#֋XC�xN���	ģY�cU��x��s�4f�|�Q�+���Lۥ�M�
{��x݇��1|������bw�w�>��d|9���;�E˱�Z���
���~K���2r&����K	�^�85g/�7���V˔&j�1�-|"7*�
%�D�|U0�<%�$���4DF��YJ'��$�C-ߠU��#�~�z�C�
%��,��hd
	U6r/�1�Z�T�C�k�-Rt��|݇̚�3+��1,�97rJ���ˏК�@�\BD٨e���E���`�᭔Do1�u+'�6��Ha�5��9J�e!
�;D��T�&/��H=�6G�����96j@8�md|9l��/��s+����@�Ot|�B�4"s�dd��Q��+�DA�̅�6���	Ya척\8��}��q��ړ�O���?�J�o��/,���ev~o�+�R�oY[O",�Q��P�� %f� �!~�@��0��nJ4@ �t��.|��\]UA�����z�Od�E���'(��+�h_\�*60)�$tCE#:}z�L��P���'''��7l͐���� ^CE�:��B��!v��(������$�p��~b�dx�d��K�#����h:��FƆ*-�uX��?��`���r�%k!@=03���b�(r���d�Fr~2Y�
��6��|�v����G�ɬ�_��ʋ��${D\,�9�"��?�]�6��_�0b�ڝ�ou������[z����uH��C�N�?�z�+0Y�?�T�O���${�+�{ۚ�_��M�F.yXz����s�����U�z�%�͟z#��(�`���2��t�*ɭ���s��7�$c̣E�Ab�.8�E��an' �(�Q0���og������Xt���{�ܙ˲_�� @~�꿬��^o����a�}ѩ�F��{�Vψ�(de��7_h)��#����˽�+L9�'���±����x~���=��d�Պ���E��/�壸�*g�"��Ǣ���ˑ�ak�ih۩!g4`Q����.�c
���hS��P���D���Q��
�B���)���
ʻ{���9���pv�>DGhhg��O�,"x��9�d���m�y���k��S�A���үﳧ����]zF&�8�	�1)wA[h>؋)^�е�W��8���K�܅���g/����q�9���a��4l�fZ����r� ��p�(/ZO��FK�*����y�m~�i[��a��$�y�'DΚXG���6�ڹQ��!ddZo�����u�S���q<d�CWo��TT)D8����&���bJ���Y]##.��7y�滕^?F*��Nnj�r��=B[�@U���j{�	t����v%~]D8��J��`�+oG�i��5Y1��/^U�����b�j�#
��f��&7���Wy�	�Pa��2)S�L]�ן&�E��r,���U�n-�(!=�ج�<��C$B���*���U��-ދ|m��F{�� ��2%$~3}�%E<�t{��t�
�5e]"y�	.iYq
�hIa����>��O��ۉ�I#��8�x�D���,�kC������-�vAup�C<�u�%R�)�@���ř���	��3�|�u
��Eʒ��;�z����񐣾8�̧>����#&C�B�#���y��3�һ��""Z��o�	�7������L��vom��a‰���s ��΄�{|2��G�k��?����e��e�3��k�������6�x�ZE@7����ȁ/���2a�xJ���;�yǷm.�f���%g/H��yz��2M"�O��
Wi�>���I
=�:���-mP��=_ۘ�b���7���
�2�����V9.�z��}Q����V���ꦠ!�hnP/�^��1AϢ`���
��NX샎�g���1T��e{�d��24'�>���f��m�ؑ�u�`��2j6$VCj�Y���)SP�+��GVmѾ���^��
�E�����N����u^۹�;�W��Gb�I$��_�stg�"�Lj���q
pPj���]2~ZG��%���ӎc$�A1�l�ipԑ�z���o@���9gX��fa	gR�='\Xx�>��/�c�yS��*��<�Q�І��>�:�M�VR���:�U�B���s�*��]'�*����M�f.��BIn����R�Bvvv&Ӆ�C),M8e(V.E�o�Ok��s4*�ZbSNoF<�t&t���d5b��g����x��PK1xU<�ǀD�>A'pkg_resources/_vendor/pyparsing/core.py�kCG�(��_ё�9�l!��db<C0N��7�IfcF4R:����1���^��jI`;w�}����jUժ�U����ڽh�Iv�vo-����R}�nfiv�6.�|��Mg-�ϋx��N�Iң�?ei����x2�/ԋ�솿��dIWy�?��iY���]����'����<ɆP���/��3;���wY�&�U>�2I6��B{�]�J���0�������@��:7%�I2�`�e���~�k�Ag��x��Bf" �#A�M�dz�T�ߏ�ٰ��I�
\�L�VWE���8:ȡz7���Iz�޼��k��?�҉;y���8ߍ�W2����|�����p0̳qz9O��R�!�?ɀ�8��Ag��z���x���2y�oë�P�/�I\^���Esp��a2ͣ���]-,�~�<ы���&3�5��&I9�T�AYQ&G��
�?�����L*��,�DU��̠4�C^��
w~�8��q���2�w�h�j����{Q��?��xۋ.n�������,��+��a7z���x��ƣGtv>�N����y
+�J�iZ�0�(-���H.n�K��*��q�$Q>�p:.��
���D�K��_Tq���Ĵ-�lu��|\��H���_��4��(ΧIVň�h�N�2�TWЗ�u,uZ]jh�İ3��D�Ut
H���p-����p2q?T�I:M�@�(켄q`_{�4�c����f�I��^4J�ż��%>&փ�<�mX&�	�H��4b�C*����dQ��W�!����s !�U2�A�:j�W�+�a�׸�a�RZ�[4�'�6���&4(��,��������dyU^��.�=hp[�*�e+!���%K��o�;��^t����;G{�q����?���=�Z;��Ջ~�?���O'�8�yq�����h��?���x�������q��(�?|u������=������拗'���	�=yIM
��=�����v��?�?�g/z���>�;ѫ����ݟv��W?�zy�]x�_�x~���8�A��4�����98��v~�1Qw_����?�D?�<x��߃��|�Ǎ��'�ă���^�l�p�=���QA���?��#hq��=��q������Dܜ�<:ѕ�?��E;G�Lj��G/�D,�yI`��=��HǞ=;P�����ϳ���v�����][K�D���:�0H�q=��}��"z>��x.��ϯ�f-����UI/�?�dG	Жj0�n�zה�����A����3R�O3\�D�5��/�,��I�T��`0
3��v�Y<�`���<�:]�m�X��8�c���ҕV��P4,�\�G\+�H'iuq�y!T��>L�qC��������9wg�ĥlt����~�
����x2D{�z���:)�r��-��0Π1`����vfE
��FJ�;�Q�6��3<"�, �Џ>O�zt~.<���`'��9�D�a��Q8R�Q+�e9O�{_?f<�c�_R0��.���3DM�8�%P���E[4m[���y���A)uVf�K$8�S�eq��S�<�����(��魯)�xtB�F�,��KM�y���$�/G�C����7�Er�����\r��Y�l[NsR"�`(�s-@�cg;:���?ɇ��N7R<��~(���i
Z�3��`F�Z��Я�h��A�;]k/���i'�cƒY�j(F�}0�O���ր�P�F��3^����Ԛg�zd #��a�뵈n����&�Yu3x��fT/
%p7'�9���K6����֋J�+l]�up[��5p�����t&�U:�a�;�]�7!`�b~��Afߔ��'[Rr3`��/�j���и�w�e�aп�r�{�:��$�Sw��pRv���M�d���}w��	��rߚ��L����7[�1�=j�A��7���Ӵ$��դy���j�Bo�1�Kl�he�Edզ�H|-:���,2��t`p���i�]���(��T��^_�T��` ��{���i$?��A!MU�F �Sgc�|�]���-"�'����"�w�I����k�t�_�{�m��������1�Ӫ�� ��4hĞ�C���E����G� .�t��݆��L��@��ѓ'�:��ﵞ/���G���P�`��yQ���o
CآH������Y�KO�K��ץ_T�6�'�������`辭:Lb�bo�`�}����G����½>T�g!"�@�s�zN,�z!��M�Yy�ƣ�!7���ٹ��.��[6W�Y�̯<^�W��V|�W��Q�^�?���	�3�!F��[�r�ku���z3�/Pt��f��U
WSs"Y�ϻ}��t�ٮ��W�<v�^{���3��Y�,�j�s�
Z�V�N�z������y/�JG�V��z?��2�Ay��'������h۝�dA�(K�J'p
-��xy'��۸�e^R�xBe�Wy>ٲ�7,b|Ա�3Æ��j���`w4Ky=�E�z=���QLz=�Ur�7�8�'��<Z����������T[[���=��L��_�ݟ��I��:|v���uab���)������{۵D�p=�+���Yk�҅X?�@oW�n�ޱ��:lj�ܫD��oX$�p����Ȍ���o�zy�T�֫��9B	���Y���s�e���Z�^L��p1O'�h���8ܘ�%��Rl��S9��(t~��H+k���}�����S�0M����TI:P��~M�&�2�R)c�J�q�i* ���ڇ�����2����z�`?]#bG���<u4����ew������V
5I���P�t=ͅϸ��JE���H ��4X&�z�`c_��t�y�N4ZC�[�fO��gk��<?�]w;H��|8�QC��`���@����}�㐽>��œ^e�EGݏ�a��3�|�1��"Q�b
���"5+T��"��@f�}S�+\䣛�*�kp擴oc���/���/�|�Z�J��c�G������C8C[<,)!C|@E�f�N/&"A��Y�tȂT��2^]�!�
��UZ%�,&g@��p
t(��q:ʶ�F�Kk��x���h�&T{S�����)�!�(�q�p+�*�,!ɾ��K�5�mj^+Ŭ��1_`��AaU�š�FΔI<��,�	P�-�ܩ�kBZQ��ncԠs���8�w�
��Nu�����6.D�f��C�v�j�R#����o��#9u��n=:�=83�%*��&�j<:�h�|����y��<N��δ��iQq��Q%����Y�p^0������U:MT7�S��|<���/���?�;	�g����g{j:�;2�~:>�燨�$M�;/�N@��{'?��r���/'�����e�����}h�磝W���zVg���×�s����{`M"C~�{!����G]�d^����d6>��~�yDD��k�.������k��d�<#9���e��*��pUq�>�e*zJn�m�uk%ݍ�p�ޚGݢ���Y"�X��p��J�}�5׋8��˒HV�
\�FD0�9���i^Y�\
"���z��il����¡������2�K��&�OB��..�������W]Z}����b-���pR�i�s�4����9M̦���3a�8e�V���4$�F��Et�IV���n^������5��d�Ok=�K��x�CM,
�i��#R6�}���Nɸ�
9�[JS�S�
���UW����@?��J���|�߫�k�]M�
���vq)�2>4x�����e�{�\c�Hx�LG/�U<�"&P�$��'���B]ERx�8U��岳"�xE6&�������*��ٌE���^��P�?�M����Q����oh�6�[ڨAZ�F��s�R"eR�t�90M�jdD���A7_�j�QN����L�q�n`YO��%i��$7�y12�-c� �D�j��c����о�2G�}5����G�K�`Ǔ��p0�v0���9���"%K�S�\��ɍ�;ȡ��!55�֜U4-/a��A��גN
\�Dȣ�.t06d�֕�E�C�q�����Q�O��/�.P�a�39�Ft�~�O�z��#̭u�����d�L�
�A��R
P�uv�,V�Q�H$Rf{������{����J����>���]����M�z�$�u�E��X&�qN�!szҸ�H�����)t�u���}�E�W��n*�s��L�~���O���CX2Y�wc�z�!Lݲ2ji���>�J5x�7����o��Գa�䳐
׉^"ty�KC�ڛr˕9���]6��X7j��^�%��z)�3�3M}��Y�¹N�[Ó&}�aje��-K\�𡗁�s���+�-M�:
����%�fذ�9������|��`�-|���Y1��֋�\�\Z4�#��9�'����8��|�kZ�Q�;�KG~��8�k5泽�;?�~�q�do�٣c�촢����u�(��"'���M���XVjO&Ǵtv�L��L�gZ���V�?�sP�V���WB�����u
ۨ�%�HGd��h30b�.��.F�lk����5V%�5��EONv�J�T�\�<Ȇ�300��uO7�{�ό(o�N�S�����U��f��b�0��6�j��6��?��@����S�V�,ϯ��5'��D:�|Y2����܋k]E߈XU��yFg�J�<���[XR�Tދ�2�֔����`[�l����-뉌�8V,N=����3�J�T����g�����]Z���Š�"�����.�iF�a�l%���r�6[�6"��6O�#$'2�A�MY��p�E��E H�̀��?u��U	�n�RBI���p.�x����M��D�m�W?��*�bߴ�kA��j���on>z�x�Z���C�g�x�a�F<J�`��gUU���	F�?���ANܷ��vI -
ߣˎ�W�.|䢄�v��z�3�����ٚ'�"r
�<�ҙ�jzeG2pc��i
��f��|,O-���й��Z�W蠟�ӧ��/�/X�S�΂�bw�ǾS�p��	"�"o��φV{bW*R#�K�OA��7u�		4�I�!��[���"�ə…<�o��6���Wc�˼I��I|Q��¹�p�ƃ�'�㯛&�9� ���鄎7��������w�h�h��[�/hO*_֥ģ��i#i���w5T���=���2�gX��^4��7�HL�1 �"aW�lrA�*2!Χ�	��o��C�p�{ȡ�r9�O�ȉl޼ Wȑr9rI�Ϳ]|�6OG0��<��+U#Pu�[ou��W0PBloX�]N��5�n�bd ��2�…tj�)���+e�Ξ����8�
u��Fa��j�� ���Y.��aҖ�t�َf��X4v���5�t�A��ZRv��3�X�:3�{�(��b5�2+��k�lmr���R/��r��ku�vm�6Lw��٨cϞA�H̰����4�O�a�&�]�����~�T&���xm[{5J��@:�IT�l%�(J�:C����l���54��)\�c����t�8P�9��ֳ����n�u�!`7<�=�.�ӛ!
��~����K�����
�q�qm�:�yC^�=��M�k��﫿C��_n�=z��ׇΊ&��?�_m>��a�^�W_=��>���/��W_[W޽����x���<l��oa��9���E��㣆���P�9�Rn�^��;�����zt�u收�U�zd�F7�F&�sc��l	�0�)[INw�uJ֣_���"�G�ד�F����dr*�R��i�3�iW�"!�4DC`?P���$V���Ҥ�Xi��@2h������;�����^�&����OQV�+
zF��`L��]Z��pJ@�ط�폣���=h�S� ��$.W�a<C�o��v=����ܟk�Y������Ne��F�˓�� 4�������+�k�>����:|g�
��,.�MR�ƙQ(����%��������j	%����(�,"�}4���	�ͣ{�o���G�jE�#{�}��* B�ZX�E�P����I]Z�Y�l3�d�i���,�A�;t�X~&[�u��l?jr6�Ѳ�GJr'$N�1��{<m5��c�8
�M�\)WG��g��q�}t?:2���s�e��7�ݯ��?ğ�+��g�5�V��>�>0��
p�7���s�e4��ǤmO��T�"���.l�R�=:a��o��|^���N2er�����F���
<1���$�˘�R���� ���Q���禃��BA�X�gc�
�`�;���f��3Y̫ɰTdz��D`��QZN��E�\���l�!�qB'=�օ�*��(`gvO�w��*�!�A�3t�'�:`��t=Z��7Q���҃Q{/��FF�(�z�KP����^����w�b(�D��f�*.�6̪�&b����[o���kp�Ǜ�8SJ���޿��T���1mGxu�ŵ�t}��&pc���ӹ��5�r%#������7���;����F9c"���b��ǏhѠ:�N�:,���B��p<IvE"Ab���@��4AXg���b`�c���qƜCL&��{1������ԠbC�����2<=~zf~B��~���5Fa�8`���m���E�gg����x<ɯ���ah�\��
�)�h_�-Y�n�����54b{��M|�W���|��Q��Ӊ??t�����V��?5Gq����2
����������A/5O�hA�_d�g�L�Վ�U��u�����w����4��1��h$���1�i����d�'�xO1�ި�9Y_ߐ�%���pͶ��U^9�+Ex�Ԅl`Z���w4�0~�$A�Bg�]�o�E��3�8�����󲠁S�
��P*���p9�њNU�+�st{�I�RR��c\-����:&��7#ޫ��+3b����!�m�Ц��Mq�%�)m��!���r%���G{�6f_J`�ɬ��ƈِD蕍��m,���;XWZ�
5-ʎyQ����L���2��K�
�b�K���6|V�5ll����ͮ��3���:k'y�&�J�Q��$%�A��E������輝�J"�NR�P���&�sL>���m
6*���Bj��%��C��H;c�le�W+
�y,��1)�C�A�Y7�T�r��5(-����ؐ)��H�hq�]�R�Ns�������d��`��^AU��O34<󎟋d��
I*���9b��&%F<`~�i�#�c�H���S�������`����K����͜5����sc��N�.oS�'rd��Xa��\��T���X*C���|
=�K�����`�b��O�wZd�����ÇϞ�5�E������B��U�W�
L� �*��P��O-4�Vn���z���Y��8SGK=r�tէ�����o+
=�Qcy���ՠ�*g6���ύ�2Ҙ����
�ƨ��5T��%�_���f�ٝ����U�?���5�d�U2w����G�o���y1����e�T���j+��j���w`�&#��P����.!'�f�|�Uv���^턀õ����l��ʪ��P��h���&Y�1#��",�#������t����ꪛNͶ^�IL1�t�5
==�Џ�bD�Z���~���{�N�%wU���9C��|O��ի��|�P�޶��ճ��P�Ř�%���n�
vF#G���6��r�K}�tJ��#�ߧ6���>�J۟%��a^m2�>���<��M�qs�¼jG���Z��+�+NgL2�$΂ނ+Ϩ�8��w;.�q�?e��M"�8�⹹���%K8?w}���o�j|B|M�MW���H��m�c �c���c`ȋn�?`��Z��;�D����GǏ�߱);���}D.E�a��	���B��R�H+�~�d����ٷK�~�as��ۘ�aC��n�^�����DP%��K��[�<��ޭ�*�ll���Z/��hiw�F}���h#�hw�O��lbކ��f��p��b>C٨�:��K������M��池M뼤'�s?�I����m���e*�c��������XD�Gd(pK��l*(�2�@�a�	�]��*~#�Zn�R�8~v�K��!q�vH>_�kQ<���q��U�V�(āM�� �ڶ�U|_�Q�
�캺*��̕�k�([�,g9f?��+��
W[�n_��DӌE�S�ư��a�l�B�%�>ڠQ�(+����Zw�z��K|;v1� }v=�?�E�|�կ���2��5���IA"�G�*�M�x��\^ �d��Y��ͤ(��%��l�G,C�y��]��:xx7K�;Ipy����=�H�I��◜��-zb@�U�O��.f���,F-�uءn}��V�1ǟ�e�8W=V� �_�_�1�9�x2{�:��ӈ���5���t�pZ�z�A�Ó���Ý���\��?��f�8�G���޶[P�<��&`R�ϵ�c/?�ú�9L�BZv�Gc�?]�O�H#T�#&"$x,n���A5��}��2P$k��M��$5�2q�o%�5)���T��/�`�*X��;ГU�שN��I���!>�vTC@�����lOM�m0��{�%m����6��L�l��g�`��,�O4F��,ǔ('M6�)*�Z��f��策�ha�x!B�z�D}�{�D��ΚBK�CI��!(�
��	/�f�����޸�?�_q{ʭ�G�I��k&Ļ�
�fTum֡��^�׸t��='���n��o�i�Zl�4�6���\�sA��v�f3n���Ԥ��HvB�l�������+��Duq2`��]�jf��m%1'*Kb�j�~tX�H��=
�R��E7v�4Nj?6�Y<��o�#Kzi�ڒ_Z#�%�W��Q�)vԖ���b��
��b#�\�'�Gx���+���px�"�N<~��GP��K����z���!p[:��}
���ӝ;ќOIo�HkV�3��1w�/���ܚ�8}�	���QKm��Ӗ�T��zA�3��9�L�{��g�i'g�5=m�ݐ,ˮh�P��E�銇j�3ik�qI6E��kd�q5�Om1�<ݰLT,	�+��1gv'�\��%FZn[#o�HY�Z�A/�POԖ������gQ�z�eD��V�'�3�h�q�@X$�*��v�e�[��{�X$G�W���4��&t�tX�1�4���F�z�YW\�bҖ��0(�?��(��50���rC��&�e�!\�Q�B�!�a��"�_^�a�uB�Q�Q�Հ�ۑѡ���}��!9�D�{q���
D���.G�+eU�%�@�')1`����-�	��u�m�L�]�eR�5&��X8�!��C���u{��#SE؅H����9�6��%a(G%"%�^W�,1���f<�.�q�����6�q4���p��i�+(s �;�~}1x! d�.��g�m�G�l�t���	�$�?��	�>�<E�����7򨪯֩�T"��K� ���"�Ķ6S��Xjav�![Z풁!��Yj���Ѿ�߹���l�[��Q
\o�C8���m�L�u��jh�r�Yᒲ|5�&kX�f䙷�I,�󬦰�x5�����.A�r��yGl���	��10Խ�_��J��~W�n�p*CtQ{K�����{��f$y��D��'�ǁ.-�K� ༰��5�H�s���ʢ;gO�@���Zx�+N�'�*�+��
��Bڻ�9(��uٰZ<�T�O����r��E�(*��q-���u<�\�Oa� �I2e78�
�z�Y�>�F[L�MZ!4:�j\�$1�[��Q�Pp�����Dq��,��Ռm�e�\�΋7��)KRr�UMd�6�$�}"��p�c�>&#k񳣾��i���sv%Oe�w��P�����iC�e��Pk����
z��v�4�nO�F��;��M�������[fc�l{�Ě���Zh�E�҉�ZnS ŐQ�I~�~�99�c�v�L���w��虓����s�+y\���G_�TqC���fgtc��j�Gs�m�f�^m[Sγ*�@�l��_�<CgMnb�ȋEEg�F�y�����O��6��Fm�y��l>�d��Nt���^���<~���Q���{�y�d�}@e֩��o(��o��у�N�)CoJ �ErԠ9b���2�%G�R+�^���!*WHCޤ3X	�:R��G�����/kf<9���=s��X9�"�%�R��u�w#�S����ݭ����9�`�_W�A�.8��ty
�Ԛ� �d�*d�wx (�Q�r�v�غ9��Wk
�{!!�����Q�0�,eT�L�)fH��@��D��Jw���O�U�pW���aZ�ʚ��	�4R��-��-ܲ�#o��³���ݧ���'�%��P�#$OS�x�P���k�%���3h�uE�	i��U���B>�LN�Cx�����h���~"��ГV7�>L�ɚ����"����HF�<QWؙ��lE������F���tW��i�B���1gw@���-M��Ѩ�=̑@�@��2�-�,�b!t�=P��$�T�5��A�۹"�Ó�c܉�#���/��$��e�䥖վ���<)#���w�$��4ysQY�C��+����P��ȫ��#��}�UtJ
�#h�B��$�@�`j�l��3�f��p��:hG"#�:�EX�5����%��x�,N=<T`4O��	Ɔ@j`aԅ����)����Y���3s��خ�0%����50}E���;���81��C��Z�Ej

�ю��K�_�'���$��	y���va�4
v���^8��\�¹(]b`��.��,��G"�z��Z{&�=f��#<�ݚ{u�9
g�@l��;�W9����?p��ss���Ȳ�qM޵2�Q���
���]����#���X�%��p��|떯}j��G�j��g2	D	g3&����۪�0w ���̦;И^��0y���ɸv�S�>G&�\�ʉ<��������Ɠ�����N��Mn4V����}r峊㽹p�4�՗b�1��H�5�c6�^�����	enW�'�q(�����\�j��m�EGb��W/="���!�HN���*��&�[v�'
z�4��b���3y���_qD���{���̡��,��c�<FŖW9�%���5�V�����u5X��9h�„̿������-�`+�/�tCK�Zq�)�I<F�JNu����;]���|��Q������ M7%�عxDqG�T<��/q��9�|�M��:ߨo�	��c�n�ZK1����j��~h.�q۔�Y�
Ms\�u��>�Cw��]�pK��}��!݌;t���-n���9��5'�L���q��M��s��	�R��>`��!K��*2p����NY3g�Y����۸���cl]h�S�P�b��X'~�
4$k�M�1q{iM����iX�����X|ȚI<>깋��ȩ���H{���F%D6��߭�O�>E��x��v�D�c�\����SX�ŖEb�OO����T��M�o��\��a�|���/����6zE�ϓ:��W�dTX��O(�(.!
��b�����`gB״�)�u�h���˝l�6������:$��1&�_���fƖB{��L�{�
�Ke$!��w
S�;�}юL\���=7���p �3@�Ơ
�	Ͻ(�K�R�r�ͱIj��4o��+FHµ��U���:{!���)`��)��W5ύ�
�f�j����'���Ja���@��rY���fP5���m.�h�ևU=и
w#��um�/�!+~�z�GM9�����ё�7l�
���q�6f���hR�]�h8��8�<s�я��;�/����Ý_�/NL!L	4�g~v����J�M堭�EM���$C~,/N�8ҵ�%SIԼ���—�cdRj��J�l�l�8e`^"�Pp-t���ש�An�(�H��2[/F����B�p�ϭip�ק3�`
qK������ӘH.Fx[0e������K�ay9ӊ)�/��Y�@;�:�%��8l��Uof�ds9O�R<�8�f�K<`Bq�>��FJ�\W�D�c[�d��x���I9���7��_~O�:��/�N�Z�G�~�S�Y���>
�m�2a��N|޷7��	�6c+�}��� j��}����A�T�^�;��
��[
N����)]�+�>�`�aI!��B��?�� �1T��4�:�A�&���)w�S��fV��afcÖ
ӎ��<������G�
����r�gĴ[㪬�?�n U��}���J�$�a�A����	}�N�^�A{N
�LnJw�������ڍ:=%g��=������1S�pk2�[�{߯��[���V����}o�؈-"�P[�f�J@ɡ���u>,,�l�|�A�MY=��IP<��v�]V�Վ�d������i^�>���q9��]Z�q��&��ᒤ/?�"+�5�LTH�s���Е�7y`��R�X�Ȇ];'��XI�P
�\���#�h�r��J�J8s�#��|N�U���=�X�Ca:4츪�FSO�@�
d�F�+���Ur�6�}L��2���,����..#.OY?��Յ�xa�Li�TD:C"P�v�q��eˆ�lg";�������Q�G�wJ����"/�H	ㄍ��.�_,���UZM����O3RD����i��
E���D�
��(�.'y�����BIZ��2�&/��Wȩ���/I�3��r��������T{���7��<����?���&ʰ�z
c<s�	�Tr�a��5�G mo��)%~)y?�:ࢱ�u��ZF�QW'U��S
ccjU�8��B=Vu�`�,oN�k�G��9j_]_�����5���o��%2�M�.��N(ل�D4n�g��aU#g�^pT���}<@+���5��M��Q�Wq��`��,t;��)�:US���^y��j5�GU3�=|#f`u��%���O��r��D��j���ۢSrz��`"S��݁�ݳ�	R������g��~R��rے�Η,gN��.�M��m�9*L	�
]�U�������	5if�I5WH��ƫ���'@�G�v�;X��Fsؠ�����(��8��N�\�>��vQ�AP���'��i)�	Hù�@�ݕ�:�ց3ˢ���S�� �G��r���s>ؾC�H�P.q�Χ�.�KnGex����D��@�&�$�ZT�@��A�sHKY���6��>�E�ml��a�
a�[�c5�>s����E	��KP�9��@�Db��(7�4�E��-X�6����#eّT���QB՚�1��(9A
X���M*�:�VYO�F��j3]^U�Q���3�>!설h��G`8�'�ԄLc|��"���9�Hʱl��1i�;�������T��x�bo���6I*���ck6�P�1��b�[��w[׿�k�S�0��2X�����]�ړ�z��ܣܦ1zlb�j��%_�DM�iA�/��OO-P�0=�-T�z��E`8�A�6x+ʧ(�Zm�E�E���e��;���:��r��!;�����&'�8���Փ�h?,}�=?��m�Z�xǝlt��Tp��]����[��"��$�����A�W��9Yiɮ[�1.�$�<�J� j�Z��W{�W�z��K�OF_��W\�c�Q��E�_�]�vpvN��wB��7��ۢ����t���\��̶�+�h�$:0���M:;�mC>��;mb�ۈ%h��/�ڶ��kz��7,�:-J�1KF�[��x&\�i*�����������ˮ�'�l�v�d�|.,+jB��%:���<�sK�i�#�:岳:���72��.6eZ��+6jF�u��Ēv�F���t��7`�����5�r����^���k�C�0�^�Z���ja�z1�#(��z��`��=�
.I�	T�sj�̳�MQ��IR)�z�#�^ʩO�Q�;-'م���MX��J���)#�F//�r~�)Wպ��z�sZ��(�1&�jZIN���vD
�: �?�����;�3.�OG`�\���רp �r	�w��B�0��T����h�E�L�m3P*� �����@�ą����>�,��G�*#�F��s19v���]�> S�@�~��Z�m���0]�r�2Rbb��.C���X�A
��~�e�W�ԺK�� �?�"Y�Я�Ϡ�[�S`��Dsz%x��"��K3�疯��$�[�Z��^t6�@S�X��m*��]0fes!��Y�A0�$h���یYZ0�ҥ��(n^[t'��;n��-�p�I�
�Wk:�O-���@��p^p꾸F��C����bQ}]ul�����SvG�OQb\-��@���6e]*=9��<�����k��hB�m��[g����n=:[�W�5��A�^�C1����/����`��w��p�D5F&s��uu�,g����.�f(6���&���R�N
�n�msA#vO`n7�%�#畵��`7ZCS�f(@X�����,�`pe�����<�G�,[���ʬo��^�F���OK"l��y�3�]��h���
�	1;@���ס퀏v��,Ju�j'�|��̭4�;qp6鲦0z�o�?PH$�?�x�,�d�-��?�ճ��:����3�ѕr��,���^��9�GܱJ�<<4�6��j�����*zD�1��
�I�ԡ@�x{��.�;3N����̀+�RZ��z
t=�{�k�ܢBݶPw˾P-��`�Vo��j��nQ�A	��\������8b�����-/fN���	����ŧ��XGC�縻?RxX�E����Q��؟O!00��HD�ԟ��R끑�{M����.�-�)/�?���N��b�v�����~�/�9���w��O���������:ш�Z��8��RK���j{>%�)Y7��w�~�W;�Mx���\ľ��\��0����	�HGho��L~�c8�xb��I�&�*@imT	"CQ�(���!N�a#KC�=�&���bg��3R���wh�"�B�T^,LsQ���*��iv�@��T(��^��Rg�)~L[����l��,w-��z�S�ݲ�}Z�֩��<��H��9��q�nj��piݤm�gi_�y_0�N
�֐dŌ��#��*��sX~yTea=��gy�5Z,�N����A�I\\�ne�#W�[�wp�����ޣv�yj�"����А��D��|`|=��@ʳ�M��[���4�I�h1!�������t뫳^�BS���ty���ۯX��j�6���[��#�e�>)��ܨW�Ζ����_Sn<D�3B���'�1����]��[�a��8���s�~�1Na`�@m�-��n�[�:X��2Hb#���m(�a�a%�Y���sAK�������ط��|�Vn>Nu[긝j��6���
WIܤ�rUPl�m/���N�%{B*�y���z�*[��2f��-������<�++���u���#����5W��Gu9}�����[�l�RMB-��
I�
PfʿCč��!�t�d���4��d�n��33��J�bY�:�1��R��+���X��N���HP�2T�m��r�&Ӑ�Yk\n(:��<ḙ�Q�.%0�H���B��B�P��ɘ$,5����;�Sb�X��C�Fn���S�����Z}f>�;{��C�?���CR���SlB��&7��bW=�}a'K,w�i>��f�&]G�
+�=_�%�I�fV��Y� *@dp1�K�g[
n���r@�k��t��3"�Q�%	���A��Y�b�d`eS�����K��NTs9ԏ�n*B�v�U�@v�B8�g��vyg����E�%�7�PH�6Ʋ�p������[��e�������F�q(
�z���$�1PTh 3^�N'��+�=4�<|�,nD0�*��k���-hG>�.�‚�:�_�q�OEα�8�P!w�)&�:^�&�%9�J�%�_$���wM��D&T��A���"��i����b�=��;t�a4)�:j���=vO��/�+34�7 ,��Y��Em.��-��8���i�5�c�������Ք��rY�M��%T�OZg@�*��޴[�|��
η-� ���ɹO
m���*���v[��$��J�C��[��u���[�`N��0�MbJ�Ac�$�:_&eh������[�<�-��+
j�J/�q�9�Y�)��R��,�,fadD��'L�
��š�Mc[����{�'�#��A93u�a�Q�9/n>���Q�Q}�2b�ƀ��l9q1���_��bac�:���?jv;˂|
2�E��Жؑ0��yf=s%M��MqM~a�78���ܪ򪹲?)Nu�2��J��&�Œ`�����~%2�p�n�/�@O_J+u홀V��;�*$�
Km�	����6*_�����w��ScC{�+5���2M(λy�9�L2�
�yٮ�a���q�����7�n��:�rD�L��1W7:���n�$J�tY�e��U@>�_� M,�$��t6S[�O��ϟ�U��f��~��Hg��ds���#����l>^i4�_a�_Lӵ<4N�;1�9���Gڌ)��h>d�8���4Ge�Z��ěx�9�!V*��ѱE��vޏ^r����vX'R��5��JO��#(�b�>�����*�>ɞv� n���j�v[��_%��-�T��VAt>���N�'��ǤUU�ߓƪ�ϛݘ_���%�%O���m̱1U�1=��O�l��D�Ib,��,4�6U�7t�Wh�����'q�r�(L�Y���Tȅ�g/�
�bXp�g�^se�^ ���t�^�^z��34����Y��x��8[�T��2��ge>�-���w�/;���ʤ�%��q^��F��t�i��:�2Aʾ�C]�P/��b.9�V�̼�ooNu��b�9�!4ܝH>I�
V1y��T�T]%��7e;Ph��)�:3�	VL�ƨ��������X%��)܊���%V,2�&�3g�9.[��n�+�P�3؂��v�)�Q;d�M-�J���m[W��J��.	|`�:Ŏ��������Z������;�ST��r0PY�y+ÞƂ������D��]�eﱊ�4�sJƋ��u��`�8�����k�%�l��JjQ�<98�y���=7r�(
Z��%+�~�����
�J��ݦ_�Hf�+bhaW�g%�Y./��5A	�G
ɶ�q������?3�S�#g����Ӏ��ٹ�����dQ�r~�w��Q�V�§�;G���Gu� &�Zw�֬)xO�,0�I���ф{��T`j�����y>䴥�/�](ub�aV~�E�l���+ӳ1܁�������/��"�ɫ���E'ɻj��%\̆�HIV�Bͫ�7-S@���2|������߷
˼�F/�i-�[�Y�2q����ZyƘ�Z;Y�"
e��s�*#^�VR��de�hU2b5B]1���r8�K�=�SxjV�Fرrq"bMõ`�)�(=
��	�c:5���:`�%!C����E����b[}�͸.��u��MS ^Z����2����$��`����טmZ��&ͅs�4�hPٳ)�[��^�^�܆ګs+oQ9��6��4@R��-����J�ߵs.���Kb�*)=t�.�X)AN�j,ća�w�rt<C~���<�Y�&�U�����臀o�z;�!����b)�	�[�a�c��C�9�X����Gb5�44B��ʯ��#A��K�B������z��i��v�h�;�0�q�(�TФI`�p�KR@s�I#_*��N���y�����Bz��676��Bd��
t�N!�ôPܵ�X�\Z+���Md4�缭���z��:��"~���~/��-QZ���)�XW��t7�{ӂ���h>�54Brlex�PV��
dXa�g����h+څA��T1\���!a�]��>Ra�j��0��<�XK�6�"Qϖ��h4�,�ҫ;!�&g0Fв���U��0��>����L�)Rv���,f��ʯ��$�E��H��H��HV�
!�0W��'aK\�D��B	v[0��&�*�nI�L�oEJ]u��p��+�h4ԡ3D��{(��ȷݐ��Z3�{mn�;k�l�) �Ij�̚���bB��w�O�2m�6ҁ�V�N�4�Y�|��	��4v:;Z3�1���I2N��B����h)�`�)�i_c�X��-����F���M&k�Tb��XL�!{%Ø;������Im�v#��(�'�1D�C����;e�۱���:i�A+u����o�N�1���jԹ��|Xj}��Q�S���d{JT�qt2�˓�$8��Q�6R��7e�g���0���t�$Ͷ�_,�L�8�̧����#F�`�#��S��U!1�b�kk�����}Yb��y����&��t!��lj��Y�E'$��h�>�o�jZ��<�����H&�y��׎{��p�P�l@�
�n��y�:;#̮f5PM�j���7��d�,�)JL��P{��*|��x�<z�d�+��L�7՞RB�>ZbV��5�x�0y���V��O�~T-�����3Pm��$�$1]�F�eZ)�R�_oi���*GUvv��e�oCX빼�wi�;&��"K֩?�Sxp�CX�dk�t=��7�tO��G�k�o���K��yP�~S��\h���y�|g��R�%وy�w�Q�=��`_֒��j���>�/8%�lB��#���>,V�y�i�E�;�H
�!-�n��a��:l!�U�I!�Q�}��#��j�0�O�#����Z�ut�ĬB���A�MHVb�ĢU�+W|��J[����ܘM,:vb���uY��ѣ���U�k<��ڃ@�~X$C�پ��q�9������F]�Q��bI}ާ)9���`ۼy�m�?���Ļ~��v�w�;h>��9bN�ؗ�C�.E����>=s�V��SS�Yk�͙X�O��a�~������I�ʬ�U�a��U״m�O�掁v=��ۡЛ��p̞I�2}�Zm��q��H'tqXLfQXy���y�cOI��e�z���}L�"땳gK�pr��P���W�mp���/Q��z>N�ck+���I��_�m=�蹖���I��0�U��9�U��Q+@s�l�~�Zө�Ϳ��Y���M�i6O�q7�:P\�
㴠7�����`�Tq	�`9z�Yh;y?56~L�,�f5D\��lh�=Q�K��1YQ�W�R��AZ�E�s�W�	S��a�Y����Z.U_���ԅ㸊�iu���t[�%"}�5�nc�	+O�,��)<�{k'0P�`���9�
�(~'��jG%W�J��1�.����M�����isͳ8KB�X?���/�{�N�_�؊����� t����J�@�&�s"�Xj��- �[�
na�4ƚP� Q��l�A�-�w-$y]uAU]����O�������?�~}�	C[�4ǫn�N;[ZX{9\&#va�;�����*o+�yA����z�A$����ziY��i�C�i�m"��Y6]�Zt�Z
�:�@<m�p�O�nxUՎ��6��!J�k��2_5�ൈ�Mze����DqԬ!UFm�AG~#��!���u{�_;�v5�T���f%�7�qqYZ�����R��<E2h�����������u]].�Ќ�c=i{[k:U'~<9<�Q(Ds9�V]֮0�<B�T9YB�	�5�P��'7V[���U^��F�;z�j5�彴�*xHA��뫄���ć���2����=\��t4k~�<����]}�^^M�ʸg�<��	� �y(><{������[(}�ܰ��r��O*��ʖ���Y�����Rm.W73$��B���Ԟ�?����tu���T��
)�X0��>"1�H�s~>������\cN�g�;l�����-UzY:x|�u=��m��mc�s�u�~Ԃ�V_<���bޮ?
T�m}wɀL��mzD#o�X4�GD�	i��f���S�um[���0������&X�bII�_P�A׶���{�u���-G��Ѿ^�+.%���%u/��HV���ve�ġp3V �}����l}'R��'��o�S�̵�ۍ�&-��D���y����\�7]^� *�Fn)_L�J��S*)3T�Uc��q�B���F	!�%v�F/^�`|J2x@%��_�>���ۧ��s��+m-��v���̓B=�ʿ��PSr��5�ᖕ�W<Z�~�?��I\��k�i�R
]Ɨ[(��YpqQ�]*����Kf�z<oE��]@�i�׉�]#����SW����8.��3%����+$�t�X�B�QA
���C�����	��g	��3�$E&��
􃘞XB��i���6�'���6͕�P=��g� 1�7N�z��v�ʦCD����<՚w���i���QS�~�SѸ<��3K��k�
�`�HD`�td�oS���
>����j�A�7�U��/H��I�#���[�"��шK`r�BH-8���s�{(E�z�	%�S2����Տ�Z�t���e�f�
M"T��e(�Y>3h�L���c�������c.˅��;�
W��Y�*E�T�ߝ�*0�i�i˷ӠTg(��$s�	(D�l����zu^`7����`����-�ð�bͯY��aX{�
���,�[*2���γ]"N�u�4E
����C�.\Hv��!�%�(Ћ�9ف��1j�+u8MN`����"�W�	��w�D�HJD�L��&i�����E����œ��!~̰<z>�o����3�"�e�os*�Ƌ��R��#`%>�"K0A��A8E�S�O���zi��m��(����^4ʅ�b�)�ђ6{Ϋlu�����!4�0�1&l�ɍ�/�-7G������$�j{���PG��g��;���^���Z2E�Qm��:�V��Ut�G늼�B�	�*i\�GJ�	J��[�C�])s&�x�c��2��RN9�n����O��P�m�7c{��m���:�ެ��l���H�[����p�m/+q�dĘ�k\�JU)�*Q��x���<�M�8�yg��d�l�Dz[H�	W\��T��McI�0�
��R��܋^%I�"Q�3��i>J�7��'��5����!\dS���{ ڊ�k�A�[�s�z��M6�և�^q��-�c���Zù�
w:W
/H����@�Q &EO�$�Hy��`�b��d:S6���5�PЭcD=p�ܳ~~�������n��[0��O;fW�H�el�4����ɐ��1듊6���f:�&�;��}|b�
f��ћ�E��f�	I���/9��oCMp+��*��jfG��6�t�ӓ�l�2���㫾������w8,�A�F�Vl����mo���b�����Gݶ
0�3�.��:��x�#l�^A�C�OCT(�lC�4�IGP��i�[�lV~f[�j��{�`�za��)a����ĵϮ��Y�C��1h!	0����}
���p9����C���,�N�ѫZ$$y�y3�m1g�T�o�hJw��8�g{�w~:8�}�?�<z6�q��%тdF�
�M�1k"
��!k8�	��{�x�4��dռ�wWlz5πDQ����f�Q7���D��~p��d3m6SPuW6�=�+e�.t�]ye6�)��9�j���n�6��Z�
�g���5f~��t�0��0�&��Okv��m;|��uĪ�{E[!��L�Ksf�<��ԑ�h#�𛺅�h�s"��U(@�ͭ�S޺�545q��X��b����
�]`�wK��,����p�6�XE�� ���-x�WY7&�`�e菰V�yD��X{H��V�3U�Q�#rF��)t�-�3������)��%���ڈ�+{�+Q�ٽ�nܵbւ�����SF�~��7��������r�Ϳ�V�O���,,�Vp{�ȓU`Ϳ�h�8����D2&IK�ɺ�����Y�[�
�	��H`��9}d	i�Qqc-%�B�R��<��{⪚d�I"�c�d���XIeRp���#�W栶��"QQay��p��/Oje9o:�6_�!�v���
y��Q���h�:&�xx�頬?�C��ͳ����$GJ�N���M��^�?�R�.WB���F�(y�c�d���c��U^r�Y<���o�K5�Z��*s`ꗞm��?���[G��maU
�f9�ָF���-��4{�E+m�?L��%M�'}�]޳��i��+���-v0jh��"�?_��W�_rԢ��-��q���n�#x6�a���6���:d?��^>���QE��g��E�=t
��D���K�����
��I��Qϔ�D�U%�P^d���p�mu��@�,�_:���&ƃ�"�t>U!8�̩��bn�
�yV��9l>٭xLd��Cw���5�gx�̆����S�{2vLN_�g���	EN:y�A�iꝴ��r�V���rt�� �!`Q.S�s.S��ԼT83���
����A������C��$��� �ה�.=��4QaI�i����.������?�X��������29���^�m��ފNO�=��m�*|�v�m�}X��/~�!+lԡ�>��\lZS�$a�u�n����psҀ��&ܬ��?D����5�է9?�Rl?��T�@Y���E+���;��W�Дs�3��a��f]q�m���
W���n�D���Á�|����C�A�R�`��&�����Q�?�[*�[�`/�]�Om�@����A�bV��j��[���:�^�o$<�Xw�5iZ^g/G�p�T��wq��<�������j�sO� bS{-z�I��X4N��Ǟ�g0E�@B�}L*R1�;�u��#�̽*/�ЖŐj`GӐw�n(����]O�ԏ� �b}A�>נY9{�
�Q�Z��|�Q�F�qnS����]��zy�:�ҡs�'��m��5ő)O[�"���T1��Ju�e��[�����q�e���K�� ^���~R�LE ���!,�Jn9��:���Q3��u�Mf|�\-���_�U���6uj�� �w�ǿ���좫j5�+oi�
{��ntw�1F�j-EԜ1Ǡ��Ī�

f�'���{���H qNK��t�1����֤	Z��p���F�w�l}�q�aL%��ť��ݏ�'��Gl݊$�3Tv�y��PVڴ ���S\a�@ ��`0'}{q�D�����
�B��ul�O����kw��L�R��)12�Ҽ"�S���AV?�rLL�q�
�
ދ1&9g��!�J�RDtl(�)A&�ήsǞ�λټ$aFY��eB�H��8�H"W�P8q��M	<˞�x��L�O��1���O�f9.�����Dy).�^h��M�]W/��)��񈔶vF#l�%��Q2Mh}��p��y�8�E�7Zz�~'�:�q�=�҉�W��A�� 2]��H�co�񌖌�G	2�"鰖v{e�#����6Gkk��~t�1%�ִ5WO6�����zR_;]�2�J&�/�$o�nt�D��(�����{�v��3mP迸J�5�/��H��s�_$�g�*v�w��e�n>�f��W_ɦZ�-�a�`�w>��sz��U�kq6φ���Ҧ�%-SR�H��
7Ӌ|�rL�
��"�a`�Q�W
_Q6tCS8�!��6�*q�&�s�*�y�۰�)	�*B���S��QB{���r2��\h�i�=E$mv��[�l���(��m���'�Cy�ol>z��W_��o[���2I����h[���U�0���E��;)r����8ud�-��'�R	�"�-l�Ӂ���8�#�+�$~��^�._7a�U}��c��6�Fǔ�BO6��2�n�=9�psV�i��=֭4_N�o�㗃�g�-Ͱ0
�մD˞}"�{f���3G͘�Ju���� e2lZH=c�5?��L�g��V�G$ρ�3j�dv~{��yU����m��J���w�{��S���z�y�wʚ�xX�Y�wm�w���&#�{��`�ļ���"�0fV��gͬ�v/m����C�BʐboᕆU
�
��9M�e<��Zpn�W���Cshc�Y���E=�b?�u;��,�����
�^Cؚ��i�0�!�,R��J�2/���0��:B ��0Hӱ�Q�E�@��U{ K[��CM~}�
�H|=�6\&0!O��[o
�|q@/ui��Y�Ɏ@}:t�t) 3���R�H�I
�·�v�&����BXW��F���͈.;8�e���d��:��/i�(���n�p�L���6뀌%��NH23�+b�����iLYlf��s�Q5	��_��OupYi�Z���z�`%��?h݋����"�%$n=��HRvV����~�z������=��?|X!��<��ڲ�߉��Z�V�w~����VP��u���ٲ@��a>��3��P�@`�9=��+�t�w^���=�
Ss�y�׉�p�
�[�6W����H�I	כ�S?�P�l*̉�qS���b���vڝ'���
�)�a.K1P�^_�F?��]�Y0\��CHI%
�D��L*�[��b���
�S*�ӝ�n�g(ka�;�c�v�m��3�ScL7�LC��nŪ�ͯ]~^�$P6`�b4���բn��J�t���z�]�1��
8V`^����Nq�EL�1[?ou���C��~l�z���.�k�g��t�t��UW�2)�V���Tg��f~�)�?��:п0z�R��]-H��⍼����V=��"*�k�zA��"�V�C���i\^v#=X��5�`�:�:޳�i	����%�D�n_��x��!�2�]�Z���K���t���L�=Յ���ӭ�殯0�*�Ҩ*vXF Nw�ř�~Z]��I��_��Gp]����O.� 7ۼ���e�΃ш��pVm���,�@�F���Nϸ�I��U��p1�ڀ]�]��a����{�6I	�ʘD�� !�'�:�nR����SR�}R𮕔hU#���N�"�w,����P^�E�>�W�x�z�����2��f���b��7A3EI���I)_�ёS�c���W4�J�A�8�<�Ϯd��J�?^X�XA����Ķ��s����=������;g�5P��
��M9�G�vt����;��|L�l��"l��,
ذG�A��J�M�x���E?z&�k�S�c)0y�K�RE�qŔV
�ˌ��]܈}�h�^D�n�+(��cI>��}rUU�r���Q>,�3*�ϋˇ�B�".n�1������}ˏU��MS�G��8�(M<[����'X�)0�@e��%*Q^9	��+��!��9�}��R)��vR�R�|c=?W����iy�,v�h���I���=)Ep1����vC 0L
��dQ�;�#L�rc,I�
F';��R��S�H��[�xaqi*\I��v��8�Oa��z,Z����z��u��q��oEj�)�\�6)Ɠ�w�����Nˇ�����o�}x�_���u�:-�u�ӶNںuҞ��2�\ǁ���(�͢4u����ޗ:����>���_�����/���r�_����������}���y]+8q(7Y�&�=������0���SW�MO_��������������_��(����y.�#�D�|(�vmreCyk���9�N?����l֗�⿚��Ӎ�o���;XH��h'�1O1_Q��d��V��Cd����֟�;Evo:3��/q�? ������Y�-�dΉ%��h0��Ek!2 ����G�2�\o}�j�a8�gC�Q�����8I,���ߕĪJc���؁�$����/02�S��9]#�)�a�2�B;q'��'f��i���Z������d��q��Y�@�-��lS��:_1KF}��~K�pG�z�(@�@0����j��DK�a$���{Bh�`��ۍ�0=�"o���/�	9��l�e3i��7�ȳ�i2���C��||.�\o�f�y�&���YhzTx�m�N�I��a)�C�)�F)�F�Y�9�n�iQԄ�MXg�����n�@y.Cn��^���r,7����<R��~t]�|�7)[W~u��U�a7>��=��4�jum�λy%�H�D8TX1Yv^�M����'�5�o"��=�\��):20��(V�M�w�EF�M/z�lVɴ��yЅ�7Ț�m#U������Y��]6
���9��.f�#��_p��<�ˆ9��-�'S+}��K�Ns
�����H�y��v&����p\r�؉uk2���K(�V�Y�ނ��PHޡ
\���]�H��o;��t�:���n��ԡ�����׏�<�?^*+��h@}?�_�u��5�X%i=hy6��B��\m>5�<��f&�YYʞ�L��GDv���)�[Px3�\�P�WB��-x�L�wj9�@ܞP#K{ȸ6�;��'��]ef���g}X_1�ӆ��] +��
�Z�V 6
��%6��r�?�9����Ĕ�e����#��Lӊ���H? Ar�nt�`H"�bkϹU�	�i�rH��%�@��&�rh0�	 +��a�����LG��M	�SL��Z�Ɡ�A�1�x6�H���yB�V�(p�EB����"�����8h�����<�a�^ugqG)�6F���.��� �f9�r��A�NK5��y�S+��e
�.E��6�9���v&"
>��0J��,.�����(�~�\��I=1=��.�s����/����(�F$���j��[�uF�ȯ��E�9��z���U��
���h��V�:�~+�NB�N{R�:G��ǝ�ߊ����q�:��7I�
-���D�,n�?|��o@���ݑ��Çz_��&�~��jWo�[up�U����R[�Ւ-f�gM/�8=m���Κ��X��;��#�Q��p��;�����uE����1��gF?3�sL?��gA?�ҷL�lf=�Ŧ��J\=���)��$g�H�.�;�j�Y���h$
����ی��[��?n�1A��2|����m�a�1�5�b��%�T��7ԙ�r�����W)g�������Zo�с
�?�1g�,�H�n,H�v�*�0�����f���.�:�i�6�'b�X����m�֣�<ÄH�4��o4G?�HYgu/Ck���>�l\	�:����`�oSV}.���0��:h����4�ڐ�����eL����e)IAIv:�Y4������O}�o��kϻ��u��m��ʞ��뛑fYR�Ҧ�r�"��q*=@���:ݲŵ�R��Q�jΏԟ�k��bs��E��t55�>53yĂ�W-������h��rVڎ/P@�E#�GWW<����i�� u����;}��Gj��t+=k�iYV3�j���F!}P��A)P���7z�z�=(����Գ�ע���E),a�?���؋~ǟ�^����~O����g�u��2�`7I�P�F��fzy��X��jy@�:H+tm�������n\"n��=
H�ͥ��@�q÷�<ju�*-��^�氵��b4�\��]d*�ĉl�Z��$�LRh��+s?�]A8鼹-���U�l�y��T�`�n�*��7J�+B�$���I�	4�-����%�;bW�}����B��}��/�O�ev�� W��љ��)���ı8���4�������9F����_`�BuZ�]lE�!���m��&+М�a1sw�,�Y��F��t��z*����u9I�c�%�B�?��fc�h[
N �n}xF���/7�%�y���a.����O6��HW�R���V�vӌ�R�:4x�f�r�)_��~v���N�>���o{ߺݶ����O�P���M�H����ʌ�(�OۖG�'=-�)�%D$�H�J�^���'9u�Wl�,��3�Z�H`�/��jW}ņ�&��Tv�X�Ňi��U��{4�$�K��x��K��2���g;	0�
zPb�ϰl�h�%�݂��♉�-�3�[�*��_�B ����*^��)H7���<��Q� �p�G�PX6:ûrB�Q"�a�,[�*0W���c���C�������Y����r�[Ԁ�i@T����4�u&��&��B]\/.�"�b�D�KWg�6H�_/�'����~�����M����^������6z;�[5W
m̆����qf����6��)iP�C��q�nV�SדPU�)��D���P�0������w����p�W	[�{�{�������B�(k񕁢蔢�w��uY~��w*���	a-�_���&;�
��C
�S)�>���:l��*�x��E��-���[��(ǫ�ڜ����U�T�㫍�	���\�j����"��Wv�_�o��r'b��g���Fsg���0l��1`',���Z96>��Pfd�d@�������<6W����IA0�E6uX;vmX��[@�f2[��(¶Ţ!��u��IqITPJfC�۷��o�og-���#�i�N����Q�J,#��O��8�����IN?<'o�«mƟ�����n�z������F��c��?��}���'G��1=��K����ߢ7/��.�?���~�����O�9����˭J����w�Ϟ������^��>�����^���7����y�����T~_e�x�����͗G��)��9jH�9O�ӿ4���|�ݛ���4_R��o^<y�f�����~~%�xZ�b�R|���*�cJ�׃��O�y�}E��oy�����C~��y��}5�O�98��h��O��5�R�ʰ�lܜLl��e�=&y
��h�R�x屰Wٲ`�C�f|H4`htz��-��cj���l~��8�n��N�T�$��%V��
�T�$�E�5%�wbl�u�i�i3�{��;���~b'Sӭ�z�Ve�n���"�V�T����9%����JTp-"ָ�+d,i�w���I6YNg����MkG�b1��)3j�Lh�?Yak��E|FyB��0���F��J�eD���!Y�QVk+�	Mrh'�;2v���j�A?꬞FT3)�r3[
$7�2,�
�
P%�Sx���>e�ȺHY���;m���Z�p�*b��ǓJD���5ҞU��늙\��^��V�8QG'OOg�ϩ,���bG����.g>�G��:�g ��Bz������7�p5r�"�q���<���S &���[X��91��b`K�;�v��~����0�X��CH�o��������c��]��:�ZaZF�N]njI���6"�B����Y�c����J�E��K�Emӽ�I�3m�۫&�k��&FC,��'ZA��bd�]�?�uc�4��h asi��0K��[.��T>�a��p�nB�iS��-��uv�FK����"Mר��fc��/L�� `��T�=DI�Ɠ��m�&JY���]�g`gF6�枬����lT�ѬF�ʡ�Z��PB)��w�[k����dJڹjwI���u�E�|����mJ&%��m�
.]��qU�~�T�1�d�t�o����bn���Ƭ�ȿى��w*�Wv%G��V�g%Ү��0��
�!�/��T�?.���b&��u�5+5Q��Տ;rѣ��b�!v�w-�W��>�*Pu����8�� %|�Z����mŪ��B��*AP~�N�'F��g�'�dėL��k��FCF�F{#��絃^v)xj2]N�Pק�o� �Yr�K3�n\����*����ZoNO�o��t�e�q�s�@�aIݫ<xT3�*3,JsnGV��	���[kN�Bm�.��6�7{N�c�%�/Wgr��P�п+���"Z� ʡ�Q??��4�y�Y�v��G�?����l���y5N�a�kn���ͮg,��]��T�ʻ>��YR��e_�P��;<��w�t6�sHIi���_��,H�b�-Ф�URʄ��l�-�I;n@7���h���6R�A���Ϡ��+�g���I�㫴lz&��E��,6�y6�
�f$��m���]��?�谪���O��񻤌�[�ժ���!�W�����>e����,]�٧4�.��~����*��M�4v6H@y�!���H�Z�$4���KcyjvV�~��V_֕�lR��@�x���ϸ��F�c��5�DZ��LT�y�J53�Z=�]튉��}2�Cm�
*%	x��
�����H�ߚF+k(�_|IO&/�EВM(�
K��%нW2�ޞ��R}ǻ'��x>G�&"1�A��B�����	���Guw\��֘F�T���+�D�G]�lL���h ���c��R�]E�Y��Ig�2��fΜE�[=r�МU=�v�Ϻ�.�3�PGe����t��0�� d��
]ۺکd�ѧ��R����,�:0^���\�u5��*up�9%�E��sIJ����,ܱ�	�ZCbKǯ�xs��r��kMKC��iYǀ��_�:.'|C�����ގi�
�o�x�š9v���6:��^\�=�VE]�޺v8����r��f	9�)�|�v�DV•=Ň�/�Eg������	�<��VMxYOh��+�2��e�-9
	�^�S�yPA��
�L���
���ێ�M=!=ŷ�oJ�֤b�.ܳ�������FwVؐ7;%g'6�G�)9�5V
����Qr�<oz�g��l��cx6�8NB�D탪�}^�ײ]����w�f����\�:̧;��2�YueD��B��`��r�-�r����s`���D�]p�Ŕ����h�>���I��>'�Po�J��%����ٕl�9>��%b��N$���9+��|W�LdP$�#��e��`푨�?��*y�׮�v�`0J�s8���|6X��
3�1=��g����/)o8�>�@��X��↥�LY!��B��@'���J|O���G�jX����MS*S}��x�ԍJ�訏�@-���B�
���"��%�`6�8 l���W���%a��QR��d�9�dT��c-rFwHm
��7�jmgAT'�AJ�hx��]2ٻ_��V��JG��	����;����F	Ifu�R�VI#�ꩥ=K����˔A���&'���x)��q�${i+�c����M��B:�!�@#�5��uI�ǥ�O&��i�^��9k�M���m�zX����]	���d/=(�ErN�^u�:L��eH:QyMWfE�x���}�F�K��V:B�d]H��_�N��oK�`��$.R0�rt��ps�~ENp�*�gn-zq���L�ȫE6�3cѱ�5��8?�k���W��W���~�$`��ֿ��km��f3v+�Рܗh���;�Gy�5:��"xdɞ�^NRfҎ�꠴g��s!���HjDfN�>�P�#fE"Hn����<^��E���tK}���8%��n���uZ��_A
������i
��#��������-�� �?C�#�䂲��c�f�B��\nku;����/D���t%�^�ꢬt������-$���!�I��.0�j��)�C�=���f�T'�*�6�v
�ݼ�N��5Ŕg2|���vg4�V1��5m��\@�54���
-]/y;�Ƶt\5KN�&�TJN�؝�>!�o
=P��Р����̤nhRU(��g��
��u�� [�Ζaa�R����
���
���f����U�9[���S�gL�y姬U�Ah�iRꑓU��hE��ꃀO=�d��B���if�n9:x���&j؜�ҹ��zv�w�������%��1;�2��da����짣I�!�,!���z%wP/~ű��ʡ����&3��`� ��c�Q^uy.|{$�9�a�Lj2�Y)��݋-H�s;]�@qJʁ�*W�$������}�\���8��%��;m�ҋ#�����
\�����!�/Q��	��r��Y�~�A[�f����>���3Au�M
�6;��X���3�%_���Ay��Q�u�u�8�� �Fotm�'�ʬ��NB
s���`А�T	�?~��
L�2ܢ0~���ӧ=���nC�dXb8B"��Ҕ~�s}#p�/�I�P�Z7i�F�j����:�\W�4҃��d�>2�Uc`��\���l���G�{#�(��<�-#GZI���;@MH�*���������`��A���yR�Ms�Qӹ`-5<�k�r5`Ϲ���=�"eKv9�Ŋ�"..���zg�۳�$�#����c��`�Qa=�\+�l�<+'2�m(�4��aV��+�����h���:�:�R?�\��O|�[�RSܚ‘z�3�<�|������J�x�/	^S9hIw;OF��(�-����$0A���3K�Q2���V��k��T.�?��9��fr�mG��(-�@b�{Q뗖�\�Պk���H��1��X��NV[�����W�m���=6�7�(T�T�>��$C�Lvk�ә\ 0%��Fu���b&bT��31l�I���&)H�g�z:�[�Lȓ���^��#��y��sQ�Ck{�~t���`���/��C>nC�6�q�m��!�J�&J����-*�f�7Pr��4��z�k�ZK�s=MP&��L�~!D�˱}Ā��?��9qYSVC�jv�<Ms�t��oUJ���@w6����zL�"u�U�8^@#�g�����C������x$yq(b�X2x�ʈ�P�x��s�❿�4.�<0��p5�ν�r*n�&A�2]7�n���}t��qP�B��Ԭ
��<_]x`��ߺ��*=����!)�Y�u�N�I���F�}�[��J����}5�ZX�٠�Q9qN3�!�Ǒ�aK)Y�P̐�ʥ�0���@���=��5y��``�\����`�C�D#��fa��l�88H7D��x��)z���z�L����Bwt�q�8�U4�X���Z�Ĉ	ЯzZ�Ht@pۃbz�`��V�0ң
�	I�z��d�E�eNMVp�j�a׈�B:BJ�D�m���[f<��,�"}��U�HfwV��섯��x��d��N�Ju9�t�fa�;1x�!땩
���Y�m6%lj�I�G{�ThrxSo(�\t��"��b�L���ax�w(1_����Rw��t$��0��F�$�v��L͔�r���vjk�=9�N�5��X*��u����Y[m?"�,��s��@'
�?f�[��I�J��^�Q�#�;
/:(!t��!ȯ�P�#l��|r[��F�I����T��h����� <�u��^�In
�q��n׻��UĜ_�g��`��N��;��j���uu(k[��pe:C���Z/��	G�r��(?��x[6������3<̫U��8C����mM�RP�j>��7��O˂�-j��b�v)7��^�*c6
[b||����d��(����
ڷc��"VBgLˈ�=��@�03�tع�R!5�
 3�,$z�ΏJ�nR7��؞Uekq	�Z�7��V����zc�
�+,�뭾?��[���Q����`��Vr�1�Hxz5`
`����j�Ӕ�Y��5ަ�
�n3$J�!���+j�m��:�t�����'ՑC#�o�t��[�8�)iǭ�!v<M��s�Y��*�l��@�V�k��1�������w�W�ߢ���C|�O>Me	�7sSа
*'�W�P�/o�ŗf'A�%��ͮR��_���n���_��{�Vݯ��YQ�=�b�]O�[TX��-�>��.�]]�~~W��]] ��R�Ë�r��H���s���My��\M0�&�
��A6����_|w���g�?D���?{s�|s���|������G�?��Ä\�����W��f�� z���	d}�ʇ/�^�E��e�������*����A��Τ_��΢���S��yV�t�A9hct�k�{��n�ڶ��5���bGC�ˣ_T }��{dҟ�Ïݖ]>i9I�
��0��ĪɌ`n�
oH���ªJ��Ț�J��HU�>Хi�+xԓ%�/�
�R�'��C�!�`��֨�1��fX��D��5����l��
ECf9;��5���#,���/����E�;[�\��h���[&;,d�p�������;[R�^��ug�����7��hs�>�9���l��s�7ʌ_(��][[����AQmIkө�z̵�Z�ڌ�S�G׻Ns7�.�)u}݉���y�e�/���xs��Cӡ/����A`(���@<,�×�a�&�ϥ�w<*�Y/�+/r�^䮽c�����>U�;>;����C%����Ni�H5�4D��S�3=m�o�O���%�Z9	�y
:��p)�&�b��⭪�t�Ug�m��v{���(xst�e�jԧe�s��\��:x��V.��/-��KM��6w2b�Ik};Ж^t��^��$���Y�x&('��&Ά�'q�Q'E ;u���
B���ę���EN���,�� w�ER#�����)��V�t8Kd6��Sߓ�E]���2�۰z#�����D�-�y�,��g*x��DΑ�թ�mLMH�P)�ʵ�P�4P��t8��t�K���e��i��<���q�Nx*�����.��t (��T��I�\q8I���}{��+�8T}k8 �)
�>��&�����?+_}�����h�yCp2o�����k��aSY�v�f���@
�0�':7�l
*��Bfj�U��J�v��]j&7�*Vkmy�8m�#�U���*
�@�M鑓
�����Rs�~7QuRԙ���4�A{Q���.����y�
Ե�eR�M���\�vEP?ٹ�#Kp2�ȁ��>x�WG7�F���3fF��#�<:Ȝ_`��x���+t�ܫ��)s����s�Y��`��n2E�KX�zE�M[J�t���&���|-驩'�Gݜ�q��3'�������:����s�	cl�Fof0⮼Oם�]�1��2�����T]��";Ρ��ʻ���ĭ�\��*���XbT�	��M�u��+�{� f�_���;ᡸ��2��T��j���������:aX#��u9,�U�u7�C?)�����ֳ��bb��$.��ܺ�q�,������oOQS���X^M�@֩N=�J���IC�-XY�ĭ���Y6P�`��p��-��Z)�?{��'��Z}|Bc�	�R�|�n��S��f>lB���h�6%M�E�
��#���c�KCR�����Qnl��h5�\�ѺI,�Pؘrk�$���qΝ��훆���׺�0>�Z�	HZ^�c��B��A_%�BJ�2Њ�F��7E2^N���,��o�Ɛ��rGk$*e�#�0����^\��"[�C4>%]OR�8��U������)LS��l�4%*J7G�]N�O/�-P�i䇎�k�\QM�)��; ��H���9����nu���)ƒ��bǗ�,b�{���
���7B��pߨ`�6�jБ�"[��@�KF$KvZζ� DY�]jr�|�f^�.��o�{Um��n<z�DG�M�YA��f��6
�B2��g��$|�Us�r2R@&������X�<�T1	�Y��y#s�\%�U�WY�(��=��
lj�2�1�|L�6�E ;Z��gQR2�ߐ;h�s��4�	���ڝ/:�B�B�wa�T�{�jv�2��<I�(Y���2����8�8CUr�T��^:�U���l $�m�"�v���spF{l�;*�d���y
�4d��b5J�
������ך�5�te3����2Ҍ�=���Q��6~�4ы�=�r�4����ݓ>�[H���Mc~���k}�m�a)�a_�=,C��)�'�xe-�l�q�^g*ܥs���]�׈Z&������Y��v$m����Pn�;^��ݾ!�ޜ��^����/���q��g�+��q�M\Ѯ�����p˨�i�u�[������[6g;��^��_���$�Zx-�Y\_���x篧��F?Ra�G�g{��
tx��Gq�`�ض��m�ef�ih
��^��LmZ}����٪+0�#�8!�b�kR:S�k�`��v���,��}f"�T�)��7�}(p.�~�Xg%�(p1��pJ4��?�C!�S��6��F��8㋮箏]�xwv�_T�S���mzgYΚ�N�۲'���!�7��n$Z������&��
���z�,�.�$��4�<�fs��|zj�?=��a�݅��Ռ��Ut3��so�Jb�z�J�wI��SbB0� ⣑uvTow�,�Z�~s)<����W�fK`��]
0�C!��`�>�@B[N�(�v!N
���E�.J��%�ᐂJ2���ׁ��3��Q�9�ϒ���.ЅS��G�]��1���Q���	��=+�={-AY&-��(^�ݐ8�=�.��ȸh6M���:���e�w�D�iGm���@u�*b�w�7��cM�1���]B9h��Z	�k|W���L����k�������h恉�`Q:�&�B��&��ы�6`�-f������SSo;�J̶S[��
f��"=�{�ν��t�A�R�&�Q�����V#�g	��u)��@Q\<@V���N�Ս�?��޲�R]��Lq�1P]q/E6�quN��U����x��ɟZrBPa:���ڛl��Y߰�ض��YVJ#%"�qElF��؃�{��S}��]��K�˩�a h1�!%ڢ���%R���t�"�ju.šV󮬜������?'�H�O{�M?Ƴ��d�*����Z�����G�*T�K�~���f�2�1�Us����Ư���*EŪd��3{�.2�"�uì��9G�H�#��]D��=��hVsZ����bq=I�wq��G�p4H�\S3N�[�CXH��~���6țw~-;{0̦S�[)
��q�3@��r�?4�9��j��5�����	������9V:�$�%���$���_�aS�����Z�&�m�W�2J�E�M����,�g���*���5��b��5���Q<�����

z���y)�2d�hj�Z�qGQ�l�d2�*$Ls�^���>���mC�]�y,f:��c����x�d�<�$�q�}$��������Jd0Be�l=r*µ��k���P�e�!�*r����QQu�.z���Ü�����+�(���)da�
u�Q;�(�����Cŝ�^���h���p��zo8�x�e�1�Z�G�	���4�uLF5D���.���o��b;mH�����y���9�;��cα{R��L^�䋟uu��B꽄ʑ�*L��)�D�R+����S�iy+�z�g�F&�L:�I��s�����uڀb%/Q�)�bV%�ٲ��R�Q[x�LP~�G#ƓeU��}d8��S(z6�zA��4w�l��;,n����bnHi�WeĶ�\�P�q�x�e��Kj�a+A<*��G��
~�]gK����+ŇA<�B:� 
���">+N+�ԫJ%�8S�+`���������b4�޹?�,F?���.�q{gg�T+O�ͷJݲ��*u*-���w��myU㻝�!m�M���d�d��"1=�Σ���aS
t�����o��'�|�-�Z�sӷ`BZ����-
V<��G@��W����
�82�h �^E��Qx����]$|��y�����%0Owɟ��T�Y��}94s�1�'��a	�Q��խ�9�mM�U���+U�"�-�B8?�Q��T�1�]� ��|��u�e�{#>�?V���M/:<v��u���'pXO`D��E-Hi0I�_́��t�E|�䛯�2�g�\DA�ՖT/V��`��XOW�l��-ƒ��i�F����[c}
��(Q��cj��n-��,'�d�H
8`��o_y�qY<���ڏ4��Gw�l��@�]xD�L�d�Vߋ:���p�e�u�v/@LA��sy�������Ǔ,^8Z��T�V;����)�7`G�*�a#�XVR�I����)>ϳy|����SX�U������6�ȸ�ҍ�r�mT�]OK���v���CX!̹̀%�l�ֿ\�:���tv��ܯֱ�����Q]h����F�fγ�	�š�=ZY�V���6Δq�-��業�ܣ��I�/@C�+�/:�a�1�P���D�*:]DR巊	�]G��Wz�z����'h%P�����Z��wDt�7nG
S�A1P�>��&E�6 Ԝk��?Տur�8d:nu�w+O	a~`�[Z��d����p��t��pŶWb�S�˽@va�L�d������B��
�
�[W��X�����q�2q������b��F]��U���
�<1A��u�TG��F
<�s�p�tp9�A�C�‹B�����tw4���ޞ�b6���'l��e{�@Up,e��Om���a� =��!�����_���A�k,�Q�2Y�+����A�p F\܋` �$��T?N�x���^�tW�L����SI�'��Ve78妔f�r*p�1�)�Ѭ*���`����U&��6�O=�9e�%�scU���*��d�,R	s�8!:v7�����v#�{���E:M��X�J��H67@i9E�z2�bN�f��=IT�*]tEM C	y:Q����B
�)�TޭT��vW�$ͺ�VW���c"�*70lf�e�Ad�8v��,�6�<���'�sXl(��@q,4Ϻ�[�w#}�,��N�D�������W"�x!�JlY�تۙ��l8U��]w�vx7�qA�̐�e�R��!m�3���*O��U�$���ݨ���F܆tM��^4
���R�`|֓<%�[�g�'�~c�wz��貫�:U���T֊_B#��EbgQ�0)v�_T��t���l���F���_�ӓ
�Jʛ_�&�$��W�L˚�-�x�|,��c7ā8��(^,'2����v-w�`�f��2q�T���wd���
�
Z#;J��` �.=ŷ[�0AQ�<�Y�Sg���BfĔ���TB���Qz�.���9��eajy ����'�)'$�Z{lR��P<A;�M'Z�z���	��j�l��,c%@����%5�I��s���;^.Hy�v{k{skkk�ϐ�53:o����n:����
�嶪_i��ös�Zn��Ϊ���rG����~����.¡0�E2#N���"]\����C��Y��M�lv?����@������Y;��2�E��l��h��:T�g����,�|�� ���:��?i��F�*�����
�>�*������$4x'VD'5?7��<ֹV@P#e�Zi�G-l��4�$����`e'fipk(lu��V�i�n��Ե
��F���[��
��h�U��d�	��~i��l�8û���mR����hw�~�m� :P��_Z��4��m�nn�:˜
'DY����!^]����
l6P5?'>
L��
q��(�d�	��S�N��}��r�8?O��i~�lOAZ�	j�T�����d9b�@���HYNO�%P:�ʦ�J�!1��n�Ou)3�Cf�,�v6[J"P`G�!"�Nߴ�nK��!Ւ���
+:gX�"B��tH�_fx�1��-L��]������1cK�O��~�:���WcJ��S�gËi�����;j}�di�B3���O�N6g�8�+��r�D)S)��W��"�1�����5�i�ه��*�I��(�����ލ�70�;�����b�$hG�蛤� �@��C}��Z�s�gc?�6����Ӻ-��|��_��H+�Z8���E2��y\\�Z�>�{������!��<� t
��Fcx4p=G�$;�0kw�n?�
��+x�<��	_q�
��B�6�	qb���6���DV���^��	���%�0ڹm�l@m!�72Cl/��%p� yl9�H&i%�T��M�ތ#��X)#G��P�q27U^�v�><�F��d�Lf�N����cIe�-�Hi?�3-Y��,YXVl�O4zO:�˞tm�[:�a��|eu&U?@+BHƭ��-X`��6�719�<�,�7�=���]y�U$��ˀcјC�j[��dֲ��%rI�tVw<�o^�!o��-����6lt
�(;�Wnu|�yێ�۽�o��ݺ���zJ 6�zþk5�j�W��BK�{����0
��ëRV(��#_=�C����_a?�|�}U�Eq����*���Wt
[�7��Wѿ�q�lQ`b	<dG�H�~�*a�E�-E.�����+�m=\g.8�S_`�I�]����h �U�o?I���9��$l���A�[.w�Ҟ�
������A��t�l,k_(�f'��~
�Zr�( Qv����Ǹ��wv0�g�&_�}k�jx�NBe�+CWo��Ѭǁ2�Wlj�=��,����QW���գ==�%?��A��S�`�?7EcUF>���js㼕��Շ�
�}�C\+�\a--����T�����^�9�jjy�eU�wVW�`S�-��A��D�:���Օ���@PXZB==A8vh��Hx�{A|�ꃺ�
͵�@-�QV�yct܎g���0�+he˅�xrj���zCOK�9[���S��0a:/E6CİML-�#�"ڻ��7�d��/UeJ�s4����J�p�ҳ�x��"�(BM2�.���U<�%%��S�2��qJ-8!�p�0hg�f��Wа%�����<9�1d��H�<���Z�|.gٕ��>�1��:G��9
�8�=z�d{���wF�3�ϼ�]��JC�("��E0����M�/��W�Hz;��aʹ`7��
F��O�몥Z`�t�K��A�3�7��$�k�-���:C�2:N!]�d\��k
O�pF��a�{���@@š�'0�hF�.)�Q�T�X�*>�^(�j�n����l1iN$��$gT��|Vu��{/�I6�YYȤ-9� �=��J�Njl�=s�gЯ���$q����
ҩ��ě`�*2ੋ�Nc��D��Ʃ��Zs�:��֖n��5��L�U�H%U<X�̅j�Y�v&)�{;];�eX�i�w��x1 �MA#��(o�N���=�L�����W�c�����T8�P���	u�d����a����wN�P:�#Йr�C�Y.��q�#���p���M�əLNP���ظ�7wJ�m�kl���keC:�+�ʟ�Ye	ߤ�
>ٌ��S�!+��.:���ۭ�+
g)}�ua�Jo�����b��G�9Ȼ��B��@�&b�;�ݱ��8X6�;~�[k	�֔��ܣ�L�,�fe�0�B<����b�gtyv�cl2A�6&�B�3��ۖ��1�@�T�C�$Ti�K+�T;Xd9�VZ&������,��2K04���*��s�r2�X%o�d��R~9�ۘ.��V_�
�l�6β@~����.�� �B�Fl�ੵ֢X-���,��%of����́G@/y�þ�!�N�dzm�䡾�vj�"�l�R^�v��5Բ�|m�*��o���5�Y�59[[e����|J�f��n:9��$�Y�u�g/m���|�g�ٙ����P^�-�F�f?	�L��v�:R尨�U�Q~�fFɦ1�7=4�Pp��Y�R���Unj&r1�葡��d)�ҚgK����F��:tQ��C�>��T��k+�I@��$�>�x�	a��2�
5+'��k<��bɈ2$V'h���<'
�w
��D��hM6a�x�a��Ef u�F�$�c���w7�A"`[�x�IcW�H�9C�to��+���=�6dHmj��cDf�����<ZD8�s�8�b@D[U`�`�����`�]���
lCa���*c�{(��.�nw
���j./Kن�1U�k�M�lNF+��H�%��<=ir�3�$kt�*�\u�Аq*E�a,�y��(�x��GS.��d
+�K����w�J�Q@��lY(���w0AQO<���2Dk=C�8�Q`^^
&Ձ�/��h����(I��m�*W/����R���u�Z�����K���>6�F��؞,��F��up���
���4�x�PJ��¡_��Ro���Sɟ�"a�$����XN�O�~i��AC1D�3N�3\jH'Ƃr�&�����ڽa	�Jl(F^a���O`�Ѹ�AD�
n3-_���xS�M+��A�Z�n��R���*�i�}��,�Tr��
Z-�,N�IGR�Y��$�{n$G=8IrHP�;��t��u%	��T��;%B���jk�,�S8�0�B5A~�op0�NL�p�4��=5ժ�'�[Z�a����w=L�?����بۡ3�"�S"��x��7�Ѕ�!��,��҈��0a�%s���Yr�S�_d�����t��OZ�xǖh[Y�@�����"�h1Hw*���h����Q��-����7��y4JY7�v�g䯼�6m��S�&գ倪��7��ʹ,O�X�$��I��,���U2��w�)��/�iJ�E��(Dm��s�&�^�-��n����%��5W&
W���*�ה����
&뉊��•N/�Y}=����i]#�	�N�C$WmM���T�/<���oh~�Ȋ�_���X	��r�i�\��k,�E(ň��&8V���;?E�!k���󴛚��i��~#� G�Xm�d]�v���9="oQ�>�P���Q��G���G��t�S�M�En�=
ei�I�!��~�}��ǻ�EE^v'=R��P�[�0ߴ��9>Y�I~#ڧ{r��P�����~Bh��<��:R���7�z�����؛��
�/gD)��aIjk�)z3�Pϲ0���b��Tu�!�u-H�w����Vq^t�՘�����*��c�P2C4����E�.��'x+��z�	��4����O����w�핥��EXx�Fl0�|
!^��rt�K�ղ��FŸ��Z\��v��Z�CD3�YvC��V���Ԅ��V�S�v4{uI~>��3�t�SB�-�t>������V���EͶy�g]�@θ�����Q��H�(7VF��Q#��g�F���d�*�&�������ud3�1C�o�q�֩�=��]�=�����ri���G
偙�i�n��|�*�Pb�2�'��g�gf=ߵ�����я�.f2�h�&ޱ��w�������;x%f�?���Z��۟�����_���o�Sն��!�s8�N�%0�$�J�QS�~GKh-�ߨ�RO��6[��i$�г/G{����4:�W��ngk{�>�-uX�ξY�
a�)��>�	�.�s�����J����rqL�P���D���<bu˚3u�ZQ16�}�`
RMԏ�QpP�<��[S�AkZVF^����F�,5�PY����:�%�;7��݅l��1I[�sw۽	�\�=�E"��R�̇HP�j4n!�O��c�'	Zd�>c+��1�#�s���N�Z4%S� .xN�x�x���>-�6�R�aˮ�Ҹ*0j�cI�B�I��aF�\��,�u���D|��1�Ƣ��L�Qm�6��/���&�1�,���Ӹ�z1*N~�$�8�����;��5�x*E�&��/�Gϱ��b��Y�'�
Yy�c,J �j8�LgD��l�_1rF����}���Pd�p�l^p��,���"p[]����1!����[[�I��Nekn�9�~{V
	�1��P\w�5��V��`�>.x
I
�񣨚"N�}�,M�H%�ɐ��:P��7E:���F�x�u'�D
��a:�&Nߤ��Z�)ր��G#+z�2��b�(%�}�_��4@K%�=рL�Йǎ�E�w��*�ޭ�:��K(#Z�,�=���b����(�T�_��r:S9bQ�1�-�[A�W�H���#���m��u��'�tFЕ�qI��|���dP� �-�h���{>A(���J�ڌ�Tc͙i<��0ʼ�i�1Ig%�T��f�N���"�dSH#j�Qr)id�ui�V��,�Et-}
Vz�`w$�
-MX�y�dś-svk�W���IE�q1���!F�@�{���6��J�Ӎ֢%���۪�^*��Gd�٬����ʬ���T�7z��*�;N��,������돣�)�0�v�b����$O��@k����)Q3ZYd�����ѱ��V+���~�����Q<�X�+�;�?�<!����D[e�6��fK+��c�-�w�U�&��L�
������U�W%���Pݷ�T���!]\Rh�N�m���׭a���0p������������	�lV��QH�P�H�Hoq8���`��p�^�2���X�h8l��]܉�y6���5gԩec},��G���pia���ĮQ��+�3��B���E�q��D��3X�x�5F(�y�EKO�4��Ryuq�VZVB��,v�`��u^�p��
s���-$�R�%��P��qU�e��CDhJ�P���+J��.�Ȗ9�[,y{#���_�h�
﯐/�{���I<Z���(��e��j��#cr��f��VI�e������,�
u_G1�6�lY�F���E��<�9������1�Gb@}�w�������!�������,a`1R4�ī�G�aML�wd�������S��'f���e����/q�;-*�e-��(�

�ҠC�q#mHM�� `.��{(���P_A�J
_5N���Vѷ��6��jK�4,����cw �	�Yi�:��C������g�K�J�㐊I�K�D��L�7�Z�E�Qt--[�i�9�<�vT̵���6Y�6{�9-	k����Q�
א�PI�Mg��r�`u�X���;��~g��~gnv?B'��YQ�F�"��f%�RW�1重aMq�[i�$Ì��ɘ:9[��k3�g$Ǘ�r�n�}2IF=���ICA�������	� ����&�s)⑸�
����׽�wF���\wH����-�n!�f%�F0�nu=�����|���WIs-����R���Қ(+��]�����]�0���]2-��La��wA��^@�����z$ٺ��x5*��ꭒ-�_��x���r�c [�?�o4�?�[�ꝯ����ﴆ�vu�pnl��α$!e�d$�/�����ϿX��#�nA#D{4��rRX��ꑹ*��c<`L����;c���Թ;���s{.qw}�W>�	,�	�o�Ǜ�w�l�����g5kʖ�['�}4�T�M����$�v.q奖5}?�"S�vr8�=��}kl�T�=�c�@��.w�jM0g���!4�����R�I�L�ϿD��ؔ�\�jH�u%0�־�
ZGՃ���}�Ο�l����	��
6Z����F&P�at�y�B٘���%2R��D�[��P��{p�E���+��$5ITz�>���Q9-������[�r�v2��k�<~&	��3H�a��K�D�gl�����ͻ�?�ۿu���Z*@�N��{O�F�ڛ�����ɝ����=�>A]G�y�u����99��*��o~{r��j�%��oP��l���a٘���r�P�7��x{H�\�I�����?�j؇��^d��3l݉�m���Q<;Gы/8�j�ˢ�&��[o!w�<&WЅ�@s#�1Y�u,2��&C"r�,�Yr�_��x�״�S{�,��tIo�+�]�c	��lʈ���L�r8K�O&s�tM��EJ�e֏�y[�o�L�I���Q@��"z��yvG�l�g�Z�+d�V��'h9i�-�Z���Vop�[��OZ�y�-�c��_~�*��72)�!�|~��9�e���b���O�`�������|��$N�����EO(hNв�Ku���!�׻�`)�E�&[@E�Jծ�ĺ�i�(�2���]�z1�d�X- ���)�
�71�:
%����yF����Z*�"y_]0,���ۺ���~g�5	�! �g�xt)]J��~cC�Tq�P"F�V.��H�� ��`��̆����[n;�4�S�=-5Fj�V:�����v(���2�o��(�Rc��M���?g%�]nty�5I�嵕����+l������ʁ^��w�P�n4��B�Rd^eZB*Set�TȱL\�7 ��s8�( ������«����qr����.�a.��4R�>O�����IB�}2&��nL�q��lȬ������4��_c��Z�o,�B���*���')�������-(�@�rP�=8N�9N/G%Ս@��,�@aS��26�A���ð�^�xDvru�dRԛ!��.�-��*t[٫����T�
XB5�����	[5A�u�������� ]���;Y-�:[*�&L��V����Dq}�m�G[�h;vҘ��������NSD�g5N���V���u�A�Fp�sH�,�<��F�M�[��Iҵ�5��\[�Դx�]���*z��g!0�I};d��-T,�SHF�����ˊ~�UM�y��^t���;��%��?>��!F�����P?��/����9~��������:�
D?�p�_@�Ob�~�b��!��)�9��*�����^A��忠�v�|twD�(L���*�i�M|�&�=�"��y� �c��-%�0Qz#���q��9��Z~��籜+h�Ei��x.��~� .F�5K�x��DS�1-���M�q�713��$�b�e��y��*�g��rE��AcW<�-%����.AB�pL��I�G�F���U�C)=W_��F�?�:�����;-��8�����d�3���(���V��v���z;{��}{�~�Z]��-�y��-Gw�ݻta�n�>ʖ�B�(P7P��֪V��n[����*P[�VS���7����}���q�ŧ�|���x�����������(�Ɍ]�dW����c�w����,%0afe��1�%íM��9��%~��1��yg� �3��4gc���S�Q�5ȧv7�Zl:N��ŁĠe��r&($�g���%K�P(!.�J0�3�BS��͋�M��;�
����zLj
9��>�@������;'��\�LQ�ϕ�w�x`Ft���lH�_�½��-'�o�^J��'��Ri`k����`:�͊D�KS"3w��&p_��o�%I��W��4JNz|@�G����Jk�,��7��;t�X��PK1xU�6 t�
?#-pkg_resources/_vendor/pyparsing/exceptions.py�Ym�����_��iK�i�X��
7H�:F� �jE�$��%�����wf�\.%�|N�zt�����33�L|HEm�J��O&yYW�0%�'��ݣ�׹�N&U�,nL^�v&��)+r)쯬�,����Z$�(ؖ�*Q\n���<�2ё��5Wv\��n&�IZp�٫NП+��dׄ� ���\Χ�=?��_��o����^�E���b���#��IxQ�lJ͖w�!�&v{#��.HnaEG�R@V�8��:/D��{�F�?b���t��S�8��ހ��������=RkXЛ�٭�΋���f��&/�uvN���F(X_r�
f�$r�`�,-AMjg��<dՆ���`z]�k!jx�uK�-G֚��s��
׆,\i��A�3�aI���$IH#��E�����-��CE�.X.
���-5Hl]6���NjK�w�^W�n�(D��Z-v�c [��
���rM���n�.I��9�I�t�_�&�'i�	���)�}�qz���-:|��x�)2��3�E��fWe�P�C]�\�����j�[�{Z�����0S1ï!ƥ��R�t*�f�%�V(0Φb��k���\G�zb�$(��_�0��x�EF�z�@h-��9L�G
�Ñ�ҋ~p���o���cY��B+�ee�4�A��t
�3�Ԉ{�mA���}@Z��|�3����+��R�{�X&�Ma�0��
Y����J$U�y�t��@�z��$��m$�d���b,P��M�퓣E��G�"�=�SV�b���</P}���&���kN��{�[@v�������~�Q�=�J�A>CJ�����������Gl��Gk'Ù����{��r�k��ƶ0��KI&>�X{�b��Zb����(�6
MV�en��)��������� >�����
���׵�n�Q�ѩ�CF� �6��G��~	b�
?-��OAL9DŽ��$W'	Z!I���(Q�;J�B����#�zG��RBFÐ�$W�80A␨$�%��WHBR_�dE�|�6t!&Wز����Ձ��K���\�_M�'�d�We�I�yA�
���	�Ѿ�Q-��бFDiwZ^TŤ����4ߕu����^W/y��	�d�h.q�c��2F����H��<�žbt�U���$�Z�\�v��b�;O�n������	���*k
�l��v+�Ib�2��[h]�R"h�c 9�d��Tp�S����)Xz�zʳ^L|�PP����
tq/׽ǹݡ}�c�`5[��X�],^��\+��'>rB~c�{ĿV�a�+֨�?��L8^���!q�Fs�ֆ:�=+]Ѧ!]�C�Y
Q_"W��eP�����1~S�f;~���zHo%�cQ���
rY�ݬ�PB���*��o�
����P��A�)�V���;MaZ-*�.�dW�-0����KOH��(��*������Cz����;�U/*��g�fV�$��%o���P�6��b��wj����W�-5�CG=��>n�|�l�/��Ԗ�HQS52k�۩}��(�N6��VcQA�/I)��4@B)���2Î���X
��z�iE��;�h1�S�l��]��⭪�:<?&~:�ud���������.��N�_��}e��X	�ء4T����
ᷗ�X&ߞG^�
bS��

�h�B����OXN�?/��ۍ�c�[�{jo��F�#1�l8�s�š�@���;��L��L�v=f{�G�K�%{�;��ep�g����u8}��qܶ���mn�M�� Z��n6zZ�9��aw�C��r]�0�K��I�Q�&k8�;:��`{�GI������-�-}b8�C�H]ϣ�Α��ݢ˅��jh��#u�-��l@.:t�nS�Z�C��[��o�eם���y���n����?ty��[,�U�7�u�B�O��C��`�Q��̂�m�ۆy��5������I�B�հ����UE��w6*�&����C�B���_�Cq�*����y�ϞD]�;{~�e�o\b�ۼ�ē�ueĂ���|++�n��z�G.Ӣɜ�1�
��z��E�A�IA�O��;�TrD���ow��!��U� ��JC��
H9��Hd�M��E1�
6*_������-�
�����po�m���O���P�|��j_���t�>�XU:x��1��M�i��]uk� jl�����
-���^��Z���Z���Wl+L�3m ��jD�ǔ��A�J�v�ȏo�ZWZ �E�%{��Z�U�Sb<���%��OþCL# Z�0�/��W����,}`������Ы�e����0[
/���lA!�V�s`��
D���K�:���y@�(
�����բ-N:�:B*�2��=��"˼�ڱ�O��v�+7��c�7#;Q��Q�X��b���5#�kK[E���S�\U��,@�mZ=����Á��S���Fc�lAt��=�)[7�;EW
�BX��n�+l߂�Ϟ�,N��Ŋ�g�3��:�Fo��a��1A�;)$j�?4`�OȮ��6��y�iZ���Ft��Ư��Ha?�17�[(� \�T?��Pk=��"�@��$��X�)2*����T'������$h@Hw8\���#H��q�vW�;���=�\�z5���[�=�%�=x��x�]���{�{�ѵ�'M5@�q���PK1xU�*,٘*pkg_resources/_vendor/pyparsing/helpers.py�}�w�8���+0��i�r����U,ϳww�e�\��ٷ���$�fL����N���>IJ��zv�ޝ~�%(
��B�
|"nd��e5\�{�bY�����P�uZ��҅����2ͯ{�yY,�P��8���u��iQJ�hG���43�'U�T7ϳ��e�d5M�2.��I~-��MRV�^�IΊI�i|�h&�b&�t��rgiU�=�eY��/yZ�U]�;"˳L.`T��D
��c�;-�4�#1)���d��G�4)��.k�d)�S�V���v�_�e�]\�I�A�X!�w��c��
��g������%�@"�bN$�U�TbO�7��)u��*�+���t��T�I�I>�*1Mr�r�|&ȡ��a,��*T�d*�Kb�ƺI���Hj^|�e��fJ�b����JM��\ɫ+�0��X�r5��r(^�	����*Q�tu�-y$���� ຸ�@����KY��h�@���3�u�?�.�o|�U��4[���9��w)L٦���	�
�]�T�%͠�
{T�����:��q�Jngq�����n�mG
�ٗd���h�?���E9�ly�TQ4\"g�L�0H��d2�N�H<A���'I ��	��N��[���/�jQE~:���NNF���/F/_���l�~��V�O�@�X(ɧ2�1�y�a��hd����7d�VI��x��"�k��I�W,�..��H��}9��|��	��ƀ���\��~�d3,�(������y�����`�E8�.Ɓ�]I��Qc��yQ��wC���R7�@N"b[x��zv$l-�V���$[ɳ�,�0�j�0�D�k�@�R���� 2M���X�~�/[�u��D�Gc�5�����o+PU�����1��+΢���_��.�[_�vj�
�a���Ĵf��x��a$�@Y�9�tȬ�Dvi��h�n�#U>-V9VL�2Y���[l̍�Tb~�Ԫ--�ү��1M�k�(�4����؊Q�P�/�
���Ɍ����E��ͤ����܁��,�e2C
��2ˠ���'_ۦZ��d���L�(�_i(�Ɗ@���1f��G�@�P:3ݤ��T*=���t���@���n�U6�Z��G�}���˲���H���3�����-
�(���΄��#atk�Y�҂|�������)!�p���g��7i�����Of�4��`�ArS���C؛�(&[(ڏ����ϫ��L���,YLf��G�ZX_<���(z�f�]6iw��ě��$��Ye�+Ai�2V*�B�q"�s�����K�1�(�	�C�-
 6\����,s `�P
י��1�H�g8#�X1Q�B��,� ���]�/Ьp�Tt�F��� C��.4
܁�#�N'
��o/И�?��p`,K��4��K�<ܙ��Sp�G88�?�tL=����+#�#�Ӿo��@gj�7��Hl�☵���(� ��δꉉC���"v��ȳb
��´ϐȰ�L���Xdʼn��͕��u�X�`�9C���(��aU�v�t+�R�G�iVv�>t?�6�&����c(F�E|��ui�����΍����f������4'`����VȺ`�y���D�Q�uf��Z�0�0<׶u�P���FH� >�Ū�~�a�<�>���B=�HΗrZgkUo&�c���ԪV�f�G�И9� �ά(nQ�� ��\���G��|(pi@AKS�Ӳ�=f1�*	,:�g�EM]k���`��#�	�����\��`t�n��TtE��&�J���آ�CT�,H�B�v��r�����)u�j�Z]�f���z���)�FW
"�Y3/��v�:o���D��-^Ty2��4rE��&��\���7橕e��1P�[(��o���K�yt������J9��V�k�0��/��I�|��ht���׊�j�Y�5�bc۵�R�`5;�.�EE�0/I��7��ҕ"8�
1��!��-M��%%D��692Y��%%Cx9����D�6G�<�����x�}��E�@���;����
�&I��0�,�\Ac=�
a�0ACk�P�#\�΋��0"��3n��93�@̓
T����Z1x%���O�^�?�];#��hy�}�Jr��Z�ʄ^6,E�����|V���9]
\4�ѡ�@��@�n1�� 
���9��V�F9d^���c�K�ª3�iR��O�A�<�����f�Uŷr}"����~c����A�o�tzk�1�%H�%:|`{Tm@(�w%��]���'���_�8ίeU�ܫ�+���S�$�:��y�N��H��=Li�9��)F��\=J�k���|�#�tE:x�	qq>� pM(a�r	�$���v��7��GR4���v�I�G���^5�5
|��:�kt��z��U�B������*2��0��G*`�/�_�u8�k�C�t�D�s%��'@��{�C
C�P��ˍa�2wƦO��8WW��w��LS���I��M%��E�%�]3D�ÄO-�*<���z�9[d���f��ƭ3a��"��ܼWS��6l`�v��ٻf�X��f�xҐ���l�(>k�g��W
47���.��2.p���
��1��Ac8>�ω�P+7�u�Yv�=��xp�����^�I�VE�m��� �KE
GM�H���=���P�����3qz4>9�����ֿ��qIqq�?E����A0㉚):|�ET鈊�S�X7����tN�;�À�x�j�+��Y���aU�s����s�g�4F�/���c���3vPD���B�l��c|`#�TQk�$��I�' ��(h+Tt�M�v�_*	|bzS��ܶG�eK�2�`൅��e6>�O���R����X(�O�a$��j	�Үq�8�]u[5ۘjC@��+4GC��.�I�
�NO����<�2?�q�k(����0�}��(oGu3�5�t֋I����&�lh{qi�u�YQov�>+���%;m�g]0�)�	�Lb��y~G��9��;_�WIg�u�����j���Y����X�1h�6|S�"Ի�'PN��:"�8C�5XC��l%��tFH��E�Y,���n�O
�J�Q+9Xdl�7�@Ј�'<|Pa�F�Ԥ™���E�Y���@��@�^ �S+.nR��#� Pm�~
o�t�"_=�H}w��i�L�S	���mh�r8�˨��!^�����Q?�VvA~B���U'`�ܶ�k�*���yg��X^�u�j�Ĭ۝��1���fS�0,�+�+r���r��7oߟ�8�p�JT�O���u���"t�mg#�y�qk7��##��H}������ňt2���47F��X:�ѱ��>4b�T�@n�xs7�'�L�,>N�f�`����3#�\	esT��2{�M8���I������lj�!>k�"j[�� �k�r*�$T��k�T�v��g�%x��BS�\�Aޡ;J> &��Xt���ȟ�uy#ɒ�Ղ{�	���¯aVܡ�Ѽ���{�C�n�*��V~����:�u/�mڳ+���%…,Q�d�b��'0� ��b�G���d�f����`�f`���@�*Pa^�袴@\�-
[6�Ƶb9� �r=�ܦ��A�N��9��[\ڰ	KASH(~����s�5�b�Uך�\ɍ��[ŧ��$�
"�9�R�|PV�Y�X]�n_B����?�]���
�+��RC��X-��c]�
,Kڜ�
3�D��S�T�`Q%�hh��{�U>�W�+��O:L���D~�C�����A�Z~�FD���#'<�t$�"�w���?|�9�B1_�$x���r�L,�*	�.���x������������}Uf��n�`D��4����]�k���>����%�k��1�w\���15�8�>�wC�n���@��K?�Q��Ԋ�=��q��w��
ި����"�({��$�`e��@*�D;���t�1��%]/����
m�)E)�"��P�M����ޡ��T1�#��`�ϬɎ
�O,���Ħ��2*?P�J��į���=��n3�)��3�Z8=�Y!�K��n��U
��0gRؾ�����z�����Gi.��r3�ST/���F��=E�^�y��9��%��#�;ߟ/v�ч������(52��Iȥ���CA6'O6m+
��`�J�W���6U��
R�Ӂ\�|��ׂ���
!,X�%wT@��5X�sr�ϰ��h�+�d��2�����Y�.y�<N�Zsr>��M�����T
05Fb@����e�3C!g��4P<%��V3�m��2�����\4�ʍٻr1�p*?&���ó�=�$�Мi)!�LpLH-��B��,�ŇB�#�S}��,��20�<G;mzT@��m5΁X+��)��%�h�xAU&IŽ	���U�,	�
�8���\�����7�U9E�B��8���f�(=FJ���hJsTwϗ�(Ȧ�5(�`|���9}99S2�JI��2�|�ZV!��7�j��l	M��ty^�����!}���~w�q{5[#��K�e���{�Zr߫��>47qgY1�Y�PO�l8�M]1�m�W��|�0������w��ͯ:���Q,��a�9 �D*��9p݊Pn��F�8��]1�lڶ6���ѧ	��_:�Y5�{S,�ň���ϲXv
�k<�!]�RC��L9�G������_+>�5+�6V���e�@�N���W�5rF�ԙ�m��<�'�^�����7�[��Ya����{���C��;�d�%)���|�}�Ry��=�k��C�Sȋ"G%.U�F�0R��Ɗ�ɵ��=>����/�ޡ#��%�J�N�˩D����5�#H!1���i�N�M�<+IRH`��Q�%�������>�S��� K��e0�!z:ΉE�9s>�g�T�Vю�HX��P}`k�iےF� ��ĭ�5�w�T���6�>L�(
�DF�_]���@�۫U4�sj5M�7�29��_aBΓIu�Qq��6�i�:�8�+���f��B�ys�����e����'�v�����aS��&#�[�cOqo�@a��'guq�����g��~
]ó�g��hC� �"e.j�̓>�{1}*�@�~N�k�0 ���U;���Wc���h5��9X6 %	.=`C�D�P'��mqO��d�Sn£R�X��	��mU ��t���=�B��~���`���i�L::;:'Z���$T��P	;�����D��T�
�m�ˆ:B����Y"�{3k[m'���a4�{�p�=g���h��O=�G�=�O�)��r��޳(���GG��Tnܐ�Z���1ik;�3��HKO��Zݞ�^9��q{�磂�^��*5aY�ә�E]��7�L|����z�&K�U�u8q&
"o�d}'e�.���6��(3�9inh��Y�?/T��҆f:��M.VM����R��u%lo�T�9�r �(;��
�Dū�,|o�>�:��Њ��row���`���!���\��>\
�hŜ״P��|h��C��2�J�F��I�r��1Rʼn���<!�>�@��yV��̊��
!r��. �n�v)}��Yw���.����l��c��&kv��Y��5��`�P�uz�]��}���@�����_��a?���-�xR�0������5��e1}v�&�1�\Ɗ�ܳ�i<�3#\�c���s��x�
�-�p�j*�u������0�ﺢ4�c#(C�0����yl�6�asԎo�X�S|0C��^�)I߸��0+P|���B:m����s��^P�o䗐��vA�PDz�����}��?re�K����
�}B��8�x�y��w�3����n�I7�^�/��(pvP99��p<�I��Bd�L�B�r�"\n�H���TEU ~�~д5
���+�{��}����{�b'�YI�Չ6��T�2��C\�բa�x5��-K���V�}*�4P��}
I�9���.%���$�.l����vn�F�=�&�:rk	��hE
��
qBX�}��i�>�:�pq?z<Vsl�;�99�X?�٘�M�]�����
�@��8v��x�q��˳O~y}���W�g�O��T~{e|���&����֌p
�A>[v�pv�r��N{�x��@���#�1����N�U��ջ��՝���5��1��6'�OR�#���Z]u*0��W�h��[=a�����	�k%�>`�b3Lum���c�q�b�6H,t#(�4Ƒ�Ԝ�
�h98l�ޞ5�S�����=<F�+�O3�ɜ��8�x�y�N7?����"�����������'��1��M�*��H}�'������<���9�?�����O��a������J���y�I�CV"tϧu��آ����.�]��^���b�{�7�ft3r1C��"�f�,�,Ns�`sa���+;.~$4�,�%=�w��+�U���fr��C�r��î����
ƴtGEM��	
������/�w�d]Cm	��,�64Ip�(��;\�u7&�L�jb��>
3l*�r��cXJ
��N�٢�3��:�C����U>*�{�Vc���P�z�Um�P&$���mdG��(�@����S2�1&�E1��/�~��Q;(AƝq�oT|p������w�5�F6�~UJ�'�����
A��T�Pܐ��a�x�Ǎ�L>��������-a����ą�w��j7�Ē�E|�Չ��S���+��N�~�lh�Ԅ�z�����i�}�n����T��j���B��jC���`����W�L��͊���}����Yn�	CN��0���dJv�
mI�WW4�pcpGl�G&|� ����֫\}�D6G����1����*�(7������^V���k�e5�\�����.�M�c�h?9Xk�Z�Cֽ��1�&���`�fZ4I�3	�d�p��I6u�<x���N������OlX5��p|�$#�F�ΝC8kP�4��������wjՙ���1�J���R8	q��#A"�����Q�DOA[#����;Gɡ�@�0y�J�Ǎ�v�`-=�5<��ZޞYӊՊ�.�/�Ы����98wr�i��ە�X�nƄ���eޫ�T���K�5^�c�F�=#��n���N��"d�l,F��\02�M?�����;!��\��a���y��g"���)�WH�ן�t�F�{|��xQ��ɇ������ԉ�>t]c�<hf��C�L��,���qXGMV�{�|Ij&Z�S-�qҒS�`�j�����
ax-�f"�Eb$0'O����g0+
��g?�}k��W?����ū|�~yS���v���EyR^��*/Cj�Xl�{��R���@l|tٻ��O����#��al�ש��?� ��3�脦K�����}�K�I)��s�Yor�+�i��+:$U�?l$��<&��e�5a�"��G4��džI���L�����Y$3	�S�Vjd���i$|a�T�dk�&����C$���!��I���WdSr�������t��P��Z����-�D�mnP��g��
{i����P����5����X��Ɨ��ktG�zq����!��+)����h\
�S.�7�ȥ�����7�Rʹ��=CU���ӝ`e��P|��ե�#����ՁW*l!A��i���݌)f�p��=������	��BeVN3n$/��N�Y�
N�t���Mn� ���m��gj
r�~�
��{,�;���6����h&���P�);��C�! �m�|	�a��1�wLL=@,�����F��Dq���S����SFY���Z�4���A���um�O
��QiS�N+(ѷ�<ta�;u&s�x6h�(!}�
�q�Q���J�P���~U9t����P?�ַ�Mf�C}��RJݳ�ߜ%ۅ����Ж�%4Eb[;&���H��Z�����{\�
�v�pu�Ԑ�~�K�p��:軌�J�d��t��_��y�t�-lB�J��!iZ��/i
F�u𻇗I�[G�E�Y�:����\/��U
�mi#��{*��Zι�9�1S#얐�fNH(j�TC/�a�Π�G���I�S~�^��E�U��YD7T�v��hĉ�:��J_6��>8R}�6
���H��9i��V�7�Ӧ�b���ڼu�Ɛ���L��':��N�o�S�_C'�f�g���7��=(�=����hYP��r����uPų�ʵ~�u��x���Ū�i�ԁV��2�s���9
3Zw�M��Y.�_a<����$T��߇�;��Q6n��+���^-cG5,W��U
�؈D���;���Q�w��wp� P�+z�b���> ����?
D�_�����t^��D�¶xvi[�
��>M�!V�/����J����0!*��U�Hi[rv��ÀY!�
��'��:��ex)�6��OC�q�ᎍ����r�<���C����7�|�j��-�4�u�f�z�S��'��r��0&?Ec���8�iAg��=�F�N�o=���6�h[v�-mIB꫇R�OPpQE}.��7CWk�9K6�+V
[]�^Z���ؒJ�X��@6�"!�KT����BWcjCy"�d^�.߹TOm��%���_+��5hvv��Q���+Bʂ�����q��`K��!�����}��Fn?�&�)>kEhҥ_m4B2�d\E���Ѱ���H��;]-�?�i�ðkl�ب�T2^d�߼Z���w3~���J��mM ����9�B�#�y^�Z������9HDx���#"<������ϼ���gS}�[�*��N}^j$���m�d��N�>%�\1hݻ��іѤ�����-�5�o������]�Y~W��#}�S3^��c�P����F���FU�E�~��a��Ng��Vn����.�8����N�Zd;pP1��Na[�t��
} X/jr+#�|'?��F����-�������7(����٨���Q0M��if��Pݮ�׿��aH��uY�|ܲ2�+��oCV�z������.|�z| 0O�,��*s��2iD[�܎��Y&M�u��.3(z����7+_��
�ӱ�=��`cO��~A�K|=�)�pn�	��;x2FY^p�x���1�����2��O��ť=}���$x����Lm�pNd2���J�o&.3&|q���iў��j���Wg/TC�j��{��ޭ�j�)�q�[P�jz�,�k��%N�:2�Y�Ki�����j�uf�yLU��dM�P�X$yr-=���nC����tQx��!��@�sX᧯IS��9�Nɮnp[���Qc(4
��O�-��ݸ���S��cK�.��R�W%��H�9�~��wF��!XŜ}�t�dy@ӥ�)��D�U�B:]=�n�Z_<pj���y�)�z��V�"��x�E�g5�!R�4�d�/n�2��׺N,\�'ᯞ�;q]U�^��O�����Ľ����8�z9=
��d0��:=u��j'aCO&�A��Y`�}a���ѱ��M!Owo]_W
*�z�M)R�}�al��˹Ҿ���Ƕ1�Ӎ��u<�|�RN�:�0�aXڮ@�� ����ڪ��P ]0
�th��p��o�57Y��]�}�����w�iH/�R

�ݦq��
Q5�fGGG"4����漫�yUL�npu�LcDCu�O��
����v�bQ�V��'A���!p^J��S�/wR�/�[��-�K�5�v�-�Q�uz�O���3��?Q�ҫ9�k^�O�
\�-BO��/��'Sxr�e�?�8B�9H��<=�B3�[w��Bč˜:@�'��usj�P�0�(m�7B�������{F�b�k,_��!�0أԲ���.���L�a�\��R0k�b�OB8�
W��f�>�c�{���$o��%�����RzsF�=E�)]���Y�ii�ɯ��a�!شv���@�["�!S���Aq�+eY5�Z�66K�
��ƃf�a5�H�ឡ95p��?���ZM���K��ݧ��*�L�܄^la�#Ǖ���?���i�t*ڼy���iz
ۓ�\;I�UM�5,��sH�y���x���� 
�-w��6�w�sV�F35�wgg�ݛ�X�.���v�+\���pI��y��B�v;<"h2�y�̫b��BKz�6���H�"�	�pש��=�bF�Mi���ݕt�H�=Q��[�C~�&1��ޜ�QC� ���!��pz�|�
>�Y��ΐG�I�5R�
o���#__q�6��D�ʒ�oA�k�K�r�e��w�(�zO`s֯�'䢽�5���\�Q���7K�6�n
]�K:9_��2���b�����\�RH�B$�a���kܙ�r�}��	�<�����o���Q�Ö��~;����}*xY�P��P��T���U��Q��EBw~􇽽�����;��;��(�^����@As�	�ԏ�y����4�A�%���tO�lH�}h�a�4�u��@��?��.��c~�s��ߏ6�A�C|�
��6�L�ˍ�F�𠩃MEk=������UYo���k��wM]�7�'`��`Z����tԬ����tk���x2��A�趌љ�'�'V,���J5�U�y;l�\�8�%
��\\g�l>}o�u�	��J��3t�b���Z�+"[�ř6�f�}4�\BP��s# ���'�w�00o�7x7����
��IY&k���g���y�ߕ�sZ��;9�z�z�T�:V����]�*��r����+����o�晞��o"��.�mݥ��+.T'΅{=��(h0'��-EO�����0�����/l�,���=�鴧v.TO�y�:R�z��}�nZI+��7����]��u���SWh�\};�R��()?ື
ۂ�s��@YѨ�J4�uI��PK1xU^���b*pkg_resources/_vendor/pyparsing/results.py�=ђ�6���X�R"m�<�%�L���]n�N*��>hU%B3Q�� 5�M�߯��j�8Wu{�TF4��F���`M^��x���[�y��uVb���,��˪fm�d��&�}V�F��">�6�X�P�*���B��﫬�%��l+��@�k"����#B��4� �+���b(�3�v��#6�L�P�ձ�"��oy!Q�P�A�MY��e�0���X�,�)��Y���Y}��f#x=�`�ı��Z�1����f?Z\PA
��qVdu�盈��u(⃯'�1T�f�[^g5ߵ�3�i��*Z�l�uRs�t���H؍"�2�n�],�_-Z�$�
F��Ǻj��O��5/E�.پ*Y���d0alǓB�f|���.	N}�e딥I��$Ɨ�	�3Q�`��y(��r�*����)���T@<Ҹ̧��2b�^O�fI]W٪���j�Ɏ�\BU�9�fK"A�}�w��'@�ج�T3���d���q���oyT�{Y�A��D��8!���"�bv0:�����M��n�+���7�N��(��}�@гC3R�<�fF�g0���?��`u��Q�x	�@="�9�d`V��A�2��i�����_�����7ӑ�
�:~�7�W�,�C�/=>��o���h��JT���q	�yZq{8r�{��1Qp<T>!�9E�
jFY�S#+@\ĩ:��f��QĀ|�\Daʄ9F��|�DG8��gz�~}3/����c��-��5��r?ܶ�7~��K�p�Fo�X��I.x�"�g���8�Q�d����%Ci��C=,�M��T
z����[#?���sЍ#��@���µ=�H�G�����z�@�XOXowe��֛��⌻��lm������Z��"���r����?f�z�C�	�[����� 7���K
�J���LܕM���F�W���q-��.��O��,�9HqV��').j+��f]^��tk-J�,
��w?���_"�3}��}��O>6{D��MQƇ�%*C�?��C��]�
*_O���A��
7
	P�/�y���)�&�c������z�O�ш#Wd`d�Y�
mJv�&Yi���}頻D�vt,>���;&�.�P��KE*��(b���(����;�|s#)���[yR5E�zR�q�^]��ͯ�7��E�=��b�0���_İ�0��$�M��Vi€�@��SdC���\o�f���&��F����u(�j��|����-���x��.yL�7T
(*U:�6����f�dw�`�D`�\����B�a�C{�A�$+xz�*�a�lӕ�L0��g�
(��(�
��؃m�9�R?U���s�}U�U�5�r�rYH�H2���')=�[V����Ĵ\ı�Ѱ-�s�3�J�In
2[;+��j鹑�����|�}p6@@I���edi0��
U��I�LI;��Ҭ2�1CE��)�����]v�,���A!�g&	@W!f�E����䇳��Ӑ�<5W��٢��Π=i�>p���A�Z�U���3�P_�h��>����n�9x�~�1<��Mf��=�R���h5��W+��m9���L((m��B�C�`�YR�l���Ե�V9�;#,�O@"�k]1���nn���uHS��4��8uvG���?܀���@c��V>���HC�BvG��E��<yB��n�WH���ay��؁vhIU�J�~N�у�K?���j.E�H	�C��ˇ~�6��V�ˆ�-��e�����v��c��2�S�GTW�3��!�'ڧ5��,�?Ҋu��~@}?��ʂ�����p���y��lJ��7��,"���<[�$��j.E��0��V��ܬX�
��_N��	�X\:?�O�ۇ��"t����;(�AB���
��,���-�J;�h�Ϝl*�f�&q\Ke{rB�$�α�Eoކt���V��L��T�Pnؒi�!�#p�{����&醡�ޢ�=>�/^�_A��3tPw'l�l�` ��]
,��Սĺ��{%�0���A��qWh�l�x/tٍ�v&�-^fU7�~C�-�M*�<p;�d����eH4G&��"��V}�Ҝ*�릪0B'zb��/����tyZ~*b-A��ȑ�!2!6�E��MN�2F-)g�i	w0a�,h���5>�6�*�jJ��̊N��xU��5����7	&$��C��=3`�&/�b�6�i!fN�L�:���O ��;�������-?��P����4�Z�k�Bb�vƨ��"�g.
N���Dt�ϛ����r)a,�]�K�	ц��x}W�o��M�#��>�
dq�B\�)���,��p��,�G���mqDL����d�LL����A��˽���cL�?����c%�+��|�m2��1$��
(���rN:�5{L.�^}�2�@p�KD~��:[K*,��,y�~شp�~�cQb��!�0�Ջ6ޫ_��Q�����m��FZ��(@OR��=��b�ѱY��(ZP	`S\���`W�<��udX3tђC?��z1@9�}	�Oq+�G��a��d�`��L���&J�-�S���F�;�n���N�t��'�N�7;�����s�Y�d�V�u�Wlz��������{!#{W2����y��s��Z4�MVI�̚g�SӉ�q�@�L/:a�h�ȓ�5͒|���*���T/����)noy*�����޻w�u� j蚅V��G�X�'4%a��4��8��|�+��N7�t#�&�A�ʠ�B�l��Y��I6���U{$���ϧu?^��|�z\oָd�ČQ��imjz��õ�& �AG,��{e{ҶW�~k�n��
)�3�ύ��'�F���")�goqXk
�	V,�����i��?T]�d��#26@-Ҹ
…
DZNq�SZ�dm~8�K����k��S����`�be�8iWӌHqTL�p̚�%�{oep�c�+I�q�-
iEX�Ⱦ�C퀫�mv��A�e䯯����f}�6Y5��q����	�2*5�N�n.nN]\�}c,v�]�'j=� "�ZO&�U�<.o�`�V/5�
�}F���P*2�_��T�u���+�j�y.5A;��`�V��Qd�;~y3܀s�tʽh3�p?h^i ��E����6���uBK���]4?8����^��ټ}�A"�多��`���i���=31�(����E���-�4�n���^=d�q���H�Y���9^�/�X�~�/�?�~�W�߉H4��@�N�=/R-�0��}��7�9o���"k.팳e+�����u��7d�sXlw��FD�O�t���A��"�I�$q����l@UL�#��j�)�]o_�OsI��oߞ#�j�K��O��g������&���6��f��=��$r�4�ʷ���,:`I^y8a�l%�d�x��&X#�ʟ�EQ����G)�h���pp�7O�ˬ�]���s�<s�mz�D�o�7,�
��"Y����m���t+�A�@�d��1)��8��ĺ��i:��m����9���D��X�a&M��ҝh:2�-�!��@��Db��'m`�RW:{A~�8��yG��Q��kO`*����`ǣ��w��ܹ�j:�QFΚH�"�T��Ynp,]����:��7q��F����:P�vNl���?��N��2#6��֘s�qE�}��J/��Sv㠤-�~}2�T�~�	��dr�h����]���>ux�@�[�|+�^�m�~{�L,_'̀FtF�V<���va�W��7�D�_ۚ�;�_��?�l�5M��#��F/�Ħ��9H{0no�m�CG��rߠ���S�U��uV)WD����
)%G�C�����J��j_r����{+��T/�6z|
�3�ǧ�u�Q
1�3�YV?˼M;�~�_����L�W�	r��qe_t���*��~���R� ]���xf튼�U���.�n8&a�,:?!YX���\H��I&�0�"�[��)�5��l���d��^z�ch<���W����9�]�7��{��P�ؿ��&-S��y;_�6C��k�E��)��-I�aDF�u�H��_fj��Zg�DŽy��g������׽`��]���)�����1	��Ĩ$W(��V���W�9�#W�M��	��_e��#-,���V4�X�x�|��y`�=MD;ӊ'5�6�CM=)���Vʅ��8=�X�ǚ��A�s,'��c=Źs�1G֠l@Eٳ�J�r�5I���NnE�6ԆDE:��s)����MN�gx���	��\���a��*�	&�����<�GX߆�z��W������g�-��O���E'�q
�P�5P��-���i�۳�
g5b�,���J����3�B��`7Rmɋ�Ǝ�َ�c�Ȅ��K�|��D��.�����,<c���μ~O�?`�Ygu�Ps�����*K��}:��y��yT�<c�7S�q���R����ѓ%��~��1]l���~0ִwW��.�z�]�wؒ1/t֔RJs��!�/P�3r�����-�O�}u�Ck�CO��L��ԭ����]B�lO�W����ِ�i�2���P�<��x4zwc�e�V��X;(gSe�ԧz���[^˻)܌��5��勤�L��D�A�&���v�Nz
t�G��l��4�샲�;3��%�l�`8L��~�uH�"�n���P�SP��������1�@����V�����`�bl%�E	�`�o�Q�x3�F�Yؠ8��h�ΓӢ�_��G-��
��~r�G�Ǭؔ�c����.�mǴ��f�����
<����;?s�#�5�Ե��h�ְ�l,�x�蹄)���k�ु��S��w^������_,a�c��;ם$���
@��dE
t�5D�V��4hN����n/��;�m|����f>H�f�kr߿�Oy_ө�^���KEZ_2���U�JJ���I�}�2=�f;؜[�Q2���h����W
0�|JIG׾4NQ��]
AT�ҧ�S

�]-(��ˎ(����|{ڵX�M��`��̬����_Ȕ�?e�mQ
�:��$�����Af̂��=o٥���n�%q�d�r��xc���]�%6҂��<ZC�gT@�R����}��=!�q�(��7Jmw�d]�sF~�Y���㻱G����#Kz7�����}x�G�(�*mD�������2�
��*a4��	@������=�TdBP~v@��m���'�a�Ys F�Ё�8+�Q��{��6����.��l\�Y1b��x�?ģ;~x�S�g���v��g[
LO��� Y��zԳTzj�g5!�Ϋn)P��y͕��x��f������O;.���d!��%�s4��H.'I{�%g����,R�����w:}>K�˰��P��O���j�	��T�˷Z�%�6���*��w:-z����|��9�4��l�|�a�_��W)2,~�J��8��W'�#��?�Ȥ+_0���g�ª0g�Ai�}α��`}���`��r��v��f#*øm��]�o��z/f�_���Jƫ�&eu����<[UIu|-kN��]��2�[h��w~�ִO�LY�:5��A�!��i:@�Eg�za5Fϰ�S��3����"x3�C�4�J����`S�ٯH�}���5l±*]ç�a��G�w
������{��@X�/hS$,�VQ�)Vl���UM��F>���C��|{uƆ:;B3�^��j���	 ����P��j�3�2L��
g?ї5}��۪���l���Ͳ.�e�
�7V���Ⰺ�����"�1ջ��Z�8��1�{�e�[eB�e,����wϖqm�9���0@�4����BHWe<�{���:`��$�T��L'�
~>��i�mgsI���N�l����]@iV
�2#s�mʆ}"���G#];-l<*�Ot����joU;;��<o�U�#yqj{I\/�Z��nOjG��Zw�Bd.�i��牼�;����n&��|i�nA�9���#�p�s�+�h���A�?�X��[$0:�	
z/�"w ֵJT.l�S3n���gL��s�&�'�em��\�b�<�㨶A�{
~_8�0����9'Dǥ ��B�l/4'�ܪzn��[5�l��<�'󔫋z�'wT�]z	�����Ņ��PL*~��ST��g�p�M��j�
PK1xU��5�[
Z4*pkg_resources/_vendor/pyparsing/testing.py�Z}oܶ�ߟ��`�Ԝ�vҭ�
�5Hݵh�i�b��'��X�m����ϸO��!)�)ݹ�?��$����'�f��vQ�ON6U����kvW�|MxVU�>�hN��:�O�}	��E\T�����F+��˔e,��˻��5/r��[��-�D�DQ��6�ڻ��JZ�}xrr�TR�K �#})g�f3�7�%�Qs7E�~1A�6MJxNn+�*�&��_tD���b��Q�M[A14��J
m#Rd͐eBnw�ǒ�;
�o��Nh�
ߒ4m��y��ꦂz�1�.�<F�+rϜ�mh�� �[�hE�Ub�x��ŘeLJ�HES"�
e�M]����b/�gLow��A�
����Y�����-�wc�Kk.^O�M�I�pBY6ց�M\J��2Z
hE�3Z�鞈�,�#�q�[H^�<�9{���Cт����Y�2�"?�1��;*B�͛Vl��)a�_�op������b�x�O�S�'Q^i�;FN����>�r^��q� ^�p�W��¡+X�Y(��/��Վ�7���)�����ų爞p6'W���tNN���ǧ�B�����;���A�~Qp��Zm��=,�F��-���
pr�(
P������X1����M��[|5�>��6{$m}y���w��F?|�������/�|4a��u�~{���{�{����3m�Hyx$=zfMs5����W2T	vu]� �Օ�V�Äu��XN�)K<T#=�RͰ(���d7cVi�V���;P���f�DWXk�WY�X*�Q2��#��9;ڦ2d�-
��G[����:5��#g�aT��H
�H��ÒlYM�
�jD>e5��0r�c��G$����1���͈4��HSג�H���Ҩ��9S�T�n�\�d�8�5�q�0�Dec�P٦�Z��fC�	��C���VG�Vk��:��cQ�RQ���_$���6���F�*�B�Mx2��P�%�
��B�7�v�V����*��ᦽy,2�+
;/^� ��TD1f�~�p��a }}j�����q����!���-��؀�|�{+��?e`��}|"���`Q��G�Ƹ(����	��:j�p�f�h��g#��(�ֱ`eV�YC���WCg�]W��Ǵ�
_9���l���C��o���!^ʞ@���$�w\w�X��$Q��\��l3V�DNˋ*���]26td��
�6�����ѣh	/�ـ_�~s-�
K�r�
K �Y��Y&�+�@X�T�wm�oh)Q@6�d)�Y^��^�b�#�V�/�I!OI��ז���s�͓�t�Gk@�N:K��d�*�z}���	"�%�B��h���S)/�!�ֶ;3�}*ÿp�)
�K��Z�)�[LǠd��$a:�[���T=v ��<�z[5G#���9g9T�-K��F��S�����</���"��x��G�0X�][�SI���k�<C�J����4|��h���X[,���F �K39h�6t����u�w8i�2�I�ֲ��GË?�x@pξD`>g
ܿq�I���0�(���
�L�'�`���1�j�ެ���H]@���3eG�P~ݤȰ���M�X*6-8���R��ǂ|��������,Q7e
)���k`8����J�F�����\�L�?q��lHfRg�"DqS���8�2#m�V˄4B�l�����x>=�V�o����`&H4q̠�ҝ��q�8ҵ/�4sv}��	�E��ɕ���SV
Z�"'|����A�@>��= A[��K��
�
��� �u��-zlw�V��'� 0"�d	��j+���_�qU~���ͯ5
�_�a0Tb�A]���2��0� S���%^O��bW4i�/���<̧<�/����|,��ID���~�r@����
�i	Ŭ�[����J²��kyn9����,�u��Ќu�6��lf�������2S���ܰ���sQSH�8k�B�Pw:����GD�͝�5:�	N�{�����{�P�B4k��ދGi�~D�%��#lg:ro�I'n/荴��r�AZv�k�>Rɳ��c\B��a�֍{#O�ƫB��W���-j���&^��$:�2x�#�nm��!�:K�O�Un��r��<���:��{�׃�=^3�h����	���La;�i����ϓ+T�?�#�H$�T=�<ܪ�6$tމ'��@p�h	`�4<�E�����Ǫ�n��2ݺ-Ee�5�v�6p�����^ҝ"T��å:6��6��.���P��C�s�1�Q�4(h��8�<�|8��	�-��Arw~�Y��~��x��%OZa�v�/@�����|W$���{$���s��+��w������[�,O5���x�M��t��k�(�Ghu#���ϳ~"��J�a��P������%!9��φ�fi�b)�J�Hغ�nU��Δ7	x��2���V��i��D�E�2��3d3wq�wJ>uS"��v�2V�rIq�s�	1�`5��5��%1EA��B��	�K��E8$�C�!CG�MxZ��v�eӗ����B�Bx�Ukܿ'ּB�i͎$9���F��v� �o����b��&�%J�^?�����~�7Yh6��P���2�{�"����(x�w��P�_1A,���V�>�t�S-|a�X�4�r��[�'�|�/G�32kr	��oH$�4�)�~{�NM#b���6��Wf��Ͽg��׿��Y<<�C|�Ƈ���wR�l#%Q�:�L\-,�޵!���exryƍ/���H��F�SȳGnP��Č
f,T�I�lv�Ʒ�5��ƫE���ƻ���ժ�l�3	����
��G��xI�q�~��4߲�|N�?��X��=���_x>x�L�/�}����]�s�2�
��l���G�f�Lj�*�3�^�gaH��+���!��NJ�)��aܽԱˬ�K�432�ﰞ�
���~���{�5���W˴C ��زC�.�.������HgC��ntET�s
/�x��s2̌k��ѻ�bn<ȷˍ�b��K�� "�Z����\�eǦ?�s-�S��+���,Ѭ��|92�罩�SS�~}`���Yy��¥6~]uf6��T�5�A�uq��e�X�+1
��cX�����L>_�/l
T�>jnlH�M^`������%������S�7����\����s�W��%�'���9Pq׻O@�����傧��[���8z���k�	Sͺ_��L�

�s���X&�cZ$��L���.�=����/�%�Fx
)jo���b �f�o�`����ai���-wSw�.Q��p�9�r�U�ۤH��2"�����PK1xUz��x#**pkg_resources/_vendor/pyparsing/unicode.py�Z�����j�[x-������#��Z��x<��ݙY�MU	

Mi4-M[�$�@KRh�C�~_�/�|[�UU�?���5ǻ6^ig�{�=��9�ܱw�%ϱ�-;�[I$�N��$X	m��!Nh�a��DRڎCm�
l1#\�9�BD��a�^�v�񜮗H$,��p�WW�m��@�ʮ�O�n�F���H��N���4�aC��Gv���`���Z��D�3<�c����к�`�n�X�Xn0���f�	�+]���#�f��I�L
�xݐ,���~���~�fR���[I����l-P��K�'�!	i27��n��T�xB^��w�9e�|v*fA���?����W0*�?pސ��i��hY!o�Bs�@8��$��|�4p=dz6��a�9��9�9`K�B��"����cQB�ءPtff�_5P)$�6��k��M��0?��쒹`�=�rڎE�Ї��8z�t{��G�p�-u��M�C=�ͦk�XF�?������i����\P�g��@��v\Մ�?wp	����Rhú
!%��(��H�&�(Xo)�� u6d.8p�"��8k����]�~�X��H���lVͦ	���T:N5%��F�J6���J�M�&��g�_}ga1�u<�#N�p�Ԛ�.��N1dž�m�`��!���$F#������˜����t���a2o����,.�!�e��HĢ�w_���p�^�g��}]����0�!�r�.�dœt�W��vP�P��UJJ��<�?!)`�����2�%��sk,��?M��x�t�>�<�b�N(�.�J�倆{9��V�OL��\r.��<�I�T���Y� <%�a�_�-(�a��RSxn��c.�1]��7{rv̠gZÕC$*8�+;3���L�X��C[k�J�	����x��-��ӕS�v��9��*rA/�"+��3�:�Ui9N��:r/��I�FD���z2]Dt�쁉�Z�e{!7Se��pk��H�0]�%��2�lo=����-x����/M��HJ�L��)K�� ���@�ɡ„�$3�^�Ս��|u�^������#�ַ��]�i���c�ݎ��}�¥'�W^}p����f&����iz��F�����9�#�=OLߤ?�?�?�?�o�_�_�_��"�5}�����^�������?�?�+�Ot�^����5�>�N?�7�M�g�z�~H?�����7�F��{�>��~B?��MT����d�4��Û��

���Zω-&z`}yh�s���l]w[1� 5H�I�*j._(�ʕ�A����Y�=�1�,�K����'S��8�7	�lq{+=X:��ܒ�C[sj��e͵ܶ87���;�ձ��N�뷾�{|��Mv�v'�}P;z]�P��Ӈnm�F��I8�f:��G��rv�f�XX��:lY� ,���[qd��c`�Ȱ�e�1��#�g�
���#J�7C�S�U�ϞU�ǀj߭�F�����:ְk���ڳY�m����TJ��?�����Yz���z����i��')<����ʵ��`"W6�J%��I��Q�yA-k(�:~�u��)U�	j�RYQG��EF�+��R+�u�Z1vL�RV�e�*���F˒Zè������7��$o	�V0S�����aC,QB(K�<FՅӌ*J�Jj-�QkUG�5A�c�7UP
t]CJ6���**�4��T\��kz���.��{�2`��*6U⩦�(i��6��JS]��u�i�M4��b^��*T-�QG�P���X�ju.K�a�@+�XhŒ�QKyA� �F]�5
��|4����mv�Z�T�
�zETɸ�R�9��Qe�5Ad�.�4����)SFEP
��䈡�$��X�!$?p�VU�
��%=��5���B�
�UP���#�U��Cj�%��m0,v�ZǶG�e��z�C}tC�?����؍�Oo��5��Ա��9i�����3�;�}fh�'y�����/`��	J��s��SnKMb����S@��I��]�_�L���,�E<_���l^�WƑޟQ���8�3�X(I�Q�텒��٬2���n�3<�c��{`�M��(	�/��G+�I�$�b�^4C1d]�8C��j�#�3�e*��nl{�|�g�>�Ӕb^ƨ8�Ds F��Q����&�Q�
{+�N[��l����l�^��S��;��h)�Q���5���9��Te�Z�����(v��*�I���ZU,X+i�&[+�ZE�@��@�1M�H�C
��
jk��&�X�f�$o
�I�ڰ�LT���6��OL�lbK�[��{�X3	l��!M/��6���l�v��u���z;��s���Ը{���o6�?����mCQ�M�
�Mo&�Xgeg�-M~)��n��ɩ����&*"L,����<�ձ �"��m�
?�zI{-K*RP`�B�.�a�"�.��$U'_�ԉ��'`�^0��g���q���l{����QV+��m��γež�DU%3����c���/��䝛M���9�>�ϑ�T�m�q�"�������70��uG�$#�����/�>�����׾8��}tyQz���|z��#�<����õ�O=\{x��>��-\�|�HX��~������{�7P~��a~t��������u�U�!��饫O/���wP�(؛a���W�u�Ҧ���	yr�'g>c�_;��(�M����ə7��~��i�1�#�w������ۨ��#lw�n�]�X����McZ}w�깍�;��6V?�X���zk��)TƠ~%�PK1xU-G�l��'pkg_resources/_vendor/pyparsing/util.py�Xmo�6��_�s�H�#lz_z�&�˵@qm���ޗl����f+�*I%����]r��.�:�e�3��g�C~$j��:���q�N�R�{۾�c�K��R�t�5)�i��`gt!vu��h�sS'�L�����uk�D�����6� H�6�� .Dz0�>�� H�Ŋ$Iu�S�d�˽�?����uK�/��Fd�S4����S[�+w�̰k[���(�0P"�<)evÖ]Yg�ш�k߽S��=%@�J2�)�������f��پ�Ag܀V�Ă�ܮEF�kq+�"?9������	�xdH'E�v�b����S��ã�e雜�ʲ�NlA�[0Fe��=XH7G����'�zQ���r�e�j�'>{�DQ\W�0�kE��7�6�ig��>R�3څ�� �0V2RY�'����&\�Z�:=���a;�N��N��J��O�0��6���!�7���{ejB�P�� |#qFdD�y�a!�z�|�WLa��
z�k���H�]RS��|�޷"����3H]��N�.�$E$����QH�p����V�\�JbiccF|u�S�vX��.�`�y��v89��h��s'���Vaz@%��WNn-�4TYծ1����K�f8i�@j�*�S�6�'�ް�77?���s(p�1��O�y�٩@H�W�'���-�ݦK'}�����_^��\>��b�g��<�5H݋�y�V��л�~�:�wM��k��Qx
8QxoW�*��5���#X$!q$�cQ�S���P�
eh#?�+j:�V1��)We·��`R�Bj_�kj�#����~a�\�7� ���e���j�>����=����}��h����Г�&>��`�I��s99�Yl;M��Е�� _;��KR��b�X���R��IW-*:FlZ�k�����Cx�pݗu��-N)��+�릯��K��B��D�~���qܔ`�@����w�K�1:���ʓW��k۰ك[$L��W8F����6D��s���l�@�k�nW�M5%���	�%��
F�	9�]¸û�k��{��W����5D�eq�Ѣ<[����J��ߨ�~j�Q'2�����2�3L�?����?j.9c�߈��B��P�..�Yc��'����V����@$��ߘd߽|�=z��������-��BV��/��e�k�M*+�����m^�>t;;gd��m�Z�=RfWFȔv]��m�ƭ3�!�$<��l��2��%kR��mN���DȬ��§lBI�L�?'C�v�j}������=��dxg�8t�9.�������u�B����'���70.�`�8��e4��q��g`���>�ѐe>�)�F�]��~4�ٻ8��)�����Ua|<q��3�p�m�c�s��)��sJ��w|�����)jт.59��:(3�r6z� �|�Z�g�({?��1��
{�O�,����WC�PE~$�8%
��Xp#~>kn��lO�`Vo�q5��%6P�2�t���Ǣ)���4�X�v�ۭ�%"��ڹQ�������<C�o��t��;��.�oخ�l�V���ێ`�FY�!���D�0֌�i��4�=C�qe�v-�2[�e����>��y�Kq>���r�T ��>.��5�\��[��_,�5���]�6��hI���켧rG�7G.n�]�y�".�s:
^_5���G,u�\�F���
�g� ��Z�������*�E+Lu�`LS�nn�p���R���
+�?�l�޽�u�=��c�b��I��o.���҃!�I��n��V��v���U!��|��k�'X���H=�
d<0N�1��8O���s$m��k���u���B@�KA�R��x
L/�O�̦���)Sf}�Y=<����l��P�Y��%��E�y�o;�����S���h�qא_���˥s��<߈\��0eҏ�<W.
����9�uk��eV��HX�w7����)�WH�6
|�PK1xU�-2U	t\3pkg_resources/_vendor/pyparsing/diagram/__init__.py�<ks�Hr�+&T]ܣ�v��E1]�۵�N��k�$�(*�"V ��E����c��P���
�n-3==�=�V��j;��Uݪ�<���z��[]5��A�[�E�V�oa�d'>�*�M��J���u-��ϲ�mU���Z�{�򗟪��1����(�㷝l��W��j~�Ѯ|)W�:�$���}��k�����kYt'''<ޙ�s�6m!�L�F��>y�?]�x��^�e��_����ȼ|I}����Q��g�O_�)~^�nWK$���:�����z�ҽ���R�)�F~���g����"_U��L�T��:/�?G�U��er��2���F���R|��6%lF���w��F���'0�&��jEY�mTn��.��EQ�Z�Fn���ڬ���X>�1T��U
�iWu5�x=f��(�.�j�U��A�	L:B��x����bLk��tD�!���8I
H�ɉ4�0+�YZ�''���䙨J	�a'�e��Vm�R�H��2�r�D�l:��OZ)�f�2���a�-U#~��ӟ�V�^y��bP;ٝ����r�U>ţ��U6j��h"t׎'"�����bB^_Y�N
8��k�S5��3��_�yF��
G�
�7E��� 5a���r�T.pq���%�m�[1�/���X���HyBt��b�(d��Q,�g�Y�K�g�;�v3D�D�@}�y�y�SA��q��UC��x*.y��`��8�ǥ�@Ө�B�9�+�t�~GDi0����e
�ʪ`rt˼ bH�X��X��m���s�
���ݻk�1�v�|�iY/&�;ܮ6$�OA�Ή
3G�)o �e����s7��V���v�R@8"�Y����,�l<uX�N�(3�~�6�y~ހz�sUf�G#|��
�a��V-��G0A�y��	�Ҩ3�	�S@����FW_�^��p��o�s�T|oϯʪC;�!M�י1�W�׽� suu��d�i�N�ZO�<��
��+	 e9o�@[PDm�q7���Vjߜ�k�k�6�e`�lh=8|�TL�S�R4R���`	ӊ|�%ɿ;��ja=P�ۼ�H!��q�:��
j��؛��jb��+X�k��*�N��n�^F"�Μ{r5�N'��z"�V�%��w[��������?��/�C�W�c���J��/���q�YQ�~�`�� �ۗbԓ�����J~�.�Nm���)<	FuiR���Dz�23d�@�m/@��h�iC��-�k#?��6��"��9��SO��mNhMP)�0��b6�aFϒ�k%��fp�p�3��z��Έ|��3CNàu��\w;�4[$D�H��>_�m��c��u��̫��ޠo�T4G4UiW�S$���Ӎ�9a�j��<����1nЩ�D���G�^/65���'�Bm����j��yK`_�7��Zdrz;e)#���u
#H/���WO�O&�Z�A.�[��znn�K�������|����@��yS�gq�3�Q���N�j����
y��f�s	��o߼Ss�$3�n�Q�uzh׽c
�,�?W��)*4o���-7����x����q��}�A�V� �P��~F\�N�vߠD�r-IK(�E��F��&]]ӷ=��Y�"띻q��FƬA'�j6�OT���)�A�n[0{�o�J��~(G&37n
1�tQ�<�q� /#��Juc�
�|��h"�2���3�0M��x�#X BP(�x�e6�j��{C�i�ӰD�����Ԫ��s�@2��Y�D���r�WYlZ
rV�CmP(0�l(@�<O 
[-y>�q��R,@�
�RwyN�sPz8���vu϶����$��M�4�f;�_�z�x��Vિ��1��(���À{��4��`+:��DKLɁ12Ki9hF��duTf�P0s�FS��+~�a��ùU���r�!)f��A��Ro~��z��s6lz���݀#^���`Q��$�C]�
U��$�]ٍ�%�kV{̦�"��� r��D߳ݭ�f���F�R����yL^R3�_�;Lk���O�L�:c���"
�fϛ�\���F�k�@���V&�4�\�*��U톄�t�^Ƴ2S��?"-�	W��6�eU,E�Y�V�c^���iP�C9b�9�8Ƞ}�|`�f.U[�qx�1�X��vb�l�f��B3�3>L�R5E�)��[ʈ���,��iF�IJ�]��d0gAk(4�BZlZ��PN�F}�$���2b�]��@�
�g�&фZ�;�gv�l?b@�Ų0��
�-_��"D�ž5"�9�"C���?�P7ð�W�J��?��!kg�G��L�Y�7�(2�Jt"���=N�Ǒ�rA0� �p�˝�g��5rk0�l����B�{<���&�r�'�F��n�b.����ˉ<A�P��e��c��ϝ@N2. &�K	s8�hu���{"z�B9v�<c��)/g��RX�xL�%�,��RsN4c,^��&��e�k�ljӉr���01x�K�5r�4�C�.�%@���"g�R��cj]�^p*J�<7$��r��8\�pV4�:zs9ԁ<����^��G����D0(Rx|((4���4��ħӼ,3<�(d�2t���3�n̿��p)´�N脜r���aOq��a��V�X&���N�w
�/؂n"$�>�"��K�7��ѵ��B#�Y`t�fu��)s}F���z�s��s��XMr�L)_Ր�3�lH��VĮ��Z��ݠy��$Xl8�HA8����s�\�O�3��` y[��J<�s�/+�͜v���p�g�>���9�r��[-�a�"4d]�B��3@��H��P���D�$/�4���]�I�(���q�9��ܝ�c���|`{T,H�!�Tב����IP�~:��� 9=�W�<f�%D[�<�Ӟ�HKʀq�j���J�w����)��x�7]x�����lBí��c��{9 �|����xZ)c����d���!Ғ�D{;XƘ�@���G��M;�c�b��6�M�2�+W���x��LaS� {Fy9E�з>R�]Qt��!��C���
W{� e9	TeDnt9�n��	5�����,��2�N˪.;�9�T.**l��}��9��h-��R�`��`]p��!�>�8M�j�������\��x�q<���f�#ygݶ*�0$p��Ѩ�V��r�x�g��y{�>ea5޺y���3�c�;w�T�9L�D�ְ�D�y��DC<'�]x�����Ҽ�۲�\�$���13
������%�򸁣�|��پ�%z~~�q�Dc��
%C��(z�^
����C�vN��7pH�3��`��B�7���3�]�b�ֿp�ޖ9Y9��4:4`|�$��+�7Vݗ
]؝�X=]��k��m/�U�����>4;@a�&��&�:��BO��+&&���Bp [Ur�ep�"�DGx�발��YH��8&"I���9m�O����w���>��0T��=/d:��ݡ�鶨iZ�`cb��H�(Q{��"�cR���tN)\�k꫋�ʱi��֦	�p���iq���`��)��}F|�|}.��O��[�-������!^�| �+-Dy�!f=��}�;���i�ϼ���=�燁��}�&^&�,�q	nE��Զ�)�yZ�'��e\"7�AR ��<�7�(�T�&�Ʊ&m:���
	$`e�	9�{��9�����G�.F��n�,F��0��OXO}h�p�R��e<X�8���K?��
o\Ayx���e��Ӯ��f
6�q}�}N��I����VZ�C���?:PX�|��D4,�z��[�9 0� ���a����=.�i�Ђ��n0#�S����m�5��,����%e�4E/�9����y��Đ� ��H��V
�����!�6���A5�%��V�"�ľ���:tg~5�u-V��:R��Qe��8���[qS��.� �6T��``��ȵ����t�@�{��Ӛ��uˆJ��ɮ��2�+tMu�.�D^(���Bzt}�{���"0�m�o?t�dO��5��j�N��ם�k��KH�ͥ7L�[�I���&
��$�$
2g}��!('�F�f�H�����DoP�b�ߛ%gG.��~��n�7�@`/O��G��	ړ��s������P����s����h��
�p�&�ܬ���%ov�ZH@�p�O�V�).�/���Ơ�3hi��]����Eغ��K:N9H��\ds��.������[@.����9�OΈl������M�c�Ĕvޡ�\�=���Ӹu=ӛb��}�k��\ѩ0���-��(����Ilg��J�j5v��u@�K�'���[?(��	�~��;l�Z�Y/ld���'����3��%�4ɴ�q}+nd�w�N-�C{>�:���U͠�)?��C%��P?M��U�{Hj�S��]ؘ��.x����D�i�
k�g)ZE�"�@�١j����w�e)Fߍ��� 7����4�F�dXUl:�LW���_
��F,>�D<���Y|��0H�vC
��a߬sh�w�V�&�G�J��mTc�8��6��`�b5<I
3���Ԁ��_��
�ֶ�$�ߕׇ�/��b%�I�LYJL�P0�A�B�#�m�t���/���~_��qj�q*���_u��*��i3<��J���8�x�?�>ĵk6��LX�6uK)�riNEY��
����k�j�KeJ�P�3�V����ĶA%�̶\*���f�)����Xߵ���/��\��b:��5����)GAF�6Զt�ȨaO.r�q�+,Yt�y�-A��ve#ߟHQ�m�nU�إ)�QgJ�LK	D��ΕV��|��L�W%���P�E�`n�P�1�2�N���z4������v�mBD���<�ͫ���1k}]�^RBݒ�j���d��dN�m*Щ�c�ݱ�f���.p�m��h���&i�~���K�ү��P�t>�
�|Ѵ��4ᆑ'�
�.nj-��b ̦����R��lf�Ak�_�����=�Y1��,�7�6��7;j����Ucs�h19�qa/E����
XKMfK_��2uGt:ƽ�}֡r����^L�Z�Q��A~�;E�� �����j�'|2z�t��
ʛ\�v�-��f���8Sa��%0
x��
�b�o��]?X
���j����H���Bh�ؓ�X��=�;��"�;r�V��TLc?{z���-��3-��~��(���v��}���ǵ��҃)bN��	�1f&�Qs6�����U+�#�0�yߛCGg��Y�9ڡ��O�i	O��pAi)LJ�5f\A�)l���6v9,*�غC6���r�15��?�`���r�?�S��A���6zӔmk�Q�Fm��۴)��(�b��ܸ�a���^��Tv�Y�ț�����K���9�
F,�P���>��$��ӽE���
��qw��W�V.��Q����c��?s��r@'#�K�!��9q���ň�o�Q�i�+�����-��iЯJ�II����}la��|����O|�hJ�2TBx[~gm��ȍט�.��J�8�pպ�Q�R��I8����>}B��{@�e������/x�*��+d�}!�Y!�7&&��|��Z�����2��a0;��=���q/
0����W+�/��&s��N�3����?�D�PZI?��}�ó����~qǘ�Ѕ�����aJp�1��ۿu�d0�Bxц"����h
DZm{����ǿ�2�`�q���
G�S��IvQ�+@߀�{՝7�����_�q?���r���ы�V�)˿�~�]\��W�?} ����__�y��[���I�x����#�;υI��~Ď��ԏ�M�o�;?�e(�(om6v����X�/��#�f�$HO$g��iف�;z���������%
��7�Q�9^����nLNѡ|�)ݘt�h#�:��X�M��		��7C��A��̞��cՃ�>�5�m�:��>,�M�;vMW��:ަ����2�Hٻ��z�L>�.��#�"h����y�W��0��}���&n�Q��=ޓ
���YN�ې�׺8kuAE5%�ю�	�L��r��|K`�:�?<H瘴��0�����D����\���|�.�b��l�ܻ]w���l���X���.eՄ��}^��X��0�gX�ݓ?��;��3bq�g�`F�`&.ji��\d�w.�����E�&C��{[�>�}K1����q"�;sɻaN�ɟ�e�)�^27��\�n#Jթ�ج�a�f��7�8�uh�-Y%�Bԉ���ݝݙ�VS����d+W�~��^��)�`^� S�~��ˏ�W
ӝ
r��۬��h�qʒ[�Ah��P��Y�k������$cU���Mް5^;��_@��I�\�����������M�A��C)�X���M�%��t�c4�*��w}��惗���:��>��߉����`�/PK1xU���͈z	 pkg_resources/extern/__init__.py�VM��6�ϯ �b;�E{k�@{H��A�R�֦g�ؒ"��5������43ͩ�l���HZ
ָ*�z�T�A��t~�á���ָ�����x<��o�����a� ��p��Ag�t���
�h�ӛo�@&&\�=+��e]�Q���� �/�:gp�����x�bB(���Ǿ;m�'X�o�CY-K�~9?�7�D���Wgx؀r���<�2_��y�;�zwC1�x9��l�,�b��"�U�uƢ��ܣt�Ep�#��%Q||�f��P��=,!�%
҃\�<���M
����k(��ʦ(vYL;�(��(ˌSں��y-��N�G�`Fl��;c��ʯI��{丞�IzR��񰾢��ź,��Il�sH�РM�� uK���-jMru�?�p9ݓGUm�l�(|��z�HB�����b�)ߩڂ!���{�w�		׶uةP:1ީp�GpS���[j~���z�̍!�ul(T�ɧ�1�`r�M�Na�&��7�{���g��9�׏�A �÷�wK�R�\����8��n�P� ?Q���SL�)�%�;�:*R�/p�u��
�AI'dJ��Q��GY�iq��ki2#��`E�g�45�4F��O�c����=�V�����b��u��W��ޗU��]}4I�y�x�ͮ:��D�e�Dfu��
_����.�ku�%�:O���X*�zvP����&���@�Z���!�]*��*�s�8�g�`���m[���]��7۵�Dy�Xv�����c2���~��1�j������AeO�m'�{�:�oR3��e��R����R��v�f�)�E�-����������Z�|��t�1|�f@�VI�
�AB(�B�`Lϫ�!�L*E����^BY�PKk�mW���x5� setuptools/__init__.py�Ym����_A�p��u�I����6��!�z����2-�6cITHi}N��g��^l�m��,��<3�̐���/?��v��N�F�{%�vm���-��XQJ�S?rS5�� ��L���|>��1�ۮ�[cJL�˪��(m���We�~�^��<*ku��x&j�����~z?;�
�n��FcXj�a�8��!e_����8?756o�F�{!���3�2�
�X�K��k��w�����0�?�����R'��Ѹ�^��{7]L%K�F�\NT�����ԯ��N���S���ȝz��Bٕxx����N0qAe�:�
�f�cfY&�2�Ľ�q&���+�06!�}m�J�E|챈������-�W�7�e�ި��I��,V�҇�h�l�1��!��t�Z2��3���1<�3����hC�/]��f�ڊ~KV2��ȶ�nyǶ>�"���A���sJ�G6���F�Ŷ<��a��,�!���bEYI���z��SQ)/�K�x�k]�r�>ybmP���s��D�刀�0[!'�,溆�r$�/�*�m:]���u�������6���-@��0#/᪅�:U秬�����b�p�K(�
��������3�p�vy	K_�����)�V�d���F��ɴg�GU�B�9(���9	 ��)KX
lp��D��E�U�5CM�O�()ނ'��+[���M����;�j���ET�ջ�"T=����ax�F����9)ik�r�^��OB�%E�U�l)
��q �_kO�M8Z�;ȃ\J���kJ�4�i�ވJ����Lz՗�,T���L_��j���D�2aq/�EL@�R��2�"<���M�_x�\�%��х�	�#���7�L'r���>���?���ת����x��SSΒ�R�p"h��r�FZ��a�9 �������Ny��֯��
�<g��ʒe`ZMnn��F����^>*!�k+$��R�H�T�V,X��[�e�̓�)Os�l"gT:U�{p��09W�k��k�ڡc���)%oW3�✹�l�ȳ}H���V�ġf{D��$�����d��,P�(�ɃB�r�;UZw��{��NTJR�e+�Di�E���Y�5�_yi� ��#¦K��;):bB�J�ϑ!��t�g���)٫�ʂ����5�`�槳��B�
�{��ڄh)��+r�r圴�Q��15G���2_P���k�$�z���@SQr���H��V�=�!��v{�ZcuNE ��g����
�e�l�ju���dn)"V"� �"J�5�`н�ܼ���߾���&{o�]�[�D�ݣ�=�ؓ^I({���}�ᯪ=*h�2��Vy	3Uq�
J����NP��W�s �wT�H��.���tK�Ed��m�`��h�!'���Q/ȟ���H�GYvʥܖ���6�q�r"�R)>34�㸜�fzi��05����۸n�5��cw�ՕZ���b)��D�.�8�(@�g<����ܞEY?q��D��!���� �IO���h�֬��+�خ>G�O6 f%R]<au򎎫j�E0�p���rДh)ő�g�ƾk��t5�^}��!�(˸�Q���z�l��mӵ�ί�Q�,�wfwb�1Sc2�p�Gc�V���@��S��+
8��>���Up�X��C��S��1�h�Ba't�sb��2���5�%��+�"��G��Ȑq`"�R�c<�|��A��ێ{�@�@Jj���Q�����-�oLq��h0�r�&�`�d��ђq�+�iR%�ܔ�>�c��&IrA��(}���FR��vA����‘k�w���Zz`C	%�=
�zTs������+�T���Y�Y0��O��x�����$."<��P=Io?�Nyg��S�����3�.�(��C�9��7k��l��\�"����@Xl�
o[$
�A7��8L�J�S����u*^�قB�@A}�Fd��`=�=�?�R4�"�a�r�gp�Ut���	�����?�>�|���D���wﱧ��z�e�����k7i�7�}�1_�����MG{���N}��եӆ����η���p�����x��Ǐ�`|
����v���~i�\���P�=;S]DC�;xP\zu����cyEt�۪j�LS5�k2:�ջRT0�;~Ґ�8�4�v��±��k�pP՜��:~v�p���lz��g ���J�'~Ҏ�Q`�䑚btvD�R�|�] '���[�E��ȺvY?w��\<GN�Su���8f�O@Ϩ{��7(n��<�3���X���^fI�����)����y�9J��+:��њ�L����O�斺�۟��o��nkJ����W�����?r��!̌���6D0�ݏ4��c�����а�����o_����?*�Uq�C
��4���9!�|�0:�VEhH�߃5�;��濐���S~���Q"���
��M�A]|8A�:^L�?Z��E
�~D�]���7[|$MC�߇����r~b��������L�+R./o�����x�W��~$?]d�厽,O�g�pcr�r��_�:����Y^��n���=���ժQ�@�BxZ�9]*��y��EiA�x͒�or�*dN
B�\�ʬ�O�т笠8'���쪇>Xp��MG�/Ă&.&�pƦ�c3����&��]'��K�A#��4^h�VaDVey`�0l���B~t?�"ZËg�Q#s�]zuю止��n�������
Nů�
�[0?����b���.��_�}��ˈ	�b�k:�퉉�5��(҉:^��K/���
*���7i��
��*���K0��R�h�w�ܶ����l�(,�p�.�ax6�˰����%���Kv�x�C�	��.������٣.L��r;hQ��!oI'��X2���/��p�	g����t�R���z'�n]�І��q�[|BkN���7�!~����/ռ��Ȫ�<�Ba
`TS����)�H��	L_����=�Lv���<��~OWt�}
�>�C�o����ު:=�nT�ej�n��|����iP�������
w�H��,g�PKk�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~PKk�mW�&�l��setuptools/_entry_points.py�UM��6��W���w�H�.zk��-�d&ɒtj����P��NRl���ސ�w�GќM��B�ӂu�U�~��|2�o{!�{���tQ[�Bk�=��������9�^5tu�i��T���T���2�w�8Z�U����jG0��<���Y{��*�=dYVC3�U��sp�!�l6����t�%
ۈxQ_��u%�'$�� ����^d�T�D�bu����_Sz�Q�^^�K.�_#�;�#0�Bܘ]�Њ'�O��4�Wo��\�Sk����O��_�Q���8�
J�v��'p��Au�U��)F��S��j�Jw�'k���̾SBܓ�nt�H)a�H�s�bz� ]+ǖ
��e ���.[o�.Grΰ���W0B	6!��I-��"��G�Yn��{�g$	Tu"���l^�dM�O�XߣJ�BX��pt���LŹ��ɚߐ��@�.<3O��~�qS��>���Yl�O~��9���A�s�A��YI�r�)�ׄ\�L]�ZaV�ر�l��7�<y�Ut��9�N�BV�B�B�G�$ц�ւ��˘��_�<Lg�+�/gs�t�o'����]�EQ�;Ń-�0=2W��h4'�Q�o��7�<�^%wZ"�C�>#�KRV1�6��t�ꤴ��-*�y��%�ɠAI�%�k�Qb�>���'6���
�J+=��)��-�r��[z~~ƌ;�q�~$�le��v1��k���o��C/l�xl�f�F��(��7mQ�����5�x��W�x;ѩ�X+q9�7�`��S�Ï�g�,B8����]��7�����<�u��Q�2��l��|��rZ�A�T��Ŀ�}��wI|��,���!�BAߩ�60�No#�ufp�o���PKk�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#��PKk�mW6��
setuptools/_importlib.py�TM��@��+��DJQ���Rw�*�P���"�0�0��!��z @�ҭ�3��=?��!�OEQ�%�Uf0՝��,�ѫBy�����ᾼ�@��bѽ,���8(پ��8:����Y��9Ս�Z�5{���k��Dݷo��Qk(���f�&�����	O�>C���:�s�H��u�O��g�W�g��rV�G����C<�;�ۑ����X��*�Q�
�,TOdx�����|_+	%Ž�F�ќ�dL�d'I�^#AYh�ÀK%,�O3�|��i(;	�XJ^�͗^#�N7^jdV;,���M&��fq]5�ށW.\Cm�8	�KIe$���R���[�s�&Ɇ�lg=�kn��}t�l<��L���\��z/��iks�)[ͰH>�_$�ۙ^����}h���Ll/p����,�������%�{�oW�Y�ױtT�4A	>yt�ߋjҬK�@���ԯ�'s�C�-�Rw�v�y��w/,GƅZ�#������+��PKk�mW�T��X�setuptools/_itertools.pymQ�N�0��+Lwh+��I�C��|�B�M])4M�$E���ӵ+��X����K�l���k�t�謣w��X�����#���oo6I����+���l�PZ����&��b4�F��c+Mkh���U5¡�CQ&����x�8�
��,8T���@�Y�aM�D�������T�dd��v�����+��8�a�������ΰɁ�8C�x{�P��w�p$ɰw�5h�aZO1��
%��V���E˸\�3��6�^^��X�c���t�7��̨'OBb���_ȧ���`W��t�x��,��&�+�kJ�����¬9o��Q��g��PKk�mWT��R�setuptools/_path.py���n�0��y
�H4h=V*�m�z�N�D�5*�,	��s�&��:(��o�v��H�9�Y��Fm�A���d��v�`?_��9�2��߄-v��M�V[l<�S:2�m�$�ÜP�_��h<\p��A����;��Z&���s��%�guDN�t��LE��0[\:NUA��w�'�a\/�V%�D����:���
�"��jl��4B���t�)��s���?�0l�V[H
AC�C;2\�"�+C-�,
˲�a=QE���"�
�������G�-�B��E�Џ�w��h��ŝ�~��r%��\k��:�PKk�mW���setuptools/_reqs.pymQ1n�0�
"�
8z@羠['G�鄩%��$��d��A�<��G��i��yQ����݊ulR.�*��4����s�Wq�@�W��X3�ъ�I(\��Y��r�N�-.�"��af����L�&��Rp.��j~�#�}��-��Ui\�瀚pꀲ0;.醂<�7:�-��	5w�08�º�n���֚�cn�B����"dX(ߩ:�n��O��YNP�Y�`\��F�l6�͝YzȾ�ܽ�?�B�PKk�mW�����setuptools/archive_util.py�Y[�۸~��`=,�*l�0�,P��"@�(v hشD���D�������CR"%'�$]�X�|<w2�����RV+�ăռ���c�j[�1�ˣ� p��֬���J��Җ=ʾ�����U���P�ze�C��1|(UgAo#�Z��U�Xd0��Zi�<�?��y刋�
$�3��JjQZ�ϫ�nǛf�c��������;��u>~񻉾�
�J�|h�ޭ����z݁u��GQ�D�A�`C��*
:��d��@ƻ�jU6�������8�����T�Ʋ��٣�dϽ �2KagF�9�����VO�z��0��Q�,w�UvНa��@��`��i(P��@�^sj挈�A���"���G��m
<ٽAoV��v񚔱}�gV�}�`�3@��4��Kk�+�����3ig�Б?!��15�I���Vt���Q�.��F9"Zw�A�w���=�܊j�3�U(My6V�$���B&-�:I0�A{��`������K�4dU`�Pe��,���g����Ÿ��`Q 58e�%�����ޓMͽ�I�=rK��l��9��#�����-\u �$+؜���L��#����#F�|`"�c��&�d�@ u$�L`
�cC�ff�F�*wf��u�{.�ޞ��D�h!��dB#�:�Ƅ�C&ke78����3�%)2��щHA™U
�YBM�n*��DT�QM�!�����i�C%�B��OH�*M��<�R}�Hq|XP�x8r�&��@����f��ɭ��e��j�wۜ1�&w��j���[U
��P����ڌ���cBaD�Ik���~�6`�L?����02e���t%tj����!���T���X�>O/Ӷ������*J���&���BVL|PRWlV�E�Y¾��ʧV%�zÞ�5{6v��u�����<���2u�>�i��Ct�����^�2�Z��l\Q�7n>��Qo�.�"mI�1.+S`�*��q��'�z��\��t�@SU�����|�j��s�z�oc �s�G�#@�xs	n�=@�}��M�13()d�#̷���2�|���`�=�~Ϡ��,�}H�h�Q!N�@N�	���Po/S�",sP��S�\ޯn)U��5W�=nA��K|�ovIs=ߔ3�lWnJ/J՟@��mDdPNmL�����ߚ�~�i��!	=N�A^WtC����pY~�p��v��&��SG�.�����o8tc(���f9c�i`�q!�૫���4P&�l}=��&����Jta�{��R?���}���V�"�"��+#奟��{h�0������:��
,���hKc���[��I��V6\S\-Z���{�,o��H��
��7�������Pq`���c�]���V��~k�,�E�Fn�i\*�69�^�܄�0��Q�`�����;?��YD;�c�!:�n�R�e�|��� �[�����G�i��XY'7�]2ϋ�+*���*�(�a����}�<W�&������tE����]q�a�qL`�e��Sr-����鰡����.N�S*���|�qs-D�0!�k�e��~����؞3�T��<˜>��Q��ܬ���۴F#!�+���A�T~q���g���������0h�+���(B�y�A� P<��t�M��P7�}F	�X1�6�F1����;�ŕd��#�Eq����c��[��r��2j",w4/��'p�e�G��Y���-n!�r���Q,�Ǥ�4��7/�k�}����64�B�v��K"áv�_J�=��e��ܪNn���f{HB������-u����ax^	�����ݕr�.c��v�mL������U�/Z�����*ξ�$27d�ht�.r��Qx~
��b���I�ǭ�!�ۛ�*�$�e����ϲ���k��v�:_��Ҋ2?���v����H�D��( ���Zb��g��]x��3�(��o��3�ӈ��+b���7�x��=K�T�8�D�\�����Ү�_q�H����1�G�1~����?�,��~��/>D�+�)N�W�%S|�)U�#`�(GG�X/��['W;}�N�+�,��=�>[��Jۋp�޼y�^�/�.vA����k�`���BA�r��f�����?���u��E%>����*���K1��� ŖW��|v}�ϲr�;PKk�mW&M�J��Lsetuptools/build_meta.py�<m��6��+X�ۭ�K��ݭ�wy�m�.M��L��gv��)[�,9�47��~�"R�홤]���AAA�]�]��<�+K�J�	��
&EUo����`pQ�۴�e������g�%+J��
ϗ,Ks�Xdl��j(Y̳���IY�|��K��6����R����X�8cb{��cQV<�1�*-�	K�r >��6��(y��+��R�&�ecs�'�i)6"��Uk�1쮨��*b" ��X��4O���<^,a�X 2h�	�;�x���	<�@�2MQ�l#�u�T$*V#�wi�v��7�j�s��,
�+E\�Zx��k��l0`�q�.E���KZu*�q�4>gv�I�	@�$d�mQ"�T�M��3�����;�N��-�e�"G��4^�8�Ä�P[�0�6�UV,x�ny��E��%�k���r�?��9.��Ѭ��Aj>/qP�zX��׼b��kȖ�N{�ُŝ������\�<����#��ր�E�D/Ka$x�2��W�Js|zq�@Li�V�1-۔�u�-���g�~1�)��l	�F��ץz��R�|#���"-�2��#�Jǜ��B�Q6Ra�5��RD �|�+~�ֹ�;�j����~�	��'4x�#2Q���q\�
_��_���%����Jf͕� �T�EZ�o�4��:쏝}^�D��&��J3�+F�Pe��‹͖�P���ef@@�7l��n������m�X��/Ҹ���
-d��5a��8Q�M�����8_?A�"�z���eY��a�Ę	FL#��4� KRD�*����R���d�#=Ii	z���`TwK`�-UY�7��2b��zxH��e��g(I}����<��L+4��'hO���Q���wQ�j��y��g(Û����������//��WO��<��~���훳KX�B�0�ߎ��p���8�.������O��#:{q~�`�%PDM
����B�I��(����� θ���g`~�>Ă��3N��"�Q4�"K&LnE�&�(��Q;^��M����HQ5�9�?��6:�'���f-W+y��0"�蔼����#��x`{�<�b_|���є�w�X���#�x5f.`%�(�\�Ѻ��oԊ�ߍ�w8�<��D����|�����`���w�LW��f��(�7`Q����U�����v�Ȗ
�i��r;�	�t���漈����#�w���@�	�d0&�����Ԋ��q���Do��;A{��q�f��<N�4��qY�=�}�sda}`�-8X)R��(rY��"�nXZ��R-����
�#����Y��`��nBÌ�#�Z���@�10T?�Y,9�UU�{��#�Lt��^ch� ;��F�ـ��h|�0?,ĈG�K������"f�0�`�Q�R�{™&�{}�J�1�~-�\u����ЄM����š��qȄه��
�\�S6j4�hLZZ,
�@`��Kp��&�q��H��2�R��-��/�jA��Wf�iy��*HҘu��J3����M�5gC�vRA7��V��xCB�;���p8vב�F��tOK���t[����iB���j���vYo�`'8q^g���(B�"��}���_st�u:���z?�@�Q]F�y��!�h8a��ا�)�@9艌���]�z���>b\�0FA0N���g@���][�a��R�CM#C��Q,��΃���ȓt�.�.�f�_�
��=v��y�v3!crssC��s��
�M�,
F�e��f���tk��
��Ә��J3�;�;�E�VT�?�h�>}>�Z�����.�[�rp�I�U�����2%�
[�@�`4���n�
0�<~��/ߍC��h�xכ:�
5 ���SBAk�!D���Dh��+�$�bB5'(�..Ž��("8����قV�f���&����tse�G��j�w\���brEƩ�X�s� �Y����f0�XA$t4��ɖ�\�@d�q_���G�L�X�c*�]��x���	T���,@�nRdO^o�
L4}`�VQ�@��^m�X0%sH�]8y�ݓ�u>��w���[���v�a�f���5�Y�-c6��Q�~���LP�
��f�be�>��aR�Z��ƫ����Y�~�ޅ�Cgj���`:U���br��1$�7�����C;[φ36L�b�"���M�����ag�!�.F0�W������`���&��Vh�#���!�e� %� ���j��Ƹg���xA->��ȍ��'�ߎ����HM,�J��G^?�D�Qae�Is}k�B'(	�{QH1�J��
�^Ϟܐ��Qwź�O�͉�I�W�,+�U�)��$�fTr���j���5 8M�˄���3�R�ڃ�ف���t���I��
2�[���u�۔[D�yK,q�0���J��v>�п���n�`�3aT���,�Uh�:��	�+&@�l1n�&�O�"�@��#>ܾ5�zRr��L�^e�>�����\��^���=z>n����k:m�!����W����S��@��=xay1EY��A��&�]��`�S���V����ǀ����>�?E�
0�e
��i
7�S?[�a�
�����H���D�aI�(��kp���0��"���Cf3��^�(��{��A��oS�<�O��}h~8�;2���Ȓ���7c�ZXǧ��[2ъ^w#�G��EW���o�~;¼+�]c�Gt����!�ƒ����uki��Xz^��t	�1�qР�'��04���[��:�F�f���?����
�P�ՙ��9Q��]��F���r9�#/��9��ӮRL	ϰ�8aks��*2"�GO�n������l{�4���P:z,�C�[�nE��C�飬��Ɵ!�ӌ���k�@�yR�c#m���n7d��e�1KSg��pjSd�ղ�
?z�rL�u��#�0�>����$�h8���g6�FǺ�ÀL7�R������Po._�A(���� b3媨�$9�L���Tm����ħ�|(׿o�Aq!,JR�'�\�U���!o%�m8l����#~��ҊHJ ��	��-Bͮ��W��*rb۲�M�^Ɋ�Jn��,q>�D�>��T�������8ف��De���Ҫ��hH��P��x/M{ cL�-�����o�x���Yt��󳋫�ׯ�gWO�_6���2�$�k��n���2.�C�Cd�G
y_��"'��׫X��[�����/#=�M�I-��7M]�M�:�=ܑB�ųQ�� e�i�g����fo\KkH��H4���$�6+�����^��{�.2�%%DҥwN'�/��.>}6,�[UB��	��0��
eVt��"�=7���e8��6��	��g�y��Ժ�#�dʯ�����ī[u�:v���ԛ�צ�z��f�jR�⤺���wl�k/�־�Wc�:�t��TAȸ�/4(DA�>%��p��R���'��oN�ݺ��R�.p�S4d������
�SLѩ��;���@Q��F�eQ�	��~���yQ"H.$֮l �L���*��F�ؤ��<�)m�H��G��A���=��h��<��
/h�z��
�1r9�+g���SzU�Y�o�K>t� ��������Uv��J�u甜�Y{A��R���wz=T�z7�i��_B�Kt]�?
�CA��&M���m�>+�u��f���^����5N����*�M|J2xB�hŗ���	:���
s�����~z{y���V��.*��r��7�D���]��	�c�9�ҿN����|��^Z�!I�e����v[;28BL��U�
����7ŭ���`��������Rܱ�P��:~�n�P�.Xa[h-�T���a�(�X��T�7<B:',�e?w<{����.SLH�S�Ѥ�� �j���.��A4f_��G�`�s�COww-�(�N�S����S�U)Fw�ȟ��b
�z�K#Ø���Ǫg�U�b�@V|�r�S3��qR���9���y����c��%�
¤3ɽ�#&�_���e�5���m]Maj��XC#�S��
��&]�r���2��'
����D�BKY����Y{�{�����yV:U����i��ȍw(h������H���B��n�8�=a	��JW��ܭ�|4���m�AN�1��w�КtF�(��N���)� v��c�N	�j��b�p֙�'_��=����^�u��k;�y��$d-�ۧz�9�~���*�;���i�"yS�����{5���~=LM�a{U?zͬKs�_9��ͳ�1�1��N#�T���A{�u��g�'^��Q^���+�(&/���<�v�Sg��a���$����i�<|�p�oLXw���Lm\���k:ۻ��,z���E���]c{=tN �7xu�n]M:�96�q�_n�$͢�׾ةN�����J��ofd0�a=��o�.����F~�qh���9̶�$�[��4�1')]}�ao"Q��w�l3y�=>7�l�����)2h��>�c��w��*{�����I��4��Å�ձ��qCd��غ(�I7a�߇s�\�s �q	�a��
���X�}�"lه��/�PR
B}C��u�T	*���~�to6����C�xW�Csm6p�wq�ㆪ�P���~o���'P|�*%������g����uey��� @;z�`���k���[�TV�j��`Bn��Ñ(�E��������C@_�sh��N^�=V{��>Uh.�=/6��}���4�7u ��α:W�k�Nխ��yx?���n�M/�Hsz��r�˥j�=
H#�gS�_��w��mq[(�ٹJ5+�P����Ze�\	��������
�����<O��^��u�in�g)nE^��	z���[���?G��w ]~�pHa��)�F�`䕃'd�
)`\;�&��T�j��W?�~u���G4��B��i8Tw80�"�W_�q/W|��'��@��o:��=a�T	��R�+��HoprD�6��߆_��m�h�Ɩ�"u��3TCN7�T�st,F�&NW/,�,6֚�u@�ݭ0�ݬ�lwc:����XY�o�u�Y�6:���փ����K�����6]��(H@�wц�N�)l�4����;�(G{�N�e�����J���L��+�'��5��6	m.�J�l,�}�
���1%�	�/�2Y/�e�1�cP@�(�U��K0Vl�EMŗ�Y�ب�	�C.%W
0,����Ȫ�P��h����`9�=(��:��Z����G�dm�H˪���~?
��'�z� t�ʹ�V��ٍ��6�6�#@V�`s:���m�n�z�DϞ>���W/0�9��;�P����zQ�q$78���������thtI�Cp)��g���L�ý�'<��1����ws4�c� �I���PKk�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�PKk�mWi�y�{setuptools/depends.py�X_o�6���Rt�Gm��e�M�i$�Э+J�6��T��D�V�
X����ݝy�Ie���w�T�����=���I�bQ+��L�)���D���n�����)ͥ�Y��U�E�����"���.�]�����o�.�89�^_�z���3���b��s�4yN������sŒI"���a��`�6T<�-M8[|�eC�&�ّe}pppL:�jn1�=o*4W*‘A��E'ŋހ�@��,*V�<炛<O���O��^A[p
`ڰ*��[��K7�eݰu��&��8il}.<��j��ˣ����pM�PQ��[!�}q4���C\�߆�Ί�g�/o�iҽ�����&LyO�|�|��I����y�!�y�w5,mdI�.�̊5�)�'İ�!�0X)�/��+�	%�⪁=������W�#2�J�QN\�T>�	yJ�J�2�,��G�`��3y���h'��j����辮yə0͖�ݡ���՟cc�{���7;)
�N�ŨtЇ|�&���^�l�X�W?�qF0�z�;jn�/(xA�ƬGYSO�e#�ѷSD�"�j,���M�ge�5���!��`MxŒ���f@-{Q�ư[v������0�!�T}?�P�����j�;V���"�;��T��_A/h������ބ�����q�KHu=T���T`l�$2�Bs���gN�8!���E�ȹ�&�-�u����0'�!�#�ثί �Q�}H�lZ�@��+�!5lЗ{�����,Ϭl�f�>����gr�J�rj�p��T��=9����gZ�Ԇ�ƪ��}y�����ē��WQpR��4}���Z�fހ��g��(�pP�b���,d����.�ؘ�^e����/ �#j�������"}4
o���Y/�]%�p���o鶀̲I=t�_���?[*����g���6�ܳ嬩vXx,��j�Y�8��X0�JyM�
a��m[�&t��3Q��  ��OI�!�#�(�l=z��1���*nh�ȩ��e{��#
��k@��h ��f�ܵ������F��6c�����=�,t�`G\���O��08K<ع�o�SK�O.j���3�%�{B�y��"�>�͆P�ؾf��gjF��x{ٙ�a�U��e�[��
/ɷ+r�[�:�~e��:k��܂t4�w#[ǰ2�͠܊Ϭ4s��c�֭Yƥl;^�V-�x���$f�w��	8�LX_���{;/���G�J`Z��wv���$:��I�
zud�\&�l�,��	H�A��P��<'�����ǝ
@�߽<p�kn ����c���7Av��}���^&8��.;�����<&l<-#��wT���9<����NcW��m��gQ�ͬs:"w�!��ͭ5W`���A�F@5j���a��d�Ȃ6��Q�x'j����5�{2���[;��!�#�1���������Ib���=�xy|�d���a�-&�}7�5�BQ��/�l�q�hv��~��2N����4w��p��Cst4x�
p���@��ȇ�c��y���(����=�N-_%�7@����̹O���gǯ!ϯ��ً���Y��0��C\z����
��ay�^�~[�"����3�������'(R�#�v1�i7��~���;��u��?u�#�Y���rv�����{~��_1r��:
(c�I
����V,PAN�T�w�7�h�Ȉ�M������>@'�W�`USvAc�^��_:�*,�
�&l޴
�ez��AJȥ���&�A�d�v��
.�I��dw�sL�*j8��������
�3
��w����m�	��d�|��%v���,�PKk�mW�i7�:?Qsetuptools/discovery.py�\[s�Ʊ~�_1>����\6E%
%�*˲ʢJ'��b��K�X�$7,V������KN_�
`)��1+�`��������0�ۮڤ]��e�fՍlv�Z����*ŦZnي�\�:ͮ�5<���y��6�6y)�+9��]�/����C��U�*_�����6�L^Cg� �mSW-��Ѻ��UcM��*��6/ע�6�J�m#�ڶr9�L�E�6�q��m�D
�72�*`��u#[Yv�?�S���gh����Ҽ���`"pȥlb�
EA�m	o�j�� ��@�ɒXʥ��(��,��&M�Y����M]�LH�OL���/���_������{o��+W�������	��_ov���~�	&	�%I\���xq�-��2��d�C�Z���K4��
T��:\XoM�D�v2] W��V�.���T@uS�ٕV��P�=!>.�Dž����)�<�~$�}��-�d۬��N	�%Cd��+H���7���$��$��U��ɦ����/�v�j��X��@�d�z��V�uQ-�G����iwU���{x�ݮFKS�Cb��_%g߽:��ͻo���,-�t�CO/������==����-X6��CZ�(��c����t��u�%��DF	B�B�&W��1�m�/�`�Lg��~6�y��z*E��}��3����d��@�)�p�4y��m~-/'�뼀�A-�lu9X��ɇ�y�ߵ��d�]��%93k��٣oH���%?#��Z�mk��¦�d2YʕH�}�ˤL72���M/�ω]�{ ެ�
�DI��o�ͤ%��5�x�&P�U6�NS���~��3�Eq��"�CY�	a9'��V���xtP��C/��hPy�.n�-3֐��D���(�+�Ӓ� �o?��LJ�������ՌU�1��K<pAj���o�?Ӓ����H@�%�@�����h��W#����a|h��;�y3c,�4�m��H�ã�)�O+�VE�f�/H�'^�T��PS
t�aDLHb$�NaZ�,��`z�$d\�BBPѥ��*Jq���w`��O
��?�#(��o�r����%ke�dWr��o:�^U�bI��u]䠃)� YS��q
�tc�0�e,>���v���bۙq��%F�+�����<�$�E��W�;��;��4�#�[��$�YYM�W�/�
Doa����2K�pw;�O���qE�M�᪪b KQ�
�ۅ]��;4�B
Ў�5���*r����i�&�Ҭ��a+�Zfh�K�ʲؙ�,��i��oHYs��|X�>G��rVF�DP��a=�������(̇���4�-���
�>��P-Т�`�W���F�_�i�d;����f�1;�W>Nő�i�4{����m?$:�B<�ppj�O�ϩ�9�� MyOhM��oxWuo4��嫦��I�p��Y�g�W~*�è!=�4���H?u��^���]?�+��]��l��Cм���(:ä�O�H����I3F<ʑV�t�X�dZۖ�Љ�B|;E:9J��Eӵ��=�{�Py�ȸb��[Yb�"ǝ���89��5�э�_	�1�TGIR�2�<d���~�b~s���&��.����8E:�Rc�j�i��xn5�ĸf��(F��5-
��mZ\;`0Ui~�����9(]4��@�U��nw��4�U
J!7u�mb�3,tB=O�������׋ˉ�g_�gMc6���>����*/C3�hЧ��.�ҐS�0�#�SC:CĐ�Pke=�0-�z��y�D+]#ud�B��k�!�֙	偶�	��!�-��M�%��;�*�����V���������1�Gr!
9U�>��.����O�KY���V�Ls�jR2(�&�!��F���@,�ے{��#Z�F���)Ɨ�;�<�{톤p�y��Er���oFe�`lr�?`�/�^��a�0E!X�`�|��y��z6Êr�Q#�_���7_�p�=��|�ē/�����a��8�9 |� ���H���ky���SCv�GG��GG0\�mZ�ӯ�wH��wAL�uC��
��~�����\�LK�uy�9��B���p�q�8Q�,��i��ψI�����%�Rd���Lu���U��)^�V�O�˙\?!4�5PS'Q
a��%T�Ql�<*�ٳ5��Qj�i�dNQ%��:Xt9/��i��5<���z�64?%7��偍��E^���*�=���������B�w�������\ˢZ�/;�v�g��!��ʼ�J�֏��q�{Ee.o�./��^���“$���r�ip7o�c�0h	���@Ï8O�k�lK��[q"���	���wg*��cǼ����3X��I�M�9RkOZ0H������G�1vY��&m�=�藽e�M��ػ���/��t-��}��`�i�g���8�<R�N��g���p����!g��~���ڠ��.Q���'���F�0����{���ɩז�:��ҊW/�j���ӟ�YG	�oR_���e�rD����^��H�	��3�08n��
�h�)#�A�N)c��JG� �f�ch�yq�A��pi�SٟBU�ÜG1��G�1��ku����U
�a�G�e���f?b�O�����Yv	��5۬`ZZ���<g'g_}%�<��ʭ_�.��Q�|���[�\�+�Ȼ�>. �/To��'6��H�p�"Զ@��
V���j�%�D[q�1m(̡2�=Υ�J\q��~*�H��
ri�쌶�_�sNh\��0,��O>-@{hv�C�TN+�_��U�9�=$>a�ɜ(����8�P��%}7�0��R���S/h���ݘ
���ؖj��� A�I��Ӣ����p�>���c�h���,��y�ڛkfi!^��ѣji�j�|�ۀ1�z̀9m��\=m�F��~��s
��fC���۳(�TP[w �r�%���Ci>�:ౡR����$*���YȪ
��|��~�p�nQ`�e��E��	�!́�~�V�<��w�-�2��@(M���RU�I�Y�m���J����雦ʤ�*%o�rr*�󹞃�/v=A�@y0�	�ʶ%7��G[Y4^�۫�Vy��;S��vV�HuX����6s�
�>`c9o�O6��m2�0�o p.N��:�P�<!3��\�1�X��U���oh��my��	�x��2AU�8NOd����d*������p� L?��Sr)T_����r#�x_����Ll��G��
�i��[�
�1���i!�|t %/����AA�6$��t[tl9T#��	>T
�Z�����7R����sC�ح`lv?�����?(�L�n�6��-�q^�F�q���P�+^!\`(D�Hު��Q��PTZfr�%��m��--I�"�G�A��M6y%�%�"6�9L�d֎(�����#	�1¡
F.xԉ�&F%��j���߂>|���sl�R�,�]b6q�=
��Q�4^$��պ�r.�x*��0��ڐS���q�B��]���������Y�>J>	������'$�ؒ)x
�K������Ts̭w��ڏMK}!�]��)M9'3pp���}����Lʶ��(��z�X�Y���g��"G��X���v)�;�Z}�~�7����*:��Ӛ��}��@X*��U#��i�����R.�k_s�w���LA�cʾ�D�
���dF ;���07��f����zE�
l�c,1��@8'b�1"��u��*�*��↧sd2���q��p�1��O��0$;��!��6Zd��+�7yj���17�9U�;����<�8����zt⺪��ĉ��E��E��o�����b�"�kV.S��ĵ8D#g�Ѱ���|_s-=�����y�/8>�2���N�ml���10^'�}�?���j��r~_M�6�m>�a�NǙ<%�,�G�S>?��FE��^.ݒ���z�{>|��n�0=9O�(�p����--խ�Č�
��gAp�Y�k�53��P�rOѦ+�[ǰ��vضۍ
������|���������,�w&���"���9T�
�<1qJCw.��� �3Pb�Ԁ�xV�����Qh�(�C��Ȧ��G_�v���큀�'�M%G��`U���m*ѸO���T[,j၄n�*���綏[����f���	H�
������G�2ңa><�\o�+(��מ�.��~��+[�b����%�M���X�<6t�6�2�4�4��4�M�Tո�c.��1psO67_�?�7|LmD(��#Z�I(�`�Ttl��K<�K`���D�XG!�V�X�6�
����v���5�4���*~��v<�֐�	(�\d2'C���%B'Ma�G�����k��(�H��%ƛh#
tav,��)���Q��sF@٩7;�����k���7
,�5m��Ñ���U�T�[ȑ�*�6��;���y��cLd�0(1�t���"���v�p|��qQ�6��$	�a���j��+�'�95f4�{\Sq
b�]m/K.d�x.��~�6��S��ܢ* XZV�d����cF{��T�霃�gӮaQW�?hس[���p��";�1�z�O��)�̜۹����6�������V潼�\�"���y�m�'��]C�&�����)�c���,?�-�%�)�V�0�{3���Ș���SrN�v��z��2���yST��E�m;�p�˾s�@⢧�y�UX�u�l��U���kR�^�?�n�M��[��b�)�и�`;�4Cp�NVJT݄mbj8�S��\=�3Z�L]o�?��Gm ����G��{�����sz��
	p�dK��A��|��'uT�r�z��p"���<����j�Y�1��C�����2�33q��9,f�/t[eQ��9E!r�3���w?~z�J��RYt��|��+���:1���hE���=a�69W��Ø{�c�']��H
a�.����x��D��������᫻kNt�E���6
��_x�-0���PO�p*���D�v���/W-]����<�J�1�E�FO�8=�;7_1V�����S�U��:�=ѻ���x���&�"����J�k��y��l�y��_�NJ'� �d�&�g�t'o�&�U9�����8��;�E�F3v]�d���Tv��)b��1��x����+��?oW?�8cRW��%��%D��۴)	�����T��*�b(Vh6(y��Ԟ��,�
ǎF�i,$�I�kS��s�^E>ϟ?�7�E�b)��Կ���8{\�d.���'�Z��x���e��_��N=��=�����H��*&+M�/5r7젯P���v|lM��&����%$�x[+��i���9��3�]�t|�s�ӱ��X��C^X�0�����=mw�"��?SNMi�i�
�+K�����"�ղ����g���J��ZU���W�k��3�곿�ЗW�_c}�qD��2~k�4���o?�{�$6F*����,�/����mulq��%��4�ŨqO`<@l��B�����U@�O���ݫئ:�4q�g�{:���J��B\�_���~��5=[��m�w+;��5�t�e�+q�w7|J���]�525���:��vi	Pܬ�*=|1���ۨ?��f0W�鶦�h9�y�_}�M]���W���
���˖��_H�w��9�6˼��h�`��m��󵽛n�j|{�ƭC�6����Һ�)}=ܽf`�����W|�߉����3�6��᪷	��l�.M��� e@�� ���q��'���|���a�lp�Z�'~�����~!#����_������$>��X!�,
��
�=Uv�8(��h�
nk��`�h*����g����X�Ї]���M՚?ԑy1:�"tCq,4$*�4'�i��Y~ُ�mk���ż�����^<��?G�TN�\���v7)���=ԏ��^X7=R��*�9�c��F�?�4vt֦���ԍ\�w��
��IJ;�{�>�_qo��]F~�d�z��PKk�mWH�A*//İsetuptools/dist.py�}m�����U*�6	I��K6��S��bK:I��Zo�Xr��,	��+F��_��+ܕ��Rw�*iI`����������(��(���4}Zu}[���ӳ��j�m�>����w�k���<�)ۺ�/��z�9W����{����b�p�X����r���l6e�<Z���y��'�}�7�M�-��B�z��/��X��b_\����`ߖu�.{U���^p��us��T��P�W�~�6$����-�\��o�|����,y���(׳��?_?+���ٓ��x)�m�r]��^��#~�h�k����~�T�r���B�T��Rf����P�)V�Z�Pm۴�S��|�/g��[�����p������Pݢ��;�IDʁ8��u�m��*/�@��kڥjղ�#%�
�ZaCW����;U�k�Y�����NP�.�|��rY��.���5m>U�V-J��3�,b�'>7�纁��^67]��{��MS_��.
l[�j`�ť����Ue��^,V���m�l�7����Z�F��������hU��څ�ƆČ��������
�~��g���}�m���Օ?U���X�υ�u����Q!�[Yz��۪E���tz�J��qt31)�!��nʈj!��l�I�O �����ծ�y=��6d�)�i��V�}|����N�W����(T�}K�gI�Og�˦V� �����a8R>����~�?J����C�Pms�v~1�"5v5ˍط8F�>M�_�_F`2���霼y�d���lv������U�Ŀ7� :4�%"F	t�ຂF3��ۮ��f�
kUg�h���$�,)�����Y���v�y�X������lPnf�X���|fKs�G�gS�hk�[ ��z�b}�]d��8���kK:�ܜƒ3���Rϓ�~��+�\���!�.N�͙&��9I��_���^�� ǸD�*�N��o�N7)��>d�AGLj+(L�����S�A��T��5�O'jD���AB���.)��i���(P�pF����yv���.o��)G�}l��$�L6�ݙ�Q�"H�қObXF�<T�Dr�שG���2ڃ&ɜ��'�9������I��e���
�/�Q#��Z��M-�����K�N
�ځJv
4����0��u��C�^��KnTR�
I�F�]�K��^�s]��e\�@I�{����j`����Ωd���7�ko�|�l�|\�ѱ��i��Z]��CIºZ���=.r�O]��MP1>����*�����`�HEYu�"�Adz|KC'�Я�d��4�ضtiR�8�����p
�)�%Y:�Fg�U�n,��JPt)�5��X�=Xז�
�K^?{�|��d��S��t4Q��`��4-F�Xd�����j�a4u�P���u����.Vnλf��[j�RR]�;5�#b(_�(���%�0�Rr�%�f��V*���إ����]��"�aY���jI;�8)y������"�{��� �
��"GK�{ɻWO_'op�B�޷�L~j�
���r��!���t\�Ain�r2�ɁS�`[K�u�npٸ����en
{�<��
�:�9��
qŕ|�E4
:�Ko�ֺ����)h��������� ��=,u�e�{�
�a�ia{�-�su�sy�<���G��#�v*��Z�O�G_M����������o�/^>�#�)�����QF�jO��K��x���@J�X�q�.��S�lr�;N�w?֓�~�x.��;���lH�ڙ�0�k�D�ef�F=&�t 겦gZ�
c;Tp�]J9�]�!�ؐ3ˤ�n���y�,�Y�W���e}�}����|�:
@1(��U!G)��Ɣ)D�qK~gt,g5��Rf��B'��@�N��2��X��Y�1�?�Q2�+��~-6�$�Y�p�<r��`���j��F3�5u!�9��z}�Ϻ�n�l:��k.���~7�i�¤s`Hk��:L�K=�����H�ӊ�̔��\�4`fSܕ��Y
��)5�]���LQW9*�0�����<�ڌ#]�����F�4��k��}�����n����Ne�+8��6�DL�"3u���ѽ,;�(�����J�����yq���=������P5/�W��؄zj�ϟp�;(��?s�5�	^��}[:��D�g�<��MC*9�%+�qk���?G%mS�h�h�4��X��s�T�&�Z�X��p�K{��iX W��CEaL�>��&��v� �^�l.E* AD?]\�ŕ��sP��tvƒ�U6zwV[���
�?�C��x��F�����p���,�h���_9@(<�.�m��ͪ����I��&�cVW�%�{>j5�	�>I���͵;��9]�<�M��f{�s}��Ԁe�Y����"R�}���~;%E�%�9�S�2w���̏ctE�j����ԍcm�Mz�r��XE��lM���)x�[�dWˉ�ʱ65���	х�VA��/��2�lM=�F����Zm@D�,ӦC4Eq�m��`2y�ߝ8F�4�h��4��<��n{W^��DG,r��
�G�F�uW��.�n�@���(	��e��q(�F˚��]3���;R�:�R�qh��X&<IB�>"���ϓɀX0684��W���Y��&lg08�z	��ykN��4O=��uhg+_�*cDÏ����!	~x��%���8��
t�w�8�uLg	�7$*�1hn
��@ζ
��CiɅ�Mb2ԅ�
�F(Ȗ�`Ҽ�tP��	��!���|�`c�b�Ux������ʙ؏���5���x8�-��o� ��!W��7Kyu��D��Z3K6喽S:�zқ��q��A��P/+���M�;!�I��J���R��A�}$l�o.�N�M�XjQ	s�۹�S&:҉��7S��$�%��j�X�w�}i�2r�G�� ��L�M�^��ʝ�lm�R�&�뤑W5�_p���L�B�������j�����a&.ߧG�]ȥ�]2�e���ɊƻW��広?g8X�3#�Vdۻ�'Pn��]�����J9����}�b��胰s6��z����X���zv5��&agF	!KY�_\��G�@��Mj���FB�!+���~y��|����,�H?[���uA�0޸B9�1Md](�Q �T�Q%�ȩl��?�OD�g��]��@�o&DX�%E�q�J��"tX8ťџ�����z�ɌN�N�n�&�r�i�l0�k�KR�7b>]�[�:��/��V�g�Ɨ�_7“����.���څSu<���Q���LN���yF�"wUTtCӫ�;�@�"q��}o�T�F��NQ8�T��9�h7��W�q'M�ʤ�8Kd�o�N���gh�V�2�UT��#��lq�ң�e7q�w�>n���Zr�h��^���U8���cB�J��{�!���@����,��z�B{Sd���궗z4��G�j|Β���܁4�kU�A�ҬM��<�1�������kN�֑�R�b9\�g�D�D����aؤ��,`��F�=�#��$p���r�,V�Ã�}�y��D�Z��nq�1A���~���>�X�m��-��Kdd�Jo�~��bJ����j���
�Z.�]mՠJ���V7��M��s�ce�/;Cg���J�P�K���S_���Qax]ۓ�`mŌ�t�ci��-]����R�Z�ĭ�>���a����|���FH�@?r$���ٿ����
���W{��bCz����`/Vɾ�����j���}��dϭ�C���ܔ�����B�hb@?���x�Q@�H��o�nXן�d�tU��R_���#p膁��¤�ҕ����9��/�v��bu�&|r�,�,nN`�C\�j(�`Dn�y�562B����-u5wC�k����t���t��NB
�*)ⴘuSƌM<=Y�bJb��J�Ȱ��X�z��'���°;~��&�fAS�듇������XM�~`(+4G��$��,0��Y���
�E�-ϫu��)F�ڛ�Ů�
�s��V��矧�$�&�����w�M2{���3`�\N��At��P+ÈL�A&�a�m�&>��p��Z����|e�7�^��zI:a���ݱ'��zi"�=�ȥ���Y�f:�D�O�U2��������H�.?�;Q�c��f�^��E�:Iwu�#H@�t��"��!c0Hj��8�
�j�+BI0�Xi�V�r{�4�wU��Y=�V�@��=!Ԅ;��!�B�쿐!j��Z`����iӶ%rnW�u8�L�$Êj��VJ�j� $U�H�2��|�Z�b�%Z�4�[����Gs�9�0�Om�W
�hd�rV+��{3�8%���p�Y��۬�FV%ܻ9���
��gq;(?�CN0�R-��PU:H�F�n��nw����i+��a
�dI"��>}��s��H�DTɦ��o,"޺���]���d�����=�þڨ\�;\�����]ef|�d���G���(`�eg4x���v��y�@�:A����,]x�

Б+����3�-�8D��⒌P����a���	��,:��
��@���,{48��e��jR�X�����)lݏ�����x����߽��m�˷߿~��ͻgO�{���ǰ�~��A���8Y���eyL.bV⦮��"���u	�N�j����vҩ�t�7�9~D�}�.�@:y>¸%��Ŧ�p���iU��g�s6r����,	[�-{��P�v�q���%�g�~3hJ���>qsY-.�M�l�j�^ю�|W�{\�{��0��t�Ц��V
�����3`���Q��k�Fٞ�']�R�Z���[<�Ns[mf��2>��W8��{�Ct��,�T��X���ik�,�tN#;�܉������ظ!�T�>K�Q��a�X�ˆY��ح�"vY^+��P|ϳ��v2p88�����J|���;� �yq��D�����&��+�܎�@�vQ�M��6�m��&��$tX�S�'k���*P10�o��f��-���g�K�D'8��wAm�#�k��٫ʱK04���u�v��%�A��9~�d�+��'�v��/�\'׃��Q��!F�AI����������"�l��%o��I؂sQ��#�5 3?*�'-��δ;�Y�H��Eha�b1؃�S��
N����v��G�ŗB��������)�*��&��z��e
{�
�^տ��H<�zQ^0�fh���W8�؆�	v$��nĹ�����>�mhbGKT�������8�F�v��.�l]�<�zS�|�e���l��X��Wnj��%}A�~:��]Y�&���5���o$7�St��8ŵ#}��X
�s�}�Y��Dr }Ĵ�H+
���4q�M���
�"��i`6�	��2�_����Z�h�(���N��9����n^�u�{9r�n"���6����nx������m1J���gA�� �`s�;;��I���w���������E� П�L¼$���5
83Q��1ю~H���݉�oZ�����Ȃ���1%K�[�c�O��=#��3ܭ��W�Y�(x�adp���c#9���7`�{<���A�rˎ��-!�hz2�	�ϭ�y�.�~?�E�	9;���hD�w��?�3A`*�t5�I��&�q=��z�?��,��~;��&�I�`�^mx*G�P�!Up�C���$���VT+�#�#��1�c��,�V[�
��H����N)�&�꫇li>}�d
�^��|�w�ؾX�V���ۇK�������'�V�3?Q�W����5g�`�)T۸�O���S\�k$H�Ȗks�l��4��D�5٨Ȣ�mz�0,��X�-�N"�^\?G����<P��"�0&,��Êl�k@�N�l`�(V�B3o�'�msʂ���,�~A����3Ss���n׊=V�p��O\���9��@��X�zH�|�I��X%���FP��*6�Q��|k\(fn�U��G�Z��V���_Ɨh

AW��3�-����p�t`"d��V�-�!�����СD��\�T���p'����l����۽�3������\MW���~=(��b���t�7-.��(Ww����[D
�I�f�[i�$_L^��J��D��Q�>��P�<šC<N���@�a���~�n�������w��:}���,�P�KrHMu�S?���/�˾3�	�K� =��5P�:�L�3��؏�P���e��IiG�4u&��S����l�s�aw>FtTk��nQD+ز"�$��W�]7
jf�W�s-t�>�/w�\�_���A�NJ�ΥA���|�m�Q���
F�� ���:�"7"eF'�?Gt���~���"��Vd�μ�,d[M(���� ��!
����\0��s�q�,�F���D4Ә`p&��J�l���}vy)��>�C0���<�NQ�:'&����J񃾩P����H��:F�0}����5d��b`��v
]xq\~S��}|�C:�lY�L�ը�3r-Ȋ�s*��c�-��4"ޞ��ze��-Eg��>��.����۴����9�ed�˗�N�*֌+��lj�Js����	F���ӳ�(:�~�ăx�j��<a��tt=^�O�,rk��w�1���o-jq�D�����|����f�P�F_�.��V�^����T(�\YPo�,@
j��AGq��Y�����_��uh�u�� ��w�q�E{8-:菒�D�o_<y����۳g�^�>y���/^~C�_�z/������՛�����a60�$^�A*l"��_h�2�e:�
#��(������7�/�rʄy��;�v�~:@븊�6^<�,�ډ�eY8�����ݹ+sIb��2�.��8���L�6�F�_)�V\��M�Q.1�>E�v��>�HW(8k����ҍ�qVp���|��?�Y�����gL��?tfχ��>�⻔��z�Q��.����;��9�P��n��y�d���	��O�����z�����g���]�S,'
k���T��È�ӳ�-:�z�*�8�Я�Hŏ|�2�����5�X/FO���v[�uu~�ۊ��tKNo�*��^���i�=S.�F�W���k��{�+K�9�����Y��K?�e~����%��FWU�Z���.҈��e]7;<���2c����)S�ěE�N��s��{J
F�3�^@�'��Q��	� ��ڧˠ�s��b~����)u��YC�D��#dH�	ts'��9]���k�G|�
��q��Bu��&fU������AI��bܜ�R\�ۊ��rvl��uq�U�Ai��+
��-u}Ǝ��:sV�N
�g�N㹲1��a����xzV,��Xڀz<��%��@l�+݉�< ?��}
_P�w��&(ԟ{�wx�+�;�p(���Bk$f��\wZ<���d��d>}����#˗)�5�:�|��_8>���.�d�%����L�ĝ�$�w�px'�r��d;�"����'Ux���]0��cx��Ν�m��t�F����(<���Z��;s�Xg��#J�,�2��}:��>�.�}���u�����F�{���۝����˳X8�ÏO�m�� �ی����\J�xcIJH����7�<w�s|
+�,���ȅ��fǵ/j�+��s��"����}��s�"�lo�_��Y\�\��0�E�&]����Aw�ɜԮ�����);P/��M�>���wb/�IGK���h�B^������ ��aG��t�F�J�������Rx��a;���J`�.Ɲ�"�0R���UԀ$�¹/���X���hg����׷�h#���^��N=��܏�y`��f���M����6�s/Y�(�dTMr`���\6��i�HC[[а�������c|����ۥ�i�aD�&�
�ǀ��S���S�Q��l�I�j�<���%���,�(�/Pr��T��f���b��Ԑ�5O�5K��t�!�It#�Rl�U�ǰ�ǖ�拒�-Eǻ9)�H��7u��K����pL�N�-����|\m:�'��s@�׮��Pڧ�t.1�@�%f�s�VTuz��	ӳ<̳���nV�L����e9m8Q��:�VD�.�}�[`d7�B��=7�`�1"NT{��o~��ui�f$dR��-aWp�7�<AH����@��81�n_'�!,��qT�D=�HQ
��;����G���o�|��,I~��[�>�UP�E»���_������tu<��'#��bv���@T�#�a�YDx[�Y���f���.w"���’����M�@������V����.��ρ�ШYdBy��\x��'���5�w�KMU|����}+\)bh��b�WH�|��=t�H=^.MT�9�$gDX��b|��=}��o�U�N��	��� c�BN���
D�[�]��Z�|���ޏ}�l�q�sL*�=I
�1�����:q�:I&܈K�Q�0m4	���3�o�Qg�e''_c�	'%A�(=�/�j9�1�/��c�0��%�$%qNZ�`]�Fj��B�FM�g�U}����o�,���"�ϊd���l�k�%Nр�~]�U�뒵��`U=<6o��A��w]�y�G��N �;,�K,����-�_@�‘�ͨ�m������FxL`��#�~��

���:�Ԁ^�H����㒳R�A��B]\t�1����x��5�͉��3��M%9��;�.E�r�2.��I�iO����_V�_D�5n��;2�K�o��F0��=BqΔ'�R[���=h�r���1�6I���f��t-t)mٞW��ҩ�b���T^��Y	k�e�\Qࠓ�	0�Н�i�Zl-j���ə���it�W�vCC���L�L��v�I?db��a\�P�7�,��R��1;߫�|_��2n?ю�Xb�;<KN=H����`�:��91R��g#�Vvo[�t#Jdn���5X'���Ng��X4���0
�=ѴȠ�nl�o�`���O��	�ٔ̕^��DCH�E�:q���Ś.����ziú���:�[���\,�F�,��.�-�:W���R�^��\Tr����/��4>���g�|��G��?��W ��o�,�͂23:f���t�D,���v�)BI�gT�k�}⑌
�q���k��u��!@}���6� ڋ�*��m�_�%�<�w��Uq��4ǥο����E������+D�/䕹��es�H���ՒW�C��X~���=g
����6^������P%
�q#��,*ްg�j8&+�U)�K)u��<2�� Uu�Wk�H�F��M�3���q�ML������?�?�CH�]�a���tF�A��5�F�u]��[w��qK��������s�����؊i�d��2����	�Jݘ��s,F��B��Ƞ��[:�SsV^�}i�����8�\�男̷��Js�,C�  ualв�,�`T!�J�JU�GZm�[4�tp`��tW��UD\܈ev����>j9�.�l}C����S��6$���n��}�Rd�5�
��s��#~n�А�ҀKߐ�}*�gk2V�E�x�-ut�@��>�$IA���t�cm�cʯ	=$����KZH��u��}!	ON'�'g�T�a���}ꞆE2#��~jO�H��~SꛡqvO���d�r����wLsE��\$�m��9M
�i��r^gSI�����r�e��kxCyb�M�6B�PA-�ۙ�?H]'i!t-��3?ZM�����:��N��MS�rVH�ϙ%b�o8X�ܖ��Jl6���ýj���;9���=�8�K7��{	�Cf����͂�3	����c��-(�Jq6�:�⺹��K�`��=M L�0֫q� ��M]�D�v�hסGX�T�w���M�-0�ڙ�T���WhoK�+�M�I'Hn�]/�s�zO6lN��9h�v�͕����Wh�tw��>W]o�Cݬ�ߺ�L��Oӳ�!fF��p3/-��ᇁ��:o��cc���/���E��o��������c�[�׮L�[�Ϻ�^A�M�5(�D�>ȗޔ�d@��o�"�x��|�'1&�I9���51�n�fr��r�$e1��]�5S�VN��H`���B�m���\�#�>���V��R�4�w��c3}��g�p��_�����ů�=��Y�{�R�Y=mH�Fb��X�!-"K됻���'6��ϓ�1k���� �/`�/�ґ��k������~�%MH�Yr�+$g:�/U�=_�Oюil��eo�#�[]�p����(s�?��C�b�)��L���
&q?���]}f����J!$��w��ڠ���{4�:����4��4I�5/g���j�Kx�^�`%΋��$,�bo2ۣs��FF
��Uv�U��k:sw��Sw�T�w�t��[n�!���{EM��^�j-�^Q?�%{Eݥ�b�h���+
������^Q�D�r��^�S4��b̷�W�])4�v����� �]4�i�6+
ou��:�t	�]]��%	��P��0�l��q&�񀿀B2����;�$�7�Sb$G`�SL�0̃ȶ��u]��aM�c��9�	�[¨�s(�#�5�'����OJ�9G���96�ɹV�!�	����xR��%�j=(���Ԉ
�.Ђ�ӢN�,o�a�X:9i�.���K�>~D�Y�$@$���>�S̼��	�2�ߍ��q�ؿ�E�B����6t7.�rU���9vp��?��8�M���I���´v �;��4��?;q/��̘��D׃�A��*
�%�w�IHe�~�����Q����ǔ.ҕLE���i�``?Y�m$�)�-H|	˲��W��O��9F�A�	Q�@kK�F�A��[�t|��\a�e;�k�-���yW�>�ʍD�O�ک�A�K��3���n�o'�ϡ]H�CY��!��x��r�'��n,��.�O�t��������kPmb>c�=�ǃ�#������Hh>{z����H;�es���,��8O��6a�M��*�Z��br���/��p�O>F��#eA�5��W�z`���a`h���䃥8���Z���������B���`�?yK	�p�G�t�^O9x'6��0£xkNG�n�~�502:OT�E�'j�D:�����
H�ݶ�7����.7(��O�=5����v�H?
��`��<�O��g��F����j8��t{�[��d����$�b\��l�9=���,B���Q�@N��B3e)}aDm��.=l�9k��D��Q1�$�r���j��UG.73~�R]W�&��)�G)�����XB�+%�ɪq��ß9�Rp����8�����`��<C�Nh�2�~��Pt2���^��%-�9p�s��Pud��w���x�Fk�YC��6(o���G�(�]i��|W��ɓג/�C��-]��s�ޗ_~�{#az�@�͙78�,a���
;�=ZO�:���s�m�`��^1���*��R�NNb]��A��U:$Q�7i�0�k�j&KEj]��߂���l��]�'Ϩ��j9wS9�P��-ɘ�����5-T�/\W�A��@gX�(�*�;�iS6�4Z�	������9.w;e����ڬ(?p*��:j_�k���K����g��fŬ���r�Q����I�i+�ՕJ�MS��
PKk�mW��q��	setuptools/errors.py�VMo7��W�KRX*�=4�%�HP�IOEaQ�Yi".� �������J*�/���{o�|P��"r��位+����:�'�8�n�x��\�HS85��,ǕZ,J�7TIL]J����$��t�8�7�K~9���I�jm�J҉)���5���_Q��1�oZ�|�q���V��/�����)���e���:�TS��_}��^��?��?��~
S�.qp�θt�>��w�CD��kaé�R�h���@�g�������T��̸v�y�6xïU�*F}�s2�i�S߸i�;Nj�P��;8��^��<}�0O��a���f%qe��A�?��:��4�����z�Ѯ*goO@7�й$M�����-ҳ�USg=�el��N��OL[fG���J϶�*(_���f:�lH"m;���56�S
��
E,*{�!��H���l�+�g��}��і�K ��z��!����X�z�!'h�YJ=b��N��:���c��6I��ܙ�"W���z��L��2��3+r�5�l-�Zy*Hw�7X�&o��|Mmρu犯���(h��L�D��lY}���;d���w�hG�uU胇�&��]��8v�l�#h%�|8�-q�d�n�H���]�F˰𿵌�%���$�⸡d�v��]%YW�E+\3	x˫ݪ�BAG!�a�])5
����.��sY����9��&��S�C�g�Њ�s(�vim0Y<٠���r�M<�����߭�L7��:�{�̓��L��@���m�H*�z��?���'r�a�l�
�N�1������Ė��b�"�VY�0�ʼn��F/�syf�����Ƣ��4{�m�m���"�e'x�\�a��2�/I��Mn�B���iDEG�ۢ{�o
z��:�x؋�*�M�2��E�F��y�W#l4A���PKk�mWu=̕�setuptools/extension.py�Xmo���_A�
H��=��/P8v�H�s9���ݑ�z�ܒ\�*���}�l��V"�/��3�<RՍ�^X���k���S���Tη^U.+�0lh%k�}e4={�N=�l��EV�HG����n�/�TN&���"��'ʋ��=_\M>��4|�D��Z|�-	�7a�(�J6��N�DC9:+q-fqJ���pӪ����,�����w"8=�Xt����y��|<alTX��ٰطE�҂��蹠Ƌ�����d4�NV� <6V��j�*叓�gs����N&�mt�c~���*E��E�4̜���ª
9!�SzW��!jS�e�0��^9Q��N���BV�p�����`�Ђ(���P
���n����{�hP����k�[��~����h/ɪ'1_���	�R����x�4�n��hf�I<ɪ��J�	���d�,��`���/_n?>���?�|ww����z�H��`���0;k��X*�^Z
1ǚҡ3B��;�Y�#��(^\h�/.�I����`<�N�~R�蚴_�5��	��<}g8 ��y������
[�\��hLB7��M��v'�������^l[�;�zV,�hQ�%������Q���J(ʒ��C��fl#�^b�^|��PEK�\�l�~}Ks�o�.���S�yV!���a�9=���RXc�$���X񐀪�@W���;�V�(��!��+G��~.�F��#cgB<�S�#�L�Y���˥x�z�71��b��7p��\C�ڪޏsi�p�e�DV��ic�0;��Me2r�6��NM9�jP�9��)١�G��?��`l9<F��R����p�X�=fG�����ةؓD�&�	�����k^ &�/Kf�>"�}K	�#O�y�Wle��!�c3#שA�kşWa��c�^(O50�Gct�x��8�]�9��0�I0@�/bԙ�0�Ly��c˛��4)��a�ArH$���h+iӬ�(����8+����i��MA��h��E6�t�l{�T��j
Z
��wž�sS�B��EȬ�	��r��LՏ«^0�ZJ����C�&
�$��(��ʋȝd}~s�j�#��m
�ΒV�0���R�u�|��L��3�VYX.:)~ ��yR8��BQ�N�O+��x���J�����ʽ-���l��;� t&Y�
I1�]&���!�L�Un�N�KT��J���2�1	EV*;�M�ǹΒ/��� n*eN�����|qW��A�lPv��W�9c\��8>��N�)ds�o0wL�.}�#�p�M�=E�>–;h�?6�@Ձ:�,Ri�'��ٵ\��xb3MP��hVaڪ��
G
6�{Ta�_ e��	��A�̮c|a	'�Y�̍�N�~����	���l���삏}U+ht��]g�
�0c6{I��o��(�XoP{b3;	.T�"�/�~���kS�

�p ����	M���:���N6�"t�+�@���d��'\�JL�V(N.ϭ�,�oC�j��ƿBd+�U7�*wN9N#��.D:S狿�nI
����I�8��I�_�NLre]I�kQ _����R�(C�N����@�b
�}M���+|��!�#���p8k�T�w�S�6�D$�d�ԩew�K�V������C��9��:r�A�n"���̡�����=�vb�%����js�R�(��\6�sX��m%w���f,���W�����8]���xׄ֫bc�×ME����V*IJ�l�W��sJ�[��!��v�Ϡ�g����	T׸���E?³J�Y��sG�v)�M)Kq�������b���;}�뚨d58a`%�$�7>��T��V����݅�`?�哒"�)�
�����k�x��̧��xxY�ۆ�|��0�#�P{��s���46�&��
@����<��A�.\�F�B?N%.���27hx�sx��饤�K�\�z��#e
�h�m�Û��U���-�)�2giK���ԝ��=��+��᥁2>N0��[>��'ְfP�K�u��<0��0��~H�o���ǯ3v�GgX�9 ��!�ū/�F4�`^����{���2t-1��	���┡��A��l�a�s1<��#&�����s�Y�G�,��e�vx'�1ƞ�O�%+k ����PKk�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�/PKk�mW��~(�setuptools/installer.py�W]o�6}�� �Ƀ�6ۺ����Y���@�%��"�
I%�߹$%Qv����{�<��r�(mٺRˉ���tO�]6Z�+��ъm����ޟ��e�6��V[VJc[++��v��{;��Z�^�[_��m�׹F�vx#l�X�����ҋ��R4Z�JU�N�s�6}�2�ɤ+���s��.�J�&�'����Ѣ6����n������B۰��S9��S+f��ePurŤ����.DtŒ$�1��0X�l�LSI�N�7F���@J�k%fΆ�W8�N��-6���U���:���A�az��+V�~����1�I�BV�-�Yz�Ӕ�ߟ�����G<�kVQ����f�D"�8�/F�F6��eZ�
y�=��Ǭ�YFi���.U%4��@����b+jk�٨�G�R0.�������\\��f=bv4��G#/����"]v`�A(-�\V|�"!�w�}�8�����*�\�tD�8�ģ��B4{i��E�ʾWm]����*Ȓ|������	�ވ`bË{��fɌ9#�ι�u���~�Z�[��^h�|6m��r�$q��DwPf�����E�{������=�����B~�fԠ	/
���QV*g�zDU��r%ym�52�kI�V�\�_��g�o���?8J}9_\O�1�����%���g�;�<q�����
�&����o�)�(cM�F��\"/�U1M`
�s�s�xו�pUn�88�^��j��Pij���$�bEX8��qI�yd6*��,R��/�~��y�L�(��Xh�j�x�[]��U�d�[//V���H���6��?'
5�C�9l��a��2�9�u�F띭=Y�nn��
�#�.4pl�u[�N �-��B�X�
��)&k��dZ�Ҟ��^lI��Q�	s�Wb�^�CT�	�0�˱�39.c&��:\�!�<�"C���9/˴���}Eqͭ�=C�M?�dׂ��wg ya�ޥS4Qf�
�Њm	�oF�qQ���nj%�-Jb�Jf#�d>��$4��U��9\��rN`�Z�q���	�޾a�6����q$`�bD
d'�9��Ńh�F NcNI4��(Q��Gw�Von�<�P�a���Ŭ�Dֆ��-2�.�����s�C�2&ҧ�Ie5�1�˾#j��`�Z��?)}�P� ic��	aV(�{�TFQ����k`�����(�ՙcҮ�R�
:��G���Q^�7�
ȉ��z�c�Eb:en,��}����)��}�]��G�:
�c��ѹ�7on+)��J��'*.N���Y�(k�i��N�M?t��{�m��%���]�܏a3�d7۸��,>|��_���L���W6�������#g��B�re�O��Q���^y��i�!T��""��`Fy��,ѯ\�4
�mh�MFwK��;��jD�����ݬ,6���Q�WO|g�I7������c�-T��`[TSK瑹�nZ͆��G<.R��3�R18u�XlN�PKk�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|PKk�mW�|U-�setuptools/logging.py�TMo�0��Wp�!�`۵���6`�a[�c�X��U��Na��l9���|Hh�"�����a��Lm�	+�_�km��U�@=i�ڻ�X��Y�)�ao�亮��{��W����H��0���3���|������כϩN�l���c��7���ả@���T�V�<�3�H �ޏ��ϧ���Cf��I��V8b+��y`���Y+Tcr;�u'I�����5�k^��3r����A�tL���yx�I��=�A兆��Qv_&�{��[�.�ۄ�I�[��.�����Ե6Ĩ�"'\�.�h�X揸�ԣ��֕���c'��<t�l���
��ö��Q�F�Rʹ��O�oӬ��E+t��
��V\J�O|&�
�a����V9����ch�Q�z�lW���R�%\����,��pX�`j'��A�(�JV-*�x���aQ6J��b�C���HN����kT���\�
��W
��E�v^����B�w)j4H�'5����0]n��#��k�0�߉�*�X��u���K���B��՛׻�gcUD�6ё�e�PKk�mW�Z2���setuptools/monkey.py�Xmo�6��_�%($/����P͇"M�K�݊�(Z�m.�(��S���%�q�bZ�"�����^ԃ��ٵj�t�VkѮ�Z�Z�[!M9;�3�tJ[b�&|�v,��~��N2�T�	���ٲo+��4��V
�O�X߆ڨ��<��t��n��{�Qʤ��������
�[�"��0�Kr�Z�*@���P���;g�rI��'hq羵���x�B�L
����|I�F��J����?�����M���Y0�
�$3�	��wC",�n���r�,�(}gӪok�Z@ozNTK~����k�( �BJ�*K��K��C���M/����̬xC�5���OI�Z�ԅ;��(�B��/�T�H5:r�����e'��S��[�݁����RG
�%��9Y[ۙ���+a���Ts�m;v<��#�����L������#��J$o &C����Oⁿ,�3�������,ڑ2�|���o]��:�7��Rw}���p�^:P��K���w��˖9���GL�y�ڔ�-����YԌ����j��<>��|*��,f[1D����E0VD��T�浗�[i��5Ǭa�L�Ȋ
<u��%��+���D�XC��Mn���吟�M�{��1ӼP|��ښ{�n�M����.ϡ�|�y
f>���<���擄��MkDjH�-Ypޒ��g��<K��\o�hT˥�J��3Q�T�a����򛵙�kQS��"��6Fϕ��j,�Q%�(� ԥ<=y����ܚ*;j��v���Ǘ9+��,иc7Qu���E��k��˱A�3��R�/;��$����~�
=6l*��C�]�ީa!�tN��9�_+ȯSx�ó��19^���R$E1�,�d��@I'!��X�=���~)V����b���������^�|�t����_�}��AQ/,�ŢG-҆[V3�����M��h�?�����J$�O��K�V�h�H��sP&Q�kF�dy��8�<�ul_Z��i�����Y���c.@Y��٢��`�!o�-O��X�~}�÷Ҥy��F�"�;���T{����lH�� u��ӊ���+Z�Z��V���-XA�'���XaG
Nvݚ�ڄ&����)˳�gV�,q�\���!y����{�aXS`'z�wDW�xSa0öT�4��x޴1�I��#����MQ0U0��*��JqZܙ{=��*�0�lb$���ʍ��9�5��aR��a�a�Qr�{��ha%�I
8]�v�x!�„�Nc����
�|�����'s�!�n.���Lp��p?ݎף�0mbr�%����y��F<��s:
�md(W�X{OY���y!F� �p��dX����M=���I	Û�S�آ|�I`ɵ��2jiɟ���ё���T��]^&U�J誗L�o�ƿy�!/�3g�g%o���W�lj��	L���]�'h�_`2P�&�Ǔ���-`bB��tB�N8X��p�Ӭ19��z7ic:� ��:茹E$XӦ��T�1@������%F;�q�c#7'�4K�]n�'{�&��������]��跘�M����^V �X�����ʍ����떟����^�T��]��AX ��QW'�v����B���q�v	44g�6V���X�ؔ�5�����&�?{T���/�χw��w6f�u�˜��f�[*ł�Χ=��C�t�'��X�0�PKk�mW��%Dd&l�setuptools/msvc.py�}ks�ȱ�w�
�*�MÒ,�^U�/%gU��em�1](%D$� %՞�ﷻ�`"h��Su�ʚ����ӯ�t:���"KW��ɗ�E��4͜wq��y:-��8_3g����E<�����5Io�:����Z?[�aw��n9�1���2�M��4�������{����� ���=��r���/+��?����6��U�;���	fy*�))��W�b����+z�xU�[A�8M��X��xN��;O��i��hŸ���?Ks�l��$�~�G��F�N�������'	摘0����0M�趘�c�d1
`���;.��@���1pU���[�,��,K���G�rA==�!��3�.����@��.���=����Y�KhD�e�g���Xoh�\Gw��eT���^E��Tb�-�h��9GG��[�Lқ�e,�;��I]ғʂD�*��h�G�˶�.
�y'H&��\S\E�<�,�-� q���a�-.�y�Gc��_O��4<9:G�4��_���NޟSc�����^~9}b�����d�}�p.P���yXtaclM�����U���O�~�*ĭ��1���?�W����HVyF}��wg��]��DW������+����b_k�u� n�,I�0b۔����v8����v���p�������O~�����|��NLE�a�(���)%z�{���
��Q^�b�9;�C���ґ��#����8)7��ˤ#>��g�wV�O�cU�t?I��`���0H���ц����(�֞�F\�.�I�,g'��M�I~u(���F�	~I�0��Ҡ�z�Z[r��"���݂}5L��q��j?"6|޿��c��'�Z�GV[��e��%�3�s�|�����͛;��La�\Ȱ�ʗ3P`S �*�i��(�@�3��N�4]��lk��L&}�]n����:#�
a�"u�UO@
$�� �gwNx$�g��2	�+�j����Q_&�X@s_E�Ms� �,�<D�`ij`��v|���$.h).��*a
�BaGO,�)Mq�q�ꁲ�v>f�e��"�h��:=6��M��v<%�p�{e��y�#E�{�*�k?]�e���+�]���t,�U~:��f��B�NO������q;�Njz�"��OY�e��:����Q��T�
���	<xd�y@d�MF�-ͮA�L�ߎOn�<7�]V��(�
䓏���'˰�)+�~�y�(L'Q7J�`��|b;fxu�"���y�e�ՔNWY���G�|\p��OI���\UQh�&�@��@� ����,2B���W�x��	�x�ڲ̺����s��d���>�??}�������t�?}��擃}z��ϳ9>��5����Y���,zv�z��E~���k��(ǩ�*�@���H3Ӹ�K��	`�TIp9���` S��r�/����k��p���E	vfK#��jcFH2�U����u�Y#ڝC�q�Wv���!��`w��78;o�ޑ�w�w��l�)���5"��Y:֞���?z�����`�]���γe��t���/��)�]ݹo��z�0Y/VFA}Q'��1����XH����PYQ����c]�����3.R3��&����o�8(t�˼�lq���K
���F��{�-�-(_N��"��'s,�o)���������!������~n��H���Wx��&�NuVh�k?�SC���끗3�N����}�`�
p}U��
�A���Ń�܏������O	ڋh����G��X7�k�ѴY�p>q�-�g�������_��A�C��*)S��﷼�bGʄ������V� q�����,r�-{#W3Bm'ȱݷ�3����/d�����s琖�=l)Y�/�R�؝��@,�� ����=�ϑ}a�|1�|���R�y�)'�C���%������/E(��_Ѕ�b�����Ra-�@�~dQ4E,x�XP��"Z�Y`NJX��Ɩ�H���`�S����\̊�>�E�B*Aj�S"v�I��Yx�$�Ϗy��P�`*���X�e�y=�	�rXK�l�R�ַ:_�Fa�n�5�Hm�������8ȣ𭏋��ӷa�S���:���@���<~|}���2Me8�8��z�x:����M�z'Y�w��C{�6���þ�~�ߜ]ow���i������4��=��K�q���#e���{��v7Yx�0�|��뿻�b�q>��%^V��A��Z�k^�^}n4X�DZ��m�\���'g@���+rg��KR�W�l�\.�IDm`��}P��+p)��c<�t��Y联m�19}�)`��VN�;R�fR�($Q�Ћ4�����w�H�[
b	�X���b�,45(v����!mV9m	7�~"ZT:�Z��Q|�.l�ow�Bs�EA0� ��s�`%�8�Ќ���0�i�h�Oқ8��͍7�f7��3��3��^�/n�O<9z4q�
!��G�O�N�U�	Zyhu�8ױ��y�[��n;oI"��!N_�Ku���(�DXd�Pr�>0?�q�\u^z;�����῎$(��2��z�Ԇ$dt����+Q�
WE��͔бE�.B�%�8{�K�4
r�޸R�|�	,-F\�wMn;�Z�ܫ|A��C�
��.��-��EĽ*���g�u���g��ͱ���R4�9mw��j
��GP�r�K��ud�K��9t\���z��{��:Nh�M�,�j9o�AԵ�U�����\\���IĜJ5^h�ͻ=
��c��)�`=s�[$�3�.��.�;16�i2Mu�4XfJ}4��Z��r��L�ײ&Qj�aH�0�?\,+a��Fi����*d#������
��ͣٔ�`E��C��$�l�~Y��@E��������BK�(3��Ìd����'�%]6�*�$�]>��g嶍D����5����ᗭ*>q�߾:X�lI��(Q�}��{�8.rom���z���E�\JY(����`����?;moX��S��W`3B��7 c"J�a_-X��/�,t��ib\b��&`T��Vv~���6ᰎ?G�uIܠM�!a���T�A@�a����!E��>(���ޓ$I?bl�t ���BЩ״��ܵ.:��'�ݣӂS�:'
�
�#<�]P���eP�&3Z�]�Ҁ˱��w%2��_��a<�,m�w�!Z�]���uh,�
��%��Xm���)��y
��I䡯.����*JT
S�m4�+b�o�9�����i�E}K��������x�����;�ʘ5�����Uj[��������v|���o�j>�.c��]�j���f����lm=.���f���V�vXX$	+65f�a:dW��������)�Ь!�PNɚ�[��Us}Z�U��UMv�u�0�H��ol��ΔA�İ��̸6���|t����
Ӛ�+;
 ��R��r�r_^�(�`-!���V�b��q6����|[j�^J�������8^�.oҌA`�e2���P�h���ܹ�n[�{&��G�dGm!�e��9���ޮ������y�*�&ͮ�L�`o���Q{���jMY#⯿B?��}B0i��ΐ$����{C�[�W5H\[��X>Ј4K�<^g��׊��A��4�)���7^�$�D�h��F�"�*�1:��ֹ�[zs��|�=�u�슚���}E>��t��7�4<uU��ʲ���GZ��<0����F�}�n�~�L���U���N+U7�	�˙*�d�p���b�O�&s<M�E��
��o9jB��~3f�k�T�1�����1�<Ǻ�^���K��%6]��y��V�“�l�\�b-���>�� ��ܘOC�]���]Ι�.���v����4�
�X�k�=�]�
&�j%\F��	��gR�b��.t����;+�l�)�}w5zPnc�i�w;{��*�R�KU0[�D�t���6�,�3x�'7%b&M������Ʋ�� w��l����·�E�+� ���0#7'���N�w,C)�s��ҥ��=����1+<���o�.��zQ�tU����r����4�)2Rh��)��[�[���X]�r���EKJ�]0@'A`\kq�ɖ�m;���p�œ>x�j]X0�/Q�}1?�����O��ڈ=��El��ف�/>8��+SR��e�����1�I�K��ը�>",*����ϰ���׉��IW�&��/i5�m�^����FI���\R�B��Wm�QJ�5!Q5s*��&C.z�p���-0".P��spm�
o
���:G�tC�Ali�ƭA�T�\�6���ߕ���X%{.V�s�N�i�.MY�����tdt�9�1��U�uc�bVnls�FfŞ/�y���_���LT��J�_�.K�� ���l�!�/��=x�%���J�s�	�D$���Ղ�y18If�?,��'6
N�OH��F^�������YH�	�=i �)��Я���7] ��iE0e5���gS�R*�KJJ;Q-u�G��8�m�+|�;@�|�rc0�-״�{��jHU���&'��
a>��� ����(����׻�te�n��["Y�UWA~M|fu��^�,��[S"m;�Z�st��l`M�Y���r��Z%�����VXC.oS�!hj)4[6b�<-"/�鐽]���W��5b1�
��r ��9���v��:�š*�^�=d(�2o]�BG�:�e�����@���>���p�˖�tghP��N���Rs�F�x��Š6�`4" <�b0�������	�a�ޏ�z�ua��I�:,9�r���x^��$)u�p��ң�&��mg��6�\����%?�y��c@�q0q�������$q��U:)��Y���a��ht�F)�Y<_��i��.!����i�]��e��(0�G�S�@�
a����V>'�����ý/=�a�Ő���F7�f��J����P�9M�4Ek2���C���o-����p4au�L?b�����,�ԡd5)��BES�L(�21A�&s�ɮD™7��n/>�u	.�V	���Oq�n�`�F!;bП�3*�2��Ƌ0�3�/�?��&=����
S�jҫ�$�$v
����+G�C�%�=��!��T*!"l�m���3
�"�W)"��+aB�pj�65T����H��d��w_�t+q�%DȊ�F5�
��r����j�R��E�
T�D1�d)�9.��!R*|�<�I��(�'�r�D��a�G�Yl�{��D1�|��g0)N�Itk2**��!Zo �,�8���P�~?}��ɚ��xm=�ӹ�Si:���hQA��g`�P��P)թ�=m&&�1�}
��*e��(�
�	��GN@���!tq��.�l�,
'ע��Uv����ԕ,QO~X쪥YY,3��v����Zq���/�<�9�v�?;A��P;_0��#�/�b�6�+̫��س�ˆ�m�X|(�@����Q�y�1�̠sk���B���4l*gD�Iq�n)KJ����Y<vk�#��	��O;�b�V������=�c�Yt�tw�zd�����I�=�ћO���ᖬ�ՔL��I����8Q�k4vfiX�J�����T�T���"a�RxSp��
T�D�h��.3�l:yy�nгZh�Q�ɳ-+E6�o���<�DjRqiu��~��mY�#�ۜ��L�5
�D7�HTK�d�)�E	��|��2VR깽/��|=�J��H�dL���0�Z\,�]��'�SI�ɷ&2l�oB�{�6*����^��Q���2��V�d�V]�� �u�O��zB]�1��۫�H��X�2��/�7���}i�#�4'���׬"J�f����^�NUX)��w�_D�ᑬ����3�)i�4u5YFqIJ�T�����9b�)Q�фH�DW�
��_O���6K	�S�E��1eJI���
x,Rs�c�u�ª ������	̥�2��Nw��=�0����OS�"^sqS�q[ܵ3f405�n���ܐJ��-��{�	�#n?5�hSÍƊĚ�(��ɛ�U�-6���QV���J�2f��ћm�ko��9�y�	�;���F�OI��Z0��k��=���v�6]����X�喽y�N�<��vY�� 	���H�Ӻ����L���a��{�,���X�q����
ƿ��[1IkXa��_������K�T�ƥL��8D�Al�?�0�(���Ko�~��_\�����@�<��|!Z�-_r�w�+��P3���>4Z���nr��#� �v����~IiX��{-��q\��smv2����R�'��$��<��E���'Haf��Y����V�`�Ӫ�����u��!۬�_�c�����/�sN��O"y��w��Y�w���?��.>���
+g�������l@v��(���{�2,�,�c�(����s[\����B�a�.�*��Je����A�}{�>���L䖣�5a:�AP�#W���lz�L�����,�����6�5���d;D�X����#4�Y ����<���i��F�hs�r�M\f��ٞ��g��t��������b�e����@�ک�d�9���|��^d�4�-����/�P�1�"�A֊y�0��B��R�Z�_
��6�'ʠ��BBM_1�ͽ�dvǺE2z����A�6U�ZpT��˽a�f���	�kq;��@��M�"�B�s�\�
�ec�z�
l��#2�	�eP/��ą��m���a�K�{�׿��7y׋`��[�m߲г*J�h,Jp���y�1(�-'Q�����"=8��}��st�X�bXJ�2ΊW8�
�w��� �Y�(����+��$��QVr9��fNH|��x���Kg�5[{~��g���k�N%���'�9t�.��b-<o�����~M�/{� ]��w�e�N"[�U����0�<NL����x�����9.�l�J`�����h�x��z�Z���Q��Z���}+�rlW֧�̰��[��7u�4Qe���70��j��P]�ʉ�_�����ג��y�\�7�q��MR����	��!�m���^�ض���a�mny|���t>O������h�7����s�����Y~��XQ&��Eq�ث�MGax#��䶈2��ڶ�(/����:�y�iG���d]�M��ȼ��B0�,�y�������7��KS�i�v\����7(u����> ˙���p0�^=���-s_��}�f0���fQ:�[P��4l��m@�����'�;���{u��5jCY'��-��?a�Q��~�7���6#U�E��D�P�$c���=kVI�X�p��J��a{͈T{h���{a�X>$Ñy5�u1��n%$�'1gǜ�cQ��m1����t��7�O��'��ӳo�#�vD�W�u��﵂�v��1|U��W�|'l7s�q2�������t�^��j���t��(w1��RCM��QZ�*�������5<���庐���z�BUu�:��#.��M�|�T�jZᏐ��hk+�k3��ҺZ
`ҿͫ��Y�5�N��PF��Z(�O���vDg�r��9�<dc�5���ð�U�r���f����0~����u�����Lx��{9s�Yck
?��k,���D��u�LP�(ϯ�,�����P��o9o�o�)�n
l��_�BFQ �aݴ�}�v��x�Lcn|����5��	�E�7��ke ��J�����hYd����0�:G�;p�f��J�O	�.*���ِ��8{�?Z&��^���,����b���f�5�~xȊ�W��|��*.��ne*�@�Mo[Q�[��{�=
�6(L������g/l��^s�8�
 �¿R��C;X��ߙGz�l;�����f8��e�D@�4['��k]�;n�F�Ƶ�0�0�&�F,m��8�ME
��~���i��Gl5�O�%�2�F�8q�h��X=�)R�����uL�u^b���TP�+L�p0��M�:ڭ�&�����o�)��M�d�����D��b�יG��Z�vh��>6����4�_�1�o�y�aV���Hr�FHn>X����	��04���u���tkF�����B�7D?�ܶ�Εܿ?���\�m�]r?����~�wa����m�*G��jrI�Y
�b��a�*h���E6���5N"|�U*J�i���(eF�	���6�KE6�`�f�6�Xu��-C{�VT�<~�ي(_�B�Y�W�lr3J'eN�u�0�!�g_�v!2�*|�3�o��P��$�jӉW~~<�(�X���������~���]χ�?����,�k@���gL�[mj�$�q�������]3������.�S�r-YK�|`V�w������Ӫ���Ul�F�Xy,|���P����2�Y���~���c���+���]�������s�ǡ3H��������p�&�jc�_�߽�%�-~i�_�kڳ��n��]9�v3׽�z����1i��g�-�����O��5��pf/M��m>�]
�Oà!߹|�u�p��{�}�㱍V�r�f\��d�Hn�(�GAՕ��Zm�u����Ub}U���򮏇e:
��Ch2&j�#hX�Ҥ!m�/�Y4�6�Sg���g�Xܦ4�}�*�U(���0�ǣɎ�U�|�@�z������{O��5PO�;a�Lb���\N��暓GZ��[�Q4بd��/�;�\�K���-��Ӓ�X��2b�3�Mn�y���G�����X#�ܯ��P����G}y��
�c\�]�Q�ڿ>��&Q�f�fjiP��`�^N�/T�2��w�]��%ߌx-��@��Q���2���ă�
��8;�;�S�mg��#b_��'�m敷�i�E��a�8qR�fu���qt���69�q��e��ˇT�#j���_��Pn�@�����jg�(Y�R ����K-�:2|�N�BJ6ӡ3Bi��;���Hy%��J�E�܋ګ�����$I`�t�2�䦰{ܻ�4Y�>!�뜲�`�~"5c�~�9ٮg5��e��l�+�c��^g\A<铬L5�e�N��`��ߵ~�Z�u-*�(�D�P��f�vI��OvR2�����uj���Tk�<�1l�#�-ڋ��v]�,�E�V�N=x��E�j,�
xd��$5�L�Z���q5̙@�*j��gwq�K��s��|c�޿�J��ʮL��כa�:=���̅����3�o�2ij˲(�&�WA��h���B���
,4���9�J�6����?�-���K{/E��U�G�?K��o�{a%^����2�b�<�����B�_|b#a���ksh��?j�~�����v�|ۙ��W'U0�c��Bi1�W�����b��J>Y�!�\���=��/Ί�2�ʼ�L�K���[^�+唔B���"�y�ǮY�)RTE'OSG3�ϩ�(7o����]��3c�X�M0����N�+ۄM�'��#J�*ܵx'5{��:Po�PKk�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�?�PKk�mW�N���-��setuptools/package_index.py�}kw�F��w�
u=lz���(�ǖ�ql�3��5D4I�I�@ɴ���o=�	4(9�=g��$��~TWW׻������ -� �+1m�u:}��E���ŲL���'��`o/_�˪	�m����[%Է��
�&_���{Ѩ�.�Z|u_��H��2��C4�j�r�G�N���O�b���iU�J�Ѭ��{�N��\z�M������lD�n)����fU�
f�bJ�
�*]�!�٬^j�~?�T�.7�T�.�^�G?�>�ۋ�o&���~3���uS嗀���_����ZM��Z������f���~�գS��iq�We��5����&�5zͿ��LL�t%�?�DU�r2˗�4y�0C?>���/�������l�/R��ɲ���0�u���Sk3�U�L�IS�E�L�O�^$�!���?�N�(�HVe%&��T�M�]L.C�boo����~:}�&�'�r�TEU�/1�������IGG�$��t~/��0����V{8P�J���w���Y88�6:�W8x@x8��O㽗�|�t���/���*�&
p��������
|�� }�xW�{A��ۓ&o�b<���
�aʁx��}{~�ݷ'��e\/���*����j�u���ae�hv����`:xLS�H���W�&���:u�
-������o�I(ח�^�����/������I�d�1�/?ӗ ������ ��˼�⽽�$].'�tF+	_2�zZd�Cȴ�(�ɬ�&p���L���tr�{��(/�֕h���tZ��9��ţ�����y��)�c���K��Y������O�M�Y�L~^n�EY���|Zo'���e��`o�l�
�Ec&3<�
o�j9?��|�-T�GN�y1+�E�c�=�21��2�z�V�^�i|�,�����*l.�l�;P3�a*�M�t�tV���5D�עu�#�?��e���F����dC�F�@
p֓�N5��0�#�q�����R���+^[��h��J,�8g�,�����벮�˥�m��!��-�kQ���	�1L4,n���V4��#��0�(��:oQ������	,��vC5���dttx�<����=ԏ�R�Qák�YF�-����W��xyj��:�?��W����Q�ʾ��%���ղ��\���[�q�.� ��%I� j�+���5BC��N��v,�8L�&*�
�p難��j;���W̐h�=kQ��/���$tx�g���X�7��aŬ�s��	I�q�R=Ó �~�����Ro7���?����z��P#�î��MQ�冴D�y&�,m�1��q���e�[�<���ZZP^���:h@�|�mY��R�#��x�����0΃��]���e�y@�E�[;*l�YMV�Ɓ�'���T��ff��=P6�^1�J
�0�q�d^��ut�Q�Q#2QL��Ѿ�qZǺ���&k��/�9R�����HYPzH�ۀ2��#%�sT�ln��Ir���9'�q
�%H��a�0�����Ff�}�s�
H�m��e>ߔ���a��J��FO�"�v��w�{�X�.�c6"��!��j��UX��~�"����ڜf�B����:֋�4YW%R����v�*�l�v�g?xZL+��t]�e�7��ȝa����>E���G��;��%�A�M��u[:
λmj� �i��yw�\Ő���b*R�T�`{p����Ρ/4>ܜ:��$ɺ�&��f��	��I�R�E2���F���̧��G��j��3b7��Rf�"�pT�q���a7���0�4P�+�*A��v���!1S�	)
�3��/y��«�8:�l9X'�i*�f{m?�BTi#�t�N��J��t�3��K�[(`������6F*ؠ�Xf���&���j
V:�pq�ƒb�ܥXp�6�@��)Ad����P�I-M�?�B�{1M�
�+���Bň6�l�t w�H]�c�d��4+j���?J���0����Շ����y��_��pD0WK)hT������
	ĚK�fC��%d�!�T��A� ���4�Rf���z�y���l�U�9l�Ȁ�%:�uaWq�*��!`sY�4P8�S
��)(�3K��HP�6�%�3�b�r>�=��K�ۈ��f ��6�2/�[])��4��ab�y�xi캁����D�6���-Z!��f��9�hr��H�������+*8/i�:fDg�5�&9��+f�V�<w�jҢɪ�oq��؇ZdHCgj+	���64�2��T�p�}��K�e���Z:G���<�D8��%X�g�C������|��n)S{Z�UZ�Et4Pj�d1*!+�_���Y��:�N������d}�l�>i7�x���jb����j���b+�"]�W�~�#W�O���J�Ȩ1�����E֚nI����x2;�0�Mo�
�_n@C���NqFv-'�F+�8j��w(a��[�*��Vs�[w﾿�oq���r��0�^�-��؀�W�Ϻ.�o��=8������]��pxt��X}1N����Z�,_<.���D�����,h�y�:W �� ;�	du����#�5
�p"]N�y�f#|
�l�h���J�l@��~R��A@��\`��!on��W�j�%�� )A(p�#kV���p�h-Y�u��6-��Ԣ�V�:�3��mIݔT1�aǎ��Ր�Fch��~�4�W1���f|�Fǖp�a�LL�LD�AQΈ{�E�o�ŃQ7x��x,A&nj�m�`悀$m��?��ё����j�|��f�b��߇򇗽7]��<*n�b�^T.Cy��Sn��h�3���$�ҩ <R3$I���t&�ȢZ,g�<�~o�SM��'�E
6A��7����[���-TH��8�<a�L�z3n O@o��ձY��3��f�J`�Q���@��(rz�(Ӻ5st�a$��%�Q�W�I����\o.A���[ĈS�F�$�aPI�K(�� g�.i�0���7Y@�Ez�+��>���_��/���<:�u�}��V�a
�����FUH36X�L�"o&�g=%�����hl��&���m"��+�u�[�nS5:g�W)	��{,���?���o;]��3~}�
�30�����4
�t��a�0��u�M�@�}���Z4�Nl���`%�$�μ�`����n�F>�Y��w-^���&��[���	�q��9����_�*�b�d8�{N���
Ճ�N�Bۀ��"�g���<�c<tm�[23��)��Y�zK���և�A�QXi`�oPf�f]����<)��A��"���^�uS���n8�4�i:���R�#D�jb>�N�z9F>k��h�Ց��E�5)+~K�l�g���^08���_-��Ah��hDl!2l�j§���3A�����N��t���(��VƯ�^AmM��� �e2�3NSNP̰h�_��Gax������#Ci����iH�@.m��NC���X�x��mvI�"��?���N:X�?�JP�Is��ӟ:=qK�?uM�$�F(Kr@,��DG���c5�( �&�r0kƤE�'�&�%=	���Ȗ��h.�K���R�
Rǐ��t{)��`����+Ri^xh;#٪�;���~�;* �ƚG4	A�+�Ki�W��A@�.$�%�y�qGe�]�YMpA�I��uX΢2q��G�'�E��$�SX���8bЁ���ǿ����,/:�Y�'��}D��"l�ug��i�A��^{�vc���
,<�Y謌��Z����uE��`�
8v5F�ec����-4J/D�6�N���׎��!@��d�O�ذ>�I�+��8r��(��0�1��S1��٧ɏo޼�\)k�4�P��x�����
ln�����%����~DӦ��s�c(�����Λ���97j�k�0���߲ޓ�E3f��I�����)�A�7;�H��8�"Eu�q��$mjX�QG۴0�60��&�{��	s$�m��Rp�bFZS%m&s�]���3`)�rA�,P�5���z�
";/��e;�&�&���i�e�n/gG'�	�ʏCʇ�+QL^�P� X��5�_�:-�~��z��j8F�˱a��<�8�C!��Y�`���r�����qʐ�bt��?���]S��4���3ZSG2��0+���k�&��`�S�>$[�L� [�6���%�[�Ѭ�y̽�(;����e��+����y
 ��Z����Ӡ��:��]r��5�a�
���ᱭ�8��5�t�c���Y2Z��@uᐋG��h=��!�5=HYli���I�*@p[z���q�DH{Q�á�5e�a��^��avc\D;�G�׊w�
۶�4�w���ߪ�/Hi��hR�\�Z�����%ؓ�y�,�Nj��'۫pL�e'�
��ֈ�ľ�e�%껌�hn�}���;O0K����������wP���9Nn���WI� ��m�@�ᣀbUwR�qk�<j��!8a�:��tA�VIC������"�#X�l��ύc4���u[��U�P��Ԫ-���B�q�F;4�&��=�i����ë������"�(�����ح.!�x�t`"Y-/��*�{uȋ:9nw-�DEZ-�nu��+�v3AP�h�tX�T'�҄$�p|)�#[�MI,���)��o��E�z>1���G?N^�>��9���}kqcp�Z��)vf0���ZB�r�y�gH@m%���ʅv�oV�4<Ώ�p����ϸt�D�y��I�Y��{�N����X9�޾�)[���K�؁(R0#�DI�a��ֱr�
��o�zؿ-��8K8�t�`��B3l/�l$J���r�26�:�*�,i�:\#W;��B�ߩTw�l�|�~W�=۝�A�	Q���d1T;�@B��(�M%(!L"�VI6l����s/E2M��aѫ��\���P�@�ot��"��U��;��DpC
q=����D��$6��5�`Ns
�w@Nܑ�t���mhtt��#���ÏZ�=P!��6�zt���͸��o�⇶}U���7:1
����V)�zs��	JW�Y�Ns��N��ʾ�ܩ�#.c��{|1�㡻�[肭YC;�D��n�R�1�o{���
z� 2�"`ٸe�UYZ8�׆S�Tcr�����d�!�֡�c�A��ɧw[;t��	�HG�
.LL`�=t�R�y�>��kuTy��S�K�ы�M�_�Iߣ'�zH��g#��ޒ�VO�V���D��v�ٝ@�k�OPL�}��lC��=�{��'����J��XC�K��g�m�A�����e�AD9�&]���RZ@2�D�G�&�kh&�9�0JYmo��KM*��0��������s��{�T�J&j<�j};v�%��,ۢK�À��˥���y=��$Pۮ`���Rf�9k��s�Uk�a��[y��.�Y)j�(��g�l�F����q"��ǜ�gʥ�`�]�Z&����f��I�Q�8��&2�j�Xi��a0���7B� ��֛���+����m=p��g���G�����|��nZ @�J��g��n	,j߉s��o��A�P��4ޑ���b'X=�S`�gPn�[�0˂��B�`d|�1+��<c�\%�+Q�m��l�b�	��Y^3��P� ]b�c�ĝ]�ɨc�UH�*eǡ
�$z:P^�o�����'aWك��QZ9u�.C���/j�!/̜O1�AJ��%�B���t���د��xe�:Gu�ET*lx��ի���`�r���b��LD�n�:��v�Q�F�r�2!��S֊���"+��qKN��E�ox�V+�倞��R���y�^%ҕ9µ��1S�H�@"tLmΚ1�n(��Z�b���;L��,�UU�D"�t�ͳS�0���������$K�LρGM�{�ӀKjR� �3����&B��v�v�S��4��X1j��������3t�C�N'���Q/���о� ��t���>��_�rqa�)��dtpȬ�2�8��XqD���*>b���&�"d�W��&�#Ey"��ē҅V�A�+W3y[��F>�S�;��+X�/.��FPG8�	�a`;+IN!�X�9��)~�`�E�����7
�+��tqA�c��o��m�S���6�Ũ֦xש�3�ڭ�`�\bv,7�t#?fz��x�nؕ!�Gε�$U�;Y�M]�̒X��)��H�r��0`H�7��I�
����]���n%�`:��H#sr@㦘.�2T�tf�
:���;�b�7���AS��\�g��
s�=�y�L�:*�r�T�jA9�n�e��ݳk�yU�nf��+�< nD�Lܨ�)Ld��
}B�)�;$�43�wN	=�>�S�IՇ�f��*E��H7W��.F.����p碘�Y��g3y?�Ҏ��-5�
��4������^���ԍ�v���pX�ߧ�a3];�[�m!�D�r�_���� TlC%|�Y��nz'i�ݜQ�l�١h�~ �7��T�j�y�	�xn�����,ד�}�	q�Ȭ4kW�� �4v�K֛��ۄ���6K��%n����K~�?+$)�ݫ�`P�᳅@E3ErB��\'�l��PMk���P��+�2��%kÄ�����*��'K�c+g�v��̱[H��EG^�v���R�"D����_(%���]�k�\��l^6
ꫨ�#���Bkrx%_�M�:�֐��Wq��e�T���)�נe��3�L�M�۩�Z2��~�]�b��R��{[,U���=�E2�}�DN4E��*J
T�"��ה&����>Ȁ�X�$o�e�)�夫�KW9�TG;�3K������ȑ7�J�1a�8��0���o�S��!W��X��C�Nm66=���J���*�|�ΰ�d{-a24 ���'X;�c�⩎�z�]�T�F����(�z�6���5D��
]L��8�l�(Y�����U�a�y[�����o#��,�0�3j#�'�C���{�!؏[`�J�ь�IR��|�tlj��_����������c��m��H3�m��W_?��g_-�R�@{"$RA��%,E���RϰC�w�j��_��Y��ހ�[-�Ä�w��H�)�K�(�P8;�e��6���cÀe��cDR�r���Y0�)���߫����JX�#��[�,��O��
�/
S�j�s�Zں/|&5�F�h�=�0�7��?>}�����7����d�k����ߊ
�HQSyR;þ@Y�
��˼�J7�,�DI3�Y�e�1b)c�R)ǖ_�um�`ao���xȡ�Wc��3�n؞aG4XhgA8G�
C�� ��Yf�k�`dž��U1Uƹ{�݋����x�9mY�R|��iZ��Z4٬m�8U7.��n�8�Ժ.��s��vԫ�ȃ�ud�����V��螫t�?aއ�|:`�]�����2��\�Q�3w>L��m�J����I�U�ۭchM�$��`}���zSF��GlӣW��i���z��F�8�6.R{r���B�,�[rR~5�����*o<E�3h��.�	�N'>�T4�N5�E1�;�Q/1�V���T�q�w<��!>;<��g�yo9N��;�Y��U����u7�+�nZy�K��[��ѕ=��.���t\�,if��Ȕ7ޏ�ڲ�^��I��D�a*�q�"�v�g0Pk��L�:Q��
�f�sk}��l����u���a'Tz�k6�? [��CMB�Z���zZ��F�R��֚Xr-'TϢ�$�q𗣿[9�Z=jJ�v�bn��!V�[����@_�U�x6�ʅ�~��t��]d&ѕQ:�z�s1��od�?�J��vߢ�c�%�Z��p�/�ؔ��/�U\�g�_�N&Z
kF������`��C�A�-^k�]-��at�F�@]�
�7�G	�ϭO������י��2�i���9��ھ�����“V"�J?PC�'�F�=m%�W�(�n���)|·�q�0b��	�/Y�5�u?�lJ��B�KX��%���/�1ރM�]*����6}m1Ջe�

5�������bU}���	��{��Z�y=�y>�()Ͱ��@�}����V+UN�RF�aI�Q�ª��z(Z4*�n	=��q��X�z�x���*�k-�dž���d;\\�'pq�	H�EdR��~L�lKd��x%O�H��W��]���Q�L�
7g`�Di5���y�U�i��� ��+]6�4��$�yeFH� Բǒ/��j��/�<�h�= ���g��
�T]�	~��*��Gr�g�Om�>�^7i������?���G���C{)X�YP�tS3	�,��5)e�$�@���ޅ��Fџ*�4�o�c�������F���1��k��z#�*��p@��⬐x�z�-*�Js�B;��"1澧?�9�IB�2���<�S ~�)(����$��O���O�p��#�L&�'2���8y����.:O��o����{�������[���7Y^�e��0.
����e���PIE����"����r����� h�*E�F����o>xt���-�s_�o9�b~ۥP!	�ݚqǸy�X_Y���]ܪY%�y���Ykʹ&�I�/XV��o�Z��Ɣ���]g�@f1��\�-qc���)��Ɣp2���o�S^�A���q���R.o��-<t�?q���2s�,-)�Qx���FK���h���"�\$��\�K�*��'Gs@�;��o��v�Qp~/��UN�����0I>��}��;wO��U}�y��[=���=CS��T��ԋ-/���o]d�J��x�´Ap�U��]�^=,� ���s�ԛ5����a1us���-�i��~�
U%S�~���!��J�J��Sl��@���0��N�[YK����N�X�\weԉz+�w��i�ˠźR
Xw�e���!ռ�g��s�ŝp��A�l��ʁ�4�,�}�Ƃ�R9���f���g���z��Uj��T�x4o���f�'f�ؚ�Yu
SbC�D�Q�8F#�CX���e���+�=>�,x Ro/�}c¢���I�&.`�T��O�CM���k��rS9���l�>��G������>��S�������%d��
�"�;4��i����jZ3�M*q5�]�X�=f1�?t�wyO��*N���ܚ:'^�yL����`�oK%&��f:*N3�j�[�)};\̮�p���Y�N�n巡�ĵ�����	�@}��K��L1�� �#0/ډ]P{�E#6\��k:���[tXƉ΅�`͂]!�E�-I�U��sl̀�b~�a1}G�_6�h:�sJ��e�f]X>R����,�Q[�M��x�G����8�w�{5���-@�}�>̭oVk�?��b���Fw��C4o���h�����6k$���@�?F0\�@�]�\Y�sY�.���[Ugz�SooRvo��)ϲ����L��~�#.X6��9�.��=�F)�8�W�R��mo�<���B|H[mLy1���_�d�g����zT��h?���g�t4{8zr~/����ur2�o_&0tSo��W��\IL\/��v��!ﴊ0�	�g+D�\��˪�՘�u�t����77I�J�7�$�D<x��~K���)ToYH�UƄ����8�<��.�6�{ ���?�������������[�e��R$NͶF��	'
�죞4�J�\���/cI��Y�M�k��2���L�D~�n�.C�i�gs���L���jSL�~4��7¹kI]��Ž�&��3��+�2��Z�J��:�^a���ҋ�޼���D��9�����CeT�R����/��/��x���'�_dW�����g��F���3R!z�e��ȭ���0]�.� Dx	�@Ak]&� ���=:��*::��H{1z,�2���I�Q��F$#����20��~+U27ݹ��X��0�`��L��̴��'�_ݗ���T*u���#�Ȫ����
���VU�>����4��(اi�jV��_����@�Ё�dy��;'���*)�l�K�zӡ�MSj�a��k��U�3��m��1��@���:�t&�=�
��'1މ�pq}r'ҋ�(�w4oھ|��,f�<��?D�U�*��_��6C��SK�Eސ5��A�����v��q��iC�c�Ŷ���ID���p��o\�u����s������m�8m�L��:-2rD��M	�pk��}�Z&٤>�އuUd�V��|p�&f1mlւ�ZsV�n�ӡ>kM9mڙ�\�h*�e19d����h*O9zl�9VNw��#d�=^�>���p�ɔ�0ܿ�V��Kݞ�.aasK��0[��Z�%��;��C=��.F�u��+N
$���}X�Z�X�t�5<�k'TJ�408�ox�X%�.��9WE[�ԭ�B��Ik$�Mlh�iMk
O�ݳ��M7����y��U����%�Zw��(3/�X�HJ��@��JP���:ojѲ��dv���o����^CS��=���M���qt���O_�����J�x��r+˭�K��o\9Vk���	EY(
�#|e���y�1L@[	N�C�O����H�7�g|W+�#���,�'�(A�e�i�
\ϺT��} FvbD�c[��I�0�3?�K�r.��a���юoU���FŀA�Vڼ���N���)�)� H�4�Yw��A��8	���c������(�D�*�]U!�[�
�+�;�{�v+ �X��~oH��|��Y�K	7�f|�iB��aKB�'�\_�Tv�1��ܷ���M�b!L�mS�p*1v8�kb\gh�R�̔���UK�J�Q�@#;�<�[y,���{��I����L>�\��b�IV�.���U]h���6(fk�k�)����4��5R����/l���H7��N:��	���;l_;���h� pK��%Jrr�0�|�c��OR�r�D~:*R��Vv#B�<-��+�)�rWe�j����p�uWnjO�v�L^�x��7�7O:}�M��g���3�,wbý������Le��WT��*&7�~��j����ܗ')4+�Ʃ�?�)Tגߖ�W>�y׊�R%��_�\�k(fr��b{�~I�s�P���� k�"�s�-1���w�uOd/Y�i;vČʈ�Jc�ܴp�f𶄕�z�I���e�m��=I,ίN�+���Pͨ�A�A@�ꀚ��p�
�Tu>�B0|�qf��a��CO��D؃oP=��H��`�cM�)��'��_���o�y��(�a�����ctØM�/�p��0Xa�&zA����0���#{[��j���X4(�Po*n^[&Uk�8���{=�Ǵ֐K����)^����5������I�bG�l}y١
��c�&���PKk�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�PKk�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�PK1xU����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����~�!&_PK1xU�3��j�setuptools/script.tmplSVpu���q���
v��RP�(.HM�,�2��2J��sS5����RK3�R���l��♹�E%�����@U��Eɩ��zE�y�S4��*���PKk�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?PKk�mWH�Lbe�setuptools/version.pym�K
�0D�9EwՍ\z����MIR?�����<�L�����(��e$0�Zp%�;�����Z�L�SP�0d+J�,'c^���;:GJ���;�9.����PKk�mWV�z�	� setuptools/wheel.py��s۶�w�8e9���K��.��z���ڸ�4�ܭ�J�,���my��}�=$ARJ��.1	������;!
�tSו2|>��fr��L�3Y�i�2UUhP�Ou��}���?P�?=�z+��uS�FܛB�g����,��4F��́]��Ef��ڷ��7ש�j�F���0Mm�"z�'WgJ��V(-���ux���u��ɮey�Mvݢ�N��X��G�deU�MV����^��7�~��9�ש,��ǼS`hP�F*�����f'oEڷXڔ(J��V�O���?W���ˋ�+�� ���g>
\���Y��ObcH�����:s}�!�ߜ'���ͺ�E�Γs:�޼�l-��M:!b�~�+�B,�8��[���/�����f7���^]��J῟.^��W��ނ*c��V�4����Q�s�)2e���4"N�9M�%��,[f�k�Is�,���D?���խ`T;�8r��G�𑙊}tH��rQ#��	��
Ł��Ww�y���l��]��d	9�ﲢ��	�ݬ�t$��(�oܒ�8-
2�"ՖEG�H�M�ާJ��m���#P���I6B`e��6d�P��P:���"���(0ZfD�M�$ɗ˝���eeeZqRi�H��G�9d��T��
\������BYf�b1�j�u��VMI/��.���pO��U]m��V�>�L,DV65��������\�U��$���ş����S��C��{���]E�	�![C!�ژ	�c�[�}+0�3%��gTJ-8��n��fQ]ӷ:�9D
�s����A-�U%���xsi
lԡS� E�[����}5�CPo(KZ3�Og3�-�RVJ,dZ��=SM���]g����g�)5��J�ʤ�]V4b�T��H��еrv�2$��=V{����$���c�?i~�`�H$�VUS�rc�C�۷N�h�����Ig%���M	��ϘpԵ�A9^��'��y}��� �L��.��n������zw���i�G�bR��NB���:�
�}�
�4u�8Юfw����M��r��*�}�[���_��džK�TU���N66��2�������^0:��q��������,(Y�Y�E�$8<Q���3Q��z�����'�A�g������c���k�rɢ�<DFm��`���y�Q¾e�F����%���ː��ޏ���ӕ��D̪-�qD>���X���=��^�ׂ���P{d�k+���Yl	�����\�����o�l��^���H�	%\�LKku}��Ѡ�%ǫ��a�7eW`�I����}�S{�`�����"�t
�v~�
x���ɱ�4�
��IPר�݀�K�/�+!m�N���vX�"�7�����˾P�A�Rd�V=�g�5v������IH�,��a�<l�yf2ˊ�#2�h��5m8MNh�^�<{u����3%: �I���!H4m�V�E�z�w�=�&�@
]I���B�!�V�w�Qj�X��MF�U���aW��/�za�
]Kf0u��U-ʸ�<nh�ۤ����̾��ũ��i:�c��\�Qc�g��#��t-��RA�+���&&�=�S����@���3��wbs�߁���U�8x�ex���1#�)����Q�C;R��A�hF��'P��-��
�ʟ��IO�`4�z�Y~f2y#:Vq��`p����7��7�[<t0L�z�`7+G";�M֚}�D}����a�B�m8�:iQm��s:P/�2�t�{Z��kMsY�)V�&�����װ!�p�ݢ�+M���v+7MA�rņ��5v��QFJ���PU�3�w6/d���`�f�]`Јf@�(�D*��˸�
j�p+1x����T*� j�5�>��i��gu�xYrb�N�j�
�	���O�o���ypnw���c�����%|�a�1�,�=xC���xK��^-���ᦽ��Au��u�������}���O��/&�]ͦ./{����p����Uv\�wIaT,��|Rj�'.\Z����X��4{�kn��������s��7�fH���SSg��|N���2����e��[��r�D�{���pbk�R��Ji���mH4��u������M�6���'�r������a2.`񃻑Ēi�O���G�@�����|�h;
V.�*j���A�b�{>by���_d��W�����l�Z�<��_v��&��ә�)�S����j.,Չ���GiO���0g�$�У��ǿ��Q�E�O��0��D;�L>�6�e"�h)�����	>֍�\�#L��n��?0��Ň'�t@tl��%��lz�1��b�+�cL[�O�<F��h�=��M�Э}��u���`�=��i�����
���z�)���ǀ!1��,�R2��N��小[�=�WPEY����A��訣Z�לf�x��d�?PKk�mW��qou�setuptools/windows_support.pyuR�j�@��+�^LD�P� TQ� Z��1�dR��tw���w��V��eg��޼���B��O���a!F�3�\y��g3�x`�
ЇE�H[�abZ�4��"4+Xq$R&9�~�}h��S���:�Eԇ��h\�&���u��ʁ��E,F3��p��h4�{�t�"�H�}FB'P�@H�Ā�<�FɚJ���(�;�"?8�o�Q,r;��"&�r�/Ϯ����+� ����D��V�2�s���x^U�<�Y�m��2hZ����v�`�0��#J�qϵ���
��p�p#U��z�j�����j�����Рj��r~�l>��j6��L���x<YhF��q���u~�^�j�1ߪw�*�W��3���{)�4-�PKk�mWr�7��g!setuptools/_distutils/__init__.pyUPMK�@�ϯ졻 =x<z�*އi'ڰ�ɐ���mwʂ!�G���Aca1�EUXC��9�g%�����u�{�-A�lE���s�dyt���S�ox��B��#��JG�i9�1��􋛦�;�L,-��'����Hj�Q��}����{hw��@
�����0^H��m@�3	����Ӂ�aR�*v}C[�9N	����uﭲ^�?=��K��K}E	��PKk�mW��`a�%setuptools/_distutils/_collections.py�X[o�6~ϯ �˅,����6��n@��%(Z�b����T2���w�k�6#Q,��/���^�,UܙKES�ޘ�[�^�т����س������ >I+s�
����Evq���9��{/��I��O�Z3�ͳ_d]��vy}&�y��	��^8��;���j��K/�j/��"�#�ŽqjD���[}񢶪PVU�ހX	X�3�y��uԷ�{C�������e�“�2��cޛ�\|�����F�h�TU›A�՘#��O�]W˓ؔ�����R�׼Hĩ�ix�� �m�+��0�M��
1IX�%�ۜ(��ٳ�I��+<�H�1����(�:���#��$Ʒ��T��{BW�fl-٩Bl6�3�M�TYĪ�=��`uA6&�h�򍭸��s�}Y���ʨߘSnK��1��0V�d�X�,�J_ԕ
��"V����ݪ;e��%��!��倕>� y2�xĻ7 ��*5��'u|c��	�̦o�lP�n�Nn*�P���^����0���0T�&|��(��lKb�8*_A�W���V���G��a�qU��J��'���8?E�f�ۚ��9ΟD,!7c1o��l�tÝ,�t,�I�v��t�vb{$Jf���A�|�0j�P�����ٔ(bh��[A`�2v��ld�E/�>(�`#�I�ڦ=2���y^f�X+��"
��m�\���[��p����H;���| ��ƭ‚C=���#�⃐�*v8���TF_Ӷ�n"ذ�ք��_8�[%��{Y�~�N\���
�A(�|���o�acQ�]1|���/���a)�S���{�W�{曋���撟W�|���|�,`��<b���S�(J5�78�7M��g8-J��S����Ўj��H%�A��)l�^K:�h�8�fQ��2^�YL��{d�k���YPm�T0��ѡOZ�� ��@8�S#��Q�\W�jWB�P�47�	���s�Q���\0k��:�����%���М$���� jK�Hr0�ܪ\U�$�FCK�,-�B�8{�4����*���x7B�bg�[���J'�a�(�$����$�Y/@�Ԇ2�>G98tr�:%�$�7�t} ĠFD7MI��h�سD��:�@��9�&t��J��F���Ccy�5�A�"�,L�_}9e�=z��#��ԧ�E��ȯ*��K&4s�x[����EΈMHL�Bv��/b?U���'�,�<�E$]�Ĵ��i]��H
��?��W����GHY>ZJ�
�C��IE ���y��-kk�?��8e��i�R��4><�/�N�J�n�q��9{�'��C��Ĕj2�f�b�іV����1���	���x��ͮs�����S�x(,]2Q真�دVi'�Gozƛ
��Ɣq�OnL����Y
����4��12OFu�>`��ȑq�7��U��PO�Z+��vçK�PTtwކX1sw��"�hw�gfn3w�I)�}��;#:�_��W���y�g�8������#�J�:Yo�v������x���dS��@<h�TT�!tζ1�f]�8-�p]C Ʒ5�W�j��s\��A�Hb���۴��*C�{-ˤDži]���pcL
Mx��‚��m"Ǭq��f�)h�|�3���Z;�2j̮�C8�OS1K�OL�Χ�;`P�U�X��~��c.�NZ�c��{ɂ	����[����_�ITn�<���{���h3H�7P�L�!Á���PKk�mW�O���#setuptools/_distutils/_functools.pyuP�n�0�g�^�.j��vG*�ڒ@2H?��l8R���D���4�1�Oi��%;�aG�4<���Ȗ�St�b��A��i�A6W6pB���`���.��>K�!� 0�����qD��,�G�G���[]�g�B�>�Q�~�Y��=�p+�y
S!
��쨫.O8Z��r�o�m����'Ѩ*uG��ɕb����VK��&m~PKk�mW=&-$+setuptools/_distutils/_log.py��-�/*Q��OO��K����la|��� 3�HC�PKk�mW]�;F��&setuptools/_distutils/_macos_compat.pyu�A
� E�9Ev�0��El�!�Ue�ۏ��P��&�O���T2W�S��+�
�\�bE̖S���:Z���h�%����x�n����hkȜPkT��v5��0���e(��k�O�d9��r�j^�A�Q��Ϸ�PKk�mW7��8�L&setuptools/_distutils/_msvccompiler.py�<ks�8��+pteI%2��#3�+߮#+�ر�V����X	I�)RK��u����n$@R�3;[���G���o�r'NDY�I*�`%n�(_�����8��0�;�|?��3���)_q�.�<c���K�™(�0*Y=�Ei(�`��4��\��OD�첬�$g�<�?La�*����D0�@���]R.�KK�,
K^�췼b�2O��/�h�D�^�EI��i���B��%k�D2�tP�Ow��q���Hʒgl�a�(6�|��б�c�E>�5^q�.AN��*�
Oq�2gq�B6��`�p
0" ���*�x�ȫŒ�Z��Vl�0���1�d���#"1^08���Ɋ��`��緜�w�Ͱ�0��B�l]�uK����4�閻���zD�!�D����0��kf��C��iڤ(�b�?60
8ɀ�`^�+�s t�G��^M�yDFv�9�����Si��$3�[v���ҵ��
X�,r�|��/Ԍ �z0|T���n]�2X+��	�C��iMd�WY9b>g
Gp�y�O �>7|���5�~�ɽW��z�2�-89����7�o'#kX�\�v¾��k]�]ꪔ��/�/?����JʁZ����cFˇ�/���>7����G|]��KbC0Џ��Zx�2�g��6dy���<v�����U���y�G�w@]3��@����1N
h���O ����#	�����6B?�#v!d�_6[3ɪ�0���X2�&n�~fo��d�nI�q�z�����?�=>XХ��œ(
��{i :j�%@�<��һ;c�'5�M7knjv�A{�d�t"Uj�9`/���k'�!�#F�&�m�4Y�K������|�M�y�!�6�Y�SmQ�%��$��oмߊ�%���%��s�d�e��(�s��x��Ѝ;R��Ejf�x9P���6Ob��G]�$ݰhf\�WY��J���d�p$�d��LP� MZ���6����0ICp�#�-���qS���@i�%�<�53%Ny��b˳ۤ�3l����W���
�ǗCg�й?0LY�d.-�������H?0��-��yU���6�W)�z�1O2�WF�s��Ct+���Ӂ7u��]�D��u��-x�AT{���*����M��O>f�<����|�&���w[����6}�J2(�<G�� ���ŧ��k�+Ϣ#�g5��d�q�@��D&�>6�=�[y�t�I���7e�%�wY��#��6q�4*�$	?�0��HV�I�������4nd޶�����6Z��,�'����|2�g�Ż����	��&����7�[�p������^���٭r��0|nY�۰�Yå@�y���a�u������>����mT����WSs�������zTî���˾�d��`V�M%3�m��|9��y��6Z
=Ɵ��m	������^��̲$e
�Q��q�ۡ'�F[��08d0�m����9:�����\�.'���/NW�?Ad姘Ҁ��@\�+Dr���{%���WG,0��+�&/�~�0|K.�9�2�|pٔ������<���h����E�T���O5���_��/]�����X�rzt�nj���l��V�|��˔�#m4݂�w-������"G�<h�%y��1u�H��!#膈��f|�,�-��>]Q�b~���/M Z�EI����C��$VU�u���Bՠ��IE��B�-��,���4��5�zJ'��_F�E<	�ZC*d�	��Ql'�m�������0������C h=K𰈖5F�Y��o�A�?�6�D<*s\_E~�|~8}Ôb		�R$��O�e�m��9�]^��zL8yZ�*F-�a���M��eH&�D|_�t����(M�#B�!���Eb���.�Ե�T��D�0
i���r��J��|-��f��h��gm�����[G�іp��<k%]��yfI�=��v	��Sְ��7�|)�������)õ�����.܀ۀpQ�"��p��Bf�(a;�D�%$�w?HqS�����$��*�Aer����vgIɨz�˘•���M���ߴ�h�m�:x1{�U=+0b�g�4��vZ�R���h�8�"`-��Q%���*���;栒ȭN�!�Dl(%[r�P���k]��E|�c�]�
JHҁI.�;݁
������N���bQ���P�aC��\
�b�����O7
T�cJ���4hlXH�ͪ��UT`�T�6�%!M�M�:���<l@��Nt7�M
ۂ2n 廑U���y���@\N�]� H!ц��4�O"
�}#�N�r�PRk@�I���r�p��@9Úf�Ϛ��Er�2�eȼ��l���JĒ���`�(�dL���� ��p���v�{����ng�����]t!5�U�s������=�/���Аb�|��80.�nk'�CɏQ#�����M���ڴ<k�!M*�-.u峏�.h�]O="���#�E�X��{F�iځ��6� ��U��O��HR:(�}�,��'x:aR1z�|��b@~�pm���� ���&��Ԥ����
�]�|
0i�a*��;C�v��1Ũ�ֽTB
��AJ��0*��I����vXr�,��xQ*��~ؠR{p|.����)�?��*{�x�Y��h����9
!6
�{��RE�UCQ�\#�)�N��1PP�I���6���0�FW��_�:����b6����*[@�u#`͖(�w�Q�����Lvq(}�w���^m�(�iDH� �"KL�}���(��[2 ѕnF.�k�1�£�f�K<Y;F2Eю��D�l�éQ��%�|&�r����~TdD�츥�=��t
`sgw����r�t*�TV��^m�ٮ)*1��Lq��T�Ydm�`����
�u�	L�W��ypݬ'�M{oU�d�̼q��­v.���s�cj�8鷙�?�|�H��Ak�NLM���T��W��d5�(�K�D:QJuc�I�C��g��l{pʬ=~���NY�Q��ʰ��v`AX� ��V.�([�/h����:�>�m;,�$������7 �I���������*�T��
��}����vO~�P��rv}���%Чe�Q"�s2��[�"�3H�r��<�9����7��÷����w�h������Ƚ<3�"B�ԥY��|w�N��m�H:M�e��(P����i<O�E����������d��5�L�?�ݩ
m�@�C|�_�;9�0N�35�T}'6�=~=���ON_M�F�G/T<�7�A멅�WB��hg�j�ڼ�:;�Y훭c���[�V=���j��B��3s�m��4��°�/��_'�w��W'Yd�w�c�k���Ӣ�۷)��7�������'�i?�r������G�)�_�sr�����-���?D?9_��C@�[�g�bG�����C^`�3�ݯ|TZ����\#�J#Y�|����6Ou*kO�Fٳ�1VA�_�!C)稕��l��j�v���*��!G����>���<-DɣL&)k:V!�
[�f��")8x�4E@��~{���E���5�b�����E��[�F"���$��up,@ ցf����H�ddqaT�T�=jQW��x;�*����.����c�o�=��ca��q��ru�;�׈���E���ڜ��\��h����1HF��1U�}F��;�H�g����`'���
�W0�����&d�u��g���g�n��QQ^.)���<��S�s�M�T���=��`h�B�
���ty8��<ō��U		aV\YN�>~�J�$	Z�mR�[��4b]�$*l+�v����֯��}H;0�"�������+rI�\<L�N���c�1���
�>ܔ��D�s$d�3p��K���.�T}
04���U�ƨ��z����i��-zdYF1oL{0��W���_}��c�S�1q���g8s��.�J�RY*��Q�q��4
u6��β���\��[KÛ%���V�d�J�gI��Y��#[�$�i�������w�0���
X��*$�5�ʆق���[��e\}�'����b%R�k����&_3z h��MѺ�2�ؒa!�$`t�e���ǥ�"|C�.�b{pm
J��U�w����4Ҏ��o�E��AX��wG��R��B]<2z�>x�&�7ib���Y�5�!53���:�C��
zy:�{���	@�x�����:�h]�>�C؎�$�KPB:w��T*�׮�uW�;Gt܁�]4 ��O�_���0����
(ؕ��?�b�ڽ�c��v�A�M0:y#�;n�=�!��k��=�T�i��-B�c�Fv�k��Z6��E;?UA���Ad_�9�mRy�V����y����ٚr?A
v���J���V%i�k�'�����^�X�l���G
t�۽H7���Il�d1�{
�u5
Oڕb�\�{g�.J�=���[��@���Wv��{9�
�p��eQm�޺��>��D8��Y&,�]ME����L��_O�SA�IgǮ�3nC�^#eO�n��ƠC��e����n)�(-�hȨ�i1�&��(�H�P��}�WGQ�0�C�=����j����:EXA�W�VG�f��E�?�h�`Pj���|-�^�?#kKF��0�n�c���
��F��ߕ�9>Vw�ț���/	�;3}��}�}R�����w`��s�֛��fǗ�2jxh_Gm6�x}�fJ�ط^��]�5Pk�Q�_��Xg+W�
a�c|��*�]9{�_��.��T�ج(�xa�VqY��ॵdw�C#��٬g���j�J;�J!���]��
FG������_�I�l�i��v�{}x�[A ��R�j\B&��!^�����2����2M<"��aC	������Ә;��kA�L�]��w#�}��|���*��J�pu&�GK�����?���!����47ZScܟJ�V^=o�mTK�i�R���iȨ	?�s��z��N'��^{F�o1��Ş�!�%�Ӹ��1JQ�L���	��foE�q�=���{����]}�I9ڭ���XN�#
�Jm{�]���1GZ��!�D�5C�+"M�K�f��ƚ�w����Ez�h.D�R���j&�E���r`\�j�#�b�0MgatH�x��H���}}Cm���vYk����׍��o�Op���0궔|��ƭ&]b���/�o�w�}��:ܫIe_39����Z� 0������V�٦|W�s�
DM��^�
����/�X��	�+YV��`Y��?
3bU&�9O�?ɋ�K��/c���*\�"x���yhĶu�$�)�{]J�k�;o��Fũ20�@�xs�1V:*z-����[����_T �x@�X4Ҩ~�EF��k��R��x�sr�Z��4?�c�ﴤ�ŗ]� n�!n[�����;�-�NA�x
	�+�
 ?��z�e�J4/θ�8xX�d�����7����q������
����.�7�OMh@=���}�Չ;uC|�G�4��3��`C�F9�]�-䠱Km��ǡ
4��i�i��yF]�|�o:��T���-zW�y2�S���x_�05���y��7$�(>�߽0Ե��� ��#$�>cN��Hc���l�k����$v�k�Y�ǹ'��L�nȖ���~���]Ԧ�Aп���5^�Hbd7�ӑ{
��S<Cs)��s�T�PKk�mW��GJq
|!%setuptools/_distutils/archive_util.py�YY��F~��a�Lh�q�v=x�1v�G���ْz�"69y�}��OJ�xX=HduuU�W�8�+��q��*x_n�X�[��r8��ؔ�l��m��^�A6f����b��k��ϲӃy4l��T��]�a۲"��(���FU�����I��8��5ꠢh����"���vE��}�z��g�϶Q��W8.o�����f������LT�'�ع�mLJ��\���N�c 4�w���n����;+�]�䟒��]@j��-�Ě-ax��U
3"�+�`ދa��9����D�/};v����9�=e��4�5�]S�OOd5|w��I5��g�i�h�(�7q4�lr4A 3�v�A/�~q��e<o����aF%�9�����B�v��[�4!�ҚWb��B#ge�뀔Z���8gw�_�J,����~l��7�_ �\�=G�ޯ1�0pڵJ�U}p�E�1�2��	r�MDcS���$V���􀥑�ݨ�L�	�������,^��?����v<��6�[0��)�� �
�@	�C�7��aض
��x�!H�\�b	)���
v�7UlhQ	n����� ��)��)������(�`Wk:�o�d%�gQ�r�{�]�JԬ�(�1��ҎC7��v}ؘ}'W�20�;����l��;��%��5\+�̃h�)��
�X}&�`���gF(���(���y�~�Y��8�O�ܓ�Mr?J��?������Z
#����{��/�m'��*���>`[_˯��ِl�)����k�1wr�%�x��]�/�L�bG�f5�v��x�q�f	K$��"nG��Cm�[qPi�.�`��z��R7CG����I�;T�F��
�B�4�
S:h!6���@�`�R���+p��49Q�O�P"GoB��THΩq�\��U�"n��iH*�)�f�d�B7Y7D?0D�Kk�&�TZ�n0@���׬j�j0.P��,��Y�i�ڱ�7�Y%�ù+����6~A%��nQ���$FV���	f�#����\�{~���`����Z�����&���J�(�����	z^h΅=���D39|p����E��8M]���q��^�J��l�SC��p����(k��S�wAz�ov跓hY�GB�4�Z8
%��ߘ7��/����OtZ�pE/�M��Nw��>vn��6ڧ1;	Yo��i��(,]Rm/�_$S��;t�k��#=���_��<['Sz~;U )l��G�y$B¹�x�L���"�9�]�A5������NP����Sl@
�{j�3b��@��D��F����][�@0���w\�|U��i(Ů �?]��]1u�Ktp�l��x�[����L	4-�L��D���@m���@�q�/I5SSxC�K�sh]bZ���YZ tt�ic=t1����@5[Y��D(�J{,5	4�&�!��Ŏ~�{6�X�'%��l�Y�����v���8:�Zu�]Ǻ~�[�}��<��L;=�)�'��Ǐ����ڶ#��ؔ�Rm!���z�
�«zuDšyj�6���U\L�i�v*��Q,����M	��UK���Eo�a]<��4qaba
�yb<!�� ��'�V�l��T�F���M���NF�N�4�.օ�ęl�BC-u�VU��!����dQ�ݳ�?'��Tpa���$����g�3e��<����ջ�˷����WLf���r'f���� ��~z�&0~��(H���<$6(r��t%~0�1ZE��k7ɇ�ne�*��^c�,��D��r��gWz�	<$>��"ଉ��rW�*��@�=�o��ټ�k�vj����6���@�s�6}����s�#�{@7�9�O*�N$�y��n��%�v�4E�޿��կ�˷?��ǫ?��T�X�^�4����:�x���\l�K�)�g��ܴ�EH�DI?Α�)�����y
�L�<Tv�-G�����y��n�!�J�!�]����r+�ۥ�X��A���Qu���h�MרHt��6�涁��@ns�
u(���x��Md�11�+;�s�̬i9�4@������=���V"ح���0!�β_=���W��4��i��p��|�?�L�c��tbe�{۱+y��i�P9��fĿF�g��\�R#�-}��u�������@�X�fc���.^}6����=Z٭Q�ǛD�C��ʖh�W�Z����IQ�=�>t�$�[n�ޖ
�pZ	PAL�`!�"��[�=�=@J�l�ԛ�F�K]q��D�gj����G%(F�t�t[VR�ǁ鋉���﹬Z��L�Ht@�)�4x�
ݭ8���2���h��l�._��r��ho�(}�o�i��8��r_�[u#xN3[�Y+�w��f��j����f��i'�7����G_�K����n.3�Y`��.�\��I�ԡn&��z��Em}��y2��	��ѹċ6e�k={cB�ܿ|�M��d����	e�~5z��9���K�L�-z��n<��5|�!X�h�b'�n��-�YoNz�v^;������8P����w�i��i��?���t��[���@6�`~:��P�PKk�mW*/-�!�9%setuptools/_distutils/bcppcompiler.py�[mo����_�9! ��ή��*��Q� ����ܻۈo�:]���>3�˗%�l7�>Hw�����3�;Z,��MۨL�6IU%e^�L��e�Ī�⛲��"����"B�U&s�!�*QnE��"�覎�Ft�E��Z_l˚XZ��3�Z],���K�n��Oxs���?��B�E$6����"W�j��8�~L:z���2m1�k�*v<>U�L���fGQ��L�=�b���:��*�T��1�������z�D����x��m�|��V%6�9Hɬi;�f�R_��.sYR�}�f�Ъiy(��-d	�m�lb'9xH�И�^�;�~%���wo�_\\@^e݈R�O��.�_}q���\�d]�5˕ކ?ߺ3�$�W4 ����k�}+_*
l���]�;��=;Y��ZVu�H��e�b'n1fM����Z5rM��TV��<���:+w�9>B<N+�`6��\r�X�
@��3�ؔ8OQ��������m��r%�fp�tmQE+6�� �YO��C;������U��S:,��Zm�Dz�y~�����9���I�ₑ%��}��I6�d��6�-P⤖�4@�q�k�f�F���
�T�9���$���[UU�ѽ�w��K�#��XIq#:����?��Z�q��B� YnYA�R�"h`��J���W[��Jv����xOB$�]K`�m�M&u��'�	X����J�nz�ZR�,t��F(^��ٸ>
cИ[Ҿ� �ɫdd�V��{Vy��PF����	��%?�i�Qӱ�G$!�@4��'6��O��1K�i������Z=�Ҹ�EXH�v�$ȴ0��V�B���@%��
��-��:�h��f{z#�U��WU5}���<�}z�h�׏�\87A�SĹ$[!k�	r��ztfk	�[0����4�е���g>�<���?"���$0��5%�Lm�xbG��Z�3#�,���sh��pV�,�Z�w�5<�*��*T�^�Zf�H�%mJ-o^D"���-�#'x�󘕶��X���vf7��Z�S�U����Cct�0Ai��^Vq�_
�;��YK��,�۸8
]�D���rPBݠDŽMX�r@^Q�ݦ5L9�5p�Jc4Ƀw[�dC> ��K��b�6�.A{1B��c64��_�v�z��0�G�~�����y��߼�?�����V��S�iw�ԧ�m"�f�N�
���w���]1���/>�9\�3��� [C��葂��&��78WW0�5��+W���k�=����/��?����olNu�6�j�5B�I�"�����CU$Y�J��Cɻ�uL�V\��]�C��D@$�t�th0_�H�0�	XS6��Z|Lk�p[���:rcD��N�Nl�7Վܲ�4PҮ�4(D�n8tW�B\%AOLm�|�G|��qN��
�S������&g�3 k�bLvs��~�Yt���ޏFɧDV���<rL?%�B���$�G�t6�\�}A��_Gc��/��݂��r�
lnf/g��D<�x^�<i	ρ�	�FBpr���#�=G~��V�m��FS��Iٕ��-�0�����`�# '^KLe�a���M��	r�<)���b�T�:y>&bD����V��HN�@ᡶِ���x��I)&�xS�f�؉MW����\�"��m�`�T���,�b�\��W�c��b��;�~F~N� H���S�)x�R�0(r���kL�0 �2�
2�0u,�ʚMH�bُ�z���٨M��as
�/JcS�5MH���;��3d
Q!b�
BF9VY�*�!�x~�4���$W��:���Z�uR�
�R>ʂ|�&��ѓ�'r�)��D���V���"X�B�&~��6�wV6��s����Xr��ʏK�h�d=g
���6���qzt\��13^g���7�0w6^��}�l�N�����w�ID��Z��H�Ř�+�盏S��X�ԝvA����`f���>�eo�.���BB4	��O�@$F���K4�![��e�m���X�dg��j���t9Q
��=�p?$;�7�o֔{M�p������c:���H
�����0��p�|LG?UG��j�C�:�|L��l����+̎}�Ԁg�nŻ1TT(�Z������*����;�ha�O铲�P*v2{����	9����~��8�&�-�{.�g��'� ��1ߔ�/��|�ȼ�^��<�4���!&:��\�p��2��{�q��o\NnM��"�(�J4{�E�Ƅ��:�A^845sC�zc/��q�-4SXd,PKS�
��P�E4�M�Jb<t�~/h
�����xSC�2��KU�Ô{^��Z�a�����j�"(�[-[Vc3���Q I7��I�<����U�W^���o߼~5c|1��@�;ɋß^����O�?��/�]O#���<5��<�Ɏ�/��a�l�$R~��~9#���@n��M )g�⯽U2p��LC�Lȟ��~��$��$��a� Je%�U��p��ܼLM�aj*��x��,�ko?cP. ��{q�$���hY?"E���"Jun�#5w+Et��@`����/_R�Շ�o����tZ8�ռ3��<d�&į�ݬ�-X��D"���2�(3�
2쯄#��G��H,h��tد��a9lG��|���d���I��ў�K�)��ЯPu1�_�bT��D�.��ι+��3�J�^�	�j��t�I�*e��u�0�c��w`V�NL�u\�w�� �K�/����g�X�i�PZ��|2�#�x�lĭ��9g�iKf�1�>ٵ�2���p�~�Qt��_�M*���mx:u�`�?Hn��@���%]p=JK.��H�]� �-dK�Pg
�$]
�$�!,�H#6��,��(%��6��J�����~O]Vب�8jr�O���Je�r@)�z�o�KD��s��@����{t�~�@kj�@�մ)t�o������%��}�<,����dxˀ��&�i!��caNĉȣb�F�*PZ:��Q���[	�β���@���"����D�1tp����f�1��Lb�Y�=;��a�f�eXhG�BS�rl�o�n��¬�U�^
�`���k�[���j��#W�9Ͳ�t�}@g�|D�$2���pQ��v=:�	����fQ��ʌ;���q��Kn[�ĮS�������b$�*s��>An�N���TX��:<��;MZk=�΄�	�l%i�;j'��Ͳex1�.��j�L���fʽ>Ì_�m�g��*�S���Y�k����SO�/�����l2�q�}*pL[b���?H��䍏�K��t�������>�.�hB���=�-:�`�.�9����Hr�u�]����jOP�%��^��4�1v�����;����1\�K�h�϶azU�/]�#����L�S��5.$y��n��K�S�d�߾Q�^%��K���7�o�a�3�%Qc}�8��S�:�C �D)
�(Y��l`��qɖ�f�g�w98�ײw��BtC��B�ۭ��"�X����#�Z���H�+YV�wi�o��
��V��a�`e;dq#I��cYr0��_����N�2f�����M���M��6۠8�htWq4U$�F��uF¸�q�C	���:�pa�亐e�]�}�c��8�r�ۗ��K!��ڢ��p��W�A�
RJ7��)�ה�9rrS�����8��W�iZA/٧Qf�H�ؼ�珒��gfL���� ��y�S��{�Ag�q)ޔ�﨔������? ���i�eҋ�|�e�yp.��4��ݍ,uk���:aŅ[��}Y[��BYk|���G��p�����A0Ȥ {�kJ>����:��mx������������$�<~��R�{;�'��l��T�j��u;���&�KK6y�5���d�p�QOpmz�)�����qw����V/�I�B��o��q�p�&�u�j�d/�,r�q/)��
Ffer����H��+E[$�
;�Nv�q����>��w��	u�#��;�A�kZ���w�g$2aq.�l��Q?�`�����̌g!F��}��wy�c�����]���m�`=�c9�zs�|�f�
f'udm���O����?��4}�|s﷐���%��_�b��Y��O5w��O,����G��ˉ���D�����6�"�Rq� jB��s�>
���GX�.#��;�P�|��w�mc�_m�m@���(�2ZY�g=����F����}"�x��=�ߛ�!/���³�D�C㲼�/PKk�mWU�l�=2ϸ"setuptools/_distutils/ccompiler.py�}�s�Ʊ��+�U�+-W�SW��/gK���RYV�_1�-p1K��kKj/��s���CN^�ޅ�X$0������L&y�v��(��jUo�E隣�u�eE�&/^ȳy�UIv�vM���uɪ��6�.�.�ݺ��ᒢ�\��V�h]7��v�hRQWɦ�]��L&GG�f[7]��[����5��h�ԛdᚦn�D��G	��8��Wsz򺨮̟﫫��������-�ƻ{�]��W3D��n*�!/����ӗ���-�4ȋ&~�ͺK}����ݸfy�Ի���o�mYt�_vu��y�>�ծ�n�e}���ף�#^0��'4K���c�Zˢ�k�˽ٵ��!��m��	�V)+�2,�.��˲��ˬM�z��C�퓍�.�Mv���kҺk׌9��?�p`��*)r��(.�*O�q��B�.[]��.�`6+ j�u�Ԛ�%�W�=-����s[-wE��E��@���%ۦ�٭�m��t]S��:�o`�K\�v�z�Q�6���1t�*w�K�Ll��n�US�U��G�M�/�!B P��m�Э-k���d)&p�4�A��|v����W����w�<H�-��`͉�65��Β�z�d{D5dV�d�cIF����İ�B��􏒩|��n�+��"��x��8��X~.�5�Y��ԕC|�@��7Y�.QL$7��
)���M[X��D"�)�K�Ew�]�c� L�k��۶8/݀�����p=�N�huA�8V �Z5&�6iw�c�LJ�i/�]�+�����ȯ������SC�B�L^e�>I[\�:���[�[PK�>�M�@�{�̮" 3��PFC��W�U�(r��@��m]1�Cw��������i�=LY�租~BZ�.ڤ�;X�*/u"�m��D$�ca���c�!�7��yA�&��/-Ks�!$�[\,�ښ
F2����́��w8�u�] ��u�e�e"6@d��Y<�؞IU��8tN��*>%�ݻ���P���1g�@H�:�P�l�\W@!,�� ���C-a�@��)���U� ,��fuya�F�9O
`U�LV���d�3��	~O/^���kz�0`^M7D�J���m���L�F���*�D�٠
e�nu��plQ��0@�X�	A�`w��e����;P� ���(;ϙ�Q�"4�~@�E��p�(Q@�d��k�<�޳j���mlH���9 ��3�i�R>9/H"���U2_7��eG�)�EDAsں�l�� �D:��߫��B�_�-�T�0]�:�4��&��庮e����jHՎ���5��@y-q.pt�-2T{�EY��MI�8�+O�r��8�z��,T��8�Z���	���˴P���~^ۆ8��Pi�Y��Z�20�.\f1�Fc�6�¹��Z�<A��̋�`l����tZ��	���[TL����Ę;�'ʖ%i۬��c�*F8Ki������d@�thl�r��<WK��%��}���?	�����:��FZ$-��}��=��
Hp�ҭ�]	�U����u����r�m��r�;X`۶�5+�3\�_�.���p2�K��B��zj�R�X79j�A�Ĵ:�-X�����q��U�+����[�
7�G3T�0�o`��c��"M��@
hD����>%A2Y�&�z�9�B�r��<.W\�"��VO�0"��&����]������#~��I��{�����
>Pȿ���e8M�Cm�#�p$�i�%�Jl�����-	R�&ay��Y�J�&ɝ��u�ʳ���&Y.�
��%���z�������` A�ͮ�_��V�lvⱅ���$�ů�+xI�Ư�x)���`�����:���-;�h��$�X����0,2|�Dy�#����,Z��4(���=ł��M��<��%b��?a���nܖ�(`!�r�f��
�z����
2y2c(qH��`���۲X�UÐpܳ���G�,�lcG\c"A�K�v�c�)*N�ad
�ld���x�Q�+l0)@���!���$m�d�z�{�84pȔ��O&�x���#�?�X'�����-�ߐK��2����H��z�M�D��g�-�KZp�����x�J����u���̮r=����2�xp�n�ȑ8�G����zj��v�24L��|�<�0�5�����8�������3�$)�O��B��L�(�7�U�b��#�="1��ޑIt�)Zp|�<�	�^{8v�䈒hX�J�ۺ*o�0�1m��jz]d�0`��PҌ�+�k����+���x��ɓa��sͲ��_�xZQ-�-i�!zP0�à�M3�3��k6���	��o��
�+�L��`x�sD�'/߼{�E��7- ��`j��<�QE�1T�1�R&��O9w��	�e�;�1t�A�9j a�1�=(? ߕ%���&w�܀m��ܕ�eDZ�v��PB#aP�q\�9�VW-P�%���:U��Ș�����F�Z�,7ZI�}�aN���ؠ��2�a$K8?�\˄h�`�N1���J�V�2?�@i�_����p��g�H�d�g={�ٔ_u��:F�>}�G:����mx
��7dj�푟y?�v�5@�; ��nSHH���9��(X��"��~�Q��1�O�!(t�~�PЅ�m\P�����F<�_�0�bTC���xC����ş&+��Za���Z��x�̮��3���������~�YbҒc��%��t�\����x�5�jԞ
̀@T���v�rb�`;d)�N�����	�?2n0d�$�U�!r�`�L�<"���+̖�������S�7����5&�0yr�<;�	�
��<�q&d�ֽ�,��+l�.�(&�S(���;��Ly�3�8�+~;�Z�P�]܅���x`�\�fX�.������y.��~��x������p��A2�!I2�1��T�(���@��p�y���k���ٳ��L�:���Ũ
��s5�D��K'EeHº�(�N�	�����O���X�#Ɇ���Ulx�����ք�a��펏���
7��4Rz|���u��rB��)
e�p�0��̕&Ũ�]nct�F�m&��j�
R1��CE
���F25�RY�zc�I��~o�lA��q�*C���<�`Vi4=�z1"���f�&Q�gD�rJ;����4��/��
��]7��9����Q���,�]�0�X��<��/�k��`t�{�&ҶfQI&G*11!��!UA=���h�%��S�#�Ĝ�U)g��M���v��4
�&3�jL��٧Php+�@���W�`Z1<�������h��)ё���io6І��-n��e	�Kk�+E��weW����,��v�r2?x���O��0��!��((u:�'��Zj�gs�y͈֓������h���1d�!ncnk� ��	�qT41|���6S���Y�#S��S�<�K@"0��DB�Ċ�|�ݪ��D�l��Ԡt�}�
\�bE{�{2�Tb��[!�Ge����?{�cG�hUU|"�b�޶
��٘�\�@,"CPx2I3�� �����#�}��uZ���q�1�����\����hȘMi�)���3p@W��9
�s�M�3e>C=�loV�?���{.*n�?g'b��`��&�5���f�#&�n�V��-Ug���7sF�G������ضy8~�y7��ﭮ8k���C�"k��G6���'�,��4�������c-�00�7�֎��h1%��vm�Ė�F�f&��naʼnM�0KRĠY��$�qV�(#(1�~j�Q����H);
�c����v��"��������<���A:�+�巰����N�>va�o�!�����V+��E�E�8&�б>�:^ش��s�>ǚ��rF%ӽ������4��8'lI���(]�hX�V*ۢSK/�Z�����=�vvX{�`����������C�6
���=o3�Ѓ�9�tec@�R����Q%8�k�&�ƪ�P�e.c����{���Ym��=+��QҸI�Q�e��<)h7c$aÔw�Ɓ��vRu�d�,8�?F��_d���UYY_�pK��C�ou�mp�M!9/{�8�a�?~�b2�D�%-{�F�d��(��J�������k#��A��q62���0;$D�6��(��!�\��rDA��,�
�i��hv7���7O��|˄U���=c�'%?�W��9DȞ>��O���-N������m�q�Q�>�5lV�z6A����y�\q1�q;��!���,����
[Τ�)�щ�l'I�I����0��:�%�v�>�S�X�x5l�:�U?����;�1����z�P�b��_�I�[�n��r�Ny6!����g�\�*w���-��D��e���/\��åd���qDǷ0k��g���dՅKm��
�f�3�+�/a؆�z/���]�2�=~x���ٳ�)G��8`��$���Y��A�9��0P�f̈́eO1"�ʞ+*��0���ՊI���7�*��Y��K\�*>��'��_�bq�����lz��~�TM�K!���'~rƒ��n�Ǔ���g{�腈�rĒ>�
�ۢ}S�x��
	i"�ۄi��I�3Fe������\"���ap���Y�E,"�`x�+t:�?���M��g�n5�ԂbC���.x"1@�*|�(Q� �o�z�v�'w�*O��5F�C�dӐ�K�t��[![��vs���c��2�(�75���kfX9��;*ң��޲���g�;k�w���ߎ�D8�]�~n�$�D��;:n��k(#��2blv���$Im60���m�É��x�@�噙��I�Bn{S�b���EET|	����58?`vk�2�z���\�t}���({��M|�����A<�'j�\�{}a~��6R�����mF,��
�C�"Č��3�՗�y���Q�$����l�T�6
�����j�Գu���Oo�����^tXݎ��=ܹ��c<�32s9Z�^�����m���_?��|�1��f��	#ޯ�܉;q!S�a`�r�/߾"�!�
>5����q`�ƶ��*���v�$Q�$�%6z����n��Ŷkz�����@�y8�i�*����d��'7��}R��(����'s�I�u����`#�G�<�3	m��H�?k٦c��#`< i��G0�Y*тc!������m���>z<��~���4a����[��1f�Ą?�\��MV�S�kJ{����`��G���Lk�D��%�A�0{cdg7a�a�h̲��\��EhyC&��+� �L���-V_/�;��G�{X}�.��=�/j���V�/::���Q��{v1F�꣋r 08p��ߡ0ƻ�Ej�x�9��@���:�����$����7��Vx��7��Z��0u��u�HG�D��q�2n��/�p�Y�����cVS��a�"�<���#�URr�y�CM5€�L������'T�X��tJM�q<q��C���fF�Lf����뱳�w���(���x:u��M��޷F�����{����s}~_��#Q	y�aI��C4[���W�����A":`�)퀲g��;����F���z�dLq׀�Ņ�R
&��f?�h�����ޥ��0=��-��1:�]�	��&:؛��m;s�i���j!!`��v��͕ߙzP:�6R?��*{[a�3a�#�g���m��0%�*���ڨH�m`|m��wu�^���t��#p�<>#k�l7����F���H��5�4E�9*�GIw�e$�I0�]�ѐ���Mt,g��>�Oh��cBl��P�\� 4Pc�k��u!�͑��a�b4D�6sBJ�� `vy����&�mL�=��͊�qI\�U�q+��Z��o#U�':��7�.C
a�1��ä\LdA��U&�cP�u#�VI�IJ��zN��g+��1nRb��O�5��)gg����� PY?-���z 9�\����\�8�ME拘�
�^��$��3�����t�S�\,}�h|D��CB��z e��ag5�Of&ᣞv������6dR2U�q(U9E�:�$�QF�%���uS\|�
���`%�P��9yz�5�U��
3c�W�K���a=IR.RH��c�Ξ�	N�ׄ6�'r�7�(5Z˚��xn�4�i�C$.�rT
�dp�d�fL\/�ן�N)�
��2A�a�3�A���4θ7
Yڒ7��gu�3<�&'5���
��ҝ C��Y�C��5с���1":6��9������@\�y�e�c��/��N�P��AC)[�{;N좖��tY�K��\��>�.�S5�(�v�9�K�b��U�0�"w3�p��6#~i�ر6��s�NǢT�i�]c�j�$�Z�t��fT��6��!���p�!%�(
A��<a
h�������?�,;]�>�Cc�TH�ou/��"Ux/��׫��Up1U�evf~X4�ʹ>�W�ʶ���	y�aM�z,F�q�N}1s?�5�g�<�ի�Ay���#�F��1}���PdC-��\wϊ�.Ow��1��q����3F?�z���0�����	[���2��z*]�D͕V%��\a$Ǭ1�\.��B������~����z�d���X�ꩈ#f`�9��i��$~w�dB�gEy6�G��8�0r"��s>�e�{��Ҥ����Oˊ����IQ:�v2��u�5��|�٘O�g�?�Qと�2�-�K�Pй�j��=�c۱���l66������p>ݡ}U[�"�}�PG��)��d�s�Q_�.��	|ۂf{f��m�ȁ�۹��QPs�����A�UN��~���D�Q���Ǿbܼ�cW�*��j��|
�]r�N��Y�V�vl�Mb(�;���Yh �����s�/�9��_
΀ڬ�����>�#���<#7<C4�ZF�I
/��)�*%�qⵍ�:x����Y�y�����x��������%�W��z��M駁�gO0�~���J�xV7�;\�b����ুJ,�o����m��{P$�h댩Uv����2�~�_�ޟ򖸺�@�
�����x��tU�)�tME|�����	�w
����vh0�.�tz�i�d��s0Mu���X8��ӗ?|�r����ŏ��&Rřg>�m^���/�O�H��[}���/���W������)dK������x�ر`.��ݑ3�ݣ�c�����A�Mĥ�M���Y��m��}52����*�:����_qhz(t�)y�2����A���͊�٤��<�Mn��"_{�jy�.��#�cTL�
n����i]/u�pQ\S�o?�[h��-3޵5
9�_�9#��K��l�P.�{�n�Ev�U+C5��1a�O��S}�g��YELj($��#8�
�
(�vpX���+�@&w�O"�k2&vt9�B��b#�	��k�7�@R�
0vV�H���ɼA����h�s�/�*��;=F5��B�ꭲ_��Ƣ�2�H���B��ȑ��@����#evW�m�]����c�C5�Z�1����`,����*X�iY*a��Rdd�>E	Jw�U��bE��豶�����dp�=u�G�ᥬi}���p!���Xv��8��
�ڤ����to	�b-��"�p\�� &���KRs|�ނV�:�91�HD�5�Bh�(��<v2ٞ]�O�C��&e�=�w�vM���7�q0���]&�Xl2"��J�"�;�RΧ���^��}�Rm�7e�i���G���f[{�J��p��t���`��2��˞<`OJƤ����o�.b'a�`�@d��Y��#)����N����Yt2F�C��cɩ�ތ&/��{v��wq�57�4�JCdѻ�D�s�B��l�$��@��S��b���1c�_�}e�Y?���o����ߏt;��(�}Et@�@J+f�y29F�G�߅\��o#TJ���hW����
�^�
�����X�U��w��+E)��ˇ��h��i�fs[�<K�k@�*����E6�_СzM�jn7�M���4�2�BN��>��9���?i.���o���%�<|�<�å&�p���y�t����O��e�.��S&�_�����<����ž:��O�|�>E��i��W|]��%au����U{	~�]Cwh��ݯ<\Q{���A��[�\�뢩�M���r9*����y�����]�[t?W:jtҏ�=�7�c���(ȀL��]�I�gr��?��)9�^��8�ĸ�k���X�ϚD^�{��1,/w�f�:^�C���>�����7�?�±p��|���ɚH���b�����6��c<$q��p̑>G��a���Mn̑�A΄^ �AZE�0%b�@Oߥ@t�4*<������'�g�e|LB����z�dC�?��0�
o�̚��c��z&wT~��/�d�ϟ�zd)_>�X�^�`*jٟ�bU֭M@�wf_#Rg�F�L�Өl�1)������&+[w��ae���]�6EXG�M�Q��7=��^O����g�NG�ؖ)�>5�g�&?<�f���~�o�Ĩ���fv�c��:�`��x�f��y�G�m��ԏ$���~?���N��c���,�$��d_�qf����k��:�ԭ'�o�Il�s
h���
ir��0�N�+2�*�Y�])��{�_�=�Po2�]��vU��M{,Ǝ��'�4��Fs=��N��PH?^��ewgp���[E7��e��,�	n2��
?�팧f�.�.܍B���2?xAy\�уF�pm
ǜI��w{8r��z���&�+Y�O�^��=����-���,�~[
�t�7��+�•�d�f��s�S�|�۝���Dxuz\�'x�(�-_�g��&�Y��s�0�BVfT)8�mq^�ܩ��L-p�l÷X����]<�O|u[�^V��(U�q�|��;8�%pc	o���{��K��J]�7r�����ŽB')p�m`����Gtt|���2�z��Gkʢkp`.����LΦ��o�T&��<�;�-pC�rl�7�����R�v�c7�[�����oL��C&=�Ȳ=���~K���2�v�ք��,�D��v�
ud�Ȭ8#���V����S5���g�,��w.R�'b<x�I�\r
��G�n��|��h��X"�kM.�]9!x;
���ԓ9C���!��N��m�*�3
U�0Vn��KT��C�T�3.���d�e|e���N{/�e�1Z�7Ƽ\���v�)�"3i9�Z`.&]0�.F�h�k���C<�ai̱��Q�~\}�l�s�gMhJ��-~G�n�܍��f�g�kp��~
��n;�^�-�/�F]��L��$ኻy��o�N��R_���d�l�R.�8!D7ylO���������KEP�(���Xd�3a�c�GF���U��2Q��`�e%]�zYWu'�J��W��SW���Q�nr�l-�u��À��+�����?��Cў��:�2�j���U��}���<o[����9ǓN
�t�=O�렠�p�—�>�%�|��v$��t��)��],��z�{R��TF).��P�Xs,~Ft�8c�2�����Q���f�`�ǁ�)�0&�$ F�ކ$`:T�I�(��ASN���\���|�)���G���m�;�L-�u�z�����T��V�3w��D}N�M����֛�*��+z}��[3ibc1��ʯ�-|�lO��K���T6��(���>���)��?���j���R��WOYTU���9��M�g	�Uy��,iY_,(2�BC��l���w�S�M�|�Wb�/���Q���(c�q�7YS�����EہVk4��MAʟ$����{�!��ҹclu��91h'����Яz��Q%({��6���6�<y��oʶC�6�V�Zh��u6G����V�-��x7���Yfm@,�~^��6=H��� �G�w�C{�L({
�O�N�u[|Dw��>̠!'_���l���m�?���O7[<�Gy�t�;�<~�AAx�u
��U��cVu�=(h�����
��(<�@޼�l���RF���h�#&}���OT���~��>y��A���_]�VtJc3`�T����~*�KU�O�p�ш��5A͏:�A�m����M{��g�xH|$&�rZ�W�EQh�0K��PL����W��z9��/,�$wcrݍ��ojy�(��j�J�e�8�O��f��/���Z*F�RP�~���X�_v���<t:�u���$@��:n��S��/�h��=�)8���T������i44z�3F�G��!r�cW�q��ԃ��Q��ь|Ɠ�h|&��0����¨�k����˰@� �(֒��f�&�k���'�l<3!'k���L��\�/W��	$��Xh�d����S�lz,J�ow_J\�S�z�0��[/fG
��v�+4U��	ptI
ċ��'�q(���n_����Ho��Yx���������K�R�x��'O<�i�/�wo�)�>}A���]򫄬�~�>y���Ώ1��1��	��˛�q�|��GG �:�s�#&��ȯ^�}k�Uݔ(O0$�¬ǯ"�A|��L��~�vV(2�s �fKm���ҕ�c��,`�R�e�����+t4f��z�Ѕ�H��ϴ�pX��D�<���t@X�*ˏHtP*�%�s�����]6N�k�\����4jϘ]g�j�%`Tj�~�Ͼ�G,��e �|48�͘�3��C��O���<�p���ܙ�����Q �0fI@{�۳)O5E�TR��X���DzH'�S��D�ey��i<t�̭�u��I	�R�V����-��L.Jg���x���%�E��}z{Ԗ���B7Sl0U5�]�6e�k�G6�\�:)F_��J=�6y��Y��n<��������f��!&]��dlq�1�6�$��=�b�� ��4.KGm����Q�m��h�X$�����)^��l�m(E�	FP�4Ը�d_��T&�tWrj)//�U��ƶ��v����6�]�
��ma�����5�`����a�.�,IJ��!Y@�V�_��5f*�,N@k���d˓�:긋6EB��h���G��d"8qk�s�:���CL/U������G�a�GS��%�y�?X.Y�/��@1����̴1�+1��3P��bv0Z�W�goYz�@�lrL8Ar�X'���^Yg�^�ml���I��:&��YF���o���8��?�<>d���̜�Ӛ�M{��9�Ȝ���"0�.59�䛤%��2��l~LmE�
͍]X߂#��<�!-��nS�_og���߱|\7�JK�_Γ��W3���}��;Y�,������k���j�o񶍞�u�Bl�P����k��:7�����'� ۹xKR���{-�Sx?��SRŬ%��-ɟ�^
 �)sj=^ϗ,���z&�W*�^�uѠ�b
��azF���u|�W������\j-�9]-�8'@�q틁�P����SQ3��vŊ����b�/�
j�o^]_�	�
�n�ʘ���)L]��W3lДR(!�ǖɌ�dR��3I�OH��j��M��9���.��nKu$����!5.�+�+���,�)8+1��]\jB�0O����&S�J��k��f�H��NO-�_�z��x�<ܢ��W�qv Vv�{R�b��iM7��qP��伖ꞠбNk���]`2縮��-Ϫ�������|�:*D�&�|�MB�Œg�C�[ut�$I��=�֞*tR/���@5 �FcY&=�S�#���Ւ��z�jd��5���4��Ahϒ������K���ą�k{�rI��$���@T89�D�Y�P�IK��Q�]��d�f��ɳIJ�R�AP����=g!R˳ϣKj]|1�+�?{����8�ת���g0���Fģ�7���cb��
��;�������r�xA٥@2��c'7k�\�r+`v]� -x�e�i�k,UD5Po�Y���{���`C���v���T0^L�+��u|b�H;c���!q�]1&�b�B��(��W���:�2�2?�Mt3](4�g���G�>�5b@ �e�9比�y���á"s!��w,1x���o�5����NN�0���47%��[-�k����E�d�Zs︡��,�(��h��iE��!��Q�٥�v�e�B�B���ޗ��F/1��>�.���K����ȟ K��j��1P�ㄏSSGIG�}�;5�`Uq�-�*�Vм���u҂%19.�u����	�.��ۺ��s�rx�����8�U	���B��&d�9��.�ƥ����4U���g��
�u�]������1-��y�Hl�Nw�qC�S�'y�m���Ԣ�wʉ�$��X�FD��pi�277<�r&�~0��5�B*�>�h�((?(�u�ƟIU�ga��N�	��|�$��N1E;|9�z�mdw2��&b?����PKk�mWǢr���Esetuptools/_distutils/cmd.py�<ێ�F���}h���?�`��:�g� v��@K�-��$��Ȋ�~��7�;ط`["�������N����0Um6ũ����o�R5�zݞNyS��΍���.7��}�ӣ"��M�������>?��M�$77թk�A���_[���[�Us����Imt߷�Q��[���n���;|)�|�.����Z�׼/�Ճ�Uꎾ�-,�<777L���F��x�3C�Ô1��W
 >�s19�����Nk��vO/E�^���X�������S�TS��`(�sR�Qf�-k`ع�@G���!�|W�C�U�R%-q�$��{�A~��dK
���Llm
d
U^W譌\�S�8%D4�[��$UOp�9-]�Ȃ�>W	=(e�&��w5S��ޜ�Uq$H����������/1g����)�Κ�b6�[�^�mLv�ȁ�B� �N��8 p�H2p�������N֥Z��k@*��;:��ej�٬3bP�\,wQ�tS�ľa	Ƚ{m���8���g��q�e$�c���ʮo�.����:�E��][^B�'�k�jPe��w��ߓԗ@�E8P�=��e$�0"���备c[f��Lk^�	���	��-������
}y�R@x+CL��r"Zyݦ�-�P��SU3�vB&P�a���1����d��TVyn'��ۺ�%�{x�y�{�dJ��Y@�F��@`�6S��\L>}���8�������
��AroX)�Fȅ.�"�������n�� ��}��F�c� uR��\���/!���p�G��Q�����{m��)Cc�����u�P��+�U�=-a�a�qW����`��z�{�6����L@�!�|�x
�,�T�Y+�f?%�c7i���%ğe�ɲ�„ь���Y4��y�����_1P�a��͛�O��`�3�U�H�0�h#"q+EBT�T�'�UѪ�WA~c턣Fݩ_~�
	f�5,�;�¹�i�!�~���[��ݮ���Y�5{`���&��0��gĴ��u1��h����f�/��T5��+~.�\�X���y=!Ć�X#	�l�������5�S����ߟ�)��Ĺ�=�1��n�Сó��693��0�"�D�x�hF�dF��+��E��]�O�W��K�)4[Q��\[MUl����l���v��"�x�G���.�:��F�6P#P���OK�!*wĘx��8����gP�yq��������`�R�6�G��������j[����.n9�;4�DRB@V-��w|[����@�B�7&���Ƌ����Ԍk�h�KB�v�+��K��\+�ЏZ���eA��+�_����H	���=�xy�s�E�.����7FN5� JX����P$T�s�LB�Д5���A�k�[4�u{�~��g��A�\��WB͍V�B�B��k
�X���@uh��\�@�ak�ٸ��/
�
�uW��pQ�7���#bWc�?C|�a���w��tX��'�1�HB�\f54����Z{�ޞa��3���xr���hr:�l�qy�Z� *Ex��Ѽ��l�^�	�}�Q�]������s�1�1N�6�Ѡ��sD��o7�������I	�
x}"�"�2هP����Z�ԃ���P��[��:�̱!�A�]~�0"-��p�Q�I��}q���`lG&/Ս��{J�|
�`$NB�̕�v�Cp�/Ʈ$�7L�Ӯ�yǪ�J�P8���Cx޺Z�<�;��n��é��#pq��S�@Kc�t������I����F<� f?�ƾ��E68[����^�D��\�~���7س��O��F�b6�D��/���խ~i��ݸ���+�,ܺDh�mۗ
�d,w�|���Z�#S�Q��Bٸ����c�L�WDD;��S�TVf����.�A	@��|r�+<��b/n=,��I ��l�'B�۵�T�q��Q�iكK�UHJf?0�];���n:U`��AU�V�-��}pWbo�:ͦt4�l�`:�z��Z<x��|���<^�De"�����5a|�,edy/�c�A��=�\c������h�D
;�*�̙Rg���4:�@�F��H�ITX��� .-i�$U�H�4�	�A7�nj6��D�O�e�$v��n��)���n�icY�@����{�7R1�f�ZRD�th9�Z�&"s��dB��҈!RO����O'Y��љ�/�ޢ�?*x^�bV�J���sé%�k�@�*
1�x��Q��.n��2�A�)�K��n(������%
S�t��)��"<��y8aH�"�n!�ȍ�1�G)	,�q�A��Vh�?xd���Gf���E�I��c�
�o�%I Ǔ��2��Y��4�������F�ɻ;�Xv9B�>5魣
ֳE+��N#��i�+Lk=�4�A�wr(�y����
|�ܬ��)4V�S� ��ұ��U�Ș*��;���l�eqiG��_���
���.�G�п���h�4x���W��|��?~J6T��y��M']̍���ȣ1H���[�c}q���O}@=%�r�N��Q�-X��*�Ł���e�?{1?=5�|N�n|�c����W������G���A�����)I��h
�X CNk�{�Q�9Le�����7�gE�hFh��n<l���!���T)<O��%�g�iM��{�m��7�������8�<T}KN��]��j���{wW�Eȑ��'��`:��c��
���ף9ڪ(��u�vU��ڿ�0����I/��.h<�=(#xi��/�5x5I/��0�9LUݱ�[�v��|��I-�S9�{���C [�<i
�����Qե�'�]F1�
��P.�����_�Mz��,�JC�NC+�+<��9S-C�=����_��=�e��b(�y�v�H��x���� �Z3Jg:�IA�����"���.�_� .L|��~�}aJ\8"nT�.7D�OI����dl��Ecv1�=;�9����iU�)z͔K#��kAأSa�M)��_W�:�奙M�(�	���3u���W�=fa�[,�A)�Ȼ��3?���2$u�fi?c�LV%��)
Nq�˯�ʿ>~��z��G�l���%�cjZRb�/s`�n�u�:��p9�f@��R�;�uŇ��O��(���\X�~��LKs$���Qb���~������?�:��*�$7�E��y����������	*
$G���f�3����`�D1�N�q�/8�� ���e����k��5`Y�z�!v� �����4���UӅ���~�{ ص
�3z�0<���)�rI�`��צȠ̷�E�?����j�D�|������h��znk�1A ����&�Z����,��T62�K�ܣcQ�u*�����]%D��Ar*D�*<p��!���¥|�)��bX�+�&�e
�8i8iB� 7WM`�]�+ a6]>7��pb�D3@�S[2�E+$\�iu������O�?sx�"��@$�BDŽ�o?G��L���m󠛊�m�A~.x�L��9�'3��f/
G�S�fGM<
�=b�).3�o8
R4�(��؈[���L_l�8�g�|��Uo�Ѹ����Ld��3'�����G��o"J~�)m�{&�LɤS����u�d�ͤ!�s�fZdŚ#�
��)0і���n��U	~��3��r
t)�
{�*3WY1|X`T�K���4�م0Z�c��j{�]�og�b���Ĭ���qp:��'[���2�ل
VQj�:���H��)�^�?�\�΃��t�(�	)� _�u�:i�\A@T�hyQ�-��CI��1`FL�-u�Y���w@l�d"��_�6в[��CU@���-.#��E��
���+�Y���ͼ� ��^é�J$TL�8��f^;y7W�d�G����\��c�  �W&�y�2�p����S��Z<'\锭��q��C/�+��9�R�/R[DZGW;DwBS`]?mK�R��$��� �o�����.���	G�S ��� *#þ��b4���^�b���� �\P-۠�B�ē��KF-����p���l�*��Wa��܈?����◱����q�ܢ���|�/wF�,l9y�LT7K�������K�]Dx$׏9`okw��pz�m�g�^&`�ߣ���C���D���Jo2�K�5�{<��^��Mԇ>�Xp�=�d�X�|�&TMQ����n�0�&�D�m�ۋW���e�]+��R?�x���պr�7�;˃.5gf�V��B��<��+��{~2��)��(=����ػ >��0�r�������r��ѝ���Y<��S|�yQ"_n�S�~m��ک��@D�����o�a�3��Ca>o	���;u2)�mzw���#X�t�I��(ٖ��믿�772���fQf��L�osFێ� ����-��2x@M�������tr�;N~m$��ҰK?GU!�H%{j-Ǜ0�C��'��ϭkY�f*cMLԇD�����MJ����Ԕ3�\��f�����������1w�\8=��~��?~�{���;ܥ�ɒ�̲w'-C�����	]3��R4a�i��\N�;D���YvU��)i�}aB!����>��El(�.0i�5�왱�˷|Ʀ/��/�S��u8_��|a������	�Tխ�#O7�jO��[�3�t��:���w��h�F-!�'qePܑK�����3a`O��Gp����yG��V�tO
5@��,
�n�X=[L#��ܸ.�d\}�*��Ex�|��~<�cA(.�	r����ら&���_0e�(#-��	<_�ѕo��7�U����c���B��F[jc.BAJ��<�?I/���A����̉2ʇ����C�m����r��|��G�
�
�!$hP3!�i�����^G��	�����	���:fZ�ndJ���Uk���jߛϴ`�KM@X��G)���ِ�i^��
��ۀ<_Z#��x%�)�8�TR�u"Q�i���^��;aW�?��"WN���;�Cє<5���.6\�\c���/�'�۳�dA��;:�m��	Nۜ,Ϗ���F��~��ukU��HJ�֟���'k��;|%��%��m�%�j��n���-0Y�����K�*5�}����K�:��&�e�z����j%����PH��?X��s��C�sW_���4�m�v���O�6�)ߡ;�0��D��
������
i�l�jj�f'�ت���X���[(�EƜ+CI���k��ڌ@Ҧ�*��Q�ʪ��PKk�mW �S�/setuptools/_distutils/config.py�X�o�6~�_��$�����<tY���M1�a�es�E���z]���"%ʒ�UqL�}�����d�q���*���i̥x�SDo�����b��eF҂*55_�b�w�i�R_��@o�&{��Xl�K#ؾөT4}����$�JHM�
r)v[�|SQ��$voA�fyn��Z2Iw���&��o޾�x���BO�
�W|��
����z	0OL*rx�� X��*dIwlv��
|;��hl�$t���g<3` ����zk�y,�A��8-��f�q\�`���X���x�p����[�+5���W���QL��\lC��Ux����w�B�zK�J(��<�{Q2�J��[0+�ZT���!K��O�7ᔄ�L�� "�ї���3r�Vr1�O<�P�r)��� �@��U=�|_�m;jb�_�0�P��/B����'�Vl$�
�k����H�"��Q\0���a�i��	��H#����?/#��}� ��e�F�І:�=����`J\�M�K��U�1
UF����C]�R�Q���q#p�z��癨���|�t����[H��O�����OSr-^]_�C�0&Bk>yr�\��/H4�����T�3B^�R�Eg������L�
�ǜ�9i��A��q��N�R�˔E�G�ˍ�}R�
�7��*�@��ک6��@5K��: u3���b	�ڡX�*�����#l�d���	v9��)�bM
��&`�jO���u�s�%�y�4�0�y��f�.�'JK^E}}|r�>�����8l�\�ے�}�	zlؓ]�)�=�U�՚�R�-��bzji֐206ۮ����������Z�o>>�Pl共�4J��RI�&�8���d��6L��
-	�U�x�G�l��'�
��m��t/%+58�-��df�����2t�,\uӹV�Ln�`$���tCIw��q�<�㴉9����h������!8�u�0qV�5t;�Gd��쁔�,n��ӻ!8����H�1F!�g��l8�BT<*al�a��
jbK���'m�&�Qz�E7�����d�tCAa7F����9�$L2����B�1���;�ܰA��Xop�M��|ϛ�?�+MzپrSv`����b�c	��;�b{�
�k�Ճ����ZN��X�#����]���0?w�߃]�� ���q�s��>Da���G���4n�"��~��0N���7�c�3Ͽ�Q7���`60
�
���i'��~�a��㾞^�hf:O�R�1��3�isN�sַ����<j���>V�ܴz@���^fE.QO�x���;'����u� ~b~�X[����>Ѧ[�шHUʹf�i�1G�8���ܫ�[/���3w����k��Bu�9�}x�o������&l q����L{kEԠef�t���#�0p���m�ѯs���$�PKk�mW�c�v��$setuptools/_distutils/core.py�Zm�۶��_���#*�q�~��x2��6m�N��
"!	=�`�d���}B�I�7mB��b��`��e��e�]?�vyi�Z,~<(a�$S
��A��U�r�7b��n:c{U���%^!����QW�-p|�T?t+�ڲצ��˃�AX)�D�iH�����׹/jg���UeJ��Vo�,�J�4M��.k�r!�`�������Y;�D�v���u+���Ll�T�b�\.|la\xr��7�տ��� y����J�z��O��Zc]x�-���{�g�36���K8b�ke�潰{?�^,��R����r&1��bIʥ@�˖���ù�@�X��`���{"�0�N�����wo^�3ԇ^���'��Ţ(�gE!��w�鶫�Xy1���ŁQ�`$ޡa~<��Rl[����D���{%��UV"���]-O�t<��P�� �����8� ZP��j��p{@{��hUX�j�
d�q+Z�(�6��פ����F�k���n#jtC��t���픽�c4-_��ŷ��h��v#�e�n9�e���໯�;����?�?�H��w8c9^UZ+h�g'%����;��k�*H{?�he��7}o��p-�N��|+���\�j�M�l�g�6z\��4J4��D#��������[u���+��)[�8h�E��X��t��ʂn����4d�W�������NGc�	xv�F�e�1�.X�_�@ǒʧ��ذ���lvgy����ُ���r��j�_�j���<�=�_�ˑt�`��Z�pU�M!“���k��`���kfk�2��i8�(���Ȫ�h`��d�(�g��D[gj����l�>�%�P��.�@7��I�2�۲*����rX��Қqpha�l��[+�)Y�c:�8�u���ɠ�������`�(A��u�����S(��0���lM=9V����Z��n?��"߆/��}o�F�+�?����_~E� z ��C`=��焥܈��>����	�vlj�(X[�
)z������n���ue�#���7`�]}�%��f�Yz��!�R�
pa��[Z��>S�ȥhU�A�$�aa!�K(	\j<U��2�6� 5@N*�=�,�9�]Wk&s1�e�]{MF�*�!�!�����a����yZ8:���G('�`%ӷ�ڣ���w�a<��V��a7��X�N�Aq�%��ə�ywZc�f�z��:'9/�Z4����E�>�
p��`i�U^#EĐ�a*�B�B��L%��o���p�n*M�n3䵮C�Oq���q�Kh3@�5+��@A.S��G���{�/1���2�#��R2���pp"Y�1̜���`�<�Ձ� ���;���TX�)��X�8�Ҹ։)4�`Z���9[?9�h�~���_�Ƅ"����h���Y�u����9Wd�?{��G-^����5� \i�@T��`-�!���ڇ�9�cq�^D����wfA�L�:HT&�-�T�b�1
���1�`�i
���B�7
�!?��d�=��1�����\(/̗�3��$�^k��12�C�l��h,�bZ_o����ޫ��*�����wf���}:c{�2�en���%W��۠G�\F��k�4�2*��z=�&�Ĉ�SH�ks\��$�9���l���C��Y���]���&��v�v*N�_]�O�R�a��Bb���t��l�pr9���w_ޭ����U�i&��}us��i���~�c5N�H�[�5�/%�*�r�pF3�	����ZC��r����|QBU�s6y��=�;��+ܕ��`4�缁Vj 7oO�W���ϖ���L�m�
�-�b�
֣��C��O�?~Z�X$�>�cDlh�����r�i��2��+K4[p�_RV�)s$N�V�HQ�2�D��#D	,,����F��0�E;�R�E��jP��Ѷ,��zS�$��ĝ-�%0w��o}��Π}���|�+�xL��7#��!8g�t<�l)g,�*MF��9��3�X���3�I��E��K���<	��D����V�.��W�_���	�D*��L�wwq�.p�!�ô�!�(��[:jrk~�����?�&y(��>�%�n�O��2���p���A�p�6j�2�W8��z�nY(6/�݄��-q
9�.��������N���P���줮�?�����y ���'�q@���S�`Z��g�]�!U'�~e	��U�"�5�J���o�5�V�a�`����!��I�Z&R��v�0��3����ʏV�ʇ}���1ȃ��:YG
��t���:�=;�ٟ���s�r�P�[�%D�b6�b)���ԟĎ��`�9�%ad��ϗ�h��ѝvL�A�L��G�>�o;�}�ִ\�v�z�1���#��.�~.��w�d��`|�v��K�ł��d/E�a����Ԥ��|O���J�"�zx4*��H�?� ���I#$%�T�t>h(��BRr��AV�*a�[/$���dU�¨}hDV���&
�7���&�)��~��ΔR;��T�"�e���x�+,cK�?��$��XP�~��3����5�L�i㽡����F�X�r����:~�A)���)d�Jǜ"	l�Q��\"C>�R[���
��y� �q�1�>e��%eg����ԕ1�>�-��D�;߸��S����v�.#ZLE��-�8�WyG�f��
P>��������X�q�`��J�����C�h�6��\�7)r"_e+�)~�d4���6�	G^��s��U0��u�����.A���Y+�	)�up��g����:p��qR��N�4�a�㪠��(@�$�|��U0<��$��7�H�9
Mf�/"�1�?0���p'�H\�L��;��t����f�
⥤V*�,Q�^��9�Ǖ���;&�}w��T��.�쑭s�3�zo��oxhW�u�Yp�FL*kϼ�m��nM&<�ݓ7"r�J~%��4�4f�!�*�0�$�{�$��L#�I�/�:�D
wC�c}6��$����|���0�\�1�#.�~10����[-6hB�������A�{�a('u�$��t}��g�X_���;q4-�d��yW�`��aO�����H������[yW�Jb����k**�r��7˧�烳]L��-��.�/PKk�mW>�
M��.(setuptools/_distutils/cygwinccompiler.py�Z{��6��ߟ�UPH���̤�6��M��� M�ȣ�E6�j$z��,
������K��ٴE/�Ll�����&�(*+�}U˴�_益(Ķ�j��f?u�cUr�
g+5�Z�YVԹ��39\��L��ۦ���m��]O�i��˷l�
"�/US��L{ֳ���M�W�������=<�l��6U�a>��^�=]�X"�-g��i^�5bi~lE���,��٬�j0i�u�~�{7X�v�75��?vy׀���;�%	��(8�i7����зC?Ӌ��s·���k|����]W�<�a��w���d��=�'��xB�OuޯE���eL������w��%�������m;p��4b�d%ǯ"�1g��B�5/h��U�\�y;�Ͳ��XtY-��в7��|�k�>����^��yžKO���Ó�s�>Vh�;�?,W�z�O�է��_���|�h��}"�xD�?9��{�}�=:vzb�NO|��zp�'�����xz�<���ώ:��~�>ҀC������r��Ga�;ܡ)��jx�}���u�I�f3̰k�k�H��j���)���s(�h�*�ޔ����˻=���}����rɮ����]�o�1�1�RKC���{����T�+6I�x�b��&�*?}�yN�)�a�T����[Yd�����0����&�s�������磌��67"�x?t�!b=��yo�}�?�)ʼ���L�V3I�QFy0�q��-Yľ��йdFƙ�qVV��F���6T ̯jN�^��L�0Y��@�Ă�R�9�u��k�
���j�}�迁����uPyr��6)��1cҒ�َJ��?�T$!$v2�-�(bqb5)�~͸�&�ThneYW����o��q8_ֵ]S�i��"����k��< sNJ�ȸ��-��Lj�
�r�UM�gY"y�^�~]!~\�,X�����W�.0�sq��c���@:85�@���*9R�Zb3:#�XW��&��K����W�u7ҘHc?���T��F{�>}f�AM?�Q�E�L�T�o�Gz�$Ғ��._�����?����m�3�1�-��j���t�J�e#G�|�,�4x/��)gj�,����R4�0����X��!����+��N��<8C�7��6/:��0���E|	�y��D���'�jE��(��y��ǖ�{��߿O�c�7�L��q��}�Fq�z$� �+���b�ɹ��X��/b8���d��K���,���Q�L�	�6���!�/���
a�P�Ry'-�;Mb�����s� �"��|��,��+����Q����N[3q����,Co�h���{A3��s��e]"(4ö�cq�aMI����-�o2��C�X�o������0�7jmz�ߠ�4%�+�\"�)�&����A�������rC@F���x��<������@�a��C]?8;y�𡃱U��yBb�Mh�IL�Jb���:$x��yI�:͡��E�����uuǣRGJ���j
�Q���k�_4�<sqS󏼾8[��J�w�9�<t�&E�ˤ$һ��^\46l�"2�MW,�7��A�yw-կ.�Z�M��mKV%=��D��u#�Nɓl�"E1$:�)��R�yI���C�(���0iW�dE�o.�M���F�yEB��J�Cp������K�ܺQn�6���̞#��*22��"R2�0�M�{X3�����tV��	֍Xy-�9qK�+ ��pBqPe�K�T�=�̹y/6��V���<^�Xs��P9P�_���0��$�Ж�_K.�x�uAz�M��
2��	��/E�M8~t\��c5�d	���)��함��*OD��Vr�8���&�I
[e��m;�0�"��̈́V�#��T�H10�{J!%��η-Dkl�_��U뽂���83�3�v�ҟ$��������#�8:Yn�,�cf��]y�i�l<.ˊ�5����!3�*e��0_��^��f��\na�����,U�nS���%u� T�;��H�~�A]�U�ʗK*��&He�����3B��I���{�z���?>!���*���5����R!�p�J)@|��
�R/mnh��X�P�t��`U���Jq��Q`��pA}!SjP�Q[LP!�P�YI�7�
<R&:�A(W�
5�Jj�ʭ'8���B�R�3�mP��.G"婂9W=AD�oEQG���1�Z�PK��@.��H=A�I���[8Aoxݪ�p�&NP��ШB}.2]FQ'&�/��ߟLB�=FӔ��z���꣦B{q��qy��H�%![R�Ќ
�����U����hWn��0l�;>8�k�p�i�F���Wa�������
P��$s�Z.|�}j��4\}��i9��я�~x��������"z���Wo^G��|�]�)������R.o��zX�x2�C,��6_-�-!�y�k��PR����[})@{v�r���?�ó��,eˋj]q�)�}��z/
�Gvv�a�\9�/yX�|�?�e�~Nj�X(G"]H!?��{��Vg=�$�ȍr�࠮���ϔ�((��Ũ�0DH%�;����j�3`�(�Z�J�J.�P��������y����kQ��C����OOh*�Є�.&`�ٻw��*����o��U4�mU ���'0:���F'���?Hl�ZDK��p�0ӵ��������2_o�ͤc��c�:�	g��F�
�m*�~Aڀ���`è�x���G�wq�x�N�r6���Q�Rn|�H"�z�G�y2�5���i`�Ω�v��_6���M���gmVT�����ӯ"l�K�����$OrG�J(�Ӌ���Z�#��f��oD�mxBN$�I#�Ki�;}݊x�A�[.ًJ��0�P�q�*��o�x
�N�=wFr�m�Qq�U��]��epT�4���1@F��%�0���Z:*�ӿI2d�q�j;<�!���pm1'��T,�!d�:w�	��Er�2�6�#N�註B1H��ңPf���_,+!��d�'L����}�G���4|�����,���GL�g�ٽ1�C�5���P'���c���餹����H&-��7s/&�=��՜y6���N}�����}���v�����2��$6��ԓC�Ofr���J]S.]���
azY�;�9~�����������0~��şo�y��{��̅�.S�|TyH�K_�c�d��nUBu�*�<�^�u�'���ynhu���aRu2dl�{�\�L>�ͼ;L�gq�C//��QR�`���ՓWo?{I����?��ˏ鍭�+��}C	�F�~5Q�x�IB�m�{��R0���R����*է�JyWI�����fwa
�XO�������k��t��!�7~c\�2l��~�ݵ`��.?(�s�)�����N��uN��*\����?8itDhT����x��f@ѱ��
�!�:���a�[-
U?(����ȶ���3{��9�\�E��#�J��c�M<�$\
���"�T۶�k��\��No݁�t��p���D#ۑ���2D�U�E� �<QU�(�����j�S�I=��,h��/��#�.��
�pJ�qB�,�n��ҍ2M��՛:�����5:�Uzn0�dd�.��lc�&�������/n�M݉�&vw�|f–>"8!��%O�,�7Sս�xb'���=B%eJ�I5��U�F�(�qp�s"c����@hw�E��Nܚ"�;z��|�+�#��"J\Q�&�fLS���i������N�!
�#�cL]�u�P�__Ī�EL�I)��p7�u�Pv�w,5ҩ$x,w���Wa�ओC�M�ڍ���z�1=�qow�
ݱ)LT�ws��O�\�����g%e�H��I��h��6#oA������Q�n��E�l8Q�uC����_�,�mk:.�i��GD��X�����&��҈1�K��4��Wo��%xS.�ƕ�(�?VT"�0�|t{���
��8QF�v�[��Ծ�G�t�v���$�C�Q�{g���H��_PKk�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�\�PKk�mW�5�V
!setuptools/_distutils/dep_util.py�WMo�8��W�*(d���c��] ��@��� `$�&"�I���o�!Kvk�#��
g޼aʲl��W�[7��OE�7~+�͠k��v�1���V�ȫN:/���Y8��I�H]�lh�Z�
��Z3�n|vK�uf5�R�-�WV�ث�
���B���[�eY�XO�k:ZKk�u���O�h?�WEQ4rCZ�]83ؚ�!�V��MAx������ Im���*����H9ꌕde��sg�Q8��	��[����Pc�ӕ_%�
R����]�6߅(�N��$��Lt0��J�)��P�<��,8���n�Sޱ��1n��[�s�,����^�Y�\}�޹S��ލ����{�]��<�[`���P�'AЏ�r�����ϟ�����1*�ʌy��q��e�u���p'ԏi�v�F��T|O�Pv�D%Z�e�:�!��{�Fs�۠��V��l�-��S$E����<+�Aagm���7��-��9A�i�C� )<��$��9��L��D��N��k��P�\Vg�Q3�~��Ss�?�����!�I��n@�<�.����e��=�m.��ЯfW?����cz�6�o*.�h���c��7��8�ϓ�3��� '��'F^8���w1B����G��=�s��Ӽ��S�AwU0���N,���l��%���%+k�Z��!�p��j4:WA��`�P�D(S�4��)mD�A�rn�%�F�{<CTq��[�Ѵ��u�
�g/ax,!�$���r�n�Mr*��Ӣ9+���
=�fOCS�p�|��lNi�xkp�eu��Iy�]��ƴ*W�c3��XӇ����aF�ݱb!W���:�"i@n��h��=�j�Ie~����7�x��õt��Tހ�jۈ��F=�
�"��"r�\9�fh�R.���R�\x�p�~����>`�y��} ��������=��$cC�c�r˹�]�&`��H�����\9.��ʇ;�1U�?��˨V�~'~J,MHG����8�0�{����	f~�I���Np�����jD]'%�1�-D�+�A�����lwy~���|�����7#/�M�w�+�����c?�z�	:}rs;��SZ���_ބ���
z<da���գge{� ��43�BS�$�!��)
�ƾ�t7���!��l�U�N
�w��D�3�,적���qa�9��뷺��ٞ���ϫ3�U<��g��dH�a��?PKk�mW�m���
�!setuptools/_distutils/dir_util.py�Ymo7��_�*v�]o��9p��6��K����!PZJb�o]r���{fH�$�g ��;��3�g��r�kc;���]ѧ��?�_ۣ�v���2b[����n�BZ]����֭VF�*�>
�*e��r�X販[+j>����Ŷ�K��s����xWY�V�xC���[](~旯�z��b�Bl�f���Q����8WWBWB�&W���d�*r�UyW岲X\&�U�RW�±��r�*�ۺ�q-[���R����(����U�U��s�X��+^�rq'�~[,���*Y��E��W�^��Q��ڨ���4����:�Ⅸ�?��o�7����+�(�Y�om�)��2x3�T�`��"P����G�� �F�X��""#�
K��"�m�<����YY�d�$6]�*Ī���D���k��$)�#`5\�{(�X�oRC�4�dLW�u�8{�wS�Sj8Mf䑵�j�9)ӭ�(�~�T�;KnI����+�b���M��ȧ�Ţ퐸a���+uU�(K	;��f("s����z��ڊ�,`		O�hc;���]�}�j���AAҐ��@�V��NJ&❍�Zh��h����%%p��:ڊuQ�����@�]
7��R�����A�*�M��(���q�Ӈ]Q�e!&��޼�*�M�M]��t��T	s��{D�%a#y�jc	Ծt���6�N�3i"q/�ƹ�
�.;$bM��-����]�-Yf�%���c�kI��>}Bx$E�¸V��(@Sp9蠙�0c�A�{=�!	�!��k���Q��P@���*��]:�bqnUi��{�ׅS�����4�GI�F���-G�{E��c��	�!�0��*v�ݗ>��;�)m�UZ��\�|�W��;�>�6����r�i�Q4J�+����e�l�l�ʵLI�V�Ά�I�"�d�#��={B�)`��B�F�%e�f�T�����͚V�
�4$32�I�X�e�2��jm|���3{�/V���������� "R�.+���=W��q2>��Y��:b~�M���s��WtO�g���2��5���n�)�9�	�;ꅯ�%�N��
�X��!�y��K�d��ﵮz�^(Z��\�{ɳ`�G)�@�uթ�jԈ����T$����E^�e*N- @y
1Ua�������P�(I2R_6���_�a��'�z��1^f��C��ͧw>2��=9�E?�6�����'�“����ܫ���G2Q�;���>9�n�t�&2ـ;���O��9d��q��l�aB���6�k��.efb�A�S¢ѵ1��E�Ga��@�h
�P�;F���A(�>FP���iI��C����Q*�*�P�!r���U4ׯ8*�:��8X`B�r�ā��o7��*;��͌�&�0�34��P!|GG����=h�l�䜀�m�Ƥ��n��(��@�"��Hl��k8@���0�DC��/�[�
t���p8Eh%�|�Z���g��PQA>�O�܀��PbR�$=�y�3��l,�+��A�U��F���=(j����wj�n��"��?�ݸ���>%8�Պ��f��j���9� ���ڽ����Zs;�zK����H�5C�f��`fDɓLɋz�HY�#_[�����7򫞐��*27������m�.�L����J��)A]�1IC=�Ub��H
��24]a��$�C5���F(�`*��3lA:�/u&�V�~��&�CS��A�q�l9(��/���P�H4��{�zr=Ć:K����|7�GYt<�`�na:
`G9�D�G_��.���e���Rj��ڑ�{h�����z�,��#�D�{Mq�e��:��Gn1�&@(<��h�zڿU���m8�<����N�k44�G��s��1ʤAç3ۧ�t
��P�.y-j:�@�#펢n%��.�t�3�������ή!�y���4v�M�9�K
�i$��iᖪ_��4&@��;P���@��o?/
p�]b�āI���:�1�%�����}�����,�
���z
��B��-���K�
֕5�9���A��<����\�O�+j���ʯt-���Y��`�j6��U�Y��Q�x=ܒ�5�)�(��&�qg�����~@ѲZ���c�I���:=��O�M�݊��@ti*>�~r�au��CZܘ#�~r�NW:�z����4�w1�5j��|���F�>�ø��8�:�k`<g瑠5=����ٷ�C�>3��	9/��ws�wޙ)%<��t�t�_��{����g�\/E�٨<�����x!ϵW�N�jS�k*�r*Ÿf�TEB�Ue��g�$�@C��N�6�w��j;ovn����IU�uəS�Kٿ�f���t�Pḙ��N����<+Y���އ�f�iz��mă���#�'�����F�E諸��e��Ñ��r�}5<�
�R�>�����q�d�t.��_��CWg/h�(0�ၿ�$Wۄ�}�UL�}����yX����@@��#o�f����2���c�5�Az�D�1G�}-ɷ
�����e��_)��d<��0z���S/W��
�=bg���Q��/NcO�d��;��CA���LתU�����|p<{ہ��O��gE���F*9�qx�>�5/���f�w
{W�<1�]W�(�����VS��r���� I|������Nb���u�2񃓽��7cz��PKk�mW*��mL4�setuptools/_distutils/dist.py�}kw�ȱ�w�
��> gHڞ���U�8�g�M�8�'3�-�M		0(���WwW7�<g��~�ʉG����wU�F�U�v��ܴs����mSߔ+�fݕɞã����u�-7E�N�۫ry�5fט�T7�֫��d+��”�ev�/7�òj�b�1����Y�OF���I���M����Z��c��զ��.�3�:�dS_^�O�M��̶(7��ٚ�-.��,��Ɯ�t���$�ir[4tnO̧��u�Kz��i����Y���}fn�Ek����s��ov�d�yE˕z�L=~�k//&��uQ-�K��0`���Gz4ͺ���MљŦ�.�tD�����,���)���f�7]}Qכi֬�����i���HOt�����+s�w�����O?��|��3��S���ʬ��d�W���?-���VYU�&ͳ��U	��fU�e�s_v�[��B��h�"{{�_?}�"�Ͳ�٪��.�o��)V�v�je�vY7�d�b���C���1ٍiY[n�M��gaDe��P-��0��o:"na�`$e��jX��:[׍���*+֝i��t~"�,��g��s�{89n���������G�_�;�/����Ƒ�F���p|Sl�f��K�Y��&��k�7��m�*���-�B������WX֚]�ά2�J�Q_XŗpN��F���yU���V��pd��!�s�bS��,j:�x2w@v�����q��G����Ⱥ�׿�[`���4W�i���KF�@t���5�-�_�C��b��n�^B���|�O���[�/y�^��
W�'>�.a��O|�G8�w(�-���n�e����Fp��Bn��Կ�AB����1��IOQ�N�K�!"`^�v����a��m�\gW%��sU�
�-|e�3���M8o<zк�	�A�.�&Z��.�m��{�
��`$���Y�3��{�4u�`����P�8(8�M�N��	t`�3�l��+��ѭ��,�́�������<Ǔ<[�%����ye��Gp<�/�U���?;T�^�uKS��#����8ۖ�Wx��+���/h��w�E��ր��$t�V�n�����FRѩ`Z�!d?�B&�\���ٵ9���j.�[`�x���9����y(K�$�AD43��ׂN5OQ�$��O6t@���n��̍�Xz�w�)�Z NY\��痛���Xz�CC\�[Qf�(����m� �@i��ݦd�E˦�fה0�i�xW�/65����<�R?s6�FH��G3�b�eu�\\�X�J�@�#����xRv��E����"�d�I�v���)�]!��Ct:S#�(W�H�y��K�[�<�Voa���]���;�׷��/kXWX�`���
���FJkXuM
Â1�u$�\�Cǽ���� �& ��<���� !��򣣙�\�v�7�Ϩ�W6豰��h�=�LU?�7�Oۋ�`$��);��z=�W�a]�;�3�Ј�&�R�˰ߕ���v�M��#H���(v��پ5�l���n(���BB�;x��	;�JgWHN���!x�����b�_�	yQ�~�{��+B���_-r���p���*�|��� ��~=yF���f�(F>�����pdS���yCuc�C܀�Ư��5~�$�
��*����\M��+'�8�%�]S�ˢ���z���6�a_�i���7��Rl�@��݀�U��;�[�0Ĺ���6��o6������g�!���.� %7q_\#y�&Fɯf����z_�Z���ސ�k�WoS��82��ݽF��uU߂jf6�	&@u���k�><������f�o��ӻ���퐽	҄K�)����0;�+KS��/Uw�y��𛳙��a��G��Q�٪Y�EP�gw�6wC�СrЦ'�2�kaJt(27G{�fa�v�m�Q����y��C֐�L:�BP
�����t�@�m�1�W�ڂ��ٮ#��ߐr��H�gi���|B�	ynD�������K��B�b>-7{����D(��Y$PR����~D�g��a߇ �u�CП Q�Qnv��!�
b�`˛5h]״g���S�Q���4{����v��5�%�@��Mk����Ʉ�: �2�Z�JA(�iLy6.`�I������nG���Oȩ��1!�N�e�Z�X��XX�:<�� ������[�P��d��r��PYV1�Y���0[�{�=�X2���@�Dv�P_r�*�-�Q��6�<(�z����0U_�#W�#��	�o���.�ʋ(O����3.��f��|W4�Y�O�<	
�\�̉��<����X����\/DϹU"β���(ӟe��$f�d܃�9q���)�auB�٣����s2/���������vj���ZF�V�`x��$#�����J㱿5h�4]G�y�ʘ��啂RVl��A�1pv�C�,�����s����p����2$Rp$a�_~�m��b�8i�s��xV �_h�$�_�o�bcX�̬�岄���	h��y��2�&���xl�EѲM�n��>_�z���o�/���4;���'�{��:ʾs��9�Mr�ܷ�6����v%6�i�-W�
�rꦀ6V��J?��V���t]^�������mD�"�7ܐ�����}�<��F�w*�����������E@�%\!.����}�U<a��1dǭ)��L�|	��)���u]�'�&fV
��º�]��f��SC�V����C�_?F�Ȑxc����5�G���l�H��]�Z�t��vj��S �?����၍ؓiOA���|�^�¹��>2F��	�쓢��M�-ڷlW"�yh���d0��H:�ǧ��)ک�UI0ne*�s^t[6�*�Pw�$Z�g#�.���xF�IM��;���Zǯ��1o8�-1�����t�&8�ȇ�r���4jP� '7@5�9X��L�!1����pv.�
�&��J@Y��2�mj��d���Y�㉎��>𐸿J�	���3�Վ�,�V	Ʉ{F+
���&�+�g���K�%��
\Hu�����7Dkc�<�v�ر)3S����P��LhbE����T}]�)ϩ��,�5����7`��Hะ;tZ�r6��s?0�t�O#�O��|�i<� -��M)��r�l�G�[�f��ߒ����W,u�ưWk�B8�V#fV�����ŨiZ�:���#"z�xֺ�t[|��V�G�����h��JX\�ň�XE$�c����>��@���/] ѕ-��Q�#m
��<8�@�Ыb
#�~v� #�H�D&J�Awq+T7�*�ce���1�zg-�n�1�O�\����kп���ѧ^oʋ�IG��l
lg�����-;M�/+��q��b�/G�B�+��ßԒ�-9���h�z�rc}�uË���6�t�ۯ�,����8���!��ed��ǚeRVU�9�V4MЧ�6C��-�/��K񩲳Kj�B�\�6��H�j\}B�4U�!��dL!nw8�@�p�Z�Y^k]�S];���A"	.�	w�r�A(�Et�T�:��]�_�?j�\x�Z��}��RV����|�Lx�	.h�"�:0�Y�qEBò��U��)©�����.�M�{�طPĊ�_AŸI�/�9j;��#MG!�X��Z)(L�m�Q��̆�%�l�D�5�PXs���+��Tr�3/f�`9K�v�v}��"/�#ݓ��^��\�~ͽ(.6�!-���V�)G�:4St���S�^c4�~a�]����Ӕ�RX�E�(�[�+�0k4�H���h�Z��ϸmK��S��ML�]�O0��b��~� !�C�$���,˓
�6�H�CBq'����P�P��G������Av�/@)c�����*��P-��#� ;�Y�" �UC���%��Ƈ�ݙ��DJ�D��[�`4����%�YE����2��:�5�S�%[P��DT�],�r����}�ӂ�Ƣ�)�5|l�O���������p�����s�x��x�PO��s.&2Q��d�/����G׹��jŇIP�C�ܐ`�1�K$Y,����z aJ.�(J�mIQja���Aa�3j�m穙�6�;�?�.�Z��e�-F�5o]Gc�6�����)Yn��D�ˊb~�&�j�Q��� 2��JY�����p����Wy����k��s�3��~��z�T��9�ܧكv�=� tܧ4aH�i`�qA3�hTFm�¬)>�ث8$�H��$��<s|mEa�T�����H价�lQ��X����ڒ	m;�9�(���O�J�E�=�*m`I�]�D9�m�P�(6-00Dl�����<�>4{p�5k�Đ��\:��<ut��K�( B�(���Y>��p��SP�ggc�C���;1�p��|3\�~8���Ƭ���e�~H���G�[#_Im,(����QqTg`��7(v� \1&����dS�RMX"�0d�����m�Ѫ���G[[�{���w-*D�8�zz�B��BD�>���Q�>�2��7n����ε�ulI8cǭ5�ȟe�2Uw6��%��l���#�l�vN$?�H��";i<��]w�x��8��@[)4]�'4|�	PQU�#�y��Ÿ[$��˳̵�N_�o�P��|gD92;� ����ü��C��يA�����I�()�{1��wLH�#�L?hs;Hd�鯦Y��g�}�t�#�0{\Aӱ�i��%^����������k5D���
X��(T��%�Sa��C�߸G��?��y����it:B�&E-G>s�=C�[�;�
z=*�bV	$��r-�Ż)ۜ�e�ʨsZ�8kZ/�A��XYw����11	��BK�!��Ҙ,��l�C�K�EV%kvJ)�@'
EG[f��J/~�fY/$9����B%j��u\΍Vy��E>�z7۠�Y�0��[,0��0b�n��E!�
�<rs�0�hq�Σ(j5�OU���.���w?�Է��W��$��1|W8�F�2��.G_
�#���-�M���?G���2��p$r�X�l6H
Ա�=r����F�j+�-.ME�}Cu;ǿ�e����y@�)o���_9�)�0zy������X3,9O�\Ű��E'����9�Ea^g&�O�wh�!	����1j��#��;����"(���w�:`^��0�4�<A��FX���k�I�h�y�m6��g'3<��Y~����t���������D���W>��O;8$�P�n��Ņ����M��y8�?9�!�*���+�\����L#��c�:ұ��s�B�?v��;�s�5�}<z��ŋ_>�{�x��/M��o#�"�3��x�����Ɗ����3�(/9C�&8x��l�k��@��	�0\�wg��;-�Q�*���Lw�?��b�@����=��]m`��qWP��h"�cM�Qw�	Ž%��2�ޘOf9~��+���[�yS�]���d+5�_J�
��8|*J�I����S�#�l�$HJL��ɩ�E�i:R;�hY�GK�Ybtȴ8�������<�96�[P֨���v�'I3��9il
�)!��a�w��.p>��
��Ҙ�fgs>�t�*B�a[�
�77��dxS�6"�$��;�ژ@�X�G��n�G)��7�+4�!�8�k��-��dA�OB��P`I�����K�Ԑ�����[�Idr���$���QxLjM�#�[��rJ�s�A50��wz�$�7w�d�e����͒�v2���}>l��L!�f�aA��DWK$�A�"�F�(PO	�]2��ь��r��4W�m�YT�_^�����ߧ���@�.���7t��4E�t{��LA���*ʶ/v���� ���7�Y��6�L)�ۇ�:a,��yQά1�����r:��b���uC]��g�O�x�uٴ]h��s
m�#�$�A�q�82�eBl��la�bә���X/`}b�W�,�v6�N�_�H:�>�-�m��!4̘-'*&c�/�圬+�_b���^H/rQ�~+y�zP8�����HC"7njs툚=BC���C�*�1�r�#�Xp&�X����/�+���o����T]���'/aK�+����-�5D���c�߱m�B��o0�!'�p�\&���”<�HJ
��́Q?��"����P[�@U���_Q�Cl8������^!P��
�)&*M����P`�J�	�}�/cT.�bYV]��),��H���Y�85k�,�I�Q��Yl1�6J9��h�k;���P$�ٟ�4�cy���Ĭ+A���dMA�����P��jy^v�o��WU�P��3�>���9��B��kC�:)�-z�*)�%;ة�C�n�)��ӡ�+,�ei	R�
V)�涪
���R`>4o�g�G�M�X��I�B��d���ʯS&[��t'�Ip�'�%��֟]�̩����Hʅ�p���,�JO%>�^L"6�`��-��DJ�:l�W����4�/~��u6�?ʾ
���Ausx	}����r�5��8oϨLj����GI�MHk�6(6����
U���L�]�qf��ӒC�(a����V��co�7ٟi��ܲ�F�P��O1}Eu��>�iDt!~�N�|>c��E�p��8o��Q�E6��d��RJ�H������=��P�Y�$8�kA��X�GA��۲��}�Dq�4�u��?�5��w�P`%L6��_�{�j�&B�3�{gv;A��#�|�p�{�����;R�<�f�J'{]�M>L�/v������fƁ/ۆ��&����fs�b+0�&�����G��u�w*���f1Yi̲����0���CHqv������-"ڷ
�'���+x����T2f���d-�R֌�.2J���
43��r6��S��U�k/�folV=98���Z��MLPRV�zz�*��Xv
+�I
%O����?��7y��X1�������d9붶�͈�r�j�a�2Fr�t�|�ֿi)h�u���e/tqA��"N�B�Jf�M�����C^(��O�k����W.�����w�:��VҲ�ٌ�BQ�*�ST�
�zMA�k/rGl���msmi��� �����v+2<����/��~4d�P���ʻ�8�F}���S��2cуbWT�COA>#D�ɼa`Т1sPg�W.�+E^ߓO�ŧ��$�7Hꡀ�s����='y��Ԝ����~���V���VJ&�M�'�?����*,��M���ӋT�"||0���N��,��c��ޮ*��Ӊ�.U�8i�bnq@�;N��i�b�i@��ibX㢨"S�D�:XE[.	�޺ƨ���cV������Śڏ'�,Q�y�����L��lؕ��i"! ����0��~]Tvc8\Ι壥ga�ժ���P�bm��u�溏T�u����{/�e��l�Ѡ�n없��'�h���8T�u	J��W��W��vy�.
YS+�)E{k���)�z�S���1{�w��w��d��|�[�RXj�j��(��2@'���M^O6�l�D����T�^S�	c�4��2�s�3�޸k����I��i<ם���-t0�l]~Z�G�4LE�{Λb�w������~J���r��V��dlP\�W�w16P��p��R{��P����_�{ْ�f���{@̞$mC荙�p�Z:�{�C*�Vf?�8?���?G��ʺ���W5�r��)�H�Rn�����\,^xe|çD�?8>N
�q�%�0`q��;������T�
�B�8Q��5����F)����i�Yм�g'l����-6��p��^��`�~�eoo�׷޼�넙6]�EC[ٽ��b����Ph�������I���'ӓ��T�x,ESb���̱�$��N�#'�^�K�mΰ��O��ޛ���|�L�]��v:�Q�A_�`�XH"?J��ȥ�������Ҫ����7UeV�5��,deⳞ���&v`iY�M��k:�!}4���r7�k�����d�i>�g�|reB�dW�(4'���q�1=֌�<Bm3��K�g��.�A�H>O�R��*�?0[͕iJ]�ဤ�T��t��F�s�u�%_��t
���[�#��k�;��T-��w������`ce=}���v�u�{1J��T��AG;��b#��oenXj<��
���b캥K!�2.l�Q�B�I�g��e��L3TL"����B�?��^�h�5��5���u���
����{J�jL�����%����C䍒���8��(ߣ�34����փ�*~"v��I�O�B�w(���S	]�8�L�U�L���E(���>Ri�s8쌕���˾Mۺ��Z,�q�%�I#�W�e�V�����r=��$fp/�3|�f����r�}�������Go�?�����lh���Ə�Dž,uF�@<�ME
���FN����y�WңkB25\%��N"G��Tff[s��UI���2ށ_>�[�����B �އ�(v������[�\��3�Pq�xG���׾�ol�'�1�@cqN�2a�g%�Y����K�F�yk,	�ד�{��I\����6aa��QD��e�G�Xr���LT�j�:s�qX��/���6��}3��p�{Fx[|�SJ�F�Ú�n!�)>���G�ϣ�s����j��/��c@���;���O�'xQ_:����sc�%���P��FAөd��V5PL��Q���
}���b��$�����C6&��n�?i�{ܷ#�۩hz}�
ˠ�Ik�eL���bc���*��'�V��L�Yw<EhK5C�檪S�1��x)��lA6�����8�:��
�mP�_/,�Вy(���^=��>��0u��0�Ѹ��G�~��(4�񲎲���6�䶱�j*7հ���p�y����=���YR��$5;�)�h���;�*��6�P�\��ͷ����8Fϡ��.���)�֐��|9@��Ap��IMJ�%ܐ�����(}^Dl��Q�w+�u�3������09y^�o�Kt�Dl���Ó5���r�����;�c~Ѕ�luȈG�ޕ#��-
��������
th�gm�(�;E��X����a~@��xl�LBR64���Exn�8ڡ���;�bZ^��گ�F���PE
���:�R�p���*�A���
���d�l>�9ٌb�@U_����3��a��O/]��/�+���O��1�O�[IPs3<��Ӟ�z�У�57v��	�Ƶb鹹�'��	|(N�ߒĚ��e0�;q?���i夢y 9_�D����D׼c�����Aך|0�OO?��M��r��W��@Tmތz�bd� ���\X|�h���u�ba�ɵ�7*Bϒ;���H�H�?�����U����ɿ��rX��}��R��e:��ճ42�Q��tb+�WX������6�	�{c+N"<UN���N/e�7i�&��]
*`�A!����d�μ�`�&]γb7�].���0�}�ќh�i��F
�u|���\�!�WS�{������(��^h��֘%H��~r�)~R"8�b�?^2�g���&���@W��o���Hi6�_柿��R�P�C�gs�gOĠ�K�ł��b�>�7��:s9%[>L���p��z�m�Ѓ�iw����S5�I��w1�(nI!e��ҋ�'��[>C�'l��9
��5z��x?�ivt�P�eu9��^DvI�L?9� !I��t~*�x�S�0�A���F��Xy�)9H�V�]%�`��Dd	7ɟH*|�TI}���K*&|F��񖗒�p˽�
�#��+�p�0A�%MPjH%�$��}����L�r"݈��w[��4���z�:�7����K{�d�B݅��;;����2S�ݚ�It�Gq�$8#��N$��E����bq�����.��"Q��M��|�K�ET����r�+a�D|nٻ���~h[��j��[ST���<��>�O��f�
NØ��vD��iD�A�/Z��*�6~ꜫ=���бf	8u�)��λ�ߛ(�S�����\�D"�'LB*��9�O������J�t��('7�WZE7W����#TPWԍ��r�V#T5u0�KW�r{���
*��"�3
�70*�3Ӽ|��¡|��m�J��.��q@d�t�j�np<�VX��~wm@
����O�v�	�B)�'�KR�Fq��ޯ��e���yJ���c�l\)�dr�	��T��5+ҵrў�eh�~{
�b���Z�K�5�#I�3}�(<T}Y�� �� ��
���'�~N\���*a���?OT�;ꅖQ�����p�����D�ø�^��W�����#����g�g=hOC���@�m�.���AX<uДĭA�cR��G��{U�Cn���%ѱ��m'(��G��ᡴ��>	裡i�ݱW)7-S�HZ�I	��˱L�]�+��8��Z+[�.�ۺ&�o0dr�K��b�ۀ����l�-Fm��0�����p
t��qw�͔�>/��>�S��{���3�K�v�!��a$�Ndj��|�[(x>�7q���*��	I%�c��LI&:���J���+�NV�&�+5wu�tw�j��2��4�8�X�/����"���%�&t��7��#)�<�
��Up4���RBd�z�R�^��"<��a��k^t��
�.ou�6J��Z��$ځ��u1�%ߑ�g=4����T����?-w�	}�K)ٳ��KSw*���x趗"�����T�6�+j�V�Ñ̩��%tᥒ�h��9IʥQ��"�&ڠ�'rz����,��Dـ�s2''3�67�Bg�����?�Qӂ�s���Q��ձȣw�*�|��	�1�y%2�T�SD��JZ/���O�I��,���<����s8O.�>'1��ܯ��$�=̎zfgr�������*ҽǶ�	�H�TٮϘKOq�3W��Z�S}J4+�Z�bdH,@]{�nG�t�[@N�}hurW�8�9���[�ݍ���m��F]qp{��1����h�.8���t��XY�ʖ�ś1�k!�A���r�e�lG\3�kXQ@�-;���i��_�k+u�J$"ʅN6�dq��c�/Ϯ��~���48P���/M���'�*f�U@��J�G�CX��{-��1!�%w��+���w�=<�x�Qf�B��Swx����q�T/З�My�My�k�v���1���M���3���妐���I8`y��\,r�4	!��D��O_u���V!\�<]�
�L��rІ�����_��M5��C!��䋯?f��QZ�t6�����ΐ���яI�,=(��0�쮦��q�Ƹ�WL����
��$j$P�=^ݓ]�T�Œ�_~�ł�� ¾���IP+�q�U �B6��l�[�<NX�J5�]Gn��n6���B
�Ȩ'p8>��4���QLP�=�H.�����_�z���o�/����O_�xT�!P��4���da�E�����
��0M�i�Ǿ	�����
Z���b��R��\��~������ģ��U�J0��0�E8�o��/�f��ojTb�ѽm��~��]�.N`�(��	�+qi��;zC)� ��5_�3i��[�)�\/�5J�i�K�gT��5��`#�`�hr,ز�w����Ð��6�H<��7�B���������Z�`[Ll��ڶ�
O����klX-Vm�Ϊm�rף�v��ͅ�$f���C�	/ �����;*?3P ~�G$�R(H�����M���ϯGC5z�ij�?4�����6��C� 9��@Ld�X����;��
Y��?��}n�`�XRM8�
�,�46hj�F����h���A���VɅ�ߐN�����!\G���4�0EJQ�����b��0���P=�)Z��^��rK+f�	9��+)�@@��YR�)�@����S��O������+�@t]'*�:N0R]�v�hO $ﺇ�)�<�Ii�$���'�x�XϺ�ϲ��I�|=����irL$���Mt�\C�Q9�w!֝��N�6̺n��3Ļȶ¼��]�Qa���)��q�X{���1�9cF9�$�C��
Sʳ�&(W|>�?nA�2�6@���>�0��7�M�Gd�X9?;��XZNR�?ʻSs����a�ٷg�����x*���p���/�&'ߪ�|���_߈o�<�a���䔺7�(�
��ꔳ�1����*�X��d��d}S��2������Hp�����6�"�
 �E���3��r�}��_~��+��Cw<+�G0z�4}4�#W@O;�g�:uG��OE[ֶRR��1�׏Y�`�Z��w�=��e�?����u��ֶ�f����/�Y��b#��!�Up4�_�����#&\��0��Yr��|�f���I������̳M�
��8�׌���+TKw�3������<�O�7�1*���uQ��S=��N�S;�2�{�J%H�4D�VE`>���:$bO��?n��9D�xm�=����-�;�]�@��k��1��e��q"Z=&�>��F�-R����ٗۅ��r��o5��1�m�,����xwjMBz����F��D� ������P��,��"xm�j�}��R��a�����!$G��@p��׿��[2��5�U�XU���c�L���\�p\a߁��`jd�Xo���Y�V�Cf�����9EC��Qd�b���y-<�Q��rz_b�A���{���0����
������>�D�]i�~�cܴr�1Դ�mb���Up��o�<r?��{��W,��F�5��x͔"���v��td����X���h�Mޜpm�^��Ur~�gu�)�6�A�z��Uؘ,.ˮ��&@rE�
z������Nս8�j�ޓ����mx%�]3Cs	%J�T�l�	������5���PKk�mWd�X�setuptools/_distutils/errors.py�W�r�6��+�`yF��''G�R�d�bO�ɦ��XX,���Aj�":>�z{�u7<��+b��	k��0�}���T=��E�lP)P��^��_Fպ*5�J��"�P���l8U���&�
Q�J����O�X�iM������'�	��n���R��*���iO��ƥ����V+$믂�uj�lA۵*t�J׶�j�%nSK6��lv�3c-����Q��9�y�]���2m�|T�|��yT�".=�0}[8���9�Zݢx����;5?@3WH�Sn���z>��f���!a��������ޣZ�r�0:��M�����^��C����c#|��h��@m�R*#��h-��qm�7\ @����3�bF5	6��D��rwz���H�s!��qxS$F7�/���w��IMT����PnH�1���S�� ��ZAj��حxI�u0�Z-�Bm,‘��!�$�g���j�e,bnl$_뒦����e|XGN������R�jm����Y\_q��ۦ0��o/��+w4f�in8O��d��y4��J��V|�o��P��Hs�����|1S�=cH�0ƩadB}>��?
�B�RQ,����L)�+����Oa{RE8�^pJ���!J�������TM_�Ɖv�m�%��S @�_Ɖ�G��!�;�e�C��M1���ٺ1��` ��$ <�|8S��_����=�&Q�p��N��H�'���#�Dv�#^�"���Z����Pz���],%c��Q��t�`a�ӏ��]b���y����?H7��b"{��yvOW��y�H��+��b�����h�&�_�m�#�`9a�H��h��@�+�^c����{��|X�2��?��FGH�������٫�\L�=Ǩ�)�CO'�YB��V-�L^*�⹽l�ar�L'��{v��D���&����1
7rH��<���l��?��)(n���Ӆp=��e�b�[����k�=�Ĩl�����vd�?�~�irq�fs��I��N{�4�|�����?-����,��L0K��`	"[S�Y�{�{@�?L�|O-�41�e�=׃��u�?�~�#
L_�G
r�����P�0gO磐�^�^2:\{��7>j��'��I>��5>Vg%~�1�4����L�&/��;��?�	oy;m>m>~�;�p��;܏��\�%��wS�߽'��\���k����_�tſ����,�}xw����y��ˍ�]�o.q���4�1[\?K��g�L"}Y�1�YD���sCľ��PKk�mW�~&
("setuptools/_distutils/extension.py�Z[o�F~ׯ��(L%2sy[��"�6mE[4I��a#r$MEqTiY������&�nZ��E����T��eU��F�T��&�L~*̝N��F�o��H2i�LTV��4�B/��~v��h��LZe��saUY��ۗ6
�`2ѻ�)Ja�:�"��N&��F[�G�P2ˎ���X�G&)XV:K����v2Og��K���M	@;�U��[E�6AP�o}1j`EB|g�N3`��9!RdbңX�P��֛��m���%�`�eK��Y�c
@@���=��`;ӫ#�)&�D+-+c�k.�{�SF�Z��T�PEa��d��-D�.⠐IY���=��hr�K�2kf$��3��2�?�������4q0U����#AV�4��d�VW�n<ɡ�S]��̎$Â��y��@
0�H�Y�sGД���d�d���|"�v��ʖib����JȲ�V%[*��	��{$5�$Gf��\��3�l$ܘ�ZU$C�H
�V.3�P|!Yah��1f[��T)��������U�F�
aHor[�<Q�B�v1�^l�D�����8�IV���)�2��5qu%��(OrS>W+�)���rCώ�� H75����՗�����Ƒv�@͠a"�i�#V*��f�a���]�`aL�,R:Գ����s}/V�؉��L6WV�e!A��"�X�:��>��%��I����@Ț�����V����{L8��^%z����<��&3*��E�Ĭs�o�6���*����y�M�/�S��O=(w�s����0JɆa�мA��Na-ɮ�vC�y��j�s��ɤ0LBسΙ��Y�~��&W�S�4�BIP��$>��"ȳ��W��L�Zq�q��.����\u��_�QCQ�Ci��n*�(��R'BY�K�~�4UΤ�V�?�ڜ���k�!K9��`Q��3��r���N[��
�[�#q$�u��.Y��}88�KQL�[Q�����0Ԕp���!ʴQ��;%�^��F��UN��v��

���8;�Ӣ%S���V3j��
�0��@ǃ����<�d{��u$�z�dƥA?�\�q�N�X�4�朳����چ��J[�Y�n#�*���Rm�$�Q�(�8��8�9՛|5uN��=�U]g���Q���I�5�k��e�V<���C�u��+2�V��q�.�䉶��Wt�}]��ˋd5�cNKIB�Q+g�)f�r%��JhH�=�*�Z�`iD�*�T�Mі��z��m��P:G�/�N)��F�l.7ێB�9���i]�ҡ������d����T}�*�����).�y �P?5�s<��Z�`���Β���J7Z61�5&G>$����x.�k$���p�(�A�f?OZ�	���*���U�^�Z7B��H�"�8S�Wy���k�Xӷ�P&�u���vm/5gB�����S��ѢՉįZ��S�YRv�!�-Z}��Ƚk\Sϟ��@�Ҙ=N�Gɚ7Yw+�����Ϯ�p#DX��u@��N����yGթ�O\�K���Θ.į��2u���A�~��ܖEE�oFB�D,��}
��Ap�ت�m�S���9d('�bAV�X��@T�j37힋Ƴ����iLeV��+{��g��M��[P�`}�n�%�ѽnX=Є��n�l6�|"v�!��W�����<�H���e�(T���r��'��VY�9��u��v��9����+kUA���)C\��˦Ԑ�{�!���›7��tO�9
8�޵���1�|�С��L��=뎸w��Mm��{������aq�-�7���)4Q#z=A�oF������=�U{V�у�ux<^��\���H>{�Wr�cu�٫mU��Y��z�F<�>F��I9�$�Q��l�yqD>�ō�4�*n��5��f�<
��3��R�rc�]�Iё���T|%��}�W��)Ծ�w��t{�=s��e��9���|�wag�8��IoG����s��w׏�#z��n�͈jd3�b'|�� ��/?|�>|?|V|�RS�a~q����U�a+b��A�b�'7:\,f���E�у�t��H��*��34h^�N�W���l 7�˹�����p��i���f\�Q�u�wf��G^7���\Q��Y{��/Vz�{YX
\[E`g�0�,,�?�iй(�'cpK8'�����k]U��?g�Ԗ���2�.n^#����5w��a�
ZKnt�_^�;����	ІX�ι�r�Q��>s��=��
�H�*{m�4˅�	#���b�-��oZ?�%��A񥳞�DE��K�^��b)ك�u󵎲172k��S�);���<��Egg��%�ζ�L.�`껫��s�-�E��eql��S���:�)1�T?�p�3'�=}�1��O�,���	�Y��п%�o�7���Z
y�P`%1���R�f��V�}�� }�R�1o�ߊ8v�W/�9x�O�0�Â��Q�8ۡ��qT%����1j9��'3<c��Cs�A�s2'�>���?"�}��P���gC���
)���R�S7�Z'ә�80<���炒٬�i�$�m��k��4�E:ݎ�\0 ���<��FB�q��r����as�d{Vl����*+�>뵜���`��ȳ��y�w��Aw����^M�N!0��.0b�	�;=�w��)�Tv,r
��{���GE�7a�ۋ���,aN;e<�0F@�Bz>5�H;;n���V������F4f�؞�a�yq{z堩or�y>yzĽ�O��ߞ⅐j�fD<ʈ��c�w����Ӎ8������B���n�
E�G�=�{]銺kqg#z囕��eg�,Bi˽�����'hB�(S���8�Aqt��Q�;䚖���2�Z-}�ǫ7#�C�Y,�����\��(�1�}Yq0n��������%����	��*�	��9�5���ˌM~:N�]d�a���	�,&ع��~kwS3�T���N���mu��O��u�\��<܋�DV�ۄA�L]~v�i����=�Z�4*_�?
����u�����(z�H�>��14��^]��h��?�ÿB�3X���N�t2����X��X_�`���z�KrV��}d�ᾤG��|���P��i��.7�*
���i}��{U��X��4��`~D������L�0�vCl��������d��"�,J��#��pĸ���&�w;��QrM�c�ǞQk�9��G%͋A-5�R�kS�+Ӻ��IE-NƓd�R�ū���2�/PKk�mWB�����E%setuptools/_distutils/fancy_getopt.py�<k��6��+`y]$mQ5c��f�UR^�&���IžK�fgU	I̐C�#+>���n<���x�:��@���n4=�ϳ\�]�r�K����V��l�c��5oX҈��X{�L�I�%M��V��+8%-�q�g\�ĝ(
q̫�,ɲ��E�lǓ�k�\�{��A4-x�՞8�%a7��s�O�&��d3zHn9;�T/L
���R��E˫6O��K؜��˺��k'�=��+ˤ9y�Hx�۵p��eu"%��bb�3O��|>����Cȓ��Z�[��o���F�lɛF4�顿�Ms�������fO�f����.=�"��x�h�jN=S��� 𒥅�@N��$�-���[���I	���O�AT���o����)���yu��-���e_��/��_90��,�\QI�qr�	����<����p�[$k�(@4��y�4�%DP�} qd\^� `Uʗ������A�֬	���ח�\�_���_��Q`�@�ɗ(y��&�����=a��h`b*�U�+���+�OZ@�%E�ȹ��%�Uy�~t˛-�{>���8�r�����h����|�M������Å�y��	DF�`m�T�@i�F
��8�Y��j�]�	�B؏x�\�\
�%�QO����zY&7�v���. 7K��꟒�i(�]�#P�F��Al��@ac��T��=�m>ь�w��BOZؒ�IŶH+��m�3
�1Rb�Y�`>�r�E[!
{�Ÿ!5�6�Z	���,qLR����K��h�D��+6�k��P��	(f���ze�b�K
�
_g�K�wl�ɫ��lBɋ�Bc�&@��Q�he�Qj�f0��x�i�4 ��):`���,�t��z��䤈�,�Dװۤ�S1s��0lԆ%#�rx�xή��5���:r`��G����I��J@�#P���@�C���zPe<����,���c�����@��4I�r��`��B�T'�Ɂ@�Q�\2�e�
	��@^Y�*C��C��1���=^�%q��S"괗�zK;�b����́�(��BRK*��Y���7�&�sRî��Faȃ[�"V�Gӈц�؇�vX?B�/`���"S��;�`@.��@г�)�4T��}vB+l�&��J0.q��QKP�h%�8��9� �E�؃���s )����z
4�d,���"9`D]	!C�#Ж�Nx��mf =�g^)'�L�x�8	"��k2���aha^ݑ�j	<hu�R��:�{�&�
b?p#�p��I#�k�b4~T�T=\�ڌ#�@��T��)�b@��#�#� vVݐDW��Q�1Z��t“V%�t6�#cd�6`�F<y	6�0�M����v��񰽫�L���ֳ͢�t^�W�(ߟ3
|�"�#U���!�}���RQ�[�h��W�Nk�B���+W_q��Fa��&4a�P��`Yb\pW�����5�=f�r7.�	�z�I��M��R�'�ezO��Y�I��s�C��uC���>}�$�J|Bo~�*pW�i��+��s�Ds�o�	?=9�2>.��1Ct���`)w�g�'+�p�������²8�=Ь��Ȏ�%񥬐_���c��c���%[8�K�,�v�q�?	���5R���T�3�eCTmhJ�NNyN����a�R�S
!r�2�-�6aB-�9���	���Q�Mz���
3cMkʎ�*��i0��+L�Rڙ�ڷKj�FD1����]�0��[�ИV߯�t�OPW���s�g�$�\���c�N{Y��g�h�"I4����hx6,��L�;c��Ƚ��y^Bs�_u�BJ�*�'�z�qS��ɳr#��X��9G�N���ǁW��4�ü��v�(������	Ӊ:'C�G��D|n��j��t��As�������a1��������q3+�FY��%Y�W��t��Má�\t�e���5e*�O�R�sCJ��UB����|���1�ĒG&0�.;9*����x����'�Gң(��UE`-R���L��k�bl{g���S-F�/���-z��C$�<�*�hM&���S9^�e���>��H�r*]Q�"m�&��ߨw�[��#V�ã�-�j*8���ݩ�q��1��{�!ɉ��W�m",<!��I�ʞ��n�
x�)��*[	b���k���A`�<��a��-�	�x��9��:?�
���2�~;,
ܴ�az�2ɣ�"�������GG�)$���=~O�f�D�$#��ӫ��������LW��%(D|LUƒ��?�yEB�хB�b��f��{�����'c�j\~Fs9*������I5��(ј*�kBh���K�0��ks��|LSה�zҘ������n>V�}�)�v�Tܩ�K�:Tm���m~2l>��+�V���駟@Q2H��G�����~��w���iro�yb���A��>`�!+�=,�r�6#����᭐/�CɺK�,LcAR���D�w��
�+Oy��J0:*�?/a���A��/}Q[���@�@_Q<X0G��82�5�+� |{n�ÊE$G���F��S���~рJx-�W ��&��C�ǒ'l�T-�=��Kѥ���5l���E?Fo�

Y���h'=(���؂,?�zC��:B�Ru�~ѵ \q�?0���P�c�v4��g�� 0[.w̦��~�%[:�[��\Fg��^��]�#Ϣ��n�9Er�޶�#
.���'X�W&t���Evu]�<[�?y��7�۫��u@��}���B�ϠpW�Ⱦ#d�ޕe�+!b�̈�*��bb[
��z��(�g!"�����W���J�a_C���D}�I�fWE��qe��*���PS�|�'k��d��f_O�+l���顯
HА]��Q���#��hѩ�_�id�\����걵˳�}��lc��k�޾�����?`P�W����˟E�J܎��X��iT��C���8����b�8W��d�SO�[)�w^V�~�&F���E��:W���9�|CIB���xI��Ra�s=�W�����w��[t�p�Y=����B틳���}n�Q��iT�4��)ܩb9K��1L�&��}4Y�:,��@��/��tM��y:�#혬ݞ?��S���i��+.|�a�b�+oX%�
<�N|�ri�����\͌�Z`�n��K��h�/�r<mM���4,<�(��\:�9��|+b�d��_�"����s��Dr���MHݏ�Nmzá|�9�5�nI1�_l���l����px�m/UvdڮB�n�D�ߪn66��[�~K�ᦫ���z\��?�ɔ�l�(U��]s�3��ޖsTC*�x{�G��'��2����M�w�kR��w�^���
�
<�9�ƃ_�N�a�7��D�̰�Rv�=�N7쉞��k���P<s��kڀr����
H90�]�'k�{!�
����5ɋ�u@>��
]&�It�=�͊f�#O�B}�7@��V@uH<J$A���ˮ4EQ���Y0w�loo[?���+k�tt�B�������Q���j�����~��n�د�D�7��9Xe�
�`}a�7��S&��|��g������
�Ph�*2�h+�y���;L-�.�S���(E�"������Q��>P�E�>���Fx�(�d�7]~��7=P����-D߷O���")ɕ��xӣ��rWХQ��HM���'d6�����~.h�ˋ��	z�<� 1˒�t�^��Y(!��Aݕs`?HT]�#��b!���L+*]S�B"M1)�w���Z�0:�11�+SPŅ<�]�(��lr�u���vR���CV�Q�v���BS�F�o¸�Β�~AxMo�$Z�ȉ��m@Id
�4צ��JNe�p��-�j��̓�02��`H��f$R6�qi*Ռ0���H�UZ,�H]��"��X�3.B����.	��R�I4Y�|�D�?8�p��ಓ��ϟ�U������Q��ڬ?�'���}�L�{#g�n�F�3�o�+�I�N��BG_�+5�;�qPb���m�6�*��7/���I_�^���”5��
����L����wV���Ua��
�=Y��
"U��|���t�p:d�3|K<"�	��h��O%cO$��i[h"�
�qVx>;������(�|�FMw��2Epe��]�ݞ9��eɎ
�~1�Uq�.�l��#�#�%'-Z���o����$?na�N���rmx�����:��.��3]�d�mRQC�ߞ�(ة=z�(�����FT!Q��p�6<J�G�j�hmylrl{ĥ����_C�ݗ2ur)�60�1�mC���Ե����3c9�k�W�5]�"�H�k̀�o7�~x��-��@Zn��lh��6�	�����'�Q��7��ς)+h߈��J����A���Ԁ�~ok�X�k�K����ͱvn�$��R�KI��8���`���_瘪5��Y��E�j
˕����t��F�ku��d���~�|�j�Ǿ2]�v�&[�.5'=tՍT�YJ$V�!{���(P�`0�*Un~;�c,��)Q�"�^��ɐhfu�y��Z�4���i�lH1p"�8jj�-�V�[c�g���cG�-�9�~]N�v����q�m�Q4�C�h6#k�37��<�K��xK���DS��@�6#kg�lޙ��A
c��<�nH]��5�/x��4�<fY#jV��;�H���������ዩ׳�ƞ˙?��mxr�307�R����%0���W��6W*袬�\�dVG��3�'5����Hʓ�G��]Nyb� DZ�!��b�t�A��ڔ�i���F���IyV� 4$p"e���J�G�$p?!�ƚ�m��^�
��2M�̹#T��-' �M9���sĒ��կ8��i��a��S�S֣d�:������9/���
�tk�Q�b���T��P� J��3C;%:p�}3���ϰׄ�~�C����n}����W�u0��׸�}L55�^�g[�?B�������7s��i��r��
x�v��Gߘ���^�'�k�� �l��`�����j�t�����-�W�~��_0��v�ڵ�s�"@���~cP�*�Ei����U�A�:�֑u
��Eq��u9u�b�_�&T o�gC�n6��ٔI^m6��f���k���?l�M
�d���b�1)^[,g߀�>��S�?�@�G**�����X�tLN`w÷��X}O�
�_(@kx��!����~������;��4���2�,C����ł=��/��/nQ�ε;~�ar���o+uŞQ4��PKk�mWV�^��
 "setuptools/_distutils/file_util.py�Ymo���_��V��J\�թ���(�����.e�Z�H�5��3Cr_$�N��3�h���<�5�K�|�u�f]�K�����b�ԅצvba�0ke���0�p������l4�G#�Z�q��5+1S��D�}�6����Gq�ee��"\�FG�ە��v7�΍S�4~�x�k�f����'y6��o�Ug��+S�Ӱ�gS�-�-���)*]_�n�����J�����ϣѨTq�ګڻ���T��OżY,��t�?����8y���B��"Oŷ{t2�F�B�����E&�$eO���X5΋yXQ���y�&ˁjBEiH��p*��%�dHY�TčՌ`��vʱ�}�`�s�Ў>��a0!^,���	�Y��ͷ^91X���8y|�C�+#$�^�=�[�R�KY��]�[�$��Z��6��ꪩ�Mqq��#���ltKR]�L�@$X����⹕vK��b�����e�Ua�R�a��CQ��@�����)_�}�M
!��y��K��B��ol!�P��9�2��JD�g�"��q���x�TYIvS3�-ۖ�V�^ %gk�3���6�Í�,�@s���l����Nk�V��;KU)������'�g��o�'�7,(�6��ӢgI�4�jKzVl�T(��F}����0�bpF�;�����=�;֡���.�B�$�b������gT��{��r��̪�:�i?�ɜ����$���]�[�Gt,r_��|���){�.Qw��vnz�~��6���(|�2rFU4|�=�-��65-��)5Ky�U��\,�%�)JmU�
|��:.ס�D�Jz`���*�[5�'�У
�<ڷ
X�-�M.����*)���UE/��/Ѵ(0�ϱ]9˃��Bӄ�y-&$3��|��9�m�x��vY
���v�8�\�ޑl���2seG�D��`,b]IO��Ӫ�������t�����L/T��KweQ�|�2��y��FUU�Z��v�it��M
���:9�4�Ji��3�>����MU�6���j�Q,f�e6NlMCq���J��d͏�r�'����s�Kt�<=�	��T8�)8 zLb�$g�7�OHm�*I9��3���D�L�y�'
�Ŷ+G��FaQ�f.���'3L��X���`�{��J����F�J�+��EXM�w@��\B�7��!��G���䍗�@���$��ſ�IEo�3q��,����Ne�M�r���r�"��� ��򍭑�Y�)ȫ���:8|���
u1d4���w�5!N&��S�fAH�J@�-�rq�N�E-%��+T��xB<Tnj廤����I8��	P��Ɋ��V�JG�"����-ϑ(�$3F���jŃH).b�]�X�I�w��Ռ䅘�Ëo���FSL^;��L�Brb�K���y۾>}��I�5�b!3�����b���g�x$D$G�Cg�ͤX!�(bB�C��y"/�V�TR��Xb��
ҥZ���Z~�[�!ŧGo�^>{��Ŕ�^vW�����.��
%&��zL�˘ʸ�\(3��$ՅPA���`��O+(o��4B�-p���;���w~6:��tg.�\�,�U9�+2-�7^�J�(x��F�0��Ğ�T:Yxz&N�\	m��7W�1��"������؛c���ؗ
�%��(j6`��aE���'����L����]�(�&������.�
�c��Ijs��Y!�ȁܭZ����h��M��v�>l�^��H���S�x��Ӕ|���r}��
yz�'q�5���&��/�f���gm5EQ�4���RexW�LS���7��#�N��Yh���5�9����ՕP��S}P�M���>1�T_8��H߁��b����/�(��WT��m2��DL�AwukUh�Z&C��	N�bHq-��2�BvYr��7}[i�o-�;�!>&���q�[�qK�Nu���j�E,�i(�-�Hԧ�e'fM�D�eޭ��6��1���
�����j8Qtf��OM��G7���Eal�+��
��sW�{)���ث��S
r��D��炠�B��K��u4�JaD����m�}�w��>
۱&��z��!��$@�$�Xbl�Q0]~H�w{��w���zz��ǜ0L)���y�$�RU�?�2�h���(ލ�{�׉s���_5�G⛆<��t�xWC�����i�?�tn���P��)=Oj�A�j�z�Bdl��)4X�5���FA#���7��p���B�r
�?�<{�l�͙��b�_{n�¬��	�#vT�t+�cmm�i�]τ�������Z�m~ˌĒ`���V٩r�6�B�C�8x��Ud8���t�!���Qó�A��w�c�z���\@8@B�~�8�5���ڧ��ݶ0�d�yX:���T����P3�N7�͊)G����?kb��u�
��~���خ��1�C�~�.]Yد�񳓵Gĺ_Vcý��w�|p��f�����jK��w�i,!��s�e���yN�x���O3���<�b�����x�5�U4�}|\�v�-3�:�_ldjX�-�抎����x?K"2���/��n;�[c�r�3���e�A.��X�n�3�E����s��JcK��g�;'��^�'1�w=�姅E��PKk�mWqq F�5!setuptools/_distutils/filelist.py�k��6��E!9��f{����
�m�<�ɞAK�]YrIɎ����!Ҳכ�ij�D
���̐���M��R��%�
�T���ЬY���a��\댵Zl^+���eu��n�Dz���`�V�B R�����` ��Z5���I	�4��������K=�U�dc$�ُy]��j�+�,�g�T��x�{)���7�~κ�'U#T�K�(�e}���`0 �,.~��7Ĝ�xn�l�ꊉ���V(�X8���,Hr�%\|�*���J֭f��:��f��A0�)1Ь'�nx��J��FhCc�T����Pm��Y�|a	�Ȳd3�~-*vz
��[�c9�^����n�n�Z	 @(@7�E����P>_’y���Xf&�c�ٙ�ْWrբ�
��-�q�5�R4bG�mUE��*�HPB*��lh���zf=2`����Ԉ�s6��J6�i�E9�؆�j�S]���ګ�
�742��O���j:QW�E)9�ɀۆ]�B=.ɏf<�ԅP ���L���hF2�Nl�p����B�f�&YN�k@�.n/t��F-
��I�ǠLx����P�@~�R_X@
��#K`<A	�@�9y�UY�x�>�ϫ�Xj��l>z$��x���^L
���R��݌�J1b󒃯����* �3D��I�݇�<�@�t������m]��h�K�Yr{Ua�"!`�JׄQF�d�'�tlf[8�
�D�#��	|����!��2�#�5��<�N�8 �t�W)�	��?��Z��=8��6-�<���J����qk�Z�*��ayU<ŀʖR�,y%0�����QbY�Ŵ ��:T$�o�n1�QlZp����8�D|IdG��J��@.씝g�^�N�G1�r0�Z^��$����C{�s�12����>ǰ�*-�bZ�JX��ǀ�M
1���F�i�_n�}b�^߻�|��t*��tA.t0�
d�&��˶I���?��p|�#�/TT�6b���}*.�8�L�=h�
��`��$�\��������l<�g���QD:1���t3"kڠD�t�/.;��.����r-Bu����??��@��I+�ed�r��E���"�R|ޠW�������c��g�e������CD��щR������uUo*'1��#l��M��C��C�F��X+U�B������_�o��wD�g�(�@�F16M֮ ��]e��Z4�j�3�+ �$��)�6yyFɽe�&�R�9$4c��4q��^n�6D%��h[6(m&㲎V��3%�v���<�B	L@����v��.�	���p�����>�nĖe�#
��%N���{�޽��6(y������M�
r�KY���k�'���d���b�*!
�W�$畱6'V�3Tr	����B�X���U�I��jO�f�Cdž�,a��\��c��2ܺ-"�/@
n��]�i��F��������K �1ڇ@k��y
����*�ro�B��rq��1�X��'����^����H�+%��(�n�.���7#٧��3F�O��7hr'�:�������H���^y����,cJ���P�m�5�tN�W)���zU�2Y������e�1��f�w���p�)��챂��㠗�|;�{T�o�� 9��ۺ0��c�k=GGM��{'�N�R�m��7�S�A=������^����ފ?���n*O��l��HUZᤛ\�4�;5z}u�$��|�_�cؔ��&��3�k�����K�,�/�4�PXS@Q����|�O��Y@��iA]W(_+[��#�
�؝ǜ����wmΔ��D�kŨH�W�m�������+�R���%����jd��I�<M�N�xH`q���`�*��T7�R��Z�s(�SL�F�T�ߟ�p�uHa�G����44�8�d�O-踐>%��4a˺hKq���I�
�$�:q�Uuu�W"�P���@
BA]nr���4�B�p�N=.�8��/�.�^`Ռ~���:�FM�O��G��鋳�eU��A�<D�#����΍��Ybt���"��{ޖ�(C�M��v�"@/k��N�����j;4�
����,E�g3�pp�dx<!9s���Yݸ���>��Dw\j����8T7\5���Sp�~�l���|��:	�x�wH
�+�D����:f!�1����֯��a�y�WQ�a �s��A[|d�P����:J�m({��u�pY�1-�e��ă�!
�~EG>=�=�Q�#t���B�i�!,���m�z���й7קRL�0\�pg�(�S7�i�D#��eBa<c�ќL�n#������/�����#`�\l\,�mZ�k?�V���cb��߬@���I�`%�bjNw�5����~�тr[BGĸ��cC��[rYs�w�;�LwU�;�_A������`!Le��|1D�k��j�U�Hqޞ-�/��*!�I��DǗ��b�������l���=��Q��v�`�4a� ���lP��c��F8��u���p�I�'�\�+"�M{E!���9���`Ο⶟��v4�an:ñ����g�}��N�o�'t��<%�ߛ�?���28a���?]<�m��c�4SM)�j1�w����xE@�+Ih�$�C,m%k�
����Tt$��6���%2PIY֛RV�z��J=�ltԿ�.<�8f,H��^5�w�tf	5� ��pw��-�e�e�F�̑2�W����1=�}����xMI��Ԁ{���/|]�¤5s���;:�1��x�s�ѢiV����	(�<>���LB�!���/�5����8��(��Wy=ݹxz�wr
����j��j�ҌW�@NK�вw�h�/!Aţ[+}<g3�P��٫}Q~b�Q�	k��4o�L#k�����j�tL93D�	�Od;��A�W���g��b��Y�A1��M��j(
��:3R���2r�s��h�1������ѫؚm^��ز$9 �%�ޥ��=��3ak��дWս�`�&S#H�I�ɋ�M��``T����^Тf��ݔ ��:���7D�o���P���;?|7�j������2k}Q<Aa�v�+�iS��v�~�K,�,OKym���r�ڒ+�~��۬hbɞ����<��p���c�[C�&M�(����t�M����{�Rs���J�W�;��(�a�*��*�����nG03E�@�2`���\������S4���A2PX����*1��km* ó���id5��b"��ۂ��,����9�ǵŎ�d5�@zB�
�s�†Y�莫�6w���C�	�X�k(�2K�E�S2bd+�#x��R��;�7�@�y�O�F$��V��,���:���\;`�J��5�]����<��4)X��Q'=����e韣920���Y��4����7oF)����(d1e��ȏ�a��GS���a��}���]M�߈�G����Q�!0�|�ܠΆ�p���i�B��q��jM���1FL���q�6K��.j��
��h�x-y�iѠ�:	��;��U(����=��H�.��<c��E~c�?fl���Iӓi22;	���:p���e��gc�#���H��m2��Qx�	�>}��(@�v�tD�͢`����[�\�S��i�]�?���� �����o8�H.w�FɎD�8�$��ս졧� {	��R��o޽�~|�N�!�51�^,_��l/P����{��<i��G��3�s�i=���~i�'RH�?PKk�mW9M8��setuptools/_distutils/log.py�S���0��+��C0mN�ԥ)�-�����=j�h�d)H���}G��h]���y�y�4�X,��j�A�Z<��Q�.%�:�����?�K��2�����m�"���*\@	�d;-���Σ,ق�0ja]�=e�k�*���3V;�Bɣ�ۯ <�Fۃ�1������+O�b���1cȞ7���!���L1����24Ō�U޾�$�9�0�Lmg��x�>^��s4ŷ���Z�g���$��1�prH��r��G]|a@�:���N�%�]L��)�0t�6rd�zt�i��~l�j��k�0���l�5�TTU�齢��7E�*X�W��P�����6S��t�tr�T>tAi7��<H<;<��r��O�%S�����GH6}�_�d��GŹ2*p���L�4�����
�Ծ�\�#���U�F5ʚ��w��a"�������ҝ�-�r���-r����jT������p�np�j�B&y�EDG7
SAtM�?L��"�!1�Ȯ��㰻��PKk�mW�Ä�"�u&setuptools/_distutils/msvc9compiler.py�=kSI��+j�$�`<��L0����pX�&-u	����v����2���%�;��8E�X�GVVVV�*�h��IZՋ:ͪhVݎ�y����/�:N�.��eq��9Kg��8T�i��b��)g��x\3ݘ����Z���'�,�bR���Z�ԋ$-���Q�uMfE��8K+�x���K�)�`�?��}�V,���P���x�d�b>/ʚF-����exV�(tMs��YM9j���Vk�},Ӻ�9-�;^�K@��2�����`��bp~��$�Χ�,��[����%�و���^�`p��4�f�VN�[O�bq=%��p+�=h�Ӏ����;�?-�m
����Z-X�ÊJ}��yY�yeJ��k�շ���)�0)��`�EY1Y�m��@����A�-��5}f�IF�J�ӑ�+��?{rh�jt���y>��Ѱ�#�U��0+�Uc�*K%Uz���\b��t��@�VK�=�/b�mg' 7&|^�q�ˁ�Pe�\�.٬��_m��r��%�ػ��G��~J�g�
�9ഛ�

eo�roj���q���k���c��
H�&�d������l��_�����F����~�ZY��.�Psj���q�L�L����ÿ
�TR�a������(����9U7k�����'{�o�N��������9�t���p�����w�0{����t~��ku���J���Ol���ۭt�l;4�W����1{��1Jk��Y*��gU��8˹`��(n@����,y5/��Wۜ��8O�F���i��
�X�}���nYOQ���c����*/�_��0ϲ=�
�?},�^}�r��H�'-p?�����V�b"�
�98���`��^�'@%)�*����p"h���g��(o�-�U|g����4��+�Ѽ�f�������`ua����J�� ���1���`tnǷqY�Y��E
��Ն?0��!l��{�˯��s���a<K^}��l	&�ǀ%���֬�K@���E�ֻ�����b�b�=n��D�Mvh�N_�m��\|鷾�Z-R�$�XBС��J�#6%�E�ζ�#��>!BR��8��0����'`���E*Z�6����,�o�c
PU�`=�-l:!�a2\P��K�\B�+][�) �b�^s�0��}�tuy�̕0�����@ҝ+��@ Z���v��v�-��Oaf"b+��F7�ȖL�t�$�i�s]~@/
5R����M����w5��ύ@O���@���N"�����)=�@:�<��xK��w���bv�bU�x���Փ����K�qs������;�e�A�@u�z#��Vj厗���!�/X���/߂p�}A�>��snX�l�o�8@�""e��\���F㪋m{WR�85r;��̕X�%�`��D��`�`��T	�(q]�]�6��~m�i�J(ޠ-�,yQS����^�6����C��x+�>G��#A%�eO	�3�ǒv]Ok��4��X�˱�6�a���pحx6�+Ϣ��u�j�eT���H��js���
X���0T�L�J�}�,��t�U�6�IW��#��3��Ƀs6H�/��r q��%�=�u�s>
`m�.���
Nb��	��8x���j�JTfX�(�,����`X�pI��.�>�
��1�l[%7�ȷ�і���j<s�a0r�֞�%Ha���d���⊍iV�`I#����k��8�l�x�V��iw��KQp�y	���34.S�W�15�b��@G�8Z5�E�h��+�[���`O2I%��[K�A�(PAC�p;�o_n���F��1������mԌ�^4_:&~z-[Z���-+9�BtrY�e��ؒ�&>(�m�閿�p�bl��1����0
���rT���F����N�D�*��	j�L�ļ�h���Ə
�4mC
L��a�m5IT�S�?��K;�
�ݹ��M�p����F�\��R_Y*`1���<���H\x��6��=��P����w����hϖr�p˂� PQ�������q�61r�������d�
aȈ��;��R�lG/�.]�lp�#K�q�H�p`$E��(�YjE^���b�e$����W���;/�$ňU�d��n#Q��p��]�Tvw�1��;>_i`����NG��� ����UTͳ������,��(%c ���V�;�W=������@ԼxiPZc�/^�rT7)�(2�8-�& �o_|��:p�i	b����K�a��؊�d��%EީQ�7d��"�L�XD!,����kx.@�Wf*"[����� ��@yzPS�ɋ;�*��-�vx�4MZ��A�_;'G����C ��� ��(B�V��G�v�u�D��TR��?��e�Wn$<Đ�%�>���)��`s����;�<րUA�w]67|��͘�e3�ĦH�Q��b�_^�*�b~���q�Q,�q��ܬI���G8:~�Z�|����o��`���n���v����` ����xNB�	�и���DC�q��~�U���\"&�i#W[�ȁ^"p��4��^flb�QE�`���mZ9�p1�W���S�J�	IŠKs~'Z��%��"�"���B*"�z���YB?��H�����!��rt�#�]׭�9���5�v��/���時�A�U�D�2~�<}#CQ���`چ�T�$�C��d�e�o$v����vrz~vv<�e�5p��#��c�X�6D�~V	�(���٬4��:J�hq�m�i�e��i�Hh/��dj���D-�Dmߴ�®�����(�J�T��=ۊ&���L�]n	�PWAR���u/�S.V��3������C_��W�p=�;+UB���N�IX�g����(C҄AP�,'u՘֖t�jM[��P�;3c�XEHsTk��K�9O�p伵F�FS��XGZ�56��(@��U�a"���[)4P�����˦���Ow�߿j�w/���x��t��r�^�^�ӌt��2�$��B�
��5G��]��-�k��d�H��T��
��EβZd�o)��1�C܈߃���P�Z�}�At�#,`�Ss�� ���	V	���ֶ�M��a��ot�ukô�"�;ʃӃ	���	,�I��wm�G��z^��^S/p}�
P%�#06g���+pT�w1=�'���"�#ƈDWE]-�*p�h)~�:>g�G��s���{���=F��s��X���ݎ�L��)�����@��s/�N�C��V�-��}-�-4��c���<���QK�8(��B�6�	��Nދ�F3��lC2M�Ӝ���ε�b�V㬨l�ҕ��Rmrt`���m�Ӛ{���t�����c#�Gt���)~�65V����:+FqV�.���N�����{����ى�we7+�o�u�7#��|�pu��F�N9�(e�;��$�ie���bkǘ;3Aw}]�&5Mg�� �>�V�PEu0�Ӓn�a����l`S�r��@�~+��?��I��G�fK	Jx��!b��{>^�(�aU:l������r�6M�DLF������@�#ܜ����%�w�mI-�O3�1v��"	꣊C��#�R�6���Gd�O��<�o`TO1���b�HscOE$��F���z�s�T8�ezkH�:f]�]��Qf�VS�/t0��TŢ�p�jrbG
�C+�
�X'w�d�|ެ���s��j]6!�ԬY9�J9�S��Wِhс��cTC��U�jC[	��G��b�#�Ny�1�u.����0E�"(�7x�W%�J��Q���Jd�i�{�E�e
B��4�tY�Y�Lb��A���	�6
G Ww��,۰\����>V[�Q�D��쨻�N�1�P�FtE�����S2�L�~Mu�G�B��ȏܓ���t>\�R�ăie�p�םn��7-�e�\��h��*r&o;�����u�7�b�Y-S)�K��K^��ϋ��;l����<g���
��)־IEbMɏ�o!*���:��(2�*�j`IW����I���p�9И�k,����c��+�.���i'P$<+i�aFʢFw�܁�Z�6'43�Uws�l֌�KI\
6�V>����M�)ƘH[�7yW&���̳0��<U}�q76��UǤ�ˠ7��$5Tϣ����}p48�p~t<�L�����6�#+Nkt6�'�Ar�X+Z`�.A�u�����x���S1qMj0!�f1g�@��,���zZ�VG`GP�����x�SJ�1EEaӬ���wѵ�oV6��
J����Q�̫nFX���G��;�r[x�"�LQ�󋸰 �����Le_*�O��h�Y)�Q����W߭����sЈ�\��*��P0�����<����+ZuL���Xeˆcem{�3��u��ml�5q4Μ�T�umt$�՜���D�K=�뒅�3���"
�6~����(�D�)*����
l�ΰ����D~n�"��mį�E�78z==C@�����Պ�1�沃&ە�~�l-CWN]���W��Q ���D8~V��<�d�p���5�,7I�B��+��8��:��Nz�,
-���1���	~�Z�Z�����>�P�Ѫ�e#)�{��k���]�1��Y f��^���f2n����U�Į��5U|jQ|M����R�v1��z�Twj���sW{�8���A�[C�Y;��<2'	ӓ�;��e
�Q��n������J.��Ζ�6Yx���,�����f^d�u�F��ي�'��Ǘ����/�ꉬ�!��jc!�0���$X|r.G����`�P��֙Ʉ�s?��>�|l��"#����2q�L����� ��1�"���Ó�����3�TM�]����J>:\.��5r�R@�Yv��?��*t���>��jDE�6��c�b�;X�C�R��BA�b<})��S���z���W��kl���VC��\�/�RxE.C���piG`�٠<e5j�4�јS������lՃAl�U���NH����	\�2�&ճN^I�@YWr��̅pZ'%X��w��H8-�`����C@�Ks���Ū�! G�������2�]�M��t��.t���kԸ�d�/F�Od�U5�Rh;��:�����֣�YxP@Z.���#�eƿ�P�t2�a�k�>��\�;����g���I��YE�`pQ������.2�DbuB�W�>Bxͷ�p�
���O��c�{��<�Q���Q9���8N�GJ
Ծ�C��]�$Yh~	~4�D�c*D<�+�-6��H��\��ɺ���~cYWTu�2�H.���-4C�Ӏ�⽆�ʸH�I�܃!��!W`y�M��&�»����<���j�|��^�Ǯ�v�1l��cX��vSŐ��qlj����t�	��]m�=t�੐,����N�� �S���c"(���%t��:�9�@B�>�Y#�H�ѐe休ƣd���"0�^�"�M�qM���/�j}-�N|T���	a@��'��<;,*aT\q��IU�j��mP�k�W1���%s����q\9~Dt�G��B�?
�ƀR��}�W�p&�=�?.~��PN
D���p�Ua��㻼{)!���]�1��R�t��L�4XgU���02�mzp�|�:^S#��DR_<db�D���s�٘b���0`�N(W��ʘTg��L�GK�L_���Xeh,yj���GGTӌ�{pK�R�p0�'PnZ�k�>o(���u+�F	"xo�.0��9f�_s�G�����:�D��� �CJ�]Pީ�}��MI�E�*b�(<��D(��qU0
�c"a��t����/2oI�Az�[þn�^���dN����8��m���Ӑ	3�	����O�q�	?�T�	���o�?�$��u�rvڨ�l�0b����7H
!/-YK�%rW����P�"IM��@Fb��S�� �8����/�ę� {D�ڛ�R�bf���^�Ç�~��qE�W��ط��j�v��_.�
6Z�BM]�ã��I`2��.�G�9B����i/Mj�a�~W�Ͽ���q��ᚤ�C�CR�.��n��'J%(L]�}`�6�f��xx�C�n�;�o�}���ͳ�;x:�v�m�A^��'�&^`c������ڥ��B���^�؞+��cB�R�%yV��b�Q	�3��T�^���xRDC22�hgE5�:��'�?{��,_�B �"�d��M�=&V
��lTd�{!�I]��ܫ�7��|�}�a_�}f�+����;���������6
�L��2�G �O��qY��)2%C�;;�,�u�v�1-q��`1򞿔'�S�o��@r�3�o5��hX>ȱ�Eٍ7
���a��|����_���=V�m��8Ӻ)p�v�b�ix�-�G!6`��a����A)���Kw&t���a���"��܂������ޝ�?ߡ��r����*�}���n�ɺ������N?Ee*��
T�e�!�A������)�e�;��2���u�J���RA�[I�p���L�H̝m���F���I|>fՂ���@�+����b̂ԍI;����R�0�\��\�GŕHz��GCT}��*��Ha2�̀NW�
�.<.���U�T�a���?�$ˆ���o�T����q7��ߣY�W��
C�7��0��7_ns^pt���bxk�PF�,��	�jy��%B�{f�ѓ����
ܝ�.w���C���Ѵ�:�p��yC��_yk���;nb2�oj���=�?k��F\�#�z
�7�Po�P�+�.�2�F�۠�ZjL��.������4�x���E������13n��t���1��6b ��#z�E���tD�*&�%,������S���O�MZ�~��n�|m
8D�<�5���ʞ��>f�[�"4�um&��HS�A14������Ptk���a0�dC𪊧�|���}A��a�WD=m����Ģ
�v�����;�(~�S
��5�o���<E
�	IG�x�!c�[�\�Ŷż$]��3Bx���"؀��qp
J�N�t���xb�h����;$iÖ�P�h�B�&^��3ϕ�7ʺ�b*�8�����J��h�����&�7զ�H�b���Ë�� �~���޾
�Wݐ���
li���-�l�Q�;N惸S��}�9@�W�����kDm����
����r��ւ���L���O�N���������,ā��<:�Y�f^S��W�J����VLlУ.W"f�xK$���CS����’�`����sEy�I��/߿|)���Kw����H�������).�U�}��a��~� \�Ä���Z<�vW�=!�_A<��C��]p�#��Q���4(��E�Wa���W�5�D�	�EV���qv/�U/wӪx��s@���q@���{� +�7�p�X�� I��C�7��%���d��n���{���MYF04�&���-t�u99��zW�ڜ��N�_c�Y3��~8K����C}�xgh�yP��-��(�@�Mp::��H�7��9o�D�[/��
I/.�)=CH�/]]� $��Y<��|p?`�Tin��NŊ�ܟ�쉷,5Ą6�}�#x�Qvh���� ��N�c�$#O�޽�//3c�����\
IS��5c���t\Vy܍��G�a�ӟO�^Zi�`�ģ�	~@��r�達(������n����g�ُ|�^F����?;=��q���*�����_>E ���n���7}�?��y3g0<8;�;>v�za��A|VN����d%5�?��T�I�~�T=�q�Y�v �݁�#vC�Z�J�r�1.�D�-��}�/�⤦-�#̭߂
~�E�F�?��U�����7_zz�2�8^V2w��b�Y��z�72^��|�n�DweZ��j&��q���^�{g�U�Ҩ�n���՘gY��bQ}��	�$�kZkQ��~:�yI�M�X��&����+#�}���Od���%
ۛ�G���;K1lhb����̃�|׵�4�G��OM�	^Q�b {}�v^svЃ��|ñIlj��5N����8��
�'�$��U����
l>�|WD����IO�	�3i촖.���`�9O��\`w��:��o��	�.��ܫ>���#V�;@D ܙ�B1c�4dE��z������g\ڟR�	��#"�/)s
"R��r�)��=E�͡���4�妔@J�$ТR��t����z��c<�?,�
��"�t.s�=���uϬ��sz�ۈ�Y0�8�'ܫ�:�Wφ�n��C,{Z;3�g�^�qz_����J�q:�r��Z�s�Eyc�P�GU�-j.IBϭU$Xr�2���9�$��V@y:S���5�=]V�`L1�׋�=i�F��S�����kO������G'y��%��ܾ���krH�"Ȏ����=�w��OH��PKk�mWTc��\%setuptools/_distutils/msvccompiler.py�\�S�8��}�
=�R3������Ud�-�!_�
��3�0�gy�����_wK�%[���W�u�l��j��?��y^�rUƉ��v6˖y������2�S�NƟ����S/�/9|.�,eٜ��©(�pV��0�%��yVP��xVd"���S,Va���*�3��y^���>qY�M����gI��G��<��){���8���"[����	�Wf,�XȦ�k6�c�8����[�*��"[]/���_����׃�eE��Z�Y��.,R�]*�%�ɬL}�v��yx�g�X`d�?K�$�4�)yo��Wz�����qҭ#t�� ��A���hf�$�օ�g���4(x���k�.L���Q��8��=zլqQ�8}X��u��"xg�?�ק9O����_��e��^�%��0Yq���ʠx��42����dG�*"�Vu����a;�ϲ�W}�C[��m�P����,lI�*j��-"�h-���dA)-��%0|@i�8�g��
>�g9'��~��K�r��NH�y4�<�^�g\�
U�,`��˴Q�$��L�
t’�����*�B
��I_��A_�H�h�I+C0�_�V�r�X�xn����_�1�
Z������|<������*s|���88y�����a'��7���88?=��e�j��i��d�3�9��x^�YX�-E�)�	c4E��n�/)�,��|U��}v��Pp��c����A�s N>A��c�}�`�:�+���YO���UA�g@���T́�R*�֮׋���*!��j���!�q΁ǔ%���J������Y3~�Op���� mN=_�څl�C��Yu�&W�f���u�@��e�+Z<�s#YP�y �����N&�Xn�7�~�C_��M]=f���n��ؔ�-Z��dų�LIwdU_��7I��p	s�h�-/�f%�/h�5��p���?2؅��و����C6�O����Ob�d���Z����������8{hp#5�V-�F5�3 x����@���7YĽ�N����V�YI���zPz�a;^K&��;�B6��n��";	"�� h^h��q�A0<���B���T��ʢ��C���˯]�W�#?*��{L�sV�H�|�tv�P��	
�r(e�f�����c�$7�
�x�jՒ:Vu��j��n�x�ƀ�a��
�_Jl.A��w�l(*�\k�y����[=��(��&4q9�A�/?��k//�i��

�i��5�c��Ëw̬����:[���ց��!1TdYi4֚0�JP��'�c�]��~5э�����:��/��&�=o�0��pG2�/`�R��m�����=��y�
�:D~(8��+p�H�a���R�rx�>l���t1��v�Z�y��!�;q^ɗ>;�#,_t���c
G=����\EC�����/��0<EÆ��[��=������ϰ�
�.��e�829Τ�{O�L-M�g�v�yC��p�hDhC�ZLp3b;�'X�����~�|Ԭ����U����'e�<i0=5�+�گ��0��a�S��3��1��~O�ϓp�X����h����:)Y�0�lm4ja�E�9���%@G*�Q������s����$��J���d�X�p�z_��%)I��[��˫%'�fA��� �y��w2�g�*�B�e6���@���yͶv[p�eE`KxjU�
.J��$޻�E���c`�ve�e�5+�b �������!�����R\��fi���J�!nb��*zZd+0T��?Ve-:>[�����a����n�#eD�eJo8HH��|V�Ѫ��U�t����J�����l
��1��b=��7iv���PnK���$ߜ9a1[�<�a$�>�0�b1˪yr��MF��JJ)P�(-y�a�99x��W+tC����l��5Z5I����xC�
-�1�۞l�}�R�J�T&�x�\H{�ߖ��*Z��FJ�ȧE+�F�(:/��y��*
�B�0:Ґa0�aL)c,n��
vV��Ѡ�Hѯps��ifm��X�h�a"F�����_$;X��h�s����L9���u�10������ �O�
��� �������(%0����y�s2� M��~�ͱMD��U����O:xOsK�2u�d$�կz���t�̿KoR��ek@�9�/t.������Ʉ���〢�V�t?5�W3G��@E�}�B�{J���ĥ�WV�D@p
e�qAspQ�+�K֊��38�XQ/��U�l���	�b5.�h#n�Hv�Ε+R�ϘR�I�EF�uzR._���x	ߚY��"�Y{�~I��(C��9�8��i�A�|�����0H(.A4�nʅ�0�i�R*g�Y��z��mX�@�!�\�	���U,l���94�*�+����`�\ߟ��ԧ<o��G��s��.]�)�e��?�}�����Gʩ�H}̒��"a�6�U �<F�H)�&cv�7[��l�e����Ƣ~��`��ӧl���	��O�f��c��7��d�(%I��D��r�Zջ�3�Lq�Ԡo�5tnga���wF,*�A�J�'��;37��1��W�UŪ���H2ˬUF7��Jڰ���V���1��y�����7���SGW?%��u��YVNl`�����[��F�T�CvX��L`������8}������k#G@�N����G��]��!�d�!3��/���>�f�
���J��D��v�HDiKc���h|����x�+@��!>`��۸0�� �����c��ď��,�Ik$t�M�WBK�2
�*g$�&H�¤���+�ȵ�)o˰g��&�57��	�1�k���,4�%�
j��u|^��e�s[�H�A�`���x���c��ܬ>D��H�}[�����3�\�*�6�H�z;��#.�iv��F@�D�$����ZO|5[tR���1խJW�ҨQ鎳��Ua�U�pp�4k��~[��j�L���Abi�X"��~�bXԣf{p�>z|��*��7��!�A��S���z�9|[Uje
���6B�>V��lK�U��v��&b��Z j���`ך�U�6�h^y��,n�ކW��S��^�Y-4��D4!u^�Aj��N�$��%o�>�N��/�_��?�~���(� ���J��F�n���4r�>9p�G���]���� �����}��K��_�E~��xm%O�y^�@Rp��$C�G��O?\�9�pڿrL�n\�h���ͥ�Us�:yW3.a��6�M�E�h��F�=&*����,Mn��
[i�
u����@��C�o|j�q)�Q����²�kxSqDq��`�*�UI�M�����<�8��$?_�����Ee�0`�L_r���b��y�)�Ƭ���5����3�c|�x�_����cc�)��.5D`W+ZЩ���$�	������ҼU:*�[NԆ��+�"��I�F�]D🉦�p*نl���1�7b3M,�!m��n�\`W'4%��Rm߿����8�}�Ty|�h!J�&H���rzz�wPCh���d^*	�ʀ��[�ʰ���"�uS���6�1��,#y5����z9c��)��a�s�*��ЖOc��O$!G�%|-���Wz��n��N��#��TH�kf��͜B����WZ㏵ce݆�uۊhm��hP������ήe�ks��~aXA�>���i�T �7?��j�!�����[&J�Lj��̷`�M��3��^��H��r�x	7
�h(���d�V���RU"�|���3
َ��j��<G@'Fj]���v��,�,��ҡ�̢Z!�۳��x�1�%iՓ�o�
<��5'�J�rН��(���z®�w$P�/(�	T��󃡝dձc�-|6(T�����U�v�a-�/a�2�xum�c�$ٝ$C��������B�$0jF�
Z��
+!)L�+�M�v�CPfA'p���o��$��>le	��b,�}1���GL����(�iT�a��(/��p���~�]|����3d�UЩ��H���w�`��>W@C�5������a��R��K�Pe| ʶ�;g�7��
��O���}s$|G=�~`������D�g�<�j���UZ�8�0��=z���]�K�U�ڒ��hR�&mQw3Tӛ���$���u�T�d��7upBā�j�"��vh��9	���0��+C����Ղ�do�%jK��;���ʵ���rQ�pP��>���&��"tEI���$i��BT��_o��5��p��y�.�9�!�Pֶ��v�ޭz��l’l���?���v��Y�
�q�|d��b��G���@S4N5���
����A�t���4����ߊ������(��
���%��=%�sr�@0����q�p�S�Bk8�wN��b�h9ٝ�����|6-��QD9Ǝ��w��j���ǹ�ԨK�1B]#�D_��1QKSf��8B��ȳB�變Ҕ�
0�����g
�<�*����ڡ����!j���u��V�ì��I���W"\�k�i7��p�
�X����o�~�����k��GP!��ɝ��`�����6��AS�y�>ګ�}�Ưm��,.�r�ўdI�	6X�[e��:�fҦ��cB8O�h(E�ӛFVC�c�=!�!�@��ڕ)V`��<x��ǃˁX/�Y��K��F%_��i���+�q�Ca�yV��
=�Fhd
��9��Vڮ���*�S}��|���>ty9�~�]��{�M���<�c➩�:cԸ�A-�<.�Q==�����>��Oۜw&F�A��m7�4L���;-���x�Бz�4�$S�&V�&��dw�
<���Q�-Zn:���ů
(�T:8�{BKX�%�lc)���
j:��m~9;=�أ��z��IeU��Rwc��&�Û��7�ߠc
�T;�tV@0�D!4J�h��"�-�|Ψ��U�'��M�kMU�-�-d��%e"Ȗ��ҥmZ)ma�/f�h�ה(0s%2���Y��iP�{��u�a-7���\r	�\�G�����	1�T�xe��Գz�X�`;mi�Q�e�g%I �#��ZuN�V�ܲ_��7x�?;"��4�������'�>�5U�����㣷����Tq
]�bVt'{;Wͅ�J
�t��K
vq�޾�
e�[�k�-��bn�x���J����nڔq�O�l%�}o�"�F��b�$�:��oB�!�����ß֮ߌ
*��+Ă��}�m4����{rP�&�4|��X/j%`p�jOw��v<���}��y�O��{��_�lǢ55�i���+A]�"�vĜ|�G���j��
�Py`} ��?W\������[L]�냘��[��f`��}�&��#��tլg�!���6vǏzME�a}��V|u�ø�Nk
�4����	I}���J���$�f9.O����i���X�\��Sx�s��^%��<ɍ�Z(���k��f�kx�EY��x��X��2�U���<Q��ᑩ�"\����(h
�X"Ue���-����!x�'��#T����y�j3S�`�{� ݗ#k�)6V`2B��Ԟ^<��n!T�N��65�j�(��Yq3�����Tdɪ�J$tDR�aI�ˤ#�\Z�i��}]��i�1�&/JEuW"�>������H^/�Ή��V�XL·rě���E�h�:t]q?7n��h��+:�AAu���;w��=�;�?�!�
(��q�CNy�>w���˾=�~oS����)S[�@�Б�İ�n2&V�6nû��kz{�g�rA@I^`��4-�Z�g�5ݚ@�`�"�aB��{�����ĭ�*5��!ȉ����k�x���G7˫B�{x������ۿ�_����7�N�O���N/?���A-�j�ō�ɷ�b�͗���ԫd��X�=�/��˷��:�{e.1��#-ť�5��e*<�-��>Y}3��Q7*��L?��;��k֌�s\Q��3��'5�ӌ>޾MPY�����W�cgEgD_u&��hl�+J�i����cO�����T�&kv��A+��� L���o�x�0(2��o��p���<�
ՏwT*�Tw�':_�u#:�=Q:�ˋIZ�Dm~(��
i�7o���ء{�� pj��G#�l���Z	y�įǙn&$=0�4���|������YG��+i�F�Ύ�u�@�cپ	�$&��H7LL&/Ma��
�`=6>����%	`��B�Dw�8�ѼN#����3��<��8Дw��Tp�{ȂvU��&�@��l��r��e�U_"��
��.���Y��f��[D4)���(�������u�D�xF���<DE�,lURA���:M$u=��nCL�����$RC�*�O�<\^/��yw���PKk�mW(��#setuptools/_distutils/py38compat.pyu��
�@D��'u?����Ma���T*��n��4a����֑g�)K<dMi�;����	�����Lo�"g1@n���B�Hڅ~��ߪ�^�
.�,���gTu?���c����7���	PKk�mW�C
cq#setuptools/_distutils/py39compat.pyeRM��0��W�!6��H��	�q
K���.�bdk�ؒ�_E�	�A#�h�P�5�(PO�	n��A �!e��\��4�\��71P����l�탦q@8{�6������������E�dE"�Ȫ�y�No2\�Kg|r�ñCP�2��#�џ�}f�G+c��j�?|f[N�j��Q�@��g`�ຽ�]�A嫺
�V�Si�f�NU|�k�-��Uq;Vqm�Ğ�5:�/��L��Ŧ��y�n�BbZ�2�a��]���Ym��*\�E�d��i�g_ܵ�H��wEFn�QRy�L�(~�wR��7�K�����c���#8`�[ii��"����nA@5pG�!t��������1�PKk�mW��|V��
setuptools/_distutils/spawn.py�W]o�6}ׯ�s0���iQsᇬ
�>�-��-Q6[��HʎQ���K��q�<�%���~�{��f�R9�yU��k�A'�k����NBʃ�,��ӅWF� ��F�K�K���*�9hk�+c��ĵ�P�*�5pj��;�� �Ap�5[+PA]��āB:�H�kghz�I�t�����Ԓ|�ݝ�رE+��7�U{����h�"��fI���X��G3<�х$� XHk�u���ɺA���f��t��������$I)+Y-�2����U{i7��ճJ{\�Nӣ��;�e��m�Kx�۳��Q�v�qR9�A� �0M#�d5�)��!�Z`H<#�,(_:���
���}XMI���J���b\{��3���c�,;Y����3bJ6�!Mʻa�>b@�����8(�Aa��JUUh�Nr�N�5�!F��Bz��瀽�$��+,��j���#���&uƈ�c�T]�FB�$7v��W�:('�%�h(ɛ�� 
�!�n�#-ws!Ӿ����u}$t\��TU������h�T�G��+�CY�;��h�"(2�/(L�4���"�(�M����3
EQR/;'��wmL���䔗�"�Y����FxO�2�J#��X���K���i	+ޘ�.���\(]���2y�&�ҒM36����/�}?��'dm&"���X�
�2�g�{���&-���1p\�i�	�~F���&)�ܸN*T�lt�����j�<HU��;sW��}����w��?��޽}�n��6����F�=�=�5���%��:��IzΦO3�aݟ;C���+�G��N��2
5i0�e'֋�P~�|P���
Ӂ!45�����w���I���G�����9
��y~�t��·��wnfY.���"tO��X`j��Մ�Y(:N<�#��jO�n?�!�6�?����n|�Yl��ڋ�G���%<�S�*>�E2lG����L��H��kpޒ2�<�N�8�
+h��)�#���U���36�}����g<n�W��}�H/��Z�I��⎏��L��Se^S�<'n���Zy��fн��6�0�x�f|��	�'\��4���M^~���z���<��3���|X�Ν�$��&�[`��Cs�=���A�s"����y>{}�&�Yv�G�������d���I�]x���/��U3��r.����iǐFm��Mk._�����%�1:�tQ�XR�N�QL_��ϣ	���:D`M��#ٓxT�*M����-v9�>����)��뛪�,_�F9�%��OO�H*Wؒ��Tw �|�P�����NεI|1J��w��L��à)�"��V|��{I���r>��`�W��ty��^�8�PKk�mW9���ZVI"setuptools/_distutils/sysconfig.py�<ks�6���W��N��hǹ��(��zey�];VY��YE�Ő�#����T��� �3V|���&�C��F�_h�|>?���,UB&��Z4�8�5�eh���:۴�l��Y�.�-=GB��VBW*��Y2�;��:��\i!oe��HU��T\+y��;�P�A�B���p+��l�N���USg�V���Y��mT���U�%�"�y�Q�t2��L�pݨ��Y�f��̑
���T�(�n�_�x��rց�f��iT!V�c!ċP}�絼QK�:��m�3���O���,�mT֛�f�|6˶UY��>��>�vu����u��f�u]nE�꺬�fn|�h�,���g�l��N���o�r�LCL�e����qQj6{y��t��8AW�j�	"��,o�"ޖi��WF�fpM�"�J���/��m+k����K�K�K��ȴ���܂�$���g/^~�IK!�Q��C��V�Zg��g����Jb�/�.�>�%���c��L8�V�g(��A�Y���Y@��.�7�xS��"-�4��
	�`;�<�U�?��)r=}|�_?e=j���?�-��Z5d@$u	;�A��b��7?Qo�vv�.F2�8��۬.��
��=�r����4̫�L�Z10��.H��F�����H��y}0���'�σ�\"������"����+q-�5
�rr-�
�*�V��HxmAp`A�~�����S˭@lz(�KC��Y��"�4l(�)�e['*��t�T����oU�օxW�
��9@ֶ�'YU
"W�Y��,hx[e�nd�+KW�罫C�Y"\@#�@����'`N׌�,v��w]��Zg�
$}k4)".`T,?Dy��<X /bX����"��.�45.1t��0��D�@�M����sM�Q<���g�!���	,ϰ��u��2��q���@+ʀ8mY4���W����-W	m�n�Y�^��Kt�$f��ey��k�V�Ud`I�U
�ί"GQ��r���us�\�|���{��^�I��kVJ�����؊R򐥘}57�?��Y�B}lB�,�b6��<^�m�/�k�Љ�ٍܼ��V��x���v����l梀�(�а��<i���➿�2
�`�ˍ6�bG6H�
�o���0����ʊ$o�=�:��-�NY�h�n�Q�X�2 q[�^!Gn)��p��cԢ��/����woa�pi�Y�í W��>&�j�3��
<�rx$�|Z+;�V!{SI~� ��i�t4`
n��\�ʰ3,��u�\�Af��mmD]LCƭ�5p$�5�QFRh����v)��bh*��k}�%A�ѣ���ڸ�'r0B9,�ܢce��8��m�\�����=  ;x=
&u_�E}��b��<�h���՘L���؆'O�F�����h�&���>a���$ghZx˿\���-���\�� ��l�Z�L[6Y���>��ȑ�ͷY�"k)�iY@^��[f!�ڻL��y�&����v,��¥�H�鶪��^Df
�	���{���a�GGD��RC>��`�hǞ��{�@��Ȫ�J�9�p= k4���R����M`:M��X	NB^�`����:�}��3&����BVW;GI�VqO��[��K��n���&Z�E����[l1��@�.��v��u`�̆dr�'�[��Й�;�Rg;������B��	�@�?������N���X�o�;��yȳc@�
�ak�{�G�Aff����uU�}�u�eK�D#�9
�|wz1�ؙ�K�H����
݌��h://:�r+��V����];[T4s]'�z.(7���F
��q�e���֨�
��������x8��:�x�e��b��$���Q�t`!��Sr9���>	�����b����#�$k� ���+��s<3���0��ґx�պ�QE1_)�?��J����PF��H6d.B�$��
K�U[��3~�E���^q7�}]��f����-���7+nԎ<��i�R*����Se�}�+5;Ҫ��
i|�Ƽ�1H�/D���띪�/���[]?^e��!f]�}
�b�U��.tŀ��I�����H".���>9}�Ë@|9��`�p����OhEO�Â���s�`*1p
�C�
$ȼ�M����	�v���͗�\���X����i���=GZ�]�A�u~�{-Z ��3W�v�m.��&z�}���������0|��9��M9�+�WV�`�xU�G�B�V�qj�O#���A��)RY��e�a,��R(Y绁կ�;l�;:(I�)J�Y��
���ȍ���8�B�G1���g�T�`�5��1�ܱ��=!��^���;��Y=kч@&Ih"+Y�l�M�@rP�A�c8l\�i��o������Z�I��w�0a.o?AО��l5��nh�A�I*��?~f��r��Ұi��k�b>����q��ܻ5?�e��o�������(�8�x[70yGW�tmdz}$$��Y[�(�ٙJ�:�@�(K�����Z�{d��P����O��~*�5���{�d䁁Fv$�#�9��MsǞ�9d�]�?
�`�\����WðƊ(O���_4��϶����h������'��Fw�?�c�R>�$�n�m�/s����>,�Q��Wy,N�y����K2�c�ka�D�x�uzj�1�t�Np^�y��Ӝ�C��y��u=���ؔ�S��Mb���13O��4``�����6ym�	�L�%7�q��X��b���
������e�|�]UM]�Y���&۪1w�|G��S�t�a���A���IJ��t�`��yg��U�m�c�s�t�c�s�D�|�?n���S��
fb��䮓�LQ5�q�t(.85r�]��oQf5�(5��$D�s��t��*_S��@U�<���
��b�($��E�f�,?�����`���k��	&4�U $^��_�[4��� ^8��;��w�7�vl��d�^����Ż7�_���y���C|���Wgo��/���p�R�
Gf�Nnk4�=\|��N��^ܮ�`a�!��5d�,��?^P$>x���%�x��$�\���Zd=��Z���j��!��i����a��ūg��=����۳����O�����˿��_��5l{�v�f8�_�0�|�b�~
u�$�:�r5��]Z"�Uqk �dBh`�rz�[��}Xgi�
\HmH>)3�<���yqG[�p���� ��?�^]�@D���@�lg����	r=�&���`�<�Aم֍�A���F���h���؅�Ī�8:��k˓�ɝ��2xOr��G"��
�cX�>=Ab����!�?��h��=PcV¿�p-��?N���{S4�4��9D�����>�2˷tJ���P	�4��{E�$q�M�<s��O�R뎁'��zT�T�%VF��	��^'<�tc�K�ޣ2i��SNF�2ϊ6mM;Pr2���k'�a��x��0F������
�à�&�����$I#&�w���WJ�p"�F�Ҁ��1��8ITc֯�ڐ
EG��u��� S�
�c_k28_��Hd:u(�"�'�!�]���m�C<|�����،_bv�LF�<��5����a�=�<�� ��7LT�%c��$���
^8x��;\WK���ϱKW]�f�hP@J���4���g�q��T[�d0~TZΏ��-+s����q���T³'�@O����͒򻬸Z���z%z,����K|@�dç.o�FaM��������n]B�f�,�2`Ē��o`-��0��y��e�b{	#��]�����z^ʣ=;�Ǖ�������g��	�F_.`/�x�@����ß��F�+�|����tr�o{��>���JW�.z�οXY�L�� K��3��5L��Ƥ���������z����Tm��(�O��77�b��↾��M_(���XN�j��F6J�DV��d�%�7��P��w��b)Y�
����R�g��tYWQ
�o��U��n'E9P��S�+wӽ٢�vvAD��!B�n��P��6u�V!0��c�mDL
���\ߞg��AZ���l;ʲ׷�Vܝ\&*`(W$�C��#Ʊ�a�e�	�[�yl�hb��oHWV4��8Ea*���ɠvϧ�[�h:�Ovt0�0��~�� f�@�^>�V"8�)�By��*2��(aؔzK,议!��m8|6��k�͵����L��-6���:�����L�;��^ݕ���
xkj��[&}P!�fȐ[���)2FӸ��w"�.u��K'�ZX��e�H�������ܝ�k�_4^�UV�M���8��kOz��!~p�����W��F�i�k_�����N�ww��m]��1�����;4�����Թ��)y�pFLt?лC�QR�z������jDqr�E�ʘ̻/f�9�v1p�c�w.V2�aA��hPq�	6��q޴�g$�{��&	s`��0a����W���=r�D�uȣ{,~�U�u�JsPꄨ�~R�>�{G3��ir�U޴�.���i8J�ُ����-S���	�Gp��;G}����v����^;8��l�X�x3��>���Iw�L��=U�@���Ɏ;�/G���}
6/~x�ݓ!��_nZ��@��`��D}��Ӻ�P3r�.��Z�qN|���M�RS��s��]�uV����C4�7��#�H:tl*�&�$9�%w`r	��+�o�3���n󦫅7gt}lB�7Q[��V�oH�ȍ<��O�A�样�Ϩ�0Z��#P����9�����s*�b�(�[��BY�U�R8M��meUa{��t7�z{|E�w�P���a��7�1ρ��L'{u���/43bݯ)�9�M���C�S�hT����ZC�PK�Bm�:��W�t�6��s\�+۠V|Q�^�����?���L��̙��7e
:`K���$&�\$�Z!�_�З,Zpe��,�Jֿ�)0������G�r��w%
����(��0�#�51����X���V��aY����L��\-l�%��X��«~��U���_X���{���h���NE��<_���ՇB�p�6N�\^P+���u��'���4]]�s�c��LJN	���f��2�{LBa�8eL
�KYo��#nE��PtW��ml̠��)��LN�n��G݋�`�毪�`�@H��,��B�z�1Q�Eq\-�e�M�
'T����;+�����9�J�\�d�蘻�n��^F��o1B��Z��[	{�Vo�NK7��k���v)*
Q�&p"*/�dC���J&=k4��fo�k_^�Tx�y��`M��ͯ�$e�sd����H�)�l���A��+ʗn���/�E��2�e����#kJ��T9{�� �T�c�gxLu�g�m�R�vë2��D���6Ȋ~��`Į�:o����?�p�&p|�D��s��i�}�C�pSF5��.�E8��+��M#��#�o��c|l�PKk�mW3��\I@/"setuptools/_distutils/text_file.py�Z[���~�_1� ��T;E*�� A�v��m,F�H���Q8�e���w�\8�h��/9s�\�s�f�F}n�we�nnN��Tʊ�įx�#����.�P��/?�Ԣԍ�w2W�1�h�ao��l�ܜ��hYU��h���V��m��t*�^��xT��r�MM����7U��J]������s��V�,�]�f����x2u#�����0���͍���$���*�������㬃�í���	�FWq��!��(-��\YK��N��AZa�Q1�c�����X7��Ʃ$�C̱�2Dʊ��L��@9�"�d-sX`���Ys�k��&d��Z���	(�K�>��ՙ��j��U�i�C�N �J,�.�`j�Բ��o8G��	������8�*���$Ȭ�.�	g�=h37��MU�m��7�(�Wv���/2qT��%���b���e�-!6�0�ܳˆ	Պ��t��2�K$t{ܪz)�'خdN��}��U��f*�L[ql��<��=j�%W1z�V���$�w��~Z)�^p�lVrՔG:�<�6y��7Jo�J.�/�Jp��{M��s�5-����Ւ]���Ω�.ܾ׍ؚ�>�K�������� ��@*c3����d�{0mU�-��>����>>��^
W.<:��:c*ye��,ok���޲.
(�)�W�t�G�/x�mf��8�.(�CY^��ސᇾD��H��6�;�T��g�" @�
s֢eD�J�6�vH��!Ąe��l���)P�v���$�VAئ�5$�a�*k�]���>�ȻB�$<v�(mՇ�7mv�92�ŠÕ�1&-	t�
�HB�Kؑ@�������j%Z�`Y��
3?���T��s��NVv�f8�c�q�$r��V!���hi�x��!S��1 "�D�T`z},�D8>Y0���pB}�=��Bq����xj.�N�p��D�$_�z<�#��4�U�"�_F
e2�N��Q24�qD��Y���.�*�Cx�"�<��Y�$���;)eݻs���$��$�)εѫ��bnY���$X�W4���S(��!1�sp�NY����͏8A�f��K�
�O�m���kU�&�z&i�l��ًA�a�V�-�;i�����uNY�d�=��_��)#�lYG"�Z�� S�\%em[��<�/��@4�f�E�(�F+�&�8�%(�tQ���u��\S(g.�a���7���2e12FT� ���p9KQ񕹥@�%�c�+J�u�Le�/Ķ-Q2h�	�\�
���oO�hPJ���D}�[�p�z�4yf���o�*w��r�8��C#>����1&clA�Y%&�%l�(��2�A]5Nxއ�J�+Z0맩l#^,��	��-x�<y^'����
6�bb��y`�y�{�{K�ߣ!i���VU;Wk}���D�PP,�`�YW;8ϠZ2�.dc�KJ�HgʭEZn�ǽ��'���X֑���xP���Qp����,AU���
ϭ�u�I�3\�b����a=�*�C>�~Ld9l��N_�CL"��ru�{�z�ҏ%������.	����l֣��j�[D|�8�
-������C�Qq��2�
���P�#q"@�'��z�n
3�����o�6#�@@p�}˖a�;��â�A!%|�)=�T�q�� �#:JD�
i)o\QҘw�:?��s�Y�aѲHb��=��L<�?��N{%3�E}�N�cE���bL/��/󶮡FF5,zNj�ֶ��L������$�GF��펱��\ҷ�>��"��HI��
ڳJȠ�ji�#(�C�si%e6N�'sB
k|��S>��1t�>��QT�,�|��_Vxx��<��*hE���`��ꚻNƇ���w�v�hC˓w
z�h���Q��c鋠W��{��;�N=�_�E��C��n�S㮩�@:���5�g%�9�#ח��;�d���i��E�������/r��Ƶt��+}�*�>s��%��):�$�;�l�Y�󣠩�<��P\�M��&��l)f���)"�������6�R��i�\?-VO�� �MLg�(M��o�&��Lh��O[SI5w�;|�
X��R��k�F�<s����,�SxL��Cx\�s�c� �j8��~!Ѓ�������9�0�ܸhbg��(�N�	��jG��-i�ћC�zO�_�\�i��W� ��VԼF�Us�M����"*���͸��E�%c��.CY��rw{���Oj���=
���b��h�s��e>�j���PĽ׳�Wbr`IyI���F|���/Ro���ON��Gn{F�i�����b;ӊpk��ɍZ�2$�D���SiZ[����f.Wv�A?�.:�K{�P�ƍ���M�D5d�O�u��?���Ⱥ��9�7���2\3F�~*xzőxK�l��n���L��UG�v�Q��]�v�h��_\���(#閗~@��i�
Ch2k�B<�
��A/L����o�H4P
6
�Y�}p!Vh��m<�0����<�'�3���+Ǽ?�_$XBR��Ρ�,�CI��6�c�M�/��g@E^�Maxls��[��,�߮gM����ŇޚBU�/��l_М�hO�6Ȳ�)���ܺ
�'��r���Y �o��=}��a���$-_����`�O�C{67#R���<0��^�nu�ˡ�摄�2o�
��­;���m9��8Y% � �oGc�*\�?{?�SM�%N���1W�	*�@�/���`ҷ&e���;"����\o�W?��X:y!hV�o(�1�	"�vk��9O?��[�ds��'7n۪	BU[?�(����mL`�>�T������'C�46+�i���E�#^�J�^��.h��W�mL�䔛�&�!o���R�Y�����2e��}�-�,=�FX!A�ɔ*�T������у�x�A<yO{?��;�'V/]�*�j���w�r�ZŬ]�D?�-$ �å�u�!tP��41+']�Q��%W2О��Af�}��c�l�\�4�ݚ�;
X�$�=��f��<��{�+�b�2���]��g�������Ű�۟�c�e��
��]A>��{��'�E6ϲɽRy��
|�*>��c�u���Y�Ԏ/,��wn䮐�C�|��$P؅l�w-�r(KSv���߷�X|��N⠪ʈ��.��!�>�M=k�Ɛ62>]yWD�H(6s���8Z����g�Ytv%@�Gw6�n�Gs��م����/�r�E�By�AP�E,��^��ex5���	���ȓ���=��J�?�՜9�M��f4�K�8=�?>����"O�NxAQJ�m��-ڥYRO$��J+bQA�ޭ�4��]*��ʣ^A�LL��Y^��j��E}Х	��K�����:~}S��?�Mv��.1@��!���g�Ŵ�eRM07^�s><=>�F�'Vn/��+�~kۤ�����-��2���h\�:�lC��4��4 S���v���F��Yp�ZC\ռs�>���;D���}�7 r8W\���\z�C��Q㚰��#�(�+W[���4��8�I��|%+u�2�Mz��*Y�-ϐ`H;�Y|�*x��/;G�-�r:��T��a޵��p�7���n������s5R���DOJ�A͛6��q~z�}�	Bί?�f�
�i�?8��?Z[��ܷ�
&����I�W!��&�� ����N\�'���'STe��B�$?J�E�`�!��#��w5qm�����W�D~;"n�����I�An��c���:�|��<q<M�#;�]�+�Z����B,�ך?����_�F*�>���T�����pG�z~ �W��PKk�mW�n���<&setuptools/_distutils/unixccompiler.py�;�s�6���)Ӓ�)ʹm�s�q�R'M3禝8�ˌ�Q!�S� miw������tw�4��"�����y&u��2�IS�C��})sQ�f���,4�w�}���;�Ҝk3�t��g�6��w�f;^d��3����R�<������`���,rYv���g3ƾb{�VJ�Ll`4c��ޱ�˂����q�Ok���8�&�"͛L0-x��X&+�֪�B3]�Tnd�	&��ON�s�������;����Ȃ4
X�*��^漊�8�����𔩲��@�0�C�$e�b����L׼�iK��
��n�Jk�ΏP�@��C��N!JS�0�l>��fr_��fJ�'}l+Ѿ�����ZT�R���6�ڳ�u��*6rk�g�\�f��B܃^��VO�`�}1ۊbUV��T*�^�i�6�^XL��T����^�^�P�,f��R�ۧ�-�U��<����J��^�
;�_m�)g�g��Ǐ�N[�
��E���?�9(!$~/��q�L����W�Mη���^�O��Y�A��ŝ��`�~9�;U�P1���EC����8Y'��A����L���W�,F�{���ˎ �"��l�`��k]}���'���o�o�USx3��7�-�f��/�K�GB�g�6�L�-Ln��6X��B�1>g��=҈#����X��l���Z�L���78ܩ���N�K��N��$��F�ł�m���y����@X��q
�%�`�q
�Eu'9J&�`(��iE\
piQ��m\9�����WY�G�_�uC�P���.�4eR�߰h�YǭZ���Р뀕S���օp��#G� ��Ȩ82��G`5�Z 6�zN@�w�yf�#�p+���;Tz��<3j��%l<s�l6�AcpSO�#����d6�A�a+]�^��.L�Yd<2�A��HL�竘Ѵ����m9���� �A�*�+"��
X'~��w>	�b��4�1��뛘M�������kY,�4���O�g�z�&'�
�4ǁRށ�:g��
��t>o�����kק7;?gs@87�a��o�w蚂��i�Mҁ�8�
��2����=�鋑�Ä_���ʜ�`9{�
�D�r�$�l��!@�V�����?�,2��H���5�$��R˖�	���<cС�	n�J^��7�w�q,��#6�lxƾ[�T[ѴY�u}��g��,A�D.��[t���suo򜿉J��ݫJV��Ѻ�y��J��˗W?�x��%-gw�LRB��eVL�F��
�0�M�F�#%{^�;��;�h��FDZm�I�=�D��1x��!���@*�O�#��tǸL	�J����8h݀�1�	��3odO���-��x��؄4=��z��
�s�٘�S}&�4�)lb�7ھ��vs�]��,!]��3�?�L�n�,�Ý}]���4]d���D=��xM��+�	�կQ�T}�����3�bX
l����pČ�^���}f���m��œD[,`�5/R@T�44��;yJ��E�&�3�S�`1�u�U]a0��S��5(M��8"pc��f�?¢�M
u}�ZCT2��IY�e�ÈZ�5e�w>�f�6ϴ�BL�I�,0�t���a�i�hb|
8Zd���Z�(��n�$�6��yx��*��і�g�z���1�����Ըշ8fs[kN̓
La�j\�YyEHҪ7����w�R`g�������3^����V<�];|0�4_�7N��B���a_N!�臑)&�*�\C�ɬ�,�[�Ş���:���R$���C-!)א��H9��Z�MΝF�OpZ���3*b`�M52(L�u˽�Qn�T�kUP0Cߎi�� ��>05l!P� ��Γ��t0���7�(]��NG��	i@rA�uH@u�߲�����j���y���4g"nG�8��{��"Ȏ86��f�!U�XA�15�^g#J�9ð�z��[�}5�o_�/��rNi4isz܎�y@5���`�ֹ����"�t6�US���GT6�
����Á��=�[e������i���)`m0��;pǑ�@t�G.+�h $@KY�#&�H��z``��*��pp�<*||A����2;q�;�6>�5�����3H0��x�o"O�㓘��N��&N`�ry��������q�ѯh֎;OD�2oμ	t���$�d2��
pܜނ���:���D�:�n�MǐXݙ�)@G��!�%9�#T;|M��{r���F�c2�ٓ��H��bA���Ou�����:N��%�/B+��3�T�S�x~����\Bn���0'�|��Ԑ:��E�J�bJ�����}x���N���'ތ3��C*�W��N<\�D�5����G�������6\�r$l@�
SP'��#��2:t>?���r^lih�{�(E�	�q�'�z�)&eO�����#�O���H��/b#B���AF�	=���c��a�'�m�z{��t<�I��%���X&��k<���)~�b_'pB1{3@������8x�?��a�hγ�( ���#T/���M�qȢy.!��$���,e �1p&w��hWt7�,�t��
��[<��7<��������+w"�����X0��z}X��Ծ�g���너���Y���.�������C�j���s��
�/4�rQ�^FD�	t�L�dк�L�4���Lz4��v����|������X=2E�P~����ʇ���c�(~�,_�b_�Nt����^�!z Ɗ��[��=�Ɠ\��by
X?U�q�ɲwIk��c�;BFy�Ԯ�
;��,�5��KA%@ESA�=���t��x��WUt���[�t���Ф��qN�qts哒E��i��k��P��J1k�k+p`�����m��=�]�V�k�@)@�(���>��B�C�{�~�x����ؕ��r���r<��l5Prƺ�.vqk�;���C�oc�;Lc!݉�KkT����9���J�N���W_]|x���Wc������fs�~Av=�t:�O�*�>���P��P�q��ɜ�X�I~z8LRQ�Ŏnͻ45�������wpx5ע�]��^��h����x8�����Ï��:��5�)i%��_'�,�[<���	i�e�y;��؂�wY$'�잔?;�r	��WfX�0�I�2g^��x�ԏE�ݶ�<oo\0��6b��H�Ϥ�ɳAR?�k#����3���*i���� ��+�^mӔ��2=]�qJpܽF��lq(�_\x!��������3{g�Fxm=�ȘS���Z0ߢ��^v�Od��v���[�w1��
�#V��l��mٳ����?O��G����l�4�DP�lER�z	�*%_�"�����a�/(��L�\�_r���_n+Ք+����ߞ~�kxz~���%Y�ft�����"���\�L�<��h�F�A����2�l.���C�k��NK{�⺂R���Yv�w
�ȼ�s���n����l6ۀ���1K�$b;>��Kל�-�I^��{�o.��Ÿ�{,y���Ѝs�V�������Yt[N�lر�x(~���W��N+�cW𭐰W�?פ60Tdj6����[Ȱk`���4Ϳ��K����ט+L�9#��MY8�4�c���{�6��@���>�R?t��u4{ݣ�F��)5Z�	�x��(��T�L`	��(�R���D�;ȉ���웛���|���BO;��O�HD�'�馤����2��\
۬�,5��.�ˈ|$�o�L6`Ak�ͧ��}�ϟ���rW.��4��ʹĉ�wՐ�2�I!�0O@�-��n��l���Z]�~��~C�b[��%��A���^t��w��-��Ze(N�i���//�8��"%8�˗s�nwz��g�����Ц����ѷś_���[\sx��,x�
�Ƥ�D�ts�(�"��VNjwcE&R=�Fy��½/���|njY�_�0�dV]^�VJ�a?�����\MM�.�q���Y`C���6M�B��e�1��xA_�I��́(�,�C��Sķ���ۭ���:�}�%6�R��
��d�sl�]��lL��R{-"��R�i��
t�93��ݩ�_!".�ލ�_�>CV����%o;��P�������w�N@�M9���!8v�Z`��rKUe���@,!k�C@��5e ������:���(��7�b��A7x6�i��
Q2j�~^��a2�u}�<���4
�Bnz�mK}�gu��{�h:���k�]�!�\��Ł��5���W��KR1��]�O��]r�R܉\��z��r�����u����??M�?Otv;�ƶc����QC�w~�Zg���7�Դ�?R[?\�x}D��c��9�,1�V�-���
�:����*R`Wn�p�ϒ�Ie��$TUZ|�6���CL�Ъ֨�a��"�.�qu�Gӑ�AD��rr<W)�aVe��ۺ���CLӺJ�G�<���M���cE�^Wd�3�B���دH8[�Y/�c���Dά�0Ja1*0�3�����tl���ꟑ�2ڶ,�+0���څ��g���4L�%��|a��Fd/
`ߨW���1��iI/�a�(߯3t.�Y/#�^����}0���(R�0�F��!0��2�Ii�q��\���e��;��6�>6{Yʇ��k^-�RS$d��{+�Q���� J*A��a�믄�C3^��<u�
��h�蟾�Әނ@aK�� �S"��r���p�[�x*��Z�]�d�y!»�s���%��{���I���s^�{�3>�X�r��=�-+=�6>ћޞ�w����myLx���3��+kҚp�n���~��"�@̏�[��qKm���ʁZ�L^�R�*��(�$�|��5�AdL!͊	I4�?PKk�mWD���X�Fsetuptools/_distutils/util.py�\���6��}�
��.R�D�عT2��ݬ�<�8e{��gU	i�C
������ A��8QU<|
��_7�A��u�6yQ�����y��HJm�Zѳ�9�u[�Mn�Z-*)�M^nTs�4*3�.�F��F�ecNL��Y�%��J�'*�&k]�'A���۝�Ї��J&`���]U�]�M�Q��v��L��e}�/SS��5/���>9YWf�b]U������EҬM�}J�����lwy������ݒ�;:��k���%�ҽ��bY��{�˓��L��F7�S7˝�B4�8Q����sݴU���~���׹���i[Ux��X���x��L‰Q5F��A��뛮�����R�j�"C�J�m�OʌiL�m�^��ZV���9_����B?|^�M��A�7;S묣�qjv�%������-!�Z�j�77���6x����s���R�=��;�2m[?��“Lz�4�:�f�^q�XV��	T��*��&_�=IJ�|M�c;�2/�F�����gVv����2�juy�²	�w�}%�v҂=�qa�M�l؜~��B���z>zNR��?O��O��[���]d��o�u��I�T���*l�E8���t�H��G���v�9���݀0
���x�B����5��`��%����>i:#D���N���Q�����z&�m�N�b2�ޮ=��]�����_?}�|�l��w_�;�����������A�V��7���x���G�o�ﺫ&��*��._�4�������/�~����	{Zv
����L�j�?���z�#��1O���",_�$��f	3��%��@!~"��i��V�j�+Rc�����,z��ŷ�~X���s	��'O��ٿ��V����)T�Z� �7���u�?��V�,�zbTi̬(b6�Y%��R�^�����p��,i���7��![����i�l�u���A@SX�V	��h��"�u�x���&1̊|18�c����<�	6 "��X�}�8�]Ca�м�r�:��c}`
C�]���CM
ʭ�j��'9&��@�����*��H����dbخ/�Lڢ�����=��)m�o5�z�vP�f1Wm	�X+�U�ި��DYw��aJ`t��
�·kஜ�fm�*�s�F�����n�"Ֆ�:렉e�p�l�;a.����MH����S/�S�SR�����6�;<��
��$�!'���#����J0$F��@s�\Н����)�v����,~D�Q�Iy��p+���u+{%�Ӫ��\��l"�)[#�.5��!���@#�d�ݓ�|����������+\��C���5O���m�mr�jo�[�]��z��}c������1�ƚK+��o8#�W�gs��w:Y=�e�;������h�pz�����D`�X�j��[�M���%�qp���Eֲ;v\1�m�BW���2��r�{|��]�� 3��E��#�`��/+$q�#���)�0�l���.A����0DI-���O�nW���ϊZ�5���W��3n%n1��0g�vF�����D��#��7�DG�l�(XoIm�DKX
��Y*���`�<���,�!�|���Z~�J�[xr8��x J�1���)���,��Zg��J�	i
O��������*�5d�L*)���Y���:���߀�^[R,�_i�*���00&įJ�+W����
$iӲ�h9�[7��?��sR7qW?�a=#&��\Ќ�!K�S�^.�"����$S$�M��0�}Fx�ު�#�Z�ov�~����:�>�φ�/2
��
��!����Um���L���#��?E�֠�p�-ආ?s���<���u�L�$ɍ��6�����l̿��y��:}2|H�����sG�$N֪�$.E���ee�]�b�>Ę��O�p�w�@�"H㵴�9&��:���m���ި`0�n2�\Q�g����R��k�A�y�ܒ�{ú��Ea������P��2�=��<y���y��=׍�I������.��A8((��ܒ�z9����X�H��B�Z�
W��VSuqW�eˉ:�%2]Vg~�ʚ���W�Fu"�;�
�Ȅ2�o�*qW`]`7Wuo��<W���*|k�.H���T�j%��M�E��viQ�����4�qs(h��\���;�o*�ir�B-�u�a��#X���}N�y�[T;2;�KJ<�M
{,q
�A̩L�6ӝ����OՂ	kuc �>�E�7:�qIf�-a�&XS5ٹ�x}�T��E��G&��,���pX%�n�N#�!�?d�K/M�u���B�任}6,������5��>��g�o�,B\��lv�_�j�7�Fȏ�eʶ��?��W##>U��Y��}�.�p�#!���s�o�IT�%u
hȟ4Ɋ��NH�Gv���q3$9��6���&�G���]�
��Ȁ��Fu�u�&��]��M+J��!@4�-HqVA��,� �EȒ�LKJ��ٝ��� �.�
{���Ƒޜ�S�dL,���C�������j`��aބ���[f0l
�W�!;
�=H�
پ༑��J9^��1AUI/������@yRe�q�r���s	Ǜ�0����g�eB=�eQ���;�D��!��3�����Y,�V?�8'<
{;9��V�'�4�X�c�Mv��m�b��,)�w��u����rѫ��1W��<�ǂ��P�]�����i ��|��W.��d� ���<"�ugG�Y�o߾�w�2�.:��{�.t�]�U���*��W����o_.�wy�.��_ߟ�s;��aN�ѥ�0�������ź'1]3��G�5��E��i�Fv��b�ľ@˟e����pNSuE��t*LV��M�
2't���\��B����+��wKZD:K�$֒M��6$%���HMe4��6gz���fC�)�#�L���Ɔ��9�Ψ�����6�d
�g�l�݄t��_}�
�w��N�������8YR����eE{O˚�̻ٛ��K���Ӎ~㐏�L�����GL
�������<C���
��Up�V���"�!ot��]�p��)a�^^�߫W��>�9�Gp�����AI��̳�\k�
��I�bU�;��j��jUq1�T�I�{ͤI�BC�H�Jt�
]P�#s�_���F0^?B-<Xa0TB{��%w�L�N��tK�q��j`
<��93��*$#�LK��Mt�tl�r&yMY"�qc�M��.�lb)�w�9Jc���m:!lQֵ��������L�R�N^�M#��v�]?;O��n����a���o�Ҙ��$����W9\RlLk߲�Y��(��8s�E�����yk?����sA-��l6As�X�L���Σ�\�K*��bE�wŸC3ؠ�ͪ�77
%ݦ���q��P�v���n6ЮQ̬�A4�R]	h���ىW��BȖ<�?h���%:z�-t�Rm7�h�_�KhG_���-�Q	"��.��zX�]U:�=���WԊ��c/4�mi5�6x�&y�ɳ�z최A�0�%���|��ܧ)_\Dž/�p�Y���O)� 9����n+�4�]��Q�v�S�(wIՌ�DZ�ļyA�h:�{�.�'fo_�k;k
��fUm��;,�>�M�U�.��:�C~����P�>?h�샆��~]��%�?ښ$'���|�ڢ�U"�Q���pFuI���d̷���D�F��m�`��3��������*ِa$e4��h'J�Q
ր�:�teRM�s@Ç�����^�`��f�僄�n����gDu$D�j�n��%1��լ�/ϐ�W�eՖ�g=�psM&��m�!&�N9Q`چ�8&R`\M!k%9���B��v�m^��%j#!�6&E���.B��&�>��tC�.���"E�Hn5�^�$�B�/x�lSD/N���_pQ�>Hf$m��$�KZ��QF��QmZ�mw�f��iZ���d=���e�+�U�}��:��M������S���9*���䑹Ȇe��ۏ�1ڜ�� ^.)�].E���/č�g�G�v1c

���;PN�H�],�]�3��fӉ���T�ug+F�lfݗ�Y��T�YSP�>��hm��#�&骂U�L�s ���;	u��0��ܩz'�
ִ�L3<�4�Z�_S�"��<��ґ�����$,
����w^�]ﳮXR�Ւ\�]�\����
M��JR�c����0!��E`�y��@��'�;�R��Y:~�8vڮ�!2���@UI�NV�%�(�J����B=��L&�;,��wd=�7�j���v76�f�gs�Z/���9�x.��g��\���{}���;G(ej�B�N�Q{l��Jz��L���t�x��C*�/�T��j�ЙЭS��Y�i�������J�����ץM�O[�r.BC9&��O ��Λ��8��n:	�QI�p��s�(I��{#�qB�/�g�sC���J�n�:��7��1:�D�YN���H��MRer�I���J�$�]����z&��s
��6�n1>�ՉSv�IDҵ�lh?ek�|��!����a�����P���o_��x�ź}6	�$a�|E��5YO�t�R�]FgV�َ윪(YS��O�
M��_v}6��"/���-2FTs��3���no^\c n�s���D�E�N�._�# �?�؛��
|Q������?#�>��y?�?��>� B,N>��`MT��8� �l�#	l� S"ꩩ�I;�P�#��O�4t(���8̙O�
������{���,"�F�J0KFW��I6�ʹ/f�Sox��&ɋzfK�P$F�j��ɼ�@�K-~�[5q��F�ж('yt�3\��R�=~��I�?����_�L2{���&�Y{��3`4����{����{?V���V{�,p����K;1�n�
�#��3���|8(��,�<-a~�R�'L9@/)��Z���H�g͐��RIY47�D�hT&�Cj�1�B0��Tغ?�&�Uޞ�8%�fz�n�#)�Ć39l�ס��G�g��
�(Lu	�(V!h}T�.�]bC����hf
.��Q�-Ρ��RH�Ю�ը�fO��Pv��n����p�J��lmW=�����{�}'��0��;�7k����%Tu�J���Dk���Ӭt��������1��eW�9U��vY��.؃��M�.:�b�@6\�sn��	�%ORwS�<�ǻcS�˧4&e�	��%Ͼ�2��:�۩q>�i1<��|�s����hh�ǥ�x�.{
\x8RW�c:i���d�土��;�<]~��Y�ufvT�����D���K�°B"m�G)f�;>�K?D�W'�/b�SB?B�l�TW'.������T���/-�]p����=�����鵩&(��Z7�����e��˷t�2��;��$4����7��XW䰦�yC��m#�;�����p�<x��3:%Tn�J*T��xC\15>��,�UXO��W�!jT�Y��ڝ�s�%����d�&�G=1t����D{J�mI�OG�a�;�����7�躮褮=�À�2�	�Ǻ�1B.
����}�I�x[>��6��K��&���J�nW���阣��u7�d0�Ҵu���	��@��ѱ*�̻�z6S��-f�N��ƺ,���WC6Y�]�~��e��j��w?����&�~��CvFv:n/�����s
�v��L
T'�w���,�?���<���^�����G���\=�U���jR6�0�\
<1 X�/H���{jਏ;p���Vu�!�n��#,2׹�
�l��>��.r2���^��8�B���!(�k��yE6Tuۭp������[��W�o�a�1�&�_}�E���Vܷ������4=�Z<���s/����FH�Ŏ"���O_��N���	��>��ȗ�g|Ԙ���e��^���6/
����)鏷�@����U�v��b|��m��ڊ�J[\��MTӿp�!=
)3�5�㯛�+��1[
c�04%`����<��/G��X�|��ϙ]�|��/q�!��
1$�ٮG�m*����9=��,i5c�|_�U�'[ѯ+[r�4�R�s����i�N?xv᫝�d�㧎-���[�x?�p�xَ���xO2Ǡ�rIm�~t�_��첺i9qE��m�U �*�R곍Q5��8
�ʣ�3�f�]�`�2�T;֌�N���7��Q�u��<ɬ�^��7T���r� ��I���OL�_)�U�q�	���]{ �W������i?�������A*������gȑ��w��	%.B�}����3(E��r���*������NT���N�PKk�mW#q<�2 setuptools/_distutils/version.py�Zm�������:E�"�$WRN+��Dw�T.���d�Ih�̓�ݥ���<�f0Cr%_>h]����F���n\^\�D���uj��W��E���K|���Te*��Ț��xn�țl�*��D\��?�-*Q��~s����E�`��D�7
��Z���D��g��gx��F�TŽN�q*����*+e���,�>FL�\�	�����^�������i$�w{U)!��TH�Q?�4�ꖾ�~�*�߂�����y"�TF�?Do��a��cJwR�h�c�$8
��V��B��㸔�Qc�)H/���� �a��@�&٘"S�L.S��$����[��h�1�^�:p;��Jj�K/�F��*(V=ƪ$�-�v�0�o⚔o9�E�#e��^��x��xos�)�T�dF��$��6����k�X���v!n��KP�'��4*^����mn�|.��Y�%��T�T�*Y��&2P�/2���1I�������vW�(�ghYRqVbV�=(�Qg��0�Z��?�+�4Y>KHf^I�MkGց��FY�b��q<Ef�������!w*8���_��U�=��Y�X�w��V�u�7�ѽE�1��ܩ�"Q�F 
��ˋ�|����lߓ�5����KD���uBvS%7�U��
�I\?�Y<�O��n�Nj��Ĵ���H��˩]Qn~�1�����a��ͨ
��G�(&���$u���A�4�]@rV�������b#MO�n�.b�I����L(t��z�s]��SBd�Ʊ�/��3�R,C���4�R�FuvB�HX�Yn^�5���D*2V���)��$���?��x6'F�ۙ���g8��S:�r�SM��&���P�o�O1�O��!����#/rA%{ڧ���6�KսJoV��±�b��T�T���b2��?��Qe���zͻY��C�����#�~j%�1)X#7V������#���碾
N�����k������\|9`B}&��}Q|5`Ⓢ�+�X���8�X��4ĩ�a��0m~Ƅ�"ǡ�3�x�7��Iy>�	=8_���Lh
Ll��%&.pp�b!�*<�QD�<D�g~):�1�&�`ZX6��F�(~���n�BSR�}^B���/�A�p2!P��EYi���4�=F�G�^r�p���a���k��
�u�3��'X����Ed81�S�|z�J˰0=W�l�;hy>%��2K�0bϩxی9�9J��<��<�_hø��"�D�^g�!-�|J��Be���@�����2�����������kR5i��Iж~�}CI�kLm,0���]�V"��K�N`���6.��y+y隸G� �>�DB�2X��9���.IQύ"���J̊B�g3]�|i�W*U�n#x��"�7����"E��l�{�jr��G�͘��8Vפ���9��M�=3
oR$r�H2��@�H��1Ǚ�L�uC��I���0��!3F*֑��E|�´�v ��Wgw6M��_lj�s+�t�iƔ&pBYX��M��mr���B�g=��3�X�s�q��4�-������
߂�W��m-��蹼�o���s"T��|��|�(`��vDW�o�U�
�����LC� JZCW�X��	� p�f��LYa�l`�ۡ����Y���x�Q��l[��C���&?&Ϧ��H؇��������w���(|��/���o߈������iHئ�$=���t�E����Ý@�u~�Fh&��J�_��H�����$��j&2�ӯ����:�
�נ6��I�C~VN�3����3�b&^t���:�_y�nD���A9AH���'xy7��R����@H<��l�d��S�`��'���Ż�"��l>�j� �!Lf�S���p�oW�8��wz�q4��:g)௳����i�~,����s��h��g�	�(��%���`%��@x�=�2!.�5?�k�W�eȪ6��|�s�i�c>�>\u
l
�fk�J=�<b�7oz2���AgMD���r��'vٞ��3��|��`h`����-�*�]�F��).�m͗�/�6�]v��{y���ގ�`PL�/�E{��_�Ar{ 3����-
&9#�x�^q���WC2W��3~��y���k���!�k����^e��YY�0x��[=�s_'�Eߊ�%Z��[�8E�-?���tNL�������9�×O�y�a�� �O����r�֑���ˆ#�%ĉ\��1P�z~�W�v�4�R,����A����#+*բ�.⼣D�)�qɨ��)�C��6u1�%E��x����{g�=�4R���u1��n�ݱ��8�9��T������\�i�`�s(S��3�5= ��bW�rOe���u5��.�?�s��q��0��ϪB��()!l3:mm�]�]E��u}���	M-����E���j�ͤ��T�t!h�J2�H��TȔ�Z=��|�x�Z�F��9[L`r�:w���1��Ll�D��R�H�D!#W1uT*
A����R3�?ȼ��(9�F��{� �9!Ee�}P\d
-��sFSk[J*x�ax�v��)[Acig괭 8w9���V��2�{ni�=Sij�Q����@G��5��Ya���gWeAG8Rn'�k6�9A��濃�C�5���eZ�%2��F�۾�?�ǿ��Sd�v�VՃZ�R����SI�0F���.�(������u�4&�I���Ҿ��a�So\��ʅ�fМ�MWb��ս΢��ZK0v:œ�"C��I{�`A.)�M���%�x1fj-�ϵ��]]�ɶBJ0�ݡ�}��I �|w-�*��'3�^kBKK��s�圻R��ZMMm�*w[���uY��HDž%@�}
��.3;
4>"SS�H�ѫW#���P����#��ыh�X��)kW#���A�6p��C�X:�Pn�����vd�	5[;�J�"y�E�JF�$Yp!�x~-�/��\u�#����\t���!;��>�g��9�X~L�� 72��o����mb�����˂[]�l.bi�)<��]Q�2[��N�M*I��}Fe�j�@��m�4����:s�0�K1�p�eR6����sH�Ȥ��DZ<�X�|�'�\�"O���6��u�D�E��
���	8�)��������P���U����ae�|��{*U����}c��K-]�Ms���a*W[{?g
d�]5��D��ۙ�m�0lDCה�AŶ��Ԍ���r�l#D沊�\�u�Iw��A?ͧ-�19s�sﲹR	����J&�Iܭ�Q�^�F��-
(ŰTF�r�;=�]5�F�`I�����2bR�RL��0�m�Zn3�Z�W����5�l�L���!`}p>
Ɖ�i+��a�7��頟;{�����ҭ�^���_���F*�����t�0Su3���Uu?H�;N���x��V���	�p[;!���h�
�
���2�raT�9����Ap_�;�Ψ�W��#|����ٳ5lA�%I�v�	�,vn�B��C�,k�����Ҷ�w�	�F�A��y����������S���;ɰ�V�ԶD�����@2!9���F�nY�
��
�"1�9E̤�w�%4�
rZM��)����N�]�Fq������3�B�"�Q"�뒈��Q"=���.jQ->5�,Y�q(S2]̣�U嬟7$�Q�ʾ��Ą��>6����7Ί�������S�
øm�F9p�(8�	Q^9�\�	Y�%�@�z=��S��#pi�J�ՙ�
��[ʄ=~�_�廝a��g�K�:isd��Ƒ��Y0����o�c4�1!5��S=#*�NXξ�^!���j�^v߮��B�o�-V����9�^������UT�����h~���.춽\�ZuM5�WJzV��)Z��/����`�b�����Wq=��	E��]5�G�|�R��L�ކ`X�eKW�V'*��Y��B�Ts�0h�0Ae��g�(&D���&׵o�HG4b4t�Z:�Ucꢉ���r��;z�1��j�@��'�S1����2��
��ۺ�AGh[��w`99�ϱk���|]���FX��",����vM����������n��GV�#��Eq=��
yd�>R��ߵD�����=QR��:�n�Aw����n�[��Q�$����>xЀ<�CW�/�h�u�"g�`~��x���{���pB��)uC�;�O5�~i���z��Ƿ��i�Z���.�Q�uo�k���_}���
��PKk�mWa��U)setuptools/_distutils/versionpredicate.py�X�n7}�WL6	��Ȅe'/��  -�&�CcW�v)y��eI�v�{g��e�1�Ȁw���̙��e����*Y�X�,0Jz�d�U�l��T�J�X��8@�A�4���@����A�kpӚ��R�4e=j5��,M>��8Y�e^��
� |�F]��<�>���>
_O.D�E�8��M{�����)�N��
�x4K��I�EH"."|}D8?Kq��N�
x��RZi��,5oQ��S]��O�fӻ��ݓ��t��3�|�V"Eij��AE�Z��
	�h2�!��/
$�s��q����ߕ�ԅ���N�G|��s���O���5N���WV���(���jƓe��}��F�R�eK��AC>�uI[}[y3��uϡ�Jʎ�&T���b]��J���:5W��Bo*����kQ^�D�#v�Q�T�#Y�,��.9�;�Fv��>sY��,T��]���k�z��5O�f��5���F���nd<�l���ʤ����d�n���=�����l6�-�+0V���F�e�l,NFp~�?q&�#x2�z�J��g�0��>])X2W��^n�@Tu��4Ҁ��j�e��ƨh 6J��u�U�d��HP?��vaL�%��Ů�nU��Z�Xb����^mrY�J&r�K#D
��,l�+Sa��pk��C,,��Z`z�h�O�JU2_ކ�re��bY�R�F# ��DU�i�l�K�Ki-6��1K�8�$81-Xw�
�1���[nlJ���&�����p,�Ck�z���q�Nܰw2Ӈǽ�_+��
��`~�
��*S7)y��q�*��ԍ�%\_���%ʃdoB`2��S�1���ip/b���q�����x/nw�A�^Z�@HJ.�qY�^�SLa��>���+��'R[�7��ɏq�Ƣ:ՙ�^���M	|4uB�~�U�ڌP/�(A���6��VL�X�L[�����4A�-�&��.��{Ñ�[JÌƖ@�8�Qֆ���
5�@e�kTR��Zfčv1���#p[���R�?,\*���r�x@LfC^����p|*N�?�_k�_lв~!4��Ej��P�l5j|�*L�w���!�*�C���.UY�#1O��t���$��D�`Y�=t��*HR����3�S��;����2���X�Ig�g�_��;��]�x�T�SB�D�V�>�9_�Tk(</��Cv����>��W�g����.�G��æ@���w�*�c�7��ɥ?��8đ_���$�">��+��)��?FAt�ϜV֣Lr��k�#=�p��䲟���K�^��������b����D��bB=\B�F��;�ǒB���@�]�j�-��(x��]A�a��5��1 s�R�{1�,�rC����u|�5��D�݅* �l��t�N˄�[��W�V
b�Xnb:����[��R>aIW�hk���E�aoL��;��k/�b�s�=!k���c����`0�	��73�������pK�ߝ�ݹ�p��VYQ-Ev�CH�X�J�9�7"+���Щ�Хr�6�c���8�C�rG�kJ�ԴdҢw�۵k��V_�n{o�F�Dtx�<�H|���b��^�+�uV.*�͕��wҦs��z�-~�|S��O���i��"l�K{!]h{!sE����Z���ڭ���-9�z�5�&GO��$����4�=�j�>�Uj�5��'t˗��%�ӈҏ�٭���z��[���w{�h2�8;�PKk�mW)	���)setuptools/_distutils/command/__init__.py]�=k1�w�
�YJ�L�Эt�^���ʝ���Ϳ�S�pwڞ��ˋ�֎K�+K9��=��7��6��8��>	yj\9�g@�A�m�����A堵Vʘ������x�w�:�
�쇙���`�m��W��
kSl�TK�VC����"����Q.[�	��a����2��(�*.����k�����^:�I">��PKk�mWSOV��N2setuptools/_distutils/command/_framework_compat.py�TMo�0��Wh��RgCOf`��C/M�v�aY���dHr>俏�g�%�P_,������0�/��l�)�U͜ȅnOJm�ZW�ؒ���D+R1�xJ��@T�6�ؽ�z\���Nk9�&���`�+?�U)VH�y�'�4g|
QPP,�PD�ǀ��C��B�`k�.�n�
o�;RV�V���ZO�q����@-j�TA6�6�I���;���vF�b���M6`��*��x�m��-|����Z2��*����l��m$o�Ft�;�LI��d&$BMJV�n�m��(V�7p�3���
�bG�u;�ɺ�.�1��+A7a���������2[,��OaGn�5Fu�)L��ݨ�o�v��a3��[�x�X�\[��T�L��0�O'���+А҃P�1�7�����2�
a��}�z�
�d�Ύt6y�H�7o���:�!����9_e�[��Ɔc+�g�����Bq�p�r��*�墔le��w�r��h-7�v�R�9v�,�cP="�Ol;�Q���d��z��Ik��|���,Aj����Ս�~R��3Bon:0�5#v.}6
ĉu�ft�QRs&Q����v���2Qqk $6?���N�Z[��E�α�L	������_حp����Jx�k��b���PKk�mW�����!&setuptools/_distutils/command/bdist.py�X[o�6~�� �0[�<���E�v
�-�2��H*�S����DIΊ-��s�9߹�Q\���Jg�<�(�--�u�LM̞�7��Ė!&��$�b�0Bɶ�!w[.�:�Ȧ���H�(�~��2Dj��H��ԋ�N��
ň#����IL)��'v�T��:���e��Ƌ�׀�^�dfS;��bQ��{y��wjt�^-���7�C*�K���+��q�$��lR�D�UK���{�Q��bGE~��@�ּųw�h��:���n��!��d���n-Hg���(�$r�����w)�r^�]�}}�j��Vk��1�M�X0f
,N��9���ٳ�N��9⭾�RH^Q�	J@��$ύ�����V�<Zxn�ij#%$ine��Wܜ���V
��!�Y�[n�!�Q�əᇤ;vi1�H�&�
͜b<-@�C��	�@�G�����tmh~_�V]��)=>6z�+0��s�m�A��Q}&m}��Q+�h�6m����nLڪ_m�f����\���t�F�'��|q7/�Q�bc9�=�
#�� �K������@�L0�`���5�B�O��\�K�F�2������/��W�/*�r�ȉM��f5mM��>��0�8^����ƀ��Vs@#��:g����x��y�B-E����)F�P��?b��4F�E,e	��sQ!.�������*$cA�{&�|��Pe��޵�Q
���s.��J6�Ĝrl�;d����Kf�Y�ն�VŨ�0�[癚D��6�&���-�i�uA���x�Ɗnv-����8}���M�ִv������v��宇lT}��i�ȣ�A���.6�+r�UE�!�Qli�ޓ�7W��.�ǥ��m9�sr++��^�����o�,a�fK�B�#�ɧ�̏�����R��
��	��=O����ۢ������w����R�m�A�V�p9����$�ñׅ�k����U�)���������rEs���D�i��c���-�~V����ӳbg�p�+��s���oק��������Ե�.X4�f�
!�RT'b󁉜�.!��~�ԭ*\pá6��ovm,,����78�A����snc��_;���f�ط6�o�eH�mpV�O��#�7/Ȟ>ة�9����-��#";Q���o�
r³�^��Y4�-"�g�fߡ�E�x�
���v&�=�b���Wh4��?�j�L�q��E�\h��r���9�q�����b?��a/�gďh�O/����,	P�ɳt�A��FŪ�=X��R=)�3��}���"饖�,�gS�tf2��Wl��r�#��㩧��f�4�t&W�¶"��u^�i�u�{�9���o�d��SՊr�μ��	7�E����ށ-+�=2��h^���q
w�O�X{�^4��]�_9����FL{�[^B�������f��f�u�Hg��`h�����a�#�^e6x��}��\��+ڃ_I���(�›_���~M�
�3����F5�3R���%K�M6�H�ihc~(|;��aFC`6�曀���&Dҧӏ���x[����ά[�>����t`�qw�ͯ�r�R�='�W#�$T�{��g-��&���q~����,����{�~��*���9,���'@ZR.�0C`Npxȑ�{�j ���
)p1�k�vi�w�S�k���������3�+r�>�
ڰ����W�n����?PKk�mW�j ��:+setuptools/_distutils/command/bdist_dumb.py�X�o�6~�_��
lcw^� �6ð�m`����eHr�k�}�dٖ��0��&)}"?RT�4��6��.��r�]]�SU�C��~�[�@g43g`�xe��Z-Y~T�
0�R��0��$���
e�{&J(w��
���x���d`C����8�A����F<3�����ʽe��I".�T�I�4J^X�[P�Ư?;P^D�����[n�.^^U-u\�#TF�tzPP)@#��m@)�������8��$������k�)q5g�U��4�Ʃ��Z9i�0I�c˵f���q��m�0|j�G%z��;�N�d��i[$u��UIk���HO�"�G��e;��_j�Pquũ����Ew�d	V)v�ӈ����p��d�!�1c�N����":tf
�Z�F�@b���8���Cknٍ.Rv� _�{*ir�l�8=��>#��v����ϳ�IY�_D_�oA���)k<k<�iC�kj��6�%.#O�ᘄ���`҅��~��VX}�7��3������v���V!k2� �=)�D��2�o���+L%�)�DH���P��鄣�&��^��.:Ԯg��C=hZ��znΚb:��ᭆ�EV>!�#�
�Mj.0}k�t�nNAΐN6�8�8JaA��&8'$G�9��Fj��]dϽ�O)[�ݲD-���Cy��]�3�}�z��sv���#���+�_�m�B
#x+��_;��6Xq=Pz���P87&�R���g���XD[�h�(��^]��Q9�n�'�F�Z�m��y�����8G4k�m��
����	�[������c<����
�y�XH]R.�����و��.E!��	Өk�!���M@�������z�����y^�*�H����]f�C'����mv�Ȧ�ai��M�帇H}�A�<��n;��gEX:\�����=+��XkM�Dj�K�7g�����y��n���4�|�������E�r�����EE��F%����P�X�'+���&�GZAX�#R~���Ì��Rt���Q϶�H�[-_�j��+~��c?a�q���L�	נ��nT64^X��ǔ��8�M���_��_��c��q�����жd��᪎�)D�5b���'�ۻc�I=x�u"����r�^�\W�l����t^0{��r�S��������䦨4�K�;r�p�5/U5�<��Bi��i%���ڦۈ�7zg���7,WЫ|�e��/T�s����U�Fmb��^���V�߱?��~w��� E��Btqz��t�
H�6r�tD��湁	�������Goˋ08�u������|^���Kӌw�,��&6��g]�,���/�y���"ll�b2��!��;�5{ju���;��/E�/PKk�mWă���V*setuptools/_distutils/command/bdist_rpm.py�<ks�8��+�\���򚺪�g/�8��s�3����Ţ(H�">l+.���n$@����j&%�F���rg�U]�I9���&L�96E�98x����iU�j�����er󢂇g��Y��E�6��4,�_�s���d�8�A�ɳ�be=ϋ,�eٴl��Yyp�,�
��g����Tu-��^��7'�~�M�,�H��-�ج@xQdE����f�r��A�f�yVˬ���z[���d�DM���t7�x��j���
/J�^��[$Y
_�$,K��'�39: �����Ž�#w*Li��q|]�"�����?��y��؝��,�S����Q�[la4G��ؼ��ʘ�t&�c�
?.��4��2:)��dނ/�:A��إ�/V�^0�D���6uY�9geΣx��FV��8-Ë \@Yw�����y]�%���B�L��O��Q�K�����v?��L��<��H�9
*^���u?�iC����e�ڀ#྘��ُ�e|���m	Bj�]UL-[��(@�ٖ��5����m8���|�S^��jq�#I3�ƶ#��0�
M::T���y��_�E;�5ʊ��-�
�mRAHJ��}�ޣJ��*�a��'��ɉ�TKI)yU�L�"
�f)�:���"X�İ[�,��}�~��h�сΌ��K��!�т�(�u���n�:Yq�:֑��( bg�r5ea�S��8񖅰f�U�*��2
AY�9lJ�K�CY�$N�lLg(&�i��G"���x�qZ�M��B�ܮ�hMk�:*�H�A�xOҬzB�t��lQ'�<:����\3
�׌lJCH4}֔�~Ó,G��i</���t�L�-x�M{���V�֛9/:��q�t�F��7<]d=�ma?"�t8X��f�d���d���2�ߠ�ЉB��P~�=h��	A1�����؄5H\�����j?M/�|�5(�fa
�,���[���Wb	:�b�Cd��,��bi{��4��A_�;/�B�5�b8r��_�<DͶ����t����q�n��>�D�-:���:�Q���8�+<,�|ۭ8X��]��R�u�"�w`A�0��j�8�
����z:co�@Ј�ټ�0���6!Xf5��4�A�|iq-2�	D�I��t+��	���Ay�T�mz	��4�k���HQ����ܯ�&�y�k��M�
T'Nʖ�D�Hב(F��o�Ո.BÍ.1�:���r�������$I�y��oO_�����\Zgc���:t�&��#L��`��L�C::�P��p�ܾ$p�_�-���/,(:�X�U[g�u	�����DzE�D�#gHᖆ^�
͚�#Y(G:�����k�Q�k	�)lgr��~zw�f��Pp==8?{����ͻ����:= a%	i�o���k?�3������S��~~E���#�%M�
���ɫ�o>$7�".�?@,�8�x���������F�O	��a돁�w�Gq����� �:�����XD�>vjzk����[�$Sp�j7�Wh� ;u���a�D�|%�J�,�}���t#�6�@ݘ���Ѷʕ�Ĥ|��#5@ɽ��%�h���]<�M��[G}�T����0��r�'���rrԠ�?e���`Ǵ�f7L0�IC��v����k�#�hD�H�zErb�_�"���@d,doM*H
�÷!� ��0OZI���K@vF�sl݂,
D�c�m�k/�-V&��H]d�<�cR͏��*Zt��L�~�����I�(v��:D8 '"x��F�k#�EЄS��EM�&��g�ぇtF@�@��t�ˀ\�^W�Rk�αG#���,�}3u��wi���x��E)n���o���iM&
�x��w\"��\
C�&~�0.����s�Y-nd��|_]V��!��yޮ6��f�geq�u49Y�\Nz˓Zwhq��_����m9�w<��p�p�'��1�p���&�x����fs|���D�oo(�������.J�L����5���w�
��ɧ���Q��=�"Ap��Ƕ��ۤ9
����3��D�K�*r:w�T��ȋ���GaJGBd��Y�f���4#���~�G(�frt7��,ї�Mb�e��@$�Kor�?W6���^;Ռ�P�4�5#�Zj4i����&�g��OK�J�KMW2o���5�L�w��E�w��%�����ܹC�9�7�`��0���Բ%@�7a�x-^��IJ�c`&�)m,�#�8qI�<��g�PS��:���ņ��^��z�7Y|�Uw�;��:�+HG�;@[z˄΃Ĉ"K�D:}\�*�Y�c�R�<��IQ8�����p't��˭�n�C���D=���AY�j;�A��	�6Ϣ��tg�vo�!X�Ƞ��L�j��H�����Bi��������t�w��.�N`Ý�	��ֻa57{/č?�j\��?��S�uP)x���i�h'�z�!�G�M�\)�o`5TR�A�AR	`Xs08�HS�#<�'>C����#Uf��Z��A��Ui����f����Qr*���+�6Ì}F4QǮc�F�f��:����f_�#����=�u7Ue�
2������{2��QǕ�T��L��
چ�
X�X���\�7M��"Sl:뱨[Pw? �=O�ɝt�l�#s�w�6�h�<5�%��ѣ�$p�?�L�BXˏ>]�>������k�B7d@�ߋ�b��r�ϋ+kģ¡)[Lzc�մx&ClQ ��+����UF�T�.���ʨڂ/WO��qz
��~F��2/n����CEG��JB���&��o��Hsv�N�q��k���k���Ԋ�1G`v�=,]�@
Ҽ��$][e9v�b�%hkS�@U���(򡭈�4{��T�&M�śK
���Ä��5��7���f�<Z��m�磫v(6+��k	WY��E���IBv�)�τCimw��
�j��Ǭ:c}u:L�؊q�i�]�ʱ�ŏnn�XA����U�wऊ��+$O�j�-B����gt�Тj�s*PsZ}�=��	��^�i�D����E���k�3�w���2�i�0�3�{Z-��!�͂$���֚ө�p�[t`��t!�d��>�U���uנM�h)���0��]VƄ��*a�+��X��hWuˀ�>ԳOW�#9���tJ����-��†�6jbN��*�T�U���ɧ�����J�i������
���XY
��O�B�������J�T�kH5tT-�y�U\�ȚZ�k3��@	�-&�f/�4T��mK}zSHw3���H�x/k���ڔFYD����1g��-d
n
�Q�=<u�3Tv�ÿȣY`���_ &�^��R��+�����p��M�-�7�4afGk�m��M�ȃG�̬��!��&!�se�$4�`������W�{Q[�'��"u5����=;y|�מ*����^������ɽ	x&I\Yf˒������c����@�"������1�Kc�|yE�\�pI��$�2�p�Tܨ�N4.[��c��L3P�U]J�GIVvy���Nk�<L�a���?�zɌu��Bʗ&���
� �9{�zR��:�����}��S�ɷRq��/k�}<��[��KYC���$��4�֙�P�j�m��xw�#+��2���Ԍ!�cT����a�$�y��y��i��i3�.`]�~�0�+�O��|����%E�$1��'���>�񍛢��g�H	ƺ�>
���M���Dp�x]Sz���Q��߶pB���	�GSU���Ӡ*�@���#˵OR�eQWp2Y����]8%�@dz�ڰ�L�K��;�E�����O�M��M��=��x��2�`���*7<�љ`��$�8���L�C8��������R�9
ٰ���#���`��	1
܂iigo���Og�{��_gz}��j�WV\�EV�����?���KY�.�kB�]�b9�{���?@s�0������'�Wy���9�� �
�i�H����c��%-.�p^WT/
n)�	vxY�R�&���F�C����b^�I�$,5��01=IJ��&�Wt��0�b	�x��Eo��[n�9+E���c~
5Lqz��Dp��E.������śI@j��d�κ�&�p|vx;���B��$����*�bx�7���/�kP}yy��z`���4n�h~��T��ITD�2�FT��}d�d�Q5jO��U�=}:�W��gY�z�e��L��L��R�����(��s��|	
0��G��o�%Q�"+*��K:<|T�^/�l�c|Ȯ�$�ȧ��bX��牤FУn��f�|k������;,'G2a�	�Ss�~���ӕ�q�$�܉yDzf�=���P��n	���F��6���L��0��u6r[G׏D����{x�V9��.�j�y:�]f�%�(���;�x�uD&���*#�c�
K�#RTzr�)�~$�����~G��}� 7�Y�v��gmfUX��__�����=�sG<�
1ʼn�6�
�߰��u����+fT/����&G����h�ɧ4l�l�{^�ʺ#t9}�Kn����X57m(^0#��#%C�0�[���^!E��o�"m���m�'�k�q�h�k؊��sUM�mW�u�i�\�w:>4W�Z��\�
�����UU��V1K�[^x�^6F+`��֪%;/�������48�L�0�l2�2`>�0��<Ӿ3��v��Eҫ��M�H�F±c2
ev��F00a ��\f	�^��$L��l��mq�[��4�"��^���@Yp��ݻfx`��#��ԺMEj!��@�g���9{9�/hT����*���<B�)���<
��2tO�ܦUxG7���<`+b,$��F��{��#ԩ���۬���w�`;���A�G��-�W�1��>��{��6���Oy奨m �3�R� o5�Oi.O��?K������JӁ�SLvL%���X!s2�fT�gFG���F�:;�a<�v��
��*����2Z�e�l�:w�BIv�?u���KpE���~�ɧ�m�u"��k��]��b�<e��o2z<�g��i���M귓4\��/|A91����b�ҏ�c��l63M	�N\�ul�a�����9���XI�F�Ň��.����ű|{x�&x�������ֶ
����?�.�Gz}(U�P����:�]_T�ѓ��t��Co�����n)�T�`o��[�QFE)>#�0�X�+�����f\��T<#�
6In-�vȌj��J�a�u�𶥣#�%�Yjڃ�2�LO��)C�m�}B����'��~rx��?�1�~:�ǥ��A�&ŕs��>��v�#~l�&~��e|�ZF\>�5W��UW�uo�Q�)[��z��{bX��2�~ւ���'E�-Gn]�k]�ts�L�����k@�t�����[T_��rF?؋��%�*B�˵$i�W�ɞ����[�.�,no[;kA���!O�h��{�>U�C��8�������k�f�v�d}�0m_Hh���8��hX�
�,�LoP��'��]�~�$���D7�Mg�o���V$�'��NQ�)s*Y��ӻZ���Â
���?|QmM�;��W��W����(%�.�:�l��:�e½&�>�%���s�0V�͉�(QC�r��I�iL
K�z�I�'����PKk�mW�M����&setuptools/_distutils/command/build.py�X�o�6~�_�)$����A3`H���m�0�Ea�m3�H���xE����$�r�hj�w��ww��$I͵�
otYɶ��.�=o���׶kX˄����HjR�$Y�x�Ie�>��Q��Nɖ�`X1���9��Ĕ�J��a�?:å��$�r{f6]C�N�v�Z�lG�A>l���7L�,�Yx�a!��WVvnW
՚��f�q0l�k�+ŭ��$V��#S's�bOc5����mh�$N��Lm��Ӡ�پ�'s�[��m���O��H���T'voU�$_�Y�z�`��.[�b3�B��(�Lŷ�um�.h����X�w�z���	���!Z��Eow���H�A�X�!�I";����	���&����� ⥖ 5��l�
�I�*��y4��es��n�"	�!(���]�՚p����ڀ��1J�7�Z�	���/�/ *���㹄8Y6
Ҝ:#�Q�Ɔ5V�E�nAT�HX����֚m�=*���BأaBے���Ù&����h��#QL��,���ݡY�ƷMӤ�3�Hv;���A��Yc���
�6����X��lsa����p~�7�ۖ�i0��q�VʆQ1��w/y`Mw��p�����"�Hy�~���zF��KH�\p�i�ea�L�f�)������m�1��f
�P���[���⒎�)9Ph(P��#mz6����a����x]3A�.'�����C�˗�4qkaY�p���ӫ�O,{.Y�jji����_Z�Y��b�V�į�^�-ԩ_r���<00B�Co�ݻ7?���b繶o"�:;`LP�,k�L����i$Ad�.j��I&m�&5���Ψx䔔�+)v|�#4t�-�R�=*/	��(yMZ��^k ����ve���.��?@���g�GQ���8�����E ��>�d�B����ɋ�$E'ُ��M��
�l2'��ŷ�I��9�ýƙ��aX��YV�:������+��
ӟ$����������%�Wt'W�����!������JI>HD6B4�X��&�I�)Y!a�ݑV�=P�4��ʨ1*�#bOc�H�%�U����q�gȽ��GH�8����4��������㬐ɩxW�G��Rҋ�9�)|6�@��h����ٽuC��#p�t�[ò��3j�y�2=�J�iy��f�g�N�_��S���
��l�h�|!bV��\�����FMs~y`��0#�'�%z�pT^�
U>�⁹(�ּ���41�fM:^}��r!<�%��T^��"�Al�Z	���1n�$��I�Ǟ�"�9o�Zq�\����g��0����zb��^��/��bv6x.��L�9�sny�0u<��8�D�?����k�uy]�p�@R�	
��
��o�~��L�#8;J�����Ը��|4��a�o�C���rmo��bY4�@S2j���;/d�dZ�a?���)�X�ΐ�q���E�?6���z�"@���g*��1M�b>�_�?{a��P�H�ö�?A�#�8��ZBc����)����{U��Ѓ�]p�PaAZļ�
F�n��-�g�M���.�$2� ����}�����~.�8q�i7�9?Y!@5d���
��b5��a�s7�BL������C�DL���.��X6R�c��f�E6�z3�SR�ɨ�&}�^d.�xS�X.�L�w�9\��؜���<^nr�9益�߆K�PKk�mW?p��
+setuptools/_distutils/command/build_clib.py�Y]��6}��`�[�Z�1Š(f�@�Ev��b���h��ԊԸ�_�璢DI�d��K�`b����^RI�T������n����e]��Z��ۦ�E#�5̞�K���iVʆ����猳�����a���ecO�2i�Te�W��'��U_FFt��h�$1%�*.���oV(�����'I��l^����C
�bNܰ/km͗L`U%X'�VTw�p`���v\��w𩾰C���@O�^��S�2�wm'�TG����KƸ��Yw�x��^Cg�r+��S����kQ:�`�3��J����B
��?�V��A��^��R��KZO����Whqb�k���{'�D���d�-��$T
�Z	r2�(1H�t�K�;D����=��;
Q5oiw]�a�B�A�=�a����R��B��7f��)DG&���
a9A�<qu!9eoY�Xˍp�gy<囍lZ�Y���+�;����aHt��LQ���}�#����bJ��施����{��E��S�k=��W������ݽ�0|��a ���޸�K	\��6e�vp�ݒJ�	��%,qbJ��w����=�(�L�`��k'�@���>[�w��>�@	�>�!�2�s���d���XѴN�]�i��4�]Jy�����Қ��J���Пd;K{bn�Hؕ
�m895_�ǥ��ZM�dQ��)�	�ʣ"|�T����5����]ί�$�V��pq�2�",��^h]��O�y#�������]Ђ��Ұ�VBr��0I���$��T�J^��[#��gS��J,"�׆iG��8������x�u&d_�xpp�yCh�����ܹ��2�<s�h�/��׆zE���[vu��!F��?1;Eҡ�ٸ�f�t�dh���h���X��\uv�9���F�B��8j�����3I�>8��ƿ��#Yo�B�G_��]E�
%�W��2�#Q���U��s'Y�j�b��8�n=%���H�DnT��o��3�jx�(D˚ˈ�
��7��w{M�7b�COfi6{8P�C�#ʩwڽd����%��}5k$
�e5>����6�΃;���uZ��bݛ�j��(�C��'b���DFy�L�(O��^$�����Ç��*��ە8��v/�?�M[K��&o�=��b֢v��FP�[�])���?�M�O�G)es$#�)e�O��j�p����Q���S����̱C�ǽX�s2n�_�Ko�:JLgs��Y�K�lI�*�	N��Ï�9��O�}���3�/@$��*��%�5�v+=C	���5e�G�''��Y=Tԭ��'^�b����Q��-�6LB�)�+[��g�^vz&g�/�7� C�����S�5��K���~�mȸ̔M,J%HT80
_�*ի6�"��'�~�B�m'L�pj7Q�$��q8WfÞ���t�O��Իʛn�)��1����"��b	*����F5j�����"~�҈kG(�l��D�ظ�H���7�q=���1vg��/�+��1$��t���-�I�߆,)D4�$�!�Z)��u^�1�v����g;��}��3F�b�식p��ϱ��Yn'����<o�_��yϛ����f����g,E3v%�.a�*�t��/\���z�n�c�uJ
i>U*�(ȴ4���?&}�^��d�&}s�O~q�N�r1�a�8���}A?|��/vuB�%e��w�[}��%���,o�;���[b�#�jL]W�I?��`1f\�z��&��;��DrJ]B˓�Ng;��F��H��}�x��Ow^��-�z��qFF�0g�T�oh��q��L%{0d�9���Kܻ�ī7/h�G7 �z�#qӢVo�a$�-S$,�D��fdd����?C�,�c(F�;��e��f�h�^�MP��g7O�.�v;1Ћ��f\��Sv"���8q�ҵ��z��<�����P0'}�i��xYC~FN261���Wj �p��-��ֽr�:~b‹��"j.k,�9c[�Bl��p���0\B[��K_u��E��c'w<��I?���fa�&^����ii��a�j@�A ��k�\�Ľ�o=�{?�ZYMu�V��m�|�
��n��c��H�X��:�݃��W�wu�B��K���+�,�z����4*�4���!f!���kLޕ'�Do�����KX b�?�`���Hܸީak�d�n�Q���H.�PKk�mW���G#{*setuptools/_distutils/command/build_ext.py�}ks�F��w�
�Z_�1	?���hJSW���*��v&�x9 Ѥ�%s�����w7d%3U���Cݧ�O�w�>�L&e�����|�n�ES��}U��yx��b���V4C��"y��&�n�&��,Y�]Bϫf��+��U�<ڶ�}���]��CRW�je2�əi�ϒ����eR�h[�HΞ<yd�$��O���d2y����n����R=i{���[���v���N$��O^�]�v�z�=J�W�v7�α��}�^������Zt��v;nkuU t+�M�a��u�Q�\��V��t�lİ���Y܊�va�;6�'����7�V�֥�-p6�q#�D��t�~�1��F�9�/[�hbre���ߢn���쮞��/\`dIoz� �����ߝ�?��(9mI%����_KI���0�Ů�
$��N�urE�Jޜ�pdZ�� ��ع��z_ׇ��E]�+��4MЧ�!�>Xu���r?�.�����O�g�I}y6��������ӯ�G:}��Q)��wzk�lzLt�HY�P�p[?��>����O4g�
8�(E��*"wXʄ�%gO�-n�f�O몹A^�veՉ��v�鄡%?��3 ��o�A�L��/EQ'w�p�2$�g%K�Q$-M��m��J/fI��\�7�ð�6Y����ɪh�~���>[��5~�`�0	
�_��moh��G��w��Z�D�n׵��ꑐ��z�!h�B��]����C��e�$�'�X]�!J��UQ��bE��+�R�&,Xr��Ţj�a�Ȧ
�@4��_@�-�&��B�H\,d[�}=T[X�hx+�̬(��j����E=	�@ �tjM�	�6�B�R聉
S��9��aO���;Qu�C��VWz���BӤ�K�ʂ6}u��#�l��	(���ޯ�}'��
���μ���AҬ
��B�s&���kF�R��MV���i��%�=�m���N�(E�q�P�/��{0��g�vV���ɔ�l�k��xk*��Ox	�r)�;sGʫ���s8���D�O`A R�̈ax�>���$y��j����a߃�Q[}�|������	/O��#��DK2E�t*-m M��t�vG���k���ȒaA�<́cK@o?u@�o�IQ��Q1x�`�T#�-��U��\���T�~���6q�g �
����qO�mfMq|�U�WŸj�O��4hF�]�����A�5�Ҩ�[	o�Ol|u�l��	H� � R?��{�2V��s�x���xUM�$A{Qt S��EQ����������3IYe5�Bj:C��`m�Vj��%�}O����vAo�	 T�?A��C	��~�Hk�D��v��!��K�����h�P�:��<B'-W:�����>~��9�VF�[����I��j�VbF6"M�Ĥ$4��x��o�3q�"RY�~�nQ� +(�\��.I������Y���@&)��B?۝'�Re��W�߉U�>(�F�p�y�A�\ע���`�f�]BS��NN�v�I����W;kɛ�-8!��OI&�7����Uh��M#�@��IP�G�m�H���z#)%R�Y��C��}��c�eI:H��L�؁���Uܲ#�hl�edjb(Eﷅ4\��nD��+�:C�mQո,�� 0=��1:Uދz-�
��%�OhT�5��boQ��tO_Դ�������b�a��h�(��`Y�F_�|��1Rf��a|L������Bɝ�t�z�o���o4��^"�XU��D��#�L�{�Ɂ�ȴ�&g��8N�~�칆�
��0�G��-��,��"#�󔙴��ɾ�L��rMC�+hi�����"���/�{�fl����7R3��m#L��i3�l�c�ǎL����c!�{��ȕxGi���G��\zc ���Զ�����-��Y�;0��w�V98/�V�
�43�gs�~wX��'��r+����i��}X'j�ʺZ�<�{�ȴ��D_�T�`��'{�
\q�,���p3t{��~��``
���v^����}Q���hп��`��H��|�����C���_����>'_��%�������hJ5��j2�L���Y�՞B ��@?{5h�b��Ђ�hIݮ�p����_���-��ϟX��񹛠w�!4�^w�/aL���֓
2���,Т�|�t���F���n\Vk�\��+���ɝH��v@/m�du-V7hf��`��o-=h�Z�ѽ�P�a	8�p ��7�x�5��8��օ˓�y�%(�
��:��v�Q��`��co5}6~�筌�/M�ڍ�TA1�/z��*u�xnM��h�׭ׂb��f��`��>{E��}n�s
<����%L􃂰K
4�	��b����O��R
|���ӧ|@<�ҁ��!J18;ǀbr�N�bPjV����[�u��Jy�|r��(<r��� ��,d�۪��N��]q qPk1`(y��S�%5aĒv�8#�A��(�tͯ��?�=��V�q|<�mrr_�HD9q�u/�
�%�O,��
?%ر?��Z�}y���fM� [�(^v�k�e��!�N�/(-o���V=ͦ�F��|l��(�'���PЙ5�"A��9��I��A6�y�F�u�F��-@	G��y�-_~;Ν��o�?9mq'�_�ͫ3��B6���ٍ@��g��7K�r��b8;l)��q[�?@����b����O��+��Mh�f��"�A������J偵bV�pa�ď��h��e)����Ѽ1�,dS
��&Q����C���/Aâ,��7!$�Ӏd�,�����UK�@�=��up����U�=����^>�%G�~��w�,7TJ�ۢ�ҫ����w��ߟ�;�N����9_^|��❯F��P���6{L�J��6�v���w�D �Ё2|���l7�내�~p�&�)(��E�a�lk�,d`�]�B���!<OqI�8\�<�?`Z���řMY�\�t�m�o`��h�n�3��?����҈��Qۏ�c���Y=@�J���m�+]GO�20��T[��F�:�P$���Y��Xhs���-Pc�K������4#�
V�?l`Lw�����7�sS��}�&�xbc��'`�	�>e3q���5�V���Ό�L���R:et�l���;b]�=Q�֊j]�0�̞�t�Ԏ��N��������}�]�i��"T��W>t���Y�U3��<9�y%vC���s�d�+�^D6��H�"��2����\��@Dr�ЀT�lRO�w:äBt�k)�U�ٌď���s�e)q�B�<�NٮH�Z���Y�XpL�����R>6m}��X�܁v��4 �j	<hp�Y&1�Y����(:X^7�������
/��q��-���D}���a�c����ŧ���ZV+�JL.��l4s��E_#X\+B���i��(�ӳ:w�.�G �O	���g��&*u�80Y����f��#� si���k������:��ܰI��z�O��q�$�P�������;��o�:{��u��h���k<���9�ݻX-�43O�0�X�So4աc�R�IފN��	̪�iN����L8:Sy��i�2_}I)�@�\�Ri+�D
��*1��x��u��76��gŶ0s]:�[�tqC5@�˶�D��( i����mAǛ'�t�>��s	��3gVӀ��ϋB�(��͌i@@e���ec2���
���*܉
�mq��w��Ƅ�y��$���	&v�Z�I�<ϝ�/L��ń�:�#�57� ��!�S�4m�
;�i+&�V��d����6׃K�B[�^�sg^��L8/�Oj�Gq�M#`��Lإ�2����Wl��>��a��e�q���?�EJ��5�1;������Q��p8u�Q�d��nъ�J�곝l��F��:b��%q��V��33���	D��p|���п���I�Cw�h��ï��_x2����:�L��D�b+�r�~�JL�,��Ȓ7 k����Z�h���3�[�^�FBf��t�k���a�6�̊Q2��7����Ǿ�����m�y�����0$�ׅ�zR��̇��;EdcT���R
q���wl:�!-�vC]��P� <d'�et��-M�qcZ]� }�f*Y��y���n��u��-9�լ�d:��Aá�[l��I�;�����sj�/D�xگ�dȞ�V&���:*�A�����\ED�bN4��a0(��������x�::U�H�o��$SǼ����t��N�S�#tM�Z��$�V�3�1��k��)Z"/��߷�
t�J��T����$�ӃI�M8W�5ao�1��������v��㌮f����ِ�Tj
	$���Z���@�jb=�"�q��v@��NfAW=�1rƏ$�̥�6�
q|��4��I���M�b�����6ؔB��(��nF��N~��f*H<�"��,b6yF���r{�Y����K�'"�/�
Y�c4��Q�ꋵ8քX�#@���!q�>3��V�q?��Ч��	�=�X�~�>Ṁv���|}@��>|��2�82!zw�ț7�\�p�R��OC�Km�m�=&�E^��7�@�^����ӊ�H��B�m1[�q�p��?�񨁩>`Z"~Y�$r.��A��~;֮�]���秽�ܿ~f%vQ�&��<f0�k�Ja�zb�7���I�)\ܽj?���1�@'ɤi�D��(���ρpo��W8K�|,M��o�wէ�|�M5p1*�B����y�.�g&�)��̞N���i��('�k6j�m�Z��a��X��,y�e��+���L���G��P����^�G}B��8�V|r�<_��*�I}|�)>%��cD�H{�2�AB#NZ��O���N$��Xe�ůD�{�VެK�IJ���d|AؓF���țF���*1`�FM��a3i���Y���
g#⤆4�e��4v����~s��/<"���*p�:ﴢCpt��X����E9�0�R����.V�w�����/�c��]�_W=L�믦�o�_/4ʌh�
UlH�#d����t����5��'�NЗ�u]lf$ix	�}��i�:i�q�	%B����se�C�Gv�I9�X-/�����H�my��dwCN�^4��yp ���ֿĠ�G�\��غ�3�'��E*�^��C
�
�����.��C��&f���\�`�ѓM)��N.h˜}��>��`���z�q}=��u2�m�s�xk����j9�7�sox�p��ƳX���?��pΠC>/�'�SFB6�p"q`��5��y�_n�!��4),4��%��]#;�p�����'���`�:!0AT
�S��Ỷ�`�s��$-��#�J��4���)��?M!�\~7�;�,#6��*[C�q�D]�$�yu�aN}0��h&�Y�z�H!�t6䑷s؞L���	hO��q���i��0��N���;�iV����GJ������%��,�P~+��_���74�W�J3�E�t(A�U�&%�E:� ����
,עP�E�Է#��::zE�Ǭ��c,<9aۃ�@�=V��}��-̴�g�&^�5���u��R
4*�"�pzn�3yO�H���Ԕ�d����,I�}��4��t/&��7Gi(�iv/��0��E��YΛ(��^}��q t���fwt�\A���E�-U� '��-���W@m`�چ4����-��*�����*{�A3��)v8���LjA'l�g�یxdHoH��C:�ͪ-)�D���r�'ր�䈶��G7��������6d���Յ�x�h�.�

oW�Dk�1ta��+�A�Ƞ�a�����WN��]��ھGr��a&QC%z{ij�h\
u���u;{}y����hn��mȹ�-@]�42�!&�W�}]t���,6�B'��L=������g���s)]y~������̦�n$�ml0�aLj�Q�����{ҝ�=;!�-�H��{j|GЖm$��F�����NR��["o��.:T�>����`h���+C�8DF
g��gS��=HW$]�-y3�at�Ŀ���	��}eG�OpAΝ�)I�s9�}���'f| $�O,U->��XR6��<��
E'�UCe��j	HY XTT��ݓ%7X5W�7�h[�w��@햄jyM��(}����Í& �,0�ܵ�> �L�ʂ��`���X�P���I��(��P�`Ӛ�j�곓�d�\����e��qZO��;��g���(#ފ�����)կ�$t�B���E/�/T���⶧9�^�ue1$��V�k�j� 2�@�c��������9[8;t�M<����rbYt���*��p#]�6L�k'�|�"���A�m��
��䧢�q"l�AM!0m�Ϩ������p�5�B�KZ-I�n�hˋ�
�N�û�MFG
6�0��845�U	�3C0�1�g�Y��t�d0߳'O�����kL9+�g�4��㟾��Xlٵ�ޞ�SS��/舁E�1d�/��R������Fk�[c��<n�.��yh���M�	�����R�9�G[��PA�<1O=r5MU�
�u,7��U�6\�,�Z5sJ����n�|���Ľ/�iq{LW4uI�b�T�A�e��=-5�Ě��q�1��<ͱ��=>��:uӗ��d����ْ*�R(�\��#Ex&%yp�G��$���kGȰ+�a�][����,x�����إ�ͬ%r���؎LO��<�}�i���s7$��������.vذ9�n;yZ�o�|bC�"�%
�>K&syG�S�H�c4z?ki(r��g��hi���:,	+���`əM�S܎0K$`�Ͱ�����HS�$J0#�lJ�B�w��*8R����V�&��$�8���A�S_ƈF�䓴�EhA���~�DR���j�}�$?6x�_��i ��I�D���k�.���N?| >p5�dIW�ѵ��P��e?F3A�����ϓ(��L,�um��Qr���u(�L���
rYɆ�t�kQ����?�M.�(_Ma�|_7B�R�`�7���	�I�\�n��So#6`�[:Fi�l�<�3<�_�O"��u�ߊ�������c�d"�#�|L�?�+��l�_��i�/.N�-����k^��ɍH�BV8���A��h{��~u��>�}�4	��qU�����y$�K!o�A"�f�4��}$ +�M�晉;���y��?��>�fF��RS�X�5�WAq[�9�A6F�
�ݡE��W]s󯨲��ꃢcUIRA�T�X6�q��+�5h��6��k4ᠶ�q�H]i��0�#��I0hD4;_�����*�w��F|��k�d�:�﮼5��S���8����^��2��ZM���E5��������<����榽�tտ�>,���J���/񪛿��rE%�v�)T
���TK|vL{�ZjX�<�;X4!�@�[�,�=��@M�L~wkI�
��9#����C�>��>��5c��NB��Ӳ�^����pe O���{���E�	�'��	�>Wq��G����Enm62�ɱ�{�/�n25�3iKrrB��˥�.K�x�H�{
���<+�_�_��dL~���n�.z.�p��N����a��ׯ/~NÄ GڨѦro��;N+v���:P$˱pTGUd2{ť\�%�8h��+*����t����S,
w��e_V�O�����=X��O��h0�tQX�bx�"
���Ұ�\l.SJ���rʇ�<�
�OT�����G�H,��Q����$6��I��ob�iE�?	�������=����ӻ�;YD*o���R�>݉]��̟A��G���5���@sѬE�S�Ң_U�C��p!�zN�"�F�@ޏ�ݾ9�t���]�L��,Y�xV����D05ʄH����0�/��~,��@�\{�)c�IB�t��+��ph���G�v�d��������K!�7�`��`��.;���(K���'������m	�K9�&ta"�RK^&���G�+����T\�8��֘0s,���?�͂<P��{�-�`���pJi�{������
6�f[��OS��%�d{��l��y��I��EP��mk���f2#��O��=�ڛ.i���ep�X� ���.�T�<�ę�%@�Ft��Eu����SyK�g�
o��o��=�
�Y�{[n��k�}ŀ3�y8Q���#�1�P����>!��y$.x��>�\;�b�Z|�E�?�1y�mx�?Y���i�ɳϯ_�]B��Hz�7LN�1*��lM''D�Hv��;
&$^��,:B�
��nB��X�͈�m4��+{v���)��B>���f[�VA0
�\�Z\�;�|{��Wש�������G�>@�?]����r�ς���V�
��X�GH�	��۳�K�"�m�f�*e
��ļ�J�$a���Er��[zr/���p�k�/���o^N��\c5�pβ�8|`<���z����9ź��O0�_�٨�U󧟦�`���$�K�y�E��N���,@n(��m}����oG��m�>6��Cg��'������p'��4�:�2[�9
5��Uqr^�v"&��N��x�(��+��O�_�0����`]����(�/���p�tq��?|�����?,�.O?�~��:GODf:�G9��a!>\ht<\��B��"[x��ջ���W���?�_�ts������\���ӳ�_�_��/�x|4�0�V����#��x������_�}��JdLj�<������f~W8�b?�>�oPKk�mW
"�RS�@)setuptools/_distutils/command/build_py.py�[m��Ƒ���bD�
��V�|�o��˱+N�Jtw�Zo���`�, P��Ow�捻+��Ғ����ק{�ժn�|��Nn��p�}��ۮގ竫�c'��%���}c��̌ɘ��Z�����8L3��K�׵�
N4�ʳp�
���flLBOa�Wt�#1M�$�C��qn��>,�_�m;A�����[
�G1�ۑ�{�|����8����긔�l7�\o��|j!��%�
[����?��x���x����0��NH�W�xf�����a:+E�(Ŵ��j��#~r%�5��&+YV�?+;).�"��*J�hi���
g��l�8��*B?��9z�K}��[�6-n�
?v�G����uh�!`����+��.rj�=�s9J�-[�Úa�=�J��?��;�����(ʃ?�qӠv��5�H��n���	�U$����]wֺ`Q�L�߳���ьQ4�r�QF6wJٻa��]}�JR����^���?
����-���eL�am��-�@܆~.E׀՚��W��`U@U�?�[c��Ǽz��gۚ���|n�î�ƌ�'$1C�J�i��� ż=�0��EmG�fJ��h_D����/E�	�Q,�te�|� f��w�vw��aa��q0 �K>Z�
�3~�f�aCôT%��Q�p�T�����؇��Cb�}��-\\�<f%���}�6��i����P�=?@Ð���M;����H��[�z��)%�
#�����Z�`r˯�g�W%�[Q3`�����Q�j{&]����7ox_��@#C/D
�w��Q`����`�;�u%{����f�7�ŋ•s?@��p_��s��9����ׅi>�"�Y$ʮ����/���S%`�����(4���h��%�U�$��Wv��|h'�u�ޔ���U�Ė�؇��%�駟PwgR,۝�N.l���������0����{������ FL�}�Z0g
%�&�=a<���p��C�:*`Ph{���Aձ� �$X8����v�eN������)����$�`�F�3��3�M�z�iv�C�h��Rc��N4�.q��$ 9J���<�u0�Ӿ������$�E�R�i@q.B}���U�-L��롇�ު]���;$,����ܬs���8M(o5ڑ\/>�B��!B���~��P��Êj��A�4�qL���?�U)�����Ok9�
�{�G�)��?��[��2Ӱ����@��'Eh�!��-R;*�����q$J	N|��R?iA]�ѩ�:���d���X6���1`�����i���<
�� ��h5W��L��J��ْ�
�U`�9�Gt���$SR���h�v��֕鈄�u������<!F躯���3,�THS0�����k
<WQB]��#���'�\�j��#(5�IQ
9�b��an�(�x�ef�k��Q��pbu�o��
��D/ v	���\3Sʩ�l_*�/$��_�	���_CM#�ۻ0�>"�I��yq�A���g�d?2o���h��/o��8��lۑ�ZJ_�F���h+*Xd��D��
m���o���}a(n�صs�m���V�A�X
6
�A���8*\��U��fz�R����Q����zL��	��+-�D2b;;�5�8|j~E�/����;Ҳ�;Z�P�Ԯ�34\wa��d��y4�\4Q.,���v�Mu�-%����/�вM�z3�|B�	�g�Id�۠�,>vZh�AUu{��H?���Ń4�v\Q���GNh�Й�q��fО�Q��Vl��ۗlJ�P�Onh�
��GF�9��⣰&XFrV�Q�6�o�I|�tF0�C/��$���v6@��� 7�Wо"�o�^0	�n\~�ҡ�J��h6�J�-o���#�Tm�2�#�@�{l�y�w�\�s��	�Y*G�q�iF����8��|�
�cbո2"d
f6L���"[\�d�s�H�x�XIXFJ�t�<@x�-龜��M0^8IF���j��	宅ɔ��� e,Ĵ�+��2�b�ı4��W��lUU�T;7s6�i�XR�П��kO��n9�C[!��Q�2]�rU2�Ӫ�t���\��-�57��&~ZM��,�I�p' �8�}��%�řJ�4q�s�c~��;��7w����/��Uj
�ɁI����h�%{?�P��U����4�h}�>���g�M� �b=������S�Nl��񛢅�z�c��'�%\�X
6��~����W	:�N�T+�b��I�V���R��j^�	.��)�7����C�tm����2TK�rU�-����\w
S{��c�K�}5F3T�B6��Dc/��F6�E��� �����g�g�L�x���粟,qņ�j/��C��k��;��I[v���4�~�z.�;0l�`���:�;Υ<��	� _wr(��τIZI�@'[�pb|.�v��l%�+L-XK�<�<�UN��Ef�uΪv����uXl��]��
$�(����iZ���M{"�N�+�$�^��"�Қ+��e5�����2m�G�W�
��t�js��ӛt�����R�HE���߶[��#�&�V�|�#�ݗ�E�
�#-� E�C؟��*RB��5�����6ߵ��Հ�[y�X�rw��Z�$�P^`�ܡ�C�B�#%a�Z�
���I?�O�T�Q�)i��?�^gˑm�h�c��
���z�|E�+�"�Gݢ}i)�\y˚/�b�>|��W=��tA}n,���`U���;�ه�؋E�KL�5�dH0(�%�rܪ����*'>�SC��@�J9<���	$�Mb�&r5�ō�\�4Z�E�P/[	�$�5���|�ڨ�cL�)��!����x�'<`[��_I�j�F�Rۜ�F��_�}��ә�Φ�ؿ�u�؀;C���*؝�`�f΂>4v�UU�h�4gUӕYY���2wJ׷N��ҁ'�75�j(*��q4~�"����X�,C�x�}�!	��Ch�!D8�UWQ2ã%cڛ���
�Hu	�������zw�m\U:�O|��]�<p%l���؁��A�$�q��^�?~���	�ゞu��U�~d4D��Vq�?�`z+r.�Rk"q�����'�@.}�%@[�� 
<(��݌V��f�����.8�V�puc�F� ~����?��I`�O
X��z��9��|�H�=���
\���ʗI �s���p�����2LTC�yK�-��AOr�XY���6
(��ܐ��_kX@J#>\!���۵BkpR�=J�p֥8�Q���?��~�Z��o��+�/�{~�%�@I{��[���?�<�;��<~�5���*)���Nj.8��1H���m ���M���K�׋�ׂ�Ui(ħRx'�\ŀ�{	��5W�&�a�8�z�r{?	Q�Y�a5�ֱf�$Y,qm�7�J*&*�Ð����@J\C�V��J8�r�ў�ۏ#m�AOo{�b�����]ʎ
E.xM�2z1g�t|��1V2V��̹?v�g�&c��d�*�܃���r����nU�;�sŠ�(B@K�:J%��Je�tY"�]�!�d�diQ`#�kr'Q�S����a�r�i�y矌���Ļ������V������SQ }_AϻU1��\�ŝ��6�qMkg�*�)�=e�s孝��h�V��]�i��]�
�����U�ht���`pS5��$�?�RK���G@���B�&Y�J�
��鍘X�>@�t��-���v:q�%�1�
�M�!yl�„�p�h���I���L�
�b��<_����x�H�Ҧ#{��}C�|�I�:��(%O��(g�M�G�Ou�R��h���eKs�`~�c�.��li檂��[�U��y�Ա^--s���)��y-���vM�Bx��k��k�����F]��0����r$��������R�e%�@�*���� T1�/HL�{#����P��1�R\9
o�~����33w!4��*��8�%jm��	��4����u�6�(c��Q��~E�Q�`��^���Ƅ~=ih\T�3����_W3�K4�{���_g�=+�X�}�(��ns���d	nE
��˗�>Ow���O�u���r!?�z=�:I����ژ��:e�:��ﭫ>��z�(�W�@q�#�m��;��,��W�+PrV��%��Q��9��nIB��PM�U}\أY�R�ܠ�H�>^���EQ���k��o�_�F��)4'���:�mgku/
ݍut6d\�7 �Jщu�!ȵR�ۻ]��/�^R�y�K"�t^��(&'�PǃλJw`++�#՞n�HZ&��]ϩ�M��p���?��!��m��FCy���+�$}l"�rS����5.�n����;��4�����C;��kXI���◞]f���̚��1��5�J��c����|�G���P�ǽS���;��9�w�y�u��Nm�mV��p+�zi����R- Nڞ@�CK�י�b��;���k!��Ȳ�l`�d�Z���j��v��+Y=���Q�K��B�.�=�a/�ٲ��O��]��E�S[-���PKk�mW����.setuptools/_distutils/command/build_scripts.py�XKs�6��W�T]���I�&�q_�;�C�L�d:�4DBb�`0���w H�!'�T��>��o
�0�Jך*��nG�<Yռ�S�I^i绪`;VjE����{�s���0����D(�$Y��bG���4�.ަ��zqf	�!���*�o,=%s��0G�Y���#��IG�	���:����M�Bl<:˵�a%���ڲ-7(��,�)x�a�x�������A��[Q^>Z>K�D�䃾J�?}7����FrGu���P��H^����s�3�YOdͥ{xɈX��wb�3��\0]WZ�ZC5_��}`dS�M!t�d�@YA�"�LFMl�  �ə%p��B�!l,Q$�D�' ����s���׊�Ty
.�K�D���9�������Q�L�����,sF��x�)�3��k��o|U�?�A�!��oJ��5d�h�cP��J���;�՚�
f�A���X��{,i����`B�'��麲^� ���㍵W.�k�5���+�yg~m:"Z^����.
S4s�$�s֑[���_�I1��%�C���M�|�{
`c�pܛ�C�.��aD�0�y��p�����j�?iAυb^*Q��)��(����W�	˺��5)����\�
�c��w�{�!:���؞�fۦc�;U.�׾)��I�J�w`C�Ē7 CUY
1���S���q K<a	N	9��z6̎��
~:k��N>�x
��ç$4�X�Y`9�"�;��Y�!�zR�V�᭥�!6��d�L\v7��Q�	�z�6U��}վ���;� !X����T���^~#�o����@vQg�NdEN��j
�����F����)'�̠��'�G�;ÚR052�$��ހn�؄J�#�(x9�Ϣ%��b%�1�g���V+s!/@~�Z��Wf�&$�'��IV�&
Q��c��e]-�Xb���3�€�݌�R�ҽ"lm�`�rPF�\���%��U.�K����tE��4�f�U����C��w�������6�
%��et��8�RȾ�M�/���o��+V(6��]q�w�HFs��S�w��Ӎm�T�Qiģ%� ����^U��8$Ǔi�J�Q<��$&�}ԙ�a��F��9�;c\��\�(tU��l������7�:��}s&�����9f7������2����HL����Vⴷ��'*����/�߄���4��XA�2�Ç�o���7�^�g��
�8�O�i\ו��3ӫ`Sm�F����/d>��eƫ��($�=�)~��rF;�>�J�͐6�������ȱ5G�f�0h�t
��P�N������)ɭ䚹�ǧ����U�A�n�V�8��B(�����m��G�Gs����`g}�9�VX�+����!��n>������8&�΀���cQ� (y �z�Pި
�u�Q�F 
��a-�l~ø"ߓG����'4��x�<y��1~�j�| 淌c�#�X4-���S�<ɶ�:��-�a���َ��]�a�H��3�nWT*X=�����4���Bo޽�m��ԥ慿�h���cf������"n8\$��6�fK�����0��z�{�X#�h��k�+�vְz�T2z!��\�l��cf�g�jY(b�Zd�t>ڬޕ�g�kb�2�yO��R�S'��}>�_b�t�����!��P~�bE�뢉I{a���f݄ۗ�P��D`K�'>΄��}{����c�������>�bҭ��x���I�PKk�mWY��49&setuptools/_distutils/command/check.py�WK��6��WʩW�=p�"�!�6H�!X�4��P�JR�u���_�X�� ��of6�M͵�
��ڦa�.�3T߳�c�	h@M��o��PG@I��6�Mƛ�UϤ�g#�!ˎ�mH�l�p��?�W�T�t�$|�w�]�=qsN���:Z��#G�}��6u[y{��Mǔ����=��QϵK�֠3wU	�5��z�3X2P�T~σ��SÑ�%�ܔe>�ڏq�MO�^U0=S�e)�bzsfb�\������i�vz�jk.O{�t�9��Z��g�����`$D��Ѧ����h�'���}�N��I\05;55������wS]'���$��
4eP3wq �{8ܑ7ՙ�Z�Ŀo�?1uҷl-X�a���&0���kz%g	W�4\xi���Ls�`�r���y\�e�̧���<Tn�+���u�O�q���jfi��c�wT��(�y�J���Vb:l0��V5�"#�I�nܳK�l�3�F��9�2�H�#��_����ݎ�9u�/fO_�ˡ� 3�v�fK��^i~$��'���|�#�U�L��%ChT�eP��C�v�3i�Rk�Wk��__���!:��E`�c޽��0��K}Pm+����.�D����#�%̙�@d�J)���wm�Y/�0�#,`���%J$w�;��ʽ�RDM��~z�u\�(1�%�I����#�7��"Fj�#`E�OS+߷}l��o�l=B͙�VU�V�u�)�'�B��b&|�J�r��{鵉m;���*��x�#5�}DL���W�ϥW	����<�SHE#�Q�%r�	��P�~��.g�̥���x��3�aҍ�i{��Z1�amL�QN��f@"��p�e����� �J��&
�b��:p+^���
v��u�`߼ ��',L?��1=al,����vj�
�>Y�6���vŶ>4���,����Aji("�p���c���ab�Z�ע��GǍn�_9�ZO퐬A�]pJD�|E��3yu|�5z�H��'��fgm������F��tF��Ȍq�V+��A/���rB� �v���o���aZ��In!�@�R��6Q�!
��ߑ�zC^�r�W�eh��p/ju���Z�J[� 	��a��{1�Ҳ+��$�
���\��)]�گ�oNJ�Ǘ�������s���Qcy� -cŏ��gP�o>�?�%�����--,�3���vN��!tI��>4��:�g��=�!�v��pD2��-���שYs��\V����P�/�a��-��x`DJ�i�	\�y�n�(��j�ȗ���j�\Ew�0�5��=���'i�L0�e�K��f�u���}~C�n�u	��T+z�������tX�G���r��M�%�:V7�T�v�|��l�.�Eu��;��ϲ;Ѕ�+Ö����~�\_�"�TK��'�*득#o;Y�<~�7yd���~�'��.X"�'��@����z1_���9���8���u��T�)!h�ؕ���c�aZԮ���9l��%l2�.���b�A�{i��Bz�PKk�mW��U#
&setuptools/_distutils/command/clean.py�VMo�0��W�R��J�P��B|8�j�ē]�cG�Ӳ�z��w�~@�u�<���8����qBڬ�U��
�LE�窖X�r��c��$��qG�
�3"or�O�Y'��/�B�Y���B�+l�(��y��:�9-y}~~�;�{�6�DUk�@ۨ4�������6m?Ņ�{^���J����2������oE�d�B�g���^D���F�NhW458��9A)$Z9�����!Bc��u�`)ď��?��˙ū$�����	�l�p�rl8����K��+�m�Mǘ�?�t	��)�l�V8/s���*�_�(8QcM�t��V�@��{f�~�3�l��g���8tӏT�5leH:-u���t���S�3f�%��׋y�Z'��h���ՍKAi?�&^�O���~nx�8��[wjĐ妷y	B	jU)�`��X�%uBO�[A���W�еir�#���#�^�"�jg�*uJ���ʢ�7��tJ��ⳅ�:�F����v�f��Y������Mp�4�>������7V5���QYӨ��g��.�@奧�]֒��i�7�N�%��m���$ʁ�p�,J����c���J��7M�gr�/�)ps��0�
�T(-΃�A7T�6q��&�5������{е���K�w�u��F�g���N�描QD�`3�t�&�Jg-�ZWxȲ�^j<`�R�a��j�1����G���C�p�y/���N9:9I��̩+����w�8��-u�>V}g��Jߥ��y=S�s82�ӽ��Se��i��m1��,N��z�*���3HA��x)�.�v��'c��O�����/PKk�mW�G��l3'setuptools/_distutils/command/config.py�[m����_��p���:�׻�E�I��h.�ۅAK��[IDi�j��ޙ!���ݻ�	b{6E���̈I�����;Y�u�����[��a�x[5��D�i��f��R3#evE�8[VJw�b�j�a|��k�莼c�hVqY���	���M�
L7"�{��J})����j̀ނ7M)sNk��_��I�69%���Xb�L30����hA�l�K�u��
i+/KV�
XAq5|�pO�k�����i!<aY��E	l2�g���-�
�ïK�2�{���*XS�\�
���ɪ^�}+�Jy��ӯYҵ�+�ԠdD�~"ɘjYb1գ� ڂ�/D�����B'�E�$�����z�+�VUl
�Bv�ڈ0>m�@	���·"���� �Լם���֊`�z�mK�f���⻯�����؆���	(a���I����X,8�l����^/>��y+�	�I�V4�%��zY����ݪ�k�nh?�t�v�f�{U�΁�1>f�Јd��+���Z��]9Y)��qU�V#��-�IFt���;�J�Q-x��0[���� Z� �k��hU.����[E���xq_�(���ѵ4o�����#�D�D
�m�K�{�JY߱���(^�!��j8G>�X+���8Gu�������QF<e���P�^�?މ:���'-���Ҫos�f�#�,Ip2;�Z���pc��ATܣ��H*�C�J<1�έA�
�ݱ�5
E��QQ4����%R(�VF`o�`\ޗ1��1`�b�z�=�A�I^��[oZjQ�GN���9���2y���>�E���t��-w3^�d��艡QT�SL�@k���ц[k9|P=-�p{kZoq^��p
��CŞ\���Ƞ�ᄪ�J�Fɺ���-��:į[op�G
"�g�j�u��sf0N�x�x	�6��;e.�3���]=s�pl�!�J���hV�����1��n�E�#j���%���0��W��l�z_��j0ճA�G8�%�6�gA��צa��q5��=$Fc��S*�l�1E��u�)$0�?�v�J����
���Jm�T�dp����Y��k�E~���\�7]��i�Rȟ oLrw}=F8���ԛ��R3�r;	ѡ�p���
y�2�^	���
sfU_�$�;�s#�M,k8�Qk��V���D�E�1��X-N>U��?�Y�9
���||���e]� g��A���W�U�k�}�|dz����3#k-�m8����B�s6p�'!�1�ó��ϣG��[8��t�s�ZxTŐ�DN��C��މ��ָ't��WlL�op�j�
2�^�k!_;%+�5Q{=��n=�7H��\�8mds}je'��kB�������Ү]�w���xB�u4��\}u�>��3\"ߊ�ok��N>Q?o���K��x�5�9S��X��F^K�&)�3��X��.�]�SLC���X��y��*r�B0[⿵�F/
�����r�>1O_��5"x�K8k��ȐS�9��#:4iy���}�h�QoD����Z�g���]qn3���ęhd�i�T�UXo3����Th��jw[�n����+�n�����A-Ǖ!���2�k����M��hZ���zs��"r��:���-Ccu,�.<��Zu�?�#q}�i}H!�g
���c�d���z\� ��Q̸��Y�g1�Z�Y@�߫eҊJ݃��f/u�����P�-=cbx.�sQ֗8��a~$i+�(��x�Eӱ�@����0S���͋���� ź���Kœ0��&�ʂ���	�bo	
�g'^w��˩ז�
A	��;@bM]�=۞�ҵ�P���c �B���}��o��	�%����`\�%d�6iLM:
��lY�;��!/]��*�A����(`ۣ������F��iAe���bZ�blY,������slC�\)�N�
�r�B���2?�V�j�%�-J��9����ldf�HP�Ӄ�������M����8jE���P��ɤ����9�$�{�S���%NJ�
��8X���\q��u�W$Hj9��c&l��",��]p%BU�{�V��#)+lu��e�Fւ��M�KaST��rQ�����8�^�t�}I��B#��J�N���;A�j��>��*����m:�q�־A*wa�H�Ff��P���8bm�
Y���E-�X��?�/ԝ��Ay���m�����T���ޤ�۬�U6��W�g&4�1�2}�'�ة�x��Z��u����b�5;x�и�A<�>F �<�=nf�X�@䰠��[�q�ۋ'L��^����l�aX��Ҽ��+�9�3=T;U�ֈx�g������k�?~���#h�8��{q���
�]���/���9_,�ۄŐQt�y:@�ژBN�/�u.dfnX����w����B+����ΓE�"�|��"69�.�}���f�h��Ok��xh�gdt�h= 
]�$��v��/�O���3??>)�������˲�IV�CDxH ������E�_H����9w�۹����33�8�@��4�]vw���!-_�b9R���O
~9(3�0���L���C������*��`���ň�̥䜪��W^�'b�����|#I�)?	���܁t�O��X����������1�.ǫR܋ҽ�����%��w(	����qļ�,J���6�ϺZ;%�}�1����I�e1�^|4���}�_rq|�ۺx!�r�������q�<���(�TR���[�{0-?��Z5TV�z��ANE*o��ざ
�,��;5�\޽�n��>�V�-�?d4�7>.�q�k�wt��2_�;7m��t�
V��r�o4b�@C�QVST1i��L��a@\P�U.�Hdݑ���d��zn��`�@l+�i`���A�x�[��v7!��t�	W�T;�t{/��@jO�]JcJô��I]O�4H�W��R������ˢPC{��R�0 j�+`Ut���t�[E%DQy{|�P7El��
�gw��@�O*(1r�c`�GF�6��ɘ/5[���1�MD-�T�S�fB�ق�g�������d&>��4�pz�^�Ȭ�o:�cb�)��,z��K�Ӯ{V���J�Ŀ����>#G,N��9QP#��=p�*�}�1�AǝC$��<xD���m'�oɌ}�9�{Y�q�|�tNض�Y��EQ��C������i�M�N��rڻ�+���w��D�q��CwTޱ��x��EUF&��RY�c�3�>QL������oD�r���T���l|R�8��'�~�d>�~.�8�#ω��X!o�#'z���q���{��޶W̏�-���]�DB���Ut��\�߹��^�y������mܫ���v�iV� �zNKfjDlϢ�&��s��2���/߃�1_{�*���W�m$Cz��DM�4��F*�.�x�N��f:o͋��o�|7Ce�{ʨ���z�CzB�[c��㝆�ů1��MEJfm����'Q��V���r5��#����K���?PKk�mW�����u(setuptools/_distutils/command/install.py�=k��Ƒ�W��Q�@J�?$^�֕,ɱ*�����6[H��@�����_w�3�"'Ww�rY$0�3���L&�Rt}WVb�l�ۢ^��ZtEU�����*��u'X���n��$a��d299)����8��1ߖM��]U.�f�p]^�e�ۮi*qr�n�-�3�W�5S��|=�	�\?~&'�_���7]�����?�7fX���ws�d��h�n�.+>��u�}��c��}���绢��L����-7E}��m�t��8��*�u�n�{޶M+��5^��_���>}�:�sAw���b�M������B��^�c�-���K���/`����/~�����ȫ��o^��|��bn~�s�����//|�ꗋ�ų�^���?�0�$����K>.
�o}_.!��X�+��Hr�xǦ^�x+��/�eկ����M��q��e[�:��z�����o��
�/�<��{��gA�(?�w-_���|:�T���c�wW�x�����0>�Dl�7хx���G�xU�7#�$Ƨ�"����a>�r]��&B��,��m����.96͖���C����נ���'5���m��+����%|˚Ӫ�7��@GW����R��X��y������%��&WF����ztD�H�j��,�Y5R���p���ų��q}G��0�N,��ĭrl�E�4T��~�y���sf'ȳo��|�`S6���2%i%���f��E}`5߳��5k���`�|�q����W9��K�*V+��i��&�aX�h����-���z���-���O�Yj(�[�Z��b�p�K^�5���=�
#i&���6��<�,	!ҧ]ז���dݩ�iy׷��u��PϬi=#�LR��w9�v���o�J���
F��LY`���50i���_��(�	��:�vE_uZR�5�Ұ4C���%@�b�V�Q��IA>�<�.,� ��M��Îw�1���ᙁ�P��`y��,3��Ў��F>�M!
`���Jj�P��&	�)y}x}�r�{��w��N��נ&�6��!�(�j�@�����m�b��c�t��T�M`�bыؙ�'�v�`S� �yת���9ZS��*UÚ�:���Ǧ&z5���G�H�3�b�s"0���O�D�f@�-2&��E$��@Sx&h�;�r���K�	��΀Y|0�mW�y"Q�ϥ�\A��\_<Mn��3����6.�����\O��[0��\�I�.O��Klq��F�Hܧ��Яy[J!��,A�W�]�j�j@��Mǔ�ej�\w�X�k�)X��<��͈�(uo�D���fpV<2!��?��[�)��x1��Sf�M�ܰmq�Y���=G![��P
)y�L�|��t�/g�a��N�A]�gW�eg#";��'�J���Q@ݦ-�؇�]u(�k€n���p�uDj��L��~]鍉;�Q�f�
� '��/_�^+4���˜�A.��V��*l�*��q��e��AE
T�)lc2*��_]�'S�H��{M��aXڈ�|wNN�G����磦�žf(YV�v
��
�R�K��s6�d!�� ���}Y�AJ���
uF
~i��)� E7�`����M2=�W����������47s���ۉ��ӄ��i�-����&�4v�}t�n*v|Y�˥4G}�H�P��"�M����m��9e�ڜ�ڋ�֍�|�q�7���'��B�L��+;���6G�{�P���t���&����tt��3�t�l�y�����E$�
���t�`v���'�T`��`�0��@\���rYv`nhGX�V�Jg�=�L�YǶͪ�8������D���MMK���|�T��YDX
l̶-A>c
D"�y*�4�y��R�c"͟�G�>�Z��\ӻ�S�����{7h�2�h�t|���Ru��a:��a6�]�4�K`�� �h��z�Z�	WRu�ȳ'�{$�y��V;�<S��fβ�<9��%�o�~3���g�.��t�c�n���B�
�(LY �F����-������|�ƀ�ը���36}������N�y�ꯓ|�Փ�/�����Ǹh�����FЏ��}�~(Œ�Լ��;ڦ�4w��.	�k�3���#�6��Q����I�b0�q/ޕ�)$���7=�~�TOɂ��e��[���/�T�_5�޸�,xu�Ëý��&�n���pu�|�J��y�[`fx��6s����h�v�����(����?�10h㎂��?32�#6�kڕ�
h#m�Z�9�يU@gē	������h���kj���p���g<x��v��kֺ�;�D��Va��:k���"���6{j��~,C�*���k~M66��+iΘY����ueW�
8�Z;� �^�FBoO�rI�W^o��ٿgJ˘���0����'p�Gk�,Nff�#D��
�����dh�^���go��zL1����'��;i�qIѮq IS4�_y1���/���-�V0����2�Z�Y�\�R�9����l�@��Ȕ�aC7�fy����E�5��( S.�(��v;�+��
�3\|	�xq0XE쀧�@ak��
4�t�
�n
<�!���q�Q�[����"ꄎ`W�wE�X�1�q�>c��]��#�p0[A��CQ��`*�U��M�H�x�f��S>��Da(�<�hdk�3J��֛�����[~�5նOl@mFE8�9^!�1`�n�H�$
wdn�H���E(k),�ց��]��q��`��D��[�Q��+������-(�C�W:{B�Kށ�B_7�ZR�4/�m��e�-�����n丮��Lp��@u�D�`�(Y� �ZH{���l�6�`X�/���
��ԭ��
]���V8q����1���UE�����/0��пƩ1�B��;�[By��<���粛
����q�G�VO\>S6��'qr4Fk�G�5lG�����6ktd�̥1��`m_�ZnN��D�빸ʬ8ޡ�ٻ��+�c\R��m=�MX*�2@�h��U�R3JՐK@Ȓ^���sA	�z2���e����{�ݖ5�7���\�fo{#�i��Cv��H>�r�$bJ�-�Eh�N�bH�7�
%c�]�PݬzX�٨�"�2,b,� ��"��jT�-V��f��H�#��g�Re)}�3�0�qb9C�w<�r��R�,�u��3�^���J��Kf��e�y�DQ�Q�rU�D�y/�(�?^+PVmw�m4G��.A�Idݢ�U~.��ʣ0򬖷��N�v���|�9q�ޞ|@�l0�A��niB��p�|�N���#+��K�&>.a;�Ya��(}�1O��Sܖ[*ƭ���	|ԕ�Ft��s�Wc�S ,'욪\J���ٛ�]�1�y�C�`�՘'.1���Â]�,����f�8�ILZ�;�Ƚ�6+�J�B	���hc�%Q��2�B)�
(i���8cϾz��u��UƜ)¤�Kqg�`Lmx���cU�ya�O��SwvFH
|K�2���Y���VA�Pֻ"%�:�֨}��׎��{�K�o��/!9X�D�D���f(�z%�V\�(���,E.�Nq��S`Rm��ظ��$��G�G`�')�'5��{BN�ۃ�؉LH"c�;Wy::u��*߈����/$(,�A���F��(����Ԍ.uI%뜜�6|���-�б�zEx�,�Z��ԯa;���%*�T�m=����t���>?��|��6��~�%tyu���k�,g��(��#ц�Rj�<w�)���0�IࡉQ���0E�2�,�P�ޙ�7� �܂��x�zy��?i�$�G(*�y�#늾��E_�\r��o�1`��X�v�T=�X����Y!�RάJ��8��7�`0c@L�m�o��(��e&
U؞K"��ў3�V����9�P���dž&�3�`M�tN'^.V�#�u�`��Q��L�8�H г�J$�̓�|<9T.)��xϥ���<�Ϝ��HGI��8�n@�7k��TIU�:�Kj�Eua�����aX/��f7���2��%���RPl�-��d4?9�ə���s���9�����T� Pf����:J]J��n__W�0�z��&�������35v�G��r����+n!�jr���5e�U�ase_�%���i���۞/���z���JmXL���
��v˙��^*����K�.���(�~����w��V����
ߠ��z."Z5�+Y$�쁁�s�4Y�L�c*6=�]m���nʯ��	��.�._��i��3�68ѧ��0��L,ٽzI��jy5���,��}�^O]��~��-�(����)$���j�EE���'1u�X�F|�ш|���e7��ў�}�󺯪���AwKm�k����0�u5��J��B��싫�tD��swhb�)�p�-�w��̓�~ۻ���������4h��Uu�}��Ð.�&&Zo>��i�fc��ByOS�RO�S�墄�OvJSa�V�hv?�fz_��e�6�r5��}E��-���k=+t�n_�1_D[��Z-�<Mf�S�੤��2~�~�Lt��Es#G�bJ$��	#�*�9�;{ػ���r���4�r���ܕ���N�*�eɡ&$�FJ�6���+�~R�*�j�)��DE֠Ҍ�ʩA�`×I�d���Z͆]�����]�y���ݮVÖ�N|v�G�������R�.C��b���v�hі�H��Az�O!�~
�c���4��jF����E�q@#��8�_S'�z].߹џha�-D��L9�1�ۦYI��>JB��8�\3:"�B�z���Wk��b�
�0�k�U-����2�&EL^��:ɠ"���nRY�l������)P?vs��T�Rᩓ�>3Y�7觳c	v�_h��	�$��r��?V�����M�-U#�(����$�����}��-i���@:~8���b�>�1XzL'�����Y�礐�:q$��*tS�e2�+�*�a�T{X��9C�
���d��0X�Hi2��ys}���l��.�m�~9� �-N70�&g?�[ޖ@Yen��*�k���>"1'[�p:R�4U)��wq��a�,̤�G��F�Gm�:����7J_��/׬��~�;8�����'�x\K���;k�A��2KJ�q�+"�%
s�������^��X�m���u'C�Z��|�m	Z��0ZRB��t��O�G��J�4�)k�ZX/i�3�Wf�*4�Y|C��k,���g�8�t�t�$
��w�G�6��^���{6gq����~��sh w��u�^�MV���,yx�<����V\�+��k�9�l�XoUs-�!Ja��w�/�����	��!�c_�Ս�����'W���OB��C���A�1hffn��Q�A�K���.ә�`��0����:9g�3�
������2��	c����/&�-�e�),���dY��QN'�4`�0;��ѼǸt�|�ܔss�;����Y���aXSʟ�I�W�u
�;D����0l��!�ڞJ#c����P����"�f#��Ƃ�0U�B�j����L8��NI�;�gC�6��Q�#��´t�3�/*p��o|�����+��=��4�[�1���L�섗�=n�|��t����X�DOQ��F�I��h���r7~d��ȩ2�N�=����(��$x|ʞ����嫦-�3��0u�/�1'�)j���ΡS��R;aF]��߃fxj��fB[�5�8�T���#�����j��t�����q�G��
�mD�rtw��o}�<V3FĻ�vr>}���?����e�ZR�}{�q�-.��Af�8-��̒��"�Q�幸��ҭ��r>��Z��|��U��0�_�4�k@�3mc��UXZ]uBMܫ��C&xfn�s*�k`bã�2Z���������l&ׅ�+%_%���w��� ����s�
�<��|D�m8շ�^�KP��U�b@�s�h�>M/ �D� �B�+q����PH��y�Н|�A��o
{Mny{M�g�I$$�~�\2���.D6{�,�w����PL�W�A�@���g>-����ç�͞9�!]�5�ޒ���iߪⱷ��h��9�UD�F�D�}�q>����`	�„#E����*�LRa+���%������W�m�a���nAt��R�;���6Q�!��Uϔ��@k�p���d(����G�,���aC2�����8��a�`�r��;��N.��8xs��J�Ȏ�'�����+�>�`�/`��X��{t�71���C^ڢ�X�f��p��С����P�Ff��A�;}��Ќr��73�u�G��<Iܐ����g=G}���B����Q2��!��7\����h�tcK���;�5�v�0�&�2�GI��#:��ywι���<aN�A
�|��)������誑��!b���t/�G,Y2�s&�&�a#V���,0�Kf�9ǔ��i��`�D���v�2={d'��/�T6����膙K��е����g�b�0���jB�pNᩛ�(%uڧ��3�m�:Bџ�Z���_���O٫�{���C�*Q.����s|� jxvӥ�=1`Ns5�J$&�@��\�(����Q}P%�:ԡ+�s�ׯ��9Il�Fd5�a�,~5�a�y��@N��'s�w�gJ:��׹�_�����
���VHXt�����p�PG�sUu�.���IB�?�C����{���Sǻg�6�s@�v�t��{#�]���q�g.9�)�	h׶B]<s�s����qjN2�0��t4�
�X� /���Ba�]�iI���_h!�C
!r
�(��J0�į��P��KD�V-�[�ڤ���� ��w��3��R=J�Ԩ�3y�ly�N]34}�s��`c�P��
�y�ޢ�I���R�g��/V:]�Y�]�8�2����<�ߘ:8�xY�n�@�<P�jȁ:������pi�o�]:���f�gw鲤h�n`��+ut�`Ԡ|�ѱx�2Ĺ���DW:���,�~��ݙۛ|w!A�5���u������S�����BWx	^�ЏȔ��ph�Ĝ֧KkI��T�Y�#^FȪA
V��
�1O���3Z��k���xڀ!�	�d��8$W�}��TO0g���*��M:�n]�zij9�%�'ZGY�Gbx�Bv���8V}�]
�5�
���O��[*��ZJW��Eu���L>�W.����+tp��)Ō(Z��){�
��B`����E߆Yzxs�<R[өUs�'�ُҹ�G/ӽV04B7=��P��j<}I߀E�;ѨI�a��t���W�}��å1���:	��=��H�5����i�	�.�`,-�zj���?Ƥr�՝S������G�n��[�����aQ"͍;�,�z#^c�j�����Gspp��=�`�*�Zje!(��\���7uMNj�������o�`]���^Yi|�z:�Y��o1K]&�5�~�z>�ib�䷘#��}�I!3�S��;O0Sܹ�.{�;G�P�
+��4eeE=ޖC���e+3�0Ώ[W��.&Z�U�c{� ��[zƮ��	.�u�-m��C�hKU^��mï�埓�YUl���~Fk�\���PKk�mW�&KW��
-setuptools/_distutils/command/install_data.py�V_o�0�S��*@�Q�Z�/�^�I�U9�h���l�.��38���R���ߤiZI�z'�9���He�h�]%�H���k�E�,�#���l��`�.��F�ToI�G[�TvH_��@-��4M��ԕ3r�;�`�/�:)|kP*��h�D��6�Mj�[ؐ�a�}�"61�G��pg�v%����:�I�a-�=�G��1I�V��`d�V���y��ޢ�i��|��������J����e��F���xpڜ.B;��X/��}�\x�]�N��c�q��*�����H!;�#�i�����z�D��(�Xy26����qV�W�Ŧ��0�x����]+�v��^����zd߆��D-�|�.��Ԕ�`��*]�a�c���^:d���K:�oOpos�v�l�!/}œy3q��!��{�ܫ���sݮ�v#0Vg�b1^�]�v9kui��̡`����N��3y19dz��C���4�LVqFqGp�/��Y!	b��:`^�@�/b��.��+y�#���ѝHv�PSZ�%��+�e�س��żRJh�0���*PT����B2:�:Ovk3���O#ߎ��Ȳn�i5��u��S۔�+B�s�|V��4꼍��`����O2H��~HwNO�0���;aj@�5�m��tqv_﷋	�Dh�a�FZ��9{���7�h��ʻ��`j�;�3�ٍ��VX�}�K֯[x�)�|�
��z@�������!Fz'�7� ��)�{\!q���H:�+�����i*nߏ���r�ejG�9�TD]����6����d,��`�3�OQ��ޥ#��o7���39���r���ޥ��R,����y���#9xu;�c�jb������}J�H�PKk�mW2��L�
1setuptools/_distutils/command/install_egg_info.py�VQo�6~�� >�gu�� �����u(� 3t}�ƖI^z��#m��K�a�!�M�#?�"��i��}Ѝ�m[i����4%n��6�M���k�E<�����S�&�5��$�f�H�d�(��y���_��wo��T2H��J��κ�Ǖ��K�IR;ۂU�`�z;z���YiWr��{��m��2I�����i��	/�J�
�n�i@�V�ZP�~����@�����.hk�f�o��������J;�yB�>򳊩/��u��Lџ�^�
��!�Ȏ�i�,b�5	uв�_1�<6�Ĝ~�����;kp���s�C�3�Fz4��SNL\�4�}�59�
����J�����n�#f�����;�z�֋7�YC�����_��T�~1�)\�j��'ؒ�=.k,g
�}9��99b�a����'�@���;*v1I�b��z�pP�[Wk����WoH]T��|`��z9��r-_�1HG�
��;�����l=*�=>��}�0��sQ��7�tf��Y��9��j��t�RjC�Q|u���.�Ö��q�\�r�����s|9��f~�����V}���-X�Z�t��s�1!�W�wǴ���&|����j�#����,��c�u(C��T��*�Y1���Ӄ�O�g�&>������טyG�'*U4�U�z����m�C�s���؝��y�<Q\Xv�������:��i9NfY�4O.�Îg78��HD'���>G�50�":�}�m|�١���H��������*��v��Pqc�c��iG�ck*@�`��^!Ci3�)�yA�2�C��<�n��xI��I%�;vkAҚ�N�2�� c�n̞�0�j
�t;i���^����*P�3�6���� +2#J9w(|�Ye���d��G��VA�v��[���L'�H���
�UA�@dž�
�ZK�vgė�G��Ф�!�c�ھ	��[���S�č����b�q�b��q%��2��,�社���q/��}�3]=�nE1�8�55�h_��HvĆ�O�d��imT�st�l�'U����83�̓PKk�mW	D���0setuptools/_distutils/command/install_headers.py��O��0��#�h)�y����^V=F�V���ƪ����M?}�H�ZQ��<����|�R��7��i�H�|�T{�N�u�=����w���r7����e�_��$l�
]܍N�/�l4	{��{o��36X3BCXA����ɞ1�	N����@�/�
֫�9�!+���1�G�뭜�����C��'=9���zG?���9��D(j(��m[_Z�U���[��C�_K�݌Yj����~KVU6zI���(��wq��d-���YW:T哑��z��y6����_��&��%��9t���#�6h�K�bU�����)�����kI�EU��T�[u��A��,���L?+_C$j�ב�rm|.y��Z�j��s�9u�\��|e#�|e�~߸��kh�L؛�����$��X��w�j�iB-��&�7��S�w�J]�? ���yd�q�?PKk�mW�9Qߩ	� ,setuptools/_distutils/command/install_lib.py�Y[�۸~���*XHB,a2�<L1�m����	�I�";h�k#�Ie�.����DJrnM
dbS<�B%I�o�U�ɲ��#�e�KE�����f��8t��z%�:0�w������X�MfW	�{yRޓ#ߏ�y�$�f�.��}3�J��nU��f�~$%0&��F~��GL.�{蹻T��p��<!�?(�KX"
�/�GQ3Ҵ�\�y�ﻟno�׷o^��z����7�_�ސk���	���p�$vf�ɯ6�=��h��Hv^$c�!I�#Hh��{B�@߻�b(wh;�q��* �D�=��oF�%!?1\�`+�2p)�]Lj�YOE��}Bȳ���Tiv���=��>��a���̉��	�R�����бS�f����a-��D�9>"	��:w��ǎ/��ȟg<\~!F`�7/�w�C^�ȝ��$�(�f3uHii��@)�hk�8��H��gunJ\��LPeuab�i���⑂d[�lK���\�[�������yz<��u�=�o,�=�#Ў��&$�\\��z?�KFž�)�k �	V+.N�Q�$�����n�tz�L�H�15�`��c0]��A��m7�d�=��-��� b�&f@Βht�
�Y�|k��>&��
ox�P	�OU���Ј�Ï�9($~p;[Hh'��~l���Hq�L��/�`�_q�K<�(���|�ކR�^��P�(�0'7B_�';��v(�'5�`ƸR����޸�����&�V	��5a�@�)���W��J4��jiJv�e�uM~�xa�4�η}�m�
�	�W�b�e=�����=TH�\�r��q�kr/;���8Z}�꫌�c����?���)P���֎F�GV`�0F����n��D�;�@�+z.
�-�i�I����)*�
w�$���"˙n���T�l�G�c3�E��t7�y̙4��¾m;�q�{����,����~]��%d��Ů�+\��_��|㿶M�P�Е�"ԙ�މ�-���G����X�Eϡ��Z�}Ͳ�`���Q�S��v��H��d��f�w��2_��A[���$TҩC7�5�,���v#ӏ���+�u�����q����Z�$�B_��2���o�8��>�&{+
����
��i�T+i-��	yaCu�"��ƣ)0�@�b[���Û�nPQsa��Z&��=Nj����:�V��X(%�����|T�e���y,Zf�맨�u=C���_�*
��hw#•*+̤�M�Y�!8�T��́�n��4zLJ´y�\��\،}m�l��� �sw����{ϜȆ���2�X�"���Ge+�K��)�?���� %w����r��P�+���켹��|8U
:��v�TL�2H�+��HE�-�K��eJ��'�M1:���qy��	�~ֳD���S��7�O/g�8��"��6�*�I��L�J���|V�4�1�!�l�
�'8����5{ˁY��q�̆�m����$HAr��5ݑ��i�*�f0
��EZh�`H#��n������L>��@~t��XO�,a=�f����ϔwv�m�0�0��B����sy�#$E=$R�?G�f��pЫ�?�0����**ƹ7tj��7�S|��*/q�ن#�z�@?ׂo�~̺X>����~/w�\��-7�ũ��a��홀Y4%�Rʸ3�Iu}ǥ�?�N/S�z��B�>B��W�����Luqn� 
��6�`��ik�WU!?��o��=Kض�Yګ�$B��O��?�~[>�t��o�N��n3I����V�
Zc�
r��l*P�^�"&��Cx.�S����ѣ@2��qHY�a` ������&=��vb��>��b�u٨rљ
�_
��_ǒ�D!B,��Ƀ��|��#�@�w�=U4jN��vx���ƫ����i�UX_(�ʯ�¯̮#��m�`�d���7W�_�@WJpF�P�,y+�0��T��*#��>�� *�kr�6�a��m?�9�d���s�Չ+~�Qִ>Խ�\*8i����u�.g����|�֜�R�g]���U�5�a�e|�# ���DCk�E�y6S�N��3!��:Ls��:I�W�Eti@&�q�Q{����j��{]��{�Z�8��,}�
�w�4���t�Ū��	i:��C��\�H�e�ӲG�1����T�0�av�Ԫ�7�X�^�3��ُG��FjyD0i�wA��';3�=s�Vru����4+�a�ő�Wc4�jg�o��y�En�t)��P�8P�L���d%H�e��3��[Ҳ2�T�Dշ+'����s�t׏3����^~��@�Uͅ`r�E+/�N�LFڈ�2Vg&>Ө%J׃̨h�1_u�����s��R��v}�p������/���^�Y��O�?��h�אm�PKk�mW�
��0setuptools/_distutils/command/install_scripts.py�UMo�0��W.:ۀ�R(����a@w+ñ�D�,��4�~�(�rbg�:�H>=>RLǵ0��B�UEm[�z%�������謉��m'�Ee
�=�C��d���CCF�P�����I�跊�8���[Y-����GxU+J�$
��.�(mG�����ŠYj���p�`:%RH���Lņ�����o�(�di,�HG��>��W��Apk�G��cr�1�>� f����PñO�Э4hwS�NrHj��jh�,�#X��E��,?C�B�S���#8��&��`N�l�õ��A4��{�N����E�g��+
��h@��n<�@
Ν�����	Q�A�-��R��t�t��	�h���V��;��Ԡl�b���N�̂0�c4����v~�m�cTٌ�V#��I�E�؝���<���5�)W�'ɲ��|�
���������Z����\�O�����3�줕��Rр"�T�~v�7rl1���\����S�T~_Qw,�FL��/&;�Ef�ʖ[e
IGF<'sVW�ַ9>c��r+�ㅛtP��;M}�3�iYg@jឧ���76�E�W�7b]nl��8߮����ix�Z��-��,BCi\�K�s/����6q�/�."Q�5�^C���n��i���~�-���e�?^�Zn�]�H.��K�n1�j����qjH'�P^�E_j��Ev3�?�_�*T�+�#�B�j��!�'PKk�mW�>qp�+setuptools/_distutils/command/py37compat.pyuR]O�0}߯�b�6�L��@M�y4f)��Ʈ]�",��E�Ҧ=��s�-M3!5�\9��`q�����H3�=��@��F��r��脷�xIF� �J�5e
6b��|��	��UM�PpK$�fC�g�.<�4#R�G��V��ХS�(.�n�%ֱ=�_Hz�4�G/�`2Ƴ��m4t+OfI�ג[���B�k#����~�wC"dZ�PW���~a�hC���~�N�[7>\��v<�I�Q
�Ǔ�q��W�1�
{�iW�z`(�'�H.U���Ɯ�@Zi{��}�X�z`��Ywp��C��_e.��x����aC�g=p$7��޻�����"0S�
�w�PKk�mWK���
*.)setuptools/_distutils/command/register.py�ks�6�~"���Ef,ǹܹ�鴉ݸMj��^��xT��$6��d5��~�JI�;~�E`�/,���$-��J�2���*ʓP��q1\��_�*Y���e���X���j�m�jI�2�
�
�p8X,xT��<?8��M/#������A�Z�b^���T�i�~e�b���Z�,Kg�:%�	���e5��b�6��aY�|ȩd\M\o�/o�<�rI�VIS��ZF�A��LI�[��������2�J��M�P�
���E:�iR��z[-�}�o���'�Ðp�%ӂp��̢Z���-���2�sD̦����A�#F3D�}��	{%�������ţ��!�q卬QBkýN���U�nC���9
�x%Q�v"/*6��l����(7i4����YQd<�wj�;o*�{<̷�-�s��wrg�z6m�Ҿ��x�㷠�,Z͒��<���Nk�)c��~�U
��+�|{Q�l)v�kp|����<0tlCHh\�2O�?�I?�>:U��>/���F��
5�(L/�c?����;#S��cm���<��g��X��V�y�GT��6{{,Z,��u�U�u��ٹ)h
�(���2�yS�1�fK=�j�W�4�V�$�S�"}�MxT��`Є)5!�S�A O��,�XC���]S�Ac�Z(J�\r���ָ�=�Q>D��|-xLA���㐚�`;�=�0�)���
�7lh�GLVO�t�Ls�%C�^�`�e�2|�}H��\3]��4�:�]���Ґ�%��2���h�`�H�d�G��Ӳ;��y�
hC&���Ig�1X͢J������h�bw
�E2]oש�
��{�W>�X�L:D���SCޝ�9ɦ�l�WC}�md,h��D�ʂ��>�eTN�0��9D�\�`���{�4�P��_|���Wӛ�뫗���n~�|D��y�;�j~.D!|ﰔ1����Y(7�c�]���ؚL��ȥ�jtϟ��E�1\��\��U,s2ʓ
�Qz��`2�-�,T�h0}�yߞE1����%۵p��'�*�d6��b�s����Tr�y�w��T��Տ�8�]G�
�ܮ����U�[�i#<����K�4��M��Y�5$�&=,�<~\$����@i�YM�b*QH�gu���8C�.�Q�F�����28c��[[u�1H*Eˋw�{���W�.l��k�e#�H�y�e�"B�+㐑��l��@� �H�0�kؓ�ջL�K��2�YTWK�"��W��T��o z���hJ�
:������Ջ��yo��f	E�Ȉ=�cw���8��e�蒋�z�d:z���w��(Ũ�Y A5P����̟ղu�9�S�QB�
Bv�8Xn��a�$ܖ#�-��:N%�`�!�����kJ�}R�i��5�
��*~�&���yS<�h�����Hc^�҂�`>�?�ĨG8in� `&�$%��P�X!Z��!�ciÍ���A��)`��qs�*J3͡a^]��1�Hq)�<�Q\W�bѐ�aw0e ����a[�o�#p%����7�e�{�jWԼ�	�-�;	hAI�p�&�R���@�=d�^XB�\��Ȍ+F�دm�d�d��by�}�a�^
�i���ņ�t[�X�C"Q�5���hx)Z6Pi �k���p�����s3h,x�![�
`kP!+~k�i���` 
�4d�j8y�" ��>��<���wg(�ȑ�i=��?_\ٳA�v���670NT��q����I���>k8���][�P��:���7��=Ϯ�ā���9��+�`��!��:l�/5���@��+u{���a�Uh�k�+�B�V��FE(�,�,8�rӱg�^]+�/���K�E�5ԣ��~���v|��2����#B=�i�G��M��1S�?�z��l�V�8#��a�L��'H�>~�B�-�	��:��^e:˶�T���K�"J4��c׎>>�.#�yVL���4v��@�]x� ��
H�T�����1Ӫw��0�@���
O�����|�K�+쩓��b�@�y����GB�[��
v����GԈٽ2p]�zv�n������ivIdPZ�Rx��O1������?��2��8
(�6嗢ԍ�~�G�vX
�o�|���gB_�y�:Ri0bm���tZqWT���}��L#�tpSE5a���� �P�����d?	��k�3�C��л�  G$V�7,;��I�UE��/��&]�\J]���ԣ��1�s��֯T���\Ū���W�e��^���֫G�|C�#���B��qVBi��7ܕWYV��tZ#mlf�_����/���Sd��#2E��\��Z�PH�-x����6%զ�6채v�uk�dK6�)~a�F%��<��䕺��nm��<���L	�}��?;��_5*��� W��)��N]7E�������j�����Gv�n��%�.X�$I�X���lb�����ͶV�Oʨ �ދEOC���cl��ѹ�TX��jdw�YΈ�A�n>�(4\3䀖5$�bk��=8�K�&6�(�@,
aBQG0�v@N����r�Y��A�2�P�jÐ�/��^Y��-���\���uUhN&�s���Sd�n�+E�ɱ�@m[�e�w���k�p|��U�S���s�bŜ
X�9�Ŭ,�MZ�z��oC�b���ԍ��ȝ�co݃D�s��k�er�o�OO}<"YO0��9�ƦA���\��ۂ}�T�D4R
W��P�<�}���k����|��\���E����k����i�>̋���?�T�OHd儮,��(gx�ѕ�wd=?<{��ŏO������G�/~��ų��Ǐ�qz�><ytڪ��멉�M~t��@������G&<��A�"|Ivyet�P6�#����j�´�+������h��p�B��>��Jl�9
k��j��>�е�Oc�w�H�A�s�+ٚ�[�a7���f�~�^���w@P?�F�Ⱦ�ƽ��1��W ��Ӵ$ۃz�,��;�oH
��a9��T���M�&��=(WʈG�~���(u{#vT�� ^�[K��p~��{�Y�C���p�ً(.�A�z�{��\�-�<�T��Bw�I�ú��sh}�D��M�9��[�(�_�u�3hV�}Hs�D�����������N����j�Q?���j	t����G��A���6bu۱#R�HIi�9��e�8��G����Y,�����!�u8�骜�}qO���#�g�����BL�fk���$�Q��m�:?����P6J�1_�k9~�A,�G xg��(�6�K�����p���v��k�x(�}���^�~�y��'�����L���׮�f�L�}__8Ũ��9�~���稂
d|��ߋ4�}�����G*�P��;`��[�(�h��PKk�mW�����J&setuptools/_distutils/command/sdist.py�<]��6���+��r��Qt�ysJ�s��9W]b��Kl�"!����h����n|I�xOUk�F���o4'���З�H��x��"����ͱ���׽`���W��2Ϣ��Y�Y�D3t9g8ܕ[�n�U��Uyl��g����Y\���U�e�!~�OOYW��^���J%@h���$B���Ѣ�R|�0�++~i<��Cyo�$I��'j����5��p�Lz�9ꮑ�U��0�UO�A�8o�{�i��=λ����T޶��[�ǧ9"�
=���*���CsJwMw�z�^\1�����v\U�m�(������`K�I!kh1
�l{&��^�khYWe�լU�W��5Ӳ:?�{��a>��٠��hЗ�o�������}��Õ��T�
��E?PYY�s�;~6���'Y�򺈢@=����`�~kj��>��/���e��II�G��"5�JZ<�y(3�ٱ�>+��cF�4��
�7�2!�g�6D�\�])�mÂK*ˢ>� 	1�Z��$1�}���k����@C�#�"�H�jg��p�$'Z�h&�v�
Ε���r=�w��T��`yV����X�k�O�����hZRZC�up�(��Q�+�؄1{��ّ#ρ�rǁ����>�γ��_�__���퇏IY	V��TO%��Y��\D�~B��ZMa쌑:O��Ϋ���n5K.*8�>>7��\M�O(tz��?���n_�qAg�L��#(�:�e�i���j���E��rW� qg��R�^<���J��t�P�nz���"�Fۡ��㰍�7���]�P��-��}\�ڨ˴l�Poo_Y}��{ئOw����c_�x�?����y�;vG>���P1�U,`AF�Bn����|�AW�sWw��|���"}y�ug�+��CV%�ټ�-�L.^�ɟ\��w���Z�H�K��񰴧A7kP�ҭo3B�0>X]8�;��5��=w>{Rꔽ �,D/���v=�|���+P>�4$O;7\`
ҿ�i*|��ƝY߰v艾9�(2��J��A/nI]<QWFMF�qSq[����`�����q�k���Q��ihQ���a)+w���XB�T�cٟF~sy��t�y����'�Hs���|�:�y��Ѳ�i'��}Z~A��Za��/�Yo���Y=믗|��E,�e�3�p�(�m!��C��FPJ0�rsA\;��˚��b��a�p|��;lt)/4��)A䕪ȋ(�B��iL�Rk��}������;� �%�Co��_Wc�X�e_fU��kf�q�53qXH�����:���^�c2%(y��ǜ��
�9QWb�P�h7tJ�m��٩�|�}7�'t�`S.;/s׷�~pG�H��<�)�>�����־���)�M���))2n�e:�?��꼍��y�;�t�d*gg�Yq�E�ە�EуcsO��0B�	C��`����2"K�+�<fqrR)��G�&��ꅟmV(k���8!���*ݷ�xe�?"ri�R��*C�DRƋ��:|&€=�PZkNQY�%M�[�'��х�L�}VֲpU�<Z��}��cv���'˼.���Ɣs��m�5V]�v���"%oY�<u��6�v��	��������tJQ�Ճ������!뚜a��ԣy���7����p�s�0��D�JqG.�1u�ǡ���:�=[�<�z\5a��0�ҔSV#��v���2W�L���'�TJ�W~X��@�
��S哥�V�O,L _�V�R������F���˥z˘㰗��$v��n��T�M�e��7f�$T^��:�$���7p|���H�	�C�y�p�|�>�����P�l���7U�P���@+b���)w_�{��aA���WN]ʅA`� &�Ĩ�����`���p����GD�����O��O]� +;Ԡ����T��k$|����g���B|Ebs�R���ؖ���r�ff�c�wĻ���P�+��f	Fvρk*R�f�[�&leh���a&U��CV�y�-J�G��
AeQ���9��>pʹѽ8[P��-��Q�ܸ�Չ�	We��x�э�Ғf��c�(%���V#�@HJ!�};q��?�&hLK�dj
%����L�T�hq�k��?6�$�h������85�����ZaLÊ1BYH���:*��;�����ݽ��*@Ѣ���f6bj���s�NO��-N���Dz>��/���O\�X8n����ζ�F�eQP�Ƿkd�"�ͭU�Vc�zmL��@y�|��=��w�V��R�(��2`"�L��LfK�ۦ�ph{fm��e{�zmY�N��ja"l�T�P�EO�G�3�����QO��K�6��G��1�J��7��2,�;���k��a%� ?�T�x'�6�c����jb�U��'�3��np�JP�&=WVͻ.imI�D
e�Iu�4��P-��e���.��/䠨�G��C�z��۾�!D<4�Ѽ4tQ��J����~�M&�Z�P`a�!�4���U09Z���Y^j&��45�H��n��01ږw�jD�:���Y��N���u)�⺖)g�M5�t�y��A�̔��,'�~\=�+[!����R�9�`K�H�')J��D�*�"�Ҳ�K��[3��$�)UE�gBz)`���&����j\.��@J��FB� �5��w�DYC�Փ�=D2%��YMi�&n�"Cꌯ�%�u��?�[T��wq�<��9�(�r�y�.DD��s�qb���}�JB��tۍ�օ�?�EEȽy�ݧh���}3��̷��\~xۦX��+]�xA=����C?�:�& Ϥ��w����{�;G��%^�V����?���H!Y]
��a���ޔ���t聎��dM����uwl�ر�5�l�
��M�,�`�SS`ʑ��$�ul�!�-cEA�<���ԋ˒H�kϓcq.Q�t����f0��F��_�^��t�;��X`��$���XXÓ��s\��=թY��J6���Eϊ~&�Y��8��C�C��v!�8�B����rU�k�݂��f�x)vλ$b���y�{5�]vN�g5�ـ^C8���%W+�g�L�a���,4	�#Rg`}n�}�]���ϼ�Y�^����&ˆݦGj'<�\��o��-�tC*�x�\&��{�a�I�B���
��e[:�y�L�4�'5��m)ا�Lg�7�u�����v�v1W\�Q(��b���QVuv�7W��f*��*��	�;�c����cv:���
m�� 0
8�7LM�E��<��W�V�5Q����Ž v�3r޺�՝���X̕�;����b_��o��UV�M����4=�$��d�[ț��Z�SDjZH�yWa�m8k�M�����7�1T,�g�Ԥ�����j<��w˾m!����?�Z(�2rN\��ǔ:Y���JȲ�{N-���;[�G�3��Ux�M�}pht���߱^M��u�6jN�[W��W3xl�vC��m��܇�cml���Zw�U����)�3��3H�`���Dh��B���8b$�l���C;����_x���w�1��v a�t3���U�B,��{������ؾ�+��Cc->ٻ��U#o�:G�����b�۹U�=v�$x�+�	uɤ�_DB ��G]; ��/as��}�f��d��FҊzۦ�}��cg�1��~$⾆�H�}����W8��\0��z��=?�Z�o��5u���BY[�jPmөJ|#ِٕZ/�^�Z����D�]��!��@�6��ǿ�~��bLЅ���94CӰZ���q��\ಲ[N	kpN�_~ƳR�{��L}�sChyrV�Q�}WM�����"�/�.T�C��R�M�*&2��C�V�b+���K��K��F������:�\��6��:�@E)����u��D�|Ŕ}p�

�N�I8���֓/VM031�̵֣����i$�B]S�8�0�[�Τ���u�=���&D��^|�a/�]�=Hҵ$���n߿�x�
�hTb��췷/J;���r<z/&3/���B*9���XӴ�Z�5O���I`E	���N
���!��Y����QV�@�L~H~$�<���-K�Մ}�o@.�P�N�(H_��ˁ��^zu,;�s��'P��=�,��|�d|�C/ٹ`;(ٙ�2��txEl�n'l�k��Q��4_��}s:3
f�����R��~��d_/@H�-�5���3�e62^J!����Ƴ�H{^�t����c�a-�rY�ܪ̖idj`�:�T��b�E��M"kS�{�ql��}�@��t�slz��u3m��K�d��&ߺ"��.OjǬ����y���.x�B��0��x���;�k�Xm
�UY�P�7�@M���ۛ���
������䛆ՀY�#���6J����x�f�HsU�|���)֍�H-ǚQ��f,�-���4u��Y�:	����sf�“�;��P�|��xG%H�2�'�l'��e�P���1���V�@b+�> 4��~��>ƤUo8mMJ�'�`P�s
��FF����%vf̽:��Ō��Y�$��7������̣᩼؊g��.Iot�GV��;��+H�l��t��HCͥ`"ek��+	G(Z�	ޮiM�Z�u�×���@'������j�Q�mol��vDr[���z[5'����-F�i�9q@eaL�r򞟲"q3�C& ��?����J/Xߠs$�e����N�.�Cg�wl�WdY؀a�D�$��17���HP�X�á;V�Z�y��ZU������h�V]��+��#��6`�+i�Q��R�i�f��S��wd��b��0�ᏙK�hs�a�P��j,-����T�ܱ���F�5SM6�#5DDŽ�jFw���N����U����Sb��P���O����m���o(tH߉�M���[a.W/o�Ӏ`��m$�������`�)V�����8՘�]�-�kC�%�I|s�{����ES2)EC]�/|��\��ŵ�����%\�H�'�&h��Ѫlqe�4xt0zg���@��[r����tc%j�u���..�]o�n�U���x--&
�	��徥����:��e������>��Q�f��/;�m�O_pk?��V�,�������<b��c�*���e�MY�#'��P6��4��͝���#^ujё��mZ�A	�!"�+���屿�ٹ��b�&��D���xP���؄����-e���^(�8�d�~'�r�[eǙ�?�>;T�'_*��'^��v��&T�֞l^���2�^�eؔ���z��nb��r�HN��º�a0��a���9h2��y?oW�?�r�PKk�mWG'�=�	D'setuptools/_distutils/command/upload.py��r�6�]_���CjK1�c'�:z��N�&��vwҌ$!	�dЎ���9A��D3q�� ��\�F�B&Y���2O���h>��o�mY�$QF�X@���&m�Hd�HM�/t͈���	/s�u�L�7�ۺ�T�~���rS��.�j���z�Ֆ�T��Ǥ=�
�R�/��Ǭ̪��F@ ��Ie�a��Y�+��w77��BT�C����A�k�$��=�����V�*�	VtT/w��W�_�YYӻ�S
���@Ò�R�6UrɦFI>�9����G'�c��U�/�D���S@�(U��'i��I�S��L*�~¥l����_�,��ߟ.__|�9�x�|s����,ȷ	�O��O�9_�ł9Y3E�Q�X1�X�l����11@3r/��j�����TJb�/�;�O4���Lp��,h�4�%;7\90(`m��4��l��L>i�D���2�I(�X�/�D�-�FB@�u�[�
"�!͸�-�㟷�o��Eyr$ғ�蟍�iU���<<������V��\qZ���$+V`F+�O�!�W�Z%�2)��<wW�|ϑ�TwK�d
T�pp�vX�3Z@zz'��:Hz�V���m?t�Wn��e�z�z��K��DD�����lf�[	��Q�o�-#[p�N��U劯AQ��E�e����"O��_���XC�O�݂��;N��vk�`u%����A�7���b�A��*~�6(�#lK�@���v4���� �)j�n9��b�Iw^�5`0A�^��sj�]�w\6��;{�Tє��t��q���绕���lXT1�H[�L��%���V �=b�:A�554"�Kc�O4�A�c�e�zw˄�X˧cD�q+�������1���.
҈�i:��*��霼���q�_Ih��M�u����{�%ҭNK��lö4&%SE��8�W*�V�f�΂��X�膔h�m^0���)�ƾB�RBpJ�y��R�ӂ!G��O��N����qN�BF���$��ۦl'h~-�:��:u�5N`ڎ},U�qM���b�F��Ɗ`6�a��6��
�kհ�G�b9|:�}�lf3p*-fX`���?��8F�BLr�[BeX��7�g�(�ҺRE��CS�ƽ-(6���,M�D��+2]-ױ;X��������tdmi�G�C@W� ��ʞ;�I7�b�J���xv�C�O<@�:H���^{�h���s��I��,�+M�CբRUV�6���蠝�V���4
�I�Z����t�����[C��֮>�v�D��Tm�6i�]��-�P�P���o`�]/f_	���s���Es>�6Ϩ����`DpL��#n�-[�0˻P�F�����p��@.���b�9a<c0��z+{�������~a;��d�F�uA4֭l���>�W\��o����J�1�ڞ���q_�^�gO�G�v�䱶{#�X�����J%\���m����|
10�>���S-�L$��*�a��-M�l^���{'\1�_��x�R_n�E�e��QI�4s�C��-Ɇ}5��?ұ���-����ǁ~�i��I��B�P�"�6)��/�RƳF�m�� Uv#J8%����~����O0/	�6s�SB%Y=`��-�
F6��GʨC�v6�!���u��:�"�^�	�2��b@{�g�1M�KW[Ν�{@n�
�
E�h�U�=�	�O8��Y
׀<q��,wwtgޝ�nI4C/K��N+0q''lX�z:�_Z^Q�33��^�N�i�3_+G�W
/rk��N���\Y�5n^^\��ǤU����μ��w������7�/N�������wW�/N����ώN�ݗ�z�Kÿ�_�l�Bv�A�����z�Cb�#t�p�J^��_D���{Ln1ٰt���+L��~kA�M��⥇t��muS����!L�aP�7�4 �m
�k����5��@�Z��~�Kt;t=-vL
ݦ��3J�t���S0r��_����e��
��b`o���>�uc}gM���罘VL�t�
�S�
��JمM�V�_��
�!�����>tԺ
)?��%�/x�=�s�t�ڬF�z�<\7閛��o����>H0<�r�^l�-K`A4c��Ar���«#��#��/��*75�[Ch����C�T�'NY�?I� ������j�0`����I奞:�?����N���� օb�\b���m��h/�_�`��G�d[�؁�W
�Ӏc���=I�ǷP྾v�Ѣ��{� �:&,ѿ��%�Q��~��O�"�+ِ:�������%�Xrtx��Q���L�u�to�ѷ��2"�ahǭzS?�y{�%�I}\����o�Bd�4.&�C�e�*^FQ
����I�I�Į����fp�Qmm�پ_�X	��l��C<��z�y��?PKk�mWsetuptools/_vendor/__init__.pyPKk�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���PKk�mW��aLBmT'setuptools/_vendor/typing_extensions.py�}ks�F�w�
�tU$�4c9��F�ڊ�8YW��+ٻө(�%�I�@�\��_?��3��$�q+�H`�g�������']����t/��|�H�U�ge��H��WIWy��S�ڬ��bo� z6��"z��u�>Fi?�x�JD�^����2*ד���*��MT$Wy�6����eZF�_R��)��F�t4�v�W9t1�.Ⲍ�.��e�.��6����uZ%Q�J�2}�,6�=��:c�G�Q��l��}|��8�<�>FO{{�<R�"�|�dI�N_%U`D�^�(~y}<�+}��R�W�G�Fc�9~%����=wUWy4_g��h�,�(.��U
�����e��Y)qɆJgI2Kf�d�5��ώ�Y2��Y>.yU��?�V�,�V�Ɔ���<�ƪҸ�۲\�F
S�E�ק�ޙ-�47Z�>F��Y�MI�. ��e2};�`t���r��"^&��R
��A?��h<�o�cہ"N�$:�yxQyџ�_C��;�G���}�S�H2�
��mҫľ�7k�H�tL��r���uog����On�-�͓��
��z�dUI���}�����xZ��f�����
(�A�(�_/��x�$�h<��7CV��$��B髴��9NbXvӸJ.��.z����f
��X�bM��"]�,F Y,�{��).zC�;�h��G_�@��kD���Is���U�}��=�6P�?���*�,LS��M6}Y1��?%��E���̭J�V�Tzg�EbGz�٫xe;�c�ODw��\���k����������E�%,#��b��L>B��z�b
�R��ђ�u�ގ�� ��)�fdq��l����ϒ��ʅ.�,��3;�-��Ծ�*Aߦ�q���J�.�́u/��ҌN�.'�2�~2���x��hx�H�R>�z���������^<���w_�ó����v�Y�t�"�ưR�aD��"�H3���@QU�
p��&2z��^�e\UE�W�P��@\������{��'
Γ��ؤx��r
�hLK�~|���"ϫ�b�,����c�s��s\Ặ�VuW���(&>2�_����Ert�'�T`�4�Ő������?M	wKѼ��i����{Y�Ʀ7��H�����.^�3ܳ�����˔��qt1F��ߦeu�<;?7����"�����4S�~A���hW�3�͎����
D���	ot�~	�m�ܱ��ƾ��i�����]�P5�`�_k�1��Q�P�ب�+Dk�PP��7��dS��
�� �D�o9�iL�+(�P� ���*�Ph�y�mI�!n�����{'v�ࠀ��{'�mن`���	��F�&��~
�I�)^�U��P��H�i��B��}g�Y2���_\�R��eZU��r���7eR?���6�H��R0�ED++ά��\'�h�����[���?����Ԋ�<���+�$�����P���~�K���g[�Q��
�v�e��c�c���,ҋEXa4F�a��MpidM��,e�ϛ
�e!�%C�3�]���9E^
S��"\�b�t����{���MU����@�=e᎜����1��g�'R2�i%JV[R��PLD���"y��^ ����E��f	�0�ll��+b*����ճ�9~���82��ɓ']jD���C\��y�����{Nk�L� Ef,\��g�s��Ջ�<Q�=�}]>l�07�U\V�!�'l���mFw��C (�� � ��MdY�Q*ЭG@Y����~wY��z�l���w'j�N^��ig�%��L"�4�zcf���0 ٥�a�������~{5�93`
�j�ր?<  �)+�I�1�<`���U����1��%
�	[D�����ã��Me���r��G߄jԮ��� a���"]�B�OW��� o],�I�@�`�O��,�W+�	��C���Ѱ��9j�,հ���3H�W� ����9 Ǜr��	��@S�_��k�������Y/4���;������-Bm�~jhI~�ZR�/z��Q(XTj�v��R=�.�^"�F^2�2-�q̽5OBH�*�J��2W1k�ِ�F;w�����er��"��m�n���ϒiN�4\�F�t���U�i/5pP!T0�H���Lp��IӰEi
��z�Mf��m��/
�s�9���x���2m��#4��F��ެ'}l2@o
�;l�]���{�m��	��{$�>�ܦ_�u�]���:w`�dY�°��h��
��r\*ڰ���v�������;v�)]<�9��L�
�Ni�ޕʹ�%@l�*��\����@f���$@������T��s��.��=��6^����#���OP�����K��G�l8��n���=���	՞�S�B�'�a��
��Z;��+���A�@�ڪY,�t�a[��J�j2l�!�QMdP�	�x�l'fת�Gu=S��6���Dl�g7�[P�"Kc7�l��;�өNTv;�2tcۑ~D�MѤ��vU��uP75@��_��r.u;��4֨x�%k���H����eE��VLh��oX��:އ���Tt����r�<��x�����v�Kjq��{��c��&�Ɏ.g����\]D�t��>I����F0��UI?�%���=��n4Em;�4�(�2�znPQ��J�-���H�����e!\���|]�S�2]��[�NW"�=<�|�Y4O��La~���1�������
�
�{{j~ad[���V{m:;�Oj-uw�e][氩e�AlT�9�p�N
�>m-�<a<_��H0�
�|�Z$�5��ѻ��ʧr�r��'Iu�$���Xp۬��Q�N��gN_o`b2\� BTժ<����z2����1Џ�8)?�˓ð.f�N�-"�+�V5�M�8���cK�Fc~�;�՞E�=��Z0Ѓ!���F�?�~��tr�R^������̐�"5�QN7��C��`(��6�0Tľ�P��!�hVS��qu����y����f~$gv
J&Z�H���c<^y�А���䉈bH�5�yh���_�wa}���������Oͻ�3g��������ў�D���ў�&j��{��[�:�*��ð������臅C?�KRM롷}ɾg�D��ѫ5
�
>�i9=9����c�vf�DǵV���=}��F��PE��E^\ࢠ�6����黰��%�a�B��to�'��#��;���<�
6T�Z#���x�vS.�lޅm��2��úZ[��A˳�xNу�U�J�F�ܮ݌�J�O��iZq��z]�~JR7#�
�H&��m�]�0E���AW�Q����y�����l$����Ra1��~�pÛ�'t�	OW�y�C�_�6���U��,D�PDr�l�5��?"���<mkf��S.dQn��9F?��\D�f .�}���)C0Y���j�Sg��/��A��h�����;v��ĭ,V;x�1���]Ӄ-N����1�,4gzA�OO(�'H[�!0��>骝N��s���8m��!�D�V��T�'�m4Gk�AQӯ��}Uo�n�Ġ���A5ԍ4���w'/�D�U�'R���[��H�,�r�R�0��č{�m���6P,r{�"����0�Cؓ�מ�!���:��o57m����T!XhO��t�.�j���жci�j��cr�i�{���J�=�SO��Z������e
*���
'l�wK�p�R����O���_/O^|��
�۝��Nj��ԣ��O��P��(U�
�aՠ�+./u�7h��
9D���%��CB3��??�*�ݜ�H������N�7�P*exG
���Z�0��ӣLJg�j;{@��U�[7����(��q��qB�Y�g�}��	-�@޶��T)���;����|_u�4ǣ�ɦ��#~)��U�9��B G@�EU��=������Sf�~xƠӎ���]%��"���`ii擪�o8�<W�n�C�^�Y��X8�Rj��#�G��^��`��g��QF/�QI�X�a��鶣�3>V��7CZ�"Q�]�^��[^_���b�~F�l��oNP0�ҋ�h�x��	��J�R����.���O����C�MK|�3�Y��&b��4���Rq�Qq�
�*:�gI������ӹ8�I�o��2c��n޿�4��,E��i?��gKUgFFr�C�h�V���Zc,01�Ւ��$��t�D]�"��sJ�$l�vD	��G�ѿ9��YK�JHv�Z+�zE�H	�d]%%�<yP�'?ҖZN�c$���Ϛ�.<��^�� �\��b�����*U�f�Và-���T!\�z��fy=6�>��k9� �ѕ�V��T�P�N,"�Є���O��2��ҫ�/�n��U��W8-Fa�X(t|ˬD�Y‚�������(�,��(~��j����ޖ���=��b������v�nQ��M4[��4��Y,8f	]��:�,K��H�ٿ	�,�oJ!gm���_{O�8E���Qй�*�u��[���6��'�8Ϋo��K�'�/!.R@�=P���Q�L�da��q���Ն�Wf����l0T���mcB��8�?q!�8�R��G��f 
��58p���(�9�f���$�$���Oh�3X,�"D�+qoM�u?X��(�B��A�x�f��_d_=:�5@icc'OX5x���N&�ؤ.2�8�6�H�����^m0�7P�*�`Ӊ�
�4zr։�O�;���ƛ�b�7�=�bB��q_���]�"3(����	��J��%M�æ§v_0��sㄵ��*<7��[�=�6'����5���{�.U��U)���6���3t�4�;���z�6�\���5�ߩ3Y�����ey���J�]�p��F�.�:���m�@�
�ʭ��++�
�)���V:=Ц"����!o�,�Y%B�i� ���7�@�P�x����p�05;M�jm5���h��
~��6�����:f��C]k�%K�����rJ]�!��ץJ�<&�BK�B��D�<SM(���2�x]��c���N��p+BW���".M6�7&�j7�;!N��fz�n>�)x�0~*R����3��k�c#P3	/{��'�u@�6p!H�o��ao{�L1�@;����E���C�%�uF����9����9�8�1�N��H$t^�I� z	�&�AU�4O�PzX�(r�UCMN #j��k��E��x��"l|E�f]�u�ف,�\/��3lZ�P�#9d|X�Å�9�|�/�h9
}ɝ��ơ�٪��G��Dy�7C3�&M��EJ��eR��E���.
p�oL����\��{[~:3g�	�D9��� iX*RrK�]�Ќ4C�v-��fth��\�-���C�J�Яp�/����|���XWm��r�z��jy(���2�K(60�_�BAmFrI�5�J2�00�!�3FR�,WL������x۩G@����4͖�k�rnN���7g
D��Em��i1��̣�l�_b�%���s�(�]ب��U�3&��
'�:�5���S����L���8��'R,gVZێk�y4׷	\����d(����A�PC���^����g{@�h�n�����qCq}��6��w���m T��^j|VVqN�LSW�Q�궮���}����v9�} Ӟ�*���cux���}3�*9ר�Y���X.�
��
R�D��b��!����^�Lv��F�B̤�:�.�
�KaN��B%<鶜��v��z"p�S�q�.8��LH�3)��mc�;�3�&�[Q����v閺��+�إ^ ��9��D�`�[Ү5��YB�O�	m9$�;h1�]��nU�/�6��N8L�cFb��r`,�~�3y��E7;�z�YԒ�RRgR1�
T�t�&I	n3u��QS=���}���Z�?�B�~b��|�z��V�I�����^�#�T��N��.
�c;J-�^��g޳��0��_S�*������<k|��Ĩ|1j.�!���/`����#.��b�Jk�<�eN���]=�|�!���w2�T�çM��#$�!/N�Q��ivr"�EeU@̫�lSP?إվ�%}��m�����E�ꇙ3$L�v3^1�4�.�3����m&J����Q��/��}�N,�Hޥ�f䒶rU���NZ
�^/f6���|��nCQ-1eѦ�ށE>���`0F��9c���J������F�%x.Uz|�e���5W�]��ɵ����~�6��.ƶ&+hyV�[X�lb�����Pw����@�
�Ы�'4y>�.�w6�ɏ�#1��^,��5Zv5�{0��~��B��}��hF�SQ$�����Si#�b@�t�uz�}a�Ctf�wKb�%�L^怉�;i*'-8���GR\x�=�
}L�An5h�U�M)���F�����tZ?R���~���)��F'/r	�2�����Ӕ*��y�d{tF��ߢa���<S�<�L�ѽ�D�bP�h��^�*T9�]0{���rcNI�b�HW%���z�4Bo��Pb6��m�����YM�R�rb,H7��iʬ�޼���4ZY�o�Lؕl�c(L�\�-0/Wt��$G0����F���Y��U��p?�HYD� Ǥ�\���F_L;���eɩa���H(C�J��Dz^S��/~��b>�>��p����R��R�X��(��k�Ȁ�P�ã�c�����j@ng��4xY0�l����n*�/���u�D��h���VK]�
�n�s
�V_ζζζ��g[mw��b���9�1j�g$����\{��Fp?PHcCL#��kP㝢�r�&���͉_	��[��%�����?@�P�/�6?�S���pӇ*�{w��.�$,r��0naL�w�;���ڏ��;��ݴ���O/?�Z�Bh��V��Ƽ���fS�x��|/�<�n9
c[�b���ɓc��2x��j�"M���>�ļv:�>:��e���_ ����d��c);�U�)�DQ�D��C�F%��B ;L�=D]���7ۢ�x��*ď>�N�^���[�˛`�|3U:/Y`���
u�Bg���r�L/�8�l�X�Jlw
���-�z�q0�1��nn� �ӡ.���m�VkӲ����f���o(�6�.u� ��pkq�kJՇ=���.�ɉ�:Vnf�����M�ߵ�8�m.�{���)+K�\%���,
�X:�0���s&��<,YX>H�r�t��k�_�U�4,Z}�	%����
�~�Rj��h������
�����ZI��H�U�Wy���⯚!�e��I�"%J<QH�|Z)U�Q�;�ZPW�E�J]�f��<Wq���+짻��eO�wI���/S�R��b��|>/7I�����6^R�i}D�	G^t�%���}^'�n&]�/���{|R
��S!�t}��^�޺������Y�fE�ij:�Se�yæ��%L�{�<��vi8��ˢ�S!�8�CES��<�Y
��w�w�^>����W����=��Et)&��[��"2G��+%���2.D��2��0�I�/�t��������L����8�0�/mT�
�Ƌ�������^#��|�����ǟ����FO>:W��Y�.h[ޯ�*V�ا����lۏ�j�H,P�5�;���'�� ��8W��.WUz�e^�w@Ul�g�9k�]�8y�H�N�=��"�!ٷ�����X��v�&+�`f�i�t�����0�	�̡�
4�q���'4�����E�$x�������M��/.Ě̏bT�V����3��>R��qW���o��$�ባl5��w�	;�Q)3X�CA�ȹ�{���{��;���b�c�>{�X~�#�V7y����R�,S?1mk�LQ=S��11�­C��z��W}Qѳ�rd"��`���/�p�_�T�,Q���IwY#�YZ%w�o�D_�b����"��]$���S��k&����B�L�ˇ@�?��o��˔��-:ľБ��“����e2T���>�m�{��7�Ͷ�R��U��D�<EY��h��ݼ'�fTL6�F{3�h?���tֻB�Ҵ%�f�f\�&��m(�����й�O�
�=P��ӯG�f���n�1�&����Eu�u4/)E5IJ�^Ǵ�����nYSD3�Ѓ�/Dj�������C�4�\�z����EAY�Ȼ�Β)f
!�}	#!&��1׬R�
W�㎝ʋ�f�N�k��|��1��UP�7��ȶ�N0�2��ҿz�wv��.�߶�w�Սz$4�^xy}4	u/7&ȑ'�y�{U�.����A�����F]ꪗ�W�D8�%9�Q5�^�)�КJ�=*�
=P�ߥ�7�҆6�\��_�����U�U�ɪ�=�j�jž�)���S�k�>e5�u���ey�Aڶ����6n7E���@
�*�Yr�O�,>P�$��Y�p��Dw7_�s��L�c��#&��޽�7��*�2�?����uǤ�sЮU����V�Vy�}��
43rUO���r�͛�ߣ$�^F��G��o�u�QdGƴ*��+y֟��#w��Qz��.>��'��aM�3�=�_�JEA��$5�a�YOt��S�´�:cl蔴�X��&��A,2�ph����t��Z�#oj(*�n��a���$Cr�
x�v8�NA�J��'D4
�Ӭ*�V.�<����^F�Y9���Ei~�al�fU�vt�p��|M**6*+r��2t��?�H�L
���X=+G�*k����]�@��8{!M�;��Lis/��Kӆ��$y�J�j�����{��A;�2%��I���E*1��-��hᷩϧ�9Ō1(%b��f�"��d�s�`g���z��4>��+�:PO�eK	ڇ��~�q��.�#&�m�-%O���}��a�?BCx��&�xO���=�t�#��=h	�W�6�)��j�w���
�������?�'1�3���+$��鶚%�Q�1���9�����<-ʪG�+�3M䑗��uOQ���Am��Gc!]v��>7C�̾�Y�aT�2"�����b��C��;BQ�E�?�o�$��h*�
qa0i"��g��xgBf׬
5@t��_
��G0n:0�v�1'WU��>%|��@�xĈ�b�\��|v���c�y~q�B]`��<���d��[G�vY]�\,k`�;e�#*�B�����d滜�c;Gv�h��,�i���!�I2S����ԑ1>@�P�k�*mLnc�9J;.nOw_�%{�?�-pў�2����|(�D8g�?(���y�2��X���K8q��D�U�M� ���)P�,�ҿOI�>�Q���0Uћ���ʪݼQP�)�s�I�M-ҷ	��K�zf$*2�'�)O]Im��uƥ�߬�YR,6�:s�f3��-��]�Q�|�5ȶ�lJ9g�E�F}�@����%2�P�&7��hp"]�X?>���K���@�s.�5߷5辩�na��8�p����c�8��U^�A��L��~�+ѓv�<}�ބ�mK�:���N��'�:�Qx�_����Q��@��f�`���_�l�T5�D"��SN�Z�g�i�:�|�W�T��0po��0�O9�j�q �z��lG 6�1\|�����ӱ	���!��\�_�,X�*;H��P�����X 
���l6���rq
�æf����<9-�S�;G�я��b�ӌ�A,}g���
�Q�ۅ[[��I��Xi�Xg&`WX_�[!�Ԇ���sQeLrvLL�0��q��#�I]��GeVO¬="�aY�Ú�@6Ly���؄��1�D;I$����r��Рh?3�Q��-���F1%uh�+�����N�BH}��z�RΨ��G��ќ�^���/�4�	H�%�XMHq��5�<f�hl)�~;��C������LCU�����d��Z\�
0Oh�s��Y�/�=���K!ұ��O�����=�)K������H���qezH�k���-P�����l�NP�zG��vP�9�M�jm���$Ia�\g�>���_�B<��B�?����-�)�I�������1(o�B'>�3E�x�}���~JQe�w4��Q� �E��5`s7�������qy����Y�[�k�=\ܶ5fMU�~������+b�hO%<�ZI[J�rU�7X�u$y�A���`y@T�����Tۤ3��@��4�>����{��tU�YoR
ҕ�X��t����b博�1J��� ̱��ԏ"����W��w��Yl�~���T�R��Y�(��+p�``�	��M)|I�9bg��R�P���o�c�J���l!��GWo����g����l��[�t��lV�6���S�СI��x����9��`�	(�Ϣ�J]a7]%�b���E����d����<{'����Hz�y�D�Ko�ɕF�\��z���,��Y:j���Sf���J`LZⰦ�Q�����RW%Æ0�PF��D�{�Ĵk��f|�U�xe|K{,NP$B�#B���I�/�-&�!=2�>�N"Ǐ2d��~����~x=~L=$KR����{d�R ��|�I����i�`@����k�w�e
,���̯��K�������]�O��P&q1��Y���KV3H�"�~㈻4r:�wuv��8`����gtS��i�*_��?t�+!�mp̊A]0�-9Q��M]֩+d�2/��^2�0���10�XfҧJ��aA`#>zp);���;|NF}�Cq����d ��p�Z�O�p�QoZ����Ɗ̵�L�qr��rs���Gv�2�+���QX� �r�s���n�kC�$���)Y��VJ
�1>-tk�XU��t$����23���}†{4т�PT%�=<\�o�l&��)S��"e��]|����T�qn���Q�p_��A�,i�Q�حhI2y���H%�t��H�9�&-��(���]�*��b�w�*�w)rm�lC��qK�0&F�փf"�&���_9��X	T*m]�'i��u�z��0�ؚ��V	#A�*��SCB�fϨ�1U& T#�P�b�e#>}z桖�;�mY��G�xz2(��Ϊj5%}���0�O�T�����62���
	l/��f�2��Z���S7�ת#7���m�����N��{�&�������3'��e�ι���e)�lod�����A��̳���-���K�fk�H�w�j���\��,X��)��^J�����=��au�$w"�e��8���c��If@k){Ě�-invv$1��!�9t4tH�ru+!+��̊���]�|����΁�B�" �r(�>�N �1*|X���~���mv`<��=������B�`��\�/i���o�8;�P�r<�%͕�~Kf�09�ژ�b�;3��
�^6�:'nOO�-ю	�x�y��az(x��M�藠�]Q�?�*��i��7V�6ա9gQҥ��]��|Po�1KQ��h�-��|��E��1[P���1n��!��u�#5�Q��9dǍ�	q��Q��#���,c���J������"���z
��i�do��>��w��aK(��n��Ȍ�r^T�V{i���7��!��e��F*�����E(��M+�����|G�$8^h�5���5���	*�#��i^8�˨�#�5G�έ��1�a��w�Q�]���m�ûmx�°�1��σ/ƃ/�7�2�p��;�A�x3�|gOi`�h��ck��u�(�&V@��p����	�n�g���o�#>ӱ���7W,?|�{7�H��5�G��E�GO�t���'�%��&z~f��h[��ֵS�g�nG�; �y�3t�6f��g�TX�v/��'��j�h���ԑ.}0��ક�/~m,$2լ��ڜ?�'�&����<�t��a����a�-�1����<��'qn��g{��}PA"E�$vO]PS#�?���j��g�sP�n*��!iY����8-~*]�W�\A��zֶ��Jj����Гfd ��Y�:'ggj��0�wS��#u�b�v����Y�V�X��:��p/8�_����v7�y�3�	����jۭ�nIFK��j�� �Vi�5[o�V���j�{(4k��~Eˈ�&q�Y�H���S���>�0�tIi��D �05H�}�`��i���!���9W�5x|짅6��Ip�S����T��c�V>�J��"N���3\[����=���C�=@O��ZT�2H�F�G�ڧj__��h��gp�Z�@3b�bg'+�I�nNS�R�����6h�A+1�9:�9z|x6 ?�S��`��i_�r=|�T�z-!P��7���NSBL����	X3�a=/�\��	�g
�jcqz�H��	NAc3���~�e�JC?��M*�e\�E֝Y��+R�1R<ٸm�O�][�#|`,�N�L��:v�Է1�o&��,�	�G�l�?����B(!���kƔs�5�l��)���nvy�1��W��tEǍ&~#�a��~�c�}�[�0�l�Kb�m�j9˧�w����]ɰ��ΆO�6|nC�
�ے�6��`��a�#O�osbo�mq�1U�6��[K���U�%S��H��~~A�y���15�?p�]�f{�˭m�vL���|[�[���w�'��u���d���iPnr�2-;��)#?9�݂�������:Sy�\�i�t�G�I-7�}^gʟN������C�:�?n�d�+͒d%*"Y�۪�l,q};b��(�z�`+�#��1jE�נV��@dHw��g�P����J.��W��V̇[���Wڠ�LbNF"�WE���yF*�n����
1\���f��~�w����v^�JH����
!j?H!�^ZiD�b�#�((-t�]	Q�Z�w����Z�S�j�]6X�1�W��c�q���^A���� q��3�?0�u;�����F��(D�dp��^~��9��v��Jv��f��^ˤM�@cn.��[J'y�$�b��c`��C'�|�����A_t�������a�:�C<�ԩ�1Ⴤ�g�x�G�\���kJ�]�X�Bp8�;��H����%��e<x~�<�p����s�ء���~
uTg��G@7R���H���̍Kf��q�~��EL_��m^4�F�R	s3~�-�]ܧ�����O^
-�r�;�ṯŚGf'*��O1��v�X���Z��l6^���/��#+��Fs%�G�>���z��3��2�'��D:3��"��Ja��{�f�v�:R[�u�:2���+��1ޟ�����Mt�ܹ���_d�]��-H�u0��@g��U�ש�y�)��7}b��.
ٚ�	�>	�P_�=�6�pM�|�xN/2����(S��[�Sӿ�ud`�2u�`�"8�X�Z�pZ�����m���L���0u�57	q�	Qc:�sCs����r�`I����9]�<�oH�����d���?R��w\������r��w�QK���:�@��$�4
�ai,���3W41?��ӷ�����b�P���0��q�)�!	�YVq�*�
"/�.0�%��
�<�AMFSL�
e�늦j�-�ЉI-M�)�&/cL���@�����7��kD�+��5�zq�i�}�5�ܳ�%H�_�0�yy���Fz��� ���E*��;\�Ӌ�!�͟��kF�5@�~��〩�׈#�<WA�XWWAS'gP�R������M���Y��>�	��Z��#w��:L)�n�s�	��t�Ԡ�Iؚd�a ѿ��{�T��F���n�;x޻�M�����v�{܅Tnϔ�1&���/�h���섹�/F�bA��_�0 >��J��9[+�B��j�QBǢ%yܮu���$�$�-y�ed�H�Ҵ�q�ؐ�k����PU{�!{��"����lVW�9��b8�C\,R-�?ֶ�}i��K8�sۖ[�
+�B�Π�s��am�o(8�P�i˄��e�;��ᾢ���gps֫1�;f[T��30잚�{�eM��rQ����j�Vl�Y�0�⏣�b��E�vb��z��d�r5�U�$�X��@�oӫ���p�zx)_�i٩��lr;���g�_f;�=�W\�\�g�Jf���;��z��E$Kn��J�:Z���s
�_����B�[�����a��M�H\oҵ�R�1�x
��8�-0��Ĭ��i[������  Qf�xH��: XzS	��`GW�&�+��������t�2
���)??�5.��HE&ٹH
&��6�
�"�I���n�crd�E���
_B.S�it'gc���H����R���C�c�m�R�։�(��}��~U�+1��S��
����
xgeZk���z�厴��R%��g��0�'�*9�{m�m��j���Gxa�а@���Y��b?����2����v��a��f,�_��7x�m�z3�EO�Czt/z���7�0r�y�ы^���2't:|X�dۼ��'O�
Dz}A���R�9��w�C&�vj�Gv^���W3Gyvq�Kֆ�7��Wglº�7Z��}��Cg�1�]��e��~�"�gj=�a�]Aw���JA�F��?����G�g���e�qY�x*�ebіa�A�̥���-G]��ScVf@�_��ed
�S]�f:I�Dcp#�+�k�_y�+�ܚe`q��Jv_Jht�>Y�ӷ�O��eL��ȯ�9s /�����
EB8��*�Ŕ�15(���%��wI�*��EvIMϭ�����$w�;���� PA����t.ٓ�#Y�M8!׫HSa�n��d��H�}Cs� (�Ju/R$Ʋc�6��P��z��Uw9�2��1�@�|:�`�€
`R��C{;_9hV����lz��Y[ݜ�Ƀ�Ĵ�}�đ
ģ9�n8��}����Ď����`�{��{~Ean0����9T>?Vҩ=6qS/�4��� �q�Ԧ]DUAW��X�
��E`g<I_@kx��]�cݰ��-�:G��O9ot�~�T�*%J�|s�%1�L�*���:#NX��7"<�Gq	�2-y�!�b�5_5f ���S2������a�%<��V��/.92��)�X~�Oz*�;cS��t��ɳ�!t�:�ك��I�Yf��zU��Κ�nN�N�Ku��+�SJ|�y�B�2<+R!��`�xy�.ch#�8#��O����@�T�ȝZ)
w
��֒M�%�=>��r���n�� �
b�l}��jpװ�]D�ߎ�Ʒ�j��m���qĭ^0j���dj���b%���A�|=D���A�|=�� z�QE��Pm�c5�緆:?��Ń|� _<��Ń|�ǔ/lO��ޘM-�ް=J�Z��t	����	�AQv�m� �Q�/�-@�r<�/��j�9_8�?�r�#N��/�11x�A�	i���yb���OEj֞x����5�b��ol�gog3��y�Ƌ���\�!H��hX��,5�N�.�#���#��`����r�)��kR�w��<�����ݽC��tt���c���J�nK
��ќ��z��*��m��N@����c�$��@P��K�$���}5X�n��n~?�~J�Y��1źLW��[����a���t:�u#9p��,��P:�g�!7W��\\��&Է@���U���5�,=	��]�����ڋ����-��R���Ծ��e����4)MGC�������*nn�4����R簸�NSTHMh��L�e�y�%�O-�Q��터zv��� E
ߗ��0��i�|�4i��d����3�:�9�����s��tc�y��8�.��Z,�v+퓻(_���QU���8��4�Vw��K��`�����0u�Q4�T	g��OH�l�Z�Hﻦ0��	�;���X�0^����=z�v��M%1�)
C��?��9�x�[�J?�� O�K��;{��0�bH���S��1�Ns���3�
M-�X%Z�A+}�l�ey/8G�s�KS��k9f<W*bt��ߥI�Jء{y�
o{ң"�M��&��#4��
���ͅ���:�*��=H} s#�VU��H���2�|E7~|��g�5ީw���Yn��Q+6G�
U�q�L�Wb�v)?�{�PL7�U�ZCx�/���K��eW?�mD,��ұAO$b�W9�	�K`X8�]ɸ�r�3
�*y�k��W&��*��꿦1�{�ۻO��u�4��ܷ}_�ym���ž�jw��ö�ږy��dD��R��&ЕT���z�A��'/��g�C�9������+�0|�0���)/Jf�*�L���R>B�nm{��l��Q�j��z����<��dͽ{8���ϫz��7g�\��\��p��[ٶ~o�V���wyj�9�A�	^�H]��P˃�ՕDjs������I�΄���PKk�mWB�q8u
� setuptools/_vendor/zipp.py�Y�۸���NXN��-0���I�P�Ţ4Xh(�s�Dzf�b�>D~��I���(Yv�A;h76yn<���в��^3ٮ��ԵJ>u\O�+e%��R�^�m����m�xҕ̆u�$�vV����A�J�M*��e`ѷ1���z��W�m
aU%r
Ŝ�۾�(��\�D���Vَ��Z�)��4�‡�{h^���B�,�x/�"��黺�2��E>��qc*{����DM�L	�q-
�
�wN���݋F�>�Z�T��dz��ѓ�a{����ґ�c�m��fcv?�3z�n��H��@J�e@K*bvIx�ϒ�(��B�fL�D�J�"Jy�����t�^�컶�!��O$<W�y$�!�P�s�H˲���yl��Q�e}٥D��D�8sg���좉�,��%niyS���^������%�K�%f�ˊMغJjk��B�N�"(߄
��f��D�L2����3X&��^6�����\J�,!��j�DS�L2��=>�r�o>qkERkZM_G��r��F6�V��e�m�rê��x��U����"%t���)!'4�4�;�Kyŕboں��oe�"���?dw�ggz��:�o�MڋFz�M+��)d��3�2�(t�#?�;���#�^��ׂ�l<���G���y-�-̊	�S�p�`bU�� =,8���{�D?�ռ��3+e�pe�CJԱ���de۳�Lw�#��˾(L'qT��3q���$�(��0J�:"M<���9�r�%�F����̙Z�;�΀�o�A�
�=e eH �{W�����	�	s��&��0LH�"S&$�.+*!���o�E�ޥ�#�ȣ� �ص��=خ�ʹ�:�ۮ��TB��}X�{�0j5�!mқ���|�?�(�(���Ϲv��,����Bd���w.oF�v]�v�$0͗��;q�+���*�';�d2��P�q婬e8���_��M�����	r��~�n��H�v�hJ��+�W����!rg��)�=��-�B[�ڣ�Q��m!���&dI���X&ך.�'��Pz�6Zp��Sxn8[XΥ^�TVL<��M�4�.X�;YT�_B*S�cw��'!NE�5ڀ�ş����$���tZ/ᢇ��_���/��������^8�-
��$���������Q��OK ���HSJp摁*���T�Lo��jط�&I�Q��ACxrW��2MKE�ԝK<��l���{F����L�ռq>x1n�6��D(asD��7�$Z+�|�b��@�C�!�zq}=V�y�|��/����1��'�v��$-F�|B?�)&��=a�|^pͩ�i�?�P�n�Ki�S��LFĀ^�q�%�=�r�ڜ������#ζ�y~��؊1e�	�c�Z�[��Hp��=�{3!�3�\�*�|FwG�Ạۘ���i��D�Jw���Q���C-���mG#�y
0M�Z	j]�����E�����g�ʚ��MA 2�B%�O=��	�����0���%�C��j�J:��X�%���|g�jq��J(�*��*���0?c[D��3�_6'�Y��$7(��*�ySZuΚ���A
����	�YU�� �^dNQK�F��Z7����i@��i�%
��}��=�ʯP��X�U���U��`a��j;��
�M:Q����vwG���o�wwv���s󠹼�ؠV�]��+�0��6���^�ˆ|�U��_-�W�ww�r
��x��K���:���[�j�
�-H�.���&Mi�@2_��ݬ�s�B��ٝ�m��?�̮s�/��#JS��w��zlܸ�]]����"2�
|l �<Fr߸�f�?
�5���T
�k�%
�����ر�;����L����c5c�҉\"/>�8�af��=�}�j/Loi_.h�3���C6�o�I�rT8��
�}y���nF�痧9Dxl�3:��fJɉ��1�@��ő����=�=z�����"�}|��3��L�d"n	�"�W�R�4��5o�����F�m��R$1�mP���x�xa�>=�}���1D��P�����u��驜\!��D4�n
�S���g�������L���o��uF��iF�
SKj)��7�)�Ԣ���Q�ԫ�B{6v��&���y�;�۰Gѥx�8O�GGx��p���
=nYL-ǘ��j3=�ozq�y+|EK�s�g�{7n�ɸv�9'̯�gv����_l��ĉ
u(K��X�S5v��"��B�P�
��:-�_�
j�zN�@�_��]�Թu�
�s��;Y8�'�l�5L����	Ðz���
ӫEs��*�sv�/[�����eU��3p�A�A�g73X�SïW۫͆0�y0\�FG��/�a+1��P�b�.��$�>�`�h
E�YQ�g_j�p�8?�rt$q���0|�-rs�LNx\�cB,}Û�6�� ww~���у�޻G\D'�ߧg籿���.��/8*�w�,p���TT���z���Y�.��&��Qs�n;{�y)��G}��F��P��[��.�g���(fVș�'�����+?m
��i��V`~4O����p�6�R����lZ�Og��|ꁡ�g����:՞{�x�|7�%��K�t��PKk�mW���s �u1setuptools/_vendor/importlib_metadata/__init__.py�=ks�Ƒ�+p�U���%Ǿϫ�JGKVIJ�f-��Y�� �V�_?��R�\S����������gX�ڦ���S�o�P���u�_�_�}g�5�(�"�귲m�g���J=��pY�k�ش�ˇ�Sσ�0\w�n{�wuY_hR�c����/�At΋���؋&��*�ʦ��H2����[@�/��N�����(�g����J<�|��'�fXD��3�vЭ�O�D��r��ge]�nA�e�yU�C�o��6�2�7�£��Pe�M���K����nj��5|^]��#��h���X�+��j�#Vm^�w��x��|���P�W�G��45N̝jӏmۉ^�=��>�?�]S���`2$�}b?�'	�	���@,��oA&ԧ��f�E���E�K����V�/w��Y���U��N���hѕ����S��x��^�l�g�XO���M�@��^��Ё4e=�w۲�a��r��*���Dz3�q™�3�æщBt'/h��w�	�8::z{)"�/�c�
�!�e��Ab�V@�j�����Ӊa��h{��XԨ���v�Gl��N|�xl;��^��_�.|�Ha�	Aށ��G͂7�ۢ�C�E=	}D�Ѭ��o��T�#*��g���D>|��>�Ђ��}։�H�����<kIf��~l��{�)4�e܋�x]��O_1�ZqQ7�(�Z��7��A聋	��A��[Ͽ�=+�>0fݐ���j�%	 q?�����G�ŧ37D����M��`zpkL�>�`��
��?=ӢI�H6j��
Q�,$ZҕSs�ޙ~�J��D"��H�8h�9�&��Y���M�t�HJƋ�V[W<6��8���0��,[u���H�q�͌T2Q�!M�֨��;�%���=/"���ʬ��Z��۸�D�G%����*5bX��r�
9�6��\�5iN$�"��.�f�VfTַU9P�$��I�-]�p��459	1u�ˇ�%4&�Wء�.��$>��(��_D]�g���ۏE���$>����e=
�þUatG��A��L&8�l�[N$>8��
͛\!��l6� ��#���N�ꚫ���
�h`�o6��װ΁�ZD���&o���s��-p�B���'�X����h�).G�p5��k���]3�˘�qP���
'��n����X'Q'�<����'9�fұ5��\�Y3b�
�l�ZP�-h;�\�g"�1�wb��&Z�I��#�L�H�?�;�
�z�'�Zڞw� e��ve`ZpR�;�����s��R��މ}��b3�zY�	�q�Վ��#� ���d��n���5W�>���7BD���h6}�8x�?��r���=
���C�t��Vl�m����Q�cn}��0���`=�9#��̥+ �0�(��P��5B������c����^gg_���wc�^  �,��(�C���_O����1��rrm
~�\�U�E��0�B�y�C���z�?�s�w,-ח%�]yq	��iށ=yvBSt�Ǽ��ovÇ'z�@��?��f��D��sѿ���/0�M��'9�a*!��K�Q��EUI��(���&؄R����q@��oQm�\z�b|"c�-��͵b.R� Sl����=	�P�D�u�n�v�V?Ky˺��Z����_���D6����V���r��M_Uk���?�k���2��
]��DϷ���\+O*����d"P��$Eڙ�2d�������7G��SDRh����xI���%
O�W��x'�O�AFLJb~[�
κ���-"����J�);=I��HT<��fG��bK��^��t.��{s��l���=�1��tˌ����V*��籋��:^��p�z*��L��M��ڈK�
���Σ�<I>�"�fl[�4���N�{\B�����ـv6[k�6NFXk�`��=V�L6D�cutӏ\�
��6����T%@�"�M�GӖ�l˂�i�M���4ݽ�R��-�*UVj'!	.�4	��C�m}�J0�Q�L���{<t�2;҃�U8��'��~'���2+D��s�q�$m<���Y.g���кe���G�Ժ��;ۅf#�+y�ۍ���#�+��u�4oc?�0I���>�E�a8��=$�z~4SPilɳE�e�_�R�����
�IeL�����@g�Q����[44�1Y�7
ݴ���tE �]^_���Ԇ�0L'f�M��-D�g^�
A�=��:N�'6���E�}������y�6mr|�_��E�k�Dr������3�Mt�=�8w�"�n}�A$�/�C YY��z%�,�o��
�����Y�Oo;�O00��I�07F���j������.�oO��|�8�I6j�B��|1��2]�8���=(T��f��þ�GN)��
biE�����2�I�{!�B����z�a��5��%M|�&S^��^(��j6y��r6,��u��WPL6�� )���wV�H*fĚAA�Ry��yQ@Cփ�7��pj�L�Yj6���4 <=�A��1Ă�.��j�Yhl�f +2�@��9�Mn����4O�$Ce&iR���M���_gjk]1[���~x��5;��؄�S�	���-�a7�'1PLh�_�ׇ����3b�+���J�O��yؓ��B_w^?���h�AD�1YD�s�2j�1�5h��)�쩠I�0��PK�E"��ĕ�$�Ծ������9n��<���U��
d
��Hܳ.��;�� ��L� 9��Ey%�{/��"Jpcl*DY��a��8MDXX�$[l�-yZ�K�^�f*&�C��v��I�k��ڤF�d�b��L=ج8H�G �v9\�?�G���]�<�������^�e	��F���(f��:?��쥛mt IJ�3l�I�!�)�B[����$1 �����	��w�>�wKn��7B~d�w3;[h�v�z�x�C9-p7K�:�E��I��.B��@%����t=�P�#����J}\���D�K���O$�MY�炲#�vaU�q�'H�6ۦY�뼳c�"��x�[��$���4�&���†��Ǡ��۽6��1��wZ�0�SV�B"P9�I�����&
O	����o��Kſe#�}ˮ�H�]e�1��.)�8��h�M/��A�ޜ^�������s�4_�z���P[h�Z��A���<R������ʕ̀!pi��~,��:zPIX�`!��"_���u�lG�GtR��u�U	���U��C+�h�yZ�W��-u-+mˁ8�����O��h�0���-p��
���G����Ʈ��ij��ͬ�2�OϿ׉��Q�SP��f�*��<춘TzΙ
�Y��J�v0®��u�R�l1�M��7f{��g�KБ��{Uˌ9�C��4'…�)7�Kѭ�\ &������!��:0�Q7�F1��2۝į1���X��:��8��d�Ze�vQ&z*9Ս���j�۩=�Z+��xTЮ)`�Z��=�sl��}�X��V'���%�
p�g���L�O\Q�z��z7٧��:����&MEL̸c,NP)n�����2'7�^K*WX��=�|������+���#�r�k
X]W���8@�s��F/���Ul�%��+Nd	1���W.��>=���lUXb'Kl��j]RaV�|���5��!P�g�"r�sz�#Xv-�t�X@WD#����?'ct��XShO�0��fK��:g
kt��=ar{�1@�{am��#����K͂m��D#��M�n�GGբ_>0�F����1���"@5䴖O'�
�m	�Z#t҃��s���H!�Ȼ�%v039O�I��[�`q�fa��6�dRŇcGd�=�vo�H

8��q)�*�'v'��J�&�q%Y�G
7��`ԑ<�uq�����E콧�2H�'8��|f�ίMp��nJ���&�O�eh�xZ�*�7Q�$���0��&(��-,��
���6?onn]!R��T��:Ub��+�<:?��~��#�ԇ��^��A�#���ƨ���Bc�ձ![I������g
{�*��Z<����DOR"�����X��}1P
0�&���;�5rk^��C��Q�F��8 �f�˓�Þ��]H�]��WG��`�-�����I�Ě�7mH��f_�DQ_�x���TpH 7�4gV���]�1�Vy�7�[8��
�H�aEK�=;}f�U0Y�S��O�|�Յ~�E��3�o�}�����c�SΧȘ/��s*w�����;f7�(ө�_Rެ=��������e�̯%I8M@+5Yve3�Ѻ�b0�H��q���������/�SY�����pI���x��ѓGoy#���??���+(���L��S��r1ƖO�VE$..��$G���<z��n�M��s�qc���6{U��?�:�����VI��+cm2�HW2Gc
F����0�
'�ɤ>ٛ�}r��)dgz��?w��V]��_�Q	_$�_6p�֧��l6Sc�}U�&���P�g@#yT��|n"`� �B��tSS%8�!��&�]�E���β����vy���K��-�=He2j�{үS0b���$��g�G�r'��9����^sn����9:0j51�&Y?Q�'���3�GRf"�^?}���'l�KV\xx���^?~��[qR�S��Β��3�.,�����4��{�O0�O�z���'g�Jp��Q2���o	�!K'15ݤc���J8$��"���|�����,n=$�j���Q��t�d��C~47y���8�
�.��d��=�2�:ϭ�@�����zA�JF�jKn��v�'�`�Y��c��3,��Ve_ɹE<YN��>9��W��P9��;|�Hn�D�����!���[�D�(vk"�:z?6�\x33H��#E��>~:�3>�:�:g��E�$j�4��R�6Eأs����3�c�_᷉��l�_�!>�<��̪��]�&��M;&�kɋcO<A��o�5c��9TO��R����v�&M����\[�@��J
���`pG��_���.K��N�B,�(�*����t\���0�|��u3��V�)Y:��R��k�6�X�w܀-�T���ʮ���<���E3���la���5�^`W��FU$zć�J�@�-{�����ѝ�ET�UqLD��D%���JI��[�D���������Ch�<E���dE��$;��mE�2
�@�@�f$L��@Wܴ�C�o!xI]K,)ȣ�d�M�?����.N��Ŋy��iRqʅ�K���80�
X�������l=��ƘZN3��6N>�'�h�h� 9'd?U��3��O�R�"^������/�	�qb:Je�L�KN��x�*���E�����W�����?��s?t�t-�k!�Ԉ^��3�nP������D+e���������U���,U{��*�(3��fA��F	��E�򨼛+�}�ďƾ���^��4���AF�uX�U��4�ld�^�4��p?G��Uy[�����^,�9V^�+�`d�3l�:�M�ZGs�M>�%����5I9��&�3�{����j��t]s���x�ͮ�;$�c�z�Q;�]�)�Nra@ojpuKZ�.i-��^#H��79����V!��r@�k��[t��K���qx�}����P2�(i�3��#��v�1�:�H�τ�f����q����U�1�{r>7��-U����3i��
��v(F�A�f�9�g��������or�ۨ�ڋ�N�qNܔ�Q!ɱ�K9҄���Y1G���1m�����Oi-6S9'6��¢\�;�ӄ��X���T;&�3�Z��W���|��;�e����J�:�/�Ss�A�]7�0���t�Ыr�����E��������%��!R�l�/˪�DmU+ܘ���DU�fY{WY�hjZ�n�k
!d'c]��5�*�]�*�M=�u�7me�Pp`��+��>����hu^�8{?�7�4{��A�:��)��������:h�"�3�<���Hh~+ە7}�������,�
P�#�U=<}&g���ԝ5v�n����N��JV"T��W�f��O�-�]#��D�s�!\�l3o�[��I��lz0sN����7�m�SQ��b0<���@�/#][m* M��f�.�	�Ƴ`*����_Ζ��2vmޣ�а���v7�l�0�k�r�ɪ�\��'sS�Qo�<)�T�\�*W>/����]�lTɝ9t��;���k3�N�-"?��4�*�tH���8���%�^�*�׏%C4Հc�!�	N��!U9�u��cE�G��f���B-CLӄ�;c���:�X�q/J;�uD�|�|�5g/�#q���V�"��W�Q�
��t��$l!��m*�7����t��R���<[�d��3_��7c�i}�t��{����������l�΄��.�Ih��U;-)��kE�pj��bI��k���y��#�:���m�Ε�(}Q�d��TsZI�l��$�o<�.@x�>��h8���Է8��j�X:�)<�,F����ۯ�Y?�����x��}�V��H�V���5>�{W�1�G�K�[e!���YV���F�T���9�-�8^��aP��
ce�[��q��T0�QƽR�T��IQ%֝큈�>�P�����~���wMm��!����^=\�e���*	����J��-�����8���A�P�*�9呕�!�oܻMP}�2�C��cl
+����QQJ+դShd7�5�Qٕ�VF��t�'G�jhT0���F��>���� s$����_��`�7��T�<���Nͥ�=P�c�����=e����j��3�_�*;r_��"'��!WT��d-˚
eM��)
�����p��*}��+��b$�\�?��������ޜ�C��i�`�L�}˳.n4�LV�8�����GOe�����-�;�������2#n�!у���'�͘G$�h6t����0�Ov8F3%E��{�,}Q�qk̟:�d���!�=�؅�Ivvz-�S��觵�ֆ��ݟ�zy� zz3(CPU�)v	���BT��c��R�M�@�{4�E��Q��;�}]�����(�M<�ތ���zR�
x��J�!�
��i�����1D���RX*�d
�TZ��
y/� ��L���4T��r~�	]��	
��2��G��Q�);L�o�H2]�Yڴc�;�M��B�L�u|�q�<4�Ui]�v�)����J|K4&��$M�~jI��#N͕�s��kR���$�T��-�G�[˳)�~N��'��6��[�����*�#3���>��,L&���t���QqB��M�Ve�br�L�_�=96��T1�p���Os���n�Bs��^�d�0|p�̲6�L����*�-�syP>M%E�FՑW|��q�XWBޞ^+#�"���@t�+{���9u��N��9=?��6�l�>M)���R�@�܂ 3�]��܍;I�ωvn�8��KW�;\�$_�\r>��e.�=�k�Ɖ��5:��Vt,V2���w=��ED�;�?����~���3n/��~���@S��%�ꗪ�&-��y��-)x�H�s(�ՇW�"����������On���Y0Kt���п�8�9��.�ְ�{B&R��.�|m��%�Wc�,�U������N{��';;�a���'�i��*���RԒG�C�_��H�k��s��6�H�pX�m]��`i�FV����a�Ɓ�bL�`��Y�
���b���մ�{$����%�/��طRG:�{c}��Et���X4���z늬��-u����+�1KՉݚ;���u+.�w��DwhP�C�,2�=�ভ��&�F�y�h������@2�6��J@�Ov��H8q�6cL����{�Ow�PKk�mW�m��F2setuptools/_vendor/importlib_metadata/_adapters.py}UMo�0��W�Av�C�E����k�b�40T�I�Ȗ&�M��G�v�|,:$���L�(�2�D���ӭ
��.dR��|���¨�ԣ�A�+�c>�̽LrkᡆG{�Is��VQI'�Ĵ���pca]���n���Eý����/6�a��@Æ���W�$:��[a�)�Tr�P�8i3�37����?����nw���S�'�[	s�b 
4%��@ϕ��`>:�����L��6��~��~����roܑHxEe.2N���
N����n
߮��-Ex�qiZ�:M�L�!(#�7p�e���}�TD�I� �B>�����9�O�W���u��pDgQ.�0�fIq
�����I��<GS����\��8�k�/>XM�`ue��,�1�@��b�7�H�&���C���X܉���b0��Q5dխhPe����jx��\_^zM	ΝPe,P*��T�R�p"���͚��w���:I^�Ȁ���vi��kW�YD��p?�8$���BHm9f�-�Ϸ��N����x�}�p��̣�ݢ͌о,lX{.ѵ�Q|�c
E��wm��v��[U���_U~�Ly��Yx@ǩ�98~<?�e�Ф�+M�s�}��_˾�t�ֻ���F]��.S.e���ѿ/q�_�(-ی�����10�L����M�n���R�Ȱ{��mWt�nE@�L�Z�)���<È�ȁ�,>�x���w�]h.�ߠmq���
�ܼ�PKk�mW�����5setuptools/_vendor/importlib_metadata/_collections.pym�MK�0��C=4�%�x\<�W��R�f��y�$L��~z���
�&3���Kb�X��Q/6�TU�F���}�\��w�<0�'�8��''����j��M��7�U���<X��P�\0 "�y9��`A� ����	��b��|���;HSZ�Җ|������٠�Y}8����=g�����Qc��j��֣�O�z�O�dzёW�,��yF�&w]7ڔr�]��a��cfYL2��W�M	���˗�I�)C�Ī�N�
�;�Zg	݀�Q��<����fq�W�
�K��f�>�'���x����8sYM�����v�z7��$�`��E�D�wiB����R�#F�o^���E�StVT}[�`߶m�PKk�mW{D$0setuptools/_vendor/importlib_metadata/_compat.pyuUK��6��W�K[G@�C��m��,�CE!���͚"Y�r�����C^�0`���}����*?:�qk��X,��n[x��Vʄ�VkX}���LO>�{�6���������l� NN���'����E�(�xo��8���X��%N��H-��d��&�M؈@��Xz�BA]u:��r����4�=u�c����#g��*�@[�q�,����=���@�]���fL^Y�v�hz��ip1$�^�h�`��M� Vq���{�6�2U3#5�Α����徤ls�6g��8zl]����\�?Ց�r8��&�CH)S$H�6�O�gA�l&�9��ͺ}��P�/헢�W"�{�Z�\fI��v4��y��Q*_ܫ�@p�Yh�Ge�D˪0�!��Pe���,;V5F_�ϥ9Řg�mۏ�U���:�������is�&5S'{�J�{�0=�3�Vu�X�nQ��4ǩ
���꛱�LUf�K��e6n�N�2��?�2/����g��*�5ˏ)�4U9�ֹcd�'��7�M�~幌�cf{۟k&�����G�c�������e��&rx
<O���t�:�@N��wT�B'/Xn�i3����i-\��ƀ;*N*m���m�Ή�J��ȵ��<�8~�͍��`d�(�TC
���%����`��ْ7�娾0.��l��Y����\=�6�s"ա�8���węF�nrC�Q����o6�S�������U�e��[F'�F��<=Oe|������{���|�Ц���6k�(�&P�,dQTy<S��d���)��PKk�mW�:oikO3setuptools/_vendor/importlib_metadata/_functools.py�VMo�8��W�!�l�v��(����6s����6S�c[^In���KR�G�l1=4�(��|$%]��z���L�ŮkroL�f��%쬩�EY��t��:]�
�A��4�6Wy�IX,AV۽Um�v��4����]\\���$��vA�׵��ycu�����P^�nd�d/�{Z9��]:s�3�	�wA�Եi�%ȅ~�a_�E�|���ҹ���zE�3]S�u���j-��h���2|Q4�d{��󄯪H����
{W^,�.s�O�
�� ��s�CF�4���`���q����A��-�UU]��@"i�������CA}D�Rě,��4�\��� �f˪����7H,r���ajS���6 �F���
{TM�RJ!�R�j��D@�D(�OlV�g<ovcy�)<���X�-��]"ik(�%8��8*a1Ӌ���P�T�+���+����RT|
}��:�X`�TU�F��L�`���ꤐ����I��|�3��&�_߾�:��E�t_�P���H}����ڗ��4��t *Y<=-�T4{�Ul����?!):oƔ_�Q�|X	;t$;��<��\�|~�P�IMD|ib9K��]VNO�wU��HBJ嚹�#�G��t2�%4����Pe=�0k�VGn�����~�A�m�\�kup�_�܌�#��O&}��P2T�a�v��j�C�&�H�Cu^S7��0�`�Y*qNG����1C�纼����~vS}QGj���	��Z5^�k�7$G"�i�T�Ȣ���M�)MM����N�ֹ��k�G�n���Y�U���Įd+��U_����
��U#���šBV�$�(4/T/��z�s0�r���@i?]���m7��WI<�O�>;���s�_q���%h?���%M��R9�g(��2C�l�
�ds6�1�~�����j1h���I�����R�bwm�
��v�<59jŻ�D��MNH�%|�/��pҳ��������G�E���~��Xh�{�T����L���gZK��mH?aٹ���e$�r߅ų\��*��o��o�
�rKO6��x�vt%ۋ3��9���;#���|<��ˡ�̻��U�ލ�p��j�N����Y&�PKk�mW�:���3setuptools/_vendor/importlib_metadata/_itertools.py�UMo�@��+F������Ȓ-�I���js�"����X��������,�1Nd��y���%ӪiQ[�r�����ɜe"7�y^�lK�{�1>�6�e�)b�c�XϿ�ÙtM>Kc�p�,����hP?��'(����7Z*֨A�y\��t��Ύ*��t-�˛�[w�C��X�5,�nO&QBr}�G`���j��8�CaN7���X��{H��{.3n��i��L���P���q�J+di�8�N�p0,�H�j-1O�"n	�$���a�Gj����A�\:s9L=`����3HT%1���V(���nW�+�.��Dm�l�ֿ"X���+��g�h��f��]�x�۰��F��%��uKr(���.�0��ד^,@�Fp��>�k9y9!��~��
ꐔ���c.�I��)x8\�8��S!�Z�eW��RXT�Xe�8'���;��h��6�������)X|�<�Է��	FZI9�'4��ϔ��-���қ̉C�1<&����F&�L�Y+��7���a5b���zK��N���5�54��/�\�}cK|��9�ccp�AHeb}ãm-j�-�Ñc��ȽFa2m}�l�{�v��w��Z�;��'%S�L��9l�	9;�9��j7��}��F����Ig.�:�����~F�_5_��ӽ���K��+���}��pp�\�u��:l���(6J�xN��pO���V�u�PKk�mW���.��.setuptools/_vendor/importlib_metadata/_meta.py��ˎ�0E��
�]L8��-`6-�:i7A`�6�hF]�N뿯�<g���K�uxI^w�
�UæGezvK��
묋Q{e���ŽܫF
� �P��I��_�=����n�,˪�=�N�j�O�a��{Xb�[�L�-
NN)����RU��V�ē�0{��!��,�@�pkp���=���z�VPYd���������M�-I$�qO4^h�},��uq�f�hs)��P�$����:T���9�)NJ�F���Z�In��ʖ�y��dp����ƍB�~)�B�ޫZ�`-j��kc_�gȴy�;���x����^=�N��2	�ټ�r�~���t�p�#0G{��s��C���%��N`�U5���$��촪�x��5�#ă��שz�PA�=�?U������."�n��j����?�ztd�1����~_���PKk�mWx�v.setuptools/_vendor/importlib_metadata/_text.py�UQO�0~�8�C��&m{ak7����Iӄ��M����vh�sv����N���w�?��xU+mA�h�Ԫ�4[62�J	��UhKUd9�K��w�c��*����>�8�3Ε(�������d���{
9�K��p�ȉ�[�`�%{Dw�� ����P\�X[�UU3M��0�%�AI��Lsf����ϔ�|�l6Ӑ[T�
VJ�"J:nS�.��7z�/��Ωcwf����9&�J�,pG?����L-���n<�h��_:�鮰�+Vǻ�N(����թ`�.�[��e�<��v���Fl��Ik�9RTԦ��n����.�^1]Z��S�����w
�r��G��@�"�����r���	,�&^0�@@�J�^H�h�lIuE�N��eP
��l^�0~���cݖ�_����
0B�>}]���@-�0�>��Umek�q(��\/�^&="g$�T��r8c�M�ҞjԾ�ȫs��/��N���=;�I� �;��#�#�ݽhwF���.!˄ͲؠXN�J�=�4�FKp�T��8�ϭ���mH��H��&$j9{�$�	��T�L������+i���rij��H;�b���a��wE��ـ�52��;}��{E-\�����w
����D��*�Ur&4}���)��_;#s˻=ɰ�=!�ú���4��׹�&�7 [;M6HnmQO#�~_��ߘ��k�$�M����\`LK49�i�o���_&}Z��4̺͓�^PKk�mWoq����2setuptools/_vendor/importlib_resources/__init__.py]�A�0E�=Ť41�;��4C�Z�֨��RAV�_��/�,	k���k
���h,��2�3F�l�,���n���n�3��G8�>�1=�f����k���q��Ԣ�����d�br#YU������܁�F�wܜ��	�Ce0b��T�|]+���iꅼB)�{����^,y��Z���`��Òò��b�ٝѦ�J���<o�ڡ�]|PKk�mW���'t�3setuptools/_vendor/importlib_resources/_adapters.py�XQ��6~ϯ�����k�+;��p�b{C��ZG2$%w�a�}�d˒�Ks�~Hb��H��(3�V�S�ƒmĖ�C��e�ض�YԴ.T�������mz�W�~�ow��b�pc��-�~U�����v��Z.���=d��|���3(άb�=�{`G��ͣ�w�q8Ep?*�YY
)lYf�z�@���m��÷��8���.R+�鍓H�8.u���;��Z���{ԒuRY��	�X}���m���ށ�Z�����$*�E�,^��p��p�Y?��kuh�[��x#0��󢔸v��������(�fU�f�Wkv�����/��3%j'�6�R�I�v�c �M���B��{��0����~�Z�,H.��oD�N$�V����+�<�����3��Q�ղ��>p���wh��igj�!���0����R�W��e}ژO�Ӎ
�#�#C��]��Q�����}�D/���
�w�.eV@�M�96��E��F߷�9%xh��:��u�ۋ�� ��Z�y�!x���P������]bJ`�+�y0�Ƣ��& �@T`�ey�xjm�8���"�2�\cw��|@%C+L�����b��|�qSR��m��7%T�@a;����]G�`�ǹzN<g��A�{.]x<���ψjP~F2a���ɾ�3���PI�1A8���k�p��$�zxv�$�|�5F�b�M����<��G�*F�l��!<�p�}�>6��>c�S��y�O%Hק9:�1��I�$o(���W��yO{z�9x���/J����r�0C�`�\����s���k�k���3�N��b!����uE�-�vi��
�'Zg?�73
{�F���'��΍ŷ'�����x2Vw~n��U>�W��a���ڗ>�."�հ��������O;�d�V��C���W(!b!�z_��7��[v(Ѹ��,�~����x&��x&0�Y<5�P�7��<#7b��v����������Ò7�1H8��^6j�=7n4�ʕ_�8a��ܸK7_w�K����0^2=a�f��%�������c!O��뤅D=�z�CkN�"��|nH��/��q��Mt�����{T���\�����PKk�mW0Q}��
1setuptools/_vendor/importlib_resources/_common.py�V͎�6��)��al`��Emr�6Xl�C�MϨcK�$��軗ԏf�
�e��ȏI�a�Ɓ���Q�c/���p;�c��&�8��Y����[�\F��ËO����:�m�CI�����-� R��I�h�d|FѢ�Ë�h��ɣ(]5z ���و��#6Y�I4'q@x�|񎕿�v���{��|Ͳ��8H��A�x�=�|,�!��
��,�����сX���΃wT@4��2�&��D���y�*��|��҂Q�/����'��l���q�98厘|�Y�5��@:�W�)7�g�F����b� �����4GlNpD�Pc#H�8
�� �tMU%
/^Uy��>�Y(g�ihG��D�vdV�t�a�Ol���E���S�+���hAiv�6�잓:��sX����_�Ѧx9-�@~�1���aR#�e�YZU��Gίp��|V�����������	��M���-J��5V���5#���Jw����+�����|�X���Je� \����R�+�R�U5x��ê.�k�{�#�.�
�h���"`��R"��B��<V�o
�Z�HY,"�&c2m����Q�q�<��2<w�<	%K0_Y�9V�n{a�0��:S7�v�+~0�ܸ�+�t	7��n_[��zʶCF@;��!:�WT�X=K�8�Y�My�W.�efS��e��q9E�o��bn�`�S�ɷ��nfݓ��Ǎ"	�Oto��Lba.h%�AOV|kG�c��e�Ԕ“�v���B���^Sy�%�~���Y��>K�곍�F��|	\��8W<�	����dy�ǘ�+�E~-�|�my6�a�-��b�$
��V��A:�d�}ԟ�.�6�����'߃ލ�{�4��V��P��9��}Гj}Ul-�4���_P�	��5GOa+O
��>z�߫���Qh|�Fc��ҡ�pE�!�‰�(��A��u7�ڲ�����s�CyP�1<H���k��o�=~�*4<�k<�WI��忶÷�d�PKk�mW�k�hw�
1setuptools/_vendor/importlib_resources/_compat.py�VMo�0��W͡.��zقuXVl����n�]Ŧ!��Ir��׏�l�v�/`�đ��G��r�7�~��ãHlK�-�e�<��iKn�R,�\�-����`�?4'���h��Ό�P��D��O�_L��۳Y�<�_Q�Bb�� �
���	�}�3�Bi�P�X3F��K����}ǚ^�b�X몰b�I��t×���C����W���E-��<N�9��@�4�J@����ʪT��q����E6�r5��Trc�NswE��
U���3��NNN��<��I�7��R���px���k��6U[��X
)입��4���r-�r�a��kU����k)P�=� ��k�d�Dka��%K�;J��Ѵ���(�M�ؠ̧`JLk]��6�ۣ$��`���.Q�}��
�#tl�m!��b%����D����R�(�;HA�@�I3����Ǩ=�#�Zh��u/�$�
���j��,z��v���2���47��<��gJ�	�u������o]��ZnUVIL�)]'R��!U�!Y��B:����u��F���9�?�'�!y>�>aS�Ps^s�)�8�L��5asz��µ*p�ǽ�M�����[4���N�`���Iu:�H�Zw_�"d� �5��Z�&d+W�Ѱp�¤n<��0�?�&q=���5����?N��Bs����T�wѭ�W�J%xi�u��q-���!�}؞��'�s)�<��]Ϗߘ��^�AC����ьi'��%GЌQ mDN�����{S6|���f<^QO��J�	���o�@�?�-ͼ&���(�CN�Qy[�ġqIZ;�o	��+3>�� ?|V�"�Y���X=q{� �x������ϡ�����@�x���d�%�s�L��{�PKk�mW��h�t4setuptools/_vendor/importlib_resources/_itertools.pyuRMk�0��W����������[�K)�m�a�ؙ�v��Ov��YW_b�IO�ɩ��Az���@֍�*�(U	吱*�������StB)�S���:�D��.zm�4Z�.zG�]Vm��\��T����I@�2�E8	+3�XI-�c|=A��U�1��֔b�z���9��:Dݩ�g�Š|�W����M�qӁ|��Ґ��ep�8�py�瑀
k����XthOa�Ɩh��FP�C4b(� ���]��\�Oft��b��߄����a˛M԰�-���Se��^���"��&��,;�i6qQ�1I:��-�
���z�e�S���/��4�s�7����,�/����̔��V�*�!A��)ax�Ɂ���'s�Ml�[�#���
�PKk�mW�.1���
1setuptools/_vendor/importlib_resources/_legacy.py�VK��6��WL����,=\$mz�C� ݴ�E`��hͮD
$�^7��I���C��-q�y|��pd�i��U�nl"Â�:ᶍ��n��(�	��z�IRݲ�� 
?)�U���4�ïZ9|v�hr�E*a����pG��F�bв*u�j�$D�H�`�{G�w������3���huoJ�G�I�TXC���R8�R�4[$@��1�bgDg�̋��uh�al77�;~����/�%���'_X[�Z)��j��=r��O��
�4��CA����X��a�\g�y���131L[:�X��R�i���7dкyo��b���U+�p�9c�g
>�r�6%Z���d��$?Q�6F@;�
��ʭ�,5����ǃ$���(O�\��hG?�OiӊF��+fc�?1
�<!�u2����C�L��@x�f�lo<IgD�~�%����$l�0>Q
%1WP���� ��!�|.��B#���.$���{�A�r��ڡm�
�5ҥ�Ѱ_��ȁ���)�3F���~�?����A�fO��`+����8a���P���P�6�L�m_�����E�30��b�c0<�5�\������V��̈�1^q1`�Nc[(B	E�2��SeP�eK�fC�_F�v_�fO�u&��a�P��&8������n�F���͟��Q����`�'���g?M��ifGWH�H�	��e�g/�{�ǂ��i>�^��2�%�k}�&�?��u�f�BB1v�s�BO�6r�7ȷA�p��Ss+����,�B9YRg������ګ�T+��4;mp;I���l�8g���C�}��C5]ԧ�h3�y
�  ��(g�H��h�ޅuT��h�׎���@4͸�/n]�?:,e-Kڳϡ��*]	q����i++4���a���Ү��4[S����G@���:��-��|
��p����iZ"���>������(��T0NL�}���c�/�$��͑�1w�G�{�{�g�K�E*ޞB
7���g��c�Y'`�'�P�C;p��o,3#@�\t	U�l����0��u��_p�fo�޾��x�O��8��P	oB�P�m�>�~�����3#�g"ە^r{�a�Ҕ�P(\�4^=K�9x�[o���Ox�vOcn��y��k�w�j�����9�
B�Q������c6ȍ�︌����x�yԩ�'[2NQ��䠴3R��3��y���!"{^~�%�PKk�mW}>m.-setuptools/_vendor/importlib_resources/abc.py�W͎�6��)����,�E6A��$X��p(q�bV"U�ڬ޾3�(Ӷ�?m�S}�ei��7�#�v�8Ƌ2��n�:����I�Ͱ��f�
��]��]�ێ�(nz�d����>H6��R7Y��
��݂ս)���l�q��)�7���7VW�����Ma��c��B�
k4���i�� 03�d��;b�#L��ޒ
>"��Z_@�tj!��j=!^y�W�ͯ�C���-��(ƕG�f�l�M#��� }�\���^�M��"*[0n�z�2x��82�@�B�@�f`�ka���OP���:�Eɕ��=@�Bf��G�>пߌAZ��piA�M�/HE4��p������R֡yLW�yٴ]d��V#OJ��!ą�%FS9ޠ��џ	�t��a�I�:+�jG0��(�)�2|>��v���D���$ B>.v@W��P(xt�b,e%1���$��,Jx���\wM'n�?5(5�=��$)
����ؚ�=!T�-���5�D�}�	i0
���#��|\�����0(g�uޢ��D���4=9�`h����b_;�C���/▽=���������,�8�O�{�b��.��8��‚#F�h��3b���c�<e���46ܬ���t������݂X��W���CB#R�F+������Eq�+�)p�SD�$˸e����<�������@�ڽ�}z���ꈞÚ�T�i�]�
^K�p^�uR/^I����9[����5�j8��3�)�jx��oZ�d���l�ٸ�Z�)�şN���!M!v���8Δ �=A�˖��X�\/�b�.q$c����NWgȒ<k�@+c8Ш�htjLi6�y����M��IMK��� ����X%��K
jj\��5�O谼b� �A4G�����K�:Y�	�W���i�m>}1���h'8�)��(�ɫ4����B��E�o�$O��oI{�=������d��(cs������a��o!G�d뗧�{�YJ2�O����A�s{�,$܈���G�L�2�t4x�G�7 ��!���S/3���F�վV&�d�=����j���{�=�r�R�^6��2�=\iNЖ8���g9��Ŷ2)��|��PKk�mW�D���
1setuptools/_vendor/importlib_resources/readers.py�VKo�6��W�AR��\ @lSE��b�C��BK���TIʉv���R�h�.}�j�E�{�����q��RB�Vv#�Q��A�}|�=��lZ�;V����xT	�i-m|9(���X�jݡ�(��B_�ͦ�����f襨�����_n~��(F��$��GӀ�敨]IN�a���%���	o��d�Q�o
����N�L
�
RUB	WU���Ԥ8���T$vkURy��
�6��f�j&O��Ldz�v���	9��3`v����ɜf���(~�YB^�2_��wB�1�P+��8+պ˳ާ�[g�9����C/�)H녓���hbn
v��d�:�2-_��?�;�愷��V8Apɳ2+V}4ЊG���ϥ�^���ݻlDz�Y�^�/���7�Aa12,��RU,���;3.i����(O��fx��w�{�1F�-�Lra�O�k�n�/�� �}g���®��^L~�����}�~=��D���p;eB(tf�D�t�V�ã@t�@?v��à�am}�Ċ�>�5؂Nt��cpӡ��&>
�E�i�w)r��a�N���*+TO��}��N�#�2ݲD��{$8�#���QY8�h�6	"�I��A(����xm4�¥�6J���v�Th�K(�=	��=�C�QX�G��Q�A�8���4	�j9�qi8�|ׄ�y�Ҍ`��yʝ�3��KwE�Hq��Shc^�A٪���]��Ғ��@+�p�>iB&���b�X	o��9���,-Tmqn��ׯ��Vi�6�Vr$��iY3I#n�tT�~d�n,I�Wȅ�����d�x6\����"Rq�^ǫBɝ�a�e�h�tM�:j����݅ʷ�G�|B:
��fk�]� Q����_�������-�Z*���
�6��,��#��m�A��r���
�2/C��cf�\z�t�wy��)E �2���`�T$	�D��A�5B�<��h���0Ԏ^>����e���hB�<�e�!��hW4�XU�X�ӭ�������8;����f�W3%G�K���H�t���,o��G:}ʶd�]sE�Mا"���H���5��j���l��g��"\/�-}���&�N�M`�5-\���^�e��S��~v�PKk�mW�c��0setuptools/_vendor/importlib_resources/simple.py�V���0��+F�e#qEZIJ�X	����j������ۥ�؉]'M��K�x��̛��Er'Sk�`�=kXK�|�j؞5���Ld����*��ex"o#e����-�C����w\�:���k��&%�x��{�W
+◯L˝��N��jPk�F���By��6��,G���e�r��][D���b�w\���~��)��^L����+mV�l:
��Vj���GܰL�f=���6�5d9\��
+���+�e �`�ys�x��jK_�jAa�e]� O���le�V[�Ԋ��Lm�~�q�ӟ���W����b6���E�{�]
��TRX�����j*Ke��L�Y��3B#���x��.��E㪱�����O�$�\��pt���q�p�}]�yî��'!�=��u��Q1�S�������,-��ի��G}�~BQ7,��yҩ�yB\(��Ҥ#-���,�C;$i��a�%���z��s�E��:� -\��Eׯ�}�|�R�#;��k*ƙL>��ؖ���#6:���"neͮS���F����'��P�[b�U�Ӥ�
��W��t�����nv�AsY>�?��ŽĔM���yc�%���l��&T�5��;ax�>(%U��Eay�^]V1NG^A��D���$����I���h��@�}~:�[��ݜ8�yF��p=�<S='B� ʉ��T���hd�N�j�R�ڃ��|Rw��`�Z�f;4r�W~"�p!#����a糭s�az����qt�%�?[�=%A����D�rGI����s��������zT����Gs�bt:O�3{��j�R�\��V�ʤH�J��{�߯�q�S�l�Eg����N����w]��m����n��\�Ϩ�t 8��/PKk�mW%setuptools/_vendor/jaraco/__init__.pyPKk�mW2& �
,$setuptools/_vendor/jaraco/context.py�XKo�F��W,�I�"��RP� M��E�i{0eE�č).�\���3� ����C�Z�|;�ov-֍T��v"�S�-%sh��\�v�����\KY�"��RTЃ����%P\K5�L.��=�y�W�&,YӵeB%�&?R���u�
t�-��.�Y^���4+Z�}����;��5���u�M����\-a�^ŝ�RZD��3{#kH�������u������@3�!S�x��	����
��L�\���QV��:�{�P��^���̯v�L�$b�#dMH�����ѣ�u
�0#�}v��-����ze�z;��#b���!�;����2[�j�
a�)h*�Ce(��>E)��Ѳ_�ZG�o��gCa�~J^�C9c�!���&�m	U5{�:��O���x���h��k�M��V���b��ֺ�]Pdͪ��P�f� C-7$�
�K��9=[�
ZZZ��(������/�[��NA;@cyl��j�-���mKP!�~��6u6Lq������D�}�u|~�᪍��H[��6Q����n1�wl��F��/g��@�n)jhy��xw<���%=V�.��Ţ�u[��q6���w$�x&�%�y�b�/e��g+0�����!������Z���g�=1Ts����q{�3�I7�Tj�M	�\�ijj���s�J¢e;,a޶���"K$�E������-�~.�B�D�+��j�ͳk#��MC2C�u��4������w��c���%J�&�n�%�輴��S�G�q5#%�ǐ:N,JF�`-7H�vdej��A�_*�oM4��+z��[�*�R��õm$=+Q�5�x��_�y�a�\Ͱe�9>9�҉b���^�B�㑷P��K7��hC�)+���\�f=�A��x��s���d򅌷�S�d#�zك˷]�T���)d��.���Av��4N5d�t���es���
k�J�=�d�
);*W��Cx#��Ɔ
�zv�]W����W1,yD/{���v6�c�!.C�.�h:�"���@Ylꮪh�6P�~ֺe�
­.(�^w7��^Rn�c��86u03����w��5FĮX�.���ѫ]
b�+ތ��Ž#����ɉ/XJsLx��p:���v.�4��L�y��J���6�#Sl�uoT�e�����O	c�Ǒ��u̗l�`TNa~�1w��Ϋ^)%Ճ�b����]P�R��g_��#�>����ج�Z��F��4�)�A�w�>y8J��\��89�������
P��QD�<n�Z�AQ��~�4	�$��7tBXt���MB�6��V��%.ޠ���P˼_W__���PV�qqC/����]�s/`�s6f���9E�QS<9,gĴ�F 'd:�?&ڑ��ƇN9�����	4�g�ɰd�3�޺Ѝ㐲�ƙ2#��s}��J6��owKr��*m{�?���3�fr�^!HL=K��G���84=CW�����iKs�'U^	nn04��v�Kz�}����5��Ԙ6�D�Y�A�
^q��4��+.Q��-����x�K�׈s($�>ɃIB�P����0g����F�Eۘ~��{�h�*>�#KK���-=\:��a���5�Ц��GR�fM:�<�gg�P�4�Fu��.^
z��z��>X�V�_�W��A�>T��,<LV��,EY~����T0O��E��bqp��ki���}���%9<��-�\[1�G����g�e28�]���{����A����L���)��*��{�@���oPKk�mW����4&setuptools/_vendor/jaraco/functools.py�ks���@�G�8�[wts�K�͇<��<!�1E*iK���>�(ۙNoR�$��žw��u��h�ySץ9(�CS��{.*�V�ƽ�버ע���۵�/E�4�r_�j�5}��
�V�U�UL\�z�X��^X�ϲ,�T���H}pp�]���������m�Oݗ��d��z�+�{�|�@>�7*>�=���@����C��̃BV[Q���Ң^���z�<�]C�ZHa��R
F'��Çn#
�I˵��6�N��&L�'�b�Y�\�jbK�$��z�eI�i~&�<㩀��ɣK��~��t�I$�kݪ�>{J(�Ɉf��!�ҫ�4�
8����gE��CR߷+X�,�(��Yj�`�\�r)6W�=ޤ�ʋ��1��n�`�|�b�M4@m^<�F<��">?d�7��X�Zl`�в�W�izz���ԛ��E*�&'����z��<ş�����K�����C�~e�S/fqfu�i�]��KL*�����J,N��Y<��?`��N��۹��S�JmU}��e�gs��ұ}��
x5\�o��d Υl�SQ������
�&(m�j��D��Q�R��}�j�Tkֱ1�������(�O���_@��{;����GD�2�3���p˰(|�M��x*�%Cq"Ȏ�zBV���+X����Z6��3+���r+�#������-
m�S[�]/$5N���L��_��+S<*�U]��iЍ8Y*uU7b�B�J�vf�o- )�$	�v�	ʼ3nڰU|y%�����~|?2��C��Y�F�5p���3�e��lA�
�e`�TR��Z�kD[qwg��3�l���.�H��n�I8m?��g#c�c�O�X�����8����('v��c˷����p���Ώ`�0���D�peG�;;)�Ki�N,@*��;Q@jųz�7������^���ő+��6���*!�XeY< �`w���/UL�˕�O�S�L32܍�]�x�۴��[�G�[�^�
�
%WW���@�o�1�� �:L}7� DxL�M��d��,T}�e#1 ��!�k$�sǟf�L��pgZ��ZBx^���"�\<�Q�;CF�� 4��6���Z�E���k8��ٷq�ò1��S��m`+�$~�~�_�䀂��jj���F?���tZU.R�#I9��^��T��[�"�$Koh������.��/�J@���߄8�8z��`
~�sp@��J��}��򱀕(P�4��·�ث�R��Z72�-���P|�bp#f`B
�
whQ�f�fR� ��}
�(_����z�R�V�2Ҫ'є{\�frh�H�Q��>���g��/v�|�㿟�V�t�oظۣ���nԣ�ݱ����Sݖ��;a�|/�%�1d������Ʉ��Sf[�f�ggb��هZ�	K߄]&b$�`�+�<�0��t �@��FlU��4)���?��'�2G4{v��[4�e��`�7��Wrc����[�c	8�\���:�+q���˔ޒW:���9�l)�?yM�R�g��IX������/Y����ݠ_`��|�6�è���bnP�(u�W�_ה�l���۷�:W�:�w�:5jQ�V�b��ۋ��wg��x�V50��Sv�q�4�7a޲���؝`�0�J�:Ș\u�kk�bQ�%ӈ���eG,����
^}Y�_(\�c�}�}�Σ��H֥��]AX���;���l'C�����I�lf!��-%M�]r���5�2�4	�`���8�Z̨�ʲ��r'
��_l��F��>�O�.���D�5���
]礗N>!H*�H��<��ࢨT~۫�v���S;Vg�c+���߰��q5��ͥ�,
NV��~��w5��Q��-̅L����Y	AiY,J��HYo��*{S��a�@<>#c�Y۠#�;��K�T�l�{�V2O
�M�Y�(�{�4QG�=�O�I�kbn��rT�F���w8<�=XX;#?�+����L�G[Ӣ��1����1��V �	S�(�lc!ˢԾrM�}
���e�3z��6R���,����7�﵈�螭�z(-%TK!젢c?4�`B���@\�q��}?Re����J��FW�ߋdܵ<��!ZsL�6���2�SV�9A�p2��̕;�1s�j����X��to��I��12�r�T$�qo�H���ü�S�&�\�'��Č?aO�,L�k��=���HŻ[?5���4�P2��C�������&��v����J={�4�!c�Ē�m�/����$m��+$�Ɍ�#�
��E��xCH5R���N����}���!.*L�k]�#�5�Oz�c	��N�c}�1�7X�Z��TX��*�M�4�iV�`�7�����q�,��!���5�j ����%
+��q�ڽ�CQ�����
rWY�ˡ+���ɓ�\	u|��!�_�����#�o��Z��c�!v�=lA�u��%�p��;�S�`�h%g%� 7>�Y�!��T�5���z�<���J�K]7M���L�,VEJ*I���dWճy�e66!0��r���Oe-�8��ZDI?>��W1�x��n�2� /�`�?�H���>�'�F��	�4X�dV�|6Or�^LHM�$���'j�B:��������ӷ~�m��^�O2<r
pA�:{�?1w;��+('�
9oL>v�|BkJ���8�O�C�<�ހ���>��M)Y�b!31�
uq�c}�k�g>aM\�Àç|��CF\.(RО�*2�ml��
��h$�j��p2)�9�?x�5�`-@��l�bXh3_�b�e��;��r�!�wU��y>��I�G�%�[��
�j�ӰB%�u����4N��G�������5��*���mk�.|�F����zd�H�L�<F^Y�“a�e"~�lǃ���֠at���:Xc�����@�=XX,��m(�Z�	zJK^i��@wJ��_픤k1N,z�N���aF��m�/U	�%�=ӏ�P��ΜJ�l49������c">͑
��#'�	�T8RxSq�-28M�n�3��w��^B��pJxޏݫmF[I&<Ć�Vt��_yp�'0��E֯XF����%�\x-��|�UǻΓ�m�x��m�P��~�*u���FͶ�*s��]H�\W�1��W�b]�����0�baс�Q��z�[���x�
4I���>�莈�|�=m��Ѽ
�2��\�"�qx�����E�[j�W g�ރ�n�ơ)�V����c��* }��t�ۻ���1J�cL�u���9�K�50�Q�T��8¿6��DZ9�3�m�	���N~'�U\j��݃���5?j���\
����)�~�=�⡣nӻ-b˓M*��j�>���Z�r�1:!���ߧ�]0kg���tkZ�J�Z:ղ0�;��浢�3��
��HP��[[�mǃ����\��^k`�L�DLw�{���n�7�&~�۸�q9�B��Ӭ���?��K��rx@Ge�?!�"nx�o�d�>r�o��
v�voQ�	�Y>��i4�[�dG�0�^�L�:WU�hO/&5|�v��HPjX/��H��I'�Ƀښ�\�*���Sߛ�[
���X4���'�1�����.�|^�p�h��
<��.%��?�Ƭ�K�^ ��O��YQ��k�����|�9����H���0���Ј;�ǻ��&�8L�n�ݏ�.��7��CS��1��D��M#PC���Q%_I�k��\�g��"�5K�f�蝺["\{�K"T`E
�A���C&�݄7�!$$P�m��}r�c�A_M��h%W�����-O�
_�	Z�z�P�<�,��
|��ڎ���	�m�u��h0�¾&{�ux�:<�~.Z��?r����!���ѢOe���o���/ŏ;t�T�DB��Ouզ?x�r
ݚ^���\t��cUrJ�'�۔����o"j�vA:��Z��E��|�P3s#l�A�h��HO���*S�L�^������|46p�=�|����������Ի+�0fz����'{h�t�J�3�Y׏��[̎5`�ww ��;�yn��n"ռ-e���s=�A?Y���m���u���|�7�=��iM���q��tJ��kt�`��x��L�ȻL�94V=�\1�_PKk�mW]"ʨ�<*setuptools/_vendor/jaraco/text/__init__.py�[mw�6���_�&(�2���s:�8��t��M�9M�=����HHBC�*�Vg��s/�$�i��͙�%�\�7@z��+u��'mUc�4a��[{��M��h��-8���H�ߢ���͗z�6��m�+#�]�x(�v�N�^V5NT���Xq�k�m��9�5�F.��DTu^_��?�(�n��8��J�#�{yt�/��y�v�(y��F��Z�U]d��W�@�"��2������
����mKÓ�,f�R7S�������t�BaWҊ]�b��Eݬ1C5-7���r�q�J��Xp"D�)e���=f붴:�(�fFX����~mU�+Q/�F���Q�^l��G3�*D�(iC�i3��7�G�����$��Nf"��&��Ą?�ߒ��MO
�#N{;H���Zn&��p��0�KO��lJ
=,�����QC2�pl�+�A���X*K�B݂�V�n
դ{���	t�T�!��X<�c�B
r kğ��x!�5����1!teTe���ʫ���)�j%�A�/-�.�{�����x	�PY�����Ⱥ*��Z6Z2���"��n�J�e-n�, �x٩H��ɟyҩkӪ~�`�6�=���d�?��īR]�v���5�x�@l?w�X�f��/����m@��s=�3���ߟ�YnV�>|��L���p��M0ҵZϡ&+�!C2R/WVw#�"������0W=�z��`�Ո��[��[�2��!�]y�6�y��_��;U����Ț�h^��
ۉ%��6��^�4�>��?��7N�;|I��!a�5ƥa��z�,�������x3�5��z�"߀MU
�-���V��=��#g1	s�N�>�9g�kqʻw��޽�.!���8��p�;7a<�`�e�Ͳ�Q�b&�*�����dZ�7��L�3�*|�!-?��Ðԯ	n� �J}�O���f��B��Ij��	_�A\�
�
0��bxҖ�P��h�¨�
i,/��>6�,Ɂ;
��7����	j�M8���,�,K��E�~Җ[c��~oG�~v�K1‘��{�8}D��=ls�C��HWN����<p�8�����!�؋�x����r��! i��t��ߞƧ�s(ex(���*�y���V�5&�GY[�.T�(����tx�|��\����
R
e8=�&+h���kY��ٌ�f�6�OB���7���`�	<:|8-|���e)`b9�����v��qO{�}�4v����_F(��jRp��J6�{��rFb�2;b�.\#�f}�b��y�O�(�jS%�gʈh�̀�A8���gʨ��8rjؠ#p�8�)���mWȞ5@y=1c���(�&2S���M)�:�$Zʳר%�Y7+��f���[����5�#��L����@�*��E�al\V�H�j�6�
�ri�vY��Vt��>���zAH�ޔ�t
B��q!�3�W�+�L�`�l��/�@�jC�S��I�Z!	�Kl]����H
#�6��i%��u�7�]�d���K��B���(P��!��&g$��`�E�L�f]��JeJ�4R����N)�8B Qd��Z岒B�C*~�0R�].E���Cr=���hU�m-R�[����-Q絃N���8�U�9��J:�(jG���xI`e�U7-0rt��Ko�(�1��4%��.ۍ����(
^L�(��@\��p�ZGT�X��&��R�����\���vC�2�E��֤'Q*���r#�І��5�A�Њu]:����yݮ]�{�ͫ����������sM��V{˒"X��[��ׄ��]1ԧ���~j�]��@A%H��ǨZ��3�F5������8�iM�rQ��m}E����2�n�1�B�)�W���S7D���|������x��dsh"�èa>\�����J����fdj��j��[,W��B	�R��z�k��`�K�!t��C����"�t����jF��n�F�^�B9ש�ʡ*o��P��u�	�w����Ge��S�2��{u�n��k,�ml�Y'Fp<X?�Hf��(�J��Z ��zN���k/tN�z�3/ZXgy��Gz�b9k#cF���hP����5%X���\U[�A=�l�G/2�^�e)	v�3Q���E�gc��N$xC�U�d�Ֆ���za����~�4(%{"�F���@�"�)���s��t:�N�߀`�?q�<�U��R�j�E��b:�r�>�)�P�$@�`x�!V�� Zu1�/�����xDŽ�OHf(��6��Ղ���SO�N��A��a:����ݒ��ӀkG�Κ@OF��[��cd�������j���%�
�S^�y	�t�@;��0QJ]��j��#%��7�Ę�VE����E��f�F6����S�f�rg�1R�ɸn6�ÒY���V�̵�V0@�o[�
4[���j׫�n}�7�h�վ^2����t��@�ƀ=��߀�m4{�F/�G����\�-��зT&�G�Qə�[7�9���L���;� ��x��kB���2���M11d���c�q�Яpɕ!�;_y�RTޓ2氧24�(�2����(�R� fe��qx�PU6�o���0�$��*��=��N>,�9�N���򦮶kğUݖ�f.-W�A�|?��0`ށ�1C���w1������g�Mk��{��~�6�	�Ds��iC.7u\�!�h�b��tZH����5Ò>,����/H�:d�[��,�
����*2��[�2��+��z��5
_��`��=�O{��:��XeX�9|�K�1%I$�i�
���g/��Tޞw����a�r-���Lȃ~�Tٗ�=ϼ���08����Uu\���^�[�dz����N�aCV/��a<]�f�I�
��w2�դTt��U���t���8�	D�
�#])Y '3ٮ��s�v�l,�ٺ���s�-1-�#5�������\}u!���t�/����W���t�DMAr�R��3�w&+���ߙy�u!#���:�w@�x�`��f1Iq�s�hF�\$q7�n��r��.��!n�fmXS��,�.��\�d�np���fh�;]�@X9�g���O1(1R����o�Ӂ�b�n�e|��0l�����V�rO;�~�*�_2��9�z��Ʒ�itt��п�s���6���	�nӽ��'�O�����<����c�*�IFG���?���Z���S|������pށ��{��N(�>��.���f�� ���������N���
��>8��W}E�����O/�>�a%���1���t��9	p�o%��y�M���D����W��6֤!���6	�M�B�H�M�n&�]0�!�Md��;0�/��i�7:��t4�%toʛ3|"Y��������+��-[T5��8}�Vv]f�"a���wo��;_�3���7�t L��8Q��Z"{��g�,��T|��3���
��BS�� �.�e�{���.���'�Ǣ��:9>~�]^&�6�]��n�x�=��
V9G^�l�|���Z��n_�3�u�u�jP)��a�㬐HJ}j�>����G���ϐ%&|���g�^�c)�&����S�J������f�|,�Z�ѫ�7!��o��3{��y��r
1��B�J��U�L
5Mpv�1��@64��[�����N�$r6��I�D�C	�'�~�o�s(�
A~���ح?IH���&��
*��
9�������:.@V�,������Y�������$y��+5�v�
׋��g��Y�y'Y���F5�Օ��3A��b���Wā�@Q�\�z�̊����iʸ'r��
K�G�L�,�`��;�a�G{氛���xi�f��d(uZm�H�·N
�g�x�����yFn�/��Q���e��'O?��|��Q0�N�p��9������H�d���eX��Qy@)���n.�
��k?�T̢~Vu/�ST�m�A?u��1���ɐ[�4���"��3/�����-˞���j�VP�D��SG�ei!G3t����=�|b� �yz�(�z�CWA��M협����H�J���"�O��f��)̓�^E�����m�+����D��}Z垔݃ϭ�C����u)�����|!�Ј����-߬T�&W��S�M7���x�A���~�/��m����.зW�����)֣�ż4��r��n��x��'�T�K�u��	��]N�]�SDq l�|���Α}�Qɓ�aYx������NH
�=_��t=�\Vu��X�\į=�$�2�.3/ۧ���)OTɽa4�-��p����S�@9bg§Rpn�}�>~H�	t}�}��a}c6�W�‹�x'�%��/�Y>^|X>/e�>J���M���W'֐�&�Ä_E�1��,�
�膲v�ժ,\l�*��|#��;��lV�S��2����6��zW�]�M���	��'`�e�푏�xY�և��n.)����)��!�C"�v�
:%9�P���Hޣ�������~Dh�:�pF�u4�|c�
WhP)�e�0�;����Щ���4(m�ԛ̳j�����~>v��}��z(����_��s�L��I!�����GF���W!��ݜ|�Y�{��g��0:��D3ʃ��x�>�?_^��7��8��l�X��/�.�܆^	p/� S]��m�V/qy9Ұ������O� 8zM���Qެ����sa���QR�\�"<���W����
ٞ�|�K�2cV���e�߃6Zj?��p���\ǯ���k�_�ۺ򌟛#d�_��^����x�C�2t$q��%���"(`t%Ʃ0M��*|t�1�^m����t���W]��Sw�6*k����������u������PKk�mW!Q8�AR-setuptools/_vendor/more_itertools/__init__.pyK+��U���/JU��-�/*Q�RPPV��/L�J��&g�cJs�Ǘ�g����+�*�[�Y��sPKk�mWP,x�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*��ŊEƅV�bє�ڶ�M�&Oף�ʖ��w[�ۚ_g�'Sp�UW���{�Re�u����r��r��G�I��4/F���@ݺ6�`z�~���*��׹�yU����:_�C�J��I�M��Mz���L���o�벸�j�5�!o��ڌ6�ێ�U
`�0�uY����p�2S��f�0����*-�~ϿF�/������6\��fU
=����U��jov�{����+X�u�5�{����]Vհ�P8���eM��#ܔEٔE��W�"�f����6��:��ZmӼ��ky�-o�Ǭq �o0)��4��dXu���t����ir�\P���9t����e�����[@����׷�}=EJ��,x\Q��z1�-n2[{���
շ�w�Mf{\��b�N�i}����>����y�����Ů��eSB�Z�ȹ�����0�<ڤ��4+���e�ZenS��nrثS�+�Hi_�^�lvM�e��w�j�]����;���0V��5��ٶq����7m�kD^�v�m&G��R��l���I�Ed��hO�(�n��T�`5�zZR����.����uKp�M�٢���n8�&��I�\O�j�;�Gj)��U	�]ID�|1%Z`�����7߷�R���а
���,��������m�ӇS��SX���v�n���:��7��g��`�4wp�Ŷs�%�6%�k����:o�i�^5a�y(���n�b�@��=�@�#��J�������~�-��̾A�;]�\�Ŧ�f���=��uq�I]�߀3�z����믄 ֯�ʡ+e�Z?(W�ڑD��X�F���h��K�0Z:�-21��dA�����}q	�����s�������X�D�r�P�Q�wќ���lpF
?}��s84n��)9Lp9�5��:)W	ch2,�gO�
��x�J�M?�Qr2JNGɳQ�|�||	?[������%7��}�i8���=�����)�����ur
�.YepPB���Q%�:�1W3����<h��W��y� ɦ�.��?zZ��Q��!���TT&��Lvu��		룼H%�ug6�M���ϐ�<�ѱ�U��Y�17���g�w�y��3���v�lF�.���`�g3��<�
x�e�4��
5@+=�
���x���k_�>�4����}0P]���Pբ :W���}�0(�r����/"-�xA�_Γ�]�h���C�g��l1�
Z�4xPn�0�]�#��4�^{�,V�!����e��ˮw[�{��KDu���c���������	9xǣ�ป�q�$ >:������ը�@��Z����/J�W��S��y��Ge���)�;���ڭ<ɒ�r�d%M��B@w����)=j�#X�*����[��nӢ�/�0�y,\u��1N����t�|��O�kd��j�,��;�.��쩦�o�K�A.Ⳓ�rK�IZ'
��/�`��5Z[������:���T0*�"`����M�Q0=Ć��҃�.YYi@���Gn:k~�C#�o��H�?�~�D9�>P?8�R�@�
SPgMР����Ҿ� ���n`�p{[&�M���>�h������,�eu�Q^׻����'�m�l
��Nk�BWj���^�������#�?�;>=����8i'�F���]kr�a�_
f��ys>�)�f��lz����f��ۤ��{���?M�X>�W�v�-�nu>?z��,�ѩ��S��w�F���ޮ���*~�Iwa(x����j�@t}��|�L��tnN(X��r-�T�z?V�q̲�p��+o�uYޤ���PƙK��Y^��O�6pg=�a�3�Z�Y�Ո�� \h�	p�6�o��dKj
x59�q���ɛk�mY���^�Cj�`F���[�a�����8�)�N��X���3���e뿧�!���� �T+�`�r_���
�n�##��#o�'F���:�A��Y�g׻�5��/n���h]�0��9����,��%�sn���u��UM���JyA�ez��.J���Qs�	nT(49�]���E��ۛ����H�l�9�P���$Ǹ.2�M��5Kx<�v��W�$8�St\��1{��-bV�����L��tq���m�X�6���e�f�^(^Z9l�|�]�("��D���vK"�Q2�58��6����yV4%�-�n���f]�.S7�=�i�cw�U��rXH��P.�2�s��C7��zH�a�y{o$��V���F��>�ι�2T�#�Ԗ¿�xL���ն6I'�߬��-_��}A&`:�7�i��֫��ي��i���-���<�k�u��v�bк-�S]x^��va�鵝� v��r�$j��7j�����'j�
�6�^�=I.��&���l&]�A����Xg�f�<�W��ۘ�FF��!ձa5�OPL����k?N�D�i~k�8����<�c۵�)���n�X�	�[r9�xՇq�hR�@�y5�\ϙM��.�]�
��mi6S�;#�'�&[�L^�j"C���@[�j	�QD
�9�m���)��S�)���8���1۲&���B�|@F��_VU�h�j�[Ma}�./w���H��}J��&��J*]����q��>�.rĬBT��=�ƵoE\��/F%!��Z	�w��-�
8�6�G�sj����RG��|�'F�c��L�N%'�/j$ߔ�&]�?���=�o�vN�A�n2D�	�O͌���7@$�H�o�X�Er�mMZ�y{�5���m›�~�#	���k\��shd����
�dw��aK���Ђ�4�3ē
���YU��|�gi�_H�LS�[��8p<^���3�~)2�/@��Tcrn‹2�D����V�|~u
�.��c�}
���ӧ���8��n`��Ѧ%��*g����O�)Ÿ�>���̋f�g1
D�����4F��,�ݎO��/T�CUT�y��KI^��
�y�I�:��'G��A�n�I�qAp�ԤH4�<$$�����~\���9���#�V��wA��@7�0���53f@̪r6G�[�!���
\$��H2M�&�m������>��(J�I�F���#�F������t�2���W_�_������_������+���
�������C�	��٧?��Qr�e[�~�,Ʊ�,tr3фe�m��~��Sa�G�xg��G����ȌeO�M�����3H8[��$�[���
B�dx����E�@*�m���8^?4t��,T�XE4����{7��+7t��n�KX�3����$D?�Q��&F��b�)��t/�Eo��09�Q@�~L��x�{�JeO���|����'��=�^SK��4�Pآ!̞�1���s2{��I0�Ǘh�J-�c}=��d qJ�&X�����Mk`Ҏ�B�N��+3tT�n��JE��
T�.p���F^�m�|G���t��CD@�,)��u�ք���d�;&����nx�_�V��/�	��Ud���ͦ�@wD����#��0�bo���WT)N�,�b��>��Q�/����]Sn���E�
I�{���鳓������T��
����@�o�SE��@�mINl
l=}��v6i����f�P	'�`im�a�M9򫭧d�L��v
��V��{o�qo�6����ƅ�k=�%�p��i��غ�<��\]����ܪ�>����U�R�Ͻ���B�k��*���j��\w�S	�V�-w�x��Bk��� ]��Ur
��|���ɢ����+�(���:J��8��*d��Ƞ`K�Ϟ�}"�ɞ@��~ \�9{r��=��;"wX�LK��c������ir(�����L��H��k���N�暠i",I�t���J<�Q-|��9��1�X\��F+�[<	�?��Ovijwoue�)��-ՙ8���Q�{�k�7�nci�,K�=o���'
��QX�|pr��?��Ԃ=*`��[� 
kηJ�(%Vi~�@�S�,/�,ƍ��Z�ٌ��u�lFH������^~b=�h�|�-Dg�֕ �s�;KN�����tr,�DcpH~
O`����g(��'������epE��`��k.�jZ/k�
�8�5S ��ֵ{�Z��RV���5� ����-�e
�\��4�'~��?:�Y��U�:
�}�jR�w�����p��/cz�Ц�8^7�r;��*��m�/��Df���E�ÈV��ǣ���|�'�J���e�Żׇo�z��)���Y×�Pe�u�yS�;G��Fn�~>d�G�k3&�,�X�'<`�)J��瓞���8��dh%BRt⡢(0@�ӆ
DSl��5�Y�m{G ��:��VAFW��,2i��d���W��I��d���J�B�z��&���s�Sً��R���"��h���8��c��`�� �[J��L�D�E�!�n�#xuR�]��;�!��,����ï���o�=}�^����W�~3���_}�؉å���q3>C�ču�T��}��W���<�eT�����[n�7�LPo��_3k7P��(/��&_�ޮ��b���(T5�>��>:}�^��}���[&�_�ρN�
ʈ7���,V�_��g`[♰�����-�C���ۈ��/��x㢧ߔ��6h����@�HIh��5�(�wDl3�2��+�w�t��GM��iTW3::�|A0l�N?���E�F1DS�(ȶ7>����3-�Z_:Φ,�:7v��6��޷�t�f���>�&^�Y;�k�r����j�H��yB�M�(�Ϥ��
��_�_G���m�Z��7F�]�����i)8�{�0La�]�T��D}.;T|�0�[,��&�4���E�J����X�֏��w���"�>��"�ߗ��
����.��ↇ������%_DI��-�,����*�y}�O��������~LL=�y��v��l�]3��;4g2��l��y������҇aZ�.G8v���[z�5WM����ngv I�_�����t�d��MO�����/���������lҵk��5����b��FWJa	
ޘ�C�����3�P�1~d77r�sx|$NY�E�q����B:�q���7���Aw��h��@�O�	��)^���
��͙5���7�G���V44���N���[�MN�b7��6#�W�oU
 em?	��hi{X�c��㚏ӗ�e�7��H�^xOɝ�GT���	��2f �X�`ܢh�~��`NJ�������Sn���don]毭)�?�s��mr�3.K�3��mP�m�
����{�����t���KiG��'o/ſш���,h��p>��z��W���p��^G����!>
ːv�˜6%�3��%m.rvyqv�^#�=�)���r�t^�6��e\,_���K~@��%;�:IA%�2�������
7�5���Ugn��͟b9�
%y�+^{�&���L��V����������E!~@��!|S��3Z0q�1�� 3uD��1��z��6�w��&��7��CX:��G|@ŧo��ߕ�T�מ��9��Z��>��ը�C)��4�ބ�
fą�[
��M�J1�F�9��;P�q�:�00
0�:����8���Ȗ?7�FQ�u��,�n��]�&�@_�L�ܡ��\�XY�p�5v��R?�ԃ��sn�퇫�m�����Ln�q���kw���Oe~/�a?��0%��M%����,���Y�9Kp��� O�{n��MG����~e���E[��F��1�*�?mY�3�ƭ��X��/��b:{�Im������`��
�r�E��g#u�EwJ{��ʕ�X
Ye.!�0&�$�r�.�Z��r��FG�B�̀Q�˂�h�BG����(��Dx�DxCEN��S�������X�09	���\����NVm���%Z$R�]�&3��q��+0U'��p�
��^�%��	��n
��l�_'�v} 
�><�4�eB����2�l{G���[��0�8�CMc����Fc�����^6���`a؂���Uu�%r[Zw8��@�l;6LK�n�n5�����~he�U\Y�g=g���B��DU����6�dS��#�Y0]|@�(�m�.n�+4������b��<\r8ݔ����j:�7����B6|xB?g�<���=����V��C��
p�$˓�͝]�hI�Xe��l;���]u䭍���x�å"C�Ƭ8"��y��u].r�0��r.���N���+n��"h����=��,��;��uM�ʊ�4�5�lup(L�w���/z��yZ(Ԣ3�D�NE�q��K��p�	�L�]�����8ӐKJ��Y���zG&�t��5����OG	�,wU�ԛ�'��Y�Vg���/-2,�n��Nq����|�O��uZ_��?H�e���>��dz��݅���
����S�1�w���I�}�}H�,V���6��Е����ۅ�����W�|�H9 __ZO�F57��!1��\ZC
�����b $VZT�h���g/��� �[ ��|��؟�v�5"S0��FPؑ�X�S_[J�Uu��O��<���Ҕ��h�4d�ymD�Z뎐��P����
���*!$P�r��5�KZd�r�);�m%�A�Cl,���!�S4�W\%��^p��h�ObCӐ��5�\$0ĉ̉d{��EC�.c^��e�ڽ�9᝜F��KmK�+��\s�����41'��B�2&���g����ؗ���I^�?I�,_��9���6������s˽F�^-
�SG|�&���2�ˉq�|4��b�&�Z�r7Ho�d�$�눃+*�~�nɑ�@�m�_��a�+�+wѾ,��f��o:Z�n�����iw{�нp�nx�����!"ߩ4.�#���~ytvD�]�Ȉ�'�
Q�&��+�G�	��E�7~[�`�T �@��CeZO�.z<pK>u�##�
�]҃J�T��ʌ��S�eq�)X30>��أ�
�Ķ	����x���g�>R���ycCM<����a�N/��T0��Xt,6=
Tۼ��3�0d�*=���JЍ�Y&�1Q�T'#]�=��W��rG�,�Ǡ��<A�ЇIq��N#"c6�xS9�*DA}^�s.1�8ϲ������<L�LÎ�4���ژ�GH=�Ϸ�6d6�$�)����v�o<�
��oɵH�[��$By���@j�Ԅ��.�RA�Kkm��0'=�y1��g�C}ڌ������l��=�lS�v+:�~�
�
�m'�m��J�uN]��+�2z&��C�ct�Ut��FI��V�%d�B1~���ʪV&#�5s�H����։��̱�J_#�ח�@���״i�c�?�v.�G��������,aøbM<�3aO��u�^*�D�O�x�����w��5��}��5��?
��U�)9�{9+��K�%��ʡ+��8[�t�d�5�{���ڿK,h����<��ҩ�W�%n�\!�g	�/y��_��k.�s;K��*���n
,c���_�"Yp�����J�WX����T#����'���R,fwd�\�S`/9>bٍ
�2��6ʙw��������=i��D�to�F����w�l���6k=4�C8^���M�5�A�_�M��V�b+��9�:��Յ
uj����D��dr��	RM/)������2!B���5�+������Y�G��u����7�tBǓ}��Q��Q���h,z�����P��๋�ds���6�a�c�yr	�Sr���zn�.�m��?/��}�
D,ù��qAm)�gশ
T{�s'��Rx�B�Ke����y�w�G<�G��rT���9{Ԓ-�u���q�6@��,�QF���Z�7�yC]'���&xZJ�F��4ln��i�E=�n�
Ru��Y�M�/�G��-*�(��l���ng9�2[2�{��I�G�QeYö>�p���v�`���6��4�Z*<=�
���K&Hш&��~/5�h�V��E�mY0;���u~P�-��,�.�	�%`��Ы��ꜛxz]}��Y$n	C�\[�q$�u�r3^
[�ҿ��#!�λɂ���A�{�D���2�URa<�Y�����M~�1!v]1@��v��o�N4*�?9⫴�)�tf_21ҙ)�Q" ��1r������)l���1�nM� -è�	��}j�w�[�b��;�b�Ĕ���QFj9�O@�rn��n9s/�/�Е`3B}�P���zW��"ʦ�f$ �������/���w�Y��N�p6�.�A	fLf��AkNv�{&FCeO�c��M/Ҵͷ��.��^�{��6�Ge�ė2T�}��K9�v^�}=��A��{�cO�]�T��%]|4ϝSB�>�.��xQ¸#N��7����zb�5DJ��D?��d+V1����ˤ��L�;P�ξ����M�����i�N�bu�,,��D��2����.6��(�a������
g�	Gt_�g��,BL����ۋa�#��AU=D�Xc9p�؁����z�r�)�EAg
�&�a#P��U9ϋ{�ɤ�L<�9eQd�1�h�Pcd=�yII���G=μ�D�<]�F)���%ӚY8�\�9��p������#>����h��pF���K�����8�a�#���EV�̨����#�A`sn��6��!FM�3B���{��V{sA�^��ƚ��A�D��ܶ)Tzp������Y!�1���=�(�I���"��ZT��Q"��m6��'�+�yAQ�8`"Nzde_C�*�"��"?��-�X�0�T���o�&�ahh�5�"uE:P�hߌ�Q���aQ�DyL�EVQH*z�!����T�~a��'���2�/wJ:�xt�x�4fw„���8��h�4f�F�ݦ�~Q.M�5����e[�nf�JJ�£x!�BCS�-�;�"l~�d���łv_��lY�PTU��#��=⭦�2ã`�\˦�yL����S�����λ�#t��QqY<V�<�sxtlo_.����q���t�B�9Z�����䯊w�M���!*|�Y��-“>
2��3��Ԝa{&���UK(�Yc�ԝ�lkd�����-�8���ב�9�6/�ʩ��<I�Gs�0�%E�H׶��u�zP�<r�N�;���ֳ��OX��t
�dL���k$Ȟ��L-���B�zʫ+��p�G�3r�ɪa�T5��v����%<�83)�b�t����Ѝכ���R
V���
��^�W�F��s�
����jW��D��>[d0�e�˯�a���mEZ�1[�t�9��q��D�RBk��i��
n��#Ҽ�B�u;J�?/j�̕7��.9#v_�	��I��3�k�o�j�� �y|f9IT)��9mpl��Ҧj'&�oF�L;A�?�wS�9��W~i�d��)����/^ߋ���w���O+`|p�wt���$ߵ����Z/�������`�t���N�ѕ8�wv�	��A��m�%����H[��D���#b�#P���'� #�R�7Ѿs��RN�N�n���˩���r<߯D��A�_�0��[�/R�9����~xAP���5�y}h�_\��	q��}p&|�~h>��n����A������k�u�ٖ�Ff���<�%\Imd���+�fY���,h���t�M��Pt�,S� x*�8 C0}T��h����k�s7-���Ll��+z��P������9:�c��i�mS�'V���~A��l2?/3��n����c#eѧ�Pd�C�P���6�f>$�^��0Ӗ��xI��n����N����_ƻ0�\���,)��&'�9�u���/NHǢ������MB����C^��,9#�J���1̑������w-�ɀ�i�E̕��Y*L9隱��ȉ9��oA�U�H��b��-[�PB�2��m$\����A�Mk#�!�-.�;Pjb��J0p��t(#�u�[9N�K�s<����ٜ��Z��B]�zR�^�u�d']U�_X�uD�����^<��6����nޚT
���\�Vˆ7��-�m<mCq��*�!�ؽ�e
�o���m�0�>K�q^Kp\��E$.X%J(��߲��2)}u�{�q5�^�EЪ,��gn�yؔ����3����G��	�AD��0u5��}�p�i�i_��hR�f"����4�l�Is[��ٸ��T3�0h��#�8&�Q����P�~
X�?'%8h����[lԟ�D7��%e8��z����!�t�oT�ns��<JsKW�����&��M*��b@�3EQ��5F{�	#��
B��$/lh䯣Q�%7[�㈩�.��.�)^�1ߔ�'UvƟ�r��m��KT�#l�N�|jl8i���%��ֿH��I�*]^��=-�ɟ��<8{[Qg�1m�t�n(a7�?U�"D��x����24>,dr������)e����*#W��;�a,�m��b��M���]�eC҈�M�Fo�-�Tc�"�b�g������\�G�dH-�y�bWѬxjd��'��ѳ����|���K��=���ֻ
�h�K�(mT�\��=/$�O&��]L��GN�=���ЬB[��XĞ۰����p'0��#p�\�*���3�Vӌ93�	����u��jQ�,��5�*���d�U��ĕBfI8m]�L�^����Ȋe��֘��L*�Q��Ahy��q�G��>}6:4Q<����]61
�@��7�h���B�GϪ<S�Z��39�r�]��B|��,�!���4C����i4Ҋ8 �4�`nQ�w��"(B��r�WY
ǣ"�:��M��lE���ݏ~�1�Ⱥ�;�מx��a읈 N·n�bZ���6�9�͏����lWp(&an5����q&"	�.��L�@���*-xy���[����:H�5��F�C����KèI���R'���u�`q�*�'�A�B�\�j^�#@�{�T�[Y�U�LA]�z��6F
%�|8�<�fF��t�$Gi(�Z

�M)��k�&�0�Xl��!�C��V���=z~2'������9��� ��Eu=�9Z�#�Qht��(>.j�E���|�1?��F��N��ڍ�34Z��c�Oqα�\�A�ׄ�qy�ƱT���Ȧ.�m<��Z��f�NQ��v�h~�����?Ȓ�L�Q���0��_�U�,z&�� ؅����"g�o�v�|�2�!�	�^D7O� P.��$�3�Ny��<M���`&�f	0��D�߶q���I����TP���hb��T9���P�¾W�e!�ρw�>�ZK,F1�/'87��0�-��#4iŧU�q�2�H���ǝ�#�ȁ�Gpp-xl����7�|�צE�p�lh+ʑ��r����(��IJ`�%nM���O��}C��wO�` id���;n�)?WB���Uc�EA�|��f�4>G�qo2L��~Gtf�%B�	�.�י��1[/�՝�kE?�,k8�W˰��7��8�Ô�a�MM��Q &�4����1�T�մ>�Ѱ����ӽ��U�5�y��%RG�CƱ����/0��e�(����3?��0lf���2���Q��I��^���
�$@�%Ro(ӊ�3�0֏�ƠUIy� �2g��	��,d�%NU���DB
�Ћ�ĺM��:�>�� mm�[�/>�����-YZb�������}��ʔ�L�7�gu�Q�*N�Q1.��J��~l�Z�|���e�Z3pG�b��R�RXU���꾔Hw"��Wu���9")��BOh��cO+z��N�Vs2�����z�ƹ�M;+�_U�WowǑb#.^�?�Z��ʐR�s��	��D�Yf�S���p���m�MO]�M>
k�e
dW��6��F1�e�LrS�\9Y�����/���{�WВ�S�2��wd2���|Dz��0��,�5"^:R�ͼ�t�ϥ��a���X�K˫F����_�0@$� ӳ��z��f�c�����{����l�U�ݛ��(3��$^Ȗ��tbC����݉��[/���aK#���^�����Lsz{�}��<|,������Ƙ�VF��,��˶-��-v�:�3.�D������ˏU�ڴ�;t=�/�[b�{XJ�N��Y�ڡ�:����y�i'�����]�nx�joT���<�L���_l0�~~�b�	��)��d��t�p򳯮:r��6�y-#�^��5��H�,m��`.�02��l;��˹B� ��ڢ� wGc�>DI�N��/��ɝ��x�]�����6%9`^�eBeF�CH�1�w�H�"��}b��-W���d%�o%��
�4^|�k#l�Ħ���u�d�h)�/,�>�Z,����r�Y*J�I����
�$zǓ�S�5J�_z>/?���q���)��'l�L�O�l�o��E�ph�ټn3�1���=<�U�a�w��[���o����E��6�3�n�|�"�RtIMR2�X�W��k�Jz���7�X(`���F*�+��	�t�?b�\ ��6t~o�_ĵ�mV$��ڰGd��v��Ƙ��!���ij�K[����8�7��6u����f��k�q�Q�5��&�t���\+����&.���EJ=n޶�n�.t��u7�854Q�&����8�0�Q�ѵ#��f}�NJ�o34=%2%���rL�z/�i(��8y�^	pA�
�_�iq��4� ��zL�������"����X_gYC�Ag�b��UQ#�em3��(?�J	pTS,%q�ҎQ���z�m���� ���&��lv<�P.��c$�g�N�$�"���d�$Љ��ťm��M-��x驺�[@apt[L��ZW�BR����D
�X5�&L0
.e��.o�&`ͫ�&+���	}�%�	ѢfpL����"D2R�c�ҕ�4���k�Sa�B�
e
��	��$�I�H6��=M��C�a"���R�d!D�$ 4}|
.�|k�RF�潧�J��)�<�����MM4�4�۳~4���4\_���)"��c<Da��ɡ23�M@K4h��p�&���{Ʈ��:��1�ݐ���3����z�D�b�g��fnŚ�������{}Ea��C��y�J���S�cJ�!�\�6\���5@�	Ֆ���n�Xn���q5;g�����(�"b����|�#���3l�J;�̂'��{M���5��#��W
 ��s;�ѷ
�ucf�8�ْLU�3,��O.\˗���0X���t[?$ (��Z�yT�"�sn3��u2����#��r��ۍ��R[\����g���{f�8E ��������.���\�c���4�E��q�Z]��k�D���i}Q[r
�T��������ÍF��im�Gy�Hi�Z�*��t�\�݀12���(/��yO��৖�zj	����	V�}˕:{��Ft��CԤLK"Ю�����gO��l��hN��X{r��Ag�m��~L9�F��!6��㦥��&�M��ݡYB̡��6�(���>��NB�edߊ�����E�7�;�˺�x�9s6���+!n)��� s�m[�%*��"`���<.�o�l4��J��EN���"1�x��F�8�r����I���[[�-K+����hp9��`��X正)�X<�0[�p�p�Ri����d��2tq!0�t���Zdpn�=If�5d�$���4�l�r�ULn�C�Q�u�~�x��b{b��Ty:;�Y#b2�m�����2y�6��66�P��jE^���ÏS�a>F�I��b���X�ˢ��if"��tS�F���ę��'��GM�h�ɬ����j�:?R�ج�`�;���"5w�ԅf��Q]�{���t�e�t,��巒�U<��ױ�-r�"m�l�+Cq�Ң	���I�dP/3�"Idc���[�0���u~,<���LN�n�Nv�se�-��Y�=�Ԓ��ri3�=�!sN>Nш�){��o2j��d��9US��ϓ��0�#';O�
�'Mq��yEa���3l�20"�������v���;Б���.,�(H��1/.�`n\t(	�M'
���NA�d�n
.�@�<&̠�[#^������U�q�E�9�|F4�9Vz��@�qQ\�\<�ު,#�	�R`q�ƉFc�zIV����m���q�,
���-e��`B��|~��֙Ii��HyO��,�(����|�����-�-q'o�壖k� �
����[.PIt)����G������X��A�P_���w��5� ��f/��a_l����
�=�d��E�� �~u����H�BDy��6�4y�6E{�>z��Y�wlG�����r(��a�?��6gb̜-���&x��L��e��m���̰�UҐjc�Ā��
ܜ��^�"<�)98��\b�97��m�/����ʭk�� �i����g���D���7�;R1�w�!}!=u_��¾.�����5vsI%�'�l�8:sa���7�eB�]��ݗ��~PP�u�	��a���4JyF���]�K��*�X5[��~6�pAPûDj���\^��<`*�\���6e���
5c�Dbe�J1xU�,�$�T-8$�Q�W
�]N.�r�@e)�%sQ�P����sVE!n�
ޠ-�;�� U�c��n��i�X�e�ldC�9���2�U��m��YF���L���C���[�9�t�^��@#9Y�>�b^��U�t.�o%v�)�X�}7��ZW�csE��~�$��qG�ˎ��ޗ���ܻ�+)s�RcD�մ7����^�6�T5���F�e�D��y	�HuO��Ae��Fqv��h!���]LEh�o�
,�}��N1�@��x�%ĕ>g���pp	���c`+4�k6���1L�R�s>	R�݂�z'P�ù[[�W�=;ŰE�Q�ቊ��k���"��OB��5�LOxuEC��f�Ͽ������/^�������9Kn��Җ��v�ޝ%��迯˹1��WgI�7~[�_��N��Ri|�!�{/I坲���9�7�b������~���I7�rN�2����7J�k�Y��؋�Ѧ��0"�G�C�](��Zc
�L�5�c�M��ղ$�;�6߈��07�.�1�p����#Z�4D��cüZ"��j!{D<C��ۺ�g�H��G,c�'�@��Y@U���ܿ(�G��վ(�	J]��'��:�4I�7#��,��GWHI�3%�c׏�����X���1'��{Q+fta�YU�wl�'�P��J�d�[����,�0
;�r�ibw�a~�}�>8�̈��s ��#�D�(��*�i�=�-Vz��� ��T�"\(ir�$ڒ{�ZGj�-�b7�,�)󽀟��"�I�������
�A�9�f��nڎ�#�Yg�e�� ��f��vebx��,�C��
Aᓴj�-$�B�� �2-�Lf3V�KE��3���
�B\a��K��ӱ%b��?N��t||��^�ڞ��c��ҁ��>b�n	]m�gJ����!���NƓ�HNĺ���V������0��FO���𷆧Ls$p��O�mTӽ�rd8��f<�l�u�$��l�X�/�A��%��m�z�q��I���sS�5uM�U>�F{xe�����ʈZ�k�7=��ߧ�{2�S�N^��?gU9
S��s�:2N�A��eb
1%f�q�<`;�0x&�?����I{��n��3�T��l2Î�V�RR�Q�/�6�7����uj�^1�f��j�0h��V(k3Գ\�&�dc��Ɣ�[���tc��"w�z�F�c���Զ3��
Q�m
�r<��Y�(M�S�4��y�x����?�̒�f���d��a?=��}�"��7�qbڰ�}��������/�Z�!kb��(µ9�B�r2�S�X���Czc_`N'zײ��szz��b=��y��QU�<tiZ pr���J�Ê��Y�F�jm�XK��>��F�5xబ�
�#~�o�e���D<l'�3���[����M.�8C���2:r���Աz��d�.f���Ӫ�8W5c�����P�S���a��xn�[����_�~��iqWz[E���}g0��`
̳�M�7���ֶ]󅮩f�R-��K�CT�A�;���0;M�T�ߩ�_;�w�t�Q��Q�8h���F�?R�I�	N5L��,4�3��ֵ������t�(��Ẍ́��I�G�r숤
r�!�T�(DtU;��j ��{#-����K4i�w��Z+�������(���qP>��*��h�>��R����d�j��Z-���"aq�&���x������
�
�O��5NC:{�Ѧ �n
c��*f���O����ø����b	��l0��m԰6@��xaJ�X�m#'"��/5T�M��
:`Sn۠�gͥ�n�A{M�A�
l|/TT��+�$��q�3�*>��g�ՙEx�_��p.��U����n<��k�tepx�#���Dw7�
�4� X�A����
w��p�j�ʱ���C���K�Ys���:.o'�$���⃶p�s���]m��B���
Q�U��ޣX���}ޢ�{���{�
HOG�����M5���{*�n>�Q��R�ċ䘏lf���`Q�v�͓��|���y�p���i/$)�P0]�O�p�RaT	7_X�މ2M%��^1�淑�غM�;�OQ�u�k�3�v�G8����#��{��ۇ<	W2!��-;׈�I^}���*�W	7�Qt�TCf�ɼ!��h
�@�dI�Jр��{��>�_�
�5�[���auTp��Gf��>�k_yH�o��$��4�W~�Y�em���Wk�m�3/v� ��=�dȃ�E;�L���mn�&��=l)�y�����I�Ba(KN^��h9��E�0�ؽ1]�/�^�b��O���]i/�Ъ�3���n�
O
5^�-4�Yg(���$�@7l�e�p�*eA)I	\���8�OKV`Uz�����t�x�Ŀ�Ix���V%��~�ܪ�_�o��c&8Ӄ��X�8���}1>��7h$�|��W�/�LL���~.v�ANvh+��Xya`�)&���ys���#����d6��lH�ۚ"���Y��X�W=6�cP���2?��|�]����lm�.K2�!Sem���b��ZK�T���KB���+���I\b�(���#K�Y���ǨÏޗe	EIJk4eC����Z�8�pi:��D9!W�_0�H�4T���[Z�kh��6V41�,O�C��`�����;^����`�t�������[�T�m�~ �I�����կ����FTp1}r������l�u��Ψ�����ٞ�=ƃ���!�.�E�⧮��� yRB[J��Y������V`�k��}�mz��űR�2��u�L���`�
_���
d��#6ⷀ���'%�|��C�7�@�fta`��NIX�����X��)Tf�l;[m<��Du��H�lݞ[���)vJQv�#�/�&T.���7��r8>�?�I�HK�`��X�e�Ӫq�4��s̯�H9q&Z��`[3�a�YH���3��O���8��Z�bm����O�c���Ma3*�|]�*���O��*�ce��LƟ�>JN�ux�H��]��������c�Թ�1jE�.-��J��8�~U߻���[��j�;=������8�)���w~W���|�(G�%�[�y����X��'{��\�����Z���6�%Q�O[��$�Y��k�̮�†�!�=�8�5�!7A�t�����o��Mx$�����?��=��_~�Z�"Εq�N�������&W宖h@�65՘{����/�̪�{�%��
=���ny:,�rK2�0E��}n���A�L�� 4���^$��U!�C�:�q�!,��˜�?���?>���p�M+��~ٵ��g+3����Xw/��t~?�i�Fҏ��w6����T�GV��?�YY�?7n?�>>��hll��8���1=W��y�2[�;��uL�\k�U��5TvC�Ok��̝�#����:�Č��ѫ�=CSZ�#=�QTp��2�~ �(s��]<3��[����V@���ޚ���Jn�e�ɋ|��Q�jA3S��m�09R7>ҝА��٨�ɅG�i����0�} �<����S��?���		j�#s �W
�N�|��m��%L~Ѭ�=
���8&�L|.&�g'�_$��f�/z�1?���g�1}~�S�G�1quh�veo�wd�Y�^l���2��l��f���]퍄��7k̕H[�����B����y��G�L}��6X�>�(������[���j��s�^ix`=�5*�62j��;��Y��6u>c���-M�"*���O���x���\�;�/'�~g5Ҷ[3�c�P{fPr����3�F�r9(�7�Wg:)!���a��u�DYK_G�c��Mz�Ί�#1O�U�!A>�rq4��8��r�4��'�_.%�h5�t[�9�Y�dNt�o��0
���r���U�m��Z��l$O�y/�Z��\�+¡�g��i"���Z6��MiϒNNZ�6�vo1�r8�U��k����g�2�	uHR�B�!�-F2K��~��؆B,~�|Gf�Θ��k��F�{7v`l	��e��(X�C�~d�sbȑ�.�˰^S�v��7B	���'5�#�Ep�e��ސ�So@�ފ�%02�&���_.�~4�nӿ�R���=��i����	�t���d�rK[f��5@e*���O�^��b����MAk���4�M|2�b���4�$���B��Z�V�V�2��$��1&�kВ$cb��3N�E��[<Z�eڦ����5+�ڤ<z
���U�Pb��d��9@�^���-�:y��"?{{��xy �lo�-�Չ�Bu�ų����}����t�uQӕٺƯ��6�p�<�<����\���ݬ�H�Q�o��=�0:�?�?�M ���$ԥQ�@F!Ak��"��� ��iFo^&A��3mŽkǯi+M ����E7��:jo2����_�1�O]�9
� @�P,������-�0�o��C�b�CI����,����Y���-GY礠����1�kmOL����ʦ\�xǿ�����=�;'�4)SՕ�$�
�U;�o�� ���k.Lg`d�F��A�"��f�X��U��Hӎ����'��0�̽�n8\�$g��F{�`L|YwT$���/:x0&��'r��K���;܈S�,���`��J������٦
��:���\z���I��l^�4�������.Z2�+{u�L4]zVZ�0����;�.oh��Q9�mp�Ε��c��('�1���Ѳ5�b�ؗPaGj*/�-X$7oU�)�k��!��'j� ՋgF��ev�l*
��r��m`e7�8�%���-��)�-~��1q�YfZ/�|J1�<��k�X���(�~,#��acc�{-��K�\�}�C.���=ʽ_k,����F`�td.ì�}I��@�s
[c��kC���*��$^�	�c۸�M��Bü����S3VI�.�״f�b�f�h4hz1ð��(}6L��;�9�
�$�a��݇�3��p�[�J:}��+u�榪��/k�{i����[p�F��͌��yf��l+N�\%Ej�k��E���ۑ����_��	"�r�?pr…6`��n>J02H��f?0�k�ƚhV$w椋�n�[Ü�7pGK?9�)@a�"���i��Qe��^ø��vZZ7�.u%��5ٳK�}�ߝRV��o�DX���kZl9r]�&ћ�$x��٬�	�‡��އ�5��Ȓ9'S^�s�(�r�|>J^��/F�g��^�3
/^�;���|���T<�B^��+4�)�=;Y�?�O�'��:	e/�"ܲ�Q��G�A���D��~:��l�!n�[�s6�z;���p}�	b�:��r�7�e�a0���sg_��4?�D����
5]J�W'���lgC����6�4��/u�^f��a�(�+3����vt�E��b`n�8.Er�N�n.Z��g�}��rwQ�5UlD6�8��? �F~F}��t'."q�ږ���j�G���1lg�}?��&�le�M��'M��E��v|�]O�E�]k���
 �����}�&ye"1�Ì�����O��$�O9�!��=Z���h�� ��ٽ��5	�=�m�ծmv)�5)B1J��O$3T�t��2�ky��5e�m4D�	$j��)E{D�)�}Қ��%��#�ώ�E"� �Y����E'/I�1�kJ�g���Y����o����lB�\�7����F2�ї�Ҟ�O����.����`�ZR�+��;�Ase$b�e�>�V��m��_P��C=��c��~�o����k��_6V�2%�2�ڀ�#���(�������*�W�Rp��8b�<]�ܦՒ�^�w��S;�4�HB����j�b�u#kT<J�!/�X��W(M��)f��kPI�9��1K�S���ҋ���L�b��橞��6G�?��f�7`G#�~�d�&E�ق}�xŭ��A�޿�Va��"��F���P��1
y���&�ad�	m�N\�x�Jv/���XYFT�1n���fI���ξG�"��Û���I���i��%Sz��^����i��^�$)e�D}�p렿,��@:��5�MNN���
���u��	�Ա�z-PR�r�9�Q�'ձ<0�6)7���5�MK�~�$��p�<�=��f
_���Z~xMF�-��ǟ|��fi0`?�9��L�>��O@��TA�p[���x/��*�=��m.
�#�0�?#N+�O��,&�Π�0�I�kJLT@�M߇"LZ�7�2+�B����Տz�4J+߷m�7
e漆u�6�������3�JK�W�w�)��(�c�g��*�q�Î�Oٞ�<)��U��{��[}R�(s�r *_cJ�d�V�OX+ZD�P:�;�����p|z�hyb����6+�[O���4M�����c?+�S�?Zx��`���i�z\�͍���e8�۽`VOn>��,⹲���kmL�Ӟ"�1Z,��d.Tc��!���BT]�+}x1�p☍2u�+���;SM*n��jw_8�������/VR}�<�����f�7,��v�3*�E�(0�Ƶ�����-&^jc���si/�ͮ=gp�]J�$)���4�H�<q>K��{+��m�[�����W�y����d�ݳ������d��y2[�ݡ�]1eُ�Eӿ���\�e6�αY�ݢ���&�=�P���W
+mj���H/ְ�rp㼂,9�S��_�i�Qc��b0j3�%�c��b	n�5����e�#})%�#�)�#�)���-{��N'm�-3����.��1�K�8U����S0#��Z�pc�v�l���܏�Si��
�},Ï�;��5:�,�^�6,�aDAj���NĭM���ӫxG2��Hd?F�ϥ2e����"�'�K�WiZ�N#�'�≴�6�mn[�g>��U��CM��EY���X^꼜A���n�EE��D��%>Pu^;�zJFN�~�����n��7V}(F@F�|��C�CL�����(S�d%Dm��K:p�e�9GW��;%"%z�G
P��g$�+\#ю�0�VyE�Q��u�jb����(]c�J�U|���6��g:Ԗ	2��D$��I"�����һ&��oB��B A�@��ʉȱ���y=p�n�)�Q����pjϡy���0ٚ	����keh������
Pf�o�h�����ƺ����1`��]X~U�0�L�䵈{����:��Ļ(:A�+gɛ�)���7(=M�1�K�iH�)���EwW�69�Z��F"G�RE G�	Q�E��t-����]\ZT��"5�㎞U���na�W��R���PxI���Xnm�6��Fb7p��g�5�mq�x�|2J>5v9oJN��j���'���GQ�i�U�MJL� �h��Z��mX��,-����
,�hY��g�ᑔ_��߁o@Mq�<��0E�!j�.� 5A�N�-%uZH�0��YaI��D���n��J�"�[5�m�׍A�Н8�?	���
v��K�l'�I}��JɃ&V��"r�Oz�.��!D:��i���G�Ʈ_���l`_�G�yz��G�����`���~%��Pv����2D����y�ܡ��%C�5�ޢ`M��@���@Q��mUbh�m�f���<Y�
��z���c�{�P�q^A�{�"����
�y'o�ih�ׄ�)� �\���Y�Ʈ�e.��zo�ۇ�&;n���H��m�nV���dW%i����K;
r��L'�Y�6�m6i���I���^���&��ʞ�����d�D�]��b;n/H��ʠˉ^��^PV�����#���?6%-ګ�QA/HUj�Ԕ`O0wL��%��o��6{��^���]�҈~�	�a�l��ڬ��Fh���$�����I��{�k�����
R�>8
#�1>��ˁ��d�H~����͉����@�HAE*������ĉ�����$����,�F�3��G�Q��%\J��9�%��j�6��PN]�Љ�1������1Y�~I#}x14#%}�ȝQd��K��H��r���Ć����}�5[��ع�;������]�}�š�>���m�|v����w�@��m�c��XF���v�j��']�h�����%H�0�v
|���9�?Е�����b���2~���\c$[�˱�'�̊����L��m6�`d*��l6Bs�k�u��@?��M!S�����dG����t#'{��Ƿ�-B�A;r��%��w,��>7�8�묭׺���F�ű��"zqCfN�$�mJh���
εTZ�
���UvY���i��ě�)�9�1K�r	41��ꚣl�w�X�qq�����%I6�I�I��c{�(�3�j�#:w{L�&B�<��E��qh�n���@v��C@��C1�?���@
uB��[���i,bs�&n�a>l��=��Pg3c��.[��� 0�3�ނ*Z���ȩ���&5c���7'co�=6��J�dp�v�ٱI��쳴���P���^�CA�x�|EJ��(�1���/��
om�n?q�ۦu��'��k<�^f9�~�ѕ�U�L
w�yx�NF��?'�<�)��Mݢ�jJ.ƨ�`��=i��'"�&��˾=mh�不�C�k�?�@vj	N�]�OZ��r�|1�)�/�I�u-Q�Ð�S�7�CF�pڝ��d��ߏU�|��!g����u0�)�P��hSI�p,��r�����6�	��'`��=�h����xy�J�����G�Q
"r�O�4B��&X2�+E�����΂�S�[JM5<:�1
��Oe�>(���0G%L�ͤ�2��ap�lIZd=0!��\�4�8���⦧��%��r)�r�G�w�ƺLjY�2<��P�<��EΌn�b"v����Gtә��?%x�.I"�kD��V���U��RR3�rW9K��/Q����uި���&��7�Me��9�"��l�/1�b�*�/���!�ӭ9l�0�P1�>�y;ZM�3��ǃ�H�jꜸh�}�ӟ���N��� vp��-l}��L~���c47��D&���v�25���
S�c"^zQwq�PX)�@����zx(H��A���������������!gIA�˴�ć�`�Z���s�.����5o��!�/�m�P,'��׈C�L)���mYG�|�Z~e�;�V2
t���c/{=��T�]l�@��'��m	�F��nMe�q��..�wӫ�b��7�DE�{�]Qek2ct�t;�0v��I�ڼ�zUA���F��b��[�j1hŸ0�1�%W�(P��a�Q���5��2�C��tG�M ai��=��u�.�7C*��~a���C�y,ft���}����)!��zo�fc	כ�G�#≳��,�Y����n�0��~��z`���������7d�Z��Oi�B��PkwV�1�S�!֕�"�Z�k3o�&&N�װs�&o��NO,��K ����y��T��}>'<�?a$_{O-r�g�0:ߺbz^\���p{��V#-Zr�TA�Dʹ޷g�%P3����/�_��uv��C���Zy�8�W�<d�{���a~`Ec����S{�|zY����M���e=dn�/SV�������n�c�-����;π#�	HT-je6���r�`(ǴJ7P�Ň1j/�5��M�u&	��5�$!�����p�D��xϨ��X�G��i��j�CE@5���!g����‡�kq�hvж�:[������4�����8�0'є[R��ƀ
ْ�?:Y�oD�7�1(��=�]�5���&	��K�I�'�t��1�Ԛ�p�|SQ���
�v�U���LF|@t
of�D�;J�B��;�_���M\Y�� ���ߝ_�ϒu/TI�����p�ؔE���,�A!�1�������EwH7>?�9O�EL�-=�Y����v�2���	�XY�xU�q~c	\S�S�p��~�:��n���n,5����81+��P��e�\�6L��0
$LǍB�#u����g��g3��@��֣ZQ\�������s��gPÄܛ�ϑ�nY.Ш�,������_O_��W��{�շ�L�x���W_��+�G�7e���ى*2
�<��&t����f�U_�A)��L]���d�@b'�5��!�ǭٱѴ�����f�'�	~�%i�`@�������=+�[T�)�u�)���=�`nY7��O�'�ٙ4�
s	���e��a��"5�d�΄�11�[�����L�*�O�u9%�خM�aV�B�(��_�_G���[j���c��>��(����/x�K�N!��3{@���2�����s�s�nZwqT1[ͪwCJ�^f��x\ ���K�ay�A��3�uCq[V�BU��hRr�L�|��&�h����yNY��H2�i���5���"���y6YF�܉�%�q�a1�?F9t�>��x0�q4
�a��f?{���h�bz��fC���F~��s�ƈ�A�=����߰�^m���y]�x�s�eز�=/B�UDԎ����L��@f�w��z@��-В�WH�$j���}��*R�t�F�	�{�ɡ2���	L�V�'����a�alk�.�c���M�/E�wtP�'ʊQ)Y[r�}_��REIF
�2@��f��3}� .].�n��O�f�i(U�b*uS)ѕh�VC�u7�"��Ʋ���X��Cޥ��".����i���
����4:��ʹ�Y��C(��y`Ev�$���"Io�1�\(�L%��V���oh�Xʁ��V�"�q��=*��Ҿ�T�F�Yٌp�g�Ԅ���D�T��-�+���q{&e��aNS���
����8ι�,���h�e,��=&l����Vq�����ڝ�˻Q�5��U�4@��Z�jb2� ���(TYݎ����B�ƭ�"���`�����W�kKK$C����jz��/\�Vj�[���F���TP�����b>Xc@&��6O��ڡ-h�䘆�
�}�>ؾG���mXg�(3/��
���$�7E���bL{�8Kƀ�g�	�
�Q_�����-z�蘟ᭀR��܌d́C#c;CE�l��,��+�l�q쀬e����Lb,Q�W8J��J�܍�x��N���������뱻+@��N|i�s(����H
�ʦ��e��t���¼oLX��"�o�lG�m%�@�~�������R�<s��ɡbE��7#�A�;�]M������1�C�ߎ�
ʏ�_fm����k��!�����W2��dN2��Z�zWN�� ��$�b����/���\o���:ӄ�g�=���
�0��|s�\���MKO�'-p�WG?`�hA`�"��
�_���z~�/����U�����`�tl왾D�3f-c�]n-G��6��Ά�%۳��yg6�4pα)n�����FBH�,�m���J!��N�����I�	��d`�H{_Ki��&�X�řuYΊ�m~�o�e�����#��ѷX|j�Sc?¸��mţ��G�����x�^����,�)t�r��v�9i��Rn���tS��L�� �=�)|��84yy%6�$�61�n�Y�K ��d�$9J~4Q|T�B�� �4��ٻ�qg����'s����f�|����f�������r�����c2�\M]N�
�aF������1 1b��]���K�^�m��"'��;��zdp�/�O]�Ɖ�?J�fkՆ:�١���uyu������p/��5y*���\�.�B����V�o'T`
�.�S�0�ת)�@p�^�H��f�h(�I�F��,��{�0�j�N�VAj^:�Ց���n�x��l����TUn%�H��p��$�h�l����(��g�٩b,.+3m�)���$\�H[���3��8Xv*#1^��ݟ�E)������S��v���mX{+�Р)�T�BWG�6]p��9��b��O�y8l��G&>�5��LO��Zq��Y��<���Wϵg���f[zE��9��(��yɺ��f�v���wdP��K_�ua���7?2б���/5��@h�XĽ������Y��8CBڨ�C�+��fh$�&H��<�f�@�p/�lbE�dN�)�k��`X�y\���p���h��w�M��=�c�o����N�ޚ��@���|�_%>�����i�1;��K��0��P�6$�hJL0���١�2��W9�>��
���B8��h�ɭ�9׺&��g0�OF�'��_�|�-��Z`3.�3�v���0��B��5�S�4F���L�H�篫�}�Iz97G��H����U��%���W�),X�M
�y��������-Z�a�Z��oм֖:�@ę`f���D̼ƏUϏ�g�
�tYv�1��k�bO��mF'
=pQ|Ҧhhԣ�:��r�h=��Je�6$	B��b&�E�G��j����%�F�h����
,@��1E�a��Pz�<���p��RXI":�ɟeu��,��I��>���"h]���PknTN�M�6̜������M,$����Q3
o�l-���ruD�4��;O	V�xŌ�M�ݒ�]���16��x����}�!�a�b.\�|�窱U�G^�π����)JZ��o��I�#`�r�4kP�^��o�Q7�<���F#x)2.��449!+,���J�Nٴ��;ۙ*lR�2	�|�n�D'"wfۿ4��Vf6M���8�#u,��8���7��⟰@<�@�	4M����I�P v�K���#�t�%����c�A��׳'�s6�3׃2�a��J��[
��Xf!��q���T�Dz�٦�f����
+���q�X؞:��pl��C �?���3 ��-�Y�	8Ki�0�
EL�����^�R��F3/&pڱ����W3^���t�
�L��d�\��kڊ�YP6!��|M�_MJg3�v����kz���k�xCc�bAE;�.�����P����CX#+�7��s�1�P&���k)�P�̫H��zD���$���#s\ksHǏm����@b��zS�<18(�s�Xn��?�`q].n�`f��ѐ}cL�P�A���%y`,����s�6�k��;�]9�M�)>��E�=匩�:-���#f[M��v�`́�4���/8�HΏ�ڳ�Mu%B����6�uW�J�sf�΃`ݦ
_���wzx��v�N�(�����)e�����̷1��w�t��v��M���Z��U���?��NA?+cZ��	�V�0S�u���L�1����q`�,�}x���]���?����05��7�i��{���`�;��Dsx��j�k�����~dșQ;�v״�5��4�:e��}�ΟeO�Y��(���!���.����u��ՂV0�#ъ�gq(ٚc���U����?������"���q7��oc��N�6q9���VT=Ƭ��o_>�����qE����i�/�U�kL��n���S�h���MZ�LA÷Z��w��v�s4��h��\���L�7��E���?.<��
;�x���؅54z$��V����15;5nM����l֟gWyQ'�ɗK,� �M���/���{��%`�,�B
�&�Qs#���J�9������ڻ.�F`p��|�x�@P��I6r��8�����f���|	�80}\�cy��6DY�_�j@�M<�o�;�M����鷙*�3pa[aY�%p|N.]������Z���#�!�)Ҋ �&6��I�殦��#���+�V��HM�:ET�=�0,U�㕥��UZ��w�ᐳ���@
D��3�;�pH�G�ôә�Od�V:��ƽaT�\��-T}�� �?V�t�cǵ�1ݡo���,�9�V'
�2@��1�Er��H~�� ������}F�A=gM�x3=��7
�������
S�v�%�p��Xy!Iӯ���\(���!7I\����N�Htg|�Tˀ�Ue���:Z�D���>�sA��=[����í��)����9v"�Y�������� ��L�+&Ϡ4oU�>W���h�W<���V�	_ڄ�B�8���J���.��V��z:�)J���7=J!0]��/����j��d�yM%�����<"o��q�A�c[���=c�I6R6��h���|�H"	z�����8�$�b�5�J!��H	�K.u�`�?8ЄSX�qډ���r���pv�i;��rUa�2=�{�۵Kw�rTS�X?�D�
I����WF�H,.��ˤ�>���X�|p��N�0���7�LR��H͉�3쿒'K��.QI���
�ƚ�YЊ�A�9;<�7�;s"�>�cf�4\�?���R�Ս��R��S�����8��g�j�F���^��1�����#�G�݄��Ɣ��M~ֻA��7o�0��켮�C�R;�S���{|��NI0YJB1IBa9�5Q��
������� 
�3%���)�tbDC���[��p��;���?����r	_�m�
�}&��΄�WYՎ��A$���p����"ܐ
�6���mB0���D6�1�~��UQēJ#�SU�]*W�M*�>�M���.ݾ�n@(�=4��;�U�0�`�sC'���"����_��B����<�#l&���y�����3�o�!��K:�T��^��
ƹ��
�iT��	�ʋ��"��ډ�.Ѥ&^Qg�EbF�AD�T��Q,�
�
����k���}Cb7p��ɮ��	Ka��.��D�F�#�*c�M�.q��vQR
!�&.���� �B9u���i�fc]�vµ:�_���'���6�Ǘ����s�D\o�D>'�h5�5��J�oV D��#�b 8�W�{0��h
�9\����Q�,��c܆�`L������BVl)��^~غ�
�"�[���կ2C��-v�}�5�:�٣BK%�H�ϱC�3j��O$WMm�f����Eү`�Ӓb�1��%�W�l�0�3�la�%G�(:��7�;��[
����
��'�a7��sI[bNDѭBڷ�~��ݸ�(yXTt���1������Ej�&�u>���让�	:?4˿ܼ�B@7�"��AE ��Y2t����%
vЙD4�h:��@�C4���٢��~Qz=�?3�\�	86���;�=F��N����ȷ�![set����dF7Q=�F5؏{fR�_e�l���
ĝW�#��渱�V�5�O�L��Ԯ7-��
��H��Cũ� 0*xk���JEg~��1��J*��#�}{v�0���߸��nQC�/�6G�B"5mzi��?��T�[�t�c�s�~�˖wH�'5��d�r��%�a�n�����Ǔl�p7�Ջf��z�{��Ћ��}wc�-;o�5s���q'��scL��poP4<��֮������Am�i�dY�U�{h�}��Tf�x=¿A��=R
��{qI+?b'���|���.�W�+�d��
���a`����a�q�XlH���y��E�,/��̍ku2�����k���(j�o&�ᄫ7��l���l���w�-tW�.��j��%
���B�(����zė$9Xy��~�U���a�]�t��/|���C�ꈾ��:5_�o䞵`�b�����dG�(qew�L:�5D��PKk�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�PKk�mWF�cf�)setuptools/_vendor/packaging/__about__.pyM��j�0��y
��[���.��=�t�2Fp�s�`˃��l�ݜC���~I��{GZ��l�� �Fe��4���-�6^�Q��0�-��%��l���jb��qw�)���e�=�/UdFk�r{m��}�V�u?Hd�Y��E�U�����>3�O^UL,����X�Œ)r����d;E�q�MJ��5SpN�j=���G��]�x��ַ8�:�Y�*|�j��$1��;�ހ�I�6H���1��,�ĝ;~.�0�L
dIWA�Y7�^p���
ٵ-�m�j���k����������Gu�o!�o|�Yn�p�w3�(K�W�Tɘ���v�_w0�9���d�PKk�mW�����(setuptools/_vendor/packaging/__init__.pyM��j�0E��
1�i!�2�.��Ea�&C7�7Q�Y.���:�7��W�G�6@oB�]4�mq�A;d�A�}�x�L��e��9X�N�Cf���s���� fxy{9�7�u���.`�(X!��_O-�ɡ t(ƺP+�3y��6�Ek�~"�S�^�Qb��U�4�l)}�*rM\@���+�����J��.Y�#|�a�|�6�����=�b��(`�Q�M���PKk�mW*:c��,*setuptools/_vendor/packaging/_manylinux.py�Z�s�������`
A�^�5qRY�lMeɵ�U�9G�*���%&���Ҳ���r�������2ɳ�ba�"�d��#�o��4��,nod�B4�ʪ�ê�Z�$w�He�(G�"KX��q�̳�K��$��cg�(x�����y,<v�� <���1�����j��,�D�Ҭby�}��`y̫yV$L�����C�z>��i�O��Z�*/�K+9��R0^�KY��u!X6W��:%ᙸa]�Y,���Y"X�KQz���XE'Hd
��E��'2�q�b���#�B��i�tۀ
N�����,Y����X
�`�2��=v�����_�>9?e��?
c^�,��S���X�#������<���'oe."��Xl��I{Ā�Q��n�ũ��K�O�3��y,#k?�g��(�b�����8�zP��X�4o�K���i�[+�h�7G�Ύ��o^��c/��������ACq|~tu���gS��n�4�~:z�s~��O��Q�ݛ`��.w�˫��z�>?z��{����Ӂ!9%����ٛ���)�OO'�3x�|�n_L�7��_�^��I��gd�.s2�U����R�!b�z��Dy3f[?��,�MhQ��<�u�IuHA��dZuD�}C���$��O.������R�&��x���ec3����c��߀�Y�I�=l�>y�o|A^�.Z�e)a�ovV�{!����zr3j��N}��$|!CHlDu~8s:>r���O/�ݡ��W�[���D{��d���(���x&�<f�8��G�j�1�*ҡ�Mw�6!����Q%����Z�Y�g�1� �
�9��`{����,�����Yy/^��ޘ����ΐ�T�ξ����_��=�����I���}�ǯ)�]#�P��#��~��5$� }�E��(!t�Z�����e6�?��|$�<��1�-)�?��Gy4mZ'��+��g�h�(it��t4Rt!��踪6 ���7:�X��NVK��"u��4z�)fΘ��3S���7p��๗W
R�g��Ǥ�3Ս@��w�	��A�ALX3�E��k=���P���<΀��L��S6
���:`K���FԆ����ZV�ǡea�C?̒m��@;{ۋm�!�G�Ѻ
�T$�=*k5�rd
�*�`׭Z�3�g]��/�v�&��˛��6	ً�s۳Yt�k-��Z6�`c�?`���ҎJ��y�<xv0t��z���n�?��#�T�7�.u�]3Щz�G������4vִ��:�V��Z��ؗX-%��ܫ��A>�tS��%�D�v�|R��9[�r2����%O�eU���;+�)��K�W���4�C���FI6���}GN��i�u��e)j�f�T�bYV��x7�J|�R��ylQ#�u�,�b)���'��
��C�(�D
�d�r��
C�W!���2
���yX�j��9J��sx�P[ER�xx�U��D-a��G|�}����q�����ݡ��
�e덋|��gk7��,��j��:�����n�c
�2�!1֗�}�g2b��'�M�:(ոc�s3vx[����S,D��d�7lY]�߬�
�b�����ů��^9��4s�
ܬ�����e�t~�ϰI���豼��p����"�����RYSM��	̶X�Nu	�D(��P&���fY���f�dQ�naP\0v=S55W����;���<�O��dw6ߛO��I�
�m7<�|��|�t�|�lw���:�W���������` �P3�&M0GG�?}�t���Q^|�}�'�j�A�n�@�	<ցv��/�XV��ÎgvT�vVW
&kq��1���1{�9���#��9���s�T�9�}�>��Μ���Q���A݋g@�_:�-N������+�L=8�;�c�6;#�\�?�\!�T�<���,���p~>F�L#B�*���Q��
,O|�$�\P��rJ��X��"tZ!�;��ʿK�rCx�.
�8&��)(����i"���]V�R�˅�>ו�G�*6��h�2�w�o�f�?Kj�n��*c�"�H�4�kQ���n��J�GlG����ݑ����}��'R����Bȅ�.Q��*U{��ƪ�1�#(n��g��"&��.{�ʣQ?�˪Ɏ��Q�Dٯ0�3|�E��5�h�NZ��IS�U4)���_�_H�6/<,���Z��G� XLy�,�P��/.��J�U#uU`�0��j��J��C]�1��N��UX"8��]�d�&"j��K��A��D�W�z@�
��K���z��X?P͡R��"����l���������p���j�̲X�J�\���[�x��1�qh�~�Ae�������I���g
܎���঵>9�E���j�AT�d���B��a���d/Q�V-�W�T�8!�P�=�����N{����G��:��D��P}��
�P�yg��qA�.z�Ge�lҜE�m���4}�P#8=\��(�M����{�A �=�[b`���ZC�Fb��b!�sF�A��E�V 1�D��HE��,CJH���3�<���[Ÿ�i()1>רT���-��5�n�� ��*\�h�C�Ҵ0m�g.�է���Ȁn��s�G����W�!�3�ڙL������J@?˭�g�l�@�=$Ą�q���[��z����/������x}/�=?�
���i��t����}��Y��fiG<0m�H_��96�ȪC�M�o��xջ:�d"��e鞍�ihk��w���_Y��������m���m_�qQ!�y�������{��>ۍ�ğ����hV�����j�ۓ�l��/�I;�.��k������`�Q�J-F3AZlȺ�>����e��)J�RV2ʑ�u��xt�F!V�	<�H�.�~���Z4b/y	TP�7��{O��5J63�n��iMc���M����6����p�h��xZr2��i���a�v<��;�0���2mRD�0 6J6�ѐ;'��t����W
���	��&`�֣Qp~�������/�g��ooᖿ71�}yŞ��m����R���es���g39���&O�=&;C&�!��>�}�c���طXL���� �&���t��aFS���1UQ���q��K����#�Hjy����s�+(��+�j�����O!��RM�ʲ �#���9�u`���^55����)��mz���!Y�@���Y�=-zۂf�m
���T�B}3��`����]��͌w-Ȏ6���[��r8�+�߅HF�_u���o�v���\��B�(�;{�ּग़]�v`
�eR'6�)��T�R�2�Ih]�ueZ�4KiZ`M�5�[�oF�]Jֲ�Ah#�k�5�I�k�j�����I=p��F�����n1
�5z��^�p1�;{_����
8G����^�}��In���g�G� �Ͷ��};�b��XCj���o$�-EF��F�k�͎0$�I/†2�:8�z�Z�wP��;�uF�	��otf��⃄J?S��������Y��K��3��=[����YI���^!��э;�9|����fy1�o�b]��Uw��=�V�C�m�����z�@�m�k����u�u<��/j�c9�PKk�mW�t10*setuptools/_vendor/packaging/_musllinux.py�W[s�6~ׯ8�<,��p��N�Y��v�5�&�Ƴ/���HPšYL�f��{��/mg9��p�߹ ����k�8��6M�-�Ln��@U�m)@VM)*������l
��"� �[Y�5�{ЭRRm�zo��i&�T�"��RUk�)p�×-���Yh#�ih���$���Ţ.��ʊ�-�[)Z�ٺ.M�P7Bs[��aG���X�f��ծ]g�N�������2 ,/>Laa=�)���oZt�>4u�h�[�L&�( Ղ�i����q1C��
��BQ�)����=�R*;��j6|���VAY���H���8�a'�ef䯂��$�7\��yJnMɜT��H'��}��dt��>�.$����q:�=k��;W�D�Z�.�x��1zP�l�m��x#�ei��euu\���8?9�=o��_go/�����3.��(�w�.z[4Z螡�iDfª�u�r�"���m=��<{y�mϘ��lk�����q�Jܗ�{�zd�8���8N!:��!�b����Z׺�B��V­a�8����
�2Kq�����M�F��,�g^�*�	6U[2�=�5�����"J�p��O���Bb
#��϶R	�~!�B�FNx"uX}W�
���5`�l4�B@��l��Al�:+��Q�C����K�z��.
#�����מ�Sk�%N=3����>='3��>WWW�m|�_�g�p���P�קGkiو���?~��StO�>��y��8S[�0��VC��[�/ �4��mҍ v5�I+*\��,N|�^�;r�#��+zߓ�$���UQ�;��[�-:~J�V��#���j�'��E��
��D�As�q'�%"�'
 ���@-�dr89�Ȼ�!�:4����cc�����Z�U�`�{��]r��l��I�o.�s=��+�xhs�w��0��
���α����$5�Mݾ���^�����[�A���<<:�d%7ҟQ�}u����Z��������0�B����6�u��PT�c����a��He�U�Hүy��4���&N�ZuU�*v;	�
N	���ժ+�ޟσ�RF�e1��:
�B|��Ln����⹞��N0ŧz�k���yu�^�+��u��'T��wG˧~Z��a�b�n���̍���>��BЏ����p�VV�Ar#'��h(M�Rvߍ��e!q��+��+^�DJC&�T�kE���>�FeM=�:��+��Sʱ"Ԩ
�E1����M��h��m���+a�$���b6����U���Ezq��f��v�N�?�C�ɉM2_p�L��r'�'KCcܠ��:{�JPw�	J�4p���Î}P��Dž�ç�?W�5�����y���N�w�H��e�����=�]/�/��*I�e���j�݊d�JO���<�n�nJn	Z��s�m�|���_BѲp�w+-F�j�k����
� #��5��{Y��Ȉw��kE���h����K����g�Þ��ww�ww3ox>�#�c9o+���됍����d�r�)�ɮ������4�|3�҈��G
�3vA/l.b��G%7Y���4h��u�p�!�r�K��>qo}8�&Wg�i����N�0��@���kOC��[����/�^�'���~"Ma��'M+T-M#gE����34�9���n��]ȍ�<ňҨ[e�.p�wF^hN����RG>�tň\��g�jj4�̰��o2� �h��5����P�<�0�8ԑ��)���;��hzO�����QDW��6�A4�$d�*���~PKk�mW0��`�+setuptools/_vendor/packaging/_structures.py͓=k�0�w���YpL�h�)B���B�϶�"�ҹ�_YN�?�d���t�����������HQY̠V���-�ܿ�T<uӦ-���Z3xLb�*�e���KM;D��Y�����yC�׌�Բ�	V�
���x�6��c%�2$.�M� H%��*J�i�p��C�"�2���,��s3Rm��pt�%�e7)��MM�lіͻyI�t�uf��_�����#��{���S�
e��#����'���f��d1�ɽ�{,&�8$(,Έ^6�b�I�`W�pDV9�.����*���v
=ٺŝh7����
	w'�跘n��vc%:��dC��l׬r�PKk�mWX�Qx
-!'setuptools/_vendor/packaging/markers.py�Ymo�8��_��"!����b#.�v��`�I�0V�cmeQKIIsi���DJr�+.b�����gF/�6��&/��uKR�+k�&m�f�4[F&v5��2�h?'�,&7L�9/'/�O���r-��_�jhrŘ<9��8�Z�K9&8o�l�@���y����pA2��
�0�f
͋:�L�]��TLP���y�
��μ��d#��4U^�=</b��T���Y��5�?�0�1�n+��X��JJ͚�j8e�pM�T't�CB^���E����_&�~�➊u,_�!x[�Ǔd��iMN��c�/�Z8c��n��V#��a�F��j�_L�sq�Sﵜ[�k������'�6&�+��6�(\��"__������$M�aiJfd)������Lj��#��&/�ly��Ԣ��/w�l�莙y_�R09e1L�&�s�������,���UL>���$+h]O��-[�E4U���������$)��]�p8	1ik�Q��m��8�����bqA~~�6�r̒#.���UXþ˵iӰ]�L`��;'�6d�Y]@p��ܵ�yF����Q��0�[���u�4DwC�8-�y���NR��[C����EA9��y�7i֬���)͈�z����$�r�LQN9��Z�d�׎S��%��������M�Mp�(��T����Jӧ�@N=D�N.�L��o�O0�kV6ǘ��_�W�-�[7:�!�-�~�d��������A���������x��d����q�<
靺f�H�E
��������R�d�y������:���lt�9�ܘpG��r�s6�͈@�M
�;��I�N��D��^���?{��N�(��N�ϓY�'۳U�L�i!#�Uƹ�I�ni�Љ�Z�N<dj���'���ۣ�N�YSb]���QS�xjJ�aѧ5�ri�X�v�.�8�����O�`&�c	A�΅�}ZSR�0R3�Ҕ�mr˚�Y����G������Y����=��6�z4O��ӑ}za����Y2~X�t~���2=��$
^Yyi8�����!v����GLX.�)�;"�����m�{~~"��\��\].�`�E�w9Ku|�82�=C��tn;�X/#��[J7���'��řR:�Q�`uF�Kg*��z�^�=1�V���9��U����K�D-y����+��͡v�'��K;z����p�IP�q&2�bm���@���z�*���e��Z�[Ӿ��3�@�`��eƌ�ث��-��"�dq�c
��r+j6��)�Y�2h�*����z6FI����BL�$Yx��E-O���������2H�2��v�\L�BVk��р#Ҙ�%��;��;���l��m1�q?3�\�F+r�ͳ-��@��)��eka�[&T�G� ���(��Kɓ@��prX���%���y��ɪ��]ջiKy�H�'0�9�{H�D�a%�mM���_�6���ݺo�r�%�:�`����lF�x�	2��.���a�BIJ����S���%��.��3��B��8�akC:ev��0 A�'��P.�1���2���D�>8�V)G
<d-wI��֬���RQ��LM'�
61Tl
�Usr��u�.��:�X�I����+�kr��uȏ��h���yú#�7�3���/���P��o�7� Nѩ�Aa��V��W�e���!0�`�Q�lăS_V,o�nG�M╻KR�JG?�}�AӤ�ZA�ڿ��f�q�\:��>#h�����[�,_�Ȝ0$��Ъ��Ml��y����4�GL�B>'�VQ[��&F�a�A-.����Ef	^�j� �N�
juy @�6�֖�w�� In@��M	�J�I��hr�2A�^W�[,^���zr�<!��j��:V��o��x�Ύ��;�<��g���-b)�,�ɋݷ\�VJ��T{�&����\�C��:��ެZU�\����Y�I��r5���*��L�uI|a���C=aZ`jzXc�#�iP����,�G5�����|}�㪉N�����S}���k�ܥ�c����,}b�eϪ�}M���+�f˕�h�Ң�iX,�]��Ln�0�m�p�H�X�cA/3�)pk�J�?9�Q|�K��	�$j)W��s^b�āD��
v�
���I���f�Ù��J)[���W�we�H�=�F��CW&w��y]�L�D�T���YC.�q�}���v��c��<]�mq�L?�j9s��͔�;F�Mѡ�C��G萫�q�Ζ~gʧiz:,~r|�}���;WcZ8��D��=����-�?�\A^gnJ�Ɲ�z��D}�
��`��C�����3�X��:��m!]�8iP!I��~�W$x���9oc>�Ys�`��H=�/
��`�]�/YR�L��=$oW �g����0���s�|��>�c���[
Yt��4D;��=l$�,Z �ڳIw^*���G>FA=��j^y+�n!��D�-"���2��&"n�7��V�����!�;�e�����t�f�%_�o��%���z���$Y+N_ȓI*�3V׉�&��i݋�;z��X��f�����E~�A����h�_PKk�mW�X��\,setuptools/_vendor/packaging/requirements.py�W�r�6}�W��ɱ�I:�LF��02�j��+ɹT�p`��R�@�]����@J�E/"���݃���̮SA�i���
�H�.X.XB6y�8�׌H�W�K=�t�������ȝ�s�Ch�h�7��J& S���ߋFӨT��9^�`��օHe�,8Y�u�$#	�4�D�8�j]p	��KH��W�hó,�֔�,y�"�n�uR�R!;d��0�RAfՠC�c6	&7kYP�nA@�����r@��u~�bu�欣�[����:��LY�.��5sv�n��ǂ'��Ƌ1�.xz�f���L�<��SI��8~�O���OUe�0���&q��l�!C�V
�5[��Ԓ�+���V�iϧ��YdT�Ͽ�,M&��&�l�r�}�نE���j+]��a�H��8�Z�܀�e�쐍P���b�)���ʂ�Eg䗧/��q��o��|H�5��!"�b��1�H*���� �R����I�{Ͱm�s��f��L�w&�ŋ���,�D#��YK~s�7C��i�L�a�7��}/��ai���sv>����Y_�Ӟ�O���i4����A�N�X3�x���,UR66��� GVxzM]>���۶����]ѧ�$l,9���}	<�ο��#�\\gl8���3���c��?U���5��#�T*�Bԫ�������ܯ��q�80��M��'F�=����� �j"Fpu��ߌ��~�A��h<�z�4�k�A�.�}��Zw�?��x�"�e��TWK��g�H�%����i	��H�JLjcd��+E���oi���bNob�N@`\m��E=h���K��׶����R�<��i�Px^FW�	%�C��e�Ƞ6�y�b����R�>����;�K����Y�v�2k���dih�ڊ�a����9<�� zP�f��cy�j�4���2�N?�"�v���ʱ�2�����=3�677��GNg��x�~ޟDC�
�ꬲsyս�Z���N�	gK@�*<�VW�$����P���&D�%z�
�y*S���.�D��I%a�����?b�����m3M3c����/T��֪�u]�B�]O�7�}V���,o�[�%l��.A�R"��fq����1��Fߦ�3i2 �
����"��K�dwO�֭X��[]�U������q��h�8�L�3�f�9h\��0�>1G��&U�M�OJ0��/�\7��I�k*Oȩ�(`A+�W@Rw��"!F��@�
�64ݰL7}j�i�O�G�zYlLو��s07*RL���m����K–$�U`ű'X����Ɔˮ��'O^�Q�3�b~����:�H����n�[�V;�`-
*0���
)�[�e�U$ ν��ڜY�@f3�G���O���{����a�w��*PDjr�5����H�z}G�MIc��G��^��o��vk �v¡W=����o�or�����O��W��rN']�ܦ�,�	9eޮ�*�ٜI��ʺ{�
b?BkŠ4OlשGZ�!JZZn�Wtm�{s�����F5����ͪ��.5��d��z<V��:��H�zuz~\fZ�!��	W'�n�q��5��h¤�S�TΚ�ʚr����Y)��F'��������y}�.�F�<5�Uŀ�a��%'�7P��'�d�g���� w�FO�0�߷�t�l۱%�q4��5��=H���m�kr_ɵñ�(�j'�H.��Ǿ�-^������9J�![o���l��ٗ���U<���W��7PKk�mW5����u*setuptools/_vendor/packaging/specifiers.py�=�s�Ʊ��@�Θ�i<ۯ�<=S��͸v&v�y#�,�(D��h�r���w��Á"�I�h&������v�V�ћˬ�.�\E�*ɣ<KUQ�y�*檊�K5�����><]&)��Gߩ�����0z?GI1�a_��ڌ���J���Ϟ�|�\OXг�,�
TjY�YSV�wQVQZ^/sըh��$��� �^�U%��z�*Ҧ,��<�c�A��o�*�bQ\T�u�l��!��
"�y��y2�՘>}��
�v
@���	�O/�Z�z�l�I�IW��J�y�Z0o6K�]�����W��F.^5�b�\�e��I����7��<N2#_�E�n��
Gˤ���7���~Mx�3;�y���o�r���n���I/�ѿ
�7�q4+��&�,��	��Lf�a��9+�)P���yR��iq���^�4��T5�.�W�yU��蘈=�O�n<8��h��
�l�j�'�/�U>>�@�(�o���c�L�UR�v�k�Zz>v��~���@#�'|���$m`�e9��suM��x:�*�ENp���D�Uͪ*j%�T�ZM�|hˢ�}��r��J���߂�k�)ȍ2����D,v�aM�I})��E%���ޑ:ز�}�Q�Ԩ��VWk@�2�]���-�P��/���i�u�l���R��'h߻V��J�fc�SW
ШU����3�����x�(�e�/a��!�_��0��>�|c�^ �
�a/�c��c�,-�eY�0��K~ܷ�OZ�pd�A�1��X����	Pb��;8�k��6+`����9�J�a1��R�P|�B��tÖ f=d뎭�;s5��.%���>(a
�I�p�j \~M��L*�:�K�D�o�e�^Z`��w�������u��g7�I��w>�vzsZj��A�X
���GS��zl|�3��BAeE�X��������\�
�uҤ��5)o�d2���!�ف�w(P4�}�$�U׺^N}z��>������r����h�xQ���p`:�08[G��!
��F����l��h����Z6��ޚ�7�9N�)ڊ^��thp���M&�|Q}8o��u��ҬP���n
�ԩ�@Ox�锄`:�ߊ�ZM��^��&�8:�n�b��?|�`�a�G-����l�Ժ�4��1Tg���CP`!�z(�<:ɵl�^�8F�p�t ��z�nf5ؙ&)R5�Ѵ��+�M�q����n�o�{F_�F./�'�e�W��eٜ���\5��T��Goo	a��-tiM&�V�A�j�N6�_�B%��Ǎ5���!ǝ�@bZ�re���L�&f��چ�ry�Q
�����bAi���e[��q䟧p�Ω��0o�n�j>I�����GC�Լ�Y�9�����=��‘�>P�*�@z�i/��ܱ���zC��Zec�Ԁ���[�_��>�z�����Add�i�^02�\(�jp����Xr�g�\��K:ߨJD^�aB�8L�A��=!���U��/�%�%�PTM�j�@����u����d�xЊOa0�O	��= 6+@µ�z��HXJ����DkP󒔆��o��!��y�Q�U�*k��\d)�n`:��#�WG9D��Z�?�в\Ⱥ�9�k%i�4m����ü����t`�撂�k�&`ɳE�?�ܹ�A��X��|��V=�i�k���h'�d*��<O�6������y���U1`p��uG!g��7�J}t���5�B�D�N�7xN�s�R���`�S*r!̕8�
ptP�ʘIOb�������i,R��������B~\��GGGW�Q��;�N�.��>�p?���FPD5ҀpbPW*����5�2։9лBB�(��jF{Gd%������ �ΛD|�>�a�^����89N�KU̻.S�����}�s�-|Z��4�*���+}΃\�[����H�xH��Z�E!��:���rͱ�e$m΢��
��U�<X�+
+H���"���A4cF��8T���o���̒[g����K��	���-���������.-=�ct��:<ŮH�F��U6@Eџ)�*|~��cLN������'�����D��G�;�ٳ����]=:?�`K���I4�	�A+�m��,-�O�;�>Fܙ�W5��n�a���
��z��/n���^&)*7���AZ�eA_^'�������K�4/k�4pW����E�mU�(
9�BBC�dI�7�N4����44lS+�w���v�l�77\���d�%T���N���%�K��?�8���~����?����o�?{����u�n'�L�
(�1h)5����L;_=��rU�St"�Nh��Rh z�<q`8o�/�/?��AW`��Q���,a�Mv:�_\S4x��#O%��N��a	5%J�U�T�4��x/�z����K�B����Pa���^'���	g;E$�7z��(�w��=&�����,��eU�a2��6L���c�*�AB����Ϗ�{��I��G�ɞu5���	9?
�ÓO%��@�O���G�d+2�I;�U�K�o�Eq,
<�_����É��.��UC�J���B�߈,>Y�9
����P͟dպZM@jc�[��Ë�>2
z��8��&~^��ɭ�#��P������Ё�
��XM�l�ֵ�%�`�;�:M��ˣ{�'0u`󒆿O�Ƹ���c26�
@ԗt������!萋�Ȫ�N�ee��E��3���!��:��!��V�F�*A�ʇ�L���Sm^V�pO������~a��#L��j \juW5���7���:��m[� ���|J�	���?���q������k.頌?�E>���6(�ku�ַ;r��$��ǎ�s��]��L�#Zן#���3��s*�x��r��5�
 �8h�7^U��P�6�t��6�Z�P<�i�o�Lz|���b�T-KQ�a~x(��.�_GG4Z��!�HG�zߡyL���]l	fr;�Mo��6ɗ��A5�-�n2��g�HK�Rk�Vx=e�l]��@S�I���[@���G�Kw
�L��T��b+�y����`�8����r����T���P���[v�\)~\�CU����vɀ��Җ�	�;���Y��Æ�>!���Ɵ���w�#R��x��h��h��;���t�UMFeSƀh�d���
U%γE֘0v����j��^��U*Q�!	`��i�����[���HlP�巡w���
��[��H����;��i
-9l�^�(���F�3,9}~ü����R�^ߘlj_��Q�]�	��RǦ/��h$�T�ltR�/ح��M�I
�H��B`�a���Ő�7F��^Ud6;����=�a�ީ�w��w���/J���ޭ�Q��0�Ɩ`'�,k��ڸ!�?�ň�ᬖ�`�a��a�uMlJP�	���$9x?�̲�^�9���:��a=��-Y�A�'���Iw�����H��e���c� uҬp/ⱙ�ɳZ�.! tϭ�l>�F�19�|�f{���'x-u��l�ʵ�&�%1�je��)8����wrM!�/c�Z����€zu����^����L<��/3/g�gu3�����Eu��Yg���2\���q�����s�bO�saf�|3c4\F�
� �t��N>��AO}�S���8v�|�~����y��F{�^o�?�{���\Fs�<��5����+1и�c�	��M�Sf1*!)/|`���<�^V���oL�V�H�\��,y8�Ff�yX����z{�.Q�Eov$+����EN'J���ǘ:n֘�K��>��{P�������?>��ු+�klU��H:8���SR�WwX��%�',ۃ�����h*�ˣQg�Xߨ�ޥ��N�\��b�a���hi
b�F�+?T�ƒ)�B�f{�
�W�Hd�%��G�yΎ�a�;�s�ߠ�Y����B��U͡�@�룳���-�<xL/O����It��m"<���W��?�����&��v"1�/u���(;�ɠ�Ld��-�xU����n���ʼT\6�c���Ux���0s�؋�!�J�ϱ�꬘\`L/w�k��y9x1��pkN~���F��&9}*-l_^oLwH��g�_~u����na�2/_�������-2��Ç����	q��8�1eR�"�/(\bjW0O�y�ތ}Joa,>���޳�����o��'?��[-�Ƴ��#����k&�?�	I�a6�京����sL��;��N�\<��5�]��
!�Jm��� �F�ðI�M���	�� ����������@��D��ރ��N=޴2t�b����\�xc��u�K�v)�0�^��&Q�
kJ��ց���=��De��ߎw)�&�a��N�e�
a��Pŋ8z���#]�-��[�|���C>��n��C�j�!/���u�R�o]�����`���NɬwE;zj
�eCtIۉ�N�B�Pz�]G��v�����vw�u ��<�yZp]F��?�@��Ք�Ŀ��:�h��nvTUF�}t��Z��Z��z�Tae���ۢ���m����W���r	������Y�:��z�MK(t���Bg���9?�q�Ŷv匆���߃�b/]_���%nS!
�ϩ�.�x���P[
��ý��w��ltQ�ׁ5��jl�-�jjW��b��EAn��]�G����<��,��b�]�hz��@U�G�6t
"�Ygνk�Z�����s�e�JjT�i�F���`/g:f-��Et�q�1e�Ɣ�S�o�I�s?j���`���P��y��;�6��S3�spĻ��7�vn�I�ajėhg��<���пQ\�4�j妃�eM�K�* �=(-]t2M6�,��S��'��*�P(�Q��)�}{2�C�F�<6�#��[����-�����Y�C�R�*o���|�B�arz�1� �LazO9؛�Sܺ@lP�����fE��z(�ͻW���h�Τ7��6dq҂C�)r�K���p�<�a����R:b���Ҟ�?3��J�_twt��[2��������h�$F�_��"�}
�?�Ǝ���/�3;~Υt.��LC��l�\��I�8z�G���ј ��v
�>����\L��
��&>گ����{��G�Ҿ�Q9-jsr�āIp
21|�1x88��@*����Q����V� 4�Ƚ[��Hz�d��4�M
��	�;�j:���:�w)�k��wm�����s�`����'z�]u{wF��
j�h�掍dͤ��
�4�OF�b��࿬)o/Eȃ�I_i/�6]�jQ����x0"͌=����C��`���ZdU����!���x��1U�$H�;ꢒ�P8�ƞg�{I��T�T�7h������"�g�A��(�S�	���|	[F
����	���wQ�?�Mr�1�:��%�cF�;���&Ҏ�: �����\��~&:���ܘ��#��ŜN��N�?�]���>K�ı�m�1]=���Z
{��#y�sߎ�AN�;r��\�oW��{�14-r�B��6����^�U$��hI��5�%A��u"B����t�踲��n+�oAc���;0����uԾ��߭<�KO\�fе,x$:q�Y$[]p�̦�:����:ڨ�����*tH�P�}w�P�ПE�:=%O�gIpL��kT�ԣ����v<:���Ol�M�N��w8b]�s훵�:�J��[�)ya.Fn��ѺS��b�6K�#c{��h�R�w��`^�eI{�!]���m�ܨ݃^�d#�
���‰p�B�\�:�-�8����D�v���gd;4��kL10`~�J�f%�ӉZc0��O�M�uu$
���uw'�� t�M[�֠6�a<�F���c�]��c�w5��W��H��P#N_�{���)��0e���<�t���UN�Ox?�xi$��U�{8m�۞v�.�?W�׷��[&˂2Ǧ���Qf�(/�+ ��@S)��]�[zm��(�] �[% �qs4ф��s!����l�;X�D�ɢ����5 ���G\|�(Z�$�L��T4%��	����^��D�HfitY��E���N ̘��<�/��8m�1g�i�[�-��J6�ec�]EJ��)�4�wQѻz���gv����h�m@��8y	�#�Ul���fcn��6�CrjW���dS���6������?͂%|�M�*`��-��m�<�����+K)$�+K���WTN=����^�^ӁCC��4܎Ñ���U��T�(�m�$����:J��b�d�����z~��'z�
��5p:6֌l��\9�b1
�$�n��e�=D6���K��>#%�sT`BDԤ�2[&��*�S��B���E;��K��DU�"Ek���_�00��<�m����R���q�:N�+N���;�L^��LN4�̙���݌���J5C8ΊXmB&�ˑ?͓/��-���=�;`@��̟]>$��:(	'aw�Z��浶��2��E�
��o��y?�j�Vk����$�T2�0��EK���ݭ�͚CKߩ���n��2#��A����z_.1S��;CE��(��,Z���KX�E�.�m��'�]?+ ���l.3n���c�>��M%3�PKk�mW�	ms�S=$setuptools/_vendor/packaging/tags.py�;�oܸѿ�_A�(�
vۛ�R#N�$N�@.6�N��C�%�͜V҉��=�{g��D��G{�����1�=C�;��-E�|'u��T�<�<au��U��U�\I�/�f��b����f�o��"�&l;؜�(K����c��ᧃ�������=+�R�����U^��2/Y����W�%��D*��D����X�_\����iT�����ki]�y��e���z���`+/���	�wp�9<������Րj]�Tʟ0�� �jFW�W�s}{��Sn����'!5�aQעT��_j��z�I]��_2�R�q�c�ER`�	WQ�NEV��ຖ)]O&��߮aTp��O���,Z�0\G��2ϴ�r*��l�C���*|>c�rr�d�ǣ��3<���Ǔ�����;ĚSY�3g0��4���Wތ�
�W�q���-@\x33�qH�D�y�B����7@?��L&�b;|wpZ�9� �)~���.�fϟ��6��i$%;�.vFϣ�=�˒K�UJ͘B]����Ո]_r�����3YE�Iɢ��gR�=�]�ժ�PA���
�2���4`����j���Q�XG�ʜɺ@��$hh��0�i^�0��z!���@4|��0:�m�npN�L�O�p�LTa�K�.I��#y}e����߲�y���16@�u��5h��>GޛY�\� 7��qX
.���Wh�8	L�)_� �D���)���]�4e��*J���88V��W�Q�$���T2QI�5H������W�⠄�TA��U�F�(/����+���U'c2��=MĊ�#�`�?KR/�?�C�%��z�"�Bi�����ч֕���Ȋ2Oj�P).2�0;x˂�.hNe�_�B�<Z�.�+�AG:�q�~�~Of��gqN�J���֍FZ�	#i��*��ˬ�oca��`�1��Ǡi’ec����r��V~����:���%�,��(@w�7�i�}Դ����W2Q�y2�R�;c|[n��u;%5�G3�Eעb{�{GJy�|�=|����6xi��!�o��n��+��i;rj�^��Vp0bDpi���$��n{���o��5׆w�=Ƙ��xC8��_حH��[�3!͌J�Cp
>�o=s���Spc���@ѯ F%�|\�k�^�3p�sH2�N�_98�%!D7
p2��R��\���R�_j��/�Xh�\Jq.(ؑo5Q��Jz�wA䕚*�8����:X���d���}o�!�ӶBAd���,��=�+F�c���C�nhb�DI�s}LJ��l0N�
�v����T+E�_���**}�t���l�\p�#���N��Fv�6*z�9u0�]Kb��A����fl��r� ��뙼��0��r�g��S��1����w�:Ί,��\)d7H��,6U�9���_9Z8(���Z�i�иz����c�fR޴}2�O� �E n.}���W*��aNމF�?��WP� O�D��5�JT������#�x���])+�LX@E�8��kQz�)�:�N�[��rV��ow�����f�:���G�<��X+a�5�E�V�)hgǴ\S
� ��E:�J-���L�s��`�H��B}��}6�n�3�
�᲎�K�Ҭ��,4P]����w_��+�f��/㼆ԋR��� �Y���C�WQj���`?��1(�s.�g�X�l6o*b�V��D%�P�'���k V��
�
��&�B5а�UUȝ/.`��y�^@��(D�BHYs�b�x�ؠkx��6�n���W�n�S"��$(։��8Pzk'bq�[��c�N��fjyW#/�rK�ސ����i*K�=��tp�}x��>}:|��զ��T��\�oM�<[��E'tԙ��\V��*��������(��hv�Kb|/H9`�,t}��#�͛�͏����{ƞj�n�
��-��C�y-R(��fQuq�G	�;��:X~��0(����,�}y<��6�)�p;��=xs�%�ҋ�[-�;m���!(Z�mΚK{�-�����xw����Q�\ڽ2~����!z�\̈���цAE�
�^�����N׍V�ku�pl��g
,H�#W�B6�����~��M(`�V�@���QYtz)u�潎�v_BE�H}�K�pLz�r��
,>�rގCb�~ ��C��ʸP�p�����u�I�<f��U�j���,]c+ K�-,Ȱ�YQ��nE
:>o�H�$Z�Jˁ�p
��9fh����v�gH�34:
��03-�)�M��E
0���Dɔ�3j"#�荰�֥�9��`qS]ew����kT�Ф"[�"L����{�%62J.L(�*;�Ex1���T�6������g�N��]
6���@����
$���@w@C�y�:�U�(4:���&̈�.��r�'��U~�}�������e����
�~�:����]����E�U��p���N����"�W4XLRHiC�_*ֶ��!V�|?>ѣ�=q)�
j��l
ЕQvѭ4N��n���|��v?�p��	���@ܱ�.��g3wA�i]�Ɉ��e�V����\��0��N��>Z�{LJॽ�兺*֯���
��6opv�خw��S�ħ�
o,�,����&�E	�6������dyWu��6��C�swb葵}��hg��>2v�S����%�Z��:��l�{&�9�����@sk�+�u|��������C�g�8��HN���ݬ�M��a��7�ˤ��e�`0
or	|F���E�3��9�)I�KXɕ�k�NO[���9yfO�U4�����~��M�:������k��zAj>��)�Jt�R��J4lgU�޿Y�=�C?��>��J}ʀ���Sm��>�Y���L57�cԺv���H%�f�Á�m(���W�M�˵pø߾���������`O�^�'�熆��h,��X<�[��J��Ů"�/e|���2\l���� N��[�v���az-�����&�UTVU��"� =�O쎍'�_y6��"��u��V�7��=�3cqQ����z4�~���j`/ϻy�*|��s�S�/��9c/�7�uQi�P�.�O=�j�rYF`W�m�LW�t� 6��T����@8+6�������e�btj�y^Wl�=�`GG�Hp|e^_\���`��CKy����)����39���}�f�����:�G{^0�[/*WJ�Z��vF�Pg���mo�F2�*23bR���Y�$f�U�i�C�k|��� �a+�2ġ�;yd�F��挅U�I��S*���WM�W<#�8�sc_����`Ֆ���ksXHak�~9�|2�����Wי��?�B��b`&�w9$
&�G%�:��W����j[W���uY�Q/�
��&⒧g��'�P�W��2�z�J���2mS�����iKݚ�:@����nS�ŭ��2P5�E�ͬl�v�Y��OF��1�}��N���#�A:@��Q	�A�SI�4�y�*8U��]��+�W�P�(v;�XG�u���;�Ej3�\�Vf��p�9�n�5,�b�2|��;��bK�u��&��MxK���o$���t�h�n��]g�3��]�n���5<�זcLz��P���ʠ�ȶ�d]Ql�Z�ԄJ�������
�H9��َ� �q��b���8�`�J�Y�ҟ��Gg-a�<��n�H�����6�V&gxs��p�p��D,�<mm��d�{�;��Bh&a�2kk*�O#�։��h�����/�+�����n4F3Ԙ���1"���Y����9*da���*�i��zh3��#.w�Ռ-l���m��72C�
�~C#�?eH.��k���ul�3�ct���H�t$����߳=R OƓ�4&��<V����@	A�pH�У�5�p��]�^KC,
>��r�=�I5�x���J�.�M�!<P1^}�*L��$���d�!��[�}��R��Bӿ�j��3���3��|�n͵����&۸\�o�	�@�x�Z�c�#��Nr�i�����Me�**���!*�Ef�K��nulʏQ4��u},=�c��5��;^N��,R\W��2>�Z�0����5l�6m��Țȑ�͡���i��Р>�f����{WdE�G-�:��2n�)�΅>Khm
�)�P-t������A2�-wOw뀢m�}ώY����ĺ���.�B
�(��=�!�X:�!�7���cʩi��V�i����"ϰW�C�
:��BAk�JNv���*��a�t�ҿ3�����G�(7��YXFn�X��aG�\�9G�Z�;g16gg;�Z�.ZxL�?��PKk�mWA��3�h%setuptools/_vendor/packaging/utils.py�W�n�F}�WL�"c�p\�@.`�p��IU�ɑ�	�ew��/�wf��)��KZ����\������=��r�b�1���P�Y!Tk
ra��)����j�>��B��$Ef��^�odb�@��g��N�/N��ž))Mm�"PXJ-�T�do!�r]�h24��u�yb]JeH�[(�s[�b	��wX\���7��%ExY��>fi��W��&Y�F�2YFP&J㜎��u�\#sZ\'��\�]���J�Y�������̹���B�F�f޹Tk2s��y�FRq���oB���<Ѻ�e�� �	>'y�'JIN<����
E]+��5,���J.��T�2��U��.���'��𷸵��E&���4k�D��gߓ%זe`Y��!�Ӥ��H-`s�K�!,��3�)P�t<�g�~H��r�P�#\q����Wdx]Qh�$Tߍ0+H KabonŸv[�f�a�}�Q�Dd��?[F���h��w����;`��}}�k��5L�w$��*���)�(�s�A�VM��Ta�=:�j�;�v�����幅m.�aX�&
Ҽ-�"Ol-�j<���|�V��@��
qA&Ty,R��l�6�-�.�u��c�I�k,L<�A,(QP5�T�C}��`�e�m��_��g���a�a+�7)��hd�p����5�Z�]!-�W!�`a����ֈx��h:��<�A'�LW
�R�|�����qR�Xd�¿�>��m\�s��;=;��Lp�������~�⃑�R�yz?x��ýʷ&>�_P��?��oR�nB�7<\h��a��Q�؝ne\*;��s�G��vHFz��6�9�G����}O��=^c.K�v���y^H���8�t��T��[��ٿ﫴n\'7�Z��^�jgм���j�Y��<K+���櫖~�Au�~J_g�I����)h�d��f��=�ޥ�9Rwt���nT;A蚏��(��}#���R��q�q:���,�+ԽG4m��0ÇM~N�Ӥ�
�"x����Q�����rQ7��95��F��\�z.�p�pXg���@�Voz0s��[��ZZ����	c�ib=�(�
Sc�5���ψt���:1�x�����,��^�p��JE,�����OB����~8���)��ˁ
��k�h7�j�^Ͷ�|���5e���l�E�w����ә�f����ϴ۰����9��:G��J8L�bJ�M�	m�A/�x�dU��0��y�����ml�5�F8�~�����8�Ō�]9���j�Ю�8����]GKl����K�ޅ���>��g�G�މ�6��l��^��x���~5�d�:�_��&����=E]{�!Q�V�]	���$tt�s�t�>�ʂ~��.FΌ��������Y�~2+���Q,�Vi.n�j��D&�>�oR|��a��N����<qB�PKk�mW2��I9'setuptools/_vendor/packaging/version.py�[ms�6��_��7��yvڻk5��4�u<�s<q.���T��d�ɒ�m%��gE��lO2��i2�H�.�}�#�]D��E��;]�X�Q��BM�2��\�J�*_"��ËL���Z�
�{�Q��v��`o d2e���^Y�@�)�/_�<:9;2&�.O�R����"*�|z�4a��bU*1U���"�E��%F�X�%�.���iW/re�]�<��yћ��B��Œ��q,'1�r��zQě���x Ζ��	^�[f���֭)�̗a��Ua�'�(��ՠ��n��D�e]��x�
��z�1�Ł8�2��ψ���V���8N�dMko��=;~s2>}�����o��9�Q�6��|;��v�;��iZ���=7Q5A#�sHc�.G���r�:
e�
)"�g�k��>]
xD��_�Sñ�:gD�:��ET'�Z�k��F����_j���؎*�:�
�+�+60�֌�\�ixwh�Q�(�Ḳؙ"M��ʋt
,k��s-XM��fS���6	�zc3�׬7H�BMKb��Sy��{���r�b%�L���r~��(�oL����^o�f�m��i
ic}�{hxm[��:j.<����Ts�~"="G>��]�`��P�r!�0�eQ5��7,�ɥu�W��dJ�1M4�;*��l����T|��^5�s�L۾�5��jX)���pa���	UF���XZ��2�z=^f��^�Ku��i~��i�j%��)E$�e�w��H�1I|F�)�K_/�N:�	��0<�T��6M�1i�x|!���_�x�J�i-�`" ҾF�����R���n
͎BY"��QR�2	կQ4�48&�
G<m���:)�l��
k[�K�P(���V$y�Bjr��һPr*f˄ML�.(t���fq���at5�y�f2����	"�z}�8�����4�:I�c
��@
��+�g�~��F����l�W���W����&>�N�n�ϩ���MZ�C��+V�(]��1�^�<�jZ1�$MԚ9=���冕5���`5^�|�"������{�+�g�������+�)h_Gq��tr����Z����R,�o�U�� �2T1�/����_W�P��
(κ�(��D�y�ܭ|���??�=M��,O3TH��r�� 4=��6�	ca�9����M�f���rVV���bɿ���#��l΁�?*�X}K���2t�)�b+!��P�LD�g�ѳ1%UXuR”�orЛG�?L��[q.w?��ˇ�V�����7gG~�"L2�!;��Bf �I�T� .��O��U���w��Nƻ�U:T��G<6�̘뙊<�E�X�`ۼ����0�A!8�f�DHQ����h-�Ʋ��*�:`���6��X.��x���0M඗�$��������~������h��n�kL��Ga-wvW�B�@D��3�����0��0�h�O<a�׫�X�T	�R�8����R�5D0��+Bbt������:5~�٭t�]+��˒����X�O�t���#�q���uB ^�
A�2^�
Hǐ�S����Q�N�?�{��
r�T���W
D�e��x�030�/"��"��E����(���k��I���1Y!"��綝������L��PŁ�t��j���R^"�ss.��Cq�t���3����TTښ�|\��J�h���/��8��2_in���5d�ݨm�]l�8�Vy��MC C^G�EZ�7�@g,�T*��������Z�*�K�>��X�Eq����wa�d����ƫDdi֯y��2�QL"����[�$v~���l
��9T���g>�u�_ʌ.���R��н)�����>�>y[2rs��/ �)��e�[����,��P0��E�BR�os���`���F��m�\=�?����{���3f��|o�������k���Y�M���C4?��7~�m���e;����[�o��������C0z�3���a_�Nn��<�e�|K�C�&����%Vn���W�Bjs�5�pN(����Z��d�N��z�Di)w�j�B>�������'O�"���I@�_���Ϧm<ք�﷫�yW}kD�0�Ї�Z��d�7��ʠvt�m�S�ރ�PT�lHsu��E���༣i�O`�����"W����'o��|�Y*Q��^�aG���+%1�ll4�� WEEX*�H!�VxYr�E�((��Q���}�2J��!#L����i֚�ǟ��Ϗ=��Y��ʄ眎.Sd*�U�{�X�f��9�]��Xy���y���H�iM]�T�=�Q`��@���#J
2���I����L:�y\U};��5z�@��&m�0�
4[��%��=�vi�1��sm��L�>+dGК��B�Ԋ(=t��IulG�~V	�~�YԾҙ�m'-I�h[�4�~Tw��$�w�J:��`�d�y�0�a�8��m�����uφ��V��-3�r�]ۚ#'��y2˺Vxt �\��d3����#�üݐ�8`��oi���y��������������Gu9M��Ӟxۼ Ә۾yRJT�7��c�O�gWf���4#y�B�����g�'�՘�u=�v�Φ#�}�{�i��Lg��J��4�V���
���7���n|6��&6��&H����YF�
�8T{��y5����[l����ĎӒ��!��Ԭ��Ԉ�u�8�f�C�b�d0w��hW��u�pz��v����Z�O��>G�l~�y��7����� ��V�����+P}���`�5N�V��.��m?����4$VZŪ
���}Sl�*J4�橞�9U�����橾����Pt����M�A���W�UI�k�,G���GϘ��]��_�+����s3m�msj>G!��=2$Yo6��V��5b���Id���0�Sd�Ȣ2���F���/�؁ݚ�Wl���Gbpe�S�Vb����8�XT����A�mD�.��N�ia�+�B��TLY.�����ɴF���S�A���$RP[���9�˜�<Sy���,�#>���q��ǭV�����]Dj�mět�ae�t���ShN�F���J����oF�;�-ǭ�Y��Z[|�䤅��2Ƅܭ�n.���4J��V�,�ѳÚn�61���oYP������z;S���7���y ����}���Xp�6��s�-�Dž����΢�?;��wG��pHN��Ӝ�V9��=^�Z�;y	e���g]B��0��kӹ]y�E�&�{��J��<߽��,��1��݉�>2�^?c
�b͑��	T�gԱ���
25IU#��;��E\oe�뙁�.3���@m�B8���zʹ�
Hֈ�+õ2�����od7�{BU�@'��i�5N��}�@�� ���B�AԵ?���Sr&���kC�L��Iņ[�z�a�HP��7A�0TQZ���"�K���p�!�O�2�X`���-�j�tNN
G�4è_���0��}Zu��IG@��ÿ~,��7C$�p�{�5N����R.EY���<�qx��He���<ͱ]�sn�1���*���eL�h���v����IR6l�����~\�4�jY��5���f?k��:�s�=3ј����&����X���P�4לN�=�ͦD\���E��M
^��ر�%|�7"͟MFM�`#�v������s�3э�	�ķ׿imB���b��27bw=.�`�a�-V
D�R�f��;gFg���f�H�3���[~�������i�!��6t�f�L��m�W"t@���
�.��5h�
��5����N�t�m0��@;ru��9���W�\�̪a�ŧG��o4خxA�ou�/��6���(L��."�i��<��1�Z�g����9�q���c�:�d'9�nT�e{��n$y��Ƶ�}�,������I���_���ݘx-ɩg9�
U�
mmV��?PKk�mW�J�_
�#(setuptools/_vendor/pyparsing/__init__.py�Yms�6��_�(3g��UO:7��ęSl��T�\I����h��$&$��m]�����.��f����]�˳�5�����%���*���do��^����`��ر7doOO�9y{��-cw<�j�n��<H�^|'�(P*�1ۉT��l��8��6�Ln����V�,���{��Ta�\g<�!|8� ��f;0Rr�=�T`�ϸR�882_zy$�g$q�B��l]�`Y�� _�1�	VN�� ��<c�PYx���"/�}�G� ���B�=���A��d�`C��pI�������:�@VD�DL�p��eʔC�@{}�ZC�r�$!�f����睌�灩6yC��%L�e~^f�І�C��#Bl�t.u���,_�'�e��M�I��bJ�8��&��A<l��JI�!8"���=��(q��j�0^8l�dw���K�
�K�6{��n�+���l��ͯ�x��}7�]�ŝ��r��6���N�K�Mf����}���|Ŧ���
lWs-�`6q��
Ln���
���d��fW�Ռ�^��ݍ���t�`w����ҁ
�`<�̮���:�Nɠ2���f<�jq�{�a�u���}\L�oV�f>�t@��@��c��>R&NǓ[�]�o�׎�7��^Xh�p�h$��{���gd���l���l��/V���ұ�x1Y�a�s �b�\��Ιc���Is𨼃Et���S�s錧ඤ�MW�s-�EҺ.;g����Ц��v"�1n�@�����&�M��!�X��E����?�E�p�`@�!�3��$
O�TroGZz����e�
�{KEm��F:��CN����=����MYCh��DI�6y��',�?pa��ZM��e������ @(x[�g��@�@j,ڴ��x��������,�|
|r�q��TõWx/��L�B��a�'Ks!��`L�K��n_�#˺�8������6�T�d���S٢�hCp��E�����anp����qߧ3	����ua�a��Z��3���#���U����G�%u��L��ꏲ��3�׳ǣ7G��H��1�#ׅh�}��$��g�֡":�j�ۖ�[�+jG��=���<�-�D��v�l���Y��&E��C��%+�(�0�qeֽ.Ӭt��+��%z����fa{���W�wGn��o�O�%8]v�3���@w-c�]�ӛ��H�".P����p���gn�b'�٧#M:�ّM���xu��kByF�ڊ"�J� 2�al,�>_��Ѧ��ۨ�8!�19zoR��<�(��V�t�=
D��F�����-e�U��3������f8����h����\�cr!Tf
�LO��b�b�j-��W{b���<�*=��R��1FТ(��d8#�Z�R��a<.�Q?�M�[<+z�R����|��)��p=LC)��C������~މ�=���L�d<R��	��XGM��w�����il��2Ȟt1<T��GW�E�Ř1���c��"�FC-��\�}�T6jDk�S����`�e]�Lk�̸���c��@�h���NkGG����ǚ+��H��I̥�G�rE��,#v�T�����N�N7w;�qd��F

X�j�*5�0��)�^�/�4��j�P�-�n��
�X:٦@ߔe@?kd�~���Ď�d�P6�h�+�!���?E*��L�f�t�<�LSmƒC0`쮜>@0�8Z�=I�bIl"hG�0��dl4��]�L*�§&�|�DQxK4��%�"g��Yk,�����۔�nRlz���!�(b��
�d��j}N�VP�N<�a𥶻/�5O�S�؁�`���b�m�o�`�m��XU&�f���aDŽ5�:�	��2Mf�W9��0��ĸA�����L�S�?��i�A�z���)2I�ӓ��4��5ͬ҄E�^��%0�-�p����
Or;�2�u�#j�x�w���63ߤi�
5�-o:��_��`�^�X�1|��t�;GW�
��Q{9�{��m����x�������YZC�?Uk�V�p�o��a���5l�y�[X��H���,�5-A���$8���_��Ψ���ua��Pq}�A|翼J�s|?
u���(�$&��M B_��
V�a����<�"�ʦolvj��ۥ�1Z]�P+{�Wv�L�������-�_]KiUWZ���Uɴ+K����H��V<��wIy��6zS��?�� �=o
%#\@�I�*h���y��p����4\��5�B5�g��,++����娯aA��*�x�mS�m��P�[�|��,�,-��+m���:e�{3X�x+���������g��d��zM��bAe
]=��&i�����L4���f�t�B�Ww�5��<�T7��=�x)�888ր�(���\��=.2�����ی�F̧8�yq����Ж=�k{s�k#T����C�x�L�����݄��e�֔2Yj�I�r����̦��$sk�F�;���K.�㊌�X�d6�+����%�m�7���w�d�rp�/��Р�W��Z���sM�w9�ľ�?|���$v@�w�ְu���ң?�ûTx�ojX��%e&5�f�Z^��5!��c�'c��a�ԯy�8���n�<��ۚ)�c'�-�d��7T�f�|��9��Q��-�R���/[��(�~�\�/�Z���ٚ�,i��Ȋ'qm�L�/�V���� Y�j�95����<�g/�-���x"���@w�j�5�nH�aKV}�k�Q��ߺ�<R-Bg��:���x�z�T���IDw7iں}(��u�"˰��h�ˢ�Ŋ�NQO�a.OS^�����]�>Q<�5'����Eɥ��
�p��&h��K�JZ�Ӏ`���EYKߢ~�O�� a��V�[c�t,Q�*�"�ES��E}9 BMW\�y�!f���\�:�Sa���YkC����b�o]ӓ��q%m\?�҃d5����D�o��7R�'a�C��$ĥե�.�'�o���mzGm#�TJ�V5�sM7��#��$��ⶭ�V�%��v���*�ʒL�-�\zFtqը9o�5
�}��I�M�)KNíZ���WhB`ЪE��v[��:��=[�ܢ���y]�zm���5CȞ�9w�Mc��{�t�i�V�����j��(נxK
ŋ.��!oV�S���P�c��K /	Ϻ���>M4�W�Eq��E8�';l�.a�w!L�í:8�c�����c�]t 殀�0�Ĵ^��\��[1����A��1��w�{,m��>�8tl1����Oې��R�m�a��Bw4�>xX����᪆��?M$�y[�}��cգ<�%P������O�PKk�mW/H��F'setuptools/_vendor/pyparsing/actions.py�X[o�8~���(�T�:j�a�m3�"�E;-A �2es�[I*�����J��8m�ЇV@b�<<<��\�!���F�f4JM��H�&��A��4N��ƪ�v�!���Z���F�Q�Ik�E���H�t$�A�����*eDZQ�v�p�P���n�6B���,SK�'*�x��R�"�u�]�Ve�D�ʭ�eLk�~gz��I	����3:���n3�ȈEDK�"Sb�'
��.�|3�̬�KF3�d�0��=�t*���l��1�֙��<,l9
���|4����jS�,�)#5\0�k�?h(��_�r����t���y^֎�*������ӶE=�YVސ��R&Z:��Á��P}׋ދܾ�I�K��c�Q,]x��x��TFx��eXb U������T�Rk����t�E
[�D�:���B��E9u�`�Z�nX,��
f/����aB~���⧙(v��ב=����*xҵ���T	��8�A�V�ƤFU�LT|��:���|ӨI��p��ZD$��o�3�N��k��*⌭oDmUZg�f
%�$/�rޙΝ��%mH0��
[Ŝe*W��v�O�"G^�[	a�t��VQ����,C��qhǬF��3�/���6��]Ho/.��-$x����4Ο����`��i�uTȢ�F!a��o�k4��8��(�.#��+�^�/_��+~��8G'����]�o�6�o�kR�T\�����*�R�N�p��v�0p��(�Ւ�si����L�d�})�N�qg�ņ"K"MMp����$���0.�D�Yc�k>;G�ҖC�3|
��T���MJ�Yg�'�_���6�TH�W_��7�؃���������s�����q�0�do����
�Yf��4/u��`��(T�����v�zSe�4;K���+۬o����+��YL$sQ�A��ٵk�#�'v�χ:���R���~��$ �
e[m��[�3"�J��ȭ\숅��i�M����������w's����	M$�Ef�'d#��&�iO�BR����O��F��
{=��њTg�n�ݮm�A�&��ĕ�� �"VW5�kx�#X���Z������|>i�D4���t�� Tx����CR���4_8@��3jSt���'l+�oP��_R� ������`���+se�X�c^�����ms�jW#{����{ ���x"h��Գ�Tc�����<�M�<��PUDe���NĦ���AJ5�)��ޑTQoOw�ܶ<�8-�t��"���?G;'ҪR���/��fT�;�
�Y8�/��=9�m�@�
*�_۰�X6���!���dV�06��nߞm�ek��UtTم~tz�����<���'1ߊ<Zy(�Q��={6h��,���`�\��:�6��+���ɱx-^�c����,IJZ�z�J���������P�(y�>:?ԍ�����*��f�0�L��s�n���"��嵷>���C�G�׽�gL#��ឆi�4����;Fj0��g���JWː�[4���`Q.7�v1���\�Ԏ�Nj�B�=�î�2���G�~`)���	ŀ7��b�-�M��V�,�D89w(�b^�]F|,zfe�m����=��ɭa[�O��vu߬<g����Ҿ�ndB�n�/j8���U�LN�S��(�=m��8������^�Wq=f;�Y��.��J�5��´��H�~��!�2�K�1���p��d�|�F��w�m8��[��}�z�pf}U�x�.ZN���[�D9P�c'{����V����=�L���s�+��u�潜�ٺhW����?ox0�$��G-:�[�8���Es

��RuUw;m�:��T���Zj��d%y�+r[�mC	 ����u�f�
i�U`�D���]��M/<�����՗�xr�������_������bf��q��)E�#������;ʛW�^O�_ԄE/���3Gwص�|E� �ʉ����D��û��Tt��2��B�ޟ��'R+�:�n#�&_��5W`���
�G����Rd6�$
\+vK
O��<4�e�'+��>uoˌci�x�_PKk�mW��e~��2&setuptools/_vendor/pyparsing/common.py�iw�6����d,R�|$�:v�&y�{�Ưq�o+)2DB7�JB����;^I�v�=�X�\���K�(�ЊW;�$
��D	#^G	'Os؜�1K��2�<�܉良Ch��D1'�^gw��o3.�{A�������%i���,R6[����	KS/
Sb���ݰ�thʈ��4%!�e0�0r��F}���s/%���iL��-�W1Mp�$}�C��4�-K2D��l�>[2�+>��tE��`��-��L9M8r��@.Dq�B>��L.�x�EI�} �\y!gנ����U�c(`z��hH9�:`�f�1�8��)�&�l#'�U,���:�A��zn�^�.�]�2~%�	u]��X~��Ӏ:�|��ۻ���/�)��1W���>~x~ܳ˩h6�\!t�wgW`nn�\a]�L��3��ݫ���s#�(j�6�
�T'%PXc�"�=���'��H�}�(�K����]��M��7~D���W���A�>!���|��%�N��e��g6���&�G���[�>�"�U�1�}�+Y��,婾��WN�k��'Q"�d+:p�I[@��@�1Xm�x ᫘)h�^O�7�:��vl����bf��W  ��E�ٟ#�w��U�9���qj��0-�-�*ɛ7�Rp���6�Ŝݮ*�y�=|����b�&&ǒ}��Ɋ�l3�8j�����R0�st�4�� FDø���������&�0�_�����C��a�O���
�f\aWih���[�k��)uw
�~�@����P܎+�/�L[�嵶Jl�/dn�
c��ci�B`�HA��C��=K������Y�Td�\ۖ���ZJ���:��=�ن���C���"I�h�ƄGE$/��$�B	��r~˩f��2GvI��r��s���d��+D��dsے�VTҭd�9J\֤��	���kL �dD���J�z"+'�:(XB�S�:�tRx�Xɗt�oz���K�3�δ�Ye;�>�O�{YFF��/���Lg���#@n�D��󑻯U'�$��������P�w��9�bD���h=��F	���Ȧ��o�ɖ��'ZW���l�Z��B�Z�D3Y�����%ӕ��yO�e���ʟO��K	���Ƥ�ߦ=��~%�R�X*w]��}�!�:�i&��"B���6�O�,��̦��q��X���h���:l��5Egjr�P\�r�`����p��5r���s�hw&)�x�'�uod�E��0u�(a��f3Y|Ȼ���C�z\�
c��>�~%d{��M�/jG1�B'u~��p�@��h�{a����g���n�$�0w?�>�d�>gv�܍5ɿT���w��Š��6�K`�Z��*N*@f�(x��M����*�V�m<4F|>�Սo��7���U2Q6׊|B@�9P�d���]�{%�(�U	��9@Չ\&#֋XC�xN���	ģY�cU��x��s�4f�|�Q�+���Lۥ�M�
{��x݇��1|������bw�w�>��d|9���;�E˱�Z���
���~K���2r&����K	�^�85g/�7���V˔&j�1�-|"7*�
%�D�|U0�<%�$���4DF��YJ'��$�C-ߠU��#�~�z�C�
%��,��hd
	U6r/�1�Z�T�C�k�-Rt��|݇̚�3+��1,�97rJ���ˏК�@�\BD٨e���E���`�᭔Do1�u+'�6��Ha�5��9J�e!
�;D��T�&/��H=�6G�����96j@8�md|9l��/��s+����@�Ot|�B�4"s�dd��Q��+�DA�̅�6���	Ya척\8��}��q��ړ�O���?�J�o��/,���ev~o�+�R�oY[O",�Q��P�� %f� �!~�@��0��nJ4@ �t��.|��\]UA�����z�Od�E���'(��+�h_\�*60)�$tCE#:}z�L��P���'''��7l͐���� ^CE�:��B��!v��(������$�p��~b�dx�d��K�#����h:��FƆ*-�uX��?��`���r�%k!@=03���b�(r���d�Fr~2Y�
��6��|�v����G�ɬ�_��ʋ��${D\,�9�"��?�]�6��_�0b�ڝ�ou������[z����uH��C�N�?�z�+0Y�?�T�O���${�+�{ۚ�_��M�F.yXz����s�����U�z�%�͟z#��(�`���2��t�*ɭ���s��7�$c̣E�Ab�.8�E��an' �(�Q0���og������Xt���{�ܙ˲_�� @~�꿬��^o����a�}ѩ�F��{�Vψ�(de��7_h)��#����˽�+L9�'���±����x~���=��d�Պ���E��/�壸�*g�"��Ǣ���ˑ�ak�ih۩!g4`Q����.�c
���hS��P���D���Q��
�B���)���
ʻ{���9���pv�>DGhhg��O�,"x��9�d���m�y���k��S�A���үﳧ����]zF&�8�	�1)wA[h>؋)^�е�W��8���K�܅���g/����q�9���a��4l�fZ����r� ��p�(/ZO��FK�*����y�m~�i[��a��$�y�'DΚXG���6�ڹQ��!ddZo�����u�S���q<d�CWo��TT)D8����&���bJ���Y]##.��7y�滕^?F*��Nnj�r��=B[�@U���j{�	t����v%~]D8��J��`�+oG�i��5Y1��/^U�����b�j�#
��f��&7���Wy�	�Pa��2)S�L]�ן&�E��r,���U�n-�(!=�ج�<��C$B���*���U��-ދ|m��F{�� ��2%$~3}�%E<�t{��t�
�5e]"y�	.iYq
�hIa����>��O��ۉ�I#��8�x�D���,�kC������-�vAup�C<�u�%R�)�@���ř���	��3�|�u
��Eʒ��;�z����񐣾8�̧>����#&C�B�#���y��3�һ��""Z��o�	�7������L��vom��a‰���s ��΄�{|2��G�k��?����e��e�3��k�������6�x�ZE@7����ȁ/���2a�xJ���;�yǷm.�f���%g/H��yz��2M"�O��
Wi�>���I
=�:���-mP��=_ۘ�b���7���
�2�����V9.�z��}Q����V���ꦠ!�hnP/�^��1AϢ`���
��NX샎�g���1T��e{�d��24'�>���f��m�ؑ�u�`��2j6$VCj�Y���)SP�+��GVmѾ���^��
�E�����N����u^۹�;�W��Gb�I$��_�stg�"�Lj���q
pPj���]2~ZG��%���ӎc$�A1�l�ipԑ�z���o@���9gX��fa	gR�='\Xx�>��/�c�yS��*��<�Q�І��>�:�M�VR���:�U�B���s�*��]'�*����M�f.��BIn����R�Bvvv&Ӆ�C),M8e(V.E�o�Ok��s4*�ZbSNoF<�t&t���d5b��g����x��PKk�mW<�ǀD�>A$setuptools/_vendor/pyparsing/core.py�kCG�(��_ё�9�l!��db<C0N��7�IfcF4R:����1���^��jI`;w�}����jUժ�U����ڽh�Iv�vo-����R}�nfiv�6.�|��Mg-�ϋx��N�Iң�?ei����x2�/ԋ�솿��dIWy�?��iY���]����'����<ɆP���/��3;���wY�&�U>�2I6��B{�]�J���0�������@��:7%�I2�`�e���~�k�Ag��x��Bf" �#A�M�dz�T�ߏ�ٰ��I�
\�L�VWE���8:ȡz7���Iz�޼��k��?�҉;y���8ߍ�W2����|�����p0̳qz9O��R�!�?ɀ�8��Ag��z���x���2y�oë�P�/�I\^���Esp��a2ͣ���]-,�~�<ы���&3�5��&I9�T�AYQ&G��
�?�����L*��,�DU��̠4�C^��
w~�8��q���2�w�h�j����{Q��?��xۋ.n�������,��+��a7z���x��ƣGtv>�N����y
+�J�iZ�0�(-���H.n�K��*��q�$Q>�p:.��
���D�K��_Tq���Ĵ-�lu��|\��H���_��4��(ΧIVň�h�N�2�TWЗ�u,uZ]jh�İ3��D�Ut
H���p-����p2q?T�I:M�@�(켄q`_{�4�c����f�I��^4J�ż��%>&փ�<�mX&�	�H��4b�C*����dQ��W�!����s !�U2�A�:j�W�+�a�׸�a�RZ�[4�'�6���&4(��,��������dyU^��.�=hp[�*�e+!���%K��o�;��^t����;G{�q����?���=�Z;��Ջ~�?���O'�8�yq�����h��?���x�������q��(�?|u������=������拗'���	�=yIM
��=�����v��?�?�g/z���>�;ѫ����ݟv��W?�zy�]x�_�x~���8�A��4�����98��v~�1Qw_����?�D?�<x��߃��|�Ǎ��'�ă���^�l�p�=���QA���?��#hq��=��q������Dܜ�<:ѕ�?��E;G�Lj��G/�D,�yI`��=��HǞ=;P�����ϳ���v�����][K�D���:�0H�q=��}��"z>��x.��ϯ�f-����UI/�?�dG	Жj0�n�zה�����A����3R�O3\�D�5��/�,��I�T��`0
3��v�Y<�`���<�:]�m�X��8�c���ҕV��P4,�\�G\+�H'iuq�y!T��>L�qC��������9wg�ĥlt����~�
����x2D{�z���:)�r��-��0Π1`����vfE
��FJ�;�Q�6��3<"�, �Џ>O�zt~.<���`'��9�D�a��Q8R�Q+�e9O�{_?f<�c�_R0��.���3DM�8�%P���E[4m[���y���A)uVf�K$8�S�eq��S�<�����(��魯)�xtB�F�,��KM�y���$�/G�C����7�Er�����\r��Y�l[NsR"�`(�s-@�cg;:���?ɇ��N7R<��~(���i
Z�3��`F�Z��Я�h��A�;]k/���i'�cƒY�j(F�}0�O���ր�P�F��3^����Ԛg�zd #��a�뵈n����&�Yu3x��fT/
%p7'�9���K6����֋J�+l]�up[��5p�����t&�U:�a�;�]�7!`�b~��Afߔ��'[Rr3`��/�j���и�w�e�aп�r�{�:��$�Sw��pRv���M�d���}w��	��rߚ��L����7[�1�=j�A��7���Ӵ$��դy���j�Bo�1�Kl�he�Edզ�H|-:���,2��t`p���i�]���(��T��^_�T��` ��{���i$?��A!MU�F �Sgc�|�]���-"�'����"�w�I����k�t�_�{�m��������1�Ӫ�� ��4hĞ�C���E����G� .�t��݆��L��@��ѓ'�:��ﵞ/���G���P�`��yQ���o
CآH������Y�KO�K��ץ_T�6�'�������`辭:Lb�bo�`�}����G����½>T�g!"�@�s�zN,�z!��M�Yy�ƣ�!7���ٹ��.��[6W�Y�̯<^�W��V|�W��Q�^�?���	�3�!F��[�r�ku���z3�/Pt��f��U
WSs"Y�ϻ}��t�ٮ��W�<v�^{���3��Y�,�j�s�
Z�V�N�z������y/�JG�V��z?��2�Ay��'������h۝�dA�(K�J'p
-��xy'��۸�e^R�xBe�Wy>ٲ�7,b|Ա�3Æ��j���`w4Ky=�E�z=���QLz=�Ur�7�8�'��<Z����������T[[���=��L��_�ݟ��I��:|v���uab���)������{۵D�p=�+���Yk�҅X?�@oW�n�ޱ��:lj�ܫD��oX$�p����Ȍ���o�zy�T�֫��9B	���Y���s�e���Z�^L��p1O'�h���8ܘ�%��Rl��S9��(t~��H+k���}�����S�0M����TI:P��~M�&�2�R)c�J�q�i* ���ڇ�����2����z�`?]#bG���<u4����ew������V
5I���P�t=ͅϸ��JE���H ��4X&�z�`c_��t�y�N4ZC�[�fO��gk��<?�]w;H��|8�QC��`���@����}�㐽>��œ^e�EGݏ�a��3�|�1��"Q�b
���"5+T��"��@f�}S�+\䣛�*�kp擴oc���/���/�|�Z�J��c�G������C8C[<,)!C|@E�f�N/&"A��Y�tȂT��2^]�!�
��UZ%�,&g@��p
t(��q:ʶ�F�Kk��x���h�&T{S�����)�!�(�q�p+�*�,!ɾ��K�5�mj^+Ŭ��1_`��AaU�š�FΔI<��,�	P�-�ܩ�kBZQ��ncԠs���8�w�
��Nu�����6.D�f��C�v�j�R#����o��#9u��n=:�=83�%*��&�j<:�h�|����y��<N��δ��iQq��Q%����Y�p^0������U:MT7�S��|<���/���?�;	�g����g{j:�;2�~:>�燨�$M�;/�N@��{'?��r���/'�����e�����}h�磝W���zVg���×�s����{`M"C~�{!����G]�d^����d6>��~�yDD��k�.������k��d�<#9���e��*��pUq�>�e*zJn�m�uk%ݍ�p�ޚGݢ���Y"�X��p��J�}�5׋8��˒HV�
\�FD0�9���i^Y�\
"���z��il����¡������2�K��&�OB��..�������W]Z}����b-���pR�i�s�4����9M̦���3a�8e�V���4$�F��Et�IV���n^������5��d�Ok=�K��x�CM,
�i��#R6�}���Nɸ�
9�[JS�S�
���UW����@?��J���|�߫�k�]M�
���vq)�2>4x�����e�{�\c�Hx�LG/�U<�"&P�$��'���B]ERx�8U��岳"�xE6&�������*��ٌE���^��P�?�M����Q����oh�6�[ڨAZ�F��s�R"eR�t�90M�jdD���A7_�j�QN����L�q�n`YO��%i��$7�y12�-c� �D�j��c����о�2G�}5����G�K�`Ǔ��p0�v0���9���"%K�S�\��ɍ�;ȡ��!55�֜U4-/a��A��גN
\�Dȣ�.t06d�֕�E�C�q�����Q�O��/�.P�a�39�Ft�~�O�z��#̭u�����d�L�
�A��R
P�uv�,V�Q�H$Rf{������{����J����>���]����M�z�$�u�E��X&�qN�!szҸ�H�����)t�u���}�E�W��n*�s��L�~���O���CX2Y�wc�z�!Lݲ2ji���>�J5x�7����o��Գa�䳐
׉^"ty�KC�ڛr˕9���]6��X7j��^�%��z)�3�3M}��Y�¹N�[Ó&}�aje��-K\�𡗁�s���+�-M�:
����%�fذ�9������|��`�-|���Y1��֋�\�\Z4�#��9�'����8��|�kZ�Q�;�KG~��8�k5泽�;?�~�q�do�٣c�촢����u�(��"'���M���XVjO&Ǵtv�L��L�gZ���V�?�sP�V���WB�����u
ۨ�%�HGd��h30b�.��.F�lk����5V%�5��EONv�J�T�\�<Ȇ�300��uO7�{�ό(o�N�S�����U��f��b�0��6�j��6��?��@����S�V�,ϯ��5'��D:�|Y2����܋k]E߈XU��yFg�J�<���[XR�Tދ�2�֔����`[�l����-뉌�8V,N=����3�J�T����g�����]Z���Š�"�����.�iF�a�l%���r�6[�6"��6O�#$'2�A�MY��p�E��E H�̀��?u��U	�n�RBI���p.�x����M��D�m�W?��*�bߴ�kA��j���on>z�x�Z���C�g�x�a�F<J�`��gUU���	F�?���ANܷ��vI -
ߣˎ�W�.|䢄�v��z�3�����ٚ'�"r
�<�ҙ�jzeG2pc��i
��f��|,O-���й��Z�W蠟�ӧ��/�/X�S�΂�bw�ǾS�p��	"�"o��φV{bW*R#�K�OA��7u�		4�I�!��[���"�ə…<�o��6���Wc�˼I��I|Q��¹�p�ƃ�'�㯛&�9� ���鄎7��������w�h�h��[�/hO*_֥ģ��i#i���w5T���=���2�gX��^4��7�HL�1 �"aW�lrA�*2!Χ�	��o��C�p�{ȡ�r9�O�ȉl޼ Wȑr9rI�Ϳ]|�6OG0��<��+U#Pu�[ou��W0PBloX�]N��5�n�bd ��2�…tj�)���+e�Ξ����8�
u��Fa��j�� ���Y.��aҖ�t�َf��X4v���5�t�A��ZRv��3�X�:3�{�(��b5�2+��k�lmr���R/��r��ku�vm�6Lw��٨cϞA�H̰����4�O�a�&�]�����~�T&���xm[{5J��@:�IT�l%�(J�:C����l���54��)\�c����t�8P�9��ֳ����n�u�!`7<�=�.�ӛ!
��~����K�����
�q�qm�:�yC^�=��M�k��﫿C��_n�=z��ׇΊ&��?�_m>��a�^�W_=��>���/��W_[W޽����x���<l��oa��9���E��㣆���P�9�Rn�^��;�����zt�u收�U�zd�F7�F&�sc��l	�0�)[INw�uJ֣_���"�G�ד�F����dr*�R��i�3�iW�"!�4DC`?P���$V���Ҥ�Xi��@2h������;�����^�&����OQV�+
zF��`L��]Z��pJ@�ط�폣���=h�S� ��$.W�a<C�o��v=����ܟk�Y������Ne��F�˓�� 4�������+�k�>����:|g�
��,.�MR�ƙQ(����%��������j	%����(�,"�}4���	�ͣ{�o���G�jE�#{�}��* B�ZX�E�P����I]Z�Y�l3�d�i���,�A�;t�X~&[�u��l?jr6�Ѳ�GJr'$N�1��{<m5��c�8
�M�\)WG��g��q�}t?:2���s�e��7�ݯ��?ğ�+��g�5�V��>�>0��
p�7���s�e4��ǤmO��T�"���.l�R�=:a��o��|^���N2er�����F���
<1���$�˘�R���� ���Q���禃��BA�X�gc�
�`�;���f��3Y̫ɰTdz��D`��QZN��E�\���l�!�qB'=�օ�*��(`gvO�w��*�!�A�3t�'�:`��t=Z��7Q���҃Q{/��FF�(�z�KP����^����w�b(�D��f�*.�6̪�&b����[o���kp�Ǜ�8SJ���޿��T���1mGxu�ŵ�t}��&pc���ӹ��5�r%#������7���;����F9c"���b��ǏhѠ:�N�:,���B��p<IvE"Ab���@��4AXg���b`�c���qƜCL&��{1������ԠbC�����2<=~zf~B��~���5Fa�8`���m���E�gg����x<ɯ���ah�\��
�)�h_�-Y�n�����54b{��M|�W���|��Q��Ӊ??t�����V��?5Gq����2
����������A/5O�hA�_d�g�L�Վ�U��u�����w����4��1��h$���1�i����d�'�xO1�ި�9Y_ߐ�%���pͶ��U^9�+Ex�Ԅl`Z���w4�0~�$A�Bg�]�o�E��3�8�����󲠁S�
��P*���p9�њNU�+�st{�I�RR��c\-����:&��7#ޫ��+3b����!�m�Ц��Mq�%�)m��!���r%���G{�6f_J`�ɬ��ƈِD蕍��m,���;XWZ�
5-ʎyQ����L���2��K�
�b�K���6|V�5ll����ͮ��3���:k'y�&�J�Q��$%�A��E������輝�J"�NR�P���&�sL>���m
6*���Bj��%��C��H;c�le�W+
�y,��1)�C�A�Y7�T�r��5(-����ؐ)��H�hq�]�R�Ns�������d��`��^AU��O34<󎟋d��
I*���9b��&%F<`~�i�#�c�H���S�������`����K����͜5����sc��N�.oS�'rd��Xa��\��T���X*C���|
=�K�����`�b��O�wZd�����ÇϞ�5�E������B��U�W�
L� �*��P��O-4�Vn���z���Y��8SGK=r�tէ�����o+
=�Qcy���ՠ�*g6���ύ�2Ҙ����
�ƨ��5T��%�_���f�ٝ����U�?���5�d�U2w����G�o���y1����e�T���j+��j���w`�&#��P����.!'�f�|�Uv���^턀õ����l��ʪ��P��h���&Y�1#��",�#������t����ꪛNͶ^�IL1�t�5
==�Џ�bD�Z���~���{�N�%wU���9C��|O��ի��|�P�޶��ճ��P�Ř�%���n�
vF#G���6��r�K}�tJ��#�ߧ6���>�J۟%��a^m2�>���<��M�qs�¼jG���Z��+�+NgL2�$΂ނ+Ϩ�8��w;.�q�?e��M"�8�⹹���%K8?w}���o�j|B|M�MW���H��m�c �c���c`ȋn�?`��Z��;�D����GǏ�߱);���}D.E�a��	���B��R�H+�~�d����ٷK�~�as��ۘ�aC��n�^�����DP%��K��[�<��ޭ�*�ll���Z/��hiw�F}���h#�hw�O��lbކ��f��p��b>C٨�:��K������M��池M뼤'�s?�I����m���e*�c��������XD�Gd(pK��l*(�2�@�a�	�]��*~#�Zn�R�8~v�K��!q�vH>_�kQ<���q��U�V�(āM�� �ڶ�U|_�Q�
�캺*��̕�k�([�,g9f?��+��
W[�n_��DӌE�S�ư��a�l�B�%�>ڠQ�(+����Zw�z��K|;v1� }v=�?�E�|�կ���2��5���IA"�G�*�M�x��\^ �d��Y��ͤ(��%��l�G,C�y��]��:xx7K�;Ipy����=�H�I��◜��-zb@�U�O��.f���,F-�uءn}��V�1ǟ�e�8W=V� �_�_�1�9�x2{�:��ӈ���5���t�pZ�z�A�Ó���Ý���\��?��f�8�G���޶[P�<��&`R�ϵ�c/?�ú�9L�BZv�Gc�?]�O�H#T�#&"$x,n���A5��}��2P$k��M��$5�2q�o%�5)���T��/�`�*X��;ГU�שN��I���!>�vTC@�����lOM�m0��{�%m����6��L�l��g�`��,�O4F��,ǔ('M6�)*�Z��f��策�ha�x!B�z�D}�{�D��ΚBK�CI��!(�
��	/�f�����޸�?�_q{ʭ�G�I��k&Ļ�
�fTum֡��^�׸t��='���n��o�i�Zl�4�6���\�sA��v�f3n���Ԥ��HvB�l�������+��Duq2`��]�jf��m%1'*Kb�j�~tX�H��=
�R��E7v�4Nj?6�Y<��o�#Kzi�ڒ_Z#�%�W��Q�)vԖ���b��
��b#�\�'�Gx���+���px�"�N<~��GP��K����z���!p[:��}
���ӝ;ќOIo�HkV�3��1w�/���ܚ�8}�	���QKm��Ӗ�T��zA�3��9�L�{��g�i'g�5=m�ݐ,ˮh�P��E�銇j�3ik�qI6E��kd�q5�Om1�<ݰLT,	�+��1gv'�\��%FZn[#o�HY�Z�A/�POԖ������gQ�z�eD��V�'�3�h�q�@X$�*��v�e�[��{�X$G�W���4��&t�tX�1�4���F�z�YW\�bҖ��0(�?��(��50���rC��&�e�!\�Q�B�!�a��"�_^�a�uB�Q�Q�Հ�ۑѡ���}��!9�D�{q���
D���.G�+eU�%�@�')1`����-�	��u�m�L�]�eR�5&��X8�!��C���u{��#SE؅H����9�6��%a(G%"%�^W�,1���f<�.�q�����6�q4���p��i�+(s �;�~}1x! d�.��g�m�G�l�t���	�$�?��	�>�<E�����7򨪯֩�T"��K� ���"�Ķ6S��Xjav�![Z풁!��Yj���Ѿ�߹���l�[��Q
\o�C8���m�L�u��jh�r�Yᒲ|5�&kX�f䙷�I,�󬦰�x5�����.A�r��yGl���	��10Խ�_��J��~W�n�p*CtQ{K�����{��f$y��D��'�ǁ.-�K� ༰��5�H�s���ʢ;gO�@���Zx�+N�'�*�+��
��Bڻ�9(��uٰZ<�T�O����r��E�(*��q-���u<�\�Oa� �I2e78�
�z�Y�>�F[L�MZ!4:�j\�$1�[��Q�Pp�����Dq��,��Ռm�e�\�΋7��)KRr�UMd�6�$�}"��p�c�>&#k񳣾��i���sv%Oe�w��P�����iC�e��Pk����
z��v�4�nO�F��;��M�������[fc�l{�Ě���Zh�E�҉�ZnS ŐQ�I~�~�99�c�v�L���w��虓����s�+y\���G_�TqC���fgtc��j�Gs�m�f�^m[Sγ*�@�l��_�<CgMnb�ȋEEg�F�y�����O��6��Fm�y��l>�d��Nt���^���<~���Q���{�y�d�}@e֩��o(��o��у�N�)CoJ �ErԠ9b���2�%G�R+�^���!*WHCޤ3X	�:R��G�����/kf<9���=s��X9�"�%�R��u�w#�S����ݭ����9�`�_W�A�.8��ty
�Ԛ� �d�*d�wx (�Q�r�v�غ9��Wk
�{!!�����Q�0�,eT�L�)fH��@��D��Jw���O�U�pW���aZ�ʚ��	�4R��-��-ܲ�#o��³���ݧ���'�%��P�#$OS�x�P���k�%���3h�uE�	i��U���B>�LN�Cx�����h���~"��ГV7�>L�ɚ����"����HF�<QWؙ��lE������F���tW��i�B���1gw@���-M��Ѩ�=̑@�@��2�-�,�b!t�=P��$�T�5��A�۹"�Ó�c܉�#���/��$��e�䥖վ���<)#���w�$��4ysQY�C��+����P��ȫ��#��}�UtJ
�#h�B��$�@�`j�l��3�f��p��:hG"#�:�EX�5����%��x�,N=<T`4O��	Ɔ@j`aԅ����)����Y���3s��خ�0%����50}E���;���81��C��Z�Ej

�ю��K�_�'���$��	y���va�4
v���^8��\�¹(]b`��.��,��G"�z��Z{&�=f��#<�ݚ{u�9
g�@l��;�W9����?p��ss���Ȳ�qM޵2�Q���
���]����#���X�%��p��|떯}j��G�j��g2	D	g3&����۪�0w ���̦;И^��0y���ɸv�S�>G&�\�ʉ<��������Ɠ�����N��Mn4V����}r峊㽹p�4�՗b�1��H�5�c6�^�����	enW�'�q(�����\�j��m�EGb��W/="���!�HN���*��&�[v�'
z�4��b���3y���_qD���{���̡��,��c�<FŖW9�%���5�V�����u5X��9h�„̿������-�`+�/�tCK�Zq�)�I<F�JNu����;]���|��Q������ M7%�عxDqG�T<��/q��9�|�M��:ߨo�	��c�n�ZK1����j��~h.�q۔�Y�
Ms\�u��>�Cw��]�pK��}��!݌;t���-n���9��5'�L���q��M��s��	�R��>`��!K��*2p����NY3g�Y����۸���cl]h�S�P�b��X'~�
4$k�M�1q{iM����iX�����X|ȚI<>깋��ȩ���H{���F%D6��߭�O�>E��x��v�D�c�\����SX�ŖEb�OO����T��M�o��\��a�|���/����6zE�ϓ:��W�dTX��O(�(.!
��b�����`gB״�)�u�h���˝l�6������:$��1&�_���fƖB{��L�{�
�Ke$!��w
S�;�}юL\���=7���p �3@�Ơ
�	Ͻ(�K�R�r�ͱIj��4o��+FHµ��U���:{!���)`��)��W5ύ�
�f�j����'���Ja���@��rY���fP5���m.�h�ևU=и
w#��um�/�!+~�z�GM9�����ё�7l�
���q�6f���hR�]�h8��8�<s�я��;�/����Ý_�/NL!L	4�g~v����J�M堭�EM���$C~,/N�8ҵ�%SIԼ���—�cdRj��J�l�l�8e`^"�Pp-t���ש�An�(�H��2[/F����B�p�ϭip�ק3�`
qK������ӘH.Fx[0e������K�ay9ӊ)�/��Y�@;�:�%��8l��Uof�ds9O�R<�8�f�K<`Bq�>��FJ�\W�D�c[�d��x���I9���7��_~O�:��/�N�Z�G�~�S�Y���>
�m�2a��N|޷7��	�6c+�}��� j��}����A�T�^�;��
��[
N����)]�+�>�`�aI!��B��?�� �1T��4�:�A�&���)w�S��fV��afcÖ
ӎ��<������G�
����r�gĴ[㪬�?�n U��}���J�$�a�A����	}�N�^�A{N
�LnJw�������ڍ:=%g��=������1S�pk2�[�{߯��[���V����}o�؈-"�P[�f�J@ɡ���u>,,�l�|�A�MY=��IP<��v�]V�Վ�d������i^�>���q9��]Z�q��&��ᒤ/?�"+�5�LTH�s���Е�7y`��R�X�Ȇ];'��XI�P
�\���#�h�r��J�J8s�#��|N�U���=�X�Ca:4츪�FSO�@�
d�F�+���Ur�6�}L��2���,����..#.OY?��Յ�xa�Li�TD:C"P�v�q��eˆ�lg";�������Q�G�wJ����"/�H	ㄍ��.�_,���UZM����O3RD����i��
E���D�
��(�.'y�����BIZ��2�&/��Wȩ���/I�3��r��������T{���7��<����?���&ʰ�z
c<s�	�Tr�a��5�G mo��)%~)y?�:ࢱ�u��ZF�QW'U��S
ccjU�8��B=Vu�`�,oN�k�G��9j_]_�����5���o��%2�M�.��N(ل�D4n�g��aU#g�^pT���}<@+���5��M��Q�Wq��`��,t;��)�:US���^y��j5�GU3�=|#f`u��%���O��r��D��j���ۢSrz��`"S��݁�ݳ�	R������g��~R��rے�Η,gN��.�M��m�9*L	�
]�U�������	5if�I5WH��ƫ���'@�G�v�;X��Fsؠ�����(��8��N�\�>��vQ�AP���'��i)�	Hù�@�ݕ�:�ց3ˢ���S�� �G��r���s>ؾC�H�P.q�Χ�.�KnGex����D��@�&�$�ZT�@��A�sHKY���6��>�E�ml��a�
a�[�c5�>s����E	��KP�9��@�Db��(7�4�E��-X�6����#eّT���QB՚�1��(9A
X���M*�:�VYO�F��j3]^U�Q���3�>!설h��G`8�'�ԄLc|��"���9�Hʱl��1i�;�������T��x�bo���6I*���ck6�P�1��b�[��w[׿�k�S�0��2X�����]�ړ�z��ܣܦ1zlb�j��%_�DM�iA�/��OO-P�0=�-T�z��E`8�A�6x+ʧ(�Zm�E�E���e��;���:��r��!;�����&'�8���Փ�h?,}�=?��m�Z�xǝlt��Tp��]����[��"��$�����A�W��9Yiɮ[�1.�$�<�J� j�Z��W{�W�z��K�OF_��W\�c�Q��E�_�]�vpvN��wB��7��ۢ����t���\��̶�+�h�$:0���M:;�mC>��;mb�ۈ%h��/�ڶ��kz��7,�:-J�1KF�[��x&\�i*�����������ˮ�'�l�v�d�|.,+jB��%:���<�sK�i�#�:岳:���72��.6eZ��+6jF�u��Ēv�F���t��7`�����5�r����^���k�C�0�^�Z���ja�z1�#(��z��`��=�
.I�	T�sj�̳�MQ��IR)�z�#�^ʩO�Q�;-'م���MX��J���)#�F//�r~�)Wպ��z�sZ��(�1&�jZIN���vD
�: �?�����;�3.�OG`�\���רp �r	�w��B�0��T����h�E�L�m3P*� �����@�ą����>�,��G�*#�F��s19v���]�> S�@�~��Z�m���0]�r�2Rbb��.C���X�A
��~�e�W�ԺK�� �?�"Y�Я�Ϡ�[�S`��Dsz%x��"��K3�疯��$�[�Z��^t6�@S�X��m*��]0fes!��Y�A0�$h���یYZ0�ҥ��(n^[t'��;n��-�p�I�
�Wk:�O-���@��p^p꾸F��C����bQ}]ul�����SvG�OQb\-��@���6e]*=9��<�����k��hB�m��[g����n=:[�W�5��A�^�C1����/����`��w��p�D5F&s��uu�,g����.�f(6���&���R�N
�n�msA#vO`n7�%�#畵��`7ZCS�f(@X�����,�`pe�����<�G�,[���ʬo��^�F���OK"l��y�3�]��h���
�	1;@���ס퀏v��,Ju�j'�|��̭4�;qp6鲦0z�o�?PH$�?�x�,�d�-��?�ճ��:����3�ѕr��,���^��9�GܱJ�<<4�6��j�����*zD�1��
�I�ԡ@�x{��.�;3N����̀+�RZ��z
t=�{�k�ܢBݶPw˾P-��`�Vo��j��nQ�A	��\������8b�����-/fN���	����ŧ��XGC�縻?RxX�E����Q��؟O!00��HD�ԟ��R끑�{M����.�-�)/�?���N��b�v�����~�/�9���w��O���������:ш�Z��8��RK���j{>%�)Y7��w�~�W;�Mx���\ľ��\��0����	�HGho��L~�c8�xb��I�&�*@imT	"CQ�(���!N�a#KC�=�&���bg��3R���wh�"�B�T^,LsQ���*��iv�@��T(��^��Rg�)~L[����l��,w-��z�S�ݲ�}Z�֩��<��H��9��q�nj��piݤm�gi_�y_0�N
�֐dŌ��#��*��sX~yTea=��gy�5Z,�N����A�I\\�ne�#W�[�wp�����ޣv�yj�"����А��D��|`|=��@ʳ�M��[���4�I�h1!�������t뫳^�BS���ty���ۯX��j�6���[��#�e�>)��ܨW�Ζ����_Sn<D�3B���'�1����]��[�a��8���s�~�1Na`�@m�-��n�[�:X��2Hb#���m(�a�a%�Y���sAK�������ط��|�Vn>Nu[긝j��6���
WIܤ�rUPl�m/���N�%{B*�y���z�*[��2f��-������<�++���u���#����5W��Gu9}�����[�l�RMB-��
I�
PfʿCč��!�t�d���4��d�n��33��J�bY�:�1��R��+���X��N���HP�2T�m��r�&Ӑ�Yk\n(:��<ḙ�Q�.%0�H���B��B�P��ɘ$,5����;�Sb�X��C�Fn���S�����Z}f>�;{��C�?���CR���SlB��&7��bW=�}a'K,w�i>��f�&]G�
+�=_�%�I�fV��Y� *@dp1�K�g[
n���r@�k��t��3"�Q�%	���A��Y�b�d`eS�����K��NTs9ԏ�n*B�v�U�@v�B8�g��vyg����E�%�7�PH�6Ʋ�p������[��e�������F�q(
�z���$�1PTh 3^�N'��+�=4�<|�,nD0�*��k���-hG>�.�‚�:�_�q�OEα�8�P!w�)&�:^�&�%9�J�%�_$���wM��D&T��A���"��i����b�=��;t�a4)�:j���=vO��/�+34�7 ,��Y��Em.��-��8���i�5�c�������Ք��rY�M��%T�OZg@�*��޴[�|��
η-� ���ɹO
m���*���v[��$��J�C��[��u���[�`N��0�MbJ�Ac�$�:_&eh������[�<�-��+
j�J/�q�9�Y�)��R��,�,fadD��'L�
��š�Mc[����{�'�#��A93u�a�Q�9/n>���Q�Q}�2b�ƀ��l9q1���_��bac�:���?jv;˂|
2�E��Жؑ0��yf=s%M��MqM~a�78���ܪ򪹲?)Nu�2��J��&�Œ`�����~%2�p�n�/�@O_J+u홀V��;�*$�
Km�	����6*_�����w��ScC{�+5���2M(λy�9�L2�
�yٮ�a���q�����7�n��:�rD�L��1W7:���n�$J�tY�e��U@>�_� M,�$��t6S[�O��ϟ�U��f��~��Hg��ds���#����l>^i4�_a�_Lӵ<4N�;1�9���Gڌ)��h>d�8���4Ge�Z��ěx�9�!V*��ѱE��vޏ^r����vX'R��5��JO��#(�b�>�����*�>ɞv� n���j�v[��_%��-�T��VAt>���N�'��ǤUU�ߓƪ�ϛݘ_���%�%O���m̱1U�1=��O�l��D�Ib,��,4�6U�7t�Wh�����'q�r�(L�Y���Tȅ�g/�
�bXp�g�^se�^ ���t�^�^z��34����Y��x��8[�T��2��ge>�-���w�/;���ʤ�%��q^��F��t�i��:�2Aʾ�C]�P/��b.9�V�̼�ooNu��b�9�!4ܝH>I�
V1y��T�T]%��7e;Ph��)�:3�	VL�ƨ��������X%��)܊���%V,2�&�3g�9.[��n�+�P�3؂��v�)�Q;d�M-�J���m[W��J��.	|`�:Ŏ��������Z������;�ST��r0PY�y+ÞƂ������D��]�eﱊ�4�sJƋ��u��`�8�����k�%�l��JjQ�<98�y���=7r�(
Z��%+�~�����
�J��ݦ_�Hf�+bhaW�g%�Y./��5A	�G
ɶ�q������?3�S�#g����Ӏ��ٹ�����dQ�r~�w��Q�V�§�;G���Gu� &�Zw�֬)xO�,0�I���ф{��T`j�����y>䴥�/�](ub�aV~�E�l���+ӳ1܁�������/��"�ɫ���E'ɻj��%\̆�HIV�Bͫ�7-S@���2|������߷
˼�F/�i-�[�Y�2q����ZyƘ�Z;Y�"
e��s�*#^�VR��de�hU2b5B]1���r8�K�=�SxjV�Fرrq"bMõ`�)�(=
��	�c:5���:`�%!C����E����b[}�͸.��u��MS ^Z����2����$��`����טmZ��&ͅs�4�hPٳ)�[��^�^�܆ګs+oQ9��6��4@R��-����J�ߵs.���Kb�*)=t�.�X)AN�j,ća�w�rt<C~���<�Y�&�U�����臀o�z;�!����b)�	�[�a�c��C�9�X����Gb5�44B��ʯ��#A��K�B������z��i��v�h�;�0�q�(�TФI`�p�KR@s�I#_*��N���y�����Bz��676��Bd��
t�N!�ôPܵ�X�\Z+���Md4�缭���z��:��"~���~/��-QZ���)�XW��t7�{ӂ���h>�54Brlex�PV��
dXa�g����h+څA��T1\���!a�]��>Ra�j��0��<�XK�6�"Qϖ��h4�,�ҫ;!�&g0Fв���U��0��>����L�)Rv���,f��ʯ��$�E��H��H��HV�
!�0W��'aK\�D��B	v[0��&�*�nI�L�oEJ]u��p��+�h4ԡ3D��{(��ȷݐ��Z3�{mn�;k�l�) �Ij�̚���bB��w�O�2m�6ҁ�V�N�4�Y�|��	��4v:;Z3�1���I2N��B����h)�`�)�i_c�X��-����F���M&k�Tb��XL�!{%Ø;������Im�v#��(�'�1D�C����;e�۱���:i�A+u����o�N�1���jԹ��|Xj}��Q�S���d{JT�qt2�˓�$8��Q�6R��7e�g���0���t�$Ͷ�_,�L�8�̧����#F�`�#��S��U!1�b�kk�����}Yb��y����&��t!��lj��Y�E'$��h�>�o�jZ��<�����H&�y��׎{��p�P�l@�
�n��y�:;#̮f5PM�j���7��d�,�)JL��P{��*|��x�<z�d�+��L�7՞RB�>ZbV��5�x�0y���V��O�~T-�����3Pm��$�$1]�F�eZ)�R�_oi���*GUvv��e�oCX빼�wi�;&��"K֩?�Sxp�CX�dk�t=��7�tO��G�k�o���K��yP�~S��\h���y�|g��R�%وy�w�Q�=��`_֒��j���>�/8%�lB��#���>,V�y�i�E�;�H
�!-�n��a��:l!�U�I!�Q�}��#��j�0�O�#����Z�ut�ĬB���A�MHVb�ĢU�+W|��J[����ܘM,:vb���uY��ѣ���U�k<��ڃ@�~X$C�پ��q�9������F]�Q��bI}ާ)9���`ۼy�m�?���Ļ~��v�w�;h>��9bN�ؗ�C�.E����>=s�V��SS�Yk�͙X�O��a�~������I�ʬ�U�a��U״m�O�掁v=��ۡЛ��p̞I�2}�Zm��q��H'tqXLfQXy���y�cOI��e�z���}L�"땳gK�pr��P���W�mp���/Q��z>N�ck+���I��_�m=�蹖���I��0�U��9�U��Q+@s�l�~�Zө�Ϳ��Y���M�i6O�q7�:P\�
㴠7�����`�Tq	�`9z�Yh;y?56~L�,�f5D\��lh�=Q�K��1YQ�W�R��AZ�E�s�W�	S��a�Y����Z.U_���ԅ㸊�iu���t[�%"}�5�nc�	+O�,��)<�{k'0P�`���9�
�(~'��jG%W�J��1�.����M�����isͳ8KB�X?���/�{�N�_�؊����� t����J�@�&�s"�Xj��- �[�
na�4ƚP� Q��l�A�-�w-$y]uAU]����O�������?�~}�	C[�4ǫn�N;[ZX{9\&#va�;�����*o+�yA����z�A$����ziY��i�C�i�m"��Y6]�Zt�Z
�:�@<m�p�O�nxUՎ��6��!J�k��2_5�ൈ�Mze����DqԬ!UFm�AG~#��!���u{�_;�v5�T���f%�7�qqYZ�����R��<E2h�����������u]].�Ќ�c=i{[k:U'~<9<�Q(Ds9�V]֮0�<B�T9YB�	�5�P��'7V[���U^��F�;z�j5�彴�*xHA��뫄���ć���2����=\��t4k~�<����]}�^^M�ʸg�<��	� �y(><{������[(}�ܰ��r��O*��ʖ���Y�����Rm.W73$��B���Ԟ�?����tu���T��
)�X0��>"1�H�s~>������\cN�g�;l�����-UzY:x|�u=��m��mc�s�u�~Ԃ�V_<���bޮ?
T�m}wɀL��mzD#o�X4�GD�	i��f���S�um[���0������&X�bII�_P�A׶���{�u���-G��Ѿ^�+.%���%u/��HV���ve�ġp3V �}����l}'R��'��o�S�̵�ۍ�&-��D���y����\�7]^� *�Fn)_L�J��S*)3T�Uc��q�B���F	!�%v�F/^�`|J2x@%��_�>���ۧ��s��+m-��v���̓B=�ʿ��PSr��5�ᖕ�W<Z�~�?��I\��k�i�R
]Ɨ[(��YpqQ�]*����Kf�z<oE��]@�i�׉�]#����SW����8.��3%����+$�t�X�B�QA
���C�����	��g	��3�$E&��
􃘞XB��i���6�'���6͕�P=��g� 1�7N�z��v�ʦCD����<՚w���i���QS�~�SѸ<��3K��k�
�`�HD`�td�oS���
>����j�A�7�U��/H��I�#���[�"��шK`r�BH-8���s�{(E�z�	%�S2����Տ�Z�t���e�f�
M"T��e(�Y>3h�L���c�������c.˅��;�
W��Y�*E�T�ߝ�*0�i�i˷ӠTg(��$s�	(D�l����zu^`7����`����-�ð�bͯY��aX{�
���,�[*2���γ]"N�u�4E
����C�.\Hv��!�%�(Ћ�9ف��1j�+u8MN`����"�W�	��w�D�HJD�L��&i�����E����œ��!~̰<z>�o����3�"�e�os*�Ƌ��R��#`%>�"K0A��A8E�S�O���zi��m��(����^4ʅ�b�)�ђ6{Ϋlu�����!4�0�1&l�ɍ�/�-7G������$�j{���PG��g��;���^���Z2E�Qm��:�V��Ut�G늼�B�	�*i\�GJ�	J��[�C�])s&�x�c��2��RN9�n����O��P�m�7c{��m���:�ެ��l���H�[����p�m/+q�dĘ�k\�JU)�*Q��x���<�M�8�yg��d�l�Dz[H�	W\��T��McI�0�
��R��܋^%I�"Q�3��i>J�7��'��5����!\dS���{ ڊ�k�A�[�s�z��M6�և�^q��-�c���Zù�
w:W
/H����@�Q &EO�$�Hy��`�b��d:S6���5�PЭcD=p�ܳ~~�������n��[0��O;fW�H�el�4����ɐ��1듊6���f:�&�;��}|b�
f��ћ�E��f�	I���/9��oCMp+��*��jfG��6�t�ӓ�l�2���㫾������w8,�A�F�Vl����mo���b�����Gݶ
0�3�.��:��x�#l�^A�C�OCT(�lC�4�IGP��i�[�lV~f[�j��{�`�za��)a����ĵϮ��Y�C��1h!	0����}
���p9����C���,�N�ѫZ$$y�y3�m1g�T�o�hJw��8�g{�w~:8�}�?�<z6�q��%тdF�
�M�1k"
��!k8�	��{�x�4��dռ�wWlz5πDQ����f�Q7���D��~p��d3m6SPuW6�=�+e�.t�]ye6�)��9�j���n�6��Z�
�g���5f~��t�0��0�&��Okv��m;|��uĪ�{E[!��L�Ksf�<��ԑ�h#�𛺅�h�s"��U(@�ͭ�S޺�545q��X��b����
�]`�wK��,����p�6�XE�� ���-x�WY7&�`�e菰V�yD��X{H��V�3U�Q�#rF��)t�-�3������)��%���ڈ�+{�+Q�ٽ�nܵbւ�����SF�~��7��������r�Ϳ�V�O���,,�Vp{�ȓU`Ϳ�h�8����D2&IK�ɺ�����Y�[�
�	��H`��9}d	i�Qqc-%�B�R��<��{⪚d�I"�c�d���XIeRp���#�W栶��"QQay��p��/Oje9o:�6_�!�v���
y��Q���h�:&�xx�頬?�C��ͳ����$GJ�N���M��^�?�R�.WB���F�(y�c�d���c��U^r�Y<���o�K5�Z��*s`ꗞm��?���[G��maU
�f9�ָF���-��4{�E+m�?L��%M�'}�]޳��i��+���-v0jh��"�?_��W�_rԢ��-��q���n�#x6�a���6���:d?��^>���QE��g��E�=t
��D���K�����
��I��Qϔ�D�U%�P^d���p�mu��@�,�_:���&ƃ�"�t>U!8�̩��bn�
�yV��9l>٭xLd��Cw���5�gx�̆����S�{2vLN_�g���	EN:y�A�iꝴ��r�V���rt�� �!`Q.S�s.S��ԼT83���
����A������C��$��� �ה�.=��4QaI�i����.������?�X��������29���^�m��ފNO�=��m�*|�v�m�}X��/~�!+lԡ�>��\lZS�$a�u�n����psҀ��&ܬ��?D����5�է9?�Rl?��T�@Y���E+���;��W�Дs�3��a��f]q�m���
W���n�D���Á�|����C�A�R�`��&�����Q�?�[*�[�`/�]�Om�@����A�bV��j��[���:�^�o$<�Xw�5iZ^g/G�p�T��wq��<�������j�sO� bS{-z�I��X4N��Ǟ�g0E�@B�}L*R1�;�u��#�̽*/�ЖŐj`GӐw�n(����]O�ԏ� �b}A�>נY9{�
�Q�Z��|�Q�F�qnS����]��zy�:�ҡs�'��m��5ő)O[�"���T1��Ju�e��[�����q�e���K�� ^���~R�LE ���!,�Jn9��:���Q3��u�Mf|�\-���_�U���6uj�� �w�ǿ���좫j5�+oi�
{��ntw�1F�j-EԜ1Ǡ��Ī�

f�'���{���H qNK��t�1����֤	Z��p���F�w�l}�q�aL%��ť��ݏ�'��Gl݊$�3Tv�y��PVڴ ���S\a�@ ��`0'}{q�D�����
�B��ul�O����kw��L�R��)12�Ҽ"�S���AV?�rLL�q�
�
ދ1&9g��!�J�RDtl(�)A&�ήsǞ�λټ$aFY��eB�H��8�H"W�P8q��M	<˞�x��L�O��1���O�f9.�����Dy).�^h��M�]W/��)��񈔶vF#l�%��Q2Mh}��p��y�8�E�7Zz�~'�:�q�=�҉�W��A�� 2]��H�co�񌖌�G	2�"鰖v{e�#����6Gkk��~t�1%�ִ5WO6�����zR_;]�2�J&�/�$o�nt�D��(�����{�v��3mP迸J�5�/��H��s�_$�g�*v�w��e�n>�f��W_ɦZ�-�a�`�w>��sz��U�kq6φ���Ҧ�%-SR�H��
7Ӌ|�rL�
��"�a`�Q�W
_Q6tCS8�!��6�*q�&�s�*�y�۰�)	�*B���S��QB{���r2��\h�i�=E$mv��[�l���(��m���'�Cy�ol>z��W_��o[���2I����h[���U�0���E��;)r����8ud�-��'�R	�"�-l�Ӂ���8�#�+�$~��^�._7a�U}��c��6�Fǔ�BO6��2�n�=9�psV�i��=֭4_N�o�㗃�g�-Ͱ0
�մD˞}"�{f���3G͘�Ju���� e2lZH=c�5?��L�g��V�G$ρ�3j�dv~{��yU����m��J���w�{��S���z�y�wʚ�xX�Y�wm�w���&#�{��`�ļ���"�0fV��gͬ�v/m����C�BʐboᕆU
�
��9M�e<��Zpn�W���Cshc�Y���E=�b?�u;��,�����
�^Cؚ��i�0�!�,R��J�2/���0��:B ��0Hӱ�Q�E�@��U{ K[��CM~}�
�H|=�6\&0!O��[o
�|q@/ui��Y�Ɏ@}:t�t) 3���R�H�I
�·�v�&����BXW��F���͈.;8�e���d��:��/i�(���n�p�L���6뀌%��NH23�+b�����iLYlf��s�Q5	��_��OupYi�Z���z�`%��?h݋����"�%$n=��HRvV����~�z������=��?|X!��<��ڲ�߉��Z�V�w~����VP��u���ٲ@��a>��3��P�@`�9=��+�t�w^���=�
Ss�y�׉�p�
�[�6W����H�I	כ�S?�P�l*̉�qS���b���vڝ'���
�)�a.K1P�^_�F?��]�Y0\��CHI%
�D��L*�[��b���
�S*�ӝ�n�g(ka�;�c�v�m��3�ScL7�LC��nŪ�ͯ]~^�$P6`�b4���բn��J�t���z�]�1��
8V`^����Nq�EL�1[?ou���C��~l�z���.�k�g��t�t��UW�2)�V���Tg��f~�)�?��:п0z�R��]-H��⍼����V=��"*�k�zA��"�V�C���i\^v#=X��5�`�:�:޳�i	����%�D�n_��x��!�2�]�Z���K���t���L�=Յ���ӭ�殯0�*�Ҩ*vXF Nw�ř�~Z]��I��_��Gp]����O.� 7ۼ���e�΃ш��pVm���,�@�F���Nϸ�I��U��p1�ڀ]�]��a����{�6I	�ʘD�� !�'�:�nR����SR�}R𮕔hU#���N�"�w,����P^�E�>�W�x�z�����2��f���b��7A3EI���I)_�ёS�c���W4�J�A�8�<�Ϯd��J�?^X�XA����Ķ��s����=������;g�5P��
��M9�G�vt����;��|L�l��"l��,
ذG�A��J�M�x���E?z&�k�S�c)0y�K�RE�qŔV
�ˌ��]܈}�h�^D�n�+(��cI>��}rUU�r���Q>,�3*�ϋˇ�B�".n�1������}ˏU��MS�G��8�(M<[����'X�)0�@e��%*Q^9	��+��!��9�}��R)��vR�R�|c=?W����iy�,v�h���I���=)Ep1����vC 0L
��dQ�;�#L�rc,I�
F';��R��S�H��[�xaqi*\I��v��8�Oa��z,Z����z��u��q��oEj�)�\�6)Ɠ�w�����Nˇ�����o�}x�_���u�:-�u�ӶNںuҞ��2�\ǁ���(�͢4u����ޗ:����>���_�����/���r�_����������}���y]+8q(7Y�&�=������0���SW�MO_��������������_��(����y.�#�D�|(�vmreCyk���9�N?����l֗�⿚��Ӎ�o���;XH��h'�1O1_Q��d��V��Cd����֟�;Evo:3��/q�? ������Y�-�dΉ%��h0��Ek!2 ����G�2�\o}�j�a8�gC�Q�����8I,���ߕĪJc���؁�$����/02�S��9]#�)�a�2�B;q'��'f��i���Z������d��q��Y�@�-��lS��:_1KF}��~K�pG�z�(@�@0����j��DK�a$���{Bh�`��ۍ�0=�"o���/�	9��l�e3i��7�ȳ�i2���C��||.�\o�f�y�&���YhzTx�m�N�I��a)�C�)�F)�F�Y�9�n�iQԄ�MXg�����n�@y.Cn��^���r,7����<R��~t]�|�7)[W~u��U�a7>��=��4�jum�λy%�H�D8TX1Yv^�M����'�5�o"��=�\��):20��(V�M�w�EF�M/z�lVɴ��yЅ�7Ț�m#U������Y��]6
���9��.f�#��_p��<�ˆ9��-�'S+}��K�Ns
�����H�y��v&����p\r�؉uk2���K(�V�Y�ނ��PHޡ
\���]�H��o;��t�:���n��ԡ�����׏�<�?^*+��h@}?�_�u��5�X%i=hy6��B��\m>5�<��f&�YYʞ�L��GDv���)�[Px3�\�P�WB��-x�L�wj9�@ܞP#K{ȸ6�;��'��]ef���g}X_1�ӆ��] +��
�Z�V 6
��%6��r�?�9����Ĕ�e����#��Lӊ���H? Ar�nt�`H"�bkϹU�	�i�rH��%�@��&�rh0�	 +��a�����LG��M	�SL��Z�Ɡ�A�1�x6�H���yB�V�(p�EB����"�����8h�����<�a�^ugqG)�6F���.��� �f9�r��A�NK5��y�S+��e
�.E��6�9���v&"
>��0J��,.�����(�~�\��I=1=��.�s����/����(�F$���j��[�uF�ȯ��E�9��z���U��
���h��V�:�~+�NB�N{R�:G��ǝ�ߊ����q�:��7I�
-���D�,n�?|��o@���ݑ��Çz_��&�~��jWo�[up�U����R[�Ւ-f�gM/�8=m���Κ��X��;��#�Q��p��;�����uE����1��gF?3�sL?��gA?�ҷL�lf=�Ŧ��J\=���)��$g�H�.�;�j�Y���h$
����ی��[��?n�1A��2|����m�a�1�5�b��%�T��7ԙ�r�����W)g�������Zo�с
�?�1g�,�H�n,H�v�*�0�����f���.�:�i�6�'b�X����m�֣�<ÄH�4��o4G?�HYgu/Ck���>�l\	�:����`�oSV}.���0��:h����4�ڐ�����eL����e)IAIv:�Y4������O}�o��kϻ��u��m��ʞ��뛑fYR�Ҧ�r�"��q*=@���:ݲŵ�R��Q�jΏԟ�k��bs��E��t55�>53yĂ�W-������h��rVڎ/P@�E#�GWW<����i�� u����;}��Gj��t+=k�iYV3�j���F!}P��A)P���7z�z�=(����Գ�ע���E),a�?���؋~ǟ�^����~O����g�u��2�`7I�P�F��fzy��X��jy@�:H+tm�������n\"n��=
H�ͥ��@�q÷�<ju�*-��^�氵��b4�\��]d*�ĉl�Z��$�LRh��+s?�]A8鼹-���U�l�y��T�`�n�*��7J�+B�$���I�	4�-����%�;bW�}����B��}��/�O�ev�� W��љ��)���ı8���4�������9F����_`�BuZ�]lE�!���m��&+М�a1sw�,�Y��F��t��z*����u9I�c�%�B�?��fc�h[
N �n}xF���/7�%�y���a.����O6��HW�R���V�vӌ�R�:4x�f�r�)_��~v���N�>���o{ߺݶ����O�P���M�H����ʌ�(�OۖG�'=-�)�%D$�H�J�^���'9u�Wl�,��3�Z�H`�/��jW}ņ�&��Tv�X�Ňi��U��{4�$�K��x��K��2���g;	0�
zPb�ϰl�h�%�݂��♉�-�3�[�*��_�B ����*^��)H7���<��Q� �p�G�PX6:ûrB�Q"�a�,[�*0W���c���C�������Y����r�[Ԁ�i@T����4�u&��&��B]\/.�"�b�D�KWg�6H�_/�'����~�����M����^������6z;�[5W
m̆����qf����6��)iP�C��q�nV�SדPU�)��D���P�0������w����p�W	[�{�{�������B�(k񕁢蔢�w��uY~��w*���	a-�_���&;�
��C
�S)�>���:l��*�x��E��-���[��(ǫ�ڜ����U�T�㫍�	���\�j����"��Wv�_�o��r'b��g���Fsg���0l��1`',���Z96>��Pfd�d@�������<6W����IA0�E6uX;vmX��[@�f2[��(¶Ţ!��u��IqITPJfC�۷��o�og-���#�i�N����Q�J,#��O��8�����IN?<'o�«mƟ�����n�z������F��c��?��}���'G��1=��K����ߢ7/��.�?���~�����O�9����˭J����w�Ϟ������^��>�����^���7����y�����T~_e�x�����͗G��)��9jH�9O�ӿ4���|�ݛ���4_R��o^<y�f�����~~%�xZ�b�R|���*�cJ�׃��O�y�}E��oy�����C~��y��}5�O�98��h��O��5�R�ʰ�lܜLl��e�=&y
��h�R�x屰Wٲ`�C�f|H4`htz��-��cj���l~��8�n��N�T�$��%V��
�T�$�E�5%�wbl�u�i�i3�{��;���~b'Sӭ�z�Ve�n���"�V�T����9%����JTp-"ָ�+d,i�w���I6YNg����MkG�b1��)3j�Lh�?Yak��E|FyB��0���F��J�eD���!Y�QVk+�	Mrh'�;2v���j�A?꬞FT3)�r3[
$7�2,�
�
P%�Sx���>e�ȺHY���;m���Z�p�*b��ǓJD���5ҞU��늙\��^��V�8QG'OOg�ϩ,���bG����.g>�G��:�g ��Bz������7�p5r�"�q���<���S &���[X��91��b`K�;�v��~����0�X��CH�o��������c��]��:�ZaZF�N]njI���6"�B����Y�c����J�E��K�Emӽ�I�3m�۫&�k��&FC,��'ZA��bd�]�?�uc�4��h asi��0K��[.��T>�a��p�nB�iS��-��uv�FK����"Mר��fc��/L�� `��T�=DI�Ɠ��m�&JY���]�g`gF6�枬����lT�ѬF�ʡ�Z��PB)��w�[k����dJڹjwI���u�E�|����mJ&%��m�
.]��qU�~�T�1�d�t�o����bn���Ƭ�ȿى��w*�Wv%G��V�g%Ү��0��
�!�/��T�?.���b&��u�5+5Q��Տ;rѣ��b�!v�w-�W��>�*Pu����8�� %|�Z����mŪ��B��*AP~�N�'F��g�'�dėL��k��FCF�F{#��絃^v)xj2]N�Pק�o� �Yr�K3�n\����*����ZoNO�o��t�e�q�s�@�aIݫ<xT3�*3,JsnGV��	���[kN�Bm�.��6�7{N�c�%�/Wgr��P�п+���"Z� ʡ�Q??��4�y�Y�v��G�?����l���y5N�a�kn���ͮg,��]��T�ʻ>��YR��e_�P��;<��w�t6�sHIi���_��,H�b�-Ф�URʄ��l�-�I;n@7���h���6R�A���Ϡ��+�g���I�㫴lz&��E��,6�y6�
�f$��m���]��?�谪���O��񻤌�[�ժ���!�W�����>e����,]�٧4�.��~����*��M�4v6H@y�!���H�Z�$4���KcyjvV�~��V_֕�lR��@�x���ϸ��F�c��5�DZ��LT�y�J53�Z=�]튉��}2�Cm�
*%	x��
�����H�ߚF+k(�_|IO&/�EВM(�
K��%нW2�ޞ��R}ǻ'��x>G�&"1�A��B�����	���Guw\��֘F�T���+�D�G]�lL���h ���c��R�]E�Y��Ig�2��fΜE�[=r�МU=�v�Ϻ�.�3�PGe����t��0�� d��
]ۺکd�ѧ��R����,�:0^���\�u5��*up�9%�E��sIJ����,ܱ�	�ZCbKǯ�xs��r��kMKC��iYǀ��_�:.'|C�����ގi�
�o�x�š9v���6:��^\�=�VE]�޺v8����r��f	9�)�|�v�DV•=Ň�/�Eg������	�<��VMxYOh��+�2��e�-9
	�^�S�yPA��
�L���
���ێ�M=!=ŷ�oJ�֤b�.ܳ�������FwVؐ7;%g'6�G�)9�5V
����Qr�<oz�g��l��cx6�8NB�D탪�}^�ײ]����w�f����\�:̧;��2�YueD��B��`��r�-�r����s`���D�]p�Ŕ����h�>���I��>'�Po�J��%����ٕl�9>��%b��N$���9+��|W�LdP$�#��e��`푨�?��*y�׮�v�`0J�s8���|6X��
3�1=��g����/)o8�>�@��X��↥�LY!��B��@'���J|O���G�jX����MS*S}��x�ԍJ�訏�@-���B�
���"��%�`6�8 l���W���%a��QR��d�9�dT��c-rFwHm
��7�jmgAT'�AJ�hx��]2ٻ_��V��JG��	����;����F	Ifu�R�VI#�ꩥ=K����˔A���&'���x)��q�${i+�c����M��B:�!�@#�5��uI�ǥ�O&��i�^��9k�M���m�zX����]	���d/=(�ErN�^u�:L��eH:QyMWfE�x���}�F�K��V:B�d]H��_�N��oK�`��$.R0�rt��ps�~ENp�*�gn-zq���L�ȫE6�3cѱ�5��8?�k���W��W���~�$`��ֿ��km��f3v+�Рܗh���;�Gy�5:��"xdɞ�^NRfҎ�꠴g��s!���HjDfN�>�P�#fE"Hn����<^��E���tK}���8%��n���uZ��_A
������i
��#��������-�� �?C�#�䂲��c�f�B��\nku;����/D���t%�^�ꢬt������-$���!�I��.0�j��)�C�=���f�T'�*�6�v
�ݼ�N��5Ŕg2|���vg4�V1��5m��\@�54���
-]/y;�Ƶt\5KN�&�TJN�؝�>!�o
=P��Р����̤nhRU(��g��
��u�� [�Ζaa�R����
���
���f����U�9[���S�gL�y姬U�Ah�iRꑓU��hE��ꃀO=�d��B���if�n9:x���&j؜�ҹ��zv�w�������%��1;�2��da����짣I�!�,!���z%wP/~ű��ʡ����&3��`� ��c�Q^uy.|{$�9�a�Lj2�Y)��݋-H�s;]�@qJʁ�*W�$������}�\���8��%��;m�ҋ#�����
\�����!�/Q��	��r��Y�~�A[�f����>���3Au�M
�6;��X���3�%_���Ay��Q�u�u�8�� �Fotm�'�ʬ��NB
s���`А�T	�?~��
L�2ܢ0~���ӧ=���nC�dXb8B"��Ҕ~�s}#p�/�I�P�Z7i�F�j����:�\W�4҃��d�>2�Uc`��\���l���G�{#�(��<�-#GZI���;@MH�*���������`��A���yR�Ms�Qӹ`-5<�k�r5`Ϲ���=�"eKv9�Ŋ�"..���zg�۳�$�#����c��`�Qa=�\+�l�<+'2�m(�4��aV��+�����h���:�:�R?�\��O|�[�RSܚ‘z�3�<�|������J�x�/	^S9hIw;OF��(�-����$0A���3K�Q2���V��k��T.�?��9��fr�mG��(-�@b�{Q뗖�\�Պk���H��1��X��NV[�����W�m���=6�7�(T�T�>��$C�Lvk�ә\ 0%��Fu���b&bT��31l�I���&)H�g�z:�[�Lȓ���^��#��y��sQ�Ck{�~t���`���/��C>nC�6�q�m��!�J�&J����-*�f�7Pr��4��z�k�ZK�s=MP&��L�~!D�˱}Ā��?��9qYSVC�jv�<Ms�t��oUJ���@w6����zL�"u�U�8^@#�g�����C������x$yq(b�X2x�ʈ�P�x��s�❿�4.�<0��p5�ν�r*n�&A�2]7�n���}t��qP�B��Ԭ
��<_]x`��ߺ��*=����!)�Y�u�N�I���F�}�[��J����}5�ZX�٠�Q9qN3�!�Ǒ�aK)Y�P̐�ʥ�0���@���=��5y��``�\����`�C�D#��fa��l�88H7D��x��)z���z�L����Bwt�q�8�U4�X���Z�Ĉ	ЯzZ�Ht@pۃbz�`��V�0ң
�	I�z��d�E�eNMVp�j�a׈�B:BJ�D�m���[f<��,�"}��U�HfwV��섯��x��d��N�Ju9�t�fa�;1x�!땩
���Y�m6%lj�I�G{�ThrxSo(�\t��"��b�L���ax�w(1_����Rw��t$��0��F�$�v��L͔�r���vjk�=9�N�5��X*��u����Y[m?"�,��s��@'
�?f�[��I�J��^�Q�#�;
/:(!t��!ȯ�P�#l��|r[��F�I����T��h����� <�u��^�In
�q��n׻��UĜ_�g��`��N��;��j���uu(k[��pe:C���Z/��	G�r��(?��x[6������3<̫U��8C����mM�RP�j>��7��O˂�-j��b�v)7��^�*c6
[b||����d��(����
ڷc��"VBgLˈ�=��@�03�tع�R!5�
 3�,$z�ΏJ�nR7��؞Uekq	�Z�7��V����zc�
�+,�뭾?��[���Q����`��Vr�1�Hxz5`
`����j�Ӕ�Y��5ަ�
�n3$J�!���+j�m��:�t�����'ՑC#�o�t��[�8�)iǭ�!v<M��s�Y��*�l��@�V�k��1�������w�W�ߢ���C|�O>Me	�7sSа
*'�W�P�/o�ŗf'A�%��ͮR��_���n���_��{�Vݯ��YQ�=�b�]O�[TX��-�>��.�]]�~~W��]] ��R�Ë�r��H���s���My��\M0�&�
��A6����_|w���g�?D���?{s�|s���|������G�?��Ä\�����W��f�� z���	d}�ʇ/�^�E��e�������*����A��Τ_��΢���S��yV�t�A9hct�k�{��n�ڶ��5���bGC�ˣ_T }��{dҟ�Ïݖ]>i9I�
��0��ĪɌ`n�
oH���ªJ��Ț�J��HU�>Хi�+xԓ%�/�
�R�'��C�!�`��֨�1��fX��D��5����l��
ECf9;��5���#,���/����E�;[�\��h���[&;,d�p�������;[R�^��ug�����7��hs�>�9���l��s�7ʌ_(��][[����AQmIkө�z̵�Z�ڌ�S�G׻Ns7�.�)u}݉���y�e�/���xs��Cӡ/����A`(���@<,�×�a�&�ϥ�w<*�Y/�+/r�^䮽c�����>U�;>;����C%����Ni�H5�4D��S�3=m�o�O���%�Z9	�y
:��p)�&�b��⭪�t�Ug�m��v{���(xst�e�jԧe�s��\��:x��V.��/-��KM��6w2b�Ik};Ж^t��^��$���Y�x&('��&Ά�'q�Q'E ;u���
B���ę���EN���,�� w�ER#�����)��V�t8Kd6��Sߓ�E]���2�۰z#�����D�-�y�,��g*x��DΑ�թ�mLMH�P)�ʵ�P�4P��t8��t�K���e��i��<���q�Nx*�����.��t (��T��I�\q8I���}{��+�8T}k8 �)
�>��&�����?+_}�����h�yCp2o�����k��aSY�v�f���@
�0�':7�l
*��Bfj�U��J�v��]j&7�*Vkmy�8m�#�U���*
�@�M鑓
�����Rs�~7QuRԙ���4�A{Q���.����y�
Ե�eR�M���\�vEP?ٹ�#Kp2�ȁ��>x�WG7�F���3fF��#�<:Ȝ_`��x���+t�ܫ��)s����s�Y��`��n2E�KX�zE�M[J�t���&���|-驩'�Gݜ�q��3'�������:����s�	cl�Fof0⮼Oם�]�1��2�����T]��";Ρ��ʻ���ĭ�\��*���XbT�	��M�u��+�{� f�_���;ᡸ��2��T��j���������:aX#��u9,�U�u7�C?)�����ֳ��bb��$.��ܺ�q�,������oOQS���X^M�@֩N=�J���IC�-XY�ĭ���Y6P�`��p��-��Z)�?{��'��Z}|Bc�	�R�|�n��S��f>lB���h�6%M�E�
��#���c�KCR�����Qnl��h5�\�ѺI,�Pؘrk�$���qΝ��훆���׺�0>�Z�	HZ^�c��B��A_%�BJ�2Њ�F��7E2^N���,��o�Ɛ��rGk$*e�#�0����^\��"[�C4>%]OR�8��U������)LS��l�4%*J7G�]N�O/�-P�i䇎�k�\QM�)��; ��H���9����nu���)ƒ��bǗ�,b�{���
���7B��pߨ`�6�jБ�"[��@�KF$KvZζ� DY�]jr�|�f^�.��o�{Um��n<z�DG�M�YA��f��6
�B2��g��$|�Us�r2R@&������X�<�T1	�Y��y#s�\%�U�WY�(��=��
lj�2�1�|L�6�E ;Z��gQR2�ߐ;h�s��4�	���ڝ/:�B�B�wa�T�{�jv�2��<I�(Y���2����8�8CUr�T��^:�U���l $�m�"�v���spF{l�;*�d���y
�4d��b5J�
������ך�5�te3����2Ҍ�=���Q��6~�4ы�=�r�4����ݓ>�[H���Mc~���k}�m�a)�a_�=,C��)�'�xe-�l�q�^g*ܥs���]�׈Z&������Y��v$m����Pn�;^��ݾ!�ޜ��^����/���q��g�+��q�M\Ѯ�����p˨�i�u�[������[6g;��^��_���$�Zx-�Y\_���x篧��F?Ra�G�g{��
tx��Gq�`�ض��m�ef�ih
��^��LmZ}����٪+0�#�8!�b�kR:S�k�`��v���,��}f"�T�)��7�}(p.�~�Xg%�(p1��pJ4��?�C!�S��6��F��8㋮箏]�xwv�_T�S���mzgYΚ�N�۲'���!�7��n$Z������&��
���z�,�.�$��4�<�fs��|zj�?=��a�݅��Ռ��Ut3��so�Jb�z�J�wI��SbB0� ⣑uvTow�,�Z�~s)<����W�fK`��]
0�C!��`�>�@B[N�(�v!N
���E�.J��%�ᐂJ2���ׁ��3��Q�9�ϒ���.ЅS��G�]��1���Q���	��=+�={-AY&-��(^�ݐ8�=�.��ȸh6M���:���e�w�D�iGm���@u�*b�w�7��cM�1���]B9h��Z	�k|W���L����k�������h恉�`Q:�&�B��&��ы�6`�-f������SSo;�J̶S[��
f��"=�{�ν��t�A�R�&�Q�����V#�g	��u)��@Q\<@V���N�Ս�?��޲�R]��Lq�1P]q/E6�quN��U����x��ɟZrBPa:���ڛl��Y߰�ض��YVJ#%"�qElF��؃�{��S}��]��K�˩�a h1�!%ڢ���%R���t�"�ju.šV󮬜������?'�H�O{�M?Ƴ��d�*����Z�����G�*T�K�~���f�2�1�Us����Ư���*EŪd��3{�.2�"�uì��9G�H�#��]D��=��hVsZ����bq=I�wq��G�p4H�\S3N�[�CXH��~���6țw~-;{0̦S�[)
��q�3@��r�?4�9��j��5�����	������9V:�$�%���$���_�aS�����Z�&�m�W�2J�E�M����,�g���*���5��b��5���Q<�����

z���y)�2d�hj�Z�qGQ�l�d2�*$Ls�^���>���mC�]�y,f:��c����x�d�<�$�q�}$��������Jd0Be�l=r*µ��k���P�e�!�*r����QQu�.z���Ü�����+�(���)da�
u�Q;�(�����Cŝ�^���h���p��zo8�x�e�1�Z�G�	���4�uLF5D���.���o��b;mH�����y���9�;��cα{R��L^�䋟uu��B꽄ʑ�*L��)�D�R+����S�iy+�z�g�F&�L:�I��s�����uڀb%/Q�)�bV%�ٲ��R�Q[x�LP~�G#ƓeU��}d8��S(z6�zA��4w�l��;,n����bnHi�WeĶ�\�P�q�x�e��Kj�a+A<*��G��
~�]gK����+ŇA<�B:� 
���">+N+�ԫJ%�8S�+`���������b4�޹?�,F?���.�q{gg�T+O�ͷJݲ��*u*-���w��myU㻝�!m�M���d�d��"1=�Σ���aS
t�����o��'�|�-�Z�sӷ`BZ����-
V<��G@��W����
�82�h �^E��Qx����]$|��y�����%0Owɟ��T�Y��}94s�1�'��a	�Q��խ�9�mM�U���+U�"�-�B8?�Q��T�1�]� ��|��u�e�{#>�?V���M/:<v��u���'pXO`D��E-Hi0I�_́��t�E|�䛯�2�g�\DA�ՖT/V��`��XOW�l��-ƒ��i�F����[c}
��(Q��cj��n-��,'�d�H
8`��o_y�qY<���ڏ4��Gw�l��@�]xD�L�d�Vߋ:���p�e�u�v/@LA��sy�������Ǔ,^8Z��T�V;����)�7`G�*�a#�XVR�I����)>ϳy|����SX�U������6�ȸ�ҍ�r�mT�]OK���v���CX!̹̀%�l�ֿ\�:���tv��ܯֱ�����Q]h����F�fγ�	�š�=ZY�V���6Δq�-��業�ܣ��I�/@C�+�/:�a�1�P���D�*:]DR巊	�]G��Wz�z����'h%P�����Z��wDt�7nG
S�A1P�>��&E�6 Ԝk��?Տur�8d:nu�w+O	a~`�[Z��d����p��t��pŶWb�S�˽@va�L�d������B��
�
�[W��X�����q�2q������b��F]��U���
�<1A��u�TG��F
<�s�p�tp9�A�C�‹B�����tw4���ޞ�b6���'l��e{�@Up,e��Om���a� =��!�����_���A�k,�Q�2Y�+����A�p F\܋` �$��T?N�x���^�tW�L����SI�'��Ve78妔f�r*p�1�)�Ѭ*���`����U&��6�O=�9e�%�scU���*��d�,R	s�8!:v7�����v#�{���E:M��X�J��H67@i9E�z2�bN�f��=IT�*]tEM C	y:Q����B
�)�TޭT��vW�$ͺ�VW���c"�*70lf�e�Ad�8v��,�6�<���'�sXl(��@q,4Ϻ�[�w#}�,��N�D�������W"�x!�JlY�تۙ��l8U��]w�vx7�qA�̐�e�R��!m�3���*O��U�$���ݨ���F܆tM��^4
���R�`|֓<%�[�g�'�~c�wz��貫�:U���T֊_B#��EbgQ�0)v�_T��t���l���F���_�ӓ
�Jʛ_�&�$��W�L˚�-�x�|,��c7ā8��(^,'2����v-w�`�f��2q�T���wd���
�
Z#;J��` �.=ŷ[�0AQ�<�Y�Sg���BfĔ���TB���Qz�.���9��eajy ����'�)'$�Z{lR��P<A;�M'Z�z���	��j�l��,c%@����%5�I��s���;^.Hy�v{k{skkk�ϐ�53:o����n:����
�嶪_i��ös�Zn��Ϊ���rG����~����.¡0�E2#N���"]\����C��Y��M�lv?����@������Y;��2�E��l��h��:T�g����,�|�� ���:��?i��F�*�����
�>�*������$4x'VD'5?7��<ֹV@P#e�Zi�G-l��4�$����`e'fipk(lu��V�i�n��Ե
��F���[��
��h�U��d�	��~i��l�8û���mR����hw�~�m� :P��_Z��4��m�nn�:˜
'DY����!^]����
l6P5?'>
L��
q��(�d�	��S�N��}��r�8?O��i~�lOAZ�	j�T�����d9b�@���HYNO�%P:�ʦ�J�!1��n�Ou)3�Cf�,�v6[J"P`G�!"�Nߴ�nK��!Ւ���
+:gX�"B��tH�_fx�1��-L��]������1cK�O��~�:���WcJ��S�gËi�����;j}�di�B3���O�N6g�8�+��r�D)S)��W��"�1�����5�i�ه��*�I��(�����ލ�70�;�����b�$hG�蛤� �@��C}��Z�s�gc?�6����Ӻ-��|��_��H+�Z8���E2��y\\�Z�>�{������!��<� t
��Fcx4p=G�$;�0kw�n?�
��+x�<��	_q�
��B�6�	qb���6���DV���^��	���%�0ڹm�l@m!�72Cl/��%p� yl9�H&i%�T��M�ތ#��X)#G��P�q27U^�v�><�F��d�Lf�N����cIe�-�Hi?�3-Y��,YXVl�O4zO:�˞tm�[:�a��|eu&U?@+BHƭ��-X`��6�719�<�,�7�=���]y�U$��ˀcјC�j[��dֲ��%rI�tVw<�o^�!o��-����6lt
�(;�Wnu|�yێ�۽�o��ݺ���zJ 6�zþk5�j�W��BK�{����0
��ëRV(��#_=�C����_a?�|�}U�Eq����*���Wt
[�7��Wѿ�q�lQ`b	<dG�H�~�*a�E�-E.�����+�m=\g.8�S_`�I�]����h �U�o?I���9��$l���A�[.w�Ҟ�
������A��t�l,k_(�f'��~
�Zr�( Qv����Ǹ��wv0�g�&_�}k�jx�NBe�+CWo��Ѭǁ2�Wlj�=��,����QW���գ==�%?��A��S�`�?7EcUF>���js㼕��Շ�
�}�C\+�\a--����T�����^�9�jjy�eU�wVW�`S�-��A��D�:���Օ���@PXZB==A8vh��Hx�{A|�ꃺ�
͵�@-�QV�yct܎g���0�+he˅�xrj���zCOK�9[���S��0a:/E6CİML-�#�"ڻ��7�d��/UeJ�s4����J�p�ҳ�x��"�(BM2�.���U<�%%��S�2��qJ-8!�p�0hg�f��Wа%�����<9�1d��H�<���Z�|.gٕ��>�1��:G��9
�8�=z�d{���wF�3�ϼ�]��JC�("��E0����M�/��W�Hz;��aʹ`7��
F��O�몥Z`�t�K��A�3�7��$�k�-���:C�2:N!]�d\��k
O�pF��a�{���@@š�'0�hF�.)�Q�T�X�*>�^(�j�n����l1iN$��$gT��|Vu��{/�I6�YYȤ-9� �=��J�Njl�=s�gЯ���$q����
ҩ��ě`�*2ੋ�Nc��D��Ʃ��Zs�:��֖n��5��L�U�H%U<X�̅j�Y�v&)�{;];�eX�i�w��x1 �MA#��(o�N���=�L�����W�c�����T8�P���	u�d����a����wN�P:�#Йr�C�Y.��q�#���p���M�əLNP���ظ�7wJ�m�kl���keC:�+�ʟ�Ye	ߤ�
>ٌ��S�!+��.:���ۭ�+
g)}�ua�Jo�����b��G�9Ȼ��B��@�&b�;�ݱ��8X6�;~�[k	�֔��ܣ�L�,�fe�0�B<����b�gtyv�cl2A�6&�B�3��ۖ��1�@�T�C�$Ti�K+�T;Xd9�VZ&������,��2K04���*��s�r2�X%o�d��R~9�ۘ.��V_�
�l�6β@~����.�� �B�Fl�ੵ֢X-���,��%of����́G@/y�þ�!�N�dzm�䡾�vj�"�l�R^�v��5Բ�|m�*��o���5�Y�59[[e����|J�f��n:9��$�Y�u�g/m���|�g�ٙ����P^�-�F�f?	�L��v�:R尨�U�Q~�fFɦ1�7=4�Pp��Y�R���Unj&r1�葡��d)�ҚgK����F��:tQ��C�>��T��k+�I@��$�>�x�	a��2�
5+'��k<��bɈ2$V'h���<'
�w
��D��hM6a�x�a��Ef u�F�$�c���w7�A"`[�x�IcW�H�9C�to��+���=�6dHmj��cDf�����<ZD8�s�8�b@D[U`�`�����`�]���
lCa���*c�{(��.�nw
���j./Kن�1U�k�M�lNF+��H�%��<=ir�3�$kt�*�\u�Аq*E�a,�y��(�x��GS.��d
+�K����w�J�Q@��lY(���w0AQO<���2Dk=C�8�Q`^^
&Ձ�/��h����(I��m�*W/����R���u�Z�����K���>6�F��؞,��F��up���
���4�x�PJ��¡_��Ro���Sɟ�"a�$����XN�O�~i��AC1D�3N�3\jH'Ƃr�&�����ڽa	�Jl(F^a���O`�Ѹ�AD�
n3-_���xS�M+��A�Z�n��R���*�i�}��,�Tr��
Z-�,N�IGR�Y��$�{n$G=8IrHP�;��t��u%	��T��;%B���jk�,�S8�0�B5A~�op0�NL�p�4��=5ժ�'�[Z�a����w=L�?����بۡ3�"�S"��x��7�Ѕ�!��,��҈��0a�%s���Yr�S�_d�����t��OZ�xǖh[Y�@�����"�h1Hw*���h����Q��-����7��y4JY7�v�g䯼�6m��S�&գ倪��7��ʹ,O�X�$��I��,���U2��w�)��/�iJ�E��(Dm��s�&�^�-��n����%��5W&
W���*�ה����
&뉊��•N/�Y}=����i]#�	�N�C$WmM���T�/<���oh~�Ȋ�_���X	��r�i�\��k,�E(ň��&8V���;?E�!k���󴛚��i��~#� G�Xm�d]�v���9="oQ�>�P���Q��G���G��t�S�M�En�=
ei�I�!��~�}��ǻ�EE^v'=R��P�[�0ߴ��9>Y�I~#ڧ{r��P�����~Bh��<��:R���7�z�����؛��
�/gD)��aIjk�)z3�Pϲ0���b��Tu�!�u-H�w����Vq^t�՘�����*��c�P2C4����E�.��'x+��z�	��4����O����w�핥��EXx�Fl0�|
!^��rt�K�ղ��FŸ��Z\��v��Z�CD3�YvC��V���Ԅ��V�S�v4{uI~>��3�t�SB�-�t>������V���EͶy�g]�@θ�����Q��H�(7VF��Q#��g�F���d�*�&�������ud3�1C�o�q�֩�=��]�=�����ri���G
偙�i�n��|�*�Pb�2�'��g�gf=ߵ�����я�.f2�h�&ޱ��w�������;x%f�?���Z��۟�����_���o�Sն��!�s8�N�%0�$�J�QS�~GKh-�ߨ�RO��6[��i$�г/G{����4:�W��ngk{�>�-uX�ξY�
a�)��>�	�.�s�����J����rqL�P���D���<bu˚3u�ZQ16�}�`
RMԏ�QpP�<��[S�AkZVF^����F�,5�PY����:�%�;7��݅l��1I[�sw۽	�\�=�E"��R�̇HP�j4n!�O��c�'	Zd�>c+��1�#�s���N�Z4%S� .xN�x�x���>-�6�R�aˮ�Ҹ*0j�cI�B�I��aF�\��,�u���D|��1�Ƣ��L�Qm�6��/���&�1�,���Ӹ�z1*N~�$�8�����;��5�x*E�&��/�Gϱ��b��Y�'�
Yy�c,J �j8�LgD��l�_1rF����}���Pd�p�l^p��,���"p[]����1!����[[�I��Nekn�9�~{V
	�1��P\w�5��V��`�>.x
I
�񣨚"N�}�,M�H%�ɐ��:P��7E:���F�x�u'�D
��a:�&Nߤ��Z�)ր��G#+z�2��b�(%�}�_��4@K%�=рL�Йǎ�E�w��*�ޭ�:��K(#Z�,�=���b����(�T�_��r:S9bQ�1�-�[A�W�H���#���m��u��'�tFЕ�qI��|���dP� �-�h���{>A(���J�ڌ�Tc͙i<��0ʼ�i�1Ig%�T��f�N���"�dSH#j�Qr)id�ui�V��,�Et-}
Vz�`w$�
-MX�y�dś-svk�W���IE�q1���!F�@�{���6��J�Ӎ֢%���۪�^*��Gd�٬����ʬ���T�7z��*�;N��,������돣�)�0�v�b����$O��@k����)Q3ZYd�����ѱ��V+���~�����Q<�X�+�;�?�<!����D[e�6��fK+��c�-�w�U�&��L�
������U�W%���Pݷ�T���!]\Rh�N�m���׭a���0p������������	�lV��QH�P�H�Hoq8���`��p�^�2���X�h8l��]܉�y6���5gԩec},��G���pia���ĮQ��+�3��B���E�q��D��3X�x�5F(�y�EKO�4��Ryuq�VZVB��,v�`��u^�p��
s���-$�R�%��P��qU�e��CDhJ�P���+J��.�Ȗ9�[,y{#���_�h�
﯐/�{���I<Z���(��e��j��#cr��f��VI�e������,�
u_G1�6�lY�F���E��<�9������1�Gb@}�w�������!�������,a`1R4�ī�G�aML�wd�������S��'f���e����/q�;-*�e-��(�

�ҠC�q#mHM�� `.��{(���P_A�J
_5N���Vѷ��6��jK�4,����cw �	�Yi�:��C������g�K�J�㐊I�K�D��L�7�Z�E�Qt--[�i�9�<�vT̵���6Y�6{�9-	k����Q�
א�PI�Mg��r�`u�X���;��~g��~gnv?B'��YQ�F�"��f%�RW�1重aMq�[i�$Ì��ɘ:9[��k3�g$Ǘ�r�n�}2IF=���ICA�������	� ����&�s)⑸�
����׽�wF���\wH����-�n!�f%�F0�nu=�����|���WIs-����R���Қ(+��]�����]�0���]2-��La��wA��^@�����z$ٺ��x5*��ꭒ-�_��x���r�c [�?�o4�?�[�ꝯ����ﴆ�vu�pnl��α$!e�d$�/�����ϿX��#�nA#D{4��rRX��ꑹ*��c<`L����;c���Թ;���s{.qw}�W>�	,�	�o�Ǜ�w�l�����g5kʖ�['�}4�T�M����$�v.q奖5}?�"S�vr8�=��}kl�T�=�c�@��.w�jM0g���!4�����R�I�L�ϿD��ؔ�\�jH�u%0�־�
ZGՃ���}�Ο�l����	��
6Z����F&P�at�y�B٘���%2R��D�[��P��{p�E���+��$5ITz�>���Q9-������[�r�v2��k�<~&	��3H�a��K�D�gl�����ͻ�?�ۿu���Z*@�N��{O�F�ڛ�����ɝ����=�>A]G�y�u����99��*��o~{r��j�%��oP��l���a٘���r�P�7��x{H�\�I�����?�j؇��^d��3l݉�m���Q<;Gы/8�j�ˢ�&��[o!w�<&WЅ�@s#�1Y�u,2��&C"r�,�Yr�_��x�״�S{�,��tIo�+�]�c	��lʈ���L�r8K�O&s�tM��EJ�e֏�y[�o�L�I���Q@��"z��yvG�l�g�Z�+d�V��'h9i�-�Z���Vop�[��OZ�y�-�c��_~�*��72)�!�|~��9�e���b���O�`�������|��$N�����EO(hNв�Ku���!�׻�`)�E�&[@E�Jծ�ĺ�i�(�2���]�z1�d�X- ���)�
�71�:
%����yF����Z*�"y_]0,���ۺ���~g�5	�! �g�xt)]J��~cC�Tq�P"F�V.��H�� ��`��̆����[n;�4�S�=-5Fj�V:�����v(���2�o��(�Rc��M���?g%�]nty�5I�嵕����+l������ʁ^��w�P�n4��B�Rd^eZB*Set�TȱL\�7 ��s8�( ������«����qr����.�a.��4R�>O�����IB�}2&��nL�q��lȬ������4��_c��Z�o,�B���*���')�������-(�@�rP�=8N�9N/G%Ս@��,�@aS��26�A���ð�^�xDvru�dRԛ!��.�-��*t[٫����T�
XB5�����	[5A�u�������� ]���;Y-�:[*�&L��V����Dq}�m�G[�h;vҘ��������NSD�g5N���V���u�A�Fp�sH�,�<��F�M�[��Iҵ�5��\[�Դx�]���*z��g!0�I};d��-T,�SHF�����ˊ~�UM�y��^t���;��%��?>��!F�����P?��/����9~��������:�
D?�p�_@�Ob�~�b��!��)�9��*�����^A��忠�v�|twD�(L���*�i�M|�&�=�"��y� �c��-%�0Qz#���q��9��Z~��籜+h�Ei��x.��~� .F�5K�x��DS�1-���M�q�713��$�b�e��y��*�g��rE��AcW<�-%����.AB�pL��I�G�F���U�C)=W_��F�?�:�����;-��8�����d�3���(���V��v���z;{��}{�~�Z]��-�y��-Gw�ݻta�n�>ʖ�B�(P7P��֪V��n[����*P[�VS���7����}���q�ŧ�|���x�����������(�Ɍ]�dW����c�w����,%0afe��1�%íM��9��%~��1��yg� �3��4gc���S�Q�5ȧv7�Zl:N��ŁĠe��r&($�g���%K�P(!.�J0�3�BS��͋�M��;�
����zLj
9��>�@������;'��\�LQ�ϕ�w�x`Ft���lH�_�½��-'�o�^J��'��Ri`k����`:�͊D�KS"3w��&p_��o�%I��W��4JNz|@�G����Jk�,��7��;t�X��PKk�mW�6 t�
?#*setuptools/_vendor/pyparsing/exceptions.py�Ym�����_��iK�i�X��
7H�:F� �jE�$��%�����wf�\.%�|N�zt�����33�L|HEm�J��O&yYW�0%�'��ݣ�׹�N&U�,nL^�v&��)+r)쯬�,����Z$�(ؖ�*Q\n���<�2ё��5Wv\��n&�IZp�٫NП+��dׄ� ���\Χ�=?��_��o����^�E���b���#��IxQ�lJ͖w�!�&v{#��.HnaEG�R@V�8��:/D��{�F�?b���t��S�8��ހ��������=RkXЛ�٭�΋���f��&/�uvN���F(X_r�
f�$r�`�,-AMjg��<dՆ���`z]�k!jx�uK�-G֚��s��
׆,\i��A�3�aI���$IH#��E�����-��CE�.X.
���-5Hl]6���NjK�w�^W�n�(D��Z-v�c [��
���rM���n�.I��9�I�t�_�&�'i�	���)�}�qz���-:|��x�)2��3�E��fWe�P�C]�\�����j�[�{Z�����0S1ï!ƥ��R�t*�f�%�V(0Φb��k���\G�zb�$(��_�0��x�EF�z�@h-��9L�G
�Ñ�ҋ~p���o���cY��B+�ee�4�A��t
�3�Ԉ{�mA���}@Z��|�3����+��R�{�X&�Ma�0��
Y����J$U�y�t��@�z��$��m$�d���b,P��M�퓣E��G�"�=�SV�b���</P}���&���kN��{�[@v�������~�Q�=�J�A>CJ�����������Gl��Gk'Ù����{��r�k��ƶ0��KI&>�X{�b��Zb����(�6
MV�en��)��������� >�����
���׵�n�Q�ѩ�CF� �6��G��~	b�
?-��OAL9DŽ��$W'	Z!I���(Q�;J�B����#�zG��RBFÐ�$W�80A␨$�%��WHBR_�dE�|�6t!&Wز����Ձ��K���\�_M�'�d�We�I�yA�
���	�Ѿ�Q-��бFDiwZ^TŤ����4ߕu����^W/y��	�d�h.q�c��2F����H��<�žbt�U���$�Z�\�v��b�;O�n������	���*k
�l��v+�Ib�2��[h]�R"h�c 9�d��Tp�S����)Xz�zʳ^L|�PP����
tq/׽ǹݡ}�c�`5[��X�],^��\+��'>rB~c�{ĿV�a�+֨�?��L8^���!q�Fs�ֆ:�=+]Ѧ!]�C�Y
Q_"W��eP�����1~S�f;~���zHo%�cQ���
rY�ݬ�PB���*��o�
����P��A�)�V���;MaZ-*�.�dW�-0����KOH��(��*������Cz����;�U/*��g�fV�$��%o���P�6��b��wj����W�-5�CG=��>n�|�l�/��Ԗ�HQS52k�۩}��(�N6��VcQA�/I)��4@B)���2Î���X
��z�iE��;�h1�S�l��]��⭪�:<?&~:�ud���������.��N�_��}e��X	�ء4T����
ᷗ�X&ߞG^�
bS��

�h�B����OXN�?/��ۍ�c�[�{jo��F�#1�l8�s�š�@���;��L��L�v=f{�G�K�%{�;��ep�g����u8}��qܶ���mn�M�� Z��n6zZ�9��aw�C��r]�0�K��I�Q�&k8�;:��`{�GI������-�-}b8�C�H]ϣ�Α��ݢ˅��jh��#u�-��l@.:t�nS�Z�C��[��o�eם���y���n����?ty��[,�U�7�u�B�O��C��`�Q��̂�m�ۆy��5������I�B�հ����UE��w6*�&����C�B���_�Cq�*����y�ϞD]�;{~�e�o\b�ۼ�ē�ueĂ���|++�n��z�G.Ӣɜ�1�
��z��E�A�IA�O��;�TrD���ow��!��U� ��JC��
H9��Hd�M��E1�
6*_������-�
�����po�m���O���P�|��j_���t�>�XU:x��1��M�i��]uk� jl�����
-���^��Z���Z���Wl+L�3m ��jD�ǔ��A�J�v�ȏo�ZWZ �E�%{��Z�U�Sb<���%��OþCL# Z�0�/��W����,}`������Ы�e����0[
/���lA!�V�s`��
D���K�:���y@�(
�����բ-N:�:B*�2��=��"˼�ڱ�O��v�+7��c�7#;Q��Q�X��b���5#�kK[E���S�\U��,@�mZ=����Á��S���Fc�lAt��=�)[7�;EW
�BX��n�+l߂�Ϟ�,N��Ŋ�g�3��:�Fo��a��1A�;)$j�?4`�OȮ��6��y�iZ���Ft��Ư��Ha?�17�[(� \�T?��Pk=��"�@��$��X�)2*����T'������$h@Hw8\���#H��q�vW�;���=�\�z5���[�=�%�=x��x�]���{�{�ѵ�'M5@�q���PKk�mW�*,٘'setuptools/_vendor/pyparsing/helpers.py�}�w�8���+0��i�r����U,ϳww�e�\��ٷ���$�fL����N���>IJ��zv�ޝ~�%(
��B�
|"nd��e5\�{�bY�����P�uZ��҅����2ͯ{�yY,�P��8���u��iQJ�hG���43�'U�T7ϳ��e�d5M�2.��I~-��MRV�^�IΊI�i|�h&�b&�t��rgiU�=�eY��/yZ�U]�;"˳L.`T��D
��c�;-�4�#1)���d��G�4)��.k�d)�S�V���v�_�e�]\�I�A�X!�w��c��
��g������%�@"�bN$�U�TbO�7��)u��*�+���t��T�I�I>�*1Mr�r�|&ȡ��a,��*T�d*�Kb�ƺI���Hj^|�e��fJ�b����JM��\ɫ+�0��X�r5��r(^�	����*Q�tu�-y$���� ຸ�@����KY��h�@���3�u�?�.�o|�U��4[���9��w)L٦���	�
�]�T�%͠�
{T�����:��q�Jngq�����n�mG
�ٗd���h�?���E9�ly�TQ4\"g�L�0H��d2�N�H<A���'I ��	��N��[���/�jQE~:���NNF���/F/_���l�~��V�O�@�X(ɧ2�1�y�a��hd����7d�VI��x��"�k��I�W,�..��H��}9��|��	��ƀ���\��~�d3,�(������y�����`�E8�.Ɓ�]I��Qc��yQ��wC���R7�@N"b[x��zv$l-�V���$[ɳ�,�0�j�0�D�k�@�R���� 2M���X�~�/[�u��D�Gc�5�����o+PU�����1��+΢���_��.�[_�vj�
�a���Ĵf��x��a$�@Y�9�tȬ�Dvi��h�n�#U>-V9VL�2Y���[l̍�Tb~�Ԫ--�ү��1M�k�(�4����؊Q�P�/�
���Ɍ����E��ͤ����܁��,�e2C
��2ˠ���'_ۦZ��d���L�(�_i(�Ɗ@���1f��G�@�P:3ݤ��T*=���t���@���n�U6�Z��G�}���˲���H���3�����-
�(���΄��#atk�Y�҂|�������)!�p���g��7i�����Of�4��`�ArS���C؛�(&[(ڏ����ϫ��L���,YLf��G�ZX_<���(z�f�]6iw��ě��$��Ye�+Ai�2V*�B�q"�s�����K�1�(�	�C�-
 6\����,s `�P
י��1�H�g8#�X1Q�B��,� ���]�/Ьp�Tt�F��� C��.4
܁�#�N'
��o/И�?��p`,K��4��K�<ܙ��Sp�G88�?�tL=����+#�#�Ӿo��@gj�7��Hl�☵���(� ��δꉉC���"v��ȳb
��´ϐȰ�L���Xdʼn��͕��u�X�`�9C���(��aU�v�t+�R�G�iVv�>t?�6�&����c(F�E|��ui�����΍����f������4'`����VȺ`�y���D�Q�uf��Z�0�0<׶u�P���FH� >�Ū�~�a�<�>���B=�HΗrZgkUo&�c���ԪV�f�G�И9� �ά(nQ�� ��\���G��|(pi@AKS�Ӳ�=f1�*	,:�g�EM]k���`��#�	�����\��`t�n��TtE��&�J���آ�CT�,H�B�v��r�����)u�j�Z]�f���z���)�FW
"�Y3/��v�:o���D��-^Ty2��4rE��&��\���7橕e��1P�[(��o���K�yt������J9��V�k�0��/��I�|��ht���׊�j�Y�5�bc۵�R�`5;�.�EE�0/I��7��ҕ"8�
1��!��-M��%%D��692Y��%%Cx9����D�6G�<�����x�}��E�@���;����
�&I��0�,�\Ac=�
a�0ACk�P�#\�΋��0"��3n��93�@̓
T����Z1x%���O�^�?�];#��hy�}�Jr��Z�ʄ^6,E�����|V���9]
\4�ѡ�@��@�n1�� 
���9��V�F9d^���c�K�ª3�iR��O�A�<�����f�Uŷr}"����~c����A�o�tzk�1�%H�%:|`{Tm@(�w%��]���'���_�8ίeU�ܫ�+���S�$�:��y�N��H��=Li�9��)F��\=J�k���|�#�tE:x�	qq>� pM(a�r	�$���v��7��GR4���v�I�G���^5�5
|��:�kt��z��U�B������*2��0��G*`�/�_�u8�k�C�t�D�s%��'@��{�C
C�P��ˍa�2wƦO��8WW��w��LS���I��M%��E�%�]3D�ÄO-�*<���z�9[d���f��ƭ3a��"��ܼWS��6l`�v��ٻf�X��f�xҐ���l�(>k�g��W
47���.��2.p���
��1��Ac8>�ω�P+7�u�Yv�=��xp�����^�I�VE�m��� �KE
GM�H���=���P�����3qz4>9�����ֿ��qIqq�?E����A0㉚):|�ET鈊�S�X7����tN�;�À�x�j�+��Y���aU�s����s�g�4F�/���c���3vPD���B�l��c|`#�TQk�$��I�' ��(h+Tt�M�v�_*	|bzS��ܶG�eK�2�`൅��e6>�O���R����X(�O�a$��j	�Үq�8�]u[5ۘjC@��+4GC��.�I�
�NO����<�2?�q�k(����0�}��(oGu3�5�t֋I����&�lh{qi�u�YQov�>+���%;m�g]0�)�	�Lb��y~G��9��;_�WIg�u�����j���Y����X�1h�6|S�"Ի�'PN��:"�8C�5XC��l%��tFH��E�Y,���n�O
�J�Q+9Xdl�7�@Ј�'<|Pa�F�Ԥ™���E�Y���@��@�^ �S+.nR��#� Pm�~
o�t�"_=�H}w��i�L�S	���mh�r8�˨��!^�����Q?�VvA~B���U'`�ܶ�k�*���yg��X^�u�j�Ĭ۝��1���fS�0,�+�+r���r��7oߟ�8�p�JT�O���u���"t�mg#�y�qk7��##��H}������ňt2���47F��X:�ѱ��>4b�T�@n�xs7�'�L�,>N�f�`����3#�\	esT��2{�M8���I������lj�!>k�"j[�� �k�r*�$T��k�T�v��g�%x��BS�\�Aޡ;J> &��Xt���ȟ�uy#ɒ�Ղ{�	���¯aVܡ�Ѽ���{�C�n�*��V~����:�u/�mڳ+���%…,Q�d�b��'0� ��b�G���d�f����`�f`���@�*Pa^�袴@\�-
[6�Ƶb9� �r=�ܦ��A�N��9��[\ڰ	KASH(~����s�5�b�Uך�\ɍ��[ŧ��$�
"�9�R�|PV�Y�X]�n_B����?�]���
�+��RC��X-��c]�
,Kڜ�
3�D��S�T�`Q%�hh��{�U>�W�+��O:L���D~�C�����A�Z~�FD���#'<�t$�"�w���?|�9�B1_�$x���r�L,�*	�.���x������������}Uf��n�`D��4����]�k���>����%�k��1�w\���15�8�>�wC�n���@��K?�Q��Ԋ�=��q��w��
ި����"�({��$�`e��@*�D;���t�1��%]/����
m�)E)�"��P�M����ޡ��T1�#��`�ϬɎ
�O,���Ħ��2*?P�J��į���=��n3�)��3�Z8=�Y!�K��n��U
��0gRؾ�����z�����Gi.��r3�ST/���F��=E�^�y��9��%��#�;ߟ/v�ч������(52��Iȥ���CA6'O6m+
��`�J�W���6U��
R�Ӂ\�|��ׂ���
!,X�%wT@��5X�sr�ϰ��h�+�d��2�����Y�.y�<N�Zsr>��M�����T
05Fb@����e�3C!g��4P<%��V3�m��2�����\4�ʍٻr1�p*?&���ó�=�$�Мi)!�LpLH-��B��,�ŇB�#�S}��,��20�<G;mzT@��m5΁X+��)��%�h�xAU&IŽ	���U�,	�
�8���\�����7�U9E�B��8���f�(=FJ���hJsTwϗ�(Ȧ�5(�`|���9}99S2�JI��2�|�ZV!��7�j��l	M��ty^�����!}���~w�q{5[#��K�e���{�Zr߫��>47qgY1�Y�PO�l8�M]1�m�W��|�0������w��ͯ:���Q,��a�9 �D*��9p݊Pn��F�8��]1�lڶ6���ѧ	��_:�Y5�{S,�ň���ϲXv
�k<�!]�RC��L9�G������_+>�5+�6V���e�@�N���W�5rF�ԙ�m��<�'�^�����7�[��Ya����{���C��;�d�%)���|�}�Ry��=�k��C�Sȋ"G%.U�F�0R��Ɗ�ɵ��=>����/�ޡ#��%�J�N�˩D����5�#H!1���i�N�M�<+IRH`��Q�%�������>�S��� K��e0�!z:ΉE�9s>�g�T�Vю�HX��P}`k�iےF� ��ĭ�5�w�T���6�>L�(
�DF�_]���@�۫U4�sj5M�7�29��_aBΓIu�Qq��6�i�:�8�+���f��B�ys�����e����'�v�����aS��&#�[�cOqo�@a��'guq�����g��~
]ó�g��hC� �"e.j�̓>�{1}*�@�~N�k�0 ���U;���Wc���h5��9X6 %	.=`C�D�P'��mqO��d�Sn£R�X��	��mU ��t���=�B��~���`���i�L::;:'Z���$T��P	;�����D��T�
�m�ˆ:B����Y"�{3k[m'���a4�{�p�=g���h��O=�G�=�O�)��r��޳(���GG��Tnܐ�Z���1ik;�3��HKO��Zݞ�^9��q{�磂�^��*5aY�ә�E]��7�L|����z�&K�U�u8q&
"o�d}'e�.���6��(3�9inh��Y�?/T��҆f:��M.VM����R��u%lo�T�9�r �(;��
�Dū�,|o�>�:��Њ��row���`���!���\��>\
�hŜ״P��|h��C��2�J�F��I�r��1Rʼn���<!�>�@��yV��̊��
!r��. �n�v)}��Yw���.����l��c��&kv��Y��5��`�P�uz�]��}���@�����_��a?���-�xR�0������5��e1}v�&�1�\Ɗ�ܳ�i<�3#\�c���s��x�
�-�p�j*�u������0�ﺢ4�c#(C�0����yl�6�asԎo�X�S|0C��^�)I߸��0+P|���B:m����s��^P�o䗐��vA�PDz�����}��?re�K����
�}B��8�x�y��w�3����n�I7�^�/��(pvP99��p<�I��Bd�L�B�r�"\n�H���TEU ~�~д5
���+�{��}����{�b'�YI�Չ6��T�2��C\�բa�x5��-K���V�}*�4P��}
I�9���.%���$�.l����vn�F�=�&�:rk	��hE
��
qBX�}��i�>�:�pq?z<Vsl�;�99�X?�٘�M�]�����
�@��8v��x�q��˳O~y}���W�g�O��T~{e|���&����֌p
�A>[v�pv�r��N{�x��@���#�1����N�U��ջ��՝���5��1��6'�OR�#���Z]u*0��W�h��[=a�����	�k%�>`�b3Lum���c�q�b�6H,t#(�4Ƒ�Ԝ�
�h98l�ޞ5�S�����=<F�+�O3�ɜ��8�x�y�N7?����"�����������'��1��M�*��H}�'������<���9�?�����O��a������J���y�I�CV"tϧu��آ����.�]��^���b�{�7�ft3r1C��"�f�,�,Ns�`sa���+;.~$4�,�%=�w��+�U���fr��C�r��î����
ƴtGEM��	
������/�w�d]Cm	��,�64Ip�(��;\�u7&�L�jb��>
3l*�r��cXJ
��N�٢�3��:�C����U>*�{�Vc���P�z�Um�P&$���mdG��(�@����S2�1&�E1��/�~��Q;(AƝq�oT|p������w�5�F6�~UJ�'�����
A��T�Pܐ��a�x�Ǎ�L>��������-a����ą�w��j7�Ē�E|�Չ��S���+��N�~�lh�Ԅ�z�����i�}�n����T��j���B��jC���`����W�L��͊���}����Yn�	CN��0���dJv�
mI�WW4�pcpGl�G&|� ����֫\}�D6G����1����*�(7������^V���k�e5�\�����.�M�c�h?9Xk�Z�Cֽ��1�&���`�fZ4I�3	�d�p��I6u�<x���N������OlX5��p|�$#�F�ΝC8kP�4��������wjՙ���1�J���R8	q��#A"�����Q�DOA[#����;Gɡ�@�0y�J�Ǎ�v�`-=�5<��ZޞYӊՊ�.�/�Ы����98wr�i��ە�X�nƄ���eޫ�T���K�5^�c�F�=#��n���N��"d�l,F��\02�M?�����;!��\��a���y��g"���)�WH�ן�t�F�{|��xQ��ɇ������ԉ�>t]c�<hf��C�L��,���qXGMV�{�|Ij&Z�S-�qҒS�`�j�����
ax-�f"�Eb$0'O����g0+
��g?�}k��W?����ū|�~yS���v���EyR^��*/Cj�Xl�{��R���@l|tٻ��O����#��al�ש��?� ��3�脦K�����}�K�I)��s�Yor�+�i��+:$U�?l$��<&��e�5a�"��G4��džI���L�����Y$3	�S�Vjd���i$|a�T�dk�&����C$���!��I���WdSr�������t��P��Z����-�D�mnP��g��
{i����P����5����X��Ɨ��ktG�zq����!��+)����h\
�S.�7�ȥ�����7�Rʹ��=CU���ӝ`e��P|��ե�#����ՁW*l!A��i���݌)f�p��=������	��BeVN3n$/��N�Y�
N�t���Mn� ���m��gj
r�~�
��{,�;���6����h&���P�);��C�! �m�|	�a��1�wLL=@,�����F��Dq���S����SFY���Z�4���A���um�O
��QiS�N+(ѷ�<ta�;u&s�x6h�(!}�
�q�Q���J�P���~U9t����P?�ַ�Mf�C}��RJݳ�ߜ%ۅ����Ж�%4Eb[;&���H��Z�����{\�
�v�pu�Ԑ�~�K�p��:軌�J�d��t��_��y�t�-lB�J��!iZ��/i
F�u𻇗I�[G�E�Y�:����\/��U
�mi#��{*��Zι�9�1S#얐�fNH(j�TC/�a�Π�G���I�S~�^��E�U��YD7T�v��hĉ�:��J_6��>8R}�6
���H��9i��V�7�Ӧ�b���ڼu�Ɛ���L��':��N�o�S�_C'�f�g���7��=(�=����hYP��r����uPų�ʵ~�u��x���Ū�i�ԁV��2�s���9
3Zw�M��Y.�_a<����$T��߇�;��Q6n��+���^-cG5,W��U
�؈D���;���Q�w��wp� P�+z�b���> ����?
D�_�����t^��D�¶xvi[�
��>M�!V�/����J����0!*��U�Hi[rv��ÀY!�
��'��:��ex)�6��OC�q�ᎍ����r�<���C����7�|�j��-�4�u�f�z�S��'��r��0&?Ec���8�iAg��=�F�N�o=���6�h[v�-mIB꫇R�OPpQE}.��7CWk�9K6�+V
[]�^Z���ؒJ�X��@6�"!�KT����BWcjCy"�d^�.߹TOm��%���_+��5hvv��Q���+Bʂ�����q��`K��!�����}��Fn?�&�)>kEhҥ_m4B2�d\E���Ѱ���H��;]-�?�i�ðkl�ب�T2^d�߼Z���w3~���J��mM ����9�B�#�y^�Z������9HDx���#"<������ϼ���gS}�[�*��N}^j$���m�d��N�>%�\1hݻ��іѤ�����-�5�o������]�Y~W��#}�S3^��c�P����F���FU�E�~��a��Ng��Vn����.�8����N�Zd;pP1��Na[�t��
} X/jr+#�|'?��F����-�������7(����٨���Q0M��if��Pݮ�׿��aH��uY�|ܲ2�+��oCV�z������.|�z| 0O�,��*s��2iD[�܎��Y&M�u��.3(z����7+_��
�ӱ�=��`cO��~A�K|=�)�pn�	��;x2FY^p�x���1�����2��O��ť=}���$x����Lm�pNd2���J�o&.3&|q���iў��j���Wg/TC�j��{��ޭ�j�)�q�[P�jz�,�k��%N�:2�Y�Ki�����j�uf�yLU��dM�P�X$yr-=���nC����tQx��!��@�sX᧯IS��9�Nɮnp[���Qc(4
��O�-��ݸ���S��cK�.��R�W%��H�9�~��wF��!XŜ}�t�dy@ӥ�)��D�U�B:]=�n�Z_<pj���y�)�z��V�"��x�E�g5�!R�4�d�/n�2��׺N,\�'ᯞ�;q]U�^��O�����Ľ����8�z9=
��d0��:=u��j'aCO&�A��Y`�}a���ѱ��M!Owo]_W
*�z�M)R�}�al��˹Ҿ���Ƕ1�Ӎ��u<�|�RN�:�0�aXڮ@�� ����ڪ��P ]0
�th��p��o�57Y��]�}�����w�iH/�R

�ݦq��
Q5�fGGG"4����漫�yUL�npu�LcDCu�O��
����v�bQ�V��'A���!p^J��S�/wR�/�[��-�K�5�v�-�Q�uz�O���3��?Q�ҫ9�k^�O�
\�-BO��/��'Sxr�e�?�8B�9H��<=�B3�[w��Bč˜:@�'��usj�P�0�(m�7B�������{F�b�k,_��!�0أԲ���.���L�a�\��R0k�b�OB8�
W��f�>�c�{���$o��%�����RzsF�=E�)]���Y�ii�ɯ��a�!شv���@�["�!S���Aq�+eY5�Z�66K�
��ƃf�a5�H�ឡ95p��?���ZM���K��ݧ��*�L�܄^la�#Ǖ���?���i�t*ڼy���iz
ۓ�\;I�UM�5,��sH�y���x���� 
�-w��6�w�sV�F35�wgg�ݛ�X�.���v�+\���pI��y��B�v;<"h2�y�̫b��BKz�6���H�"�	�pש��=�bF�Mi���ݕt�H�=Q��[�C~�&1��ޜ�QC� ���!��pz�|�
>�Y��ΐG�I�5R�
o���#__q�6��D�ʒ�oA�k�K�r�e��w�(�zO`s֯�'䢽�5���\�Q���7K�6�n
]�K:9_��2���b�����\�RH�B$�a���kܙ�r�}��	�<�����o���Q�Ö��~;����}*xY�P��P��T���U��Q��EBw~􇽽�����;��;��(�^����@As�	�ԏ�y����4�A�%���tO�lH�}h�a�4�u��@��?��.��c~�s��ߏ6�A�C|�
��6�L�ˍ�F�𠩃MEk=������UYo���k��wM]�7�'`��`Z����tԬ����tk���x2��A�趌љ�'�'V,���J5�U�y;l�\�8�%
��\\g�l>}o�u�	��J��3t�b���Z�+"[�ř6�f�}4�\BP��s# ���'�w�00o�7x7����
��IY&k���g���y�ߕ�sZ��;9�z�z�T�:V����]�*��r����+����o�晞��o"��.�mݥ��+.T'΅{=��(h0'��-EO�����0�����/l�,���=�鴧v.TO�y�:R�z��}�nZI+��7����]��u���SWh�\};�R��()?ື
ۂ�s��@YѨ�J4�uI��PKk�mW^���b'setuptools/_vendor/pyparsing/results.py�=ђ�6���X�R"m�<�%�L���]n�N*��>hU%B3Q�� 5�M�߯��j�8Wu{�TF4��F���`M^��x���[�y��uVb���,��˪fm�d��&�}V�F��">�6�X�P�*���B��﫬�%��l+��@�k"����#B��4� �+���b(�3�v��#6�L�P�ձ�"��oy!Q�P�A�MY��e�0���X�,�)��Y���Y}��f#x=�`�ı��Z�1����f?Z\PA
��qVdu�盈��u(⃯'�1T�f�[^g5ߵ�3�i��*Z�l�uRs�t���H؍"�2�n�],�_-Z�$�
F��Ǻj��O��5/E�.پ*Y���d0alǓB�f|���.	N}�e딥I��$Ɨ�	�3Q�`��y(��r�*����)���T@<Ҹ̧��2b�^O�fI]W٪���j�Ɏ�\BU�9�fK"A�}�w��'@�ج�T3���d���q���oyT�{Y�A��D��8!���"�bv0:�����M��n�+���7�N��(��}�@гC3R�<�fF�g0���?��`u��Q�x	�@="�9�d`V��A�2��i�����_�����7ӑ�
�:~�7�W�,�C�/=>��o���h��JT���q	�yZq{8r�{��1Qp<T>!�9E�
jFY�S#+@\ĩ:��f��QĀ|�\Daʄ9F��|�DG8��gz�~}3/����c��-��5��r?ܶ�7~��K�p�Fo�X��I.x�"�g���8�Q�d����%Ci��C=,�M��T
z����[#?���sЍ#��@���µ=�H�G�����z�@�XOXowe��֛��⌻��lm������Z��"���r����?f�z�C�	�[����� 7���K
�J���LܕM���F�W���q-��.��O��,�9HqV��').j+��f]^��tk-J�,
��w?���_"�3}��}��O>6{D��MQƇ�%*C�?��C��]�
*_O���A��
7
	P�/�y���)�&�c������z�O�ш#Wd`d�Y�
mJv�&Yi���}頻D�vt,>���;&�.�P��KE*��(b���(����;�|s#)���[yR5E�zR�q�^]��ͯ�7��E�=��b�0���_İ�0��$�M��Vi€�@��SdC���\o�f���&��F����u(�j��|����-���x��.yL�7T
(*U:�6����f�dw�`�D`�\����B�a�C{�A�$+xz�*�a�lӕ�L0��g�
(��(�
��؃m�9�R?U���s�}U�U�5�r�rYH�H2���')=�[V����Ĵ\ı�Ѱ-�s�3�J�In
2[;+��j鹑�����|�}p6@@I���edi0��
U��I�LI;��Ҭ2�1CE��)�����]v�,���A!�g&	@W!f�E����䇳��Ӑ�<5W��٢��Π=i�>p���A�Z�U���3�P_�h��>����n�9x�~�1<��Mf��=�R���h5��W+��m9���L((m��B�C�`�YR�l���Ե�V9�;#,�O@"�k]1���nn���uHS��4��8uvG���?܀���@c��V>���HC�BvG��E��<yB��n�WH���ay��؁vhIU�J�~N�у�K?���j.E�H	�C��ˇ~�6��V�ˆ�-��e�����v��c��2�S�GTW�3��!�'ڧ5��,�?Ҋu��~@}?��ʂ�����p���y��lJ��7��,"���<[�$��j.E��0��V��ܬX�
��_N��	�X\:?�O�ۇ��"t����;(�AB���
��,���-�J;�h�Ϝl*�f�&q\Ke{rB�$�α�Eoކt���V��L��T�Pnؒi�!�#p�{����&醡�ޢ�=>�/^�_A��3tPw'l�l�` ��]
,��Սĺ��{%�0���A��qWh�l�x/tٍ�v&�-^fU7�~C�-�M*�<p;�d����eH4G&��"��V}�Ҝ*�릪0B'zb��/����tyZ~*b-A��ȑ�!2!6�E��MN�2F-)g�i	w0a�,h���5>�6�*�jJ��̊N��xU��5����7	&$��C��=3`�&/�b�6�i!fN�L�:���O ��;�������-?��P����4�Z�k�Bb�vƨ��"�g.
N���Dt�ϛ����r)a,�]�K�	ц��x}W�o��M�#��>�
dq�B\�)���,��p��,�G���mqDL����d�LL����A��˽���cL�?����c%�+��|�m2��1$��
(���rN:�5{L.�^}�2�@p�KD~��:[K*,��,y�~شp�~�cQb��!�0�Ջ6ޫ_��Q�����m��FZ��(@OR��=��b�ѱY��(ZP	`S\���`W�<��udX3tђC?��z1@9�}	�Oq+�G��a��d�`��L���&J�-�S���F�;�n���N�t��'�N�7;�����s�Y�d�V�u�Wlz��������{!#{W2����y��s��Z4�MVI�̚g�SӉ�q�@�L/:a�h�ȓ�5͒|���*���T/����)noy*�����޻w�u� j蚅V��G�X�'4%a��4��8��|�+��N7�t#�&�A�ʠ�B�l��Y��I6���U{$���ϧu?^��|�z\oָd�ČQ��imjz��õ�& �AG,��{e{ҶW�~k�n��
)�3�ύ��'�F���")�goqXk
�	V,�����i��?T]�d��#26@-Ҹ
…
DZNq�SZ�dm~8�K����k��S����`�be�8iWӌHqTL�p̚�%�{oep�c�+I�q�-
iEX�Ⱦ�C퀫�mv��A�e䯯����f}�6Y5��q����	�2*5�N�n.nN]\�}c,v�]�'j=� "�ZO&�U�<.o�`�V/5�
�}F���P*2�_��T�u���+�j�y.5A;��`�V��Qd�;~y3܀s�tʽh3�p?h^i ��E����6���uBK���]4?8����^��ټ}�A"�多��`���i���=31�(����E���-�4�n���^=d�q���H�Y���9^�/�X�~�/�?�~�W�߉H4��@�N�=/R-�0��}��7�9o���"k.팳e+�����u��7d�sXlw��FD�O�t���A��"�I�$q����l@UL�#��j�)�]o_�OsI��oߞ#�j�K��O��g������&���6��f��=��$r�4�ʷ���,:`I^y8a�l%�d�x��&X#�ʟ�EQ����G)�h���pp�7O�ˬ�]���s�<s�mz�D�o�7,�
��"Y����m���t+�A�@�d��1)��8��ĺ��i:��m����9���D��X�a&M��ҝh:2�-�!��@��Db��'m`�RW:{A~�8��yG��Q��kO`*����`ǣ��w��ܹ�j:�QFΚH�"�T��Ynp,]����:��7q��F����:P�vNl���?��N��2#6��֘s�qE�}��J/��Sv㠤-�~}2�T�~�	��dr�h����]���>ux�@�[�|+�^�m�~{�L,_'̀FtF�V<���va�W��7�D�_ۚ�;�_��?�l�5M��#��F/�Ħ��9H{0no�m�CG��rߠ���S�U��uV)WD����
)%G�C�����J��j_r����{+��T/�6z|
�3�ǧ�u�Q
1�3�YV?˼M;�~�_����L�W�	r��qe_t���*��~���R� ]���xf튼�U���.�n8&a�,:?!YX���\H��I&�0�"�[��)�5��l���d��^z�ch<���W����9�]�7��{��P�ؿ��&-S��y;_�6C��k�E��)��-I�aDF�u�H��_fj��Zg�DŽy��g������׽`��]���)�����1	��Ĩ$W(��V���W�9�#W�M��	��_e��#-,���V4�X�x�|��y`�=MD;ӊ'5�6�CM=)���Vʅ��8=�X�ǚ��A�s,'��c=Źs�1G֠l@Eٳ�J�r�5I���NnE�6ԆDE:��s)����MN�gx���	��\���a��*�	&�����<�GX߆�z��W������g�-��O���E'�q
�P�5P��-���i�۳�
g5b�,���J����3�B��`7Rmɋ�Ǝ�َ�c�Ȅ��K�|��D��.�����,<c���μ~O�?`�Ygu�Ps�����*K��}:��y��yT�<c�7S�q���R����ѓ%��~��1]l���~0ִwW��.�z�]�wؒ1/t֔RJs��!�/P�3r�����-�O�}u�Ck�CO��L��ԭ����]B�lO�W����ِ�i�2���P�<��x4zwc�e�V��X;(gSe�ԧz���[^˻)܌��5��勤�L��D�A�&���v�Nz
t�G��l��4�샲�;3��%�l�`8L��~�uH�"�n���P�SP��������1�@����V�����`�bl%�E	�`�o�Q�x3�F�Yؠ8��h�ΓӢ�_��G-��
��~r�G�Ǭؔ�c����.�mǴ��f�����
<����;?s�#�5�Ե��h�ְ�l,�x�蹄)���k�ु��S��w^������_,a�c��;ם$���
@��dE
t�5D�V��4hN����n/��;�m|����f>H�f�kr߿�Oy_ө�^���KEZ_2���U�JJ���I�}�2=�f;؜[�Q2���h����W
0�|JIG׾4NQ��]
AT�ҧ�S

�]-(��ˎ(����|{ڵX�M��`��̬����_Ȕ�?e�mQ
�:��$�����Af̂��=o٥���n�%q�d�r��xc���]�%6҂��<ZC�gT@�R����}��=!�q�(��7Jmw�d]�sF~�Y���㻱G����#Kz7�����}x�G�(�*mD�������2�
��*a4��	@������=�TdBP~v@��m���'�a�Ys F�Ё�8+�Q��{��6����.��l\�Y1b��x�?ģ;~x�S�g���v��g[
LO��� Y��zԳTzj�g5!�Ϋn)P��y͕��x��f������O;.���d!��%�s4��H.'I{�%g����,R�����w:}>K�˰��P��O���j�	��T�˷Z�%�6���*��w:-z����|��9�4��l�|�a�_��W)2,~�J��8��W'�#��?�Ȥ+_0���g�ª0g�Ai�}α��`}���`��r��v��f#*øm��]�o��z/f�_���Jƫ�&eu����<[UIu|-kN��]��2�[h��w~�ִO�LY�:5��A�!��i:@�Eg�za5Fϰ�S��3����"x3�C�4�J����`S�ٯH�}���5l±*]ç�a��G�w
������{��@X�/hS$,�VQ�)Vl���UM��F>���C��|{uƆ:;B3�^��j���	 ����P��j�3�2L��
g?ї5}��۪���l���Ͳ.�e�
�7V���Ⰺ�����"�1ջ��Z�8��1�{�e�[eB�e,����wϖqm�9���0@�4����BHWe<�{���:`��$�T��L'�
~>��i�mgsI���N�l����]@iV
�2#s�mʆ}"���G#];-l<*�Ot����joU;;��<o�U�#yqj{I\/�Z��nOjG��Zw�Bd.�i��牼�;����n&��|i�nA�9���#�p�s�+�h���A�?�X��[$0:�	
z/�"w ֵJT.l�S3n���gL��s�&�'�em��\�b�<�㨶A�{
~_8�0����9'Dǥ ��B�l/4'�ܪzn��[5�l��<�'󔫋z�'wT�]z	�����Ņ��PL*~��ST��g�p�M��j�
PKk�mW��5�[
Z4'setuptools/_vendor/pyparsing/testing.py�Z}oܶ�ߟ��`�Ԝ�vҭ�
�5Hݵh�i�b��'��X�m����ϸO��!)�)ݹ�?��$����'�f��vQ�ON6U����kvW�|MxVU�>�hN��:�O�}	��E\T�����F+��˔e,��˻��5/r��[��-�D�DQ��6�ڻ��JZ�}xrr�TR�K �#})g�f3�7�%�Qs7E�~1A�6MJxNn+�*�&��_tD���b��Q�M[A14��J
m#Rd͐eBnw�ǒ�;
�o��Nh�
ߒ4m��y��ꦂz�1�.�<F�+rϜ�mh�� �[�hE�Ub�x��ŘeLJ�HES"�
e�M]����b/�gLow��A�
����Y�����-�wc�Kk.^O�M�I�pBY6ց�M\J��2Z
hE�3Z�鞈�,�#�q�[H^�<�9{���Cт����Y�2�"?�1��;*B�͛Vl��)a�_�op������b�x�O�S�'Q^i�;FN����>�r^��q� ^�p�W��¡+X�Y(��/��Վ�7���)�����ų爞p6'W���tNN���ǧ�B�����;���A�~Qp��Zm��=,�F��-���
pr�(
P������X1����M��[|5�>��6{$m}y���w��F?|�������/�|4a��u�~{���{�{����3m�Hyx$=zfMs5����W2T	vu]� �Օ�V�Äu��XN�)K<T#=�RͰ(���d7cVi�V���;P���f�DWXk�WY�X*�Q2��#��9;ڦ2d�-
��G[����:5��#g�aT��H
�H��ÒlYM�
�jD>e5��0r�c��G$����1���͈4��HSג�H���Ҩ��9S�T�n�\�d�8�5�q�0�Dec�P٦�Z��fC�	��C���VG�Vk��:��cQ�RQ���_$���6���F�*�B�Mx2��P�%�
��B�7�v�V����*��ᦽy,2�+
;/^� ��TD1f�~�p��a }}j�����q����!���-��؀�|�{+��?e`��}|"���`Q��G�Ƹ(����	��:j�p�f�h��g#��(�ֱ`eV�YC���WCg�]W��Ǵ�
_9���l���C��o���!^ʞ@���$�w\w�X��$Q��\��l3V�DNˋ*���]26td��
�6�����ѣh	/�ـ_�~s-�
K�r�
K �Y��Y&�+�@X�T�wm�oh)Q@6�d)�Y^��^�b�#�V�/�I!OI��ז���s�͓�t�Gk@�N:K��d�*�z}���	"�%�B��h���S)/�!�ֶ;3�}*ÿp�)
�K��Z�)�[LǠd��$a:�[���T=v ��<�z[5G#���9g9T�-K��F��S�����</���"��x��G�0X�][�SI���k�<C�J����4|��h���X[,���F �K39h�6t����u�w8i�2�I�ֲ��GË?�x@pξD`>g
ܿq�I���0�(���
�L�'�`���1�j�ެ���H]@���3eG�P~ݤȰ���M�X*6-8���R��ǂ|��������,Q7e
)���k`8����J�F�����\�L�?q��lHfRg�"DqS���8�2#m�V˄4B�l�����x>=�V�o����`&H4q̠�ҝ��q�8ҵ/�4sv}��	�E��ɕ���SV
Z�"'|����A�@>��= A[��K��
�
��� �u��-zlw�V��'� 0"�d	��j+���_�qU~���ͯ5
�_�a0Tb�A]���2��0� S���%^O��bW4i�/���<̧<�/����|,��ID���~�r@����
�i	Ŭ�[����J²��kyn9����,�u��Ќu�6��lf�������2S���ܰ���sQSH�8k�B�Pw:����GD�͝�5:�	N�{�����{�P�B4k��ދGi�~D�%��#lg:ro�I'n/荴��r�AZv�k�>Rɳ��c\B��a�֍{#O�ƫB��W���-j���&^��$:�2x�#�nm��!�:K�O�Un��r��<���:��{�׃�=^3�h����	���La;�i����ϓ+T�?�#�H$�T=�<ܪ�6$tމ'��@p�h	`�4<�E�����Ǫ�n��2ݺ-Ee�5�v�6p�����^ҝ"T��å:6��6��.���P��C�s�1�Q�4(h��8�<�|8��	�-��Arw~�Y��~��x��%OZa�v�/@�����|W$���{$���s��+��w������[�,O5���x�M��t��k�(�Ghu#���ϳ~"��J�a��P������%!9��φ�fi�b)�J�Hغ�nU��Δ7	x��2���V��i��D�E�2��3d3wq�wJ>uS"��v�2V�rIq�s�	1�`5��5��%1EA��B��	�K��E8$�C�!CG�MxZ��v�eӗ����B�Bx�Ukܿ'ּB�i͎$9���F��v� �o����b��&�%J�^?�����~�7Yh6��P���2�{�"����(x�w��P�_1A,���V�>�t�S-|a�X�4�r��[�'�|�/G�32kr	��oH$�4�)�~{�NM#b���6��Wf��Ͽg��׿��Y<<�C|�Ƈ���wR�l#%Q�:�L\-,�޵!���exryƍ/���H��F�SȳGnP��Č
f,T�I�lv�Ʒ�5��ƫE���ƻ���ժ�l�3	����
��G��xI�q�~��4߲�|N�?��X��=���_x>x�L�/�}����]�s�2�
��l���G�f�Lj�*�3�^�gaH��+���!��NJ�)��aܽԱˬ�K�432�ﰞ�
���~���{�5���W˴C ��زC�.�.������HgC��ntET�s
/�x��s2̌k��ѻ�bn<ȷˍ�b��K�� "�Z����\�eǦ?�s-�S��+���,Ѭ��|92�罩�SS�~}`���Yy��¥6~]uf6��T�5�A�uq��e�X�+1
��cX�����L>_�/l
T�>jnlH�M^`������%������S�7����\����s�W��%�'���9Pq׻O@�����傧��[���8z���k�	Sͺ_��L�

�s���X&�cZ$��L���.�=����/�%�Fx
)jo���b �f�o�`����ai���-wSw�.Q��p�9�r�U�ۤH��2"�����PKk�mWz��x#*'setuptools/_vendor/pyparsing/unicode.py�Z�����j�[x-������#��Z��x<��ݙY�MU	

Mi4-M[�$�@KRh�C�~_�/�|[�UU�?���5ǻ6^ig�{�=��9�ܱw�%ϱ�-;�[I$�N��$X	m��!Nh�a��DRڎCm�
l1#\�9�BD��a�^�v�񜮗H$,��p�WW�m��@�ʮ�O�n�F���H��N���4�aC��Gv���`���Z��D�3<�c����к�`�n�X�Xn0���f�	�+]���#�f��I�L
�xݐ,���~���~�fR���[I����l-P��K�'�!	i27��n��T�xB^��w�9e�|v*fA���?����W0*�?pސ��i��hY!o�Bs�@8��$��|�4p=dz6��a�9��9�9`K�B��"����cQB�ءPtff�_5P)$�6��k��M��0?��쒹`�=�rڎE�Ї��8z�t{��G�p�-u��M�C=�ͦk�XF�?������i����\P�g��@��v\Մ�?wp	����Rhú
!%��(��H�&�(Xo)�� u6d.8p�"��8k����]�~�X��H���lVͦ	���T:N5%��F�J6���J�M�&��g�_}ga1�u<�#N�p�Ԛ�.��N1dž�m�`��!���$F#������˜����t���a2o����,.�!�e��HĢ�w_���p�^�g��}]����0�!�r�.�dœt�W��vP�P��UJJ��<�?!)`�����2�%��sk,��?M��x�t�>�<�b�N(�.�J�倆{9��V�OL��\r.��<�I�T���Y� <%�a�_�-(�a��RSxn��c.�1]��7{rv̠gZÕC$*8�+;3���L�X��C[k�J�	����x��-��ӕS�v��9��*rA/�"+��3�:�Ui9N��:r/��I�FD���z2]Dt�쁉�Z�e{!7Se��pk��H�0]�%��2�lo=����-x����/M��HJ�L��)K�� ���@�ɡ„�$3�^�Ս��|u�^������#�ַ��]�i���c�ݎ��}�¥'�W^}p����f&����iz��F�����9�#�=OLߤ?�?�?�?�o�_�_�_��"�5}�����^�������?�?�+�Ot�^����5�>�N?�7�M�g�z�~H?�����7�F��{�>��~B?��MT����d�4��Û��

���Zω-&z`}yh�s���l]w[1� 5H�I�*j._(�ʕ�A����Y�=�1�,�K����'S��8�7	�lq{+=X:��ܒ�C[sj��e͵ܶ87���;�ձ��N�뷾�{|��Mv�v'�}P;z]�P��Ӈnm�F��I8�f:��G��rv�f�XX��:lY� ,���[qd��c`�Ȱ�e�1��#�g�
���#J�7C�S�U�ϞU�ǀj߭�F�����:ְk���ڳY�m����TJ��?�����Yz���z����i��')<����ʵ��`"W6�J%��I��Q�yA-k(�:~�u��)U�	j�RYQG��EF�+��R+�u�Z1vL�RV�e�*���F˒Zè������7��$o	�V0S�����aC,QB(K�<FՅӌ*J�Jj-�QkUG�5A�c�7UP
t]CJ6���**�4��T\��kz���.��{�2`��*6U⩦�(i��6��JS]��u�i�M4��b^��*T-�QG�P���X�ju.K�a�@+�XhŒ�QKyA� �F]�5
��|4����mv�Z�T�
�zETɸ�R�9��Qe�5Ad�.�4����)SFEP
��䈡�$��X�!$?p�VU�
��%=��5���B�
�UP���#�U��Cj�%��m0,v�ZǶG�e��z�C}tC�?����؍�Oo��5��Ա��9i�����3�;�}fh�'y�����/`��	J��s��SnKMb����S@��I��]�_�L���,�E<_���l^�WƑޟQ���8�3�X(I�Q�텒��٬2���n�3<�c��{`�M��(	�/��G+�I�$�b�^4C1d]�8C��j�#�3�e*��nl{�|�g�>�Ӕb^ƨ8�Ds F��Q����&�Q�
{+�N[��l����l�^��S��;��h)�Q���5���9��Te�Z�����(v��*�I���ZU,X+i�&[+�ZE�@��@�1M�H�C
��
jk��&�X�f�$o
�I�ڰ�LT���6��OL�lbK�[��{�X3	l��!M/��6���l�v��u���z;��s���Ը{���o6�?����mCQ�M�
�Mo&�Xgeg�-M~)��n��ɩ����&*"L,����<�ձ �"��m�
?�zI{-K*RP`�B�.�a�"�.��$U'_�ԉ��'`�^0��g���q���l{����QV+��m��γež�DU%3����c���/��䝛M���9�>�ϑ�T�m�q�"�������70��uG�$#�����/�>�����׾8��}tyQz���|z��#�<����õ�O=\{x��>��-\�|�HX��~������{�7P~��a~t��������u�U�!��饫O/���wP�(؛a���W�u�Ҧ���	yr�'g>c�_;��(�M����ə7��~��i�1�#�w������ۨ��#lw�n�]�X����McZ}w�깍�;��6V?�X���zk��)TƠ~%�PKk�mW-G�l��$setuptools/_vendor/pyparsing/util.py�Xmo�6��_�s�H�#lz_z�&�˵@qm���ޗl����f+�*I%����]r��.�:�e�3��g�C~$j��:���q�N�R�{۾�c�K��R�t�5)�i��`gt!vu��h�sS'�L�����uk�D�����6� H�6�� .Dz0�>�� H�Ŋ$Iu�S�d�˽�?����uK�/��Fd�S4����S[�+w�̰k[���(�0P"�<)evÖ]Yg�ш�k߽S��=%@�J2�)�������f��پ�Ag܀V�Ă�ܮEF�kq+�"?9������	�xdH'E�v�b����S��ã�e雜�ʲ�NlA�[0Fe��=XH7G����'�zQ���r�e�j�'>{�DQ\W�0�kE��7�6�ig��>R�3څ�� �0V2RY�'����&\�Z�:=���a;�N��N��J��O�0��6���!�7���{ejB�P�� |#qFdD�y�a!�z�|�WLa��
z�k���H�]RS��|�޷"����3H]��N�.�$E$����QH�p����V�\�JbiccF|u�S�vX��.�`�y��v89��h��s'���Vaz@%��WNn-�4TYծ1����K�f8i�@j�*�S�6�'�ް�77?���s(p�1��O�y�٩@H�W�'���-�ݦK'}�����_^��\>��b�g��<�5H݋�y�V��л�~�:�wM��k��Qx
8QxoW�*��5���#X$!q$�cQ�S���P�
eh#?�+j:�V1��)We·��`R�Bj_�kj�#����~a�\�7� ���e���j�>����=����}��h����Г�&>��`�I��s99�Yl;M��Е�� _;��KR��b�X���R��IW-*:FlZ�k�����Cx�pݗu��-N)��+�릯��K��B��D�~���qܔ`�@����w�K�1:���ʓW��k۰ك[$L��W8F����6D��s���l�@�k�nW�M5%���	�%��
F�	9�]¸û�k��{��W����5D�eq�Ѣ<[����J��ߨ�~j�Q'2�����2�3L�?����?j.9c�߈��B��P�..�Yc��'����V����@$��ߘd߽|�=z��������-��BV��/��e�k�M*+�����m^�>t;;gd��m�Z�=RfWFȔv]��m�ƭ3�!�$<��l��2��%kR��mN���DȬ��§lBI�L�?'C�v�j}������=��dxg�8t�9.�������u�B����'���70.�`�8��e4��q��g`���>�ѐe>�)�F�]��~4�ٻ8��)�����Ua|<q��3�p�m�c�s��)��sJ��w|�����)jт.59��:(3�r6z� �|�Z�g�({?��1��
{�O�,����WC�PE~$�8%
��Xp#~>kn��lO�`Vo�q5��%6P�2�t���Ǣ)���4�X�v�ۭ�%"��ڹQ�������<C�o��t��;��.�oخ�l�V���ێ`�FY�!���D�0֌�i��4�=C�qe�v-�2[�e����>��y�Kq>���r�T ��>.��5�\��[��_,�5���]�6��hI���켧rG�7G.n�]�y�".�s:
^_5���G,u�\�F���
�g� ��Z�������*�E+Lu�`LS�nn�p���R���
+�?�l�޽�u�=��c�b��I��o.���҃!�I��n��V��v���U!��|��k�'X���H=�
d<0N�1��8O���s$m��k���u���B@�KA�R��x
L/�O�̦���)Sf}�Y=<����l��P�Y��%��E�y�o;�����S���h�qא_���˥s��<߈\��0eҏ�<W.
����9�uk��eV��HX�w7����)�WH�6
|�PKk�mW�-2U	t\0setuptools/_vendor/pyparsing/diagram/__init__.py�<ks�Hr�+&T]ܣ�v��E1]�۵�N��k�$�(*�"V ��E����c��P���
�n-3==�=�V��j;��Uݪ�<���z��[]5��A�[�E�V�oa�d'>�*�M��J���u-��ϲ�mU���Z�{�򗟪��1����(�㷝l��W��j~�Ѯ|)W�:�$���}��k�����kYt'''<ޙ�s�6m!�L�F��>y�?]�x��^�e��_����ȼ|I}����Q��g�O_�)~^�nWK$���:�����z�ҽ���R�)�F~���g����"_U��L�T��:/�?G�U��er��2���F���R|��6%lF���w��F���'0�&��jEY�mTn��.��EQ�Z�Fn���ڬ���X>�1T��U
�iWu5�x=f��(�.�j�U��A�	L:B��x����bLk��tD�!���8I
H�ɉ4�0+�YZ�''���䙨J	�a'�e��Vm�R�H��2�r�D�l:��OZ)�f�2���a�-U#~��ӟ�V�^y��bP;ٝ����r�U>ţ��U6j��h"t׎'"�����bB^_Y�N
8��k�S5��3��_�yF��
G�
�7E��� 5a���r�T.pq���%�m�[1�/���X���HyBt��b�(d��Q,�g�Y�K�g�;�v3D�D�@}�y�y�SA��q��UC��x*.y��`��8�ǥ�@Ө�B�9�+�t�~GDi0����e
�ʪ`rt˼ bH�X��X��m���s�
���ݻk�1�v�|�iY/&�;ܮ6$�OA�Ή
3G�)o �e����s7��V���v�R@8"�Y����,�l<uX�N�(3�~�6�y~ހz�sUf�G#|��
�a��V-��G0A�y��	�Ҩ3�	�S@����FW_�^��p��o�s�T|oϯʪC;�!M�י1�W�׽� suu��d�i�N�ZO�<��
��+	 e9o�@[PDm�q7���Vjߜ�k�k�6�e`�lh=8|�TL�S�R4R���`	ӊ|�%ɿ;��ja=P�ۼ�H!��q�:��
j��؛��jb��+X�k��*�N��n�^F"�Μ{r5�N'��z"�V�%��w[��������?��/�C�W�c���J��/���q�YQ�~�`�� �ۗbԓ�����J~�.�Nm���)<	FuiR���Dz�23d�@�m/@��h�iC��-�k#?��6��"��9��SO��mNhMP)�0��b6�aFϒ�k%��fp�p�3��z��Έ|��3CNàu��\w;�4[$D�H��>_�m��c��u��̫��ޠo�T4G4UiW�S$���Ӎ�9a�j��<����1nЩ�D���G�^/65���'�Bm����j��yK`_�7��Zdrz;e)#���u
#H/���WO�O&�Z�A.�[��znn�K�������|����@��yS�gq�3�Q���N�j����
y��f�s	��o߼Ss�$3�n�Q�uzh׽c
�,�?W��)*4o���-7����x����q��}�A�V� �P��~F\�N�vߠD�r-IK(�E��F��&]]ӷ=��Y�"띻q��FƬA'�j6�OT���)�A�n[0{�o�J��~(G&37n
1�tQ�<�q� /#��Juc�
�|��h"�2���3�0M��x�#X BP(�x�e6�j��{C�i�ӰD�����Ԫ��s�@2��Y�D���r�WYlZ
rV�CmP(0�l(@�<O 
[-y>�q��R,@�
�RwyN�sPz8���vu϶����$��M�4�f;�_�z�x��Vિ��1��(���À{��4��`+:��DKLɁ12Ki9hF��duTf�P0s�FS��+~�a��ùU���r�!)f��A��Ro~��z��s6lz���݀#^���`Q��$�C]�
U��$�]ٍ�%�kV{̦�"��� r��D߳ݭ�f���F�R����yL^R3�_�;Lk���O�L�:c���"
�fϛ�\���F�k�@���V&�4�\�*��U톄�t�^Ƴ2S��?"-�	W��6�eU,E�Y�V�c^���iP�C9b�9�8Ƞ}�|`�f.U[�qx�1�X��vb�l�f��B3�3>L�R5E�)��[ʈ���,��iF�IJ�]��d0gAk(4�BZlZ��PN�F}�$���2b�]��@�
�g�&фZ�;�gv�l?b@�Ų0��
�-_��"D�ž5"�9�"C���?�P7ð�W�J��?��!kg�G��L�Y�7�(2�Jt"���=N�Ǒ�rA0� �p�˝�g��5rk0�l����B�{<���&�r�'�F��n�b.����ˉ<A�P��e��c��ϝ@N2. &�K	s8�hu���{"z�B9v�<c��)/g��RX�xL�%�,��RsN4c,^��&��e�k�ljӉr���01x�K�5r�4�C�.�%@���"g�R��cj]�^p*J�<7$��r��8\�pV4�:zs9ԁ<����^��G����D0(Rx|((4���4��ħӼ,3<�(d�2t���3�n̿��p)´�N脜r���aOq��a��V�X&���N�w
�/؂n"$�>�"��K�7��ѵ��B#�Y`t�fu��)s}F���z�s��s��XMr�L)_Ր�3�lH��VĮ��Z��ݠy��$Xl8�HA8����s�\�O�3��` y[��J<�s�/+�͜v���p�g�>���9�r��[-�a�"4d]�B��3@��H��P���D�$/�4���]�I�(���q�9��ܝ�c���|`{T,H�!�Tב����IP�~:��� 9=�W�<f�%D[�<�Ӟ�HKʀq�j���J�w����)��x�7]x�����lBí��c��{9 �|����xZ)c����d���!Ғ�D{;XƘ�@���G��M;�c�b��6�M�2�+W���x��LaS� {Fy9E�з>R�]Qt��!��C���
W{� e9	TeDnt9�n��	5�����,��2�N˪.;�9�T.**l��}��9��h-��R�`��`]p��!�>�8M�j�������\��x�q<���f�#ygݶ*�0$p��Ѩ�V��r�x�g��y{�>ea5޺y���3�c�;w�T�9L�D�ְ�D�y��DC<'�]x�����Ҽ�۲�\�$���13
������%�򸁣�|��پ�%z~~�q�Dc��
%C��(z�^
����C�vN��7pH�3��`��B�7���3�]�b�ֿp�ޖ9Y9��4:4`|�$��+�7Vݗ
]؝�X=]��k��m/�U�����>4;@a�&��&�:��BO��+&&���Bp [Ur�ep�"�DGx�발��YH��8&"I���9m�O����w���>��0T��=/d:��ݡ�鶨iZ�`cb��H�(Q{��"�cR���tN)\�k꫋�ʱi��֦	�p���iq���`��)��}F|�|}.��O��[�-������!^�| �+-Dy�!f=��}�;���i�ϼ���=�燁��}�&^&�,�q	nE��Զ�)�yZ�'��e\"7�AR ��<�7�(�T�&�Ʊ&m:���
	$`e�	9�{��9�����G�.F��n�,F��0��OXO}h�p�R��e<X�8���K?��
o\Ayx���e��Ӯ��f
6�q}�}N��I����VZ�C���?:PX�|��D4,�z��[�9 0� ���a����=.�i�Ђ��n0#�S����m�5��,����%e�4E/�9����y��Đ� ��H��V
�����!�6���A5�%��V�"�ľ���:tg~5�u-V��:R��Qe��8���[qS��.� �6T��``��ȵ����t�@�{��Ӛ��uˆJ��ɮ��2�+tMu�.�D^(���Bzt}�{���"0�m�o?t�dO��5��j�N��ם�k��KH�ͥ7L�[�I���&
��$�$
2g}��!('�F�f�H�����DoP�b�ߛ%gG.��~��n�7�@`/O��G��	ړ��s������P����s����h��
�p�&�ܬ���%ov�ZH@�p�O�V�).�/���Ơ�3hi��]����Eغ��K:N9H��\ds��.������[@.����9�OΈl������M�c�Ĕvޡ�\�=���Ӹu=ӛb��}�k��\ѩ0���-��(����Ilg��J�j5v��u@�K�'���[?(��	�~��;l�Z�Y/ld���'����3��%�4ɴ�q}+nd�w�N-�C{>�:���U͠�)?��C%��P?M��U�{Hj�S��]ؘ��.x����D�i�
k�g)ZE�"�@�١j����w�e)Fߍ��� 7����4�F�dXUl:�LW���_
��F,>�D<���Y|��0H�vC
��a߬sh�w�V�&�G�J��mTc�8��6��`�b5<I
3���Ԁ��_��
�ֶ�$�ߕׇ�/��b%�I�LYJL�P0�A�B�#�m�t���/���~_��qj�q*���_u��*��i3<��J���8�x�?�>ĵk6��LX�6uK)�riNEY��
����k�j�KeJ�P�3�V����ĶA%�̶\*���f�)����Xߵ���/��\��b:��5����)GAF�6Զt�ȨaO.r�q�+,Yt�y�-A��ve#ߟHQ�m�nU�إ)�QgJ�LK	D��ΕV��|��L�W%���P�E�`n�P�1�2�N���z4������v�mBD���<�ͫ���1k}]�^RBݒ�j���d��dN�m*Щ�c�ݱ�f���.p�m��h���&i�~���K�ү��P�t>�
�|Ѵ��4ᆑ'�
�.nj-��b ̦����R��lf�Ak�_�����=�Y1��,�7�6��7;j����Ucs�h19�qa/E����
XKMfK_��2uGt:ƽ�}֡r����^L�Z�Q��A~�;E�� �����j�'|2z�t��
ʛ\�v�-��f���8Sa��%0
x��
�b�o��]?X
���j����H���Bh�ؓ�X��=�;��"�;r�V��TLc?{z���-��3-��~��(���v��}���ǵ��҃)bN��	�1f&�Qs6�����U+�#�0�yߛCGg��Y�9ڡ��O�i	O��pAi)LJ�5f\A�)l���6v9,*�غC6���r�15��?�`���r�?�S��A���6zӔmk�Q�Fm��۴)��(�b��ܸ�a���^��Tv�Y�ț�����K���9�
F,�P���>��$��ӽE���
��qw��W�V.��Q����c��?s��r@'#�K�!��9q���ň�o�Q�i�+�����-��iЯJ�II����}la��|����O|�hJ�2TBx[~gm��ȍט�.��J�8�pպ�Q�R��I8����>}B��{@�e������/x�*��+d�}!�Y!�7&&��|��Z�����2��a0;��=���q/
0����W+�/��&s��N�3����?�D�PZI?��}�ó����~qǘ�Ѕ�����aJp�1��ۿu�d0�Bxц"����h
DZm{����ǿ�2�`�q���
G�S��IvQ�+@߀�{՝7�����_�q?���r���ы�V�)˿�~�]\��W�?} ����__�y��[���I�x����#�;υI��~Ď��ԏ�M�o�;?�e(�(om6v����X�/��#�f�$HO$g��iف�;z���������%
��7�Q�9^����nLNѡ|�)ݘt�h#�:��X�M��		��7C��A��̞��cՃ�>�5�m�:��>,�M�;vMW��:ަ����2�Hٻ��z�L>�.��#�"h����y�W��0��}���&n�Q��=ޓ
���YN�ې�׺8kuAE5%�ю�	�L��r��|K`�:�?<H瘴��0�����D����\���|�.�b��l�ܻ]w���l���X���.eՄ��}^��X��0�gX�ݓ?��;��3bq�g�`F�`&.ji��\d�w.�����E�&C��{[�>�}K1����q"�;sɻaN�ɟ�e�)�^27��\�n#Jթ�ج�a�f��7�8�uh�-Y%�Bԉ���ݝݙ�VS����d+W�~��^��)�`^� S�~��ˏ�W
ӝ
r��۬��h�qʒ[�Ah��P��Y�k������$cU���Mް5^;��_@��I�\�����������M�A��C)�X���M�%��t�c4�*��w}��惗���:��>��߉����`�/PKk�mW��%��$setuptools/_vendor/tomli/__init__.py]Pˊ�@��+�x�
����`"�a=
c��`2:�]��w���ttUuW��ߥߓB�d:���Ϛx�u.��s��5-l��ru��n�x� ��Zc��nڐ��Qg��/ћ�
k�S�,#�0Q�EA ��k)񅏰����1`�b�.R*mE������;m�C��4������@��b��Q��dsH����N}��/="/rq�>gpf� ����߫�ֲ��1�Þ�|��#�^u��Ժ��Wu(���o�S�ER6��kz��Ҩ���PKk�mW��i�iX#setuptools/_vendor/tomli/_parser.py�<�r�H��j��d�bK��3�XM[��#����]��`QD�8,�5����:P�����e�-�ʫ���������Q��se�"�ɀ��'�W� ��1	n�ل?dv|x|�&^�À�������4gY�>]}`y4�	��ieI0˳8a�ۄ� �Z�$^1�]�Y�p�e�j'�(μ,��T���0�>=�{3_5g<�f!o��)`�nE��q�S���[��ͧ$~x����6���~	"/y�o��|
�E뾛pն�b���d|>�gO�g֓��翌.�ϕ��K7�ݹ��,X���0����y��f<鵺���p������C{|�Apë���=�\���ġ�:�2�]���X�ċny��q��Ujvt��n��z��l	#/�M9��=��|���-�7�cx�wi��>�,�#�P�<I`��G��yj�i�% �{)r!�Ff��#9�������3����Խ�\���/��5����&s���g����h/7��0�Ɠ�%�5�6�U�wS�F�
���G���[���g�?��1w	C�r��݋�?!4S�e�2����5Ң��i}/���
y1e���σ� ��΁p�b<#T	���iC�_G���}<iƾ�R!������Ƚ}:��Phعl�~������̜�����{%�x��l��V?�V�73�G��P��8.8����ѩh�q�ʭ��h�{Ix��%,f�۶o@d���h���"��&�N
�p�R�g�.���S҉�܏�|�$q�//����;�3��'`A���,�<�s4�,Hq���9��C�?�Fj�����Ǟ���m��g8����恟]���^O51Ԛ�0���d�������=�l?����p �Kϲ�q���B�YN�����$2�Ȅ0�$��%�_}�A�*O36b�<BqE��`�1޿��|���"��Y�
�=�Nf��G��
/�H��k�I-9�߻��S�:`$�o�<*P��
��χG�� �*�>6z�.��k�3/��{�'�b�&�	��Z �W���c���~�����)�Kc쓂?��#��H�C��4�)�:���XzLX9l��q��{�#��l�g��f|�X�t{�C�ݦ����H	�/��jb��;�ނ���=$�'!7P`�!M!�1d��+�]q/J�9Z��<���炒�%*�$�y����Q�]�k�-P��4㶡I���/��H��O{�_H���� �C3z��͈@3���l&5�9`<�c#��
����+?^��ʏ��O_�X�HI�-�����0#;�����	z�?F���D*�}�n$��Ch���b9!(�}�DzC�A��P$�5���I�4���d��3Z�����	)����	;��B�D9��]���*�	�F�E�0��WON��tk�lV@-�����^E��I��GsMV4���!x9�Zݶ� i��>�y�&����]}����;�����$��N��F�6�|Gx��[�}�h�|�*�%i�/���a��q$
m$���֭lL��+
��V[.��`BSg���L��n�������/kD��ĉ�ӼEF)z!Qbג!Y	3�@��T�룖��ܤ���pg+o��&�-D��6��"�C"�2|�j�gh!��:AD�@0�="O�7��
S����.�O�A`�%d�3f�?�01:�)H��8���DB)·�l�5!�:,}�2�A0��������Մi�a��Ad��Iy���
-�}��K�b`D]�m
���K-�
Q= A�ΰnqMu� ʦ�
�nA�7�k�`z8QJ@@��H����:�;ճk`�ع���P�WÙ���y��z��~��W~��C���C��1�t!�*ɣ�\t�$R=P6'�t�Mm�az�Qb-J��R;����^;��Ԣ����(�k��#z
�(ine���l�a�t���"�0�9B��@�J$z�T��L��WjR68=���3�Ys�o� 0����8R�Xk$Lt��Oh�!^W�#]�yy&QNi��,�"H�-�ua`r��bc�/	o@��E{�$���Cj+��B��k�ĵ�[Y��mU��F��o�i�	��L�IbN
S�uL3��np_��zO�E��V	���r�E~<�ٿ�
�+j�L)�U�c�o��RB�C��xb�+ʹc��"����X|�|GR��Sa�L
#+��j��H�Ri���[S�_`�6��2T��f�W Ƌ|�.=J~���؃�
\��
��%�U�(�90긂Bƀ°_@Z��g �[�5o�,��Ӱ�Z	0����Qeb
Ԡ֙{G5��ɨ���^Jz��6R���(q�j&�iIB�H2q�l��&�/�yz6��rBh�L]?=O��W�1�H&I�d``Xz(SJd
�Ne!R��]�(��j}'���
DV�%j]*�!�e�
9��3s�ul�GY
��)oI��z�s/㵴/T2w�hP,gw�[��ayz�
|C^���6�2��enk�Z���<蚺n�S�.�AQ�O���gǬ[��ɠ��t��ǁ��q0��8��|j�6�&�%�h�̀Z� ?)tć��@K��CI�7�es)j�Mc�&�f�W$�e5V%,}�T^J��v�g�ȉpu7L")����R���Y[^u%mh��8xX�"d�2�s]�\�����)B�N�D�Dž�
k�`<��%!���^�3���n]jv���n|�u�(6���ri�,
��1P�MƼoU9�M66co����?8��3����W`�e������U���2���ȇb#�ʓ�$�8�U��!Zr��,��eǙ:b0vE�
o{��%$��e��%2)Sڲ�g�������VU�E�zl(�Y[�Q����R$i���+�!��]4��{Qm2�
�-�����٣��@5V�~���EMJ��+�fy�C<�
>�G��S0�!<���,@5;���fP]���?�^0���(���-��؜E��0;z��H=s��q����2'�ďˢ������w�,u��L.�6����$��gK��`G���� �����9���H��c���7+�K�߉�8��L�>Ȃ=<�b�J�a�hiW@w��O;
�o����%�퍦°3
˳c./�JZ&z�CQ�F��s�Ӂ�	{ ُ�u�B:r]6�z	_uW;2-3��t���̶�Z�X�ژvGsnc}6�ܴ겯u~S�`��VP��,"/�!]��Y�mT[��X�+�$%gE�Q� �=�PXV@��mB�d�	[L�Ɂ ���>'�5��Fz�)�Cs�ږ襢^�!!�E�g/x������z��6�>*�n����~mrS����<�MeS|�S~+�<'>(���8�SMzݽخ�fk�lR�-�P�e��7آ�rb���Ϧ���+�����oy^+,[�+q����!{��Ď�����X̰AU���)֠�v�XԮ���K��Ii���m����w�g�3/
�(��e����F��&�;���c�Y,}�ةrу�"�p��ΑLJ�A�f�
��L��:��@d�'�zڪX��B�=�;J���*G&yw���Q��cS=���b����pk1�'��6ڿ2�����^�>G~�z'AslΊmU�0z;�`3o����Υ��%K��j4V,~S�͢��Z�v�Y�D���&GS#�筊lT��6��rk��9FnI�^�ڪ����S	Hd�cJ��j��4����s��3j�|H
�9'�Ap�sک�B3�t<O
p�2��Ԑ~���Ր=o1d���!����2q,��s����R�O	r��4xڙ�<�����܏����BĚWs!���T�xj��ce�4J���O��
��+xM���g��E�u�-��?d,���MF�}�,�c��hf�Ҫ�=H��\�R������~�ڳ����n�o�xM�߾k��{������w���	��ț�Q�Ҿ�o���^�a� 7yS�����@�����P�ZS�0i�x|�Zc�ҭ}+h�F�\I�`\=7�J%�ep�a�LRL�VL�yT�۬%[a[�D�����.[wQ��{4�t�����'�J':�:&*��~V�QN�WS�͔Q���VP���ͣn� ��Kd�!{�$U�0��D��>�L���6UO�+��H���Rm�)��z���$^/E�QW@0Ji�t�n�G��ziׇ��Z��\-;h���I�)&=EY��ش�Ito����b�	vb�sB��-�<0v�-$j͢V�.�~���n�@�^�<(��漢�xmz��]؅�dcjI�Ds�ZJ��5���v�vҤ��R>��;�b��ѹ��`��Xv����Й�':���eڔ����Wga�E�Nl�#=S�ђ��x2�M�4#%!֚3I�b5�}8�3�l.GYmX�#;n�p�&Q)�m�FfpZ�Tl�-�bi��Uը��}���2l-k.��Θ�\���r����*��ZM�4�e
��ɪ*
�U���l@.iz�q�v]%�����h*�2���V+��@u�.YəK-��#թ�gc�z۾��ҿ��ƽ�[j�0�V��	��e���DDP5>�du�X�K-���?}��/&���|���ڵ�`���9'?��&�H������e��_�\�I�*{X;��VjP	y���У\=�}�Erp&�4�`���DI����|��*��>x&���Bt����m����G�L��8 ۡ��cS��!�ݫ�\7%�z�����T�(�UA?5�.�7`x�a��s/%8�=f.]U�ϸ�OϪ�Mv�
T7�g��m*���:6�JY�8�7��}���K��
�r��,M��>�`u{�C_�f
L��$�R��P��+��k�:����d�����:Q�������]��^��=�1�{��^FC�x�#ݹWd�����}�@�@P#{x_O�i3��t�6���p �b� E܆gJPܱ�$>�}Ev�ˊ��ˎ٦~n\��K��Bb�p$�	v�����7��b��o-��yVe�,�7
 ��E��{ޖPS3�| Q��������u� L)��&����C"�֕(c���3�*J��	:��^
2=����޿�py�U�����i��t���1o�Kq�RqUm��&n�׍�xb��ߊCW���)��Q��΋#_~�G�,_
�Lj��%ZCHW>��HĝV����F�›��f�v,B���?��'�ٱ�)�7�p�`��Y��'[��sW�JS��Ж����o�'ה-�ǻw�?���,�wy�m�����[���o�㫲J^�Ԛ:D+'^�
&a�/�/1���t���6,Q�g)�O�=0����ʉ�;��P���y�k7l�^�ɦC�"�(�w�l��mm��D��ξ�H���`�CZ-%C��/�[�"QQ���RV���}%'���=L��H9h4�
ND@JKp��5���O�왮��w�ᢖ4\�>�<������a����9�޺r4�z�n������0]��M��w�z6��]7��
c\�@�1�߬K���Vk:�9o�/PKk�mWu�1~setuptools/_vendor/tomli/_re.py�Vmo�6��_A(_�T$gka��� i��-�y��H��U
�*b��;���نa���ǻ����u��o?~s���v�R\�<�1
����8�Ǘy�/�fK������h����o���y�KPW�R����Du�b�btAJF�ǚ�Η�5\�FF�EQV���(B�zC(CqY�����Ic�Y��Z��F�o��厔\��ˌH7Y]&����~
ZGI����KM����R���[��	n�ocZ�˂�̀��҃.��d��w&~=�ͮn���4��ݡ1��5����w���;Y�!�ܟ����&��%�ρ���c{b������Tx�^B�`�2��i��o���>q�s�2v�ȢIgo��Z�'��y�J3�*��z�ˎ�����C�#Df��ޘ�q����i������Ay��jjS���q�V�#�{n&�k7���e4N�R�S�s<]��^uӱ�O���Ik���$+�e5
�N�>|��:p�\�8����փ�x>��I3Σ���۵|��>�h���HՉ�L@(�C�����;7�Ӧ(�3�b�܍�Ec��-�����hP��%YVaj��HF�3��Y���t�[BrHn��F�v.��R��a�|�����+�N��Ӌé/~����y=�5.j<����V�R�0�PB(���1�y*�-A�x=����չ�1�*F�F��ѹ��x��H=��˚ᾬ��P)����vuQGb�6"I[T�˲��oW� l(h������T�m��'�[Ђ.�4�hz��A��С�@y�>A[�M4��R
��]Ҝ�:
3��B�>uM>J��N$�ʲ��+��+f�u�零�Cm.*�|���6��;�γ�kij�Fl�V�k��B���^&oz��A7�U��^��]�zAht��˕�f<fc@�h�!!�!�L?�c��C������T�;<��bz��h B$RoaP�l�3E�(3��@��Ѻh<F�S���ĴqKJ�Q���U����A���d�=�n�;������-�m�tE��nɾ����;�Y���tdy����a��+�����&Ѐ��P�b'G�l�1L�`�tZ]#��&&��:ȷ��PKk�mW��g��"setuptools/_vendor/tomli/_types.py=��j�@D��\���!���6`���æV\���he�}7m�u�̛��׏�;}"'\Fd�+�n�x���������/��n[�<m�����`��n�ȥ�'��S���6��b���q.G�sW�,G�	h��;�4>	XA�Ā���<��7N��
�
^��s2��epo��1<�
�\'����PKk�mW;��N��setuptools/command/__init__.py���j�0E���K��
AP�]w�](A��d�^��$���r ���Y��33�9X*�%䋞R&Z=�O��ZP�PjQ�ft�|��Bō�s�`�tw�'����֬�#wl�<��pZ���*�������
M�n�˂���s�~�����y5l��Fh$ORq%� y�q/�"��8�����Rmrv��7(e��C��oPKk�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��EPKk�mW��e\��@setuptools/command/bdist_egg.py�;ks�8r��W�rH�)�}Im*��s9��j�벵Yod��!1#�8$��H��� @�����D�F��o�A>��mk��~�7e�)+1d|�[���P�%K�ac_mC�6"��j۷{j�6/�>�'V�X��φ���o�|����u��=ñ�U[�KhX�wq��5O����p��~�罸�kEfw��z.�C_�3�mp�YW�ö�	{m-S�Z�)x#�Gc����y��@��i�!t :�<��bh�BrE�l��M$�%��8ܴMv�{$c�Z�|�2�lu����_�􍁎��
��e��<�<�V5o�=W�Ֆ�iȪ��َ?��ְ
)�NEWW��ճk�H���)�}��r�0�"ՏWg��_�K��~`/�������
��	�v\@�]զ��>?&�������-���W
�U�d��|^���K��I�?H����E"�pR5�E�pP�dG���Y��u3�j�=0;�DZ��q���:3��y�u#-9.8� �P��M� y�e�E2�vu��kwL�u�C�3N�eب���}��aL�8P���)�be�������
мk�gX�#+p�E�siL�5C���m����Є�����qI��o���$�L����'�f�aw�&�V��v�q���$,�c���t0%Ɋ&��i֣�(�\f<D�,����fE���T0�
���ρ�D�� �A��#����4�)h�:�7a2�(@�Z���XP�G��jvl���tqb�Ƶ������02DC�~�KT�ox+)�
,p�k�"P��Pg쉈`���D�C(�C�O%�OI�,_{�ҫ���Y��ɑ�<R
�vW|�yw�\��:��.�?��iՈ& 	g�Y޷��d�l$�Sx��T�Tw�%����!c�H`~w`q
����).Vq[u��^˰����P��(>F(2���J��S��_K5�y�x���C�Km�h{��U^W_��	^o-#��*(C?$M�ۋ2�):�EI�����(V\��9 �W��&�Zzfm����>�p^e��(�7�'
_f*t���dU�m�xN.���cZVf +VW�(v���F�8-�|�q:�6~��:�����hBA���xN��^Bg��A�ɖ��tˁ��}QKI��"����9�g	���!��c��c��Z���x`�Z��G3KL@��va�E'3�H;�磌iJқ\dj)o-"p�`5�}p�Ć0{'rG��p�7Y�wKZP��6S=+�!�*�	����%��C�Enr�5	�-�z;��bW~TA�Ʃ& ���dC\Cθ�d���F��OM���ţ��u�x�
We��c�	��	C6U�`�_���W��<�a	���r�rj��z�t6�'�˪D�42�x>z�{74��(7��Y��4����Nw���2�[��\��H��w��,ܒ�a�����g�	��z~���}���Z�3���/^�5sAXҼäRn�(5Cti��]��'
�>`0�h5
�D�DC�9%j�T�H�D��|�,a=d
k��v�	jZ=>cYQ@�GÂ'���s���jbŬ��!�%̲4�����殽�v��J���o
�7�����=��~����l�Ż��/�!{}����O~�^^^~���=���#��)��p���dQ-��1���P��p+��ax�rѵ΀h:.�����jkQ3��o�{�Ϟ�x��mq��=������ӏ�wy�R��CN���z1,��N�/�a���p�R�l�OȋRJ&ڽҤP+aa��� ̀���Ɇ�ʞ@D
�WmkY��%���"�W���]�^,C�j�D���o��8���f�J�I�+�4=T�}�w+�e�B����O�}�7ȟ����J��Gc����@4�`l��S�9��V7(�}��"��8�-F��IHW�n��'���I&�I��+���,�xC����vN����z|�D�.UJ\�W&�G&KT�({��(h{6w�VYS/_G�#�L����5X�u�]c"����輠�bHl��d[�.�(���uo4�W�ѫ���$b��9a?���R��}{z���OclTYy�ce��9�#p640C�NI�D�W,���R�/��X��"!�%��L�:Za���'=[2��O#�y�6���4�.��i�
��m
�p,�X�F`�J��!p�n�ƥx�YE����;=���	Кi���hk4֣��U�?7���q��=6��[�-GI����gqK̥��?��0����u�j�){�o�p̶u�ss�o�h�|���,�Pc���"��'K_�Ig{X�N���������3���!�6�
J�9������ミw⹞���*���C��%.�~ [��</S����)oz���ˤ+F\���CG�A"7ɞ����7 �k�^̓���-r	�N)�o���<��b��Ԑ�eZ���@�7�Å�e��:|�xF���r�e)
9:�6��A�g�����G3ϣ�@��:�Q��U��S��w�ie7$��l�VO���>|�azt3?̲��13�1�)�$ۘ�X�QI�GP�7)#�4�(�9_�jr�O���@�맳�(x�k>���2�h��H�E@�/��g�!�+k�4�n�,
x��}�x�\�_ӧ�����*�z���5�����,F��|(n"�Q3s����O7a1ؐ�Cc{R�}��[�d!N�TF���\�d0�V��&1�z"�Qa���iF'fa'��Ya��x��%2X�c��n`?}<�_���B,I[/
ᖊk/9=��6y��h�4�:�tce���!���� Ǡ�
4^��2�ß!�����<�1�h6o���eYr9�{LIb凱]�3��_��C��7�}e�o�˧+x��RF���d�;t#�(�'c�Yc�9�������SQ��rx��`ta�!}�0C淺x
�G�Z���e��	�)%r"���z����
D%t
��2��G�)jd
;�z�9�,5��w9��&J^N	9,������Ha�H�c"Dэ�Ԧ;Ue�|3� �r�Td�����h���3���MZG���-�^��L­���%�Hδf��*���߿��k_u��ht�y[��"�����:D������g�.��}����G���xb**��+\�5���Q�q�`C\yb
��3��P��5O�E�o8����J�W��r�f���g��J�g��D���Z��9�Y�P���|�Zk���R�b����y�^e�ž�r�^�e}��}K.jy/����CKϵ���=s����j5�-`VY`�!v��GAr�׶�1�� B+C���w���:�G���l���
;4xT(/y��vpַU��XƉ�9�:
�8��lS�g�sõf
	*�-aSJ��;]wUܴ��tÕd

g��	�":Vn��Eџ0�H�	���@�B-�J�]�df���!+=VD�ǹ�9��Z�u#ީ��0�f(jI�7��?�<�z����
:/{��_O]q�0�8��$�)(��ާ�^{Dŵ9�b	s��|�x�CF%x��Az��f$^�>�ۦ�����2.�h�SLD�@�lݘ�j���y4;0w.f[�Q&�ш�/8ת�rB��M������Xn_�XZ�&~Dz�w��:/����[�-��aMD=V�����9�M�ڇs�����W#�.�w����Z�<è���Qbv*3j%��f ���������Wd|�o8��I@ֵBT����L��8�}>Ue?D�ݚ��Ŭ>�v�t�5I�33"�t��s�5����u�;t��~m4��IY����F��al��p��3���*�0u���8�T��dr��k��N��2�=���^�$��9��,��l%EO�9�3�������Q��n��#o����b�
t`��A����V��O�f\��kOC�W����ǣ}��tK�*�� ��̌>���k�k��
�Bq>x"��B��{��WST���(���qj%������b��;�M��*��RV�q%XW���z�]V=.`cDe���A��:�MI��B&3TU������-���0�#-�3���,n/���(���o�wK�>k.W�x�J���ځ<$J
XP}
����*H���]��o7���NJ�؟-��idg��җ�
65G���z�v�ĕI���z�9����
��a�N��H6OC:}��N_�v2���<T�5oX�Uh_�}���)������P��,��r���&���V�L]\�[�up׆<U61��9ށ�ŭ<�:��(L�c,�ꞓrq�uJ
�#^�s$��$��.ۨ+����9D���	{9ȴ�+m!�Q_gH١\\�d�W����qӆ��w@%�2}�Y���(�z�>�\�.h���l
��Ϋ��i��ц�k%&���nt68P�����x���{����9����D�����(�������ܷ�=L!r2�4�d��v#7��@��x�����C=�X)R��ы�B�]^�(�� �X�xO����*��q�b)/	�Ζ>Zj�(�� HX�gO@�h�&�Q�Pͤ��tX�'���/��?�~	�����M�y.�_~��.�<u�FGHꦩ#��ΥP�ݬ����~G��e��ʪ�ށa�/��-+�L��8N9�&lj�.�į�����m������(V5K���Rj��I��(dq��\3-�4V�~R�7�j�S���^^��FB�(
P�Q������Č�/6�{3���M��zv�><R�6�u�6��qb]7���-���M�<�͖�PKk�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��?PKk�mW�.�I	�setuptools/command/build.py�Xmo�8��_Ax?�]���-�8�i���M���ޢ(lZǼȢN��z���}fHI��\�^>��D��gfhv�m�r{wb��[�T��r'�����xP�ۻ��<_�����?��K�\=3��<�ޔ.��n��"[��,���A;��_'a�#�����u�.�7Ϩn(����נ�ɉٰ��
5����X�䱚�0W�-N��h�����<�Fv�ٳ�O�*��lw�l��[r��m�W��,_�=��������ӳׯ^�^<�T���ؿ�������Ҭ�'(0<��1�w�/��ڹ��i�b4�;��z��U�ƚB��n�|�%e���5~�j�P�ȑ��]/c�tB�����YZ�F]�_����M�!�K�}�wŇ�?��m~*S;�K��c�x���p8��v�
'M&���s`�h����޶
��ֱOV��t%�+����nS�2��@�
�H}�W�!
NA
pW/�ĺ$�XR���d�-��u9��)<0��I3m�e_{���䦂jj���f=./�Yx;�� B�W�6�;�$g�0^�K0��e)J;P�Z�T/V?���j��I�I!���/�߿|���aI;F��"u� Sﶴ�g����w���Rc��ȫ4ш� +~�R��B���[��햨T?A�'��H�j��+K��M��eD�Լu^N_��
H���ز����r*�$��=od�Wp����1���Z�kZ�Q;.�>Q.�E\�V�>uH=� �e�u�iv^���ׄD��r}~��8��ӻ,���V��6�0�0;ekov�
���V�'��3���٪�䪿x�:�G^QE
��H���6�䧔I("{9�M��TNa������6���&r潚�n�_��ȢKXZ�W���H,�B1V"R�m���@?(���Jd�����.p���T���.Ёg�
��p���0���X�;�ų&8L��(S�HNY��l���\�R�ӃWE�#jH���Rj��r��Z1���׭_�t͍�D�m�s
mJ����m2U^����%R��%&�N�<bi�����N�qQ��^]W������p4���P�R`T$e���n��S3��Ϻ�k�V�2
��Y�&a��J�|=T�z��
j�]�Y`êJS]#SQ���&ѷ,y\�L����
�|C��?ul'xQ�|��}��Zh�S-�^ �(�UN���'��k���>��tbc.�H
�1H��0q���&��a�U��7��zƪ�d~x�:��k.^�Ş:0ǚ�5fy��5!u�Z�p� ӡV#V���h���P���^��!p�V�X�#�&�,���������q$Dc��aՅ�Z�W^��S��)��)�U$;.^�:)�C�c`W���-��.���QKr�#	J�wG�[��Ouir��u��n�q;�,mJZ���Ÿ��}ig7�Y�^x��M���A-�=j��VWW�g�m�����i�0�`6Y(��ۥ�o��t0�c�$3{J�W7�lt�; Hp���)�ʺN��묿[��J�>��.E��j��"����_}}��U�k�N�!\m+�=p֠� ��?�{G|yT�mˣpDV�;eO��>���
�F��X�CMe>p��������$�A7�p$��0�E�UD��tj���b�P>�7o��8���� ���#PG:��OmY`)�Hz��j�|*�¶ڔ{tI�I��C�J��m�gs����4��]��il�Z��{�ې,\�������}/�^�P/��#����:WSn6&��}C��TA�?��){@F#c�)�]r��c�E�z�����/�q�0�f*���ы��7�x���aF<&w�^^t��~��G�,;��cp�}�`��-���4?*��9��6FhUv6:�k������S��<��\�}W~�~z�.�y�4ɼ�K%�T�;F~�2�a0�-��c2��N(
��FW�����ot?�2�����?�[�k��������(Ju���
���8�IRնnK�W4$����˜�݉Aӊ�*N�?��y�T�B����J��qc'
o�i���殱��5�s������Aл��>�E���]h=BuB��OT�#��	�Ji4�����)�K?� �����`�X��N���@7�P��"	i�{8~��^7�
9!��i�Nz��Mr]��0������K��p+�wC�"�!O�]" ;�a�#n�
�^�/|��x��?��!��J"��eM���e���8^\<�N�|�iA���Ԝ'̺~D��q&�߳|@^���~%��{���|{���PKk�mW���G 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
��
nu#,9Y�S?˙�t����y��7�MF����H�P��>@%GΔ��,k�L���|�ח����Æ�A��=	��Eb�)f慷D+!��ݨ#~zs�uK�&@J��'����.���)�7<9S�ju�MnKlԚwp�0��o�b��I�]L��s��{"��O���L�B-Y)8�)�����&nxw1�q���w�O�v�	_�� ����{���'.���Г(
�W�b�g�����6��Po��� ��U�M�N���aξ�E��h�p�&�O�v�7�������5��\G�X_�?_)���"��oK*xU#YJƕ���H4DZ}�?,~��B��>N��>�!&����Q�v�l�4�n���vb�[���zl;�Dz�o�T9���Q�|���aC�x�� �W�,����[�2̸�/U�S,����xDY{��w�ɻ�TVu��,�)D&�<�	q��`���O4��3'��5Kz\H�S�)����7\^�n��_\X���{�Z�������3���M�g�
�,���
�4{r�x�e��)�gF�[�y����qT7R�7D�m�P	/�N�ӹ!}�ὖ���
�"�Z���(��yA?�������&Q��_�-��	I�h��d��I�i����ߤ湞�����-��30��l��_PKk�mW}�]��=setuptools/command/build_ext.py�ko���~�FF@��٤�Tnq��4\���1���S��%-�E�{gf�|�vТ_*\i�3;���.�ݾnZV�Y��ɣ�Z��i뺔�uS�-�U��ٶ�Ds�c����]�y�.�����|z}��ڢ4�3)NHe�5�`\�4�w��y���i�wB�h�����WE�.����u�do	�?v�R��Fp5����d�e���� q�pޥv`�BS��J�M2�.��ua��:�ֻ�‚,�F������>
X�͍m�'%$�i��N��K�G��ZQɢ��v��k���8����b��s�^����[�֬���<�[�]׍�
ߢ�KV���E�W r�@�+���#Bw�D�y���,�K�!��X��G0��]�w�`��,AH<�м�u�>�5;���cB�i�VN�8���x���3�	�
�#i*�8��e�@fgl���]#��IP���	^���Y��x����/>�~5_<j7Z����{��o/>\!�U�+��f9�m,եr�.6C���J�%oaΎ]^�yΛCQ��%M��$?ֈ_��@�U��Ⱥ��`�_}��mH� <dh[5�\QAf+��� ��dˀ�
J2Y+�[�D�h�m�F+ߎ����+h���YI�_�Xt�n��dc�n��$��O�>��E����7,���e[~�g��[�6�6l&X�5�f�&I`򗽎�mD7@QL��|�e�ry����#��"CŜw�x��Ѵ��n?_�X��Ko���p~�꽚�l"�9Ԋ�<;���}1�F��6�4�I��y+bP��$J)��T�f���Q\|C�pR0���#���#e7�l����|l:1%��2��>\U���A�͞�v��䓻咷m��E>�}��{�S�e0���?��D�N�2��4-��I�n!'�"
������S٭��C�A����c��4x��e_���O�h3`��>s$}�fQ�#��`.p'�X���h�}B��K��d�#B�SQ�A��1�e%�Ѕ��-W
�I\�D`kMD~�����#r�U��z�}K��]�\y��p��H��a����BF����R=�d�J���%���8K�}������
������Ա���Na�[��h|G��瞗�j���V�dx.�y-��T*x-[H��ύ�`ݕ%�H�<.���g��,XuD��ց��y��,��
�8J���1�;�!?�D�/uQ��������
�D��(������KtF�\��.����%���!kĦ+y3����繴"�iK�>I����i���#
_5a0�Ju�Gf�'{t=��V
ҭZ�4�f�)+
�S3g>��~��)L��M�J�A�B����h. [�xK�;d�@&$�=t6G�4�w�(%�]�Y�ʁo���i�
d�n����1X��iդޫ�0�b��(��쉹���p/�U-EO~@.�VB䒂�p=���r:�g��C㴧�ja�Q,�+���&!��`��S;McD�(֮�W�p
*Df1$Bz�jeHl����������l��\�WP=�CR&�o>�T̓)��.�r��}	)��Yp]���@/K���T�%�\�$��:f�%��~�8���j#�'�;Y��!\P!Y�B��Ǘ^x��LP��6���^ظ	4q?��&�(��\l�G��J��E�����0��m8��w.�Gz,$*'v�o��g�#�9�J3��om�r�?m-�"�fͳ��&��jc���PsMm�9��MAn�e�@I����&��d�<���uq�N�[H�L��öȶ#���@�
�nM���Y�ʇ��nǨ{�"�w�����3!�*�.٭[���V�����G�f5��+j X��ꍍQ=
W�cLѥ<��X���v#/z	?�8��9��g�)(�v�1/C�=>HP���i��Y���-�%��8�z���>���*��L�b�{�<��
�eɁK��H�`_h^�&�$B�y����0�pQ��ϙ-<���"$M!��_��`"��X�*�z'���%��r�])�т��A�����5z�2_���/����fgz�	�C
jIѩʄbU��#4WKf���,�a�`>�4G�SwӶy��;zu,�{9!"��6ʞ�OYTw�u3lHs�V�)~��0I���y"\WÔF�r�ٵ�S�]�~�폩�a�J�ykd
���o�����?��{�wA�]��<���:L�s9�ԧO7�����%T2qpLN$4��j�w�9�n��i�ЩN�,~~)K&�~*}n�x��p�!K��`�U�;�:�J���!���A�A�@�E����|�r�!�, )���y����Q�67bԖ���~�]	��
e�42`D���W’cʀ�����f��s�J�&eyF��DS�T�jP�=�o4}F>/	�"�ۇa9t�	�~��
��2���kz�6]Y�H_l��â�?��K�ю�����|�xD�ó(3z�;:�L;րU5�,q�BQEc�բ�J���^TTY���ä�����b�^��,K���i�g�iJ�T�©�al�*+Fk^BM҉k����n���''��
�r�&��ʚ:@1���Y G�X��pbis����e�a�Uc��!���s���$�%��?
����1����^�"�?�D�H<@��3������swteN�l�D���P�sP�ƕ�`�R	����+H��<�Vu)]Kq�؞V=�T}k���L
�	�}I��I�r�{���ϡ�[�j����g�!3cp��Y5T�sܗ0�@�9}vc�F�'7;]�gɵ�c/=��IЗ����� 3S�w�
����aB��1���n �듘'�5�Ve�ԣ�ۺ+sFň;�!hB[2k;d��6Ԑ����K��Ҧ�Ԥ�$����3Dq���U��i�xXY[d�Ce��Y@%� ���,݉����:�WM`ђ��a��n�t���l��'���Qt3(�yu���0\�Ҩi0�.�� x#�H��o^�G�.˘l�3WC��/,�b��/$��B���}M򪔊�	�Qf��xKr�L�JvA�.n�K�z��{{�U�z�Fn}s���>�}��zbͷ��d �˒�V9g�����1�{Y���A�L;���5G���w+��Hɋ�A�K%��Ah9�yu�^�ݤ�N􉝃��ɖ���;b�J[���n�q̐.��d�@���y^����(�_�zZ�5�K��9%V=u�T�:�xA'ˢ��|<֘�p;�u�����`�&�R!��͹p��c8a0 ː��Cg�-$������vx�;�WYo���x�xq�S�����OP��?��e���-$��8K�����s�ם�<ۜ�������@��E)Z��Ǹ�D�C��=�͝��C���*?^ь~�t|�m	��FX�u:�{H���$ͅ�6e��e���ԕ�oJ
iz��ҏ}���F�uٻ�?g_�"R7A�y9_L�eH)�$����q�)Y0�y����Rت:AXD(�Sr���	�.*}��Jcv�G��e��=u������O�K4C��D������!��Xp��[R[�O�o��.��;��!C6�21�VOr�{����4U/��䪛!�ua?ִ�������Z�� (�?���D��9�A��~�M��ۄmM�Q;m+;���綦���u�fGw�~��nB_��YYK����Jo�F��89y$>z�������ڞ�w����-�{�/.����b;w���R�~~�U!_�џؗ������2���X^3tj�u�t�خ�=�,8�l�\ɿ��1uۺ���z�¶W<0J��j���Qפ~.y��[G�p��D=}�Ѩ���t�Xu�;L���!aj6��j�7�2h|sgNĶ$�6��O�Mwr(�D�s��}���>-�P�^m%�4.�M(���HO}Q��D���"�]c�EG7^�m�zEJ��@����osϱ9}�+����Z�o�I�~����ն
�����zc��S�:�o����x��Pm�+�N�[������b}�(=<cB}��<<=I��ߪtv�MG���w�ZH|�
�#�&��A�������� ��7�3.����a�HP��nHQ���AX/�����u��j�¿���7Gu�
���z<�V�C�AJ뵠��
M�$4_����z����,��ne�v;
��u2��I��v]�>��PKk�mWq�B�#7setuptools/command/build_py.py�[�o��������֫޵(PH��ݶX�q��E�
dZ�m6���R��w$EJJ6�k�!����͐�w�I쇺蛦2B�ڦ�E+�^��b����ٹ�̭�6����d��M}��>oe��m�Ȣ9�d]f�AWeޞ�4���l����O�/<�^=��l�w�̉��k:O@��n�5�^����j]�y����d�:�s�\����7�=Е�J�O}�m�������uS�j#>m�.��Q��#Y^��S��a�e���þ�����0TWg��S�ߧ�4����Q����(�^���:�#�I/�����?
���Ԕ�u�
(,7
��ЭĿH��u��/߿��.�E%��8<K���j�zWe]�R�]�ZXU�Q�a�E5�ʈR�R�ut��)��A�"����S´��{
��R��ǭa�a8��k�`��3"v��mb��"e�¯N���Z�N��E�z�*�l|]�f�k#P�0T4{����'��y0����{�ti��3
w���0�m�ꚈyR|��iQ�`�̉����ϕ���7�����Q��E����z���.����oaŸ�Z	�R|�����
p��&+1%��:[)�V�5t���!R&1���s'�
�![��,<>`����P��T�HJ����@8����{���4����� ����q�,�*�	'��l��B�*�8��%Z4��A�A���ɡ�������
z}RZ"�����FT�����Cz-�5Fߠ�N�!�Q����¹��B&�6�b`^Q�}��M�%̀Ŧ�WI�F���iqJ6�A`I���z^HS-	hA^VT�x6�PO,�7������{�
Y3��,*��-p�<�Ά�T�	[�w���q�ԷĖm��u�Ѝ�S'۪�Oٖ҅�'�I��dv����]�q�����:�/�nc��@M�4K%�>` �΀�C;�c��bKܝ{����ЕA��y���N'hz_��j�9̐}���_BE��?���Їa,:~�%��"� ��98\?�'�w�ϝV,�'�4�9�;�����5F>�0,8;��}5Y��R%�$d6�l[U���̄��D�s��;Uc�V�FL���N,��{7�C��Dj��&]�q�	=q.!l�!l��{e�d�,.��d�����.7�����f���H`\r�K�y���E��n�G�Zإ���Auh�>��SK@��7��Q��4[��5`���7:Na�|%��a�N�>4��
¥�#\&vg����v�k2�`�[U����@ ���]�c�jn������v	�Pc�w�'�����o��o��s�'�0��,�L��Y��F�ɛ�&�#��݊�8j�i+
2��~��5(R;�"|J����O�-�b�bY�T�vV���ā��Í}�P��>��o�
0��	�1y��Q�F��=/5�7`����6��$֡��h�]ǣ��=P:�7���
��̱ϱB���LM�[^T�jl!#��
�� a�WW�A��v(̾�Fν<5"���*. �BoGu�@��
�
\��l���/w���x3>��_�8ԆU/Z)�4xa���mxT̛�4���ђ�C���g�5�L�g�W�x�+*�P�i0f�/�ARo�p�.#�v�p�v��_���{���	�X'���N��3K����E�IS���c
w��[؅^�6y��񐧂�<1ɢ��q3�a�LL�`K��^U�+�x��7_���d	/8W�����(�X�<
�2bL]^)$|(PBI�������Н�B9���}��qL�5�t�r����C\m��c�]Ѣ�$�A8�q1��V�G6f�+�Q�#{�y
=?D�/��F�Ep��Bc<�L:�*������-�Ds#'�<Ӟ�+�ZB��,ʵ���Iy���3
��dɱ4�Y������J��â�]Wy��Mʼ�O�BP0c�6��x�b�{��,Ś�j!\"��ï�j���y��9�P<�՚@1PLL?�o/���D_���5o ���\�VJ����蠢rQ8l-����bE �Q��U4�Zh�0o#V����o�]g�c�JyTX��%���h��D���a1�3�L��R�N�2�+�D��aի��_���+]G5U�`=�P�6�'k��$8(��2
�_~~n,'&����=�1��Rƅ&?�jq��lXq�{�z7왕�?��apΞ�q�̀CF'g]�
�+�Щ�c��۴���w"qX�Ho5>�����xuų�z܂��y��+��`���^΃�~@J��}<,�|����#�p�kG�B�s�ty(�M
5��J�#�D(����5�/Nכ�u]96|Sn��uB��c��L
�N���쀖���d>�xڇe�h}H�\���,�O��ޑሿi�dg��K�N1�����vkk��~�[�@g�wg,�� 28�X�4�T�& �� F��b��|k��( ��P��P]��`Z�8���6"�TK8�O
����4�»Gȸ�&Ո�>{�ަq ,�?(��q3���>J�P�l�va�Ȳk�2"4��ie>>��5��#���ܞ
�H��DK�o���X�Y绢1A������21��ύ��[�d�Ycƒ�q�	~�){[<�`u0���"r��- ��z��3�+�%vk��ƚ�ܱ;��-H��:G��B雐����I=Uޞ���;-=uG�K�nX����0r���[�&0��"�0��5�9����w� ��T���f�X��@bN����6��F�X���W�wX�f�&����
�[��=F�O�^*•��ep{���E�������E{��W���i���ņ���'�����=���b�^��&k �$�pv�[���j�12����"��w�.v뙪��1���$އL�b�sj �Jf�]�i��.�\�/��2��bC�D�91ݛO���7.0]�R�lOI�J|�z�9��^?j�>�	��!�/�!��;��.!0�瓃�Y�kVֆ�%Q��^��c�(���rXt��i�A?��fѺ�26�H��"i��h��K90��0�|�N���b~?���Ya72c�g]���ʁ\-Y\�y�^+�فu��BE|�Z��ţ��[�?�v�egT���w�_��,=��q78t���fh	��G�����ɞe)u"~���.���l^t��ҋ����IF}2���S�U��'���C+J�j�s�J�)0��(ʡ�?���M�J�T�k|ũH	�M9��Ύ,~��f�刼�o3N㽞%f`B��Ŏ	�o�R���4�-�ْ^O�tؽ4�~ο�{RC'چE尤�[�|�ky��X���z�.�._�͜IL��x'/Pq���L��� )��'"�f,���G܉3��
w`{�h�m����jk�b�2�O^��w���m��;X�O/�FA��Y�J�3���Sg<l���ݫc��Xn*~��//"B_��>?�o�E�od� ��
�O��ʎZ�f��h��1�8>Aoj4�71CfY�Ӭ�P���Q��ȠnA�	s|��T-�?�~_��a8'zH�c�a,��~�xu��1���w��_���"4}���5���B#��X�y�i	��^ݫ�=z��ɷnBڲ�^��T�B��g~x�w�e��>@j
{x�2
��,͡�e��j�}E1���@w�Uw��О��0��qr��0�v�*��V\��7T�)��,K�-H?�B�.�9I�Cq�
�M�-`-h�(�ީ��SGy�A�s��TŅ�����
0~��ٛ�y�p-Juj���>�4�r�s<wWi�`A�����O4Q�ϕ��H=+�=�A�+�JD_W�7�g����d�~T=�(�_@l�jx�n&Y��۟N�/�VXp�7�
X�u�u��k3P�?�'��gw+��^Q�l�X�b�x
!������jjGcz��y��,�i�IK.+d�L�$��
j�c�y���#�f�.9�^��\��츹|pڶ�B��Щw�J�%f�;�2[�j|E�O�y\��ރ�D�t���]E�l��@��(�����e��8��8&������s2*u��7c��2\4�E�jc��b�8�NC.ͳ^=�0F�>��_=Urw��Ņy��y�ߧ��������OX��E�PKk�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�����PKk�mW�;��setuptools/command/dist_info.py�X�o�6�_���2[Ⱥ�eX�d@��
�l{h2��h��Dj$����%�r�!��}�>E��\1j����d\�$<)��v�3M
���b6��o+��Y�W<��K1�f«Z*C��O��'�i/�o���*��ZOVJV$�°S�%i��7t͔������dT2w�55��|�����i.���b�ğ�r�N43Mm�nP�)�)j���5�0��
V�����N��#��v4��$/��uĭ��b2!�)�������i��/E�yx�S��h�2iY4�|�/�O�z=_R�N�32e�'꘭�)���H`s���'"1�mJ� F�D�l�h٨��K��qy�����b���\6�n�TH�d6��?�v��^0��~���c�{^�d�^��q�.�ì@5C��Q��:+
�/�6��I��uJ^���=y��]�d˔��M�dj�lxYXC���&㎰���97h���o�	��v�PRL!�D^6ఁ�_Z�oC�;��
� ���Og>��~������P*��Kɪ1�b�օ��2z��C���G�5�Ж!0<vf-H��g���1/&֬\A�y��+�|���hWx�".� ;x,hu��K�gYA��z��C{�O�9�m��NK�z����h5_��/���� ��ܗ±;����j�CrW�R��(sT�R|�A������/4�#�t���g�gŗ��f��V�+�IR��LIiXB'iB>�
��x�5���^���Y���3�<U����K��7�c-��o�y/�܏��aV���Z���G�9�{>eH2.	�����L��m�����m��8�a���Ir����G|z�?��O���b'���b?fס?��0j�䷽��&
T����%˖w5�X�N�Z`�͠��@��H��5=,3�ypoۛ�a���
��⑩*�3��F��)%�>�V
��P��=���Ng��'�,��Ԫ����Q�Pi��8$~l0�HQ�^�o�mo�N�)��8P�b$/�S��<Ո��������k��b����o�ɉ��Ei�0w��&�������,ר�"��"B�'�����-��	�hQ��0��v�v���ǧi�B�����8��uW��$J���'nj
¤�5��j�t@9T�W����&��VL��`�Z�D�����qQ��#��T_���8���s�ف!�K�^+�k�z#t�,�.غ>�a.�V����N쉗:�5n+��vN�;��[h�Z���W�W���?⮉X
�{�b�n�����ssS��?D(��t����?��[�D*UKn�����{�z}��49��'�t�B(���إ�2��yE��Ê��0��rV�ώ���B0-B/�
o+ж� �|39ROiGtt#n�Y��3��=H��rq�0V9��9I�\��3NE�`;�
��5b������O�7��%�ƶ���D�R,�ƥ��B��*S���q��i=li0|�`����E�u_}��a��NăԆ�K�m�bֱ
�6������1�1�Mr�1,��n�\�Q.�c /�6R��i3�w����~!�O3�n �Z��A��
�n�AaV����PKk�mW-]�[�N"setuptools/command/easy_install.py�}{Ǒ�pu�(��KY&��t�[[Ҋr���!9!�Af�h��_����1 �$�=��t���5���m�r��j�`��<x��M��Λ6[6��"+w}�.�z�o6��\V��\�g�z�̚�lYw���W���e�涿l6��⪼��y�}�𪾬W�x�,v�j��f3ͺ���*+�f�-7��Z��p���C�iP�����Mv٬�lo��(�Ev�����aW��-N��oo��n���쫮?\V۶Z�g�@+jy�e�^=x0��zp�6��b՜e�z۴=}�_��_���-��5\�k�h6�Um�Vaw��u�va��m��3���}n�>o/����z��ʿ��Öod��v�ټr�\L�׶�_������rN�Pt�����y�¤V��*�*��m˛�k�YՇj��˳U�V�bZ�6=���mg>6����?�V�4~��W�-"�j�����ɂha�ځ��ߴ��|�)�
� ����l=v^�g���l�6��s�/W��nT��bxR�j���AW�����g�=�����s9�C��;��]	�;��`���MAO����“f�G��vqY_W�><�
R�BE]��y^V�����'ӌ��ﻺ��(H��o�~U�����c{,��}�xZT���<o�.7�Ue�-~�&۫x{��Z�{�8���
a��K�+|�qc�m}�crJ'I��M���u�6��4{�&���^�5��eٗ����}��i��̀+S�ӫ����m���U��/W�������o��_����YzS�՘�i�f�M�k+� dߴ������V�5���$��uT	Ng� {�k7Y�������ߚjN��<�2_�Ѳ:/w�~4��R��wyÜ{�&x����(;�ɏ�52�f�7��^�����7زX�_�y�Ƹ�@8��
�?x3�qeuW�곳��'Ϩm��c�2_��EȒ�ތ&��Q��V�Mqv�]���f�,�|���3��הݢ�m뾽���P#�d��w�ߪ�j�g�ljlO7̳��媫�0�$p��7�����e���s\�m>��\��w\��e4�Ū�LoG.�J`��u�R�����k�P:dB���ˊ�7�G���p�a�ls�{2�p'!�؞	�?���f;��EC�;�M����`n�`���H�G4:㧣���e6k��G?�\{3���`�r�׀���O0v]��+��v�ey
�Z�	��'ȴ��m����7�`3U&�fyW!�����K�6�!3���Nf0Rp��i��>����f�u��aVR�}W�e5�6�����f3�����w-W7�m7[4�[�Q�^��{l*��E|�c'
W�l׮h�5��k����l��,���W���UG�i8�e�xS��ro�E^��%��l�Z�����z�k��쪪�ĵ)���@��ǯ�.����p5���r�Ƅ�ϲ��'4��F[^����pt
��Ӱ	��+|��1.ܗ�vf�r ���A�ܛvi��z��M	�沆��#�ͳ�-�e�{l�_Pf��C�K�ƈ���3;� ��.x_����ĭ�h5O���08����[XQQv���T�e�;�i��V���ֈS7�q��>�M3Q�.�W���QػY��¬���e�<�/��f�!܅�g�����;�',����j�z�u�r�]6}���D�We��(�'�e�oP����م�+����-�f��e��k&ԈnՇ��V��n1�����v�b��ew��q[<�_��Kt�`w|@��̐���n<�ҏ�oN��'/��M���{,mUn��՘�\_�2a��#�����Q�M�1
	�o
��[k_��
�$���.`c@��i�~�O�3;���o+��D�8���!��<��
�t���|,�r�ϸ՚Wɬ���m�sMװ�7p0�Ŷ�zK�6@h[\7˲]�"�hßҡĂ�k:y`?��qx���Y�]v|����w+L>Ȁ�cO�� �6;7� 6p�xLX�9A?���Ž��N�h����1��$+�b����Դ
�4 �����S���t��~�ޠ�6��;��ьV�TS�bIK������ea(T
�%��c�x�L���d��izӖ�S�u�R��
�l��U}&m��i�_�u���=�w0�>�M�����]x����a^4
岂un�`(/_|�I&���WwU�'���К��x�i��T���
��ܻ�0�;�Q�F���������k�7��P%>Q�����g�&���u]Zډ����f�P��P���:�D�l�ݏj	R}�78���ǟ�d��K�e�[޻��f�u��yvд۝�|[-I)�b�W"�a�*a�6 ~��H���V�t�D	YԯW+
���@�:�i��ZD�k��u�l�_e#}��I�d���@j�mGK�m�lG8!á��^�4;���\�>��Ȳ7H�lo�v�&'@jΚ�n����k�������U�3M�D�wtY�.r�f�x�e����ර���3h�U�@��Mo��1Y)ɔYL�5�M�z��F����2��0���{�f`>���m.���a�f0扚�n(�Əj«�b�v>��"��%uj�@M�����7K�/9�RwE�V�n�p�sI�қ`��j�\�Ү	V}n�V��`��;�]��hv��
֥[��tk.�\-��Q��[jE'��LB\�� �a�tؐ�2O��Y��i��O�96���377���J �C�PE
��B�~�E�J=�~�n�OL~�7d�z�15ȏ���؂#9,G�v���a���D�VYÖ��v}�>���U��p��xy��^>�^����V#��Z�\+��_N��/^������=����E�pG�Vy�mW8�����Й����� "=�A>��.��*��;,c�s�1�(M��a>�&��l��]�T���j����A��-"�u_[ J�=�=�b�|]��i������n�e��}�B31��P�v*���D/���몟���ڬn3Q�}:
.*����Uy�_c�+�����p���q�Q������G(��g��O�,�vЙV��n��y���f�ɳ`n
΍<��=���f���~g��T#=��HM��8��~�|2�V!'����'��#ġ��'�m���+�a�Z��|?“� ���7��򶎕gb�Ru:6���a�B���Ƚ�;��t6��&+@"����기���`Ȧ��g���^���3`��X��eN;�ZVI/�p� �|(�V�ܥ�.�W�ȧ��FŸ|,��7��`�իq��2�z��|Ii�w�a��sP7j"�S�t��j��V���6hd�W߰v8�,��W���G��Y|�c͑Z�L_�J�buS���KA/�cD����L����f`up���W���#�F����j蛵��
�l&�����
?"(Y:[��e ���ۈ;->�՜����ה��U_U7��Mi�����M}�S�f����~;�:,�������+�@	%g��cpY&��Ӭ�l&��!ԹϪ�E�bx�6�i(�R��eg����kL�"@����1_��u7��kmhb��(d���rY=�|0�js�����__�:y�������>?��+��"\��i/;��G��w������Ȟ����(��&o��+23�j����T#
6�\67�s�X��g�m6��<\#�	�r�3�
\l��[a@�A�=R��Tm�?�:h�æ�5�c:m�ݧ�q<�Iwvd
��h��x�����G�Ѩ���#�i2f*sU�^'�S��Ӓ�k8�a���<8{l�1�P>gy�N��@��z���
R��ft��S�d=�{6�ň�{�,�qo]l��k��$��!d��WL��R)����m�r����7�"n�hc�BRn?��<�d��Q~*̓�k�@k��<x¾��H�9M�c�5z0cy�(�V���&�9�vs$����h�d�=B���ث&���M��#���\U1:X����Zm'����v����6&nL{Y>��^�I2jY�&�[�¡�k��?�@;5
*�5�>;��8*m�79X��u��,T���,���uљd˦bGZv���n��չ��+Ѭd���TP@�\��@aF����_veu�L�#��x{�/&
�ˮRK܇�����{�-d��rsQ�&6����ؘ����ꞠgV��������Dr_:�2`W���~P溕`(��4)e:ٯ \R����S���9��H�O˴�@�:l��
h>�GƉ�pٙ�4f�]�O�7(7Q+O�����r�o�����X���{�\~�
�0�P)T��T8/%�F�L��>�ꪍe��A՚1�g��H��7D|z�X=gA�N�0_&md>�>���0���uӏ�n	�&Qn킧��4����h�ӌ^`�4T�ŧ��m�}���\��L�E���3s}���M��t�j%�I"4@��g�� ��R/y�}C���o��y$N5C���e@[Y��z�~�b�����mQ���)��Q��^(h����ͦ١�����n��,��G��8�&a�2�1ev����ɘG��Y���gH�q�����X	ޱ��m�)+px��ۉ�m����NSO>B����C�<�P����c0p��<L(�[����$��^����on!�Dˬ�b��q0�O7I03�tN�?�<ŸN�h�nǾ:��G�l
u&p�@����l�n�զL�1�aG��Q�/���Uw0���?+
���5�����΍�;ۮ�-�CUɸ����tf�2�������������b$ņ�n�MY_W�C�.3d�u��0^����&�
��uG^��鬴��ٍ��+�mC[L�ڂ����\dD��ҪP�V�03~L�D���q���A��1˗��CG��X8is����(z:��[gHgf&$�a����.�qCXl��:�)P&�����ӄ�	�矫ud��L=g�rK�����Dq�vcAJ�����T>��z
�)GI�ā�c�{�}&}��
�5��W̵�n���h��>�����S��ǜ$��1���8��A�%ղ�C�M��_�}��՛�ワ"��ԓT�}!�.��ܝ���X^z�av��h�t_O5�9|����? ��qN>��\Vd��a���
��Hנ��+�b��W�z�Q�!�����&3������!͜d�dc�]f�v�.�<��P΀�܍r���@�o`�7��l�&7��?b<�/Vp+䉶w��gc�?�f/J�~j��_�I`����TDu�`02��b���Ht������A�|��?M��ܻ�5P������%�v��c�s�l�8�w'`�i��	�Z�
���o �0���6蠥i�G�x�E��9aԷf�z�Q�����<�[���4�Q����b��F�	��q|���e
��3I{�<��ᇝ?��`���f�� �4~x�x��c̭�C�#g<A�]<�Vu2_���fO1���L���%�T�b�Vv�A�gٛU���^��m}ʋ��x3[\6(h����jm8C�t9[d(8���[8�Y��~�/d��T�e��p[�-㖀��&c�t�y�����{�Kt�<kn0�>����[��(����h�G�q���� �){D�6��72��Xֲq�W�jnLh]..k25C��;���c'�r��1�j�A��XBfe�(�N�V���r6g�l)2h�Nf�ґ��?bvl�M4xL���yi������?!��E->-���m���¤��(�w���`��Խp�$��,|�
H���:1��<�������N^?�,bU�'G��@������sE&;�c��A�,��������~���m� ����2�\��{��ڢJ�q�?����b����4qQ1/p|H�.o@�*�Ga�[��!<7�����n�ƺ��-��8�F/-�M��=G��>�( ���ߌe�|��?�')N���eXC���A��1��d��_Afi�ts-�J�)߬Es���8��[�{�	�D*:mIa�l���9�ÐtF��Y�Tr<�r˅m{ՠeʮ6*ׂ-cW����\��N���q�#��ﺪ`im*����86�h���¿�l»�I�
�(#VA`�LM�����KDR�8I�mC�^6��f�����X�/� }I��������D9[�Qg7�[��$��L��^K��8zw|�.{����g@���0�y;���IXt��D�J=K�f���%��2���<���Ǯ��4
r@��aچ!r�~ù��~}��W�_$�z�.�[��'F�_8�_��(VN�G"n��Ʒ,e�~eS\!�=6�~��d�a7�����!g�0;�����܀�?��
6Xj2Ⱬ�	:��#K��h�;��s/���%/؈�)%r��j��&jHQlo �TE��wp,��_��0:����;(�~?�K0��L�yZ)�7�5�NQ��}��C$H��]J�T���V�R�T�x���L�����9��T�OG�S��kC�'�Y�ޅ���w��XJa��Bb����m�\���� �rC�r�I/�=l��˪2�v��(��߼��K����f�0�����?*�Ѧ�pPD��^��t������Jd�\�����6�������)�IX���_6��H1\ŶJ٣s3�iҧ9����^�㚲Z�v�`��EQZ,J�T���?�pr��H���?��v�Ǧ��#�ɕ-&���y��ǿ�[���O�O=�!
�s���V�}4�]�`�:��!�0zp�ѝ�3u�9`���߄�g�9�
��ʴ���\��<�|q_�c��(V�$ZD�)*�x)��$�N�M����F
�A��2�p��I1����9�re���O3�[c1n�+u�mP� =�t�c�7t��E"��<���c�z�����M�N�p��(��ZF��M@2t$�����~ڎ�����^��}l��Eq!.��4�"
�&�఍M��_P�9|�Z��˭�gF�aK9aJ���5�I�[e�l��K�iլ�:�kMN�sX��[� ^5�h�X�C�܎�z���3
�|gl�#�� 0���O"n�o5q"�i%v�q~�
jHG1������R�a�7�0����"w�w����!co;�SP��(W`�Z���1��7�`7�q�.7���׽H̤��l������̗E<���0 �vxm�c�/�ĺ�8V�zMy�Gj�p^a���&����j
�<��T��9��Qٳ}ll(���*��47p
���9f�TCѹ�3ɭ�h��:Չǣ/s��&�}HQ�S�4%���ns�C�:�	���G8���$8�
^��eY�?g�xc�.l�0H`��j�}�=[�;�G_�H�i1\�e�p��O�4�<���e'�>>Ww��;}�>"��F��c��!Xi\җ�%�A,��@�gL����n�Y���'�s9�r�e�ߡw�d7���7�ATq�|��Hn�8�jW,�پWi�!SV���K���>f���H{[$���1/Bi�)�"��B����N��U���z�T3���
�2�)F�R+ݓBq.�<�ش�oah�˲S*=�8�V���x�4�œ�]�"�#�������m��	��{N��<�(~�Wb��B��Bf�cVT;�iH�l�������l|�pc�����Ŧ6�a-+rܠ�k�\C&�sb����PV�Ꚅ4�3�ސ�e�e]���1i��
��з��Nj���i����瀀��y�n�GZ���bG )�N^���V��(��
^��XQ~����Dc>U���2�e�\R��#U��a��p���
�
 ������31�d��/�Q���bM-�s�%���p2x�]3_.z�\�S��Y���|(�^�
&��{T���/��)��=�.��rz�z:~���TR m�3[ ���*�-�0r����h=�*]y^�&��}א���@I1���YU����۔�S��k��W��e�Mܡ��3
ԇ�.TƲ��c��aZ���6���
N�P>�_t�^���$��w�S���z��;��
o�>��"�{ʊ�>����C�,�J�s+[o��2vl�K�1 -�$M'ߓxX�`b�3���� +�uA�{����C�8)0���V���\�kV8rм�w5��G'��T-s.��M�kdd4-�
���R���`/�Gy�R�jO>�ꀌ3����]�,+�>3F�G�4���nԾ��|A{�Fל<���jS���.�ŭ�J)��qæzYX�o8�=Ƥ0�#���Uv
z����S����5K[8�@�����rn&=�f�y�_l�b�m����ᡣ%������@�6T@0	�xf����s���C�n2虶ۢ]�<3���h�Dz�S8���݆
P!���ٙ���rWmK,���{����d'Ue��/��ߡ�w}H}���a�u��;|��g�j�: �·�Ұ��x�bRs�A&�Dm+�`����o?���6�C��8���z��$�|�w��p&�U!f[��c �_��K#*r�0���eeK]�~3֡�v1c�q�z$���h�)�L���|�t��h�DZ��ܱ,͍�~��ȴ�ŶP�k��oo�7��!:0Do�OcFɥY�f8-�]��)	SL�KkBFGfD|�O��)9��7SL�[�-���]İ���U�a]vX&J���~�.��hަ^�p��=�g��!�yғi6��C�"����xK[��>]\B�q��_�:���k��oQf?ST�ʜ�Eܫ�Yа�Ȩ���F�
S�h�[,���b]n��73�=�4oӰՇ*j��
[�\��VTtY���SG\�A�����U/�q�>�}��P�?Y����6�Q�,�e�j˺��!���{�͑�7��D"�)Ea�)��I��$
u��5CKU~����Q���m(9���32^�d����"?_�1�ʳ�-�^G��(x��<+�sD���վ�����Ys��9,G�ʾѳG����5f`�b���9lM���,?9(�M���7h��YQZ�Us:멗={o��;V� ���@J-���_��.R2Hs�q��@"�;�)l�Oy��)��#f�5��#��������+P��&n0�V�Y0�M�^R8�
�.��A�u������$�69ݗ�Y���I��`�u�O2r5�|���w�E'��Q�a�x���̙�S��ڟ�{}Ͽ��4{����n�jh�vd?�[���O��^Ĭk�5���$ͻ�̇��R�U$̤O��T5�ʱFV�%�`	b݃��
F�u�.T�PF���躧�P�$��4�j�3��t��<9Y��U/��&���
�ɹ���� |A���n�R������T�Mw����N8������jV�Hto�C��┐wA1Dw���'�;7�
�DQw��-���) lz_ҧڛ	6l8�3��TM����)�~��7��C�"�y��m&m<����O�?fﮆOsj@�U��
���������\�;����o7�龝�����4Eh����;њ��t8��>7�Pk��g����CH@�n	���K3��Q+&@��vר�'��G����i�;HY�TQ�e��c�ݩ��R��ڙ)-���5%��DNCt��M����z�/*��!�b�t�{����86�Tf�o)����ȡ�}�0�o�A��d�Z���[ߏ�9C���|���2�2E����wќ�?�W^�z��>�G�6�k�p�(�Ra��<�M��)H9�R�òp��%OW���h6З��l�F4)@���!!Kj��Ѣ��T�<�i;��W�e�="(�3�'�
��j!��^Q�����g�+b`��O,h�G��
�猊��zI�n#Y��l2g/�B�֠i
e��oW�h`Fuh&v�J��-P�d�x_3���=˞��	�7mv5ͮQy�،���t`��ٍY5�
���3��F�c^��������ɼ��Vxͮ'��^i�A���j7���팜����f�X�:�e�p�.S�z-e�@�s�C0h�M۶�{=�?$�=���P���=#��&�J�C�����28�%C1�8�%-���;37�/E�R!=xz"|����~�hu<���9�C?�t2jtYJ�Z��ϐ ����ńm�u�oΥM��.I+�{��I�Ex٦c�aG��YeJ���OC�;�Z��nՆR�a��U�l�����'�p��y�.�-$P�"�.�y$B�fp���f�IZ�iyz
�L-:K �O��)�D��q"sZ=)C�:@�iw�g�H<"8{�h�t��K�&�\����xB������*Ek��Ξ���;ݔ�X7��n�$=���mmȴ4�@Jo�T�|ɓA 
�LRX��K9~qZ�X	�o��o_�ywr8p������2t�6��I�lTl�RzB��:{�,0'0�l^WN^�gv=0<>�J���vy�h3��>޸�h�^M��o��X/CT�m�I�9�M�;L�?R�As>�S@X����P³8�h��@/����u��DL/`m�6��N��!�[Қ��ȍ_\]�SnVa�����q
e�q���)�]��R�W�m���Ӫ�A!���rS�n�,_@�h&4.N�j������CG�fl��o;�zǶӁ�����&��I,EQ0��mH���{t�x|����U���̆C�
[)*ȳB�'��J,<z���5uo,;,��
�uWp��myw�;�40('�w�M��I�5G|�)b��t�	�.��=M{�}�M�J���b��2�K�)pڧ�����-N2O�?G��P|��@�uv�?V�XI�lGWv��ό�
�lx�Yt�2i��i��|�w��9F�K�&����d���$�@��-��@C���W�1�`�J�����v>g�8��u�*[�&vvH�9�J�])������JO�Bf�՘��f$�z4s���Ü$BD_�39�Z@��1�����̀����/���M���/��ʩ3��p���D�W
%N�N4�g�7u:UUT��Тz]y��4r�7̇5G��b���Bo��^!��zתh�X��.-�)�L8��������|�X��;�l�MF��X-G���j{�[�+�YO�D�mW%�"�Æ;�������6Y�*�]&|BQ��Зk��ӏ#�42�8�+���R�
���	G�[�8��(z��Sw�y�&�����fm�{�\��Y
iF^It�Sb�ן�Z�UE
r�����6�C��qƺG�Q����$����rV�kR%OT)��hC�2
@���s~��;��r��]��iD��xv.�B$�wׄ㎻�,,��s�ͤs���5D���A���`3�����O�x���ީ�#79�	>�9������1u0ݶ�������$�7z�����u:
���<�ޓ�(��Z#粢s+c��f?O~ cZ���Dn�I�D�+r:3O²��Ϟ�D���8{�ye3�Y���.(�����x�K}������8iR�zj�2��z��լ�R�{j]bٽ����{a�_�=R�F"�>>q.8�<m�j����YF��6�8
��j���\?a~T�E����O��u�N��dz~Ú8�W_1��g�87�� �gcJ�{t?:q�4�;UP�AGL�Ľ�g�hpeZ��CH���Ҡ���6���7�uiz��ɨZQ9L/�tn��4N���d��!��<tI:�Ө=�)y��ϩ�_5��2^���DN��<
���&{�gn��ry��˻��5
�*�xm�`���L34�lSUl=��|*��9�oQ�*:c\�%n�1�S,�L���u#��n$�$[�($�8<����J}�B$��yZj����d��p�|$�����H��PQ*
E�]� Ҟ�xG�ӂ���j(���D��;�9[�^2�m�!1vOA1A��u�Q1G�k�,��M�Ȱ�o�Y��ߊ5���+�Q��F�#�.eŭ��}\�}Y}(v-)��k�s�5�˦󊘇o5�CY��	
հǣ'so��=Z�R	��d�zo0���
�~��)� �ԢC�
B��D�d�T�9���~��N��:�z[��!����^�4kW��j��4�cQ̩�v��ܣh�D���Z隰9qL_�.��ZچÇѯ����E.8"���/�=��]%��އ�t�B�tf1�V_��fS�Ew��Y��\©���-X��B�p�жx����{΅[C�8f����_�	�%�X+/כh5�Y�Rb��ϸ$ݬ�N>��ê�w1J�fWݮ���GYR�Kr� ���c��:�ލ��՛�xā��X�?���t��?�3�{�.�T=��
v?;����-����
&��VG.�ϑ��\��8��MME�x�9欁�\*;,�`yG��7��p0P��
rpk�y����OG�Hc#k�N�i����&P�ꮙ,<0��lw���1�
I��$�tD�:V�v�xf��R�������4��
�����!1��NpDO��!'0D|�3N��O��e
�)��{��;��Br�"*���z	�r����<�E���ŷ*l/��w�	�o�;5�վ��F��JR3��Cld�	�5jD��EI����S�w~�����'��7���/'��d��e�PƊsΥ���7FS5?]�m7_6�!�D��<�_�kl��ծC���$P�eX��u�G���U����l���J<���N3#-=��-��'�	<47��������
)�t�u6wX�?F�o�J�a�;g�K���.;�6�͎�g����j-^�I������y�Uؘ���dc�KfKK#;(Y�u�>��U���Wwz�ɞ�Ͷ\�*�BE	�
���&E&�@����4��$��UTQ
�#�=�ݻ�4���|��S��;�iU�`�j�^�<��h9�z��^gY��g�5�#�����
�
<"f�9	IP�pS����f;˻	�+[;l�&MR���34�=�>�W{w�Ը,69��u�h�3�iL�ϭ�}���l�3=���(a?��e�Ŵ�
��n���w�+|�D��p��=I��|��#�_�a-�E�7;O�-LA�;R�e�(�#�/����M�|���t����jWuyX�
���(R~s��O�t�ƭF2�K)��r��Ǐ'h��͟���]y�����LI����P(�����ITG�C��>;d��mo���)��Q�8���5�4I ���M���<�Ϗ�x��W�d��x�
�5��'`彔T�)��=���ն[�F]�Zb	�� ���X�hm�X��[,d�N0^V�/5�C[5�Fsz}�Ҫ��&CmOǸ,��V�+E�FQ,�Ԫ��X�&��`i�Z����²\��";ý)�p�-v��tr/�۝u}�sf�d�B�,��㞂�F�/�|(���䆐��lp7�.�<��������N
S"��{���a8����hY��!2�����EDe���#��x�¼��o�wI>
x����N�mH�w�$�XH�D�oT�(fZ7��Q
�&.8���N�׊���B�DtB��8T��Vn�k9���*���`��jr��L����`o�����i��*0m�-����]�T�Zâ��8���>���M������aHU��q����F��d�Y�ӏx��i��O�9.L��p���G�4��'����
��
҈FA�z9���w.����c8vC����e{S���1V�������v�e��Y{���T�N�2{��*箃�����H}���Ҽ)@�3d!ڒ}�T��WU�o����>��Sk��9f�dnG<6ƀ��B�bC���믏Ǒ��`�m�f�6A�R�m�����_�t��{:�C|�RdE&�
���7�D}��]d��W���G�ڛc���e:���ր#�?>�_�ǯ����⛓����w��N�m;C7�*��B%�k��^�X3p���B�H�i�ӗt6�>&DB~�K��^���`9�eD��\Eٸkɏ4�."�lԬ����]U���{gW�F�}�;Rkb�x�)oѰ�x��C���[�:[��T��1�AܜI�&�L1X�*x�#��rUj�y*mtPa�漌.ʅ�>Ⱦ���!�I�p�.
�$]3�2(vdѦ�q�f��ˋ
jQݻn*zg۬��HYoQC���RL(�G7��v^\X`̜:� �9v>�$���Ԋ�4��r�ŷ�'J�>���H��o���S�l���D�.F���@lgz���F�[Q%�3���N:{ <�<���'�'
�N��$X�Nޕ���'&A�q�Vt����62L܁L�%�tT��R��v���yA��������F\���p�a	hBK%>$˼8�,�V��1�йG1�������%%�L�ks�}���L ����}��{�.�߳'O�"��J��^up�s4��܁�e���>�ˋ)zk�*k�^�ux�[�ba�G�^�5���R.1���*����O�~��/�����~�c�\Uӣi�,e�-^�}"�գ��������i��~u�z��m~�w��4��.2��EU;[΁��h�Z���/�c���,8���Sg�1�3”n5�vTi��|$�щ��b7�2�R��ɸP�0�<�сe��T��~�� %��U�Tt(󺙟P���Eo��d�v'��?��B
�eX>����Qg�25��&10P]�{���/��ֳ*/9~�)�*�T�f�Gdbu�!�lj0�#/�+je�H>~����^��uPS�������ʧO޽O������0*Ղ���M?��9���ȁd�A�Uo����z�b"n���	����/	vRxc��J&<4�K�Y�_"Y�9ojp>��A����{��ؼxIV��>y�j�Q���mUd.��&�
���ބ0?����S��Q�Ԝ�{r�8`�}��W�$��TW>a�Z��G�s�ԧ���4!��\����Md���u_v�R<n�:F�K���w8ġ�VFi���$�}o��@e�����G��̒M�dB'l�&T?xi�4	�?��@��V��'�}}�u�wT���E{��/t�<�X�]���/u>�.Wa=�:>W��H���d���H7��kks_�O��/�f/
��+�r�	�E��ƣ�1#�^����E���"�RC	�PI5��qGfn�{���HbM�ȧ�k�g��k��v�&'Ŕ�G�l�8�٪'mw�a�r�*��+o
��A��*��ne�N��ZP<�_Ɂ�^#!¼AZ�<���y���;��;I+�O��z�hB�4km�V%
�:���e�)���Mjp��CK?)�͇F	7軁�DT��{.�Wں�쐾qq�厳:TB$jh�ܲHֱ�,&��(��gy:�p߼S�;SsXq��s�H�9�k�)��҈8F��*�qW��BR�M5n+!��5����%�+�Z$�B�K���8'��R
��Y���-�7��ev�	j�PI�O�Ż�$W�ī=t0��ZyUt��˩��z�T���4ʈ@@����h��}l[Iq�]BR�J��O�}a��]>Ń���ء�Կ�A��p��N�o��K��$
[��_SG5�#������9�d ��L��*����^���s�sT3n��o�\��Wk��˪����B/b��g��<�#�4�?_.�����]Z^ųzjl�ZB�}j;q��lL���)^�i�^Y�X4�
+P���7����ȠB��f\��|<�U*l*���@�����#hütNU
>�?���J�����u �.&-j�&������f� �d�
s� ��d�����>�MW����,�Y8E�����X]�z�B�b�f�	߳a�G�ً�ґ'b����|Z�6��w�|yN���s[����]�]�F����}��X��mE�9�.�
��z��0�!Qd��bE~MX@���X���%��zf�i��V��F�i�	��w�T��Va�I������zƈY3��{��
L�-�څ��w\`��s�7���m�m�s��`��#�c�w��R�3~�/g�����7o޽~��Iq�ד�|��ŗ�^��7��VތI�\1��h�Bd�W�� $#�q������b��	��0�d��0�x��u�i$W������<Y�7�*�@��U��I�6����ƃ�ޒ��O�O�1��O�O(x�M��i��B0������z�3�r9Vw�\1S4��s����:u)Rq�xo*�Y?�M����`r�]��۷��.����]]O����Z�o�M�������0�8�G1��g�J<Rݣ�[���
�s���&%���'Y>�N���1���JC���*����E��+*��vF���#@�gt��oT�z��>e,�6��x�W�*&W�VLF���\�d�4��m���0�
�*?
J�r�Z$���<p��Y����l^�,��pq)o�LzRN�P��,�p��F"�0E[����٨���Zݲ���W�����V�!`*y�d��"E��:oV�*mv]/8�A9Ͼd�&[e&%��.o9����i'hQ�Aw��F��u��9�H���:q��Z��d5S���#��{a�=Z�e��ݎkP�^R��L"�9&6D|�,����X��2&PbJ�YU縕@���<���ث�^�R!Po}x
���<;ƭ�`pg��aH;�d�qbK�B�}���"�8وq�M�_�'���̫m&��a�q�}Wu��S(3�zW�L�f���%i疘�q�t�;�+�#H�0iqN���ؑZT�5ov�ƔOgcD"`P��8�l�ᦔ�u3���M*4��4m疉`w(v����Y���k�
#�u�Cz%��^Sg��j圩�#�˔��L��G0�ME�@M*'����R2S��2��M��,���ZNMBf��[ѵ&G�F�J�{��0uT�5�xn$H�&��pWᒹ��pys��T*^�a���Y�6�{��%�/]�r�떗a�6�Gn���x�Oq$�fG��nm���9$�.36����[fr����yb��}W��Zb�5;ycH�Y�����֨�7���o0�TBT���ѿln(�IKQ���������cx~oi�v��,����%��O�SL����m�B����W�¢"9� �����a	�k�iuǙ�q���h/
���K�;3�*�B�:2BЎ���'	�yV-ݱ�n -�3n�̵).����	ܽA�r1fw!� ��� x8���-M�.a�+L-H�·�G��ŻƳ�d݂���<��yJ�cB���i#��:4�M�#f��
��ozK1n����ؠVvt�	8��5��ˣ�O��@~^u��U�d�Y^ί�]��e��/��钮]��W��s�V�H�ъ�!I��������:+���24�����r/�Pr9�<rn�mt�%Ks�mY�o��=��Z4�!���h0��((D�"	(��o-;4΀�m-2(��8}D����>�u�,:��4��tv�K_{�Q\�&�V������Fu��N��(�燭�l���i2'���*�F79��p��e��D :N����������R�KA�9�W�8���(OĔ9)X��ť:�&��wu�E�O��Q��'�+�B3@�~��y�V�)UB�@�~���^7u4�*1e�F�ω<I�?:�7M��,;���
O����'��!���a���dzljD8��<"x_�E�C*��+��{���j�Hg�c^v+���x�K�?\-�A�vA8IHR$���o��q��k��oU����w_m]6���i�O20ØW���*pxa�Q��t��H�{���$�k�*�-b��*8\�{�qi#ϸ��F�4���A�_U�xv�$��5T	�2K��X��+8.;d1<p5�=�bδ ���
T����!y��YaE���rvbZƔ+�:��#-�Y�����-�`�ks#�1�˒��
(9eT餀sp��.I
2TXK�e��/�e��BX�n��g�,.m"���f����Q:��象1������5�<E��n�l�BZ<v�Z�U�iB���">�p0q�u�bϾ��7����l���ŷ��3�曭v9
�{�A=u�z�F�I��=y�����$C��ϺIy^����(W#@ݩ0�����
=J 2�B�|w�PCjF�q#�Z��'n��F&�c�?2����$9��UX��>����d]mM�ڡ�h��f�x0V�ƽ�m�I��SV�Q.)����$�0����������,'Λ���'�YΪP'k�Y1g^�m�Tݴz3;T��z@��oc�Z\��:U*�$I#/�qb��w{r�Q��W˫����Xf���.Y�&�K[���[�Vqh6��K����V_�Q�����gMi�`�.�yʺR��V�q��s&�8;�ԉ(`qֲc�vzWb@�r��Ž�-Ԝ�a�:���E���V��fb��S�fY��"w�FW%��7f��T�ga3���0qw���C���|�]���ç���G�!�0�~���Ϟ>N��g���n�^����_l#`>eG���[���~6������M���-`�F:�q0��y�������2}(>����g��Ŕʌ:"��*<%^�$`<�^�⍙X[�jp�n�™�'�+7�������7��h+���6Z�mm��]�Kt[t������|AOL_X�~���c
����Vd+<���|��Y�"M���J�p��a��E�%�X-�_"V������$-٢FsLUh��QYG��,wt�R����:�-ټ���_����r�Ua�5/�0�Go~cvToh�%�@)
���bL>n������D5��Jy����w?C�z�
{�?^M�2Hp�2����t��$%e����r�H����.(�y���u��/�Y�G���٤�\�F��������7���i�jV{2}0��G�$�_�W��pC��v���L�9
<�q��';>�p~^/j��)P���O$̘����x����)�ʡjuQ��'r<5��܄s<�6 6�1��O��!i��~�(G$�|[H�����K���s�sc���j9G^���3��Ԍ^v�r��6^^6��m�0c�
�	�������$�Ib��[��e=���n��<��.
����cr˵�.sW�Љ��c��5�F��R ��,;λ�,�v�2;��LN�H�͗=�9��;H��Ĥ��ް�=���O���E�� η.��_��'�</_,NPsє�d�G��cY�M_�}�n�������U����ȇZ��'���H�߂؉vr�ǟZ��8�{���D��O�%B�O��[.�D}�qc4���M�U�`%��]ր #n(�%��ó�?��E�h��+��h�g7�xlD��"�ɮ�Eo�3��R���	'@����p�L�
�+���'	�D�:����L,�2r�d8x�c���lN��r��"�����[�C3f�0Q�^r,:�d�'m���Kb=��5pS����?�dh�u*`��?����T�r8�'�FRG�^a�x|ĺa�|݂x.��
�lSIn�"j�o4�uK�f�Q�BDM����A��I*2�����g�C2{����}�/_��s���Q�~@��i�(&�>����	���kV���!|��>VA٢f��%D)��%��$I:ʣl����^pB��H1j����nV���2`���ҕ�L.�U�gp�ۢp�9�)E���# ��_H7�
�ȋ��_�|����WϿy���� L�����-k�3��C�ill��z!ű���
K�(*^*)9�Α�;�Dӗz��,N����zj5��
���F�ޅ~ٛs	�%h��(^�5�7�s�b�]
75O���fPwl�~��@j~�;D��;��H1��=0ç����b��������!�A�w�;Ce����7��H.d�0�M�G�p���D�	W�d>6�79����>�82捁�PM�2L�Q��A��I։{=� ve���\�B�M��g��SQ��S�w 30�G�*�b�ti{5<]�)��Tl`X���G�~�)�r�ş`Q�2����m=�_��n�?!vo<ƕex(i����q]��+��c�m��C�>;���0`Zo�IZ1�7�R��m���_߼~G�ƣ�Ը��;�O�A��p4��w.�@?[���g�r
O�<��
�����j�|����������b�Z��v�8�O�M$���]l�ZaǺC2��)��g�;ҡH����t��$�ri"aifM}�u�9%.3Al��ť(@�3{ǛE��H�^%��D~���V���mS�h�#PY�M��-�t_�j�t��*^I�[j�R���O�:����W��u�y�����6��Ӈ9�U�D����	@I$*zP��Ǯ�~�}t��ߑ%����Ɲ-[]��+3�=��8m(�s�LpfX����W_���׋��2�s/5`Q�ʊ���C��Ԏ'lH+7�h#%˫�^r-d�Q!�lxZ00��yGGAF�׉j�4M5�hz]�g�ln�2��fq6^��i�󅂚�@�걉��R���±�e���d[r��Aqfũz��q�� �Wc�*����G䉀�(�¢���tގ����PE��
1�?��ۛ�N�Z��W�������ٟ�\�T*i����Y�`b��=�/U�`>
	,�\���#Nk%�Q��>h
&Y��������ц�e�C>�8|7��c�J/�(}.��-��>�X*w�~�84��-5)\���'s��(f`в��\f����عG�(�hn����1�}rG�F�>���_�Z���ܵS�>_U����ǩ���W�RLJ�0w���e
�iO09F�3'��r����8�p�ۚ�e<��8f�"�(!0
��b.-�x��Ii<BWY#���D�0<��L���,��	��mU�50��#��O�4&��h�53Y�a���n�Q2��<ILԆ3���9���<g�ng䡩:Đ���C�Hv��@ҋB�G���Pɯ��e�s����'Z��gHM�:��oػ��c|��1���aN^�S��(x�UhI�[���ߏ�W�0S�	�D+�g�jG�U>z�{�:�DХ��:�L]�0S�U�f�t��p��}p��G(T�ڑ���+z�|!���3<�;��'�:�w��aF[�Ґ
R�vr=���R��:O����rl�7:}CZ�8�,���)s�j9ɠ�y\5z���%��ٝ���qF,�h|js
H�G
���~�3�I�YZ3,U�!�Ԩrr�Onj�(�(�z�A�Bs��/s�O)��<R���Eh��B���1#���g�l��7�������e��JB����<�ɩ0Q�_�*w��Z~�)a�����>���-��z�)Vp%�@ŷ�s�}ׯR���h,x<���R���Tg�۞)U+3�q�L�)�����K��cGb�?��{E,����s�t:��J�y7��g�k�w!����"a�#���`�&��m�;�#���ݏb֊MT�=��o<�ž�-H�M�4���F'C�P�/kG�
���
�Yȿ��{C����5,���#v^�Kt�34O�È~����⺐t�~�}�tߴq��{+�;҈���僕7`��>,��q�l2�4���%��W<n�6�	�Ԡ�IO�L���X��mu�w�!�
H����~��$Ͷ�s=*�e �Y�oW�ݟHrA�%�nl>.���Lͯ����e��nQn�J-&h��O�^�=~�D%�B�u�;)��~w�v��Co-S��sFCXu�����Ou���1p?qȍ�]�����N�zC��
{�0�:�n�}h�y�^�e�6lG��a�JZ��Z�` �v�HLd	h�(Q��.��O��\��Q|�D�){M	�=	���[��SZ�����kL-�]7����)�D��Jӷ�F�4	8�2i�񟫫�FQ�X�^�X���7E׋{���_|g�ޥ��c���g]��7"W�,.�J�ޒ��8�Ɣ�$-�ٮ7X�}���5���쬎���@4��s�Y�U�co>"n��pQ��D�@]�
$_v��r���84�smB#��CjJ�D*쎱���M���1�d���C0'U�jrT���>咕b�_�V��Ϲ��Ăk�E�m�n���J)B%���R�̗����4���.|Os�ٺOrN��߯L0��O,�h�ח��	�q� `��t�Ū�8]��UA��ښ*{��S�$����]�sbx��Ug���ԤN׵/��S.�,άl׿�l4@��5�-�3�cYf�<�S�����7�O�.F�l�ƁK��O5$ㇽ�y@��Ɇ�w�!��Q���z5�Fj�H���?��f<���.���]�mU�OlMJr����\}?r�Ye����j>Ȃ0�\p-�b�.�+�S�Zrg󯏛�O��c�&��@D"����רӜ�
�
B��a"�����ǿ��?6=.�v��g}���g��sZݩ�sL�^
N~bQ&����-��P@1ɇ��o����H5f�\D@�PKk�mW#�l2�#�y$setuptools/command/editable_wheel.py�=kw�ƕ�+���.�N�M���*���Y?t"��E�$H"%�Z����y�,'�z�	�ܹs��}�p0콮��IT�nWI��f7#���4��8˒9|O�L����'�.6�,Qe<�����O�iO�d/��s�6�)�a�7IUV	�w����j�f�f��K�N�x7�P�I��N�ԟ��"T?&eϒzo�N�M�[5On��(�ý�0Ty�$GG{J��y��
�Nf�8O�u��U�,�-<ʛ���(���t]f	�Tq=�Z�5…F3M�:)�
>��<��YST[l��5�L7i6�LT��զ��a٬�"��,�L��A�D�Ns�{V���FZs�z3[��ժJIU1!�<�ܥY�KB�6~��
3�#x3��{X�=�yQ5*+�KX�����*џ�զI3�mk�4��V^?�����{��X��d�T龛8���I�Y�7'�=K@_��e	���K�(pq�*Ns~�,�u_�E��K"���H�/��&��ۖȊ�*@ڪ��>;�^�p�N?���Ig
:l�e�o���Kki�>..�X"��ؔ��ŶL�K�rh4��1b�޴_�5�e��ͫ7	�v#�O�#lRT�H��:�K�H-��!��:�/�|�k�9�e]�7Iez.��<�J�
~��o�s�N7�70�§8�lE�I$��_w1?ჷ�@=i�Ϙ����S
@�4_껱
��o�D�Ϫ�)fE��d�`�}"`�$G�uO�:q:�әnr��k��i�!��1/�%�aD\{/�pD0��#5-6�|L=�{�Z��c�}�eҼ�gA�jG0��,��ZE'"���$��&T@9�ϊ�NQ�e q�ZC��{L�$OAZNT�'�$�jo�b
Mg��e>�$B_�������O�.�c8��3S%��6(
!z��1��!V��m>�7�,l���zS���z��О��f��cB8��x����04��?����Q�ӻ��'�Ё������3*�ŋ�o>�Cl-����z��_�x�*����	TઘӃy�@�	���F�GFx �\
�wj��	��j�~�!���r�'B=1@��7Y�g:E�B��bCw~���m�Q�N�S؆Q�B"NAA�t
yV'�%XN�8K�y���C�.����e�ý.2cX	^��?�^�*	������@����mA�Ng“n'�g�(aD�`�'J�O��|be�$�ڟ�vCSa��ڂ)��ƳYQ�]�	x��$��TѦғG��=��˜��k�=��[�.*�ߋ�Z�.������ٵO�UӔ���#��m�iq�䇸��������ek�9E��u�l�^!~`y�h�b���%�z�/�
}:��pY� `�U�r.�eo�{aE}AV��kh�)a�agn�%�T$�5sv�����4s'#5a�79L������Q��RCiw(�&��*��ͧ��LAG�f刔f 6���ߓ�h-v���3���̰��b,�
�~�T��d��@N��������*%���Ԗ�6���H7䱨r�եa�`����cP��9���hvo�"�Њi�ܱ7@y��
7��x��A+��
8��д���a|�cd٠-#�Y!_C��g�@������D�?��ڍ�_	4�88\�K�tg��*~�)�|/:�^Ԉ�� Ff�آ`̼G��va]͢��=	D)�D݀,�Z�ľtz�����N
��y$\��pԂ6j�Vu+d�_m�PN���F	���� �������$�n�LKP!�Y�`��g�\�u
Vد��.�*q�H�p0�R?�d>��|`^Fz��_#���m���ty�5?���QG�
�b��X;��W�8��� ��|�>����9�;��{t�7��[�1����CMU�7��q�Y�t�:�l�:Ip-��'�Ȩ�*a_�8�u���f�~�!�fGW�l�!�n�A
ݮ�_¡gq�<KfE�,��� �&<ݢo�8�`$�MZ9�Mn�*%��^P4�BI�K��[���\�tv���������N��'�?�xr>0��r���3#OE�!i�-,�pȮXrg�nw��v2:�]�	��2��.�Ǐm8Ӭ�U��lPW"�<ɱ��L���`dU=���l��kƷ���H0��T}���h=�.[�-��A��}rq���x�Prց#�#a�Ȇ8��3�R٬"�ߋ��Y�g����V9�[�E�{�e��Θ�!
o�0`	�30�����������#%u��f��Q�����S[-��h���4����&q}7	���G4>��i�x>NƑA�jس2��Q�(Y.�R�D���s-]J��nY�[�ؿ���b2p��їA/7.
���eVL�������
ɓ;��
 ���ق7�H��Y�z<ۄtG��丈�eI�)
��$��S�Y���|'�_��|���v;FH��#�^YVܢо���#���+�
��D�݈�d��X��q��)�����f��v����Fzy����.��ڠI���踏�,Ko\�Wf!�	���Н
H�rNԮ�f��[���iP������ܳ�U�ٗqBT���s��E�0��.R�g�)��#}E�;���	g��r;"
�ϨP�.@�r�q`PF�>6���`��BϘ��!| �������n� �򖶯j��{�C!6$'�:U&�E0��F�E`�����Z��|�L�sKd3yy'؁�"J��˭#��4�
Z���-�
��Q�����Jt[�~�
R��H������hO�����i�_�Ǒ�&O�T���B�F���ӉЀ̠�S�ݧ���F�(Fۻ�ƌ�~�Oy�ky����\�����*�igKٕ�g�����]H�tTL1K��B�QR��L�m�l��r��`�I������z���m@6)�[F��+�A����yJ'���#v�^��&����v@}�'l�N&^KP�,^jM�6́�5��6�{�:8��rn����01� ���U���c�������#����x"�|/9�Ns22v�����,n�̰,�i��͖�4CL�מ�	�7x̝�O�ְ�|�%��ɴQ.���ݱ��h8R�)]���5���Z���u�k�hIV��,�#=qᱳ�o��(!Y�2t�C�!^^=y�H��7��
7%���tG�!<G���&�0�l9"�.}-o��XN�~-G� ���AŒ>l��uԼ#<}B�ݿ�����
���X����i�XRw�]�n>�bPP=���^��
6G��,JW6]�m����lS7�:�W̙�u�\aQ8��{g�܂�@p�l�i��&����VR����Wi����Mn�c���Y%�0�I�%$���3�?�e]$�`q�ݖ}a�A���mQ]�VZ�C@ɬ��5�t*�Z%��
(:[�M��;�ʀ���C�Z ��9��bl����D������Me�	�n�m�"�ILk������"^��#���S�5aL1��m��7�%<��8�#u�Yb��7���t����٨ 龲J�U4�����ے��P�a�UCuE��t�Z=�t�����2��1�,L��Z���~,	%2�3BW+��)}���{�Q�BN�<��'
v$8$�š�j�0E�qC��?���nA��	'��gU:'1콞��D��F:�暈�kB#�
VPg�W�mO�h�
�&)[��&�(WB���?�)|��'>��x����%�vt�P�"���Ł�|Vl*�V�������#�/��4y-�B�ܛ`zb�	�u�>�)VOt��S��(5)�)q��.㺛�.�D�(#2r��
F7��ik��� %ɵ�*��e�S���7֯��{&�E���Ýd'�q7��X�O)��t^�j����P��K�+obʝ8u�~q x۞��y�)��u��4�V���/*O�\�Ӿ�2�{9�f��&�h.�뇃{3 |��2��L�1��#�W�f{���/.��<K�kױo�t�=U�A�Y,һq?n�iw�H�]'��P���}�>r}4Z��qm�8�9>&��O�O(�eT/�:ڝ���W�WѼl����`�3d_!FO
�b����Ǣ���oFJ�4-��/����܅�N`|�r��Ȋ���*����!.?+����*zD�fԚ���4�zjo��ub-J-oG{Jb!"ք�F�ݑ~AD^x'4��zl{�?t�N�b'�BC��>h�{����+Z	_�;8/��2�a?�T[�p�����y����7�ڻ����[w~����e���e�Ifd��s4���kX��6q�_n�:�11r=�Q�(���2����zs����+�t�)|�K�u]�߉�M[�����K�#�o�v�C�1t��;P'�p���ݑ��lt���ڨ�P��ƪi�,ޢa����-J��uH��n�y��\��.؇A{�!:p����٨>�X����3,j8����j�ծȜ7袠F�(�)W�S^��fn"`WaF�➣�>;s^{u/���qx���h�A�a����XE^���H�x���f�m�G��Uy@���C�ŷttQ��%݅�=���>	#��X���Q$�]�����Nhz�+�e�Ep�H�VLy��]�L��0 o�l���#܆�ߘ�t'I�G
iv���
BP"�Uj�M���J��H�_���lvaJ�_�~���~��s�ʛ���JC�t�_�ב�t�0���RP����`�F�4��o���ԥ�m�b���'8�a�&�A�褥�����ST���<��[.L���>zX�T��f㭇N�lN��J�)�â�����G:�h������~iR����L�N���l���ښK���Rh��e�	X�Hac�КXH�j���z8�B���2����.η��H�H̹$
['q^���j��k�$��Q�횞	N�c�"�
`��:�#aRE.0k��xn-�u*ahG��V=��O�GbO6�$�ZB�1��C�3#���%���<�a+�����==��:A����c��MF���7t.4�I���\
w���Ӓ��2��`���Z�-�9
��e�w���#����[�Oڎ��?�ZZ�(��Ba�U��G�B��-�ˍ� bκ�z��b��1�]ZΡ.�Ӷ�d\P��I9R����蟌�K����L<��h��H��tN�$�����m��eL�+�c1X���K�'��u�N�/��*�W��:���p&� @Ҩ���b?��{p��|�"�C�v���q����Cw�!�PNZ�(��Uq���Pm����r=R7���I�`x�݌�Cgذ,ʀO�C��\��K)U"5���ʯ�`,.��s�0�5A��I������9�g�+O���WsH�*ľtakb���8|KL�t�npN�o;���F�c��`�~��O��~旵S�ǎ�q~�=14C��#�(�_���~{�+矁j3`���OahbuJ��x�O�`^�k��ݩ��9�TT������'�{�8�63��C��|��׹u��y���{�� ��ØMQF.�],��HX��t�$�റ�����>�HvBY�z�1GʋF��+�1˱��%�!�-Ӭ	x�~䗆nE��Jl��:Dž�_�/������&��M�%"�aؚDO��qlļv�w$^�Q8(]�`#��
q���qG��Ŝp��/a�^<
���34���v��}1����7�I)ï�5�d�?�˯�teܟ�&���ts2�Q]�M�9��!�%���T|BYȧftm��"n�kONS���`yW���a2=�S�����=�o�l�v�D<�+]���ʹ(�#�T��M��:�"��@ְ����~��W�c�����˰�k�Q��+~�C��޵po`X������+uܰzbw
�����6����>g�!�Z�Φc!�St@t�!ي��9���
�x>]�Q��?Щ|���)}B��Q��[����)��y�t/�
�y��d��	|s��fBa�
ՠv��V���0w��l���C^�������u:Dm�P�V��E�N��@{̢r��\�&�����6��&�=��ڄ��d&d:�ȯ�[�p�o�m
2w�5�G�x�����ϟ���&3,�e��d_�W>��K�&6|�Î�}�]�P���>L�~0+l���C���-RBv�9b��H����+C�
�o�_�]�c�M��iJc�_
rdAG>l{:���o��Ox�W��֪Ax��O��:�ïqB���b^�}�M���(�Vvi���,�ڐ0n*�����q��oћ馄�5���w��H܎G�:Ƙt&��a+��d�P�m�汾���EN^Fr���a`j腨xTM��,24���"��!ũh�
�:نu��M���Z�݃�M�(�
��]\8;�u�;�����لzrW���kQls!GG��l0a71�����;�A�Ox]�d�2��ij�)OD���5��.�)��<�#��mN����]���>��F�����S�x�4>���
i�^dI��^�E'������>a�0R��x0M7��G
��R���U'��M�l���A��-N[��sc�}B
�YN�����X�⾵�� K)Y̯�&�`���؍�ȶ��k�P�m!�>��`�G@���F����q:[���\6&3ܐ=ق�-�m"�.ԁa���%��W����t��z��?q%�>��:`]�RD������5rqy��6w�����	l=jb�/ْ���K���0�I��}�\H��F�;���H���ϒ:OQ�&׫0kvF�l��8]Aq�8b�
���>N��̙f1:�SQ]��U|`��GɒY�٬"�ɓ:j�R|/�6�a��[>��AFN(�GZx�Y����P��2ROLq���ډx��V�2�\�N�9W.8+;���O���jA�b�o2?6�fF1���s/���6Wr��̷,�lJ���*�#B�]��">��/�¡���b��TT7_���]a,H�%�o��\�9���y����H�[���(�R��lh��*
�e�;l"A.���c<� A��j_��B���s]U@Gdt�FW�p�P$C�����Kt����&��e��l��M���ԼN��bᄂ���"6�gXۗ�(W���ti��G=T��"V����R�Tၟ�����^�ԋ�:x�))��]��X��]���~BG�9�Fv�#���7�˄��%�����%K�n�߳�;�q���ٿU�uٓ,�Di�''�S��†��r0"~z�)?Š9�zǣ��oV�[£�Gڙw�K��B��?Ą�/K��Ԕڡ�z%o�&�|�$�L*T
t.HđO�{<I]ÀT<h{��5�o@���Db�a�iX"J���F��^�DV�������N�D;�L��	�<<@ja��~��V\S`�J��b_wÎ�{t=?�4�wt�]4]�'IX��j�p����P�E�#>��sl�D�Л�ъ=cf̞���0��	L���]��A>Dz�U7a��E�����K�6�h��0/�J[��=Cj�-��L�,W�X���W��s�q�
��z!/q�A�y�A7E�m1�n�:Q�5V}�v0v�3u����F&֞�M�ؖ�m
�n���_�1f�p���6�9���z{[��h��^=H�-̈á!�=����:D���P��
���J��B���ɹG�*�9�$��5E�1GJߐF�:el�;&߱ޘZzL��$�R�VZ��3�1>BL��
O�.��_#�ǰ���f��U<5�����?��˩��9,���/߆
����93������o��F�ҏP�D�@���L�j��O��?����1d��'���Z�����G^|mK|z�Cu�W��;��)��e?�KT�t�4�oOY�#A��[�����7h�`�3������7��B��(ƿ�+��i�\|2�Z�.���S��[y�[����%tw.�	���	�"��"�����2���1j�q�>A�T��ىn��EoO?�9�1�8y���Dj,�_��&}��)���*͝ZzOxaj�M�6=:Սa�Z�d����2���#|O�M(�_�{\{���2�
��|8~r~v���_؝��Ύ/~��D�O~��(�[�;�Gp�"�9Ѫ(��h��#��C�埂����rp��;�����\��\�.ֶ��V��[(�gq�?P�z<T�hpL��5&��{x���]!&f��hl���xH!�e,Q�\�'�`+�{i�$��V�M��@�b١�^���i�]���B$���nhC��}��
��z�K����.�y��kt��c�=��/�ƜM��u�7�s���+^�6�J[��-�{��̹̇�LNI0Pe�c����>Sx��K)�ȁHbel��*Q��Q,;C��F����t���­��/j.�E��d�zdV;��_��R!uqk��,ǎbp���xS��~}z�A��>��G��!!�b�޷��Q�G޹��=�y)�<�!u\{�[��q[O�[�*���m��=1��σ(?UԷ*�=�r��<�Z;5���Х��yS{۠��9�HN[n�6� o�zY�7�����ܛ��3���\;�[���Qg,=J��P���/��C�J�9ŏgad��+�Mܪd�Cզ��s"��{/˸��g9����'ZM&��G:	�d�Z������d(�'��֙��R��x=�Ǫ<R�勫���MO�<�1�9��.M���8����ҿ�f���*����lk��X��&	������/�5Y��Z�DM�t�
v�ۨX��'�M��@�dR��&$���mV����`�2����̸=�+�\!��@ݺ6�T��x
0��b����9�nY��r
V������+���PKk�mW�P�C�hsetuptools/command/egg_info.py�=�wܶ���@֧G��b��]N=���#�5��b'iOV).�]�����M���| rWr���9�`0���l6S�߶}�T*ɛ�&��D��iY����g��z)2Q�����/�:R��`h�d�7�N�H�7u/�^�f���U�lh �諲�|�m�^���_�L��|	ɮk:e�<7���4]�U/�9����Э��렟�R5�#�1�w��Y�iYm뜈g~h�N�Ojg,��.��^ۖ���ySU@U���dL��۪ri��>+�>3=��)p�ۥmS'�˦�3fv�l�@���ú�e�M��ۼ�#dߴv�,�>N������JA��c{���T��riW	��V����1Be+���F.D�uJ� 
Ȼ���j~}�"����rp@h[�ySȔed�a���j,����|��l��Y~��A0��K��uY�$=|5cv����*k9��tycy.[ر
�,�GGG�\���jU�v�͂Sň�T�G�n~�Nų�z���
�Ԁ�n�J������/��"(n��[4�T�6$2����"z���H�5�>�\o���=ਐ	ù�)�r�	Z��d}~�X���u�_����;%�ʪȳ�@D�$8��R� ��*砂*Ո��f�f�f�?�4L��;Qo7Kىf�+�J���:ř��#���HUB�U	Z��/�kX�E~�L���ʔ��2�!�l�70%,��ȯ����HƄ�ōJ�����9O	��K'��؃��6��"�9Nj���H�:,��U�,x.䎄u1O??�n��楎g"gg���&N��#��x���@��C��p%?�pQ�ϐ-o��i��GB��\i�`>�U4�[��&��k,��5��kIcI����h82�S�6yym�Rr�dQ��y0����X}z���c��BX�?��e��8��J߈k���]7f��u�kh\JYÇ��d�2�e	:\�2/�V$�N�	�4�^��b��S`�pD`@��T��:���I��e�PnFnG9:lQ�w����~��Lu�á�����D�=�ĨGYײK�-%,���77e��y��g�4������]<��^��L ��?M!�qs]~�\��iZp�@�P�U�P\��_5[p��!Zp��'�E��?۷Y��|��h�p1�iV��uX4g+ظ�=����=@Dǟ�"h���0�[wͶ]�����IxZ�;��6u�֜z}]��%��*0�z�K�
7�W�+!�I}j�491Ki[9�{��3�Q�5yP�Sk^<9�=Ƴ�ml�0䧧��:�<�Ӱ1���X��0�;0&�G�0a��X�K�<��tO2п���V�
^��7�x��4
0����E�YӁ
�:�vC]bUeku�~��WoϿ:�B�����~��W_��'�2c�����g�t�g�
����@�V�F?�O�5-D�;v<%[7�٪��i�l�C��'k�s�\3�|�l�����Au�$�&�-e
��Ldz��ɂQ�{93?��Eg#@�9�����p$kp�sI���XL��'�gJ�p����*PwŎ�*�q�H�Lb��{�c@��-nq<�&��#eR�fͣ}a}��\2=Z������XB�w�l��$���:�&@�
J1a�T��W�%�%�N�������	�ė�q9�C�q'�㼕�.��:�2���Nt�ښ�z�V�L<Pd.�t{J���<w~&�F��\ڼm0^�(i����
�{�Cz]�{�J@��kb���8@W
Ƥ���e
#�!+�l�B�����Y�#�'"^e7D�j���j�䧁Bf�N�M�o�f�|v�hI�J�tR�I_��&�B�;s_	 �����Ǜ�b6Z��Q,I�0z1&����h�xP���Ҋ���+۞>���1Q�
,[C���#�ms-D$�ِ{�Z�<�]J5����D�̶U
2�Z�R`��l�p0�� ����(���M+b���'O~�䷿�|�����q�V�D�o0d\�0kS�y٣�Q>&�Z�Xܞ#��@��I^m�by�}i�k�F�&���°bvJ�W��������O�C%j�0�,��2���d�
�r����}�$���9n_v͍�S����ߩ\�����&�.WR�v'��3Z�h#�Cڥ�Ƥo��FZ�!XżB�G)���m�9I��+�EI��*������'�2dI��1�
�b��D�{A-0J���id�+0|������0O�<_�(v,u� 6��iK�5{޶;����<L�0��O7rG�����m@�U_�`;�<��ۦFu˲�2�Q��.�MPۥ�?n�*�=~�#��	F�!��y���ҍa���d�	6�|�l}r(e�D��;4����^���o���ŋ�gOF��.`�A,f��r�����Z��Dlض}
�1c���߀����x�l":���*!�;�,Ϸ]�gֳ�H�ĕY��ϯ`�5�s��x'�-.�|5���qRb��=p�u�<v��R��J����C�lwg�ujh@;���!<'P�]�
V��C d��)�ы�@��R����ٱ�Q�?�@.<�a�7�9��	���-Fd�;r�>�`��Gq�cO̿.U��J�N1{l��$�F�����kJMz��4W[�8/�Oű:����ܻ$oĜ�s�>�4Z�
^8�=��.)#C�3e
|�F:&���>�1T�#�?����G�x`�`_"P
�#(��%\k@��'��������O��N���2�?oJgk ���w����ɛ���<���o�ш�n��=C�bb����
���xqf^�*;��
,��z�U�y�
��5�G�\��W�$���Fֶ�t�և@�
"��o���������6�G�Ƶ��8�@�v�I��( �����)��x�圱P�7�n:�fS
X�1&@[L�<��鋔��~C�K���D���H��b�ғ��.�ɱ"	շKٰ�Gk���_��Cc{ו=X�.-d�m=�j�]S�n�� !�\����`? $q����Wf�j�Ԕ�R;�I�!�'Ծ�,H��Ҝ/*ԩ KWW�6!;��J��$ʸ#ﮮp�WW��Ҁ���@WW.A��y�s�PemAg0�I�Zpۺ�\;4��у_9�̔�������`��6M�^g��pm@D�"�F+b�b z��;�Ч=ђ<�lB�9����y�Q���x�kwf3��v��P繫f� y�&��q�{����s>q�&�d���8��.�(�8Ə�ޔ؄��]���<�){l��V�fu
9'A��v���lA���
'� �^�faV�bϥ�1@����ET�%	�Eo�C�1��y0�����Vųm�:�|�`f3�ۥ�j�+4쭬��#�[F>c�@Ǿ�r���a�X7N���Y�}4���F�2�fSĺ�
]�V��D�=�����ƍ�x?
U	���/h��Ѕ�x\nK���.��г�gVt*
��ܔ-֬��͚!ЅY=��1�����}ѕ�=P��*�
�(B��<%Z��@��ɖ������.%�?&�:Йu5�Pî(B������TW��~H=�p��Kp5�HI�y�ݷ�^����L��J�i�n�}�v�:+�l`����^7>s���qxRyvo�΅�d�F�p��昇��U�g���ZO{��A���e��A
=�@�C���>��vv2��~�h�����3��d�fb�����BGRe�(^��8�����]��@$�!�j�Gm\���;�ĭ��v��������$�c�5�RH�=��k����
X�#x@� P�����Ud4(,
�JM	T�usg�oL=xl+�5k!l3't���	�m֕�V���xu��ś�`}�Hӊw�b>?M���q�J�ܮӶͮ�ا��Am[�!z���7��'~p.��Si���b��^~�r��`��,4��zS�?��qcQ�
e�r9`��sh�%С�Gp|�[�۬�y�QF�ވB��.۹``	�Iq
HDJ{[��y�+���"�[���A�u'%�j��_<�V� [0��y0.�,���L�p��H6��Nh3�:�?�����"6
F���jo�)���+:���_�=�^'�5脵�Yu�_�i�zH^�����[�LdoE�~���l��	�k�!���g�|�?�Y��;�t-%�KС+kIE_�\�>~�t�|
���]�8�E�*���	+�Bl�4d�3�*�Y�Fk�O|�L��݃��M�ջ;�ZA��nՃP�d���p�u�shNm�_�x[��v\��y9��մ�x,����p�(�y�ޝ�Y��}8pe8�}P����C��>���1����-�	��c���-K0��G���>Q�Y2��a���>xA��?/Ѝü:ަ�`��?��)m]��I��J��G;�O0��@ON����'�Du�!��x��*A'b'��}��$�*��o�PUW�9�#���Z��Esa��èȔ�,Vq<W�.K�bd�8��ṁi|<���	�pd�^�`�c��wF7���9��Fa �OGM1��� ���֫�u��)m�ұ(���v k�f���x���-'�䦹����8������S��-
��R�����$ ��$�|�	,�āB���nKx�d���C#����.����%ҵ���/�؜��Z���q����(/'�=���J6�T���ᅬ�.J����:|�+��Z���Dhv��ј�w"�=J�({�"r�t��ʟO��(�x5��&������� ���4ٵh[}h-/��Z��l�f��"���3��&��mC�_�M�nw��0d�E���Ϣ�.b��)�ն�������g�p1,�r�ƿJ F���ilu��_H�t��y##<,yzW���6��}��Ja@#	TJvñ&D�_��7�[H��_,���˲�3
�+v���_�@/SqH�=P7�euC��˱e��^ľ����ժ�K�`u]���K���E�$8`�HM�4ٓ���|߮�RR2+���P<~��A��
g̸����T�T��
nkgut�&7�ݔ�]�k
/���-����ܩ���1������+��Tj;<q�b:��B=�9Zg�WD�\ע։m*<n��FTH���f��C�Y�M�9�n[e�tfီ���~a�Ò�(�l��F.��x��H����[z2ʼn��ί��y���p�V�)����)�f�z�JZ�8���΍�N���3����G���Q7��!���c,X�lzXF�U	��F�7e�fn(����9S`�n���p,�:��7�%d�j��H�E�TZH��`Ys$V�T�6V�Հ2����{�(#�5�c��졍�\}�E��bOA�PeU����~���ڰ:@W|l5�*?�Wi��|�J���,f��z�O��=�����9����Q�1+�[�r¨p�=�3L6��E����V�����+�2�Q�-W�8�ļ
�>��UL��s;�2��	���dEr��G���c�yAc&~{�V-���y(ODW�!jX�PǨ�x
�윘�>����T��B��o%�s��E��������+JA���#��~1\:TF�K�#�s�}x�ʜ���1e�����顥�g�C00��'�k��<�S0��^QX>Ň�(�Z��)��ұ=��Kp���A��i>!Ԕ���S�����ߨ]�b���,!ռ��Z����i��K�"f�n�~wi��=��'-z�.��3��{�L�W�da`��>�<i���H���C��;�)��骖k'�X9���s���/V� Nqbc;x��F�e�2����X~o�aX#s��⡒u!���ŊXs��C��2�
��׮�%�ˎ��Y�O�b��z9	��ۋ
�\rv7��A�=��bS*|���d� �h_y&<褎�^�*��:�Is�38ӳ�Z��	U,�|�c�0:�֠�����aA��s�o�sO;�{&�JG=���
�{�=i�Pqi\X�\l6==[H�w�R
{����2��B�[Ys�Q�y�n��!���<�y��	��zd��{�1�Hu�VlKk�{VvN�1,��ד>�"�5Nާ���~WPR�6B�U���z��9����2@i龎�ZW��u��<o�0��ڰ�S�;s��|uv@�0�z�у/����e���YH��пT�yOo=��k��St"ѷ��.���sDGM-��E��go~~�����%궞�q����s������;"�5��=z�-e�(C�>|�U;rm�M@�a���ū�9�#=&6�%~��c�"����q;�L�AS��QE���Ĉ���[���5�򒻈NŽ��AJ!����|�C$dæ��+������>#ы*�C���rO���u�0U₿��8?�W��f
k�M:SH��*fcD'*�g�M�<�����|�gxh�/s�݋z����L��y<4�'FO��0fT{9A�1ߋ5����i�!���[Cå�f���־:�N�yы�M�J�BT�L%$�GD$⌀�k9=��o<)�Ր�c�,=yR���"������-��YW �vcd���l��K�'�d(�La>�.QG�w�7�fw��/��N�5,����󿜨~W
h0T���5��2Y(0��<]pOh�R��n����0�����k�){;�؛�MU���~��ۖ����^S�ʇ��{�&Ә�`���bA�����s��{�:��J�����a���v����3q��,x��|⒴&���S$���3L,�z
Yj�eK�.2w�W��+Ҩc�~��Ky��8�CP1���N��j��=��{��WAf?|���W_��HO��fM��;Wy>I��wAE��;]r_��+�lz�A}F�C�|7�9�ui5��}�DH�b��^x�"��	~4����8���L����1U�wqp]@�m҈�Ex����w
tx��0gyb��*��,�w�C�6�e��!M~�Z;�Sd���V���AGθo�+=A��
 6R>��@��~g���F���?Q��@�DR>~|���C4���Ÿ炾�($���g^�E�L��p�x`	�G1��2R�ޤ꾅Q�ny}�֭�H�߷4б��"�t��=�Ak�e 7��(�t~�įFC��Gk�+����F-���´���Ђ��	��Xߞcq���z�4��"�{ro����&����_��L",�|lX��H�̒����#��'0��5ȁx��������mX �������{eP�(���_	��en4~=%x"1��g�E4L���a��4z��#�O�x�/�K��I���#��W�I|o81O��g'jN-�1�Ȍ�br����&q�]�k$X�x�^�C��`�JO�bDfn$I�:�Dr֝쨏T�]X{Є���I�jb�&�O��]��z�o3}p�T�L?=�
?V�re]e��j����ؓĽ���$<�Ć��:�-�ξ����aG�0�EO�5r���PKk�mW���@+setuptools/command/install.py�X]�۸}��`=�gmM�-
d��v7@�P�-�b0h��H���q}ϥD��=I�~��D���{]ݲJZ�;��\��e��q��Gs��V�T����F��#7J��
�]�]�M�gY�n[��`�7
�i#���
�wN��.7샑�0������������pbF4R�b�Y���2�x+6�j��"+��cP`Js�Q��\g���=�{R�;u�n�}'�텽���n��ΫT_,eíe��*^\?,>���V0��iB�5�W����3?@��]%:�*�JX���[a
�9��=� O�~`��}V�n�-����
|�oD�iQ�_�	�p�0����[�7�y�p6b�"��V|q�(�<m�*�Mg�P۟�=Y'�`����C�J#�C�j$H���`��'�w��^3�|9��5��ǔH%�Ř�$>��E��Z�����ڦ~`��^$Nlid��W��UBd%K���X�P��#���>X�mj1�/�9<!��9*)d����(�*g�t;宏���������Ἢ���v�)�n��&A�+*�8}�i�5�:Z�v$����,��sd@��8�P��t�ŘŜŘ���Z��n�����^YZ��Ù��S9J��$Za��GSq8F]`RƇw~#Jm�N��p������>���{���>��v���;�=>5$����:\�*�r=*�g?�~Ë����p�! E~��n���5�Ā�C)�[�E�B���F�ku�n}d�.���|N��è4�^�b.�����1���@���,�tb{A/L��Is��8��
;b,�ޅ�0}����E��|��m+i��f�6�v��sp���L�ӜQ�����f��e��������~-R��X�TIE�M�*j����H��7F(WЖ�z}�a��̯�e��;O��ij��I�'h�h�EcŕnT�q�
$g��/xr�lR���w�N�)�q�i�m�j��L����4\c�Y6�2B&
�S:_&q`�����1"$á�H���êA�c
��I���#T�)
�Lc��9�˭t��n���4��/Q���8U���It�m+*I�i�p��ó�%�=7h����Q�̡�`v�f�L�H��/CF�L!3�3'�X_!Hc��/���+��eC�4a��
�#[���՘K_�CZu�4�Z{@kX�m��k)w���'Vc9O�BJ��N��I���!.��=�-2�d�=���_�.���;�a-�)�7�n�i�l?=�#C=��w�ٟ�����f��l�A�.���ph��Q�G��5�����R�����oy|�J�����j8���W�q�~8�y]�m�C��(�W�޳���!;ٍ�v�K_��D^���@�mQ�//�x�>:n�H�j^�t����D$�i����&9yxWj�8JQ�.�҅Q�����U��N�D�謩�_!���n��H��(!�����L��%����_������-�,7��n"jx��q����̅��E`�
�(Ԛx��F������E�H�x��lasw�Ӎ�K�d�?F�X��-h���2�(��E����g}7�ߟ�D�����n��m)��#��++�%�%W+������[:��#���Sb�M&g����t�z���?�qV��t�{JxOT���;��.�{��5��nǭ�3�%�Hk�3¸՛ͷ��I��Fӿ�gF�XT�=u��Z|�����a�>}b��`��Q{�҄�B�?F��� �bE��W�"�5���%�
z�Ң6N��#MNP�l��7O~���~�C�����W����PKk�mW�w͔4�&setuptools/command/install_egg_info.py�VMo�0��+,�PYrO�Sz饇Vꥪ��]���$����k7��a�7o�x��Tִ�T�z���u�1uJ�6��`Z4�\�9c��i[�˷��l;Y����I�����{M�s>m�!Y�wҝ<4�r��3��5v�:�����,�F"���d��P׹ҕ�A��ql�HAO�Ӟ�Zd{�X1���@�ZYCd	XX�9e�x��2r�67ɏa��8��9�S�����p�s��K�I:D���*�TN�F��#4�T5?���3#b��hX(*��M@M�{Mp����^}ިc���<KI�zׯI2S�ʋ�$�C���{�e^���C�p�;J�Enܓ}�[aձg��F)�F:��i��9�l^�"ϱ���AD����
HЊ�a[����$����F��(�&�pӻ�w��V��MZ�O1�z��RU���6^IL���ƭ ���
�qs�~�dZC�Y�5�����$�iX�^VfhV��7u��6�o(z1E���b�1�[���(]��ڷ�[��V�͵�\�M���k���.|$$�e=�+��G�����I�����_�c�,��5YfoK��ꍫ�8/ut'X�0����@.���4qa:<����-����ͦƁ�C��
��5�<r�Gne:I'"���B!�Wy���Ct@褕J��J��Zڲ���Jt�t4��L�0F7��x<��R��mP�%��:�4�E?�{���!z���d4�Qˬ�W�N1�&�8H1�sb"�u�m�h�r���LvЕ�ހ�?���c_���K�ܝ�FBZ��MӦ��I�PKk�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(�%'�+�@��PKk�mWY$Ve�4
%setuptools/command/install_scripts.py�VM��6��WL�S��m�{K�!E�r
��F6�Hj]��w�%Q�N�As8o�|����F9?z�9P�`������Dm�^�F(����V
ށt`�:gm%�Zc��i�?�0�0.���e��\Ytf�5& V����H��^6��II�j���-V��X{coY�՝t�zP0��[��'������`E��n$��
�|��n
\���KG�Y�i�%5��ԿX��]p�î�
��5�ڢſ�6��d�p�iG�7C�~�1�Ģt�j6�YE��F��y�9_��vz�l�$f?Vw=]��a��*�<x�da&p3�Vu�<$�S����_/(�x�Zo�1�������Fi�I2b#�u`�_}K�z
���2��W��!�����#�m���	�YT'�0��ts����=0-��3Zǭ�(�$O���N�Ꚙ�ê��`M�jeO�+��ńX����%�a4����4g���#Z]��(��@�zpQ��r��T$�B$������zQ#M��)4T�h�s��ɩ_��j����HI��}
7��]�S�$��p�j>�̓W[_�n���3�|��,���;�ICM���F0�	���*Bm���$�A�Tp<3wp�:�������)����_k����=O�f�gf���5��.�� N�|�&|��Y6WW����\�*��+��5�=�,�X\�|Up��lGHW]P6h������*ޱ�q������;�S@n�z��c��ީ3-9l6�hy���
�M ��8��oq�W���̼��Q!f��Ĭ{龯����]E�4�Q?�[�1�y��!Lq����p!��q�kU�M#�ؿO�v�6��˞&̄x\	3}2��S${2�uؕ��#f�˻.���] ������ï!���S�1�{i��Ez� �n���1�PK1xU]�)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��~�_����oPKk�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�PKk�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�/PKk�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�PKk�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�PKk�mW<?��	�setuptools/command/sdist.py�Ymoۺ��_�9($c��.X7Ȱ��-���ۀ�Sh���Ȣ@RI݋��w�!)Q��;�@aG:<�/�a7Z�Y)�m����Fi�*�=�?�wY��{^���G����Ȕ	�̡�)U�U�ڊo���
J�Vh�T/��qY���Ys�|
�n�k����K��meM��rG��^X^r�=ź�U��w��o�-_}��O�?��y�:;ls-�
�+v�*�xvv/�3�Û����{q�$�7g>��콬Kƫ�md%k�Rh���&㵪���7J3�0Yw�fy�dmM�ժm�#lې�2�o$r5Aj���#/�d��e:
Ft�9H�^j0���1Ω�kY���՞�@0��РB��`w��2�6�aQ��a�vb��s�Xxg�ɟ;���sk���Q�X���+2بV��R�u��XJ�yaD�5G0x��|�����<&1{|6��Z-����Zp����o��\;�$(���E�4+)b�(��fkZK*L��o��,b����
�2��k������a�`8J��uog�k���܋VkHR
�H�OW��H���?)IJ��eN-�p�I`�@��{|�|���2_��~y����YaV%�N���o��}���Kt)�� f�{���_�̥Z
�j�*��E���;��t[�FT�������i���nsYoT2̋}	Z�VX�q^���9"G�a��qǧ{2M���P���.�
�&�'�p����O��l>Y�D�}��{�z��s����ͼ�fС@BNin�,�`�IG���y�C$�h��Q�q��ZQ[s����Hn��0e�	,ʎ���@y�Р��CG<��8�Ij��n���2�q�����E�
��ÓQ��ZZI��8�6��"y���V���P�i$��H�9Suu�J%<4���l��FKp%4���u�Q�/+dO0�@J@�gp�傽^����5D
�j�&��Gi�'?�|�?Γ��a4��J?���	p��W�'鞥�y�i�WؘL^�q��QN(�4�������*ݓ6e�'��
����X�k"�-�;����&����y����@G3���Í��Z1���7g��˟x��l����ġ��@��UЫ��
�I_�	N�#�W7��jD�wjKCe:i)~̄Q�pT51�:m#�IJͨ��YN`v�=�
кB��)�'��q��q!
���94Z}ؒY�����=�8GgN��P���MH
����8����{���"߫���t�l�2Y2���PUhi�u������|�3z��q
߈�i�9?鶉���m@?�sF4�^ͽ4|����Q�T���svqb�
���..�b��p��^H�
� ]hKB���ʭ��~vx��XT8�VТ�w�b"`�a�)	E�^,�lL?c�qj�~��B�����PLtr�q�բ���}%kXй4f|���+����;uk-�ru�#�'������!Z=�� "��Zn`h�8��C�
W��^nw��L��B���{�Vh�Xˠ�Z[p
iCHVmz�������X���^<�$']��V����N;��$��#V�G��)��0��u�R��5w�G6?0�S-TX��$[�<kIΕ�rÜlp,�Wp�Z\F��i���`�W����d�!w�K��w׸I�s�p"�ޖ�����t#���՛��!&���Ez�Ə���(r�����
+GG�Q��#oE:��34b�y����Z�!�Jm�g��t�<"5(
�I�����8B������ƴ�t���x�����|�f~sFh[TFL}2��� m]r]�=
�eӛPA;��j��^����.I"3�92}-*����&tP��h��cp�?��'}`�?�:Z�/�����E�����	Z�u�v��Y��&tFRA��kFaE�ȞCj�wKL��uF����� xH(�Ҏ�<V�:��ז,����M�������;Վ�	����M_0G=�3�zo�R��ić�@���!I�]$o�Ts�"
Vj����6����+����w50����7N��M���).z�i�*S0��!�s�v3d��죬���v
�+jT^Z����$�]1X�,���/�@�K1R���R��I&�B�"�a��\>���=eP�qS�����>���V��€$�yi!?� s=2��e��6�[-&�6rJ�ڇg�~��$���
�z���z;������}�}kl*����?el%;�|y�

:2�e
~e��x&�e��I���H�('F^�{/4U�cĝ0��Q6
8r�^��4I֭�.�5�i��tr]q�v�fb�0�Mztc��qm
�^��C�)�6�;�nR���xhWXVT�`i�PKk�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ڷ�ܲμ�|PKk�mWO�\�	�setuptools/command/test.py�]��6�ݿ�� ��8������Mz
�K�mEa,Z���ʢJR�~��)��eo
t�2����U�2eҿ�Bs�t�ۜ��R5V|���+�
m���#]#��.vZX%��M.�V�0�m���W�����CZ����o�7>���WB/܁�a_haT�K1���rQ�J��tU|�e�����E��[{T�A6���đ���8p� <:^U/�<r䉮���Z��#6�G!��� ,����\ֵ$�~�'u8𦊷sP��M~PZ��ب�?;`�(�����k^�|�5�����j�b�(k��~+yӀ4���Q
�
qZ�+
	�*�Ԉz���o<�O�'�W^�F*�FJ�l1 ����������!X��X�Z������-0�ƙ�9S;�뚡IVr6���eˆ�{���(�z1�z��M�̤�-/��G=N�4]16�X��{�����D#�uA��|a�XZ��SZ8Y��
��v<�y
f��<���.w�T��Z�鼦r $u��QPNk���.�mES��?��,@T��@�:��%�̦L�uPy�>qIRPL(�$B�S��bj�ˊ��Q�&��!��3��ާIޞ���L��������9
RJ��
]��b��%yOD��y���3�6b/�E�s��L��!�3��UZg\&�Бeӝ�Ǹ,xbx�t�+2�Z4)�g��W�B()����ҟN�S�����;ƞ�J5	�^- �@hi`"�Zhi��O���3���Ss|,�p-L�jL�V
s��'�r�=Z��A�{a}�����~`j���Ԋ8,�Xac(n\�bf��N:RJ1�Y�_��/`8�]Cu��L|���e[�R�m'�
ãgĔZR}.����h�(AoU�tF�B��'i��^:K['�X��5�S��
̭(�N�z��e��LD�p$��n�h��2��k�"V��3�T��r���-GD!%�r�=ĐF�з�[D
�<z��F�A3����+�H��<�R.�הo.�{R��@�N6��ӈF65�٣m��:v�'��8����˕����Բ���˩�p	����S� �J��M΍e��y��
�Z�@K�=���ļ`�����^ճ���J�g䯼G��`���;�A%^�8E'n�U�r�2o�O\6X������u�3p=� �ޟ����X�����h���E�$ZzdS�NR@�M��RAo��I�*�/���=�~_tddk�2�WQ��?袩X�S'T��ndx�Z�G�+(Z!����D�~_ߓ���H��q���j�������l:=px�9ٔuW�Mʬ7wq��*�q���ة$�K�؏�?�m��>�F�D�)��|�,�	�B`�W�F��!��P���>�W䲧~*�E�Y��$�����d���	�ݞҰ]ҧ��z�{���D�Α�-d�l��\6P������p0����Í��m�ilsC�ܟ��!?I��f�~n���,`�b�,�K`�AklO�^5$�M���L�A^<����H�A�rώJ�����P�|��Wز<`��n?���]�?o�����$��C?=���Y	����/?|z�&��Ԫ9����\K���l�[��@!��64W׌װg� t~h��֍p�g�E���'����
�J��!tc�סE�!!�܃�Q�[��@sJ�} 4<br�'ƃ4��H�1��e�5��/�H����P�<D�U�I���W�Ԫ�*�,vf��N%Ō�b�t5C��A#������<�lr�u�6�пz��\{�K�q����ur���Um��i9���6"Z.���u`��]�L�y�1߻�~�G�����=���vĵohrO��}��w>�(��`/����E��;a��'��1��<y2Mh�O�R?�Cbdz	LQ\�(�x6�{X�#F����pM�8��̄r�C[?����hڟ>l^�4f���|^�sp�ߊ$�"��ʒ�N�噘����}C�tcG�]d�
:�8� �)�n���K0&��+Rw�ӥܜ�j�j�05�09t��eIu��R�XQ��u
���Z�s�C4��4��ʏb\V}˗�QE��9������TiΤ}7u�3/	��/a�o�e���x��U��M�L�5(,1�mQl��f�RA�3�wস&r��Pl=�~8���x���rl� �`�OjUR��d�XJ#���p� �n2���S������	�j��7���~4AL	퉕Q��u;|wX�#8ۮ���!�4�ӳs�[7��>���d�3�Ab5A|�K<�B�#7�u%Q�����H	
�v\�~o���W��W�^�no?�F�9+���m< I_�l�^��/_}4�������p�T��/d�_�Cܤ�E�@������& (�g7|��K��G�W�m.�t��������!�'<�ҭkxB�����d{������cD����PKk�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?PKk�mW�sb�	.!setuptools/command/upload_docs.py�Y�o�6�>1�!i;V.'Y�`ӵݤM��v��u�G�xXK�JR�L���:�;:��~� 5�ϛ�4_�"S�ٛ�.X�*�%g\�F�B�( ��j֙(KZ�$�/�h��j.*��Lq�z�$�[Z��8�-����s͓t6��g��%YS�^�^�Bj�4�2_�_��*9�Tyk�#,���Mʤ�%h��F����̽�_)��3���z��o5+{�j���Sj!�V֦��ރ��u���5�(�:��T�����sH��� �)��9��S��WL7��y�j�2�߬</��`�f�Y�6de]��tF�'A����>��9�{� �j�wT3�2Z�(	YA�"@&���!�90���6����G<܄�*ҎU55��r��XۊF1#�v�Ț������Ƿ׫����\���7Y�}�N=��5O�ފ*���?�f�3��Hn�,�M��N �(W�T ��<�_u�^�?e�h_�9���M��Sr�n���9*/6YZ�V�%S5�@ϯ�b����.��Z��οz,`?�,�ɴ��s.�^"
�K�A��sݚ�5���*�[��Ćl�Z�z˫/�b�ơ(�%r��b�t���� c_���p��~Uu.�����QW@\mS�̊�l�^��(���X���<F;��/�%��:y�5��ʼ��u�:D8;��e�浦���ukȆW�%6�����c���p�[�X����K������ا�* Ba��	xGix�Γ�;��m���N{�=]��Oa�Dg8Џވ�G>>��Q�y��+57P::2��@	+��'��0�[��&�����%�Lk�
;5�>����IF$��e0��G]XF�
���gZU�,H����?����攣�ԤC}��l�Z�т�%� V�r��x}�<�zA��PZ&Qޣ7�A��~o���=ƍ�D
��.e�SH	����~$m�	�9J ���Ø��2Rǜf)0
���p�7��-�;��'�HʡL�a��?��tz5?`�ig�Z���N[�
��1�Hz!��6-��!�����,�G&8��a��$�1�da�u�&���Z�����eS
+��0��yʸ�Ɏ�g��U�4g@��Џٰ��� ���������)�3��p�i����$�Q�e��;r�T؃}R��PW��<rںv�a�7D໶dz	�N���Q~k��u܅�huY�������S�b�b2Umzr����p�i����?Qz]��Mb��RYjɘ7ѹ�
�ֺy�ɕ� ���1��\��z�ƢB�>��=�/�gZ4G*$�ʵ�O��4�r�P[���=Ũ�������c+�h`~�AL	�5�/����'ʹ�0z�X-�B�Rl=־�Ҵ���{u��y���/G��Pǂ@Rl��[g|��m^�
�����տtO�e��,~�h�0�s�GЉמ�>ſ��>U�7F��U�.,Qv1�ONo�٭�O2/���D�Sl����GRR�]�+�^
��;�)g�ɝF��B:+
� Rx��4ZS��{���to����殍�I~�WD�q���_.~>{������'�.~��������_�<���'Ϟ>?���1Ϊ��#�}���S�q�yUr�;��h1u1B��	rP���d��	�஧ߥ��iPC��#�eބ}�_!���к�ֱ3�05v�I���"{ܓf[ʫ�˸JI�P9�I�|�:b�o85��:��V���צ޵8{��v�v�e��3G��[[�EOC78����X��zKD
�R7Gr%x��'�S��Mq��;�6ɖo��=��)͐<:5���;���"B�E=w@��v�Í��m�ߺ,�3�*�i�޴��
Z��`��J��cZ�������$AE����i
ug'd�1>)��$��t"�}8�H���l�va��iT�L���Ku�R��uɵƝ��
� ծ�;�g��;�0Go~�xߛ��v}}��6��w�1�M�� ���֧�j���:�O� �㄀�8G򻭶@G�
l��ز�Je[VR��.D�@]����R�vI���|�.<N��\�@��C��vg4u;:��w*b,��hE�Q���gpT�����V�L��v��,T}�ԫ���|e����M՝
;+�2���QזF�2Z�f֤8����ϱA�M�G�a���-T?&���H���!#ԣ;�V(�1nY1O��a�Wp)$�j2x���CM9s�j�B�%c���b?�`�:j���z��}~y����ʶ�.�8�P��yu`�r���hb����}ݶ*EW�X�;�Tr�N�b/`��K)QM������g���M�S��A�j|p޺�c1�rL�cd<�[�V(<��/G��s����>��&˘R��Hɿ`K�������;���k�Ph���%,L��^�0����RK^�8�1�o��s�f�kܳd�PKk�mW�*asetuptools/config/__init__.py�SM��0��W�ri�
9p\���7$\�'�d
��픭*�;�&���_b{�=��y)��`�|���,�R�S
�d�GP\h�=a���ź�cXl0F�f0zss����XQL(k\"�BϞE�JA�Ž�-�)�c
�8�[�d�$E�q)y/���'�_��a�>�5�i��ÁG��& a?e���9>���;hا��⠋z��q��T��-�ۖ˝��c��eq�'v5���[�'x!Y� ,'}]��7�g@��_�.�2^Yt�w����.s�Պ�K��dM4�o����A�#�L��� �h�=Yg���`����ӝ�Vs�m��9O�ɧz�G!��plX�E߅G� (�Gj~
'��5,d���i�*3.3Q0���~md����
k	�(��Q9G�F.3�#(1?RcSF �G1��M΍O���&n�շ%5���i�| ��(���L����W#]��ţ�˃�����-F��e���kD�n��47 �
PKk�mW�E�_�V4)setuptools/config/_apply_pyprojecttoml.py�ko�F�~ņ�PҐ龮(8�Qz�Kl#VZ�@��JbL�*��������ˇ�P��D"wfvv^;3�rgZ��H�2�3��;^�;^>r���n[�_xT�(ϖɊ�Y�/�m��`q"�"���^�qX�,�C4��5�6�6y�S�pYn��<��/��Ko��p��\�/�dO�$×�m’�-��e$�[,�r�2ߤ�� �0V�^#��$�;�d���6���������O'���O�'''#v~s�
.x��d�d��,LY%�gy���8�d�͋���j3��\�o�a���,�|+KS�$ ��.b
�0���7a��kƼ(�
��Ӏ�q*b�*�wrte�CXE\E\B%�x*Z�I&��ݖ�7E���€A�)w��f\�cr�˫_��<�
�E���]ʇ�m�C�X��-.����8��1`=8ِ}���Yk�A̷�Ƞ%M�έ{[�&a�d��h�}I+M�4Uc��5��?�^4t���v�4�|��~i��qG����C��ͦ*Q��YQy�&�|܄�pH*�\���F���uq[(&��ыLGl�e0��3�96����4��<�5f��<��!xj���M�����/��;7�pÃ�9����n��F�̈́t���/��#�H���7-�Ep�s$�ЫB<$���1���EF|4�D�$�uD�,@�EF�U$֠��()�*)Y�",D�f"�%�"�� NP<��-,,����z�����d(r�ILKhhhz6Zc/��Fҏ*P]F�@?��B��΢�ؕ$�9Z�ۜ	�O-���	xv�o��
(
E�"M"�	 ?�S����æb�҇��������i�\4�l$��u�P���|�S�P����P�|��װs�<�$B�����DJ�
�J�U�,w��U�!	�&eV�d�C�Vw��;�4Q3���s4�/�l�o�b�ŷ.Q��� �7�o>^�sr1
.�?~���\_��\]LHj��А�I��"�\E�bǚD���v���M�b��u�DJQ���r�?���5����z����6���-�O�5��U˶�P�^_���?��o'7'����ۦ�E�_P$˜i���F��t0��<d�i��YC�,�Um��\϶w�t���(�f
֢-Y��\���~լ��WCk�#8!(�
Ā �DI�:pKL+|K{=/�VیHd���8�l2��H`;Z%��О�X(ҋ�4/A����%X��"�� ���#��ƹ�{L��W, a�d��y�Ms�S»7AI�;Ȱפ�(X�l�ym4�.K������`v�.�&o���\N�|'@2MGԼ��$n��%%x
��`�h����U_��@�;���@^��k����1�)m2}^�F�#Rb�u6������h˷���~��59�������^�( �#���MÈ��)��	c�-���--�Ta���/��I�aYJ��u��<��#3Zb%r���Zb�)��C�K���0�����
����|
5�m��A*
�6�/�

	���tr5
���1<K���I���<ۄ�}�?�(�X!J3�t�Oz�|�G@]	�쵢VX#���d�DJ[k���s��`Ȁ���
(��<�j�h�y0���Pk&5G��ԍ�wP��3@�K
 �$���/�3�K�~��燽�P�	w��!Cr��&��UG"��`�ĥ!���b��l/�*����L,�}�+a"8�5:)��v>e�픴�('֞��6:�_;Q�c��"*R�W��!K1e⡼�]ת֐�l��AZ	l=�!���P�i�R�_�Ttɤ�`��[D+�Z��y��FU���e��q��9��S|�(#���N[@91�M4k�_@��zL;�V����i�Xm�t,Ņ.�t��Ar�{�?#q���{�R��&:��ǖ�ۃ	;I[P�����P��>��&��C1}"��\�z����Ѡ�0Us(�a6Apͭ�"�C�ؕ`3��pyw"���^j��X��1��b�����͸IeH�v^��=�:��؞gLK��G��њ�]�V�,Ǩ`�B�@�j�(x�9��*R�u3椌��zm���kW���M��OO�e�{�6��>�.�n���{��@z~0��&l4��fP�q�&�W��
@��F��Ц�����k��Y�ᠬx��c�@*Gn�>`�ͪWW��4�;$��l}�*z�L��ʟTv�[�����[m�^��''�򐝜{���I��Q������"Q��|�:4v*������SV\$�gGn�3UX�ȡ�ѯ`��*	,�qo�v]~���Mꅚ,o�%,��
%k���_���F�xi���;(f]xd�S��i�[2oɖ�2��­�*�YS
sS:�EQGk&sc|�7s�U�W[-�f��}(���E#Sa�@��j?9T%~�W�V#N6�7q��������[�`Ѡ�^s�Y�|���(L݆��"Pq�7Fp��H��������;
 w�ba�֎��k�)�l�x�M����{�iX�
N���U���#��г��g�e>CL�:L묷�ނ����V�mҼfS�9H���cZ��:,�Ϋ�U��4�#��tF�B�z|����4_mMP^H�P�gX���^(�Bq�t�k��6hF��$��X"��=�詞�[��䀴7!9t0:�gg��wa
�;�PÂJ�ļM×�z��K�U��a�㠵i>��.G�j�����i(����|��GV�)���m��h�͂�|�b�B�*t<�wm���e�fV���@�2oV���C��ɉ�
6�J�B��َ��S��S�T����
�hr�k���;�>�/�f�g�چ_3��M�Z7�.2�6�5+0�/�3��,h�oK6���"�];G�-�?���M�� |���)�)� �@��ڗٳ��:��j��	B-�e�LJ�O}G���+}��B��NI[0��M��`SC�N�ByKaN��`�0��0�v���۹tE�%5��i���>=~��A��6�$iHy�b�C��y��8��أ$c���A��y��D�͛7�{��Y\�(�j�@�w_�lZ�n8��!���G��~P���Ҝ��\�&G���Ώl��~�����
��E��S�R��\y�h��ps�,��!{�zF>�����;�!vߩkK���X��PXk)��Z�I��SU�>�9Dw:�1��?��^H�d����ok��k,�p@sGP�/R�t�0�^�5J��g͐(��{	:�TR; e�w�LQ�N�ve�Y���+~�.]3Y�K��R]�8ؔ�p�/�=Wu�{�#�gU!��0�M\ue�j�O�o`s.�?�S<j��}(5dw�~V ���j��n��G���u���\vz��k�g��62�6��XqS�'1TߕP��@I�4f?��{]����[�w���)q���z�E�I��B=_"����L�P���@7��¶���64��B]�=��=c)�i�!��ݣ�s��,贶�N�k��1���q���
�rT{~�J���=�Aˋm���a�\�"�e4e���{Ɇi�^���k�Fs�����y�RGLA^$���s��z�(v�B�Vg�����lY:u�H���h��Lnq��Us��*���#�2�g�j���u�i�B��=�e��k��^��	����m�W%�>�/��k9�d��z,��^�������/�S�R�:m{�3PY�R��(W�2�6�j�d��8zru��Iu?������.r�<��U}��%6x���S�d�0���:�`C�7�WW�S���Z��<G���vaY��[UPK�KU�df]�[1:;�vd���buƳ3�,�3ՃRm곘��}��n��I���S&���![�k�K�P%�o-��U�U�\�W6NNJ��I"���� U�VM����c�ǥ?-+��Up�'K�8��~PkΨTw.��A���4'ϣ(cU#�.�X�F�%l(��>��2VaJ��(ae�N�pl�n1S�/�l*S��y�;s���	}����XP�M�B�Qҁ�}_�2)8}�;E*��:�MR��E�6�����G��`�n�7�󨝐�H�W�ɗ?��g�c{�����PKk�mW�v���?setuptools/config/expand.py�;k��Ƶ�+�

�{e���B���7q�I��[����.��p��U
���׼H�_�����3g�k�s8��髺�Oj?4e_��Q}���hv�l�}u3t>P���0�^�v�uY��/�A�Yb��V���V���]c�l6�U��h`2�[��][j��j`ڱ�}�܌��W5�Z��2�>��l�<S�B�\��p.�u�������)QA��v�O@�̔�%EO�l����L�dnO����¾�(ӏ��p����~���P ����;UW�GR����v�2lP����v�����!F$9�����	�`b�k�L�����m���06���Ҩ���~8�m[��F䦑��1mc��z�ЈVd�f��]'wenۡ�!�XA����QH�E <`"��!/����-B��x� ����meԡ�
bߖ�oh��0sGʱT(E�4���u������W����S��u���l��ހ�..�~~���W�ǿ���..V���kՁh�{��{�����
l�S6����pl�$�ۯ����n���Zc�!C�)��<]�*5#9��p�3mxntgCcW4Ƴ&١(o�Fw';�G�[8�2�JyBy[T
?�OG�<HPԻ��z��o޼��oK��TlkͿ��ʞ���~�~�mǿ~%�o?G܅���2+j��n8���NG���ſ40�������Z|�ৣC��o�Ow����d����M�֎3R��,ɲ7�3Mq�<P��_�Y����"�ٶ9��pӮ����+մ�O-*�@��ߺ��bO�S���bW�[;#e�QG�%kF��hE;ˑ��Dr
�����P��,Ex�<3Og��h�|	Z}L��n�`*fe
&O����,1�����}<�),�1a��.��o+0�Q�y���V}WG�v�3<�i��*ϫ���<1��/U�[)"]�*8,)o��d�K<���D4��Npi�v�MդY��]�=��$i�@���L���IݖE���Z�?��U�����2��;a�tn���o�-�|Y�=
d䀹A��㝘�l��N~*�=�����-u�
h�%�W�:"ֽ$��F�
�8#?�*���p�y̤X]��lȍ��z
�d���Pe`DE���P
���ñG��bGADϧL��!��yͿ�
�BG�� 5�:װ�tՂ�L ��F5��O&��a%B�x�g�RB,�S=���ea���?�Ib�hV���%q!��a��R�^�4~`JG�
B����d�����g����UMp�~�8OY
���P��O�N��B�=鮜�Bk�^��m�⦕sN�d��`~j=�����83���nYlD��KBMq*��\��
��A ��?��.���d�A#n+��M��'2v��r�:�C�`P!�nCݳWz�ak�@���>:��!R�}X\,�j�W��Ə5~|�����3��Ks	�/��X�`�}=��V>�DSQ��N;���_��A[5��#�W7ԻhN	>B�ڑY#�ʾ���A()�x�;�)��8�Š�"E����-+��&��?۪I,?�4�#�s4ӡ�]b л���)�	?�y@�v�8�0�`�>�����X��86q�,pҐ�k��iꥣk�'�,�41�EQ�g����Xd��_���S�"���(�w4Q�y}ʁ�$���"��75lQks���,�w6�g�4ȹ$�<�pA‚�����1ꔇ��	,8į�n�>�Y쇶Y�H�	����Co����͆�%��@��c�)shƁ-*e�@,��|���Cq2>�ۃ��x�>��s'X��9"�GZ<�KX��f,��,�Ӭ��hҹC��t����E�<�ih��C�r��'�&���O�
�s��qL�c��]�>D�2�2��4s�Ei��Gަ�~W������G��4m��k��n�(�l����'�. �/�fTm��Iw�J7�6����?��E�Gi��i�)�O
�X<�qS;׮B{>V�4UH-���4�G�bN�[�����fXQR��]��Ē���{Ìԇ���K��)��h�C�����wڔ�qIV�7znI��-'A6�ZF��-������DZ�T�$:g-���X#)$��9�rpp'��0(�T��r�K
0�U�L�{�/0qg�^q�τJhY;f�+pjgf�2q8��:����_o�aGyk+�ʊ����K��m{/Ɉ츫���7�?
K�)Q7R
�|F���}V�͝J��c�� �山w�6=�8�OF�>�E\T
�P'��M�a����ĀW�t�Eq��lɺ���"ۍ
�3�1I3*�'�l�g��P��+�c{p�'v
�c��瞛��Ҳ`��&J�@���s��cI�h����a�ŭ��.z��i1U��'a�)� ӥ�X*yJ��z�_����- L�{�洞�c���Ə�%�S��)���pA�[2�Nid6�-���*d�/,���p4�� ��ܞ��k�^���Oۍa�E[���V�EF���\#�S���x�	a ����"!����"&� Zk����*��gD	��"����c3Q���5�_�"��Nv!�8r��c@��`��JWaP��`7���r�@wG���Qp^�%��p�a�5>�)�ldɪ���rB]��ck"*�{c�0�"��
�D%�r˹��m������T'i����BN�<���&@�"2�{,��W���0;C��k0!H���+�}��
���3r9��QrU4m��+S�+�E
�ض��������j��V�%��s
Lz�BaŒ�ľa쌪}$�0��\�y�E�3S�𾄼����<�p�{_I�/����S(c�
v�!�U"��`y�	�Z,����ՐvЪT�Pϧ�꘿Of��̴#˝���c��ع�M��؃ϳ9cw�_���q�W�[��/�_��34�f��n\/�]<�2_,��Epf�>���(���*;0F*pzw���Z���#vF�ا�j8��yi���Jn#Xs[�&L�~B�H�{D9HN�G؋\qT��8��ܠ�
M[��~L�oCQ�y0p��$���dO��CIqc�#�Η�`�-+J�x�$�0r�v�0��Y�.�J�����s��#~������_�?ѹ����\���8�L��D�뉰�oy��ĕ�]L����%��ժi��i/�u�,�n&��u)���r��.�4���H�!:T_�n�+��p���dJ��-սk�����$�(B �ڌ�%q���m��σ`N�8b�}�,x����C�ݘ�zu�R�k�CU]M��dP���p�����5�|��@�Ru��5�2��A��i����P�<���-cP�^�JPr ���T}���)J;�_%š_��Di���#,`g/��o6(�
�U��
������w�)�8@�5H$2��j�����J��7F"�#�������?oRWr�s֖z��1x��C�̠��^�2�����4-�DJ����[t�����#}wK�<�Z���([ΞX�]�}J8�ڞ�q\��T�Ҙb����<��Sр1��ҡ�����6����~���A��l��6��T�
:�zF�fy��#)2kKpw�sH^��m�b���r(2=��M�~nq��~�σ"ZV�b��ITi[�����%��i�
�U[��c�R+!b'OYuѕ��>$#�$�va�Z���0��x<�4lb��߆�9��,�c��K�������f )�&sX�
.a[��yX�D�y�
8�V�_qw�ay$t2yIk�|K:���RԴ#���[{��I�!�b�����5��qd���B�� ���p���>�كN���b�%��s<{9�t���
��\�M�X�H?��gR�Pr����ww�����X��Ka�t�X}4��WM��BѤ)O��ۊ��?�� j+���-�8\[��d�A_�OJAR�syQr;�&";�wd�OP^qC��]F�K.O��L�-���+��^�#
�X��D�	m?��2�>��4�G�靌p�ϵ0���V��NJ"`�~qm��<*8�ԉ���|�`����&��i�	#�pH:�����FxI~��3.pc��X��;����a����Ů�Av<a��x| ���Y�X��p^�
�(6Q	߳
S�'�-_U�hw�t�%�N
�~F�׾��������|���7�"^d�Q#�md3Z�����N��7I_��57�Е�rN���(;$I�2��K�z�q!٫����azYE}���]��eB�6R)��|GW�:�7x=d� J	vV7];�2|e#��AU���R����`:Lo�S4%'��K>��A�9�Z	��M،��$/H\F�F$<�Fw��/ZC ��.���|���[0Ȭ�s��/�`��}b�:���J�N}w���b�&1[1��c��[M��l��l����<y�<�k�%�W��8�������`�
^-��oC�o���oT��>���_{�LXpR����&�e����l%�
�
��g����~�/��Pm�F�_�-U1��w����h�ڽE3λ2�}��){��V���i酯#������U�R�:L~[��(���P�s���T����F���{����W���'?N��xk+�
'���Nh�*�.x-d���["��Uqz��2Z3��<��/�w�t�+>�]�K����FZh(�v�L]���س��N�|�y�kBl�Pc�'�[�>G1
�唙M�%QEf��]u���/�K�B^v�Nj)ݔz��_���{^@���H�W	��l�������l��_����{t�r��Q�������2��Ɗ�Dɗd�z�5`�vU��� �?p���O�/E4|i\�!gu(��.��3��܄]�H5����d_� a�G���FM�[��7���֛�@ud�I�y��K���?y���R

h.��Ž7P�������]��vt.��Dv̲�e�rן��.I�A	���?H�lXY�!����!��ܯ�A���~�ѡc��S��X��%״WU>�+=_ж�)�!ZX.>klcs�KmFz}
��H��
f؋<l4W6��;,p�\x|Y5�DV�15�����	w��dr�)�;z� �A�J�o���YK�Y"�k���պ�F��N p�+��Vv<�6�f=���'��
PKk�mWzkK
"hK"setuptools/config/pyprojecttoml.py�<]o�H���a�@bnf�p>l6q���$F��`�E�ln(�˦l��WU�M�der/g�4�]]]�U]�(�&`��۶o�J�����Ͷ���ٺk6l�lwm���}�7�j�d��"�L^���t����3��Ƿ_ޟ�|�`�/�Y���x��M�B/�wuV���n8k�j�L"@�ܴM׳���)��g#��}���AL#@��}U�����l��vr�z[�jY9�ͺ��*��ߵP����Y���������؛���U�g�m��3��ErdՌ���8oƾ��f"a�&��ά��t�o4�C�J�(��fu�2�R�����V�K
���z}�)�tČ���ٯ��|~����ٻ�gog,���V�M�t�]ɫb2)�>5?�}��5��ܕ�-�;au��l2I/����JB]���3����o�z�"�y#ד޿�wq��ن��t2�|
#�"E���-�X0�?e�d�(�%�ț��Q"��{�`%�zB�K��iym���[ES$1�������%�Mј�eUYd=��"-�����8���#b�ޢ��k�x�W��$:�ɻ��~y}�����������qDS�vJ4%H���Ld}��C�@�8����}�ۍ��'�|���
�.�y�*��߱Վ9�m�'�3�b��"��78��ŀ�����a��n�%K�c��C�����|Қ�t���n6Y�Z�#�R��/�#HԠ��L
�{�5���%H֋S��Gv	I֋�Y��w�-�[ж�4�m���.��7�,f�p`!Atnw����w�F�$��*�K
����
��!�u�����tb��V�eM�c�`Z�զ�K�.+g@�4��:z$�O_�GC��T�M͕^I���<&�h�,rmP4�Z��|)&m���Z���*�g�J��x��do���������x<T�lec/����[.$�8�=��>]v[pP�
�h	�X��3�~��[���W`�����ꔰx���Sڕ^�����"����vS��zHt$-�L�9��Br�$s���M��.��g���_ۺ̛�;{"?l
�Q���1w�<�9�d�eа+�,�o�@t����E� ؖ�=4�9o6���UC�q����A΅ �T��qq��H�&�͌��zUEϙ†5kv[淰"�doVh�ESa���&ax�%�T�n�_�nZl�v�3��~�>O��\�����eg@�6�ɐRd�[�����`��j�(R�W���Vw|�;�a�{�T�;��`�˪Bj�=��X�YW�_�I}ki���.a����m�
��m���Cp9��6˿Ax+�X晰`��2, y�\"��*��2��`��).)�������0N�81���5<	�W��t�1��y6M��9����d+��c���Hb�Q��?'�������JތU�QO|�=���!p��I�V��K��0Μ"��h�2i�����dl��KËhp(~p��pՌ�S�;ę�Ȥp,����˾��(Fz|ˆ�dl�U����zu�8r�a�p
7@�����}��Qj�MU5��@S��h���>��F�#�>o[
�Q3�W�VbW�^�J�4�h��rA�K'
��d�1,��_a̛�A�-���9*#$���Z��{~��!��&�F�e�W��x��)ĕ�Kg��7��+�j�`�˜��˲.��Z4NJ��ѼG�N���U��h�Ɇ�,
`��U�OЌ(��qA S!�GeP,i~ӕ7i@|����iw��ZJ�J�lS�!��(��h�e��
ćK��x���9�1QZD�@�[y;U������o��F˳��+i�=E��+W�4
�<'�mS��'6U�f�j���u�+�L�6!=���XmGi��1i'��g��6]�m�L̈́���{1���@5�����
���i�?��~ܰ�$��[٦+�ƃ]\�~�fL���:��٢Q�}�zK�(h���x��B,`e��J�!�
�SU��
X�n3� ��>��jS���i��3Ol�_�"+*�a�G���g���Be뗚����sB��}!q(/a��o3�p��Kr�J�Fb�E��TyQq��{&�Z�KI�Xʺ,6�g0�(�T��I�8)ѡ�	U\�k��bt�ǟ��g2��!ʪG������O�>��3&\ bCj2�0�h�(���l*�_g�B�G�5�CU������kM=P�o����!n��w�$]�Y�Nb(=�5C����`>#�S�<CT6_��w-���SSȱ#k�7��T*@۴�*�R�D#[�E����[�vM`|����[��-���s�hr�M�l!u��v�R�Y8�2��5d�]�e_�x:��h�r�1)��A.�� r��]�ս���.0bI��y�D�Q'�%�� �+�%�=bz.�s
m����F��ͿU��W�?�~��Q'�^N)H���k�BU[A!VS�
���Q����`i��ra_ӈq��U,uȡ���%I2U�aM>�><f��<��=e:�"o�=�::����[o��j^6휘�jM�Bx�DҖhH��ډ�=��`�M�,ր���d-�����}��V;�rƾ2�%��r�sU]
��ޙ,|t�.�($R[c��ҺCpRG(rHA6�4�>T�j=P����5�{��;4�N���E��Dk���8����xǗ��j(f���9U}��W׃��7,ik1*-C,��!2#!���kbJa�)qqb����㸽Gdc�<õG=�e��
��)���:��KPı����lMmr����H��BL+O����wJ��:��4�������u�0�S/��he��rrb~~��� TZ-�^�J�[�:�u7�^S�`�U	�G|y�gMw��$(�<jS(�YD���|�$��
N�C�o��Ad�㲋s0y�^��֤��xWV�uQ�F
�mK˲󬦦��m���}�P�~���*o
�c�J2����a�U }�s�<F��жF�BZR����h�����pL�1TT��́r1���@�̡����8���=N��n)(�s��^?�w��$X��[�8�����Kmg�8#�5��"mhU�1���XN�I���L�N0�7F�V��A���-X6�|�Oǂ�H�@��5{�C�f�p�ԣ���=�`?�꜠b��,@ߨ�4����L6K������XX
4���M��,w�<;��*�u"��(�ZI�`��-�a�����8�y��V�t����5�$��oy�w�y۔u/��Dޕ�Ͷ��d;�F�
�r���o����{Yv��eڬ0�X�Hsvo7XjnTYh�5mWb�Ş��2�S��Ej��ǁ������,��<�:t�& s�lo���0!Ł��f��^T�mK�/%����T�7����%?��2Ÿ,�̟+���hG^�)·�<WN����L-j�~�!CX�H���SZ�s�
!OU�V�R�l9��jIX2�	��
�B�Mysۃ�߁,WHÝ,6b1t���N��Jq�li
�����콺���y�-���<��X�ʞo ^B�s�)�|��&EJ�2�q*�O���<4�6�q�!}�t�U�Gl�Ôv�i:‚�g���]�<����чQgU��U ���#a��{J���D�ښ�*�d�����`we�_����t( ��+G�P�0o���:LI��t�Բ�L|��u�v���f�PP�ۣ�"�Q��Z3�9�8,�H�l졄�Oy�^�p�wRUS�sfҕtmÒ�h)���YJu��εG�}�zW�aܣa��r�� ��(�}�F��<Nտ#.rK�U����"���%K�&?
�-�.����أY^6>0�N�qݍ�?�EO����j{)��7R��XE�P����)!�#�X���I��I�z�׽��J��~�9g�n4s$YUH���T�4�h<α���X�&�s6ܜň��m�W��Ю<C�Ǒ�F؁�`�Z`~=����7�~����=�Z���3�櫇y'�h�i�
�W9��^�<pY�G����#Xq%B�nr3'�s0/ԡ��zm���ȕ½>��Q��i�����ET�uĂ7]�m�S>�X������K�|����Ȋ�x�}�����FCN���T� �w�A~Oڦ��q:9J��*������:�9�Wi(�0^B=�Cp㙺�K�ޡ���S�p�VwdlGZ�"B-z��ruu��6L�\�]�?����f�=��ٓ�1��01��x:��W� �s��FglK�D����=�[F9,!Z�B��cF��r-'�
,�k"ڪ�+��n���棷�U~~����o:m�Np�M�m�"�y<Э��&E��}�𞍥��H7Y�3���r�Ay�]��]C�(ý�ydž���?��0y��CI���h����7����0�XZ�I��f��z�x3���S��{@6�V)[jڕ�����>�O|�{;`~@��n:5��%�κ^`a �N�׀�_��	u�r���D�B�Y�G;�q��+��n�=���}̦�g�a����
�>��Q���ڊ��5x<5����r���Q��1����EQDw��ӥ��5�%]�a�\�ÿ�rF�s�)���l���h��^��U7��>�D��l1XR������2q��a��)kS��9�P�_�$��h����W��S��{�O�S_����ń����E�"1�`������^�C��#ڹ
Js�����Ό�/Qߐ�g�2Y�˂��6Eq��</�|[�(�b�F}�7m�ch]k�]���V�N�
PױwMb{����NNJ�?MG�XX�$eG�2���m!�K��#������SO���H��9Ų�|"�ﲜ���Ux���@�&��P�{��i� �E�P�V��9�=��\C��o�.�_x�`[���U64��Ã&6d0H���oh��"�2�-�%�����k�1�,�M&�n����X�x�^*���|�ܣpZ��Nd�Y����{i.�/�[�������4��΋_믲'���DI�>#.x�<�zx�E���lՋ�c[5�b\�v��q��d�?�D0n�ʽ^�:?tX�7TՎ4ň�������D<0s���I���Fط��x��}�x�����J���=߁K8t9�(��C�I �^�� ����ۦ0�L׊��-��S�F�f�es@�.�|�6�=�݁'�7��PKk�mW�T��qnbsetuptools/config/setupcfg.py�<ێ�ƒ��}d������'����8	Z�∭f(RaS3��߷.}'�;N�,V��쮮�{UWk4�}��P��ﺦ��X7���ܷyW6�ش�V�V�>]o.W+�)+�ҳ�G���|!n˪Rl�B�][��e-�+)6�n��G��F�N��5m'uf��J�|�U�y���k��<��ۺ�/��n�J�/%�Bn�}���1���ۮ̫#oo�|��w�,e^$����y���g߾���x�WU~QɩxZ��9,8_�Z��z*^t��ߕ�����Ϗ;�<����~�C_v�׼��_jx19c4
���J��m��b��<g8�r�~\�g�14˶Nw��:�����c_�r+��B��=���7yU޳����V��hx�����n8j'�妔n�?�'?�>Y!w�\��fZZ�D;�����N�X�z����F��+�U�G>_��bO�"���#w�7��^vy�w��{��̻+1g�X��)hM��+����g���Ϛ�PfiP0Er1��#-a���uG�b�ȕj�%�*�i�o�h6����Ϝug���t��]#�����x�¾dEbb��{�����b�m	� {y���2�a"�oq{%[��vA�V��B"O�g�W�g)	�#���L�jC�iU�$�ݗȶ��`��_ <CóWy{);��5=��u���b����FC�1Z��8sG���$,o@��L�M�ú��u��_啒�����Vf�hƆ�ߟM�G_��,�@���З卬�x�Bтj���8�~�bB���] �T�Ե����uSHk�z��֜�[$��L�����L�v%�NU2o�WbӴ�����R Q0v���Z6��l�J�|M>0^z��!�H�U=�.��4e�$��1���h�j�Y֘�`��k�%΀\0��+o�� ��p6y׵����$�S^l	�N�-��f�_��$@���{^SΈ�F\��b2z;^$+ԨZ��8*%�2�2�X2`�=����.K��Y�ù��ݮ:$ej�n�V�r��`&����5���:���3kz���z���O�]DB�!���X��J[o�\�.Q7}�
Rib�@t�a��L�*	H��44(;���m".2og6�ZЀ%�1�7a3�¹Ц��}�3"�7�+X;M�eh�#_�"P-n�D��/V+��Ӥ���g}�7�����[�_(�?q,�]o��Q��n�̪s�����0?���J
�
A���c�PDK��m�+c�Ҵ���B��`@b��\þZ/yw2��U���6�h�m�[�>��&�g|�+5Gr����A:��Bt8D�T�kY&ڞ�
��wK�4���%�h|����du&8��ky��C��3�5��\�-ޤ:z�ySr�O�(��5�����nJ��Wm��w���7�؂{lr�t��)d�Ԯ�:��
�q�8�cn�����]��Qլ�$Z�.��9w�`�S�@�p�"M��`����<d��B�q�Q�q�������8�e�1p�@��8�G"�
t���o��*Hv�j�"�ҭ�A�Ve��E�����00��a�cq��P��R�ާ�*�7?��u1�|>�I0�C{��:Ey�|�\�<�_���
���a��wϝjvj&zY�2�@�L�dP�� �s�P_����(J�{Ю0=o"ɷ���[�SK���앴��@(�An��E���sh�+);P�[��\���j�ʗT��
��nn��$>�'�F���!��>�C2�w��4R��?/�x����^k��ʑG⬀�ʊ0:!����݃?
�)�=o[��9��Z9��斂��'a��#�.Z���Q�]gm�t>S��[��f_L�m����|�.�ռ�d}�m�|��E�%U~!+���T��Hs�Z�`�pA�?�:{�6	��j`��[
y�l�`�TF�y�/���͕I���"6�ً��lw�8��t���ѧ#���U�\�?��RZ[�e��<��)ۦ�g�e���h���k��Z�Ve
�Lٍ��5jrw��3
9d<�r�T`la��h=!@�6�� 7N%�E��np6�Ӂ��Tc"���ܛ�1�	��Go`��A��h��t�
i���s*m~���\R�b�d��tQ	B���~��Ђ_x���/ ��5誹��ʗ5�JZ�G�;�?w�R%��h��m���W=BD���W��N�>��KI7���!L��;S��~��K,����S9�>��7�]�[�x�L��	�*�L��,����;��[u�e�ޙ�f�cm��VZ���Z�ސ��]��|O�?�J4�7}�d�v��A}�4��-�*� �ж&�Z_��.���۩���^Maw��i�<���
���c��=��Dž\W�|#�02����3}22G
3q�?	#[s���=�e�XF)d
�>[p��tF�(a��@��J�K9TZVTN��a8M��F���FMSe�9($�I���4�����4�HF�x7W�������+�Hщy��7o�Hsl���:_b��뢬��zgK�ڗ���>H{>�'$���M�g��
��B�i%����V�?�ı�w@�/+��2�-x����@� ~�f�9�I��Y��,��H-2�w�eA�h^qo�2�iiӔ���V%��
����]2(	׍���pY��0ބ.rеD��b<���Lw�8O����h��ђ/�Wa��bMt���� ��
pI;��/����ؓ/�{�{�s	9�U
V� $�?�>���}]��s	-�6�a��-㇋���/�;>��Wa���MDs�m�H52�`��X�b����2���dY�����[�tRp-�Z�)N��kE�|N�%6#�:!y ^�y����㳇VB�O��'��K��Xzx)��~���P1.�7�U
��9գB�d�}+̳a�bh!�`��$��/J̯���%�J����H�(-��Dþ�§I��%&aI����n>��<!aY	��Ĺ�&􁄸�j��7��#�Բ$ ����4=O�o�hd*Գ@z0�訡���#Qu�,jbZ:K{���f0[#�b@"�$�ug���k��L%j�2��x:m�O�1�(Lf��M�-uh�j�GAי
?�!�Ht�V��>��	&(0S:�ӵ�H�Lǀ��,��aB�_֝��hf\��;��98���&	g���T	f%�0~Æ
�Ε2���AC"0斁�M0F��D;"FrJ2&%v���h��+0i:�pt�O,Jd��1˻���N��#1���	&�1���b<{��\����R�s
��?F?t�Ц��!*�{4�g�%�ar�D�g��3X�q����g�K�g�6�;��)����b��AL"�D�,`���,B�Ϟ��EK��$
8A�e��B�UsKj�6���"?�u����'-%��j_�X���O<�vi$�P8�����U�5.�b����5�_"$����}
�b����P� 	y�R�/!8b�`	��3P���#��׺�5����ȃ:d�f&PO�Hbk��_.3��H�X��ݜR����|���1B�<�����o�! �0�#�?�=S����'V�!���2��/j��}5���,A�
��2%����PͱFR�(����R鳖�g�%R�HJ�/��;o�d�e5���/��X 'y����<���\A�!�qe�H����K�������($��O�O���؞�웧?|}�ݏ_�[`�j׏qLڽ�z��U�#��T�4E�+������QZ��k�8-@O9z���P��Zp�����t�`�P׎6P_XR���{&WWr�;�Y,\'�~�ʂN3稚f������)�ؗj:0�):45˦�׉��G}�B8�l�r�;%#�x/��)RYٰ%�����ޕ���I�]��Wt~����R�X�&V�A�:��0��^
kA��]P��"�FxR�H��&��I�?�~�����p0��ɢb��M�h1�SG/I�z�5���z��{{�A��O�H�gC�up��1$z�x�=(_~7�B����۪2Ԛ�734*x������Az�pa쯥��[Z�w=�m��梖
��@���r��NjK���%Ɔ�!�3'��]?���R�4�]Ss�p�&w�b&��R.�dnB�"�|�j�.
���(t܆c�w�}�>�jϟ役��h~Z��������=�}so�ۢcR�ۋ"��YĶ��Ć��!w�G�z|��������WVt`���͖��L�d�	��n�i��z=�75�\�Vʝ�F��t��5<��$��Sl^��y�A�-�ѐ�n�G�I���ku�d�z�9�50Um%G���#wL�;O��$G�`�l-�]�:>�rT���Դq��m^w=��뢲r��O�af���\<]z��A��o�>ϛNy�&����Μ�l�
�ud1Wk��O2�nvb��q���,O�(��
�F��#@��;~ޣʆzԴ���>��^&U�P-�+E2p�<
8=T*������&s�U�KP��A�:4�SA��y�Ce�n�ST]���*7Y9��$�yq��!�6�=\S����t�v��(۝�.
[b��EўQ6E�wX~�
G�_�]�gz71l�%�#�� �t}��b��o�		=��=���6�#j��{:���ű+����4K�gt�`Xg�_5[	�y)�31޷��)�X�[{�
&[mI��G�to���?F��5b�����!�/��Ǡ���$x6Yp$>��>H���B�����O%��E˗�V�t���8�?�j�!O��!�*

޻�f�a�ن���?~��G��/
-yT��a�}�h��³�a�>�����^5�og�:j���
�la���w���)s��RE�(��QN���6��&}�Ɵ�C�v��˞�r�#�l5�y�
]�B�ۦ-N��=1'ǘ��0�1>�&�+@�˯�l/�rnc�$!�̹�{�u�j•mtUʶ�co#!��%�;�18�QѤ�PM؞$�o�
톊`��9`��x6(N�}d�~�\�����\�qp����g�����8�{�g;bx
*���X��@����x�3�0���ƍ{۫�kP~�0�\遫�pq�d��R��͚�.�ћ�	l�s�;��Z�'��R8��_�V��ؔ̿Z��i�h�u�7�60w�o�񙏹=���.u��k��RT��oa";���'����
a�o��at�]5ت�����
����r��
U��_���~��&3ķ�I���D�h�).Z�5{�QG]�ȧ��/p��E(�q�}tY�DVp*�Q�IJ�F1��sz���j���OoP/-�.��w������U��.�~��5H�����g�h�����#�[�?fW���J�� ��o��y��XM��r�^�"�rg��
�;�?{Jg��s�8\�o֒H�}-�w��蝊�7��V(�*U�k�䳽���M�%
���Z�W4*]�7쏨�Bg�J��cC��kpSr:�
M�!
�[�4��165�y�أ#�x�o�z�ߒ�G]i�ˬ��z[��G��weS�*w��7҆V���1����,��٢#
�P�d�)L��
�}��+L�����'�R���[�k�2������ꞩ��r
Ji���@$�|�����q��4�rAo_�z�u�OVG'W�����}Y�h&�W����ebOx�yKf
�l�k ލg�:^�q������v�Re�hkE�̓S��s�džŮ��g����*�	�~+j���cFܝ�و���}�.y�Gs���J�K������.���L�U�'
�,I�u��`?V,�{���`N�9p�?�����=.M�m��Bp/(sgLL�x�MCxp������/��޼u������i�
 ;38O"�c�-�,#3'�c0R�<��r�!�CBlH�]�-��y�V�U@��Z8+�����ҿ���M�LׂD!V��]5���X�=�Sq �̨��c���:p����7^
�$,��\���^U��7W�Lj���b���f9$�K��@�I-��Jح�Ռ��'�@�Mc�G�����5��Ÿ�E4{��:&���{����S$�Y�����('��f�����X�L$wR����o^7u�����o+}Ó�Q�_�dfJ��,#
F�kv��u?�y'����`h�E�g�ލ
��MEwM}Q$jS�Rw^S��T&ٌ­.�\�]��~�at����%�V�i���;���eh�D�Ȋy���{��PKk�mW[����1setuptools/config/_validate_pyproject/__init__.pymS�j�0|�W,~�A�Z0m
-��\9AQ�u�bKA�s-���l+�8�Cb��fgW�5
T��ޘځj�z�X��*����{D
���^Ե����AI��y��R��(Zk,��ouJ�B�X�w�D�J�ѳ��Oo?����ٯ�k�ߊO��i1_�J8��(Q�?%Έ�.;p1�-H2Z<!׋^�3����c�pNNq��N��4B)��/Ŋ?���w]�E{��W����{#|�$�X�����y����a���l��?]�JO8עA�'4�ZH�R�2Ho�|Jp�e,���q1�T�D:A.˻<U���*���%h��Nq^X�~+���_j���dF?b�4���N�w!��!�=»:���6�o�`v(=�.l��r1�ޱ���+�_r
�PQG��*��"Q��dM���?h/��"���Za [�M��n����kV�fW
R2r- ���]^�z$��jX��PKk�mW���N#,8setuptools/config/_validate_pyproject/error_reporting.py�oۺ�
>�
�Z��{�Ax)^ָ��ҤH�>`��B˴�F�<JNbd�g�ݑ�HIn3�Z��;��$כBUL����En��b����,J���`��5K��U&��옕5�J(
���o,��"����n���|7d'2�I%�
5d�����J9φ�R�k+�T٧��,�e5��FKxFA��F�y"RA��=�7ؼ���<ۊ�Z(vd��DuJka��|-�$�������b����������mY��`�`�ۨb#T�;��K�K</�Yp+v%k#CM��+��V.���	��!��h��ּ�JK��x(/�
�6$b�ќ��X��\J`���O��K�ŋ�n<!��=h�������xr��M�	'֛��L��g�d�����n�p���?�O���w��`HJ����>������i	���Ƨ���8��x:��_�J��b���U����ǯ�9���~�}�"
�A29�����t1��~�Of/��`}�\�8M~;�x~֘J1�*�
5]�y&�,��BZ�R��t�dB�.H8H3^��3��㕍�*Tx��X��A�r'��kc�l%�D�~�9����qu������d18_|��#G�N�&2�/|����,����_��>���.��5W�����[w`�wB�@�E"����f��@k%-"�ؽ�n�>��"�]��/�&eD
斕�ĺP†�-�\��Ŷ"���L�
-#`��Z=�Y�"u���C����%�{7p"6�v$��n&�Df�J��#��b�hx^��V�D��z���d�&)��?!$�mVED�@o=���XA�r��aX�,��JJ+X�[�G'�}z���j�
}p/X�s@��J�%V ڢ�_�vע�){��)Ic�a��C�K|0���?��+J(	y�;�"��!�A6�aY��F��]��!6B��&
�O��DCs!��U���(1���.�q/�}��8!-&o�O�����jr~��qɳR�\2_CS.]�?YȘ�g�|��1Do�}0��H8J��oKH�C�R<s��&	�8��x�z�|'֠�M4
4k\c*
�Y�ᔨ�*Gp������� 	yx[�Ԯ1����/�]
	�6Zs:��h��Q�@��Bg����6����m(IB�7O6m�һ��։Z��wRBX��rG��G�:���Ԝb/v��&��D�͉Q�X'4[^Pp��g��Wo��]�7�!��x���
i��T�_���|���f�=g0v�����/���������-��kQ�aQ������֠�-6 �]�~֒��f${
o��k_�Ǜ%~�7��ͥ���=�̩9m<y���Q�I#��!���<*+��K��	�����R(i�9v]�j�ڞш�����
V��5Q�F�*�	�o�V5%G�k�n;���>-'L<�[�Z�����!�Õ�䘾�&��� t���������\���hZ9��x&��#u��D'Aj~�ϣ'��t�ۖ_����Μ^�	Ԇ�t�Ԩh�)6a����F�c�y���#b �-`��k!�9�U���j���/�!��l����İw�^.�������%��7�5�􃢽��z
�\	~Q?_%��Z�G������:�,��ep2�|{1����ף���[j��>Zl�m8�V�g�s���^DSHvqL�F6��_�'��g����q���T{���u����dr��]|:���u�T�d�nr6�J�GJ�=f�v�]�]�K/kɢ��B���d��bLs�%C+Ya���!k�����\��<�GVS�hM���E��*�,���I蛏��{�qً��mI=�P��'��Z=s�̼�=H2�a�w��ʌ[b�BZA�$�e�,�.0Nh4|qv~���ڰ��01�*[P%Z]�s�{`9,����Tm
��K?�v�QR�<����<�#��u��d�_���b�x�6N�XK�C�ƥ�Ϧ�%���:Zi&)�=t�����t#�ڀ"߮�а��d�+��[=��4�)��lß-b���Q�Oy���v5
9�czb��F�#
���[���B�h,5�Oѫ���?��|U�t6d޿q@����"�]V�Ծeh%3w�C?Z�ߏ��'!��/� ۄ7c;:�a@���]G)��O)�Qeӻ�U����9�Hl�2��/�Nd��+�����O�b��:8t��1;�x1۳�F~SSq�N���٬�Q(F�����y�<&p�7q��bj"{h\��r�d��aEi��:�j��P���K��J��m���m=�I�Z5�7��=T�&�����b9Op�zb��QC��uz#�E������J
u�SMah�+���i������A�,F�y&�a�S��v�ʗ�UYx+vC>#�^7��K�
��Z��A��^�Ӑ�Y�"\-�y@�bGG��G�|T��$(XR{�I2>Yذ�� �z�`�+�С$.<�{���f��T@H�]|u�	H��-�L���֣&R��M�q��o�S�-O���{��?T��A��e`fJ-q݈p�^d��]qD�{%�(���Js�j�ֳZ��Ll�~K�n�P��۷DQж=Mx¥�
Fr�RZ��dgj�:��~�����-�}�� �~�Z�l�H����X�k:�5���
ܸO��'eQ��E�%��-#x�8��t  �K`�#��ƣ�)�z�2UU��v�h@GDa��N��Q@�7u�k�[����I@L!iS��U�AR�-t)Ч��͐�s��������bL��3���f���M_4�Ar�Ԟ�E���%^{���s��?"�o�}-��i��)�{�	�����fF�P�׷yW����/��I���囵����!{��F��?(�Ui]�l9���"�-K[�x����i3-M�h�S;����># f{�
�I�F%���F�"ϟ�Ae�m87���P��7�k�?VKD>b����>�z!���uZ-^��Q��V��Y�z�2�>�,�E�H��+��zZa��y��f�� �ވ�u������""v�i��(7��/���R\�lgZ�����VZls���uS�7qN�˟�Bf܎&C7
���d�7N�w�I�U���#�Ss���dij=�
g~H�Z��#�&��1�C����񥨬�x�G�����h.���Q��X���~��'�~u���t�%X�:��u,/x����m^�u�i$P;p�E=��כߝy���
�A�= �_��1��2�fJ�.
^��H���Q'TR�!��kg���[&^R�O��{�^Wĺ�2i�T�#JRG�)ݯ�I�7ܛ:I��E]�;].S��0�43�8���W��-'���5j�~j����+L|յ���)}��%{Z��k{/?X7EN��=��5�Yj�]
��g/="��@�A�=CTC��~����o޼� ��o\�Z�Im���4�
��_3������u����
i�g��r�ɊX���g��PKk�mW�G��A�:setuptools/config/_validate_pyproject/extra_validations.py�Tmk�0��_qh_l���`� �t�/4n�(%U�s�M��$w3%�}'��Iǘ�>=w�<���;����q���jS�
��d�(�Q{�Y�����I(Y
/�v�EVʪ�E�<x��������,��"c)���6��K�tt�P��R3v����
��)�3VYS������åh�ky��J����Ʈ-�|uP��r�M��y��r6��c�$�K�����S~�Y�*��Ӣ�E�n�1�C��Eal�;���o?�R�zQ�<C]:��[�`��a
��U�M�^Py��BV��U��Wr=%�T���J��
��J�`��P\Ӊi#M�Pq�X��qQӍ���>B>��p^lhQfp��[�_���}�'��8u�����c*ދ;b=��,9\��{��S�-5��w�B!tX9B?ɒ�
�[�<Nܟ���G��W��3�J�hA�(sdH���5��5�V�!�A��ڞBz3.�S��}�!��)π�O���&�'e���&��d ����=��qw�8#����e��L�o��|���8���WKR�k����PKk�mW�o^7�LBsetuptools/config/_validate_pyproject/fastjsonschema_exceptions.py�TM��0��W{I�ZV+�Vb{!�Xĥ[5�d�'�N�Պ����gم�x���<3YT�q`h2��~�����
\�Hʢ���&Zމ���j�"�qT��Z�`K}��T��}B����~CUӍ1��-&����YXߢ%�6��8C�3�
 qJn���N�Iu$��pB��Ai)��v�d�a3�u�
�;�
7��2eE�I��I��笶 kqK,3)�C���B^�_�4��:+MqD���@Z؛��$��Q�ECpXJ��
��:���".GN��Y�W��E����m��Z���ø8�Xx7g�B��Q'�*�:S'�6�Wqc@€h��1x��2�hQ�����=�>/9���2N��"s�s����7g���V�T�C�E�t]l�x��eQ�yy�k|S+z�˶����5H��B�N��Hq{"TM[Hؑ��pq��.p!^]��#�i���������Ax��`��|�Ԓ���4��
�>��m_���5^u0���?[3�t&:�u�G0�hvyD4���3�c�����<v�?� /��%^�yxӶT�ߞ!#�[�԰��
��	��mg����n�)��̎AϮ �VO�����At�ҙ���b}aN/prNl���������[�d��x�<6<;��PKk�mW�f��WLCsetuptools/config/_validate_pyproject/fastjsonschema_validations.py�}iwɭ�N��b��,I��E7����;ގ��$�Q�ْ:�nR6����U�U��dS�]:��ٵ�P(��o�����7�F��<9����,K��C�ӑ�:_����(�?��t�M&��J�8H�l����*�_E�4�ϩ�'�v<��o����͋�'�N�g��W�O����=���ѳ�oO�����Q�d��M�E:���Ut�L�,^$�h8%������_E�Q��w��&��g�"�\d�IԻ��ſ��4^%���|&�E
��x�������29
`��'�����������W�`���D�����w�`��p6�&v�O{]����
?�o��=*�}T�MG��%���?��$���������?������}s��7�f���������}��(����q:����h����YhΏ?�t�i<�I��"�tL�(ѱ�X��~�~�/��e�Z\ͦ�Yv�O��14��|���9Bt��q��ϗ�x��'�Q2�In���*�D�,�`��^�(�t��,Y,�i��뫻- ��^��YDi�N�E<
����b�7�U�i�8Ip�ӁW�"�H�y����.ba��ٰ�q����NS������A��AD��9`�����,�X<��!oٍv~��D�zH��[2=d�?�1(1@�?P1��/��8���Q�ȖC�$�����j��p�=؜�`!k�	�ߏ�|���K�~�g���>2]İ��e��]���H/����X\%�ZG�g�*_$�^�͓����i�S6�O�|X��u-8x>[f�$Zd	���U:��>�y��}�L�=v���d?
��,�5_��ch��fC�
��"��ĉ�ʗ‘�����qͦ,��B�ƣ]����tq���w�= yF���x9JF884Y\��\�x:���r<B�|簎�ʓy�,~������]g��#ţ�i<~���I��B���q�������Cy@�>vNi����a"c�dɘ����dɿ�i�!���,^���E
��T�HBc"��1�'#>:��|J���B�'$k�2��v�r���mϯ���_ߝ���'&��p��i�RZ_Pl��#߃s�0��Uy8}�MbP~L�c$�3�[\{��(g�7|.�%'~��?Ï���;`�;)�D�U�}��Zp�`~�X-���`z80��W�4�b�U���>��]:�rJ\)]���l�!��3B���N�8�)�����^E�۞":�g����>��Ѻ$���0b��sߥt�pL�E��P�
oh�$_���cS�g��H콿�{��ɸaJl�"~p\'�T8�����߱90�u�;��I���e
`2��HqԈ�4�h'B��`��g��O�XtX��,g�zB�;pD��|9G5\�q?��xP~���ѭǡ��� _N/�G��J25�s��I����{�g''K�߿2L����1�7��1J'T����8z{����
ڏ?�p���C�Y��s���[�֍:�&IL�&O')�1dU8��*�p��X��ѳ�ΆSMH��`��� ��}��9�N����"�� %0���烟�TU�	�W�#��9�7
CC{&<z�?@����,�q�_Y�L&_^����]f�C0��PQ�A�+�A?�0�}�Ҙ���
Kte�d���ӕ�O���j��L%f�c /����Ȁg��.x�`�ù�IN\��F?��άn�7���;�{�]���#*�
6�&��^T��^D�j0���<AbB�NM�!��9��Z}3��n�:�.L}V����
4w�|��]��,i�@l�)M�v�(*	.���(��,!-�\���eVm,�O���1��p�i]�
�p���D
�/�B��\��3*y�`}�>ɏkN��\��)T���]��
���j�'R�9S�Y#�/�i�-�?Uӆ�n�
�؉�0f��z��ႁ��=,,�!�L�L	ID�<����&
(�7E(7ev�@HXL
%3��|��
na�8@
�;����#Ƌ�
X��8�P#�]\�p�eh��1!A�9���?%L��'Ji|/P��cC�;��JLw7����$�/B��?$��p1�]�yw.�9q�#�D�s�5O�lx���(ŁΗ�����,��<�]�h�X���7�O��lv��Y�������hRpN�>�t:`�Z��Φ�׏U���m���@�e6֗����	��0%���.}}0���8:�of���M�����7:�它�݀u�+=��`�Q�V���e6[����݈iUd���.�R�@F����`�*���q_1^��"}g@�E4��m�Z���m��2=��e�����Z�ޣ�ۨ�{->&�i�`P�Z4(H�ߐ#M�ȳd�\�S�F���˜�M��q=uc#�4Gy-Mf��8�/��!c��i�.4�D��!�^��$�v��hw�'�>��%`*ߣ��D�Ne#���̍/̦#L���b�4�,�UXbV�@��Y���X�Q������/�#���,�4�r���5^̲՞fe����L�n
�9[�'/}ͻ��gq�M�r/��v������m�jOҡ�)�#�$�;�� f��5���z9�ԋ.&8�pIB��)f���MD�5f)_�fcӢ�L��B���*LY��rgRtcC�SU!C��W�Xg7�I�N<�ضɢzVO!�3���GC��&	��.n]�9ѫ��]�W_`�cP�	n��%�
�Y\���<)�?��|��A73�fi�H�4��c�y�y˗�a&,1$� ;2w=��'vW��p�qh�;�Jz`��ėٴk}n|�%���N��`E/y���ֺ2�n��<AZ6�2�h	����R����9*��"z�R�N��f0@�b2���k�gb�U��d��l�M6]	U��5E��r���,��˳J�,<�e�A�k)�N�f�*��f��:b��Cd���N�'���K�\L��M���Qm�)#NxZb�Qlyj�Q�Kz��A����ٔ\�K�ļ�yr�����]�$�����?��dt�E�!6	�>�
GYqn�U�;yb0�2�˨T�С�aI�]&t��>B�O�Q�^pk��<�r�^%+��(��Ox܃�L�k�$QQϓ�rN�7͆���7y�ҙ�
9#`��}�w�����1Muy%��=��r).6�YМ���9�NEIJ��\�ge�{x豫�f�UR�r�G�3d�g�m���"&��US�����'Fi��g�ϵ�\�W4j]�k�oN�D�>�l�r�J�2o�> 痋��Q��s�"��C~�}��ٓ�W��_s#�x�b[���>�/�:�蚏���!sF\o\=~L]��oT�G��i�_�r�m
�ͅ����|yN��ɹ���i��1P`���"O�(�y��۷'�N_�=z��͋����'�\�X��_�g籋N
���r�+'�\�.0�jcK�i)g7M;�p�ҼLM.9����(<&���ˆ�I��y�h5b����c��[��J�/yR~(�P�mG����`��M����p¼9�%,ȏ�$�
�ʰJ~���)��7*�sH�ѿ0ȕT�����Ղ��Y�[���:��}$|�0���@��l��wQg����.|à�s<!�a@S�_��J
�da����Й�6��T�'��B>�:�/�/������w-��I�+��v@Uȝ��%w���E�+���ceËKnYD
��Lvj|^-q����0N$�(�3�C,�O�N?�J��/�����i�M�`)"��>1�7��z��hK�� {3�pCC�'X�=��x�9l����BuYcEt��:�K`Z��F��\�x9�1��
ο��K�V�����=ǹ���b}#��y>9׬GX�TXq��9�c�:�I�y|a����i(�~q�.㕴��D0'sX�K⿧�q�p���Y�T
��"��A�㜖i��%�;1�Gspv��9���e�I�y�f��%x�;K&�-FLP&����,��E
o�w�/�J>-P@+��.>���+P�y���y�A���O�3Fh�;�..2�/LFO��dĵF�u4n�˄Gu�Ji�H��W�=�$���a)h7�(�f�Da��8��(�����5��%CK ��[�"F�ͦ��,�v{�E�e��K�@�=�/P� ��N-1#M��]�1�)Y>]��,�<&}0������0��e��?�.>@`�
�V�A�\�R~'��Z��[��*$#��J{�.�b�Wv��Ww�ұ{(�,P�j�E�p��w����턹P�)��.��pԨx��`��]%��/f��HG2�/V[/=9��أp~��u�.��f�8;��|DP}�6Q+�B�;�U]rW��}�y��F�I��o����b� V�ɉA��5_�vG̟���;�}Y��Jq�T��5b��8��s�����[v_�Fp1~()���pd�P��t��m��x"��턃8�׶bP�� =(1^�!�W���23Mm0x����Oޝ���àU/���뜱��S����h�b���
4��E��0({���/Ch�	�P��Y/
/�'Nd����$���%Nֲ"b�?�C.�'����\���Ծ��PY$�`��P����?;y���ӓg���p`�()��x$1赨nf	��G%��
���(=RK��]yZ���'&(2;�SKt ԋ��l�Y���i�0Y~��qX]�ۖ�p2"5��)�KIa�����,X�v�xʾ2�6͠>�NYA��>��2�À�ŭ�ߠ�0�DCќd�F7,��hXuX�&{ E$�׍08�����(�dL
1Y��0��e �ú�<Ŧ�1��U�r6J���dd��$gAx��`��	%4^y��f�v�3�> ���7R3mG^bT7�(�(����P�N�}��s����Q��z4ю���3hK5�?q�Fb�
f����@�)����c�!^�Y�͋�OO^����d�(���7����W�O�3���_O����w���8Yr�y�11�!�}�"ؒ���h��s0`[����":S��@<B.�򙻌�QbɚD�W��S>�Q�(n��f�@�x�H8bz�����}�$F	���Uz�Ա�D ��ڛS�&�x�c�7�;�8)ݹͨ{����l�����Y����$&�#H���N�&�[�~WyT鋃�Oaҳ����"�#��9��F;�oء1�v"��S��	��!��앙��V̘-�4z�
�E���ɞ=§7���/����>�K�s���mď�٣��Q��͊`.�%�M�i�9b��
���_�G_N'	���b�$��[d�{H�ž pv̚h���V�YA�Z;�h�#��ӗ���*�7�
;���sɶ_��e��:��c�	>+e)a�Ж��/�Qu��i�����T;ƞ>n̰k��?ּ�n[ �,p�ngjhtᐢ{��x*
�h��x�W���0Ƈs����;��^�>�
�����m�����p+K����k�.VS�@�&��e]�_���)�q��u?����}<��>��")A� V�!�
��S׾�<�+K's�u�E��H�uC>���&�	�hB>���&�	�hB>���&�	�hB>���&�	�hB>���&�	�hB>���Fэ�!M�G�ф|4!M�G�ф|4!�C�G�g��c6-������}����Eר�(˦6.ʰѯ���S��{woO6����T�ѳL��^D��=�ʍY�9^,�~{�w:�:�K�i�X�͵Tw���6�(Bg��U�N�,OW{�5�B
�P�˨�U�N��f��Q.��‘�Õ9P���z�����+u���]<��kl�lx���C�S�M�<*K`��UVyY��^�<e�e(��ǒ�0����ce_���k�q���{�t\\�Ծ�/�;��硊3�R���n�qb�M���{r�BY%:w3`��XN���_7t*t�z�i��7Y��cN7EVu��^�Vv��U���?u�Ag%�#�$����½��Ǚf�þW�e�3��s%�n�:=vZv��dz!(-�����j}�_�,amh]���ѩ<q�������>�����^v���R����ViU[C��A^��t�U��}�Nk%�v��ƍv�3'�!��l�g��;.;gu��[�+'��l���:x�rSj�e�c�sL֋�;v���	�,&�#�]]����%���@���4x��J|�5��-37R���ڼҰ�B�Nb��e���*8-h��w�ܫgЪ2k�lE�/�|Cޱ	�t��][h"��7�������y�I+���=���kC
���)�Xԭ�W�h�fq��ͯ)��p
�VW�)�g�bj�����鳘��,��'�>���5}�BL�፻]�٭dC�e!�0"�z��
7�A"�Z�ŗ`�-�X�%?fN�e⡌U(c�X�2V��U(c�X�2V��U(c�X�h<���Ke�B�n(c�X��<���}��P���:*��U(c�X�2V��U(c�X�2V���=�`(c�X�2V��U(c�X�2V���-����Ȃ��*�����J�BmJ�(�*k���*���PUϠd#�XU������P�c����N��N�!���?��c�:]��M=�Ͳ,�`�O7G�2V=Ù�DeO,��B ��L	�-b��"֫��`��(�.[P���V>I�y���j���ee;t�^y�@�gq�*]92��-3៑������K�{Z�h�ݞ����L�I�	�x}K��8���z�׵��,x#Zd�j����X9�Q����O���"9ȣ	��(\���_�7�!��(M{��N`�,槆�	Ǧ���3��Q�.�uJi�<�(�E2^�P������фg4���&�=
uOC��P�4�=
uOC�S;�B�ӺG��i�{Ꞇ���e��i�{jh&�P�4�=
uOC��P��C����(	uOC�SaJuOC��P�4�=
uOC��P�4�=}`uOqB�J�2��!�aH`��!�aH`��!�a��CC����0$0��!�a���g	�����!�aH`��!�aH`��!�aH`��!�aH`ދ�!M�G�ф|4!M�G�ф|4!M�G�ф|4!M�G�ф|4!M�G�ф|4޾ǐ���|B>EbuC>���&�	�hB>���&�	�hB>�;�Gs#*Z)�Ud�
G��7��6kș�?߰:k�����4�c5��V
K��؍v�|�^Q(��"q�(mݗ"p!�I�ir���&!�I�ir���&!�I�i��Sb��*�/v���B��@�ir��F_v����(�4
G%�4
9�BN���(�4Z�
BN����+�iR�l��$d�i+ˎ=!V@n[)�J)�j�C��T-�-ܖ�ܶ��{��/lr+�\��0���s�;>���Cr��B7B��=	�(^v��%��i�G'Ht\~IA)�[�q�~ň8��:��߻{{����H��݊���z,(tW�Wnٗ_av���Lko,��Ѝv���0�q�>i�I�V<(�3��'��zZRk>2i�lJ��4�i-%z�@���1�87��G��{��x@��<��M<���Z,��EP42 pl��֩���jo�:=v�����@�c��ib�A������Z��2���
9��e%s���'��';��o��H+���s�j�j�qIw��dn��u�6cD'k�J���dl�s���.�&�m���qo����$'�]���hv��Q���h��T�=������M�_��3���F��η����M��.��;�fr��f��|E{?�'�o_��V	? ��.V�+���[�Y'WY%윛i�v�1]�hh�;��J�ݥ�S�v��b�f2Oy�BO�'���uŞ����$w#���,���,�6��:���*�[�f�O��1E��ߤ�d�<���y ����hl��oo�2�ݺ���˽����Fk=m��0���p��ߦ+�l_�Q��z4���@[{5%<�t5����*e�b���e\�B�65U"�[�R�!�"
�b���L52G߾r�ҨD���Ր�Ki~h����H�ь1��mG���&�=�]�8�>���e%�4a��u������u����D`g���]<�hm�Q�s'5����O����T���9>f�a]�j]�Z�9d����q��_I�:��H��D볊��4��.���r���>v8��}_&�������-��ȪtmI�<���&]�i�Z����U�)�>�6�>�{W��%�`������[I0\~+1|����=���k����@.|m?���f���F�k�Z�V6�nê�z�{%�
ϖ:��wN��<p)��ԿJ���8���+��pn��<ߢm'r��D�)=���-�{�޻~b��w0��eL��'���n��vU�%��x������B�Q�Mr����ێ�rF���;!gdxx����T�벚Z�c�em���l�\��g4��RU�e����4�C�H��ת!k�-��[?kg]$�$�����G>.]��\�4��J��_�4���!�:4��]����/'�yrzz�ջ��g=&LK����aD�6�,�����Y!��o��pD���E��l[��F&0��Ƽ�!4kzjh�A�KV��]^:�J7Y�ޣNT��A���<��*y��_������q��~lJ����T�#Ԁ�]]������itBShV��K�=��G��+���Y%LHF���3�׋e��6�s_#����L�S���AJV�����l��][=��Nǟ¶A]94G�*�l���mS�"$I���L��;nc�7�=X����l���MBM)���-��[U�����hX]C|8���*��=(�v�]��a�EBX�K$Ta�����a��N�̰���o�G��2�������V����4��?<�����I9^������[
��%�+߮�P�i�a����mw��M������]��ڡ[�������m�NӺ�WTo쭈�-V՜�6�gKi��	������f���Քn��ːǿW_���5C�P�#����u�m#��q~�[~'�mJl,����m�Z��s�c��E���m	�eP/�T/����?*8��l�l⽩R�Z���I4#��8�anσ#u��r��+߶��\�8I��⭻q�uWV�["o��GO�]�rT"s�r��Om�X�ܟ�H�=:�No�ұ���O�E��Hs�u��U[h��)�q��v���B� �yA��ٶ����:����ڜG�1��H�Q����J�ՙ�l�m+Rj��%��p�X	Uq�0�Lq�����l@q�2�j�r�`eTV)���|���'�N��q�}r��gQ��:����:�gB�Ҩ[t���v���Lc��V�\9��x4�e�+wn�UyMmDW�<u�LOU�Qr���xxT�w�_5��e�6ܬv�|����U{�^]u��ƞX;�o�!k��Oc_�z�Y�Z���kByk^[��+�y��Z磡+�1B)a����c�1ɧj��N�gf}oo����]��߻?o�
������i�O�H�lOv���Uz��t�-��-�X/:��>G���:�������c����G'��h�%�n!�v)7�h��j�0�P��ޚ�ً�n�9x7'���ܶ�� ���ۧ�v���o�U]Ik��}���>�=G��6��Ϯj���謡{;�`�
��5m"쨤��)�-�m��L���:�~��Ґ�/�R����k���Zp����#ɴVD�����Jȩ�������*w0o�Uާ�p��k�a�-�ج8�}��N)�0fZв�Uֵ�u��Z �B�U�����{���y��k�zj

_%Yk��W�qӪ=E?����Z�/(:xf/Cl_��U?�- �-�\]�%��i�RȲ�x�Η(d[�Fn�9�Yz���5��ѫt�r�D
pP�=��X�#]�F;^�c:��ˆ��X�K�{ٽxb[L�z\+GnX,Jy�r��L�ڴX��c�E4=$�@�#�j��m������RA�S��HV9�p�STY�gc��� ��ON�!��ZU������jk�M���N޼=y��������PZ�$^Q���T $V2W�ӑHjE�S�Y���`U�fٮ&T���8���?�0a�8F�"�8�>0�	�%pm��%I4(lXQ��c��N�*���v�H%TU��
�TČ��r���a)B�@R}`�6L��Z��F�6�OЧ��w���C��ԡjЩa�v�8�"b�����i��)�kɭfj����+��	�6���;�����7�R�;u|}�*˳�nee�/��Q��m���ƀnP�x8Q�fZ��e��Tek?P4ߢ�'A��
@��U�����f].�q�+(��IǣV��)�:��uN���w���p�l��wRad�WF��{��e<fo�6�����j�h�֨��f���^7ºUGG�����M�(�y���t��@���u+xJ��`fW�r6J���W�n��o-f�qr��y�<�@b��[6�}>�����.`�E�=�z={UJfA�:�9�KŔ�J���`��t��4�Rچv�N�\��� y��Z]�� j�X�(���<r;>��_����f�k�E���S������և�V�l�I�:�-�*ߌ2��՞6N��4O�1��]m��
kz7?�Jh�n(
�ʛ��1��_�vi-�����ߞ�{��ՓG��!
� ��pp��y���L�������
W:�OPs⌗~s�&���ŕXE�/�ϟ��z�����>)YO_����W���z}
�鿟�z���߾ۧ��,��}��S�yp���E����cL�0�f�
����Sw���]E�v��6�K��ښ7k�c�R�
"��:���6E3�Yi��;ʹm�N}��^�-�Y�T7�i�{p2Γ#;WZ��Vm����w�Z�y�j�b�m=�+��6�+�j׊��f������gD"<�2g
z�錏g�Y4+]���PX�*'�"�)Ez̈Ӽ�u��lrk���W'!���4��	IF��dMv�}��؏�#�DG�Nρ3_�$F�+W/j�P�fS.�@`~�E.*7��x�'�١�B��j��P��^^�o�3�%�Y��.�E�(�3 ����t��_�G_N��	��$���@o���)��6�w�����;Y��%�{DK��g�lE�״��
Z�b��x	�k)LA�-0��p6uO�µ���7��ˌ������K�����OZ8���rKX�m��d
�ǡ� �5��'[�g�tp�2nY��x|P"`�ż�4�dL�M(�����{��&���C<��I��JLP��9�l��)8
|[4�YņՅ)��De���rU�(��8�x�rx���ᅘ߀:J��2\U����*���|�c_ܾ����(g
F�^;������\G�ʌ���7��>E����m�Ǩ�~:�'�>����%;ɀ������l��1��,~/4}y�w��n���E�W�k��^�����wېk�m���:�BK60���r-T��'�By����ק���`�
zb#�Vu���+`miM�^��ҡ�=���5�ۗs
L�ɺj�k� �E�k_��}QG�/����޾T���Ka�hoc�1=w��a�e���7P�nN%��|�b�kkw�1�v�z���ц�/��@���� 	��j�kk��{��Z}�����?n���k.�ں9X���Sw��L���,�Q
�zc�Ad�Gu����Im0��d��2hڛ;͜�Oy�U7m׫��f���H{�f�=-�5g�~��<�\�G�~Ӎ7^�֮�v���\D���`���Z~n*����P�Ƿ n]i��A����u�֛Jkϼ�Ma�ArU�xu��&p��
���L�r�}��l���Hmh���\���i�����nčk8mÔ���k�3wVj�e�n2�����дY�� كd�T���Y+g��B�ڲ��Ѽ�m����
�am��t%}�������*�-`��Y�~5���1��e��}�P�n�����i꥔������Z�;jt��#�s��(��:g�r-�}>d2��>���X0Sm��,k�����mW�Y���r�����W��Ç���hO$��<��R)�:�k�h�������C�@7kI�/��ݜ�%��6wN<�"v���:��@㶳3꧛X�0<��`�[~�(�Z�k��~���׳�����jx�'�*��o�"n���?l�&��]��y�u�|��Wy뫹�y��JGs1����������,�<e�����y��z�UU�p�
�+ڪ��`��{Z���D��*^8)	y:Ix�Ov�ӆ�)5����h��{F�@�Ez�DJ�Η�x������\�&��s���f/����K_�mq��4�:@���K�?�|�-L1;hg�W�&|�0�"E)V�I��h����dz�bes�o���$�Mi~Eu�p���d$���_�B`k}�T�j2��zQ��|N��r��2�ꅱ�q���Cw�rC	������ȺC��x�v�h�̀��v"w�_�9@���%���
��$]'���n€2dt�aX^3<�ѤT^����C����9��9!�z}zr��J���1�Va��H䊿�׳tD�X��s���ZWtd>���ѮȺ��X�3�~3�=�mA�Bg�~Eap�k�I�%��+��(�N��2u�9�KX*^��G������w��J����}m�M�W&�?<�I/���y>9׬'�X�V�uvN����A_0�g(	�J��K0D<Z�ք.�R�7+[N�*Ò��SՄs8�I<%�S�p��/��x���	!`h������9�8�{ڜ���KٗӜm`
���q��3:T�t�;}Di�w����l�
���V|7�%�Y<$��쒰�E�=��F�!�&�(uq9 ����9��dNV�LI���ۆJ'��z
Ɉ�YN�u4^�S��#3lCG)-I1�(���j%<qX
��9
���t�JE�X���z-F����`ov���鈊�H;3�:���j%.q@$�p�~Q�6�XN�ri��V�iz�ߝ�aJ�m7IF�Ey�
5o0����A��c����$)���s�@ȉv&)�����$r��P�BFq*�ź��'HF��
]1]{�.��ɬ��NG��tdލ6��LG��x��<�&*� �c��2���A
U��:��l�/Y���F��R�m���u�~��X���3�_�5d��Q-��2^OX�:9�^'�6s�)�	�N�3��S�Wd�����#h��n" uz�=8V;Xi�^�v����Dt�JI�HYҌ��»XM�Q�&B�[��W4����H�&d�3P�����x��} xd�)v�F��Nu�]���_ȷq:L�#��o�ǂc�C��S�qb�Ox�/Rptu�E[�=���k�!�h?�pH&�(��,Ç��ȩe��|r�I�7����YT�%�Պ�M.�yQu����S��+Mjw��h;/b�V���-<6y�4�˯��nwt��ٕ4/Pș���;���U�@):�D�8��@���S����ޟ,D��֍��?�.�x
_��y�x��m�o5��N8���r1Ý`�~��'��0�DKI-�45�d�������O^=����i/�>P�e\�q�3V��0����)�[]���q�nE��Q�+>��h�}�D&'c�pO�'k�"b���2�X�`�0��U:g׾���4�Hz�1$T���U�wD��J�~5%bw��SM���
u�:v;�0簳��bBL��P�bBL,jC�i1}x�
!�_�&��b����"e[�	i�
w ܌6��!DB7B�F��<t��E��q�x�|��2��	��?߰��5��+�j��ž��R���W!�R��EK�E)���q�|Q3��gD�.�E{|dK��m�:�M�(�^P�%��|M���+e��Lv8T�����M�,��Q[Q\�6�'���:s��J*����R�b����t&.te�Á�3�m��R�R��ᗸ�0�y�8'f�	�'�����3ݍ@A'���t^���~Zz���C�ϒ�̆��d�uyȨ��|��B�?u�i��f%��.�u�%W�DD�'�l���Vys�����?�
A���A'��ӝ�����+
���*+\է��̥U=�U<��z+t�Vuӻ���1�����{z�g�m����h���l�$7���P�n���v����O��L=ͪ|cS�޽��FPU��l~?�����J�%�E��tt�Z!��_�B\�u\�u]�ޢ��珙���c���3)�h姝aSCoK=#�*�������eXk`����-k��Ǿ��c��9�7��̷�6�Zp����e:�J�79LU�G�H�j6L����ٛ�c����[+�ݦ���VP�7U`�g�ld���N���ˮv�:w��O[��][t){m�7?�m1���U@r�r�y���ܦcW�e�cUа���\P�S��
=��'���9��%����:����e�)�Q�3%|
�A�.���ht��-_~=�u��5��㺢����Wg�^	Z%��m�ՙn��u�'�֗��5�^�o<��b1P�1پt^,��Ëy�[��b��X�׀&>���}+mđ9�9��|8�1�G������b8�#K�*9��m���t��O�3?���8���槯1P-p��"�9SVƪ?lEc�5+��Ý��@Yh|�:gVV"����T�؀F�8v��Z���Ћ��3�*�J*��g@pg���������[l�+�d�0AL��g)����C����Z�zIU"�����*��-e���ʖ���2�j�]* Ut��d��ˮ�1�:�#YQ)�[�����D�����aew���e;Vٷ{�����AX�_Q9Ҳ�|y�`Q�C�4z���Y�r��h��泜%�~��4z��۷'�N_�=z��͋����'�ܹ�u��i��C�2�j���Q<���j8bjf}Kx�\�S��xg�{cO1��=��c�/�!ճ�&1��UT��
�T��/V+�m��147P�}l!�R�-���X�-�q�*C�~�S���j+��H�$�7I‚Ć�H��؄-x{����o�����}��=�Y��VRi�쁢�WЌ�v�ȶ�mTq]ImP�g�M���F1��R?S
%�H�^y`*�!U�(^^�jc�Y]_j��Ef��k4�5$�Ua��o��~(�~��~ �&�,�̗����d��j���)J��j�����>�-�/��i����@�����I{*�a/a�N,d����y�N�l�Զ�53���_ߝ2��,4�$U��./|W�	xA&��p`�T���Z�~ݱ%/�_�V�u�/'����.Z�� �!�XA����ڋ�Ͷ���%��#蜎IvA%H�����dԓg/O4h?~���	��!�,�9xw�-��!ﰚ*p;����$�3�r��bU��"��ɣg��
�,Z��q?�w\�����H>-xց_O>�iOܺEI�@��o�< �ٿi:����a�'p���1M<�&#*��.	�,_����)�c(�⊕G�v�S@�{���p����>�f�����逆�I|-ֱ�X�MI��ʌ�1f�ct�QZb�ɏ��)b���&9qy^��qh�ي�����eã�w?�l^�e������^�j3��.)@�8�72^�.�T%�蛕|D���\�9J�ģ��e�I��A�b<�/,i�@l�)M�v�(*	.���(�yuf!-�\Z��X��f����>6���
gȢ�Q�˻[���Z=��g	�'��q�yQ��)7\�h���E��ِo�fX+�K������Z���V���ӌ���iC�P7Ȃ�e��K3�-�e+N}5�	��g�%�3�؟�8p9�V�|M�RF����H��I��FX�
��y8Ƣ��|I�^�ۜ'�w�8M�������0ҧZ����eY<�!Ng?��J�� �ΓٜU�Li���
�%T�3f�8g��$M��6jHTL�h�4ȟ������q/�ْɄ��F����|�..r��2��H��.A��S��D{�*E�
�+HWE��|߱�V�Ƣ�|��k��'l������1g&vD�A1"i�y��2k��w��8�V��.i��xv٣̊^��i{��f��A1�ekoVo�GE�B����)��CJ���	gS����B��^�֕�%,�������_߾ �t6L�b�t~��8>O���3cԀ���*���ޣ����~V�����M��l9�x݉Z��ʖ,p�%i�a�]&��"�*%	q�(�eD��x���tA��d��5`B�%˖Tv"�?Н^>��Z�J�f�Q�F�����4�����TL�][<�7јl�d��	Ȧk�3�.̯*l�{�s��:�
��{}:Ay5Z�t�/}9�#b6���Y���%wS?.��Ȅ#����),�D���Պ��D��'P
��J��)/|��9�D�A�j��
�|�=],�,l����{t^$�נVr�;|��C��Y�XOٜZ�
�+0/7���5����=t#1��,[�E� =��l��N�3��:/���-Җ���H��Uz���l�jfoRmԀ�5廒"�����>�v(���s����(�Զ/�|�߱�0���d@f�9%�����)�x5�B�����3SkΖ�e}�L�����/	
�-7�ӕ�n٭�-<��ٰ��~!n�ʽ���M}�d�c K�*�q�������͘�@C�"��.|�9�����J"J��=�aɭ��iC}��D%�"t�Q��9�G��!���rJ����8�:o��;�1,��d�c��K�+�"�~J���9��e6�n�A���s	=
���q��}~cX�F�����<A�+��T�� ���(BsT�[a7D��9[';L� �@�0j	��#&Y�eo���+>��T[�d3@�������h}�3��n��Z��Y%]�W"|��SD0k'd���i���J��Ȋ_���;K���;K��E�R�&{on05n�7�m�9
q�!.9�%�����C\r�K�������⒃Y���B\r ݯ�tC\r�Kq��l����Ñ	G&�%����z�W�Kq�|[B\r�Kq�!.9�%���/̊�Ý%�Y���d))��'NG�j�6�zؒ�SبH�N���3V�*�i^l���n��/�5-���^y�o3��Yc
��<"ޚ!��ii��wJ�vΔ����\��2_�v�F���j\��+:�ί�"�m�N���u�x�gYB�b��@{��ά\a�c�ɳ���q5w�O���8*�6;�jG۱T#���T��O����
j�1ՠ�#uɵDp_�nXO6R��5#��F#�$���ٲ?����g���'��$�����/�(�vf�"H6t}��Mi����,~�ȱ�~��L<��[)��q�]�OB{龜#�@��9W��=[�?�I��mPxt{o��� Dy���$njC���>�NF`�"�8���pןɮJ/ǽ@�_����g��^�KC�ΎW�S��d}�u��P{��09�=Ћd{���d7� ���1����^-@R����(
�'Dk?�g��y�V-���z����a���<�[f�S@����E�r����|��⯹^iH/���Eݩxa ܪx���>e;‚F^GX2MaA��#,p�;�8/a��l$,IMͳ�������0�"���b.�e+����	��	�Q0C�ǭv#9�X�o$כ�s��_��#�unU������@iEA�Caĭ{h#7X}ޑv�TA�A�U�:D��_iIѼ
^��m#�DC���/��=���`��]ц���b���
�#����G8Z��#��]7�<Gf��r��r:���/:B�?�{=$����3�~��DL��Cj��hO՚����A1�
k���]���Be@W�#�@�
���(��D�:a�
bd��>�B.]dc�+�Ps�F|����dcX"���T��-��Ӕ���#��?�CUX�x/3�1\��J47
U��5,Uj"ӆ�
�[1u�^��*�h�A
����8$(�d���CF�:��]Hm�$�Aקּ.�_�b\j�6��Y��x{�
�S������6��ߐ�{�l����l���i��F�Q���x��j�R�xD:Ԋ�f!m�����f��/���"���2И�>;�>^�v�z�5jM��OlVX�f��Ct�1�7i�m�̬�:A��y���b9'۰�
0�a��o������H�R���nf�����S�k�/j�4�r�s_�p7�+�q��y�㿗�z�O]sJ8�HN�[1ɀ�1�j����Y��g�ى��i�����ܻ/KP���+��x�8�e���ߡ�Ï�6�qs��e�B#����F1�w)�>~2A#�m��*٠�'ԕd���Щa�
$U��lڙ�e\�W���_�V%�!��@pu�{$LЛ	��
�J�Adn&d/]�:KB��~�@4߾$��V��? W�/U
sUq�F�ق9��'�v&C����,YA1���a�e���~�1�8��B�H�o���φ���E�w���X@3�nF�M�*������R;��[��&ؔ�ǏS)=�ϬT�����߮�+_�ku���v5,R��KV��QZ�u�J���.�oUSB2M
�T�o�:�ѷ�=���ֽ.-���kO�8���Z�-���,{��A>f��*�i��e�~4UZJ����X���&@=l�?H�O���>6�H�)YX���~�@�M��0˴ֈg\zUCc9zI�au��6�P��'R�^ѹ���X��@�q�e�ۓ_N��������w��z�^��OU�n��:�+��8�u�޺Q����6�_���z�A��a���	��#�d�&���TKleM�
CHA-���С�v�}[Y��&x����9�n�<*�e${�:�h� �T�f�H׃xi�f���d����T�D[]'�-��Rg�OE�v5(�����F*�aQ�h�$|7��v�_-�m�S;�j�f��z�0[�	*P�u���R:Ui�J�J��2�K7T��TD壇�hյ�����m���>Z���
��Ni��UK:�w}ڌ�jv�TJ����K|�kC���PVk&<�
�v<���3Ԧ���C��P�0T.�g��/nyi���o��G��q��Š�^��iC��4[&־N
Ǫ.l�c�f�()U��
>�5=��GJ���
���/�1���S�2�l.v�$J�iC��=9j�U�h�8V�[�n��y3����)-�ʸ�a�B��P���U��0+=���xmX�Q�i��X4P�=*�|�=]�|�A]}���[�QY}]�����v��e��H�������un�K�
>�����6��©�5���*ۦ6��@�p��iS�m�����W�� S�P�ٜɉ����}��VvfƏ���b����;�~�Ύ�����|�׈�%Y^��a+Eޒ�����]�k�*ǒ�Z*<LU���O��dk��|r
ޭ�������r���r����e����+h&�چz�P��
?�*�b�#rl��{���A���c��c՛Q���R�gY�}��c����aun�~�}��NE�	R������E6S��;���~h*��mϳ^���\�N+}�A��
��F�D+��Ŧ����h��q=�e'�[���i���C��2�۽o���P�8'��S
�=���{:*=۞Dzz��.�|�
�S�wf;�:fx'�5�}+�1���'���'��"��t���]^�^�wl���g����S*Dd<^E�)'8��|M>a�+���A��#���2c��8'oaA�x�!(x��,��'k�����~�O<�&��yξ���	�)r[P���*�ߠ��!�JD<�2��*��T�6F�R|ֹ~�*�>v�t8|��ެ��a�Wzxx�¹#�t�u��N۠e:��/�$�'�9��{Il���u̓<���mg����7G��~�\�&��P��A�!�W�Gj,!��]
��	P�rtx�/����ʒ1f�����yK��L?�m)��� i�;��g�@ZS�ްT�295\1g��I�V�}0�(p�.����۷�d��h����g�1�$9�iu�:p��Kg�H�+�E�@<���{$�7�Gih���[G�"�n�~#�2ǔ�C̞M{5Uyqt�!Ќ4䀧|9�X*�1�����A�Ւ<�?� _N/�ʳ�c��|*�zS�1���z��n����>�z�%�����)�K\W(F���Y��v�c��Ͽ���:�vE�H���v����ᚡ�|�/.=03�Y�3��4�����%axIX���0��#�L82�GFs٭�!s@��W`^��yݰ��ζ^�������m(�On1|RD�ٗ�n+��d'�|VO����͘�@C�"��.|�9�����J"J��1�;�|Xr�rsZ�P��<Q���8B�`��kn��q6�2�E�G��|��c�@r����Vܥ�ݕ`
`(��uE��z�h�M���~��.�\B��B��`E/y���ֺ�+�|���O���$��%Ȇ�-)����V�
gp����9H0y#X�	�™d��Z�ƙX��C
 M��M6t�^/�k:��1��f��]�U�e~5[��m9ES�vB6�Va�4;��+���/"���,��RkpQ�ԇ��z�S��[�_R��3/KU��\+���W�3�g@�QbV&����9�8��,B���Z�u�g�)#	��9��Ǚ��Yi�'gZ{ϧg�>��R�������z���A�kk�c����G���<�;�:��:����|��c�y�b�A:�|��'
8;��َ;,�Ku��sn��w�����KGs����D��݄G�&�˟GI49�2��\sK,U�6|A&Ͷ+���g=�^�­v�A���;�H���^S�;L��|avv���ف�NU!�~���ڕjv���^K�R���M�ZN�M�z�&2��%x<	��|��U�03����S���W n�F�s4�+ǶB����>}sKv�rV#3wQe�"��ho��L(�폖�����^+�����X2>�I0�6l�6}�cϴ�H:�H/�4DY��|���~�������.c�i�c9t
��E��S�zen�hHM�4��T_=��>h5Y�-9)iw��'����Ոܓ�	�o�&�`
�zDŽZʬ�E%
JaP
�RX�֤��4
~aO&M���E�*���ʲ�鍴�U���ޢ�R�>wsk�;���U6)+�[M��r.�	���V}�uy����If� ��H
"ik"ɖ���,�,���7��H�{�}gF=�#}�QZx�aK�M�BETӷ����-q�65rTU�5>��͂�o���D�V�n3ui�Ϭ�m��b�Y;���ok�`���!��m����n�TXmUp�:�#�~�ޑ�3X1Sj:g=
S�ݒ	\�	�C� ����PKk�mW{�	�
 "0setuptools/config/_validate_pyproject/formats.py�Z�s۸�]��L�X���:wU�v=��Q��G�Ge��HP™�#A;��� 	����T3g�����o��q��D�z͓���Ǵ��rV�"7$�6ç0Oc��E�F��
�	����`�~���ʐ�f�|g{^Bc�y�`����&3��/�'��g��t>�\���r˲~7'�b���U��'�X�������߮�o�����HaC�쇜E�L+�����٥A˓��c����,g�������70�,Fޥ{u�z��{ѱM�Vw�]���(��>�7��:Σ�%n�g�VJ��x��`I Ov�	�U
��Ue�=׻���՘s|�rP���Ӈ'�C�?g@�yҞ��N|�m�Ú���v��S��
G�O����r~��~1P�3"��
��&��:b/&�&?c�2�O�G�έϗ���nX@Xç?YC�����e
3XH2������!�c�S��3Q�	i�vc*�M5�!� I*�Y����殿��~0��z�7�����tr�b1{q:�7BzW��덮^T�k��І����C�j��<��!VGN��=s���.�"�*
�
�d�ɨM1��:i�V�!y2
�9�}�Y&�T�M�<�NJ$�:�c0G���V���m�2Si�%A���v��tA�S��f�� �l|����T�k�Ш�	j��J������C\��</�������2�5�-��jOAWW�-��Ů�Z��2
�·<	MO
A��
���!Y�p.]b̭Z ��3��[�b�Y��z#��#r�T��5e�)aI��~-#�$S�YO�5K�ߓ6�ĿI�\3����8�9�@Q"6*/�U�"%8���C��kR�����cN�5+���!���}X!�f	`@�m��޺�?��gl�4�H�|�I�7`���`~�%r�����{9Axʙ�5/�:��0C��G<�|J콌V�D��[F6�ڸ��"��4"pIn�ؠE�����M9�!~MP#"5 ,��"a���=��cZ��"�ӿK������A^}g�ث��.�q��a�-N�2bC�
I����V˅�`�[�X�P���]<5d�#qḯ�H`+�n�E\ؖk9R���6�l��m�&M�$�
��epc�u}Q�:em$���W_/Ho�(���7R���P�Vg�"�y�ŔGn�L׬����2�"�rч�Zަ��}���6Bd��0�����kys2��Q�"��1AE�B���\?g��,��H����3ڮ
�a5�H_Ll�N�-k�a�h��C��v���T��u%K��Jʮ�FRh	�f���tY�K
l�
����Q��Lcк�9�pTX�p�=�"l�D�x�2X��5ρ
�K�_MP�K]�0�f�/�0�>F��[�eW�R�&�e@B0WzZɋF���<�� ��SxCn���i�xY�rV� �.��j��M�؟Pi��X�\�$�yLa�=_�JKp=1$ Y�FP]�[�����4/����F�X!�L�̿�y���>����La8Aǭ�n����ϳ�FN�G�Z*ƺ_�~J`",)�*q�/�X����d��R�����&�d�C�ѱ���Xϖ	C@@	�U���ֱ�"�]��P�$.�¼�����u�1p	x���)wzF��U�G�/�
�;' �IԪu7T9����>[�������*L�z���޺���8S!�.s���O��h婌x����ٹw6��t~�/�A�ƧO�Oߜ�'����?'��)�6՝o�E�k̊�ր5�
JE!�6�,F���,�5�h��}�B�6͌�v��Y����U��U��a5�Ol%�����F��
PT�h*Z2��0�M�x����@��{�UE<a��V�^y���-����
k��@"����a�
�V����Ku����;1U>CqA��q���'`[Q�Dz`�1�;�K�u7�x�G�`�Q�O�:��k�k~�r�rz����&��-�!�GX��SQ�K_(�Cf���XF�*���1�T�D�M`̤R�- ��Z��g�~�[أ�~�q�~�;�8Dڶ:���I1@6��
챃\�jK<�����6-syҵ�tu�s,ʡ&��b��z���*7V��{XG�_��r�C��./�8���|��=�CK��8�v"��6�B��Ջ��(��
����
%�SuZ\u����d��ʓ|;�R���p09�_�2;���[m�����eqte/>]��'�wN,S|O;����^L^��0y3y��3|y뎮�=�{�ޫװo||wq�i�2}y{`_���ya�%^nKc���;���1]^C:�~+!����Qjy���]3X4�����bw�!V톸�]ў�jo�B�A4\rG�ts���xكv�x���B�پ����T�u閙{����	�=�T�Z�(�3%K�QK(Z�ZY�F���.�x��@$&!X��
&FeG{f���斺�������[�����n!���Q�']�*ǫ���)�԰�Z�TV}���������t�����e��V�Of¶f��P�V�3r+���*����K�2,{��Ĕ�q1���V�4#}�����*�`1|I��"�ӥz����O�ʬ��j�[�F�������2�j�O�;���PKk�mWM�8��	setuptools/extern/__init__.py�VK��8������B��h$��JsA�E{A��$�n/�ml���j�;Uv^�n8m4�����3r��&㏒��:�%�?�޳�@w���p����g�}`�~{��Y�3"8������Č
�h����{ă.��	gp���"�.�H��@���Wq�zg�	\��Ռ��A�8�Z�K��7њ-7ƥ�+�e�ۯ���FC�h�C�ͪ��6�\$E9��7�[t'J�胍��DeO�C]Ԭ�I��׷�.L+sµgNޏ�wl�@��gÐ8:}�aq1mi&<K ���&�$AuW̞��).d�b��t�>�О�'GYb��֏J�^��y03b�� �	KhL�5���F�k���,�5��++\����E�#�-z��i" ����-j�����\�J���<���f/���~�� ���EE�S�S���-�U������j�:���:1�e�ƃ��|�Lo����l̕ �ul(X�I��AgR�M�In����+ɽ����ޕ���#xj����;猻&g�o���<�"NP��!�W�O������F1�|%f�v�V��
�A1OP�F�Q��L��7TK��
�(�(��^��h?��8f������N>��Lͱ�ɰP>{F٪|Y�a��G��9�o��U���vY9�X+i��'hs����p�
4�8!]Tg.���r.g���d�X:�jY�
!�RI'ς|07��ir"��̊-?��o~�lזӓ�a�y�j��'�9��/56�Xm�]��wA;�P�n������&5�
�_�@y-eG��ݜ���e4'�)m1�i��	{��ơK�Y��倁�yc���5�.�DE�@����Hk�����p�5�&��q���cQ��`%�:�Y%���N���h�h�A�E�,�?PKk�mW�Yď`#setuptools-65.6.3.dist-info/LICENSE]QK��0��W�8�RDy�,nC9fY�y�*�(6E��;�W�H�g�{ͤ��:�S�W�z	���&0V���BpXuz;��NS=F�%p�������M z��W�؉h|k7��5�(�p2�H�1����pu�u5�A���َ���wt�
�-����N"���n꽵��b�&��Z�Hp��yxk��
gs�@ί��ξsG��9���.�	t���k�b�bkGBa�~b�18�=g�p7ϐʅ+�uo�?M�;^�%��<�lV�c�H?�a�7���s�(�d�`�n�_;g��u���-�.W}�B_���>��nd��8ɇ��w����f��c.Q#�Rk��Z�����Yf"���H`/�F���9�Z/�[Y�Ԣ�@i&�e.�d��LO�B\��r+
�$����"�����|%si	[KS�Zi�Prmd�˹�r�KU	�ϐ���Z��؊�,Qk ��Ն�9I1�C���A�ʃ�O�g�+��*w)��\n��?���E3����FP��8~�����*��g�)�y��e%�ZVh���BzZ'"�L��B�Yh���"8B�]%�	!<G��!���PKk�mWM)oT�$setuptools-65.6.3.dist-info/METADATA�X�o�6�����5"�/q����eI�K�lN�/Ð��Y�L�I���;J~�S��Ļ߽y����r����PY�u������gl�[���oz����
�4��n�,Y��T<>e�BH���\�SV��1�2�Ŭ���쾴���GS���~Q)�9>�������0vR��H�a^�<\S�@n�_��;�%�Z��I|H��}c+��H~�[�t��k�D��]�]��H!�ܢ��KEV�R$*�仚�,��y ���p��(]�J�W(�J�a�/?�I��+u$�Yx��<��л��1�^��
��;��a�>�1���q�5�Љ���,d1��X@��`�
�;Af���-��s�fȊ�o�,(C���;tPA&�Aç��N|&�
����V�jl�\ÆC���Hs-���}D�H0�Jc!��KMČ4"�E�}��z2�2Fc0��%�~�/faQ9�w���_��g?��[�v��AH,��۫�O�ʿ������,m���XEk�ר
Vu>�3;!�����
�5��ަ��k� _�r^4���RdS������kd�R)ƶ�?k��	����Kx�<g'�A+h5rF�<�g"�,jJ/2��X��1�
1~�lcT�j1�-v�^7�);VE�\9�<�6w���~�0f'�:�ض3���͂�T];Q���M�~O�iŏ&MI:�v��+�cɧpވ�&=y�;JdԐ���Ŋ�y|�j~��i5��	m.!�9��X�f��'��
"w�A�t]�T��Q�z���A9���=v�Z�=���g��`G�*�V�Κ
C��Ȉ�<8oƃ�PǪT��{
�I���|��؄?��q>�η"Up����ni!����`�:�ѩЄyQ�Dz7��Q\��:X�/r5��&(_+�1�Ջ�j�I�G�W0��es�K�ۦN���Q�������o�8_~��~�o\j���e^�
��^�L�4���7�&������� ���"3K<�X�r��]1%�fa^�X�s_SAy9�V�-q��A3��l:�jnB2ք#'pP���������`��{���q��0��U'ld��'�T�:-cK	U��-��HS3�J��1��g?���hౝ��
��Bc��j�;(7��LA�Up:XÔ�.g��k�G��Kd����D�1fվۉp�q��d�{�5�w�r��҃�7߽�մ$'���v��n1�8;�7��޻@�(h���@2���䐻+�|��r��
�>U�[K��R�#K�(Rh�Vܑ#����muz��^���w��v�*[�;]�	�2@�������Y��m�{����ٛ�Uv_W�7`���鶺��������x�]i1��ˣ���¯�O�x�rpۗR���a?�i�9�.�"��p�e�q�ƌ���Z��
j��@t�7�23Q���X5<B�g��#g{a̦m/��xE��OE�4�J�J,�"�ꕮg�0<5��eX�KT�ÄJ���J"T��G��[I4�Ha����<ע�[UF7\�`���np(U��vM�7KZ��z���P
��sʜ��n���L�L+��*(C�D��K��ĆN�����R��0�������«��7��?<^}�t���!H����;7dN��o������ӝ��$��}Xܔ��;���əE�����qܪ0��^��-��6��ȱs�a%�AOF���l�� 8�5���r���!cU�a�*Xau}��3�*����]cКK�-�i�E�
� �qBT�%3�����X<��N�t��g�D�����OY�od_�6K�-�
���5��j�<��Ha��Υc��"L�,�)4z�PKk�mW�P2�\\!setuptools-65.6.3.dist-info/WHEEL�HM��
K-*��ϳR0�3�rO�K-J,�/�RHJ�,.�/�Q�0�36�3��
��/�,�
(-J��L�R()*M�
IL�R(�4����K�M̫��PKk�mW6>���
,setuptools-65.6.3.dist-info/entry_points.txt�V��� ���͡�!�V��*�{�*��I�����;`L�e��c��fgfȾ�^H�k���U�.w/__��x�o�.B4��	Z��:5�4[Ib�yK�0�iz!�
=@4�#��R4܈ӛ�T��D�l%��f��A:���f��@�vO-�AW�L�E��-織몒A����o5��C�ԍ|'�N�Lt�qJ/�l;ȒE�/��jqZ�Y�Z+���ĂD��j�=�kG��q��gB�d��B�+A�^��5�a!���w��m%ς@���m�D;�p�6L��T;�wW���x�XϜ�B���?�e��m����3Z�凎��
�+I�[�w�oO�u��$��[�0���P�iXm�Igj�M.��~�D8C8��gp%���3�s�u;���V��wZq`�X:�8.��*g�mm#�J=Aw�X6y��Q"�~I�����^Yau�˸c���;p�|�?�y/���	��ZL�b#������������g��}w�v�f�v���19xDw�V�Dg�qZ~��$x:~��$�A$`����?��ñ��
����rTD��c%��PXR��"��'6v(^�a�LC{�����~����Ŭ3���e?)�PKk�mW;���*))setuptools-65.6.3.dist-info/top_level.txt�A
 ����0�PP\�3�z�9�.1J;\��A{�#�PKk�mW�LFE$�U"setuptools-65.6.3.dist-info/RECORD�|G��Z���vG���͠� @B� ��B�{�_��k�,��۷�(#�ȵ�}�Y�����$�ux��^🺏w]�@(�Oiz-�B��P�����k�u�R;	Hd��m�����v�x��vR&�m��^���� �u}nSv	bqU:;�W�AW.�q�g�!��j�6�O��`w{��0��K�Sod$X��A�.=X��A���"�
�jh��{��������� �SU0����q�bl��:�~M��#�b�A�W�+lg�[�GZu��&�=1�p��@%�>��Ձ�w�X�����>��I0��0¹]����<��lf�R|<�fBɭ��;��
��'X']��qO
�����a�%�6��݊����Ñ��(�Bߠ&E]�}���7{0�e��l�b_�k��u�����%���A\ڕۡ�O�ߩ���d
�2���e�Ts���T_B���y6;�_�J@n���7n�=:�*���D�3���WcL�\t.��K�C���Q\ɓwA�B�/�‘w��v�Od%O3q�(o���\ґ�k����i�9$��~�6�f�d�b_U�gK���I�t�E8��0f��~W;յ&���?2dD��|N�%�1�1�����jEW��D�9�8���L������q��5j���I�G:;,AЅ8D�˗�^��&�c�xT;� ����}�&o��
�֖ca�$T�
�;�\`_6���m1���;�	Y�}�N�s4�Ýzصl��j	GR@���t���]{&���W괎W�Oe�?н���o������r�&�a=x����N��^�<ԭh�P�~8��Wo.��a���RМ� ӳ�Ն����d#���!�@�%�?(>����<	E]�����m��U�V�#1m>�5'ۃ����лu(�6�;*_1Y7s��#��=�`H�.o<kj(3��Ή@�;�9��_?�RglK���
<�z5��\n��}S�\�i|x�Ͷ� �f%I|^	sv�y�N��}_���$"� ij�ʹH �c�$�ԛ�p���6�9n5<�l�(U�BX�ˑ��ks�v�l��񍁗S�C���e��߬�K�3T���oI�c�D7�L�_���gٗ�H+9>��!�SN��I9̟H��<�}�#�zU\cIhb}�;��}r���?C�܁ B��1�i�.�Jc��i7>�⡮������#��~\ɂiU<ʚ��!0�,]�^?�Ok��]*\�t8�*�nUa�"�[�ڨlj�:�V�.-����R8m���#^=W��ݙ���v�����#Tp�eaUi�g��&x�wA�7E4C�EP��y��S�eO�;�d���D��p"FСu��ý�!�K��<]��J�<��E���mB��8��
�ٕ��&
��im�p;"Xz'�L�]y��� �-���@��ȒYA�ym�7�r`��k��wa�7�oB��J��iu��%��:��P����M�)�b��ݖ��[��%O��/����lz�{�TĘ�)�a'���S�;�b�i�-� �.��K�lد��nG8�d��t��U����xSU�P	WB��;D��/���l�I'
�\���W}R�׽�m�4bFni-�;y[P���F��īJe
�S]���e�����4����
m� D���)���@���Gl���Z��A�����W�BO�]Ev��=�/�`������:!C������(e1G�``eZ/��x�Վ�wE�o�8���ػ�55�}ݍC N�K��GPY5gf$	{*'𮮪��#�Y��߆�)�#i4�ڿ�&���b��zʠr���:����MC@(�������<s��Yp�B�52���H���JQHz\� a�d�iȊ�%]�re�UO�{8
��€z1�����:\� �L"/��ni�����o�-�|"���������{9�v����8-��6+r�YT�a���'j����ͅ�7��)w'.��rzd�q�Y�W<��d���z0������|���|Ŝɴ��o2WR���\,phؙ�؞{w{onM��]��[]�6�Ц�u�W'K��
C(�_����mRjk��'8?��1r>˞��|v�T'�~��w.����R���҄fg�O��QKk�8&���J�.v]%�����U���DuB�p+���jqnB�U���뱚����}��'A�Mz%�Xt�G�=�p�+N�Wɕ����Q�R�
��@��c}����#������]�up$�U�r�$�]�2���π/:�ڢ���b�"�|y���f*b��"�ǁ0�Yъ����'����OP��Dx��vnU�{sϲ����j��֣��扝v8�țx��TT�kׂ�3�G����}��;�fcy��E�������P��-�֋��G�����5����:WE	W�8-��?ȹo���r�م�v8�<y�;$�oA�|�oݕV8��ȉM:���[$H�2��[�8R8�Д=�@%�L��������U���Hш�/��5P�N�i��r�_��v�6�-k<��&8~���e�׌kc�G�B��Cl����Sةw�ޕ|FK:�c���^�n1�~��;δ�Ӛv��ޱ�ZҳCf�$=t�	�͏���}��ѢK��J��R�Vf�h���6׋���ޣv
�OA�m�T��A�$A�p�@�h[T:H���^Ơ}\_�S����„`�ؖ��/-�;ʿ��d�0��H@�#�t�B&K
��r;������Ey�����aJՇ��:(�yЉ�\�䅐zn+�'ks����]��y�~��0�v��Ч���������D
��	,�`zz��J�s�j���� �4��ݰ(�Y::o��U��lt�ي->�A^E�s640��#_��u�{����`�M�'J��V�yĶX��'�M�e�g_�1��/\�-WCQ�˔�#�T�G+��dA�!����
ş�����ڌ�]J�[�&�N�G���R��PnR��Z@�d�}�g��Nt��je�9��lޢT�F."݃�)T&\��IE�Fv8q�$l}����w�V��sO+�����Y+�]LSb��1)�^�˴w�����	?��z��o�e����W�S� �Sa�Do��r/����Gs����凇��Sf��w�ϏW(��ao麍k��L��˚5#�W'���s�B�ַ^y����&u�������?}Q��*�z[���<�ɿ���0]�V\NE�i@~�)���7u�w�'4�h��½=��X��
�C��u�qP<�������Ј��vй^�
9&�K�?�l��*n6�-��t[���^�`��Oy��Ư�lo�n.p�!;[|hrނ��D�r	�W��]��4n��Nq<�K����K)�d&��� �{�S�ĉ�Ҩ����0�TȦ���������=���F��4��Snպ�n=�(�i��=`��EF�uj�J�uS�ci���l�6��#����&�h���#.s;%�{Ֆ��C��`�M�����Q���D�Q>�q�&w�5^b��	`�w�6g)��_�i�D���̞/¡��KB��W+��9�A�!_��'�-Y~]'��Aw'W��ͱ3�a�������x>pӠ �}�s���a�Wu���G�D���l�U�v�ծ�.UiW���D�2��>��[�-�~`'���O�	�o��Z��L�,Z1V�;�W憋|��W�1�[wFb�;���g�^z�8
|�<��q��(�IJ���W��CH���Aw��~��^���5��Y;-��]��9�BF����^������eK#�>O�!}2����=t�8�n���wH�
7=��䟰��.wG,8����z�S~�K��k嚘�tdҙ�A}���C��0��R{K�J�!�O�5�&�{�UKPKZ9�0�(�n�|����)�O�3
U��-43�2�-Ű��t�A8$���$A}�#a���.і�^Y�|p
q�c���BU'E{�%��$��h���@5m��|�Ay��~�O��V��3���=�zc
 d���x#��rߗG�w��]м��d���a��x8Եv�`Mq��F�
+�;���Me�CN�oBe��P�0�Pʑ3eA��l��,�Z6��Ƥ�$�caGoC�,���L�Lw��-΢�$d�f�b+
&��Ÿ�nB}�\$���n��T�l}� w�U~H�
Bi����Q���m�Q�w&~%�y@����Ģl3�|?>T�0$��V��x8��G���C��;
��~:�Fn�����%�6��5<�{��ُu)`qt�zI6�I�]���/]Ds�rvM,��L36�2,�ی;'�����z�8�v����B���I��ᢦ\��uJ�V�F4Os�1Z�&�a|W�+�.���RM�����؂���c�Μx�ap�I����(.��F��<C�\Cf����X�u9����Q�8�ǘ���MWC��pyS��/�d�1���;���F�=-�A�hQ��3���҈�eS��7u7���
��!��\v�)s7?!��H�Ih�&�F���6)�.�m��7�c6�#7��*'g�]g�G�Y��v��y���6;m]��9l8L�q��QR'{�ѨF2v��ȭ����Ŗ���͆w�-�7�%A�^na3
�4��X��a���.a�)#B�����w�q�m8��sI�ӝ�hB�S���t����Aڔ�C��RTt��"$�{S��+'����?�Ͳ��L��<�������z</^��q��K�_"�6���`0"�~���00QypL���,�:0̓�7�Ook�]v�#9�9�1�'��|�/	��u"-��xFzČZ*��!�[U�r�~�9�g�YD^���9����ҥg���wb��r0Y����!��P��8��˗��w����j,R��-��P�`���0��\,U�ܶ��]`�E�[�>Um��>>b��QD��9�i�E����`���vQ��s�_�|K��ۊ�'����Zk�^iq\��Wo,P����@M�)y?1��Ѽ�o���'x���[J��Ϧ��"��n]@+�[�W��霭�y�=:����51�]<s�u��J�y��*��J?��>̽8�ބ���30';�A[��!�����7tD}��ʚ_r�Y����%aP��x�į?6؈y��{�ޗ]r�P��A� e�vSѡ*z����
�������%������>s<�
oa=�2��\�p�Z)��Z�+/�.�cq���a �co����������ۖz��6C�u�hw�m-V��^XK��:.E~��ݓ�
3k���5��,:���e���@N����P��_����ޏVċ/�l)�v]�Kv���,}�T�ʜ�f/���h�K�,��}�z�	���$���=�疝����(#r{���U�K��hr��q2����������^:4D"�AQ��7��c-��D���lr
���I�����#C�Qf�oGp�����V��Uf{�)��ٽ?�N`?z�?l�y:�xdK����4p�J
E:0��
��5��T�kL�ǜ�A8�����%��-���'&f�Ȭi��2L.(���y9%%�2���2{�Z���D����ˌG�$2�Y��� ���1,��j$����;8�z����x��>='~O��>,[,[��݃��&̣��ɺ��Q��x����ϑ|������_��ӆ����tFT�6<4M񶉹�J��V�H�G�	J���U'���(�PO�[�EAv�Z��P#4W���F�����Xl�h��ID�V��cw��žT�2�]<d������mI~��ݗ*k��?Xfyf�掋^ą�H� �'u?K�\�*ck�H�����\���c<�r�'[/$us�$�Fa	��$��R��6o���&�U��_`V��������]��:���J�8�hI�t{/��^jӳy��Ft�16���:)#����S�C�؊�xTuHp�m���>:ݦU�oG��6s���T�r��������ǹ�G�{e�YyLZ?FG�]�fpp&7m��xa<G"��TͰ�Gj}m�WT/n��X�$�(.w�׭�Za[�j_�k�?ڍ����i[
{�8��^o}3'�1G!5(��*2VW��JHAȻ�\/ww�)����y�/	ëz�uzՂb�խ4j2�c�|�K��s\	�)��D�,ѫ-w�37�ٶ�����C
�4X�%��ý˒õ�*A��_����
����'���~��43!:b�P�`��nM;���{}�%`�q씟��l�贕=b�Bp�-�{�y��cM��ӭ�Q�gi��U?2�uV}��K\f�QK����Z�/1\)�Rdd���/����Y�_17�\�~h�0�ˉ��e��2?��ge~��_�$�/���I�?"��W�Ǽ���1�_U����H}�	�1L�D·��v7T�^�u�-9���'c^��ŜC� m�I6pڨ?��=�{�7��NK�N�w���b�l��L�w�0<j���s��	���a~OO������v����@��v�����]�zN	�k���w�T�Zp�T�q�Fm'ї
��0z&emg-M2E�#%�Z1�13:�:��/�z�O���g��b���0? ��s0��5C0?�0ߧ�5�/��v�%Ob%jj+������"7:��'#r\���BS�����K����k�|�D>��J_�
�.:��8��Q%u��-�B������˧^���G^�����]���+�]^��I����1������������R��і������������������q���Y�WYU�'��O�>�1���9�=�ߘ��̰"�N�bdu�*g�Oȗ���ǫ<mxF䞓��i¯2�f�U��ȫ��`���R��w��/c����4B��� ��+������Z��Џ�G�ҵʗ�����[<�˳���tכ��'�Y�����=���R�@aa�<-�o��?uk�9�=Z�Z�W�����(��b#��]�SW�ʁ���F����i����f˓b�go5[����	�4AI��v�K��+�7��9��sT�8a�,R(ł�*O&�M��Hs(�ws�h�o�Þ�NO幍��,9$OP#�鑕�=�؂úL#þ�J{�Ct���wb�EY������(�Q��������G�4�L�A�R���r��ǤJ���k�� YA��v�lծȣ��P���'4^�M#o���l�3�:�bir�g�e*7
�"����M���~9�i�	z�l��2bŒ��Gǎ8��]�y�S�pH'�|V�g�����ͦ?q�`���v4j��I>h�vzM��Q�n/�c�R��R��A>��/��7W�rv�=�ػ2�e��!`�=�� uq�Tʓx⎷���;�xX�N���v3n+S�@�>ʖ�9xz�M����%�
�"lR.>v;���I�y`�b���DK����x�53HfT�:�~'j%�!���b#�v����K�o�i�B�	�im?�p
�Q(7Y���#LL�YnQ�0��������Od"hG��49��U�D���ӡe(��l���K7��ifYR���g���$;Sz1��$fPj�&��>�d	A/���E}E �떣E�-�y���
̝���\��,�'r���=s�8N�d��{;7u�ڏ��׏v̦ś"+�Y�$}���Xm�~�ֿ�
��~K�M�g.��غ675Z�3��|K��,Qew�
�����)]n�A/��^`�-R|��-q�+g�>w�cYf
."/����������t�_�Lf���E�66eN3a
�L�^D�����*��o�{��m�?_�R��&;]�
U*��X�Y�Ƅ�@Ϥ��x+O,ݶ���A�A��t���ڻ%��&�W1��r��0�4���vA𹖑����˹�Oh0�~��kis'"���-��=1�� �Ė��)��zA���aAI�[�w��FL�M<ڴ`�A��
|����D��J}H�Ϸ��J� k��2���\
s���%�:'�(�0�/���3݇��=4e���&>D@0�Na?+���׳we�ˬw���+��B��-�)WU'��`�IU��S��@jHc��B�]!�v8�I�7M^��!(c��ӌ��9�<Izx�aN�	��w�6�|����u�l�n�4�!���*Ss儅V�Tù�$4\�FQ�B�h��ǭw�$^Ps���E�[��5b=���>�.�ҩ�v����G�8�F<t�Yq���A���}�Z����
���� �	n�����I�t���y���'^�Y:������J�Vq���)-j�`$?�JwƦ;(�h�_|i{�T��兿��r��|��9�D�ڂ�NOKR�F*��L�� ��B���L�]��������s4��4g�Բ#�ѭ]L� �"b���
�����E���s�:����qm�зtQ�i�0��"n��Vݔ3�b7��$ӏ
P�I���ۨ�ZT8�˭�	G�SԜ��i޻���Z��+x�:�7z�-P=�:/M�;��?�ׯ]5�
�[�I�8<�ރ29�8Ӈ�`�;o��FI~�z�٫�p���G��).B��-��6�(/8�^
�-��\�X��#��g�.�Q��!ܗ���r�
�6oͬ��EK�h�>`�Ox�}�g��1�?��|ԛ��t��p���
���G���,�S��0�KZ.�<��3���+.Q��"�Q,�Q�&��F1�/}w8��5b%�Ɍ&�M�j$��Z���v�����Ƒ�.�sO7I2�#8j��%�y�)��c0=`ܥ��d�#�o�������%Ԁdf..:��j��Q��&}�?2{��ŏS��[f+�v���|f�����m�MqfY��u�r@j_:P��-����
$�=�m}��p�Uaw���PKk�mW�}a~���distutils-precedence.pthPK1xU�.�_�����_distutils_hack/__init__.pyPK1xU� ��.,��r	_distutils_hack/override.pyPK1xU���s����	pkg_resources/__init__.pyPK1xU!���}pkg_resources/_vendor/__init__.pyPK1xU��a�Q}` ���}pkg_resources/_vendor/appdirs.pyPK1xUB�q8u
� ��l�pkg_resources/_vendor/zipp.pyPK1xUoq����5���pkg_resources/_vendor/importlib_resources/__init__.pyPK1xU���'t�6��C�pkg_resources/_vendor/importlib_resources/_adapters.pyPK1xU0Q}��
4���pkg_resources/_vendor/importlib_resources/_common.pyPK1xU�k�hw�
4��v�pkg_resources/_vendor/importlib_resources/_compat.pyPK1xU��h�t7��?�pkg_resources/_vendor/importlib_resources/_itertools.pyPK1xU�.1���
4���pkg_resources/_vendor/importlib_resources/_legacy.pyPK1xU}>m.0��R�pkg_resources/_vendor/importlib_resources/abc.pyPK1xU�D���
4��
�pkg_resources/_vendor/importlib_resources/readers.pyPK1xU�c��3���pkg_resources/_vendor/importlib_resources/simple.pyPK1xU(��ɽpkg_resources/_vendor/jaraco/__init__.pyPK1xU2& �
,'���pkg_resources/_vendor/jaraco/context.pyPK1xU�ܱw��4)��c�pkg_resources/_vendor/jaraco/functools.pyPK1xU�.ɪ�<-��y�pkg_resources/_vendor/jaraco/text/__init__.pyPK1xUaʥuBS0��n�pkg_resources/_vendor/more_itertools/__init__.pyPK1xU:$ν���,����pkg_resources/_vendor/more_itertools/more.pyPK1xU�B΀�G/���spkg_resources/_vendor/more_itertools/recipes.pyPK1xUF�cf�,����pkg_resources/_vendor/packaging/__about__.pyPK1xU�����+��c�pkg_resources/_vendor/packaging/__init__.pyPK1xU*:c��,-����pkg_resources/_vendor/packaging/_manylinux.pyPK1xU�t10-��s�pkg_resources/_vendor/packaging/_musllinux.pyPK1xU0��`�.���pkg_resources/_vendor/packaging/_structures.pyPK1xU�����
0!*����pkg_resources/_vendor/packaging/markers.pyPK1xU|%X�b/��d�pkg_resources/_vendor/packaging/requirements.pyPK1xU5����u-����pkg_resources/_vendor/packaging/specifiers.pyPK1xU�	ms�S='����pkg_resources/_vendor/packaging/tags.pyPK1xUA��3�h(����pkg_resources/_vendor/packaging/utils.pyPK1xU2��I9*����pkg_resources/_vendor/packaging/version.pyPK1xU�J�_
�#+����pkg_resources/_vendor/pyparsing/__init__.pyPK1xU/H��F*���pkg_resources/_vendor/pyparsing/actions.pyPK1xU��e~��2)��/pkg_resources/_vendor/pyparsing/common.pyPK1xU<�ǀD�>A'��] pkg_resources/_vendor/pyparsing/core.pyPK1xU�6 t�
?#-����pkg_resources/_vendor/pyparsing/exceptions.pyPK1xU�*,٘*����pkg_resources/_vendor/pyparsing/helpers.pyPK1xU^���b*��Jpkg_resources/_vendor/pyparsing/results.pyPK1xU��5�[
Z4*���.pkg_resources/_vendor/pyparsing/testing.pyPK1xUz��x#**��6<pkg_resources/_vendor/pyparsing/unicode.pyPK1xU-G�l��'���Gpkg_resources/_vendor/pyparsing/util.pyPK1xU�-2U	t\3���Opkg_resources/_vendor/pyparsing/diagram/__init__.pyPK1xU���͈z	 ��)jpkg_resources/extern/__init__.pyPKk�mW���x5� ���msetuptools/__init__.pyPKk�mW�J��"��Xzsetuptools/_deprecation_warning.pyPKk�mW�&�l����#{setuptools/_entry_points.pyPKk�mW��	�	X	���~setuptools/_imp.pyPKk�mW6��
���setuptools/_importlib.pyPKk�mW�T��X���V�setuptools/_itertools.pyPKk�mWT��R����setuptools/_path.pyPKk�mW�����g�setuptools/_reqs.pyPKk�mW���������setuptools/archive_util.pyPKk�mW&M�J��L����setuptools/build_meta.pyPKk�mW+JΟ�����setuptools/dep_util.pyPKk�mWi�y�{����setuptools/depends.pyPKk�mW�i7�:?Q��E�setuptools/discovery.pyPKk�mWH�A*//İ����setuptools/dist.pyPKk�mW��q��	���setuptools/errors.pyPKk�mWu=̕����setuptools/extension.pyPKk�mW޷Y��	���setuptools/glob.pyPKk�mW��~(����setuptools/installer.pyPKk�mW2S��,��
setuptools/launch.pyPKk�mW�|U-����setuptools/logging.pyPKk�mW�Z2�����9setuptools/monkey.pyPKk�mW��%Dd&l���Qsetuptools/msvc.pyPKk�mWpm!N���Csetuptools/namespaces.pyPKk�mW�N���-����iHsetuptools/package_index.pyPKk�mW�V�D�����vsetuptools/py34compat.pyPKk�mWQ�짟8��Jwsetuptools/sandbox.pyPK1xU�������setuptools/script (dev).tmplPK1xU�3��j�����setuptools/script.tmplPKk�mWT+�~�����setuptools/unicode_utils.pyPKk�mWH�Lbe���N�setuptools/version.pyPKk�mWV�z�	� ���setuptools/wheel.pyPKk�mW��qou����setuptools/windows_support.pyPKk�mWr�7��g!����setuptools/_distutils/__init__.pyPKk�mW��`a�%���setuptools/_distutils/_collections.pyPKk�mW�O���#��-�setuptools/_distutils/_functools.pyPKk�mW=&-$+��?�setuptools/_distutils/_log.pyPKk�mW]�;F��&����setuptools/_distutils/_macos_compat.pyPKk�mW7��8�L&��h�setuptools/_distutils/_msvccompiler.pyPKk�mW��GJq
|!%���setuptools/_distutils/archive_util.pyPKk�mW*/-�!�9%����setuptools/_distutils/bcppcompiler.pyPKk�mWU�l�=2ϸ"����setuptools/_distutils/ccompiler.pyPKk�mWǢr���E��ysetuptools/_distutils/cmd.pyPKk�mW �S�/��Bsetuptools/_distutils/config.pyPKk�mW�c�v��$��@#setuptools/_distutils/core.pyPKk�mW>�
M��.(��A0setuptools/_distutils/cygwinccompiler.pyPKk�mW_�H%u���r@setuptools/_distutils/debug.pyPKk�mW�5�V
!��#Asetuptools/_distutils/dep_util.pyPKk�mW�m���
�!��YFsetuptools/_distutils/dir_util.pyPKk�mW*��mL4���Qsetuptools/_distutils/dist.pyPKk�mWd�X����setuptools/_distutils/errors.pyPKk�mW�~&
("��V�setuptools/_distutils/extension.pyPKk�mWB�����E%����setuptools/_distutils/fancy_getopt.pyPKk�mWV�^��
 "��̮setuptools/_distutils/file_util.pyPKk�mWqq F�5!��ʹsetuptools/_distutils/filelist.pyPKk�mW9M8����O�setuptools/_distutils/log.pyPKk�mW�Ä�"�u&����setuptools/_distutils/msvc9compiler.pyPKk�mWTc��\%����setuptools/_distutils/msvccompiler.pyPKk�mW(��#��setuptools/_distutils/py38compat.pyPKk�mW�C
cq#���setuptools/_distutils/py39compat.pyPKk�mW��|V��
���
setuptools/_distutils/spawn.pyPKk�mW9���ZVI"��Lsetuptools/_distutils/sysconfig.pyPKk�mW3��\I@/"���&setuptools/_distutils/text_file.pyPKk�mW�n���<&��o6setuptools/_distutils/unixccompiler.pyPKk�mWD���X�F���Jsetuptools/_distutils/util.pyPKk�mW#q<�2 ��dsetuptools/_distutils/version.pyPKk�mWa��U)���usetuptools/_distutils/versionpredicate.pyPKk�mW)	���)���|setuptools/_distutils/command/__init__.pyPKk�mWSOV��N2���}setuptools/_distutils/command/_framework_compat.pyPKk�mW�����!&����setuptools/_distutils/command/bdist.pyPKk�mW�j ��:+���setuptools/_distutils/command/bdist_dumb.pyPKk�mW��V*����setuptools/_distutils/command/bdist_rpm.pyPKk�mW�M����&����setuptools/_distutils/command/build.pyPKk�mW?p��
+���setuptools/_distutils/command/build_clib.pyPKk�mW���G#{*��0�setuptools/_distutils/command/build_ext.pyPKk�mW
"�RS�@)����setuptools/_distutils/command/build_py.pyPKk�mW����.��Y�setuptools/_distutils/command/build_scripts.pyPKk�mWY��49&����setuptools/_distutils/command/check.pyPKk�mW��U#
&��0�setuptools/_distutils/command/clean.pyPKk�mW�G��l3'���setuptools/_distutils/command/config.pyPKk�mW�����u(��zsetuptools/_distutils/command/install.pyPKk�mW�&KW��
-���*setuptools/_distutils/command/install_data.pyPKk�mW2��L�
1��e.setuptools/_distutils/command/install_egg_info.pyPKk�mW	D���0��3setuptools/_distutils/command/install_headers.pyPKk�mW�9Qߩ	� ,��!5setuptools/_distutils/command/install_lib.pyPKk�mW�
��0��?setuptools/_distutils/command/install_scripts.pyPKk�mW�>qp�+��?Bsetuptools/_distutils/command/py37compat.pyPKk�mWK���
*.)���Csetuptools/_distutils/command/register.pyPKk�mW�����J&���Qsetuptools/_distutils/command/sdist.pyPKk�mWG'�=�	D'���gsetuptools/_distutils/command/upload.pyPKk�mW���qsetuptools/_vendor/__init__.pyPKk�mWD�*�;!��rsetuptools/_vendor/ordered_set.pyPKk�mW��aLBmT'���setuptools/_vendor/typing_extensions.pyPKk�mWB�q8u
� ��=�setuptools/_vendor/zipp.pyPKk�mW���s �u1����setuptools/_vendor/importlib_metadata/__init__.pyPKk�mW�m��F2��I�setuptools/_vendor/importlib_metadata/_adapters.pyPKk�mW�����5����setuptools/_vendor/importlib_metadata/_collections.pyPKk�mW{D$0��U�setuptools/_vendor/importlib_metadata/_compat.pyPKk�mW�:oikO3���setuptools/_vendor/importlib_metadata/_functools.pyPKk�mW�:���3����setuptools/_vendor/importlib_metadata/_itertools.pyPKk�mW���.��.���setuptools/_vendor/importlib_metadata/_meta.pyPKk�mWx�v.���setuptools/_vendor/importlib_metadata/_text.pyPKk�mWoq����2��0setuptools/_vendor/importlib_resources/__init__.pyPKk�mW���'t�3��Tsetuptools/_vendor/importlib_resources/_adapters.pyPKk�mW0Q}��
1��
setuptools/_vendor/importlib_resources/_common.pyPKk�mW�k�hw�
1���setuptools/_vendor/importlib_resources/_compat.pyPKk�mW��h�t4��Gsetuptools/_vendor/importlib_resources/_itertools.pyPKk�mW�.1���
1��#setuptools/_vendor/importlib_resources/_legacy.pyPKk�mW}>m.-��Tsetuptools/_vendor/importlib_resources/abc.pyPKk�mW�D���
1��setuptools/_vendor/importlib_resources/readers.pyPKk�mW�c��0���"setuptools/_vendor/importlib_resources/simple.pyPKk�mW%���&setuptools/_vendor/jaraco/__init__.pyPKk�mW2& �
,$��'setuptools/_vendor/jaraco/context.pyPKk�mW����4&��V.setuptools/_vendor/jaraco/functools.pyPKk�mW]"ʨ�<*��c?setuptools/_vendor/jaraco/text/__init__.pyPKk�mW!Q8�AR-��SSsetuptools/_vendor/more_itertools/__init__.pyPKk�mWP,x�y��)���Ssetuptools/_vendor/more_itertools/more.pyPKk�mW�ʀ�8�?,����setuptools/_vendor/more_itertools/recipes.pyPKk�mWF�cf�)��}�setuptools/_vendor/packaging/__about__.pyPKk�mW�����(��*�setuptools/_vendor/packaging/__init__.pyPKk�mW*:c��,*��d�setuptools/_vendor/packaging/_manylinux.pyPKk�mW�t10*��4�setuptools/_vendor/packaging/_musllinux.pyPKk�mW0��`�+����setuptools/_vendor/packaging/_structures.pyPKk�mWX�Qx
-!'��U�setuptools/_vendor/packaging/markers.pyPKk�mW�X��\,��	setuptools/_vendor/packaging/requirements.pyPKk�mW5����u*��Q	setuptools/_vendor/packaging/specifiers.pyPKk�mW�	ms�S=$���*	setuptools/_vendor/packaging/tags.pyPKk�mWA��3�h%��O<	setuptools/_vendor/packaging/utils.pyPKk�mW2��I9'��`B	setuptools/_vendor/packaging/version.pyPKk�mW�J�_
�#(���R	setuptools/_vendor/pyparsing/__init__.pyPKk�mW/H��F'��9`	setuptools/_vendor/pyparsing/actions.pyPKk�mW��e~��2&���h	setuptools/_vendor/pyparsing/common.pyPKk�mW<�ǀD�>A$���w	setuptools/_vendor/pyparsing/core.pyPKk�mW�6 t�
?#*��u5
setuptools/_vendor/pyparsing/exceptions.pyPKk�mW�*,٘'���@
setuptools/_vendor/pyparsing/helpers.pyPKk�mW^���b'���l
setuptools/_vendor/pyparsing/results.pyPKk�mW��5�[
Z4'���
setuptools/_vendor/pyparsing/testing.pyPKk�mWz��x#*'����
setuptools/_vendor/pyparsing/unicode.pyPKk�mW-G�l��$���
setuptools/_vendor/pyparsing/util.pyPKk�mW�-2U	t\0��L�
setuptools/_vendor/pyparsing/diagram/__init__.pyPKk�mW��%��$����
setuptools/_vendor/tomli/__init__.pyPKk�mW��i�iX#����
setuptools/_vendor/tomli/_parser.pyPKk�mWu�1~����
setuptools/_vendor/tomli/_re.pyPKk�mW��g��"����
setuptools/_vendor/tomli/_types.pyPKk�mW;��N������
setuptools/command/__init__.pyPKk�mW=��/M	����
setuptools/command/alias.pyPKk�mW��e\��@����
setuptools/command/bdist_egg.pyPKk�mW��ȹ������
setuptools/command/bdist_rpm.pyPKk�mW�.�I	�����
setuptools/command/build.pyPKk�mW���G ��zsetuptools/command/build_clib.pyPKk�mW}�]��=���setuptools/command/build_ext.pyPKk�mWq�B�#7��setuptools/command/build_py.pyPKk�mW&��dd���*setuptools/command/develop.pyPKk�mW�;�����3setuptools/command/dist_info.pyPKk�mW-]�[�N"��b:setuptools/command/easy_install.pyPKk�mW#�l2�#�y$��!�setuptools/command/editable_wheel.pyPKk�mW�P�C�h��1�setuptools/command/egg_info.pyPKk�mW���@+����setuptools/command/install.pyPKk�mW�w͔4�&��+�setuptools/command/install_egg_info.pyPKk�mW,��,#!����setuptools/command/install_lib.pyPKk�mWY$Ve�4
%���setuptools/command/install_scripts.pyPK1xU]�)B7t(���setuptools/command/launcher manifest.xmlPKk�mW���3|R ����setuptools/command/py36compat.pyPKk�mWv�����?�setuptools/command/register.pyPKk�mW�!��P����setuptools/command/rotate.pyPKk�mW��4F����setuptools/command/saveopts.pyPKk�mW<?��	���D�setuptools/command/sdist.pyPKk�mW.
n�����setuptools/command/setopt.pyPKk�mWO�\�	���5
setuptools/command/test.pyPKk�mW"]K����ksetuptools/command/upload.pyPKk�mW�sb�	.!���setuptools/command/upload_docs.pyPKk�mW�*a���setuptools/config/__init__.pyPKk�mW�E�_�V4)��"setuptools/config/_apply_pyprojecttoml.pyPKk�mW�v���?��3setuptools/config/expand.pyPKk�mWzkK
"hK"��3Hsetuptools/config/pyprojecttoml.pyPKk�mW�T��qnb���]setuptools/config/setupcfg.pyPKk�mW[����1��Awsetuptools/config/_validate_pyproject/__init__.pyPKk�mW���N#,8��oysetuptools/config/_validate_pyproject/error_reporting.pyPKk�mW�G��A�:���setuptools/config/_validate_pyproject/extra_validations.pyPKk�mW�o^7�LB����setuptools/config/_validate_pyproject/fastjsonschema_exceptions.pyPKk�mW�f��WLC��|�setuptools/config/_validate_pyproject/fastjsonschema_validations.pyPKk�mW{�	�
 "0����setuptools/config/_validate_pyproject/formats.pyPKk�mWM�8��	����setuptools/extern/__init__.pyPKk�mW�Yď`#����setuptools-65.6.3.dist-info/LICENSEPKk�mWM)oT�$��i�setuptools-65.6.3.dist-info/METADATAPKk�mW�P2�\\!����setuptools-65.6.3.dist-info/WHEELPKk�mW6>���
,����setuptools-65.6.3.dist-info/entry_points.txtPKk�mW;���*))��u
setuptools-65.6.3.dist-info/top_level.txtPKk�mW�LFE$�U"��
setuptools-65.6.3.dist-info/RECORDPK���Kk&
PK�![��"�BB&licenses/alt-python311-pip/LICENSE.txtnu�[���Copyright (c) 2008-2021 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�![��"�BB,licenses/alt-python311-pip-wheel/LICENSE.txtnu�[���Copyright (c) 2008-2021 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�![���� doc/alt-python311-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 pip 20.3, we've `made a big improvement to the heart of pip`_; `learn more`_. We want your input, so `sign up for our user experience research studies`_ to help us do it right.

**Note**: pip 21.0, in January 2021, removed Python 2 support, per pip's `Python 2 support policy`_. Please migrate to Python 3.

If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:

* `Issue tracking`_
* `Discourse channel`_
* `User IRC`_

If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms:

* `GitHub page`_
* `Development documentation`_
* `Development mailing list`_
* `Development IRC`_

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

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

.. _package installer: https://packaging.python.org/guides/tool-recommendations/
.. _Python Package Index: https://pypi.org
.. _Installation: https://pip.pypa.io/en/stable/installation/
.. _Usage: https://pip.pypa.io/en/stable/
.. _Release notes: https://pip.pypa.io/en/stable/news.html
.. _Release process: https://pip.pypa.io/en/latest/development/release-process/
.. _GitHub page: https://github.com/pypa/pip
.. _Development documentation: https://pip.pypa.io/en/latest/development
.. _made a big improvement to the heart of pip: https://pyfound.blogspot.com/2020/11/pip-20-3-new-resolver.html
.. _learn more: https://pip.pypa.io/en/latest/user_guide/#changes-to-the-pip-dependency-resolver-in-20-3-2020
.. _sign up for our user experience research studies: https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html
.. _Python 2 support policy: https://pip.pypa.io/en/latest/development/release-process/#python-2-support
.. _Issue tracking: https://github.com/pypa/pip/issues
.. _Discourse channel: https://discuss.python.org/c/packaging
.. _Development mailing list: https://mail.python.org/mailman3/lists/distutils-sig.python.org/
.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa
.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev
.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
PK�![3�$�""!doc/alt-python311-libs/README.rstnu�[���This is Python version 3.11.13
==============================

.. image:: https://github.com/python/cpython/workflows/Tests/badge.svg
   :alt: CPython build status on GitHub Actions
   :target: https://github.com/python/cpython/actions

.. image:: https://dev.azure.com/python/cpython/_apis/build/status/Azure%20Pipelines%20CI?branchName=main
   :alt: CPython build status on Azure DevOps
   :target: https://dev.azure.com/python/cpython/_build/latest?definitionId=4&branchName=main

.. image:: https://img.shields.io/badge/discourse-join_chat-brightgreen.svg
   :alt: Python Discourse chat
   :target: https://discuss.python.org/


Copyright © 2001-2023 Python Software Foundation.  All rights reserved.

See the end of this file for further copyright and license information.

.. contents::

General Information
-------------------

- Website: https://www.python.org
- Source code: https://github.com/python/cpython
- Issue tracker: https://github.com/python/cpython/issues
- Documentation: https://docs.python.org
- Developer's Guide: https://devguide.python.org/

Contributing to CPython
-----------------------

For more complete instructions on contributing to CPython development,
see the `Developer Guide`_.

.. _Developer Guide: https://devguide.python.org/

Using Python
------------

Installable Python kits, and information about using Python, are available at
`python.org`_.

.. _python.org: https://www.python.org/

Build Instructions
------------------

On Unix, Linux, BSD, macOS, and Cygwin::

    ./configure
    make
    make test
    sudo make install

This will install Python as ``python3``.

You can pass many options to the configure script; run ``./configure --help``
to find out more.  On macOS case-insensitive file systems and on Cygwin,
the executable is called ``python.exe``; elsewhere it's just ``python``.

Building a complete Python installation requires the use of various
additional third-party libraries, depending on your build platform and
configure options.  Not all standard library modules are buildable or
useable on all platforms.  Refer to the
`Install dependencies <https://devguide.python.org/getting-started/setup-building.html#build-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/main/Mac/README.rst>`_.

On Windows, see `PCbuild/readme.txt
<https://github.com/python/cpython/blob/main/PCbuild/readme.txt>`_.

If you wish, you can create a subdirectory and invoke configure from there.
For example::

    mkdir debug
    cd debug
    ../configure --with-pydebug
    make
    make test

(This will fail if you *also* built at the top-level directory.  You should do
a ``make clean`` at the top-level first.)

To get an optimized build of Python, ``configure --enable-optimizations``
before you run ``make``.  This sets the default make targets up to enable
Profile Guided Optimization (PGO) and may be used to auto-enable Link Time
Optimization (LTO) on some platforms.  For more details, see the sections
below.

Profile Guided Optimization
^^^^^^^^^^^^^^^^^^^^^^^^^^^

PGO takes advantage of recent versions of the GCC or Clang compilers.  If used,
either via ``configure --enable-optimizations`` or by manually running
``make profile-opt`` regardless of configure flags, the optimized build
process will perform the following steps:

The entire Python directory is cleaned of temporary files that may have
resulted from a previous compilation.

An instrumented version of the interpreter is built, using suitable compiler
flags for each flavor. 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's 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.11 <https://docs.python.org/3.11/whatsnew/3.11.html>`_ document.  For a more
detailed change log, read `Misc/NEWS
<https://github.com/python/cpython/tree/main/Misc/NEWS.d>`_, but a full
accounting of changes can only be gleaned from the `commit history
<https://github.com/python/cpython/commits/main>`_.

If you want to install multiple versions of Python, see the section below
entitled "Installing multiple versions".


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

`Documentation for Python 3.11 <https://docs.python.org/3.11/>`_ 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/main/Doc/README.rst>`_.


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/testing/run-write-tests.html>`_
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/python3.X``.  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.11 with 3.11 being the
primary version, you would execute ``make install`` in your 3.11 build directory
and ``make altinstall`` in the others.


Release Schedule
----------------

See :pep:`664` for Python 3.11 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 `LICENSE <https://github.com/python/cpython/blob/main/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�![�Yď*doc/alt-python311-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�![3�$�""doc/alt-python311/README.rstnu�[���This is Python version 3.11.13
==============================

.. image:: https://github.com/python/cpython/workflows/Tests/badge.svg
   :alt: CPython build status on GitHub Actions
   :target: https://github.com/python/cpython/actions

.. image:: https://dev.azure.com/python/cpython/_apis/build/status/Azure%20Pipelines%20CI?branchName=main
   :alt: CPython build status on Azure DevOps
   :target: https://dev.azure.com/python/cpython/_build/latest?definitionId=4&branchName=main

.. image:: https://img.shields.io/badge/discourse-join_chat-brightgreen.svg
   :alt: Python Discourse chat
   :target: https://discuss.python.org/


Copyright © 2001-2023 Python Software Foundation.  All rights reserved.

See the end of this file for further copyright and license information.

.. contents::

General Information
-------------------

- Website: https://www.python.org
- Source code: https://github.com/python/cpython
- Issue tracker: https://github.com/python/cpython/issues
- Documentation: https://docs.python.org
- Developer's Guide: https://devguide.python.org/

Contributing to CPython
-----------------------

For more complete instructions on contributing to CPython development,
see the `Developer Guide`_.

.. _Developer Guide: https://devguide.python.org/

Using Python
------------

Installable Python kits, and information about using Python, are available at
`python.org`_.

.. _python.org: https://www.python.org/

Build Instructions
------------------

On Unix, Linux, BSD, macOS, and Cygwin::

    ./configure
    make
    make test
    sudo make install

This will install Python as ``python3``.

You can pass many options to the configure script; run ``./configure --help``
to find out more.  On macOS case-insensitive file systems and on Cygwin,
the executable is called ``python.exe``; elsewhere it's just ``python``.

Building a complete Python installation requires the use of various
additional third-party libraries, depending on your build platform and
configure options.  Not all standard library modules are buildable or
useable on all platforms.  Refer to the
`Install dependencies <https://devguide.python.org/getting-started/setup-building.html#build-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/main/Mac/README.rst>`_.

On Windows, see `PCbuild/readme.txt
<https://github.com/python/cpython/blob/main/PCbuild/readme.txt>`_.

If you wish, you can create a subdirectory and invoke configure from there.
For example::

    mkdir debug
    cd debug
    ../configure --with-pydebug
    make
    make test

(This will fail if you *also* built at the top-level directory.  You should do
a ``make clean`` at the top-level first.)

To get an optimized build of Python, ``configure --enable-optimizations``
before you run ``make``.  This sets the default make targets up to enable
Profile Guided Optimization (PGO) and may be used to auto-enable Link Time
Optimization (LTO) on some platforms.  For more details, see the sections
below.

Profile Guided Optimization
^^^^^^^^^^^^^^^^^^^^^^^^^^^

PGO takes advantage of recent versions of the GCC or Clang compilers.  If used,
either via ``configure --enable-optimizations`` or by manually running
``make profile-opt`` regardless of configure flags, the optimized build
process will perform the following steps:

The entire Python directory is cleaned of temporary files that may have
resulted from a previous compilation.

An instrumented version of the interpreter is built, using suitable compiler
flags for each flavor. 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's 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.11 <https://docs.python.org/3.11/whatsnew/3.11.html>`_ document.  For a more
detailed change log, read `Misc/NEWS
<https://github.com/python/cpython/tree/main/Misc/NEWS.d>`_, but a full
accounting of changes can only be gleaned from the `commit history
<https://github.com/python/cpython/commits/main>`_.

If you want to install multiple versions of Python, see the section below
entitled "Installing multiple versions".


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

`Documentation for Python 3.11 <https://docs.python.org/3.11/>`_ 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/main/Doc/README.rst>`_.


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/testing/run-write-tests.html>`_
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/python3.X``.  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.11 with 3.11 being the
primary version, you would execute ``make install`` in your 3.11 build directory
and ``make altinstall`` in the others.


Release Schedule
----------------

See :pep:`664` for Python 3.11 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 `LICENSE <https://github.com/python/cpython/blob/main/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�![_��$doc/alt-python311-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-python311-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�![�Yď$doc/alt-python311-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�![�S��
�
5doc/alt-python311-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�![�D��}}-doc/alt-python311-setuptools/docs/artwork.rstnu�[���=======
Artwork
=======

.. figure:: images/logo-over-white.svg
   :align: center

   Setuptools logo, designed in 2021 by `Anderson Bravalheri`_

Elements of Design
==================

The main colours of the design are a dark pastel azure (``#336790``) and a pale
orange (``#E5B62F``), referred in this document simply as "blue" and "yellow"
respectively. The text uses the *Monoid* typeface, an open source webfont that
was developed by Andreas Larsen and contributors in 2015 and is distributed
under the MIT or SIL licenses (more information at
https://github.com/larsenwork/monoid)


Usage
=====

The preferred way of using the setuptools logo is over a white (or light)
background. Alternatively, the following options can be considered, depending
on the circumstances:

- *"negative"* design - for dark backgrounds (e.g. website displayed in "dark
  mode"): the white colour (``#FFFFFF``) of the background and the "blue"
  (``#336790``) colour of the design can be swapped.
- *"monochrome"* - when colours are not available (e.g. black and white printed
  media): a completely black or white version of the logo can also be used.
- *"banner"* mode: the symbol and text can be used alongside depending on the
  available space.

The following image illustrate these alternatives:

.. image:: images/logo-demo.svg
   :align: center

Please refer to the SVG files in the `setuptools repository`_ for the specific
shapes and proportions between the elements of the design.


Working with the Design
=======================

The `setuptools repository`_ contains a series of vector representations of the
design under the ``docs/images`` directory. These representations can be
manipulated via any graphic editor that support SVG files,
however the free and open-source software Inkscape_ is recommended for maximum
compatibility.

When selecting the right file to work with, file names including
``editable-inkscape`` indicate "more editable" elements (e.g. editable text),
while the others prioritise SVG paths for maximum reproducibility.

Also notice that you might have to `install the correct fonts`_ to be able to
visualise or edit some of the designs.


Inspiration
===========

This design was inspired by :user:`cajhne`'s `original proposal`_ and the
ancient symbol of the ouroboros_.
It features a snake moving in a circular trajectory not only as a reference to
the Python programming language but also to the `wheel package format`_ as one
of the distribution formats supported by setuptools.
The shape of the snake also resembles a cog, which together with the hammer is
a nod to the two words that compose the name of the project.


License
=======


This logo, design variations or a modified version may be used by anyone to
refer to setuptools, but does not indicate endorsement by the project.

Redistribution, usage and derivative works are permitted under the same license
used by the setuptools software (MIT):

.. code-block:: text

   Copyright (c) Anderson Bravalheri

   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.

   THE USAGE OF THIS LOGO AND ARTWORK DOES NOT INDICATE ENDORSEMENT BY THE
   SETUPTOOLS PROJECT.

Whenever possible, please make the image a link to
https://github.com/pypa/setuptools or https://setuptools.pypa.io.


.. _Anderson Bravalheri: https://github.com/abravalheri
.. _Inkscape: https://inkscape.org
.. _setuptools repository: https://github.com/pypa/setuptools
.. _install the correct fonts: https://wiki.inkscape.org/wiki/Installing_fonts
.. _original proposal: https://github.com/pypa/setuptools/issues/2227#issuecomment-653628344
.. _wheel package format: https://www.python.org/dev/peps/pep-0427/
.. _ouroboros: https://en.wikipedia.org/wiki/Ouroboros
PK�![��l��0doc/alt-python311-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 allow for arbitrary execution, it
is difficult to provide a reliable user experience across environments
and history.

`PEP 517 <https://www.python.org/dev/peps/pep-0517/>`_ came to
the rescue and specified a new standard for packaging and distributing Python
modules. Under PEP 517:

    A ``pyproject.toml`` file is used to specify which program to use
    to generate the distribution.

    Two functions provided by the program, ``build_wheel(directory: str)``
    and ``build_sdist(directory: str)``, create the distribution bundle in the
    specified ``directory``.

    The program may use its own configuration file or extend the ``.toml`` file.

    The actual installation is done with ``pip install *.whl`` or
    ``pip install *.tar.gz``. If ``*.whl`` is available, ``pip`` will go ahead and copy
    its files into the ``site-packages`` directory. If not, ``pip`` will look at
    ``pyproject.toml`` and decide which program to use to 'build from source'.
    (Note that if there is no ``pyproject.toml`` file or the ``build-backend``
    parameter is not defined, then the fall-back behaviour is to use ``setuptools``.)

With this standard, switching between packaging tools is a lot easier.

How to use it?
--------------

Start with a package that you want to distribute. You will need your source
files, a ``pyproject.toml`` file and a ``setup.cfg`` file::

    ~/meowpkg/
        pyproject.toml
        setup.cfg
        meowpkg/
            __init__.py
            module.py

The ``pyproject.toml`` file specifies 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"]
    build-backend = "setuptools.build_meta"

``build_meta`` implements ``setuptools``' build system support.
The ``setuptools`` package implements the ``build_sdist``
command and the ``wheel`` package implements the ``build_wheel``
command; the latter is a dependency of the former
exposed via :pep:`517` hooks.

Use ``setuptools``' :ref:`declarative config <declarative config>` to
specify the package information in ``setup.cfg``::

    [metadata]
    name = meowpkg
    version = 0.0.1
    description = a package that meows

    [options]
    packages = find:

.. _building:

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


.. _backend-wrapper:

Dynamic build dependencies and other ``build_meta`` tweaks
----------------------------------------------------------

With the changes introduced by :pep:`517` and :pep:`518`, the
``setup_requires`` configuration field was deprecated in ``setup.cfg`` and
``setup.py``, in favour of directly listing build dependencies in the
``requires`` field of the ``build-system`` table of ``pyproject.toml``.
This approach has a series of advantages and gives package managers and
installers the ability to inspect the build requirements in advance and
perform a series of optimisations.

However, some package authors might still need to dynamically inspect the final
user's machine before deciding these requirements. One way of doing that, as
specified by :pep:`517`, is to "tweak" ``setuptools.build_meta`` by using an
:pep:`in-tree backend <517#in-tree-build-backends>`.

.. tip:: Before implementing an *in-tree* backend, have a look at
   :pep:`PEP 508 <508#environment-markers>`. Most of the time, dependencies
   with **environment markers** are enough to differentiate operating systems
   and platforms.

If you put the following configuration in your ``pyproject.toml``:

.. code-block:: toml

    [build-system]
    requires = ["setuptools"]
    build-backend = "backend"
    backend-path = ["_custom_build"]


then you can implement a thin wrapper around ``build_meta`` in
the ``_custom_build/backend.py`` file, as shown in the following example:

.. code-block:: python

    from setuptools import build_meta as _orig

    prepare_metadata_for_build_wheel = _orig.prepare_metadata_for_build_wheel
    build_wheel = _orig.build_wheel
    build_sdist = _orig.build_sdist


    def get_requires_for_build_wheel(self, config_settings=None):
        return _orig.get_requires_for_build_wheel(config_settings) + [...]


    def get_requires_for_build_sdist(self, config_settings=None):
        return _orig.get_requires_for_build_sdist(config_settings) + [...]


Note that you can override any of the functions specified in :pep:`PEP 517
<517#build-backend-interface>`, not only the ones responsible for gathering
requirements.

.. important:: Make sure your backend script is included in the :doc:`source
   distribution </userguide/distribution>`, otherwise the build will fail.
   This can be done by using a SCM_/VCS_ plugin (like :pypi:`setuptools-scm`
   and :pypi:`setuptools-svn`), or by correctly setting up :ref:`MANIFEST.in
   <manifest>`.

   The generated ``.tar.gz`` and ``.whl`` files are compressed archives that
   can be inspected as follows:
   On POSIX systems, this can be done with ``tar -tf dist/*.tar.gz``
   and ``unzip -l dist/*.whl``.
   On Windows systems, you can rename the ``.whl`` to ``.zip`` to be able to
   inspect it from File Explorer. You can also use the above ``tar`` command in a
   command prompt to inspect the ``.tar.gz`` file. Alternatively, there are GUI programs
   like `7-zip`_ that handle ``.tar.gz`` and ``.whl`` files.

   In general, the backend script should be present in the ``.tar.gz`` (so the
   project can be built from the source) but not in the ``.whl`` (otherwise the
   backend script would end up being distributed alongside your package).
   See ":doc:`/userguide/package_discovery`" for more details about package
   files.


.. _SCM: https://en.wikipedia.org/wiki/Software_configuration_management
.. _VCS: https://en.wikipedia.org/wiki/Version_control
.. _7-zip: https://www.7-zip.org
PK�![�rE��:doc/alt-python311-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�![��c���Adoc/alt-python311-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
`GitHub Discussions <https://github.com/pypa/setuptools/discussions>`_,
or the issue tracker (for specific issues).

Discussions about development happen on GitHub Discussions or
the ``setuptools`` channel on `PyPA Discord <https://discord.com/invite/pypa>`_.

-----------------
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.pypa.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``.

All the dependencies specified in these files are "vendorized" using a
simple Python script ``tools/vendor.py``.

To refresh the dependencies, run the following command::

    $ tox -e vendor
PK�![$dگ�7doc/alt-python311-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�![�c,_�-�-@doc/alt-python311-setuptools/docs/userguide/pyproject_config.rstnu�[���.. _pyproject.toml config:

-----------------------------------------------------
Configuring setuptools using ``pyproject.toml`` files
-----------------------------------------------------

.. note:: New in 61.0.0

.. important::
   If compatibility with legacy builds or versions of tools that don't support
   certain packaging standards (e.g. :pep:`517` or :pep:`660`), a simple ``setup.py``
   script can be added to your project [#setupcfg-caveats]_
   (while keeping the configuration in ``pyproject.toml``):

   .. code-block:: python

       from setuptools import setup

       setup()

Starting with :pep:`621`, the Python community selected ``pyproject.toml`` as
a standard way of specifying *project metadata*.
``Setuptools`` has adopted this standard and will use the information contained
in this file as an input in the build process.

The example below illustrates how to write a ``pyproject.toml`` file that can
be used with ``setuptools``. It contains two TOML tables (identified by the
``[table-header]`` syntax): ``build-system`` and ``project``.
The ``build-system`` table is used to tell the build frontend (e.g.
:pypi:`build` or :pypi:`pip`) to use ``setuptools`` and any other plugins (e.g.
``setuptools-scm``) to build the package.
The ``project`` table contains metadata fields as described by
:doc:`PyPUG:specifications/declaring-project-metadata` guide.

.. _example-pyproject-config:

.. code-block:: toml

   [build-system]
   requires = ["setuptools", "setuptools-scm"]
   build-backend = "setuptools.build_meta"

   [project]
   name = "my_package"
   description = "My package description"
   readme = "README.rst"
   requires-python = ">=3.7"
   keywords = ["one", "two"]
   license = {text = "BSD 3-Clause License"}
   classifiers = [
       "Framework :: Django",
       "Programming Language :: Python :: 3",
   ]
   dependencies = [
       "requests",
       'importlib-metadata; python_version<"3.8"',
   ]
   dynamic = ["version"]

   [project.optional-dependencies]
   pdf = ["ReportLab>=1.2", "RXP"]
   rest = ["docutils>=0.3", "pack ==1.1, ==1.3"]

   [project.scripts]
   my-script = "my_package.module:function"

   # ... other project metadata fields as specified in:
   #     https://packaging.python.org/en/latest/specifications/declaring-project-metadata/

.. _setuptools-table:

Setuptools-specific configuration
=================================

.. warning::
   Support for declaring configurations not standardized by :pep:`621`
   (i.e.  the ``[tool.setuptools]`` table),
   is still in **beta** stage and might change in future releases.

While the standard ``project`` table in the ``pyproject.toml`` file covers most
of the metadata used during the packaging process, there are still some
``setuptools``-specific configurations that can be set by users that require
customization.
These configurations are completely optional and probably can be skipped when
creating simple packages.
They are equivalent to the :doc:`/references/keywords` used by the ``setup.py``
file, and can be set via the ``tool.setuptools`` table:

========================= =========================== =========================
Key                       Value Type (TOML)           Notes
========================= =========================== =========================
``platforms``             array
``zip-safe``              boolean                     If not specified, ``setuptools`` will try to guess
                                                      a reasonable default for the package
``eager-resources``       array
``py-modules``            array                       See tip below
``packages``              array or ``find`` directive See tip below
``package-dir``           table/inline-table          Used when explicitly listing ``packages``
``namespace-packages``    array                       **Deprecated** - Use implicit namespaces instead (:pep:`420`)
``package-data``          table/inline-table          See :doc:`/userguide/datafiles`
``include-package-data``  boolean                     ``True`` by default
``exclude-package-data``  table/inline-table
``license-files``         array of glob patterns      **Provisional** - likely to change with :pep:`639`
                                                      (by default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``)
``data-files``            table/inline-table          **Discouraged** - check :doc:`/userguide/datafiles`
``script-files``          array                       **Deprecated** - equivalent to the ``script`` keyword in ``setup.py``
                                                      (should be avoided in favour of ``project.scripts``)
``provides``              array                       **Ignored by pip**
``obsoletes``             array                       **Ignored by pip**
========================= =========================== =========================

.. note::
   The `TOML value types`_ ``array`` and ``table/inline-table`` are roughly
   equivalent to the Python's :obj:`list` and :obj:`dict` data types, respectively.

Please note that some of these configurations are deprecated or at least
discouraged, but they are made available to ensure portability.
New packages should avoid relying on deprecated/discouraged fields, and
existing packages should consider alternatives.

.. tip::
   When both ``py-modules`` and ``packages`` are left unspecified,
   ``setuptools`` will attempt to perform :ref:`auto-discovery`, which should
   cover most popular project directory organization techniques, such as the
   :ref:`src-layout` and the :ref:`flat-layout`.

   However if your project does not follow these conventional layouts
   (e.g. you want to use a ``flat-layout`` but at the same time have custom
   directories at the root of your project), you might need to use the ``find``
   directive [#directives]_ as shown below:

   .. code-block:: toml

      [tool.setuptools.packages.find]
      where = ["src"]  # list of folders that contain the packages (["."] by default)
      include = ["my_package*"]  # package names should match these glob patterns (["*"] by default)
      exclude = ["my_package.tests*"]  # exclude packages matching these glob patterns (empty by default)
      namespaces = false  # to disable scanning PEP 420 namespaces (true by default)

   Note that the glob patterns in the example above need to be matched
   by the **entire** package name. This means that if you specify ``exclude = ["tests"]``,
   modules like ``tests.my_package.test1`` will still be included in the distribution
   (to remove them, add a wildcard to the end of the pattern: ``"tests*"``).

   Alternatively, you can explicitly list the packages in modules:

   .. code-block:: toml

      [tool.setuptools]
      packages = ["my_package"]


.. _dynamic-pyproject-config:

Dynamic Metadata
================

Note that in the first example of this page we use ``dynamic`` to identify
which metadata fields are dynamically computed during the build by either
``setuptools`` itself or the plugins installed via ``build-system.requires``
(e.g. ``setuptools-scm`` is capable of deriving the current project version
directly from the ``git`` :wiki:`version control` system).

Currently the following fields can be listed as dynamic: ``version``,
``classifiers``, ``description``, ``entry-points``, ``scripts``,
``gui-scripts`` and ``readme``.
When these fields are expected to be provided by ``setuptools`` a
corresponding entry is required in the ``tool.setuptools.dynamic`` table
[#entry-points]_. For example:

.. code-block:: toml

   # ...
   [project]
   name = "my_package"
   dynamic = ["version", "readme"]
   # ...
   [tool.setuptools.dynamic]
   version = {attr = "my_package.VERSION"}
   readme = {file = ["README.rst", "USAGE.rst"]}

In the ``dynamic`` table, the ``attr`` directive [#directives]_ will read an
attribute from the given module [#attr]_, while ``file`` will read the contents
of all given files and concatenate them in a single string.

========================== =================== =================================================================================================
Key                        Directive           Notes
========================== =================== =================================================================================================
``version``                ``attr``, ``file``
``readme``                 ``file``
``description``            ``file``            One-line text
``classifiers``            ``file``            Multi-line text with one classifier per line
``entry-points``           ``file``            INI format following :doc:`PyPUG:specifications/entry-points`
                                               (``console_scripts`` and ``gui_scripts`` can be included)
``dependencies``           ``file``            ``requirements.txt`` format (``#`` comments and blank lines excluded) **BETA**
``optional-dependencies``  ``file``            ``requirements.txt`` format per group (``#`` comments and blank lines excluded) **BETA**
========================== =================== =================================================================================================

Supporting ``file`` for dependencies is meant for a convenience for packaging
applications with possibly strictly versioned dependencies.

Library packagers are discouraged from using overly strict (or "locked")
dependency versions in their ``dependencies`` and ``optional-dependencies``.

Currently, when specifying ``optional-dependencies`` dynamically, all of the groups
must be specified dynamically; one can not specify some of them statically and
some of them dynamically.

Also note that the file format for specifying dependencies resembles a ``requirements.txt`` file,
however please keep in mind that all non-comment lines must conform with :pep:`508`
(``pip``-specify syntaxes, e.g. ``-c/-r/-e`` flags, are not supported).


.. attention::
   When using the ``file`` directive, please make sure that all necessary
   files are included in the ``sdist``. You can do that via ``MANIFEST.in``
   or using plugins such as ``setuptools-scm``.
   Please have a look on :doc:`/userguide/miscellaneous` for more information.

----

.. rubric:: Notes

.. [#setupcfg-caveats] ``pip`` may allow editable install only with ``pyproject.toml``
   and ``setup.cfg``. However, this behavior may not be consistent over various ``pip``
   versions and other packaging-related tools
   (``setup.py`` is more reliable on those scenarios).

.. [#entry-points] Dynamic ``scripts`` and ``gui-scripts`` are a special case.
   When resolving these metadata keys, ``setuptools`` will look for
   ``tool.setuptool.dynamic.entry-points``, and use the values of the
   ``console_scripts`` and ``gui_scripts`` :doc:`entry-point groups
   <PyPUG:specifications/entry-points>`.

.. [#directives] In the context of this document, *directives* are special TOML
   values that are interpreted differently by ``setuptools`` (usually triggering an
   associated function). Most of the times they correspond to a special TOML table
   (or inline-table) with a single top-level key.
   For example, you can have the ``{find = {where = ["src"], exclude=["tests*"]}}``
   directive for ``tool.setuptools.packages``, or ``{attr = "mymodule.attr"}``
   directive for ``tool.setuptools.dynamic.version``.

.. [#attr] ``attr`` is meant to be used when the module attribute is statically
   specified (e.g. as a string, list or tuple). As a rule of thumb, the
   attribute should be able to be parsed with :func:`ast.literal_eval`, and
   should not be modified or re-assigned.

.. _TOML value types: https://toml.io/en/v1.0.0
PK�![6�m��1�1Bdoc/alt-python311-setuptools/docs/userguide/declarative_config.rstnu�[���.. _declarative config:

------------------------------------------------
Configuring setuptools 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: my_package.VERSION
    description = My package description
    long_description = file: README.rst, CHANGELOG.rst, LICENSE.rst
    keywords = one, two
    license = BSD 3-Clause License
    classifiers =
        Framework :: Django
        Programming Language :: Python :: 3

    [options]
    zip_safe = False
    include_package_data = True
    packages = find:
    install_requires =
        requests
        importlib-metadata; python_version<"3.8"

    [options.package_data]
    * = *.txt, *.rst
    hello = *.msg

    [options.entry_points]
    console_scripts =
        executable-name = my_package.module:function

    [options.extras_require]
    pdf = ReportLab>=1.2; RXP
    rest = docutils>=0.3; pack ==1.1, ==1.3

    [options.packages.find]
    exclude =
        examples*
        tools*
        docs*
        my_package.tests*

Metadata and options are set in the config sections of the same name.

* Keys are the same as the :doc:`keyword arguments </references/keywords>` 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 configuration has all the Python 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, using :ref:`package_dir <keyword/package_dir>`, 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

In this example, the value for the :ref:`package_dir <keyword/package_dir>`
configuration (i.e. ``=src``) is parsed as ``{"": "src"}``.
The ``""`` key has a special meaning in this context, and indicates that all the
packages are contained inside the given directory.
Also note that the value for ``[options.packages.find] where`` matches the
value associated with ``""`` in the ``package_dir`` dictionary.

..
   TODO: Add the following tip once the auto-discovery is no longer experimental:

   Starting in version 61, ``setuptools`` can automatically infer the
   configurations for both ``packages`` and ``package_dir`` for projects using
   a ``src/`` layout (as long as no value is specified for ``py_modules``).
   Please see :doc:`package discovery </userguide/package_discovery>` for more
   details.

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 each entry corresponds to a key/value pair,
  with keys separated from values by ``=``.
  If an entry starts with ``=``, the key is assumed to be an empty string
  (e.g. ``=src`` is parsed as ``{"": "src"}``).
* ``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

  .. important::
      The ``file:`` directive is sandboxed and won't reach anything outside the
      project directory (i.e. the directory containing ``setup.cfg``/``pyproject.toml``).

  .. attention::
      When using the ``file:`` directive, please make sure that all necessary
      files are included in the ``sdist``. You can do that via ``MANIFEST.in``
      or using plugins such as ``setuptools-scm``.
      Please have a look on :doc:`/userguide/miscellaneous` for more information.


Metadata
--------

.. attention::
    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         file:, list-semi                                     **BETA** [#opt-6]_
extras_require           file:, section                                       **BETA** [#opt-2]_, [#opt-6]_
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                                           [#opt-5]_
py_modules               list-comma                           34.4.0
data_files               section                              40.6.0          [#opt-4]_
=======================  ===================================  =============== ====================

**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.

.. [#opt-4] ``data_files`` is deprecated and should be avoided.
   Please check :doc:`/userguide/datafiles` for more information.

.. [#opt-5] ``namespace_packages`` is deprecated in favour of native/implicit
   namespaces (:pep:`420`). Check :doc:`the Python Packaging User Guide
   <PyPUG:guides/packaging-namespace-packages>` for more information.

.. [#opt-6] ``file:`` directives for reading requirements are supported since version 62.6.
   The format for the file resembles a ``requirements.txt`` file,
   however please keep in mind that all non-comment lines must conform with :pep:`508`
   (``pip``-specify syntaxes, e.g. ``-c/-r/-e`` flags, are not supported).
   Library developers should avoid tightly pinning their dependencies to a specific
   version (e.g. via a "locked" requirements file).


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�![?׷Y/Y/@doc/alt-python311-setuptools/docs/userguide/development_mode.rstnu�[���Development Mode (a.k.a. "Editable Installs")
=============================================

When creating a Python project, developers usually want to implement and test
changes iteratively, before cutting a release and preparing a distribution archive.

In normal circumstances this can be quite cumbersome and require the developers
to manipulate the ``PYTHONPATH`` environment variable or to continuously re-build
and re-install the project.

To facilitate iterative exploration and experimentation, setuptools allows
users to instruct the Python interpreter and its import machinery to load the
code under development directly from the project folder without having to
copy the files to a different location in the disk.
This means that changes in the Python source code can immediately take place
without requiring a new installation.

You can enter this "development mode" by performing an :doc:`editable installation
<pip:topics/local-project-installs>` inside of a :term:`virtual environment`,
using :doc:`pip's <pip:cli/pip_install>` ``-e/--editable`` flag, as shown below:

.. code-block:: bash

   $ cd your-python-project
   $ python -m venv .venv
   # Activate your environemt with:
   #      `source .venv/bin/activate` on Unix/macOS
   # or   `.venv\Scripts\activate` on Windows

   $ pip install --editable .

   # Now you have access to your package
   # as if it was installed in .venv
   $ python -c "import your_python_project"


An "editable installation" works very similarly to a regular install with
``pip install .``, except that it only installs your package dependencies,
metadata and wrappers for :ref:`console and GUI scripts <console-scripts>`.
Under the hood, setuptools will try to create a special :mod:`.pth file <site>`
in the target directory (usually ``site-packages``) that extends the
``PYTHONPATH`` or install a custom :doc:`import hook <python:reference/import>`.

When you're done with a given development task, you can simply uninstall your
package (as you would normally do with ``pip uninstall <package name>``).

Please note that, by default an editable install will expose at least all the
files that would be available in a regular installation. However, depending on
the file and directory organization in your project, it might also expose
as a side effect files that would not be normally available.
This is allowed so you can iteratively create new Python modules.
Please have a look on the following section if you are looking for a different behaviour.

.. admonition:: Virtual Environments

   You can think about virtual environments as "isolated Python runtime deployments"
   that allow users to install different sets of libraries and tools without
   messing with the global behaviour of the system.

   They are a safe way of testing new projects and can be created easily
   with the :mod:`venv` module from the standard library.

   Please note however that depending on your operating system or distribution,
   ``venv`` might not come installed by default with Python. For those cases,
   you might need to use the OS package manager to install it.
   For example, in Debian/Ubuntu-based systems you can obtain it via:

   .. code-block:: bash

       sudo apt install python3-venv

   Alternatively, you can also try installing :pypi:`virtualenv`.
   More information is available on the Python Packaging User Guide on
   :doc:`PyPUG:guides/installing-using-pip-and-virtual-environments`.

.. note::
    .. versionchanged:: v64.0.0
       Editable installation hooks implemented according to :pep:`660`.
       Support for :pep:`namespace packages <420>` is still **EXPERIMENTAL**.


"Strict" editable installs
--------------------------

When thinking about editable installations, users might have the following
expectations:

1. It should allow developers to add new files (or split/rename existing ones)
   and have them automatically exposed.
2. It should behave as close as possible to a regular installation and help
   users to detect problems (e.g. new files not being included in the distribution).

Unfortunately these expectations are in conflict with each other.
To solve this problem ``setuptools`` allows developers to choose a more
*"strict"* mode for the editable installation. This can be done by passing
a special *configuration setting* via :pypi:`pip`, as indicated below:

.. code-block:: bash

    pip install -e . --config-settings editable_mode=strict

In this mode, new files **won't** be exposed and the editable installs will
try to mimic as much as possible the behavior of a regular install.
Under the hood, ``setuptools`` will create a tree of file links in an auxiliary
directory (``$your_project_dir/build``) and add it to ``PYTHONPATH`` via a
:mod:`.pth file <site>`. (Please be careful to not delete this repository
by mistake otherwise your files may stop being accessible).

.. warning::
   Strict editable installs require auxiliary files to be placed in a
   ``build/__editable__.*`` directory (relative to your project root).

   Please be careful to not remove this directory while testing your project,
   otherwise your editable installation may be compromised.

   You can remove the ``build/__editable__.*`` directory after uninstalling.


.. note::
    .. versionadded:: v64.0.0
       Added new *strict* mode for editable installations.
       The exact details of how this mode is implemented may vary.


Limitations
-----------

- The *editable* term is used to refer only to Python modules
  inside the package directories. Non-Python files, external (data) files,
  executable script files, binary extensions, headers and metadata may be
  exposed as a *snapshot* of the version they were at the moment of the
  installation.
- Adding new dependencies, entry-points or changing your project's metadata
  require a fresh "editable" re-installation.
- Console scripts and GUI scripts **MUST** be specified via :doc:`entry-points
  </userguide/entry_point>` to work properly.
- *Strict* editable installs require the file system to support
  either :wiki:`symbolic <symbolic link>` or :wiki:`hard links <hard link>`.
  This installation mode might also generate auxiliary files under the project directory.
- There is *no guarantee* that the editable installation will be performed
  using a specific technique. Depending on each project, ``setuptools`` may
  select a different approach to ensure the package is importable at runtime.
- There is *no guarantee* that files outside the top-level package directory
  will be accessible after an editable install.
- There is *no guarantee* that attributes like ``__path__`` or ``__file__``
  will correspond to the exact location of the original files (e.g.,
  ``setuptools`` might employ file links to perform the editable installation).
  Users are encouraged to use tools like :mod:`importlib.resources` or
  :mod:`importlib.metadata` when trying to access package files directly.
- Editable installations may not work with
  :doc:`namespaces created with pkgutil or pkg_resources
  <PyPUG:guides/packaging-namespace-packages>`.
  Please use :pep:`420`-style implicit namespaces [#namespaces]_.
- Support for :pep:`420`-style implicit namespace packages for
  projects structured using :ref:`flat-layout` is still **experimental**.
  If you experience problems, you can try converting your package structure
  to the :ref:`src-layout`.
- File system entries in the current working directory
  whose names coincidentally match installed packages
  may take precedence in :doc:`Python's import system <python:reference/import>`.
  Users are encouraged to avoid such scenarios [#cwd]_.

.. attention::
   Editable installs are **not a perfect replacement for regular installs**
   in a test environment. When in doubt, please test your projects as
   installed via a regular wheel. There are tools in the Python ecosystem,
   like :pypi:`tox` or :pypi:`nox`, that can help you with that
   (when used with appropriate configuration).


Legacy Behavior
---------------

If your project is not compatible with the new "editable installs" or you wish
to replicate the legacy behavior, for the time being you can also perform the
installation in the ``compat`` mode:

.. code-block:: bash

    pip install -e . --config-settings editable_mode=compat

This installation mode will try to emulate how ``python setup.py develop``
works (still within the context of :pep:`660`).

.. warning::
   The ``compat`` mode is *transitional* and will be removed in
   future versions of ``setuptools``, it exists only to help during the
   migration period.
   Also note that support for this mode is limited:
   it is safe to assume that the ``compat`` mode is offered "as is", and
   improvements are unlikely to be implemented.
   Users are encouraged to try out the new editable installation techniques
   and make the necessary adaptations.

If the ``compat`` mode does not work for you, you can also disable the
:pep:`editable install <660>` hooks in ``setuptools`` by setting an environment
variable:

.. code-block::

   SETUPTOOLS_ENABLE_FEATURES="legacy-editable"

This *may* cause the installer (e.g. ``pip``) to effectively run the "legacy"
installation command: ``python setup.py develop`` [#installer]_.


How editable installations work
-------------------------------

*Advanced topic*

There are many techniques that can be used to expose packages under development
in such a way that they are available as if they were installed.
Depending on the project file structure and the selected mode, ``setuptools``
will choose one of these approaches for the editable installation [#criteria]_.

A non-exhaustive list of implementation mechanisms is presented below.
More information is available on the text of :pep:`PEP 660 <660#what-to-put-in-the-wheel>`.

- A static ``.pth`` file [#static_pth]_ can be added to one of the directories
  listed in :func:`site.getsitepackages` or :func:`site.getusersitepackages` to
  extend :obj:`sys.path`.
- A directory containing a *farm of file links* that mimic the
  project structure and point to the original files can be employed.
  This directory can then be added to :obj:`sys.path` using a static ``.pth`` file.
- A dynamic ``.pth`` file [#dynamic_pth]_ can also be used to install an
  "import :term:`finder`" (:obj:`~importlib.abc.MetaPathFinder` or
  :obj:`~importlib.abc.PathEntryFinder`) that will hook into Python's
  :doc:`import system <python:reference/import>` machinery.

.. attention::
   ``Setuptools`` offers **no guarantee** of which technique will be used to
   perform an editable installation. This will vary from project to project
   and may change depending on the specific version of ``setuptools`` being
   used.


----

.. rubric:: Notes

.. [#namespaces]
   You *may* be able to use *strict* editable installations with namespace
   packages created with ``pkgutil`` or ``pkg_namespaces``, however this is not
   officially supported.

.. [#cwd]
   Techniques like the :ref:`src-layout` or tooling-specific options like
   `tox's changedir <https://tox.wiki/en/stable/config.html#conf-changedir>`_
   can be used to prevent such kinds of situations (checkout `this blog post
   <https://blog.ganssle.io/articles/2019/08/test-as-installed.html>`_ for more
   insights).

.. [#installer]
   For this workaround to work, the installer tool needs to support legacy
   editable installations. (Future versions of ``pip``, for example, may drop
   support for this feature).

.. [#criteria]
   ``setuptools`` strives to find a balance between allowing the user to see
   the effects of project files being edited while still trying to keep the
   editable installation as similar as possible to a regular installation.

.. [#static_pth]
   i.e., a ``.pth`` file where each line correspond to a path that should be
   added to :obj:`sys.path`. See :mod:`Site-specific configuration hook <site>`.

.. [#dynamic_pth]
   i.e., a ``.pth`` file that starts where each line starts with an ``import``
   statement and executes arbitrary Python code. See :mod:`Site-specific
   configuration hook <site>`.
PK�![����G�G;doc/alt-python311-setuptools/docs/userguide/entry_point.rstnu�[���.. _`entry_points`:

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

Entry points are a type of metadata that can be exposed by packages on installation.
They are a very useful feature of the Python ecosystem,
and come specially handy in two scenarios:

1. The package would like to provide commands to be run at the terminal.
This functionality is known as *console* scripts. The command may also
open up a GUI, in which case it is known as a *GUI* script. An example
of a console script is the one provided by the :pypi:`pip` package, which
allows you to run commands like ``pip install`` in the terminal.

2. A package would like to enable customization of its functionalities
via *plugins*. For example, the test framework :pypi:`pytest` allows
customization via the ``pytest11`` entry point, and the syntax
highlighting tool :pypi:`pygments` allows specifying additional styles
using the entry point ``pygments.styles``.


.. _console-scripts:

Console Scripts
===============

Let us start with console scripts.
First consider an example without entry points. Imagine a package
defined thus::

    project_root_directory
    ├── pyproject.toml        # and/or setup.cfg, setup.py
    └── src
        └── timmins
            ├── __init__.py
            └── ...

with ``__init__.py`` as:

.. code-block:: python

    def hello_world():
        print("Hello world")

Now, suppose that we would like to provide some way of executing the
function ``hello_world()`` from the command-line. One way to do this
is to create a file ``src/timmins/__main__.py`` providing a hook as
follows:

.. code-block:: python

    from . import hello_world

    if __name__ == '__main__':
        hello_world()

Then, after installing the package ``timmins``, we may invoke the ``hello_world()``
function as follows, through the `runpy <https://docs.python.org/3/library/runpy.html>`_
module:

.. code-block:: bash

    $ python -m timmins
    Hello world

Instead of this approach using ``__main__.py``, you can also create a
user-friendly CLI executable that can be called directly without ``python -m``.
In the above example, to create a command ``hello-world`` that invokes
``timmins.hello_world``, add a console script entry point to your
configuration:

.. tab:: pyproject.toml

   .. code-block:: toml

        [project.scripts]
        hello-world = "timmins:hello_world"

.. tab:: setup.cfg

    .. code-block:: ini

        [options.entry_points]
        console_scripts =
            hello-world = timmins:hello_world

.. tab:: setup.py

    .. code-block:: python

        from setuptools import setup

        setup(
            # ...,
            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:

.. code-block:: bash

   $ hello-world
   Hello world

Note that any function configured as a console script, i.e. ``hello_world()`` in
this example, should not accept any arguments. If your function requires any input
from the user, you can use regular command-line argument parsing utilities like
:mod:`argparse` within the body of
the function to parse user input given via :obj:`sys.argv`.

You may have noticed that we have used a special syntax to specify the function
that must be invoked by the console script, i.e. we have written ``timmins:hello_world``
with a colon ``:`` separating the package name and the function name. The full
specification of this syntax is discussed in the `last section <#entry-points-syntax>`_
of this document, and this can be used to specify a function located anywhere in
your package, not just in ``__init__.py``.

GUI Scripts
===========

In addition to ``console_scripts``, Setuptools supports ``gui_scripts``, which
will launch a GUI application without running in a terminal window.

For example, if we have a project with the same directory structure as before,
with an ``__init__.py`` file containing the following:

.. code-block:: python

    import PySimpleGUI as sg

    def hello_world():
        sg.Window(title="Hello world", layout=[[]], margins=(100, 50)).read()

Then, we can add a GUI script entry point:

.. tab:: pyproject.toml

   .. code-block:: toml

        [project.gui-scripts]
        hello-world = "timmins:hello_world"

.. tab:: setup.cfg

    .. code-block:: ini

        [options.entry_points]
        gui_scripts =
            hello-world = timmins:hello_world

.. tab:: setup.py

    .. code-block:: python

        from setuptools import setup

        setup(
            # ...,
            entry_points={
                'gui_scripts': [
                    'hello-world = timmins:hello_world',
                ]
            }
        )

.. note::
   To be able to import ``PySimpleGUI``, you need to add ``pysimplegui`` to your package dependencies.
   See :doc:`/userguide/dependency_management` for more information.

Now, running:

.. code-block:: bash

   $ hello-world

will open a small application window with the title 'Hello world'.

Note that just as with console scripts, any function configured as a GUI script
should not accept any arguments, and any user input can be parsed within the
body of the function. GUI scripts also use the same syntax (discussed in the
`last section <#entry-points-syntax>`_) for specifying the function to be invoked.

.. note::

    The difference between ``console_scripts`` and ``gui_scripts`` only affects
    Windows systems. [#use_for_scripts]_ ``console_scripts`` are wrapped in a console
    executable, so they are attached to a console and can use ``sys.stdin``,
    ``sys.stdout`` and ``sys.stderr`` for input and output. ``gui_scripts`` are
    wrapped in a GUI executable, so they can be started without a console, but
    cannot use standard streams unless application code redirects them. Other
    platforms do not have the same distinction.

.. note::

    Console and GUI scripts work because behind the scenes, installers like :pypi:`pip`
    create wrapper scripts around the function(s) being invoked. For example,
    the ``hello-world`` entry point in the above two examples would create a
    command ``hello-world`` launching a script like this: [#use_for_scripts]_

    .. code-block:: python

        import sys
        from timmins import hello_world
        sys.exit(hello_world())

.. _dynamic discovery of services and plugins:

Advertising Behavior
====================

Console/GUI 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/GUI scripts work similarly, where libraries advertise their commands
and tools like ``pip`` create wrapper scripts that invoke those commands.

Entry Points for Plugins
========================

Let us consider a simple example to understand how we can implement entry points
corresponding to plugins. Say we have a package ``timmins`` with the following
directory structure::

    timmins
    ├── pyproject.toml        # and/or setup.cfg, setup.py
    └── src
        └── timmins
            └── __init__.py

and in ``src/timmins/__init__.py`` we have the following code:

.. code-block:: python

   def hello_world():
       print('Hello world')

Basically, we have defined a ``hello_world()`` function which will print the text
'Hello world'. Now, let us say we want to print the text 'Hello world' in different
ways. The current function just prints the text as it is - let us say we want another
style in which the text is enclosed within exclamation marks::

    !!! Hello world !!!

Let us see how this can be done using plugins. First, let us separate the style of
printing the text from the text itself. In other words, we can change the code in
``src/timmins/__init__.py`` to something like this:

.. code-block:: python

   def display(text):
       print(text)

   def hello_world():
       display('Hello world')

Here, the ``display()`` function controls the style of printing the text, and the
``hello_world()`` function calls the ``display()`` function to print the text 'Hello
world`.

Right now the ``display()`` function just prints the text as it is. In order to be able
to customize it, we can do the following. Let us introduce a new *group* of entry points
named ``timmins.display``, and expect plugin packages implementing this entry point
to supply a ``display()``-like function. Next, to be able to automatically discover plugin
packages that implement this entry point, we can use the
:mod:`importlib.metadata` module,
as follows:

.. code-block:: python

   from importlib.metadata import entry_points
   display_eps = entry_points(group='timmins.display')

.. note::
   Each ``importlib.metadata.EntryPoint`` object is an object containing a ``name``, a
   ``group``, and a ``value``. For example, after setting up the plugin package as
   described below, ``display_eps`` in the above code will look like this: [#package_metadata]_

   .. code-block:: python

       (
           EntryPoint(name='excl', value='timmins_plugin_fancy:excl_display', group='timmins.display'),
           ...,
       )

``display_eps`` will now be a list of ``EntryPoint`` objects, each referring to ``display()``-like
functions defined by one or more installed plugin packages. Then, to import a specific
``display()``-like function - let us choose the one corresponding to the first discovered
entry point - we can use the ``load()`` method as follows:

.. code-block:: python

   display = display_eps[0].load()

Finally, a sensible behaviour would be that if we cannot find any plugin packages customizing
the ``display()`` function, we should fall back to our default implementation which prints
the text as it is. With this behaviour included, the code in ``src/timmins/__init__.py``
finally becomes:

.. code-block:: python

   from importlib.metadata import entry_points
   display_eps = entry_points(group='timmins.display')
   try:
       display = display_eps[0].load()
   except IndexError:
       def display(text):
           print(text)

   def hello_world():
       display('Hello world')

That finishes the setup on ``timmins``'s side. Next, we need to implement a plugin
which implements the entry point ``timmins.display``. Let us name this plugin
``timmins-plugin-fancy``, and set it up with the following directory structure::

    timmins-plugin-fancy
    ├── pyproject.toml        # and/or setup.cfg, setup.py
    └── src
        └── timmins_plugin_fancy
            └── __init__.py

And then, inside ``src/timmins_plugin_fancy/__init__.py``, we can put a function
named ``excl_display()`` that prints the given text surrounded by exclamation marks:

.. code-block:: python

   def excl_display(text):
       print('!!!', text, '!!!')

This is the ``display()``-like function that we are looking to supply to the
``timmins`` package. We can do that by adding the following in the configuration
of ``timmins-plugin-fancy``:

.. tab:: pyproject.toml

   .. code-block:: toml

        # Note the quotes around timmins.display in order to escape the dot .
        [project.entry-points."timmins.display"]
        excl = "timmins_plugin_fancy:excl_display"

.. tab:: setup.cfg

   .. code-block:: ini

        [options.entry_points]
        timmins.display =
            excl = timmins_plugin_fancy:excl_display

.. tab:: setup.py

   .. code-block:: python

        from setuptools import setup

        setup(
            # ...,
            entry_points = {
                'timmins.display': [
                    'excl = timmins_plugin_fancy:excl_display'
                ]
            }
        )

Basically, this configuration states that we are a supplying an entry point
under the group ``timmins.display``. The entry point is named ``excl`` and it
refers to the function ``excl_display`` defined by the package ``timmins-plugin-fancy``.

Now, if we install both ``timmins`` and ``timmins-plugin-fancy``, we should get
the following:

.. code-block:: pycon

   >>> from timmins import hello_world
   >>> hello_world()
   !!! Hello world !!!

whereas if we only install ``timmins`` and not ``timmins-plugin-fancy``, we should
get the following:

.. code-block:: pycon

   >>> from timmins import hello_world
   >>> hello_world()
   Hello world

Therefore, our plugin works.

Our plugin could have also defined multiple entry points under the group ``timmins.display``.
For example, in ``src/timmins_plugin_fancy/__init__.py`` we could have two ``display()``-like
functions, as follows:

.. code-block:: python

   def excl_display(text):
       print('!!!', text, '!!!')

   def lined_display(text):
       print(''.join(['-' for _ in text]))
       print(text)
       print(''.join(['-' for _ in text]))

The configuration of ``timmins-plugin-fancy`` would then change to:

.. tab:: pyproject.toml

   .. code-block:: toml

        [project.entry-points."timmins.display"]
        excl = "timmins_plugin_fancy:excl_display"
        lined = "timmins_plugin_fancy:lined_display"

.. tab:: setup.cfg

   .. code-block:: ini

        [options.entry_points]
        timmins.display =
            excl = timmins_plugin_fancy:excl_display
            lined = timmins_plugin_fancy:lined_display

.. tab:: setup.py

   .. code-block:: python

        from setuptools import setup

        setup(
            # ...,
            entry_points = {
                'timmins.display': [
                    'excl = timmins_plugin_fancy:excl_display',
                    'lined = timmins_plugin_fancy:lined_display',
                ]
            }
        )

On the ``timmins`` side, we can also use a different strategy of loading entry
points. For example, we can search for a specific display style:

.. code-block:: python

   display_eps = entry_points(group='timmins.display')
   try:
       display = display_eps['lined'].load()
   except KeyError:
       # if the 'lined' display is not available, use something else
       ...

Or we can also load all plugins under the given group. Though this might not
be of much use in our current example, there are several scenarios in which this
is useful:

.. code-block:: python

   display_eps = entry_points(group='timmins.display')
   for ep in display_eps:
       display = ep.load()
       # do something with display
       ...

Another point is that in this particular example, we have used plugins to
customize the behaviour of a function (``display()``). In general, we can use entry
points to enable plugins to not only customize the behaviour of functions, but also
of entire classes and modules. This is unlike the case of console/GUI scripts,
where entry points can only refer to functions. The syntax used for specifying the
entry points remains the same as for console/GUI scripts, and is discussed in the
`last section <#entry-points-syntax>`_.

.. tip::
    The recommended approach for loading and importing entry points is the
    :mod:`importlib.metadata` module,
    which is a part of the standard library since Python 3.8. For older versions of
    Python, its backport :pypi:`importlib_metadata` should be used. While using the
    backport, the only change that has to be made is to replace ``importlib.metadata``
    with ``importlib_metadata``, i.e.

    .. code-block:: python

       from importlib_metadata import entry_points
       ...

In summary, entry points allow a package to open its functionalities for
customization via plugins.
The package soliciting the entry points need not have any dependency
or prior knowledge about the plugins implementing the entry points, and
downstream users are able to compose functionality by pulling together
plugins implementing the entry points.

Entry Points Syntax
===================

The syntax for entry points is specified as follows::

    <name> = <package_or_module>[:<object>[.<attr>[.<nested-attr>]*]]

Here, the square brackets ``[]`` denote optionality and the asterisk ``*``
denotes repetition.
``name`` is the name of the script/entry point you want to create, the left hand
side of ``:`` is the package or module that contains the object you want to invoke
(think about it as something you would write in an import statement), and the right
hand side is the object you want to invoke (e.g. a function).

To make this syntax more clear, consider the following examples:

Package or module
    If you supply::

       <name> = <package_or_module>

    as the entry point, where ``<package_or_module>`` can contain ``.`` in the case
    of sub-modules or sub-packages, then, tools in the Python ecosystem will roughly
    interpret this value as:

    .. code-block:: python

        import <package_or_module>
        parsed_value = <package_or_module>

Module-level object
   If you supply::

        <name> = <package_or_module>:<object>

   where ``<object>`` does not contain any ``.``, this will be roughly interpreted
   as:

   .. code-block:: python

       from <package_or_module> import <object>
       parsed_value = <object>

Nested object
   If you supply::

        <name> = <package_or_module>:<object>.<attr>.<nested_attr>

   this will be roughly interpreted as:

   .. code-block:: python

       from <package_or_module> import <object>
       parsed_value = <object>.<attr>.<nested_attr>

In the case of console/GUI scripts, this syntax can be used to specify a function, while
in the general case of entry points as used for plugins, it can be used to specify a function,
class or module.

----

.. [#use_for_scripts]
   Reference: https://packaging.python.org/en/latest/specifications/entry-points/#use-for-scripts

.. [#package_metadata]
   Reference: https://packaging.python.org/en/latest/guides/creating-and-discovering-plugins/#using-package-metadata
PK�![��pU�3�39doc/alt-python311-setuptools/docs/userguide/extension.rstnu�[���.. _Creating ``distutils`` Extensions:

Extending or Customizing Setuptools
===================================

Setuptools design is based on the distutils_ package originally distributed
as part of Python's standard library, effectively serving as its successor
(as established in :pep:`632`).

This means that ``setuptools`` strives to honor the extension mechanisms
provided by ``distutils``, and allows developers to create third party packages
that modify or augment the build process behavior.

A simple way of doing that is to hook in new or existing
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` for some more background on entry points).

The following sections describe the most common procedures for extending
the ``distutils`` functionality used by ``setuptools``.

.. important::
   Any entry-point defined in your ``setup.cfg``, ``setup.py`` or
   ``pyproject.toml`` files are not immediately available for use.  Your
   package needs to be installed first, then ``setuptools`` will be able to
   access these entry points.  For example consider a ``Project-A`` that
   defines entry points. When building ``Project-A``, these will not be
   available.  If ``Project-B`` declares a :doc:`build system requirement
   </userguide/dependency_management>` on ``Project-A``, then ``setuptools``
   will be able to use ``Project-A``' customizations.

Customizing Commands
--------------------

Both ``setuptools`` and ``distutils`` are structured around the *command design
pattern*. This means that each main action executed when building a
distribution package (such as creating a :term:`sdist <Source Distribution (or "sdist")>`
or :term:`wheel`) correspond to the implementation of a Python class.

Originally in ``distutils``, these commands would correspond to actual CLI
arguments that could be passed to the ``setup.py`` script to trigger a
different aspect of the build. In ``setuptools``, however, these command
objects are just a design abstraction that encapsulate logic and help to
organise the code.

You can overwrite exiting commands (or add new ones) 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 project:

.. code-block:: ini

    # setup.cfg
    ...
    [options.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 (documented below).

Once a project containing such entry points has been activated on ``sys.path``,
(e.g. by running ``pip install``) the command(s) will be available to any
``setuptools``-based project. In fact, this is
how setuptools' own commands are installed: the setuptools project's setup
script defines entry points for them!

The commands ``sdist``, ``build_py`` and ``build_ext`` are especially useful
to customize ``setuptools`` builds. Note however that when overwriting existing
commands, you should be very careful to maintain API compatibility.
Custom commands should try to replicate the same overall behavior as the
original classes, and when possible, even inherit from them.

You should also consider handling exceptions such as ``CompileError``,
``LinkError``, ``LibError``, among others. These exceptions are available in
the ``setuptools.errors`` module.

.. autoclass:: setuptools.Command
   :members:


Supporting sdists and editable installs in ``build`` sub-commands
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

``build`` sub-commands (like ``build_py`` and ``build_ext``)
are encouraged to implement the following protocol:

.. autoclass:: setuptools.command.build.SubCommand
   :members:


Adding 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
extension project:

.. code-block:: ini

    # setup.cfg
    ...
    [options.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 SetupError(
                "%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
``SetupError`` (from the ``setuptools.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
extensions to define a common argument, as long as they agree on
what values of that argument are valid.


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.


Defining Additional Metadata
----------------------------

Some extensible applications and frameworks may need to define their own kinds
of metadata, which they can then access using the :mod:`importlib.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 an 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 for more
details.


.. _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 an 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 an
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:

.. code-block:: ini

    # setup.cfg
    ...
    [options.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 ``logging`` 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: :pypi:`setuptools_scm`
- SVN: :pypi:`setuptools_svn`

If you would like to create a plugin for ``setuptools`` to find files tracked
by another revision control system, you can do so by adding an entry point to
the ``setuptools.file_finders`` group.  The entry point should be a function
accepting a single directory name, and should yield all the filenames within
that directory (and any subdirectories thereof) that are under revision
control.

For example, if you were going to create a plugin for a revision control system
called "foobar", you would write a function something like this:

.. code-block:: python

    def find_files_for_foobar(dirname):
        ...  # loop to yield paths that start with `dirname`

And you would register it in a setup script using something like this:

.. code-block:: ini

    # setup.cfg
    ...

    [options.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 ``logging.warning()`` to
  inform the user of the missing program(s).


.. _distutils: https://docs.python.org/3.9/library/distutils.html


Final Remarks
-------------

* To use a ``setuptools`` plugin, your users will need to add your package as a
  build requirement to their build-system configuration. Please check out our
  guides on :doc:`/userguide/dependency_management` for more information.

* Directly calling ``python setup.py ...`` is considered a **deprecated** practice.
  You should not add new commands to ``setuptools`` expecting them to be run
  via this interface.
PK�![WR�gIgIAdoc/alt-python311-setuptools/docs/userguide/package_discovery.rstnu�[���.. _`package_discovery`:

========================================
Package Discovery and Namespace Packages
========================================

.. note::
    a full specification for the keywords supplied to ``setup.cfg`` or
    ``setup.py`` can be found at :doc:`keywords reference </references/keywords>`

.. important::
    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 is a good place to start.

``Setuptools`` provides powerful tools to handle package discovery, including
support for namespace packages.

Normally, you would specify the packages to be included manually in the following manner:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        #...
        packages =
            mypkg
            mypkg.subpkg1
            mypkg.subpkg2

.. tab:: setup.py

    .. code-block:: python

        setup(
            # ...
            packages=['mypkg', 'mypkg.subpkg1', 'mypkg.subpkg2']
        )

.. tab:: pyproject.toml (**BETA**) [#beta]_

    .. code-block:: toml

        # ...
        [tool.setuptools]
        packages = ["mypkg", "mypkg.subpkg1", "mypkg.subpkg2"]
        # ...


If your packages are not in the root of the repository or do not correspond
exactly to the directory structure, you also need to configure ``package_dir``:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        # ...
        package_dir =
            = src
            # directory containing all the packages (e.g.  src/mypkg, src/mypkg/subpkg1, ...)
        # OR
        package_dir =
            mypkg = lib
            # mypkg.module corresponds to lib/module.py
            mypkg.subpkg1 = lib1
            # mypkg.subpkg1.module1 corresponds to lib1/module1.py
            mypkg.subpkg2 = lib2
            # mypkg.subpkg2.module2 corresponds to lib2/module2.py
        # ...

.. tab:: setup.py

    .. code-block:: python

        setup(
            # ...
            package_dir = {"": "src"}
            # directory containing all the packages (e.g.  src/mypkg, src/mypkg/subpkg1, ...)
        )

        # OR

        setup(
            # ...
            package_dir = {
                "mypkg": "lib",  # mypkg.module corresponds to lib/mod.py
                "mypkg.subpkg1": "lib1",  # mypkg.subpkg1.module1 corresponds to lib1/module1.py
                "mypkg.subpkg2": "lib2"   # mypkg.subpkg2.module2 corresponds to lib2/module2.py
                # ...
        )

.. tab:: pyproject.toml (**BETA**) [#beta]_

    .. code-block:: toml

        [tool.setuptools]
        # ...
        package-dir = {"" = "src"}
            # directory containing all the packages (e.g.  src/mypkg1, src/mypkg2)

        # OR

        [tool.setuptools.package-dir]
        mypkg = "lib"
        # mypkg.module corresponds to lib/module.py
        "mypkg.subpkg1" = "lib1"
        # mypkg.subpkg1.module1 corresponds to lib1/module1.py
        "mypkg.subpkg2" = "lib2"
        # mypkg.subpkg2.module2 corresponds to lib2/module2.py
        # ...

This can get tiresome really quickly. To speed things up, you can rely on
setuptools automatic discovery, or use the provided tools, as explained in
the following sections.

.. important::
   Although ``setuptools`` allows developers to create a very complex mapping
   between directory names and package names, it is better to *keep it simple*
   and reflect the desired package hierarchy in the directory structure,
   preserving the same names.

.. _auto-discovery:

Automatic discovery
===================

.. warning:: Automatic discovery is a **beta** feature and might change in the future.
   See :ref:`custom-discovery` for other methods of discovery.

By default ``setuptools`` will consider 2 popular project layouts, each one with
its own set of advantages and disadvantages [#layout1]_ [#layout2]_ as
discussed in the following sections.

Setuptools will automatically scan your project directory looking for these
layouts and try to guess the correct values for the :ref:`packages <declarative
config>` and :doc:`py_modules </references/keywords>` configuration.

.. important::
   Automatic discovery will **only** be enabled if you **don't** provide any
   configuration for ``packages`` and ``py_modules``.
   If at least one of them is explicitly set, automatic discovery will not take place.

   **Note**: specifying ``ext_modules`` might also prevent auto-discover from
   taking place, unless your opt into :doc:`pyproject_config` (which will
   disable the backward compatible behaviour).

.. _src-layout:

src-layout
----------
The project should contain a ``src`` directory under the project root and
all modules and packages meant for distribution are placed inside this
directory::

    project_root_directory
    ├── pyproject.toml  # AND/OR setup.cfg, setup.py
    ├── ...
    └── src/
        └── mypkg/
            ├── __init__.py
            ├── ...
            ├── module.py
            ├── subpkg1/
            │   ├── __init__.py
            │   ├── ...
            │   └── module1.py
            └── subpkg2/
                ├── __init__.py
                ├── ...
                └── module2.py

This layout is very handy when you wish to use automatic discovery,
since you don't have to worry about other Python files or folders in your
project root being distributed by mistake. In some circumstances it can be
also less error-prone for testing or when using :pep:`420`-style packages.
On the other hand you cannot rely on the implicit ``PYTHONPATH=.`` to fire
up the Python REPL and play with your package (you will need an
`editable install`_ to be able to do that).

.. _flat-layout:

flat-layout
-----------
*(also known as "adhoc")*

The package folder(s) are placed directly under the project root::

    project_root_directory
    ├── pyproject.toml  # AND/OR setup.cfg, setup.py
    ├── ...
    └── mypkg/
        ├── __init__.py
        ├── ...
        ├── module.py
        ├── subpkg1/
        │   ├── __init__.py
        │   ├── ...
        │   └── module1.py
        └── subpkg2/
            ├── __init__.py
            ├── ...
            └── module2.py

This layout is very practical for using the REPL, but in some situations
it can be more error-prone (e.g. during tests or if you have a bunch
of folders or Python files hanging around your project root).

To avoid confusion, file and folder names that are used by popular tools (or
that correspond to well-known conventions, such as distributing documentation
alongside the project code) are automatically filtered out in the case of
*flat-layout*:

.. autoattribute:: setuptools.discovery.FlatLayoutPackageFinder.DEFAULT_EXCLUDE

.. autoattribute:: setuptools.discovery.FlatLayoutModuleFinder.DEFAULT_EXCLUDE

.. warning::
   If you are using auto-discovery with *flat-layout*, ``setuptools`` will
   refuse to create :term:`distribution archives <Distribution Package>` with
   multiple top-level packages or modules.

   This is done to prevent common errors such as accidentally publishing code
   not meant for distribution (e.g. maintenance-related scripts).

   Users that purposefully want to create multi-package distributions are
   advised to use :ref:`custom-discovery` or the ``src-layout``.

There is also a handy variation of the *flat-layout* for utilities/libraries
that can be implemented with a single Python file:

single-module distribution
^^^^^^^^^^^^^^^^^^^^^^^^^^

A standalone module is placed directly under the project root, instead of
inside a package folder::

    project_root_directory
    ├── pyproject.toml  # AND/OR setup.cfg, setup.py
    ├── ...
    └── single_file_lib.py


.. _custom-discovery:

Custom discovery
================

If the automatic discovery does not work for you
(e.g., you want to *include* in the distribution top-level packages with
reserved names such as ``tasks``, ``example`` or ``docs``, or you want to
*exclude* nested packages that would be otherwise included), you can use
the provided tools for package discovery:

.. 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

.. tab:: pyproject.toml (**BETA**) [#beta]_

    .. code-block:: toml

        # ...
        [tool.setuptools.packages]
        find = {}  # Scanning implicit namespaces is active by default
        # OR
        find = {namespaces = false}  # Disable implicit namespaces


Finding simple 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 returns a list of ``str`` representing the packages it could find. To use
it, consider the following directory::

    mypkg
    ├── pyproject.toml  # AND/OR setup.cfg, setup.py
    └── src
        ├── pkg1
        │   └── __init__.py
        ├── pkg2
        │   └── __init__.py
        ├── additional
        │   └── __init__.py
        └── pkg
            └── namespace
                └── __init__.py

To have setuptools to automatically include packages found
in ``src`` that start 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*
        # alternatively: `exclude = additional*`

    .. note::
        ``pkg`` does not contain an ``__init__.py`` file, therefore
        ``pkg.namespace`` is ignored by ``find:`` (see ``find_namespace:`` below).

.. tab:: setup.py

    .. code-block:: python

        setup(
            # ...
            packages=find_packages(
                where='src',
                include=['pkg*'],  # alternatively: `exclude=['additional*']`
            ),
            package_dir={"": "src"}
            # ...
        )


    .. note::
        ``pkg`` does not contain an ``__init__.py`` file, therefore
        ``pkg.namespace`` is ignored by ``find_packages()``
        (see ``find_namespace_packages()`` below).

.. tab:: pyproject.toml (**BETA**) [#beta]_

    .. code-block:: toml

        [tool.setuptools.packages.find]
        where = ["src"]
        include = ["pkg*"]  # alternatively: `exclude = ["additional*"]`
        namespaces = false

    .. note::
        When using ``tool.setuptools.packages.find`` in ``pyproject.toml``,
        setuptools will consider :pep:`implicit namespaces <420>` by default when
        scanning your project directory.
        To avoid ``pkg.namespace`` from being added to your package list
        you can set ``namespaces = false``. This will prevent any folder
        without an ``__init__.py`` file from being scanned.

.. important::
   ``include`` and ``exclude`` accept strings representing :mod:`glob` patterns.
   These patterns should match the **full** name of the Python module (as if it
   was written in an ``import`` statement).

   For example if you have ``util`` pattern, it will match
   ``util/__init__.py`` but not ``util/files/__init__.py``.

   The fact that the parent package is matched by the pattern will not dictate
   if the submodule will be included or excluded from the distribution.
   You will need to explicitly add a wildcard (e.g. ``util*``)
   if you want the pattern to also match submodules.

.. _Namespace Packages:

Finding namespace packages
--------------------------
``setuptools``  provides ``find_namespace:`` (``find_namespace_packages()``)
which behaves similarly to ``find:`` but works with namespace packages.

Before diving in, it is important to have a good understanding of what
:pep:`namespace packages <420>` are. Here is a quick recap.

When you have two packages organized 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.

Now, suppose you decide to package the ``foo`` part for distribution and start
by creating a project directory organized as follows::

   foo
   ├── pyproject.toml  # AND/OR setup.cfg, setup.py
   └── src
       └── timmins
           └── foo
               └── __init__.py

If you want the ``timmins.foo`` to be automatically included in the
distribution, then you will need to specify:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        package_dir =
            =src
        packages = find_namespace:

        [options.packages.find]
        where = src

    ``find:`` won't work because ``timmins`` doesn't contain ``__init__.py``
    directly, instead, you have to use ``find_namespace:``.

    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.

.. tab:: setup.py

    .. code-block:: python

        setup(
            # ...
            packages=find_namespace_packages(where='src'),
            package_dir={"": "src"}
            # ...
        )

    When you use ``find_packages()``, all directories without an
    ``__init__.py`` file will be disconsidered.
    On the other hand, ``find_namespace_packages()`` will scan all
    directories.

.. tab:: pyproject.toml (**BETA**) [#beta]_

    .. code-block:: toml

        [tool.setuptools.packages.find]
        where = ["src"]

    When using ``tool.setuptools.packages.find`` in ``pyproject.toml``,
    setuptools will consider :pep:`implicit namespaces <420>` by default when
    scanning your project directory.

After installing the package distribution, ``timmins.foo`` would become
available to your interpreter.

.. warning::
   Please have in mind that ``find_namespace:`` (setup.cfg),
   ``find_namespace_packages()`` (setup.py) and ``find`` (pyproject.toml) will
   scan **all** folders that you have in your project directory if you use a
   :ref:`flat-layout`.

   If used naïvely, this might result in unwanted files being added to your
   final wheel. For example, with a project directory organized as follows::

       foo
       ├── docs
       │   └── conf.py
       ├── timmins
       │   └── foo
       │       └── __init__.py
       └── tests
           └── tests_foo
               └── __init__.py

   final users will end up installing not only ``timmins.foo``, but also
   ``docs`` and ``tests.tests_foo``.

   A simple way to fix this is to adopt the aforementioned :ref:`src-layout`,
   or make sure to properly configure the ``include`` and/or ``exclude``
   accordingly.

.. tip::
   After :ref:`building your package <building>`, you can have a look if all
   the files are correct (nothing missing or extra), by running the following
   commands:

   .. code-block:: bash

      tar tf dist/*.tar.gz
      unzip -l dist/*.whl

   This requires the ``tar`` and ``unzip`` to be installed in your OS.
   On Windows you can also use a GUI program such as 7zip_.


Legacy Namespace Packages
=========================
The fact you can create namespace packages so effortlessly above is credited
to `PEP 420 <https://www.python.org/dev/peps/pep-0420/>`_. It used 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
   ├── pyproject.toml  # AND/OR setup.cfg, setup.py
   └── src
       └── timmins
           ├── __init__.py
           └── foo
               └── __init__.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 ``pyproject.toml/setup.cfg`` remains the same.


----


.. [#beta]
   Support for adding build configuration options via the ``[tool.setuptools]``
   table in the ``pyproject.toml`` file is still in **beta** stage.
   See :doc:`/userguide/pyproject_config`.
.. [#layout1] https://blog.ionelmc.ro/2014/05/25/python-packaging/#the-structure
.. [#layout2] https://blog.ionelmc.ro/2017/09/25/rehashing-the-src-layout/

.. _editable install: https://pip.pypa.io/en/stable/cli/pip_install/#editable-installs
.. _7zip: https://www.7-zip.org
PK�![{�)?)?:doc/alt-python311-setuptools/docs/userguide/quickstart.rstnu�[���==========
Quickstart
==========

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

You can install the latest version of ``setuptools`` using :pypi:`pip`::

    pip install --upgrade setuptools

Most of the times, however, you don't have to...

Instead, when creating new Python packages, it is recommended to use
a command line tool called :pypi:`build`. This tool will automatically download
``setuptools`` and any other build-time dependencies that your project might
have. You just need to specify them in a ``pyproject.toml`` file at the root of
your package, as indicated in the :ref:`following section <basic-use>`.

.. _install-build:

You can also :doc:`install build <build:installation>` using :pypi:`pip`::

    pip install --upgrade build

This will allow you to run the command: ``python -m build``.

.. important::
   Please note that some operating systems might be equipped with
   the ``python3`` and ``pip3`` commands instead of ``python`` and ``pip``
   (but they should be equivalent).
   If you don't have ``pip`` or ``pip3`` available in your system, please
   check out :doc:`pip installation docs <pip:installation>`.


Every 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 tool that provides a ``build sdist``-like
functionality.


.. _basic-use:

Basic Use
=========

When creating a Python package, you must provide a ``pyproject.toml`` file
containing a ``build-system`` section similar to the example below:

.. code-block:: toml

    [build-system]
    requires = ["setuptools"]
    build-backend = "setuptools.build_meta"

This section declares what are your build system dependencies, and which
library will be used to actually do the packaging.

In addition to specifying a build system, you also will need to add
some package information such as metadata, contents, dependencies, etc.
This can be done in the same ``pyproject.toml`` [#beta]_ file,
or in a separated one: ``setup.cfg`` or ``setup.py`` [#setup.py]_.

The following example demonstrates a minimum configuration
(which assumes the project depends on :pypi:`requests` and
:pypi:`importlib-metadata` to be able to run):

.. tab:: pyproject.toml

    .. code-block:: toml

       [project]
       name = "mypackage"
       version = "0.0.1"
       dependencies = [
           "requests",
           'importlib-metadata; python_version<"3.8"',
       ]

    See :doc:`/userguide/pyproject_config` for more information.

.. tab:: setup.cfg

    .. code-block:: ini

        [metadata]
        name = mypackage
        version = 0.0.1

        [options]
        install_requires =
            requests
            importlib-metadata; python_version < "3.8"

    See :doc:`/userguide/declarative_config` for more information.

.. tab:: setup.py [#setup.py]_

    .. code-block:: python

        from setuptools import setup

        setup(
            name='mypackage',
            version='0.0.1',
            install_requires=[
                'requests',
                'importlib-metadata; python_version == "3.8"',
            ],
        )

    See :doc:`/references/keywords` for more information.

Finally, you will need to organize your Python code to make it ready for
distributing into something that looks like the following
(optional files marked with ``#``)::

    mypackage
    ├── pyproject.toml  # and/or setup.cfg/setup.py (depending on the configuration method)
    |   # README.rst or README.md (a nice description of your package)
    |   # LICENCE (properly chosen license information, e.g. MIT, BSD-3, GPL-3, MPL-2, etc...)
    └── mypackage
        ├── __init__.py
        └── ... (other Python files)

With :ref:`build installed in your system <install-build>`, you can then run::

    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 :doc:`upload <twine:index>` to PyPI_!

Of course, before you release your project to PyPI_, you'll want to add a bit
more information 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 the additional but essential information you need
to specify to properly package your project.


..
   TODO: A previous generation of this document included a section called
   "Python packaging at a glance". This is a nice title, but the content
   removed because it assumed the reader had familiarity with the history of
   setuptools and PEP 517. We should take advantage of this nice title and add
   this section back, but use it to explain important concepts of the
   ecosystem, such as "sdist", "wheel", "index". It would also be nice if we
   could have a diagram for that (explaining for example that "wheels" are
   built from "sdists" not the source tree).

.. _setuppy_discouraged:
.. admonition:: Info: Using ``setup.py``
  :class: seealso

  Setuptools offers first class support for ``setup.py`` files as a configuration
  mechanism.

  It is important to remember, however, that running this file as a
  script (e.g. ``python setup.py sdist``) is strongly **discouraged**, and
  that the majority of the command line interfaces are (or will be) **deprecated**
  (e.g. ``python setup.py install``, ``python setup.py bdist_wininst``, ...).

  We also recommend users to expose as much as possible configuration in a
  more *declarative* way via the :doc:`pyproject.toml <pyproject_config>` or
  :doc:`setup.cfg <declarative_config>`, and keep the ``setup.py`` minimal
  with only the dynamic parts (or even omit it completely if applicable).

  See `Why you shouldn't invoke setup.py directly`_ for more background.

.. _Why you shouldn't invoke setup.py directly: https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html


Overview
========

Package discovery
-----------------
For projects that follow a simple directory structure, ``setuptools`` should be
able to automatically detect all :term:`packages <package>` and
:term:`namespaces <namespace>`. However, complex projects might include
additional folders and supporting files that not necessarily should be
distributed (or that can confuse ``setuptools`` auto discovery algorithm).

Therefore, ``setuptools`` provides a convenient way to customize
which packages should be distributed and in which directory they should be
found, as shown in the example below:

.. tab:: pyproject.toml (**BETA**) [#beta]_

    .. code-block:: toml

        # ...
        [tool.setuptools.packages]
        find = {}  # Scan the project directory with the default parameters

        # OR
        [tool.setuptools.packages.find]
        # All the following settings are optional:
        where = ["src"]  # ["."] by default
        include = ["mypackage*"]  # ["*"] by default
        exclude = ["mypackage.tests*"]  # empty by default
        namespaces = false  # true by default

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        packages = find: # OR `find_namespace:` if you want to use namespaces

        [options.packages.find]  # (always `find` even if `find_namespace:` was used before)
        # This section is optional as well as each of the following options:
        where=src  # . by default
        include=mypackage*  # * by default
        exclude=mypackage.tests*  # empty by default

.. tab:: setup.py [#setup.py]_

    .. code-block:: python

        from setuptools import find_packages  # or find_namespace_packages

        setup(
            # ...
            packages=find_packages(
                # All keyword arguments below are optional:
                where='src',  # '.' by default
                include=['mypackage*'],  # ['*'] by default
                exclude=['mypackage.tests'],  # empty by default
            ),
            # ...
        )

When you pass the above information, alongside other necessary information,
``setuptools`` walks through the directory specified in ``where`` (defaults to ``.``) and filters the packages
it can find following the ``include`` patterns (defaults to ``*``), then it removes
those that match the ``exclude`` patterns (defaults to empty) and returns a list of Python packages.

For more details and advanced use, go to :ref:`package_discovery`.

.. tip::
   Starting with version 61.0.0, setuptools' automatic discovery capabilities
   have been improved to detect popular project layouts (such as the
   :ref:`flat-layout` and :ref:`src-layout`) without requiring any
   special configuration. Check out our :ref:`reference docs <package_discovery>`
   for more information, but please keep in mind that this functionality is
   still considered **beta** and might change in future releases.


Entry points and automatic script creation
-------------------------------------------
Setuptools supports automatic creation of scripts upon installation, that run
code within your package if you specify them as :doc:`entry points
<PyPUG:specifications/entry-points>`.
An example of how this feature can be used in ``pip``:
it allows you to run commands like ``pip install`` instead of having
to type ``python -m pip install``.

The following configuration examples show how to accomplish this:


.. tab:: pyproject.toml

    .. code-block:: toml

       [project.scripts]
       cli-name = "mypkg.mymodule:some_func"

.. tab:: setup.cfg

    .. code-block:: ini

        [options.entry_points]
        console_scripts =
            cli-name = mypkg.mymodule:some_func

.. tab:: setup.py [#setup.py]_

    .. code-block:: python

        setup(
            # ...
            entry_points={
                'console_scripts': [
                    'cli-name = mypkg.mymodule:some_func',
                ]
            }
        )

When this project is installed, a ``cli-name`` executable will be created.
``cli-name`` will invoke the function ``some_func`` in the
``mypkg/mymodule.py`` file when called by the user.
Note that you can also use the ``entry-points`` mechanism to advertise
components between installed packages and implement plugin systems.
For detailed usage, go to :doc:`entry_point`.


Dependency management
---------------------
Packages built with ``setuptools`` can specify dependencies to be automatically
installed when the package itself is installed.
The example below shows how to configure this kind of dependencies:

.. tab:: pyproject.toml

    .. code-block:: toml

        [project]
        # ...
        dependencies = [
            "docutils",
            "requests <= 0.4",
        ]
        # ...

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        install_requires =
            docutils
            requests <= 0.4

.. tab:: setup.py [#setup.py]_

    .. code-block:: python

        setup(
            # ...
            install_requires=["docutils", "requests <= 0.4"],
            # ...
        )

Each dependency is represented by a string that can optionally contain version requirements
(e.g. one of the operators <, >, <=, >=, == or !=, followed by a version identifier),
and/or conditional environment markers, e.g. ``sys_platform == "win32"``
(see :doc:`PyPUG:specifications/version-specifiers` for more information).

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 scenario. You can also specify groups of
extra dependencies that are not strictly required by your package to work, but
that will provide additional functionalities.
For more advanced use, see :doc:`dependency_management`.


.. _Including Data Files:

Including Data Files
--------------------
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:

.. tab:: pyproject.toml (**BETA**) [#beta]_

    .. code-block:: toml

        [tool.setuptools]
        include-package-data = true
        # This is already the default behaviour if your are using
        # pyproject.toml to configure your build.
        # You can deactivate that with `include-package-data = false`

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        include_package_data = True

.. tab:: setup.py [#setup.py]_

    .. code-block:: python

        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 |MANIFEST.in|_ file
or automatically added by a :ref:`Revision Control System plugin
<Adding Support for Revision Control Systems>`.
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.
Here's how to do it::

    pip install --editable .

See :doc:`development_mode` for more information.

.. tip::

    Prior to :ref:`pip v21.1 <pip:v21-1>`, a ``setup.py`` script was
    required to be compatible with development mode. With late
    versions of pip, projects without ``setup.py`` may be installed in this mode.

    If you have a version of ``pip`` older than v21.1 or is using a different
    packaging-related tool that does not support :pep:`660`, you might need to keep a
    ``setup.py`` file in file in your repository if you want to use editable
    installs.

    A simple script will suffice, for example:

    .. code-block:: python

        from setuptools import setup

        setup()

    You can still keep all the configuration in
    :doc:`pyproject.toml </userguide/pyproject_config>` and/or
    :doc:`setup.cfg </userguide/declarative_config>`


Uploading your package to PyPI
------------------------------
After generating the distribution files, the next step would be to upload your
distribution so others can use it. This functionality is provided by
:pypi:`twine` and is documented in the :doc:`Python packaging tutorial
<PyPUG:tutorials/packaging-projects>`.


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. :doc:`Here </userguide/declarative_config>` we provide a quick guide to
understanding how ``setup.cfg`` is parsed by ``setuptools`` to ease the pain of
transition.

.. _packaging-resources:

Resources on Python packaging
=============================
Packaging in Python can be hard and is constantly evolving.
`Python Packaging User Guide <https://packaging.python.org>`_ has tutorials and
up-to-date references that can help you when it is time to distribute your work.


.. |MANIFEST.in| replace:: ``MANIFEST.in``
.. _MANIFEST.in: https://packaging.python.org/en/latest/guides/using-manifest-in/


----

.. rubric:: Notes

.. [#setup.py]
   New projects are advised to avoid ``setup.py`` configurations (beyond the minimal stub)
   when custom scripting during the build is not necessary.
   Examples are kept in this document to help people interested in maintaining or
   contributing to existing packages that use ``setup.py``.
   Note that you can still keep most of configuration declarative in
   :doc:`setup.cfg <declarative_config>` or :doc:`pyproject.toml
   <pyproject_config>` and use ``setup.py`` only for the parts not
   supported in those files (e.g. C extensions).
   See :ref:`note <setuppy_discouraged>`.

.. [#beta]
   Support for adding build configuration options via the ``[tool.setuptools]``
   table in the ``pyproject.toml`` file is still in **beta** stage.
   See :doc:`/userguide/pyproject_config`.

.. _PyPI: https://pypi.org
PK�![0v&3K(K(<doc/alt-python311-setuptools/docs/userguide/distribution.rstnu�[���.. _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` 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 <https://peps.python.org/pep-0440/#pre-releases>`_
or `post-release <https://peps.python.org/pep-0440/#post-releases>`_ 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 release candidate
``2.4rc1``, which in turn is newer than beta release ``2.4b1`` or
alpha release ``2.4a1``.  Postrelease tags make
a version be considered *newer* than the version they are appended to.  So,
revisions like ``2.4.post1`` 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``. Note that ``2.4pl1`` is not :pep:`440`-compliant.

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. Note that only ``a``, ``b``, and ``rc`` are :pep:`440`-compliant
pre-release tags.

In addition, there are three special prerelease tags that are treated as if
they were ``rc``: ``c``, ``pre``, and ``preview``.  So, version
``2.4c1``, ``2.4pre1`` and ``2.4preview1`` are all the exact same version as
``2.4rc1``, and are treated as identical by setuptools.

A post-release tag is the string ``.post``, followed by a non-negative integer
value. 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.post1263`` might denote Subversion
revision 1263 of a post-release patch of version ``2.4``. Or you might use
``2.4.post20051127`` to denote a date-stamped post-release. Legacy post-release
tags could be either a series of letters that are alphabetically greater than or
equal to "final", or a dash (``-``) - for example ``2.4-r1263`` or
``2.4-20051127``.

Notice that after each legacy 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.dev41475`` 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 ``41475`` 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.9a0.dev0`` are
  identical versions from setuptools' point of view, so you can use whatever
  scheme you prefer. Of these examples, only ``1.9a0.dev0`` is
  :pep:`440`-compliant.

* 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 section for more details.


Tagging and "Daily Build" or "Snapshot" Releases
------------------------------------------------

.. warning::
   Please note that running ``python setup.py ...`` directly is no longer
   considered a good practice and that in the future the commands ``egg_info``
   and ``rotate`` will be deprecated.

   As a result, the instructions and information presented in this section
   should be considered **transitional** while setuptools don't provide a
   mechanism for tagging releases.

   Meanwhile, if you can also consider using :pypi:`setuptools-scm` to achieve
   similar objectives.


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.)

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.
PK�![�'�G�G9doc/alt-python311-setuptools/docs/userguide/datafiles.rstnu�[���====================
Data Files Support
====================

Old packaging installation methods in the Python ecosystem
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 **inside the package directory**.

Setuptools focuses on this most common type of data files and offers three ways
of specifying which files should be included in your packages, as described in
the following sections.

include_package_data
====================

First, you can simply use the ``include_package_data`` keyword.
For example, if the package tree looks like this::

    project_root_directory
    ├── setup.py        # and/or setup.cfg, pyproject.toml
    └── src
        └── mypkg
            ├── __init__.py
            ├── data1.rst
            ├── data2.rst
            ├── data1.txt
            └── data2.txt

and you supply this configuration:

.. tab:: setup.cfg

   .. code-block:: ini

        [options]
        # ...
        packages = find:
        package_dir =
            = src
        include_package_data = True

        [options.packages.find]
        where = src

.. tab:: setup.py

   .. code-block:: python

    from setuptools import setup, find_packages
    setup(
        # ...,
        packages=find_packages(where="src"),
        package_dir={"": "src"},
        include_package_data=True
    )

.. tab:: pyproject.toml (**BETA**) [#beta]_

   .. code-block:: toml

        [tool.setuptools]
        # ...
        # By default, include-package-data is true in pyproject.toml, so you do
        # NOT have to specify this line.
        include-package-data = true

        [tool.setuptools.packages.find]
        where = ["src"]

then all the ``.txt`` and ``.rst`` files will be automatically installed with
your package, provided:

1. These files are included via the |MANIFEST.in|_ file, like so::

        include src/mypkg/*.txt
        include src/mypkg/*.rst

2. OR, they are being tracked by a revision control system such as Git, Mercurial
   or SVN, and you have configured an appropriate plugin such as
   :pypi:`setuptools-scm` or :pypi:`setuptools-svn`.
   (See the section below on :ref:`Adding Support for Revision
   Control Systems` for information on how to write such plugins.)

package_data
============

By default, ``include_package_data`` considers **all** non ``.py`` files found inside
the package directory (``src/mypkg`` in this case) as data files, and includes those that
satisfy (at least) one of the above two conditions into the source distribution, and
consequently in the installation of your package.
If you want finer-grained control over what files are included, then you can also use
the ``package_data`` keyword.
For example, if the package tree looks like this::

    project_root_directory
    ├── setup.py        # and/or setup.cfg, pyproject.toml
    └── src
        └── mypkg
            ├── __init__.py
            ├── data1.rst
            ├── data2.rst
            ├── data1.txt
            └── data2.txt

then you can use the following configuration to capture the ``.txt`` and ``.rst`` files as
data files:

.. tab:: setup.cfg

   .. code-block:: ini

        [options]
        # ...
        packages = find:
        package_dir =
            = src

        [options.packages.find]
        where = src

        [options.package_data]
        mypkg =
            *.txt
            *.rst

.. tab:: setup.py

    .. code-block:: python

        from setuptools import setup, find_packages
        setup(
            # ...,
            packages=find_packages(where="src"),
            package_dir={"": "src"},
            package_data={"mypkg": ["*.txt", "*.rst"]}
        )

.. tab:: pyproject.toml (**BETA**) [#beta]_

   .. code-block:: toml

        [tool.setuptools.packages.find]
        where = ["src"]

        [tool.setuptools.package-data]
        mypkg = ["*.txt", "*.rst"]

The ``package_data`` argument is a dictionary that maps from package names to
lists of glob patterns. Note that the data files specified using the ``package_data``
option neither require to be included within a |MANIFEST.in|_ file, nor
require to be added by a revision control system plugin.

.. note::
        If your glob patterns use paths, you *must* use a forward slash (``/``) as
        the path separator, even if you are on Windows.  Setuptools automatically
        converts slashes to appropriate platform-specific separators at build time.

.. note::
        Glob patterns do not automatically match dotfiles (directory or file names
        starting with a dot (``.``)). To include such files, you must explicitly start
        the pattern with a dot, e.g. ``.*`` to match ``.gitignore``.

If you have multiple top-level packages and a common pattern of data files for all these
packages, for example::

    project_root_directory
    ├── setup.py        # and/or setup.cfg, pyproject.toml
    └── src
        ├── mypkg1
        │   ├── data1.rst
        │   ├── data1.txt
        │   └── __init__.py
        └── mypkg2
            ├── data2.txt
            └── __init__.py

Here, both packages ``mypkg1`` and ``mypkg2`` share a common pattern of having ``.txt``
data files. However, only ``mypkg1`` has ``.rst`` data files. In such a case, if you want to
use the ``package_data`` option, the following configuration will work:

.. tab:: setup.cfg

   .. code-block:: ini

        [options]
        packages = find:
        package_dir =
            = src

        [options.packages.find]
        where = src

        [options.package_data]
        * =
          *.txt
        mypkg1 =
          data1.rst

.. tab:: setup.py

   .. code-block:: python

        from setuptools import setup, find_packages
        setup(
            # ...,
            packages=find_packages(where="src"),
            package_dir={"": "src"},
            package_data={"": ["*.txt"], "mypkg1": ["data1.rst"]},
        )

.. tab:: pyproject.toml (**BETA**) [#beta]_

   .. code-block:: toml

        [tool.setuptools.packages.find]
        where = ["src"]

        [tool.setuptools.package-data]
        "*" = ["*.txt"]
        mypkg1 = ["data1.rst"]

Notice that if you list patterns in ``package_data`` under the empty string ``""`` in
``setup.py``, and the asterisk ``*`` in ``setup.cfg`` and ``pyproject.toml``, these
patterns are used to find files in every package. For example, we use ``""`` or ``*``
to indicate that the ``.txt`` files from all packages should be captured as data files.
Also note how we can continue to specify patterns for individual packages, i.e.
we specify that ``data1.rst`` from ``mypkg1`` alone should be captured as well.

.. note::
    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::
   If using the ``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 or by a plugin like
   :pypi:`setuptools-scm` or :pypi:`setuptools-svn`.

.. https://docs.python.org/3/distutils/setupscript.html#installing-package-data

exclude_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,
consider a scenario where you have ``include_package_data=True``, and you are using
a revision control system with an appropriate plugin.
Sometimes developers add directory-specific marker files (such as ``.gitignore``,
``.gitkeep``, ``.gitattributes``, or ``.hgignore``), these files are probably being
tracked by the revision control system, and therefore by default they will be
included when the package is installed.

Supposing you want to prevent these files from being included in the
installation (they are not relevant to Python or the package), then you could
use the ``exclude_package_data`` option:

.. tab:: setup.cfg

   .. code-block:: ini

        [options]
        # ...
        packages = find:
        package_dir =
            = src
        include_package_data = True

        [options.packages.find]
        where = src

        [options.exclude_package_data]
        mypkg =
            .gitattributes

.. tab:: setup.py

    .. code-block:: python

        from setuptools import setup, find_packages
        setup(
            # ...,
            packages=find_packages(where="src"),
            package_dir={"": "src"},
            include_package_data=True,
            exclude_package_data={"mypkg": [".gitattributes"]},
        )

.. tab:: pyproject.toml (**BETA**) [#beta]_

   .. code-block:: toml

        [tool.setuptools.packages.find]
        where = ["src"]

        [tool.setuptools.exclude-package-data]
        mypkg = [".gitattributes"]

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, you can use the empty string key ``""`` in ``setup.py`` and the
asterisk ``*`` in ``setup.cfg`` and ``pyproject.toml`` to match all top-level packages.

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``.

Subdirectory for Data Files
===========================

A common pattern is where some (or all) of the data files are placed under
a separate subdirectory. For example::

    project_root_directory
    ├── setup.py        # and/or setup.cfg, pyproject.toml
    └── src
        └── mypkg
            ├── data
            │   ├── data1.rst
            │   └── data2.rst
            ├── __init__.py
            ├── data1.txt
            └── data2.txt

Here, the ``.rst`` files are placed under a ``data`` subdirectory inside ``mypkg``,
while the ``.txt`` files are directly under ``mypkg``.

In this case, the recommended approach is to treat ``data`` as a namespace package
(refer :pep:`420`). With ``package_data``,
the configuration might look like this:

.. tab:: setup.cfg

   .. code-block:: ini

        [options]
        # ...
        packages = find_namespace:
        package_dir =
            = src

        [options.packages.find]
        where = src

        [options.package_data]
        mypkg =
            *.txt
        mypkg.data =
            *.rst

.. tab:: setup.py

   .. code-block:: python

        from setuptools import setup, find_namespace_packages
        setup(
            # ...,
            packages=find_namespace_packages(where="src"),
            package_dir={"": "src"},
            package_data={
                "mypkg": ["*.txt"],
                "mypkg.data": ["*.rst"],
            }
        )

.. tab:: pyproject.toml (**BETA**) [#beta]_

   .. code-block:: toml

        [tool.setuptools.packages.find]
        # scanning for namespace packages is true by default in pyproject.toml, so
        # you do NOT need to include the following line.
        namespaces = true
        where = ["src"]

        [tool.setuptools.package-data]
        mypkg = ["*.txt"]
        "mypkg.data" = ["*.rst"]

In other words, we allow Setuptools to scan for namespace packages in the ``src`` directory,
which enables the ``data`` directory to be identified, and then, we separately specify data
files for the root package ``mypkg``, and the namespace package ``data`` under the package
``mypkg``.

With ``include_package_data`` the configuration is simpler: you simply need to enable
scanning of namespace packages in the ``src`` directory and the rest is handled by Setuptools.

.. tab:: setup.cfg

   .. code-block:: ini

        [options]
        packages = find_namespace:
        package_dir =
            = src
        include_package_data = True

        [options.packages.find]
        where = src

.. tab:: setup.py

   .. code-block:: python

        from setuptools import setup, find_namespace_packages
        setup(
            # ... ,
            packages=find_namespace_packages(where="src"),
            package_dir={"": "src"},
            include_package_data=True,
        )

.. tab:: pyproject.toml (**BETA**) [#beta]_

   .. code-block:: toml

        [tool.setuptools]
        # ...
        # By default, include-package-data is true in pyproject.toml, so you do
        # NOT have to specify this line.
        include-package-data = true

        [tool.setuptools.packages.find]
        # scanning for namespace packages is true by default in pyproject.toml, so
        # you need NOT include the following line.
        namespaces = true
        where = ["src"]

Summary
=======

In summary, the three options allow you to:

``include_package_data``
    Accept all data files and directories matched by |MANIFEST.in|_ or added by
    a :ref:`plugin <Adding Support for Revision Control Systems>`.

``package_data``
    Specify additional patterns to match files that may or may
    not be matched by |MANIFEST.in|_ or added by
    a :ref:`plugin <Adding Support for Revision Control Systems>`.

``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 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. For example, if you have a structure
like this::

    project_root_directory
    ├── setup.py        # and/or setup.cfg, pyproject.toml
    └── src
        └── mypkg
            ├── data
            │   └── data1.txt
            ├── __init__.py
            └── foo.py

Then, in ``mypkg/foo.py``, you may try something like this in order to access
``mypkg/data/data1.txt``:

.. code-block:: python

   import os
   data_path = os.path.join(os.path.dirname(__file__), 'data', 'data1.txt')
   with open(data_path, 'r') as data_file:
        ...

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 :mod:`importlib.resources` to access them.
In this case, you would do something like this:

.. code-block:: python

   from importlib.resources import files
   data_text = files('mypkg.data').joinpath('data1.txt').read_text()

:mod:`importlib.resources` was added to Python 3.7. However, the API illustrated in
this code (using ``files()``) was added only in Python 3.9, [#files_api]_ and support
for accessing data files via namespace packages was added only in Python 3.10 [#namespace_support]_
(the ``data`` subdirectory is a namespace package under the root package ``mypkg``).
Therefore, you may find this code to work only in Python 3.10 (and above). For other
versions of Python, you are recommended to use the :pypi:`importlib-resources` backport
which provides the latest version of this library. In this case, the only change that
has to be made to the above code is to replace ``importlib.resources`` with ``importlib_resources``, i.e.

.. code-block:: python

   from importlib_resources import files
   ...

See :doc:`importlib-resources:using` for detailed instructions.

.. tip:: Files inside the package directory should be *read-only* to avoid a
   series of common problems (e.g. when multiple users share a common Python
   installation, when the package is loaded from a zip file, or when multiple
   instances of a Python application run in parallel).

   If your Python package needs to write to a file for shared data or configuration,
   you can use standard platform/OS-specific system directories, such as
   ``~/.local/config/$appname`` or ``/usr/share/$appname/$version`` (Linux specific) [#system-dirs]_.
   A common approach is to add a read-only template file to the package
   directory that is then copied to the correct system directory if no
   pre-existing file is found.


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 **inside the package**.


----

.. [#beta]
   Support for adding build configuration options via the ``[tool.setuptools]``
   table in the ``pyproject.toml`` file. See :doc:`/userguide/pyproject_config`.

.. [#system-dirs] These locations can be discovered with the help of
   third-party libraries such as :pypi:`platformdirs`.

.. [#files_api] Reference: https://importlib-resources.readthedocs.io/en/latest/using.html#migrating-from-legacy

.. [#namespace_support] Reference: https://github.com/python/importlib_resources/pull/196#issuecomment-734520374


.. |MANIFEST.in| replace:: ``MANIFEST.in``
.. _MANIFEST.in: https://packaging.python.org/en/latest/guides/using-manifest-in/
PK�![Z���77;doc/alt-python311-setuptools/docs/userguide/ext_modules.rstnu�[���==========================
Building Extension Modules
==========================

Setuptools can build C/C++ extension modules.  The keyword argument
``ext_modules`` of ``setup()`` should be a list of instances of the
:class:`setuptools.Extension` class.


For example, let's consider a simple project with only one extension module::

    <project_folder>
    ├── pyproject.toml
    └── foo.c

and all project metadata configuration in the ``pyproject.toml`` file:

.. code-block:: toml

   # pyproject.toml
   [build-system]
   requires = ["setuptools"]
   build-backend = "setuptools.build_meta"

   [project]
   name = "mylib-foo"  # as it would appear on PyPI
   version = "0.42"

To instruct setuptools to compile the ``foo.c`` file into the extension module
``mylib.foo``, we need to add a ``setup.py`` file similar to the following:

.. code-block:: python

   from setuptools import Extension, setup

   setup(
       ext_modules=[
           Extension(
               name="mylib.foo",  # as it would be imported
                                  # may include packages/namespaces separated by `.`

               sources=["foo.c"], # all sources are compiled into a single binary file
           ),
       ]
   )

.. seealso::
   You can find more information on the `Python docs about C/C++ extensions`_.
   Alternatively, you might also be interested in learn about `Cython`_.

   If you plan to distribute a package that uses extensions across multiple
   platforms, :pypi:`cibuildwheel` can also be helpful.

.. important::
   All files used to compile your extension need to be available on the system
   when building the package, so please make sure to include some documentation
   on how developers interested in building your package from source
   can obtain operating system level dependencies
   (e.g. compilers and external binary libraries/artifacts).

   You will also need to make sure that all auxiliary files that are contained
   inside your :term:`project` (e.g. C headers authored by you or your team)
   are configured to be included in your :term:`sdist <Source Distribution (or "sdist")>`.
   Please have a look on our section on :ref:`Controlling files in the distribution`.


Compiler and linker options
===========================

The command ``build_ext`` builds C/C++ extension modules.  It creates
a command line for running the compiler and linker by combining
compiler and linker options from various sources:

.. Reference: `test_customize_compiler` in distutils/tests/test_sysconfig.py

* the ``sysconfig`` variables ``CC``, ``CXX``, ``CCSHARED``,
  ``LDSHARED``, and ``CFLAGS``,
* the environment variables ``CC``, ``CPP``,
  ``CXX``, ``LDSHARED`` and ``LDFLAGS``,
  ``CFLAGS``, ``CPPFLAGS``, ``LDFLAGS``,
* the ``Extension`` attributes ``include_dirs``,
  ``library_dirs``, ``extra_compile_args``, ``extra_link_args``,
  ``runtime_library_dirs``.

.. Ignoring AR, ARFLAGS, RANLIB here because they are used by the (obsolete?) build_clib, not build_ext.

Specifically, if the environment variables ``CC``, ``CPP``, ``CXX``, and ``LDSHARED``
are set, they will be used instead of the ``sysconfig`` variables of the same names.

The compiler options appear in the command line in the following order:

.. Reference: "compiler_so" and distutils.ccompiler.gen_preprocess_options, CCompiler.compile, UnixCCompiler._compile

* first, the options provided by the ``sysconfig`` variable ``CFLAGS``,
* then, the options provided by the environment variables ``CFLAGS`` and ``CPPFLAGS``,
* then, the options provided by the ``sysconfig`` variable ``CCSHARED``,
* then, a ``-I`` option for each element of ``Extension.include_dirs``,
* finally, the options provided by ``Extension.extra_compile_args``.

The linker options appear in the command line in the following order:

.. Reference: "linker_so" and CCompiler.link

* first, the options provided by environment variables and ``sysconfig`` variables,
* then, a ``-L`` option for each element of ``Extension.library_dirs``,
* then, a linker-specific option like ``-Wl,-rpath`` for each element of ``Extension.runtime_library_dirs``,
* finally, the options provided by ``Extension.extra_link_args``.

The resulting command line is then processed by the compiler and linker.
According to the GCC manual sections on `directory options`_ and
`environment variables`_, the C/C++ compiler searches for files named in
``#include <file>`` directives in the following order:

* first, in directories given by ``-I`` options (in left-to-right order),
* then, in directories given by the environment variable ``CPATH`` (in left-to-right order),
* then, in directories given by ``-isystem`` options (in left-to-right order),
* then, in directories given by the environment variable ``C_INCLUDE_PATH`` (for C) and ``CPLUS_INCLUDE_PATH`` (for C++),
* then, in standard system directories,
* finally, in directories given by ``-idirafter`` options (in left-to-right order).

The linker searches for libraries in the following order:

* first, in directories given by ``-L`` options (in left-to-right order),
* then, in directories given by the environment variable ``LIBRARY_PATH`` (in left-to-right order).


Distributing Extensions compiled with Cython
============================================

When your :pypi:`Cython` extension modules *are declared using the*
:class:`setuptools.Extension` *class*, ``setuptools`` will detect at build time
whether Cython is installed or not.

If Cython is present, then ``setuptools`` will use it to build the ``.pyx`` files.
Otherwise, ``setuptools`` will try to find and compile the equivalent ``.c`` files
(instead of ``.pyx``). These files can be generated using the
`cython command line tool`_.

You can ensure that Cython is always automatically installed into the build
environment by including it as a :ref:`build dependency <build-requires>` in
your ``pyproject.toml``:

.. code-block:: toml

    [build-system]
    requires = [..., "cython"]

Alternatively, you can include the ``.c`` code that is pre-compiled by Cython
into your source distribution, alongside the original ``.pyx`` files (this
might save a few seconds when building from an ``sdist``).
To improve version compatibility, you probably also want to include current
``.c`` files in your :wiki:`revision control system`, and rebuild them whenever
you check changes in for the ``.pyx`` source files.
This will ensure that people tracking your project will be able to build it
without installing Cython, and that there will be no variation due to small
differences in the generate C files.
Please checkout our docs on :ref:`controlling files in the distribution` for
more information.

----

Extension API Reference
=======================

.. autoclass:: setuptools.Extension


.. _Python docs about C/C++ extensions: https://docs.python.org/3/extending/extending.html
.. _Cython: https://cython.readthedocs.io/en/stable/index.html
.. _directory options: https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html
.. _environment variables: https://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html
.. _cython command line tool: https://cython.readthedocs.io/en/stable/src/userguide/source_files_and_compilation.html
PK�![���ee5doc/alt-python311-setuptools/docs/userguide/index.rstnu�[���==================================================
Building and Distributing Packages with Setuptools
==================================================

The first step towards sharing a Python library or program is to build a
distribution package [#package-overload]_. This includes adding a set of
additional files containing metadata and configuration to not only instruct
``setuptools`` on how the distribution should be built but also
to help installer (such as :pypi:`pip`) during the installation process.

This document contains information to help Python developers through this
process. Please check the :doc:`/userguide/quickstart` for an overview of
the workflow.

Also note that ``setuptools`` is what is known in the community as :pep:`build
backend <517#terminology-and-goals>`, user facing interfaces are provided by tools
such as :pypi:`pip` and :pypi:`build`. To use ``setuptools``, one must
explicitly create a ``pyproject.toml`` file as described :doc:`/build_meta`.


Contents
========

.. toctree::
    :maxdepth: 1

    quickstart
    package_discovery
    dependency_management
    development_mode
    entry_point
    datafiles
    ext_modules
    distribution
    miscellaneous
    extension
    declarative_config
    pyproject_config

---

.. rubric:: Notes

.. [#package-overload]
   A :term:`Distribution Package` is also referred in the Python community simply as "package"
   Unfortunately, this jargon might be a bit confusing for new users because the term package
   can also to refer any :term:`directory <package>` (or sub directory) used to organize
   :term:`modules <module>` and auxiliary files.
PK�![~q�4��=doc/alt-python311-setuptools/docs/userguide/miscellaneous.rstnu�[���.. _Controlling files in the distribution:

Controlling files in the distribution
=====================================

For the most common use cases, ``setuptools`` will automatically find out which
files are necessary for distributing the package.
These include all :term:`pure Python modules <Pure Module>` in the
``py_modules`` or ``packages`` configuration, and the C sources (but not C
headers) listed as part of extensions when creating a :term:`source
distribution (or "sdist")`.

However, when building more complex packages (e.g. packages that include
non-Python files, or that need to use custom C headers), you might find that
not all files present in your project folder are included in package
:term:`distribution archive <Distribution Package>`.

If you are using a :wiki:`Revision Control System`, such as git_ or mercurial_,
and your source distributions only need to include files that you're
tracking in revision control, you can use a ``setuptools`` :ref:`plugin <Adding
Support for Revision Control Systems>`, such as :pypi:`setuptools-scm` or
:pypi:`setuptools-svn` to automatically include all tracked files into the ``sdist``.

.. _Using MANIFEST.in:

Alternatively, if you need finer control over the files (e.g. you don't want to
distribute :wiki:`CI/CD`-related files) or you need automatically generated files,
you can add a ``MANIFEST.in`` file at the root of your project,
to specify any files that the default file location algorithm doesn't catch.

This file contains instructions that tell ``setuptools`` which files exactly
should be part of the ``sdist`` (or not).
A comprehensive guide to ``MANIFEST.in`` syntax is available at the
:doc:`PyPA's Packaging User Guide <PyPUG:guides/using-manifest-in>`.

.. attention::
   Please note that ``setuptools`` supports the ``MANIFEST.in``,
   and not ``MANIFEST`` (no extension). Any documentation, tutorial or example
   that recommends using ``MANIFEST`` (no extension) is likely outdated.

.. tip::
   The ``MANIFEST.in`` file contains commands that allow you to discover and
   manipulate lists of files. There are many commands that can be used with
   different objectives, but you should try to not make your ``MANIFEST.in``
   file too fine grained.

   A good idea is to start with a ``graft`` command (to add all
   files inside a set of directories) and then fine tune the file selection
   by removing the excess or adding isolated files.

An example of ``MANIFEST.in`` for a simple project that organized according to a
:ref:`src-layout` is:

.. code-block:: bash

   # MANIFEST.in -- just for illustration
   graft src
   graft tests
   graft docs
   # `-> adds all files inside a directory

   include tox.ini
   # `-> matches file paths relative to the root of the project

   global-exclude *~ *.py[cod] *.so
   # `-> matches file names (regardless of directory)

Once the correct files are present in the ``sdist``, they can then be used by
binary extensions during the build process, or included in the final
:term:`wheel <Wheel>` [#build-process]_ if you configure ``setuptools`` with
``include_package_data=True``.

.. important::
   Please note that, when using ``include_package_data=True``, only files **inside
   the package directory** are included in the final ``wheel``, by default.

   So for example, if you create a :term:`Python project <Project>` that uses
   :pypi:`setuptools-scm` and have a ``tests`` directory outside of the package
   folder, the ``tests`` directory will be present in the ``sdist`` but not in the
   ``wheel`` [#wheel-vs-sdist]_.

   See :doc:`/userguide/datafiles` for more information.

----

.. [#build-process]
   You can think about the build process as two stages: first the ``sdist``
   will be created and then the ``wheel`` will be produced from that ``sdist``.

.. [#wheel-vs-sdist]
   This happens because the ``sdist`` can contain files that are useful during
   development or the build process itself, but not in runtime (e.g. tests,
   docs, examples, etc...).
   The ``wheel``, on the other hand, is a file format that has been optimized
   and is ready to be unpacked into a running installation of Python or
   :term:`Virtual Environment`.
   Therefore it only contains items that are required during runtime.

.. _git: https://git-scm.com
.. _mercurial: https://www.mercurial-scm.org
PK�![��Бn-n-Edoc/alt-python311-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.

Each dependency, regardless of type, needs to be specified according to :pep:`508`
and :pep:`440`.
This allows adding version :pep:`range restrictions <440#version-specifiers>`
and :ref:`environment markers <environment-markers>`.


.. _build-requires:

Build system requirement
========================

After organizing all the scripts and files and getting ready for packaging,
there needs to be a way to specify what programs and libraries are actually needed
do the packaging (in our case, ``setuptools`` of course).
This needs to be specified in your ``pyproject.toml`` file
(if you have forgot what this is, go to :doc:`/userguide/quickstart` or :doc:`/build_meta`):

.. code-block:: toml

    [build-system]
    requires = ["setuptools"]
    #...

Please note that you should also include here any other ``setuptools`` plugin
(e.g., :pypi:`setuptools-scm`, :pypi:`setuptools-golang`, :pypi:`setuptools-rust`)
or build-time dependency (e.g., :pypi:`Cython`, :pypi:`cppy`, :pypi:`pybind11`).

.. note::
    In previous versions of ``setuptools``,
    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`` supports automatically downloading and installing
these dependencies when the package is installed. Although there is more
finesse to it, let's start with a simple example.

.. tab:: pyproject.toml

    .. code-block:: toml

        [project]
        # ...
        dependencies = [
            "docutils",
            "BazSpam == 1.1",
        ]
        # ...

.. 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 :pypi:`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.


.. _environment-markers:

Platform specific dependencies
------------------------------
Setuptools offers 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:: pyproject.toml

    .. code-block:: toml

        [project]
        # ...
        dependencies = [
            "enum34; python_version<'3.4'",
        ]
        # ...

.. 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:: pyproject.toml

    .. code-block:: toml

        [project]
        # ...
        dependencies = [
            "enum34; python_version<'3.4'",
            "pywin32 >= 1.0; platform_system=='Windows'",
        ]
        # ...

.. 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`.

.. seealso::
   If  environment markers are not enough an specific use case,
   you can also consider creating a :ref:`backend wrapper <backend-wrapper>`
   to implement custom detection logic.


Direct URL dependencies
-----------------------

.. attention::
   `PyPI`_ and other standards-conformant package indices **do not** accept
   packages that declare dependencies using direct URLs. ``pip`` will accept them
   when installing packages from the local filesystem or from another URL,
   however.

Dependencies that are not available on a package index but can be downloaded
elsewhere in the form of a source repository or archive may be specified
using a variant of :pep:`PEP 440's direct references <440#direct-references>`:

.. tab:: pyproject.toml

    .. code-block:: toml

        [project]
        # ...
        dependencies = [
            "Package-A @ git+https://example.net/package-a.git@main",
            "Package-B @ https://example.net/archives/package-b.whl",
        ]

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        #...
        install_requires =
            Package-A @ git+https://example.net/package-a.git@main
            Package-B @ https://example.net/archives/package-b.whl

.. tab:: setup.py

    .. code-block:: python

        setup(
            install_requires=[
               "Package-A @ git+https://example.net/package-a.git@main",
               "Package-B @ https://example.net/archives/package-b.whl",
            ],
            ...,
        )

For source repository URLs, a list of supported protocols and VCS-specific
features such as selecting certain branches or tags can be found in pip's
documentation on `VCS support <https://pip.pypa.io/en/latest/topics/vcs-support/>`_.
Supported formats for archive URLs are sdists and wheels.


Optional dependencies
=====================
Setuptools allows you to declare dependencies that are not installed by default.
This effectively means that you can create a "variant" of your package with a
set of extra functionalities.

For example, let's consider a ``Package-A`` that offers
optional PDF support and requires two other dependencies for it to work:

.. tab:: pyproject.toml

    .. code-block:: toml

        [project]
        name = "Package-A"
        # ...
        [project.optional-dependencies]
        PDF = ["ReportLab>=1.2", "RXP"]

.. 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="Package-A",
            ...,
            extras_require={
                "PDF": ["ReportLab>=1.2", "RXP"],
            },
        )

.. sidebar::

   .. tip::
      It is also convenient to declare optional requirements for
      ancillary tasks such as running tests and or building docs.

The name ``PDF`` is an arbitrary :pep:`identifier <685>` of such a list of dependencies, to
which other components can refer and have them installed.

A use case for this approach is that other package can use this "extra" for their
own dependencies. For example, if ``Package-B`` needs ``Package-A`` with PDF support
installed, it might declare the dependency like this:

.. tab:: pyproject.toml

    .. code-block:: toml

        [project]
        name = "Package-B"
        # ...
        dependencies = [
            "Package-A[PDF]"
        ]

.. tab:: setup.cfg

    .. code-block:: ini

        [metadata]
        name = Package-B
        #...

        [options]
        #...
        install_requires =
            Package-A[PDF]

.. tab:: setup.py

    .. code-block:: python

        setup(
            name="Package-B",
            install_requires=["Package-A[PDF]"],
            ...,
        )

This will cause ``ReportLab`` to be installed along with ``Package-A``, if ``Package-B`` is
installed -- even if ``Package-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 ``Package-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, ``Package-B``'s setup information does
not need to change, but the right packages will still be installed if needed.

.. tip::
    Best practice: if a project ends up no longer 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).

.. warning::
    Historically ``setuptools`` also used to support extra dependencies in console
    scripts, for example:

    .. tab:: setup.cfg

        .. code-block:: ini

            [metadata]
            name = Package-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="Package-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).

    **However**, ``pip`` and other tools might not support this use case for extra
    dependencies, therefore this practice is considered **deprecated**.
    See :doc:`PyPUG:specifications/entry-points`.


Python requirement
==================
In some cases, you might need to specify the minimum required python version.
This can be configured as shown in the example below.

.. tab:: pyproject.toml

    .. code-block:: toml

        [project]
        name = "Package-B"
        requires-python = ">=3.6"
        # ...

.. tab:: setup.cfg

    .. code-block:: ini

        [metadata]
        name = Package-B
        #...

        [options]
        #...
        python_requires = >=3.6

.. tab:: setup.py

    .. code-block:: python

        setup(
            name="Package-B",
            python_requires=">=3.6",
            ...,
        )


.. _PyPI: https://pypi.org
PK�![c�g���-doc/alt-python311-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�![�
SpSp3doc/alt-python311-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.

.. attention::
   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 (:pypi:`importlib_resources`,
   :pypi:`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 ``bytes``.  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�![U�'�L"L")doc/alt-python311-setuptools/docs/conf.pynu�[���#!/usr/bin/env python3

extensions = [
    'sphinx.ext.autodoc',
    'jaraco.packaging.sphinx',
]

master_doc = "index"
html_theme = "furo"

# Link dates and other references in the changelog
extensions += ['rst.linker']
link_files = {
    '../CHANGES.rst': dict(
        using=dict(
            BB='https://bitbucket.org',
            GH='https://github.com',
        ),
        replace=[
            dict(
                pattern=r'(Issue #|\B#)(?P<issue>\d+)',
                url='{package_url}/issues/{issue}',
            ),
            dict(
                pattern=r'(?m:^((?P<scm_version>v?\d+(\.\d+){1,2}))\n[-=]+\n)',
                with_scm='{text}\n{rev[timestamp]:%d %b %Y}\n',
            ),
            dict(
                pattern=r'PEP[- ](?P<pep_number>\d+)',
                url='https://peps.python.org/pep-{pep_number:0>4}/',
            ),
            dict(
                pattern=r'(?<!\w)PR #(?P<pull>\d+)',
                url='{package_url}/pull/{pull}',
            ),
            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'setuptools_svn #(?P<setuptools_svn>\d+)',
                url='{GH}/jaraco/setuptools_svn/issues/{setuptools_svn}',
            ),
            dict(
                pattern=r'pypa/(?P<issue_repo>[\-\.\w]+)#(?P<issue_number>\d+)',
                url='{GH}/pypa/{issue_repo}/issues/{issue_number}',
            ),
            dict(
                pattern=r'pypa/(?P<commit_repo>[\-\.\w]+)@(?P<commit_number>[\da-f]+)',
                url='{GH}/pypa/{commit_repo}/commit/{commit_number}',
            ),
        ],
    ),
}

# Be strict about any broken references
nitpicky = True

# Include Python intersphinx mapping to prevent failures
# jaraco/skeleton#51
extensions += ['sphinx.ext.intersphinx']
intersphinx_mapping = {
    'python': ('https://docs.python.org/3', None),
}

# Preserve authored syntax for defaults
autodoc_preserve_defaults = True

intersphinx_mapping.update({
    'pip': ('https://pip.pypa.io/en/latest', None),
    'build': ('https://pypa-build.readthedocs.io/en/latest', None),
    'PyPUG': ('https://packaging.python.org/en/latest/', None),
    'packaging': ('https://packaging.pypa.io/en/latest/', None),
    'twine': ('https://twine.readthedocs.io/en/stable/', None),
    'importlib-resources': (
        'https://importlib-resources.readthedocs.io/en/latest', None
    ),
})

# Support tooltips on references
extensions += ['hoverxref.extension']
hoverxref_auto_ref = True
hoverxref_intersphinx = [
    'python',
    'pip',
    'build',
    'PyPUG',
    'packaging',
    'twine',
    'importlib-resources',
]

# Add support for linking usernames
github_url = 'https://github.com'
github_repo_org = 'pypa'
github_repo_name = 'setuptools'
github_repo_slug = f'{github_repo_org}/{github_repo_name}'
github_repo_url = f'{github_url}/{github_repo_slug}'
github_sponsors_url = f'{github_url}/sponsors'
extlinks = {
    'user': (f'{github_sponsors_url}/%s', '@%s'),  # noqa: WPS323
    'pypi': ('https://pypi.org/project/%s', '%s'),  # noqa: WPS323
    'wiki': ('https://wikipedia.org/wiki/%s', '%s'),  # noqa: WPS323
}
extensions += ['sphinx.ext.extlinks']

# Ref: https://github.com/python-attrs/attrs/pull/571/files\
#      #diff-85987f48f1258d9ee486e3191495582dR82
default_role = 'any'

# HTML theme
html_theme = 'furo'
html_logo = "images/logo.svg"

html_theme_options = {
    "sidebar_hide_name": True,
    "light_css_variables": {
        "color-brand-primary": "#336790",  # "blue"
        "color-brand-content": "#336790",
    },
    "dark_css_variables": {
        "color-brand-primary": "#E5B62F",  # "yellow"
        "color-brand-content": "#E5B62F",
    },
}

# Redirect old docs so links and references in the ecosystem don't break
extensions += ['sphinx_reredirects']
redirects = {
    "userguide/keywords": "/deprecated/changed_keywords.html",
    "userguide/commands": "/deprecated/commands.html",
}

# 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:exc', 'setuptools.errors.PlatformError'),  # sphinx cannot find it
    ('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),
)

# 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']

# Add icons (aka "favicons") to documentation
extensions += ['sphinx-favicon']
html_static_path = ['images']  # should contain the folder with icons

# Add support for nice Not Found 404 pages
extensions += ['notfound.extension']

# List of dicts with <link> HTML attributes
# static-file points to files in the html_static_path (href is computed)
favicons = [
    {  # "Catch-all" goes first, otherwise some browsers will overwrite
        "rel": "icon",
        "type": "image/svg+xml",
        "static-file": "logo-symbol-only.svg",
        "sizes": "any"
    },
    {  # Version with thicker strokes for better visibility at smaller sizes
        "rel": "icon",
        "type": "image/svg+xml",
        "static-file": "favicon.svg",
        "sizes": "16x16 24x24 32x32 48x48"
    },
    # rel="apple-touch-icon" does not support SVG yet
]
PK�![�OBJLL9doc/alt-python311-setuptools/docs/references/keywords.rstnu�[���========
Keywords
========

The following are keywords ``setuptools.setup()`` accepts.
They allow configuring the build process for a Python distribution or adding
metadata via a ``setup.py`` script placed at the root of your project.
All of them are optional; you do not have to supply them unless you need the
associated ``setuptools`` feature.

Metadata and configuration supplied via ``setup()`` is complementary to (and
may be overwritten by) the information present in ``setup.cfg`` and ``pyproject.toml``.
Some important metadata, such as ``name`` and ``version``, may assume
a default *degenerate* value if not specified.

Users are strongly encouraged to use a declarative config either via
:doc:`setup.cfg </userguide/declarative_config>` or :doc:`pyproject.toml
</userguide/pyproject_config>` and only rely on ``setup.py`` if they need to
tap into special behaviour that requires scripting (such as building C
extensions).

.. note::
   When using declarative configs via ``pyproject.toml``
   with ``setuptools<64.0.0``, users can still keep a very simple ``setup.py``
   just to ensure editable installs are supported, for example::

       from setuptools import setup

       setup()

   Versions of ``setuptools`` ``>=64.0.0`` do not require this extra minimal
   ``setup.py`` file.

.. _keyword/name:

``name``
    A string specifying the name of the package.

.. _keyword/version:

``version``
    A string specifying the version number of the package.

.. _keyword/description:

``description``
    A string describing the package in a single line.

.. _keyword/long_description:

``long_description``
    A string providing a longer description of the package.

.. _keyword/long_description_content_type:

``long_description_content_type``
    A string specifying the content type is used for the ``long_description``
    (e.g. ``text/markdown``)

.. _keyword/author:

``author``
    A string specifying the author of the package.

.. _keyword/author_email:

``author_email``
    A string specifying the email address of the package author.

.. _keyword/maintainer:

``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``.

.. _keyword/maintainer_email:

``maintainer_email``
    A string specifying the email address of the current maintainer, if
    different from the author.

.. _keyword/url:

``url``
    A string specifying the URL for the package homepage.

.. _keyword/download_url:

``download_url``
    A string specifying the URL to download the package.

.. _keyword/packages:

``packages``
    A list of strings specifying the packages that setuptools will manipulate.

.. _keyword/py_modules:

``py_modules``
    A list of strings specifying the modules that setuptools will manipulate.

.. _keyword/scripts:

``scripts``
    A list of strings specifying the standalone script files to be built and
    installed.

.. _keyword/ext_package:

``ext_package``
    A string specifying the base package name for the extensions provided by
    this package.

.. _keyword/ext_modules:

``ext_modules``
    A list of instances of ``setuptools.Extension`` providing the list of
    Python extensions to be built.

.. _keyword/classifiers:

``classifiers``
    A list of strings describing the categories for the package.

.. _keyword/distclass:

``distclass``
    A subclass of ``Distribution`` to use.

.. _keyword/script_name:

``script_name``
    A string specifying the name of the setup.py script -- defaults to
    ``sys.argv[0]``

.. _keyword/script_args:

``script_args``
    A list of strings defining the arguments to supply to the setup script.

.. _keyword/options:

``options``
    A dictionary providing the default options for the setup script.

.. _keyword/license:

``license``
    A string specifying the license of the package.

.. _keyword/license_file:

``license_file``
    .. warning::
        ``license_file`` is deprecated. Use ``license_files`` instead.

.. _keyword/license_files:

``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*``.

.. _keyword/keywords:

``keywords``
    A list of strings or a comma-separated string providing descriptive
    meta-data. See: :ref:`Core Metadata Specifications<core-metadata-keywords>`.

.. _keyword/platforms:

``platforms``
    A list of strings or comma-separated string.

.. _keyword/cmdclass:

``cmdclass``
    A dictionary providing a mapping of command names to ``Command``
    subclasses.

.. _keyword/data_files:

``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.

.. _keyword/package_dir:

``package_dir``
    A dictionary that maps package names (as they will be
    imported by the end-users) into directory paths (that actually exist in the
    project's source tree). This configuration has two main purposes:

    1. To effectively "rename" paths when building your package.
       For example, ``package_dir={"mypkg": "dir1/dir2/code_for_mypkg"}``
       will instruct setuptools to copy the ``dir1/dir2/code_for_mypkg/...`` files
       as ``mypkg/...`` when building the final :term:`wheel distribution <Wheel>`.

       .. attention::
          While it is *possible* to specify arbitrary mappings, developers are
          **STRONGLY ADVISED AGAINST** that. They should try as much as possible
          to keep the directory names and hierarchy identical to the way they will
          appear in the final wheel, only deviating when absolutely necessary.

    2. To indicate that the relevant code is entirely contained inside
       a specific directory (instead of directly placed under the project's root).
       In this case, a special key is required (the empty string, ``""``),
       for example: ``package_dir={"": "<name of the container directory>"}``.
       All the directories inside the container directory will be copied
       directly into the final :term:`wheel distribution <Wheel>`, but the
       container directory itself will not.

       This practice is very common in the community to help separate the
       package implementation from auxiliary files (e.g. CI configuration files),
       and is referred to as :ref:`src-layout`, because the container
       directory is commonly named ``src``.

    All paths in ``package_dir`` must be relative to the project root directory
    and use a forward slash (``/``) as path separator regardless of the
    operating system.

    .. tip::
       When using :doc:`package discovery </userguide/package_discovery>`
       together with :doc:`setup.cfg </userguide/declarative_config>` or
       :doc:`pyproject.toml </userguide/pyproject_config>`, it is very likely
       that you don't need to specify a value for ``package_dir``.  Please have
       a look at the definitions of :ref:`src-layout` and :ref:`flat-layout` to
       learn common practices on how to design a project's directory structure
       and minimise the amount of configuration that is needed.

.. _keyword/requires:

``requires``
   .. warning::
      ``requires`` is superseded by ``install_requires`` and should not be used
      anymore.

.. _keyword/obsoletes:

``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.

.. _keyword/provides:

``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"``).

.. _keyword/include_package_data:

``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`.

.. _keyword/exclude_package_data:

``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`.

.. _keyword/package_data:

``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.)

.. _keyword/zip_safe:

``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.

.. _keyword/install_requires:

``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.

.. _keyword/entry_points:

``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>`.

.. _keyword/extras_require:

``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.

.. _keyword/python_requires:

``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.

.. _keyword/setup_requires:

``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 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``.)

.. _keyword/dependency_links:

``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 during install by tools that support them.

.. _keyword/namespace_packages:

``namespace_packages``
    .. warning::
        ``namespace_packages`` is deprecated in favor of native/implicit
        namespaces (:pep:`420`). Check :doc:`the Python Packaging User Guide
        <PyPUG:guides/packaging-namespace-packages>` for more information.

    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.

.. _keyword/test_suite:

``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.

    .. warning::
       .. deprecated:: 41.5.0
          The test command will be removed in a future version of ``setuptools``,
          alongside any test configuration parameter.

.. _keyword/tests_require:

``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.
    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.

    .. warning::
       .. deprecated:: 41.5.0
          The test command will be removed in a future version of ``setuptools``,
          alongside any test configuration parameter.

.. _test_loader:

.. _keyword/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.

    .. warning::
       .. deprecated:: 41.5.0
          The test command will be removed in a future version of ``setuptools``,
          alongside any test configuration parameter.

.. _keyword/eager_resources:

``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`.

.. _keyword/project_urls:

``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�![�]i��0doc/alt-python311-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
  [#manifest]_.

* 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",
      ]
      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.











Forum and Bug Tracker
=====================

Please use `GitHub Discussions`_ for questions and discussion about
setuptools, and the `setuptools bug tracker`_ ONLY for issues you have
confirmed via the forum are actual bugs, and which you have reduced to a minimal
set of steps to reproduce.

.. _GitHub Discussions: https://github.com/pypa/setuptools/discussions
.. _setuptools bug tracker: https://github.com/pypa/setuptools/


----


.. [#manifest] The default behaviour for ``setuptools`` will work well for pure
   Python packages, or packages with simple C extensions (that don't require
   any special C header). See :ref:`Controlling files in the distribution` and
   :doc:`userguide/datafiles` for more information about complex scenarios, if
   you want to include other types of files.


.. |MANIFEST.in| replace:: ``MANIFEST.in``
.. _MANIFEST.in: https://packaging.python.org/en/latest/guides/using-manifest-in/
PK�![�&5pp-doc/alt-python311-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�![ꁓ�00+doc/alt-python311-setuptools/docs/index.rstnu�[���.. image:: images/banner-640x320.svg
   :align: center

Documentation
=============

Setuptools is a fully-featured, actively-maintained, and stable library
designed to facilitate packaging Python projects.

It helps developers to easily share reusable code (in the form of a library)
and programs (e.g., CLI/GUI tools implemented in Python), that can be installed
with :pypi:`pip` and uploaded to `PyPI <http://pypi.org>`_.

.. toctree::
   :maxdepth: 1
   :hidden:

   User guide <userguide/index>
   build_meta
   pkg_resources
   references/keywords
   setuptools

.. toctree::
   :caption: Project
   :maxdepth: 1
   :hidden:

   roadmap
   Development guide <development/index>
   Backward compatibility & deprecated practice <deprecated/index>
   Changelog <history>
   artwork

.. tidelift-referral-banner::
PK�![)#���s�s9doc/alt-python311-setuptools/docs/deprecated/commands.rstnu�[���===============================
Running ``setuptools`` commands
===============================

Historically, ``setuptools`` allowed running commands via a ``setup.py`` script
at the root of a Python project, as indicated in the examples below::

    python setup.py --help
    python setup.py --help-commands
    python setup.py --version
    python setup.py sdist
    python setup.py bdist_wheel

You could also run commands in other circumstances:

* ``setuptools`` projects without ``setup.py`` (e.g., ``setup.cfg``-only)::

   python -c "from setuptools import setup; setup()" --help

* ``distutils`` projects (with a ``setup.py`` importing ``distutils``)::

   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.

.. warning::
   While it is perfectly fine that users write ``setup.py`` files to configure
   a package build (e.g. to specify binary extensions or customize commands),
   on recent versions of ``setuptools``, running ``python setup.py`` directly
   as a script is considered **deprecated**. This also means that users should
   avoid running commands directly via ``python setup.py <command>``.

   If you want to create :term:`sdist <Source Distribution (or "sdist")>` or :term:`wheel`
   distributions the recommendation is to use the command line tool provided by :pypi:`build`::

       pip install build  # needs to be installed first

       python -m build  # builds both sdist and wheel
       python -m build --sdist
       python -m build --wheel

   Build will automatically download ``setuptools`` and build the package in an
   isolated environment. You can also specify specific versions of
   ``setuptools``, by setting the :doc:`build requirements in pyproject.toml
   </build_meta>`.

   If you want to install a package, you can use :pypi:`pip` or :pypi:`installer`::

      pip install /path/to/wheel/file.whl
      pip install /path/to/sdist/file.tar.gz
      pip install .  # replacement for python setup.py install
      pip install --editable .  # replacement for python setup.py develop

      pip install installer  # needs to be installed first
      python -m installer /path/to/wheel/file.whl

-----------------
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�![�9���Ddoc/alt-python311-setuptools/docs/deprecated/resource_extraction.rstnu�[���.. _Automatic Resource Extraction:

Automatic Resource Extraction
=============================

In a modern setup, Python packages are usually installed as directories,
and all the files can be found on deterministic locations on the disk.
This means that most of the tools expect package resources to be "real" files.

There are a few occasions however that packages are loaded in a different way
(e.g., from a zip file), which is incompatible with the assumptions mentioned above.
Moreover, a package developer may also include non-extension native libraries or other files that
C extensions may expect to be able to access.

In these scenarios, the use of :mod:`importlib.resources` is recommended.

Old implementations (prior to the advent of :mod:`importlib.resources`) and
long-living projects, however, may still rely on the library ``pkg_resources``
to access these files.

If you have to support such systems, or want to provide backward compatibility
for ``pkg_resources``, you may need to add an special configuration
to ``setuptools`` when packaging a project.
This can be done by listing as ``eager_resources`` (argument to ``setup()``
in ``setup.py`` or field in ``setup.cfg``) all the files that need to 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``/``setuptools``-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.
PK�![��h�FF9doc/alt-python311-setuptools/docs/deprecated/zip_safe.rstnu�[���Understanding the ``zip_safe`` flag
===================================

The ``zip_safe`` flag is a ``setuptools`` configuration mainly associated
with the ``egg`` distribution format
(which got replaced in the ecosystem by the newer ``wheel`` format) and the
``easy_install`` command (deprecated in ``setuptools`` v58.3.0).

It is very unlikely that the values of ``zip_safe`` will affect modern
deployments that use :pypi:`pip` for installing packages.
Moreover, new users of ``setuptools`` should not attempt to create egg files
using the deprecated ``build_egg`` command.
Therefore, this flag is considered **obsolete**.

This document, however, describes what was the historical motivation behind
this flag, and how it was used.

Historical Motivation
---------------------

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.

In the past, ``setuptools`` would install a project distributed
as a zipfile or a directory (via the ``easy_install`` command or
``python setup.py install``),
the default choice being determined by the project's ``zip_safe`` flag.

How the ``zip_safe`` flag was used?
-----------------------------------

To set this flag, a developer would pass a boolean value for the ``zip_safe`` argument to the
``setup()`` function, or omit it.  When omitted, the ``bdist_egg``
command would analyze the project's contents to see if it could detect any
conditions that preventing the project from working in a zipfile.

This was extremely conservative: ``bdist_egg`` would consider the
project unsafe if it contained any C extensions or datafiles whatsoever.  This
does *not* mean that the project couldn't or wouldn't work as a zipfile!  It just
means that the ``bdist_egg`` authors were not yet comfortable asserting that
the project *would* work.  If the project did not contain any C or data files, and did not
attempt to perform ``__file__`` or ``__path__`` introspection or source code manipulation, then
there was an extremely solid chance the project will work when installed as a
zipfile.  (And if the project used ``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 for more information.)

The developer could manually set ``zip_safe`` to ``True`` to perform tests,
or to override the default behaviour (after checking all the warnings and
understanding the implications), this would allow ``setuptools`` to install the
project as a zip file. Alternatively, by setting ``zip_safe`` to ``False``,
developers could force ``setuptools`` to always install the project as a
directory.

Modern ways of loading packages from zip files
----------------------------------------------

Currently, popular Python package installers (such as :pypi:`pip`) and package
indexes (such as PyPI_) consider that distribution packages are always
installed as a directory.
It is however still possible to load packages from zip files added to
:obj:`sys.path`, thanks to the :mod:`zipimport` module
and the :mod:`importlib` machinery provided by Python standard library.

When working with modules loaded from a zip file, it is important to keep in
mind that values of ``__file__`` and ``__path__`` might not work as expected.
Please check the documentation for :mod:`importlib.resources`, if file
locations are important for your use case.


.. _PyPI: https://pypi.org
PK�![9�΁�Adoc/alt-python311-setuptools/docs/deprecated/changed_keywords.rstnu�[���New and Changed ``setup()`` Keywords
====================================

This document tracks historical differences between ``setuptools`` and
``distutils``.

Since ``distutils`` was scheduled for removal from the standard library in
Python 3.12, and ``setuptools`` started its adoption, these differences became less
relevant.
Please check :doc:`/references/keywords` for a complete list of keyword
arguments that can be passed to the ``setuptools.setup()`` function and
a their full description.

.. tab:: Supported by both ``distutils`` and ``setuptoools``

    ``name`` string

    ``version`` string

    ``description`` string

    ``long_description`` string

    ``long_description_content_type`` string

    ``author`` string

    ``author_email`` string

    ``maintainer`` string

    ``maintainer_email`` string

    ``url`` string

    ``download_url`` string

    ``packages`` list

    ``py_modules`` list

    ``scripts`` list

    ``ext_package`` string

    ``ext_modules`` list

    ``classifiers`` list

    ``distclass`` Distribution subclass

    ``script_name`` string

    ``script_args`` list

    ``options`` dictionary

    ``license`` string

    ``license_file`` string **deprecated**

    ``license_files`` list

    ``keywords`` string or list

    ``platforms`` list

    ``cmdclass`` dictionary

    ``data_files`` list **deprecated**

    ``package_dir`` dictionary

    ``requires`` string or list **deprecated**

    ``obsoletes`` list **deprecated**

    ``provides`` list

.. tab:: Added or changed by ``setuptoools``

    ``include_package_data`` bool

    ``exclude_package_data`` dictionary

    ``package_data`` dictionary

    ``zip_safe`` bool

    ``install_requires`` string or list

    ``entry_points`` dictionary

    ``extras_require`` dictionary

    ``python_requires`` string

    ``setup_requires`` string or list **deprecated**

    ``dependency_links`` list **deprecated**

    ``namespace_packages`` list

    ``test_suite`` string or function **deprecated**

    ``tests_require`` string or list **deprecated**

    ``test_loader`` class **deprecated**

    ``eager_resources`` list

    ``project_urls`` dictionary
PK�![�} $v$vAdoc/alt-python311-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.pypa.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


: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.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�![f�`�((Cdoc/alt-python311-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


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�![:X���Ddoc/alt-python311-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�![I���Gdoc/alt-python311-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�![�Y�
&
&Edoc/alt-python311-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�![���e�K�KDdoc/alt-python311-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`   |         |
+-------------+------------------------------+---------+

.. 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                           |
+--------------------------+-------------------------------------+

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_dumb --dumb-option=foo

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.)

.. _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.

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.
PK�![������Edoc/alt-python311-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` or by pointing :envvar:`DIST_EXTRA_CONFIG`
  to another configuration file

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�![t����Ddoc/alt-python311-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�![�^I\��Edoc/alt-python311-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}}
PK�![�G3���Gdoc/alt-python311-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).

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�![@�G���@doc/alt-python311-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�![��[��Qdoc/alt-python311-setuptools/docs/deprecated/distutils/_setuptools_disclaimer.rstnu�[���.. note::

   This document is being retained solely until the ``setuptools`` documentation
   at https://setuptools.pypa.io/en/latest/setuptools.html
   independently covers all of the relevant information currently included here.
PK�![����fzfzFdoc/alt-python311-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             |        |
+----------------------+---------------------------+-----------------+--------+
| ``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)
    If maintainer is provided and author is not, distutils lists maintainer 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�![3wF++Adoc/alt-python311-setuptools/docs/deprecated/dependency_links.rstnu�[���Specifying dependencies that aren't in PyPI via ``dependency_links``
====================================================================

.. 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 if 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 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/",
            ],
        )
PK�![eO<�x�x<doc/alt-python311-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�![5�B	B	Adoc/alt-python311-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 60.0.0 release, Setuptools includes a local, vendored copy of distutils (from late copies of CPython) that is enabled by default. To disable the use of this copy of distutils when invoking setuptools, set the environment variable:

    SETUPTOOLS_USE_DISTUTILS=stdlib

.. warning::
   Please note that this also affects how ``distutils.cfg`` files inside stdlib's ``distutils``
   package directory are processed.
   Unless ``SETUPTOOLS_USE_DISTUTILS=stdlib``, they will have no effect on the build process.

   You can still use a global user config file, ``~/.pydistutils.cfg`` (POSIX) or ``%USERPROFILE%/pydistutils.cfg`` (Windows),
   or use the environment variable :doc:`DIST_EXTRA_CONFIG <deprecated/distutils/configfile>` to point to another
   supplementary configuration file.


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.command.{build_clib,build_ext,build_py,sdist}`` → ``setuptools.command.*``

``distutils.log`` → :mod:`logging` (standard library)

``distutils.version.*`` → :doc:`packaging.version.* <packaging:version>`

``distutils.errors.*`` → ``setuptools.errors.*`` [#errors]_


Migration advice is also provided by :pep:`PEP 632 <632#migration-advice>`.

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.


.. [#errors] Please notice errors related to the command line usage of
   ``setup.py``, such as ``DistutilsArgError``, are intentionally not exposed
   by setuptools, since this is considered a deprecated practice.
PK�![ƖH__6doc/alt-python311-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

    changed_keywords
    dependency_links
    python_eggs
    easy_install
    zip_safe
    resource_extraction
    distutils/index
    distutils-legacy
    functionalities
    commands
PK�![�{�a�a�=doc/alt-python311-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 :pypi:`setuptools` on the package index
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 :pypi:`virtualenv` documentation for more details.


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�![n��[��@doc/alt-python311-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�![�̈��'doc/alt-python311-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.

If you want to enable valgrind support in Python, you will need to
configure Python --with-valgrind option or an older option
--without-pymalloc.

UPDATE: Python 3.6 now supports PYTHONMALLOC=malloc environment variable which
can be used to force the usage of the malloc() allocator of the C library.

If you don't want to read about the details of using Valgrind, there
are still two things you must do to suppress the warnings.  First,
you must use a suppressions file.  One is supplied in
Misc/valgrind-python.supp.  Second, you must uncomment the lines in 
Misc/valgrind-python.supp that suppress the warnings for PyObject_Free and
PyObject_Realloc.

If you want to use Valgrind more effectively and catch even more
memory leaks, you will need to configure python --without-pymalloc.
PyMalloc allocates a few blocks in big chunks and most object
allocations don't call malloc, they use chunks doled about by PyMalloc
from the big blocks.  This means Valgrind can't detect
many allocations (and frees), except for those that are forwarded
to the system malloc.  Note: configuring python --without-pymalloc
makes Python run much slower, especially when running under Valgrind.
You may need to run the tests in batches under Valgrind to keep
the memory usage down to allow the tests to complete.  It seems to take
about 5 times longer to run --without-pymalloc.

Apr 15, 2006:
  test_ctypes causes Valgrind 3.1.1 to fail (crash).
  test_socket_ssl should be skipped when running valgrind.
	The reason is that it purposely uses uninitialized memory.
	This causes many spurious warnings, so it's easier to just skip it.


Details:
--------
Python uses its own small-object allocation scheme on top of malloc,
called PyMalloc.

Valgrind may show some unexpected results when PyMalloc is used.
Starting with Python 2.3, PyMalloc is used by default.  You can disable
PyMalloc when configuring python by adding the --without-pymalloc option.
If you disable PyMalloc, most of the information in this document and
the supplied suppressions file will not be useful.  As discussed above,
disabling PyMalloc can catch more problems.

PyMalloc uses 256KB chunks of memory, so it can't detect anything
wrong within these blocks.  For that reason, compiling Python
--without-pymalloc usually increases the usefulness of other tools.

If you use valgrind on a default build of Python,  you will see
many errors like:

        ==6399== Use of uninitialised value of size 4
        ==6399== at 0x4A9BDE7E: PyObject_Free (obmalloc.c:711)
        ==6399== by 0x4A9B8198: dictresize (dictobject.c:477)

These are expected and not a problem.  Tim Peters explains
the situation:

        PyMalloc needs to know whether an arbitrary address is one
	that's managed by it, or is managed by the system malloc.
	The current scheme allows this to be determined in constant
	time, regardless of how many memory areas are under pymalloc's
	control.

        The memory pymalloc manages itself is in one or more "arenas",
	each a large contiguous memory area obtained from malloc.
	The base address of each arena is saved by pymalloc
	in a vector.  Each arena is carved into "pools", and a field at
	the start of each pool contains the index of that pool's arena's
	base address in that vector.

        Given an arbitrary address, pymalloc computes the pool base
	address corresponding to it, then looks at "the index" stored
	near there.  If the index read up is out of bounds for the
	vector of arena base addresses pymalloc maintains, then
	pymalloc knows for certain that this address is not under
	pymalloc's control.  Otherwise the index is in bounds, and
	pymalloc compares

            the arena base address stored at that index in the vector

        to

            the arbitrary address pymalloc is investigating

        pymalloc controls this arbitrary address if and only if it lies
        in the arena the address's pool's index claims it lies in.

        It doesn't matter whether the memory pymalloc reads up ("the
	index") is initialized.  If it's not initialized, then
	whatever trash gets read up will lead pymalloc to conclude
	(correctly) that the address isn't controlled by it, either
	because the index is out of bounds, or the index is in bounds
	but the arena it represents doesn't contain the address.

        This determination has to be made on every call to one of
	pymalloc's free/realloc entry points, so its speed is critical
	(Python allocates and frees dynamic memory at a ferocious rate
	-- everything in Python, from integers to "stack frames",
	lives in the heap).
PK�![���3{"{",doc/alt-python311-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�![蘪zccdoc/alt-python311-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.

define pyo
    # side effect of calling _PyObject_Dump is to dump the object's
    # info - assigning just prevents gdb from printing the
    # NULL return value
    set $_unused_void = _PyObject_Dump($arg0)
end
document pyo
  Prints a representation of the object to stderr, along with the
  number of reference counts it currently has and the hex address the
  object is allocated at.  The argument must be a PyObject*
end

define pyg
    print _PyGC_Dump($arg0)
end
document pyg
  Prints a representation of the object to stderr, along with the
  number of reference counts it currently has and the hex address the
  object is allocated at.  The argument must be a PyGC_Head*
end

define pylocals
    set $_i = 0
    while $_i < f->f_code->co_nlocals
	if f->f_localsplus + $_i != 0
	    set $_names = f->f_code->co_varnames
	    set $_name = PyUnicode_AsUTF8(PyTuple_GetItem($_names, $_i))
	    printf "%s:\n", $_name
            pyo f->f_localsplus[$_i]
	end
        set $_i = $_i + 1
    end
end
document pylocals
  Print the local variables of the current frame.
end

# A rewrite of the Python interpreter's line number calculator in GDB's
# command language
define lineno
    set $__continue = 1
    set $__co = f->f_code
    set $__lasti = f->f_lasti
    set $__sz = ((PyVarObject *)$__co->co_lnotab)->ob_size/2
    set $__p = (unsigned char *)((PyBytesObject *)$__co->co_lnotab)->ob_sval
    set $__li = $__co->co_firstlineno
    set $__ad = 0
    while ($__sz-1 >= 0 && $__continue)
      set $__sz = $__sz - 1
      set $__ad = $__ad + *$__p
      set $__p = $__p + 1
      if ($__ad > $__lasti)
	set $__continue = 0
      else
        set $__li = $__li + *$__p
        set $__p = $__p + 1
      end
    end
    printf "%d", $__li
end

define pyframev
    pyframe
    pylocals
end
document pyframev
  Print the current frame - verbose
end

define pyframe
    set $__fn = PyUnicode_AsUTF8(f->f_code->co_filename)
    set $__n = PyUnicode_AsUTF8(f->f_code->co_name)
    printf "%s (", $__fn
    lineno
    printf "): %s\n", $__n
### Uncomment these lines when using from within Emacs/XEmacs so it will
### automatically track/display the current Python source line
#    printf "%c%c%s:", 032, 032, $__fn
#    lineno
#    printf ":1\n"
end

### Use these at your own risk.  It appears that a bug in gdb causes it
### to crash in certain circumstances.

#define up
#    up-silently 1
#    printframe
#end

#define down
#    down-silently 1
#    printframe
#end

define printframe
    if $pc > PyEval_EvalFrameEx && $pc < _PyEval_EvalFrameDefault
	pyframe
    else
        frame
    end
end

# Here's a somewhat fragile way to print the entire Python stack from gdb.
# It's fragile because the tests for the value of $pc depend on the layout
# of specific functions in the C source code.

# Explanation of while and if tests: We want to pop up the stack until we
# land in Py_Main (this is probably an incorrect assumption in an embedded
# interpreter, but the test can be extended by an interested party).  If
# Py_Main <= $pc <= Py_GetArgcArv is true, $pc is in Py_Main(), so the while
# tests succeeds as long as it's not true.  In a similar fashion the if
# statement tests to see if we are in PyEval_EvalFrameEx().

# Note: The name of the main interpreter function and the function which
# follow it has changed over time.  This version of pystack works with this
# version of Python.  If you try using it with older or newer versions of
# the interpreter you may will have to change the functions you compare with
# $pc.

define pystack
    while $pc < Py_Main || $pc > Py_GetArgcArgv
        if $pc > PyEval_EvalFrameEx && $pc < _PyEval_EvalFrameDefault
	    pyframe
        end
        up-silently 1
    end
    select-frame 0
end
document pystack
  Print the entire Python call stack
end

define pystackv
    while $pc < Py_Main || $pc > Py_GetArgcArgv
        if $pc > PyEval_EvalFrameEx && $pc < _PyEval_EvalFrameDefault
	    pyframev
        end
        up-silently 1
    end
    select-frame 0
end
document pystackv
  Print the entire Python call stack - verbose mode
end

define pu
  set $uni = $arg0
  set $i = 0
  while (*$uni && $i++<100)
    if (*$uni < 0x80)
      print *(char*)$uni++
    else
      print /x *(short*)$uni++
    end
  end
end
document pu
  Generally useful macro to print a Unicode string
end
PK"[���N�Nman/man1/python3.12.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 \-P
]
[
.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 \--help
]
[
.B \--help-env
]
[
.B \--help-xoptions
]
[
.B \--help-all
]
.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 "\-\-help\-env"
Prints help about Python-specific environment variables and exits.
.TP
.B "\-\-help\-xoptions"
Prints help about implementation-specific \fB\-X\fP options and exits.
.TP
.TP
.B "\-\-help\-all"
Prints complete usage information 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, \fB\-P\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. This terminates the option list (following options
are passed as arguments to the module).
.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 \-P
Don't automatically prepend a potentially unsafe path to \fBsys.path\fP such
as the current directory, the script's directory or an empty string. See also the
\fBPYTHONSAFEPATH\fP environment variable.
.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's warning machinery by default prints warning messages
to
.IR sys.stderr .

The simplest settings apply a particular action unconditionally to all warnings
emitted by a process (even those that are otherwise ignored by default):

  -Wdefault  # Warn once per call location
  -Werror    # Convert to exceptions
  -Walways   # Warn every time
  -Wall      # Same as -Walways
  -Wmodule   # Warn once per calling module
  -Wonce     # Warn once per Python process
  -Wignore   # Never warn

The action names can be abbreviated as desired and the interpreter will resolve
them to the appropriate action name. For example,
.B -Wi
is the same as
.B -Wignore .

The full form of argument is:
.IB action:message:category:module:lineno

Empty fields match all values; trailing empty fields may be omitted. For
example
.B -W ignore::DeprecationWarning
ignores all DeprecationWarning warnings.

The
.I action
field is as explained above but only applies to warnings that match
the remaining fields.

The
.I message
field must match the whole printed warning message; this match is
case-insensitive.

The
.I category
field matches the warning category (ex: "DeprecationWarning"). 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
.I module
field matches the (fully-qualified) module name; this match is case-sensitive.

The
.I lineno
field matches the line number, where zero matches all line numbers and is thus
equivalent to an omitted line number.

Multiple
.B -W
options can 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 (though, a warning message is printed about invalid options
when the first warning is issued).

Warnings can also be controlled using the
.B PYTHONWARNINGS
environment variable and from within a Python program using the warnings
module.  For example, the warnings.filterwarnings() function can be used to use
a regular expression on the warning message.

.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 importtime: show how long each import takes. It shows module name,
        cumulative time (including nested imports) and self time (excluding
        nested imports). Note that its output may be broken in multi-threaded
        application. Typical usage is python3 -X importtime -c 'import asyncio'

    -X dev: enable CPython's "development mode", introducing additional runtime
        checks which are too expensive to be enabled by default. It will not be
        more verbose than the default if the code is correct: new warnings are
        only emitted when an issue is detected. Effect of the developer mode:
           * Add default warning filter, as -W default
           * Install debug hooks on memory allocators: see the PyMem_SetupDebugHooks()
             C function
           * Enable the faulthandler module to dump the Python traceback on a crash
           * Enable asyncio debug mode
           * Set the dev_mode attribute of sys.flags to True
           * io.IOBase destructor logs close() exceptions

    -X utf8: enable UTF-8 mode for operating system interfaces, overriding the default
        locale-aware mode. -X utf8=0 explicitly disables UTF-8 mode (even when it would
        otherwise activate automatically). See PYTHONUTF8 for more details

    -X pycache_prefix=PATH: enable writing .pyc files to a parallel tree rooted at the
        given directory instead of to the code tree.

    -X warn_default_encoding: enable opt-in EncodingWarning for 'encoding=None'

    -X no_debug_ranges: disable the inclusion of the tables mapping extra location
       information (end line, start column offset and end column offset) to every
       instruction in code objects. This is useful when smaller code objects and pyc
       files are desired as well as suppressing the extra visual location indicators
       when the interpreter displays tracebacks.

    -X frozen_modules=[on|off]: whether or not frozen modules should be used.
       The default is "on" (or "off" if you are running a local build).

    -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 PYTHONSAFEPATH
If this is set to a non-empty string, don't automatically prepend a potentially
unsafe path to \fBsys.path\fP such as the current directory, the script's
directory or an empty string. See also the \fB\-P\fP option.
.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 PYTHONPLATLIBDIR
Override sys.platlibdir.
.IP PYTHONSTARTUP
If this is the name of a readable file, the Python commands in that
file are executed before the first prompt is displayed in interactive
mode.
The file is executed in the same name space where interactive commands
are executed so that objects defined or imported in it can be used
without qualification in the interactive session.
You can also change the prompts
.I sys.ps1
and
.I sys.ps2
in this file.
.IP PYTHONOPTIMIZE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-O\fP option. If set to an integer, it is equivalent to
specifying \fB\-O\fP multiple times.
.IP PYTHONDEBUG
If this is set to a non-empty string it is equivalent to specifying
the \fB\-d\fP option. If set to an integer, it is equivalent to
specifying \fB\-d\fP multiple times.
.IP PYTHONDONTWRITEBYTECODE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-B\fP option (don't try to write
.I .pyc
files).
.IP PYTHONINSPECT
If this is set to a non-empty string it is equivalent to specifying
the \fB\-i\fP option.
.IP PYTHONIOENCODING
If this is set before running the interpreter, it overrides the encoding used
for stdin/stdout/stderr, in the syntax
.IB encodingname ":" errorhandler
The
.IB errorhandler
part is optional and has the same meaning as in str.encode. For stderr, the
.IB errorhandler
 part is ignored; the handler will always be \'backslashreplace\'.
.IP PYTHONNOUSERSITE
If this is set to a non-empty string it is equivalent to specifying the
\fB\-s\fP option (Don't add the user site directory to sys.path).
.IP PYTHONUNBUFFERED
If this is set to a non-empty string it is equivalent to specifying
the \fB\-u\fP option.
.IP PYTHONVERBOSE
If this is set to a non-empty string it is equivalent to specifying
the \fB\-v\fP option. If set to an integer, it is equivalent to
specifying \fB\-v\fP multiple times.
.IP PYTHONWARNINGS
If this is set to a comma-separated string it is equivalent to
specifying the \fB\-W\fP option for each separate value.
.IP PYTHONHASHSEED
If this variable is set to "random", a random value is used to seed the hashes
of str and bytes objects.

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

The integer must be a decimal number in the range [0,4294967295].  Specifying
the value 0 will disable hash randomization.
.IP PYTHONINTMAXSTRDIGITS
Limit the maximum digit characters in an int value
when converting from a string and when converting an int back to a str.
A value of 0 disables the limit.  Conversions to or from bases 2, 4, 8,
16, and 32 are never limited.
.IP PYTHONMALLOC
Set the Python memory allocators and/or install debug hooks. The available
memory allocators are
.IR malloc
and
.IR pymalloc .
The available debug hooks are
.IR debug ,
.IR malloc_debug ,
and
.IR pymalloc_debug .
.IP
When Python is compiled in debug mode, the default is
.IR pymalloc_debug
and the debug hooks are automatically used. Otherwise, the default is
.IR pymalloc .
.IP PYTHONMALLOCSTATS
If set to a non-empty string, Python will print statistics of the pymalloc
memory allocator every time a new pymalloc object arena is created, and on
shutdown.
.IP
This variable is ignored if the
.RB $ PYTHONMALLOC
environment variable is used to force the
.BR malloc (3)
allocator of the C library, or if Python is configured without pymalloc support.
.IP PYTHONASYNCIODEBUG
If this environment variable is set to a non-empty string, enable the debug
mode of the asyncio module.
.IP PYTHONTRACEMALLOC
If this environment variable is set to a non-empty string, start tracing
Python memory allocations using the tracemalloc module.
.IP
The value of the variable is the maximum number of frames stored in a
traceback of a trace. For example,
.IB PYTHONTRACEMALLOC=1
stores only the most recent frame.
.IP PYTHONFAULTHANDLER
If this environment variable is set to a non-empty string,
.IR faulthandler.enable()
is called at startup: install a handler for SIGSEGV, SIGFPE, SIGABRT, SIGBUS
and SIGILL signals to dump the Python traceback.
.IP
This is equivalent to the \fB-X faulthandler\fP option.
.IP PYTHONEXECUTABLE
If this environment variable is set,
.IB sys.argv[0]
will be set to its value instead of the value got through the C runtime. Only
works on Mac OS X.
.IP PYTHONUSERBASE
Defines the user base directory, which is used to compute the path of the user
.IR site-packages
directory and installation paths for
.IR "python \-m pip 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 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"[�V+EE,licenses/alt-python312-pip-wheel/LICENSE.txtnu�[���Copyright (c) 2008-present The pip developers (see AUTHORS.txt file)

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
PK"[�V+EE&licenses/alt-python312-pip/LICENSE.txtnu�[���Copyright (c) 2008-present The pip developers (see AUTHORS.txt file)

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
PK"[UvF��� doc/alt-python312-pip/README.rstnu�[���pip - The Python Package Installer
==================================

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

.. image:: https://img.shields.io/pypi/pyversions/pip
   :target: https://pypi.org/project/pip
   :alt: PyPI - Python Version

.. image:: https://readthedocs.org/projects/pip/badge/?version=latest
   :target: https://pip.pypa.io/en/latest
   :alt: Documentation

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`_

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 IRC`_

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

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

.. _package installer: https://packaging.python.org/guides/tool-recommendations/
.. _Python Package Index: https://pypi.org
.. _Installation: https://pip.pypa.io/en/stable/installation/
.. _Usage: https://pip.pypa.io/en/stable/
.. _Release notes: https://pip.pypa.io/en/stable/news.html
.. _Release process: https://pip.pypa.io/en/latest/development/release-process/
.. _GitHub page: https://github.com/pypa/pip
.. _Development documentation: https://pip.pypa.io/en/latest/development
.. _Issue tracking: https://github.com/pypa/pip/issues
.. _Discourse channel: https://discuss.python.org/c/packaging
.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa
.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev
.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
PK"[_��$doc/alt-python312-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-python312-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"[SE���$doc/alt-python312-setuptools/LICENSEnu�[���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"[�S��
�
5doc/alt-python312-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"[���$CC-doc/alt-python312-setuptools/docs/artwork.rstnu�[���=======
Artwork
=======

.. figure:: images/logo-over-white.svg
   :align: center

   Setuptools logo, designed in 2021 by `Anderson Bravalheri`_

Elements of Design
==================

The main colours of the design are a dark pastel azure (``#336790``) and a pale
orange (``#E5B62F``), referred in this document simply as "blue" and "yellow"
respectively. The text uses the *Monoid* typeface, an open source webfont that
was developed by Andreas Larsen and contributors in 2015 and is distributed
under the MIT or SIL licenses (more information at
https://github.com/larsenwork/monoid)


Usage
=====

The preferred way of using the setuptools logo is over a white (or light)
background. Alternatively, the following options can be considered, depending
on the circumstances:

- *"negative"* design - for dark backgrounds (e.g. website displayed in "dark
  mode"): the white colour (``#FFFFFF``) of the background and the "blue"
  (``#336790``) colour of the design can be swapped.
- *"monochrome"* - when colours are not available (e.g. black and white printed
  media): a completely black or white version of the logo can also be used.
- *"banner"* mode: the symbol and text can be used alongside depending on the
  available space.

The following image illustrate these alternatives:

.. image:: images/logo-demo.svg
   :align: center

Please refer to the SVG files in the `setuptools repository`_ for the specific
shapes and proportions between the elements of the design.


Working with the Design
=======================

The `setuptools repository`_ contains a series of vector representations of the
design under the ``docs/images`` directory. These representations can be
manipulated via any graphic editor that support SVG files,
however the free and open-source software Inkscape_ is recommended for maximum
compatibility.

When selecting the right file to work with, file names including
``editable-inkscape`` indicate "more editable" elements (e.g. editable text),
while the others prioritise SVG paths for maximum reproducibility.

Also notice that you might have to `install the correct fonts`_ to be able to
visualise or edit some of the designs.


Inspiration
===========

This design was inspired by :user:`cajhne`'s `original proposal`_ and the
ancient symbol of the ouroboros_.
It features a snake moving in a circular trajectory not only as a reference to
the Python programming language but also to the :pep:`wheel package format <427>` as one
of the distribution formats supported by setuptools.
The shape of the snake also resembles a cog, which together with the hammer is
a nod to the two words that compose the name of the project.


License
=======


This logo, design variations or a modified version may be used by anyone to
refer to setuptools, but does not indicate endorsement by the project.

Redistribution, usage and derivative works are permitted under the same license
used by the setuptools software (MIT):

.. code-block:: text

   Copyright (c) Anderson Bravalheri

   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.

   THE USAGE OF THIS LOGO AND ARTWORK DOES NOT INDICATE ENDORSEMENT BY THE
   SETUPTOOLS PROJECT.

Whenever possible, please make the image a link to
https://github.com/pypa/setuptools or https://setuptools.pypa.io.


.. _Anderson Bravalheri: https://github.com/abravalheri
.. _Inkscape: https://inkscape.org
.. _setuptools repository: https://github.com/pypa/setuptools
.. _install the correct fonts: https://wiki.inkscape.org/wiki/Installing_fonts
.. _original proposal: https://github.com/pypa/setuptools/issues/2227#issuecomment-653628344
.. _ouroboros: https://en.wikipedia.org/wiki/Ouroboros
PK"[�u,�0doc/alt-python312-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 allow for arbitrary execution, it
is difficult to provide a reliable user experience across environments
and history.

:pep:`517` came to
the rescue and specified a new standard for packaging and distributing Python
modules. Under PEP 517:

    A ``pyproject.toml`` file is used to specify which program to use
    to generate the distribution.

    Two functions provided by the program, ``build_wheel(directory: str)``
    and ``build_sdist(directory: str)``, create the distribution bundle in the
    specified ``directory``.

    The program may use its own configuration file or extend the ``.toml`` file.

    The actual installation is done with ``pip install *.whl`` or
    ``pip install *.tar.gz``. If ``*.whl`` is available, ``pip`` will go ahead and copy
    its files into the ``site-packages`` directory. If not, ``pip`` will look at
    ``pyproject.toml`` and decide which program to use to 'build from source'.
    (Note that if there is no ``pyproject.toml`` file or the ``build-backend``
    parameter is not defined, then the fall-back behaviour is to use ``setuptools``.)

With this standard, switching between packaging tools is a lot easier.

How to use it?
--------------

Start with a package that you want to distribute. You will need your source
files, a ``pyproject.toml`` file and a ``setup.cfg`` file::

    ~/meowpkg/
        pyproject.toml
        setup.cfg
        meowpkg/
            __init__.py
            module.py

The ``pyproject.toml`` file specifies 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"]
    build-backend = "setuptools.build_meta"

``build_meta`` implements ``setuptools``' build system support.
The ``setuptools`` package implements the ``build_sdist``
command and the ``wheel`` package implements the ``build_wheel``
command; the latter is a dependency of the former
exposed via :pep:`517` hooks.

Use ``setuptools``' :ref:`declarative config <declarative config>` to
specify the package information in ``setup.cfg``::

    [metadata]
    name = meowpkg
    version = 0.0.1
    description = a package that meows

    [options]
    packages = find:

.. _building:

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


.. _backend-wrapper:

Dynamic build dependencies and other ``build_meta`` tweaks
----------------------------------------------------------

With the changes introduced by :pep:`517` and :pep:`518`, the
``setup_requires`` configuration field was deprecated in ``setup.cfg`` and
``setup.py``, in favour of directly listing build dependencies in the
``requires`` field of the ``build-system`` table of ``pyproject.toml``.
This approach has a series of advantages and gives package managers and
installers the ability to inspect the build requirements in advance and
perform a series of optimisations.

However, some package authors might still need to dynamically inspect the final
user's machine before deciding these requirements. One way of doing that, as
specified by :pep:`517`, is to "tweak" ``setuptools.build_meta`` by using an
:pep:`in-tree backend <517#in-tree-build-backends>`.

.. tip:: Before implementing an *in-tree* backend, have a look at
   :pep:`PEP 508 <508#environment-markers>`. Most of the time, dependencies
   with **environment markers** are enough to differentiate operating systems
   and platforms.

If you put the following configuration in your ``pyproject.toml``:

.. code-block:: toml

    [build-system]
    requires = ["setuptools"]
    build-backend = "backend"
    backend-path = ["_custom_build"]


then you can implement a thin wrapper around ``build_meta`` in
the ``_custom_build/backend.py`` file, as shown in the following example:

.. code-block:: python

    from setuptools import build_meta as _orig
    from setuptools.build_meta import *


    def get_requires_for_build_wheel(config_settings=None):
        return _orig.get_requires_for_build_wheel(config_settings) + [...]


    def get_requires_for_build_sdist(config_settings=None):
        return _orig.get_requires_for_build_sdist(config_settings) + [...]


.. note::

   You can override any of the functions specified in :pep:`PEP 517
   <517#build-backend-interface>`, not only the ones responsible for gathering
   requirements. It is important to ``import *`` so that the hooks that you
   choose not to reimplement would be inherited from the setuptools' backend
   automatically. This will also cover hooks that might be added in the future
   like the ones that :pep:`660` declares.


.. important:: Make sure your backend script is included in the :doc:`source
   distribution </userguide/distribution>`, otherwise the build will fail.
   This can be done by using a SCM_/VCS_ plugin (like :pypi:`setuptools-scm`
   and :pypi:`setuptools-svn`), or by correctly setting up :ref:`MANIFEST.in
   <manifest>`.

   The generated ``.tar.gz`` and ``.whl`` files are compressed archives that
   can be inspected as follows:
   On POSIX systems, this can be done with ``tar -tf dist/*.tar.gz``
   and ``unzip -l dist/*.whl``.
   On Windows systems, you can rename the ``.whl`` to ``.zip`` to be able to
   inspect it from File Explorer. You can also use the above ``tar`` command in a
   command prompt to inspect the ``.tar.gz`` file. Alternatively, there are GUI programs
   like `7-zip`_ that handle ``.tar.gz`` and ``.whl`` files.

   In general, the backend script should be present in the ``.tar.gz`` (so the
   project can be built from the source) but not in the ``.whl`` (otherwise the
   backend script would end up being distributed alongside your package).
   See ":doc:`/userguide/package_discovery`" for more details about package
   files.


.. _SCM: https://en.wikipedia.org/wiki/Software_configuration_management
.. _VCS: https://en.wikipedia.org/wiki/Version_control
.. _7-zip: https://www.7-zip.org
PK"[�rE��:doc/alt-python312-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"[������Adoc/alt-python312-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
`GitHub Discussions <https://github.com/pypa/setuptools/discussions>`_,
or the issue tracker (for specific issues).

Discussions about development happen on GitHub Discussions or
the ``setuptools`` channel on `PyPA Discord <https://discord.com/invite/pypa>`_.

-----------------
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:: ../../newsfragments/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: https://www.sphinx-doc.org/en/master/
.. _published documentation: https://setuptools.pypa.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``.

All the dependencies specified in these files are "vendorized" using a
simple Python script ``tools/vendor.py``.

To refresh the dependencies, run the following command::

    $ tox -e vendor
PK"[$dگ�7doc/alt-python312-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"[�0�C9C9@doc/alt-python312-setuptools/docs/userguide/pyproject_config.rstnu�[���.. _pyproject.toml config:

-----------------------------------------------------
Configuring setuptools using ``pyproject.toml`` files
-----------------------------------------------------

.. note:: New in 61.0.0

.. important::
   If compatibility with legacy builds or versions of tools that don't support
   certain packaging standards (e.g. :pep:`517` or :pep:`660`), a simple ``setup.py``
   script can be added to your project [#setupcfg-caveats]_
   (while keeping the configuration in ``pyproject.toml``):

   .. code-block:: python

       from setuptools import setup

       setup()

Starting with :pep:`621`, the Python community selected ``pyproject.toml`` as
a standard way of specifying *project metadata*.
``Setuptools`` has adopted this standard and will use the information contained
in this file as an input in the build process.

The example below illustrates how to write a ``pyproject.toml`` file that can
be used with ``setuptools``. It contains two TOML tables (identified by the
``[table-header]`` syntax): ``build-system`` and ``project``.
The ``build-system`` table is used to tell the build frontend (e.g.
:pypi:`build` or :pypi:`pip`) to use ``setuptools`` and any other plugins (e.g.
``setuptools-scm``) to build the package.
The ``project`` table contains metadata fields as described by the
:doc:`PyPUG:guides/writing-pyproject-toml` guide.

.. _example-pyproject-config:

.. code-block:: toml

   [build-system]
   requires = ["setuptools", "setuptools-scm"]
   build-backend = "setuptools.build_meta"

   [project]
   name = "my_package"
   authors = [
       {name = "Josiah Carberry", email = "josiah_carberry@brown.edu"},
   ]
   description = "My package description"
   readme = "README.rst"
   requires-python = ">=3.7"
   keywords = ["one", "two"]
   license = {text = "BSD-3-Clause"}
   classifiers = [
       "Framework :: Django",
       "Programming Language :: Python :: 3",
   ]
   dependencies = [
       "requests",
       'importlib-metadata; python_version<"3.8"',
   ]
   dynamic = ["version"]

   [project.optional-dependencies]
   pdf = ["ReportLab>=1.2", "RXP"]
   rest = ["docutils>=0.3", "pack ==1.1, ==1.3"]

   [project.scripts]
   my-script = "my_package.module:function"

   # ... other project metadata fields as listed in:
   #     https://packaging.python.org/en/latest/guides/writing-pyproject-toml/

.. _setuptools-table:

Setuptools-specific configuration
=================================

While the standard ``project`` table in the ``pyproject.toml`` file covers most
of the metadata used during the packaging process, there are still some
``setuptools``-specific configurations that can be set by users that require
customization.
These configurations are completely optional and probably can be skipped when
creating simple packages.
They are equivalent to the :doc:`/references/keywords` used by the ``setup.py``
file, and can be set via the ``tool.setuptools`` table:

========================= =========================== =========================
Key                       Value Type (TOML)           Notes
========================= =========================== =========================
``py-modules``            array                       See tip below.
``packages``              array or ``find`` directive See tip below.
``package-dir``           table/inline-table          Used when explicitly/manually listing ``packages``.
------------------------- --------------------------- -------------------------
``package-data``          table/inline-table          See :doc:`/userguide/datafiles`.
``include-package-data``  boolean                     ``True`` by default (only when using ``pyproject.toml`` project metadata/config).
                                                      See :doc:`/userguide/datafiles`.
``exclude-package-data``  table/inline-table          Empty by default. See :doc:`/userguide/datafiles`.
------------------------- --------------------------- -------------------------
``license-files``         array of glob patterns      **Provisional** - likely to change with :pep:`639`
                                                      (by default: ``['LICEN[CS]E*', 'COPYING*', 'NOTICE*', 'AUTHORS*']``)
``data-files``            table/inline-table          **Discouraged** - check :doc:`/userguide/datafiles`.
                                                      Whenever possible, consider using data files inside the package directories.
``script-files``          array                       **Discouraged** - equivalent to the ``script`` keyword in ``setup.py``.
                                                      Whenever possible, please use ``project.scripts`` instead.
------------------------- --------------------------- -------------------------
``provides``              array                       *ignored by pip when installing packages*
``obsoletes``             array                       *ignored by pip when installing packages*
``platforms``             array                       Sets the ``Platform`` :doc:`core-metadata <PyPUG:specifications/core-metadata>` field
                                                      (*ignored by pip when installing packages*).
------------------------- --------------------------- -------------------------
``zip-safe``              boolean                     **Obsolete** - only relevant for ``pkg_resources``, ``easy_install`` and ``setup.py install``
                                                      in the context of :doc:`eggs </deprecated/python_eggs>` (deprecated).
``eager-resources``       array                       **Obsolete** - only relevant for ``pkg_resources``, ``easy_install`` and ``setup.py install``
                                                      in the context of :doc:`eggs </deprecated/python_eggs>` (deprecated).
``namespace-packages``    array                       **Deprecated** - use implicit namespaces instead (:pep:`420`).
========================= =========================== =========================

.. note::
   The `TOML value types`_ ``array`` and ``table/inline-table`` are roughly
   equivalent to the Python's :obj:`list` and :obj:`dict` data types, respectively.

Please note that some of these configurations are deprecated, obsolete or at least
discouraged, but they are made available to ensure portability.
Deprecated and obsolete configurations may be removed in future versions of ``setuptools``.
New packages should avoid relying on discouraged fields if possible, and
existing packages should consider migrating to alternatives.

.. tip::
   When both ``py-modules`` and ``packages`` are left unspecified,
   ``setuptools`` will attempt to perform :ref:`auto-discovery`, which should
   cover most popular project directory organization techniques, such as the
   :ref:`src-layout` and the :ref:`flat-layout`.

   However if your project does not follow these conventional layouts
   (e.g. you want to use a ``flat-layout`` but at the same time have custom
   directories at the root of your project), you might need to use the ``find``
   directive [#directives]_ as shown below:

   .. code-block:: toml

      [tool.setuptools.packages.find]
      where = ["src"]  # list of folders that contain the packages (["."] by default)
      include = ["my_package*"]  # package names should match these glob patterns (["*"] by default)
      exclude = ["my_package.tests*"]  # exclude packages matching these glob patterns (empty by default)
      namespaces = false  # to disable scanning PEP 420 namespaces (true by default)

   Note that the glob patterns in the example above need to be matched
   by the **entire** package name. This means that if you specify ``exclude = ["tests"]``,
   modules like ``tests.my_package.test1`` will still be included in the distribution
   (to remove them, add a wildcard to the end of the pattern: ``"tests*"``).

   Alternatively, you can explicitly list the packages in modules:

   .. code-block:: toml

      [tool.setuptools]
      packages = ["my_package"]

   If you want to publish a distribution that does not include any Python module
   (e.g. a "meta-distribution" that just aggregate dependencies), please
   consider something like the following:

   .. code-block:: toml

      [tool.setuptools]
      packages = []


.. _dynamic-pyproject-config:

Dynamic Metadata
================

Note that in the first example of this page we use ``dynamic`` to identify
which metadata fields are dynamically computed during the build by either
``setuptools`` itself or the plugins installed via ``build-system.requires``
(e.g. ``setuptools-scm`` is capable of deriving the current project version
directly from the ``git`` :wiki:`version control` system).

Currently the following fields can be listed as dynamic: ``version``,
``classifiers``, ``description``, ``entry-points``, ``scripts``,
``gui-scripts`` and ``readme``.
When these fields are expected to be provided by ``setuptools`` a
corresponding entry is required in the ``tool.setuptools.dynamic`` table
[#entry-points]_. For example:

.. code-block:: toml

   # ...
   [project]
   name = "my_package"
   dynamic = ["version", "readme"]
   # ...
   [tool.setuptools.dynamic]
   version = {attr = "my_package.VERSION"}
   readme = {file = ["README.rst", "USAGE.rst"]}

In the ``dynamic`` table, the ``attr`` directive [#directives]_ will read an
attribute from the given module [#attr]_, while ``file`` will read the contents
of all given files and concatenate them in a single string.

========================== =================== =================================================================================================
Key                        Directive           Notes
========================== =================== =================================================================================================
``version``                ``attr``, ``file``
``readme``                 ``file``            Here you can also set ``"content-type"``:

                                               ``readme = {file = ["README.txt", "USAGE.txt"], content-type = "text/plain"}``

                                               If ``content-type`` is not given, ``"text/x-rst"`` is used by default.
``description``            ``file``            One-line text (no line breaks)
``classifiers``            ``file``            Multi-line text with one classifier per line
``entry-points``           ``file``            INI format following :doc:`PyPUG:specifications/entry-points`
                                               (``console_scripts`` and ``gui_scripts`` can be included)
``dependencies``           ``file``            *subset* of the ``requirements.txt`` format
                                               (``#`` comments and blank lines excluded) **BETA**
``optional-dependencies``  ``file``            *subset* of the ``requirements.txt`` format per group
                                               (``#`` comments and blank lines excluded) **BETA**
========================== =================== =================================================================================================

Supporting ``file`` for dependencies is meant for a convenience for packaging
applications with possibly strictly versioned dependencies.

Library packagers are discouraged from using overly strict (or "locked")
dependency versions in their ``dependencies`` and ``optional-dependencies``.

Currently, when specifying ``optional-dependencies`` dynamically, all of the groups
must be specified dynamically; one can not specify some of them statically and
some of them dynamically.

Also note that the file format for specifying dependencies resembles a ``requirements.txt`` file,
however please keep in mind that all non-comment lines must conform with :pep:`508`
(``pip``-specify syntaxes, e.g. ``-c/-r/-e`` flags, are not supported).


.. note::
   If you are using an old version of ``setuptools``, you might need to ensure
   that all files referenced by the ``file`` directive are included in the ``sdist``
   (you can do that via ``MANIFEST.in`` or using plugins such as ``setuptools-scm``,
   please have a look on :doc:`/userguide/miscellaneous` for more information).

   .. versionchanged:: 66.1.0
      Newer versions of ``setuptools`` will automatically add these files to the ``sdist``.

It is advisable to use literal values together with ``attr`` (e.g. ``str``,
``tuple[str]``, see :func:`ast.literal_eval`). This is recommend
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,
using :func:`importlib.util.spec_from_file_location` recommended recipe
(see :ref:`example on Python docs <python:importlib-examples>`
about "Importing a source file directly").
Note however that importing the module is error prone since your package is
not installed yet. You may also need to manually add the project directory to
``sys.path`` (via ``setup.py``) in order to be able to do that.

----

.. rubric:: Notes

.. [#setupcfg-caveats] ``pip`` may allow editable install only with ``pyproject.toml``
   and ``setup.cfg``. However, this behavior may not be consistent over various ``pip``
   versions and other packaging-related tools
   (``setup.py`` is more reliable on those scenarios).

.. [#entry-points] Dynamic ``scripts`` and ``gui-scripts`` are a special case.
   When resolving these metadata keys, ``setuptools`` will look for
   ``tool.setuptools.dynamic.entry-points``, and use the values of the
   ``console_scripts`` and ``gui_scripts`` :doc:`entry-point groups
   <PyPUG:specifications/entry-points>`.

.. [#directives] In the context of this document, *directives* are special TOML
   values that are interpreted differently by ``setuptools`` (usually triggering an
   associated function). Most of the times they correspond to a special TOML table
   (or inline-table) with a single top-level key.
   For example, you can have the ``{find = {where = ["src"], exclude=["tests*"]}}``
   directive for ``tool.setuptools.packages``, or ``{attr = "mymodule.attr"}``
   directive for ``tool.setuptools.dynamic.version``.

.. [#attr] ``attr`` is meant to be used when the module attribute is statically
   specified (e.g. as a string, list or tuple). As a rule of thumb, the
   attribute should be able to be parsed with :func:`ast.literal_eval`, and
   should not be modified or re-assigned.

.. _TOML value types: https://toml.io/en/v1.0.0
PK"[L���P5P5Bdoc/alt-python312-setuptools/docs/userguide/declarative_config.rstnu�[���.. _declarative config:

------------------------------------------------
Configuring setuptools 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: my_package.VERSION
    author = Josiah Carberry
    author_email = josiah_carberry@brown.edu
    description = My package description
    long_description = file: README.rst, CHANGELOG.rst, LICENSE.rst
    keywords = one, two
    license = BSD-3-Clause
    classifiers =
        Framework :: Django
        Programming Language :: Python :: 3

    [options]
    zip_safe = False
    include_package_data = True
    packages = find:
    python_requires = >=3.7
    install_requires =
        requests
        importlib-metadata; python_version<"3.8"

    [options.package_data]
    * = *.txt, *.rst
    hello = *.msg

    [options.entry_points]
    console_scripts =
        executable-name = my_package.module:function

    [options.extras_require]
    pdf = ReportLab>=1.2; RXP
    rest = docutils>=0.3; pack ==1.1, ==1.3

    [options.packages.find]
    exclude =
        examples*
        tools*
        docs*
        my_package.tests*

Metadata and options are set in the config sections of the same name.

* Keys are the same as the :doc:`keyword arguments </references/keywords>` 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 configuration has all the Python 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, using :ref:`package_dir <keyword/package_dir>`, 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

In this example, the value for the :ref:`package_dir <keyword/package_dir>`
configuration (i.e. ``=src``) is parsed as ``{"": "src"}``.
The ``""`` key has a special meaning in this context, and indicates that all the
packages are contained inside the given directory.
Also note that the value for ``[options.packages.find] where`` matches the
value associated with ``""`` in the ``package_dir`` dictionary.

..
   TODO: Add the following tip once the auto-discovery is no longer experimental:

   Starting in version 61, ``setuptools`` can automatically infer the
   configurations for both ``packages`` and ``package_dir`` for projects using
   a ``src/`` layout (as long as no value is specified for ``py_modules``).
   Please see :doc:`package discovery </userguide/package_discovery>` for more
   details.

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 each entry corresponds to a key/value pair,
  with keys separated from values by ``=``.
  If an entry starts with ``=``, the key is assumed to be an empty string
  (e.g. ``=src`` is parsed as ``{"": "src"}``).
* ``section`` - values are read from a dedicated (sub)section


Special directives:

* ``attr:`` - Value is read from a module attribute.

  It is advisable to use literal values together with ``attr:`` (e.g. ``str``,
  ``tuple[str]``, see :func:`ast.literal_eval`). This is recommend
  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,
  using :func:`importlib.util.spec_from_file_location` recommended recipe
  (see :ref:`example on Python docs <python:importlib-examples>`
  about "Importing a source file directly").
  Note however that importing the module is error prone since your package is
  not installed yet. You may also need to manually add the project directory to
  ``sys.path`` (via ``setup.py``) in order to be able to do that.

  When the module is imported, ``attr:`` supports
  callables and iterables; unsupported types are cast using ``str()``.


* ``file:`` - Value is read from a list of files and then concatenated

  .. important::
      The ``file:`` directive is sandboxed and won't reach anything outside the
      project directory (i.e. the directory containing ``setup.cfg``/``pyproject.toml``).

  .. note::
      If you are using an old version of ``setuptools``, you might need to ensure
      that all files referenced by the ``file:`` directive are included in the ``sdist``
      (you can do that via ``MANIFEST.in`` or using plugins such as ``setuptools-scm``,
      please have a look on :doc:`/userguide/miscellaneous` for more information).

      .. versionchanged:: 66.1.0
         Newer versions of ``setuptools`` will automatically add these files to the ``sdist``.


Metadata
--------

.. attention::
    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         file:, list-semi                                     **BETA** [#opt-2]_, [#opt-6]_
extras_require           file:, section                                       **BETA** [#opt-2]_, [#opt-6]_
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                                           [#opt-5]_
py_modules               list-comma                           34.4.0
data_files               section                              40.6.0          [#opt-4]_
=======================  ===================================  =============== ====================

**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 ``install_requires`` and ``extras_require``, values are parsed as ``list-semi``.
   This implies that in order to include markers, each requirement **must** be *dangling*
   in a new line:

   .. code-block:: ini

      [options]
      install_requires =
          importlib-metadata; python_version<"3.8"

      [options.extras_require]
      all =
          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.

.. [#opt-4] ``data_files`` is deprecated and should be avoided.
   Please check :doc:`/userguide/datafiles` for more information.

.. [#opt-5] ``namespace_packages`` is deprecated in favour of native/implicit
   namespaces (:pep:`420`). Check :doc:`the Python Packaging User Guide
   <PyPUG:guides/packaging-namespace-packages>` for more information.

.. [#opt-6] ``file:`` directives for reading requirements are supported since version 62.6.
   The format for the file resembles a ``requirements.txt`` file,
   however please keep in mind that all non-comment lines must conform with :pep:`508`
   (``pip``-specify syntaxes, e.g. ``-c/-r/-e`` flags, are not supported).
   Library developers should avoid tightly pinning their dependencies to a specific
   version (e.g. via a "locked" requirements file).


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"[��A�/�/@doc/alt-python312-setuptools/docs/userguide/development_mode.rstnu�[���Development Mode (a.k.a. "Editable Installs")
=============================================

When creating a Python project, developers usually want to implement and test
changes iteratively, before cutting a release and preparing a distribution archive.

In normal circumstances this can be quite cumbersome and require the developers
to manipulate the ``PYTHONPATH`` environment variable or to continuously re-build
and re-install the project.

To facilitate iterative exploration and experimentation, setuptools allows
users to instruct the Python interpreter and its import machinery to load the
code under development directly from the project folder without having to
copy the files to a different location in the disk.
This means that changes in the Python source code can immediately take place
without requiring a new installation.

You can enter this "development mode" by performing an :doc:`editable installation
<pip:topics/local-project-installs>` inside of a :term:`virtual environment`,
using :doc:`pip's <pip:cli/pip_install>` ``-e/--editable`` flag, as shown below:

.. code-block:: bash

   $ cd your-python-project
   $ python -m venv .venv
   # Activate your environment with:
   #      `source .venv/bin/activate` on Unix/macOS
   # or   `.venv\Scripts\activate` on Windows

   $ pip install --editable .

   # Now you have access to your package
   # as if it was installed in .venv
   $ python -c "import your_python_project"


An "editable installation" works very similarly to a regular install with
``pip install .``, except that it only installs your package dependencies,
metadata and wrappers for :ref:`console and GUI scripts <console-scripts>`.
Under the hood, setuptools will try to create a special :mod:`.pth file <site>`
in the target directory (usually ``site-packages``) that extends the
``PYTHONPATH`` or install a custom :doc:`import hook <python:reference/import>`.

When you're done with a given development task, you can simply uninstall your
package (as you would normally do with ``pip uninstall <package name>``).

Please note that, by default an editable install will expose at least all the
files that would be available in a regular installation. However, depending on
the file and directory organization in your project, it might also expose
as a side effect files that would not be normally available.
This is allowed so you can iteratively create new Python modules.
Please have a look on the following section if you are looking for a different behaviour.

.. admonition:: Virtual Environments

   You can think about virtual environments as "isolated Python runtime deployments"
   that allow users to install different sets of libraries and tools without
   messing with the global behaviour of the system.

   They are a safe way of testing new projects and can be created easily
   with the :mod:`venv` module from the standard library.

   Please note however that depending on your operating system or distribution,
   ``venv`` might not come installed by default with Python. For those cases,
   you might need to use the OS package manager to install it.
   For example, in Debian/Ubuntu-based systems you can obtain it via:

   .. code-block:: bash

       sudo apt install python3-venv

   Alternatively, you can also try installing :pypi:`virtualenv`.
   More information is available on the Python Packaging User Guide on
   :doc:`PyPUG:guides/installing-using-pip-and-virtual-environments`.

.. note::
    .. versionchanged:: v64.0.0
       Editable installation hooks implemented according to :pep:`660`.
       Support for :pep:`namespace packages <420>` is still **EXPERIMENTAL**.


"Strict" editable installs
--------------------------

When thinking about editable installations, users might have the following
expectations:

1. It should allow developers to add new files (or split/rename existing ones)
   and have them automatically exposed.
2. It should behave as close as possible to a regular installation and help
   users to detect problems (e.g. new files not being included in the distribution).

Unfortunately these expectations are in conflict with each other.
To solve this problem ``setuptools`` allows developers to choose a more
*"strict"* mode for the editable installation. This can be done by passing
a special *configuration setting* via :pypi:`pip`, as indicated below:

.. code-block:: bash

    pip install -e . --config-settings editable_mode=strict

In this mode, new files **won't** be exposed and the editable installs will
try to mimic as much as possible the behavior of a regular install.
Under the hood, ``setuptools`` will create a tree of file links in an auxiliary
directory (``$your_project_dir/build``) and add it to ``PYTHONPATH`` via a
:mod:`.pth file <site>`. (Please be careful to not delete this repository
by mistake otherwise your files may stop being accessible).

.. warning::
   Strict editable installs require auxiliary files to be placed in a
   ``build/__editable__.*`` directory (relative to your project root).

   Please be careful to not remove this directory while testing your project,
   otherwise your editable installation may be compromised.

   You can remove the ``build/__editable__.*`` directory after uninstalling.


.. note::
    .. versionadded:: v64.0.0
       Added new *strict* mode for editable installations.
       The exact details of how this mode is implemented may vary.


Limitations
-----------

- The *editable* term is used to refer only to Python modules
  inside the package directories. Non-Python files, external (data) files,
  executable script files, binary extensions, headers and metadata may be
  exposed as a *snapshot* of the version they were at the moment of the
  installation.
- Adding new dependencies, entry-points or changing your project's metadata
  require a fresh "editable" re-installation.
- Console scripts and GUI scripts **MUST** be specified via :doc:`entry-points
  </userguide/entry_point>` to work properly.
- *Strict* editable installs require the file system to support
  either :wiki:`symbolic <symbolic link>` or :wiki:`hard links <hard link>`.
  This installation mode might also generate auxiliary files under the project directory.
- There is *no guarantee* that the editable installation will be performed
  using a specific technique. Depending on each project, ``setuptools`` may
  select a different approach to ensure the package is importable at runtime.
- There is *no guarantee* that files outside the top-level package directory
  will be accessible after an editable install.
- There is *no guarantee* that attributes like ``__path__`` or ``__file__``
  will correspond to the exact location of the original files (e.g.,
  ``setuptools`` might employ file links to perform the editable installation).
  Users are encouraged to use tools like :mod:`importlib.resources` or
  :mod:`importlib.metadata` when trying to access package files directly.
- Editable installations may not work with
  :doc:`namespaces created with pkgutil or pkg_resources
  <PyPUG:guides/packaging-namespace-packages>`.
  Please use :pep:`420`-style implicit namespaces [#namespaces]_.
- Support for :pep:`420`-style implicit namespace packages for
  projects structured using :ref:`flat-layout` is still **experimental**.
  If you experience problems, you can try converting your package structure
  to the :ref:`src-layout`.
- File system entries in the current working directory
  whose names coincidentally match installed packages
  may take precedence in :doc:`Python's import system <python:reference/import>`.
  Users are encouraged to avoid such scenarios [#cwd]_.
- Setuptools will try to give the right precedence to modules in an editable install.
  However this is not always an easy task. If you have a particular order in
  ``sys.path`` or some specific import precedence that needs to be respected,
  the editable installation as supported by Setuptools might not be able to
  fulfil this requirement, and therefore it might not be the right tool for your use case.

.. attention::
   Editable installs are **not a perfect replacement for regular installs**
   in a test environment. When in doubt, please test your projects as
   installed via a regular wheel. There are tools in the Python ecosystem,
   like :pypi:`tox` or :pypi:`nox`, that can help you with that
   (when used with appropriate configuration).


Legacy Behavior
---------------

If your project is not compatible with the new "editable installs" or you wish
to replicate the legacy behavior, for the time being you can also perform the
installation in the ``compat`` mode:

.. code-block:: bash

    pip install -e . --config-settings editable_mode=compat

This installation mode will try to emulate how ``python setup.py develop``
works (still within the context of :pep:`660`).

.. warning::
   The ``compat`` mode is *transitional* and will be removed in
   future versions of ``setuptools``, it exists only to help during the
   migration period.
   Also note that support for this mode is limited:
   it is safe to assume that the ``compat`` mode is offered "as is", and
   improvements are unlikely to be implemented.
   Users are encouraged to try out the new editable installation techniques
   and make the necessary adaptations.

.. note::
   Newer versions of ``pip`` no longer run the fallback command
   ``python setup.py develop`` when the ``pyproject.toml`` file is present.
   This means that setting the environment variable
   ``SETUPTOOLS_ENABLE_FEATURES="legacy-editable"``
   will have no effect when installing a package with ``pip``.


How editable installations work
-------------------------------

*Advanced topic*

There are many techniques that can be used to expose packages under development
in such a way that they are available as if they were installed.
Depending on the project file structure and the selected mode, ``setuptools``
will choose one of these approaches for the editable installation [#criteria]_.

A non-exhaustive list of implementation mechanisms is presented below.
More information is available on the text of :pep:`PEP 660 <660#what-to-put-in-the-wheel>`.

- A static ``.pth`` file [#static_pth]_ can be added to one of the directories
  listed in :func:`site.getsitepackages` or :func:`site.getusersitepackages` to
  extend :obj:`sys.path`.
- A directory containing a *farm of file links* that mimic the
  project structure and point to the original files can be employed.
  This directory can then be added to :obj:`sys.path` using a static ``.pth`` file.
- A dynamic ``.pth`` file [#dynamic_pth]_ can also be used to install an
  "import :term:`finder`" (:obj:`~importlib.abc.MetaPathFinder` or
  :obj:`~importlib.abc.PathEntryFinder`) that will hook into Python's
  :doc:`import system <python:reference/import>` machinery.

.. attention::
   ``Setuptools`` offers **no guarantee** of which technique will be used to
   perform an editable installation. This will vary from project to project
   and may change depending on the specific version of ``setuptools`` being
   used.


----

.. rubric:: Notes

.. [#namespaces]
   You *may* be able to use *strict* editable installations with namespace
   packages created with ``pkgutil`` or ``pkg_namespaces``, however this is not
   officially supported.

.. [#cwd]
   Techniques like the :ref:`src-layout` or tooling-specific options like
   `tox's changedir <https://tox.wiki/en/stable/config.html#conf-changedir>`_
   can be used to prevent such kinds of situations (checkout `this blog post
   <https://blog.ganssle.io/articles/2019/08/test-as-installed.html>`_ for more
   insights).

.. [#criteria]
   ``setuptools`` strives to find a balance between allowing the user to see
   the effects of project files being edited while still trying to keep the
   editable installation as similar as possible to a regular installation.

.. [#static_pth]
   i.e., a ``.pth`` file where each line correspond to a path that should be
   added to :obj:`sys.path`. See :mod:`Site-specific configuration hook <site>`.

.. [#dynamic_pth]
   i.e., a ``.pth`` file that starts where each line starts with an ``import``
   statement and executes arbitrary Python code. See :mod:`Site-specific
   configuration hook <site>`.
PK"[@SRϻG�G;doc/alt-python312-setuptools/docs/userguide/entry_point.rstnu�[���.. _`entry_points`:

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

Entry points are a type of metadata that can be exposed by packages on installation.
They are a very useful feature of the Python ecosystem,
and come specially handy in two scenarios:

1. The package would like to provide commands to be run at the terminal.
This functionality is known as *console* scripts. The command may also
open up a GUI, in which case it is known as a *GUI* script. An example
of a console script is the one provided by the :pypi:`pip` package, which
allows you to run commands like ``pip install`` in the terminal.

2. A package would like to enable customization of its functionalities
via *plugins*. For example, the test framework :pypi:`pytest` allows
customization via the ``pytest11`` entry point, and the syntax
highlighting tool :pypi:`pygments` allows specifying additional styles
using the entry point ``pygments.styles``.


.. _console-scripts:

Console Scripts
===============

Let us start with console scripts.
First consider an example without entry points. Imagine a package
defined thus::

    project_root_directory
    ├── pyproject.toml        # and/or setup.cfg, setup.py
    └── src
        └── timmins
            ├── __init__.py
            └── ...

with ``__init__.py`` as:

.. code-block:: python

    def hello_world():
        print("Hello world")

Now, suppose that we would like to provide some way of executing the
function ``hello_world()`` from the command-line. One way to do this
is to create a file ``src/timmins/__main__.py`` providing a hook as
follows:

.. code-block:: python

    from . import hello_world

    if __name__ == '__main__':
        hello_world()

Then, after installing the package ``timmins``, we may invoke the ``hello_world()``
function as follows, through the `runpy <https://docs.python.org/3/library/runpy.html>`_
module:

.. code-block:: bash

    $ python -m timmins
    Hello world

Instead of this approach using ``__main__.py``, you can also create a
user-friendly CLI executable that can be called directly without ``python -m``.
In the above example, to create a command ``hello-world`` that invokes
``timmins.hello_world``, add a console script entry point to your
configuration:

.. tab:: pyproject.toml

   .. code-block:: toml

        [project.scripts]
        hello-world = "timmins:hello_world"

.. tab:: setup.cfg

    .. code-block:: ini

        [options.entry_points]
        console_scripts =
            hello-world = timmins:hello_world

.. tab:: setup.py

    .. code-block:: python

        from setuptools import setup

        setup(
            # ...,
            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:

.. code-block:: bash

   $ hello-world
   Hello world

Note that any function used as a console script, i.e. ``hello_world()`` in
this example, should not accept any arguments. If your function requires any input
from the user, you can use regular command-line argument parsing utilities like
:mod:`argparse` within the body of
the function to parse user input given via :obj:`sys.argv`.

You may have noticed that we have used a special syntax to specify the function
that must be invoked by the console script, i.e. we have written ``timmins:hello_world``
with a colon ``:`` separating the package name and the function name. The full
specification of this syntax is discussed in the `last section <#entry-points-syntax>`_
of this document, and this can be used to specify a function located anywhere in
your package, not just in ``__init__.py``.

GUI Scripts
===========

In addition to ``console_scripts``, Setuptools supports ``gui_scripts``, which
will launch a GUI application without running in a terminal window.

For example, if we have a project with the same directory structure as before,
with an ``__init__.py`` file containing the following:

.. code-block:: python

    import PySimpleGUI as sg

    def hello_world():
        sg.Window(title="Hello world", layout=[[]], margins=(100, 50)).read()

Then, we can add a GUI script entry point:

.. tab:: pyproject.toml

   .. code-block:: toml

        [project.gui-scripts]
        hello-world = "timmins:hello_world"

.. tab:: setup.cfg

    .. code-block:: ini

        [options.entry_points]
        gui_scripts =
            hello-world = timmins:hello_world

.. tab:: setup.py

    .. code-block:: python

        from setuptools import setup

        setup(
            # ...,
            entry_points={
                'gui_scripts': [
                    'hello-world = timmins:hello_world',
                ]
            }
        )

.. note::
   To be able to import ``PySimpleGUI``, you need to add ``pysimplegui`` to your package dependencies.
   See :doc:`/userguide/dependency_management` for more information.

Now, running:

.. code-block:: bash

   $ hello-world

will open a small application window with the title 'Hello world'.

Note that just as with console scripts, any function used as a GUI script
should not accept any arguments, and any user input can be parsed within the
body of the function. GUI scripts also use the same syntax (discussed in the
`last section <#entry-points-syntax>`_) for specifying the function to be invoked.

.. note::

    The difference between ``console_scripts`` and ``gui_scripts`` only affects
    Windows systems. [#use_for_scripts]_ ``console_scripts`` are wrapped in a console
    executable, so they are attached to a console and can use ``sys.stdin``,
    ``sys.stdout`` and ``sys.stderr`` for input and output. ``gui_scripts`` are
    wrapped in a GUI executable, so they can be started without a console, but
    cannot use standard streams unless application code redirects them. Other
    platforms do not have the same distinction.

.. note::

    Console and GUI scripts work because behind the scenes, installers like :pypi:`pip`
    create wrapper scripts around the function(s) being invoked. For example,
    the ``hello-world`` entry point in the above two examples would create a
    command ``hello-world`` launching a script like this: [#use_for_scripts]_

    .. code-block:: python

        import sys
        from timmins import hello_world
        sys.exit(hello_world())

.. _dynamic discovery of services and plugins:

Advertising Behavior
====================

Console/GUI 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/GUI scripts work similarly, where libraries advertise their commands
and tools like ``pip`` create wrapper scripts that invoke those commands.

Entry Points for Plugins
========================

Let us consider a simple example to understand how we can implement entry points
corresponding to plugins. Say we have a package ``timmins`` with the following
directory structure::

    timmins
    ├── pyproject.toml        # and/or setup.cfg, setup.py
    └── src
        └── timmins
            └── __init__.py

and in ``src/timmins/__init__.py`` we have the following code:

.. code-block:: python

   def hello_world():
       print('Hello world')

Basically, we have defined a ``hello_world()`` function which will print the text
'Hello world'. Now, let us say we want to print the text 'Hello world' in different
ways. The current function just prints the text as it is - let us say we want another
style in which the text is enclosed within exclamation marks::

    !!! Hello world !!!

Let us see how this can be done using plugins. First, let us separate the style of
printing the text from the text itself. In other words, we can change the code in
``src/timmins/__init__.py`` to something like this:

.. code-block:: python

   def display(text):
       print(text)

   def hello_world():
       display('Hello world')

Here, the ``display()`` function controls the style of printing the text, and the
``hello_world()`` function calls the ``display()`` function to print the text 'Hello
world`.

Right now the ``display()`` function just prints the text as it is. In order to be able
to customize it, we can do the following. Let us introduce a new *group* of entry points
named ``timmins.display``, and expect plugin packages implementing this entry point
to supply a ``display()``-like function. Next, to be able to automatically discover plugin
packages that implement this entry point, we can use the
:mod:`importlib.metadata` module,
as follows:

.. code-block:: python

   from importlib.metadata import entry_points
   display_eps = entry_points(group='timmins.display')

.. note::
   Each ``importlib.metadata.EntryPoint`` object is an object containing a ``name``, a
   ``group``, and a ``value``. For example, after setting up the plugin package as
   described below, ``display_eps`` in the above code will look like this: [#package_metadata]_

   .. code-block:: python

       (
           EntryPoint(name='excl', value='timmins_plugin_fancy:excl_display', group='timmins.display'),
           ...,
       )

``display_eps`` will now be a list of ``EntryPoint`` objects, each referring to ``display()``-like
functions defined by one or more installed plugin packages. Then, to import a specific
``display()``-like function - let us choose the one corresponding to the first discovered
entry point - we can use the ``load()`` method as follows:

.. code-block:: python

   display = display_eps[0].load()

Finally, a sensible behaviour would be that if we cannot find any plugin packages customizing
the ``display()`` function, we should fall back to our default implementation which prints
the text as it is. With this behaviour included, the code in ``src/timmins/__init__.py``
finally becomes:

.. code-block:: python

   from importlib.metadata import entry_points
   display_eps = entry_points(group='timmins.display')
   try:
       display = display_eps[0].load()
   except IndexError:
       def display(text):
           print(text)

   def hello_world():
       display('Hello world')

That finishes the setup on ``timmins``'s side. Next, we need to implement a plugin
which implements the entry point ``timmins.display``. Let us name this plugin
``timmins-plugin-fancy``, and set it up with the following directory structure::

    timmins-plugin-fancy
    ├── pyproject.toml        # and/or setup.cfg, setup.py
    └── src
        └── timmins_plugin_fancy
            └── __init__.py

And then, inside ``src/timmins_plugin_fancy/__init__.py``, we can put a function
named ``excl_display()`` that prints the given text surrounded by exclamation marks:

.. code-block:: python

   def excl_display(text):
       print('!!!', text, '!!!')

This is the ``display()``-like function that we are looking to supply to the
``timmins`` package. We can do that by adding the following in the configuration
of ``timmins-plugin-fancy``:

.. tab:: pyproject.toml

   .. code-block:: toml

        # Note the quotes around timmins.display in order to escape the dot .
        [project.entry-points."timmins.display"]
        excl = "timmins_plugin_fancy:excl_display"

.. tab:: setup.cfg

   .. code-block:: ini

        [options.entry_points]
        timmins.display =
            excl = timmins_plugin_fancy:excl_display

.. tab:: setup.py

   .. code-block:: python

        from setuptools import setup

        setup(
            # ...,
            entry_points = {
                'timmins.display': [
                    'excl = timmins_plugin_fancy:excl_display'
                ]
            }
        )

Basically, this configuration states that we are a supplying an entry point
under the group ``timmins.display``. The entry point is named ``excl`` and it
refers to the function ``excl_display`` defined by the package ``timmins-plugin-fancy``.

Now, if we install both ``timmins`` and ``timmins-plugin-fancy``, we should get
the following:

.. code-block:: pycon

   >>> from timmins import hello_world
   >>> hello_world()
   !!! Hello world !!!

whereas if we only install ``timmins`` and not ``timmins-plugin-fancy``, we should
get the following:

.. code-block:: pycon

   >>> from timmins import hello_world
   >>> hello_world()
   Hello world

Therefore, our plugin works.

Our plugin could have also defined multiple entry points under the group ``timmins.display``.
For example, in ``src/timmins_plugin_fancy/__init__.py`` we could have two ``display()``-like
functions, as follows:

.. code-block:: python

   def excl_display(text):
       print('!!!', text, '!!!')

   def lined_display(text):
       print(''.join(['-' for _ in text]))
       print(text)
       print(''.join(['-' for _ in text]))

The configuration of ``timmins-plugin-fancy`` would then change to:

.. tab:: pyproject.toml

   .. code-block:: toml

        [project.entry-points."timmins.display"]
        excl = "timmins_plugin_fancy:excl_display"
        lined = "timmins_plugin_fancy:lined_display"

.. tab:: setup.cfg

   .. code-block:: ini

        [options.entry_points]
        timmins.display =
            excl = timmins_plugin_fancy:excl_display
            lined = timmins_plugin_fancy:lined_display

.. tab:: setup.py

   .. code-block:: python

        from setuptools import setup

        setup(
            # ...,
            entry_points = {
                'timmins.display': [
                    'excl = timmins_plugin_fancy:excl_display',
                    'lined = timmins_plugin_fancy:lined_display',
                ]
            }
        )

On the ``timmins`` side, we can also use a different strategy of loading entry
points. For example, we can search for a specific display style:

.. code-block:: python

   display_eps = entry_points(group='timmins.display')
   try:
       display = display_eps['lined'].load()
   except KeyError:
       # if the 'lined' display is not available, use something else
       ...

Or we can also load all plugins under the given group. Though this might not
be of much use in our current example, there are several scenarios in which this
is useful:

.. code-block:: python

   display_eps = entry_points(group='timmins.display')
   for ep in display_eps:
       display = ep.load()
       # do something with display
       ...

Another point is that in this particular example, we have used plugins to
customize the behaviour of a function (``display()``). In general, we can use entry
points to enable plugins to not only customize the behaviour of functions, but also
of entire classes and modules. This is unlike the case of console/GUI scripts,
where entry points can only refer to functions. The syntax used for specifying the
entry points remains the same as for console/GUI scripts, and is discussed in the
`last section <#entry-points-syntax>`_.

.. tip::
    The recommended approach for loading and importing entry points is the
    :mod:`importlib.metadata` module,
    which is a part of the standard library since Python 3.8. For older versions of
    Python, its backport :pypi:`importlib_metadata` should be used. While using the
    backport, the only change that has to be made is to replace ``importlib.metadata``
    with ``importlib_metadata``, i.e.

    .. code-block:: python

       from importlib_metadata import entry_points
       ...

In summary, entry points allow a package to open its functionalities for
customization via plugins.
The package soliciting the entry points need not have any dependency
or prior knowledge about the plugins implementing the entry points, and
downstream users are able to compose functionality by pulling together
plugins implementing the entry points.

Entry Points Syntax
===================

The syntax for entry points is specified as follows::

    <name> = <package_or_module>[:<object>[.<attr>[.<nested-attr>]*]]

Here, the square brackets ``[]`` denote optionality and the asterisk ``*``
denotes repetition.
``name`` is the name of the script/entry point you want to create, the left hand
side of ``:`` is the package or module that contains the object you want to invoke
(think about it as something you would write in an import statement), and the right
hand side is the object you want to invoke (e.g. a function).

To make this syntax more clear, consider the following examples:

Package or module
    If you supply::

       <name> = <package_or_module>

    as the entry point, where ``<package_or_module>`` can contain ``.`` in the case
    of sub-modules or sub-packages, then, tools in the Python ecosystem will roughly
    interpret this value as:

    .. code-block:: python

        import <package_or_module>
        parsed_value = <package_or_module>

Module-level object
   If you supply::

        <name> = <package_or_module>:<object>

   where ``<object>`` does not contain any ``.``, this will be roughly interpreted
   as:

   .. code-block:: python

       from <package_or_module> import <object>
       parsed_value = <object>

Nested object
   If you supply::

        <name> = <package_or_module>:<object>.<attr>.<nested_attr>

   this will be roughly interpreted as:

   .. code-block:: python

       from <package_or_module> import <object>
       parsed_value = <object>.<attr>.<nested_attr>

In the case of console/GUI scripts, this syntax can be used to specify a function, while
in the general case of entry points as used for plugins, it can be used to specify a function,
class or module.

----

.. [#use_for_scripts]
   Reference: https://packaging.python.org/en/latest/specifications/entry-points/#use-for-scripts

.. [#package_metadata]
   Reference: https://packaging.python.org/en/latest/guides/creating-and-discovering-plugins/#using-package-metadata
PK"[��s"�3�39doc/alt-python312-setuptools/docs/userguide/extension.rstnu�[���.. _Creating ``distutils`` Extensions:

Extending or Customizing Setuptools
===================================

Setuptools design is based on the distutils_ package originally distributed
as part of Python's standard library, effectively serving as its successor
(as established in :pep:`632`).

This means that ``setuptools`` strives to honor the extension mechanisms
provided by ``distutils``, and allows developers to create third party packages
that modify or augment the build process behavior.

A simple way of doing that is to hook in new or existing
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` for some more background on entry points).

The following sections describe the most common procedures for extending
the ``distutils`` functionality used by ``setuptools``.

.. important::
   Any entry-point defined in your ``setup.cfg``, ``setup.py`` or
   ``pyproject.toml`` files are not immediately available for use.  Your
   package needs to be installed first, then ``setuptools`` will be able to
   access these entry points.  For example consider a ``Project-A`` that
   defines entry points. When building ``Project-A``, these will not be
   available.  If ``Project-B`` declares a :doc:`build system requirement
   </userguide/dependency_management>` on ``Project-A``, then ``setuptools``
   will be able to use ``Project-A``' customizations.

Customizing Commands
--------------------

Both ``setuptools`` and ``distutils`` are structured around the *command design
pattern*. This means that each main action executed when building a
distribution package (such as creating a :term:`sdist <Source Distribution (or "sdist")>`
or :term:`wheel`) correspond to the implementation of a Python class.

Originally in ``distutils``, these commands would correspond to actual CLI
arguments that could be passed to the ``setup.py`` script to trigger a
different aspect of the build. In ``setuptools``, however, these command
objects are just a design abstraction that encapsulate logic and help to
organise the code.

You can overwrite existing commands (or add new ones) 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 project:

.. code-block:: ini

    # setup.cfg
    ...
    [options.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 (documented below).

Once a project containing such entry points has been activated on ``sys.path``,
(e.g. by running ``pip install``) the command(s) will be available to any
``setuptools``-based project. In fact, this is
how setuptools' own commands are installed: the setuptools project's setup
script defines entry points for them!

The commands ``sdist``, ``build_py`` and ``build_ext`` are especially useful
to customize ``setuptools`` builds. Note however that when overwriting existing
commands, you should be very careful to maintain API compatibility.
Custom commands should try to replicate the same overall behavior as the
original classes, and when possible, even inherit from them.

You should also consider handling exceptions such as ``CompileError``,
``LinkError``, ``LibError``, among others. These exceptions are available in
the ``setuptools.errors`` module.

.. autoclass:: setuptools.Command
   :members:


Supporting sdists and editable installs in ``build`` sub-commands
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

``build`` sub-commands (like ``build_py`` and ``build_ext``)
are encouraged to implement the following protocol:

.. autoclass:: setuptools.command.build.SubCommand
   :members:


Adding 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
extension project:

.. code-block:: ini

    # setup.cfg
    ...
    [options.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 SetupError(
                "%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
``SetupError`` (from the ``setuptools.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
extensions to define a common argument, as long as they agree on
what values of that argument are valid.


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.


Defining Additional Metadata
----------------------------

Some extensible applications and frameworks may need to define their own kinds
of metadata, which they can then access using the :mod:`importlib.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 an 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 for more
details.


.. _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 an 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 an
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:

.. code-block:: ini

    # setup.cfg
    ...
    [options.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 ``logging`` 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: :pypi:`setuptools_scm`
- SVN: :pypi:`setuptools_svn`

If you would like to create a plugin for ``setuptools`` to find files tracked
by another revision control system, you can do so by adding an entry point to
the ``setuptools.file_finders`` group.  The entry point should be a function
accepting a single directory name, and should yield all the filenames within
that directory (and any subdirectories thereof) that are under revision
control.

For example, if you were going to create a plugin for a revision control system
called "foobar", you would write a function something like this:

.. code-block:: python

    def find_files_for_foobar(dirname):
        ...  # loop to yield paths that start with `dirname`

And you would register it in a setup script using something like this:

.. code-block:: ini

    # setup.cfg
    ...

    [options.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 ``logging.warning()`` to
  inform the user of the missing program(s).


.. _distutils: https://docs.python.org/3.9/library/distutils.html


Final Remarks
-------------

* To use a ``setuptools`` plugin, your users will need to add your package as a
  build requirement to their build-system configuration. Please check out our
  guides on :doc:`/userguide/dependency_management` for more information.

* Directly calling ``python setup.py ...`` is considered a **deprecated** practice.
  You should not add new commands to ``setuptools`` expecting them to be run
  via this interface.
PK"[
���sGsGAdoc/alt-python312-setuptools/docs/userguide/package_discovery.rstnu�[���.. _`package_discovery`:

========================================
Package Discovery and Namespace Packages
========================================

.. note::
    a full specification for the keywords supplied to ``setup.cfg`` or
    ``setup.py`` can be found at :doc:`keywords reference </references/keywords>`

.. important::
    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 is a good place to start.

``Setuptools`` provides powerful tools to handle package discovery, including
support for namespace packages.

Normally, you would specify the packages to be included manually in the following manner:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        #...
        packages =
            mypkg
            mypkg.subpkg1
            mypkg.subpkg2

.. tab:: setup.py

    .. code-block:: python

        setup(
            # ...
            packages=['mypkg', 'mypkg.subpkg1', 'mypkg.subpkg2']
        )

.. tab:: pyproject.toml

    .. code-block:: toml

        # ...
        [tool.setuptools]
        packages = ["mypkg", "mypkg.subpkg1", "mypkg.subpkg2"]
        # ...


If your packages are not in the root of the repository or do not correspond
exactly to the directory structure, you also need to configure ``package_dir``:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        # ...
        package_dir =
            = src
            # directory containing all the packages (e.g.  src/mypkg, src/mypkg/subpkg1, ...)
        # OR
        package_dir =
            mypkg = lib
            # mypkg.module corresponds to lib/module.py
            mypkg.subpkg1 = lib1
            # mypkg.subpkg1.module1 corresponds to lib1/module1.py
            mypkg.subpkg2 = lib2
            # mypkg.subpkg2.module2 corresponds to lib2/module2.py
        # ...

.. tab:: setup.py

    .. code-block:: python

        setup(
            # ...
            package_dir = {"": "src"}
            # directory containing all the packages (e.g.  src/mypkg, src/mypkg/subpkg1, ...)
        )

        # OR

        setup(
            # ...
            package_dir = {
                "mypkg": "lib",  # mypkg.module corresponds to lib/module.py
                "mypkg.subpkg1": "lib1",  # mypkg.subpkg1.module1 corresponds to lib1/module1.py
                "mypkg.subpkg2": "lib2"   # mypkg.subpkg2.module2 corresponds to lib2/module2.py
                # ...
        )

.. tab:: pyproject.toml

    .. code-block:: toml

        [tool.setuptools]
        # ...
        package-dir = {"" = "src"}
            # directory containing all the packages (e.g.  src/mypkg1, src/mypkg2)

        # OR

        [tool.setuptools.package-dir]
        mypkg = "lib"
        # mypkg.module corresponds to lib/module.py
        "mypkg.subpkg1" = "lib1"
        # mypkg.subpkg1.module1 corresponds to lib1/module1.py
        "mypkg.subpkg2" = "lib2"
        # mypkg.subpkg2.module2 corresponds to lib2/module2.py
        # ...

This can get tiresome really quickly. To speed things up, you can rely on
setuptools automatic discovery, or use the provided tools, as explained in
the following sections.

.. important::
   Although ``setuptools`` allows developers to create a very complex mapping
   between directory names and package names, it is better to *keep it simple*
   and reflect the desired package hierarchy in the directory structure,
   preserving the same names.

.. _auto-discovery:

Automatic discovery
===================

By default ``setuptools`` will consider 2 popular project layouts, each one with
its own set of advantages and disadvantages [#layout1]_ [#layout2]_ as
discussed in the following sections.

Setuptools will automatically scan your project directory looking for these
layouts and try to guess the correct values for the :ref:`packages <declarative
config>` and :doc:`py_modules </references/keywords>` configuration.

.. important::
   Automatic discovery will **only** be enabled if you **don't** provide any
   configuration for ``packages`` and ``py_modules``.
   If at least one of them is explicitly set, automatic discovery will not take place.

   **Note**: specifying ``ext_modules`` might also prevent auto-discover from
   taking place, unless your opt into :doc:`pyproject_config` (which will
   disable the backward compatible behaviour).

.. _src-layout:

src-layout
----------
The project should contain a ``src`` directory under the project root and
all modules and packages meant for distribution are placed inside this
directory::

    project_root_directory
    ├── pyproject.toml  # AND/OR setup.cfg, setup.py
    ├── ...
    └── src/
        └── mypkg/
            ├── __init__.py
            ├── ...
            ├── module.py
            ├── subpkg1/
            │   ├── __init__.py
            │   ├── ...
            │   └── module1.py
            └── subpkg2/
                ├── __init__.py
                ├── ...
                └── module2.py

This layout is very handy when you wish to use automatic discovery,
since you don't have to worry about other Python files or folders in your
project root being distributed by mistake. In some circumstances it can be
also less error-prone for testing or when using :pep:`420`-style packages.
On the other hand you cannot rely on the implicit ``PYTHONPATH=.`` to fire
up the Python REPL and play with your package (you will need an
`editable install`_ to be able to do that).

.. _flat-layout:

flat-layout
-----------
*(also known as "adhoc")*

The package folder(s) are placed directly under the project root::

    project_root_directory
    ├── pyproject.toml  # AND/OR setup.cfg, setup.py
    ├── ...
    └── mypkg/
        ├── __init__.py
        ├── ...
        ├── module.py
        ├── subpkg1/
        │   ├── __init__.py
        │   ├── ...
        │   └── module1.py
        └── subpkg2/
            ├── __init__.py
            ├── ...
            └── module2.py

This layout is very practical for using the REPL, but in some situations
it can be more error-prone (e.g. during tests or if you have a bunch
of folders or Python files hanging around your project root).

To avoid confusion, file and folder names that are used by popular tools (or
that correspond to well-known conventions, such as distributing documentation
alongside the project code) are automatically filtered out in the case of
*flat-layout*:

.. autoattribute:: setuptools.discovery.FlatLayoutPackageFinder.DEFAULT_EXCLUDE

.. autoattribute:: setuptools.discovery.FlatLayoutModuleFinder.DEFAULT_EXCLUDE

.. warning::
   If you are using auto-discovery with *flat-layout*, ``setuptools`` will
   refuse to create :term:`distribution archives <Distribution Package>` with
   multiple top-level packages or modules.

   This is done to prevent common errors such as accidentally publishing code
   not meant for distribution (e.g. maintenance-related scripts).

   Users that purposefully want to create multi-package distributions are
   advised to use :ref:`custom-discovery` or the ``src-layout``.

There is also a handy variation of the *flat-layout* for utilities/libraries
that can be implemented with a single Python file:

single-module distribution
^^^^^^^^^^^^^^^^^^^^^^^^^^

A standalone module is placed directly under the project root, instead of
inside a package folder::

    project_root_directory
    ├── pyproject.toml  # AND/OR setup.cfg, setup.py
    ├── ...
    └── single_file_lib.py


.. _custom-discovery:

Custom discovery
================

If the automatic discovery does not work for you
(e.g., you want to *include* in the distribution top-level packages with
reserved names such as ``tasks``, ``example`` or ``docs``, or you want to
*exclude* nested packages that would be otherwise included), you can use
the provided tools for package discovery:

.. 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

.. tab:: pyproject.toml

    .. code-block:: toml

        # ...
        [tool.setuptools.packages]
        find = {}  # Scanning implicit namespaces is active by default
        # OR
        find = {namespaces = false}  # Disable implicit namespaces


Finding simple 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 returns a list of ``str`` representing the packages it could find. To use
it, consider the following directory::

    mypkg
    ├── pyproject.toml  # AND/OR setup.cfg, setup.py
    └── src
        ├── pkg1
        │   └── __init__.py
        ├── pkg2
        │   └── __init__.py
        ├── additional
        │   └── __init__.py
        └── pkg
            └── namespace
                └── __init__.py

To have setuptools to automatically include packages found
in ``src`` that start 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*
        # alternatively: `exclude = additional*`

    .. note::
        ``pkg`` does not contain an ``__init__.py`` file, therefore
        ``pkg.namespace`` is ignored by ``find:`` (see ``find_namespace:`` below).

.. tab:: setup.py

    .. code-block:: python

        setup(
            # ...
            packages=find_packages(
                where='src',
                include=['pkg*'],  # alternatively: `exclude=['additional*']`
            ),
            package_dir={"": "src"}
            # ...
        )


    .. note::
        ``pkg`` does not contain an ``__init__.py`` file, therefore
        ``pkg.namespace`` is ignored by ``find_packages()``
        (see ``find_namespace_packages()`` below).

.. tab:: pyproject.toml

    .. code-block:: toml

        [tool.setuptools.packages.find]
        where = ["src"]
        include = ["pkg*"]  # alternatively: `exclude = ["additional*"]`
        namespaces = false

    .. note::
        When using ``tool.setuptools.packages.find`` in ``pyproject.toml``,
        setuptools will consider :pep:`implicit namespaces <420>` by default when
        scanning your project directory.
        To avoid ``pkg.namespace`` from being added to your package list
        you can set ``namespaces = false``. This will prevent any folder
        without an ``__init__.py`` file from being scanned.

.. important::
   ``include`` and ``exclude`` accept strings representing :mod:`glob` patterns.
   These patterns should match the **full** name of the Python module (as if it
   was written in an ``import`` statement).

   For example if you have ``util`` pattern, it will match
   ``util/__init__.py`` but not ``util/files/__init__.py``.

   The fact that the parent package is matched by the pattern will not dictate
   if the submodule will be included or excluded from the distribution.
   You will need to explicitly add a wildcard (e.g. ``util*``)
   if you want the pattern to also match submodules.

.. _Namespace Packages:

Finding namespace packages
--------------------------
``setuptools``  provides ``find_namespace:`` (``find_namespace_packages()``)
which behaves similarly to ``find:`` but works with namespace packages.

Before diving in, it is important to have a good understanding of what
:pep:`namespace packages <420>` are. Here is a quick recap.

When you have two packages organized 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.

Now, suppose you decide to package the ``foo`` part for distribution and start
by creating a project directory organized as follows::

   foo
   ├── pyproject.toml  # AND/OR setup.cfg, setup.py
   └── src
       └── timmins
           └── foo
               └── __init__.py

If you want the ``timmins.foo`` to be automatically included in the
distribution, then you will need to specify:

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        package_dir =
            =src
        packages = find_namespace:

        [options.packages.find]
        where = src

    ``find:`` won't work because ``timmins`` doesn't contain ``__init__.py``
    directly, instead, you have to use ``find_namespace:``.

    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.

.. tab:: setup.py

    .. code-block:: python

        setup(
            # ...
            packages=find_namespace_packages(where='src'),
            package_dir={"": "src"}
            # ...
        )

    When you use ``find_packages()``, all directories without an
    ``__init__.py`` file will be ignored.
    On the other hand, ``find_namespace_packages()`` will scan all
    directories.

.. tab:: pyproject.toml

    .. code-block:: toml

        [tool.setuptools.packages.find]
        where = ["src"]

    When using ``tool.setuptools.packages.find`` in ``pyproject.toml``,
    setuptools will consider :pep:`implicit namespaces <420>` by default when
    scanning your project directory.

After installing the package distribution, ``timmins.foo`` would become
available to your interpreter.

.. warning::
   Please have in mind that ``find_namespace:`` (setup.cfg),
   ``find_namespace_packages()`` (setup.py) and ``find`` (pyproject.toml) will
   scan **all** folders that you have in your project directory if you use a
   :ref:`flat-layout`.

   If used naïvely, this might result in unwanted files being added to your
   final wheel. For example, with a project directory organized as follows::

       foo
       ├── docs
       │   └── conf.py
       ├── timmins
       │   └── foo
       │       └── __init__.py
       └── tests
           └── tests_foo
               └── __init__.py

   final users will end up installing not only ``timmins.foo``, but also
   ``docs`` and ``tests.tests_foo``.

   A simple way to fix this is to adopt the aforementioned :ref:`src-layout`,
   or make sure to properly configure the ``include`` and/or ``exclude``
   accordingly.

.. tip::
   After :ref:`building your package <building>`, you can have a look if all
   the files are correct (nothing missing or extra), by running the following
   commands:

   .. code-block:: bash

      tar tf dist/*.tar.gz
      unzip -l dist/*.whl

   This requires the ``tar`` and ``unzip`` to be installed in your OS.
   On Windows you can also use a GUI program such as 7zip_.


Legacy Namespace Packages
=========================
The fact you can create namespace packages so effortlessly above is credited
to :pep:`420`. It used 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
   ├── pyproject.toml  # AND/OR setup.cfg, setup.py
   └── src
       └── timmins
           ├── __init__.py
           └── foo
               └── __init__.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 ``pyproject.toml/setup.cfg`` remains the same.


----


.. [#layout1] https://blog.ionelmc.ro/2014/05/25/python-packaging/#the-structure
.. [#layout2] https://blog.ionelmc.ro/2017/09/25/rehashing-the-src-layout/

.. _editable install: https://pip.pypa.io/en/stable/cli/pip_install/#editable-installs
.. _7zip: https://www.7-zip.org
PK"[���Xp?p?:doc/alt-python312-setuptools/docs/userguide/quickstart.rstnu�[���==========
Quickstart
==========

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

You can install the latest version of ``setuptools`` using :pypi:`pip`::

    pip install --upgrade setuptools

Most of the times, however, you don't have to...

Instead, when creating new Python packages, it is recommended to use
a command line tool called :pypi:`build`. This tool will automatically download
``setuptools`` and any other build-time dependencies that your project might
have. You just need to specify them in a ``pyproject.toml`` file at the root of
your package, as indicated in the :ref:`following section <basic-use>`.

.. _install-build:

You can also :doc:`install build <build:installation>` using :pypi:`pip`::

    pip install --upgrade build

This will allow you to run the command: ``python -m build``.

.. important::
   Please note that some operating systems might be equipped with
   the ``python3`` and ``pip3`` commands instead of ``python`` and ``pip``
   (but they should be equivalent).
   If you don't have ``pip`` or ``pip3`` available in your system, please
   check out :doc:`pip installation docs <pip:installation>`.


Every 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 tool that provides a ``build sdist``-like
functionality.


.. _basic-use:

Basic Use
=========

When creating a Python package, you must provide a ``pyproject.toml`` file
containing a ``build-system`` section similar to the example below:

.. code-block:: toml

    [build-system]
    requires = ["setuptools"]
    build-backend = "setuptools.build_meta"

This section declares what are your build system dependencies, and which
library will be used to actually do the packaging.

.. note::

   Historically this documentation has unnecessarily listed ``wheel``
   in the ``requires`` list, and many projects still do that. This is
   not recommended. The backend automatically adds ``wheel`` dependency
   when it is required, and listing it explicitly causes it to be
   unnecessarily required for source distribution builds.
   You should only include ``wheel`` in ``requires`` if you need to explicitly
   access it during build time (e.g. if your project needs a ``setup.py``
   script that imports ``wheel``).

In addition to specifying a build system, you also will need to add
some package information such as metadata, contents, dependencies, etc.
This can be done in the same ``pyproject.toml`` file,
or in a separated one: ``setup.cfg`` or ``setup.py`` [#setup.py]_.

The following example demonstrates a minimum configuration
(which assumes the project depends on :pypi:`requests` and
:pypi:`importlib-metadata` to be able to run):

.. tab:: pyproject.toml

    .. code-block:: toml

       [project]
       name = "mypackage"
       version = "0.0.1"
       dependencies = [
           "requests",
           'importlib-metadata; python_version<"3.8"',
       ]

    See :doc:`/userguide/pyproject_config` for more information.

.. tab:: setup.cfg

    .. code-block:: ini

        [metadata]
        name = mypackage
        version = 0.0.1

        [options]
        install_requires =
            requests
            importlib-metadata; python_version < "3.8"

    See :doc:`/userguide/declarative_config` for more information.

.. tab:: setup.py [#setup.py]_

    .. code-block:: python

        from setuptools import setup

        setup(
            name='mypackage',
            version='0.0.1',
            install_requires=[
                'requests',
                'importlib-metadata; python_version == "3.8"',
            ],
        )

    See :doc:`/references/keywords` for more information.

Finally, you will need to organize your Python code to make it ready for
distributing into something that looks like the following
(optional files marked with ``#``)::

    mypackage
    ├── pyproject.toml  # and/or setup.cfg/setup.py (depending on the configuration method)
    |   # README.rst or README.md (a nice description of your package)
    |   # LICENCE (properly chosen license information, e.g. MIT, BSD-3, GPL-3, MPL-2, etc...)
    └── mypackage
        ├── __init__.py
        └── ... (other Python files)

With :ref:`build installed in your system <install-build>`, you can then run::

    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 :doc:`upload <twine:index>` to PyPI_!

Of course, before you release your project to PyPI_, you'll want to add a bit
more information 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 the additional but essential information you need
to specify to properly package your project.


..
   TODO: A previous generation of this document included a section called
   "Python packaging at a glance". This is a nice title, but the content
   removed because it assumed the reader had familiarity with the history of
   setuptools and PEP 517. We should take advantage of this nice title and add
   this section back, but use it to explain important concepts of the
   ecosystem, such as "sdist", "wheel", "index". It would also be nice if we
   could have a diagram for that (explaining for example that "wheels" are
   built from "sdists" not the source tree).

.. _setuppy_discouraged:
.. admonition:: Info: Using ``setup.py``
  :class: seealso

  Setuptools offers first class support for ``setup.py`` files as a configuration
  mechanism.

  It is important to remember, however, that running this file as a
  script (e.g. ``python setup.py sdist``) is strongly **discouraged**, and
  that the majority of the command line interfaces are (or will be) **deprecated**
  (e.g. ``python setup.py install``, ``python setup.py bdist_wininst``, ...).

  We also recommend users to expose as much as possible configuration in a
  more *declarative* way via the :doc:`pyproject.toml <pyproject_config>` or
  :doc:`setup.cfg <declarative_config>`, and keep the ``setup.py`` minimal
  with only the dynamic parts (or even omit it completely if applicable).

  See `Why you shouldn't invoke setup.py directly`_ for more background.

.. _Why you shouldn't invoke setup.py directly: https://blog.ganssle.io/articles/2021/10/setup-py-deprecated.html


Overview
========

Package discovery
-----------------
For projects that follow a simple directory structure, ``setuptools`` should be
able to automatically detect all :term:`packages <package>` and
:term:`namespaces <namespace>`. However, complex projects might include
additional folders and supporting files that not necessarily should be
distributed (or that can confuse ``setuptools`` auto discovery algorithm).

Therefore, ``setuptools`` provides a convenient way to customize
which packages should be distributed and in which directory they should be
found, as shown in the example below:

.. tab:: pyproject.toml

    .. code-block:: toml

        # ...
        [tool.setuptools.packages]
        find = {}  # Scan the project directory with the default parameters

        # OR
        [tool.setuptools.packages.find]
        # All the following settings are optional:
        where = ["src"]  # ["."] by default
        include = ["mypackage*"]  # ["*"] by default
        exclude = ["mypackage.tests*"]  # empty by default
        namespaces = false  # true by default

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        packages = find: # OR `find_namespace:` if you want to use namespaces

        [options.packages.find]  # (always `find` even if `find_namespace:` was used before)
        # This section is optional as well as each of the following options:
        where=src  # . by default
        include=mypackage*  # * by default
        exclude=mypackage.tests*  # empty by default

.. tab:: setup.py [#setup.py]_

    .. code-block:: python

        from setuptools import setup, find_packages  # or find_namespace_packages

        setup(
            # ...
            packages=find_packages(
                # All keyword arguments below are optional:
                where='src',  # '.' by default
                include=['mypackage*'],  # ['*'] by default
                exclude=['mypackage.tests'],  # empty by default
            ),
            # ...
        )

When you pass the above information, alongside other necessary information,
``setuptools`` walks through the directory specified in ``where`` (defaults to ``.``) and filters the packages
it can find following the ``include`` patterns (defaults to ``*``), then it removes
those that match the ``exclude`` patterns (defaults to empty) and returns a list of Python packages.

For more details and advanced use, go to :ref:`package_discovery`.

.. tip::
   Starting with version 61.0.0, setuptools' automatic discovery capabilities
   have been improved to detect popular project layouts (such as the
   :ref:`flat-layout` and :ref:`src-layout`) without requiring any
   special configuration. Check out our :ref:`reference docs <package_discovery>`
   for more information.


Entry points and automatic script creation
-------------------------------------------
Setuptools supports automatic creation of scripts upon installation, that run
code within your package if you specify them as :doc:`entry points
<PyPUG:specifications/entry-points>`.
An example of how this feature can be used in ``pip``:
it allows you to run commands like ``pip install`` instead of having
to type ``python -m pip install``.

The following configuration examples show how to accomplish this:


.. tab:: pyproject.toml

    .. code-block:: toml

       [project.scripts]
       cli-name = "mypkg.mymodule:some_func"

.. tab:: setup.cfg

    .. code-block:: ini

        [options.entry_points]
        console_scripts =
            cli-name = mypkg.mymodule:some_func

.. tab:: setup.py [#setup.py]_

    .. code-block:: python

        setup(
            # ...
            entry_points={
                'console_scripts': [
                    'cli-name = mypkg.mymodule:some_func',
                ]
            }
        )

When this project is installed, a ``cli-name`` executable will be created.
``cli-name`` will invoke the function ``some_func`` in the
``mypkg/mymodule.py`` file when called by the user.
Note that you can also use the ``entry-points`` mechanism to advertise
components between installed packages and implement plugin systems.
For detailed usage, go to :doc:`entry_point`.


Dependency management
---------------------
Packages built with ``setuptools`` can specify dependencies to be automatically
installed when the package itself is installed.
The example below shows how to configure this kind of dependencies:

.. tab:: pyproject.toml

    .. code-block:: toml

        [project]
        # ...
        dependencies = [
            "docutils",
            "requests <= 0.4",
        ]
        # ...

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        install_requires =
            docutils
            requests <= 0.4

.. tab:: setup.py [#setup.py]_

    .. code-block:: python

        setup(
            # ...
            install_requires=["docutils", "requests <= 0.4"],
            # ...
        )

Each dependency is represented by a string that can optionally contain version requirements
(e.g. one of the operators <, >, <=, >=, == or !=, followed by a version identifier),
and/or conditional environment markers, e.g. ``sys_platform == "win32"``
(see :doc:`PyPUG:specifications/version-specifiers` for more information).

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 scenario. You can also specify groups of
extra dependencies that are not strictly required by your package to work, but
that will provide additional functionalities.
For more advanced use, see :doc:`dependency_management`.


.. _Including Data Files:

Including Data Files
--------------------
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:

.. tab:: pyproject.toml

    .. code-block:: toml

        [tool.setuptools]
        include-package-data = true
        # This is already the default behaviour if you are using
        # pyproject.toml to configure your build.
        # You can deactivate that with `include-package-data = false`

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        include_package_data = True

.. tab:: setup.py [#setup.py]_

    .. code-block:: python

        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 :ref:`MANIFEST.in <Using MANIFEST.in>`
file or automatically added by a :ref:`Revision Control System plugin
<Adding Support for Revision Control Systems>`.
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.
Here's how to do it::

    pip install --editable .

See :doc:`development_mode` for more information.

.. tip::

    Prior to :ref:`pip v21.1 <pip:v21-1>`, a ``setup.py`` script was
    required to be compatible with development mode. With late
    versions of pip, projects without ``setup.py`` may be installed in this mode.

    If you have a version of ``pip`` older than v21.1 or is using a different
    packaging-related tool that does not support :pep:`660`, you might need to keep a
    ``setup.py`` file in file in your repository if you want to use editable
    installs.

    A simple script will suffice, for example:

    .. code-block:: python

        from setuptools import setup

        setup()

    You can still keep all the configuration in
    :doc:`pyproject.toml </userguide/pyproject_config>` and/or
    :doc:`setup.cfg </userguide/declarative_config>`


Uploading your package to PyPI
------------------------------
After generating the distribution files, the next step would be to upload your
distribution so others can use it. This functionality is provided by
:pypi:`twine` and is documented in the :doc:`Python packaging tutorial
<PyPUG:tutorials/packaging-projects>`.


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. :doc:`Here </userguide/declarative_config>` we provide a quick guide to
understanding how ``setup.cfg`` is parsed by ``setuptools`` to ease the pain of
transition.

.. _packaging-resources:

Resources on Python packaging
=============================
Packaging in Python can be hard and is constantly evolving.
`Python Packaging User Guide <https://packaging.python.org>`_ has tutorials and
up-to-date references that can help you when it is time to distribute your work.



----

.. rubric:: Notes

.. [#setup.py]
   New projects are advised to avoid ``setup.py`` configurations (beyond the minimal stub)
   when custom scripting during the build is not necessary.
   Examples are kept in this document to help people interested in maintaining or
   contributing to existing packages that use ``setup.py``.
   Note that you can still keep most of configuration declarative in
   :doc:`setup.cfg <declarative_config>` or :doc:`pyproject.toml
   <pyproject_config>` and use ``setup.py`` only for the parts not
   supported in those files (e.g. C extensions).
   See :ref:`note <setuppy_discouraged>`.

.. _PyPI: https://pypi.org
PK"[��j�J(J(<doc/alt-python312-setuptools/docs/userguide/distribution.rstnu�[���.. _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` 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 <https://peps.python.org/pep-0440/#pre-releases>`_
or `post-release <https://peps.python.org/pep-0440/#post-releases>`_ 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 release candidate
``2.4rc1``, which in turn is newer than beta release ``2.4b1`` or
alpha release ``2.4a1``.  Postrelease tags make
a version be considered *newer* than the version they are appended to.  So,
revisions like ``2.4.post1`` 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``. Note that ``2.4pl1`` is not :pep:`440`-compliant.

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. Note that only ``a``, ``b``, and ``rc`` are :pep:`440`-compliant
pre-release tags.

In addition, there are three special prerelease tags that are treated as if
they were ``rc``: ``c``, ``pre``, and ``preview``.  So, version
``2.4c1``, ``2.4pre1`` and ``2.4preview1`` are all the exact same version as
``2.4rc1``, and are treated as identical by setuptools.

A post-release tag is the string ``.post``, followed by a non-negative integer
value. 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.post1263`` might denote Subversion
revision 1263 of a post-release patch of version ``2.4``. Or you might use
``2.4.post20051127`` to denote a date-stamped post-release. Legacy post-release
tags could be either a series of letters that are alphabetically greater than or
equal to "final", or a dash (``-``) - for example ``2.4-r1263`` or
``2.4-20051127``.

Notice that after each legacy 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.dev41475`` 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
``41475`` 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.9a0.dev0`` are
  identical versions from setuptools' point of view, so you can use whatever
  scheme you prefer. Of these examples, only ``1.9a0.dev0`` is
  :pep:`440`-compliant.

* 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 section for more details.


Tagging and "Daily Build" or "Snapshot" Releases
------------------------------------------------

.. warning::
   Please note that running ``python setup.py ...`` directly is no longer
   considered a good practice and that in the future the commands ``egg_info``
   and ``rotate`` will be deprecated.

   As a result, the instructions and information presented in this section
   should be considered **transitional** while setuptools don't provide a
   mechanism for tagging releases.

   Meanwhile, if you can also consider using :pypi:`setuptools-scm` to achieve
   similar objectives.


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.)

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.
PK"[�8F�M�M9doc/alt-python312-setuptools/docs/userguide/datafiles.rstnu�[���====================
Data Files Support
====================

Old packaging installation methods in the Python ecosystem
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 **inside the package directory**.

Setuptools focuses on this most common type of data files and offers three ways
of specifying which files should be included in your packages, as described in
the following sections.

include_package_data
====================

First, you can simply use the ``include_package_data`` keyword.
For example, if the package tree looks like this::

    project_root_directory
    ├── setup.py        # and/or setup.cfg, pyproject.toml
    └── src
        └── mypkg
            ├── __init__.py
            ├── data1.rst
            ├── data2.rst
            ├── data1.txt
            └── data2.txt

and you supply this configuration:

.. tab:: pyproject.toml

   .. code-block:: toml

        [tool.setuptools]
        # ...
        # By default, include-package-data is true in pyproject.toml, so you do
        # NOT have to specify this line.
        include-package-data = true

        [tool.setuptools.packages.find]
        where = ["src"]

.. tab:: setup.cfg

   .. code-block:: ini

        [options]
        # ...
        packages = find:
        package_dir =
            = src
        include_package_data = True

        [options.packages.find]
        where = src

.. tab:: setup.py

   .. code-block:: python

    from setuptools import setup, find_packages
    setup(
        # ...,
        packages=find_packages(where="src"),
        package_dir={"": "src"},
        include_package_data=True
    )

then all the ``.txt`` and ``.rst`` files will be automatically installed with
your package, provided:

1. These files are included via the :ref:`MANIFEST.in <Using MANIFEST.in>` file,
   like so::

        include src/mypkg/*.txt
        include src/mypkg/*.rst

2. OR, they are being tracked by a revision control system such as Git, Mercurial
   or SVN, and you have configured an appropriate plugin such as
   :pypi:`setuptools-scm` or :pypi:`setuptools-svn`.
   (See the section below on :ref:`Adding Support for Revision
   Control Systems` for information on how to write such plugins.)

.. note::
   .. versionadded:: v61.0.0
      The default value for ``tool.setuptools.include-package-data`` is ``True``
      when projects are configured via ``pyproject.toml``.
      This behaviour differs from ``setup.cfg`` and ``setup.py``
      (where ``include_package_data=False`` by default), which was not changed
      to ensure backwards compatibility with existing projects.

package_data
============

By default, ``include_package_data`` considers **all** non ``.py`` files found inside
the package directory (``src/mypkg`` in this case) as data files, and includes those that
satisfy (at least) one of the above two conditions into the source distribution, and
consequently in the installation of your package.
If you want finer-grained control over what files are included, then you can also use
the ``package_data`` keyword.
For example, if the package tree looks like this::

    project_root_directory
    ├── setup.py        # and/or setup.cfg, pyproject.toml
    └── src
        └── mypkg
            ├── __init__.py
            ├── data1.rst
            ├── data2.rst
            ├── data1.txt
            └── data2.txt

then you can use the following configuration to capture the ``.txt`` and ``.rst`` files as
data files:

.. tab:: pyproject.toml

   .. code-block:: toml

        [tool.setuptools.packages.find]
        where = ["src"]

        [tool.setuptools.package-data]
        mypkg = ["*.txt", "*.rst"]

.. tab:: setup.cfg

   .. code-block:: ini

        [options]
        # ...
        packages = find:
        package_dir =
            = src

        [options.packages.find]
        where = src

        [options.package_data]
        mypkg =
            *.txt
            *.rst

.. tab:: setup.py

    .. code-block:: python

        from setuptools import setup, find_packages
        setup(
            # ...,
            packages=find_packages(where="src"),
            package_dir={"": "src"},
            package_data={"mypkg": ["*.txt", "*.rst"]}
        )

The ``package_data`` argument is a dictionary that maps from package names to
lists of glob patterns. Note that the data files specified using the ``package_data``
option neither require to be included within a :ref:`MANIFEST.in <Using MANIFEST.in>`
file, nor require to be added by a revision control system plugin.

.. note::
        If your glob patterns 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.

.. important::
        Glob patterns do not automatically match dotfiles, i.e., directory or file names
        starting with a dot (``.``). To include such files, you must explicitly start
        the pattern with a dot, e.g. ``.*`` to match ``.gitignore``.

If you have multiple top-level packages and a common pattern of data files for all these
packages, for example::

    project_root_directory
    ├── setup.py        # and/or setup.cfg, pyproject.toml
    └── src
        ├── mypkg1
        │   ├── data1.rst
        │   ├── data1.txt
        │   └── __init__.py
        └── mypkg2
            ├── data2.txt
            └── __init__.py

Here, both packages ``mypkg1`` and ``mypkg2`` share a common pattern of having ``.txt``
data files. However, only ``mypkg1`` has ``.rst`` data files. In such a case, if you want to
use the ``package_data`` option, the following configuration will work:

.. tab:: pyproject.toml

   .. code-block:: toml

        [tool.setuptools.packages.find]
        where = ["src"]

        [tool.setuptools.package-data]
        "*" = ["*.txt"]
        mypkg1 = ["data1.rst"]

.. tab:: setup.cfg

   .. code-block:: ini

        [options]
        packages = find:
        package_dir =
            = src

        [options.packages.find]
        where = src

        [options.package_data]
        * =
          *.txt
        mypkg1 =
          data1.rst

.. tab:: setup.py

   .. code-block:: python

        from setuptools import setup, find_packages
        setup(
            # ...,
            packages=find_packages(where="src"),
            package_dir={"": "src"},
            package_data={"": ["*.txt"], "mypkg1": ["data1.rst"]},
        )

Notice that if you list patterns in ``package_data`` under the empty string ``""`` in
``setup.py``, and the asterisk ``*`` in ``setup.cfg`` and ``pyproject.toml``, these
patterns are used to find files in every package. For example, we use ``""`` or ``*``
to indicate that the ``.txt`` files from all packages should be captured as data files.
These placeholders are treated as a special case, ``setuptools`` **do not**
support glob patterns on package names for this configuration
(patterns are only supported on the file paths).
Also note how we can continue to specify patterns for individual packages, i.e.
we specify that ``data1.rst`` from ``mypkg1`` alone should be captured as well.

.. note::
    When building an ``sdist``, the data files are also drawn from the
    ``package_name.egg-info/SOURCES.txt`` file which works as a form of cache.
    So make sure that this file is removed if ``package_data`` is updated,
    before re-building the package.

.. attention::
   In Python any directory is considered a package
   (even if it does not contain ``__init__.py``,
   see *native namespaces packages* on :doc:`PyPUG:guides/packaging-namespace-packages`).
   Therefore, if you are not relying on :doc:`automatic discovery </userguide/package_discovery>`,
   you *SHOULD* ensure that **all** packages (including the ones that don't
   contain any Python files) are included in the ``packages`` configuration
   (see :doc:`/userguide/package_discovery` for more information).

   Moreover, it is advisable to use full packages name using the dot
   notation instead of a nested path, to avoid error prone configurations.
   Please check :ref:`section subdirectories <subdir-data-files>` below.


exclude_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,
consider a scenario where you have ``include_package_data=True``, and you are using
a revision control system with an appropriate plugin.
Sometimes developers add directory-specific marker files (such as ``.gitignore``,
``.gitkeep``, ``.gitattributes``, or ``.hgignore``), these files are probably being
tracked by the revision control system, and therefore by default they will be
included when the package is installed.

Supposing you want to prevent these files from being included in the
installation (they are not relevant to Python or the package), then you could
use the ``exclude_package_data`` option:

.. tab:: pyproject.toml

   .. code-block:: toml

        [tool.setuptools.packages.find]
        where = ["src"]

        [tool.setuptools.exclude-package-data]
        mypkg = [".gitattributes"]

.. tab:: setup.cfg

   .. code-block:: ini

        [options]
        # ...
        packages = find:
        package_dir =
            = src
        include_package_data = True

        [options.packages.find]
        where = src

        [options.exclude_package_data]
        mypkg =
            .gitattributes

.. tab:: setup.py

    .. code-block:: python

        from setuptools import setup, find_packages
        setup(
            # ...,
            packages=find_packages(where="src"),
            package_dir={"": "src"},
            include_package_data=True,
            exclude_package_data={"mypkg": [".gitattributes"]},
        )

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, you can use the empty string key ``""`` in ``setup.py`` and the
asterisk ``*`` in ``setup.cfg`` and ``pyproject.toml`` to match all top-level packages.

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``.


.. _subdir-data-files:

Subdirectory for Data Files
===========================

A common pattern is where some (or all) of the data files are placed under
a separate subdirectory. For example::

    project_root_directory
    ├── setup.py        # and/or setup.cfg, pyproject.toml
    └── src
        └── mypkg
            ├── data
            │   ├── data1.rst
            │   └── data2.rst
            ├── __init__.py
            ├── data1.txt
            └── data2.txt

Here, the ``.rst`` files are placed under a ``data`` subdirectory inside ``mypkg``,
while the ``.txt`` files are directly under ``mypkg``.

In this case, the recommended approach is to treat ``data`` as a namespace package
(refer :pep:`420`). With ``package_data``,
the configuration might look like this:

.. tab:: pyproject.toml

   .. code-block:: toml

        # Scanning for namespace packages in the ``src`` directory is true by
        # default in pyproject.toml, so you do NOT need to include the
        # `tool.setuptools.packages.find` if it looks like the following:
        # [tool.setuptools.packages.find]
        # namespaces = true
        # where = ["src"]

        [tool.setuptools.package-data]
        mypkg = ["*.txt"]
        "mypkg.data" = ["*.rst"]

.. tab:: setup.cfg

   .. code-block:: ini

        [options]
        # ...
        packages = find_namespace:
        package_dir =
            = src

        [options.packages.find]
        where = src

        [options.package_data]
        mypkg =
            *.txt
        mypkg.data =
            *.rst

.. tab:: setup.py

   .. code-block:: python

        from setuptools import setup, find_namespace_packages
        setup(
            # ...,
            packages=find_namespace_packages(where="src"),
            package_dir={"": "src"},
            package_data={
                "mypkg": ["*.txt"],
                "mypkg.data": ["*.rst"],
            }
        )

In other words, we allow Setuptools to scan for namespace packages in the ``src`` directory,
which enables the ``data`` directory to be identified, and then, we separately specify data
files for the root package ``mypkg``, and the namespace package ``data`` under the package
``mypkg``.

With ``include_package_data`` the configuration is simpler: you simply need to enable
scanning of namespace packages in the ``src`` directory and the rest is handled by Setuptools.

.. tab:: pyproject.toml

   .. code-block:: toml

        [tool.setuptools]
        # ...
        # By default, include-package-data is true in pyproject.toml, so you do
        # NOT have to specify this line.
        include-package-data = true

        [tool.setuptools.packages.find]
        # scanning for namespace packages is true by default in pyproject.toml, so
        # you need NOT include the following line.
        namespaces = true
        where = ["src"]

.. tab:: setup.cfg

   .. code-block:: ini

        [options]
        packages = find_namespace:
        package_dir =
            = src
        include_package_data = True

        [options.packages.find]
        where = src

.. tab:: setup.py

   .. code-block:: python

        from setuptools import setup, find_namespace_packages
        setup(
            # ... ,
            packages=find_namespace_packages(where="src"),
            package_dir={"": "src"},
            include_package_data=True,
        )

Summary
=======

In summary, the three options allow you to:

``include_package_data``
    Accept all data files and directories matched by
    :ref:`MANIFEST.in <Using MANIFEST.in>` or added by
    a :ref:`plugin <Adding Support for Revision Control Systems>`.

``package_data``
    Specify additional patterns to match files that may or may
    not be matched by :ref:`MANIFEST.in <Using MANIFEST.in>`
    or added by a :ref:`plugin <Adding Support for Revision Control Systems>`.

``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 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 manually deleting 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 also manually delete them.


.. _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. For example, if you have a structure
like this::

    project_root_directory
    ├── setup.py        # and/or setup.cfg, pyproject.toml
    └── src
        └── mypkg
            ├── data
            │   └── data1.txt
            ├── __init__.py
            └── foo.py

Then, in ``mypkg/foo.py``, you may try something like this in order to access
``mypkg/data/data1.txt``:

.. code-block:: python

   import os
   data_path = os.path.join(os.path.dirname(__file__), 'data', 'data1.txt')
   with open(data_path, 'r') as data_file:
        ...

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 :mod:`importlib.resources` to access them.
In this case, you would do something like this:

.. code-block:: python

   from importlib.resources import files
   data_text = files('mypkg.data').joinpath('data1.txt').read_text()

:mod:`importlib.resources` was added to Python 3.7. However, the API illustrated in
this code (using ``files()``) was added only in Python 3.9, [#files_api]_ and support
for accessing data files via namespace packages was added only in Python 3.10 [#namespace_support]_
(the ``data`` subdirectory is a namespace package under the root package ``mypkg``).
Therefore, you may find this code to work only in Python 3.10 (and above). For other
versions of Python, you are recommended to use the :pypi:`importlib-resources` backport
which provides the latest version of this library. In this case, the only change that
has to be made to the above code is to replace ``importlib.resources`` with ``importlib_resources``, i.e.

.. code-block:: python

   from importlib_resources import files
   ...

See :doc:`importlib-resources:using` for detailed instructions.

.. tip:: Files inside the package directory should be *read-only* to avoid a
   series of common problems (e.g. when multiple users share a common Python
   installation, when the package is loaded from a zip file, or when multiple
   instances of a Python application run in parallel).

   If your Python package needs to write to a file for shared data or configuration,
   you can use standard platform/OS-specific system directories, such as
   ``~/.local/config/$appname`` or ``/usr/share/$appname/$version`` (Linux specific) [#system-dirs]_.
   A common approach is to add a read-only template file to the package
   directory that is then copied to the correct system directory if no
   pre-existing file is found.


Data Files from Plugins and Extensions
======================================

You can resort to a :doc:`native/implicit namespace package
<PyPUG:guides/packaging-namespace-packages>` (as a container for files)
if you want plugins and extensions to your package to contribute with package data files.
This way, all files will be listed during runtime
when :doc:`using importlib.resources <importlib-resources:using>`.
Note that, although not strictly guaranteed, mainstream Python package managers,
like :pypi:`pip` and derived tools, will install files belong to multiple distributions
that share a same namespace into the same directory in the file system.
This means that the overhead for :mod:`importlib.resources` will be minimum.


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 **inside the package**.


----

.. [#system-dirs] These locations can be discovered with the help of
   third-party libraries such as :pypi:`platformdirs`.

.. [#files_api] Reference: https://importlib-resources.readthedocs.io/en/latest/using.html#migrating-from-legacy

.. [#namespace_support] Reference: https://github.com/python/importlib_resources/pull/196#issuecomment-734520374
PK"[�)�FF;doc/alt-python312-setuptools/docs/userguide/ext_modules.rstnu�[���==========================
Building Extension Modules
==========================

Setuptools can build C/C++ extension modules.  The keyword argument
``ext_modules`` of ``setup()`` should be a list of instances of the
:class:`setuptools.Extension` class.


For example, let's consider a simple project with only one extension module::

    <project_folder>
    ├── pyproject.toml
    └── foo.c

and all project metadata configuration in the ``pyproject.toml`` file:

.. code-block:: toml

   # pyproject.toml
   [build-system]
   requires = ["setuptools"]
   build-backend = "setuptools.build_meta"

   [project]
   name = "mylib-foo"  # as it would appear on PyPI
   version = "0.42"

To instruct setuptools to compile the ``foo.c`` file into the extension module
``mylib.foo``, we need to add a ``setup.py`` file similar to the following:

.. code-block:: python

   from setuptools import Extension, setup

   setup(
       ext_modules=[
           Extension(
               name="mylib.foo",  # as it would be imported
                                  # may include packages/namespaces separated by `.`

               sources=["foo.c"], # all sources are compiled into a single binary file
           ),
       ]
   )

.. seealso::
   You can find more information on the `Python docs about C/C++ extensions`_.
   Alternatively, you might also be interested in learning about `Cython`_.

   If you plan to distribute a package that uses extensions across multiple
   platforms, :pypi:`cibuildwheel` can also be helpful.

.. important::
   All files used to compile your extension need to be available on the system
   when building the package, so please make sure to include some documentation
   on how developers interested in building your package from source
   can obtain operating system level dependencies
   (e.g. compilers and external binary libraries/artifacts).

   You will also need to make sure that all auxiliary files that are contained
   inside your :term:`project` (e.g. C headers authored by you or your team)
   are configured to be included in your :term:`sdist <Source Distribution (or "sdist")>`.
   Please have a look on our section on :ref:`Controlling files in the distribution`.


Compiler and linker options
===========================

The command ``build_ext`` builds C/C++ extension modules.  It creates
a command line for running the compiler and linker by combining
compiler and linker options from various sources:

.. Reference: `test_customize_compiler` in distutils/tests/test_sysconfig.py

* the ``sysconfig`` variables ``CC``, ``CXX``, ``CCSHARED``,
  ``LDSHARED``, and ``CFLAGS``,
* the environment variables ``CC``, ``CPP``,
  ``CXX``, ``LDSHARED`` and ``CFLAGS``,
  ``CPPFLAGS``, ``LDFLAGS``,
* the ``Extension`` attributes ``include_dirs``,
  ``library_dirs``, ``extra_compile_args``, ``extra_link_args``,
  ``runtime_library_dirs``.

.. Ignoring AR, ARFLAGS, RANLIB here because they are used by the (obsolete?) build_clib, not build_ext.

Specifically, if the environment variables ``CC``, ``CPP``, ``CXX``, and ``LDSHARED``
are set, they will be used instead of the ``sysconfig`` variables of the same names.

The compiler options appear in the command line in the following order:

.. Reference: "compiler_so" and distutils.ccompiler.gen_preprocess_options, CCompiler.compile, UnixCCompiler._compile

* first, the options provided by the ``sysconfig`` variable ``CFLAGS``,
* then, the options provided by the environment variables ``CFLAGS`` and ``CPPFLAGS``,
* then, the options provided by the ``sysconfig`` variable ``CCSHARED``,
* then, a ``-I`` option for each element of ``Extension.include_dirs``,
* finally, the options provided by ``Extension.extra_compile_args``.

The linker options appear in the command line in the following order:

.. Reference: "linker_so" and CCompiler.link

* first, the options provided by environment variables and ``sysconfig`` variables,
* then, a ``-L`` option for each element of ``Extension.library_dirs``,
* then, a linker-specific option like ``-Wl,-rpath`` for each element of ``Extension.runtime_library_dirs``,
* finally, the options provided by ``Extension.extra_link_args``.

The resulting command line is then processed by the compiler and linker.
According to the GCC manual sections on `directory options`_ and
`environment variables`_, the C/C++ compiler searches for files named in
``#include <file>`` directives in the following order:

* first, in directories given by ``-I`` options (in left-to-right order),
* then, in directories given by the environment variable ``CPATH`` (in left-to-right order),
* then, in directories given by ``-isystem`` options (in left-to-right order),
* then, in directories given by the environment variable ``C_INCLUDE_PATH`` (for C) and ``CPLUS_INCLUDE_PATH`` (for C++),
* then, in standard system directories,
* finally, in directories given by ``-idirafter`` options (in left-to-right order).

The linker searches for libraries in the following order:

* first, in directories given by ``-L`` options (in left-to-right order),
* then, in directories given by the environment variable ``LIBRARY_PATH`` (in left-to-right order).


Distributing Extensions compiled with Cython
============================================

When your :pypi:`Cython` extension modules *are declared using the*
:class:`setuptools.Extension` *class*, ``setuptools`` will detect at build time
whether Cython is installed or not.

If Cython is present, then ``setuptools`` will use it to build the ``.pyx`` files.
Otherwise, ``setuptools`` will try to find and compile the equivalent ``.c`` files
(instead of ``.pyx``). These files can be generated using the
`cython command line tool`_.

You can ensure that Cython is always automatically installed into the build
environment by including it as a :ref:`build dependency <build-requires>` in
your ``pyproject.toml``:

.. code-block:: toml

    [build-system]
    requires = [
        # ...,
        "cython",
    ]

Alternatively, you can include the ``.c`` code that is pre-compiled by Cython
into your source distribution, alongside the original ``.pyx`` files (this
might save a few seconds when building from an ``sdist``).
To improve version compatibility, you probably also want to include current
``.c`` files in your :wiki:`revision control system`, and rebuild them whenever
you check changes in for the ``.pyx`` source files.
This will ensure that people tracking your project will be able to build it
without installing Cython, and that there will be no variation due to small
differences in the generate C files.
Please checkout our docs on :ref:`controlling files in the distribution` for
more information.

----

Extension API Reference
=======================

.. autoclass:: setuptools.Extension


.. _Python docs about C/C++ extensions: https://docs.python.org/3/extending/extending.html
.. _Cython: https://cython.readthedocs.io/en/stable/index.html
.. _directory options: https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html
.. _environment variables: https://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html
.. _cython command line tool: https://cython.readthedocs.io/en/stable/src/userguide/source_files_and_compilation.html
PK"[���ee5doc/alt-python312-setuptools/docs/userguide/index.rstnu�[���==================================================
Building and Distributing Packages with Setuptools
==================================================

The first step towards sharing a Python library or program is to build a
distribution package [#package-overload]_. This includes adding a set of
additional files containing metadata and configuration to not only instruct
``setuptools`` on how the distribution should be built but also
to help installer (such as :pypi:`pip`) during the installation process.

This document contains information to help Python developers through this
process. Please check the :doc:`/userguide/quickstart` for an overview of
the workflow.

Also note that ``setuptools`` is what is known in the community as :pep:`build
backend <517#terminology-and-goals>`, user facing interfaces are provided by tools
such as :pypi:`pip` and :pypi:`build`. To use ``setuptools``, one must
explicitly create a ``pyproject.toml`` file as described :doc:`/build_meta`.


Contents
========

.. toctree::
    :maxdepth: 1

    quickstart
    package_discovery
    dependency_management
    development_mode
    entry_point
    datafiles
    ext_modules
    distribution
    miscellaneous
    extension
    declarative_config
    pyproject_config

---

.. rubric:: Notes

.. [#package-overload]
   A :term:`Distribution Package` is also referred in the Python community simply as "package"
   Unfortunately, this jargon might be a bit confusing for new users because the term package
   can also to refer any :term:`directory <package>` (or sub directory) used to organize
   :term:`modules <module>` and auxiliary files.
PK"[��"Fa%a%=doc/alt-python312-setuptools/docs/userguide/miscellaneous.rstnu�[���.. _Controlling files in the distribution:

Controlling files in the distribution
=====================================

For the most common use cases, ``setuptools`` will automatically find out which
files are necessary for distributing the package. More precisely, the following
files are included in a source distribution by default:

- :term:`pure Python module <Pure Module>` files implied by the ``py-modules`` and ``packages``
  configuration parameters in ``pyproject.toml`` and/or equivalent
  in ``setup.cfg``/``setup.py``;
- C source files mentioned in the ``ext_modules`` or ``libraries``
  ``setup()`` arguments;
- Files that match the following glob patterns: ``tests/test*.py``,
  ``test/test*.py``;
- Scripts specified by the ``scripts-files`` configuration parameter
  in ``pyproject.toml`` or ``scripts`` in ``setup.py``/``setup.cfg``;
- All files specified by the ``package-data`` and ``data-files``
  configuration parameters in ``pyproject.toml`` and/or equivalent
  in ``setup.cfg``/``setup.py``;
- The file specified by the ``license_file`` option in ``setup.cfg``;
- All files specified by the ``license-files`` configuration parameter
  in ``pyproject.toml`` and/or equivalent in ``setup.cfg``/``setup.py``;
  note that if you don't explicitly set this parameter, ``setuptools``
  will include any files that match the following glob patterns:
  ``LICENSE*``, ``LICENCE*``, ``COPYING*``, ``NOTICE*``, ``AUTHORS**``;
- ``pyproject.toml``;
- ``setup.cfg``;
- ``setup.py``;
- ``README``, ``README.txt``, ``README.rst`` or ``README.md``;
- ``MANIFEST.in``

Please note that the list above is guaranteed to work with the last stable version
of ``setuptools``. The behavior of older versions might differ.

.. note::
   .. versionadded:: v68.3.0
      ``setuptools`` will attempt to include type information files
      by default in the distribution
      (``.pyi`` and ``py.typed``, as specified in :pep:`561`).

    *Please note however that this feature is* **EXPERIMENTAL** *and may change in
    the future.*

    If you have ``.pyi`` and ``py.typed`` files in your project, but do not
    wish to distribute them, you can opt out by setting
    :doc:`exclude-package-data </userguide/datafiles>` to remove them.

However, when building more complex packages (e.g. packages that include
non-Python files, or that need to use custom C headers), you might find that
not all files present in your project folder are included in package
:term:`distribution archive <Distribution Package>`.

If you are using a :wiki:`Revision Control System`, such as git_ or mercurial_,
and your source distributions only need to include files that you're
tracking in revision control, you can use a ``setuptools`` :ref:`plugin <Adding
Support for Revision Control Systems>`, such as :pypi:`setuptools-scm` or
:pypi:`setuptools-svn` to automatically include all tracked files into the ``sdist``.

.. _Using MANIFEST.in:

Alternatively, if you need finer control over the files (e.g. you don't want to
distribute :wiki:`CI/CD`-related files) or you need automatically generated files,
you can add a ``MANIFEST.in`` file at the root of your project,
to specify any files that the default file location algorithm doesn't catch.

This file contains instructions that tell ``setuptools`` which files exactly
should be part of the ``sdist`` (or not).

.. attention::
   Please note that ``setuptools`` supports the ``MANIFEST.in``,
   and not ``MANIFEST`` (no extension). Any documentation, tutorial or example
   that recommends using ``MANIFEST`` (no extension) is likely outdated.

.. tip::
   The ``MANIFEST.in`` file contains commands that allow you to discover and
   manipulate lists of files. There are many commands that can be used with
   different objectives, but you should try to not make your ``MANIFEST.in``
   file too fine grained.

   A good idea is to start with a ``graft`` command (to add all
   files inside a set of directories) and then fine tune the file selection
   by removing the excess or adding isolated files.


A :file:`MANIFEST.in` file consists of commands, one per line, instructing
setuptools to add or remove some set of files from the sdist.  The commands
are:

=========================================================  ==================================================================================================
Command                                                    Description
=========================================================  ==================================================================================================
:samp:`include {pat1} {pat2} ...`                          Add all files matching any of the listed patterns
                                                           (Files must be given as paths relative to the root of the project)
:samp:`exclude {pat1} {pat2} ...`                          Remove all files matching any of the listed patterns
                                                           (Files must be given as paths relative to the root of the project)
:samp:`recursive-include {dir-pattern} {pat1} {pat2} ...`  Add all files under directories matching ``dir-pattern`` that match any of the listed patterns
:samp:`recursive-exclude {dir-pattern} {pat1} {pat2} ...`  Remove all files under directories matching ``dir-pattern`` that match any of the listed patterns
:samp:`global-include {pat1} {pat2} ...`                   Add all files anywhere in the source tree matching any of the listed patterns
:samp:`global-exclude {pat1} {pat2} ...`                   Remove all files anywhere in the source tree matching any of the listed patterns
:samp:`graft {dir-pattern}`                                Add all files under directories matching ``dir-pattern``
:samp:`prune {dir-pattern}`                                Remove all files under directories matching ``dir-pattern``
=========================================================  ==================================================================================================

The patterns here are glob-style patterns: ``*`` matches zero or more regular
filename characters (on Unix, everything except forward slash; on Windows,
everything except backslash and colon); ``?`` matches a single regular filename
character, and ``[chars]`` matches any one of the characters between the square
brackets (which may contain character ranges, e.g., ``[a-z]`` or
``[a-fA-F0-9]``).  Setuptools also has support for ``**`` matching
zero or more characters including forward slash, backslash, and colon.

Directory patterns are relative to the root of the project directory; e.g.,
``graft example*`` will include a directory named :file:`examples` in the
project root but will not include :file:`docs/examples/`.

File & directory names in :file:`MANIFEST.in` should be ``/``-separated;
setuptools will automatically convert the slashes to the local platform's
appropriate directory separator.

Commands are processed in the order they appear in the :file:`MANIFEST.in`
file.  For example, given the commands:

.. code-block:: bash

    graft tests
    global-exclude *.py[cod]

the contents of the directory tree :file:`tests` will first be added to the
sdist, and then after that all files in the sdist with a ``.pyc``, ``.pyo``, or
``.pyd`` extension will be removed from the sdist.  If the commands were in the
opposite order, then ``*.pyc`` files etc. would be only be removed from what
was already in the sdist before adding :file:`tests`, and if :file:`tests`
happened to contain any ``*.pyc`` files, they would end up included in the
sdist because the exclusion happened before they were included.

An example of ``MANIFEST.in`` for a simple project that organized according to a
:ref:`src-layout` is:

.. code-block:: bash

   # MANIFEST.in -- just for illustration
   graft src
   graft tests
   graft docs
   # `-> adds all files inside a directory

   include tox.ini
   # `-> matches file paths relative to the root of the project

   global-exclude *~ *.py[cod] *.so
   # `-> matches file names (regardless of directory)

Once the correct files are present in the ``sdist``, they can then be used by
binary extensions during the build process, or included in the final
:term:`wheel <Wheel>` [#build-process]_ if you configure ``setuptools`` with
``include_package_data=True``.

.. important::
   Please note that, when using ``include_package_data=True``, only files **inside
   the package directory** are included in the final ``wheel``, by default.

   So for example, if you create a :term:`Python project <Project>` that uses
   :pypi:`setuptools-scm` and have a ``tests`` directory outside of the package
   folder, the ``tests`` directory will be present in the ``sdist`` but not in the
   ``wheel`` [#wheel-vs-sdist]_.

   See :doc:`/userguide/datafiles` for more information.

----

.. [#build-process]
   You can think about the build process as two stages: first the ``sdist``
   will be created and then the ``wheel`` will be produced from that ``sdist``.

.. [#wheel-vs-sdist]
   This happens because the ``sdist`` can contain files that are useful during
   development or the build process itself, but not in runtime (e.g. tests,
   docs, examples, etc...).
   The ``wheel``, on the other hand, is a file format that has been optimized
   and is ready to be unpacked into a running installation of Python or
   :term:`Virtual Environment`.
   Therefore it only contains items that are required during runtime.

.. _git: https://git-scm.com
.. _mercurial: https://www.mercurial-scm.org
PK"[�=��I-I-Edoc/alt-python312-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.

Each dependency, regardless of type, needs to be specified according to :pep:`508`
and :pep:`440`.
This allows adding version :pep:`range restrictions <440#version-specifiers>`
and :ref:`environment markers <environment-markers>`.


.. _build-requires:

Build system requirement
========================

After organizing all the scripts and files and getting ready for packaging,
there needs to be a way to specify what programs and libraries are actually needed
do the packaging (in our case, ``setuptools`` of course).
This needs to be specified in your ``pyproject.toml`` file
(if you have forgot what this is, go to :doc:`/userguide/quickstart` or :doc:`/build_meta`):

.. code-block:: toml

    [build-system]
    requires = ["setuptools"]
    #...

Please note that you should also include here any other ``setuptools`` plugin
(e.g., :pypi:`setuptools-scm`, :pypi:`setuptools-golang`, :pypi:`setuptools-rust`)
or build-time dependency (e.g., :pypi:`Cython`, :pypi:`cppy`, :pypi:`pybind11`).

.. note::
    In previous versions of ``setuptools``,
    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`` supports automatically downloading and installing
these dependencies when the package is installed. Although there is more
finesse to it, let's start with a simple example.

.. tab:: pyproject.toml

    .. code-block:: toml

        [project]
        # ...
        dependencies = [
            "docutils",
            "BazSpam == 1.1",
        ]
        # ...

.. 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 :pypi:`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.


.. _environment-markers:

Platform specific dependencies
------------------------------
Setuptools offers 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:: pyproject.toml

    .. code-block:: toml

        [project]
        # ...
        dependencies = [
            "enum34; python_version<'3.4'",
        ]
        # ...

.. 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:: pyproject.toml

    .. code-block:: toml

        [project]
        # ...
        dependencies = [
            "enum34; python_version<'3.4'",
            "pywin32 >= 1.0; platform_system=='Windows'",
        ]
        # ...

.. 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`.

.. seealso::
   Alternatively, a :ref:`backend wrapper <backend-wrapper>` can be used for
   specific use cases where environment markers aren't sufficient.


Direct URL dependencies
-----------------------

.. attention::
   `PyPI`_ and other standards-conformant package indices **do not** accept
   packages that declare dependencies using direct URLs. ``pip`` will accept them
   when installing packages from the local filesystem or from another URL,
   however.

Dependencies that are not available on a package index but can be downloaded
elsewhere in the form of a source repository or archive may be specified
using a variant of :pep:`PEP 440's direct references <440#direct-references>`:

.. tab:: pyproject.toml

    .. code-block:: toml

        [project]
        # ...
        dependencies = [
            "Package-A @ git+https://example.net/package-a.git@main",
            "Package-B @ https://example.net/archives/package-b.whl",
        ]

.. tab:: setup.cfg

    .. code-block:: ini

        [options]
        #...
        install_requires =
            Package-A @ git+https://example.net/package-a.git@main
            Package-B @ https://example.net/archives/package-b.whl

.. tab:: setup.py

    .. code-block:: python

        setup(
            install_requires=[
               "Package-A @ git+https://example.net/package-a.git@main",
               "Package-B @ https://example.net/archives/package-b.whl",
            ],
            ...,
        )

For source repository URLs, a list of supported protocols and VCS-specific
features such as selecting certain branches or tags can be found in pip's
documentation on `VCS support <https://pip.pypa.io/en/latest/topics/vcs-support/>`_.
Supported formats for archive URLs are sdists and wheels.


Optional dependencies
=====================
Setuptools allows you to declare dependencies that are not installed by default.
This effectively means that you can create a "variant" of your package with a
set of extra functionalities.

For example, let's consider a ``Package-A`` that offers
optional PDF support and requires two other dependencies for it to work:

.. tab:: pyproject.toml

    .. code-block:: toml

        [project]
        name = "Package-A"
        # ...
        [project.optional-dependencies]
        PDF = ["ReportLab>=1.2", "RXP"]

.. 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="Package-A",
            ...,
            extras_require={
                "PDF": ["ReportLab>=1.2", "RXP"],
            },
        )

.. sidebar::

   .. tip::
      It is also convenient to declare optional requirements for
      ancillary tasks such as running tests and or building docs.

The name ``PDF`` is an arbitrary :pep:`identifier <685>` of such a list of dependencies, to
which other components can refer and have them installed.

A use case for this approach is that other package can use this "extra" for their
own dependencies. For example, if ``Package-B`` needs ``Package-A`` with PDF support
installed, it might declare the dependency like this:

.. tab:: pyproject.toml

    .. code-block:: toml

        [project]
        name = "Package-B"
        # ...
        dependencies = [
            "Package-A[PDF]"
        ]

.. tab:: setup.cfg

    .. code-block:: ini

        [metadata]
        name = Package-B
        #...

        [options]
        #...
        install_requires =
            Package-A[PDF]

.. tab:: setup.py

    .. code-block:: python

        setup(
            name="Package-B",
            install_requires=["Package-A[PDF]"],
            ...,
        )

This will cause ``ReportLab`` to be installed along with ``Package-A``, if ``Package-B`` is
installed -- even if ``Package-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 ``Package-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, ``Package-B``'s setup information does
not need to change, but the right packages will still be installed if needed.

.. tip::
    Best practice: if a project ends up no longer 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).

.. warning::
    Historically ``setuptools`` also used to support extra dependencies in console
    scripts, for example:

    .. tab:: setup.cfg

        .. code-block:: ini

            [metadata]
            name = Package-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="Package-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).

    **However**, ``pip`` and other tools might not support this use case for extra
    dependencies, therefore this practice is considered **deprecated**.
    See :doc:`PyPUG:specifications/entry-points`.


Python requirement
==================
In some cases, you might need to specify the minimum required python version.
This can be configured as shown in the example below.

.. tab:: pyproject.toml

    .. code-block:: toml

        [project]
        name = "Package-B"
        requires-python = ">=3.6"
        # ...

.. tab:: setup.cfg

    .. code-block:: ini

        [metadata]
        name = Package-B
        #...

        [options]
        #...
        python_requires = >=3.6

.. tab:: setup.py

    .. code-block:: python

        setup(
            name="Package-B",
            python_requires=">=3.6",
            ...,
        )


.. _PyPI: https://pypi.org
PK"[c�g���-doc/alt-python312-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"[�ye?`p`p3doc/alt-python312-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.

.. attention::
   Use of ``pkg_resources`` is deprecated in favor of
   :mod:`importlib.resources`, :mod:`importlib.metadata`
   and their backports (:pypi:`importlib_resources`, :pypi:`importlib_metadata`).
   Some useful APIs are also provided by :pypi:`packaging` (e.g. requirements
   and version parsing).
   Users should refrain from new usage of ``pkg_resources`` and
   should work to port to importlib-based solutions.


--------
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: https://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 ``bytes``.  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"[f4&�g#g#)doc/alt-python312-setuptools/docs/conf.pynu�[���extensions = [
    'sphinx.ext.autodoc',
    'jaraco.packaging.sphinx',
]

master_doc = "index"
html_theme = "furo"

# Link dates and other references in the changelog
extensions += ['rst.linker']
link_files = {
    '../NEWS.rst': dict(
        using=dict(
            BB='https://bitbucket.org',
            GH='https://github.com',
        ),
        replace=[
            dict(
                pattern=r'(Issue #|\B#)(?P<issue>\d+)',
                url='{package_url}/issues/{issue}',
            ),
            dict(
                pattern=r'(?m:^((?P<scm_version>v?\d+(\.\d+){1,2}))\n[-=]+\n)',
                with_scm='{text}\n{rev[timestamp]:%d %b %Y}\n',
            ),
            dict(
                pattern=r'PEP[- ](?P<pep_number>\d+)',
                url='https://peps.python.org/pep-{pep_number:0>4}/',
            ),
            dict(
                pattern=r'(?<!\w)PR #(?P<pull>\d+)',
                url='{package_url}/pull/{pull}',
            ),
            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='https://bugs.python.org/setuptools/issue{old_setuptools}',
            ),
            dict(
                pattern=r'Jython #(?P<jython>\d+)',
                url='https://bugs.jython.org/issue{jython}',
            ),
            dict(
                pattern=r'(Python #|bpo-)(?P<python>\d+)',
                url='https://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'setuptools_svn #(?P<setuptools_svn>\d+)',
                url='{GH}/jaraco/setuptools_svn/issues/{setuptools_svn}',
            ),
            dict(
                pattern=r'pypa/(?P<issue_repo>[\-\.\w]+)#(?P<issue_number>\d+)',
                url='{GH}/pypa/{issue_repo}/issues/{issue_number}',
            ),
            dict(
                pattern=r'pypa/(?P<commit_repo>[\-\.\w]+)@(?P<commit_number>[\da-f]+)',
                url='{GH}/pypa/{commit_repo}/commit/{commit_number}',
            ),
        ],
    ),
}

# Be strict about any broken references
nitpicky = True

# Include Python intersphinx mapping to prevent failures
# jaraco/skeleton#51
extensions += ['sphinx.ext.intersphinx']
intersphinx_mapping = {
    'python': ('https://docs.python.org/3', None),
}

# Preserve authored syntax for defaults
autodoc_preserve_defaults = True

intersphinx_mapping.update(
    {
        'pip': ('https://pip.pypa.io/en/latest', None),
        'build': ('https://pypa-build.readthedocs.io/en/latest', None),
        'PyPUG': ('https://packaging.python.org/en/latest/', None),
        'packaging': ('https://packaging.pypa.io/en/latest/', None),
        'twine': ('https://twine.readthedocs.io/en/stable/', None),
        'importlib-resources': (
            'https://importlib-resources.readthedocs.io/en/latest',
            None,
        ),
    }
)

# Add support for linking usernames
github_url = 'https://github.com'
github_repo_org = 'pypa'
github_repo_name = 'setuptools'
github_repo_slug = f'{github_repo_org}/{github_repo_name}'
github_repo_url = f'{github_url}/{github_repo_slug}'
github_sponsors_url = f'{github_url}/sponsors'
extlinks = {
    'user': (f'{github_sponsors_url}/%s', '@%s'),  # noqa: WPS323
    'pypi': ('https://pypi.org/project/%s', '%s'),  # noqa: WPS323
    'wiki': ('https://wikipedia.org/wiki/%s', '%s'),  # noqa: WPS323
}
extensions += ['sphinx.ext.extlinks']

# Ref: https://github.com/python-attrs/attrs/pull/571/files\
#      #diff-85987f48f1258d9ee486e3191495582dR82
default_role = 'any'

# HTML theme
html_theme = 'furo'
html_logo = "images/logo.svg"

html_theme_options = {
    "sidebar_hide_name": True,
    "light_css_variables": {
        "color-brand-primary": "#336790",  # "blue"
        "color-brand-content": "#336790",
    },
    "dark_css_variables": {
        "color-brand-primary": "#E5B62F",  # "yellow"
        "color-brand-content": "#E5B62F",
    },
}

# Redirect old docs so links and references in the ecosystem don't break
extensions += ['sphinx_reredirects']
redirects = {
    "userguide/keywords": "/deprecated/changed_keywords.html",
    "userguide/commands": "/deprecated/commands.html",
}

# 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
    ('envvar', 'DIST_EXTRA_CONFIG'),  # 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:exc', 'setuptools.errors.PlatformError'),  # sphinx cannot find it
    ('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),
    python=('https://docs.python.org/3.11/', None),
    # ^-- Python 3.11 is required because it still contains `distutils`.
    #     Just leaving it as `3` would imply 3.12+, but that causes an
    #     error with the cross references to distutils functions.
    #     Inventory cache may cause errors, deleting it solves the problem.
)

# 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
# sphinx-contrib/sphinxcontrib-towncrier#81
towncrier_draft_config_path = 'towncrier.toml'

extensions += ['jaraco.tidelift']

# Add icons (aka "favicons") to documentation
extensions += ['sphinx_favicon']
html_static_path = ['images']  # should contain the folder with icons

# Add support for nice Not Found 404 pages
extensions += ['notfound.extension']

# List of dicts with <link> HTML attributes
# static-file points to files in the html_static_path (href is computed)
favicons = [
    {  # "Catch-all" goes first, otherwise some browsers will overwrite
        "rel": "icon",
        "type": "image/svg+xml",
        "static-file": "logo-symbol-only.svg",
        "sizes": "any",
    },
    {  # Version with thicker strokes for better visibility at smaller sizes
        "rel": "icon",
        "type": "image/svg+xml",
        "static-file": "favicon.svg",
        "sizes": "16x16 24x24 32x32 48x48",
    },
    # rel="apple-touch-icon" does not support SVG yet
]
PK"[J�ٞMM9doc/alt-python312-setuptools/docs/references/keywords.rstnu�[���========
Keywords
========

The following are keywords ``setuptools.setup()`` accepts.
They allow configuring the build process for a Python distribution or adding
metadata via a ``setup.py`` script placed at the root of your project.
All of them are optional; you do not have to supply them unless you need the
associated ``setuptools`` feature.

Metadata and configuration supplied via ``setup()`` is complementary to (and
may be overwritten by) the information present in ``setup.cfg`` and ``pyproject.toml``.
Some important metadata, such as ``name`` and ``version``, may assume
a default *degenerate* value if not specified.

Users are strongly encouraged to use a declarative config either via
:doc:`setup.cfg </userguide/declarative_config>` or :doc:`pyproject.toml
</userguide/pyproject_config>` and only rely on ``setup.py`` if they need to
tap into special behaviour that requires scripting (such as building C
extensions).

.. note::
   When using declarative configs via ``pyproject.toml``
   with ``setuptools<64.0.0``, users can still keep a very simple ``setup.py``
   just to ensure editable installs are supported, for example::

       from setuptools import setup

       setup()

   Versions of ``setuptools`` ``>=64.0.0`` do not require this extra minimal
   ``setup.py`` file.

.. _keyword/name:

``name``
    A string specifying the name of the package.

.. _keyword/version:

``version``
    A string specifying the version number of the package.

.. _keyword/description:

``description``
    A string describing the package in a single line.

.. _keyword/long_description:

``long_description``
    A string providing a longer description of the package.

.. _keyword/long_description_content_type:

``long_description_content_type``
    A string specifying the content type is used for the ``long_description``
    (e.g. ``text/markdown``)

.. _keyword/author:

``author``
    A string specifying the author of the package.

.. _keyword/author_email:

``author_email``
    A string specifying the email address of the package author.

.. _keyword/maintainer:

``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``.

.. _keyword/maintainer_email:

``maintainer_email``
    A string specifying the email address of the current maintainer, if
    different from the author.

.. _keyword/url:

``url``
    A string specifying the URL for the package homepage.

.. _keyword/download_url:

``download_url``
    A string specifying the URL to download the package.

.. _keyword/packages:

``packages``
    A list of strings specifying the packages that setuptools will manipulate.

.. _keyword/py_modules:

``py_modules``
    A list of strings specifying the modules that setuptools will manipulate.

.. _keyword/scripts:

``scripts``
    A list of strings specifying the standalone script files to be built and
    installed.

.. _keyword/ext_package:

``ext_package``
    A string specifying the base package name for the extensions provided by
    this package.

.. _keyword/ext_modules:

``ext_modules``
    A list of instances of ``setuptools.Extension`` providing the list of
    Python extensions to be built.

.. _keyword/classifiers:

``classifiers``
    A list of strings describing the categories for the package.

.. _keyword/distclass:

``distclass``
    A subclass of ``Distribution`` to use.

.. _keyword/script_name:

``script_name``
    A string specifying the name of the setup.py script -- defaults to
    ``sys.argv[0]``

.. _keyword/script_args:

``script_args``
    A list of strings defining the arguments to supply to the setup script.

.. _keyword/options:

``options``
    A dictionary providing the default options for the setup script.

.. _keyword/license:

``license``
    A string specifying the license of the package.

.. _keyword/license_file:

``license_file``
    .. warning::
        ``license_file`` is deprecated. Use ``license_files`` instead.

.. _keyword/license_files:

``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*``.

.. _keyword/keywords:

``keywords``
    A list of strings or a comma-separated string providing descriptive
    meta-data. See: :ref:`Core Metadata Specifications<core-metadata-keywords>`.

.. _keyword/platforms:

``platforms``
    A list of strings or comma-separated string.

.. _keyword/cmdclass:

``cmdclass``
    A dictionary providing a mapping of command names to ``Command``
    subclasses.

.. _keyword/data_files:

``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.

.. _keyword/package_dir:

``package_dir``
    A dictionary that maps package names (as they will be
    imported by the end-users) into directory paths (that actually exist in the
    project's source tree). This configuration has two main purposes:

    1. To effectively "rename" paths when building your package.
       For example, ``package_dir={"mypkg": "dir1/dir2/code_for_mypkg"}``
       will instruct setuptools to copy the ``dir1/dir2/code_for_mypkg/...`` files
       as ``mypkg/...`` when building the final :term:`wheel distribution <Wheel>`.

       .. attention::
          While it is *possible* to specify arbitrary mappings, developers are
          **STRONGLY ADVISED AGAINST** that. They should try as much as possible
          to keep the directory names and hierarchy identical to the way they will
          appear in the final wheel, only deviating when absolutely necessary.

    2. To indicate that the relevant code is entirely contained inside
       a specific directory (instead of directly placed under the project's root).
       In this case, a special key is required (the empty string, ``""``),
       for example: ``package_dir={"": "<name of the container directory>"}``.
       All the directories inside the container directory will be copied
       directly into the final :term:`wheel distribution <Wheel>`, but the
       container directory itself will not.

       This practice is very common in the community to help separate the
       package implementation from auxiliary files (e.g. CI configuration files),
       and is referred to as :ref:`src-layout`, because the container
       directory is commonly named ``src``.

    All paths in ``package_dir`` must be relative to the project root directory
    and use a forward slash (``/``) as path separator regardless of the
    operating system.

    .. tip::
       When using :doc:`package discovery </userguide/package_discovery>`
       together with :doc:`setup.cfg </userguide/declarative_config>` or
       :doc:`pyproject.toml </userguide/pyproject_config>`, it is very likely
       that you don't need to specify a value for ``package_dir``.  Please have
       a look at the definitions of :ref:`src-layout` and :ref:`flat-layout` to
       learn common practices on how to design a project's directory structure
       and minimise the amount of configuration that is needed.

.. _keyword/requires:

``requires``
   .. warning::
      ``requires`` is superseded by ``install_requires`` and should not be used
      anymore.

.. _keyword/obsoletes:

``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.

.. _keyword/provides:

``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"``).

.. _keyword/include_package_data:

``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`.

.. _keyword/exclude_package_data:

``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`.

.. _keyword/package_data:

``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.)

.. _keyword/zip_safe:

``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.

.. _keyword/install_requires:

``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.

.. _keyword/entry_points:

``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>`.

.. _keyword/extras_require:

``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.

.. _keyword/python_requires:

``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.

.. _keyword/setup_requires:

``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 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``.)

.. _keyword/dependency_links:

``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 during install by tools that support them.

.. _keyword/namespace_packages:

``namespace_packages``
    .. warning::
        The ``namespace_packages`` implementation relies on ``pkg_resources``.
        However, ``pkg_resources`` has some undesirable behaviours, and
        Setuptools intends to obviate its usage in the future. Therefore,
        ``namespace_packages`` was deprecated in favor of native/implicit
        namespaces (:pep:`420`). Check :doc:`the Python Packaging User Guide
        <PyPUG:guides/packaging-namespace-packages>` for more information.

    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.

.. _keyword/test_suite:

``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.

    .. warning::
       .. deprecated:: 41.5.0
          The test command will be removed in a future version of ``setuptools``,
          alongside any test configuration parameter.

.. _keyword/tests_require:

``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.
    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.

    .. warning::
       .. deprecated:: 41.5.0
          The test command will be removed in a future version of ``setuptools``,
          alongside any test configuration parameter.

.. _test_loader:

.. _keyword/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.

    .. warning::
       .. deprecated:: 41.5.0
          The test command will be removed in a future version of ``setuptools``,
          alongside any test configuration parameter.

.. _keyword/eager_resources:

``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`.

.. _keyword/project_urls:

``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"[V�UZ660doc/alt-python312-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 :ref:`MANIFEST.in <Using MANIFEST.in>` file,
  and without having to force regeneration of the ``MANIFEST`` file when your
  source tree changes [#manifest]_.

* 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",
      ]
      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.











Forum and Bug Tracker
=====================

Please use `GitHub Discussions`_ for questions and discussion about
setuptools, and the `setuptools bug tracker`_ ONLY for issues you have
confirmed via the forum are actual bugs, and which you have reduced to a minimal
set of steps to reproduce.

.. _GitHub Discussions: https://github.com/pypa/setuptools/discussions
.. _setuptools bug tracker: https://github.com/pypa/setuptools/


----


.. [#manifest] The default behaviour for ``setuptools`` will work well for pure
   Python packages, or packages with simple C extensions (that don't require
   any special C header). See :ref:`Controlling files in the distribution` and
   :doc:`userguide/datafiles` for more information about complex scenarios, if
   you want to include other types of files.
PK"[{8��mm-doc/alt-python312-setuptools/docs/history.rstnu�[���:tocdepth: 2

.. _changes:

History
*******

.. towncrier-draft-entries:: DRAFT, unreleased as on |today|

.. include:: ../NEWS (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"[��jKYY+doc/alt-python312-setuptools/docs/index.rstnu�[���.. image:: images/banner-640x320.svg
   :align: center

Documentation
=============

Setuptools is a fully-featured, actively-maintained, and stable library
designed to facilitate packaging Python projects.

It helps developers to easily share reusable code (in the form of a library)
and programs (e.g., CLI/GUI tools implemented in Python), that can be installed
with :pypi:`pip` and uploaded to `PyPI <https://pypi.org>`_.

.. sidebar-links::
   :home:
   :pypi:

.. toctree::
   :maxdepth: 1
   :hidden:

   User guide <userguide/index>
   build_meta
   pkg_resources
   references/keywords
   setuptools

.. toctree::
   :caption: Project
   :maxdepth: 1
   :hidden:

   roadmap
   Development guide <development/index>
   Backward compatibility & deprecated practice <deprecated/index>
   Changelog <history>
   artwork

.. tidelift-referral-banner::
PK"[�vM��s�s9doc/alt-python312-setuptools/docs/deprecated/commands.rstnu�[���===============================
Running ``setuptools`` commands
===============================

Historically, ``setuptools`` allowed running commands via a ``setup.py`` script
at the root of a Python project, as indicated in the examples below::

    python setup.py --help
    python setup.py --help-commands
    python setup.py --version
    python setup.py sdist
    python setup.py bdist_wheel

You could also run commands in other circumstances:

* ``setuptools`` projects without ``setup.py`` (e.g., ``setup.cfg``-only)::

   python -c "from setuptools import setup; setup()" --help

* ``distutils`` projects (with a ``setup.py`` importing ``distutils``)::

   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.

.. warning::
   While it is perfectly fine that users write ``setup.py`` files to configure
   a package build (e.g. to specify binary extensions or customize commands),
   on recent versions of ``setuptools``, running ``python setup.py`` directly
   as a script is considered **deprecated**. This also means that users should
   avoid running commands directly via ``python setup.py <command>``.

   If you want to create :term:`sdist <Source Distribution (or "sdist")>` or :term:`wheel`
   distributions the recommendation is to use the command line tool provided by :pypi:`build`::

       pip install build  # needs to be installed first

       python -m build  # builds both sdist and wheel
       python -m build --sdist
       python -m build --wheel

   Build will automatically download ``setuptools`` and build the package in an
   isolated environment. You can also specify specific versions of
   ``setuptools``, by setting the :doc:`build requirements in pyproject.toml
   </build_meta>`.

   If you want to install a package, you can use :pypi:`pip` or :pypi:`installer`::

      pip install /path/to/wheel/file.whl
      pip install /path/to/sdist/file.tar.gz
      pip install .  # replacement for python setup.py install
      pip install --editable .  # replacement for python setup.py develop

      pip install installer  # needs to be installed first
      python -m installer /path/to/wheel/file.whl

-----------------
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"[�9���Ddoc/alt-python312-setuptools/docs/deprecated/resource_extraction.rstnu�[���.. _Automatic Resource Extraction:

Automatic Resource Extraction
=============================

In a modern setup, Python packages are usually installed as directories,
and all the files can be found on deterministic locations on the disk.
This means that most of the tools expect package resources to be "real" files.

There are a few occasions however that packages are loaded in a different way
(e.g., from a zip file), which is incompatible with the assumptions mentioned above.
Moreover, a package developer may also include non-extension native libraries or other files that
C extensions may expect to be able to access.

In these scenarios, the use of :mod:`importlib.resources` is recommended.

Old implementations (prior to the advent of :mod:`importlib.resources`) and
long-living projects, however, may still rely on the library ``pkg_resources``
to access these files.

If you have to support such systems, or want to provide backward compatibility
for ``pkg_resources``, you may need to add an special configuration
to ``setuptools`` when packaging a project.
This can be done by listing as ``eager_resources`` (argument to ``setup()``
in ``setup.py`` or field in ``setup.cfg``) all the files that need to 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``/``setuptools``-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.
PK"[�$�AA9doc/alt-python312-setuptools/docs/deprecated/zip_safe.rstnu�[���Understanding the ``zip_safe`` flag
===================================

The ``zip_safe`` flag is a ``setuptools`` configuration mainly associated
with the ``egg`` distribution format
(which got replaced in the ecosystem by the newer ``wheel`` format) and the
``easy_install`` command (deprecated in ``setuptools`` v58.3.0).

It is very unlikely that the values of ``zip_safe`` will affect modern
deployments that use :pypi:`pip` for installing packages.
Moreover, new users of ``setuptools`` should not attempt to create egg files
using the deprecated ``build_egg`` command.
Therefore, this flag is considered **obsolete**.

This document, however, describes what was the historical motivation behind
this flag, and how it was used.

Historical Motivation
---------------------

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.

In the past, ``setuptools`` would install a project distributed
as a zipfile or a directory (via the ``easy_install`` command or
``python setup.py install``),
the default choice being determined by the project's ``zip_safe`` flag.

How the ``zip_safe`` flag was used?
-----------------------------------

To set this flag, a developer would pass a boolean value for the ``zip_safe`` argument to the
``setup()`` function, or omit it.  When omitted, the ``bdist_egg``
command would analyze the project's contents to see if it could detect any
conditions preventing the project from working in a zipfile.

This was extremely conservative: ``bdist_egg`` would consider the
project unsafe if it contained any C extensions or datafiles whatsoever.  This
does *not* mean that the project couldn't or wouldn't work as a zipfile!  It just
means that the ``bdist_egg`` authors were not yet comfortable asserting that
the project *would* work.  If the project did not contain any C or data files, and did not
attempt to perform ``__file__`` or ``__path__`` introspection or source code manipulation, then
there was an extremely solid chance the project will work when installed as a
zipfile.  (And if the project used ``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 for more information.)

The developer could manually set ``zip_safe`` to ``True`` to perform tests,
or to override the default behaviour (after checking all the warnings and
understanding the implications), this would allow ``setuptools`` to install the
project as a zip file. Alternatively, by setting ``zip_safe`` to ``False``,
developers could force ``setuptools`` to always install the project as a
directory.

Modern ways of loading packages from zip files
----------------------------------------------

Currently, popular Python package installers (such as :pypi:`pip`) and package
indexes (such as PyPI_) consider that distribution packages are always
installed as a directory.
It is however still possible to load packages from zip files added to
:obj:`sys.path`, thanks to the :mod:`zipimport` module
and the :mod:`importlib` machinery provided by Python standard library.

When working with modules loaded from a zip file, it is important to keep in
mind that values of ``__file__`` and ``__path__`` might not work as expected.
Please check the documentation for :mod:`importlib.resources`, if file
locations are important for your use case.


.. _PyPI: https://pypi.org
PK"[9�΁�Adoc/alt-python312-setuptools/docs/deprecated/changed_keywords.rstnu�[���New and Changed ``setup()`` Keywords
====================================

This document tracks historical differences between ``setuptools`` and
``distutils``.

Since ``distutils`` was scheduled for removal from the standard library in
Python 3.12, and ``setuptools`` started its adoption, these differences became less
relevant.
Please check :doc:`/references/keywords` for a complete list of keyword
arguments that can be passed to the ``setuptools.setup()`` function and
a their full description.

.. tab:: Supported by both ``distutils`` and ``setuptoools``

    ``name`` string

    ``version`` string

    ``description`` string

    ``long_description`` string

    ``long_description_content_type`` string

    ``author`` string

    ``author_email`` string

    ``maintainer`` string

    ``maintainer_email`` string

    ``url`` string

    ``download_url`` string

    ``packages`` list

    ``py_modules`` list

    ``scripts`` list

    ``ext_package`` string

    ``ext_modules`` list

    ``classifiers`` list

    ``distclass`` Distribution subclass

    ``script_name`` string

    ``script_args`` list

    ``options`` dictionary

    ``license`` string

    ``license_file`` string **deprecated**

    ``license_files`` list

    ``keywords`` string or list

    ``platforms`` list

    ``cmdclass`` dictionary

    ``data_files`` list **deprecated**

    ``package_dir`` dictionary

    ``requires`` string or list **deprecated**

    ``obsoletes`` list **deprecated**

    ``provides`` list

.. tab:: Added or changed by ``setuptoools``

    ``include_package_data`` bool

    ``exclude_package_data`` dictionary

    ``package_data`` dictionary

    ``zip_safe`` bool

    ``install_requires`` string or list

    ``entry_points`` dictionary

    ``extras_require`` dictionary

    ``python_requires`` string

    ``setup_requires`` string or list **deprecated**

    ``dependency_links`` list **deprecated**

    ``namespace_packages`` list

    ``test_suite`` string or function **deprecated**

    ``tests_require`` string or list **deprecated**

    ``test_loader`` class **deprecated**

    ``eager_resources`` list

    ``project_urls`` dictionary
PK"[�} $v$vAdoc/alt-python312-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.pypa.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


: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.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"[f�`�((Cdoc/alt-python312-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


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"[���A��Ddoc/alt-python312-setuptools/docs/deprecated/distutils/uploading.rstnu�[���:orphan:

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

See the
`Python Packaging User Guide <https://packaging.python.org>`_
for the best guidance on uploading packages.
PK"[�{��Gdoc/alt-python312-setuptools/docs/deprecated/distutils/packageindex.rstnu�[���:orphan:

.. _package-index:

*******************************
The Python Package Index (PyPI)
*******************************

The `Python Package Index (PyPI) <https://pypi.org>`_ stores
metadata describing distributions packaged with distutils and
other publishing tools, as well the distribution archives
themselves.

The best resource for working with PyPI is the
`Python Packaging User Guide <https://packaging.python.org>`_.
PK"[�Y�
&
&Edoc/alt-python312-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"[���e�K�KDdoc/alt-python312-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`   |         |
+-------------+------------------------------+---------+

.. 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                           |
+--------------------------+-------------------------------------+

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_dumb --dumb-option=foo

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.)

.. _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.

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.
PK"[σ�744Edoc/alt-python312-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` or by pointing :envvar:`DIST_EXTRA_CONFIG`
  to another configuration file

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.


.. rubric:: Footnotes

.. [#] This ideal probably won't be achieved until auto-configuration is fully
   supported by the Distutils.
PK"[t����Ddoc/alt-python312-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"[�^I\��Edoc/alt-python312-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}}
PK"[�G3���Gdoc/alt-python312-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).

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"[@�G���@doc/alt-python312-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"[��[��Qdoc/alt-python312-setuptools/docs/deprecated/distutils/_setuptools_disclaimer.rstnu�[���.. note::

   This document is being retained solely until the ``setuptools`` documentation
   at https://setuptools.pypa.io/en/latest/setuptools.html
   independently covers all of the relevant information currently included here.
PK"[����fzfzFdoc/alt-python312-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             |        |
+----------------------+---------------------------+-----------------+--------+
| ``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)
    If maintainer is provided and author is not, distutils lists maintainer 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"[3wF++Adoc/alt-python312-setuptools/docs/deprecated/dependency_links.rstnu�[���Specifying dependencies that aren't in PyPI via ``dependency_links``
====================================================================

.. 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 if 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 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/",
            ],
        )
PK"[eO<�x�x<doc/alt-python312-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"[*t),�	�	Adoc/alt-python312-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 60.0.0 release, Setuptools includes a local, vendored copy of distutils (from late copies of CPython) that is enabled by default. To disable the use of this copy of distutils when invoking setuptools, set the environment variable:

    SETUPTOOLS_USE_DISTUTILS=stdlib

.. warning::
   Please note that this also affects how ``distutils.cfg`` files inside stdlib's ``distutils``
   package directory are processed.
   Unless ``SETUPTOOLS_USE_DISTUTILS=stdlib``, they will have no effect on the build process.

   You can still use a global user config file, ``~/.pydistutils.cfg`` (POSIX) or ``%USERPROFILE%/pydistutils.cfg`` (Windows),
   or use the environment variable :ref:`DIST_EXTRA_CONFIG <setup-config>` to point to another
   supplementary configuration file.


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`` or ``distutils.core.Command`` → ``setuptools.Command``

``distutils.command.{build_clib,build_ext,build_py,sdist}`` → ``setuptools.command.*``

``distutils.dep_util`` → ``setuptools.modified``

``distutils.log`` → :mod:`logging` (standard library)

``distutils.version.*`` → :doc:`packaging.version.* <packaging:version>`

``distutils.errors.*`` → ``setuptools.errors.*`` [#errors]_


Migration advice is also provided by :pep:`PEP 632 <632#migration-advice>`.

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.


.. [#errors] Please notice errors related to the command line usage of
   ``setup.py``, such as ``DistutilsArgError``, are intentionally not exposed
   by setuptools, since this is considered a deprecated practice.
PK"[ƖH__6doc/alt-python312-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

    changed_keywords
    dependency_links
    python_eggs
    easy_install
    zip_safe
    resource_extraction
    distutils/index
    distutils-legacy
    functionalities
    commands
PK"[V��*�*�=doc/alt-python312-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 :pypi:`setuptools` on the package index
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`.


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 :pypi:`virtualenv` documentation for more details.


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"[n��[��@doc/alt-python312-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"[E�&�!�!!doc/alt-python312-libs/README.rstnu�[���This is Python version 3.12.11
==============================

.. image:: https://github.com/python/cpython/workflows/Tests/badge.svg
   :alt: CPython build status on GitHub Actions
   :target: https://github.com/python/cpython/actions

.. image:: https://dev.azure.com/python/cpython/_apis/build/status/Azure%20Pipelines%20CI?branchName=main
   :alt: CPython build status on Azure DevOps
   :target: https://dev.azure.com/python/cpython/_build/latest?definitionId=4&branchName=main

.. image:: https://img.shields.io/badge/discourse-join_chat-brightgreen.svg
   :alt: Python Discourse chat
   :target: https://discuss.python.org/


Copyright © 2001-2024 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
usable on all platforms.  Refer to the
`Install dependencies <https://devguide.python.org/getting-started/setup-building.html#build-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/main/Mac/README.rst>`_.

On Windows, see `PCbuild/readme.txt
<https://github.com/python/cpython/blob/main/PCbuild/readme.txt>`_.

If you wish, you can create a subdirectory and invoke configure from there.
For example::

    mkdir debug
    cd debug
    ../configure --with-pydebug
    make
    make test

(This will fail if you *also* built at the top-level directory.  You should do
a ``make clean`` at the top-level first.)

To get an optimized build of Python, ``configure --enable-optimizations``
before you run ``make``.  This sets the default make targets up to enable
Profile Guided Optimization (PGO) and may be used to auto-enable Link Time
Optimization (LTO) on some platforms.  For more details, see the sections
below.

Profile Guided Optimization
^^^^^^^^^^^^^^^^^^^^^^^^^^^

PGO takes advantage of recent versions of the GCC or Clang compilers.  If used,
either via ``configure --enable-optimizations`` or by manually running
``make profile-opt`` regardless of configure flags, the optimized build
process will perform the following steps:

The entire Python directory is cleaned of temporary files that may have
resulted from a previous compilation.

An instrumented version of the interpreter is built, using suitable compiler
flags for each flavor. 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's 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.12 <https://docs.python.org/3.12/whatsnew/3.12.html>`_ document.  For a more
detailed change log, read `Misc/NEWS
<https://github.com/python/cpython/tree/main/Misc/NEWS.d>`_, but a full
accounting of changes can only be gleaned from the `commit history
<https://github.com/python/cpython/commits/main>`_.

If you want to install multiple versions of Python, see the section below
entitled "Installing multiple versions".


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

`Documentation for Python 3.12 <https://docs.python.org/3.12/>`_ 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/main/Doc/README.rst>`_.


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/testing/run-write-tests.html>`_
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/python3.X``.  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.12 with 3.12 being the
primary version, you would execute ``make install`` in your 3.12 build directory
and ``make altinstall`` in the others.


Release Schedule
----------------

See :pep:`693` for Python 3.12 release details.


Copyright and License Information
---------------------------------


Copyright © 2001-2024 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 `LICENSE <https://github.com/python/cpython/blob/main/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"[�̈��'doc/alt-python312-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.

If you want to enable valgrind support in Python, you will need to
configure Python --with-valgrind option or an older option
--without-pymalloc.

UPDATE: Python 3.6 now supports PYTHONMALLOC=malloc environment variable which
can be used to force the usage of the malloc() allocator of the C library.

If you don't want to read about the details of using Valgrind, there
are still two things you must do to suppress the warnings.  First,
you must use a suppressions file.  One is supplied in
Misc/valgrind-python.supp.  Second, you must uncomment the lines in 
Misc/valgrind-python.supp that suppress the warnings for PyObject_Free and
PyObject_Realloc.

If you want to use Valgrind more effectively and catch even more
memory leaks, you will need to configure python --without-pymalloc.
PyMalloc allocates a few blocks in big chunks and most object
allocations don't call malloc, they use chunks doled about by PyMalloc
from the big blocks.  This means Valgrind can't detect
many allocations (and frees), except for those that are forwarded
to the system malloc.  Note: configuring python --without-pymalloc
makes Python run much slower, especially when running under Valgrind.
You may need to run the tests in batches under Valgrind to keep
the memory usage down to allow the tests to complete.  It seems to take
about 5 times longer to run --without-pymalloc.

Apr 15, 2006:
  test_ctypes causes Valgrind 3.1.1 to fail (crash).
  test_socket_ssl should be skipped when running valgrind.
	The reason is that it purposely uses uninitialized memory.
	This causes many spurious warnings, so it's easier to just skip it.


Details:
--------
Python uses its own small-object allocation scheme on top of malloc,
called PyMalloc.

Valgrind may show some unexpected results when PyMalloc is used.
Starting with Python 2.3, PyMalloc is used by default.  You can disable
PyMalloc when configuring python by adding the --without-pymalloc option.
If you disable PyMalloc, most of the information in this document and
the supplied suppressions file will not be useful.  As discussed above,
disabling PyMalloc can catch more problems.

PyMalloc uses 256KB chunks of memory, so it can't detect anything
wrong within these blocks.  For that reason, compiling Python
--without-pymalloc usually increases the usefulness of other tools.

If you use valgrind on a default build of Python,  you will see
many errors like:

        ==6399== Use of uninitialised value of size 4
        ==6399== at 0x4A9BDE7E: PyObject_Free (obmalloc.c:711)
        ==6399== by 0x4A9B8198: dictresize (dictobject.c:477)

These are expected and not a problem.  Tim Peters explains
the situation:

        PyMalloc needs to know whether an arbitrary address is one
	that's managed by it, or is managed by the system malloc.
	The current scheme allows this to be determined in constant
	time, regardless of how many memory areas are under pymalloc's
	control.

        The memory pymalloc manages itself is in one or more "arenas",
	each a large contiguous memory area obtained from malloc.
	The base address of each arena is saved by pymalloc
	in a vector.  Each arena is carved into "pools", and a field at
	the start of each pool contains the index of that pool's arena's
	base address in that vector.

        Given an arbitrary address, pymalloc computes the pool base
	address corresponding to it, then looks at "the index" stored
	near there.  If the index read up is out of bounds for the
	vector of arena base addresses pymalloc maintains, then
	pymalloc knows for certain that this address is not under
	pymalloc's control.  Otherwise the index is in bounds, and
	pymalloc compares

            the arena base address stored at that index in the vector

        to

            the arbitrary address pymalloc is investigating

        pymalloc controls this arbitrary address if and only if it lies
        in the arena the address's pool's index claims it lies in.

        It doesn't matter whether the memory pymalloc reads up ("the
	index") is initialized.  If it's not initialized, then
	whatever trash gets read up will lead pymalloc to conclude
	(correctly) that the address isn't controlled by it, either
	because the index is out of bounds, or the index is in bounds
	but the arena it represents doesn't contain the address.

        This determination has to be made on every call to one of
	pymalloc's free/realloc entry points, so its speed is critical
	(Python allocates and frees dynamic memory at a ferocious rate
	-- everything in Python, from integers to "stack frames",
	lives in the heap).
PK"[7X�$�$,doc/alt-python312-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
}

#
# Leaks: dlopen() called without dlclose()
#

{
   dlopen() called without dlclose()
   Memcheck:Leak
   fun:malloc
   fun:malloc
   fun:strdup
   fun:_dl_load_cache_lookup
}
{
   dlopen() called without dlclose()
   Memcheck:Leak
   fun:malloc
   fun:malloc
   fun:strdup
   fun:_dl_map_object
}
{
   dlopen() called without dlclose()
   Memcheck:Leak
   fun:malloc
   fun:*
   fun:_dl_new_object
}
{
   dlopen() called without dlclose()
   Memcheck:Leak
   fun:calloc
   fun:*
   fun:_dl_new_object
}
{
   dlopen() called without dlclose()
   Memcheck:Leak
   fun:calloc
   fun:*
   fun:_dl_check_map_versions
}


#
# 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"[E�&�!�!doc/alt-python312/README.rstnu�[���This is Python version 3.12.11
==============================

.. image:: https://github.com/python/cpython/workflows/Tests/badge.svg
   :alt: CPython build status on GitHub Actions
   :target: https://github.com/python/cpython/actions

.. image:: https://dev.azure.com/python/cpython/_apis/build/status/Azure%20Pipelines%20CI?branchName=main
   :alt: CPython build status on Azure DevOps
   :target: https://dev.azure.com/python/cpython/_build/latest?definitionId=4&branchName=main

.. image:: https://img.shields.io/badge/discourse-join_chat-brightgreen.svg
   :alt: Python Discourse chat
   :target: https://discuss.python.org/


Copyright © 2001-2024 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
usable on all platforms.  Refer to the
`Install dependencies <https://devguide.python.org/getting-started/setup-building.html#build-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/main/Mac/README.rst>`_.

On Windows, see `PCbuild/readme.txt
<https://github.com/python/cpython/blob/main/PCbuild/readme.txt>`_.

If you wish, you can create a subdirectory and invoke configure from there.
For example::

    mkdir debug
    cd debug
    ../configure --with-pydebug
    make
    make test

(This will fail if you *also* built at the top-level directory.  You should do
a ``make clean`` at the top-level first.)

To get an optimized build of Python, ``configure --enable-optimizations``
before you run ``make``.  This sets the default make targets up to enable
Profile Guided Optimization (PGO) and may be used to auto-enable Link Time
Optimization (LTO) on some platforms.  For more details, see the sections
below.

Profile Guided Optimization
^^^^^^^^^^^^^^^^^^^^^^^^^^^

PGO takes advantage of recent versions of the GCC or Clang compilers.  If used,
either via ``configure --enable-optimizations`` or by manually running
``make profile-opt`` regardless of configure flags, the optimized build
process will perform the following steps:

The entire Python directory is cleaned of temporary files that may have
resulted from a previous compilation.

An instrumented version of the interpreter is built, using suitable compiler
flags for each flavor. 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's 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.12 <https://docs.python.org/3.12/whatsnew/3.12.html>`_ document.  For a more
detailed change log, read `Misc/NEWS
<https://github.com/python/cpython/tree/main/Misc/NEWS.d>`_, but a full
accounting of changes can only be gleaned from the `commit history
<https://github.com/python/cpython/commits/main>`_.

If you want to install multiple versions of Python, see the section below
entitled "Installing multiple versions".


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

`Documentation for Python 3.12 <https://docs.python.org/3.12/>`_ 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/main/Doc/README.rst>`_.


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/testing/run-write-tests.html>`_
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/python3.X``.  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.12 with 3.12 being the
primary version, you would execute ``make install`` in your 3.12 build directory
and ``make altinstall`` in the others.


Release Schedule
----------------

See :pep:`693` for Python 3.12 release details.


Copyright and License Information
---------------------------------


Copyright © 2001-2024 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 `LICENSE <https://github.com/python/cpython/blob/main/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"[SE���*doc/alt-python312-setuptools-wheel/LICENSEnu�[���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�*[��^��man/man3/sasl_errdetail.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_ERRDETAIL" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_errdetail \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

const char *sasl_errdetail( sasl_conn_t *conn );
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B const char *sasl_errdetail( sasl_conn_t *conn );
\fBsasl_errdetail\fP provides more  detailed  information  about
the  most  recent  error  to occur, beyond the information
contained in the SASL result code.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – the SASL connection context to inquire about.
.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
Returns the string describing the error that occurred,  or NULL  if  no  error
has  occurred,  or there was an error retrieving it.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[����man/man3/sasl_auxprop_getctx.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_AUXPROP_GETCTX" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_auxprop_getctx \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_auxprop_getctx(sasl_conn_t *conn)
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_auxprop_getctx(\fI\%sasl_conn_t\fP\fI\ *conn\fP)
Fetches an auxiliary property context for the connection on which the functions
described in sasl_auxprop(3) can operate.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – pointer to the \fI\%sasl_conn_t\fP for which the request is being made.
.UNINDENT
.TP
.B Returns
A pointer to the context on success. Returns NULL on failure.
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B sasl_conn_t
Context for a SASL connection negotiation
.UNINDENT
.SH CONFORMING TO
.sp
\fI\%RFC 4422\fP
.SH SEE ALSO
.sp
sasl(3), sasl_auxprop(3), sasl_auxprop_request(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[��K�{{man/man3/sasl.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH DESCRIPTION
.sp
The CMU Cyrus SASL library is a general purpose authentication library for sever and client applications.
.sp
\fBSystem Administrators\fP
.sp
For information on setting up/configuring the SASL library see the System
Administrators Guide: \fI\%https://www.cyrusimap.org/sasl/sasl/sysadmin.html\fP
.sp
\fBProgrammers\fP
.sp
See man pages for individual sasl functions or the Programmers Guide in the doc/ directory of the SASL distribution.
.sp
Conforming to \fI\%RFC 2222\fP
.SH SEE ALSO
.sp
sasl_authorize_t(3), sasl_auxprop(3), sasl_auxprop_getctx(3), sasl_auxprop_request(3),
sasl_canon_user_t(3), sasl_callbacks(3), sasl_chalprompt_t(3), sasl_checkapop(3),
sasl_checkpass(3), sasl_client_init(3), sasl_client_new(3), sasl_client_start(3),
sasl_client_step(3), sasl_decode(3), sasl_dispose(3), sasl_done(3),
sasl_encode(3), sasl_encodev(3), sasl_errdetail(3), sasl_errors(3),
sasl_errstring(3), sasl_errors(3), sasl_getopt_t(3), sasl_getpath_t(3),
sasl_getprop(3), sasl_getrealm_t(3), sasl_getsecret_t(3), sasl_getsimple_t(3),
sasl_idle(3), sasl_listmech(3), sasl_log_t(3), sasl_server_init(3),
sasl_server_new(3), sasl_server_start(3), sasl_server_step(3), sasl_server_userdb_checkpass_t(3),
sasl_server_userdb_setpass_t(3), sasl_setpass(3), sasl_setprop(3), sasl_user_exists(3),
sasl_verifyfile_t(3), sasl_global_listmech(3)
.SH REFERENCED BY
.sp
ldap.conf(5), overload(3), sasl_getconfpath_t(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[�tQ.

man/man3/sasl_user_exists.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_USER_EXISTS" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_user_exists \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_user_exists( sasl_conn_t *conn,
                      const char *service,
                      const char *user_realm,
                      const char *user)
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_user_exists( sasl_conn_t *conn,
.TP
.B const char *service,
.TP
.B const char *user_realm,
.TP
.B const char *user)
\fBsasl_user_exists\fP will check if a user exists on the server.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – the SASL context for this connection
.IP \(bu 2
\fBservice\fP – Service name or NULL (for service name of
connection context)
.IP \(bu 2
\fBuser_realm\fP – Realm to check in or NULL (for default realm)
.IP \(bu 2
\fBuser\fP – User name to check for existence.
.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP,:saslman:\fIsasl_errors(3)\fP
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[�4���)man/man3/sasl_server_userdb_checkpass_t.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_SERVER_USERDB_CHECKPASS_T" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_server_userdb_checkpass_t \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_server_userdb_checkpass_t(sasl_conn_t *conn,
        void *context,
        const char *user,
        const char *pass,
        unsigned passlen,
        struct propctx *propctx)
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_server_userdb_checkpass_t(sasl_conn_t *conn,
.TP
.B void *context,
.TP
.B const char *user,
.TP
.B const char *pass,
.TP
.B unsigned passlen,
.TP
.B struct propctx *propctx)
\fBsasl_server_userdb_checkpass_t()\fP is used to verify a plaintext
password against the callback supplier’s user database. This is to
allow additional ways to encode the userPassword property.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – is the SASL connection context
.IP \(bu 2
\fBcontext\fP – context from the callback record
.IP \(bu 2
\fBuser\fP – NUL terminated user name with \fIuser@realm\fP syntax
.IP \(bu 2
\fBpass\fP – password to check (may not be NUL terminated)
.IP \(bu 2
\fBpasslen\fP – length of the password
.IP \(bu 2
\fBpropctx\fP – property context to fill in with userPassword
.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.sp
Other return codes indicate errors and should be handled.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_callbacks(3)
sasl_errors(3), sasl_server_userdb_setpass_t(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[��6��'man/man3/sasl_server_userdb_setpass_t.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_SERVER_USERDB_SETPASS_T" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_server_userdb_setpass_t \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_server_userdb_setpass_t(sasl_conn_t *conn,
                                 void *context,
                                 const char *user,
                                 const char *pass,
                                 unsigned passlen,
                                 struct propctx *propctx,
                                 unsigned flags)
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_server_userdb_setpass_t(sasl_conn_t *conn,
.TP
.B void *context,
.TP
.B const char *user,
.TP
.B const char *pass,
.TP
.B unsigned passlen,
.TP
.B struct propctx *propctx,
.TP
.B unsigned flags)
\fBsasl_server_userdb_setpass_t\fP is used to store or change  a plaintext
password  in the callback‐supplier’s user database.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – is the SASL connection
.IP \(bu 2
\fBcontext\fP – context from the callback record
.IP \(bu 2
\fBuser\fP – NUL terminated user name with \fIuser@realm\fP syntax
.IP \(bu 2
\fBpass\fP – password to check (may not be NUL terminated)
.IP \(bu 2
\fBpasslen\fP – length of the password
.IP \(bu 2
\fBpropctx\fP – Auxilliary Properties (not stored)
.IP \(bu 2
\fBflags\fP – These  are  the  same  flags  that  are  passed  to
sasl_setpass(3), and are documented on that man page.
.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.sp
Other return codes indicate errors and should be handled.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_errors(3)
sasl_callbacks(3), sasl_server_userdb_checkpass_t(3),
sasl_setpass(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[V�8man/man3/sasl_checkapop.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_CHECKAPOP" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_checkapop \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_checkapop(sasl_conn_t *conn,
                 const char *challenge,
                 unsigned challen,
                 const char *response,
                 unsigned resplen)
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_checkapop(sasl_conn_t *conn,
.TP
.B const char *challenge,
.TP
.B unsigned challen,
.TP
.B const char *response,
.TP
.B unsigned resplen)
\fBsasl_checkapop\fP  will  check  an APOP challenge/response.
APOP is an optional POP3 (\fI\%RFC 1939\fP) authentication command
which  uses  a  shared  secret (password). The password is
stored in the SASL secrets database.  For  information  on
the  SASL  shared secrets database see the System Administrators Guide\&.
.sp
If  called  with  a  NULL challenge, sasl_checkapop() will
check to see if the APOP mechanism is enabled.
.UNINDENT
.SH RETURN VALUE
.sp
sasl_checkapop returns an integer which corresponds to one
of the following codes. \fBSASL_OK\fP indicates that the authentication is complete.  All  other  return  codes  indicate
errors  and should either be handled or the authentication
session should be quit.  See sasl_errors(3)  for  meanings
of return codes.
.SH CONFORMING TO
.sp
\fI\%RFC 4422\fP, \fI\%RFC 1939\fP
.SH SEE ALSO
.sp
sasl(3), sasl_errors(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[����BBman/man3/sasl_global_listmech.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_GLOBAL_LISTMECH" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_global_listmech \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

const char ** sasl_global_listmech();
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B const char ** sasl_global_listmech();
\fBsasl_global_listmech\fP returns a null‐terminated array of
strings that lists all mechanisms that are loaded by
either the client or server side of the library.
.UNINDENT
.SH RETURN VALUE
.sp
Returns a pointer to the array on success. NULL on failure
(sasl library uninitialized).
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_server_init(3),
sasl_listmech(3), sasl_client_init(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[;����
�
man/man3/sasl_auxprop_request.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_AUXPROP_REQUEST" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_auxprop_request \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_auxprop_request(sasl_conn_t *conn, const char ** propnames)
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_auxprop_request(sasl_conn_t\fI\ *conn\fP, const char **\fI\ propnames\fP)
\fBsasl_auxprop_request\fP will request that the SASL library
obtain properties from any auxiliary property plugins that
might be installed (such as the user’s home directory from
an LDAP server for example). Such lookup occurs just
after username canonicalization is complete. Therefore,
the request should be made before the call to
sasl_server_start(3), but after the call to
sasl_server_new(3)\&.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – the \fBsasl_conn_t\fP for which the request is being made.
.IP \(bu 2
\fBpropnames\fP – a NULL\-terminated array of property names to
request.  Note that this array must persist until a call to
sasl_dispose(3) on the \fBsasl_conn_t\fP\&.
.UNINDENT
.TP
.B Returns
Returns  \fBSASL_OK\fP on success. See sasl_errors(3) for meanings of other return codes.
.UNINDENT
.UNINDENT
.SH CONFORMING TO
.sp
\fI\%RFC 4422\fP
.SH SEE ALSO
.sp
sasl(3), sasl_errors(3), sasl_auxprop(3), sasl_auxprop_getctx(3),
sasl_server_new(3), sasl_server_start(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[��mmman/man3/sasl_getopt_t.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_GETOPT_T" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_getopt_t \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_getopt_t(void *context,
               const char *plugin_name,
               const char *option,
               const char ** result,
               unsigned * len);
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_getopt_t(void *context,
.TP
.B const char *plugin_name,
.TP
.B const char *option,
.TP
.B const char ** result,
.TP
.B unsigned * len);
\fBsasl_getopt_t\fP is used to retrieve an option, often mechanism specific,
from the application. An example of this is
requesting what KERBEROS_V4 srvtab file to use.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBcontext\fP – is the SASL connection context
.IP \(bu 2
\fBplugin_name\fP – is the plugin this value is for.
.IP \(bu 2
\fBoption\fP – is a string representing the option. A common option that all
server applications should handle is the method for checking
plaintext passwords.  See the \fI\%administrators
guide\fP for a
full description of this option.
.UNINDENT
.UNINDENT
.sp
Memory management of options supplied by the getopt callback
should be done by the application, however, any
requested option must remain available until the callback
is no longer valid.  That is, when sasl_dispose(3) is called
for a the connection it is associated with,  or  sasl_done(3)
is called for global callbacks.
.UNINDENT
.SH RETURN VALUE
.sp
SASL callback functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.sp
Other return codes indicate errors and should be handled.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_errors(3)
sasl_callbacks(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[{���ZZman/man3/sasl_client_step.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_CLIENT_STEP" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_client_step \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_client_step(sasl_conn_t *conn,
               const char *serverin,
               unsigned serverinlen,
               sasl_interact_t ** prompt_need,
               const char ** clientout,
               unsigned * clientoutlen);
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_client_step(sasl_conn_t *conn,
.TP
.B const char *serverin,
.TP
.B unsigned serverinlen,
.TP
.B sasl_interact_t ** prompt_need,
.TP
.B const char ** clientout,
.TP
.B unsigned * clientoutlen);
\fBsasl_client_step()\fP performs a step in  the  authentication negotiation.  It
returns \fBSASL_OK\fP if the whole negotiation is successful and
\fBSASL_CONTINUE\fP if
this step is ok but  at least  one more step is needed. A client should not
assume an authentication negotiation is successful  just  because the
server  signaled  success  via  protocol (i.e. if the server  said  “.  OK
Authentication  succeeded”  in  IMAP, sasl_client_step should still be called
one more time with a \fIserverinlen\fP of zero.
.sp
If \fBSASL_INTERACT\fP is returned the library needs some values
to  be  filled  in  before it can proceed. \fIThe prompt_need\fP
structure will be filled in with requests. The application
should  fulfill  these requests and call sasl_client_start
again with identical parameters (the \fIprompt_need\fP parameter
will  be  the  same pointer as before but filled in by the
application).
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – is the SASL connection context
.IP \(bu 2
\fBserverin\fP – is the data given by the server (decoded  if  the
protocol encodes requests sent over the wire)
.IP \(bu 2
\fBserverinlen\fP – is the length of \fIserverin\fP
.IP \(bu 2
\fBclientout\fP – is created. It is  the  initial
client  response  to  send to the server. It is the job of
the client to send it over the network to the server.  Any
protocol  specific encoding (such as base64 encoding) nec‐
essary needs to be done by the client.
.IP \(bu 2
\fBclientoutlen\fP – length of \fIclientout\fP\&.
.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_CONTINUE\fP indicates success
and that there are more steps needed in the authentication. \fBSASL_OK\fP
indicates that the authentication is complete.
.sp
Other return codes indicate errors and should either be handled or the authentication
session should be quit.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_callbacks(3),
sasl_client_init(3), sasl_client_new(3),
sasl_client_start(3), sasl_errors(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[�z���man/man3/sasl_log_t.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_LOG_T" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_log_t \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_log_t(void *context,
              int level,
              const char * message);
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_log_t(void *context,
.TP
.B int level,
.TP
.B const char * message);
.INDENT 7.0
.TP
\fBsasl_log_t\fP is used to log warning/error messages from the
SASL library. If not specified \fBsyslog\fP will be used.
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_callbacks(3),
sasl_errors(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[�W��~
~
man/man3/sasl_checkpass.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_CHECKPASS" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_checkpass \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_checkpass(sasl_conn_t *conn,
                 const char *user,
                 unsigned userlen,
                 const char *pass,
                 unsigned passlen);
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_checkpass(sasl_conn_t *conn,
.TP
.B const char *user,
.TP
.B unsigned userlen,
.TP
.B const char *pass,
.TP
.B unsigned passlen)
\fBsasl_checkpass\fP  will check a plaintext password. This is
needed for protocols that had a login method  before  SASL
(for  example  the LOGIN command in IMAP). The password is
checked with the pwcheck_method. See sasl_callbacks(3)  for
information on how this parameter is set.
.UNINDENT
.SH RETURN VALUE
.sp
sasl_checkpass returns an integer which corresponds to one
of the following codes. \fBSASL_OK\fP indicates that the authentication  is  complete.  All  other  return codes indicate
errors and should either be handled or the  authentication
session  should  be quit.  See sasl_errors(3) for meanings
of return codes.
.SH CONFORMING TO
.sp
\fI\%RFC 4422\fP
.SH SEE ALSO
.sp
sasl(3), sasl_errors(3), sasl_callbacks(3),
sasl_setpass(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[�,��man/man3/sasl_setpass.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_SETPASS" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_setpass \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_setpass(sasl_conn_t *conn,
                 const char *user,
                 const char *pass, unsigned passlen,
                  const char *oldpass, unsigned oldpasslen,
                  unsigned flags)
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_setpass(sasl_conn_t *conn,
.TP
.B const char *user,
.TP
.B const char *pass, unsigned passlen,
.TP
.B const char *oldpass, unsigned oldpasslen,
.TP
.B unsigned flags)
\fBsasl_setpass\fP will set passwords in the sasldb, and trigger the setpass
callbacks for all available mechanisms.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – is the SASL connection context
.IP \(bu 2
\fBuser\fP – is the username to set the password for
.IP \(bu 2
\fBpass\fP – the password to set
.IP \(bu 2
\fBpasslen\fP – length of the password to set (\fIpass\fP)
.IP \(bu 2
\fBoldpass\fP – optional. The old password.
.IP \(bu 2
\fBoldpasslen\fP – optional. The old password length.
.IP \(bu 2
\fBflags\fP – 
.sp
are flags including \fISASL_SET_CREATE\fP and
\fISASL_SET_DISABLE\fP (to cause the creating of nonexistent accounts and the
disabling of an account, respectively)
.sp
\fIoldpass\fP and \fIoldpasslen\fP are unused in the Cyrus SASL implementation, though
are passed on to any mechanisms that may require them.

.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.sp
Other return codes indicate errors and should be handled.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_errors(3),
sasl_checkpass(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[��:���man/man3/sasl_canon_user_t.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_CANON_USER_T" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_canon_user_t \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_canon_user_t(sasl_conn_t *conn, void *context, const char *user, unsigned ulen,
                      unsigned flags, const char *user_realm, char *out_user,
                      unsigned out_umax, unsigned *out_ulen)
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_canon_user_t(sasl_conn_t *conn,
.TP
.B void *context,
.TP
.B const char *user,
.TP
.B unsigned ulen,
.TP
.B unsigned flags,
.TP
.B const char *user_realm,
.TP
.B char *out_user,
.TP
.B unsigned out_umax,
.TP
.B unsigned *out_ulen)
\fBsasl_canon_user_t\fP is the callback for an  application\-supplied  user  canonicalization  function.  This function is
subject to the requirements that all user canonicalization
functions  are:  It  must  copy the result into the output
buffers, but the output buffers and the input buffers  may
be the same.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBcontext\fP – context from the callback record
.IP \(bu 2
\fBuser\fP – un\-canonicalized username
.IP \(bu 2
\fBulen\fP – length of user
.IP \(bu 2
\fBflags\fP – Either SASL_CU_AUTHID (indicating the authentication ID is being canonicalized) or SASL_CU_AUTHZID  (indicating the  authorization ID is to be canonicalized) or a bitwise OR of the the two.
.IP \(bu 2
\fBuser_realm\fP – Realm of authentication.
.IP \(bu 2
\fBout_user\fP – The output buffer for the canonicalized username
.IP \(bu 2
\fBout_umax\fP – Maximum length for out_user
.IP \(bu 2
\fBout_ulen\fP – Actual length of out_user
.UNINDENT
.TP
.B Returns
\fBSASL_OK\fP indicates success. See sasl_errors(3) for a full list of SASL error codes.
.UNINDENT
.UNINDENT
.SH CONFORMING TO
.sp
\fI\%RFC 4422\fP
.SH SEE ALSO
.sp
sasl(3), sasl_errors(3), sasl_callbacks(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[�s�M�
�
man/man3/sasl_chalprompt_t.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_CHALPROMPT_T" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_chalprompt_t \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/prop.h>

int sasl_chalprompt_t(void *context, int id,
    const char *challenge,
    const char *prompt, const char *defresult,
    const char **result, unsigned *len)
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_chalprompt_t(void *context,
.TP
.B int id,
.TP
.B const char *challenge,
.TP
.B const char *prompt,
.TP
.B const char *defresult,
.TP
.B const char **result,
.TP
.B unsigned *len)
\fBsasl_chalprompt_t\fP  is used to prompt for input in response to a server challenge.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBcontext\fP – is the context from the callback record
.IP \(bu 2
\fBid\fP – is the callback id (either SASL_CB_ECHOPROMPT or  SASL_CB_NOECHOPROMPT)
.IP \(bu 2
\fBchallenge\fP – the server’s challenge
.IP \(bu 2
\fBprompt\fP – A prompt for the user
.IP \(bu 2
\fBdefresult\fP – Default result (may be NULL)
.IP \(bu 2
\fBlen\fP – Length of the user’s response.
.UNINDENT
.TP
.B Result
The user’s response (a NUL terminated string) or SASL error code.
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
The user’s response (NUL terminated), or a SASL error code. See sasl_errors(3)\&.
.SH SEE ALSO
.sp
sasl(3), sasl_errors(3), sasl_callbacks(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[��T"�	�	man/man3/sasl_authorize_t.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_AUTHORIZE_T" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_authorize_t \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>


int sasl_authorize_t(void *context,
                    const char *requested_user, unsigned alen,
                    const char *auth_identity, unsigned alen,
                    const char *def_realm, unsigned urlen,
                    struct propctx *propctx)
.fi
.SH DESCRIPTION
.sp
\fBsasl_authorize_t\fP  is  used to check whether the authorized
user auth_identity may act  as  the  user  requested_user.
For  example  the  user root may wish to authenticate with
his credentials but act as the user mmercer (with  all  of
mmercer’s  rights  not roots). A server application should
be very careful, and probably err on the side of  caution,
when determining which users may proxy as whom.
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.SH SEE ALSO
.sp
sasl(3), sasl_callbacks(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[�		man/man3/sasl_getconfpath_t.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_GETCONFPATH_T" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_getconfpath_t \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_getconfpath_t(void *context, char ** path);
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_getconfpath_t(void *context, char ** path);
\fBsasl_getconfpath_t()\fP is used if the  application  wishes  to
use a different location for the SASL configuration files.
If this callback is not used  SASL  will  either  use  the
location  in the environment variable SASL_CONF_PATH (provided
we are not SUID or SGID) or \fI/etc/sasl2\fP by default.
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.sp
Other return codes indicate errors and should be handled.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_callbacks(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[��j�$$man/man3/sasl_getrealm_t.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_GETREALM_T" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_getrealm_t \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_getrealm_t(void *context,
    int id,
    const char **availrealms,
    const char **result)
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_getrealm_t(void *context,
.TP
.B int id,
.TP
.B const char **availrealms,
.TP
.B const char **result)
\fBsasl_getrealm_t()\fP is used when there is an interaction with
SASL_CB_GETREALM as the type.
.sp
If a mechanism would use this  callback,  but  it  is  not
present,  then  the  first  realm  listed is automatically
selected.  (Note that a  mechanism  may  still  force  the
existence  of  a  getrealm callback by SASL_CB_GETREALM to
its required_prompts list).
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBcontext\fP – context from the callback record
.IP \(bu 2
\fBid\fP – callback ID (SASL_CB_GETREALM)
.IP \(bu 2
\fBavailrealms\fP – A string list of the available  realms.   NULL
terminated, may be empty.
.IP \(bu 2
\fBresult\fP – The chosen realm. (a NUL terminated string)
.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.sp
Other return codes indicate errors and should be handled.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_callbacks(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[�[�##man/man3/sasl_errors.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_ERRORS" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_errors \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>
.fi
.SH DESCRIPTION
.sp
The  following  are  the  general  error codes that may be
returned by calls into the SASL library, and  their  meanings (that may vary slightly based on context).
.SS Common Result Codes
.INDENT 0.0
.TP
.B SASL_OK
Success
.UNINDENT
.INDENT 0.0
.TP
.B SASL_CONTINUE
Another step is needed in authentication
.UNINDENT
.INDENT 0.0
.TP
.B SASL_FAIL
Generic Failure
.UNINDENT
.INDENT 0.0
.TP
.B SASL_NOMEM
Memory shortage failure
.UNINDENT
.INDENT 0.0
.TP
.B SASL_BUFOVER
Overflowed buffer
.UNINDENT
.INDENT 0.0
.TP
.B SASL_NOMECH
Mechanism  not  supported  / No mechanisms matched
requirements
.UNINDENT
.INDENT 0.0
.TP
.B SASL_BADPROT
Bad / Invalid Protocol or Protocol cancel
.UNINDENT
.INDENT 0.0
.TP
.B SASL_NOTDONE
Cannot request information / Not  applicable  until
later in exchange
.UNINDENT
.INDENT 0.0
.TP
.B SASL_BADPARAM
Invalid Parameter Supplied
.UNINDENT
.INDENT 0.0
.TP
.B SASL_TRYAGAIN
Transient Failure (e.g. weak key)
.UNINDENT
.INDENT 0.0
.TP
.B SASL_BADMAC
Integrity Check Failed
.UNINDENT
.INDENT 0.0
.TP
.B SASL_NOTINIT
SASL library not initialized
.UNINDENT
.SS Client\-only Result Codes
.INDENT 0.0
.TP
.B SASL_INTERACT
Needs user interaction
.UNINDENT
.INDENT 0.0
.TP
.B SASL_BADSERV
Server failed mutual authentication step
.UNINDENT
.INDENT 0.0
.TP
.B SASL_WRONGMECH
Mechanism does not support requested feature
.UNINDENT
.SS Server\-only Result Codes
.INDENT 0.0
.TP
.B SASL_BADAUTH
Authentication Failure
.UNINDENT
.INDENT 0.0
.TP
.B SASL_NOAUTHZ
Authorization Failure
.UNINDENT
.INDENT 0.0
.TP
.B SASL_TOOWEAK
Mechanism too weak for this user
.UNINDENT
.INDENT 0.0
.TP
.B SASL_ENCRYPT
Encryption needed to use mechanism
.UNINDENT
.INDENT 0.0
.TP
.B SASL_TRANS
One  time  use of a plaintext password will enable
requested mechanism for user
.UNINDENT
.INDENT 0.0
.TP
.B SASL_EXPIRED
Passphrase expired, must be reset
.UNINDENT
.INDENT 0.0
.TP
.B SASL_DISABLED
Account Disabled
.UNINDENT
.INDENT 0.0
.TP
.B SASL_NOUSER
User Not Found
.UNINDENT
.INDENT 0.0
.TP
.B SASL_BADVERS
Version mismatch with plug\-in
.UNINDENT
.INDENT 0.0
.TP
.B SASL_NOVERIFY
User exists, but no verifier for user
.UNINDENT
.SS Password Setting Result Codes
.INDENT 0.0
.TP
.B SASL_PWLOCK
Passphrase locked
.UNINDENT
.INDENT 0.0
.TP
.B SASL_NOCHANGE
Requested change was not needed
.UNINDENT
.INDENT 0.0
.TP
.B SASL_WEAKPASS
Passphrase is too week for security policy.
.UNINDENT
.INDENT 0.0
.TP
.B SASL_NOUSERPASS
User supplied passwords are not permitted
.UNINDENT
.SH CONFORMING TO
.sp
\fI\%RFC 4422\fP
.SH SEE ALSO
.sp
sasl(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[���Q		man/man3/sasl_getpath_t.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_GETPATH_T" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_getpath_t \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_getpath_t(void *context,
                  char ** path);
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_getpath_t(void *context, char ** path);
\fBsasl_getpath_t()\fP is used if the application wishes to use  a
different  location  for  the  SASL mechanism drivers (the
shared library files). If this callback is not used SASL
will either use the location in the environment variable
SASL_PATH or \fI/usr/lib/sasl2\fP by default.
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.sp
Other return codes indicate errors and should be handled.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_callbacks(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[�c�,O
O
man/man3/sasl_getsecret_t.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_GETSECRET_T" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_getsecret_t \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_getsecret_t(sasl_conn_t *conn,
                    void *context,
                    int id,
                    sasl_secret_t ** psecret);
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_getsecret_t(sasl_conn_t *conn,
.TP
.B void *context,
.TP
.B int id,
.TP
.B sasl_secret_t ** psecret);
\fBsasl_getsecret_t()\fP is used to retrieve the secret  from  the
application. A sasl_secret_t should be allocated to length
\fIsizeof(sasl_secret_t) + <length of secret>\fP\&.  It  has two
fields: \fIlen\fP which is the length of the secret in bytes and
\fIdata\fP which contains the secret itself (does not need to be
null terminated).
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – is the SASL connection context
.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.sp
Other return codes indicate errors and should be handled.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_callbacks(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[>��8:
:
man/man3/sasl_client_init.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_CLIENT_INIT" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_client_init \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_client_init(const  sasl_callback_t *callbacks )
.fi
.SH DESCRIPTION
.sp
\fBsasl_client_init\fP initializes SASL.
.sp
It  must  be  called  before  any  calls  to
sasl_client_start(3)\&. This call initializes all SASL client  drivers
(e.g.  authentication mechanisms). These are usually found in the
\fI/usr/lib/sasl2\fP directory but the directory may be overridden with
the \fISASL_PATH\fP environment variable.
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.sp
The following return codes indicate errors and should either be handled or the authentication
session should be quit:
.INDENT 0.0
.IP \(bu 2
\fBSASL_BADVERS\fP: Mechanism version mismatch
.IP \(bu 2
\fBSASL_BADPARAM\fP: Error in config file
.IP \(bu 2
\fBSASL_NOMEM\fP: Not enough memory to complete operation
.UNINDENT
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_callbacks(3),
sasl_client_new(3), sasl_client_start(3),
sasl_client_step(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*["	����man/man3/sasl_setprop.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_SETPROP" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_setprop \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_setprop(sasl_conn_t *conn,
                int propnum,
                const void * pvalue)
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_setprop(sasl_conn_t *conn,
.TP
.B int propnum,
.TP
.B const void * pvalue)
\fBsasl_setprop\fP  sets the value of a SASL property. For example an
application should tell the SASL library about  any external negotiated
security layer (i.e. TLS).
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – is the SASL connection context
.IP \(bu 2
\fBpropnum\fP – is the identifier for the property requested
.IP \(bu 2
\fBpvalue\fP – 
.sp
contains  a pointer  to  the  data. It is the applications
job to make sure this type is correct. This is an easy way to crash  a
program.
.INDENT 2.0
.IP \(bu 2
SASL_AUTH_EXTERNAL ‐ external authentication ID (const char *)
.IP \(bu 2
SASL_SSF_EXTERNAL ‐  external SSF active ‐‐ (sasl_ssf_t)
.IP \(bu 2
SASL_DEFUSERREALM ‐ user realm (const char *)
.IP \(bu 2
SASL_SEC_PROPS  ‐    \fIsasl_security_properties_t\fP (may be freed after call)
.IP \(bu 2
.INDENT 2.0
.TP
.B SASL_IPLOCALPORT ‐   string describing the local ip and port in the form
”a.b.c.d;p”, or “e:f:g:h:i:j:k:l;port”
.UNINDENT
.IP \(bu 2
.INDENT 2.0
.TP
.B SASL_IPREMOTEPORT ‐  string describing the remote ip and port in the form
”a.b.c.d;p”, or “e:f:g:h:i:j:k:l;port”
.UNINDENT
.UNINDENT

.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.sp
Other return codes indicate errors and should be handled.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_errors(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[���**man/man3/sasl_getprop.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_GETPROP" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_getprop \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_getprop(sasl_conn_t *conn,
                int propnum,
                const void ** pvalue);
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_getprop(sasl_conn_t *conn,
.TP
.B int propnum,
.TP
.B const void ** pvalue);
\fBsasl_getprop\fP  gets the value of a SASL property. For example after
successful authentication a server may  wish  to know  the  authorization
name. Or a client application may wish to know  the  strength  of  the
negotiated  security layer.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – is the SASL connection context
.IP \(bu 2
\fBpropnum\fP – is the identifier for the property requested
.IP \(bu 2
\fBpvalue\fP – 
.sp
is filled on success. List of properties:
.INDENT 2.0
.IP \(bu 2
SASL_USERNAME     ‐  pointer to NUL terminated user name
.IP \(bu 2
.INDENT 2.0
.TP
.B SASL_SSF          ‐  security layer security strength factor,
if 0, call to sasl_encode(3), sasl_decode(3)
unnecessary
.UNINDENT
.IP \(bu 2
SASL_MAXOUTBUF    ‐  security layer max output buf unsigned
.IP \(bu 2
SASL_DEFUSERREALM ‐  server authentication realm used
.IP \(bu 2
SASL_GETOPTCTX    ‐  context for getopt callback
.IP \(bu 2
SASL_IPLOCALPORT  ‐  local address string
.IP \(bu 2
SASL_IPREMOTEPORT ‐  remote address string
.IP \(bu 2
SASL_SERVICE      ‐  service passed to \fIsasl_*_new\fP
.IP \(bu 2
SASL_SERVERFQDN   ‐  serverFQDN passed to \fIsasl_*_new\fP
.IP \(bu 2
.INDENT 2.0
.TP
.B SASL_AUTHSOURCE   ‐  name of auth source last used, useful for failed
authentication tracking
.UNINDENT
.IP \(bu 2
SASL_MECHNAME     ‐  active mechanism name, if any
.IP \(bu 2
SASL_PLUGERR      ‐  similar to \fIsasl_errdetail\fP
.UNINDENT

.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.sp
Other return codes indicate errors and should be handled.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_errors(3)
sasl_server_new(3), sasl_client_new(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[PVH���man/man3/sasl_client_start.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_CLIENT_START" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_client_start \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_client_start(sasl_conn_t * conn,
        const char * mechlist,
        sasl_interact_t ** prompt_need,
        const char ** clientout,
        unsigned * clientoutlen,
        const char ** mech);
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_client_start(sasl_conn_t * conn,
.TP
.B const char * mechlist,
.TP
.B sasl_interact_t ** prompt_need,
.TP
.B const char ** clientout,
.TP
.B unsigned * clientoutlen,
.TP
.B const char ** mech);
\fBsasl_client_start()\fP selects a mechanism for authentication and starts the
authentication session. The mechlist is the list of mechanisms the client
might like to use. The mech‐ anisms in the list are not necessarily  supported
by  the client  or  even  valid. SASL determines which of these to use based
upon the security preferences specified earlier. The  list  of mechanisms is
typically a list of mechanisms the server supports acquired from a capability
request.
.sp
If \fBSASL_INTERACT\fP is returned the library needs some values to  be
filled  in  before it can proceed. The \fIprompt_need\fP structure will be filled in
with requests. The application should  fulfill  these requests and call
sasl_client_start again with identical parameters (the \fIprompt_need\fP parameter
will  be  the  same pointer as before but filled in by the application).
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – is the SASL connection context
.IP \(bu 2
\fBmechlist\fP – is a list of mechanisms the server has available.
Punctuation is ignored.
.IP \(bu 2
\fBprompt_need\fP – is filled in with a list of prompts needed to
continue (if necessary).
.IP \(bu 2
\fBclientout\fP – 
.sp
is created. It is  the  initial
client  response  to  send to the server. It is the job of
the client to send it over the network to the server.  Any
protocol  specific encoding (such as base64 encoding) necessary
needs to be done by the client.
.sp
If the protocol lacks client‐send‐first  capability,  then
set clientout to NULL.
.sp
If  there  is no initial client‐send, then *clientout will
be set to NULL on return.

.IP \(bu 2
\fBclientoutlen\fP – length of \fIclientout\fP\&.
.IP \(bu 2
\fBmech\fP – contains the name of the chosen  SASL
mechanism  (on success)
.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_CONTINUE\fP indicates success
and that there are more steps needed in the authentication.
.sp
Other return codes indicate errors and should either be handled or the authentication
session should be quit.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_callbacks(3),
sasl_client_init(3), sasl_client_new(3),
sasl_client_step(3), sasl_errors(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[c��j66man/man3/sasl_server_new.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_SERVER_NEW" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_server_new \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_server_new(const char *service,
                const char *serverFQDN,
                const char *user_realm,
                const char *iplocalport,
                const char *ipremoteport,
                const sasl_callback_t *callbacks,
                unsigned flags,
                sasl_conn_t ** pconn);
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_server_new(const char *service,
.TP
.B const char *serverFQDN,
.TP
.B const char *user_realm,
.TP
.B const char *iplocalport,
.TP
.B const char *ipremoteport,
.TP
.B const sasl_callback_t *callbacks,
.TP
.B unsigned flags,
.TP
.B sasl_conn_t ** pconn);
\fBsasl_server_new()\fP creates a new SASL context. This context will  be
used  for  all SASL calls for one connection. It handles both authentication
and integrity/encryption  layers after authentication.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBservice\fP – is the registered name of the service (usually the
protocol name) using SASL (e.g. “imap”).
.IP \(bu 2
\fBserverFQDN\fP – is the  fully  qualified  server  domain  name.
NULL  means  use gethostname().  This is useful for multi\-homed servers.
.IP \(bu 2
\fBuser_realm\fP – is the domain of the user agent. This  is  usually
not necessary (NULL is default)
.IP \(bu 2
\fBiplocalport\fP – 
.sp
is  the  IP and port of the local side of the
connection, or NULL.  If iplocalport is NULL it will  disable mechanisms
that require IP address information.  This strings  must  be  in  one
of the following formats:
.INDENT 2.0
.IP \(bu 2
”a.b.c.d;port”  (IPv4),
.IP \(bu 2
”e:f:g:h:i:j:k:l;port” (IPv6), or
.IP \(bu 2
”e:f:g:h:i:j:a.b.c.d;port” (IPv6)
.UNINDENT

.IP \(bu 2
\fBipremoteport\fP – is the IP and port of the remote side of  the
connection, or NULL (see iplocalport)
.IP \(bu 2
\fBflags\fP – are connection flags (see below)
.IP \(bu 2
\fBpconn\fP – is a pointer to the connection context allocated by
the library. This structure will be used  for  all  future
SASL calls for this connection.
.UNINDENT
.UNINDENT
.UNINDENT
.SS Connection flags
.sp
Flags that may be passed to \fBsasl_server_new()\fP:
.INDENT 0.0
.IP \(bu 2
\fISASL_SUCCESS_DATA\fP: The protocol supports a server‐last send
.IP \(bu 2
.INDENT 2.0
.TP
.B \fISASL_NEED_PROXY\fP: Force the use of  a  mechanism  that  supports  an
authorization  id  that  is not the authentication id.
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.sp
Other return codes indicate errors and should either be handled or the
authentication session should be quit.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_server_init(3),
sasl_server_start(3), sasl_server_step(3),
sasl_setprop(3), sasl_errors(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[��<���man/man3/sasl_decode.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_DECODE" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_decode \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_decode(sasl_conn_t *conn,
               const char * input,
                unsigned inputlen,
               const char ** output,
               unsigned * outputlen);
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_decode(sasl_conn_t *conn,
.TP
.B const char * input,
.TP
.B unsigned inputlen,
.TP
.B const char ** output,
.TP
.B unsigned * outputlen);
\fBsasl_decode\fP decodes   data  received.  After  successful authentication
this function should be called on all  data received.  It  decodes  the
data from encrypted or signed form to plain data. If there was no security
layer negotiated the \fIoutput\fP is identical to the \fIinput\fP\&.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – is the SASL connection context
.IP \(bu 2
\fBoutput\fP – contains the decoded data and is allocated/freed by
the library.
.IP \(bu 2
\fBoutputlen\fP – length of \fIoutput\fP\&.
.UNINDENT
.UNINDENT
.sp
One should not give  sasl_decode  more  data  than  the
negotiated \fImaxbufsize\fP (see sasl_getprop(3)).
.sp
Note  that  sasl_decode  can  succeed and outputlen can be
zero. If this is the case simply wait for  more  data  and
call sasl_decode again.
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.sp
Other return codes indicate errors and should be handled.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_encode(3),
sasl_errors(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[߱�4man/man3/sasl_encodev.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_ENCODEV" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_encodev \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_encode(sasl_conn_t *conn,
                const char * input,
                unsigned inputlen,
                const char ** output,
                unsigned * outputlen);

int sasl_encodev(sasl_conn_t *conn,
                const struct iovec * invec,
                unsigned numiov,
                const char ** output,
                unsigned * outputlen);
.fi
.SH DESCRIPTION
.sp
\fBsasl_encode\fP encodes data to be sent to be sent to a remote host  who  we’ve
had  a successful authentication session with. If there  is  a  negotiated
security  the  data  in signed/encrypted  and  the  output  should be sent
without modification to the remote host. If there is  no  security layer the
output is identical to the input.
.sp
\fBsasl_encodev\fP does the same, but for a \fIstruct iovec\fP instead
of a character buffer.
.INDENT 0.0
.TP
.B int sasl_encode(sasl_conn_t *conn,
.TP
.B const char * input,
.TP
.B unsigned inputlen,
.TP
.B const char ** output,
.TP
.B unsigned * outputlen);
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – is the SASL connection context
.IP \(bu 2
\fBoutput\fP – contains the decoded data and is allocated/freed by
the library.
.IP \(bu 2
\fBoutputlen\fP – length of \fIoutput\fP\&.
.UNINDENT
.UNINDENT
.INDENT 7.0
.TP
.B int sasl_encodev(sasl_conn_t *conn,
.TP
.B const struct iovec * invec,
.TP
.B unsigned numiov,
.TP
.B const char ** output,
.TP
.B unsigned * outputlen);
.UNINDENT
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – is the SASL connection context
.IP \(bu 2
\fBoutput\fP – contains the decoded data and is allocated/freed by
the library.
.IP \(bu 2
\fBoutputlen\fP – length of \fIoutput\fP\&.
.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.sp
Other return codes indicate errors and should be handled.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_decode(3),
sasl_errors(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[�
��man/man3/sasl_errstring.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_ERRSTRING" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_errstring \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

const char * sasl_errstring(int saslerr,
    const char * langlist,
    const char ** outlang);
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B const char * sasl_errstring(int saslerr,
.TP
.B const char * langlist,
.TP
.B const char ** outlang);
\fBsasl_errstring\fP is called to convert a SASL return code (an
integer) into a human readable string. At this time the
only language available is American English. Note that if the string is
going to be sent to the client, a server should
call sasl_usererr(3) on a return code first.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBsaslerr\fP – specifies the error number to convert.
.IP \(bu 2
\fBlanglist\fP – is currently unused; Use NULL.
.IP \(bu 2
\fBoutlang\fP – specifies  the desired \fI\%RFC 1766\fP language for
output.  NULL defaults to “en‐us”; currently the only supported
language.
.UNINDENT
.UNINDENT
.sp
This function is not the recommended means of extracting error code
information from SASL,  instead  application  should use
sasl_errdetail(3), which contains this information (and more).
.UNINDENT
.SH RETURN VALUE
.sp
Returns the string.  If  langlist  is  NULL,  US‐ASCII  is used.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_errdetail(3),
sasl_errors(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[E��ePPman/man3/sasl_idle.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_IDLE" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_idle \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_idle( sasl_conn_t *conn)
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_idle(sasl_conn_t\fI\ *conn\fP)
\fBsasl_idle()\fP may be called during an idle period to allow the
SASL library or any mechanisms to perform any necessary
precalculation.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – may be NULL to do precalculation prior to a
connection taking place.
.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
Returns 1 if action was taken, 0 if no action was taken.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[�-H��
�
man/man3/sasl_listmech.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_LISTMECH" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_listmech \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_listmech(sasl_conn_t *conn,
                 const char *user,
                 const char *prefix,
                 const char *sep,
                 const char *suffix,
                 const char **result,
                 unsigned *plen,
                 int *pcount);
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_listmech(sasl_conn_t *conn,
.TP
.B const char *user,
.TP
.B const char *prefix,
.TP
.B const char *sep,
.TP
.B const char *suffix,
.TP
.B const char **result,
.TP
.B unsigned *plen,
.TP
.B int *pcount);
\fBsasl_listmech\fP returns a string listing the SASL names of
all the mechanisms available to the specified user. This
is typically given to the client through a capability command
or initial server response. Client applications need
this list so that they know what mechanisms the server
supports.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – the SASL context for this connection
.IP \(bu 2
\fBuser\fP – (optional) restricts the mechanism list to only those
available to the user.
.IP \(bu 2
\fBprefix\fP – appended to beginning of result
.IP \(bu 2
\fBsep\fP – appended between mechanisms
.IP \(bu 2
\fBsuffix\fP – appended to end of result
.IP \(bu 2
\fBresult\fP – NULL terminated result string (allocated/freed by
library)
.IP \(bu 2
\fBplen\fP – length of result filled in by library. May be NULL
.IP \(bu 2
\fBpcount\fP – Number of mechanisms available (filled in by library).
May be NULL
.UNINDENT
.UNINDENT
.UNINDENT
.SH EXAMPLE
.sp
.nf
sasl_listmech(conn,NULL,"(",",",")",&mechlist,NULL,NULL);
.fi
.sp
may give the following string as a result:
.INDENT 0.0
.INDENT 3.5
\fI(ANONYMOUS,KERBEROS_V4,DIGEST‐MD5)\fP
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_server_new(3),
sasl_errors(3), sasl_client_new(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[���55man/man3/sasl_callbacks.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_CALLBACKS" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_callbacks \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>
.fi
.SH DESCRIPTION
.sp
\fBsasl_callbacks\fP  are  used  when the application needs some
information from the application. Common reasons are  getting
for  getting  usernames and passwords. A client MUST
specify   what   callbacks    they    support    in    the
sasl_client_init(3)/sasl_server_init(3)
or   sasl_client_new(3)/sasl_server_new(3)
calls. If an authentication  mechanism  needs  a  callback
that  the application does not state it supports it cannot
be used.
.sp
If a callback has an id parameter that should  be  checked
to make sure you are giving the appropriate value.
.sp
If  an application is using the client side of the library
functions to  handle  the  callbacks  are  not  necessary.
Instead  the  application  may  deal  with  callbacks  via
SASL_INTERACT’s.  See  sasl_client_start(3)/sasl_client_step(3)  for  more
information.
.SS Common Callbacks
.INDENT 0.0
.TP
.B sasl_getopt_t
Get an option value
.TP
.B sasl_log_t
Log message handler
.TP
.B sasl_getpath_t
Get  path  to search for plugins (e.g. SASL mechanisms)
.TP
.B sasl_verifyfile_t
Verify files for use by SASL
.TP
.B sasl_canon_user_t(3)
Username canonicalization function
.UNINDENT
.SS Client\-only Callbacks
.INDENT 0.0
.TP
.B sasl_getsimple_t
Get user/language list
.TP
.B sasl_getsecret_t
Get authentication secret
.TP
.B sasl_chalprompt_t(3)
Display challenge and prompt for response
.TP
.B sasl_getrealm_t
Get the realm for authentication
.UNINDENT
.SS Server\-only Callbacks
.INDENT 0.0
.TP
.B sasl_authorize_t(3)
Authorize policy callback
.TP
.B sasl_server_userdb_checkpass_t
verify plaintext password
.TP
.B sasl_server_userdb_setpass_t
set plaintext password
.TP
.B sasl_getconfpath_t
Get path to search  for  SASL  configuration  file
(server side only). New in SASL 2.1.22.
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl_errors(3) for a complete list.  \fBSASL_OK\fP  typically  indicates success.
.SH CONFORMING TO
.sp
\fI\%RFC 4422\fP
.SH SEE ALSO
.sp
sasl(3), sasl_errors(3), sasl_authorize_t(3),
sasl_log_t(3), sasl_getpath_t(3),
sasl_getconfpath_t(3), sasl_verifyfile_t(3),
sasl_canon_user_t(3),  sasl_getsimple_t(3),
sasl_getsecret_t(3), sasl_chalprompt_t(3),
sasl_getrealm_t(3), sasl_server_userdb_checkpass_t(3),
sasl_server_userdb_setpass_t(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[
�xxman/man3/sasl_verifyfile_t.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_VERIFYFILE_T" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_verifyfile_t \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

typedef enum {
    SASL_VRFY_PLUGIN, /* a DLL/shared library plugin */
    SASL_VRFY_CONF,   /* a configuration file */
    SASL_VRFY_PASSWD, /* a password storage file */
    SASL_VRFY_OTHER   /* some other file type */
} sasl_verify_type_t

int sasl_verifyfile_t(void *context,
                const char *file,
                sasl_verify_type_t type)
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_verifyfile_t(void *context,
.TP
.B const char *file,
.TP
.B sasl_verify_type_t type)
\fBsasl_verifyfile_t()\fP is used to check whether a given file is
okay for use by the SASL library.   This  is  intended  to
allow  applications  to  sanity  check  the environment. For example, to
ensure that plugins or the config file cannot  be  written
to.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBcontext\fP – context from the callback record
.IP \(bu 2
\fBcontext\fP – context from the callback record
.IP \(bu 2
\fBfile\fP – full path of the file to verify
.IP \(bu 2
\fBtype\fP – type of the file.
.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.sp
Other return codes indicate errors and should be handled.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_callbacks(3)
sasl_errors(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[@ؾ���man/man3/sasl_client_new.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_CLIENT_NEW" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_client_new \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_client_new(const char *service,
                    const char *serverFQDN,
                    const char *iplocalport,
                    const char *ipremoteport,
                    const sasl_callback_t *prompt_supp,
                    unsigned flags,
                    sasl_conn_t ** pconn);
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_client_new(const char *service,
.TP
.B const char *serverFQDN,
.TP
.B const char *iplocalport,
.TP
.B const char *ipremoteport,
.TP
.B const sasl_callback_t *prompt_supp,
.TP
.B unsigned flags,
.TP
.B sasl_conn_t ** pconn);
\fBsasl_client_new()\fP creates a new SASL context. This context will be
used for all SASL calls for one connection. It handles both
authentication and integrity/encryption layers after authentication.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBservice\fP – the registered name of the service (usually the protocol name) using SASL (e.g. “imap”).
.IP \(bu 2
\fBserverFQDN\fP – the fully qualified domain name of the server (e.g. “serverhost.example.com”).
.IP \(bu 2
\fBiplocalport\fP – the IP and port of the local side of the
connection, or NULL.  If iplocalport is NULL it will disable
mechanisms that require IP address information.  This
string must be in one of the   following   formats:
“a.b.c.d;port”  (IPv4),  “e:f:g:h:i:j:k:l;port” (IPv6), or
“e:f:g:h:i:j:a.b.c.d;port” (IPv6)
.IP \(bu 2
\fBipremoteport\fP – the IP and port of the remote side of the
connection, or NULL (see iplocalport)
.IP \(bu 2
\fBprompt_supp\fP – a list of client interactions supported
that is unique to this connection. If this parameter is
NULL the global callbacks (specified in sasl_client_init(3))
will be used. See sasl_callbacks(3) for more information.
.IP \(bu 2
\fBflags\fP – are connection flags (see below)
.IP \(bu 2
\fBpconn\fP – the connection context allocated by the library.
This structure will be used for all future SASL calls for
this connection.
.UNINDENT
.UNINDENT
.UNINDENT
.SS Connection Flags
.sp
Flags that may be passed to \fBsasl_client_new()\fP:
.INDENT 0.0
.IP \(bu 2
\fISASL_SUCCESS_DATA\fP: The protocol supports a server‐last send
.IP \(bu 2
.INDENT 2.0
.TP
.B \fISASL_NEED_PROXY\fP: Force the use of a mechanism that supports an
authorization id that is not the authentication id.
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL callback functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.sp
The following return codes indicate errors and should either be handled or the authentication
session should be quit:
.INDENT 0.0
.IP \(bu 2
\fBSASL_NOMECH\fP: No mechanism meets requested properties
.IP \(bu 2
\fBSASL_BADPARAM\fP: Error in config file
.IP \(bu 2
\fBSASL_NOMEM\fP: Not enough memory to complete operation
.UNINDENT
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_callbacks(3),
sasl_client_init(3), sasl_client_start(3),
sasl_client_step(3), sasl_setprop(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[�(L�		man/man3/sasl_dispose.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_DISPOSE" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_dispose \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

void sasl_dispose(sasl_conn_t **pconn );
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_encode(sasl_conn_t *conn,
.TP
.B const char * input,
.TP
.B unsigned inputlen,
.TP
.B const char ** output,
.TP
.B unsigned * outputlen);
\fBsasl_dispose\fP is called when a SASL connection object is no longer needed.
.sp
Note that this is usually when the protocol session is done NOT when the
authentication is done since a security layer may have been negotiated.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – is the SASL connection context
.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
No return values
.SH CONFORMING TO
.sp
\fI\%RFC 4422\fP
.SH SEE ALSO
.sp
sasl(3), sasl_server_new(3), sasl_client_new(3),
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[A�ʟSSman/man3/sasl_server_step.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_SERVER_STEP" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_server_step \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_server_step(sasl_conn_t *conn,
    const char *clientin,
    unsigned clientinlen,
    const char ** serverout,
    unsigned * serveroutlen);
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_server_step(sasl_conn_t *conn,
.TP
.B const char *clientin,
.TP
.B unsigned clientinlen,
.TP
.B const char ** serverout,
.TP
.B unsigned * serveroutlen);
\fBsasl_server_step()\fP performs a step in  the  authentication negotiation.  It
returns \fBSASL_OK\fP if the whole negotiation is successful and
\fBSASL_CONTINUE\fP if
this step is ok but  at least  one more step is needed.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – is the SASL connection context
.IP \(bu 2
\fBclientin\fP – is the data given by the client (decoded  if  the
protocol encodes requests sent over the wire)
.IP \(bu 2
\fBclientinlen\fP – is the length of \fIclientin\fP
.IP \(bu 2
\fBserverout\fP – set by the library and should be sent to the client.
.IP \(bu 2
\fBserveroutlen\fP – length of \fIserverout\fP\&.
.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_CONTINUE\fP indicates success
and that there are more steps needed in the authentication. \fBSASL_OK\fP
indicates that the authentication is complete.
.sp
Other return codes indicate errors and should either be handled or the authentication
session should be quit.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP,
sasl_server_init(3), sasl_server_new(3),
sasl_server_start(3), sasl_errors(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[�]�K��man/man3/sasl_server_start.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_SERVER_START" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_server_start \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_server_start(sasl_conn_t * conn,
             const char * mech,
             const char * clientin,
             unsigned clientinlen,
             const char ** serverout,
             unsigned * serveroutlen);
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_server_start(sasl_conn_t * conn,
.TP
.B const char * mech,
.TP
.B const char * clientin,
.TP
.B unsigned * clientinlen,
.TP
.B const char ** serverout,
.TP
.B unsigned * serveroutlen);
\fBsasl_server_start()\fP begins  the  authentication  with the
mechanism specified with mech. This fails if the mechanism
is  not  supported.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – is the SASL connection context
.IP \(bu 2
\fBmech\fP – is the mechanism name that the client requested
.IP \(bu 2
\fBclientin\fP – is the client initial response, NULL if the protocol
lacks support for client‐send‐first or if the  other
end  did  not  have an initial send.  Note that no initial
client send is distinct from an initial  send  of  a  null
string, and the protocol MUST account for this difference.
.IP \(bu 2
\fBclientinlen\fP – is the length of initial response
.IP \(bu 2
\fBserverout\fP – is created by the plugin library. It is the initial
server response to send to the client. This is  allocated/freed by the
library and it is the job of the client
to send it over the network to the server.  Also  protocol
specific  encoding (such as base64 encoding) must needs to
be done by the server.
.IP \(bu 2
\fBserveroutlen\fP – is set to the length of initial server challenge
.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes. See sasl.h for a
complete list. \fBSASL_OK\fP is returned if the authentication is complete
and the user is authenticated.  \fBSASL_CONTINUE\fP  is returned if one or
more steps are still required in the authentication.
.sp
All other return values indicate errors and should be handled or the
authentication session should be quit.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP,
sasl_server_init(3), sasl_server_new(3),
sasl_server_step(3), sasl_errors(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[#��-((man/man3/sasl_auxprop.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_AUXPROP" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_auxprop \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/prop.h>

struct propctx *prop_new(unsigned estimate)

int prop_dup(struct propctx *src_ctx,
             struct propctx *dst_ctx)

int prop_request(struct propctx *ctx,
                 const char **names)

const struct propval *prop_get(struct propctx *ctx)

int prop_getnames(struct propctx *ctx, const char **names,
                  struct propval *vals)

void prop_clear(struct propctx *ctx, int requests)

void prop_erase(struct propctx *ctx, const char *name)

void prop_dispose(struct propctx **ctx)

int prop_format(struct propctx *ctx, const char *sep, int seplen,
                char *outbuf, unsigned outmax, unsigned *outlen)

int prop_set(struct propctx *ctx, const char *name,
             const char *value, int vallen)

int prop_setvals(struct propctx *ctx, const char *name,
                 const char **values)
.fi
.SH DESCRIPTION
.sp
SASL auxiliary properties are used to obtain properties
from external sources during the authentication process.
For example,  a mechanism might need to query an LDAP
server to obtain the authentication secret.  The application probably needs other information from there as well,
such as home directory or UID.   The auxiliary property
interface allows the two to cooperate, and only results in
a single query against the LDAP server (or other property
sources).
.sp
Property lookups take place directly after user canonicalization occurs.  Therefore, all requests should be
registered with the context before that time.   Note that
requests can also be registered using the
sasl_auxprop_request(3)  function.   Most of the functions listed
below, however, require a property context which can be
obtained by calling sasl_auxprop_getctx(3)\&.
.SH API DESCRIPTION
.INDENT 0.0
.TP
.B struct \fI\%propctx\fP *prop_new(unsigned\fI\ estimate\fP)
Create a new property context.  Probably unnecessary for application developers
to call this at any point.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBestimate\fP – is the estimate of storage needed in total for requests & responses.  A value of 0 implies the library default.
.UNINDENT
.TP
.B Returns
a new property context: \fI\%propctx\fP
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B int prop_dup(struct \fI\%propctx\fP\fI\ *src_ctx\fP, struct \fI\%propctx\fP\fI\ *dst_ctx\fP)
Duplicate a given property context.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBsrc_ctx\fP (\fI\%propctx\fP) – Property context to copy.
.IP \(bu 2
\fBdst_ctx\fP (\fI\%propctx\fP) – Destination context to copy into.
.UNINDENT
.TP
.B Returns
SASL error code.
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B int prop_request(struct \fI\%propctx\fP\fI\ *ctx\fP, const char\fI\ **names\fP)
Add properties to the request list of a given context.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBctx\fP (\fI\%propctx\fP) – The property context to add add the request list to.
.IP \(bu 2
\fBnames\fP – is the NULL\-terminated array of property names,  and must persist until the requests are cleared or the context is disposed of with a call to \fI\%prop_dispose()\fP\&.
.UNINDENT
.TP
.B Returns
SASL error code
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B const struct \fI\%propval\fP *prop_get(struct \fI\%propctx\fP\fI\ *ctx\fP)
Fetch out the property values from a context.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBctx\fP (\fI\%propctx\fP) – The property context to fetch from.
.UNINDENT
.TP
.B Returns
a NULL\-terminated array of property values from the given context.
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B int prop_getnames(struct \fI\%propctx\fP\fI\ *ctx\fP, const char\fI\ **names\fP, struct \fI\%propval\fP\fI\ *vals\fP)
Fill in a (provided) array of property values based
on a list of property names.  This implies that
the \fBvals\fP array is at least as long as the  \fBnames\fP
array.  The values that are filled in by this call
persist   until   next   call   to   \fI\%prop_request()\fP,
\fI\%prop_clear()\fP, or \fI\%prop_dispose()\fP on context.  If a name
specified here was never requested, then its associated
values entry will be set to NULL.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBctx\fP (\fI\%propctx\fP) – The property context to fill in.
.UNINDENT
.TP
.B Returns
number of matching properties that were found, or a SASL error code.
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B void prop_clear(struct \fI\%propctx\fP\fI\ *ctx\fP, int\fI\ requests\fP)
Clear values and (optionally) requests from a property context.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBctx\fP (\fI\%propctx\fP) – The property context to clear.
.IP \(bu 2
\fBrequests\fP – set to 1 if the requests should be cleared, 0 otherwise.
.UNINDENT
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B void prop_erase(struct \fI\%propctx\fP\fI\ *ctx\fP, const char\fI\ *name\fP)
Securely erase the value of a property from a context.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBctx\fP (\fI\%propctx\fP) – The property context to find the property in.
.IP \(bu 2
\fBname\fP – is the name of the property to erase.
.UNINDENT
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B void prop_dispose(struct \fI\%propctx\fP\fI\ **ctx\fP)
Disposes of a property context and NULLifys the pointer.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBctx\fP (\fI\%propctx\fP) – The property context to clear.
.UNINDENT
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B int prop_format(struct \fI\%propctx\fP\fI\ *ctx\fP, const char\fI\ *sep\fP, int\fI\ seplen\fP, char\fI\ *outbuf\fP, unsigned\fI\ outmax\fP, unsigned\fI\ *outlen\fP)
Format the requested property names into a string.
This not intended for use by the application (\fIonly
by auxprop plugins\fP).
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBctx\fP (\fI\%propctx\fP) – The property context to extract values from.
.IP \(bu 2
\fBsep\fP – the separator to use for the string
.IP \(bu 2
\fBoutbuf\fP – destination string. Caller must allocate the buffer of length \fBoutmax\fP (including NUL terminator).
.IP \(bu 2
\fBoutlen\fP – if non\-NULL, will contain the length of the resulting string (excluding NUL terminator).
.UNINDENT
.TP
.B Returns
SASL error code.
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B int prop_set(struct \fI\%propctx\fP\fI\ *ctx\fP, const char\fI\ *name\fP, const char\fI\ *value\fP, int\fI\ vallen\fP)
Adds a property value to the context.  \fIThis is intended for use by auxprop plugins only.\fP
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBctx\fP (\fI\%propctx\fP) – The property context to add a value to.
.IP \(bu 2
\fBname\fP – the name of the property to receive the new value,  or NULL, which implies that the value will be added to the same property as the last call to either \fI\%prop_set()\fP or \fI\%prop_setvals()\fP\&.
.IP \(bu 2
\fBvalue\fP – the new value (of length \fIvallen\fP)
.IP \(bu 2
\fBvallen\fP – the length of the string \fIvalue\fP\&.
.UNINDENT
.TP
.B Returns
SASL error code
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B int prop_setvals(struct \fI\%propctx\fP\fI\ *ctx\fP, const char\fI\ *name\fP, const char\fI\ **values\fP)
Adds multiple values to a single property.  \fIThis is intended for use by auxprop plugins only\fP\&.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBctx\fP (\fI\%propctx\fP) – The property context to add values to.
.IP \(bu 2
\fBname\fP – The name of the property to receive the new value, or NULL, which implies that the values will be added to the same property as the last call to either \fI\%prop_set()\fP or \fI\%prop_setvals()\fP\&.
.IP \(bu 2
\fBvalues\fP – A NULL\-terminated array of values to be added the property.
.UNINDENT
.TP
.B Returns
SASL error code
.UNINDENT
.UNINDENT
.SH DATA STRUCTURES
.INDENT 0.0
.TP
.B propval
A struct holding a name and its property values. A name can have zero or more values.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBname\fP – \fBconst char *\fP\&. Name of this propval. NULL means end of list.
.IP \(bu 2
\fBvalues\fP – \fBconst char **\fP\&. List of string values. If property not found, values == NULL. If property found with no values, then *values == NULL
.UNINDENT
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B propctx
A property context.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBvalues\fP (\fI\%propval\fP *) – List of property values in this context.
.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
The property functions that return an int return SASL error codes.   See  sasl_errors(3)\&.   Those that return
pointers will return a valid pointer on success, or NULL on any error.
.SH CONFORMING TO
.sp
\fI\%RFC 4422\fP
.SH SEE ALSO
.sp
sasl(3), sasl_errors(3),
sasl_auxprop_request(3), sasl_auxprop_getctx(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[�"�man/man3/sasl_encode.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_ENCODE" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_encode \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_encode(sasl_conn_t *conn,
                const char * input,
                unsigned inputlen,
                const char ** output,
                unsigned * outputlen);

int sasl_encodev(sasl_conn_t *conn,
                const struct iovec * invec,
                unsigned numiov,
                const char ** output,
                unsigned * outputlen);
.fi
.SH DESCRIPTION
.sp
\fBsasl_encode\fP encodes data to be sent to be sent to a remote host  who  we’ve
had  a successful authentication session with. If there  is  a  negotiated
security  the  data  in signed/encrypted  and  the  output  should be sent
without modification to the remote host. If there is  no  security layer the
output is identical to the input.
.sp
\fBsasl_encodev\fP does the same, but for a \fIstruct iovec\fP instead
of a character buffer.
.INDENT 0.0
.TP
.B int sasl_encode(sasl_conn_t *conn,
.TP
.B const char * input,
.TP
.B unsigned inputlen,
.TP
.B const char ** output,
.TP
.B unsigned * outputlen);
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – is the SASL connection context
.IP \(bu 2
\fBoutput\fP – contains the decoded data and is allocated/freed by
the library.
.IP \(bu 2
\fBoutputlen\fP – length of \fIoutput\fP\&.
.UNINDENT
.UNINDENT
.INDENT 7.0
.TP
.B int sasl_encodev(sasl_conn_t *conn,
.TP
.B const struct iovec * invec,
.TP
.B unsigned numiov,
.TP
.B const char ** output,
.TP
.B unsigned * outputlen);
.UNINDENT
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBconn\fP – is the SASL connection context
.IP \(bu 2
\fBoutput\fP – contains the decoded data and is allocated/freed by
the library.
.IP \(bu 2
\fBoutputlen\fP – length of \fIoutput\fP\&.
.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.sp
Other return codes indicate errors and should be handled.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_decode(3),
sasl_errors(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[�2qrrman/man3/sasl_server_init.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_SERVER_INIT" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_server_init \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_server_init(const sasl_callback_t *callbacks,
                     const char *appname);
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_server_init(const sasl_callback_t *callbacks,
.TP
.B const char *appname);
\fBsasl_server_init()\fP initializes SASL.  It  must  be  called
before  any  calls to sasl_server_start, and only once per
process.  This call initializes all SASL mechanism drivers
(e.g.  authentication mechanisms). These are usually found
in the /usr/lib/sasl2 directory but the directory  may  be
overridden  with the SASL_PATH environment variable (or at
compile time).
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBcallbacks\fP – specifies the base callbacks for all client connections.
See the sasl_callbacks(3) man page for more information.
.IP \(bu 2
\fBappname\fP – is the name of the application.  It  is  used to find the
default configuration file.
.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.sp
Other return codes indicate errors and should either be handled or the authentication
session should be quit.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_callbacks(3),
sasl_server_new(3), sasl_server_start(3),
sasl_server_step(3), sasl_errors(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[^AEEman/man3/sasl_getsimple_t.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_GETSIMPLE_T" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_getsimple_t \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

int sasl_getsimple_t(void *context,
                    int id,
                    const char ** result,
                    unsigned * len);
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B int sasl_getsimple_t(void *context,
.TP
.B int id,
.TP
.B const char ** result,
.TP
.B unsigned * len);
\fBsasl_getsimple_t\fP is used to retrieve simple things from
the application. In practice this is authentication name,
authorization name, and realm.
.INDENT 7.0
.TP
.B Parameters
.INDENT 7.0
.IP \(bu 2
\fBcontext\fP – SASL connection context
.IP \(bu 2
\fBid\fP – 
.sp
indicates which value is being requested.  Possible values
include:
.INDENT 2.0
.IP \(bu 2
SASL_CB_USER     ‐ Client user identity to login as
.IP \(bu 2
SASL_CB_AUTHNAME ‐ Client authentication name
.IP \(bu 2
SASL_CB_LANGUAGE ‐ Comma‐separated list of \fI\%RFC 1766\fP languages
.IP \(bu 2
SASL_CB_CNONCE   ‐ Client‐nonce (for testing mostly)
.UNINDENT

.IP \(bu 2
\fBresult\fP – value of the item requested
.IP \(bu 2
\fBlen\fP – lenth of the result
.UNINDENT
.UNINDENT
.UNINDENT
.SH RETURN VALUE
.sp
SASL  callback  functions should return SASL return codes.
See sasl.h for a complete list. \fBSASL_OK\fP indicates success.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP, sasl_callbacks(3),
sasl_errors(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[���ooman/man3/sasl_done.3nu�[���.\" Man page generated from reStructuredText.
.
.TH "SASL_DONE" "3" "November 08, 2018" "2.1.27" "Cyrus SASL"
.SH NAME
sasl_done \- Cyrus SASL documentation
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
.nf
#include <sasl/sasl.h>

void sasl_done( void );
.fi
.SH DESCRIPTION
.INDENT 0.0
.TP
.B void sasl_done( void );
\fBsasl_done()\fP is  called  when  the application is completely
done with the SASL library.
.UNINDENT
.SH RETURN VALUE
.sp
No return values.
.SH SEE ALSO
.sp
\fI\%RFC 4422\fP,:saslman:\fIsasl(3)\fP,
sasl_server_init(3), sasl_client_init(3)
.SH AUTHOR
The Cyrus Team
.SH COPYRIGHT
1993-2016, The Cyrus Team
.\" Generated by docutils manpage writer.
.
PK�*[-�	�	man/man8/sasldblistusers2.8nu�[���.\" sasldblistusers - List users in sasldb file
.\" Tim Martin 3/8/00
.\"

.\" Copyright (c) 2000 Carnegie Mellon University.  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 name ""Carnegie Mellon University"" must not be used to
.\"    endorse or promote products derived from this software without
.\"    prior written permission. For permission or any other legal
.\"    details, please contact  
.\"      Office of Technology Transfer
.\"      Carnegie Mellon University
.\"      5000 Forbes Avenue
.\"      Pittsburgh, PA  15213-3890
.\"      (412) 268-4387, fax: (412) 268-7395
.\"      tech-transfer@andrew.cmu.edu
.\"
.\" 4. Redistributions of any form whatsoever must retain the following
.\"    acknowledgment:
.\"    ""This product includes software developed by Computing Services
.\"     at Carnegie Mellon University (http://www.cmu.edu/computing/).""
.\"
.\" CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
.\" THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
.\" AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY 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.

.\"
.TH SASLDBLISTUSERS2 8 "March 7, 2005" "CMU SASL"
.SH NAME
sasldblistusers2 \- list users in sasldb
.SH SYNOPSIS
.B sasldblistusers2
.RB [ -f\ file ]
.RB [ -v ]
.SH DESCRIPTION
.I sasldblistusers2
is used to list the users in the SASL password database (usually
/etc/sasldb2). This will NOT list all the users in /etc/passwd, shadow,
PAM, etc. only those created by SASL (via \fIsaslpasswd2\fR).
.SH OPTIONS
.TP
.B -f file
use
.B file
for sasldb
.TP
.B -v
Print libsasl2 version number and exit.
.SH SEE ALSO
saslpasswd2(8)
.TP
rfc4422 \- Simple Authentication and Security Layer (SASL)
PK�*[ήiWWman/man8/pluginviewer.8nu�[���.\" pluginviewer.8 -- pluginviewer man page
.\" Alexey Melnikov
.\"

.\" Copyright (c) 2006 Carnegie Mellon University.  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 name ""Carnegie Mellon University"" must not be used to
.\"    endorse or promote products derived from this software without
.\"    prior written permission. For permission or any other legal
.\"    details, please contact  
.\"      Office of Technology Transfer
.\"      Carnegie Mellon University
.\"      5000 Forbes Avenue
.\"      Pittsburgh, PA  15213-3890
.\"      (412) 268-4387, fax: (412) 268-7395
.\"      tech-transfer@andrew.cmu.edu
.\"
.\" 4. Redistributions of any form whatsoever must retain the following
.\"    acknowledgment:
.\"    ""This product includes software developed by Computing Services
.\"     at Carnegie Mellon University (http://www.cmu.edu/computing/).""
.\"
.\" CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
.\" THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
.\" AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY 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.

.\"
.TH PLUGINVIEWER 8 "Apr 10, 2006" "CMU SASL"
.SH NAME
pluginviewer \- list loadable SASL plugins and their properties
.SH SYNOPSIS
.B pluginviewer
.RB [ -a ]
.RB [ -s ]
.RB [ -c ]
.RB [ -b\ min=N,max=N ]
.RB [ -e\ ssf=N,id=ID ]
.RB [ -m\ MECHS ]
.RB [ -x\ AUXPROP_MECH ]
.RB [ -f\ FLAGS ]
.RB [ -p\ PATH ]
.SH DESCRIPTION
.I pluginviewer
can be used by a server administrator to troubleshoot SASL installations.
The utility can list loadable (properly configured) client and server
side plugins, as well as auxprop plugins.
.
.SH OPTIONS
.TP
.B -a
List auxprop plugins.
.TP
.B -s
List server authentication (SASL) plugins.
.TP
.B -c
List client authentication (SASL) plugins.
.TP
.B -b min=N1,max=N2
List client authentication (SASL) plugins.
Strength of the SASL security layer in bits. min=N1 specifies the minumum strength
to use (1 => integrity protection). max=N2 specifies the maximum strength to use.
Only SASL mechanisms which support security layer with strength M such that N1 <= M <= N2
will be shown.
.TP
.B -e ssf=N,id=ID
Assume that an external security layer (e.g. TLS) with N-bit strength is installed.
The ID is the authentication identity used by the external security layer.
.TP
.B -m MECHS
Limit listed SASL plugins to the ones included in the MECHS (space separated) list.
.TP
.B -x AUXPROP_MECHS
Limit listed auxprop plugins to the one listed in the AUXPROP_MECHS (space separated) list.
.TP
.B -f FLAGS
Set security flags. FLAGS is a comma separated list of one or more of the following security flags:
noplain (SASL mechanism doesn\'t send password in the clear during authentication),
noactive (require protection from active attacks), nodict (require mechanisms which are
secure against passive dictionary attacks), forwardsec (require forward secrecy),
passcred (require mechanisms that can delegate client credentials),
maximum (require all security flags).
.TP
.B -p PATH
Specifies a colon-separated search path for plugins.
.SH SEE ALSO
.TP
rfc4422 \- Simple Authentication and Security Layer (SASL)
PK�*[�KKppman/man8/saslpasswd2.8nu�[���.\" saslpasswd.8 -- saslpasswd man page
.\" Rob Earhart
.\"

.\" Copyright (c) 2000 Carnegie Mellon University.  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 name ""Carnegie Mellon University"" must not be used to
.\"    endorse or promote products derived from this software without
.\"    prior written permission. For permission or any other legal
.\"    details, please contact  
.\"      Office of Technology Transfer
.\"      Carnegie Mellon University
.\"      5000 Forbes Avenue
.\"      Pittsburgh, PA  15213-3890
.\"      (412) 268-4387, fax: (412) 268-7395
.\"      tech-transfer@andrew.cmu.edu
.\"
.\" 4. Redistributions of any form whatsoever must retain the following
.\"    acknowledgment:
.\"    ""This product includes software developed by Computing Services
.\"     at Carnegie Mellon University (http://www.cmu.edu/computing/).""
.\"
.\" CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
.\" THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
.\" AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY 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.

.\"
.TH SASLPASSWD2 8 "Mar 7, 2005" "CMU SASL"
.SH NAME
saslpasswd2 \- set a user's sasl password
.SH SYNOPSIS
.B saslpasswd2
.RB [ -p ]
.RB [ -d ]
.RB [ -c ]
.RB [ -n ]
.RB [ -f\ file ]
.RB [ -u\ domain ]
.RB [ -a\ appname ]
.RB [ -v ]
.B userid
.SH DESCRIPTION
.I saslpasswd2
is used by a server administrator to set a user's sasl password for
server programs and SASL mechanisms which use the standard libsasl
database of user secrets.
.SH OPTIONS
.TP
.B -p
Pipe mode \- saslpasswd2 will neither prompt for the password nor
verify that it was entered correctly.  This is the default when
standard input is not a terminal.
.TP
.B -c
Creates an entry for the user if the user doesn't already exist.  This
is mutually exclusive with the
.B -d
(delete user) flag.
.TP
.B -d
Deletes the entry for the user.  This is mutually exclusive with the
.B -c
(create user) flag.
.TP
.B -n
Don't set the plaintext \fIuserPassword\fR property for the user.  Only
mechanism-specific secrets will be set (e.g. OTP, SRP)
.TP
.B -u domain
use
.B domain
for user domain (realm).
.TP
.B -f file
use
.B file
for sasldb
.TP
.B -a appname
use
.B appname
as application name.
.TP
.B -v
Print libsasl2 version number and exit.
.SH SEE ALSO
sasldblistusers2(8)
.TP
rfc4422 \- Simple Authentication and Security Layer (SASL)
PK�*[S
�Ƌ�man/man8/testsaslauthd.8nu�[���.\"                                      Hey, EMACS: -*- nroff -*-
.TH TESTSASLAUTHD 8 "14 October 2006"
.SH NAME
testsaslauthd \- test utility for the SASL authentication server
.SH SYNOPSIS
.B testsaslauthd
.RI "[ " \(hyr " " realm " ] [ " \(hys " " servicename " ] [ " \(hyf " " socket " " path " ] [ " \(hyR " " repeatnum " ]"
.SH DESCRIPTION
This manual page documents briefly the
.B testsaslauthd
command.
.PP
.SH SEE ALSO
.BR saslauthd (8).
.br
.SH AUTHOR
testsaslauthd was written by Carnegie Mellon University.
.PP
This manual page was written by Roberto C. Sanchez <roberto@connexer.com>,
for the Debian project (but may be used by others).
PK�*[�ƞ�A A man/man8/saslauthd.8nu�[���.\" $Id: saslauthd.mdoc,v 1.19 2009/04/11 20:08:48 mel Exp $
.\" Copyright 1997-2001 Messaging Direct Ltd. All rights reserved.
.\"
.\" This manpage uses the BSD mdoc manpage macros. Please don't
.\" downgrade it to -man. The -mdoc macros are included with
.\" GNU roff, and, of course, with the BSD distributions.
.\"
.\" To make life easier for sites that don't support -mdoc,
.\" please generate (and commit!) an updated pre-formatted
.\" manpage in saslauthd.8 whenever you change this source
.\" version. Only the pre-formatted manpage is installed.
.\"
.Dd 12 12 2005
.Dt SASLAUTHD 8
.Os "CMU-SASL"
.Sh NAME
.Nm saslauthd
.Nd sasl authentication server
.Sh SYNOPSIS
.Nm
.Fl a
.Ar authmech
.Op Fl \&Tvdchlr
.Op Fl O Ar option
.Op Fl m Ar mux_path
.Op Fl n Ar threads
.Op Fl s Ar size
.Op Fl t Ar timeout
.Sh DESCRIPTION
.Nm
is a daemon process that handles plaintext authentication requests
on behalf of the SASL library.
.Pp
The server fulfills two roles: it isolates all code requiring superuser
privileges into a single process, and it can be used to provide
.Em proxy
authentication services to clients that do not understand
SASL based authentication.
.Pp
.Nm
should be
started from the system boot scripts when going to
multi-user mode. When running against a protected authentication
database (e.g. the
.Li shadow
mechanism),
it must be run as the superuser. Otherwise it is recommended to run
daemon unprivileged as saslauth:saslauth, requiring the runtime directory
to have root:saslauthd owner. You can do so by following
these steps in machines using
.Xr systemd 1
:

.Bl -enum -compact
.It
create directory
.Pa /etc/systemd/system/saslauthd.service.d/
.It
create file
.Pa /etc/systemd/system/saslauthd.service.d/user.conf
with content
.Bd -literal
[Service]
User=saslauth
Group=saslauth

.Ed
.It
Reload systemd service file: run
.Dq systemctl daemon-reload
.El
.Ss Options
Options named by lower\-case letters configure the server itself.
Upper\-case options control the behavior of specific authentication
mechanisms; their applicability to a particular authentication
mechanism is described in the
.Sx AUTHENTICATION MECHANISMS
section.
.Bl -tag -width indent
.It Fl a Ar authmech
Use
.Ar authmech
as the authentication mechanism. (See the
.Sx AUTHENTICATION MECHANISMS
section below.) This parameter is mandatory.
.It Fl O Ar option
A mechanism specific option (e.g. rimap hostname or config file path)
.It Fl H Ar hostname
The remote host to be contacted by the
.Li rimap
authentication mechanism. (Deprecated, use -O instead)
.It Fl m Ar path
Use
.Ar path
as the pathname to the named socket to listen on for
connection requests. This must be an absolute pathname, and MUST NOT
include the trailing "/mux".  Note that the default for this value
is "/var/state/saslauthd" (or what was specified at compile time)
and that this directory must exist for saslauthd to function.
.It Fl n Ar threads
Use
.Ar threads
processes for responding to authentication queries. (default: 5)  A
value of zero will indicate that saslauthd should fork an individual
process for each connection.  This can solve leaks that occur in some
deployments.
.It Fl s Ar size
Use
.Ar size
as the table size of the hash table (in kilobytes)
.It Fl t Ar timeout
Use
.Ar timeout
as the expiration time of the authentication cache (in seconds)
.It Fl T
Honour time-of-day login restrictions.
.It Fl h
Show usage information
.It Fl c
Enable caching of authentication credentials
.It Fl l
Disable the use of a lock file for controlling access to accept().
.It Fl r
Combine the realm with the login (with an '@' sign in between).  e.g.
login: "foo" realm: "bar" will get passed as login: "foo@bar".  Note
that the realm will still be passed, which may lead to unexpected
behavior for authentication mechanisms that make use of the realm,
however for mechanisms which don't, such as
.Ar getpwent ,
this is the only way to authenticate domain-specific users sharing the
same userid.
.It Fl v
Print the version number and available authentication
mechanisms on standard error, then exit.
.It Fl d
Debugging mode.
.El
.Ss Logging
.Nm
logs its activities via
.Nm syslogd
using the
.Dv LOG_AUTH
facility.
.Sh AUTHENTICATION MECHANISMS
.Nm
supports one or more
.Qq authentication mechanisms ,
dependent upon the facilities provided by the underlying operating system.
The mechanism is selected by the
.Fl a
flag from the following list of choices:
.Bl -tag -width "kerberos4"
.It Li dce
.Em (AIX)
.Pp
Authenticate using the DCE authentication environment.
.It Li getpwent
.Em (All platforms)
.Pp
Authenticate using the
.Fn getpwent
library function. Typically this authenticates against the
local password file. See your system's
.Xr getpwent 3
man page for details.
.It Li kerberos4
.Em (All platforms)
.Pp
Authenticate against the local Kerberos 4 realm. (See the
.Sx NOTES
section for caveats about this driver.)
.It Li kerberos5
.Em (All platforms)
.Pp
Authenticate against the local Kerberos 5 realm.
.It Li pam
.Em (Linux, Solaris)
.Pp
Authenticate using Pluggable Authentication Modules (PAM).
.It Li rimap
.Em (All platforms)
.Pp
Forward authentication requests to a remote IMAP server. This driver
connects to a remote IMAP server, specified using the -O flag,
and attempts to login (via an IMAP
.Ql LOGIN
command) using the credentials 
supplied to the local
server. If the remote authentication succeeds the local connection
is also considered to be authenticated. The remote connection is closed
as soon as the tagged response from the
.Ql LOGIN
command is received from the remote
server.
.Pp
The
.Ar option
parameter to the
.Fl O
flag describes the remote server to forward
authentication requests to.
.Ar hostname
can be a hostname (imap.example.com) or a dotted\-quad IP address
(192.168.0.1). The latter is useful if the remote server is
multi\-homed and has network interfaces that are unreachable from
the local IMAP server. The remote host is contacted on the
.Ql imap
service port. A non\-default port can be specified by appending
a slash and the port name or number
to the
.Ar hostname
argument.
.Pp
The
.Fl O
flag and argument are mandatory when using the
.Li rimap
mechanism.
.It Li shadow
.Em (AIX, Irix, Linux, Solaris)
.Pp
Authenticate against the local
.Qq shadow password file .
The exact mechanism is system dependent.
.Nm
currently understands the
.Fn getspnam
and
.Fn getuserpw
library routines. Some systems
honour the
.Fl T
flag.
.It Li sasldb
.Em (All platforms)
.Pp
Authenticate against the
SASL authentication database.  Note that this is probably not what you
want to use, and is even disabled at compile-time by default.
If you want to use sasldb with the SASL library, you probably want to
use the pwcheck_method of "auxprop" along with the sasldb auxprop plugin
instead.
.It Li ldap
.Em (All platforms that support OpenLDAP 2.0 or higher)
.Pp
Authenticate against an ldap server.  The ldap configuration parameters are
read from /etc/saslauthd.conf.  The location of this file can be
changed with the -O parameter. See the LDAP_SASLAUTHD file included with the
distribution for the list of available parameters.
.It Li sia
.Em (Digital UNIX)
.Pp
Authenticate using the Digital
.Ux
Security Integration Architecture
(a.k.a.
.Qq enhanced security ) .
.El
.Sh NOTES
The
.Li kerberos4
authentication driver consumes considerable resources. To perform an
authentication it must obtain a ticket granting ticket
from the TGT server
.Sy on every authentication request.
The Kerberos library routines that obtain the TGT also create a
local ticket file, on the reasonable assumption that you will want
to save the TGT for use by other Kerberos applications. These ticket
files are unusable by
.Nm No ,
however there is no way not to create them. The overhead of creating
and removing
these ticket files can cause serious performance degradation on busy
servers. (Kerberos
was never intended to be used in this manner, anyway.)
.Sh FILES
.Bl -tag -width "/run/saslauthd/mux"
.It Pa /run/saslauthd/mux
The default communications socket.
.It Pa /etc/saslauthd.conf
The default configuration file for ldap support.
.El
.Sh SEE ALSO
.Xr passwd 1 ,
.Xr getpwent 3 ,
.Xr getspnam 3 ,
.Xr getuserpw 3 ,
.Xr sasl_checkpass 3
.Xr sia_authenticate_user 3 ,
PK�*[�V�]EE#licenses/alt-cyrus-sasl-lib/COPYINGnu�[���/* CMU libsasl
 * Tim Martin
 * Rob Earhart
 * Rob Siemborski
 */
/* 
 * Copyright (c) 1998-2003 Carnegie Mellon University.  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 name "Carnegie Mellon University" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For permission or any other legal
 *    details, please contact  
 *      Office of Technology Transfer
 *      Carnegie Mellon University
 *      5000 Forbes Avenue
 *      Pittsburgh, PA  15213-3890
 *      (412) 268-4387, fax: (412) 268-7395
 *      tech-transfer@andrew.cmu.edu
 *
 * 4. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by Computing Services
 *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
 *
 * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
 * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY 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�*[�R �ÿÿ%doc/alt-cyrus-sasl-lib/developer.htmlnu�[���

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>Developers &mdash; Cyrus SASL 2.1.27 documentation</title>
  

  
  
    <link rel="shortcut icon" href="_static/favicon.ico"/>
  

  

  
  
    

  

  
  
    <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
  

  
    <link rel="stylesheet" href="_static/cyrus.css" type="text/css" />
  

  
        <link rel="index" title="Index"
              href="genindex.html"/>
        <link rel="search" title="Search" href="search.html"/>
    <link rel="top" title="Cyrus SASL 2.1.27 documentation" href="index.html"/>
        <link rel="next" title="Converting Applications from v1 to v2" href="sasl/appconvert.html"/>
        <link rel="prev" title="Other Documentation &amp; Resources" href="sasl/resources.html"/> 

  
  
  

</head>

<body class="wy-body-for-nav" role="document">

  
  
<div class="pageheader">
  <ul>
    <li><a href="index.html">Home</a></li>
    <li><a href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
    <li><a href="download.html">Download</a></li>
    <li><a href="contribute.html">Contribute</a></li>
  </ul>
  <div>
    <a href="index.html">
      <img src="_static/logo.gif" alt="CYRUS SASL" />
    </a>
  </div>
</div>
<div style="clear: both;"></div>


  <div class="wy-grid-for-nav">

    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-nav-search">
        

        
 
          <a href="index.html">
 

  
          
          <img src="_static/logo.gif"  />
     
        </a>

        
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

        
      </div>

      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
        
          
          
              <p class="caption"><span class="caption-text">Cyrus SASL</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="download.html">Download</a><ul>
<li class="toctree-l2"><a class="reference internal" href="getsasl.html">Get SASL</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/release-notes/index.html">Release Notes</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#supported-product-series">Supported Product Series</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-1">Series 2.1</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#older-versions">Older Versions</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-2-0">Series 2: 2.0</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-1">Series 1</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="packager.html">Note for Packagers</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/quickstart.html">Quickstart guide</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#features">Features</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#typical-installation">Typical Installation</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/concepts.html">Concepts</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl">SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl-authentication-mechanisms">SASL Authentication Mechanisms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#security-layers">Security Layers</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#channel-binding">Channel Binding</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#realms">Realms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#protocols">Protocols</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#cyrus-sasl">Cyrus SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#the-glue-library">The Glue Library</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#plugins">Plugins</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="setup.html">Setup</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#tarball-installation">Tarball installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#unix-package-installation">Unix package Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#requirements">Requirements</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#build-configuration">Build Configuration</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#building-and-installation">Building and Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#compilation-hints">Compilation Hints</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#application-configuration">Application Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/upgrading.html">Upgrading from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#backwards-compatibility">Backwards Compatibility</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#coexistence-with-saslv1">Coexistence with SASLv1</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#database-upgrades">Database Upgrades</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#errors-on-migration">Errors on migration</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/components.html">Components</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-application">The Application</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-sasl-glue-layer">The SASL Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#plugins">Plugins</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-general">Plugins: General</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-sasl-mechanisms">Plugins: SASL Mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-auxiliary-property">Plugins: Auxiliary Property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-username-canonicalization">Plugins: Username Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#password-verification-services">Password Verification Services</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html">Options</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasl-library">SASL Library</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#auxiliary-property-plugin">Auxiliary Property Plugin</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#gssapi">GSSAPI</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ldapdb">LDAPDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-ldapdb">Notes on LDAPDB</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#examples">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ntlm">NTLM</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#otp">OTP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#digest-md5">Digest-md5</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasldb">SASLDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sasldb-with-lmdb">Notes on sasldb with LMDB</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sql-plugin">SQL Plugin</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sql">Notes on SQL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#id2">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#srp">SRP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#kerberos-v4">Kerberos V4</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/advanced.html">Advanced Usage</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/advanced.html#notes-for-advanced-usage-of-libsasl">Notes for Advanced Usage of libsasl</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/advanced.html#using-cyrus-sasl-as-a-static-library">Using Cyrus SASL as a static library</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="operations.html">Operations</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/sysadmin.html">System Administrators</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#what-sasl-is">What SASL is</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#authentication-and-authorization-identifiers">Authentication and authorization identifiers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#realms">Realms</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-sasl-works">How SASL works</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-plain-mechanism-sasl-checkpass-and-plaintext-passwords">The PLAIN mechanism, <code class="docutils literal"><span class="pre">sasl_checkpass()</span></code>, and plaintext passwords</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#shared-secrets-mechanisms">Shared secrets mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#kerberos-mechanisms">Kerberos mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-otp-mechanism">The OTP mechanism</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-to-set-configuration-options">How to set configuration options</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-default-configuration-file">The default configuration file</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#application-configuration">Application configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#troubleshooting">Troubleshooting</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/manpages.html">Man pages</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/manpages.html#library-files">(3) Library Files</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl.html"><strong>SASL</strong> - SASL Authentication Library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_authorize_t.html"><strong>sasl_authorize_t</strong> - The SASL authorization callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop.html"><strong>sasl_auxprop</strong> - How to work with SASL auxiliary properties</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_add_plugin.html"><strong>sasl_auxprop_add_plugin</strong> - add a SASL auxiliary property plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_getctx.html"><strong>sasl_auxprop_getctx</strong> - Acquire an auxiliary property context</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_request.html"><strong>sasl_auxprop_request</strong> - Request auxiliary properties from SASL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_callbacks.html"><strong>sasl_callbacks</strong> - How to work with SASL callbacks</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canon_user_t.html"><strong>sasl_canon_user_t</strong> - Application-supplied user canonicalization function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canonuser_add_plugin.html"><strong>sasl_canonuser_add_plugin</strong> - add a SASL user canonicalization plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_chalprompt_t.html"><strong>sasl_chalprompt_t</strong> - Realm acquisition callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkapop.html"><strong>sasl_checkapop</strong> - Check an APOP challenge/response</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkpass.html"><strong>sasl_checkpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_add_plugin.html"><strong>sasl_client_add_plugin</strong> - add a SASL client plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_done.html"><strong>sasl_client_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_init.html"><strong>sasl_client_init</strong> - SASL client authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_new.html"><strong>sasl_client_new</strong> - Create a new client authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_plug_init_t.html"><strong>sasl_client_plug_init_t</strong> - client plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_start.html"><strong>sasl_client_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_step.html"><strong>sasl_client_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode.html"><strong>sasl_decode</strong> - Decode data received</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode64.html"><strong>sasl_decode64</strong> - Decode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_dispose.html"><strong>sasl_dispose</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_done.html"><strong>sasl_done</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode.html"><strong>sasl_encode</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode64.html"><strong>sasl_encode64</strong> - Encode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encodev.html"><strong>sasl_encodev</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_erasebuffer.html"><strong>sasl_erasebuffer</strong> - erase buffer</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errdetail.html"><strong>sasl_errdetail</strong> - Retrieve  detailed information about an error</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errors.html"><strong>sasl_errors</strong> - SASL error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errstring.html"><strong>sasl_errstring</strong> - Translate a SASL return code to a human-readable form</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getcallback_t.html"><strong>sasl_getcallback_t</strong> - callback function to lookup a sasl_callback_t for a connection</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getconfpath_t.html"><strong>sasl_getconfpath_t</strong> - The SASL callback to indicate location of the config files</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getopt_t.html"><strong>sasl_getopt_t</strong> - The SASL get option callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getpath_t.html"><strong>sasl_getpath_t</strong> - The SASL callback to indicate location of the mechanism drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getprop.html"><strong>sasl_getprop</strong> - Get a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getrealm_t.html"><strong>sasl_getrealm_t</strong> - Realm Acquisition Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsecret_t.html"><strong>sasl_getsecret_t</strong> - The SASL callback for secrets (passwords)</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsimple_t.html"><strong>sasl_getsimple_t</strong> - The SASL callback for username/authname/realm</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_global_listmech.html"><strong>sasl_global_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_idle.html"><strong>sasl_idle</strong> - Perform precalculations during an idle period</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_listmech.html"><strong>sasl_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_log_t.html"><strong>sasl_log_t</strong> - The SASL logging callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_add_plugin.html"><strong>sasl_server_add_plugin</strong> - add a SASL server plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_done.html"><strong>sasl_server_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_init.html"><strong>sasl_server_init</strong> - SASL server authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_new.html"><strong>sasl_server_new</strong> - Create a new server authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_plug_init_t.html"><strong>sasl_server_plug_init_t</strong> - server plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_start.html"><strong>sasl_server_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_step.html"><strong>sasl_server_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_checkpass_t.html"><strong>sasl_server_userdb_checkpass_t</strong> - Plaintext Password Verification Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_setpass_t.html"><strong>sasl_server_userdb_setpass_t</strong> - UserDB Plaintext Password Setting Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_alloc.html"><strong>sasl_set_alloc</strong> - set the memory allocation functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_mutex.html"><strong>sasl_set_mutex</strong> - set the mutex lock functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_seterror.html"><strong>sasl_seterror</strong> - set the error string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setpass.html"><strong>sasl_setpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setprop.html"><strong>sasl_setprop</strong> - Set a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_user_exists.html"><strong>sasl_user_exists</strong> - Check if a user exists on server</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_usererr.html"><strong>sasl_usererr</strong> - Remove information leak about accounts from sasl error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_utf8verify.html"><strong>sasl_utf8verify</strong> - Verify a string is valid utf8</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_verifyfile_t.html"><strong>sasl_verifyfile_t</strong> - The SASL file verification</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/auxiliary_properties.html">Auxiliary Properties</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#auxiliary-properties-and-the-glue-layer">Auxiliary Properties and the Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#passwords-and-other-data">Passwords and other Data</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sasldb">sasldb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#ldapdb">ldapdb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sql">sql</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#user-canonicalization">User Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/authentication_mechanisms.html">Authentication Mechanisms</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#mechanisms">Mechanisms</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#anonymous">ANONYMOUS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#cram-md5">CRAM-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#digest-md5">DIGEST-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#external">EXTERNAL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#g2">G2</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gssapi">GSSAPI</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gss-spegno">GSS-SPEGNO</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#kerberos-v4">KERBEROS_V4</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#login">LOGIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#ntlm">NTLM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#otp">OTP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#passdss">PASSDSS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#plain">PLAIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#scram">SCRAM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#srp">SRP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#non-sasl-authentication">Non-SASL Authentication</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#summary">Summary</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/pwcheck.html">Pwcheck</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop">Auxprop</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop-hashed">Auxprop-hashed</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#saslauthd">Saslauthd</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#authdaemon">Authdaemon</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#alwaystrue">Alwaystrue</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auto-transition">Auto Transition</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/faq.html">Frequently Asked Questions</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/authorize-vs-authenticate.html">What is the difference between an Authorization ID and a Authentication ID?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/crammd5-digestmd5.html">Why do CRAM-MD5 and DIGEST-MD5 not work with CyrusSaslauthd?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/openldap-sasl-gssapi.html">How do I configure OpenLDAP +SASL+GSSAPI?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/plaintextpasswords.html">Why does CyrusSasl store plaintext passwords in its databases?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/rfcs.html">RFCs and drafts</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/upgrade-saslv2.html">Why am I having a problem running dbconverter-2 to upgrade from SASLv1 to SASLv2?</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/resources.html">Other Documentation &amp; Resources</a></li>
</ul>
</li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Developers</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/appconvert.html">Converting Applications from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-both-clients-and-servers">Tips for both clients and servers</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-clients">Tips for clients</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-servers">Tips for Servers</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/programming.html">Application Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#background">Background</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-did-the-world-work-before-sasl">How did the world work before SASL?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sasl-to-the-rescue">SASL to the rescue!</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#briefly">Briefly</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-the-cyrus-sasl-library-good-for">What is the Cyrus SASL library good for?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-does-the-cyrus-sasl-library-do">What does the Cyrus SASL library do?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-doesn-t-the-cyrus-sasl-library-do">What doesn’t the Cyrus SASL library do?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#client-only-section">Client-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-client-s-perspective">A typical interaction from the client’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-does-this-look-in-code">How does this look in code</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#server-only-section">Server-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-server-s-perspective">A typical interaction from the server’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#id1">How does this look in code?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#callbacks-and-interactions">Callbacks and Interactions</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#security-layers">Security layers</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#example-applications-that-come-with-the-cyrus-sasl-library">Example applications that come with the Cyrus SASL library</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sample-client-and-sample-server"><cite>sample-client</cite> and <cite>sample-server</cite></a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#cyrus-imapd-v2-1-0-or-later">Cyrus imapd v2.1.0 or later</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#imtest-from-cyrus-2-1-0-or-later"><cite>imtest</cite>, from Cyrus 2.1.0 or later</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#miscellaneous-information">Miscellaneous Information</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#empty-exchanges">Empty exchanges</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#idle">Idle</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/plugprog.html">Plugin Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#overview-of-plugin-programming">Overview of Plugin Programming</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#use-of-sasl-utils-t">Use of sasl_utils_t</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#error-reporting">Error Reporting</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#memory-allocation">Memory Allocation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#client-send-first-server-send-last">Client Send First / Server Send Last</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#client-plugins">Client Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#server-plugins">Server Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#user-canonicalization-canon-user-plugins">User Canonicalization (canon_user) Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#auxiliary-property-auxprop-plugins">Auxiliary Property (auxprop) Plugins</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/testing.html">Testing</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#testing-the-cmu-sasl-library-with-the-included-sample-applications">Testing the CMU SASL Library with the included sample applications</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/testing.html#example">Example</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#running-the-testsuite-application">Running the Testsuite application</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="support.html">Support/Community</a></li>
</ul>
<p class="caption"><span class="caption-text">IMAP</span></p>
<ul>
<li class="toctree-l1"><a class="reference external" href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
</ul>

          
        
      </div>
      &nbsp;
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
        <a href="index.html">Cyrus SASL</a>
      </nav>


      
      <div class="wy-nav-content">
        <div class="rst-content">
          
          <div role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
      <li><a href="index.html">Docs v2.1.27</a> &raquo;</li>
      
    <li>Developers</li>
      <li class="wy-breadcrumbs-aside">
        
          
            <a href="https://github.com/cyrusimap/cyrus-sasl/blob/master/docsrc/developer.rst" class="fa fa-github"> Edit on GitHub</a>
          
        
      </li>
  </ul>
  <hr/>
</div>
          <div role="main" class="document">
            
  <div class="section" id="developers">
<h1>Developers<a class="headerlink" href="#developers" title="Permalink to this headline">¶</a></h1>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="sasl/appconvert.html">Converting Applications from v1 to v2</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/appconvert.html#tips-for-both-clients-and-servers">Tips for both clients and servers</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/appconvert.html#tips-for-clients">Tips for clients</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/appconvert.html#tips-for-servers">Tips for Servers</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/developer/programming.html">Application Programmer’s Guide</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/programming.html#introduction">Introduction</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/programming.html#background">Background</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#how-did-the-world-work-before-sasl">How did the world work before SASL?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#sasl-to-the-rescue">SASL to the rescue!</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/programming.html#briefly">Briefly</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#what-is-the-cyrus-sasl-library-good-for">What is the Cyrus SASL library good for?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#what-does-the-cyrus-sasl-library-do">What does the Cyrus SASL library do?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#what-doesn-t-the-cyrus-sasl-library-do">What doesn’t the Cyrus SASL library do?</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/programming.html#client-only-section">Client-only Section</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-client-s-perspective">A typical interaction from the client’s perspective</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#how-does-this-look-in-code">How does this look in code</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/programming.html#server-only-section">Server-only Section</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-server-s-perspective">A typical interaction from the server’s perspective</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#id1">How does this look in code?</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/programming.html#common-section">Common Section</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#callbacks-and-interactions">Callbacks and Interactions</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#security-layers">Security layers</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/programming.html#example-applications-that-come-with-the-cyrus-sasl-library">Example applications that come with the Cyrus SASL library</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#sample-client-and-sample-server"><cite>sample-client</cite> and <cite>sample-server</cite></a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#cyrus-imapd-v2-1-0-or-later">Cyrus imapd v2.1.0 or later</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#imtest-from-cyrus-2-1-0-or-later"><cite>imtest</cite>, from Cyrus 2.1.0 or later</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/programming.html#miscellaneous-information">Miscellaneous Information</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#empty-exchanges">Empty exchanges</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#idle">Idle</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/developer/plugprog.html">Plugin Programmer’s Guide</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/plugprog.html#introduction">Introduction</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/plugprog.html#common-section">Common Section</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#overview-of-plugin-programming">Overview of Plugin Programming</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#use-of-sasl-utils-t">Use of sasl_utils_t</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#error-reporting">Error Reporting</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#memory-allocation">Memory Allocation</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#client-send-first-server-send-last">Client Send First / Server Send Last</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/plugprog.html#client-plugins">Client Plugins</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/plugprog.html#server-plugins">Server Plugins</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/plugprog.html#user-canonicalization-canon-user-plugins">User Canonicalization (canon_user) Plugins</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/plugprog.html#auxiliary-property-auxprop-plugins">Auxiliary Property (auxprop) Plugins</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/developer/testing.html">Testing</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/testing.html#testing-the-cmu-sasl-library-with-the-included-sample-applications">Testing the CMU SASL Library with the included sample applications</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#example">Example</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/testing.html#running-the-testsuite-application">Running the Testsuite application</a></li>
</ul>
</li>
</ul>
</div>
</div>


          </div>
          <footer>
  
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      
        <a href="sasl/appconvert.html" class="btn btn-neutral float-right" title="Converting Applications from v1 to v2" accesskey="n">Next <span class="fa fa-arrow-circle-right"></span></a>
      
      
        <a href="sasl/resources.html" class="btn btn-neutral" title="Other Documentation &amp; Resources" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous</a>
      
    </div>
  

  <hr/>

  <div role="contentinfo">
    <p>
        &copy; Copyright 1993-2016, The Cyrus Team.
    </p>
  </div>
  Built with <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6 using a modified <a href="https://readthedocs.org">Read the Docs</a> <a href="https://github.com/snide/sphinx_rtd_theme">theme</a>.

</footer>

        </div>
      </div>

    </section>

  </div>
  


  

    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'./',
            VERSION:'2.1.27',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'.html',
            HAS_SOURCE:  true
        };
    </script>
      <script type="text/javascript" src="_static/jquery.js"></script>
      <script type="text/javascript" src="_static/underscore.js"></script>
      <script type="text/javascript" src="_static/doctools.js"></script>
      <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>

  

  
  
    <script type="text/javascript" src="_static/js/theme.js"></script>
  

  
  
  <script type="text/javascript">
<!--      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      }); -->
  </script>
  
 



</body>
</html>PK�*[.�	��$doc/alt-cyrus-sasl-lib/packager.htmlnu�[���

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>Note for Packagers &mdash; Cyrus SASL 2.1.27 documentation</title>
  

  
  
    <link rel="shortcut icon" href="_static/favicon.ico"/>
  

  

  
  
    

  

  
  
    <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
  

  
    <link rel="stylesheet" href="_static/cyrus.css" type="text/css" />
  

  
        <link rel="index" title="Index"
              href="genindex.html"/>
        <link rel="search" title="Search" href="search.html"/>
    <link rel="top" title="Cyrus SASL 2.1.27 documentation" href="index.html"/>
        <link rel="up" title="Download" href="download.html"/>
        <link rel="next" title="Quickstart guide" href="sasl/quickstart.html"/>
        <link rel="prev" title="Cyrus SASL 1.x Release Notes" href="sasl/release-notes/1/index.html"/> 

  
  
  

</head>

<body class="wy-body-for-nav" role="document">

  
  
<div class="pageheader">
  <ul>
    <li><a href="index.html">Home</a></li>
    <li><a href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
    <li><a href="download.html">Download</a></li>
    <li><a href="contribute.html">Contribute</a></li>
  </ul>
  <div>
    <a href="index.html">
      <img src="_static/logo.gif" alt="CYRUS SASL" />
    </a>
  </div>
</div>
<div style="clear: both;"></div>


  <div class="wy-grid-for-nav">

    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-nav-search">
        

        
 
          <a href="index.html">
 

  
          
          <img src="_static/logo.gif"  />
     
        </a>

        
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

        
      </div>

      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
        
          
          
              <p class="caption"><span class="caption-text">Cyrus SASL</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="download.html">Download</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="getsasl.html">Get SASL</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/release-notes/index.html">Release Notes</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#supported-product-series">Supported Product Series</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-1">Series 2.1</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#older-versions">Older Versions</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-2-0">Series 2: 2.0</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-1">Series 1</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Note for Packagers</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/quickstart.html">Quickstart guide</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#features">Features</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#typical-installation">Typical Installation</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/concepts.html">Concepts</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl">SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl-authentication-mechanisms">SASL Authentication Mechanisms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#security-layers">Security Layers</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#channel-binding">Channel Binding</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#realms">Realms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#protocols">Protocols</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#cyrus-sasl">Cyrus SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#the-glue-library">The Glue Library</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#plugins">Plugins</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="setup.html">Setup</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#tarball-installation">Tarball installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#unix-package-installation">Unix package Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#requirements">Requirements</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#build-configuration">Build Configuration</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#building-and-installation">Building and Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#compilation-hints">Compilation Hints</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#application-configuration">Application Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/upgrading.html">Upgrading from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#backwards-compatibility">Backwards Compatibility</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#coexistence-with-saslv1">Coexistence with SASLv1</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#database-upgrades">Database Upgrades</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#errors-on-migration">Errors on migration</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/components.html">Components</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-application">The Application</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-sasl-glue-layer">The SASL Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#plugins">Plugins</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-general">Plugins: General</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-sasl-mechanisms">Plugins: SASL Mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-auxiliary-property">Plugins: Auxiliary Property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-username-canonicalization">Plugins: Username Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#password-verification-services">Password Verification Services</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html">Options</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasl-library">SASL Library</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#auxiliary-property-plugin">Auxiliary Property Plugin</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#gssapi">GSSAPI</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ldapdb">LDAPDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-ldapdb">Notes on LDAPDB</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#examples">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ntlm">NTLM</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#otp">OTP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#digest-md5">Digest-md5</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasldb">SASLDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sasldb-with-lmdb">Notes on sasldb with LMDB</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sql-plugin">SQL Plugin</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sql">Notes on SQL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#id2">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#srp">SRP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#kerberos-v4">Kerberos V4</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/advanced.html">Advanced Usage</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/advanced.html#notes-for-advanced-usage-of-libsasl">Notes for Advanced Usage of libsasl</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/advanced.html#using-cyrus-sasl-as-a-static-library">Using Cyrus SASL as a static library</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="operations.html">Operations</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/sysadmin.html">System Administrators</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#what-sasl-is">What SASL is</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#authentication-and-authorization-identifiers">Authentication and authorization identifiers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#realms">Realms</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-sasl-works">How SASL works</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-plain-mechanism-sasl-checkpass-and-plaintext-passwords">The PLAIN mechanism, <code class="docutils literal"><span class="pre">sasl_checkpass()</span></code>, and plaintext passwords</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#shared-secrets-mechanisms">Shared secrets mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#kerberos-mechanisms">Kerberos mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-otp-mechanism">The OTP mechanism</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-to-set-configuration-options">How to set configuration options</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-default-configuration-file">The default configuration file</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#application-configuration">Application configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#troubleshooting">Troubleshooting</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/manpages.html">Man pages</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/manpages.html#library-files">(3) Library Files</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl.html"><strong>SASL</strong> - SASL Authentication Library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_authorize_t.html"><strong>sasl_authorize_t</strong> - The SASL authorization callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop.html"><strong>sasl_auxprop</strong> - How to work with SASL auxiliary properties</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_add_plugin.html"><strong>sasl_auxprop_add_plugin</strong> - add a SASL auxiliary property plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_getctx.html"><strong>sasl_auxprop_getctx</strong> - Acquire an auxiliary property context</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_request.html"><strong>sasl_auxprop_request</strong> - Request auxiliary properties from SASL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_callbacks.html"><strong>sasl_callbacks</strong> - How to work with SASL callbacks</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canon_user_t.html"><strong>sasl_canon_user_t</strong> - Application-supplied user canonicalization function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canonuser_add_plugin.html"><strong>sasl_canonuser_add_plugin</strong> - add a SASL user canonicalization plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_chalprompt_t.html"><strong>sasl_chalprompt_t</strong> - Realm acquisition callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkapop.html"><strong>sasl_checkapop</strong> - Check an APOP challenge/response</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkpass.html"><strong>sasl_checkpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_add_plugin.html"><strong>sasl_client_add_plugin</strong> - add a SASL client plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_done.html"><strong>sasl_client_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_init.html"><strong>sasl_client_init</strong> - SASL client authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_new.html"><strong>sasl_client_new</strong> - Create a new client authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_plug_init_t.html"><strong>sasl_client_plug_init_t</strong> - client plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_start.html"><strong>sasl_client_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_step.html"><strong>sasl_client_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode.html"><strong>sasl_decode</strong> - Decode data received</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode64.html"><strong>sasl_decode64</strong> - Decode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_dispose.html"><strong>sasl_dispose</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_done.html"><strong>sasl_done</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode.html"><strong>sasl_encode</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode64.html"><strong>sasl_encode64</strong> - Encode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encodev.html"><strong>sasl_encodev</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_erasebuffer.html"><strong>sasl_erasebuffer</strong> - erase buffer</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errdetail.html"><strong>sasl_errdetail</strong> - Retrieve  detailed information about an error</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errors.html"><strong>sasl_errors</strong> - SASL error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errstring.html"><strong>sasl_errstring</strong> - Translate a SASL return code to a human-readable form</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getcallback_t.html"><strong>sasl_getcallback_t</strong> - callback function to lookup a sasl_callback_t for a connection</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getconfpath_t.html"><strong>sasl_getconfpath_t</strong> - The SASL callback to indicate location of the config files</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getopt_t.html"><strong>sasl_getopt_t</strong> - The SASL get option callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getpath_t.html"><strong>sasl_getpath_t</strong> - The SASL callback to indicate location of the mechanism drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getprop.html"><strong>sasl_getprop</strong> - Get a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getrealm_t.html"><strong>sasl_getrealm_t</strong> - Realm Acquisition Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsecret_t.html"><strong>sasl_getsecret_t</strong> - The SASL callback for secrets (passwords)</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsimple_t.html"><strong>sasl_getsimple_t</strong> - The SASL callback for username/authname/realm</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_global_listmech.html"><strong>sasl_global_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_idle.html"><strong>sasl_idle</strong> - Perform precalculations during an idle period</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_listmech.html"><strong>sasl_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_log_t.html"><strong>sasl_log_t</strong> - The SASL logging callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_add_plugin.html"><strong>sasl_server_add_plugin</strong> - add a SASL server plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_done.html"><strong>sasl_server_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_init.html"><strong>sasl_server_init</strong> - SASL server authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_new.html"><strong>sasl_server_new</strong> - Create a new server authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_plug_init_t.html"><strong>sasl_server_plug_init_t</strong> - server plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_start.html"><strong>sasl_server_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_step.html"><strong>sasl_server_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_checkpass_t.html"><strong>sasl_server_userdb_checkpass_t</strong> - Plaintext Password Verification Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_setpass_t.html"><strong>sasl_server_userdb_setpass_t</strong> - UserDB Plaintext Password Setting Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_alloc.html"><strong>sasl_set_alloc</strong> - set the memory allocation functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_mutex.html"><strong>sasl_set_mutex</strong> - set the mutex lock functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_seterror.html"><strong>sasl_seterror</strong> - set the error string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setpass.html"><strong>sasl_setpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setprop.html"><strong>sasl_setprop</strong> - Set a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_user_exists.html"><strong>sasl_user_exists</strong> - Check if a user exists on server</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_usererr.html"><strong>sasl_usererr</strong> - Remove information leak about accounts from sasl error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_utf8verify.html"><strong>sasl_utf8verify</strong> - Verify a string is valid utf8</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_verifyfile_t.html"><strong>sasl_verifyfile_t</strong> - The SASL file verification</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/auxiliary_properties.html">Auxiliary Properties</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#auxiliary-properties-and-the-glue-layer">Auxiliary Properties and the Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#passwords-and-other-data">Passwords and other Data</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sasldb">sasldb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#ldapdb">ldapdb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sql">sql</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#user-canonicalization">User Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/authentication_mechanisms.html">Authentication Mechanisms</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#mechanisms">Mechanisms</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#anonymous">ANONYMOUS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#cram-md5">CRAM-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#digest-md5">DIGEST-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#external">EXTERNAL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#g2">G2</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gssapi">GSSAPI</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gss-spegno">GSS-SPEGNO</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#kerberos-v4">KERBEROS_V4</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#login">LOGIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#ntlm">NTLM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#otp">OTP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#passdss">PASSDSS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#plain">PLAIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#scram">SCRAM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#srp">SRP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#non-sasl-authentication">Non-SASL Authentication</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#summary">Summary</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/pwcheck.html">Pwcheck</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop">Auxprop</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop-hashed">Auxprop-hashed</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#saslauthd">Saslauthd</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#authdaemon">Authdaemon</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#alwaystrue">Alwaystrue</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auto-transition">Auto Transition</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/faq.html">Frequently Asked Questions</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/authorize-vs-authenticate.html">What is the difference between an Authorization ID and a Authentication ID?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/crammd5-digestmd5.html">Why do CRAM-MD5 and DIGEST-MD5 not work with CyrusSaslauthd?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/openldap-sasl-gssapi.html">How do I configure OpenLDAP +SASL+GSSAPI?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/plaintextpasswords.html">Why does CyrusSasl store plaintext passwords in its databases?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/rfcs.html">RFCs and drafts</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/upgrade-saslv2.html">Why am I having a problem running dbconverter-2 to upgrade from SASLv1 to SASLv2?</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/resources.html">Other Documentation &amp; Resources</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="developer.html">Developers</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/appconvert.html">Converting Applications from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-both-clients-and-servers">Tips for both clients and servers</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-clients">Tips for clients</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-servers">Tips for Servers</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/programming.html">Application Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#background">Background</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-did-the-world-work-before-sasl">How did the world work before SASL?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sasl-to-the-rescue">SASL to the rescue!</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#briefly">Briefly</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-the-cyrus-sasl-library-good-for">What is the Cyrus SASL library good for?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-does-the-cyrus-sasl-library-do">What does the Cyrus SASL library do?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-doesn-t-the-cyrus-sasl-library-do">What doesn’t the Cyrus SASL library do?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#client-only-section">Client-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-client-s-perspective">A typical interaction from the client’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-does-this-look-in-code">How does this look in code</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#server-only-section">Server-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-server-s-perspective">A typical interaction from the server’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#id1">How does this look in code?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#callbacks-and-interactions">Callbacks and Interactions</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#security-layers">Security layers</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#example-applications-that-come-with-the-cyrus-sasl-library">Example applications that come with the Cyrus SASL library</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sample-client-and-sample-server"><cite>sample-client</cite> and <cite>sample-server</cite></a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#cyrus-imapd-v2-1-0-or-later">Cyrus imapd v2.1.0 or later</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#imtest-from-cyrus-2-1-0-or-later"><cite>imtest</cite>, from Cyrus 2.1.0 or later</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#miscellaneous-information">Miscellaneous Information</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#empty-exchanges">Empty exchanges</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#idle">Idle</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/plugprog.html">Plugin Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#overview-of-plugin-programming">Overview of Plugin Programming</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#use-of-sasl-utils-t">Use of sasl_utils_t</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#error-reporting">Error Reporting</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#memory-allocation">Memory Allocation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#client-send-first-server-send-last">Client Send First / Server Send Last</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#client-plugins">Client Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#server-plugins">Server Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#user-canonicalization-canon-user-plugins">User Canonicalization (canon_user) Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#auxiliary-property-auxprop-plugins">Auxiliary Property (auxprop) Plugins</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/testing.html">Testing</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#testing-the-cmu-sasl-library-with-the-included-sample-applications">Testing the CMU SASL Library with the included sample applications</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/testing.html#example">Example</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#running-the-testsuite-application">Running the Testsuite application</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="support.html">Support/Community</a></li>
</ul>
<p class="caption"><span class="caption-text">IMAP</span></p>
<ul>
<li class="toctree-l1"><a class="reference external" href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
</ul>

          
        
      </div>
      &nbsp;
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
        <a href="index.html">Cyrus SASL</a>
      </nav>


      
      <div class="wy-nav-content">
        <div class="rst-content">
          
          <div role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
      <li><a href="index.html">Docs v2.1.27</a> &raquo;</li>
      
          <li><a href="download.html">Download</a> &raquo;</li>
      
    <li>Note for Packagers</li>
      <li class="wy-breadcrumbs-aside">
        
          
            <a href="https://github.com/cyrusimap/cyrus-sasl/blob/master/docsrc/packager.rst" class="fa fa-github"> Edit on GitHub</a>
          
        
      </li>
  </ul>
  <hr/>
</div>
          <div role="main" class="document">
            
  <div class="section" id="note-for-packagers">
<h1>Note for Packagers<a class="headerlink" href="#note-for-packagers" title="Permalink to this headline">¶</a></h1>
<p>People considering doing binary distributions that include saslauthd
should be aware that the code is covered by several slightly different
(but compatible) licenses, due to how it was contributed.  Details can
be found within the source code.</p>
</div>


          </div>
          <footer>
  
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      
        <a href="sasl/quickstart.html" class="btn btn-neutral float-right" title="Quickstart guide" accesskey="n">Next <span class="fa fa-arrow-circle-right"></span></a>
      
      
        <a href="sasl/release-notes/1/index.html" class="btn btn-neutral" title="Cyrus SASL 1.x Release Notes" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous</a>
      
    </div>
  

  <hr/>

  <div role="contentinfo">
    <p>
        &copy; Copyright 1993-2016, The Cyrus Team.
    </p>
  </div>
  Built with <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6 using a modified <a href="https://readthedocs.org">Read the Docs</a> <a href="https://github.com/snide/sphinx_rtd_theme">theme</a>.

</footer>

        </div>
      </div>

    </section>

  </div>
  


  

    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'./',
            VERSION:'2.1.27',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'.html',
            HAS_SOURCE:  true
        };
    </script>
      <script type="text/javascript" src="_static/jquery.js"></script>
      <script type="text/javascript" src="_static/underscore.js"></script>
      <script type="text/javascript" src="_static/doctools.js"></script>
      <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>

  

  
  
    <script type="text/javascript" src="_static/js/theme.js"></script>
  

  
  
  <script type="text/javascript">
<!--      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      }); -->
  </script>
  
 



</body>
</html>PK�*[Z��T����!doc/alt-cyrus-sasl-lib/index.htmlnu�[���

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>Cyrus SASL &mdash; Cyrus SASL 2.1.27 documentation</title>
  

  
  
    <link rel="shortcut icon" href="_static/favicon.ico"/>
  

  

  
  
    

  

  
  
    <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
  

  
    <link rel="stylesheet" href="_static/cyrus.css" type="text/css" />
  

  
        <link rel="index" title="Index"
              href="genindex.html"/>
        <link rel="search" title="Search" href="search.html"/>
    <link rel="top" title="Cyrus SASL 2.1.27 documentation" href="#"/>
        <link rel="next" title="Download" href="download.html"/> 

  
  
  

</head>

<body class="wy-body-for-nav" role="document">

  
  
<div class="pageheader">
  <ul>
    <li><a href="#">Home</a></li>
    <li><a href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
    <li><a href="download.html">Download</a></li>
    <li><a href="contribute.html">Contribute</a></li>
  </ul>
  <div>
    <a href="#">
      <img src="_static/logo.gif" alt="CYRUS SASL" />
    </a>
  </div>
</div>
<div style="clear: both;"></div>


  <div class="wy-grid-for-nav">

    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-nav-search">
        

        
 
          <a href="#">
 

  
          
          <img src="_static/logo.gif"  />
     
        </a>

        
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

        
      </div>

      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
        
          
          
              <p class="caption"><span class="caption-text">Cyrus SASL</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="download.html">Download</a><ul>
<li class="toctree-l2"><a class="reference internal" href="getsasl.html">Get SASL</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/release-notes/index.html">Release Notes</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#supported-product-series">Supported Product Series</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-1">Series 2.1</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#older-versions">Older Versions</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-2-0">Series 2: 2.0</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-1">Series 1</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="packager.html">Note for Packagers</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/quickstart.html">Quickstart guide</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#features">Features</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#typical-installation">Typical Installation</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/concepts.html">Concepts</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl">SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl-authentication-mechanisms">SASL Authentication Mechanisms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#security-layers">Security Layers</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#channel-binding">Channel Binding</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#realms">Realms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#protocols">Protocols</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#cyrus-sasl">Cyrus SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#the-glue-library">The Glue Library</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#plugins">Plugins</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="setup.html">Setup</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#tarball-installation">Tarball installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#unix-package-installation">Unix package Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#requirements">Requirements</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#build-configuration">Build Configuration</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#building-and-installation">Building and Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#compilation-hints">Compilation Hints</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#application-configuration">Application Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/upgrading.html">Upgrading from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#backwards-compatibility">Backwards Compatibility</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#coexistence-with-saslv1">Coexistence with SASLv1</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#database-upgrades">Database Upgrades</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#errors-on-migration">Errors on migration</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/components.html">Components</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-application">The Application</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-sasl-glue-layer">The SASL Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#plugins">Plugins</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-general">Plugins: General</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-sasl-mechanisms">Plugins: SASL Mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-auxiliary-property">Plugins: Auxiliary Property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-username-canonicalization">Plugins: Username Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#password-verification-services">Password Verification Services</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html">Options</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasl-library">SASL Library</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#auxiliary-property-plugin">Auxiliary Property Plugin</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#gssapi">GSSAPI</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ldapdb">LDAPDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-ldapdb">Notes on LDAPDB</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#examples">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ntlm">NTLM</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#otp">OTP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#digest-md5">Digest-md5</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasldb">SASLDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sasldb-with-lmdb">Notes on sasldb with LMDB</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sql-plugin">SQL Plugin</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sql">Notes on SQL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#id2">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#srp">SRP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#kerberos-v4">Kerberos V4</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/advanced.html">Advanced Usage</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/advanced.html#notes-for-advanced-usage-of-libsasl">Notes for Advanced Usage of libsasl</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/advanced.html#using-cyrus-sasl-as-a-static-library">Using Cyrus SASL as a static library</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="operations.html">Operations</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/sysadmin.html">System Administrators</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#what-sasl-is">What SASL is</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#authentication-and-authorization-identifiers">Authentication and authorization identifiers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#realms">Realms</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-sasl-works">How SASL works</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-plain-mechanism-sasl-checkpass-and-plaintext-passwords">The PLAIN mechanism, <code class="docutils literal"><span class="pre">sasl_checkpass()</span></code>, and plaintext passwords</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#shared-secrets-mechanisms">Shared secrets mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#kerberos-mechanisms">Kerberos mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-otp-mechanism">The OTP mechanism</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-to-set-configuration-options">How to set configuration options</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-default-configuration-file">The default configuration file</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#application-configuration">Application configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#troubleshooting">Troubleshooting</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/manpages.html">Man pages</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/manpages.html#library-files">(3) Library Files</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl.html"><strong>SASL</strong> - SASL Authentication Library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_authorize_t.html"><strong>sasl_authorize_t</strong> - The SASL authorization callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop.html"><strong>sasl_auxprop</strong> - How to work with SASL auxiliary properties</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_add_plugin.html"><strong>sasl_auxprop_add_plugin</strong> - add a SASL auxiliary property plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_getctx.html"><strong>sasl_auxprop_getctx</strong> - Acquire an auxiliary property context</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_request.html"><strong>sasl_auxprop_request</strong> - Request auxiliary properties from SASL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_callbacks.html"><strong>sasl_callbacks</strong> - How to work with SASL callbacks</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canon_user_t.html"><strong>sasl_canon_user_t</strong> - Application-supplied user canonicalization function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canonuser_add_plugin.html"><strong>sasl_canonuser_add_plugin</strong> - add a SASL user canonicalization plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_chalprompt_t.html"><strong>sasl_chalprompt_t</strong> - Realm acquisition callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkapop.html"><strong>sasl_checkapop</strong> - Check an APOP challenge/response</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkpass.html"><strong>sasl_checkpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_add_plugin.html"><strong>sasl_client_add_plugin</strong> - add a SASL client plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_done.html"><strong>sasl_client_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_init.html"><strong>sasl_client_init</strong> - SASL client authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_new.html"><strong>sasl_client_new</strong> - Create a new client authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_plug_init_t.html"><strong>sasl_client_plug_init_t</strong> - client plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_start.html"><strong>sasl_client_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_step.html"><strong>sasl_client_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode.html"><strong>sasl_decode</strong> - Decode data received</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode64.html"><strong>sasl_decode64</strong> - Decode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_dispose.html"><strong>sasl_dispose</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_done.html"><strong>sasl_done</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode.html"><strong>sasl_encode</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode64.html"><strong>sasl_encode64</strong> - Encode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encodev.html"><strong>sasl_encodev</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_erasebuffer.html"><strong>sasl_erasebuffer</strong> - erase buffer</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errdetail.html"><strong>sasl_errdetail</strong> - Retrieve  detailed information about an error</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errors.html"><strong>sasl_errors</strong> - SASL error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errstring.html"><strong>sasl_errstring</strong> - Translate a SASL return code to a human-readable form</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getcallback_t.html"><strong>sasl_getcallback_t</strong> - callback function to lookup a sasl_callback_t for a connection</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getconfpath_t.html"><strong>sasl_getconfpath_t</strong> - The SASL callback to indicate location of the config files</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getopt_t.html"><strong>sasl_getopt_t</strong> - The SASL get option callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getpath_t.html"><strong>sasl_getpath_t</strong> - The SASL callback to indicate location of the mechanism drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getprop.html"><strong>sasl_getprop</strong> - Get a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getrealm_t.html"><strong>sasl_getrealm_t</strong> - Realm Acquisition Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsecret_t.html"><strong>sasl_getsecret_t</strong> - The SASL callback for secrets (passwords)</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsimple_t.html"><strong>sasl_getsimple_t</strong> - The SASL callback for username/authname/realm</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_global_listmech.html"><strong>sasl_global_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_idle.html"><strong>sasl_idle</strong> - Perform precalculations during an idle period</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_listmech.html"><strong>sasl_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_log_t.html"><strong>sasl_log_t</strong> - The SASL logging callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_add_plugin.html"><strong>sasl_server_add_plugin</strong> - add a SASL server plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_done.html"><strong>sasl_server_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_init.html"><strong>sasl_server_init</strong> - SASL server authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_new.html"><strong>sasl_server_new</strong> - Create a new server authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_plug_init_t.html"><strong>sasl_server_plug_init_t</strong> - server plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_start.html"><strong>sasl_server_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_step.html"><strong>sasl_server_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_checkpass_t.html"><strong>sasl_server_userdb_checkpass_t</strong> - Plaintext Password Verification Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_setpass_t.html"><strong>sasl_server_userdb_setpass_t</strong> - UserDB Plaintext Password Setting Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_alloc.html"><strong>sasl_set_alloc</strong> - set the memory allocation functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_mutex.html"><strong>sasl_set_mutex</strong> - set the mutex lock functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_seterror.html"><strong>sasl_seterror</strong> - set the error string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setpass.html"><strong>sasl_setpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setprop.html"><strong>sasl_setprop</strong> - Set a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_user_exists.html"><strong>sasl_user_exists</strong> - Check if a user exists on server</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_usererr.html"><strong>sasl_usererr</strong> - Remove information leak about accounts from sasl error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_utf8verify.html"><strong>sasl_utf8verify</strong> - Verify a string is valid utf8</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_verifyfile_t.html"><strong>sasl_verifyfile_t</strong> - The SASL file verification</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/auxiliary_properties.html">Auxiliary Properties</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#auxiliary-properties-and-the-glue-layer">Auxiliary Properties and the Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#passwords-and-other-data">Passwords and other Data</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sasldb">sasldb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#ldapdb">ldapdb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sql">sql</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#user-canonicalization">User Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/authentication_mechanisms.html">Authentication Mechanisms</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#mechanisms">Mechanisms</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#anonymous">ANONYMOUS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#cram-md5">CRAM-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#digest-md5">DIGEST-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#external">EXTERNAL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#g2">G2</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gssapi">GSSAPI</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gss-spegno">GSS-SPEGNO</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#kerberos-v4">KERBEROS_V4</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#login">LOGIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#ntlm">NTLM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#otp">OTP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#passdss">PASSDSS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#plain">PLAIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#scram">SCRAM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#srp">SRP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#non-sasl-authentication">Non-SASL Authentication</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#summary">Summary</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/pwcheck.html">Pwcheck</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop">Auxprop</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop-hashed">Auxprop-hashed</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#saslauthd">Saslauthd</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#authdaemon">Authdaemon</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#alwaystrue">Alwaystrue</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auto-transition">Auto Transition</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/faq.html">Frequently Asked Questions</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/authorize-vs-authenticate.html">What is the difference between an Authorization ID and a Authentication ID?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/crammd5-digestmd5.html">Why do CRAM-MD5 and DIGEST-MD5 not work with CyrusSaslauthd?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/openldap-sasl-gssapi.html">How do I configure OpenLDAP +SASL+GSSAPI?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/plaintextpasswords.html">Why does CyrusSasl store plaintext passwords in its databases?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/rfcs.html">RFCs and drafts</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/upgrade-saslv2.html">Why am I having a problem running dbconverter-2 to upgrade from SASLv1 to SASLv2?</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/resources.html">Other Documentation &amp; Resources</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="developer.html">Developers</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/appconvert.html">Converting Applications from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-both-clients-and-servers">Tips for both clients and servers</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-clients">Tips for clients</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-servers">Tips for Servers</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/programming.html">Application Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#background">Background</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-did-the-world-work-before-sasl">How did the world work before SASL?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sasl-to-the-rescue">SASL to the rescue!</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#briefly">Briefly</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-the-cyrus-sasl-library-good-for">What is the Cyrus SASL library good for?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-does-the-cyrus-sasl-library-do">What does the Cyrus SASL library do?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-doesn-t-the-cyrus-sasl-library-do">What doesn’t the Cyrus SASL library do?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#client-only-section">Client-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-client-s-perspective">A typical interaction from the client’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-does-this-look-in-code">How does this look in code</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#server-only-section">Server-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-server-s-perspective">A typical interaction from the server’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#id1">How does this look in code?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#callbacks-and-interactions">Callbacks and Interactions</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#security-layers">Security layers</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#example-applications-that-come-with-the-cyrus-sasl-library">Example applications that come with the Cyrus SASL library</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sample-client-and-sample-server"><cite>sample-client</cite> and <cite>sample-server</cite></a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#cyrus-imapd-v2-1-0-or-later">Cyrus imapd v2.1.0 or later</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#imtest-from-cyrus-2-1-0-or-later"><cite>imtest</cite>, from Cyrus 2.1.0 or later</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#miscellaneous-information">Miscellaneous Information</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#empty-exchanges">Empty exchanges</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#idle">Idle</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/plugprog.html">Plugin Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#overview-of-plugin-programming">Overview of Plugin Programming</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#use-of-sasl-utils-t">Use of sasl_utils_t</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#error-reporting">Error Reporting</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#memory-allocation">Memory Allocation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#client-send-first-server-send-last">Client Send First / Server Send Last</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#client-plugins">Client Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#server-plugins">Server Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#user-canonicalization-canon-user-plugins">User Canonicalization (canon_user) Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#auxiliary-property-auxprop-plugins">Auxiliary Property (auxprop) Plugins</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/testing.html">Testing</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#testing-the-cmu-sasl-library-with-the-included-sample-applications">Testing the CMU SASL Library with the included sample applications</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/testing.html#example">Example</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#running-the-testsuite-application">Running the Testsuite application</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="support.html">Support/Community</a></li>
</ul>
<p class="caption"><span class="caption-text">IMAP</span></p>
<ul>
<li class="toctree-l1"><a class="reference external" href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
</ul>

          
        
      </div>
      &nbsp;
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
        <a href="#">Cyrus SASL</a>
      </nav>


      
      <div class="wy-nav-content">
        <div class="rst-content">
          
          <div role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
      <li><a href="#">Docs v2.1.27</a> &raquo;</li>
      
    <li>Cyrus SASL</li>
      <li class="wy-breadcrumbs-aside">
        
          
            <a href="https://github.com/cyrusimap/cyrus-sasl/blob/master/docsrc/index.rst" class="fa fa-github"> Edit on GitHub</a>
          
        
      </li>
  </ul>
  <hr/>
</div>
          <div role="main" class="document">
            
  <div class="section" id="cyrus-sasl">
<span id="sasl-index"></span><h1>Cyrus SASL<a class="headerlink" href="#cyrus-sasl" title="Permalink to this headline">¶</a></h1>
<p>Welcome to Cyrus SASL.</p>
<div class="section" id="what-is-cyrus-sasl">
<h2>What is Cyrus SASL?<a class="headerlink" href="#what-is-cyrus-sasl" title="Permalink to this headline">¶</a></h2>
<p>Simple Authentication and Security Layer (<a class="reference external" href="https://en.wikipedia.org/wiki/Simple_Authentication_and_Security_Layer">SASL</a>) is a specification that describes how authentication mechanisms can be plugged into an application protocol on the wire. Cyrus SASL is an implementation of SASL that makes it easy for application developers to integrate authentication mechanisms into their application in a generic way.</p>
<p>The latest stable version of Cyrus SASL is 2.1.26.</p>
<p><a class="reference external" href="https://www.cyrusimap.org/index.html#imap-index" title="(in Cyrus IMAP v3.0.8)"><span class="xref std std-ref">Cyrus IMAP</span></a> uses Cyrus SASL to provide authentication support to the mail server, however it is just one project using Cyrus SASL.</p>
<div class="section" id="features">
<h3>Features<a class="headerlink" href="#features" title="Permalink to this headline">¶</a></h3>
<p>Cyrus SASL provides a number of authentication plugins out of the box.</p>
<blockquote>
<div>Berkeley DB, GDBM, or NDBM (sasldb), PAM, MySQL, PostgreSQL, SQLite, LDAP, Active Directory(LDAP), DCE, Kerberos 4 and 5, proxied IMAP auth, getpwent, shadow, SIA, Courier Authdaemon, httpform, APOP and SASL mechanisms: ANONYMOUS, CRAM-MD5, DIGEST-MD5, EXTERNAL, GSSAPI, LOGIN, NTLM, OTP, PASSDSS, PLAIN, SR</div></blockquote>
<p>This document is an introduction to <strong>Cyrus SASL</strong>. It is not intended to be an exhaustive reference for the SASL Application Programming Interface (API), which is detailed in the SASL manual pages, and the libsasl.h header file.</p>
</div>
<div class="section" id="known-bugs">
<h3>Known Bugs<a class="headerlink" href="#known-bugs" title="Permalink to this headline">¶</a></h3>
<p><code class="docutils literal"><span class="pre">libtool</span></code> doesn’t always link libraries together.  In our environment,
we only have static Krb5 libraries; the GSSAPI plugin should link
these libraries in on platforms that support it (Solaris and Linux
among them) but it does not.  It also doesn’t always get the runpath
of libraries correct.</p>
<div class="toctree-wrapper compound">
<p class="caption"><span class="caption-text">Cyrus SASL</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="download.html">Download</a><ul>
<li class="toctree-l2"><a class="reference internal" href="getsasl.html">Get SASL</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html">Installation</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/release-notes/index.html">Release Notes</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#supported-product-series">Supported Product Series</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#older-versions">Older Versions</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="packager.html">Note for Packagers</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/quickstart.html">Quickstart guide</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#features">Features</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#typical-installation">Typical Installation</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/concepts.html">Concepts</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl">SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl-authentication-mechanisms">SASL Authentication Mechanisms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#security-layers">Security Layers</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#channel-binding">Channel Binding</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#realms">Realms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#protocols">Protocols</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#cyrus-sasl">Cyrus SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#the-glue-library">The Glue Library</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#plugins">Plugins</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="setup.html">Setup</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/upgrading.html">Upgrading from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#backwards-compatibility">Backwards Compatibility</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#coexistence-with-saslv1">Coexistence with SASLv1</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#database-upgrades">Database Upgrades</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#errors-on-migration">Errors on migration</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/components.html">Components</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-application">The Application</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-sasl-glue-layer">The SASL Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#plugins">Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#password-verification-services">Password Verification Services</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html">Options</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasl-library">SASL Library</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#auxiliary-property-plugin">Auxiliary Property Plugin</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#gssapi">GSSAPI</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ldapdb">LDAPDB</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ntlm">NTLM</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#otp">OTP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#digest-md5">Digest-md5</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasldb">SASLDB</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sql-plugin">SQL Plugin</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#srp">SRP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#kerberos-v4">Kerberos V4</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/advanced.html">Advanced Usage</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/advanced.html#notes-for-advanced-usage-of-libsasl">Notes for Advanced Usage of libsasl</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="operations.html">Operations</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/sysadmin.html">System Administrators</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#what-sasl-is">What SASL is</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-sasl-works">How SASL works</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-to-set-configuration-options">How to set configuration options</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#troubleshooting">Troubleshooting</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/manpages.html">Man pages</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/manpages.html#library-files">(3) Library Files</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/auxiliary_properties.html">Auxiliary Properties</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#auxiliary-properties-and-the-glue-layer">Auxiliary Properties and the Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#passwords-and-other-data">Passwords and other Data</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sasldb">sasldb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#ldapdb">ldapdb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sql">sql</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#user-canonicalization">User Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/authentication_mechanisms.html">Authentication Mechanisms</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#mechanisms">Mechanisms</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#summary">Summary</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/pwcheck.html">Pwcheck</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop">Auxprop</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop-hashed">Auxprop-hashed</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#saslauthd">Saslauthd</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#authdaemon">Authdaemon</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#alwaystrue">Alwaystrue</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auto-transition">Auto Transition</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/faq.html">Frequently Asked Questions</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/authorize-vs-authenticate.html">What is the difference between an Authorization ID and a Authentication ID?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/crammd5-digestmd5.html">Why do CRAM-MD5 and DIGEST-MD5 not work with CyrusSaslauthd?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/openldap-sasl-gssapi.html">How do I configure OpenLDAP +SASL+GSSAPI?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/plaintextpasswords.html">Why does CyrusSasl store plaintext passwords in its databases?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/rfcs.html">RFCs and drafts</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/upgrade-saslv2.html">Why am I having a problem running dbconverter-2 to upgrade from SASLv1 to SASLv2?</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/resources.html">Other Documentation &amp; Resources</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="developer.html">Developers</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/appconvert.html">Converting Applications from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-both-clients-and-servers">Tips for both clients and servers</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-clients">Tips for clients</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-servers">Tips for Servers</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/programming.html">Application Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#introduction">Introduction</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#background">Background</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#briefly">Briefly</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#client-only-section">Client-only Section</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#server-only-section">Server-only Section</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#common-section">Common Section</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#example-applications-that-come-with-the-cyrus-sasl-library">Example applications that come with the Cyrus SASL library</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#miscellaneous-information">Miscellaneous Information</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/plugprog.html">Plugin Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#introduction">Introduction</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#common-section">Common Section</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#client-plugins">Client Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#server-plugins">Server Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#user-canonicalization-canon-user-plugins">User Canonicalization (canon_user) Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#auxiliary-property-auxprop-plugins">Auxiliary Property (auxprop) Plugins</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/testing.html">Testing</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#testing-the-cmu-sasl-library-with-the-included-sample-applications">Testing the CMU SASL Library with the included sample applications</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#running-the-testsuite-application">Running the Testsuite application</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="support.html">Support/Community</a></li>
</ul>
</div>
<div class="toctree-wrapper compound">
<p class="caption"><span class="caption-text">IMAP</span></p>
<ul>
<li class="toctree-l1"><a class="reference external" href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
</ul>
</div>
</div>
</div>
</div>


          </div>
          <footer>
  
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      
        <a href="download.html" class="btn btn-neutral float-right" title="Download" accesskey="n">Next <span class="fa fa-arrow-circle-right"></span></a>
      
      
    </div>
  

  <hr/>

  <div role="contentinfo">
    <p>
        &copy; Copyright 1993-2016, The Cyrus Team.
    </p>
  </div>
  Built with <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6 using a modified <a href="https://readthedocs.org">Read the Docs</a> <a href="https://github.com/snide/sphinx_rtd_theme">theme</a>.

</footer>

        </div>
      </div>

    </section>

  </div>
  


  

    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'./',
            VERSION:'2.1.27',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'.html',
            HAS_SOURCE:  true
        };
    </script>
      <script type="text/javascript" src="_static/jquery.js"></script>
      <script type="text/javascript" src="_static/underscore.js"></script>
      <script type="text/javascript" src="_static/doctools.js"></script>
      <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>

  

  
  
    <script type="text/javascript" src="_static/js/theme.js"></script>
  

  
  
  <script type="text/javascript">
<!--      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      }); -->
  </script>
  
 



</body>
</html>PK�*[�7ll��#doc/alt-cyrus-sasl-lib/getsasl.htmlnu�[���

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>Get SASL &mdash; Cyrus SASL 2.1.27 documentation</title>
  

  
  
    <link rel="shortcut icon" href="_static/favicon.ico"/>
  

  

  
  
    

  

  
  
    <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
  

  
    <link rel="stylesheet" href="_static/cyrus.css" type="text/css" />
  

  
        <link rel="index" title="Index"
              href="genindex.html"/>
        <link rel="search" title="Search" href="search.html"/>
    <link rel="top" title="Cyrus SASL 2.1.27 documentation" href="index.html"/>
        <link rel="up" title="Download" href="download.html"/>
        <link rel="next" title="Installation" href="sasl/installation.html"/>
        <link rel="prev" title="Download" href="download.html"/> 

  
  
  

</head>

<body class="wy-body-for-nav" role="document">

  
  
<div class="pageheader">
  <ul>
    <li><a href="index.html">Home</a></li>
    <li><a href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
    <li><a href="download.html">Download</a></li>
    <li><a href="contribute.html">Contribute</a></li>
  </ul>
  <div>
    <a href="index.html">
      <img src="_static/logo.gif" alt="CYRUS SASL" />
    </a>
  </div>
</div>
<div style="clear: both;"></div>


  <div class="wy-grid-for-nav">

    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-nav-search">
        

        
 
          <a href="index.html">
 

  
          
          <img src="_static/logo.gif"  />
     
        </a>

        
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

        
      </div>

      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
        
          
          
              <p class="caption"><span class="caption-text">Cyrus SASL</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="reference internal" href="download.html">Download</a><ul class="current">
<li class="toctree-l2 current"><a class="current reference internal" href="#">Get SASL</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/release-notes/index.html">Release Notes</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#supported-product-series">Supported Product Series</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-1">Series 2.1</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#older-versions">Older Versions</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-2-0">Series 2: 2.0</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-1">Series 1</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="packager.html">Note for Packagers</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/quickstart.html">Quickstart guide</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#features">Features</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#typical-installation">Typical Installation</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/concepts.html">Concepts</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl">SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl-authentication-mechanisms">SASL Authentication Mechanisms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#security-layers">Security Layers</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#channel-binding">Channel Binding</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#realms">Realms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#protocols">Protocols</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#cyrus-sasl">Cyrus SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#the-glue-library">The Glue Library</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#plugins">Plugins</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="setup.html">Setup</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#tarball-installation">Tarball installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#unix-package-installation">Unix package Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#requirements">Requirements</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#build-configuration">Build Configuration</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#building-and-installation">Building and Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#compilation-hints">Compilation Hints</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#application-configuration">Application Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/upgrading.html">Upgrading from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#backwards-compatibility">Backwards Compatibility</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#coexistence-with-saslv1">Coexistence with SASLv1</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#database-upgrades">Database Upgrades</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#errors-on-migration">Errors on migration</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/components.html">Components</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-application">The Application</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-sasl-glue-layer">The SASL Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#plugins">Plugins</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-general">Plugins: General</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-sasl-mechanisms">Plugins: SASL Mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-auxiliary-property">Plugins: Auxiliary Property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-username-canonicalization">Plugins: Username Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#password-verification-services">Password Verification Services</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html">Options</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasl-library">SASL Library</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#auxiliary-property-plugin">Auxiliary Property Plugin</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#gssapi">GSSAPI</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ldapdb">LDAPDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-ldapdb">Notes on LDAPDB</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#examples">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ntlm">NTLM</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#otp">OTP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#digest-md5">Digest-md5</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasldb">SASLDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sasldb-with-lmdb">Notes on sasldb with LMDB</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sql-plugin">SQL Plugin</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sql">Notes on SQL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#id2">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#srp">SRP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#kerberos-v4">Kerberos V4</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/advanced.html">Advanced Usage</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/advanced.html#notes-for-advanced-usage-of-libsasl">Notes for Advanced Usage of libsasl</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/advanced.html#using-cyrus-sasl-as-a-static-library">Using Cyrus SASL as a static library</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="operations.html">Operations</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/sysadmin.html">System Administrators</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#what-sasl-is">What SASL is</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#authentication-and-authorization-identifiers">Authentication and authorization identifiers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#realms">Realms</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-sasl-works">How SASL works</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-plain-mechanism-sasl-checkpass-and-plaintext-passwords">The PLAIN mechanism, <code class="docutils literal"><span class="pre">sasl_checkpass()</span></code>, and plaintext passwords</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#shared-secrets-mechanisms">Shared secrets mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#kerberos-mechanisms">Kerberos mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-otp-mechanism">The OTP mechanism</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-to-set-configuration-options">How to set configuration options</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-default-configuration-file">The default configuration file</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#application-configuration">Application configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#troubleshooting">Troubleshooting</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/manpages.html">Man pages</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/manpages.html#library-files">(3) Library Files</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl.html"><strong>SASL</strong> - SASL Authentication Library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_authorize_t.html"><strong>sasl_authorize_t</strong> - The SASL authorization callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop.html"><strong>sasl_auxprop</strong> - How to work with SASL auxiliary properties</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_add_plugin.html"><strong>sasl_auxprop_add_plugin</strong> - add a SASL auxiliary property plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_getctx.html"><strong>sasl_auxprop_getctx</strong> - Acquire an auxiliary property context</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_request.html"><strong>sasl_auxprop_request</strong> - Request auxiliary properties from SASL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_callbacks.html"><strong>sasl_callbacks</strong> - How to work with SASL callbacks</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canon_user_t.html"><strong>sasl_canon_user_t</strong> - Application-supplied user canonicalization function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canonuser_add_plugin.html"><strong>sasl_canonuser_add_plugin</strong> - add a SASL user canonicalization plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_chalprompt_t.html"><strong>sasl_chalprompt_t</strong> - Realm acquisition callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkapop.html"><strong>sasl_checkapop</strong> - Check an APOP challenge/response</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkpass.html"><strong>sasl_checkpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_add_plugin.html"><strong>sasl_client_add_plugin</strong> - add a SASL client plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_done.html"><strong>sasl_client_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_init.html"><strong>sasl_client_init</strong> - SASL client authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_new.html"><strong>sasl_client_new</strong> - Create a new client authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_plug_init_t.html"><strong>sasl_client_plug_init_t</strong> - client plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_start.html"><strong>sasl_client_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_step.html"><strong>sasl_client_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode.html"><strong>sasl_decode</strong> - Decode data received</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode64.html"><strong>sasl_decode64</strong> - Decode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_dispose.html"><strong>sasl_dispose</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_done.html"><strong>sasl_done</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode.html"><strong>sasl_encode</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode64.html"><strong>sasl_encode64</strong> - Encode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encodev.html"><strong>sasl_encodev</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_erasebuffer.html"><strong>sasl_erasebuffer</strong> - erase buffer</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errdetail.html"><strong>sasl_errdetail</strong> - Retrieve  detailed information about an error</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errors.html"><strong>sasl_errors</strong> - SASL error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errstring.html"><strong>sasl_errstring</strong> - Translate a SASL return code to a human-readable form</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getcallback_t.html"><strong>sasl_getcallback_t</strong> - callback function to lookup a sasl_callback_t for a connection</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getconfpath_t.html"><strong>sasl_getconfpath_t</strong> - The SASL callback to indicate location of the config files</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getopt_t.html"><strong>sasl_getopt_t</strong> - The SASL get option callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getpath_t.html"><strong>sasl_getpath_t</strong> - The SASL callback to indicate location of the mechanism drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getprop.html"><strong>sasl_getprop</strong> - Get a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getrealm_t.html"><strong>sasl_getrealm_t</strong> - Realm Acquisition Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsecret_t.html"><strong>sasl_getsecret_t</strong> - The SASL callback for secrets (passwords)</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsimple_t.html"><strong>sasl_getsimple_t</strong> - The SASL callback for username/authname/realm</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_global_listmech.html"><strong>sasl_global_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_idle.html"><strong>sasl_idle</strong> - Perform precalculations during an idle period</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_listmech.html"><strong>sasl_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_log_t.html"><strong>sasl_log_t</strong> - The SASL logging callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_add_plugin.html"><strong>sasl_server_add_plugin</strong> - add a SASL server plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_done.html"><strong>sasl_server_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_init.html"><strong>sasl_server_init</strong> - SASL server authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_new.html"><strong>sasl_server_new</strong> - Create a new server authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_plug_init_t.html"><strong>sasl_server_plug_init_t</strong> - server plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_start.html"><strong>sasl_server_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_step.html"><strong>sasl_server_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_checkpass_t.html"><strong>sasl_server_userdb_checkpass_t</strong> - Plaintext Password Verification Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_setpass_t.html"><strong>sasl_server_userdb_setpass_t</strong> - UserDB Plaintext Password Setting Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_alloc.html"><strong>sasl_set_alloc</strong> - set the memory allocation functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_mutex.html"><strong>sasl_set_mutex</strong> - set the mutex lock functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_seterror.html"><strong>sasl_seterror</strong> - set the error string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setpass.html"><strong>sasl_setpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setprop.html"><strong>sasl_setprop</strong> - Set a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_user_exists.html"><strong>sasl_user_exists</strong> - Check if a user exists on server</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_usererr.html"><strong>sasl_usererr</strong> - Remove information leak about accounts from sasl error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_utf8verify.html"><strong>sasl_utf8verify</strong> - Verify a string is valid utf8</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_verifyfile_t.html"><strong>sasl_verifyfile_t</strong> - The SASL file verification</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/auxiliary_properties.html">Auxiliary Properties</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#auxiliary-properties-and-the-glue-layer">Auxiliary Properties and the Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#passwords-and-other-data">Passwords and other Data</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sasldb">sasldb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#ldapdb">ldapdb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sql">sql</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#user-canonicalization">User Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/authentication_mechanisms.html">Authentication Mechanisms</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#mechanisms">Mechanisms</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#anonymous">ANONYMOUS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#cram-md5">CRAM-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#digest-md5">DIGEST-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#external">EXTERNAL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#g2">G2</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gssapi">GSSAPI</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gss-spegno">GSS-SPEGNO</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#kerberos-v4">KERBEROS_V4</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#login">LOGIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#ntlm">NTLM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#otp">OTP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#passdss">PASSDSS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#plain">PLAIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#scram">SCRAM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#srp">SRP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#non-sasl-authentication">Non-SASL Authentication</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#summary">Summary</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/pwcheck.html">Pwcheck</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop">Auxprop</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop-hashed">Auxprop-hashed</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#saslauthd">Saslauthd</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#authdaemon">Authdaemon</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#alwaystrue">Alwaystrue</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auto-transition">Auto Transition</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/faq.html">Frequently Asked Questions</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/authorize-vs-authenticate.html">What is the difference between an Authorization ID and a Authentication ID?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/crammd5-digestmd5.html">Why do CRAM-MD5 and DIGEST-MD5 not work with CyrusSaslauthd?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/openldap-sasl-gssapi.html">How do I configure OpenLDAP +SASL+GSSAPI?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/plaintextpasswords.html">Why does CyrusSasl store plaintext passwords in its databases?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/rfcs.html">RFCs and drafts</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/upgrade-saslv2.html">Why am I having a problem running dbconverter-2 to upgrade from SASLv1 to SASLv2?</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/resources.html">Other Documentation &amp; Resources</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="developer.html">Developers</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/appconvert.html">Converting Applications from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-both-clients-and-servers">Tips for both clients and servers</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-clients">Tips for clients</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-servers">Tips for Servers</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/programming.html">Application Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#background">Background</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-did-the-world-work-before-sasl">How did the world work before SASL?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sasl-to-the-rescue">SASL to the rescue!</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#briefly">Briefly</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-the-cyrus-sasl-library-good-for">What is the Cyrus SASL library good for?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-does-the-cyrus-sasl-library-do">What does the Cyrus SASL library do?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-doesn-t-the-cyrus-sasl-library-do">What doesn’t the Cyrus SASL library do?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#client-only-section">Client-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-client-s-perspective">A typical interaction from the client’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-does-this-look-in-code">How does this look in code</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#server-only-section">Server-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-server-s-perspective">A typical interaction from the server’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#id1">How does this look in code?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#callbacks-and-interactions">Callbacks and Interactions</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#security-layers">Security layers</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#example-applications-that-come-with-the-cyrus-sasl-library">Example applications that come with the Cyrus SASL library</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sample-client-and-sample-server"><cite>sample-client</cite> and <cite>sample-server</cite></a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#cyrus-imapd-v2-1-0-or-later">Cyrus imapd v2.1.0 or later</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#imtest-from-cyrus-2-1-0-or-later"><cite>imtest</cite>, from Cyrus 2.1.0 or later</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#miscellaneous-information">Miscellaneous Information</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#empty-exchanges">Empty exchanges</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#idle">Idle</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/plugprog.html">Plugin Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#overview-of-plugin-programming">Overview of Plugin Programming</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#use-of-sasl-utils-t">Use of sasl_utils_t</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#error-reporting">Error Reporting</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#memory-allocation">Memory Allocation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#client-send-first-server-send-last">Client Send First / Server Send Last</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#client-plugins">Client Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#server-plugins">Server Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#user-canonicalization-canon-user-plugins">User Canonicalization (canon_user) Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#auxiliary-property-auxprop-plugins">Auxiliary Property (auxprop) Plugins</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/testing.html">Testing</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#testing-the-cmu-sasl-library-with-the-included-sample-applications">Testing the CMU SASL Library with the included sample applications</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/testing.html#example">Example</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#running-the-testsuite-application">Running the Testsuite application</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="support.html">Support/Community</a></li>
</ul>
<p class="caption"><span class="caption-text">IMAP</span></p>
<ul>
<li class="toctree-l1"><a class="reference external" href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
</ul>

          
        
      </div>
      &nbsp;
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
        <a href="index.html">Cyrus SASL</a>
      </nav>


      
      <div class="wy-nav-content">
        <div class="rst-content">
          
          <div role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
      <li><a href="index.html">Docs v2.1.27</a> &raquo;</li>
      
          <li><a href="download.html">Download</a> &raquo;</li>
      
    <li>Get SASL</li>
      <li class="wy-breadcrumbs-aside">
        
          
            <a href="https://github.com/cyrusimap/cyrus-sasl/blob/master/docsrc/getsasl.rst" class="fa fa-github"> Edit on GitHub</a>
          
        
      </li>
  </ul>
  <hr/>
</div>
          <div role="main" class="document">
            
  <div class="section" id="get-sasl">
<h1>Get SASL<a class="headerlink" href="#get-sasl" title="Permalink to this headline">¶</a></h1>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#tarball-installation">Tarball installation</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#unix-package-installation">Unix package Installation</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#requirements">Requirements</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#build-configuration">Build Configuration</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#building-and-installation">Building and Installation</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#compilation-hints">Compilation Hints</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#application-configuration">Application Configuration</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
</ul>
</div>
</div>


          </div>
          <footer>
  
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      
        <a href="sasl/installation.html" class="btn btn-neutral float-right" title="Installation" accesskey="n">Next <span class="fa fa-arrow-circle-right"></span></a>
      
      
        <a href="download.html" class="btn btn-neutral" title="Download" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous</a>
      
    </div>
  

  <hr/>

  <div role="contentinfo">
    <p>
        &copy; Copyright 1993-2016, The Cyrus Team.
    </p>
  </div>
  Built with <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6 using a modified <a href="https://readthedocs.org">Read the Docs</a> <a href="https://github.com/snide/sphinx_rtd_theme">theme</a>.

</footer>

        </div>
      </div>

    </section>

  </div>
  


  

    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'./',
            VERSION:'2.1.27',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'.html',
            HAS_SOURCE:  true
        };
    </script>
      <script type="text/javascript" src="_static/jquery.js"></script>
      <script type="text/javascript" src="_static/underscore.js"></script>
      <script type="text/javascript" src="_static/doctools.js"></script>
      <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>

  

  
  
    <script type="text/javascript" src="_static/js/theme.js"></script>
  

  
  
  <script type="text/javascript">
<!--      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      }); -->
  </script>
  
 



</body>
</html>PK�*[���4�4�#doc/alt-cyrus-sasl-lib/support.htmlnu�[���

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>Support/Community &mdash; Cyrus SASL 2.1.27 documentation</title>
  

  
  
    <link rel="shortcut icon" href="_static/favicon.ico"/>
  

  

  
  
    

  

  
  
    <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
  

  
    <link rel="stylesheet" href="_static/cyrus.css" type="text/css" />
  

  
        <link rel="index" title="Index"
              href="genindex.html"/>
        <link rel="search" title="Search" href="search.html"/>
    <link rel="top" title="Cyrus SASL 2.1.27 documentation" href="index.html"/>
        <link rel="prev" title="Testing" href="sasl/developer/testing.html"/> 

  
  
  

</head>

<body class="wy-body-for-nav" role="document">

  
  
<div class="pageheader">
  <ul>
    <li><a href="index.html">Home</a></li>
    <li><a href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
    <li><a href="download.html">Download</a></li>
    <li><a href="contribute.html">Contribute</a></li>
  </ul>
  <div>
    <a href="index.html">
      <img src="_static/logo.gif" alt="CYRUS SASL" />
    </a>
  </div>
</div>
<div style="clear: both;"></div>


  <div class="wy-grid-for-nav">

    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-nav-search">
        

        
 
          <a href="index.html">
 

  
          
          <img src="_static/logo.gif"  />
     
        </a>

        
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

        
      </div>

      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
        
          
          
              <p class="caption"><span class="caption-text">Cyrus SASL</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="download.html">Download</a><ul>
<li class="toctree-l2"><a class="reference internal" href="getsasl.html">Get SASL</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/release-notes/index.html">Release Notes</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#supported-product-series">Supported Product Series</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-1">Series 2.1</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#older-versions">Older Versions</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-2-0">Series 2: 2.0</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-1">Series 1</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="packager.html">Note for Packagers</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/quickstart.html">Quickstart guide</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#features">Features</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#typical-installation">Typical Installation</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/concepts.html">Concepts</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl">SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl-authentication-mechanisms">SASL Authentication Mechanisms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#security-layers">Security Layers</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#channel-binding">Channel Binding</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#realms">Realms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#protocols">Protocols</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#cyrus-sasl">Cyrus SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#the-glue-library">The Glue Library</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#plugins">Plugins</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="setup.html">Setup</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#tarball-installation">Tarball installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#unix-package-installation">Unix package Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#requirements">Requirements</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#build-configuration">Build Configuration</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#building-and-installation">Building and Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#compilation-hints">Compilation Hints</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#application-configuration">Application Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/upgrading.html">Upgrading from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#backwards-compatibility">Backwards Compatibility</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#coexistence-with-saslv1">Coexistence with SASLv1</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#database-upgrades">Database Upgrades</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#errors-on-migration">Errors on migration</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/components.html">Components</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-application">The Application</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-sasl-glue-layer">The SASL Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#plugins">Plugins</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-general">Plugins: General</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-sasl-mechanisms">Plugins: SASL Mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-auxiliary-property">Plugins: Auxiliary Property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-username-canonicalization">Plugins: Username Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#password-verification-services">Password Verification Services</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html">Options</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasl-library">SASL Library</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#auxiliary-property-plugin">Auxiliary Property Plugin</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#gssapi">GSSAPI</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ldapdb">LDAPDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-ldapdb">Notes on LDAPDB</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#examples">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ntlm">NTLM</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#otp">OTP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#digest-md5">Digest-md5</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasldb">SASLDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sasldb-with-lmdb">Notes on sasldb with LMDB</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sql-plugin">SQL Plugin</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sql">Notes on SQL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#id2">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#srp">SRP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#kerberos-v4">Kerberos V4</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/advanced.html">Advanced Usage</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/advanced.html#notes-for-advanced-usage-of-libsasl">Notes for Advanced Usage of libsasl</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/advanced.html#using-cyrus-sasl-as-a-static-library">Using Cyrus SASL as a static library</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="operations.html">Operations</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/sysadmin.html">System Administrators</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#what-sasl-is">What SASL is</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#authentication-and-authorization-identifiers">Authentication and authorization identifiers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#realms">Realms</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-sasl-works">How SASL works</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-plain-mechanism-sasl-checkpass-and-plaintext-passwords">The PLAIN mechanism, <code class="docutils literal"><span class="pre">sasl_checkpass()</span></code>, and plaintext passwords</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#shared-secrets-mechanisms">Shared secrets mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#kerberos-mechanisms">Kerberos mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-otp-mechanism">The OTP mechanism</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-to-set-configuration-options">How to set configuration options</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-default-configuration-file">The default configuration file</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#application-configuration">Application configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#troubleshooting">Troubleshooting</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/manpages.html">Man pages</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/manpages.html#library-files">(3) Library Files</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl.html"><strong>SASL</strong> - SASL Authentication Library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_authorize_t.html"><strong>sasl_authorize_t</strong> - The SASL authorization callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop.html"><strong>sasl_auxprop</strong> - How to work with SASL auxiliary properties</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_add_plugin.html"><strong>sasl_auxprop_add_plugin</strong> - add a SASL auxiliary property plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_getctx.html"><strong>sasl_auxprop_getctx</strong> - Acquire an auxiliary property context</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_request.html"><strong>sasl_auxprop_request</strong> - Request auxiliary properties from SASL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_callbacks.html"><strong>sasl_callbacks</strong> - How to work with SASL callbacks</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canon_user_t.html"><strong>sasl_canon_user_t</strong> - Application-supplied user canonicalization function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canonuser_add_plugin.html"><strong>sasl_canonuser_add_plugin</strong> - add a SASL user canonicalization plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_chalprompt_t.html"><strong>sasl_chalprompt_t</strong> - Realm acquisition callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkapop.html"><strong>sasl_checkapop</strong> - Check an APOP challenge/response</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkpass.html"><strong>sasl_checkpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_add_plugin.html"><strong>sasl_client_add_plugin</strong> - add a SASL client plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_done.html"><strong>sasl_client_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_init.html"><strong>sasl_client_init</strong> - SASL client authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_new.html"><strong>sasl_client_new</strong> - Create a new client authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_plug_init_t.html"><strong>sasl_client_plug_init_t</strong> - client plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_start.html"><strong>sasl_client_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_step.html"><strong>sasl_client_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode.html"><strong>sasl_decode</strong> - Decode data received</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode64.html"><strong>sasl_decode64</strong> - Decode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_dispose.html"><strong>sasl_dispose</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_done.html"><strong>sasl_done</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode.html"><strong>sasl_encode</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode64.html"><strong>sasl_encode64</strong> - Encode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encodev.html"><strong>sasl_encodev</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_erasebuffer.html"><strong>sasl_erasebuffer</strong> - erase buffer</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errdetail.html"><strong>sasl_errdetail</strong> - Retrieve  detailed information about an error</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errors.html"><strong>sasl_errors</strong> - SASL error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errstring.html"><strong>sasl_errstring</strong> - Translate a SASL return code to a human-readable form</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getcallback_t.html"><strong>sasl_getcallback_t</strong> - callback function to lookup a sasl_callback_t for a connection</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getconfpath_t.html"><strong>sasl_getconfpath_t</strong> - The SASL callback to indicate location of the config files</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getopt_t.html"><strong>sasl_getopt_t</strong> - The SASL get option callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getpath_t.html"><strong>sasl_getpath_t</strong> - The SASL callback to indicate location of the mechanism drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getprop.html"><strong>sasl_getprop</strong> - Get a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getrealm_t.html"><strong>sasl_getrealm_t</strong> - Realm Acquisition Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsecret_t.html"><strong>sasl_getsecret_t</strong> - The SASL callback for secrets (passwords)</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsimple_t.html"><strong>sasl_getsimple_t</strong> - The SASL callback for username/authname/realm</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_global_listmech.html"><strong>sasl_global_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_idle.html"><strong>sasl_idle</strong> - Perform precalculations during an idle period</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_listmech.html"><strong>sasl_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_log_t.html"><strong>sasl_log_t</strong> - The SASL logging callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_add_plugin.html"><strong>sasl_server_add_plugin</strong> - add a SASL server plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_done.html"><strong>sasl_server_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_init.html"><strong>sasl_server_init</strong> - SASL server authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_new.html"><strong>sasl_server_new</strong> - Create a new server authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_plug_init_t.html"><strong>sasl_server_plug_init_t</strong> - server plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_start.html"><strong>sasl_server_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_step.html"><strong>sasl_server_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_checkpass_t.html"><strong>sasl_server_userdb_checkpass_t</strong> - Plaintext Password Verification Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_setpass_t.html"><strong>sasl_server_userdb_setpass_t</strong> - UserDB Plaintext Password Setting Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_alloc.html"><strong>sasl_set_alloc</strong> - set the memory allocation functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_mutex.html"><strong>sasl_set_mutex</strong> - set the mutex lock functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_seterror.html"><strong>sasl_seterror</strong> - set the error string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setpass.html"><strong>sasl_setpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setprop.html"><strong>sasl_setprop</strong> - Set a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_user_exists.html"><strong>sasl_user_exists</strong> - Check if a user exists on server</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_usererr.html"><strong>sasl_usererr</strong> - Remove information leak about accounts from sasl error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_utf8verify.html"><strong>sasl_utf8verify</strong> - Verify a string is valid utf8</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_verifyfile_t.html"><strong>sasl_verifyfile_t</strong> - The SASL file verification</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/auxiliary_properties.html">Auxiliary Properties</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#auxiliary-properties-and-the-glue-layer">Auxiliary Properties and the Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#passwords-and-other-data">Passwords and other Data</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sasldb">sasldb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#ldapdb">ldapdb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sql">sql</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#user-canonicalization">User Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/authentication_mechanisms.html">Authentication Mechanisms</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#mechanisms">Mechanisms</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#anonymous">ANONYMOUS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#cram-md5">CRAM-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#digest-md5">DIGEST-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#external">EXTERNAL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#g2">G2</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gssapi">GSSAPI</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gss-spegno">GSS-SPEGNO</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#kerberos-v4">KERBEROS_V4</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#login">LOGIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#ntlm">NTLM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#otp">OTP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#passdss">PASSDSS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#plain">PLAIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#scram">SCRAM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#srp">SRP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#non-sasl-authentication">Non-SASL Authentication</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#summary">Summary</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/pwcheck.html">Pwcheck</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop">Auxprop</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop-hashed">Auxprop-hashed</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#saslauthd">Saslauthd</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#authdaemon">Authdaemon</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#alwaystrue">Alwaystrue</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auto-transition">Auto Transition</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/faq.html">Frequently Asked Questions</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/authorize-vs-authenticate.html">What is the difference between an Authorization ID and a Authentication ID?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/crammd5-digestmd5.html">Why do CRAM-MD5 and DIGEST-MD5 not work with CyrusSaslauthd?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/openldap-sasl-gssapi.html">How do I configure OpenLDAP +SASL+GSSAPI?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/plaintextpasswords.html">Why does CyrusSasl store plaintext passwords in its databases?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/rfcs.html">RFCs and drafts</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/upgrade-saslv2.html">Why am I having a problem running dbconverter-2 to upgrade from SASLv1 to SASLv2?</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/resources.html">Other Documentation &amp; Resources</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="developer.html">Developers</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/appconvert.html">Converting Applications from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-both-clients-and-servers">Tips for both clients and servers</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-clients">Tips for clients</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-servers">Tips for Servers</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/programming.html">Application Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#background">Background</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-did-the-world-work-before-sasl">How did the world work before SASL?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sasl-to-the-rescue">SASL to the rescue!</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#briefly">Briefly</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-the-cyrus-sasl-library-good-for">What is the Cyrus SASL library good for?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-does-the-cyrus-sasl-library-do">What does the Cyrus SASL library do?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-doesn-t-the-cyrus-sasl-library-do">What doesn’t the Cyrus SASL library do?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#client-only-section">Client-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-client-s-perspective">A typical interaction from the client’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-does-this-look-in-code">How does this look in code</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#server-only-section">Server-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-server-s-perspective">A typical interaction from the server’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#id1">How does this look in code?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#callbacks-and-interactions">Callbacks and Interactions</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#security-layers">Security layers</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#example-applications-that-come-with-the-cyrus-sasl-library">Example applications that come with the Cyrus SASL library</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sample-client-and-sample-server"><cite>sample-client</cite> and <cite>sample-server</cite></a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#cyrus-imapd-v2-1-0-or-later">Cyrus imapd v2.1.0 or later</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#imtest-from-cyrus-2-1-0-or-later"><cite>imtest</cite>, from Cyrus 2.1.0 or later</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#miscellaneous-information">Miscellaneous Information</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#empty-exchanges">Empty exchanges</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#idle">Idle</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/plugprog.html">Plugin Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#overview-of-plugin-programming">Overview of Plugin Programming</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#use-of-sasl-utils-t">Use of sasl_utils_t</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#error-reporting">Error Reporting</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#memory-allocation">Memory Allocation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#client-send-first-server-send-last">Client Send First / Server Send Last</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#client-plugins">Client Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#server-plugins">Server Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#user-canonicalization-canon-user-plugins">User Canonicalization (canon_user) Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#auxiliary-property-auxprop-plugins">Auxiliary Property (auxprop) Plugins</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/testing.html">Testing</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#testing-the-cmu-sasl-library-with-the-included-sample-applications">Testing the CMU SASL Library with the included sample applications</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/testing.html#example">Example</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#running-the-testsuite-application">Running the Testsuite application</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Support/Community</a></li>
</ul>
<p class="caption"><span class="caption-text">IMAP</span></p>
<ul>
<li class="toctree-l1"><a class="reference external" href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
</ul>

          
        
      </div>
      &nbsp;
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
        <a href="index.html">Cyrus SASL</a>
      </nav>


      
      <div class="wy-nav-content">
        <div class="rst-content">
          
          <div role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
      <li><a href="index.html">Docs v2.1.27</a> &raquo;</li>
      
    <li>Support/Community</li>
      <li class="wy-breadcrumbs-aside">
        
          
            <a href="https://github.com/cyrusimap/cyrus-sasl/blob/master/docsrc/support.rst" class="fa fa-github"> Edit on GitHub</a>
          
        
      </li>
  </ul>
  <hr/>
</div>
          <div role="main" class="document">
            
  <div class="section" id="support-community">
<h1>Support/Community<a class="headerlink" href="#support-community" title="Permalink to this headline">¶</a></h1>
<p>Please read our support and bug reporting guidelines in the <a class="reference external" href="https://www.cyrusimap.org/support.html#support" title="(in Cyrus IMAP v3.0.8)"><span class="xref std std-ref">Cyrus IMAP project</span></a>.</p>
</div>


          </div>
          <footer>
  
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      
      
        <a href="sasl/developer/testing.html" class="btn btn-neutral" title="Testing" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous</a>
      
    </div>
  

  <hr/>

  <div role="contentinfo">
    <p>
        &copy; Copyright 1993-2016, The Cyrus Team.
    </p>
  </div>
  Built with <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6 using a modified <a href="https://readthedocs.org">Read the Docs</a> <a href="https://github.com/snide/sphinx_rtd_theme">theme</a>.

</footer>

        </div>
      </div>

    </section>

  </div>
  


  

    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'./',
            VERSION:'2.1.27',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'.html',
            HAS_SOURCE:  true
        };
    </script>
      <script type="text/javascript" src="_static/jquery.js"></script>
      <script type="text/javascript" src="_static/underscore.js"></script>
      <script type="text/javascript" src="_static/doctools.js"></script>
      <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>

  

  
  
    <script type="text/javascript" src="_static/js/theme.js"></script>
  

  
  
  <script type="text/javascript">
<!--      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      }); -->
  </script>
  
 



</body>
</html>PK�*[vu,��$doc/alt-cyrus-sasl-lib/genindex.htmlnu�[���


<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>Index &mdash; Cyrus SASL 2.1.27 documentation</title>
  

  
  
    <link rel="shortcut icon" href="_static/favicon.ico"/>
  

  

  
  
    

  

  
  
    <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
  

  
    <link rel="stylesheet" href="_static/cyrus.css" type="text/css" />
  

  
        <link rel="index" title="Index"
              href="#"/>
        <link rel="search" title="Search" href="search.html"/>
    <link rel="top" title="Cyrus SASL 2.1.27 documentation" href="index.html"/> 

  
  
  

</head>

<body class="wy-body-for-nav" role="document">

  
  
<div class="pageheader">
  <ul>
    <li><a href="index.html">Home</a></li>
    <li><a href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
    <li><a href="download.html">Download</a></li>
    <li><a href="contribute.html">Contribute</a></li>
  </ul>
  <div>
    <a href="index.html">
      <img src="_static/logo.gif" alt="CYRUS SASL" />
    </a>
  </div>
</div>
<div style="clear: both;"></div>


  <div class="wy-grid-for-nav">

    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-nav-search">
        

        
 
          <a href="index.html">
 

  
          
          <img src="_static/logo.gif"  />
     
        </a>

        
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

        
      </div>

      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
        
          
          
              <p class="caption"><span class="caption-text">Cyrus SASL</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="download.html">Download</a><ul>
<li class="toctree-l2"><a class="reference internal" href="getsasl.html">Get SASL</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/release-notes/index.html">Release Notes</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#supported-product-series">Supported Product Series</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-1">Series 2.1</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#older-versions">Older Versions</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-2-0">Series 2: 2.0</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-1">Series 1</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="packager.html">Note for Packagers</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/quickstart.html">Quickstart guide</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#features">Features</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#typical-installation">Typical Installation</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/concepts.html">Concepts</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl">SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl-authentication-mechanisms">SASL Authentication Mechanisms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#security-layers">Security Layers</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#channel-binding">Channel Binding</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#realms">Realms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#protocols">Protocols</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#cyrus-sasl">Cyrus SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#the-glue-library">The Glue Library</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#plugins">Plugins</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="setup.html">Setup</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#tarball-installation">Tarball installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#unix-package-installation">Unix package Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#requirements">Requirements</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#build-configuration">Build Configuration</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#building-and-installation">Building and Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#compilation-hints">Compilation Hints</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#application-configuration">Application Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/upgrading.html">Upgrading from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#backwards-compatibility">Backwards Compatibility</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#coexistence-with-saslv1">Coexistence with SASLv1</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#database-upgrades">Database Upgrades</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#errors-on-migration">Errors on migration</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/components.html">Components</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-application">The Application</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-sasl-glue-layer">The SASL Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#plugins">Plugins</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-general">Plugins: General</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-sasl-mechanisms">Plugins: SASL Mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-auxiliary-property">Plugins: Auxiliary Property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-username-canonicalization">Plugins: Username Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#password-verification-services">Password Verification Services</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html">Options</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasl-library">SASL Library</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#auxiliary-property-plugin">Auxiliary Property Plugin</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#gssapi">GSSAPI</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ldapdb">LDAPDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-ldapdb">Notes on LDAPDB</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#examples">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ntlm">NTLM</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#otp">OTP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#digest-md5">Digest-md5</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasldb">SASLDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sasldb-with-lmdb">Notes on sasldb with LMDB</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sql-plugin">SQL Plugin</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sql">Notes on SQL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#id2">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#srp">SRP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#kerberos-v4">Kerberos V4</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/advanced.html">Advanced Usage</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/advanced.html#notes-for-advanced-usage-of-libsasl">Notes for Advanced Usage of libsasl</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/advanced.html#using-cyrus-sasl-as-a-static-library">Using Cyrus SASL as a static library</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="operations.html">Operations</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/sysadmin.html">System Administrators</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#what-sasl-is">What SASL is</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#authentication-and-authorization-identifiers">Authentication and authorization identifiers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#realms">Realms</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-sasl-works">How SASL works</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-plain-mechanism-sasl-checkpass-and-plaintext-passwords">The PLAIN mechanism, <code class="docutils literal"><span class="pre">sasl_checkpass()</span></code>, and plaintext passwords</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#shared-secrets-mechanisms">Shared secrets mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#kerberos-mechanisms">Kerberos mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-otp-mechanism">The OTP mechanism</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-to-set-configuration-options">How to set configuration options</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-default-configuration-file">The default configuration file</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#application-configuration">Application configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#troubleshooting">Troubleshooting</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/manpages.html">Man pages</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/manpages.html#library-files">(3) Library Files</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl.html"><strong>SASL</strong> - SASL Authentication Library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_authorize_t.html"><strong>sasl_authorize_t</strong> - The SASL authorization callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop.html"><strong>sasl_auxprop</strong> - How to work with SASL auxiliary properties</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_add_plugin.html"><strong>sasl_auxprop_add_plugin</strong> - add a SASL auxiliary property plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_getctx.html"><strong>sasl_auxprop_getctx</strong> - Acquire an auxiliary property context</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_request.html"><strong>sasl_auxprop_request</strong> - Request auxiliary properties from SASL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_callbacks.html"><strong>sasl_callbacks</strong> - How to work with SASL callbacks</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canon_user_t.html"><strong>sasl_canon_user_t</strong> - Application-supplied user canonicalization function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canonuser_add_plugin.html"><strong>sasl_canonuser_add_plugin</strong> - add a SASL user canonicalization plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_chalprompt_t.html"><strong>sasl_chalprompt_t</strong> - Realm acquisition callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkapop.html"><strong>sasl_checkapop</strong> - Check an APOP challenge/response</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkpass.html"><strong>sasl_checkpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_add_plugin.html"><strong>sasl_client_add_plugin</strong> - add a SASL client plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_done.html"><strong>sasl_client_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_init.html"><strong>sasl_client_init</strong> - SASL client authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_new.html"><strong>sasl_client_new</strong> - Create a new client authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_plug_init_t.html"><strong>sasl_client_plug_init_t</strong> - client plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_start.html"><strong>sasl_client_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_step.html"><strong>sasl_client_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode.html"><strong>sasl_decode</strong> - Decode data received</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode64.html"><strong>sasl_decode64</strong> - Decode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_dispose.html"><strong>sasl_dispose</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_done.html"><strong>sasl_done</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode.html"><strong>sasl_encode</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode64.html"><strong>sasl_encode64</strong> - Encode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encodev.html"><strong>sasl_encodev</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_erasebuffer.html"><strong>sasl_erasebuffer</strong> - erase buffer</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errdetail.html"><strong>sasl_errdetail</strong> - Retrieve  detailed information about an error</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errors.html"><strong>sasl_errors</strong> - SASL error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errstring.html"><strong>sasl_errstring</strong> - Translate a SASL return code to a human-readable form</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getcallback_t.html"><strong>sasl_getcallback_t</strong> - callback function to lookup a sasl_callback_t for a connection</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getconfpath_t.html"><strong>sasl_getconfpath_t</strong> - The SASL callback to indicate location of the config files</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getopt_t.html"><strong>sasl_getopt_t</strong> - The SASL get option callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getpath_t.html"><strong>sasl_getpath_t</strong> - The SASL callback to indicate location of the mechanism drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getprop.html"><strong>sasl_getprop</strong> - Get a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getrealm_t.html"><strong>sasl_getrealm_t</strong> - Realm Acquisition Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsecret_t.html"><strong>sasl_getsecret_t</strong> - The SASL callback for secrets (passwords)</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsimple_t.html"><strong>sasl_getsimple_t</strong> - The SASL callback for username/authname/realm</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_global_listmech.html"><strong>sasl_global_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_idle.html"><strong>sasl_idle</strong> - Perform precalculations during an idle period</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_listmech.html"><strong>sasl_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_log_t.html"><strong>sasl_log_t</strong> - The SASL logging callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_add_plugin.html"><strong>sasl_server_add_plugin</strong> - add a SASL server plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_done.html"><strong>sasl_server_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_init.html"><strong>sasl_server_init</strong> - SASL server authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_new.html"><strong>sasl_server_new</strong> - Create a new server authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_plug_init_t.html"><strong>sasl_server_plug_init_t</strong> - server plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_start.html"><strong>sasl_server_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_step.html"><strong>sasl_server_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_checkpass_t.html"><strong>sasl_server_userdb_checkpass_t</strong> - Plaintext Password Verification Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_setpass_t.html"><strong>sasl_server_userdb_setpass_t</strong> - UserDB Plaintext Password Setting Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_alloc.html"><strong>sasl_set_alloc</strong> - set the memory allocation functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_mutex.html"><strong>sasl_set_mutex</strong> - set the mutex lock functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_seterror.html"><strong>sasl_seterror</strong> - set the error string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setpass.html"><strong>sasl_setpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setprop.html"><strong>sasl_setprop</strong> - Set a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_user_exists.html"><strong>sasl_user_exists</strong> - Check if a user exists on server</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_usererr.html"><strong>sasl_usererr</strong> - Remove information leak about accounts from sasl error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_utf8verify.html"><strong>sasl_utf8verify</strong> - Verify a string is valid utf8</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_verifyfile_t.html"><strong>sasl_verifyfile_t</strong> - The SASL file verification</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/auxiliary_properties.html">Auxiliary Properties</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#auxiliary-properties-and-the-glue-layer">Auxiliary Properties and the Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#passwords-and-other-data">Passwords and other Data</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sasldb">sasldb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#ldapdb">ldapdb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sql">sql</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#user-canonicalization">User Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/authentication_mechanisms.html">Authentication Mechanisms</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#mechanisms">Mechanisms</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#anonymous">ANONYMOUS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#cram-md5">CRAM-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#digest-md5">DIGEST-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#external">EXTERNAL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#g2">G2</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gssapi">GSSAPI</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gss-spegno">GSS-SPEGNO</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#kerberos-v4">KERBEROS_V4</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#login">LOGIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#ntlm">NTLM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#otp">OTP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#passdss">PASSDSS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#plain">PLAIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#scram">SCRAM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#srp">SRP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#non-sasl-authentication">Non-SASL Authentication</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#summary">Summary</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/pwcheck.html">Pwcheck</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop">Auxprop</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop-hashed">Auxprop-hashed</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#saslauthd">Saslauthd</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#authdaemon">Authdaemon</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#alwaystrue">Alwaystrue</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auto-transition">Auto Transition</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/faq.html">Frequently Asked Questions</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/authorize-vs-authenticate.html">What is the difference between an Authorization ID and a Authentication ID?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/crammd5-digestmd5.html">Why do CRAM-MD5 and DIGEST-MD5 not work with CyrusSaslauthd?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/openldap-sasl-gssapi.html">How do I configure OpenLDAP +SASL+GSSAPI?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/plaintextpasswords.html">Why does CyrusSasl store plaintext passwords in its databases?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/rfcs.html">RFCs and drafts</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/upgrade-saslv2.html">Why am I having a problem running dbconverter-2 to upgrade from SASLv1 to SASLv2?</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/resources.html">Other Documentation &amp; Resources</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="developer.html">Developers</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/appconvert.html">Converting Applications from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-both-clients-and-servers">Tips for both clients and servers</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-clients">Tips for clients</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-servers">Tips for Servers</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/programming.html">Application Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#background">Background</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-did-the-world-work-before-sasl">How did the world work before SASL?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sasl-to-the-rescue">SASL to the rescue!</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#briefly">Briefly</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-the-cyrus-sasl-library-good-for">What is the Cyrus SASL library good for?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-does-the-cyrus-sasl-library-do">What does the Cyrus SASL library do?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-doesn-t-the-cyrus-sasl-library-do">What doesn’t the Cyrus SASL library do?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#client-only-section">Client-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-client-s-perspective">A typical interaction from the client’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-does-this-look-in-code">How does this look in code</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#server-only-section">Server-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-server-s-perspective">A typical interaction from the server’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#id1">How does this look in code?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#callbacks-and-interactions">Callbacks and Interactions</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#security-layers">Security layers</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#example-applications-that-come-with-the-cyrus-sasl-library">Example applications that come with the Cyrus SASL library</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sample-client-and-sample-server"><cite>sample-client</cite> and <cite>sample-server</cite></a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#cyrus-imapd-v2-1-0-or-later">Cyrus imapd v2.1.0 or later</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#imtest-from-cyrus-2-1-0-or-later"><cite>imtest</cite>, from Cyrus 2.1.0 or later</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#miscellaneous-information">Miscellaneous Information</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#empty-exchanges">Empty exchanges</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#idle">Idle</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/plugprog.html">Plugin Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#overview-of-plugin-programming">Overview of Plugin Programming</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#use-of-sasl-utils-t">Use of sasl_utils_t</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#error-reporting">Error Reporting</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#memory-allocation">Memory Allocation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#client-send-first-server-send-last">Client Send First / Server Send Last</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#client-plugins">Client Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#server-plugins">Server Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#user-canonicalization-canon-user-plugins">User Canonicalization (canon_user) Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#auxiliary-property-auxprop-plugins">Auxiliary Property (auxprop) Plugins</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/testing.html">Testing</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#testing-the-cmu-sasl-library-with-the-included-sample-applications">Testing the CMU SASL Library with the included sample applications</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/testing.html#example">Example</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#running-the-testsuite-application">Running the Testsuite application</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="support.html">Support/Community</a></li>
</ul>
<p class="caption"><span class="caption-text">IMAP</span></p>
<ul>
<li class="toctree-l1"><a class="reference external" href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
</ul>

          
        
      </div>
      &nbsp;
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
        <a href="index.html">Cyrus SASL</a>
      </nav>


      
      <div class="wy-nav-content">
        <div class="rst-content">
          
          <div role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
      <li><a href="index.html">Docs v2.1.27</a> &raquo;</li>
      
    <li>Index</li>
      <li class="wy-breadcrumbs-aside">
        
          
            <a href="https://github.com/cyrusimap/cyrus-sasl/blob/master/docsrc/genindex.rst" class="fa fa-github"> Edit on GitHub</a>
          
        
      </li>
  </ul>
  <hr/>
</div>
          <div role="main" class="document">
            

<h1 id="index">Index</h1>

<div class="genindex-jumpbox">
 <a href="#Symbols"><strong>Symbols</strong></a>
 | <a href="#A"><strong>A</strong></a>
 | <a href="#C"><strong>C</strong></a>
 | <a href="#K"><strong>K</strong></a>
 | <a href="#L"><strong>L</strong></a>
 | <a href="#M"><strong>M</strong></a>
 | <a href="#N"><strong>N</strong></a>
 | <a href="#O"><strong>O</strong></a>
 | <a href="#P"><strong>P</strong></a>
 | <a href="#R"><strong>R</strong></a>
 | <a href="#S"><strong>S</strong></a>
 
</div>
<h2 id="Symbols">Symbols</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
  <td style="width: 33%; vertical-align: top;"><ul>
      <li>
    -C config-file

      <ul>
        <li><a href="sasl/reference/manpages/template.html#cmdoption-cmd-c">CMD command line option</a>
</li>
      </ul></li>
  </ul></td>
</tr></table>

<h2 id="A">A</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
  <td style="width: 33%; vertical-align: top;"><ul>
      <li>
    authdaemon_path [&lt;path&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-authdaemon-path">command line option</a>
</li>
      </ul></li>
      <li>
    auto_transition [yes|noplain|no]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-auto-transition">command line option</a>
</li>
      </ul></li>
  </ul></td>
  <td style="width: 33%; vertical-align: top;"><ul>
      <li>
    auxprop_plugin [&lt;list of plugin names&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-auxprop-plugin">command line option</a>
</li>
      </ul></li>
  </ul></td>
</tr></table>

<h2 id="C">C</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
  <td style="width: 33%; vertical-align: top;"><ul>
      <li>
    canon_user_plugin [&lt;name&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-canon-user-plugin">command line option</a>
</li>
      </ul></li>
      <li>
    CMD command line option

      <ul>
        <li><a href="sasl/reference/manpages/template.html#cmdoption-cmd-c">-C config-file</a>
</li>
      </ul></li>
      <li><a href="sasl/reference/manpages/template.html#std:saslman-CMDNAME(3)">CMDNAME(3)</a>
</li>
      <li>
    command line option

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-authdaemon-path">authdaemon_path [&lt;path&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-auto-transition">auto_transition [yes|noplain|no]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-auxprop-plugin">auxprop_plugin [&lt;list of plugin names&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-canon-user-plugin">canon_user_plugin [&lt;name&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-keytab">keytab [&lt;path&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-ldapdb-canon-attr">ldapdb_canon_attr [&lt;user&#39;s canonical name&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-ldapdb-id">ldapdb_id [&lt;auth id&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-ldapdb-mech">ldapdb_mech [&lt;mechanism&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-ldapdb-pw">ldapdb_pw [&lt;password&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-ldapdb-rc">ldapdb_rc [&lt;filename&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-ldapdb-starttls">ldapdb_starttls [try|demand]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-ldapdb-uri">ldapdb_uri [&lt;list of URIs&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-log-level">log_level [&lt;numeric log level&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-mech-list">mech_list [&lt;mechanism list&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-ntlm-server">ntlm_server [&lt;list of server names&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-ntlm-v2">ntlm_v2 [yes|no]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-opiekeys">opiekeys [&lt;path&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-otp-mda">otp_mda [md4 | md5 | sha1]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-plugin-list">plugin_list [&lt;path&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-pwcheck-method">pwcheck_method [&lt;list of mechanisms&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-reauth-timeout">reauth_timeout [&lt;minutes&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-saslauthd-path">saslauthd_path [&lt;path&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-sasldb-mapsize">sasldb_mapsize [&lt;size in bytes&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-sasldb-maxreaders">sasldb_maxreaders [&lt;max threads&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-sasldb-path">sasldb_path [&lt;path to sasldb file&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-sql-database">sql_database &lt;database name&gt;</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-sql-engine">sql_engine [&lt;name&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-sql-hostnames">sql_hostnames [&lt;list of SQL servers&gt;]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-sql-insert">sql_insert &lt;statement&gt;</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-sql-passwd">sql_passwd &lt;password&gt;</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-sql-select">sql_select &lt;statement&gt;</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-sql-update">sql_update &lt;statement&gt;</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-sql-user">sql_user &lt;username&gt;</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-srp-mda">srp_mda [md5 | sha1 | rmd160]</a>
</li>
        <li><a href="sasl/options.html#cmdoption-arg-srvtab">srvtab [&lt;path&gt;]</a>
</li>
      </ul></li>
  </ul></td>
</tr></table>

<h2 id="K">K</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
  <td style="width: 33%; vertical-align: top;"><ul>
      <li>
    keytab [&lt;path&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-keytab">command line option</a>
</li>
      </ul></li>
  </ul></td>
</tr></table>

<h2 id="L">L</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
  <td style="width: 33%; vertical-align: top;"><ul>
      <li>
    ldapdb_canon_attr [&lt;user&#39;s canonical name&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-ldapdb-canon-attr">command line option</a>
</li>
      </ul></li>
      <li>
    ldapdb_id [&lt;auth id&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-ldapdb-id">command line option</a>
</li>
      </ul></li>
      <li>
    ldapdb_mech [&lt;mechanism&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-ldapdb-mech">command line option</a>
</li>
      </ul></li>
      <li>
    ldapdb_pw [&lt;password&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-ldapdb-pw">command line option</a>
</li>
      </ul></li>
  </ul></td>
  <td style="width: 33%; vertical-align: top;"><ul>
      <li>
    ldapdb_rc [&lt;filename&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-ldapdb-rc">command line option</a>
</li>
      </ul></li>
      <li>
    ldapdb_starttls [try|demand]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-ldapdb-starttls">command line option</a>
</li>
      </ul></li>
      <li>
    ldapdb_uri [&lt;list of URIs&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-ldapdb-uri">command line option</a>
</li>
      </ul></li>
      <li>
    log_level [&lt;numeric log level&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-log-level">command line option</a>
</li>
      </ul></li>
  </ul></td>
</tr></table>

<h2 id="M">M</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
  <td style="width: 33%; vertical-align: top;"><ul>
      <li>
    mech_list [&lt;mechanism list&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-mech-list">command line option</a>
</li>
      </ul></li>
  </ul></td>
</tr></table>

<h2 id="N">N</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
  <td style="width: 33%; vertical-align: top;"><ul>
      <li>
    ntlm_server [&lt;list of server names&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-ntlm-server">command line option</a>
</li>
      </ul></li>
  </ul></td>
  <td style="width: 33%; vertical-align: top;"><ul>
      <li>
    ntlm_v2 [yes|no]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-ntlm-v2">command line option</a>
</li>
      </ul></li>
  </ul></td>
</tr></table>

<h2 id="O">O</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
  <td style="width: 33%; vertical-align: top;"><ul>
      <li>
    opiekeys [&lt;path&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-opiekeys">command line option</a>
</li>
      </ul></li>
  </ul></td>
  <td style="width: 33%; vertical-align: top;"><ul>
      <li>
    otp_mda [md4 | md5 | sha1]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-otp-mda">command line option</a>
</li>
      </ul></li>
  </ul></td>
</tr></table>

<h2 id="P">P</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
  <td style="width: 33%; vertical-align: top;"><ul>
      <li>
    plugin_list [&lt;path&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-plugin-list">command line option</a>
</li>
      </ul></li>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop.html#c.prop_clear">prop_clear (C function)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop.html#c.prop_dispose">prop_dispose (C function)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop.html#c.prop_dup">prop_dup (C function)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop.html#c.prop_erase">prop_erase (C function)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop.html#c.prop_format">prop_format (C function)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop.html#c.prop_get">prop_get (C function)</a>
</li>
  </ul></td>
  <td style="width: 33%; vertical-align: top;"><ul>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop.html#c.prop_getnames">prop_getnames (C function)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop.html#c.prop_new">prop_new (C function)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop.html#c.prop_request">prop_request (C function)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop.html#c.prop_set">prop_set (C function)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop.html#c.prop_setvals">prop_setvals (C function)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop.html#c.propctx">propctx (C type)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop.html#c.propval">propval (C type)</a>
</li>
      <li>
    pwcheck_method [&lt;list of mechanisms&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-pwcheck-method">command line option</a>
</li>
      </ul></li>
  </ul></td>
</tr></table>

<h2 id="R">R</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
  <td style="width: 33%; vertical-align: top;"><ul>
      <li>
    reauth_timeout [&lt;minutes&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-reauth-timeout">command line option</a>
</li>
      </ul></li>
      <li>
    RFC

      <ul>
        <li><a href="sasl/reference/manpages/library/sasl_errstring.html#index-0">RFC 1766</a>, <a href="sasl/reference/manpages/library/sasl_getsimple_t.html#index-0">[1]</a>
</li>
        <li><a href="sasl/reference/manpages/library/sasl_checkapop.html#index-0">RFC 1939</a>, <a href="sasl/reference/manpages/library/sasl_checkapop.html#index-2">[1]</a>
</li>
        <li><a href="sasl/faqs/rfcs.html#index-13">RFC 1939#page-15</a>
</li>
        <li><a href="sasl/developer/programming.html#index-0">RFC 2222</a>, <a href="sasl/developer/programming.html#index-1">[1]</a>, <a href="sasl/reference/manpages/library/sasl.html#index-0">[2]</a>
</li>
        <li><a href="sasl/faqs/rfcs.html#index-12">RFC 2222#section-7.1</a>
</li>
        <li><a href="sasl/faqs/rfcs.html#index-8">RFC 2444</a>
</li>
        <li><a href="sasl/reference/manpages/library/sasl_seterror.html#index-0">RFC 2482</a>, <a href="sasl/reference/manpages/library/sasl_seterror.html#index-1">[1]</a>
</li>
        <li><a href="sasl/faqs/rfcs.html#index-9">RFC 2808</a>
</li>
        <li><a href="sasl/faqs/rfcs.html#index-10">RFC 2831</a>
</li>
        <li><a href="sasl/faqs/rfcs.html#index-0">RFC 4422</a>, <a href="sasl/reference/manpages/library/sasl_auxprop.html#index-0">[1]</a>, <a href="sasl/reference/manpages/library/sasl_auxprop_add_plugin.html#index-0">[2]</a>, <a href="sasl/reference/manpages/library/sasl_auxprop_getctx.html#index-0">[3]</a>, <a href="sasl/reference/manpages/library/sasl_auxprop_request.html#index-0">[4]</a>, <a href="sasl/reference/manpages/library/sasl_callbacks.html#index-0">[5]</a>, <a href="sasl/reference/manpages/library/sasl_canon_user_t.html#index-0">[6]</a>, <a href="sasl/reference/manpages/library/sasl_canonuser_add_plugin.html#index-0">[7]</a>, <a href="sasl/reference/manpages/library/sasl_checkapop.html#index-1">[8]</a>, <a href="sasl/reference/manpages/library/sasl_checkpass.html#index-0">[9]</a>, <a href="sasl/reference/manpages/library/sasl_client_add_plugin.html#index-0">[10]</a>, <a href="sasl/reference/manpages/library/sasl_client_done.html#index-0">[11]</a>, <a href="sasl/reference/manpages/library/sasl_client_init.html#index-0">[12]</a>, <a href="sasl/reference/manpages/library/sasl_client_new.html#index-0">[13]</a>, <a href="sasl/reference/manpages/library/sasl_client_plug_init_t.html#index-0">[14]</a>, <a href="sasl/reference/manpages/library/sasl_client_start.html#index-0">[15]</a>, <a href="sasl/reference/manpages/library/sasl_client_step.html#index-0">[16]</a>, <a href="sasl/reference/manpages/library/sasl_decode.html#index-0">[17]</a>, <a href="sasl/reference/manpages/library/sasl_decode64.html#index-0">[18]</a>, <a href="sasl/reference/manpages/library/sasl_dispose.html#index-0">[19]</a>, <a href="sasl/reference/manpages/library/sasl_done.html#index-0">[20]</a>, <a href="sasl/reference/manpages/library/sasl_encode.html#index-0">[21]</a>, <a href="sasl/reference/manpages/library/sasl_encode64.html#index-0">[22]</a>, <a href="sasl/reference/manpages/library/sasl_encodev.html#index-0">[23]</a>, <a href="sasl/reference/manpages/library/sasl_errdetail.html#index-0">[24]</a>, <a href="sasl/reference/manpages/library/sasl_errors.html#index-0">[25]</a>, <a href="sasl/reference/manpages/library/sasl_errstring.html#index-1">[26]</a>, <a href="sasl/reference/manpages/library/sasl_getcallback_t.html#index-0">[27]</a>, <a href="sasl/reference/manpages/library/sasl_getconfpath_t.html#index-0">[28]</a>, <a href="sasl/reference/manpages/library/sasl_getopt_t.html#index-0">[29]</a>, <a href="sasl/reference/manpages/library/sasl_getpath_t.html#index-0">[30]</a>, <a href="sasl/reference/manpages/library/sasl_getprop.html#index-0">[31]</a>, <a href="sasl/reference/manpages/library/sasl_getrealm_t.html#index-0">[32]</a>, <a href="sasl/reference/manpages/library/sasl_getsecret_t.html#index-0">[33]</a>, <a href="sasl/reference/manpages/library/sasl_getsimple_t.html#index-1">[34]</a>, <a href="sasl/reference/manpages/library/sasl_global_listmech.html#index-0">[35]</a>, <a href="sasl/reference/manpages/library/sasl_idle.html#index-0">[36]</a>, <a href="sasl/reference/manpages/library/sasl_listmech.html#index-0">[37]</a>, <a href="sasl/reference/manpages/library/sasl_log_t.html#index-0">[38]</a>, <a href="sasl/reference/manpages/library/sasl_server_add_plugin.html#index-0">[39]</a>, <a href="sasl/reference/manpages/library/sasl_server_done.html#index-0">[40]</a>, <a href="sasl/reference/manpages/library/sasl_server_init.html#index-0">[41]</a>, <a href="sasl/reference/manpages/library/sasl_server_new.html#index-0">[42]</a>, <a href="sasl/reference/manpages/library/sasl_server_plug_init_t.html#index-0">[43]</a>, <a href="sasl/reference/manpages/library/sasl_server_start.html#index-0">[44]</a>, <a href="sasl/reference/manpages/library/sasl_server_step.html#index-0">[45]</a>, <a href="sasl/reference/manpages/library/sasl_server_userdb_checkpass_t.html#index-0">[46]</a>, <a href="sasl/reference/manpages/library/sasl_server_userdb_setpass_t.html#index-0">[47]</a>, <a href="sasl/reference/manpages/library/sasl_setpass.html#index-0">[48]</a>, <a href="sasl/reference/manpages/library/sasl_setprop.html#index-0">[49]</a>, <a href="sasl/reference/manpages/library/sasl_user_exists.html#index-0">[50]</a>, <a href="sasl/reference/manpages/library/sasl_usererr.html#index-0">[51]</a>, <a href="sasl/reference/manpages/library/sasl_verifyfile_t.html#index-0">[52]</a>
</li>
        <li><a href="sasl/faqs/rfcs.html#index-3">RFC 4505</a>
</li>
        <li><a href="sasl/faqs/rfcs.html#index-4">RFC 4616</a>
</li>
        <li><a href="sasl/faqs/rfcs.html#index-5">RFC 4752</a>
</li>
        <li><a href="sasl/faqs/rfcs.html#index-2">RFC 4846#section-4</a>
</li>
        <li><a href="sasl/faqs/rfcs.html#index-6">RFC 5801</a>
</li>
        <li><a href="sasl/faqs/rfcs.html#index-7">RFC 5802</a>
</li>
        <li><a href="sasl/faqs/rfcs.html#index-11">RFC 6331</a>
</li>
        <li><a href="sasl/faqs/rfcs.html#index-1">RFC 7613</a>
</li>
      </ul></li>
  </ul></td>
</tr></table>

<h2 id="S">S</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
  <td style="width: 33%; vertical-align: top;"><ul>
      <li><a href="sasl/reference/manpages/library/sasl.html#std:saslman-sasl(3)">sasl(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_authorize_t.html#std:saslman-sasl_authorize_t(3)">sasl_authorize_t(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop.html#std:saslman-sasl_auxprop(3)">sasl_auxprop(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop_add_plugin.html#std:saslman-sasl_auxprop_add_plugin(3)">sasl_auxprop_add_plugin(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop_getctx.html#c.sasl_auxprop_getctx">sasl_auxprop_getctx (C function)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop_getctx.html#std:saslman-sasl_auxprop_getctx(3)">sasl_auxprop_getctx(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop_request.html#c.sasl_auxprop_request">sasl_auxprop_request (C function)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop_request.html#std:saslman-sasl_auxprop_request(3)">sasl_auxprop_request(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_BADAUTH">SASL_BADAUTH (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_BADMAC">SASL_BADMAC (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_BADPARAM">SASL_BADPARAM (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_BADPROT">SASL_BADPROT (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_BADSERV">SASL_BADSERV (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_BADVERS">SASL_BADVERS (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_BUFOVER">SASL_BUFOVER (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_callbacks.html#std:saslman-sasl_callbacks(3)">sasl_callbacks(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_canon_user_t.html#std:saslman-sasl_canon_user_t(3)">sasl_canon_user_t(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_canonuser_add_plugin.html#std:saslman-sasl_canonuser_add_plugin(3)">sasl_canonuser_add_plugin(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_chalprompt_t.html#std:saslman-sasl_chalprompt_t(3)">sasl_chalprompt_t(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_checkapop.html#std:saslman-sasl_checkapop(3)">sasl_checkapop(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_checkpass.html#std:saslman-sasl_checkpass(3)">sasl_checkpass(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_client_add_plugin.html#std:saslman-sasl_client_add_plugin(3)">sasl_client_add_plugin(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_client_done.html#std:saslman-sasl_client_done(3)">sasl_client_done(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_client_init.html#std:saslman-sasl_client_init(3)">sasl_client_init(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_client_new.html#std:saslman-sasl_client_new(3)">sasl_client_new(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_client_plug_init_t.html#std:saslman-sasl_client_plug_init_t(3)">sasl_client_plug_init_t(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_client_start.html#std:saslman-sasl_client_start(3)">sasl_client_start(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_client_step.html#std:saslman-sasl_client_step(3)">sasl_client_step(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_auxprop_getctx.html#c.sasl_conn_t">sasl_conn_t (C type)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_CONTINUE">SASL_CONTINUE (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_decode.html#std:saslman-sasl_decode(3)">sasl_decode(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_decode64.html#std:saslman-sasl_decode64(3)">sasl_decode64(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_DISABLED">SASL_DISABLED (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_dispose.html#std:saslman-sasl_dispose(3)">sasl_dispose(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_done.html#std:saslman-sasl_done(3)">sasl_done(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_encode.html#std:saslman-sasl_encode(3)">sasl_encode(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_encode64.html#std:saslman-sasl_encode64(3)">sasl_encode64(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_encodev.html#std:saslman-sasl_encodev(3)">sasl_encodev(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_ENCRYPT">SASL_ENCRYPT (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_erasebuffer.html#std:saslman-sasl_erasebuffer(3)">sasl_erasebuffer(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errdetail.html#std:saslman-sasl_errdetail(3)">sasl_errdetail(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#std:saslman-sasl_errors(3)">sasl_errors(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errstring.html#std:saslman-sasl_errstring(3)">sasl_errstring(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_EXPIRED">SASL_EXPIRED (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_FAIL">SASL_FAIL (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_getcallback_t.html#std:saslman-sasl_getcallback_t(3)">sasl_getcallback_t(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_getconfpath_t.html#std:saslman-sasl_getconfpath_t(3)">sasl_getconfpath_t(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_getopt_t.html#std:saslman-sasl_getopt_t(3)">sasl_getopt_t(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_getpath_t.html#std:saslman-sasl_getpath_t(3)">sasl_getpath_t(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_getprop.html#std:saslman-sasl_getprop(3)">sasl_getprop(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_getrealm_t.html#std:saslman-sasl_getrealm_t(3)">sasl_getrealm_t(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_getsecret_t.html#std:saslman-sasl_getsecret_t(3)">sasl_getsecret_t(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_getsimple_t.html#std:saslman-sasl_getsimple_t(3)">sasl_getsimple_t(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_global_listmech.html#std:saslman-sasl_global_listmech(3)">sasl_global_listmech(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_idle.html#c.sasl_idle">sasl_idle (C function)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_idle.html#std:saslman-sasl_idle(3)">sasl_idle(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_INTERACT">SASL_INTERACT (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_listmech.html#std:saslman-sasl_listmech(3)">sasl_listmech(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_log_t.html#std:saslman-sasl_log_t(3)">sasl_log_t(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_NOAUTHZ">SASL_NOAUTHZ (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_NOCHANGE">SASL_NOCHANGE (C macro)</a>
</li>
  </ul></td>
  <td style="width: 33%; vertical-align: top;"><ul>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_NOMECH">SASL_NOMECH (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_NOMEM">SASL_NOMEM (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_NOTDONE">SASL_NOTDONE (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_NOTINIT">SASL_NOTINIT (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_NOUSER">SASL_NOUSER (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_NOUSERPASS">SASL_NOUSERPASS (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_NOVERIFY">SASL_NOVERIFY (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_OK">SASL_OK (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_PWLOCK">SASL_PWLOCK (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_server_add_plugin.html#std:saslman-sasl_server_add_plugin(3)">sasl_server_add_plugin(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_server_done.html#std:saslman-sasl_server_done(3)">sasl_server_done(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_server_init.html#std:saslman-sasl_server_init(3)">sasl_server_init(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_server_new.html#std:saslman-sasl_server_new(3)">sasl_server_new(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_server_plug_init_t.html#std:saslman-sasl_server_plug_init_t(3)">sasl_server_plug_init_t(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_server_start.html#std:saslman-sasl_server_start(3)">sasl_server_start(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_server_step.html#std:saslman-sasl_server_step(3)">sasl_server_step(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_server_userdb_checkpass_t.html#std:saslman-sasl_server_userdb_checkpass_t(3)">sasl_server_userdb_checkpass_t(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_server_userdb_setpass_t.html#std:saslman-sasl_server_userdb_setpass_t(3)">sasl_server_userdb_setpass_t(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_set_alloc.html#std:saslman-sasl_set_alloc(3)">sasl_set_alloc(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_set_mutex.html#std:saslman-sasl_set_mutex(3)">sasl_set_mutex(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_seterror.html#std:saslman-sasl_seterror(3)">sasl_seterror(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_setpass.html#std:saslman-sasl_setpass(3)">sasl_setpass(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_setprop.html#std:saslman-sasl_setprop(3)">sasl_setprop(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_TOOWEAK">SASL_TOOWEAK (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_TRANS">SASL_TRANS (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_TRYAGAIN">SASL_TRYAGAIN (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_user_exists.html#std:saslman-sasl_user_exists(3)">sasl_user_exists(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_usererr.html#c.sasl_usererr">sasl_usererr (C function)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_usererr.html#std:saslman-sasl_usererr(3)">sasl_usererr(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_utf8verify.html#std:saslman-sasl_utf8verify(3)">sasl_utf8verify(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_verifyfile_t.html#std:saslman-sasl_verifyfile_t(3)">sasl_verifyfile_t(3)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_WEAKPASS">SASL_WEAKPASS (C macro)</a>
</li>
      <li><a href="sasl/reference/manpages/library/sasl_errors.html#c.SASL_WRONGMECH">SASL_WRONGMECH (C macro)</a>
</li>
      <li>
    saslauthd_path [&lt;path&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-saslauthd-path">command line option</a>
</li>
      </ul></li>
      <li>
    sasldb_mapsize [&lt;size in bytes&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-sasldb-mapsize">command line option</a>
</li>
      </ul></li>
      <li>
    sasldb_maxreaders [&lt;max threads&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-sasldb-maxreaders">command line option</a>
</li>
      </ul></li>
      <li>
    sasldb_path [&lt;path to sasldb file&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-sasldb-path">command line option</a>
</li>
      </ul></li>
      <li>
    sql_database &lt;database name&gt;

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-sql-database">command line option</a>
</li>
      </ul></li>
      <li>
    sql_engine [&lt;name&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-sql-engine">command line option</a>
</li>
      </ul></li>
      <li>
    sql_hostnames [&lt;list of SQL servers&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-sql-hostnames">command line option</a>
</li>
      </ul></li>
      <li>
    sql_insert &lt;statement&gt;

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-sql-insert">command line option</a>
</li>
      </ul></li>
      <li>
    sql_passwd &lt;password&gt;

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-sql-passwd">command line option</a>
</li>
      </ul></li>
      <li>
    sql_select &lt;statement&gt;

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-sql-select">command line option</a>
</li>
      </ul></li>
      <li>
    sql_update &lt;statement&gt;

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-sql-update">command line option</a>
</li>
      </ul></li>
      <li>
    sql_user &lt;username&gt;

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-sql-user">command line option</a>
</li>
      </ul></li>
      <li>
    srp_mda [md5 | sha1 | rmd160]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-srp-mda">command line option</a>
</li>
      </ul></li>
      <li>
    srvtab [&lt;path&gt;]

      <ul>
        <li><a href="sasl/options.html#cmdoption-arg-srvtab">command line option</a>
</li>
      </ul></li>
  </ul></td>
</tr></table>



          </div>
          <footer>
  

  <hr/>

  <div role="contentinfo">
    <p>
        &copy; Copyright 1993-2016, The Cyrus Team.
    </p>
  </div>
  Built with <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6 using a modified <a href="https://readthedocs.org">Read the Docs</a> <a href="https://github.com/snide/sphinx_rtd_theme">theme</a>.

</footer>

        </div>
      </div>

    </section>

  </div>
  


  

    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'./',
            VERSION:'2.1.27',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'.html',
            HAS_SOURCE:  true
        };
    </script>
      <script type="text/javascript" src="_static/jquery.js"></script>
      <script type="text/javascript" src="_static/underscore.js"></script>
      <script type="text/javascript" src="_static/doctools.js"></script>
      <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>

  

  
  
    <script type="text/javascript" src="_static/js/theme.js"></script>
  

  
  
  <script type="text/javascript">
<!--      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      }); -->
  </script>
  
 



</body>
</html>PK�*[H{���doc/alt-cyrus-sasl-lib/AUTHORSnu�[���Rob Siemborski <rjs3+@andrew.cmu.edu> wrote and tested the conversion
to the SASLv2 API.

Ken Murchison <murch@andrew.cmu.edu> worked on the OTP, NTLM, SRP and SQL
plugins, as well as helping to track down bugs as they appear. He also
added support for HTTP authentication.

Rob Earhart <earhart@cmu.edu> wrote the build/installation procedure,
wrote and tested some of the code, and provided general guidance and
coding advice.

Leif Johansson <leifj@matematik.su.se> wrote the GSSAPI plugin, with
contributions from Sam Hartman <hartmans@fundsxpress.com>.

Leandro Santi <lesanti@sinectis.com.ar> added Courier authdaemon support.

Alexey Melnikov <alexey.melnikov@isode.com> wrote the first pass of the
DIGEST-MD5 plugin and continues to work on it.  He also wrote
a good deal of the current Windows support.

Rainer Schoepf <schoepf@uni-mainz.de> contributed the LOGIN plugin,
based on Tim Martin's PLAIN plugin.

Simon Loader <simon@surf.org.uk> wrote the MySQL auxprop module.

Rolf Braun <rbraun@andrew.cmu.edu> wrote the MacOS ports.

Howard Chu <hyc@highlandsun.com> put a good deal of work into OS/390
portability, correct building of static libraries, and a slew
of misc. bugfixes.

Tim Martin <tmartin@andrew.cmu.edu> wrote, debugged, and tested
most of the SASLv1 code.

Larry Greenfield <leg+sasl@andrew.cmu.edu> complained. a lot.

Chris Newman <chris.newman@oracle.com> wrote the initial version of the
SASL API, as well as the version 2 SASL API (documented in sasl.h,
saslutil.h, saslplug.h, and prop.h).

Ryan Troll <ryan@andrew.cmu.edu> started the Windows port,
and both Larry Greenfield and Alexey Melnikov have done more work on it.

getaddrinfo.c was written by Hajimu UMEMOTO <ume@mahoroba.org>
which is based on the IPv6 code written by KIKUCHI Takahiro
<kick@kyoto.wide.ad.jp>

Igor Brezac <igor@ipass.net> has done a good deal of work on the saslauthd
LDAP module.

Jeremy Rumpf <jrumpf@heavyload.net> implemented the credential cache, unified
the different IPC methods under a common framework.

Fabian Knittel <fknittel@gmx.de> wrote auth_pam plugin, based on
Debian's pwcheck_pam daemon by Michael-John Turner <mj@debian.org>.

saslauthd was originally contributed by Lyndon Nerenberg on
behalf of MessagingDirect Ltd.
PK�*[c����!doc/alt-cyrus-sasl-lib/setup.htmlnu�[���

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>Setup &mdash; Cyrus SASL 2.1.27 documentation</title>
  

  
  
    <link rel="shortcut icon" href="_static/favicon.ico"/>
  

  

  
  
    

  

  
  
    <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
  

  
    <link rel="stylesheet" href="_static/cyrus.css" type="text/css" />
  

  
        <link rel="index" title="Index"
              href="genindex.html"/>
        <link rel="search" title="Search" href="search.html"/>
    <link rel="top" title="Cyrus SASL 2.1.27 documentation" href="index.html"/>
        <link rel="next" title="Upgrading from v1 to v2" href="sasl/upgrading.html"/>
        <link rel="prev" title="Concepts" href="sasl/concepts.html"/> 

  
  
  

</head>

<body class="wy-body-for-nav" role="document">

  
  
<div class="pageheader">
  <ul>
    <li><a href="index.html">Home</a></li>
    <li><a href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
    <li><a href="download.html">Download</a></li>
    <li><a href="contribute.html">Contribute</a></li>
  </ul>
  <div>
    <a href="index.html">
      <img src="_static/logo.gif" alt="CYRUS SASL" />
    </a>
  </div>
</div>
<div style="clear: both;"></div>


  <div class="wy-grid-for-nav">

    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-nav-search">
        

        
 
          <a href="index.html">
 

  
          
          <img src="_static/logo.gif"  />
     
        </a>

        
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

        
      </div>

      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
        
          
          
              <p class="caption"><span class="caption-text">Cyrus SASL</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="download.html">Download</a><ul>
<li class="toctree-l2"><a class="reference internal" href="getsasl.html">Get SASL</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/release-notes/index.html">Release Notes</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#supported-product-series">Supported Product Series</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-1">Series 2.1</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#older-versions">Older Versions</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-2-0">Series 2: 2.0</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-1">Series 1</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="packager.html">Note for Packagers</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/quickstart.html">Quickstart guide</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#features">Features</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#typical-installation">Typical Installation</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/concepts.html">Concepts</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl">SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl-authentication-mechanisms">SASL Authentication Mechanisms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#security-layers">Security Layers</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#channel-binding">Channel Binding</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#realms">Realms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#protocols">Protocols</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#cyrus-sasl">Cyrus SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#the-glue-library">The Glue Library</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#plugins">Plugins</a></li>
</ul>
</li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Setup</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#tarball-installation">Tarball installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#unix-package-installation">Unix package Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#requirements">Requirements</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#build-configuration">Build Configuration</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#building-and-installation">Building and Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#compilation-hints">Compilation Hints</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#application-configuration">Application Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/upgrading.html">Upgrading from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#backwards-compatibility">Backwards Compatibility</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#coexistence-with-saslv1">Coexistence with SASLv1</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#database-upgrades">Database Upgrades</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#errors-on-migration">Errors on migration</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/components.html">Components</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-application">The Application</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-sasl-glue-layer">The SASL Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#plugins">Plugins</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-general">Plugins: General</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-sasl-mechanisms">Plugins: SASL Mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-auxiliary-property">Plugins: Auxiliary Property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-username-canonicalization">Plugins: Username Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#password-verification-services">Password Verification Services</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html">Options</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasl-library">SASL Library</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#auxiliary-property-plugin">Auxiliary Property Plugin</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#gssapi">GSSAPI</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ldapdb">LDAPDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-ldapdb">Notes on LDAPDB</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#examples">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ntlm">NTLM</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#otp">OTP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#digest-md5">Digest-md5</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasldb">SASLDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sasldb-with-lmdb">Notes on sasldb with LMDB</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sql-plugin">SQL Plugin</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sql">Notes on SQL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#id2">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#srp">SRP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#kerberos-v4">Kerberos V4</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/advanced.html">Advanced Usage</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/advanced.html#notes-for-advanced-usage-of-libsasl">Notes for Advanced Usage of libsasl</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/advanced.html#using-cyrus-sasl-as-a-static-library">Using Cyrus SASL as a static library</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="operations.html">Operations</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/sysadmin.html">System Administrators</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#what-sasl-is">What SASL is</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#authentication-and-authorization-identifiers">Authentication and authorization identifiers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#realms">Realms</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-sasl-works">How SASL works</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-plain-mechanism-sasl-checkpass-and-plaintext-passwords">The PLAIN mechanism, <code class="docutils literal"><span class="pre">sasl_checkpass()</span></code>, and plaintext passwords</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#shared-secrets-mechanisms">Shared secrets mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#kerberos-mechanisms">Kerberos mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-otp-mechanism">The OTP mechanism</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-to-set-configuration-options">How to set configuration options</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-default-configuration-file">The default configuration file</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#application-configuration">Application configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#troubleshooting">Troubleshooting</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/manpages.html">Man pages</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/manpages.html#library-files">(3) Library Files</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl.html"><strong>SASL</strong> - SASL Authentication Library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_authorize_t.html"><strong>sasl_authorize_t</strong> - The SASL authorization callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop.html"><strong>sasl_auxprop</strong> - How to work with SASL auxiliary properties</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_add_plugin.html"><strong>sasl_auxprop_add_plugin</strong> - add a SASL auxiliary property plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_getctx.html"><strong>sasl_auxprop_getctx</strong> - Acquire an auxiliary property context</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_request.html"><strong>sasl_auxprop_request</strong> - Request auxiliary properties from SASL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_callbacks.html"><strong>sasl_callbacks</strong> - How to work with SASL callbacks</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canon_user_t.html"><strong>sasl_canon_user_t</strong> - Application-supplied user canonicalization function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canonuser_add_plugin.html"><strong>sasl_canonuser_add_plugin</strong> - add a SASL user canonicalization plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_chalprompt_t.html"><strong>sasl_chalprompt_t</strong> - Realm acquisition callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkapop.html"><strong>sasl_checkapop</strong> - Check an APOP challenge/response</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkpass.html"><strong>sasl_checkpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_add_plugin.html"><strong>sasl_client_add_plugin</strong> - add a SASL client plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_done.html"><strong>sasl_client_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_init.html"><strong>sasl_client_init</strong> - SASL client authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_new.html"><strong>sasl_client_new</strong> - Create a new client authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_plug_init_t.html"><strong>sasl_client_plug_init_t</strong> - client plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_start.html"><strong>sasl_client_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_step.html"><strong>sasl_client_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode.html"><strong>sasl_decode</strong> - Decode data received</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode64.html"><strong>sasl_decode64</strong> - Decode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_dispose.html"><strong>sasl_dispose</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_done.html"><strong>sasl_done</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode.html"><strong>sasl_encode</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode64.html"><strong>sasl_encode64</strong> - Encode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encodev.html"><strong>sasl_encodev</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_erasebuffer.html"><strong>sasl_erasebuffer</strong> - erase buffer</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errdetail.html"><strong>sasl_errdetail</strong> - Retrieve  detailed information about an error</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errors.html"><strong>sasl_errors</strong> - SASL error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errstring.html"><strong>sasl_errstring</strong> - Translate a SASL return code to a human-readable form</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getcallback_t.html"><strong>sasl_getcallback_t</strong> - callback function to lookup a sasl_callback_t for a connection</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getconfpath_t.html"><strong>sasl_getconfpath_t</strong> - The SASL callback to indicate location of the config files</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getopt_t.html"><strong>sasl_getopt_t</strong> - The SASL get option callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getpath_t.html"><strong>sasl_getpath_t</strong> - The SASL callback to indicate location of the mechanism drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getprop.html"><strong>sasl_getprop</strong> - Get a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getrealm_t.html"><strong>sasl_getrealm_t</strong> - Realm Acquisition Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsecret_t.html"><strong>sasl_getsecret_t</strong> - The SASL callback for secrets (passwords)</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsimple_t.html"><strong>sasl_getsimple_t</strong> - The SASL callback for username/authname/realm</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_global_listmech.html"><strong>sasl_global_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_idle.html"><strong>sasl_idle</strong> - Perform precalculations during an idle period</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_listmech.html"><strong>sasl_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_log_t.html"><strong>sasl_log_t</strong> - The SASL logging callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_add_plugin.html"><strong>sasl_server_add_plugin</strong> - add a SASL server plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_done.html"><strong>sasl_server_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_init.html"><strong>sasl_server_init</strong> - SASL server authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_new.html"><strong>sasl_server_new</strong> - Create a new server authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_plug_init_t.html"><strong>sasl_server_plug_init_t</strong> - server plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_start.html"><strong>sasl_server_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_step.html"><strong>sasl_server_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_checkpass_t.html"><strong>sasl_server_userdb_checkpass_t</strong> - Plaintext Password Verification Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_setpass_t.html"><strong>sasl_server_userdb_setpass_t</strong> - UserDB Plaintext Password Setting Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_alloc.html"><strong>sasl_set_alloc</strong> - set the memory allocation functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_mutex.html"><strong>sasl_set_mutex</strong> - set the mutex lock functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_seterror.html"><strong>sasl_seterror</strong> - set the error string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setpass.html"><strong>sasl_setpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setprop.html"><strong>sasl_setprop</strong> - Set a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_user_exists.html"><strong>sasl_user_exists</strong> - Check if a user exists on server</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_usererr.html"><strong>sasl_usererr</strong> - Remove information leak about accounts from sasl error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_utf8verify.html"><strong>sasl_utf8verify</strong> - Verify a string is valid utf8</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_verifyfile_t.html"><strong>sasl_verifyfile_t</strong> - The SASL file verification</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/auxiliary_properties.html">Auxiliary Properties</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#auxiliary-properties-and-the-glue-layer">Auxiliary Properties and the Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#passwords-and-other-data">Passwords and other Data</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sasldb">sasldb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#ldapdb">ldapdb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sql">sql</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#user-canonicalization">User Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/authentication_mechanisms.html">Authentication Mechanisms</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#mechanisms">Mechanisms</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#anonymous">ANONYMOUS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#cram-md5">CRAM-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#digest-md5">DIGEST-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#external">EXTERNAL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#g2">G2</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gssapi">GSSAPI</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gss-spegno">GSS-SPEGNO</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#kerberos-v4">KERBEROS_V4</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#login">LOGIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#ntlm">NTLM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#otp">OTP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#passdss">PASSDSS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#plain">PLAIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#scram">SCRAM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#srp">SRP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#non-sasl-authentication">Non-SASL Authentication</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#summary">Summary</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/pwcheck.html">Pwcheck</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop">Auxprop</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop-hashed">Auxprop-hashed</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#saslauthd">Saslauthd</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#authdaemon">Authdaemon</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#alwaystrue">Alwaystrue</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auto-transition">Auto Transition</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/faq.html">Frequently Asked Questions</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/authorize-vs-authenticate.html">What is the difference between an Authorization ID and a Authentication ID?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/crammd5-digestmd5.html">Why do CRAM-MD5 and DIGEST-MD5 not work with CyrusSaslauthd?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/openldap-sasl-gssapi.html">How do I configure OpenLDAP +SASL+GSSAPI?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/plaintextpasswords.html">Why does CyrusSasl store plaintext passwords in its databases?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/rfcs.html">RFCs and drafts</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/upgrade-saslv2.html">Why am I having a problem running dbconverter-2 to upgrade from SASLv1 to SASLv2?</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/resources.html">Other Documentation &amp; Resources</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="developer.html">Developers</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/appconvert.html">Converting Applications from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-both-clients-and-servers">Tips for both clients and servers</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-clients">Tips for clients</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-servers">Tips for Servers</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/programming.html">Application Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#background">Background</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-did-the-world-work-before-sasl">How did the world work before SASL?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sasl-to-the-rescue">SASL to the rescue!</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#briefly">Briefly</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-the-cyrus-sasl-library-good-for">What is the Cyrus SASL library good for?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-does-the-cyrus-sasl-library-do">What does the Cyrus SASL library do?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-doesn-t-the-cyrus-sasl-library-do">What doesn’t the Cyrus SASL library do?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#client-only-section">Client-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-client-s-perspective">A typical interaction from the client’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-does-this-look-in-code">How does this look in code</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#server-only-section">Server-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-server-s-perspective">A typical interaction from the server’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#id1">How does this look in code?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#callbacks-and-interactions">Callbacks and Interactions</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#security-layers">Security layers</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#example-applications-that-come-with-the-cyrus-sasl-library">Example applications that come with the Cyrus SASL library</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sample-client-and-sample-server"><cite>sample-client</cite> and <cite>sample-server</cite></a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#cyrus-imapd-v2-1-0-or-later">Cyrus imapd v2.1.0 or later</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#imtest-from-cyrus-2-1-0-or-later"><cite>imtest</cite>, from Cyrus 2.1.0 or later</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#miscellaneous-information">Miscellaneous Information</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#empty-exchanges">Empty exchanges</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#idle">Idle</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/plugprog.html">Plugin Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#overview-of-plugin-programming">Overview of Plugin Programming</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#use-of-sasl-utils-t">Use of sasl_utils_t</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#error-reporting">Error Reporting</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#memory-allocation">Memory Allocation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#client-send-first-server-send-last">Client Send First / Server Send Last</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#client-plugins">Client Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#server-plugins">Server Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#user-canonicalization-canon-user-plugins">User Canonicalization (canon_user) Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#auxiliary-property-auxprop-plugins">Auxiliary Property (auxprop) Plugins</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/testing.html">Testing</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#testing-the-cmu-sasl-library-with-the-included-sample-applications">Testing the CMU SASL Library with the included sample applications</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/testing.html#example">Example</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#running-the-testsuite-application">Running the Testsuite application</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="support.html">Support/Community</a></li>
</ul>
<p class="caption"><span class="caption-text">IMAP</span></p>
<ul>
<li class="toctree-l1"><a class="reference external" href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
</ul>

          
        
      </div>
      &nbsp;
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
        <a href="index.html">Cyrus SASL</a>
      </nav>


      
      <div class="wy-nav-content">
        <div class="rst-content">
          
          <div role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
      <li><a href="index.html">Docs v2.1.27</a> &raquo;</li>
      
    <li>Setup</li>
      <li class="wy-breadcrumbs-aside">
        
          
            <a href="https://github.com/cyrusimap/cyrus-sasl/blob/master/docsrc/setup.rst" class="fa fa-github"> Edit on GitHub</a>
          
        
      </li>
  </ul>
  <hr/>
</div>
          <div role="main" class="document">
            
  <div class="section" id="setup">
<h1>Setup<a class="headerlink" href="#setup" title="Permalink to this headline">¶</a></h1>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#tarball-installation">Tarball installation</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#unix-package-installation">Unix package Installation</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#requirements">Requirements</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#build-configuration">Build Configuration</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#building-and-installation">Building and Installation</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#compilation-hints">Compilation Hints</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#application-configuration">Application Configuration</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/upgrading.html">Upgrading from v1 to v2</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/upgrading.html#backwards-compatibility">Backwards Compatibility</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/upgrading.html#coexistence-with-saslv1">Coexistence with SASLv1</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/upgrading.html#database-upgrades">Database Upgrades</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/upgrading.html#errors-on-migration">Errors on migration</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/components.html">Components</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/components.html#the-application">The Application</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/components.html#the-sasl-glue-layer">The SASL Glue Layer</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/components.html#plugins">Plugins</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#plugins-general">Plugins: General</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#plugins-sasl-mechanisms">Plugins: SASL Mechanisms</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#plugins-auxiliary-property">Plugins: Auxiliary Property</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#plugins-username-canonicalization">Plugins: Username Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/components.html#password-verification-services">Password Verification Services</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/options.html">Options</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html#sasl-library">SASL Library</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html#auxiliary-property-plugin">Auxiliary Property Plugin</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html#gssapi">GSSAPI</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html#ldapdb">LDAPDB</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#notes-on-ldapdb">Notes on LDAPDB</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#examples">Examples</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html#ntlm">NTLM</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html#otp">OTP</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html#digest-md5">Digest-md5</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html#sasldb">SASLDB</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#notes-on-sasldb-with-lmdb">Notes on sasldb with LMDB</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html#sql-plugin">SQL Plugin</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#notes-on-sql">Notes on SQL</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#id2">Examples</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html#srp">SRP</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html#kerberos-v4">Kerberos V4</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/advanced.html">Advanced Usage</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/advanced.html#notes-for-advanced-usage-of-libsasl">Notes for Advanced Usage of libsasl</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/advanced.html#using-cyrus-sasl-as-a-static-library">Using Cyrus SASL as a static library</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>


          </div>
          <footer>
  
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      
        <a href="sasl/upgrading.html" class="btn btn-neutral float-right" title="Upgrading from v1 to v2" accesskey="n">Next <span class="fa fa-arrow-circle-right"></span></a>
      
      
        <a href="sasl/concepts.html" class="btn btn-neutral" title="Concepts" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous</a>
      
    </div>
  

  <hr/>

  <div role="contentinfo">
    <p>
        &copy; Copyright 1993-2016, The Cyrus Team.
    </p>
  </div>
  Built with <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6 using a modified <a href="https://readthedocs.org">Read the Docs</a> <a href="https://github.com/snide/sphinx_rtd_theme">theme</a>.

</footer>

        </div>
      </div>

    </section>

  </div>
  


  

    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'./',
            VERSION:'2.1.27',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'.html',
            HAS_SOURCE:  true
        };
    </script>
      <script type="text/javascript" src="_static/jquery.js"></script>
      <script type="text/javascript" src="_static/underscore.js"></script>
      <script type="text/javascript" src="_static/doctools.js"></script>
      <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>

  

  
  
    <script type="text/javascript" src="_static/js/theme.js"></script>
  

  
  
  <script type="text/javascript">
<!--      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      }); -->
  </script>
  
 



</body>
</html>PK�*[ �r�r�&doc/alt-cyrus-sasl-lib/operations.htmlnu�[���

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>Operations &mdash; Cyrus SASL 2.1.27 documentation</title>
  

  
  
    <link rel="shortcut icon" href="_static/favicon.ico"/>
  

  

  
  
    

  

  
  
    <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
  

  
    <link rel="stylesheet" href="_static/cyrus.css" type="text/css" />
  

  
        <link rel="index" title="Index"
              href="genindex.html"/>
        <link rel="search" title="Search" href="search.html"/>
    <link rel="top" title="Cyrus SASL 2.1.27 documentation" href="index.html"/>
        <link rel="next" title="System Administrators" href="sasl/sysadmin.html"/>
        <link rel="prev" title="Advanced Usage" href="sasl/advanced.html"/> 

  
  
  

</head>

<body class="wy-body-for-nav" role="document">

  
  
<div class="pageheader">
  <ul>
    <li><a href="index.html">Home</a></li>
    <li><a href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
    <li><a href="download.html">Download</a></li>
    <li><a href="contribute.html">Contribute</a></li>
  </ul>
  <div>
    <a href="index.html">
      <img src="_static/logo.gif" alt="CYRUS SASL" />
    </a>
  </div>
</div>
<div style="clear: both;"></div>


  <div class="wy-grid-for-nav">

    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-nav-search">
        

        
 
          <a href="index.html">
 

  
          
          <img src="_static/logo.gif"  />
     
        </a>

        
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

        
      </div>

      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
        
          
          
              <p class="caption"><span class="caption-text">Cyrus SASL</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="download.html">Download</a><ul>
<li class="toctree-l2"><a class="reference internal" href="getsasl.html">Get SASL</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/release-notes/index.html">Release Notes</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#supported-product-series">Supported Product Series</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-1">Series 2.1</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#older-versions">Older Versions</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-2-0">Series 2: 2.0</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-1">Series 1</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="packager.html">Note for Packagers</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/quickstart.html">Quickstart guide</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#features">Features</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#typical-installation">Typical Installation</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/concepts.html">Concepts</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl">SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl-authentication-mechanisms">SASL Authentication Mechanisms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#security-layers">Security Layers</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#channel-binding">Channel Binding</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#realms">Realms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#protocols">Protocols</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#cyrus-sasl">Cyrus SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#the-glue-library">The Glue Library</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#plugins">Plugins</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="setup.html">Setup</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#tarball-installation">Tarball installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#unix-package-installation">Unix package Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#requirements">Requirements</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#build-configuration">Build Configuration</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#building-and-installation">Building and Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#compilation-hints">Compilation Hints</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#application-configuration">Application Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/upgrading.html">Upgrading from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#backwards-compatibility">Backwards Compatibility</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#coexistence-with-saslv1">Coexistence with SASLv1</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#database-upgrades">Database Upgrades</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#errors-on-migration">Errors on migration</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/components.html">Components</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-application">The Application</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-sasl-glue-layer">The SASL Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#plugins">Plugins</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-general">Plugins: General</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-sasl-mechanisms">Plugins: SASL Mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-auxiliary-property">Plugins: Auxiliary Property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-username-canonicalization">Plugins: Username Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#password-verification-services">Password Verification Services</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html">Options</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasl-library">SASL Library</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#auxiliary-property-plugin">Auxiliary Property Plugin</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#gssapi">GSSAPI</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ldapdb">LDAPDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-ldapdb">Notes on LDAPDB</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#examples">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ntlm">NTLM</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#otp">OTP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#digest-md5">Digest-md5</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasldb">SASLDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sasldb-with-lmdb">Notes on sasldb with LMDB</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sql-plugin">SQL Plugin</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sql">Notes on SQL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#id2">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#srp">SRP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#kerberos-v4">Kerberos V4</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/advanced.html">Advanced Usage</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/advanced.html#notes-for-advanced-usage-of-libsasl">Notes for Advanced Usage of libsasl</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/advanced.html#using-cyrus-sasl-as-a-static-library">Using Cyrus SASL as a static library</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Operations</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/sysadmin.html">System Administrators</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#what-sasl-is">What SASL is</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#authentication-and-authorization-identifiers">Authentication and authorization identifiers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#realms">Realms</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-sasl-works">How SASL works</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-plain-mechanism-sasl-checkpass-and-plaintext-passwords">The PLAIN mechanism, <code class="docutils literal"><span class="pre">sasl_checkpass()</span></code>, and plaintext passwords</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#shared-secrets-mechanisms">Shared secrets mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#kerberos-mechanisms">Kerberos mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-otp-mechanism">The OTP mechanism</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-to-set-configuration-options">How to set configuration options</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-default-configuration-file">The default configuration file</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#application-configuration">Application configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#troubleshooting">Troubleshooting</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/manpages.html">Man pages</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/manpages.html#library-files">(3) Library Files</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl.html"><strong>SASL</strong> - SASL Authentication Library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_authorize_t.html"><strong>sasl_authorize_t</strong> - The SASL authorization callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop.html"><strong>sasl_auxprop</strong> - How to work with SASL auxiliary properties</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_add_plugin.html"><strong>sasl_auxprop_add_plugin</strong> - add a SASL auxiliary property plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_getctx.html"><strong>sasl_auxprop_getctx</strong> - Acquire an auxiliary property context</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_request.html"><strong>sasl_auxprop_request</strong> - Request auxiliary properties from SASL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_callbacks.html"><strong>sasl_callbacks</strong> - How to work with SASL callbacks</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canon_user_t.html"><strong>sasl_canon_user_t</strong> - Application-supplied user canonicalization function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canonuser_add_plugin.html"><strong>sasl_canonuser_add_plugin</strong> - add a SASL user canonicalization plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_chalprompt_t.html"><strong>sasl_chalprompt_t</strong> - Realm acquisition callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkapop.html"><strong>sasl_checkapop</strong> - Check an APOP challenge/response</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkpass.html"><strong>sasl_checkpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_add_plugin.html"><strong>sasl_client_add_plugin</strong> - add a SASL client plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_done.html"><strong>sasl_client_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_init.html"><strong>sasl_client_init</strong> - SASL client authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_new.html"><strong>sasl_client_new</strong> - Create a new client authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_plug_init_t.html"><strong>sasl_client_plug_init_t</strong> - client plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_start.html"><strong>sasl_client_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_step.html"><strong>sasl_client_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode.html"><strong>sasl_decode</strong> - Decode data received</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode64.html"><strong>sasl_decode64</strong> - Decode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_dispose.html"><strong>sasl_dispose</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_done.html"><strong>sasl_done</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode.html"><strong>sasl_encode</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode64.html"><strong>sasl_encode64</strong> - Encode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encodev.html"><strong>sasl_encodev</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_erasebuffer.html"><strong>sasl_erasebuffer</strong> - erase buffer</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errdetail.html"><strong>sasl_errdetail</strong> - Retrieve  detailed information about an error</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errors.html"><strong>sasl_errors</strong> - SASL error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errstring.html"><strong>sasl_errstring</strong> - Translate a SASL return code to a human-readable form</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getcallback_t.html"><strong>sasl_getcallback_t</strong> - callback function to lookup a sasl_callback_t for a connection</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getconfpath_t.html"><strong>sasl_getconfpath_t</strong> - The SASL callback to indicate location of the config files</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getopt_t.html"><strong>sasl_getopt_t</strong> - The SASL get option callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getpath_t.html"><strong>sasl_getpath_t</strong> - The SASL callback to indicate location of the mechanism drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getprop.html"><strong>sasl_getprop</strong> - Get a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getrealm_t.html"><strong>sasl_getrealm_t</strong> - Realm Acquisition Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsecret_t.html"><strong>sasl_getsecret_t</strong> - The SASL callback for secrets (passwords)</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsimple_t.html"><strong>sasl_getsimple_t</strong> - The SASL callback for username/authname/realm</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_global_listmech.html"><strong>sasl_global_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_idle.html"><strong>sasl_idle</strong> - Perform precalculations during an idle period</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_listmech.html"><strong>sasl_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_log_t.html"><strong>sasl_log_t</strong> - The SASL logging callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_add_plugin.html"><strong>sasl_server_add_plugin</strong> - add a SASL server plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_done.html"><strong>sasl_server_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_init.html"><strong>sasl_server_init</strong> - SASL server authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_new.html"><strong>sasl_server_new</strong> - Create a new server authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_plug_init_t.html"><strong>sasl_server_plug_init_t</strong> - server plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_start.html"><strong>sasl_server_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_step.html"><strong>sasl_server_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_checkpass_t.html"><strong>sasl_server_userdb_checkpass_t</strong> - Plaintext Password Verification Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_setpass_t.html"><strong>sasl_server_userdb_setpass_t</strong> - UserDB Plaintext Password Setting Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_alloc.html"><strong>sasl_set_alloc</strong> - set the memory allocation functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_mutex.html"><strong>sasl_set_mutex</strong> - set the mutex lock functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_seterror.html"><strong>sasl_seterror</strong> - set the error string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setpass.html"><strong>sasl_setpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setprop.html"><strong>sasl_setprop</strong> - Set a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_user_exists.html"><strong>sasl_user_exists</strong> - Check if a user exists on server</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_usererr.html"><strong>sasl_usererr</strong> - Remove information leak about accounts from sasl error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_utf8verify.html"><strong>sasl_utf8verify</strong> - Verify a string is valid utf8</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_verifyfile_t.html"><strong>sasl_verifyfile_t</strong> - The SASL file verification</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/auxiliary_properties.html">Auxiliary Properties</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#auxiliary-properties-and-the-glue-layer">Auxiliary Properties and the Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#passwords-and-other-data">Passwords and other Data</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sasldb">sasldb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#ldapdb">ldapdb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sql">sql</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#user-canonicalization">User Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/authentication_mechanisms.html">Authentication Mechanisms</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#mechanisms">Mechanisms</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#anonymous">ANONYMOUS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#cram-md5">CRAM-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#digest-md5">DIGEST-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#external">EXTERNAL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#g2">G2</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gssapi">GSSAPI</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gss-spegno">GSS-SPEGNO</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#kerberos-v4">KERBEROS_V4</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#login">LOGIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#ntlm">NTLM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#otp">OTP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#passdss">PASSDSS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#plain">PLAIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#scram">SCRAM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#srp">SRP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#non-sasl-authentication">Non-SASL Authentication</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#summary">Summary</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/pwcheck.html">Pwcheck</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop">Auxprop</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop-hashed">Auxprop-hashed</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#saslauthd">Saslauthd</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#authdaemon">Authdaemon</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#alwaystrue">Alwaystrue</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auto-transition">Auto Transition</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/faq.html">Frequently Asked Questions</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/authorize-vs-authenticate.html">What is the difference between an Authorization ID and a Authentication ID?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/crammd5-digestmd5.html">Why do CRAM-MD5 and DIGEST-MD5 not work with CyrusSaslauthd?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/openldap-sasl-gssapi.html">How do I configure OpenLDAP +SASL+GSSAPI?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/plaintextpasswords.html">Why does CyrusSasl store plaintext passwords in its databases?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/rfcs.html">RFCs and drafts</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/upgrade-saslv2.html">Why am I having a problem running dbconverter-2 to upgrade from SASLv1 to SASLv2?</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/resources.html">Other Documentation &amp; Resources</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="developer.html">Developers</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/appconvert.html">Converting Applications from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-both-clients-and-servers">Tips for both clients and servers</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-clients">Tips for clients</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-servers">Tips for Servers</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/programming.html">Application Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#background">Background</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-did-the-world-work-before-sasl">How did the world work before SASL?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sasl-to-the-rescue">SASL to the rescue!</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#briefly">Briefly</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-the-cyrus-sasl-library-good-for">What is the Cyrus SASL library good for?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-does-the-cyrus-sasl-library-do">What does the Cyrus SASL library do?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-doesn-t-the-cyrus-sasl-library-do">What doesn’t the Cyrus SASL library do?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#client-only-section">Client-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-client-s-perspective">A typical interaction from the client’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-does-this-look-in-code">How does this look in code</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#server-only-section">Server-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-server-s-perspective">A typical interaction from the server’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#id1">How does this look in code?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#callbacks-and-interactions">Callbacks and Interactions</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#security-layers">Security layers</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#example-applications-that-come-with-the-cyrus-sasl-library">Example applications that come with the Cyrus SASL library</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sample-client-and-sample-server"><cite>sample-client</cite> and <cite>sample-server</cite></a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#cyrus-imapd-v2-1-0-or-later">Cyrus imapd v2.1.0 or later</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#imtest-from-cyrus-2-1-0-or-later"><cite>imtest</cite>, from Cyrus 2.1.0 or later</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#miscellaneous-information">Miscellaneous Information</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#empty-exchanges">Empty exchanges</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#idle">Idle</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/plugprog.html">Plugin Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#overview-of-plugin-programming">Overview of Plugin Programming</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#use-of-sasl-utils-t">Use of sasl_utils_t</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#error-reporting">Error Reporting</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#memory-allocation">Memory Allocation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#client-send-first-server-send-last">Client Send First / Server Send Last</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#client-plugins">Client Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#server-plugins">Server Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#user-canonicalization-canon-user-plugins">User Canonicalization (canon_user) Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#auxiliary-property-auxprop-plugins">Auxiliary Property (auxprop) Plugins</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/testing.html">Testing</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#testing-the-cmu-sasl-library-with-the-included-sample-applications">Testing the CMU SASL Library with the included sample applications</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/testing.html#example">Example</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#running-the-testsuite-application">Running the Testsuite application</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="support.html">Support/Community</a></li>
</ul>
<p class="caption"><span class="caption-text">IMAP</span></p>
<ul>
<li class="toctree-l1"><a class="reference external" href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
</ul>

          
        
      </div>
      &nbsp;
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
        <a href="index.html">Cyrus SASL</a>
      </nav>


      
      <div class="wy-nav-content">
        <div class="rst-content">
          
          <div role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
      <li><a href="index.html">Docs v2.1.27</a> &raquo;</li>
      
    <li>Operations</li>
      <li class="wy-breadcrumbs-aside">
        
          
            <a href="https://github.com/cyrusimap/cyrus-sasl/blob/master/docsrc/operations.rst" class="fa fa-github"> Edit on GitHub</a>
          
        
      </li>
  </ul>
  <hr/>
</div>
          <div role="main" class="document">
            
  <div class="section" id="operations">
<h1>Operations<a class="headerlink" href="#operations" title="Permalink to this headline">¶</a></h1>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="sasl/sysadmin.html">System Administrators</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/sysadmin.html#what-sasl-is">What SASL is</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#authentication-and-authorization-identifiers">Authentication and authorization identifiers</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#realms">Realms</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/sysadmin.html#how-sasl-works">How SASL works</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#the-plain-mechanism-sasl-checkpass-and-plaintext-passwords">The PLAIN mechanism, <code class="docutils literal"><span class="pre">sasl_checkpass()</span></code>, and plaintext passwords</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#shared-secrets-mechanisms">Shared secrets mechanisms</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#kerberos-mechanisms">Kerberos mechanisms</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#the-otp-mechanism">The OTP mechanism</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/sysadmin.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/sysadmin.html#how-to-set-configuration-options">How to set configuration options</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#the-default-configuration-file">The default configuration file</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#application-configuration">Application configuration</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/sysadmin.html#troubleshooting">Troubleshooting</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/manpages.html">Man pages</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/manpages.html#library-files">(3) Library Files</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl.html"><strong>SASL</strong> - SASL Authentication Library</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_authorize_t.html"><strong>sasl_authorize_t</strong> - The SASL authorization callback</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop.html"><strong>sasl_auxprop</strong> - How to work with SASL auxiliary properties</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_add_plugin.html"><strong>sasl_auxprop_add_plugin</strong> - add a SASL auxiliary property plugin</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_getctx.html"><strong>sasl_auxprop_getctx</strong> - Acquire an auxiliary property context</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_request.html"><strong>sasl_auxprop_request</strong> - Request auxiliary properties from SASL</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_callbacks.html"><strong>sasl_callbacks</strong> - How to work with SASL callbacks</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canon_user_t.html"><strong>sasl_canon_user_t</strong> - Application-supplied user canonicalization function</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canonuser_add_plugin.html"><strong>sasl_canonuser_add_plugin</strong> - add a SASL user canonicalization plugin</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_chalprompt_t.html"><strong>sasl_chalprompt_t</strong> - Realm acquisition callback</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkapop.html"><strong>sasl_checkapop</strong> - Check an APOP challenge/response</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkpass.html"><strong>sasl_checkpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_add_plugin.html"><strong>sasl_client_add_plugin</strong> - add a SASL client plugin</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_done.html"><strong>sasl_client_done</strong> - Cleanup function</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_init.html"><strong>sasl_client_init</strong> - SASL client authentication initialization</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_new.html"><strong>sasl_client_new</strong> - Create a new client authentication object</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_plug_init_t.html"><strong>sasl_client_plug_init_t</strong> - client plug‐in entry point</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_start.html"><strong>sasl_client_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_step.html"><strong>sasl_client_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode.html"><strong>sasl_decode</strong> - Decode data received</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode64.html"><strong>sasl_decode64</strong> - Decode base64 string</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_dispose.html"><strong>sasl_dispose</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_done.html"><strong>sasl_done</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode.html"><strong>sasl_encode</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode64.html"><strong>sasl_encode64</strong> - Encode base64 string</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encodev.html"><strong>sasl_encodev</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_erasebuffer.html"><strong>sasl_erasebuffer</strong> - erase buffer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errdetail.html"><strong>sasl_errdetail</strong> - Retrieve  detailed information about an error</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errors.html"><strong>sasl_errors</strong> - SASL error codes</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errstring.html"><strong>sasl_errstring</strong> - Translate a SASL return code to a human-readable form</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getcallback_t.html"><strong>sasl_getcallback_t</strong> - callback function to lookup a sasl_callback_t for a connection</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getconfpath_t.html"><strong>sasl_getconfpath_t</strong> - The SASL callback to indicate location of the config files</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getopt_t.html"><strong>sasl_getopt_t</strong> - The SASL get option callback</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getpath_t.html"><strong>sasl_getpath_t</strong> - The SASL callback to indicate location of the mechanism drivers</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getprop.html"><strong>sasl_getprop</strong> - Get a SASL property</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getrealm_t.html"><strong>sasl_getrealm_t</strong> - Realm Acquisition Callback</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsecret_t.html"><strong>sasl_getsecret_t</strong> - The SASL callback for secrets (passwords)</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsimple_t.html"><strong>sasl_getsimple_t</strong> - The SASL callback for username/authname/realm</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_global_listmech.html"><strong>sasl_global_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_idle.html"><strong>sasl_idle</strong> - Perform precalculations during an idle period</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_listmech.html"><strong>sasl_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_log_t.html"><strong>sasl_log_t</strong> - The SASL logging callback</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_add_plugin.html"><strong>sasl_server_add_plugin</strong> - add a SASL server plugin</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_done.html"><strong>sasl_server_done</strong> - Cleanup function</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_init.html"><strong>sasl_server_init</strong> - SASL server authentication initialization</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_new.html"><strong>sasl_server_new</strong> - Create a new server authentication object</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_plug_init_t.html"><strong>sasl_server_plug_init_t</strong> - server plug‐in entry point</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_start.html"><strong>sasl_server_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_step.html"><strong>sasl_server_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_checkpass_t.html"><strong>sasl_server_userdb_checkpass_t</strong> - Plaintext Password Verification Callback</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_setpass_t.html"><strong>sasl_server_userdb_setpass_t</strong> - UserDB Plaintext Password Setting Callback</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_alloc.html"><strong>sasl_set_alloc</strong> - set the memory allocation functions used by the SASL library</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_mutex.html"><strong>sasl_set_mutex</strong> - set the mutex lock functions used by the SASL library</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_seterror.html"><strong>sasl_seterror</strong> - set the error string</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setpass.html"><strong>sasl_setpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setprop.html"><strong>sasl_setprop</strong> - Set a SASL property</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_user_exists.html"><strong>sasl_user_exists</strong> - Check if a user exists on server</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_usererr.html"><strong>sasl_usererr</strong> - Remove information leak about accounts from sasl error codes</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_utf8verify.html"><strong>sasl_utf8verify</strong> - Verify a string is valid utf8</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/reference/manpages/library/sasl_verifyfile_t.html"><strong>sasl_verifyfile_t</strong> - The SASL file verification</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/auxiliary_properties.html">Auxiliary Properties</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/auxiliary_properties.html#auxiliary-properties-and-the-glue-layer">Auxiliary Properties and the Glue Layer</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/auxiliary_properties.html#passwords-and-other-data">Passwords and other Data</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/auxiliary_properties.html#sasldb">sasldb</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/auxiliary_properties.html#ldapdb">ldapdb</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/auxiliary_properties.html#sql">sql</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/auxiliary_properties.html#user-canonicalization">User Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/authentication_mechanisms.html">Authentication Mechanisms</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/authentication_mechanisms.html#mechanisms">Mechanisms</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#anonymous">ANONYMOUS</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#cram-md5">CRAM-MD5</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#digest-md5">DIGEST-MD5</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#external">EXTERNAL</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#g2">G2</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#gssapi">GSSAPI</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#gss-spegno">GSS-SPEGNO</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#kerberos-v4">KERBEROS_V4</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#login">LOGIN</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#ntlm">NTLM</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#otp">OTP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#passdss">PASSDSS</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#plain">PLAIN</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#scram">SCRAM</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#srp">SRP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#non-sasl-authentication">Non-SASL Authentication</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/authentication_mechanisms.html#summary">Summary</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/pwcheck.html">Pwcheck</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/pwcheck.html#auxprop">Auxprop</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/pwcheck.html#auxprop-hashed">Auxprop-hashed</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/pwcheck.html#saslauthd">Saslauthd</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/pwcheck.html#authdaemon">Authdaemon</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/pwcheck.html#alwaystrue">Alwaystrue</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/pwcheck.html#auto-transition">Auto Transition</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/faq.html">Frequently Asked Questions</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/faqs/authorize-vs-authenticate.html">What is the difference between an Authorization ID and a Authentication ID?</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/faqs/crammd5-digestmd5.html">Why do CRAM-MD5 and DIGEST-MD5 not work with CyrusSaslauthd?</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/faqs/openldap-sasl-gssapi.html">How do I configure OpenLDAP +SASL+GSSAPI?</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/faqs/plaintextpasswords.html">Why does CyrusSasl store plaintext passwords in its databases?</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/faqs/rfcs.html">RFCs and drafts</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/faqs/upgrade-saslv2.html">Why am I having a problem running dbconverter-2 to upgrade from SASLv1 to SASLv2?</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/resources.html">Other Documentation &amp; Resources</a></li>
</ul>
</div>
</div>


          </div>
          <footer>
  
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      
        <a href="sasl/sysadmin.html" class="btn btn-neutral float-right" title="System Administrators" accesskey="n">Next <span class="fa fa-arrow-circle-right"></span></a>
      
      
        <a href="sasl/advanced.html" class="btn btn-neutral" title="Advanced Usage" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous</a>
      
    </div>
  

  <hr/>

  <div role="contentinfo">
    <p>
        &copy; Copyright 1993-2016, The Cyrus Team.
    </p>
  </div>
  Built with <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6 using a modified <a href="https://readthedocs.org">Read the Docs</a> <a href="https://github.com/snide/sphinx_rtd_theme">theme</a>.

</footer>

        </div>
      </div>

    </section>

  </div>
  


  

    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'./',
            VERSION:'2.1.27',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'.html',
            HAS_SOURCE:  true
        };
    </script>
      <script type="text/javascript" src="_static/jquery.js"></script>
      <script type="text/javascript" src="_static/underscore.js"></script>
      <script type="text/javascript" src="_static/doctools.js"></script>
      <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>

  

  
  
    <script type="text/javascript" src="_static/js/theme.js"></script>
  

  
  
  <script type="text/javascript">
<!--      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      }); -->
  </script>
  
 



</body>
</html>PK�*[K�6���$doc/alt-cyrus-sasl-lib/download.htmlnu�[���

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>Download &mdash; Cyrus SASL 2.1.27 documentation</title>
  

  
  
    <link rel="shortcut icon" href="_static/favicon.ico"/>
  

  

  
  
    

  

  
  
    <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
  

  
    <link rel="stylesheet" href="_static/cyrus.css" type="text/css" />
  

  
        <link rel="index" title="Index"
              href="genindex.html"/>
        <link rel="search" title="Search" href="search.html"/>
    <link rel="top" title="Cyrus SASL 2.1.27 documentation" href="index.html"/>
        <link rel="next" title="Get SASL" href="getsasl.html"/>
        <link rel="prev" title="Cyrus SASL" href="index.html"/> 

  
  
  

</head>

<body class="wy-body-for-nav" role="document">

  
  
<div class="pageheader">
  <ul>
    <li><a href="index.html">Home</a></li>
    <li><a href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
    <li><a href="#">Download</a></li>
    <li><a href="contribute.html">Contribute</a></li>
  </ul>
  <div>
    <a href="index.html">
      <img src="_static/logo.gif" alt="CYRUS SASL" />
    </a>
  </div>
</div>
<div style="clear: both;"></div>


  <div class="wy-grid-for-nav">

    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-nav-search">
        

        
 
          <a href="index.html">
 

  
          
          <img src="_static/logo.gif"  />
     
        </a>

        
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

        
      </div>

      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
        
          
          
              <p class="caption"><span class="caption-text">Cyrus SASL</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">Download</a><ul>
<li class="toctree-l2"><a class="reference internal" href="getsasl.html">Get SASL</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/release-notes/index.html">Release Notes</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#supported-product-series">Supported Product Series</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-1">Series 2.1</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#older-versions">Older Versions</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-2-0">Series 2: 2.0</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-1">Series 1</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="packager.html">Note for Packagers</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/quickstart.html">Quickstart guide</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#features">Features</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#typical-installation">Typical Installation</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/concepts.html">Concepts</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl">SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl-authentication-mechanisms">SASL Authentication Mechanisms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#security-layers">Security Layers</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#channel-binding">Channel Binding</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#realms">Realms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#protocols">Protocols</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#cyrus-sasl">Cyrus SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#the-glue-library">The Glue Library</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#plugins">Plugins</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="setup.html">Setup</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#tarball-installation">Tarball installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#unix-package-installation">Unix package Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#requirements">Requirements</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#build-configuration">Build Configuration</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#building-and-installation">Building and Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#compilation-hints">Compilation Hints</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#application-configuration">Application Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/upgrading.html">Upgrading from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#backwards-compatibility">Backwards Compatibility</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#coexistence-with-saslv1">Coexistence with SASLv1</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#database-upgrades">Database Upgrades</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#errors-on-migration">Errors on migration</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/components.html">Components</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-application">The Application</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-sasl-glue-layer">The SASL Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#plugins">Plugins</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-general">Plugins: General</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-sasl-mechanisms">Plugins: SASL Mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-auxiliary-property">Plugins: Auxiliary Property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-username-canonicalization">Plugins: Username Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#password-verification-services">Password Verification Services</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html">Options</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasl-library">SASL Library</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#auxiliary-property-plugin">Auxiliary Property Plugin</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#gssapi">GSSAPI</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ldapdb">LDAPDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-ldapdb">Notes on LDAPDB</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#examples">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ntlm">NTLM</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#otp">OTP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#digest-md5">Digest-md5</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasldb">SASLDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sasldb-with-lmdb">Notes on sasldb with LMDB</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sql-plugin">SQL Plugin</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sql">Notes on SQL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#id2">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#srp">SRP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#kerberos-v4">Kerberos V4</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/advanced.html">Advanced Usage</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/advanced.html#notes-for-advanced-usage-of-libsasl">Notes for Advanced Usage of libsasl</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/advanced.html#using-cyrus-sasl-as-a-static-library">Using Cyrus SASL as a static library</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="operations.html">Operations</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/sysadmin.html">System Administrators</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#what-sasl-is">What SASL is</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#authentication-and-authorization-identifiers">Authentication and authorization identifiers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#realms">Realms</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-sasl-works">How SASL works</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-plain-mechanism-sasl-checkpass-and-plaintext-passwords">The PLAIN mechanism, <code class="docutils literal"><span class="pre">sasl_checkpass()</span></code>, and plaintext passwords</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#shared-secrets-mechanisms">Shared secrets mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#kerberos-mechanisms">Kerberos mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-otp-mechanism">The OTP mechanism</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-to-set-configuration-options">How to set configuration options</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-default-configuration-file">The default configuration file</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#application-configuration">Application configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#troubleshooting">Troubleshooting</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/manpages.html">Man pages</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/manpages.html#library-files">(3) Library Files</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl.html"><strong>SASL</strong> - SASL Authentication Library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_authorize_t.html"><strong>sasl_authorize_t</strong> - The SASL authorization callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop.html"><strong>sasl_auxprop</strong> - How to work with SASL auxiliary properties</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_add_plugin.html"><strong>sasl_auxprop_add_plugin</strong> - add a SASL auxiliary property plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_getctx.html"><strong>sasl_auxprop_getctx</strong> - Acquire an auxiliary property context</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_request.html"><strong>sasl_auxprop_request</strong> - Request auxiliary properties from SASL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_callbacks.html"><strong>sasl_callbacks</strong> - How to work with SASL callbacks</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canon_user_t.html"><strong>sasl_canon_user_t</strong> - Application-supplied user canonicalization function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canonuser_add_plugin.html"><strong>sasl_canonuser_add_plugin</strong> - add a SASL user canonicalization plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_chalprompt_t.html"><strong>sasl_chalprompt_t</strong> - Realm acquisition callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkapop.html"><strong>sasl_checkapop</strong> - Check an APOP challenge/response</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkpass.html"><strong>sasl_checkpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_add_plugin.html"><strong>sasl_client_add_plugin</strong> - add a SASL client plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_done.html"><strong>sasl_client_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_init.html"><strong>sasl_client_init</strong> - SASL client authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_new.html"><strong>sasl_client_new</strong> - Create a new client authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_plug_init_t.html"><strong>sasl_client_plug_init_t</strong> - client plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_start.html"><strong>sasl_client_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_step.html"><strong>sasl_client_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode.html"><strong>sasl_decode</strong> - Decode data received</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode64.html"><strong>sasl_decode64</strong> - Decode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_dispose.html"><strong>sasl_dispose</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_done.html"><strong>sasl_done</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode.html"><strong>sasl_encode</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode64.html"><strong>sasl_encode64</strong> - Encode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encodev.html"><strong>sasl_encodev</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_erasebuffer.html"><strong>sasl_erasebuffer</strong> - erase buffer</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errdetail.html"><strong>sasl_errdetail</strong> - Retrieve  detailed information about an error</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errors.html"><strong>sasl_errors</strong> - SASL error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errstring.html"><strong>sasl_errstring</strong> - Translate a SASL return code to a human-readable form</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getcallback_t.html"><strong>sasl_getcallback_t</strong> - callback function to lookup a sasl_callback_t for a connection</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getconfpath_t.html"><strong>sasl_getconfpath_t</strong> - The SASL callback to indicate location of the config files</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getopt_t.html"><strong>sasl_getopt_t</strong> - The SASL get option callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getpath_t.html"><strong>sasl_getpath_t</strong> - The SASL callback to indicate location of the mechanism drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getprop.html"><strong>sasl_getprop</strong> - Get a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getrealm_t.html"><strong>sasl_getrealm_t</strong> - Realm Acquisition Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsecret_t.html"><strong>sasl_getsecret_t</strong> - The SASL callback for secrets (passwords)</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsimple_t.html"><strong>sasl_getsimple_t</strong> - The SASL callback for username/authname/realm</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_global_listmech.html"><strong>sasl_global_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_idle.html"><strong>sasl_idle</strong> - Perform precalculations during an idle period</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_listmech.html"><strong>sasl_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_log_t.html"><strong>sasl_log_t</strong> - The SASL logging callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_add_plugin.html"><strong>sasl_server_add_plugin</strong> - add a SASL server plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_done.html"><strong>sasl_server_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_init.html"><strong>sasl_server_init</strong> - SASL server authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_new.html"><strong>sasl_server_new</strong> - Create a new server authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_plug_init_t.html"><strong>sasl_server_plug_init_t</strong> - server plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_start.html"><strong>sasl_server_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_step.html"><strong>sasl_server_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_checkpass_t.html"><strong>sasl_server_userdb_checkpass_t</strong> - Plaintext Password Verification Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_setpass_t.html"><strong>sasl_server_userdb_setpass_t</strong> - UserDB Plaintext Password Setting Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_alloc.html"><strong>sasl_set_alloc</strong> - set the memory allocation functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_mutex.html"><strong>sasl_set_mutex</strong> - set the mutex lock functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_seterror.html"><strong>sasl_seterror</strong> - set the error string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setpass.html"><strong>sasl_setpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setprop.html"><strong>sasl_setprop</strong> - Set a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_user_exists.html"><strong>sasl_user_exists</strong> - Check if a user exists on server</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_usererr.html"><strong>sasl_usererr</strong> - Remove information leak about accounts from sasl error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_utf8verify.html"><strong>sasl_utf8verify</strong> - Verify a string is valid utf8</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_verifyfile_t.html"><strong>sasl_verifyfile_t</strong> - The SASL file verification</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/auxiliary_properties.html">Auxiliary Properties</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#auxiliary-properties-and-the-glue-layer">Auxiliary Properties and the Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#passwords-and-other-data">Passwords and other Data</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sasldb">sasldb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#ldapdb">ldapdb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sql">sql</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#user-canonicalization">User Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/authentication_mechanisms.html">Authentication Mechanisms</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#mechanisms">Mechanisms</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#anonymous">ANONYMOUS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#cram-md5">CRAM-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#digest-md5">DIGEST-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#external">EXTERNAL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#g2">G2</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gssapi">GSSAPI</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gss-spegno">GSS-SPEGNO</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#kerberos-v4">KERBEROS_V4</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#login">LOGIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#ntlm">NTLM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#otp">OTP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#passdss">PASSDSS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#plain">PLAIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#scram">SCRAM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#srp">SRP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#non-sasl-authentication">Non-SASL Authentication</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#summary">Summary</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/pwcheck.html">Pwcheck</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop">Auxprop</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop-hashed">Auxprop-hashed</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#saslauthd">Saslauthd</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#authdaemon">Authdaemon</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#alwaystrue">Alwaystrue</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auto-transition">Auto Transition</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/faq.html">Frequently Asked Questions</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/authorize-vs-authenticate.html">What is the difference between an Authorization ID and a Authentication ID?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/crammd5-digestmd5.html">Why do CRAM-MD5 and DIGEST-MD5 not work with CyrusSaslauthd?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/openldap-sasl-gssapi.html">How do I configure OpenLDAP +SASL+GSSAPI?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/plaintextpasswords.html">Why does CyrusSasl store plaintext passwords in its databases?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/rfcs.html">RFCs and drafts</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/upgrade-saslv2.html">Why am I having a problem running dbconverter-2 to upgrade from SASLv1 to SASLv2?</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/resources.html">Other Documentation &amp; Resources</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="developer.html">Developers</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/appconvert.html">Converting Applications from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-both-clients-and-servers">Tips for both clients and servers</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-clients">Tips for clients</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-servers">Tips for Servers</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/programming.html">Application Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#background">Background</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-did-the-world-work-before-sasl">How did the world work before SASL?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sasl-to-the-rescue">SASL to the rescue!</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#briefly">Briefly</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-the-cyrus-sasl-library-good-for">What is the Cyrus SASL library good for?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-does-the-cyrus-sasl-library-do">What does the Cyrus SASL library do?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-doesn-t-the-cyrus-sasl-library-do">What doesn’t the Cyrus SASL library do?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#client-only-section">Client-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-client-s-perspective">A typical interaction from the client’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-does-this-look-in-code">How does this look in code</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#server-only-section">Server-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-server-s-perspective">A typical interaction from the server’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#id1">How does this look in code?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#callbacks-and-interactions">Callbacks and Interactions</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#security-layers">Security layers</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#example-applications-that-come-with-the-cyrus-sasl-library">Example applications that come with the Cyrus SASL library</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sample-client-and-sample-server"><cite>sample-client</cite> and <cite>sample-server</cite></a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#cyrus-imapd-v2-1-0-or-later">Cyrus imapd v2.1.0 or later</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#imtest-from-cyrus-2-1-0-or-later"><cite>imtest</cite>, from Cyrus 2.1.0 or later</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#miscellaneous-information">Miscellaneous Information</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#empty-exchanges">Empty exchanges</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#idle">Idle</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/plugprog.html">Plugin Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#overview-of-plugin-programming">Overview of Plugin Programming</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#use-of-sasl-utils-t">Use of sasl_utils_t</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#error-reporting">Error Reporting</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#memory-allocation">Memory Allocation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#client-send-first-server-send-last">Client Send First / Server Send Last</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#client-plugins">Client Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#server-plugins">Server Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#user-canonicalization-canon-user-plugins">User Canonicalization (canon_user) Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#auxiliary-property-auxprop-plugins">Auxiliary Property (auxprop) Plugins</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/testing.html">Testing</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#testing-the-cmu-sasl-library-with-the-included-sample-applications">Testing the CMU SASL Library with the included sample applications</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/testing.html#example">Example</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#running-the-testsuite-application">Running the Testsuite application</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="support.html">Support/Community</a></li>
</ul>
<p class="caption"><span class="caption-text">IMAP</span></p>
<ul>
<li class="toctree-l1"><a class="reference external" href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
</ul>

          
        
      </div>
      &nbsp;
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
        <a href="index.html">Cyrus SASL</a>
      </nav>


      
      <div class="wy-nav-content">
        <div class="rst-content">
          
          <div role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
      <li><a href="index.html">Docs v2.1.27</a> &raquo;</li>
      
    <li>Download</li>
      <li class="wy-breadcrumbs-aside">
        
          
            <a href="https://github.com/cyrusimap/cyrus-sasl/blob/master/docsrc/download.rst" class="fa fa-github"> Edit on GitHub</a>
          
        
      </li>
  </ul>
  <hr/>
</div>
          <div role="main" class="document">
            
  <div class="section" id="download">
<h1>Download<a class="headerlink" href="#download" title="Permalink to this headline">¶</a></h1>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="getsasl.html">Get SASL</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#tarball-installation">Tarball installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#unix-package-installation">Unix package Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#requirements">Requirements</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#build-configuration">Build Configuration</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#building-and-installation">Building and Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#compilation-hints">Compilation Hints</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#application-configuration">Application Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/release-notes/index.html">Release Notes</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/release-notes/index.html#supported-product-series">Supported Product Series</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#series-2-1">Series 2.1</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/2.1/index.html">Cyrus SASL 2.1.x Release Notes</a><ul>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-27">New in 2.1.27</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-26">New in 2.1.26</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-25">New in 2.1.25</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-24">New in 2.1.24</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-23">New in 2.1.23</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-22">New in 2.1.22</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-21">New in 2.1.21</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-20">New in 2.1.20</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-19">New in 2.1.19</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-18">New in 2.1.18</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-17">New in 2.1.17</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-16-beta">New in 2.1.16-BETA</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-15">New in 2.1.15</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-14">New in 2.1.14</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-13">New in 2.1.13</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-12">New in 2.1.12</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-11">New in 2.1.11</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-10">New in 2.1.10</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-9">New in 2.1.9</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-8">New in 2.1.8</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-7">New in 2.1.7</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-6">New in 2.1.6</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-5">New in 2.1.5</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-4">New in 2.1.4</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-3-beta">New in 2.1.3-BETA</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-2">New in 2.1.2</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-1">New in 2.1.1</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.1/index.html#new-in-2-1-0">New in 2.1.0</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/release-notes/index.html#older-versions">Older Versions</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#series-2-2-0">Series 2: 2.0</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/2.0/index.html">Cyrus SASL 2.0.x Release Notes</a><ul>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.0/index.html#new-in-2-0-5-beta">New in 2.0.5-BETA</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.0/index.html#new-in-2-0-4-beta">New in 2.0.4-BETA</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.0/index.html#new-in-2-0-3-beta">New in 2.0.3-BETA</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.0/index.html#new-in-2-0-2-alpha">New in 2.0.2-ALPHA</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/2.0/index.html#new-in-2-0-0-alpha">New in 2.0.0-ALPHA</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#series-1">Series 1</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/1/index.html">Cyrus SASL 1.x Release Notes</a><ul>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-26">New in 1.5.26</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-25">New in 1.5.25</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-24">New in 1.5.24</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-22">New in 1.5.22</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-21">New in 1.5.21</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-20">New in 1.5.20</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-19">New in 1.5.19</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-18">New in 1.5.18</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-17">New in 1.5.17</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-16">New in 1.5.16</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-15">New in 1.5.15</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-14">New in 1.5.14</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-13">New in 1.5.13</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-12">New in 1.5.12</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-11">New in 1.5.11</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-10">New in 1.5.10</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-9">New in 1.5.9</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-5">New in 1.5.5</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-3">New in 1.5.3</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-2">New in 1.5.2</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-5-0">New in 1.5.0</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-4-1">New in 1.4.1</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-3b1">New in 1.3b1</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-2b3">New in 1.2b3</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-2b2">New in 1.2b2</a></li>
<li class="toctree-l5"><a class="reference internal" href="sasl/release-notes/1/index.html#new-in-1-2b1">New in 1.2b1</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="packager.html">Note for Packagers</a></li>
</ul>
</div>
</div>


          </div>
          <footer>
  
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      
        <a href="getsasl.html" class="btn btn-neutral float-right" title="Get SASL" accesskey="n">Next <span class="fa fa-arrow-circle-right"></span></a>
      
      
        <a href="index.html" class="btn btn-neutral" title="Cyrus SASL" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous</a>
      
    </div>
  

  <hr/>

  <div role="contentinfo">
    <p>
        &copy; Copyright 1993-2016, The Cyrus Team.
    </p>
  </div>
  Built with <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6 using a modified <a href="https://readthedocs.org">Read the Docs</a> <a href="https://github.com/snide/sphinx_rtd_theme">theme</a>.

</footer>

        </div>
      </div>

    </section>

  </div>
  


  

    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'./',
            VERSION:'2.1.27',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'.html',
            HAS_SOURCE:  true
        };
    </script>
      <script type="text/javascript" src="_static/jquery.js"></script>
      <script type="text/javascript" src="_static/underscore.js"></script>
      <script type="text/javascript" src="_static/doctools.js"></script>
      <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>

  

  
  
    <script type="text/javascript" src="_static/js/theme.js"></script>
  

  
  
  <script type="text/javascript">
<!--      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      }); -->
  </script>
  
 



</body>
</html>PK�*[�|8�8�"doc/alt-cyrus-sasl-lib/search.htmlnu�[���

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>Search &mdash; Cyrus SASL 2.1.27 documentation</title>
  

  
  
    <link rel="shortcut icon" href="_static/favicon.ico"/>
  

  

  
  
    

  

  
  
    <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
  

  
    <link rel="stylesheet" href="_static/cyrus.css" type="text/css" />
  

  
        <link rel="index" title="Index"
              href="genindex.html"/>
        <link rel="search" title="Search" href="#"/>
    <link rel="top" title="Cyrus SASL 2.1.27 documentation" href="index.html"/> 

  
  
  

</head>

<body class="wy-body-for-nav" role="document">

  
  
<div class="pageheader">
  <ul>
    <li><a href="index.html">Home</a></li>
    <li><a href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
    <li><a href="download.html">Download</a></li>
    <li><a href="contribute.html">Contribute</a></li>
  </ul>
  <div>
    <a href="index.html">
      <img src="_static/logo.gif" alt="CYRUS SASL" />
    </a>
  </div>
</div>
<div style="clear: both;"></div>


  <div class="wy-grid-for-nav">

    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-nav-search">
        

        
 
          <a href="index.html">
 

  
          
          <img src="_static/logo.gif"  />
     
        </a>

        
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="#" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

        
      </div>

      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
        
          
          
              <p class="caption"><span class="caption-text">Cyrus SASL</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="download.html">Download</a><ul>
<li class="toctree-l2"><a class="reference internal" href="getsasl.html">Get SASL</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/release-notes/index.html">Release Notes</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#supported-product-series">Supported Product Series</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-1">Series 2.1</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/release-notes/index.html#older-versions">Older Versions</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-2-2-0">Series 2: 2.0</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/release-notes/index.html#series-1">Series 1</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="packager.html">Note for Packagers</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/quickstart.html">Quickstart guide</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#features">Features</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#typical-installation">Typical Installation</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/quickstart.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="sasl/concepts.html">Concepts</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl">SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#sasl-authentication-mechanisms">SASL Authentication Mechanisms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#security-layers">Security Layers</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#channel-binding">Channel Binding</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#realms">Realms</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#protocols">Protocols</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#cyrus-sasl">Cyrus SASL</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#the-glue-library">The Glue Library</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l2"><a class="reference internal" href="sasl/concepts.html#plugins">Plugins</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="setup.html">Setup</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/installation.html">Installation</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#quick-install-guide">Quick install guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#tarball-installation">Tarball installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#unix-package-installation">Unix package Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#configuration">Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#detailed-installation-guide">Detailed installation guide</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#requirements">Requirements</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#build-configuration">Build Configuration</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#building-and-installation">Building and Installation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#compilation-hints">Compilation Hints</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/installation.html#application-configuration">Application Configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/installation.html#supported-platforms">Supported platforms</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/upgrading.html">Upgrading from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#backwards-compatibility">Backwards Compatibility</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#coexistence-with-saslv1">Coexistence with SASLv1</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#database-upgrades">Database Upgrades</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/upgrading.html#errors-on-migration">Errors on migration</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/components.html">Components</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-application">The Application</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#the-sasl-glue-layer">The SASL Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#plugins">Plugins</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-general">Plugins: General</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-sasl-mechanisms">Plugins: SASL Mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-auxiliary-property">Plugins: Auxiliary Property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/components.html#plugins-username-canonicalization">Plugins: Username Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/components.html#password-verification-services">Password Verification Services</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/options.html">Options</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasl-library">SASL Library</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#auxiliary-property-plugin">Auxiliary Property Plugin</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#gssapi">GSSAPI</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ldapdb">LDAPDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-ldapdb">Notes on LDAPDB</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#examples">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#ntlm">NTLM</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#otp">OTP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#digest-md5">Digest-md5</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sasldb">SASLDB</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sasldb-with-lmdb">Notes on sasldb with LMDB</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#sql-plugin">SQL Plugin</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#notes-on-sql">Notes on SQL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/options.html#id2">Examples</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#srp">SRP</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/options.html#kerberos-v4">Kerberos V4</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/advanced.html">Advanced Usage</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/advanced.html#notes-for-advanced-usage-of-libsasl">Notes for Advanced Usage of libsasl</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/advanced.html#using-cyrus-sasl-as-a-static-library">Using Cyrus SASL as a static library</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="operations.html">Operations</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/sysadmin.html">System Administrators</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#what-sasl-is">What SASL is</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#authentication-and-authorization-identifiers">Authentication and authorization identifiers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#realms">Realms</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-sasl-works">How SASL works</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-plain-mechanism-sasl-checkpass-and-plaintext-passwords">The PLAIN mechanism, <code class="docutils literal"><span class="pre">sasl_checkpass()</span></code>, and plaintext passwords</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#shared-secrets-mechanisms">Shared secrets mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#kerberos-mechanisms">Kerberos mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-otp-mechanism">The OTP mechanism</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#auxiliary-properties">Auxiliary Properties</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#how-to-set-configuration-options">How to set configuration options</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#the-default-configuration-file">The default configuration file</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/sysadmin.html#application-configuration">Application configuration</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/sysadmin.html#troubleshooting">Troubleshooting</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/manpages.html">Man pages</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/manpages.html#library-files">(3) Library Files</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl.html"><strong>SASL</strong> - SASL Authentication Library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_authorize_t.html"><strong>sasl_authorize_t</strong> - The SASL authorization callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop.html"><strong>sasl_auxprop</strong> - How to work with SASL auxiliary properties</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_add_plugin.html"><strong>sasl_auxprop_add_plugin</strong> - add a SASL auxiliary property plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_getctx.html"><strong>sasl_auxprop_getctx</strong> - Acquire an auxiliary property context</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_auxprop_request.html"><strong>sasl_auxprop_request</strong> - Request auxiliary properties from SASL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_callbacks.html"><strong>sasl_callbacks</strong> - How to work with SASL callbacks</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canon_user_t.html"><strong>sasl_canon_user_t</strong> - Application-supplied user canonicalization function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_canonuser_add_plugin.html"><strong>sasl_canonuser_add_plugin</strong> - add a SASL user canonicalization plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_chalprompt_t.html"><strong>sasl_chalprompt_t</strong> - Realm acquisition callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkapop.html"><strong>sasl_checkapop</strong> - Check an APOP challenge/response</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_checkpass.html"><strong>sasl_checkpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_add_plugin.html"><strong>sasl_client_add_plugin</strong> - add a SASL client plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_done.html"><strong>sasl_client_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_init.html"><strong>sasl_client_init</strong> - SASL client authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_new.html"><strong>sasl_client_new</strong> - Create a new client authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_plug_init_t.html"><strong>sasl_client_plug_init_t</strong> - client plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_start.html"><strong>sasl_client_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_client_step.html"><strong>sasl_client_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode.html"><strong>sasl_decode</strong> - Decode data received</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_decode64.html"><strong>sasl_decode64</strong> - Decode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_dispose.html"><strong>sasl_dispose</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_done.html"><strong>sasl_done</strong> - Dispose of a SASL connection object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode.html"><strong>sasl_encode</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encode64.html"><strong>sasl_encode64</strong> - Encode base64 string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_encodev.html"><strong>sasl_encodev</strong> - Encode data for transport to authenticated host</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_erasebuffer.html"><strong>sasl_erasebuffer</strong> - erase buffer</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errdetail.html"><strong>sasl_errdetail</strong> - Retrieve  detailed information about an error</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errors.html"><strong>sasl_errors</strong> - SASL error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_errstring.html"><strong>sasl_errstring</strong> - Translate a SASL return code to a human-readable form</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getcallback_t.html"><strong>sasl_getcallback_t</strong> - callback function to lookup a sasl_callback_t for a connection</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getconfpath_t.html"><strong>sasl_getconfpath_t</strong> - The SASL callback to indicate location of the config files</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getopt_t.html"><strong>sasl_getopt_t</strong> - The SASL get option callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getpath_t.html"><strong>sasl_getpath_t</strong> - The SASL callback to indicate location of the mechanism drivers</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getprop.html"><strong>sasl_getprop</strong> - Get a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getrealm_t.html"><strong>sasl_getrealm_t</strong> - Realm Acquisition Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsecret_t.html"><strong>sasl_getsecret_t</strong> - The SASL callback for secrets (passwords)</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_getsimple_t.html"><strong>sasl_getsimple_t</strong> - The SASL callback for username/authname/realm</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_global_listmech.html"><strong>sasl_global_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_idle.html"><strong>sasl_idle</strong> - Perform precalculations during an idle period</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_listmech.html"><strong>sasl_listmech</strong> - Retrieve a list of the supported SASL mechanisms</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_log_t.html"><strong>sasl_log_t</strong> - The SASL logging callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_add_plugin.html"><strong>sasl_server_add_plugin</strong> - add a SASL server plugin</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_done.html"><strong>sasl_server_done</strong> - Cleanup function</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_init.html"><strong>sasl_server_init</strong> - SASL server authentication initialization</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_new.html"><strong>sasl_server_new</strong> - Create a new server authentication object</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_plug_init_t.html"><strong>sasl_server_plug_init_t</strong> - server plug‐in entry point</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_start.html"><strong>sasl_server_start</strong> - Begin an authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_step.html"><strong>sasl_server_step</strong> - Perform a step in the authentication negotiation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_checkpass_t.html"><strong>sasl_server_userdb_checkpass_t</strong> - Plaintext Password Verification Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_server_userdb_setpass_t.html"><strong>sasl_server_userdb_setpass_t</strong> - UserDB Plaintext Password Setting Callback</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_alloc.html"><strong>sasl_set_alloc</strong> - set the memory allocation functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_set_mutex.html"><strong>sasl_set_mutex</strong> - set the mutex lock functions used by the SASL library</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_seterror.html"><strong>sasl_seterror</strong> - set the error string</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setpass.html"><strong>sasl_setpass</strong> - Check a plaintext password</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_setprop.html"><strong>sasl_setprop</strong> - Set a SASL property</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_user_exists.html"><strong>sasl_user_exists</strong> - Check if a user exists on server</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_usererr.html"><strong>sasl_usererr</strong> - Remove information leak about accounts from sasl error codes</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_utf8verify.html"><strong>sasl_utf8verify</strong> - Verify a string is valid utf8</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/reference/manpages/library/sasl_verifyfile_t.html"><strong>sasl_verifyfile_t</strong> - The SASL file verification</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/auxiliary_properties.html">Auxiliary Properties</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#auxiliary-properties-and-the-glue-layer">Auxiliary Properties and the Glue Layer</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#passwords-and-other-data">Passwords and other Data</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sasldb">sasldb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#ldapdb">ldapdb</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#sql">sql</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/auxiliary_properties.html#user-canonicalization">User Canonicalization</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/authentication_mechanisms.html">Authentication Mechanisms</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#mechanisms">Mechanisms</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#anonymous">ANONYMOUS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#cram-md5">CRAM-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#digest-md5">DIGEST-MD5</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#external">EXTERNAL</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#g2">G2</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gssapi">GSSAPI</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#gss-spegno">GSS-SPEGNO</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#kerberos-v4">KERBEROS_V4</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#login">LOGIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#ntlm">NTLM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#otp">OTP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#passdss">PASSDSS</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#plain">PLAIN</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#scram">SCRAM</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#srp">SRP</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/authentication_mechanisms.html#non-sasl-authentication">Non-SASL Authentication</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/authentication_mechanisms.html#summary">Summary</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/pwcheck.html">Pwcheck</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop">Auxprop</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auxprop-hashed">Auxprop-hashed</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#saslauthd">Saslauthd</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#authdaemon">Authdaemon</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#alwaystrue">Alwaystrue</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/pwcheck.html#auto-transition">Auto Transition</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/faq.html">Frequently Asked Questions</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/authorize-vs-authenticate.html">What is the difference between an Authorization ID and a Authentication ID?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/crammd5-digestmd5.html">Why do CRAM-MD5 and DIGEST-MD5 not work with CyrusSaslauthd?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/openldap-sasl-gssapi.html">How do I configure OpenLDAP +SASL+GSSAPI?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/plaintextpasswords.html">Why does CyrusSasl store plaintext passwords in its databases?</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/rfcs.html">RFCs and drafts</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/faqs/upgrade-saslv2.html">Why am I having a problem running dbconverter-2 to upgrade from SASLv1 to SASLv2?</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/resources.html">Other Documentation &amp; Resources</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="developer.html">Developers</a><ul>
<li class="toctree-l2"><a class="reference internal" href="sasl/appconvert.html">Converting Applications from v1 to v2</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-both-clients-and-servers">Tips for both clients and servers</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-clients">Tips for clients</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/appconvert.html#tips-for-servers">Tips for Servers</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/programming.html">Application Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#background">Background</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-did-the-world-work-before-sasl">How did the world work before SASL?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sasl-to-the-rescue">SASL to the rescue!</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#briefly">Briefly</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-is-the-cyrus-sasl-library-good-for">What is the Cyrus SASL library good for?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-does-the-cyrus-sasl-library-do">What does the Cyrus SASL library do?</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#what-doesn-t-the-cyrus-sasl-library-do">What doesn’t the Cyrus SASL library do?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#client-only-section">Client-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-client-s-perspective">A typical interaction from the client’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#how-does-this-look-in-code">How does this look in code</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#server-only-section">Server-only Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#a-typical-interaction-from-the-server-s-perspective">A typical interaction from the server’s perspective</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#id1">How does this look in code?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#callbacks-and-interactions">Callbacks and Interactions</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#security-layers">Security layers</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#example-applications-that-come-with-the-cyrus-sasl-library">Example applications that come with the Cyrus SASL library</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#sample-client-and-sample-server"><cite>sample-client</cite> and <cite>sample-server</cite></a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#cyrus-imapd-v2-1-0-or-later">Cyrus imapd v2.1.0 or later</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#imtest-from-cyrus-2-1-0-or-later"><cite>imtest</cite>, from Cyrus 2.1.0 or later</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/programming.html#miscellaneous-information">Miscellaneous Information</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#empty-exchanges">Empty exchanges</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/programming.html#idle">Idle</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/plugprog.html">Plugin Programmer’s Guide</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#introduction">Introduction</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#about-this-guide">About this Guide</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#what-is-sasl">What is SASL?</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#common-section">Common Section</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#overview-of-plugin-programming">Overview of Plugin Programming</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#use-of-sasl-utils-t">Use of sasl_utils_t</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#error-reporting">Error Reporting</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#memory-allocation">Memory Allocation</a></li>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/plugprog.html#client-send-first-server-send-last">Client Send First / Server Send Last</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#client-plugins">Client Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#server-plugins">Server Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#user-canonicalization-canon-user-plugins">User Canonicalization (canon_user) Plugins</a></li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/plugprog.html#auxiliary-property-auxprop-plugins">Auxiliary Property (auxprop) Plugins</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="sasl/developer/testing.html">Testing</a><ul>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#testing-the-cmu-sasl-library-with-the-included-sample-applications">Testing the CMU SASL Library with the included sample applications</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sasl/developer/testing.html#example">Example</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="sasl/developer/testing.html#running-the-testsuite-application">Running the Testsuite application</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="support.html">Support/Community</a></li>
</ul>
<p class="caption"><span class="caption-text">IMAP</span></p>
<ul>
<li class="toctree-l1"><a class="reference external" href="http://www.cyrusimap.org">Cyrus IMAP</a></li>
</ul>

          
        
      </div>
      &nbsp;
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
        <a href="index.html">Cyrus SASL</a>
      </nav>


      
      <div class="wy-nav-content">
        <div class="rst-content">
          
          <div role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
      <li><a href="index.html">Docs v2.1.27</a> &raquo;</li>
      
    <li>Search</li>
      <li class="wy-breadcrumbs-aside">
        
      </li>
  </ul>
  <hr/>
</div>
          <div role="main" class="document">
            
  <noscript>
  <div id="fallback" class="admonition warning">
    <p class="last">
      Please activate JavaScript to enable the search
      functionality.
    </p>
  </div>
  </noscript>

  
  <div id="search-results">
  
  </div>

          </div>
          <footer>
  

  <hr/>

  <div role="contentinfo">
    <p>
        &copy; Copyright 1993-2016, The Cyrus Team.
    </p>
  </div>
  Built with <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.6 using a modified <a href="https://readthedocs.org">Read the Docs</a> <a href="https://github.com/snide/sphinx_rtd_theme">theme</a>.

</footer>

        </div>
      </div>

    </section>

  </div>
  


  

    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'./',
            VERSION:'2.1.27',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'.html',
            HAS_SOURCE:  true
        };
    </script>
      <script type="text/javascript" src="_static/jquery.js"></script>
      <script type="text/javascript" src="_static/underscore.js"></script>
      <script type="text/javascript" src="_static/doctools.js"></script>
      <script type="text/javascript" src="https://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
      <script type="text/javascript" src="_static/searchtools.js"></script>

  

  
  
    <script type="text/javascript" src="_static/js/theme.js"></script>
  

  
  
  <script type="text/javascript">
<!--      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      }); -->
  </script>
  
  <script type="text/javascript">
    jQuery(function() { Search.loadIndex("searchindex.js"); });
  </script>
  
  <script type="text/javascript" id="searchindexloader"></script>
  
 




</body>
</html>PK�*[5��߸$�$!doc/alt-cyrus-sasl/LDAP_SASLAUTHDnu�[���auth_ldap module for saslauthd
------------------------------

Saslauthd can use an LDAP directory for authentication/authorization.

Sections:
1. Build saslauthd with ldap support
2. Start saslauthd with ldap
3. Testing
4. Parameters
5. Examples
6. Notes
7. Todo
8. Feedback
8. Author


1. BUILD SASLAUTHD WITH LDAP SUPPORT
------------------------------------

Ensure that you have the OpenLDAP (http://www.openldap.org) libraries 2.1 or
higher.  Fetch the latest cyrus-sasl package, 2.1.17 or higher,
ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/.

Unpack cyrus-sasl:
gzip -dc cyrus-sasl-2.1.17.tar.gz | tar xf -
or
tar zxf cyrus-sasl-2.1.17.tar.gz (if your tar supportz gzip)

cd cyrus-sasl-2.1.17
./configure --with-ldap  (you may need to add other options, check doc/index.html for more)
make
make install


2. START SASLAUTHD WITH LDAP
----------------------------

Create /usr/local/etc/saslauthd.conf and add the following (modify to fit your
environment):
ldap_servers: ldap://10.1.1.15/ ldap://10.1.1.25/
ldap_bind_dn: cn=operator,ou=Profile,o=foo.com
ldap_password: secret

Do not specify ldap_bind_*/ldap_password if you want to bind anonymously to
your ldap server(s). 

Run saslauthd:
saslauthd -a ldap

If you want to specify a different configuration file, you can do something
like:
saslauthd -a ldap -O /etc/saslauthd.conf

For more command line options, check 'man saslauthd'


3. TESTING
----------

First build testsaslauthd:
cd $sasl_src/saslauthd
make testsaslauthd

Run test utility:
./testsaslauthd -u igor -p secret
0: OK "Success."

If you get output other then Success, turn debug level for the auth syslog
facility and check the syslog file.  Hopefully this will give you enough
information to make adjustements in the startup and/or configuration files.  


4. PARAMETERS
-------------

The following are available ldap parameters.  There are quite a few of those,
but only ldap_servers may need to be specified. The defaults for all other
parameters are adequate for most installations.  

Do not use quotes (\"\') in the parameter values.  The defaults are specified
within the first set of <>.  There may be a second set of <> which provide
available values.

ldap_auth_method: <bind|fastbind> <bind|custom|fastbind>
	Specify an authentication method.

    The bind method uses the LDAP bind facility to verify the password.  The
    bind method is not available when ldap_use_sasl is turned on.  In that case
    saslauthd will use fastbind.

    'bind' is the default auth method. When ldap_use_sasl is enabled,
    'fastbind' is the default.

    The custom method uses userPassword attribute to verify the password.
    Suppored hashes: crypt, md5, smd5, sha and ssha.  Cleartext is supported as
    well.

    The fastbind method (when 'ldap_use_sasl: no') does away with the search
    and an extra anonymous bind in auth_bind, but makes two assumptions:
	  1. Expanding the ldap_filter expression gives the user's fully-qualified DN
	  2. There is no cost to staying bound as a named user

ldap_bind_dn: <none>
	Specify DN (distinguished name) to bind to the LDAP directory.  Do not
	specify this parameter for the anonymous bind.

ldap_bind_pw: <none>
	Alias for ldap_password.

ldap_default_domain: <none>
	Alias for ldap_default_realm.

ldap_default_realm: <none>
	The default realm is assigned to the %r token when realm is not
	available.  See ldap_filter for more.

ldap_deref: <none> <search|find|always|never>
	Specify how aliases dereferencing is handled during search.

ldap_filter: <uid=%u>
	Specify a filter.  The following tokens can be used in the filter string:

	%%   = %
	%u   = user
	%U   = user portion of %u (%U = test when %u = test@domain.tld)
	%d   = domain portion of %u if available (%d = domain.tld when %u =
	       %test@domain.tld), otherwise same as %r
	%1-9 = domain tokens (%1 = tld, %2 = domain when %d = domain.tld)
	%s   = service
	%r   = realm
	%D   = user DN (available for group checks)
	
	The %u token has to be used at minimum for the filter to be useful.  If
	ldap_auth_method is 'bind', the filter will search for the DN
	(distinguished name) attribute.  Otherwise, the search will look for
	the 'ldap_password_attr' (see below) attribute.

ldap_group_attr: <uniqueMember>
    Specify what attribute to compare the user DN against in the group. If
    ldap_group_dn is not specified, this parameter is ignored.  If
    ldap_group_match_method is not attr, this parameter is ignored.
 
ldap_group_dn: <none>
    If specified, the user has to be part of the group in order to authenticate
    successfully.  Tokens described in 'ldap_filter' (see above) can be used
    for substitution.

ldap_group_filter: <none>
    Specify a filter. If a filter match is found then the user is in the group.
    Tokens described in 'ldap_filter' (see above) can be used for for
    substitution. If ldap_group_dn is not specified, this parameter is ignored.
    If ldap_group_match_method is not filter, this parameter is ignored.

ldap_group_match_method: <attr> <attr|filter>
    Specify whether the group match method uses ldap_group_attr or
    ldap_group_search.  If ldap_group_dn is not specified, this parameter is
    ignored.

ldap_group_search_base: <if not specified, it defaults to ldap_search_base>
    Specify a starting point for the group search: e.g. dc=foo,dc=com.  Tokens
    described in 'ldap_filter' (see below) can be used for substitution.

ldap_group_scope: <sub> <sub|one|base>
	Group search scope.

ldap_password: <none>
	Specify the password for ldap_bind_dn or ldap_id if
	ldap_use_sasl is turned on.  Do not specify this parameter for the
	anonymous bind.

ldap_password_attr: <userPassword>
        Specify what password attribute to use for password verification.
 
ldap_referrals: <no>
	Specify whether or not the client should follow referrals.

ldap_restart: <yes>
	Specify whether or not LDAP I/O operations are automatically restarted
	if they abort prematurely.

ldap_id: <none>
	Specify the authentication ID for SASL bind.

ldap_authz_id: <none>
	Specify the proxy authorization ID for SASL bind.

ldap_mech: <none>
	Specify the authentication mechanism for SASL bind.

ldap_realm: <none>
	Specify the realm of authentication ID for SASL bind.

ldap_scope: <sub> <sub|one|base>
	Search scope.

ldap_search_base: <none>
	Specify a starting point for the search: e.g. dc=foo,dc=com.  Tokens
	described in 'ldap_filter' (see below) can be used for substitution.

ldap_servers: <ldap://localhost/>
	Specify URI(s) refering to LDAP server(s), e.g. ldaps://10.1.1.2:999/.
	You can specify multiple servers separated by a space.

ldap_start_tls: <no>
	Use StartTLS extended operation.  Do not use ldaps: ldap_servers when
	this option is turned on.

ldap_time_limit: <5>
	Specify a number of seconds for a search request to complete.

ldap_timeout: <5>
	Specify a number of seconds a search can take before timing out.

ldap_tls_check_peer: <no> <yes|no>
	Require and verify server certificate.  If this option is yes,
	you must specify ldap_tls_cacert_file or ldap_tls_cacert_dir.

ldap_tls_cacert_file: <none>
	File containing CA (Certificate Authority) certificate(s).

ldap_tls_cacert_dir: <none>
	Path to directory with CA (Certificate Authority) certificates.

ldap_tls_ciphers: <DEFAULT>
	List of SSL/TLS ciphers to allow.  The format of the string is
	described in ciphers(1).

ldap_tls_cert: <none>
	File containing the client certificate.

ldap_tls_key: <none>
	File containing the private client key.

ldap_use_sasl: <no>
	Use SASL bind rather than simple bind when connecting to the ldap
	server.

ldap_version: <3> <2|3>
	Specify the LDAP protocol version.  If ldap_start_tls and/or
	ldap_use_sasl are enabled, ldap_version will be automatiacally set to
	3.

5. NOTES
--------

For better performance ensure that the attributes specified in ldap_filter are
indexed.

My testing shows that 'custom' is 2-3 times faster than 'bind'
ldap_auth_method.  The 'fastbind' auth_method is just as fast or faster.  The
slower performace of the 'bind' auth_method is caused by two extra calls to
ldap_bind() per each authentication.

SASL bind should be used with the 'fastbind' auth_method:

ldap_servers: ldaps://10.1.1.2/
ldap_use_sasl: yes
ldap_mech: DIGEST_MD5
ldap_auth_method: fastbind

At this time this is not the best performing solution because openldap (2.1.x)
cannot reuse existing connection for multiple ldap_sasl_bind()s.  This will
hopefully change when openldap 2.2 comes out.

6. TODO
-------

- Port to other ldap libraries
- There may be bind problems when following referrals.  Normally this is not an
  issue.
- Allow to specify an attribute other than userPassword for use in the custom
  authentication method. (Done)
- Add more password hashes such as md5, sha etc (Done)
- Make a suggestion (possibly another authentication method?) (added fastbind)
  thanks to Simon Brady <simon.brady@otago.ac.nz>


7. FEEDBACK
-----------

Feedback is much appreciated!  Please drop me a note if you are successfully
using ldap-enabled saslauthd.  Any code improvements and/or suggestion are welcome.

If you have questions, send email to cyrus-sasl@lists.andrew.cmu.edu.  Please
include relevant information about your saslauthd setup: at minimum provide
your saslauth.conf, output from syslog and which directory server you're using.


8. AUTHOR
---------

Igor Brezac <igor@ipass.net>.
PK�N[�l�licenses/alt-php82-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�N[p���(licenses/alt-php82-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�N[Pi��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:9:"net_sieve";a:2:{i:0;a:3:{s:3:"dep";a:3:{s:4:"name";s:10:"Net_Socket";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:3:"1.0";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:1;a:3:{s:3:"dep";a:3:{s:4:"name";s:9:"Auth_SASL";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:3:"1.0";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}s:8:"net_smtp";a:2:{i:0;a:3:{s:3:"dep";a:3:{s:4:"name";s:10:"Net_Socket";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.0.7";}s:4:"type";s:8:"required";s:5:"group";b:0;}i:1;a:3:{s:3:"dep";a:3:{s:4:"name";s:9:"Auth_SASL";s:7:"channel";s:12:"pear.php.net";s:3:"min";s:5:"1.0.5";}s:4:"type";s:8:"optional";s:5:"group";b:0;}}}}s:8:"packages";a:1:{s:12:"pear.php.net";a:12:{s:11:"archive_tar";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:16:"structures_graph";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:14:"console_getopt";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:8:"xml_util";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:17:"pear_frontend_web";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:17:"pear_frontend_gtk";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:18:"pear_frontend_gtk2";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"pear";}}s:13:"validate_ispn";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:9:"file_marc";}}s:8:"net_smtp";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:4:"mail";}}s:9:"mail_mime";a:1:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:15:"mail_mimedecode";}}s:10:"net_socket";a:2:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:9:"net_sieve";}i:1;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:8:"net_smtp";}}s:9:"auth_sasl";a:2:{i:0;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:9:"net_sieve";}i:1;a:2:{s:7:"channel";s:12:"pear.php.net";s:7:"package";s:8:"net_smtp";}}}}}PK�N[�{��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;
    }

}
PK�N[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;
    }

}
PK�N[��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;
        }
    }

}
PK�N[�+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);
    }
}
PK�N[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
PK�N[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)]";
    }

}
PK�N[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);
    }

}
PK�N[�؛�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);
    }
}
PK�N[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;
    }

}
PK�N[@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;
    }

}
PK�N[�*�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;
    }
    // }}}

}
// }}}

?>
PK�N[����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;
    }
    // }}}
}

// }}}

?>
PK�N[�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;
    }
}
?>PK�N[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);
    }
}
?>PK�N[����==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;
    }
}
?>
PK�N[�<� 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);
    }
}
?>PK�N[%ׅ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);
        }
    }
}
?>
PK�N[�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;
     }
}
?>
PK�N[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;
    }
}
?>
PK�N[ќ��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);
        }
    }

}

?>
PK�N[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;
    }
}

?>
PK�N[��
����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];
    }
    // }}}
}

?>
PK�N[���S66pear/Net/IDNA2/Exception.phpnu�[���<?php
class Net_IDNA2_Exception extends Exception
{
}
PK�N[&��#rr%pear/Net/IDNA2/Exception/Nameprep.phpnu�[���<?php
require_once 'Net/IDNA2/Exception.php';

class Net_IDNA2_Exception_Nameprep extends Net_IDNA2_Exception
{
}
PK�N[����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";
            }
        }
    }
}
PK�N[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;
    }
}
PK�N[���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);
        }
    }

}
PK�N[pear/.depdblocknu�[���PK�N[�/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();
    }
    // }}}

}
// }}}
PK�N[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;
    }
    // }}}

}
// }}}

PK�N[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;
    }
    // }}}

}
// }}}

PK�N[�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();
    }
    // }}}

}
// }}}

PK�N[(#�~��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;
    }
    // }}}
}
// }}}

PK�N[�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;
    }
    // }}}

}
// }}}

PK�N[�+����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);
        }
    }
    // }}}
}
// }}}

PK�N[�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
    }
    // }}}
}
// }}}
PK�N[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);
    }
    // }}}
}
// }}}

PK�N[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;
    }
    // }}}

}
// }}}

PK�N[Ɍ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
    }
    // }}}
}
// }}}

PK�N[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;
    }
    // }}}
}
// }}}

PK�N[�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
PK�N[�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
PK�N[(��  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
PK�N[���|��: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);

?>
PK�N[髂[��: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
PK�N[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
PK�N[�����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
PK�N[�#,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
PK�N[����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);

?>
PK�N[� ���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
PK�N[骗���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
PK�N[��)��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
PK�N[�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
PK�N[)�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
PK�N[�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
PK�N[�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
PK�N[�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
PK�N[��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
PK�N[�� 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
PK�N[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--
OKPK�N[)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>
PK�N[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) {
} 
PK�N[*����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
PK�N[?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);
    }

}

PK�N[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);
    }
}
PK�N[<ȸ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!
PK�N[�߁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
PK�N[�*�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!
PK�N[�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');
PK�N[����)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";
}
PK�N[�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();
    }
}
PK�N[�Y�npp)pear/test/Net_Sieve/tests/config.php.distnu�[���<?php
define('HOST', 'localhost');
define('PORT', 4190);
define('USERNAME', 'user');
define('PASSWORD', 'pass');PK�N[ҵ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
PK�N[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
)
PK�N[;�{��,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
PK�N[�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
PK�N[Ԣ��``-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
PK�N[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
PK�N[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>
PK�N[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.comPK�N[��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=?=
PK�N[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
PK�N[%��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
PK�N[�-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;
PK�N[�(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==?=";
PK�N[��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
PK�N[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
PK�N[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?=
PK�N[ّ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: 
---
PK�N[)#��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
--*--
PK�N[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
---
PK�N[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
PK�N[�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>
PK�N[[��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"
PK�N[�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--
0PK�N[�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
PK�N[���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;
PK�N[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
PK�N[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
PK�N[@�/�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>
PK�N[�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;
PK�N[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
PK�N[���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
PK�N[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>
PK�N[��-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
PK�N[`�~@/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
PK�N[�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
PK�N[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
PK�N[�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
PK�N[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;

PK�N[������-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;

PK�N[�-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
PK�N[%+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==?=";
PK�N[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
PK�N[�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";
PK�N[�'�''.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
PK�N[��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
PK�N[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
PK�N[�
Ǟ		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
---
PK�N[ܶ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 :(
PK�N[�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
PK�N[��((/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
PK�N[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

PK�N[��᠗"�"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?=
PK�N[���|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
PK�N[�{�	�	/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
PK�N[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>PK�N[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
PK�N[�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.
PK�N[�è{{'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`
`
PK�N[Ҕ��	�	)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
PK�N[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
PK�N[��	\��,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"
PK�N[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>
PK�N[�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
PK�N[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
PK�N[}&�
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).
PK�N[�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.
PK�N[���
��-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
PK�N[��%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
PK�N[(���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.PK�N[�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
PK�N[����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>
PK�N[)�]�
�
'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
PK�N[	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
PK�N[�_|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.
PK�N[�=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>
PK�N[�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
PK�N[!Ņ\��+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>
PK�N[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
PK�N[�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
PK�N[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"
PK�N[(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
PK�N[�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"]]}
PK�N[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
PK�N[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);

?>
PK�N[\.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.PK�N[#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>
PK�N[�_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
PK�N[.%�``'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
PK�N[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).
PK�N[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!
PK�N[�����'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"
PK�N[+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>
PK�N[��ԛ�
�
'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
PK�N[�����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
PK�N[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
PK�N[���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
PK�N[~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.0PK�N[}۶\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>
PK�N[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"}]}
PK�N[�&��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
PK�N[�����+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.
PK�N[�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>
PK�N[��`��'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!
PK�N[�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"}]}}]}
PK�N[<��--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...
PK�N[�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.0PK�N[�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
PK�N[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>
PK�N[�泮�#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
PK�N[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
PK�N[�#"�
)
)'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
PK�N[�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>
PK�N[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
PK�N[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
PK�N[�>���+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.
PK�N[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>
PK�N[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.
PK�N[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>PK�N[�
$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)>

PK�N[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;
    }

}
PK�N[ȗ��&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>
PK�N[�/�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>
PK�N[%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>
PK�N[�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>
PK�N[#�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>
PK�N[�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>
PK�N[��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>
PK�N[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>
PK�N[����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
PK�N[�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>
PK�N[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>
PK�N[	�_[S)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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/usr/share/pear/test/Mail/tests/smtp_error.phpt";}}s:12:"_lastversion";N;s:7:"dirtree";a:5:{s:38:"/opt/alt/php70/usr/share/doc/pear/Mail";b:1;s:34:"/opt/alt/php70/usr/share/pear/Mail";b:1;s:29:"/opt/alt/php70/usr/share/pear";b:1;s:45:"/opt/alt/php70/usr/share/pear/test/Mail/tests";b:1;s:39:"/opt/alt/php70/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:1709506447;}PK�N[�f�$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/php70/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/php70/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/php70/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/php70/usr/share/pear/Net/Sieve.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:3:{s:50:"/opt/alt/php70/usr/share/pear/test/Net_Sieve/tests";b:1;s:44:"/opt/alt/php70/usr/share/pear/test/Net_Sieve";b:1;s:33:"/opt/alt/php70/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:1709506447;}PK�N[�%Sh(�(�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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/usr/share/doc/pear/File_MARC/LICENSE";}}s:12:"_lastversion";N;s:7:"dirtree";a:7:{s:44:"/opt/alt/php70/usr/share/pear/File/MARC/Lint";b:1;s:39:"/opt/alt/php70/usr/share/pear/File/MARC";b:1;s:34:"/opt/alt/php70/usr/share/pear/File";b:1;s:52:"/opt/alt/php70/usr/share/doc/pear/File_MARC/examples";b:1;s:43:"/opt/alt/php70/usr/share/doc/pear/File_MARC";b:1;s:50:"/opt/alt/php70/usr/share/pear/test/File_MARC/tests";b:1;s:44:"/opt/alt/php70/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:1709506447;}PK�N[<8:+:+"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/php70/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/php70/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/php70/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/php70/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/php70/usr/share/pear/data/Mail_mimeDecode/xmail.xsl";}}s:12:"_lastversion";N;s:7:"dirtree";a:4:{s:34:"/opt/alt/php70/usr/share/pear/Mail";b:1;s:56:"/opt/alt/php70/usr/share/pear/test/Mail_mimeDecode/tests";b:1;s:50:"/opt/alt/php70/usr/share/pear/test/Mail_mimeDecode";b:1;s:50:"/opt/alt/php70/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:1709506447;}PK�N[���9IIpear/.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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/usr/share/pear/Net/SMTP.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:5:{s:51:"/opt/alt/php70/usr/share/doc/pear/Net_SMTP/examples";b:1;s:42:"/opt/alt/php70/usr/share/doc/pear/Net_SMTP";b:1;s:49:"/opt/alt/php70/usr/share/pear/test/Net_SMTP/tests";b:1;s:43:"/opt/alt/php70/usr/share/pear/test/Net_SMTP";b:1;s:33:"/opt/alt/php70/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:1709506447;}PK�N[�pear/.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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/usr/share/pear/Net";b:1;s:39:"/opt/alt/php70/usr/share/pear/Net/IDNA2";b:1;s:49:"/opt/alt/php70/usr/share/pear/Net/IDNA2/Exception";b:1;s:50:"/opt/alt/php70/usr/share/pear/test/Net_IDNA2/tests";b:1;s:44:"/opt/alt/php70/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:1709506447;}PK�N[�,{�.�.�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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/usr/share/pear/Mail/mimePart.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:3:{s:50:"/opt/alt/php70/usr/share/pear/test/Mail_Mime/tests";b:1;s:44:"/opt/alt/php70/usr/share/pear/test/Mail_Mime";b:1;s:34:"/opt/alt/php70/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:1709506447;}PK�N[��$,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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/usr/share/doc/pear/Structures_LinkedList/LICENSE";}}s:12:"_lastversion";N;s:7:"dirtree";a:6:{s:51:"/opt/alt/php70/usr/share/pear/Structures/LinkedList";b:1;s:40:"/opt/alt/php70/usr/share/pear/Structures";b:1;s:64:"/opt/alt/php70/usr/share/doc/pear/Structures_LinkedList/examples";b:1;s:55:"/opt/alt/php70/usr/share/doc/pear/Structures_LinkedList";b:1;s:62:"/opt/alt/php70/usr/share/pear/test/Structures_LinkedList/tests";b:1;s:56:"/opt/alt/php70/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:1709506447;}PK�N[��3���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/php70/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/php70/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/php70/usr/share/doc/pear/Net_Socket/LICENSE";}}s:12:"_lastversion";N;s:7:"dirtree";a:2:{s:33:"/opt/alt/php70/usr/share/pear/Net";b:1;s:44:"/opt/alt/php70/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:1709506447;}PK�N[��|&|&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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/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/php70/usr/share/pear/Auth/SASL.php";}}s:12:"_lastversion";N;s:7:"dirtree";a:2:{s:39:"/opt/alt/php70/usr/share/pear/Auth/SASL";b:1;s:34:"/opt/alt/php70/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:1709506447;}PK�N[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
PK�N[���
�
?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
?>
PK�N[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"

?>
PK�N[���^,^,&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.
PK�N[����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.
PK�N[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
PK�N[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.
PK�N[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();
PK�N[�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:
PK�N[����((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.
PK�N[���!!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
PK�N[��~���$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";

?>
PK�N[���)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";

?>
PK�N[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";
}
?>
PK�N[~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.0PK�N[���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!


PK�N[c��^0,0,+doc/alt-php82-ioncube-loader/USER-GUIDE.txtnu�[���ionCube Loader 14.4 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.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. 2025
PK�N[}��6�6�+doc/alt-php82-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:20250130155421Z)
>>
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  
131.750000  0]
endobj
12 0 obj
[0 /XYZ 33  
296  0]
endobj
13 0 obj
[0 /XYZ 33  
97.2500000  0]
endobj
14 0 obj
<<
/Type /Annot
/Subtype /Link
/Rect [71.2500000  66.5000000  144.750000  75.5000000 ]
/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��][��8v~�_��FI���@w� �0l A�l���8;��Ϗ.TU�򱪾�(���H�\lR���_�ۗo��#y����|�r�RSd�I���ej�'�P�{��Ï�����s�����~�n�|���{ޡ������/�ɿ��{�_�]��.���#L�,/������Sd�Nu%���=������O�o�>���2)�T������魞�eZ	�s�e�]y��J7ߕ�5X��}�I.����/�ߟ���ㄪ�>Oʰ�WVEXx
=��12����E��?�fy���C���}�5eH��5�^���k���N��%y����׿tjJ!����َ�"�t��ӈ�Gre�s�n�L��)�s��ӈ�GL��=�FL7���,�#��u5yNկ�������|�[�k��ҎTi�=�]<>g<�
G>�#&UE���w ���D�o*D����
aϧ�����Ont)�}���o��ɻ�����/_���ɇ��Ǘ���xy��y�������sf}��6��&-��.#�wV�-�Ϡ��7��t�w�i5����Av
u٣�N5����}�i9>wQ�9�z�v-�-�Ң{��y�TM�K�պ9j
�M�0D0�p?O�|Lg��Y�����a`�9�
�����SL�I7�H˞]��
B�a�X���x�ρ��s,�WSJ�*xs�`����q���-��}���;�ۈqS7���i/ƪ@���~��S1���[^o&�'�^�/8ާ�s�B�+y�����q��6s�1��1w&8�co�����&��:���b�"��eBѷ��R�)g#�fW���x�c׌��H��s0�������ɮ�EVv�:�a�Y
�|��>2��ءӜ�ַ֊��El��|�_w�{�N��A<����v�V)a��-�ë��lr
�E
��Z��-e�`�->S��Y��xݵT�^k�;�
�1M�{�v��w��:I#�(@�(Yw\-t�9]�����4b�Tr:��9cG�<:�&� ^�CQ�j�t�U��	S|�3A�8g��M�^���c�@8Vðf���c��5;�s��@�9�>!�ٽ�5{�����%)�&ěpW7aMW�g7c�R��<����&M��o�ףO��{�Y��Ms���|�tFs�Z-��`�b|����~��z�?��^���{��G~�����o���bN�ҝ[�V���5t��8�q�f5*؈p�:H��a��K�u���–n_��99��F���] p�9��\rSݟ�LfG��Օ�6��` 1|���=ę0 <dz���#��ص�.�#��1J���*K�|�ɔU��T}���=��(��DT��?6��3��)Z���1��xG69Qp$�#�p���T�<��gbo/Į�j��2��|�#��?����������8*I�d�.6��u4r��Y&iRqC�
c���
��PF\Ƥń�<N"H�����,�U�щ�d�>L��N���L����4�шy��w�!�5a<t��k���2���g?�W�g��e�-镫��� @'-��~�7�?�$�h0W�.��-��m@$
�XL�^�3�
��ǁ��L�T(A����e�n����v�W��7����U��\KL�q,����j�^Y!��D���a�M����`p	n��$N&$0�J5��?",�~}�����3��d츮�M���rb�#�($fR��>m��~��E�ofw(n�K�ox,��ŰƄ�H�Z�)&�X�c�n�
3L]0�|�5���x� �b�X�Zڈ��׏��r�_��TK�WL$�W��p���,�9�&F�Q6ܾ����*u��կ9���?���{Z�ߙ���5� �u�_�9��L�O�!h��IH�˴{UN=K�$���ue��B&Bm?ץ��9���b$k�<Я��l���t�!:98"�D�Ah��� ���i㣗4J�r
�v�<b�x�U���9ۊ����E*��__�_ߚ�Y�a�T��[�b{h�l	������"���/MV
��L�/Y����1��1�s~�1�
��Ռ"�׿�Pu�ٰQΫ�p5ח/0oe2J�.�)�^��i�9�TM�&��cE�JkY�?��~��2/Êaeq��r4n).c<C��fD�P�L���ע��φʋc<8�½0�p��Y�k���7�х�k �Ţ7s֍�ni��;�%�҉���vF�c���ե����t��Y��oZ�Se�f��L'r18�X�.��s��K�)Y
8�\�`��v+�i+�$�RɯݗZ���BW��[^��(i���RiY�ʺ��T�V�W�a�2��Z����gԿ��$c���OA����cp�TG�_ ����7N�k����I�a��ğ�-�v)� P�H��\�0;�d��"h�2�W�� �x1��Ȓl�fpıF�âO�s�
(T;�⁀��#�L�I^�l��֯�hT�߮K��J(;�@A9ҒHKV�%Gߪ�T��<���y*��)��<��j0I�ku:OY��<eծUu��w3�d�ZK�<U�k�<��|�5�ɡ{�˯�JiCX�b��dži����~�,�җ��6<rf� �"Kr�7R#��,�(�F�7����aq4�R�.�7p��*�j��vPL��jx�ձ�M�:y9�:��Q��������T�V�:y1�:m|d�1P���`��k-�:���L���
2�g�C�w��߮T�6��5��cr3����-gtR4�7�r�J�4�9ጲZ8Y�!��(,�3Z�m���&E�KV&�n�������)�;����L�2o�2�iP�Vm~��
Jg��z������T�V�A�L�hP�M�o?T��L2v��5�ZH��i��¶8�8
��n�q)p����e!R�<i�B��*�iE�����Y���U��
;�p���� ��U~�m#���ԺS4�(b��]
&�v�Ni)�"�_۵�Q�`��L2v���#O#�MT�ՇQ6���r��֧r@��0p`/~Sj���B(��pձ��0�}�����9b��`�8/�M(��j�S�?Մ��xpx�6���|�v�E3R���.��,�Bԇ4y_�ƶ�03��؝yqY��f�Njj��豤��XǒZ^RK6U�Ϯ�ߖ�a�m�Y	�ӓ`f�ud��s�k߳�hޚ*�
�k�qo�����z�5$�����W��3�k���L*m��|�75/:QT��QS�i����T��bANx��(,~��VLW	'�;�l%�Z8��fn1WGe*^�v�3�s��ֶ�l�Uc�1�cKR��vC�u9��ܤ�;��~��M
[&��g��%_Y8P������IM5V�;��Sk�pT�3]��ϱxw6�j�SL��F��
|� S=`�=��k��T*GsT��b��i�V2T7��j&��G�	#�ln2�R�s�@�i<z����ʉ~����d�0�bB�O��m��"pC0�bN���K=���$���"m���F�{�|��C�P�	�8*��W6
����u��C�����W�2��gn����׳B�
��2_��a�*B\칺 k�@Fv�2FpL���g̼��L�C�1ta��3�Y�H���-�Ӊ��"!�*O>�9�.�[�J��c�p@���K��:u�%�ʑ]�E.j�4�WaY�W�R(�j����׃O�q)��1WF:����i*��=�ƛ��X�-��g1f޽����ύ��J
'V�%����ȓ��UO)���"�0R�s$<�O!ެx���fI3����A0	�?��^뵽�f��i��'�}���a�&lM�42,��
]ji��2�>t���ˠ��`�j�S�c)����;���&U�ݑ�2U���c�慜T���B����֡��ӉM��Y��ϱ���Y�XA�st�bނ6����s ��s?b]Gc�^?����)zLF���S��v<�|�����ݦ0��2�qc�w��왎(û/��-y�>y��~�����#y�!��!y��r0in-���D
)H� ��?�\_�سtY�b����1@ԭ_��)����($����Y3�`���D29K^˕1p�5�b����Mo����7��I~����`�ôue
�1��op��0�`�!�n3QA�V
���P!%��fxp(:�6-Æ��+E{��~���{~�W�v4 d�'pSI�o3ɳ��"�)�1I0�"pN�ΰ*�WRw!�}4�
!����9wV�4�a+d�6�u���S�x�w�1�1;���(��F�}3�s��Q&#�)�@�)LUbc���e�oQ��D���y����lQ�7"�
fQw0<�B3�yaX3�>C6�Ҭ��[fF%`�lw0D�z�fb܁��o]�G
�c� 
�a�"_��gS���`��d^����7#m^z��f��X|1}�sa�HP���,㛹W�욹W��i�^�YӀ��4soW�I�]�m�^=�̽��]��4so7�IƮ�p3��T�`��l;��~s��������n:�0��6m����f�.�,��h�>��J1�vw�x$���G�7+���G���j�ρ�ԍ��<խ��H�7���p��멡�ԍ��<ӯ���T?�/�((�'���ի}GQ�D�H��q^fv�f��
c>9����� ҃M�G0�-��gxැ�ߐ9�>�9�e�o��c�YX���*|��T��;�7�
��M�F?c*Py��ן#SA3��T��5�l�T�2�^66t>��y�_oqS��+'FSA�� �
�j�h��.��E�l�Ekѱ�sĢ�5����,�.��.�w�0c݌��<ӯ�8��}٭Ȣ7n��pBżm�!��84F����z\UjD�F��g��݅`D��Mp-u/��fNp-�N�,˱�ڌ��<խg�2�\Kk�*��ڌ��<ӯ���Z)
��z9�,��D1��Ĭ��-Eq(�8�@T�h��^.�y��$�������$D�
6��PPjG�`�������A��Ϯ'F�R;b�L��҂�&
Joc�欞�i�a"J��#8{��)�pb��:=��Q<ݴx�6:�/ة�|���jѲ��~[�&26N���ĝ>�#CnԒ�#�<;�F��&�rA1���d}5����w0���~$���
�t5�ڟ�$����r�PI��(�2U5�f��9�V7
{̰�c���q�1�v ����r�M�j��p��	�~�t�X:)�v��f1�:��=�#�3ŧp�!R�`�h��x|K�ix��"9����o�R���_ds��E6�\ds��m��{N��0
�Fy,�!{J�O��������I���ޜr�gK�Z�p���jڎ��~s�;g�;UZ���0XLM-Y�g�s�i5D��s�9ֽQ���s��Kp&����gT��nE�k�f���=���33#�7�g�����z�x�w���J�����	JR����zB�v�)�ka���
Ʒⵃ0�����X��Y����Ǟ�NL�G���9ܩ�O��e!�E�Fd�aD��X��\0�$�����S�kk�qo�"��Ҋ��q��|�5�������Yϭ��T59(j�p仼��W���=��A;�Nw<.=�A5�]�<���kF<�j��+��y�*�GT�'e���w�����7bo[&�L�.*���SN[����k#/���53c����.l9H:T96�a�=����#Bm�"T&L�`ج��T��M�p�f����)�
�L�VA���h��@����[Y�9֬SLu
�VC4ᢚVy��{��$�5.U��!�������Sl�)����ɫ��t��k��$��RzQ����x��{ʤ���3΂��������'��H�@����EaJ�%0F6c�JnJ�H�]~=���z$�K��o�=	�R�4�yp`<�k��i�R�@�u�[�ނ�@���< ��p�g��XL���Nل��ݴ>���׮�pc���_j�1�g|`LQ�L�)�Ѷ�>rS0��e�E)��*F�,�^���Y�ê����2X��j��wai�EU]�!�1~T�4^�E"�n���4��ӳ���W�1��r"�Fg&��2��oh�>#.<kU˗��ŀwP�ptk��]�s0l�Zk�����	�F��+����S�>��K~8�|z;�*�~N>�I�˙
endstream
endobj
16 0 obj
6379
endobj
20 0 obj
[1 /XYZ 33  
760.250000  0]
endobj
21 0 obj
[1 /XYZ 33  
672.500000  0]
endobj
22 0 obj
[1 /XYZ 33  
158.750000  0]
endobj
23 0 obj
<<
/Type /Annot
/Subtype /Link
/Rect [102  696.500000  175.500000  705.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��][k�H~�_��Ȫ*�.`�maaL���C�dv���d��+�JmK꯺��QIrk㶫���:��\��o>F��#����-zr?o>l�8�I�_T�{������P�}���l�G�7����7���x���h��4�p���"�����_��~�����e��<�_�l��痿�$��TeQ�=�Z���?��V�H�"I�6ڨf,��߽x��=��K�gi�آ��mZ&����&o~���JuE5�迟6�V�?w]�X]���\�؎��:)�Ĕ��]�&�vm�w]X=Q�:Iҩ�V:��k3ݬm�w�~� ���c[׏���,R:z�5j���X��2���KtYq�۫��M�L[�C]�ݶ�b�iV�5:�LRl[t\6��hɷ-YlR�k�ٶ�q���Ӣ�ۊ�ߦ�{F5C;f�ʺgt�t����Ūf�[�kɒ�tG-ۏE�xf�w�j[��768S��c�<CЁʶ-*iሱ�Pccf�W��^�d��;�z�L=���h�N��z�n�gf��ZU“Ep�RU�7�����#P7��6�{C��Y˟k�6�	c���Sg��ʡVKM���ⳍ�vݞ���·u
�֔�􆟁3U�n��h(�.�����u+�d����pl�,`���L��Cڡ�CU�Wam���@��Ң��ū����[��k�G��YQ<6QY�5֞�:�������aLT��W�je�~Ō��%xl��q�4sd���{��p>�}��ӆ��q^�9 >-�B«������lY%�IBʾ��S/��2r�s�	�Jiӌ�Ϝ9��߆׍�q?�؄W�uX�1���0(>?��Q{��P�@s<���
�,���9Ƣ �A�=���fzռ��!Y����2��68��#��`��,����5�ش,�ʌs�72#���-<Z�!��y�(���&��H��1)�3�5�H�㑍p�L��i�׎
�(���(�Ö#�_�������LM߶�I�&��X��Ԝ�Y棢t��=,�O]�`��Lg�c��~��||�Dc<c��]����+F�y����L���M���*y,+S��<�V'T���і��1��P���o������"�yZK𹓃r���;u�Z+ĩS�wwF����윪�o��g܊�=�C�������i^w�3-������-o���
��ma�s�=-�|��[k7��V]|���kty]�����Ϗ���]^EWW��Me��Ԭ[:�-�����@z�x
Yj��$�S����x%�Q��Pnj,T��	.U��9%A�itzSQ6�`֩���qf9J�ך�����!v�Ѐ���=Ϻ1#M=�*�h�ŒӠ�]K��J�^��b''�U���@/Lo�N��:�dD00�h`��]�i�c��P�t!*��IE��|1�I���a*Ɣ���Hr	v�^�ƊNmՎ�9i��lL(�:D�d0�a�ztZ�дCr��H��uW}N�_]��.f�"�=���i�zi]iӥv,�-�#'���̽��AP%n�Ex=�;=���dG���lt��ӬC���Ɣ�8�'Iq
O%,&�
%#�F(�u���u�Y���%Ťp�"_�!r�* �	k	�L��̙�i�H*�S�h�u��u�OMYf�2�5��L��Z0e����u
_�ܨ�I �F�Dcӈ��Ri���U����х���"!���S�J�T#F�I��c��>ƶ��ƒ�k���-�u��Ze7}խ���q�Ͳ
eh��E�'��QO?E{
�	����`7�8z����6`�;���f\?.�w����:�昬7��M m�z���k�۽�た��'Z��^:~z�5����6*���06{�-0��S6/+ΚD�[�vL�'SJZM��RԢ3ؒ÷�?c`�{�Ƕ+Yp�v���
?��CN�=��X���~q��cv��Q�������>;�={C{����-����kf�:�EA�2\�c�(�py� �\}E^G���̉�t\&f'��e| ��Ӣ�ZZhDiaܢ�( %Q�2XQ�h�Y_��2��s�*︨_&N���.����?ӗ
UR+�n���Ƕ͜��"�! �TD*+�H%��0&UcLy�bLnj��1ݞ���0�|��б�ɔtn�H�zI�a@?��>�w��ZO?p���P��p���h��u�?�
����׀���3�����mx>pv�){J�vDxfzD�;��8"J7Ӂ�\8��Ԧ�eo{f��ɫ�2!�TBR�[̙��P�P5��LgL;�[ô���
=�`� �G��n�w�L<
�N�g�O�^��ee�,f��w�2�eW��:���F>���QO�u<gY.N+��
N��Q��xu���g�����5�s�5�iM�2E�y�!���!ѬvFV�t��)X���9'���5�i����j%VPa����%�.����z•���4��D&
��у��PQ��WӔ�K�	D��S�%�S��7f�Dtc(z���c(8���R��#�C�YSl"��S���)�CY��n"���N�}��1o����A�pd���%IJp���T���N�(:ĈR�2��Rr���o���[Ӭ_q��8N�_!��zb��I��b.\�\W5gj��AK�� 2��P9���R�����:5]~��2֣	�)U{}r4P��9㫢!�]�	N���Q:a��H2��ZF�Jx`8c��R�B�<�������L֑��ߕ3k���
ߜߐ��D�R"��rԱ��|��	��Ռ�]�����хSC$�褲�I�59f��]�*�jq�1/�|�cN��#�xl8����*4D�,\�œ�B����6�R���I�3��'զiQI||�OQD��a8���"56,v���f`{�1f�"��)Мq��
 ������E��dZ&\;��:)�:��.�-����I�zc�#X(7��&�J�Ya�sm������5)���r���6�U
�	˘v0T��|�:Õ�3�p4AUA�QSz��l����}���PWN0�o�f&
=P��$p-ҁ$�N-꘠�F��YWa�zeyqJ(�䭭5S@`r�D$�w�eʛ ��ں��k�K��]�ʚH��s-?��eO�C|����`�ū�]��NZ|�^�%�|�f�e{���oCA�L�;%���b\p�q�@�D��Y__q>.+Y�6��dwA��REsj�p�-�Fvi�+���75���g2���t"C��@������iA/L]&&�;ZTa4/J'c¢�u(Cp��"�ra�!,Z��|*Hyx���g�|�!�K��Ҥ���Ɋe^��9��[8P0*e0�D� :ZF�O�+Yu{�4�	�Ǻ7��8,��k�

��֙���%!�F�u�"�{8�؈;N4����\���p��sL�'%�]�G��f��n`竩�ʗ$
��W3���CwӟƼ1�NDY�
<j�?ؕKd=c!�Y��8C�s% vM3��%#v�L�j�|4n��
�3̮���!Z&����C���'�u�>��a`��_E�d��dM�*Ü���C��'�)ܽHת��J�b�	#8��%g��3�e���C�ݭ��$���t��s�;���?����i��fH�MUv�4�2N�~�Y�bE[dg���y�[��u�dE
�pL\���x��5p��_����G�gZ��%-��'�~�q?��i:p>�G{�;<86Ϩ�Z�)E{�Z����Ňo�F�����~������Utu]�����I�Ļ���{��MO(l���>H"=�������.��gڿ�tJ�/~�ǯ�߆Qc�~b&�^`�`�36<S쩹{f1#��<k�;�1��(���*�mN�]*�?�5���P	@�_\!�dR�2LX��%g�$H�&�@#|��
L�B�DR�T-���e��1��r�<Ӄ�#mu}q��O*��d͇2��ZD��S�|ژʒ.mj�c:ϙ�}���Oi��T�ޗ����T����}�m����-q�vY�b0�e�e3!��*u�2bh,�m}ߎ��s�ަ,�)���Z ���w���]�g�z�
S��p"e�0.L��>w$!�S�
�T�����Ϟ�ߊ��s�y����'�Mټ����uK�y.o�7��Ow	0��7�v0����bJcȂ��0��<��Q�;���Ս�Ӎ�@7�N7����tc�W7�N7���:��vtcD7�vd�u�<�=+r��E߽;2��d�=l��S
endstream
endobj
25 0 obj
4362
endobj
29 0 obj
[2 /XYZ 33  
122.750000  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��]߯۶~�_��QDR% ����A�a�C��+��h�
۟?ɢl�G��=�$�-��k]Q$ux~~����}��?��O�>��O7E�l��u��:�B׹�������/����͇͇�߯�a��?>��y�?k�����f:�s��/����������S.�V�����_UQVyը�n�/����߾�~k�Q�uQhm�Q�\F���EcrS��u�'}�޼����)U����\U��sS4ua�F�8�:Ӯ6Y]����������L�6j�U�v��z�-˹]٣G��4�i
�w�6���L���OY?�W��Oݤ_�J�٧�7�����/�k�cd�ʷ�+-+��ck�+��^�y��rp�m�T�)���T����NSTz|��J�'s�G�y���Q��NF�g���}{�iZb)lKC�g�m���>��c��P�mYE�������.�~��J��P����Ŗ芮�G���g�G�s��	���<�|�4��wľ���{�[PO�
�Q|O��RK�����liBQ`�0��R\n{�xf�',3b5����h�>;��\#>.��3��S�˕=�G�p�X�a�7P���]1�z�w�dn{�Tǣ����;�
�
�SL!�9��8^)�~�J��M���k5�S]���&NcO	��J1+
�5���g��A9�U̩'T�نs���;�g;0L���̿o�����$��E!�-�`�_��{��4|����w��s�Ѱ·�~�	֍?����ϡ�)>��,œj��h�,���Jg|^i�]T1l�5o�9�mc
���ŋ�|���kF�3r�
����R/~�hS{?��x^������#�1��+�s���O�!��7�K5Bã�xLU�v��5���`���ю
�C�d���L��L;w�s�<�Hfn�aC�Q
"�,��)d���u�=��D�ak��Q���X�c�/���r����X�a_�����a�8�!4�
a<�8��d�\���!�nʒH�����̬3ұJ��1��v���q4·&�!�:����坨�)�	{K�g�mh|�HD,����vCx�(l�|a�/~��i�*/Ϟ�h�S	O��P��/�DL�c��o���:M&1.Ӯ��T�(m����ДݷMfl���Ƙ�nli
��1��L?^�w�'�q6���l�w�'�W��>7�����7�v�%�R
�b��� v)��:î�����e�?�	̸(0�"f��eR�9�Ue����b�sZs���DZ=�AkΉA[�b��y$�+ft����b��Ġ-�xű쮸�}nor1��ދ4"��`�F�7o^˫��&%��f=G�i��.'~u��{J��$��D�hxw�Y��-����=
����'�m?����+)=Vڙ�R��q��@=Djh����F�ר�D
��$��0f��
f,8
*�<��v�̕#��=&U�EgM�W��:�D���R�wJ���hIK��H�C�T�X�w�J�dV�@� ]SPeF�L!�i�zj_JU���g�0)��l�X�{�q�2%c�)܏�M؟�%���?NȾ1=$��Uy�X���X��-���9F�m���}��G�5�<�k���G(��7��
�M�k��-9��5�I��6L���a��t%�2�0%u���l@1Ʀ	��X5!��	�V�l�F��HuW��>ӏ煐n�	!�gu?��Pwō�s�x��vJ=�:I�'|Xc	��W�J(I��'P�a�[N[���d.��=1Hٸ06>q&��u���O�sc�W���C��J1�2����Ʀ%ƣ�H(��*S�����4Ʉ`��.�:x � 6+�l��`� R"r��k�uJdu�%ci��Ho�Ա�t�3$қ���\۵%�PJ�? �u%��Y��jb�8%]�Y�D���Dz�B�x8Z��͛bo�ԁ��JJ��;��)���Q;����N�Kn�i��o�$x�#��G�:�DG�K��D��z�R�R�BZ���C(=�x�B�����l`bс�K����K��f'�����ޛ]��\OJqN)�aJL)α��M3�CJq��g��o��~:���v����9�.믘�}�o�]�~:���֏w����F��a����ڧUvd��F+�S�İ伳X{�d'6U�F6�l���%;Vdx1�����4�k�mz�|���bF��~<���5����cF�7�;��
�M��w��,��C	��"ӞR���͠d��u��o[p���Od\�L�FYe<I�E����7�(p�xJ|�t�;3�\?��[oF�쯘�}��K�s��o�x'f��f��Q1�	e�0�����dV�;�&J�ξ��Ғ~?�c�#�����0:���=r��VE��\]��~�6�p4�4d�0�"�R|�h�3fp������q�9!��;
��"��Ce��<�յ����N�s�s��J�d��ld����P���'[l��+D�8Z-aѽ��=ӆ�rO-8�("�q��XE�0�%��i��$Yr�E{����ej����A0ώ׊��'۴���2��ފ���_��������HA�̖�hG�
5�&7t1��wZ�zO@��.1��c\�9�33P��)*%�V�ܶx=Li"\	;Zq�!Y�:Q$kՅ��z��x��n�Kkԕ*�p�
"�qkPvk0�d�2���N���iķ���)����1���$�� *���s�E��f�p��:�W�4�Z�p�^��>q��f�w�/!x�a�jD����ڬ�V�\W�Q�Np�&zΚ)6��	�������%�X���v'�a��.��4G�]^۫�Ԉ�d�����i���D���ɋ�i���d!���(`E
�S05��d���0�	�<Z�;���l>�%�Clk�T63�j��U�˥�C�-M��z�D8�8Z�=�B1uK/e�i�*�A�_�C��d��=/i�B{��B؏�W�=<�9�<"Sۮ��
���a�����|�sD�����@t����x���M�E���h��D��<�=8��R�i���X
Y�e=3�G������b5�����Z��8�mw�u�xkd=I҄��0>t&Qg��%hG[��{�|�J��?M�-�N���rs�Ө�M��ȾZ2�_D�Mh�VM1�'&1X����{�e뙊�~Y4���p�q1���l���7�
Y�-07l�0�3eO��=?z`�����pNe+�&~jsK��e�zu��H���$|?�Q7�\S�e�R6��e�D�[`w?X@b0~��9.W7�`٬M٦DK)>s�M4�� ���yͮ���,���5b�p¨�!:FP�.ք������I�{Sp��)pS{��u��|kY�1�@ٜs�$u�U��������&�Z@c�h�jA�{�h��0o�;)�e���'�-b�2�#��E#���/���~I*:gAP�T�]��t�mA�==P9��K��Pxw�zp)�K]z�f��uD{2��T�}�+�	C��~.�P�M������R�C�q�{b�K�L�����`���h�
�>A��ݡ�'�*2�*���K6�R��H&�(T9VP�1�e_� !LX_�l.C�'��OW?�2hiLЖI|`����Zp�<�!��U�uHgL!�DJ��FHe�Dʞ{��%�����e�#tsʏ 
Hf\�E�W�[p˄%�y����C6%���~��@���jx�=p�O`�5�ҿ��0>O�r����lS�/
ܣj��d�s�=�Ze�rmp�=%�G���K��LJ"��Aհ����y��~�`рl����d�쌚|�nRluE�23N�Y����sƸ�rB��+3ZٜY��jFs���Q5�9�'K6�K������qn�\��ŝr�RUc.��JL�A&�ɸ�M�q�1u2���x=Tg5�
��y�@L���ك�Tp��)��0�?��*�P+
50�UYY�)Q�n(��2��F
��s��3����>T�X��H�e�
�@D%*�π�ek��j�8��L�,�Ra,�{�Ehk���u+�Eh[����"t�G+;c�iBUu�]�qY�y��������*+(�w��dmelj�륱RyY�x�?I�Y�fl��r��'�ɟ��<�]d�?�W����y��@��m7���@���u��'�M�gpZy�	�
�?�P�8�X��>&������͛�����������y��}����S#��t�Q����/OGKX-yu'qzO��9q�uQfz]j�W�'��q��PR��8.��g�Qp�
�5~���q�#�F0��v���BLj���ui���#��u� �<Ǫ<L�Lj�x���B��$eG�}S~R��1~s�Q`����]��g�F��A\����2�|&�Ō�JL`��tL�
�c�f��I���!�Ʌ���*��h�B6�?�5�r������9S�N1�_89�-�G;2Z���ឪ���LQ��\�S{b�Q�]�u���T�T�I5,�T�J����N�z(��_�����2�'Y-�WF����6�kO��C����T�}�T���V���M�}�3c���7��ucKS�o��g��k?u���订��k�w������~޼�f�l���U�m-w�c�UG+0�,?�
�i*v�2{@(��y���.���DTIej��Տ�"����s�T��T1,���i{̘ژv���D:����y��נ�;���C�a��l��
endstream
endobj
31 0 obj
4897
endobj
35 0 obj
[3 /XYZ 33  
765.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 14.4 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��[mk�8��_��u�jIP
M��AI�>��d�X�e�����?9gc'��L��^wj'�F�g4�������MLf�/bI�ټ��w��'�g�_�Pҽ�нX��ⱸ-n��Ǣm���|(&M_E��|�{��Gh�k��I��W��%�����+_�M+�>~�����*�����~�c����e�Rk��jl�|>3��Rz]=���-C���hU}�.�W֧�(c�&j�ixO�0��F|}W��=v�a��a�:7:�Lsg��xW	S57��ߦ?��.��H��I���3M{�s��l]-I���NOI�;z�m�c1}�c���:]��J(-�E�γ沸/lHތ����<���B,>U�5u��O5����2Va;k�Q�DV�#�:�qʭ��QkZ�$��}ܚ6+�++�Bg<J�N�0�=�s6$�$��=�A�d�Z���>�X0m[���ܬ$׋Y�	��*6�
h�k/Tj��虦=
�v��uԞ�J-�=߶w�Pq����H��'���i±TU���N�X<�����i�j86���e����
+��=J۟guI�m�h����Zs$1Dt��Op�.����}�~h�w-�
�M]�E��w
�-c�"–�t��6C�@V�'~2�r� ����r���ϋw�~���BL�f�o���	�����f�s�i�9�E�/��3�h�69l�B�-%9~Hk�$��A�Ϸ�%���I�x<ж��8�C�Hە�9�'|Ɯ�<��H1尚���o����:��	ýÊ���4u,P��:r��������kF�Lɣ�2o�9�5JX8��o<ی�o��0w�5;j��V��-7q}�a�q�����U�'7�+�wr��^�t}ﵳ1A��o�qi{����"�� �LSZ�����T� ق��dž[-��
J<l-@�5�(�����l5��V(���H�Q���&��Xpu.��AI����X.�D+[K�h{A�y�4��T���8�7=����T���l�p5R�XX�Dl5&[��a	
��g�8&[X��=�$�A�2�A9[Ƒ�>/�U�F�=�l}8��l�q���kΜ���x��yo��Z�)�`Te���/m�(�%N���b(c�S|=Y
[�WN!��a�a�i�:��x‘|�����̄���.Y��3?��>r��b$�f�8�9ebNfb�-�Xqkx�F-��r=^�Y3�U74�}��GʚG{����ɚo��9��L��É�qW
�	���Ki�������i�G?X��8��3��N������돶*��)#�<��������aX�*N�{<��-2��sh�Q�aU?�T/�T2���F��a���F����g�.����13�ގS������ [�'�Y�����B֬�^:�� ��F�_�U�o��u��|˾V���-W��h�#�D���D��~3���
[�Gj�8�18��<���Lk�o�6��L?��K��]bT[^����'_0��ls��K��[��Y{XE�얞�]�^u�����H��Ȍ��d��}����jz�
endstream
endobj
51 0 obj
1581
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+Ȍ�`�P`&�7�)ry" �9ܠ� ry+(*�&��&Fr�I0�$���[s=�xd�M6	0��g0׾���ꪯ���5B�
�L8B����j�=���bI��_�y=�����Н����q!l!���';Ư������삲*���`�B`l�1-���#d~&��UE$�,�v#�U����7�	Bh;��`:Rp����$��V,�-BGb�j���!K�������eD$$S�A�e�x?�4�C��Hm�9"'���B�j��S{5�A�M3ϥ����a����F9QG�5��S��rs���R�*Z9�%M1�_��$���Wq
{��Q�87���K��0Q.�LպA��t�'�蝝���>��y?p��rqQ�r����j���G�J�����J��˴HF���t4x�o��v�\�j��b��͍s�Kv�����}{\,�'�4��Sm��MAA;��Vo���m�����3�((D���'�.�J��^�Q�Y�˱
���˰�3Q�޸* ���5k�z�f����6�~�R��]�}��ȲF�uS��F7�� U
R�)u��Ͽ�c�}��q�C�O}��2��_b��LY9ik�=��W���h:�ցCq�[�x::��ip���V=��m���@��Z��)&���p�
�>�r���ө�͐��O��A����.I�C��dg����i�D���Q�Т�5(	�c^UR�w�h�m*�����x~I™��aT�s��=52b~������Y�%���,\'	���y2�� C.���
(����*����z�����<����zy�Yï\ޒ�]�$~X��Sl�&ž]�O=�ych0���b���4�>m���Ҹ=�GG2u�_8������
��g��_<r�9%���7ȝ+�Dv��4ȡ���	�P���*�����R�t�)lk�9��
[6}s�Ͽ(- z��7-��7/GpZ��->	����W��HNJH�O]pLTĬ�����8~�r�������Ӌq�9��~�-���e�B��ՙ�%�J�ʊ/Mݶ�K/TT� *��'6�(�ˁ�Z�=Hʚu�,7eew�wsr�^@�q��!�-@�,����<��t�[�w�3�Of�05�a���Y�L�{A画�-t�3���kȽ��"C�#e��	����B�5�shk�y�;�����[�}7�K�1�v���*�-�ta@#Q�$u�����;�	�i����s����E�1g�
@5E��c7��
N���7��7�aD�w�M[n�ݱ^Z��c�@85<��k���͟s���:���e�:���d���(%���z�r栱
�o�me�Ĝɀ�Q0��l���N�b�se%��f���[�fN(-?_��a�5�!A%ً�KČi.SfL���ٺz���}zf��5ST3f��Oܓ�`��ؔ$�Gf�`��C	���e�����S��7����h�Qy��j�Fx}CϳM�Qh&����fU�A���P\t!�R��C�.����:���g�C�����R��=0i�/�f�7��96Ԓ��|�8���g
�:Gc0���:���l�ε�!��j�C����_�!Ӻ���@lx�e�@L秅���榦ܬ�C�,���*���М��Q�us�L�O��{�ȎTo��q2_�}��3��-�Ȫpu��Ip)�y�f4��xk-i�O�x�8�e	��&7��Ouv@И��g0�T���� 6�gҁR�y��^��@��7�lc;r�&
��Y7s��R p���Wh�:l�<y��ox`����Bqp�9u��zl�Ĉ�fzt'HrS��{�,6\�75X���/���Ū��C�,k2�&� Β�Y^�I9DL���-9Ē�-�	�Aa�O��⋗�L]�E���	ډ�ا�c�-Y����!�`�^q�?����C�򲑃��܀́�Z���8�\��ҁ��O&%u/\0��{%��m�ɝƧ��ص�z����N@����{�y
�i��J����t��K�4L�Yf�)�e/_2�vU�\+/*�K�8�a�PV�|DĶ����Eb�5��h��um�z��\n܋Ѹ9i�:��s�w�^*e�>�M��8Z���U�8`XG
9}�M���-v���q��q;����|I8�ֿ���28����6:���;��>$i�y��:��yj_��"=nNN�w��,~��#b���bRӱ�r���<�ďCk[��;�b㫑[F'�#��caP�5��%�����f�6GF��n���}q=�h+���X�r��:7��{�{�
������*��l��H��F8-ԞY(3R{{��I�o!m�����.q��o�~��r3p����¹vH�R�V�W��`@;�?|I�ʸ�	�Z��i���an搋�=7��ws�,�g[�C�E����
w��Do�q{��e:�x�S��zE�Ͽ�3��Xc��Ajd�a��^�/�g?6ԇE�B�s!hw$�Ò�v�Ce~V8UT�NSz���m,�&<�f[h��4W��/q�H�`��i��\ø�ܔ��lQo�0I��ѰȲ����AK����	�	����[{N�7�F��5ԟ�i�z���?���A^��73��]�u���ĸ��Wr�?�,!>���w(������w삦ъ�d��9���
{�'��pn��_�&�S��{T��j��j��C��Q��Ć(8K�e�?������2w6]��NP�~s|�3T��x����]��[fa ��_h.^��\��u��,�o��!����Z��r"�s
ӡ��.8�Ҟ�K�钘��_�>p�fK�©���C�'�w���x&�47�$����1)� �.A�X�eV5<@�Q$!��H��$ǣ�?��o�,_��b|����1q�Lv��gs��ں���kSo�]I��s�<U\�矑��.*�-0��7_��7?6��tn�?����>2j���ܹR̟����2�����Ar@�\��;M�_�i.�]����P*��{�c}�F�I��a�S�r_��F��GLs@��t�,�L��Y	��e��Ξr-�
��VUmqۓ�l������%�^}��+d}�#~� ֈ_v���@<��
HqҨm�1����-M������_��N{09���Y�1����y~4��W�:V\��Oࡺz���K�û�z�
R���nc�C��

���?�;������@�|��@��k�M�/�Q
U2m@�Z����������{<�?����v�ֱ��1F���L]���2�)
�~*��w?�׉�22�\	��\s3�ف���ѠF�1�p���a4�bW�IH~%�~c~vVn�k���6|��
v=va!�[�Ö�ԯ��w�K@��O>�Ry�/�,X�b���+���4\��k~A�b��G�$���߁|T>SG���z��@CKmd�Ⱥ�Pl��[����V-^�i�[W6m鍈ظ����{[8/(�EO��^LY�r����1k�g�� $�nS`���d�͟��z+jU�h'����b.��r�zDox�XD�Gr8�'8�;0���koG��y5A��G`�_-�A�5�^�K�������~I��\���a`���Po�,���}F�nS�����1Q
O,[q�aIuٿoK�����mz1�v@n�,
-�킁D\����x���˽/��&`�6���G]��W
��5 �Y�ꖳ�{�5�ؑ�A�kX���.޴��k7â�%k
�Be��}�����O'�au��a ~S�8�ޅ�s���+^,*����k��$&���k����H���P\�
*-


(*	F���yi�C�<�,'&Noga[±Z]��1����3��19��;.������-{�t�)�'Xt�p��qw�s�����]�0/�\��uN���c�s��J���l����G���d���ؗ\~	q4��~�*`��w-eI��Ҙ��a�.�>"l��U[�]�t۶�G����u����/!��ի�ڒV�&�FF�F)�;�S�NB��Q_d���;W���4�.�q�����*��o�����K"A�L샩5Q�!;�/����ˌ��1u՚M��b�]� $h=Ƞc����G}��R:��eŌ��'�Wԥ�}�0R��Y���4��F�_�f��ZO1��]3�m���z0Ƃ�	T��x	9q{���0��0�=�*��7��� F�
��qęat;�T��b�?�����s�ϛ���<Y?��s2�7&^���4�8�yp����P��m��'?<�G�����1CvO�<S�����E����8�PvO���+�k%�����"��\�*�I%��r�!��<�C(�h�ů$|I��a�FҍEO'�]��U$Y(%�Kē�ƶY-�H=Bl�[D��3z�52�)�X�%�!]��8#�$�N��82�{�8��=r���1�I�lߏ'6^X��.��#d}�l������$
�x��Fҁe
�D��Ä��d:�Kƾ(,EXJ���C���+I&J�Dw�F�z��Ë$���,��x�O�D:�.��t#�;�rq\%w�����Z^�g�����`/L��B���p_��"d�&�Q��Z./���$����M�M��36l�ٺ��l�m���4f՘�1c��<6�IKd�#i�/;r�A��b�3�wZ���s�:��oX�<�oY�����u����d�
g�^@�HX?��)�z�Z�Ek��5k] n䶵.#N���Ǔx��IYGJH�"٤��P��o	��F��'�
#�$����"���w�Y�R+�H���8��֕�de���<<=U!FcV~�*�0m�jQ~�*�}*U�f�f�Td��X\o-�2,$ָ�X��H.��㒩H��fd�秖����Cg��V)�k�M�-��
��?�0���c��k�����x6�����x�p��EJ�-b����8�K~��'f��|d'
{
%��bO$�8�!‰ç�Ħ-++�3���rvjQjZv�lcI֜�����Ҍ�9�aA�qA�^�q��G+�
endstream
endobj
58 0 obj
5244
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 270 745 469 564 611 548 682 866 647 707 651 589 880 339 345 492 240 503 557 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> <0034> <002E> <0055> <0073> <0047> <0054> <0068> <0063> <006D> <0074> <0076> <006C> <0070> <0066> <0067> <0050> <0048> <002C> <0032> <0049> <0077> <0079> <0045> <0052> <0046> <004F> <004D> <0041> <004E> <0044> <0053> <0057> <0028> <0029> <0078> <003A> <006B> <0035> <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 
0000038255 00000 n 
0000000187 00000 n 
0000000282 00000 n 
0000000756 00000 n 
0000029337 00000 n 
0000038121 00000 n 
0000000319 00000 n 
0000000362 00000 n 
0000000405 00000 n 
0000000449 00000 n 
0000000493 00000 n 
0000000530 00000 n 
0000000574 00000 n 
0000001080 00000 n 
0000007535 00000 n 
0000000877 00000 n 
0000001053 00000 n 
0000007863 00000 n 
0000007556 00000 n 
0000007600 00000 n 
0000007644 00000 n 
0000007688 00000 n 
0000008188 00000 n 
0000012626 00000 n 
0000007985 00000 n 
0000008161 00000 n 
0000012691 00000 n 
0000012647 00000 n 
0000013009 00000 n 
0000017982 00000 n 
0000012813 00000 n 
0000012989 00000 n 
0000020361 00000 n 
0000018003 00000 n 
0000018047 00000 n 
0000020194 00000 n 
0000020020 00000 n 
0000018298 00000 n 
0000018452 00000 n 
0000018591 00000 n 
0000018987 00000 n 
0000019859 00000 n 
0000018784 00000 n 
0000019263 00000 n 
0000019391 00000 n 
0000019554 00000 n 
0000019723 00000 n 
0000020257 00000 n 
0000020679 00000 n 
0000022336 00000 n 
0000020483 00000 n 
0000020659 00000 n 
0000022357 00000 n 
0000022621 00000 n 
0000027977 00000 n 
0000028459 00000 n 
0000027956 00000 n 
0000029477 00000 n 
0000029735 00000 n 
0000037122 00000 n 
0000037327 00000 n 
0000037101 00000 n 
trailer
<<
/Size 64
/Info 1 0 R
/Root 49 0 R
>>
startxref
38374
%%EOF
PK�N[&�**(doc/alt-php82-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
PK�N[�_Y@����.doc/alt-php82-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.73";
}

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 (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 = @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 = @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);
}
PK�N[P�$���'doc/alt-php82-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-2025 ionCube Ltd.           Last revised January 2025
PK�N[$�u���%doc/alt-php82-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�N[�E#/&&+doc/alt-php82-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*
PKAb[p���(licenses/alt-php83-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[b[$�u���%doc/alt-php83-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[b[�E#/&&+doc/alt-php83-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[b[c��^0,0,+doc/alt-php83-ioncube-loader/USER-GUIDE.txtnu�[���ionCube Loader 14.4 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.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. 2025
PK\b[}��6�6�+doc/alt-php83-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:20250130155421Z)
>>
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  
131.750000  0]
endobj
12 0 obj
[0 /XYZ 33  
296  0]
endobj
13 0 obj
[0 /XYZ 33  
97.2500000  0]
endobj
14 0 obj
<<
/Type /Annot
/Subtype /Link
/Rect [71.2500000  66.5000000  144.750000  75.5000000 ]
/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��][��8v~�_��FI���@w� �0l A�l���8;��Ϗ.TU�򱪾�(���H�\lR���_�ۗo��#y����|�r�RSd�I���ej�'�P�{��Ï�����s�����~�n�|���{ޡ������/�ɿ��{�_�]��.���#L�,/������Sd�Nu%���=������O�o�>���2)�T������魞�eZ	�s�e�]y��J7ߕ�5X��}�I.����/�ߟ���ㄪ�>Oʰ�WVEXx
=��12����E��?�fy���C���}�5eH��5�^���k���N��%y����׿tjJ!����َ�"�t��ӈ�Gre�s�n�L��)�s��ӈ�GL��=�FL7���,�#��u5yNկ�������|�[�k��ҎTi�=�]<>g<�
G>�#&UE���w ���D�o*D����
aϧ�����Ont)�}���o��ɻ�����/_���ɇ��Ǘ���xy��y�������sf}��6��&-��.#�wV�-�Ϡ��7��t�w�i5����Av
u٣�N5����}�i9>wQ�9�z�v-�-�Ң{��y�TM�K�պ9j
�M�0D0�p?O�|Lg��Y�����a`�9�
�����SL�I7�H˞]��
B�a�X���x�ρ��s,�WSJ�*xs�`����q���-��}���;�ۈqS7���i/ƪ@���~��S1���[^o&�'�^�/8ާ�s�B�+y�����q��6s�1��1w&8�co�����&��:���b�"��eBѷ��R�)g#�fW���x�c׌��H��s0�������ɮ�EVv�:�a�Y
�|��>2��ءӜ�ַ֊��El��|�_w�{�N��A<����v�V)a��-�ë��lr
�E
��Z��-e�`�->S��Y��xݵT�^k�;�
�1M�{�v��w��:I#�(@�(Yw\-t�9]�����4b�Tr:��9cG�<:�&� ^�CQ�j�t�U��	S|�3A�8g��M�^���c�@8Vðf���c��5;�s��@�9�>!�ٽ�5{�����%)�&ěpW7aMW�g7c�R��<����&M��o�ףO��{�Y��Ms���|�tFs�Z-��`�b|����~��z�?��^���{��G~�����o���bN�ҝ[�V���5t��8�q�f5*؈p�:H��a��K�u���–n_��99��F���] p�9��\rSݟ�LfG��Օ�6��` 1|���=ę0 <dz���#��ص�.�#��1J���*K�|�ɔU��T}���=��(��DT��?6��3��)Z���1��xG69Qp$�#�p���T�<��gbo/Į�j��2��|�#��?����������8*I�d�.6��u4r��Y&iRqC�
c���
��PF\Ƥń�<N"H�����,�U�щ�d�>L��N���L����4�шy��w�!�5a<t��k���2���g?�W�g��e�-镫��� @'-��~�7�?�$�h0W�.��-��m@$
�XL�^�3�
��ǁ��L�T(A����e�n����v�W��7����U��\KL�q,����j�^Y!��D���a�M����`p	n��$N&$0�J5��?",�~}�����3��d츮�M���rb�#�($fR��>m��~��E�ofw(n�K�ox,��ŰƄ�H�Z�)&�X�c�n�
3L]0�|�5���x� �b�X�Zڈ��׏��r�_��TK�WL$�W��p���,�9�&F�Q6ܾ����*u��կ9���?���{Z�ߙ���5� �u�_�9��L�O�!h��IH�˴{UN=K�$���ue��B&Bm?ץ��9���b$k�<Я��l���t�!:98"�D�Ah��� ���i㣗4J�r
�v�<b�x�U���9ۊ����E*��__�_ߚ�Y�a�T��[�b{h�l	������"���/MV
��L�/Y����1��1�s~�1�
��Ռ"�׿�Pu�ٰQΫ�p5ח/0oe2J�.�)�^��i�9�TM�&��cE�JkY�?��~��2/Êaeq��r4n).c<C��fD�P�L���ע��φʋc<8�½0�p��Y�k���7�х�k �Ţ7s֍�ni��;�%�҉���vF�c���ե����t��Y��oZ�Se�f��L'r18�X�.��s��K�)Y
8�\�`��v+�i+�$�RɯݗZ���BW��[^��(i���RiY�ʺ��T�V�W�a�2��Z����gԿ��$c���OA����cp�TG�_ ����7N�k����I�a��ğ�-�v)� P�H��\�0;�d��"h�2�W�� �x1��Ȓl�fpıF�âO�s�
(T;�⁀��#�L�I^�l��֯�hT�߮K��J(;�@A9ҒHKV�%Gߪ�T��<���y*��)��<��j0I�ku:OY��<eծUu��w3�d�ZK�<U�k�<��|�5�ɡ{�˯�JiCX�b��dži����~�,�җ��6<rf� �"Kr�7R#��,�(�F�7����aq4�R�.�7p��*�j��vPL��jx�ձ�M�:y9�:��Q��������T�V�:y1�:m|d�1P���`��k-�:���L���
2�g�C�w��߮T�6��5��cr3����-gtR4�7�r�J�4�9ጲZ8Y�!��(,�3Z�m���&E�KV&�n�������)�;����L�2o�2�iP�Vm~��
Jg��z������T�V�A�L�hP�M�o?T��L2v��5�ZH��i��¶8�8
��n�q)p����e!R�<i�B��*�iE�����Y���U��
;�p���� ��U~�m#���ԺS4�(b��]
&�v�Ni)�"�_۵�Q�`��L2v���#O#�MT�ՇQ6���r��֧r@��0p`/~Sj���B(��pձ��0�}�����9b��`�8/�M(��j�S�?Մ��xpx�6���|�v�E3R���.��,�Bԇ4y_�ƶ�03��؝yqY��f�Njj��豤��XǒZ^RK6U�Ϯ�ߖ�a�m�Y	�ӓ`f�ud��s�k߳�hޚ*�
�k�qo�����z�5$�����W��3�k���L*m��|�75/:QT��QS�i����T��bANx��(,~��VLW	'�;�l%�Z8��fn1WGe*^�v�3�s��ֶ�l�Uc�1�cKR��vC�u9��ܤ�;��~��M
[&��g��%_Y8P������IM5V�;��Sk�pT�3]��ϱxw6�j�SL��F��
|� S=`�=��k��T*GsT��b��i�V2T7��j&��G�	#�ln2�R�s�@�i<z����ʉ~����d�0�bB�O��m��"pC0�bN���K=���$���"m���F�{�|��C�P�	�8*��W6
����u��C�����W�2��gn����׳B�
��2_��a�*B\칺 k�@Fv�2FpL���g̼��L�C�1ta��3�Y�H���-�Ӊ��"!�*O>�9�.�[�J��c�p@���K��:u�%�ʑ]�E.j�4�WaY�W�R(�j����׃O�q)��1WF:����i*��=�ƛ��X�-��g1f޽����ύ��J
'V�%����ȓ��UO)���"�0R�s$<�O!ެx���fI3����A0	�?��^뵽�f��i��'�}���a�&lM�42,��
]ji��2�>t���ˠ��`�j�S�c)����;���&U�ݑ�2U���c�慜T���B����֡��ӉM��Y��ϱ���Y�XA�st�bނ6����s ��s?b]Gc�^?����)zLF���S��v<�|�����ݦ0��2�qc�w��왎(û/��-y�>y��~�����#y�!��!y��r0in-���D
)H� ��?�\_�سtY�b����1@ԭ_��)����($����Y3�`���D29K^˕1p�5�b����Mo����7��I~����`�ôue
�1��op��0�`�!�n3QA�V
���P!%��fxp(:�6-Æ��+E{��~���{~�W�v4 d�'pSI�o3ɳ��"�)�1I0�"pN�ΰ*�WRw!�}4�
!����9wV�4�a+d�6�u���S�x�w�1�1;���(��F�}3�s��Q&#�)�@�)LUbc���e�oQ��D���y����lQ�7"�
fQw0<�B3�yaX3�>C6�Ҭ��[fF%`�lw0D�z�fb܁��o]�G
�c� 
�a�"_��gS���`��d^����7#m^z��f��X|1}�sa�HP���,㛹W�욹W��i�^�YӀ��4soW�I�]�m�^=�̽��]��4so7�IƮ�p3��T�`��l;��~s��������n:�0��6m����f�.�,��h�>��J1�vw�x$���G�7+���G���j�ρ�ԍ��<խ��H�7���p��멡�ԍ��<ӯ���T?�/�((�'���ի}GQ�D�H��q^fv�f��
c>9����� ҃M�G0�-��gxැ�ߐ9�>�9�e�o��c�YX���*|��T��;�7�
��M�F?c*Py��ן#SA3��T��5�l�T�2�^66t>��y�_oqS��+'FSA�� �
�j�h��.��E�l�Ekѱ�sĢ�5����,�.��.�w�0c݌��<ӯ�8��}٭Ȣ7n��pBżm�!��84F����z\UjD�F��g��݅`D��Mp-u/��fNp-�N�,˱�ڌ��<խg�2�\Kk�*��ڌ��<ӯ���Z)
��z9�,��D1��Ĭ��-Eq(�8�@T�h��^.�y��$�������$D�
6��PPjG�`�������A��Ϯ'F�R;b�L��҂�&
Joc�欞�i�a"J��#8{��)�pb��:=��Q<ݴx�6:�/ة�|���jѲ��~[�&26N���ĝ>�#CnԒ�#�<;�F��&�rA1���d}5����w0���~$���
�t5�ڟ�$����r�PI��(�2U5�f��9�V7
{̰�c���q�1�v ����r�M�j��p��	�~�t�X:)�v��f1�:��=�#�3ŧp�!R�`�h��x|K�ix��"9����o�R���_ds��E6�\ds��m��{N��0
�Fy,�!{J�O��������I���ޜr�gK�Z�p���jڎ��~s�;g�;UZ���0XLM-Y�g�s�i5D��s�9ֽQ���s��Kp&����gT��nE�k�f���=���33#�7�g�����z�x�w���J�����	JR����zB�v�)�ka���
Ʒⵃ0�����X��Y����Ǟ�NL�G���9ܩ�O��e!�E�Fd�aD��X��\0�$�����S�kk�qo�"��Ҋ��q��|�5�������Yϭ��T59(j�p仼��W���=��A;�Nw<.=�A5�]�<���kF<�j��+��y�*�GT�'e���w�����7bo[&�L�.*���SN[����k#/���53c����.l9H:T96�a�=����#Bm�"T&L�`ج��T��M�p�f����)�
�L�VA���h��@����[Y�9֬SLu
�VC4ᢚVy��{��$�5.U��!�������Sl�)����ɫ��t��k��$��RzQ����x��{ʤ���3΂��������'��H�@����EaJ�%0F6c�JnJ�H�]~=���z$�K��o�=	�R�4�yp`<�k��i�R�@�u�[�ނ�@���< ��p�g��XL���Nل��ݴ>���׮�pc���_j�1�g|`LQ�L�)�Ѷ�>rS0��e�E)��*F�,�^���Y�ê����2X��j��wai�EU]�!�1~T�4^�E"�n���4��ӳ���W�1��r"�Fg&��2��oh�>#.<kU˗��ŀwP�ptk��]�s0l�Zk�����	�F��+����S�>��K~8�|z;�*�~N>�I�˙
endstream
endobj
16 0 obj
6379
endobj
20 0 obj
[1 /XYZ 33  
760.250000  0]
endobj
21 0 obj
[1 /XYZ 33  
672.500000  0]
endobj
22 0 obj
[1 /XYZ 33  
158.750000  0]
endobj
23 0 obj
<<
/Type /Annot
/Subtype /Link
/Rect [102  696.500000  175.500000  705.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��][k�H~�_��Ȫ*�.`�maaL���C�dv���d��+�JmK꯺��QIrk㶫���:��\��o>F��#����-zr?o>l�8�I�_T�{������P�}���l�G�7����7���x���h��4�p���"�����_��~�����e��<�_�l��痿�$��TeQ�=�Z���?��V�H�"I�6ڨf,��߽x��=��K�gi�آ��mZ&����&o~���JuE5�迟6�V�?w]�X]���\�؎��:)�Ĕ��]�&�vm�w]X=Q�:Iҩ�V:��k3ݬm�w�~� ���c[׏���,R:z�5j���X��2���KtYq�۫��M�L[�C]�ݶ�b�iV�5:�LRl[t\6��hɷ-YlR�k�ٶ�q���Ӣ�ۊ�ߦ�{F5C;f�ʺgt�t����Ūf�[�kɒ�tG-ۏE�xf�w�j[��768S��c�<CЁʶ-*iሱ�Pccf�W��^�d��;�z�L=���h�N��z�n�gf��ZU“Ep�RU�7�����#P7��6�{C��Y˟k�6�	c���Sg��ʡVKM���ⳍ�vݞ���·u
�֔�􆟁3U�n��h(�.�����u+�d����pl�,`���L��Cڡ�CU�Wam���@��Ң��ū����[��k�G��YQ<6QY�5֞�:�������aLT��W�je�~Ō��%xl��q�4sd���{��p>�}��ӆ��q^�9 >-�B«������lY%�IBʾ��S/��2r�s�	�Jiӌ�Ϝ9��߆׍�q?�؄W�uX�1���0(>?��Q{��P�@s<���
�,���9Ƣ �A�=���fzռ��!Y����2��68��#��`��,����5�ش,�ʌs�72#���-<Z�!��y�(���&��H��1)�3�5�H�㑍p�L��i�׎
�(���(�Ö#�_�������LM߶�I�&��X��Ԝ�Y棢t��=,�O]�`��Lg�c��~��||�Dc<c��]����+F�y����L���M���*y,+S��<�V'T���і��1��P���o������"�yZK𹓃r���;u�Z+ĩS�wwF����윪�o��g܊�=�C�������i^w�3-������-o���
��ma�s�=-�|��[k7��V]|���kty]�����Ϗ���]^EWW��Me��Ԭ[:�-�����@z�x
Yj��$�S����x%�Q��Pnj,T��	.U��9%A�itzSQ6�`֩���qf9J�ך�����!v�Ѐ���=Ϻ1#M=�*�h�ŒӠ�]K��J�^��b''�U���@/Lo�N��:�dD00�h`��]�i�c��P�t!*��IE��|1�I���a*Ɣ���Hr	v�^�ƊNmՎ�9i��lL(�:D�d0�a�ztZ�дCr��H��uW}N�_]��.f�"�=���i�zi]iӥv,�-�#'���̽��AP%n�Ex=�;=���dG���lt��ӬC���Ɣ�8�'Iq
O%,&�
%#�F(�u���u�Y���%Ťp�"_�!r�* �	k	�L��̙�i�H*�S�h�u��u�OMYf�2�5��L��Z0e����u
_�ܨ�I �F�Dcӈ��Ri���U����х���"!���S�J�T#F�I��c��>ƶ��ƒ�k���-�u��Ze7}խ���q�Ͳ
eh��E�'��QO?E{
�	����`7�8z����6`�;���f\?.�w����:�昬7��M m�z���k�۽�た��'Z��^:~z�5����6*���06{�-0��S6/+ΚD�[�vL�'SJZM��RԢ3ؒ÷�?c`�{�Ƕ+Yp�v���
?��CN�=��X���~q��cv��Q�������>;�={C{����-����kf�:�EA�2\�c�(�py� �\}E^G���̉�t\&f'��e| ��Ӣ�ZZhDiaܢ�( %Q�2XQ�h�Y_��2��s�*︨_&N���.����?ӗ
UR+�n���Ƕ͜��"�! �TD*+�H%��0&UcLy�bLnj��1ݞ���0�|��б�ɔtn�H�zI�a@?��>�w��ZO?p���P��p���h��u�?�
����׀���3�����mx>pv�){J�vDxfzD�;��8"J7Ӂ�\8��Ԧ�eo{f��ɫ�2!�TBR�[̙��P�P5��LgL;�[ô���
=�`� �G��n�w�L<
�N�g�O�^��ee�,f��w�2�eW��:���F>���QO�u<gY.N+��
N��Q��xu���g�����5�s�5�iM�2E�y�!���!ѬvFV�t��)X���9'���5�i����j%VPa����%�.����z•���4��D&
��у��PQ��WӔ�K�	D��S�%�S��7f�Dtc(z���c(8���R��#�C�YSl"��S���)�CY��n"���N�}��1o����A�pd���%IJp���T���N�(:ĈR�2��Rr���o���[Ӭ_q��8N�_!��zb��I��b.\�\W5gj��AK�� 2��P9���R�����:5]~��2֣	�)U{}r4P��9㫢!�]�	N���Q:a��H2��ZF�Jx`8c��R�B�<�������L֑��ߕ3k���
ߜߐ��D�R"��rԱ��|��	��Ռ�]�����хSC$�褲�I�59f��]�*�jq�1/�|�cN��#�xl8����*4D�,\�œ�B����6�R���I�3��'զiQI||�OQD��a8���"56,v���f`{�1f�"��)Мq��
 ������E��dZ&\;��:)�:��.�-����I�zc�#X(7��&�J�Ya�sm������5)���r���6�U
�	˘v0T��|�:Õ�3�p4AUA�QSz��l����}���PWN0�o�f&
=P��$p-ҁ$�N-꘠�F��YWa�zeyqJ(�䭭5S@`r�D$�w�eʛ ��ں��k�K��]�ʚH��s-?��eO�C|����`�ū�]��NZ|�^�%�|�f�e{���oCA�L�;%���b\p�q�@�D��Y__q>.+Y�6��dwA��REsj�p�-�Fvi�+���75���g2���t"C��@������iA/L]&&�;ZTa4/J'c¢�u(Cp��"�ra�!,Z��|*Hyx���g�|�!�K��Ҥ���Ɋe^��9��[8P0*e0�D� :ZF�O�+Yu{�4�	�Ǻ7��8,��k�

��֙���%!�F�u�"�{8�؈;N4����\���p��sL�'%�]�G��f��n`竩�ʗ$
��W3���CwӟƼ1�NDY�
<j�?ؕKd=c!�Y��8C�s% vM3��%#v�L�j�|4n��
�3̮���!Z&����C���'�u�>��a`��_E�d��dM�*Ü���C��'�)ܽHת��J�b�	#8��%g��3�e���C�ݭ��$���t��s�;���?����i��fH�MUv�4�2N�~�Y�bE[dg���y�[��u�dE
�pL\���x��5p��_����G�gZ��%-��'�~�q?��i:p>�G{�;<86Ϩ�Z�)E{�Z����Ňo�F�����~������Utu]�����I�Ļ���{��MO(l���>H"=�������.��gڿ�tJ�/~�ǯ�߆Qc�~b&�^`�`�36<S쩹{f1#��<k�;�1��(���*�mN�]*�?�5���P	@�_\!�dR�2LX��%g�$H�&�@#|��
L�B�DR�T-���e��1��r�<Ӄ�#mu}q��O*��d͇2��ZD��S�|ژʒ.mj�c:ϙ�}���Oi��T�ޗ����T����}�m����-q�vY�b0�e�e3!��*u�2bh,�m}ߎ��s�ަ,�)���Z ���w���]�g�z�
S��p"e�0.L��>w$!�S�
�T�����Ϟ�ߊ��s�y����'�Mټ����uK�y.o�7��Ow	0��7�v0����bJcȂ��0��<��Q�;���Ս�Ӎ�@7�N7����tc�W7�N7���:��vtcD7�vd�u�<�=+r��E߽;2��d�=l��S
endstream
endobj
25 0 obj
4362
endobj
29 0 obj
[2 /XYZ 33  
122.750000  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��]߯۶~�_��QDR% ����A�a�C��+��h�
۟?ɢl�G��=�$�-��k]Q$ux~~����}��?��O�>��O7E�l��u��:�B׹�������/����͇͇�߯�a��?>��y�?k�����f:�s��/����������S.�V�����_UQVyը�n�/����߾�~k�Q�uQhm�Q�\F���EcrS��u�'}�޼����)U����\U��sS4ua�F�8�:Ӯ6Y]����������L�6j�U�v��z�-˹]٣G��4�i
�w�6���L���OY?�W��Oݤ_�J�٧�7�����/�k�cd�ʷ�+-+��ck�+��^�y��rp�m�T�)���T����NSTz|��J�'s�G�y���Q��NF�g���}{�iZb)lKC�g�m���>��c��P�mYE�������.�~��J��P����Ŗ芮�G���g�G�s��	���<�|�4��wľ���{�[PO�
�Q|O��RK�����liBQ`�0��R\n{�xf�',3b5����h�>;��\#>.��3��S�˕=�G�p�X�a�7P���]1�z�w�dn{�Tǣ����;�
�
�SL!�9��8^)�~�J��M���k5�S]���&NcO	��J1+
�5���g��A9�U̩'T�نs���;�g;0L���̿o�����$��E!�-�`�_��{��4|����w��s�Ѱ·�~�	֍?����ϡ�)>��,œj��h�,���Jg|^i�]T1l�5o�9�mc
���ŋ�|���kF�3r�
����R/~�hS{?��x^������#�1��+�s���O�!��7�K5Bã�xLU�v��5���`���ю
�C�d���L��L;w�s�<�Hfn�aC�Q
"�,��)d���u�=��D�ak��Q���X�c�/���r����X�a_�����a�8�!4�
a<�8��d�\���!�nʒH�����̬3ұJ��1��v���q4·&�!�:����坨�)�	{K�g�mh|�HD,����vCx�(l�|a�/~��i�*/Ϟ�h�S	O��P��/�DL�c��o���:M&1.Ӯ��T�(m����ДݷMfl���Ƙ�nli
��1��L?^�w�'�q6���l�w�'�W��>7�����7�v�%�R
�b��� v)��:î�����e�?�	̸(0�"f��eR�9�Ue����b�sZs���DZ=�AkΉA[�b��y$�+ft����b��Ġ-�xű쮸�}nor1��ދ4"��`�F�7o^˫��&%��f=G�i��.'~u��{J��$��D�hxw�Y��-����=
����'�m?����+)=Vڙ�R��q��@=Djh����F�ר�D
��$��0f��
f,8
*�<��v�̕#��=&U�EgM�W��:�D���R�wJ���hIK��H�C�T�X�w�J�dV�@� ]SPeF�L!�i�zj_JU���g�0)��l�X�{�q�2%c�)܏�M؟�%���?NȾ1=$��Uy�X���X��-���9F�m���}��G�5�<�k���G(��7��
�M�k��-9��5�I��6L���a��t%�2�0%u���l@1Ʀ	��X5!��	�V�l�F��HuW��>ӏ煐n�	!�gu?��Pwō�s�x��vJ=�:I�'|Xc	��W�J(I��'P�a�[N[���d.��=1Hٸ06>q&��u���O�sc�W���C��J1�2����Ʀ%ƣ�H(��*S�����4Ʉ`��.�:x � 6+�l��`� R"r��k�uJdu�%ci��Ho�Ա�t�3$қ���\۵%�PJ�? �u%��Y��jb�8%]�Y�D���Dz�B�x8Z��͛bo�ԁ��JJ��;��)���Q;����N�Kn�i��o�$x�#��G�:�DG�K��D��z�R�R�BZ���C(=�x�B�����l`bс�K����K��f'�����ޛ]��\OJqN)�aJL)α��M3�CJq��g��o��~:���v����9�.믘�}�o�]�~:���֏w����F��a����ڧUvd��F+�S�İ伳X{�d'6U�F6�l���%;Vdx1�����4�k�mz�|���bF��~<���5����cF�7�;��
�M��w��,��C	��"ӞR���͠d��u��o[p���Od\�L�FYe<I�E����7�(p�xJ|�t�;3�\?��[oF�쯘�}��K�s��o�x'f��f��Q1�	e�0�����dV�;�&J�ξ��Ғ~?�c�#�����0:���=r��VE��\]��~�6�p4�4d�0�"�R|�h�3fp������q�9!��;
��"��Ce��<�յ����N�s�s��J�d��ld����P���'[l��+D�8Z-aѽ��=ӆ�rO-8�("�q��XE�0�%��i��$Yr�E{����ej����A0ώ׊��'۴���2��ފ���_��������HA�̖�hG�
5�&7t1��wZ�zO@��.1��c\�9�33P��)*%�V�ܶx=Li"\	;Zq�!Y�:Q$kՅ��z��x��n�Kkԕ*�p�
"�qkPvk0�d�2���N���iķ���)����1���$�� *���s�E��f�p��:�W�4�Z�p�^��>q��f�w�/!x�a�jD����ڬ�V�\W�Q�Np�&zΚ)6��	�������%�X���v'�a��.��4G�]^۫�Ԉ�d�����i���D���ɋ�i���d!���(`E
�S05��d���0�	�<Z�;���l>�%�Clk�T63�j��U�˥�C�-M��z�D8�8Z�=�B1uK/e�i�*�A�_�C��d��=/i�B{��B؏�W�=<�9�<"Sۮ��
���a�����|�sD�����@t����x���M�E���h��D��<�=8��R�i���X
Y�e=3�G������b5�����Z��8�mw�u�xkd=I҄��0>t&Qg��%hG[��{�|�J��?M�-�N���rs�Ө�M��ȾZ2�_D�Mh�VM1�'&1X����{�e뙊�~Y4���p�q1���l���7�
Y�-07l�0�3eO��=?z`�����pNe+�&~jsK��e�zu��H���$|?�Q7�\S�e�R6��e�D�[`w?X@b0~��9.W7�`٬M٦DK)>s�M4�� ���yͮ���,���5b�p¨�!:FP�.ք������I�{Sp��)pS{��u��|kY�1�@ٜs�$u�U��������&�Z@c�h�jA�{�h��0o�;)�e���'�-b�2�#��E#���/���~I*:gAP�T�]��t�mA�==P9��K��Pxw�zp)�K]z�f��uD{2��T�}�+�	C��~.�P�M������R�C�q�{b�K�L�����`���h�
�>A��ݡ�'�*2�*���K6�R��H&�(T9VP�1�e_� !LX_�l.C�'��OW?�2hiLЖI|`����Zp�<�!��U�uHgL!�DJ��FHe�Dʞ{��%�����e�#tsʏ 
Hf\�E�W�[p˄%�y����C6%���~��@���jx�=p�O`�5�ҿ��0>O�r����lS�/
ܣj��d�s�=�Ze�rmp�=%�G���K��LJ"��Aհ����y��~�`рl����d�쌚|�nRluE�23N�Y����sƸ�rB��+3ZٜY��jFs���Q5�9�'K6�K������qn�\��ŝr�RUc.��JL�A&�ɸ�M�q�1u2���x=Tg5�
��y�@L���ك�Tp��)��0�?��*�P+
50�UYY�)Q�n(��2��F
��s��3����>T�X��H�e�
�@D%*�π�ek��j�8��L�,�Ra,�{�Ehk���u+�Eh[����"t�G+;c�iBUu�]�qY�y��������*+(�w��dmelj�륱RyY�x�?I�Y�fl��r��'�ɟ��<�]d�?�W����y��@��m7���@���u��'�M�gpZy�	�
�?�P�8�X��>&������͛�����������y��}����S#��t�Q����/OGKX-yu'qzO��9q�uQfz]j�W�'��q��PR��8.��g�Qp�
�5~���q�#�F0��v���BLj���ui���#��u� �<Ǫ<L�Lj�x���B��$eG�}S~R��1~s�Q`����]��g�F��A\����2�|&�Ō�JL`��tL�
�c�f��I���!�Ʌ���*��h�B6�?�5�r������9S�N1�_89�-�G;2Z���ឪ���LQ��\�S{b�Q�]�u���T�T�I5,�T�J����N�z(��_�����2�'Y-�WF����6�kO��C����T�}�T���V���M�}�3c���7��ucKS�o��g��k?u���订��k�w������~޼�f�l���U�m-w�c�UG+0�,?�
�i*v�2{@(��y���.���DTIej��Տ�"����s�T��T1,���i{̘ژv���D:����y��נ�;���C�a��l��
endstream
endobj
31 0 obj
4897
endobj
35 0 obj
[3 /XYZ 33  
765.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 14.4 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��[mk�8��_��u�jIP
M��AI�>��d�X�e�����?9gc'��L��^wj'�F�g4�������MLf�/bI�ټ��w��'�g�_�Pҽ�нX��ⱸ-n��Ǣm���|(&M_E��|�{��Gh�k��I��W��%�����+_�M+�>~�����*�����~�c����e�Rk��jl�|>3��Rz]=���-C���hU}�.�W֧�(c�&j�ixO�0��F|}W��=v�a��a�:7:�Lsg��xW	S57��ߦ?��.��H��I���3M{�s��l]-I���NOI�;z�m�c1}�c���:]��J(-�E�γ沸/lHތ����<���B,>U�5u��O5����2Va;k�Q�DV�#�:�qʭ��QkZ�$��}ܚ6+�++�Bg<J�N�0�=�s6$�$��=�A�d�Z���>�X0m[���ܬ$׋Y�	��*6�
h�k/Tj��虦=
�v��uԞ�J-�=߶w�Pq����H��'���i±TU���N�X<�����i�j86���e����
+��=J۟guI�m�h����Zs$1Dt��Op�.����}�~h�w-�
�M]�E��w
�-c�"–�t��6C�@V�'~2�r� ����r���ϋw�~���BL�f�o���	�����f�s�i�9�E�/��3�h�69l�B�-%9~Hk�$��A�Ϸ�%���I�x<ж��8�C�Hە�9�'|Ɯ�<��H1尚���o����:��	ýÊ���4u,P��:r��������kF�Lɣ�2o�9�5JX8��o<ی�o��0w�5;j��V��-7q}�a�q�����U�'7�+�wr��^�t}ﵳ1A��o�qi{����"�� �LSZ�����T� ق��dž[-��
J<l-@�5�(�����l5��V(���H�Q���&��Xpu.��AI����X.�D+[K�h{A�y�4��T���8�7=����T���l�p5R�XX�Dl5&[��a	
��g�8&[X��=�$�A�2�A9[Ƒ�>/�U�F�=�l}8��l�q���kΜ���x��yo��Z�)�`Te���/m�(�%N���b(c�S|=Y
[�WN!��a�a�i�:��x‘|�����̄���.Y��3?��>r��b$�f�8�9ebNfb�-�Xqkx�F-��r=^�Y3�U74�}��GʚG{����ɚo��9��L��É�qW
�	���Ki�������i�G?X��8��3��N������돶*��)#�<��������aX�*N�{<��-2��sh�Q�aU?�T/�T2���F��a���F����g�.����13�ގS������ [�'�Y�����B֬�^:�� ��F�_�U�o��u��|˾V���-W��h�#�D���D��~3���
[�Gj�8�18��<���Lk�o�6��L?��K��]bT[^����'_0��ls��K��[��Y{XE�얞�]�^u�����H��Ȍ��d��}����jz�
endstream
endobj
51 0 obj
1581
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+Ȍ�`�P`&�7�)ry" �9ܠ� ry+(*�&��&Fr�I0�$���[s=�xd�M6	0��g0׾���ꪯ���5B�
�L8B����j�=���bI��_�y=�����Н����q!l!���';Ư������삲*���`�B`l�1-���#d~&��UE$�,�v#�U����7�	Bh;��`:Rp����$��V,�-BGb�j���!K�������eD$$S�A�e�x?�4�C��Hm�9"'���B�j��S{5�A�M3ϥ����a����F9QG�5��S��rs���R�*Z9�%M1�_��$���Wq
{��Q�87���K��0Q.�LպA��t�'�蝝���>��y?p��rqQ�r����j���G�J�����J��˴HF���t4x�o��v�\�j��b��͍s�Kv�����}{\,�'�4��Sm��MAA;��Vo���m�����3�((D���'�.�J��^�Q�Y�˱
���˰�3Q�޸* ���5k�z�f����6�~�R��]�}��ȲF�uS��F7�� U
R�)u��Ͽ�c�}��q�C�O}��2��_b��LY9ik�=��W���h:�ցCq�[�x::��ip���V=��m���@��Z��)&���p�
�>�r���ө�͐��O��A����.I�C��dg����i�D���Q�Т�5(	�c^UR�w�h�m*�����x~I™��aT�s��=52b~������Y�%���,\'	���y2�� C.���
(����*����z�����<����zy�Yï\ޒ�]�$~X��Sl�&ž]�O=�ych0���b���4�>m���Ҹ=�GG2u�_8������
��g��_<r�9%���7ȝ+�Dv��4ȡ���	�P���*�����R�t�)lk�9��
[6}s�Ͽ(- z��7-��7/GpZ��->	����W��HNJH�O]pLTĬ�����8~�r�������Ӌq�9��~�-���e�B��ՙ�%�J�ʊ/Mݶ�K/TT� *��'6�(�ˁ�Z�=Hʚu�,7eew�wsr�^@�q��!�-@�,����<��t�[�w�3�Of�05�a���Y�L�{A画�-t�3���kȽ��"C�#e��	����B�5�shk�y�;�����[�}7�K�1�v���*�-�ta@#Q�$u�����;�	�i����s����E�1g�
@5E��c7��
N���7��7�aD�w�M[n�ݱ^Z��c�@85<��k���͟s���:���e�:���d���(%���z�r栱
�o�me�Ĝɀ�Q0��l���N�b�se%��f���[�fN(-?_��a�5�!A%ً�KČi.SfL���ٺz���}zf��5ST3f��Oܓ�`��ؔ$�Gf�`��C	���e�����S��7����h�Qy��j�Fx}CϳM�Qh&����fU�A���P\t!�R��C�.����:���g�C�����R��=0i�/�f�7��96Ԓ��|�8���g
�:Gc0���:���l�ε�!��j�C����_�!Ӻ���@lx�e�@L秅���榦ܬ�C�,���*���М��Q�us�L�O��{�ȎTo��q2_�}��3��-�Ȫpu��Ip)�y�f4��xk-i�O�x�8�e	��&7��Ouv@И��g0�T���� 6�gҁR�y��^��@��7�lc;r�&
��Y7s��R p���Wh�:l�<y��ox`����Bqp�9u��zl�Ĉ�fzt'HrS��{�,6\�75X���/���Ū��C�,k2�&� Β�Y^�I9DL���-9Ē�-�	�Aa�O��⋗�L]�E���	ډ�ا�c�-Y����!�`�^q�?����C�򲑃��܀́�Z���8�\��ҁ��O&%u/\0��{%��m�ɝƧ��ص�z����N@����{�y
�i��J����t��K�4L�Yf�)�e/_2�vU�\+/*�K�8�a�PV�|DĶ����Eb�5��h��um�z��\n܋Ѹ9i�:��s�w�^*e�>�M��8Z���U�8`XG
9}�M���-v���q��q;����|I8�ֿ���28����6:���;��>$i�y��:��yj_��"=nNN�w��,~��#b���bRӱ�r���<�ďCk[��;�b㫑[F'�#��caP�5��%�����f�6GF��n���}q=�h+���X�r��:7��{�{�
������*��l��H��F8-ԞY(3R{{��I�o!m�����.q��o�~��r3p����¹vH�R�V�W��`@;�?|I�ʸ�	�Z��i���an搋�=7��ws�,�g[�C�E����
w��Do�q{��e:�x�S��zE�Ͽ�3��Xc��Ajd�a��^�/�g?6ԇE�B�s!hw$�Ò�v�Ce~V8UT�NSz���m,�&<�f[h��4W��/q�H�`��i��\ø�ܔ��lQo�0I��ѰȲ����AK����	�	����[{N�7�F��5ԟ�i�z���?���A^��73��]�u���ĸ��Wr�?�,!>���w(������w삦ъ�d��9���
{�'��pn��_�&�S��{T��j��j��C��Q��Ć(8K�e�?������2w6]��NP�~s|�3T��x����]��[fa ��_h.^��\��u��,�o��!����Z��r"�s
ӡ��.8�Ҟ�K�钘��_�>p�fK�©���C�'�w���x&�47�$����1)� �.A�X�eV5<@�Q$!��H��$ǣ�?��o�,_��b|����1q�Lv��gs��ں���kSo�]I��s�<U\�矑��.*�-0��7_��7?6��tn�?����>2j���ܹR̟����2�����Ar@�\��;M�_�i.�]����P*��{�c}�F�I��a�S�r_��F��GLs@��t�,�L��Y	��e��Ξr-�
��VUmqۓ�l������%�^}��+d}�#~� ֈ_v���@<��
HqҨm�1����-M������_��N{09���Y�1����y~4��W�:V\��Oࡺz���K�û�z�
R���nc�C��

���?�;������@�|��@��k�M�/�Q
U2m@�Z����������{<�?����v�ֱ��1F���L]���2�)
�~*��w?�׉�22�\	��\s3�ف���ѠF�1�p���a4�bW�IH~%�~c~vVn�k���6|��
v=va!�[�Ö�ԯ��w�K@��O>�Ry�/�,X�b���+���4\��k~A�b��G�$���߁|T>SG���z��@CKmd�Ⱥ�Pl��[����V-^�i�[W6m鍈ظ����{[8/(�EO��^LY�r����1k�g�� $�nS`���d�͟��z+jU�h'����b.��r�zDox�XD�Gr8�'8�;0���koG��y5A��G`�_-�A�5�^�K�������~I��\���a`���Po�,���}F�nS�����1Q
O,[q�aIuٿoK�����mz1�v@n�,
-�킁D\����x���˽/��&`�6���G]��W
��5 �Y�ꖳ�{�5�ؑ�A�kX���.޴��k7â�%k
�Be��}�����O'�au��a ~S�8�ޅ�s���+^,*����k��$&���k����H���P\�
*-


(*	F���yi�C�<�,'&Noga[±Z]��1����3��19��;.������-{�t�)�'Xt�p��qw�s�����]�0/�\��uN���c�s��J���l����G���d���ؗ\~	q4��~�*`��w-eI��Ҙ��a�.�>"l��U[�]�t۶�G����u����/!��ի�ڒV�&�FF�F)�;�S�NB��Q_d���;W���4�.�q�����*��o�����K"A�L샩5Q�!;�/����ˌ��1u՚M��b�]� $h=Ƞc����G}��R:��eŌ��'�Wԥ�}�0R��Y���4��F�_�f��ZO1��]3�m���z0Ƃ�	T��x	9q{���0��0�=�*��7��� F�
��qęat;�T��b�?�����s�ϛ���<Y?��s2�7&^���4�8�yp����P��m��'?<�G�����1CvO�<S�����E����8�PvO���+�k%�����"��\�*�I%��r�!��<�C(�h�ů$|I��a�FҍEO'�]��U$Y(%�Kē�ƶY-�H=Bl�[D��3z�52�)�X�%�!]��8#�$�N��82�{�8��=r���1�I�lߏ'6^X��.��#d}�l������$
�x��Fҁe
�D��Ä��d:�Kƾ(,EXJ���C���+I&J�Dw�F�z��Ë$���,��x�O�D:�.��t#�;�rq\%w�����Z^�g�����`/L��B���p_��"d�&�Q��Z./���$����M�M��36l�ٺ��l�m���4f՘�1c��<6�IKd�#i�/;r�A��b�3�wZ���s�:��oX�<�oY�����u����d�
g�^@�HX?��)�z�Z�Ek��5k] n䶵.#N���Ǔx��IYGJH�"٤��P��o	��F��'�
#�$����"���w�Y�R+�H���8��֕�de���<<=U!FcV~�*�0m�jQ~�*�}*U�f�f�Td��X\o-�2,$ָ�X��H.��㒩H��fd�秖����Cg��V)�k�M�-��
��?�0���c��k�����x6�����x�p��EJ�-b����8�K~��'f��|d'
{
%��bO$�8�!‰ç�Ħ-++�3���rvjQjZv�lcI֜�����Ҍ�9�aA�qA�^�q��G+�
endstream
endobj
58 0 obj
5244
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 270 745 469 564 611 548 682 866 647 707 651 589 880 339 345 492 240 503 557 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> <0034> <002E> <0055> <0073> <0047> <0054> <0068> <0063> <006D> <0074> <0076> <006C> <0070> <0066> <0067> <0050> <0048> <002C> <0032> <0049> <0077> <0079> <0045> <0052> <0046> <004F> <004D> <0041> <004E> <0044> <0053> <0057> <0028> <0029> <0078> <003A> <006B> <0035> <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 
0000038255 00000 n 
0000000187 00000 n 
0000000282 00000 n 
0000000756 00000 n 
0000029337 00000 n 
0000038121 00000 n 
0000000319 00000 n 
0000000362 00000 n 
0000000405 00000 n 
0000000449 00000 n 
0000000493 00000 n 
0000000530 00000 n 
0000000574 00000 n 
0000001080 00000 n 
0000007535 00000 n 
0000000877 00000 n 
0000001053 00000 n 
0000007863 00000 n 
0000007556 00000 n 
0000007600 00000 n 
0000007644 00000 n 
0000007688 00000 n 
0000008188 00000 n 
0000012626 00000 n 
0000007985 00000 n 
0000008161 00000 n 
0000012691 00000 n 
0000012647 00000 n 
0000013009 00000 n 
0000017982 00000 n 
0000012813 00000 n 
0000012989 00000 n 
0000020361 00000 n 
0000018003 00000 n 
0000018047 00000 n 
0000020194 00000 n 
0000020020 00000 n 
0000018298 00000 n 
0000018452 00000 n 
0000018591 00000 n 
0000018987 00000 n 
0000019859 00000 n 
0000018784 00000 n 
0000019263 00000 n 
0000019391 00000 n 
0000019554 00000 n 
0000019723 00000 n 
0000020257 00000 n 
0000020679 00000 n 
0000022336 00000 n 
0000020483 00000 n 
0000020659 00000 n 
0000022357 00000 n 
0000022621 00000 n 
0000027977 00000 n 
0000028459 00000 n 
0000027956 00000 n 
0000029477 00000 n 
0000029735 00000 n 
0000037122 00000 n 
0000037327 00000 n 
0000037101 00000 n 
trailer
<<
/Size 64
/Info 1 0 R
/Root 49 0 R
>>
startxref
38374
%%EOF
PK\b[&�**(doc/alt-php83-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
PK]b[�_Y@����.doc/alt-php83-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.73";
}

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 (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 = @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 = @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);
}
PK]b[P�$���'doc/alt-php83-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-2025 ionCube Ltd.           Last revised January 2025
PK�f[p���(licenses/alt-php81-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�f[�l�licenses/alt-php81-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�f[$�u���%doc/alt-php81-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�f[�E#/&&+doc/alt-php81-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�f[c��^0,0,+doc/alt-php81-ioncube-loader/USER-GUIDE.txtnu�[���ionCube Loader 14.4 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.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. 2025
PK�f[}��6�6�+doc/alt-php81-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:20250130155421Z)
>>
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  
131.750000  0]
endobj
12 0 obj
[0 /XYZ 33  
296  0]
endobj
13 0 obj
[0 /XYZ 33  
97.2500000  0]
endobj
14 0 obj
<<
/Type /Annot
/Subtype /Link
/Rect [71.2500000  66.5000000  144.750000  75.5000000 ]
/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��][��8v~�_��FI���@w� �0l A�l���8;��Ϗ.TU�򱪾�(���H�\lR���_�ۗo��#y����|�r�RSd�I���ej�'�P�{��Ï�����s�����~�n�|���{ޡ������/�ɿ��{�_�]��.���#L�,/������Sd�Nu%���=������O�o�>���2)�T������魞�eZ	�s�e�]y��J7ߕ�5X��}�I.����/�ߟ���ㄪ�>Oʰ�WVEXx
=��12����E��?�fy���C���}�5eH��5�^���k���N��%y����׿tjJ!����َ�"�t��ӈ�Gre�s�n�L��)�s��ӈ�GL��=�FL7���,�#��u5yNկ�������|�[�k��ҎTi�=�]<>g<�
G>�#&UE���w ���D�o*D����
aϧ�����Ont)�}���o��ɻ�����/_���ɇ��Ǘ���xy��y�������sf}��6��&-��.#�wV�-�Ϡ��7��t�w�i5����Av
u٣�N5����}�i9>wQ�9�z�v-�-�Ң{��y�TM�K�պ9j
�M�0D0�p?O�|Lg��Y�����a`�9�
�����SL�I7�H˞]��
B�a�X���x�ρ��s,�WSJ�*xs�`����q���-��}���;�ۈqS7���i/ƪ@���~��S1���[^o&�'�^�/8ާ�s�B�+y�����q��6s�1��1w&8�co�����&��:���b�"��eBѷ��R�)g#�fW���x�c׌��H��s0�������ɮ�EVv�:�a�Y
�|��>2��ءӜ�ַ֊��El��|�_w�{�N��A<����v�V)a��-�ë��lr
�E
��Z��-e�`�->S��Y��xݵT�^k�;�
�1M�{�v��w��:I#�(@�(Yw\-t�9]�����4b�Tr:��9cG�<:�&� ^�CQ�j�t�U��	S|�3A�8g��M�^���c�@8Vðf���c��5;�s��@�9�>!�ٽ�5{�����%)�&ěpW7aMW�g7c�R��<����&M��o�ףO��{�Y��Ms���|�tFs�Z-��`�b|����~��z�?��^���{��G~�����o���bN�ҝ[�V���5t��8�q�f5*؈p�:H��a��K�u���–n_��99��F���] p�9��\rSݟ�LfG��Օ�6��` 1|���=ę0 <dz���#��ص�.�#��1J���*K�|�ɔU��T}���=��(��DT��?6��3��)Z���1��xG69Qp$�#�p���T�<��gbo/Į�j��2��|�#��?����������8*I�d�.6��u4r��Y&iRqC�
c���
��PF\Ƥń�<N"H�����,�U�щ�d�>L��N���L����4�шy��w�!�5a<t��k���2���g?�W�g��e�-镫��� @'-��~�7�?�$�h0W�.��-��m@$
�XL�^�3�
��ǁ��L�T(A����e�n����v�W��7����U��\KL�q,����j�^Y!��D���a�M����`p	n��$N&$0�J5��?",�~}�����3��d츮�M���rb�#�($fR��>m��~��E�ofw(n�K�ox,��ŰƄ�H�Z�)&�X�c�n�
3L]0�|�5���x� �b�X�Zڈ��׏��r�_��TK�WL$�W��p���,�9�&F�Q6ܾ����*u��կ9���?���{Z�ߙ���5� �u�_�9��L�O�!h��IH�˴{UN=K�$���ue��B&Bm?ץ��9���b$k�<Я��l���t�!:98"�D�Ah��� ���i㣗4J�r
�v�<b�x�U���9ۊ����E*��__�_ߚ�Y�a�T��[�b{h�l	������"���/MV
��L�/Y����1��1�s~�1�
��Ռ"�׿�Pu�ٰQΫ�p5ח/0oe2J�.�)�^��i�9�TM�&��cE�JkY�?��~��2/Êaeq��r4n).c<C��fD�P�L���ע��φʋc<8�½0�p��Y�k���7�х�k �Ţ7s֍�ni��;�%�҉���vF�c���ե����t��Y��oZ�Se�f��L'r18�X�.��s��K�)Y
8�\�`��v+�i+�$�RɯݗZ���BW��[^��(i���RiY�ʺ��T�V�W�a�2��Z����gԿ��$c���OA����cp�TG�_ ����7N�k����I�a��ğ�-�v)� P�H��\�0;�d��"h�2�W�� �x1��Ȓl�fpıF�âO�s�
(T;�⁀��#�L�I^�l��֯�hT�߮K��J(;�@A9ҒHKV�%Gߪ�T��<���y*��)��<��j0I�ku:OY��<eծUu��w3�d�ZK�<U�k�<��|�5�ɡ{�˯�JiCX�b��dži����~�,�җ��6<rf� �"Kr�7R#��,�(�F�7����aq4�R�.�7p��*�j��vPL��jx�ձ�M�:y9�:��Q��������T�V�:y1�:m|d�1P���`��k-�:���L���
2�g�C�w��߮T�6��5��cr3����-gtR4�7�r�J�4�9ጲZ8Y�!��(,�3Z�m���&E�KV&�n�������)�;����L�2o�2�iP�Vm~��
Jg��z������T�V�A�L�hP�M�o?T��L2v��5�ZH��i��¶8�8
��n�q)p����e!R�<i�B��*�iE�����Y���U��
;�p���� ��U~�m#���ԺS4�(b��]
&�v�Ni)�"�_۵�Q�`��L2v���#O#�MT�ՇQ6���r��֧r@��0p`/~Sj���B(��pձ��0�}�����9b��`�8/�M(��j�S�?Մ��xpx�6���|�v�E3R���.��,�Bԇ4y_�ƶ�03��؝yqY��f�Njj��豤��XǒZ^RK6U�Ϯ�ߖ�a�m�Y	�ӓ`f�ud��s�k߳�hޚ*�
�k�qo�����z�5$�����W��3�k���L*m��|�75/:QT��QS�i����T��bANx��(,~��VLW	'�;�l%�Z8��fn1WGe*^�v�3�s��ֶ�l�Uc�1�cKR��vC�u9��ܤ�;��~��M
[&��g��%_Y8P������IM5V�;��Sk�pT�3]��ϱxw6�j�SL��F��
|� S=`�=��k��T*GsT��b��i�V2T7��j&��G�	#�ln2�R�s�@�i<z����ʉ~����d�0�bB�O��m��"pC0�bN���K=���$���"m���F�{�|��C�P�	�8*��W6
����u��C�����W�2��gn����׳B�
��2_��a�*B\칺 k�@Fv�2FpL���g̼��L�C�1ta��3�Y�H���-�Ӊ��"!�*O>�9�.�[�J��c�p@���K��:u�%�ʑ]�E.j�4�WaY�W�R(�j����׃O�q)��1WF:����i*��=�ƛ��X�-��g1f޽����ύ��J
'V�%����ȓ��UO)���"�0R�s$<�O!ެx���fI3����A0	�?��^뵽�f��i��'�}���a�&lM�42,��
]ji��2�>t���ˠ��`�j�S�c)����;���&U�ݑ�2U���c�慜T���B����֡��ӉM��Y��ϱ���Y�XA�st�bނ6����s ��s?b]Gc�^?����)zLF���S��v<�|�����ݦ0��2�qc�w��왎(û/��-y�>y��~�����#y�!��!y��r0in-���D
)H� ��?�\_�سtY�b����1@ԭ_��)����($����Y3�`���D29K^˕1p�5�b����Mo����7��I~����`�ôue
�1��op��0�`�!�n3QA�V
���P!%��fxp(:�6-Æ��+E{��~���{~�W�v4 d�'pSI�o3ɳ��"�)�1I0�"pN�ΰ*�WRw!�}4�
!����9wV�4�a+d�6�u���S�x�w�1�1;���(��F�}3�s��Q&#�)�@�)LUbc���e�oQ��D���y����lQ�7"�
fQw0<�B3�yaX3�>C6�Ҭ��[fF%`�lw0D�z�fb܁��o]�G
�c� 
�a�"_��gS���`��d^����7#m^z��f��X|1}�sa�HP���,㛹W�욹W��i�^�YӀ��4soW�I�]�m�^=�̽��]��4so7�IƮ�p3��T�`��l;��~s��������n:�0��6m����f�.�,��h�>��J1�vw�x$���G�7+���G���j�ρ�ԍ��<խ��H�7���p��멡�ԍ��<ӯ���T?�/�((�'���ի}GQ�D�H��q^fv�f��
c>9����� ҃M�G0�-��gxැ�ߐ9�>�9�e�o��c�YX���*|��T��;�7�
��M�F?c*Py��ן#SA3��T��5�l�T�2�^66t>��y�_oqS��+'FSA�� �
�j�h��.��E�l�Ekѱ�sĢ�5����,�.��.�w�0c݌��<ӯ�8��}٭Ȣ7n��pBżm�!��84F����z\UjD�F��g��݅`D��Mp-u/��fNp-�N�,˱�ڌ��<խg�2�\Kk�*��ڌ��<ӯ���Z)
��z9�,��D1��Ĭ��-Eq(�8�@T�h��^.�y��$�������$D�
6��PPjG�`�������A��Ϯ'F�R;b�L��҂�&
Joc�欞�i�a"J��#8{��)�pb��:=��Q<ݴx�6:�/ة�|���jѲ��~[�&26N���ĝ>�#CnԒ�#�<;�F��&�rA1���d}5����w0���~$���
�t5�ڟ�$����r�PI��(�2U5�f��9�V7
{̰�c���q�1�v ����r�M�j��p��	�~�t�X:)�v��f1�:��=�#�3ŧp�!R�`�h��x|K�ix��"9����o�R���_ds��E6�\ds��m��{N��0
�Fy,�!{J�O��������I���ޜr�gK�Z�p���jڎ��~s�;g�;UZ���0XLM-Y�g�s�i5D��s�9ֽQ���s��Kp&����gT��nE�k�f���=���33#�7�g�����z�x�w���J�����	JR����zB�v�)�ka���
Ʒⵃ0�����X��Y����Ǟ�NL�G���9ܩ�O��e!�E�Fd�aD��X��\0�$�����S�kk�qo�"��Ҋ��q��|�5�������Yϭ��T59(j�p仼��W���=��A;�Nw<.=�A5�]�<���kF<�j��+��y�*�GT�'e���w�����7bo[&�L�.*���SN[����k#/���53c����.l9H:T96�a�=����#Bm�"T&L�`ج��T��M�p�f����)�
�L�VA���h��@����[Y�9֬SLu
�VC4ᢚVy��{��$�5.U��!�������Sl�)����ɫ��t��k��$��RzQ����x��{ʤ���3΂��������'��H�@����EaJ�%0F6c�JnJ�H�]~=���z$�K��o�=	�R�4�yp`<�k��i�R�@�u�[�ނ�@���< ��p�g��XL���Nل��ݴ>���׮�pc���_j�1�g|`LQ�L�)�Ѷ�>rS0��e�E)��*F�,�^���Y�ê����2X��j��wai�EU]�!�1~T�4^�E"�n���4��ӳ���W�1��r"�Fg&��2��oh�>#.<kU˗��ŀwP�ptk��]�s0l�Zk�����	�F��+����S�>��K~8�|z;�*�~N>�I�˙
endstream
endobj
16 0 obj
6379
endobj
20 0 obj
[1 /XYZ 33  
760.250000  0]
endobj
21 0 obj
[1 /XYZ 33  
672.500000  0]
endobj
22 0 obj
[1 /XYZ 33  
158.750000  0]
endobj
23 0 obj
<<
/Type /Annot
/Subtype /Link
/Rect [102  696.500000  175.500000  705.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��][k�H~�_��Ȫ*�.`�maaL���C�dv���d��+�JmK꯺��QIrk㶫���:��\��o>F��#����-zr?o>l�8�I�_T�{������P�}���l�G�7����7���x���h��4�p���"�����_��~�����e��<�_�l��痿�$��TeQ�=�Z���?��V�H�"I�6ڨf,��߽x��=��K�gi�آ��mZ&����&o~���JuE5�迟6�V�?w]�X]���\�؎��:)�Ĕ��]�&�vm�w]X=Q�:Iҩ�V:��k3ݬm�w�~� ���c[׏���,R:z�5j���X��2���KtYq�۫��M�L[�C]�ݶ�b�iV�5:�LRl[t\6��hɷ-YlR�k�ٶ�q���Ӣ�ۊ�ߦ�{F5C;f�ʺgt�t����Ūf�[�kɒ�tG-ۏE�xf�w�j[��768S��c�<CЁʶ-*iሱ�Pccf�W��^�d��;�z�L=���h�N��z�n�gf��ZU“Ep�RU�7�����#P7��6�{C��Y˟k�6�	c���Sg��ʡVKM���ⳍ�vݞ���·u
�֔�􆟁3U�n��h(�.�����u+�d����pl�,`���L��Cڡ�CU�Wam���@��Ң��ū����[��k�G��YQ<6QY�5֞�:�������aLT��W�je�~Ō��%xl��q�4sd���{��p>�}��ӆ��q^�9 >-�B«������lY%�IBʾ��S/��2r�s�	�Jiӌ�Ϝ9��߆׍�q?�؄W�uX�1���0(>?��Q{��P�@s<���
�,���9Ƣ �A�=���fzռ��!Y����2��68��#��`��,����5�ش,�ʌs�72#���-<Z�!��y�(���&��H��1)�3�5�H�㑍p�L��i�׎
�(���(�Ö#�_�������LM߶�I�&��X��Ԝ�Y棢t��=,�O]�`��Lg�c��~��||�Dc<c��]����+F�y����L���M���*y,+S��<�V'T���і��1��P���o������"�yZK𹓃r���;u�Z+ĩS�wwF����윪�o��g܊�=�C�������i^w�3-������-o���
��ma�s�=-�|��[k7��V]|���kty]�����Ϗ���]^EWW��Me��Ԭ[:�-�����@z�x
Yj��$�S����x%�Q��Pnj,T��	.U��9%A�itzSQ6�`֩���qf9J�ך�����!v�Ѐ���=Ϻ1#M=�*�h�ŒӠ�]K��J�^��b''�U���@/Lo�N��:�dD00�h`��]�i�c��P�t!*��IE��|1�I���a*Ɣ���Hr	v�^�ƊNmՎ�9i��lL(�:D�d0�a�ztZ�дCr��H��uW}N�_]��.f�"�=���i�zi]iӥv,�-�#'���̽��AP%n�Ex=�;=���dG���lt��ӬC���Ɣ�8�'Iq
O%,&�
%#�F(�u���u�Y���%Ťp�"_�!r�* �	k	�L��̙�i�H*�S�h�u��u�OMYf�2�5��L��Z0e����u
_�ܨ�I �F�Dcӈ��Ri���U����х���"!���S�J�T#F�I��c��>ƶ��ƒ�k���-�u��Ze7}խ���q�Ͳ
eh��E�'��QO?E{
�	����`7�8z����6`�;���f\?.�w����:�昬7��M m�z���k�۽�た��'Z��^:~z�5����6*���06{�-0��S6/+ΚD�[�vL�'SJZM��RԢ3ؒ÷�?c`�{�Ƕ+Yp�v���
?��CN�=��X���~q��cv��Q�������>;�={C{����-����kf�:�EA�2\�c�(�py� �\}E^G���̉�t\&f'��e| ��Ӣ�ZZhDiaܢ�( %Q�2XQ�h�Y_��2��s�*︨_&N���.����?ӗ
UR+�n���Ƕ͜��"�! �TD*+�H%��0&UcLy�bLnj��1ݞ���0�|��б�ɔtn�H�zI�a@?��>�w��ZO?p���P��p���h��u�?�
����׀���3�����mx>pv�){J�vDxfzD�;��8"J7Ӂ�\8��Ԧ�eo{f��ɫ�2!�TBR�[̙��P�P5��LgL;�[ô���
=�`� �G��n�w�L<
�N�g�O�^��ee�,f��w�2�eW��:���F>���QO�u<gY.N+��
N��Q��xu���g�����5�s�5�iM�2E�y�!���!ѬvFV�t��)X���9'���5�i����j%VPa����%�.����z•���4��D&
��у��PQ��WӔ�K�	D��S�%�S��7f�Dtc(z���c(8���R��#�C�YSl"��S���)�CY��n"���N�}��1o����A�pd���%IJp���T���N�(:ĈR�2��Rr���o���[Ӭ_q��8N�_!��zb��I��b.\�\W5gj��AK�� 2��P9���R�����:5]~��2֣	�)U{}r4P��9㫢!�]�	N���Q:a��H2��ZF�Jx`8c��R�B�<�������L֑��ߕ3k���
ߜߐ��D�R"��rԱ��|��	��Ռ�]�����хSC$�褲�I�59f��]�*�jq�1/�|�cN��#�xl8����*4D�,\�œ�B����6�R���I�3��'զiQI||�OQD��a8���"56,v���f`{�1f�"��)Мq��
 ������E��dZ&\;��:)�:��.�-����I�zc�#X(7��&�J�Ya�sm������5)���r���6�U
�	˘v0T��|�:Õ�3�p4AUA�QSz��l����}���PWN0�o�f&
=P��$p-ҁ$�N-꘠�F��YWa�zeyqJ(�䭭5S@`r�D$�w�eʛ ��ں��k�K��]�ʚH��s-?��eO�C|����`�ū�]��NZ|�^�%�|�f�e{���oCA�L�;%���b\p�q�@�D��Y__q>.+Y�6��dwA��REsj�p�-�Fvi�+���75���g2���t"C��@������iA/L]&&�;ZTa4/J'c¢�u(Cp��"�ra�!,Z��|*Hyx���g�|�!�K��Ҥ���Ɋe^��9��[8P0*e0�D� :ZF�O�+Yu{�4�	�Ǻ7��8,��k�

��֙���%!�F�u�"�{8�؈;N4����\���p��sL�'%�]�G��f��n`竩�ʗ$
��W3���CwӟƼ1�NDY�
<j�?ؕKd=c!�Y��8C�s% vM3��%#v�L�j�|4n��
�3̮���!Z&����C���'�u�>��a`��_E�d��dM�*Ü���C��'�)ܽHת��J�b�	#8��%g��3�e���C�ݭ��$���t��s�;���?����i��fH�MUv�4�2N�~�Y�bE[dg���y�[��u�dE
�pL\���x��5p��_����G�gZ��%-��'�~�q?��i:p>�G{�;<86Ϩ�Z�)E{�Z����Ňo�F�����~������Utu]�����I�Ļ���{��MO(l���>H"=�������.��gڿ�tJ�/~�ǯ�߆Qc�~b&�^`�`�36<S쩹{f1#��<k�;�1��(���*�mN�]*�?�5���P	@�_\!�dR�2LX��%g�$H�&�@#|��
L�B�DR�T-���e��1��r�<Ӄ�#mu}q��O*��d͇2��ZD��S�|ژʒ.mj�c:ϙ�}���Oi��T�ޗ����T����}�m����-q�vY�b0�e�e3!��*u�2bh,�m}ߎ��s�ަ,�)���Z ���w���]�g�z�
S��p"e�0.L��>w$!�S�
�T�����Ϟ�ߊ��s�y����'�Mټ����uK�y.o�7��Ow	0��7�v0����bJcȂ��0��<��Q�;���Ս�Ӎ�@7�N7����tc�W7�N7���:��vtcD7�vd�u�<�=+r��E߽;2��d�=l��S
endstream
endobj
25 0 obj
4362
endobj
29 0 obj
[2 /XYZ 33  
122.750000  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��]߯۶~�_��QDR% ����A�a�C��+��h�
۟?ɢl�G��=�$�-��k]Q$ux~~����}��?��O�>��O7E�l��u��:�B׹�������/����͇͇�߯�a��?>��y�?k�����f:�s��/����������S.�V�����_UQVyը�n�/����߾�~k�Q�uQhm�Q�\F���EcrS��u�'}�޼����)U����\U��sS4ua�F�8�:Ӯ6Y]����������L�6j�U�v��z�-˹]٣G��4�i
�w�6���L���OY?�W��Oݤ_�J�٧�7�����/�k�cd�ʷ�+-+��ck�+��^�y��rp�m�T�)���T����NSTz|��J�'s�G�y���Q��NF�g���}{�iZb)lKC�g�m���>��c��P�mYE�������.�~��J��P����Ŗ芮�G���g�G�s��	���<�|�4��wľ���{�[PO�
�Q|O��RK�����liBQ`�0��R\n{�xf�',3b5����h�>;��\#>.��3��S�˕=�G�p�X�a�7P���]1�z�w�dn{�Tǣ����;�
�
�SL!�9��8^)�~�J��M���k5�S]���&NcO	��J1+
�5���g��A9�U̩'T�نs���;�g;0L���̿o�����$��E!�-�`�_��{��4|����w��s�Ѱ·�~�	֍?����ϡ�)>��,œj��h�,���Jg|^i�]T1l�5o�9�mc
���ŋ�|���kF�3r�
����R/~�hS{?��x^������#�1��+�s���O�!��7�K5Bã�xLU�v��5���`���ю
�C�d���L��L;w�s�<�Hfn�aC�Q
"�,��)d���u�=��D�ak��Q���X�c�/���r����X�a_�����a�8�!4�
a<�8��d�\���!�nʒH�����̬3ұJ��1��v���q4·&�!�:����坨�)�	{K�g�mh|�HD,����vCx�(l�|a�/~��i�*/Ϟ�h�S	O��P��/�DL�c��o���:M&1.Ӯ��T�(m����ДݷMfl���Ƙ�nli
��1��L?^�w�'�q6���l�w�'�W��>7�����7�v�%�R
�b��� v)��:î�����e�?�	̸(0�"f��eR�9�Ue����b�sZs���DZ=�AkΉA[�b��y$�+ft����b��Ġ-�xű쮸�}nor1��ދ4"��`�F�7o^˫��&%��f=G�i��.'~u��{J��$��D�hxw�Y��-����=
����'�m?����+)=Vڙ�R��q��@=Djh����F�ר�D
��$��0f��
f,8
*�<��v�̕#��=&U�EgM�W��:�D���R�wJ���hIK��H�C�T�X�w�J�dV�@� ]SPeF�L!�i�zj_JU���g�0)��l�X�{�q�2%c�)܏�M؟�%���?NȾ1=$��Uy�X���X��-���9F�m���}��G�5�<�k���G(��7��
�M�k��-9��5�I��6L���a��t%�2�0%u���l@1Ʀ	��X5!��	�V�l�F��HuW��>ӏ煐n�	!�gu?��Pwō�s�x��vJ=�:I�'|Xc	��W�J(I��'P�a�[N[���d.��=1Hٸ06>q&��u���O�sc�W���C��J1�2����Ʀ%ƣ�H(��*S�����4Ʉ`��.�:x � 6+�l��`� R"r��k�uJdu�%ci��Ho�Ա�t�3$қ���\۵%�PJ�? �u%��Y��jb�8%]�Y�D���Dz�B�x8Z��͛bo�ԁ��JJ��;��)���Q;����N�Kn�i��o�$x�#��G�:�DG�K��D��z�R�R�BZ���C(=�x�B�����l`bс�K����K��f'�����ޛ]��\OJqN)�aJL)α��M3�CJq��g��o��~:���v����9�.믘�}�o�]�~:���֏w����F��a����ڧUvd��F+�S�İ伳X{�d'6U�F6�l���%;Vdx1�����4�k�mz�|���bF��~<���5����cF�7�;��
�M��w��,��C	��"ӞR���͠d��u��o[p���Od\�L�FYe<I�E����7�(p�xJ|�t�;3�\?��[oF�쯘�}��K�s��o�x'f��f��Q1�	e�0�����dV�;�&J�ξ��Ғ~?�c�#�����0:���=r��VE��\]��~�6�p4�4d�0�"�R|�h�3fp������q�9!��;
��"��Ce��<�յ����N�s�s��J�d��ld����P���'[l��+D�8Z-aѽ��=ӆ�rO-8�("�q��XE�0�%��i��$Yr�E{����ej����A0ώ׊��'۴���2��ފ���_��������HA�̖�hG�
5�&7t1��wZ�zO@��.1��c\�9�33P��)*%�V�ܶx=Li"\	;Zq�!Y�:Q$kՅ��z��x��n�Kkԕ*�p�
"�qkPvk0�d�2���N���iķ���)����1���$�� *���s�E��f�p��:�W�4�Z�p�^��>q��f�w�/!x�a�jD����ڬ�V�\W�Q�Np�&zΚ)6��	�������%�X���v'�a��.��4G�]^۫�Ԉ�d�����i���D���ɋ�i���d!���(`E
�S05��d���0�	�<Z�;���l>�%�Clk�T63�j��U�˥�C�-M��z�D8�8Z�=�B1uK/e�i�*�A�_�C��d��=/i�B{��B؏�W�=<�9�<"Sۮ��
���a�����|�sD�����@t����x���M�E���h��D��<�=8��R�i���X
Y�e=3�G������b5�����Z��8�mw�u�xkd=I҄��0>t&Qg��%hG[��{�|�J��?M�-�N���rs�Ө�M��ȾZ2�_D�Mh�VM1�'&1X����{�e뙊�~Y4���p�q1���l���7�
Y�-07l�0�3eO��=?z`�����pNe+�&~jsK��e�zu��H���$|?�Q7�\S�e�R6��e�D�[`w?X@b0~��9.W7�`٬M٦DK)>s�M4�� ���yͮ���,���5b�p¨�!:FP�.ք������I�{Sp��)pS{��u��|kY�1�@ٜs�$u�U��������&�Z@c�h�jA�{�h��0o�;)�e���'�-b�2�#��E#���/���~I*:gAP�T�]��t�mA�==P9��K��Pxw�zp)�K]z�f��uD{2��T�}�+�	C��~.�P�M������R�C�q�{b�K�L�����`���h�
�>A��ݡ�'�*2�*���K6�R��H&�(T9VP�1�e_� !LX_�l.C�'��OW?�2hiLЖI|`����Zp�<�!��U�uHgL!�DJ��FHe�Dʞ{��%�����e�#tsʏ 
Hf\�E�W�[p˄%�y����C6%���~��@���jx�=p�O`�5�ҿ��0>O�r����lS�/
ܣj��d�s�=�Ze�rmp�=%�G���K��LJ"��Aհ����y��~�`рl����d�쌚|�nRluE�23N�Y����sƸ�rB��+3ZٜY��jFs���Q5�9�'K6�K������qn�\��ŝr�RUc.��JL�A&�ɸ�M�q�1u2���x=Tg5�
��y�@L���ك�Tp��)��0�?��*�P+
50�UYY�)Q�n(��2��F
��s��3����>T�X��H�e�
�@D%*�π�ek��j�8��L�,�Ra,�{�Ehk���u+�Eh[����"t�G+;c�iBUu�]�qY�y��������*+(�w��dmelj�륱RyY�x�?I�Y�fl��r��'�ɟ��<�]d�?�W����y��@��m7���@���u��'�M�gpZy�	�
�?�P�8�X��>&������͛�����������y��}����S#��t�Q����/OGKX-yu'qzO��9q�uQfz]j�W�'��q��PR��8.��g�Qp�
�5~���q�#�F0��v���BLj���ui���#��u� �<Ǫ<L�Lj�x���B��$eG�}S~R��1~s�Q`����]��g�F��A\����2�|&�Ō�JL`��tL�
�c�f��I���!�Ʌ���*��h�B6�?�5�r������9S�N1�_89�-�G;2Z���ឪ���LQ��\�S{b�Q�]�u���T�T�I5,�T�J����N�z(��_�����2�'Y-�WF����6�kO��C����T�}�T���V���M�}�3c���7��ucKS�o��g��k?u���订��k�w������~޼�f�l���U�m-w�c�UG+0�,?�
�i*v�2{@(��y���.���DTIej��Տ�"����s�T��T1,���i{̘ژv���D:����y��נ�;���C�a��l��
endstream
endobj
31 0 obj
4897
endobj
35 0 obj
[3 /XYZ 33  
765.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 14.4 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��[mk�8��_��u�jIP
M��AI�>��d�X�e�����?9gc'��L��^wj'�F�g4�������MLf�/bI�ټ��w��'�g�_�Pҽ�нX��ⱸ-n��Ǣm���|(&M_E��|�{��Gh�k��I��W��%�����+_�M+�>~�����*�����~�c����e�Rk��jl�|>3��Rz]=���-C���hU}�.�W֧�(c�&j�ixO�0��F|}W��=v�a��a�:7:�Lsg��xW	S57��ߦ?��.��H��I���3M{�s��l]-I���NOI�;z�m�c1}�c���:]��J(-�E�γ沸/lHތ����<���B,>U�5u��O5����2Va;k�Q�DV�#�:�qʭ��QkZ�$��}ܚ6+�++�Bg<J�N�0�=�s6$�$��=�A�d�Z���>�X0m[���ܬ$׋Y�	��*6�
h�k/Tj��虦=
�v��uԞ�J-�=߶w�Pq����H��'���i±TU���N�X<�����i�j86���e����
+��=J۟guI�m�h����Zs$1Dt��Op�.����}�~h�w-�
�M]�E��w
�-c�"–�t��6C�@V�'~2�r� ����r���ϋw�~���BL�f�o���	�����f�s�i�9�E�/��3�h�69l�B�-%9~Hk�$��A�Ϸ�%���I�x<ж��8�C�Hە�9�'|Ɯ�<��H1尚���o����:��	ýÊ���4u,P��:r��������kF�Lɣ�2o�9�5JX8��o<ی�o��0w�5;j��V��-7q}�a�q�����U�'7�+�wr��^�t}ﵳ1A��o�qi{����"�� �LSZ�����T� ق��dž[-��
J<l-@�5�(�����l5��V(���H�Q���&��Xpu.��AI����X.�D+[K�h{A�y�4��T���8�7=����T���l�p5R�XX�Dl5&[��a	
��g�8&[X��=�$�A�2�A9[Ƒ�>/�U�F�=�l}8��l�q���kΜ���x��yo��Z�)�`Te���/m�(�%N���b(c�S|=Y
[�WN!��a�a�i�:��x‘|�����̄���.Y��3?��>r��b$�f�8�9ebNfb�-�Xqkx�F-��r=^�Y3�U74�}��GʚG{����ɚo��9��L��É�qW
�	���Ki�������i�G?X��8��3��N������돶*��)#�<��������aX�*N�{<��-2��sh�Q�aU?�T/�T2���F��a���F����g�.����13�ގS������ [�'�Y�����B֬�^:�� ��F�_�U�o��u��|˾V���-W��h�#�D���D��~3���
[�Gj�8�18��<���Lk�o�6��L?��K��]bT[^����'_0��ls��K��[��Y{XE�얞�]�^u�����H��Ȍ��d��}����jz�
endstream
endobj
51 0 obj
1581
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+Ȍ�`�P`&�7�)ry" �9ܠ� ry+(*�&��&Fr�I0�$���[s=�xd�M6	0��g0׾���ꪯ���5B�
�L8B����j�=���bI��_�y=�����Н����q!l!���';Ư������삲*���`�B`l�1-���#d~&��UE$�,�v#�U����7�	Bh;��`:Rp����$��V,�-BGb�j���!K�������eD$$S�A�e�x?�4�C��Hm�9"'���B�j��S{5�A�M3ϥ����a����F9QG�5��S��rs���R�*Z9�%M1�_��$���Wq
{��Q�87���K��0Q.�LպA��t�'�蝝���>��y?p��rqQ�r����j���G�J�����J��˴HF���t4x�o��v�\�j��b��͍s�Kv�����}{\,�'�4��Sm��MAA;��Vo���m�����3�((D���'�.�J��^�Q�Y�˱
���˰�3Q�޸* ���5k�z�f����6�~�R��]�}��ȲF�uS��F7�� U
R�)u��Ͽ�c�}��q�C�O}��2��_b��LY9ik�=��W���h:�ցCq�[�x::��ip���V=��m���@��Z��)&���p�
�>�r���ө�͐��O��A����.I�C��dg����i�D���Q�Т�5(	�c^UR�w�h�m*�����x~I™��aT�s��=52b~������Y�%���,\'	���y2�� C.���
(����*����z�����<����zy�Yï\ޒ�]�$~X��Sl�&ž]�O=�ych0���b���4�>m���Ҹ=�GG2u�_8������
��g��_<r�9%���7ȝ+�Dv��4ȡ���	�P���*�����R�t�)lk�9��
[6}s�Ͽ(- z��7-��7/GpZ��->	����W��HNJH�O]pLTĬ�����8~�r�������Ӌq�9��~�-���e�B��ՙ�%�J�ʊ/Mݶ�K/TT� *��'6�(�ˁ�Z�=Hʚu�,7eew�wsr�^@�q��!�-@�,����<��t�[�w�3�Of�05�a���Y�L�{A画�-t�3���kȽ��"C�#e��	����B�5�shk�y�;�����[�}7�K�1�v���*�-�ta@#Q�$u�����;�	�i����s����E�1g�
@5E��c7��
N���7��7�aD�w�M[n�ݱ^Z��c�@85<��k���͟s���:���e�:���d���(%���z�r栱
�o�me�Ĝɀ�Q0��l���N�b�se%��f���[�fN(-?_��a�5�!A%ً�KČi.SfL���ٺz���}zf��5ST3f��Oܓ�`��ؔ$�Gf�`��C	���e�����S��7����h�Qy��j�Fx}CϳM�Qh&����fU�A���P\t!�R��C�.����:���g�C�����R��=0i�/�f�7��96Ԓ��|�8���g
�:Gc0���:���l�ε�!��j�C����_�!Ӻ���@lx�e�@L秅���榦ܬ�C�,���*���М��Q�us�L�O��{�ȎTo��q2_�}��3��-�Ȫpu��Ip)�y�f4��xk-i�O�x�8�e	��&7��Ouv@И��g0�T���� 6�gҁR�y��^��@��7�lc;r�&
��Y7s��R p���Wh�:l�<y��ox`����Bqp�9u��zl�Ĉ�fzt'HrS��{�,6\�75X���/���Ū��C�,k2�&� Β�Y^�I9DL���-9Ē�-�	�Aa�O��⋗�L]�E���	ډ�ا�c�-Y����!�`�^q�?����C�򲑃��܀́�Z���8�\��ҁ��O&%u/\0��{%��m�ɝƧ��ص�z����N@����{�y
�i��J����t��K�4L�Yf�)�e/_2�vU�\+/*�K�8�a�PV�|DĶ����Eb�5��h��um�z��\n܋Ѹ9i�:��s�w�^*e�>�M��8Z���U�8`XG
9}�M���-v���q��q;����|I8�ֿ���28����6:���;��>$i�y��:��yj_��"=nNN�w��,~��#b���bRӱ�r���<�ďCk[��;�b㫑[F'�#��caP�5��%�����f�6GF��n���}q=�h+���X�r��:7��{�{�
������*��l��H��F8-ԞY(3R{{��I�o!m�����.q��o�~��r3p����¹vH�R�V�W��`@;�?|I�ʸ�	�Z��i���an搋�=7��ws�,�g[�C�E����
w��Do�q{��e:�x�S��zE�Ͽ�3��Xc��Ajd�a��^�/�g?6ԇE�B�s!hw$�Ò�v�Ce~V8UT�NSz���m,�&<�f[h��4W��/q�H�`��i��\ø�ܔ��lQo�0I��ѰȲ����AK����	�	����[{N�7�F��5ԟ�i�z���?���A^��73��]�u���ĸ��Wr�?�,!>���w(������w삦ъ�d��9���
{�'��pn��_�&�S��{T��j��j��C��Q��Ć(8K�e�?������2w6]��NP�~s|�3T��x����]��[fa ��_h.^��\��u��,�o��!����Z��r"�s
ӡ��.8�Ҟ�K�钘��_�>p�fK�©���C�'�w���x&�47�$����1)� �.A�X�eV5<@�Q$!��H��$ǣ�?��o�,_��b|����1q�Lv��gs��ں���kSo�]I��s�<U\�矑��.*�-0��7_��7?6��tn�?����>2j���ܹR̟����2�����Ar@�\��;M�_�i.�]����P*��{�c}�F�I��a�S�r_��F��GLs@��t�,�L��Y	��e��Ξr-�
��VUmqۓ�l������%�^}��+d}�#~� ֈ_v���@<��
HqҨm�1����-M������_��N{09���Y�1����y~4��W�:V\��Oࡺz���K�û�z�
R���nc�C��

���?�;������@�|��@��k�M�/�Q
U2m@�Z����������{<�?����v�ֱ��1F���L]���2�)
�~*��w?�׉�22�\	��\s3�ف���ѠF�1�p���a4�bW�IH~%�~c~vVn�k���6|��
v=va!�[�Ö�ԯ��w�K@��O>�Ry�/�,X�b���+���4\��k~A�b��G�$���߁|T>SG���z��@CKmd�Ⱥ�Pl��[����V-^�i�[W6m鍈ظ����{[8/(�EO��^LY�r����1k�g�� $�nS`���d�͟��z+jU�h'����b.��r�zDox�XD�Gr8�'8�;0���koG��y5A��G`�_-�A�5�^�K�������~I��\���a`���Po�,���}F�nS�����1Q
O,[q�aIuٿoK�����mz1�v@n�,
-�킁D\����x���˽/��&`�6���G]��W
��5 �Y�ꖳ�{�5�ؑ�A�kX���.޴��k7â�%k
�Be��}�����O'�au��a ~S�8�ޅ�s���+^,*����k��$&���k����H���P\�
*-


(*	F���yi�C�<�,'&Noga[±Z]��1����3��19��;.������-{�t�)�'Xt�p��qw�s�����]�0/�\��uN���c�s��J���l����G���d���ؗ\~	q4��~�*`��w-eI��Ҙ��a�.�>"l��U[�]�t۶�G����u����/!��ի�ڒV�&�FF�F)�;�S�NB��Q_d���;W���4�.�q�����*��o�����K"A�L샩5Q�!;�/����ˌ��1u՚M��b�]� $h=Ƞc����G}��R:��eŌ��'�Wԥ�}�0R��Y���4��F�_�f��ZO1��]3�m���z0Ƃ�	T��x	9q{���0��0�=�*��7��� F�
��qęat;�T��b�?�����s�ϛ���<Y?��s2�7&^���4�8�yp����P��m��'?<�G�����1CvO�<S�����E����8�PvO���+�k%�����"��\�*�I%��r�!��<�C(�h�ů$|I��a�FҍEO'�]��U$Y(%�Kē�ƶY-�H=Bl�[D��3z�52�)�X�%�!]��8#�$�N��82�{�8��=r���1�I�lߏ'6^X��.��#d}�l������$
�x��Fҁe
�D��Ä��d:�Kƾ(,EXJ���C���+I&J�Dw�F�z��Ë$���,��x�O�D:�.��t#�;�rq\%w�����Z^�g�����`/L��B���p_��"d�&�Q��Z./���$����M�M��36l�ٺ��l�m���4f՘�1c��<6�IKd�#i�/;r�A��b�3�wZ���s�:��oX�<�oY�����u����d�
g�^@�HX?��)�z�Z�Ek��5k] n䶵.#N���Ǔx��IYGJH�"٤��P��o	��F��'�
#�$����"���w�Y�R+�H���8��֕�de���<<=U!FcV~�*�0m�jQ~�*�}*U�f�f�Td��X\o-�2,$ָ�X��H.��㒩H��fd�秖����Cg��V)�k�M�-��
��?�0���c��k�����x6�����x�p��EJ�-b����8�K~��'f��|d'
{
%��bO$�8�!‰ç�Ħ-++�3���rvjQjZv�lcI֜�����Ҍ�9�aA�qA�^�q��G+�
endstream
endobj
58 0 obj
5244
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 270 745 469 564 611 548 682 866 647 707 651 589 880 339 345 492 240 503 557 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> <0034> <002E> <0055> <0073> <0047> <0054> <0068> <0063> <006D> <0074> <0076> <006C> <0070> <0066> <0067> <0050> <0048> <002C> <0032> <0049> <0077> <0079> <0045> <0052> <0046> <004F> <004D> <0041> <004E> <0044> <0053> <0057> <0028> <0029> <0078> <003A> <006B> <0035> <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 
0000038255 00000 n 
0000000187 00000 n 
0000000282 00000 n 
0000000756 00000 n 
0000029337 00000 n 
0000038121 00000 n 
0000000319 00000 n 
0000000362 00000 n 
0000000405 00000 n 
0000000449 00000 n 
0000000493 00000 n 
0000000530 00000 n 
0000000574 00000 n 
0000001080 00000 n 
0000007535 00000 n 
0000000877 00000 n 
0000001053 00000 n 
0000007863 00000 n 
0000007556 00000 n 
0000007600 00000 n 
0000007644 00000 n 
0000007688 00000 n 
0000008188 00000 n 
0000012626 00000 n 
0000007985 00000 n 
0000008161 00000 n 
0000012691 00000 n 
0000012647 00000 n 
0000013009 00000 n 
0000017982 00000 n 
0000012813 00000 n 
0000012989 00000 n 
0000020361 00000 n 
0000018003 00000 n 
0000018047 00000 n 
0000020194 00000 n 
0000020020 00000 n 
0000018298 00000 n 
0000018452 00000 n 
0000018591 00000 n 
0000018987 00000 n 
0000019859 00000 n 
0000018784 00000 n 
0000019263 00000 n 
0000019391 00000 n 
0000019554 00000 n 
0000019723 00000 n 
0000020257 00000 n 
0000020679 00000 n 
0000022336 00000 n 
0000020483 00000 n 
0000020659 00000 n 
0000022357 00000 n 
0000022621 00000 n 
0000027977 00000 n 
0000028459 00000 n 
0000027956 00000 n 
0000029477 00000 n 
0000029735 00000 n 
0000037122 00000 n 
0000037327 00000 n 
0000037101 00000 n 
trailer
<<
/Size 64
/Info 1 0 R
/Root 49 0 R
>>
startxref
38374
%%EOF
PK�f[&�**(doc/alt-php81-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
PK�f[�_Y@����.doc/alt-php81-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.73";
}

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 (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 = @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 = @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);
}
PK�f[P�$���'doc/alt-php81-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-2025 ionCube Ltd.           Last revised January 2025
PK�f[�L�{man/man1/zts-phpdbg.1nu�[���.TH zts-phpdbg 1 "2018" "The PHP Group" "Scripting Language"
.SH NAME
zts-phpdbg \- The interactive PHP debugger
.SH SYNOPSIS
.B zts-phpdbg
[options]
[\fIfile\fP]
[\fIargs...\fP]
.SH DESCRIPTION
.B phpdbg
is a lightweight, powerful, easy to use debugging platform for PHP.
.SH OPTIONS
.TP 15
.B \-c \fIpath\fB|\fIfile\fR
Look for
.B php.ini
file in the directory
.IR path
or use the specified
.IR file
.TP
.B \-d \fIfoo\fP[=\fIbar\fP]
Define INI entry
.IR foo
with value
.IR bar
.TP
.B \-n
No
.B php.ini
file will be used
.TP
.B \-z \fIfile\fR
Load Zend extension
.IR file
.TP
.BR \-q
Do not print banner on startup
.TP
.B \-v
Enable oplog output
.TP
.B \-b
Disables use of color on the console
.TP
.B \-i \fIpath\fB|\fIfile\fR
Override .phpgdbinit location (implies -I)
.TP
.B \-I
Ignore .phpdbginit (default init file)
.TP
.B \-O \fIfile\fR
Set oplog output to
.IR file
.TP
.B \-r
Jump straight to run
.TP
.B -e
Generate extended information for debugger/profiler
.TP
.B \-E
Enable step through eval()
.TP
.B \-s \fIdelimiter\fP
Read code to execute from stdin with an optional
.IR delimiter
.TP
.B \-S \fIsapi_name\fP
Override SAPI name
.TP
.B \-l \fIport\fP
Setup remote console port
.TP
.B \-a \fIaddress\fP
Setup remote console bind address
.TP
.B \-x
Enable XML output
.TP
.B \-p \fIopcode\fP
Output opcodes and quit
.TP
.B \-h
Print the help overview
.TP
.B \-V
Version number
.TP
.IR args.\|.\|.
Arguments passed to script. Use
.B '\-\-'
.IR args
when first argument starts with
.B '\-'
or script is read from stdin
.SH NOTES
Passing
.B \-rr
will cause
.B phpdbg
to quit after execution, rather than returning to the console
.SH FILES
.TP 15
.B php.ini
The standard configuration file
.TP
.B .phpdbginit
The init file
.SH SEE ALSO
The online manual can be found at
.PD 0
.P
.B http://php.net/manual/book.phpdbg.php
.PD 1
.SH BUGS
You can view the list of known bugs or report any new bug you
found at
.PD 0
.P
.B http://bugs.php.net/
.PD 1
.SH AUTHORS
Written by Felipe Pena, Joe Watkins and Bob Weinand, formatted by Ondřej Surý for Debian project.
.P
A List of active developers can be found at
.PD 0
.P
.B http://www.php.net/credits.php
.PD 1
.P
And last but not least PHP was developed with the help of a huge amount of
contributors all around the world.
.SH VERSION INFORMATION
This manpage describes \fBphpdbg\fP, for PHP version 7.2.34.
.SH COPYRIGHT
Copyright \(co 1997\-2018 The PHP Group
.LP
This source file is subject to version 3.01 of the PHP license,
that is bundled with this package in the file LICENSE, and is
available through the world-wide-web at the following url:
.PD 0
.P
.B http://www.php.net/license/3_01.txt
.PD 1
.P
If you did not receive a copy of the PHP license and are unable to
obtain it through the world-wide-web, please send a note to
.B license@php.net
so we can mail you a copy immediately.
PK�f[G���man/man1/zts-php-cgi.1nu�[���.so man1/php.1
PK�f[Z�?N��man/man1/zts-php-config.1nu�[���.TH zts-php\-config 1 "2018" "The PHP Group" "Scripting Language"
.SH NAME
zts-php\-config \- get information about PHP configuration and compile options
.SH SYNOPSIS
.B zts-php\-config
[options]
.LP
.SH DESCRIPTION
.B zts-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 zts-php (1)
.SH VERSION INFORMATION
This manpage describes \fBphp\fP, version 7.2.34.
.SH COPYRIGHT
Copyright \(co 1997\-2018 The PHP Group
.LP
This source file is subject to version 3.01 of the PHP license,
that is bundled with this package in the file LICENSE, and is
available through the world-wide-web at the following url:
.PD 0
.P
.B http://www.php.net/license/3_01.txt
.PD 1
.P
If you did not receive a copy of the PHP license and are unable to
obtain it through the world-wide-web, please send a note to
.B license@php.net
so we can mail you a copy immediately.
PK�f[E�4%%man/man1/zts-php.1nu�[���.TH zts-php 1 "2018" "The PHP Group" "Scripting Language"
.SH NAME
zts-php \- PHP Command Line Interface 'CLI'
.P
zts-php-cgi \- PHP Common Gateway Interface 'CGI' command
.SH SYNOPSIS
.B zts-php
[options] [
.B \-f\fP ]
.IR file
[[\-\-]
.IR args.\|.\|. ]
.LP
.B zts-php
[options]
.B \-r
.IR code
[[\-\-]
.IR args.\|.\|. ]
.LP
.B zts-php
[options] [\-B
.IR begin_code ]
.B \-R
.IR code
[\-E
.IR end_code ]
[[\-\-]
.IR args.\|.\|. ]
.LP
.B zts-php
[options] [\-B
.IR begin_code ]
.B \-F
.IR file
[\-E
.IR end_code ]
[[\-\-]
.IR args.\|.\|. ]
.LP
.B zts-php
[options] \-\- [
.IR args.\|.\|. ]
.LP
\fBzts-php \fP[options] \fB\-a\fP
.LP
.B zts-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
\fIzts-php \-r 'echo "Hello World\\n";'\fP
This command simply writes the text "Hello World" to standard out.
.TP
\fIzts-php \-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
\fIzts-php \-r 'print_r(dba_handlers(1));'\fP
.RE
.TP
\fIzts-php \-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
\fIzts-php \-E 'echo "Lines: $argi\\n";'\fP
Using this PHP command you can count the lines being input.
.TP
\fIzts-php \-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
\fIzts-php \-R 'echo "$argn\\n"; fgets(STDIN);'\fP
Since you have access to STDIN from within \-B \-R \-F and \-E you can skip
certain input lines with your code. But note that in such cases $argi only
counts the lines being processed by php itself. Having read this you will
guess what the above program does: skipping every second input line.
.SH TIPS
You can use a shebang line to automatically invoke php
from scripts. Only the CLI version of PHP will ignore
such a first line as shown below:
.P
.PD 0
.RS
#!/bin/php
.P
<?php
.P
 // your script
.P
?>
.RE
.PD 1
.P
.SH SEE ALSO
For a more or less complete description of PHP look here:
.PD 0
.P
.B http://www.php.net/manual/
.PD 1
.P
.SH BUGS
You can view the list of known bugs or report any new bug you
found at:
.PD 0
.P
.B http://bugs.php.net
.PD 1
.SH AUTHORS
The PHP Group: Thies C. Arntzen, Stig Bakken, Andi Gutmans, Rasmus Lerdorf, Sam Ruby, Sascha Schumann, Zeev Suraski, Jim Winstead, Andrei Zmievski.
.P
Additional work for the CLI sapi was done by Edin Kadribasic, Marcus Boerger and Johannes Schlueter.
.P
A List of active developers can be found here:
.PD 0
.P
.B http://www.php.net/credits.php
.PD 1
.P
And last but not least PHP was developed with the help of a huge amount of
contributors all around the world.
.SH VERSION INFORMATION
This manpage describes \fBphp\fP, version 7.2.34.
.SH COPYRIGHT
Copyright \(co 1997\-2018 The PHP Group
.LP
This source file is subject to version 3.01 of the PHP license,
that is bundled with this package in the file LICENSE, and is
available through the world-wide-web at the following url:
.PD 0
.P
.B http://www.php.net/license/3_01.txt
.PD 1
.P
If you did not receive a copy of the PHP license and are unable to
obtain it through the world-wide-web, please send a note to
.B license@php.net
so we can mail you a copy immediately.
PK�f[5��man/man1/zts-phpize.1nu�[���.TH zts-phpize 1 "2018" "The PHP Group" "Scripting Language"
.SH NAME
zts-phpize \- prepare a PHP extension for compiling
.SH SYNOPSIS
.B zts-phpize
[options]
.LP
.SH DESCRIPTION
.B zts-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 zts-php (1)
.SH VERSION INFORMATION
This manpage describes \fBphp\fP, version 7.2.34.
.SH COPYRIGHT
Copyright \(co 1997\-2018 The PHP Group
.LP
This source file is subject to version 3.01 of the PHP license,
that is bundled with this package in the file LICENSE, and is
available through the world-wide-web at the following url:
.PD 0
.P
.B http://www.php.net/license/3_01.txt
.PD 1
.P
If you did not receive a copy of the PHP license and are unable to
obtain it through the world-wide-web, please send a note to
.B license@php.net
so we can mail you a copy immediately.
PK�f[p���(licenses/alt-php72-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�f[�l�licenses/alt-php72-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�f[$�u���%doc/alt-php72-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�f[�E#/&&+doc/alt-php72-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�f[c��^0,0,+doc/alt-php72-ioncube-loader/USER-GUIDE.txtnu�[���ionCube Loader 14.4 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.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. 2025
PK�f[}��6�6�+doc/alt-php72-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:20250130155421Z)
>>
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  
131.750000  0]
endobj
12 0 obj
[0 /XYZ 33  
296  0]
endobj
13 0 obj
[0 /XYZ 33  
97.2500000  0]
endobj
14 0 obj
<<
/Type /Annot
/Subtype /Link
/Rect [71.2500000  66.5000000  144.750000  75.5000000 ]
/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��][��8v~�_��FI���@w� �0l A�l���8;��Ϗ.TU�򱪾�(���H�\lR���_�ۗo��#y����|�r�RSd�I���ej�'�P�{��Ï�����s�����~�n�|���{ޡ������/�ɿ��{�_�]��.���#L�,/������Sd�Nu%���=������O�o�>���2)�T������魞�eZ	�s�e�]y��J7ߕ�5X��}�I.����/�ߟ���ㄪ�>Oʰ�WVEXx
=��12����E��?�fy���C���}�5eH��5�^���k���N��%y����׿tjJ!����َ�"�t��ӈ�Gre�s�n�L��)�s��ӈ�GL��=�FL7���,�#��u5yNկ�������|�[�k��ҎTi�=�]<>g<�
G>�#&UE���w ���D�o*D����
aϧ�����Ont)�}���o��ɻ�����/_���ɇ��Ǘ���xy��y�������sf}��6��&-��.#�wV�-�Ϡ��7��t�w�i5����Av
u٣�N5����}�i9>wQ�9�z�v-�-�Ң{��y�TM�K�պ9j
�M�0D0�p?O�|Lg��Y�����a`�9�
�����SL�I7�H˞]��
B�a�X���x�ρ��s,�WSJ�*xs�`����q���-��}���;�ۈqS7���i/ƪ@���~��S1���[^o&�'�^�/8ާ�s�B�+y�����q��6s�1��1w&8�co�����&��:���b�"��eBѷ��R�)g#�fW���x�c׌��H��s0�������ɮ�EVv�:�a�Y
�|��>2��ءӜ�ַ֊��El��|�_w�{�N��A<����v�V)a��-�ë��lr
�E
��Z��-e�`�->S��Y��xݵT�^k�;�
�1M�{�v��w��:I#�(@�(Yw\-t�9]�����4b�Tr:��9cG�<:�&� ^�CQ�j�t�U��	S|�3A�8g��M�^���c�@8Vðf���c��5;�s��@�9�>!�ٽ�5{�����%)�&ěpW7aMW�g7c�R��<����&M��o�ףO��{�Y��Ms���|�tFs�Z-��`�b|����~��z�?��^���{��G~�����o���bN�ҝ[�V���5t��8�q�f5*؈p�:H��a��K�u���–n_��99��F���] p�9��\rSݟ�LfG��Օ�6��` 1|���=ę0 <dz���#��ص�.�#��1J���*K�|�ɔU��T}���=��(��DT��?6��3��)Z���1��xG69Qp$�#�p���T�<��gbo/Į�j��2��|�#��?����������8*I�d�.6��u4r��Y&iRqC�
c���
��PF\Ƥń�<N"H�����,�U�щ�d�>L��N���L����4�шy��w�!�5a<t��k���2���g?�W�g��e�-镫��� @'-��~�7�?�$�h0W�.��-��m@$
�XL�^�3�
��ǁ��L�T(A����e�n����v�W��7����U��\KL�q,����j�^Y!��D���a�M����`p	n��$N&$0�J5��?",�~}�����3��d츮�M���rb�#�($fR��>m��~��E�ofw(n�K�ox,��ŰƄ�H�Z�)&�X�c�n�
3L]0�|�5���x� �b�X�Zڈ��׏��r�_��TK�WL$�W��p���,�9�&F�Q6ܾ����*u��կ9���?���{Z�ߙ���5� �u�_�9��L�O�!h��IH�˴{UN=K�$���ue��B&Bm?ץ��9���b$k�<Я��l���t�!:98"�D�Ah��� ���i㣗4J�r
�v�<b�x�U���9ۊ����E*��__�_ߚ�Y�a�T��[�b{h�l	������"���/MV
��L�/Y����1��1�s~�1�
��Ռ"�׿�Pu�ٰQΫ�p5ח/0oe2J�.�)�^��i�9�TM�&��cE�JkY�?��~��2/Êaeq��r4n).c<C��fD�P�L���ע��φʋc<8�½0�p��Y�k���7�х�k �Ţ7s֍�ni��;�%�҉���vF�c���ե����t��Y��oZ�Se�f��L'r18�X�.��s��K�)Y
8�\�`��v+�i+�$�RɯݗZ���BW��[^��(i���RiY�ʺ��T�V�W�a�2��Z����gԿ��$c���OA����cp�TG�_ ����7N�k����I�a��ğ�-�v)� P�H��\�0;�d��"h�2�W�� �x1��Ȓl�fpıF�âO�s�
(T;�⁀��#�L�I^�l��֯�hT�߮K��J(;�@A9ҒHKV�%Gߪ�T��<���y*��)��<��j0I�ku:OY��<eծUu��w3�d�ZK�<U�k�<��|�5�ɡ{�˯�JiCX�b��dži����~�,�җ��6<rf� �"Kr�7R#��,�(�F�7����aq4�R�.�7p��*�j��vPL��jx�ձ�M�:y9�:��Q��������T�V�:y1�:m|d�1P���`��k-�:���L���
2�g�C�w��߮T�6��5��cr3����-gtR4�7�r�J�4�9ጲZ8Y�!��(,�3Z�m���&E�KV&�n�������)�;����L�2o�2�iP�Vm~��
Jg��z������T�V�A�L�hP�M�o?T��L2v��5�ZH��i��¶8�8
��n�q)p����e!R�<i�B��*�iE�����Y���U��
;�p���� ��U~�m#���ԺS4�(b��]
&�v�Ni)�"�_۵�Q�`��L2v���#O#�MT�ՇQ6���r��֧r@��0p`/~Sj���B(��pձ��0�}�����9b��`�8/�M(��j�S�?Մ��xpx�6���|�v�E3R���.��,�Bԇ4y_�ƶ�03��؝yqY��f�Njj��豤��XǒZ^RK6U�Ϯ�ߖ�a�m�Y	�ӓ`f�ud��s�k߳�hޚ*�
�k�qo�����z�5$�����W��3�k���L*m��|�75/:QT��QS�i����T��bANx��(,~��VLW	'�;�l%�Z8��fn1WGe*^�v�3�s��ֶ�l�Uc�1�cKR��vC�u9��ܤ�;��~��M
[&��g��%_Y8P������IM5V�;��Sk�pT�3]��ϱxw6�j�SL��F��
|� S=`�=��k��T*GsT��b��i�V2T7��j&��G�	#�ln2�R�s�@�i<z����ʉ~����d�0�bB�O��m��"pC0�bN���K=���$���"m���F�{�|��C�P�	�8*��W6
����u��C�����W�2��gn����׳B�
��2_��a�*B\칺 k�@Fv�2FpL���g̼��L�C�1ta��3�Y�H���-�Ӊ��"!�*O>�9�.�[�J��c�p@���K��:u�%�ʑ]�E.j�4�WaY�W�R(�j����׃O�q)��1WF:����i*��=�ƛ��X�-��g1f޽����ύ��J
'V�%����ȓ��UO)���"�0R�s$<�O!ެx���fI3����A0	�?��^뵽�f��i��'�}���a�&lM�42,��
]ji��2�>t���ˠ��`�j�S�c)����;���&U�ݑ�2U���c�慜T���B����֡��ӉM��Y��ϱ���Y�XA�st�bނ6����s ��s?b]Gc�^?����)zLF���S��v<�|�����ݦ0��2�qc�w��왎(û/��-y�>y��~�����#y�!��!y��r0in-���D
)H� ��?�\_�سtY�b����1@ԭ_��)����($����Y3�`���D29K^˕1p�5�b����Mo����7��I~����`�ôue
�1��op��0�`�!�n3QA�V
���P!%��fxp(:�6-Æ��+E{��~���{~�W�v4 d�'pSI�o3ɳ��"�)�1I0�"pN�ΰ*�WRw!�}4�
!����9wV�4�a+d�6�u���S�x�w�1�1;���(��F�}3�s��Q&#�)�@�)LUbc���e�oQ��D���y����lQ�7"�
fQw0<�B3�yaX3�>C6�Ҭ��[fF%`�lw0D�z�fb܁��o]�G
�c� 
�a�"_��gS���`��d^����7#m^z��f��X|1}�sa�HP���,㛹W�욹W��i�^�YӀ��4soW�I�]�m�^=�̽��]��4so7�IƮ�p3��T�`��l;��~s��������n:�0��6m����f�.�,��h�>��J1�vw�x$���G�7+���G���j�ρ�ԍ��<խ��H�7���p��멡�ԍ��<ӯ���T?�/�((�'���ի}GQ�D�H��q^fv�f��
c>9����� ҃M�G0�-��gxැ�ߐ9�>�9�e�o��c�YX���*|��T��;�7�
��M�F?c*Py��ן#SA3��T��5�l�T�2�^66t>��y�_oqS��+'FSA�� �
�j�h��.��E�l�Ekѱ�sĢ�5����,�.��.�w�0c݌��<ӯ�8��}٭Ȣ7n��pBżm�!��84F����z\UjD�F��g��݅`D��Mp-u/��fNp-�N�,˱�ڌ��<խg�2�\Kk�*��ڌ��<ӯ���Z)
��z9�,��D1��Ĭ��-Eq(�8�@T�h��^.�y��$�������$D�
6��PPjG�`�������A��Ϯ'F�R;b�L��҂�&
Joc�欞�i�a"J��#8{��)�pb��:=��Q<ݴx�6:�/ة�|���jѲ��~[�&26N���ĝ>�#CnԒ�#�<;�F��&�rA1���d}5����w0���~$���
�t5�ڟ�$����r�PI��(�2U5�f��9�V7
{̰�c���q�1�v ����r�M�j��p��	�~�t�X:)�v��f1�:��=�#�3ŧp�!R�`�h��x|K�ix��"9����o�R���_ds��E6�\ds��m��{N��0
�Fy,�!{J�O��������I���ޜr�gK�Z�p���jڎ��~s�;g�;UZ���0XLM-Y�g�s�i5D��s�9ֽQ���s��Kp&����gT��nE�k�f���=���33#�7�g�����z�x�w���J�����	JR����zB�v�)�ka���
Ʒⵃ0�����X��Y����Ǟ�NL�G���9ܩ�O��e!�E�Fd�aD��X��\0�$�����S�kk�qo�"��Ҋ��q��|�5�������Yϭ��T59(j�p仼��W���=��A;�Nw<.=�A5�]�<���kF<�j��+��y�*�GT�'e���w�����7bo[&�L�.*���SN[����k#/���53c����.l9H:T96�a�=����#Bm�"T&L�`ج��T��M�p�f����)�
�L�VA���h��@����[Y�9֬SLu
�VC4ᢚVy��{��$�5.U��!�������Sl�)����ɫ��t��k��$��RzQ����x��{ʤ���3΂��������'��H�@����EaJ�%0F6c�JnJ�H�]~=���z$�K��o�=	�R�4�yp`<�k��i�R�@�u�[�ނ�@���< ��p�g��XL���Nل��ݴ>���׮�pc���_j�1�g|`LQ�L�)�Ѷ�>rS0��e�E)��*F�,�^���Y�ê����2X��j��wai�EU]�!�1~T�4^�E"�n���4��ӳ���W�1��r"�Fg&��2��oh�>#.<kU˗��ŀwP�ptk��]�s0l�Zk�����	�F��+����S�>��K~8�|z;�*�~N>�I�˙
endstream
endobj
16 0 obj
6379
endobj
20 0 obj
[1 /XYZ 33  
760.250000  0]
endobj
21 0 obj
[1 /XYZ 33  
672.500000  0]
endobj
22 0 obj
[1 /XYZ 33  
158.750000  0]
endobj
23 0 obj
<<
/Type /Annot
/Subtype /Link
/Rect [102  696.500000  175.500000  705.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��][k�H~�_��Ȫ*�.`�maaL���C�dv���d��+�JmK꯺��QIrk㶫���:��\��o>F��#����-zr?o>l�8�I�_T�{������P�}���l�G�7����7���x���h��4�p���"�����_��~�����e��<�_�l��痿�$��TeQ�=�Z���?��V�H�"I�6ڨf,��߽x��=��K�gi�آ��mZ&����&o~���JuE5�迟6�V�?w]�X]���\�؎��:)�Ĕ��]�&�vm�w]X=Q�:Iҩ�V:��k3ݬm�w�~� ���c[׏���,R:z�5j���X��2���KtYq�۫��M�L[�C]�ݶ�b�iV�5:�LRl[t\6��hɷ-YlR�k�ٶ�q���Ӣ�ۊ�ߦ�{F5C;f�ʺgt�t����Ūf�[�kɒ�tG-ۏE�xf�w�j[��768S��c�<CЁʶ-*iሱ�Pccf�W��^�d��;�z�L=���h�N��z�n�gf��ZU“Ep�RU�7�����#P7��6�{C��Y˟k�6�	c���Sg��ʡVKM���ⳍ�vݞ���·u
�֔�􆟁3U�n��h(�.�����u+�d����pl�,`���L��Cڡ�CU�Wam���@��Ң��ū����[��k�G��YQ<6QY�5֞�:�������aLT��W�je�~Ō��%xl��q�4sd���{��p>�}��ӆ��q^�9 >-�B«������lY%�IBʾ��S/��2r�s�	�Jiӌ�Ϝ9��߆׍�q?�؄W�uX�1���0(>?��Q{��P�@s<���
�,���9Ƣ �A�=���fzռ��!Y����2��68��#��`��,����5�ش,�ʌs�72#���-<Z�!��y�(���&��H��1)�3�5�H�㑍p�L��i�׎
�(���(�Ö#�_�������LM߶�I�&��X��Ԝ�Y棢t��=,�O]�`��Lg�c��~��||�Dc<c��]����+F�y����L���M���*y,+S��<�V'T���і��1��P���o������"�yZK𹓃r���;u�Z+ĩS�wwF����윪�o��g܊�=�C�������i^w�3-������-o���
��ma�s�=-�|��[k7��V]|���kty]�����Ϗ���]^EWW��Me��Ԭ[:�-�����@z�x
Yj��$�S����x%�Q��Pnj,T��	.U��9%A�itzSQ6�`֩���qf9J�ך�����!v�Ѐ���=Ϻ1#M=�*�h�ŒӠ�]K��J�^��b''�U���@/Lo�N��:�dD00�h`��]�i�c��P�t!*��IE��|1�I���a*Ɣ���Hr	v�^�ƊNmՎ�9i��lL(�:D�d0�a�ztZ�дCr��H��uW}N�_]��.f�"�=���i�zi]iӥv,�-�#'���̽��AP%n�Ex=�;=���dG���lt��ӬC���Ɣ�8�'Iq
O%,&�
%#�F(�u���u�Y���%Ťp�"_�!r�* �	k	�L��̙�i�H*�S�h�u��u�OMYf�2�5��L��Z0e����u
_�ܨ�I �F�Dcӈ��Ri���U����х���"!���S�J�T#F�I��c��>ƶ��ƒ�k���-�u��Ze7}խ���q�Ͳ
eh��E�'��QO?E{
�	����`7�8z����6`�;���f\?.�w����:�昬7��M m�z���k�۽�た��'Z��^:~z�5����6*���06{�-0��S6/+ΚD�[�vL�'SJZM��RԢ3ؒ÷�?c`�{�Ƕ+Yp�v���
?��CN�=��X���~q��cv��Q�������>;�={C{����-����kf�:�EA�2\�c�(�py� �\}E^G���̉�t\&f'��e| ��Ӣ�ZZhDiaܢ�( %Q�2XQ�h�Y_��2��s�*︨_&N���.����?ӗ
UR+�n���Ƕ͜��"�! �TD*+�H%��0&UcLy�bLnj��1ݞ���0�|��б�ɔtn�H�zI�a@?��>�w��ZO?p���P��p���h��u�?�
����׀���3�����mx>pv�){J�vDxfzD�;��8"J7Ӂ�\8��Ԧ�eo{f��ɫ�2!�TBR�[̙��P�P5��LgL;�[ô���
=�`� �G��n�w�L<
�N�g�O�^��ee�,f��w�2�eW��:���F>���QO�u<gY.N+��
N��Q��xu���g�����5�s�5�iM�2E�y�!���!ѬvFV�t��)X���9'���5�i����j%VPa����%�.����z•���4��D&
��у��PQ��WӔ�K�	D��S�%�S��7f�Dtc(z���c(8���R��#�C�YSl"��S���)�CY��n"���N�}��1o����A�pd���%IJp���T���N�(:ĈR�2��Rr���o���[Ӭ_q��8N�_!��zb��I��b.\�\W5gj��AK�� 2��P9���R�����:5]~��2֣	�)U{}r4P��9㫢!�]�	N���Q:a��H2��ZF�Jx`8c��R�B�<�������L֑��ߕ3k���
ߜߐ��D�R"��rԱ��|��	��Ռ�]�����хSC$�褲�I�59f��]�*�jq�1/�|�cN��#�xl8����*4D�,\�œ�B����6�R���I�3��'զiQI||�OQD��a8���"56,v���f`{�1f�"��)Мq��
 ������E��dZ&\;��:)�:��.�-����I�zc�#X(7��&�J�Ya�sm������5)���r���6�U
�	˘v0T��|�:Õ�3�p4AUA�QSz��l����}���PWN0�o�f&
=P��$p-ҁ$�N-꘠�F��YWa�zeyqJ(�䭭5S@`r�D$�w�eʛ ��ں��k�K��]�ʚH��s-?��eO�C|����`�ū�]��NZ|�^�%�|�f�e{���oCA�L�;%���b\p�q�@�D��Y__q>.+Y�6��dwA��REsj�p�-�Fvi�+���75���g2���t"C��@������iA/L]&&�;ZTa4/J'c¢�u(Cp��"�ra�!,Z��|*Hyx���g�|�!�K��Ҥ���Ɋe^��9��[8P0*e0�D� :ZF�O�+Yu{�4�	�Ǻ7��8,��k�

��֙���%!�F�u�"�{8�؈;N4����\���p��sL�'%�]�G��f��n`竩�ʗ$
��W3���CwӟƼ1�NDY�
<j�?ؕKd=c!�Y��8C�s% vM3��%#v�L�j�|4n��
�3̮���!Z&����C���'�u�>��a`��_E�d��dM�*Ü���C��'�)ܽHת��J�b�	#8��%g��3�e���C�ݭ��$���t��s�;���?����i��fH�MUv�4�2N�~�Y�bE[dg���y�[��u�dE
�pL\���x��5p��_����G�gZ��%-��'�~�q?��i:p>�G{�;<86Ϩ�Z�)E{�Z����Ňo�F�����~������Utu]�����I�Ļ���{��MO(l���>H"=�������.��gڿ�tJ�/~�ǯ�߆Qc�~b&�^`�`�36<S쩹{f1#��<k�;�1��(���*�mN�]*�?�5���P	@�_\!�dR�2LX��%g�$H�&�@#|��
L�B�DR�T-���e��1��r�<Ӄ�#mu}q��O*��d͇2��ZD��S�|ژʒ.mj�c:ϙ�}���Oi��T�ޗ����T����}�m����-q�vY�b0�e�e3!��*u�2bh,�m}ߎ��s�ަ,�)���Z ���w���]�g�z�
S��p"e�0.L��>w$!�S�
�T�����Ϟ�ߊ��s�y����'�Mټ����uK�y.o�7��Ow	0��7�v0����bJcȂ��0��<��Q�;���Ս�Ӎ�@7�N7����tc�W7�N7���:��vtcD7�vd�u�<�=+r��E߽;2��d�=l��S
endstream
endobj
25 0 obj
4362
endobj
29 0 obj
[2 /XYZ 33  
122.750000  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��]߯۶~�_��QDR% ����A�a�C��+��h�
۟?ɢl�G��=�$�-��k]Q$ux~~����}��?��O�>��O7E�l��u��:�B׹�������/����͇͇�߯�a��?>��y�?k�����f:�s��/����������S.�V�����_UQVyը�n�/����߾�~k�Q�uQhm�Q�\F���EcrS��u�'}�޼����)U����\U��sS4ua�F�8�:Ӯ6Y]����������L�6j�U�v��z�-˹]٣G��4�i
�w�6���L���OY?�W��Oݤ_�J�٧�7�����/�k�cd�ʷ�+-+��ck�+��^�y��rp�m�T�)���T����NSTz|��J�'s�G�y���Q��NF�g���}{�iZb)lKC�g�m���>��c��P�mYE�������.�~��J��P����Ŗ芮�G���g�G�s��	���<�|�4��wľ���{�[PO�
�Q|O��RK�����liBQ`�0��R\n{�xf�',3b5����h�>;��\#>.��3��S�˕=�G�p�X�a�7P���]1�z�w�dn{�Tǣ����;�
�
�SL!�9��8^)�~�J��M���k5�S]���&NcO	��J1+
�5���g��A9�U̩'T�نs���;�g;0L���̿o�����$��E!�-�`�_��{��4|����w��s�Ѱ·�~�	֍?����ϡ�)>��,œj��h�,���Jg|^i�]T1l�5o�9�mc
���ŋ�|���kF�3r�
����R/~�hS{?��x^������#�1��+�s���O�!��7�K5Bã�xLU�v��5���`���ю
�C�d���L��L;w�s�<�Hfn�aC�Q
"�,��)d���u�=��D�ak��Q���X�c�/���r����X�a_�����a�8�!4�
a<�8��d�\���!�nʒH�����̬3ұJ��1��v���q4·&�!�:����坨�)�	{K�g�mh|�HD,����vCx�(l�|a�/~��i�*/Ϟ�h�S	O��P��/�DL�c��o���:M&1.Ӯ��T�(m����ДݷMfl���Ƙ�nli
��1��L?^�w�'�q6���l�w�'�W��>7�����7�v�%�R
�b��� v)��:î�����e�?�	̸(0�"f��eR�9�Ue����b�sZs���DZ=�AkΉA[�b��y$�+ft����b��Ġ-�xű쮸�}nor1��ދ4"��`�F�7o^˫��&%��f=G�i��.'~u��{J��$��D�hxw�Y��-����=
����'�m?����+)=Vڙ�R��q��@=Djh����F�ר�D
��$��0f��
f,8
*�<��v�̕#��=&U�EgM�W��:�D���R�wJ���hIK��H�C�T�X�w�J�dV�@� ]SPeF�L!�i�zj_JU���g�0)��l�X�{�q�2%c�)܏�M؟�%���?NȾ1=$��Uy�X���X��-���9F�m���}��G�5�<�k���G(��7��
�M�k��-9��5�I��6L���a��t%�2�0%u���l@1Ʀ	��X5!��	�V�l�F��HuW��>ӏ煐n�	!�gu?��Pwō�s�x��vJ=�:I�'|Xc	��W�J(I��'P�a�[N[���d.��=1Hٸ06>q&��u���O�sc�W���C��J1�2����Ʀ%ƣ�H(��*S�����4Ʉ`��.�:x � 6+�l��`� R"r��k�uJdu�%ci��Ho�Ա�t�3$қ���\۵%�PJ�? �u%��Y��jb�8%]�Y�D���Dz�B�x8Z��͛bo�ԁ��JJ��;��)���Q;����N�Kn�i��o�$x�#��G�:�DG�K��D��z�R�R�BZ���C(=�x�B�����l`bс�K����K��f'�����ޛ]��\OJqN)�aJL)α��M3�CJq��g��o��~:���v����9�.믘�}�o�]�~:���֏w����F��a����ڧUvd��F+�S�İ伳X{�d'6U�F6�l���%;Vdx1�����4�k�mz�|���bF��~<���5����cF�7�;��
�M��w��,��C	��"ӞR���͠d��u��o[p���Od\�L�FYe<I�E����7�(p�xJ|�t�;3�\?��[oF�쯘�}��K�s��o�x'f��f��Q1�	e�0�����dV�;�&J�ξ��Ғ~?�c�#�����0:���=r��VE��\]��~�6�p4�4d�0�"�R|�h�3fp������q�9!��;
��"��Ce��<�յ����N�s�s��J�d��ld����P���'[l��+D�8Z-aѽ��=ӆ�rO-8�("�q��XE�0�%��i��$Yr�E{����ej����A0ώ׊��'۴���2��ފ���_��������HA�̖�hG�
5�&7t1��wZ�zO@��.1��c\�9�33P��)*%�V�ܶx=Li"\	;Zq�!Y�:Q$kՅ��z��x��n�Kkԕ*�p�
"�qkPvk0�d�2���N���iķ���)����1���$�� *���s�E��f�p��:�W�4�Z�p�^��>q��f�w�/!x�a�jD����ڬ�V�\W�Q�Np�&zΚ)6��	�������%�X���v'�a��.��4G�]^۫�Ԉ�d�����i���D���ɋ�i���d!���(`E
�S05��d���0�	�<Z�;���l>�%�Clk�T63�j��U�˥�C�-M��z�D8�8Z�=�B1uK/e�i�*�A�_�C��d��=/i�B{��B؏�W�=<�9�<"Sۮ��
���a�����|�sD�����@t����x���M�E���h��D��<�=8��R�i���X
Y�e=3�G������b5�����Z��8�mw�u�xkd=I҄��0>t&Qg��%hG[��{�|�J��?M�-�N���rs�Ө�M��ȾZ2�_D�Mh�VM1�'&1X����{�e뙊�~Y4���p�q1���l���7�
Y�-07l�0�3eO��=?z`�����pNe+�&~jsK��e�zu��H���$|?�Q7�\S�e�R6��e�D�[`w?X@b0~��9.W7�`٬M٦DK)>s�M4�� ���yͮ���,���5b�p¨�!:FP�.ք������I�{Sp��)pS{��u��|kY�1�@ٜs�$u�U��������&�Z@c�h�jA�{�h��0o�;)�e���'�-b�2�#��E#���/���~I*:gAP�T�]��t�mA�==P9��K��Pxw�zp)�K]z�f��uD{2��T�}�+�	C��~.�P�M������R�C�q�{b�K�L�����`���h�
�>A��ݡ�'�*2�*���K6�R��H&�(T9VP�1�e_� !LX_�l.C�'��OW?�2hiLЖI|`����Zp�<�!��U�uHgL!�DJ��FHe�Dʞ{��%�����e�#tsʏ 
Hf\�E�W�[p˄%�y����C6%���~��@���jx�=p�O`�5�ҿ��0>O�r����lS�/
ܣj��d�s�=�Ze�rmp�=%�G���K��LJ"��Aհ����y��~�`рl����d�쌚|�nRluE�23N�Y����sƸ�rB��+3ZٜY��jFs���Q5�9�'K6�K������qn�\��ŝr�RUc.��JL�A&�ɸ�M�q�1u2���x=Tg5�
��y�@L���ك�Tp��)��0�?��*�P+
50�UYY�)Q�n(��2��F
��s��3����>T�X��H�e�
�@D%*�π�ek��j�8��L�,�Ra,�{�Ehk���u+�Eh[����"t�G+;c�iBUu�]�qY�y��������*+(�w��dmelj�륱RyY�x�?I�Y�fl��r��'�ɟ��<�]d�?�W����y��@��m7���@���u��'�M�gpZy�	�
�?�P�8�X��>&������͛�����������y��}����S#��t�Q����/OGKX-yu'qzO��9q�uQfz]j�W�'��q��PR��8.��g�Qp�
�5~���q�#�F0��v���BLj���ui���#��u� �<Ǫ<L�Lj�x���B��$eG�}S~R��1~s�Q`����]��g�F��A\����2�|&�Ō�JL`��tL�
�c�f��I���!�Ʌ���*��h�B6�?�5�r������9S�N1�_89�-�G;2Z���ឪ���LQ��\�S{b�Q�]�u���T�T�I5,�T�J����N�z(��_�����2�'Y-�WF����6�kO��C����T�}�T���V���M�}�3c���7��ucKS�o��g��k?u���订��k�w������~޼�f�l���U�m-w�c�UG+0�,?�
�i*v�2{@(��y���.���DTIej��Տ�"����s�T��T1,���i{̘ژv���D:����y��נ�;���C�a��l��
endstream
endobj
31 0 obj
4897
endobj
35 0 obj
[3 /XYZ 33  
765.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 14.4 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��[mk�8��_��u�jIP
M��AI�>��d�X�e�����?9gc'��L��^wj'�F�g4�������MLf�/bI�ټ��w��'�g�_�Pҽ�нX��ⱸ-n��Ǣm���|(&M_E��|�{��Gh�k��I��W��%�����+_�M+�>~�����*�����~�c����e�Rk��jl�|>3��Rz]=���-C���hU}�.�W֧�(c�&j�ixO�0��F|}W��=v�a��a�:7:�Lsg��xW	S57��ߦ?��.��H��I���3M{�s��l]-I���NOI�;z�m�c1}�c���:]��J(-�E�γ沸/lHތ����<���B,>U�5u��O5����2Va;k�Q�DV�#�:�qʭ��QkZ�$��}ܚ6+�++�Bg<J�N�0�=�s6$�$��=�A�d�Z���>�X0m[���ܬ$׋Y�	��*6�
h�k/Tj��虦=
�v��uԞ�J-�=߶w�Pq����H��'���i±TU���N�X<�����i�j86���e����
+��=J۟guI�m�h����Zs$1Dt��Op�.����}�~h�w-�
�M]�E��w
�-c�"–�t��6C�@V�'~2�r� ����r���ϋw�~���BL�f�o���	�����f�s�i�9�E�/��3�h�69l�B�-%9~Hk�$��A�Ϸ�%���I�x<ж��8�C�Hە�9�'|Ɯ�<��H1尚���o����:��	ýÊ���4u,P��:r��������kF�Lɣ�2o�9�5JX8��o<ی�o��0w�5;j��V��-7q}�a�q�����U�'7�+�wr��^�t}ﵳ1A��o�qi{����"�� �LSZ�����T� ق��dž[-��
J<l-@�5�(�����l5��V(���H�Q���&��Xpu.��AI����X.�D+[K�h{A�y�4��T���8�7=����T���l�p5R�XX�Dl5&[��a	
��g�8&[X��=�$�A�2�A9[Ƒ�>/�U�F�=�l}8��l�q���kΜ���x��yo��Z�)�`Te���/m�(�%N���b(c�S|=Y
[�WN!��a�a�i�:��x‘|�����̄���.Y��3?��>r��b$�f�8�9ebNfb�-�Xqkx�F-��r=^�Y3�U74�}��GʚG{����ɚo��9��L��É�qW
�	���Ki�������i�G?X��8��3��N������돶*��)#�<��������aX�*N�{<��-2��sh�Q�aU?�T/�T2���F��a���F����g�.����13�ގS������ [�'�Y�����B֬�^:�� ��F�_�U�o��u��|˾V���-W��h�#�D���D��~3���
[�Gj�8�18��<���Lk�o�6��L?��K��]bT[^����'_0��ls��K��[��Y{XE�얞�]�^u�����H��Ȍ��d��}����jz�
endstream
endobj
51 0 obj
1581
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+Ȍ�`�P`&�7�)ry" �9ܠ� ry+(*�&��&Fr�I0�$���[s=�xd�M6	0��g0׾���ꪯ���5B�
�L8B����j�=���bI��_�y=�����Н����q!l!���';Ư������삲*���`�B`l�1-���#d~&��UE$�,�v#�U����7�	Bh;��`:Rp����$��V,�-BGb�j���!K�������eD$$S�A�e�x?�4�C��Hm�9"'���B�j��S{5�A�M3ϥ����a����F9QG�5��S��rs���R�*Z9�%M1�_��$���Wq
{��Q�87���K��0Q.�LպA��t�'�蝝���>��y?p��rqQ�r����j���G�J�����J��˴HF���t4x�o��v�\�j��b��͍s�Kv�����}{\,�'�4��Sm��MAA;��Vo���m�����3�((D���'�.�J��^�Q�Y�˱
���˰�3Q�޸* ���5k�z�f����6�~�R��]�}��ȲF�uS��F7�� U
R�)u��Ͽ�c�}��q�C�O}��2��_b��LY9ik�=��W���h:�ցCq�[�x::��ip���V=��m���@��Z��)&���p�
�>�r���ө�͐��O��A����.I�C��dg����i�D���Q�Т�5(	�c^UR�w�h�m*�����x~I™��aT�s��=52b~������Y�%���,\'	���y2�� C.���
(����*����z�����<����zy�Yï\ޒ�]�$~X��Sl�&ž]�O=�ych0���b���4�>m���Ҹ=�GG2u�_8������
��g��_<r�9%���7ȝ+�Dv��4ȡ���	�P���*�����R�t�)lk�9��
[6}s�Ͽ(- z��7-��7/GpZ��->	����W��HNJH�O]pLTĬ�����8~�r�������Ӌq�9��~�-���e�B��ՙ�%�J�ʊ/Mݶ�K/TT� *��'6�(�ˁ�Z�=Hʚu�,7eew�wsr�^@�q��!�-@�,����<��t�[�w�3�Of�05�a���Y�L�{A画�-t�3���kȽ��"C�#e��	����B�5�shk�y�;�����[�}7�K�1�v���*�-�ta@#Q�$u�����;�	�i����s����E�1g�
@5E��c7��
N���7��7�aD�w�M[n�ݱ^Z��c�@85<��k���͟s���:���e�:���d���(%���z�r栱
�o�me�Ĝɀ�Q0��l���N�b�se%��f���[�fN(-?_��a�5�!A%ً�KČi.SfL���ٺz���}zf��5ST3f��Oܓ�`��ؔ$�Gf�`��C	���e�����S��7����h�Qy��j�Fx}CϳM�Qh&����fU�A���P\t!�R��C�.����:���g�C�����R��=0i�/�f�7��96Ԓ��|�8���g
�:Gc0���:���l�ε�!��j�C����_�!Ӻ���@lx�e�@L秅���榦ܬ�C�,���*���М��Q�us�L�O��{�ȎTo��q2_�}��3��-�Ȫpu��Ip)�y�f4��xk-i�O�x�8�e	��&7��Ouv@И��g0�T���� 6�gҁR�y��^��@��7�lc;r�&
��Y7s��R p���Wh�:l�<y��ox`����Bqp�9u��zl�Ĉ�fzt'HrS��{�,6\�75X���/���Ū��C�,k2�&� Β�Y^�I9DL���-9Ē�-�	�Aa�O��⋗�L]�E���	ډ�ا�c�-Y����!�`�^q�?����C�򲑃��܀́�Z���8�\��ҁ��O&%u/\0��{%��m�ɝƧ��ص�z����N@����{�y
�i��J����t��K�4L�Yf�)�e/_2�vU�\+/*�K�8�a�PV�|DĶ����Eb�5��h��um�z��\n܋Ѹ9i�:��s�w�^*e�>�M��8Z���U�8`XG
9}�M���-v���q��q;����|I8�ֿ���28����6:���;��>$i�y��:��yj_��"=nNN�w��,~��#b���bRӱ�r���<�ďCk[��;�b㫑[F'�#��caP�5��%�����f�6GF��n���}q=�h+���X�r��:7��{�{�
������*��l��H��F8-ԞY(3R{{��I�o!m�����.q��o�~��r3p����¹vH�R�V�W��`@;�?|I�ʸ�	�Z��i���an搋�=7��ws�,�g[�C�E����
w��Do�q{��e:�x�S��zE�Ͽ�3��Xc��Ajd�a��^�/�g?6ԇE�B�s!hw$�Ò�v�Ce~V8UT�NSz���m,�&<�f[h��4W��/q�H�`��i��\ø�ܔ��lQo�0I��ѰȲ����AK����	�	����[{N�7�F��5ԟ�i�z���?���A^��73��]�u���ĸ��Wr�?�,!>���w(������w삦ъ�d��9���
{�'��pn��_�&�S��{T��j��j��C��Q��Ć(8K�e�?������2w6]��NP�~s|�3T��x����]��[fa ��_h.^��\��u��,�o��!����Z��r"�s
ӡ��.8�Ҟ�K�钘��_�>p�fK�©���C�'�w���x&�47�$����1)� �.A�X�eV5<@�Q$!��H��$ǣ�?��o�,_��b|����1q�Lv��gs��ں���kSo�]I��s�<U\�矑��.*�-0��7_��7?6��tn�?����>2j���ܹR̟����2�����Ar@�\��;M�_�i.�]����P*��{�c}�F�I��a�S�r_��F��GLs@��t�,�L��Y	��e��Ξr-�
��VUmqۓ�l������%�^}��+d}�#~� ֈ_v���@<��
HqҨm�1����-M������_��N{09���Y�1����y~4��W�:V\��Oࡺz���K�û�z�
R���nc�C��

���?�;������@�|��@��k�M�/�Q
U2m@�Z����������{<�?����v�ֱ��1F���L]���2�)
�~*��w?�׉�22�\	��\s3�ف���ѠF�1�p���a4�bW�IH~%�~c~vVn�k���6|��
v=va!�[�Ö�ԯ��w�K@��O>�Ry�/�,X�b���+���4\��k~A�b��G�$���߁|T>SG���z��@CKmd�Ⱥ�Pl��[����V-^�i�[W6m鍈ظ����{[8/(�EO��^LY�r����1k�g�� $�nS`���d�͟��z+jU�h'����b.��r�zDox�XD�Gr8�'8�;0���koG��y5A��G`�_-�A�5�^�K�������~I��\���a`���Po�,���}F�nS�����1Q
O,[q�aIuٿoK�����mz1�v@n�,
-�킁D\����x���˽/��&`�6���G]��W
��5 �Y�ꖳ�{�5�ؑ�A�kX���.޴��k7â�%k
�Be��}�����O'�au��a ~S�8�ޅ�s���+^,*����k��$&���k����H���P\�
*-


(*	F���yi�C�<�,'&Noga[±Z]��1����3��19��;.������-{�t�)�'Xt�p��qw�s�����]�0/�\��uN���c�s��J���l����G���d���ؗ\~	q4��~�*`��w-eI��Ҙ��a�.�>"l��U[�]�t۶�G����u����/!��ի�ڒV�&�FF�F)�;�S�NB��Q_d���;W���4�.�q�����*��o�����K"A�L샩5Q�!;�/����ˌ��1u՚M��b�]� $h=Ƞc����G}��R:��eŌ��'�Wԥ�}�0R��Y���4��F�_�f��ZO1��]3�m���z0Ƃ�	T��x	9q{���0��0�=�*��7��� F�
��qęat;�T��b�?�����s�ϛ���<Y?��s2�7&^���4�8�yp����P��m��'?<�G�����1CvO�<S�����E����8�PvO���+�k%�����"��\�*�I%��r�!��<�C(�h�ů$|I��a�FҍEO'�]��U$Y(%�Kē�ƶY-�H=Bl�[D��3z�52�)�X�%�!]��8#�$�N��82�{�8��=r���1�I�lߏ'6^X��.��#d}�l������$
�x��Fҁe
�D��Ä��d:�Kƾ(,EXJ���C���+I&J�Dw�F�z��Ë$���,��x�O�D:�.��t#�;�rq\%w�����Z^�g�����`/L��B���p_��"d�&�Q��Z./���$����M�M��36l�ٺ��l�m���4f՘�1c��<6�IKd�#i�/;r�A��b�3�wZ���s�:��oX�<�oY�����u����d�
g�^@�HX?��)�z�Z�Ek��5k] n䶵.#N���Ǔx��IYGJH�"٤��P��o	��F��'�
#�$����"���w�Y�R+�H���8��֕�de���<<=U!FcV~�*�0m�jQ~�*�}*U�f�f�Td��X\o-�2,$ָ�X��H.��㒩H��fd�秖����Cg��V)�k�M�-��
��?�0���c��k�����x6�����x�p��EJ�-b����8�K~��'f��|d'
{
%��bO$�8�!‰ç�Ħ-++�3���rvjQjZv�lcI֜�����Ҍ�9�aA�qA�^�q��G+�
endstream
endobj
58 0 obj
5244
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 270 745 469 564 611 548 682 866 647 707 651 589 880 339 345 492 240 503 557 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> <0034> <002E> <0055> <0073> <0047> <0054> <0068> <0063> <006D> <0074> <0076> <006C> <0070> <0066> <0067> <0050> <0048> <002C> <0032> <0049> <0077> <0079> <0045> <0052> <0046> <004F> <004D> <0041> <004E> <0044> <0053> <0057> <0028> <0029> <0078> <003A> <006B> <0035> <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 
0000038255 00000 n 
0000000187 00000 n 
0000000282 00000 n 
0000000756 00000 n 
0000029337 00000 n 
0000038121 00000 n 
0000000319 00000 n 
0000000362 00000 n 
0000000405 00000 n 
0000000449 00000 n 
0000000493 00000 n 
0000000530 00000 n 
0000000574 00000 n 
0000001080 00000 n 
0000007535 00000 n 
0000000877 00000 n 
0000001053 00000 n 
0000007863 00000 n 
0000007556 00000 n 
0000007600 00000 n 
0000007644 00000 n 
0000007688 00000 n 
0000008188 00000 n 
0000012626 00000 n 
0000007985 00000 n 
0000008161 00000 n 
0000012691 00000 n 
0000012647 00000 n 
0000013009 00000 n 
0000017982 00000 n 
0000012813 00000 n 
0000012989 00000 n 
0000020361 00000 n 
0000018003 00000 n 
0000018047 00000 n 
0000020194 00000 n 
0000020020 00000 n 
0000018298 00000 n 
0000018452 00000 n 
0000018591 00000 n 
0000018987 00000 n 
0000019859 00000 n 
0000018784 00000 n 
0000019263 00000 n 
0000019391 00000 n 
0000019554 00000 n 
0000019723 00000 n 
0000020257 00000 n 
0000020679 00000 n 
0000022336 00000 n 
0000020483 00000 n 
0000020659 00000 n 
0000022357 00000 n 
0000022621 00000 n 
0000027977 00000 n 
0000028459 00000 n 
0000027956 00000 n 
0000029477 00000 n 
0000029735 00000 n 
0000037122 00000 n 
0000037327 00000 n 
0000037101 00000 n 
trailer
<<
/Size 64
/Info 1 0 R
/Root 49 0 R
>>
startxref
38374
%%EOF
PK�f[&�**(doc/alt-php72-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
PK�f[�_Y@����.doc/alt-php72-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.73";
}

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 (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 = @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 = @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);
}
PK�f[P�$���'doc/alt-php72-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-2025 ionCube Ltd.           Last revised January 2025
PKh[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.
PKh[�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!h[$�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!h[�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*|[��z�man/man1/ruby.1.gznu�[�������Eruby.1�Zks�����bM�c9%)�I�6m:�-:fl�Qvc���X��,������{w�"��L<!�}���^h�apY-w2q22��&�M�c�'��d�X#_��U�)��K���?�L�r�K�ױ���LG:[j+�~4��OO�i)/�<}w�����š�UY����z���#-��X�à�$����7糟�x����S1>Ϥ�)��Y^j[XM���/:*G�&:��.�IQ&�Z�*_Wj���Ż��b���p|!��r�(�<��p�����i^��ͮ~t*ϝ�lj�&*UZ?FO��Bc����i�J��:�s�Kz�߮�[R}��[4�2Y��~��k�m���OH�V�7ݶ�����;��*Iu�L�u���r<�QϦ�g�����\�A�r�t�s��2V~���kc��ۉ}'��3�K9+�F9	�wr�UYY�$��"��j��%6��\�3ڄ;Y�R�k'�qR��mӇ�l풬H�P��*��d�*��ު�TC�B�Vrg*�U8T��"m��J,�f��A	�\kYn4�#�u��P�^Dj4+"�l)JiV��lq1�˪�b�̪h�hCba��8�����\�Sa
�`E�1I��;�O'Wo.�����'J�me��l�wb��R��m����oo0�b'Mj&7��_	�Z��t&(Jzl�
�!�&+(����9D�x��J��*Y����᭲�ZR8����8��*K"�W<�va}nIa�R�A�JEv���-�e[c�N���Jy�`�3�;���?��P&>���ju�9�Y�2��ߍ���z�#�u�*�J��̵�u<$�Y9�\��C��ݒrC����ܸ�]�&���xc&Ik
8'5�J�r��%�?�]��C�˨/��9���{U]��J+�}CJ��"����4Y�tz�>T�#@��8����5UiP��ڃUpœ��Q�&_��>���a��FS�ӿ�0�B�1�ݾ"R��]R���*IK�o��@�}}�(.�rCX�S��D�%��@¥��f�:#s\B4)���f�B[ܒKG@�T�(f�+��J/��4᡿��|�* $�I��q�5ӈ��
�|�+��yG���m\�J$Xa܊�6����#-_��D:4�4w���2I��"�+�i���9ҖS��[��p��U�E�Ya�B�G@Z�PE���sk]"4o!�R�E�$�?�"Ҷwe�Y��6��-
�����Ut��d��(���:�AZ*&��u�[9)šMIRcΪ�L(};��X⢩����`�r>g�	����6�A��@)�	�ƹ�B�u�Մ�W܈�̊��&�w��$�n}�gH>���FGR?c����
>�u?����/���;��G� 1���_�2���l����nqT��P.�S�{{���K����:�2H�7��d<b�ǭ��P|��	#��_)��D��ߜ�>�ì["��z��	��ԍ:.���gL(�KO�<"�AӺjeƁr��!�ɝ�zط=.�u�`��P�S�b�k���Q�Vթ�b�M*�&�h��p�4���͙�.�V�(k�DN}D�N��G��C9F�w0��F������Ʉ��E2�rJ�
'^���{�r
=���?|��:ŧ�2YG6&�7�@$�C�u�:[���!<���׼���3:��h1�	�:�$?k�c�P,
%�D��^���`�P��8x%��D�N�*
,�h7�DE�o lX�s�C>4���JQv�AT\���`�\C`��<�5L��y%N5�<�D8�6�!���ņ�U�eO�<�a!j3J�� �(��@Z	
�1�"0'����jB��MP���Z�g
����5�s�Y�;�׮�n�.���W<�gxH�N�kr�PR��~a�<�*��L�M|�ZF*�g�~�i#�	6��QqN�]�>��.����Ͼ�୎�/'�?���O�Ph��C	rh���4@�n�J8��7�br�B�&�&�V��`w�,�N��5�*O	Q�� �Pk
~-ؽ�
��M��U�|:c�c(w������
5�>&|o⪢0)Q�b+��Xʵ�.��'*�H{�Z9M$}@)�ߓ'��'��,���G/��<�i>�9ը^�K�z�~�M}�Br�v�qr��G���+�0�`�q�Ie�s��Sr�F����_�.O�x�|��<�C�
(�YK����s8�P zf[�	-�����^}�*�إ�	��~b��*�OR����;&"�#'L# D�넗����*U���hk�y���AA;#��/��!����pg#�{��M����Z���5�q֝M���q��+E]`��7�j�1�ʝY��n7�!dTV��j�c�TS�!I=��tO5�&���I�it�质�6U���
yokҟ�uAsT�*�#�����b&�M��S��7����T�>4QE������&t_���Im��<)���*�����~�x�󳐣d�T�r��DvUD�H�=��ד�����^��`ҖNFS��Ф:A\a���F��S(�tN�ܡ�C��X�U��s�XG�!D�=��k's��`��Sݘ�IM��;.��|���^�����������Ú
�񼦮	,~�
Dg�[���mT;��-a>�<w�5؅j{������gZX������r�K����5���pr�B��H�)=�v�1��@�f(�EuV1*�����6T}�������P&���>$�t���v�G|�m5�����{VUZ�����ѹ�5�L~����o�L����W�TTL�H��
�8�/A���G�{&X���kk���+f�e'M.|Ҡ����'[Cj��"����+�ȁZsT%L��sj����v��A�e,|���:��GXи����oC�D3�P�V�\3��$����$ٶM���=f��P�>��k��k(����]��I�C���UD�o7�dh
��<��W(��BiX��:����~��EQ���gk�5I�a#�;�xz��N3r�h�A{��
��J� �몶�-���]cH��
{�o��O狩�i�R.ȏ���j���k�P��O��,��ֶ�$(��~�4�A��D͹>#�n6^�]�\�;�ӌ��e��B����X���[��Z0�;_�]!Pkx�Ԭ�	�&��Q!�+�c�z�ݐ�8q"6TP'��C��iK�4�8�2vȳ�}s�;��<PQ��sB��%D�}�#�G"��Z�5��eī#�ʕL8����C'�g6�t���&��� t�$�5�茚�������z}�%�D�ż�����Ǐ2�\���@M1��6]�=9�o���7�ۮ�wMz�v{�<�Y�]n~����#B�R���ͭ��a���Z9�]�‚�;�ɹ��%(��Z:���$�]��mz�vv9?==�:�џ��=�xq9}>��;�eИ��ń^ט|��,&�M�M��-4���E���SE��Yĭ[�Ρ�C�-x��}5�p��z��f��ы���	d�j�]�+�r�M���JLbt%<����6tIsV?m��>8����|UP�3�����T[lW�Z�r��4�D�D:�b��/^L_��9��t�����Pu�g}��L��O�=��A�3��㡤���>�'�%Z��2ʠP�D�pQ��j���Ұ~���g��+�_�?̦��B��ɯ�^�K�&���Y:��M��v����rѼل��5Tb;4/~���w�����T�
;���$PK*|[�_��	�	#doc/alt-ruby18-rubygems/LICENSE.txtnu�[���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).  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+|[oM~@@doc/alt-ruby18-rubygems/MIT.txtnu�[���Copyright (c) Chad Fowler, Rich Kilmer, Jim Weirich and others.

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+|[�W;��#doc/alt-ruby18-rubygems/README.rdocnu�[���= RubyGems

* http://rubygems.org
* http://docs.rubygems.org
* http://help.rubygems.org
* http://github.com/rubygems
* http://rubyforge.org/projects/rubygems

== DESCRIPTION

RubyGems is a package management framework for Ruby.

This gem is an update for the RubyGems software. You must have an
installation of RubyGems before this update can be applied.

See Gem for information on RubyGems (or `ri Gem`)

To upgrade to the latest RubyGems, run:

  $ gem update --system  # you might need to be an administrator or root

See UPGRADING.rdoc for more details and alternative instructions.

-----

If you don't have RubyGems installed, your can still do it manually:

* Download from: https://rubygems.org/pages/download
* Unpack into a directory and cd there
* Install with: ruby setup.rb  # you may need admin/root privilege

For more details and other options, see:

  ruby setup.rb --help

== GETTING HELP

=== Support Requests

Are you unsure of how to use RubyGems?  Do you think you've found a bug and
you're not sure?  If that is the case, the best place for you is to file a
support request at {help.rubygems.org}[http://help.rubygems.org].

=== Filing Tickets

You're sure you've found a bug!  But where do you let us know?  The best place
for letting the RubyGems team know about bugs you've found is {on the rubygems
tracker at rubyforge}[http://rubyforge.org/tracker/?group_id=126].

=== Bundler Compatibility

See http://gembundler.com/compatibility for known issues.
PK+|[�����#doc/alt-ruby18-rubygems/History.txtnu�[���# coding: UTF-8

=== 1.8.29 / 2013-11-23

Bug fixes:

* Fixed installation when the LANG environment variable is empty.
* Added DigiCert High Assurance EV Root CA to the default SSL certificates for
  cloudfront.

=== 1.8.28 / 2013-10-08

Bug fixes:

* Added the Verisign Class 3 Public Primary Certification Authority G5
  certificate and its intermediary to follow the s3.amazonaws.com certificate
  change.  Fixes #665 by emeyekayee.  Fixes #671 by jonforums.
* Remove redundant built-in certificates not needed for https://rubygems.org
  Fixes #654 by Vít Ondruch.
* Added test for missing certificates for https://s3.amazonaws.com or
  https://rubygems.org.  Pull request #673 by Hannes Georg.

=== 1.8.27 / 2013-09-24

Security fixes:

* RubyGems 2.1.4 and earlier are vulnerable to excessive CPU usage due to a
  backtracking in Gem::Version validation.  See CVE-2013-4363 for full details
  including vulnerable APIs.  Fixed versions include 2.1.5, 2.0.10, 1.8.27 and
  1.8.23.2 (for Ruby 1.9.3).

=== 1.8.26 / 2013-09-09

Security fixes:

* RubyGems 2.0.7 and earlier are vulnerable to excessive CPU usage due to a
  backtracking in Gem::Version validation.  See CVE-2013-4287 for full details
  including vulnerable APIs.  Fixed versions include 2.0.8, 1.8.26 and
  1.8.23.1 (for Ruby 1.9.3).  Issue #626 by Damir Sharipov.

Bug fixes:

* Fixed editing of a Makefile with 8-bit characters.  Fixes #181

=== 1.8.25 / 2013-01-24

* 6 bug fixes:

  * Added 11627 to setup bin_file location to protect against errors. Fixes #328 by ConradIrwin
  * Specification#ruby_code didn't handle Requirement with multiple
  * Fix error on creating a Version object with a frozen string.
  * Fix incremental index updates
  * Fix missing load_yaml in YAML-related requirement.rb code.
  * Manually backport encoding-aware YAML gemspec

=== 1.8.24 / 2012-04-27

* 1 bug fix:

  * Install the .pem files properly. Fixes #320
  * Remove OpenSSL dependency from the http code path

=== 1.8.23 / 2012-04-19

This release increases the security used when RubyGems is talking to
an https server. If you use a custom RubyGems server over SSL, this
release will cause RubyGems to no longer connect unless your SSL cert
is globally valid.

You can configure SSL certificate usage in RubyGems through the
:ssl_ca_cert and :ssl_verify_mode options in ~/.gemrc and /etc/gemrc.
The recommended way is to set :ssl_ca_cert to the CA certificate for
your server or a certificate bundle containing your CA certification.

You may also set :ssl_verify_mode to 0 to completely disable SSL
certificate checks, but this is not recommended.


* 2 security fixes:
  * Disallow redirects from https to http
  * Turn on verification of server SSL certs

* 1 minor feature:
  * Add --clear-sources to fetch

* 2 bug fixes:
  * Use File.identical? to check if two files are the same.
  * Fixed init_with warning when using psych

=== 1.8.22 / 2012-04-13

* 4 bug fixes:

  * Workaround for psych/syck YAML date parsing issue
  * Don't trust the encoding of ARGV. Fixes #307
  * Quiet default warnings about missing spec variables
  * Read a binary file properly (windows fix)

=== 1.8.21 / 2012-03-22

* 2 bug fixes:

  * Add workaround for buggy yaml output from 1.9.2
  * Force 1.9.1 to remove it's prelude code. Fixes #305

=== 1.8.20 / 2012-03-21

* 4 bug fixes:

  * Add --force to `gem build` to skip validation. Fixes #297
  * Gracefully deal with YAML::PrivateType objects in Marshal'd gemspecs
  * Treat the source as a proper url base. Fixes #304
  * Warn when updating the specs cache fails. Fixes #300

=== 1.8.19 / 2012-03-14

* 3 bug fixes:

  * Handle loading psych vs syck properly. Fixes #298
  * Make sure Date objects don't leak in via Marshal
  * Perform Date => Time coercion on yaml loading. Fixes #266

=== 1.8.18 / 2012-03-11

* 4 bug fixes:

  * Use Psych API to emit more compatible YAML
  * Download and write inside `gem fetch` directly. Fixes #289
  * Honor sysconfdir on 1.8. Fixes #291
  * Search everywhere for a spec for `gem spec`. Fixes #288
  * Fix Gem.all_load_path. Fixes #171

=== 1.8.17 / 2012-02-17

* 2 minor enhancements:

  * Add MacRuby to the list of special cases for platforms (ferrous26)
  * Add a default for where to install rubygems itself

* 3 bug fixes:

  * Fixed gem loading issue caused by dependencies not resolving.
  * Fixed umask error when stdlib is required and unresolved dependencies exist.
  * Shebang munging would only take one arg after the cmd
  * Define SUCKAGE better, ie only MRI 1.9.2
  * Propagate env-shebang to the pristine command if set for install.

=== 1.8.16 / 2012-02-12

* 3 bug fixes:

  * Fix gem specification loading when encoding is not UTF-8. #146
  * Allow group writable if umask allows it already.
  * Uniquify the spec list based on directory order priority

=== 1.8.15 / 2012-01-06

* 1 bug fix:

  * Don't eager load yaml, it creates a bad loop. Fixes #256

=== 1.8.14 / 2012-01-05

* 2 bug fixes:

  * Ignore old/bad cache data in Version
  * Make sure our YAML workarounds are loaded properly. Fixes #250.

=== 1.8.13 / 2011-12-21

* 1 bug fix:

  * Check loaded_specs properly when trying to satisfy a dep

* 2 minor enhancements:

  * Remove using #loaded_path? for performance
  * Remove Zlib workaround for Windows build.

=== 1.8.12 / 2011-12-02

* Bug fix:
  * Handle more cases where Syck's DefaultKey showed up in requirements
    and wasn't cleaned out.

=== 1.8.11 / 2011-10-03

* Bug fix:
  * Deprecate was moved to Gem::Deprecate to stop polluting the top-level
    namespace.

=== 1.8.10 / 2011-08-25

RubyGems 1.8.10 contains a security fix that prevents malicious gems from
executing code when their specification is loaded.  See
https://github.com/rubygems/rubygems/pull/165 for details.

* 5 bug fixes:

  * RubyGems escapes strings in ruby-format specs using #dump instead of #to_s
    and %q to prevent code injection.  Issue #165 by Postmodern
  * RubyGems attempt to activate the psych gem now to obtain bugfixes from
    psych.
  * Gem.dir has been restored to the front of Gem.path.  Fixes remaining
    problem with Issue #115
  * Fixed Syck DefaultKey infecting ruby-format specifications.
  * `gem uninstall a b` no longer stops if gem "a" is not installed.

=== 1.8.9 / 2011-08-23

* Bug fixes:

  * Fixed uninstalling multiple gems using `gem uninstall`
  * Gem.use_paths splatted to take multiple paths!  Issue #148

=== 1.8.8 / 2011-08-11

* Bug fix:
  * The encoding of a gem's YAML spec is now UTF-8.  Issue #149

=== 1.8.7 / 2011-08-04

* Bug fixes:
  * Added missing require for `gem uninstall --format-executable`
  * The correct name of the executable being uninstalled is now displayed with
    --format-executable
  * Fixed `gem unpack uninstalled_gem` default version picker
  * RubyGems no longer claims a nonexistent gem can be uninstalled
  * `gem which` no longer claims directories are requirable files
  * `gem cleanup` continues cleaning up gems if one can't be uninstalled due
    to permissions.  Issue #82
  * Gem repository directories are no longer created world-writable.  Patch by
    Sakuro OZAWA.  Ruby Bug #4930

=== 1.8.6 / 2011-07-25

* 1 minor enhancement:

  * Add autorequires and delay startup of RubyGems until require is called.
    See Ruby bug #4962

* 9 bug fixes:

  * Restore behavior of Gem::Specification#loaded?  Ruby Bug #5032
  * Clean up SourceIndex.add_specs to not be so damn noisy. (tadman)
  * Added missing APPLE_GEM_HOME in paths.
  * Extend YAML::Syck::DefaultKey fixing to `marshal_dump` as well.
  * Fix #29216: check correct bin_dir in check_that_user_bin_dir_is_in_path.
  * Revert Gem.latest_load_paths to working order (PathSupport revert).
  * Restore normalization of GEM_HOME.
  * Handle the Syck DefaultKey problem once and for all.
  * Fix SystemStackError occurring with "gem list -r -a" on 1.9.

=== 1.8.5 / 2011-05-31

* 2 minor enhancement:

  * The -u option to 'update local source cache' is official deprecated.
  * Remove has_rdoc deprecations from Specification.

* 2 bug fixes:

  * Handle bad specs more gracefully.
  * Reset any Gem paths changed in the installer.

=== 1.8.4 / 2011-05-25

* 1 minor enhancement:

  * Removed default_executable deprecations from Specification.

=== 1.8.3 / 2011-05-19

* 4 bug fixes:

  * Fix independent testing of test_gem_package_tar_output.  Ruby Bug #4686 by
    Shota Fukumori
  * Fix test failures for systems with separate ruby versions.  Ruby Bug #3808
    by Jeremy Evans
  * Fixed some bad calls left behind after rolling out some refactorings.
  * Syck has a parse error on (good) times output from Psych. (dazuma, et al)

=== 1.8.2 / 2011-05-11

* 2 minor enhancements:

  * Moved #outdated from OutdatedCommand to Specification (for Isolate).
  * Print out a warning about missing executables.

* 3 bug fixes:

  * Added missing requires to fix various upgrade issues.
  * `gem pristine` respects multiple gem repositories.
  * setup.rb now execs with --disable-gems when possible

=== 1.8.1 / 2011-05-05

* 1 minor enhancement:

  * Added Gem::Requirement#specific? and Gem::Dependency#specific?

* 4 bug fixes:

  * Typo on Indexer rendered it useless on Windows
  * gem dep can fetch remote dependencies for non-latest gems again.
  * gem uninstall with multiple versions no longer crashes with ArgumentError
  * Always use binary mode for File.open to keep Windows happy

=== 1.8.0 / 2011-04-34

This release focused on properly encapsulating functionality.  Most of this
work focused on moving functionality out of Gem::SourceIndex and
Gem::GemPathSearcher into Gem::Specification where it belongs.

After installing RubyGems 1.8.0 you will see deprecations when loading your
exsting gems.  Run `gem pristine --all --no-extensions` to regenerate your
gem specifications safely.

Currently RubyGems does not save the build arguments used to build gems with
extensions.  You will need to run `gem pristine gem_with_extension --
--build-arg` to regenerate a gem with an extension where it requires special
build arguments.

* 24(+) Deprecations (WOOT!):

  * DependencyList.from_source_index deprecated the source_index argument.
  * Deprecated Dependency.new(/regex/).
  * Deprecated Gem.searcher.
  * Deprecated Gem.source_index and Gem.available?
  * Deprecated Gem: activate_dep, activate_spec, activate,
    report_activate_error, and required_location.
  * Deprecated Gem::all_partials
  * Deprecated Gem::cache_dir
  * Deprecated Gem::cache_gem
  * Deprecated Gem::default_system_source_cache_dir
  * Deprecated Gem::default_user_source_cache_dir
  * Deprecated Platform#empty?
  * Deprecated Specification.cache_gem
  * Deprecated Specification.installation_path
  * Deprecated Specification.loaded, loaded?, and loaded=
  * Deprecated all of Gem::SourceIndex.
  * Deprecated all of Gem::GemPathSearcher.
  * Deprecated Gem::Specification#default_executable.

* 2 major enhancements:

  * Gem::SourceIndex functionality has been moved to Gem::Specification.
    Gem::SourceIndex is completely disconnected from Gem::Specification
  * Refactored GemPathSearcher entirely out. RIPMF

* 41 minor enhancements:

  * Added CommandManager#unregister_command
  * Added Dependency#matching_specs + to_specs.
  * Added Dependency#to_spec
  * Added Gem.pre_reset_hook/s and post_reset_hook/s.
  * Added GemCommand.reset to reinitialize the singleton
  * Added Specification#activate.
  * Added Specification#activated, activated=, and activated?
  * Added Specification#base_dir.
  * Added Specification#bin_dir and bin_file.
  * Added Specification#cache_dir and cache_file. Aliased cache_gem.
  * Added Specification#doc_dir and ri_dir.
  * Added Specification#find(name_or_dep, *requirements).
  * Added Specification#gem_dir and gems_dir.
  * Added Specification#spec_dir and spec_file.
  * Added Specification.add_spec, add_specs, and remove_spec.
  * Added Specification.all=. If you use this, we will light you on fire.
  * Added Specification.all_names.
  * Added Specification.dirs and dirs=. dirs= resets.
  * Added Specification.find_all_by_name(name, *reqs)
  * Added Specification.latest_specs. SO TINY!
  * Added TestCase#all_spec_names to help clean up tests
  * Added TestCase#assert_path_exists and refute_path_exists. Will move to
    minitest.
  * Gem.sources no longer tries to load sources gem. Only uses default_sources.
  * Installer no longer accepts a source_index option.
  * More low-level integration.
  * Removed Gem::FileOperations since it is a dummy class
  * Removed a comment because I am dumb
  * Removed pkgs/sources/lib/sources.rb
  * Revamped indexer to mostly not use SourceIndex (legacy index requires it).
  * Rewrote our last functional test suite to be happy and fast
  * RubyGems is now under the Ruby License or the MIT license
  * Specification#== now only checks name, version, and platform.
  * Specification#authors= now forcefully flattens contents (bad rspec! no
    cookie!)
  * Specification#eql? checks all fields.
  * Specification#installation_path no longer raises if it hasn't been
    activated.
  * Specification#validate now ensures that authors is not empty.
  * TestCase.util_setup_spec_fetcher no longer returns a SourceIndex.
  * Uninstaller no longer passes around SourceIndex instances
  * Warn on loading bad spec array values (ntlm-http gem has nil in its cert
    chain)
  * `gem pristine` now accepts --no-executables to skip restoring gems with
    extensions.
  * `gem pristine` can now restore multiple gems.

* 6 bug fixes:

  * DependencyInstaller passed around a source_index instance but used
    Gem.source_index.
  * Fixed Platform#== and #hash so instances may be used as hash keys.
  * Fixed broken Specification#original_platform. It should never be nil.
  * Gem::Text#format_text now strips trailing whitespace
  * Normalize LOAD_PATH with File.expand_path
  * `gem build` errors should exit 1.
  * `gem pristine` can now restore non-latest gems where the cached gem was
    removed.

=== 1.7.1 / 2011-03-32

* 1 bug fix:
  * Fixed missing file in Manifest.txt.  (Also a bug in hoe was fixed where
    `rake check_manifest` showing a diff would not exit with an error.)

=== 1.7.0 / 2011-03-32

* 16 Deprecations (woot!)
  * Deprecated Gem.all_load_paths, latest_load_paths, promote_load_path, and
    cache.
  * Deprecated RemoteFetcher#open_uri_or_path.
  * Deprecated SourceIndex#all_gems.
  * Deprecated SourceIndex#initialize(hash_of_specs).
  * Deprecated SourceIndex.from_installed_gems, from_gems_in, and
    load_specification.
  * Deprecated Specification#has_rdoc, default_executable, and
    test_suite_file(=).
  * Deprecated Specification#has_rdoc= and default_executable=

* 26 minor enhancements:
  * Added stupid simple deprecation module.
  * Added --spec option to `gem unpack` to output a gem's original metadata
  * Added packaging option to Specification#validate
  * Gem.bin_path requires the exec_name argument.
  * Read from cached specs if fetch fails for some reason
  * Refactored Specification#assign_defaults into #initialize.
  * RemoteFetcher#fetch_path now dispatches dynamically to 'fetch_<uri.schema>'
  * Removed Specification @@gather.
  * Removed Specification.attribute.
  * Removed Specification.attribute_alias_singular.
  * Removed Specification.attribute_defaults.
  * Removed Specification.attributes
  * Removed Specification.overwrite_accessor.
  * Removed Specification.read_only.
  * Removed Specification.required_attribute.
  * Removed Specification::SPECIFICATION_VERSION_HISTORY and turned into rdoc
  * Removed blanket rescue in default_executable. Hope it doesn't blow up! :P
  * Removed nearly all metaprogramming from Specification. Yay for
    attr_accessor!
  * SourceIndex#initialize changed to prefer an array of spec dirs, defaulting
    to none.
  * SourceIndex.new is now the preferred way to create SourceIndex instances.
    *gasp*
  * Specification#validate now checks that array attribs are indeed arrays.
  * Specification.default_value is now an instance method.
  * Switched Specification::TODAY to be proper midnight @ UTC
  * Update Gem::RemoteFetcher\'s User-Agent to handle RUBY_ENGINE and
    RUBY_REVISION when patchlevel is -1
  * UpdateCommand#gems_to_update now returns (name, version) pairs.
  * UpdateCommand#which_to_update now takes an optional system argument.

* 11 bug fixes:
  * Added missing remote fetcher require to pristine command (aarnell)
  * Building gems now checks to ensure all required fields are non-nil
  * Fix option parser when summary is nil.
  * Fixed `gem contents` to work with the lightweight specifications
  * Fixed `gem update --system x.y.z` where x.y.z == latest version. (MGPalmer)
  * Fixed gem contents sorting and tests. (MGPalmer)
  * Fixed intermittant problem in `gem fetch` with --platform specified (quix)
  * Fixed lightweight specifications so `gem rdoc` will generate proper
    documentation
  * MockGemUI#terminate_interaction should not raise Gem::SystemExitException.
    (MGPalmer)
  * RubyGems now raises a better error for broken .gem files.  Bug #29067 by
    Elias Baixas
  * `gem update` now uniq's command line arguments.

=== 1.6.2 / 2011-03-08

Bug Fixes:

* require of an activated gem could cause activation conflicts.  Fixes
  Bug #29056 by Dave Verwer.
* `gem outdated` now works with up-to-date prerelease gems.

=== 1.6.1 / 2011-03-03

Bug Fixes:

* Installation no longer fails when a dependency from a version that won't be
  installed is unsatisfied.
* README.rdoc now shows how to file tickets and get help.  Pull Request #40 by
  Aaron Patterson.
* Gem files are cached correctly again.  Patch #29051 by Mamoru Tasaka.
* Tests now pass with non-022 umask.  Patch #29050 by Mamoru Tasaka.

=== 1.6.0 / 2011-02-29

4 Deprecations:

* RubyGems no longer requires 'thread'.  Rails < 3 will need to add require
  'thread' to their applications.
* Gem.cache is deprecated.  Use Gem.source_index.
* RbConfig.datadir is deprecated.  Use Gem.datadir.
* Gem::LoadError#version_requirements has been removed.  Use
  Gem::LoadError#requirement.

2 Major Enhancements:

* Rewrote how Gem::activate (gem and require) resolves dependencies.
* Gem::LoadError#version_requirement has been removed. Use
  Gem::LoadError#requirement.

17 Minor Enhancments:

* Added --key to `gem push` for setting alternate API keys.
* Added --format-executable support to gem uninstall.
* Added Gem::DependencyList#clear.
* Added Gem::DependencyList#remove_specs_unsatisfied_by
* Added Gem.latest_spec_for, latest_version_for, and latest_rubygems_version.
* Added Gem::Dependency#merge which merges requirements for two
  dependencies.
* Added Gem::TestCase#util_spec for faster tests.
* Added Gem::Specification#dependent_specs.
* Added Gem::TestCase#new_spec and Gem::TestCase#install_specs.
* Added flag to include prerelease gems in Gem::SourceIndex#latest_specs.
* Gem.cache_dir always references the proper cache dir. 
  Pass true to support a user path.
* Gem.cache_gem, given a filename always references the cache gem.
  Pass true to support a user path.
* Added Gem::Specification#conflicts
* Removed rdoc gem/require from test_case.rb.
* Rubygems will no longer let you push if you're using beta or unreleased
  rubygems.
* Save RAM / GC churn by removing spec.files and rdoc options from
  locally cached gem specifications.
* SpecFetcher.fetch_spec can now take a string source_uri.

10 Bug Fixes:

* Added missing require of Gem::RemoteFetcher to the unpack command.
* RubyGems now completely removes a previous install when reinstalling.
* Fixed Gem::Installer#generate_bin to only chmod files that exist.
* Fixed handling of Windows style file:/// uris.
* Fixed requires in tests. (shota)
* Fixed script generation on Windows.
* Fixed test issues if you have older rubygems installed.
* Gem::DependencyInstaller tests use Gem::Security, add the missing require.
* Gem::Security used FileUtils but didn't require it.  Reported by Elia Schito.
* Gem::Uninstaller now respects --format-executable.

=== 1.5.3 / 2011-02-26

Bug Fixes:

* Fix for a bug in Syck which causes install failures for gems packaged with
  Psych.  Bug #28965 by Aaron Patterson.

=== 1.5.2 / 2011-02-10

Bug Fixes:

* Fixed <tt>gem update --system</tt>.  RubyGems can now update itself again.

=== 1.5.1 / 2011-02-09

==== NOTE: `gem update --system` is broken. See UPGRADING.rdoc.

Minor Enhancement:

* Added ability to do gem update --system X.Y.Z.

Bug Fixes:

* Scrub !!null YAML from 1.9.2 (install and build).
* Added missing requires for user_interaction.
* Wrote option processing tests for gem update.
* Updated upgrading doco for new gem update --system option.
* Fixed SilentUI for cygwin; try /dev/null first then fall back to NUL.
* RubyGems now enforces ruby 1.8.7 or newer.

=== 1.5.0 / 2011-01-31

==== NOTE: `gem update --system` is broken. See UPGRADING.rdoc.

Major Enhancements:

* Finally fixed all known 1.9.x issues. Upgrading is now possible!
* Merged huge 1.3.7/ruby-core changes to master.

Minor Enhancements:

* Added UPGRADING.rdoc to help deal with 1.9 issues.
* Gem::Format now gives better errors for corrupt gem files and includes paths
* Pre-install hooks can now abort gem installation by returning false
* Move shareable TestCase classes to lib/ to help plugin authors with tests.
* Add post-build hooks that can cancel the gem install
* Always require custom_require now that require_gem is gone
* Added GemInstaller accessors for @options so plugins can reference them.
* Optimized Gem.find_files. ~10% faster than 1.4.2. ~40% faster than ruby 1.9.
* Gem::SilentUI now behaves like Gem::StreamUI for asking questions.  Patch by
  Erik Hollensbe.

Bug Fixes:

* `gem update` was implicitly doing --system.
* 1.9.3: Fixed encoding errors causing gem installs to die during rdoc phase.
* Add RubyForge URL to README. Closes #28825
* 1.9.3: Use chdir {} when building extensions to prevent warnings. Fixes #4337
* 1.9.2: Fix circular require warning.
* Make requiring openssl even lazier at request of NaHi
* `gem unpack` will now download the gem if it is not in the cache. Patch by
  Erik Hollensbe.
* rubygems-update lists its development dependencies again

=== 1.4.2 / 2011-01-06

Bug fixes:

* Gem::Versions: "1.b1" != "1.b.1", but "1.b1" eql? "1.b.1". Fixes gem indexing.
* Fixed Gem.find_files.
* Removed otherwise unused #find_all_dot_rb. Only 6 days old and hella buggy.

=== 1.4.1 / 2010-12-31

Since apparently nobody reads my emails, blog posts or the README:

DO NOT UPDATE RUBYGEMS ON RUBY 1.9! See UPGRADING.rdoc for details.

Bug fix:

* Specification#load was untainting a frozen string (via `gem build *.spec`)

=== 1.4.0 / 2010-12-30

NOTE: In order to better maintain rubygems and to get it in sync with
the world (eg, 1.9's 1.3.7 is different from our 1.3.7), rubygems is
switching to a 4-6 week release schedule. This release is the
precursor to that process and as such may be a bit on the wild side!
You have been warned!

NOTE: We've switched to git/github. See README.rdoc for details.

New features:

* Added --launch option to `gem server`. (gthiesfeld)
* Added fuzzy name matching on install failures. (gstark/presidentbeef)
* Allow searching w/ file extensions: gem which fileutils.rb
* Progress indicator during download (Ryan Melton)
* Speed up Gem::Version#<=> by 2-3x in common cases. (raggi)
* --source is now additive with your current sources.
  Use --clear-sources first to maintain previous behavior.

Bug fixes:

* Dependency "~>"s now respect lower-bound prerelease versions.
* Ensure the gem directories exist on download.
* Expand Windows user home candidates for Ruby 1.8. Bug #28371 & #28494
* Fix find_files to order by version.
* Fix ivar typo. [Josh Peek]
* Normalized requires and made many of them lazy.
  Do not depend on rubygems to require stdlib stuff for you. (raggi/tmm1)
* Treat 1.0.a10 like 1.0.a.10 for sorting, etc. Fixes #27903. (dchelimsky)

=== 1.3.7 / 2010-05-13

NOTE:

http://rubygems.org is now the default source for downloading gems.

You may have sources set via ~/.gemrc, so you should replace
http://gems.rubyforge.org with http://rubygems.org

http://gems.rubyforge.org will continue to work for the forseeable future.

New features:

* `gem` commands
  * `gem install` and `gem fetch` now report alternate platforms when a
    matching one couldn't be found.
  * `gem contents` --prefix is now the default as specified in --help.  Bug
    #27211 by Mamoru Tasaka.
  * `gem fetch` can fetch of old versions again.  Bug #27960 by Eric Hankins.
  * `gem query` and friends output now lists platforms.  Bug #27856 by Greg
    Hazel.
  * `gem server` now allows specification of multiple gem dirs for
    documentation.  Bug #27573 by Yuki Sonoda.
  * `gem unpack` can unpack gems again.  Bug #27872 by Timothy Jones.
  * `gem unpack` now unpacks remote gems.
  * --user-install is no longer the default.  If you really liked it, see
    Gem::ConfigFile to learn how to set it by default.  (This change was made
    in 1.3.6)
* RubyGems now has platform support for IronRuby.  Patch #27951 by Will Green.

Bug fixes:

* Require rubygems/custom_require if --disable-gem was set.  Bug #27700 by
  Roger Pack.
* RubyGems now protects against exceptions being raised by plugins.
* rubygems/builder now requires user_interaction.  Ruby Bug #1040 by Phillip
  Toland.
* Gem::Dependency support #version_requirements= with a warning.  Fix for old
  Rails versions.  Bug #27868 by Wei Jen Lu.
* Gem::PackageTask depends on the package dir like the other rake package
  tasks so dependencies can be hooked up correctly.

=== 1.3.6 / 2010-02-17

New features:

* `gem` commands
  * Added `gem push` and `gem owner` for interacting with modern/Gemcutter
    sources
  * `gem dep` now supports --prerelease.
  * `gem fetch` now supports --prerelease.
  * `gem server` now supports --bind.  Patch #27357 by Bruno Michel.
  * `gem rdoc` no longer overwrites built documentation.  Use --overwrite
    force rebuilding.  Patch #25982 by Akinori MUSHA.
* Captial letters are now allowed in prerelease versions.

Bug fixes:

* Development deps are no longer added to rubygems-update gem so older
  versions can update sucessfully.
* Installer bugs:
  * Prerelease gems can now depend on non-prerelease gems.
  * Development dependencies are ignored unless explicitly needed.  Bug #27608
    by Roger Pack.
* `gem` commands
  * `gem which` now fails if no paths were found.  Adapted patch #27681 by
    Caio Chassot.
  * `gem server` no longer has invalid markup.  Bug #27045 by Eric Young.
  * `gem list` and friends show both prerelease and regular gems when
    --prerelease --all is given
* Gem::Format no longer crashes on empty files.  Bug #27292 by Ian Ragsdale.
* Gem::GemPathSearcher handles nil require_paths. Patch #27334 by Roger Pack.
* Gem::RemoteFetcher no longer copies the file if it is where we want it.
  Patch #27409 by Jakub Šťastný.

Deprecation Notices:

* lib/rubygems/timer.rb has been removed.
* Gem::Dependency#version_requirements is deprecated and will be removed on or
  after August 2010.
* Bulk index update is no longer supported.
* Gem::manage_gems was removed in 1.3.3.
* Time::today was removed in 1.3.3.

=== 1.3.5 / 2009-07-21

Bug fixes:

* Fix use of prerelease gems.
* Gem.bin_path no longer escapes path with spaces. Bug #25935 and #26458.

Deprecation Notices:

* Bulk index update is no longer supported (the code currently remains, but not
  the tests)
* Gem::manage_gems was removed in 1.3.3.
* Time::today was removed in 1.3.3.

=== 1.3.4 / 2009-05-03

Bug Fixes:

* Fixed various warnings
* Gem::ruby_version works correctly for 1.8 branch and trunk
* Prerelease gems now show up in `gem list` and can be used
* Fixed option name for `gem setup --format-executable`
* RubyGems now matches Ruby > 1.9.1 gem paths
* Gem::RemoteFetcher#download now works for explicit Windows paths across
  drives.  Bug #25882 by Lars Christensen
* Fix typo in Gem::Requirement#parse.  Bug #26000 by Mike Gunderloy.

Deprecation Notices:

* Bulk index update is no longer supported (the code currently remains, but not
  the tests)
* Gem::manage_gems was removed in 1.3.3.
* Time::today was removed in 1.3.3.

=== 1.3.3 / 2009-05-04

New Features:

* `gem server` allows port names (from /etc/services) with --port.
* `gem server` now has search that jumps to RDoc.  Patch #22959 by Vladimir
  Dobriakov.
* `gem spec` can retrieve single fields from a spec (like `gem spec rake
  authors`).
* Gem::Specification#has_rdoc= is deprecated and ignored (defaults to true)
* RDoc is now generated regardless of Gem::Specification#has_rdoc?

Bug Fixes:

* `gem clean` now cleans up --user-install gems.  Bug #25516 by Brett
  Eisenberg.
* Gem.bin_path now escapes paths with spaces.
* Rake extension builder uses explicit correctly loads rubygems when invoking
  rake.
* Prerelease versions now match "~>" correctly.  Patch #25759 by Yossef
  Mendelssohn.
* Check bindir for executables, not root when validating.  Bug reported by
  David Chelimsky.
* Remove Time.today, no way to override it before RubyGems loads.  Bug #25564
  by Emanuele Vicentini
* Raise Gem::Exception for #installation_path when not installed.  Bug #25741
  by Daniel Berger.
* Don't raise in Gem::Specification#validate when homepage is nil.  Bug #25677
  by Mike Burrows.
* Uninstall executables from the correct directory.  Bug #25555 by Brett
  Eisenberg.
* Raise Gem::LoadError if Kernel#gem fails due to previously-loaded gem.  Bug
  reported by Alf Mikula.

Deprecation Notices:

* Gem::manage_gems has been removed.
* Time::today has been removed early.  There was no way to make it warn and be
  easy to override with user code.

=== 1.3.2 / 2009-04-15

Select New Features:

* RubyGems now loads plugins from rubygems_plugin.rb in installed gems.
  This can be used to add commands (See Gem::CommandManager) or add
  install/uninstall hooks (See Gem::Installer and Gem::Uninstaller).
* Gem::Version now understands prerelease versions using letters. (eg.
  '1.2.1.b')  Thanks to Josh Susser, Alex Vollmer and Phil Hagelberg.
* RubyGems now includes a Rake task for creating gems which replaces rake's
  Rake::GemPackageTask.  See Gem::PackageTask.
* Gem::find_files now returns paths in $LOAD_PATH.
* Added Gem::promote_load_path for use with Gem::find_files
* Added Gem::bin_path to make finding executables easier.  Patch #24114 by
  James Tucker.
* Various improvements to build arguments for installing gems.
* `gem contents` added --all and --no-prefix.
* Gem::Specification
  * #validate strips directories and errors on not-files.
  * #description no longer removes newlines.
  * #name must be a String.
  * FIXME and TODO are no longer allowed in various fields.
  * Added support for a license attribute.  Feature #11041 (partial).
  * Removed Gem::Specification::list, too much process growth.  Bug #23668 by
    Steve Purcell.
* `gem generate_index`
  * Can now generate an RSS feed.
  * Modern indicies can now be updated incrementally.
  * Legacy indicies can be updated separately from modern.

Select Bugs Fixed:

* Better gem activation error message. Patch #23082.
* Kernel methods are now private.  Patch #20801 by James M. Lawrence.
* Fixed various usability issues with `gem check`.
* `gem update` now rescues InstallError and continues.  Bug #19268 by Gabriel
  Wilkins.
* Allow 'https', 'file' as a valid schemes for --source.  Patch #22485.
* `gem install`
  * Now removes existing path before installing.  Bug #22837.
  * Uses Gem::bin_path in executable stubs to work around Kernel#load bug in
    1.9.
  * Correctly handle build args (after --) via the API.  Bug #23210.
* --user-install
  * `gem install --no-user-install` now works.  Patch #23573 by Alf Mikula.
  * `gem uninstall` can now uninstall from ~/.gem.  Bug #23760 by Roger Pack.
* setup.rb
  * Clarify RubyGems RDoc installation location.  Bug #22656 by Gian Marco
    Gherardi.
  * Allow setup to run from read-only location.  Patch #21862 by Luis Herrera.
  * Fixed overwriting ruby executable when BASERUBY was not set.  Bug #24958
    by Michael Soulier.
  * Ensure we're in a RubyGems dir when installing.
  * Deal with extraneous quotation mark when autogenerating .bat file on MS
    Windows.  Bug #22712.

Deprecation Notices:

* Gem::manage_gems has been removed.
* Time::today will be removed in RubyGems 1.4.

Special thanks to Chad Wooley for backwards compatibility testing and Luis
Lavena and Daniel Berger for continuing windows support.

=== 1.3.1 / 2008-10-28

Bugs fixed:

* Disregard ownership of ~ under Windows while creating ~/.gem.  Fixes
  issues related to no uid support under Windows.
* Fix requires for Gem::inflate, Gem::deflate, etc.
* Make Gem.dir respect :gemhome value from config.  (Note: this feature may be
  removed since it is hard to implement on 1.9.)
* Kernel methods are now private.  Patch #20801 by James M. Lawrence.
* Gem::location_of_caller now behaves on Windows.  Patch by Daniel Berger.
* Silence PATH warning.

Deprecation Notices:

* Gem::manage_gems will be removed on or after March 2009.

=== 1.3.0 / 2008-09-25

New features:

* RubyGems doesn't print LOCAL/REMOTE titles for `gem query` and friends if
  stdout is not a TTY, except with --both.
* Added Gem.find_files, allows a gem to discover features provided by other
  gems.
* Added pre/post (un)install hooks for packagers of RubyGems.  (Not for gems
  themselves).
* RubyGems now installs gems into ~/.gem if GEM_HOME is not writable.  Use
  --no-user-install command-line switch to disable this behavior.
* Fetching specs for update now uses If-Modified-Since requests.
* RubyGems now updates the ri cache when the rdoc gem is installed and
  documentation is generated.

Deprecation Notices:

* Gem::manage_gems now warns when called.  It will be removed on or after March
  2009.

Bugs Fixed:

* RubyGems 1.3.0+ now updates when no previous rubygems-update is installed.
  Bug #20775 by Hemant Kumar.
* RubyGems now uses the regexp we already have for `gem list --installed`.  Bug
  #20876 by Nick Hoffman.
* Platform is now forced to Gem::Platform::RUBY when nil or blank in the
  indexer.  Fixes various uninstallable gems.
* Handle EINVAL on seek.  Based on patch in bug #20791 by Neil Wilson.
* Fix HTTPS support.  Patch #21072 by Alex Arnell.
* RubyGems now loads all cache files even if latest has been loaded.  Bug
  #20776 by Uwe Kubosch.
* RubyGems checks for support of development dependencies for #to_ruby.  Bug
  #20778 by Evan Weaver.
* Now specifications from the future can be loaded.
* Binary script uninstallation fixed.  Bug #21234 by Neil Wilson.
* Uninstallation with -i fixed.  Bug #20812 by John Clayton.
* Gem::Uninstaller#remove_all now calls Gem::Uninstaller#uninstall_gem so hooks
  get called.  Bug #21242 by Neil Wilson.
* Gem.ruby now properly escaped on windows.  Fixes problem with extension
  compilation.
* `gem lock --strict` works again.  Patch #21814 by Sven Engelhardt.
* Platform detection for Solaris was improved.  Patch #21911 by Bob Remeika.

Other Changes Include:

* `gem help install` now describes _version_ argument to executable stubs
* `gem help environment` describes environment variables and ~/.gemrc and
  /etc/gemrc
* On-disk gemspecs are now read in UTF-8 and written with a UTF-8 magic comment
* Rakefile
  * If the SETUP_OPTIONS environment variable is set, pass its contents as
    arguments to setup.rb
* lib/rubygems/platform.rb
  * Remove deprecated constant warnings and really deprecate them.  (WIN32,
    etc).
* lib/rubygems/remote_fetcher.rb
  * Now uses ~/.gem/cache if the cache dir in GEM_HOME is not writable.
* lib/rubygems/source_index.rb
  * Deprecate options to 'search' other than Gem::Dependency instances and
    issue warning until November 2008.
* setup.rb
  * --destdir folder structure now built using Pathname, so it works for
    Windows platforms.
* test/*
  * Fixes to run tests when under test/rubygems/.  Patch by Yusuke ENDOH
    [ruby-core:17353].
* test/test_ext_configure_builder.rb
  * Locale-free patch by Yusuke Endoh [ruby-core:17444].

=== 1.2.0 / 2008-06-21

New features:

* RubyGems no longer performs bulk updates and instead only fetches the gemspec
  files it needs.  Alternate sources will need to upgrade to RubyGems 1.2 to
  allow RubyGems to take advantage of the new metadata updater.  If a pre 1.2
  remote source is in the sources list, RubyGems will revert to the bulk update
  code for compatibility.
* RubyGems now has runtime and development dependency types.  Use
  #add_development_dependency and #add_runtime_dependency.  All typeless
  dependencies are considered to be runtime dependencies.
* RubyGems will now require rubygems/defaults/operating_system.rb and
  rubygems/defaults/#{RBX_ENGINE}.rb if they exist.  This allows packagers and
  ruby implementers to add custom behavior to RubyGems via these files.  (If
  the RubyGems API is insufficient, please suggest improvements via the
  RubyGems list.)
* /etc/gemrc (and windows equivalent) for global settings
* setup.rb now handles --vendor and --destdir for packagers
* `gem stale` command that lists gems by last access time

Bugs Fixed:

* File modes from gems are now honored, patch #19737
* Marshal Gem::Specification objects from the future can now be loaded.
* A trailing / is now added to remote sources when missing, bug #20134
* Gems with legacy platforms will now be correctly uninstalled, patch #19877
* `gem install --no-wrappers` followed by `gem install --wrappers` no longer
  overwrites executables
* `gem pristine` now forces reinstallation of gems, bug #20387
* RubyGems gracefully handles ^C while loading .gemspec files from disk, bug
  #20523
* Paths are expanded in more places, bug #19317, bug #19896
* Gem::DependencyInstaller resets installed gems every install, bug #19444
* Gem.default_path is now honored if GEM_PATH is not set, patch #19502

Other Changes Include:

* setup.rb
  * stub files created by RubyGems 0.7.x and older are no longer removed.  When
    upgrading from these ancient versions, upgrade to 1.1.x first to clean up
    stubs.
  * RDoc is no longer required until necessary, patch #20414
* `gem server`
  * Now completely matches the output of `gem generate_index` and
    has correct content types
  * Refreshes from source directories for every hit.  The server will no longer
    need to be restarted after installing gems.
* `gem query --details` and friends now display author, homepage, rubyforge url
  and installed location
* `gem install` without -i no longer reinstalls dependencies if they are in
  GEM_PATH but not in GEM_HOME
* Gem::RemoteFetcher now performs persistent connections for HEAD requests,
  bug #7973

=== 1.1.1 / 2008-04-11

Bugs Fixed:

* Gem.prefix now returns non-nil only when RubyGems was installed outside
  sitelibdir or libdir.
* The `gem server` gem list now correctly links to gem details.
* `gem update --system` now passes --no-format-executable to setup.rb.
* Gem::SourceIndex#refresh! now works with multiple gem repositories.
* Downloaded gems now go into --install-dir's cache directory.
* Various fixes to downloading gem metadata.
* `gem install --force` now ignores network errors too.
* `gem pristine` now rebuilds extensions.
* `gem update --system` now works on virgin Apple ruby.
* Gem::RemoteFetcher handles Errno::ECONNABORTED.
* Printing of release notes fixed.

=== 1.1.0 / 2008-03-29

New features:

* RubyGems now uses persistent connections on index updates.  Index updates are
  much faster now.
* RubyGems only updates from a latest index by default, cutting candidate gems
  for updates to roughly 1/4 (at present).  Index updates are even faster
  still.
  * `gem list -r` may only show the latest version of a gem, add --all to see
    all gems.
* `gem spec` now extracts specifications from .gem files.
* `gem query --installed` to aid automation of checking for gems.

Bugs Fixed:

* RubyGems works with both Config and RbConfig now.
* Executables are now cleaned upon uninstall.
* You can now uninstall from a particular directory.
* Updating from non-default sources fixed.
* Executable stubs now use ruby install name in shebang.
* `gem unpack` checks every directory in Gem.path now.
* `gem install` now exits with non-zero exit code when appropriate.
* `gem update` only updates gems that need updates.
* `gem update` doesn't force remote-only updates.
* `gem update` handles dependencies properly when updating.
* Gems are now loaded in Gem.path order.
* Gem stub scripts on windows now work outside Gem.bindir.
* `gem sources -r` now works without network access.

Other Changes Include:

* RubyGems now requires Ruby > 1.8.3.
* Release notes are now printed upon installation.
* `gem env path` now prints a usable path.
* `gem install` reverts to local-only installation upon network error.
* Tar handling code refactoring and cleanup.
* Gem::DependencyInstaller's API has changed.

For a full list of changes to RubyGems, see the ChangeLog file.

=== 1.0.1 / 2007-12-20

Bugs Fixed:

* Installation on Ruby 1.8.3 through 1.8.5 fixed
* `gem build` on 1.8.3 fixed

Other Changes Include:

* Since RubyGems 0.9.5, RubyGems is no longer supported on Ruby 1.8.2 or older,
  this is official in RubyGems 1.0.1.

=== 1.0.0 / 2007-12-20

Major New Features Include:

* RubyGems warns about various problems with gemspecs during gem building
* More-consistent versioning for the RubyGems software

Other Changes Include:

* Fixed various bugs and problems with installing gems on Windows
* Fixed using `gem server` for installing gems
* Various operations are even more verbose with --verbose
* Built gems are now backwards compatible with 0.9.4
* Improved detection of RUBYOPT loading rubygems
* `ruby setup.rb` now has a --help option
* Gem::Specification#bindir is now respected on installation
* Executable stubs can now be installed to match ruby's name, so if ruby is
  installed as 'ruby18', foo_exec will be installed as 'foo_exec18'
* `gem unpack` can now unpack into a specific directory with --target
* OpenSSL is no longer required by default

Deprecations and Deletions:

* Kernel#require_gem has been removed
* Executables without a shebang will not be wrapped in a future version, this
  may cause such executables to fail to operate on installation
* Gem::Platform constants other than RUBY and CURRENT have been removed
* Gem::RemoteInstaller was removed
* Gem::Specification#test_suite_file and #test_suite_file= are deprecated in
  favor of #test_file and #test_file=
* Gem::Specification#autorequire= has been deprecated
* Time::today will be removed in a future version

=== 0.9.5 / 2007-11-19

Major New Features Include:

* Platform support
* Automatic installation of platform gems
* New bandwidth and memory friendlier index file format
* "Offline" mode (--no-update-sources)
* Bulk update threshold can be specified (-B, --bulk-threshold)
* New `gem fetch` command
* `gem` now has "really verbose" output when you specify -v
* Improved stubs and `gem.bat` on mswin, including better compatiblity
  with the One-Click Installer.

Other Changes Include:

* Time::today is deprecated and will be removed at a future date
* Gem::manage_gems is deprecated and will be removed at a future date
* `gem install --include-dependencies` (-y) is now deprecated since it is the
  default, use --ignore-dependencies to turn off automatic dependency
  installation
* Multi-version diamond dependencies only are installed once
* Processing a YAML bulk index update takes less memory
* `gem install -i` makes sure all depenencies are installed
* `gem update --system` reinstalls into the prefix it was originally installed
  in
* `gem update --system` respects --no-rdoc and --no-ri flags
* HTTP basic authentication support for proxies
* Gem::Specification#platforms should no longer be a String, use
  Gem::Platform::CURRENT when building binary gems instead
* `gem env` has more diagnostic information
* require 'rubygems' loads less code
* sources.gem is gone, RubyGems now uses built-in defaults
* `gem install --source` will no longer add --source by default, use `gem
  sources --add` to make it a permanent extra source
* `gem query` (list) no longer prints details by default
* Exact gem names are matched in various places
* mkrf extensions are now supported
* A gem can depend on a specific RubyGems version
* `gem_server` is now `gem server`
* `gemlock` is now `gem lock`
* `gem_mirror` is now `gem mirror`
* `gemwhich` is now `gem which`
* `gemri` is no longer included with RubyGems
* `index_gem_repository.rb` is now `gem generate_index`
* `gem` performs more validation of parameters
* Custom rdoc styles are now supported
* Gem indexer no longer removes quick index during index creation
* Kernel#require only rescues a LoadError for the file being required now
* `gem dependencies` can now display some information for remote gems
* Updating RubyGems now works with RUBYOPT=-rubygems

Special thanks to:

* Daniel Berger
* Luis Lavena
* Tom Copeland
* Wilson Bilkovich

=== 0.9.4 / 2007-05-23

If you are experiencing problems with the source index (e.g. strange
"No Method" errors), or problems with zlib (e.g. "Buffer Error"
messsage), we recommend upgrading to RubyGems 0.9.4.

Bug Fixes Include:

* Several people have been experiencing problems with no method errors
  on the source index cache.  The source index cache is now a bit more
  self healing.  Furthermore, if the source index cache is
  irreparable, then it is automatically dropped and reloaded.
* The source cache files may now be dropped with the "gem sources
  --clear-all" command.  (This command may require root is the system
  source cache is in a root protected area).
* Several sub-commands were accidently dropped from the "gem" command.
  These commands have been restored.

=== 0.9.3 / 2007-05-10

Bug Fixes Include:

The ZLib library on Windows will occasionally complains about a buffer error
when unpacking gems.  The Gems software has a workaround for that problem, but
the workaround was only enabled for versions of ZLib 1.2.1 or earlier.  We
have received several reports of the error occuring with ZLib 1.2.3, so we
have permanently enabled the work around on all versions.

=== 0.9.2 / 2007-02-05

Bug Fixes Include:

* The "unpack" command now works properly.
* User name and password are now passed properly to the authenticating
  proxy when downloading gems.

=== 0.9.1 / 2007-01-16

See ChangeLog

=== 0.9.0 / 2006-06-28

Finally, the much anticipated RubyGems version 0.9.0 is now available.
This release includes a number of new features and bug fixes.  The
number one change is that we can now download the gem index
incrementally.  This will greatly speed up the gem command when only a
few gems are out of date.

Major Enhancments include:

* The gem index is now downloaded incrementally, only updating entries
  that are out of date.  If more than 50 entries are out of date, we
  revert back to a bulk download.
* Several patches related to allowing RubyGems to work with
  authenticating proxies (from Danie Roux and Anatol Pomozov).  Just
  put the user and password in the proxy URL (e.g. -p
  http://user:password@proxy.address.com:8080) or use the
  HTTP_PROXY_USER and HTTP_PROXY_PASS environment variables.
* The gem unpack command can now accept a file path rather than just a
  install gem name.
* Both RI and RDOC documents are now generated by default.
* A gemri command is included to read gem RI docs (only needed for
  Ruby 1.8.4 or earlier).

Minor enhancements include:

* Verison 0.0.0 is now a valid gem version.
* Better detection of missing SSL functionality.
* SSL is not required if the security policy does not require
  signature checking.
* Rake built extensions are now supported (Tilman Sauerbeck).
* Several autorequire bug fixes.
* --traceback is now an alias for --backtrace (I can never remember
  which one it is).
* SAFE=1 compatibility fixes.
* .rbw is now a supported suffix for RubyGem's custom require.
* Several Ruby 1.9 compatibility fixes (Eric Hodel).

Bug Fixes:

* Added dashes to gemspecs generated in Ruby 1.8.3.  This solves some
  cross-Ruby version compatibility issues.
* Fixed bug where the wrong executables could be uninstalled (Eric
  Hodel).
* Fixed bug where gem unpack occasionally unpacked the wrong gem.
* Fixed bug where a fatal error occured when permissions on .gemrc
  were too restrictive (reported by Luca Pireddu).
* Fixed prefix handling for native expressions (patch by Aaron Patterson).
* Fixed several Upgrade => Update typos.

=== 0.8.11 / 2005-07-13

* -y is a synonym for --include-dependencies.
* Better handling of errors in the top level rescue clause.
* Package list command (e.g. gem inspect GEM).
* .gemrc now allows cvsrc-like options to set defaults per subcommand.
* The autorequire gem spec field will now accept a list.
* Substituted Time for Date in specs, increasing performance
  dramatically.
* Fixed reported bug of gem directories ending in "-" (reported by
  Erik Hatcher).
* Fixed but in installer that caused dependency installation to not
  work.
* Added Paul Duncan's gem signing patch.
* Added Mark Hubbart's Framework patch (for better integration with OS
  X).
* Added David Glasser's install-from-mirror patch.
* Additional internal structural cleanup and test reorganization.

=== 0.8.10 / 2005-03-27

* In multi-user environments, it is common to supply mulitple versions of gems
  (for example Rails), allowing individual users to select the version of the
  gem they desire.  This allows a user to be insulated from updates to that
  gem.  RubyGems 0.8.10 fixes a problem where gems could occasionally become
  confused about the current versions of libraries selected by the user.
* The other annoying bug is that if there are any existing rubygems-update gems
  installed, then the "gem update --system" command will download a new
  update, but install the latest update prior to the download.

=== 0.8.9

Never released

=== 0.8.8 / 2005-03-14

* Moved the master definition of class Requirement back under version.
  Kept the body of Requirement under Gem.

=== 0.8.7 / 2005-03-14

Even though it has only been a few weeks since that last release,
there are quite a number of new features in 0.8.7.  A complete list of
new features will be given below, but here is a summary of the hot
items.

* The bug that prevented some users from installing rails has been
  squashed.  A big thanks to Bill Guindon (aGorilla) for helping track
  that one down.

There are several new commands available on the gem command:

* gem cleanup GEMNAME -- Cleanup (uninstall) all the old versions of
  gem.  If the gem name is omitted, the entire repository is cleaned.
* gem dependency GEMNAME -- Show the dependencies for the named gems.
  This is really helpful when trying to figure out what gem needs what
  other gem.

There changes to the existing commands as well.

* gem uninstall is much smarter about removing gems from the
  repository.  Lists of gems are now uninstalled in proper dependency
  order (ie. if A depends on B, A is uninstalled first).  Also,
  warnings about broken dependencies occur only when removing the
  *last* gem that supports a dependency is removed.

Both gem install and gem uninstall support some new command line
options that can reduce the amount of yes/no queries given the user.
For install we have:

* --ignore-dependencies -- Only install requests gems, no
  dependendecies are automatically installed.
* --include-dependencies -- Automatically install dependencies,
  without confirmation.

For gem uninstall, the new options are:

* --all -- Uninstall all matching gems without confirmation.
* --ignore-dependencies -- Uninstall, even if dependencies are broken.
* --executables -- Remove executables without confirmation

Under general cleanup, gems will not, by default, run RDoc on packages
that do not have the RDoc flag set.

And finally there is a new library file 'gemconfigure' to aid in
writing version sensitive applications (without undue dependencies on
RubyGems); and 'gemwhich', a short script to locate libraries in the
file system.  You can read more about them here:

* gemconfigure: http://docs.rubygems.org/read/chapter/4#page73
* gemwhich: http://docs.rubygems.org/read/chapter/17

=== 0.8.6 / 2005-02-27

* Fixed a small bug with shebang construction

=== 0.8.5 / 2005-02-26

Do you know how you used to dread getting the following message while
installing gems?

  Updating Gem source index for: http://gems.rubyforge.org

It could take up to 30 seconds (on my machine, even worse on others) for
that crazy source index to update.

This latest release of RubyGems speeds that wait time up considerably.
The following table gives the following times for installing RedCloth
with a required source index update on three system we had available to
us.  No RDoc generation was included in the following times.

  RubyGems    Linux         Mac OSX      Windows
  0.8.4       33 secs       73 secs      58 secs
  0.8.5        8 secs       14 secs      21 secs

The new caching code is at least 3x faster than previous versions.  Woo
Hoo!

=== 0.8.4 / 2005-01-01

* Rubygems 0.8.3's installer was broken unless you already had an older
  version of RubyGems installed.  That's fixed.
* Change in the way Gem::Specification internally deals with lazy attributes
  and defaults, bringing (with some loadpath_manager changes) a fairly
  significant increase in speed.
* Support for lower-cased Gem file names (for you, Paul Duncan :)
* Erik Veenstra's patch for making Gem versions sortable.

=== 0.8.3 / 2004-12-07

No real earth shattering news here, but there were a number of really
annoying issues involving other libraries that RubyGems depends upon.
0.8.3 contains some workarounds for these issues.  In particular:

* Added workaround for the null byte in Dir string issue. (see
  http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/121702).
  (Thanks to Mauricio Fernández for the quick response on this one).
* Added workaround for old version of Zlib on windows that caused
  Ruwiki to fail to install. (see
  http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/121770)
* Added workaround for large YAML file issues.  (We dynamically cut
  down the size of the source index YAML file and seem to have worked
  around immediate issues.

There has been some minor usability enhancements and changes ...

* A user specific source index cache can be used when the site-wide
  cache is unwritable (i.e. because you are running as a non-admin).
  This *greatly* speeds up gem commands run in non-admin mode when the
  site-wide cache is out of date.
* The gem command now used an HTTP HEAD command to detect if the
  server's source index needs to be downloaed.
* gem check gemname --test will run unit tests on installed gems that
  have unit tests.
* Multiple gem names are allowed on the gem install command line.
  This means you can do:
  
    gem install rake rails needle postgres-pr pimki
  
  (Ok, you get the idea)
* Multiple authors my be specified in a Gem spec.
* Switched to using setup.rb (rather than a custom install script) for
  the installation of RubyGems itself.  If you have installed RubyGems
  before, double check the installation instructions and make sure you
  use setup.rb instead of install.rb.
* Ryan Davis has provided a patch so you can use an env variable
  (GEM_SKIP), to tell loadpath_manager not to load gems of those
  names.  This was useful for him while testing libs that he had in
  development.

=== 0.8.1 / 2004-09-17

* Quick release to capture some bug fixes.

=== 0.8.0 / 2004-09-15

* Remove need for library stubs.  Set the RUBYOPT environment variable to
  include "rrubygems", and a normal require will find gem files.  Continue to
  use 'require_gem gem_name, version' to specify gem versions.
* Deprecated "test_suite_file" gemspec attribute in favor of "test_files" array.
* Generates rdoc by default on installs.
* Adopted tar/gzip file format, thanks to Mauricio Fernandez.
* "gem rdoc" allows generation of rdoc after gem installation (will add a "gem
  test"
* Application stubs can now accept an optional parameter of _VERSION_ that will
  run an arbitrary version of the application requested.
* Various bug fixes
* Various platform-independency improvements
* "gem spec --all" displays spec info for all installed version of a given gem.
* Dynamic caching of sources
* Support for user-definable sources on the command line (thanks Assaph Mehr)
* More intelligent support for platform-dependent gems.  Use Platform::CURRENT
  when building a gem to set its platform to the one you're building on.
  Installation displays a choice of platform-dependent gems, allowing the user
  to pick.
* Added "gem unpack" for "unpacking" a gem to the current directory

=== 0.7.0 / 2004-07-09

See ChangeLog

=== 0.6.1 / 2004-06-08

See ChangeLog

=== 0.6.0 / 2004-06-08

* Collapse output of --search and --list (and gem_server) operations so that
  each gem is listed only once, with each of its versions listed on the same
  line.
* bin/gem: new --upgrade-all option allows one to upgrade every installed gem
* new #required_ruby_version attribute added to gem specification for
  specifying a dependency on which version of ruby the gem needs.  Format it
  accepts is the same as the Gem::Version::Requirement format:
  
    spec.required_ruby_version = "> 1.8.0"
* --install-stub defaults to true, so library stubs are created

=== 0.5.0 / 2004-06-06

* Jim added the ability to specify version constraints to avoid API
  incompatibilities.  This has been the subject of much debate for the past
  couple of months, with many ideas and code contributed by Eivind Eklund and
  Mauricio Fernandez.  The following set of assertions shows how it works:
  
    assert_inadequate("1.3", "~> 1.4")
    assert_adequate(  "1.4", "~> 1.4")
    assert_adequate(  "1.5", "~> 1.4")
    assert_inadequate("2.0", "~> 1.4") # This one is key--the new operator
				       # disallows major version number
				       # differences.
* Group gem search output when multiple versions exist for a given gem:
  
    activerecord (0.7.8, 0.7.7, 0.7.6, 0.7.5)
      Implements the ActiveRecord pattern for ORM.
* Add arbitrary RDoc-able files via gemspec (not just Ruby source files) for
  people who have, for example, README.rdoc in their distributions.  Add to
  gemspec via: spec.extra_rdoc_files = ["list", "of", "files"].  Ruby files are
  automatically included.
* Some small bug fixes

=== 0.4.0 / 2004-05-30

* Minor bug fixes including Windows compatability issues

=== 0.3.0 / 2004-04-30

* Cleanup of command-line arguments and handling.  Most commands accept a
  --local or --remote modifier.
* Creation of Application Gems (packages that include executable programs).
  See http://rubygems.rubyforge.org/wiki/wiki.pl?DeveloperGuide for information
  on how to use it.
* Basic functionality for installing binary gems from source (:extensions
  property of gem specification holds an array of paths to extconf.rb files to
  be used for compilation)
* Install library "stub" allowing a normal 'require' to work (which then does
  the rubygems require and 'require_gem'
* --run-tests runs the test suite specified by the "test_suite_file" property
  of a gem specification
* HTTP Proxy support works.  Rewrite of HTTP code.
* Unit and functional tests added (see Rakefile).
* Prompt before remote-installing dependencies during gem installation.
* Config file for storing preferences for 'gem' command usage.
* Generally improved error messages (still more work to do)
* Rearranged gem directory structure for cleanliness.

=== 0.2.0 / 2004-03-14

* Initial public release

PK,|[?� ��doc/alt-ruby18/README.janu�[���* Ruby�Ȥ�

Ruby�ϥ���ץ뤫�Ķ��Ϥʥ��֥������Ȼظ�������ץȸ���Ǥ���
Ruby�Ϻǽ餫����ʥ��֥������Ȼظ�����Ȥ���߷פ���Ƥ���
�����顤���֥������Ȼظ��ץ���ߥ󥰤��ڤ˹Ԥ����������
����������̾�μ�³�����Υץ���ߥ󥰤��ǽ�Ǥ���

Ruby�ϥƥ����Ƚ���ط���ǽ�Ϥʤɤ�ͥ�졤Perl��Ʊ�����餤����
�Ǥ�������˥���ץ��ʸˡ�ȡ��㳰����䥤�ƥ졼���ʤɤε���
�ˤ�äơ����ʬ����䤹���ץ���ߥ󥰤�����ޤ���


* Ruby����Ĺ

  + ����ץ��ʸˡ
  + ���̤Υ��֥������Ȼظ���ǽ(���饹���᥽�åɥ�����ʤ�)
  + �ü�ʥ��֥������Ȼظ���ǽ(Mixin, �ðۥ᥽�åɤʤ�)
  + �黻�ҥ����С�����
  + �㳰�����ǽ
  + ���ƥ졼���ȥ�������
  + �����١������쥯��
  + �����ʥߥå����ǥ��� (�������ƥ�����ˤ��)
  + �ܿ������⤤��¿����UNIX���ư�������Ǥʤ���DOS��Windows��
    Mac��BeOS�ʤɤξ�Ǥ�ư��


* ���ˡ

** FTP��

�ʲ��ξ��ˤ����Ƥ���ޤ���

  ftp://ftp.ruby-lang.org/pub/ruby/

** Subversion��

�ܥ֥���Ruby�κǿ��Υ����������ɤϼ��Υ��ޥ�ɤǼ���Ǥ��ޤ���

  $ svn co http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8/

��ȯ��ü�Υ����������ɤϼ��Υ��ޥ�ɤǼ���Ǥ��ޤ���

  $ svn co http://svn.ruby-lang.org/repos/ruby/trunk/ ruby

¾�˳�ȯ��Υ֥��ΰ���ϼ��Υ��ޥ�ɤǸ����ޤ���

  $ svn ls http://svn.ruby-lang.org/repos/ruby/branches/


* �ۡ���ڡ���

Ruby�Υۡ���ڡ�����URL��

   http://www.ruby-lang.org/

�Ǥ���


* �᡼��󥰥ꥹ��

Ruby�Υ᡼��󥰥ꥹ�Ȥ�����ޤ������ô�˾�����

   ruby-list-ctl@ruby-lang.org

�ޤ���ʸ��

   subscribe YourFirstName YourFamilyName
   
�Ƚ񤤤���äƲ������� 

Ruby��ȯ�Ը����᡼��󥰥ꥹ�Ȥ⤢��ޤ���������Ǥ�ruby�Υ�
��������λ��ͳ�ĥ�ʤɼ���������ˤĤ��Ƶ������Ƥ��ޤ���
���ô�˾�����

   ruby-dev-ctl@ruby-lang.org

�ޤ�ruby-list��Ʊ�ͤ��ˡ�ǥ᡼�뤷�Ƥ��������� 

Ruby��ĥ�⥸�塼��ˤĤ����ä��礦ruby-ext�᡼��󥰥ꥹ�Ȥ�
��شط�������ˤĤ����ä��礦ruby-math�᡼��󥰥ꥹ�Ȥ�
�Ѹ���ä��礦ruby-talk�᡼��󥰥ꥹ�Ȥ⤢��ޤ��������ˡ
�Ϥɤ��Ʊ���Ǥ��� 


* ����ѥ��롦���󥹥ȡ���

�ʲ��μ��ǹԤäƤ���������

  1. �⤷configure�ե����뤬���Ĥ���ʤ����⤷����
     configure.in���Ť��褦�ʤ顢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 test�ǥƥ��Ȥ�Ԥ���

     ��test succeeded�פ�ɽ������������Ǥ����������ƥ���
     ��������Ƥⴰ�����ݾڤ���Ƥ�����ǤϤ���ޤ���

  7. make install

     root�Ǻ�Ȥ���ɬ�פ����뤫�⤷��ޤ���

�⤷������ѥ����˥��顼��ȯ���������ˤϥ��顼�Υ��ȥ�
����OS�μ����ޤ�Ǥ������ܤ�����ݡ��Ȥ��Ԥ���äƤ�
�������¾����Τ���ˤ�ʤ�ޤ���


* �ܿ�

UNIX�Ǥ����configure���ۤȤ�ɤκ��ۤ�ۼ����Ƥ����Ϥ���
�������פ�̸���Ȥ������ä����(����˰㤤�ʤ�)����Ԥˤ���
���Ȥ��ݡ��Ȥ���С����Ǥ��뤫���Τ�ޤ���

�������ƥ�����ˤ�äȤ��¸����Τ�GC��Ǥ���Ruby��GC���о�
�Υ������ƥ����㤬setjmp()�ˤ�ä���ƤΥ쥸������ jmp_buf��
��Ǽ���뤳�Ȥȡ�jmp_buf�ȥ����å���32bit���饤����Ȥ����
���뤳�Ȥ��ꤷ�Ƥ��ޤ����ä���Ԥ���Ω���ʤ������б�����
��˺���Ǥ��礦����Ԥβ������Ū��ñ�ǡ�gc.c�ǥ����å���
�ޡ������Ƥ�����ʬ�˥��饤����ȤΥХ��ȿ�����餷�ƥޡ�
�����륳���ɤ��ɲä������ǺѤߤޤ�����defined(THINK_C)�פ�
����Ƥ�����ʬ�򻲹ͤˤ��Ƥ�������

# �ºݤˤ�Ruby��Think C�Ǥϥ���ѥ���Ǥ��ޤ���

�쥸����������ɥ����CPU�Ǥϡ��쥸����������ɥ��򥹥���
���˥ե�å��夹�륢����֥饳���ɤ��ɲä���ɬ�פ����뤫����
��ޤ���


* ���۾��

COPYING.ja�ե�����򻲾Ȥ��Ƥ���������


* ���

�����ȡ��Х���ݡ��Ȥ���¾�� matz@netlab.jp �ޤǡ�
-------------------------------------------------------
created at: Thu Aug  3 11:57:36 JST 1995
Local variables:
mode: indented-text
end:
PK,|[	�h
h
doc/alt-ruby18/ChangeLognu�[���Thu Jun 27 20:55:23 2013  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* test/openssl/test_ssl.rb: Oops, sorry!

Thu Jun 27 20:21:18 2013  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* ext/openssl/lib/openssl/ssl-internal.rb (OpenSSL::SSL#verify_certificate_identity):
	  fix hostname verification. Patch by nahi.

	* test/openssl/test_ssl.rb (OpenSSL#test_verify_certificate_identity):
	  test for above.

Sat May 18 23:34:50 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/document.rb: move entity_expansion_text_limit accessor to ...
	* lib/rexml/rexml.rb: ... here to make rexml/text independent from
	  REXML::Document. It causes circular require.
	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
	  deprecated.
	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit=):
	  deprecated.
	* lib/rexml/text.rb: add missing require "rexml/rexml" for
	  REXML.entity_expansion_text_limit.
	  Reported by Robert Ulejczyk. Thanks!!! [ruby-core:52895] [Bug #7961]

Sat May 18 23:34:50 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
	  new attribute to read/write entity expansion text limit.  the default
	  limit is 10Kb.

	* lib/rexml/text.rb (REXML::Text.unnormalize): check above attribute.

Fri Oct 12 12:25:15 2012  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* error.c (name_err_to_s): we need not infect msg.

	* test/ruby/test_exception.rb (TestException#test_exception_to_s_should_not_propagate_untrustedness): test for it.

Fri Jun 29 21:26:05 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (stack_extend): prevent ALLOCA_N, which reserves a memory
	  space with for restoring machine stack stored in each threads, from
	  optimization out.  backport r34278 from the trunk.

Mon Jun 18 18:32:43 2012  Martin Bosslet  <Martin.Bosslet@googlemail.com>

	* backport r32609 from trunk.

	* ext/openssl/ossl_hmac.c: Revert checking return type of
	  HMAC_Init_ex as it is not compatible with OpenSSL < 1.0.0.

Mon Jun 18 18:32:43 2012  Martin Bosslet  <Martin.Bosslet@googlemail.com>

	* backport r32606 from trunk.

	* ext/openssl/ossl_digest.c: Check return value of EVP_DigestInit_ex.
	* ext/openssl/ossl_hmac.c: Check return value of HMAC_Init_ex.
	  Thanks, Jared Jennings, for the patch.
	  [ Ruby 1.9 - Bug #4944 ] [ruby-core:37670]

Sun Jun 10 03:00:21 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (ruby_setjmp): need to save the stack after r2 (the Table
	  of Contents on ppc64) is saved onto the stack by getcontext().
	  based on <https://bugzilla.redhat.com/show_bug.cgi?id=628715>.
	  Bug#4411

Thu Jun  7 19:00:35 2012  Kenta Murata <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (VpMemAlloc): Fixes a bug reported
	  by Drew Yao <ayao at apple.com>

Wed Jun  6 15:09:00 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_thread_join), ext/thread/thread.c (wake_one): adjusts
	  targets of rest waiting threads to join.  [ruby-core:23457]

Wed Jun  6 14:44:13 2012  Kenta Murata  <mrkn@mrkn.jp>

	* bignum.c (rb_big2dbl), test/ruby/test_bignum.rb (test_to_f):
	  A negative Bignum out of Float range should be converted to -Infinity.
	  [ruby-core:30492] [Bug #3362]

Wed Jun  6 14:06:02 2012  Tanaka Akira  <akr@fsij.org>

	* lib/webrick/utils.rb: fix fcntl call.

	* lib/drb/unix.rb: ditto.

Mon May 21 16:29:47 2012  Akinori MUSHA  <knu@iDaemons.org>

	* ext/syslog/syslog.c (mSyslog_inspect): Make sure self is a
	  module before calling rb_class2name().

Fri May 11 14:09:48 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c (PUSH): to prevent VALUE from GC,
	  must not cast it to unsigned long, which may be shorter than
	  VALUE, and the result can be mere garbage.

Sat Apr 14 18:51:41 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (rb_big2str0): prevent working clone from
	  GC. [exerb-dev:0578].  patched by MURASE Masamitsu
	  <masamitsu.murase AT gmail.com> at [exerb-dev:0580]

Fri Mar  2 11:44:33 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (mark_dump_arg): mark destination string.  patch by
	  Vit Ondruch.  [Bug #4339]

	* marshal.c (clear_dump_arg, clear_load_arg): clean up also data
	  tables as same as symbols tables.

Fri Mar  2 11:44:33 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (struct {dump,load}_arg): manage with dfree, instead
	  of using local variable which may be moved by context switch.
	  [ruby-dev:39425]

Wed Feb  8 14:06:59 2012  Hiroshi Nakamura  <nahi@ruby-lang.org>

	* ext/openssl/ossl_ssl.c: Add SSL constants and allow to unset SSL
	  option to prevent BEAST attack. See [Bug #5353].

	  In OpenSSL, OP_DONT_INSERT_EMPTY_FRAGMENTS is used to prevent
	  TLS-CBC-IV vulunerability described at
	  http://www.openssl.org/~bodo/tls-cbc.txt
	  It's known issue of TLSv1/SSLv3 but it attracts lots of attention
	  these days as BEAST attack. (CVE-2011-3389)

	  Until now ossl sets OP_ALL at SSLContext allocation and call
	  SSL_CTX_set_options at connection.  SSL_CTX_set_options updates the
	  value by using |= so bits set by OP_ALL cannot be unset afterwards.

	  This commit changes to call SSL_CTX_set_options only 1 time for each
	  SSLContext. It sets the specified value if SSLContext#options= are
	  called and sets OP_ALL if not.

	  To help users to unset bits in OP_ALL, this commit also adds several
	  constant to SSL such as
	  OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS.  These constants were
	  not exposed in Ruby because there's no way to unset bits in OP_ALL
	  before.

	  Following is an example to enable 0/n split for BEAST prevention.

	    ctx.options = OP_ALL & ~OP_DONT_INSERT_EMPTY_FRAGMENTS

	* test/openssl/test_ssl.rb: Test above option exists.

Wed Dec 28 21:34:23 2011  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* string.c (rb_str_hash): randomize hash to avoid algorithmic
	  complexity attacks. CVE-2011-4815

	* st.c (strhash): ditto.

	* string.c (Init_String): initialization of hash_seed to be at the
	  beginning of the process.

	* st.c (Init_st): ditto.

Thu Dec  8 11:57:04 2011  Tanaka Akira  <akr@fsij.org>

	* inits.c (rb_call_inits): call Init_RandomSeed at first.

	* random.c (seed_initialized): defined.
	  (fill_random_seed): extracted from random_seed.
	  (make_seed_value): extracted from random_seed.
	  (rb_f_rand): initialize random seed at first.
	  (initial_seed): defined.
	  (Init_RandomSeed): defined.
	  (Init_RandomSeed2): defined.
	  (rb_reset_random_seed): defined.
	  (Init_Random): call Init_RandomSeed2.

Sat Dec 10 20:44:23 2011  Tanaka Akira  <akr@fsij.org>

	* lib/securerandom.rb: call OpenSSL::Random.seed at the
	  SecureRandom.random_bytes call.
	  insert separators for array join.
	  patch by Masahiro Tomita.  [ruby-dev:44270]

Mon Oct 17 04:20:22 2011  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* mkconfig.rb: fix for continued lines.  based on a patch from
	  Marcus Rueckert <darix AT opensu.se> at [ruby-core:20420].

Mon Oct 17 04:19:39 2011  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* numeric.c (flo_cmp): Infinity is greater than any bignum
	  number.  [ruby-dev:38672]

	* bignum.c (rb_big_cmp): ditto.

Mon Oct 17 03:56:12 2011  Yusuke Endoh  <mame@tsg.ne.jp>

	* ext/openssl/ossl_x509store.c (ossl_x509store_initialize): initialize
	  store->ex_data.sk.  [ruby-core:28907] [ruby-core:23971]
	  [ruby-core:18121]

Thu Jun 30 12:52:56 2011  WATANABE Hirofumi  <eban@ruby-lang.org>

	* ext/tk/extconf.rb (intptr_t, uintptr_t): support for the latest ActiveTcl with mingw.

Sun Jun 26 17:52:32 2011  Nobuhiro Iwamatsu  <iwamatsu@nigauri.org>

        * ext/openssl/ossl_ssl.c: By trunk@31346, function check of SSLv2 is executed.
        However, the problem is not revised in this.
        This adds the control of using function of SSLv2 in made macro by function check.

Sun Jun 26 17:52:32 2011  Nobuhiro Iwamatsu  <iwamatsu@nigauri.org>

	* ext/openssl/extconf.rb: Should check SSLv2_*method.
	  openssl compiled with "no-ssl2" the extconf don't fail
	  when running `make' having this compilation errors.
	  Patched by Laurent Arnoud. fixes #4562, #4556

Sun Jun 26 17:46:43 2011  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* ext/tk/extconf.rb: copy from trunk, as requested by Hidetoshi NAGAI.

Thu Jun 23 18:38:43 2011  Hiroshi Nakamura  <nahi@ruby-lang.org>

	backported r26281 from ruby_1_8

	* lib/webrick/accesslog.rb (WEBrick::AccessLog.format): log parameter
	  embedding did not work. See #4913.

	* test/webrick/test_accesslog.rb: Add for test it.

Thu Jun 16 22:55:02 2011  Hiroshi Nakamura  <nahi@ruby-lang.org>

	* test/test_securerandom.rb: Add testcase.  This testcase does NOT aim
	  to test cryptographically strongness and randomness.  It includes
	  the test for PID recycle issue of OpenSSL described in #4579 but
	  it's disabled by default.

Mon Jun 13 18:33:04 2011  Tanaka Akira  <akr@fsij.org>

	* lib/securerandom.rb (SecureRandom.random_bytes): modify PRNG state
	  to prevent random number sequence repeatation at forked
	  child process which has same pid.
	  reported by Eric Wong.  [ruby-core:35765]

Thu Jun  2 18:33:51 2011  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* variable.c (rb_const_get_0):  Fix  previous change.   There were
	  possibilities   when   an   autoload-specified   library   lacks
	  definition of  the constant  it was bound  to.  Once  after such
	  library had  already beed loaded, the autoload  engine shall not
	  reload  it.   Instead  the  interpreter have  to  consider  such
	  constant nonexistent.  It results in a const_missing situation.

	* variable.c (rb_autoload_load): ditto.

	* variable.c (autoload_node): ditto.

Thu Jun  2 18:28:58 2011  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* variable.c (rb_autoload_load):  There is a  race condition while
	  autoloading.  When two or more threads touch a single autoloaded
	  constant at  a time,  one of them  does the require,  but others
	  behave  oddly.   To  fix  this  situation we  now  refrain  from
	  deleting the autoload table while someone is doing the autoload.
	  That  deletion is  deferred to  a  point where  a require  ended
	  successfully.  Doing so make it possible for multiple threads to
	  enter autoloading at the same  time but the require is protected
	  against  multiple simultaneous  entrance anyway  so all  but one
	  thread  gets blocked  at that  point.   So with  it, touching  a
	  constant that gets autoloaded cause those threads to block until
	  there is another one that does the same thing.
	  [ruby-core:36308] (#921)

	* variable.c (rb_const_get_0): ditto.

	* variable.c (autoload_node): ditto.

	* variable.c (autoload_delete): ditto.

Mon May 30 10:58:17 2011  Hiroshi Nakamura  <nahi@ruby-lang.org>

	* lib/logger.rb (Logger::ProgName): do not depend on subversion
	  keyword ($Id: ChangeLog 41678 2013-06-27 11:56:26Z shyouhei $). ProgName with revision number was written in the
	  header line of each logfile for ease of tracking what version user
	  is using in troubleshooting.  Logger is already stable enough.

Sat May 21 07:33:54 2011  Yusuke Endoh  <mame@tsg.ne.jp>

	* ext/zlib/zlib.c (zstream_append_input2): add RB_GC_GUARD.
	  This caused failure when test/csv is executed with GC.stress = true.

Sat May 21 05:43:03 2011  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* eval.c (rb_thread_atfork): When a ruby process forks, its random
	  seed shall be reinitialized to prevent CVE-2003-0900 situation.
	  This bug affects for 1.8 and earlier series, but not for 1.9.
	  fixed [ruby-core:34944].

	* io.c (pipe_open): ditto.

	* random.c (rb_reset_random_seed): ditto.

	* intern.h (rb_reset_random_seed): ditto.

Sat May 21 04:55:15 2011  Akinori MUSHA  <knu@iDaemons.org>

	* lib/uri/generic.rb (#route_from_path): Fix a bug where
	  URI('http://h/b/').route_to('http://h/b') wrongly returned './'
	  (should be '../b'). [Bug #4476]

Sat May 21 04:54:20 2011  Akinori MUSHA  <knu@iDaemons.org>

	* lib/fileutils.rb (FileUtils#touch): Fix corrupted output.
	  ref [ruby-dev:43401]

Sat May 21 02:10:09 2011  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* re.h (RMATCH_REGS): parenthesize cast expression.  suggested
	  from Nikolai Weibull in [ruby-core:35825].

Sat May 21 01:32:08 2011  NAKAMURA Usaku  <usa@ruby-lang.org>

	backported r31286 from trunk

	* numeric.c (ruby_float_step): wrong loop condition.
	  fixes [ruby-core:35753], reported by Joey Zhou.

	* test/ruby/test_range.rb (TestRange#test_step_ruby_core_35753):
	  test above change.

Sat May 21 00:55:21 2011  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/zlib/zlib.c (gzfile_check_footer): ISIZE (Input SIZE) in gzip's
	header is the size of uncompressed input data modulo 2^32.
	[ruby-core:34481] http://www.ietf.org/rfc/rfc1952.txt

Fri May 20 23:46:44 2011  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/socket/{getaddrinfo,getnameinfo}.c: include winsock2.h only when
	  specified to use winsock2 by user.
	  this problem is reported by kosaki.

Fri May 20 23:23:45 2011  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/socket/socket.c (make_addrinfo): skip IPv6 addresses when ruby
	  doesn't support IPv6 but system supports it.
	  [ruby-dev:42944] (#4230)

Fri May 20 23:10:07 2011  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/README.win32: note to need NT based OS to build ruby.

	* win32/{configure.bat,setup.mak}: backport current build method from
	  trunk. [ruby-dev:42893] (#4206)

Fri May 20 23:06:31 2011  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* Backported the fix at
	  Mon Sep 13 09:23:58 2010  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/openssl/ossl_bn.c (ossl_bn_is_prime): fix comparison
	  with rb_scan_args. Before this fix, OpenSSL::BN#prime?
	  is fully broken.

Fri May 20 23:06:31 2011  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* Backported the fix at
	  Mon Oct  4 09:30:42 2010  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/openssl/lib/openssl/bn.rb (Integer#to_bn): OpenSSL::BN.new
	  accepts only Strings, so call Integer#to_s(16).
	  16 is for an optimization. [ruby-dev:42336]

Fri Feb 18 21:18:55 2011  Shugo Maeda  <shugo@ruby-lang.org>

	* test/ruby/test_exception.rb (TestException::test_to_s_taintness_propagation):
	  Test for below.

Fri Feb 18 21:18:55 2011  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* error.c (exc_to_s): untainted strings can be tainted via
	  Exception#to_s, which enables attackers to overwrite sane strings.
	  Reported by: Yusuke Endoh <mame at tsg.ne.jp>.

	* error.c (name_err_to_s): ditto.

Fri Feb 18 21:17:22 2011  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/fileutils.rb (FileUtils::remove_entry_secure): there is a
	  race condition in the case where the given path is a directory,
	  and some other user can move that directory, and create a
	  symlink while this method is executing.
	  Reported by: Nicholas Jefferson <nicholas at pythonic.com.au>

Fri Feb 18 19:46:46 2011  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (init_stdhandle): backport mistake of r29382.
	  some code are needless in ruby 1.8.
	  [ruby-core:34579]

Fri Feb 18 19:22:17 2011  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* configure.in: revert revision r29854.  This revision introduced
	  binary incompatibilities on some circumstances.  The bug that
	  revision was fixing gets reopened by this reversion.
	  [ruby-dev:43152] cf. [Bug #2553]

Thu Dec 23 12:22:35 2010  Tanaka Akira  <akr@fsij.org>

	* lib/resolv.rb (Resolv::IPv4::Regex): make it only accept 0 to 255.
	  [ruby-core:29501]

Tue Dec 21 01:43:01 2010  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/webrick/https.rb: uninitialized instance variables.
	  Backport a part of r20864 for ruby_1_8.

Sat Dec  4 11:35:15 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (init_mkmf): needs default library path even if
	  cross compiling.

Sat Dec  4 11:25:02 2010  NAKAMURA Usaku  <usa@ruby-lang.org>

	* re.c (rb_reg_regcomp): should succeed the taint status from the
	  origin. [ruby-core:33338]

Thu Dec  2 21:13:42 2010  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* Makefile.in (fake.rb): need to expand the topdir in case of it
	  being relative, a patch from Luis Lavena <luislavena at gmail.com>.
	  [ruby-core:33466]

Wed Nov 24 18:24:26 2010  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/socket/extconf.rb: backported entirely from ruby_1_8, with small
	  modifications for the difference of mkmf.rb.

Wed Nov 24 16:24:24 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* mkconfig.rb (patchlevel): config.status may not contain
	  PATCHLEVEL even if other version numbers exist.

Wed Nov 24 16:18:02 2010  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* win32/Makefile.sub ($(RCFILES)): no revision.h in this
	  branch, a patch from Luis Lavena <luislavena at gmail.com>.
	  [ruby-core:33310]

	* cygwin/GNUmakefile.in ($(RCFILES)): ditto.

Wed Nov 24 15:44:11 2010  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/socket/extconf.rb (getaddrinfo): should initialize winsock on
	  windows.

Wed Nov 24 13:55:21 2010  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/setup.mak: use findstr.exe instead of find.exe, because all
	  target build platforms should have findstr.exe, and, find.exe often
	  means another command such as cygwin's.

Wed Nov 24 13:27:34 2010  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* ext/stringio/stringio.c (strio_getline): fix for "" as separator.
	  [ruby-dev:34591] (Backport r17739 by Yusuke Endoh from trunk).

Wed Nov 24 13:27:20 2010  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* lib/net/pop.rb (Net::POP3#set_all_uids): speed
	  up. a patch from <m-sumi AT techfirm.co.jp> [ruby-list:45047]

Tue Nov 23 20:48:10 2010  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (initialize): sets sync_close to true.
	  Thanks, Hiroshi NAKAMURA.  [ruby-core:31753]

Tue Nov 23 17:09:14 2010  NAKAMURA Usaku  <usa@ruby-lang.org>

	* lib/pathname.rb (relative_path_from): backport r23093 and r25440
	  from ruby_1_9_2.  [ruby-core:32415]

Mon Nov 22 14:13:45 2010  Masaki Suketa <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c: fix checking version of GCC.

Mon Nov 22 14:13:45 2010  Masaki Suketa <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c: NONAMELESSUNION defined only if gcc
	  version is older than 3.4.4. [ruby-core:31567] [Bug #3637]
	* ext/win32ole/extconf.rb: ditto.

Fri Nov 19 19:28:00 2010  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* Makefile.in (fake.rb): hook needed to fake mkmf.rb.
	  #2531 [ruby-core:27327]

Mon Oct 18 10:21:01 2010  NARUSE, Yui  <naruse@ruby-lang.org>

	* lib/net/http.rb (transport_request): @socket may be nil.
	  patched by Egbert Eich [ruby-core:32829]

Fri Oct  8 10:51:56 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (RBCONFIG): depends on version.h due to
	  RUBY_PATCHLEVEL.  [ruby-core:32709]

Thu Oct  7 18:10:35 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* cygwin/GNUmakefile.in, win32/Makefile.sub (RCFILES): depend on
	  real config.rb file.  [ruby-core:32709]

Sun Oct  3 18:30:23 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (rb_intern): should check symbol table overflow.
	  #3900 [ruby-dev:42330]

Fri Oct  1 15:12:05 2010  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (init_stdhandle): redirect unopened IOs to NUL.
	  backport r11362 from trunk. [ruby-core:31445]

Mon Aug 23 11:42:41 2010  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* ext/openssl/ossl_asn1.c (obj_to_asn1bool): fixed ASN1::Boolean
	  encoding issue for OpenSSL 1.0.0 compatibility.
	  ASN1::Boolean.new(false).to_der wrongly generated "\1\1\377" which
	  means 'true'.  [BUG:3735] 
	  
	  ASN1_TYPE_set of OpenSSL <= 0.9.8 treats value 0x100 as 'false' but
	  OpenSSL >= 1.0.0 treats it as 'true'.  ruby-ossl was using 0x100 for
	  'false' for backward compatibility.  Just use 0x0 for the case
	  OpenSSL >= OpenSSL 0.9.7.

	* test/openssl/test_asn1.rb: test added.

Tue Aug 10 17:35:49 2010  NARUSE, Yui  <naruse@ruby-lang.org>

	* lib/webrick/httprequest.rb (WEBrick::HTTPRequest::parse_uri):
	  rollup leading slashes. [ruby-core:31657]
	  patched by Jamison Wilde
	  NOTE: //authority/path is valid relative URI both RFC2396 and
	  RFC3986. So when give a relative URI-like string to URI lib,
	  users must care leading slashes.

Fri Jul 30 08:51:51 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (file_expand_path): home directory must be absolute.
	  [ruby-core:31537]

Fri Jul 30 08:33:20 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (file_expand_path): should check if could find user.
	  [ruby-core:31538]

Thu Jul 29 22:43:57 2010  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/webrick/ssl.rb (WEBrick::Utils.create_self_signed_cert): wrongly
	  created dummy SSL certificate with version == 3 (no such version) and
	  serial == 0 (must be >0).

Sat Jul 24 15:44:29 2010  Masaki Suketa <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c (fev_initialize): initialize pTypeInfo.
	  [ruby-core:31304][Bug #3576].

Tue Jul 13 21:46:38 2010  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* ext/openssl/ossl_config.c, ext/openssl/lib/openssl/config.rb,
	  ext/openssl/lib/openssl.rb: reimplement OpenSSL::Config in Ruby. Now
	  it should work on windows.

	* test/openssl/test_config.rb: added tests for OpenSSL::Config#dup.

Mon Jul 12 22:26:00 2010  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* ext/openssl/ossl_config.c (ossl_config_copy): wrongly updating the
	  given object with uninitialized CONF data.  now
	  OpenSSL::Config#clone works as expected; cloning the config instead of
	  SEGV or empty definition.

	* test/openssl/test_config.rb: added tests for Config#clone.

Thu Jul  8 13:43:13 2010  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/openssl/test_config.c: added tests for all Config methods.

Wed Jul  7 13:24:24 2010  NAKAMURA Usaku  <usa@ruby-lang.org>

	* file.c (ruby_find_basename): set correct baselen.

Fri Jul  2 23:34:45 2010  NAKAMURA Usaku  <usa@ruby-lang.org>

	* file.c (ruby_find_basename, ruby_find_extname): split from
	  rb_file_s_basename() and rb_file_s_extname().

	* util.c (ruby_add_suffix): support arbitrary length of the suffix
	  to get rid of the potential buffer overflow.
	  reported by tarui.

Sat Jul 10 10:51:29 2010  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* configure.in: fix use_context condition inversion.
	[Bug #2553][ruby-core:31164]. Thanks, Andre Nathan. 

Wed Jun 23 21:36:45 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: avoid getcontext() overhead if possible.
	[ruby-core:27380][Bug #2553]
	Thanks, Joe Damato, Dan Peterson and Patrick Mohr.

Wed Jan 13 06:54:44 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: check for if struct timezone is defined.

	* missing.h (struct timezone): define if not defined.

	* win32/win32.h (struct timezone): defined in the newer w32api.
	  [ruby-core:27515]

Sun Aug 15 19:59:58 2010  Yuki Sonoda (Yugui)  <yugui@yugui.jp>

	* lib/webrick/httpresponse.rb (WEBrick::HTTPResponse#set_error):
	  Fix for possible cross-site scripting (CVE-2010-0541). 
	  Found by Apple, reported by Hideki Yamane.
	  Patch by Hirokazu Nishio <nishio.hirokazu AT gmail.com>.

Sat Jul 17 15:19:58 2010  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* configure.in: Change AC_PREREQ from 2.58 to 2.60 because
	  AC_CASE macro require 2.60 or later. Thanks, Mitsuru SHIMAMURA.
	  [Bug #3579] [ruby-dev:41856]

Wed Jun 23 22:22:42 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/optparse/test_summary.rb: fixed superclass so that it run
	  solely.

Wed Jun 23 21:54:17 2010  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* marshal.c, test/ruby/test_marshal.rb: Revert r25230.  This test
	  is troublesome.

Mon Jun 21 18:12:15 2010  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/openssl/extconf.rb: check some functions added at OpenSSL 1.0.0.

	* ext/openssl/ossl_engine.c (ossl_engine_s_load): use engines which
	  exists.

Mon Jun 21 18:12:15 2010  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* ext/openssl/ossl_config.c: defined own IMPLEMENT_LHASH_DOALL_ARG_FN_098
	  macro according to IMPLEMENT_LHASH_DOALL_ARG_FN in OpenSSL 0.9.8m.
	  OpenSSL 1.0.0beta5 has a slightly different definiton so it could
	  be a temporal workaround for 0.9.8 and 1.0.0 dual support.

	* ext/openssl/ossl_pkcs5.c (ossl_pkcs5_pbkdf2_hmac): follows function
	  definition in OpenSSL 1.0.0beta5. PKCS5_PBKDF2_HMAC is from 1.0.0
	  (0.9.8 only has PKCS5_PBKDF2_HMAC_SHA1)

	* ext/openssl/ossl_ssl_session.c (ossl_ssl_session_eq): do not use
	  SSL_SESSION_cmp and implement equality func by ousrself.  See the
	  comment.

Mon Jun 21 18:12:15 2010  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* ext/openssl/ossl_ssl_session.c
	  (ossl_ssl_session_{get,set}_time{,out}): fixed a bug introduced by
	  backporting. (see [ruby-dev:40573])  use long in according to
	  OpenSSL API. (SSL_SESSION_{get,set}_time{,out})

Mon Jun 21 18:12:15 2010  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* ext/openssl/ossl_x509name.c: added X509::Name#hash_old as a wrapper
	  for X509_NAME_hash_old in OpenSSL 1.0.0.

	* test/openssl/test_x509name.rb (test_hash): make test pass with
	  OpenSSL 1.0.0.

Mon Jun 21 18:12:15 2010  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/openssl/test_x509*: make tests pass with OpenSSL 1.0.0b5.
	  * PKey::PKey#verify raises an exception when a given PKey does not
	    match with signature.
	  * PKey::DSA#sign accepts SHA1, SHA256 other than DSS1.

Mon Jun 21 18:12:15 2010  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* backport the commit from trunk:
	  Sun Feb 28 11:49:35 2010  NARUSE, Yui  <naruse@ruby-lang.org>

	* openssl/ossl.c (OSSL_IMPL_SK2ARY): for OpenSSL 1.0.
	  patched by Jeroen van Meeuwen at [ruby-core:25210]
	  fixed by Nobuyoshi Nakada [ruby-core:25238],
	  Hongli Lai [ruby-core:27417],
	  and Motohiro KOSAKI [ruby-core:28063]

	* ext/openssl/ossl_ssl.c (ossl_ssl_method_tab),
	  (ossl_ssl_cipher_to_ary): constified.

	* ext/openssl/ossl_pkcs7.c (pkcs7_get_certs, pkcs7_get_crls):
	  split pkcs7_get_certs_or_crls.

Mon Jun 21 18:12:15 2010  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/openssl/test_ec.rb: added test_dsa_sign_asn1_FIPS186_3. dgst is
	  truncated with ec_key.group.order.size after openssl 0.9.8m for
	  FIPS 186-3 compliance.

	  WARNING: ruby-openssl aims to wrap an OpenSSL so when you're using
	  openssl 0.9.8l or earlier version, EC.dsa_sign_asn1 raises
	  OpenSSL::PKey::ECError as before and EC.dsa_verify_asn1 just returns
	  false when you pass dgst longer than expected (no truncation
	  performed).

	* ext/openssl/ossl_pkey_ec.c: rdoc typo fixed.

Wed Jun 16 16:01:42 2010  Tanaka Akira  <akr@fsij.org>

	* lib/pathname.rb (Pathname#sub): suppress a warning.
	  [ruby-dev:38488]

Wed Jun 16 15:21:12 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/webrick/utils.rb (TestWEBrick#start_server): add log for
	  test_filehandler.rb

Wed Jun 16 15:21:12 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/net/http.rb (Net::HTTPHeader#{content_range,range_length}):
	  use inclusive range same as the header representation.

Thu Jun 10 14:39:35 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/iconv/test_option.rb: removed particular implementation specific tests.
	  [ruby-dev:40078]

Thu Jun 10 14:22:09 2010  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* lib/webrick/httpstatus.rb (WEBrick::HTTPStatus::Status::initialize):
	  accept 0 or more arguments. [ruby-core:28692]

Thu Jun 10 13:37:35 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_load): initialize orig_func.   [ruby-core:27296]

Tue Jun  8 18:57:48 2010  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/Makefile.sub (config.status): no need to embbed manifest if not exist.

Tue Jun  8 18:38:36 2010  NAKAMURA Usaku  <usa@ruby-lang.org>

	* include/ruby/win32.h: include errno.h before defining errnos.

	* include/ruby/win32.h: check definition existance before defining
	  errno macros.

	* win32/win32.c (errmap): define winsock errors mappings.
	  these are VC++10 support, merge from trunk (r27236, r27258).

Tue Jun  8 18:31:02 2010  NARUSE, Yui  <naruse@ruby-lang.org>

	* regexp.c (re_compile_pattern): allow zero times match for
	  non-greedy range repeatation. [ruby-core:30613]

Tue Jun  8 18:08:18 2010  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* Makefile.in (fake.rb): double the backslash.

Tue Jun  8 18:08:15 2010  NAKAMURA Usaku  <usa@ruby-lang.org>

	* configure.in: should replace COMMON_HEADERS if --with-winsock2 is
	  specified.  [ruby-dev:41521]

Tue Jun  8 17:49:18 2010  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* io.c, eval.c, process.c: remove all condition of r26371.
	  now, all platform use the same way. [Bug #3278][ruby-core:30167]

Tue Jun  8 17:45:36 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/iconv/iconv.c (rb_iconv_sys_fail): fix number of arguments.
	  a patch by Masaya TARUI <tarui AT prx.jp>.

Tue Jun  8 17:45:36 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/iconv/iconv.c (rb_iconv_sys_fail): raise BrokenLibrary if
	  errno is not set.  [ruby-dev:41317]

Tue Jun  8 17:32:37 2010  Tanaka Akira  <akr@fsij.org>

	* pack.c (pack_pack): call rb_quad_pack to preserve RangeError.

Tue Jun  8 17:32:37 2010  Tanaka Akira  <akr@fsij.org>

	* pack.c: backport integer pack/unpack from 1.9 for [ruby-core:21937].

	* configure.in: backport RUBY_DEFINT and fixed size integer checks.

	* ruby.h: include stdint.h if available.

	* bignum.c (rb_big_pack): defined..
	  (rb_big_unpack): defined.

	* intern.h (rb_big_pack): declared.
	  (rb_big_unpack): declared.

Tue Jun  8 16:52:35 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* regex.c (read_special): get rid of overrun.

Tue Jun  8 16:51:48 2010  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb: backported exception handling from trunk.
	  [ruby-core:29745]

Tue Jun  8 16:42:48 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c (VpAlloc): ensure buf does not get
	  collected.  based on a patch masaya tarui at [ruby-dev:41213].

Tue Jun  8 16:08:00 2010  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (fetch_internal): do not quote message data item
	  names.  Thanks, Eric Hodel.  [ruby-core:23508]  backported form
	  trunk.

Tue Jun  8 15:45:52 2010  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap (encode_utf7): encode & properly.  Thanks, Kengo
	  Matsuyama.  [ruby-dev:38063]  backported from trunk.

Tue Jun  8 15:43:43 2010  Masaki Suketa <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c (ole_val2variant): fix the core dump
	  when converting Array object to VT_ARRAY variant. [ruby-core:28446]
	  [Bug #2836]

Tue Jun  8 15:34:15 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_file_s_extname): skip last directory separators.
	  [ruby-core:29627]

Tue Jun  8 15:33:30 2010  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* lib/fileutils.rb (FileUtils::cp_r): dup needed here; options are
	  destroyed otherwise.

Tue Jun  8 15:27:00 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (search_required): expand home relative path first.
	  [ruby-core:29610]

Tue Jun  8 15:23:10 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/timeout.rb (Timeout#timeout): propagate errors to the
	  caller.  [ruby-dev:41010]'

Tue Jun  8 15:15:18 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/net/smtp.rb (Net::SMTP#rcptto_list): fixed typo.
	  [ruby-core:29809]

Tue Jun  8 15:15:18 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/net/smtp.rb (Net::SMTP#rcptto_list): continue when at least
	  one RCPT is accepted.  based on a patch from Kero van Gelder at
	  [ruby-core:26190].

Tue Jun  8 15:14:11 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* LEGAL: separated the section for parse.c.  contributed by Paul
	  Betteridge in [ruby-core:29472].

Tue Jun  8 14:00:33 2010  Keiju Ishitsuka  <keiju@ruby-lang.org>

	* ext/rational/lib/rational.rb: fix [Bug #1397].

Tue Jun  8 13:40:04 2010  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb (Date#>>): fixed.  [ruby-core:28011]

Tue Jun  8 12:37:56 2010  NARUSE, Yui  <naruse@ruby-lang.org>

	* io.c, eval.c, process.c: add linux to r26371's condition.
	  patched by Motohiro KOSAKI [ruby-core:28151]

Tue Jun  8 12:37:56 2010  NAKAMURA Usaku  <usa@ruby-lang.org>

	* eval.c (thread_timer, rb_thread_stop_timer): check the timing of
	  stopping timer.  patch from KOSAKI Motohiro <kosaki.motohiro _AT_
	  jp.fujitsu.com> via IRC.

	* eval.c (rb_thread_start_timer): NetBSD5 seems to be hung when calling
	  pthread_create() from pthread_atfork()'s parent handler.

	* io.c (pipe_open): workaround for NetBSD5. stop timer thread before
	  fork(), and restart it after fork() on parent, and on child if
	  needed.

	* process.c (rb_f_fork, rb_f_system): ditto.

	  these changes are tested by naruse.  fixed [ruby-dev:40074]

Mon Jun  7 19:23:04 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/nkf/nkf-utf8/nkf.c (numchar_getc): get rid of buffer
	  overflow.  [ruby-dev:40606]

Mon Jun  7 18:57:02 2010  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* ext/openssl/ossl_ssl_session.c
	  (ossl_ssl_session_{get,set}_time{,out}): fixed a bug introduced by
	  backporting. (see [ruby-dev:40573])  use long in according to
	  OpenSSL API. (SSL_SESSION_{get,set}_time{,out})

Tue May 25 08:42:42 2010  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* ext/openssl: backport fixes in 1.9.

	  * r25019 by marcandre
	    * ossl_ocsp.c (ossl_ocspres_to_der): Bug fix in Response#to_def.
	      Patch by Chris Chandler [ruby-core:18411]

	  * r25017 by marcandre
	    * ossl_config.c (ossl_config_add_value_m,
	      ossl_config_set_section): Check if frozen (or untrusted for
	      $SECURE >= 4) [ruby-core:18377]

	  * r22925 by nobu
	    * ext/openssl/openssl_missing.h (i2d_of_void): cast for callbacks.
	      [ruby-core:22860]

	    * ext/openssl/ossl_engine.c (ossl_engine_s_by_id): suppress a
	      warning.

	    * ext/openssl/ossl_ssl.c (ossl_sslctx_flush_sessions): time_t may
	      be larger than long.

	    * ext/openssl/ossl_ssl_session.c (ossl_ssl_session_get_time),
	      (ossl_ssl_session_get_timeout): use TIMET2NUM() to convert
	      time_t.

	  * r22924 by nobu
	    * ext/openssl/ossl_x509ext.c (ossl_x509ext_set_value): should use
	      OPENSSL_free instead of free.  a patch from Charlie Savage at
	      [ruby-core:22858].

	  * r22918 by akr
	    * ext/openssl: suppress warnings.

	    * ext/openssl/ossl.h (OSSL_Debug): don't use gcc extention for
	      variadic macro.

	  * r22666 by akr
	    * ext/openssl/lib/openssl/buffering.rb: define Buffering module
	      under OpenSSL.  [ruby-dev:37906]

	  * r22440 by nobu
	    * ext/openssl/ossl_ocsp.c (ossl_ocspbres_verify): OCSP_basic_verify
	      returns positive value on success, not non-zero.
	      [ruby-core:21762]

	  * r22378 by akr
	    * ext/openssl: avoid cyclic require.

	    * ext/openssl/lib/openssl/ssl-internal.rb: renamed from ssl.rb

	    * ext/openssl/lib/openssl/x509-internal.rb: renamed from x509.rb.
	      [ruby-dev:38018]

	  * r22101 by nobu
	    * ext/openssl/ossl_cipher.c (add_cipher_name_to_ary): used
	      conditionally.

	  * r21510 by akr
	    * ext/openssl/ossl.c (ossl_raise): abolish a warning.

	  * r21208 by akr
	    * ext/openssl/ossl_digest.c (GetDigestPtr): use StringValueCStr
	      instead of STR2CSTR.

	    * ext/openssl/ossl_pkey_ec.c (ossl_ec_key_initialize): ditto.
	      (ossl_ec_group_initialize): ditto.

	  * r19420 by mame
	    * ext/openssl/ossl_pkey_ec.c (ossl_ec_key_to_string): comment out
	      fragments of unused code.

	  * r18975 by nobu
	    * ext/openssl/ossl_ocsp.c (ossl_ocspres_initialize): fix for
	      initialization of r18168.

	  * r18971 by nobu
	    * ext/openssl/ossl_config.c (Init_ossl_config): removed C99ism.

	  * r18944 by matz
	    * ext/openssl/ossl_config.c (Init_ossl_config): memory leak fixed.
	      a patch <shinichiro.hamaji at gmail.com> in [ruby-dev:35880].

	    * ext/openssl/ossl_x509ext.c (ossl_x509ext_set_value): ditto.

	  * r18917 by nobu
	    * ext/openssl/ossl_x509attr.c (ossl_x509attr_initialize): fix for
	      initialization of r18168.

	    * ext/openssl/ossl_ocsp.c (ossl_ocspreq_initialize): ditto.

	    * ext/openssl/ossl_x509name.c (ossl_x509name_initialize): ditto.

	  * r18283 by nobu
	    * ext/openssl/ossl_asn1.c (ossl_asn1_get_asn1type): suppress
	      warnings on platforms which int size differs from pointer size.

	  * r18181 by nobu
	    * ext/openssl/openssl_missing.h (d2i_of_void): define for older
	      versions.  [ruby-dev:35637]

	  * r18168 by nobu
	    * ext/openssl: suppress warnings.

Sat May 22 22:31:36 2010  Tanaka Akira  <akr@fsij.org>

	* lib/resolv.rb: fix [ruby-core:28320] reported by Paul Clegg.
	  (Resolv::DNS::Requester#request): raise ResolvTimeout consistently
	  for timeout.

Sat May 22 22:14:11 2010  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/readline/readline.c (Init_readline): initialize
	  check rl_catch_signals and rl_catch_sigwinch.
	  [ruby-core:28238] [ruby-core:28242]

	* ext/readline/extconf.rb: check rl_catch_signals and
	  rl_catch_sigwinch.

Sat May 22 21:54:58 2010  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* test/net/http/test_connection.rb (TestHTTP::HTTPConnectionTest#test_connection_refused_in_request):
	  Wrong exception to assert.

Sat May 22 21:03:16 2010  Tanaka Akira  <akr@fsij.org>

	* io.c (rb_io_modenum_mode): return "r" for O_RDONLY|O_APPEND.
	  [ruby-dev:40379]

Sat May 22 20:51:39 2010  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* lib/resolv.rb (Resolv::DNS::Config#nameserver_port): 1.8.7
	  specific tweaks

Sat May 22 20:51:09 2010  Tanaka Akira  <akr@fsij.org>

	* lib/resolv.rb: fix [ruby-core:28144] reported by Hans de Graaff.
	  (Resolv::DNS#make_requester): pass nameserver_port to
	  UnconnectedUDP.new.
	  (Resolv::DNS.bind_random_port): change the is_ipv6 argument to
	  bind_host.
	  (Resolv::DNS::Requester#initialize): change instance variable to
	  store multiple sockets.
	  (Resolv::DNS::Requester#request): pass readable sockets to
	  recv_reply.
	  (Resolv::DNS::Requester#close): close all sockets.
	  (Resolv::DNS::Requester::UnconnectedUDP#initialize): allocate
	  a socket for each address family of name servers.
	  (Resolv::DNS::Requester::UnconnectedUDP#recv_reply): read from the
	  passwd readable socket.
	  (Resolv::DNS::Requester::UnconnectedUDP#sender): use appropriate
	  socket for the target nameserver.
	  (Resolv::DNS::Requester::ConnectedUDP): follow the instance variable
	  change.
	  (Resolv::DNS::Requester::TCP#sender): ditto.
	  (Resolv::DNS::Config#nameserver_port): new method.

Sat May 22 19:46:27 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/net/http.rb (Net::HTTP#request): close @socket only after
	  started.  [ruby-core:28028]

Sat May 22 19:36:38 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (proc_invoke): reverted r25975.  [ruby-dev:39931]
	  [ruby-dev:40059]

	* eval.c (rb_mod_define_method): return original block but not
	  bound block.  [ruby-core:26984]

Thu May 20 16:28:17 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/webrick/httpservlet/filehandler.rb (make_partial_content):
	  add bytes-unit.  [ruby-dev:40030]

Thu May 20 16:17:37 2010  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* ext/zlib/zlib.c: backport r18029 and r21861 from trunk.
	  * r18029 ext/zlib/zlib.c (rb_deflate_params): flush before
	    deflateParams. [ruby-core:17675] (by mame)
	  * r21861 ext/zlib/zlib.c (zstream_run): desperately guard the
	    variable.  [ruby-core:20576] (by usa)

	* test/zlib/test_zlib.rb: backport deflate tests from trunk.

Thu May 20 15:59:14 2010  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/maker/base.rb, test/rss/test_maker_0.9.rb:
	accept any time format in maker. [ruby-core:26923]

Thu May 20 15:54:08 2010  Akinori MUSHA  <knu@iDaemons.org>

	* eval.c (recursive_push): Taint internal hash to prevent
	  unexpected SecurityError; fixes #1864.

Thu May 20 15:39:26 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (io_fwrite): preserve errno.  [ruby-core:27425]

Tue Apr 20 08:04:37 2010  NAKAMURA Usaku  <usa@ruby-lang.org>

	* io.c (rb_io_s_read): close the IO if an exception is raised on
	  seeking. [ruby-core:27429]

Mon Apr 19 22:43:28 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	 * ruby.h (RB_GC_GUARD_PTR): workaround for gcc optimization.
	   [ruby-core:27402]

Tue Apr 20 06:40:53 2010  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* lib/uri/generic.rb (URI::Generic::eql): Check the class of the
	  compared object. Based on a patch by Peter McLain [ruby-core:27019]

Fri Apr  2 03:27:22 2010  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/net/http.rb (HTTPGenericRequest#send_request_with_body_stream):
	  increased encoding chunk size for POST request with body_stream
	  (1K -> 16K). patched by Brian Candler. #1284.

	* test/net/http/test_post_io.rb: added for the patch. It's good if a
	  patch comes with a test.

Thu Apr  1 05:32:17 2010  NAKAMURA Usaku  <usa@ruby-lang.org>

	* string.c (rb_str_inspect): wrong result of UTF-8 inspect because of
	  the mistake of calculation.  reported by eban via IRC.

Sun Jan 10 19:00:31 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/webrick/accesslog.rb : Escape needed.

	* lib/webrick/httpstatus.rb : ditto.

	* lib/webrick/httprequest.rb : ditto.

	* lib/webrick/httputils.rb : ditto.

Thu Dec 24 18:04:27 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: default ac_cv_prog_CC to CC.

Thu Dec 24 17:56:32 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb: MINIRUBY is given via make-flag.

Thu Dec 24 17:56:32 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (EXTMK_ARGS): needs MINIRUBY for cross-compile.
	  [ruby-core:20131]

Thu Dec 24 17:56:32 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* common.mk (EXTMK_ARGS): shouldn't use ``\"'' because cmd.exe eat
	  ''\'' in such quotes.

Thu Dec 24 17:56:32 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (EXTMK_ARGS): needs MINIRUBY for cross-compile.
	  [ruby-core:20131]

Thu Dec 24 17:56:32 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* mkconfig.rb (patchlevel): config.status may not contain
	  PATCHLEVEL even if other version numbers exist.

Thu Dec 24 17:50:35 2009  Yusuke Endoh  <mame@tsg.ne.jp>

	* ext/stringio/stringio.c (strio_init): rewind when reopened.

Thu Dec 24 17:06:13 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (run_final): runs finalizers with the object terminated.

	* gc.c (rb_gc_call_finalizer_at_exit): ObjectSpace::finalizers needs
	  to scan whole object space, although deprecated.

Thu Dec 24 17:06:13 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (chain_finalized_object): deletes finalizers to be invoked from
	  finalizer_table.

	* gc.c (rb_gc_call_finalizer_at_exit): warns when could not invoke
	  finalizers.

Mon Dec 21 16:09:09 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/Makefile.sub (LD_SHARED1): typo.

Wed Dec 16 20:17:40 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (CreateChild): allocate temporary buffer and use it
	  instead of directly modify the passed string.  [ruby-dev:39635]

Wed Dec 16 19:49:47 2009  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* instruby.rb (with_destdir): revert. [ruby-dev:39885]

Mon Dec 14 13:28:48 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/test/unit.rb (Test::Unit.run=, Test::Unit.run?): fixed rdoc.
	  [ruby-core:25034]

Mon Dec 14 13:21:32 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/open3.rb (Open3#popen3): fixed and improved rdoc.  [ruby-core:25658]

Mon Dec 14 13:09:01 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (LIBPATHFLAG): use numbered specifier if RPATHFLAG
	  is set.  [ruby-talk:322136]

Mon Dec 14 12:53:56 2009  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* lib/bigdecimal.rb: fix comparison operators [ruby-core:26646]

Mon Dec 14 12:40:10 2009  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* object.c (rb_Float): Allow results of to_f to be NaN
	  [ruby-core:26733]

Mon Dec 14 12:35:21 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (proc_invoke): unbound block created by define_method
	  cannot call super.  [ruby-core:26984]

Mon Dec 14 12:06:39 2009  Akinori MUSHA  <knu@iDaemons.org>

	* ext/digest/digest.c (rb_digest_instance_method_unimpl): Do not
	  call rb_inspect() on an object that does not implement necessary
	  methods; reported by NaHi.

Mon Dec 14 11:47:31 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_method_missing): adjusted format and argument number.

	* eval.c (rb_call): fixed for super in cached method.
	  [ruby-dev:39757]

Mon Dec 14 11:40:35 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (ruby_setenv): get rid of crash in Solaris 8 and 10.
	  [ruby-core:26668]

Mon Dec 14 11:31:58 2009  Takeyuki FUJIOKA  <xibbar@ruby-lang.org>

	* lib/cgi.rb: fix command-line option of
	  non-interactive terminal. [ruby-core:23016]

Mon Dec 14 03:36:20 2009  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* eval.c (method_inspect, method_name, mnew): Bug fix when
	  method created from an alias.
	  Based on a patch by Peter Vanbroekhoven [ruby-core:22040]

Mon Dec 14 02:27:32 2009  Yusuke Endoh  <mame@tsg.ne.jp>

	* hash.c (rb_hash): always return a fixnum value because a return
	  value of rb_hash may be used as a hash value itself and bignums have
	  no unique VALUE.

	* test/ruby/test_hash.rb: add a test for above.

Mon Dec 14 00:42:55 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_inspect): get rid of adding garbage to shor
	  UTF-8 string.  [ruby-dev:39550]

Sun Dec 13 23:54:22 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (marshal_load): should set taintness.  [ruby-dev:39723]

Sun Dec 13 23:54:22 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (struct {dump,load}_arg): manage with dfree, instead
	  of using local variable which may be moved by context switch.
	  [ruby-dev:39425]

Wed Nov 25 17:42:33 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (io_fwrite): adjust stdio file position after direct write on
	  BSDish platforms.   [ruby-core:26300]

Wed Nov 25 17:39:28 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/ostruct/test_ostruct.rb (test_frozen): added assertions.

Wed Nov 25 16:43:24 2009  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/monitor.rb (MonitorMixin.mon_release): ensure the scheduled
	  thread to be alive when a thread is releasing a monitor. #2240

Wed Nov 25 16:28:11 2009  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* lib/rexml/element.rb (text=): false should be converted to string.
	  A patch by Teruo Oshida [ruby-dev:38351]

Wed Nov 25 16:18:37 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_clear_cache_for_undef): clear entries for inherited
	  methods.  [ruby-core:26074]

Tue Nov 24 16:15:18 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/iconv/iconv.c (iconv_create): cannot retry with given block.
	  [ruby-dev:39487]

Tue Nov 24 16:12:33 2009  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (resp_text_code): accepts response codes without
	  text.  backported from trunk.  [ruby-core:24194]

Tue Nov 24 16:09:41 2009  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/ftp.rb (getaddress): rescue exceptions.  [ruby-dev:39451]

Tue Nov 24 15:51:07 2009  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* ext/curses/curses.c: Many functions of module Curses could cause a
	  crash if the ncurses library was not properly initialized.
	  Fix pointed out by Alexander Beisig [ruby-core:22592]
	  Functions fixed: attroff, attron, attrset, bkgd, bkgdset,
	  can_change_color, close_screen, closed, color_content, curs_set,
	  def_prog_mode, delch, deleteln, getmouse, getstr, has_colors,
	  init_color, init_pair, insertln, keyname, mouseinterval, mousemask,
	  pair_content, pair_number, reset_prog_mode, resizeterm, scrl,
	  setscrreg, standend, standout, start_color, timeout, ungetmouse

Fri Nov 20 15:49:59 2009  Tanaka Akira  <akr@fsij.org>

	* lib/resolv.rb (Resolv::DNS.bind_random_port): bind to "::" for IPv6.
	  (Resolv::DNS::ConnectedUDP#initialize): specify is_ipv6 argument of
	  bind_random_port.
	  [ruby-core:25970]

Thu Nov 19 18:03:31 2009  Takeyuki FUJIOKA  <xibbar@ruby-lang.org>

	* lib/cgi.rb (CGI.unescapeHTML): fix for hex values 80-FF,
	  single-byte hex entity encodings from 80-FF are valid HTML.
	  [ruby-core:25702]

Thu Nov 19 15:34:40 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (rb_io_fptr_finalize): free fptr to avoid memory leaks.
	  fixed: #2009   [ruby-core:25173] [ruby-dev:39410]

Thu Nov 19 15:27:17 2009  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* lib/net/http.rb (transport_request): Handle timeout error by
	  closing socket if exception raised. [ruby-core:20976]

Wed Nov 18 14:14:38 2009  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* ext/openssl/ossl_config.c (ossl_config_add_value_m,
	  ossl_config_set_section): Check if frozen (or untainted for $SECURE >=
	  4) [ruby-core:18377]

Wed Nov 18 14:13:14 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* instruby.rb: win32/win32.h exists in srcdir.
	  reported by arton ( http://www.artonx.org/diary/20090919.html#p01 )

Wed Nov 18 14:13:14 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (subtract): if the parameters are same value, should
	  return zero.

Wed Nov 18 14:13:14 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (rb_w32_select): of course, need to initialize rest.

Wed Nov 18 14:13:14 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (rb_w32_select): wait specified time on select.

Wed Nov 18 14:13:14 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (rb_w32_select): on 1.8, we don't need to poll sockets,
	  because our select is never called from multiple threads.

Tue Nov 17 16:22:22 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_thread_start_0, rb_thread_start_1): should call star
	  timer after added new thread to thread list.  [ruby-core:25613]

Tue Nov 17 16:22:22 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_thread_start_timer): start to catch SIGVTALRM together
	  with timer thread.   [ruby-core:25606]

	* eval.c (rb_thread_atfork): stop timer thread.

Tue Nov 17 16:04:02 2009  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* lib/cgi/cookie.rb (value): Keep CGI::Cookie#value in sync with the
	  cookie itself. A patch by Arthur Schreiber [ruby-core:17634]

Tue Nov 17 15:49:00 2009  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* lib/irb/ext/multi-irb.rb: Fix arguments handling for shell commands
	  in irb; a patch by Yusuke Endoh [ruby-dev:35075]

Tue Nov 17 15:32:27 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_binmode): check if closed regardless platforms.
	  [ruby-core:25363]

Tue Nov 17 15:31:09 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* numeric.c (round): added declaration.  [ruby-dev:39222]

Mon Nov 16 19:58:02 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (gc_sweep): makes new room if object space is full of
	  finalized objects and has no free objects.  [ruby-dev:39201]

Mon Nov 16 19:45:27 2009  Tanaka Akira  <akr@fsij.org>

	* util.c: suppress strict-aliasing warning with gcc-4.4.0 -O2 to fix
	  infinite loop by ruby -e "1.402e-45" .

Mon Nov 16 19:28:23 2009  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c (BigDecimal_to_i): revert a part of
	  r23645, which was not a bug fix. [ruby-dev:39474]

Fri Sep 11 11:56:53 2009  Akinori MUSHA  <knu@iDaemons.org>

	* class.c (rb_singleton_class_clone): Qnil must be used for a null
	  class reference when we use NIL_P() to check class reference
	  validity.  The bug was exposed by the spec test of Sequel.

	* eval.c (ruby_init): Use NEW_CREF().

Thu Sep 10 10:53:03 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* io.c (rb_sysopen): workaround for MSVCRT's bug.
	  [ruby-core:24838]

Mon Sep  7 19:52:44 2009  Tanaka Akira  <akr@fsij.org>

	* eval.c (rb_thread_schedule): need select for WAIT_SELECT, even if
	  already timeout.  [ruby-dev:38971]
	  (WAIT_DONE): defined for mark threads which can be runnable.

Mon Sep  7 19:52:44 2009  Tanaka Akira  <akr@fsij.org>

	* eval.c (rb_thread_schedule): refine previous change.

Mon Sep  7 19:52:44 2009  Tanaka Akira  <akr@fsij.org>

	* eval.c (rb_thread_schedule): fix condition for making thread
	  runnable.  [ruby-core:23515]

Sun Sep  6 19:47:10 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_exc_raise, rb_exc_fatal): require exception object.
	  [ruby-core:24767]

Sun Sep  6 01:34:03 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (rb_w32_connect): return value was broken when some
	  error occurred.
	  [ruby-core:24234]

Fri Sep  4 10:03:22 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (argf_eof): go to the next file if called after ARGF.close
	  or ARGF.skip.  a patch from Mike Kasick at [ruby-core:24561].

Sun Aug  9 17:43:44 2009  Keiju Ishitsuka  <keiju@ruby-lang.org>

	* lib/irb.rb, lib/irb/init.rb, lib/irb/ext/save-history.rb: add
	  IRB::irb_at_exit. no use finalizer saving history. [ruby-dev-38563]

Wed Aug  5 15:29:54 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* io.c (rb_io_flush): fsync() after buffer is flushed on win32.
	  backported from trunk.  [ruby-core:20043]


Tue Aug  4 11:00:30 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* re.h (RMATCH_REGS): added for compatibility.

Mon Aug  3 14:46:53 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/complex.rb (Numeric#arg): should return NaN for NaN.
	  [ruby-core:24116]

Thu Jul 30 09:27:44 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (big_lshift, big_rshift): return Bignum always withou
	  normalization.  [ruby-dev:38680]

Wed Jul 29 11:19:47 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (argf_close): always call #close method.  [ruby-core:23853]

	* io.c (argf_skip): should close only when current_file is available.

Sat Jul 25 21:26:18 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* enum.c (first_i): Enumerator#first should consume only what is
	  needed.   a patch from Marc-Andre Lafortune.  [ruby-core:23661]

	* enum.c (take_i): ditto.

	* enum.c (enum_first): call to_int once for an argument.  a patch
	  from Marc-Andre Lafortune.

Fri Jul 24 17:19:40 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/cgi.rb (HTTP_STATUS): typo fixed.   [ruby-dev:38538]

Wed Jul 22 23:39:34 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/rexml/text.rb (REXML::Text.normalize): call to_s for input.
	  [ruby-talk:337069]

Tue Jul 21 18:21:47 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (SRC_EXT): should be flat.
	  http://twitter.com/_tad_/status/1825862632

Sat Jul 18 00:44:43 2009  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* gc.c (rb_gc_call_finalizer_at_exit): finalizer_table can be NULL.
	  [ruby-core:24395]

Thu Jul 16 09:35:06 2009  Akinori MUSHA  <knu@iDaemons.org>

	* lib/delegate.rb (Delegator#method_missing)
	  (DelegateClass()#method_missing): Properly pass a given block
	  through. [ruby-dev:38390]

Wed Jul 15 11:40:34 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_file_join): recursive array has no meaning as path
	  name.  [ruby-core:23329]

Tue Jul 14 19:57:28 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (get_ts): use readtime clock.  [ruby-dev:38354]

	* eval.c (rb_thread_stop_timer): clear thread_init while locking.

Tue Jul 14 19:57:28 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_thread_start_timer): guard condition was inverted.
	  [ruby-dev:38319]

Tue Jul 14 19:57:28 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (safe_mutex_lock): pthread_cleanup_push() must not be
	  inside parens.

Mon Jul 13 01:36:54 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* time.c (time_timeval): rounds subsecond toward zero.

Mon Jul 13 01:36:54 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* time.c (time_timeval): check out-of-range.  [ruby-core:23282]
	  [Bug #1396]

Thu Jul  9 17:58:03 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (proc_invoke): shares dmethod scope local variables.
	  a patch from coderrr at [ruby-core:23050]

	* gc.c (obj_free): do not free cloned scope local variables.

Wed Jul  8 19:28:03 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_thread_remove): stops timer thread unless other
	  threads exist.  [ruby-core:18444]

Mon Jul  6 16:01:38 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_eval): checks for interrupt, stack and finalizers too.
	  [ruby-dev:38208], [Bug #1329]

	* eval.c (eval): replaces the message if frozen.

Sun Jul  5 03:50:52 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/test/unit.rb: use Kernel.exit to get rid of using
	  IRB::ExtendCommandBundle#exit.  a patch from Dmitry Vazhov by
	  [ruby-core:22986].

Fri Jul  3 09:05:38 2009  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb (open_server_inaddr_any): fixed multiple network
	  families problem. a patch from Charl Matthee at [ruby-core:21033].

Wed Jul  1 15:46:30 2009  Tanaka Akira  <akr@fsij.org>

	* lib/pathname.rb (Pathname#sub): set $~ in block.binding.
	  [ruby-dev:38173]

Mon Jun 29 13:18:42 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/fileutils.rb (FileUtils#fu_get_gid): stringify group
	  argument before making regexp match.  [ruby-dev:38155]

Fri Jun 12 16:36:44 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c (VpToString): fixed a bug introduced
	  in r23613.  [ruby-talk:338957]

Mon Jun  8 10:58:41 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* eval.c (rb_thread_schedule): mswin32 doesn't have F_GETFD, so check
	  with another method.

Mon Jun  8 08:15:36 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c (VpAlloc): avoid ALLOCA_N() to avoid
	  segmentation fault caused by (insanely) long decimal values.
	  backported from 1.9. CVE-2009-1904
 
	* ext/bigdecimal/bigdecimal.c (BigDecimal_dump, BigDecimal_to_i,
	  BigDecimal_to_f, BigDecimal_to_s, BigDecimal_split,
	  BigDecimal_inspect): ditto.

Mon Jun  8 08:15:36 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c (BigDecimal_to_f): returns Inf if
	  exp is bigger than DBL_MANT_DIG.

Wed Jun  3 21:16:30 2009  Tanaka Akira  <akr@fsij.org>

	* file.c: include fcntl.h for O_RDONLY on Solaris.

Wed Jun  3 21:09:56 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* util.c (rv_strdup): macro to duplicate nul-terminated string.
	  [ruby-core:22852]

	* util.c (ruby_dtoa): allocates one more byte to get rid of buffer
	  overrun.  a patch from Charlie Savage at [ruby-core:22604].

Wed Jun  3 21:09:56 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* util.c (ruby_dtoa): allocates one more byte to get rid of buffer
	  overrun.  a patch from Charlie Savage at [ruby-core:22604].

Wed Jun  3 21:05:44 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c (gfDebug): uncommented out.
	  [ruby-core:22600]

Wed Jun  3 20:54:23 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_eval): needs to guard intermediate string objects.
	  based on a patch from Brent Roman <brent AT mbari.org> a
	  [ruby-core:22584].

Tue May 26 21:24:01 2009  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* Makefile.in (update-rubyspec, test-rubyspec): Catch up to
	  rubyspec merge.  A patch by Brian Ford at [ruby-core:21032]

Tue May 26 21:21:49 2009  Akinori MUSHA  <knu@iDaemons.org>

	* lib/soap/mimemessage.rb (MIMEMessage#to_s): Fix a fatal
	  method name typo. [Bug #1173]

Tue May 26 21:16:55 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_file_s_extname): fix for spaces before extention.
	  [ruby-dev:38044]

Tue May 26 21:09:21 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (_CrtDbgReportW): prevent from false positive
	  assertions in msvcrtd.  [ruby-core:22116]

Tue May 26 21:02:13 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/ostruct.rb (OpenStruct#new_ostruct_member): checks if frozen.
	  [ruby-talk:328195], [ruby-core:22142]

Tue May 26 21:00:08 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/ostruct.rb (OpenStruct#inspect): fixed the recursion check.
	  Patch by Kornelius Kalnbach.  [ruby-core:20992].

	* test/ostruct/test_ostruct.rb: test for inspect.
	  Patch by Kornelius Kalnbach.  [ruby-core:20992].

Tue May 26 20:50:32 2009  Tanaka Akira  <akr@fsij.org>

	* eval.c (rb_thread_schedule): handle EBADF of select as well.
	  [ruby-core:21264]

Wed Apr  8 18:59:52 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (subtruct): check tv_sec.

Thu Apr  2 16:06:17 2009  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* test/rss/test_atom.rb (RSS::TestAtomCore::assert_atom_content_inline_other_base64_to_s):
	  ditto. [ruby-dev:38248]

Thu Apr  2 15:43:46 2009  Kouhei Sutou  <kou@cozmixng.org>

	* test/rss/rss-assertions.rb (RSS::Assertions::assert_atom_content_inline_other_text):
	  newlines are valid for Base64 data. [ruby-dev:38248]

Thu Apr  2 14:17:09 2009  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* test/openssl/test_ssl.rb (OpenSSL#test_client_session):
	  Debian's openssl 0.9.8g-13 failed at assert(ssl.session_reused?),
	  when use default SSLContext. [ruby-dev:36167]
	  backported r19268 from trunk. [ruby-core:22843]

Thu Mar 31 18:18:18 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (mkintpath): new function which converts native path
	  to format acceptable in Makefile.

	* lib/mkmf.rb (configuration): leaves PATH_SEPARATOR unchanged.

	* lib/mkmf.rb (configuration): convers srcdir, topdir and hdrdir.
	  a patch by Alexey Borzenkov <snaury AT gmail.com> at
	  [ruby-core:21448].

Fri Mar 27 19:22:02 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (run_final): frees zombies only.  [ruby-dev:38171]

Fri Mar 27 19:22:02 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (rb_gc_call_finalizer_at_exit): leave Thread objects
	  unfinalized.  [ruby-dev:38168]

Fri Mar 27 19:22:02 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (run_final): calls free function.  [ruby-core:22578]

Mon Mar 23 19:17:06 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/thread/thread.c (rb_queue_pop, rb_queue_push): should not lock
	  mutex if got an exception while waiting, and should ensure unlocked
	  after signaled.  [ruby-dev:37545]

Mon Mar 23 18:26:57 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_thread_value): missed to change at r17874.  [ruby-core:17595]

Mon Mar 23 18:26:57 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_thread_join): new API.

	* ext/thread/thread.c (wait_mutex, lock_mutex): wait until the locking
	  thread exits.  [ruby-dev:34856]

Mon Mar 23 17:41:49 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (file_load_ok): checks if regular file, except for the
	  platform disallows to open directories, e.g. dosish.
	  [ruby-dev:38097], [Bug #1221]

Mon Mar  9 20:59:24 2009  Shugo Maeda  <shugo@ruby-lang.org>

	* ext/openssl/ossl_ocsp.c (ossl_ocspbres_verify): OCSP_basic_verify
	  returns positive value on success, not non-zero.  [ruby-core:21762]
	  backported r22440 from trunk.

Mon Mar  9 10:02:15 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* re.c (match_check): check if MatchData is initialized.
	  [ruby-core:18749]

Mon Mar  9 09:56:34 2009  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/rexml/rexml.rb: incremented Ruby::VERSION.  Thanks, Jeremy
	  Kemper.  [ruby-core:20113]

Mon Mar  9 09:52:53 2009  Tanaka Akira  <akr@fsij.org>

	* io.c (io_getpartial): fflush after read for updating pos in FILE.
	  not portable, I guess.  [ruby-core:21561]

Mon Mar  9 09:04:39 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (define_final): cannot define finalizer for immediate
	  values.  [ruby-core:21500]

	* gc.c (define_final): freezes or hides internal values.

Mon Mar  9 08:54:47 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (IS_BEG): EXPR_CLASS should be treated like EXPR_BEG.
	  [ruby-core:21453]

Wed Feb 25 15:15:52 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* node.h (rb_thread_raised_clear): should not clear flags other than
	  raised flags.  a patch by Tomoyuki Chikanaga <chikanag AT
	  nippon-control-system.co.jp> at [ruby-dev:37794].  [ruby-dev:37776]

Wed Feb 25 15:05:48 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/socket/extconf.rb (gai_strerror): checks if available and if
	  returns const pointer.

	* ext/socket/getaddrinfo.c (gai_strerror): defines only if non
	  available.  [ruby-core:21328]

Wed Feb 25 14:57:18 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (open_dir_handle): extracted from rb_w32_opendir.

	* win32/win32.c (winnt_stat): gets rid of strange behavior of
	  GetFileAttributes().  [ruby-core:21269]

Tue Feb 24 02:44:39 2009  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/erb.rb (PercentScanner): remove PercentScanner. fixed % after
	  %> bug. [ruby-dev:37751] [Bug #997] 

	* test/erb/test_erb.rb: ditto

Tue Feb 24 02:35:29 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (rb_hash_s_create): set nil as the value if assoc length
	  is not enough.  [ruby-core:21249]

Sun Feb 22 22:08:45 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (stack_extend): streamlined rb_thread_restore_context()
	  to ensure O(1) time.  based on a patch by Brent Roman <brent AT
	  mbari.org>.

Sun Feb 22 22:03:40 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (cc_mark): frees the continuation's stack if its thread
	  is dead to avoid recursive gc that segfaults.  [ruby-core:13889]
	  a patch by Brent Roman <brent AT mbari.org>.

	* eval.c (rb_cont_check): checks for valid continuation instance.

	* eval.c (rb_callcc): assigns th->thread before scope_dup() to
	  avoid segfaults if this scope_dup() triggers a gc pass.
	  a patch by Brent Roman <brent AT mbari.org>.

Sun Feb 22 21:43:34 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* numeric.c (ruby_float_step): extracted from num_step().

	* range.c (range_step): uses ruby_float_step() for float range.
	  [ruby-dev:37691]

Sun Feb 22 00:49:36 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb (extmake): does not use both of makefile.rb and
	  extconf.rb at the same time.

	* lib/mkmf.rb (DLLIB): depends on Makefile.  [ruby-core:21096]

Sun Feb 22 00:19:05 2009  Tanaka Akira  <akr@fsij.org>

	* eval.c (rb_thread_schedule): Don't change status of threads which
	  don't run next even if select notify readability/writability.
	  [ruby-core:20446]

Fri Feb 20 20:43:13 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb (OptionParser::List#summarize): gives priority
	  to latter switches.  [ruby-dev:36692]

	* lib/optparse.rb (OptionParser#summarize): do not append
	  unnecessary line terminator.

Fri Feb 20 19:35:08 2009  Takeyuki FUJIOKA  <xibbar@ruby-lang.org>

	* lib/cgi/session.rb: ignore session_id options fixed.[Bug #605]

Fri Feb 20 18:06:40 2009  James Edward Gray II  <jeg2@ruby-lang.org>

	Merged 20854 from trunk.

	* lib/xmlrpc/server.rb:  Restricting method inspection to show only
	  non-inherited public methods.  [ruby-core:20603]

	* lib/xmlrpc/server.rb:  Fixing method inspection so it doesn't 
	  trigger XMLRPC::FaultException when used.  [ruby-core:20604]

Fri Feb 20 01:41:08 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/sync.rb (Sync_m#sync_try_lock): wrong variable name fixed.
	  a patch from [ruby-core:20561]

	* lib/sync.rb (Sync_m::Err.Fail): turn off Thread.critical before
	  exit.

Thu Feb 19 18:02:10 2009  Yuki Sonoda (Yugui)  <yugui@yugui.jp>

	* pack.c (pack_pack): fixed odd act of 'm*', 'M*', and 'P*'.
	  just ignores '*' in these cases.
	  [ruby-dev:37289]

Thu Feb 19 17:26:11 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* pack.c (pack_pack): fixed length for odd length string.
	  [ruby-dev:37283]

Thu Feb 19 17:13:13 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_yield_0): Qundef means no argument.  [ruby-Bugs-22525]

Wed Feb 18 22:28:00 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (rb_w32_isatty): check whether fd is valid.

Wed Feb 18 22:24:23 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (waitpid): fix bug of checking child slot.

	* win32/win32.c (FindChildSlotByHandle): new.

Wed Feb 18 22:17:04 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* pack.c (pack_pack): propagate taint status from format string to
	  result string.

Wed Feb 18 22:07:44 2009  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* ext/gdbm/gdbm.c: do not set members of RSTRING(str) directly.
	  [ruby-dev:37182]

	* ext/gdbm/gdbm.c (rb_gdbm_nextkey): fix memory leak.

Tue Feb 17 11:58:58 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (str_independent): no independent string points null_str.
	  [ruby-core:20082]

Mon Feb 16 23:30:24 2009  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tkextlib/blt.rb, ext/tk/lib/tkextlib/blt/vector.rb: 
	  fix NameError bug.

Mon Feb 16 23:08:22 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_s_alloc, rb_str_replace): use null_str as well as
	  rb_string_value so that extension libraries do not segfault.
	  [ruby-core:19971]

	* string.c (rb_str_replace): reduced unnecessary malloc and copy.

Mon Feb 16 22:45:41 2009  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* test/rinda/test_rinda.rb: fixed fails occasionally [ruby-dev:37119].
	  thanks, shinichiro.h.

Mon Feb 16 22:36:37 2009  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb (DRbConn::alive?): fixed NoMethodError problem
	  from NaHi [ruby-dev:37110].

Sun Feb 15 04:21:42 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/net/ftp.rb (Net::FTP#open_socket): SOCKSsocket is obsolete.
	  a patch from Alan Johnson <alan.wayne.johnson at gmail.com> in 
	  [ruby-core:19982].

Fri Feb 13 19:18:42 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/logger.rb (ProgName): fixed for svn, based on a patch from
	  Nobuhiro IMAI at [ruby-dev:37108].

Sun Feb 15 04:17:40 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/webrick/httprequest.rb (WEBrick::HTTPRequest#read_request_line):
	  use non-greedy match for path retrieval to avoid huge recursion
	  for insanely long path.

Fri Feb 13 19:04:54 2009  Keiju Ishitsuka  <keiju@ruby-lang.org>

	* shell/command-processor.rb: undefined method `top_level_test' in
  	  Shell#test. [ruby-list:45634]

Tue Feb 10 20:00:52 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (load_lock): makes circular require deadlock.
	  [ruby-core:19821]

Tue Feb 10 19:40:58 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_feature_p): returns found feature name if loading.
	  [ruby-core:19798]

	* eval.c (search_required): ditto.

Wed Feb 11 23:37:35 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c (VpMidRound): Round method bug
	  pointed by Ryan Platte fixed(Patch to the patch from "NATORI
	  Shin").  [ruby-talk:273360]
	  back ported from 1.9. fix [ruby-core:19791]

Mon Feb  9 17:35:38 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (rb_w32_accept): secure fd before accept because if
	  error causes in securing, cannot restore the state of accepted
	  socket.
	  fixed [ruby-core:19728]

Mon Feb  9 13:42:15 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (ifs_open_socket): should retry without proto_buffer
	  if cannot find the suitable protocol. a patch from Heesob Park.
	  fixed [ruby-core:19713]

Mon Feb  9 13:40:21 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/stringio/stringio.c (strio_ungetc): should allow ungetc at
	  the top of the buffer.  ref #701

Thu Feb  5 09:38:48 2009  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/nkf/nkf-utf8/nkf.c (h_conv): can't guess UTF-8 input in
	  conversion. [ruby-list:45609]

Thu Feb  5 09:03:21 2009  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/rexml/entity.rb (unnormalized): do not call
	  document.record_entity_expansion if document is nil.
	  see <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=502535>.
	  Thanks, Naohisa Goto.  backported from trunk.

	* test/rexml/test_document.rb: ditto.

Thu Feb  5 08:55:24 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (rb_ary_join): do not repeat self in a recursive array.
	  [ruby-dev:37019]

Wed Feb  4 14:26:58 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* dir.c (dir_globs): need taint check.  reported by steve
	  <oksteev at gmail.com>

Tue Feb  3 14:35:26 2009  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* lib/net/pop.rb: check for invalid APOP timestamp. (CVE-2007-1558)
	  [ruby-dev:36631]

	* test/net/pop/test_pop.rb: ditto.

Mon Feb  2 20:03:58 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* time.c (time_mdump, time_mload): preserves GMT status.
	  [ruby-core:19252]

Mon Feb  2 11:34:51 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* variable.c (autoload_delete, autoload_file): should not delete
	  autoload table, since it may be shared with duplicated modules.
	  [ruby-core:19181]

Thu Jan 29 11:54:22 2009  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb (today,now): should produce own instances.
	  [ruby-talk:317020]

Wed Jan 28 22:51:55 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_mod_modfunc): method undefined in included module
	  may not have nd_body.  [ruby-core:18738]

Wed Jan 28 20:53:27 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (marshal_dump): fixed for check_dump_arg.

Tue Jan 27 17:30:11 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (marshal_dump): initializes dump_arg before any funcall.
	  [ruby-dev:36648]

Tue Jan 27 15:17:35 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/socket/socket.c (host_str): numeric address should be unsigned.
	  [ruby-core:18971]

Mon Jan 26 11:12:03 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* lib/tmpdir.rb: setup buffer with nul characters instead of spaces.
	  fixed [ruby-dev:36493]

Sun Jan 25 00:07:23 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/rexml/formatters/pretty.rb (REXML::Formatters::Pretty#wrap):
	  abandon wrapping if the line contains no space.  [ruby-dev:36045]
	  fix: #342

Sun Jan 25 00:02:23 2009  Yuki Sonoda (Yugui)  <yugui@yugui.jp>

	* lib/matrix.rb (Vector#eql?): typo of the method name as "eqn?".
	  (Vector#eqn?): removed. Defined by mistake.
	  Fixes [ruby-dev:36294]. Reported by weda <weda AT
	  issp.u-tokyo.ac.jp> and an anonymous user.

	* test/matrix/test_matrix.rb: added.

	* test/matrix/test_vector.rb: added.

Fri Jan 23 11:49:45 2009  Shugo Maeda  <shugo@ruby-lang.org>

	* NEWS: added an entry for REXML.

	* lib/rexml/document.rb: fixed typo.

Fri Jan 23 11:49:45 2009  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/rexml/document.rb: limit entity expansion.  Thanks, Luka
	  Treiber, Mitja Kolsek, and Michael Koziarski.  backported from
	  trunk r19033, r19317, r19318.

	* lib/rexml/entity.rb: ditto.

	* test/rexml/test_document.rb: ditto.

Thu Jan 22 15:19:39 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (marshal_load): arg.data is no longer a VALUE but a
	  st_table, and freed in load_ensure.  pointed out by pegacorn.
	  [ruby-dev:37008]

Thu Jan 22 15:19:39 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (rb_mark_set): new function to mark keys.

	* marshal.c (struct dump_arg, struct load_arg): added wrappers to mark
	  data entries.  backport from trunk r13527,r13528,r13961,r16533.
	  [ruby-dev:36082]

Wed Jan 21 11:12:55 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (filetime_to_timeval): new function, split from
	  gettimeofday().

	* win32/win32.c (gettimeofday): use above function.

	* win32/win32.c (filetime_to_unixtime): ditto. [ruby-dev:36135]

Wed Jan 21 11:12:55 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (gettimeofday): tv_usec is usec, not msec.
	  [ruby-dev:36094]

Wed Jan 21 11:12:55 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (gettimeofday): calc tv_sec and tv_usec from system
	  time by myself. [ruby-dev:36084]

Wed Jan 21 11:12:55 2009  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (gettimeofday): shouldn't use mktime(2) because it's
	  buggy about handling summer time.
	  reported by Yoshikawa <yoshixool AT gmail.com> at [ruby-dev:36071]

Tue Jan 20 12:23:38 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/scanf.rb (Scanf::FormatSpecifier#initialize): %i should accept
	  single digit decimal.  [ruby-core:18355]

Mon Jan 19 18:25:28 2009  Tanaka Akira  <akr@fsij.org>

	* configure.in (rb_cv_broken_glibc_ia64_erfc): renamed from
	  rb_broken_glibc_ia64_erfc.
	  [ruby-core:18228]

Sat Jan 17 12:16:10 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* random.c (Init_Random): always initialize seed.

Fri Jan 16 10:59:31 2009  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* class.c (clone_method): should copy cbase in cref as well.
	  [ruby-dev:35116]

	* node.h (NEW_CREF): new NEW_ macro.

	* eval.c (PUSH_CREF): use NEW_CREF().

Thu Jan 15 14:34:32 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (STACK_LEVEL_MAX, ruby_stack_length): returns size_t.
	  [ruby-core:18207]
Wed Jan 14 10:39:56 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* stable/ext/socket/socket.c (NI_MAXHOST, NI_MAXSERV): fixed invalid
	  preprocessor directives.  a patch from Peter Bowen at
	  [ruby-core:18211].

Tue Jan 13 04:40:30 2009  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/ftp.rb (login): raise FTPReplyError if passwd or acct
	  is not supplied.  backported from trunk.  fixed [ruby-core:18058].

Mon Jan 12 00:23:37 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (gc_sweep, obj_free, run_final): defer finalizers of IO and
	  Data.  [ruby-dev:35578]

	* gc.c (rb_gc_call_finalizer_at_exit): self-referencing finalizers
	  cannot be invoked.  [ruby-dev:35681]

Sun Jan 11 11:33:27 2009  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/ftp.rb (chdir): handle 5xx errors correctly.
	  backported from trunk.  fixed [ruby-core:18057].

Fri Jan  9 19:25:25 2009  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (disconnect): do not refer SSL::SSLSocket for
	  environments without OpenSSL.  backported from trunk.
	  fixed [ruby-dev:35755].

Thu Jan  8 13:24:23 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (deferred_nodes, compstmt, arg, fixup_nodes, range_op): fix
	  up fixnum range literal in conditional as automagical line number
	  comparison.  [ruby-core:12124], [ruby-dev:35731]

Wed Jan  7 10:09:46 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (timeofday): use monotonic clock.  based on a patch
	  from zimbatm <zimbatm@oree.ch> in [ruby-core:16627].

Tue Jan  6 09:03:35 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (yylex): 8 and 9 in octal integer should cause compile
	  error.  [ruby-dev:35729]

Mon Jan  5 11:14:39 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_thread_schedule): runs deferred finalizers.

	* gc.c (gc_sweep): sets rb_thread_pending to run deferred finalizers.

	* rubysig.h (CHECK_INTS): now checks rb_thread_pending even on
	  platforms where setitimer is not available.  [ruby-core:18045]

Mon Jan  5 11:14:39 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* rubysig.h (CHECK_INTS): gives the chance to perform to deferred
	  finalizers before explicit GC.start or the process termination.
	  [ruby-core:18045]

Sun Jan  4 04:49:01 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (rb_w32_telldir): just returns loc.

	* win32/win32.c (rb_w32_rewinddir): needs to intialize loc.
	  [ruby-core:18041]

Sun Jan  4 04:45:26 2009  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (rb_w32_select): recalc the rest of timeout for each
	  iterations.  [ruby-core:18015]

Fri Jan  2 03:08:47 2009  Kouhei Sutou  <kou@cozmixng.org>

	* test/rss/: use PNG instead of zlib as binary data. [ruby-dev:35666]

Tue Nov 11 01:07:32 2008  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* configure.in: fix SEGV on Mac OS X 10.5.3 with --enable-pthread.
	  a patch from Wataru Kimura in Bug #193 [ruby-core:17333].

Mon Aug 11 09:37:17 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/dl/dl.c (rb_str_to_ptr): should propagate taint to dlptr.

	* ext/dl/dl.c (rb_ary_to_ptr): ditto.

	* ext/dl/sym.c (rb_dlsym_call): should check taint of DLPtrData as
	  well.

Fri Aug  8 10:53:52 2008  Tanaka Akira  <akr@fsij.org>

	* lib/resolv.rb: randomize source port and transaction id.
	  CVE-2008-1447.

	* lib/resolv-replace.rb (UDPSocket#bind): don't resolv host if host is
	  "".

Mon Aug  4 14:49:35 2008  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* lib/net/smtp.rb (Net::SMTP::rcptto): fix a typo. a patch from
	  Masao Takaku <masao at nii.ac.jp>
	  fix [ruby-dev:35489].

Mon Aug  4 14:13:15 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* regex.c (xmalloc, xrealloc, xfree): not to use ruby managed memory.

	* regex.c (DOUBLE_STACK, re_compile_fastmap0, re_adjust_startpos),
	  (re_search, re_match_exec): check if failed to allocate memory.

Mon Aug  4 13:53:42 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (rb_big2str0, bigsqr): made interruptible.  [ruby-Bugs-20622]

Mon Aug  4 13:31:41 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* numeric.c (check_uint, rb_num2uint, rb_fix2uint): fixed wrong check
	  about 64bit positive value.
Mon Aug  4 13:31:41 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* numeric.c (check_uint, rb_num2uint, rb_fix2uint): strict check.
	  fixed [ruby-dev:33683]

Thu Jul 17 21:42:07 2008  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* lib/net/smtp.rb (Net::SMTP::start): revert to avoid RFC2821
	  violation. [ruby-dev:35487]

Thu Jul 17 21:32:49 2008  Tanaka Akira  <akr@fsij.org>

	* string.c (rb_str_format_m): make tmp volatile to avoid possible GC
	  problem.

Thu Jul 17 21:30:55 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb (OptionParser#environment): requires shellwords.
	  [ruby-dev:35466]

Thu Jul 17 02:05:10 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/xmlrpc/client.rb (XMLRPC::Client#do_rpc): requires
	  webrick/cookie.  [ ruby-Bugs-21139 ]

Thu Jul 17 01:38:31 2008  Yusuke Endoh  <mame@tsg.ne.jp>

	* ext/zlib/zlib.c (rb_gzfile_set_mtime): fix typo.  [ruby-core:17713]

Sun Jul 13 00:08:16 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/ipaddr.rb (IPAddr#initialize): get rid of ArgumentError in
	  IPAddr#to_range.  a patch from okkez <okkez000 AT gmail.com> in
	  [ruby-dev:35091].

Sun Jul 13 00:04:38 2008  Tanaka Akira  <akr@fsij.org>

	* configure.in (erfc): erfc of glibc comes with Debian GNU/Linux Etch
	  on IA64 is broken.  erfc(10000.0) aborts.
	  use missing/erf.c instead.
	  http://sources.redhat.com/ml/libc-hacker/2005-08/msg00008.html

Thu Jul 10 18:50:48 2008  Tanaka Akira  <akr@fsij.org>

	* common.mk (SPEC_GIT_BASE): update RubySpec GIT URL.

Thu Jul 10 18:46:28 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_file_s_extname): fix for file name with spaces.
	  [ruby-talk:307404]

Thu Jul 10 18:42:37 2008  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/erb.rb (PercentScanner#scan): fix %% line bug. [ruby-core:17491]

	* test/erb/test_erb.rb (test_percent): ditto.

Thu Jul 10 18:40:22 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/net/ftp.rb (Net::FTP#sendport): use divmod.  [ruby-core:17557]

Thu Jul 10 18:36:53 2008  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* ruby.c: Mac OS X needs origargc times of '\0' in
	  origargv. [ruby-dev:35308]

Thu Jul 10 13:53:08 2008  Tanaka Akira  <akr@fsij.org>

	* include/ruby/ruby.h (POSFIXABLE): use FIXNUM_MAX+1 instead of
	  FIXNUM_MAX to make it possible to convert to double accurately.
	  It assumes FLT_RADIX is 2.
	  fix RubyForge bug #14102.
	  backported from 1.9.

Mon Jul  7 16:21:38 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/net/smtp.rb (Net::SMTP::start): use 'localhost' instead of
	  'localhost.localdomain'.  [ruby-dev:35333]

	* lib/net/smtp.rb (Net::SMTP::SMTP.start): ditto.

Mon Jul  7 15:02:13 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_longjmp): duplicate the thrown exception to set backtrace
	  if it was frozen.  clear all raised flags.

	* eval.c (stack_check): leave clearing flag to rb_longjmp.

	* eval.c (rb_thread_set_raised, rb_thread_reset_raised): use generic
	  flags.

	* eval.c (Init_Proc), gc.c (Init_GC): freeze preallocated special exceptions.

	* gc.c (rb_memerror): use thread raised flag instead of static flag,
	  and raise nomem_error without backtrace if failed to make backtrace.
	  [ruby-dev:34724]

	* gc.c (ruby_xmalloc): increase malloc_increase only if malloc
	  succeeds.  failed malloc size can be huge.  it may increase
	  malloc_limit too big which cause less GC and memory full.
	  (ruby_xrealloc): ditto.

Mon Jul  7 12:23:05 2008  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c: avoid creating Ruby object during
	  GC. thanks to arton <artonx AT yahoo.co.jp>. [ruby-dev:35313]

	* ext/win32ole/tests: add test_win32ole_event.rb, remove
	  testOLEEVENT.rb

	* ext/win32ole/tests/testWIN32OLE.rb(test_convert_bignum):
	  fix test.

Mon Jul  7 12:23:05 2008  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* gc.c: add rb_during_gc(). based on a patch from arton <artonx AT
	  yahoo.co.jp> at [ruby-dev:35313].   

	* intern.h: ditto.

Thu Jul  3 20:13:20 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (w_object, marshal_dump, r_object0, marshal_load): search
	  public methods only.  [ruby-core:17283]

	* object.c (convert_type): ditto.

	* lib/singleton.rb (Singleton#_dump): conversion method should be
	  public.

Wed Jul  2 19:06:43 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/cgi.rb (CGI::QueryExtension.read_multipart): blanks inside
	  double quotes are allowed.  [ruby-list:45140]

Wed Jul  2 19:03:37 2008  Tanaka Akira  <akr@fsij.org>

	* numeric.c (num_coerce): call rb_Float(x) first.  don't depend on
	  evaluation order of function arguments.

Wed Jul  2 18:57:19 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/syslog/syslog.c (syslog_write): syslog operations should be
	  protected from $SAFE level 4.  a patch from Keita Yamaguchi
	  <keita.yamaguchi at gmail.com>.

	* ext/syslog/syslog.c (mSyslog_close): ditto.

	* ext/syslog/syslog.c (mSyslog_set_mask): ditto.

Wed Jul  2 18:26:20 2008  Tanaka Akira  <akr@fsij.org>

	* math.c (domain_check): fix preprocess condition.

Wed Jul  2 18:22:52 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/tmpdir.rb (@@systmpdir): prior LOCAL_APPDATA if possible, and
	  should be clean.  based on a patch from arton <artonx AT
	  yahoo.co.jp> at [ruby-dev:35269]

Wed Jul  2 18:16:19 2008  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c (date2time_str): fix the overflow in
	  some situation. [ruby-bugs-20793]

Tue Jul  1 15:11:14 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (rb_ary_fill): check if beg is too big.

Mon Jun 30 20:35:32 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (str_buf_cat): check for self concatenation.

Sun Jun 29 21:39:54 2008  Tanaka Akira  <akr@fsij.org>

	* eval.c (rb_obj_respond_to): use RTEST to test the result of
	  respond_to? method.

Sun Jun 29 21:20:17 2008  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* array.c (rb_ary_fill): (compatibility) do not raise
	  ArgumentError on negative length.  This behaviour shall change
	  in a future release.

Sun Jun 29 20:08:11 2008  Tanaka Akira  <akr@fsij.org>

	* time.c (time_timeval): fix rounding negative float.

Sun Jun 29 19:19:08 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/inlinetest.rb (InlineTest.in_progname): workaround for frozen
	  $0.  [ruby-dev:35261]

	* lib/test/unit/ui/console/testrunner.rb (TestRunner#finished): ditto.

Sun Jun 29 19:19:08 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ruby.c (set_arg0, ruby_prog_init): freeze $0.  a patch from Keita
	  Yamaguchi <keita.yamaguchi at gmail.com>.

Sun Jun 29 18:33:33 2008  Tanaka Akira  <akr@fsij.org>

	* process.c: include sys/resource.h if HAVE_SYS_RESOURCE_H is defined.
	  pointed by TOYOFUKU Chikanobu.  [ruby-dev:35258]

Sun Jun 29 18:26:01 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* variable.c (rb_f_trace_var): should not be allowed at safe level 4.  
	  a patch from Keita Yamaguchi <keita.yamaguchi at gmail.com>.

	* eval.c (rb_call0): wrong condition to check insecure method.
	  a patch from Keita Yamaguchi <keita.yamaguchi at gmail.com>.

Sun Jun 29 18:22:52 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (rb_ary_fill): not depend on unspecified behavior at integer
	  overflow.  reported by Vincenzo Iozzo <snagg AT openssl.it>.

Sun Jun 29 18:22:06 2008  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c(ole_invoke): fix memory leak.
	  [ruby-bugs-20792]

Sun Jun 29 18:19:11 2008  Akinori MUSHA  <knu@iDaemons.org>

	* eval.c (PUSH_FRAME, PUSH_CLASS): Add volatile to avoid a
	  possible optimization bug on OS X/PPC.  This at least makes
	  build with gcc -O1 and `make test' pass.

Sun Jun 29 17:24:43 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/rdoc/parsers/parse_rb.rb (RDoc#collect_first_comment): skip
	  magic comment.

Sun Jun 29 17:22:09 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c (strio_each, strio_readlines): IO#each and
	  IO#readlines do not affect $_.  [ruby-core:17277]

Sun Jun 29 17:19:59 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c (strio_readline, strio_each)
	  (strio_readlines): set lastline.  [ruby-core:17257]

Sun Jun 29 17:15:49 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/openssl/ossl.h: include winsock.h if USE_WINSOCK2 is not defined.
	  a patch from arton <artonx at yahoo.co.jp> in [ruby-dev:35078]

Sun Jun 29 17:09:48 2008  wanabe  <s.wanabe@gmail.com>

	* util.c (ruby_strtod): ruby_strtod don't allow a trailing
	  decimal point like "7.". [ruby-dev:34835] [ruby-dev:35009]

Sat Jun 28 19:23:40 2008  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* class.c (clone_method): use rb_copy_node_scope.
	  fixed [ruby-list:45102]
	  fixed [ruby-core:17393]

Sat Jun 28 18:49:50 2008  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* class.c: revert to r15855.

Fri Jun 20 18:25:18 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_buf_append): should infect.

Fri Jun 20 16:33:09 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (rb_ary_store, rb_ary_splice): not depend on unspecified
	  behavior at integer overflow.

	* string.c (str_buf_cat): ditto.

Wed Jun 18 22:24:46 2008  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* array.c (ary_new, rb_ary_initialize, rb_ary_store,
	  rb_ary_aplice, rb_ary_times): integer overflows should be
	  checked. based on patches from Drew Yao <ayao at apple.com>
	  fixed CVE-2008-2726

	* string.c (rb_str_buf_append): fixed unsafe use of alloca,
	  which led memory corruption. based on a patch from Drew Yao
	  <ayao at apple.com> fixed CVE-2008-2726

	* sprintf.c (rb_str_format): backported from trunk.

	* intern.h: ditto.

Tue Jun 17 15:09:46 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (file_expand_path): no need to expand root path which has no
	  short file name.  [ruby-dev:35095]

Sun Jun 15 19:27:40 2008  Akinori MUSHA  <knu@iDaemons.org>

	* configure.in: Fix $LOAD_PATH.  Properly expand vendor_ruby
	  directories; submitted by Takahiro Kambe <taca at
	  back-street.net> in [ruby-dev:35099].

Mon Jun  9 17:56:30 2008  Akinori MUSHA  <knu@iDaemons.org>

	* lib/set.rb (Set#delete_if): Call to_a.
	  (SortedSet#delete_if, TC_SortedSet#test_sortedset): Use super to
	  yield elements in sorted order; [ruby-core:17144] by Arthur
	  Schreiber.
	  (SortedSet#each, SortedSet#each, TC_Set#test_each)
	  (TC_SortedSet#test_sortedset): Return self; [ruby-dev:35002] by
	  Arthur Schreiber.

Mon Jun  9 03:28:05 2008  Akinori MUSHA  <knu@iDaemons.org>

	* ext/zlib/zlib.c (rb_deflate_initialize, Init_zlib): Fix up
	  initialize_copy; [ruby-list:45016], [ruby-list:45018].

Mon Jun  9 03:26:03 2008  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* NEWS: Mention new constants.

Mon Jun  9 03:24:18 2008  Tanaka Akira  <akr@fsij.org>

	* hash.c (hash_i): make Hash#hash order insensitive.

Mon Jun  9 03:22:43 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (VENDOR_DIR): use LIBDIR instead of PREFIX as well as
	  SITE_DIR.  a patch from Richard Brown <rbrown AT exherbo.org> in
	  [ruby-core:17129].

Mon Jun  9 03:21:20 2008  Tanaka Akira  <akr@fsij.org>

	* gc.c (os_obj_of): assure to not free the scanning heap.

Mon Jun  9 03:20:12 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* io.c (rb_open_file, rb_io_s_sysopen): fmode should be unsigned int.
	  fixed [ruby-dev:34979]

Fri Jun  6 21:16:55 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/Makefile.sub (COMMON_HEADERS): include ws2tcpip.h.

	* ext/socket/addrinfo.h (addrinfo, getaddrinfo, getnameinfo,
	  freehostent, freeaddrinfo): undef before define because these are
	  macros in some versions of Windows SDK.

	* win32/setup.mak: maybe commit miss.

Fri Jun  6 19:34:22 2008  Akinori MUSHA  <knu@iDaemons.org>

	* mkconfig.rb: hide build path from rbconfig.rb.

	* util.c (ruby_strtod, dtoa): initialize more variables for error
	  handling.

	* io.c (rscheck), marshal.c (w_nbyte, w_bytes, w_unique),
	  (path2class, path2module): constified.

	* pack.c (pack_unpack), process.c (rb_syswait): suppress warnings.

	* suppress warnings on cygwin, mingw and mswin.

Fri Jun  6 19:23:53 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (file_expand_path): fix for non-existent files and SFN of
	  symlinks.  [ruby-talk:303736]

Fri Jun  6 18:25:43 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/iconv: Tests fixed.

Fri Jun  6 17:04:56 2008  Akinori MUSHA  <knu@iDaemons.org>

	* win32/win32.h: include ws2tcpip.h. fixed [ruby-Bugs-20528]

	* lib/time.rb (Time.xmlschema): don't use float.  fix
	  http://rubyforge.org/tracker/index.php?func=detail&group_id=426&atid=1698&aid=20504

	* object.c (rb_obj_alloc): RDoc updated.  a patch from Gaston
	  Ramos <ramos.gaston at gmail.com> in [ruby-core:17073].

	* lib/rdoc.rb: massive spelling correction patch from Evan Farrar
	  <evanfarrar at gmail.com> in [ruby-doc:1382] applied.

	* ext/openssl/ossl_ssl_session.c (ossl_ssl_session_initialize):
	  Add a null check for ssl; submitted by akira yamada
	  in [ruby-dev:34950].

	* ext/openssl/ossl_ssl.c (Init_ossl_ssl): Define OP_NO_TICKET if
	  SSL_OP_NO_TICKET is present; submitted by akira yamada
	  in [ruby-dev:34944].

	* test/openssl/test_ssl.rb (OpenSSL#test_server_session): Add a
	  workaround for the case where OpenSSL is configured with
	  --enable-tlsext; submitted by akira yamada in [ruby-dev:34944].

Fri Jun  6 16:58:23 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/iconv/iconv.c (iconv_iconv): fix for length argument and now
	  allows range.  [ruby-core:17092] [ruby-core:17115]

Wed Jun  4 17:22:30 2008  Akinori MUSHA  <knu@iDaemons.org>

	* NEWS: Fix typos and move misplaced entries.
	  NEWS: Somehow optflags and warnflags were not actually included
	  in this release.

Tue Jun  3 19:33:22 2008  Akinori MUSHA  <knu@iDaemons.org>

	* enumerator.c (enumerator_init_copy): Take care of
	  initialize_copy as well as initialize.

	* test/ruby/test_enumerator.rb: Pull in the test suite for
	  enumerator from trunk.

Tue Jun  3 12:51:57 2008  Akinori MUSHA  <knu@iDaemons.org>

	* enumerator.c (enumerator_allocate, enumerator_ptr): Properly
	  detect if the object is initialized and raise error when
	  appropriate.
	  (enumerator_initialize): Fix a typo in rdoc. [ruby-core:17052]

Tue Jun  3 10:16:40 2008  Akinori MUSHA  <knu@iDaemons.org>

	* lib/erb.rb (ERB::Compiler::TrimScanner#scan_line): Fix a bug
	  where tokens are not yilelded one by one.
	  (ERB::Compiler::TrimScanner#explicit_trim_line): Fix without-
	  strscan problems. [ruby_core:17028].

	* test/erb/test_erb.rb (TestERBCore#_test_01)
	  (TestERBCore#test_02_safe_04): The expected value should come
	  first for assert_equal().
	  (TestERBCoreWOStrScan): Add test class for without-strscan.

Mon Jun  2 19:47:16 2008  Akinori MUSHA  <knu@iDaemons.org>

	* lib/delegate.rb (DelegateClass, Delegator#respond_to?):
	  respond_to? must take optional second argument.  This was a
	  latent bug exposed by a recent internal change of marshal.c to
	  call respond_to? with a second argument; submitted by Jeremy
	  Kemper <jeremy at bitsweat.net> in [ruby-core:17045].

Sat May 31 23:53:35 2008  Akinori MUSHA  <knu@iDaemons.org>

	* .: Release as Ruby 1.8.7.

Sat May 31 23:33:34 2008  Akinori MUSHA  <knu@iDaemons.org>

	* README, README.ja: Add a note about default C flags.

Sat May 31 22:11:15 2008  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* version.c (ruby_description, ruby_copyright): backported from
	  1.9. bug#19002, [ruby-dev:34883]

	* error.c (report_bug): uses ruby_description.

Sat May 31 20:56:04 2008  Akinori MUSHA  <knu@iDaemons.org>

	* array.c (rb_ary_delete_if): should return enumerator if no block
	  is given.  [ruby-dev:34901]

Sat May 31 18:28:17 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* suppress warnings with -Wwrite-string.

Sat May 31 15:58:08 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* Makefile.in, configure.in (warnflags): defaulted to -Wall
	  -Wno-parentheses with gcc.  [ruby-dev:34810]

Fri May 30 05:28:18 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* enum.c (count_i, count_iter_i, count_all_i): add prototypes for VC.

Fri May 30 04:32:07 2008  Akinori MUSHA  <knu@iDaemons.org>

	* enum.c (count_i, count_iter_i): Sync with trunk.
	  enum.c (enum_count, count_all_i, Init_Enumerable),
	  array.c (rb_ary_count): Sync with trunk.  If no argument or
	  block is given, count the number of all elements.

Fri May 30 03:12:18 2008  Akinori MUSHA  <knu@iDaemons.org>

	* ext/openssl/ossl_bn.c (ossl_bn_s_rand, ossl_bn_s_pseudo_rand):
	  Int should be enough here.

Fri May 30 02:35:00 2008  Akinori MUSHA  <knu@iDaemons.org>

	* ext/openssl/ossl_bn.c (ossl_bn_s_rand, ossl_bn_s_pseudo_rand),
	  ext/openssl/ossl_pkey_dh.c (ossl_dh_s_generate)
	  (ossl_dh_initialize),
	  ext/openssl/ossl_pkey_dsa.c (ossl_dsa_s_generate),
	  ext/openssl/ossl_rand.c (ossl_rand_bytes)
	  (ossl_rand_pseudo_bytes, ossl_rand_egd_bytes),
	  ext/openssl/ossl_x509store.c (ossl_x509stctx_set_error): Do not
	  use FIX2INT() without checking the value type.  Use NUM2INT()
	  instead; found by akr in [ruby-dev:34890].

Thu May 29 20:07:45 2008  Akinori MUSHA  <knu@iDaemons.org>

	* configure.in, win32/Makefile.sub, mkconfig.rb, instruby.rb,
	  ruby.c, lib/mkmf.rb, README.EXT, README.EXT.ja: Backport the
	  vendor_ruby directory support.

Thu May 29 17:52:31 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/zlib/extconf.rb: search zlib1, and regard mswin32 later than VC6
	  as WIN32.  [ruby-core:16984]

Wed May 28 17:54:29 2008  Akinori MUSHA  <knu@iDaemons.org>

	* string.c (rb_str_start_with): Remove an unused variable.
	  (rb_str_upto_m): Fix a prototype.

Wed May 28 17:48:28 2008  Akinori MUSHA  <knu@iDaemons.org>

	* range.c (range_step): Fix brokenness when a non-integer numeric
	  value is specified as step. [rubyspec]
	  (range_step): Make use of String#step internally if a string (or
	  string-alike) range is given.

	* string.c (rb_str_upto_m, Init_String): Add an optional second
	  argument to specify if the last value should be included.

Wed May 28 16:53:39 2008  Akinori MUSHA  <knu@iDaemons.org>

	* array.c (rb_ary_slice_bang): Call rb_ary_modify_check() at the
	  beginning. [rubyspec]

Wed May 28 16:12:44 2008  Akinori MUSHA  <knu@iDaemons.org>

	* lib/webrick/httpservlet/cgihandler.rb (WEBrick::HTTPServlet::CGIHandler#do_GET):
	  Set the HTTP status code to 302 if a Location header field is
	  present and the status code is not valid as a client
	  redirection.  cf. RFC 3875 6.2.3, 6.2.4.

Wed May 28 15:18:16 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/singleton.rb (SingletonClassMethods): _load should be public.

Wed May 28 12:52:41 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (w_object, marshal_dump, r_object0, marshal_load): search
	  private methods too.  [ruby-dev:34671]

	* object.c (convert_type): ditto.

Tue May 27 23:26:49 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* error.c (rb_bug): description from rb_bug() should include
	  patchlevel.  [ruby-dev:34826]

Tue May 27 20:19:22 2008  Akinori MUSHA  <knu@iDaemons.org>

	* array.c (rb_ary_slice_bang): Return an empty array instead of
	  nil when pos is valid and len is adjusted from a valid value to
	  zero; caught by RubySpec.

Tue May 27 19:45:20 2008  Akinori MUSHA  <knu@iDaemons.org>

	* numeric.c (flo_divmod): Revert the behavior change; do not
	  suppress an exception when div is NaN or Inf. [ruby-dev:34857]

Tue May 27 19:24:40 2008  Akinori MUSHA  <knu@iDaemons.org>

	* enum.c (enum_to_a): Pass arguments through to #each().
	  (enum_sort): Follow the enum_to_a signature change.
	  (enum_reverse_each): Add #reverse_each().

Tue May 27 18:54:02 2008  Akinori MUSHA  <knu@iDaemons.org>

	* ext/stringio/stringio.c (strio_each_char, Init_stringio): Add
	  StringIO#{each_char,chars}.

Tue May 27 17:59:34 2008  Akinori MUSHA  <knu@iDaemons.org>

	* ext/stringio/stringio.c (strio_each): Return an enumerator if no
	  block is given.
	  (strio_each_byte): Return an enumerator if no block is given,
	  and return self if one is given as the rdoc says.

	* io.c (rb_io_each_byte): Fix rdoc.  IO#each_byte returns self,
	  not nil.

Tue May 27 16:02:58 2008  Akinori MUSHA  <knu@iDaemons.org>

	* eval.c (rb_mod_module_exec, Init_eval): Add
	  Module#{module_exec,class_exec}.

Tue May 27 15:36:37 2008  Akinori MUSHA  <knu@iDaemons.org>

	* io.c (rb_io_each_char, argf_each_char, Init_IO):
	  Add {IO#,ARGF.}{each_char,chars}.

Tue May 27 13:46:52 2008  Akinori MUSHA  <knu@iDaemons.org>

	* ext/stringio/stringio.c (Init_stringio): Define
	  StringIO#{getbyte,readbyte}.

Tue May 27 13:38:51 2008  Akinori MUSHA  <knu@iDaemons.org>

	* io.c (Init_IO): Define {IO#,ARGF.}{getbyte,readbyte}.

Tue May 27 13:26:15 2008  Akinori MUSHA  <knu@iDaemons.org>

	* ext/stringio/stringio.c (Init_stringio): Define #bytes and
	  #lines.

Tue May 27 13:20:35 2008  Akinori MUSHA  <knu@iDaemons.org>

	* io.c: (rb_io_lines, rb_io_bytes, Init_IO): Define
	  IO#{lines,bytes} and ARGF.{lines,bytes}.

Tue May 27 12:13:17 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* file.c (BUFCHECK): wrong condition. [ruby-core:16921]

	* file.c (file_expand_buf): shouldn't use buflen for length of string.

Mon May 26 18:24:48 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (BUFCHECK): no resize if enough room.

	* file.c (file_expand_path): use BUFCHECK.

Mon May 26 16:46:19 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* file.c (ntfs_tail): filename which starts with '.' is valid.

	* file.c (file_expand_path): cygwin symlink support.

Mon May 26 12:16:43 2008  Akinori MUSHA  <knu@iDaemons.org>

	* .: Release as Ruby 1.8.7-preview4.

Mon May 26 12:12:26 2008  Akinori MUSHA  <knu@iDaemons.org>

	* marshal.c (dump_ensure, load_ensure): should return values.

	* eval.c (yield_under, yield_under_i, yield_args_under_i)
	  (specific_eval, rb_obj_instance_exec, Init_eval): Implement
	  Object#instance_exec(), a 1.9 feature.

Mon May 26 11:53:21 2008  Akinori MUSHA  <knu@iDaemons.org>

	* eval.c (rb_yield_0, proc_invoke, proc_arity): allow passing a
	  block to a Proc.  [ruby-dev:23533]; by nobu; backported from
	  1.9.  This implementation in current shape is known to be
	  buggy/broken, especially with nested block invocation.  Take
	  this as an experimental feature.

	* parse.y (block_par, block_var): ditto.

Mon May 26 08:00:52 2008  Akinori MUSHA  <knu@iDaemons.org>

	* marshal.c (r_object0, Init_marshal): Fix the garbled s_call
	  definition; fixes [ruby-dev:34843].

Mon May 26 03:16:20 2008  Akinori MUSHA  <knu@iDaemons.org>

	* hash.c (rb_hash_default): Fix rdoc.
	  (rb_hash_each, env_each_value, env_each_pair): Return an
	  enumerator if no block is given.
	  (rb_hash_update): Update rdoc.
	  (envix): Conditionalize the definition itself.
	  (rb_f_getenv, env_fetch, env_keys, env_values, env_values_at)
	  (env_select, env_inspect, env_to_a, env_empty_p, env_has_key)
	  (env_has_value, env_index, env_indexes, env_to_hash, env_shift)
	  (env_update): Require secure level 4.
	  (env_each_value, env_each_i): Delay variable initialization.
	  (env_each_key, env_each_value, env_reject_bang)
	  (env_clear, env_replace): Omit duplicated secure level check.
	  (env_has_value): Do to_str conversion.

Sun May 25 19:48:12 2008  Akinori MUSHA  <knu@iDaemons.org>

	* hash.c (env_delete_if): Return an enumerator if no block is
	  given.
	  (env_each_key): Delay a variable initialization after
	  RETURN_ENUMERATOR().

Sun May 25 05:07:19 2008  Akinori MUSHA  <knu@iDaemons.org>

	* array.c (rb_ary_slice_bang): Be consistent with Array#slice()
	  and String#slice!().  Just return nil when a negative length or
	  out of boundary index is given instead of raising an exception
	  via internal functions.
	  (rb_ary_slice_bang): should not use rb_ary_subseq() which shares
	  internal pointer.  splice modifies the receiver right after
	  subseq.  [ruby-dev:34005]
	  (rb_ary_slice_bang): should adjust length before making
	  sub-array.

	* enumerator.c (Init_Enumerator): Override
	  Enumerable::Enumerator#each_with_index with #with_index.

Sun May 25 03:13:09 2008  Akinori MUSHA  <knu@iDaemons.org>

	* eval.c (Init_Thread): Initialize recursive_key.

Sun May 25 02:45:49 2008  Akinori MUSHA  <knu@iDaemons.org>

	* error.c (syserr_eqq): Use en.

Sat May 24 22:32:49 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* object.c (rb_cstr_to_dbl): should clear errno before calling
	  strtod(3).  [ruby-dev:34834]

Sat May 24 22:27:44 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* marshal.c (marshal_load): should initialize arg.data used for
	  reentrant check.  [ruby-dev:34837]

Sat May 24 00:34:59 2008  Tanaka Akira  <akr@fsij.org>

	* lib/rational.rb (Rational#to_i): fix rdoc.  Rational(-7,4).to_i
	  should be -1.

Fri May 23 20:22:44 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* marshal.c (reentrant_check): check reentrance via callcc.
	  [ruby-dev:34802]

Fri May 23 16:46:28 2008  Akinori MUSHA  <knu@iDaemons.org>

	* enumerator.c (proc_call): Remove an unused static function.

Fri May 23 13:46:09 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (cflags): commit miss.

Fri May 23 09:52:21 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (MINIRUBY), common.mk (RUBYOPT): add purelib.rb.
	  [ruby-core:16642]

	* ext/extmk.rb: load purelib.rb only when not cross compiling.

Fri May 23 08:47:02 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* error.c (syserr_eqq): === should be able to handle delegated
	  objects as well.

Fri May 23 04:22:19 2008  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tcltklib.c, ext/tk/tkutil/tkutil.c: fix memory leak.

	* ext/tk/lib/tk.rb: avoid trouble when finalize TclTkIp.

	* ext/tk/lib/tk.rb, ext/tk/lib/tk/*: help to fix troubles when
	  use Ttk widgets on old Tk scripts.

	* ext/tk/sample/*: update and add demo scripts. some of them are
	  introduction about new features of Tcl/Tk8.5.

Fri May 23 03:48:10 2008  Akinori MUSHA  <knu@iDaemons.org>

	* class.c (clone_method): Just use ruby_cref as cref.

Fri May 23 01:03:23 2008  Akinori MUSHA  <knu@iDaemons.org>

	* class.c (rb_singleton_class_clone): Pass Qnil, not 0.

Fri May 23 00:51:48 2008  Akinori MUSHA  <knu@iDaemons.org>

	* class.c (clone_method): Totally revamp the previous fix which
	  was incorrect.
	  (rb_mod_init_copy): Ditto.
	  (singleton_class_clone_int): Ditto.

Fri May 23 00:48:10 2008  Akinori MUSHA  <knu@iDaemons.org>

	* eval.c (rb_copy_node_scope), node.h: Rename from copy_node_scope
	  and export.

Thu May 22 21:24:15 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (top_local_setup): fixed memory leak bug based on a
	  patch from Roger Pack <rogerpack2005 at gmail.com> in
	  [ruby-core:16610].

Thu May 22 14:20:54 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (flatten): check if reentered.  [ruby-dev:34798]

Thu May 22 08:28:49 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (flatten): free memo hash table before raising exception.
	  [ruby-dev:34789]

Thu May 22 06:30:10 2008  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* array.c (flatten): fix memory leak.

Thu May 22 05:45:30 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* proc.c (proc_dup): should copy safe_level from src proc
	  properly.  a patch from Keita Yamaguchi
	  <keita.yamaguchi at gmail.com>

Wed May 21 23:31:44 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_get_method_body, rb_alias, rb_eval): should not cache
	  uninitialized value, since search_method doesn't set origin if the
	  method wasn't found.

	* eval.c (search_method, remove_method, error_print, rb_alias)
	  (rb_eval, rb_rescue2, search_required, Init_eval, rb_thread_create),
	  gc.c (rb_source_filename, Init_stack), io.c (rb_io_getline),
	  parse.y (rb_id2name, rb_parser_free): suppress warnings.

Wed May 21 12:34:51 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (rb_hash_delete): rdoc fix based on a patch from Gaston Ramos
	  <ramos.gaston AT gmail.com>.  [ruby-core:16825]

Tue May 20 13:15:46 2008  Akinori MUSHA  <knu@iDaemons.org>

	* file.c (lchmod_internal): Remove a compiler warning.

Mon May 19 18:22:35 2008  Akinori MUSHA  <knu@iDaemons.org>

	* ext/openssl/ossl_pkcs5.c (ossl_pkcs5_pbkdf2_hmac): Fix the type
	  of md; pointed out by Takahiro Kambe <taca at back-street.net>
	  in [ruby-dev:34748].

Mon May 19 14:20:13 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* sprintf.c (rb_f_sprintf): fixed SEGV on win32 with "% 0e" % 1.0/0.0.

Mon May 19 13:29:58 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* process.c (rb_f_system): set last_status when status == -1 because
	  there is no path to set it on win32. this patch is derived from
	  [ruby-core:16787], submitted by Luis Lavena <luislavena at gmail.com>

Mon May 19 13:01:05 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk ({MSPEC,RUBYSPEC}_GIT_URL): moved from Makefine.in.

	* {win32,bcc32}/Makefile.sub (update-rubyspec): added.

Mon May 19 11:53:45 2008  Akinori MUSHA  <knu@iDaemons.org>

	* ext/openssl/openssl_missing.c (HMAC_CTX_copy): adopted
	  prototype change in openssl bundled with newer OpenBSD.
	  a patch from Takahiro Kambe <taca at back-street.net> in
	  [ruby-dev:34691].

Mon May 19 06:36:37 2008  Akinori MUSHA  <knu@iDaemons.org>

	* .: Release as Ruby 1.8.7-preview3.

Sun May 18 22:26:51 2008  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httpservlet/filehandler.rb: should normalize path
	  name in path_info to prevent script disclosure vulnerability on
	  DOSISH filesystems. (fix: CVE-2008-1891)
	  Note: NTFS/FAT filesystem should not be published by the platforms
	  other than Windows. Pathname interpretation (including short
	  filename) is less than perfect.

	* lib/webrick/httpservlet/abstract.rb
	  (WEBrick::HTTPServlet::AbstracServlet#redirect_to_directory_uri):
	  should escape the value of Location: header.

	* lib/webrick/httpservlet/cgi_runner.rb: accept interpreter
	  command line arguments.

Sat May 17 23:53:57 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (file_expand_path): fix for short file name on Cygwin.

Sat May 17 11:29:11 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_file_s_extname): first dot is not an extension name.

Sat May 17 10:18:44 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* re.c (rb_reg_search): need to free allocated buffer in re_register.

Fri May 16 17:01:44 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/Makefile.sub (test-rubyspec): added.

Fri May 16 16:22:40 2008  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tcltklib.c: sometimes freeze when receive Interrupt signal.

Fri May 16 14:54:56 2008  Tanaka Akira  <akr@fsij.org>

	* Makefile.in (update-rubyspec): move rubyspec to srcdir. 
	  (test-rubyspec): ditto.

Fri May 16 14:25:22 2008  Tanaka Akira  <akr@fsij.org>

	* Makefile.in (test-rubyspec): use RUNRUBY.  suggested by nobu.

Fri May 16 13:01:43 2008  Tanaka Akira  <akr@fsij.org>

	* Makefile.in (update-rubyspec): new target to download rubyspec.
	  (test-rubyspec): new target to run rubyspec.  this doesn't work
	  before install.

Fri May 16 08:15:52 2008  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: fix memory (object) leak bug.

	* ext/tk/sample/demos-jp/aniwave.rb, ext/tk/sample/demos-en/aniwave.rb:
	  bug fix.

Thu May 15 17:00:22 2008  Akinori MUSHA  <knu@iDaemons.org>

	* string.c (Init_String): Define #bytesize as an alias for #size
	  for compatibility with 1.9.

Thu May 15 15:33:59 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (file_expand_path): support for alternative data stream
	  and ignored trailing garbages of NTFS.

	* file.c (rb_file_s_basename): ditto.

	* file.c (rb_file_s_extname): ditto.

Wed May 14 19:24:59 2008  Akinori MUSHA  <knu@iDaemons.org>

	* array.c (rb_ary_count): Override Enumerable#count for better
	  performance.
	  (rb_ary_nitems): Undo the backport.  Use #count {} instead.

	* enumerator.c (enumerator_iter_i): Remove an unused function.
	  (enumerator_with_index, enumerator_each): Remove unused
	  variables.

Wed May 14 17:15:11 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/tk/tkutil/extronf.rb: check stdndup() because it's not standard
	  function of C.

	* ext/tk/tkutil/tkutil.c (cbsubst_table_setup): use malloc() and
	  strncpy() instead of strndup() if not available.

Wed May 14 09:52:02 2008  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tkutil/tkutil.c: improve handling callback-subst-keys. 
	  Now, support longnam-keys (e.g. '%CTT' on tkdnd-2.0; however, still
	  not support tkdnd-2.0 on tkextlib), and symbols of parameters (e.g. 
	  :widget=>'%W', :keycode=>'%k', '%x'=>:x, '%X'=>:root_x, and so on; 
	  those are attributes of event object). It means that Ruby/Tk accepts
	  not only "widget.bind(ev, '%W', '%k', ...){|w, k, ...| ... }", but 
	  also "widget.bind(ev, :widget, :keycode, ...){|w, k, ...| ... }". 
	  It is potentially incompatible, when user passes symbols to the
	  arguments of the callback block (the block receives the symbols as
	  strings). I think that is very rare case (probably, used by Ruby/Tk
	  experts only). When causes such trouble, please give strings instead
	  of such symbol parameters (e.g. call Symbol#to_s method).

	* ext/tk/lib/tk/event.rb, ext/tk/lib/tk/validation.rb, 
	  ext/tk/lib/tkextlib/blt/treeview.rb, 
	  ext/tk/lib/tkextlib/winico/winico.rb: ditto.

	* ext/tk/tkutil/tkutil.c: strings are available on subst_tables on 
	  TkUtil::CallbackSubst class (it is useful on Ruby 1.9). 

	* ext/tk/lib/tk/spinbox.rb, ext/tk/lib/tkextlib/iwidgets/hierarchy.rb, 
	  ext/tk/lib/tkextlib/iwidgets/spinner.rb, 
	  ext/tk/lib/tkextlib/iwidgets/entryfield.rb, 
	  ext/tk/lib/tkextlib/iwidgets/calendar.rb, 
	  ext/tk/lib/tkextlib/blt/dragdrop.rb, 
	  ext/tk/lib/tkextlib/tkDND/tkdnd.rb, 
	  ext/tk/lib/tkextlib/treectrl/tktreectrl.rb, 
	  ext/tk/lib/tkextlib/tktable/tktable.rb: disable code piece became 
	  unnecessary by reason of the changes of ext/tk/tkutil/tkutil.c.

Tue May 13 15:10:50 2008  Akinori MUSHA  <knu@iDaemons.org>

	* enumerator.c: Update rdoc.
	  (enumerator_initialize): Discourage the use.
	  (enum_each_slice, enum_each_cons, enumerator_each)
	  (enumerator_with_index): Add a note about a call without a block.

	* NEWS: Intentionally omit enum_slice and enum_cons, which are
	  removed in 1.9.

Tue May 13 07:56:36 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_cat): fixed buffer overrun reported by
	  Christopher Thompson <cthompson at nexopia.com> in [ruby-core:16746]

Mon May 12 13:57:19 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (is_defined): add NODE_OP_ASGN_{OR,AND}.  "defined?(a||=1)"
	  should not operate assignment.  [ruby-dev:34645]

Mon May 12 12:59:23 2008  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/wm.rb: Wm#overrideredirect overwrites arguemnt to
	  an invalid value.

	* ext/tk/sample/ttk_wrapper.rb: support "if __FILE__ == $0" idiom.

Mon May 12 12:36:55 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (rb_w32_select): backport from trunk.
	  [ruby-talk:300743]

Mon May 12 12:33:21 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (RUBYLIB, RUBYOPT): clear.

Mon May 12 10:41:10 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/delegate.rb (SimpleDelegator::dup): removed needless argument.
	  [ruby-list:44910]

	* lib/delegate.rb (clone, dup): keep relationship with the target
	  object.

Sun May 11 23:19:39 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enum.c (all_iter_i, any_iter_i): reduced duplicated code.

Sun May 11 17:57:36 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (MINIRUBY): should not include extension library path.

Sun May 11 10:36:10 2008  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* eval.c (method_name, method_owner): New methods; backported
	  from 1.9. (UnboundMethod#name, UnboundMethod#owner)

Sun May 11 02:48:13 2008    <nagai@orca16.orcabay.ddo.jp>

	* ext/tk/lib/tk/pack.rb, ext/tk/lib/tk/grid.rb: fail to do pack/grid 
	  without options.

	* ext/tk/lib/tk.rb: add TkWindow#grid_anchor, grid_column, grid_row.

Sat May 10 18:19:16 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_each_line): RDoc updated.  [ruby-dev:34586]

Sat May 10 13:17:56 2008  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/pack.rb, ext/tk/lib/tk/grid.rb: increase supported
	  parameter patterns of configure method.

Sat May 10 09:16:13 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* util.c (ruby_strtod): backported from 1.9.  a patch from Satoshi
	  Nakagawa <psychs at limechat.net> in [ruby-dev:34625]. 
	  fixed: [ruby-dev:34623]

Fri May  9 23:33:25 2008  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/wm.rb: methods of Tk::Wm_for_General module cannot
	  pass the given block to methods of Tk::Wm module.

	* ext/tk/lib/tk/grid.rb: lack of module-method definitions.

	* ext/tk/lib/tkextlib/tile.rb: lack of autoload definitions.

	* ext/tk/lib/tkextlib/tile/tnotebook.rb: cannot use kanji (not UTF-8) 
	  characters for headings.

	* ext/tk/tcltklib.c: maybe a little more stable about @encoding value 
	  of TclTkIp object.

Wed May  7 08:46:44 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* struct.c (rb_struct_s_def): to_str should be called only once.
	  [ruby-core:16647]

Wed May  7 00:54:25 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/zlib/zlib.c (gzreader_gets): may cause infinite loop.
	  a patch from Kouya <kouyataifu4 at gmail.com> in
	  [ruby-reference-manual:762].

Sun May  4 09:35:51 2008  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* sample/erb/erb4html.rb (ERB4Html) : add example of ERB#set_eoutvar.
	  ERB4Html is an auto-quote ERB.

Sat May  3 22:52:48 2008  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tkextlib/tile.rb, ext/tk/lib/tkextlib/tile/style.rb, 
	  ext/tk/sample/ttk_wrapper.rb: improve treating and control themes. 
	  add Tk::Tile.themes and Tk::Tile.set_theme(theme).

Fri May  2 14:52:33 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* misc/ruby-mode.el: move fontifying code from hook.  a patch from
	  Phil Hagelberg <phil at hagelb.org> in [ruby-core:16636].

Fri May  2 13:47:51 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* re.c (match_select): restore previous behavior of MatchData#select.
	  RDoc updated as well, mentioning the plan to remove this method
	  in the future.  [ruby-dev:34556]

Fri May  2 13:04:04 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/dbm/dbm.c (Init_dbm): defines DBM::VERSION even when
	  DB_VERSION_STRING is not available.  [ruby-dev:34569]

Thu May  1 23:57:06 2008  James Edward Gray II  <jeg2@ruby-lang.org>

	Merged 16257 from trunk.

	* lib/net/telnet.rb:  This patch from Brian Candler adds a FailEOF mode which
	  can be activated to have net/telnet raise EOFError exceptions when the 
	  remote connection is closed.  The default behavior remains unchanged though.

Thu May  1 23:43:21 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* range.c (range_step): check if step can be converted to an integer.
	  [ruby-dev:34558]

	* range.c (range_step): allow float step bigger than zero but less
	  than one.  [ruby-dev:34557]

Wed Apr 30 20:22:40 2008  James Edward Gray II  <jeg2@ruby-lang.org>

	Merged 16241 from trunk.

	* lib/net/telnet.rb:  Fixing a bug where line endings would not be properly
	  escaped when the two character ending was broken up into separate TCP
	  packets.  Issue reported and patched by Brian Candler.

Wed Apr 30 17:47:21 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* re.c (rb_reg_search): use local variable.  a patch from wanabe
	  <s.wanabe AT gmail.com> in [ruby-dev:34537].  [ruby-dev:34492]

Sat Apr 26 19:40:34 2008  Guy Decoux  <decoux@moulon.inra.fr>

	* class.c (struct clone_method_data): Add cref.
	  (clone_method): Properly handle NODE_BMETHOD and NODE_DMETHOD.
	  (rb_singleton_class_clone, singleton_class_clone_int): Set a
	  proper value to klass and propagate cref. [ruby-core:16238]

	* eval.c (rb_block_dup, rb_method_dup), intern.h: Add duplicator
	  methods for use from class.c#clone_method().

Fri Apr 25 15:46:37 2008  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb, ext/tk/lib/tk/scrollbar.rb, ext/tk/lib/tk/scale.rb:
	  improve unknonw-option check when create a widget. 

	* ext/tk/lib/tkextlib/blt/unix_dnd.rb, ext/tk/lib/tkextlib/blt/ted.rb,
	  ext/tk/lib/tkextlib/treectrl/tktreectrl.rb: bug fix on 'cget'.

	* ext/tk/lib/tk/menuspec.rb: option check will fail when 
	  TkConfigMethod.__IGNORE_UNKNOWN_CONFIGURE_OPTION__ is true.

	* ext/tk/lib/tk/palette.rb: bug fix.

Fri Apr 25 12:37:54 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (flatten): returns an instance of same class.
	  [ruby-core:16554]

Thu Apr 24 23:47:50 2008  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* lib/net/pop.rb: backported from 1.9. bug#19003

	* ext/openssl/lib/openssl/ssl.rb: set_params; backported from 1.9.
	  bug#19552, [ruby-dev:34402]

	* ext/openssl/ossl_ssl.c: ditto.

	* test/openssl/test_ssl.rb: ditto.

Thu Apr 24 17:06:34 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (THREAD_SAVE_CONTEXT): remove unnecessary
	  FLUSH_REGISTER_WINDOWS before calling setjmp().  [ruby-core:16285]

Thu Apr 24 14:15:11 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dln.c (dln_find_1): prior files with extensions to files sans
	  extensions.  [ruby-core:16517]

Wed Apr 23 15:39:31 2008  Akinori MUSHA  <knu@iDaemons.org>

	* eval.c (bind_eval): Add Binding#eval, a shorthand method for
	  eval(str, binding, ..); backported from 1.9.

Wed Apr 23 15:28:52 2008  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* test/gdbm/test_gdbm.rb (TestGDBM#test_s_open_no_create): failed
	  notice moved from comment to assertion message. [ruby-dev:29127]

Wed Apr 23 14:00:05 2008  Akinori MUSHA  <knu@iDaemons.org>

	* lib/mkmf.rb (create_makefile): Add a missing dependency on the
	  target directory for each .rb file.  This will hopefully fix
	  parallel make (-jN).  Tested on FreeBSD.

Wed Apr 23 11:49:54 2008  Akinori MUSHA  <knu@iDaemons.org>

	* lib/set.rb (Set#each, SortedSet#each, TC_Set#test_each): Return
	  an enumerator if no block is given.

Wed Apr 23 00:42:49 2008  Tanaka Akira  <akr@fsij.org>

	* eval.c (error_print): show full stack grace except SystemStackError.
	  backport from 1.9.  [ruby-dev:31014]

Wed Apr 23 00:18:45 2008  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* test/ruby/test_symbol.rb (TestSymbol#test_to_proc): Improve
	  tests of Symbol#to_proc.

Tue Apr 22 22:43:05 2008  Akinori MUSHA  <knu@iDaemons.org>

	* eval.c (rb_proc_new, YIELD_FUNC_LAMBDA): Add a new nd_state
	  YIELD_FUNC_LAMBDA which avoids automatic `avalue' conversion for
	  arguments.  This fixes a bug where [1,[2,3]].map(&:object_id)
	  fails.

	* intern.h, object.c: Hide rb_proc_new() from intern.h.  It should
	  not be considered an official API function yet.

Tue Apr 22 21:24:32 2008  Akinori MUSHA  <knu@iDaemons.org>

	* eval.c (rb_proc_new): Turn the BLOCK_LAMBDA flag on.

	* object.c (sym_to_proc), test/ruby/test_symbol.rb: Add back
	  Symbol#to_proc, now that it passes the tests.

Tue Apr 22 19:35:03 2008  Akinori MUSHA  <knu@iDaemons.org>

	* enumerator.c (enumerator_initialize): Remove an undocumented
	  feature (passing a block to the constructor) that's broken.
	  This is not what I intended.

Tue Apr 22 17:49:46 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* sprintf.c (rb_f_sprintf): should protect temporary string from
	  GC.   [ruby-dev:34480]

Tue Apr 22 17:12:05 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* regex.c (re_search): string might be NULL.  [ruby-core:16478]

Tue Apr 22 16:44:00 2008  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* object.c (rb_obj_tap): Correct documentation; pointed out by
	  okkez in [ruby-dev:34472].

Tue Apr 22 10:05:51 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* file.c (eaccess): workaround for recent msvcrt's behavior.
	  [ruby-core:16460]

Mon Apr 21 16:06:47 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* enumerator.c (enumerator_init): preserve the method name in ID.

	* enumerator.c (enumerator_each): need not to call rb_to_id().

	* enumerator.c (enumerator_with_index): ditto.

Mon Apr 21 17:19:52 2008  Akinori MUSHA  <knu@iDaemons.org>

	* eval.c (rb_f_method_name): New gloval function: __method__;
	  backported from matzruby / 1.9.

	* eval.c (rb_frame_this_func), intern.h: New internal function.

	* intern.h (RETURN_ENUMERATOR): Use rb_frame_this_func() instead
	  of rb_frame_last_func(), to accommodate the behavior to that of
	  1.9.

Mon Apr 21 15:54:48 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/tempfile.rb (Tempfile::_close): check @data before modifying
	  it; backported from 1.9.  [ruby-dev:34094]

	* lib/tempfile.rb (Tempfile::close): clear @data and @tmpname.

Mon Apr 21 10:17:17 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* time.c: should include <errno.h> to refer errno.

Mon Apr 21 10:02:43 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* hash.c (recursive_hash): prototype.

Mon Apr 21 10:00:51 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* time.c (rb_strftime): check errno to detect strftime(3)'s error.
	  this is workaround for recent version of MSVCRT.
	  [ruby-dev:34456]

Sun Apr 20 21:10:04 2008  Akinori MUSHA  <knu@iDaemons.org>

	* .: Release as Ruby 1.8.7-preview2.

Sun Apr 20 21:02:06 2008  Akinori MUSHA  <knu@iDaemons.org>

	* enumerator.c: Resolve the method every time an enumeration
	  method is run, not once when the enumerator is initialized as it
	  was before, so that method_missing() and method (re)definition
	  afterwards are both in effect; pointed out in: [ruby-core:16441]

Sun Apr 20 17:59:25 2008  Akinori MUSHA  <knu@iDaemons.org>

	* object.c, NEWS, test/ruby/test_symbol.rb: Revert Symbol#to_proc
	  since it does not pass the tests.

Sun Apr 20 14:29:35 2008  Technorama Ltd.  <oss-ruby@technorama.net>

	* ext/openssl/ossl_ssl.c: initialize session class.

Sat Apr 19 20:54:42 2008  akira yamada  <akira@arika.org>

	* lib/uri/ftp.rb, lib/uri/generic.rb, test/uri/test_common.rb,
	  test/uri/test_ftp.rb, test/uri/test_generic.rb: backported from 1.9.
	  [ruby-dev:31318]

Sat Apr 19 20:35:02 2008  Akinori MUSHA  <knu@iDaemons.org>

	* lib/yaml/baseemitter.rb, lib/yaml/encoding.rb: performance
	  tuning around String#gsub.

	* lib/yaml/tag.rb: Replace nodoc with stopdoc so Module methods get
	  documented.

	* lib/yaml/store.rb (YAML::load): modified to support empty
	  database.

	* lib/yaml/store.rb (YAML::Store::marshal_dump_supports_canonical_option?):
	  add a method to support faster PStore.

Sat Apr 19 20:16:52 2008  Akinori MUSHA  <knu@iDaemons.org>

	* lib/yaml/types.rb: Likewise, pass self to YAML::quick_emit;
	  merged from 1.9.

	* lib/yaml.rb (quick_emit): use combination of object_id and hash to
	  identify repeated object references, since GC will reuse memory of
	  objects during output of YAML. [ruby-Bugs-8548] [ruby-Bugs-3698];
	  merged from 1.9.

Sat Apr 19 20:05:39 2008  Akinori MUSHA  <knu@iDaemons.org>

	* array.c (rb_ary_equal, rb_ary_eql, rb_ary_hash, rb_ary_cmp):
	  Make Array#eql?, #hash, #== and #<=> use rb_exec_recursive() and
	  handle recursive data properly.

	* hash.c (hash_equal, rb_hash_hash): Make Hash#eql?, #hash and #==
	  use rb_exec_recursive() and handle recursive data properly.

Sat Apr 19 19:26:09 2008  Akinori MUSHA  <knu@iDaemons.org>

	* intern.h, eval.c (rb_exec_recursive): New internal function to
	  help perform recursive operation; backported from 1.9.

Sat Apr 19 18:42:04 2008  Akinori MUSHA  <knu@iDaemons.org>

	* intern.h, hash.c (rb_hash_lookup): New internal function to
	  check if a key exists in a hash, ignoring #default; backported
	  from 1.9.

Fri Apr 18 18:56:57 2008  Akinori MUSHA  <knu@iDaemons.org>

	* ext/syck/rubyext.c (syck_genericresolver_node_import): should
	  not set instance variable "@kind" before initializing it.
	  [ruby-dev:32677]

	* ext/syck/rubyext.c (syck_resolver_initialize,
	  syck_resolver_detect_implicit, syck_emitter_emit): remove unused
	  variables.

Fri Apr 18 18:54:57 2008  Akinori MUSHA  <knu@iDaemons.org>

	* ext/syck/rubyext.c: Node#value defined twice.

	* lib/yaml/: several method redefinitions causing warnings.

Fri Apr 18 16:36:16 2008  Akinori MUSHA  <knu@iDaemons.org>

	* lib/rexml/node.rb (REXML::Node::indent): should initialize rv
	  variable.  a patch from Tadayoshi Funaba <tadf AT dotrb.org> in 
	  [ruby-dev:32783].

Fri Apr 18 16:01:37 2008  Akinori MUSHA  <knu@iDaemons.org>

	* lib/rexml: Merge fixes since 1.8.6 made solely on the ruby_1_8_6
	  branch.

Wed Apr 16 06:11:49 2008  Akinori MUSHA  <knu@iDaemons.org>

	* test/ruby/test_settracefunc.rb (TestSetTraceFunc#test_event):
	  Fix tests to reflect the following changes: r15833, r15759.

Wed Apr 16 05:03:48 2008  Akinori MUSHA  <knu@iDaemons.org>

	* .: Release as Ruby 1.8.7-preview1.

Wed Apr 16 02:09:14 2008  Kouhei Sutou  <kou@cozmixng.org>

	* lib/xmlrpc/client.rb: fix cookie handling. [ruby-dev:34403]

	* test/xmlrpc/test_cookie.rb: add a test for the above fix.

Tue Apr 15 23:48:28 2008  Akinori MUSHA  <knu@iDaemons.org>

	* version.h: Branch off ruby_1_8_7 from ruby_1_8 in preparation
	  for the forthcoming 1.8.7 release.

Tue Apr 15 23:40:39 2008  Akinori MUSHA  <knu@iDaemons.org>

	* ext/syck/rubyext.c (rb_syck_mktime): Avoid buffer overflow.

Tue Apr 15 20:32:03 2008  Tanaka Akira  <akr@fsij.org>

	* re.c (match_inspect): backported from 1.9.

Tue Apr 15 19:03:28 2008  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* eval.c (method_receiver, method_name, method_owner): New
	  methods; backported from 1.9. bug#19007

Tue Apr 15 18:39:14 2008  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* lib/uri.rb, lib/uri/ldaps.rb: added LDAPS
	  scheme; backported from 1.9. bug#19015, [ruby-dev:31896]

Tue Apr 15 17:45:43 2008  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* lib/net/smtp.rb: backported from 1.9. bug#19003

Tue Apr 15 17:06:12 2008  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* test/ruby/test_symbol.rb (TestSymbol#test_to_proc): add tests.

Tue Apr 15 16:58:55 2008  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/menuspec.rb: option check will fail when 
	  TkConfigMethod.__IGNORE_UNKNOWN_CONFIGURE_OPTION__ is true.

	* ext/tk/lib/tk/palette.rb: bug fix.

Tue Apr 15 16:47:48 2008  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* signal.c, gc.c: New methods: GC.stress, GC.stress=;
	  backported from 1.9. a patch from Tadashi Saito
	  in [ruby-dev:34394] and bug#19000

Tue Apr 15 12:35:44 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* rubyio.h (rb_io_t): renamed from OpenFile.

	* ruby.h (struct RHash), file.c, gc.c, io.c, ext/dl/dl.c,
	  ext/io/wait/wait.c, ext/pty/pty.c, ext/readline/readline.c,
	  ext/socket/socket.c: ditto.

	* win32/win32.h: removed workaround for OpenFile.

Tue Apr 15 00:15:29 2008  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/text.rb: typo. call a wrong method.

	* ext/tk/lib/tk/itemconfig.rb: ditto.

	* ext/tk/sample/ttk_wrapper.rb: bug fix.

	* ext/tk/sample/tktextio.rb: add binding for 'Ctrl-u' at console mode.

	* ext/tk/lib/tk.rb, ext/tk/lib/tk/itemfont.rb, ext/tk/lib/font.rb: 
	  support __IGNORE_UNKNOWN_CONFIGURE_OPTION__ about font options.

	* ext/tk/lib/tkextlib/iwidgets/scrolledcanvas.rb, 
	  ext/tk/lib/tkextlib/iwidgets/scrolledlistbox.rb, 
	  ext/tk/lib/tkextlib/iwidgets/scrolledtext.rb: bug fix. 

	* ext/tk/lib/tkextlib/tile/tpaned.rb: improve TPaned#add.

	* ext/tk/lib/tk/timer.rb: add TkTimer#at_end(proc) to register the 
	  procedure which called at end of the timer.

Mon Apr 14 19:54:21 2008  Akinori MUSHA  <knu@iDaemons.org>

	* array.c (rb_ary_flatten, rb_ary_flatten_bang): Take an optional
	  argument that determines the level of recursion to flatten;
	  backported from 1.9.

	* array.c (rb_ary_shuffle_bang, rb_ary_shuffle, rb_ary_choice,
	  rb_ary_cycle, rb_ary_permutation, rb_ary_combination,
	  rb_ary_product, rb_ary_take, rb_ary_take_while, rb_ary_drop,
	  rb_ary_drop_while): New methods: Array#shuffle, #shuffle!,
	  #choice, #cycle, #permutation, #combination, #product, #take,
	  #take_while, #drop, #drop_while; backported from 1.9.

Mon Apr 14 19:52:35 2008  Akinori MUSHA  <knu@iDaemons.org>

	* ruby.h: New macro: RB_GC_GUARD().

Mon Apr 14 19:49:35 2008  Akinori MUSHA  <knu@iDaemons.org>

	* random.c (rb_genrand_int32, rb_genrand_real), intern.h: Export.

	* string.c (rb_str_tmp_new), intern.h: New function.

Mon Apr 14 19:18:55 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* enum.c (inject_i, inject_op_i): prototype.

Mon Apr 14 19:10:47 2008  Akinori MUSHA  <knu@iDaemons.org>

	* enum.c New methods: Enumerable#take, #take_while, #drop and
	  #drop_while; backported from 1.9.

Mon Apr 14 18:50:15 2008  Akinori MUSHA  <knu@iDaemons.org>

	* enum.c: New methods: Enumerable#one?, #none?, #minmax, #min_by,
	  #max_by, #minmax_by and #cycle; backported from 1.9.

	* enum.c (enum_find_index): Add support for find_index(obj);
	  [ruby-dev:34313]; backported from 1.9.

	* enum.c (enum_inject): Add support for Enumerable#inject(:binop);
	  backported from 1.9.

	* enum.c: Alias Enumerable#reject to #inject; backported from 1.9.

Mon Apr 14 18:14:19 2008  Akinori MUSHA  <knu@iDaemons.org>

	* enum.c (enum_find, enum_reject): Return an enumerator if no
	  block is given; backported from 1.9.

	* io.c (rb_io_each_line, rb_io_each_byte, rb_io_s_foreach,
	  argf_each_line, argf_each_byte): Ditto.

	* string.c (str_gsub): Ditto.

Mon Apr 14 18:10:05 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* enum.c (find_index_i, find_index_iter_i): add prototype for VC.

Mon Apr 14 17:55:30 2008  Akinori MUSHA  <knu@iDaemons.org>

	* array.c (rb_ary_collect_bang, rb_ary_select): Return an
	  enumerator if no block is given; backported from 1.9.

	* dir.c (dir_each, dir_foreach): Ditto.

	* enum.c (enum_partition, enum_sort_by): Ditto.

	* gc.c (os_each_obj): Ditto.

	* hash.c (rb_hash_delete_if, rb_hash_reject_bang, rb_hash_select,
	  rb_hash_each_value, rb_hash_each_key, rb_hash_each_pair,
	  env_each_key, env_each_value, env_each, env_each_pair,
	  env_reject_bang, env_delete_if, env_select): Ditto.

	* numeric.c (num_step, int_upto, int_downto, int_dotimes): Ditto.

Mon Apr 14 16:42:53 2008  Akinori MUSHA  <knu@iDaemons.org>

	* ruby.h (rb_block_call_func): Fix prototype.

	* enumerator.c (enumerator_iter_i, enumerator_each_i): Ditto.

Mon Apr 14 15:49:05 2008  Akinori MUSHA  <knu@iDaemons.org>

	* enum.c (enum_count, enum_find_index): New methods:
	  Enumerable#count and #find_index; backported from 1.9.

Mon Apr 14 14:16:08 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* enumerator.c (enumerator_mark, enumerator_iter_i, enumerator_each_i,
	  enumerator_allocate): add prototype.

	* enumerator.c (enumerator_each_i): declare unused two arguments.

Mon Apr 14 13:58:32 2008  Akinori MUSHA  <knu@iDaemons.org>

	* string.c (rb_str_each_char): New methods: String#chars and
	  #each_char; backported from 1.9.

Mon Apr 14 13:42:20 2008  Akinori MUSHA  <knu@iDaemons.org>

	* string.c (rb_str_each_line, rb_str_each_byte): Reflect
	  enumerator integration.  #lines and #bytes are now aliases to
	  #each_line and #each_byte, respectively.

Mon Apr 14 13:19:36 2008  Akinori MUSHA  <knu@iDaemons.org>

	* range.c (range_each, range_step): Return an enumerator if no
	  block is given; backported from 1.9.

	* struct.c (rb_struct_each, rb_struct_each_pair): Ditto.

Mon Apr 14 13:07:59 2008  Akinori MUSHA  <knu@iDaemons.org>

	* string.c (rb_str_partition, rb_str_rpartition,
	  rb_str_start_with, rb_str_end_with): New methods:
	  String#partition, #rpartition, #start_with? and #end_with?;
	  backported from 1.9.  These methods are $KCODE aware unlike
	  #index, #rindex and #include?.

Sun Apr 13 15:55:52 2008  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* object.c (sym_to_proc): new method Symbol#to_proc; backported
	  from 1.9. bug#19012

Fri Apr 11 19:14:30 2008  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* object.c (rb_obj_tap): new method Object#tap; backported from
	  1.9. bug#19008

Fri Apr 11 18:58:09 2008  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* process.c: new method Process.exec; backported from 1.9. bug#19006

Fri Apr 11 12:43:56 2008  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tkextlib/tile.rb, ext/tk/lib/tkextlib/tile/style.rb, 
	  ext/tk/sample/tkextlib/tile/demo.rb: previous patch is not complete.

Fri Apr 11 10:22:54 2008  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tkextlib/tile.rb:
	  __define_LoadImages_proc_for_compatibility__! do nothing when the 
	  Tcl command exists.

	* ext/tk/lib/tkextlib/tile/style.rb:
	  __define_wrapper_proc_for_compatibility__! do nothing when the Tcl
	  command exists.

	* ext/tk/sample/tkextlib/tile/demo.rb: don't create 'step' theme if 
	  it already exists.

Fri Apr 11 08:05:12 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* marshal.c (w_object): add volatile to avoid potential GC bug.  a
	  patch from Tomoyuki Chikanaga <chikanag at nippon-control-system.co.jp>
	  in [ruby-dev:34311].

Thu Apr 10 20:29:13 2008  Akinori MUSHA  <knu@iDaemons.org>

	* misc/rdebug.el, misc/README: Remove rdebug.el as per request
	  from the maintainer and mention the ruby-debug project at
	  RubyForge in README; bug#19043.

Thu Apr 10 20:08:37 2008  Akinori MUSHA  <knu@iDaemons.org>

	* enum.c (enum_first, enum_group_by): New methods:
	  Enumerable#first and #group_by; backported from 1.9.

Thu Apr 10 19:49:10 2008  Akinori MUSHA  <knu@iDaemons.org>

	* enumerator.c (rb_eStopIteration), eval.c (rb_f_loop), ruby.h:
	  Add a new exception class StopIteration, which breaks Kernel#loop
	  iteration when raised; backported from 1.9.

	* enumerator.c (enumerator_next, enumerator_rewind): Implement
	  #next and #rewind using the "generator" library.

	* lib/generator.rb: Implement Enumerable::Enumerator#next and
	  #rewind.

Thu Apr 10 19:29:48 2008  Akinori MUSHA  <knu@iDaemons.org>

	* array.c (rb_ary_first, rb_ary_last): Return a shared array when
	  possible.

	* array.c (rb_ary_pop, rb_ary_pop_m, rb_ary_shift, rb_ary_shift_m):
	  Array#pop and Array#shift can take an optional argument
	  specifying the number of elements to remove and return;
	  backported from 1.9.

Thu Apr 10 14:00:44 2008  Tanaka Akira  <akr@fsij.org>

	* lib/resolv.rb (Resolv::DNS#each_address): backport from 1.9 for
	  CNAME.  [ruby-dev:34200]

Thu Apr 10 01:42:25 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* enum.c (iterate_method): add prototype to avoid warning on VC++.

Wed Apr  9 23:12:41 2008  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tcltklib.c: SEGV when tcltk-stubs is enabled.

	* ext/tk/tcltklib.c: avoid error on a shared object.

	* ext/tk/extconf.rb: support --with-tcltkversion

	* ext/tk/README.tcltklib: add document about --with-tcltkversion

	* ext/tk/sample/demos-jp/widget, ext/tk/sample/demos-en/widget, 
	  ext/tk/sample/demos-jp/style.rb, ext/tk/sample/demos-en/style.rb, 
	  ext/tk/sample/demos-jp/bind.rb, ext/tk/sample/demos-en/bind.rb: 
	  bug fix.

Wed Apr  9 21:54:45 2008  Akinori MUSHA  <knu@iDaemons.org>

	* array.c (rb_ary_pop): Do not reallocate too often; backported
	  from 1.9.

Wed Apr  9 21:13:05 2008  Akinori MUSHA  <knu@iDaemons.org>

	* array.c (rb_ary_each, rb_ary_each_index, rb_ary_reverse_each,
	  rb_ary_reject, rb_ary_reject_bang): Array#each, #each_index,
	  #reverse_each, #reject, #reject! and #delete_if return an
	  enumerator if no block is given; backported from 1.9.

Wed Apr  9 20:47:16 2008  Akinori MUSHA  <knu@iDaemons.org>

	* array.c (rb_ary_index, rb_ary_index): Array#index and #rindex
	  can take a block instead of an argument; backported from 1.9.

Wed Apr  9 19:58:31 2008  Akinori MUSHA  <knu@iDaemons.org>

	* enumerator.c, inits.c (rb_call_inits), ruby.h, intern.h,
	  ext/enumerator, common.mk (OBJS, enumerator.$(OBJEXT)): Make the
	  enumerator module built-in.

	* enumerator.c: New method: Enumerable::Enumerator#with_index.

	* enum.c (enum_each_with_index): Enumerable#each_with_index now
	  returns an enumerator instead of raising an exception if no
	  block is given.  Enumerable#enum_with_index, formerly defined in
	  the enumerator module, is kept as an alias to each_with_index
	  for backward compatibility.

Wed Apr  9 19:43:51 2008  Akinori MUSHA  <knu@iDaemons.org>

	* eval.c (rb_obj_method, rb_proc_call), intern.h: Export.

Tue Apr  8 11:11:28 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (EXEC_TAG): remove unnecessary FLUSH_REGISTER_WINDOWS for
	  better performance on SPARC.  [ruby-core:16159]

Tue Apr  8 10:49:54 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* re.c (rb_reg_quote): should always copy the quoting string.
	  [ruby-core:16235]

Mon Apr  7 21:35:08 2008  Akinori MUSHA  <knu@iDaemons.org>

	* array.c (rb_ary_nitems): Backport Array#nitems with a block;
	  suggested by Bertram Scharpf <lists@bertram-scharpf.de> in
	  [ruby-talk:134083].

Sun Apr  6 09:45:00 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (dir_tell): check if closed.  [ruby-core:16223]

Sat Apr  5 10:05:00 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* object.c (rb_check_to_integer): backported for range_step.

Fri Apr  4 05:57:11 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/net/pop.rb (Net::POP3::do_finish): clear @n_mails and
	  @n_bytes as well.  [ruby-core:16144]

Fri Apr  4 02:17:06 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* range.c (range_step): should not round step into integer if
	  begin and end are numeric.  [ruby-core:15990]

Tue Apr  1 14:43:38 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: get rid of empty expansion.

	* {bcc,win}32/Makefile (config.h): need to define RUBY_SETJMP, etc.

Tue Apr  1 11:36:19 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: _setjmp is available but _longjmp is not on mingw.

Tue Apr  1 03:20:40 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (RUBY_SETJMP, RUBY_LONGJMP, RUBY_JMP_BUF): prefers
	  _setjmp over setjmp and sigsetjmp.  [ruby-core:16023]
	  __builtin_setjmp cannot handle a variable.

	* configure.in (--with-setjmp-type): new option to override the
	  default rule in the above.

	* eval_intern.h (ruby_setjmp, ruby_longjmp), gc.c (rb_setjmp),
	  vm_core.h (rb_jmpbuf_t): use RUBY_SETJMP, RUBY_LONGJMP and
	  RUBY_JMP_BUF.

Tue Apr  1 01:55:52 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/resolv.rb (Resolv::Config.default_config_hash): requires
	  win32/resolv to use Win32::Resolv.  [ruby-dev:34138]

Mon Mar 31 14:51:11 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* bignum.c (rb_big_div): Bignum#div should return integer for
	  floating number operand.

Sun Mar 30 07:00:32 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/tk/tcltklib.c: rb_hash_lookup has not been backported yet.

Sat Mar 29 14:18:41 2008  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/*: full update Ruby/Tk to support Ruby(1.9|1.8) and Tc/Tk8.5.

	* ext/tk/lib/tkextlib/tile.rb: [incompatible] remove TileWidgets' 
	  instate/state/identify method to avoid the conflict with standard
	  widget options. Those methods are renamed to ttk_instate/ttk_state/
	  ttk_identify (tile_instate/tile_state/tile_identify are available 
	  too). Although I don't recommend, if you realy need old methods, 
	  please define "Tk::USE_OBSOLETE_TILE_STATE_METHOD = true" before 
	  "require 'tkextlib/tile'".

	* ext/tk/lib/tkextlib/tile.rb: "Tk::Tile::__Import_Tile_Widgets__!"
	  is obsolete. It outputs warning. To control default widget set, 
	  use "Tk.default_widget_set = :Ttk".

	* ext/tk/lib/tk.rb: __IGNORE_UNKNOWN_CONFIGURE_OPTION__ method and 
	  __set_IGNORE_UNKNOWN_CONFIGURE_OPTION__!(mode) method are defind 
	  as module methods of TkConfigMethod. It may help users to wrap old 
	  Ruby/Tk scripts (use standard widgets) to force to use Ttk widgets.
	  Ttk widgets don't have some options of standard widgets which are 
	  control the view of widgets. When set ignore-mode true, configure 
	  method tries to ignoure such unknown options with no exception. 
	  Of course, it may raise other troubles on the GUI design. 
	  So, those are a little danger methods. 

	* ext/tk/lib/tk/itemconfig.rb: __IGNORE_UNKNOWN_CONFIGURE_OPTION__ 
	  method and __set_IGNORE_UNKNOWN_CONFIGURE_OPTION__!(mode) method 
	  are defind as module methods of TkItemConfigMethod as the same 
	  purpose as TkConfigMethod's ones.

	* ext/tk/sample/ttk_wrapper.rb: A new example. This is a tool for 
	  wrapping old Ruby/Tk scripts (which use standard widgets) to use 
	  Ttk (Tile) widgets as default.

	* ext/tk/sample/tkextlib/tile/demo.rb: use ttk_instate/ttk_state 
	  method instead of instate/state method.

	* ext/tk/lib/tk/root, ext/tk/lib/tk/namespace.rb,
	  ext/tk/lib/tk/text.rb, ext/tk/lib/tkextlib/*: some 'instance_eval's  
	  are replaced to "instance_exec(self)".

	* ext/tk/lib/tk/event.rb: bug fix on KEY_TBL and PROC_TBL (?x is not 
	  a character code on Ruby1.9).

	* ext/tk/lib/tk/variable.rb: support new style of operation argument 
	  on Tcl/Tk's 'trace' command for variables. 

	* ext/tk/sample/demos-jp/widget, ext/tk/sample/demos-en/widget: bug fix

	* ext/tk/sammple/demos-jp/textpeer.rb, 
	  ext/tk/sammple/demos-en/textpeer.rb: new widget demo.

	* ext/tk/tcltklib.c: decrase SEGV troubles (probably)

	* ext/tk/lib/tk.rb: remove Thread.critical access if Ruby1.9

	* ext/tk/lib/tk/multi-tk.rb: support Ruby1.9 (probably)

	* ext/tk/lib/tkextlib/tile.rb: add method to define Tcl/Tk command 
	  to make Tcl/Tk theme sources (based on different version of Tile 
	  extension) available. 
	  (Tk::Tile::__define_LoadImages_proc_for_comaptibility__)

	* ext/tk/lib/tk.rb, ext/tk/lib/tk/wm.rb: support dockable frames
	  (Tcl/Tk8.5 feature). 'wm' command can treat many kinds of widgets 
	  as toplevel widgets.

	* ext/tk/lib/tkextlib/tile/style.rb: ditto.
	  (Tk::Tile::Style.__define_wrapper_proc_for_compatibility__)

	* ext/tk/lib/tk/font.rb: add actual_hash and metrics_hash to get 
	  properties as a hash. metrics_hash method returns a boolean value 
	  for 'fixed' option. But metrics method returns numeric value 
	  (0 or 1) for 'fixed' option, because of backward compatibility. 

	* ext/tk/lib/tk/timer.rb: somtimes fail to set callback procedure.

	* ext/tk/lib/tk.rb: add Tk.sleep and Tk.wakeup method. Tk.sleep 
	  doesn't block the eventloop. It will be better to use the method 
	  in event callbacks.

	* ext/tk/sample/tksleep_sample.rb: sample script about Tk.sleep.

Sat Mar 29 04:08:59 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* class.c (clone_method): should copy cref as well.
	  [ruby-core:15833]

Mon Mar 24 20:07:42 2008  Akinori MUSHA  <knu@iDaemons.org>

	* eval.c (rb_eval): Call trace hook for if expression after the
	  condition has been evaluated, not before; submitted by Rocky
	  Bernstein in #18722.

Mon Mar 24 19:44:53 2008  Akinori MUSHA  <knu@iDaemons.org>

	* parse.y (yycompile): Always prepare a new array for each file's
	  SCRIPT_LINES__ storage, instead of appending source lines every
	  time a file is re-loaded; submitted by Rocky Bernstein in
	  #18517.

Mon Mar 24 10:25:54 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: sitearch should use target_cpu.  [ruby-core:15986]

Mon Mar 24 01:24:24 2008  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/erb.rb (result): use proc instead of Thread. [ruby-dev:33692]

Fri Mar 21 21:26:52 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/resolv.rb (Resolv::Hosts): should not use win32/resolv on cygwin.
	  [ruby-dev:29945], [ruby-dev:34095]

	* lib/win32/registry.rb (Win32::Registry.expand_environ): try upcased
	  name too for cygwin.  [ruby-dev:29945]

	* lib/win32/resolv.rb (Win32::Resolv.get_hosts_path): use expand_path.

Fri Mar 21 21:10:00 2008  Akinori MUSHA  <knu@iDaemons.org>

	* lib/ipaddr.rb: Say that I am the current maintainer.

	* lib/set.rb: Ditto.

	* lib/shellwords.rb: Ditto.

	* ext/syslog/syslog.txt: Ditto.

Fri Mar 21 09:24:28 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* instruby.rb (open_for_install): write block result and rewrite only
	  if changed from existing file.

Wed Mar 19 21:01:08 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (dir_inspect, dir_path, dir_tell): check for frozen and closed
	  is not needed.  [ruby-dev:32640]

Wed Mar 19 20:25:40 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (Init_Dir): define inspect method.  [ruby-core:15960]

Wed Mar 19 14:59:12 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* misc/ruby-style.el (ruby-style-{case,label}-indent): fix for labels
	  inside blocks in switch and function top level.

Wed Mar 19 14:36:40 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (rb_cstr_to_inum): treat successive underscores as
	  nondigit.  [ruby-dev:34089]

Wed Mar 19 00:01:23 2008  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/erb.rb (ERB::Compiler): Make some minor code optimization.

Mon Mar 17 17:11:13 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* misc/ruby-mode.el (ruby-mode): should use `run-mode-hooks' instead
	  of calling `run-hooks' directly to run the mode hook.  patch from
	  Chiyuan Zhang <pluskid AT gmail.com> in [ruby-core:15915]

Mon Mar 17 16:41:08 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: unset GREP_OPTIONS.  [ruby-core:15918]

Fri Mar 14 16:59:23 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (RUBY_LIB_PREFIX): fix for prefix.

Fri Mar 14 16:35:11 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/cgi.rb (CGI::Cookie::initialize): performance patch from
	  Makoto Kuwata <kwa@kuwata-lab.com> in [ruby-dev:34048].

Fri Mar 14 15:49:05 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (RUBY_LIB_PREFIX): use libdir.

Fri Mar 14 10:12:29 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (RUBY_CHECK_VARTYPE): should not indent preprocessor
	  directives.

Thu Mar 13 00:37:20 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_call0): yields the last executed node line number at
	  return event.  [ruby-core:15855]

Wed Mar 12 02:12:20 2008  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* lib/delegate.rb: check $@ to avoid NoMethodError.

Tue Mar 11 19:48:09 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* numeric.c (fix_coerce): try conversion before type check.
	  [ruby-core:15838]

Tue Mar 11 17:03:23 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/delegate.rb (Delegator#initialize, DelegateClass): skip correct
	  backtrace.  [ruby-dev:34019]

Tue Mar 11 16:43:53 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (rb_w32_cmdvector): terminate shrunken command line.

Tue Mar 11 12:39:03 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (clean-local): removes MINOBJS.

Sat Mar  8 18:50:57 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (isdirsep): backslash is valid path separator on cygwin too.

Fri Mar  7 19:56:10 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb: rdoc added.  [ruby-Patches-9762]

Thu Mar  6 15:10:21 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* {bcc32,win32}/Makefile.sub (RUNRUBY): use $(PROGRAM) instead of
	  ruby$(EXEEXT).
	  suggested by KIMURA Koichi <kimura.koichi at canon.co.jp>.
	  [ruby-dev:34000]

Thu Mar  6 12:15:06 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (opt_block_param): command can start just after block param
	  definition.  [ruby-list:44479]

Thu Mar  6 00:34:11 2008  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/erb.rb: update RDoc. Thanks Makoto Kuwata [ruby-dev:33702]

Mon Mar  3 23:28:34 2008  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httpservlet/filehandler.rb: should normalize path
	  separators in path_info to prevent directory traversal attacks
	  on DOSISH platforms.
	  reported by Digital Security Research Group [DSECRG-08-026].

	* lib/webrick/httpservlet/filehandler.rb: pathnames which have
	  not to be published should be checked case-insensitively.

Mon Mar  3 16:14:24 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (rb_any_hash): shrinks all results in Fixnum range.
	  [ruby-core:15713]

Sat Mar  1 02:35:08 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (big2str_find_n1): check integer overflow.

Tue Feb 26 16:06:00 2008  Technorama Ltd.  <oss-ruby@technorama.net>

	* ext/openssl/ossl_pkey_{ec,dh,dsa,rsa}.c: Remove useless warnings.

	* ext/openssl/ossl_asn1.c: Simplify code.

	* ext/openssl/ossl_ssl_session.c Fix compiler warnings.
	  Undefine #id if SSL_SESSION_get_id is not supported.

Tue Feb 26 15:43:42 2008  Tanaka Akira  <akr@fsij.org>

	* parse.y (tokadd_escape): refactored.  [ruby-core:15657]

Mon Feb 25 17:30:29 2008  Technorama Ltd.  <oss-ruby@technorama.net>

	* ext/openssl/digest.c ext/openssl/lib/openssl/digest.rb:
	  Commit patch #9280 from Akinori MUSHA.
	  Simplify the OpenSSL::Digest class and make use of the
	  existing Digest framework.
	  Enhance performance.

Mon Feb 25 13:40:03 2008  Tanaka Akira  <akr@fsij.org>

	* process.c (Init_process): share bignum objects for RLIM_INFINITY,
	  RLIM_SAVED_MAX and RLIM_SAVED_CUR if they are equal.

Sun Feb 24 23:29:48 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk, {bcc,win}32/Makefile.sub (clean-local): remove
	  intermediate files.

Sun Feb 24 03:52:58 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* util.c (valid_filename): use O_EXCL to get rid of clobbering
	  existing files in race conditions.

Fri Feb 22 19:50:19 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (BIGZEROP): fix for longer Bignum zeros.  [ruby-Bugs-17454]

Fri Feb 22 16:09:53 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (rb_big_lshift, rb_big_rshift, rb_big_aref): removed excess
	  arguments.

Thu Feb 21 00:01:34 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (RPATHFLAG): -R option of HP-UX ld is not for runtime
	  load path.  [ruby-list:44600]

Wed Feb 20 23:55:19 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (rb_w32_map_errno): exported.

Wed Feb 20 13:08:52 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* instruby.rb (parse_args): added --dir-mode, --script-mode and
	  --cmd-type options.  [ruby-dev:33816]

	* instruby.rb (parse_args): added bin-arch and bin-comm to install
	  type, for compiled files and script files.

	* instruby.rb (parse_args): deal with make style command line macros,
	  and count as long syle options if prefixed with INSTALL_.

	* instruby.rb (makedirs): use $dir_mode.  [ruby-dev:33805]

	* instruby.rb (open_for_install): set file mode, which is now
	  permission mode instead of access mode.

	* instruby.rb (bin-comm): installs scripts with replacing shebang
	  lines.

Tue Feb 19 18:34:32 2008  Tanaka Akira  <akr@fsij.org>

	* gc.c (STACK_LENGTH) [SPARC] : 0x80 offset removed.  [ruby-dev:33857]

Tue Feb 19 14:27:32 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/readline/readline.c (readline_event): prevent polling.  based on
	  a patch from error errorsson in [ruby-Bugs-17675].

Tue Feb 19 12:08:29 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (yycompile): clear ruby_eval_tree_begin if parse failed.

Mon Feb 18 16:23:45 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (yycompile): clear ruby_eval_tree_begin too before parse.

Mon Feb 18 10:17:42 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/pty/lib/expect.rb (IO#expect): check if peer is closed.
	  [ruby-Bugs-17940]

Fri Feb 15 20:37:06 2008  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/rational.rb (floor, ceil, truncate, round): do not use
	  definitions of Numeric.

	* lib/rational.rb (to_i): should returns truncated self.

	* lib/complex.rb (numerator): requires
	  Integer#{numerator,denominator}.

	* lib/complex.rb (quo): do not use definition of Numeric.

	* lib/complex.rb (div, divmod, floor, ceil, truncate, round):
	  undef'ed.

Fri Feb 15 15:23:12 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/iconv/iconv.c (iconv_convert): check upper bound.  a patch from
	  Daniel Luz at [ruby-Bugs-17910].

Fri Feb 15 02:42:25 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (ftruncate): check if available.

	* file.c (rb_file_truncate): check if ftruncate instead of truncate.

Fri Feb 15 02:40:54 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (sigsetmask): check when signal semantics is not POSIX.

	* signal.c (USE_TRAP_MASK): set true if sigprocmask or sigsetmask is
	  available.

Thu Feb 14 17:44:32 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/dl/ptr.c (dlmem_each_i): typo fixed.  a patch from IKOMA
	  Yoshiki <ikoma AT mb.i-chubu.ne.jp> in [ruby-dev:33776].

Thu Feb 14 16:02:51 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_file_s_utime): inhibits with secure level 2 or higher.

Thu Feb 14 01:43:16 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/timeout.rb (Timeout::timeout): made sensitive to location on the
	  stack.  [ruby-core:15458]

Thu Feb 14 00:49:53 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (INSTRUBY_ARGS): pass mode to install.  [ruby-dev:33766]

	* instruby.rb (parse_args): added --data-mode and --prog-mode options.

Tue Feb 12 11:33:26 2008  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* test/erb/test_erb.rb(TestERBCore): import from erb-2.0.4.

	* test/erb/hello.erb: ditto

Mon Feb 11 17:25:21 2008  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb (RSS::VERSION), test/rss/test_version.rb, NEWS:
	  0.2.3 -> 0.2.4.

	* lib/rss/maker.rb, lib/rss/maker/, test/rss/test_maker_2.0.rb:
	  fixed a bug that RSS::Maker.make("0.9")'s item doesn't make some
	  elements if description is missed.
	  Reported by Michael Auzenne. Thanks!!!

	* lib/rss/maker/0.9.rb, test/rss/test_maker_0.9.rb:
	  RSS::Maker.make("0.9") generates RSS 0.92 not RSS 0.91.

Mon Feb 11 16:57:00 2008  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* ChangeLog: format-time-string under C locale. [ruby-dev:33261]

Mon Feb 11 16:31:47 2008  URABE Shyouhei  <shyouhei@ice.uec.ac.jp>

	* gc.c (rb_newobj): prohibit call of rb_newobj() during gc.
	  Submitted by Sylvain Joyeux [ruby-core:12099].

	* ext/dl/ptr.c: do not use LONG2NUM() inside dlptr_free().
	  Slightly modified fix bassed on a patch by Sylvain Joyeux
	  [ruby-core:12099] [ ruby-bugs-11859 ] [ ruby-bugs-11882 ]
	  [ ruby-patches-13151 ].

Mon Feb 11 00:22:55 2008  NARUSE, Yui  <naruse@ruby-lang.org>

	* lib/benchmark.rb (Job::Benchmark#item): fix typo.

Sat Feb  9 23:22:52 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/bigdecimal/extconf.rb: simplified the condition.

Sat Feb  9 17:51:24 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c (BigDecimal_to_f): use strtod() for more
	  precision.  [ruby-talk:290296]

	* ext/bigdecimal/bigdecimal.c (BASE_FIG): made constant.

	* ext/bigdecimal/extconf.rb: ditto.  [ruby-dev:33658]

Sat Feb  9 00:44:52 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/irb.rb (IRB::Irb::eval_input): rescues Interrupt and other than
	  SystemExit and SignalException.  [ruby-core:15359]

Fri Feb  8 15:09:21 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (xsystem): expand macros like as make.

Tue Feb  5 11:14:11 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (INSTALL_DIRS, install_dirs): added BINDIR.

	* lib/mkmf.rb (install_files): rejects files matching to
	  $NONINSTALLFILES.

	* lib/mkmf.rb (init_mkmf): defaults $NONINSTALLFILES to backup and
	  temporary filse.

Mon Feb  4 16:44:24 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (darwin): NSIG is not defined if _XOPEN_SOURCE > 500L.
	  [ruby-dev:33584]

Sat Feb  2 20:06:42 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/benchmark.rb (Benchmark::realtime): make Benchmark#realtime
	  a bit faster.  a patch from Alexander Dymo <dymo AT ukrpost.ua> in
	  [ruby-core:15337].

Sat Feb  2 09:53:39 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (darwin): disabled fat-binary support which confuses
	  configure much, since ``universal'' implies hidden cross-compiling.
	  TODO: ruby and libruby.bundle might be possible to bound with `lipo'
	  after builds for each archs.  Anyway, config.h and rbconfig.rb must
	  be separated definitely at least.

Fri Feb  1 21:42:37 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (darwin): _XOPEN_SOURCE is necessary to make ucontext_t
	  consistent with the library implementation of MacOS X 10.5.
	  [ruby-dev:33461]

	* configure.in (darwin): ucontext on PowerPC MacOS X 10.5 is broken.

Thu Jan 31 08:31:19 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (ext/extmk.rb, instruby.rb): inlined $(MAKE) so that can
	  be executed even with -n.

Thu Jan 31 07:00:19 2008  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/rinda/tuplespace.rb (bin_for_find): should find a symbol by
	  Symbol class.

	* test/rinda/test_rinda.rb (test_symbol_tuple): ditto.

Wed Jan 30 22:07:58 2008  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb: refined deprecated methods.

Wed Jan 30 22:06:54 2008  Tadayoshi Funaba  <tadf@dotrb.org>

	* bignum.c (rb_cstr_to_inum): '0_2' is a valid representation.

Tue Jan 29 22:40:12 2008  Yusuke Endoh  <mame@tsg.ne.jp>

	* range.c (step_i): rb_funcall receives VALUE as an argument.

Tue Jan 29 11:53:05 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: rm largefile.h.

Mon Jan 28 01:21:15 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (rb_open_file): should check NUL in path.
	  <http://www.rubyist.net/~matz/20080125.html#c01>.

	* io.c (rb_io_s_popen): ditto.

	* io.c (rb_io_reopen): ditto.

	* io.c (next_argv): ditto.

	* io.c (rb_io_s_foreach): ditto.

	* io.c (rb_io_s_readlines): ditto.

	* io.c (rb_io_s_read): ditto.

Fri Jan 25 22:33:38 2008  Yusuke Endoh  <mame@tsg.ne.jp>

	* math.c: fix comment.  [ruby-dev:33276]

Fri Jan 25 10:31:58 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* */*.bat: set svn:mime-type to text/batch.

Thu Jan 24 19:36:22 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/uri/generic.rb (URI::Generic::inspect): use Kernel#to_s instead
	  object_id with printf.  [ruby-dev:33347]

Tue Jan 22 11:22:47 2008  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/setup.mak ($(ARCH)): if a macro is appended by $(APPEND),
	  a space will be inserted on the top of the line.

	* win32/Makefile.sub (MKFILES): stop make process if Makefile is
	  updated.

Mon Jan 21 17:34:41 2008  Akinori MUSHA  <knu@iDaemons.org>

	* io.c (rb_io_mode_flags, rb_io_mode_modenum): Ignore encoding
	  options for forward compatibility.

Mon Jan 21 12:50:02 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c, gc.c (setjmp): sigsetjmp is a macro on cygwin.

Sat Jan 19 11:21:53 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (sigsetjmp): check if available.

	* eval.c, gc.c (setjmp): do not use _setjmp if sigsetjmp is available.

Sat Jan 19 11:10:11 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: Remove wrong assumptions about Cygwin.  a patch from
	  Corinna Vinschen in [ruby-Bugs-17018].

Thu Jan 17 21:06:01 2008  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb (Date::Infinity#<=>): didn't work.  A patch from
	  Dirkjan Bussink <d.bussink AT gmail.com> [ruby-core:15098].
	  This is a bug obviously.  However it didn't affect the library's
	  functions.

	* lib/date.rb, lib/date/format.rb: some trivial changes.

Tue Jan 15 15:09:28 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/setup.mak: strip out empty lines from CPP output.

Tue Jan 15 03:41:42 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (eval): check if backtrace is empty.  [ruby-core:15040]

Tue Jan 15 01:28:47 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk: simplified dummy objects dependencies.

Mon Jan 14 16:12:58 2008  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/shellwords.rb: scape should be an alias to shellescape.  a
	  patch from Masahiro Kawato <m-kawato AT mwb.biglobe.ne.jp> in
	  [ruby-dev:33060].

Mon Jan 14 09:32:40 2008  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/time.rb: do not reference Time directly from the inside of
	  definitions. [ruby-dev:33059]

Sat Jan 12 18:27:41 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_define_alloc_func, rb_undef_alloc_func): should
	  define/undef on a signleton class.  [ruby-core:09959]

Sat Jan 12 12:04:14 2008  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb, lib/date/format.rb: tuning for performance.

Fri Jan 11 12:35:56 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: moved broken syscall checks from process.c etc.

	* defines.h (WORDS_BIGENDIAN): honor __BIG_ENDIAN__ than the result of
	  configure.

	* dln.c: use dlopen on Mac OS X 10.3 or later.  backport from trunk.

	* lib/rdoc/options.rb (check_diagram): more precise check, darwin
	  is not Windows but minwg is on it.

Thu Jan 10 10:53:50 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (rb_w32_open_osfhandle): reverted to old definition.
	  [ ruby-Bugs-16948 ]

Tue Jan  8 20:02:08 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win{32,ce}/Makefile.sub: merged.

Sun Jan  6 09:39:02 2008  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb, lib/date/format.rb: introduced some constants
	  (for internal use).

	* sample/cal.rb: trivial adjustments.

Fri Jan  4 23:08:48 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* time.c (time_arg): use converted object.  [ruby-core:14759]

Fri Jan  4 01:20:21 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32.h: only VC6 needs extern "C++" for math.h.  [ruby-talk:285660]

Thu Jan  3 11:28:58 2008  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (fptr_finalize): clear errno first.  [ruby-talk:284492]

Wed Jan  2 10:18:56 2008  Tadayoshi Funaba  <tadf@dotrb.org>

	* sample/time.rb: use Process.times instead of Time.times.

Wed Jan  2 09:18:11 2008  Tadayoshi Funaba  <tadf@dotrb.org>

	* sample/goodfriday.rb: examples for date are enough.  retired.

Wed Jan  2 09:06:55 2008  Tadayoshi Funaba  <tadf@dotrb.org>

	* sample/cal.rb: just updated with the newest version.

Mon Dec 31 06:50:38 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* trunk/common.mk: not use -I$(srcdir)/lib with $(MINIRUBY) for cross
	  compiling.

	* configure.in, {win,bcc}32/Makefile.sub (MINIRUBY): -I$(srcdir)/lib
	  moved.

Sun Dec 30 22:48:37 2007  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb (_valid_time?): I'm not sure to recommend such an
	  expression.  but anyway it is acceptable now.  [ruby-core:14580]

Fri Dec 28 16:36:33 2007  NARUSE, Yui  <naruse@airemix.com>

       * lib/resolv.rb (Resolv::DNS#each_address): now returns IPv6 address.

Fri Dec 28 13:21:32 2007  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb, test/rss/test_version.rb, NEWS: 0.2.2 -> 0.2.3.

	* lib/rss/parser.rb, test/rss/test_parser.rb: supported "-" in tag name.
	  Reported by Ray Chen. Thanks.

Thu Dec 27 23:56:01 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* mkconfig.rb: should not use the libraries under the source directory
	  at cross compiling.

Thu Dec 27 11:02:45 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* intern.h, string.c (rb_str_set_len): added for upgrading path from
	  1.8 to 1.9. [ruby-dev:32807]

	* string.c (rb_str_lines, rb_str_bytes): ditto.

Thu Dec 27 10:47:32 2007  Technorama Ltd.  <oss-ruby@technorama.net>

	* ext/openssl/ossl_ssl.c: Only show a warning if the default
	  DH callback is actually used.

	* ext/openssl/ossl_rand.c: New method: random_add().

Wed Dec 26 22:27:45 2007  NARUSE, Yui <naruse@ruby-lang.org>

	* lib/resolv.rb (Resolv::DNS::Name.==): fix for other is array of
	  Resolv::DNS::Label::Str.

	* lib/resolv.rb (Resolv::DNS::MessageEncoder#put_label): String#string
	  is not defined, so replace to_s.

	* lib/resolv.rb (Resolv::IPv6#to_name): ip6.int is obsoleted by
	  int.arpa.

Mon Dec 24 16:18:57 2007  Eric Hodel  <drbrain@segment7.net>

	* lib/rdoc/ri/ri_options.rb:  Fix ri --help listing of gem ri paths.
	  Merge of r14567 and r14569 from trunk.

	* lib/rdoc/ri/ri_paths.rb:  Fix duplication of ri data for multiple
	  gems.  Merge of r14567 from trunk

Mon Dec 24 12:35:03 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win{32,ce}/Makefile.sub (MFLAGS): defaulted to -l.

Mon Dec 24 11:56:31 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* {bcc32,win{32,ce}}/Makefile.sub (SET_MAKE): set MFLAGS which is not
	  set by default, to get rid of chaotic situation of MFLAGS/MAKEFLAGS.

Sat Dec 22 14:49:46 2007  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb: don't freeze nil even if 1.8 will not be aware of
	  the issue. [ruby-dev:32677]

Wed Dec 19 13:57:43 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (TIMEZONE_VOID): check whether timezone requires zero
	  arguments.  [ruby-dev:32631]

Wed Dec 19 12:01:42 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (f_rest_arg): check if duplicated.  [ruby-core:14140]

Wed Dec 19 10:52:29 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (rb_cstr_to_inum): an underscore succeeding after octal
	  prefix is allowed.  [ruby-core:14139]

Mon Dec 17 13:43:15 2007  Tanaka Akira  <akr@fsij.org>

	* gc.c (stack_end_address): use local variable address instead of
	  __builtin_frame_address(0) to avoid SEGV on SunOS 5.11 on x86 with
	  gcc (GCC) 3.4.3 (csl-sol210-3_4-20050802).
	  stack_end_address returned a frame address of garbage_collect
	  since stack_end_address doesn't create its own frame.
	  So a VALUE stored in a callee saved register, %edi, pushed into
	  the stack at the beginning of garbage_collect was not marked.

Mon Dec 17 12:21:25 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* Makefile.in (RUNRUBY): added RUNRUBYOPT.

Fri Dec 14 12:36:35 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (RUBY_CHECK_VARTYPE): check if a variable is defined
	  and its type.

	* configure.in (timezone, altzone): check for recent cygwin.

	* missing/strftime.c (strftime): fix for timezone.  [ruby-dev:32536]

	* lib/mkmf.rb (try_var): should fail for functions.

	* ext/readline/extconf.rb: should use have_func for functions instead
	  of have_var.

Tue Dec 11 00:04:05 2007  Akinori MUSHA  <knu@iDaemons.org>

	* array.c (rb_ary_slice_bang): If an invalid negative index (<
	  -size) is given, do not raise an exception but return nil just
	  like slice() does.

	* test/ruby/test_array.rb (TestArray::test_slice,
	  TestArray::test_slice!): Pull in test cases from trunk.

Mon Dec 10 21:47:53 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* transcode.c (str_transcode): allow non-registered encodings.
	  [ruby-dev:32520]

Mon Dec 10 21:00:30 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_slice_bang): should return nil if position out
	  of range.  a patch from Akinori MUSHA <knu AT iDaemons.org>.
	  [ruby-dev:32518]

Mon Dec 10 18:28:06 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/uri/common.rb (URI::REGEXP::PATTERN): typo in REG_NAME
	  regular expression.  a patch from Ueda Satoshi
	  <s-ueda AT livedoor.jp>.  [ruby-dev:32514]

Sun Dec  9 12:39:01 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/cgi.rb (read_multipart): exclude blanks from header values.
	  [ruby-list:44327]

Wed Dec  5 23:38:50 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* range.c (range_each): followed step_i change.

Wed Dec  5 18:08:45 2007  Tanaka Akira  <akr@fsij.org>

	* numeric.c (int_odd_p): new method Integer#odd?.
	  (int_even_p): new method Integer#even?.
	  (int_pred): new method Integer#pred.
	  (fix_odd_p): new method Fixnum#odd?.
	  (fix_even_p): new method Fixnum#even?.

Wed Dec  5 15:15:21 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* range.c (step_i, range_step): support non-fixnum steps.
	  [ruby-talk:282100]

Tue Dec  4 11:23:50 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (rb_cstr_to_inum): trailing spaces may exist at sqeezing
	  preceeding 0s.  [ruby-core:13873]

Sun Dec  2 22:43:45 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (error_print): put newline unless multiple line message ends
	  with a newline.  [ruby-dev:32429]

Sun Dec  2 15:49:20 2007  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb, test/rss/test_version.rb, NEWS: 0.2.1 -> 0.2.2.

	* lib/rss/maker/itunes.rb: fixed new_itunes_category.
	* lib/rss/maker/taxonomy.rb: new_taxo_topic -> new_topic because
	  of consistency.

	* test/rss/test_maker_itunes.rb, test/rss/test_itunes.rb: removed
	  needless UTF-8 characters.

Sun Dec  2 01:12:15 2007  James Edward Gray II  <jeg2@ruby-lang.org>

	Merged 14070 from trunk.

	* lib/xmlrpc/server.rb (XMLRPC::Server#server): Improve signal handling so
	  pressing control-c in the controlling terminal or sending SIGTERM stops
	  the XML-RPC server.

Sat Dec  1 15:13:33 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/resolv.rb: documentation update.  backported from 1.9.
	  [ruby-core:13273]

Sat Dec  1 03:30:47 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (newline_node): set line from outermost node before removing
	  NODE_BEGIN.  [ruby-dev:32406]

Fri Nov 30 21:53:28 2007  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb, test/rss/test_version.rb: 0.2.0 -> 0.2.1.

	* lib/rss/content.rb, lib/rss/content/1.0.rb,
	  lib/rss/content/2.0.rb, lib/rss/maker/content.rb,
	  test/rss/rss-testcase.rb, test/rss/test_content.rb,
	  test/rss/test_maker_content.rb: supported content:encoded with RSS
	  2.0.
	  Suggested by Sam Lown. Thanks.

	* NEWS: added the above changes.

Thu Nov 29 16:59:10 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (stmt): remove unnecessary NODE_BEGIN.  [ruby-core:13814]

Wed Nov 28 14:43:14 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb (extract_makefile): use dldflags instead of DLDFLAGS to
	  get rid of mixing $LDFLAGS and $ARCH_FLAG.

	* lib/mkmf.rb (configuration): ditto.

	* lib/mkmf.rb (create_makefile): support for extensions which has no
	  shared object.

Wed Nov 28 09:51:42 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (rb_big2str0): do not clobber space for sign.

	* sprintf.c (remove_sign_bits): extends sign bit first.

Wed Nov 21 01:04:12 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* object.c (nil_plus): remove unused function.  [ruby-core:13737]

Sun Nov 18 14:03:44 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_alias): do not call hook functions until initialization
	  finishes.  [ruby-talk:279538]

Sun Nov 18 09:09:48 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (String#tr_cpp): make preprocessor identifiers.

Sat Nov 17 13:58:11 2007  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c (ole_invoke): bug fix. [ruby-talk:279100]

Fri Nov 16 17:41:34 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/iconv/iconv.c (Document-class): moved the simplest example to
	  the top.

	* ext/iconv/iconv.c (iconv_s_iconv): Document-method: needs class
	  prefix for class method.  [ruby-core:13542]

	* ext/iconv/iconv.c (iconv_iconv): also instance method needs to be
	  qualified.

Fri Nov 16 11:16:41 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/yaml/rubytypes.rb (String#is_binary_data?): use Integer#fdiv.

Thu Nov 15 19:50:46 2007  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/curses/extconf.rb: check macro if cannot find func.
	  [ruby-list:44224]

Thu Nov 15 12:19:14 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/cgi/session.rb (CGI::Session::FileStore::restore): use
	  lockfile for exclusive locks.  a patch from <tommy AT tmtm.org>.
	  [ruby-dev:32296]

Wed Nov 14 01:52:59 2007  Tanaka Akira  <akr@fsij.org>

	* missing/isinf.c (isinf): don't define if the macro is defined.

Wed Nov 14 01:34:42 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* numeric.c (round): fallback definition.

	* numeric.c (flo_divmod, flo_round): use round() always.
	  [ruby-dev:32269]

Tue Nov 13 22:02:23 2007  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb: remove Thread.exclusive.

	* lib/drb/extservm.rb: ditto.

Tue Nov 13 16:33:07 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* numeric.c (flodivmod): work around for infinity.

	* numeric.c (flo_divmod): work around for platforms have no round().
	  [ruby-dev:32247]

Tue Nov 13 13:58:51 2007  Tanaka Akira  <akr@fsij.org>

	* numeric.c (numeric.c): Integer#ord implemented.  [ruby-dev:32206]

Tue Nov 13 02:57:04 2007  URABE Shyouhei  <shyouhei@ice.uec.ac.jp>

	* numeric.c (flo_divmod): round to the nearest integer.
	  [ ruby-Bugs-14540 ]

Mon Nov 12 16:52:29 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (create_makefile): rdoc about srcprefix.  a patch from
	  Daniel Berger <djberg96 AT gmail.com> in [ruby-core:13378].

Mon Nov 12 13:53:06 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* misc/ruby-mode.el (ruby-parse-partial): handle stringified
	  symbols properly using ruby-forward-string.

Mon Nov 12 12:38:31 2007  Tanaka Akira  <akr@fsij.org>

	* Makefile.in (lex.c): don't remove lex.c at first.

Fri Nov  9 07:26:04 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* random.c: update MT URL.[ruby-core:13305].

Wed Nov  7 03:32:38 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/rexml/encodings/SHIFT-JIS.rb (REXML::Encoding): place -x for
	  nkf conversion.  a patch from <moonwolf AT moonwolf.com>.
	  [ruby-dev:32183]

Mon Nov  5 05:17:04 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb (OptionParser::Switch::summarize): fix for long form
	  option with very long argument.  a patch from Kobayashi Noritada
	  <nori1 AT dolphin.c.u-tokyo.ac.jp> in [ruby-list:44179].

Mon Nov  5 01:20:33 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (call_args): remove "parenthesize argument(s) for future
	  version" warning.  when I added this warning, I had a plan to
	  reimplement the parser that is simpler than the current one.
	  since we abandoned the plan, warning no longer required.

Fri Nov  2 00:13:51 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_assoc): check and convert inner arrays (assocs)
	  using #to_ary.

	* hash.c (rb_hash_s_create): check and convert argument hash
	  using #to_hash.

	* hash.c (rb_hash_s_create): Hash#[] now takes assocs as source of
	  hash conversion.

Thu Nov  1 23:47:43 2007  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb (DRbTCPSocket): Improving with multiple network
	  interface.

	* test/drb/drbtest.rb: ditto.

Fri Oct 26 17:14:14 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* numeric.c (fix_pow): returns 1.0 for 0**0.0.

	* numeric.c (fix_pow): returns infinity for 0**-1.  [ruby-dev:32084]

Wed Oct 25 07:18:09 2007  James Edward Gray II  <jeg2@ruby-lang.org>

	Merged 13781 from trunk.

	* lib/net/telnet.rb (Net::Telnet#login): Allowing "passphrase" in
	  addition to "password" for Telnet login prompts. [ruby-Bugs-10746]

Wed Oct 25 06:46:21 2007  James Edward Gray II  <jeg2@ruby-lang.org>

	Merged 13779 from trunk.

	* lib/net/telnet.rb (Net::Telnet#login): Making the password prompt
	  pattern case insensitive. [ruby-Bugs-10746]

Thu Oct 25 14:19:33 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_tell, rb_io_seek): check errno too.  [ruby-dev:32093]

Wed Oct 25 08:03:53 2007  James Edward Gray II  <jeg2@ruby-lang.org>

	Merged 13767, 13768, 13769, and 13770 from trunk.

	* lib/xmlrpc/parser.rb (XMLRPC::Convert::dateTime): Fixing a bug that
	  caused time zone conversion to fail for some ISO 8601 date formats.
	  [ruby-Bugs-12677]

	* lib/xmlrpc/client.rb (XMLRPC::Client#do_rpc): Explicitly start
	  the HTTP connection to support keepalive requests. [ruby-Bugs-9353]

	* lib/xmlrpc/client.rb (XMLRPC::Client#do_rpc): Improving the error
	  message for Content-Type check failures. [ruby-core:12163]

	* lib/xmlrpc/utils.rb (XMLRPC::ParseContentType#parse_content_type):
	  Making Content-Type checks case insensitive. [ruby-Bugs-3367]

Sun Oct 21 21:16:43 2007  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss.rb, lib/rss/, test/rss/, sample/rss/: merged from trunk.
	- 0.1.6 -> 2.0.0.
	- fixed image module URI. Thanks to Dmitry Borodaenko.
	- supported Atom.
	- supported ITunes module.
	- supported Slash module.

	* NEWS: added an entry for RSS Parser.

Thu Oct 18 10:57:06 2007  Tanaka Akira  <akr@fsij.org>

	* ruby.h (RCLASS_IV_TBL): defined.
	  (RCLASS_M_TBL): ditto.
	  (RCLASS_SUPER): ditto.
	  (RMODULE_IV_TBL): ditto.
	  (RMODULE_M_TBL): ditto.
	  (RMODULE_SUPER): ditto.

Mon Oct 15 22:08:55 2007  Akinori MUSHA  <knu@iDaemons.org>

	* NEWS: Merge some of the sub-sections, as the differences were
	  unclear.

Mon Oct 15 21:57:07 2007  Akinori MUSHA  <knu@iDaemons.org>

	* NEWS: Mention ipaddr enhancements.

	* lib/ipaddr.rb (in_addr, in6_addr, addr_mask): Make some minor
	  code optimization.

	* lib/ipaddr.rb (<=>): Implement IPAddr#<=> and make IPAddr
	  comparable.

	* lib/ipaddr.rb (succ): Implement IPAddr#succ.  You can now create
	  a range between two IPAddr's, which (Range) object is
	  enumerable.

	* lib/ipaddr.rb (to_range): A new method to create a Range object
	  for the (network) address.

	* lib/ipaddr.rb (coerce_other): Support type coercion and make &,
	  |, == and include? accept a string or an integer instead of an
	  IPAddr object as the argument.

	* lib/ipaddr.rb (initialize): Give better error messages.

	* lib/ipaddr.rb: Improve documentation.

Mon Oct 15 21:24:25 2007  Akinori MUSHA  <knu@iDaemons.org>

	* NEWS: Mention shellwords and tempfile enhancements.

	* NEWS: Move the entry about Tk::X_Scrollable to a better section.

Mon Oct 15 17:28:20 2007  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/openssl/lib/openssl/buffering.rb (read, readpartial): revert
	  r12496. handling EOF is a little differnt in ruby 1.8 and ruby 1.9.
	  [ruby-dev:31979]

Mon Oct 15 11:45:12 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (r_bytes0): refined length check.  [ruby-dev:32059]

Mon Oct 15 09:58:07 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (r_bytes0): check if source has enough data.
	  [ruby-dev:32054]

Mon Oct 15 01:15:09 2007  Tanaka Akira  <akr@fsij.org>

	* ext/socket/socket.c (s_accept_nonblock): make accepted fd
	  nonblocking.  [ruby-talk:274079]

Sun Oct 14 04:08:34 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (AC_SYS_LARGEFILE): keep results also in command
	  options, to vail out of mismatch.  [ruby-list:44114]

	* mkconfig.rb, lib/mkmf.rb (configuration): add DEFS.

Sun Oct 14 03:55:52 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/mkexports.rb: deal with __fastcall name decorations.
	  [ruby-list:44111]

Sat Oct 13 09:02:16 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* {bcc,win}32/mkexports.rb: explicit data.  [ruby-list:44108]

Sat Oct 13 00:35:03 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/rexml/source.rb (REXML::SourceFactory::SourceFactory): typo
	  fixed.  [ruby-list:44099]

Fri Oct 12 11:22:15 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* re.c (match_values_at): make #select to be alias to #values_at
	  to adapt RDoc description.  [ruby-core:12588]

Thu Oct 11 14:32:46 2007  NAKAMURA Usaku  <usa@ruby-lang.org>

	* {bcc32,win32}/Makefile.sub (COMMON_MACROS): workaround for old SDK's
	  bug. [ruby-core:12584]

Wed Oct 10 23:34:45 2007  Tanaka Akira  <akr@fsij.org>

	* lib/securerandom.rb: new file.  [ruby-dev:31928]

	* lib/cgi/session.rb (create_new_id): use securerandom if available.

Tue Oct  9 01:01:55 2007  Tanaka Akira  <akr@fsij.org>

	* re.c (rb_reg_s_union_m): Regexp.union accepts single
	  argument which is an array of patterns.  [ruby-list:44084]

Mon Oct  8 20:06:23 2007  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/net/http.rb, lib/open-uri.rb: remove
	  Net::HTTP#enable_post_connection_check.  [ruby-dev:31960]

	* lib/net/imap.rb: hostname should be verified against server's
	  indentity as persented in the server's certificate. [ruby-dev:31960]

	* ext/openssl/lib/net/telnets.rb, ext/openssl/lib/net/ftptls.rb: ditto.

Sat Oct  6 23:14:54 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_to_i): update RDoc since base can be any value
	  between 2 and 36.  [ruby-talk:272879]

Fri Oct  5 15:44:50 2007  Akinori MUSHA  <knu@iDaemons.org>

	* lib/shellwords.rb: Add shellescape() and shelljoin().

	* lib/shellwords.rb: Rename shellwords() to shellsplit() and make
	  the former an alias to the latter.

	* lib/shellwords.rb: Add escape(), split(), join() as class
	  methods, which are aliases to their respective long names
	  prefixed with `shell'.

	* lib/shellwords.rb: Add String#shellescape(), String#shellsplit()
	  and Array#shelljoin() for convenience.

Fri Oct  5 15:40:04 2007  Akinori MUSHA  <knu@iDaemons.org>

	* lib/tempfile.rb (Tempfile::make_tmpname): Allow to specify a
	  suffix for a temporary file name.

	* lib/tempfile.rb (Tempfile::make_tmpname): Make temporary file
	  names less predictable by including a random string.
	  [inspired by: akr]

Tue Oct  2 21:20:14 2007  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (make_cmdvector): adjust escaped successive
	  double-quote handling. (merge from trunk)

Tue Oct  2 20:35:24 2007  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (init_env): initialize HOME and USER environment
	  variables unless set. [ruby-core:12328] (merge from trunk)

	* win32/win32.c (NtInitialize, getlogin): ditto.

	* configure.in, win32/Makefile.sub (LIBS): need to link shell32
	  library for SH* functions on mswin32 and mingw32.

Mon Oct  1 12:50:59 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* gc.c (id2ref): valid id should not refer T_VALUE nor T_ICLASS.
	  [ruby-dev:31911]

Wed Sep 26 23:54:37 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb (extmake), lib/mkmf.rb (configuration): top_srcdir
	  should not prefixed with DESTDIR.

Wed Sep 26 08:36:31 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* Makefile.in (ext/extinit.o): use $(OUTFLAG) as well as other
	  objects.  [ruby-Bugs-14228]

Wed Sep 26 05:12:17 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (yyerror): limit error message length.  [ruby-dev:31848]

	* regex.c (re_mbc_startpos): separated from re_adjust_startpos.

Tue Sep 25 13:47:38 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (remove_method): should not remove undef place holder.
	  [ruby-dev:31817]

Mon Sep 24 16:52:11 2007  Urabe Shyouhei  <shyouhei@ruby-lang.org>

	* lib/net/http.rb: fix typo.

Sun Sep 23 21:57:25 2007  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/net/http.rb: an SSL verification (the server hostname should
	  be matched with its certificate's commonName) is added.
	  this verification can be skipped by
	  "Net::HTTP#enable_post_connection_check=(false)".
	  suggested by Chris Clark <cclark at isecpartners.com>

	* lib/net/open-uri.rb: use Net::HTTP#enable_post_connection_check to
	  perform SSL post connection check.

	* ext/openssl/lib/openssl/ssl.c
	  (OpenSSL::SSL::SSLSocket#post_connection_check): refine error message.

Sun Sep 23 09:05:05 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (os_obj_of, os_each_obj): hide objects to be finalized.
	  [ruby-dev:31810]

Sun Sep 23 08:58:01 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval_method.ci (rb_attr): should not use alloca for unknowen size
	  input.  [ruby-dev:31816]

	* parse.y (rb_intern_str): prevent str from optimization.

Sun Sep 23 05:42:35 2007  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* lib/rdoc/options.rb (Options::check_diagram): dot -V output
	  changed. [ ruby-Bugs-11978 ], Thanks Florian Frank.

Sat Sep 22 06:02:11 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb (OptionParser::List::summarize): use each_line if
	  defined rather than each.  [ruby-Patches-14096]

Sat Sep 22 05:19:49 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c (strio_init): separate from strio_initialize
	  to share with strio_reopen properly.  [ruby-Bugs-13919]

Fri Sep 21 15:46:20 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* process.c (struct rb_exec_arg): proc should be a VALUE.

	* process.c (rb_f_exec): suppress a warning.

Fri Sep 21 03:05:35 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c, intern.h, ext/thread/thread.c: should not free queue while
	  any live threads are waiting.  [ruby-dev:30653]

Thu Sep 20 17:24:59 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* process.c (rb_detach_process): cast for the platforms where size of
	  pointer differs from size of int.

	* process.c (rb_f_exec, rb_f_system): should not exceptions after
	  fork.  [ruby-core:08262]

Fri Sep 14 00:34:25 2007  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/extservm.rb (invoke_service): use Thread.exclusive instead of
	  Thread.critical

Wed Sep 12 23:12:22 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ruby.c (proc_options): -W should be allowed in RUBYOPT
	  environment variable.  [ruby-core:12118]

Mon Sep 10 01:05:25 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* range.c (range_step): fixed integer overflow.  [ruby-dev:31763]

Sun Sep  9 09:14:45 2007  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date/format.rb (_strptime): now also attaches an element
	  which denotes leftover substring if exists.

Sat Sep  8 10:22:20 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* struct.c (rb_struct_s_members): should raise TypeError instead
	  of call rb_bug().  [ruby-dev:31709]

	* marshal.c (r_object0): no nil check require any more.

Sat Sep  8 09:38:19 2007  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date/format.rb (str[fp]time): now check specifications more
	  strictly.

Fri Sep  7 05:36:19 2007  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* test/rinda/test_rinda.rb (MockClock): correct synchronous problems
	  of the MultiThreading. [ruby-dev:31692]

Wed Sep  5 22:02:27 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_subseq): need integer overflow check.
	  [ruby-dev:31736]

	* array.c (rb_ary_splice): ditto.  [ruby-dev:31737]

	* array.c (rb_ary_fill): ditto.  [ruby-dev:31738]

	* string.c (rb_str_splice): integer overflow for length.
	  [ruby-dev:31739]

Sun Sep  2 00:48:15 2007  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date/format.rb (_parse): improved parsing of ordinal dates.

	* lib/date/format.rb (_parse): use named character classes in some
	  regular expressions.

Sat Sep  1 08:13:36 2007  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c: add WIN32OLE#ole_activex_initialize.

Thu Aug 30 13:13:13 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (try_const, have_const): check for a const is defined.
	  [ruby-core:04422]

Thu Aug 30 13:10:57 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (group_member): check if presents.

	* configure.in (XCFLAGS): add _GNU_SOURCE on linux.

	* file.c (group_member): use system routine if available.

Thu Aug 30 08:24:18 2007  Tanaka Akira  <akr@fsij.org>

	* ruby.h (RHASH_TBL): defined for compatibility to 1.9.
	* (RHASH_ITER_LEV): ditto.
	* (RHASH_IFNONE): ditto.
	* (RHASH_SIZE): ditto.
	* (RHASH_EMPTY_P): ditto.

Wed Aug 29 13:05:59 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* include/ruby/defines.h (flush_register_windows): call "ta 0x03"
	  even on Linux/Sparc.  [ruby-dev:31674]

Tue Aug 28 23:26:12 2007  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c (ole_type_progid, reg_enum_key,
	  reg_get_val, ole_wc2mb): fix the bug. Thanks, arton.
	  [ruby-dev:31576]

Mon Aug 27 19:10:50 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/etc/etc.c (etc_getlogin): update documentation to note
	  security issue.  [ruby-Bugs-11821]

Tue Aug 21 21:09:48 2007  Tanaka Akira  <akr@fsij.org>

	* lib/tmpdir.rb (Dir.mktmpdir): make directory suffix specifiable.

Tue Aug 21 13:57:04 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (st_foreach_func, rb_foreach_func): typedefed.

Mon Aug 20 17:25:33 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (mnew): should preserve noex as safe_level.

	* eval.c (rb_call0): tighten security check condition..

Sat Aug 18 21:32:20 2007  Tanaka Akira  <akr@fsij.org>

	* lib/tmpdir.rb (Dir.mktmpdir): new method.
	  [ruby-dev:31462]

Sat Aug 18 17:44:42 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/tk/tcltklib.c (Init_tcltklib): use rb_set_end_proc().

Sat Aug 18 15:59:52 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* process.c (detach_process_watcher): should not pass the pointer
	  to an auto variable to the thread to be created.  pointed and
	  fix by KUBO Takehiro <kubo at jiubao.org>  [ruby-dev:30618]

Sat Aug 18 12:24:30 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* sample/test.rb, test/ruby/test_system.rb(valid_syntax?): keep
	  comment lines first.

Thu Aug 16 20:40:50 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* bignum.c (bigtrunc): RBIGNUM(x)->len may be zero.  out of bound
	  access.  [ruby-dev:31404]

Thu Aug 16 16:46:07 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (aix): enable shared by default.

	* configure.in (aix): for 64bit-mode AIX.  [ruby-dev:31401]
	  + use CC for LDSHARED if non-gcc,
	  + moved -G option from *LDFLAGS to LDSHARED,
	  + set -brtl only in XLDFLAGS.

Thu Aug 16 13:06:08 2007  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big_lshift): make shift offset long type.
	  (big_rshift): ditto.
	  (rb_big_lshift): ditto.
	  (big_rshift): ditto.
	  [ruby-dev:31434]

Thu Aug 16 04:09:19 2007  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/rinda/tuplespace.rb (Rinda::TupleSpace#start_keeper): improve
	  keeper thread.

Wed Aug 15 13:50:10 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (rb_hash_delete_key): delete the entry without calling block.

	* hash.c (rb_hash_shift): should consider iter_lev too.

	* hash.c (delete_if_i): use rb_hash_delete_key() so that the block
	  isn't called twice.  [ruby-core:11556]

Sun Arg 12 03:56:30 2007  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/rinda/tuplespace.rb: fix Rinda::TupleSpace keeper thread bug.
	  the thread is started too early. [ruby-talk:264062]

	* test/rinda/test_rinda.rb: ditto.

Sat Aug 11 07:34:10 2007  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date/format.rb: reverted some wrongly erased "o" options
	  (pointed out by nobu).

Tue Aug  7 14:58:39 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/pty/pty.c (establishShell): handshaking before close slave
	  device.  [ruby-talk:263410]

	* ext/pty/pty.c (MasterDevice, SlaveDevice, deviceNo): constified.

	* ext/pty/pty.c (SlaveName): removed static buffer.

	* ext/pty/expect_sample.rb: support for autologin.

Tue Aug  7 12:45:13 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (ac_cv_func_isinf): set yes also on OpenSolaris.
	  [ruby-Bugs-12859]

Mon Aug  6 17:36:29 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/rexml/encodings/{ISO-8859-15,CP-1252}.rb: fixed invalid syntax.

Fri Aug  3 11:05:54 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb (extmake): save all CONFIG values.

	* ext/extmk.rb (extmake): remove mkmf.log at clean, and extconf.h at
	  distclean, respectively.

	* ext/extmk.rb: remove rdoc at clean, and installed list file at
	  distclean, respectively.

Fri Aug  3 07:09:05 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb: more verbose message.  [ruby-Bugs-12766]

	* lib/mkmf.rb (have_type): suppress a warning with -Wall.

	* lib/mkmf.rb (find_type): new method.

Thu Aug  2 13:46:39 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* sprintf.c (rb_f_sprintf): should not check positional number as
	  width.  [ruby-core:11838]

Mon Jul 30 11:16:40 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (rb_big_aref): check for Bignum index range.
	  [ruby-dev:31271]

Sat Jul 28 09:35:41 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/digest/lib/digest.rb (Digest::self.const_missing): avoid
	  infinite recursive const_missing call.  [ruby-talk:262193]

Thu Jul 26 13:57:45 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dln.c (load_1, dln_find_1): constified.

	* dln.c (conv_to_posix_path): removed.

	* ruby.c (usage): constified.

	* ruby.c (rubylib_mangled_path, rubylib_mangled_path2): return
	  VALUE instead of a pointer to static buffer.

	* ruby.c (push_include_cygwin): fixed buffer overflow.
	  [ruby-dev:31297]

	* ruby.c (ruby_init_loadpath): not convert built-in paths.

Sun Jul 22 16:07:12 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* intern.h (is_ruby_native_thread): removed since declared as an int
	  function in ruby.h already.

Sun Jul 22 14:33:40 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_file_s_rename): deleted code to get rid of a bug of
	  old Cygwin.

	* file.c (rb_file_truncate): added prototype of GetLastError()
	  on cygwin.  [ruby-dev:31239]

	* intern.h (is_ruby_native_thread): prototype.

	* missing/strftime.c (strftime): fix printf format and actual
	  arguments.

	* ext/Win32API/Win32API.c (Win32API_initialize): ditto.

	* ext/tk/tcltklib.c (ip_finalize): ditto.

	* ext/dl/ptr.c (rb_dlptr_inspect): ditto.  [ruby-dev:31268]

	* ext/dl/sym.c (rb_dlsym_inspect): ditto.

	* ext/socket/getnameinfo.c: include stdio.h always.

	* ext/win32ole/win32ole.c (ole_hresult2msg, folevariable_name,
	  folevariable_ole_type, folevariable_ole_type_detail,
	  folevariable_value, folemethod_visible): missing return value.

Sat Jul 21 17:48:26 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (create_makefile): make OBJS depend on RUBY_EXTCONF_H
	  only if extconf.h is created.

	* bcc32/{Makefile.sub,configure.bat,setup.mak: configure_args
	  support.

	* bcc32/setup.mak: check runtime version.

	* win32/win32.c (rb_w32_open_osfhandle): prototype has changed
	  in bcc 5.82.

	* {win32,wince,bcc32}/setup.mak (-version-): no RUBY_EXTERN magic.

	* win32/resource.rb: include patchlevel number.

Sat Jul 21 12:06:48 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (init_mkmf): should remove mkmf.log too.

Sat Jul 21 01:53:17 2007  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date/format.rb (Date._parse): completes calendar week based year.

	* lib/date/format.rb (Date._parse): detects year of ordinal date in
	  extended format.

Fri Jul 20 15:22:51 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/openssl/ossl_config.c (ossl_config_set_section): do not
	  initialize aggregations with dynamic values.  [ruby-talk:259306]

Thu Jul 19 19:24:14 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (get_backtrace): check the result more.
	  [ruby-dev:31261] [ruby-bugs-12398]

Thu Jul 19 14:38:45 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (rb_big_lshift, rb_big_rshift): separated functions
	  to get rid of infinite recursion.  fixed calculation in edge
	  cases.  [ruby-dev:31244]

	* numeric.c (rb_fix_lshift, rb_fix_rshift): ditto.

Wed Jul 18 16:57:41 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (rb_big_pow): refine overflow check.  [ruby-dev:31242]

Wed Jul 18 08:47:09 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* time.c (time_succ): Time#succ should return a time object in the
	  same timezone mode to the original.  [ruby-talk:260256]

Tue Jul 17 00:50:53 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* numeric.c (fix_pow): integer power calculation: 0**n => 0,
	  1**n => 1, -1**n => 1 (n: even) / -1 (n: odd).

	* test/ruby/test_fixnum.rb (TestFixnum::test_pow): update test
	  suite.  pow(-3, 2^64) gives NaN when pow(3, 2^64) gives Inf.

Mon Jul 16 23:07:51 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/base64.rb (Base64::b64encode): should not specify /o option
	  for regular expression.  [ruby-dev:31221]

Mon Jul 16 18:29:33 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_rindex_m): accept string-like object convertible
	  with #to_str method, as well as rb_str_index_m.  [ruby-core:11692]

Mon Jul 16 05:45:53 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* sprintf.c (rb_f_sprintf): more checks for format argument.
	  [ruby-core:11569], [ruby-core:11570], [ruby-core:11571],
	  [ruby-core:11573]

Mon Jul 16 00:26:10 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (rb_big_pow): removed invariant variable.  [ruby-dev:31236]

Sun Jul 15 23:59:57 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (rb_big_neg): SIGNED_VALUE isn't in 1.8.

Sun Jul 15 22:24:49 2007  pegacorn  <subscriber.jp AT gmail.com>

	* ext/digest/digest.c (rb_digest_instance_update,
	  rb_digest_instance_finish, rb_digest_instance_reset,
	  rb_digest_instance_block_length): %s in rb_raise() expects char*.
	  [ruby-dev:31222]

	* ext/openssl/ossl.h: include ossl_pkcs5.h.  [ruby-dev:31231]

	* ext/openssl/ossl_pkcs5.h: new file for PKCS5.  [ruby-dev:31231]

	* ext/openssl/ossl_x509name.c (ossl_x509name_to_s): use ossl_raise()
	  instead of rb_raise().  [ruby-dev:31222]

	* ext/sdbm/_sdbm.c: DOSISH platforms need io.h.  [ruby-dev:31232]

	* ext/syck/syck.h: include stdlib.h for malloc() and free().
	  [ruby-dev:31232]

	* ext/syck/syck.h (syck_parser_set_input_type): prototype added.
	  [ruby-dev:31231]

	* win32/win32.c: include mbstring.h for _mbspbrk().  [ruby-dev:31232]

	* win32.h (rb_w32_getcwd): prototype added.  [ruby-dev:31232]

Sun Jul 15 21:07:43 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (bigtrunc): do not empty Bignum.  [ruby-dev:31229]

Sun Jul 15 19:05:28 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (rb_cstr_to_inum): check leading non-digits.
	  [ruby-core:11691]

Sun Jul 15 04:42:20 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (get2comp): do nothing for empty Bignum.  [ruby-dev:31225]

Sat Jul 14 14:04:06 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enum.c (sort_by_cmp): check if reentered.  [ruby-dev:24291]

Sat Jul 14 12:44:14 2007  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/openssl/test_pkcs7.rb: reverted the previous patch.  it should
	  be as it was to check interface compatibility.  sorry for bothering
	  with this.

Sat Jul 14 12:16:17 2007  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/openssl/test_pkcs7.rb: follow the library change.  applied a
	  patch from <zn at mbf.nifty.com> [ruby-dev:31214].
	  NOTE: r12496 imports the latest openssl libs from trunk to ruby_1_8
	  though its's not ChangeLog-ed.  maintainer should aware that.

Sat Jul 14 02:51:52 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* numeric.c (fix_pow): 0**2 should not raise floating point
	  exception.  [ruby-dev:31216]

Sat Jul 14 02:25:48 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* numeric.c (int_pow): wrong overflow detection.  [ruby-dev:31213]

	* numeric.c (int_pow): wrong overflow detection.  [ruby-dev:31215]

Fri Jul 13 16:10:00 2007  Tanaka Akira  <akr@fsij.org>

	* lib/open-uri.rb (URI::Generic#find_proxy): use ENV.to_hash to access
	  http_proxy environment variable to avoid case insensitive
	  environment search.

Fri Jul 13 15:02:15 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (CreateChild): enclose command line except for
	  command.com which can not handle quotes.  [ruby-talk:258939]

Fri Jul 13 10:10:46 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (link_command, cc_command, cpp_command): do not expand
	  ::CONFIG which is an alias of MAKEFILE_CONFIG.

Thu Jul 12 17:03:15 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* struct.c (rb_struct_init_copy): disallow changing the size.
	  [ruby-dev:31168]

Wed Jul 11 23:38:14 2007  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* random.c: documentation fix.  srand(0) initializes PRNG with '0',
	  not with random_seed.

Tue Jul 10 14:50:01 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bcc32/{Makefile.sub,setup.mak}: remove surplus slash from srcdir.

Fri Jul  6 15:22:58 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_interrupt): suppress a gcc's officious warning.

Thu Jul  5 16:44:28 2007  NAKAMURA Usaku  <usa@ruby-lang.org>

	* numeric.c (int_pow): fix previous nubu's commit.

	* test/ruby/test_fixnum.rb: new test.

Thu Jul  5 15:56:06 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* numeric.c (int_pow): even number multiplication never be negative.

Mon Jul  2 14:34:43 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* sprintf.c (rb_f_sprintf): sign bit extension should not be done
	  if FPLUS flag is specified.  [ruby-list:39224]

Sat Jun 30 16:05:41 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_initialize): should call rb_ary_modify() first.
	  [ruby-core:11562]

Sat Jun 30 00:17:00 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (yylex): return non-valid token for an invalid
	  instance/class variable name.  a patch from Yusuke ENDOH
	  <mame AT tsg.ne.jp>.  [ruby-dev:31095]

Fri Jun 29 11:23:09 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (dsym): return non-null NODE even if yyerror().  based on a
	  patch from Yusuke ENDOH <mame AT tsg.ne.jp>.  [ruby-dev:31085]

Tue Jun 26 16:35:21 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* process.c (ruby_setreuid, ruby_setregid): rename to get rid of name
	  clash.

	* process.c (proc_exec_v, rb_proc_exec): preserve errno.

Sat Jun 23 00:37:46 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* hash.c (rb_hash_select): remove unnecessary varargs for
	  rb_hash_select.  a patch from Daniel Berger
	  <Daniel.Berger at qwest.com>.   [ruby-core:11527]

	* hash.c: ditto.

Mon Jun 18 08:47:54 2007  Technorama Ltd.  <oss-ruby@technorama.net>

	* ext/openssl/{extconf.rb,ossl_ssl_session.c}:
	  Fix ruby-Bugs-11513.

	* ext/openssl/ossl_pkey_ec.c
	  New methods EC::Point.[eql,make_affine!,invert!,on_curve?,infinity?]
	  By default output the same key form as the openssl command.

	* ext/openssl/ossl_rand.c
	  New method Random.status?

Mon Jun 18 13:54:36 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (ruby_cleanup): return EXIT_FAILURE if any exceptions occured
	  in at_exit blocks.  [ruby-core:11263]

Mon Jun 18 01:14:10 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* variable.c (rb_path2class): get rid of dangling pointer caused by
	  optimized out value.

	* variable.c (rb_global_entry, rb_f_untrace_var, rb_alias_variable,
	  rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
	  generic_ivar_defined, generic_ivar_remove, rb_mark_generic_ivar,
	  rb_free_generic_ivar, rb_copy_generic_ivar,
	  rb_obj_instance_variables): suppress warnings.

Fri Jun 15 22:33:29 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (realclean): separate local and ext.

	* ext/extmk.rb: not remove unrelated directories.

Fri Jun 15 17:01:20 2007  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/dl/lib/dl/win32.rb: seems that dl doesn't accept void argument.
	  fixed [ruby-bugs:PR#5489].

Thu Jun 14 17:09:48 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser): handle more
	  extensions.  [ruby-dev:30972]

Wed Jun 13 06:05:12 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (darwin): prohibit loading extension libraries to
	  miniruby.

Wed Jun 13 05:47:58 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_kill_thread): renamed in order to get rid of conflict
	  with a BeOS system function.  [ruby-core:10830]

Tue Jun 12 14:53:51 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (Logging.quiet, Logging.message): added quiet flag and
	  use it.  [ruby-core:10909]

	* lib/mkmf.rb (find_header): use header names in the message.

Sun Jun 10 13:47:36 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/ruby/test_beginendblock.rb (test_should_propagate_signaled):
	  get rid of invoking shell.  [ruby-dev:30942]

Thu Jun  7 19:02:48 2007  Tanaka Akira  <akr@fsij.org>

	* lib/pp.rb: call original "method" method instead of redefined one.

Mon Jun  4 11:11:12 2007  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (ResponseParser#next_token): fixed
	  error message. (backported from HEAD)

	* lib/net/imap.rb (ResponseParser#parse_error): fixed
	  the condition not to refer @token.symbol unexpectedly.
	  Thanks, Dick Monahan. (backported from HEAD)

Thu May 31 17:27:53 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/benchmark.rb (Benchmark::Job::item): avoid modifying the
	  argument unintentionally.  [ruby-talk:253676]

Thu May 31 02:12:32 2007  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/rinda/tuplespace.rb (Rinda::TupleBag): create index on tuple bag
	  by first column.

Wed May 30 13:27:40 2007  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/ftp.rb (Net::FTP#transfercmd): skip 2XX
	  responses for some FTP servers. (backported from HEAD)

Wed May 30 05:17:55 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_eval): get rid of SEGV at ZSUPER in a block
	  [ruby-dev:30836]

Wed May 30 04:29:43 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (thread_timer): timer thread should not receive any
	  signals.  submitted by Sylvain Joyeux.  [ruby-core:08546]

Wed May 30 04:18:37 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_eval_cmd): just return if no exceptions.
	  [ruby-dev:30820]

Tue May 29 11:01:06 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (rb_w32_opendir): store attributes of the second
	  entries or later too.

	* win32/win32.c (rb_w32_opendir, rb_w32_readdir): eliminate magic
	  numbers.

Mon May 28 02:54:05 2007  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/rinda/tuplespace.rb (Rinda::TupleBag#delete): use rindex and
	  delete_at instead of delete for little improvement.

Sat May 26 00:05:22 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/ruby/test_beginendblock.rb (test_should_propagate_signaled):
	  skip tests for exitstatus and termsig on the platforms where
	  signals not supported.

Wed May 23 06:51:46 2007  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* lib/cgi.rb (CGI#[]): get rid of exceptions being raised.
	  [ruby-dev:30740], Thanks Kentaro KAWAMOTO.

Wed May 23 05:49:49 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb, ext/purelib.rb, lib/mkmf.rb, runruby.rb: clear default
	  load path to get rid of load pre-installed extensions/libraries.
	  [ruby-core:11017]

Sat May 19 10:29:18 2007  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date/format.rb (Date._parse): detects some OFX dates
	  (Of course not fully).

Fri May 18 23:07:33 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_first): call rb_ary_subseq() instead of pushing
	  values by itself.  [ruby-talk:252062]

	* array.c (rb_ary_first): add negative length check.

Fri May 18 17:10:31 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (move_to_next_entry): loc also must move forward.
	  [ruby-talk:251987]

Fri May 18 03:02:40 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/mkexports.rb: preserve prefixed underscores for WINAPI
	  symbols.

	* wince/mkconfig_wce.rb, wince/mkexports.rb: obsolete.

Thu May 17 17:03:11 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* misc/ruby-style.el (ruby-style-label-indent): for yacc rules.

Tue May 15 14:54:07 2007  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (init_stdhandle): stderr should be without buffering,
	  but mswin32 use buffering when stderr is not connected to tty.

Mon May 14 13:28:03 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/thread/thread.c (wait_list): supress a warning.

Thu May 10 15:21:51 2007  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/iconv/iconv.c (iconv_s_conv): rdoc fix.

Thu May 10 10:14:14 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_thread_priority): rdoc fix; the initial value is
	  inherited from the creating thread.  [ruby-core:10607]

Wed May  9 12:28:57 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (Init_Bignum), numeric.c (Init_Numeric): added fdiv as
	  aliases of quo.  [ruby-dev:30771]

Wed May  9 11:55:15 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (rb_big_quo): now calculate in integer.  [ruby-dev:30753]

Wed May  9 11:51:06 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (rb_big_pow): reduce multiplying for even number.

	* bignum.c (rb_big_pow): truncate all zero BDIGITs. [ruby-dev:30733]

	* bignum.c (rb_big_pow): improvement by calculating from MSB and using
	  factorization.  <http://yowaken.dip.jp/tdiary/20070426.html#p01>

	* numeric.c (int_pow): calculate power in Fixnum as possible.
	  [ruby-dev:30726]

Tue May  8 23:42:51 2007  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date/format.rb (Date._parse): revised treatment of
	  hyphened/separatorless dates.

	* lib/date/format.rb: some trivial adjustments.

Tue May  8 20:25:05 2007  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date/format.rb: reverted.

Sat May  5 16:26:33 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/date/format.rb (Format::Bag#method_missing): get rid of
	  modifying orginal argument.  [ruby-core:11090]

Mon Apr 30 01:17:51 2007  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/rinda/tuplespace.rb (TupleSpace#create_entry, TupleBag#push,
	  delete): extract method, and rename parameter.

Fri Apr 27 02:00:17 2007  Ryan Davis  <ryand-ruby@zenspider.com>

	* signal.c: Fixed backwards compatibility for 'raise Interrupt'.

	* lib/yaml/tag.rb: Running rdoc over the 1.8.6 tree skips
	  Module. Patch from James Britt

Thu Apr 26 13:54:51 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* misc/ruby-style.el: new file.  C/C++ style for ruby source code.

Wed Apr 25 19:49:16 2007  Tanaka Akira  <akr@fsij.org>

	* ext/socket/socket.c (unix_send_io, unix_recv_io): use CMSG_DATA to
	  align file descriptor appropriately.

Tue Apr 24 09:33:57 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (do_stat, do_lstat, do_opendir): should not warn ENOTDIR.
	  [ruby-talk:248288]

Mon Apr 23 22:14:42 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb ($ruby): add extout directory to include path.
	  [ruby-core:11003]

	* lib/mkmf.rb (libpathflag): not to append RPATHFLAG to current
	  directory.

	* lib/mkmf.rb (init_mkmf): add current directory to default
	  library path with highest priority.  [ruby-core:10960]

	* lib/mkmf.rb (LINK_SO): LIBPATH to be placed before DLDFLAGS.

Fri Apr 20 16:05:22 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (LIBPATHFLAG, RPATHFLAG): no needs to be quoted,
	  it is done by libpathflag in mkmf.rb.

Fri Apr 20 12:27:04 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb: fix to override conv proc.

Fri Apr 20 12:17:05 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (ruby_cleanup): inversed the order of errinfos.

Thu Apr 19 14:53:32 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/monitor.rb (ConditionVariable#wait, mon_enter, mon_exit_for_cond):
	  ensures Thread.critical to be false.  [ruby-talk:248300]

Wed Apr 18 10:41:21 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* util.c (ruby_strtod): exponent is radix 10.  [ruby-talk:248272]

Wed Apr 18 02:30:24 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (LDFLAGS): prepend -L. instead appending it to
	  XLDFLAGS.  [ruby-core:10933]

	* configure.in (Makefile): remove $U for automake from MISSING.
	  [ruby-talk:248171]

Tue Apr 17 16:46:46 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_yield_0): should not clear state on TAG_NEXT when
	  it's invoked from within lambda body.  [ruby-talk:248136]

	* eval.c (proc_invoke): handle TAG_NEXT which would be caused by
	  next in the lambda body as well.

Mon Apr 16 22:56:01 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/pty/expect_sample.rb: avoid symbolic link representation for
	  expect.  a patch from Kazuhiro NISHIYAMA <zn at mbf.nifty.com>.
	  [ruby-dev:30714]

Mon Apr 16 22:51:11 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* sample: replace TRUE, FALSE with true, false respectively.
	  a patch from Kazuhiro NISHIYAMA <zn at mbf.nifty.com>.
	  [ruby-dev:30713]

Mon Apr 16 17:08:02 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb (make_switch): do not clobber converter if pattern
	  has no convert method.  reported by sheepman in [ruby-dev:30709].

Mon Apr 16 16:49:32 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c (strio_seek): consistent behavior with
	  IO#seek.  patch by sheepman in [ruby-dev:30710].

Mon Apr 16 16:34:08 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (parser_yylex): should set command_start after block
	  starting "do"s and braces.  [ruby-core:10916]

Sun Apr 15 09:19:57 2007  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date/format.rb: added some zone names.

	* lib/date/format.rb (_parse): now interprets doted numerical
	  dates as a big endian (except dd.mm.yyyy).

Tue Apr 10 17:37:36 2007  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (rb_w32_fclose, rb_w32_close): need to save errno
	  before calling original fclose()/close().

Mon Apr  9 09:30:44 2007  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (disconnect): call shutdown for
	  SSLSocket. Thanks, Technorama Ltd.

Thu Apr  5 00:42:48 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* error.c (rb_notimplement), io.c (pipe_open): removed definite
	  articles and UNIX manual section from messages.  [ruby-dev:30690]

Wed Apr  4 17:09:17 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (pipe_open): refined the message of NotImplementedError.
	  [ruby-dev:30685]

Wed Apr  4 10:18:04 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (pipe_open): raise NotImplementedError for command "-" on
	  platforms where fork(2) is not available.  [ruby-dev:30681]

Tue Apr  3 15:45:41 2007  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/socket/socket.c (s_recv, s_recvfrom): some systems (such as
	  windows) doesn't set fromlen if the socket is connection-oriented.
	  reported by Bram Whillock in [ruby-core:10512] [ruby-Bugs#9061]

Sat Mar 24 23:40:29 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* node.h (struct rb_thread.locals): explicit as struct.
	  [ruby-core:10585]

	* eval.c, node.h (enum rb_thread_status, struct rb_thread,
	  rb_curr_thread, rb_main_thread): prefixed.  [ruby-core:10586]

	* file.c (chompdirsep): made an unprefixed name static.

	* io.c (io_fread): ditto.

Sat Mar 24 01:54:03 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (ruby_cleanup): exit by SystemExit and SignalException in END
	  block.  [ruby-core:10609]

	* test/ruby/test_beginendblock.rb (test_should_propagate_exit_code):
	  test for exit in END block.  [ruby-core:10760]

	* test/ruby/test_beginendblock.rb (test_should_propagate_signaled):
	  test for signal in END block.

Thu Mar 22 23:13:17 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_provided): check for extension library if SOEXT is
	  explicitly given.  [ruby-dev:30657]

Thu Mar 22 10:29:25 2007  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/ruby/test_bignum.rb (test_to_s): add tests for Bignum#to_s.

Wed Mar 21 17:04:30 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (rb_big2str0): round up for the most significant digit.
	  [ruby-core:10686]

Wed Mar 21 07:21:24 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/thread/thread.c (remove_one): Preserve List invariants;
	  submitted by: MenTaLguY <mental AT rydia.net>
	  in [ruby-core:10598] and [ruby-bugs:PR#9388].

Tue Mar 20 22:54:50 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* marshal.c (w_extended): erroneous check condition when dump
	  method is defined.  [ruby-core:10646]

Tue Mar 20 15:37:24 2007  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* distruby.rb: Add zip generation.

Tue Mar 20 11:28:41 2007  Akinori MUSHA  <knu@iDaemons.org>

	* lib/matrix.rb (Matrix::inverse_from): adding partial pivoting to
	  the Gauss-Jordan algorithm, making it stable.  a patch from
	  Peter Vanbroekhoven.  [ruby-core:10641]

Mon Mar 19 11:39:29 2007  Minero Aoki  <aamine@loveruby.net>

	* lib/net/protocol.rb (rbuf_read): extend buffer size for speed.

Sun Mar 18 04:23:52 2007  Akinori MUSHA  <knu@iDaemons.org>

	* NEWS: Add a note about the new `date' library defining
	  Time#to_date and Time#to_datetime private methods.

	* NEWS: Inform that the old `thread' library is considered to be
	  stable.

	* NEWS: Sort library entries in alphabetical order.

Fri Mar 16 21:48:11 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/dl/dl.c (rb_ary2cary): Fix a bug in type validation;
	  submitted by sheepman <sheepman AT sheepman.sakura.ne.jp>
	  in [ruby-dev:30554].

Fri Mar 16 18:28:06 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/etc/etc.c (etc_getgrgid): Fix a bug in Etc::getgrgid()
	  always returning the (real) group entry of the running process;
	  reported by: UEDA Hiroyuki <ueda AT netforest.ad.jp>
	  in [ruby-dev:30586].

Fri Mar 16 16:33:58 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/thread/thread.c (unlock_mutex_inner): Make sure that the
	  given mutex is actually owned by the caller; submitted by:
	  Sylvain Joyeux <sylvain.joyeux AT m4x.org> in [ruby-core:10598].

Fri Mar 16 16:21:35 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/thread/thread.c (wait_condvar, lock_mutex): Fix a problem in
	  ConditionVariable#wait that occurs when two threads that are
	  trying to access the condition variable are also in concurrence
	  for the given mutex; submitted by: Sylvain Joyeux
	  <sylvain.joyeux AT m4x.org> and MenTaLguY <mental AT rydia.net>
	  in [ruby-core:10598].

Fri Mar 16 16:17:27 2007  Akinori MUSHA  <knu@iDaemons.org>

	* test/thread/test_thread.rb: Add a test script for the `thread'
	  library.  This should result in failure as of now with
	  ext/thread; submitted by: Sylvain Joyeux <sylvain.joyeux AT
	  m4x.org> in [ruby-core:10598].

Wed Mar 14 12:30:00 2007  Shigeo Kobayashi  <shigeo@tinyforest.jp>

	* ext/bigdecimal/bigdecimal.c: BigDecimal("-.31") is now
	  treated as ("-0.31") not as ("0.31").

Tue Mar 13 09:25:10 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (clear-installed-list): separated from install-prereq.

Tue Mar 13 06:38:43 2007  Akinori MUSHA  <knu@iDaemons.org>

	* NEWS: Reword and improve entries.

Tue Mar 13 06:03:46 2007  Akinori MUSHA  <knu@iDaemons.org>

	* stable version 1.8.6 released from the ruby_1_8_6 branch.

Tue Mar 13 03:24:07 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* runruby.rb: added --pure (turned on by default) and --debugger
	  options.

Tue Mar 13 02:50:28 2007  Akinori MUSHA  <knu@iDaemons.org>

	* lib/cgi.rb (CGI::header): IIS >= 5.0 does not need the nph
	  assumption any more; submitted by MIYASAKA Masaru <alkaid AT
	  coral.ocn.ne.jp> in [ruby-dev:30537].

Mon Mar 12 11:07:44 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/openssl/ossl_asn1.c (Init_ossl_asn1): Let rdoc know about
	  externally defined modules; submitted by Technorama
	  Ltd. <oss-ruby AT technorama.net> in [ruby-bugs:PR#4704].

	* ext/openssl/ossl_bn.c (Init_ossl_bn): Ditto.

	* ext/openssl/ossl_cipher.c (Init_ossl_cipher): Ditto.

	* ext/openssl/ossl_digest.c (Init_ossl_digest): Ditto.

	* ext/openssl/ossl_hmac.c (Init_ossl_hmac): Ditto.

	* ext/openssl/ossl_pkey.c (Init_ossl_pkey): Ditto.

	* ext/openssl/ossl_pkey_dh.c (Init_ossl_dh): Ditto.

	* ext/openssl/ossl_pkey_dsa.c (Init_ossl_dsa): Ditto.

	* ext/openssl/ossl_pkey_rsa.c (Init_ossl_rsa): Ditto.

	* ext/openssl/ossl_rand.c (Init_ossl_rand): Ditto.

	* ext/openssl/ossl_ssl.c (Init_ossl_ssl): Ditto.

Mon Mar 12 01:05:17 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/dl/sym.c (rb_dlsym_inspect): Use "0x%x" rather for pointers.
	  This might not be very right but it is commonly used in other
	  parts of the code; submitted by sheepman <sheepman AT
	  sheepman.sakura.ne.jp> in [ruby-dev:30532].

	* ext/dl/ptr.c (rb_dlptr_inspect): Ditto.

Mon Mar 12 00:59:19 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/dl/lib/dl/import.rb (DL::Importable::Internal::import,
	  DL::Importable::Internal::callback): Avoid race condition for an
	  instance variable; submitted by sheepman <sheepman AT
	  sheepman.sakura.ne.jp> in [ruby-dev:30530].

Sun Mar 11 18:57:50 2007  Akinori MUSHA  <knu@iDaemons.org>

	* misc/README: Add a note about ruby-electric.el.

	* misc/ruby-mode.el (ruby-non-block-do-re): Fix
	  ruby-non-block-do-re. [ruby-core:03719]

	* misc/inf-ruby.el: Synchronize the comment section with trunk.

	* misc/README, misc/rdebug.el: Add rdebug.el, Emacs ruby-debug
	  interface based on rubydb3x.el; submitted by Martin Nordholts
	  <enselic AT gmail.com> in [ruby-bugs:PR#9023].

Sun Mar 11 17:45:51 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/dl/mkcallback.rb (mkfunc): Make sure that a callback
	  function is found in the function table before trying to call
	  it; submitted by sheepman <sheepman AT sheepman.sakura.ne.jp>
	  in [ruby-dev:30524].

Sun Mar 11 12:09:37 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (error_handle): no message when exiting by signal.

	* eval.c (ruby_cleanup): re-send signal.  [ruby-dev:30516]

	* eval.c (rb_thread_interrupt): instantiate SignalException.

	* eval.c (rb_thread_signal_raise): now takes signal number instead
	  of signal name.

	* intern.h (rb_thread_signal_raise, ruby_default_signal): prototypes.

	* signal.c (esignal_init): takes a signal number and an optional
	  signal name.

	* signal.c (interrupt_init): pass SIGINT always.

	* signal.c (ruby_default_signal): invoke system default signal
	  handler.

	* signal.c (rb_signal_exec, trap): handle SIGTERM.  [ruby-dev:30505]

Tue Mar  6 19:08:46 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/digest/lib/md5.rb (MD5::new, MD5::md5): Do not modify
	  Digest::MD5.

	* ext/digest/lib/sha1.rb (SHA1::new, SHA1::sha1): Ditto.

Tue Mar  6 18:58:37 2007  Keiju Ishitsuka  <keiju@ruby-lang.org>

	* lib/shell/process-controller.rb: fix thread synchronization
	  problem for [ruby-dev:30477].

Tue Mar  6 18:44:26 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/digest/lib/md5.rb (MD5::new, MD5::md5): Catch up with
	  Digest's API changes; noted by: Kazuhiro Yoshida <moriq AT
	  moriq.com> in [ruby-dev:30500].

	* ext/digest/lib/sha1.rb (SHA1::new, SHA1::sha1): Ditto.

Tue Mar  6 18:24:19 2007  Akinori MUSHA  <knu@iDaemons.org>

	* time.c (time_to_s): Back out the format changes; discussed
	  in [ruby-dev:30495].

Tue Mar  6 11:53:25 2007  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/sample/irbtkw.rbw: fails to exit process.

Mon Mar  5 20:14:49 2007  Akinori MUSHA  <knu@iDaemons.org>

	* time.c (time_to_s): Correct the wrong format which did not
	  really conform to RFC 2822; pointed out by: OHARA Shigeki <os at
	  iij.ad.jp> in [ruby-dev:30487].

Sun Mar  4 23:38:07 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_stat_s_utime): fixed a commit miss for the platforms
	  where utimes() does not exist.

	* lib/fileutils.rb (touch): ditto.

Sun Mar  4 14:46:56 2007  WATANABE Hirofumi  <eban@ruby-lang.org>

	* util.c (push_element): should return a int value.

Sun Mar  4 01:05:57 2007  Akinori MUSHA  <knu@iDaemons.org>

	* lib/set.rb (Set#^, Set#&): Correct documentation.  Those methods
	  return sets, not arrays; noted by Oliver Frank Wittich <nietz AT
	  mangabrain.de>.

Sat Mar  3 23:01:07 2007  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (mv): could not move a directory between
	  different filesystems. [ruby-dev:30411]

Sat Mar  3 22:57:11 2007  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (touch): last commit causes error if :mtime
	  option was not given.

Sat Mar  3 22:37:02 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_file_s_utime): allow nil to set the current time.

	* lib/fileutils.rb (touch): ditto, and added :mtime and :nocreate
	  options.  fixed: [ruby-talk:219037]

Sat Mar  3 21:17:35 2007  Akinori MUSHA  <knu@iDaemons.org>

	* eval.c (stack_check): Unset inline to fix build with GCC 3.4.6;
	  submitted by: NISHIMATSU Takeshi <t_nissie AT yahoo.co.jp> in
	  [ruby-list:43218].
	  cf. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24556

Sat Mar  3 19:05:31 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/thread/thread.c (push_list): Use ALLOC().

	* ext/thread/thread.c (rb_mutex_alloc): Ditto.

	* ext/thread/thread.c (rb_condvar_alloc): Ditto.

Sat Mar  3 18:53:11 2007  Akinori MUSHA  <knu@iDaemons.org>

	* NEWS: Add a note for String#intern.

Sat Mar  3 16:23:13 2007  Akinori MUSHA  <knu@iDaemons.org>

	* env.h (SCOPE_CLONE): Introduce a new scope flag to prevent a
	  local_tbl region from getting freed many times; submitted by
	  Chikanaga Tomoyuki <chikanag AT nippon-control-system.co.jp> in
	  [ruby-dev:30460].

	* eval.c (proc_invoke): Ditto.

	* gc.c (obj_free): Ditto.

	* parse.y (top_local_setup_gen): Ditto.

Sat Mar  3 16:07:02 2007  Akinori MUSHA  <knu@iDaemons.org>

	* object.c (rb_obj_ivar_set): RDoc updated according to a
	  suggestion from Brian Candler <B.Candler AT pobox.com>.
	  [ruby-core:10469]

Thu Mar  1 21:38:07 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (stmt, arg): should not omit lhs of OP_ASGN1 even if
	  empty.  [ruby-dev:30455]

Thu Mar  1 08:55:38 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_feature_p): check loading_tbl if the given ext is
	  empty.  [ruby-dev:30452]

	* eval.c (rb_feature_p): fix possible buffer overrun.

Thu Mar  1 03:30:21 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/digest/digest.c (get_digest_base_metadata): Allow inheriting
	  Digest::Base subclasses, which was unintentionally made
	  impossible while restructuring Digest classes.

Thu Mar  1 02:05:17 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* mkconfig.rb (patchlevel): read from version.h.

Thu Mar  1 00:09:39 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_provided): return true only for features loaded from
	  .rb files, and not search actual library type.  [ruby-dev:30414]

Wed Feb 28 21:15:00 2007  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in (ac_cv_func_fcntl): fcntl support for MinGW.

	* missing/flock.c: workaround for MinGW.

Wed Feb 28 20:51:32 2007  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* pack.c (pack_unpack): properly ignore non-base64 octets such as
	  UTF-8 encoded BOMs; submitted by SOUMA Yutaka <holon@radastery.jp>
	  to fix [ruby-core:10437]

Wed Feb 28 18:59:57 2007  Akinori MUSHA  <knu@iDaemons.org>

	* NEWS: Add NEWS, a document file to keep user visible feature
	  changes between releases.

Wed Feb 28 18:35:50 2007  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/openssl/extconf.rb: no need to check unistd.h and sys/time.h.
	  they are already checked at configure.
	  reported by KOBAYASHI Yasuhiro [ruby-list:43225]

Wed Feb 28 18:34:48 2007  NAKAMURA Usaku  <usa@ruby-lang.org>

	* lib/mkmf.rb ($DEFLIBPATH): default library paths ($(topdir), etc)
	  should be the first elements of library paths list.
	  reported by KOBAYASHI Yasuhiro [ruby-list:43225]

Wed Feb 28 18:31:32 2007  Akinori MUSHA  <knu@iDaemons.org>

	* doc/NEWS-1.8.0: Rename NEWS to NEWS-1.8.0.  This is way too old
	  NEWS.

Wed Feb 28 01:22:58 2007  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/{dbm,gdbm}/test_{dbm,gdbm}.rb: shouldn't use host_os. use
	  target_os instead. reported by KOBAYASHI Yasuhiro [ruby-list:43225]

Wed Feb 28 00:08:11 2007  URABE Shyouhei  <shyouhei@ice.uec.ac.jp>

	* mkconfig.rb (RbConfig): add CONFIG['PATCHLEVEL']

	* common.mk: new target dist

	* distruby.rb: new file

Tue Feb 27 22:18:45 2007  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in (--enable-auto-image-base): avoid the neccessity to
	  rebase the shared libs as much as possible;
	  submitted by Corinna Vinschen <spam at vinschen.de> in
	  [ruby-talk:240964].

Tue Feb 27 21:36:47 2007  WATANABE Hirofumi  <eban@ruby-lang.org>

	* util.c (__crt0_glob_function): use ruby_glob() instead of rb_globi().

Tue Feb 27 21:33:04 2007  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in (ac_cv_func_setrlimit): workaround for djgpp.

Tue Feb 27 19:38:52 2007  Akinori MUSHA  <knu@iDaemons.org>

	* lib/base64.rb (Base64::b64encode): Fix documentation; submitted
	  by David Symonds <dsymonds@gmail.com> in [ruby-core:10432].

Tue Feb 27 19:36:57 2007  Akinori MUSHA  <knu@iDaemons.org>

	* regex.c (calculate_must_string, slow_search, re_search): Silence
	  warnings regarding char * vs. unsigned char * mismatch;
	  submitted by Lyle Johnson <lyle.johnson@gmail.com>
	  in [ruby-core:10416].

	* ext/bigdecimal/bigdecimal.c (BigDecimal_load): Ditto.

	* ext/digest/sha1/sha1ossl.c (SHA1_Finish): Ditto.

	* ext/digest/rmd160/rmd160ossl.c (RMD160_Finish): Ditto.

	* ext/digest/digest.c (rb_digest_base_finish,
	  rb_digest_base_update): Ditto.

	* ext/nkf/nkf.c (rb_str_resize, rb_nkf_kconv, rb_nkf_guess1,
	  rb_nkf_guess2): Ditto.

Tue Feb 27 03:40:09 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/thread/thread.c (wait_list_cleanup, rb_mutex_try_lock):
	  Eliminate rb_thread_critical switching where unnecessary;
	  implied by shugo in [ruby-dev:30412].

	* ext/thread/thread.c (set_critical): Merge in
	  thread_exclusive_ensure().

	* ext/thread/thread.c: Consistently use 0 and 1 for
	  rb_thread_critical values.

Mon Feb 26 15:18:23 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/thread/thread.c: Use xmalloc()/xfree() instead of
	  malloc()/free(); pointed out by shugo in [ruby-dev:30412].

Sun Feb 25 23:02:55 2007  Akinori MUSHA  <knu@iDaemons.org>

	* lib/test/unit/autorunner.rb (Test::Unit::AutoRunner::initialize):
	  Initialize @workdir properly to silence a warning under -w.
	  Submitted by <tommy at tmtm.org> in [ruby-dev:30400].

Sun Feb 25 02:47:43 2007  Akinori MUSHA  <knu@iDaemons.org>

	* defines.h: Pull the RUBY_MBCHAR_MAXSIZE definition from trunk,
	  which is necessary for dir.c to compile on djgpp and emx.

Sat Feb 24 10:42:01 2007  Minero Aoki  <aamine@loveruby.net>

	* ext/racc/cparse/cparse.c (cparse_params_mark): remove useless
	  rb_gc_mark.  Thanks Tomoyuki Chikanaga. [ruby-dev:30405]

Fri Feb 23 15:10:46 2007  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (set_pioinfo_extra): new function for VC++8 SP1
	  workaround. [ruby-core:10259]

	* win32/win32.c (NtInitialize): call above function.

Fri Feb 23 14:19:40 2007  NAKAMURA Usaku  <usa@ruby-lang.org>

	* signal.c (sighandler): need to tell to be interrupted to main
	  context when handler is installed.

	* win32/win32.[ch] (rb_win32_interrupted): new function to listen
	  interrupt.

Fri Feb 23 13:02:17 2007  Akinori MUSHA  <knu@iDaemons.org>

	* numeric.c (fix_cmp, fix_equal): Remove FIX2LONG() to optimize.
	  suggested in
	  http://t-a-w.blogspot.com/2007/02/making-ruby-faster.html.
	  [ruby-talk:240223]

Fri Feb 23 12:43:17 2007  James Edward Gray II  <james@grayproductions.net>

	* lib/xmlrpc/client.rb (XMLRPC::Client::do_rpc): Make the
	  Content-Length parameter optional for responses in
	  xmlrpc/client.rb; suggested by Daniel Berger
	  <Daniel.Berger@qwest.com> and approved by the maintainer.

	* lib/xmlrpc/create.rb (XMLRPC::Create::conv2value): Add DateTime
	  support to xmlrpc; approved by the maintainer.

Mon Feb 19 18:22:52 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in, defines.h, eval.c (rb_feature_p, rb_provided,
	  load_wait, search_required, rb_require_safe), ext/extmk.rb: Fix
	  a bug where a statically linked extension cannot be autoloaded.
	  [ruby-dev:30023] / [ruby-dev:30239]

Mon Feb 19 17:14:28 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/socket/socket.c (unix_peeraddr): wrong syscall name in error
	  message for #peeraddr. a patch from Sam Roberts
	  <sroberts at uniserve.com>.  [ruby-core:10366]

Sun Feb 18 19:35:21 2007  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date/format.rb: updated based on date2 4.0.3.

Fri Feb 16 11:18:21 2007  Eric Hodel  <drbrain@segment7.net>

	* lib/.document: Apply patch for irb, e2mmap and README by Hugh Sasse
	  <hgs at dmu.ac.uk> from [ruby-core:10135]

	* lib/prettyprint.rb: Suppress RDoc for PrettyPrint test suite.

Thu Feb 15 20:26:30 2007  Akinori MUSHA  <knu@iDaemons.org>

	* lib/uri/ftp.rb: Revert the previous change pending discussion.

Thu Feb 15 18:08:17 2007  Akinori MUSHA  <knu@iDaemons.org>

	* dir.c (glob_helper): Fix the function declaration.

Thu Feb 15 17:13:32 2007  Akinori MUSHA  <knu@iDaemons.org>

	* version.h: Welcome to the post-1.8.6 world.  Radical changes are
	  inhibited in the ruby_1_8 branch until the 1.8.6 final release
	  goes out of the door.

Thu Feb 15 16:44:14 2007  Akinori MUSHA  <knu@iDaemons.org>

	* lib/uri/generic.rb (URI::Generic::userinfo): Considering how
	  `scheme://user:@...', `scheme://:password@...' and
	  `scheme://:@...' are parsed, an empty user name or password
	  should be allowed and represented as it is.

Thu Feb 15 11:46:05 2007  KIMURA Koichi  <hogemuta@gmail.com>

	* dir.c, win32/win32.c, win32/dir.h, ruby.h, intern.h: Bring
	  encoding aware globbing support in from trunk.  Dir.[] and
	  Dir.glob() can now take many patterns in an array.  Minor fixes
	  will follow.

Thu Feb 15 11:00:26 2007  Akinori MUSHA  <knu@iDaemons.org>

	* lib/uri/generic.rb (URI::Generic::userinfo): should support
	  empty password.  [ruby-core:10290]

	* lib/uri/generic.rb (URI::Generic::set_password): password can be
	  cleared by nil.  [ruby-core:10290]

	* lib/uri/common.rb (escape): regard second string argument as a
	  character set properly. [ruby-dev:27692]

	* lib/uri/ftp.rb: Attempt to conform to RFC 1738 with regard to
	  relative/absolute paths.

	* lib/uri: Lovely RDOC patches from mathew (metaATpoboxDOTcom).

Thu Feb 15 10:57:38 2007  Tietew  <tietew@tietew.net>>

	* lib/cgi.rb (CGI::unescapeHTML): invalid decoding for single
	  unescaped ampersand.  a patch from Tietew
	  <tietew+ruby-dev at tietew.net> in [ruby-dev:30292].
	  fixed: [ruby-dev:30289]

Thu Feb 15 10:48:40 2007  MenTaLguY  <mental@rydia.net>

	* ext/thread/thread.c: Handle interrupted waits correctly.
	  [ruby-bugs:PR#8663]

Wed Feb 14 19:22:15 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/digest/lib/digest.rb (Digest::self.const_missing): Drop
	  autoloads for sha2 classes in favor of handling in
	  const_missing(), to work around a problem exposed on OS X.

Tue Feb 13 02:21:12 2007  Sam Roberts  <sroberts@uniserve.com>

	* io.c (rb_f_syscall): Fix buffer overflow with syscall
	  arguments.  [ruby-bugs:PR#8541]

Sun Feb 11 07:46:45 2007  Akinori MUSHA  <knu@iDaemons.org>

	* lib/cgi.rb (CGI::QueryExtension::read_multipart): Properly parse
	  a quoted-string in a Content-Disposition value.

Sun Feb 11 06:27:54 2007  Akinori MUSHA  <knu@iDaemons.org>

	* configure.in, ext/thread/extconf.rb, lib/thread.rb: Add a
	  configure option `--disable-fastthread', to choose the original,
	  pure ruby version of the "thread" library instead of the new,
	  much faster implementation in ext/thread.

Sun Feb 11 06:22:20 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/Setup: Add thread except for platforms without threads
	  support.

Sun Feb 11 06:15:16 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/thread/lib/thread.rb: Add a replacement of thread.rb that
	  loads this extension.

Sun Feb 11 05:39:47 2007  Akinori MUSHA  <knu@iDaemons.org>

	* lib/thread.rb: Remove an ineffective part of the code.

Sun Feb 11 05:32:54 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/thread/thread.c (rb_thread_exclusive): Implement
	  Thread.exclusive.

Sun Feb 11 05:26:51 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/thread/thread.c: Get rid of use of a dummy function.

Sun Feb 11 01:45:31 2007  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/thread/thread.c (Init_thread): Define missing aliases:
	  Queue#enq and SizedQueue#enq.

Sat Feb 10 09:27:35 2007  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c (ole_variant2val): fix compile error
	  on VC++.

Sat Feb 10 07:41:52 2007  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c (ole_variant2val): fix the bug when
	  SAFEARRAY pointer is NULL.

Sat Feb 10 00:13:11 2007  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: fix typo (TkConfigMethod::__confinfo_cmd,
	  __conv_keyonly_opts).

Fri Feb  9 20:44:53 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/thread: Make style fixes (mostly de-K&R'ism) to match the
	  rest of the source code.

	* ext/thread: Make USE_MEM_POOLS an extconf option.

Fri Feb  9 20:43:01 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/thread: Import the "fastthread" implementation by MenTaLguY
	  in the original form.  This module is not hooked into the build
	  yet since it needs some style fixes and adjustments.

Fri Feb  9 15:46:09 2007  Akinori MUSHA  <knu@iDaemons.org>

	* ext/bigdecimal: Synchronize with trunk.  Better function
	  prototypes, removal of a useless method `!=', and document
	  updates.

Tue Feb 06 22:06:45 2007  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/nkf/nkf-utf8/{nkf.c,utf8tbl.c}:
	  imported nkf 2007-01-28.
	  * Fixed: can't decode MIME encode JIS string.
	  * Fixed: Fullwitdh-halfwidth conversion.
	  * Support DoCoMo's and Softbank's EMOJI
	  * Support CP932, CP5022x, eucJP-ms UDC
	  * Support UTF-32 encoding
	  * Support beyond BMP
	  [ruby-dev:29700] [ruby-dev:29922] [ruby-dev:30144]

Wed Jan 31 14:52:09 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_iterate): need to PUSH_ITER in proper order.
	  [ruby-core:10125]

	* test/ruby/test_iterator.rb (TestIterator::test_block_given_within_iterator):
	  add new test.  [ruby-core:10125]

Tue Jan 30 14:58:51 2007  NAKAMURA Usaku  <usa@ruby-lang.org>

	* string.c (rb_str_sub_bang): calling rb_str_modify() should be just
	  before actually modifying the string.
	  fixed: [ruby-dev:30211] (originally reported by zunda)

Tue Jan 30 12:05:35 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* mkconfig.rb: autoconf 2.61 support.  [ruby-core:10016]

Sat Jan 27 15:20:11 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (dyna_var_lookup): should not alter dvar->val not to
	  destroy living value.  [ruby-core:10076]

	* parse.y (dyna_init): ditto.

Fri Jan 26 12:03:39 2007  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb (TkConfigMethod#__confinfo_cmd,
	  __conv_keyonly_optkeys): make them private [ruby-dev:30074].

	* ext/tk/lib/tk/txtwin_abst.rb: fix typo [ruby-dev:30073].

	* ext/tk/lib/tk/canvas.rb (TkCanvas#scan_dragto): lack of an argument.

	* ext/tk/lib/tk/canvas.rb: clarify the including module name
	  [ruby-dev:30080].

	* ext/tk/lib/tk/scrollable.rb: change primary name of modules
	  [ruby-dev:30080].

Wed Jan 24 18:05:39 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* misc/ruby-mode.el (ruby-font-lock-syntactic-keywords): fix
	  regexp font-lock bug.  [ruby-talk:235758]

Tue Jan 23 11:02:33 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/webrick/httprequest.rb (WEBrick::HTTPRequest::read_line):

Tue Jan 23 18:26:12 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/cgi.rb (CGI::QueryExtension::read_multipart): use == instead
	  of ===.  [ruby-dev:30176]

Tue Jan 23 10:48:17 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* hash.c: added documentation for Hash about how it uses eql? and
	  hash methods for the keys.  [ruby-core:09995]

Mon Jan 22 14:57:25 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/socket/socket.c: fix errors in socket sample code.
	  [ruby-core:09992]

Sat Jan 13 23:54:48 2007  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c (ole_free, ole_type_free,
	  olemethod_free, olevariable_free, oleparam_free,
	  ole_event_free): fix memory leak.  [ruby-core:09846]

Fri Jan 12 11:13:55 2007  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/etc/etc.c (etc_getpwuid, etc_getgrgid): fix to correctly
	  convert uid/gid from VALUE. (backport of r11521)

Wed Jan 10 18:57:57 2007  Minero Aoki  <aamine@loveruby.net>

	* ext/strscan/strscan.c (strscan_do_scan): should set kcode option
	  before match. [ruby-dev:29914]

	* test/strscan/test_stringscanner.rb: test it.

	* re.c: export kcode_set_option and kcode_reset_option (with "rb_"
	  prefix).

	* intern.h: ditto.

Tue Jan  9 17:45:17 2007  NAKAMURA Usaku  <usa@ruby-lang.org>

	* file.c (rb_find_file): should not call fpath_check() with NULL.
	  fixed: [ruby-core:09867]

Tue Jan  9 03:54:38 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_upto): String#upto from empty string makes
	  inifinite loop.  [ruby-core:09864]

Sun Jan  7 12:13:26 2007  Eric Hodel  <drbrain@segment7.net>

	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser#find_class_comment):
	  Look for class and module comments above rb_define_class and
	  rb_define_module.  Patch by Daniel Berger <djberg96 at gmail.com>

Sun Jan  7 10:32:12 2007  Eric Hodel  <drbrain@segment7.net>

	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser#handle_constants):
	  Properly handle escaping of : in comments.
	* test/rdoc/parsers/test_parse_c.rb:
	  Test RDoc::C_Parser#do_classes and Rdoc::C_Parser#find_class_comment.

Sun Jan  7 09:33:02 2007  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date/format.rb: updated based on date2 4.0.1.

Wed Jan  3 11:36:51 2007  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (ruby_dup): start GC on ENOMEM as well.

Mon Jan  1 06:13:11 2007  Eric Hodel  <drbrain@segment7.net>

	* lib/rdoc/parsers/c_parser.rb: Make Rdoc accessible.  Update constant
	  value information.

Mon Jan  1 06:13:11 2007  Eric Hodel  <drbrain@segment7.net>

	* ext/bigdecimal/bigdecimal.c: Update constant comments to provide
	  values for RDoc.

Mon Jan  1 06:05:55 2007  Eric Hodel  <drbrain@segment7.net>

	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser#handle_constansts):
	  Allow RDoc comment to give friendly value for rb_define_const.  Patch
	  by Daniel Berger <djberg96 at gmail.com>, [ruby-patches-7499].
	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser#handle_constansts): Fix
	  whitespace handling in constant comments.

Sun Dec 31 00:31:16 2006  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb, lib/date/format.rb: updated based on date2 4.0.

Thu Dec 14 18:29:13 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/readline/readline.c: NetBSD editline does not have
	  rl_username_completion_function() and rl_completion_matches().
	  a patch from Takahiro Kambe <taca at back-street.net>.
	  [ruby-dev:30008]

Thu Dec 14 18:20:43 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/irb/locale.rb (IRB::Locale::puts): typo fixed.  a patch from
	  NAKAMURA Usaku <usa@ruby-lang.org>.  [ruby-dev:30012]

Mon Dec 11 11:58:36 2006  Akinori MUSHA  <knu@iDaemons.org>

	* ext/digest/sha2/lib/sha2.rb: Moved one level up from under
	  the superfluous subdirectory digest/.

Mon Dec 11 11:46:18 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* variable.c (rb_define_const): typo fixed.

Mon Dec 11 09:36:29 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_aset): index double decode problem.
	  [ruby-core:09695]

Sat Dec  9 21:39:24 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (ruby_cleanup): keep the exception till after END blocks.
	  [ruby-core:09675]

Sat Dec  9 11:22:00 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/irb/locale.rb (IRB::Locale::search_file): ues File.exist?
	  instead of File.exists?.  a patch from Yutaka Kanemoto
	  <kinpoco at gmail.com> in [ruby-dev:30000].

Thu Dec  7 09:29:02 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/weakref.rb (WeakRef::__setobj__): should support
	  marshaling.  [ruby-talk:228508]

	* lib/delegate.rb (Delegator::marshal_load): need to call
	  __setobj__.

Wed Dec  6 23:56:14 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* Makefile.in, common.mk (NULLCMD): moved for platforms that empty
	  command does not run.  fixed: [ruby-dev:29994]

Wed Dec  6 17:17:26 2006  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in (SITE_DIR): fixed to emtpy RUBY_SITE_LIB in config.h on
	  NetBSD.  fixed: [ruby-dev:29358]

Tue Dec  5 00:59:05 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* misc/ruby-mode.el (ruby-parse-partial): need to parse "/=" as
	  self assignment operator, not regex.  [ruby-talk:227324]

Mon Dec  4 10:48:03 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ruby.h (OFFT2NUM): use LONG2NUM() if sizeof(long) equals to
	  sizeof(off_t).

Mon Dec  4 10:43:46 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (dyna_init_gen): dvar initialization only if dvar is
	  assigned inner block.  [ruby-talk:227402]

Mon Dec  4 08:32:49 2006  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/cgi.rb (CGI::QueryExtension::read_multipart): should quote
	  boundary. JVN#84798830

Sat Dec  2 07:09:04 2006  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_ocsp.c: OpenSSL::OCSP::OSCPError should be
	  subclass of OpenSSL::OpenSSLError. [ruby-dev:29980]

Fri Dec  1 17:01:49 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* gc.c (ruby_init_stack): decrease "stack level too deep" in Windows.
	  merge from trunk.

Fri Dec  1 16:31:53 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tcltklib.c: shouldn't run the killed thread at callback.
	  [ruby-talk: 227408]

Mon Nov 27 17:18:27 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* sprintf.c (rb_f_sprintf): need not to truncate string if no
	  width specifier given for %s.  [ruby-dev:29952]

Sun Nov 26 16:36:46 2006  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* version.h: addition of RUBY_PATCHLEVEL.
	* version.c: ditto.

Fri Nov 24 10:17:51 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* bignum.c (bignorm): avoid segmentation.  a patch from Hiroyuki
	  Ito <ZXB01226@nifty.com>.  [ruby-list:43012]

Thu Nov 23 10:38:40 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_mod_define_method): set implicit visibility only when
	  it's called for the target class (ruby_cbase).

Wed Nov 22 16:00:49 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/extconf.rb: support --with-X11/--without-X11 option.

	* ext/tk/README.tcltklib: add description about --with-X11-* option
	  [ruby-talk:225166] and --with-X11/--without-X11 option.

	* ext/tk/tkutil/extconf.rb: able to be called manually
	  [ruby-talk:225950].

Wed Nov 15 23:22:54 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (test_grpowned, rb_stat_grpowned): should honor
	  supplementary group IDs.  [ruby-core:09546]

Thu Nov  9 03:15:22 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (BEGIN_CALLARGS): ruby_block may be NULL even when
	  ITER_PRE.

Tue Nov  7 18:34:34 2006  Akinori MUSHA  <knu@iDaemons.org>

	* ext/digest/lib/digest/hmac.rb: Keep this out of the 1.8 tree
	  until we reach a consensus that HMAC should be put under Digest.

Tue Nov  7 18:05:01 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/itemconfig.rb: minor bug fix.

Mon Nov  6 20:11:20 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/0.9.rb (RSS::Rss): removed needless include.

Mon Nov  6 15:41:55 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/itemconfig.rb: ext/tk/lib/tk/itemconfig.rb: bug
	  fix on 'itemconfiginfo' method, and modify to make it easy to
	  override 'itemconfiginfo' method.

	* ext/tk/lib/tkextlib/tile/treeview.rb : support Tile 0.7.8.

	* ext/tk/lib/tkextlib/version.rb : [new] add Tk::Tkextlib_RELEASE_DATE
	  to get the information from scripts.

	* ext/tk/lib/tk.rb: load 'tkextlib/version.rb', and update RELEASE_DATE

	* ext/tk/lib/tkextlib/SUPPORT_STATUS: update.

	* ext/tk/sample/editable_listbox.rb: [new] the listbox with editable
	  items. It's one of the example about usage of Place geometry manager.

	* ext/tk/sample/tktextio.rb: improve the functions of TkTextIO class.
	  Those are required by 'irbtkw.rbw'.

	* ext/tk/sample/irbtkw.rbw: [new] IRB on Ruby/Tk. It doesn't need any
	  real console. IRB works on a text widget without I/O blocking. That
	  is, thread switching on IRB will work properly, even if on Windows.

Sun Nov  5 19:53:49 2006  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb: updated based on date2 3.9.7.

Sat Nov  4 13:13:57 2006  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb: accept NOMODSEQ. [ruby-core:9002]
	  (backported from HEAD)

Fri Nov  3 00:16:37 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/socket/socket.c (ruby_getnameinfo__aix): AF_INET6 workaround
	  for AIX.  a patch from Yutaka Kanemoto <kinpoco AT gmail.com>.
	  [ruby-dev:29744]

Thu Nov  2 15:43:39 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* parse.y (primary): should set NODE even when compstmt is NULL.
	  merge from trunk. fixed: [ruby-dev:29732]

Thu Nov  2 14:48:30 2006  Akinori MUSHA  <knu@iDaemons.org>

	* lib/set.rb (Set#^): Fix XOR operation against a container that
	  holds duplicate values. [issue: #6444]

Wed Nov  1 02:41:38 2006  Akinori MUSHA  <knu@iDaemons.org>

	* ext/digest/lib/digest/hmac.rb (Digest::HMAC::update): Minor
	  optimization.

	* ext/digest/digest.c (rb_digest_instance_equal): Allow comparing
	  a digest instance with another of a different class.

Wed Nov  1 01:05:13 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* eval.c (rb_call0): fixed bug of zsuper with both of opt and rest.
	  fixed: [ruby-list:42928]

	* test/ruby/test_super.rb: add tests to check above bug.

Tue Oct 31 17:03:21 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* time.c (time_dup): duplicate the class of original time.
	  [ruby-core:09357]

	* lib/time.rb (Time::make_time, Time::rfc2822, Time::httpdate):
	  should respect subclasses.  [ruby-core:09357]

Mon Oct 30 23:40:52 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* Makefile.in (miniruby): add XLDFLAGS.

	* configure.in (aix): use -bE option for miniruby.  [ruby-dev:29698]

	* dir.c (glob_helper): get rid of possible memory leak.

	* win32/win32.c (cmdglob, rb_w32_cmdvector, rb_w32_opendir,
	  rb_w32_get_environ): not to use GC before initialization.

Mon Oct 30 19:29:20 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* bignum.c (rb_big2str0): use better approximation.

Mon Oct 30 18:35:33 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* bignum.c (rb_big2str0): wrong allocation length.  a patch from
	  U.Nakamura <usa at garbagecollect.jp> [ruby-dev:29710]

Mon Oct 30 12:34:02 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_eval): fix commit miss.  [ruby-dev:29707]

Mon Oct 30 12:20:58 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* bignum.c (rb_big2str0): a bug in length adjustment.

Mon Oct 30 11:15:40 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* sprintf.c (rb_str_format): should preserve leading zero
	  information for negative %b and %x.  [ruby-talk:221347]

Thu Oct 26 21:05:58 2006  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_pkcs7.c (ossl_pkcs7_verify): should clear error.
	  (fix http://bugs.debian.org/394336)

	* ext/openssl/ossl_ns_spki.c (ossl_spki_initialize): ditto.

Thu Oct 26 15:21:10 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/digest/digest.c (Init_digest): typo.

Wed Oct 25 17:23:28 2006  Akinori MUSHA  <knu@iDaemons.org>

	* ext/digest, test/digest/test_digest.rb: Merge from trunk:
	  - Introduce versioning in Digest::Base API, and prefix C
	    constants with RUBY_ and C type names with rb_ to avoid name
	    clash in writing extensions.
	  - Introduce Digest::Class and Digest::Instance for ease of
	    implementing subclasses and add-ons.
	  - Digest::Instance module requires and assumes that any instance
	    be resettable and clonable.  An instance method #new() is
	    added so digest instances work just like digest classes.
	  - The constructor does no longer take an initial string to feed;
	    digest() and hexdigest() now do, instead.  This allows digest
	    classes to take their own hashing parameters.
	  - Make some changes to digest() and hexdigest() class methods,
	    which now take extra arguments, which are passed through to
	    the constructor in an internal call.
	  - Add #digest_length/size/length() and #block_length(),
	  - Add the Digest::SHA2 class to wrap up SHA2 variants: SHA256,
	    SHA384 and SHA512, hoping this module would make a decent
	    example of a digest subclass written in Ruby.
	  - Rip BubbleBabble support out of the base class and have a
	    separate module named digest/bubblebabble.
	  - Remove RD documents in favor of newly written and embedded
	    RDoc documentation.

Wed Oct 25 08:03:23 2006  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date/format.rb: updated based on date2 3.9.6.
	  [ruby-core:09323]

Sun Oct 22 14:48:31 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* signal.c (ruby_signal): don't set SA_RESTART.  a backport from
	  the HEAD.  [ruby-talk:220937]  [ruby-talk:147220]

	* signal.c (Init_signal): avoid duplicated installation of SIGCHLD
	  handler.

Sun Oct 22 16:47:56 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_substr): should be infected with only original
	  string, but not the shared string.  fixed: [ruby-core:09152]

	* string.c (rb_str_new4): keep shared string untainted when orignal
	  string is tainted.  fixed: [ruby-dev:29672]

Sun Oct 22 05:20:34 2006  URABE Shyouhei  <shyouhei@ice.uec.ac.jp>

	* configure.in: alloca is broken; use C_ALLOCA instead.
	  [ruby-dev:29416]

Fri Oct 20 10:47:43 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* lib/mkmf.rb: fixed the bug of handling COMMON_MACROS.

Fri Oct 20 08:42:38 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (NULLCMD): dummy command.

	* bcc32/Makefile.sub (post-install-*): Borland make cannot ignore
	  command-less double-colon rules.  [ruby-dev:29676]

Fri Oct 20 00:37:07 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bcc32/Makefile.sub ($(LIBRUBY_SO)): execute pre-link hook.

	* ext/extmk.rb: workaround for Borland make.

Wed Oct 18 23:02:40 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (rb_ary_shift): shorten copy size.  fixed: [ruby-list:42907]

	* signal.c (Init_signal): handle SIGTERM.  fixed: [ruby-list:42895]

	* win32/win32.c (rb_w32_utime): allow NULL to set the current time.
	  [ruby-talk:219248]

Wed Oct 18 00:55:33 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (parser_yylex): use particular enums.  [ruby-core:09221]

Mon Oct 16 08:30:43 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* mkconfig.rb: *OBJS are not needed for extension libraries.

	* {bcc32,wince,win32}/Makefile.sub (config.status): fixed typo,
	  missing comma.

Sun Oct 15 01:03:08 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/test/unit/collector/dir.rb (Collector::Dir#collect): append base
	  directory but not prepend.

	* lib/test/unit/collector/dir.rb (Collector::Dir#collect_file): do not
	  join with dot.  fixed: [ruby-core:09179]

Sat Oct 14 23:39:50 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (singleton): no need to re-create NODE_SELF() again.
	  [ruby-core:09177]

Sat Oct 14 23:25:31 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (parser_warning, parser_warn): some error message may
	  contain format specifiers.  a patch from Akinori MUSHA <knu at
	  iDaemons.org>.  [ruby-dev:29657]

	* ext/bigdecimal/bigdecimal.c (VpException): ditto.

	* ext/dl/handle.c (rb_dlhandle_initialize): ditto.

	* ext/gdbm/gdbm.c (rb_gdbm_fatal): ditto.

Sat Oct 14 08:24:45 2006  Akinori MUSHA  <knu@iDaemons.org>

	* ext/digest/lib/digest/hmac: Back out the addition of digest/hmac
	  for now because the API is too premature for a stable branch.

Sat Oct 14 00:55:08 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bcc32/Makefile.sub (post-install-ext): no longer needed.

	* bcc32/configure.bat: get rid of a quirk of Borland make, which
	  sets empty macro in command line to "1".

Fri Oct 13 22:50:43 2006  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb: updated based on date2 3.9.5.

Fri Oct 13 22:33:28 2006  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (FileUtils.cp_r): dereference_root=true is
	  default in Ruby 1.8.  This line is wrongly removed in last commit.

Fri Oct 13 18:19:31 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* object.c: Class#inherited RDoc added.  a patch from Daniel
	  Berger <djberg96 at gmail.com>  [ruby-core:08942]

Fri Oct 13 02:30:12 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/test/unit/collector/dir.rb (Collector::Dir#collect): prepend
	  base directory to load path.

	* lib/test/unit/collector/dir.rb (Collector::Dir#collect_file): should
	  use the given File-like interface, but not File directly.

	* test/testunit/collector/test_dir.rb (TestDir::FileSystem): implement
	  File-like methods correctly.

Fri Oct 13 01:48:42 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/date.rb (Date::self.complete_hash): need to check if g is
	  nil before dereference.  [ruby-core:09116]

Fri Oct 13 00:34:26 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* object.c (rb_mod_cvar_defined): wrong id check.  a patch from
	  Mauricio Fernandez <mfp at acm.org>.  [ruby-core:09158]

	* object.c (rb_mod_cvar_get): typo fixed.  [ruby-core:09168]

	* object.c (rb_mod_cvar_set): ditto.

Wed Oct 11 22:21:41 2006  Akinori MUSHA  <knu@iDaemons.org>

	* ext/digest: Merge from trunk; metadata location changed,
	  Digest::Base#reset() added, Digest::Base#equal() changed, and
	  digest/hmac added with some modifications made for ruby 1.8.

Tue Oct 10 17:24:12 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* {bcc32,win32,wince}/Makefile.sub (config.status): shouldn't use
	  copy command instead of install. use -run install.

Tue Oct 10 16:49:16 2006  Akinori MUSHA  <knu@iDaemons.org>

	* ext/digest/digest.c (hexdigest_str_new, bubblebabble_str_new):
	  Perform StringValue() checks properly.

	* ext/digest/digest.c: Use RSTRING_{PTR,LEN} macros.

Tue Oct 10 13:49:53 2006  Akinori MUSHA  <knu@iDaemons.org>

	* ext/digest: Merge from trunk; apply all changes since the
	  initial import, except for the removal of compatibility stub
	  libraries (md5.rb and sha1.rb).

Mon Oct  9 23:46:29 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/parsedate.rb: documentation patch from Konrad Meyer
	  <konrad.meyer@gmail.com>.  [ruby-doc:1238]

	* lib/open3.rb, lib/ping.rb: ditto.

Mon Oct  9 22:56:12 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/rexml/encoding.rb (REXML::Encoding::check_encoding): spaces
	  are allowed around equal sign.  [ruby-core:09032]

	* lib/rexml/parsers/baseparser.rb (REXML::Parsers::BaseParser): ditto.

Sat Oct  7 23:53:08 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_scan): small documentation fix.
	  [ruby-core:09007]

Sat Oct  7 23:44:33 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* bignum.c (rb_big_rshift): a bug in right shift of negative
	  bignums.  [ruby-core:09020]

Sat Oct  7 00:27:58 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* class.c (rb_include_module): remove unnecessary check.
	  [ruby-talk:218402]

Fri Oct  6 04:30:30 2006  Akinori MUSHA  <knu@iDaemons.org>

	* sample/openssl/c_rehash.rb: Use digest/md5 instead of obsolete md5.

Wed Oct  4 18:47:25 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tkextlib/*: bugfix and update
	  (see ext/tk/ChangeLog.tkextlib).

Wed Oct  4 17:25:14 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_call): check protected visibility based on real self,
	  not ruby_frame->self.  [ruby-talk:217822]

Wed Oct  4 08:52:30 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/optparse/test_getopts.rb: changed the class name of test case
	  to get rid of conflict with test_optparse.rb.

Tue Oct  3 23:32:27 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/test/unit/testcase.rb (Test::Unit::TestCase.suite): test name
	  must be string.  fixed: [ruby-core:08978]

Mon Oct  2 23:47:55 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/test/unit/autorunner.rb (Test::Unit::AutoRunner::COLLECTORS):
	  base directory should be lower precedence.  fixed: [ruby-dev:29622]

	* lib/test/unit/autorunner.rb (Test::Unit::AutoRunner#options): typo.

	* lib/test/unit/collector/dir.rb (Test::Unit::Collector::Dir#collect_file):
	  load expanded path.  fixed: [ruby-dev:29621]

Mon Oct  2 15:49:19 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* instruby.rb: batfile should be CRLF'ed.

Mon Oct  2 01:24:26 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (test-all): separate directory where running test cases
	  from source tree.

	* lib/test/unit/autorunner.rb (options): added --basedir, --workdir
	  and --load-path options.

	* lib/test/unit/collector/dir.rb (recursive_collect, collect_file):
	  base directory support.

Sun Oct  1 23:56:52 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* Makefile.in, common.mk, ext/extmk.rb, win{32,ce}/Makefile.in: keep
	  LIBRUBY_SO unless need to be removed.

Sun Oct  1 23:12:19 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb (OptionParser#make_switch): pass arguments directly.

Sat Sep 30 15:12:25 2006  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb, lib/date/format.rb: updated based on date2 3.9.4.

Fri Sep 29 12:11:04 2006  WATANABE Hirofumi  <eban@ruby-lang.org>

	* jcode.rb (succ!): call original succ! if $KCODE == 'n'.
	  fixed: [ruby-talk:216845]

Fri Sep 29 11:43:40 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (try_func): revert fallback checking undeclared function.
	  fixed: [ruby-core:08949]

Fri Sep 29 09:56:56 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb: extout is needed for also clean.
	  fixed: [ruby-core:08944]

	* lib/optparse.rb (OptionParser::Switch#conv_arg): unsplat by
	  Proc#call if no conversion is given.

Thu Sep 28 23:59:31 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* node.h (struct thread): declare win32_exception_list on cygwin and
	  win32 regardless if it is implemented.  Provisional fix for
	  [ruby-core:08917].

Thu Sep 28 20:53:16 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* lib/tmpdir.rb: use return value of getdir.call for length.

Wed Sep 27 01:04:49 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (try_func): check function pointer first and macro next.

	* lib/mkmf.rb (have_type): simplified with typedef and sizeof.

Tue Sep 26 23:57:03 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb (OptionParser#getopts): use strings as key.
	  fixed: [ruby-dev:29614]

Tue Sep 26 15:31:26 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* {win32,wince}/Makefile.sub (CPP): check predefined value.

Tue Sep 26 07:55:16 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_shift): should not move memory region if array
	  body is shared.  a patch from Kent Sibilev <ksruby at gmail.com>.
	  [ruby-core:08922]

Mon Sep 25 22:26:26 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_path_end): skip root directory.  fixed: [ruby-core:08913]

	* lib/mkmf.rb (init_mkmf): set default $LDFLAGS.  Patch by Michal
	  Suchanek <hramrach at centrum.cz>.  [ruby-talk:216256]

Mon Sep 25 08:14:43 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_shift): should clear shifting top element.
	  [ruby-talk:216055]

	* array.c (rb_ary_shift): avoid creating shared object if array
	  size is small.

Mon Sep 25 08:11:35 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* random.c (rb_f_rand): RDoc typo fix.  a patch from Frederick
	  Cheung <fred at 82ask.com>.  [ruby-talk:216047]

Sun Sep 24 22:28:20 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* runruby.rb: extension library scripts moved into common directory.

Sun Sep 24 14:59:50 2006  Tanaka Akira  <akr@fsij.org>

	* node.h (struct thread): ia64 support is broken by sandbox patch.

Sun Sep 24 12:11:16 2006  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb, lib/date/format.rb: updated based on date2 3.9.3.

Sat Sep 23 23:24:57 2006  why the lucky stiff  <why@ruby-lang.org>

	* eval.c (rb_thread_save_context, rb_thread_restore_context):
	  sandbox hook to save and restore sandbox state.

	* eval.c (thread_no_ensure): added THREAD_NO_ENSURE thread flag.

	* eval.c (rb_thread_kill_bang): Thread#kill! uses the above flag
	  to circumvent ensure, in order to prevent endless loops.
	  [ruby-core:08768]

	* eval.c (rb_thread_kill): fix Thread#kill docs, which returns
	  the thread object in all cases.

	* node.h: expose the rb_jmpbuf_t and rb_thread_t structs, along
	  with the thread flags.  used by the sandbox extension.

	* ruby.h: extern rb_eThreadError, so sandbox can swap it.

Sat Sep 23 21:34:15 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/cgi.rb (CGI::QueryExtension::read_multipart): CGI content
	  may be empty.  a patch from Jamis Buck <jamis at 37signals.com>.

Sat Sep 23 08:35:53 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/rdoc/ri/ri_options.rb: prevent NameError.  [ruby-dev:29597]

Sat Sep 23 01:04:20 2006  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb, lib/date/format.rb: updated based on date2 3.9.2.

Fri Sep 22 02:06:26 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* .cvsignore: ignore timestamp files and installed list file.

Fri Sep 22 01:36:34 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* instruby.rb: include FileUtils unconditionally.

Thu Sep 21 22:56:20 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (no-install): not install rdoc actually.

	* common.mk (install-doc, no-install-doc): use instruby.rb.

	* instruby.rb: rdoc installation.

	* ext/extmk.rb: expand ruby executable names.

Thu Sep 21 13:55:07 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/etc/etc.c (etc_getpwuid): uid integer should be wraped in
	  uid_t value.  [ruby-core:08897]

	* ext/etc/etc.c (etc_getpwuid): uid_t may be bigger than plain
	  'int' type.

Wed Sep 20 23:17:41 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (pre-install-doc): create data directory before install.

	* lib/mkmf.rb (dir_re): fixed typo.

	* lib/mkmf.rb (install_dirs): remove extra slash.

Wed Sep 20 09:53:38 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* {bcc32,win32,wince}/Makefile.sub (INSTALLED_LIST): need to define
	  this macro to install.

Wed Sep 20 09:43:10 2006  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb: allow extra spaces in responses.
	  Thanks, Tom Soderlund. (backported from HEAD)

Wed Sep 20 09:25:39 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/gdbm/gdbm.c: add RDoc documentation. a patch from Peter
	  Adolphs <futzilogik at users dot sourceforge dot net>.
	  [ruby-doc:1223]

Tue Sep 19 01:28:00 2006  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb: backport from HEAD (rev 1.71).

	* lib/fileutils.rb (FileUtils.cp_r): new option
	  :remove_destination.

Tue Sep 19 00:42:15 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* object.c (rb_obj_ivar_defined, rb_mod_cvar_defined): new methods,
	  Kernel#instance_variable_defined? and Module#class_variable_defined?.
	  [ruby-dev:29587]

	* lib/date/format.rb (Date::Bag#method_missing): use new method,
	  instance_variable_defined? to check if an instance variable is
	  defined.  fixed: [ruby-dev:29554]
	  -- This didn't fix anything.

Sun Sep 17 23:44:58 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/rdoc/rdoc.rb (RDoc::RDoc#document): scan only files modified
	  after the previous generation.

Sun Sep 17 17:42:13 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (install-doc): reverted.

	* instruby.rb: stores file name list without destdir prefix.

	* lib/rdoc/generators/ri_generator.rb: do not chdir twice.

Sat Sep 16 23:14:29 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/pty/pty.c (establishShell): remove remaining unused line.

Sat Sep 16 16:40:44 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* Makefile.in, common.in, instruby.rb, ext/extmk.rb, lib/mkmf.rb:
	  use instruby.rb to install extensions instead of ext/extmk.rb.

	* instruby.rb: store installed list into the file.

	* ext/dbm/extconf.rb: allow multiple candidates for dbm-type.

	* ext/io/wait/extconf.rb: suspicious checking_for.

	* ext/pty/pty.c (establishShell): parent pid is not used.

	* ext/pty/pty.c (freeDevice): not used.

	* ext/pty/pty.c (get_device_once): removed garbage right brace.

	* lib/mkmf.rb (checking_for): improved the messages.

Thu Sep 14 16:11:15 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_intern): raise SecurityError only when $SAFE
	  level is greater than zero.  [ruby-core:08862]

	* parse.y (rb_interned_p): new function to check if a string is
	  already interned.

	* object.c (str_to_id): use rb_str_intern().

Wed Sep 13 18:43:05 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* README.EXT: English adjustment.  [ruby-core:08851] and
	  [ruby-core:08852]

Wed Sep 13 18:25:18 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* misc/ruby-mode.el (ruby-parse-partial): better here-doc support.
	  a patch from Marshall T. Vandegrift <llasram at gmail.com>.
	  [ruby-core:08804]

Wed Sep 13 16:43:36 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_intern): prohibit interning tainted string.

Wed Sep 13 01:14:21 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb (OptionParser#getopts): works with pre-registered
	  options.  [ruby-core:08826]

Sun Sep 10 20:27:13 2006  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb, lib/date/format.rb: updated based on date2 3.9.1.

Tue Jan 10 09:18:03 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (stack_extend): fixed prototype.

	* eval.c (rb_require_safe): prevent extension from loading twice.
	  fixed: [ruby-dev:29523]

Sat Sep  9 23:50:38 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* bignum.c (rb_big_mul0): bignum multiplication without
	  normalization.

	* bignum.c (rb_big_pow): use rb_big_mul0().  [ruby-dev:29547]

Sat Sep  9 14:08:38 2006  Eric Hodel  <drbrain@segment7.net>

	* lib/test/unit/testcase.rb (Test::Unit::TestCase#run): Rescue
	  Exception in Test::Unit::TestCase#run.  [ruby-core:08783]

Sat Sep  9 04:55:59 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/pstore.rb: open all in binary mode, and get rid of the quirk of
	  msvcrt.  fixed: [ruby-dev:29518]

Sat Sep  9 04:54:42 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* Makefile.in, win32/Makefile.sub (MINIRUBY): append MINIRUBYOPT.

	* mkconfig.rb, ext/extmk.rb, lib/mkmf.rb, win32/mkexports.rb: suppress
	  warnings with $VERBOSE.

	* ext/extmk.rb: Proc#call does not pass the block in 1.8.

	* win32/resource.rb: add more info.

Fri Sep  8 10:03:59 2006  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/cookie.rb (WEBrick::Cookie.parse_set_cookies): new
	  method to parse multiple cookies per Set-Cookie header.
	  Thanks to Aaron Patterson <aaron_patterson at speakeasy.net>.
	  [ruby-core:08802]

Fri Sep  8 08:59:30 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/Makefile.sub, win32/configure.bat win32/setup.mak: program
	  name transform.

Fri Sep  8 01:33:08 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ruby.h (RSTRING_PTR): add migration macro.

	* ruby.h (RARRAY_PTR): ditto.

Thu Sep  7 23:27:05 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (path_check_0, fpath_check): disable path check on cygwin.
	  [ruby-talk:213074]

Wed Sep 06 12:05:19 2006  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/nkf/lib/kconv.rb (Kconv::RegexpEucjp): fix regexp for euc-jp
	  [ruby-dev:29344]

	* ext/nkf/lib/kconv.rb (Kconv::toeuc): remove -m0 [ruby-dev:29505]

Tue Sep  5 06:47:22 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* time.c (time_to_s): variable declaration after an execution
	  statement.

Tue Sep  5 05:56:51 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* numeric.c (flo_hash): improve collision.  fixed: [ruby-dev:29352]

Tue Sep  5 05:49:41 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (path_check_0): check if sticky bit is set on parent
	  directories for executable path.  fixed: [ruby-dev:29415]

Tue Sep  5 05:03:46 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* numeric.c (fix_plus): addition in Fixnum will never overflow
	  long.  a patch from Ondrej Bilka <neleai at seznam.cz>.
	  [ruby-core:08794]

	* numeric.c (fix_minus): ditto.

	* bignum.c (rb_big_pow): eagerly truncate resulting bignum.
	  [ruby-core:08794]

Mon Sep  4 23:15:34 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* time.c (time_to_s): make it conform to RFC2822 date format.
	  [ruby-dev:29467]

Mon Sep  4 21:43:57 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/dbm/extconf.rb: create makefile according to the result of check
	  for dbm header.  fixed: [ruby-dev:29445]

Mon Sep  4 21:42:35 2006  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb, lib/date/format.rb: updated based on date2 3.9.

Mon Sep  4 21:14:20 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* time.c (time_strftime): include nul character.  fixed: [ruby-dev:29422]

Mon Sep  4 16:29:33 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/cgi.rb (CGI::out): specify -m0 -x option for nkf.
	  [ruby-dev:29284]

Mon Sep  4 16:13:23 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (pipe_open): command name should not contain null bytes.
	  [ruby-dev:29421]

	* process.c (proc_spawn): ditto.

	* process.c (proc_spawn_n): ditto.

	* process.c (rb_f_system): ditto.

Sun Sep  3 15:32:44 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb: get rid of nil.to_s.

Sun Sep  3 06:24:38 2006  Tanaka Akira  <akr@fsij.org>

	* ext/socket/socket.c (ruby_connect): sockerrlen should be socklen_t.

Sun Sep  3 04:40:42 2006  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: check arpa/inet.h for ntohs.

	* ext/socket/socket.c: include arpa/inet.h if available.

Sun Sep  3 02:34:55 2006  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/unix.rb (DRbUNIXSocket#close): don't get path if client mode.
	  [ruby-dev:29417]

Sun Sep  3 01:45:17 2006  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/acl.rb (ACLEntry#initialize): examine whether '*' is
	  included before IPAddr.new. [ruby-dev:29406]

Sat Sep  2 13:23:01 2006  Tanaka Akira  <akr@fsij.org>

	* common.mk (ia64.o): use the compiler driver to assemble ia64.s
	  to use appropriate ABI.

Sat Sep  2 03:36:22 2006  Tanaka Akira  <akr@fsij.org>

	* common.mk, configure.in, defines.h, eval.c, gc.c, main.c,
	  numeric.c, ruby.h, ia64.s: backport IA64 HP-UX support.

Fri Sep  1 13:52:57 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/font.rb: TkFont#current_configinfo() doesn't work
	  on Tcl/Tk8.x.

Thu Aug 31 12:46:55 2006  why the lucky stiff  <why@ruby-lang.org>

	* eval.c (ruby_init): rename top_cref to ruby_top_cref and export,
	  along with ruby_cref, for use by the sandbox. [ruby-core:08762]

	* node.h: ditto.

Tue Aug 29 19:10:10 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (rb_hash_s_create): fixed memory leak, based on the patch
	  by Kent Sibilev <ksruby at gmail.com>.  fixed: [ruby-talk:211233]

Mon Aug 28 11:36:02 2006  Eric Hodel  <drbrain@segment7.net>

	* lib/rdoc/parsers/parse_rb.rb: Fix typo.  Submitted by
	  <calamitas at gmail.com>.  [ruby-core:08724]

Mon Aug 28 07:53:44 2006  Eric Hodel  <drbrain@segment7.net>

	* lib/rdoc/ri/ri_formatter.rb: Don't unescape HTML in HtmlFormatter.
	  Submitted by Kent Sibilev <ksruby at gmail.com>.  [ruby-core:08392].

Mon Aug 28 07:25:45 2006  Eric Hodel  <drbrain@segment7.net>

	* file.c (File#size?): Fix documentation submitted by Rick Ohnemus.
	  ruby-Bugs-5529.  [ruby-core:08725]

Sat Aug 26 08:07:13 2006  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb, lib/date/format.rb: updated based on date2 3.8.2.

Fri Aug 25 22:32:04 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/rexml/source.rb (REXML::IOSource#initialize): encoding have to
	  be set with the accessor.  fixed: [ruby-list:42737]

Fri Aug 25 17:15:17 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* stable version 1.8.5 released.

Fri Aug 25 17:02:06 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* gc.c (gc_sweep): typo fixed.

Tue Aug 22 18:47:51 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser::handle_method):
	  rdoc documents C module methods as instance methods. a patch in
	  [ruby-core:08536].

Sat Aug 19 14:15:02 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/Makefile.sub (config.status): include winsock2.h instead of
	  winsock.h when --with-winsock2 is specified.
	  fixed: [ruby-dev:29296]

Sat Aug 19 11:28:08 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_file_s_rename): use errno if set properly.
	  fixed: [ruby-dev:29293]

Sat Aug 19 11:09:23 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (then): remove semicolon warning.  [ruby-dev:29299]

Thu Aug 17 19:15:16 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_stat_[rRwWxX]): check for super user.
	  fixed: [ruby-core:08616]

Thu Aug 17 14:47:06 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb: added rdoc by Daniel Berger.  [ruby-core:08177]

Thu Aug 17 00:39:05 2006  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/rinda/ring.rb (do_reply): Fix for RingServer fails to find a
	  TupleSpace when TupleSpace resides in the same ruby process with
	  RingServer. a patch from Kent Sibilev. [ruby-core:08453]

Wed Aug 16 11:45:36 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* process.c (proc_setuid, proc_setgid, proc_seteuid, proc_setegid):
	  get rid of bogus implementations on Mac OS X.

Tue Aug 15 19:10:18 2006  Eric Hodel  <drbrain@segment7.net>

	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser#find_class_comment): Fix
	  broken class-level documentation.

Wed Aug 16 11:09:26 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ruby.c (set_arg0): fill argv other than the first with an empty
	  string instead of NULL.

Wed Aug 16 11:08:00 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.h: removed an excess macro.  fixed: [ruby-dev:29258]

Tue Aug  8 23:49:06 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/irb/extend-command.rb (IRB::ExtendCommandBundle): pacify
	  RDoc.  a patch from Eric Hodel <drbrain at segment7.net>.
	  [ruby-core:08522]

Tue Aug  8 11:32:54 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* Makefile.in, common.mk, configure.in: fix for platforms without
	  rm. patches from Yutaka kanemoto <kinpoco at gmail.com>.
	  [ruby-dev:29215]

Mon Aug  7 17:56:59 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c, ext/digest/rmd160/rmd160ossl.c,
	  ext/digest/sha1/sha1ossl.c, ext/readline/readline.c: move
	  incluion of config.h to pacify AIX.  a patch from Yutaka
	  Kanemoto <kinpoco at gmail.com>.  [ruby-dev:29197]

Mon Aug  7 15:55:08 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/syck/syck.c (syck_move_tokens): should avoid negative
	  memmove.  [ruby-list:42625]

Mon Aug  7 14:37:48 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* configure.in, common.mk: AIX link issue.  a patch from Yutaka
	  Kanemoto <kinpoco at gmail.com>.  [ruby-dev:29190]

	* ext/socket/socket.c: AIX socket support.  [ruby-dev:29190]

Mon Aug  7 12:05:28 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* dln.c, eval.c, gc.c, regex.c, ruby.h: shut up AIX alloca
	  warning.  a patch from Yutaka Kanemoto <kinpoco at gmail.com>.
	  [ruby-dev:29191]

Sun Aug  6 20:40:41 2006  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date/format.rb (str[fp]time): %[EO]U didn't denote %U.

Sat Aug  5 17:07:43 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (top_local_setup): local_vars[-1] should point
	  ruby_scope itself to protect local_tbl from garbage collection.
	  [ruby-dev:29049]

Sat Aug  5 13:54:03 2006  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date/format.rb (str[fp]time): "%\n" means "\n".

Fri Aug  4 15:21:00 2006  Eric Hodel  <drbrain@segment7.net>

	* lib: Merge RDoc and .document from HEAD.
	* lib/drb/ssl.rb: Close socket on SSLError [ruby-core:7197]

Fri Aug  4 19:13:41 2006  Keiju Ishitsuka  <keiju@ruby-lang.org>

	* lib/irb/{init.rb,ruby-lex.rb,slex.rb}: can't input '\c' for
	  [ruby-core: 7122].

Fri Aug  4 14:02:14 2006  James Edward Gray II  <james@grayproductions.net>

	* lib/date/format.rb (__strptime, strftime): allow multi-line patterns
	  in Date#strftime the same as Time#strftime accepts.
	  fixed: [ruby-core:08466]

Fri Aug  4 13:56:51 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* pack.c (pack_pack): check argument overrun for 'P'.  based on a
	  patch by rucila <rucila at yahoo.cojp>.  fixed: [ruby-dev:29182]

Tue Aug  1 17:44:03 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (init_stdhandle): assign standard file handles.

Tue Aug  1 12:24:58 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (Init_Binding): fix old commit miss.

Mon Jul 31 17:08:20 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (exit_handler): new function; release winsock and
	  environment work area.

	* win32/win32.c (NTInitialize): setup exit_handler.

	* win32/win32.c (StartSockets): use exit_handler.

	* win32/win32.c (rb_w32_getenv): use GetEnvironmentStrings() instead
	  of GetEnvironmentVariable(), because the latter cannot distinguish
	  wheather a null environment variable exists or not.
	  fixed: [ruby-talk:205123]

Mon Jul 31 16:15:13 2006  Tanaka Akira  <akr@fsij.org>

	* test/ruby/test_process.rb (TestProcess#test_rlimit_nofile):
	  setrlimit may fail with EINVAL.
	  reported by MIYAMUKO Katsuyuki.  [ruby-dev:29174]

Mon Jul 31 13:38:22 2006  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httprequest.rb (WEBrick::HTTPReuqest#parse_uri): improve
	  for the value of IPv6 address in the Host: header field.

Mon Jul 31 09:22:12 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ruby.h: use ifdef (or defined) for macro constants that may or
	  may not be defined to shut up gcc's -Wundef warnings.
	  [ruby-core:08447]

Sun Jul 30 23:26:22 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_call0): trace call/return of method defined from block.
	  fixed: [ruby-core:08329]

	* eval.c (rb_trap_eval): make the current thread runnable to deal with
	  exceptions which occurred within the trap.  fixed: [ruby-dev:27729]

	* lib/cgi/session.rb, lib/cgi/session/pstore.rb: suppress warnings.
	  fixed: [ruby-talk:204896]

Sat Jul 29 06:12:06 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: freeze ip_name for security reason.

Sat Jul 29 01:23:52 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/logger.rb: improves the amount of documentation that Rdoc
	  picks up when processing logger.rb by moving the require
	  statement back before the comment block.  a patch from Hugh
	  Sasse <hgs at dmu.ac.uk>.  [ruby-core:08422]

Thu Jul 27 22:21:52 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* time.c (time_to_s): fixed format mismatch.

Thu Jul 27 21:19:54 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* math.c (domain_check): a new function to check domain error
	  explicitly for systems that return NaN like FreeBSD.
	  [ruby-core:07019]

	* math.c (math_acos, math_asin, math_acosh, math_atanh, math_log,
	  math_log10, math_sqrt): use domain_check().

	* math.c (math_sqrt): fix documentation flaw.

Thu Jul 27 18:12:12 2006  WATANABE Hirofumi  <eban@ruby-lang.org>

	* time.c: need to declare time_utc_offset.

Thu Jul 27 17:01:01 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (io_close): always calls "close" method of the receiver.
	  [ruby-core:6911] [ruby-core:8112]

Thu Jul 27 16:49:01 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* time.c (time_to_s): use +0900 style timezone string for local time.
	  [ruby-dev:29143]

Thu Jul 27 16:41:15 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/openssl/ossl.h: move <ruby.h> inclusion point to shut up
	  Solaris compiler.  [ruby-core:08114]

Wed Jul 26 22:20:59 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* configure.in: add support for as and ASFLAGS.  [ruby-dev:29138]

Wed Jul 26 22:13:45 2006  Minero Aoki  <aamine@loveruby.net>

	* lib/net/http.rb: sync with HEAD (rev 1.132).

	* lib/net/http.rb (Net::HTTP#post, request_post, request): should
	  set Content-Type: x-www-form-urlencoded by default.

	* lib/net/http.rb (Net::HTTPHeader#content_type): should return
	  nil when there's no Content-Type.

	* lib/net/http.rb (Net::HTTPHeader#sub_type): should return nil
	  when there's no sub Content-Type (e.g. "Content-Type: text").

	* lib/net/http.rb (Net::HTTPHeader#type_params): wrongly failed
	  when there's no Content-Type.

Wed Jul 26 18:35:38 2006  Minero Aoki  <aamine@loveruby.net>

	* ext/strscan/strscan.c: sync with HEAD (rev 1.25).

	* ext/strscan/strscan.c (strscan_do_scan):
	  StringScanner.new("").scan(//) should return "". [ruby-Bugs:4361]

Wed Jul 26 18:14:19 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/pty/pty.c (getDevice): retry once after GC on failure.
	  [ruby-core:08282]

Wed Jul 26 17:28:16 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* sprintf.c (rb_f_sprintf): prepend ".." to %u for negative bignum,
	  but not "-".  fixed: [ruby-core:08167]

Wed Jul 26 16:39:07 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_scan): add string modification check.
	  [ruby-core:7216]

Wed Jul 26 16:06:03 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/cgi.rb (CGI::QueryExtension::read_multipart): check
	  multipart boundary end.  a patch from Fujioka <fuj at rabbix.jp>
	  [ruby-dev:28470]

Wed Jul 26 01:02:59 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: suppress warnings by automake 1.8 or later.

Tue Jul 25 00:30:06 2006  Eric Hodel  <drbrain@segment7.net>

	* lib/prettyprint.rb: RD to RDoc conversion by Hugh Sasse.

Tue Jul 25 14:49:51 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* lib/mkmf.rb (configuration): typo.

Tue Jul 25 13:14:32 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* process.c (rb_proc_times): rename hz to hertz to avoid name
	  crash on AIX.  [ruby-dev:29126]

Mon Jul 24 22:03:40 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (backtrace): skip frames successive on node and method name.

Mon Jul 24 17:55:55 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* process.c (rb_f_system): add security check.  [ruby-talk:202947]

	* process.c (rb_f_system): move signal right before fork to avoid
	  signal handler intervention.

Mon Jul 24 15:51:52 2006  Tanaka Akira  <akr@fsij.org>

	* ext/readline/readline.c (readline_readline): rl_deprep_term_function
	  may be NULL with libedit.  reported by Ryan Davis.  [ruby-dev:29070]

Mon Jul 24 15:19:55 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_call0): revert last change.  [ruby-dev:29112]
	  [ruby-core:08374]

Sun Jul 23 22:59:49 2006  Tanaka Akira  <akr@fsij.org>

	* test/socket/test_unix.rb: disabled on cygwin.
	  reported by Kouhei Yanagita.  [ruby-dev:29080]

Fri Jul 21 21:21:08 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_call0): include funcalled methods in caller list.
	  fixed: [ruby-core:08290]

Fri Jul 21 12:11:00 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb, lib/mkmf.rb (with_destdir): remove drive letter before
	  prepending destdir on DOSISH.

Thu Jul 20 15:07:14 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ruby.h: export classes/modules to implement sandbox.
	  [ruby-core:08283]

Thu Jul 20 00:06:29 2006  Keiju Ishitsuka  <keiju@ishitsuka.com>

	* lib/irb/completion.rb: support for completion of numeric
	  number. [ruby-dev: 29038]

Wed Jul 19 23:53:05 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/parser.rb, lib/rss/utils.rb: added documents.

Tue Jul 18 22:10:13 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* process.c (rb_f_system): block SIGCHLD during the process
	  execution, like glibc system(3) does.  [ruby-talk:202361]

Tue Jul 18 23:12:14 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (open_ifs_socket): should not use plain malloc.

	* win32/win32.c (rb_w32_opendir): should not use plain realloc.

Tue Jul 18 18:05:49 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* test/ruby/test_float.rb (TestFloat::test_strtod): update test to
	  conform strtod change.

Tue Jul 18 15:49:42 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* pack.c (pack_unpack): propagate association array to copied
	  string.  [ruby-core:08223]

	* pack.c (pack_unpack): return referenced string itself if it has
	  same length as specified.  a patch from <nobu at ruby-lang.org>
	  in [ruby-core:08225].

	* pack.c (pack_pack): taint 'p' packed strings.

Tue Jul 18 14:03:02 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/webrick/httpserver.rb (WEBrick::HTTPServer::unmount): remove
	  inpect argument from sprintf.  [ruby-dev:29039]

Tue Jul 18 10:53:37 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* object.c (rb_cstr_to_dbl): limit out-of-range message.

	* util.c (ruby_strtod): return end pointer even if ERANGE occurred.
	  fixed: [ruby-dev:29041]

Mon Jul 18 00:43:05 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* util.c (ruby_strtod): stop at dot not followed by digits.
	  fixed: [ruby-dev:29035]

Tue Jul 18 00:01:27 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb: remove LIBRUBY_SO if static linked extensions exist.

Mon Jul 17 23:30:46 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (rb_cv_msvcrt): defaulted to msvcrt.  Workaround for a
	  bug of cygwin 1.5.20.

Mon Jul 17 13:43:05 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* pack.c (define_swapx): should not use plain malloc.

Mon Jul 17 12:58:41 2006  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in: should use ac_cv_lib_dl_dlopen=no on MinGW.

Sat Jul 15 23:50:12 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_require_safe): wait for another thread requiring the same
	  feature.  fixed: [ruby-core:08229]

Sat Jul 15 01:27:13 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (has_magic): glob names contain alphabets to enable case fold
	  search also for directories.  fixed: [ruby-talk:201917]

Sat Jul 15 01:09:22 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* st.c (malloc): use xmalloc/xcalloc instead of plain
	  malloc/calloc, to detect memory allocation failure.  see
	  <http://www.nongnu.org/failmalloc/>.

	* gc.c (rb_memerror): should not raise empty nomem_error.

Fri Jul 14 13:08:13 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: add methods for new features of latest Tcl/Tk8.5.

	* ext/tk/lib/tk/namespace.rb: ditto.

Fri Jul 14 02:30:12 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/monitor.rb: document patch from Hugh Sasse <hgs at dmu.ac.uk>.
	  [ruby-core:08205]

Fri Jul 14 01:09:46 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (then): error in warning action.

Fri Jul 14 00:10:15 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_pop): may cause realloc oscillation.  a patch
	  from MORITA Naoyuki <mlgetter at kidou.sakura.ne.jp>.
	  [ruby-dev:29028]

Thu Jul 13 22:23:56 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/composite.rb: improve handling of the classname on the
	  option database for the widget class which includes TkComposite.

Thu Jul 13 20:32:19 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/parser.rb: updated documents by a patch from
	  Hugh Sasse <hgs at dmu.ac.uk>. [ruby-core:8194]

Wed Jul 12 13:54:09 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (then): we'd like to reserve colon here for the future.
	  warning added.

Tue Jul 11 20:58:18 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ruby.h: export rb_cMethod.  [ruby-talk:201259]

Tue Jul 11 19:13:33 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: remove restriction on the class of
	  pseudo-toplevel.

Tue Jul 11 18:00:57 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: security fix.

Tue Jul 11 17:33:39 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* string.c (rb_str_dump): need to extend len for \b.

Mon Jul 10 22:00:00 2006  Shigeo Kobayashi  <shigek@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c: Allows '_' to appear within
	  digits.  [ruby-dev:28872]

	* ext/bigdecimal/lib/bigdecimal/util.rb: Bug in to_r reported by
	  [ruby-list:42533] fixed.

Mon Jul 10 19:22:19 2006  Tanaka Akira  <akr@fsij.org>

	* gc.c (gc_sweep): expand heap earlier.
	  reported by MORITA Naoyuki.  [ruby-dev:28960]

Mon Jul 10 18:59:34 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/font.rb: sorry. mistaken to patch.

Mon Jul 10 18:46:52 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tcltklib.c: make SEGV risk lower at exit.

	* ext/tk/lib/tk.rb: ditto.

	* ext/tk/lib/multi-tk.rb: fail to call function-style methods on slave
	  interpreters. The strategy (MultiTkIp_PseudoToplevel_Evaluable) to
	  fix the problem is a little tricky. You may have to take care of
	  conflicting with it.

	* ext/tk/lib/tk.rb: a little change for the pseudo-toplevel strategy.

	* ext/tk/lib/tk/font.rb: ditto.

	* ext/tk/lib/tk/msgcat.rb: ditto.

	* ext/tk/lib/tkextlib/itk/incr_tk.rb: ditto.

	* ext/tk/sample/demos-en/widget: fail to call function-style methods
	  on sample scripts. To fix it, a strategy which similar to the way
	  on MultiTiIp is used. Please take care when re-write and re-run a
	  demo script on the Widget-Demo code viewer.

	* ext/tk/sample/demos-jp/widget: ditto.

Mon Jul 10 13:58:40 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* signal.c (ruby_nativethread_signal, posix_nativethread_signal,
	  sigsend_to_ruby_thread, install_nativethread_sighandler):
	  nativethread-support on signal handler. RE-backport from 1.9.

	* ruby.h (HAVE_NATIVETHREAD_KILL): ditto.

	* eval.c (ruby_native_thread_kill): ditto.

Mon Jul 10 10:54:14 2006  Ryan Davis  <ryand@zenspider.com>

	* lib/rdoc/parsers/parse_f95.rb: massive overhaul from Yasuhiro
	  Morikawa including new file suffixes, function support, public
	  variables and constants, derived-types, defined operators and
	  assignments, namelists, and subroutine and function
	  arguments. Truly massive.

	* lib/rdoc/diagram.rb: diagrams are now cached.

	* lib/irb/completion.rb: fixed a crasher when completing against
	  an unnamed class/module.

	* lib/rdoc/parsers/parse_c.rb: private comment (--/++) support in
	  C-file rdoc.

	* lib/debug.rb: minor clarification in help.

	* lib/pp.rb: minor clarification on exception.

Mon Jul 10 09:29:12 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_clear_cache_for_undef): clear entries for included
	  module.  fixed: [ruby-core:08180]

Mon Jul 10 01:48:38 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* st.h (st_data_t): use pointer sized integer for st_data_t.
	  [ruby-dev:28988]

Sun Jul  9 18:06:47 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (try_constant): fix for value 1 at cross compiling.

	* lib/mkmf.rb (create_makefile): prevent substitution of macro
	  definition.  fixed: http://www.yotabanana.com/lab/20060624.html#p02

Sun Jul  9 00:54:34 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (next_jump): deal with destination of next.
	  fixed: [ruby-core:08169]

Fri Jul  7 00:38:49 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* hash.c (rb_hash_default): should not call default procedure if
	  no key is given.  [ruby-list:42541]

Fri Jul  7 00:29:10 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* time.c (time_mload): a patch from Daniel Berger
	  <Daniel.Berger at qwest.com>.  [ruby-core:08128]

Thu Jul  6 22:21:57 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* process.c (rb_proc_times): use sysconf(_SC_CLK_TCK) value prior to
	  HZ and CLK_TCK.  fixed: [ruby-talk:200293]

Thu Jul  6 22:17:21 2006  Minero Aoki  <aamine@loveruby.net>

	* ext/racc/cparse/cparse.c: sync with original code, rev 1.8.

	* ext/racc/cparse/cparse.c: should mark CparseParams objects.

	* lib/racc/parser.rb: sync with original code, rev 1.8.

	* lib/racc/parser.rb: update coding style.

Mon Jul  3 19:04:38 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tcltklib.c (ip_make_menu_embeddable): help to make a menu
	  widget embeddable (pack, grid, and so on) like as a general widget.
	  However, an embeddable menu may require to be definied some event
	  bindings for general use.

	* ext/tk/lib/tk/event.rb: [bug fix] Tk.callback_break and
	  Tk.callback_continue don't work on MultiTkIp.

	* ext/tk/lib/multi-tk.rb: ditto.

	* ext/tk/lib/tk.rb: lack of Tk.callback_return.

	* ext/tk/lib/tk/menu.rb: improve creating clone menus.

Mon Jul  3 14:42:06 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/etc/extconf.rb (PW_UID2VAL, PW_GID2VAL): defaulted to conversion
	  from int, and sys/types.h needs to be included before grp.h.
	  fixed: [ruby-dev:28938]

Mon Jul  3 01:14:15 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_inspect): encode \b (\010) for escape.
	  [ruby-dev:28927]

	* string.c (rb_str_dump): ditto.

Sun Jul  2 19:17:56 2006  Minero Aoki  <aamine@loveruby.net>

	* ext/racc/cparse/cparse.c: sync with original code (rev 1.7).

	* ext/racc/cparse/cparse.c: use rb_catch instead of rb_iterate.
	  Giving a block to a Ruby-level method by rb_iterate is obsolete on
	  Ruby 1.9.  Note that current cparse.c still includes one
	  rb_iterate call on Ruby 1.8, but it is not a problem (at least
	  just now).

Sat Jul  1 15:15:49 2006  Tanaka Akira  <akr@m17n.org>

	* test/socket/test_nonblock.rb: add timeout to send/receive
	  an empty UDP packet.
	  [ruby-dev:28820]

Fri Jun 30 23:46:23 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* configure.in: should test isinf for Solaris with GCC compiler.
	  a patch from <ville.mattila at stonesoft.com>.  [ruby-core:07791]

	* configure.in: -shared patch from Andrew Morrow
	  <andrew.c.morrow at gmail.com>.  [ruby-core:08100]

Thu Jun 29 18:58:51 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c (BigDecimal_version): fix patch
	  failure.

Thu Jun 29 18:00:51 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c: add RDoc document.  a patch from
	  mathew <meta at pobox.com>.   [ruby-core:07050]

Wed Jun 28 15:47:14 2006  Eric Hodel  <drbrain@segment7.net>

	* lib/optparse.rb: RDoc patch from Robin Stocker <robin@nibor.org>
	  [ruby-core:08087]

Wed Jun 28 19:04:34 2006  Tanaka Akira  <akr@m17n.org>

	* test/socket/test_unix.rb: test_seqpacket_pair removed.
	  [ruby-dev:28846]

Tue Jun 27 23:03:49 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c: RDoc update for =~ method.  a patch from Alex Young
	  <alex at blackkettle.org>.  [ruby-core:08068]

Tue Jun 27 22:47:18 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tcltklib.c: forgot to update TCLTKLIB_RELEASE_DATE.

	* ext/tk/lib/tk.rb (tk_tcl2ruby): [bug fix] sometimes fail to convert
	  a tcl string to a ruby object if the tcl string includes "\n".

Tue Jun 27 16:04:05 2006  WATANABE Hirofumi  <eban@ruby-lang.org>

	* win32/win32.h: define isascii on MinGW for msvcrt compatibility.

	* configure.in: set ac_cv_header_sys_time_h=no on MinGW
	  for msvcrt compatibility.

Tue Jun 27 11:36:02 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/etc/etc.c (setup_passwd, setup_group): allow bignum uid, gid and
	  so on.  [ruby-talk:199102]

Mon Jun 26 13:37:27 2006  Eric Hodel  <drbrain@segment7.net>

	* lib/rdoc: Merge from HEAD.
	  Add options to limit the ri search path.

Tue Jun 27 00:54:08 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* util.c (powersOf10): constified.

Mon Jun 26 18:37:44 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tcltklib.c (ip_delete): fix SEGV when a slave-ip is
	  deleted on callback.

Mon Jun 26 10:47:42 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (pipe_open): avoid closing uninitialized file descriptors.
	  a patch from <tommy at tmtm.org> [ruby-dev:28600]

Mon Jun 26 09:56:22 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.[ch] (rb_w32_send, rb_w32_sendto): constified.

Sun Jun 25 23:02:12 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* Makefile.in, mkconfig.rb: catch-up for latest autoconf.

Sat Jun 24 06:35:00 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* signal.c: revert last change.

	* ruby.h: ditto.

	* eval.c: ditto.

Thu Jun 22 11:52:02 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/net/http.rb (Net::HTTPResponse): duplicated error 501;
	  HTTPInternalServerError should be error 500.  [ruby-core:08037]

Thu Jun 22 05:15:58 2006  Tanaka Akira  <akr@m17n.org>

	* ext/socket/socket.c (sock_s_socketpair): try GC only once.
	  [ruby-dev:28778]

Wed Jun 21 21:28:32 2006  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb (jd_to_commercial): now works fine even if in
	  mathn-ized context.

Wed Jun 21 17:32:31 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* signal.c (ruby_nativethread_signal, posix_nativethread_signal,
	  sigsend_to_ruby_thread, install_nativethread_sighandler):
	  nativethread-support on signal handler (backport from 1.9).

	* ruby.h (HAVE_NATIVETHREAD_KILL): ditto.

	* eval.c (ruby_native_thread_kill): ditto.

Wed Jun 21 08:39:54 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/xmlrpc/create.rb (XMLRPC::Create::conv2value): merge Date
	  and Time processing.  [ruby-core:08033]

Wed Jun 21 01:40:25 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (yylex, reswords): modifier token is no longer returned in
	  fname state.  [ruby-dev:28775]

Wed Jun 21 01:12:46 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb: RSS::Element.def_corresponded_attr_writer
	  supported date type.

Tue Jun 20 22:08:36 2006  Kouhei Sutou  <kou@cozmixng.org>

	* test/rss/test_parser.rb: split parser tests into ...
	* test/rss/test_parser_1.0.rb: ... RSS 1.0 parsing tests and ...
	* test/rss/test_parser_2.0.rb: ... RSS 2.0 parsing tests.

Tue Jun 20 21:19:06 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb: provided default RSS::Element#children.

	* lib/rss/0.9.rb: used default RSS::Element#children.
	* lib/rss/1.0.rb: ditto.
	* lib/rss/2.0.rb: ditto.
	* lib/rss/taxonomy.rb: ditto.

Tue Jun 20 21:04:33 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb: provided default RSS::Element#_tags.

	* lib/rss/0.9.rb: used default RSS::Element#_tags.
	* lib/rss/1.0.rb: ditto.
	* lib/rss/2.0.rb: ditto.
	* lib/rss/image.rb: ditto.
	* lib/rss/taxonomy.rb: ditto.

Tue Jun 20 20:47:07 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb: hide RSS::Element.install_model.
	  (RSS::Element.install_have_child_element,
	   RSS::Element.install_have_children_element,
	   RSS::Element.install_text_element,
	   RSS::Element.install_date_element): call
	  RSS::Element.install_model internally.

	* lib/rss/0.9.rb: followed new API.
	* lib/rss/1.0.rb: ditto.
	* lib/rss/2.0.rb: ditto.
	* lib/rss/content.rb: ditto.
	* lib/rss/dublincore.rb: ditto.
	* lib/rss/image.rb: ditto.
	* lib/rss/syndication.rb: ditto.
	* lib/rss/taxonomy.rb: ditto.
	* lib/rss/trackback.rb: ditto.

Tue Jun 20 20:18:05 2006  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/extconf.rb: add check for OBJ_NAME_do_all_sorted.

	* ext/openssl/ossl_cipher.c (ossl_s_ciphers): new method
	  OpenSSL::Cipher.ciphers. it returns all the cipher names.

	* ext/openssl/lib/openssl/cipher.rb:
	  - add constants AES128, AES192, AES256. [ruby-dev:28610]
	  - reimplement without eval()

	* ext/openssl/lib/openssl/digest.rb: reimplement without eval().

	* test/openssl/test_cipher.rb, test_digest: fix about reimplemented
	  features.

	* sample/openssl/cipher.rb: rewrite all.

Sat Jun 19 11:21:46 2006  Eric Hodel  <drbrain@segment7.net>

	* lib/test/unit/assertions.rb: Merge RDoc from HEAD.

Tue Jun 20 01:06:57 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb:
	  - cleanup validation mechanism. Now, #XXX_validation is
	    needless.
	  - changed internal variable name RSS::Element::MODEL to
	    RSS::Element::MODELS.
	  - RSS::Element.install_model requires uri.

	* lib/rss/0.9.rb: followed new validation API.
	* lib/rss/1.0.rb: ditto.
	* lib/rss/2.0.rb: ditto.
	* lib/rss/content.rb: ditto.
	* lib/rss/dublincore.rb: ditto.
	* lib/rss/image.rb: ditto.
	* lib/rss/syndication.rb: ditto.
	* lib/rss/taxonomy.rb: ditto.
	* lib/rss/trackback.rb: ditto.

Mon Jun 19 23:40:59 2006  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/nkf/lib/kconv.rb: remove default -m0 and fix document.

	* ext/nkf/nkf-8/{nkf.c, config.h, utf8tbl.c, utf8tbl.h}:
	  imported nkf 2.0.7.

Mon Jun 19 22:31:59 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb:
	  - provided default #to_s as RSS::Element#to_s.
	  - removed RSS::Element#other_element.
	  - RSS::Element#tag requires attributes as Hash instead of Array.

	* lib/rss/0.9.rb: removed #to_s to use RSS::Element#to_s.
	* lib/rss/1.0.rb: ditto.
	* lib/rss/image.rb: ditto.
	* lib/rss/taxonomy.rb: ditto.
	* lib/rss/trackback.rb: ditto.

	* lib/rss/2.0.rb: removed #other_element.

Mon Jun 19 22:09:16 2006  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c(ole_invoke): support some kind of
	  method of word. [ruby-Bugs#3237]

	* ext/win32ole/tests/test_word.rb: ditto.

	* ext/win32ole/tests/testall.rb: ditto.

Mon Jun 19 00:02:17 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb: automatically detected attributes.

	* lib/rss/0.9.rb: removed #_attrs.
	* lib/rss/1.0.rb: ditto.
	* lib/rss/2.0.rb: ditto.
	* lib/rss/image.rb: ditto.
	* lib/rss/taxonomy.rb: ditto.
	* lib/rss/trackback.rb: ditto.

	* lib/rss/parser.rb: followed new internal API.

Mon Jun 19 00:00:17 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: fix bug: initialize improper tables.

Sun Jun 18 22:36:13 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb: RSS::Element#initialize accepts initial
	  attributes.
	* lib/rss/0.9.rb: ditto.
	* lib/rss/1.0.rb: ditto.
	* lib/rss/2.0.rb: ditto.
	* lib/rss/dublincore.rb: ditto.
	* lib/rss/image.rb: ditto.
	* lib/rss/taxonomy.rb: ditto.
	* lib/rss/trackback.rb: ditto.

	* lib/rss/utils.rb: added Utils.element_initialize_arguments? to
	  detect backward compatibility initial arguments.

	* lib/rss/parser.rb: user initial attributes to initialize
	  RSS::Element.

Sun Jun 18 18:24:42 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/converter.rb: use NKF for Uconv fallback.

Sun Jun 18 18:22:04 2006  Kouhei Sutou  <kou@cozmixng.org>

	* test/rss/test_image.rb: shared name space configuration.

Sun Jun 18 18:13:25 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb: improved ignore_unknown_element
	  handling. RSS::NotExpectedTagError provides tag URI.
	* lib/rss/parser.rb: ditto.
	* lib/rss/0.9.rb: ditto.
	* lib/rss/1.0.rb: ditto.
	* lib/rss/content.rb: ditto.
	* lib/rss/dublincore.rb: ditto.
	* lib/rss/image.rb: ditto.
	* lib/rss/syndication.rb: ditto.
	* lib/rss/taxonomy.rb: ditto.
	* lib/rss/trackback.rb: ditto.

	* test/rss/rss-assertions.rb: checked URI of not expected tag too.
	* test/rss/test_parser.rb: ditto.

Sun Jun 18 18:08:36 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb: changed empty namespace URI representation to ""
	  from nil.
	* lib/rss/parser.rb: ditto.
	* lib/rss/0.9.rb: ditto.
	* lib/rss/1.0.rb: ditto.
	* lib/rss/2.0.rb: ditto.

Sun Jun 18 18:03:50 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/parser.rb: removed a guard for requiring open-uri.

Sun Jun 18 18:01:26 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb: fixed typo: except -> expect
	* lib/rss/parser.rb: ditto.
	* test/rss/rss-assertions.rb: ditto.
	* test/rss/test_parser.rb: ditto.

Sun Jun 18 17:52:39 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb: RSS::Element#calc_indent became to be deprecated.
	* lib/rss/0.9.rb: ditto.
	* lib/rss/1.0.rb: ditto.
	* lib/rss/image.rb: ditto.
	* lib/rss/taxonomy.rb: ditto.
	* lib/rss/trackback.rb: ditto.

	* test/rss/test_1.0.rb: removed RSS::Element.indent_size tests.
	* test/rss/test_2.0.rb: ditto.

Sun Jun 18 00:49:11 2006  Tanaka Akira  <akr@m17n.org>

	* ext/socket/socket.c (bsock_recv_nonblock): new method
	  BasicSocket#recv_nonblock.
	  (udp_recvfrom_nonblock): renamed from ip_recvfrom_nonblock.
	  IPSocket#recvfrom_nonblock is moved to UDPSocket#recvfrom_nonblock.
	  (unix_recvfrom_nonblock): removed.
	  UNIXSocket#recvfrom_nonblock is removed.

Sat Jun 17 22:17:17 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/mathn.rb (Integer::prime_division): raise ZeroDivisionError
	  on zeros.  [ruby-dev:28739]

Sat Jun 17 14:53:32 2006  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb: backport from 1.9.
	  (Kernel#Pathname): new method.

Sat Jun 17 10:30:41 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb (Hash#merge, Enumerable#sort_by): removed.

	* lib/rss/rss.rb (RSS::RootElementMixin#to_xml): added.
	  [ruby-talk:197284]

	  We can convert RSS version easily like the following:
	    rss10 = RSS::Parser.parse(File.read("1.0.rdf"))
	    File.open("2.0.rss", "w") {|f| f.print(rss10.to_xml("2.0"))}

	* test/rss/test_1.0.rb: added #to_xml test.
	* test/rss/test_2.0.rb: ditto.

	* test/rss/rss-testcase.rb: added some helper methods that
	  generates sample RSS 2.0.

	* sample/rss/convert.rb: added a sample script to convert RSS format.

Sat Jun 17 10:23:22 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb (Kernel#funcall): removed.
	* lib/rss/parser.rb (Kernel.URI): removed.

	* lib/rss/maker/: supported
	    xxx.new_yyy do |yyy|
	      yyy.zzz = zzz
	      ...
	    end
	  style and this style became the style of the recommendation.

	  Old style
	    yyy = xxx.new_yyy
	    yyy.zzz = zzz
	    ...
	  is supported too but this style isn't recommended.
	  [ruby-talk:197284]

	* test/rss/test_*maker*.rb: used new recommended style.

Sat Jun 17 09:03:47 2006  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss, test/rss: backported from trunk. (2005-11-16 - now)

	* lib/rss/rss.rb (RSS::VERSION): 0.1.5 -> 0.1.6.
	* test/rss/test_version.rb (RSS::TestVersion#test_version): ditto.

	* lib/rss/trackback.rb: added TrackBack prefix.
	* lib/rss/maker/trackback.rb: ditto.

	* lib/rss/rss.rb : removed needless argument 'prefix'.
	* lib/rss/parser.rb: ditto.

	* lib/rss/1.0.rb: added rdf:Bag.

	* lib/rss/taxonomy.rb: implemented taxonomy module.
	* test/rss/test_taxonomy.rb: added tests for taxonomy support.

	* lib/rss/1.0.rb: added convenience method 'resources'.
	* lib/rss/taxonomy.rb: ditto.
	* test/rss/rss-assertions.rb: added test for 'resources'.
	* test/rss/test_taxonomy.rb: ditto.

	* lib/rss/rss.rb: fixed a indentation bug.
	* lib/rss/taxonomy.rb: fixed <taxo:topic> #to_s bug.
	* test/rss/test_taxonomy.rb: added a #to_s test.

	* lib/rss/maker/taxonomy.rb: implemented taxonomy module for RSS
	  Maker.
	* lib/rss/taxonomy.rb: supported RSS Maker.
	* lib/rss/maker.rb: added taxonomy module support.

	* lib/rss/rss.rb: adjusted to other element API.
	* lib/rss/1.0.rb: adjusted to other element API but backward
	  compatibility is reserved.
	* lib/rss/0.9.rb: ditto.

	* test/rss/test_maker_taxo.rb: added test case for taxonomy module
	  for RSS Maker.
	* test/rss/test_setup_maker_1.0.rb: added tests for taxo:topic.

	* test/rss/test_setup_maker_1.0.rb: added backward compatibility
	  test.
	* test/rss/test_setup_maker_0.9.rb: ditto.
	* test/rss/test_setup_maker_2.0.rb: ditto.

	* test/rss/rss-testcase.rb: added convenience method for setting
	  up taxo:topic.
	* test/rss/rss-assertions.rb: added assertion for taxo:topic.

	* sample/rss/blend.rb: followed new API.

	* lib/rss/taxonomy.rb: changed class or module prefix to
	  Taxonomy from Taxo.
	* lib/rss/maker/taxonomy.rb: ditto.

	* test/rss/test_taxonomy.rb: use #reject directory.

	* lib/rss/: use #__send__ instead of #send.
	* test/rss/: ditto.

	* lib/rss/parser.rb: added entity handling type predicate.
	* lib/rss/rexmlparser.rb: ditto.
	* lib/rss/xmlparser.rb: ditto.
	* lib/rss/xmlscanner.rb: ditto.

	* lib/rss/xmlscanner.rb: more robust entity handling.

	* test/rss/test_parser.rb: added an entity handling test.

	* test/rss/test_2.0.rb: added RSS 2.0 tests.
	* test/rss/rss-assertions.rb: extended XML stylesheet assertion.
	* lib/rss/0.9.rb: added initialize method.
	* test/rss/test_1.0.rb: cleanup.

	* lib/rss/image.rb: added Image prefix.
	* lib/rss/maker/image.rb: ditto.

	* lib/rss/rss.rb: improved type conversion.
	* lib/rss/1.0.rb: ditto.
	* lib/rss/0.9.rb: ditto.
	* lib/rss/2.0.rb: ditto.
	* lib/rss/image.rb: ditto.
	* lib/rss/syndication.rb: ditto.

	* test/rss/test_2.0.rb: added type conversion tests.
	* test/rss/test_accessor.rb: ditto.
	* test/rss/test_to_s.rb: ditto.
	* test/rss/test_syndication.rb: ditto.
	* test/rss/test_setup_maker_2.0.rb: ditto.
	* test/rss/test_setup_maker_1.0.rb: ditto.
	* test/rss/test_setup_maker_0.9.rb: ditto.
	* test/rss/test_maker_sy.rb: ditto.
	* test/rss/test_maker_image.rb: ditto.
	* test/rss/test_maker_2.0.rb: ditto.
	* test/rss/test_maker_0.9.rb: ditto.
	* test/rss/test_image.rb: ditto.

	* test/rss/test_maker_1.0.rb: use assert instead of assert_equal.

	* test/rss/rss-assertions.rb: improved type conversion assertions.

	* lib/rss/rss.rb: added backward compatibility codes.
	* lib/rss/parser.rb: ditto.
	* test/rss/test_parser.rb: ditto.
	* test/rss/test_2.0.rb: ditto.

Sat Jun 17 02:01:00 2006  Tanaka Akira  <akr@m17n.org>

	* lib/pp.rb (Kernel#pretty_inspect): defined for pretty printed
	  string.

Sat Jun 17 00:23:58 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (reswords): kDO_BLOCK was missing.  fixed: [ruby-core:7995]

Sat Jun 17 00:02:15 2006  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c (ole_propertyput): support
	  PROPERTYPUTREF. [ruby-talk:183042]

	* ext/win32ole/tests/test_propertyputref.rb: ditto.

Thu Jun 15 23:02:47 2006  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c (fole_methods): The return value
	  of WIN32OLE#ole_methods should include PROPERTYPUTREF methods.

	* ext/win32ole/win32ole.c (fole_put_methods): The return value
	  of WIN32OLE#ole_put_methods should include PROPERTYPUTREF methods.

	* ext/win32ole/tests/test_ole_methods.rb: ditto.

	* ext/win32ole/tests/testall.rb : ditto.

Wed Jun 14 18:23:28 2006  Eric Hodel  <drbrain@segment7.net>

	* enum.c (enum_any): Documentation typo.

Wed Jun 14 15:01:09 2006  Eric Hodel  <drbrain@segment7.net>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser#warn): Don't print
	  warnings when -q is set.

Wed Jun 14 23:03:53 2006  Tanaka Akira  <akr@m17n.org>

	* configure.in: check sizeof(rlim_t).
	  check setrlimit.

	* process.c (proc_getrlimit): new method Process.getrlimit.
	  (proc_setrlimit): new method Process.setrlimit.

	* ruby.h (NUM2ULL): new macro.

Mon Jun 12 22:25:09 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* sprintf.c (rb_f_sprintf): adjust precision length to prevent
	  splitting multi-byte characters.  [ruby-list:42389]

Sun Jun 11 23:20:07 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb (OptionParser::Arguable#getopts): pass self to the
	  parser.

Sun Jun 11 10:00:57 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.h (write): not need to define on bcc.

Sun Jun 11 08:30:33 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb (OptionParser#getopts): new methods.

Sat Jun 10 18:02:40 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/bigdecimal/lib/bigdecimal/newton.rb (Newton::nlsolve): typo
	  fixed: raize -> raise.  [ruby-talk:196608]

Thu Jun  8 14:19:17 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.[ch] (rb_w32_read, rb_w32_write): new functions.
	  use recv() and send() when fd is socket. fixed: [ruby-dev:28694]

Wed Jun  7 16:22:51 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/tempfile.rb (Tempfile::make_tmpname): put dot between
	  basename and pid.  [ruby-talk:196272]

Wed Jun  7 14:53:04 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (errmap): add some winsock errors.

Wed Jun  7 11:34:38 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* configure.in: add new configure option `--with-winsock2' for mingw.

	* win32/Makefile.sub (config.h): define USE_WINSOCK2 in config.h
	  instead of in CPPFLAGS.

	* ext/socket/extconf.rb: determine whether to use winsock2 or not
	  by using with_config.

Wed Jun  7 10:45:10 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/{configure.bat, setup.mak, Makefile.sub, win32.h}: add
	  new configure option `--with-winsock2'.

	* win32/win32.c (StartSockets): ditto.

	* ext/socket/extconf.rb: ditto.

	* win32/win32.c (open_ifs_socket): new function.

	* win32/win32.c (StartSockets, rb_w32_socket): use open_ifs_socket()
	  instead of socket().
	  ifs socket support is backported from trunk.

Wed Jun  7 09:14:44 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_call0): binding for the return event hook should have
	  consistent scope.  [ruby-core:07928]

	* eval.c (EXEC_EVENT_HOOK): trace_func may remove itself from
	  event_hooks.	no guarantee for arbitrary hook deletion.
	  [ruby-dev:28632]

Mon Jun  5 18:12:12 2006  Tanaka Akira  <akr@m17n.org>

	* ext/socket/socket.c (sock_s_unpack_sockaddr_in): reject
	  non-AF_INET/AF_INET6 sockaddr.
	  (sock_s_unpack_sockaddr_un): reject non-AF_UNIX sockaddr.
	  [ruby-dev:28691]

Sun Jun  4 20:40:19 2006  Tanaka Akira  <akr@m17n.org>

	* ext/socket/socket.c: fix sockaddr_un handling.
	  [ruby-dev:28677]

Fri Jun  2 22:08:17 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/forwardable.rb: RDoc typo fix from Jan Svitok
	  <jan.svitok at gmail.com>.  [ruby-core:07943]

Fri Jun  2 19:02:09 2006  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/extconf.rb: use create_header.

	* ext/openssl/ossl.h, ext/openssl/openssl_missing.h:
	  include RUBY_EXTCONF_H.

Fri Jun  2 17:16:52 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (CLEANINGS): remove extconf.h by distclean if created.

Fri Jun  2 00:11:19 2006  Tanaka Akira  <akr@m17n.org>

	* ext/socket/socket.c (s_recvfrom): alen may be zero with UNIXSocket
	  too.  (tested on NetBSD 3.0)
	  (s_recvfrom_nonblock): extracted from sock_recvfrom_nonblock.
	  (sock_recvfrom_nonblock): use s_recvfrom_nonblock.
	  (ip_recvfrom_nonblock): new method: IPSocket#recvfrom_nonblock
	  (unix_recvfrom_nonblock): new method: UNIXSocket#recvfrom_nonblock
	  (s_accept_nonblock): extracted from sock_accept_nonblock.
	  (sock_accept_nonblock): use s_accept_nonblock.
	  (tcp_accept_nonblock): new method: TCPServer#accept_nonblock
	  (unix_accept_nonblock): new method: UNIXServer#accept_nonblock

Thu Jun  1 19:12:37 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (rb_w32_cmdvector): backslashes inside single-quotes
	  no longer has special meanings.  fixed: [ruby-list:42311]

Thu Jun  1 16:14:41 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (rb_w32_getcwd): runtime's getcwd() will not success
	  if the length of the cwd is longer than MAX_PATH.
	  fixed [ruby-list:42335]

Thu Jun  1 11:29:14 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (rb_w32_getcwd): set errno if not set.
	  fixed [ruby-list:42346]

Sat May 27 11:29:46 2006  nobuyoshi nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb (extmake): remove extinit files if no statically linked
	  extensions.

Fri May 26 09:05:11 2006  nobuyoshi nakada  <nobu@ruby-lang.org>

	* ruby.h, lib/mkmf.rb (create_header): clear command line options for
	  macros moved to extconf.h.

	* ext/extmk.rb (extract_makefile, extmk): made RUBY_EXTCONF_H and
	  EXTSTATIC permanent.

	* ext/{dbm,digest/*,socket,zlib}/extconf.rb: used $defs and $INCFLAGS.

	* {bcc32,win32,wince}/Makefile.sub (COMPILE_C, COMPILE_CXX): added
	  $(INCFLAGS).

	* lib/mkmf.rb (configuration): add $defs unless extconf.h was created.

Thu May 25 01:52:07 2006  nobuyoshi nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (pkg_config): particular config commands support.

	* ext/extmk.rb: deal with $static set in extconf.rb.

	* mkconfig.rb: merge multiple entries to an entry with multiple lines.

	* lib/mkmf.rb: allow a series of commands to link.

	* win32/Makefile.sub: embed manifests.

	* win32/setup.mak: suffix OS name by runtime version.

Wed May 24 23:52:11 2006  nobuyoshi nakada  <nobu@ruby-lang.org>

	* configure.in (ac_install_sh): ignore dummy install-sh.
	  [ruby-talk:193876]

Wed May 24 03:10:48 2006  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/lib/openssl/ssl.rb
	  (OpenSSL::SSL::SocketForwarder#setsockopt,getsockopt): typo fixed.

Mon May 22 17:54:12 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/socket/socket.c (sock_recvfrom_nonblock): use rb_read_pending
	  instead of rb_io_read_pending.
	  [ruby-dev:28663]

Mon May 22 17:30:04 2006  Tanaka Akira  <akr@m17n.org>

	* rubyio.h (rb_io_set_nonblock): declared.

	* io.c (rb_io_set_nonblock): new function.
	  (io_getpartial): nonblocking read support.
	  (io_read_nonblock): new method: IO#read_nonblock.
	  (io_write_nonblock): new method: IO#write_nonblock.

	* ext/socket/socket.c
	  (sock_connect_nonblock): new method: Socket#connect_nonblock.
	  (sock_accept_nonblock): new method: Socket#accept_nonblock.
	  (sock_recvfrom_nonblock): new method: Socket#recvfrom_nonblock.

	  [ruby-core:7917]

Mon May 22 15:57:39 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (umethod_bind): should not update original class.
	  [ruby-dev:28636]

Mon May 22 13:38:57 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (ev_const_get): should support constant access from
	  within instance_eval().  [ruby-dev:28327]

Thu May 18 17:51:32 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* time.c (time_timeval): should round for usec floating
	  number.  [ruby-core:07896]

	* time.c (time_add): ditto.

Thu May 18 17:11:45 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/cgi.rb (CGI::out): support utf-8.  a patch from Fujioka
	  <fuj at rabbix.jp>.  [ruby-dev:28649]

Thu May 18 00:42:12 2006  nobuyoshi nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb, lib/mkmf.rb: use BUILD_FILE_SEPARATOR in Makefiles.

Wed May 17 17:55:26 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* dir.c (sys_warning): should not call a vararg function
	  rb_sys_warning() indirectly.  [ruby-core:07886]

Wed May 17 08:17:15 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* util.c (ruby_strtod): try to reduce errors using powersOf10
	  table.  [ruby-dev:28644]

Tue May 16 15:34:18 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* re.c (rb_reg_initialize): should not allow modifying literal
	  regexps.  frozen check moved from rb_reg_initialize_m as well.

Tue May 16 09:20:16 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* re.c (rb_reg_initialize): should not modify untainted objects in
	  safe levels higher than 3.

	* re.c (rb_memcmp): type change from char* to const void*.

	* dir.c (dir_close): should not close untainted dir stream.

	* dir.c (GetDIR): add tainted/frozen check for each dir operation.

Mon May 15 17:42:39 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_symbol_arg):
	  typo fixed.  a patch from Florian Gross <florg at florg.net>.

Sat May 13 16:14:05 2006  Tanaka Akira  <akr@m17n.org>

	* lib/pp.rb (PP.mcall): new method.
	  (Struct#pretty_print): call Kernel#class and Struct#members even if
	  overridden.
	  (Struct#pretty_print_cycle): ditto.
	  [ruby-core:7865]

Thu May 11 19:57:00 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* util.c (ruby_strtod): differ addition to minimize error.
	  [ruby-dev:28619]

Fri Aug 11 15:39:25 2006  Eric Hodel  <drbrain@segment7.net>

	* lib/yaml/tag.rb: Replace nodoc with stopdoc so Module methods get
	  documented.

Thu May 11 18:10:43 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* util.c (ruby_strtod): should not raise ERANGE when the input
	  string does not have any digits.  [ruby-dev:28629]

Sun May  7 03:09:51 2006  Stephan Maka  <stephan@spaceboyz.net>

	* lib/resolv.rb (Resolv::DNS::Requester::ConnectedUDP#initialize):
	  Use AF_INET6 for nameservers containing colons.

Sat May  6 00:38:42 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* signal.c (trap): sig should be less then NSIG.  Coverity found
	  this bug.  a patch from Kevin Tew <tewk at tewk.com>.
	  [ruby-core:07823]

Thu May  4 02:24:16 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/syck/emitter.c (syck_scan_scalar): avoid accessing
	  uninitialized array element.  a patch from Pat Eyler
	  <rubypate at gmail.com>.  [ruby-core:07809]

	* array.c (rb_ary_fill): initialize local variables first.  a
	  patch from Pat Eyler <rubypate at gmail.com>.  [ruby-core:07810]

	* ext/syck/yaml2byte.c (syck_yaml2byte_handler): need to free
	  type_tag.  a patch from Pat Eyler <rubypate at gmail.com>.
	  [ruby-core:07808]

Wed May  3 02:12:07 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/socket/socket.c (make_hostent_internal): accept ai_family
	  check from Sam Roberts <sroberts at uniserve.com>.
	  [ruby-core:07691]

Mon May  1 12:23:19 2006    <sinara@blade.nagaokaut.ac.jp>

	* numeric.c (num_div): use floor rather than rb_Integer().
	  [ruby-dev:28589]

	* numeric.c (flo_divmod): the first element of Float#divmod should
	  be an integer. [ruby-dev:28589]

	* test/ruby/test_float.rb: add tests for divmod, div, modulo and remainder.

Sat Apr 29 22:42:08 2006  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_asn1.c (ossl_asn1_decode0): should initialize
	  flag. [ruby-core:07785]

Fri Apr 28 10:53:16 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* util.c (ruby_strtod): should not cut off 18 digits for no
	  reason.  [ruby-core:07796]

	* util.c (ruby_strtod): fixed wrong conversion.

Thu Apr 27 01:38:10 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_fill): internalize local variable "beg" to
	  pacify Coverity.  [ruby-core:07770]

Wed Apr 26 16:59:24 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* pack.c (pack_unpack): now supports CRLF newlines.  a patch from
	  <tommy at tmtm.org>.  [ruby-dev:28601]

Tue Apr 25 18:00:05 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tcltklib.c (delete_slaves): maybe increment the reference
	  count of a NULL Tcl_Obj [ruby-core:07759].

Tue Apr 25 07:55:31 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/jcode.rb (String::tr_s): should have translated non
	  squeezing character sequence (i.e. a character) as well.  thanks
	  to Hiroshi Ichikawa <gimite at gimite.ddo.jp> [ruby-list:42090]

Tue Apr 25 00:08:24 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* regex.c (re_compile_pattern): should check if c is not a
	  multibyte character.  a patch from KIMURA Koichi
	  <kimura.koichi at canon.co.jp>.  [ruby-dev:28598]

Fri Apr 21 15:19:13 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tcltklib.c (lib_eventloop_ensure): refer freed pointer
	  [ruby-core:07744] and memory leak.

Fri Apr 21 12:14:52 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/socket/socket.c: document update patch from Sam Roberts
	  <sroberts at uniserve.com>.  [ruby-core:07701]

Wed Apr 19 13:55:27 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (arg): too much NEW_LIST()

	* eval.c (SETUP_ARGS0): remove unnecessary access to nd_alen.

Wed Apr 19 11:57:04 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_eval): use ARGSCAT for NODE_OP_ASGN1.
	  [ruby-dev:28585]

	* parse.y (list_concat): revert last change.

	* parse.y (arg): use NODE_ARGSCAT for placeholder.

Wed Apr 19 11:13:17 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/getoptlong.rb (GetoptLong::get): RDoc update patch from
	  mathew <meta at pobox.com>.  [ruby-core:07738]

Wed Apr 19 10:13:27 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* variable.c (rb_const_set): raise error when no target klass is
	  supplied.  [ruby-dev:28582]

Wed Apr 19 09:49:36 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (list_concat): should not modify nodes other than
	  NODE_ARRAY.  [ruby-dev:28583]

Tue Apr 18 17:40:37 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: add a binding to a container for a slave IP.

	* ext/tk/lib/tk.rb: update RELEASE_DATE.

	* ext/tk/tcltklib.c: forget to reset a Tcl interpreter.

	* ext/tk/stubs.c: fix potential bugs about handling rb_argv0.

Tue Apr 18 00:11:21 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c: block_unique should be 1, not frame_unique.
	  [ruby-dev:28577]

Fri Aug 11 15:39:25 2006  Eric Hodel  <drbrain@segment7.net>

	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser#find_body): Make RDoc
	  ignore C function prototypes.  Patch by Tilman Sauerbeck
	  <tilman at code-monkey.de>.  [ruby-core:8574]
	* lib/yaml/tag.rb: Replace nodoc with stopdoc so Module methods get
	  documented.

Mon Apr 10 01:03:10 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* prec.c (prec_prec_f): documentation patch from
	  <gerardo.santana at gmail.com>.  [ruby-core:07689]

Sat Apr  8 02:34:34 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* bignum.c (rb_big_pow): second operand may be too big even if
	  it's a Fixnum.  [ruby-talk:187984]

Sat Apr  8 02:12:38 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* README.EXT: update symbol description.  [ruby-talk:188104]

Thu Apr  6 23:28:47 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* COPYING: explicitly note GPLv2.  [ruby-talk:187922]

Thu Apr  6 11:18:37 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/panedwindow.rb: lack of arguments. [ruby-core:7681]

Thu Apr  6 01:04:47 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tcltklib.c: fix SEGV when embedding to an application.
	  [ruby-core:7600]

	* ext/tk/tcltklib.c: fix SEGV at exit. [ruby-talk:186489]

	* ext/tk/tkutil/tkutil.c: follow to changing specification of
	  instance_eval on ruby-1.9.x.

	* ext/tk/lib/tk.rb: ditto.

	* ext/tk/lib/multi-tk.rb: ditto.

	* ext/tk/lib/tk.rb: remove warning about redefinition of methods.

	* ext/tk/lib/tk/variable.rb: remove warning about unseting Tcl
	  variables.

Wed Mar 29 20:54:44 2006  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c (fole_getproperty): WIN32OLE#[] should accept
	  multi arguments.

	* ext/win32ole/tests/testWIN32OLE.rb (test_setproperty_bracket): ditto.

Wed Mar 29 10:07:44 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/nkf/nkf-utf8/nkf.c (nkf_each_char_to_hex, encode_fallback_subchar,
	  e2w_conv): support C90 compiler.

Wed Mar 29 06:48:40 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (backtrace): reports aliased method names in a generated
	  backtrace.  a patch from "U.Nakamura" <usa at garbagecollect.jp>.
	  [ruby-dev:28471]

Mon Mar 27 22:19:09 2006  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/nkf/nkf-utf8/{nkf.c, utf8tbl.c, config.h}: imported nkf 2.0.6.
	  * Add --ic / --oc option and mapping tables.
	  * Add fallback option.
	  * Add --no-best-fit-chars option.
	  * Fix some bugs.

	* ext/nkf/nkf.c (nkf_split_options): added for parse option string.

	* ext/nkf/lib/kconv.rb (Kconv.to*): add -m0.
	  Note that Kconv.to* still imply -X.

Mon Mar 27 03:17:21 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_call0): insecure calling should be checked for non
	  NODE_SCOPE method invocations too.

	* eval.c (rb_alias): should preserve the current safe level as
	  well as method definition.

Fri Mar 24 23:14:30 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (yield_under_i): pass self again for instance_eval().
	  [ruby-dev:28466]

Fri Mar 24 17:20:03 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* process.c (rb_f_sleep): remove description about SIGALRM which
	  is not valid on the current implementation.  [ruby-dev:28464]

Thu Mar 23 10:47:03 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (method_missing): should support argument splat in
	  super.  [ruby-talk:185438]

Mon Mar 20 12:05:18 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* configure.in: Solaris SunPro compiler -rapth patch from
	  <kuwa at labs.fujitsu.com>.  [ruby-dev:28443]

Mon Mar 20 09:40:23 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* configure.in: remove enable_rpath=no for Solaris.
	  [ruby-dev:28440]

Fri Mar 17 19:08:49 2006  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_ssl.c, ext/openssl/ossl_nsspki.c: fix typo.
	  [ruby-core:07571]

Wed Mar 15 16:54:21 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* lib/mkmf.rb (create_makefile): support libraries without *.so.

Wed Mar 15 16:35:43 2006  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_ssl.c, ext/openssl/ossl_nsspki.c: should use
	  "rb_str_new(0, 0)" to make empty string.

Sat Mar 11 14:24:06 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/rdoc/ri/ri_formatter.rb (RI::TextFormatter::wrap): removed
	  space before argument parenthesis.  [ruby-talk:183630]

	* ruby.1: a clarification patch from David Lutterkort
	  <dlutter at redhat.com>.  [ruby-core:7508]

Sat Mar  4 15:26:40 2006  Tanaka Akira  <akr@m17n.org>

	* gc.c (id2ref): fix symbol test.

Sat Mar  4 01:08:07 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/rdoc/ri/ri_paths.rb (RI::Paths): adding paths from rubygems
	  directories.  a patch from Eric Hodel <drbrain at segment7.net>.
	  [ruby-core:07423]

Thu Mar  2 19:44:18 2006  Tanaka Akira  <akr@m17n.org>

	* gc.c: align VALUE with sizeof(RVALUE) globally.
	  (is_pointer_to_heap): check alignment out of loop.
	  (id2ref): avoid collision between symbols and objects.
	  (rb_obj_id): ditto.  moved from object.c.
	  [ruby-talk:178364] [ruby-core:7305]

Thu Mar  2 18:58:18 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_thread_fd_writable): should not re-schedule output
	  from KILLED thread (must be error printing).

Thu Mar  2 17:57:49 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* gc.c: commited magic for reducing RVALUE size on windows. (24->20byte)
	  [ruby-core:7474]

Thu Mar  2 12:59:14 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* win32/win32.c (filetime_to_unixtime): should set tm_isdst to -1.
	  stat() didn't treat daylight saving time property on WinNT.
	  [ruby-talk:182100]

Thu Mar  2 08:02:42 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* gc.c (add_heap): heap_slots may overflow.  a patch from Stefan
	  Weil <weil at mail.berlios.de>.

Wed Mar  1 00:24:31 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* lib/rdoc/parsers/parse_rb.rb (read_escape): could not handle /\^/.
	  merged Mr. Ishizuka's lib/irb/ruby-lex.rb 's patch rev 1.29.
	  [ruby-talk:181631] [ruby-dev:28404]

Tue Feb 28 09:32:17 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* lib/drb/extservm.rb (invoke_service_command): cannot invoke command
	  if command name is quoted on mswin32. [ruby-dev:28400]

Mon Feb 27 00:19:16 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ruby.h (SYM2ID): should not cast to signed long.
	  [ruby-core:07414]

Fri Feb 24 20:07:23 2006  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* test/drb/drbtest.rb (add_service_command): quote pathnames in the
	  server's command line for space contained directory names.
	  Thanks, arton. [ruby-dev:28386]

Fri Feb 24 12:11:08 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* instruby.rb: install *.exe.manifest and *.dll.manifest if exist.
	  It's for VC++8.

Fri Feb 24 11:33:52 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* bcc32/Makefile.sub (HAVE_HYPOT): bcc32 has hypot().

Fri Feb 24 11:19:58 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* time.c (time_new_internal): add prototype to tell the compiler
	  arugments types.

	* win32/win32.c (NtInitialize): need to set a handler for VC++8.

Fri Feb 24 08:19:16 2006  NARUSE, Yui  <naruse@ruby-lang.org>

	* test.rb: Removed.  Obsolete by test/nkf.

	* ext/.document: enabled documents in nkf and kconv

	* ext/nkf/nkf.c ext/nkf/lib/kconv.rb: Add rdoc.

Thu Feb 23 22:39:59 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* bcc32/Makefile.sub: use borlndmm.dll if possible. bcc32's RTL internal
	  memory manager cannot handle large memory block properly.
	  ex: 10000.times { "" << "." * 529671; GC.start } # crash
	  [ruby-dev:28230]

Thu Feb 23 13:20:28 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* eval.c (SETUP_ARGS0): fixed memory corruption. [ruby-dev:28360]

Tue Feb 21 02:18:46 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* configure.in (mingw): have link.  [ruby-list:41838]

	* win32/Makefile.sub (config.h): ditto.

Tue Feb 21 02:07:39 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (f_arglist): should set command_start = Qtrue for
	  command body.  [ruby-talk:180648]

Mon Feb 20 17:37:26 2006  Tanaka Akira  <akr@m17n.org>

	* mkconfig.rb: alias RbConfig for Config.

Mon Feb 20 12:27:53 2006  Kent Sibilev  <ksruby@gmail.com>

	* lib/rational.rb (Integer::gcd): small typo fix.
	  [ruby-core:07395]

Mon Feb 20 01:05:27 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/rational.rb (Integer::gcd): replaced by gcd4 in
	  [ruby-core:07390].  [ruby-core:07377]

Mon Feb 20 00:57:02 2006  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl.h (OSSL_Debug): should not use __func__.
	  [ruby-dev:28339]

Sun Feb 19 04:46:29 2006  Guy Decoux  <ts@moulon.inra.fr>

	* eval.c: initial value for block_unique must be 1.
	  [ruby-talk:180420]

Sat Feb 18 23:58:26 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/tracer.rb (Tracer::Tracer.add_filter): turn on tracer mode
	  only when caller() level size is one.  [ruby-core:07389]

	* lib/rdoc/parsers/parse_rb.rb: need not to require "tracer".
	  [ruby-core:07389]

	* sample/rtags.rb: ditto.

Sat Feb 18 12:18:26 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/fileutils.rb (FileUtils::fu_world_writable): make it
	  private.  [ruby-core:07383]

Sat Feb 18 00:22:39 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/tracer.rb: merged a minor clarification patch from Daniel
	  Berger <Daniel.Berger at qwest.com>.  [ruby-core:07376]

Fri Feb 17 11:18:42 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* util.c (ruby_strtod): Float("1e") should fail. [ruby-core:7330]

	* pack.c (EXTEND32): unpack("l") did not work where sizeof(long) != 4.
	  [ruby-talk:180024]

	* pack.c (pack_unpack): fixed integer overflow on template "w".
	  [ruby-talk:180126]

Fri Feb 17 09:39:29 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_thread_wait_for): sleep should always sleep for
	  specified amount of time.  [ruby-talk:180067]

Thu Feb 16 01:10:48 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (backtrace): frame->orig_func may not be initialized.
	  [ruby-core:07367]

Wed Feb 15 16:52:52 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_eval): NODE_OP_ASGN1 should allow splat in its
	  argument list.  [ruby-core:07366]

	* parse.y (arg): avoid unnecessary extra argument.
	  [ruby-core:07366]

	* eval.c (rb_eval): honor visibility on OP_ASGN1 and
	  OP_ASGN2. [ruby-core:07366]

Wed Feb 15 10:09:51 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (yield_under_i): should not pass self as an argument to
	  the block for instance_eval.  [ruby-core:07364]

Wed Feb 15 09:20:35 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_obj_instance_eval): should be no singleton classes for
	  true, false, and nil.  [ruby-dev:28186]

Tue Feb 14 18:48:33 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (DMETHOD_P): accessing wrong frame.  [ruby-dev:28181]

	* eval.c (proc_invoke): preserve FRAME_DMETH flag.

Tue Feb 14 15:13:51 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/zlib/zlib.c: supress warning on test/zlib. [ruby-dev:28323]

Tue Feb 14 14:01:17 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* time.c (search_time_t): support non 32bit time_t environments.

	* win32/Makefile.sub (config.h): VC++8 has ``long long'' type.

	* win32/Makefile.sub (config.h): VC++8's time_t is 64bit value.

	* win32/win32.c (rb_w32_utime): drop read-only attribute before
	  changing file time.

	  all changes are backported from CVS HEAD.

Tue Feb 14 11:21:38 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (argf_forward): should not use frame->argv.
	  [ruby-core:07358]

Mon Feb 13 18:08:12 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_call0): argument update propagation.  [ruby-dev:28044]

	* env.h: remove argv member from struct FRAME.

Mon Feb 13 13:27:00 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (eval): should push class from binding if supplied.
	  [ruby-core:07347]

Mon Feb 13 00:04:00 2006  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/erb.rb (ERB::Compiler): add instance variable @insert_cmd to
	  change <%='s behavior. (backported 1.15 - 1.16)

Sat Feb 11 02:04:11 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (eval): no need to push ruby_class.  [ruby-dev:28176]

Sat Feb 11 01:57:44 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_f_autoload): check if ruby_cbase is nil (during
	  instance_eval for objects cannot have singleton classes,
	  e.g. fixnums and symbols).  [ruby-dev:28178]

Tue Feb  7 23:03:24 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/zlib/zlib.c: should not access ruby objects in finalizer.
	  [ruby-dev:28286]

Mon Feb  6 16:02:51 2006  WATANABE Hirofumi  <eban@ruby-lang.org>

	* file.c (rb_thread_flock): ERROR_NOT_LOCKED is not an error on Cygwin.
	  In such situation, flock() should return 0.

Mon Feb  6 00:41:08 2006  Tanaka Akira  <akr@m17n.org>

	* ruby.h (RSTRUCT_LEN, RSTRUCT_PTR): defined for source level
	  compatibility with ruby 1.9.

Sun Feb  5 21:05:34 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* numeric.c (fix_to_s): removed workaround for radix 2. Historically,
	  rb_fix2str could only handle radix 8, 10, 16. (Rev1.37) But for now,
	  it can handle radix 2..36. [ruby-Bugs#3438] [ruby-core:7300]

Sun Feb  5 18:55:08 2006  Minero Aoki  <aamine@loveruby.net>

	* lib/net/http.rb: imported from trunk, rev 1.129

	* lib/net/http.rb (add_field, get_fields): keep 1.8.2 backward
	  compatibility.

	* lib/net/https.rb: imported from trunk, rev 1.3.

	* lib/net/https.rb: #use_ssl? definition moved from net/http.rb.

Sun Feb  5 14:22:15 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* lib/pstore.rb: should return default value if name is not found.
	  [ruby-core:7304]

	* lib/pstore.rb: should raise PStore::Error if not in transaction.

Sat Feb  4 22:51:43 2006  Tanaka Akira  <akr@m17n.org>

	* eval.c: apply the FreeBSD getcontext/setcontext workaround
	  only before FreeBSD 7-CURRENT.

Sat Feb  4 21:19:23 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (LK_ERR): ERROR_NOT_LOCKED is not an error.
	  In such situation, flock() should return 0.

Sat Feb  4 15:56:37 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* numeric.c (fix_to_s): (2**32).to_s(2) fails with exception where
	  sizeof(int) == 4 < sizeof(long). [ruby-core:7300]

Fri Feb  3 15:06:50 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/syck/syck.c (syck_move_tokens): should reset p->cursor or etc
	  even if skip == 0. This causes buffer overrun.
	  (ex: YAML.load('--- "..' + '\x82\xA0' * 511 + '"'))

Thu Feb  2 23:51:18 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/syck/emitter.c (syck_emitter_write): should not set '\0' on
	  emitter's marker. if marker points to the end of buffer, this causes
	  buffer overrun. (ex: YAML.dump("." * 12288))

Thu Feb  2 16:01:24 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (eval): need not to protect $SAFE value.
	  [ruby-core:07177]

Thu Feb  2 14:45:53 2006  Ville Mattila  <ville.mattila@stonesoft.com>

	* configure.in: The isinf is not regognized by autoconf
	  library guesser on solaris 10. [ruby-core:7138]

Wed Feb  1 22:01:47 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* configure.in, hash.c (ruby_setenv): use setenv(3) and unsetenv(3)
	  where they are supported. modifing environ variable seems to
	  segfault solaris 10. [ruby-core:7276] [ruby-dev:28270]

	* ruby.c (set_arg0): if use setenv(3), environ space cannot be used
	  for altering argv[0].

Tue Jan 31 14:46:28 2006  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* struct.c (rb_struct_select): update RDoc description.
	  [ruby-core:7254]

Tue Jan 31 11:58:51 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: add MultiTkIp#eval and bg_eval.

	* ext/tk/lib/tk/namespace.rb: TkNamespace#eval was enbugged at the
	  last commit. Now it will return a proper object.

Tue Jan 31 00:10:26 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/syck/rubyext.c (syck_resolver_transfer): workaround for SEGV.
	  ex: ruby -ryaml -e 'YAML.load("!map:B {}")' [ruby-core:7217]

Sat Jan 28 07:56:57 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* lib/rdoc/usage.rb: support "a:0:33" style caller[-1]. In this case
	  file name is "a:0". I don't know this really happens though...
	  [ruby-Bugs:3344]

Wed Jan 25 22:29:04 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in, dln.c, file.c, intern.h, missing.h (eaccess): use
	  system routine if provided.  fixed: [ruby-core:07195]

Sun Jan 22 23:27:13 2006  Go Noguchi  <gonoguti@yahoo.co.jp>

	* lib/test/unit/autorunner.rb (process_args): ignore arguments after
	  '--' so that test scripts can handle them.  fixed: [ruby-dev:28258]

Sun Jan 22 22:09:52 2006  Tanaka Akira  <akr@m17n.org>

	* eval.c (POST_GETCONTEXT): define separately from PRE_GETCONTEXT on
	  IA64 to avoid reusing variable address.

Sun Jan 22 20:03:35 2006  Tanaka Akira  <akr@m17n.org>

	* eval.c (ruby_setjmp): define PRE_GETCONTEXT and POST_GETCONTEXT
	  instead of FUNCTION_CALL_MAY_RETURN_TWICE.
	  define PRE_GETCONTEXT to clear carry flag for workaround of
	  FreeBSD/i386 getcontext/setcontext bug.
	  [ruby-dev:28263]

Sat Jan 21 00:36:47 2006  Tanaka Akira  <akr@m17n.org>

	* eval.c (FUNCTION_CALL_MAY_RETURN_TWICE): use only on SPARC and IA64
	  before gcc 4.0.3.
	  [ruby-dev:28247]

Thu Jan 19 22:21:23 2006  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (mv): should remove file after copying.
	  [ruby-dev:28223]

Wed Jan 18 23:37:06 2006  Tanaka Akira  <akr@m17n.org>

	* eval.c (FUNCTION_CALL_MAY_RETURN_TWICE): don't clobber %l7 of SPARC
	  if enable-shared.
	  (ruby_setjmp): call FUNCTION_CALL_MAY_RETURN_TWICE after getcontext
	  too.
	  reported by Pav Lucistnik and Marius Strobl.
	  http://lists.freebsd.org/pipermail/freebsd-sparc64/2006-January/003739.html

Tue Jan 17 11:32:46 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/setup.mak (MAKE): workaround for nmake 8.

Tue Jan 17 11:10:21 2006  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/{Makefile.sub,setup.mak}: invoke .bat via shell. workaround
	  for nmake 8.

Mon Jan 16 10:26:23 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/syck/emitter.c (syck_emit_seq, syck_emit_map, syck_emit_item):
	  should output complex key mark even if map's key is empty seq/map.
	  [ruby-core:7129]

Sat Jan 14 05:37:06 2006  Tanaka Akira  <akr@m17n.org>

	* io.c (READ_DATA_PENDING, READ_DATA_PENDING_COUNT): defined
	  for DragonFly BSD 1.4.0.

Sat Jan 14 03:43:24 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* file.c (rb_file_s_chmod): avoid warning where sizeof(int) !=
	  sizeof(void*).

Fri Jan 13 19:14:56 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* lib/rdoc/diagram.rb:
	    - properly quote bare element attributes
	    - terminates dangling elements (e.g. <img>, <br>, <link>, etc)
	    - converts "CVS" to the more HTML-friendly acronym element
	    - adds missing type attributes to style elements

	  based on Paul Duncan's patch <pabs@pablotron.org> [ruby-core:7028]

	* lib/rdoc/generators/html_generator.rb: ditto.
	* lib/rdoc/generators/template/html/hefss.rb: ditto.
	* lib/rdoc/generators/template/html/html.rb: ditto.
	* lib/rdoc/generators/template/html/kilmer.rb: ditto.

Thu Jan 12 11:53:08 2006  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/sample/tkballoonhelp.rb: [bug fix] couldn't add to a widget
	  which is constructed with TkComposite module.
	  [new feature] support 'command' option which is called just before
	  popping up the balloon help.

Wed Jan 11 15:00:00 2006  Ville Mattila  <mulperi@iki.fi>

	* io.c (READ_PENDING*): Support solaris 64-bit environments.
	  Solaris defines a opaque FILE struct when compiling 64 bit
	  binaries. This means that we dont have access to _ptr etc.
	  members anymore. The solution by Steven Lumos is to define
	  FILE64 that has needed members available. I've modified
	  the origanal patch a bit so that it compiles both with gcc
	  and now free sun studio 11 compiler and both amd64 and sparc.
	  NOTE! We have to 64 bit solaris FILE structure time to time
	  otherwise we'll get breakage.
	  [ruby-core:7106]

Tue Jan 10 19:42:33 2006  Tanaka Akira  <akr@m17n.org>

	* gc.c (garbage_collect): mark ruby_current_node.
	  if an exception is raised in a finalizer called written in C by
	  rb_gc_call_finalizer_at_exit, ruby_set_current_source may use
	  collected ruby_current_node and mark_source_filename may corrupt
	  memory.

Tue Jan 10 13:30:34 2006  akira yamada  <akira@ruby-lang.org>

	* ext/syck/rubyext.c (syck_resolver_transfer): should be able to load
	  !ruby/object:Bignum syntax 1.8.3 dumped. [ruby-core:6159]

Tue Jan 10 12:47:41 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* lib/yaml/rubytypes.rb (Fixnum): Bignum could not be loaded in
	  ruby 1.8.3/1.8.4. [ruby-core:6115]

	* lib/yaml/rubytypes.rb (Numeric): Subclass of Numeric could not
	  be dumped properly. [ruby-core:7047]

Tue Jan 10 12:00:48 2006  Aaron Schrab  <aaron @nospam@ schrab.com>

	* lib/yaml/rubytypes.rb (Symbol#yaml_new): YAML loading of quoted
	  Symbols broken. [ruby-Bugs:2535]

Mon Jan  9 19:54:35 2006  arton  <artonx@yahoo.co.jp>

	* ext/zlib/extconf.rb: zlib compiled DLL version 1.2.3 distributed by
	  http://www.zlib.net/ has zdll.lib. [ruby-dev:28209]

Mon Jan  9 14:17:12 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* win32/Makefile.sub (OPTFLAGS): I have experienced trouble on y- flag,
	  (VisualC++6) so use -O2b2xg- if  $(MSC_VER) < 1400. [ruby-core:7040]

Mon Jan  9 14:17:12 2006  Kero van Gelder  <rubyforge @nospam@ kero.tmfweb.nl>

	* lib/webrick/httpservlet/filehandler.rb: fixed typo. [ruby-core:7075]

Sat Jan  7 15:40:07 2006  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (singleton): get rid of segfault on syntax error.
	  fixed: [ruby-core:07070]

Fri Jan  6 10:16:20 2006  Steven Lumos  <steven@lumos.us>

	* io.c (READ_DATA_PENDING): defined for 64bit Solaris on SPARC.
	  [ruby-core:7057]
	  (READ_DATA_PENDING_COUNT): ditto.
	  (READ_DATA_PENDING_PTR): ditto.

Sun Jan  1 17:07:59 2006  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* win32/win32.c (rb_w32_seekdir): should not segfault even if passed
	  the location which rb_w32_telldir didn't return. [ruby-core:7035]
	  (I think HEAD implementation is better. but binary compatibility)

	* test/ruby/test_dir.rb: added.

Sat Dec 31 22:57:00 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_thread_save_context): should not recycle scope object used
	  in a thread.  fixed: [ruby-dev:28177]

Fri Dec 30 18:22:42 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (garbage_collect): mark objects refered from aborting threads.
	  [ruby-dev:28190]

	* win32/Makefile.sub: VC++8 support.

Fri Dec 30 14:24:53 2005  WATANABE Hirofumi  <eban@ruby-lang.org>

	* dir.c (glob_helper): do not use TRUE for djgpp.

Fri Dec 30 04:54:40 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* file.c (eaccess): workaround for VC++8 runtime.

	* win32/win32.c (ioinfo): VC++8 support.

Thu Dec 29 23:59:37 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_gc_mark_threads): leave unmarked threads which won't wake
	  up alone, and mark threads in the loading table.  [ruby-dev:28154]

	* eval.c (rb_gc_abort_threads), gc.c (gc_sweep): kill unmarked
	  threads.  [ruby-dev:28172]

Thu Dec 29 17:02:07 2005  Tanaka Akira  <akr@m17n.org>

	* test/ruby/envutil.rb (EnvUtil.rubybin): search "ruby" instead of
	  "miniruby".  [ruby-dev:28140]

Tue Dec 27 16:59:52 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* test/drb/drbtest.rb (DRbService::self.ext_service): increase
	  timeout limit.  a patch from Kazuhiro NISHIYAMA
	  <zn at mbf.nifty.com>. [ruby-dev:28132]

Tue Dec 27 08:29:18 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/lib/openssl/ssl.rb (OpenSSL::SSL::SSLSocket#post_connection_chech):
	  treat wildcard character in commonName. [ruby-dev:28121]

Mon Dec 26 22:32:47 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_eval), gc.c (gc_mark_children), node.h (NEW_ALIAS,
	  NEW_VALIAS), parse.y (fitem): allow dynamic symbols to
	  NODE_UNDEF and NODE_ALIAS.
	  backported from trunk.  fixed: [ruby-dev:28105]

Mon Dec 26 08:50:36 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (ev_const_get): fixed a bug in constant reference during
	  instance_eval.  [yarv-dev:707]

	* eval.c (ev_const_defined): ditto.

	* lib/yaml.rb (YAML::add_domain_type): typo fixed.  a patch from
	  Joel VanderWerf <vjoel at path.berkeley.edu>.
	  [ruby-talk:165285] [ruby-core:6995]

Sat Dec 24 18:58:14 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* stable version 1.8.4 released.

Fri Dec 23 10:30:23 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/digest/sha2/sha2.c (ULL): support AIX C.  a patch from
	  Kailden <kailden at gmail.com>.  [ruby-core:06984]

Wed Dec 21 16:53:06 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* file.c (w32_io_info): should return handle because FileIndex is
	  valid only while file is open. [ruby-dev:28088]

Wed Dec 21 14:53:26 2005  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb (test_kernel_open): use File.identical?.
	  [ruby-talk:171804]

Tue Dec 20 22:41:17 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (eval_under_i): evaluate source in caller's frame.
	  [ruby-dev:28076]

	* eval.c (rb_call_super): use original method name on exception.
	  [ruby-dev:28078]

Tue Dec 20 13:11:59 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/syck/rubyext.c: fixed GC problem (backported HEAD 1.55 - 1.62)
	  [ruby-dev:27839]

	* ext/syck/syck.h (S_FREE): small hack. no need to check if pointer is
	  NULL or not before S_FREE.

	* st.c: uses malloc instead of xmalloc to avoid GC. syck uses st_insert
	  in gram.c to insert node from rb_syck_bad_anchor_handler into
	  SyckParser's hash table. if GC occurs in st_insert, it's not under
	  SyckParser's mark system yet. so RString can be released wrongly.
	  [ruby-dev:28057]

Tue Dec 20 12:53:23 2005  why the lucky stiff  <why@ruby-lang.org>

	* ext/syck/rubyext.c (syck_emitter_reset): to ensure compatibility
	  with previous Ruby versions, documents are no longer headless.

Tue Dec 20 01:46:48 2005  Tanaka Akira  <akr@m17n.org>

	* io.c (rb_f_backquote): fix a GC problem on
	  IA64 with gcc 4.0.3 20051216 (prerelease) -O3.

Mon Dec 19 23:32:39 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (rb_symname_p): fixed wrong validation.  [ruby-dev:28047]

Sat Dec 17 03:57:01 2005  Tanaka Akira  <akr@m17n.org>

	* bignum.c (rb_big_rshift): fix a GC problem on
	  IA64 with gcc 4.0.3 20051216 (prerelease).

Sat Dec 17 03:30:23 2005  Tanaka Akira  <akr@m17n.org>

	* eval.c (bmcall): fix a GC problem by tail call on
	  IA64 with gcc 4.0.3 20051216 (prerelease).

Fri Dec 16 00:54:06 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* signal.c (Init_signal): revert C++ style comment.
	  [ruby-dev:28041]

Thu Dec 15 12:35:14 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/tmpdir.rb: merged RDoc patch from Eric Hodel <drbrain at
	  segment7.net>.  [ruby-core:06894]

Thu Dec 15 01:33:31 2005  Tanaka Akira  <akr@m17n.org>

	* ext/zlib/zlib.c (zstream_run): fix a GC problem by tail call on
	  x86_64 with gcc 4.0.3 20051111 (prerelease) (Debian 4.0.2-4)

Wed Dec 14 12:11:46 2005  WATANABE Hirofumi  <eban@ruby-lang.org>

	* test/gdbm/test_gdbm.rb: specify pid for the argument of
	  Process.wait.  workaround for Cygwin.

Wed Dec 14 12:01:26 2005  Tanaka Akira  <akr@m17n.org>

	* marshal.c (r_object0): fix a GC problem for reading a bignum on
	  IA64 with gcc 3.3.5 (Debian 1:3.3.5-13).

Tue Dec 13 12:23:47 2005  Tanaka Akira  <akr@m17n.org>

	* re.c (rb_reg_regcomp): fix a GC problem on x86_64 with
	  gcc 3.3.5 (Debian 1:3.3.5-13).

Tue Dec 13 01:44:16 2005  Tanaka Akira  <akr@m17n.org>

	* array.c (rb_ary_diff): fix a GC problem on IA64 with
	  gcc 3.3.5 (Debian 1:3.3.5-13).
	  When rb_ary_push is called, there was no register which contains
	  `hash' but `&RHASH(hash)->tbl' instead.

Tue Dec 13 00:08:09 2005  Tanaka Akira  <akr@m17n.org>

	* sprintf.c (rb_str_format): fix a GC problem.
	  [ruby-dev:28001]

Mon Dec 12 15:54:56 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* test/openssl/test_ssl.rb (test_parallel): call GC.start to close
	  unused files. [ruby-dev:27981]

Mon Dec 12 00:33:56 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/digest/digest.c (rb_digest_base_s_digest): add volatile to
	  protect temporary context object.  [ruby-dev:27979]

	* ext/iconv/iconv.c (Init_iconv): rb_gc_register_address() should
	  be called before actual variable initialization.
	  [ruby-dev:27986]

Fri Dec  9 23:31:02 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/rexml/encoding.rb (encoding=): give priority to particular
	  conversion to iconv.  [ruby-core:06520]

Thu Dec  8 02:07:19 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (umethod_bind): adjust invoking class for module method.
	  [ruby-dev:27964]

Thu Dec  8 00:40:52 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (call_trace_func): klass parameter should be a
	  class/module that defines calling method.  [ruby-talk:169307]

Wed Dec  7 17:10:27 2005  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* sprintf.c (rb_f_sprintf): [ruby-dev:27967]

Wed Dec  7 15:31:35 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* sprintf.c (rb_str_format): integer overflow check added.

	* sprintf.c (GETASTER): ditto.

Wed Dec  7 01:02:04 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/README.macosx-aqua: [new document] tips to avoid the known
	  bug on platform specific dialogs of Tcl/Tk Aqua on MacOS X.

	* ext/tk/tcltklib.c: fix bug on switching threads and waiting on the
	  deleted interpreter on vwait and tkwait command.

	* ext/tk/lib/multi-tk.rb: kill the meaningless loop for the deleted Tk
	  interpreter.

	* ext/tk/sample/demos-jp/image3.rb: [bug fix] wrong argument.

	* ext/tk/sample/demos-en/image3.rb: ditto.

	* ext/tk/sample/demos-jp/menu.rb: fix message for MacOS X.

	* ext/tk/sample/demos-jp/menu8x.rb: ditto.

	* ext/tk/sample/demos-en/menu.rb: ditto.

Tue Dec  6 16:37:57 2005  Yuya Nishida  <yuya@j96.org>

	* eval.c (exec_under): avoid accessing ruby_frame->prev.
	  [ruby-dev:27948]

Thu Dec  1 00:50:33 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_funcall2): allow to call protected methods.
	  fixed: [ruby-dev:27890]

Wed Nov 30 23:52:17 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (NEWHEAP, ADD2HEAP): set count after pointer was set.
	  fixed: [ruby-dev:27896]

Wed Nov 30 13:43:07 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* misc/ruby-mode.el (ruby-expr-beg): support $! at the end of
	  expression.   [ruby-dev:27868]

Mon Nov 28 18:55:43 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/socket/socket.c (init_inetsock_internal): remove setting
	  SO_REUSEADDR option on server socket on Cygwin.
	  fixed: [ruby-core:6765] ([ ruby-Bugs-2872 ])

Mon Nov 28 13:08:54 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* win32/win32.c (rb_w32_strerror): remove all CR and LF. (avoid broken
	  error message on bccwin32 + winsock)

Mon Nov 28 09:21:49 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* lib/mkmf.rb (create_makefile): should not change sodir with
	  dir.gsub!. (bccwin32 failed to install third party exntesions)
	  [ruby-dev:27834]

Sun Nov 27 00:56:13 2005  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/wsdl/xmlSchema/complexContent.rb: missing
	  ComplexContent#elementformdefault method.

Sat Nov 26 19:57:45 2005  WATANABE Hirofumi  <eban@ruby-lang.org>

	* dln.c (conv_to_posix_path): should initialize posix.

Thu Nov 24 21:05:58 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* configure.in (AC_CHECK_FUNCS): need to check link().
	  fixed: [ruby-dev:27814]

Thu Nov 24 01:22:25 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* file.c (w32_io_info): CreateFile failed on Win9x if file was already
	  opened. (FILE_SHARE_READ was needed, but actually I don't understand
	  the flags of CreateFile well...)

Wed Nov 23 20:59:01 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: add Tk.pkgconfig_list and Tk.pkgconfig_get
	  [Tk8.5 feature].

	* ext/tk/lib/tk/text.rb: supports new indices modifires on a Text
	  widget [Tk8.5 feature].

	* ext/tk/lib/tk/virtevent.rb: add TkNamedVirtualEvent.

	* ext/tk/lib/tk/autoload.rb: ditto.

	* ext/tk/lib/tk/event.rb: add :data key for virtual events [Tk8.5
	  feature].

Wed Nov 23 18:55:31 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* file.c (w32_io_info): should not call GetFileInformationByHandle
	  for pipe.

	* file.c (w32_io_info): checks return value from rb_w32_get_osfhandle.

	* file.c (w32_io_info): now can identify directory on WinNT.

Wed Nov 23 03:40:49 2005  Guy Decoux  <ts@moulon.inra.fr>

	* re.c (KR_REHASH): should cast to unsigned for 64bit CPU.
	  [ruby-core:06721]

Wed Nov 23 11:01:33 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* intern.h, file.c: failed to compile on windows.

Wed Nov 23 07:26:44 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/extconf.rb: check for X509V3_EXT_nconf_nid.

	* ext/openssl/ossl_x509ext.c (MakeX509ExtFactory): should use
	  OPENSSL_malloc to allocate X509V3_CTX.

	* ext/openssl/ossl_x509ext.c (ossl_x509extfactory_create_ext): use
	  X509V3_EXT_nconf_nid to avoid SEGV (and to build extensions which
	  values are placed in separate section).

	* test/openssl/test_x509ext.rb: new file.

Wed Nov 23 01:22:57 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (test_identical): test if two files are identical.

	* file.c (rb_f_test): support DOSISH systems where st_ino is not
	  reliable.  fixed: [ruby-core:06672]

	* win32.h, win32.c (rb_w32_osid): check the running platform.

Tue Nov 22 23:52:06 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb: match incomplete (in current enconding) multibyte
	  string.  http://inamode6.tokuhirom.dnsalias.org/show/1551

Tue Nov 22 18:36:11 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* win32/win32.c (winnt_stat): set mapped errno instead of ENOENT.

Tue Nov 22 14:46:57 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* file.c (rb_file_s_basename): skip slashes just after UNC top slashes.

	* test/ruby/test_path.rb (test_dirname, test_basename): follow new
	  spec. and add new tests.

Tue Nov 22 13:18:32 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* win32/win32.c (rb_w32_stat): Dir.chdir('//server/shared');
	  p Dir.glob('*') should work on WinNT. (implemented our own
	  stat(2) on WinNT) [ruby-list:41552] [ruby-dev:27711]

Tue Nov 22 02:31:53 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tkextlib/tile.rb: bug fix (Tk::Tile::USE_TTK_NAMESPACE
	  is not defined).

Tue Nov 22 01:45:21 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_file_s_basename): DOSISH_UNC is defined on cygwin but
	  DOSISH is not.  fixed: [ruby-dev:27797]

Mon Nov 21 22:50:48 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_path_skip_prefix, rb_file_s_basename): UNC without path
	  should not be splitted.  fixed: [ruby-dev:27776] [ruby-dev:27786]

	* parse.y (dsym): prohibit empty symbol literal by interpolation.
	  fixed: [ruby-talk:166529]

Mon Nov 21 16:03:48 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/setup.mk: findstr doesn't exist on win9x.
	  fixed: [ruby-dev:27756]

Sun Nov 20 22:34:06 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (rb_symname_p): [ not followed by ] is not valid symbol.
	  fixed: [ruby-talk:166520]

Sat Nov 19 19:57:54 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/fileutils.rb (FileUtils::ln): ln documentation fix.
	  [ruby-core:06661]

Sat Nov 19 07:34:32 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/font.rb: remove dependency on Ruby's version (1.8
	  or 1.9).

	* ext/tk/lib/tkextlib/ICONS/icons.rb: ditto.

	* ext/tk/sample/tkextlib/treectrl/demo.rb: ditto.

Fri Nov 18 17:57:08 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* file.c (rb_file_s_dirname): should use skipprefix for UNC path.
	  pointed out by nobu ([ruby-dev:27744]). fixed: [ruby-core:5076]

Fri Nov 18 17:35:09 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: add restriction to access the entried
	  command table and manipulate other IPs (for reason of security).
	  Now, a IP object can be controlled by only its master IP or the
	  default IP.

	* ext/tk/lib/remote-tk.rb: add restriction to manipulate.

	* ext/tk/tcltklib.c (ip_is_slave_of_p): add TclTkIp#slave_of?(ip)
	  to check manipulability.

	* ext/tk/lib/tk.rb: bug fix on handling of Tcl's namespaces.

	* ext/tk/lib/tk/namespace.rb: ditto.

Fri Nov 18 17:26:06 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* file.c (rb_file_s_dirname): added checks for some patterns with drive
	  letter. fixed: [ruby-dev:27738]

	* test/ruby/test_path.rb (test_dirname): added tests for above
	  patterns.

Fri Nov 18 12:18:02 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* win32/win32.h (S_IFIFO): r,w = IO.pipe; r.stat.pipe? now
	  returns true on VisualC++6.

Wed Nov 16 23:24:17 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (static-ruby): overridable.

	* ext/extmk.rb (parse_args): force to link extensions statically only
	  if static is given for extstatic.

	* ext/extmk.rb (RUBY, RUBYW): overridable.

Tue Nov 15 23:46:35 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/find.rb (Find::find): should not ignore symbolic links to
	  non-existing files.  [ruby-talk:165866]

Tue Nov 15 16:23:26 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* array.c (rb_ary_fill): previous commit disabled this usage:

	    a = [0,1,2,3,4,5,6,7,8,9]
	    a.fill {|i| a[i] * 10} #=> [nil, nil, ...., nil]

	  previous commit has the advantage of early garbage collection, but
	  potensially this would break some script. so I reverted behavior.

Tue Nov 15 16:04:10 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* array.c (rb_ary_fill): tail elements were vanished when the middle
	  part of array was filled. (ie: [0,1,2,3,4].fill(-1,2,1) => [0,1,-1])

	* test/ruby/test_array.rb (test_fill): added.

Tue Nov 15 14:39:16 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_fill): should adjust array length correctly when
	  an array is expanded in the fill process.  [ruby-core:06625]

Mon Nov 14 23:49:57 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_file_s_readlink): ERANGE will occur only on GPFS.
	  [ruby-dev:27699]

Mon Nov 14 17:36:22 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_first): RDoc update from Daniel Berger
	  <djberg96@yahoo.com>.  [ruby-core:06577].

Fri Nov 11 10:31:44 2005  Zach Dennis  <zdennis@mktec.com>

	* ext/socket/socket.c: Socket Documentation. [ruby-core:6552]

Fri Nov 11 08:20:56 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* Makefile.in (OUTFLAG): keep trailing spaces.  [ruby-dev:27666]

	* mkconfig.rb: substitution refereces added.

Fri Nov 11 07:44:18 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* configure.in: undef HAVE_LINK on BeOS. (link(2) always returns
	  EINVAL, and this causes error in test/fileutils.)

	* file.c: overwride chown(2) and fchown(2) on BeOS. (these functions
	  should not change user/group id if -1 is passed as corresponding
	  argument, and this causes error in test/fileutils too)
	  [ruby-dev:27672]

	* file.c (rb_file_s_link): checks HAVE_LINK.

Tue Nov  8 15:32:27 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/drb/ssl.rb (DRb::SSLConfig#accept): fixed typo.
	  [ruby-dev:27560] [ruby-core:4627]

Mon Nov  7 13:43:51 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/stubs.c (_nativethread_consistency_check): use simpler
	  (low cost) way to check whether the Tcl interpreter was compiled
	  with threads enabled of not.

	* ext/tk/tcltklib.c: reduce warnings.

	* ext/tk/tkutil/tkutil.c: ditto.

Mon Nov  7 00:06:58 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* lib/yaml.rb: removed :nodoc: to generate Kernel doc. [ruby-core:6324]

Sun Nov  6 23:39:13 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/iconv/iconv.c (Iconv::BrokenLibrary): exception when detected a
	  bug of underlying library.

Sun Nov  6 21:46:59 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/tk/stubs.c (ruby_tcl_create_ip_and_stubs_init): should touch
	  interpreter after initialization is done. [ruby-dev:27638]

Sun Nov  6 20:13:27 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_file_s_readlink): readlink(2) on AIX fails with ERANGE if
	  buffer size is less than required.  fixed: [ruby-dev:27634]

Wed Nov  2 20:25:28 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/extconf.rb: ext/tk/extconf.rb: change the check parameter
	  for Win32.

Wed Nov  2 20:14:53 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib: merge into ext/tk and remove.

Wed Nov  2 19:03:06 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c (ip_rbUpdateObjCmd,
	  ip_rb_threadUpdateObjCmd): passed improper flags to DoOneEvent().

	* ext/tk/tkutil.c: use rb_obj_respond_to() instead of rb_respond_to().

Tue Nov  1 14:20:11 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_call_super): should call method_missing if super is
	  called from Kernel method.

	* eval.c (exec_under): frame during eval should preserve external
	  information.

Tue Nov  1 10:50:17 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/extconf.rb: should check ERR_peek_last_error().
	  [ruby-dev:27597]

	* ext/openssl/ossl.c (ossl_raise): ditto.

Mon Oct 31 17:34:46 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* configure.in: use proper option for Sun linker. A patch from
	  Shinya Kuwamura <kuwa at labs.fujitsu.com>.  [ruby-dev:27603]

Mon Oct 31 11:27:22 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/gdbm/test_gdbm.rb, test/sdbm/test_sdbm.rb (test_s_open_error):
	  skip on Win32/DOS platforms.

Mon Oct 31 05:49:23 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_cipher.c (ossl_cipher_update): input data must
	  not be empty. [ruby-talk:161220]

	* test/openssl/test_cipher.rb: add test for Cipher#update("").

Mon Oct 31 05:37:20 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httpservlet/cgihandler.rb
	  (WEBrick::HTTPServlet::CGIHandler#do_GET): the value of Set-Cookie:
	  header field should be splited into each cookie.  [ruby-Bugs:2199]

	* lib/webrick/cookie.rb (WEBrick::Cookie.parse_set_cookie): new method
	  to parse the value of Set-Cookie: header field.

	* test/webrick/test_cookie.rb, test/webrick/test_cgi.rb,
	  test/webrick/webrick.cgi: add some test for cookie.

Mon Oct 31 03:19:36 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/readline/readline.c (readline_readline): type check.
	  [ruby-core:6089]

	* numeric.c (fix_rshift): RDoc fix.  [ruby-core:6351]

	* util.h (strtod): add #undef for platforms defines strtod()
	  macro.   [ruby-dev:27563]

Mon Oct 31 02:35:59 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* test/ruby/test_float.rb (test_precision): test by assert_in_delta.
	  [ruby-dev:27575]

Sat Oct 29 01:58:25 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/etc/etc.c: document update from mathew <meta@pobox.com>.
	  [ruby-core:06473]

	* ext/fcntl/fcntl.c: ditto.

Thu Oct 27 16:45:31 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (scan_once): wrong condition to use mbclen2().
	  [ruby-dev:27535]

Wed Oct 26 09:27:27 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/syck/implicit.c (syck_type_id_to_uri): should return
	  newly allocated memory. otherwise, type_id will be freed
	  twice. [ruby-dev:27384] [ruby-core:6385]

Wed Oct 26 09:04:51 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ruby.h (Qfalse, Qtrue, Qnil, Qundef): make sure these immediate
	  values have VALUE type. there is an environment where sizeof(VALUE)
	  != sizeof(int) like IA64. if 32bit integer (Qtrue) is passed to ANYARGS
	  and received by 64bit integer (VALUE), upper bits may have garbage value.
	  [ruby-dev:27513]

Wed Oct 26 01:58:19 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (RUBY_EXTERN): macro to export symbols in shared
	  library.  [ruby-core:05528]

	* defines.h, {bcc32,win32,wince}/Makefile.sub (RUBY_EXTERN): moved to
	  configuration pass.

	* ext/extmk.rb (extmake): RUBY_EXTERN for static linked extensions.

Tue Oct 25 15:32:00 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/rational.rb: applied documentation patch from Gavin Sinclair
	  <gsinclair@gmail.com>.  [ruby-core:06364]

	* lib/irb.rb (IRB::Irb::eval_input): handle prompts with newlines
	  in irb auto-indentation mode.  [ruby-core:06358]

Tue Oct 25 02:12:08 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/rdoc/markup/simple_markup.rb (SM::SimpleMarkup::LABEL_LIST_RE):
	  reduce redundant backtrack.  [ruby-talk:161771]

Tue Oct 25 00:27:35 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/rinda/*: RDoc documentation from Eric Hodel
	  <drbrain@segment7.net> added.

Mon Oct 24 21:14:29 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in, io.c: use sys/syscall.h if syscall.h is not available.
	  [ruby-core:06247]

Mon Oct 24 20:49:45 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/Win32API/lib/win32/resolv.rb (get_info): support multiple DNS.
	  fixed: [ruby-list:40058], [ruby-dev:27479]

Mon Oct 24 07:57:56 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/tk/lib/tk/canvas.rb (TkCanvasItemConfig::__item_val2ruby_optkeys):
	  typo fixed.  [ruby-talk:162187]

	* ext/tk/lib/tk/menu.rb (TkMenuEntryConfig::__item_val2ruby_optkeys):
	  ditto.  [ruby-core:06359]

Sun Oct 23 21:50:15 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/enumerator/enumerator.c: applied documentation patch from
	  James Edward Gray II <james@grayproductions.net>.
	  [ruby-core:06348]

Sun Oct 23 07:11:11 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/extconf.rb: improve messages [ruby-core:06325].

	* ext/tk/lib/tk.rb, ext/tk/lib/tk/canvas.rb, ext/tk/lib/tk/entry.rb,
	  ext/tk/lib/tk/frame.rb, ext/tk/lib/tk/image.rb,
	  ext/tk/lib/tk/itemconfig.rb, ext/tk/lib/tk/labelframe.rb,
	  ext/tk/lib/tk/listbox.rb, ext/tk/lib/tk/menu.rb,
	  ext/tk/lib/tk/radiobutton.rb, ext/tk/lib/tk/scale.rb,
	  ext/tk/lib/tk/spinbox.rb, ext/tk/lib/tk/text.rb,
	  ext/tk/lib/tk/toplevel.rb: improve conversion of option values.

	* ext/tk/lib/tkextlib/*: ditto.

	* ext/tk/lib/tkextlib/*: update to support ActiveTcl8.4.11.2.

	* ext/tk/lib/tkextlib/trofs/*: support Trofs 0.4.3.

	* ext/tk/lib/tkextlib/tile/*: support Tile 0.7.2.

	* ext/tk/lib/tkextlib/vu/*: support vu 2.3.0.

	* ext/tk/lib/tkextlib/tcllib/*: support Tcllib 1.8 (Tklib 0.3).

Sat Oct 22 23:54:07 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb, lib/mkmf.rb (with_config): support --with-extension
	  options.  [ruby-dev:27449]

Sat Oct 22 13:26:57 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* object.c (sym_inspect), parse.y (parser_yylex, rb_symname_p): check
	  if valid as a symbol name more strictly.  [ruby-dev:27478]

	* test/ruby/test_symbol.rb: tests for [ruby-core:03573].

	* time.c (rb_strftime): removed meaningless volatile modifiers, and
	  concatenate successive nul characters at once.  [ruby-dev:27472]

Fri Oct 21 19:21:56 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* rubysig.h (CHECK_INTS): fixed typo. (I believe bit-or is improper)

Fri Oct 21 17:49:32 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* bin/erb (ERB::Main::run): typo fixed.  [ruby-core:06337]

Fri Oct 21 15:27:17 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* bignum.c (bignew_1): convertion from `int' to `char' discards
	  upper bits, (ie. (char)0xff00 -> 0) so it's better to test if
	  nonzero and set 0 or 1 instead of simply casting ... as a flag usage.
	  (but I believe this won't cause actual bug in current implementation)
	  [ruby-dev:27055]

	* time.c: should use LONG_LONG instead of `long long'.

Thu Oct 20 09:37:15 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* lib/mkmf.rb (create_makefile): Borland make seems not to allow
	  empty dependency list. If this change is not good, please correct
	  it.

Thu Oct 20 07:55:09 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (create_makefile): get rid of a restriction
	  of Borland make.  fixed: [ruby-dev:27460]

Thu Oct 20 00:13:18 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* rubysig.h (CHECK_INTS): fix typo.

Wed Oct 19 23:58:03 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (create_makefile): do not create unnecessary empty
	  directories.  fixed: [ruby-dev:27451]

Wed Oct 19 19:26:15 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (rb_gc_mark_parser): get rid of segfault with old yacc.
	  fixed: [ruby-dev:27439]

Wed Oct 19 08:28:32 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_file_join): elements may contain null pointer strings.
	  report and fixed by Lloyd Zusman (hippoman): [ruby-core:06326]

Wed Oct 19 02:34:33 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c, gc.c, time.c: made internal symbols static.  [ruby-dev:27435]

Wed Oct 19 01:27:07 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* regex.c (re_compile_pattern): numeric literal inside character class
	  disabled succeeding backtrack.  fixed: [ruby-list:41328]

Mon Oct 17 21:18:50 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (parser_heap): byacc never free parser stack.
	  fixed: [ruby-dev:27428]

Mon Oct 17 16:04:47 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* file.c (chmod_internal, lchmod_internal): fixed type of 2nd argument.

Sun Oct 16 22:16:51 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb: omit non-existing directories.

Sun Oct 16 14:30:05 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/rinda/rinda.rb (Rinda::Tuple#initialize): check remote hash
	  tuple. fixed: [ruby-list:41227]

	* test/rinda/test_rinda.rb: test it.

Sun Oct 16 03:38:07 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* rubysig.h (CHECK_INTS): prevent signal handler to run during
	  critical section.  [ruby-core:04039]

	* eval.c (load_wait): need not to call rb_thread_schedule()
	  explicitly.  [ruby-core:04039]

	* eval.c (rb_thread_schedule): clear rb_thread_critical.
	  [ruby-core:04039]

Sat Oct 15 19:56:38 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* bin/erb: typo fixed, again. thanks, Doug Kearns.

Fri Oct 14 22:08:26 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (ioctl): should set errno.

Fri Oct 14 16:57:32 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/config.rb (Config::FileHandler): :UserDir should be nil.
	  It is harmful to permit the access to ~/public_html by default.
	  suggested by Hiroyuki Iwatsuki.

Thu Oct 13 23:29:51 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (HEAPCNT): bison allocates indivisible size.
	  fixed: [ruby-core:06261]

	* io.c, pack.c, ext/syck/rubyext.c, ext/syck/syck.h, missing/isinf.c:
	  get rid of warnings.  fixed: [ruby-core:06247]

Wed Oct 12 12:52:57 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl.c (Init_openssl): should call
	  OpenSSL_add_ssl_algorithms().

Wed Oct 12 11:08:54 2005  WATANABE Hirofumi  <eban@ruby-lang.org>

	* file.c (rb_f_test): typo in RDoc comments.

Tue Oct 11 21:41:58 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_obj_respond_to): check if obj responds to the given
	  method with the given visibility.  [ruby-dev:27408]

	* eval.c (rb_respond_to): conform to Object#respond_to?.  [ruby-dev:27411]

Tue Oct 11 00:01:21 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* st.c (st_free_table): do not call free() but xfree().
	  [ruby-core:06205]

Sat Oct  8 20:04:40 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (Init_Binding): add Binding#dup method.  [yarv-dev:666]

	* parse.y (rb_parser_malloc, rb_parser_free): manage parser stack on
	  heap.  [ruby-list:41199]

	* ext/iconv/charset_alias.rb: parse config.charset_alias file directly.

Fri Oct  7 09:54:00 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/cgi.rb (CGI::Cookie::parse): Cookies from Nokia devices may
	  not be parsed correctly.  A patch from August Z. Flatby
	  (augustzf) in [ruby-Patches-2595].  [ruby-core:06183]

Thu Oct  6 20:12:16 2005  Minero Aoki  <aamine@loveruby.net>

	* ext/strscan/strscan.c (strscan_free): remove useless code.
	  [ruby-dev:26368] [ruby-dev:27389]
	  (backported from trunk, rev 1.22)

Wed Oct  5 04:42:38 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/xmlrpc/server.rb (XMLRPC::Server#initialize): should mount the
	  servlet on "/".

Wed Oct  5 03:59:09 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/xmlrpc/server.rb (XMLRPC::Server#serve): delete wrong call
	  of "join".

Mon Oct  3 00:04:00 2005  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* pack.c (EXTEND16): [ruby-dev:27383]

Thu Sep 29 10:26:18 2005  Tanaka Akira  <akr@m17n.org>

	* ext/dl/dl.c (rb_io_to_ptr): abolish sizeof(FILE).
	  [ruby-dev:27317]

Thu Sep 29 07:22:05 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* evalc. (rb_f_send): underscores need to be escaped.
	  fixed by Doug Kearns.  [ruby-core:06053]

Thu Sep 29 00:57:35 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (ev_const_get), variable.c (rb_const_get_0): retry only when
	  autoload succeeded.

	* variable.c (rb_autoload_load): now return true if autoload
	  succeeded.  fixed: [ruby-dev:27331]

Wed Sep 28 23:42:15 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (apply2files): add prototype.

	* file.c (rb_stat_inspect): constified.

	* class.c (rb_mod_init_copy, rb_class_init_copy), file.c (rb_stat_init_copy),
	  numeric.c (num_init_copy), object.c (rb_obj_init_copy, Init_Object),
	  re.c (match_init_copy, rb_reg_init_copy), time.c (time_init_copy):
	  undocumented.

Wed Sep 28 23:09:23 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/delegate.rb: document update from James Edward Gray II
	  <james@grayproductions.net>.  [ruby-core:06027]

Wed Sep 28 15:14:19 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/cgi.rb (WEBrick::CGI#start): req.query_string should
	  refer the value of QUERY_STRING. [ruby-list:41186]

	* lib/webrick/httprequest.rb (WEBrick::HTTPRequest#query_string=):
	  add new method.

Wed Sep 28 10:45:44 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: cannot compile with Tcl/Tk8.0.x
	  [ruby-dev:27335].

Wed Sep 28 08:12:18 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (read_buffered_data): check if reached EOF.  fixed: [ruby-dev:27334]

Wed Sep 28 07:56:52 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/yaml/basenode.rb (YAML::BaseNode::match_segment): fix typo.
	  [ruby-dev:27237], [ruby-core:05854]

	* lib/yaml/tag.rb (Module#yaml_as): suppress warnings.

	* lib/yaml/types.rb (YAML::PrivateType, YAML::DomainType): ditto.

Wed Sep 28 03:23:35 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* rubysig.h: fixed build problem with --enable-pthread on platforms
	  which don't have setitimer().

Mon Sep 26 22:32:13 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (set_trace_func): add rb_secure(4) to prevent adding
	  tracing function.

Sun Sep 25 12:05:10 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* bin/erb: typo fixed.

Sun Sep 25 01:46:43 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* misc/ruby-mode.el (ruby-calculate-indent): arrange deep-indent
	  closing parenthesis at same column as the opening.

Sun Sep 25 00:42:11 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* misc/ruby-mode.el (ruby-expr-beg): deal with heredoc separately.
	  fixed: [ruby-list:41168]

	* misc/ruby-mode.el (ruby-calculate-indent): not to deepen indent
	  level for continuous line inside parentheses.
	  http://nabeken.tdiary.net/20050915.html#p02

Sun Sep 25 00:18:11 2005  Tanaka Akira  <akr@m17n.org>

	* eval.c (unknown_node): show more information.  [ruby-dev:26196]

Sat Sep 24 08:56:01 2005  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (cd): no longer accept :noop option, related
	  code is useless (backported from trunk, rev 1.67).
	  [ruby-core:05858] [ruby-Bugs:2494]

Sat Sep 24 08:38:07 2005  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb: fix visibility of FileUtils::NoWrite, Verbose,
	  DryRun (backported from trunk, rev 1.66). [ruby-core:05954]

	* test/fileutils/test_nowrite.rb: test it.

	* test/fileutils/test_dryrun.rb: new file.

	* test/fileutils/test_verbose.rb: new file.

Sat Sep 24 02:40:20 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/delegate.rb: document update from James Edward Gray II
	  <james@grayproductions.net>.  [ruby-core:05942]

Thu Sep 22 23:36:24 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (find_executable0): default path if environment is not
	  set.  [ruby-dev:27281]

Thu Sep 22 16:33:12 2005  Shugo Maeda  <shugo@ruby-lang.org>

	* test/readline/test_readline.rb (TestReadline::replace_stdio):
	  merged the patch of [ruby-dev:25232] instead of [ruby-dev:25223].

Wed Sep 21 23:30:44 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (configuration): generalized nmake dependent code.

Wed Sep 21 09:07:55 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* stable version 1.8.3 released.

Wed Sep 21 08:52:25 2005  why the lucky stiff  <why@ruby-lang.org>

	* ext/syck/token.c: correctly compute identation of a block
	  scalar's parent node. [ruby-talk:150620]

Wed Sep 21 08:20:24 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* README.EXT, README.EXT.ja: add new features.

Wed Sep 21 07:43:58 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb (default_argv, Arguable#options): defaults strings
	  to be parsed to Arguable instance.

Wed Sep 21 02:44:09 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* file.c (path_check_0): disallow sticky world writable directory
	  in PATH (and $LOAD_PATH).  [ruby-dev:27226]

	* file.c (fpath_check): typo fixed.

Tue Sep 20 22:29:49 2005  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/wsdl/simpletype/rpc/test_rpc.rb, test/wsdl/ref/test_ref.rb,
	  test/wsdl/any/test_any.rb test/soap/wsdlDriver/test_calc.rb:
	  suppress deliberate warnings with $VERBOSE = nil.

Tue Sep 20 21:26:23 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/io/wait/lib/nonblock.rb: disable on platforms non-blocking flag
	  is not available.  fixed: [ruby-dev:27187]

Tue Sep 20 18:23:04 2005  Tanaka Akira  <akr@m17n.org>

	* eval.c (thread_mark): mark th->last_status.  [ruby-dev:27179]

Tue Sep 20 18:20:33 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/yaml.rb: require 'yaml/constants'.  [ruby-core:5776]

Tue Sep 20 17:48:34 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/xmlrpc/client.rb (XMLRPC::Client::do_rpc): add charset
	  information to content-type header.[ruby-core:5127]

	* lib/xmlrpc/server.rb (CGIServer::serve): ditto.

	* lib/xmlrpc/server.rb (ModRubyServer::serve): ditto.

	* lib/xmlrpc/server.rb (WEBrickServlet::service): ditto.

Tue Sep 20 17:34:46 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* test/webrick/test_cgi.rb: set ENV["PATH"] to CGIEnvPath on
	  windows. bcc32's runtime is not installed into system directory,
	  so it cannot be found without this setting. [ruby-dev:27166]

Tue Sep 20 17:10:38 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* test/dbm/test_dbm.rb (TestDBM::test_s_open_error): remove
	  test_s_open_error test to detect duplicate open.
	  [ruby-dev:27202]

Tue Sep 20 17:08:31 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* io.c: PIPE_BUF is not defined on BeOS. use _POSIX_PIPE_BUF instead.
	  [ruby-dev:27185]

Tue Sep 20 16:53:53 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* test/readline/test_readline.rb (TestReadline::replace_stdio):
	  BSD seek support from [ruby-dev:25223].  fixed: [ruby-dev:27150]

Tue Sep 20 15:39:40 2005  why the lucky stiff  <why@ruby-lang.org>

	* ext/syck/emitter.c (syck_scan_scalar): prevent indicators from
	  appearing alone or at the end of plain scalars. [ruby-core:5826]

	* ext/syck/emitter.c (syck_emit_scalar): treat typed scalar nodes
	  as complex keys.

	* lib/syck.h: version 0.60.

	* lib/yaml/basenode.rb (YAML::BaseNode#at): transform keys during
	  key searches.

	* ext/syck/rubyext.c: loading of binary-typed nodes.  prevent
	  emission of plain strings that look like symbols, but which aren't.

Tue Sep 20 05:50:22 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* test/xmlrpc/test_webrick_server.rb (setup_http_server):
	  should not include 'webrick/https' unless 'use_ssl' because
	  it fails where openssl is not installed.

Tue Sep 20 00:34:07 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (io_close): call rb_io_close() directly if io is a T_FILE
	  object.  [ruby-dev:27156]

Mon Sep 19 19:09:08 2005  Minero Aoki  <aamine@loveruby.net>

	* file.c (rb_file_chown): should accept nil. [ruby-dev:27171]
	  (backport from trunk, rev 1.208)

Mon Sep 19 18:35:13 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/dl/dl.c (rb_io_to_ptr): fix DragonFlyBSD support.
	  [ruby-dev:27151]

Mon Sep 19 14:17:04 2005  Minero Aoki  <aamine@loveruby.net>

	* ext/syck/emitter.c (syck_emit): passing an int* value to the
	  long* parameter causes unaligned access on LP64 systems.
	  [ruby-dev:27161]

Mon Sep 19 13:44:03 2005  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c: avoid core dump with WIN32OLE_EVENT.
	  [ruby-dev:27133]

Mon Sep 19 10:36:06 2005  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (cp_r): default is :dereference_root=>true for
	  backward compatibility. [ruby-dev:27145]

	* test/fileutils/test_fileutils.rb (test_cp_r): test it.

Mon Sep 19 09:57:39 2005  Minero Aoki  <aamine@loveruby.net>

	* test/fileutils/test_fileutils.rb: backported from trunk (1.36).
	  (again) [ruby-dev:27145]

Mon Sep 19 07:45:37 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_pkey.h, ossl_pkey_rsa.c, ossl_pkey_dsa.c:
	  an instance variable "private" is added to OpenSSL::PKey class.
	  this ivar is a flag that shows whether there is a private key
	  in the instance.

	* ext/openssl/ossl_engine.c: (ossl_engine_load_privkey): set private
	  key flag.

Mon Sep 19 06:41:32 2005  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb: backported from trunk (rev 1.65):

	* lib/fileutils.rb (rm_r): new option :secure.

	* lib/fileutils.rb (rm_rf): new option :secure.

	* lib/fileutils.rb: new method #remove_entry_secure.

	* lib/fileutils.rb (cd): remove option :noop.

	* lib/fileutils.rb (cp_r): new option :dereference_root.

	* lib/fileutils.rb (cp_r): new option :dereference_root.

	* lib/fileutils.rb: new method #remove_entry.

	* lib/fileutils.rb: new method #chmod_R.

	* lib/fileutils.rb: new method #chown.

	* lib/fileutils.rb: new method #chown_R.

	* lib/fileutils.rb: new method .commands.

	* lib/fileutils.rb: new method .options.

	* lib/fileutils.rb: new method .have_option?.

	* lib/fileutils.rb: new method .options_of.

	* lib/fileutils.rb: new method .collect_method.

	* lib/fileutils.rb: use module_function instead of single extend.

	* test/fileutils/test_fileutils.rb: backported from trunk (1.36).

Mon Sep 19 03:17:48 2005  Tanaka Akira  <akr@m17n.org>

	* file.c (rb_thread_flock): wrap the flock system call by
	  TRAP_BEG/TRAP_END to enable signals.  [ruby-dev:27122]

	* ext/socket/socket.c (bsock_send): wrap the sendto and send system
	  call by TRAP_BEG/TRAP_END to enable signals when writing to a socket
	  which is full.  [ruby-dev:27132]

	* io.c (rb_io_syswrite): wrap the write system call by
	  TRAP_BEG/TRAP_END to enable signals when writing to a pipe which is
	  full.  [ruby-dev:27134]

Mon Sep 19 03:02:08 2005  Tanaka Akira  <akr@m17n.org>

	* io.c (io_fwrite): wrap the write system call by TRAP_BEG/TRAP_END to
	  enable signals when writing to a pipe which is full.

Sun Sep 18 02:10:47 2005  why the lucky stiff  <why@ruby-lang.org>

	* lib/yaml/rubytypes.rb: remove comments that are bungling up
	  the rdoc and ri output.  output symbols as plain scalars.

	* ext/syck/rubyext.c (syck_emitter_reset): emit headless
	  documents always.

	* ext/syck/emitter.c (syck_scan_scalar): quote scalars with any
	  kind of surrounding line space, tabs or spaces alike.

	* ext/syck/token.c: accept tabs as whitespace, not for indentation,
	  but strip from plain scalars.

	* test/yaml/test_yaml.rb: remove outdated tests.

Sat Sep 17 23:25:04 2005  sheepman  <sheepman@sheepman.sakura.ne.jp>

	* lib/mathn.rb (Rational::inspect): should preserve original
	  operand.  [ruby-core:05806]

Sat Sep 17 23:20:27 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/cgi.rb (CGI::Cookie): should handle multiple values for a
	  cookie name.  [ruby-talk:156140]

Sat Sep 17 10:42:13 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: MultiTkIp#eval_string and bg_eval_string
	  should call Kernel.eval on caller's safe-level instead of slave's
	  safe-level (Of course, the given script should be evaluated on
	  slave's safe-level).

Sat Sep 17 09:45:26 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_substr): should propagate taintness even for
	  empty strings.  [ruby-dev:27121]

	* string.c (rb_str_aref): should infect result if range argument
	  is tainted.  [ruby-dev:27121]

Sat Sep 17 08:35:39 2005  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/maker/base.rb (RSS::Maker::ItemsBase#normalize): fixed
	  strange RSS::Maker::Item#max_size behavior.
	  Thanks to Kazuhiko <kazuhiko@fdiary.net>.

	* test/rss/test_maker_1.0.rb (RSS::TestMaker10#test_items): ditto.

Fri Sep 16 23:09:20 2005  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c (ole_search_event_at): bug fix
	  in ext/win32ole/sample/ienavi.rb.

	* ext/win32ole/win32ole/tests/testOLEEVENT.rb: ditto.

Fri Sep 16 22:41:18 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_file_s_extname): empty string for path name ending with a
	  period.  fixed: [ruby-core:05651]

	* file.c (rb_file_join): smarter behavior at edge cases.
	  fixed: [ruby-core:05706]

Fri Sep 16 18:34:01 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/syck/node.c (syck_replace_str): was using return from the
	  void function.  a patch from MIYAMUKO Katsuyuki
	  <miyamuko at mtb.biglobe.ne.jp>.  [ruby-dev:27111]

Fri Sep 16 14:48:48 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: fix typo on MultiTkIp#bg_eval_string

Fri Sep 16 12:02:12 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/syck/rubyext.c (syck_resolver_transfer): remove C++ style
	  comment (//).  [ruby-core:05793]

Fri Sep 16 00:14:14 2005  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/logger/test_logger.rb: unintentionally overwritten changes by
	  Usa.  reverted.

Fri Sep 16 00:06:18 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/cgi.rb (WEBrick::CGI::Socket#initialize): should set
	  $stdout.binmode.

Thu Sep 15 23:25:21 2005  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/{soap,wsdl,xsd}, test/{soap,wsdl,xsd}: imported soap4r/1.5.5.

	  #nnn is a ticket number at http://dev.ctor.org/soap4r

	  * SOAP

	    * allow to configure an envelope namespace of SOAP request. (#124)
	   	TemporaryNamespace = 'http://www.w3.org/2003/05/soap-envelope'
	  	@client.options["soap.envelope.requestnamespace"] =
		  TemporaryNamespace
	 	@client.options["soap.envelope.responsenamespace"] =
		  TemporaryNamespace
		@client.do_proc(...)

	    * let SOAP request XML indent space configuable.  see
	      "soap.envelope.no_indent" option. (#130)

	    * let external CES configuable.
	      ex. client["soap.mapping.external_ces"] = 'SJIS'.  $KCODE is used
	      by default. (#133)
		external CES ::= CES used in Ruby object of client and server
		internal CES ::= CES used in SOAP/OM

	    * add iso-8859-1 external CES support. (#106)

	    * fixed illegal 'qualified' handling of elements.  it caused
	      ASP.NET inteoperability problem. (#144)

	    * added 'soap.envelope.use_numeric_character_reference' (boolean)
	      option to let query XML use numeric character reference in XML,
	      not plain UTF-8 character.  !GoogleSearch server seems to not
	      allow plain UTF-8 character since 2005-08-15 update. (#147)

	    * SOAP::Header::SimpleHeader (de)serialization throws an exception
	      on !SimpleHeader.on_(in|out)bound when header is a String.  so we
	      could not use a simple single element headerItem.  fixed.  thanks
	      to emil. (#129)

	    * out parameter of rpc operation did not work.  (#132)

	    * follow HTTP redirect only if using http-access2.  (#125) (#145)

	    * add a workaround for importing an WSDL whose path begins with
	      drive letter.  (#115)

	  * WSDL

	    * SOAP Data which is defined as a simpletype was not mapped
	      correctly to Ruby obj when using wsdl2ruby.rb generated classdef
	      file. (#123)

	    * rpc/literal support. (#118)

	    * re-implemented local element qualify/unqualify control.  handles
	      elementFormDefault and form in WSDL.  (#119)

	    * Array of an element which has simpleType causes a crash. (#128)

	    * prarmeterOrder may not contain return part so it can be shorter
	      than parts size.  Thanks to Hugh.  (#139)

	  * Samples

	    * added !BasicAuth client sample. (#117)

	    * added Base64 client/server sample.

	    * added Flickr SOAP interface client sample. (#122)

	    * added !SalesForce client sample. (#135)

	    * updated Thawte CA certificate for !GoogleAdWords sample.

	    * updated a client script with the newer version made by Johan.
	      thanks!

	    * shortened long file names. (#120)

	    * fixed typo in authheader sample. (#129)

	    * updated deprecated method usage.  (#138)

Thu Sep 15 23:02:57 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* win32/win32.h (rb_w32_stat): added prototype.

Thu Sep 15 22:35:55 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/ruby/test_signal.rb (test_exit_action): skip the test using
	  fork on fork-less platforms.

Thu Sep 15 11:39:18 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/dialog.rb: If a dialog does not show up yet,
	  TkDialogObj#name raises an exception. [ruby-talk:156109]

Thu Sep 15 01:39:19 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/rinda/tuplespace.rb (Rinda::TemplateEntry::initialize): pull
	  up method. Tabs converted to spaces.

Thu Sep 15 00:18:24 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/net/telnet.rb (Net::Telnet::waitfor): replace sysread with
	  readpartial.  [ruby-talk:127641]

Wed Sep 14 22:40:26 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (ruby_glob): glob function not using ruby exception system.

Wed Sep 14 01:26:03 2005  Minero Aoki  <aamine@loveruby.net>

	* lib/net/https.rb: backported from trunk, rev 1.3.
	  [ruby-dev:25673] (again), [ruby-dev:26617] (again),
	  [ruby-dev:27062]

	* ext/openssl/lib/net/https.rb: removed.

	* ext/openssl/lib/net/protocols.rb: removed.

	* lib/net/http.rb: #use_ssl?, #use_ssl are moved from net/https.

Tue Sep 13 22:09:40 2005  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/logger.rb (Logger): added formatter accessor to logger for
	  dictating the way in which the logger should format the messages it
	  displays.  Thanks to Nicholas Seckar (cf. [ruby-talk:153391]) and
	  Daniel Berger.

	* lib/logger.rb (Logger): added VERSION constant.

	* lib/logger.rb: removed document for LogDevice. It is an
	  implementation detail and is not a public interface.

	* test/logger/test_logger.rb: added tests.

Tue Sep 13 21:47:17 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (BEGIN_CALLARGS): pop halfly pushed status.
	  fixed: [ruby-dev:26881]

Tue Sep 13 16:26:45 2005  Minero Aoki  <aamine@loveruby.net>

	* lib/net/http.rb: backported from trunk, rev 1.128.
	  [ruby-dev:25673] [ruby-dev:26617]

	* lib/net/protocol.rb: backported from trunk, rev 1.78.

	* lib/net/protocol.rb: new method #old_open to support net/smtp
	  and net/pop.

	* lib/net/smtp.rb: use #old_open.

	* lib/net/pop.rb: ditto.

Tue Sep 13 12:33:05 2005  why the lucky stiff  <why@ruby-lang.org>

	* lib/yaml.rb: reworking YAML::Stream to use the new
	  emitter.

	* lib/yaml/stream.rb: ditto.

	* lib/yaml/rubytypes.rb: added Object#yaml_new.

	* lib/yaml/tag.rb: the tag_subclasses? method now
	  shows up in the class.  allow taguri to be set using an accessor.
	  continue support of Object#to_yaml_type.

	* ext/syck/rubyext.c: new emitter code.  yaml_new and yaml_initialize
	  get called, should they be present.  consolidated all the diaspora of internal
	  node types into the family below YAML::Syck::Node -- Map,
	  Seq, Scalar -- all of whom are SyckNode structs pointing to
	  Ruby data.  moved Object#yaml_new into the node_import and made it the
	  default behavior.  the target_class is always called wih yaml_new, prepended
	  a parameter, which is the klass.  loaded nodes through GenericResolver show their style.
	  new Resolver#tagurize converts type ids to taguris.

	* ext/syck/implicit.re: were 'y' and 'n' seriously omitted??

	* ext/syck/emitter.c: renovated emitter, walks the tree in advance.
	  consolidated redundant block_styles struct into
	  the scalar_style struct.  (this means loaded nodes can now
	  be sent back to emitter and preserve at least its very basic
	  formatting.)

	* ext/syck/gram.c: headless documents of any kind allowed.

	* ext/syck/node.c: new syck_replace_str methods and syck_empty_*
	  methods for rewriting node contents, while keeping the ID
	  and other setup info.  added syck_seq_assign.

	* ext/syck/syck.h: reflect block_styles and new node functions.

Mon Sep 12 20:53:06 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* test/openssl/test_pkcs7.rb (test_enveloped): skip this test
	  to avoid a bug of PKCS7_enctypt() (only if ext/openssl is
	  compiled with OpenSSL-0.9.7d or earlier versions).
	  http://www.mail-archive.com/openssl-dev@openssl.org/msg17376.html

Mon Sep 12 14:03:33 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* test/dbm/test_dbm.rb: remove locking test, which may not be
	  supported on some platforms.  [ruby-dev:27030]

Mon Sep 12 10:45:58 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/dl/dl.c (rb_io_to_ptr): merged a patch for DragonFly BSD
	  from Takahiro Kambe <taca at back-street.net>.  [ruby-dev:27023]

Sun Sep 11 22:05:51 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* bin/erb (ERB::Main#run): set ERB#filename so that it is used
	  when reporting syntax/runtime errors. Tabs converted to spaces.

Sat Sep 10 10:17:03 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_engine.c (ossl_engine_s_by_id):
	  OpenSSL::Engine.by_id calls given block before calling
	  ENGINE_init (block parameter is the return value of this method
	  itself).  this functionality is useful to load dynamic shared
	  engines. the following code is a sample of loading a key using
	  OpenSC PKCS #11 module.

		require "openssl"
		pkcs11 = OpenSSL::Engine.by_id("dynamic"){|e|
		  e.ctrl_cmd("SO_PATH", "/usr/lib/opensc/engine_pkcs11.so")
		  e.ctrl_cmd("LIST_ADD", "1")
		  e.ctrl_cmd("LOAD")
		}
		pkcs11.ctrl_cmd("PIN", "secret")
		key = pkcs11.load_private_key

	* ext/openssl/ossl_engine.c (ossl_engine_ctrl_cmd): new method
	  OpenSSL::Engine#ctrl_cmd. it wraps ENGINE_ctrl_cmd_string.

	* ext/openssl/ossl_engine.c (ossl_engine_get_cmds): new method
	  OpenSSL::Engine#cmds. it returms engine command definitions.

Sat Sep 10 10:09:47 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_asn1.c (asn1str_to_str): new function.

	* ext/openssl/ossl_pkcs7.c: new class OpenSSL::PKCS7::RecipientInfo.
	  this class wraps PKCS7_RECIP_INFO struct.

	* ext/openssl/ossl_pkcs7.c: OpenSSL::PKCS7::Signer is renamed to
	  OpenSSL::PKCS7::SignerInfo. ("Signer" remains as an alias of
	  SignerInfo.)

	* test/openssl/test_pkcs7.rb: new file.

Sat Sep 10 10:05:51 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_ns_spki.c (ossl_spki_initialize): assume that
	  the argument is a DER string if Base64 decoding failed.

	* ext/openssl/ossl_ns_pki.c (ossl_spki_to_der): new method.

	* test/openssl/test_ns_spki.rb: add new file.

Sat Sep 10 09:56:24 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/lib/digest.rb: added SHA224, SHA256, SHA384 and SHA512.
	  these features are enabled if this library is compiled with
	  OpenSSL 0.9.8 or later.

	* test/openssl/test_digest.rb: add test for new digests.

Sat Sep 10 09:51:30 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl.c (ossl_raise): should use ERR_peek_last_error
	  to get last error on the current thread. And should report
	  errors on the stack while OpenSSL.debug is true.

	* ext/openssl/ossl.c (ossl_get_errors): new method for debugging
	  this library.

	* ext/openssl/ossl_ssl.c (ossl_sslctx_set_ciphers): fix error message.

	* ext/openssl/ossl_x509req.c (ossl_x509req_set_attributes): get rid
	  of unused variable.

	* ext/openssl/ossl_x509store.c (ossl_x509store_initialize): should
	  set @time to avoid warning.

	* ext/openssl/ossl_x509store.c (ossl_x509store_set_default_paths,
	  X509_STORE_add_cert, X509_STORE_add_crl): should raise error if
	  wrapped functions failed.

	* test/openssl/test_x509store.rb: add test for errors.

Fri Sep  9 22:13:19 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_call0): prohibit calling tainted method (>2) when
	  $SAFE == 0.

Fri Sep  9 16:45:25 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_times): make empty strings to keep taintness,
	  and a little improvement.  [ruby-dev:26900]

	* ext/iconv/iconv.c (iconv_try), ext/iconv/extconf.rb: get rid of meta
	  characters in command line option.  fixed: [ruby-talk:155369]

Thu Sep  8 14:58:11 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* merged a patch from Takahiro Kambe <taca at back-street.net> to
	  support DragonFly BSD.  [ruby-dev:26984]

Wed Sep  7 12:55:08 2005  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb: abolish mod === tempfile to avoid a problem
	  [ruby-dev:26967].

Wed Sep  7 10:45:15 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_thread_switch): convert all exceptions to
	  SystemExit.  fixed: [ruby-core:05724]

	* eval.c (rb_thread_terminated): show backtrace before propagate
	  exceptions to main thread.

Wed Sep  7 08:35:04 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* Makefile.in, configure.in (MINIOBJS): miniruby on HP-UX can not load
	  extension libraries.

	* bignum.c (bignew_1, bigadd): K&R style argument actually can't be
	  defined as char.

	* missing/vsnprintf.c: ANSI compiler supports const keyword.

	* ext/digest/sha2/extconf.rb: reject platforms which has inttypes.h
	  but no 64bit integer.

	* lib/mkmf.rb (what_type?): guesstimate type.

	* ext/etc/etc.c (setup_passwd), ext/etc/extconf.rb: pw_age might be
	  char*.  fixed: [ruby-core:05470]

Wed Sep  7 08:32:47 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* object.c (rb_mod_cvar_get, rb_mod_cvar_set): document fix from
	  sheepman <sheepman@sheepman.sakura.ne.jp>; a bug in visibility
	  description.  [ruby-dev:26965]

	* sprintf.c (rb_f_sprintf): warn "too many argument" on verbose
	  mode (-v/-w); backported from 1.9.  [ruby-dev:26963]

Mon Sep  5 17:03:07 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/ostruct.rb: a patch from Florian Gross <florgro at gmail.com>
	  merged to allow recursive inspect (and to_s) for OpenStruct.
	  [ruby-core:05532]

Mon Sep  5 07:01:12 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/openssl/lib/openssl/buffering.rb (Buffering#do_write):
	  should clear data from the buffer which already been output.

Fri Sep  2 23:51:54 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib: do not use __send__ to access private methods.  [ruby-dev:26935]

Fri Sep  2 03:29:00 2005  Keiju Ishitsuka  <keiju@ruby-lang.org>

	* lib/irb/init.rb: make IRB -I option that is same befavior for ruby.
	  [ruby-dev:26872], [ruby-dev: 26920]

	* lib/irb/locale.rb: support to print help message when OS locale is
	  ja_JP.utf-8. [ruby-dev:26872]

Thu Sep  1 17:11:25 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_call0): wrong condition for $SAFE restoration.

Thu Sep  1 14:12:45 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: On Tcl8.5, MultiTkIp#invoke_hidden doesn't
	  work (gives wrong order of arguments).

	* ext/tk/lib/multi-tk.rb: add MultiTkIp#invoke_hidden_on_namespace
	  to support '-namespace' option of 'interp invokehidden' command
	  on Tcl8.5.

Wed Aug 31 14:43:15 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/Makefile.sub (OPTFLAGS): default global optimization to
	  disabled for all VC++ versions.  fixed: [ruby-dev:26897]

Wed Aug 31 11:35:43 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/gdbm/test_gdbm.rb (teardown): should remove GDBM temporary
	  file.

Wed Aug 31 10:30:56 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* process.c (proc_detach, proc_setmaxgroups): missing argument type
	  declaration. (I recommend ANSI-style function)

Tue Aug 30 23:20:19 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_rescue2): initialization miss.  fixed: [ruby-dev:26917]

	* lib/mkmf.rb (xsystem, xpopen): no longer expand by Config.

	* lib/mkmf.rb (link_command, cc_command, cpp_command): expand
	  variables at once, and quote hdrdir.  fixed: [ruby-core:05680]

	* lib/mkmf.rb (libpathflag): quote paths.

Tue Aug 30 19:34:27 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/digest/md5/md5ossl.h, ext/digest/rmd160/rmd160ossl.h,
	  ext/digest/sha1/sha1ossl.h: include <stddef.h> to avoid
	  error in compilation with OpenSSL-0.9.8. [ruby-list:41068]

Mon Aug 29 19:54:21 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* lib/rdoc/usage.rb: improper exceptions. [ruby-dev:26870]

	* lib/rdoc/usage.rb: support the case when non-ruby code exists before
	  shebang. (this is needed when ri.bat is executed on windows)

Mon Aug 29 17:48:17 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (method_arity): should return proper arity value.
	  [ruby-dev:26390]

Mon Aug 29 01:19:57 2005  Tanaka Akira  <akr@m17n.org>

	* lib/time.rb (Time.parse): extract fractional seconds using
	  Date._parse.  [ruby-talk:153859]

Sat Aug 27 20:20:01 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/curses/curses.c ({curses,window}_clrtoeol): added. suggested
	  by Reyn Vlietstra.

	* ext/curses/curses.c: chtype in curses is not `char', rahter `long'.
	  [ruby-Bugs:2298]

	* ext/curses/view.rb: String =~ String is deprecated.

Wed Aug 24 10:53:28 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/logger/test_logger.rb (test_shifting_size): should close log
	  device before unlink, since some platform cannot unlink opened
	  file.

Sun Aug 21 00:13:27 2005  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/wsdl/xmlSchema/importer.rb (WSDL::XMLSchema::Importer#fetch): add
	  a workaround for importing an WSDL whose path begins with drive
	  letter.  [ruby-dev:26242]

Sat Aug 20 22:37:13 2005  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/logger.rb (write, shift_log?, shift_log): file shifting race
	  condition bug fixed.  [ruby-dev:26764]

	* test/logger/test_logger.rb: tests.

Fri Aug 19 18:13:39 2005  Tanaka Akira  <akr@m17n.org>

	* lib/time.rb (Time.apply_offset): fix a problem with last day of
	  month.  reported by Lucas Nussbaum.  [ruby-talk:152866]

Thu Aug 18 12:46:28 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* bcc32/Makefile.sub (COMMON_HEADERS): reverted 1.42.2.24.
	  I misunderstood, bccwin32 on ruby_1_8 uses winsock2 originally.
	  [ruby-dev:26806]

	* win32/win32.h: include winsock2.h instead of winsock.h. (bcc32)

Wed Aug 17 23:58:05 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* object.c (rb_to_integer): argument constified.

	* eval.c (terminate_process): take String message.

	* eval.c (rb_thread_switch): propagate the exception caused thread
	  termination directly.  fixed: [ruby-core:05552]

Wed Aug 17 00:05:46 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_add_method): preserve safe level in the environment
	  where a method is defined .

	* eval.c (rb_call0): restore preserved safe level in the method
	  execution.

Mon Aug 15 00:38:51 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_rescue2): reduce PUSH_TAG() as well as NODE_RESCUE.
	  [ruby-dev:26800]

	* range.c (range_check, range_init): reduce useless exceptions.

Sat Aug 13 18:51:26 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_block_pass): distinguish current block from others.
	  fixed: [ruby-dev:26274]

	* ext/stringio/stringio.c (strio_set_string): disallow nil.
	  http://www.rubyist.net/~nobu/t/20050811.html#c05

Thu Aug 11 23:29:03 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c: keep holding string after closed.

Thu Aug 11 13:01:48 2005  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss: fixed sort bug. [ruby-list:41018]

	* lib/rss/1.0.rb (RSS::RDF::Channel#setup_maker_attributes):
	  removed self.

	* lib/rss/maker/base.rb (RSS::Maker::ItemsBase#<=>): use #date
	  instead of @date.
	  (RSS::Maker::Base::self.def_array_element): added #size.

	* lib/rss/maker/1.0.rb
	  (RSS::Maker::RSS10::Channel#to_rss,
	   RSS::Maker::RSS10::Items::Item#to_rss): cleared dc_dates set
	  upped by using #date.

	* lib/rss/maker/dublincore.rb
	  (RSS::Maker::ChannelBase, RSS::Maker::ItemsBase::ItemBase):
	  fixed opposite alias.

	* test/rss/test_setup_maker_1.0.rb
	  (RSS::TestSetupMaker10::test_setup_maker_items_sort): added some
	  tests for RSS::Maker::ItemsBase#do_sort.

Wed Aug 10 10:29:40 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: fix bug on handling __ruby2val_optkeys().

	* ext/tk/lib/tk/itemconfig.rb: fix bug on handling
	  __item_ruby2val_optkeys().

	* ext/tk/lib/tk/canvas.rb: didn't check __item_ruby2val_optkeys().

	* ext/tk/lib/tkextlib/blt/component.rb: ditto.

Tue Aug  9 15:12:04 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: remove dangerous 'rb_jump_tag's.

	* ext/tk/lib/tk.rb: add __val2ruby_optkeys and __ruby2val_optkeys to
	  help to convert option values between ruby and tcl.

	* ext/tk/lib/tk/itemconfig.rb: add __item_val2ruby_optkeys and
	  __item_ruby2val_optkeys to help to convert option values between
	    ruby and tcl.

	* ext/tk/lib/tk/radiobutton.rb: use __ruby2val_optkeys for 'variable'
	  option (for the reason of backward compatibility).

	* ext/tk/lib/tk/composite.rb: clarify the arguments of super().

	* ext/tk/lib/tk/spinbox.rb: ditto.

	* ext/tk/lib/tk/text.rb: ditto.

	* ext/tk/lib/tk/validation.rb: ditto.

	* ext/tk/lib/tkextlib/*: support to treat tkvariable-type
	  configure options.

Tue Aug  9 20:30:19 2005  Tadashi Saito  <shiba@mail2.accsnet.ne.jp>

	* bignum.c (rb_big_coerce): allow bignum x bignum coercing.
	  [ruby-dev:26778]

Mon Aug  8 20:43:02 2005  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/ruby/test_method.rb: added.  [ruby-dev:26761]

Sun Aug  7 23:50:14 2005  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/ruby/test_super.rb: added from HEAD. [ruby-dev:26743]

Sun Aug  7 01:31:15 2005  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c (WIN32OLE_EVENT#on_event): should set
	  only one event handler.

	* ext/win32ole/tests/testOLEEVENT.rb: ditto.

	* ext/win32ole/tests/testOLEPARAM.rb: remove re-defined
	  test_ole_type_detail method.

Sat Aug  6 12:35:24 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/{tk.rb,tk/itemconfig.rb}: configure creates
	  TkVariable if key name is 'variable' or 'textvariable'
	  by default. [ruby-dev:26749]

	* ext/tk/lib/tk/{label,radiobutton}.rb: removed its own
	  {variable,textvariable} function.

	* ext/tk/lib/tk/variable.rb: retains backward conpatibility.

Fri Aug  5 12:50:32 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/tcltklib/tcltklib.c: fixed memory leak when tk_funcall raised
	  exception. (copies argv into heap in tk_funcall instead of
	  caller)

Fri Aug  5 12:42:57 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* lib/mkmf.rb (create_makefile): need to convert path separetor
	  before invoking install command.

Fri Aug  5 00:27:04 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/tcltklib/tcltklib.c: refactoring - extract ruby string <->
	  tcl object conversion as get_str_from_obj and get_obj_from_str.

Fri Aug  5 00:19:33 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* extmk.rb (extmake): needs to be wrapped in an Array.

Thu Aug  4 18:38:36 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: cannot compile for Tcl7.6/Tk4.2.

	* ext/tcltklib/tcltklib.c: add nativethread consistency check.

	* ext/tcltklib/stubs.c: ditto.

	* ext/tk/lib/tk.rb: forgot to define TclTkIp.encoding and encoding=
	  when Tcl is 7.6 or 8.0.

	* ext/tk/lib/tk/wm.rb: support to make some methods as options of
	  root or toplevel widget. [ruby-talk:150336]

	* ext/tk/lib/tk/root.rb: ditto.

	* ext/tk/lib/tk/toplevel.rb: ditto.

	* ext/tk/lib/tkextlib/SUPPRT_STATUS: update RELEASE_DATE

Thu Aug  4 08:03:39 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb (extmake): should not modify $mflags for each
	  extentions.

Thu Aug  4 00:25:48 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk, Makefile.in, {bcc32,win32,wince}/Makefile.sub: integrated
	  macro definitions.

	* bcc32/Makefile.sub: LIBRUBY_SO should use DLDOBJS, not EXTOBJS.

	* {win32,wince}/Makefile.sub: separate config.h for compiler versions.

Wed Aug  3 21:59:16 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/variable.rb: TkVariable#trace didn't work on
	  TkVariable retrived from TkVariable.new_hash.ref. [ruby-dev:26721]

Wed Aug  3 08:22:13 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/socket/socket.c (ruby_connect): revert [ruby-talk:111654]
	  changes at 2004-09-07.  [ruby-dev:26656]

Tue Aug  2 10:20:54 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/tcltklib/tcltklib.c: use Tcl_[GS]etVar2Ex instead of
	  Tcl_Obj[GS]etVar2. (avoid Tcl_NewStringObj on supported platforms)

	* ext/tcltklib/tcltklib.c: use ip_{get,set,unset}_variable2_core from
	  ip_{get,set,unset}_variable.

	* ext/tcltklib/tcltklib.c: replaced Tcl_Panic with rb_bug.

Tue Aug  2 01:41:28 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/ping.rb (Ping.pingecho): should rescue StandardError.
	  [ruby-dev:26677]

Mon Aug  1 19:09:41 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/tcltklib/tcltklib.c: refactoring - replaced rb_ivar_defined &
	  rb_ivar_get with single rb_attr_get call.

Mon Aug  1 18:45:07 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/tcltklib/tcltklib.c (Tcl_GetStringResult): refactoring - define
	  alternative macro on Tcl7.x or earlier.

Mon Aug  1 13:57:35 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/tcltklib/tcltklib.c (deleted_ip): refactoring - interpreter
	  deletion check. [ruby-dev:26664]

Mon Aug  1 01:17:40 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb (check_insecure_method): use private_methods and
	  protected_methods instead of respond_to? to check method visibility.
	  [ruby-dev:26616]

	* test/drb/drbtest.rb: ditto.

	* test/drb/ut_drb.rb: ditto.

Mon Aug  1 00:07:32 2005  Keiju Ishitsuka  <keiju@ruby-lang.org>

	* lib/irb/context.rb: fix `irb --readline` option. [ruby-list:40955]

Fri Jul 29 09:59:38 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_yield_0): push yielded node instead of yielding.
	  fixed: [yarv-dev:549]

Thu Jul 28 18:09:55 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/stubs.c: When --enable-tcltk-stubs, the initialize
	  routine creates a Tcl/Tk interpreter and deletes it. However,
	  init cost of Tk's MainWindow is not so small. And that makes it
	  impossible to use libraries written with Tcl functions only on
	  an environment without a graphical display. This changes support
	  delaying initalization of Tk_Stubs until the script needs Tk.

	* ext/tcltklib/stubs.h: New file. Define prototypes and return
	  codes of functions on stubs.c.

	* ext/tcltklib/tcltklib.c: Support delaying initalization of
	  Tk_Stubs until the script needs Tk.

	* ext/tcltklib/tcltklib.c: Show friendly error messages for errors
	  on initialization.

	* ext/tcltklib/tcltklib.c: Avoid SEGV on ip_finalize() when ruby is
	  exiting and $DEBUG is true. (Not fix. If you know the reason of
	  why, please fix it.)

	* ext/tk/tkutil.c (ary2list, ary2list2): bug fix on handling of
	  encoding.

	* ext/tk/lib/multi-tk.rb: MultiTkIp#eval_string and bg_eval_string
	  don't work propery.

	* ext/tk/lib/tk.rb: Forget extending Tk::Encoding module to Tk.
	* ext/tk/lib/tk/variable.rb: TkVarAccess fails to initialize the
	  object for an element of a Tcl's array variable.

Wed Jul 27 23:23:54 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* gc.c (obj_free): make message format consistent with one from
	  gc_mark().  [ruby-talk:149668]

Wed Jul 27 22:11:37 2005  Kouhei Sutou  <kou@cozmixng.org>

	* sample/rss/tdiary_plugin: removed. because the plugin
	  is imported in the tDiary plugin packages.

Wed Jul 27 10:59:02 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* dir.c (dir_each): rewinddir(3) before iteration.
	  [ruby-talk:149628]

Tue Jul 26 12:57:49 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/openssl_missin.c: include <openssl/engine.h> before
	  <openssl/x509_vfy.h> to avoid compilation error of mswin32.
	  suggested by NAKAMURA Usaku.

Mon Jul 25 21:30:46 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* {bcc32,win32,wince}/Makefile.sub: moved CPPFLAGS only for ruby
	  source to XCFLAGS.

Mon Jul 25 13:45:18 2005  NAJIMA Hiroki  <najima@mickey.ai.kyutech.ac.jp>

	* io.c: check HAVE_SYS_IOCTL_H before including the header.
	  [ruby-dev:26610]

Mon Jul 25 14:10:02 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: fix en-bugged part in the last commit.

Sat Jul 23 16:49:04 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_engine.c (ossl_engine_s_load): should check
	  OPENSSL_NO_STATIC_ENGINE.

Fri Jul 22 21:06:08 2005  Tadashi Saito  <shiba@mail2.accsnet.ne.jp>

	* bignum.c (rb_big_eq): reduce isnan().  [ruby-dev:26600]

	* numeric.c (flo_eq, flo_gt, flo_ge, flo_lt, flo_le): ditto.

Fri Jul 22 15:02:39 2005  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb: moved copyright description to lib/rss.rb.

	* lib/rss.rb: added for convenience.

	* sample/rss/re_read.rb: added #to_s sample.

	* sample/rss/blend.rb: use 'require "rss"' instead of
	  'require "rss/*"'.
	* sample/rss/list_description.rb: ditto.
	* sample/rss/rss_recent.rb: ditto.
	* sample/rss/tdiary-plugin/rss-recent.rb: ditto.

	* sample/rss/tdiary-plugin/rss-recent.rb: 0.0.6 -> 0.0.7.

Fri Jul 22 14:37:43 2005  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/parser.rb (RSS::Parser#initialize): accept HTTP/FTP
	  URI and local file path too.

	* test/rss/test_parser.rb (RSS::TestParser#test_parse): test
	  for the above.

Fri Jul 22 07:01:42 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tkutil.c (tk_conv_args): forget to revert thread_critical
	  and gc_disable when raise ArgumentError.

	* ext/tk/lib/remote-tk.rb: RemoteTkIp doesn't need to include TkUtil.

	* ext/tcltklib/tcltklib.c: add TclTkIp#has_mainwindow? method.

	* ext/tk/lib/tk.rb: add Tk.has_mainwindow? method.

	* ext/tk/lib/multi-tk.rb: add MultiTkIp#has_mainwindow? method.

	* ext/tk/lib/remote-tk.rb: add RemoteTkIp#has_mainwindow? method.

	* ext/tk/lib/multi-tk.rb: slave IP fail to exit itself when $SAFE==4.

	* ext/tk/lib/multi-tk.rb: remove constants from MultiTkIp module to
	  avoid access from external.

	* ext/tk/lib/multi-tk.rb: check_root flag is ignored on slave IPs'
	  mainloop.

	* ext/tk/lib/multi-tk.rb: hang-up Tk.mainloop called on a slave IP
	  with $SAFE==4.

	* ext/tk/lib/multi-tk.rb: MultiTkIp#bg_eval_proc doesn't work
	  properly.

	* ext/tk/lib/multi-tk.rb: add MultiTkIp#set_cb_error(proc) and
	  cb_error(exc) to log errors at callbacks on safe slave IPs.

	* ext/tk/lib/multi-tk.rb: fail to get an available slave IP object
	  when call Tk.mainloop in the block which is given to new_* method,
	    because cannot finish initialize while the root widget is alive.

	* ext/tk/lib/multi-tk.rb: fail to control a slave IP when Tk.mainloop
	  runs on the IP.

Wed Jul 20 19:20:37 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* io.c (S_ISREG): need to define S_ISREG before it is used first.

Wed Jul 20 18:40:50 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* io.c (wsplit_p): patch for the environment where
	  fcntl(F_GETFL, O_NONBLOCK) is not supported. in that case,
	  set FMODE_WSPLIT without fcntl check. [ruby-dev:26566]

Wed Jul 20 18:07:11 2005  Tanaka Akira  <akr@m17n.org>

	* io.c (rb_io_ctl): update FMODE_WSPLIT_INITIALIZED and FMODE_WSPLIT
	  by F_SETFL.

Wed Jul 20 10:04:51 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* variable.c (rb_class_path): need to adjust snprintf() len for
	  teminating NUL.  [ruby-dev:26581]

Wed Jul 20 04:01:55 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/socket/socket.c: sorry, BeOS also uses HAVE_CLOSESOCKET,
	  so reverted.

	* ext/socket/extconf.rb: should not define HAVE_CLOSESOCKET
	  on windows.

Wed Jul 20 03:16:43 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/socket/socket.c: should not undef close() on win32.
	  it's defined to rb_w32_close(), otherwise handle leaks.
	  [ruby-Bugs-2131]

Wed Jul 20 00:48:16 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* error.c (syserr_initialize): don't use str before StringValue()
	  check.  [ruby-dev:26579]

Tue Jul 19 22:47:29 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* error.c (syserr_initialize): add 1 byte for snprintf() size for
	  NUL at the end.  [ruby-dev:26574]

Tue Jul 19 16:39:46 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (rb_io_inspect): replace sprintf() with "%s" format all
	  over the place by snprintf() to avoid integer overflow.

Tue Jul 19 14:08:22 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/tcltklib/tcltklib.c: rbtk_eventloop_depth is used as int.

	* ext/tcltklib/tcltklib.c: rbtk_pending_exception is tested with
	  NIL_P, so should assign Qnil instead of 0 (Qfalse).

	* ext/tcltklib/tcltklib.c (ip_invoke_real): fixed memory leak when
	  ip is deleted.

Tue Jul 19 13:19:46 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/variable.rb: For symmetry, add TkVariable#string. It
	  returns a string even if the default value type of the TkVariable
	  object is not "string".

Mon Jul 18 21:40:20 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* eval.c (rb_call0): make the pointer to NODE volatile
	  instead of NODE itself.

Mon Jul 18 14:32:21 2005  Tanaka Akira  <akr@m17n.org>

	* eval.c (rb_call0): make body volatile to avoid optimization problem.
	  [ruby-dev:26195]

Mon Jul 18 12:23:27 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/io/wait/wait.c: wrong backport from trunk.  fixed: [ruby-dev:26562]

Mon Jul 18 09:36:25 2005  Tanaka Akira  <akr@m17n.org>

	* rubyio.h (FMODE_WSPLIT, FMODE_WSPLIT_INITIALIZED): new constant.

	* io.c (wsplit_p): new function.
	  (io_fwrite): split writing data by PIPE_BUF if wsplit_p is true in
	  multi-threaded mode.
	  [ruby-dev:26540]

Sun Jul 17 13:46:54 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/io/wait/extconf.rb, ext/io/wait/wait.c: Win32 platforms support.

Fri Jul 15 23:59:03 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/rdoc/parsers/parse_c.rb (handle_class_module): handle a
	  module enclosed in a built-in module.  fixed: [ruby-talk:148239]

	* lib/rdoc/parsers/parse_c.rb (find_body): allow macros as methods.

	* lib/rdoc/parsers/parse_c.rb (find_call_seq): allow :nodoc: modifier
	  in C.  [ruby-core:04572]

Fri Jul 15 18:00:01 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* bcc32/Makefile.sub (COMMON_HEADERS): ruby_1_8 is using winsock.h.
	  failed to compile ext/socket on bcc5.6.4. [ruby-dev:26193]

Fri Jul 15 07:58:56 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/server.rb (WEBrick::GenericServer#accept_client):
	  sockets should be non-blocking mode. [ruby-dev:26405]

	* lib/webrick/utils.rb (WEBrick::Utils.set_non_blocking): new method.

	* lib/webrick/httprequest.rb (WEBrick::HTTPRequest#read_chunked):
	  should call sock.read repeatedly until the preferred size data
	  is obtained.

Thu Jul 14 18:27:16 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* win32/win32.c (rb_w32_strerror): should return correct message
	  for ENAMETOOLONG and ENOTEMPTY. (bcc32) [ruby-dev:26533]

	* win32/win32.c (rb_w32_strerror): stripped CR LF on the tail.
	  (bcc32) [ruby-dev:26533]

Thu Jul 14 00:45:42 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* LEGAL (ext/nkf/nkf-utf8): updated from nkf1.7 to nkf-utf8.

Wed Jul 13 19:37:47 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* win32/win32.c (rb_w32_mkdir): should set EEXIST (not EACCES)
	  if file or directory already exists. (bcc32) [ruby-dev:26508]

	* win32/win32.c (rb_w32_rmdir): should set ENOTDIR (not EINVAL)
	  if it is not directory. (bcc32, win32)

	* win32/win32.c (rb_w32_rmdir, rb_w32_unlink): restore
	  FILE_ATTRIBUTE_READONLY flag on function failure.

Wed Jul 13 12:40:00 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: TclTkLib.do_one_event doesn't work.

	* ext/tk/lib/tk.rb: Tk.thread_update is available.

Tue Jul 12 23:32:11 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb: keep curdir unexpanded.

Mon Jul 11 08:31:29 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* regex.c (read_special): fix parsing backslashes following \c in
	  regexp.  fixed: [ruby-dev:26500]

Mon Jul 11 02:53:00 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/cgi.rb (WEBrick::CGI::Socket#request_line):
	  mistook in merging the patch of [ruby-dev:26235] at
	  revision 1.4.2.6.

Sun Jul 10 23:58:04 2005  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb (Pathname#unlink): try Dir.unlink first to
	  avoid unlink a directory by root.
	  cf. [ruby-dev:26237]

Sun Jul 11 05:18:17 2005  Michael Neumann  <mneumann@ruby-lang.org>

	* lib/xmlrpc/server.rb (XMLRPC::Server): Switch from GServer over to
	  WEBrick. This makes file lib/xmlrpc/httpserver.rb obsolete (at least it is
		no further used by the XML-RPC library).

Sun Jul 10 12:47:01 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/debug.rb (debug_command): added a deficient format specifier.
	  fixed: [ruby-core:05419]

Sat Jul  9 21:28:46 2005  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c (ole_method_dispid): convert dispid
	  in Ruby and C by INT2NUM and NUM2INT.

	* ext/win32ole/win32ole.c (ole_invoke2): ditto.

	* ext/win32ole/test/testWIN32OLE.rb: ditto.

	* ext/win32ole/test/testOLEMETHOD.rb: ditto.

Fri Jul  8 15:45:04 2005  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb (RSS::VERSION): 0.1.4 -> 0.1.5.

	* test/rss/test_version.rb (RSS::TestVersion#test_version):
	  ditto.

	* lib/rss/0.9.rb (RSS::Rss::Channel::Item::Category):
	  domain attribute of <category> is optional. Thanks to
	  Chris Lee <clee@kde.org>.

	* test/rss/test_parser.rb (RSS::TestParser#test_category20):
	  adjusted test case.

Tue Jul  5 23:44:06 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* instruby.rb: expand source library path.

Tue Jul  5 23:27:14 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (sort_2): get rid of yet another bcc's bug.
	  fixed: [ruby-core:05152]

	* eval.c (rb_thread_save_context): must not switch contexts during
	  re-allocating stack.  fixed: [ruby-core:05219]

Tue Jul  5 15:15:10 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tkutil.c: fix typo.

Tue Jul  5 14:51:35 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: bug fix on treating Unicode strings.

	* ext/tcltklib/tcltklib.c: add methods to treat encoding mode.

	* ext/tcltklib/MANUAL.eng: add description of TclTkLib#encoding,
	  encoding_system, and so on.

	* ext/tcltklib/MANUAL.euc: ditto.

	* ext/tk/tkutil.c: fail to create a Tcl's list string from an
	  array including multiple kind of encoded strings.

	* ext/tk/lib/tk.rb: ditto.

	* ext/tk/lib/multi-tk.rb: 2nd arg of _{to|from}UTF8 is omissible.

	* ext/tk/lib/remote-tk.rb: ditto.

	* ext/tk/lib/tk.rb: override TclTkLib#encoding and encoding= to
	  use TkCore::INTERP.encoding and encoding=.

	* ext/tk/lib/tk.rb: when "require 'tk'" and $KCODE=='NONE', check
	  DEFAULT_TK_ENCODING to decide Ruby/Tk's system encoding mode.

	* ext/tk/lib/tk/encodedstr.rb: check both of Tk.encoding and
	  Tk.encoding_system. Tk.encoding has higher priority.

	* ext/tk/lib/tk/optiondb.rb: ditto.

	* ext/tk/lib/tk/spinbox.rb: ditto.

	* ext/tk/lib/tk/validation.rb: ditto.

	* ext/tk/lib/tk/namespace.rb: arguemnts for TclTkIp#_merge_tklist
	  should be UTF-8 strings.

Mon Jul  4 14:35:52 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* sample/svr.rb: service can be stopped by ill-behaved client; use
	  tsvr.rb instead.

Mon Jul  4 13:25:21 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* missing/erf.c: original erf.c by prof. Okumura is confirmed to
	  be public domain.  reverted BSD implementation.

Mon Jul  4 11:15:37 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/{dbm,gdbm,sdbm}/test_{dbm,gdbm,sdbm}.rb: skip some tests
	  which using fork on fork-less platforms.

Sun Jul  3 23:26:30 2005  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/wsdl/document/test_rpc.rb: compare formatted time string of
	  Time objects instead of comparing Time objects itself to avoid
	  unintended conflict of usec part.  [ruby-dev:26220]

Sat Jul  2 22:41:04 2005  Tanaka Akira  <akr@m17n.org>

	* ext/socket/socket.c (unix_send_io, unix_recv_io): support x86-64 and
	  IA64.

Sat Jul  2 17:06:23 2005  Tanaka Akira  <akr@m17n.org>

	* defines.h (FLUSH_REGISTER_WINDOWS): defined for IA64.
	  (flush_register_windows): declare flush_register_windows.

	* eval.c (flush_register_windows): new function.

Fri Jul  1 17:48:52 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* bignum.c (get2comp): revert all prior changes, and calculate
	  proper 2's complement for negative numbers.  backported from
	  HEAD.

Fri Jul  1 15:50:12 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* missing/erf.c: need to include some headers for some platforms.

	* win32/win32.h (copysign, scalb): define for compatibility with
	  other platforms. [ruby-dev:26430]

Fri Jul  1 15:37:42 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* missing/crypt.c: modified to make it compilable on platforms
	  other than BSD.  [ruby-dev:26430]

	* missing/erf.c: ditto.  code from <exp.c> merged.

Fri Jul  1 12:44:56 2005  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb (OpenURI.open_http): refine post_connection_check
	  call.

Fri Jul  1 11:34:08 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* missing/crypt.c: replaced with 4.4BSD version.

	* missing/erf.c: ditto.

	* missing/vsnprintf.c: removed the third provision from the old
	  BSD license.  [ruby-core:05177]

Fri Jul  1 01:45:21 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enum.c (enum_min, enum_max): must not return Qundef.
	  fixed: [ruby-core:05299]

Fri Jul  1 00:18:40 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/delegate.rb (Delegator::respond_to): respond_to? must check
	  destination object.  [ruby-talk:146894]

Thu Jun 30 19:00:21 2005  Keiju Ishitsuka  <keiju@ruby-lang.org>

	* lib/irb/ruby-lex.rb (RubyLex::identify_number): alternative implements
	  for [ruby-dev:26410]. And support a numeric form of 0d99999.

Thu Jun 30 17:28:10 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/irb/ruby-lex.rb (RubyLex::identify_number): should not treat
	  plain zero as an octal number.  [ruby-dev:26410]

Thu Jun 30 15:13:16 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_eval): pre-evaluate argument for unambiguous
	  evaluation order.  [ruby-dev:26383]

Thu Jun 30 09:53:56 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/delegate.rb (Delegator::method_missing): forward unknown
	  method to the destination.  suggested by
	  <christophe.poucet@gmail.com>.  [ruby-talk:146776]

Tue Jun 28 21:59:29 2005  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* dir.c, eval.c, hash.c, process.c, ruby.c: avoid warning "unused
	  variable" [ruby-dev:26387]

Sat Jun 25 17:15:23 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httputils.rb (WEBrick::HTTPUtils.parse_query): should
	  discard if key=val pair is empty. patch from Gary Wright.

Sat Jun 25 23:30:51 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* process.c (detach_process_watcher): terminate process watcher
	  thread right after rb_waitpid() succeed.  [ruby-talk:146430]

Sat Jun 25 15:49:18 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enum.c (enum_min, enum_max): do not ignore nil as the first element.

Sat Jun 25 14:40:17 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/sdbm/init.c (fsdbm_select): SDBM#select had returned the array
	  which contained each elements twice. [ruby-dev:26358]

Fri Jun 25 05:06:47 2005  Michael Neumann  <mneumann@ruby-lang.org>

	* lib/xmlrpc/*, test/xmlrpc/*: backported changes from HEAD into 1.8

Fri Jun 24 17:00:00 2005  Shigeo Kobayashi  <shigeo@tinyforest.jp>

	* ext/bigdecimal/bigdecimal.c: patch from "NATORI Shin"
	  (u-tokyo.ac.jp) applied to fix rounding bug.

Fri Jun 24 13:06:45 2005  akira yamada  <akira@ruby-lang.org>

	* lib/uri/common.rb, lib/uri/generic.rb: fixed typo in documents and
	  replaced some existent domain name with "example.com".

Fri Jun 24 12:23:19 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: fix typo on Tk.grid_propagate.

	* ext/tk/lib/tk.rb: Tk.event_generate and TkWindow#event_generate
	  accept TkEvent::Event object as context argument.

	* ext/tk/lib/tk/event.rb: add TkEvent::Event#valid_fields and
	  valid_for_generate to get field parameters of event_generate.

Thu Jun 23 23:55:59 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* runruby.rb: should load built rbconfig.rb.

Thu Jun 23 16:53:15 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/canvastag.rb: TkcGroup.new cannot include given items.
	  TkcGroup#exclude calls wrong method.
	  Add alias TkcGroup#add [ruby-talk:146049].

	* ext/tk/lib/tk/canvas.rb: TkCanvas#dtag and some subcommands of
	  TkCanvas#addtag fail to treat a TkcTag argument.

	* ext/tk/lib/tk/event.rb: add TkEvent::Event#generate to help to send
	  current event to other widgets.

Mon Jun 20 18:44:04 2005  Tanaka Akira  <akr@m17n.org>

	* eval.c (FUNCTION_CALL_MAY_RETURN_TWICE): DUMMY_SETJMP is replaced
	  because setjmp is not enough to fix getcontext and SPARC register
	  window problem.

Mon Jun 20 16:48:36 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/dbm/dbm.c (fdbm_closed): new method DBM#closed?

	* ext/gdbm/gdbm.c (fgdbm_closed): new method GDBM#closed?

	* ext/sdbm/init.c (fsdbm_closed): new method SDBM#closed?

	* test/dbm/test_dbm.rb, test/gdbm/test_gdbm.rb, test/sdbm/test_sdbm.rb
	  (teardown): close all db objects before deleting data files.

	* win32/win32.{ch} (unlink): hook runtime function to change
	  file attribute before unlinking.
	  fixed: [ruby-dev:26360]

Mon Jun 20 02:15:35 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (define_final): document fix: finalizers never get called
	  before target object is destroyed.

Mon Jun 20 01:26:49 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/openssl_missing.c, ext/openssl/ossl.h,
	  ext/openssl/ossl_asn1.c, ext/openssl/ossl_bio.c,
	  ext/openssl/ossl_pkcs12.h, ext/openssl/ossl_x509req.c: avoid
	  compiler warnings. suggested by Michal Rokos.

Sun Jun 19 14:09:07 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (run_final): reduce unnecessary object allocation during
	  finalization.

	* gc.c (rb_gc_call_finalizer_at_exit): deferred finalizers list should
	  be cleared before calling them.  fixed: [ruby-talk:145790]

Fri Jun 17 13:01:40 2005  Tanaka Akira  <akr@m17n.org>

	* lib/time.rb (Time.parse): fix previous leap seconds support.
	  (Time.rfc2822): ditto.
	  (Time.xmlschema): ditto.

Thu Jun 16 15:06:55 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/tcltklib/tcltklib.c (ip_rb_threadVwaitCommand): Tcl_Release
	  was missing.

Thu Jun 16 13:34:48 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: add Tk.getMultiple{Open|Save}File() which return
	  an Array of selected files.

Thu Jun 16 12:53:24 2005  Tanaka Akira  <akr@m17n.org>

	* lib/time.rb (Time.parse): "Fri Jan  1 08:59:60 +0900 1999" was
	  parsed as "Fri Jan 01 09:00:00 JST 1999" even on an environment
	  which supports leap seconds.
	  (Time.rfc2822): ditto.
	  (Time.xmlschema): ditto.

Thu Jun 16 08:29:22 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/dl/sym.c (rb_dlsym_call): needs FREE_ARGS before return.
	  fixed memory leak. [ruby-Bugs-2034]

Wed Jun 15 18:26:39 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: support "tk inactive" sub-command [for Tcl/Tk8.5a3]

	* ext/tk/lib/tk/namespace.rb: support "namespace path" sub-command and
	  'namespace ensemble' sub-command [for Tcl/Tk8.5a3]

Tue Jun 14 02:02:43 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tkutil.c: add TkUtil::CallbackSubst.subst_arg(m, ...) &
	  _define_attribute_aliases(hash) to get substitution-argument from
	  attributes (e.g. subst_arg(:x,:y,:num,:button) --> "%x %y %b %b ").

	* ext/tk/lib/tk/event.rb: use _define_attribute_aliases().

Mon Jun 13 13:01:05 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* hash.c (ruby_setenv): fixed SEGV. [ruby-dev:26186]

Mon Jun 13 01:54:20 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* signal.c (sigexit): call rb_thread_signal_exit() instead of
	  rb_exit().  [ruby-dev:26347]

	* eval.c (rb_thread_signal_exit): a new function to exit on main
	  thread.

	* eval.c (rb_thread_switch): exit status should be retrieved from
	  ruby_errinfo.

	* eval.c (rb_f_exit): ensure exit(0) should call
	  exit(EXIT_SUCCESS).

Mon Jun 13 01:20:02 2005  Tanaka Akira  <akr@m17n.org>

	* eval.c (rb_gc_mark_threads): curr_thread may not be part of the
	  thread list.  [ruby-dev:26312]

Fri Jun 10 23:35:34 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* missing/mkdir.c: remove. [ruby-core:05177]

Fri Jun 10 22:54:26 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* missing.h: fd_set stuffs need sys/types.h.  fixed: [ruby-core:05179]

Thu Jun  9 23:58:12 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/Win32API/Win32API.c (Win32API_Call): disable global
	  optimization. fixed: [ruby-core:05143]

Thu Jun  9 23:35:22 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enum.c (enum_inject): default the result value to Qundef to use
	  first element as initial value if not given.

Thu Jun  9 19:55:41 2005  Tanaka Akira  <akr@m17n.org>

	* eval.c (ruby_longjmp): new macro to call longjmp, setcontext, etc.
	  (ruby_setjmp): new macro to call setjmp, getcontext, etc.
	  (ruby_setjmp): call setjmp before getcontext to avoid IA64 register
	  stack problem.
	  [ruby-talk:144939]

	* gc.c (Init_stack): remove IA64_MAGIC_STACK_LIMIT.

Thu Jun  9 11:55:34 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/delegate.rb (SimpleDelegator::__setobj__): need check for
	  recursive delegation.  [ruby-core:04940]

Wed Jun  8 18:47:10 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* misc/ruby-mode.el (ruby-expr-beg): fix looking point drift.

Wed Jun  8 11:11:34 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* bignum.c (get2comp): calculate proper 2's complement for
	  negative numbers.  a bug in normalizing negative numbers
	  reported from Honda Hiroki <hhonda@ipflex.com>.

Wed Jun  8 08:33:10 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enum.c (enum_min_by, enum_max_by): return nil if no iteration.
	  fixed: [ruby-dev:26245]

	* eval.c (rb_need_block): ensure a block is given.

	* eval.c (backtrace): skip successive frames sharing same node.

Wed Jun  8 00:15:08 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/socket/socket.c (ruby_getaddrinfo__aix): merged a patch from
	  KUBO Takehiro <kubo at jiubao.org> to support AIX.  [ruby-list:40832]

Wed Jun  8 00:09:01 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/yaml/rubytypes.rb (Array::to_yaml): merged a patch from
	  Tilman Sauerbeck <tilman at code-monkey.de>.  [ruby-core:05055]

	* lib/yaml/rubytypes.rb (Hash::to_yaml): ditto.

Wed Jun  8 00:00:01 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/curses/curses.c (curses_insertln): merged a patch from
	  TAKAHASHI Tamotsu <ttakah at lapis.plala.or.jp>.  [ruby-ext:02305]

Tue Jun  7 19:34:15 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/irb/init.rb (IRB::IRB.rc_file_generators): more flexible
	  IRB.rc_file_generators.  [ruby-core:05163]

Tue Jun  7 18:39:31 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/thread.rb: RDoc documentation from Eric Hodel
	  <drbrain at segment7.net> added.  [ruby-core:05148]

Tue Jun  7 18:30:04 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (create_makefile): add .SUFFIXES from depend file.
	  fixed: [ruby-dev:26294]

Tue Jun  7 17:39:54 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* object.c (rb_mod_cvar_get): Module#class_variable_get(): back
	  ported from CVS HEAD.  [ruby-talk:144741]

	* object.c (rb_mod_cvar_set): Module#class_variable_set().
	  [ruby-talk:144741]

Tue Jun  7 16:32:53 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* sprintf.c (rb_f_sprintf): raise exception on debug mode (-d),
	  not verbose mode (-v/-w).  [ruby-core:05123]

Tue Jun  7 10:30:49 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: slave-ip fails to call procedures
	  delegated by master-ip.

Sun Jun  5 23:00:35 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/console.rb: create console when required

	* ext/tk/sample/tkextlib/tile/demo.rb: fix TypeError & create Console

Sat Jun  4 14:55:18 2005  Tanaka Akira  <akr@m17n.org>

	* test/dbm/test_dbm.rb: merged from ext/dbm/testdbm.rb.

	* test/gdbm/test_gdbm.rb: merged from ext/gdbm/testgdbm.rb.

	* test/sdbm/test_sdbm.rb: renamed from ext/sdbm/testsdbm.rb with
	  modification to use test/unit.

Fri Jun  3 14:06:12 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: fix typo.

Wed Jun  1 11:32:42 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* bcc32/Makefile.sub: can use single quote character in DESTDIR.
	  [ruby-dev:26205]

Mon May 30 23:48:29 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/macpkg.rb: add PACKAGE_NAME information of Tcl/Tk
	  Extension.

	* ext/tk/lib/tk/msgcat.rb: ditto.

	* ext/tk/lib/tk/winpkg.rb: ditto.

	* ext/tk/lib/tkextlib/*: ditto.

Sat May 28 16:40:15 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* test/openssl/test_x509store.rb: add test for expired CRL
	  and refine some assertions.

Sat May 28 05:15:51 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_x509store.c (ossl_x509stctx_set_time): should
	  not set internal flag directry.

Sat May 28 02:00:11 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/cgi.rb (WEBrick::CGI::Socket#request_line):
	  ENV["REQUEST_URI"] is better to get correct Request-URI
	  than ENV["SCRIPT_NAME"] + ENV["PATH_INFO"].  [ruby-dev:26235]

Fri May 27 16:32:04 2005  WATANABE Hirofumi  <eban@ruby-lang.org>

	* lib/mkmf.rb: use the semicolon as the path separator
	  in the environment of MSYS.  fixed: [ruby-dev:26232]

Thu May 26 06:08:11 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: add shortcut-methods of tk_call + tk_split_list

Wed May 25 22:52:42 2005  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/irb/input-method.rb: do not use Readline::HISTORY.pop.
	  (backported from HEAD)

Wed May 25 21:55:40 2005  Shugo Maeda  <shugo@ruby-lang.org>

	* ext/readline/readline.c: supported libedit. (backported from HEAD)

	* ext/readline/extconf.rb: ditto.

	* test/readline/test_readline.rb: ditto.

Wed May 25 20:06:27 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: TkComm#tk_split_*list fail to split a kind of SJIS
	  strings. To avoid the trouble, add arguments to control converting
	  encoding, and do split on a UTF8 string.

	* ext/tk/lib/multi-tk.rb: modify to attend encoding.

	* ext/tk/lib/remote-tk.rb: ditto.

	* ext/tk/lib/tk/itemconfig.rb: ditto.

	* ext/tk/lib/tk/listbox.rb: ditto.

	* ext/tk/lib/tk/namespace.rb: ditto.

	* ext/tk/lib/tk/panedwindow.rb: ditto.

	* ext/tk/lib/tk/text.rb: ditto.

	* ext/tk/lib/tk/textmark.rb: ditto.

	* ext/tk/lib/tk/texttag.rb: ditto.

	* ext/tk/lib/tk/variable.rb: ditto.

	* ext/tk/lib/tk/winfo.rb: ditto.

	* ext/tk/lib/tkextlib/iwidgets/scrolledlistbox.rb: ditto.

	* ext/tk/lib/tkextlib/iwidgets/scrolledtext.rb: ditto.

	* ext/tk/lib/tk.rb: add TkWindow#lower_window/raise_window and
	  Tk#lower_window/raise_window by reason of method-name conflict

	* ext/tk/lib/tk/canvas.rb: bug fix on TkCanvas#delete when given
	  non-TkcItem arguments.

	* ext/tk/lib/tkextlib/iwidgets/scrolledcanvas.rb: ditto.

Wed May 25 12:59:48 2005  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb (OpenURI::Meta::RE_QUOTED_STRING): a content of
	  quoted-string should be zero or more characters.

Tue May 24 23:42:16 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* numeric.c (fix_pow): support Fixnum ** Float case directly
	  without coercing.  [ruby-talk:142697] [ruby-talk:143054]

Tue May 24 16:57:24 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ruby.c (require_libraries): caused SEGV when continuation jumped
	  in to the required library code.

Tue May 24 11:56:25 2005  WATANABE Hirofumi  <eban@ruby-lang.org>

	* lib/getopts.rb: should warn only if verbose mode.
	  fixed: [ruby-dev:26201]

Tue May 24 06:45:31 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* misc/ruby-mode.el (ruby-font-lock-syntactic-keywords): string
	  literals to be matched non-greedy.

Tue May 24 00:34:32 2005  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/soap/calc: method name 'set' was able to crash with a class Set.
	  [ruby-dev:26210]

	* test/wsdl/document/test_rpc.rb: dateTime comparison failed under
	  TZ=right/Asia/Tokyo (with leap second.) [ruby-dev:26208]

Mon May 23 16:24:05 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/extconf.rb: Framework support on MacOS X Tiger.

	* ext/tcltklib/README.1st: add description of Framework support options.

Mon May 23 12:21:37 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* re.c (make_regexp): should not return junk address during
	  compile time.  [ruby-dev:26206]

Sun May 22 21:54:06 2005  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/{soap,wsdl,xsd}, test/{soap,wsdl,xsd}: imported soap4r/1.5.4.

	  == SOAP client and server ==

	  === for both client side and server side ===

	  * improved document/literal service support.
	    style(rpc,document)/use(encoding, literal) combination are all
	    supported.  for the detail about combination, see
	    test/soap/test_style.rb.

	  * let WSDLEncodedRegistry#soap2obj map SOAP/OM to Ruby according to
	    WSDL as well as obj2soap.  closes #70.

	  * let SOAP::Mapping::Object handle XML attribute for doc/lit service.
	    you can set/get XML attribute via accessor methods which as a name
	    'xmlattr_' prefixed (<foo name="bar"/> -> Foo#xmlattr_name).

	  === client side ===

	  * WSDLDriver capitalized name operation bug fixed.  from
	    1.5.3-ruby1.8.2, operation which has capitalized name (such as
	    KeywordSearchRequest in AWS) is defined as a method having
	    uncapitalized name. (converted with GenSupport.safemethodname
	    to handle operation name 'foo-bar').  it introduced serious
	    incompatibility; in the past, it was defined as a capitalized.
	    define capitalized method as well under that circumstance.

	  * added new factory interface 'WSDLDriverFactory#create_rpc_driver'
	    to create RPC::Driver, not WSDLDriver (RPC::Driver and WSDLDriver
	    are merged).  'WSDLDriverFactory#create_driver' still creates
	    WSDLDriver for compatibility but it warns that the method is
	    deprecated.  please use create_rpc_driver instead of create_driver.

	  * allow to use an URI object as an endpoint_url even with net/http,
	    not http-access2.

	  === server side ===

	  * added mod_ruby support to SOAP::CGIStub.  rename a CGI script
	    server.cgi to server.rb and let mod_ruby's RubyHandler handles the
	    script.  CGIStub detects if it's running under mod_ruby environment
	    or not.

	  * added fcgi support to SOAP::CGIStub.  see the sample at
	    sample/soap/calc/server.fcgi.  (almost same as server.cgi but has
	    fcgi handler at the bottom.)

	  * allow to return a SOAPFault object to respond customized SOAP fault.

	  * added the interface 'generate_explicit_type' for server side
	    (CGIStub, HTTPServer).  call 'self.generate_explicit_type = true'
	    if you want to return simplified XML even if it's rpc/encoded
	    service.

	  == WSDL ==

	  === WSDL definition ===

	  * improved XML Schema support such as extension, restriction,
	    simpleType, complexType + simpleContent, ref, length, import,
	    include.

	  * reduced "unknown element/attribute" warnings (warn only 1 time for
	    each QName).

	  * importing XSD file at schemaLocation with xsd:import.

	  === code generation from WSDL ===

	  * generator crashed when there's '-' in defined element/attribute
	    name.

	  * added ApacheMap WSDL definition.

	* sample/{soap,wsdl}: removed.

Sun May 22 19:11:35 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/lib/openssl/ssl.rb (OpenSSL::SSL::SSLServer#intialize):
	  should initialize session id context. [ruby-core:4663]

	* ext/openssl/ossl_ssl.c (ossl_sslctx_setup): add session id support.

Sat May 21 10:24:21 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* bcc32/Makefile.sub: tds files were not deleted when DESTDIR
	  included '\' path delimiter. [ruby-dev:26193]

Thu May 19 19:04:29 2005  speakillof  <speakillof@yahoo.co.jp>

	* lib/rexml/encodings/SHIFT-JIS.rb: encoding and decoding were
	  swapped. [ruby-core:4772]

Wed May 18 23:42:25 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* error.c (exc_exception): reverted to call Exception#initialize
	  directly.  fixed: [ruby-dev:26177]

Wed May 18 23:39:09 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (glob_helper): get rid of using String.  [ruby-dev:26180]

	* dir.c (push_braces): should skip balanced braces.

	* eval.c (ruby_options), win32/win32.c (NtInitialize): move argument
	  intialization back.  [ruby-dev:26180]

Tue May 17 15:31:31 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httpserver.rb (WEBrick::HTTPServer#run): should
	  break the loop if the socket reached to EOF. [ruby-talk:142285]

Tue May 17 11:52:18 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (unixtime_to_filetime): use localtime() instead of
	  gmtime() when using FileLocalTimeToFileTime().

Mon May 16 22:28:43 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.h, {bcc32,win32,wince}/Makefile.sub: moved rb_[ugp]id_t
	  to get rid of redefinition warnings on mingw.

	* class.c (rb_class_init_copy): singleton class is disallowed to copy,
	  from its definition.  fixed: [ruby-talk:142749]

Mon May 16 08:52:29 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* win32/win32.{h,c}: define rb_[pgu]id_t.

Mon May 16 00:21:02 2005  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb (Pathname#unlink): use SystemCallError instead of
	  Errno::EISDIR because EISDIR is not portable.
	  [ruby-core:5001]

Sun May 15 22:11:33 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb (DRbObject#method_missing): use raise(exception).
	  [ruby-dev:26164]

Sun May 15 18:56:35 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in, ruby.h: define rb_[pgu]id_t macros instead of typedefs
	  to get rid of types which might not be defined yet.  [ruby-dev:26165]

Sun May 15 14:35:46 2005  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb (Pathname#unlink): unlink a symlink to a directory
	  was failed.  [ruby-core:4992]

Sun May 15 09:57:30 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (unixtime_to_filetime): deal with DST.
	  [ruby-talk:141817]

Sat May 14 23:59:11 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* error.c (exc_exception, {exit,name_err,syserr}_initialize): call
	  Execption#initialize.  fixed: [ruby-talk:142593]

Sat May 14 23:57:26 2005  Erik Huelsmann  <ehuels@gmail.com>

	* configure.in: Check for the availability of pid_t, gid_t and uid_t and
	  remove AC_TYPE_UID_T.  fixed: [ruby-core:04745]

	* defines.h: Remove pid_t typedef.

	* ruby.h: Define rb_pid_t, rb_gid_t and rb_uid_t in accordance with
	 the available system types.

	* process.c: Change instances of pid_t and gid_t to their rb_*
	 counterparts.

	* ext/pty/pty.c: Change pid_t to rb_pid_t.

	* vms/config.h: Define HAVE_{P,G,U}ID_T to 1.

	* win32/Makefile.sub: Remove #define for {g,u}id_t.

	* win32/win32.c: Change pid_t to rb_pid_t.

	* wince/Makefile.sub: Remove #define for {g,u}id_t.

	* wince/sys/types.h: Remove definitions of {p,g,u}id_t.

Fri May 13 23:44:22 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb: keep srcdir unexpanded.

	* lib/mkmf.rb (create_makefile): quote topdir and hdrdir if necessary.
	  fixed: [ruby-core:04932]

	* lib/mkmf.rb (configuration), {bcc32,win32,wince}/Makefile.sub: make
	  also INSTALL_PROG and INSTALL_DATA system dependent.
	  fixed: [ruby-core:04931]

Fri May 13 17:54:39 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* variable.c (generic_ivar_get): rb_attr_get should not warn.
	  [ruby-dev:26010]

Fri May 13 12:28:43 2005  Daniel Berger  <djberge@qwest.com>

	* array.c (rb_ary_select): can remove argc check. [ruby-core:4911]

	* test/ruby/test_array.rb: add test for find_all.

Fri May 13 11:29:00 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* eval.c (unknown_node): add volatile directive to prototype.

Thu May 12 17:08:48 2005  Tanaka Akira  <akr@m17n.org>

	* io.c (rb_io_eof, remain_size, read_all, io_read, appendline)
	  (swallow, rb_io_each_byte, rb_io_getc): revert previous change.

	* io.c (rb_io_eof, io_fread, appendline, swallow, rb_io_each_byte)
	  (rb_io_getc, rb_getc): call clearerr before getc to avoid
	  stdio incompatibility.

Thu May 12 16:52:20 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* lib/rdoc/parsers/parse_c.rb: more readability for mixing
	  progress "c..." and warning message.

Thu May 12 16:31:00 2005  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/nkf/nkf-utf8/nkf.c: follow nkf 2.0.5

Thu May 12 16:15:01 2005  Tanaka Akira  <akr@m17n.org>

	* io.c (rb_io_eof, remain_size, read_all, io_read, appendline)
	  (swallow, rb_io_each_byte, rb_io_getc): don't rely EOF flag.
	  [ruby-talk:141527]

Thu May 12 15:56:20 2005  Tilman Sauerbeck  <tilman@code-monkey.de>

	* lib/rdoc/parsers/parse_c.rb: show parsing progress for C files.
	  [ruby-core:4341]

Thu May 12 13:47:56 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* test/drb/test_drb{ssl,unix}.rb: can test drb
	  before install. (backported from HEAD) [ruby-dev:26146]

Thu May 12 09:53:57 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* version.c (ruby_show_version): flush for non-tty stdout.

Thu May 12 09:07:07 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* test/ruby/envutil.rb, test/drb/drbtest.rb: can test drb
	  before install. (backported from HEAD) [ruby-Bugs-1672]

Thu May 12 01:23:55 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_eval), parse.y (arg): reduce fixnum range literal at
	  parser.  fixed: [ruby-dev:26113]

	* eval.c (unknown_node): ignore broken NODE to get rid of accessing
	  possibly inaccessible address.  fixed: [ruby-dev:26122]
	  should emit more useful information like [ruby-dev:26126], though.

Wed May 11 16:20:01 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/cgi.rb: new methods WEBrick::CGI#[], WEBrick::CGI#logger
	  and WEBrick::CGI#config. (backported from HEAD)

	* lib/webrick/httputils.rb (WEBrick::HTTPUtils.escape_path): should
	  not use String#split("/"). (backported from HEAD)

Wed May 11 15:58:39 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (break_jump): break should not cross functions.
	  [ruby-list:40818]

Wed May 11 10:39:37 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* lib/tempfile.rb (Tempfile#unlink): fixed typo.

Wed May 11 01:03:36 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (TMP_ALLOC): use macro NEW_NODE() to get rid of warnings on
	  platforms which have no alloca().  fixed: [ruby-talk:141301]

Sun May  8 23:17:47 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/timer.rb: fix typo.

Sun May  8 16:52:56 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* lib/profiler.rb: fixed "undefined method `[]' for nil:NilClass"
	  [ruby-core:4775] [ruby-talk:140401] [ruby-dev:26118]

Sat May  7 22:58:00 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (have_var): no libs argument is given.

Sun May  1 09:58:11 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ruby.c (process_sflag): replace '-' in variable names with '_'.
	  [ruby-dev:26107]

	* ruby.c (set_arg0): use also environment variable space for setting
	  $0.  [ruby-core:04774]

Wed Apr 27 23:42:22 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/Makefile.sub (OPTFLAGS): default global optimization to
	  disabled only for VC++6.

Tue Apr 26 22:58:00 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c (ip_invoke_core): call Tcl's "::unknown"
	  command when can't get information of target command.

Mon Apr 25 01:18:43 2005  Tanaka Akira  <akr@m17n.org>

	* regex.c: declare rb_warn to have variadic argument.  [ruby-core:4751]

Sat Apr 23 19:45:59 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/tcltklib/tcltklib.c (ip_RubyExitCommand): exit with status code
	  via TclTkIp#_eval didn't work. [ruby-talk:139390]

Fri Apr 22 16:41:50 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/tcltklib/tcltklib.c (ip_set_exc_message): fixed memory leak.

	* ext/tcltklib/tcltklib.c: eTkCallbackReturn was not initialized.

Thu Apr 21 00:07:50 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (create_makefile): support platforms have file separator
	  other than /.

	* {bcc32,win32,wince}/Makefile.sub (BUILD_FILE_SEPARATOR): separator
	  of building platform.

	* {bcc32,win32,wince}/Makefile.sub (CP, INSTALL): use COPY command.

Wed Apr 20 23:22:39 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* Makefile.in, common.mk: miniruby depens on MINIOBJS.

	* dmydln.c (dln_load): dummy function to raise LoadError.

	* cygwin/GNUmakefile.in, {bcc32,win32,wince}/Makefile.sub: miniruby
	  can't load extensions on Windows.

Wed Apr 20 23:01:35 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/ifchange.bat: delete testing files.

Wed Apr 20 07:27:18 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* {bcc32,win32,wince}/configure.bat, {bcc32,win32,wince}/setup.mak:
	  add extout option.

	* bcc32/setup.mak: make configuration variables overridable.

Wed Apr 20 04:15:27 2005  Keiju Ishitsuka  <keiju@ruby-lang.org>

	* lib/irb.rb lib/irb/* doc/irb: IRB 0.9.5

Tue Apr 19 23:37:09 2005  WATANABE Hirofumi  <eban@ruby-lang.org>

	* lib/ftools.rb (File.safe_unlink): do not modify a symlinked file.

Tue Apr 19 00:06:20 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb: expand path for ext/**/extconf.rb.

Mon Apr 18 11:25:14 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/zlib/zlib.c (zstream_run): fixed SEGV. [ruby-core:4712]

Sun Apr 17 23:57:49 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb (extmake, parse_args): do not expand destdir.

	* ext/extmk.rb (relative_from): treat mere drive letter as an absolute
	  path.

Sat Apr 16 17:01:16 2005  Kouhei Sutou  <kou@cozmixng.org>

	* sample/rss/tdiary_plugin/rss-recent.rb (rss_recent_cache_rss):
	  use the first date information of items as site date information
	  if channel doesn't have date information.

Sat Apr 16 15:27:03 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (RUBY_PROG_INSTALL): not add -p option to INSTALL.
	  files need timestamps to be kept are only ar-archive on a few
	  platforms, and be installed by instruby.rb but not INSTALL.
	  fixed: [ruby-core:04721]

	* mkconfig.rb: purge autoconf value variables.

Sat Apr 16 10:36:01 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* bcc32/Makefile.sub: quick hack... prepend DESTDIR.
	  still have restriction on DESTDIR ("", "/", "e:")

Sat Apr 16 03:59:42 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/extconf.rb: check for OPENSSL_cleanse.

	* ext/openssl/openssl_missing.h: ditto.

Thu Apr 14 19:18:30 2005  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (remove_file): ignore exceptions caused by
	  chmod.

	* lib/fileutils.rb (remove_dir): try to get rights to rmdir.
	  [ruby-Bugs:1502] (2 items backportted from HEAD, rev 1.53-54)

Thu Apr 14 16:57:40 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bcc32/Makefile.sub: failed to remove debug information files.
	  fixed: [ruby-dev:26034]

Wed Apr 13 23:40:21 2005  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb (RSS::VERSION): 0.1.3 -> 0.1.4.

	* lib/rss/rss.rb (RSS::Element#converter): fixed converter
	  transmission bug.

Wed Apr 13 21:20:35 2005  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in (mingw32): extract msvcr*.dll from objdump result.

Wed Apr 13 20:24:30 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (mingw32): use actual runtime DLL name as ruby DLL
	  name and default load path.

	* win32/Makefile.sub, win32/setup.mak: ditto.

Tue Apr 12 15:33:09 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c (ip_finalize): better modification than the
	  previous commit [ruby-dev:26029].

Tue Apr 12 12:38:06 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c (ip_finalize): fix SEGV when Tcl_GlobalEval()
	  modifies the argument string to eval.

Tue Apr 12 02:21:55 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c (ip_finalize): add existence check of
	  Tcl commands before calling Tcl_GlobalEval().

Mon Apr 11 23:47:21 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb: [druby-ja:123] fix: When reference of my object is
	  loaded, the object is tainted.

	* test/drb/test_drb.rb: ditto.

Mon Apr 11 22:18:23 2005  WATANABE Hirofumi  <eban@ruby-lang.org>

	* dir.c, file.c (lstat): avoid warnings for mingw.

Mon Apr 11 20:11:06 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c (ip_finalize): adhoc patch to avoid SEGV
	  when exit on Tcl/Tk8.3.x.

Mon Apr 11 15:26:25 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* lib/mkmf.rb (configuration): shouldn't output hdrdir twice.

Mon Apr 11 12:09:05 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* {bcc32,win32,wince}/Makefile.sub: ri data was not installed
	  into correct path. [ruby-dev:26011]

	* bcc32/Makefile.sub: defaulted install-nodoc. [ruby-dev:26011]

Sun Apr 10 10:12:42 2005  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c(ole_invoke): retry after converting Qnil
	  to VT_EMPTY.

	* ext/win32ole/win32ole/tests/testWIN32OLE.rb: correct error
	  message string "Unknown" => "unknown".

Sat Apr  9 18:20:31 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/image.rb: support to create TkImage object without
	  creating a new image object on Tk.

	* ext/tk/lib/tk/menu.rb: use TkCommandNames on create_self()

	* ext/tk/lib/tk/root.rb: TkRoot.to_eval() returns '.'.

	* ext/tk/lib/tk/text.rb: add methods to create a TkText::IndexString
	  from (x, y) coords.

	* ext/tk/lib/tkextlib/tile/: add demo and update support status.

Sat Apr  9 14:42:29 2005  Kouhei Sutou  <kou@cozmixng.org>

	* sample/rss/tdiary_plugin/rss-recent.rb: supported configuration
	  via Web browser.

Sat Apr  9 11:59:57 2005  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss: backoported from HEAD.

	* lib/rss: refactored.
	  - gave a name to 'x'.
	  - undef_method -> remove_method for avoiding a warning in ruby 1.6.

	* lib/rss/parser.rb: @@setter -> @@setters.

	* lib/rss/parser.rb
	  (RSS::BaseListener.register_uri)
	  (RSS::BaseListener.uri_registered?)
	  (RSS::BaseListener.install_get_text_element):
	  swapped the first argument and the second argument.

	* lib/rss/taxonomy.rb: swapped the first argument and the second
	  argument for RSS::BaseListener.install_get_text_element.
	* lib/rss/image.rb: ditto.
	* lib/rss/syndication.rb: ditto.
	* lib/rss/dublincore.rb: ditto.
	* lib/rss/parser.rb: ditto.
	* lib/rss/1.0.rb: ditto.
	* lib/rss/2.0.rb: ditto.
	* lib/rss/0.9.rb: ditto.
	* lib/rss/content.rb: ditto.

	* lib/rss/parser.rb
	  (RSS::BaseListener.install_setter)
	  (RSS::BaseListener.register_uri): changed fallback way.

	* lib/rss/parser.rb: added class name registry for complex model
	  elements. (ex. have childlen elements, have some attributes and
	  a child element and so on.)

	* lib/rss/dublincore.rb: supported multiple Dublin Core items.
	* lib/rss/maker/dublincore.rb: ditto.

	* lib/rss/maker/image.rb: supproted new Dublin Core API.

	* lib/rss/maker/base.rb: added default current_element implementation.

	* lib/rss/trackback.rb (RSS::TrackBackUtils.new_with_value_if_need):
	  moved to RSS::Utils.

	* lib/rss/utils.rb (RSS::Utils.new_with_value_if_need):
	  moved from RSS::TrackBackUtils.

	* lib/rss/maker/image.rb: fixed invalid argument of
	  add_need_initialize_variable bug.
	* lib/rss/maker/trackback.rb: ditto.

	* lib/rss/rss.rb (Hash#merge): added for ruby 1.6.

	* lib/rss/rss.rb (RSS::BaseModel.date_writer): changed to accept nil
	  for date value.

	* test/test_dublincore.rb: added tests for plural accessor and
	  multiple Dublin Core items.

	* test/test_setup_maker_1.0.rb: fixed swapped actual and expected
	  values.

	* test/rss/rss-assertions.rb (assert_multiple_dublin_core): added
	  an assertion for testing multiple Dublin Core items.

	* test/rss/test_maker_dc.rb (test_rss10_multiple): added a test
	  for making multiple Dublin Core items.

	* test/rss/test_maker_dc.rb (test_date): added a test for #date=
	  and #dc_date=.

	* sample/rss/tdiary_plugin/rss-recent.rb:
	  new option: @options['rss-recent.use-image-link']:
	  use image as link instread of text if available.

	* sample/rss/tdiary_plugin/rss-recent.rb (RSS_RECENT_VERSION):
	  0.0.5 -> 0.0.6.

Fri Apr  8 20:17:48 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb (extmake): hdrdir needs to be defined also in
	  Config::CONFIG.

	* lib/mkmf.rb (configuration, create_makefile): get rid of recursive
	  macro reference.

Fri Apr  8 18:26:56 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_ssl.c: add callbacks to OpenSSL::SSL::SSLContexts.
	  - SSLContext#client_cert_cb=(aProc). it is called when a client
	    certificate is requested by a server and no certificate was not
	    set for the SSLContext. it must return an Array which includes
	    OpenSSL::X509::Certificate and OpenSSL::PKey::RSA/DSA objects.
	  - SSLContext#tmp_dh_callback=(aProc). it is called in key
	    exchange with DH algorithm. it must return an OpenSSL::PKey::DH
	    object.

	* ext/openssl/ossl_ssl.c (ossl_sslctx_set_ciphers): ignore the
	  argument if it's nil.

	* ext/openssl/ossl_pkey.c
	  (GetPrivPKeyPtr, ossl_pkey_sign): should call rb_funcall first.
	  (DupPrivPKeyPtr): new function.

	* ext/openssl/ossl_pkey_dh.c: add default DH parameters.

	* ext/openssl/ossl_pkey.h: ditto.

Fri Apr  8 01:55:20 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/sample/demos-{en,jp}/goldberg.rb: reduced window size.
	  [ruby-dev:25992]

Thu Apr  7 23:58:40 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb (extmake): keep directory names in Makefile as macros.

	* lib/mkmf.rb (configuration, create_makefile): ditto.

	* lib/mkmf.rb (CXX_EXT): separate C++ extensions.

Thu Apr  7 17:43:25 2005  Shugo Maeda  <shugo@ruby-lang.org>

	* eval.c (rb_call0): "return" event hook should be always executed
	  if event_hooks is set.  fixed: [ruby-core:04662]
	  (backported from HEAD)

Mon Apr  4 23:17:52 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb (TkComm#array2tk_list): accept enc-mode argument to
	  decide whether convert encoding of each element or not.

	* ext/tk/lib/tk/variable.rb (TkVariable#value=): fail to convert the
	  encoding of array elements when assign an array to an TkVariable
	  object.

Mon Apr  4 10:26:48 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/tk/lib/tk/dialog.rb: fixed typo.

Sun Apr  3 17:16:33 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* win32/win32.{h,c} (rb_w32_fdopen): avoid warning on bcc32.
	  (backported from HEAD)

Sat Apr  2 23:38:54 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (CP, INSTALL): get rid of less portable options.

	* lib/mkmf.rb (configuration, create_makefile): correct configuration
	  variable.

	* {bcc32,win32,wince}/{Makefile.sub,setup.mak}: leave prefix empty in
	  config.status for backward compatibility.  fixed: [ruby-core:04649]

	* lib/mkmf.rb (create_makefile): ensure library directories get made
	  before copying libraries there.

Sat Apr  2 16:59:46 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: forgot to update RELEASE_DATE

	* ext/tk/lib/tk/variable.rb: fix namespace trouble when autoloading

	* ext/tk/lib/tk/palette.rb: define Tcl variable 'tkPalette' as global

	* ext/tk/lib/tk/dialog.rb: use array2tk_list method when calling
	  Tk.ip_eval.

	* ext/tk/lib/tk/autoload.rb: add autoload entry 'TkDialogObj' and
	  'TkWarningObj'

Sat Apr  2 02:19:11 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb (TkWindow.initialize): accept 'without_creating'
	  option without 'widgetname' option to allow creating a widget object
	  which is used as an argument of Tcl/Tk's widget allocation commands.

	* ext/tk/lib/tk/image.rb (TkImage.initialize): accept 'imagename'
	  option to create a image object by the given name.

Thu Mar 31 22:23:51 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (SRC_EXT): exclude just case different suffixes on case
	  insensitive file system platforms.

	* README.EXT, README.EXT.ja (Appendix C): utility functions.

Thu Mar 31 14:15:44 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_engine.c (ossl_engine_s_load): should return
	  value. [ruby-dev:25971]

Thu Mar 31 08:25:50 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (RUBYOPT): clear for the environment RubyGems installed.

	* common.mk (clean-local): keep $(PREP) files till distclean.

	* common.mk (check): do all tests.

Thu Mar 31 06:00:20 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_engine.c (ossl_engine_s_load): should not raise
	  error even if the specified engine could not be loaded. (Dynamic
	  engines don't have fixed name to load.)

Thu Mar 31 00:18:27 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* win32/ifchange.bat, win32/rm.bat: backported from HEAD.

Wed Mar 30 23:44:50 2005  Nobuyoshi Nakada  <nobu.nokada@softhome.net>

	* Makefile.in, */Makefile.sub, */configure.bat,
	  cygwin/GNUmakefile.in, common.mk, configure.in, ext/extmk.rb,
	  lib/mkmf.rb, instruby.rb, runruby.rb: backport extout.
	  [ruby-dev:25963]

Wed Mar 30 17:41:48 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: add TclTkIp#_create_console() method to
	  create a Tcl/Tk's console window.

	* ext/tk/lib/multi-tk.rb: support TclTkIp#_create_console() method.

	* ext/tk/lib/remote-tk.rb: ditto.

	* ext/tk/lib/tk/console.rb: ditto.

	* ext/tk/lib/tk.rb: update RELEASE_DATE

	* ext/tk/sample/demo-*/check2.rb: use 'return' in the Proc object.

	* ext/tk/sample/tkextlib/**: ditto.

Tue Mar 29 22:11:56 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* test/rinda/test_rinda.rb: use DRbObject.new_with instead of reinit.
	  [ruby-dev:25961]

Mon Mar 28 23:40:40 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb: move method DRbObject#reinit to DRbObject.new_with.
	  extract method DRbObject.prepare_backtrace. add DRb.regist_server,
	  remove_server, fetch_server. change server in thread variable if
	  in-proc server. [druby-ja:113]

	* lib/drb/gw.rb: ditto.

Mon Mar 28 20:43:34 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/syck/rubyext.c: get rid of warnings caused by a bug of VC.

Mon Mar 28 08:39:49 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/iconv/iconv.c (iconv_create): Iconv::Failure requires 3
	  arguments.  (pointed out by NaHi)

Sat Mar 26 22:51:33 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb (_callback_entry_class?): add for checking whether
	  a class is available for a callback entry.

	* ext/tk/lib/tk.rb (after_cancel): add Tk.after_cancel(afterID) method.

	* ext/tk/lib/tk.rb (array2tk_list): change from private module method
	  of TkComm to public module method.

	* ext/tk/lib/tk.rb (cget): add check that slot argument is not
	  empty string.

	* ext/tk/lib/tk.rb (configinfo): ditto.

	* ext/tk/lib/tk/itemconfig.rb (itemcget): add check that slot argument
	  is not empty string.

	* ext/tk/lib/tk/itemconfig.rb (itemconfiginfo): ditto.

	* ext/tk/lib/tk/entry.rb: add TkEntry#icursor and icursor= (alias of
	  cursor and cursor= method).

	* ext/tk/lib/tk/font.rb: improve font treatment when the font name is
	  empty string.

	* ext/tk/lib/tk/variable.rb: add :variable, :window and :procedure
	  type.

	* ext/tk/lib/tk/variable.rb: improve treatment of array-type
	  tkvariable.

	* ext/tk/lib/tkextlib/blt.rb: add commands for zooming.

	* ext/tk/lib/tkextlib/blt/*: bug fix.

	* ext/tk/lib/tkextlib/treectrl/tktreectrl.rb: bug fix and add methods
	  to call TreeCtrl commands for bindings.

	* ext/tk/sample/tkextlib/blt/*: new sample scripts.

	* ext/tk/sample/tkextlib/treectrl/*: ditto.

Fri Mar 25 10:53:16 2005  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in (WIN32_LEAN_AND_MEAN): removed because a lot of
	  troubles.  [ruby-list:40721]

Thu Mar 24 23:10:44 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (macro_defined?): try to compile for an old compiler
	  which doesn't bail out at #error directive.  [ruby-dev:25818]

	* lib/mkmf.rb (check_sizeof): refine logging messages.

Thu Mar 24 03:57:48 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/utils.rb (WEBrick::Utils.create_listeners):
	  - should raise ArgumentError if no port is specified.
	  - even if the specified port is 0, all TCPServers should be
	  initialized with the port given to the first one.

	* lib/webrick/server.rb (WEBrick::GenericServer#initialize): if :Port
	  parameter is 0, it should be updated with the port number which
	  actually listened.

Wed Mar 23 00:35:10 2005  Shugo Maeda  <shugo@ruby-lang.org>

	* test/ruby/test_settracefunc.rb (test_event): added tests for
	  "class" and "end" and "raise".

Tue Mar 22 22:40:18 2005  Shugo Maeda  <shugo@ruby-lang.org>

	* eval.c (rb_call0): check event_hooks instead of trace_func.

Tue Mar 22 17:30:44 2005  Shugo Maeda  <shugo@ruby-lang.org>

	* eval.c (rb_add_event_hook): new function to add a hook function for
	  interpreter events. (backported form HEAD)

Sun Mar 20 22:51:19 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (mkmf_failed): check if Makefile is created without
	  create_makefile.

Sat Mar 19 23:48:10 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* misc/ruby-mode.el (ruby-expr-beg): returned true always.
	  fixed: [ruby-list:40683]

Sat Mar 19 00:41:02 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/font.rb: add some TkFont class methods to get font
	  information without creating a TkFont object.

	* ext/tk/lib/tkextlib/treectrl/tktreectrl.rb: bug fix and define some
	  classes for components of Tk::TreeCtrl

Thu Mar 17 17:42:13 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* struct.c (make_struct): allow non local-id field
	  names. [ruby-core:04575]

	* struct.c (inspect_struct): ditto.

Wed Mar 16 23:36:02 2005  Shugo Maeda  <shugo@ruby-lang.org>

	* eval.c (rb_call0): call_cfunc() should be protected.

	* test/ruby/test_settracefunc.rb: added test for c-return.

Wed Mar 16 22:20:25 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* object.c (str_to_id): fixed typo.

Wed Mar 16 18:08:32 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_call0): reorganize "return" event post.

Tue Mar 15 23:49:19 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/iconv/iconv.c (Init_iconv): InvalidEncoding also should include
	  Iconv::Failure.

Tue Mar 15 16:38:11 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tkutil.c (ary2list): give wrong arguments to hash2kv()

Mon Mar 14 19:39:33 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/timer.rb (TkTimer): forgot to clear @return_value
	  when restarting

	* ext/tk/lib/tk/sample/cd_timer.rb: new sample of TkRTTimer

Mon Mar 14 12:21:03 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/timer.rb (TkRTTimer): forgot to reset the callback
	  time. So, 'continue' do all callbacks between 'stop' and 'continue'.

Mon Mar 14 08:14:56 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* object.c (str_to_id): warn for NUL containing strings.

Mon Mar 14 00:13:49 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/timer.rb (TkRTTimer): correct calculation of offset
	  value. get a little better accuracy.

	* ext/tk/sample/demos-en/widget: use a binding with no local variables
	  when eval a sample script.

	* ext/tk/sample/demos-en/bind.rb: ditto.

	* ext/tk/sample/demos-en/tcolor: ditto.

	* ext/tk/sample/demos-jp/widget: ditto.

	* ext/tk/sample/demos-jp/bind.rb: ditto.

	* ext/tk/sample/demos-jp/tcolor: ditto.

Sun Mar 13 10:04:17 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* test/rinda/test_rinda.rb: remove test_gc. [ruby-dev:25871]

Thu Mar 10 19:12:06 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c (lib_eventloop_ensure): mis-delete a timer
	  handler when exit from a recursive called eventloop

	* ext/tk/lib/tk/timer.rb: new TkRTTimer class, which can works for a
	  realtime operation

	* ext/tk/sample/tkrttimer.rb: sample of TkRTTimer class

	* ext/tk/lib/tk/textmark.rb: move  TkTextMark#+ and TkTextMark#- to
	  TkText::IndexModMethods

	* ext/tk/lib/tk/text.rb: improve TkTextMark#+ and TkTextMark#-, and
	  add them to TkText::IndexModMethods module

	* ext/tk/sample/tktextio.rb: add test part of "seek by text index
	  modifiers"

Thu Mar 10 08:10:11 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* re.c (make_regexp): need to free internal regexp structure when
	  compilation fails.  [ruby-talk:133228]

Wed Mar  9 20:25:58 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_ssl.c (ossl_start_ssl, ossl_ssl_write): call
	  rb_sys_fail if errno isn't 0. [ruby-dev:25831]

	* ext/openssl/lib/openssl/cipher.rb: fix typo. [ruby-dev:24285]

Wed Mar  9 15:46:35 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/server.rb (WEBrick::GenericServer#start): should
	  restore @token if accept failure. suggested by Dominique Brezinski.
	  [ruby-core:04518]

Wed Mar  9 13:37:57 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/sample/tktextio.rb: fix bug of handling 'end' position.
	  support initial text, overwrite setting and pos_gravity control.

Tue Mar  8 18:16:55 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/sample/tktextio.rb: New sample script. TkTextIO class in this
	  sample supports to use a text widget as if it is a I/O stream (such
	  like as StringIO class).

Tue Mar  8 13:54:40 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/socket/socket.c: workaround for some of 4.4BSD-Lite derived OSs.

Tue Mar  8 12:36:17 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/socket/socket.c: document from Sam Roberts
	  <sroberts@uniserve.com> for getsockopt and setsockopt is merged.
	  [ruby-doc:824]

Tue Mar  8 01:27:00 2005  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/nkf/nkf-utf8/nkf.c: follow nkf 1.66
	  fixed: [ruby-dev:25828]

Mon Mar  7 21:35:02 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* sample/webrick/httpsd.rb: fix typo in comment. suggested by
	  Kazuhiko Shiozaki.

Mon Mar  7 14:55:43 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (block_pass): should not push unique number if a block is
	  not an orphan.  [ruby-dev:25808]

Wed Feb 16 02:55:21 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_ssl.c (ossl_start_ssl, ossl_ssl_read,
	  ossl_ssl_write):
	  - need to set errno on Win32 platform.
	  - should call rb_sys_fail instead of rasing SSLError if
	    SSL_ERROR_SYSCALL occured.
	  - should wait for that the underlying IO become readable or
	    writable if the error was SSL_ERROR_WANT_READ or
	    SSL_ERROR_WANT_WRITE. [ruby-dev:25795]

	* ext/openssl/lib/openssl/buffering.rb
	  (Buffering#initialize): should set @eof and @rbuffer.
	  (Buffering#fill_rbuff): should rescue Errno::EAGAIN.
	  (Buffering#consume_rbuf): pointless eof flag resetting is deleted.
	  (Buffering#read): should return an empty string if the specified
	  size is zero.
	  (Buffering#readpartial): new method.
	  (Buffering#readline): fix typo.
	  (Buffering#getc): return the first character of string correctly.
	  (Buffering#each): fix typo.  suggested by Brian Ollenberger.
	  (Buffering#readchar): fix typo.
	  (Buffering#eof?): should read again it the input buffer is empty.
	  (Buffering#do_write): should rescue Errno::EAGAIN.
	  (Buffering#puts): use "\n" as the output field separator.

	* ext/openssl/lib/openssl/ssl.rb: set non-blocking flag to the
	  underlying IO.

	* ext/openssl/extconf.rb: get rid of GNUmakefile generation.

	* text/openssl/test_pair.rb: test for IO like methods.

	* test/ruby/ut_eof.rb: test about empty file.

Mon Mar  7 10:22:06 2005  WATANABE Hirofumi  <eban@ruby-lang.org>

	* lib/un.rb: should use OptionParser. (backported form HEAD)

Mon Mar  7 09:18:42 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_cmp_m): should not return false but nil.
	  fixed: [ruby-dev:25811]

Mon Mar  7 01:22:14 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tkutil.c: remove the some codes which depend on the
	  difference between Ruby1.8 and 1.9, because st.c on Ruby1.9
	  was changed.

Mon Mar  7 00:01:04 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: fail to call TclTkLib.mainloop when $SAFE==4

Sun Mar  6 16:41:33 2005  Minero Aoki  <aamine@loveruby.net>

	* lib/net/http.rb: HTTPHeader holds its header fields as an array
	  (backport from CVS HEAD rev 1.112-1.123). [ruby-list:40629]

	* test/net/http/test_httpheader.rb: new file.

Sun Mar  6 11:47:10 2005  Sam Roberts  <sroberts@uniserve.com>

	* lib/pp.rb: rdoced.  [ruby-core:4490]

Sun Mar  6 11:36:37 2005  Tanaka Akira  <akr@m17n.org>

	* lib/pp.rb (File::Stat#pretty_print): Etc.getpwuid and Etc.getgrgid
	  may return nil.  [ruby-talk:129826]
	  reported by Daniel Berger.

Sat Mar  5 18:06:21 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* dir.c (fnmatch): removed unnecessary code. (ruby_1_8 didn't have
	  String#clear, so [ruby-dev:24749] didn't affect it)

	* win32/win32.c (NtInitialize): ditto. (by numeric.c 1.101.2.14)

Sat Mar  5 16:29:26 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: freeze callback-entry objects

	* ext/tk/lib/tkextlib/tile.rb: support tile-0.6

Fri Mar  4 19:39:28 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser#do_includes): replace
	  also locally defined modules.

	* ext/iconv/iconv.c: backport Iconv::InvalidEncoding from CVS HEAD.

	* ext/strscan/strscan.c: moved misplaced rdoc.

Fri Mar  4 15:58:12 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/cgi-lib.rb: add deprecation warning. [ruby-dev:25499]
	  getopts.rb, parsearg.rb, importenv.rb as well.

Fri Mar  4 11:17:06 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c (ip_rbUpdateCommand): get rid of
	  warnings with Tcl/Tk 8.3 or former (backport from CVS_HEAD).

	* ext/tcltklib/tcltklib.c (ip_rb_threadUpdateCommand): ditto.

Fri Mar  4 10:15:30 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/set.rb (SortedSet::setup): a hack to shut up warning.
	  [ruby-talk:132866]

Fri Mar  4 07:07:00 2005  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/nkf/nkf-utf8/nkf.c: follow nkf 1.63

Thu Mar  3 23:49:00 2005  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/nkf/nkf-utf8/nkf.c: follow nkf 1.62

Thu Mar  3 11:49:51 2005  Kouhei Sutou  <kou@cozmixng.org>

	* sample/rss/tdiary_plugin/rss-recent.rb: added site information.

Wed Mar  2 19:53:07 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb (parse_args): add DESTDIR only when not directed
	  already.  fixed: [ruby-dev:25781]

Wed Mar  2 17:14:18 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c (lib_eventloop_core): fix typo

Wed Mar  2 16:00:02 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: enforce thread-check and exception-handling
	  to avoid SEGV trouble.
	  [KNOWN BUG] When supports pthread and running multiple Tk
	  interpreters, an interrupt signal causes SEGV frequently. That
	  may be a trouble of Ruby's signal handler.

	* ext/tk/tkutil/tkutil.c; fix a bug on converting a SJIS string array
	  to a Tcl's list string.

	* ext/tk/tcltklib.c: wrap Tcl's original "namespace" command to
	  protect from namespace crash.

	* ext/tk/lib/multi-tk.rb: enforce exception-handling.

	* ext/tk/lib/multi-tk.rb: catch IRB_EXIT to work on irb.

	* ext/tk/lib/tk.rb: ditto.

	* ext/tk/tcltklib.c: add TclTkLib.mainloop_thread?

	* ext/tk/lib/multi-tk.rb: (bug fix) callback returns a value.

	* ext/tk/lib/tk/canvas.rb (delete): bug fix when multiple arguments.

	* ext/tk/lib/clock.rb: fix 'no method error'.

	* ext/tk/lib/clock.rb (self.clicks): accept a Symbol argument.

	* ext/tk/lib/variable.rb: be able to set default_value_type; :numeric,
	  :bool, :string, :symbol, :list, :numlist or nil (default; same to
	  :string). If set a type, TkVariable#value returns a value of the
	  type.

	* ext/tk/lib/tkextlib/tclx/tclx.rb: add Tk::TclX.signal to warn the
	  risk of using TclX extension's 'signal' command.

	* ext/tk/sample/irbtk.rb: irb with Ruby/Tk.

	* ext/tk/sample/demos-*/anilabel.rb: bug fix on 'show code'

	* ext/tk/sample/demos-*/aniwave.rb: new Ruby/Tk animation demo.

	* ext/tk/sample/demos-*/pendulum.rb: ditto.

	* ext/tk/sample/demos-*/goldberg.rb: ditto.

	* ext/tk/sample/demos-*/widget: add entries of animation demos.

Tue Mar  1 00:47:43 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* test/rinda/test_rinda.rb: backport from CVS_HEAD. use
	  MockClock.sleep instead of Kernel.sleep [ruby-dev:25387]

Tue Mar  1 00:34:24 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/rinda/tuplespace.rb (Rinda::TupleSpace): improved keeper thread.

	* test/rinda/test_rinda.rb: ditto.

Mon Feb 28 11:42:23 2005  Ian Macdonald  <ian@caliban.org>

	* exception error messages updated.  [ruby-core:04497]

Mon Feb 28 09:03:09 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/socket/socket.c (Init_socket): add bunch of Socket
	  constants.  Patch from Sam Roberts <sroberts@uniserve.com>.
	  [ruby-core:04409]

Wed Feb 23 15:04:32 2005  akira yamada  <akira@ruby-lang.org>

	* lib/uri/generic.rb (split_userinfo): should split ":pass" into ""
	  and "pass".  [ruby-dev:25667]

Wed Feb 23 08:00:18 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_s_create): no need for negative argc check.
	  [ruby-core:04463]

	* array.c (rb_ary_unshift_m): ditto.

Wed Feb 23 01:57:46 2005  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (initialize): handle certs correctly. Thanks,
	  NABEYA Kenichi. (backported from CVS HEAD)

Tue Feb 22 07:25:18 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (parser_yylex): identfier after dot must not be a variable.

Mon Feb 21 10:04:49 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* {bcc32,win32,wince}/Makefile.sub (config.h): add fcntl.

	* win32/win32.[ch] (fcntl): ditto.

	* win32/win32.c (rb_w32_connect): support nonblocking mode.

	* ext/socket/socket.c (wait_connectable, ruby_connect): support
	  nonblocking connect on various platforms.
	  all changes are backported from CVS HEAD. [ruby-core:3154],
	  [ruby-core:4364].

Sun Feb 20 00:48:48 2005  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb (URI::FTP#buffer_open): access mechanism
	  re-implemented according to RFC 1738.
	  reported by Guillaume Marcais.  [ruby-talk:131650]

Sat Feb 19 18:11:47 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb (DRbObject#respond_to?): take two arguments.
	  [ruby-dev:25722]

	* test/drb/drbtest.rb: ditto.

Sat Feb 19 13:52:02 2005  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb: call OpenSSL::SSL::SSLSocket#post_connection_check
	  after connection is made.

Sat Feb 19 01:32:03 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/bigdecimal/lib/bigdecimal/newton.rb: resolved LoadError.
	  [ruby-dev:25685]

	* ext/bigdecimal/sample/linear.rb: ditto.

	* ext/bigdecimal/sample/nlsolve.rb: ditto.

	* ext/bigdecimal/lib/bigdecimal/nlsolve.rb: removed because this file
	  is sample script and same file exists in ext/bigdecimal/sample.

Fri Feb 18 17:14:00 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/xmlrpc/parser.rb (XMLRPC::FaultException): make it subclass
	  of StandardError class, not Exception class.  [ruby-core:04429]

Thu Feb 17 20:11:18 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* lib/drb/drb.rb (DRbServer.default_safe_level): fix typo.

Thu Feb 17 20:11:18 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/digest/test_digest.rb: separate test case for each algorithms.
	  [ruby-dev:25412]

Thu Feb 17 11:54:00 2005  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/test/unit/collector.rb (collect_file): now deletes paths added
	  to $LOAD_PATH instead of restoring it verbatim.

	* lib/test/unit/autorunner.rb (AutoRunner.run): fixed so that
	  'ruby -rtest/unit -rtest1 -rtest2 -e0' will use the objectspace
	  collector again. Also tried to simplify the calling convention.

	* test/runner.rb: adjusted for new AutoRunner semantics.

	* lib/test/unit.rb: ditto.

Thu Feb 17 04:21:47 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/open3.rb (Open3::popen3): $? should not be EXIT_FAILURE.
	  fixed: [ruby-core:04444]

Thu Feb 17 00:09:45 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* test/drb/ignore_test_drb.rb: move TestDRbReusePort to new file
	  [ruby-dev:25238]

	* test/drb/test_drb.rb: add method DRbService.ext_service, move
	  TestDRbReusePort to new file [ruby-dev:25238]

	* test/drb/test_drb.rb: ditto.

	* test/drb/test_drbssl.rb: ditto.

	* test/drb/test_drbunix.rb: ditto.

	* test/drb/ut_drb.rb: reduce sleep.

Thu Feb 17 00:02:27 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (is_defined): NODE_IASGN is an assignment.

Wed Feb 16 23:34:30 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb: add lazy stop_service. ([druby-ja:109])

	* lib/drb/extserv.rb: ditto.

Wed Feb 16 17:07:57 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tkutil.c: Follow the change of st.c (st_foreach)
	  [ruby-list:40623].
	  Sometimes mis-convert from a Ruby's Array of SJIS Strings, which
	  includes some kind of SJIS characters, to a Tcl's UTF8 list string.

Mon Feb 14 23:58:17 2005  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/parser.rb (RSS::ListenerMixin::tag_end):
	  fixed invalid namespace handling bug.

Mon Feb 14 13:12:38 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/lib/openssl/ssl.rb
	 (OpenSSL::SSL::SSLSocket#post_connection_check): new method.

Mon Feb 14 00:40:49 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb (InvokeMethod.perform): pass DRb info to sub thread.

	* test/drb/test_drb.rb (test_01_safe1_safe4_eval): fix test case.

Sun Feb 13 23:13:46 2005  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/dublincore.rb (RSS::DublicCoreModel#date{,=}): added
	  convenient methods.

	* lib/rss/0.9.rb (RSS::Rss::Channel#date{,=}): ditto.

	* lib/rss/2.0.rb (RSS::Rss::Channel::Item#date{,=}): ditto.

	* test/rss/: added tests for the convenient methods.

Sun Feb 13 22:43:03 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb (DRbServer): add default_safe_level, safe_level,
	  config[:safe_level] ([druby-ja:120])

	* test/drb/test_drb.rb, ut_eval.rb, ut_safe1.rb: ditto.

Sun Feb 13 16:56:52 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/cgi.rb (WEBrick::CGI.start): should set reason-phrase
	  to the value of status header field. ([ruby-dev:40617])

Sun Feb 13 00:52:33 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/erb.rb (ERB::Util.h, u): make it module_function.

Sat Feb 12 17:29:19 2005  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb (OpenURI.open_loop): send authentication only for
	  the URI directly specified.

Sat Feb 12 15:07:23 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* random.c (rand_init): suppress warning.

Sat Feb 12 13:54:03 2005  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb: support https if the platform provides CA
	  certificates.

Sat Feb 12 06:18:28 2005  URABE Shyouhei  <shyouhei@ice.uec.ac.jp>

	* ext/etc/etc.c (Init_etc): sGroup needs HAVE_ST_GR_PASSWD check.
	  [ruby-dev:25675]

Fri Feb 11 17:40:42 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_x509store.c (ossl_x509store_set_default_paths):
	  new method OpenSSL::X509::Store#set_default_paths.

Fri Feb 11 11:33:53 2005  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb (URI::HTTP#proxy_open): new option supported:
	  :http_basic_authentication.
	  suggested by Kent Sibilev.  [ruby-core:4392]

Fri Feb 11 06:30:07 2005  George Ogata  <g_ogata@optushome.com.au>

	* misc/ruby-mode.el: ignore parenthesis inside heredoc.
	  [ruby-core:04415]

Fri Feb 11 04:54:13 2005  Tilman Sauerbeck  <tilman@code-monkey.de>

	* lib/rdoc/generators/html_generator.rb: [ruby-core:04412]

	* lib/rdoc/generators/ri_generator.rb: ditto.

Thu Feb 10 11:14:17 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/Makefile.sub (COMMON_HEADERS): shouldn't include winsock2.h.

	* ext/socket/extconf.rb (sockaddr_storage): remove workaround for
	  mswin32.

Thu Feb 10 10:29:16 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/curses/curses.c: don't need to check HAVE_WCOLOR_SET excluding
	  window_color_set().

Thu Feb 10 00:47:25 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* struct.c (make_struct): fixed: [ruby-core:04402]

Wed Feb  9 08:07:08 2005  Paul Duncan  <pabs@pablotron.org>

	* ext/curses/curses.c (window_color_set): [ruby-core:04393]

Tue Feb  8 23:51:47 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb: reject :instance_eval, :class_eval, :module_eval
	  [druby-ja:117]

Tue Feb  8 13:06:12 2005  Sam Roberts  <sroberts@uniserve.com>

	* ext/socket/socket.c (Init_socket): SO_REUSEPORT added.
	  [ruby-talk:130092]

Tue Feb  8 09:30:01 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/cgi.rb (CGI::Cookie): [ruby-talk:130040]

Tue Feb  8 00:19:02 2005  Tanaka Akira  <akr@m17n.org>

	* lib/resolv.rb (Resolv::DNS::Name#subdomain_of?): new method.
	  (Resolv::DNS::Name#inspect): ditto.
	  Suggested by Sam Roberts.  [ruby-talk:129086]

Mon Feb  7 10:06:30 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* object.c: [ruby-doc:818]

Mon Feb  7 01:56:20 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* instruby.rb, rubytest.rb (srcdir): no longer embed srcdir into
	  rbconfig.rb. (backported from CVS HEAD)

	* ext/socket/extconf.rb (sockaddr_storage): winsock2.h have the
	  definition of struct sockaddr_storage, but socket.c doesn't
	  include it because this version of ruby still has binary level
	  compatibility with winsock1.

	* lib/mkmf.rb (create_makefile): should support header files in
	  depend file.

Mon Feb  7 01:21:50 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/socket/extconf.rb: check if getaddrinfo() works fine only when
	  wide-getaddrinfo option is not given.  fixed: [ruby-dev:25422]

	* lib/mkmf.rb ($extmk): check if under ext directory.

	* lib/mkmf.rb (Logging.postpone): allow recursive operation.

	* lib/mkmf.rb (try_constant): make sure if really a constant, reduce
	  the number of times of compile.

	* lib/mkmf.rb (have_macro, have_var, byte_order): new functions.

	* lib/mkmf.rb (find_library): allow directory list with separators.

	* lib/mkmf.rb (arg_config): manage provided configuration options.

	* lib/mkmf.rb (dir_config): accept arrays of directory names as
	  default values.

	* mkconfig.rb: no longer embed srcdir and compile_dir into
	  rbconfig.rb.

	* lib/mkmf.rb (create_makefile): fix unbalanced parens.

Sun Feb  6 19:23:01 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* eval.c (stack_extend): add prototype because VC++8 doesn't
	  accept __declspec(noinline) with K&R style function definitions.
	  (backported from CVS HEAD)

Sun Feb  6 14:14:26 2005  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb (new_with_hash): changed messages of exception.

	* lib/date/format.rb (str[fp]time): undocumented conversion
	  specifications %[1-3] are now deprecated.

Sun Feb  6 12:20:11 2005  Akinori MUSHA  <knu@iDaemons.org>

	* bignum.c (rb_big2ulong_pack): One too many arguments are passed
	  to big2ulong().

	* re.c (rb_reg_init_copy, rb_reg_initialize_m): One too many
	  arguments are passed to rb_reg_initialize().

Sun Feb  6 03:24:20 2005  Tanaka Akira  <akr@m17n.org>

	* lib/resolv.rb (Resolv::DNS::Resource::TXT): multiple strings was not
	  handled.
	  (Resolv::DNS::Resource::TXT#strings): new method to return all
	  strings.
	  (Resolv::DNS::Message::MessageEncoder#put_string_list): new method.
	  (Resolv::DNS::Message::MessageDecoder#get_string_list): ditto.
	  based on [ruby-talk:129732] by Sam Roberts.

Fri Feb  4 00:30:45 2005  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss: supported Image module.
	  http://web.resource.org/rss/1.0/modules/image/

Thu Feb  3 23:42:36 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c (strio_close, strio_close_read, strio_close_write):
	  should return nil instead of self as well as IO.  [ruby-dev:25623]

	* ext/stringio/stringio.c (strio_extend, strio_putc): fill with zero
	  extended portion.  [ruby-dev:25626]

Wed Feb  2 23:52:53 2005  sheepman  <sheepman@tcn.zaq.ne.jp>

	* ext/stringio/stringio.c (strio_truncate): should MEMZERO an extended
	  part.  [ruby-dev:25618]

Wed Feb  2 21:56:01 2005  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb (RSS::Element#convert): added.

	* lib/rss/rss.rb: convert -> need_convert.

	* lib/rss/1.0.rb: ditto.

	* lib/rss/0.9.rb: ditto.

	* lib/rss/2.0.rb: ditto.

	* lib/rss/trackback.rb: ditto.

Tue Feb  1 22:48:48 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb (DRb::DRbObject#respond_to?): check marshal_dump and
	  _dump.

Tue Feb  1 00:20:23 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (aix): fix linker flags on AIX.  [ruby-talk:125460]

Mon Jan 31 13:33:21 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: add invalid namespace check

	* ext/tk/lib/multi-tk.rb: add invalid_namespace? method

	* ext/tk/lib/remote-tk.rb: ditto

Mon Jan 31 10:29:18 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/irb/context.rb (IRB::Context::initialize): [ruby-core:04330]

Sat Jan 29 09:42:12 2005  Sam Roberts  <sroberts@uniserve.com>

	* lib/resolv.rb (Resolv::DNS::Resource::IN::SRV): Added RFC2782 SRV
	  resource record for specifying location of services.

Fri Jan 28 17:16:55 2005  Tanaka Akira  <akr@m17n.org>

	* lib/resolv.rb (Resolv::DNS::Config.parse_resolv_conf):
	  parse options line for ndots option.
	  (Resolv::Hosts#lazy_initialize): return self.
	  (Resolv::DNS#lazy_initialize): ditto.
	  (Resolv::DNS::Config#lazy_initialize): ditto.
	  Suggested by Sam Roberts.

Thu Jan 27 13:18:03 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* st.c (st_foreach): report success/failure by return value.
	  [ruby-Bugs-1396]

Thu Jan 27 00:15:29 2005  Minero Aoki  <aamine@loveruby.net>

	* test/fileutils/test_fileutils.rb (setup): support BSD-style
	  directory group inheritance. (backport from HEAD, rev 1.32)

	* test/fileutils/fileasserts.rb (assert_same_entry): show entry
	  difference. (backport from HEAD, rev 1.4)

Wed Jan 26 23:09:11 2005  Minero Aoki  <aamine@loveruby.net>

	* lib/net/protocol.rb (WriteAdapter#puts): should append \n, not
	  prepend. [ruby-talk:128302] (backport from HEAD, rev 1.75)

Wed Jan 26 10:51:50 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (flock_winnt, flock_win95): unlock file even if
	  LOCK_NB is specified. (backported from CVS HEAD)

Tue Jan 25 17:11:51 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ruby.c (proc_options): correct -T option in RUBYOPT. (backported
	  from CVS HEAD)

Tue Jan 25 14:05:52 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: fix SEGV bug; trouble on canceling remained
	  after scripts [ruby-dev:25479]: NULL current namespace when deleting
	    Tk interpreter [ruby-talk:126225]

	* ext/tcltklib/extconf.rb: bug fix; TCL_ENABLE_THREAD flag is inverted
	  [ruby-talk:126360]

	* ext/tcltklib/extconf.rb: add yet another native-thread check

	* ext/tk/tkutil.c: fix SEGV bug; NULL string pointer when finalize
	  Ruby interpreter

	* ext/tk/lib/multi-tk.rb: avoid warning for deleted safeTk ip frame

	* ext/tk/lib/tk/bindtag.rb: bug fix; new method of named bindtag
	  doesn't return the created object [ruby-dev:25479]

	* ext/tk/lib/tk/menu.rb: bug on treating arguments [ruby-dev:25479]

	* ext/tk/lib/tk.rb: bug fix; cannot accept a callback ID string for
	  a command argument [ruby-dev:25479]

	* ext/tk/lib/multi-tk.rb: ditto

	* ext/tk/lib/tk/*.rb: ditto

	* ext/tk/lib/tkextlib/*.rb: ditto

	* ext/tk/sample/demos-jp/anilabel.rb: new demo script

	* ext/tk/sample/demos-en/anilabel.rb: ditto

	* ext/tk/sample/tkHTML/ss.rb: local variable scope bug fix
	  [ruby-dev:25479]

Mon Jan 24 15:44:25 2005  Tilman Sauerbeck  <tilman@code-monkey.de>

	* lib/rdoc/parsers/parse_c.rb: allow whitespace after function names.
	  [ruby-core:4296]

	* lib/rdoc/parsers/parse_simple.rb: adds support for private comments
	  in the "simple" parser. [ruby-core:4301]

Mon Jan 24 15:44:25 2005  Charles Mills  <cmills@freeshell.org>

	* lib/rdoc/parsers/parse_c.rb: adds support for constants
	  (rb_define_const), accessors (rb_define_attr), and makes a
	  couple fixes. [ruby-core:4307]

Mon Jan 24 15:44:25 2005  Florian Gro  <florgro@gmail.com>

	* lib/rdoc/parsers/parse_rb.rb: Logic for def Builtin.method() end
	  [ruby-core:4302]

Mon Jan 24 15:44:25 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* document updates - [ruby-core:04296], [ruby-core:04301],
	  [ruby-core:04302], [ruby-core:04307]

Sun Jan 23 12:41:16 2005  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/wsdlDriver.rb: from 1.5.3-ruby1.8.2, operation which has
	  capitalized name (such as KeywordSearchRequest in AWS) is defined as
	  a method having uncapitalized name. (converted with
	  GenSupport.safemethodname to handle operation name 'foo-bar').  it
	  introduced serious incompatibility; in the past, it was defined as a
	  capitalized.

	  define capitalized method as well under that circumstance.

Sun Jan 23 05:24:42 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_ocsp.c (ossl_ocspreq_to_der): should call
	  GetOCSPReq at first.

Sat Jan 22 23:09:47 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/ssl.rb (accept): rescue SSLError. [druby-ja:110]

Sat Jan 22 22:35:03 2005  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/unix.rb: fail if UNIXFileOwner is set. [druby-ja:111]

Fri Jan 21 23:58:42 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/stringio/stringio.c (strio_set_pos): clear EOF flag.
	  [ruby-talk:127511]

Fri Jan 21 20:07:02 2005  Tanaka Akira  <akr@m17n.org>

	* lib/resolv.rb (Resolv::DNS::Config.resolv): don't raise ResolvError.
	  reported by Sam Roberts.  [ruby-talk:127133]

Fri Jan 21 16:58:10 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* dir.c (rb_push_glob): should work for NUL delimited patterns.

Fri Jan 21 13:58:37 2005  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (u8tou16): fixed typo. fixed: [ruby-list:40546]
	  (backported from CVS HEAD)

Fri Jan 21 09:30:16 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* rubyio.h (rb_eof_error): should mark as NORETURN. (backported
	  from CVS HEAD)

Fri Jan 21 00:31:36 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/syck/rubyext.c (syck_parser_bufsize_set): avoid VC++ warning
	  "local variable 'size' used without having been initialized".

Thu Jan 20 19:03:24 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/extmk.rb (extmake): shouldn't set $extflags on mswin32.

	* win32/Makefile.sub (LIBRUBY_SO): should use $DLDOBJS instead of
	  $EXTOBJS.
	  fixed: [ruby-core:04290] (backported from CVS HEAD)

Thu Jan 20 11:42:02 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_new4): should propagate taintedness.

	* struct.c (rb_struct_set): use original method name, not callee
	  name, to retrieve member slot.  [ruby-core:04268]

	* time.c (time_strftime): protect from format modification from GC
	  finalizers.

Wed Jan 19 18:06:40 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* lib/ipaddr.rb (to_s, test_to_s): too many colons with some cases.
	  (backported from CVS HEAD)

Wed Jan 19 01:16:30 2005  Tanaka Akira  <akr@m17n.org>

	* lib/resolv.rb (Resolv::DNS::Config.parse_resolv_conf): ignore
	  domain and search directive without an argument.
	  reported by Sam Roberts.  [ruby-talk:126781]

Tue Jan 18 15:03:05 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/ssl.rb (WEBrick::Config::SSL): the default value
	  of :SSLEnable is false.

	* lib/webrick/server.rb (WEBrick::Daemon.start): prepared stdio
	  don't allow changing its mode.

	* lib/webrick/httpproxy.rb (WEBrick::HTTPProxyServer#proxy_service):
	  should delete trailing LF from the result of pack("m*").

	* lib/webrick/httpproxy.rb (WEBrick::HTTPProxyServer#proxy_connect):
	  - should delete trailing LF from the result of pack("m*").
	  - clear Request-Line not to send the response by HTTPServer#run.

	* lib/webrick/httputils (WEBrick::HTTPUtils.parse_qvalues):
	  refine regexp (and change the name of a local variable).

	* lib/webrick/httputils.rb (WEBrick::HTTPUtils#escape_path): add
	  new method to escape URI path component.

	* lib/webrick/cgi.rb (WEBrick::CGI::Socket#request_line): should
	  escape SCRIPT_NAME and PATH_INFO before being parsed as a URI.

	* test/webrick/*, sample/webrick/httpproxy.rb: add new file.

Mon Jan 17 23:33:46 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (aix): fix typo.  [ruby-talk:126401]

Mon Jan 17 07:08:51 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/readline/readline.c: suppress warnings.

	* lib/irb/extend-command.rb (IRB::ContextExtender.def_extend_command):
	  ditto.

	* lib/irb/ext/history.rb (IRB::Context::set_last_value): ditto.

	* lib/irb/ext/history.rb (IRB::Context::eval_history): ditto.

	* lib/irb/locale.rb (IRB::Locale::real_load): ditto.

	* lib/irb/slex.rb (SLex::Node::create_subnode): remove garbage.

Mon Jan 17 00:09:42 2005  WATANABE Hirofumi  <eban@ruby-lang.org>

	* lib/uri/common.rb (PORT): typo fix. fixed: [ruby-core:04256]

Sat Jan 15 14:57:22 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ruby.c (proc_options): ignore trailing CRs at the end of short
	  options as well as long options.  fixed: [ruby-core:04232]

Sat Jan 15 13:35:16 2005  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb (RSS::VERSION): 0.1.2 -> 0.1.3.

	* lib/rss/rss.rb: accept inheritance. [ruby-talk:126104]

Thu Jan 13 04:48:53 2005  Tanaka Akira  <akr@m17n.org>

	* io.c (io_fread): don't warn nonblocking behavior by default.

Wed Jan 12 00:36:29 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* object.c (rb_class_superclass): superclass of singleton class also
	  should be a singleton class.  fixed: [ruby-list:40519]

Tue Jan 11 09:44:40 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* numeric.c (Init_Numeric): turn off floating point exceptions
	  on bcc32. "1e300".to_f had crashed by overflow.

Tue Jan 11 03:10:10 2005  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (copy_entry): could not copy symbolic link.
	  [ruby-talk:125733]

	* lib/fileutils.rb (copy_stream): use read/write instead of
	  sysread/syswrite.

Mon Jan 10 23:08:15 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* variable.c (rb_autoload): hide internal data from ruby level.
	  fixed: [ruby-dev:25435], [ruby-list:40498]

Mon Jan 10 01:22:55 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* gc.c (rb_data_object_alloc): klass may be NULL.
	  [ruby-list:40498]

Sun Jan  9 03:12:58 2005  Tanaka Akira  <akr@m17n.org>

	* io.c (io_fread): warn nonblocking behavior.
	  (io_readpartial): new method IO#readpartial.

Sat Jan  8 04:38:47 2005  why the lucky stiff  <why@ruby-lang.org>

	* lib/yaml.rb: Kernel#y requires an argument.

Fri Jan  7 21:12:29 2005  TAMURA Takashi  <sheepman@tcn.zaq.ne.jp>

	* random.c (rand_init): use ALLOC_N instead of ALLOCA_N
	  [ruby-dev:25426]

Fri Jan  7 18:03:35 2005  Tanaka Akira  <akr@m17n.org>

	* gc.c (mark_locations_array): avoid core dump with -O3.
	  [ruby-dev:25424]

Thu Jan  6 20:31:07 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/zlib/zlib.c (zstream_end): should return value. (backported
	  from CVS HEAD)

Thu Jan  6 19:55:13 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* win32/win32.c (rb_w32_close): didn't close socket handle.
	  [ruby-dev:25414]

	* win32/win32.c (rb_w32_open_osfhandle): bcc32's _open_osfhandle
	  never set EMFILE.

Thu Jan  6 17:14:31 2005  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* random.c (random_seed): O_NONBLOCK isn't defined on some
	  platforms. [ruby-dev:25417]

Thu Jan  6 13:45:35 2005  Tanaka Akira  <akr@m17n.org>

	* lib/time.rb: recognize +00:00 and GMT as a localtime.

Thu Jan  6 07:58:28 2005  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/usage.rb (RDoc::RDoc.usage_no_exit): Allow for colons
	  in path names on DOS machines. (thanks to Johan Nilsson)

Wed Jan  5 20:16:32 2005  Tanaka Akira  <akr@m17n.org>

	* random.c (limited_big_rand): didn't work if SIZEOF_BDIGITS == 2.
	  [ruby-dev:25408]

	* random.c (random_seed): refined.

Wed Jan  5 12:49:39 2005  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_thread_initialize): Thread objects cannot be initialized
	  again.  fixed: [ruby-core:04067]

Wed Jan  5 10:48:16 2005  NAKAMURA Usaku  <usa@ruby-lang.org>

	* dir.c (dir_s_mkdir): win32 special processing doesn't need any
	  longer. (backported from CVS HEAD)

	* win32/win32.[ch] (rb_w32_mkdir): new function. POSIX.1 compatible
	  interface. (backported from CVS HEAD)

	* win32/win32.[ch] (rb_w32_rmdir): new function. (backported from CVS
	  HEAD)

Wed Jan  5 02:30:11 2005  Tanaka Akira  <akr@m17n.org>

	* random.c (init_by_array): imported from mt19937ar-cok.tgz.
	  (genrand_int32): ditto.
	  (genrand_real): replaced with genrand_res53 in mt19937ar-cok.
	  (rand_init): support bignum for longer seed.
	  (random_seed): generate longer seed.
	  (make_mask): new function.
	  (limited_rand): ditto.
	  (limited_big_rand): ditto.
	  (rb_f_rand): call limited_rand and limited_big_rand.
	  [ruby-dev:25403]

Tue Jan  4 23:25:29 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* bignum.c (rb_big_rand): should return positive random number.
	  [ruby-dev:25401]

Tue Jan  4 11:15:29 2005  TAMURA Takashi  <sheepman@tcn.zaq.ne.jp>

	* bignum.c (rb_big_rand): do not use rb_big_modulo to generate
	  random bignums.  [ruby-dev:25396]

Mon Jan  3 14:01:54 2005  Tanaka Akira  <akr@m17n.org>

	* random.c (random_seed): don't use /dev/urandom if it is not
	  character device.

Mon Jan  3 11:37:42 2005  Tanaka Akira  <akr@m17n.org>

	* random.c (random_seed): use /dev/urandom if available.
	  [ruby-dev:25392]

Mon Jan  3 07:46:42 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httpauth/htpasswd.rb (WEBrick::Htpasswd#reload):
	  raise NotImplementedError if password is encrypted by digest
	  algorithms. This patch is contributed by sheepman. [ruby-list:40467]

	* lib/webrick/httpauth/digestauth.rb
	  (WEBrick::HTTPAuth::DigestAuth#_authenticate): fix digest calculation.
	  This patch is contributed by sheepman. [ruby-list:40482]

	* lib/webrick/{httpauth.rb,httpauth/basicauth.rb,httpproxy.rb}: use
	  pack/unpack-template char "m" instead of lib/base64.rb to do base64
	  encoding/decoding. fixed: [ruby-dev:25336]

	* test/webrick/test_httpauth.rb: new file.

Sat Jan  1 04:20:23 2005  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_ns_spki.c (ossl_spki_set_challenge): should call
	  StringValue before GetSPKI. fixed: [ruby-dev:25359].

Sat Jan  1 01:13:28 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* variable.c (rb_autoload): [ruby-dev:25373]

Fri Dec 31 14:10:43 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/ri/ri_formatter.rb (RI::TextFormatter::display_flow_item): Fix problem
	  if heading contains formatting.

Thu Dec 30 00:41:42 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (svalue_to_avalue): [ruby-dev:25366]

	* string.c (rb_str_justify): [ruby-dev:25367]

Wed Dec 29 11:07:07 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/template/html/kilmer.rb: Update to use new
	  sections.

Tue Dec 28 22:31:46 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_justify): create buffer string after argument type
	  conversion.  fixed: [ruby-dev:25341]

Tue Dec 28 15:41:48 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/nkf/nkf-utf8/nkf.c (reinit): should initialize all static
	  variables.  fixed: [ruby-list:40445]

Tue Dec 28 15:25:20 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/nkf/lib/kconv.rb (Kconv::RegexpEucjp): second byte is up to
	  0xfe.

	* ext/nkf/lib/kconv.rb (Kconv#kconv): should handle UTF8 and UTF16
	  properly.

Tue Dec 28 13:35:20 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/zlib/zlib.c (rb_deflate_s_deflate, rb_inflate_s_inflate): ensure
	  freeing internal zstreams.  fixed: [ruby-dev:25309]

	* ext/zlib/zlib.c (rb_deflate_init_copy): replace rb_deflate_clone.

Tue Dec 28 12:26:45 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/Makefile.sub, win32/setup.mak (RDOCTARGET, install,
	  install-nodoc, install-doc): rdoc support for mswin32.

	* win32/configure.bat (--enable-install-doc, --disable-install-doc):
	  ditto.

Mon Dec 27 20:02:14 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: fix SEGV bug when deleting Tk interp

	* ext/tk/lib/multi-tk.rb: ditto

Mon Dec 27 16:55:17 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_x509name.c (Init_ossl_x509name): should use
	  rb_hash_new to get exactly a Hash. fix [ruby-dev:25325].

Mon Dec 27 16:29:56 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_justify): [ruby-dev:25341]

Mon Dec 27 15:47:48 2004  Minero Aoki  <aamine@loveruby.net>

	* test/fileutils/fileasserts.rb: sync with HEAD.

	* test/fileutils/test_fileutils.rb: ditto.

	* test/fileutils/test_nowrite.rb: ditto.

Mon Dec 27 15:21:07 2004  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (mv): should raise error when moving a
	  directory to the (empty) directory. [ruby-talk:124368]
	  (backport from HEAD 1.48)

	* lib/fileutils.rb (mv): wrongly did not overwrite file on Win32
	  platforms. (backport from HEAD 1.48)

Sat Dec 25 11:11:48 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* stable version 1.8.2 released.

Sat Dec 25 04:23:49 2004  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (mkdir, mkdir_p): should ensure directory
	  permission. (backportted from HEAD, 1.47)

	* lib/fileutils.rb (traverse, remove_dir): untaint trasted
	  objects. (backportted from HEAD, 1.46)

Sat Dec 25 01:28:23 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c: cancel io_reopen() change on Dec. 24th.

	* dln.c: use <dlfcn.h> for NetBSD.  [ruby-dev:25313]

	* io.c (rb_f_select): IO list could be altered.  [ruby-dev:25312]

Fri Dec 24 23:51:48 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* bcc32/Makefile.sub: bcc32 should use RTL dll (backport from HEAD)
	  [ruby-dev:25306]

	* win32/win32.[ch]: ditto.

Fri Dec 24 23:27:18 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/image.rb: TkPhotoImage#cget bug fix

Fri Dec 24 18:39:25 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* win32/win32.[ch]: failed to compile on bcc32 (and probably wince)
	  [ruby-dev:25306]

Fri Dec 24 02:52:52 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (io_reopen, rb_io_reopen): prohibit to change access mode for
	  special IO ports.  [ruby-dev:25225]

Fri Dec 24 02:22:53 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/syck/rubyext.c (rb_syck_io_str_read): [ruby-core:03973]

	* ext/syck/rubyext.c (syck_loader_transfer): check type conversion.

	* ext/syck/rubyext.c (syck_parser_assign_io, rb_new_syck_node): duck
	  typing.

	* ext/syck/rubyext.c (syck_parser_s_alloc, syck_parser_initialize):
	  allocation framework.

	* ext/syck/rubyext.c (syck_emitter_s_alloc, syck_emitter_initialize):
	  ditto.

Fri Dec 24 01:21:00 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tkextlib/blt.rb: add BLT extension support

	* ext/tk/lib/tkextlib/blt/*.rb: ditto

	* ext/tk/lib/tkextlib/blt/tile/*.rb: ditto

Thu Dec 23 23:36:28 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* process.c (proc_setgroups): check if the argument lenght is
	  modified.  fixed: [ruby-dev:25285]

Thu Dec 23 13:13:33 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: define TclTkLib::COMPILE_INFO and
	  RELEASE_DATE

	* ext/tcltklib/extconf.rb: ditto

	* ext/tk/tkutil.c: define TkUtil::RELEASE_DATE

	* ext/tk/lib/tk.rb: define Tk::RELEASE_DATE

Thu Dec 23 09:38:31 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (io_reopen): restore exact mode.  fixed: [ruby-core:04003]

Thu Dec 23 00:16:32 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (bsdi): use $(CC) for LDSHARED.  fixed [ruby-dev:25270]

Wed Dec 22 11:14:55 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_mode_modenum): replace O_ACCMODE with O_RDWR.
	  fixed: [ruby-dev:25273]

Wed Dec 22 08:34:32 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/dl/sym.c (rb_dlsym_initialize): extract internal pointers after
	  all argument conversion.  fixed: [ruby-dev:25271]

Wed Dec 22 00:08:01 2004  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/*, test/soap/*, sample/soap/authheader/*: eval cleanup.

Tue Dec 21 22:07:33 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_asn1.c (ossl_asn1_traverse, ossl_asn1_decode,
	  ossl_asn1_decode_all): temporary value should be marked volatile.

Tue Dec 21 14:40:02 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_asn1.c (ossl_asn1_traverse, ossl_asn1_decode,
	  ossl_asn1_decode_all): use rb_str_new4 to avoid SEGV.
	  fix [ruby-dev:25261]

	* test/openssl/test_asn1.rb: add tests for OpenSSL::ASN1.

Tue Dec 21 12:22:40 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (io_reopen): keep duplex pipe in correct mode for exception
	  safeness.  fixed: [ruby-dev:25152]

Tue Dec 21 12:10:04 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/grid.rb: rescue bug of 'grid configure' on Tcl/Tk8.3-

Tue Dec 21 00:53:01 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/openssl/ossl_asn1.c (ossl_asn1_traverse): [ruby-dev:25261]

	* ext/openssl/ossl_asn1.c (ossl_asn1_decode): ditto.

	* ext/openssl/ossl_asn1.c (ossl_asn1_decode_all): ditto.

Mon Dec 20 23:22:26 2004  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* added files:
	  * lib/soap/mapping/wsdl*.rb
	  * lib/wsdl/soap/element.rb
	  * lib/wsdl/xmlSchema/simpleContent.rb

	* modified files:
	  * lib/soap/*
	  * lib/wsdl/*
	  * lib/xsd/*
	  * test/soap/*
	  * test/wsdl/*
	  * test/xsd/*
	  * sample/soap/*
	  * sample/sdl/*

	* summary
	  * imported from the soap4r repository.  Version: 1.5.3-ruby1.8.2

	  * added several XSD basetype support: nonPositiveInteger,
	    negativeInteger, nonNegativeInteger, unsignedLong, unsignedInt,
	    unsignedShort, unsignedByte, positiveInteger

	  * HTTP client connection/send/receive timeout support.

	  * HTTP client/server gzipped content encoding support.

	  * improved WSDL schema definition support; still is far from
	    complete, but is making step by step improovement.

Mon Dec 20 22:56:39 2004  Tanaka Akira  <akr@m17n.org>

	* gc.c (stack_end_address): gcc noinline attribute is available since
	  gcc-3.1.

Mon Dec 20 14:07:02 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: supports new features of Tcl/Tk8.5a2

	* ext/tk/lib/tk/clock.rb: ditto

	* ext/tk/lib/tk/text.rb: ditto

	* ext/tk/lib/tk/panedwindow.rb: ditto

Mon Dec 20 12:47:13 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/lib/net/https.rb,protocols.rb,telnets.rb: delete
	  doc and code about SSLContext#{key_file,cert_file}.
	  fixed: [ruby-dev:25243]

Mon Dec 20 12:42:17 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* io.c (io_fwrite): workaround for MSVCRT's bug.
	  fixed: [ruby-core:03982]

Mon Dec 20 11:21:04 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_eof): check if closed before clearerr().
	  fixed: [ruby-dev:25251]

Mon Dec 20 03:30:40 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/cgi/session.rb (CGI::Session#initialize): empty session id was
	  used if request had no session key.  fixed: [ruby-core:03981]

Mon Dec 20 01:51:01 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* struct.c (make_struct): [ruby-dev:25249]

Mon Dec 20 00:28:20 2004  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/encodings/SHIFT-JIS.rb: backported from CVS HEAD.

	* lib/rexml/encodings/SHIFT_JIS.rb: ditto.

Sun Dec 19 17:19:48 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_x509store.c
	  (ossl_x509store_set_time): add OpenSSL::X509::Store#time=.
	  (ossl_x509stctx_set_time): add OpenSSL::X509::StoreContext#time=.

	* test/openssl/ossl_x509store.rb: test certificate validity times.

	* ext/openssl/ossl_x509name.c (ossl_x509name_to_s): add optional
	  second argument to specify the output format (see also
	  X509_NAME_print_ex).

	* ext/openssl/ossl_x509name.c (ossl_x509name_init): new constants:
	  OpenSSL::X509::Name::COMPAT, OpenSSL::X509::Name::RFC2253,
	  OpenSSL::X509::ONELINE, OpenSSL::X509::MULTILINE.

	* ext/openssl/lib/openssl/x509.rb (OpenSSL::X509::Name::RFC2253DN):
	  new module to provide the parse for RFC2253 DN format.

	* ext/openssl/lib/openssl/x509.rb (OpenSSL::X509::Name.parse_rfc2253):
	  new method to parse RFC2253 DN format.

	* test/openssl/ossl_x509name.rb: add tests about RFC2253 DN.

	* text/openssl/ssl_server.rb: try to listen ports from 20443 to 20542
	  while EADDRINUSE is raised.

	* all changes in this entry are backport from 1.9.

Sun Dec 19 17:24:59 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (enable_rpath): use rpath flag to embed the library
	  path into extensions on ELF environment.  [ruby-dev:25035]

Sun Dec 19 11:01:25 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/test/unit.rb: use standalone runner for -e.

	* lib/test/unit/autorunner.rb (Test::Unit::AutoRunner#options): accept
	  multiple -p and -x options.

	* lib/test/unit/collector/dir.rb (Test::Unit::Collector::Dir#recursive_collect):
	  ditto.

Sat Dec 18 16:36:23 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/zlib/zlib.c (rb_deflate_s_deflate, rb_inflate_s_inflate):
	  disallow interrupt by type conversion.  fixed: [ruby-dev:25226]

Sat Dec 18 15:16:41 2004  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/webrick/httpauth.rb,
	  lib/webrick/httpauth/{basicauth.rb,digestauth.rb}: use
	  pack/unpack-template char "m" instead of lib/base64.rb to do base64
	  encoding/decoding.

Sat Dec 18 10:51:01 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* dir.c (dir_open_dir): new function.  [ruby-dev:25242]

Fri Dec 17 18:07:01 2004  Shugo Maeda  <shugo@ruby-lang.org>

	* test/readline/test_readline.rb: fix for BSD. Thanks, GOTOU Yuuzou.
	  fixed: [ruby-dev:25218]

Fri Dec 17 16:28:12 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: fix bug on setting up system encoding

	* ext/tk/lib/tk/event.rb: fix error on require process

	* ext/tk/lib/tk/font.rb: fix abnormal termination error on Windows

	* ext/tk/lib/tk/virtevent.rb: TkVirtualEvent::PreDefVirtEvent.new()
	  accepts event-sequence arguments

	* ext/tk/lib/tk/text.rb: fail to dump embedded images

	* ext/tk/lib/tk/text.rb: tag_nextrange and tag_prevrange returns wrong
	  types of values

	* ext/tk/lib/tk/texttag.rb: nextrange and prevrange returns wrong
	  types of values

	* ext/tk/lib/tk/text.rb: add TkText::IndexModMethods module and
	  TkText::IndexString class to treat text index modifiers

	* ext/tk/lib/tk/texttag.rb: use TkText::IndexModMethods module

	* ext/tk/lib/tk/textmark.rb: ditto

	* ext/tk/lib/tk/textimage.rb: ditto

	* ext/tk/lib/tk/textwindow.rb: ditto

	* ext/tk/lib/tk/textimage.rb: wrong gravity of text mark for embedded
	  image

	* ext/tk/lib/tk/textwindow.rb: wrong gravity of text mark for
	  embedded window

Fri Dec 17 13:50:00 2004  Akiyoshi, Masamichi  <akiyoshi@hp.com>

	* vms/vmsruby_private.c, vms/vmsruby_private.h: private routines
	  for VMS port are added.

	* eval.c (ruby_init): change to call VMS private intialization routine.

Fri Dec 17 13:33:58 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/cgi/session.rb (CGI::Session#initialize): control adding
	  session_id hidden fields.  fixed: [ruby-talk:123850]

Thu Dec 16 23:25:25 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb, lib/drb/ssl.rb: backported from CVS HEAD.
	  [druby-ja:101]

	* test/drb/test_drb.rb: adjust and reduce sleep (backported from
	  CVS HEAD.)

Thu Dec 16 18:44:58 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httpserver.rb (WEBrick::HTTPServer#run): should wait
	  for reading request till data arrive. [ruby-talk:121068]

	* lib/webrick/server.rb (WEBrick::GenericServer#start_thread):
	  should log about all accepted socket. [ruby-core:03962]

	* lib/webrick/accesslog.rb (WEBrick::AccessLog#setup_params):
	  "%%" and "%u" are supported. [webricken:135]

	* lib/webrick/httpservlet/filehandler.rb
	  (WEBrick::HTTPServlet::FileHandler#check_filename):
	  :NondisclosureName is acceptable if it is Enumerable.

	* lib/webrick/config.rb (WEBrick::Config::FileHandler):
	  default value of :NondisclosureName is [".ht*", "*~"].

Thu Dec 16 18:36:52 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl.c (ossl_raise): refine message format.

Thu Dec 16 16:29:44 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/sample/demos-en/widget: modify version check for
	  supporting features

Thu Dec 16 16:03:50 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/bindtag.rb: bug fix [ruby-talk: 123667]

	* ext/tk/lib/tk/timer.rb: accept :idle for the interval argument

	* ext/tk/lib/tk.rb: add TkComm._callback_entry?()

	* ext/tk/lib/multi-tk.rb: add MultiTkIp.cb_entry_class

	* ext/tk/lib/tk/canvas.rb: use TkComm._callback_entry?()

	* ext/tk/lib/tk/canvastag.rb: ditto

	* ext/tk/lib/tk/dialog.rb: ditto

	* ext/tk/lib/tk/optiondb.rb: ditto

	* ext/tk/lib/tk/text.rb: ditto

	* ext/tk/lib/tk/texttag.rb: ditto

	* ext/tk/lib/tk/textwindow.rb: ditto

	* ext/tk/lib/tk/timer.rb: ditto

	* ext/tk/lib/tk/validation.rb: ditto

	* ext/tk/lib/tkextlib/*: ditto

Thu Dec 16 03:14:28 2004  Minero Aoki  <aamine@loveruby.net>

	* lib/net/http.rb (basic_encode): return value of pack('m') may
	  include multiple CR/LFs.  Backported from main trunk (rev 1.112).
	  [ruby-dev:25212]

Thu Dec 16 00:33:37 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* hash.c (Init_Hash): remove custom "hash" and "eql?".

Wed Dec 15 18:57:01 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/set.rb (Set::eql): wrong definition.  [ruby-dev:25207]

Wed Dec 15 18:48:42 2004  Shugo Maeda  <shugo@ruby-lang.org>

	* ext/curses/curses.c (window_subwin): call NUM2INT() before
	  GetWINDOW(). (backported from CVS HEAD)

Wed Dec 15 17:03:50 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.[ch] (rb_w32_isatty): new function to replace MSVCRT's
	  isatty because it never sets errno. (backported from CVS HEAD)

Wed Dec 15 15:39:32 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_x509name.c (ossl_x509name_to_a): avoid SEGV
	  (rollback the previous commit).

Wed Dec 15 16:10:23 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* object.c (rb_obj_id_obsolete): warn always.

	* eval.c (rb_enable_super): ditto.

Wed Dec 15 15:31:02 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/set.rb (Set#==): [ruby-dev:25206]

Wed Dec 15 14:22:10 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (rb_w32_fdisset): check whether the handle is valid.
	  fixed: [ruby-core:03959]

Wed Dec 15 10:30:37 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/openssl/ossl_digest.c (ossl_digest_initialize): [ruby-dev:25198]

Tue Dec 14 17:10:09 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (rb_w32_close): need to reset osfhnd().

Tue Dec 14 14:03:57 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl.c (ossl_raise): avoid buffer overrun.
	  [ruby-dev:25187]

Tue Dec 14 12:36:04 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/cgi/session.rb (CGI::Session::initialize): generate new
	  session if given session_id does not exist.  [ruby-list:40368]

Mon Dec 13 18:13:52 2004  Tanaka Akira  <akr@m17n.org>

	* gc.c (stack_end_address): new function to obtain stack end address.
	  stack_end_address calls __builtin_frame_address(0) to obtain the
	  frame pointer of a stack frame of stack_end_address.  The address
	  is the stack pointer of the caller's stack frame.
	  (SET_STACK_END): use stack_end_address.
	  This makes the conservative garbage collector to scan a stack frame
	  of the garbage_collect function itself.  This is required because
	  callee-save registers may be stored in the frame.
	  [ruby-dev:25158]

Mon Dec 13 00:58:02 2004  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb (cleanpath_aggressive): make it private.
	  (cleanpath_conservative): ditto.
	  Suggested by Daniel Berger.  [ruby-core:3914]

Sun Dec 12 20:06:38 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb: backported from CVS HEAD.

Sun Dec 12 10:35:10 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/template/html/html.rb (RDoc::Page): Don't
	  show an accessor's r/w flag if none was specified

Sun Dec 12 10:14:03 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/rdoc.rb (RDoc::RDoc::parse_files): Never exclude files
	  explicitly given on the command line.

Sun Dec 11 23:54:07 2005  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/*: update to support libraries in ActiveTcl8.4.12.0
	  (see ext/tk/ChangeLog.tkextlib).

	* ext/tk/sample/scrollframe.rb: add a new sample.

Sat Dec 11 20:12:21 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb: add DRbRemoteError. [ruby-list:40348],
	  [ruby-list:40390]

	* test/drb/drbtest.rb: ditto.

	* test/drb/ut_drb.rb: ditto.

Sat Dec 11 15:38:14 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/jcode.rb (String::succ): [ruby-dev:25156]

Sat Dec 11 12:41:55 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* eval.c (run_trap_eval): prototype; avoid VC++ warnings.

	* ext/socket/getaddrinfo.c: fix typo. fixed: [ruby-core:03947]

	* win32/win32.c: need to include dln.h.

Sat Dec 11 00:10:18 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (io_reopen): [ruby-dev:25150]

Fri Dec 10 08:39:27 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/socket/socket.c (sock_listen): get OpenFile just before calling
	  listen(2).  fixed: [ruby-dev:25149]

Thu Dec  9 17:00:00 2004  Akiyoshi, Masamichi  <akiyoshi@hp.com>

	* ext/socket/socket.c, ext/socket/getaddrinfo.c: port to VMS

Thu Dec  9 16:31:02 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/sdbm/init.c (GetDBM): typo.

Thu Dec  9 16:05:00 2004  Akiyoshi, Masamichi  <akiyoshi@hp.com>

	* defines.h: change path of vms.h
	* vms/vms.h: delete reference for snprintf()
	* vms/config.h: new file
	* vms/config.h_in: deleted

Thu Dec  9 14:38:35 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_inspect): escape # which starts an expression
	  substitution.  fixed: [ruby-core:03922]

	* string.c (rb_str_dump): not escape # which isn't a substitution.

Thu Dec  9 10:54:36 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/dbm/dbm.c (fdbm_select): [ruby-dev:25132]

	* ext/sdbm/init.c: ditto.

	* ext/gdbm/gdbm.c: ditto.

Thu Dec  9 03:08:36 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c (ip_init): set root-win title to "ruby" when
	  the running script is '-e one-liner' or '-' (stdin).

	* ext/tcltklib/extconf.rb: add find_library("#{lib}#{ver}",..) for
	  stub libs

	* ext/tk/lib/tk/textmark.rb: TkTextMarkCurrent and TkTextMarkAnchor
	  have a wrong parent class.

	* ext/tk/lib/tk/dialog.rb: rename TkDialog2 --> TkDialogObj and
	  TkWarning2 --> TkWarningObj (old names are changed to alias names)

	* ext/tk/lib/tk/dialog.rb: bug fix of treatment of 'prev_command'
	  option and hashes for configuration

	* ext/tk/lib/tk/dialog.rb: add TkDialogObj#name to return the
	  button name

	* ext/tk/lib/tk/radiobutton.rb: rename enbugged method value() ==>
	  get_value() and value=(val) ==> set_value(val).

	* ext/tk/lib/tk/menu.rb: add TkMenu.new_menuspec

	* ext/tk/lib/tk/menu.rb: add alias (TkMenuButton = TkMenubutton,
	  TkOptionMenuButton = TkOptionMenubutton)

	* ext/tk/lib/tk/event.rb: new method aliases (same as option keys of
	  event_generate) for Event object

	* ext/tk/lib/tk/font.rb: configinfo returns proper types of values

	* ext/tk/lib/tk.rb: bind methods accept subst_args + block

	* ext/tk/lib/tk/canvas.rb: ditto

	* ext/tk/lib/tk/canvastag.rb: ditto

	* ext/tk/lib/tk/frame.rb: ditto

	* ext/tk/lib/tk/text.rb: ditto

	* ext/tk/lib/tk/texttag.rb: ditto

	* ext/tk/lib/tk/toplevel.rb: ditto

	* ext/tk/lib/tkextlib/*: ditto and bug fix

Wed Dec  8 23:54:29 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/template/html/html.rb (RDoc::Page): Typo
	  meant that h2 tag was invisible.

Wed Dec  8 21:56:31 2004  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss, test/rss, sample/rss: backported from CVS HEAD.

Wed Dec  8 14:31:36 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (io_fwrite): change dereference for cosmetic reason.

	* sprintf.c (rb_f_sprintf): [ruby-dev:25104]

Tue Dec  7 19:08:00 2004  Akiyoshi, Masamichi  <akiyoshi@hp.com>

	* io.c (io_fwrite): fix offset incrementation (for VMS and Human68k)

Tue Dec  7 00:27:37 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* process.c (proc_setgroups): [ruby-dev:25081]

Mon Dec  6 18:08:10 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* re.c (rb_reg_eqq): document fix.  [ruby-talk:122541]

Mon Dec  6 17:19:13 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* rubysig.h (TRAP_BEG, TRAP_END): safe errno around CHECK_INTS.
	  (backported from CVS HEAD)  [ruby-dev:24993]

Mon Dec  6 10:18:17 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::look_for_directives_in):
	  Oops - 1.8 doesn't have String#clear

Mon Dec  6 09:59:23 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/socket/socket.c (sock_connect): use rb_str_new4().
	  [ruby-dev:25052]

Mon Dec  6 01:42:08 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_pkey_rsa.c (ossl_rsa_public_encrypt,
	  ossl_rsa_public_decrypt, ossl_rsa_private_encrypt,
	  ossl_rsa_private_decrypt): should take an optional argument
	  to specify padding mode. [ruby-talk:122539]

	* ext/openssl/ossl_pkey_rsa.c (Init_ossl_rsa): add new constants
	  PKCS1_PADDING, SSLV23_PADDING, NO_PADDING and PKCS1_OAEP_PADDING
	  under OpenSSL::PKey::RSA.

	* test/openssl/test_pkey_rsa.rb: new file.

Sun Dec  5 19:39:17 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb (OptionParser::Completion#complete): new parameter
	  to direct case insensitiveness.

	* lib/optparse.rb (OptionParser#order!): ignore case only for long
	  option.  [ruby-dev:25048]

Sat Dec  4 22:54:15 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (io_write): remove rb_str_locktmp().  [ruby-dev:25050]

	* io.c (io_fwrite): takes VALUE string as an argument.
	  [ruby-dev:25050]

	* ext/socket/socket.c (sock_connect): remove rb_str_locktmp().
	  [ruby-dev:25050]

	* ext/socket/socket.c (udp_connect): [ruby-dev:25045]

	* ext/socket/socket.c (udp_bind): ditto.

	* ext/socket/socket.c (udp_send): ditto.

	* ext/socket/socket.c (bsock_send): ditto.

	* ext/socket/socket.c (s_recvfrom): ditto.

	* hash.c (rb_hash_hash): should provide "hash" method where "eql?"
	  is redefined.  [ruby-talk:122482]

Sat Dec  4 14:54:52 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* eval.c (proc_invoke): use volatile `tmp' rather than `args'.
	  [ruby-core:03882]

Sat Dec  4 14:28:56 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/code_objects.rb (RDoc::Context::Section::set_comment):
	  Section comments may now be bracketed by lines which are
	  ignored. You can now write
	      # -----------
	      # :section: Dave's Section
	      # comment material
	      # -----------
	   The lines before :section: are removed, and identical lines at the end are
	   also removed if present.

Sat Dec  4 03:33:45 2004  Shugo Maeda  <shugo@ruby-lang.org>

	* ext/readline/readline.c: check $SAFE. (backported from CVS HEAD)

	* test/readline/test_readline.rb: added tests for readline.
	  (backported from CVS HEAD)

Sat Dec  4 02:24:00 2004  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/nkf/nkf.c: add constant NKF::VERSION

	* ext/nkf/nkf.c(guess): this becomes an alias of guess2

	* ext/nkf/test.rb(mime_out2): add --no-cp932

	* ext/nkf/nkf-utf8/nkf.c: original nkf2 revision 1.47

Sat Dec  4 00:35:08 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/socket/socket.c (bsock_setsockopt): [ruby-dev:25039]

Fri Dec  3 18:57:03 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/ostruct.rb: 1.9 marshaling support back-ported.
	  [ruby-core:03871]

Fri Dec  3 13:45:20 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (proc_invoke): copy arguments to frame.argv.
	  [ruby-core:03861]

Fri Dec  3 12:25:41 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* st.h: fix prototypes.

Fri Dec  3 00:21:05 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* object.c (convert_type): use rb_respond_to() again.
	  [ruby-dev:25021]

	* eval.c (rb_respond_to): funcall respond_to? if it's redefined.
	  [ruby-dev:25021]

Fri Dec  3 01:55:24 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: widget configuration by TkWindow#method_missing
	  returns proper object. "widget.option = val" returns val, and
	  "widget.option(val)" returns self.

	* ext/tk/lib/tk/font.rb: TkFont#replace accepts only one font argument.

	* ext/tk/lib/tk/radiobutton.rb: add TkRadiobutton#value and
	  TkRadiobutton#value=(val).

	* ext/tk/lib/tk/spinbox.rb: callback substitution support on
	  command option.

	* ext/tk/sample/demos-en/widget: bug fix (wrong image height)

	* ext/tk/sample/demos-jp/widget: ditto.

Fri Dec  3 00:11:48 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (rb_file_initialize): [ruby-dev:25032]

Thu Dec  2 16:41:03 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_protect): prevent continuations created inside from being
	  called from the outside.  [ruby-dev:25003]

	* eval.c (rb_callcc, rb_cont_call): prohibit calling from different
	  signal contexts.  [ruby-dev:25022]

Thu Dec  2 09:57:24 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/ostruct.rb (OpenStruct::Marshaler): OpenStruct can be
	  marshaled again.  [ruby-core:03862]

Thu Dec  2 09:30:06 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (thread_mark): mark thread group.  [ruby-dev:25020]

	* eval.c (thgroup_add): check whether the argument is really a Thread.

Thu Dec  2 07:57:16 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (rb_io_ctl): [ruby-dev:25019]

Wed Dec  1 02:21:02 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* signal.c (sighandler): call handler immediately only for default
	  handlers.  [ruby-dev:25003]

Tue Nov 30 23:38:18 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (io_fread): need not to null terminate.  [ruby-dev:24998]

	* io.c (read_all): remove unnecessary rb_str_resize().
	  [ruby-dev:24996]  (backported from CVS HEAD)

	* io.c (io_readpartial): ditto.

	* io.c (io_read): ditto.

Tue Nov 30 16:18:50 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (io_fread): need not to null terminate.  [ruby-dev:24998]

	* io.c (read_all): remove unnecessary rb_str_resize().
	  [ruby-dev:24996]

	* io.c (io_read): ditto.

Tue Nov 30 00:49:08 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (rb_io_sysread): use temporary lock.  [ruby-dev:24992]

Mon Nov 29 16:06:04 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c (strio_write): insufficiently filled string
	  being extended when overwriting.  [ruby-core:03836]

Mon Nov 29 15:59:05 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/ostruct.rb (OpenStruct::method_missing): check method
	  duplication for -d.

	* lib/ostruct.rb (OpenStruct::initialize): ditto.

Mon Nov 29 15:22:28 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/io/nonblock/test_flush.rb: abandon tests when io/nonblock is
	  not supported.

Mon Nov 29 03:08:30 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* object.c (convert_type): direct call conversion methods for the
	  performance.  [ruby-core:03845]

	* eval.c (rb_funcall_rescue): new function.

	* object.c (rb_Array): avoid using rb_respond_to().

	* object.c (rb_Integer): ditto.

	* parse.y (reduce_nodes): empty body should return nil.

	* string.c (rb_str_aset): the original string should not be
	  affected by modifying duplicated string.  [ruby-dev:24981]

Mon Nov 29 13:57:38 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (CreateChild): search executable file if no program
	  name given. (backported from CVS HEAD)

Mon Nov 29 13:37:54 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (fptr_finalize): must not use FILE after fclose().
	  [ruby-dev:24985]

Mon Nov 29 13:16:31 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (CreateChild): push back the last space before next
	  loop because CharNext() eats it.

Mon Nov 29 01:18:18 2004  Tanaka Akira  <akr@m17n.org>

	* io.c (rb_io_check_writable): call io_seek regardless of
	  NEED_IO_SEEK_BETWEEN_RW.  [ruby-dev:24986]

Sat Nov 27 21:43:39 2004  Tanaka Akira  <akr@m17n.org>

	* io.c: avoid data lost with nonblocking fd and
	  stdio buffering in sync mode.  [ruby-dev:24966]
	  based on matz's patch [ruby-dev:24967]
	  (io_fwrite): new primitive writing function which writes
	  directly if sync mode.
	  (rb_io_fwrite): wrapper for io_fwrite now.
	  (io_write): call io_fwrite instead of rb_io_fwrite.

Sat Nov 27 14:44:15 2004  Kent Sibilev  <ksibilev@bellsouth.net>

	* lib/cgi/session.rb (CGI::Session::initialize): create_new_id is
	  now a instance method.  [ruby-core:03832]

Sat Nov 27 09:41:21 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (io_fread): old rb_io_fread with file closing checking.
	  (rb_io_fread): wrapper for io_fread now.
	  [ruby-dev:24964]

Fri Nov 26 18:02:44 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: Tk.destroy uses TkWindow#epath

	* ext/tk/lib/tk/image.rb: bug fix

	* ext/tk/lib/tk/wm.rb: add 'iconphoto' method(Windows only)

	* ext/tk/lib/tkextlib/*: some methods uses TkWindow#epath

Fri Nov 26 13:49:06 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (method_missing): raise TypeError for classes do not
	  have allocators.  [ruby-core:03752]

	* lib/erb.rb: add RDoc by James Edward Gray II.  [ruby-core:03786]

Fri Nov 26 13:29:02 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::look_for_directives_in): Break
	  out of preprocessing when we find a :section: directive (previously cleared out the
	  comment, but this apparently now generates an error in gsub!)

Fri Nov 26 00:17:40 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (io_read): move StringValue() check before GetOpenFile().
	  [ruby-dev:24959]

Thu Nov 25 20:14:57 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/thwait.rb (ThreadsWait#join_nowait): abnormally terminated
	  threads should be also processed.  [ruby-talk:121320]

Thu Nov 25 10:14:26 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (push_braces): do not reuse buffer strings.  [ruby-core:03806]

Thu Nov 25 07:59:41 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (read_all): stringify non-nil buffer argument, and always
	  taint the result.  [ruby-dev:24955]

Wed Nov 24 01:01:31 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (io_read): integer conversion should be prior to
	  GetOpenFile().  [ruby-dev:24952]

	* configure.in, io.c: cancel [ ruby-Patches-1074 ].

Tue Nov 23 08:09:50 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/menu.rb: improve usability of TkOptionMenubutton

Tue Nov 23 02:00:21 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* file.c (rb_file_chown): integer conversion should be prior to
	  GetOpenFile().  [ruby-dev:24949]

Tue Nov 23 00:10:48 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* file.c (rb_file_chown): integer conversion should be prior to
	  GetOpenFile().  [ruby-dev:24947]

	* file.c (rb_file_truncate): ditto.

	* file.c (rb_file_s_truncate): ditto.

	* dir.c (dir_seek): use NUM2OFFT().

	* misc/ruby-mode.el (ruby-non-block-do-re): should not match words
	  start with block keyword and underscore.  [ruby-core:03719]

Mon Nov 22 22:33:02 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::parse_require): Don't use names
	  of variables or constants when oarsing 'require'

Mon Nov 22 00:13:35 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* dir.c (dir_seek): should retrieve dir_data after NUM2INT().
	  [ruby-dev:24941]

Sat Nov 20 23:57:33 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/README (et al): Add a new directive, :section:, and
	  change the output format to accomodate. :section: allows to to
	  group together methods, attributes, constants, etc under
	  headings in the output. If used, a table of contents is
	  generated.

Sat Nov 20 23:56:54 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/options.rb (Options::parse): Force --inline-source if
	  --one-file option given

Sat Nov 20 23:55:19 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_splice): should place index wrapping after
	  possible modification.  [ruby-dev:24940]

Sat Nov 20 13:26:03 2004  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/nkf/nkf-utf8/utf8tbl.c: original revision 1.7

Sat Nov 20 05:34:24 2004  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/nkf/nkf-utf8/nkf.c: original nkf.c rev:1.40

	* ext/nkf/test.rb: add test for mime encode/decode

Sat Nov 20 01:37:34 2004  Johan Holmberg  <holmberg@iar.se>

	* eval.c (error_print): nicer traceback at interrupt.
	  [ruby-core:03774]

Sat Nov 20 00:07:16 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (str_gsub): internal buffer should not be listed by
	  ObjectSpace.each_object() by String#gsub.  [ruby-dev:24931]

Fri Nov 19 01:20:22 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/cgi/session.rb (CGI::Session::FileStore::initialize): raise
	  exception if data corresponding to session specified from the
	  client does not exist.

Fri Nov 19 00:59:31 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (str_gsub): internal buffer should not be listed by
	  ObjectSpace.each_object().  [ruby-dev:24919]

Thu Nov 18 18:41:08 2004  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* test/ruby/test_stringchar.rb (test_bang): added.

	* string.c (rb_str_upcase_bang, rb_str_capitalize_bang)
	  (rb_str_swapcase_bang): missing rb_str_modify().  [ruby-dev:24915]

Thu Nov 18 00:21:15 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* process.c (proc_getpgrp): prohibit for $SAFE=2.
	  [ruby-dev:24899]

	* process.c (get_pid): ditto.  [ruby-dev:24904]

	* process.c (get_ppid): ditto.

	* array.c (rb_ary_delete): defer rb_ary_modify() until actual
	  modification.  [ruby-dev:24901]

Thu Nov 18 10:10:14 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c, rubyio.h (rb_io_modenum_flags): exported.

	* ext/stringio/stringio.c (strio_initialize): allow Fixnum as mode as
	  well as IO.new does.  [ruby-dev:24896]

Wed Nov 17 23:42:40 2004  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/ruby/test_settracefunc.rb: added.  [ruby-dev:24884]

Wed Nov 17 13:56:57 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (newline_node): should not use FL_SET. [ruby-dev:24874]

	* parse.y (string_content): should not use FL_UNSET.

	* node.h (NODE_NEWLINE): remove unused bit to utilize flag field
	  in nodes.

Wed Nov 17 13:09:40 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* {bcc32,win32,wince}/Makefile.sub (test): should build ruby.exe
	  before running test. [ruby-core:03756]

Wed Nov 17 04:33:01 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* pack.c: all features are backport from 1.9. [ruby-dev:24826]

	* bignum.c (rb_big2ulong_pack): new function to pack Bignums.

Wed Nov 17 03:42:45 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_splice): move rb_str_modify() after
	  StringValue(), which may alter the receiver.  [ruby-dev:24878]

Tue Nov 16 23:45:07 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* numeric.c (flo_divmod): protect float values from GC by
	  assignment to local variables.  [ruby-dev:24873]

Tue Nov 16 16:30:21 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* {bcc32,win32,wince}/setup.mak (-epilogue-): remove config.h and
	  config.status to force updating them.

Tue Nov 16 16:20:45 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c (strio_read): position was ignored when a
	  buffer was passed.  http://www.yo.rim.or.jp/~nov/d/?date=20041116#p03

Tue Nov 16 11:19:07 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/test/unit/autorunner.rb (Test::Unit::AutoRunner::options): use
	  Regexp conversion.

Tue Nov 16 01:41:31 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (str_mod_check): frozen check should be separated.
	  [ruby-core:3742]

	* array.c (rb_ary_update): pedantic check to detect
	  rb_ary_to_ary() to modify the receiver.  [ruby-dev:24861]

Mon Nov 15 13:50:52 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_justify): typo fixed.  [ruby-dev:24851]

Mon Nov 15 11:50:32 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* misc/ruby-mode.el (ruby-special-char-p, ruby-parse-partial): handle
	  operator symbols.  [ruby-talk:120177]

Sun Nov 14 13:27:03 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/pp.rb (PP#object_address_group): remove odd number of 'f'
	  prefixed to negative address.

Sun Nov 14 08:51:04 2004  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/logger/test_logger.rb: Logger just expects
	  Logger#datetime_format to be used for Time#strftime independently of
	  locale. [ruby-dev:24828]

Fri Nov 12 15:03:26 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* eval.c (ruby_options): now we cannot call rb_glob() before
	  ruby_init(), so call rb_w32_cmdvector() at ruby_options().

	* win32.{c,h} (rb_w32_cmdvector): rename make_cmdvector() and
	  export it.

Fri Nov 12 14:08:01 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/event.rb: remove $LOADED_FEATURES trick

	* ext/tk/lib/tk.rb: ditto

Fri Nov 12 00:31:05 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/gdbm/gdbm.c (fgdbm_store): StringValue() may alter string
	  pointer.  [ruby-dev:24783]

Thu Nov 11 17:36:12 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (rb_globi): also should call back via rb_glob_caller().
	  [ruby-dev:24775]

Thu Nov 11 16:47:21 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/ruby/test_file.rb (test_truncate_wbuf): we want to test
	  only File#truncate, not behaviour of seek(2).

Thu Nov 11 09:41:01 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* dir.c (push_braces): was confusing VALUE and char*.

	* dir.c (rb_push_glob): Dir.glob should have called its block.

Thu Nov 11 01:52:52 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* error.c (syserr_initialize): use stringified object.
	  [ruby-dev:24768]

Wed Nov 10 22:49:01 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/delegate.rb (SimpleDelegator::dup): wrong number of
	  arguments.

	* lib/delegate.rb (DelegateClass::dup): ditto.

Wed Nov 10 12:31:21 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* README.EXT (Example): extconf.rb is indispensable now.

Wed Nov 10 03:33:36 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: fix SEGV when compiled with Tcl/Tk8.3.x
	  or older

	* ext/tk/lib/tkextlib/tile/style.rb: bug fix

Tue Nov  9 14:27:18 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb (OptionParser::Officious): moved from DefaultList.

Tue Nov  9 01:05:04 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* dir.c (rb_glob2): do not allocate buffer from heap to avoid
	  memory leaks.  use string object for buffering instead.
	  [ruby-dev:24738]

	* dir.c (join_path): ditto.

	* io.c (io_read): external input buffer may be modified even after
	  rb_str_locktmp().  [ruby-dev:24735]

	* dir.c (fnmatch): p or s may be NULL.  [ruby-dev:24749]

Tue Nov  9 00:53:53 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* regex.c (slow_match): avoid GCC 3.4.x warnings.

Tue Nov  9 00:50:06 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/rdoc.rb: Change version numbering of RDoc and ri

Mon Nov  8 23:38:35 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/extservm.rb: add DRb::ExtServManager#uri=.
	  [ruby-dev:24743]

Mon Nov  8 22:20:19 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_class):
	  Fix bug where parent class wasn't being detected if the
	  child class was defined using the A::B notation.

Mon Nov  8 00:14:13 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in: add setup for mignw32 cross compiling.
	  [ruby-talk:119413]

Sun Nov  7 23:49:26 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: bind-event methods accept multi substitution
	  arguments.

	* ext/tk/lib/tk/canvas.rb: ditto.

	* ext/tk/lib/tk/canvastag.rb: ditto.

	* ext/tk/lib/tk/text.rb: ditto.

	* ext/tk/lib/tk/texttag.rb: ditto.

	* ext/tk/lib/tkextlib: ditto.

Sat Nov  6 14:58:44 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/server.rb (WEBrick::HTTPServer#start): remove
	  :DoNotReverseLookup option. (Socket#do_not_reverse_lookup is a
	  ruby 1.9 feature)

Sat Nov  6 11:31:04 2004  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb (_parse): checks whether zone was given.

Sat Nov  6 00:46:27 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_locktmp): check STR_TMPLOCK flag before
	  locking.  [ruby-dev:24727]

Fri Nov  5 18:12:42 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/scrollable.rb: divide Scrollable module into
	  X_Scrollable and Y_Scrollable

	* ext/tk/lib/tk/entry.rb: include X_Scrollable instead of Scrollable

	* ext/tk/lib/tk/autoload.rb: define autoload for X_Scrollable and
	  Y_Scrollable

Fri Nov  5 16:05:32 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: TkComm._at() supprts both of "@x,y" and "@x"

Fri Nov  5 13:22:58 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/text.rb: sorry. bug fix again.

Fri Nov  5 13:17:54 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/text.rb: bug fix

Fri Nov  5 08:52:48 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* gc.c (gc_mark): stricter GC stack check.

Fri Nov  5 08:52:48 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* gc.c (gc_mark): stricter GC stack check.

Fri Nov  5 08:34:43 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (str_gsub): should have removed rb_str_unlocktmp(str).
	  [ruby-dev:24708]

Thu Nov  4 21:25:38 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (str_gsub): string modify check no longer based on
	  tmplock.  [ruby-dev:24706]

Thu Nov  4 19:27:46 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* io.c (rb_f_open): fix typo.

Thu Nov  4 15:02:14 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/variable.rb: forget to initialize instance_variables
	  of TkVarAccess objects

Thu Nov  4 09:11:35 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* gc.c (gc_mark): enable GC stack checking.

Thu Nov  4 03:11:33 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (str_gsub): lock strings temporarily.  [ruby-dev:24687]

	* ext/socket/socket.c (s_recvfrom): tmplock input buffer.
	  [ruby-dev:24705]

Wed Nov  3 22:32:12 2004  NARUSE, Yui  <naruse@ruby-lang.org>

	* process.c: On NetBSD don't use setruid() and setrgid().

Wed Nov  3 22:24:17 2004  Daigo Moriwaki  <techml@sgtpepper.net>

	* lib/webrick/httpauth/digestauth.rb: use Base64.encode64 to
	  avoid warnings.

Wed Nov  3 17:19:59 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_uniq_bang): do not push frozen string from hash
	  table.  [ruby-dev:24695]

	* array.c (rb_ary_and): ditto.

	* array.c (rb_ary_or): ditto.

Wed Nov  3 17:13:02 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* io.c (pipe_open): fix compile error

Wed Nov  3 16:58:07 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: support to use different Tcl commands between
	  configure and configinfo

	* ext/tk/lib/font.rb: ditto.

	* ext/tk/lib/itemconfig.rb: support to use different Tcl commands
	  between item_configure and item_configinfo

	* ext/tk/lib/itemfont.rb: ditto.

	* ext/tk/extconf.rb: install SUPPORT_STATUS

	* ext/tk/lib/tkextlib: some bug fixes (see ext/tk/ChangeLog.tkextlib)

Wed Nov  3 16:30:41 2004  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/nkf: follow nkf 2.0.4

Wed Nov  3 15:53:34 2004  Kouhei Sutou  <kou@cozmixng.org>

	* test/rss/test_maker_*.rb: added tests for RSS Maker.

	* lib/rss/maker.rb: added RSS Maker.

	* lib/rss/maker/*.rb: ditto.

Tue Nov  2 16:35:57 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/enumerator/enumerator.c (each_cons_i): pass copy of an
	  internal consequent array.  [ruby-talk:118691]

Tue Nov  2 16:05:21 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* process.c (rb_f_fork): need to flush stdout and stderr before
	  fork(2).  [ruby-talk:117715]

Tue Nov  2 01:20:09 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (proc_invoke): nail down dyna_var node when Proc object
	  or continuation is created.  [ruby-dev:24671]

Mon Nov  1 13:59:28 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* ext/extmk.rb (MANIFEST): do not use anymore, use extconf.rb instead.

	* ext/enumerator/extconf.rb, ext/fcntl/extconf.rb,
	  ext/stringio/extconf.rb: added.

	* MANIFEST, ext/**/MANIFEST: removed.

	* README.EXT, README.EXT.ja: remove MANIFEST stuff.

Mon Nov  1 01:14:52 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (rb_f_open): create copy of popen specifier.  [ruby-dev:24656]

Mon Nov  1 00:36:48 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* main.c (_stklen): move to gc.c.

Sun Oct 31 00:22:28 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_locktmp): lock string temporarily.

	* string.c (str_independent): add tmplock check.

	* io.c (io_write): lock output string temporarily.
	  [ruby-dev:24649]

	* io.c (io_write): use rb_str_locktmp().

	* io.c (read_all): ditto.

Sat Oct 30 06:53:24 2004  Peter Vanbroekhoven  <peter.vanbroekhoven@cs.kuleuven.ac.be>

	* eval.c (rb_eval): NODE_XSTR should pass copy of literal string.

Sat Oct 30 00:19:40 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* enum.c (enum_sort_by): protect continuation jump in.
	  [ruby-dev:24642]

Fri Oct 29 21:27:51 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_check_initialized): new function to check uninitialized
	  object.  [ruby-talk:118234]

	* file.c (rb_file_path), io.c (rb_io_closed): check if initialized.

Fri Oct 29 10:00:30 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_thread_start_0): forget to free some memory chunks.
	  [ruby-core:03611]

	* eval.c (ruby_cleanup): ruby_finalize_1 may cause exception,
	  should be wrapped by PUSH_TAG/POP_TAG().  [ruby-dev:24627]

Thu Oct 28 08:42:02 2004  Tanaka Akira  <akr@m17n.org>

	* io.c (argf_forward): use ANSI style.
	  (argf_read): call argf_forward with argv argument.
	  [ruby-dev:24624]

Thu Oct 28 23:32:54 2004  akira yamada  <akira@ruby-lang.org>

	* ext/zlib/zlib.c (zstream_detach_input): resets klass of z->input if
	  z->input isn't nil.

Thu Oct 28 23:19:31 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb: prefer relative path.  [ruby-talk:93037]

Wed Oct 27 18:49:11 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* gc.c: prototype; rb_io_fptr_finalize() doesn't return any value
	  at this version.

Wed Oct 27 17:27:45 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* gc.c (gc_sweep): recover ruby_in_compile variable.

Wed Oct 27 09:17:30 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (str_gsub): use a string object for exception safeness.
	  [ruby-dev:24601]

Tue Oct 26 23:52:32 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_getline): rs modification check should not interfere in the loop.

Tue Oct 26 23:30:39 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/code_objects.rb (RDoc::Context::add_class_or_module):
	  Restore correct :nopdoc: behavior with nested classes and modules.

Tue Oct 26 18:21:29 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (RESIZE_CAPA): check string attribute before modifying
	  capacity member of string structure.  [ruby-dev:24594]

Tue Oct 26 11:33:26 2004  David G. Andersen  <dga@lcs.mit.edu>

	* ext/zlib/zlib.c (gzreader_gets): use memchr() to to gain
	  performance.  [ruby-talk:117701]

Tue Oct 26 10:56:55 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* sprintf.c (rb_f_sprintf): raise ArgumentError for extra
	  arguments, unless (digit)$ style used.

Tue Oct 26 11:33:26 2004  David G. Andersen  <dga@lcs.mit.edu>

	* ext/zlib/zlib.c (gzreader_gets): use memchr() to to gain
	  performance.  [ruby-talk:117701]

Tue Oct 26 10:56:55 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* sprintf.c (rb_f_sprintf): raise ArgumentError for extra
	  arguments, unless (digit)$ style used.

Mon Oct 25 18:35:39 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* win32/win32.c (isUNCRoot): should check NUL after '.'.
	  [ruby-dev:24590]

	* win32/win32.c (isUNCRoot): fixed buffer overrun.

Mon Oct 25 08:03:26 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (get_backtrace): ignore illegal backtrace.  [ruby-dev:24587]

Sun Oct 24 00:41:09 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_load, search_required, rb_require_safe, rb_require): use
	  frozen shared string to avoid outside modification.  [ruby-dev:24580]

Sat Oct 23 22:18:32 2004  Guy Decoux  <ts@moulon.inra.fr>

	* eval.c (frame_free): Guy Decoux solved the leak problem.
	  Thanks.  [ruby-core:03549]

Sat Oct 23 00:20:55 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/zlib/zlib.c (zstream_append_input): clear klass for z->input
	  to avoid potential vulnerability.

	* ext/zlib/zlib.c (zstream_run): always use zstream_append_input()
	  to avoid SEGV.  [ruby-dev:24568]

Fri Oct 22 12:02:28 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_alias): was warning for wrong condition.
	  [ruby-dev:24565]

Fri Oct 22 10:36:37 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httprequest.rb (WEBrick::HTTPRequest#meta_vars):
	  should check if path_info is not nil.

Fri Oct 22 00:22:31 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/zlib/zlib.c (zstream_shift_buffer): should restore class
	  field of a buffer.  [ruby-dev:24562]

Fri Oct 22 00:20:33 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_include): should not treat char as negative value.
	  [ruby-dev:24558]

Thu Oct 21 21:32:30 2004  IWATSUKI Hiroyuki  <don@na.rim.or.jp>

	* lib/pstore.rb (PStore#transaction): Use the empty content when a
	  file is not found.  [ruby-dev:24561]

Thu Oct 21 19:06:15 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httpresponse.rb (WEBrick::HTTPResponse#send_body_io):
	  ensure to close @body. (http://bugs.debian.org/277520)

Thu Oct 21 00:36:41 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_alias): should warn on method discarding.
	  [ruby-dev:24546]

	* ext/zlib/zlib.c (zstream_expand_buffer_into): hide internal
	  string buffer by clearing klass.  [ruby-dev:24548]

Wed Oct 20 19:45:13 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (str_gsub): 	reentrant check.  [ruby-dev:24432]

	* backport all SEGV bug fixes from CVS HEAD.  [ruby-dev:24536]

Wed Oct 20 04:17:55 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/dbm/dbm.c (fdbm_delete_if): should check if deleting element
	  is a string.  [ruby-dev:24490]

	* ext/sdbm/init.c (fsdbm_delete_if): ditto.

Wed Oct 20 01:37:18 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_times): Array#* should return an instance of
	  the class of right operand.  [ruby-dev:24526]

	* ext/zlib/zlib.c (zstream_detach_buffer): should not expose
	  class-less object to Ruby world. [ruby-dev:24530]

	* eval.c (proc_dup): provide Proc#dup as well.  [ruby-talk:116915]

	* eval.c (ruby_exec): stack marking position may be higher than
	  expected.  thanks to Guy Decoux.  [ruby-core:03527]

Tue Oct 19 22:43:12 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_attr): If
	  we come across 'attr' in a context where it isn't
	  followed by a symbol, just issue a warning.

Tue Oct 19 20:41:37 2004  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole.c(ole_invoke): retrieve the result value when
	  retrying the IDispatch::invoke.

Tue Oct 19 17:24:11 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (read_all): block string buffer modification during
	  rb_io_fread() by freezing it temporarily. [ruby-dev:24479]

	* dir.c (rb_push_glob): block call at once the end of method.
	  [ruby-dev:24487]

	* ext/enumerator/enumerator.c (enum_each_slice): remove
	  rb_gc_force_recycle() to prevent potential SEGV.
	  [ruby-dev:24499]

	* ext/zlib/zlib.c (zstream_expand_buffer): hide internal string
	  buffer by clearing klass.  [ruby-dev:24510]

Tue Oct 19 16:12:18 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tkutil.c: backport from CVS HEAD

Tue Oct 19 08:54:26 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* intern.h, object.c (rb_class_inherited_p): export.

Tue Oct 19 08:46:57 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_upto): method result must be checked.  [ruby-dev:24504]

	* eval.c (error_print): ditto.  [ruby-dev:24519]

Mon Oct 18 23:37:05 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (r_object0): check inheritance by the internal function.
	  [ruby-dev:24515]

Mon Oct 18 15:58:01 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* range.c (range_step, range_each): need cast.

Fri Oct 29 16:34:19 2004  Daiki Ueno  <ueno@unixuser.org>

	* misc/ruby-mode.el (ruby-parse-partial): Parse the rest of the
	  line after opening heredoc identifier.  [ruby-dev:24635]

Mon Oct 18 07:26:21 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_file_truncate): discard read buffer before truncation.
	  [ruby-dev:24197]

Mon Oct 18 02:11:21 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/config.rb (WEBrick::Config::General): add default values:
	  - WEBrick::Config[:DoNotReverseLookup]
	  - WEBrick::Config[:RequestCallback] (it used as an alias of
	    :RequestHandler in WEBrick::HTTPServer#run)
	  - WEBrick::Config::FileHandler[:AcceptableLanguages]

	* lib/webrick/httpservlet/filehandler.rb
	  (WEBrick::HTTPServlet::FileHandler#set_filename): search files
	  having suffix of language-name which Accept-Language header field
	  includes if :AcceptableLanguages options is present.

	* lib/webrick/httpservlet/filehandler.rb
	  (WEBrick::HTTPServlet::FileHandler#get_servlet): new method to
	  search servlet correspond to the suffix of filename.

	* lib/webrick/httprequest.rb: add attributes access methods: accept,
	  accept_charset, accept_encoding, accept_language, content_length
	  and content_type.

	* lib/webrick/httpresponse.rb: add attribute access methods:
	  content_length, content_length=, content_type and content_type=.

	* lib/webrick/httputils.rb (WEBrick::HTTPUtils.mime_types):
	  use the second suffix to detect media type. (the first suffix
	  may be a language name.)

	* lib/webrick/httputils.rb (WEBrick::HTTPUtils.parse_qvalues):
	  add method to parse Accept header field. it returns an Array of
	  values sorted by the qvalues.

Mon Oct 18 02:04:11 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httpserver.rb (WEBrick::HTTPServer#virtual_host): new
	  method to register virtual hosting servers.

	* lib/webrick/server.rb (WEBrick::GenericServer#accept): call
	  do_not_reverse_lookup for each socket if :DoNotReverseLookup
	  is set.  [ruby-core:02357]

Mon Oct 18 00:42:45 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/socket/socket.c (sock_s_getservbyaname): protocol string
	  might be altered.  [ruby-dev:24503]

	* string.c (rb_str_upto): check if return value from succ is a
	  string.  [ruby-dev:24504]

Sun Oct 17 23:03:48 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/timer.rb: TkTimer#start and restart accept a block

Sun Oct 17 13:05:04 2004  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c (fole_func_methods): correct argument mismatch.
	* ext/win32ole/win32ole.c (fole_get_methods): ditto.
	* ext/win32ole/win32ole.c (fole_put_methods): ditto.
	* ext/win32ole/tests/testWIN32OLE.rb: add test for WIN32OLE#ole_func_methods
	  WIN32OLE#ole_get_methods, WIN32OLE#ole_put_methods

Sat Oct 16 14:45:28 2004  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/0.9.rb (RSS::Rss#to_s): removed garbage.

Sat Oct 16 13:42:49 2004  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/: untabified.
	* test/rss/: untabified.
	* lib/rss/0.9.rb (RSS::Rss#to_s): inent -> indent.

Sat Oct 16 13:34:56 2004  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss: supported prety print.
	* test/rss/test_1.0.rb: added test for calculating default indent size.

Fri Oct 15 18:04:35 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/timer.rb: TkTimer.new(interval, loop){ ... } is
	  acceptable. Add TkTimer.start ( == new + start ).

Fri Oct 15 12:43:09 2004  Tanaka Akira  <akr@m17n.org>

	* eval.c (Init_stack): make prototype declaration consistent with
	  the definition in gc.c.

Thu Oct 14 14:34:01 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* io.c (MODE_BINMODE, MODE_BINARY): fixed reversed condition.

Thu Oct 14 13:33:59 2004  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb: added link to Tutorial.

Mon Oct 11 13:48:20 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/*: untabify

Sun Oct 10 12:32:08 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::parse_require): Allow 'require'
	  to be used as a variable name

Sat Oct  9 21:23:37 2004  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/converter.rb: changed to try to use Iconv for default
	  conversion.

	* lib/rss/rss.rb: 0.0.9 -> 0.1.0.

Sat Oct  9 19:50:36 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_getline): should not treat char as negative value.
	  [ruby-dev:24460]

Fri Oct  8 09:49:32 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* pack.c (pack_pack): pointer modification check before each
	  iteration.  [ruby-dev:24445]

Fri Oct  8 01:13:05 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/optiondb.rb: make it more secure

Thu Oct  7 23:47:57 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/scrollbar.rb: When 'set' operation, a scrollbar
	  cannot propagate view port information from the source widget
	  (that calls 'set') to other assigned widgets.

Thu Oct  7 17:36:25 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: When CHILDKILLED and so on, Tk.errorCode returns
	  a Fixnum for 2nd element (it's pid) of the return value.

Thu Oct  7 12:55:04 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (io_read): should freeze buffer before thread context
	  switch. [ruby-dev:24442]

	* pack.c (pack_unpack): string conversion should at the top of the
	  method.  [ruby-dev:24439]

	* io.c (io_read): buffer should be frozen only after the length
	  check.  [ruby-dev:24440]

Thu Oct  7 02:56:43 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c: use FMODE_APPEND.

Thu Oct  7 01:05:33 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: add Tk.errorInfo and Tk.errorCode

Thu Oct  7 00:08:37 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (rb_io_s_sysopen): preserve path in the buffer allocated by
	  ALLOCA_N() to prevent modification.  [ruby-dev:24438]

Wed Oct  6 09:21:00 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (rb_io_mode_flags): preserve append mode flag.
	  [ruby-dev:24436]

	* io.c (rb_io_modenum_mode): do not use external output buffer.

	* string.c (rb_str_justify): differ pointer retrieval to prevent
	  padding string modification.  [ruby-dev:24434]

	* range.c (range_each_func): allow func to terminate loop by
	  returning RANGE_EACH_BREAK.

	* range.c (member_i): use RANGE_EACH_BREAK. [ruby-talk:114959]

Mon Oct  4 14:04:14 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_file_open_internal, rb_io_reopen): fname might be altered
	  while GC.  [ruby-dev:24408]

Mon Oct  4 12:53:45 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/optiondb.rb: support definition of command
	  resources on widgets

	* ext/tk/lib/tk/image.rb: bug fix

Sun Oct  3 21:20:03 2004  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (TEXT_REGEXP): allow 8-bit characters for the german
	  version of Microsoft Exchange Server. (backported from HEAD)

	* lib/net/imap.rb (RTEXT_REGEXP): ditto.

	* lib/net/imap.rb (CTEXT_REGEXP): ditto.

Sat Oct  2 20:34:22 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* node.h (NEW_DVAR): extra semicolon.

Sat Oct  2 00:42:20 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* marshal.c (r_byte): retrieve pointer from string value for each
	  time.  [ruby-dev:24404]

	* marshal.c (r_bytes0): ditto.

	* enum.c (sort_by_i): re-entrance check added.  [ruby-dev:24399]

	* io.c (io_read): should freeze all reading buffer.
	  [ruby-dev:24400]

	* string.c (rb_str_sum): should use bignums when bits is greater
	  than or equals to sizeof(long)*CHAR_BITS. [ruby-dev:24395]

	* eval.c (specific_eval): defer pointer retrieval to prevent
	  unsafe sourcefile string modification.  [ruby-dev:24382]

	* eval.c (specific_eval): defer pointer retrieval to prevent
	  unsafe sourcefile string modification.  [ruby-dev:24382]

	* string.c (rb_str_sum): wrong cast caused wrong result.
	  [ruby-dev:24385]

	* enum.c (enum_sort_by): hide temporary array from
	  ObjectSpace.each_object.  [ruby-dev:24386]

	* string.c (rb_str_sum): check was done with false pointer.
	  [ruby-dev:24383]

	* string.c (rb_str_sum): string may be altered.  [ruby-dev:24381]

Mon Oct 11 17:51:34 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (rb_io_popen): get mode string via rb_io_flags_mode() to
	  avoid mode string modification.  [ruby-dev:24454]

	* io.c (rb_io_getline_fast): should take delim as unsigned char to
	  distinguish EOF and '\377'.  [ruby-dev:24460]

	* io.c (rb_io_getline): add check for RS modification.
	  [ruby-dev:24461]

	* enum.c (enum_sort_by): use qsort() directly instead using
	  rb_iterate().  [ruby-dev:24462]

	* enum.c (enum_each_with_index): remove rb_gc_force_recycle() to
	  prevent access to recycled object (via continuation for
	  example).  [ruby-dev:24463]

Fri Oct  1 11:40:14 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_f_eval): defer pointer retrieval to prevent unsafe
	  sourcefile string modification.  [ruby-dev:24373]

	* io.c (io_read): block string buffer modification during
	  rb_io_fread() by freezing it temporarily. [ruby-dev:24366]

	* io.c (rb_io_s_popen): mode argument may be altered.
	  [ruby-dev:24375]

	* file.c (rb_file_s_basename): ext argument may be altered.
	  [ruby-dev:24377]

	* enum.c (enum_sort_by): use NODE instead of 2 element arrays.
	  [ruby-dev:24378]

	* string.c (rb_str_chomp_bang): StringValue() may change the
	  receiver.  [ruby-dev:24371]

Fri Oct  1 11:25:20 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/grid.rb: revive TkGrid.grid

	* ext/tk/lib/tk/pack.rb: revive TkPack.pack

	* ext/tk/lib/tk/place.rb: revive TkPlace.place

Thu Sep 30 00:50:44 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c (ip_init): bug fix

	* ext/tk/tkutil.c (get_eval_string_core): accept a Regexp object

	* ext/tk/lib/multi-tk.rb: fix bug on 'exit' operation

	* ext/tk/lib/tk/text.rb: 'tksearch' accepts a Regexp object as a
	  matting pattern argument

Wed Sep 29 10:58:07 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enum.c (sort_by_i): internally used object must not be changed
	  outside.  [ruby-dev:24368]

Mon Sep 27 13:46:45 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* intern.h, struct.c (rb_struct_s_members, rb_struct_members): public
	  accessors.  [ruby-dev:24342]

	* marshal.c (w_object, r_object0): use accessors.

Mon Sep 27 09:14:03 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/socket/socket.c (s_accept): don't retry for EWOULDBLOCK.
	  [ruby-talk:113807]

Fri Sep 24 16:09:42 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (proc_invoke): propagate DVAR_DONT_RECYCLE on termination
	  to avoid double call to rb_gc_force_recycle(). [ruby-dev:24311]

Fri Sep 24 08:29:45 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_subseq): original object might be modified after
	  sharing data creation.  [ruby-dev:24327]

	* array.c (rb_ary_replace): ditto.

	* array.c (ary_make_shared): freeze shared array. [ruby-dev:24325]

	* struct.c (struct_members): always check struct size and size of
	  members list in the class.  [ruby-dev:24320]

Thu Sep 23 09:29:14 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_sub_bang): check if string is not modified
	  during iteration.  [ruby-dev:24315]

	* hash.c (rb_hash_rehash): replace st_foreach() by its deep
	  checking counterpart.  [ruby-dev:24310]

Wed Sep 22 13:38:12 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* hash.c (rb_hash_rehash): add iteration check.  [ruby-dev:24301]

	* st.c (st_foreach): add deep check.

Wed Sep 22 13:06:14 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (rb_w32_call_handler): workaround for Ctrl-C.
	  merge from HEAD.

Wed Sep 22 00:11:12 2004  Dave Thomas  <dave@pragprog.com>

	* process.c: Add documentation for fork()

Wed Sep 22 09:04:41 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_collect_bang): element size might change during
	  comparison.  [ruby-dev:24300]

	* array.c (rb_ary_reject_bang): ditto. [ruby-dev:24300]

	* array.c (rb_ary_eql): ditto. [ruby-dev:24300]

Tue Sep 21 18:29:49 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_equal): merge miss.

	* array.c (rb_ary_uniq_bang): element size might change during
	  comparison.  [ruby-dev:24298]

Mon Sep 20 00:24:19 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* enum.c (enum_sort_by): do not use qsort directly.  use
	  rb_ary_sort_bang() instead.  [ruby-dev:24291]

	* enum.c (enum_sort_by): pedantic type check added.
	  [ruby-dev:24291]

	* hash.c (rb_hash_foreach_iter): check iter_lev after each
	  iteration.  [ruby-dev:24289]

	* array.c (rb_ary_and): element size might change during
	  comparison.  [ruby-dev:24290]

	* array.c (rb_ary_or): ditto. [ruby-dev:24292]

	* array.c (rb_ary_equal): wrong fix. [ruby-dev:24286]

Sat Sep 18 15:02:22 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_equal): element size might change during
	  comparison.  [ruby-dev:24254]

	* array.c (rb_ary_diff): ditto. [ruby-dev:24274]

	* array.c (rb_ary_select): ditto. [ruby-dev:24278]

	* array.c (rb_ary_delete): ditto. [ruby-dev:24283]

	* array.c (rb_ary_rindex): ditto. [ruby-dev:24275]

	* array.c (rb_ary_initialize): element size might change during
	  initializing block.  [ruby-dev:24284]

Sat Sep 18 14:10:23 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* dir.c (dir_s_chdir): avoid memory leak and unnecessary chdir to
	  the original directory when exception has caused in changing
	  direcotry or within block.  thanks to Johan Holmberg
	  <holmberg@iar.se> [ruby-core:03446]

Fri Sep 17 20:20:27 2004  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (mkdir_p): backport from CVS HEAD 1.45. [ruby-core:03420]

Fri Sep 17 17:11:08 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_delete): element comparison might change array
	  size. [ruby-dev:24273]

	* file.c (rb_file_truncate): clear stdio buffer before truncating
	  the file.  [ruby-dev:24191]

	* ext/digest/digest.c: use rb_obj_class() instead of CLASS_OF
	  which might return singleton class.  [ruby-dev:24202]

Fri Sep 17 16:07:09 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: improve exit operation

Fri Sep 17 15:01:57 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: fix SEGV when (thread_)vwait or
	  (thread_)tkwait

	* ext/tk/lib/tk.rb: add alias wait_window to wait_destroy

	* ext/tk/lib/multi-tk.rb: support calling 'mainloop' on slave
	  interpreters (however, the 'real' eventloop must be run on the
	  Default Master IP)

	* ext/tk/lib/remote-tk.rb: follow the changes of ext/tk/lib/multi-tk.rb

	* ext/tk/sample/remote-ip_sample2.rb: ditto

	* ext/tk/sample/tkoptdb-safeTk.rb: ditto

Thu Sep 16 18:12:32 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/cgi.rb (WEBrick::CGI#start): should set REMOTE_USER
	  to request.user attribute.

	* lib/webrick/httpservlet/filehandler.rb
	  (WEBrick::HTTPServlet::FileHandler#initialize): should expand
	  the pathname of document root directory.

Thu Sep 16 15:49:28 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_intern): protect string argument from GC.
	  [ruby-core:03411]

Wed Sep 15 20:22:23 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/sample/tkoptdb-safeTk.rb: fix a bug depend on the changes
	  of MultiTkIp

Tue Sep 14 23:54:11 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: MultiTkIp#eval_string was en-bugged by
	  the previous changes.

Tue Sep 14 23:45:44 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/ri/ri_formatter.rb (RI::TextFormatter::TextFormatter.for):
	  Add Eric Hodel's simpleformatter.

Tue Sep 14 16:59:37 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: fix SEGV

	* ext/tk/lib/multi-tk.rb: improve safe-level handling of argument proc

	* ext/tk/sample/multi-ip_sample.rb: rename of old 'safe-tk.rb'

	* ext/tk/sample/safe-tk.rb: new sample script

Tue Sep 14 00:15:15 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* ext/zlib/zlib.c: backported from HEAD.

Mon Sep 13 19:16:33 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* eval.c (blk_copy_prev): need frame_dup().  [ruby-dev:24103]

Mon Sep 13 16:23:27 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: MultiTkIp.new_master and new_slave accept
	  safe-level value argument

Mon Sep 13 10:20:45 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* object.c (nil_inspect): fix typo.

Mon Sep 13 01:03:02 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: improve control of preserv/release tcltkip

	* ext/tcltklib/tcltklib.c: store original 'exit' command

	* ext/tk/tkutil.c: fix(?) SEGV

Sun Sep 12 23:46:23 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* util.c (ruby_strdup): remove unnecessary code. (xmalloc never
	  returns NULL.)

	* util.c (ruby_getcwd): fix memory leak on failure.

Sun Sep 12 02:41:58 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: add TclTkIp#allow_ruby_exit? and
	  allow_ruby_exit=

	* ext/tk/lib/multi-tk.rb: ditto.

	* ext/tk/lib/remote-tk.rb: ditto.

	* ext/tcltklib/MANUAL.euc: ditto.

	* ext/tcltklib/MANUAL.eng: ditto.

	* ext/tcltklib/tcltklib.c: fix some reasons of SEGV

	* ext/tk/tkutil.c: ditto.

	* ext/tk/lib/multi-tk.rb: ditto.

	* ext/tk/lib/tk/timer.rb: ditto.

Sat Sep 11 16:09:46 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb: Fix up cross-file class merging.

Fri Sep 10 20:20:53 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/tcltklib/tcltklib.c (lib_merge_tklist): fix suspicious
	  pointer conversion.

Fri Sep 10 02:43:54 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/template/kilmer.rb: James Buck's
	  patch for call-seq.

Thu Sep  9 13:58:56 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c (ip_init): change flag value for setting
	  'argv' and 'argv0' variable

	* ext/tk/lib/remote-tk.rb: follow changes of multi-tk.rb

Thu Sep  9 11:46:18 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser::do_classes): Allow
	  spaces aroun parameter to define_method_under (James Buck)

Wed Sep  8 18:44:03 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c (strio_write): zero fill a gap if exsts.
	  [ruby-dev:24190]

Wed Sep  8 15:19:49 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c (ip_init): cannot create a IP at level 4

	* ext/tk/lib/multi-tk.rb: improve 'exit' operation, security check,
	  and error treatment

	* ext/tk/lib/multi-tk.rb: allow a trusted slave IP to create slave IPs

	* ext/tk/lib/tk/listbox.rb: add TkListbox#value, value=, clear,	and
	  erase

	* ext/tk/lib/tk/text.rb: add TkText#clear and erase

Tue Sep  7 15:17:49 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/socket/socket.c (ruby_connect): break immediately if a
	  socket is non-blocking.  [ruby-talk:111654]

Mon Sep  6 11:08:50 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/tk/lib/tk/menu.rb(TkOptionMenubutton#insert): call correct method

Mon Sep  6 11:00:47 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* dir.c (dir_s_chdir): the patch to shut up false warning when
	  exception occurred within a block.  a patch was given from Johan
	  Holmberg <holmberg at iar.se>.  [ruby-core:03292]

Mon Sep  6 07:51:42 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (cvar_cbase): singletons should refer outer cvar scope.
	  [ruby-dev:24223]

	* eval.c (rb_load): should preserve previous ruby_wrapper value.
	  [ruby-dev:24226]

Sat Sep  4 01:14:57 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (cvar_cbase): class variables cause SEGV in
	  instance_eval() for fixnums and symbols. [ruby-dev:24213]

Fri Sep  3 17:47:58 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* struct.c (make_struct): remove redefining constant when
	  conflict.  [ruby-dev:24210]

Fri Sep  3 11:31:44 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: Tk.after makes TkCore::INTERP.tk_cmd_tbl grow
	  [ruby-dev:24207]

Fri Sep  3 02:12:48 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: fix typo [ruby-talk:111266]

	* ext/tk/lib/tk/text.rb: fix typo

	* ext/tk/lib/multi-tk.rb: improve safe-level treatment on slave IPs

Fri Sep  3 01:54:20 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb: already built-in libraries satisfy dependencies.
	  [ruby-dev:24028]

Thu Sep  2 11:36:20 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* eval.c (rb_obj_instance_eval): backported from HEAD.

Wed Sep  1 21:18:25 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/tk/lib/tk/spinbox.rb: fix typo

Tue Aug 31 18:24:04 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/tk/tkutil.c (cbsubst_init): fix memory leak

	* ext/tk/tkutil.c (cbsubst_get_all_subst_keys): fix SEGV

Tue Aug 31 16:04:22 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c (ip_delete): when a tcltkip is deleted,
	  destroy its root widget

Tue Aug 31 12:30:36 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c (del_root): fix SEGV

Mon Aug 30 23:11:06 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/ri/ri_driver.rb (and others): ri now merges documentation
	  if it finds the same class in multiple places.

Mon Aug 30 22:40:30 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: 'restart' method accepts arguments

Mon Aug 30 21:50:14 2004  Dave Thomas  <dave@pragprog.com>

	* object.c: Add RDoc for Module.included.

Mon Aug 30 15:10:46 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in (GNU/k*BSD): fixed FTBFS on GNU/k*BSD. [ruby-dev:24051]

Mon Aug 30 11:29:35 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (CreateChild): strip trailing spaces. [ruby-dev:24143]
	  merge from HEAD.

Sun Aug 29 14:08:56 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: compile error on bcc32 [ruby-dev:24081]

	* ext/tk/lib/multi-tk.rb: MultiTkIp#eval_string does not work

Sat Aug 28 23:04:41 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* bignum.c (rb_big_and): protect parameters from GC.
	  [ruby-talk:110664]

Thu Aug 26 04:38:29 2004  Dave Thomas  <dave@pragprog.com>

	* eval.c (return_jump): Minor typo in error message. Now reads
	  "return can't jump across threads".

Tue Aug 24 17:30:00 2004  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/cgi/session.rb (CGI::Session::FileStore#initialize): do not
	  use a session id as a filename. (backported from HEAD)

	* lib/cgi/session/pstore.rb (CGI::Session::PStore#initialize): ditto.

	* lib/cgi/session/pstore.rb (CGI::Session::PStore#initialize): use
	  Dir::tmpdir. (backported from HEAD)

Tue Aug 24 14:40:16 2004  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/cgi/session.rb (CGI::Session::FileStore#initialize): untaint
	  session id after check. (backported from HEAD)

Tue Aug 24 09:09:01 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_x509attr.c (ossl_x509attr_initialize): d2i
	  functions may replace the pointer indicated by the first argument.

	* ext/openssl/ossl_x509ext.c (ossl_x509ext_initialize): ditto.

	* ext/openssl/ossl_x509name.c (ossl_x509name_initialize): ditto.

Mon Aug 23 14:04:51 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_ssl.c (ossl_ssl_read):
	  - should return an empty string if specified length to read is 0.
	  - should check for pending data and wait for fd before reading.
	  - call underlying IO's sysread if SSL session is not started.
	  [ruby-dev:24072], [ruby-dev:24075]

	* ext/openssl/ossl_ssl.c (ossl_ssl_write):
	  - call underlying IO's syswrite if SSL session is not started.

	* ext/openssl/ossl_ssl.c (ossl_ssl_pending): new method
	  OpenSSL::SSL#pending.

	* ext/openssl/lib/openssl/buffering.rb: should not use select.

Mon Aug 23 12:40:56 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* lib/resolv.rb (Config.default_config_hash): when multiple domains
	  are set, Win32::Resolv.get_resolv_info returns Array.

Sun Aug 22 01:15:31 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httpproxy.rb (WEBrick::HTTPProxyServer#proxy_connect):
	  should call :ProxyContentHandler before finishing CONNECT.

Sat Aug 21 06:41:16 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/tcltklib/extconf.rb (find_tcl, find_tk): find stub library.

	* lib/mkmf.rb (arg_config, with_config): deal with '-' and '_'
	  uniformly.  [ruby-dev:24118]

Thu Aug 19 16:29:45 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: Fail to treat a hash value of 'font' option.

	* ext/tk/lib/tk.rb: bindinfo cannot return '%' substiturion infomation.

	* ext/tk/lib/menu.rb: typo bug.

Thu Aug 19 15:15:24 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* dir.c (free_dir): fix memory leak.  reported by yamamoto
	  madoka.

Thu Aug 19 11:00:00 2004  Akiyoshi, Masamichi  <masamichi.akiyoshi@hp.com>

	* dln.c (dln_load): Modify to call lib$find_image_symbol for VMS.
	* io.c (rb_io_fwrite): Use fputc() for VMS non-stream file.

Thu Aug 19 06:07:45 2004  why the lucky stiff  <why@ruby-lang.org>

	* ext/syck/token.c: re2c no longer compiled with bit vectors.  caused
	  problems for non-ascii characters. [ruby-core:03280]
	* ext/syck/implicit.c: ditto.
	* ext/syck/bytecode.c: ditto.

	* lib/yaml/baseemitter.rb: folding now handles double-quoted strings,
	  fixed problem with extra line feeds at end of folding, whitespace
	  opening scalar blocks.

	* lib/yaml/rubytypes.rb: subtelties in handling strings with
	  non-printable characters and odd whitespace patterns.

Wed Aug 18 23:41:33 2004  Minero Aoki  <aamine@loveruby.net>

	* lib/net/protocol.rb (rbuf_fill): OpenSSL::SSL::SSLSocket has its own
	  buffer, select(2) might not work. [ruby-dev:24072]

Wed Aug 18 17:10:12 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* ext/tcltklib/stubs.c (ruby_tcltk_stubs): need to call
	  Tcl_FindExecutable() for Tcl/Tk 8.4.

Wed Aug 18 12:52:55 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_obj_instance_eval): evaluates under special singleton
	  classes as for special constants.

Tue Aug 17 17:20:59 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (rb_io_reopen): should clear allocated OpenFile.  pointed
	  out by Guy Decoux. [ruby-core:03288]

Tue Aug 17 01:36:32 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/usage.rb: Remove extra indent. Tidy 'ri' option
	  parsing so RDoc::usage plays better with OptionParser.

Sat Aug 14 13:09:10 2004  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb: backport from CVS HEAD (rev1.44).

	* lib/fileutils.rb: cp_r should copy symlink itself, except cp_r
	  root.

	* lib/fileutils.rb: new option mv :force.

	* lib/fileutils.rb: new module FileUtils::DryRun.

Sat Aug 14 02:48:16 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/usage.rb: Added. Allows command line programs
	  to report usage using their initial RDoc comment.

Fri Aug 13 13:23:17 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httputils.rb (WEBrick::HTTPUtils.parse_range_header):
	  fix regex for range-spec.

	* lib/webrick/httpservlet/filehandler.rb
	  (WEBrick::HTTPServlet::DefaultFileHandler#make_partial_content):
	  multipart/byteranges response was broken.

	* lib/webrick/httpservlet/erbhandler.rb
	  (WEBrick::HTTPServlet::ERBHandler#do_GET): should select media type
	  by suffix of script filename.

	* lib/xmlrpc/server.rb: refine example code.

Wed Aug 11 17:17:50 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in (RPATHFLAG): stop setting RPATHFLAG on Interix.

Sun Aug  8 00:43:31 2004  why the lucky stiff  <why@ruby-lang.org>

	* lib/implicit.c: added sexagecimal float#base60.

	* ext/syck/rubyext.c (yaml_org_handler): ditto.

	* lib/token.c: indentation absolutely ignored when processing flow
	  collections.  plain scalars are trimmed if indentation follows in
	  an ambiguous flow collection.

Sat Aug  7 00:50:01 2004  Tanaka Akira  <akr@m17n.org>

	* ext/zlib/zlib.c: Zlib::GzipReader#read(0) returns "" instead of nil.

Tue Aug  3 13:49:20 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/namespace.rb: bug fix

	* ext/tk/lib/tkextlib/treectrl/tktreectrl.rb: add Tk::TreeCtrl.loupe

Mon Aug  2 18:04:21 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/msgcat.rb (set_translation): bug fix (fail to set
	  trans_str to the same as src_str when trans_str is not given.)

Mon Aug  2 11:53:06 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/code_objects.rb (RDoc::Context::find_symbol): Fix infinite recursion
	  looking up some top level symbols (batsman)

Mon Aug  2 11:48:29 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser::do_methods): Allow '.'s in
	  variable names to support SWIG generated files (Hans Fugal)

Sat Jul 31 17:40:16 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* misc/ruby-mode.el (ruby-expr-beg, ruby-parse-partial,
	  ruby-calculate-indent, ruby-move-to-block, ruby-forward-sexp,
	  ruby-backward-sexp): keywords must match word-wise.

Sat Jul 31 05:47:37 2004  why the lucky stiff  <why@ruby-lang.org>

	* lib/yaml.rb (YAML::load_file, YAML::parse_file): added.

	* lib/yaml/rubytypes.rb: exceptions were using an older
	  YAML.object_maker. [ruby-core:03080]

	* ext/syck/token.c (sycklex_yaml_utf8): using newline_len to
	  handline CR-LFs.  "\000" was showing up on folded blocks which
	  stopped at EOF.

	* ext/syck/token.c: re2c compiled with bit vectors now.
	* ext/syck/implicit.c: ditto.
	* ext/syck/bytecode.c: ditto.

Fri Jul 30 16:10:54 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c (lib_fromUTF8_core): raise ArgumentError when
	  the unknown encoding name is given.

	* ext/tcltklib/tcltklib.c (lib_toUTF8_core): ditto.

	* ext/tk/lib/tk.rb (Tk::Encoding.encoding_convertfrom): bug fix.

	* ext/tk/lib/tk.rb (Tk::Encoding.encoding_convertto): ditto.

Wed Jul 28 18:59:17 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/cgi.rb (CGI::initialize): remove at_exit code for CGI_PARAMS
	  and CGI_COOKIES.  they will no longer be used.

Wed Jul 28 01:04:44 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* gc.c (run_final): wrong order of data. [ruby-dev:23984]

Tue Jul 27 07:05:04 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_eval): copy on write for argument local variable
	  assignment.

	* eval.c (assign): ditto.

	* eval.c (rb_call0): update ruby_frame->argv with the default
	  value used for the optional arguments.

	* object.c (Init_Object): "===" calls rb_obj_equal() directly.
	  [ruby-list:39937]

Mon Jul 26 11:22:55 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httputils.rb (WEBrick::HTTPUtils.escape): should
	  escape space.

Sun Jul 25 11:05:21 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* win32/win32.{h,c} (rb_w32_{f,fd,fs}open): workaround for bcc32's
	  {f,fd,fs}open bug. set errno EMFILE and EBADF. [ruby-dev:23963]

Sat Jul 24 13:32:47 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* range.c (rb_range_beg_len): returns Qnil only when "beg" points
	  outside of a range.  No boundary check for "end".

Fri Jul 23 16:40:25 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* gc.c (define_final): should not disclose NODE* to Ruby world.
	  [ruby-dev:23957]

Fri Jul 23 09:03:16 2004  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (disconnected?): new method. (backported from HEAD)

Thu Jul 22 16:41:54 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/cgi/session.rb (CGI::Session::FileStore#update): sets the
	 permission of the session data file to 0600.

	* lib/cgi/session/pstore.rb (CGI::Session::Pstore#initialize):
	  ditto.

Thu Jul 22 00:02:21 2004  Masahiro Kitajima  <katonbo@katontech.com>

	* process.c (rb_f_system): not need to call last_status_set() any
	  longer on _WIN32.

Tue Jul 20 09:15:17 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* test/fileutils/test_fileutils.rb: File.link raises EINVAL on BeOS.

Mon Jul 19 01:15:07 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httpservlet/cgihandler.rb
	  (WEBrick::HTTPServlet::CGIhandler#do_GET): set SystemRoot environment
	  variable to CGI process on Windows native platforms. [ruby-dev:23936]

	* lib/webrick/httpservlet/cgihandler.rb
	  (WEBrick::HTTPServlet::CGIhandler#do_GET): use $?.exitstatus and
	  refine log message.

Sun Jul 18 16:14:29 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/msgcat.rb (TkMsgCatalog.callback): bug fix
	  ( wrong number of argument )

Sun Jul 18 08:13:58 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* sprintf.c (rb_f_sprintf): remove extra sign digit.

Sun Jul 18 03:21:42 2004  Akinori MUSHA  <knu@iDaemons.org>

	* dir.c (range): use NULL instead of 0.

	* dir.c (range): get rid of a gcc 3.4 warning.

Sun Jul 18 03:12:11 2004  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (receive_responses): return if a LOGOUT response
	  received. (backported from HEAD)
	* lib/net/imap.rb (send_string_data): wait command continuation
	  requests before sending octet data of literals. (backported from HEAD)

Sat Jul 17 23:54:59 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/variable.rb: TkVariable#ref returns a TkVariable object

Sat Jul 17 22:04:44 2004  akira yamada  <akira@ruby-lang.org>

	* lib/uri/ldap.rb: method hierarchical? should be in URI::LDAP.

Sat Jul 17 18:29:07 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (stmt): not to show same error messages twice.

Sat Jul 17 13:13:32 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/irb/ruby-lex.rb (RubyLex::identify_string): %s string do not
	  process expression interpolation.  [ruby-talk:106691]

Sat Jul 17 05:26:27 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/diagram.rb: Incorporate Micheal Neuman's
	  client-side imagemao patch

Sat Jul 17 01:57:03 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (THREAD_ALLOC): th->thread should be initialized to NULL.
	  [ruby-talk:106657]  The solution was found by Guy Decoux.

Fri Jul 16 22:30:28 2004  Michael Neumann  <mneumann@ntecs.de>

	* file.c (rb_stat_dev_major): new methods File::Stat#dev_major and
	  #dev_minor. [ruby-core:03195]

Fri Jul 16 15:23:53 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (return_jump, break_jump): raise unexpceted local jump
	  exception directly.  [ruby-dev:23740]

	* lib/base64.rb (Deprecated): super in bound method calls original
	  name method in stable version.  [ruby-dev:23916]

Fri Jul 16 11:31:49 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* lib/test/unit/ui/{fox,gtk,gtk2}/testrunner.rb: remove
	  garbage (patch from akira yamada) [ruby-dev:23911]

Fri Jul 16 11:20:00 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* sprintf.c (rb_f_sprintf): fix output of NaN, Inf and -Inf with
	  "%f" or etc on MSVCRT platforms. (backported from HEAD)

Fri Jul 16 11:17:38 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* error.c (exit_initialize): use EXIT_SUCCESS instead of 0.
	  [ruby-dev:23913]

	* error.c (exit_success_p): new method SystemExit#success?.
	  [ruby-dev:23912]

	* error.c (syserr_initialize): initialization for subclasses.
	  [ruby-dev:23912]

Thu Jul 15 23:53:38 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb (OptionParser#warn, OptionParser#abort): Exception
	  no longer has to_str method.

Thu Jul 15 22:59:48 2004  Shugo Maeda  <shugo@ruby-lang.org>

	* ext/readline/extconf.rb: added dir_config for curses, ncurses,
	  termcap. (backported from HEAD)

Thu Jul 15 20:29:15 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* class.c, error.c, eval.c, intern.h, object.c, variable.c:
	  do not set path if it is a singleton class.  [ruby-dev:22588]
	  (backport from 1.9)

Thu Jul 15 10:15:04 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/, ext/tcltklib/: bug fix

	* ext/tk/lib/tk.rb: better operation for SIGINT when processing
	  callbacks.
	* ext/tk/lib/tk/msgcat.rb: ditto.
	* ext/tk/lib/tk/variable.rb: ditto.
	* ext/tk/lib/tk/timer.rb: ditto.

	* ext/tk/lib/tk/validation.rb: add Tk::ValidateConfigure.__def_validcmd
	  to define validatecommand methods easier

	* ext/tk/lib/tk.rb (_genobj_for_tkwidget): support autoload Tk ext
	  classes

	* ext/tk/lib/tk/canvas.rb and so on: remove the parent widget type
	  check for items (e.g. canvas items; depends on the class) to
	  avoid some troubles on Tk extension widget class definition.

	* ext/tk/lib/tkextlib/: add Iwidget and TkTable extension support

	* ext/tk/sample/tkextlib/: add samples of Iwidget and TkTable

Wed Jul 14 18:08:37 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_asn1.c (ossl_asn1cons_to_der): fix type of
	  argument. [ruby-dev:23891]

	* test/openssl/test_x509store.rb: prune tests for CRL checking
	  unless X509::V_FLAG_CRL_CHECK is defined.

Wed Jul 14 12:29:07 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* util.c (ruby_strtod): should not convert string in the form of
	  "-I.FE-X" which both "I" and "F" are ommitted. [ruby-dev:23883]

	* test/ruby/test_float.rb (test_strtod): add test for bug fix.

Wed Jul 14 00:31:15 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* array.c: rdoc patch. merged patch from Johan Holmberg
	  <holmberg@iar.se> [ruby-core:3170]

Tue Jul 13 19:39:12 2004  akira yamada  <akira@ruby-lang.org>

	* lib/uri/generic.rb (URI::Generic#merge_path):
	  "URI('http://www.example.com/foo/..') + './'" should return
	  "URI('http://www.example.com/')".  [ruby-list:39838]
	  "URI('http://www.example.com/') + './foo/bar/..'" should return
	  "URI('http://www.example.com/foo/')".  [ruby-list:39844]

	* test/uri/test_generic.rb (TestGeneric#test_merge): added tests.

Tue Jul 13 15:51:45 2004  Akinori MUSHA  <knu@iDaemons.org>

	* lib/mkmf.rb (init_mkmf): Do not add $(libdir) to $LIBPATH in
	   extmk mode.

	* lib/mkmf.rb (dir_config): Prepend a new library path instead of
	  appending so it is tried first.

Tue Jul 13 00:50:48 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb: Support call-seq: for Ruby files.

Mon Jul 12 21:20:36 2004  Dave Thomas  <dave@pragprog.com>

	* html_generator.rb: Support hyperlinks of the form {any text}[xxx]
	  as well as stuff[xxx]

Sat Jul 10 09:30:24 2004  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/soap/marshal/test_struct.rb: use qualified build-tin class name
	  (::Struct) to avoid name crash.

Sat Jul 10 04:21:56 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: better operation for SIGINT when processing
	  callbacks.
	* ext/tk/lib/tk/msgcat.rb: ditto.
	* ext/tk/lib/tk/variable.rb: ditto.
	* ext/tk/lib/tk/timer.rb: ditto.

	* ext/tk/lib/tk/validation.rb (__def_validcmd):  add a module
	  function of Tk::ValidateConfigure to define validatecommand
	  methods easier

Fri Jul  9 22:36:36 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* array.c, enum.c, pack.c: rdoc patch from Johan Holmberg
	  <holmberg@iar.se> [ruby-core:3132] [ruby-core:3136]

	* numeric.c: rdoc patch.

Fri Jul  9 19:26:39 2004  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb (URI::HTTPS#proxy_open): raise ArgumentError to
	  notice https is not supported.

Fri Jul  9 14:28:54 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_thread_raise): accept third argument as well as
	  Kernel#raise, and evaluate the arguments to create an exception in
	  the caller's context.  [ruby-talk:105507]

Fri Jul  9 01:47:08 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib : bug fix
	* ext/tk/lib/tkextlib/itcl : add [incr Tcl] support
	* ext/tk/lib/tkextlib/itk  : add [incr Tk] support
	* ext/tk/lib/tkextlib/iwidgets : midway point of [incr Widgets] support
	* ext/tk/sample/tkextlib/iwidgets : very simple examples of
	  [incr Widgets]

Thu Jul  8 22:52:19 2004  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/{rss,parser,0.9,1.0,2.0}.rb: supported RSS 0.9x/2.0
	  validation and validation which disregard order of elements.
	* test/rss/test_parser.rb: added tests for RSS 0.9x/2.0
	  validation.
	* test/rss/{test_trackback,rss-testcase}.rb: fixed no good method
	  name.

Thu Jul  8 00:05:23 2004  akira yamada  <akira@ruby-lang.org>

	* lib/tempfile.rb (Tempfile::initialize): got out code of
	  generating tmpname.  [ruby-dev:23832][ruby-dev:23837]

Wed Jul  7 15:53:14 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* string.c (rb_str_match): raise TypeError when both arguments are
	  strings. [ruby-dev:22869] (backported from HEAD)

	* string.c (rb_str_match2): removed.

	* Makefile.in, bcc32/Makefile.sub, win32/Makefile.sub,
	  wince/Makefile.sub (string.c): now not depend on version.h.

Wed Jul  7 00:48:34 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* ext/tk/lib/tkextlib/tktrans.rb,
	  ext/tk/lib/tkextlib/treectrl.rb: fix syntax errors.

Tue Jul  6 18:38:45 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib : improve framework of developping Tcl/Tk extension
	  wrappers

Mon Jul  5 23:56:42 2004  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/{trackback,syndication,dublincore,content}.rb: worked
	  with ruby 1.6 again.

	* test/rss/rss-assertions.rb: ditto.

Mon Jul  5 22:54:39 2004  Tanaka Akira  <akr@m17n.org>

	* lib/uri/common.rb (Kernel#URI): new global method for parsing URIs.

Mon Jul  5 09:02:52 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_thread_yield, rb_f_catch): 4th argument to rb_yield_0()
	  is a set of bit flags.  [ruby-dev:23859]

Mon Jul  5 01:27:32 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* lib/drb/drb.rb(DRbConn self.open): If socket pool is full, close
	  the socket whose last-access-time is oldest. (and add new one)
	  [ruby-dev:23860]

Sun Jul  4 12:24:50 2004  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rss.rb: added copyright header.

Sun Jul  4 00:24:40 2004  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* added files
	  * lib/soap/attachment.rb
	  * lib/soap/header
	  * lib/soap/mimemessage.rb
	  * lib/soap/rpc/httpserver.rb
	  * lib/wsdl/soap/cgiStubCreator.rb
	  * lib/wsdl/soap/classDefCreator.rb
	  * lib/wsdl/soap/classDefCreatorSupport.rb
	  * lib/wsdl/soap/clientSkeltonCreator.rb
	  * lib/wsdl/soap/driverCreator.rb
	  * lib/wsdl/soap/mappingRegistryCreator.rb
	  * lib/wsdl/soap/methodDefCreator.rb
	  * lib/wsdl/soap/servantSkeltonCreator.rb
	  * lib/wsdl/soap/standaloneServerStubCreator.rb
	  * lib/wsdl/xmlSchema/enumeration.rb
	  * lib/wsdl/xmlSchema/simpleRestriction.rb
	  * lib/wsdl/xmlSchema/simpleType.rb
	  * lib/xsd/codegen
	  * lib/xsd/codegen.rb
	  * sample/soap/authheader
	  * sample/soap/raa2.4
	  * sample/soap/ssl
	  * sample/soap/swa
	  * sample/soap/whois.rb
	  * sample/soap/calc/samplehttpd.conf
	  * sample/soap/exchange/samplehttpd.conf
	  * sample/soap/sampleStruct/samplehttpd.conf
	  * sample/wsdl/raa2.4
	  * sample/wsdl/googleSearch/samplehttpd.conf
	  * test/openssl/_test_ssl.rb
	  * test/soap/header
	  * test/soap/ssl
	  * test/soap/struct
	  * test/soap/swa
	  * test/soap/wsdlDriver
	  * test/wsdl/multiplefault.wsdl
	  * test/wsdl/simpletype
	  * test/wsdl/test_multiplefault.rb

	* modified files
	  * lib/soap/baseData.rb
	  * lib/soap/element.rb
	  * lib/soap/generator.rb
	  * lib/soap/marshal.rb
	  * lib/soap/netHttpClient.rb
	  * lib/soap/parser.rb
	  * lib/soap/processor.rb
	  * lib/soap/property.rb
	  * lib/soap/soap.rb
	  * lib/soap/streamHandler.rb
	  * lib/soap/wsdlDriver.rb
	  * lib/soap/encodingstyle/handler.rb
	  * lib/soap/encodingstyle/literalHandler.rb
	  * lib/soap/encodingstyle/soapHandler.rb
	  * lib/soap/mapping/factory.rb
	  * lib/soap/mapping/mapping.rb
	  * lib/soap/mapping/registry.rb
	  * lib/soap/mapping/rubytypeFactory.rb
	  * lib/soap/mapping/wsdlRegistry.rb
	  * lib/soap/rpc/cgistub.rb
	  * lib/soap/rpc/driver.rb
	  * lib/soap/rpc/element.rb
	  * lib/soap/rpc/proxy.rb
	  * lib/soap/rpc/router.rb
	  * lib/soap/rpc/soaplet.rb
	  * lib/soap/rpc/standaloneServer.rb
	  * lib/wsdl/data.rb
	  * lib/wsdl/definitions.rb
	  * lib/wsdl/operation.rb
	  * lib/wsdl/parser.rb
	  * lib/wsdl/soap/definitions.rb
	  * lib/wsdl/xmlSchema/complexContent.rb
	  * lib/wsdl/xmlSchema/complexType.rb
	  * lib/wsdl/xmlSchema/data.rb
	  * lib/wsdl/xmlSchema/parser.rb
	  * lib/wsdl/xmlSchema/schema.rb
	  * lib/xsd/datatypes.rb
	  * lib/xsd/qname.rb
	  * sample/soap/calc/httpd.rb
	  * sample/soap/exchange/httpd.rb
	  * sample/soap/sampleStruct/httpd.rb
	  * sample/soap/sampleStruct/server.rb
	  * sample/wsdl/amazon/AmazonSearch.rb
	  * sample/wsdl/amazon/AmazonSearchDriver.rb
	  * sample/wsdl/googleSearch/httpd.rb
	  * test/soap/test_basetype.rb
	  * test/soap/test_property.rb
	  * test/soap/test_streamhandler.rb
	  * test/soap/calc/test_calc.rb
	  * test/soap/calc/test_calc2.rb
	  * test/soap/calc/test_calc_cgi.rb
	  * test/soap/helloworld/test_helloworld.rb
	  * test/wsdl/test_emptycomplextype.rb
	  * test/wsdl/axisArray/test_axisarray.rb
	  * test/wsdl/datetime/test_datetime.rb
	  * test/wsdl/raa/test_raa.rb
	  * test/xsd/test_xmlschemaparser.rb
	  * test/xsd/test_xsd.rb

	* summary
	  * add SOAP Header mustUnderstand support.

	  * add HTTP client SSL configuration and Cookies support (works
	    completely with http-access2).

	  * add header handler for handling sending/receiving SOAP Header.

	  * map Ruby's anonymous Struct to common SOAP Struct in SOAP Object
	    Model.  it caused error.

	  * add WSDL simpleType support to restrict lexical value space.

	  * add SOAP with Attachment support.

Sat Jul  3 17:19:44 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* ext/tk/lib/tkextlib/tkDND.rb: fix syntax error.

Thu Jul  1 23:15:29 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/pstore.rb (transaction): safer backup scheme.  [ruby-list:39102]

	* lib/pstore.rb (commit_new): use FileUtils.copy_stream for Cygwin.
	  [ruby-dev:23157]

	* lib/pstore.rb (transaction): allow overriding dump and load.
	  [ruby-dev:23567]

	* lib/pstore.rb (PStore#transaction): get rid of opening in write mode
	  when read only transaction.  [ruby-dev:23842]

	* lib/yaml/store.rb: follow lib/pstore.rb's change.

Thu Jul  1 18:36:08 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tcltklib : bug fix

	* ext/tk/lib/tk : bug fix and add Tcl/Tk extension support libraries

Thu Jul  1 11:59:45 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/extconf.rb: check for EVP_CIPHER_CTX_copy, ENGINE_add,
	  EVP_CIPHER_CTX_set_padding, EVP_CipherFinal_ex, EVP_CipherInit_ex,
	  EVP_DigestFinal_ex and EVP_DigestInit_ex.

	* ext/openssl/openssl_missing.c (EVP_CIPHER_CTX_copy): new function.

	* ext/openssl/openssl_missing.h (EVP_DigestInit_ex, EVP_DigestFinal_ex,
	  EVP_CipherInit_ex, EVP_CipherFinal_ex, HMAC_Init_ex): new macro for
	  OpenSSL 0.9.6.

	* ext/openssl/ossl_cipher.c (ossl_cipher_encrypt, ossl_cipher_decrypt):
	  re-implemnt (the arguments for this method is ).

	* ext/openssl/ossl_cipher.c (ossl_cipher_pkcs5_keyivgen): new method
	  OpenSSL::Cipher::Cipher#pkcs5_keyivgen. it calls EVP_BytesToKey().

	* ext/openssl/ossl_cipher.c (ossl_cipher_alloc, ossl_cipher_initialize,
	  ossl_cipher_copy, ossl_cipher_reset ossl_cipher_final,
	  ossl_cipher_set_key, ossl_cipher_set_iv): replace all EVP_CipherInit
	  and EVP_CipherFinal into EVP_CipherInit_ex and EVP_CipherFinal_ex.
	  and EVP_CIPHER_CTX_init should only be called once.

	* ext/openssl/ossl_cipher.c (ossl_cipher_set_key_length): new method
	  OpenSSL::Cipher::Cipher#key_len=.

	* ext/openssl/ossl_cipher.c (ossl_cipher_init_deprecated): new
	  finction; print warning for Cipher#<<.

	* ext/openssl/ossl_digest.c: replace all EVP_DigestInit and
	  EVP_DigestFinal into EVP_DigestInit_ex and EVP_DigestFinal_ex.
	  and EVP_MD_CTX_init should only be called once.

	* ext/openssl/ossl_digest.c (digest_final): should call
	  EVP_MD_CTX_cleanup to avoid memory leak.

	* ext/openssl/ossl_hmac.c (ossl_hmac_initialize): repalce HMAC_init
	  into HMAC_init_ex. and HMAC_CTX_init is moved to ossl_hmac_alloc.

	* ext/openssl/ossl_hmac.c (hmac_final): should call
	  HMAC_CTX_cleanup to avoid memory leak.

	* test/openssl/test_cipher.rb, test/openssl/test_digest.rb,
	  test/openssl/test_hmac.rb: new file.

Thu Jul  1 04:08:30 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_asn1.c (ossl_i2d_ASN1_TYPE, ossl_ASN1_TYPE_free):
	  workaround for the versions earlier than OpenSSL-0.9.7.

Thu Jul  1 03:33:55 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_pkey_dh.c (ossl_dh_initialize): should create
	  empty pkey object if no argument is passed. [ruby-talk:103328]

	* ext/openssl/ossl_pkey_dsa.c (ossl_dsa_initialize): ditto.

	* ext/openssl/ossl_pkey_rsa.c (ossl_rsa_initialize): ditto.

	* ext/openssl/ossl_pkey_dh.c: add new methods: OpenSSL::PKey::DH#p,
	  OpenSSL::PKey::DH#p=, OpenSSL::PKey::DH#g, OpenSSL::PKey::DH#g=,
	  OpenSSL::PKey::DH#pub_key, OpenSSL::PKey::DH#pub_key=,
	  OpenSSL::PKey::DH#priv_key and OpenSSL::PKey::DH#priv_key=.

	* ext/openssl/ossl_pkey_dsa.c: add new methods: OpenSSL::PKey::DSA#p,
	  OpenSSL::PKey::DSA#p=, OpenSSL::PKey::DSA#q, OpenSSL::PKey::DSA#q=,
	  OpenSSL::PKey::DSA#g, OpenSSL::PKey::DSA#g=,
	  OpenSSL::PKey::DSA#pub_key, OpenSSL::PKey::DSA#pub_key=,
	  OpenSSL::PKey::DSA#priv_key and OpenSSL::PKey::DSA#priv_key=.

Thu Jul  1 03:16:09 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_ssl.c (ossl_ssl_read): take optional second argument
	  to specify a string to be written.

	* ext/openssl/lib/openssl/buffering.rb (OpenSSL::Buffering#read):
	  take optional second argument to specify a string to be written.

	* ext/openssl/lib/openssl/buffering.rb (OpenSSL::Buffering#gets):
	  refine regexp for end-of-line.

	* ext/opnessl/lib/openssl/ssl.rb
	  (OpenSSL::SSL::SocketForwarder#listen): fix typo.

Wed Jun 30 11:38:51 2004  Mikael Brockman  <phubuh@phubuh.org>

	* parse.y (primary): should not be NULL.  [ruby-core:03098]

Wed Jun 30 02:53:24 2004  why the lucky stiff  <why@ruby-lang.org>

	* ext/syck/rubyext.c (syck_emitter_new): set buffer after
	  Data_Wrap_Struct to avoid possible GC. [ruby-talk:104835]

Tue Jun 29 10:31:19 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_eval_cmd, rb_thread_trap_eval): restore safe level.

	* gc.c (define_final, run_final): preserve and restore safe level for
	  finalizers.  [ruby-core:03058]

	* signal.c (signal_exec, rb_trap_exit, trap): preserve and restore
	  safe level for signal handlers.  [ruby-dev:23829]

Mon Jun 28 14:57:56 2004  Jeff Mitchell  <quixoticsycophant@yahoo.com>

	* configure.in, lib/mkmf.rb (LIBPATHFLAG): use double quotes due to
	  DOSISH compilers.  [ruby-core:03107]

Mon Jun 28 00:30:19 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* sample/drb/*.rb: using 'DRb.thread.join' instead of 'gets'

Sun Jun 27 22:39:51 2004  Kouhei Sutou  <kou@cozmixng.org>

	* sample/rss/tdiary_plugin/rss-recent.rb: supported Hiki.

Sun Jun 27 12:19:46 2004  Kouhei Sutou  <kou@cozmixng.org>

	* {lib,sample,test}/rss: added RSS Parser. [ruby-dev:23780]

Sat Jun 26 11:07:30 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (aix): -b must come at the start of the command line,
	  and -e must not appear while testing libraries.  [ruby-talk:104501]

	* lib/mkmf.rb (dir_config): quote directory names if necessary.
	  [ruby-talk:104505]

Fri Jun 25 15:33:19 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/iconv/extconf.rb: check stricter.  [ruby-talk:104501]

	* ext/iconv/extconf.rb: include iconv.h for libiconv.  [ruby-dev:22715]

Fri Jun 25 08:31:29 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_thread_atfork): remove "fork terminates thread"
	  warning.  [ruby-dev:23768]

	* object.c (rb_obj_clone): backport FL_FINALIZE patch from 1.9.
	  [ruby-core:02786][ruby-core:03067]

	* ext/socket/socket.c (sock_sockaddr): Socket#gethostbyname()
	  should give us packed address, not struct sockaddr.
	  [ruby-core:03053]

Fri Jun 25 02:04:23 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* {bcc32,win32,wince}/setup.mak: remove RUBY_EXTERN lines when
	  including version.h. [ruby-talk:104456] (backported from HEAD)

Thu Jun 24 14:23:29 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_fread): return already read data when system call is
	  interrupted.  [ruby-talk:97206]

Thu Jun 24 01:32:43 2004  Shugo Maeda  <shugo@ruby-lang.org>

	* version.h: added declarations of ruby_version,
	  ruby_release_date, ruby_platform.
	  (backported from HEAD)

Wed Jun 23 22:23:37 2004  Dave Thomas  <dave@pragprog.com>

	* ext/socket/socket.c (sock_s_gethostbyaddr): Work around problem
	  with OS X not returning 'from' parameter to recvfrom for
	  connection-oriented sockets.

Wed Jun 23 01:45:27 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RubyLex::identify_quotation):
	  Fix problem with the 'r' being dropped from %r{xxx}

Wed Jun 23 00:20:20 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/win32ole/win32ole.c (ole_hresult2msg): remove trailing
	  CRs and LFs. (doesn't depend on CR+LF) [ruby-dev:23749]

Wed Jun 23 00:00:25 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_initialize): should check fcntl result.  [ruby-dev:23742]

Tue Jun 22 21:11:36 2004  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c (OLE_FREE): should not call CoFreeUnuse-
	  dLibraries().

	* ext/win32ole/win32ole.c (ole_event_free): ditto.

	* ext/win32ole/win32ole.c (ole_hresult2msg): truncate error message
	  before CR.

Tue Jun 22 16:47:42 2004  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/ftp.rb (MDTM_REGEXP): fix for demon's ftp server.
	  Thanks, Rutger Nijlunsing.

Mon Jun 21 10:19:23 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (rb_w32_opendir): use FindFirstFile()/FindNextFile()/
	  FindClose() instead of _findfirst()/_findnext()/_findclose().
	  merge from HEAD.

Sat Jun 19 13:24:15 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (method_call): allow changing $SAFE.  [ruby-dev:23713]

Fri Jun 18 23:12:22 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (proc_save_safe_level, rb_set_safe_level, safe_setter): limit
	  safe level.

Wed Jun 16 23:05:57 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* object.c (rb_mod_freeze): prepare string representation before
	  freezing. [ruby-talk:103646]

Wed Jun 16 16:04:40 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* object.c (rb_mod_le): singleton class inherits Class rather than its
	  object's class.  [ruby-dev:23690]

Wed Jun 16 16:01:17 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (stack_grow_direction): memoize the direction.

	* gc.c (Init_stack): should always move to end of VALUE.

Tue Jun 15 12:10:04 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: bug fix (TkWindow#grab)

Mon Jun 14 18:23:27 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/remote-tk.rb: bug fix

Sun Jun 13 00:23:04 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/extconf.rb: [EXPERIMENTAL] MacOS X (darwin) support

	* ext/tcltklib/tcltklib.c: fix thread trouble on callback proc, and
	  eliminate warning about instance variable access

	* ext/tk/lib/tk/menubar.rb: improve supported menu_spec

	* ext/tk/lib/tk/menuspec.rb: [add] menu_spec support library

	* ext/tk/lib/tk/root.rb: add menu_spec support

	* ext/tk/lib/tk/text.rb: bug fix

	* ext/tk/lib/tk/toplevel.rb: add menu_spec support

	* ext/tk/sample/menubar?.rb: [add] sample of menu_spec usage

Sat Jun 12 11:15:53 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in (target_os): strip -gnu suffix on Linux.

Fri Jun 11 17:08:21 2004  Akinori MUSHA  <knu@iDaemons.org>

	* config.guess: Restore a wrongly removed hyphen.

Fri Jun 11 14:30:08 2004  Akinori MUSHA  <knu@iDaemons.org>

	* config.guess: Attempt to avoid system name change on
	  Darwin platforms also.

Fri Jun 11 14:22:45 2004  Akinori MUSHA  <knu@iDaemons.org>

	* config.guess, config.sub: Attempt to avoid system name change on
	  Linux platforms.  We have been using "linux" instead of
	  "linux-gnu" on this branch.

Thu Jun 10 19:19:41 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/sdbm/init.c (fsdbm_store): sdbm should use StringValue().
	  [ruby-talk:103062]

Wed Jun  9 18:04:14 2004  akira yamada  <akira@ruby-lang.org>

	* lib/uri/generic.rb (URI::Generic::merge,
	  URI::Generic::route_from): accepts non-hierarchical URI.
	  [ruby-dev:23631]

	* test/uri/test_generic.rb (TestGeneric::test_route,
	  TestGeneric::test_merge): added tests for above changes.

Wed Jun  9 17:39:37 2004  Akinori MUSHA  <knu@iDaemons.org>

	* config.guess, config.sub: Update to a more recent version as of
	  2004-01-20.

	* configure.in: Add support for DragonFly BSD.

Wed Jun  2 20:16:03 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (str_new4): should share shared instance if it already
	  exists.  [ruby-dev:23665]

Wed Jun  2 12:41:53 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (rb_io_gets_m): set lastline ($_) even when read line is
	  nil.  [ruby-dev:23663]

Fri May 28 11:20:31 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_eval): bad influence on frame node.

	* eval.c (eval): reverted wrongly removed condition.  [ruby-dev:23638]

Thu May 27 23:15:18 2004  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/logger.rb: leading 0 padding of timestamp usec part.

	* lib/csv.rb (CSV.parse): [CAUTION] behavior changed.  in the past,
	  CSV.parse accepts a filename to be read-opened (it was just a
	  shortcut of CSV.open(filename, 'r')).  now CSV.parse accepts a
	  string or a stream to be parsed e.g.
	  CSV.parse("1,2\n3,r") #=> [['1', '2'], ['3', '4']]

	* lib/csv.rb: CSV::Row and CSV::Cell are deprecated.  these classes
	  are removed in the future.  in the new csv.rb, row is represented
	  as just an Array.  since CSV::Row was a subclass of Array, it won't
	  hurt almost all programs except one which depended CSV::Row#match.
	  and a cell is represented as just a String or nil(NULL).  this
	  change will cause widespread destruction.

	      CSV.open("foo.csv", "r") do |row|
		row.each do |cell|
		  if cell.is_null       # using Cell#is_null
		    p "(NULL)"
		  else
		    p cell.data         # using Cell#data
		  end
		end
	      end

	    must be just;

	      CSV.open("foo.csv", "r") do |row|
		row.each do |cell|
		  if cell.nil?
		    p "(NULL)"
		  else
		    p cell
		  end
		end
	      end

	* lib/csv.rb: [CAUTION] record separator(CR, LF, CR+LF) behavior
	  change.  CSV.open, CSV.parse, and CSV,generate now do not force
	  opened file binmode.  formerly it set binmode explicitly.

	  with CSV.open, binmode of opened file depends the given mode
	  parameter "r", "w", "rb", and "wb".  CSV.parse and CSV.generate open
	  file with "r" and "w".

	  setting mode properly is user's responsibility now.

	* lib/csv.rb: accepts String as a fs (field separator/column separator)
	  and rs (record separator/row separator)

	* lib/csv.rb (CSV.read, CSV.readlines): added.  works as IO.read and
	  IO.readlines in CSV format.

	* lib/csv.rb: added CSV.foreach(path, rs = nil, &block).  CSV.foreach
	  now does not handle "| cmd" as a path different from IO.foreach.
	  needed?

	* test/csv/test_csv.rb: updated.

	* test/ruby/test_float.rb: added test_strtod to test Float("0").

Thu May 27 21:37:50 2004  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb (Pathname#initialize): refine pathname initialization
	  by pathname.

Thu May 27 20:22:05 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* io.c (rb_io_fwrite): check all case errno != 0 [ruby-dev:23648]

Thu May 27 14:53:13 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* io.c (rb_io_fwrite): workaround for bcc32's fwrite bug.
	  add errno checking.  [ruby-dev:23627]

Wed May 26 14:19:42 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_eval, eval): make line number consistent on eval with
	  Proc.  [ruby-talk:101253]

Wed May 26 13:59:17 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::skip_for_variable): Allow for
	  'do' after for statement

Wed May 26 13:56:03 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/html_generator.rb (Generators::MarkUp::style_url): Fix
	  relative path to code CSS file

Wed May 26 13:14:52 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_init_copy): copy also positions.  [ruby-talk:100910]

Wed May 26 00:00:00 2004  why the lucky stiff  <why@ruby-lang.org>

	* ext/syck/syck.c (syck_new_parser): clear parser on init.
	  thanks, ts. [ruby-core:02931]

	* ext/syck/token.c (sycklex_yaml_utf8): buffer underflow.
	  thanks, ts. [ruby-core:02929]

	* lib/yaml/baseemitter.rb (indent_text): simpler flow block code.

	* lib/yaml.rb: added rdoc to beginning of lib.

Mon May 24 10:46:26 2004  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* lib/rdoc/generators/template/html/html.rb: SYSTEM identifiers
	  must be absolute URIs

Sat May 22 12:00:04 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* MANIFEST: add new encodings in rexml.

	* ext/tk/MANIFEST: add recent files.

Sat May 22 05:37:11 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/remote-tk.rb: (NEW library) controll Tk interpreters
	  on the other processes by Tcl/Tk's 'send' command

Fri May 21 09:22:05 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_method_parameters):
	  Add ()'s around parameters that don't have them

Thu May 20 17:02:03 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (check_sizeof): define result size.  [ruby-core:02911]

	* lib/mkmf.rb (create_header): macro name should not include equal
	  sign.

Thu May 20 15:59:50 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* ext/socket/socket.c: fix SEGV. [ruby-dev:23550]

Thu May 20 14:35:52 2004  Tanaka Akira  <akr@m17n.org>

	* ext/socket/socket.c: check SCM_RIGHTS macro addition to
	  the msg_control field to test existence of file descriptor passing
	  by msg_control.

Thu May 20 12:38:06 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* numeric.c (flo_eq): always check if operands are NaN.
	  [ruby-list:39685]

Thu May 20 12:34:39 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_visibility):
	  At Ryan Davis' suggestion, honor visibility modifers if guarded by a
	  statement modifier

Thu May 20 12:22:13 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (have_type): do not check pointer to incomplete type,
	  which always get compiled.  [ruby-list:39683]

Wed May 19 11:09:00 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: change permition of TkObject#tk_send from
	  private to public

Tue May 18 14:00:46 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* node.h (NEW_DSTR): adjust list length.

	* parse.y (literal_concat): ditto.

Mon May 17 16:14:25 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* numeric.c (flo_to_s): it's preferable that "p 0.0" outputs "0.0"
	  instead of "0.0e+00". [ruby-dev:23480]

	* numeric.c (flo_to_s): it's preferable that "p 0.00000000000000000001"
	  outputs "1.0e-20" instead of "9.999999999999999e-21". (the precision
	  is considered, but there is assumption DBL_DIG == 15 in current
	  implementation)

Mon May 17 10:13:33 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/socket/socket.c (setup_domain_and_type): honor duck typing.
	  [ruby-dev:23522]

	* ext/socket/socket.c (sock_s_getnameinfo): ditto.

Mon May 17 01:15:23 2004  why the lucky stiff  <why@ruby-lang.org>

	* lib/yaml.rb: removed fallback to pure Ruby parser.

	* lib/yaml/baseemitter.rb (indent_text): was forcing a mod value
	  of zero at times, which kept some blocks from getting indentation.

	* lib/yaml/baseemitter.rb (node_text): rewriting folded scalars.

	* ext/syck/syck.h: reports style of scalars now, be they plain, block
	  single-, or double-quoted.

	* ext/syck/syck.c: ditto.

	* ext/syck/gram.c: ditto.

	* ext/syck/node.c: ditto.

	* ext/syck/token.c: ditto.

	* ext/syck/rubyext.c (yaml_org_handler): symbols loaded only
	  if scalar style is plain.

	* ext/syck/rubyext.c (yaml_org_handler): some empty strings were
	  loaded as symbols.

	* test/yaml/test_yaml.rb (test_perl_regexp): updated test to
	  match new regexp serialization.

Mon May 17 00:03:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* lib/drb/drb.rb: Cosmetic documentation changes.

Sun May 16 22:36:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* lib/test/unit.rb: Removed :nodoc: directive (it prevented effective
	  RDoc operation), and added file-level comment.

Sun May 16 20:55:49 2004  Tanaka Akira  <akr@m17n.org>

	* ext/dbm/dbm.c (fdbm_initialize): accept optional 3rd argument to
	  specify an open flag.
	  (Init_dbm): define open flags: DBM::READER, DBM::WRITER, DBM::WRCREAT
	  and DBM::NEWDB.

Sun May 16 13:10:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* lib/test/unit/**/*.rb: Removed :nodoc: directives (many were
	  generating warnings, many were on private methods).

Sat May 15 01:41:34 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (eval): forgot to restore $SAFE value before evaluating
	  compiled node.  [ruby-core:02872]

Sat May 15 01:33:12 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* range.c (range_each_func): terminates loop if generating value
	  is same to @end.  [ruby-talk:100269]

Fri May 14 22:08:38 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_new4): should not reuse frozen shared string if
	  the original is not an instance of String. [ruby-talk:100193]

Fri May 14 18:39:25 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/canvas.rb: improve coords support for canvas items.
	  Now, supports all of the followings.
	    TkcLine.new(c, 0, 0, 100, 100, :fill=>'red')
	    TkcLine.new(c, [0, 0, 100, 100], :fill=>'red')
	    TkcLine.new(c, [0, 0], [100, 100], :fill=>'red')
	    TkcLine.new(c, [[0, 0], [100, 100]], :fill=>'red')
	    TkcLine.new(c, :coords=>[0, 0, 100, 100], :fill=>'red')
	    TkcLine.new(c, :coords=>[[0, 0], [100, 100]], :fill=>'red')

Fri May 14 12:11:43 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* util.c (ruby_strtod): strtod("0", &end); => end should point '\0'.
	 [ruby-dev:23498]

Thu May 13 15:47:30 2004  akira yamada  <akira@ruby-lang.org>

	* lib/net/telnet.rb (Net::Telnet::login): "options" can specify
	  regexps for login prompt and/or password prompt.

Thu May 13 14:23:45 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* hash.c (delete_if_i): use st_delete_safe() (via
	  rb_hash_delete()) instead of returning ST_DELETE.
	  backport from HEAD.  [ruby-dev:23487]

Thu May 13 13:01:30 2004  akira yamada  <akira@ruby-lang.org>

	* lib/uri/mailto.rb (URI::MailTo::to_s): should include fragment.

Thu May 13 11:04:08 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* pack.c (pack_pack): always add with null for 'Z'.

	* pack.c (pack_unpack): terminated by null for 'Z'.  [ruby-talk:98281]

Wed May 12 19:59:43 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (have_type, check_sizeof): replace unusable characters.
	  [ruby-talk:99788]

Wed May 12 17:41:42 2004  Tanaka Akira  <akr@m17n.org>

	* lib/resolv.rb (Resolv::DNS::Config): make it configurable without
	  external file such as /etc/resolv.conf.

Wed May 12 14:37:27 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_x509name.c: attribute value of DC (short name of
	  domainComponent) should be IA5String.

Wed May 12 13:20:19 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk/composite.rb: improve configure methods (based on
	  the proposal of [ruby-talk:99671]).

Wed May 12 11:51:08 2004  Dave Thomas  <dave@pragprog.com>

	* class.c (rb_obj_singleton_methods): fix rdoc

Mon May 10 21:44:42 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/html_generator.rb: Change scheme for
	  looking up symbols in  HTML generator.

Mon May 10 16:45:21 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (eval): warning during eval should not cause deadlock.
	  [ruby-talk:98651]

	* eval.c (rb_eval): raise TypeError exception for superclass
	  mismatch.  [ruby-list:39567]

Mon May 10 12:11:37 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/html_generator.rb: Hack to search parents
	  for unqualified constant names.

Mon May 10 12:11:37 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/html_generator.rb: Hack to search parents
	  for unqualified constant names.

Sun May  9 22:37:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* lib/net/ftp.rb: improved documentation
	* lib/net/imap.rb: ditto
	* lib/net/pop.rb: ditto
	* lib/net/smtp.rb: ditto
	* lib/net/telnet.rb: ditto

Fri May  7 21:50:21 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::parse_include): Allow
	  multiple arguments to 'include'

Fri May  7 21:31:56 2004  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (fu_list): Array() breaks pathes including "\n".
	  [ruby-core:02843]

Fri May  7 11:25:53 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* util.c (ruby_strtod): "0.0000000000000000001" should be converted
	  to 1.0e-19 instead of 0.0. (leading zeros aren't significant digits)
	  [ruby-talk:99318] [ruby-dev:23465]

Fri May  7 10:00:05 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/tkutil.c (get_eval_string_core): bug fix. [ruby-dev:23466]

Thu May  6 22:13:17 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* ext/socket/socket.c (ippaddr): use NUMERICHOST if can not resolve
	  hostname.

Thu May  6 14:22:29 2004  why the lucky stiff  <why@ruby-lang.org>

	* lib/yaml/rubytypes.rb (to_yaml): added instance variable handling
	  for Ranges, Strings, Structs, Regexps.

	* lib/yaml/rubytypes.rb (to_yaml_fold): new method for setting a
	  String's flow style.

	* lib/yaml.rb (YAML::object_maker): now uses Object.allocate.

	* ext/syck/gram.c: fixed transfer methods on structs, broke it
	  last commit.

Thu May  6 11:40:28 2004  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (string): accept NIL.

	* lib/net/imap.rb (body_type_basic): allow body-fields omissions.

Thu May  6 01:59:04 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/html_generator.rb (Generators::HtmlMethod::params):
	  Don't include the &block parameter if we have explicit
	  yield parameters.

Wed May  5 03:40:29 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/rinda/ring.rb: use recv instead of recvfrom.

Tue May  4 23:52:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* lib/gserver.rb: documented

Tue May  4 23:46:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* lib/xmlrpc/README.txt: introduced for documentation purposes

Mon May  3 09:47:24 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_method_or_yield_parameters):
	  Fix parsing bug if yield called within 1 line block

Sun May  2 01:04:38 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib, ext/tk: renewal Ruby/Tk

Fri Apr 30 20:08:41 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* time.c (SIZEOF_TIME_T): support SIZEOF_TIME_T == SIZEOF_INT.

Tue Apr 27 13:12:42 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_eval): too many line trace call. (ruby-bugs PR#1320)

Tue Apr 27 08:41:28 2004  why the lucky stiff  <why@ruby-lang.org>

	* lib/yaml/rubytypes.rb: passing Range tests.

	* ext/syck/syck.h: version 0.44.

	* ext/syck/gram.c: transfers no longer open an indentation.
	  fixed transfers which precede blocks.

	* ext/syck/token.c: ditto.

	* ext/syck/syck.c: fixed segfault if an anchor has been released already.

	* ext/syck/node.c (syck_free_members): organized order of free'd nodes.

	* ext/syck/rubyext.c (syck_emitter_write_m): test for proper string with
	  StringValue.

Mon Apr 26 23:56:54 2004  Daniel Kelley  <news-1082945587@dkelley.gmp.san-jose.ca.us>

	* README.EXT, README.EXT.ja: fixed wrong function signature.
	  [ruby-talk:98349]

Mon Apr 26 21:40:09 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/code_objects.rb (RDoc::Context::add_alias): Only alias
	  to instance methods.

Sat Apr 24 10:38:31 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/markup/simple_markup.rb (SM::SimpleMarkup::group_lines):
	  Fix bug where consecutive headings are merged.

Fri Apr 23 23:26:13 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb: $hdrdir should not contain macros for backward
	  compatibility.  [bruby-dev:28]

	* version.c (ruby_show_copyright): obtain copyright year from
	  RUBY_RELEASE_YEAR.

	* win32/resource.rb: ditto.

	* win32/resource.rb: default rubyw icon to ruby.ico, and let DLL also
	  include them.

	* win32/resource.rb: include winver.h for older WindowsCE.

Fri Apr 23 16:38:46 2004  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb: sync taint/freeze flag between
	  a pathname object and its internal string object.

Fri Apr 23 14:52:08 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (stmt, arg, aref_args): should not make sole splat into
	  array, in aref_args other than aref with op_asgn.

Fri Apr 23 14:14:38 2004  Tanaka Akira  <akr@m17n.org>

	* lib/resolv.rb: don't use Regexp#source to embed regexps.
	  [ruby-dev:23432]

Thu Apr 22 04:15:36 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (aref_args): should pass expanded list.  [ruby-core:02793]

Thu Apr 22 01:12:57 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* numeric.c (flo_to_s): tweak output string based to preserve
	  decimal point and to remove trailing zeros.  [ruby-talk:97891]

	* string.c (rb_str_index_m): use unsigned comparison for T_FIXNUM
	  search.  [ruby-talk:97342]

Wed Apr 21 22:57:27 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/rinda/rinda.rb, test/rinda/test_rinda.rb: check Hash tuple size.

Wed Apr 21 20:05:00 2004  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb (URI::HTTP#proxy_open): set Host: field explicitly.
	  [ruby-list:39542]

Mon Apr 19 18:11:15 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* hash.c (rb_hash_equal): returns true if two hashes have same set
	  of key-value set.  [ruby-talk:97559]

	* hash.c (rb_hash_eql): returns true if two hashes are equal and
	  have same default values.

Mon Apr 19 08:19:58 2004  Doug Kearns  <djkea2@mugca.its.monash.edu.au>

	* dln.c, io.c, lib/benchmark.rb, lib/cgi.rb, lib/csv.rb, lib/date.rb,
	  lib/ftools.rb, lib/getoptlong.rb, lib/logger.rb, lib/matrix.rb,
	  lib/monitor.rb, lib/set.rb, lib/thwait.rb, lib/timeout.rb,
	  lib/yaml.rb, lib/drb/drb.rb, lib/irb/workspace.rb, lib/net/ftp.rb,
	  lib/net/http.rb, lib/net/imap.rb, lib/net/telnet.rb,
	  lib/racc/parser.rb, lib/rinda/rinda.rb, lib/rinda/tuplespace.rb,
	  lib/shell/command-processor.rb, lib/soap/rpc/soaplet.rb,
	  lib/test/unit/testcase.rb, lib/test/unit/testsuite.rb: typo fix.

Mon Apr 19 08:14:18 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser::find_body): Allow for
	  #ifdef HAVE_PROTOTYPES

Fri Apr 16 22:33:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* ext/iconv/iconv.c: nearly finished RDoc comments.

Fri Apr 16 17:04:07 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_equal): always returns true or false, never
	  returns nil. [ruby-dev:23404]

Fri Apr 16 08:27:02 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb: skip linking when libraries to be preloaded not
	  compiled.  [ruby-list:39561]

Thu Apr 15 23:21:52 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* process.c (pst_success_p): new method Process::Status#success?.
	  [ruby-dev:23385]

Thu Apr 15 17:12:13 2004  Tanaka Akira  <akr@m17n.org>

	* ext/gdbm/gdbm.c (Init_gdbm): define GDBM::READER, GDBM::WRITER,
	  GDBM::WRCREAT and GDBM::NEWDB.
	  (fgdbm_initialize): use specified read/write flag.

Wed Apr 14 11:29:56 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* numeric.c (flo_eq): workaround for bcc32's bug.
	  (ruby-bugs-ja:PR#594)

Wed Apr 14 13:06:35 2004  Doug Kearns  <djkea2@mugca.its.monash.edu.au>

	* array.c, enum.c, eval.c, file.c, io.c, numeric.c, object.c, prec.c,
	  process.c, re.c, string.c: typos in RDoc comments.  [ruby-core:02783]

Wed Apr 14 11:06:38 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::scan): Changed
	  behavior of :enddoc: -- it now unconditionally terminates
	  processing of the current file.

Wed Apr 14 11:03:22 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* defines.h: include <net/socket.h> to get fd_set definition in BeOS.

Tue Apr 13 23:06:30 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/rinda/rinda.rb: change pattern matching.
	  a === b -> a == b || a === b. [druby-ja:98]

	* test/rinda/test_rinda.rb: ditto.

Tue Apr 13 19:54:29 2004  Minero Aoki  <aamine@loveruby.net>

	* lib/net/http.rb: should not overwrite HTTP request header.
	  [ruby-list:39543]

Tue Apr 13 01:30:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* ext/iconv/iconv.c: RDoc documentation (from RD; nearly finished).
	* ext/iconv/charset_alias.rb: Prevent from RDoc'ing.

Mon Apr 12 19:11:29 2004  Eric Hodel  <drbrain@segment7.net>

	* gc.c (rb_gc_copy_finalizer): typo.  [ruby-core:02774]

Mon Apr 12 18:52:32 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_x509name.c (ossl_x509name_init_i): should return
	  a value.

Mon Apr 12 10:43:47 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* dir.c (rb_glob2, rb_glob, rb_globi, push_globs, push_braces,
	  rb_push_glob): fix memory leak. (leaked when block was interrupted)

Mon Apr 12 10:27:37 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* bcc32/Makefile.sub: backport SIZEOF_TIME_T definition from 1.9.

	* win32/Makefile.sub: ditto.

	* wince/Makefile.sub: ditto.

Sun Apr 11 19:12:35 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ruby.c (require_libraries): restore source file/line after
	  statically linked extensions initialized.  [ruby-dev:23357]

Sun Apr 11 10:47:04 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/code_objects.rb (RDoc::TopLevel::add_class_or_module): Toplevel
	  classes and modules are a special case too... (handle extending existing
	  classes with or without :enddoc:)

Sat Apr 10 23:51:13 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/code_objects.rb (RDoc::Context::add_to): Implementation of :enddoc:
	  made one too many assumptions...

Sat Apr 10 00:00:19 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/markup/simple_markup/inline.rb: Fix problem
	  with \_cat_<b>dog</b>

Wed Apr  7 00:19:50 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/rinda/rinda.rb: fix hash tuple bug.

	* lib/rinda/tuplespace.rb: ditto.

	* test/rinda/test_rinda.rb

Tue Apr  6 18:24:18 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (rb_io_reopen): should use rb_io_check_io().

Tue Apr  6 16:46:09 2004  Tanaka Akira  <akr@m17n.org>

	* configure.in: check the size of time_t.

	* time.c (time_add): new function.
	  (time_plus): use time_add.
	  (time_minus): use time_add.

Tue Apr  6 13:21:30 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/socket/socket.c (make_hostent): must return value.

Tue Apr  6 00:05:30 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/rinda/rinda.rb: add require 'drb/drb'

Mon Apr  5 08:18:23 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/rdoc.rb: Remove leading ./ from file names so that cross
	  references work properly.

Sun Apr  4 20:33:42 2004  Minero Aoki  <aamine@loveruby.net>

	* eval.c (Init_load): make $LOADED_FEATURES built-in.
	  [ruby-dev:23299]

	* ruby.c (ruby_prog_init): make $PROGRAM_NAME built-in.

	* lib/English.rb: remove $LOADED_FEATURES and $PROGRAM_NAME.

Sun Apr  4 14:01:20 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/options.rb (Options::parse): Allow multiple -x options to RDoc.
	  Fix bug where files weren't being excluded properly

Sat Apr  3 17:11:05 2004  why the lucky stiff  <why@ruby-lang.org>

	* ext/syck/syck.h: version 0.43.

	* ext/syck/lib/gram.c: allow root-level inline collections.
	 [ruby-talk:94922]

	* lib/yaml/rubytypes.rb (Symbol#to_yaml): emit symbols as implicits.
	 [ruby-talk:94930]

	* ext/syck/bytecode.c: turn off default implicit typing.

	* ext/syck/implicit.c: detect base60 integers.

	* ext/syck/rubyext.c: handle base60, as well as hex and octal
	  with commas.  implicit typing of ruby symbols.

Fri Apr  2 17:27:17 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (top_include): include in the wrapped load is done for
	  the wrapper, not for a singleton class for wrapped main.
	  [ruby-dev:23305]

Fri Apr  2 15:13:44 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* bignum.c (rb_big_eq): use temporary double variable to save the
	  result (internal float register may be bigger than 64 bits, for
	  example, 80 bits on x86).  [ruby-dev:23311]

Fri Apr  2 14:35:26 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (block_pass): should generate unique identifier of the
	  pushing block.  [ruby-talk:96363]

Fri Apr  2 07:31:38 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/socket/socket.c (make_hostent): fix memory leak, based on
	  the patch from HORIKAWA Hisashi <vzw00011@nifty.ne.jp>.

Thu Apr  1 22:55:33 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb: Allow rdoc comments in
	  =begin rdoc/=end

	* lib/rdoc/parsers/parse_rb.rb: Fix problem with comment in
	  top-level method being taken as file comment.

Thu Apr  1 22:55:04 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/ri/ri_options.rb: Fix undefined variable warning.

Thu Apr  1 19:58:37 2004  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/mapping/{factory.rb,registry.rb}: fixed illegal mapped URI
	  object with soap/marshal.
	  added URIFactory class for URI mapping.  BasetypeFactory checks
	  instance_variables when original mapping is not allowed (ivar must
	  be empty).  Instance of URI have instance_variables but it must be
	  llowed whenever original mapping is allowed or not.

	* lib/xsd/datatypes.rb: check the smallest positive non-zero
	  single-precision float exactly instead of packing with "f".
	  [ruby-talk:88822]

	* lib/soap/mapping/rubytypeFactory.rb: should not dump singleton class.
	  [ruby-dev:22588]
	  c = class << Object.new; class C; self; end; end; SOAPMarshal.dump(c)

Wed Mar 31 19:06:23 2004  Tanaka Akira  <akr@m17n.org>

	* time.c (year_leap_p): new function.
	  (timegm_noleapsecond): ditto.
	  (search_time_t): use timegm_noleapsecond instead of
	  mktime for first guess.

Wed Mar 31 12:04:04 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/delegate.rb (DelegateClass): define internal methods of the
	  result class, but not metaclass of the caller.  [ruby-talk:96156]

	* intern.h: provide proper prototypes.  [ruby-core:02724]

	* ruby.h: missing.h is now prerequisite to intern.h.

Tue Mar 30 20:25:34 2004  Tanaka Akira  <akr@m17n.org>

	* time.c (search_time_t): limit guess range by mktime if it is
	  available.  [ruby-dev:23274]

Sun Mar 28 14:16:59 2004  Minero Aoki  <aamine@loveruby.net>

	* lib/net/pop.rb (auth): failed when account/password include "%".
	  [ruby-talk:95933]

Sat Mar 27 21:40:41 2004  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb: permit extra semicolon in content-type field.

Sat Mar 27 10:40:48 2004  Tanaka Akira  <akr@m17n.org>

	* (lib/pp.rb, lib/prettyprint.rb): define seplist in PP::PPMethods
	  instead of PrettyPrint.

Thu Mar 25 23:28:52 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* time.c (time_overflow_p): backport 1.9 usec overflow function.
	  (ruby-bugs PR#1307)

Thu Mar 25 23:15:24 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/ri/ri_options.rb (RI::Options::show_version):
	  Add --version option

Thu Mar 25 04:16:18 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/ri/ri_options.rb (RI::Options): Add the --list-names option,
	  which dumps our all known names

Thu Mar 25 03:57:47 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/ri/ri_util.rb (NameDescriptor::initialize): No longer
	  allow nested classes to be designated using "."--you must
	  now use "::"

Thu Mar 25 02:00:18 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/template/html/one_page_html.rb (Page):
	  Fix to work with C modules.

Wed Mar 24 21:17:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* lib/uri.rb: Documented (thanks Dmitry V. Sabanin).
	* lib/uri/common.rb: Ditto.
	* lib/uri/ftp.rb: Ditto.
	* lib/uri/generic.rb: Ditto.
	* lib/uri/http.rb: Ditto.
	* lib/uri/https.rb: Ditto.
	* lib/uri/ldap.rb: Ditto.
	* lib/uri/mailto.rb: Ditto.
	  (All backported from 1.9)

Wed Mar 24 18:48:26 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb ($ruby, $topdir, $hdrdir): should not be affected by
	  DESTDIR after installed.

	* lib/mkmf.rb (RUBY): / is not recognized as path separator on
	  nmake/bmake. [ruby-list:39388]

	* lib/mkmf.rb (init_mkmf): $INCFLAGS also should be lazy-evaluated.

Wed Mar 24 12:32:56 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser::handle_class_module):
	  Don't document methods if we don't know for sure the
	  class or module.

	* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_class):
	  Don't store documentation for singleton classes if we
	  don't know the real class.

Wed Mar 24 11:11:26 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/html_generator.rb (Generators::HTMLGenerator::load_html_template):
	  Allow non-RDoc templates by putting a slash in the template name

Mon Mar 22 16:19:57 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* ruby.1: add -width option to .Bl for old groff.

Sun Mar 21 21:11:16 2004  Keiju Ishitsuka  <keiju@ishitsuka.com>

	* lib/shell/*: bug fix for Shell#system(command_line_string).

Sat Mar 20 20:57:10 2004  David Black  <dblack@wobblini.net>

	* lib/scanf.rb: Backported 1.9 branch
	  modifications/corrections to 1.8 branch

Sat Mar 20 23:51:03 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* eval.c (rb_require_safe): preserve old ruby_errinfo.
	  [ruby-talk:95409]

	* eval.c (rb_f_raise): should not clear backtrace information if
	  exception object already have one.

Sat Mar 20 15:25:36 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/template/html/html.rb (RDoc::Page): Force
	  page background to white.

Sat Mar 20 09:52:33 2004  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb, lib/date/format.rb: _parse() now accepts fractional
	  part of second minute that follows a comma or a full stop.

Fri Mar 19 01:55:57 2004  Mauricio Fernandez  <batsman.geo@yahoo.com>

	* io.c (rb_io_sync): need not to check writable. [ruby-core:02674]

Thu Mar 18 21:44:38 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb: backport drb.rb 1.16.

Fri Mar 18 17:49:51 2005  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* struct.c (make_struct): allow const_id for accessor names.
	  [ruby-core:04585]

	* eval.c (rb_attr): check if attribute name is local_id or
	  const_id.

Thu Mar 18 16:22:38 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (proc_eq): avoid false positive by using scope and
	  dyna_vars.  no longer use frame.uniq.

Wed Mar 17 14:44:43 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* dir.c (range): fix possible "\0" overrun. (in case of "\0-")

Mon Mar 15 07:39:13 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_yield_0): should not re-submit TAG_BREAK if this
	  yield is not break destination. [ruby-dev:23197]

Sat Mar 13 14:28:16 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* test/drb/test_drbssl.rb: rescue LoadError. (Barkport from main
	  trunk)

	* test/drb/test_drbunix.rb: ditto.

Wed Mar 10 22:28:09 2004  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (remove_dir): should handle symlink correctly.
	  This patch is contributed by Christian Loew.  [ruby-talk:94635]
	  (Backport from main trunk)

Wed Mar 10 16:28:42 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (return_jump): set return value to the return
	  destination.  separated from localjump_destination().

	* eval.c (break_jump): break innermost loop (or thread or proc).

	* eval.c (rb_yield_0): set exit_value for block break.

Wed Mar 10 15:58:43 2004  Ryan Davis  <ryand@zenspider.com>

	* eval.c (eval): Only print backtrace if generating the backtrace
	  doesn't generate an exception.  [ruby-core:02621]

Tue Mar  9 13:04:26 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (rb_io_ungetc): raise IOError instead of calling
	  rb_sys_fail().  [ruby-talk:23181]

Mon Mar  8 19:32:28 2004  akira yamada  <akira@ruby-lang.org>

	* lib/uri/common.rb (URI::REGEXP::PATTERN::HOSTPORT): (?:#{PORT})
	  -> (?::#{PORT}).  [ruby-dev:23170]

Mon Mar  8 15:31:41 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* dir.c (range): treat incomplete '[' as ordinary character (like
	  has_magic does).

	* dir.c (range):  Cancel above change. More discussion is needed.

Sun Mar  7 22:37:46 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* test/drb/ut_drb.rb: use 'druby://localhost:0'. [ruby-dev:23078]

	* test/drb/ut_eval.rb: ditto.

	* test/drb/ut_large.rb: ditto.

	* test/drb/ut_safe1.rb: ditto.

	* test/drb/ut_drb_drbssl.rb: use 'drbssl://localhost:0'.

Sun Mar  7 16:22:26 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* Makefile.in (lex.c): use $? instead of $<.

Fri Mar  5 00:54:14 2004  Dave Thomas  <dave@pragprog.com>

	* lib/test/unit.rb: MOve RDoc documentation so that you can
	  now say 'ri Test::Unit'

Tue Mar  2 12:32:59 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/Makefile.sub, wince/Makefile.sub (config.h): shouldn't check
	  defined? NORETURN. [ruby-dev:23100]

Mon Mar  1 12:24:10 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_alias):
	  Allow aliases to have parentheses

Sun Feb 29 23:14:53 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_class):
	  Handle :nodoc: on singleton classes.

Sat Feb 28 10:58:49 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* MANIFEST: add test_erb.rb

	* lib/erb.rb, test/erb/test_erb.rb: don't forget filename,
	  if both filename and safe_level given. [ruby-dev:23050]

Fri Feb 27 01:00:09 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb, test/drb/drbtest.rb: require drb/eq.rb by default

Wed Feb 25 21:16:25 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* instruby.rb (with_destdir): should return the given argument if no
	  DESTDIR is given.

	* instruby.rb: use path name expansion of cmd.exe.

Wed Feb 25 09:35:22 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* error.c (NameError::Message): new class for lazy evaluation of
	  message to ensure replaced before marshalling. merge from HEAD.
	  (ruby-bugs-ja:PR#588)

	* eval.c (rb_method_missing): use NameError::Message. merge from
	  HEAD. (ruby-bugs-ja:PR#588)

Tue Feb 24 18:59:37 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* dir.c (glob_helper): '**/' should not match leading period
	  unless File::FNM_DOTMATCH is set. (like '*/') [ruby-dev:23014]

Tue Feb 24 13:22:21 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/rdoc.rb (RDoc::RDoc::normalized_file_list): Attempt to get better
	  heuristics on which files to include and exclude. Now only include
	  non-standard files if they are explicitly named in ARGV.

Tue Feb 24 07:23:30 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/html_generator.rb: Deal with :stopdoc: when
	  choosing a default main page to display (ie. don't select a page
	  if we don't have documentation for it).

Tue Feb 24 06:40:14 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RubyLex::identify_identifier): Handle
	  class variables in code listings

Tue Feb 24 06:40:14 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RubyLex::identify_identifier): Handle
	  class variables in code listings

Tue Feb 24 06:32:27 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser::do_aliases): Handle
	  aliases in C files.

Tue Feb 24 06:16:22 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/rdoc.rb (RDoc::RDoc::document): Now create op dir _before_
	  parsing files.

Tue Feb 24 06:08:47 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_constant):
	  Start collecting text of constant values earlier: was missing
	  values in output if there was no space after '='

Tue Feb 24 06:08:25 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/html_generator.rb: Escape contant values.

Tue Feb 24 03:45:06 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_config.c (ossl_config_each): add new method
	  OpenSSL::Config#each. it iterates with section name, field name
	  and value.

	* ext/openssl/ossl_config.c (Init_ossl_config): include Enumerable.

Mon Feb 23 09:16:35 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* instruby.rb (DOSISH): embedded path in batch files should not be
	  prefixed by DESTDIR.  [ruby-core:02186]

Sun Feb 22 09:54:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* re.c: corrected documentation format (again)

Sun Feb 22 09:43:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* re.c: corrected documentation format (rb_reg_initialize_m)

Sat Feb 21 22:36:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* ext/zlib/zlib.c: documented, but needs more effort.

Sat Feb 21 11:12:15 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* missing/os2.c, missing/x68.c: typo fix.  pointed out by greentea.

Fri Feb 20 18:59:47 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/irb/init.rb (IRB::IRB.parse_opts): add -I option to
	  irb. [ruby-dev:39243]

Thu Feb 19 23:24:16 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/html_generator.rb (Generators::HtmlClass::build_attribute_list):
	  Support visibility modifiers for attributes

Thu Feb 19 23:24:16 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/html_generator.rb (Generators::HtmlClass::build_attribute_list):
	  Support visibility modifiers for attributes

Thu Feb 19 22:39:04 2004  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/rinda/test_rinda.rb: DRb.start_service only once in testsuites.
	  DRb.start_service could handle this.

Thu Feb 19 22:19:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* lib/ostruct.rb: documented

Thu Feb 19 21:28:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* ext/strscan/strscan.c: improved documentation

Thu Feb 19 03:10:52 2004  Minero Aoki  <aamine@loveruby.net>

	* ext/strscan/strscan.c: synchronized with main trunk (rev 1.11).

Thu Feb 19 02:30:34 2004  Minero Aoki  <aamine@loveruby.net>

	* ext/strscan/strscan.c: documentation checked.

Thu Feb 19 00:11:05 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/markup/simple_markup/preprocess.rb (SM::PreProcess::handle):
	  Strip extraneous space from filenames in :include:

Wed Feb 18 22:52:00 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/unix.rb: remove O_NONBLOCK, thanks \ay

Wed Feb 18 22:47:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* ext/strscan/strscan.c: documented

Wed Feb 18 22:03:11 2004  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/*: should not depend on $KCODE.

Wed Feb 18 17:18:01 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* ext/win32ole/win32ole.c: need to include <olectl.h> on Cygwin.

Wed Feb 18 10:40:38 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* sprintf.c (rb_f_sprintf): do not prepend dots for negative
	  numbers if FZERO is specified.  [ruby-list:39218]

Tue Feb 17 23:40:34 2004  Guy Decoux  <ts@moulon.inra.fr>

	* sprintf.c (rb_f_sprintf): preserve original val for
	  format_integer. [ruby-talk:92975]

Tue Feb 17 23:28:45 2004  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/ruby/marshaltestlib.rb: common marshal testcase added.

	* test/ruby/test_marshal.rb: use above testsuite.

	* test/soap/marshal/test_marshal.rb: ditto.

	* test/soap/marshal/cmarshal.rb: removed (not used).

Tue Feb 17 10:51:23 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/syck/rubyext.c (syck_emitter_end_object): takes only one arg.

Tue Feb 17 01:35:28 2004  Tanaka Akira  <akr@m17n.org>

	* eval.c (rb_eval): care that another thread replace NODE_DREGX_ONCE
	  to NODE_LIT.  [ruby-dev:22920]

Tue Feb 17 01:24:35 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bcc32/Makefile.sub, win32/Makefile.sub (config.h): define
	  STACK_GROW_DIRECTION. [ruby-dev:22910]

	* bcc32/Makefile.sub (config.h): add newer checks.

	* wince/Makefile.sub (config.h): define NEED_IO_SEEK_BETWEEN_RW.

Tue Feb 17 00:38:10 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/rinda/tuplespace.rb: TupleSpace#initialize, stop doubling timeout

Tue Feb 17 00:18:03 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* test/rinda/test_rinda.rb: import test_rinda.rb

Tue Feb 17 00:14:30 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* bcc32/Makefile.sub: avoid warning "Redefinition of macro
	  'HAVE_GETLOGIN'".

	* vms/config.h_in: ditto.

Mon Feb 16 23:28:14 2004  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/csv.rb: document reduction.  [ruby-core:02429]

Mon Feb 16 22:08:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* lib/generator.rb: corrected doc format
	* lib/rinda/rinda.rb: added documentation (from Hugh Sasse)
	* lib/rinda/tuplespace.rb: ditto

Mon Feb 16 20:41:32 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* bcc32/Makefile.sub: show more warnings. (refering to mingw)

	* bcc32/setup.mak: ditto.

Mon Feb 16 13:39:44 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* dir.c (rb_glob, rb_globi): add const.

	* ruby.h: ditto.

Mon Feb 16 02:16:33 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* bcc32/Makefile.sub: should warn suspicious pointer conversion.

	* bcc32/setup.mak: ditto.

Sun Feb 15 19:06:42 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/rinda/tuplespace.rb: TupleSpace#read(tpl, 0), raise
	  RequestExpiredError if not found.

Sun Feb 15 15:56:46 2004  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c: add IDispatch wrapper in val2variant.
	  Thanks, arton.

Sun Feb 15 01:46:05 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/mkmf.rb: absolute path of ruby is assigned to $(RUBY).
	  [ruby-dev:22870]

Sat Feb 14 11:29:41 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* sample/drb/*: import lib/drb/sample

Sat Feb 14 11:08:23 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb: add pretty_print, thanks gotoken.

Fri Feb 13 12:35:08 2004  Minero Aoki  <aamine@loveruby.net>

	* test/fileutils/test_fileutils.rb: File.link may raise EINVAL and
	  EACCES on Windows.

Thu Feb 12 21:45:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* lib/ftools.rb: documented

Thu Feb 12 21:25:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* lib/base64.rb: backported from HEAD (modularised and documented)

Thu Feb 12 20:31:48 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (create_tmpsrc): cpp32 of Borland C++ ignores #error
	  directives in DOS line-ending files at all.

Thu Feb 12 02:23:56 2004  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb: use assert_raise instead of assert_raises.

	* lib/pp.rb: ditto.

	* lib/time.rb: ditto.

	* lib/tsort.rb: ditto.
	  use TSortHash and TSortArray instead of Hash and Array in test.

Wed Feb 11 20:01:12 2004  akira yamada  <akira@ruby-lang.org>

	* test/ruby/test_file.rb (TestFile::test_fnmatch): added tests for
	  File.fnmatch. [ruby-dev:22815][ruby-dev:22819]

	* test/ruby/test_proc.rb (TestProc::test_eq): added a
	  test.  [ruby-dev:22599]

	* test/ruby/test_proc.rb (TestProc::test_eq): added tests for
	   Proc#==.  [ruby-dev:22592], [ruby-dev:22601]

Tue Feb 10 16:43:56 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (umethod_bind): purge unused check.  [ruby-dev:22850]

Mon Feb  9 17:16:00 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* lib/rdoc/parsers/parse_c.rb: escape '{' and '}' to avoid warnings.

Mon Feb  9 13:00:55 2004  Hirokazu Yamamoto  <ocean@m2.ccsnet.ne.jp>

	* dir.c (fnmatch): File.fnmatch('*?', 'a') should return true.
	  [ruby-dev:22815]

	* dir.c (fnmatch): File.fnmatch('\[1\]' , '[1]') should return true.
	  [ruby-dev:22819]

Sun Feb  8 16:46:13 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/pp.rb (PP::PPMethods::object_address_group): suppress negative
	  sign for higher heap areas.

Fri Feb  6 22:48:16 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/html_generator.rb (gen_url): Support
	  https in RDoc hyperlinks

Fri Feb  6 22:41:22 2004  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/pp.rb (PPInspectTest#test_to_s_with_iv): rollback the previous
	  commit.  [ruby-dev:22813]

Fri Feb  6 22:22:50 2004  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/pp.rb (PPInspectTest#test_to_s_with_iv): remove instance
	  variable which is defined in the test.

Fri Feb  6 00:48:37 2004  Tanaka Akira  <akr@m17n.org>

	* lib/prettyprint.rb (PrettyPrint#first?): obsoleted.

Thu Feb  5 23:56:55 2004  Tanaka Akira  <akr@m17n.org>

	* lib/prettyprint.rb (PrettyPrint#seplist): added.

	* lib/pp.rb (PPMethods#pp_object): use seplist.
	  (PPMethods#pp_hash): ditto.
	  (Array#pretty_print): ditto.
	  (Struct#pretty_print): ditto.
	  (MatchData#pretty_print): ditto.

	* lib/set.rb (Set#pretty_print): use seplist.

Wed Feb  4 02:12:06 2004  Tanaka Akira  <akr@m17n.org>

	* file.c (test_l): fix wrong method name in document.
	  (test_S): ditto.
	  (test_b): ditto.
	  (test_c): ditto.
	  (test_suid): ditto.
	  (test_sgid): ditto.
	  (test_sticky): ditto.

Tue Feb  3 08:04:57 2004  Tanaka Akira  <akr@m17n.org>

	* lib/pp.rb (Struct#pretty_print_cycle): follow 1.8 style.

Mon Feb  2 19:33:49 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in: backport from 1.9 for Interix.

	* dln.c (dln_load): ditto.

Mon Feb  2 13:31:51 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* lib/net/http.rb (canonical_each): fix merge miss.

Mon Feb  2 01:54:00 2004  Tanaka Akira  <akr@m17n.org>

	* lib/pp.rb (Struct#pretty_print): make it 1.8 style.
	  (Numeric#pretty_print, FalseClass#pretty_print)
	  (TrueClass#pretty_print, Module#pretty_print): fix pp for objects
	  with instance variables.  [ruby-talk:91157]

	* lib/open-uri.rb (URI::Generic#find_proxy): return nil on loopback
	  address.

	* lib/resolv-replace.rb (BasicSocket#send): don't replace because
	  it has no hostname argument.
	  (IPSocket.getaddress): raise SocketError instead of
	  Resolv::ResolvError for errors.
	  (TCPSocket#initialize, UDPSocket#bind, UDPSocket#connect)
	  (SOCKSSocket#initialize): use IPSocket.getaddress instead of
	  Resolv.getaddress.
	  (UDPSocket#send): recognize 3 arguments form.  try all addresses on
	  4 arguments form.

Sun Feb  1 18:17:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* lib/net/http.rb: merged coding style changes from HEAD.

Sun Feb  1 16:15:00 2004  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* lib/test/unit.rb: rearranged documentation for RDoc's sake.
	* lib/matrix.rb: improved documentation.
	* lib/net/http.rb: slight documentation formatting improvement.

Sun Feb  1 05:30:06 2004  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb (URI::Generic#find_proxy): warn HTTP_PROXY.
	 raise an errror on non-http proxy URI.
	 (OpenURI::Buffer#<<): make a tempfile binmode.  [ruby-talk:90793]

Sat Jan 31 09:20:32 2004  NAKAMURA, Hiroshi  <nakahiro@sairon.co.jp>

	* sample/openssl/gen_csr.rb: wrong usage string.

Sat Jan 31 01:00:32 2004  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/wsdlDriver.rb, lib/wsdl/soap/operation.rb: add support of
	  "parts" attribute of soap:body element in WSDL.

	* lib/wsdl/xmlSchema/schema.rb: friendly warning message for
	  simpleType element which is not supported for now.

	* lib/soap/mapping/factory.rb: deleted unused methods.

	* lib/soap/mapping/rubytypeFactory.rb: do no ignore case while xsi:type
	  string <-> Ruby class name matching.

	* test/wsdl/soap/{soapbodyparts.wsdl,test_soapbodyparts.wsdl}: new
	  files.

Thu Jan 29 23:56:00 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* util.c (mblen): fix overrun.  [ruby-dev:22672]

Thu Jan 29 22:41:53 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/html_generator.rb: Allow 'link:' in Tidylinks.
	  THis means you can write "see f1[link:files/f1_rb.html]".

Thu Jan 29 15:33:23 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_x509hame.c (ossl_x509name_initialize): change
	  second argument. it expected to be a Hash not an Integer.

	* ext/openssl/ossl_x509name.c (ossl_x509name_add_entry): add new
	  function for OpenSSL::X509::Name#add_entry.

	* ext/openssl/ossl_x509name.c (ossl_x509name_to_a): append ASN.1
	  tag number to each element of return value.

	* ext/openssl/ossl_x509name.c (Init_ossl_x509name): add constants
	  OpenSSL::X509::Name::DEFAULT_OBJECT_TYPE and OBJECT_TYPE_TEMPLATE.

	* ext/openssl/lib/openssl/x509.rb (OpenSSL::X509::Name#initialize):
	  second argument takes OBJECT_TYPE_TEMPLATE by default.

	* sample/openssl/gen_csr.rb: use OpenSSL::X509::Name.parse.

Wed Jan 28 04:29:41 2004  Eric Schwartz  <emschwar@fc.hp.com>

	* lib/cgi/session.rb: use LOCK_SH to read, and a few other
	  improvements.  [ruby-core:02328]

Tue Jan 27 11:09:29 2004  FUKUMOTO Atsushi  <fukumoto@nospam.imasy.or.jp>

	* ext/socket/socket.c (s_recvfrom): sending length should be an
	  invariant while retrying on EAGAIN.  [ruby-talk:89962]

Tue Jan 27 10:35:18 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/win32ole/win32ole.c (set_argv): fix condition.

Tue Jan 27 02:26:31 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httputils.rb (WEBrick:HTTPUtils::parse_header):
	  refine regex for header-name.

Tue Jan 27 00:30:11 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/Makefile.sub: rollback.

Mon Jan 26 22:53:04 2004  Dave Thomas  <dave@pragprog.com>

	* io.c: Remove documentation references to $defout.

Mon Jan 26 15:11:47 2004  NAKAMURA Usaku  <usa@ruby-lang.org>

	* sample/exyacc.rb: escape '}' to avoid warning.

Mon Jan 26 14:41:46 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/delegate.rb (Delegator::initialize): preserve
	  singleton_method_added method [ruby-dev:22685]

	* lib/delegate.rb (Delegator::initialize): use Kernel::raise
	  instead of mere raise.  [ruby-dev:22681]

Mon Jan 26 12:47:17 2004  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: define CONST84 when TCL_MAJOR_VERSION == 7

Mon Jan 26 11:35:23 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb: Makefiles should depend on also rbconfig.rb.
	  (ruby-bugs:PR#1256)

	* ext/win32ole/win32ole.c (set_argv): set real arguments to
	  WIN32OLE::ARGV.  [ruby-list:39073]

Thu Jan 22 22:54:53 2004  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (BEG_REGEXP): allow 8-bit characters in quoted
	  strings for Novell GroupWise Internet Agent.
	* lib/net/imap.rb (DATA_REGEXP): ditto.

Thu Jan 22 16:21:33 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (string_content): reset lexical states at the beginning of
	  string contents.  [ruby-list:39061]

Wed Jan 21 21:55:51 2004  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb: remove O_NONBLOCK, thanks \ay
	* lib/drb/extserv.rb: typo

Wed Jan 21 17:57:56 2004  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (envelope): allow NIL.
	* lib/net/imap.rb (body): ditto.
	* lib/net/imap.rb (number): ditto.
	* lib/net/imap.rb (ensure_nz_number): show a detailed error
	  message.

Wed Jan 21 16:44:20 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (merge_libs): squeeze successive same libraries.
	  [ruby-dev:22652]

Wed Jan 21 16:01:37 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/digest/rmd160/extconf.rb: have_library appends found library.

Wed Jan 21 11:36:00 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (block_append): update nd_end for "real" head node.
	  [ruby-list:39058]

Tue Jan 20 14:48:13 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/extconf.rb: should check <openssl/conf_api.h> instead
	  of OPENSSL_VERSION_NUMBER. [ruby-list:39056]

Tue Jan 20 14:43:17 2004  Dave Thomas  <dave@pragprog.com>

	* lib/base64.rb: Add RDoc

Tue Jan 20 14:25:51 2004  Dave Thomas  <dave@pragprog.com>

	* lib/abbrev.rb: Add RDoc

Tue Jan 20 13:22:39 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/html_generator.rb: Document aliases at
	  top-most level.

	* lib/English.rb: Document English.rb.

Tue Jan 20 02:49:22 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/extconf.rb: add check for OpenSSL version.
	  [ruby-list:39054]

Tue Jan 20 02:38:13 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* marshal.c (w_class): should not dump singleton class.
	  [ruby-dev:22631]

Tue Jan 20 01:31:36 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* io.c (lineno): typo fix(FIX2INT -> INT2FIX).

Mon Jan 19 21:53:38 2004  akira yamada  <akira@ruby-lang.org>

	* io.c, re.c, string.c, time.c: fixed up positions of RDocs.

Mon Jan 19 07:09:20 2004  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date.rb: zone was wrong when it was behind UTC.
	  Thanks Mark J. Reed.

	* lib/date/format.rb: %z is now always replaced by four digits
	  with a leading plus or minus sign.

	* sample/cal.rb: added a class, anyway.

Sun Jan 18 20:47:35 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* ruby.c: use translate_char() on Cygwin.

Sun Jan 18 02:33:26 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* defines.h (_WIN32): undef _WIN32 on Cygwin before defining DOSISH.

Sun Jan 18 00:23:55 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (class2path): check anonymous class/module before
	  checking referable, and allow singleton classes.

Fri Jan 16 14:33:35 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (class2path): get class path and check referable.
	  [ruby-dev:22588]

Fri Jan 16 09:52:23 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (proc_eq): Proc with empty body may not be equal.
	  [ruby-dev:22590]

Thu Jan 15 13:03:10 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (argf_read): do not append EOF.  (ruby-bugs-ja:PR#585)

	* io.c (rb_io_fwrite): ad-hockery hack to get rid of HP-UX stdio
	  weird behavior.  [ruby-dev:22424]

Wed Jan 14 13:31:06 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/iconv/extconf.rb: wrapper iconv.rb is dependent on platform.

Tue Jan 13 18:54:28 2004  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/logger.rb(Logger#msg2str): no special treatment for the object
	  which responds to :to_str.  commited at 2004-01-11T21:46:27 by
	  gsinclair.

	* lib/logger.rb(LogDevice#initialize): remove type checking if the
	  given object is a String.  Kernel.open handles it correctly.
	  commited at 2004-01-11T21:46:27 by gsinclair.

	* test/logger/test_logger.rb: follow above change (ArgumentError ->
	  TypeError.)  follow above commit.

Tue Jan 13 14:27:13 2004  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* lib/test/unit/ui/testrunnerutilities.rb (TestRunnerUtilities):
	  moved run method which allows output level.  [ruby-dev:22554]

Tue Jan 13 04:29:52 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/ri/ri_driver.rb (RiDriver::report_method_stuff):
	  Show fully-qualified class names in class list.

Tue Jan 13 01:04:37 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/ri/ri_paths.rb (RI::Paths): First attempt at
	  incorporating DESTDIR in the rdoc installation.

Mon Jan 12 23:27:19 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (primary): fix position after FCALL.  [ruby-dev:22574]

Mon Jan 12 12:07:22 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser::do_methods):
	  Someone changed the "// in eval.c" comments to "/*...*/" style,
	  so the parsing of the source file name broke.

	* object.c: Remove spurious space in TrueClass documentation.

	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser::find_body): Fix
	  bad regexp: if the code before a documented method contained
	  a comment that wasn't terminated by whitespace, that comment
	  and all intervening code was included in the following
	  method's documentation.

	* lib/rdoc/ri/ri_formatter.rb (RI::HtmlFormatter::break_to_newline):
	  HTML formats need explicit line breaks.

Mon Jan 12 11:46:30 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (LIBPATHFLAG, RPATHFLAG): enclose paths with single
	  quotes.  [ruby-dev:22564]

	* lib/mkmf.rb (libpathflag): do not enclose with quotes always.

	* {bcc32,win32,wince}/Makefile.sub (LIBPATHFLAG): quoted.

Mon Jan 12 02:24:07 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/ri/ri_formatter.rb (RI::HtmlFormatter): Add HTML
	  generation support to ri (Elliot Hughes)

Mon Jan 12 02:24:07 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/ri/ri_formatter.rb (RI::HtmlFormatter): Add HTML
	  generation support to ri (Elliot Hughes)

Sun Jan 11 02:07:47 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/ri/ri_options.rb (RI::Options::OptionList::OptionList):
	  Also accept command line options via the 'RI' environment variable.

Sun Jan 11 02:07:47 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/ri/ri_options.rb (RI::Options::OptionList::OptionList):
	  Also accept command line options via the 'RI' environment variable.

Sat Jan 10 21:27:41 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (eval): need to add message delimiter. [ruby-dev:22561]

Sat Jan 10 01:54:50 2004  Eric Sunshine  <sunshine@sunshineco.com>

	* defines.h (__NeXT__): Ensure that all standard S_IRUSR, S_IWGRP,
	  S_IRWXO, etc. macros are defined since future code might require
	  them (even though present code only requires a subset).

	* defines.h (__NeXT__): Bug fix: WORDS_BIGENDIAN was not being set
	  correctly on Rhapsody when -arch compiler flag was used (via
	  configure's --enable-fat-binary option).

Fri Jan  9 10:05:14 2004  Siena.  <siena@faculty.chiba-u.jp>

	* lib/mkmf.rb (libpathflag): use single quotes.  [ruby-dev:22440]

Thu Jan  8 23:49:21 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in (RDOCTARGET): new macro.  if you want to install
	  rdoc documentation, you need to run configure with
	  --enable-install-doc.

Thu Jan  8 21:29:43 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_pkey.c (ossl_pkey_to_der): removed; it returns
	  public key only.

	* ext/openssl/ossl_pkey_dh.c (ossl_dh_to_der): new function for
	  OpenSSL::PKey::DH#to_der.

	* ext/openssl/ossl_pkey_dsa.c (ossl_dsa_to_der): new function for
	  OpenSSL::PKey::DSA#to_der.

	* ext/openssl/ossl_pkey_rsa.c (ossl_rsa_to_der): new function for
	  OpenSSL::PKey::RSA#to_der.

Thu Jan  8 16:51:04 2004  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/wsdl/datetime/test_datetime.rb: fixed a stupid testcase which
	  dumps "E" at month-end.

Thu Jan  8 11:20:01 2004  WATANABE Hirofumi  <eban@ruby-lang.org>

	* eval.c, object.c, process.c, re.c: don't use C++ style comments.

Thu Jan  8 04:36:21 2004  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/cgi.rb (WEBrick::CGI#initialize): should create
	  @config[:Logger] if it was not given.

	* sample/webrick/*: new files.

	* MANIFEST: add sample/webrick/*

Wed Jan  7 13:00:18 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/ri/ri_driver.rb: Fix problem where ri was
	  being too eager to find matches of ambiguous method
	  names (such as "ri Thread.join" would return both
	  Thread.join and ThreadsWait.join)

Wed Jan  7 12:35:41 2004  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/debug.rb: revert command parse regexps.  [ruby-list:39014] by
	  Shirai,Kaoru.

Wed Jan  7 08:21:04 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parserfactory.rb: Check for shebang
	  line in files that would otherwise be treated as
	  plain text.

Tue Jan  6 22:13:34 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_mod_modfunc): should break if m has no super class.
	  [ruby-dev:22498]

Tue Jan  6 21:55:02 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (fptr_finalize): should save errno just after failure.
	  [ruby-dev:22492]

Tue Jan  6 14:53:14 2004  Dave Thomas  <dave@pragprog.com>

	* bin/ri: split out the display side, making it pluggable. Added
	  new ri_driver and ri_display files in lib/rdoc/ri.

Tue Jan  6 06:37:53 2004  Dave Thomas  <dave@pragprog.com>

	* bin/rdoc: Add --ri-system switch

	* lib/.document: Update with list of files that seem to have
	  documentation

	* lib/test/unit.rb: Reorder comment to make it RDoc friendly.

	* Makefile.in: add install-nodoc target, and make it
	  generate RDoc on default install.

	* lib/rdoc/ri/ri_options.rb (RI::Options::parse): Add
	  --doc-dir option to ri.

Tue Jan  6 00:04:40 2004  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_method_or_yield_parameters):
	  fix parsing if there are braces in a method parameter list

Fri Jan  2 14:54:11 2004  Dave Thomas  <dave@pragprog.com>

	* bin/ri: Add new --classes option, and arrange for
	  help messages to be paged too.

	* bin/rdoc: Add statistics.

	* process.c: (MG) Added Process documentation

	* lib/rdoc/ri/ri_formatter.rb (RI::AttributeFormatter::wrap):
	  Fix problem with labels not displaying in RI labeled
	  lists using BS and ANSI modes.

Fri Jan  2 01:50:13 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (argf_eof): ARGF.eof? should not have any side effect.
	  [ruby-dev:22469]

Wed Dec 31 17:25:17 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (argf_each_byte): should return self.  [ruby-dev:22465]

Wed Dec 31 11:20:34 2003  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser::do_methods): Make
	  file referenced in "// in sss.c" relative to current file.

Wed Dec 31 11:17:37 2003  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/generators/html_generator.rb: Fix problem when
	  a public method was aliased, but the alias is then
	  made private, and hence doesn't appear in RDoc output.

Wed Dec 31 01:33:05 2003  Dave Thomas  <dave@pragprog.com>

	* array.c, error.c, eval.c, io.c, prec.c, range.c, re.c,
	  string.c, time.c: Add RDoc for Kernel functions, and tidy.

Tue Dec 30 19:39:14 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (rb_f_readline): should raise EOFError at the end of
	  files.  [ruby-dev:22458]

	* io.c (argf_read): should concatenate input files when length
	  argument is nil. [ruby-dev:22450]

	* io.c (argf_read): should update supplied string buffer (2nd
	  argument) even when IO#read is called multiple times.

	* io.c: should initialize lineno by zero. [ruby-dev:22460]

Tue Dec 30 12:30:30 2003  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/code_objects.rb (RDoc::Context::find_symbol): If a
	  class and a method have the same name, finding Xxx.abc was trying
	  to find 'abc' in method 'Xxx', not class 'Xxx'.

Tue Dec 30 08:32:32 2003  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_method):
	  Handle undoing nesting of yield parameters correctly for:

	  def each_entry(&b) Dir.foreach(@path) {|f| yield P.new(f) } end

Tue Dec 30 08:32:32 2003  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_rb.rb (RDoc::RubyParser::parse_method):
	  Handle undoing nesting of yield parameters correctly for:

	    def each_entry(&block) Dir.foreach(@path) {|f| yield Pathname.new(f) } end

Mon Dec 29 12:51:02 2003  Dave Thomas  <dave@pragprog.com>

	* eval.c: Add RDoc for Kernel global functions.

Mon Dec 29 11:00:16 2003  Dave Thomas  <dave@pragprog.com>

	* array.c: Tidy up RDoc loose ends.

Mon Dec 29 05:05:51 2003  Dave Thomas  <dave@pragprog.com>

	* struct.c, random: Add RDoc comments

Mon Dec 29 02:20:54 2003  Dave Thomas  <dave@pragprog.com>

	* eval.c: Add RDoc for class Proc, Method, UnboundMethod

Mon Dec 29 00:41:44 2003  Dave Thomas  <dave@pragprog.com>

	* math.c: Add RDoc comments

Sun Dec 28 20:19:11 2003  Tanaka Akira  <akr@m17n.org>

	* ext/stringio/stringio.c (strio_sysread): StringIO.new.sysread didn't
	  raise EOFError.

	* ext/zlib/zlib.c (gzreader_gets): don't increment lineno when
	  gzfile_read_all returns "".

Sun Dec 28 15:25:08 2003  Dave Thomas  <dave@pragprog.com>

	* class.c,object.c,parse.y,sprintf.c,variable.c: Document classes
	  Object, Module, etc...

Sun Dec 28 11:55:29 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/csv/test_csv.rb: generate bom.csv and mac.csv files on the fly.
	  [ruby-talk:88852]

	* test/csv/{bom.csv,mac.csv}: removed.

Sun Dec 28 08:56:51 2003  Dave Thomas  <dave@pragprog.com>

	* eval.c: Thead[Group] RDoc (thanks to MG)

Sun Dec 28 03:50:05 2003  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser::find_override_comment):
	  Escape method names used in regexp

Sun Dec 28 01:46:02 2003  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/ri/ri_formatter.rb (RI::TextFormatter::display_flow_item):
	  Add support for rules in 'ri' output.

Sun Dec 28 01:35:35 2003  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser::find_body):
	  Sometimes the Ruby source aliases two otherwise
	  unrelated methods (for example Kernel#object_id and
	  Kernel#hash are both the same C function). Provide a
	  facility to allow the methods to be documented
	  separately.

Sun Dec 28 01:05:31 2003  Dave Thomas  <dave@pragprog.com>

	* marshal.c, signal.c: RDoc collemts added by Elliott Hughes

Sun Dec 28 00:48:47 2003  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/parsers/parse_c.rb (RDoc::C_Parser::find_class_comment):
	  Some source files use lower case class or module names
	  when naming the Init_XXX function in C.

Sat Dec 27 23:41:46 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in: fix "test: too many arguments" error.

Sat Dec 27 15:32:19 2003  Dave Thomas  <dave@wireless_3.local.thomases.com>

	* time.c: RDoc comments added

Sat Dec 27 15:07:57 2003  Dave Thomas  <dave@pragprog.com>

	* object.c: Add RDoc comments for Symbol class.

Sat Dec 27 14:42:30 2003  Dave Thomas  <dave@pragprog.com>

	* numeric.c: Add RDoc comments.

Sat Dec 27 00:44:00 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (next_argv): warn always for stdin on inplace edit mode.

	* io.c (read_all): need to check string value.

	* io.c (argf_read): allow ARGF.read(nil).  [ruby-dev:22433]

Fri Dec 26 23:02:09 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (rb_f_backquote): need not to check nil result.
	  [ruby-core:02078]

	* io.c (rb_io_getline): should return nil when read_all gives
	  empty string, even when nil rs is specified. [ruby-core:02077]

Fri Dec 26 18:50:59 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: check if getcontext and setcontext are available.

	* eval.c: use presence of getcontext/setcontext.

Fri Dec 26 16:40:53 2003  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb (PathnameTest#test_plus): add 2 assertions.

Fri Dec 26 09:26:58 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* pack.c (pack_pack): add sign check for 'i', and 'l'.
	  [ruby-dev:22427]

	* bignum.c (rb_quad_pack): add range check for 'quad int'.

Thu Dec 25 22:39:59 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* string.c (rb_str_update): don't return any value.

Thu Dec 25 15:30:17 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_update): call rb_str_modify().

Thu Dec 25 05:08:09 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (search_required): search actual file name once when no
	  extension specified.

Thu Dec 25 04:00:44 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* stable version 1.8.1 released.

Thu Dec 25 00:17:53 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* configure.in: check for nanosleep, -lrt if required.
	  [ruby-core:02059]

	* eval.c (thread_timer): use select(2) if nanosleep(2) is not
	  available.

	* eval.c: check __stub_getcontext for glibc on some platforms.
	  [ruby-list:38984]

Wed Dec 24 23:48:04 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/soap/test_basetype.rb, test/soap/marshal/test_marshal.rb
	  test/xsd/test_xsd.rb: use "(-1.0 / (1.0 / 0.0))" instead of "-0.0"
	  to express -0.0.  [ruby-talk:88786]

Wed Dec 24 23:29:30 2003  Tanaka Akira  <akr@m17n.org>

	* lib/tsort.rb (test_orphaned_break): removed.

Wed Dec 24 20:53:06 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/sample/tkmulticolumnlist.rb: new sample

	* ext/tk/sample/tkmultilistframe.rb: bug fix

Wed Dec 24 20:37:37 2003  Eric Sunshine  <sunshine@sunshineco.com>

	* configure.in (LDSHARED): Fixed typographical error in assignment of
	  LDSHARED for Rhapsody which caused linking of extension modules to
	  fail.

Wed Dec 24 17:51:18 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* file.c (rb_thread_flock): enable thread support again.

Wed Dec 24 16:46:08 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (catch_timer): do not call rb_thread_schedule() inside to
	  avoid pthread_mutex_lock() deadlock.  interrupts to system calls
	  are detected by TRAP_END via EINTR error.

	* eval.c (thread_timer): do not post signal unless it is
	  absolutely necessary.

	* rubysig.h (TRAP_END): add CHECK_INTS to switch thread.

	* regex.c (re_compile_pattern): check if nextp is smaller than
	  pend.  [ruby-dev:22372]

	* eval.c (umethod_bind): remove method overridden check.
	  [ruby-dev:22366]

Wed Dec 24 16:13:05 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_ssl.c (ossl_ssl_read): should check for error
	  status by SSL_get_error().

	* ext/openssl/ossl_ssl.c (ossl_ssl_write): ditto.

Wed Dec 24 14:23:27 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c (strio_read): clear the buffer argument
	  when returning nil.  [ruby-dev:22363]

	* test/ruby/ut_eof.rb (TestEOF::test_eof_0, TestEOF::test_eof_1):
	  add buffer argument tests.

Wed Dec 24 14:07:55 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/test/unit/assertions.rb: Modules are allowed to rescue.

	* lib/test/unit/autorunner.rb: show output_level in order.

	* lib/test/unit/collector/dir.rb: get rid of successive same
	  directories in load path.

	* test/testunit/test_assertions.rb (test_assert_nothing_raised,
	  test_assert_raise): test for modules.

Wed Dec 24 13:43:34 2003  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (authenticate): remove "\n" from base64 encoded
	  strings.

Wed Dec 24 11:26:41 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/fileutils/test_fileutils.rb: should not create any
	  files or directories in current directory.  [ruby-talk:88724]

Wed Dec 24 10:29:53 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c (strio_read): never return nil at
	  unlimited read.  [ruby-dev:22334]

	* ext/stringio/stringio.c (strio_read): support second
	  argument.  [ruby-dev:22350]

Wed Dec 24 09:38:49 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (arg): should return 0 after error.  [ruby-dev:22360]

Wed Dec 24 00:56:54 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (read_all): do not return nil at the end of file.
	  [ruby-dev:22334]

	* io.c (argf_read): do not depend on nil at eof behavior of
	  IO#read().

	* eval.c (rb_thread_join): dup exception before re-raising it.

	* io.c (rb_io_eof): call clearerr() to prevent side effect.  this
	  patch is supplied by Masahiro Sakai <sakai@tom.sfc.keio.ac.jp>.
	  [ruby-dev:22234]

	* pack.c (OFF16): get offset for big endian machines.

	* pack.c (pack_pack): use OFF16 instead of OFF16B.
	  [ruby-dev:22344]

	* pack.c (pack_unpack): ditto.

Tue Dec 23 22:47:14 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (rb_io_check_readable): set FMODE_RBUF always, even if
	  NEED_IO_SEEK_BETWEEN_RW is not defined. [ruby-dev:22340]

	* io.c (rb_io_check_writable): clear FMODE_RBUF before writing
	  something.

Tue Dec 23 22:25:00 2003  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* lib/optparse.rb: incomplete RDoc documentation added in place of
	  existing RD comments.  Tabs converted to spaces.

Tue Dec 23 19:44:47 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/soap/test_streamhandler.rb (test_basic_auth): removed.
	  soap4r + basic_auth is not officially supported in ruby/1.8.1 even
	  though soap4r + basic_auth + http-access2 should run fine.

Tue Dec 23 19:42:59 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_ungetc): raise an exception at unread stream to
	  avoid unspecified behavior.  [ruby-dev:22330]

	* test/ruby/test_system.rb (test_syntax): glob relatively from
	  __FILE__.

Tue Dec 23 18:09:40 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* pack.c (pack_pack): remove unnecessary negative value check.
	  [ruby-dev:22329]

Tue Dec 23 17:26:55 2003  KONISHI Hiromasa  <konishih@fd6.so-net.ne.jp>

	* bcc32/Makefile.sub (config.h): bcc has finite(). [ruby-list:38940]

Tue Dec 23 16:08:16 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/rexml/encodings/US-ASCII.rb: typo.  [ruby-talk:88650]

	* test/ruby/test_system.rb: num of asserts depended on running dir.

	* test/xsd/test_noencoding.rb: rexml + without iconv/uconv cannot
	  handle euc-jp.  install iconv, uconv or xmlscan.

Tue Dec 23 14:13:51 2003  akira yamada  <akira@ruby-lang.org>

	* lib/uri/generic.rb (URI::Generic::check_userinfo,
	  URI::Generic::check_user, URI::Generic::check_password): tests
	  conflicts/depends with other components closely.

	* test/uri/test_generic.rb (TestGeneric::test_set_component):
	  added tets.

Tue Dec 23 11:08:34 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/xsd/test_noencoding.rb: rescue Errno::EINVAL and do not test.
	  "euc-jp" might not be in supported encoding name list.
	  [ruby-talk:88650]

Tue Dec 23 06:10:31 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/cgi.rb (CGI): add support for mod_ruby.

	* lib/webrick/cgi.rb (CGI::Socket): add check for existence of
	  OpenSSL module in all HTTPS related methods.

	* lib/webrick/cgi.rb (CGI::Socket#cipher): should create similar
	  value to OpenSSL::SSLSocket#cipher.

	* lib/webrick/httpresponse.rb (HTTPResponse#setup_header): should
	  set "connection: close" if @keep_alive is false.

	* lib/webrick/https.rb (HTTPrequest#meta_vars): add supprt for
	  SSL_PROTOCOL, SSL_CIPHER_USEKEYSIZE and SSL_CIPHER_ALGKEYSIZE.

Mon Dec 22 23:00:05 2003  akira yamada  <akira@ruby-lang.org>

	* lib/uri/generic.rb (URI::Generic::check_opaque): fixed typo.

Mon Dec 22 21:59:24 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/iconv/iconv.c (map_charset): always ensure code is a String.

Mon Dec 22 21:15:29 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* class.c (rb_mod_init_copy): always copy singleton class.
	  [ruby-dev:22325]

Mon Dec 22 20:44:36 2003  akira yamada  <akira@ruby-lang.org>

	* lib/uri/generic.rb (URI::Generic#route_from): accepts urls which
	  has no host-part.

	* test/uri/test_generic.rb (TestGeneric::test_route): added a test.

Mon Dec 22 20:38:44 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/cgi.rb: reduce eval.

	* lib/cgi.rb (CGI::QueryExtension::read_multipart): alias path to
	  local_path.  [ruby-list:38883]

Mon Dec 22 20:09:31 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/soap/test_property.rb: remove duplicated test method.

Mon Dec 22 18:22:04 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* bcc32/Makefile.sub, win32/Makefile.sub (config.h): remove
	  HAVE_ISINF definition to follow previous commits of missing.h
	  and win32/win32.h.

Mon Dec 22 17:23:42 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (ac_cv_func_setitimer): moved from defines.h

	* defines.h, rubysig.h, signal.c: removed macro handling which
	  should be done in configure.

	* configure.in (intrinsics.h): check if present.

	* ruby.h: include intrinsics.h if available.

	* bignum.c, marshal.c: include ieeefp.h if available.

	* missing.h (isinf): define as a macro if finite() and isnan()
	  are available.  [ruby-core:02032]

Mon Dec 22 17:07:31 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in (mingw): set isnan, finite and isinf to yes.

Mon Dec 22 13:40:19 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/property.rb: passing block by reference.

Mon Dec 22 00:32:43 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_with_disable_interrupt): use ENABLE_INTS instead of
	  ALLOW_INTS which may switch context.  [ruby-dev:22319]

	* ext/syck/emitter.c (syck_emitter_write): str bigger than
	  e->bufsize causes buffer overflow.  [ruby-dev:22307]

Sun Dec 21 17:29:00 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* class.c (rb_check_inheritable): new function.  [ruby-dev:22316]

	* intern.h: add prototype.

	* eval.c (superclass): use rb_check_inheritable().

	* object.c (rb_class_initialize): check argument validity.

Sun Dec 21 16:25:10 2003  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb (Pathname#+): re-implemented to resolve ".." in
	  beginning of the argument.
	  (Pathname#join): concatenate from the last argument.
	  (Pathname#parent): just use Pathname#+.

Sun Dec 21 00:12:37 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: add new methods (TkScrollbar#assign, assign_list)

	* ext/tk/sample/tkmultilistframe.rb: use TkScrollbar#assign method

Sat Dec 20 21:59:03 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httprequest.rb (HTTPRequest#meta_vars): refine regexp.

	* lib/webrick/cgi.rb (CGI#start): NPH scripts return status line
	  instead of Status: header field.

	* lib/webrick/cgi.rb (CGI::Socket): refine some coditions.

Sat Dec 20 16:07:14 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb (OptionParser::Completion::complete): wrong
	  Regexp for word boundary.  pointed out by Gavin Sinclair.

	* lib/optparse.rb (OptionParser::make_switch): [no-] prefix was
	  missing.

Sat Dec 20 11:40:10 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/yaml.rb (YAML::YAML): adjust Marshal version.

Sat Dec 20 03:56:02 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_with_disable_interrupt): prohibit thread context
	  switch during proc execution.  [ruby-dev:21899]

Sat Dec 20 02:41:02 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/cgi.rb: add file. (yet another CGI library)

	* MANIFEST: add lib/webrick/cgi.rb.

Sat Dec 20 02:18:31 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* misc/ruby-mode.el (ruby-calculate-indent): proper indentation
	  inside of parentheses.  [ruby-dev:22308]

Fri Dec 19 21:24:22 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httprequest.rb (HTTPRequest#meta_vars): should not set
	  HTTP_CONTENT_TYPE and HTTP_CONTENT_LENGTH.

	* lib/webrick/https.rb (HTTPRequest#parse): should check presence
	  of cert() method to detect SSLSocket.

Fri Dec 19 22:56:46 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/property.rb (SOAP::Property#load): new method for loading
	  property value into existing property tree.

	* test/soap/test_property.rb: add test.

Fri Dec 19 19:21:49 2003  akira yamada  <akira@ruby-lang.org>

	* lib/runit/cui/testrunner.rb (RUNIT::CUI::TestRunner::run):
	  should use Test::Unit::UI::{PROGRESS_ONLY,VERBOSE}.

Fri Dec 19 17:36:49 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/sample/tkmultilistbox.rb: bug fix

	* ext/tk/sample/tkmultilistframe.rb: new sample script

Fri Dec 19 03:44:27 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httputils.rb (parse_form_data): should return an
	  empty Hash if the body is empty.

Thu Dec 18 21:47:35 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* lib/mkmf.rb (create_makefile): should remove deffile if it's
	  made by miniruby. based on nobu's patch.

Thu Dec 18 21:44:21 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* eval.c (stack_extend): ignore inline optimization on VC7.

	* win32/Makefile.sub (OS, RT): can override.

	* win32/Makefile.sub (LDFLAGS): ditto. shouldn't use pdb:none
	  option. based on Tietew's patch [ruby-dev:22289]

Thu Dec 18 16:38:44 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (fnmatch): unlike find_dirsep(), rb_path_next() never
	  return NULL.

Thu Dec 18 15:27:59 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* lib/ipaddr.rb (IPSocket::getaddress): merge usa's patch.
	  [ruby-dev:21678]

Wed Dec 17 15:15:30 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/cgi.rb (CGI::QueryExtension::Value::[]): should work like
	  String#[] if more than one arguments are specified.

	* lib/delegate.rb: avoid using common instance name as "@obj".

	* lib/cgi.rb (CGI::QueryExtension::Value): Value is no longer
	  subclass of String, but DelegateClass(String).

	* ext/curses/extconf.rb: restore function check for init_color.
	  [ruby-list:38905]

	* Makefile.in: need to specify $(MAINLIBS) for the miniruby
	  generation rule.

	* configure.in: better FreeBSD -lc_r support.

Wed Dec 17 00:16:14 2003  Minero Aoki  <aamine@loveruby.net>

	* ext/strscan/strscan.c: new method
	  StringScanner#beginning_of_line? (alias #bol?)

	* ext/strscan/strscan.c: new method StringScanner#concat and #<<.

	* ext/strscan/strscan.c: StringScanner#new(str) does not duplicate
	  nor freeze STR (allow destructive modification).

	* test/strscan/test_stringscanner.rb: test new methods above.

	* test/strscan/test_stringscanner.rb: test destructive string
	  modification.

Tue Dec 16 21:20:47 2003  Tanaka Akira  <akr@m17n.org>

	* lib/pp.rb: don't use local variable `pp'.

	* lib/prettyprint.rb: ditto.

Tue Dec 16 13:20:43 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: condition bug of if statement on
	  {pack,grid}_propagate methods

Tue Dec 16 03:17:29 2003  why the lucky stiff  <why@ruby-lang.org>

	* lib/yaml/rubytypes.rb: comments in strings. [ruby-talk:88012]

	* test/yaml/test_yaml.rb: add test.

Tue Dec 16 01:14:44 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (catch_timer): check rb_thread_crtical in main native
	  thread.

	* eval.c (thread_timer): just sends signals periodically, to
	  prevent main native thread from receiving them in critical
	  section.  [ruby-core:01959]

Mon Dec 15 13:32:22 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (check_dirname): check string safety and remove extraneous
	  trailing directory separators.  [ruby-dev:22279]

	* file.c: renamed and externalized rb_path_next,
	  rb_path_skip_prefix, rb_path_last_separator, rb_path_end.

	* intern.h: prototypes for rb_path_next, rb_path_skip_prefix,
	  rb_path_last_separator, rb_path_end.

Mon Dec 15 09:27:46 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/openssl/ossl_pkcs12.c (ossl_pkcs12_initialize): first argument
	  of rb_protect should take an argument of VALUE.

Sun Dec 14 18:46:48 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* ext/socket/socket.c (Init_socket): IPv6 is not supported although
	  AF_INET6 is defined on MinGW.

	* lib/ipaddr.rb (AF_INET6): workaround in the environment which does
	  not support IPv6.

Sat Dec 13 18:55:16 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/iconv/charset_alias.rb: preserve original order.

	* ext/iconv/extconf.rb: remove wrapper file at clean.

Sat Dec 13 18:09:42 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (thread_timer): use timer by sub-thread and nanosleep.
	  [ruby-talk:87519]

	* gc.c (Init_stack): no stack adjustment for THREAD_SAFE.

Sat Dec 13 17:17:59 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (proc_alloc): cache the created object at first time.
	  [ruby-talk:61288], [ruby-dev:22240]

Sat Dec 13 09:01:23 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: check ucontext.h.

	* eval.c: use getcontext/setcontext() instead of setjmp/longjmp()
	  on ia64 or with native thread enabled.  [ruby-core:01932]

Sat Dec 13 03:09:14 2003  why the lucky stiff  <why@ruby-lang.org>

	* lib/yaml/rubytypes.rb: anonymous struct fix. [ruby-core:01946]

	* test/yaml/test_yaml.rb: add test.

Fri Dec 12 22:36:44 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/csv.rb: add Cell#to_str and Cell#to_s for /.../ =~ aCell,
	  "#{aCell}" and so on.

	* test/csv/test_csv.rb: add tests.

Fri Dec 12 19:33:06 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (mkdir): remove trailing `/' from pathes.

	* lib/fileutils.rb (rmdir): ditto. [ruby-dev:22238]

	* lib/fileutils.rb (rmdir_r): ditto.

	* lib/fileutils.rb (fu_copy_dir): check if it is a directory after
	  mkdir(2).

Fri Dec 12 06:06:09 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (proc_invoke): fix class name in warning message for
	  define_method.  [ruby-dev:22235]

Thu Dec 11 21:24:43 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_pkcs12.[ch]: new files. add OpenSSL::PKCS12.

	* ext/openssl/ossl.[ch]: ditto.

	* ext/openssl/MANIFEST: add ossl_pkcs12.[ch].

Thu Dec 11 20:54:28 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (mkdir_p): remove trailing `/' befere mkdir(2).
	  mkdir("nonexistdir/") does not work on NetBSD/Alpha 1.6.1.

	* lib/fileutils.rb (fu_list): call to_str for all arguments.

Thu Dec 11 20:07:01 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* lib/ftools.rb (makedirs): sync with fileutils.

Thu Dec 11 19:53:03 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (mkdir_p): catch all SystemCallErrors.
	  (mkdir("C:\") causes EACCESS on Windows 2000/NTFS)

Thu Dec 11 19:08:02 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (mkdir_p): check if it is a directory after
	  mkdir(2) instead of before mkdir(2), to avoid race condition.
	  [ruby-talk:87730]
	  Refer: mkinstalldirs sh script, GNU mkdir(1) (coreutils 5.0)

Thu Dec 11 18:49:30 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb: def m( arg ) -> def m(arg).

Thu Dec 11 11:39:43 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (ieeefp.h), numeric.c: needed for finite() on
	  Solaris.  [ruby-core:01921]

	* file.c (rb_stat_inspect): adjust format specifier.

	* parse.c (arg_prepend): nodetype() is for debug use.

	* ruby.h (ISASCII, etc): cast to int to get rid of warning.

	* ruby.h (alloca.h): include even in GCC.  [ruby-core:01925]

	* ext/bigdecimal/bigdecimal.c (GetVpValue): adjust format
	  specifier.

	* ext/bigdecimal/bigdecimal.c (BigDecimal_prec, BigDecimal_coerce,
	  BigDecimal_divmod): use rb_assoc_new() to suppress memory usage.

	* ext/bigdecimal/bigdecimal.c (BigDecimal_split): ditto.

	* ext/dl/sym.c (rb_dlsym_guardcall): guard itself should be
	  volatile.

	* ext/iconv/iconv.c (iconv_convert): ensure actual parameter with
	  format specifier.

	* ext/pty/pty.c (MasterDevice, SlaveDevice, deviceNo): do not
	  define unless used.

	* ext/pty/pty.c (getDevice): get rid of warning.

	* ext/socket/socket.c (port_str, sock_s_getaddrinfo,
	  sock_s_getnameinfo): FIX2INT() now returns long.

	* ext/socket/socket.c (init_inetsock_internal): uninitialized
	  variable.

	* ext/syck/rubyext.c (syck_parser_assign_io): add prototype.

	* ext/syck/rubyext.c (rb_syck_mktime, yaml_org_handler): use
	  ISDIGIT() instead of isdigit() to avoid warnings and for
	  platforms which don't support non-ascii charater.

Wed Dec 10 19:28:56 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c (strio_read): set EOF flag at short read.
	  [ruby-dev:22223], [ruby-dev:22224]

Wed Dec 10 18:07:25 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/erb.rb: new method ERB#filename(=). [ruby-dev:22208]

Wed Dec 10 17:54:51 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c (strio_read): do not set EOF flag when
	  requested length is zero.  [ruby-dev:22214]

Wed Dec 10 17:17:18 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (read_all): should return given string even if data read is
	  empty.  [ruby-dev:22207]

Wed Dec 10 17:16:06 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c (strio_read): adjust behavior at reading
	  beyond EOF to IO.  [ruby-dev:22205]

	* test/ruby/ut_eof.rb (TestEOF::Seek): test behaviors at reading
	  beyond EOF.

	* test/ruby/test_file.rb, test/stringio/test_stringio.rb: include
	  TestEOF::Seek test case.

Wed Dec 10 15:01:19 2003  Shugo Maeda  <shugo@ruby-lang.org>

	* test/monitor/test_monitor.rb (test_cond): use Queue#deq
	  instead of sleep.

Wed Dec 10 14:45:39 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* ext/pty/pty.c (HAVE_SYS_IOCTL_H): need to include <sys/ioctl.h>
	  for TIOCSCTTY on *BSD.  based on gotoyuzo's patch.
	  (ruby-bugs:PR#1211)

	* ext/pty/pty.c (establishShell): should close descriptors if fork
	  failed.

Wed Dec 10 12:53:05 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* win32/win32.h: define execv() using do_aspawn().

	* process.c (proc_exec_v): remove #ifdef's which stopped needing.

Tue Dec  9 23:32:23 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb, ext/tk/lib/tkcanvas.rb, ext/tk/lib/tkdialog.rb,
	  ext/tk/lib/tkentry.rb, ext/tk/lib/tkscrollbox.rb, ext/tk/lib/tktext.rb,
	  ext/tk/sample/tkalignbox.rb, ext/tk/sample/tkcombobox.rb,
	  ext/tk/sample/tkmultilistbox.rb, ext/tk/sample/tkoptdb.rb, ext/tk/sample/tktextframe.rb,
	  ext/tk/sample/demos-en/dialog1.rb, ext/tk/sample/demos-en/dialog2.rb,
	  ext/tk/sample/demos-jp/dialog1.rb, ext/tk/sample/demos-jp/dialog2.rb:
	  overrided instance methods, which are private methods on the super
	  class, are changed to 'private'

Tue Dec  9 19:53:02 2003  akira yamada  <akira@ruby-lang.org>

	* lib/uri/generic.rb (URI::Generic#route_from0): make case insensitive
	  for host-part.

	* test/uri/test_generic.rb (test_route): added tests for the above
	  change.

Tue Dec  9 14:10:48 2003  Tanaka Akira  <akr@m17n.org>

	* io.c (rb_io_check_readable): don't call io_seek if EOF flag is set,
	  to avoid clearing EOF flag.
	  (rb_io_check_writable): ditto.

Tue Dec  9 02:53:55 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/sample/tkalignbox.rb: new sample script

Tue Dec  9 00:45:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/test/unit/assertions.rb: renamed #assert_raises to #assert_raise
	  and made the former call the latter. [ruby-core:01890]

	* test/testunit/test_assertions.rb: ditto.

Tue Dec  9 00:07:35 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/rpc/standaloneServer.rb: add 'shutdown' and 'status'
	  methods as delegates to WEBrick.

	* test/soap/calc/{test_calc.rb,test_calc2.rb},
	  test/soap/helloworld/test_helloworld.rb,
	  test/wsdl/datetime/test_datetime.rb, test/wsdl/raa/test_raa.rb:
	  follow the change.

Mon Dec  8 22:48:03 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/test/unit/autorunner.rb: remove dependency to a particular
	  runner.  [ruby-core:01901], [ruby-list:38869]

	* lib/test/unit/ui/testrunnerutilities.rb: moved output level
	  constants from Console.

	* lib/test/unit/ui/console/testrunner.rb: ditto.

	* lib/test/unit/ui/{fox,gtk,gtk2,tk}/testrunner.rb (initialize):
	  accept output_level.

Mon Dec  8 15:03:30 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/syck/syck.c (syck_io_str_read): get rid of buffer overflow.

Mon Dec  8 13:02:11 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/uri/common.rb: new method URI.regexp. [ruby-dev:22121]

	* test/uri/test_common.rb: add test for URI.regexp.

Mon Dec  8 12:44:14 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* pack.c: define swap16 and swap32 only if they are not
	  defined. OpenBSD defines these macros. [ruby-dev:22181]

Sun Dec  7 20:54:17 2003  Tanaka Akira  <akr@m17n.org>

	* ext/iconv/iconv.c (map_charset): make case sensitive.
	  ext/iconv/charset_alias.rb (charset_alias): don't ignore
	  config.charset's information.  sort aliases.

Sat Dec  6 22:58:03 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_ssl.c (ossl_start_ssl): new function to wrap
	  SSL_connect and SSL_accept; if SSL_connect (or SSL_accept) returned
	  but not finished the handshake process, we should retry it.

	* ext/openssl/ossl_ssl.c (ossl_ssl_connect): call ossl_start_ssl.

	* ext/openssl/ossl_ssl.c (ossl_ssl_accept): ditto.

	* ext/openssl/ossl_ssl.c (ossl_ssl_read): allow signal traps.

Sat Dec  6 21:45:10 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* io.c (flush_before_seek): flush before seek on any platform.

	* configure.in: ditto.

Sat Dec  6 17:23:00 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/soap.rb(SOAP::Env.getenv): allow upcase environment variable
	  as well as downcase one.

	* lib/soap/netHttpClient.rb(SOAP::NetHttpClient#proxy=): check URI.

Fri Dec  5 23:22:30 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/test/unit/assertions.rb (Test::Unit::Assertions::assert_raises,
	  Test::Unit::Assertions::assert_nothing_raised): use the last
	  argument as message unless class object.

	* test/testunit/test_assertions.rb (test_assert_raises): test for
	  multiple exception list.  [ruby-core:01891]

	* test/testunit/test_assertions.rb (test_assert_nothing_raised): test
	  for non-exception classes.

Fri Dec  5 22:23:04 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/netHttpClient.rb: proxy support did not work.  fixed.

	* lib/soap/property.rb: add class methods for loading property from
	  stream/file/propertyfile.  propertyfile is a file which is located at
	  somedir in $:.

	* lib/soap/soap.rb, lib/soap/wsdlDriver.rb, lib/soap/rpc/driver.rb,
	  lib/wsdl/importer.rb: load property from propertyfile 'soap/property'
	  e.g. /usr/local/lib/ruby/site_ruby/1.8/soap/property.

	* test/soap/test_property.rb, test/soap/test_streamhandler.rb: new file.

Fri Dec  5 17:26:23 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_exec_end_proc): maintain tmp_end_procs.
	  [ruby-dev:22154]

Fri Dec  5 13:36:59 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_exec_end_proc): should not clear end_procs and
	  ephemeral_end_procs before execution. [ruby-dev:22144]

	* eval.c (rb_obj_extend): call Module#extended hook after
	  extended_object.  [ruby-list:38866]

	* object.c (Init_Object): Module#extended defined.

Fri Dec  5 13:17:30 2003  Tanaka Akira  <akr@m17n.org>

	* test/ruby/test_pipe.rb: use IO.pipe instead of IO.popen.

Fri Dec  5 11:54:45 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c (strio_read): follow IO#read.

	* test/ruby/ut_eof.rb, test/ruby/test_file.rb, test/ruby/test_pipe.rb,
	  test/stringio/test_stringio.rb: add EOF test.

Fri Dec  5 02:49:35 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/test/unit/assertions.rb (Test::Unit::Assertions::assert_raises):
	  allow multiple exception list.  [ruby-core:01884]

	* lib/test/unit/assertions.rb (Test::Unit::Assertions::assert_nothing_raised):
	  check whether arguments are subclass of Exception.

Thu Dec  4 23:54:00 2003  Rick Ohnemus  <rick.ohnemus@systemware.com>

	* dln.c (aix_loaderror): should not use member named 'errno' which
	  might be a macro (e.g. on AIX).

Thu Dec  4 23:32:26 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (read_all): do not depend on lseek position.
	  [ruby-dev:22026]

Thu Dec  4 22:37:26 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_eval): preserve $! value when retry happens in the
	  rescue clause.  [ruby-talk:86697]

Thu Dec  4 21:50:07 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/drb/drb.rb (DRb::DRbMessage::send_request, send_reply):
	  should rescue errors and re-raise DRbConnError on write too.
	  [ruby-dev:22132]

Thu Dec  4 16:41:17 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (exc_list): allow expanding list.  [ruby-dev:22134]

Thu Dec  4 14:09:24 2003  Minero Aoki  <aamine@loveruby.net>

	* test/fileutils/test_fileutils.rb (test_cp): test if the error is
	  kind of SystemCallError.  It is needless details that which errno
	  is set on each systems.

Thu Dec  4 13:24:13 2003  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/monitor.rb: use Object#__send__ instead of Object#send.

Thu Dec  4 13:17:45 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/streamHandler.rb: support latest released version of
	  http-access2.

Thu Dec  4 13:04:44 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/soap.rb: add SOAP::Env module for environment repository
	  such as HTTP_PROXY.

	* lib/soap/property.rb: property implementation.

	* lib/soap/streamHandler.rb, lib/soap/wsdlDriver.rb,
	  lib/soap/rpc/driver.rb: use soap/property.rb.

	* lib/wsdl/importer.rb, lib/soap/wsdlDriver.rb, lib/soap/rpc/driver.rb:
	  use SOAP::Env.

	* lib/soap/netHttpClient.rb: add basic_auth, ssl_config, and cookie
	  management interface, but ignored for now.

	* lib/xsd/charset.rb: add XSD::Charset.encoding= interface to set
	  wiredump charset explicitly.  it was fixed to 'utf-8' when iconv or
	  uconv module was found.

Thu Dec  4 10:43:58 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/dl/sym.c (rb_dlsym_guardcall): __declspec(noinline) is VC7
	  feature.

Thu Dec  4 10:27:12 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/net/http.rb: update hyperlink to the Japanese document.

Thu Dec  4 09:12:43 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_asn1.c (asn1time_to_time): should check that
	  the underlying value of ASN1_TIME isn't NULL. [ruby-core:01881]

Thu Dec  4 08:29:43 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/server.rb (GenericServer#start): should rescue
	  Exception to avoid unexpected aborting. [ruby-core:01853]

	* lib/webrick/server.rb (GenericServer#start_thread): should check
	  that peeraddr isn't nil before printing.

	* lib/webrick/httpresponse.rb (HTTPResponse#start_thread): should
	  rescue Exception to avoid unexpected aborting of thread.

Thu Dec  4 03:48:59 2003  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb (Pathname#link, Pathname#symlink): obsoleted.
	  (Pathname#make_link, Pathname#make_symlink): new method.

Thu Dec  4 01:45:24 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (argf_read): should not terminate on empty string; wait
	  until real EOF.  [ruby-dev:21969]

	* io.c (argf_read): should adjust length to read, when length is
	  specified and read spans command line argument files.

Wed Dec  3 19:38:36 2003  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb: correct fcntl parameter. [ruby-dev:22120]

Wed Dec  3 13:49:07 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: 'format'==>'Kernel.format' (avoid override trouble)

	* ext/tk/lib/tkafter.rb: ditto.

	* ext/tk/lib/tkcanvas.rb: ditto.

	* ext/tk/lib/tkdialog.rb: ditto.

	* ext/tk/lib/tktext.rb: ditto.

Wed Dec  3 13:28:13 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* Makefile.in (lex.c): try gperf first, and copy from the source
	  directory if failed.  [ruby-dev:22123]

	* ext/extmk.rb (MTIMES): let makefiles depend to mkmf.rb.

	* lib/mkmf.rb (configuration): DLDFLAGS was duplicated.

Tue Dec  2 23:18:12 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/net/http.rb: wrote the warning about HTTP_PROXY environment
	  variable.

Tue Dec  2 21:31:42 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bin/testrb: new test runner.  [ruby-core:01845]

	* lib/test/unit/autorunner.rb (Test::Unit::AutoRunner.run,
	  Test::Unit::AutoRunner#process_args): take test list to run and
	  options.

	* lib/test/unit/autorunner.rb (Test::Unit::AutoRunner::RUNNERS,
	  Test::Unit::AutoRunner#run): should not exit inside a library,
	  just return the result instead.

	* lib/test/unit.rb: ditto.

	* test/runner.rb: exit with the test result.

Tue Dec  2 20:18:48 2003  Eric Sunshine  <sunshine@sunshineco.com>

	* configure.in (AC_PROG_YACC): AC_DEFINE(OLD_YACC) if Yacc is found
	  instead of Bison or byacc.

	* parse.y: If OLD_YACC is defined, ensure that YYMAXDEPTH is at least
	  10000 (Bison's default) since some old versions of Yacc define it as
	  low as 150 by default, which is too low for Ruby to parse some files,
	  such as date/format.rb.  Among other issues, the parse problem causes
	  "make test" to fail.

Tue Dec  2 20:03:20 2003  Minero Aoki  <aamine@loveruby.net>

	* test/fileutils/test_fileutils.rb: check if Pathnames are usable
	  for arguments.

Tue Dec  2 04:22:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/test/unit/assertions.rb: fixed #assert_no_match message.

	* test/testunit/test_assertions.rb: ditto.

Tue Dec  2 00:43:00 2003  why the lucky stiff  <why@ruby-lang.org>

	* ext/syck/syck.c: string buffering bug.  decrementing by full
	  max_size now. [ruby-core:01834]

Mon Dec  1 21:33:08 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* numeric.c (num_sadded): prohibit singleton method definition for
	  Numerics.  fill yet another gap between Fixnum and Bignum.

Mon Dec  1 17:33:47 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* pack.c (htov16): converts endian using swap16. htov32(), hton16,
	  hton32 as well. [ruby-talk:85377]

	* pack.c (swap16): swap 2 bytes no matter how big short is on the
	  platform.  swap32() is also prepared.

	* numeric.c (rb_num2int): returns long to preserve information.
	  rb_fix2int(), rb_num2uint(), rb_fix2uint() as well.
	  [ruby-talk:85377]

	* numeric.c (rb_num2uint): should not check for value range if the
	  source value is negative.

Mon Dec  1 17:14:34 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* sample/optparse/opttest.rb: added.

Mon Dec  1 16:10:52 2003  Dave Thomas  <dave@pragprog.com>

	* lib/rdoc/rdoc.rb: (etc) initial merge into main tree.

Mon Dec  1 14:17:49 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (fu_each_src_dest0): call #to_str to allow
	  Pathname for arguments. [ruby-core:01795]

	* test/fileutils/test_fileutils.rb: does much strict test on
	  "same" files detecting.

Mon Dec  1 09:28:14 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* bcc32/Makefile.sub, win32/Makefile.sub, wince/Makefile.sub
	  (XCFLAGS): re-export $(XCFLAGS).

	* bcc32/Makefile.sub, win32/Makefile.sub, wince/Makefile.sub
	  (ARCH_FLAG): export $(ARCH_FLAG) (perhaps empty value).

Mon Dec  1 01:03:27 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* lib/mkmf.rb (TRY_LINK, link_command): added support for DLDFLAGS
	  and ARCH_FLAG.  [ruby-dev:22085]

Sun Nov 30 20:18:07 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in: keep ARCH_FLAG separate. export ARCH_FLAG.
	  [ruby-core:01819]

	* Makefile.in: add ARCH_FLAG to CFLAGS.

	* Makefile.in: add @CPPFLAGS@ to CPPFLAGS.

	* lib/mkmf.rb (link_command, cc_command): use ARCH_FLAG.

	* lib/mkmf.rb (configuration): add ARCH_FLAG to DLDFLAGS.

	* Makefile.in: add ARCH_FLAG to DLDFLAGS.

	* configure.in: should put getcwd in AC_CHECK_FUNCS, not
	  AC_REPLACE_FUNCS.  [ruby-core:01826]

Sun Nov 30 18:22:48 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in: do not override CCDLDFLAGS, LDFLAGS, XLDFLAGS,
	  DLDFLAGS and LDSHARED.

	* configure.in: XCFLAGS for compiling ruby itself.  ARCH_FLAG is
	  reflected in CFLAGS.

	* lib/mkmf.rb: ditto.  do not import XCFLAGS from config.status.

Sun Nov 30 17:37:36 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: bug fix [ruby-talk:86746]

Sun Nov 30 13:02:00 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/encodingstyle/soapHandler.rb: refactoring - Simplifying
	  Conditional Expressions.

	* lib/wsdl/soap/definitions.rb: refactoring - Move Method.

	* test/xsd/{test_noencoding.rb,noencoding.xml}: new files.  test for
	  encoding unspecified XML file parsing.

	* test/wsdl/{test_fault.rb,map,datetime}: new files.  test of
	  SOAPFault, dateTime and Apache's Map.

Sun Nov 30 09:35:14 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_update): get rid of SEGV at just allocated String.
	  [ruby-core:01812]

Fri Nov 28 23:19:34 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* gc.c (gc_mark): explicitly check mark recursion levels, instead
	  of unreliable stack length.

Fri Nov 28 22:49:56 2003  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/rinda/rinda.rb: fix TupleSpaceProxy#read, read_all.

Fri Nov 28 21:44:40 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* test/fileutils/test_fileutils.rb (test_ln_s): should be a file, not
	  a directory for FreeBSD.

Fri Nov 28 19:37:56 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (env_has_value, env_index): must match exactly.

	* test/ruby/test_env.rb (test_has_value, test_index): condition for
	  aboves.

Fri Nov 28 17:59:20 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/ruby/test_env.rb: add tests for ENV.

Fri Nov 28 17:47:46 2003  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb (DRbMessage#load): rescue Errno::* and raise
	  DRbConnError.

Fri Nov 28 15:41:15 2003  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb (Pathname#realpath): obsolete the force_absolute
	  argument.

Fri Nov 28 14:41:52 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/streamHandler.rb: drop unused http parameters.

	* lib/soap/encodingstyle/soapHandler.rb, lib/soap/mapping/factory.rb,
	  lib/soap/mapping/mapping.rb, lib/soap/mapping/registry.rb,
	  lib/wsdl/soap/complexType.rb: ApacheSOAP's map support was broken
	  under WSDL dynanic client environment.  fixed.

	* test/wsdl/raa/*: add tests.

	* lib/xsd/datatypes.rb: dateTime precision bug fix (at least, I hope.)
	  bug of soap4r.  XSDDateTimeImple.to_time passed a Float to
	  Time.local/Time.gm as an usec, and NUM2LONG(rb_num2long for Float)
	  causes rounding error.

	* test/soap/test_basetype.rb, test/xsd/test_xsd.rb: add tests.

Fri Nov 28 04:15:24 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (method_arity): used wrong Proc object.  [ruby-talk:86504]

Fri Nov 28 00:47:29 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_f_exit), process.c (rb_f_exit_bang): treat true as
	  success, false as failure.  [ruby-dev:22067]

	* eval.c (rb_f_abort, rb_thread_switch), process.c (rb_f_system): use
	  ANSI macro instead of hard coded value.

	* eval.c (rb_f_exit), process.c (rb_f_exit_bang): use VALUEs not but
	  TYPEs.

Thu Nov 27 22:05:48 2003  Akinori MUSHA  <knu@iDaemons.org>

	* eval.c, gc.c: FreeBSD/ia64 currently does not have a way for a
	  process to get the base address for the RSE backing store, so
	  hardcode it for the moment.
	  [submitted by: Marcel Moolenaar <marcel@FreeBSD.org>]

Thu Nov 27 17:36:42 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tkafter.rb: bug fix on TkTimer#cancel_on_exception=(mode).
	  TkTimer#wait recieves the exception of the callback.
	  The exception is kept on @return_value.

Thu Nov 27 16:58:48 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* win32/win32.c (rb_w32_stat): remove _fullpath() for NUL: device.

Wed Nov 26 15:38:47 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* test/fileutils/test_fileutils.rb (test_ln_s): should take the
	  existing symbolic link for OpenBSD.

Wed Nov 26 04:48:42 2003  why the lucky stiff  <why@ruby-lang.org>

	* ext/syck/token.c: removed YYTOKTMP references which
	  were causing buffer overflows on large block scalars,
	  comments, quoted scalars and plain scalars.

	* ext/syck/rubyext.c: dynamic changing of buffer size.

	* ext/syck/syck.h: default buffer size of 4k.

Wed Nov 26 00:55:30 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httpresponse.rb: add HTTPResponse#keep_alive=.

	* lib/webrick/httpserver.rb (HTTPServer#run): should pass the
	  request's keep_alive flag to the response.

Tue Nov 25 21:41:35 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* defines.h (ENV_IGNORECASE): should define when DOSISH without
	  human68k. [ruby-dev:22047]

	* hash.c (env_has_value, env_index): don't ignore case of value.
	  [ruby-dev:22048]

Tue Nov 25 21:39:37 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* file.c (path_check_1): honor sticky bits always.
	  [ruby-talk:86273]

Tue Nov 25 20:02:14 2003  Minero Aoki  <aamine@loveruby.net>

	* test/fileutils/test_fileutils.rb: do test in more deep
	  directory.

	* test/fileutils/test_nowrite.rb: ditto.

Tue Nov 25 19:04:23 2003  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb (URI::Generic#find_proxy): ENV case sensitivity test
	  refined.

Tue Nov 25 18:13:30 2003  Minero Aoki  <aamine@loveruby.net>

	* test/fileutils/test_fileutils.rb: chdir Dir.tmpdir before each
	  test. [ruby-dev:22045]

	* test/fileutils/test_nowrite.rb: ditto.

Tue Nov 25 17:52:11 2003  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb (URI::Generic#find_proxy): use http_proxy under CGI
	  if the environment variable is case sensitive.

Tue Nov 25 16:41:33 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/wsdl/multiplefault.wsdl, test/wsdl/test_multiplefault.rb:
	  removed.  this test requires extra libraries in soap4r/1.5.*.

Tue Nov 25 16:24:42 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/**/*.rb, lib/wsdl/**/*.rb, lib/xsd/**/*.rb: changed license;
	  GPL2 -> Ruby's.

	* lib/soap/rpc/driver.rb, lib/soap/wsdlDriver.rb,
	  lib/soap/streamHandler.rb: add interface to streamhandler.

	* lib/soap/marshal.rb: raise error if parse fails.

	* lib/soap/netHttpClient.rb: add https support.  Patched by
	  Oliver M. Bolzer.

	* lib/soap/netHttpClient.rb: dump HTTP response message body by itself.

	* lib/soap/rpc/driver.rb, lib/soap/rpc/proxy.rb,
	  lib/soap/wsdlDriver.rb: add driver#mandatorycharset interface to foce
	  using charset for parsing response from buggy server.

	* lib/soap/encodingstyle/soapHandler.rb: support Apache Axis's half
	  typed multi-ref array.

	* lib/soap/mapping/factory.rb, lib/soap/mapping/registry.rb: map
	  SOAPStruct which has multi-accessors which name are the same, to an
	  array.

	* lib/soap/rpc/element.rb: fixed illegal parameter order.

	* lib/soap/rpc/element.rb: element name of response message could have
	  the name other than 'return'.

	* lib/wsdl/operation.rb, lib/wsdl/operationBinding.rb,
	  lib/wsdl/soap/classDefCreator.rb, lib/wsdl/soap/methodDefCreator.rb,
	  lib/wsdl/soap/methodDefCreatorSupport.rb: WSDL/1.1 allows plural
	  fault definition in a operation. [ruby-talk:84948]

	* test/wsdl/multiplefault.wsdl, test/wsdl/test_multiplefault.rb: add
	  test for above fix.

	* lib/wsdl/soap/complexType.rb: support WSDL array definition with
	  maxOccures="unbound".

	* lib/xsd/charset.rb: use cp932 under emx.  Patched by
	  Siena. / SHINAGAWA, Norihide in [ruby-dev:21972]

	* lib/xsd/xmlparser/parser.rb: set @charset nil by default.  Nil means
	  'follow encoding declaration in XML'.

	* sample/soap/digraph.rb, sample/wsdl/amazon/wsdlDriver.rb,
	  sample/wsdl/googleSearch/sampleClient.rb,
	  sample/wsdl/googleSearch/wsdlDriver.rb,
	  test/wsdl/test_emptycomplextype.rb,
	  test/wsdl/marshal/test_wsdlmarshal.rb,
	  test/xsd/test_xmlschemaparser.rb: use File.open(...) { |f| f.read }
	  instead of File.open(...).read. [ruby-dev:21964]

	* test/wsdl/emptycomplextype.wsdl, test/wsdl/test_emptycomplextype.rb:
	  simplify the test case.

	* test/wsdl/axisArray/*: add tests for axis's array encoding.

Tue Nov 25 16:15:29 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* ruby.h: don't treat Cygwin as Windows.

Tue Nov 25 15:18:28 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* configure.in: change default value of --enable-pthread (default: no)

Tue Nov 25 07:31:16 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (primary): allow newlines just before right argument
	  parenthesis.  (ruby-bugs:PR#1221)

Mon Nov 24 23:32:06 2003  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb (OpenURI.open_loop, URI::HTTP#proxy_open): use
	  catch/throw for redirection instead of exception.
	  (OpenURI.open_loop, OpenURI.redirectable?): restrict redirection.

Mon Nov 24 19:59:48 2003  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb (URI::Generic#find_proxy): use CGI_HTTP_PROXY
	  instead of HTTP_PROXY in the CGI environment.

Mon Nov 24 19:32:55 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* ext/etc/extconf.rb: check for pw_passwd in struct passwd and
	  gr_passwd in struct group for DJGPP.

	* ext/etc/etc.c: ditto.

	* ext/Setup.dj: support for curses, etc, zlib.

Mon Nov 24 17:00:00 2003  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb: validate option names.
	  :content_length_proc and :progress_proc option implemented.

Mon Nov 24 14:53:10 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* bcc32/Makefile.sub, win32/Makefile.sub, wince/Makefile.sub
	  (XCFLAGS): output empty value instead of `-DRUBY_EXPORT'.

Sat Nov 22 23:09:45 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in: set enable_pthread to no on MinGW.

Sat Nov 22 22:56:20 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* configure.in: add --enable-pthread option (default: yes)

Sat Nov 22 22:48:46 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: add Tk.grab_release and fix bug of TkComposite

	* ext/tk/lib/tkafter.rb: bug fix of TkAfter#start

	* ext/tk/sample/tkcombobox.rb: new sample script

	* ext/tcltklib/tcltklib.c: add native thread check

Sat Nov 22 18:49:47 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/curses/curses.c (window_nodelay): nodelay() of NetBSD's
	  libcruses returns no value, just like keypad().

Sat Nov 22 17:36:36 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* bcc32/Makefile.sub, win32/Makefile.sub, wince/Makefile.sub
	  (HAVE_GETCWD): output to config.h.

	* bcc32/Makefile.sub, win32/Makefile.sub, wince/Makefile.sub
	  (XCFLAGS): output to config.status.

Sat Nov 22 13:10:10 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (have_st_ino?): djgpp has valid st_ino.

Sat Nov 22 11:28:48 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* gc.c (Init_stack): stack region is far smaller than usual if
	  pthread is used.

Sat Nov 22 07:30:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/test/unit/util/backtracefilter.rb: fixed a bug that occurred
	  when an exception had no backtrace.

	* test/testunit/util/test_backtracefilter.rb: ditto.

Fri Nov 21 16:44:18 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tkentry.rb: fix the encoding trouble of percent
	  substitutions on validatecommand option of TkEntry widget

	* ext/tk/lib/tk.rb: fix bug on {pack|grid}_propagate() method

Fri Nov 21 16:12:11 2003  Akinori MUSHA  <knu@iDaemons.org>

	* ruby.1: Fix markups and grammar.

Fri Nov 21 14:49:42 2003  Minero Aoki  <aamine@loveruby.net>

	* ruby.1: wrote about ruby related environment variables.

Fri Nov 21 12:28:03 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* marshal.c (w_extended): singleton methods should not be checked
	  when dumping via marshal_dump() or _dump(). [ruby-talk:85909]

Fri Nov 21 01:40:00 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* configure.in: check <pthread.h>

	* ruby.h: include pthread.h if existence.
	  define is_ruby_native() macro when not HAVE_NATIVETHREAD

	* eval.c: undef is_ruby_native() function when not HAVE_NATIVETHREAD

Fri Nov 21 00:43:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/test/unit/assertions.rb: use #__send__ instead of #send.

	* lib/test/unit/testcase.rb: ditto.

Thu Nov 20 19:19:22 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in: don't find the Cygwin's pthread library on MinGW.

Thu Nov 20 19:15:50 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (have_st_ino?): emx (OS/2 with EMX) does not
	  have st_ino (always 0). [ruby-dev:21972]

	* lib/fileutils.rb (rename_cannot_overwrite_file?): emx does not
	  allow overwriting files by rename(2).

	* test/fileutils/test_fileutils.rb: windows? ->
	  have_drive_letter?, have_file_perm?

Thu Nov 20 17:50:58 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/sample/tkballoonhelp.rb: new sample script

	* ext/tk/sample/tkmultilistbox.rb: ditto

	* ext/tk/sample/tktextframe.rb: ditto

Thu Nov 20 13:37:34 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ruby.h: define is_ruby_native_thread() for no native thread
	  environment

	* eval.c: ditto

Thu Nov 20 12:42:47 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* configure.in: always check existence of the pthread library

	* ruby.h: define macros for ruby's native thread check

	* eval.c: add ruby's native thread check

	* gc.c: ditto

Wed Nov 19 14:45:18 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/net/http.rb (to_ary): print more friendly warning message.

Wed Nov 19 14:32:08 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (fu_same?): add djgpp and wince.

	* lib/fileutils.rb (cannot_overwrite_file?): add wince.

Wed Nov 19 11:04:47 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* lib/fileutils.rb (cannot_overwrite_file?, have_st_ino?): bccwin32
	  is same as mswin32.

Wed Nov 19 07:54:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/test/unit.rb: do not run tests if $! is set.

	* lib/test/unit/assertionfailederror.rb: extend StandardError instead
	  Exception (irb catches the former but not the latter).

Tue Nov 18 23:31:36 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* missing/memmove.c (memmove): take void *, not char *.

	* missing.h (memmove): ditto.

	* missing.h (strchr, strrchr): return char *, not int.

Tue Nov 18 22:20:10 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (fu_same?): temporal fix for windows.

Tue Nov 18 19:05:04 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (fu_same?): check by inode instead of path
	  name, to detect two hard links pointing to the same content.

	* test/fileutils.rb: did not create correctly looped symlinks.

Tue Nov 18 18:23:05 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c (strio_read): behave as IO at empty string.
	  [ruby-dev:21939], [ruby-dev:21941]

	* ext/stringio/stringio.c (strio_getc, strio_getline): set EOF flag.

	* ext/stringio/stringio.c (strio_rewind, strio_seek, strio_ungetc):
	  clear EOF flag.

	* test/stringio/test_stringio.rb: imported from [ruby-dev:21941].

Tue Nov 18 14:06:35 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/fileutils.rb (fu_each_src_dest): raise if src==dest.
	  [ruby-talk:85344] [ruby-core:01699]

	* lib/fileutils.rb: use Object#is_a? instead of Class#=== to allow
	  e.g. remote objects for receivers.

	* lib/fileutils.rb: FileTest -> File.

	* lib/fileutils.rb: put parentheses for arguments of File.xxxx?

	* test/fileutils/test_fileutils.rb (test_cp): test "cp a a".

	* test/fileutils/test_fileutils.rb (test_mv): test "mv a a".

	* test/fileutils/test_fileutils.rb (test_ln): test "ln a a".

	* test/fileutils/test_fileutils.rb (test_ln_s): test "ln_s a a".

	* test/fileutils/test_fileutils.rb (test_install): test "install a a".

	* test/fileutils/fileasserts.rb: new method assert_symlink.

	* test/fileutils/fileasserts.rb: assert_is_directory -> assert_directory.

Mon Nov 17 19:38:49 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* file.c (getcwdofdrv): avoid using getcwd() directly, use
	  my_getcwd() instead.

	* merged NeXT, OpenStep, Rhapsody ports patch from Eric Sunshine
	  <sunshine@sunshineco.com>.  [ruby-core:01596]

Mon Nov 17 10:50:27 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb (OptionParser::Completion::complete): allow least
	  common completion for three or more candidates.

Mon Nov 17 09:41:38 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/test/unit/ui/tk/testrunner.rb,
	  lib/test/unit/ui/gtk/testrunner.rb:
	  run GUI main loop in sub thread.

	* lib/test/unit/ui/gtk2/testrunner.rb: imported from rough.

	* lib/test/unit/autorunner.rb (keyword_display): sort keywords.

Sun Nov 16 18:10:57 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_eval): iterator should return value from next inside
	  begin/rescue/end.  (ruby-bugs:PR#1218)

Sun Nov 16 13:26:07 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* marshal.c (w_object): LINK check earlier than anything else,
	  i.e. do not dump TYPE_IVAR for already dumped objects.
	  (ruby-bugs:PR#1220)

	* eval.c (rb_eval): call "inherited" only when a new class is
	  generated; not on reopening.

	* eval.c (eval): prepend error position in evaluating string to
	  "mesg" attribute string only when it's available and is a
	  string.

Sun Nov 16 12:16:10 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/net/protocol.rb: logging response body. [experimental]
	  [ruby-list:38800]

Sun Nov 16 10:49:38 2003  Gavin Sinclair  <gsinclair@soyabean.com.au>

	* lib/thread.rb (Thread.exclusive): wrap method definition in
	  class Thread to enable rdoc to process.

Sun Nov 16 09:45:23 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/net/http.rb (set_debug_output): warn if method is called
	  after #start.  [ruby-dev:38798]

Sun Nov 16 04:41:33 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (eval): do not re-raise exception to avoid unnecessary
	  exception copying, instead modify exception and internal
	  information to adjust eval().

	* eval.c (backtrace): can return the current frame information
	  only if lev < -1.

Sat Nov 15 22:16:42 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* /ext/openssl/ossl_x509ext.c (ossl_x509extfactory_create_ext):
	  refine error message.

Sat Nov 15 10:05:40 2003  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb (OpenURI.open_loop, OpenURI::HTTP#proxy_open):
	  refactored to support options.
	  (Buffer): maintain size by this class.

Sat Nov 15 07:40:14 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_method_node): new API to retrieve method body.

Fri Nov 14 13:21:30 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: fix (en-bugged at 2003/11/07)

	* ext/tk/lib/tkdialog.rb: TkDialog.new accepts a parent widget
	  argument [ruby-talk:85066]

Thu Nov 13 20:53:35 2003  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb (Kernel[#.]open): hard coded URI schemes removed.
	  [ruby-ext:02251]

Thu Nov 13 19:17:00 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* lib/test/unit/ui/tk/testrunner.rb: use grid and panedwindow
	  (if available)

Thu Nov 13 17:56:41 2003  Tanaka Akira  <akr@m17n.org>

	* lib/open-uri.rb (OpenURI.open_uri): use File::RDONLY.
	  reported by Take_tk <ggb03124@nifty.ne.jp>.
	  [ruby-ext:02245]

Thu Nov 13 16:45:53 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_x509req.c (ossl_x509req_to_der): add function for
	  X509::Request#to_der.

Thu Nov 13 11:31:14 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb (OptionParser::Completion#complete): prior shorter
	  name to containing longer name.

Thu Nov 13 06:08:54 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: stop freezing some classes

	* ext/tk/lib/multi-tk.rb: ditto.

Wed Nov 12 17:32:49 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/test/unit/assertions.rb (assert_throws, assert_nothing_thrown):
	  uncaught throw in sub thread raises ThreadError.

	* lib/test/unit/ui/tk/testrunner.rb (setup_ui): "expand" is not
	  necessary.

Wed Nov 12 14:09:43 2003  Shugo Maeda  <shugo@ruby-lang.org>

	* test/monitor/test_monitor.rb: fix the timing problem by Queue.

Wed Nov 12 12:59:44 2003  Shugo Maeda  <shugo@ruby-lang.org>

	* test/monitor/test_monitor.rb: added.

Wed Nov 12 10:14:28 2003  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/monitor.rb: refactored. Thanks, Gennady Bystritsky.

Wed Nov 12 06:11:39 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl.c (ossl_x509_sk2ary, ossl_x509crl_sk2ary):
	  add functions to convert STACK into Array.

	* ext/openssl/ossl.h: add prototypes.

	* ext/openssl/ossl_pkcs7.c (ossl_pkcs7_set_certificates,
	  ossl_pkcs7_get_certificates, ossl_pkcs7_get_crls,
	  ossl_pkcs7_set_crls): add functions for PKCS7#certificates=
	  PKCS7#certificates, PKCS7#crls= and PKCS7#crls.

Wed Nov 12 00:47:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/test/unit/ui/testrunnermediator.rb: should require 'test/unit'.

Tue Nov 11 23:54:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/test/unit/ui/gtk/testrunner.rb: added a rescue clause to handle
	  the case when the requested font is not available.

Tue Nov 11 22:44:08 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (appendline): file may not end with newline.  a bug if
	  READ_DATA_PENDING_PTR is defined. [ruby-talk:84925]

Tue Nov 11 10:42:41 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: raise an exception when creating TkWindow
	  object, because TkWindow class is an abstract class.

Tue Nov 11 03:30:43 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/ext/openssl/ossl_conf.c (ossl_config_get_value): return nil
	  if the specified value doesn't exist.

	* lib/ext/openssl/ossl_conf.c (ossl_config_get_section): return
	  a empty hash if the specified section doesn't exist.

Mon Nov 10 11:40:29 2003  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/monitor.rb (wait): return true on signal/broadcastfalse and
	  false on timeout. Thanks Gennady Bystritsky.

Mon Nov 10 00:07:10 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (primary): primary_value may be 0 when syntax error.
	  [ruby-talk:84893]

Sun Nov  9 02:05:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/test/unit/assertions.rb: un-deprecated #assert_not_nil to
	  maintain symmetry with #assert_nil. Also added better output for
	  #assert_kind_of.

	* test/testunit/tc_assertions.rb: ditto.

Sat Nov  8 18:50:20 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/wsdl/raa/*: add new testcase for WSDL loading, parsing and
	  reading.

	* test/soap/marshal/*: backport from soap4r/1.5.1.  all differences are
	  for ruby/1.6.

	* lib/soap/*: backport from soap4r/1.5.1.  all differences are for
	  ruby/1.6.

	* lib/wsdl/data.rb, lib/wsdl/xmlSchema/data.rb: move definition of
	  ArrayTypeAttrName from ::WSDL::XMLSchema::* to ::WSDL::*.
	  [ruby-talk:84813]

	* lib/wsdl/soap/definitions.rb: element name typo in custom exception
	  struct definition which is needed for wsdlDriver; camelCase ->
	  underscore_name.

Sat Nov  8 13:49:50 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* configure.in: improvement of pthread check

Sat Nov  8 13:28:46 2003  Takaaki Tateishi  <ttate@ttsky.net>

	* ext/dl/sym.c: Add DL.win32_last_error and DL.last_error.
	  Thanks, Kaoru Shirai.

Sat Nov  8 06:19:38 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: To fix 'pthread-enabled Tcl/Tk' problem,
	  TclTkIp#_eval calls Tcl_Eval() on the mainloop thread only
	  (queueing a handler to the EventQueue).

	* ext/tcltklib/README.1st: edit the description of '--with-pthread-ext'

Fri Nov  7 23:23:04 2003  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb (Pathname#+): if self or the argument is `.', return
	  another.
	  (Pathname#parent): if self is `.', return `..'.
	  (Pathname#children): if self is `.', don't prepend self for a
	  pathname in a result.
	  (Pathname#join): re-implemented using Pathname#+.
	  (Pathname#find): if self is `.', remove `./' prefix of yielding
	  pathname.

Fri Nov  7 10:23:24 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/socket/socket.c (make_hostent): get rid of SEGV on aliases
	  lookup failure.  (ruby-bugs:PR#1215)

Fri Nov  7 04:08:05 2003  UENO Katsuhiro  <katsu@blue.sky.or.jp>

	* ext/zlib/zlib.c (Init_zlib): define Zlib::GzipReader#each_line as
	  an alias of Zlib::GzipReader#each.

Fri Nov  7 01:03:16 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_load): save and restore rb_prohibit_interrupt.
	  [ruby-dev:21857]

Thu Nov  6 18:05:07 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_inspect): show the path also at a closed file.
	  [ruby-dev:21851]

Thu Nov  6 11:42:07 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c (strio_set_string, strio_reopen): check
	  tainted.

	* ext/stringio/stringio.c (strio_copy, strio_ungetc, strio_write,
	  strio_putc): add infection.

	* ext/stringio/stringio.c (strio_path): just nil.  [ruby-dev:21846]

	* ruby.c (proc_options): reserve searched script path in the
	  source file name table.  [ruby-list:38765]

	* lib/optparse.rb (OptionParser::Completion#complete): default not to
	  ignore case on completion.  [ruby-talk:84726]

	* win32/win32.c (make_cmdvector): process backslashes even if a quote
	  is not enclosed.

Wed Nov  5 23:49:45 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* sample/openssl/gen_csr.rb: there (at least) is a CA which does not
	  accept DN in UTF8STRING format.  it's a sample.

Wed Nov  5 22:55:16 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* configure.in, eval.c, signal.c: : add '--with-pthread-ext'
	  option to fix the pthread trouble on 'tcltklib'

	* ext/tcltklib/README.1st: add the description of '--with-pthread-ext'

	* ext/tk/lib/tktext.rb : add TkText#text_copy, text_cut, text_paste
	  to support Tcl/Tk8.4's tk_textCopy, tk_textCut, tk_textPaste

	* ext/tk/lib/tk.rb : add TkMenu#set_focus support Tcl/Tk's
	  tk_menuSetFocus

Wed Nov  5 17:33:45 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_load): allow interrupt during loaded program
	  evaluation.  [ruby-dev:21834]

	* hash.c (rb_hash_fetch): always warn if default argument and a
	  block are supplied at the same time. [ruby-dev:21842]

	* hash.c (env_fetch): ditto.

	* array.c (rb_ary_fetch): ditto.

Wed Nov  5 19:08:47 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb (OptionParser::Switch::PlacedArgument::parse):
	  do not remove next argument if empty value is placed.

	* test/optparse: added.

Wed Nov  5 17:05:18 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/test/unit/ui/gtk/testrunner.rb: typo.

Wed Nov  5 11:13:32 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* string.c: add #include "version.h". this file still depends on it.

	* Makefile.in, bcc32/Makefile.sub, win32/Makefile.sub,
	  wince/Makefile.sub: add version.h dependency to string.c.

Wed Nov  5 09:14:23 2003  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/monitor.rb: revert to the previous revision.

Wed Nov  5 08:39:51 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/https.rb (HTTPRequest#parse): set @client_cert_chain.

	* lib/webrick/https.rb (HTTPRequest#meta_vars): create
	  SSL_CLIENT_CERT_CHAIN_n from @client_cert_chain.

	* ext/openssl/ossl_ssl.c (ossl_ssl_get_peer_cert_chain): return nil
	  if no cert-chain was given.

Tue Nov  4 23:44:48 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* bcc32/Makefile.sub, win32/Makefile.sub, wince/Makefile.sub:
	  remove needless version.h dependency.

Tue Nov  4 23:38:43 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* class.c, hash.c, string.c: remove #include "version.h".

	* Makefile.in: remove needless version.h dependency.

Tue Nov  4 06:54:52 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (read_all): fptr->f may be NULL, if IO is closed in the
	  signal handler.

	* io.c (io_read): ditto.

	* string.c (get_pat): remove 1.8.0 warning code.

	* string.c (rb_str_match): extend warning until 1.8.2.

	* string.c (rb_str_match2): ditto.

	* class.c (class_instance_method_list): remove 1.8.0 warnings.
	  method_list now recurs.  [ruby-dev:21816]

	* class.c (rb_obj_singleton_methods): ditto.

	* array.c (rb_ary_select): remove select with block.
	  [ruby-dev:21824]

	* hash.c (rb_hash_select): ditto.

	* hash.c (env_select): ditto.

	* re.c (match_select): ditto.

	* struct.c (rb_struct_select): ditto.

Mon Nov  3 22:53:21 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/racc/parser.rb: synchronize with Racc 1.4.4.

	* ext/racc/cparse/cparse.c: ditto.

	* ext/racc/cparse/cparse.c (parse_main): should abort when
	  the length of LR state stack <=1, not ==0.

Mon Nov  3 08:50:47 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* process.c (check_uid_switch): remove duplicated error messages.

	* process.c (check_gid_switch): ditto.

Sun Nov  2 02:28:33 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/ssl.rb: new option :SSLExtraChainCert.

Sun Nov  2 01:02:04 2003  Akinori MUSHA  <knu@iDaemons.org>

	* string.c (rb_str_hash): Update the HASH_PERL alternative hash
	  algorithm in sync with Perl 5.8.

	* st.c (strhash): Ditto.

Sat Nov  1 18:21:09 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_ssl.c (ossl_ssl_peer_cert_chain): add new method
	  SSLSocket#peer_cert_chain.

	* ext/openssl/ossl_x509req.c (GetX509ReqPtr): new function
	  which returns underlying X509_REQ.

	* ext/openssl/ossl_x509ext.c (ossl_x509extfactory_set_issuer_cert,
	  ossl_x509extfactory_set_subject_cert, ossl_x509extfactory_set_crl,
	  ossl_x509extfactory_set_subject_req, ossl_x509extfactory_set_config):
	  use underlying C struct without duplication not to leak momory.

Sat Nov  1 01:49:03 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/mapping/factory.rb: mark marshalled basetype objects when
	  @allow_original_mapping is true.  multi-referencing basetype node is
	  prohibited in SOAP/1.1 encoding but soap4r's original ruby object
	  mapping requires basetype to be marked to detect self referencing
	  loop.  e.g. o = 1; o.instance_eval { @iv = o }  soap4r's original
	  mapping is only used through soap/marshal API.

	* test/soap/marshal/test_marshal.rb: add tests for self referencing
	  immutable objects.

	* test/soap/calc/test_calc_cgi.rb: fix test name.

Fri Oct 31 22:26:29 2003  Takaaki Uematsu  <uema2x@jcom.home.ne.jp>

	* wince/string_wce.c (strrchr): should decrement pointer.

	* wince/Makefile.sub: correct a range of isdigit().

Fri Oct 31 12:55:24 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in, lib/mkmf.rb: add RPATHFLAG for NetBSD.
	  [ruby-dev:21791]

	* bcc32/Makefile.sub, win32/Makefile.sub, win32/Makefile.sub: ditto.

Fri Oct 31 01:38:14 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* wince/Makefile.sub, win32/Makefile.sub (.y.c): allow white spaces
	  at the beginning of line to remove by sed. (ruby-bugs-ja:PR#580)

Fri Oct 31 01:02:24 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* compar.c (cmp_equal): protect exceptions from <=> comparison
	  again.  returns nil if any exception or error happened during
	  comparison.

	* eval.c (search_required): should update *featurep when DLEXT2 is
	  defined. (ruby-bugs-ja:PR#581)

Thu Oct 30 23:41:04 2003  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/drb.rb: add DRbArray

	* lib/drb/invokemethod.rb: fix Hash#each problem. [ruby-dev:21773]

	* lib/drb/unix.rb: add LoadError. [ruby-dev:21743]

Thu Oct 30 23:19:11 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/generator.rb: better XML pretty printing.

	* lib/soap/encodingstyle/soapHandler.rb: remove unnecessary namespace
	  assignment in the element which has "encodingStyle" attribute, and
	  add necessary namespace assignment for "arrayType" attribute.

	* test/soap/calc/test_calc_cgi.rb: take over $DEBUG to ruby process
	  through CGI.

Thu Oct 30 22:59:39 2003  why the lucky stiff  <why@ruby-lang.org>

	* ext/syck/yaml2byte.c: HASH const too long.  Thanks, matz.

Thu Oct 30 19:13:53 2003  Akinori MUSHA  <knu@iDaemons.org>

	* ext/syck/MANIFEST: Add yamlbyte.h.

Thu Oct 30 14:25:31 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (READ_DATA_BUFFERED): new macro to detect whether stdio
	  buffer filled.

	* io.c (rb_io_fptr_cleanup): move path deallocation to
	  rb_io_fptr_finalize (finalizer called by GC).

Thu Oct 30 13:23:39 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (logop): left may be NULL. [ruby-talk:84539]

	* eval.c (rb_eval): NODE_CASE nd_head may be NULL.

Thu Oct 30 10:14:51 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/test/unit/autorunner.rb: make fox runner work.

Thu Oct 30 09:32:26 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* process.c (rb_f_system): fixed lack of security check before
	  calling do_spawn() on win32. [ruby-talk:84555]

Thu Oct 30 02:46:35 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (proc_invoke): single array value to normal Proc#call
	  (i.e. not via lambda call), should be treated just like yield.
	  [ruby-dev:21726]

Thu Oct 30 02:25:48 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/lib/openssl/buffering.rb (Buffering#initialize):
	  add new method to inherit @sync from @io.sync.

	* ext/openssl/lib/net/protocols.rb (SSLIO#ssl_connect): no need to
	  set sync flag explicitly.

	* ext/openssl/ossl_ssl.c (ossl_sslctx_initialize): call super.

	* ext/openssl/ossl_ssl.c (ossl_sslctx_setup): set extra chain
	  certificates in @extra_chain_cert.

Wed Oct 29 22:02:04 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/drb/drbtest.rb: use rbconfig.rb to make the path of ruby
	  interpreter to exec, instead of test/ruby/envutil.rb,

Wed Oct 29 19:58:59 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/tcltklib/tcltklib.c (CONST84): define CONST84 when it is not
	  defined and TCL_MAJOR_VERSION >= 8.

	* ext/tcltklib/tcltklib.c (VwaitVarProc, WaitVariableProc,
	  rb_threadVwaitProc): use CONST84 instead of CONST.

	* ext/tcltklib/tcltklib.c (ip_rbTkWaitCommand,
	  ip_rb_threadTkWaitCommand): use CONST84 always.

Wed Oct 29 17:27:05 2003  Tanaka Akira  <akr@m17n.org>

	* re.c (rb_reg_s_union, Init_Regexp): new method `Regexp.union'.

	* lib/pathname.rb (realpath): examine Dir.pwd because it may have
	  symlinks.

Wed Oct 29 17:16:31 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_longjmp): must not disturb original jump.
	  [ruby-dev:21733]

Wed Oct 29 15:28:34 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (Init_Proc): taint preallocated exception object
	  sysstack_error. [ruby-talk:84534]

Wed Oct 29 11:27:39 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (ret_args): node may be NULL. [ruby-talk:84530]

Tue Oct 28 15:20:12 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/tcltklib/tcltklib.c (VwaitVarProc, ip_rbVwaitObjCmd,
	  WaitVariableProc, WaitVisibilityProc, WaitWindowProc,
	  ip_rbTkWaitObjCmd, ip_rbTkWaitCommand, rb_threadVwaitProc,
	  rb_threadWaitVisibilityProc, rb_threadWaitWindowProc,
	  ip_rb_threadVwaitObjCmd, ip_rb_threadTkWaitObjCmd): prototype;
	  avoid VC++ warnings.

Mon Oct 27 19:19:55 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_longjmp): ignore reentering error while warning.
	  [ruby-dev:21730]

Mon Oct 27 00:23:50 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c (ip_ruby): bug fix on Win : hang-up when
	  calling 'exit' in the Tk callback procedure. [ruby-list:38656]

Sat Oct 25 09:18:04 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_method_missing): protect exception from within
	  "inspect".  (ruby-bugs:PR#1204)

Fri Oct 24 23:26:34 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* hash.c (rb_hash_each): Hash#each should yield single value.
	  [ruby-talk:84420]

	* hash.c (env_each): ditto for ENV.each.

Thu Oct 23 20:25:32 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/server.rb (GenericServer#start): should rescue
	  IOError from IO::accept. [ruby-dev:21692]

Thu Oct 23 17:59:36 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (ruby_cleanup): initialize stack bottom for embedding.
	  [ruby-dev:21686]

	* ext/dl/extconf.rb: move list of files to clean from DEPEND file,
	  to get rid of macro redefinitions.

Thu Oct 23 13:44:00 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y: integrate operations for stack_type.  [ruby-dev:21681]

Thu Oct 23 00:41:45 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/soap/calc/*, test/soap/helloworld/*: set logging threshold
	  to ERROR.

Wed Oct 22 12:53:31 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/test/unit/collector/dir.rb (Test::Unit::Collector::Dir#collect_file):
	  ignore tests which raised LoadError.

	* test/drb/drbtest.rb, test/ruby/test_beginendblock.rb,
	  test/ruby/test_system.rb: avoid requiring same file twice.

	* test/drb/test_drbssl.rb, test/drb/test_drbunix.rb: should not use
	  ARGV unless invoked directly.  do not create test cases unless
	  required libraries are available.

Wed Oct 22 02:31:34 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (ruby_cleanup): should not ignore exit_value in END
	  execution. [ruby-dev:21670]

Tue Oct 21 23:16:26 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (ruby_cleanup): call finalizers and exit procs before
	  terminating threads.

	* eval.c (ruby_cleanup): preserve ruby_errinfo before ruby_finalize_0().

Tue Oct 21 15:57:11 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/test/unit/collector/dir.rb (Test::Unit::Collector::Dir#collect_file):
	  prepend the directory of target file to the load path.

Tue Oct 21 15:08:53 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (do_spawn, do_aspawn): should wait child process even
	  if callded with P_OVERLAY.

	* win32/win32.c (do_spawn, do_aspawn): should return child's exit
	  status to parent.

Tue Oct 21 00:35:02 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/soap/calc/*, test/soap/helloworld/*: catch the exception from
	  test server thread and recover.

Tue Oct 21 00:22:57 2003  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* test/drb/*: import drb/runit.

Mon Oct 20 23:55:47 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_eval): set current node after arguments evaluation.
	  [ruby-dev:21632]

	* eval.c (rb_yield_0): set current node and keep it at local jump.

Mon Oct 20 22:01:18 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_thread_cleanup): keep thread group for main thread.
	  [ruby-dev:21644]

Mon Oct 20 18:28:10 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_catch): backout.

Mon Oct 20 17:31:46 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (PUSH_FRAME): generate unique number to be TAG_JUMP()
	  destination.

	* eval.c (localjump_destination): use unique number in ruby_frame
	  for localjump destination.

Mon Oct 20 11:31:44 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/ruby/test_signal.rb (test_signal): restore old trap.

Mon Oct 20 11:00:46 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* gc.c (gc_sweep): loosen page free condition to avoid add_heap()
	  race condition. [ruby-dev:21633]

	* gc.c (gc_sweep): do not update malloc_limit when malloc_increase
	  is smaller than malloc_limit.

Mon Oct 20 09:45:12 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* lib/debug.rb (debug_command): remove debug print.

Wed Oct 20 00:25:41 2004  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (search_required): required name must not be changed before
	  loading.  [ruby-dev:24492]

Sun Oct 19 13:12:30 2003  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb (foreachline, dir_foreach): add obsolete warning.

Sun Oct 19 00:14:22 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/soap/calc/*, test/soap/helloworkd/*: changed port# of test
	  server. (17171)

Sat Oct 18 23:01:32 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* missing/acosh.c (DBL_MANT_DIG): typo fix(ifdef -> ifndef).

Sat Oct 18 05:48:59 2003  why the lucky stiff  <why@ruby-lang.org>

	* ext/syck/rubyext.c: YAML::Syck::compile method.

	* ext/syck/syck.c: Buffer edge bug.

	* ext/syck/yaml2byte.c: YAML to bytecode converter.

	* ext/syck/yamlbyte.h: Ditto.

	* ext/syck/bytecode.c: Bytecode parser fixes to empty collections
	  and empty strings.

	* ext/syck/token.c: Ditto.

Fri Oct 17 23:07:38 2003  Akinori MUSHA  <knu@iDaemons.org>

	* ext/enumerator/enumerator.c, ext/enumerator/enumerator.txt:
	  Provide Kernel#to_enum as an alias for Kernel#enum_for.  Maybe
	  this is a better name.

Fri Oct 17 23:00:30 2003  Akinori MUSHA  <knu@iDaemons.org>

	* lib/generator.rb: Add rdoc documentation.

Fri Oct 17 22:16:42 2003  Akinori MUSHA  <knu@iDaemons.org>

	* lib/set.rb: Reword and fix Overview.

	* lib/set.rb: It is not necessary to require
	  'test/unit/ui/console/testrunner'.

Fri Oct 17 11:15:22 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/ruby/test_range.rb: added.

	* MANIFEST: add test/ruby/test_range.rb.

Fri Oct 17 03:21:23 2003  William Sobel  <will.sobel@barra.com>

	* ext/socket/socket.c (make_hostent): h_aliases may be NULL.
	  (ruby-bugs:PR#1195)

	* ext/socket/socket.c (sock_s_gethostbyaddr): ditto.

Fri Oct 17 00:12:41 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: (bug fix) instance variable @frame was used
	  without initializing on TkComposite module.

Thu Oct 16 23:51:04 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: If $DEBUG == true and some exception is caused
	  in a callback operation, Ruby/Tk shows a (verbose) backtrace
	  information on the callback process.

Thu Oct 16 17:09:19 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/debug.rb (DEBUGGER__::Context::debug_command): do not call
	  debug_silent_eval() when $1 is not set. (ruby-bugs:PR#1194)

Thu Oct 16 16:54:57 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (rb_str_upto): ("a"..."a").to_a should return [].
	  [ruby-core:01634]

Thu Oct 16 16:40:51 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb:
	  Add Tk::EncodedString and Tk::UTF8_String class to support
	  characters using the \uXXXX escape to the UNICODE string.

	* ext/tk/sample/{demos-en,demos-jp}/unicodeout.rb
	  new demo-scripts (samples of Tk::UTF8_String)

	* ext/tk/sample/{demos-en,demos-jp}/widget
	  add entries for 'unicodeout.rb'

Thu Oct 16 08:38:06 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/digest/test_digest.rb (test_eq): show failed class.

	* test/ruby/test_iterator.rb (test_break, test_return_trace_func):
	  test localjump destination.

Wed Oct 15 20:22:31 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/netHttpClient.rb: use URI::HTTP#request_uri instead of
	  instance_eval('path_query').  [ruby-list:38575]

Wed Oct 15 17:24:45 2003  URABE Shyouhei  <root@mput.dip.jp>

	* lib/cgi.rb (CGI::Cookie): tiny typo fix.

Wed Oct 15 15:00:54 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (ruby_run): just return FAILURE instead of parse error
	  count.  [ruby-list:38569]

Wed Oct 15 13:17:02 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/digest/digest.c (rb_digest_base_alloc): need to initialize
	  buffer. [ruby-dev:21622]

Wed Oct 15 11:23:05 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* marshal.c (w_object): dump extended modules as well.

	* marshal.c (r_object0): TYPE_USRMARSHAL should restore extended
	  modules before invoking marshal_load.  these two fixes are done
	  by Masatoshi Seki <m_seki@mva.biglobe.ne.jp>.

Wed Oct 15 09:30:34 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/enumerator/enumerator.c (enumerator_each): avoid VC++ warning.

	* ext/syck/syck.h: include stdio.h for definition of FILE.

Wed Oct 15 08:09:07 2003  why the lucky stiff  <why@ruby-lang.org>

	* ext/syck/bytecode.c: Checkin of YAML bytecode support.

	* ext/syck/gram.c: Ditto.

	* ext/syck/syck.c: Ditto.

	* ext/syck/token.c: Ditto.

	* ext/syck/handler.c: Ditto.

	* ext/syck/handler.c: Now using 'tag' rather than 'taguri' in type URIs.

	* ext/syck/rubyext.c: Ditto (on both counts).

Wed Oct 15 05:05:53 2003  Akinori MUSHA  <knu@iDaemons.org>

	* lib/generator.rb: A new library which converts an internal
	  iterator to an external iterator.

	* lib/abbrev.rb: A new library which creates an abbreviation table
	  from a list.

Wed Oct 15 04:31:51 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/sample/demos-en/entry3.rb, ext/tk/sample/demos-jp/entry3.rb :
	  new demo-scripts

	* ext/tk/sample/demos-en/widget, ext/tk/sample/demos-jp/widget :
	  add entries for 'entry3.rb'

Wed Oct 15 04:31:47 2003  Akinori MUSHA  <knu@iDaemons.org>

	* test/digest/test_digest.rb: Moved from ext/digest/test.rb.

Wed Oct 15 03:53:20 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/tk.rb: fixed trouble on auto-load Tcl commands (enbug
	  on the last commit).

Wed Oct 15 00:25:00 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (yylex): argument parentheses preceded by spaces should
	  be warned; not error.  [ruby-talk:84103]

Wed Oct 15 00:20:15 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c: replace Tcl/Tk's vwait and tkwait to
	  switch on threads smoothly and avoid seg-fault.

	* ext/tcltklib/tcltklib.c: add TclTkIp._thread_vwait and
	  _thread_tkwait for waiting on a thread. (Because Tcl/Tk's vwait
	  and tkwait command wait on an eventloop.)

	* ext/tk/lib/multi-tk.rb: support TclTkIp._thread_vwait and
	  _thread_tkwait.

	* ext/tk/lib/tk.rb: now, TkVariable#wait has 2 arguments.
	  If 1st argument is true, waits on a thread. If false, waits on
	  an eventloop. If 2nd argument is true, checks existence of
	  rootwidgets. If false, doesn't. Default is wait(true, false).

	* ext/tk/lib/tk.rb: add TkVariable#tkwait(arg) which is equal to
	  TkVariable#wait(arg, true). wait_visibility and wait_destroy
	  have an argument for waiting on a thread or an eventloop.

	* ext/tk/lib/tk.rb: improve of accessing Tcl/Tk's special variables.

	* ext/tk/lib/tkafter.rb: support 'wait on a thread' and 'wait on
	  an eventloop'.

Wed Oct 15 00:10:24 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/baseData.rb: Introduce SOAPType as the common ancestor of
	  SOAPBasetype and SOAPCompoundtype.

	* lib/soap/generator.rb, lib/soap/element.rb, lib/soap/encodingstyle/*:
	  Encoding methods signature change.  Pass SOAPGenerator as a parameter.

	* lib/soap/mapping/*, test/soap/marshal/test_marshal.rb: Refactoring
	  for better marshalling/unmarshalling support.  Now I think SOAP
	  marshaller supports all kind of object graph which is supported by
	  Ruby's original marshaller.  Of course there could be bugs as always.
	  Find it.  :-)

	* lib/soap/rpc/standaloneServer.rb: Set severity threshould to INFO.
	  DEBUG is too noisy.

	* lib/xsd/datatypes.rb: DateTime#of is obsoleted.  Use DateTime#offset.

	* test/wsdl/emptycomplextype.wsdl, test/xsd/xmlschema.xml: Avoid
	  useless warning.

Tue Oct 14 19:09:35 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (ruby_finalize_0): return the given exit status unless
	  SystemExit got raised.

Tue Oct 14 11:53:49 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* intern.h (ruby_stop): never return.

	* ruby.h (ruby_run): ditto.

Tue Oct 14 04:43:55 2003  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb (realpath): make ELOOP check bit more robust.
	  (children): prepend self by default.
	  (chroot): obsoleted.

Tue Oct 14 02:29:31 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_require_safe): segfault after loading .so.

Tue Oct 14 02:05:23 2003  Akinori MUSHA  <knu@iDaemons.org>

	* ext/Setup*, ext/enumerator/*: Add ext/enumerator, a helper
	  module for the Enumerable interface.

Mon Oct 13 23:55:59 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* test/ruby/envutil.rb: use Config::CONFIG["ruby_install_name"],
	  not "ruby".

Mon Oct 13 23:57:29 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_feature_p): match by classified suffix.

	* eval.c (rb_require_safe): require library in the specified safe
	  level.

	* variable.c (rb_autoload, rb_autoload_load): restore safe level
	  when autoload was called.  [ruby-dev:21338]

	* intern.h: prototypes; rb_require_safe.

	* test/runner.rb: accept non-option arguments.

Mon Oct 13 20:49:51 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (str_new4): should not preserve FL_TAINT status in the
	  internal shared string. [ruby-dev:21601]

	* string.c (rb_str_new4): ditto.

	* eval.c: use EXIT_SUCCESS and EXIT_FAILURE for exit values.

	* process.c: ditto. [ruby-list:38521]

Mon Oct 13 19:51:02 2003  Koji Arai  <jca02266@nifty.ne.jp>

	* lib/debug.rb (debug_command): should enter emacs mode when
	  assigned any value to the environment variable "EMACS".
	  On Meadow, (getenv "EMACS") is "meadow".

Sun Oct 12 14:45:03 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* ext/win32ole/extconf.rb: check "windows.h", not "windows".
	  [ruby-talk:84051]

Sat Oct 11 20:41:03 2003  Corinna Vinschen  <corinna@vinschen.de>

	* file.c (eaccess): Use access(2) on Cygwin.

Sat Oct 11 17:09:21 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* lib/rexml/quickpath.rb (REXML::QuickPath::match):
	  escape '[' to avoid warning.

Sat Oct 11 16:08:41 2003  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb (realpath): check existence of the file.

	* lib/pathname.rb (realpath): re-implemented.
	  (realpath_root?, realpath_rec): removed

Sat Oct 11 10:19:39 2003  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/monitor.rb: handle exceptions correctly. Thanks, Gennady
	  Bystritsky.

Fri Oct 10 07:50:54 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (is_defined): inheritance line adjustment as like as
	  rb_call_super().

Fri Oct 10 01:19:00 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_x509name.c (ossl_x509name_initialize): add
	  optional argument to specify the DirectoryString type
	  (ASN1::UTF8STRING by default). RFC3280 deprecates PrintableString
	  for DirectoryString, and strongly requires to use UTF8String for
	  all certificates issued after December, 31 2003.

	* ext/openssl/lib/openssl/x509.rb (X509::Name::parse): ditto.

Thu Oct  9 23:50:21 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_thread_start_0): prevent thread from GC.
	  [ruby-dev:21572]

Thu Oct  9 19:11:44 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_thread_start_0): non-volatile should be restored from
	  volatile.

Thu Oct  9 17:43:36 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (proc_save_safe_level, proc_get_safe_level,
	  proc_set_safe_level): save/restore safe level 1..4.

Thu Oct  9 16:33:23 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* marshal.c (r_object0): remove unnecessary iv restoration for
	  USRMARSHAL. [ruby-dev:21582]

	* marshal.c (w_object): dump generic instance variables from
	  a string from '_dump'.

	* variable.c (rb_generic_ivar_table): return 0 if obj's FL_EXIVAR
	  is not set.

	* time.c (time_dump): copy instance variables to dumped string, to
	  be included in the marshaled data.

	* bignum.c (rb_big2ulong): add range check to ensure round trip.

Thu Oct  9 15:45:27 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* pack.c (uv_to_utf8): change message to "out of range", since
	  negative values are not "too big". [ruby-dev:21567]

Thu Oct  9 14:05:38 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_set_end_proc, rb_exec_end_proc): restore safe level.
	  [ruby-dev:21557]

Thu Oct  9 10:51:04 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_yield_0): no error if block is empty.

Thu Oct  9 06:43:33 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (localjump_error): id should be ID.

	* eval.c (rb_eval): nd_rval is set in copy_node_scope().

	* eval.c (rb_yield_0): unused variable.

	* eval.c (rb_yield_0): nothing to do for empty node.

	* eval.c (call_end_proc, proc_invoke): adjust backtrace in END.
	  [ruby-dev:21551]

	* eval.c (rb_thread_start_0): set the value by break as the result.
	  [ruby-dev:21552]

	* eval.c (rb_thread_start_0, rb_thread_raise, rb_callcc): save
	  variables across THREAD_SAVE_CONTEXT.

Thu Oct  9 12:05:46 2003  Eric Sunshine  <sunshine@sunshineco.com>

	* configure.in: revived NextStep, OpenStep, and Rhapsody ports which
	  had become unbuildable; enhanced --enable-fat-binary option so that
	  it accepts a list of desired architectures (rather than assuming a
	  fixed list), or defaults to a platform-appropriate list if user does
	  not provide an explicit list; made the default list of architectures
	  for MAB (fat binary) more comprehensive; now uses -fno-common even
	  when building the interpreter (in addition to using it for
	  extensions), thus allowing the interpreter to be embedded into a
	  plugin module of an external project (in addition to allowing
	  embedding directly into an application); added checks for
	  <netinet/in_systm.h> (needed by `socket' extension) and getcwd(); now
	  ensures that -I/usr/local/include is employed when extensions'
	  extconf.rb scripts invoke have_header() since extension checks on
	  NextStep and OpenStep will fail without it if the desired resource
	  resides in the /usr/local tree; fixed formatting of --help message.

	* Makefile.in: $(LIBRUBY_A) rule now deletes the archive before
	  invoking $(AR) since `ar' on Apple/NeXT can not "update" MAB archives
	  (see configure's --enable-fat-binary option); added rule for new
	  missing/getcwd.c.

	* defines.h: fixed endian handling during MAB build (see configure's
	  --enable-fat-binary option) to ensure that all portions of the
	  project see the correct WORDS_BIGENDIAN value (some extension modules
	  were getting the wrong endian setting); added missing constants
	  GETPGRP_VOID, WNOHANG, WUNTRACED, X_OK, and type pid_t for NextStep
	  and OpenStep; removed unnecessary and problematic HAVE_SYS_WAIT_H
	  define in NeXT section.

	* dir.c: do not allow NAMLEN() macro to trust dirent::d_namlen on
	  NextStep since, on some installations, this value always resolves
	  uselessly to zero.

	* dln.c: added error reporting to NextStep extension loader since the
	  previous behavior of failing silently was not useful; now ensures
	  that NSLINKMODULE_OPTION_BINDNOW compatibility constant is defined
	  for OpenStep and Rhapsody; no longer includes <mach-o/dyld.h> twice
	  on Rhapsody since this header lacks multiple-include protection,
	  which resulted in "redefinition" compilation errors.

	* main.c: also create hard reference to objc_msgSend() on NeXT
	  platforms (in addition to Apple platforms).

	* lib/mkmf.rb: now exports XCFLAGS from configure script to extension
	  makefiles so that extensions can be built MAB (see configure's
	  --enable-fat-binary option); also utilize XCFLAGS in cc_command()
	  (but not cpp_command() because MAB flags are incompatible with
	  direct invocation of `cpp').

	* ext/curses/extconf.rb: now additionally checks for presence of these
	  curses functions which are not present on NextStep or Openstep:
	  bkgd(), bkgdset(), color(), curs(), getbkgd(), init(), scrl(), set(),
	  setscrreg(), wattroff(), wattron(), wattrset(), wbkgd(), wbkgdset(),
	  wscrl(), wsetscrreg()

	* ext/curses/curses.c: added appropriate #ifdef's for additional set of
	  curses functions now checked by extconf.rb; fixed curses_bkgd() and
	  window_bkgd() to correctly return boolean result rather than numeric
	  result; fixed window_getbkgd() to correctly signal an error by
	  returning nil rather than -1.

	* ext/etc/etc.c: setup_passwd() and setup_group() now check for null
	  pointers before invoking rb_tainted_str_new2() upon fields extracted
	  from `struct passwd' and `struct group' since null pointers in some
	  fields are common on NextStep/OpenStep (especially so for the
	  `pw_comment' field) and rb_tainted_str_new2() throws an exception
	  when it receives a null pointer.

	* ext/pty/pty.c: include "util.h" for strdup()/ruby_strdup() for
	  platforms such as NextStep and OpenStep which lack strdup().

	* ext/socket/getaddrinfo.c: cast first argument of getservbyname(),
	  gethostbyaddr(), and gethostbyname() from (const char*) to non-const
	  (char*) for older platforms such as NextStep and OpenStep.

	* ext/socket/socket.c: include "util.h" for strdup()/ruby_strdup() for
	  platforms such as NextStep and OpenStep which lack strdup(); include
	  <netinet/in_systm.h> if present for NextStep and OpenStep; cast first
	  argument of gethostbyaddr() and getservbyname() from (const char*) to
	  non-const (char*) for older platforms.

	* ext/syslog/syslog.c: include "util.h" for strdup()/ruby_strdup() for
	  platforms such as NextStep and OpenStep which lack strdup().

Wed Oct  8 22:19:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/test/unit.rb: removed installation instructions.

	* lib/test/unit/ui/testrunnermediator.rb: moved the run flag to a more
	  central location.

	* lib/test/unit.rb: ditto.

	* lib/test/unit.rb: extracted the running code in to AutoRunner.

	* lib/test/unit/autorunner.rb: added.

	* lib/test/unit/collector/objectspace.rb: extracted common test
	  collection functionality in to a module.

	* lib/test/unit/collector.rb: ditto; added.

	* test/testunit/collector/test_objectspace.rb: ditto.

	* lib/test/unit/collector/dir.rb: added. Supports collecting tests out
	  of a directory structure.

	* test/testunit/collector/test_dir.rb: added.

	* test/runner.rb: simplified to use the new capabilities.

Tue Oct  7 15:23:09 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/ruby/test_beginendblock.rb: add tests for nested BEGIN/END.

	* test/ruby/beginmainend.rb: add tests for nested BEGIN/END.

	* test/ruby/endblockwarn.rb: new file added to test of END-in-method
	  warning.

Tue Oct  7 12:23:47 2003  Tanaka Akira  <akr@m17n.org>

	* ext/fcntl/fcntl.c (Init_fcntl): define Fcntl::O_ACCMODE.

	* ext/socket/extconf.rb: useless assignment removed.

Tue Oct  7 09:13:24 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/ruby/test_beginendblock.rb (test_endinmethod): END{} is now
	  allowed in eval.

Tue Oct  7 04:15:25 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (stmt): should not expand mrhs if lhs is solely starred.

Tue Oct  7 02:57:53 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (stmt): rhs of multiple assignment should not be
	  expanded using "to_a". [ruby-dev:21527]

Tue Oct  7 01:42:34 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_asn1.c (ossl_asn1_get_asn1type): use appropriate
	  free function for ASN1_OBJECT.

	* ext/openssl/ossl_asn1.c (ossl_asn1obj_get_sn): add new function for
	  ASN1::ObjectId#sn; it returns short name text representation of OID.

	* ext/openssl/ossl_asn1.c (ossl_asn1obj_get_ln): add new function for
	  ASN1::ObjectId#ln; it returns long name text representation of OID.

	* ext/openssl/ossl_asn1.c (ossl_asn1obj_get_oid): add new function for
	  ASN1::ObjectId#oid; it returns numerical representation of OID.

Mon Oct  6 22:59:46 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/csv.rb (IOReader, BasicWriter): call binmode when a given IO
	  respond_to?(:binmode).  record separator was wrong when you gave
	  text mode IO to Reader.parse and Writer.generate.

	* test/csv/test_csv.rb: add tests for above change.

Sun Oct  5 23:27:09 2003  Tanaka Akira  <akr@m17n.org>

	* ext/socket/extconf.rb: check recvmsg even if sendmsg is exists.

	* ext/socket/socket.c (thread_read_select): restored.

Mon Oct  6 16:23:38 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (w_object): wrong method name in the message.

Mon Oct  6 16:02:05 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (stmt): END in method should cause warning.
	  [ruby-dev:21519]

Mon Oct  6 15:17:23 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/ruby/test_iterator.rb (test_block_argument_without_paren):
	  added. (follows sample/test.rb)

Mon Oct  6 11:57:06 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/ruby/test_beginendblock.rb, test/ruby/beginmainend.rb: added
	  test for eval-ed BEGIN END order.

Mon Oct  6 09:19:54 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* marshal.c (w_object): should pass "weak" value to next level.
	  [ruby-dev:21496]

	* eval.c (proc_alloc): should not use cached object if klass is
	  different. [ruby-talk:83685]

Sun Oct  5 23:27:09 2003  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb: version information is added in document.

Sun Oct  5 23:07:03 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_f_END): block should be given.  [ruby-dev:21497]

Sun Oct  5 22:51:23 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/ext/openssl/extconf.rb: add check for some engine functions
	  unavailable in OpenSSL-0.9.6.

	* lib/ext/openssl/ossl_engine.c: ditto.

Sun Oct  5 17:56:30 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_eval): fix evaluation order.  [ruby-list:38431]

Sun Oct  5 15:05:06 2003  akira yamada  <akira@ruby-lang.org>

	* test/uri/*: translated RUNIT to Test::Unit.

Sun Oct  5 14:37:39 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/xsd/datatypes.rb: Rational -> Decimal string bug fix.

	* test/soap/marshal/test_marshal.rb: ditto.

	* test/soap/calc/test_calc_cgi.rb: add Config::CONFIG["EXEEXT"] to
	  RUBYBIN.

Sun Oct  5 13:47:22 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/ruby/test_beginendblock.rb, test/ruby/beginmainend.rb: add tests
	  about scope, order and allowed syntax.

Sun Oct  5 11:54:29 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/ruby/envutil.rb: added.  split "rubybin" from test_system.rb.

	* test/ruby/test_system.rb: use envutil.rb

	* test/ruby/test_beginendblock.rb: added.

	* test/ruby/beginmainend.rb: added.  used in test_beginendblock.rb.

Sun Oct  5 11:23:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* test/testunit/runit/test_testresult.rb: removed some unnecessary
	  cruft.

Sun Oct  5 11:14:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/rubyunit.rb: aliasing TestCase into the top level is
	  problematic.

	* lib/runit/assert.rb: fixed a couple of bugs caused by recent
	  refactoring in Test::Unit.

	* test/testunit/runit/*: added.

Sun Oct  5 10:55:29 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/open-uri.rb (URI::Generic#find_proxy): no_proxy support did not
	  work.  [ruby-dev:21484]

Sun Oct  5 09:52:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/test/unit/assertions.rb: will use pp for output if available.
	  Can be disabled by setting Assertions.use_pp = false.

	* test/testunit/test_assertions.rb: made a small change to exception
	  formatting.

Sun Oct  5 07:42:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/test/unit/assertions.rb: made small improvements to assertion
	  messages. Deprecated Assertions#assert_not_nil; use #assert instead.

	* test/testunit/test_assertions.rb: ditto.

	* test/testunit/util/test_procwrapper.rb: use #assert instead of
	  #assert_not_nil.

Sun Oct  5 04:10:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/test/unit/assertions.rb: refactored message building.

Sun Oct  5 03:40:22 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_asn1.h: global symbols should be declared
	  as external.

Sun Oct  5 03:03:20 2003  akira yamada  <akira@ruby-lang.org>

	* test/ruby/test_exception.rb (test_else): added.

Sun Oct  5 02:12:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/test/unit/assertions.rb: changed assertion messages to rely more
	  heavily on #inspect. Added backtrace filtering for exceptions in
	  assertion messages.

	* test/testunit/test_assertions.rb: ditto.

Sun Oct  5 02:12:00 2003  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* lib/drb/acl.rb, lib/drb/ssl.rb: added.

	* lib/drb/drb.rb: exit from a thread using 'break'.

Sat Oct  4 21:49:14 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* gc.c (Init_stack): the type of space is changed to unsigned int
	  from double.  [ruby-dev:21483]

Sat Oct  4 17:52:59 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/netHttpClient.rb: follow http-access2.  hosts which matches
	  ENV['no_proxy'] or ENV['NO_PROXY'] are not proxyed.
	  - [,:] separated. ("ruby-lang.org:rubyist.net")
	  - no regexp. (give "ruby-lang.org", not "*.ruby-lang.org")
	  - if you want specify host by IP address, give full address.
	    ("192.168.1.1, 192.168.1.2")

	* lib/soap/rpc/cgistub.rb: return "Status: XXX MMM" line.

	* test/runner.rb: give testsuite name.

Sat Oct  4 15:16:02 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* marshal.c (w_object): instance variable dump do not cause error
	  for objects that cannot be dumped, if they traversed from
	  marshal_dump.  they are just ignored.

	* gc.c (Init_stack): cast "space" (doble value) into unsigned
	  int.  should run on PowerPC.

	* eval.c (rb_eval): should not execute else part if any exception
	  is caught. [ruby-dev:21482]

	* parse.y (f_args): should allow unparenthesized block argument.

	* parse.y (f_rest_arg): should allow unparenthesized rest
	  argument.

Sat Oct  4 14:59:51 2003  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb (initialize): raise ArgumentError if argument has
	  '\0' character.
	  (relative_path_from): new method.
	  (each_entry): new method for replacement of dir_foreach.
	  (foreach, foreachline, dir_foreach, chdir): obsoleted.

Sat Oct  4 12:58:48 2003  akira yamada  <akira@ruby-lang.org>

	* test/uri/* (6 files): added.

Sat Oct  4 12:44:45 2003  akira yamada  <akira@ruby-lang.org>

	* lib/uri/ftp.rb, lib/uri/mailto.rb: renamed to #to_s from #to_str.

Sat Oct  4 07:33:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/test/unit/testsuite.rb: changed #<< to return self, and added
	  #delete.

	* test/testunit/test_testsuite.rb: ditto. Also slightly refactored
	  #test_size.

	* lib/test/unit/collector/objectspace.rb: collector now preserves the
	  hierarchy of suites.

	* test/testunit/collector/test_objectspace.rb: ditto.

Sat Oct  4 04:48:49 2003  why the lucky stiff  <why@ruby-lang.org>

	* ext/syck/rubyext.c: default keys handled.

	* ext/syck/syck.h: lowered default buffer size to 16k for increased
	  performance.

	* test/yaml: checkin of basic unit tests.

Sat Oct  4 04:24:19 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/extconf.rb: add check for X509V3_set_nconf.

	* ext/openssl/ossl_x509ext.c (ossl_x509extfactory_set_config):
	  cannot implement if X509V3_set_nconf doesn't exist.

Sat Oct  4 02:12:44 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/xsd/datatypes.rb: dump sign by itself.  under the problematic
	  platform, sprintf("%+.10g", -0.0) => +0.  sigh.

	* sample/wsdl/amazon/*: update schema ver2 to ver3.

Sat Oct  4 01:33:46 2003  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb (initialize): duplicate and freeze argument.
	  (to_s): return duplicated string.
	  (children): new method.
	  (each_line): new alias to foreachline.

Fri Oct  3 16:13:19 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_asn1.c: add DER encoder and decoder.

	* ext/openssl/ossl_asn1.h: add OpenSSL::ASN1 module.

	* ext/openssl/ossl.c (Init_openssl): call Init_ossl_asn1.

	* ext/openssl/extconf.rb: check if X509_ATTRIBUTE has field "single".

	* ext/openssl/ossl_x509attr.c (ossl_x509attr_set_value): accept
	  DER encoded data argument.

	* ext/openssl/ossl_x509attr.c (ossl_x509attr_get_value): return
	  DER encoded data in OpenSSL::ASN1 types.

Fri Oct  3 13:02:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/test/unit.rb: refactored to use optparse.

	* lib/test/unit.rb: added support for selecting the output
	  level from the command-line.

	* lib/test/unit.rb: added a command-line switch to stop processing
	  the command-line, allowing arguments to be passed to tests.

	* lib/test/unit.rb: changed the method for specifying a runner or a
	  filter from the command-line.

	* lib/test/unit/collector/objectspace.rb: fixed a bug causing all
	  tests to be excluded when the filter was set to an empty array.

	* test/testunit/collector/test_objectspace.rb: ditto.

Fri Oct  3 08:14:32 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/irb/ruby-lex.rb (RubyLex::identify_identifier): support
	  'class ::Foo' syntax. [ruby-talk:83514]

Fri Oct  3 08:01:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/test/unit/assertions.rb: added a default message for #assert,
	  #assert_block, and #flunk.

	* test/testunit/test_assertions.rb: ditto.

	* lib/test/unit/failure.rb: failures now show a better trace of where
	  they occurred.

	* test/testunit/test_failure.rb: ditto (added).

	* lib/test/unit/testcase.rb: ditto.

	* test/testunit/test_testcase.rb: ditto.

	* lib/test/unit/util/backtracefilter.rb: added.

	* test/testunit/util/test_backtracefilter.rb: added.

	* lib/test/unit/error.rb: changed to use BacktraceFilter and improved
	  output.

	* test/testunit/test_error.rb: ditto.

Thu Oct  2 20:33:49 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/iconv/iconv.c (iconv_failure_initialize): conform with
	  orthodox initialization method.

	* ext/iconv/iconv.c (iconv_fail): initialize exception instance
	  from the class, and do not share instance variables with the
	  others.  [ruby-dev:21470]

Thu Oct  2 18:20:27 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* time.c (Init_Time): define initialize.  [ruby-dev:21469]

Thu Oct  2 17:39:38 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_engine.c: add a new module OpenSSL::Engine.
	  it supports OpenSSL hardware cryptographic engine interface.

	* ext/openssl/ossl_engine.h: ditto.

	* ext/openssl/MANIFEST: add ossl_engine.c and ossl_engine.h.

	* ext/openssl/extconf.rb: add check for openssl/engine.h.

	* ext/openssl/ossl.c: call Init_ossl_engine().

	* ext/openssl/ossl.h: include openssl/engine.h.

	* ext/openssl/ossl_pkey_{rsa,dsa,dh}.c: check if underlying
	  EVP_PKEY referes engine.

Thu Oct  2 17:22:37 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* time.c (time_load): restore instance variables (if any) before
	  loading from marshaled data.

Thu Oct  2 14:19:15 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/iconv/iconv.c (iconv_fail): now yield erred substring, and
	  set error object to $!.

	* ext/iconv/iconv.c (iconv_convert): error handler block should
	  return appended part and the rest.  if rest is nil, the
	  conversion stops.

Thu Oct  2 12:00:18 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* variable.c (rb_const_defined_0): look up constants in Object as
	  well.  [ruby-dev:21458]

	* test/ruby/test_defined.rb (TestDefined::test_defined): test for
	  constants.

Thu Oct  2 11:17:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/test/unit/assertions.rb: should not capture an
	  AssertionFailedError unless explicitly requested.

	* test/testunit/test_assertions.rb: ditto.

	* test/testunit/collector/test_objectspace.rb: fixed a test failure
	  caused by methods being returned in different orders on different
	  platforms by moving test sorting from TestSuite into the locations
	  where suites are constructed. [ruby-talk:83156]

	* lib/test/unit/testcase.rb: ditto.

	* lib/test/unit/testsuite.rb: ditto.

	* lib/test/unit/collector/objectspace.rb: ditto.

Thu Oct  2 03:25:01 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* eval.c (rb_thread_raise): prototype; avoid VC++ warning.

Thu Oct  2 01:37:34 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* time.c (time_mdump): new marshal dumper. _dump is still
	  available for compatibility.

	* time.c (time_mload): new marshal loader.

	* marshal.c (w_object): preserve instance variables for objects
	  with marshal_dump.

	* marshal.c (r_object0): restore instance variables before calling
	  marshal_load.

	* error.c (rb_warn_m): always return nil.

Thu Oct  2 01:32:46 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_f_block_given_p): real required condition is
	  ruby_frame->prev->iter == ITER_CUR.

	* eval.c (rb_block_given_p): ditto.

	* eval.c (block_pass): update ruby_frame->iter only when previous
	  value is ITER_NOT.

Thu Oct  2 01:02:35 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* variable.c (rb_const_defined_at): should exclude constants from
	  Object when TYPE(klass) == T_MODULE *and* exclude is on.
	  [ruby-dev:21458]

	* variable.c (rb_const_get_0): do not lookup constants from Object
	  when TYPE(klass) == T_MODULE *and* exclude is on.

Thu Oct  2 00:21:11 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/logger/test_logger.rb: unlinking file before close causes
	  problem under win32 box.

	* lib/xsd/datatypes.rb(XSDFloat, XSDDouble): add +/- sign explicitly
	  when stringified and embedded into XML instance.  Ruby's sprintf may
	  format -0.0 as "0.0" (no minus sign) depending on underlying C
	  sprintf implementation.

	* test/xsd/test_xsd.rb, test/soap/test_basetype.rb: follow above change.

	* test/soap/calc/*: give httpd config param "CGIInterpreter".
	  "/usr/bin/env ruby" thing does not work under non-Unix boxes.

Sat Oct  2 00:42:20 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* marshal.c (r_byte): retrieve pointer from string value for each
	  time.  [ruby-dev:24404]

	* marshal.c (r_bytes0): ditto.

	* enum.c (sort_by_i): re-entrance check added.  [ruby-dev:24399]

	* io.c (io_read): should freeze all reading buffer.
	  [ruby-dev:24400]

	* string.c (rb_str_sum): should use bignums when bits is greater
	  than or equals to sizeof(long)*CHAR_BITS. [ruby-dev:24395]

	* eval.c (specific_eval): defer pointer retrieval to prevent
	  unsafe sourcefile string modification.  [ruby-dev:24382]

	* string.c (rb_str_sum): wrong cast caused wrong result.
	  [ruby-dev:24385]

	* enum.c (enum_sort_by): hide temporary array from
	  ObjectSpace.each_object.  [ruby-dev:24386]

	* string.c (rb_str_sum): check was done with false pointer.
	  [ruby-dev:24383]

	* string.c (rb_str_sum): string may be altered.  [ruby-dev:24381]

Thu Oct  2 00:25:21 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* signal.c (ruby_signal_name): adjust to the prototype.

	* process.c (pst_inspect): ditto.

	* ext/etc/etc.c (etc_getgrent, Init_etc): typo.

Wed Oct  1 20:49:41 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (heaps): manage slots and limits together.  [ruby-dev:21453]

	* gc.c (add_heap): should not clear heaps slot even if realloc()
	  failed.

Wed Oct  1 20:36:49 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* MANIFEST: add wince/mkconfig_wce.rb.

Wed Oct  1 17:22:33 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/etc/etc.c: add new functions: setpwent, getpwent, endpwent,
	  setgrent, getgrent, endgrent.

	* ext/socket/socket.c (sock_s_gethostbyname): do not reverse lookup.

Wed Oct  1 17:01:30 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_load): Object scope had priority over required file
	  scope.  [ruby-dev:21415]

Wed Oct  1 14:09:53 2003  Takaaki Uematsu  <uema2x@jcom.home.ne.jp>

	* wince/mkconfig_wce.rb: sorry, forget to commit.

Wed Oct  1 10:08:42 2003  Takaaki Uematsu  <uema2x@jcom.home.ne.jp>

	* wince/setup.mak: add sigmarionIII SDK support.

	* wince/Makefile.sub: ditto.

	* wince/mkexports.rb: fix linker error in SH4.

	* wince/mkconfig_wce.rb: camouflage RUBY_PLATFORM for compiling ext.

Wed Oct  1 08:02:52 2003  Takaaki Uematsu  <uema2x@jcom.home.ne.jp>

	* wince/time_wce.c (time): add zero check.

Tue Sep 30 16:11:05 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* Makefile.in: copy lex.c from $(srcdir) if it's not the current
	  directory.  [ruby-dev:21437]

Tue Sep 30 11:29:23 2003  Tanaka Akira  <akr@m17n.org>

	* process.c (pst_inspect): describe stopped process "stopped".

Tue Sep 30 09:31:56 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/runner.rb: glob for directories.

Tue Sep 30 09:11:43 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_eval): while/until should not capture break unless
	  they are destination of the break.

Tue Sep 30 03:12:02 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/net/http.rb (finish): revert to 1.93.

	* lib/net/pop.rb (finish): revert to 1.60.

	* lib/net/smtp.rb (finish): revert to 1.67.

	* lib/net/http.rb (do_start): ensure to close socket if failed to
	  start session.

	* lib/net/pop.rb (do_start): ditto.

	* lib/net/smtp.rb (do_start): ditto.

	* lib/net/smtp.rb: SMTP#started? wrongly returned false always.

Tue Sep 30 02:54:49 2003  Minero Aoki  <aamine@loveruby.net>

	* test/ruby/test_iterator.rb: new test
	  test_break__nested_loop[123].

Mon Sep 29 23:39:13 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/net/http.rb (finish): does not raise IOError even if
	  !started?, to allow closing socket which was opened before
	  session started.

	* lib/net/pop.rb (finish): ditto.

	* lib/net/smtp.rb (finish): ditto.

Mon Sep 29 19:06:51 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* ext/win32ole/extconf.rb: add windows.h checking.
	  (ruby-bugs:PR#1185)

Mon Sep 29 16:18:30 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/logger.rb: check if the given logdevice object respond_to :write
	  and :close, not is_a? IO.  duck duck.

	* test/logger/test_logger.rb: self IO.pipe reading/writing may be
	  locked by the flood.  use tempfile.

	* lib/wsdl/xmlSchema/data.rb: wrong constant reference.

Mon Sep 29 16:11:23 2003  Minero Aoki  <aamine@loveruby.net>

	* test/fileutils/test_fileutils.rb: clean up temporary symlink.
	  Patched by NaHi.  [ruby-dev:21420]

Mon Sep 29 11:16:55 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_thread_atfork): wrong format specifier.
	  [ruby-dev:21428]

	* process.c (pst_inspect): better description.

Mon Sep 29 02:31:44 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/utils.rb (Utils::su): use setgid and setuid to
	  set real and effective IDs. and setup group access list by
	  initgroups.

Sun Sep 28 11:14:19 2003  Koji Arai  <jca02266@nifty.ne.jp>

	* ext/digest/digest.c (Init_digest): `copy_object' was deprecated.
	  `initialize_copy' should be defined.

	* ext/stringio/stringio.c (Init_stringio): ditto.

Sat Sep 27 18:25:13 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/xsd/charset.rb: XSD::Charset.is_ces did return always true under
	  $KCODE = "NONE" environment.  check added.

	* test/xsd/test_xsd.rb: add tests for above fix.

Sat Sep 27 15:58:50 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/rpc/cgistub.rb: make logging severity threshold higher.

	* lib/soap/rpc/standaloneServer.rb: defer WEBrick server start to give
	  a chance to reset logging severity threshold.

	* test/soap/calc/test_*, test/soap/helloworld/test_helloworld.rb: run
	  silent.

Sat Sep 27 09:44:18 2003  Minero Aoki  <aamine@loveruby.net>

	* test/fileutils/test_fileutils.rb: clear all errors on Windows.
	  [ruby-dev:21417]

	* test/fileutils/test_nowrite.rb: ditto.

Mon Sep 27 09:14:03 2004  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* array.c (rb_ary_delete): comparison may change the capacity.
	  [ruby-dev:24348]

	* array.c (rb_ary_fill): fill should honor length argument.
	  [ruby-dev:24346]

	* array.c (rb_ary_replace): should not use ptr from shared array.
	  [ruby-dev:24345]

	* ext/socket/socket.c (s_accept): don't retry for EWOULDBLOCK.
	  [ruby-talk:113807]

Sat Sep 27 04:57:07 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/ruby/test_file.rb: new file.  only asserts unlink-before-close
	  behaviour now.

	* test/soap/marshal/test_digraph.rb: should close before unlink.
	  unlink-before-close pattern is not needed here.

Sat Sep 27 03:32:37 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/soap/*, test/wsdl/*, test/xsd/*: move TestCase classes into
	  each module namespace.  TestMarshal in
	  test/soap/marshal/test_marshal.rb crashed with
	  test/ruby/test_marshal.rb.

Sat Sep 27 01:30:59 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/socket/socket.c (ruby_connect): on win32, type of the 4th
	  argument of getsockopt is char *.

Fri Sep 26 18:35:40 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/resolv-replace.rb: 1.8 compliance.  [ruby-talk:82946]

Fri Sep 26 17:39:27 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/ruby/test_marshal.rb: add test for ruby's objects.

Fri Sep 26 09:52:44 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* defines.h (flush_register_windows): use volatile only for gcc on
	  Solaris.  [ruby-dev:21403]

	* lib/mkmf.rb (xsystem): use system directly to honor shell meta
	  charaters.

Fri Sep 26 00:10:13 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/README: updated.

Thu Sep 25 17:48:10 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/openssl/ossl.c (ossl_buf2str): fix type of 1st argument for
	  rb_protect.

	* ext/openssl/ossl_hmac.c (ossl_hmac_digest): should return meaningful
	  value.

Thu Sep 25 09:00:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/ostruct.rb: Added OpenStruct#==.

	* test/ostruct/test_ostruct.rb: Added.

Thu Sep 25 07:55:26 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/win32ole/win32ole.c, ext/openssl/ossl_pkey_dsa.c,
	  ext/openssl/ossl_pkey_rsa.c, ext/bigdecimal/bigdecimal.h: must
	  not use C++ or C99 style comment yet.  (ruby-bugs:PR#1184)

Thu Sep 25 00:23:22 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* MANIFEST: add SOAP4R.

Thu Sep 25 00:13:15 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/soap/* (29 files): SOAP4R added.

	* lib/wsdl/* (42 files): WSDL4R added.

	* lib/xsd/* (12 files): XSD4R added.

	* test/soap/* (16 files): added.

	* test/wsdl/* (2 files): added.

	* test/xsd/* (3 files): added.

	* sample/soap/* (27 files): added.

	* sample/wsdl/* (13 files): added.

Wed Sep 24 02:08:11 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httpservlet/cgihandler.rb: conform to mswin32.
	  [ruby-talk:82735], [ruby-talk:82748], [ruby-talk:82818]

Tue Sep 23 23:10:16 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/logger.rb: add Logger#<<(msg) for writing msg without any
	  formatting.

	* test/logger/test_logger.rb: ditto.

Tue Sep 23 20:47:51 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* error.c (rb_warn_m): should not warn if -W0 is specified.
	  [ruby-talk:82675]

Mon Sep 22 21:28:57 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* MANIFEST: updated.

Mon Sep 22 19:22:26 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* configure.in (AC_CHECK_FUNCS): add setuid and setgid.

Mon Sep 22 12:34:55 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* util.c (ruby_strtod): skip preceding zeros before counting
	  digits in the mantissa. (ruby-bugs:PR#1181)

Sun Sep 21 04:12:36 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_ocsp.c (ossl_ocspreq_initialize): the argument
	  should be a String.

	* ext/openssl/ossl_ocsp.c (ossl_ocspres_initialize): ditt.

	* ext/openssl/ossl_x509attr.c (ossl_x509attr_initialize): ditto.

	* ext/openssl/ossl_x509ext.c (ossl_x509ext_initialize): ditto.

	* ext/openssl/ossl_x509ext.c (ossl_x509ext_set_value): ditto.

Sat Sep 20 11:49:05 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/logger.rb: typo fixed.

	* test/logger/test_logger.rb: new file.

Fri Sep 19 11:39:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* test/testunit/*: Added.

	* lib/test/unit.rb: Documentation update.

	* lib/test/unit/ui/console/testrunner.rb (TestRunner#initialize):
	  Ditto.

	* lib/test/unit.rb: Factored out an ObjectSpace collector.

	* lib/test/unit/collector/objectspace.rb: Ditto.

	* sample/testunit/*: Added.

Fri Sep 19 01:00:48 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/log.rb (BasicLog#log): get rid of as ineffectual
	  condition.

	* lib/webrick/log.rb (BasicLog#format): add "\n" to message.

Thu Sep 18 22:43:20 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (proc_invoke): should push PROT_PCALL tag for orphans.

	* eval.c (proc_invoke): should update "result" for orphans.

Thu Sep 18 20:33:03 2003  Tietew  <tietew-ml-ruby-list@tietew.net>

	* parse.y (str_xquote): do not prepend escapes in
	  backqoute literals.  [ruby-list:38409]

Thu Sep 18 20:30:17 2003  Tanaka Akira  <akr@m17n.org>

	* lib/pathname.rb: update document.

Thu Sep 18 15:27:05 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/logger.rb: new file.  Logger, formerly called devel-logger or
	  Devel::Logger.

	* sample/logger/*: new file.  samples of logger.rb.

Wed Sep 17 23:41:45 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (localjump_destination): should not raise ThreadError
	  exception for "break". [ruby-dev:21348]

	* eval.c (proc_invoke): use result instead of prot_tag->retval.
	  retval is no longer propagated to the ancestors.

Wed Sep 17 20:34:00 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (tokadd_string, parse_string, yylex): escaped terminator
	  is now interpreted as is.  [ruby-talk:82206]

Wed Sep 17 18:52:36 2003  Minero Aoki  <aamine@loveruby.net>

	* test/fileutils/fileassertions.rb: new file.

	* test/fileutils/test_fileutils.rb: new file.

	* test/fileutils/test_nowrite.rb: new file.

Wed Sep 17 18:51:02 2003  Minero Aoki  <aamine@loveruby.net>

	* test/strscan/test_stringscanner.rb: require test/unit.

Wed Sep 17 18:35:34 2003  Minero Aoki  <aamine@loveruby.net>

	* test/strscan/test_stringscanner.rb: new file.

Wed Sep 17 18:03:30 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl: all files are reviewed to simplify and avoid memory leak.

	* ext/openssl/extconf.rb: add check for assert.h.

	* ext/openssl/ossl.c (ossl_buf2str): new function to convert
	  C buffer to String and free buffer.

	* ext/openssl/ossl.c (ossl_x509_ary2sk): new function to convert
	  Array of OpenSSL::X509 to STACK_OF(X509) with exception safe.

	* ext/openssl/ossl.c (ossl_to_der, ossl_to_der_if_possible): new
	  functions to convert object to DER string.

	* ext/openssl/ossl.h: ditto.

	* ext/openssl/ossl_bio.c (ossl_membio2str): new function to convert
	  BIO to String object and free BIO.

	* ext/openssl/ossl_bio.h: ditto.

	* ext/openssl/ossl_pkcs7.c (ossl_pkcs7_to_der): add for "to_der".

	* ext/openssl/ossl_x509name.c (ossl_x509name_to_der): ditto.

	* ext/openssl/ossl_x509ext.c (ossl_x509ext_to_der): ditto.

	* ext/openssl/ossl_x509ext.c (create_ext_from_array): removed
	  and reimplement in openssl/x509.rb.

	* ext/openssl/ossl_x509attr.c: reimplemented and disable some
	  method temporarily. this class doesn't work fine without ASN.1
	  data support;-) I'll rewrite in near future.

	* ext/openssl/lib/openssl/x509.c (X509::Attribute): get rid off
	  unused code.

	* ext/openssl/lib/openssl/x509.c (X509::ExtensionFactory): refine all.

Tue Sep 16 22:25:06 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/csv/test_csv.rb: add negative tests of row_sep.

Tue Sep 16 18:02:36 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* regex.c (re_compile_pattern): should not translate character
	  class range edge. [ruby-list:38393]

Tue Sep 16 16:47:56 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* MANIFEST: add test/csv/mac.csv.

	* win32/Makefile.sub, bcc32/Makefile.sub (test): add phony NUL target.

Mon Sep 15 19:02:52 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/csv.rb: add extra pamameter to specify row(record) separater
	  character.  To parse Mac's CR separated CSV, do like this.
	    CSV.open("mac.csv", "r", ?,, ?\r) { |row| p row.to_a }
	  The 3rd parameter in this example ?, is for column separater and the
	  4th ?\r is for row separater.  Row separater is nil by default.  Nil
	  separater means "\r\n" or "\n".

	* test/csv/test_csv.rb: add tests for above feature.

	* test/csv/mac.csv: added.  Sample CR separated CSV file.

Fri Sep 12 22:41:48 2003  Michal Rokos  <m.rokos@sh.cvut.cz>

	* ext/openssl/ossl.c: move ASN.1 stuff to ossl_asn1.[ch]

	* ext/openssl/ossl.c: move BIO stuff to ossl_bio.[ch]

	* ext/openssl/ossl_asn1.[ch]: new files

	* ext/openssl/ossl_bio.[ch]: new files

Fri Sep 12 12:30:41 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* intern.h (rb_disable_super, rb_enable_super): replace with dummy
	  expressions instead of prototypes.  the functions remain yet for
	  binary compatibility.  [ruby-talk:81758]

Fri Sep 12 12:09:54 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* bignum.c (rb_big_and): convert argument using 'to_int'.

	* bignum.c (rb_big_or): ditto.

	* bignum.c (rb_big_xor): ditto.

Fri Sep 12 07:06:14 2003  David Black  <dblack@superlink.net>

	* lib/scanf.rb: Took out useless @matched_item variable; some small
	  refactoring.

Thu Sep 11 08:43:44 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_f_require): allow "require" on $SAFE>0, if feature
	  name is not tainted.

	* lib/rexml/parsers/baseparser.rb (REXML::Parsers::BaseParser::stream):
	  Supports StringIO.

Wed Sep 10 22:47:30 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl.h: add a workaround for win32 platform.
	  libeay32.dll doesn't export functions defined in conf_api.h.

	* ext/openssl/ossl_config.c (ossl_config_initialize): ditto.

	* ext/openssl/ossl_config.c (ossl_config_add_value): ditto.

	* ext/openssl/ossl_config.c (set_conf_section_i): should check
	  if the argument is Array.

Wed Sep 10 22:41:54 2003  Tietew  <tietew@tietew.net>

	* eval.c (win32_get_exception_list): avoid VC7 warning.
	  [ruby-win32:577]

Tue Sep  9 10:39:51 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (struct tag): dst should be VALUE.

Tue Sep  9 10:39:51 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (localjump_destination): stop at the scope where the current
	  block was created.  [ruby-dev:21353]

Tue Sep  9 05:17:04 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_config.rb: avoid compile error in OpenSSL-0.9.6.

Tue Sep  9 02:41:35 2003  Michal Rokos  <m.rokos@sh.cvut.cz>

	* ext/openssl/ossl_config.c: Refine compatibility.

Tue Sep  9 01:50:45 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httpserver.rb (HTTPServer#access_log): add "\n" to
	  the message.

	* lib/webrick/log.rb (BasicLog#log): add "\n" only if needed.

Mon Sep  8 22:15:33 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tk/lib/multi-tk.rb: modify security check at creating
	  a new interpreter

Mon Sep  8 20:00:12 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb, lib/optparse/version.rb: search also all
	  capital versions.

Mon Sep  8 19:26:33 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl.h: include openssl/conf.h and openssl/conf_api.h.

	* ext/openssl/ossl_config.c: refine all with backward compatibility.

	* ext/openssl/ossl_config.h: export GetConfigPtr() and DupConfigPtr().

	* ext/openssl/ossl_x509.c: added new constants under X509 module.
	  DEFAULT_CERT_AREA, DEFAULT_CERT_DIR, DEFAULT_CERT_FILE,
	  DEFAULT_CERT_DIR_ENV, DEFAULT_CERT_FILE_ENV and DEFAULT_PRIVATE_DIR.

	* ext/openssl/ossl_x509ext.c (ossl_x509extfactory_free): don't free
	  the members of the struct. it's left to GC.

	* ext/openssl/ossl_x509ext.c (ossl_x509_set_config): add for config=.

	* ext/openssl/ossl_x509ext.c (Xossl_x509extfactory_initialize):
	  add attr readers: issuer_certificate, subject_certificate,
	  subject_request, crl and config.

Mon Sep  8 18:26:41 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/accesslog.rb (AccessLog::setup_params): use req.port
	  instead of config[:Port] or req.request_uri.port.

	* lib/webrick/httprequest.rb (HTTPRequest#meta_vars): ditto.

	* lib/webrick/httpservlet/filehandler.rb (FileHandler#dir_list): ditto.

	* lib/webrick/config.rb: :Listen option never be used.

	* lib/webrick/server.rb (GenericServer#initialize): don't use :Listen
	  option and add warning message.

	* lib/webrick/log.rb (BasicLog#<<): shortcut of log(INFO, ...).

	* lib/webrick/httpserver.rb (HTTPServer#accesslog): use << for logging.

Sun Sep  7 16:08:28 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c (lib_mainloop_core): fixed signal-trap bug

	* ext/tk/lib/*.rb : Ruby/Tk works at $SAFE == 4

Sat Sep  6 02:26:34 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/ruby/test_*.rb: assert_same, assert_match, and so on.

Sat Sep  6 18:45:46 2003  Mauricio Fernandez  <batsman.geo@yahoo.com>

	* parse.y (assignable): call rb_compile_error(), not rb_bug().
	  [ruby-core:01523]

Sat Sep  6 17:40:41 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ruby_missing.c: rid of unnecessary backward
	  compatibility stuff. and remove DEFINE_ALLOC_WRAPPER from
	  all sources.

	* ext/openssl/ossl_x509ext.c (X509::Extension.new): new method.

	* ext/openssl/ossl_x509ext.c (X509::Extension#oid=): new method.

	* ext/openssl/ossl_x509ext.c (X509::Extension#value=): new method.

	* ext/openssl/ossl_x509ext.c (X509::Extension#critical=): new method.

Sat Sep  6 01:23:22 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (CreateChild): need to quote cmd if RUBYSHELL is set.

	* win32/win32.c (CreateChild): fix condition about whether to call
	  shell or not.

Sat Sep  6 00:36:20 2003  Nobuyoshi Nakada  <nobu.nokada@softhome.net>

	* Makefile.in (test): phony target.

	* lib/mkmf.rb (have_library, find_library): configure by library
	  name.

	* lib/optparse.rb (OptionParser#order, #permute, #parse): allow an
	  array as argument.

	* test/ruby/test_*.rb: moved invariants to left side in
	  assert_equal, and use assert_nil, assert_raises and so on.

	* win32/win32.c (isInternalCmd): distinguish command.com and
	  cmd.exe.

	* win32/win32.c (make_cmdvector): a character just after wildcard
	  was ignored.  [ruby-core:01518]

Fri Sep  5 20:27:08 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/ruby/test_*.rb: replace 'assert(a == b)' with assert_equal(a, b)'

Fri Sep  5 18:00:51 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/lib/openssl/x509.rb: new method X509::Name::parse.

	* ext/openssl/ossl_digest.c: add ossl_digest_new().

	* ext/openssl/ossl_digest.h: ditto.

	* ext/openssl/ossl_cipher.c: add ossl_cipher_new().

	* ext/openssl/ossl_cipher.h: ditto.

Fri Sep  5 15:32:04 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* misc/ruby-mode.el (ruby-font-lock-maybe-here-docs): should not
	  search delimiter forward if found in backward.

Fri Sep  5 13:32:48 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/runner.rb: arguments should be keys.

Fri Sep  5 12:09:55 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* test/ruby/test_system.rb (test_system): check existence of ruby
	  interpreter.

Fri Sep  5 11:32:17 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/optparse.rb (--version): fix assignment/reference order.

	* lib/optparse.rb (OptionParser#help): new; OptionParser#to_s may
	  be deprecated in future.

	* lib/optparse/version.rb (OptionParser#show_version): hide Object.

	* test/runner.rb: fix optparse usage.

	* test/runner.rb: glob all testsuits if no tests given.

Fri Sep  5 10:42:58 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/runner.rb: added.  gets testcases from command line and runs it.

	* test/ruby/test_gc.rb: remove useless part which was for dumping test
	  result.

Fri Sep  5 09:28:59 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/ruby/test_gc.rb: added.  splitter.rb which I made to split
	  sample/test.rb into test/ruby/test_* kindly removed GC test (the
	  last section in the original test) to reduce things to be worried.

Fri Sep  5 03:00:04 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/ruby/test_iterator.rb (test_block_in_arg): add no block
	  given tests.

	* test/ruby/test_iterator.rb (test_ljump): uncomment LocalJumpError
	  test.

Fri Sep  5 01:10:11 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/ruby: tests for ruby itself.

	* test/ruby/test_*.rb: split sample/test.rb into 28 test/unit testcases.
	  some tests could not be translates...  search '!!' mark to see it.

	* test/csv/test_csv.rb: should require 'csv', not '../lib/csv'.  test
	  runner should set load path correctly.

Fri Sep  5 01:03:59 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/csv/test_csv.rb: close opened files for CSV::IOBuf explicitly.
	  opened file cannot be removed under win32 box.

Thu Sep  4 23:59:40 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (tokadd_string): newlines have no special meanings in
	  %w/%W, otherwise they are ignored only when interpolation is
	  enabled.  [ruby-dev:21325]

Thu Sep  4 19:38:25 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* ext/io/wait/.cvsignore: added.

	* ext/openssl/.cvsignore: added.

Thu Sep  4 19:28:24 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* sample/openssl: added.  Sample of standard distribution library
	  should be locate in sample/{module_name}/*.

	* ext/openssl/sample/*: removed.  move to sample/openssl/*.

Thu Sep  4 18:02:15 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/csv/test_csv.rb: use remove_const to reduce warnings.  use
	  Dir.tmpdir to locate working files.

Thu Sep  4 17:41:31 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* misc/ruby-mode.el (ruby-here-doc-beg-re): underscore also is
	  valid delimiter.

	* misc/ruby-mode.el (ruby-here-doc-end-match): must quote
	  arbitrary string to use as regexp.

	* misc/ruby-mode.el (ruby-font-lock-maybe-here-docs): must not
	  call `ruby-here-doc-end-match' unless `ruby-here-doc-beg-re'
	  matched.

Thu Sep  4 15:40:07 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test/csv/test_csv.rb: run on test/unit original layer.

Thu Sep  4 12:54:50 2003  why the lucky stiff  <why@ruby-lang.org>

	* ext/syck/token.c: headerless documents with root-level spacing now
	  honored.

Thu Sep  4 00:06:14 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (mark_frame_adj): need to adjust argv pointer if using
	  system's alloca. [ruby-core:01503]

Wed Sep  3 21:33:20 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* test: add test directory.  Test::Unit aware testcases and needed
	  files should be located in this directory.  dir/file name convention;
	    test/{module_name}/test_{testcase_name}.rb
	    test/{module_name}/{needed_files}
	  someday, someone will write testrunner which searches test_*.rb and
	  run testcases automatically.

	* test/csv/*: add testcase for lib/csv.rb.

Wed Sep  3 01:37:09 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* io.c (rb_f_gets): should call next_argv() before type check
	  current_file. [ruby-list:38336]

Tue Sep  2 20:37:15 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/lib/net/protocols.rb (SSLIO#ssl_connect): warning
	  for skipping server verification.

Tue Sep  2 23:36:57 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (proc_invoke): should retrieve retval when pcall is true.

Tue Sep  2 14:09:20 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* ext/socket/extconf.rb: check s6_addr8 in in6_addr (Tru64 UNIX).
	  the patch is submitted by nmu <nmu@users.sourceforge.jp>.

	* ext/socket/getaddrinfo.c (getaddrinfo): should use in6_addr8 on
	  some platforms.

	* ext/socket/getnameinfo.c (getnameinfo): ditto.

Tue Sep  2 14:02:19 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* ext/tcltklib/tcltklib.c (ip_invoke): fixed bug on passing a exception

	* ext/tk/lib/{tk.rb, tkcanvas.rb, tkfont.rb, tktext.rb} :
	  bug fix and improvement of font control

Tue Sep  2 09:51:36 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_eval): should not handle exceptions within rescue
	  argument.  [ruby-talk:80804]

Tue Sep  2 00:44:37 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* re.c (rb_memsearch): fix overrun.  [ruby-talk:80759]

Tue Sep  2 00:41:27 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/iconv/iconv.c (map_charset): use lower case keys.

	* ext/iconv/iconv.c (iconv_fail): just yield error and return the
	  result if a block is given.

	* ext/iconv/iconv.c (iconv_convert): yield error and append the
	  result if a block is given.

	* ext/iconv/charset_alias.rb (charset_alias): optional third
	  argument.

	* ext/iconv/charset_alias.rb (charset_alias): use CP932 instead of
	  SHIFT_JIS on cygwin.

Mon Sep  1 18:34:25 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_eval): make tail recursion in ELSE clause of
	  RESCUE a jump.

Mon Sep  1 18:00:02 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (aref_args): forgot to call NEW_SPLAT(). reported by
	  Dave Butcher.

	* eval.c (Init_Thread): protect thgroup_default.  suggested by Guy
	  Decoux in [ruby-talk:80623]

Mon Sep  1 16:59:10 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_thread_switch): add RESTORE_EXIT; exit by another
	  thread termination.

	* eval.c (rb_thread_start_0): should not error_print() within
	  terminated thread, because $stderr used by it might be
	  overriden now.  [ruby-dev:21280]

Sun Aug 31 22:46:55 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* eval.c (TAG_DST()): take no argument.

	* process.c (p_gid_sw_ensure): return VALUE.

Sun Aug 31 22:27:10 2003  Hidetoshi NAGAI  <nagai@dumbo.ai.kyutech.ac.jp>

	* process.c (p_gid_sw_ensure): lack of function type

Sun Aug 31 12:25:06 2003  Nobuyoshi Nakada  <nobu.nokada@softhome.net>

	* lib/optparse.rb: --version takes an optional argument; "all" or
	  a list of package names.

Sun Aug 31 10:17:02 2003  Tadayoshi Funaba  <tadf@dotrb.org>

	* lib/date/format.rb: yyyy/mm is not an acceptable format.

	* lib/time.rb: follow above.

Sat Aug 30 14:25:43 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_iter_break): should not call TAG_JUMP directly.

Sat Aug 30 03:58:21 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (struct BLOCK): remove BLOCKTAG, use scope instead.

	* eval.c (POP_TAG): no longer propagate retval.  retval is now set
	  directly by localjump_destination().

	* eval.c (localjump_destination): new function to cast
	  return/break local jump.

	* eval.c (rb_yield_0): stop TAG_RETURN/TAG_BREAK escaping.

Fri Aug 29 22:35:00 2003  Shigeo Kobayashi  <shigek@ruby-lang.org>

	* bigdecimal.c *.html: The 2nd arg. for add,sub,mult, and div is 0,
	  then result will be the same as +,-,*,/ respectively.

Fri Aug 29 17:30:15 2003  Hidetoshi NAGAI  <nagai@ai.kyutech.ac.jp>

	* process.c: bug fix

	* process.c: add rb_secure(2) to methods of Process::{UID,GID,Sys}

	* process.c: deny handling IDs during evaluating the block given to
	  the Process::{UID,GID}.switch method

	* ext/tcltklib/tcltklib.c : some methods have no effect if on slave-IP

	* ext/tcltklib/tcltklib.c : can create a interpreter without Tk

	* ext/tcltklib/tcltklib.c : bug fix on handling exceptions

	* ext/tcltklib/MANUAL.euc : modify

	* ext/tk/lib/tk.rb : freeze some core modules

	* ext/tk/lib/multi-tk.rb : more secure

	* ext/tk/lib/tk.rb: TkVariable.new(array) --> treat the array as the
	  Tk's list

	* ext/tk/lib/tk.rb: improve accessibility of TkVariable object

	* ext/tk/lib/tk.rb, ext/tk/lib/tkfont.rb, ext/tk/lib/tkcanvas.rb,
	  ext/tk/lib/tktext.rb : fix bug of font handling

	* ext/tk/lib/tkfont.rb TkFont.new() accepts compound fonts

Thu Aug 28 22:07:12 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* variable.c (rb_autoload_load): call const_missing if autoloading
	  constant is not defined to allow hook.

	* eval.c (rb_eval): use rb_const_get_from() instead of
	  rb_const_get_at().

	* eval.c (is_defined): forgot to check NODE_COLON3.

Thu Aug 28 17:30:24 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* variable.c (rb_const_get_0): should check constants defined in
	  included modules, if klass is Object. [ruby-talk:79302]

	* numeric.c (check_uint): check should be done using UINT_MAX, not
	  INT_MAX. this fix is submitted by Lyle Johnson
	  <lyle@knology.net> in [ruby-core:01486]

Thu Aug 28 05:02:52 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (singleton): typo fixed (ruby-bugs-ja:PR#562)

Thu Aug 28 02:37:45 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_eval): *a = [1,2] now assigns [[1,2]] to a.
	  consistent with *a = [1], which set [[1]] to a.

	* node.h: merge NODE_RESTARY to NODE_SPLAT.

	* parse.y: rules simplified a bit by removing NODE_RESTARY.

	* sample/test.rb: updated for new assignment behavior.

Wed Aug 27 22:33:24 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* error.c (rb_bug): should not use other methods; this function is
	  not for ordinary use.  [ruby-dev:21259]

Wed Aug 27 15:07:57 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/net/smtp.rb (check_response): AUTH CRAM-MD5 returns 334
	  response. [ruby-list:38279]

Wed Aug 27 05:10:15 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (map_errno): support winsock error.

	* win32/win32.c (pipe_exec, CreateChild, poll_child_status, waitpid,
	  kill, link, rb_w32_rename, unixtime_to_filetime, rb_w32_utime):
	  pass errno to map_errno().

	* win32/win32.c (rb_w32_select, rb_w32_accept, rb_w32_bind,
	  rb_w32_connect, rb_w32_getpeername, rb_w32_getsockname,
	  rb_w32_getsockopt, rb_w32_ioctlsocket, rb_w32_listen, rb_w32_recv,
	  rb_w32_recvfrom, rb_w32_send, rb_w32_sendto, rb_w32_setsockopt,
	  rb_w32_shutdown, rb_w32_socket, rb_w32_gethostbyaddr,
	  rb_w32_gethostbyname, rb_w32_gethostname, rb_w32_getprotobyname,
	  rb_w32_getprotobynumber, rb_w32_getservbyname, rb_w32_getservbyport,
	  rb_w32_fclose, rb_w32_close): use map_errno().

	* win32/win32.h: add winsock errors.

Tue Aug 26 23:53:23 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* lib/ostruct.rb (OpenStruct::method_missing): prohibit modifying
	  frozen OpenStruct. [ruby-talk:80214]

Tue Aug 26 20:03:50 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (create_tmpsrc): add the hook for source.
	  [ruby-list:38122]

Tue Aug 26 15:59:53 2003  why the lucky stiff  <why@ruby-lang.org>

	* implicit.c (syck_type_id_to_taguri): corrected detection of
	  x-private types.

Sun Aug 24 01:02:48 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (file_expand_path): performance improvement.
	  [ruby-talk:79748]

Sat Aug 23 23:41:16 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* file.c (rb_file_s_expand_path): avoid calling rb_scan_args() for
	  apparent cases. [ruby-talk:79748]

Sat Aug 23 18:56:53 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/nkf/nkf.c (rb_nkf_putchar): should use rb_str_resize() to just
	  resize a string, rb_str_cat() disallows NULL.  [ruby-dev:21237]

Sat Aug 23 16:48:41 2003  Keiju Ishitsuka  <keiju@ishitsuka.com>

	* lib/irb/ruby-lex.rb: bug fix for "foo" !~ /bar/. [ruby-talk:79942]

Sat Aug 23 15:59:58 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_eval, rb_iterate, block_pass): reduce PUSH/POP_TAG and
	  EXEC_TAG() for retry.  [ruby-dev:21216]

Sat Aug 23 02:32:33 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_yield_splat): should check if "values" is array.

	* enum.c (each_with_index_i): typo.

Fri Aug 22 17:07:05 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* enum.c (inject_i): use rb_yield_values.

	* enum.c (each_with_index_i): ditto.

	* eval.c (rb_yield_splat): new function to call "yield *values".

	* string.c (rb_str_scan): use rb_yield_splat().

Fri Aug 22 06:13:22 2003  why the lucky stiff  <why@ruby-lang.org>

	* ext/syck/rubyext.c: refactoring of the transfer method
	  dispatch.  added yaml_org_handler for faster dispatch of
	  transfers to base types.

	* lib/yaml/rubytypes.rb: removed handling of builtins from
	  Ruby library.

	* ext/syck/token.c: quoted and block scalars are now implicit !str

	* ext/syck/implicit.c: empty string detected as !null.

Fri Aug 22 01:00:31 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (block_pass): improve passing current block.

Fri Aug 22 00:13:00 2003  Shigeo Kobayashi  <shigek@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c: Int. overflow bug in multiplication
	  fixed, and VpNmlz() speed up.

Wed Aug 20 16:44:49 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/socket/socket.c (ruby_connect): many systems seem to have
	  a problem in select() after EINPROGRESS.  [ruby-list:38080]

Wed Aug 20 01:31:17 2003  why the lucky stiff  <why@ruby-lang.org>

	* ext/syck/syck.h: Parser definition problems on HP-UX.
	  [ruby-talk:79389]

	* ext/syck/handler.c (syck_hdlr_get_anchor): Memory leak.

	* ext/syck/syck.s (syck_io_file_read): Bad arguments to fread.

	* ext/syck/rubyext.c: Tainting issues.

Tue Aug 19 23:20:00 2003  Shigeo Kobayashi  <shigek@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c .h .html: to_s("+") implemented.

	* ext/bigdecimal/lib/bigdecimal/math.rb: E implemented.

Tue Aug 19 07:47:09 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/ssl.rb: new file; SSL/TLS enhancement for GenericServer.

	* lib/webrick/https.rb: SSLSocket handling is moved to webrick/ssl.rb.

	* lib/webrick/compat.rb (File::fnmatch): remove old migration code.

	* lib/webrick/httpserver.rb (HTTPServer#run): ditto.

	* lib/webrick/server.rb (GenericServer#listen): the body of this
	  method is pull out as Utils::create_lisnteners.

	* lib/webrick/utils.rb (Utils::create_lisnteners): new method.

	* lib/webrick/server.rb (GenericServer#start): should rescue
	  unknown errors. and refine comments.

	* ext/openssl/lib/openssl/ssl.rb (SSLServer#accept): should close
	  socket if SSLSocket raises error.

Tue Aug 19 11:19:33 2003  Shugo Maeda  <shugo@ruby-lang.org>

	* io.c (next_argv): should not call GetOpenFile() if rb_stdout is
	  not a IO (T_FILE).

Tue Aug 19 07:47:09 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/ossl_ssl.c: sync_close is moved to SSLSocket as
	  a builtin.

	* ext/openssl/lib/openssl/buffering.rb (Buffering#close): ditto.

	* ext/openssl/lib/openssl/buffering.rb (Buffering#puts): should
	  add a return to the tails of each line.

	* ext/openssl/lib/openssl/ssl.rb: new class OpenSSL::SSL::SSLServer.

	* ext/openssl/lib/net/protocols.rb (SSLIO#ssl_connect): use sync_close.

	* ext/openssl/sample/echo_svr.rb: use SSLServer.

	* ext/openssl/sample/echo_cli.rb: add example of SSLSocket#sync_close.

Tue Aug 19 01:24:34 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/curses/curses.c (_XOPEN_SOURCE_EXTENDED): Mac OS X standard
	  headers are inconsistent at this macro.  [ruby-core:01432]

	* ext/curses/extconf.rb: check if _XOPEN_SOURCE_EXTENDED breaks.

	* ext/tcltklib/stubs.c: Status macro in X11/Xthreads.h bothers
	  winspool.h

	* instruby.rb: make list at first instead of iterator.
	  [ruby-talk:79347]

Mon Aug 18 11:23:11 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (glob_helper): preserve raw order for **.

Sun Aug 17 23:39:55 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/openssl/extconf.rb (HAVE_VA_ARGS_MACRO): need to compile.

Sun Aug 17 17:10:03 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/lib/openssl/ssl.rb (SSLSocket#sync_close=): add a
	  method to specify if the underlying IO will be closed in
	  SSLSocket#close.

	* ext/openssl/lib/openssl/buffering.rb: add forwarders to
	  setsockopt, getsockopt and fcntl.

	* ext/openssl/lib/net/protocols.rb: enable sync for SSLSocket.

Sun Aug 17 11:32:04 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb (extmake): should not force to remake Makefile when
	  installation and so on.

Sat Aug 16 23:58:18 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (w_symbol, w_object): get rid of warnings.

	* re.c (rb_memsearch): ditto.

	* time.c (time_dump): ditto.

	* ext/extmk.rb (extmake): not continue making when extconf.rb
	  failed.

	* ext/openssl/extconf.rb: check __VA_ARGS__ macro more precisely.

	* ext/openssl/ossl.h: remove version.h dependency.

	* ext/openssl/ruby_missing.h: ditto.

	* lib/mkmf.rb (pkg_config): use --libs output except with
	  only-L for other options.  [ruby-list:38099]

	* lib/mkmf.rb (create_makefile): separate rule for static
	  library from shared object.

	* win32/Makefile.sub, bcc32/Makefile.sub, wince/Makefile.sub:
	  define exec_prefix and libdir.

Fri Aug 15 23:15:00 2003  Shigeo Kobayashi  <shigek@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c .h: Bug in combination of limit & div
	  method fixed.

	* ext/bigdecimal/lib/bigdecimal/math.rb: atan() & sqrt() added.

Fri Aug 15 12:01:43 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (HUGE_ST_INO): check whether struct stat.st_ino
	  is larger than long.  [ruby-dev:21194]
	  http://www.geocities.co.jp/SiliconValley-PaloAlto/1409/ruby/beos.html

	* error.c (syserr_eqq): errno might exceed Fixnum limit.

	* error.c (Init_Exception): moved base initialization from
	  init_syserr().

	* inits.c (rb_call_inits): postpone initializing errnos until
	  Bignum is available.

Fri Aug 15 12:01:43 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/curses/curses.c (_XOPEN_SOURCE_EXTENDED): needed to let
	  keyname() and so on be declared.

	* ext/curses/curses.c (curses_resizeterm, window_resize):
	  arguments conflicted with macros in term.h.

	* ext/curses/curses.c (Curses module methods): ensure
	  initialized.  [ruby-dev:21191]

Fri Aug 15 02:08:53 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* gc.c (id2ref): recycle check should be done by klass == 0.
	  [ruby-core:01408]

Fri Aug 15 01:34:23 2003  Michal Rokos  <m.rokos@sh.cvut.cz>

	* ext/openssl/ossl_pkey.c: move generate_cb here

	* ext/openssl/ossl_pkey_{dh|dsa|rsa}.c: adapt to this cb

	* ext/openssl/openssl_missing.[ch]: add (0.9.6x, x<j) missing BN funcs

	* ext/openssl/ossl_bn.c: use supplied funcs from openssl_missing.c

Fri Aug 15 00:38:00 2003  Shigeo Kobayashi  <shigek@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c: Bug in div method fixed.

	* ext/bigdecimal/lib/bigdecimal/math.rb: Newly added.

	* ext/bigdecimal/sample/pi.rb: Changed so as to use math.rb.

Thu Aug 14 21:19:14 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (Init_Thread): Continuation#[] added.  [ruby-talk:79028]

Thu Aug 14 20:03:34 2003  Masaki Suketa  <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c (OLE_FREE): should not call
	  ole_message_loop.

	* ext/win32ole/win32ole.c (ole_event_free): ditto.

	* ext/win32ole/win32ole.c (ole_initialize): stop calling
	  OleUninitialize at exit.

Thu Aug 14 11:27:37 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* gc.c (rb_data_object_alloc): check type of 1st argument.
	  [ruby-dev:21192]

Thu Aug 14 00:21:14 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* parse.y (mlhs_node): should allow "::Foo" (colon3) as lhs.

	* parse.y (lhs): ditto.

	* parse.y (yylex): should return tCOLON3 right after kCLASS.
	  [ruby-talk:78918]

	* error.c (exc_initialize): was converting argument to string too
	  eagerly.  Only check was needed. [ruby-talk:78958]

Wed Aug 13 23:31:00 2003  Shigeo Kobayashi  <shigek@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c .h .html: Ambiguity of
	  BigDecimal::limit removed.

Wed Aug 13 19:21:34 2003  Christian Neukirchen  <chneukirchen@yahoo.de>

	* lib/webrick/https.rb (HTTPServer#run): should set syncing-mode
	  to SSLSocket. [ruby-talk:78919]

Wed Aug 13 18:13:49 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (POP_BLOCK): turn on BLOCK_LEFT flag when leaving block.

	* eval.c (proc_invoke): unpack return/break destination when block
	  is already left.

Wed Aug 13 15:58:31 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* object.c (rb_class_s_alloc): add function prototype to avoid VC++
	  warning.

Wed Aug 13 13:50:59 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/Win32API/Win32API.c (Win32API_initialize): should pass some
	  class to first argument of Data_Wrap_Struct(). (ruby-bugs:PR#1109)

Tue Aug 12 16:55:11 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* Makefile.in: static link libraries to LIBRUBY_SO with static linked
	  ext.  [ruby-dev:21157]

	* ext/extmk.rb (extmake): sort extension library initialization order.

	* ext/extmk.rb (extmake): compact $extlibs.

Tue Aug 12 02:48:56 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (THREAD_SAVE_CONTEXT): should explicitly turn off the
	  flag before calling getcontext(2).

	* eval.c (struct thread): add member to save backing store on
	  IA64. (ruby-bugs PR1086)

	* eval.c (thread_mark): mark IA64 backing store region.

	* eval.c (thread_free): free saved IA64 backing store.

	* eval.c (rb_thread_save_context): save IA64 backing store as well.

	* eval.c (rb_thread_restore_context): restore IA64 backing store.

	* eval.c (THREAD_ALLOC): initialize IA64 members.

Mon Aug 11 22:31:50 2003  NAKAMURA, Hiroshi  <nahi@ruby-lang.org>

	* lib/debug.rb(debug_command): inspection command should inspect
	  resulting value even if it's nil.  [ruby-dev:21180] by OMAE, jun
	  <jun66j5@ybb.ne.jp>.

	* lib/debug.rb(debug_command): incomplete regexp.

Mon Aug 11 17:33:07 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_call_super): do not use rb_block_given_p() for
	  check. [ruby-talk:78656]

	* eval.c (BEGIN_CALLARGS): push ITER_NOT only when ITER_PRE.

Sun Aug 10 10:43:05 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* ext/openssl/lib/openssl/buffering.rb: increase BLOCK_SIZE
	  from 1k to 16k bytes. [ruby-talk:78603]

	* ext/openssl/ossl_ssl.c (ossl_sslctx_s_alloc): enable
	  partial write to allow interruption in SSLSocket#write.

Sun Aug 10 00:34:16 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* cygwin/GNUmakefile: remove unnecessary '--drive-name=$(CC)'
	  for ccache.

Sat Aug  9 10:36:21 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* marshal.c (w_object): do not dump generic instance variable when
	  marshal_dump is defined.

Sat Aug  9 00:35:00 2003  Shigeo Kobayashi  <shigek@ruby-lang.org>

	* ext/bigdecimal.c: F style output(like 1234.56789) implemented
	  to to_s method.
	* ext/bigdecimal_??.html: F style output(like 1234.56789)
	  implemented to to_s method.

Fri Aug  8 12:33:17 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* bcc32/Makefile.sub: rubyw.exe should be a Windows GUI program.
	  add the -aa option to WLDFLAGS.

Fri Aug  8 11:29:26 2003  Koji Arai  <jca02266@nifty.ne.jp>

	* marshal.c (w_object): should set `c_arg' at first.

Fri Aug  8 03:22:28 2003  GOTOU Yuuzou  <gotoyuzo@notwork.org>

	* lib/webrick/httputils.rb (FormData#list): should not take
	  a side effect for the receiver.

Thu Aug  7 14:40:37 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* cygwin/GNUmakefile: better --disbale-shared option support.

	* cygwin/GNUmakefile: add forwarding DLL target for cygwin.

Thu Aug  7 14:21:05 2003  Corinna Vinschen  <vinschen@redhat.com>

	* configure.in: Fix Cygwin specific naming of libraries to
	  be net distribution compliant. (ruby-bugs:PR#1077)
	  cygwin-ruby18.dll -> cygruby18.dll

Thu Aug  7 12:51:38 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_f_at_exit): should not be called without a block.
	  block_given check added.

Thu Aug  7 06:46:06 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_call0): forgot to pop ruby_class.

	* eval.c (rb_call0): update ruby_class as well as ruby_cref.
	  (ruby-bugs-ja:PR#540)

Thu Aug  7 04:52:50 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_yield_0): remove ruby_frame->cbase and unify to
	  ruby_cref.  [ruby-talk:78141]

Thu Aug  7 04:19:15 2003  Akinori MUSHA  <knu@iDaemons.org>

	* gc.c: FreeBSD/ia64's mcontext_t is a bit different from that of
	  Linux/ia64.  This makes gc.c compile but miniruby coredumps for
	  the moment.

Thu Aug  7 00:15:00 2003  Shigeo Kobayashi  <shigek@ruby-lang.org>

	* ext/bigdecimal.c: Comparison results adjusted to Float's.
	* ext/bigdecimal.c: Use rb_num_coerce_????(x,y) instead of own.

Wed Aug  6 22:58:00 2003  Nathaniel Talbott  <ntalbott@ruby-lang.org>

	* lib/test/unit/testcase.rb: Added equality checking.
	* lib/test/unit/testsuite.rb: Added equality checking.
	* lib/test/unit/assertions.rb: Fixed a warning.

Wed Aug  6 17:28:10 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb (extmake): pass LIBPATH to make ruby.  [ruby-dev:21137]

	* ext/extmk.rb (extmake): set library name as source file name in
	  Init_ext().  [ruby-dev:21137]

	* lib/mkmf.rb (Logging::postpone): postpone logging messages after
	  heading message as the result of the block.

	* lib/mkmf.rb (macro_defined?): append newline to src unless ended
	  with it.

	* lib/mkmf.rb (have_library): treat nil function name as "main".
	  (ruby-bugs:PR#1083)

	* lib/mkmf.rb (pkg_config): should append additional libraries to
	  $libs but not $LIBS.  [ruby-dev:21137]

	* ext/io/wait/extconf.rb: check DOSISH macro instead of platform.

	* ext/digest/sha1/extconf.rb: have_library already appends library
	  name.

Wed Aug  6 17:23:57 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c: initialize /* OK */ variables by Qnil to stop warnings.

Wed Aug  6 04:58:32 2003  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/Setup*: add io/wait and openssl.

Wed Aug  6 01:13:38 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* eval.c (rb_f_autoload): use ruby_cbase instead of ruby_class.

	* eval.c (rb_f_autoload_p): ditto.

	* class.c (rb_mod_init_copy): no longer implements independent
	  clone and dup methods.  override "initialize_copy" instead.
	  [ruby-core:01352]

	* object.c (rb_class_s_alloc): define Class allocation function.
	  this makes Classes to follow clone framework that uses
	  initialize_copy.

	* object.c (rb_class_initialize): separate instantiation and
	  initialization.

	* object.c (rb_obj_alloc): prohibit instantiation from
	  uninitialized class.

	* object.c (rb_class_superclass): check uninitialized class.

	* array.c (rb_ary_fill): wrong index processing with block.  this
	  fix was done by Koji Arai <JCA02266@nifty.ne.jp> [ruby-list:38029]

	* marshal.c (w_object): should preserve generic ivar for nil,
	  true, false, symbols, and fixnums.

	* marshal.c (w_uclass): base_klass check should be done after
	  rb_class_real().

Wed Aug  6 01:18:50 2003  Minero Aoki  <aamine@loveruby.net>

	* lib/net/http.rb: update document.

	* lib/net/pop.rb: ditto.

	* lib/net/protocol.rb: ditto.

Wed Aug  6 00:48:37 2003  Koji Arai  <jca02266@nifty.ne.jp>

	* marshal.c (w_object): should recommend marshal_dump rather than
	  _dump_data.

Tue Aug  5 17:58:57 2003  WATANABE Hirofumi  <eban@ruby-lang.org>

	* lib/fileutils.rb (install): should preserve timestamp only.

Tue Aug  5 17:31:59 2003  Ian Macdonald  <ian@caliban.org>

	* lib/shell/command-processor.rb (Shell::CommandProcessor::rmdir):
	  simple typo.

Tue Aug  5 15:47:34 2003  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_load): should preserve current source file/line.

Tue Aug  5 10:04:42 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* string.c (str_new4): ptr may refer null_str.

Mon Aug  4 17:25:18 2003  Yukihiro Matsumoto  <matz@ruby-lang.org>

	* stable version 1.8.0 released.

For the changes before 1.8.0, see doc/ChangeLog-1.8.0

Local variables:
add-log-time-format: (lambda ()
  (let* ((time (current-time))
	 (system-time-locale "C")
	 (diff (+ (cadr time) 32400))
	 (lo (% diff 65536))
	 (hi (+ (car time) (/ diff 65536))))
  (format-time-string "%a %b %e %H:%M:%S %Y" (list hi lo) t)))
indent-tabs-mode: t
tab-width: 8
end:
PK,|[�R�2�6�6doc/alt-ruby18/NEWSnu�[���= NEWS

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.

* REXML

  * REXML::Document.entity_expansion_limit=

    New method to set the entity expansion limit. By default the limit is
    set to 10000.  See the following URL for details.

    http://www.ruby-lang.org/en/news/2008/08/23/dos-vulnerability-in-rexml/

== Changes since the 1.8.6 release

=== Configuration changes

* vendor_ruby directory

  A new library directory named `vendor_ruby' is introduced in
  addition to `site_ruby'.  The idea is to separate libraries
  installed by the package system (`vendor') from manually (`site')
  installed libraries preventing the former from getting overwritten
  by the latter, while preserving the user option to override vendor
  libraries with site libraries. (`site_ruby' takes precedence over
  `vendor_ruby')

  If you are a package maintainer, make each library package configure
  the library passing the `--vendor' option to `extconf.rb' so that
  the library files will get installed under `vendor_ruby'.

  You can change the directory locations using configure options such
  as `--with-sitedir=DIR' and `--with-vendordir=DIR'.

=== Global constants

* new constants

  * RUBY_COPYRIGHT
  * RUBY_DESCRIPTION

=== Library updates (outstanding ones only)

* new library

  * securerandom

* builtin classes

  * Array#flatten
  * Array#flatten!

    Takes an optional argument that determines the level of recursion
    to flatten.

  * Array#eql?
  * Array#hash
  * Array#==
  * Array#<=>

    Handle recursive data properly.

  * Array#index
  * Array#rindex

    Take a block instead of an argument.

  * Array#collect!
  * Array#map!
  * Array#each
  * Array#each_index
  * Array#reverse_each
  * Array#reject
  * Array#reject!
  * Array#delete_if
  * Array#select

    Return an enumerator if no block is given.

    Note that #map and #collect still return an array unlike Ruby 1.9
    to keep compatibility.

  * Array#pop
  * Array#shift

    Take an optional argument specifying the number of elements to
    remove.

  * Array#choice
  * Array#combination
  * Array#cycle
  * Array#drop
  * Array#drop_while
  * Array#permutation
  * Array#product
  * Array#shuffle
  * Array#shuffle!
  * Array#take,
  * Array#take_while

    New methods.

  * Binding#eval

    New method.

  * Dir#each
  * Dir#foreach

    Return an enumerator if no block is given.

  * Enumerable::Enumerator

    New class for various enumeration defined by the enumerator library.

  * Enumerable#each_slice
  * Enumerable#each_cons
  * Object#to_enum
  * Object#enum_for

    New methods for various enumeration defined by the enumerator library.

  * Enumerable#count
  * Enumerable#cycle
  * Enumerable#drop
  * Enumerable#drop_while
  * Enumerable#find_index
  * Enumerable#first
  * Enumerable#group_by
  * Enumerable#max_by
  * Enumerable#min_by
  * Enumerable#minmax
  * Enumerable#minmax_by
  * Enumerable#none?
  * Enumerable#one?
  * Enumerable#take
  * Enumerable#take_while

    New methods.

  * Enumerable#find
  * Enumerable#find_all
  * Enumerable#partition
  * Enumerable#reject
  * Enumerable#select
  * Enumerable#sort_by

    Return an enumerator if no block is given.

    Note that #map and #collect still return an array unlike Ruby 1.9
    to keep compatibility.

  * Enumerable#inject

    Accepts a binary operator instead of a block.

  * Enumerable#reduce

    New alias to #inject.

  * Enumerable#to_a

    Can take optional arguments and pass them to #each.

  * Hash#eql?
  * Hash#hash
  * Hash#==

    Handle recursive data properly.

  * Hash#delete_if
  * Hash#each
  * Hash#each_key
  * Hash#each_pair
  * Hash#each_value
  * Hash#reject!
  * Hash#select
  * ENV.delete_if
  * ENV.each
  * ENV.each_key
  * ENV.each_pair
  * ENV.each_value
  * ENV.reject!
  * ENV.select

    Return an enumerator if no block is given.

  * GC.stress
  * GC.stress=

    New methods.

  * Integer#ord
  * Integer#odd?
  * Integer#even?
  * Integer#pred

    New methods.

  * Integer#downto
  * Integer#times
  * Integer#upto

    Return an enumerator if no block is given.

  * IO#each
  * IO#each_line
  * IO#each_byte
  * IO.foreach
  * ARGF.each
  * ARGF.each_line
  * ARGF.each_byte

    Return an enumerator if no block is given.

  * IO#bytes
  * IO#chars
  * IO#each_char
  * IO#getbyte
  * IO#lines
  * IO#readbyte
  * ARGF.bytes
  * ARGF.chars
  * ARGF.each_char
  * ARGF.getbyte
  * ARGF.lines
  * ARGF.readbyte

    New methods. 

  * Method#name
  * Method#owner
  * Method#receiver
  * UnboundMethod#name
  * UnboundMethod#owner

    New methods.

  * Module#class_exec
  * Module#module_exec

    New methods.

  * Numeric#step

    Return an enumerator if no block is given.

  * Object#instance_exec
  * Object#tap

    New methods.

  * ObjectSpace.each_object

    Return an enumerator if no block is given.

  * Process.exec implemented.

  * Range#each
  * Range#step

    Return an enumerator if no block is given.

  * Regexp.union accepts an array of patterns.

  * String#bytes

    New method

  * String#bytesize

    New method, returning the size in bytes. (alias length and size)

  * String#chars
  * String#each_char
  * String#lines
  * String#partition
  * String#rpartition
  * String#start_with?
  * String#end_with?

    New methods.  These are $KCODE aware unlike #index, #rindex and
    #include?.

  * String#each_byte
  * String#each
  * String#each_line
  * String#gsub(pattern)

    Return an enumerator if no block is given.

  * String#upto

    An optional second argument is added to specify if the last value
    should be included.

  * StopIteration

    New exception class that causes Kernel#loop to stop iteration when
    raised.

  * Struct#each
  * Struct#each_pair

    Return an enumerator if no block is given.

  * Symbol#to_proc

    New method.

  * __method__

    New global function that returns the name of the current method as
    a Symbol.

* enumerator

  * Enumerator is now a built-in module.  The #next and #rewind
    methods are implemented using the "generator" library.  Use with
    care and be aware of the performance loss.

* ipaddr

  * New methods
    * IPAddr#<=>
    * IPAddr#succ

      IPAddr objects are now comparable and enumerable having these
      methods.  This also means that it is possible to have a Range
      object between two IPAddr objects.

    * IPAddr#to_range

      A new method to create a Range object for the (network) address.

  * Type coercion support
    * IPAddr#&
    * IPAddr#|
    * IPAddr#==
    * IPAddr#include?

      These methods now accept a string or an integer instead of an
      IPAddr object as the argument.

* net/smtp

  * Support SSL/TLS.

* openssl

  * New classes
    * OpenSSL::PKey::EC
    * OpenSSL::PKey::EC::Group
    * OpenSSL::PKey::EC::Point
    * OpenSSL::PKey::PKCS5
    * OpenSSL::SSL::Session

  * Documentation!

  * Various new methods (see documentation).

  * Remove redundant module namespace in Cipher, Digest, PKCS7, PKCS12.
    Compatibility classes are provided which will be removed in Ruby 1.9.

* shellwords

  * Add methods for escaping shell-unsafe characters:
    * Shellwords.join
    * Shellwords.escape
    * Array#shelljoin
    * String#shellescape

  * Add shorthand methods:
    * Shellwords.split (alias shellwords)
    * String#shellsplit

* stringio

  * StringIO#getbyte
  * StringIO#readbyte

    New methods. (aliases for compatibility with 1.9)

  * StringIO#each_char
  * StringIO#chars

    New methods.

  * StringIO#each
  * StringIO#each_line
  * StringIO#each_byte

    Return an enumerator if no block is given.

* tempfile

  * Tempfile.open and Tempfile.new now accept a suffix for the
    temporary file to be created.  To specify a suffix, pass an array
    of [basename, suffix] as the first argument.

      Tempfile.open(['image', 'jpg']) { |tempfile| ... }

* tmpdir

  * New method:

    * Dir.mktmpdir

* uri

  * added LDAPS scheme.
  * Change for RFC3986:
    * FTP
      * URI('ftp://example.com/foo').path #=> 'foo'
      * URI('ftp://example.com/%2Ffoo').path #=> '/foo'
      * URI::FTP.build([nil, 'example.com', nil, '/foo', 'i').to_s #=> 'ftp://example.com/%2Ffoo;type=i'
    * URI merge
      * URI('http://a/b/c/d;p?q').merge('?y') == URI('http://a/b/c/d;p?y')
      * URI('http://a/b/c/d;p?q').merge('/./g') == URI('http://a/g')
      * URI('http://a/b/c/d;p?q').merge('/../g') == URI('http://a/g')
      * URI('http://a/b/c/d;p?q').merge('../../../g') == URI('http://a/g')
      * URI('http://a/b/c/d;p?q').merge('../../../../g') == URI('http://a/g')

* rss

  * 0.1.6 -> 0.2.4

  * Fix image module URI

  * Atom support

  * ITunes module support

  * Slash module support

  * content:encoded with RSS 2.0 support

=== Interpreter Implementation

* passing a block to a Proc [experimental]

  This implementation in current shape is known to be buggy/broken,
  especially with nested block invocation.  Take this as an
  experimental feature.

* stack trace

  On non-SystemStackError exception, full stack trace is shown.

=== Compatibility issues (excluding feature bug fixes)

* String#slice! had some unintentional bugs and they have been fixed
  because either they disagreed with documentation or their respective
  behavior of #slice.  Unfortunately, this causes some
  incompatibilities in the following (somewhat rare) cases.

  * #slice! no longer expands the array when an out-of-boundary value
    is given.

      # Ruby 1.8.6
      a = [1,2]
      a.slice!(4,0)   #=> nil
      a               #=> [1,2,nil,nil]

      # Ruby 1.8.7
      a = [1,2]
      a.slice!(4,0)   #=> nil
      a               #=> [1,2]

  * #slice! no longer raises an exception but returns nil when a
    negative length or out-of-boundary negative position is given.

      # Ruby 1.8.6
      a = [1,2]
      a.slice!(1,-1)  #=> (raises IndexError)
      a.slice!(-5,1)  #=> (raises IndexError)

      # Ruby 1.8.7
      a = [1,2]
      a.slice!(1,-1)  #=> nil
      a.slice!(-5,1)  #=> nil

* String#to_i, String#hex and String#oct no longer accept a sequence
  of underscores (`__') as part of a number.

    # Ruby 1.8.6
    '1__0'.to_i     #=> 10
    '1__0'.to_i(2)  #=> 2  # 0b10
    '1__0'.oct      #=> 8  # 010
    '1__0'.hex      #=> 16 # 0x10

    # Ruby 1.8.7
    '1__0'.to_i     #=> 1
    '1__0'.to_i(2)  #=> 1
    '1__0'.oct      #=> 1
    '1__0'.hex      #=> 1

  The old behavior was inconsistent with Ruby syntax and considered as
  a bug.

* date

  * Date.parse

    '##.##.##' (where each '#' is a digit) is now taken as 'YY.MM.DD'
    instead of 'MM.DD.YY'.  While the change may confuse you, you can
    always use Date.strptime() when you know what you are dealing
    with.

* stringio

  * StringIO#each_byte

    The return value changed from nil to self.  This is what the
    document says and the same as each_line() does.

* tempfile

  * The file name format has changed.  No dots are included by default
    in temporary file names any more.  See above for how to specify a
    suffix.

* uri

  * See above for details.

== Changes since the 1.8.5 release

=== New platforms/build tools support

* IA64 HP-UX

* Visual C++ 8 SP1

* autoconf 2.6x

=== Global constants

* RUBY_PATCHLEVEL

  New constant since 1.8.5-p1.

=== Library updates (outstanding ones only)

* builtin classes

  * New method: Kernel#instance_variable_defined?

  * New method: Module#class_variable_defined?

  * New feature: Dir::glob() can now take an array of glob patterns.

* date

  * Updated based on date2 4.0.3.

* digest

  * New internal APIs for C and Ruby.

  * Support for autoloading.

      require 'digest'

      # autoloads digest/md5
      md = Digest::MD5.digest("string")

  * New digest class methods: file

  * New digest instance methods: clone, reset, new, inspect,
    digest_length (alias size or length), block_length()

  * New library: digest/bubblebabble

  * New function: Digest(name)

* fileutils

  * New option for FileUtils.cp_r(): :remove_destination

* nkf

  * Updated based on nkf as of 2007-01-28.

* thread

  * Replaced with much faster mutex implementation in C.  The former
    implementation, which is slow but considered to be stable, is
    available with a configure option `--disable-fastthread'.

* tk

  * Updated Tile extension support based on Tile 0.7.8.

  * Support --without-X11 configure option for non-X11 versions of
    Tcl/Tk (e.g. Tcl/Tk Aqua).

  * New sample script: irbtkw.rbw -- IRB on Ruby/Tk. It has no trouble
    about STDIN blocking on Windows.

* webrick

  * New method: WEBrick::Cookie.parse_set_cookies()

=== Compatibility issues (excluding feature bug fixes)

* builtin classes

  * String#intern now raises SecurityError when $SAFE level is greater
    than zero.

* date

  * Time#to_date and Time#to_datetime are added as private methods.
    They cause name conflict error in ActiveSupport 1.4.1 and prior,
    which comes with Rails 1.2.2 and prior.  Updating ActiveSupport
    and/or Rails to the latest versions fixes the problem.

* digest

  * The constructor does no longer take an initial string to feed.
    The following examples show how to migrate:

      # Before
      md = Digest::MD5.new("string")
      # After (works with any version)
      md = Digest::MD5.new.update("string")
        
      # Before
      hd = Digest::MD5.new("string").hexdigest
      # After (works with any version)
      hd = Digest::MD5.hexdigest("string")

* fileutils

  * A minor implementation change breaks Rake <=0.7.1.
    Updating Rake to 0.7.2 or higher fixes the problem.

* tk

  * Tk::X_Scrollable (Y_Scrollable) is renamed to Tk::XScrollable
    (YScrollable). Tk::X_Scrollable (Y_Scrollable) is still available,
    but it is an alias name.
PK,|[R�Z$--doc/alt-ruby18/COPYING.janu�[���$BK\%W%m%0%i%`$O%U%j!<%=%U%H%&%'%"$G$9!%(BGPL(the GNU General
Public License)$B$^$?$O0J2<$K<($9>r7o$GK\%W%m%0%i%`$r:FG[I[$G(B
$B$-$^$9!%(BGPL$B$K$D$$$F$O(BGPL$B%U%!%$%k$r;2>H$7$F2<$5$$!%(B

  1. $BJ#@=$O@)8B$J$/<+M3$G$9!%(B

  2. $B0J2<$N>r7o$N$$$:$l$+$rK~$?$9;~$KK\%W%m%0%i%`$N%=!<%9$r(B
     $B<+M3$KJQ99$G$-$^$9!%(B

     (a) $B%M%C%H%K%e!<%:$K%]%9%H$7$?$j!$:n<T$KJQ99$rAwIU$9$k(B
         $B$J$I$NJ}K!$G!$JQ99$r8x3+$9$k!%(B

     (b) $BJQ99$7$?K\%W%m%0%i%`$r<+J,$N=jB0$9$kAH?%FbIt$@$1$G(B
         $B;H$&!%(B

     (c) $BJQ99E@$rL@<($7$?$&$(!$%=%U%H%&%'%"$NL>A0$rJQ99$9$k!%(B
         $B$=$N%=%U%H%&%'%"$rG[I[$9$k;~$K$OJQ99A0$NK\%W%m%0%i(B
         $B%`$bF1;~$KG[I[$9$k!%$^$?$OJQ99A0$NK\%W%m%0%i%`$N%=!<(B
         $B%9$NF~<jK!$rL@<($9$k!%(B

     (d) $B$=$NB>$NJQ99>r7o$r:n<T$H9g0U$9$k!%(B

  3. $B0J2<$N>r7o$N$$$:$l$+$rK~$?$9;~$KK\%W%m%0%i%`$r%3%s%Q%$(B
     $B%k$7$?%*%V%8%'%/%H%3!<%I$d<B9T7A<0$G$bG[I[$G$-$^$9!%(B

     (a) $B%P%$%J%j$r<u$1<h$C$??M$,%=!<%9$rF~<j$G$-$k$h$&$K!$(B
         $B%=!<%9$NF~<jK!$rL@<($9$k!%(B

     (b) $B5!3#2DFI$J%=!<%9%3!<%I$rE:IU$9$k!%(B

     (c) $BJQ99$r9T$C$?%P%$%J%j$OL>A0$rJQ99$7$?$&$(!$%*%j%8%J(B
         $B%k$N%=!<%9%3!<%I$NF~<jK!$rL@<($9$k!%(B

     (d) $B$=$NB>$NG[I[>r7o$r:n<T$H9g0U$9$k!%(B

  4. $BB>$N%W%m%0%i%`$X$N0zMQ$O$$$+$J$kL\E*$G$"$l<+M3$G$9!%$?(B
     $B$@$7!$K\%W%m%0%i%`$K4^$^$l$kB>$N:n<T$K$h$k%3!<%I$O!$$=(B
     $B$l$>$l$N:n<T$N0U8~$K$h$k@)8B$,2C$($i$l$k>l9g$,$"$j$^$9!%(B

     $B$=$l$i%U%!%$%k$N0lMw$H$=$l$>$l$NG[I[>r7o$J$I$KIU$$$F$O(B
     LEGAL$B%U%!%$%k$r;2>H$7$F$/$@$5$$!%(B

  5. $BK\%W%m%0%i%`$X$NF~NO$H$J$k%9%/%j%W%H$*$h$S!$K\%W%m%0%i(B
     $B%`$+$i$N=PNO$N8"Mx$OK\%W%m%0%i%`$N:n<T$G$O$J$/!$$=$l$>(B
     $B$l$NF~=PNO$r@8@.$7$??M$KB0$7$^$9!%$^$?!$K\%W%m%0%i%`$K(B
     $BAH$_9~$^$l$k$?$a$N3HD%%i%$%V%i%j$K$D$$$F$bF1MM$G$9!%(B

  6. $BK\%W%m%0%i%`$OL5J]>Z$G$9!%:n<T$OK\%W%m%0%i%`$r%5%]!<%H(B
     $B$9$k0U;V$O$"$j$^$9$,!$%W%m%0%i%`<+?H$N%P%0$"$k$$$OK\%W(B
     $B%m%0%i%`$N<B9T$J$I$+$iH/@8$9$k$$$+$J$kB;32$KBP$7$F$b@U(B
     $BG$$r;}$A$^$;$s!%(B
PK-|[�W�4~4~doc/alt-ruby18/README.EXTnu�[���.\" README.EXT -  -*- Text -*- created at: Mon Aug  7 16:45:54 JST 1995

This document explains how to make extension libraries for Ruby.

1. Basic knowledge

In C, variables have types and data do not have types.  In contrast,
Ruby variables do not have a static type, and data themselves have
types, so data will need to be converted between the languages.

Data in Ruby are represented by the C type `VALUE'.  Each VALUE data
has its data-type.

To retrieve C data from a VALUE, you need to:

 (1) Identify the VALUE's data type
 (2) Convert the VALUE into C data

Converting to the wrong data type may cause serious problems.


1.1 Data-types

The Ruby interpreter has the following data types:

	T_NIL		nil
	T_OBJECT	ordinary object
	T_CLASS		class
	T_MODULE	module
	T_FLOAT		floating point number
	T_STRING	string
	T_REGEXP	regular expression
	T_ARRAY		array
	T_FIXNUM	Fixnum(31bit integer)
	T_HASH		associative array
	T_STRUCT	(Ruby) structure
	T_BIGNUM	multi precision integer
	T_FILE		IO
	T_TRUE		true
	T_FALSE		false
	T_DATA		data
	T_SYMBOL        symbol

In addition, there are several other types used internally:

	T_ICLASS
	T_MATCH
	T_UNDEF
	T_VARMAP
	T_SCOPE
	T_NODE

Most of the types are represented by C structures.

1.2 Check Data Type of the VALUE

The macro TYPE() defined in ruby.h shows the data type of the VALUE.
TYPE() returns the constant number T_XXXX described above.  To handle
data types, your code will look something like this:

  switch (TYPE(obj)) {
    case T_FIXNUM:
      /* process Fixnum */
      break;
    case T_STRING:
      /* process String */
      break;
    case T_ARRAY:
      /* process Array */
      break;
    default:
      /* raise exception */
      rb_raise(rb_eTypeError, "not valid value");
      break;
  }

There is the data-type check function

  void Check_Type(VALUE value, int type)

which raises an exception if the VALUE does not have the type specified.

There are also faster check macros for fixnums and nil.

  FIXNUM_P(obj)
  NIL_P(obj)

1.3 Convert VALUE into C data

The data for type T_NIL, T_FALSE, T_TRUE are nil, true, false
respectively.  They are singletons for the data type.

The T_FIXNUM data is a 31bit length fixed integer (63bit length on
some machines), which can be converted to a C integer by using the
FIX2INT() macro.  There is also NUM2INT() which converts any Ruby
numbers into C integers.  The NUM2INT() macro includes a type check, so
an exception will be raised if the conversion failed.  NUM2DBL() can
be used to retrieve the double float value in the same way.

In version 1.7 or later it is recommended that you use the new macros
StringValue() and StringValuePtr() to get a char* from a VALUE.
StringValue(var) replaces var's value with the result of "var.to_str()".
StringValuePtr(var) does same replacement and returns char*
representation of var.  These macros will skip the replacement if var is
a String.  Notice that the macros take only the lvalue as their
argument, to change the value of var in place.

In version 1.6 or earlier, STR2CSTR() was used to do the same thing
but now it is deprecated in version 1.7, because STR2CSTR() has a risk
of a dangling pointer problem in the to_str() impliclit conversion.

Other data types have corresponding C structures, e.g. struct RArray
for T_ARRAY etc. The VALUE of the type which has the corresponding structure
can be cast to retrieve the pointer to the struct.  The casting macro
will be of the form RXXXX for each data type; for instance, RARRAY(obj). 
See "ruby.h".

For example, `RSTRING(str)->len' is the way to get the size of the
Ruby String object.  The allocated region can be accessed by
`RSTRING(str)->ptr'.  For arrays, use `RARRAY(ary)->len' and
`RARRAY(ary)->ptr' respectively.

Notice: Do not change the value of the structure directly, unless you
are responsible for the result.  This ends up being the cause of interesting
bugs.

1.4 Convert C data into VALUE

To convert C data to Ruby values:

  * FIXNUM

    left shift 1 bit, and turn on LSB.

  * Other pointer values

    cast to VALUE.

You can determine whether a VALUE is pointer or not by checking its LSB.  

Notice Ruby does not allow arbitrary pointer values to be a VALUE.  They
should be pointers to the structures which Ruby knows about.  The known
structures are defined in <ruby.h>.

To convert C numbers to Ruby values, use these macros.

  INT2FIX()	for integers within 31bits.
  INT2NUM()	for arbitrary sized integer.

INT2NUM() converts an integer into a Bignum if it is out of the FIXNUM
range, but is a bit slower.

1.5 Manipulating Ruby data

As I already mentioned, it is not recommended to modify an object's internal
structure.  To manipulate objects, use the functions supplied by the Ruby
interpreter. Some (not all) of the useful functions are listed below:

 String functions

  rb_str_new(const char *ptr, long len)

    Creates a new Ruby string.

  rb_str_new2(const char *ptr)

    Creates a new Ruby string from a C string.  This is equivalent to
    rb_str_new(ptr, strlen(ptr)).

  rb_tainted_str_new(const char *ptr, long len)

    Creates a new tainted Ruby string.  Strings from external data
    sources should be tainted.

  rb_tainted_str_new2(const char *ptr)

    Creates a new tainted Ruby string from a C string.

  rb_str_cat(VALUE str, const char *ptr, long len)

    Appends len bytes of data from ptr to the Ruby string.

 Array functions

  rb_ary_new()

    Creates an array with no elements.

  rb_ary_new2(long len)

    Creates an array with no elements, allocating internal buffer
    for len elements.

  rb_ary_new3(long n, ...)

    Creates an n-element array from the arguments.

  rb_ary_new4(long n, VALUE *elts)

    Creates an n-element array from a C array.

  rb_ary_push(VALUE ary, VALUE val)
  rb_ary_pop(VALUE ary)
  rb_ary_shift(VALUE ary)
  rb_ary_unshift(VALUE ary, VALUE val)

    Array operations.  The first argument to each functions must be an 
    array.  They may dump core if other types are given.

2. Extending Ruby with C

2.1 Addding new features to Ruby

You can add new features (classes, methods, etc.) to the Ruby
interpreter.  Ruby provides APIs for defining the following things:

 * Classes, Modules
 * Methods, Singleton Methods
 * Constants

2.1.1 Class/module definition

To define a class or module, use the functions below:

  VALUE rb_define_class(const char *name, VALUE super)
  VALUE rb_define_module(const char *name)

These functions return the newly created class or module.  You may
want to save this reference into a variable to use later.

To define nested classes or modules, use the functions below:

  VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
  VALUE rb_define_module_under(VALUE outer, const char *name)

2.1.2 Method/singleton method definition

To define methods or singleton methods, use these functions:

  void rb_define_method(VALUE klass, const char *name, 
		        VALUE (*func)(), int argc)

  void rb_define_singleton_method(VALUE object, const char *name, 
			          VALUE (*func)(), int argc)

The `argc' represents the number of the arguments to the C function,
which must be less than 17.  But I doubt you'll need that many.

If `argc' is negative, it specifies the calling sequence, not number of
the arguments.  

If argc is -1, the function will be called as:

  VALUE func(int argc, VALUE *argv, VALUE obj)

where argc is the actual number of arguments, argv is the C array of
the arguments, and obj is the receiver.

If argc is -2, the arguments are passed in a Ruby array. The function
will be called like:

  VALUE func(VALUE obj, VALUE args)

where obj is the receiver, and args is the Ruby array containing
actual arguments.

There are two more functions to define methods.  One is to define
private methods:

  void rb_define_private_method(VALUE klass, const char *name, 
			        VALUE (*func)(), int argc)

The other is to define module functions, which are private AND singleton
methods of the module.  For example, sqrt is the module function
defined in Math module.  It can be called in the following way:

  Math.sqrt(4)

or

  include Math
  sqrt(4)

To define module functions, use:

  void rb_define_module_function(VALUE module, const char *name, 
				 VALUE (*func)(), int argc)

Oh, in addition, function-like methods, which are private methods defined
in the Kernel module, can be defined using:

  void rb_define_global_function(const char *name, VALUE (*func)(), int argc)

To define an alias for the method,

  void rb_define_alias(VALUE module, const char* new, const char* old);

To define and undefine the `allocate' class method,

  void rb_define_alloc_func(VALUE klass, VALUE (*func)(VALUE klass));
  void rb_undef_alloc_func(VALUE klass);

func have to take the klass as the argument and return a newly
allocated instance.  This instance should be empty as possible,
without any expensive (including external) resources.

2.1.3 Constant definition

We have 2 functions to define constants:

  void rb_define_const(VALUE klass, const char *name, VALUE val)
  void rb_define_global_const(const char *name, VALUE val)

The former is to define a constant under specified class/module.  The
latter is to define a global constant.

2.2 Use Ruby features from C

There are several ways to invoke Ruby's features from C code.

2.2.1 Evaluate Ruby Programs in a String

The easiest way to use Ruby's functionality from a C program is to
evaluate the string as Ruby program.  This function will do the job:

  VALUE rb_eval_string(const char *str)

Evaluation is done under the current context, thus current local variables
of the innermost method (which is defined by Ruby) can be accessed.

2.2.2 ID or Symbol

You can invoke methods directly, without parsing the string.  First I need
to explain about ID.  ID is the integer number to represent Ruby's
identifiers such as variable names.  The Ruby data type corresponding to ID
is Symbol.  It can be accessed from Ruby in the form:

 :Identifier

You can get the ID value from a string within C code by using

  rb_intern(const char *name)

You can retrieve ID from Ruby object (Symbol or String) given as an
argument by using

  rb_to_id(VALUE symbol)

You can convert C ID to Ruby Symbol by using

  VALUE ID2SYM(ID id)

and to convert Ruby Symbol object to ID, use

  ID SYM2ID(VALUE symbol)

2.2.3 Invoke Ruby method from C

To invoke methods directly, you can use the function below

  VALUE rb_funcall(VALUE recv, ID mid, int argc, ...)

This function invokes a method on the recv, with the method name
specified by the symbol mid.

2.2.4 Accessing the variables and constants

You can access class variables and instance variables using access
functions.  Also, global variables can be shared between both environments.
There's no way to access Ruby's local variables.

The functions to access/modify instance variables are below:

  VALUE rb_ivar_get(VALUE obj, ID id)
  VALUE rb_ivar_set(VALUE obj, ID id, VALUE val)

id must be the symbol, which can be retrieved by rb_intern().

To access the constants of the class/module:

  VALUE rb_const_get(VALUE obj, ID id)

See 2.1.3 for defining new constant.

3. Information sharing between Ruby and C

3.1 Ruby constants that C can be accessed from C

The following Ruby constants can be referred from C.

  Qtrue
  Qfalse

Boolean values.  Qfalse is false in C also (i.e. 0).

  Qnil

Ruby nil in C scope.

3.2 Global variables shared between C and Ruby

Information can be shared between the two environments using shared global
variables.  To define them, you can use functions listed below:

  void rb_define_variable(const char *name, VALUE *var)

This function defines the variable which is shared by both environments.
The value of the global variable pointed to by `var' can be accessed
through Ruby's global variable named `name'.

You can define read-only (from Ruby, of course) variables using the
function below.

  void rb_define_readonly_variable(const char *name, VALUE *var)

You can defined hooked variables.  The accessor functions (getter and
setter) are called on access to the hooked variables.

  void rb_define_hooked_variable(constchar *name, VALUE *var,
				 VALUE (*getter)(), void (*setter)())

If you need to supply either setter or getter, just supply 0 for the
hook you don't need.  If both hooks are 0, rb_define_hooked_variable()
works just like rb_define_variable().

  void rb_define_virtual_variable(const char *name,
				  VALUE (*getter)(), void (*setter)())

This function defines a Ruby global variable without a corresponding C
variable.  The value of the variable will be set/get only by hooks.

The prototypes of the getter and setter functions are as follows:

  (*getter)(ID id, void *data, struct global_entry* entry);
  (*setter)(VALUE val, ID id, void *data, struct global_entry* entry);

3.3 Encapsulate C data into a Ruby object

To wrap and objectify a C pointer as a Ruby object (so called
DATA), use Data_Wrap_Struct().

  Data_Wrap_Struct(klass, mark, free, ptr)

Data_Wrap_Struct() returns a created DATA object.  The klass argument
is the class for the DATA object.  The mark argument is the function
to mark Ruby objects pointed by this data.  The free argument is the
function to free the pointer allocation.  If this is -1, the pointer
will be just freed.  The functions mark and free will be called from
garbage collector.

You can allocate and wrap the structure in one step.

  Data_Make_Struct(klass, type, mark, free, sval)

This macro returns an allocated Data object, wrapping the pointer to
the structure, which is also allocated.  This macro works like:

  (sval = ALLOC(type), Data_Wrap_Struct(klass, mark, free, sval))

Arguments klass, mark, and free work like their counterparts in
Data_Wrap_Struct().  A pointer to the allocated structure will be
assigned to sval, which should be a pointer of the type specified.

To retrieve the C pointer from the Data object, use the macro
Data_Get_Struct().

  Data_Get_Struct(obj, type, sval)

A pointer to the structure will be assigned to the variable sval.

See the example below for details. 

4. Example - Creating dbm extension

OK, here's the example of making an extension library.  This is the
extension to access DBMs.  The full source is included in the ext/
directory in the Ruby's source tree.

(1) make the directory

  % mkdir ext/dbm

Make a directory for the extension library under ext directory.

(2) design the library

You need to design the library features, before making it.

(3) write C code.

You need to write C code for your extension library.  If your library
has only one source file, choosing ``LIBRARY.c'' as a file name is
preferred.  On the other hand, in case your library has multiple source
files, avoid choosing ``LIBRARY.c'' for a file name.  It may conflict
with an intermediate file ``LIBRARY.o'' on some platforms.

Ruby will execute the initializing function named ``Init_LIBRARY'' in
the library.  For example, ``Init_dbm()'' will be executed when loading
the library.

Here's the example of an initializing function.

--
Init_dbm()
{
    /* define DBM class */
    cDBM = rb_define_class("DBM", rb_cObject);
    /* DBM includes Enumerate module */
    rb_include_module(cDBM, rb_mEnumerable);

    /* DBM has class method open(): arguments are received as C array */
    rb_define_singleton_method(cDBM, "open", fdbm_s_open, -1);

    /* DBM instance method close(): no args */
    rb_define_method(cDBM, "close", fdbm_close, 0);
    /* DBM instance method []: 1 argument */
    rb_define_method(cDBM, "[]", fdbm_fetch, 1);
		:

    /* ID for a instance variable to store DBM data */
    id_dbm = rb_intern("dbm");
}
--

The dbm extension wraps the dbm struct in the C environment using 
Data_Make_Struct.

--
struct dbmdata {
    int  di_size;
    DBM *di_dbm;
};


obj = Data_Make_Struct(klass, struct dbmdata, 0, free_dbm, dbmp);
--

This code wraps the dbmdata structure into a Ruby object.  We avoid wrapping
DBM* directly, because we want to cache size information.

To retrieve the dbmdata structure from a Ruby object, we define the
following macro:

--
#define GetDBM(obj, dbmp) {\
    Data_Get_Struct(obj, struct dbmdata, dbmp);\
    if (dbmp->di_dbm == 0) closed_dbm();\
}
--

This sort of complicated macro does the retrieving and close checking for
the DBM.

There are three kinds of way to receive method arguments.  First,
methods with a fixed number of arguments receive arguments like this:

--
static VALUE
fdbm_delete(obj, keystr)
    VALUE obj, keystr;
{
	:
}
--

The first argument of the C function is the self, the rest are the
arguments to the method.

Second, methods with an arbitrary number of arguments receive
arguments like this:

--
static VALUE
fdbm_s_open(argc, argv, klass)
    int argc;
    VALUE *argv;
    VALUE klass;
{
	:
    if (rb_scan_args(argc, argv, "11", &file, &vmode) == 1) {
	mode = 0666;		/* default value */
    }
	:
}
--

The first argument is the number of method arguments, the second
argument is the C array of the method arguments, and the third
argument is the receiver of the method.

You can use the function rb_scan_args() to check and retrieve the
arguments.  For example, "11" means that the method requires at least one
argument, and at most receives two arguments.

Methods with an arbitrary number of arguments can receive arguments
by Ruby's array, like this:

--
static VALUE
fdbm_indexes(obj, args)
    VALUE obj, args;
{
	:
}
--

The first argument is the receiver, the second one is the Ruby array
which contains the arguments to the method.

** Notice

GC should know about global variables which refer to Ruby's objects, but
are not exported to the Ruby world.  You need to protect them by

  void rb_global_variable(VALUE *var)

(4) prepare extconf.rb

If the file named extconf.rb exists, it will be executed to generate
Makefile.

extconf.rb is the file for checking compilation conditions etc.  You
need to put

  require 'mkmf'

at the top of the file.  You can use the functions below to check
various conditions.

  have_library(lib, func): check whether library containing function exists.
  have_func(func, header): check whether function exists
  have_header(header): check whether header file exists
  create_makefile(target): generate Makefile

The value of the variables below will affect the Makefile.

  $CFLAGS: included in CFLAGS make variable (such as -O)
  $CPPFLAGS: included in CPPFLAGS make variable (such as -I, -D)
  $LDFLAGS: included in LDFLAGS make variable (such as -L)
  $objs: list of object file names

Normally, the object files list is automatically generated by searching
source files, but you must define them explicitly if any sources will
be generated while building.

If a compilation condition is not fulfilled, you should not call
``create_makefile''.  The Makefile will not be generated, compilation will
not be done.

(5) prepare depend (optional)

If the file named depend exists, Makefile will include that file to
check dependencies.  You can make this file by invoking

  % gcc -MM *.c > depend

It's harmless.  Prepare it.

(6) generate Makefile

Try generating the Makefile by:

  ruby extconf.rb

If the library should be installed under vendor_ruby directory
instead of site_ruby directory, use --vendor option as follows.

  ruby extconf.rb --vendor

You don't need this step if you put the extension library under the ext
directory of the ruby source tree.  In that case, compilation of the
interpreter will do this step for you.

(7) make

Type

  make

to compile your extension.  You don't need this step either if you have
put the extension library under the ext directory of the ruby source tree.

(8) debug

You may need to rb_debug the extension.  Extensions can be linked
statically by adding the directory name in the ext/Setup file so that
you can inspect the extension with the debugger.

(9) done, now you have the extension library

You can do anything you want with your library.  The author of Ruby
will not claim any restrictions on your code depending on the Ruby API.
Feel free to use, modify, distribute or sell your program.

Appendix A. Ruby source files overview

ruby language core

  class.c
  error.c
  eval.c
  gc.c
  object.c
  parse.y
  variable.c

utility functions

  dln.c
  regex.c
  st.c
  util.c

ruby interpreter implementation

  dmyext.c
  inits.c
  main.c
  ruby.c
  version.c

class library

  array.c
  bignum.c
  compar.c
  dir.c
  enum.c
  file.c
  hash.c
  io.c
  marshal.c
  math.c
  numeric.c
  pack.c
  prec.c
  process.c
  random.c
  range.c
  re.c
  signal.c
  sprintf.c
  string.c
  struct.c
  time.c

Appendix B. Ruby extension API reference

** Types

 VALUE

The type for the Ruby object.  Actual structures are defined in ruby.h,
such as struct RString, etc.  To refer the values in structures, use
casting macros like RSTRING(obj).

** Variables and constants

 Qnil

const: nil object

 Qtrue

const: true object(default true value)

 Qfalse

const: false object

** C pointer wrapping

 Data_Wrap_Struct(VALUE klass, void (*mark)(), void (*free)(), void *sval)

Wrap a C pointer into a Ruby object.  If object has references to other
Ruby objects, they should be marked by using the mark function during
the GC process.  Otherwise, mark should be 0.  When this object is no
longer referred by anywhere, the pointer will be discarded by free
function.

 Data_Make_Struct(klass, type, mark, free, sval)

This macro allocates memory using malloc(), assigns it to the variable
sval, and returns the DATA encapsulating the pointer to memory region.

 Data_Get_Struct(data, type, sval)

This macro retrieves the pointer value from DATA, and assigns it to
the variable sval. 

** Checking data types

TYPE(value)
FIXNUM_P(value)
NIL_P(value)
void Check_Type(VALUE value, int type)
void Check_SafeStr(VALUE value)

** Data type conversion

FIX2INT(value)
INT2FIX(i)
NUM2INT(value)
INT2NUM(i)
NUM2DBL(value)
rb_float_new(f)
StringValue(value)
StringValuePtr(value)
StringValueCStr(value)
rb_str_new2(s)

** defining class/module

 VALUE rb_define_class(const char *name, VALUE super)

Defines a new Ruby class as a subclass of super.

 VALUE rb_define_class_under(VALUE module, const char *name, VALUE super)

Creates a new Ruby class as a subclass of super, under the module's
namespace.

 VALUE rb_define_module(const char *name)

Defines a new Ruby module.

 VALUE rb_define_module_under(VALUE module, const char *name)

Defines a new Ruby module under the module's namespace.

 void rb_include_module(VALUE klass, VALUE module)

Includes module into class.  If class already includes it, just
ignored.

 void rb_extend_object(VALUE object, VALUE module)

Extend the object with the module's attributes.

** Defining Global Variables

 void rb_define_variable(const char *name, VALUE *var)

Defines a global variable which is shared between C and Ruby.  If name
contains a character which is not allowed to be part of the symbol,
it can't be seen from Ruby programs.

 void rb_define_readonly_variable(const char *name, VALUE *var)

Defines a read-only global variable.  Works just like
rb_define_variable(), except the defined variable is read-only.

 void rb_define_virtual_variable(const char *name,
				 VALUE (*getter)(), VALUE (*setter)())

Defines a virtual variable, whose behavior is defined by a pair of C
functions.  The getter function is called when the variable is
referenced.  The setter function is called when the variable is set to a
value.  The prototype for getter/setter functions are:

	VALUE getter(ID id)
	void setter(VALUE val, ID id)

The getter function must return the value for the access.

 void rb_define_hooked_variable(const char *name, VALUE *var,
				VALUE (*getter)(), VALUE (*setter)())

Defines hooked variable.  It's a virtual variable with a C variable.  
The getter is called as

	VALUE getter(ID id, VALUE *var)

returning a new value.  The setter is called as

	void setter(VALUE val, ID id, VALUE *var)

GC requires C global variables which hold Ruby values to be marked.

 void rb_global_variable(VALUE *var)

Tells GC to protect these variables.

** Constant Definition

 void rb_define_const(VALUE klass, const char *name, VALUE val)

Defines a new constant under the class/module.

 void rb_define_global_const(const char *name, VALUE val)

Defines a global constant.  This is just the same as

     rb_define_const(cKernal, name, val)

** Method Definition

 rb_define_method(VALUE klass, const char *name, VALUE (*func)(), int argc)

Defines a method for the class.  func is the function pointer.  argc
is the number of arguments.  if argc is -1, the function will receive
3 arguments: argc, argv, and self.  if argc is -2, the function will
receive 2 arguments, self and args, where args is a Ruby array of
the method arguments.

 rb_define_private_method(VALUE klass, const char *name, VALUE (*func)(), int argc)

Defines a private method for the class.  Arguments are same as
rb_define_method().

 rb_define_singleton_method(VALUE klass, const char *name, VALUE (*func)(), int argc)

Defines a singleton method.  Arguments are same as rb_define_method().

 rb_scan_args(int argc, VALUE *argv, const char *fmt, ...)

Retrieve argument from argc, argv.  The fmt is the format string for
the arguments, such as "12" for 1 non-optional argument, 2 optional
arguments.  If `*' appears at the end of fmt, it means the rest of
the arguments are assigned to the corresponding variable, packed in
an array.

** Invoking Ruby method

 VALUE rb_funcall(VALUE recv, ID mid, int narg, ...)

Invokes a method.  To retrieve mid from a method name, use rb_intern().

 VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv)

Invokes a method, passing arguments by an array of values.

 VALUE rb_eval_string(const char *str)

Compiles and executes the string as a Ruby program.

 ID rb_intern(const char *name)

Returns ID corresponding to the name.

 char *rb_id2name(ID id)

Returns the name corresponding ID.

 char *rb_class2name(VALUE klass)

Returns the name of the class.

 int rb_respond_to(VALUE object, ID id)

Returns true if the object responds to the message specified by id.

** Instance Variables

 VALUE rb_iv_get(VALUE obj, const char *name)

Retrieve the value of the instance variable.  If the name is not
prefixed by `@', that variable shall be inaccessible from Ruby.

 VALUE rb_iv_set(VALUE obj, const char *name, VALUE val)

Sets the value of the instance variable.

** Control Structure

 VALUE rb_iterate(VALUE (*func1)(), void *arg1, VALUE (*func2)(), void *arg2)

Calls the function func1, supplying func2 as the block.  func1 will be
called with the argument arg1.  func2 receives the value from yield as
the first argument, arg2 as the second argument.
 
 VALUE rb_yield(VALUE val)

Evaluates the block with value val.

 VALUE rb_rescue(VALUE (*func1)(), void *arg1, VALUE (*func2)(), void *arg2)

Calls the function func1, with arg1 as the argument.  If an exception
occurs during func1, it calls func2 with arg2 as the argument.  The
return value of rb_rescue() is the return value from func1 if no
exception occurs, from func2 otherwise.

 VALUE rb_ensure(VALUE (*func1)(), void *arg1, void (*func2)(), void *arg2)

Calls the function func1 with arg1 as the argument, then calls func2
with arg2 if execution terminated.  The return value from
rb_ensure() is that of func1.

** Exceptions and Errors

 void rb_warn(const char *fmt, ...)

Prints a warning message according to a printf-like format.

 void rb_warning(const char *fmt, ...)

Prints a warning message according to a printf-like format, if
$VERBOSE is true.

void rb_raise(rb_eRuntimeError, const char *fmt, ...)

Raises RuntimeError.  The fmt is a format string just like printf().

 void rb_raise(VALUE exception, const char *fmt, ...)

Raises a class exception.  The fmt is a format string just like printf().

 void rb_fatal(const char *fmt, ...)

Raises a fatal error, terminates the interpreter.  No exception handling
will be done for fatal errors, but ensure blocks will be executed.

 void rb_bug(const char *fmt, ...)

Terminates the interpreter immediately.  This function should be
called under the situation caused by the bug in the interpreter.  No
exception handling nor ensure execution will be done.

** Initialize and Start the Interpreter

The embedding API functions are below (not needed for extension libraries):

 void ruby_init()

Initializes the interpreter.

 void ruby_options(int argc, char **argv)

Process command line arguments for the interpreter.

 void ruby_run()

Starts execution of the interpreter.

 void ruby_script(char *name)

Specifies the name of the script ($0).

** Hooks for the Interpreter Events

 void rb_add_event_hook(rb_event_hook_func_t func, rb_event_t events)

Adds a hook function for the specified interpreter events.
events should be Or'ed value of:

	RUBY_EVENT_LINE
	RUBY_EVENT_CLASS
	RUBY_EVENT_END
	RUBY_EVENT_CALL
	RUBY_EVENT_RETURN
	RUBY_EVENT_C_CALL
	RUBY_EVENT_C_RETURN
	RUBY_EVENT_RAISE
	RUBY_EVENT_ALL

The definition of rb_event_hook_func_t is below:

 typedef void (*rb_event_hook_func_t)(rb_event_t event, NODE *node,
 				      VALUE self, ID id, VALUE klass)

 int rb_remove_event_hook(rb_event_hook_func_t func)

Removes the specified hook function.

Appendix C. Functions Available in extconf.rb

These functions are available in extconf.rb:

 have_macro(macro, headers)

Checks whether macro is defined with header.  Returns true if the macro
is defined.

 have_library(lib, func)

Checks whether the library exists, containing the specified function.
Returns true if the library exists.

 find_library(lib, func, path...)

Checks whether a library which contains the specified function exists in
path.  Returns true if the library exists.

 have_func(func, header)

Checks whether func exists with header.  Returns true if the function
exists.  To check functions in an additional library, you need to
check that library first using have_library().

 have_var(var, header)

Checks whether var exists with header.  Returns true if the variable
exists.  To check variables in an additional library, you need to
check that library first using have_library().

 have_header(header)

Checks whether header exists.  Returns true if the header file exists.

 find_header(header, path...)

Checks whether header exists in path.  Returns true if the header file
exists.

 have_struct_member(type, member, header)

Checks whether type has member with header.  Returns true if the type
is defined and has the member.

 have_type(type, header, opt)

Checks whether type is defined with header.  Returns true if the type
is defined.

 check_sizeof(type, header)

Checks the size of type in char with header.  Returns the size if the
type is defined, otherwise nil.

 create_makefile(target)

Generates the Makefile for the extension library.  If you don't invoke
this method, the compilation will not be done.

 find_executable(bin, path)

Finds command in path, which is File::PATH_SEPARATOR-separated list of
directories.  If path is nil or omitted, environment varialbe PATH
will be used.  Returns the path name of the command if it is found,
otherwise nil.

 with_config(withval[, default=nil])

Parses the command line options and returns the value specified by
--with-<withval>.

 enable_config(config, *defaults)
 disable_config(config, *defaults)

Parses the command line options for boolean.  Returns true if
--enable-<config> is given, or false if --disable-<config> is given.
Otherwise, yields defaults to the given block and returns the result
if it is called with a block, or returns defaults.

 dir_config(target[, default_dir])
 dir_config(target[, default_include, default_lib])

Parses the command line options and adds the directories specified by
--with-<target>-dir, --with-<target>-include, and/or --with-<target>-lib
to $CFLAGS and/or $LDFLAGS.  --with-<target>-dir=/path is equivalent to
--with-<target>-include=/path/include --with-<target>-lib=/path/lib.
Returns an array of the added directories ([include_dir, lib_dir]).

 pkg_config(pkg)

Obtains the information for pkg by pkg-config command.  The actual
command name can be overriden by --with-pkg-config command line
option.

/*
 * Local variables:
 * fill-column: 70
 * end:
 */
PK-|[#6��ODODdoc/alt-ruby18/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.

regex.[ch]:

  These files are under LGPL.  Treat them as LGPL says. (See the file
  LGPL for details)

    Extended regular expression matching and search library.
    Copyright (C) 1993, 94, 95, 96, 97, 98 Free Software Foundation, Inc.

    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public License as
    published by the Free Software Foundation; either version 2 of the
    License, or (at your option) any later version.

    The GNU C 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
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public
    License along with the GNU C Library; see the file LGPL.  If not,
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */

    Multi-byte extension added May, 1993 by t^2 (Takahiro Tanimoto)
    Last change: May 21, 1993 by t^2
    removed gapped buffer support, multiple syntax support by matz <matz@nts.co.jp>
    Perl5 extension added by matz <matz@caelum.co.jp>
    UTF-8 extension added Jan 16 1999 by Yoshida Masato  <yoshidam@tau.bekkoame.ne.jp>

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.

config.guess:
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):
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.

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

st.[ch]:
x68/*:
missing/alloca.c:
missing/dup2.c:
missing/finite.c:
missing/hypot.c:
missing/isinf.c:
missing/isnan.c:
missing/memcmp.c:
missing/memmove.c:
missing/strcasecmp.c:
missing/strchr.c:
missing/streror.c:
missing/strftime.c:
missing/strncasecmp.c:
missing/strstr.c:
missing/strtol.c:
ext/digest/sha1/sha1.[ch]:

  These files are all under public domain.

missing/strtod.c:

  This file will not be used on most platforms depending on how the
  configure script results.  In any case you must not receive any fee
  with the file itself.

    Copyright (c) 1988-1993 The Regents of the University of California.
    Copyright (c) 1994 Sun Microsystems, Inc.

    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.  The University of California
    makes no representations about the suitability of this
    software for any purpose.  It is provided "as is" without
    express or implied warranty.

missing/strtoul.c:

  This file will not be used on most platforms depending on how the
  configure script results.  In any case you must not receive any fee
  with the file itself.

    Copyright 1988 Regents of the University of California

    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.  The University of California
    makes no representations about the suitability of this
    software for any purpose.  It is provided "as is" without
    express or implied warranty.

missing/erf.c:
missing/crypt.c:
missing/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.

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/rmd160/rmd160hl.c:
ext/digest/sha1/sha1hl.c:

  These files are under the beer-ware license.

    "THE BEER-WARE LICENSE" (Revision 42):
    <phk@login.dkuug.dk> wrote this file.  As long as you retain this notice you
    can do whatever you want with this stuff. If we meet some day, and you think
    this stuff is worth it, you can buy me a beer in return.   Poul-Henning Kamp

ext/digest/sha2/sha2.[ch]:
ext/digest/sha2/sha2hl.c:

  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/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/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.
PK-|[ڻ��5�5�doc/alt-ruby18/README.EXT.janu�[���.\" README.EXT.ja -  -*- Text -*- created at: Mon Aug  7 16:45:54 JST 1995

Ruby�γ�ĥ�饤�֥��κ����������ޤ���

1������μ�

C���ѿ�ˤϷ������ꡤ�ǡ����ˤϷ�������ޤ��󡥤Ǥ����顤��
�Ȥ��Хݥ��󥿤�int���ѿ���������ȡ������ͤ����Ȥ��Ƽ�
�갷���ޤ����դ�Ruby���ѿ�ˤϷ����ʤ����ǡ����˷��������
�������ΰ㤤�Τ��ᡤC��Ruby���ߤ��Ѵ����ʤ���С����ߤ���
�ǡ����򥢥������Ǥ��ޤ���

Ruby�Υǡ�����VALUE�Ȥ���C�η���ɽ������ޤ���VALUE���Υǡ�
���Ϥ��Υǡ��������פ�ʬ���ΤäƤ��ޤ������Υǡ��������פ�
�����Τϥǡ���(���֥�������)�μºݤι�¤���̣���Ƥ��ơ�Ruby
�Υ��饹�ȤϤޤ���ä���ΤǤ���

VALUE����C�ˤȤäư�̣�Τ���ǡ�������Ф�����ˤ�

 (1) VALUE�Υǡ��������פ��Τ�
 (2) VALUE��C�Υǡ������Ѵ�����

��ξ���ɬ�פǤ���(1)��˺���ȴְ�ä��ǡ������Ѵ����Ԥ��
�ơ��ǰ��ץ���बcore dump���ޤ���

1.1 �ǡ���������

Ruby�ˤϥ桼�����Ȥ���ǽ���Τ���ʲ��Υ����פ�����ޤ���

	T_NIL		nil
	T_OBJECT	�̾�Υ��֥�������
	T_CLASS		���饹
	T_MODULE	�⥸�塼��
	T_FLOAT		��ư�������
	T_STRING	ʸ����
	T_REGEXP	����ɽ��
	T_ARRAY		����
	T_FIXNUM	Fixnum(31bit����)
	T_HASH		Ϣ������
	T_STRUCT	(Ruby��)��¤��
	T_BIGNUM	¿��Ĺ����
	T_FILE		�����
	T_TRUE		��
	T_FALSE		��
	T_DATA		�ǡ���
	T_SYMBOL	����ܥ�

����¾���������Ѥ���Ƥ���ʲ��Υ����פ�����ޤ���

	T_ICLASS
	T_MATCH
	T_UNDEF
	T_VARMAP
	T_SCOPE
	T_NODE

�ۤȤ�ɤΥ����פ�C�ι�¤�ΤǼ������Ƥ��ޤ���

1.2 VALUE�Υǡ��������פ���å�����

ruby.h�Ǥ�TYPE()�Ȥ����ޥ���������Ƥ��ơ�VALUE�Υǡ���
�����פ��Τ뤳�Ȥ�����ޤ���TYPE()�ޥ���Ͼ�ǾҲ𤷤�T_XXXX
�η����������֤��ޤ���VALUE�Υǡ��������פ˱����ƽ������
���ˤϡ�TYPE()���ͤ�ʬ��뤳�Ȥˤʤ�ޤ���

  switch (TYPE(obj)) {
    case T_FIXNUM:
      /* FIXNUM�� */
      break;
    case T_STRING:
      /* ʸ����ν�� */
      break;
    case T_ARRAY:
      /* ����� */
      break;
    default:
      /* �㳰��ȯ�������� */
      rb_raise(rb_eTypeError, "not valid value");
      break;
  }

����ȥǡ��������פ���å����ơ��������ʤ�����㳰��ȯ����
��ؿ��Ѱդ���Ƥ��ޤ���

  void Check_Type(VALUE value, int type)

���δؿ��value��type��̵����С��㳰��ȯ�������ޤ��������
����Ϳ����줿VALUE�Υǡ��������פ����������ɤ��������å���
�뤿��ˤϡ����δؿ��Ȥ��ޤ���

FIXNUM��NIL�˴ؤ��ƤϤ���®��Ƚ�̥ޥ����Ѱդ���Ƥ��ޤ���

  FIXNUM_P(obj)
  NIL_P(obj)

1.3 VALUE��C�Υǡ������Ѵ�����

�ǡ��������פ�T_NIL, T_FALSE, T_TRUE�Ǥ������ǡ����Ϥ��줾
��nil, false, true�Ǥ������Υǡ��������פΥ��֥������ȤϤҤ�
�Ĥ��Ĥ���¸�ߤ��ޤ���

�ǡ��������פ�T_FIXNUM�λ��������31bit�Υ������������
����FIXNUM��C�������Ѵ����뤿��ˤϥޥ����FIX2INT()�פ��
���ޤ������줫�顤FIXNUM�˸¤餺Ruby�Υǡ��������Ѵ�����
��NUM2INT()�פȤ����ޥ�������ޤ������Υޥ���ϥǡ�������
�פΥ����å�̵���ǻȤ��ޤ�(������Ѵ��Ǥ��ʤ����ˤ��㳰��
ȯ������)��Ʊ�ͤ˥����å�̵���ǻȤ����Ѵ��ޥ����double��
���Ф���NUM2DBL()�פ�����ޤ���

char* ����Ф���硢version 1.6 ����Ǥϡ�STR2CSTR()�פ�
�����ޥ����ȤäƤ��ޤ������������ to_str() �ˤ����ۤ�
���Ѵ���̤� GC ������ǽ�������뤿�ᡢversion 1.7 �ʹߤǤ�
obsolete �Ȥʤꡢ����� StringValue() �� StringValuePtr()
��Ȥ�����侩���Ƥ��ޤ���StringValue(var) �� var �� String
 �Ǥ���в��⤻���������Ǥʤ���� var �� var.to_str() �η�̤�
�֤�������ޥ���StringValuePtr(var) ��Ʊ�ͤ� var ���֤�����
�Ƥ��� var ��ʸ����ɽ�����Ф��� char* ���֤��ޥ���Ǥ���var ��
���Ƥ�ľ���֤��������������Τǡ�var �� lvalue �Ǥ���ɬ�פ�
����ޤ���

����ʳ��Υǡ��������פ��б�����C�ι�¤�Τ�����ޤ����б���
�빽¤�ΤΤ���VALUE�Ϥ��Τޤޥ��㥹��(���Ѵ�)����й�¤�Τ�
�ݥ��󥿤��Ѵ��Ǥ��ޤ���

��¤�Τϡ�struct RXxxxx�פȤ���̾����ruby.h��������Ƥ���
�����㤨��ʸ����ϡ�struct RString�פǤ����ºݤ˻Ȥ���ǽ����
����Τ�ʸ��������󤯤餤���Ȼפ��ޤ���

ruby.h�ǤϹ�¤�Τإ��㥹�Ȥ���ޥ�����RXXXXX()��(������ʸ
���ˤ������)�Ȥ���̾�����󶡤���Ƥ��ޤ�(��: RSTRING())��

�㤨�С�ʸ����str��Ĺ������뤿��ˤϡ�RSTRING(str)->len�פ�
����ʸ����str��char*�Ȥ�����뤿��ˤϡ�RSTRING(str)->ptr��
�Ȥ��ޤ�������ξ��ˤϡ����줾���RARRAY(ary)->len�ס�
��RARRAY(ary)->ptr�פȤʤ�ޤ���

Ruby�ι�¤�Τ�ľ�ܥ������������˵���Ĥ��ʤ���Фʤ�ʤ���
�Ȥϡ������ʸ����ι�¤�Τ���Ȥϻ��Ȥ������ǡ�ľ���ѹ���
�ʤ����ȤǤ���ľ���ѹ�������硤���֥������Ȥ����Ƥ������
�Ȥ�ʤ��ʤäơ��פ�̥Х��θ����ˤʤ�ޤ���

1.4 C�Υǡ�����VALUE���Ѵ�����

VALUE�μºݤι�¤��

  * FIXNUM��

    1bit�����եȤ��ơ�LSB��Ω�Ƥ롥

  * ����¾�Υݥ��󥿤ξ��

    ���Τޤ�VALUE�˥��㥹�Ȥ��롥

�ȤʤäƤ��ޤ�����äơ�LSB����å������VALUE��FIXNUM����
�����狼��櫓�Ǥ�(�ݥ��󥿤�LSB��Ω�äƤ��ʤ����Ȥ��ꤷ��
����)��

�Ǥ����顤FIXNUM�ʳ���Ruby�Υ��֥������Ȥι�¤�Τ�ñ��VALUE
�˥��㥹�Ȥ�������VALUE���Ѵ�����ޤ�����������Ǥ�դι�¤
�Τ�VALUE�˥��㥹�Ƚ����櫓�ǤϤ���ޤ��󡥥��㥹�Ȥ����
��Ruby���ΤäƤ��빽¤��(ruby.h��������Ƥ���struct RXxxx
�Τ��)�����Ǥ���

FIXNUM�˴ؤ��Ƥ��Ѵ��ޥ�����ͳ����ɬ�פ�����ޤ���C�����
����VALUE���Ѵ�����ޥ���ϰʲ��Τ�Τ�����ޤ���ɬ�פ˱���
�ƻȤ�ʬ���Ƥ���������

  INT2FIX()	��Ȥ����31bit����˼��ޤ뼫��������
  INT2NUM()	Ǥ�դ�����VALUE��

INT2NUM()�����FIXNUM���ϰϤ˼��ޤ�ʤ���硤Bignum���Ѵ�
���Ƥ���ޤ�(���������٤�)��

1.5 Ruby�Υǡ��������

�����Ҥ٤��̤ꡤRuby�ι�¤�Τ򥢥��������������Ƥι�����
�Ԥ����Ȥϴ�����ޤ��󡥤ǡ�Ruby�Υǡ���������ˤ�
Ruby���Ѱդ��Ƥ���ؿ���Ѥ��Ƥ���������

�����ǤϤ�äȤ�Ȥ���Ǥ���ʸ�������������/�����
���ؿ�򤢤��ޤ�(����ǤϤʤ��Ǥ�)��

 ʸ������Ф���ؿ�

  rb_str_new(const char *ptr, long len)

    ������Ruby��ʸ���������롥

  rb_str_new2(const char *ptr)

    C��ʸ���󤫤�Ruby��ʸ���������롥���δؿ�ε�ǽ��
    rb_str_new(ptr, strlen(ptr))��Ʊ��Ǥ��롥

  rb_tainted_str_new(const char *ptr, long len)

    �����ޡ������ղä��줿������Ruby��ʸ���������롥����
    ����Υǡ����˴�Ť�ʸ����ˤϱ����ޡ������ղä����٤�
    �Ǥ��롥

  rb_tainted_str_new2(const char *ptr)

    C��ʸ���󤫤����ޡ������ղä��줿Ruby��ʸ���������롥

  rb_str_cat(VALUE str, const char *ptr, long len)

    Ruby��ʸ����str��len�Х��Ȥ�ʸ����ptr���ɲä��롥

 ������Ф���ؿ�

  rb_ary_new()

    ��Ǥ�0�����������롥

  rb_ary_new2(long len)

    ��Ǥ�0�����������롥len���ʬ���ΰ�򤢤餫������
    ��ƤƤ�����

  rb_ary_new3(long n, ...)

    ����ǻ��ꤷ��n��Ǥ�ޤ����������롥

  rb_ary_new4(long n, VALUE *elts)

    �����Ϳ����n��Ǥ����������롥

  rb_ary_push(VALUE ary, VALUE val)
  rb_ary_pop(VALUE ary)
  rb_ary_shift(VALUE ary)
  rb_ary_unshift(VALUE ary, VALUE val)

    Array��Ʊ̾�Υ᥽�åɤ�Ʊ��Ư���򤹤�ؿ���1�����ɬ��
    ����Ǥʤ���Фʤ�ʤ���

2��Ruby�ε�ǽ��Ȥ�

���Ū��Ruby�ǽ񤱤뤳�Ȥ�C�Ǥ�񤱤ޤ���Ruby���Τ�Τ�C�ǵ�
�Ҥ���Ƥ����Ǥ����顤����Ȥ���������ʤ�Ǥ����ɡ�������
��Ruby�γ�ĥ�˻Ȥ����Ȥ�¿��������ͽ¬����뵡ǽ���濴�˾�
�𤷤ޤ���

2.1 Ruby�˵�ǽ���ɲä���

Ruby���󶡤���Ƥ���ؿ��Ȥ���Ruby���󥿥ץ꥿�˿�������ǽ
���ɲä��뤳�Ȥ��Ǥ��ޤ���Ruby�Ǥϰʲ��ε�ǽ���ɲä���ؿ�
�󶡤���Ƥ��ޤ���

 * ���饹���⥸�塼��
 * �᥽�åɡ��ðۥ᥽�åɤʤ�
 * ���

�ǤϽ�˾Ҳ𤷤ޤ���

2.1.1 ���饹/�⥸�塼����

���饹��⥸�塼��������뤿��ˤϡ��ʲ��δؿ��Ȥ��ޤ���

  VALUE rb_define_class(const char *name, VALUE super)
  VALUE rb_define_module(const char *name)

�����δؿ�Ͽ����������줿���饹��⥸�塼����֤��ޤ���
�᥽�åɤ��������ˤ������ͤ�ɬ�פʤΤǡ��ۤȤ�ɤξ��
������ͤ��ѿ�˳�Ǽ���Ƥ���ɬ�פ�����Ǥ��礦��

���饹��⥸�塼���¾�Υ��饹������˥ͥ��Ȥ�����������
�ϰʲ��δؿ��Ȥ��ޤ���

  VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
  VALUE rb_define_module_under(VALUE outer, const char *name)

2.1.2 �᥽�å�/�ðۥ᥽�å���

�᥽�åɤ��ðۥ᥽�åɤ�������ˤϰʲ��δؿ��Ȥ��ޤ���

  void rb_define_method(VALUE klass, const char *name, 
		        VALUE (*func)(), int argc)

  void rb_define_singleton_method(VALUE object, const char *name, 
			          VALUE (*func)(), int argc)


ǰ�Τ���������ȡ��ðۥ᥽�åɡפȤϡ���������Υ��֥�����
�Ȥ��Ф��Ƥ���ͭ���ʥ᥽�åɤǤ���Ruby�ǤϤ褯Smalltalk�ˤ�
���륯�饹�᥽�åɤȤ��ơ����饹���Ф����ðۥ᥽�åɤ��Ȥ��
�ޤ���

�����δؿ�� argc�Ȥ��������C�δؿ���Ϥ������ο�(��
����)����ޤ���argc��0�ʾ�λ��ϴؿ�˰����Ϥ�����ο���
̣���ޤ���16�İʾ�ΰ���ϻȤ��ޤ���(�����פ�ޤ����͡���
��ʤ�)���ºݤδؿ�ˤ��Ƭ�ΰ���Ȥ���self��Ϳ�����ޤ���
�ǡ����ꤷ������1¿�������Ĥ��Ȥˤʤ�ޤ���

argc����λ��ϰ���ο�ǤϤʤ�����������ꤷ�����Ȥˤʤ�ޤ���
argc��-1�λ��ϰ��������������Ϥ���ޤ���argc��-2�λ��ϰ�
���Ruby������Ȥ����Ϥ���ޤ���

�᥽�åɤ�������ؿ�Ϥ⤦��Ĥ���ޤ����ҤȤĤ�private��
���åɤ�������ؿ�ǡ������rb_define_method()��Ʊ���Ǥ���

  void rb_define_private_method(VALUE klass, const char *name, 
				VALUE (*func)(), int argc)

private�᥽�åɤȤϴؿ���Ǥ����ƤӽФ����Ȥν���ʤ��᥽��
�ɤǤ���

�⤦�ҤȤĤϥ⥸�塼��ؿ���������ΤǤ����⥸�塼��ؿ�
�Ȥϥ⥸�塼����ðۥ᥽�åɤǤ��ꡤƱ����private�᥽�åɤ�
�⤢���ΤǤ�����򤢤����Math�⥸�塼���sqrt()�ʤɤ�����
���ޤ������Υ᥽�åɤ�

  Math.sqrt(4)

�Ȥ��������Ǥ�

  include Math
  sqrt(4)

�Ȥ��������Ǥ�Ȥ��ޤ����⥸�塼��ؿ��������ؿ�ϰʲ���
�̤�Ǥ���

  void rb_define_module_function(VALUE module, const char *name, 
		                 VALUE (*func)(), int argc)

�ؿ�Ū�᥽�å�(Kernel�⥸�塼���private method)�������뤿
��δؿ�ϰʲ����̤�Ǥ���

  void rb_define_global_function(const char *name, VALUE (*func)(), int argc)


�᥽�åɤ���̾�������뤿��δؿ�ϰʲ����̤�Ǥ���

  void rb_define_alias(VALUE module, const char* new, const char* old);

���饹�᥽�å�allocate����������������ꤹ�뤿��δؿ��
�ʲ����̤�Ǥ���

  void rb_define_alloc_func(VALUE klass, VALUE (*func)(VALUE klass));
  void rb_undef_alloc_func(VALUE klass);

func�ϥ��饹���Ȥ��Ƽ�����äơ������������Ƥ�줿����
�����󥹤��֤��ʤ��ƤϤʤ�ޤ��󡣤��Υ��󥹥��󥹤ϡ������
�������ʤɤ�ޤޤʤ����Ǥ������ֶ��פΤޤޤˤ��Ƥ������ۤ�
���褤�Ǥ��礦��

2.1.3 �����

��ĥ�饤�֥�꤬ɬ�פ����Ϥ��餫���������Ƥ���������ɤ�
�Ǥ��礦������������ؿ����Ĥ���ޤ���

  void rb_define_const(VALUE klass, const char *name, VALUE val)
  void rb_define_global_const(const char *name, VALUE val)

���Ԥ�����Υ��饹/�⥸�塼���°���������������Ρ���
�Ԥϥ����Х�������������ΤǤ���

2.2 Ruby�ε�ǽ��C����ƤӽФ�

���ˡ�1.5 Ruby�Υǡ��������٤ǰ���Ҳ𤷤��褦�ʴؿ��
�Ȥ��С�Ruby�ε�ǽ��¸����Ƥ���ؿ��ľ�ܸƤӽФ����Ȥ�����
�ޤ���

# ���Τ褦�ʴؿ�ΰ��ɽ�Ϥ��ޤΤȤ�����ޤ��󡥥�������
# �뤷���ʤ��Ǥ��͡�

����ʳ��ˤ�Ruby�ε�ǽ��ƤӽФ��ˡ�Ϥ����Ĥ�����ޤ���

2.2.1 Ruby�Υץ�����eval����

C����Ruby�ε�ǽ��ƤӽФ���äȤ��ñ���ˡ�Ȥ��ơ�ʸ�����
Ϳ����줿Ruby�Υץ�����ɾ������ʲ��δؿ����ޤ���

  VALUE rb_eval_string(const char *str)

����ɾ���ϸ��ߤδĶ��ǹԤ��ޤ����Ĥޤꡤ���ߤΥ������ѿ�
�ʤɤ���Ѥ��ޤ���

2.2.2 ID�ޤ��ϥ���ܥ�

C����ʸ������ͳ������Ruby�Υ᥽�åɤ�ƤӽФ����Ȥ�Ǥ���
����������ˡ�Ruby���󥿥ץ꥿��ǥ᥽�åɤ��ѿ�̾����ꤹ��
���˻Ȥ��Ƥ���ID�ˤĤ��������Ƥ����ޤ��礦��

ID�Ȥ��ѿ�̾���᥽�å�̾��ɽ������Ǥ���Ruby�Ǥ�ID���б�����
���֥������ȤȤ��ƥ���ܥ�(Symbol)�����ꡤ

 :���̻�

�ǥ��������Ǥ��ޤ���C���餳��������뤿��ˤϴؿ�

  rb_intern(const char *name)

��Ȥ��ޤ���Ruby������Ȥ���Ϳ����줿����ܥ�(�ޤ���ʸ��
��)��ID���Ѵ�����ˤϰʲ��δؿ��Ȥ��ޤ���

  rb_to_id(VALUE symbol)

ID���饷��ܥ����뤿��ˤϰʲ��Υޥ����Ȥ��ޤ���

  VALUE ID2SYM(ID id)

����ܥ뤫��ID����뤿��ˤϰʲ��Υޥ����Ȥ��ޤ���

  ID SYM2ID(VALUE symbol)

2.2.3 C����Ruby�Υ᥽�åɤ�ƤӽФ�

C����ʸ������ͳ������Ruby�Υ᥽�åɤ�ƤӽФ�����ˤϰʲ�
�δؿ��Ȥ��ޤ���

  VALUE rb_funcall(VALUE recv, ID mid, int argc, ...)

���δؿ�ϥ��֥�������recv��mid�ǻ��ꤵ���᥽�åɤ�Ƥӽ�
���ޤ�������¾�˰���λ���λ�����㤦�ʲ��δؿ�⤢��ޤ���

  VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv)
  VALUE rb_apply(VALUE recv, ID mid, VALUE args)

apply�ˤϰ���Ȥ���Ruby�������Ϳ���ޤ���

2.2.4 �ѿ�/���򻲾�/��������

C����ؿ��Ȥäƻ��ȡ������Ǥ���Τϡ������󥹥�����
��Ǥ�������ѿ�ϰ���Τ�Τ�C������ѿ�Ȥ��ƥ��������Ǥ�
�ޤ����������ѿ�򻲾Ȥ����ˡ�ϸ������Ƥ��ޤ���

���֥������ȤΥ��󥹥����ѿ�򻲾ȡ���������ؿ�ϰʲ�����
��Ǥ���

  VALUE rb_ivar_get(VALUE obj, ID id)
  VALUE rb_ivar_set(VALUE obj, ID id, VALUE val)

id��rb_intern()��������Τ�ȤäƤ���������

���򻲾Ȥ���ˤϰʲ��δؿ��ȤäƤ���������

  VALUE rb_const_get(VALUE obj, ID id)

���򿷤��������뤿��ˤϡ�2.1.3 ������٤ǾҲ�
��Ƥ���ؿ��ȤäƤ���������

3��Ruby��C�Ȥξ���ͭ

C�����Ruby�δ֤Ǿ����ͭ�����ˡ�ˤĤ��Ʋ�⤷�ޤ���

3.1 C���黲�ȤǤ���Ruby�����

�ʲ���Ruby������C�Υ�٥뤫�黲�ȤǤ��ޤ���

  Qtrue
  Qfalse

    �����͡�Qfalse��C����Ǥ⵶�Ȥߤʤ���ޤ�(�Ĥޤ�0)��

  Qnil

    C���줫�鸫����nil�ס�

3.2 C��Ruby�Ƕ�ͭ���������ѿ�

C��Ruby������ѿ��Ȥäƾ����ͭ�Ǥ��ޤ�����ͭ�Ǥ������
�ѿ�ˤϤ����Ĥ��μ��ब����ޤ������Τʤ��Ǥ�äȤ��ɤ��Ȥ�
���Ȼפ���Τ�rb_define_variable()�Ǥ���

  void rb_define_variable(const char *name, VALUE *var)

���δؿ��Ruby��C�ȤǶ�ͭ��������ѿ�������ޤ����ѿ�̾��
`$'�ǻϤޤ�ʤ����ˤϼ�ưŪ���ɲä���ޤ��������ѿ���ͤ���
������ȼ�ưŪ��Ruby���б������ѿ���ͤ��Ѥ��ޤ���

�ޤ�Ruby¦����Ϲ����Ǥ��ʤ��ѿ�⤢��ޤ�������read only��
�ѿ�ϰʲ��δؿ�������ޤ���

  void rb_define_readonly_variable(const char *name, VALUE *var)

������ѿ��¾��hook��Ĥ�������ѿ�����Ǥ��ޤ���hook�դ�
������ѿ�ϰʲ��δؿ���Ѥ��������ޤ���hook�դ�����ѿ��
�ͤλ��Ȥ�����hook�ǹԤ�ɬ�פ�����ޤ���

  void rb_define_hooked_variable(const char *name, VALUE *var,
				 VALUE (*getter)(), void (*setter)())

���δؿ��C�δؿ�ˤ�ä�hook�ΤĤ���줿����ѿ��������
�����ѿ���Ȥ��줿���ˤϴؿ�getter�����ѿ���ͤ����åȤ���
�����ˤϴؿ�setter���ƤФ�롥hook����ꤷ�ʤ�����getter��
setter��0����ꤷ�ޤ���

# getter��setter��0�ʤ��rb_define_variable()��Ʊ���ˤʤ롥

���줫�顤C�δؿ�ˤ�äƼ¸������Ruby������ѿ��������
�ؿ����ޤ���

  void rb_define_virtual_variable(const char *name,
				  VALUE (*getter)(), void (*setter)())

���δؿ�ˤ�ä������줿Ruby������ѿ���Ȥ��줿���ˤ�
getter�����ѿ���ͤ����åȤ��줿���ˤ�setter���ƤФ�ޤ���

getter��setter�λ��ͤϰʲ����̤�Ǥ���

  (*getter)(ID id, void *data, struct global_entry* entry);
  (*setter)(VALUE val, ID id, void *data, struct global_entry* entry);

3.3 C�Υǡ�����Ruby���֥������Ȥˤ���

C������������줿�ǡ���(��¤��)��Ruby�Υ��֥������ȤȤ���
��갷��������礬���ꤨ�ޤ������Τ褦�ʾ��ˤϡ�Data�Ȥ���
Ruby���֥������Ȥ�C�ι�¤��(�ؤΥݥ���)�򤯤�ळ�Ȥ�Ruby
���֥������ȤȤ��Ƽ�갷����褦�ˤʤ�ޤ���

Data���֥������Ȥ�����ƹ�¤�Τ�Ruby���֥������Ȥ˥��ץ���
�����뤿��ˤϡ��ʲ��Υޥ����Ȥ��ޤ���

  Data_Wrap_Struct(klass, mark, free, ptr)

���Υޥ��������ͤ�������줿Data���֥������ȤǤ���

klass�Ϥ���Data���֥������ȤΥ��饹�Ǥ���ptr�ϥ��ץ��벽����
C�ι�¤�ΤؤΥݥ��󥿤Ǥ���mark�Ϥ��ι�¤�Τ�Ruby�Υ��֥���
���Ȥؤλ��Ȥ������˻Ȥ��ؿ�Ǥ������Τ褦�ʻ��Ȥ�ޤޤʤ�
���ˤ�0����ꤷ�ޤ���

# ���Τ褦�ʻ��Ȥϴ�����ޤ���

free�Ϥ��ι�¤�Τ��⤦���פˤʤä����˸ƤФ��ؿ�Ǥ�������
�ؿ�����١������쥯������ƤФ�ޤ������줬-1�ξ��ϡ�ñ
��˳������ޤ���

C�ι�¤�Τγ����Data���֥������Ȥ������Ʊ���˹Ԥ��ޥ����
���ưʲ��Τ�Τ��󶡤���Ƥ��ޤ���

  Data_Make_Struct(klass, type, mark, free, sval)

���Υޥ��������ͤ�������줿Data���֥������ȤǤ���

klass, mark, free��Data_Wrap_Struct��Ʊ��Ư���򤷤ޤ���type
�ϳ����Ƥ�C��¤�Τη��Ǥ��������Ƥ�줿��¤�Τ��ѿ�sval
���������ޤ��������ѿ�η��� (type*) �Ǥ���ɬ�פ�����ޤ���

Data���֥������Ȥ���ݥ��󥿤���Ф��Τϰʲ��Υޥ�����Ѥ�
�ޤ���

  Data_Get_Struct(obj, type, sval)

C�ι�¤�ΤؤΥݥ��󥿤��ѿ�sval���������ޤ���

������Data�λȤ���Ϥ���ä�ʬ����ˤ����Τǡ����������
����򻲾Ȥ��Ƥ���������

4������ - dbm�ѥå���������

�����ޤǤ����ǤȤꤢ������ĥ�饤�֥��Ϻ���Ϥ��Ǥ���
Ruby��ext�ǥ��쥯�ȥ�ˤ��Ǥ˴ޤޤ�Ƥ���dbm�饤�֥������
�����ʳ�Ū�������ޤ���

(1) �ǥ��쥯�ȥ����

  % mkdir ext/dbm

Ruby 1.1�����Ǥ�դΥǥ��쥯�ȥ�ǥ����ʥߥå��饤�֥����
�뤳�Ȥ��Ǥ���褦�ˤʤ�ޤ�����Ruby���Ū�˥�󥯤������
��Ruby��Ÿ�������ǥ��쥯�ȥ�β���ext�ǥ��쥯�ȥ����˳�ĥ
�饤�֥���ѤΥǥ��쥯�ȥ����ɬ�פ�����ޤ���̾����Ŭ���
����ǹ����ޤ���

(2) �߷פ���

�ޤ�������ʤ�Ǥ����ɡ��ɤ�������ǽ��¸����뤫�ɤ����ޤ���
�פ���ɬ�פ�����ޤ����ɤ�ʥ��饹��Ĥ��뤫�����Υ��饹�ˤ�
�ɤ�ʥ᥽�åɤ����뤫�����饹���󶡤������ʤɤˤĤ���߷�
���ޤ���

(3) C�����ɤ��

��ĥ�饤�֥�����ΤȤʤ�C����Υ�������񤭤ޤ���C����Υ���
�����ҤȤĤλ��ˤϡ֥饤�֥��̾.c�פ�֤��ɤ��Ǥ��礦��C
����Υ�������ʣ��ξ��ˤϵդˡ֥饤�֥��̾.c�פȤ����ե�
����̾���򤱤�ɬ�פ�����ޤ������֥������ȥե�����ȥ⥸�塼
�����������Ū����������֥饤�֥��̾.o�פȤ����ե�����
�Ȥ����ͤ��뤫��Ǥ���

Ruby�ϳ�ĥ�饤�֥�����ɤ����ˡ�Init_�饤�֥��̾�פ�
�����ؿ��ưŪ�˼¹Ԥ��ޤ���dbm�饤�֥��ξ���Init_dbm��
�Ǥ������δؿ����ǥ��饹���⥸�塼�롤�᥽�åɡ����ʤɤ�
����Ԥ��ޤ���dbm.c��������Ѥ��ޤ���

--
Init_dbm()
{
    /* DBM���饹�������� */
    cDBM = rb_define_class("DBM", rb_cObject);
    /* DBM��Enumerate�⥸�塼��򥤥󥯥롼�ɤ��� */
    rb_include_module(cDBM, rb_mEnumerable);

    /* DBM���饹�Υ��饹�᥽�å�open(): �����C������Ǽ����� */
    rb_define_singleton_method(cDBM, "open", fdbm_s_open, -1);

    /* DBM���饹�Υ᥽�å�close(): ����Ϥʤ� */
    rb_define_method(cDBM, "close", fdbm_close, 0);
    /* DBM���饹�Υ᥽�å�[]: �����1�� */
    rb_define_method(cDBM, "[]", fdbm_fetch, 1);
		:

    /* DBM�ǡ������Ǽ���륤�󥹥����ѿ�̾�Τ����ID */
    id_dbm = rb_intern("dbm");
}
--

DBM�饤�֥���dbm�Υǡ������б����륪�֥������Ȥˤʤ�Ϥ���
�����顤C�������dbm��Ruby������˼����ɬ�פ�����ޤ���


dbm.c�Ǥ�Data_Make_Struct��ʲ��Τ褦�˻ȤäƤ��ޤ���

--
struct dbmdata {
    int  di_size;
    DBM *di_dbm;
};


obj = Data_Make_Struct(klass, struct dbmdata, 0, free_dbm, dbmp);
--

�����Ǥ�dbmstruct��¤�ΤؤΥݥ��󥿤�Data�˥��ץ��벽���Ƥ�
�ޤ���DBM*��ľ�ܥ��ץ��벽���ʤ��Τ�close()�������ν�����
���ƤΤ��ȤǤ���

Data���֥������Ȥ���dbmstruct��¤�ΤΥݥ��󥿤���Ф�����
�˰ʲ��Υޥ����ȤäƤ��ޤ���

--
#define GetDBM(obj, dbmp) {\
    Data_Get_Struct(obj, struct dbmdata, dbmp);\
    if (dbmp->di_dbm == 0) closed_dbm();\
}
--

����ä�ʣ���ʥޥ���Ǥ������פ����dbmdata��¤�ΤΥݥ���
�μ��Ф��ȡ�close����Ƥ��뤫�ɤ����Υ����å���ޤȤ�Ƥ�
�����Ǥ���

DBM���饹�ˤϤ�������᥽�åɤ�����ޤ�����ʬ�ह���3�����
����μ����������ޤ����ҤȤĤϰ���ο����Τ�Τǡ����
���Ƥ�delete�᥽�åɤ�����ޤ���delete�᥽�åɤ������Ƥ���
fdbm_delete()�Ϥ��Τ褦�ˤʤäƤ��ޤ���

--
static VALUE
fdbm_delete(obj, keystr)
    VALUE obj, keystr;
{
	:
}
--

����ο����Υ����פ���1����self����2����ʹߤ��᥽�å�
�ΰ���Ȥʤ�ޤ���

����ο�����Τ�Τ�C������Ǽ������Τ�Ruby������Ǽ���
���ΤȤ�����ޤ���dbm�饤�֥�����ǡ�C������Ǽ�������
��DBM�Υ��饹�᥽�åɤǤ���open()�Ǥ�������������Ƥ����
��fdbm_s_open()�Ϥ����ʤäƤ��ޤ���

--
static VALUE
fdbm_s_open(argc, argv, klass)
    int argc;
    VALUE *argv;
    VALUE klass;
{
	:
    if (rb_scan_args(argc, argv, "11", &file, &vmode) == 1) {
	mode = 0666;		/* default value */
    }
	:
}
--

���Υ����פδؿ����1����Ϳ����줿����ο���2����Ϳ��
��줿�������äƤ�������ˤʤ�ޤ���self����3����Ȥ���Ϳ
�����ޤ���

���������Ϳ����줿������Ϥ��뤿��δؿ�open()�Ǥ�Ȥ�
��Ƥ���rb_scan_args()�Ǥ�����3����˻��ꤷ���ե����ޥåȤ�
��������4�ѿ�ʹߤ˻��ꤷ���ѿ���ͤ�������Ƥ���ޤ�������
�ե����ޥåȤϡ���1ʸ���ܤ���ά�Ǥ��ʤ�����ο���2ʸ���ܤ�
��ά�Ǥ�����ο���3ʸ���ܤ��б������̵꤬�����ޤ�ΰ�
����뤫�ɤ����򼨤�"*"�Ǥ���2ʸ���ܤ�3ʸ���ܤϾ�ά�Ǥ���
����dbm.c����Ǥϡ��ե����ޥåȤ�"11"�Ǥ����顤����Ϻ���1��
�ǡ�2�Ĥޤǵ������Ȥ�����̣�ˤʤ�ޤ�����ά����Ƥ�����
�ѿ���ͤ�nil(C����Υ�٥�Ǥ�Qnil)�ˤʤ�ޤ���

Ruby������ǰ���������Τ�indexes������ޤ�������Ϥ�
���Ǥ���

--
static VALUE
fdbm_indexes(obj, args)
    VALUE obj, args;
{
	:
}
--

��1�����self����2�����Ruby������Ǥ���

** ��ջ���

Ruby�ȶ�ͭ�Ϥ��ʤ���Ruby�Υ��֥������Ȥ��Ǽ�����ǽ���Τ���
C������ѿ�ϰʲ��δؿ��Ȥä�Ruby���󥿥ץ꥿���ѿ��¸��
�򶵤��Ƥ����Ƥ����������Ǥʤ���GC�ǥȥ�֥�򵯤����ޤ���

  void rb_global_variable(VALUE *var)

(4) extconf.rb���Ѱդ���

Makefile������ο����ˤʤ�extconf.rb�Ȥ����ե��������
�ޤ���extconf.rb�ϥ饤�֥��Υ���ѥ����ɬ�פʾ��Υ�����
���ʤɤ�Ԥ����Ȥ���Ū�Ǥ����ޤ���

  require 'mkmf'

��extconf.rb���Ƭ���֤��ޤ���extconf.rb����Ǥϰʲ���Ruby��
���Ȥ����Ȥ�����ޤ���

  have_library(lib, func): �饤�֥���¸�ߥ����å�
  have_func(func, header): �ؿ��¸�ߥ����å�
  have_header(header): �إå��ե������¸�ߥ����å�
  create_makefile(target): Makefile�����

�ʲ����ѿ��Ȥ����Ȥ��Ǥ��ޤ���

  $CFLAGS: ����ѥ������ɲ�Ū�˻��ꤹ��ե饰(-O�ʤ�)
  $CPPFLAGS: �ץ�ץ��å����ɲ�Ū�˻��ꤹ��ե饰(-I��-D�ʤ�)
  $LDFLAGS: ��󥯻����ɲ�Ū�˻��ꤹ��ե饰(-L�ʤ�)
  $objs: ��󥯤���륪�֥������ȥե�����̾�Υꥹ��

���֥������ȥե�����Υꥹ�Ȥϡ��̾�ϥ������ե�����򸡺���
�Ƽ�ưŪ���������ޤ�����make������ǥ������������褦��
�������Ū�˻��ꤹ��ɬ�פ�����ޤ���

�饤�֥��򥳥�ѥ��뤹���郎·�鷺�����Υ饤�֥��򥳥�
�ѥ��뤷�ʤ����ˤ�create_makefile��ƤФʤ����Makefile���
�����줺������ѥ����Ԥ��ޤ���

(5) depend���Ѱդ���

�⤷���ǥ��쥯�ȥ��depend�Ȥ����ե����뤬¸�ߤ���С�
Makefile����¸�ط�����å����Ƥ���ޤ���

  % gcc -MM *.c > depend

�ʤɤǺ�뤳�Ȥ�����ޤ������ä�»��̵���Ǥ��礦��

(6) Makefile�������

Makefile��ºݤ�������뤿��ˤ�

  ruby extconf.rb

�Ȥ��ޤ���extconf.rb�� require 'mkmf' �ιԤ��ʤ����ˤϥ��顼
�ˤʤ�ޤ��Τǡ�������ɲä���

  ruby -r mkmf extconf.rb

�Ȥ��Ƥ���������

site_ruby �ǥ��쥯�ȥ�Ǥʤ���
vendor_ruby �ǥ��쥯�ȥ�˥��󥹥ȡ��뤹����ˤ�
�ʲ��Τ褦�� --vendor ���ץ�����ä��Ƥ���������

  ruby extconf.rb --vendor

�ǥ��쥯�ȥ��ext�ʲ����Ѱդ������ˤ�Ruby���Τ�make�λ���
��ưŪ��Makefile����������ޤ��Τǡ����Υ��ƥåפ����פǤ���

(7) make����

ưŪ��󥯥饤�֥����������ˤϤ��ξ��make���Ƥ�����
����ɬ�פǤ���� make install �ǥ��󥹥ȡ��뤵��ޤ���

ext�ʲ��˥ǥ��쥯�ȥ���Ѱդ������ϡ�Ruby�Υǥ��쥯�ȥ��
make��¹Ԥ����Makefile�������make��ɬ�פˤ�äƤϤ��Υ�
���塼���Ruby�ؤΥ�󥯤ޤǼ�ưŪ�˼¹Ԥ��Ƥ���ޤ���
extconf.rb��񤭴�����ʤɤ���Makefile�κ������ɬ�פʻ��Ϥ�
��Ruby�ǥ��쥯�ȥ��make���Ƥ���������

��ĥ�饤�֥���make install��Ruby�饤�֥��Υǥ��쥯�ȥ��
���˥��ԡ�����ޤ����⤷��ĥ�饤�֥��ȶ�Ĵ���ƻȤ�Ruby�ǵ�
�Ҥ��줿�ץ���ब���ꡤRuby�饤�֥����֤��������ˤϡ�
��ĥ�饤�֥���ѤΥǥ��쥯�ȥ�β��� lib �Ȥ����ǥ��쥯�ȥ�
���ꡤ������ ��ĥ�� .rb �Υե�������֤��Ƥ�����Ʊ���˥���
���ȡ��뤵��ޤ���

(8) �ǥХå�

�ޤ����ǥХå����ʤ���ư���ʤ��Ǥ��礦�͡�ext/Setup�˥ǥ���
���ȥ�̾��񤯤��Ū�˥�󥯤���ΤǥǥХå����Ȥ���褦�ˤ�
��ޤ�������ʬ����ѥ��뤬�٤��ʤ�ޤ����ɡ�

(9) �Ǥ�������

��Ϥ��ä���Ȥ��ʤꡤ������������ʤꡤ���ʤꡤ����ͳ�ˤ�
�Ȥ�����������Ruby�κ�Ԥϳ�ĥ�饤�֥��˴ؤ��ư�ڤθ����
��ĥ���ޤ���

Appendix A. Ruby�Υ����������ɤ�ʬ��

Ruby�Υ������Ϥ����Ĥ���ʬ�ह�뤳�Ȥ�����ޤ������Τ�������
���饤�֥�����ʬ�ϴ���Ū�˳�ĥ�饤�֥���Ʊ�������ˤʤ�
�Ƥ��ޤ��������Υ������Ϻ��ޤǤ����ǤۤȤ�����Ǥ����
�פ��ޤ���

Ruby�������

  class.c
  error.c
  eval.c
  gc.c
  object.c
  parse.y
  variable.c

�桼�ƥ���ƥ��ؿ�

  dln.c
  regex.c
  st.c
  util.c

Ruby���ޥ�ɤμ��

  dmyext.c
  inits.c
  main.c
  ruby.c
  version.c

���饹�饤�֥��

  array.c
  bignum.c
  compar.c
  dir.c
  enum.c
  file.c
  hash.c
  io.c
  marshal.c
  math.c
  numeric.c
  pack.c
  prec.c
  process.c
  random.c
  range.c
  re.c
  signal.c
  sprintf.c
  string.c
  struct.c
  time.c

Appendix B. ��ĥ�Ѵؿ��ե����

C���줫��Ruby�ε�ǽ����Ѥ���API�ϰʲ����̤�Ǥ��롥

** ��

VALUE

  Ruby���֥������Ȥ�ɽ�����뷿��ɬ�פ˱����ƥ��㥹�Ȥ����Ѥ��롥
  �Ȥ߹��߷���ɽ������C�η���ruby.h�˵��Ҥ��Ƥ���R�ǻϤޤ빽¤
  �ΤǤ��롥VALUE���򤳤��˥��㥹�Ȥ��뤿���R�ǻϤޤ빽¤��
  ̾�����ʸ���ˤ���̾���Υޥ����Ѱդ���Ƥ��롥

** �ѿ����

Qnil

  ���: nil���֥�������

Qtrue

  ���: true���֥�������(���Υǥե������)

Qfalse

  ���: false���֥�������

** C�ǡ����Υ��ץ��벽

Data_Wrap_Struct(VALUE klass, void (*mark)(), void (*free)(), void *sval)

  C��Ǥ�դΥݥ��󥿤򥫥ץ��벽����Ruby���֥������Ȥ��֤�����
  �Υݥ��󥿤�Ruby���饢����������ʤ��ʤä�����free�ǻ��ꤷ��
  �ؿ�ƤФ�롥�ޤ������Υݥ��󥿤λؤ��ǡ�����¾��Ruby����
  �������Ȥ�ؤ��Ƥ����硤mark�˻��ꤹ��ؿ�ǥޡ�������ɬ��
  �����롥

Data_Make_Struct(klass, type, mark, free, sval)

  type���Υ����malloc�����ѿ�sval����������塤����򥫥ץ�
  �벽�����ǡ������֤��ޥ���

Data_Get_Struct(data, type, sval)

  data����type���Υݥ��󥿤���Ф��ѿ�sval���������ޥ���

** �������å�

TYPE(value)
FIXNUM_P(value)
NIL_P(value)
void Check_Type(VALUE value, int type)
void Check_SafeStr(VALUE value)

** ���Ѵ�

FIX2INT(value)
INT2FIX(i)
NUM2INT(value)
INT2NUM(i)
NUM2DBL(value)
rb_float_new(f)
StringValue(value)
StringValuePtr(value)
StringValueCStr(value)
rb_str_new2(s)

** ���饹/�⥸�塼����

VALUE rb_define_class(const char *name, VALUE super)

  super�Υ��֥��饹�Ȥ��ƿ�����Ruby���饹�������롥

VALUE rb_define_class_under(VALUE module, const char *name, VALUE super)

  super�Υ��֥��饹�Ȥ��ƿ�����Ruby���饹��������module��
  ���Ȥ��������롥

VALUE rb_define_module(const char *name)

  ������Ruby�⥸�塼��������롥

VALUE rb_define_module_under(VALUE module, const char *name)

  ������Ruby�⥸�塼���������module�����Ȥ��������롥

void rb_include_module(VALUE klass, VALUE module)

  �⥸�塼��򥤥󥯥롼�ɤ��롥class�����Ǥ�module�򥤥�
  �롼�ɤ��Ƥ����ˤϲ��⤷�ʤ�(¿�ť��󥯥롼�ɤζػ�)��

void rb_extend_object(VALUE object, VALUE module)

  ���֥������Ȥ�⥸�塼��(��������Ƥ���᥽�å�)�dz�ĥ���롥

** ����ѿ���

void rb_define_variable(const char *name, VALUE *var)

  Ruby��C�ȤǶ�ͭ���륰���Х��ѿ�������롥�ѿ�̾��`$'��
  �Ϥޤ�ʤ����ˤϼ�ưŪ���ɲä���롥name�Ȥ���Ruby�μ��̻�
  �Ȥ��Ƶ�����ʤ�ʸ��(�㤨��` ')��ޤ���ˤ�Ruby�ץ���
  �फ��ϸ����ʤ��ʤ롥

void rb_define_readonly_variable(const char *name, VALUE *var)

  Ruby��C�ȤǶ�ͭ����read only�Υ����Х��ѿ�������롥
  read only�Ǥ��뤳�Ȱʳ���rb_define_variable()��Ʊ����

void rb_define_virtual_variable(const char *name,
				VALUE (*getter)(), void (*setter)())

  �ؿ�ˤ�äƼ¸������Ruby�ѿ�������롥�ѿ���Ȥ��줿
  ���ˤ�getter�����ѿ���ͤ����åȤ��줿���ˤ�setter���ƤФ�
  �롥

void rb_define_hooked_variable(const char *name, VALUE *var,
			       VALUE (*getter)(), void (*setter)())

  �ؿ�ˤ�ä�hook�ΤĤ���줿�����Х��ѿ�������롥�ѿ�
  �����Ȥ��줿���ˤ�getter�����ؿ���ͤ����åȤ��줿���ˤ�
  setter���ƤФ�롥getter��setter��0����ꤷ�����ˤ�hook��
  ���ꤷ�ʤ��Τ�Ʊ�����ˤʤ롥

void rb_global_variable(VALUE *var)

  GC�Τ��ᡤRuby�ץ���फ��ϥ�����������ʤ���, Ruby����
  �������Ȥ�ޤ�����ѿ��ޡ������롥

** ���

void rb_define_const(VALUE klass, const char *name, VALUE val)

  ���������롥

void rb_define_global_const(const char *name, VALUE val)

  ������������롥

     rb_define_const(rb_cObject, name, val)

  ��Ʊ����̣��

** �᥽�å���

rb_define_method(VALUE klass, const char *name, VALUE (*func)(), int argc)

  �᥽�åɤ������롥argc��self�������ο�argc��-1�λ�, 
  �ؿ�ˤϰ���ο�(self��ޤޤʤ�)����1����, ������������2
  ����Ȥ�������Ϳ������(��3�����self)��argc��-2�λ�, 
  ��1����self, ��2����args(args�ϰ����ޤ�Ruby������)��
  ����������Ϳ�����롥
 
rb_define_private_method(VALUE klass, const char *name, VALUE (*func)(), int argc)

  private�᥽�åɤ������롥�����rb_define_method()��Ʊ����

rb_define_singleton_method(VALUE klass, const char *name, VALUE (*func)(), int argc)

  �ðۥ᥽�åɤ������롥�����rb_define_method()��Ʊ����

rb_scan_args(int argc, VALUE *argv, const char *fmt, ...)

  argc, argv������Ϳ����줿�����ʬ�򤹤롥fmt��ɬ�ܰ���ο�, 
  �ղð���ο�, �Ĥ�ΰ�����뤫����ꤹ��ʸ�����, "��
  ��*"�Ȥ��������Ǥ��롥 2 ���ܤο��"*"�Ϥ��줾���ά��
  ǽ�Ǥ��롥ɬ�ܰ����Ĥ�ʤ�����0����ꤹ�롥��3�����
  �ߤ��ѿ�ؤΥݥ��󥿤�, ���������Ǥ������ѿ�˳�Ǽ����롥
  �ղð�����б�������Ϳ�����Ƥ��ʤ������ѿ��Qnil��
  �������롥

** Ruby�᥽�åɸƤӽФ�

VALUE rb_funcall(VALUE recv, ID mid, int narg, ...)

  �᥽�åɸƤӽФ���ʸ���󤫤�mid����뤿��ˤ�rb_intern()��
  �Ȥ���

VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv)

  �᥽�åɸƤӽФ��������argc, argv�������Ϥ���

VALUE rb_eval_string(const char *str)

  ʸ�����Ruby������ץȤȤ��ƥ���ѥ��롦�¹Ԥ��롥

ID rb_intern(const char *name)

  ʸ������б�����ID���֤���

char *rb_id2name(ID id)

  ID���б�����ʸ������֤�(�ǥХå���)��

char *rb_class2name(VALUE klass)

  ���饹��̾�����֤�(�ǥХå���)�����饹��̾������ʤ����ˤ�, 
  ����̤ä�̾����ĥ��饹��̾�����֤���

int rb_respond_to(VALUE obj, ID id)

  obj��id�Ǽ������᥽�åɤ�Ĥ��ɤ������֤���

** ���󥹥����ѿ�

VALUE rb_iv_get(VALUE obj, const char *name)

  obj�Υ��󥹥����ѿ���ͤ���롥`@'�ǻϤޤ�ʤ����󥹥���
  ���ѿ�� Ruby�ץ���फ�饢�������Ǥ��ʤ��ֱ��줿�ץ���
  �������ѿ�ˤʤ롥������ʸ����̾����ĥ��饹(�ޤ���
  �⥸�塼��)�Υ��󥹥����ѿ�Ȥ��Ƽ������Ƥ��롥

VALUE rb_iv_set(VALUE obj, const char *name, VALUE val)

  obj�Υ��󥹥����ѿ��val�˥��åȤ��롥

** ���湽¤

VALUE rb_iterate(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2)

  func2��֥�å��Ȥ�����ꤷ, func1�򥤥ƥ졼���Ȥ��ƸƤ֡� 
  func1�ˤ� arg1������Ȥ����Ϥ���, func2�ˤ���1����˥��ƥ졼
  ������Ϳ����줿��, ��2�����arg2���Ϥ���롥
 
VALUE rb_yield(VALUE val)

  val���ͤȤ��ƥ��ƥ졼���֥�å���ƤӽФ���

VALUE rb_rescue(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2)

  �ؿ�func1��arg1���˸ƤӽФ���func1�μ¹�����㳰��ȯ��
  �������ˤ� func2��arg2���Ȥ��ƸƤ֡�����ͤ��㳰��ȯ��
  ���ʤ��ä�����func1�������, �㳰��ȯ���������ˤ�func2����
  ���ͤǤ��롥

VALUE rb_ensure(VALUE (*func1)(), VALUE arg1, void (*func2)(), VALUE arg2)

  �ؿ�func1��arg1���Ȥ��Ƽ¹Ԥ�, �¹Խ�λ��(���Ȥ��㳰��
  ȯ�����Ƥ�) func2��arg2���Ȥ��Ƽ¹Ԥ��롥����ͤ�func1
  ������ͤǤ���(�㳰��ȯ�������������ʤ�)��

** �㳰�����顼

void rb_warning(const char *fmt, ...)

  rb_verbose����ɸ�२�顼���Ϥ˷ٹ�����ɽ�����롥�����
  printf()��Ʊ����

void rb_raise(rb_eRuntimeError, const char *fmt, ...)

  RuntimeError�㳰��ȯ�������롥�����printf()��Ʊ����

void rb_raise(VALUE exception, const char *fmt, ...)

  exception�ǻ��ꤷ���㳰��ȯ�������롥fmt�ʲ��ΰ����
  printf()��Ʊ����

void rb_fatal(const char *fmt, ...)

  ��̿Ū�㳰��ȯ�������롥�̾���㳰����ϹԤʤ�줺, ���󥿡�
  �ץ꥿����λ����(������ensure�ǻ��ꤵ�줿�����ɤϽ�λ����
  �¹Ԥ����)��

void rb_bug(const char *fmt, ...)

  ���󥿡��ץ꥿�ʤɥץ����ΥХ��Ǥ���ȯ������Ϥ��Τʤ�
  �����λ��Ƥ֡����󥿡��ץ꥿�ϥ�������פ�ľ���˽�λ���롥
  �㳰����ϰ�ڹԤʤ��ʤ���

** Ruby�ν������¹�

Ruby�򥢥ץꥱ���������������ˤϰʲ��Υ��󥿥ե�����
��Ȥ����̾�γ�ĥ�饤�֥��ˤ�ɬ�פʤ���

void ruby_init()

  Ruby���󥿥ץ꥿�ν�����Ԥʤ���

void ruby_options(int argc, char **argv)

  Ruby���󥿥ץ꥿�Υ��ޥ�ɥ饤���ν����Ԥʤ���

void ruby_run()

  Ruby���󥿥ץ꥿��¹Ԥ��롥

void ruby_script(char *name)

  Ruby�Υ�����ץ�̾($0)����ꤹ�롥


Appendix C. extconf.rb�ǻȤ���ؿ��

extconf.rb����Ǥ���Ѳ�ǽ�ʥ���ѥ��������å��δؿ�ϰ�
�����̤�Ǥ��롥

have_macro(macro, headers)

  �إå��ե�����header�򥤥󥯥롼�ɤ��ƥޥ���macro������
  ��Ƥ��뤫�ɤ��������å����롥�ޥ���������Ƥ���true
  ���֤���

have_library(lib, func)

  �ؿ�func�������Ƥ���饤�֥��lib��¸�ߤ���å����롥
  �饤�֥�꤬¸�ߤ�����true���֤���

find_library(lib, func, path...)

  �ؿ�func�������Ƥ���饤�֥��lib��¸�ߤ� -Lpath ���ɲ�
  ���ʤ������å����롥�饤�֥�꤬���դ��ä�����true���֤���

have_func(func, header)

  �إå��ե�����header�򥤥󥯥롼�ɤ��ƴؿ�func��¸�ߤ����
  �����롥func��ɸ��Ǥϥ�󥯤���ʤ��饤�֥����Τ�ΤǤ�
  ���ˤ���have_library�Ǥ��Υ饤�֥�����å����Ƥ���
  �����ؿ�¸�ߤ���true���֤���

have_var(var, header)

  �إå��ե�����header�򥤥󥯥롼�ɤ����ѿ�var��¸�ߤ����
  �����롥var��ɸ��Ǥϥ�󥯤���ʤ��饤�֥����Τ�ΤǤ�
  ���ˤ���have_library�Ǥ��Υ饤�֥�����å����Ƥ���
  �����ѿ�¸�ߤ���true���֤���

have_header(header)

  �إå��ե������¸�ߤ���å����롥�إå��ե����뤬¸�ߤ�
  ��true���֤���

find_header(header, path...)

  �إå��ե�����header��¸�ߤ� -Ipath ���ɲä��ʤ������å�
  ���롥�إå��ե����뤬���դ��ä�����true���֤���

have_struct_member(type, member, header)

  �إå��ե�����header�򥤥󥯥롼�ɤ��Ʒ�type�˥���member
  ��¸�ߤ��뤫����å����롥type��������Ƥ��ơ�member��
  ���Ĥ���true���֤���

have_type(type, header, opt)

  �إå��ե�����header�򥤥󥯥롼�ɤ��Ʒ�type��¸�ߤ��뤫��
  �����å����롥type��������Ƥ���true���֤���

check_sizeof(type, header)

  �إå��ե�����header�򥤥󥯥롼�ɤ��Ʒ�type��charñ�̥���
  ����Ĵ�٤롥type��������Ƥ������Υ��������֤�������
  ��Ƥ��ʤ��Ȥ���nil���֤���

create_makefile(target)

  ��ĥ�饤�֥���Ѥ�Makefile������롥���δؿ��ƤФʤ���
  �Ф��Υ饤�֥��ϥ���ѥ��뤵��ʤ���target�ϥ⥸�塼��̾
  ��ɽ����

find_executable(command, path)

  ���ޥ��command��File::PATH_SEPARATOR�Ƕ�ڤ�줿�ѥ�̾��
  �ꥹ��path����õ����path��nil�ޤ��Ͼ�ά���줿���ϡ��Ķ�
  �ѿ�PATH���ͤ���Ѥ��롥�¹Բ�ǽ�ʥ��ޥ�ɤ����Ĥ��ä����
  �ϥѥ���ޤ�ե�����̾�����Ĥ���ʤ��ä�����nil���֤���

with_config(withval[, default=nil])

  ���ޥ�ɥ饤����--with-<withval>�ǻ��ꤵ�줿���ץ�����ͤ���롥

enable_config(config, *defaults)
disable_config(config, *defaults)

  ���ޥ�ɥ饤����--enable-<config>�ޤ���
  --disable-<config>�ǻ��ꤵ�줿�����ͤ���롥
  --enable-<config>�����ꤵ��Ƥ�������true��
  --disable-<config>�����ꤵ��Ƥ�������false���֤���
  �ɤ������ꤵ��Ƥ��ʤ����ϡ��֥�å��Ĥ��ǸƤӽФ���Ƥ������
  *defaults��yield������̡��֥�å��ʤ��ʤ�*defaults���֤���

dir_config(target[, default_dir])
dir_config(target[, default_include, default_lib])

  ���ޥ�ɥ饤����--with-<target>-dir, --with-<target>-include,
  --with-<target>-lib�Τ����줫�ǻ��ꤵ���ǥ��쥯�ȥ��
  $CFLAGS �� $LDFLAGS ���ɲä��롥--with-<target>-dir=/path��
  --with-<target>-include=/path/include --with-<target>-lib=/path/lib
  ������Ǥ��롥�ɲä��줿 include �ǥ��쥯�ȥ�� lib �ǥ��쥯�ȥ��
  ������֤��� ([include_dir, lib_dir])

pkg_config(pkg)

  pkg-config���ޥ�ɤ���ѥå�����pkg�ξ������롥 
  pkg-config�μºݤΥ��ޥ��̾�ϡ�--with-pkg-config���ޥ��
  �饤�󥪥ץ����ǻ����ǽ��

/*
 * Local variables:
 * fill-column: 60
 * end:
 */
PK-|[�¦��	�	doc/alt-ruby18/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 GPL
version 2 (see the file GPL), 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-|[��)8��doc/alt-ruby18/READMEnu�[���* 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(ex. class, method calls)
  + *Advanced* Object-Oriented features(ex. Mix-in, Singleton-method)
  + Operator Overloading
  + Exception Handling
  + Iterators and Closures
  + Garbage Collection
  + Dynamic Loading of Object files(on some architecture)
  + Highly Portable(works on many UNIX machines, and on DOS,
    Windows, Mac, BeOS etc.)


* How to get Ruby

The Ruby distribution files can be found in the following FTP site:

  ftp://ftp.ruby-lang.org/pub/ruby/

The latest source code of this version series can be checked out
through SVN with the following command:

  $ svn co http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8/

The trunk of the Ruby source tree can be checked out with the
following command:

  $ svn co http://svn.ruby-lang.org/repos/ruby/trunk/ ruby

There are some other branches under development.  Try the following
command and see the list of branches:

  $ svn ls http://svn.ruby-lang.org/repos/ruby/branches/


* Ruby home-page

The URL of the Ruby home-page is:

   http://www.ruby-lang.org/


* Mailing list

There is a mailing list to talk about Ruby.
To subscribe this list, please send the following phrase

	subscribe YourFirstName YourFamilyName
e.g.
        subscribe Joseph Smith

in the mail body (not subject) to the address <ruby-talk-ctl@ruby-lang.org>.


* How to compile and install

This is what you need to do to compile and install Ruby:

  1. If ./configure does not exist or is older than configure.in,
     run autoconf to (re)generate configure.

  2. 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.

  3. Edit defines.h if you need.  Usually this step will not be needed.

  4. 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 does not allow dynamic loading),
     remove comment mark from the line "#option nodynamic" in
     ext/Setup.

  5. Run make.

  6. Optionally, run 'make test' to check whether the compiled Ruby
     interpreter works well.  If you see the message "test succeeded",
     your ruby works as it should (hopefully).

  7. Run 'make install'

     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.


* Copying

See the file COPYING.


* The Author

Feel free to send comments and bug reports to the author.  Here is the 
author's latest mail address:

  matz@netlab.jp

-------------------------------------------------------
created at: Thu Aug  3 11:57:36 JST 1995
Local variables:
mode: indented-text
end:
PK-|[�2��>g>gdoc/alt-ruby18/LGPLnu�[���		  GNU LESSER GENERAL PUBLIC LICENSE
		       Version 2.1, February 1999

 Copyright (C) 1991, 1999 Free Software Foundation, Inc.
     59 Temple Place, Suite 330, Boston, MA  02111-1307  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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.|[	R0�YFYFdoc/alt-ruby18/GPLnu�[���		    GNU GENERAL PUBLIC LICENSE
		       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
                       59 Temple Place, Suite 330, Boston, MA  02111-1307  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 Library 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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 Library General
Public License instead of this License.
PK.|[c�x�� ri/1.8/system/Fixnum/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of <em>bytes</em> in the machine representation of a <tt>Fixnum</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   1.size            #=&gt; 4\n   -1.size           #=&gt; 4\n   2147483647.size   #=&gt; 4\n"
full_name: Fixnum#size
is_singleton: false
name: size
params: |
  fix.size -> fixnum

visibility: public
PK.|[�#�QQ"ri/1.8/system/Fixnum/rpower-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: "**"
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a Rational number if the result is in fact rational (i.e. <tt>other</tt> &lt; 0).
full_name: Fixnum#rpower
is_singleton: false
name: rpower
params: (other)
visibility: public
PK.|[��f3"ri/1.8/system/Fixnum/odd%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>fix</em> is an odd number.
full_name: Fixnum#odd?
is_singleton: false
name: odd?
params: |
  fix.odd? -> true or false

visibility: public
PK.|[�CBbbri/1.8/system/Fixnum/%25-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>fix</tt> modulo <tt>other</tt>. See <tt>Numeric.divmod</tt> for more information.
full_name: Fixnum#%
is_singleton: false
name: "%"
params: |
  fix % other         => Numeric
  fix.modulo(other)   => Numeric

visibility: public
PK.|[�1j�WW"ri/1.8/system/Fixnum/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Bit Reference---Returns the <em>n</em>th bit in the binary representation of <em>fix</em>, where <em>fix</em>[0] is the least significant bit.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = 0b11001100101010\n   30.downto(0) do |n| print a[n] end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   0000000000000000011001100101010\n"
full_name: Fixnum#[]
is_singleton: false
name: "[]"
params: |
  fix[n]     => 0, 1

visibility: public
PK/|[�A�s�� ri/1.8/system/Fixnum/fdiv-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the floating point result of dividing <em>fix</em> by <em>numeric</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   654321.quo(13731)      #=&gt; 47.6528293642124\n   654321.quo(13731.24)   #=&gt; 47.6519964693647\n"
full_name: Fixnum#fdiv
is_singleton: false
name: fdiv
params: |
  fix.quo(numeric)    => float
  fix.fdiv(numeric)   => float

visibility: public
PK/|[>E��"ri/1.8/system/Fixnum/%2a%2a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #rpower"
full_name: Fixnum#**
is_singleton: false
name: "**"
params: (other)
visibility: public
PK/|[��Z��%ri/1.8/system/Fixnum/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Comparison---Returns -1, 0, or +1 depending on whether <em>fix</em> is less than, equal to, or greater than <em>numeric</em>. This is the basis for the tests in <tt>Comparable</tt>.
full_name: Fixnum#<=>
is_singleton: false
name: <=>
params: |
  fix <=> numeric    => -1, 0, +1

visibility: public
PK/|[��.���ri/1.8/system/Fixnum/%2f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #quo"
full_name: Fixnum#/
is_singleton: false
name: /
params: (p1)
visibility: public
PK/|[��B���ri/1.8/system/Fixnum/%7c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Bitwise OR.
full_name: Fixnum#|
is_singleton: false
name: "|"
params: |
  fix | other     => integer

visibility: public
PK/|[���		"ri/1.8/system/Fixnum/divmod-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>Numeric#divmod</tt>.
full_name: Fixnum#divmod
is_singleton: false
name: divmod
params: |
  fix.divmod(numeric)    => array

visibility: public
PK0|[�S���ri/1.8/system/Fixnum/%26-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Bitwise AND.
full_name: Fixnum#&
is_singleton: false
name: "&"
params: |
  fix & other     => integer

visibility: public
PK0|[Z�-�22ri/1.8/system/Fixnum/quo-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: /
- !ruby/object:RI::AliasName 
  name: rdiv
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the floating point result of dividing <em>fix</em> by <em>numeric</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   654321.quo(13731)      #=&gt; 47.6528293642124\n   654321.quo(13731.24)   #=&gt; 47.6519964693647\n"
full_name: Fixnum#quo
is_singleton: false
name: quo
params: |
  fix.quo(numeric)    => float
  fix.fdiv(numeric)   => float

visibility: public
PK0|[��;;ri/1.8/system/Fixnum/%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the value of <tt>fix</tt> is less than that of <tt>other</tt>.
full_name: Fixnum#<
is_singleton: false
name: <
params: |
  fix < other     => true or false

visibility: public
PK0|[Y�DRII"ri/1.8/system/Fixnum/%3c%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the value of <tt>fix</tt> is less thanor equal to that of <tt>other</tt>.
full_name: Fixnum#<=
is_singleton: false
name: <=
params: |
  fix <= other     => true or false

visibility: public
PK0|[|�5���#ri/1.8/system/Fixnum/id2name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the name of the object whose symbol id is <em>fix</em>. If there is no symbol in the symbol table with this value, returns <tt>nil</tt>. <tt>id2name</tt> has nothing to do with the <tt>Object.id</tt> method. See also <tt>Fixnum#to_sym</tt>, <tt>String#intern</tt>, and class <tt>Symbol</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   symbol = :@inst_var    #=&gt; :@inst_var\n   id     = symbol.to_i   #=&gt; 9818\n   id.id2name             #=&gt; &quot;@inst_var&quot;\n"
full_name: Fixnum#id2name
is_singleton: false
name: id2name
params: |
  fix.id2name -> string or nil

visibility: public
PK0|[�jʧkkri/1.8/system/Fixnum/abs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the absolute value of <em>fix</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   -12345.abs   #=&gt; 12345\n   12345.abs    #=&gt; 12345\n"
full_name: Fixnum#abs
is_singleton: false
name: abs
params: |
  fix.abs -> aFixnum

visibility: public
PK0|[#��OO"ri/1.8/system/Fixnum/%3e%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the value of <tt>fix</tt> is greater than or equal to that of <tt>other</tt>.
full_name: Fixnum#>=
is_singleton: false
name: ">="
params: |
  fix >= other     => true or false

visibility: public
PK0|['>��qqri/1.8/system/Fixnum/%2a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Performs multiplication: the class of the resulting object depends on the class of <tt>numeric</tt> and on the magnitude of the result."
full_name: Fixnum#*
is_singleton: false
name: "*"
params: |
  fix * numeric   =>  numeric_result

visibility: public
PK0|[+ך`��$ri/1.8/system/Fixnum/power%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #**"
full_name: Fixnum#power!
is_singleton: false
name: power!
params: (p1)
visibility: public
PK1|[��Ytri/1.8/system/Fixnum/%7e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "One's complement: returns a number where each bit is flipped."
full_name: Fixnum#~
is_singleton: false
name: "~"
params: |
  ~fix     => integer

visibility: public
PK1|[�&��� ri/1.8/system/Fixnum/rdiv-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #quo"
full_name: Fixnum#rdiv
is_singleton: false
name: rdiv
params: (p1)
visibility: public
PK1|[��ó��"ri/1.8/system/Fixnum/to_sym-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the symbol whose integer value is <em>fix</em>. See also <tt>Fixnum#id2name</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   fred = :fred.to_i\n   fred.id2name   #=&gt; &quot;fred&quot;\n   fred.to_sym    #=&gt; :fred\n"
full_name: Fixnum#to_sym
is_singleton: false
name: to_sym
params: |
  fix.to_sym -> aSymbol

visibility: public
PK1|[GD�!;;"ri/1.8/system/Fixnum/%3e%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Shifts <em>fix</em> right <em>count</em> positions (left if <em>count</em> is negative).
full_name: Fixnum#>>
is_singleton: false
name: ">>"
params: |
  fix >> count     => integer

visibility: public
PK1|[����KK&ri/1.8/system/Fixnum/cdesc-Fixnum.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: induced_from
comment: 
- !ruby/struct:SM::Flow::P 
  body: A <tt>Fixnum</tt> holds <tt>Integer</tt> values that can be represented in a native machine word (minus 1 bit). If any operation on a <tt>Fixnum</tt> exceeds this range, the value is automatically converted to a <tt>Bignum</tt>.
- !ruby/struct:SM::Flow::P 
  body: <tt>Fixnum</tt> objects have immediate value. This means that when they are assigned or passed as parameters, the actual object is passed, rather than a reference to that object. Assignment does not alias <tt>Fixnum</tt> objects. There is effectively only one <tt>Fixnum</tt> object instance for any given integer value, so, for example, you cannot add a singleton method to a <tt>Fixnum</tt>.
constants: []

full_name: Fixnum
includes: 
- !ruby/object:RI::IncludedModule 
  name: Precision
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "%"
- !ruby/object:RI::MethodSummary 
  name: "&"
- !ruby/object:RI::MethodSummary 
  name: "*"
- !ruby/object:RI::MethodSummary 
  name: "**"
- !ruby/object:RI::MethodSummary 
  name: "**"
- !ruby/object:RI::MethodSummary 
  name: +
- !ruby/object:RI::MethodSummary 
  name: "-"
- !ruby/object:RI::MethodSummary 
  name: -@
- !ruby/object:RI::MethodSummary 
  name: /
- !ruby/object:RI::MethodSummary 
  name: /
- !ruby/object:RI::MethodSummary 
  name: <
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: <=
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: ">"
- !ruby/object:RI::MethodSummary 
  name: ">="
- !ruby/object:RI::MethodSummary 
  name: ">>"
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: ^
- !ruby/object:RI::MethodSummary 
  name: abs
- !ruby/object:RI::MethodSummary 
  name: dclone
- !ruby/object:RI::MethodSummary 
  name: div
- !ruby/object:RI::MethodSummary 
  name: divmod
- !ruby/object:RI::MethodSummary 
  name: even?
- !ruby/object:RI::MethodSummary 
  name: fdiv
- !ruby/object:RI::MethodSummary 
  name: id2name
- !ruby/object:RI::MethodSummary 
  name: modulo
- !ruby/object:RI::MethodSummary 
  name: odd?
- !ruby/object:RI::MethodSummary 
  name: power!
- !ruby/object:RI::MethodSummary 
  name: quo
- !ruby/object:RI::MethodSummary 
  name: quo
- !ruby/object:RI::MethodSummary 
  name: rdiv
- !ruby/object:RI::MethodSummary 
  name: rpower
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: to_f
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: to_sym
- !ruby/object:RI::MethodSummary 
  name: zero?
- !ruby/object:RI::MethodSummary 
  name: "|"
- !ruby/object:RI::MethodSummary 
  name: "~"
name: Fixnum
superclass: Integer
PK1|[���N#ri/1.8/system/Fixnum/zero%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>fix</em> is zero.
full_name: Fixnum#zero?
is_singleton: false
name: zero?
params: |
  fix.zero?    => true or false

visibility: public
PK1|[s8q6iiri/1.8/system/Fixnum/%2b-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Performs addition: the class of the resulting object depends on the class of <tt>numeric</tt> and on the magnitude of the result."
full_name: Fixnum#+
is_singleton: false
name: +
params: |
  fix + numeric   =>  numeric_result

visibility: public
PK1|[4��;;"ri/1.8/system/Fixnum/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Shifts <em>fix</em> left <em>count</em> positions (right if <em>count</em> is negative).
full_name: Fixnum#<<
is_singleton: false
name: "<<"
params: |
  fix << count     => integer

visibility: public
PK1|[�S>#ri/1.8/system/Fixnum/even%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>fix</em> is an even number.
full_name: Fixnum#even?
is_singleton: false
name: even?
params: |
  fix.even? -> true or false

visibility: public
PK2|[	���� ri/1.8/system/Fixnum/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a string containing the representation of <em>fix</em> radix <em>base</em> (between 2 and 36).
- !ruby/struct:SM::Flow::VERB 
  body: "   12345.to_s       #=&gt; &quot;12345&quot;\n   12345.to_s(2)    #=&gt; &quot;11000000111001&quot;\n   12345.to_s(8)    #=&gt; &quot;30071&quot;\n   12345.to_s(10)   #=&gt; &quot;12345&quot;\n   12345.to_s(16)   #=&gt; &quot;3039&quot;\n   12345.to_s(36)   #=&gt; &quot;9ix&quot;\n"
full_name: Fixnum#to_s
is_singleton: false
name: to_s
params: |
  fix.to_s( base=10 ) -> aString

visibility: public
PK2|[rҨ@@ri/1.8/system/Fixnum/%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the value of <tt>fix</tt> is greater than that of <tt>other</tt>.
full_name: Fixnum#>
is_singleton: false
name: ">"
params: |
  fix > other     => true or false

visibility: public
PK2|[
w�zz"ri/1.8/system/Fixnum/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return <tt>true</tt> if <tt>fix</tt> equals <tt>other</tt> numerically.
- !ruby/struct:SM::Flow::VERB 
  body: "  1 == 2      #=&gt; false\n  1 == 1.0    #=&gt; true\n"
full_name: Fixnum#==
is_singleton: false
name: ==
params: |
  fix == other

visibility: public
PK2|[���aqq(ri/1.8/system/Fixnum/induced_from-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert <tt>obj</tt> to a Fixnum. Works with numeric parameters. Also works with Symbols, but this is deprecated.
full_name: Fixnum::induced_from
is_singleton: true
name: induced_from
params: |
  Fixnum.induced_from(obj)    =>  fixnum

visibility: public
PK2|[[�9"ri/1.8/system/Fixnum/%2d%40-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Negates <tt>fix</tt> (which might return a Bignum).
full_name: Fixnum#-@
is_singleton: false
name: -@
params: |
  -fix   =>  integer

visibility: public
PK2|[�#���ri/1.8/system/Fixnum/div-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Performs division: the class of the resulting object depends on the class of <tt>numeric</tt> and on the magnitude of the result."
full_name: Fixnum#div
is_singleton: false
name: div
params: |
  fix / numeric      =>  numeric_result
  fix.div(numeric)   =>  numeric_result

visibility: public
PK2|[Xha��ri/1.8/system/Fixnum/%5e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Bitwise EXCLUSIVE OR.
full_name: Fixnum#^
is_singleton: false
name: ^
params: |
  fix ^ other     => integer

visibility: public
PK2|[�wþ��"ri/1.8/system/Fixnum/dclone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Fixnum#dclone
is_singleton: false
name: dclone
params: ()
visibility: public
PK2|[�" ri/1.8/system/Fixnum/to_f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts <em>fix</em> to a <tt>Float</tt>.
full_name: Fixnum#to_f
is_singleton: false
name: to_f
params: |
  fix.to_f -> float

visibility: public
PK3|[���jj"ri/1.8/system/Fixnum/modulo-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>fix</tt> modulo <tt>other</tt>. See <tt>Numeric.divmod</tt> for more information.
full_name: Fixnum#modulo
is_singleton: false
name: modulo
params: |
  fix % other         => Numeric
  fix.modulo(other)   => Numeric

visibility: public
PK3|[tv�`nnri/1.8/system/Fixnum/%2d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Performs subtraction: the class of the resulting object depends on the class of <tt>numeric</tt> and on the magnitude of the result."
full_name: Fixnum#-
is_singleton: false
name: "-"
params: |
  fix - numeric   =>  numeric_result

visibility: public
PK3|[�_�.ri/1.8/system/GetoptLong/cdesc-GetoptLong.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Examine whether an option processing is failed.
  name: error
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Return ordering.
  name: ordering
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Set/Unset `quiet' mode.
  name: quiet
  rw: W
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Return the flag of `quiet' mode.
  name: quiet
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: The GetoptLong class allows you to parse command line options similarly to the GNU getopt_long() C library call. Note, however, that GetoptLong is a pure Ruby implementation.
- !ruby/struct:SM::Flow::P 
  body: GetoptLong allows for POSIX-style options like <tt>--file</tt> as well as single letter options like <tt>-f</tt>
- !ruby/struct:SM::Flow::P 
  body: The empty option <tt>--</tt> (two minus symbols) is used to end option processing. This can be particularly important if options have optional arguments.
- !ruby/struct:SM::Flow::P 
  body: "Here is a simple example of usage:"
- !ruby/struct:SM::Flow::VERB 
  body: "    # == Synopsis\n    #\n    # hello: greets user, demonstrates command line parsing\n    #\n    # == Usage\n    #\n    # hello [OPTION] ... DIR\n    #\n    # -h, --help:\n    #    show help\n    #\n    # --repeat x, -n x:\n    #    repeat x times\n    #\n    # --name [name]:\n    #    greet user by name, if name not supplied default is John\n    #\n    # DIR: The directory in which to issue the greeting.\n\n    require 'getoptlong'\n    require 'rdoc/usage'\n\n    opts = GetoptLong.new(\n      [ '--help', '-h', GetoptLong::NO_ARGUMENT ],\n      [ '--repeat', '-n', GetoptLong::REQUIRED_ARGUMENT ],\n      [ '--name', GetoptLong::OPTIONAL_ARGUMENT ]\n    )\n\n    dir = nil\n    name = nil\n    repetitions = 1\n    opts.each do |opt, arg|\n      case opt\n        when '--help'\n          RDoc::usage\n        when '--repeat'\n          repetitions = arg.to_i\n        when '--name'\n          if arg == ''\n            name = 'John'\n          else\n            name = arg\n          end\n      end\n    end\n\n    if ARGV.length != 1\n      puts &quot;Missing dir argument (try --help)&quot;\n      exit 0\n    end\n\n    dir = ARGV.shift\n\n    Dir.chdir(dir)\n    for i in (1..repetitions)\n      print &quot;Hello&quot;\n      if name\n        print &quot;, #{name}&quot;\n      end\n      puts\n    end\n"
- !ruby/struct:SM::Flow::P 
  body: "Example command line:"
- !ruby/struct:SM::Flow::VERB 
  body: "    hello -n 6 --name -- /tmp\n"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Orderings.
  name: ORDERINGS
  value: "[REQUIRE_ORDER = 0, PERMUTE = 1, RETURN_IN_ORDER = 2]"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Argument flags.
  name: ARGUMENT_FLAGS
  value: "[NO_ARGUMENT = 0, REQUIRED_ARGUMENT = 1,     OPTIONAL_ARGUMENT = 2]"
- !ruby/object:RI::Constant 
  comment: 
  name: STATUS_TERMINATED
  value: 0, 1, 2
full_name: GetoptLong
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: each_option
- !ruby/object:RI::MethodSummary 
  name: error_message
- !ruby/object:RI::MethodSummary 
  name: get
- !ruby/object:RI::MethodSummary 
  name: get_option
- !ruby/object:RI::MethodSummary 
  name: ordering=
- !ruby/object:RI::MethodSummary 
  name: set_error
- !ruby/object:RI::MethodSummary 
  name: set_options
- !ruby/object:RI::MethodSummary 
  name: terminate
- !ruby/object:RI::MethodSummary 
  name: terminated?
name: GetoptLong
superclass: Object
PK3|[DA

+ri/1.8/system/GetoptLong/ordering%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the handling of the ordering of options and arguments. A RuntimeError is raised if option processing has already started.
- !ruby/struct:SM::Flow::P 
  body: "The supplied value must be a member of GetoptLong::ORDERINGS. It alters the processing of options as follows:"
- !ruby/struct:SM::Flow::P 
  body: "<b>REQUIRE_ORDER</b> :"
- !ruby/struct:SM::Flow::P 
  body: Options are required to occur before non-options.
- !ruby/struct:SM::Flow::P 
  body: Processing of options ends as soon as a word is encountered that has not been preceded by an appropriate option flag.
- !ruby/struct:SM::Flow::P 
  body: For example, if -a and -b are options which do not take arguments, parsing command line arguments of '-a one -b two' would result in 'one', '-b', 'two' being left in ARGV, and only ('-a', '') being processed as an option/arg pair.
- !ruby/struct:SM::Flow::P 
  body: This is the default ordering, if the environment variable POSIXLY_CORRECT is set. (This is for compatibility with GNU getopt_long.)
- !ruby/struct:SM::Flow::P 
  body: "<b>PERMUTE</b> :"
- !ruby/struct:SM::Flow::P 
  body: Options can occur anywhere in the command line parsed. This is the default behavior.
- !ruby/struct:SM::Flow::P 
  body: Every sequence of words which can be interpreted as an option (with or without argument) is treated as an option; non-option words are skipped.
- !ruby/struct:SM::Flow::P 
  body: For example, if -a does not require an argument and -b optionally takes an argument, parsing '-a one -b two three' would result in ('-a','') and ('-b', 'two') being processed as option/arg pairs, and 'one','three' being left in ARGV.
- !ruby/struct:SM::Flow::P 
  body: If the ordering is set to PERMUTE but the environment variable POSIXLY_CORRECT is set, REQUIRE_ORDER is used instead. This is for compatibility with GNU getopt_long.
- !ruby/struct:SM::Flow::P 
  body: "<b>RETURN_IN_ORDER</b> :"
- !ruby/struct:SM::Flow::P 
  body: All words on the command line are processed as options. Words not preceded by a short or long option flag are passed as arguments with an option of '' (empty string).
- !ruby/struct:SM::Flow::P 
  body: For example, if -a requires an argument but -b does not, a command line of '-a one -b two three' would result in option/arg pairs of ('-a', 'one') ('-b', ''), ('', 'two'), ('', 'three') being processed.
full_name: GetoptLong#ordering=
is_singleton: false
name: ordering=
params: (ordering)
visibility: public
PK3|[q�L��)ri/1.8/system/GetoptLong/terminate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Explicitly terminate option processing.
full_name: GetoptLong#terminate
is_singleton: false
name: terminate
params: ()
visibility: public
PK3|[<]��$ri/1.8/system/GetoptLong/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: each_option
block_params: option_name, option_argument
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterator version of `get'.
- !ruby/struct:SM::Flow::P 
  body: "The block is called repeatedly with two arguments: The first is the option name. The second is the argument which followed it (if any). Example: ('--opt', 'value')"
- !ruby/struct:SM::Flow::P 
  body: The option name is always converted to the first (preferred) name given in the original options to GetoptLong.new.
full_name: GetoptLong#each
is_singleton: false
name: each
params: () {|option_name, option_argument| ...}
visibility: public
PK3|[k9"<��+ri/1.8/system/GetoptLong/each_option-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #each"
full_name: GetoptLong#each_option
is_singleton: false
name: each_option
params: ()
visibility: public
PK3|[,#5�AA-ri/1.8/system/GetoptLong/error_message-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the appropriate error message in POSIX-defined format. If no error has occurred, returns nil.
full_name: GetoptLong#error_message
is_singleton: false
name: error_message
params: ()
visibility: public
PK3|[�%�~~+ri/1.8/system/GetoptLong/set_options-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set options. Takes the same argument as GetoptLong.new.
- !ruby/struct:SM::Flow::P 
  body: Raises a RuntimeError if option processing has already started.
full_name: GetoptLong#set_options
is_singleton: false
name: set_options
params: (*arguments)
visibility: public
PK3|[l�A���?ri/1.8/system/GetoptLong/InvalidOption/cdesc-InvalidOption.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: GetoptLong::InvalidOption
includes: []

instance_methods: []

name: InvalidOption
superclass: Error
PK3|[]�q-ri/1.8/system/GetoptLong/terminated%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if option processing has terminated, false otherwise.
full_name: GetoptLong#terminated?
is_singleton: false
name: terminated?
params: ()
visibility: public
PK3|[�����/ri/1.8/system/GetoptLong/Error/cdesc-Error.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Error types.
constants: []

full_name: GetoptLong::Error
includes: []

instance_methods: []

name: Error
superclass: StandardError
PK3|[��K���*ri/1.8/system/GetoptLong/get_option-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #get"
full_name: GetoptLong#get_option
is_singleton: false
name: get_option
params: ()
visibility: public
PK3|[e؉���#ri/1.8/system/GetoptLong/get-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: get_option
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get next option name and its argument, as an Array of two elements.
- !ruby/struct:SM::Flow::P 
  body: The option name is always converted to the first (preferred) name given in the original options to GetoptLong.new.
- !ruby/struct:SM::Flow::P 
  body: "Example: ['--option', 'value']"
- !ruby/struct:SM::Flow::P 
  body: Returns nil if the processing is complete (as determined by STATUS_TERMINATED).
full_name: GetoptLong#get
is_singleton: false
name: get
params: ()
visibility: public
PK4|[F��!��Cri/1.8/system/GetoptLong/MissingArgument/cdesc-MissingArgument.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: GetoptLong::MissingArgument
includes: []

instance_methods: []

name: MissingArgument
superclass: Error
PK4|[���k��)ri/1.8/system/GetoptLong/set_error-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set an error (protected).
full_name: GetoptLong#set_error
is_singleton: false
name: set_error
params: (type, message)
visibility: protected
PK4|[�I4  #ri/1.8/system/GetoptLong/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set up option processing.
- !ruby/struct:SM::Flow::P 
  body: "The options to support are passed to new() as an array of arrays. Each sub-array contains any number of String option names which carry the same meaning, and one of the following flags:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "GetoptLong::NO_ARGUMENT :"
    body: Option does not take an argument.
  - !ruby/struct:SM::Flow::LI 
    label: "GetoptLong::REQUIRED_ARGUMENT :"
    body: Option always takes an argument.
  - !ruby/struct:SM::Flow::LI 
    label: "GetoptLong::OPTIONAL_ARGUMENT :"
    body: Option may or may not take an argument.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: The first option name is considered to be the preferred (canonical) name. Other than that, the elements of each sub-array can be in any order.
full_name: GetoptLong::new
is_singleton: true
name: new
params: (*arguments)
visibility: public
PK4|[�����Ari/1.8/system/GetoptLong/AmbigousOption/cdesc-AmbigousOption.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: GetoptLong::AmbigousOption
includes: []

instance_methods: []

name: AmbigousOption
superclass: Error
PK4|[̺q���Eri/1.8/system/GetoptLong/NeedlessArgument/cdesc-NeedlessArgument.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: GetoptLong::NeedlessArgument
includes: []

instance_methods: []

name: NeedlessArgument
superclass: Error
PK4|[�`���&ri/1.8/system/RubyLex/set_input-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: io functions
full_name: RubyLex#set_input
is_singleton: false
name: set_input
params: (io, p = nil, &block)
visibility: public
PK5|[dK���-ri/1.8/system/RubyLex/identify_comment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#identify_comment
is_singleton: false
name: identify_comment
params: ()
visibility: public
PK5|[rјū�%ri/1.8/system/RubyLex/lex_init-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#lex_init
is_singleton: false
name: lex_init
params: ()
visibility: public
PK5|[�����/ri/1.8/system/RubyLex/identify_quotation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#identify_quotation
is_singleton: false
name: identify_quotation
params: ()
visibility: public
PK5|[�'�è�!ri/1.8/system/RubyLex/peek-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#peek
is_singleton: false
name: peek
params: (i = 0)
visibility: public
PK5|[�i���-ri/1.8/system/RubyLex/initialize_input-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#initialize_input
is_singleton: false
name: initialize_input
params: ()
visibility: public
PK6|[q�O��&ri/1.8/system/RubyLex/buf_input-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#buf_input
is_singleton: false
name: buf_input
params: ()
visibility: private
PK6|[���s��#ri/1.8/system/RubyLex/prompt-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#prompt
is_singleton: false
name: prompt
params: ()
visibility: public
PK6|[�����%ri/1.8/system/RubyLex/debug%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex::debug?
is_singleton: true
name: debug?
params: ()
visibility: public
PK6|[z�c���'ri/1.8/system/RubyLex/set_prompt-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#set_prompt
is_singleton: false
name: set_prompt
params: (p = nil, &block)
visibility: public
PK6|[<�I���$ri/1.8/system/RubyLex/line_no-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: io functions
full_name: RubyLex#line_no
is_singleton: false
name: line_no
params: ()
visibility: public
PK6|[VɃ���(ri/1.8/system/RubyLex/read_escape-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#read_escape
is_singleton: false
name: read_escape
params: ()
visibility: public
PK6|[׌J8��#ri/1.8/system/RubyLex/ungetc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#ungetc
is_singleton: false
name: ungetc
params: (c = nil)
visibility: public
PK6|[w����*ri/1.8/system/RubyLex/identify_gvar-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#identify_gvar
is_singleton: false
name: identify_gvar
params: ()
visibility: public
PK6|[-��2ri/1.8/system/RubyLex/skip_inner_expression-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#skip_inner_expression
is_singleton: false
name: skip_inner_expression
params: ()
visibility: public
PK6|[�Ľ��� ri/1.8/system/RubyLex/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex::new
is_singleton: true
name: new
params: (content)
visibility: public
PK6|[Ύ)���,ri/1.8/system/RubyLex/identify_number-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#identify_number
is_singleton: false
name: identify_number
params: (start)
visibility: public
PK6|[`�/��'ri/1.8/system/RubyLex/get_readed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#get_readed
is_singleton: false
name: get_readed
params: ()
visibility: public
PK6|[�@��%ri/1.8/system/RubyLex/get_read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#get_read
is_singleton: false
name: get_read
params: ()
visibility: public
PK6|[Kf>���*ri/1.8/system/RubyLex/peek_match%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#peek_match?
is_singleton: false
name: peek_match?
params: (regexp)
visibility: public
PK6|[�����3ri/1.8/system/RubyLex/identify_here_document-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#identify_here_document
is_singleton: false
name: identify_here_document
params: ()
visibility: public
PK6|[ZV���=ri/1.8/system/RubyLex/BufferedReader/getc_already_read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex::BufferedReader#getc_already_read
is_singleton: false
name: getc_already_read
params: ()
visibility: public
PK6|[k�D���2ri/1.8/system/RubyLex/BufferedReader/column-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex::BufferedReader#column
is_singleton: false
name: column
params: ()
visibility: public
PK6|[��E��<ri/1.8/system/RubyLex/BufferedReader/divert_read_from-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex::BufferedReader#divert_read_from
is_singleton: false
name: divert_read_from
params: (reserve)
visibility: public
PK6|[;�Y���0ri/1.8/system/RubyLex/BufferedReader/peek-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex::BufferedReader#peek
is_singleton: false
name: peek
params: (at)
visibility: public
PK6|[�o���2ri/1.8/system/RubyLex/BufferedReader/ungetc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex::BufferedReader#ungetc
is_singleton: false
name: ungetc
params: (ch)
visibility: public
PK6|[ފ�T��/ri/1.8/system/RubyLex/BufferedReader/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex::BufferedReader::new
is_singleton: true
name: new
params: (content)
visibility: public
PK6|[��7���4ri/1.8/system/RubyLex/BufferedReader/get_read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex::BufferedReader#get_read
is_singleton: false
name: get_read
params: ()
visibility: public
PK6|[�C_��0ri/1.8/system/RubyLex/BufferedReader/getc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex::BufferedReader#getc
is_singleton: false
name: getc
params: ()
visibility: public
PK6|[0t%WW>ri/1.8/system/RubyLex/BufferedReader/cdesc-BufferedReader.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: line_num
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Read an input stream character by character. We allow for unlimited ungetting of characters just read.
- !ruby/struct:SM::Flow::P 
  body: We simplify the implementation greatly by reading the entire input into a buffer initially, and then simply traversing it using pointers.
- !ruby/struct:SM::Flow::P 
  body: "We also have to allow for the <em>here document diversion</em>. This little gem comes about when the lexer encounters a here document. At this point we effectively need to split the input stream into two parts: one to read the body of the here document, the other to read the rest of the input line where the here document was initially encountered. For example, we might have"
- !ruby/struct:SM::Flow::VERB 
  body: "  do_something(&lt;&lt;-A, &lt;&lt;-B)\n    stuff\n    for\n  A\n    stuff\n    for\n  B\n"
- !ruby/struct:SM::Flow::P 
  body: When the lexer encounters the &lt;&lt;A, it reads until the end of the line, and keeps it around for later. It then reads the body of the here document. Once complete, it needs to read the rest of the original line, but then skip the here document body.
constants: []

full_name: RubyLex::BufferedReader
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: column
- !ruby/object:RI::MethodSummary 
  name: divert_read_from
- !ruby/object:RI::MethodSummary 
  name: get_read
- !ruby/object:RI::MethodSummary 
  name: getc
- !ruby/object:RI::MethodSummary 
  name: getc_already_read
- !ruby/object:RI::MethodSummary 
  name: peek
- !ruby/object:RI::MethodSummary 
  name: peek_equal
- !ruby/object:RI::MethodSummary 
  name: ungetc
name: BufferedReader
superclass: Object
PK6|[:��6ri/1.8/system/RubyLex/BufferedReader/peek_equal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex::BufferedReader#peek_equal
is_singleton: false
name: peek_equal
params: (str)
visibility: public
PK6|[��?���!ri/1.8/system/RubyLex/gets-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#gets
is_singleton: false
name: gets
params: ()
visibility: public
PK6|[V�����#ri/1.8/system/RubyLex/eof%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#eof?
is_singleton: false
name: eof?
params: ()
visibility: public
PK6|[��[��*ri/1.8/system/RubyLex/getc_of_rests-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#getc_of_rests
is_singleton: false
name: getc_of_rests
params: ()
visibility: public
PK6|[�e�ȴ�*ri/1.8/system/RubyLex/peek_equal%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#peek_equal?
is_singleton: false
name: peek_equal?
params: (str)
visibility: public
PK7|[2���!ri/1.8/system/RubyLex/getc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#getc
is_singleton: false
name: getc
params: ()
visibility: public
PK7|[����� ri/1.8/system/RubyLex/lex-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#lex
is_singleton: false
name: lex
params: ()
visibility: public
PK7|[���!��"ri/1.8/system/RubyLex/token-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#token
is_singleton: false
name: token
params: ()
visibility: public
PK7|[~��%ri/1.8/system/RubyLex/lex_int2-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#lex_int2
is_singleton: false
name: lex_int2
params: ()
visibility: public
PK7|[x����,ri/1.8/system/RubyLex/identify_string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#identify_string
is_singleton: false
name: identify_string
params: (ltype, quoted = ltype)
visibility: public
PK7|[�t���5ri/1.8/system/RubyLex/each_top_level_statement-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: "@line, @exp_line_no"
comment: 
full_name: RubyLex#each_top_level_statement
is_singleton: false
name: each_top_level_statement
params: () {|@line, @exp_line_no| ...}
visibility: public
PK7|[AL$��$ri/1.8/system/RubyLex/char_no-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#char_no
is_singleton: false
name: char_no
params: ()
visibility: public
PK7|[�l�N��0ri/1.8/system/RubyLex/identify_identifier-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyLex#identify_identifier
is_singleton: false
name: identify_identifier
params: ()
visibility: public
PK7|[�P�WW(ri/1.8/system/RubyLex/cdesc-RubyLex.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: char_no
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: continue
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: debug_level
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: exception_on_syntax_error
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: exception_on_syntax_error
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: indent
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: indent
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: lex_state
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: line_no
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: read_auto_clean_up
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: readed_auto_clean_up
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: seek
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: skip_space
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: skip_space
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: debug?
- !ruby/object:RI::MethodSummary 
  name: debug?
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Lexical analyzer for Ruby source
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ENINDENT_CLAUSE
  value: "[     \"case\", \"class\", \"def\", \"do\", \"for\", \"if\",     \"module\", \"unless\", \"until\", \"while\", \"begin\""
- !ruby/object:RI::Constant 
  comment: 
  name: DEINDENT_CLAUSE
  value: "[\"end\""
- !ruby/object:RI::Constant 
  comment: 
  name: PERCENT_LTYPE
  value: "{     \"q\" => \"\\'\",     \"Q\" => \"\\\"\",     \"x\" => \"\\`\",     \"r\" => \"/\",     \"w\" => \"]\",     \"W\" => \"]\",     \"s\" => \":\""
- !ruby/object:RI::Constant 
  comment: 
  name: PERCENT_PAREN
  value: "{     \"{\" => \"}\",     \"[\" => \"]\",     \"<\" => \">\",     \"(\" => \")\""
- !ruby/object:RI::Constant 
  comment: 
  name: Ltype2Token
  value: "{     \"\\'\" => TkSTRING,     \"\\\"\" => TkSTRING,     \"\\`\" => TkXSTRING,     \"/\" => TkREGEXP,     \"]\" => TkDSTRING,     \":\" => TkSYMBOL"
- !ruby/object:RI::Constant 
  comment: 
  name: DLtype2Token
  value: "{     \"\\\"\" => TkDSTRING,     \"\\`\" => TkDXSTRING,     \"/\" => TkDREGEXP,   }"
- !ruby/object:RI::Constant 
  comment: 
  name: ENINDENT_CLAUSE
  value: "[     \"case\", \"class\", \"def\", \"do\", \"for\", \"if\",     \"module\", \"unless\", \"until\", \"while\", \"begin\""
- !ruby/object:RI::Constant 
  comment: 
  name: DEINDENT_CLAUSE
  value: "[\"end\""
- !ruby/object:RI::Constant 
  comment: 
  name: PERCENT_LTYPE
  value: "{     \"q\" => \"\\'\",     \"Q\" => \"\\\"\",     \"x\" => \"\\`\",     \"r\" => \"/\",     \"w\" => \"]\""
- !ruby/object:RI::Constant 
  comment: 
  name: PERCENT_PAREN
  value: "{     \"{\" => \"}\",     \"[\" => \"]\",     \"<\" => \">\",     \"(\" => \")\""
- !ruby/object:RI::Constant 
  comment: 
  name: Ltype2Token
  value: "{     \"\\'\" => TkSTRING,     \"\\\"\" => TkSTRING,     \"\\`\" => TkXSTRING,     \"/\" => TkREGEXP,     \"]\" => TkDSTRING"
- !ruby/object:RI::Constant 
  comment: 
  name: DLtype2Token
  value: "{     \"\\\"\" => TkDSTRING,     \"\\`\" => TkDXSTRING,     \"/\" => TkDREGEXP,   }"
full_name: RubyLex
includes: 
- !ruby/object:RI::IncludedModule 
  name: RubyToken
- !ruby/object:RI::IncludedModule 
  name: RubyToken
- !ruby/object:RI::IncludedModule 
  name: IRB
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: buf_input
- !ruby/object:RI::MethodSummary 
  name: char_no
- !ruby/object:RI::MethodSummary 
  name: each_top_level_statement
- !ruby/object:RI::MethodSummary 
  name: eof?
- !ruby/object:RI::MethodSummary 
  name: get_read
- !ruby/object:RI::MethodSummary 
  name: get_readed
- !ruby/object:RI::MethodSummary 
  name: getc
- !ruby/object:RI::MethodSummary 
  name: getc
- !ruby/object:RI::MethodSummary 
  name: getc_of_rests
- !ruby/object:RI::MethodSummary 
  name: getc_of_rests
- !ruby/object:RI::MethodSummary 
  name: gets
- !ruby/object:RI::MethodSummary 
  name: gets
- !ruby/object:RI::MethodSummary 
  name: identify_comment
- !ruby/object:RI::MethodSummary 
  name: identify_comment
- !ruby/object:RI::MethodSummary 
  name: identify_gvar
- !ruby/object:RI::MethodSummary 
  name: identify_gvar
- !ruby/object:RI::MethodSummary 
  name: identify_here_document
- !ruby/object:RI::MethodSummary 
  name: identify_here_document
- !ruby/object:RI::MethodSummary 
  name: identify_identifier
- !ruby/object:RI::MethodSummary 
  name: identify_identifier
- !ruby/object:RI::MethodSummary 
  name: identify_number
- !ruby/object:RI::MethodSummary 
  name: identify_number
- !ruby/object:RI::MethodSummary 
  name: identify_quotation
- !ruby/object:RI::MethodSummary 
  name: identify_quotation
- !ruby/object:RI::MethodSummary 
  name: identify_string
- !ruby/object:RI::MethodSummary 
  name: identify_string
- !ruby/object:RI::MethodSummary 
  name: initialize_input
- !ruby/object:RI::MethodSummary 
  name: lex
- !ruby/object:RI::MethodSummary 
  name: lex
- !ruby/object:RI::MethodSummary 
  name: lex_init
- !ruby/object:RI::MethodSummary 
  name: lex_init
- !ruby/object:RI::MethodSummary 
  name: lex_int2
- !ruby/object:RI::MethodSummary 
  name: lex_int2
- !ruby/object:RI::MethodSummary 
  name: line_no
- !ruby/object:RI::MethodSummary 
  name: peek
- !ruby/object:RI::MethodSummary 
  name: peek
- !ruby/object:RI::MethodSummary 
  name: peek_equal?
- !ruby/object:RI::MethodSummary 
  name: peek_equal?
- !ruby/object:RI::MethodSummary 
  name: peek_match?
- !ruby/object:RI::MethodSummary 
  name: prompt
- !ruby/object:RI::MethodSummary 
  name: read_escape
- !ruby/object:RI::MethodSummary 
  name: read_escape
- !ruby/object:RI::MethodSummary 
  name: set_input
- !ruby/object:RI::MethodSummary 
  name: set_prompt
- !ruby/object:RI::MethodSummary 
  name: skip_inner_expression
- !ruby/object:RI::MethodSummary 
  name: token
- !ruby/object:RI::MethodSummary 
  name: token
- !ruby/object:RI::MethodSummary 
  name: ungetc
- !ruby/object:RI::MethodSummary 
  name: ungetc
name: RubyLex
superclass: Object
PK7|[��U�CC+ri/1.8/system/StringScanner/restsize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "<tt>s.restsize</tt> is equivalent to <tt>s.rest_size</tt>. This method is obsolete; use #rest_size instead."
full_name: StringScanner#restsize
is_singleton: false
name: restsize
params: ()
visibility: public
PK7|[����*ri/1.8/system/StringScanner/matched-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the last matched string.
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('test string')\n  s.match?(/\\w+/)     # -&gt; 4\n  s.matched           # -&gt; &quot;test&quot;\n"
full_name: StringScanner#matched
is_singleton: false
name: matched
params: ()
visibility: public
PK7|[!�>VV-ri/1.8/system/StringScanner/post_match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the <b><em>post</b>-match</em> (in the regular expression sense) of the last scan.
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('test string')\n  s.scan(/\\w+/)           # -&gt; &quot;test&quot;\n  s.scan(/\\s+/)           # -&gt; &quot; &quot;\n  s.pre_match             # -&gt; &quot;test&quot;\n  s.post_match            # -&gt; &quot;string&quot;\n"
full_name: StringScanner#post_match
is_singleton: false
name: post_match
params: ()
visibility: public
PK7|[r���44)ri/1.8/system/StringScanner/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the n-th subgroup in the most recent match.
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new(&quot;Fri Dec 12 1975 14:39&quot;)\n  s.scan(/(\\w+) (\\w+) (\\d+) /)       # -&gt; &quot;Fri Dec 12 &quot;\n  s[0]                               # -&gt; &quot;Fri Dec 12 &quot;\n  s[1]                               # -&gt; &quot;Fri&quot;\n  s[2]                               # -&gt; &quot;Dec&quot;\n  s[3]                               # -&gt; &quot;12&quot;\n  s.post_match                       # -&gt; &quot;1975 14:39&quot;\n  s.pre_match                        # -&gt; &quot;&quot;\n"
full_name: StringScanner#[]
is_singleton: false
name: "[]"
params: " [](n)\n"
visibility: public
PK7|[�jv���+ri/1.8/system/StringScanner/exist%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Looks <em>ahead</em> to see if the <tt>pattern</tt> exists <em>anywhere</em> in the string, without advancing the scan pointer. This predicates whether a #scan_until will return a value."
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('test string')\n  s.exist? /s/            # -&gt; 3\n  s.scan /test/           # -&gt; &quot;test&quot;\n  s.exist? /s/            # -&gt; 6\n  s.exist? /e/            # -&gt; nil\n"
full_name: StringScanner#exist?
is_singleton: false
name: exist?
params: " exist?(pattern)\n"
visibility: public
PK7|[78x+ri/1.8/system/StringScanner/empty%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Equivalent to #eos?. This method is obsolete, use #eos? instead."
full_name: StringScanner#empty?
is_singleton: false
name: empty?
params: ()
visibility: public
PK7|[<��22,ri/1.8/system/StringScanner/terminate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the scan pointer to the end of the string and clear matching data.
full_name: StringScanner#terminate
is_singleton: false
name: terminate
params: |
  terminate
  clear

visibility: public
PK7|[�o��+ri/1.8/system/StringScanner/get_byte-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Scans one byte and returns it. This method is NOT multi-byte character sensitive. See also #getch."
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('ab')\n  s.get_byte         # =&gt; &quot;a&quot;\n  s.get_byte         # =&gt; &quot;b&quot;\n  s.get_byte         # =&gt; nil\n\n  s = StringScanner.new(&quot;\\244\\242&quot;)\n  s.get_byte         # =&gt; &quot;\\244&quot;\n  s.get_byte         # =&gt; &quot;\\242&quot;\n  s.get_byte         # =&gt; nil\n"
full_name: StringScanner#get_byte
is_singleton: false
name: get_byte
params: ()
visibility: public
PK7|[�Zh���)ri/1.8/system/StringScanner/string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the string being scanned.
full_name: StringScanner#string
is_singleton: false
name: string
params: ()
visibility: public
PK7|[�>P���)ri/1.8/system/StringScanner/eos%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the scan pointer is at the end of the string.
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('test string')\n  p s.eos?          # =&gt; false\n  s.scan(/test/)\n  p s.eos?          # =&gt; false\n  s.terminate\n  p s.eos?          # =&gt; true\n"
full_name: StringScanner#eos?
is_singleton: false
name: eos?
params: ()
visibility: public
PK7|[����4ri/1.8/system/StringScanner/cdesc-StringScanner.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: must_C_version
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "StringScanner provides for lexical scanning operations on a String. Here is an example of its usage:"
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('This is an example string')\n  s.eos?               # -&gt; false\n\n  p s.scan(/\\w+/)      # -&gt; &quot;This&quot;\n  p s.scan(/\\w+/)      # -&gt; nil\n  p s.scan(/\\s+/)      # -&gt; &quot; &quot;\n  p s.scan(/\\s+/)      # -&gt; nil\n  p s.scan(/\\w+/)      # -&gt; &quot;is&quot;\n  s.eos?               # -&gt; false\n\n  p s.scan(/\\s+/)      # -&gt; &quot; &quot;\n  p s.scan(/\\w+/)      # -&gt; &quot;an&quot;\n  p s.scan(/\\s+/)      # -&gt; &quot; &quot;\n  p s.scan(/\\w+/)      # -&gt; &quot;example&quot;\n  p s.scan(/\\s+/)      # -&gt; &quot; &quot;\n  p s.scan(/\\w+/)      # -&gt; &quot;string&quot;\n  s.eos?               # -&gt; true\n\n  p s.scan(/\\s+/)      # -&gt; nil\n  p s.scan(/\\w+/)      # -&gt; nil\n"
- !ruby/struct:SM::Flow::P 
  body: Scanning a string means remembering the position of a <em>scan pointer</em>, which is just an index. The point of scanning is to move forward a bit at a time, so matches are sought after the scan pointer; usually immediately after it.
- !ruby/struct:SM::Flow::P 
  body: "Given the string &quot;test string&quot;, here are the pertinent scan pointer positions:"
- !ruby/struct:SM::Flow::VERB 
  body: "    t e s t   s t r i n g\n  0 1 2 ...             1\n                        0\n"
- !ruby/struct:SM::Flow::P 
  body: "When you #scan for a pattern (a regular expression), the match must occur at the character after the scan pointer. If you use #scan_until, then the match can occur anywhere after the scan pointer. In both cases, the scan pointer moves <em>just beyond</em> the last character of the match, ready to scan again from the next character onwards. This is demonstrated by the example above."
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Method Categories
- !ruby/struct:SM::Flow::P 
  body: There are other methods besides the plain scanners. You can look ahead in the string without actually scanning. You can access the most recent match. You can modify the string being scanned, reset or terminate the scanner, find out or change the position of the scan pointer, skip ahead, and so on.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Advancing the Scan Pointer
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#getch"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#get_byte"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#scan"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#scan_until"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#skip"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#skip_until"
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Looking Ahead
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#check"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#check_until"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#exist?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#match?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#peek"
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Finding Where we Are
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#beginning_of_line? (#bol?)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#eos?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#rest?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#rest_size"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#pos"
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Setting Where we Are
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#reset"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#terminate"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#pos="
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Match Data
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#matched"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#matched?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#matched_size"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "[]"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#pre_match"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#post_match"
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Miscellaneous
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "&lt;&lt;"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#concat"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#string"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#string="
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#unscan"
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: There are aliases to several of the methods.
constants: []

full_name: StringScanner
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: beginning_of_line?
- !ruby/object:RI::MethodSummary 
  name: check
- !ruby/object:RI::MethodSummary 
  name: check_until
- !ruby/object:RI::MethodSummary 
  name: clear
- !ruby/object:RI::MethodSummary 
  name: concat
- !ruby/object:RI::MethodSummary 
  name: empty?
- !ruby/object:RI::MethodSummary 
  name: eos?
- !ruby/object:RI::MethodSummary 
  name: exist?
- !ruby/object:RI::MethodSummary 
  name: get_byte
- !ruby/object:RI::MethodSummary 
  name: getbyte
- !ruby/object:RI::MethodSummary 
  name: getch
- !ruby/object:RI::MethodSummary 
  name: initialize_copy
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: match?
- !ruby/object:RI::MethodSummary 
  name: matched
- !ruby/object:RI::MethodSummary 
  name: matched?
- !ruby/object:RI::MethodSummary 
  name: matched_size
- !ruby/object:RI::MethodSummary 
  name: matchedsize
- !ruby/object:RI::MethodSummary 
  name: peek
- !ruby/object:RI::MethodSummary 
  name: peep
- !ruby/object:RI::MethodSummary 
  name: pointer
- !ruby/object:RI::MethodSummary 
  name: pointer=
- !ruby/object:RI::MethodSummary 
  name: pos
- !ruby/object:RI::MethodSummary 
  name: pos=
- !ruby/object:RI::MethodSummary 
  name: post_match
- !ruby/object:RI::MethodSummary 
  name: pre_match
- !ruby/object:RI::MethodSummary 
  name: reset
- !ruby/object:RI::MethodSummary 
  name: rest
- !ruby/object:RI::MethodSummary 
  name: rest?
- !ruby/object:RI::MethodSummary 
  name: rest_size
- !ruby/object:RI::MethodSummary 
  name: restsize
- !ruby/object:RI::MethodSummary 
  name: scan
- !ruby/object:RI::MethodSummary 
  name: scan_full
- !ruby/object:RI::MethodSummary 
  name: scan_until
- !ruby/object:RI::MethodSummary 
  name: search_full
- !ruby/object:RI::MethodSummary 
  name: skip
- !ruby/object:RI::MethodSummary 
  name: skip_until
- !ruby/object:RI::MethodSummary 
  name: string
- !ruby/object:RI::MethodSummary 
  name: string=
- !ruby/object:RI::MethodSummary 
  name: terminate
- !ruby/object:RI::MethodSummary 
  name: unscan
name: StringScanner
superclass: Object
PK7|[ՠ#�BB/ri/1.8/system/StringScanner/matched_size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns the size of the most recent match (see #matched), or <tt>nil</tt> if there was no recent match."
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('test string')\n  s.check /\\w+/           # -&gt; &quot;test&quot;\n  s.matched_size          # -&gt; 4\n  s.check /\\d+/           # -&gt; nil\n  s.matched_size          # -&gt; nil\n"
full_name: StringScanner#matched_size
is_singleton: false
name: matched_size
params: ()
visibility: public
PK7|[z�T���-ri/1.8/system/StringScanner/scan_until-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Scans the string <em>until</em> the <tt>pattern</tt> is matched. Returns the substring up to and including the end of the match, advancing the scan pointer to that location. If there is no match, <tt>nil</tt> is returned.
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new(&quot;Fri Dec 12 1975 14:39&quot;)\n  s.scan_until(/1/)        # -&gt; &quot;Fri Dec 1&quot;\n  s.pre_match              # -&gt; &quot;Fri Dec &quot;\n  s.scan_until(/XYZ/)      # -&gt; nil\n"
full_name: StringScanner#scan_until
is_singleton: false
name: scan_until
params: " scan_until(pattern)\n"
visibility: public
PK7|[jϗ���'ri/1.8/system/StringScanner/peek-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Extracts a string corresponding to <tt>string[pos,len]</tt>, without advancing the scan pointer.
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('test string')\n  s.peek(7)          # =&gt; &quot;test st&quot;\n  s.peek(7)          # =&gt; &quot;test st&quot;\n"
full_name: StringScanner#peek
is_singleton: false
name: peek
params: " peek(len)\n"
visibility: public
PK7|[p��\\)ri/1.8/system/StringScanner/concat-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Appends <tt>str</tt> to the string being scanned. This method does not affect scan pointer.
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new(&quot;Fri Dec 12 1975 14:39&quot;)\n  s.scan(/Fri /)\n  s &lt;&lt; &quot; +1000 GMT&quot;\n  s.string            # -&gt; &quot;Fri Dec 12 1975 14:39 +1000 GMT&quot;\n  s.scan(/Dec/)       # -&gt; &quot;Dec&quot;\n"
full_name: StringScanner#concat
is_singleton: false
name: concat
params: |
  concat(str)
  <<(str)

visibility: public
PK7|[\�Ȋ�-ri/1.8/system/StringScanner/skip_until-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Advances the scan pointer until <tt>pattern</tt> is matched and consumed. Returns the number of bytes advanced, or <tt>nil</tt> if no match was found.
- !ruby/struct:SM::Flow::P 
  body: Look ahead to match <tt>pattern</tt>, and advance the scan pointer to the <em>end</em> of the match. Return the number of characters advanced, or <tt>nil</tt> if the match was unsuccessful.
- !ruby/struct:SM::Flow::P 
  body: "It's similar to #scan_until, but without returning the intervening string."
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new(&quot;Fri Dec 12 1975 14:39&quot;)\n  s.skip_until /12/           # -&gt; 10\n  s                           #\n"
full_name: StringScanner#skip_until
is_singleton: false
name: skip_until
params: " skip_until(pattern)\n"
visibility: public
PK7|[��DD+ri/1.8/system/StringScanner/match%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Tests whether the given <tt>pattern</tt> is matched from the current scan pointer. Returns the length of the match, or <tt>nil</tt>. The scan pointer is not advanced.
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('test string')\n  p s.match?(/\\w+/)   # -&gt; 4\n  p s.match?(/\\w+/)   # -&gt; 4\n  p s.match?(/\\s+/)   # -&gt; nil\n"
full_name: StringScanner#match?
is_singleton: false
name: match?
params: " match?(pattern)\n"
visibility: public
PK7|[̘�P2ri/1.8/system/StringScanner/Error/cdesc-Error.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: "Document-class: StringScanner"
- !ruby/struct:SM::Flow::P 
  body: "StringScanner provides for lexical scanning operations on a String. Here is an example of its usage:"
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('This is an example string')\n  s.eos?               # -&gt; false\n\n  p s.scan(/\\w+/)      # -&gt; &quot;This&quot;\n  p s.scan(/\\w+/)      # -&gt; nil\n  p s.scan(/\\s+/)      # -&gt; &quot; &quot;\n  p s.scan(/\\s+/)      # -&gt; nil\n  p s.scan(/\\w+/)      # -&gt; &quot;is&quot;\n  s.eos?               # -&gt; false\n\n  p s.scan(/\\s+/)      # -&gt; &quot; &quot;\n  p s.scan(/\\w+/)      # -&gt; &quot;an&quot;\n  p s.scan(/\\s+/)      # -&gt; &quot; &quot;\n  p s.scan(/\\w+/)      # -&gt; &quot;example&quot;\n  p s.scan(/\\s+/)      # -&gt; &quot; &quot;\n  p s.scan(/\\w+/)      # -&gt; &quot;string&quot;\n  s.eos?               # -&gt; true\n\n  p s.scan(/\\s+/)      # -&gt; nil\n  p s.scan(/\\w+/)      # -&gt; nil\n"
- !ruby/struct:SM::Flow::P 
  body: Scanning a string means remembering the position of a <em>scan pointer</em>, which is just an index. The point of scanning is to move forward a bit at a time, so matches are sought after the scan pointer; usually immediately after it.
- !ruby/struct:SM::Flow::P 
  body: "Given the string &quot;test string&quot;, here are the pertinent scan pointer positions:"
- !ruby/struct:SM::Flow::VERB 
  body: "    t e s t   s t r i n g\n  0 1 2 ...             1\n                        0\n"
- !ruby/struct:SM::Flow::P 
  body: "When you #scan for a pattern (a regular expression), the match must occur at the character after the scan pointer. If you use #scan_until, then the match can occur anywhere after the scan pointer. In both cases, the scan pointer moves <em>just beyond</em> the last character of the match, ready to scan again from the next character onwards. This is demonstrated by the example above."
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Method Categories
- !ruby/struct:SM::Flow::P 
  body: There are other methods besides the plain scanners. You can look ahead in the string without actually scanning. You can access the most recent match. You can modify the string being scanned, reset or terminate the scanner, find out or change the position of the scan pointer, skip ahead, and so on.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Advancing the Scan Pointer
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#getch"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#get_byte"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#scan"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#scan_until"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#skip"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#skip_until"
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Looking Ahead
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#check"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#check_until"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#exist?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#match?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#peek"
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Finding Where we Are
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#beginning_of_line? (#bol?)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#eos?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#rest?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#rest_size"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#pos"
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Setting Where we Are
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#reset"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#terminate"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#pos="
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Match Data
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#matched"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#matched?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#matched_size"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "[]"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#pre_match"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#post_match"
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Miscellaneous
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "&lt;&lt;"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#concat"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#string"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#string="
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#unscan"
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: There are aliases to several of the methods.
constants: []

full_name: StringScanner::Error
includes: []

instance_methods: []

name: Error
superclass: StandardError
PK7|[�
�^ii,ri/1.8/system/StringScanner/scan_full-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Tests whether the given <tt>pattern</tt> is matched from the current scan pointer. Returns the matched string if <tt>return_string_p</tt> is true. Advances the scan pointer if <tt>advance_pointer_p</tt> is true. The match register is affected.
- !ruby/struct:SM::Flow::P 
  body: "&quot;full&quot; means &quot;#scan with full parameters&quot;."
full_name: StringScanner#scan_full
is_singleton: false
name: scan_full
params: " scan_full(pattern, return_string_p, advance_pointer_p)\n"
visibility: public
PK7|[!��##(ri/1.8/system/StringScanner/check-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "This returns the value that #scan would return, without advancing the scan pointer. The match register is affected, though."
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new(&quot;Fri Dec 12 1975 14:39&quot;)\n  s.check /Fri/               # -&gt; &quot;Fri&quot;\n  s.pos                       # -&gt; 0\n  s.matched                   # -&gt; &quot;Fri&quot;\n  s.check /12/                # -&gt; nil\n  s.matched                   # -&gt; nil\n"
- !ruby/struct:SM::Flow::P 
  body: "Mnemonic: it &quot;checks&quot; to see whether a #scan will return a value."
full_name: StringScanner#check
is_singleton: false
name: check
params: " check(pattern)\n"
visibility: public
PK7|[�/�;;.ri/1.8/system/StringScanner/search_full-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Scans the string <em>until</em> the <tt>pattern</tt> is matched. Returns the matched string if <tt>return_string_p</tt> is true, otherwise returns the number of bytes advanced. Advances the scan pointer if <tt>advance_pointer_p</tt>, otherwise not. This method does affect the match register.
full_name: StringScanner#search_full
is_singleton: false
name: search_full
params: " search_full(pattern, return_string_p, advance_pointer_p)\n"
visibility: public
PK7|[9� *ri/1.8/system/StringScanner/getbyte-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Equivalent to #get_byte. This method is obsolete; use #get_byte instead."
full_name: StringScanner#getbyte
is_singleton: false
name: getbyte
params: ()
visibility: public
PK7|[n�**ri/1.8/system/StringScanner/pointer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the position of the scan pointer. In the 'reset' position, this value is zero. In the 'terminated' position (i.e. the string is exhausted), this value is the length of the string.
- !ruby/struct:SM::Flow::P 
  body: In short, it's a 0-based index into the string.
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('test string')\n  s.pos               # -&gt; 0\n  s.scan_until /str/  # -&gt; &quot;test str&quot;\n  s.pos               # -&gt; 8\n  s.terminate         # -&gt; #&lt;StringScanner fin&gt;\n  s.pos               # -&gt; 11\n"
full_name: StringScanner#pointer
is_singleton: false
name: pointer
params: ()
visibility: public
PK7|[���-ri/1.8/system/StringScanner/pointer%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Modify the scan pointer.
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('test string')\n  s.pos = 7            # -&gt; 7\n  s.rest               # -&gt; &quot;ring&quot;\n"
full_name: StringScanner#pointer=
is_singleton: false
name: pointer=
params: " pos=(n)\n"
visibility: public
PK7|[�˹č�*ri/1.8/system/StringScanner/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns a string that represents the StringScanner object, showing:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: the current position
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: the size of the string
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: the characters surrounding the scan pointer
  - !ruby/struct:SM::Flow::P 
    body: "s = StringScanner.new(&quot;Fri Dec 12 1975 14:39&quot;) s.inspect # -&gt; '#&lt;StringScanner 0/21 @ &quot;Fri D...&quot;&gt;' s.scan_until /12/ # -&gt; &quot;Fri Dec 12&quot; s.inspect # -&gt; '#&lt;StringScanner 10/21 &quot;...ec 12&quot; @ &quot; 1975...&quot;&gt;'"
  type: :BULLET
full_name: StringScanner#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK7|[�XB���.ri/1.8/system/StringScanner/check_until-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "This returns the value that #scan_until would return, without advancing the scan pointer. The match register is affected, though."
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new(&quot;Fri Dec 12 1975 14:39&quot;)\n  s.check_until /12/          # -&gt; &quot;Fri Dec 12&quot;\n  s.pos                       # -&gt; 0\n  s.matched                   # -&gt; 12\n"
- !ruby/struct:SM::Flow::P 
  body: "Mnemonic: it &quot;checks&quot; to see whether a #scan_until will return a value."
full_name: StringScanner#check_until
is_singleton: false
name: check_until
params: " check_until(pattern)\n"
visibility: public
PK7|[肆��'ri/1.8/system/StringScanner/scan-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Tries to match with <tt>pattern</tt> at the current position. If there's a match, the scanner advances the &quot;scan pointer&quot; and returns the matched string. Otherwise, the scanner returns <tt>nil</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('test string')\n  p s.scan(/\\w+/)   # -&gt; &quot;test&quot;\n  p s.scan(/\\w+/)   # -&gt; nil\n  p s.scan(/\\s+/)   # -&gt; &quot; &quot;\n  p s.scan(/\\w+/)   # -&gt; &quot;string&quot;\n  p s.scan(/./)     # -&gt; nil\n"
full_name: StringScanner#scan
is_singleton: false
name: scan
params: " scan(pattern) => String\n"
visibility: public
PK7|[�;-'ri/1.8/system/StringScanner/peep-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Equivalent to #peek. This method is obsolete; use #peek instead."
full_name: StringScanner#peep
is_singleton: false
name: peep
params: (p1)
visibility: public
PK7|[+l�oKK7ri/1.8/system/StringScanner/beginning_of_line%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> iff the scan pointer is at the beginning of the line.
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new(&quot;test\\ntest\\n&quot;)\n  s.bol?           # =&gt; true\n  s.scan(/te/)\n  s.bol?           # =&gt; false\n  s.scan(/st\\n/)\n  s.bol?           # =&gt; true\n  s.terminate\n  s.bol?           # =&gt; true\n"
full_name: StringScanner#beginning_of_line?
is_singleton: false
name: beginning_of_line?
params: ()
visibility: public
PK7|[���ss&ri/1.8/system/StringScanner/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new StringScanner object to scan over the given <tt>string</tt>. <tt>dup</tt> argument is obsolete and not used now.
full_name: StringScanner::new
is_singleton: true
name: new
params: " StringScanner.new(string, dup = false)\n"
visibility: public
PK7|[MW,;2ri/1.8/system/StringScanner/initialize_copy-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Duplicates a StringScanner object.
full_name: StringScanner#initialize_copy
is_singleton: false
name: initialize_copy
params: |
  dup
  clone

visibility: public
PK7|[�...ri/1.8/system/StringScanner/matchedsize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Equivalent to #matched_size. This method is obsolete; use #matched_size instead."
full_name: StringScanner#matchedsize
is_singleton: false
name: matchedsize
params: ()
visibility: public
PK7|[r�VV)ri/1.8/system/StringScanner/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Appends <tt>str</tt> to the string being scanned. This method does not affect scan pointer.
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new(&quot;Fri Dec 12 1975 14:39&quot;)\n  s.scan(/Fri /)\n  s &lt;&lt; &quot; +1000 GMT&quot;\n  s.string            # -&gt; &quot;Fri Dec 12 1975 14:39 +1000 GMT&quot;\n  s.scan(/Dec/)       # -&gt; &quot;Dec&quot;\n"
full_name: StringScanner#<<
is_singleton: false
name: "<<"
params: |
  concat(str)
  <<(str)

visibility: public
PK7|[������&ri/1.8/system/StringScanner/pos-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the position of the scan pointer. In the 'reset' position, this value is zero. In the 'terminated' position (i.e. the string is exhausted), this value is the length of the string.
- !ruby/struct:SM::Flow::P 
  body: In short, it's a 0-based index into the string.
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('test string')\n  s.pos               # -&gt; 0\n  s.scan_until /str/  # -&gt; &quot;test str&quot;\n  s.pos               # -&gt; 8\n  s.terminate         # -&gt; #&lt;StringScanner fin&gt;\n  s.pos               # -&gt; 11\n"
full_name: StringScanner#pos
is_singleton: false
name: pos
params: ()
visibility: public
PK7|[t�7�SS,ri/1.8/system/StringScanner/pre_match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the <b><em>pre</b>-match</em> (in the regular expression sense) of the last scan.
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('test string')\n  s.scan(/\\w+/)           # -&gt; &quot;test&quot;\n  s.scan(/\\s+/)           # -&gt; &quot; &quot;\n  s.pre_match             # -&gt; &quot;test&quot;\n  s.post_match            # -&gt; &quot;string&quot;\n"
full_name: StringScanner#pre_match
is_singleton: false
name: pre_match
params: ()
visibility: public
PK7|["�
b'ri/1.8/system/StringScanner/skip-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Attempts to skip over the given <tt>pattern</tt> beginning with the scan pointer. If it matches, the scan pointer is advanced to the end of the match, and the length of the match is returned. Otherwise, <tt>nil</tt> is returned.
- !ruby/struct:SM::Flow::P 
  body: "It's similar to #scan, but without returning the matched string."
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('test string')\n  p s.skip(/\\w+/)   # -&gt; 4\n  p s.skip(/\\w+/)   # -&gt; nil\n  p s.skip(/\\s+/)   # -&gt; 1\n  p s.skip(/\\w+/)   # -&gt; 6\n  p s.skip(/./)     # -&gt; nil\n"
full_name: StringScanner#skip
is_singleton: false
name: skip
params: " skip(pattern)\n"
visibility: public
PK7|[~��/,ri/1.8/system/StringScanner/rest_size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>s.rest_size</tt> is equivalent to <tt>s.rest.size</tt>.
full_name: StringScanner#rest_size
is_singleton: false
name: rest_size
params: ()
visibility: public
PK7|[:�N���(ri/1.8/system/StringScanner/getch-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Scans one character and returns it. This method is multi-byte character sensitive. See also #get_byte."
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('ab')\n  s.getch           # =&gt; &quot;a&quot;\n  s.getch           # =&gt; &quot;b&quot;\n  s.getch           # =&gt; nil\n\n  $KCODE = 'EUC'\n  s = StringScanner.new(&quot;\\244\\242&quot;)\n  s.getch           # =&gt; &quot;\\244\\242&quot;   # Japanese hira-kana &quot;A&quot; in EUC-JP\n  s.getch           # =&gt; nil\n"
full_name: StringScanner#getch
is_singleton: false
name: getch
params: ()
visibility: public
PK7|[
��Q331ri/1.8/system/StringScanner/must_C_version-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: This method is defined for backward compatibility.
full_name: StringScanner::must_C_version
is_singleton: true
name: must_C_version
params: " StringScanner.must_C_version\n"
visibility: public
PK7|[��6.		(ri/1.8/system/StringScanner/reset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reset the scan pointer (index 0) and clear matching data.
full_name: StringScanner#reset
is_singleton: false
name: reset
params: ()
visibility: public
PK7|[�MR���-ri/1.8/system/StringScanner/matched%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> iff the last match was successful.
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('test string')\n  s.match?(/\\w+/)     # =&gt; 4\n  s.matched?          # =&gt; true\n  s.match?(/\\d+/)     # =&gt; nil\n  s.matched?          # =&gt; false\n"
full_name: StringScanner#matched?
is_singleton: false
name: matched?
params: ()
visibility: public
PK7|[��'��)ri/1.8/system/StringScanner/pos%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Modify the scan pointer.
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('test string')\n  s.pos = 7            # -&gt; 7\n  s.rest               # -&gt; &quot;ring&quot;\n"
full_name: StringScanner#pos=
is_singleton: false
name: pos=
params: " pos=(n)\n"
visibility: public
PK7|[�J� (ri/1.8/system/StringScanner/clear-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Equivalent to #terminate. This method is obsolete; use #terminate instead."
full_name: StringScanner#clear
is_singleton: false
name: clear
params: ()
visibility: public
PK7|[�D�sAA,ri/1.8/system/StringScanner/string%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Changes the string being scanned to <tt>str</tt> and resets the scanner. Returns <tt>str</tt>.
full_name: StringScanner#string=
is_singleton: false
name: string=
params: " string=(str)\n"
visibility: public
PK7|[ԏ�>��)ri/1.8/system/StringScanner/unscan-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the scan pointer to the previous position. Only one previous position is remembered, and it changes with each scanning operation.
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('test string')\n  s.scan(/\\w+/)        # =&gt; &quot;test&quot;\n  s.unscan\n  s.scan(/../)         # =&gt; &quot;te&quot;\n  s.scan(/\\d/)         # =&gt; nil\n  s.unscan             # ScanError: unscan failed: previous match had failed\n"
full_name: StringScanner#unscan
is_singleton: false
name: unscan
params: ()
visibility: public
PK7|[�
S���*ri/1.8/system/StringScanner/rest%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns true iff there is more data in the string. See #eos?. This method is obsolete; use #eos? instead."
- !ruby/struct:SM::Flow::VERB 
  body: "  s = StringScanner.new('test string')\n  s.eos?              # These two\n  s.rest?             # are opposites.\n"
full_name: StringScanner#rest?
is_singleton: false
name: rest?
params: ()
visibility: public
PK7|[4��ll'ri/1.8/system/StringScanner/rest-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the &quot;rest&quot; of the string (i.e. everything after the scan pointer). If there is no more data (eos? = true), it returns <tt>&quot;&quot;</tt>.
full_name: StringScanner#rest
is_singleton: false
name: rest
params: ()
visibility: public
PK7|[TpHD~~,ri/1.8/system/Interrupt/cdesc-Interrupt.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: Interrupt
includes: []

instance_methods: []

name: Interrupt
superclass: SignalException
PK8|[�Ƭ���ri/1.8/system/Find/find-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: path
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls the associated block with the name of every file and directory listed as arguments, then recursively on their subdirectories, and so on.
- !ruby/struct:SM::Flow::P 
  body: See the <tt>Find</tt> module documentation for an example.
full_name: Find#find
is_singleton: false
name: find
params: (*paths) {|path| ...}
visibility: public
PK8|[7a#��"ri/1.8/system/Find/cdesc-Find.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The <tt>Find</tt> module supports the top-down traversal of a set of file paths.
- !ruby/struct:SM::Flow::P 
  body: "For example, to total the size of all files under your home directory, ignoring anything in a &quot;dot&quot; directory (e.g. $HOME/.ssh):"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'find'\n\n  total_size = 0\n\n  Find.find(ENV[&quot;HOME&quot;]) do |path|\n    if FileTest.directory?(path)\n      if File.basename(path)[0] == ?.\n        Find.prune       # Don't look any further into this directory.\n      else\n        next\n      end\n    else\n      total_size += FileTest.size(path)\n    end\n  end\n"
constants: []

full_name: Find
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: find
- !ruby/object:RI::MethodSummary 
  name: prune
name: Find
superclass: 
PK8|[�$�ri/1.8/system/Find/prune-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Skips the current file or directory, restarting the loop with the next entry. If the current file is a directory, that directory will not be recursively entered. Meaningful only within the block associated with Find::find.
- !ruby/struct:SM::Flow::P 
  body: See the <tt>Find</tt> module documentation for an example.
full_name: Find#prune
is_singleton: false
name: prune
params: ()
visibility: public
PK8|[���#ri/1.8/system/Shell/Cat/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: l
comment: 
full_name: Shell::Cat#each
is_singleton: false
name: each
params: (rs = nil) {|l| ...}
visibility: public
PK8|[��Ҳ�"ri/1.8/system/Shell/Cat/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::Cat::new
is_singleton: true
name: new
params: (sh, *filenames)
visibility: public
PK8|[N\�&ri/1.8/system/Shell/Cat/cdesc-Cat.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: Shell::Cat
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: each
name: Cat
superclass: BuiltInCommand
PK9|[p�[�-ri/1.8/system/Shell/def_system_command-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: command definitions
full_name: Shell::def_system_command
is_singleton: true
name: def_system_command
params: (command, path = command)
visibility: public
PK9|[������*ri/1.8/system/Shell/Filter/input%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::Filter#input=
is_singleton: false
name: input=
params: (filter)
visibility: public
PK9|[��ܼ�&ri/1.8/system/Shell/Filter/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: l
comment: 
full_name: Shell::Filter#each
is_singleton: false
name: each
params: (rs = nil) {|l| ...}
visibility: public
PK9|[���ө�&ri/1.8/system/Shell/Filter/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::Filter#to_a
is_singleton: false
name: to_a
params: ()
visibility: public
PK9|[q�a��%ri/1.8/system/Shell/Filter/%7c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::Filter#|
is_singleton: false
name: "|"
params: (filter)
visibility: public
PK9|[5m6Ɵ�,ri/1.8/system/Shell/Filter/cdesc-Filter.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: input
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Filter A method to require
- !ruby/struct:SM::Flow::VERB 
  body: "   each()\n"
constants: []

full_name: Shell::Filter
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: +
- !ruby/object:RI::MethodSummary 
  name: <
- !ruby/object:RI::MethodSummary 
  name: ">"
- !ruby/object:RI::MethodSummary 
  name: ">>"
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: input=
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: to_a
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: "|"
name: Filter
superclass: Object
PK9|[!�Z~��%ri/1.8/system/Shell/Filter/%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::Filter#<
is_singleton: false
name: <
params: (src)
visibility: public
PK9|[3~=ǯ�)ri/1.8/system/Shell/Filter/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::Filter#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK9|[��<��%ri/1.8/system/Shell/Filter/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::Filter::new
is_singleton: true
name: new
params: (sh)
visibility: public
PK9|[�XC��(ri/1.8/system/Shell/Filter/%3e%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::Filter#>>
is_singleton: false
name: ">>"
params: (to)
visibility: public
PK9|[���ީ�%ri/1.8/system/Shell/Filter/%2b-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::Filter#+
is_singleton: false
name: +
params: (filter)
visibility: public
PK9|[��
\��&ri/1.8/system/Shell/Filter/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::Filter#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK9|[�~���%ri/1.8/system/Shell/Filter/%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::Filter#>
is_singleton: false
name: ">"
params: (to)
visibility: public
PK9|[�n�C��ri/1.8/system/Shell/cd-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::cd
is_singleton: true
name: cd
params: (path)
visibility: public
PK9|[z�E9��!ri/1.8/system/Shell/notify-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: mes if iterator?
comment: 
full_name: Shell::notify
is_singleton: true
name: notify
params: (*opts, &block) {|mes if iterator?| ...}
visibility: public
PK9|[��e��3ri/1.8/system/Shell/default_record_separator-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::default_record_separator
is_singleton: true
name: default_record_separator
params: ()
visibility: public
PK:|[b����$ri/1.8/system/Shell/Echo/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: str + rs
comment: 
full_name: Shell::Echo#each
is_singleton: false
name: each
params: (rs = nil) {|str + rs| ...}
visibility: public
PK:|[W�fٱ�#ri/1.8/system/Shell/Echo/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::Echo::new
is_singleton: true
name: new
params: (sh, *strings)
visibility: public
PK:|[l���(ri/1.8/system/Shell/Echo/cdesc-Echo.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: Shell::Echo
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: each
name: Echo
superclass: BuiltInCommand
PK:|[��p[��#ri/1.8/system/Shell/Tee/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: l
comment: 
full_name: Shell::Tee#each
is_singleton: false
name: each
params: (rs = nil) {|l| ...}
visibility: public
PK:|[�E	��"ri/1.8/system/Shell/Tee/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::Tee::new
is_singleton: true
name: new
params: (sh, filename)
visibility: public
PK:|[%��&ri/1.8/system/Shell/Tee/cdesc-Tee.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: Shell::Tee
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: each
name: Tee
superclass: BuiltInCommand
PK:|[]&����(ri/1.8/system/Shell/alias_command-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::alias_command
is_singleton: true
name: alias_command
params: (ali, command, *opts, &block)
visibility: public
PK:|[囮w��&ri/1.8/system/Shell/Concat/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: l
comment: 
full_name: Shell::Concat#each
is_singleton: false
name: each
params: (rs = nil) {|l| ...}
visibility: public
PK;|[}��',ri/1.8/system/Shell/Concat/cdesc-Concat.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: Shell::Concat
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: each
name: Concat
superclass: BuiltInCommand
PK;|[��偰�%ri/1.8/system/Shell/Concat/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::Concat::new
is_singleton: true
name: new
params: (sh, *jobs)
visibility: public
PK;|[}d���*ri/1.8/system/Shell/Error/cdesc-Error.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Shell::Error
includes: []

instance_methods: []

name: Error
superclass: 
PK;|[�'����ri/1.8/system/Shell/jobs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: process management
full_name: Shell#jobs
is_singleton: false
name: jobs
params: ()
visibility: public
PK;|[uci�:ri/1.8/system/Shell/ProcessController/terminate_job-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: terminate a job
full_name: Shell::ProcessController#terminate_job
is_singleton: false
name: terminate_job
params: (command)
visibility: public
PK;|[jj~���?ri/1.8/system/Shell/ProcessController/each_active_object-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ref
comment: 
full_name: Shell::ProcessController::each_active_object
is_singleton: true
name: each_active_object
params: () {|ref| ...}
visibility: public
PK;|[�+�eDri/1.8/system/Shell/ProcessController/wait_all_jobs_execution-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: wait for all jobs to terminate
full_name: Shell::ProcessController#wait_all_jobs_execution
is_singleton: false
name: wait_all_jobs_execution
params: ()
visibility: public
PK<|[j#O��5ri/1.8/system/Shell/ProcessController/kill_job-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: kill a job
full_name: Shell::ProcessController#kill_job
is_singleton: false
name: kill_job
params: (sig, command)
visibility: public
PK<|[�I�j��9ri/1.8/system/Shell/ProcessController/waiting_jobs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::ProcessController#waiting_jobs
is_singleton: false
name: waiting_jobs
params: ()
visibility: public
PK<|["�Ӵ�1ri/1.8/system/Shell/ProcessController/jobs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::ProcessController#jobs
is_singleton: false
name: jobs
params: ()
visibility: public
PK<|[�/y��8ri/1.8/system/Shell/ProcessController/active_jobs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::ProcessController#active_jobs
is_singleton: false
name: active_jobs
params: ()
visibility: public
PK<|[����5ri/1.8/system/Shell/ProcessController/activate-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::ProcessController::activate
is_singleton: true
name: activate
params: (pc)
visibility: public
PK<|[}�W9ri/1.8/system/Shell/ProcessController/add_schedule-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: schedule a command
full_name: Shell::ProcessController#add_schedule
is_singleton: false
name: add_schedule
params: (command)
visibility: public
PK<|[�����;ri/1.8/system/Shell/ProcessController/waiting_job%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::ProcessController#waiting_job?
is_singleton: false
name: waiting_job?
params: (job)
visibility: public
PK<|[�_��0ri/1.8/system/Shell/ProcessController/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::ProcessController::new
is_singleton: true
name: new
params: (shell)
visibility: public
PK=|[eg�`��6ri/1.8/system/Shell/ProcessController/start_job-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: start a job
full_name: Shell::ProcessController#start_job
is_singleton: false
name: start_job
params: (command = nil)
visibility: public
PK=|[�����Jri/1.8/system/Shell/ProcessController/process_controllers_exclusive-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
full_name: Shell::ProcessController::process_controllers_exclusive
is_singleton: true
name: process_controllers_exclusive
params: () {|| ...}
visibility: public
PK=|[C5P���Bri/1.8/system/Shell/ProcessController/waiting_jobs_exist%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::ProcessController#waiting_jobs_exist?
is_singleton: false
name: waiting_jobs_exist?
params: ()
visibility: public
PK=|[~�`���7ri/1.8/system/Shell/ProcessController/inactivate-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::ProcessController::inactivate
is_singleton: true
name: inactivate
params: (pc)
visibility: public
PK=|[QXO���:ri/1.8/system/Shell/ProcessController/active_job%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::ProcessController#active_job?
is_singleton: false
name: active_job?
params: (job)
visibility: public
PK=|[�/��Bri/1.8/system/Shell/ProcessController/cdesc-ProcessController.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: activate
- !ruby/object:RI::MethodSummary 
  name: each_active_object
- !ruby/object:RI::MethodSummary 
  name: inactivate
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: process_controllers_exclusive
comment: 
constants: []

full_name: Shell::ProcessController
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: active_job?
- !ruby/object:RI::MethodSummary 
  name: active_jobs
- !ruby/object:RI::MethodSummary 
  name: active_jobs_exist?
- !ruby/object:RI::MethodSummary 
  name: add_schedule
- !ruby/object:RI::MethodSummary 
  name: jobs
- !ruby/object:RI::MethodSummary 
  name: jobs_exist?
- !ruby/object:RI::MethodSummary 
  name: kill_job
- !ruby/object:RI::MethodSummary 
  name: sfork
- !ruby/object:RI::MethodSummary 
  name: start_job
- !ruby/object:RI::MethodSummary 
  name: terminate_job
- !ruby/object:RI::MethodSummary 
  name: wait_all_jobs_execution
- !ruby/object:RI::MethodSummary 
  name: waiting_job?
- !ruby/object:RI::MethodSummary 
  name: waiting_jobs
- !ruby/object:RI::MethodSummary 
  name: waiting_jobs_exist?
name: ProcessController
superclass: Object
PK=|[L�9w��:ri/1.8/system/Shell/ProcessController/jobs_exist%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::ProcessController#jobs_exist?
is_singleton: false
name: jobs_exist?
params: ()
visibility: public
PK=|[��}��Ari/1.8/system/Shell/ProcessController/active_jobs_exist%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::ProcessController#active_jobs_exist?
is_singleton: false
name: active_jobs_exist?
params: ()
visibility: public
PK=|[�Bx2ri/1.8/system/Shell/ProcessController/sfork-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: simple fork
full_name: Shell::ProcessController#sfork
is_singleton: false
name: sfork
params: (command, &block) {|| ...}
visibility: public
PK=|[}x^6��2ri/1.8/system/Shell/install_system_commands-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::install_system_commands
is_singleton: true
name: install_system_commands
params: (pre = "sys_")
visibility: public
PK=|[����55$ri/1.8/system/Shell/cdesc-Shell.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: cascade
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: command_processor
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Dir related methods
  - !ruby/struct:SM::Flow::P 
    body: Shell#cwd/dir/getwd/pwd Shell#chdir/cd Shell#pushdir/pushd Shell#popdir/popd Shell#mkdir Shell#rmdir
  name: cwd
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: debug
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: debug
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: dir_stack
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: process_controller
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: record_separator
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: system_path
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: umask
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: verbose
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: verbose
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: alias_command
- !ruby/object:RI::MethodSummary 
  name: cd
- !ruby/object:RI::MethodSummary 
  name: debug=
- !ruby/object:RI::MethodSummary 
  name: def_system_command
- !ruby/object:RI::MethodSummary 
  name: default_record_separator
- !ruby/object:RI::MethodSummary 
  name: default_record_separator=
- !ruby/object:RI::MethodSummary 
  name: default_system_path
- !ruby/object:RI::MethodSummary 
  name: default_system_path=
- !ruby/object:RI::MethodSummary 
  name: install_system_commands
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: notify
- !ruby/object:RI::MethodSummary 
  name: unalias_command
- !ruby/object:RI::MethodSummary 
  name: undef_system_command
comment: 
- !ruby/struct:SM::Flow::VERB 
  body: "  shell/filter.rb -\n      $Release Version: 0.6.0 $\n      $Revision: 11708 $\n      $Date: 2007-02-13 08:01:19 +0900 (Tue, 13 Feb 2007) $\n      by Keiju ISHITSUKA(Nihon Rational Software Co.,Ltd)\n"
- !ruby/struct:SM::Flow::P 
  body: --
constants: []

full_name: Shell
includes: 
- !ruby/object:RI::IncludedModule 
  name: Error
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: cd
- !ruby/object:RI::MethodSummary 
  name: chdir
- !ruby/object:RI::MethodSummary 
  name: debug=
- !ruby/object:RI::MethodSummary 
  name: expand_path
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: jobs
- !ruby/object:RI::MethodSummary 
  name: kill
- !ruby/object:RI::MethodSummary 
  name: popd
- !ruby/object:RI::MethodSummary 
  name: popdir
- !ruby/object:RI::MethodSummary 
  name: pushd
- !ruby/object:RI::MethodSummary 
  name: pushdir
- !ruby/object:RI::MethodSummary 
  name: system_path=
name: Shell
superclass: Object
PK=|[�¢��&ri/1.8/system/Shell/expand_path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell#expand_path
is_singleton: false
name: expand_path
params: (path)
visibility: public
PK=|[ɕI��ri/1.8/system/Shell/kill-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell#kill
is_singleton: false
name: kill
params: (sig, command)
visibility: public
PK=|[L5�i��/ri/1.8/system/Shell/undef_system_command-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::undef_system_command
is_singleton: true
name: undef_system_command
params: (command)
visibility: public
PK=|[��S�� ri/1.8/system/Shell/pushd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #pushdir"
full_name: Shell#pushd
is_singleton: false
name: pushd
params: (path = nil)
visibility: public
PK=|[�S�b��ri/1.8/system/Shell/cd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #chdir"
full_name: Shell#cd
is_singleton: false
name: cd
params: (path = nil)
visibility: public
PK=|[���1ri/1.8/system/Shell/default_system_path%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::default_system_path=
is_singleton: true
name: default_system_path=
params: (path)
visibility: public
PK=|[R���*ri/1.8/system/Shell/unalias_command-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::unalias_command
is_singleton: true
name: unalias_command
params: (ali)
visibility: public
PK=|[pxժ�"ri/1.8/system/Shell/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: Shell#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK=|[5��.��ri/1.8/system/Shell/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::new
is_singleton: true
name: new
params: ()
visibility: public
PK=|[�@nW��)ri/1.8/system/Shell/system_path%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell#system_path=
is_singleton: false
name: system_path=
params: (path)
visibility: public
PK=|[�b ��6ri/1.8/system/Shell/default_record_separator%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::default_record_separator=
is_singleton: true
name: default_record_separator=
params: (rs)
visibility: public
PK=|[��#��#ri/1.8/system/Shell/debug%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::debug=
is_singleton: true
name: debug=
params: (val)
visibility: public
PK=|[�b�+��$ri/1.8/system/Shell/Glob/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: f+rs
comment: 
full_name: Shell::Glob#each
is_singleton: false
name: each
params: (rs = nil) {|f+rs| ...}
visibility: public
PK=|[�W���#ri/1.8/system/Shell/Glob/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::Glob::new
is_singleton: true
name: new
params: (sh, pattern)
visibility: public
PK=|[S�[(ri/1.8/system/Shell/Glob/cdesc-Glob.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: Shell::Glob
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: each
name: Glob
superclass: BuiltInCommand
PK@|[����.ri/1.8/system/Shell/SystemCommand/flush-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::SystemCommand#flush
is_singleton: false
name: flush
params: ()
visibility: public
PK@|[�_l���0ri/1.8/system/Shell/SystemCommand/wait%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::SystemCommand#wait?
is_singleton: false
name: wait?
params: ()
visibility: public
PK@|[��QF��1ri/1.8/system/Shell/SystemCommand/input%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::SystemCommand#input=
is_singleton: false
name: input=
params: (inp)
visibility: public
PK@|[AHbw��5ri/1.8/system/Shell/SystemCommand/start_export-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::SystemCommand#start_export
is_singleton: false
name: start_export
params: ()
visibility: public
PK@|[z�����2ri/1.8/system/Shell/SystemCommand/terminate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::SystemCommand#terminate
is_singleton: false
name: terminate
params: ()
visibility: public
PK@|[M�^}��-ri/1.8/system/Shell/SystemCommand/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: l
comment: 
full_name: Shell::SystemCommand#each
is_singleton: false
name: each
params: (rs = nil) {|l| ...}
visibility: public
PK@|[
��)��-ri/1.8/system/Shell/SystemCommand/kill-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::SystemCommand#kill
is_singleton: false
name: kill
params: (sig)
visibility: public
PK@|[�+���2ri/1.8/system/Shell/SystemCommand/active%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::SystemCommand#active?
is_singleton: false
name: active?
params: ()
visibility: public
PK@|[ω8���,ri/1.8/system/Shell/SystemCommand/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::SystemCommand::new
is_singleton: true
name: new
params: (sh, command, *opts)
visibility: public
PK@|[�N��/ri/1.8/system/Shell/SystemCommand/notify-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: mes if iterator?
comment: 
- !ruby/struct:SM::Flow::P 
  body: ex)
- !ruby/struct:SM::Flow::VERB 
  body: "   if you wish to output:\n      &quot;shell: job(#{@command}:#{@pid}) close pipe-out.&quot;\n   then\n      mes: &quot;job(%id) close pipe-out.&quot;\n   yorn: Boolean(@shell.debug? or @shell.verbose?)\n"
full_name: Shell::SystemCommand#notify
is_singleton: false
name: notify
params: (*opts, &block) {|mes if iterator?| ...}
visibility: public
PK@|[�O]���.ri/1.8/system/Shell/SystemCommand/start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::SystemCommand#start
is_singleton: false
name: start
params: ()
visibility: public
PK@|[a��
��5ri/1.8/system/Shell/SystemCommand/start_import-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::SystemCommand#start_import
is_singleton: false
name: start_import
params: ()
visibility: public
PK@|[!�8CYY:ri/1.8/system/Shell/SystemCommand/cdesc-SystemCommand.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: command
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: Shell::SystemCommand
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: active?
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: flush
- !ruby/object:RI::MethodSummary 
  name: input=
- !ruby/object:RI::MethodSummary 
  name: kill
- !ruby/object:RI::MethodSummary 
  name: notify
- !ruby/object:RI::MethodSummary 
  name: start
- !ruby/object:RI::MethodSummary 
  name: start_export
- !ruby/object:RI::MethodSummary 
  name: start_import
- !ruby/object:RI::MethodSummary 
  name: terminate
- !ruby/object:RI::MethodSummary 
  name: wait?
name: SystemCommand
superclass: Filter
PK@|[���#��.ri/1.8/system/Shell/default_system_path-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::default_system_path
is_singleton: true
name: default_system_path
params: ()
visibility: public
PK@|[�����,ri/1.8/system/Shell/AppendIO/input%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::AppendIO#input=
is_singleton: false
name: input=
params: (filter)
visibility: public
PKA|[�0h�__0ri/1.8/system/Shell/AppendIO/cdesc-AppendIO.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: class Sort &lt; Cat
- !ruby/struct:SM::Flow::VERB 
  body: "  def initialize(sh, *filenames)\n    super\n  end\n\n  def each(rs = nil)\n    ary = []\n    super{|l|       ary.push l}\n    for l in ary.sort!\n    yield l\n    end\n  end\n"
- !ruby/struct:SM::Flow::P 
  body: end
constants: []

full_name: Shell::AppendIO
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: input=
name: AppendIO
superclass: BuiltInCommand
PKA|[��4��'ri/1.8/system/Shell/AppendIO/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::AppendIO::new
is_singleton: true
name: new
params: (sh, io, filter)
visibility: public
PKA|[����ri/1.8/system/Shell/popd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #popdir"
full_name: Shell#popd
is_singleton: false
name: popd
params: ()
visibility: public
PKA|[�'��.ri/1.8/system/Shell/AppendFile/input%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::AppendFile#input=
is_singleton: false
name: input=
params: (filter)
visibility: public
PKA|[
�
##4ri/1.8/system/Shell/AppendFile/cdesc-AppendFile.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: Shell::AppendFile
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: input=
name: AppendFile
superclass: AppendIO
PKA|[d�3��)ri/1.8/system/Shell/AppendFile/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::AppendFile::new
is_singleton: true
name: new
params: (sh, to_filename, filter)
visibility: public
PKA|[���c��/ri/1.8/system/Shell/CommandProcessor/tee-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::CommandProcessor#tee
is_singleton: false
name: tee
params: (file)
visibility: public
PKA|[�]�[&&2ri/1.8/system/Shell/CommandProcessor/system-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: CommandProcessor#system(command, *opts)
- !ruby/struct:SM::Flow::VERB 
  body: "    command: String\n    opts:      String\n    return:  SystemCommand\n  Same as system() function\n  example:\n    print sh.system(&quot;ls&quot;, &quot;-l&quot;)\n    sh.system(&quot;ls&quot;, &quot;-l&quot;) | sh.head &gt; STDOUT\n"
full_name: Shell::CommandProcessor#system
is_singleton: false
name: system
params: (command, *opts)
visibility: public
PKA|[`q���>ri/1.8/system/Shell/CommandProcessor/def_system_command-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: CommandProcessor.def_system_command(command, path)
- !ruby/struct:SM::Flow::VERB 
  body: "    command:  String\n    path:       String\n  define 'command()' method as method.\n"
full_name: Shell::CommandProcessor::def_system_command
is_singleton: true
name: def_system_command
params: (command, path = command)
visibility: public
PKA|[:^8��/ri/1.8/system/Shell/CommandProcessor/out-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: internal commands
full_name: Shell::CommandProcessor#out
is_singleton: false
name: out
params: (dev = STDOUT, &block)
visibility: public
PKA|[�)����6ri/1.8/system/Shell/CommandProcessor/run_config-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: include run file.
full_name: Shell::CommandProcessor::run_config
is_singleton: true
name: run_config
params: ()
visibility: public
PKA|[Q���2ri/1.8/system/Shell/CommandProcessor/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #test"
full_name: Shell::CommandProcessor#[]
is_singleton: false
name: "[]"
params: (command, file1, file2=nil)
visibility: public
PKA|[�k��cc0ri/1.8/system/Shell/CommandProcessor/glob-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: def sort(*filenames)
- !ruby/struct:SM::Flow::VERB 
  body: "  Sort.new(self, *filenames)\n"
- !ruby/struct:SM::Flow::P 
  body: end
full_name: Shell::CommandProcessor#glob
is_singleton: false
name: glob
params: (pattern)
visibility: public
PKA|[� �OO1ri/1.8/system/Shell/CommandProcessor/rmdir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: CommandProcessor#rmdir(*path)
- !ruby/struct:SM::Flow::VERB 
  body: "    path: String\n  same as Dir.rmdir()\n"
full_name: Shell::CommandProcessor#rmdir
is_singleton: false
name: rmdir
params: (*path)
visibility: public
PKA|[z�b�8ri/1.8/system/Shell/CommandProcessor/effect_umask-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: private functions
full_name: Shell::CommandProcessor#effect_umask
is_singleton: false
name: effect_umask
params: () {|| ...}
visibility: private
PKA|[��U���Iri/1.8/system/Shell/CommandProcessor/add_delegate_command_to_shell-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::CommandProcessor::add_delegate_command_to_shell
is_singleton: true
name: add_delegate_command_to_shell
params: (id)
visibility: public
PKA|[� ���9ri/1.8/system/Shell/CommandProcessor/alias_command-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::CommandProcessor::alias_command
is_singleton: true
name: alias_command
params: (ali, command, *opts, &block)
visibility: public
PKA|[B�2U��2ri/1.8/system/Shell/CommandProcessor/unlink-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: CommandProcessor#unlink(path)
- !ruby/struct:SM::Flow::VERB 
  body: "  same as:\n    Dir#unlink  (when path is directory)\n    File#unlink (when path is file)\n"
full_name: Shell::CommandProcessor#unlink
is_singleton: false
name: unlink
params: (path)
visibility: public
PKA|[�G]U��/ri/1.8/system/Shell/CommandProcessor/cat-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::CommandProcessor#cat
is_singleton: false
name: cat
params: (*filenames)
visibility: public
PKA|[�೗007ri/1.8/system/Shell/CommandProcessor/check_point-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: finish_all_jobs
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: ProcessCommand#transact
full_name: Shell::CommandProcessor#check_point
is_singleton: false
name: check_point
params: ()
visibility: public
PKA|[�MG��2ri/1.8/system/Shell/CommandProcessor/concat-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::CommandProcessor#concat
is_singleton: false
name: concat
params: (*jobs)
visibility: public
PKA|[����882ri/1.8/system/Shell/CommandProcessor/rehash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: ProcessCommand#rehash
- !ruby/struct:SM::Flow::VERB 
  body: "  clear command hash table.\n"
full_name: Shell::CommandProcessor#rehash
is_singleton: false
name: rehash
params: ()
visibility: public
PKA|[���?;ri/1.8/system/Shell/CommandProcessor/finish_all_jobs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #check_point"
full_name: Shell::CommandProcessor#finish_all_jobs
is_singleton: false
name: finish_all_jobs
params: ()
visibility: public
PKA|[�����6ri/1.8/system/Shell/CommandProcessor/initialize-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::CommandProcessor::initialize
is_singleton: true
name: initialize
params: ()
visibility: public
PKA|[=�3ri/1.8/system/Shell/CommandProcessor/foreach-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: fn
comment: 
- !ruby/struct:SM::Flow::P 
  body: File related commands Shell#foreach Shell#open Shell#unlink Shell#test
- !ruby/struct:SM::Flow::P 
  body: "-"
- !ruby/struct:SM::Flow::P 
  body: CommandProcessor#foreach(path, rs)
- !ruby/struct:SM::Flow::VERB 
  body: "    path: String\n    rs:     String - record separator\n    iterator\n  Same as:\n    File#foreach (when path is file)\n    Dir#foreach (when path is directory)\n  path is relative to pwd\n"
full_name: Shell::CommandProcessor#foreach
is_singleton: false
name: foreach
params: (path = nil, *rs) {|fn| ...}
visibility: public
PKA|[;窽�5ri/1.8/system/Shell/CommandProcessor/alias_map-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::CommandProcessor::alias_map
is_singleton: true
name: alias_map
params: ()
visibility: public
PKA|[����Cri/1.8/system/Shell/CommandProcessor/install_system_commands-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: CommandProcessor.install_system_commands(pre)
- !ruby/struct:SM::Flow::VERB 
  body: "      pre: String - command name prefix\n"
- !ruby/struct:SM::Flow::P 
  body: defines every command which belongs in default_system_path via CommandProcessor.command(). It doesn't define already defined methods twice. By default, &quot;pre_&quot; is prefixes to each method name. Characters that may not be used in a method name are all converted to '_'. Definition errors are just ignored.
full_name: Shell::CommandProcessor::install_system_commands
is_singleton: true
name: install_system_commands
params: (pre = "sys_")
visibility: public
PKA|[E�ݷ��7ri/1.8/system/Shell/CommandProcessor/expand_path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: CommandProcessor#expand_path(path)
- !ruby/struct:SM::Flow::VERB 
  body: "    path:     String\n    return: String\n  returns the absolute path for &lt;path&gt;\n"
full_name: Shell::CommandProcessor#expand_path
is_singleton: false
name: expand_path
params: (path)
visibility: public
PKA|[���?��@ri/1.8/system/Shell/CommandProcessor/undef_system_command-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::CommandProcessor::undef_system_command
is_singleton: true
name: undef_system_command
params: (command)
visibility: public
PKA|[��u��0ri/1.8/system/Shell/CommandProcessor/open-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: CommandProcessor#open(path, mode)
- !ruby/struct:SM::Flow::VERB 
  body: "    path:     String\n    mode:     String\n    return: File or Dir\n  Same as:\n    File#open (when path is file)\n    Dir#open  (when path is directory)\n  mode has an effect only when path is a file\n"
full_name: Shell::CommandProcessor#open
is_singleton: false
name: open
params: (path, mode)
visibility: public
PKA|[D:=���;ri/1.8/system/Shell/CommandProcessor/unalias_command-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::CommandProcessor::unalias_command
is_singleton: true
name: unalias_command
params: (ali)
visibility: public
PKA|[���..1ri/1.8/system/Shell/CommandProcessor/mkdir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Dir related methods
- !ruby/struct:SM::Flow::P 
  body: Shell#mkdir Shell#rmdir
full_name: Shell::CommandProcessor#mkdir
is_singleton: false
name: mkdir
params: (*path)
visibility: public
PKA|[�—		@ri/1.8/system/Shell/CommandProcessor/cdesc-CommandProcessor.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_delegate_command_to_shell
- !ruby/object:RI::MethodSummary 
  name: alias_command
- !ruby/object:RI::MethodSummary 
  name: alias_map
- !ruby/object:RI::MethodSummary 
  name: def_builtin_commands
- !ruby/object:RI::MethodSummary 
  name: def_system_command
- !ruby/object:RI::MethodSummary 
  name: initialize
- !ruby/object:RI::MethodSummary 
  name: install_builtin_commands
- !ruby/object:RI::MethodSummary 
  name: install_system_commands
- !ruby/object:RI::MethodSummary 
  name: method_added
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: run_config
- !ruby/object:RI::MethodSummary 
  name: unalias_command
- !ruby/object:RI::MethodSummary 
  name: undef_system_command
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: initialize of Shell and related classes.
  name: NoDelegateMethods
  value: "[\"initialize\", \"expand_path\"]"
full_name: Shell::CommandProcessor
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: append
- !ruby/object:RI::MethodSummary 
  name: cat
- !ruby/object:RI::MethodSummary 
  name: check_point
- !ruby/object:RI::MethodSummary 
  name: concat
- !ruby/object:RI::MethodSummary 
  name: echo
- !ruby/object:RI::MethodSummary 
  name: effect_umask
- !ruby/object:RI::MethodSummary 
  name: expand_path
- !ruby/object:RI::MethodSummary 
  name: find_system_command
- !ruby/object:RI::MethodSummary 
  name: finish_all_jobs
- !ruby/object:RI::MethodSummary 
  name: foreach
- !ruby/object:RI::MethodSummary 
  name: glob
- !ruby/object:RI::MethodSummary 
  name: mkdir
- !ruby/object:RI::MethodSummary 
  name: notify
- !ruby/object:RI::MethodSummary 
  name: open
- !ruby/object:RI::MethodSummary 
  name: out
- !ruby/object:RI::MethodSummary 
  name: rehash
- !ruby/object:RI::MethodSummary 
  name: rmdir
- !ruby/object:RI::MethodSummary 
  name: system
- !ruby/object:RI::MethodSummary 
  name: tee
- !ruby/object:RI::MethodSummary 
  name: test
- !ruby/object:RI::MethodSummary 
  name: transact
- !ruby/object:RI::MethodSummary 
  name: unlink
name: CommandProcessor
superclass: Object
PKB|[
Vo��/ri/1.8/system/Shell/CommandProcessor/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::CommandProcessor::new
is_singleton: true
name: new
params: (shell)
visibility: public
PKB|[I�Ӎ))2ri/1.8/system/Shell/CommandProcessor/notify-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: mes if iterator?
comment: 
- !ruby/struct:SM::Flow::P 
  body: "%pwd, %cwd -&gt; @pwd"
full_name: Shell::CommandProcessor#notify
is_singleton: false
name: notify
params: (*opts, &block) {|mes if iterator?| ...}
visibility: public
PKB|[�\X��2ri/1.8/system/Shell/CommandProcessor/append-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::CommandProcessor#append
is_singleton: false
name: append
params: (to, filter)
visibility: public
PKB|[�!罻�0ri/1.8/system/Shell/CommandProcessor/echo-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::CommandProcessor#echo
is_singleton: false
name: echo
params: (*strings)
visibility: public
PKB|[�G���?ri/1.8/system/Shell/CommandProcessor/find_system_command-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::CommandProcessor#find_system_command
is_singleton: false
name: find_system_command
params: (command)
visibility: public
PKB|[�|����8ri/1.8/system/Shell/CommandProcessor/method_added-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::CommandProcessor::method_added
is_singleton: true
name: method_added
params: (id)
visibility: public
PKB|[�Y�Dri/1.8/system/Shell/CommandProcessor/install_builtin_commands-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: define default builtin commands
full_name: Shell::CommandProcessor::install_builtin_commands
is_singleton: true
name: install_builtin_commands
params: ()
visibility: public
PKB|[\y����0ri/1.8/system/Shell/CommandProcessor/test-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: "[]"
block_params: 
comment: 
full_name: Shell::CommandProcessor#test
is_singleton: false
name: test
params: (command, file1, file2=nil)
visibility: public
PKB|[y��

@ri/1.8/system/Shell/CommandProcessor/def_builtin_commands-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: CommandProcessor.def_builtin_commands(delegation_class, command_specs)
- !ruby/struct:SM::Flow::VERB 
  body: "    delegation_class: Class or Module\n    command_specs: [[command_name, [argument,...]],...]\n       command_name: String\n       arguments:      String\n          FILENAME?? -&gt; expand_path(filename??)\n          *FILENAME?? -&gt; filename??.collect{|f|expand_path(f)}.join(&quot;, &quot;)\n  define command_name(argument,...) as\n      delegation_class.command_name(argument,...)\n"
full_name: Shell::CommandProcessor::def_builtin_commands
is_singleton: true
name: def_builtin_commands
params: (delegation_class, command_specs)
visibility: public
PKC|[<��V��4ri/1.8/system/Shell/CommandProcessor/transact-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::CommandProcessor#transact
is_singleton: false
name: transact
params: (&block)
visibility: public
PKC|[Ϳ2*��#ri/1.8/system/Shell/debug%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell#debug=
is_singleton: false
name: debug=
params: (val)
visibility: public
PKC|[�G;�PP ri/1.8/system/Shell/chdir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: cd
block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: If called as iterator, it restores the current directory when the block ends.
full_name: Shell#chdir
is_singleton: false
name: chdir
params: (path = nil) {|| ...}
visibility: public
PKC|[.����!ri/1.8/system/Shell/popdir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: popd
block_params: 
comment: 
full_name: Shell#popdir
is_singleton: false
name: popdir
params: ()
visibility: public
PKC|[ʺ����"ri/1.8/system/Shell/pushdir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: pushd
block_params: ""
comment: 
full_name: Shell#pushdir
is_singleton: false
name: pushdir
params: (path = nil) {|| ...}
visibility: public
PKC|[Ob���1ri/1.8/system/Shell/BuiltInCommand/wait%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::BuiltInCommand#wait?
is_singleton: false
name: wait?
params: ()
visibility: public
PKC|[��//<ri/1.8/system/Shell/BuiltInCommand/cdesc-BuiltInCommand.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Shell::BuiltInCommand
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: active?
- !ruby/object:RI::MethodSummary 
  name: wait?
name: BuiltInCommand
superclass: Filter
PKC|[��˷�3ri/1.8/system/Shell/BuiltInCommand/active%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Shell::BuiltInCommand#active?
is_singleton: false
name: active?
params: ()
visibility: public
PKC|[�#�~~0ri/1.8/system/SyntaxError/cdesc-SyntaxError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: SyntaxError
includes: []

instance_methods: []

name: SyntaxError
superclass: ScriptError
PKC|[�2>͔�$ri/1.8/system/Kconv/cdesc-Kconv.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Kanji Converter for Ruby.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Auto-Detect
  name: AUTO
  value: NKF::AUTO
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: ISO-2022-JP
  name: JIS
  value: NKF::JIS
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: EUC-JP
  name: EUC
  value: NKF::EUC
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Shift_JIS
  name: SJIS
  value: NKF::SJIS
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: BINARY
  name: BINARY
  value: NKF::BINARY
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: NOCONV
  name: NOCONV
  value: NKF::NOCONV
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: ASCII
  name: ASCII
  value: NKF::ASCII
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: UTF-8
  name: UTF8
  value: NKF::UTF8
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: UTF-16
  name: UTF16
  value: NKF::UTF16
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: UTF-32
  name: UTF32
  value: NKF::UTF32
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: UNKNOWN
  name: UNKNOWN
  value: NKF::UNKNOWN
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Revision of kconv.rb
  name: REVISION
  value: "%q$Revision: 11708 $"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Regexp of Shift_JIS string (private constant)
  name: RegexpShiftjis
  value: "/\\A(?:                        [\\x00-\\x7f\\xa1-\\xdf] |                        [\\x81-\\x9f\\xe0-\\xfc][\\x40-\\x7e\\x80-\\xfc]                        )*\\z/nx"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Regexp of EUC-JP string (private constant)
  name: RegexpEucjp
  value: "/\\A(?:                     [\\x00-\\x7f]                         |                     \\x8e        [\\xa1-\\xdf]             |                     \\x8f        [\\xa1-\\xfe] [\\xa1-\\xfe] |                     [\\xa1-\\xfe] [\\xa1-\\xfe]                    )*\\z/nx"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Regexp of UTF-8 string (private constant)
  name: RegexpUtf8
  value: "/\\A(?:                     [\\x00-\\x7f]                                     |                     [\\xc2-\\xdf] [\\x80-\\xbf]                         |                     \\xe0        [\\xa0-\\xbf] [\\x80-\\xbf]             |                     [\\xe1-\\xef] [\\x80-\\xbf] [\\x80-\\xbf]             |                     \\xf0        [\\x90-\\xbf] [\\x80-\\xbf] [\\x80-\\xbf] |                     [\\xf1-\\xf3] [\\x80-\\xbf] [\\x80-\\xbf] [\\x80-\\xbf] |                     \\xf4        [\\x80-\\x8f] [\\x80-\\xbf] [\\x80-\\xbf]                    )*\\z/nx"
full_name: Kconv
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: guess
- !ruby/object:RI::MethodSummary 
  name: guess_old
- !ruby/object:RI::MethodSummary 
  name: iseuc
- !ruby/object:RI::MethodSummary 
  name: issjis
- !ruby/object:RI::MethodSummary 
  name: isutf8
- !ruby/object:RI::MethodSummary 
  name: kconv
- !ruby/object:RI::MethodSummary 
  name: toeuc
- !ruby/object:RI::MethodSummary 
  name: tojis
- !ruby/object:RI::MethodSummary 
  name: tosjis
- !ruby/object:RI::MethodSummary 
  name: toutf16
- !ruby/object:RI::MethodSummary 
  name: toutf8
name: Kconv
superclass: 
PKC|[�I���"ri/1.8/system/Kconv/toutf16-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert <tt>str</tt> to UTF-16
- !ruby/struct:SM::Flow::P 
  body: <b>Note</b> This method decode MIME encoded string and convert halfwidth katakana to fullwidth katakana. If you don't want it, use NKF.nkf('-w16xm0', str).
full_name: Kconv#toutf16
is_singleton: false
name: toutf16
params: |
  Kconv.toutf16(str)   -> string

visibility: public
PKC|[K� n��!ri/1.8/system/Kconv/tosjis-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert <tt>str</tt> to Shift_JIS
- !ruby/struct:SM::Flow::P 
  body: <b>Note</b> This method decode MIME encoded string and convert halfwidth katakana to fullwidth katakana. If you don't want it, use NKF.nkf('-sxm0', str).
full_name: Kconv#tosjis
is_singleton: false
name: tosjis
params: |
  Kconv.tosjis(str)   -> string

visibility: public
PKC|[�)�r!! ri/1.8/system/Kconv/kconv-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert <tt>str</tt> to out_code. <tt>out_code</tt> and <tt>in_code</tt> are given as constants of Kconv.
- !ruby/struct:SM::Flow::P 
  body: <b>Note</b> This method decode MIME encoded string and convert halfwidth katakana to fullwidth katakana. If you don't want to decode them, use NKF.nkf.
full_name: Kconv#kconv
is_singleton: false
name: kconv
params: |
  Kconv.kconv(str, out_code, in_code = Kconv::AUTO)

visibility: public
PKD|[!��xzz!ri/1.8/system/Kconv/isutf8-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns whether input encoding is UTF-8 or not.
- !ruby/struct:SM::Flow::P 
  body: <b>Note</b> don't expect this return value is MatchData.
full_name: Kconv#isutf8
is_singleton: false
name: isutf8
params: |
  Kconv.isutf8(str)   -> obj or nil

visibility: public
PKD|[�;�5�� ri/1.8/system/Kconv/tojis-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert <tt>str</tt> to ISO-2022-JP
- !ruby/struct:SM::Flow::P 
  body: <b>Note</b> This method decode MIME encoded string and convert halfwidth katakana to fullwidth katakana. If you don't want it, use NKF.nkf('-jxm0', str).
full_name: Kconv#tojis
is_singleton: false
name: tojis
params: |
  Kconv.tojis(str)   -> string

visibility: public
PKE|[�j,�~~!ri/1.8/system/Kconv/issjis-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns whether input encoding is Shift_JIS or not.
- !ruby/struct:SM::Flow::P 
  body: <b>Note</b> don't expect this return value is MatchData.
full_name: Kconv#issjis
is_singleton: false
name: issjis
params: |
  Kconv.issjis(str)   -> obj or nil

visibility: public
PKE|[%����!ri/1.8/system/Kconv/toutf8-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert <tt>str</tt> to UTF-8
- !ruby/struct:SM::Flow::P 
  body: <b>Note</b> This method decode MIME encoded string and convert halfwidth katakana to fullwidth katakana. If you don't want it, use NKF.nkf('-wxm0', str).
full_name: Kconv#toutf8
is_singleton: false
name: toutf8
params: |
  Kconv.toutf8(str)   -> string

visibility: public
PKE|[.����� ri/1.8/system/Kconv/toeuc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert <tt>str</tt> to EUC-JP
- !ruby/struct:SM::Flow::P 
  body: <b>Note</b> This method decode MIME encoded string and convert halfwidth katakana to fullwidth katakana. If you don't want it, use NKF.nkf('-exm0', str).
full_name: Kconv#toeuc
is_singleton: false
name: toeuc
params: |
  Kconv.toeuc(str)   -> string

visibility: public
PKF|[߅�$ri/1.8/system/Kconv/guess_old-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Guess input encoding by NKF.guess1
full_name: Kconv#guess_old
is_singleton: false
name: guess_old
params: |
  Kconv.guess_old(str)   -> integer

visibility: public
PKF|['��

 ri/1.8/system/Kconv/guess-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Guess input encoding by NKF.guess2
full_name: Kconv#guess
is_singleton: false
name: guess
params: |
  Kconv.guess(str)   -> integer

visibility: public
PKF|[n�r�xx ri/1.8/system/Kconv/iseuc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns whether input encoding is EUC-JP or not.
- !ruby/struct:SM::Flow::P 
  body: <b>Note</b> don't expect this return value is MatchData.
full_name: Kconv#iseuc
is_singleton: false
name: iseuc
params: |
  Kconv.iseuc(str)   -> obj or nil

visibility: public
PKF|["��l228ri/1.8/system/InvalidArgument/cdesc-InvalidArgument.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Raises when the given argument does not match required format.
constants: []

full_name: InvalidArgument
includes: []

instance_methods: []

name: InvalidArgument
superclass: ParseError
PKF|[�d,���<ri/1.8/system/TimeExtentionTest/cdesc-TimeExtentionTest.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: TimeExtentionTest
includes: []

instance_methods: []

name: TimeExtentionTest
superclass: Test::Unit::TestCase
PKG|[�FF ri/1.8/system/Kernel/fail-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: With no arguments, raises the exception in <tt>$!</tt> or raises a <tt>RuntimeError</tt> if <tt>$!</tt> is <tt>nil</tt>. With a single <tt>String</tt> argument, raises a <tt>RuntimeError</tt> with the string as a message. Otherwise, the first parameter should be the name of an <tt>Exception</tt> class (or an object that returns an <tt>Exception</tt> object when sent an <tt>exception</tt> message). The optional second parameter sets the message associated with the exception, and the third parameter is an array of callback information. Exceptions are caught by the <tt>rescue</tt> clause of <tt>begin...end</tt> blocks.
- !ruby/struct:SM::Flow::VERB 
  body: "   raise &quot;Failed to create socket&quot;\n   raise ArgumentError, &quot;No parameters&quot;, caller\n"
full_name: Kernel#fail
is_singleton: false
name: fail
params: |
  raise
  raise(string)
  raise(exception [, string [, array]])
  fail
  fail(string)
  fail(exception [, string [, array]])

visibility: public
PKG|[��uf��"ri/1.8/system/Kernel/system-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Executes <em>cmd</em> in a subshell, returning <tt>true</tt> if the command was found and ran successfully, <tt>false</tt> otherwise. An error status is available in <tt>$?</tt>. The arguments are processed in the same way as for <tt>Kernel::exec</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   system(&quot;echo *&quot;)\n   system(&quot;echo&quot;, &quot;*&quot;)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   config.h main.rb\n   *\n"
full_name: Kernel#system
is_singleton: false
name: system
params: |
  system(cmd [, arg, ...])    => true or false

visibility: public
PKG|[��c�� ri/1.8/system/Kernel/exec-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Replaces the current process by running the given external <em>command</em>. If <tt>exec</tt> is given a single argument, that argument is taken as a line that is subject to shell expansion before being executed. If multiple arguments are given, the second and subsequent arguments are passed as parameters to <em>command</em> with no shell expansion. If the first argument is a two-element array, the first element is the command to be executed, and the second argument is used as the <tt>argv[0]</tt> value, which may show up in process listings. In MSDOS environments, the command is executed in a subshell; otherwise, one of the <tt>exec(2)</tt> system calls is used, so the running command may inherit some of the environment of the original program (including open file descriptors).
- !ruby/struct:SM::Flow::VERB 
  body: "   exec &quot;echo *&quot;       # echoes list of files in current directory\n   # never get here\n\n   exec &quot;echo&quot;, &quot;*&quot;    # echoes an asterisk\n   # never get here\n"
full_name: Kernel#exec
is_singleton: false
name: exec
params: |
  exec(command [, arg, ...])

visibility: public
PKG|[���c((ri/1.8/system/Kernel/URI-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: alias for URI.parse.
- !ruby/struct:SM::Flow::P 
  body: This method is introduced at 1.8.2.
full_name: Kernel#URI
is_singleton: false
name: URI
params: (uri_str)
visibility: public
PKH|[��S$ri/1.8/system/Kernel/autoload-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Registers <em>filename</em> to be loaded (using <tt>Kernel::require</tt>) the first time that <em>module</em> (which may be a <tt>String</tt> or a symbol) is accessed.
- !ruby/struct:SM::Flow::VERB 
  body: "   autoload(:MyModule, &quot;/usr/local/lib/modules/my_module.rb&quot;)\n"
full_name: Kernel#autoload
is_singleton: false
name: autoload
params: |
  autoload(module, filename)   => nil

visibility: public
PKH|[	�	(��!ri/1.8/system/Kernel/print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Prints each object in turn to <tt>$stdout</tt>. If the output field separator (<tt>$,</tt>) is not <tt>nil</tt>, its contents will appear between each field. If the output record separator (<tt>$\</tt>) is not <tt>nil</tt>, it will be appended to the output. If no arguments are given, prints <tt>$_</tt>. Objects that aren't strings will be converted by calling their <tt>to_s</tt> method.
- !ruby/struct:SM::Flow::VERB 
  body: "   print &quot;cat&quot;, [1,2,3], 99, &quot;\\n&quot;\n   $, = &quot;, &quot;\n   $\\ = &quot;\\n&quot;\n   print &quot;cat&quot;, [1,2,3], 99\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   cat12399\n   cat, 1, 2, 3, 99\n"
full_name: Kernel#print
is_singleton: false
name: print
params: |
  print(obj, ...)    => nil

visibility: public
PKH|[���"ri/1.8/system/Kernel/printf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Equivalent to:"
- !ruby/struct:SM::Flow::VERB 
  body: "   io.write(sprintf(string, obj, ...)\n"
- !ruby/struct:SM::Flow::P 
  body: or
- !ruby/struct:SM::Flow::VERB 
  body: "   $stdout.write(sprintf(string, obj, ...)\n"
full_name: Kernel#printf
is_singleton: false
name: printf
params: |
  printf(io, string [, obj ... ] )    => nil
  printf(string [, obj ... ] )        => nil

visibility: public
PKH|[�� ��#ri/1.8/system/Kernel/binding-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a <tt>Binding</tt> object, describing the variable and method bindings at the point of call. This object can be used when calling <tt>eval</tt> to execute the evaluated command in this environment. Also see the description of class <tt>Binding</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   def getBinding(param)\n     return binding\n   end\n   b = getBinding(&quot;hello&quot;)\n   eval(&quot;param&quot;, b)   #=&gt; &quot;hello&quot;\n"
full_name: Kernel#binding
is_singleton: false
name: binding
params: |
  binding -> a_binding

visibility: public
PKI|[���77$ri/1.8/system/Kernel/Pathname-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: create a pathname object.
- !ruby/struct:SM::Flow::P 
  body: This method is available since 1.8.5.
full_name: Kernel#Pathname
is_singleton: false
name: Pathname
params: (path)
visibility: private
PKI|[��00*ri/1.8/system/Kernel/method_missing-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invoked by Ruby when <em>obj</em> is sent a message it cannot handle. <em>symbol</em> is the symbol for the method called, and <em>args</em> are any arguments that were passed to it. By default, the interpreter raises an error when this method is called. However, it is possible to override the method to provide more dynamic behavior. The example below creates a class <tt>Roman</tt>, which responds to methods with names consisting of roman numerals, returning the corresponding integer values.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Roman\n     def romanToInt(str)\n       # ...\n     end\n     def method_missing(methId)\n       str = methId.id2name\n       romanToInt(str)\n     end\n   end\n\n   r = Roman.new\n   r.iv      #=&gt; 4\n   r.xxiii   #=&gt; 23\n   r.mm      #=&gt; 2000\n"
full_name: Kernel#method_missing
is_singleton: false
name: method_missing
params: |
  obj.method_missing(symbol [, *args] )   => result

visibility: public
PKI|[��&2ri/1.8/system/Kernel/open_uri_original_open-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #open"
full_name: Kernel#open_uri_original_open
is_singleton: false
name: open_uri_original_open
params: (...)
visibility: private
PKI|[�+o<< ri/1.8/system/Kernel/gsub-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>$_.gsub...</tt>, except that <tt>$_</tt> receives the modified result.
- !ruby/struct:SM::Flow::VERB 
  body: "   $_ = &quot;quick brown fox&quot;\n   gsub /[aeiou]/, '*'   #=&gt; &quot;q**ck br*wn f*x&quot;\n   $_                    #=&gt; &quot;q**ck br*wn f*x&quot;\n"
full_name: Kernel#gsub
is_singleton: false
name: gsub
params: |
  gsub(pattern, replacement)    => string
  gsub(pattern) {|...| block }  => string

visibility: public
PKI|[�3���*ri/1.8/system/Kernel/block_given%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <tt>yield</tt> would execute a block in the current context. The <tt>iterator?</tt> form is mildly deprecated.
- !ruby/struct:SM::Flow::VERB 
  body: "   def try\n     if block_given?\n       yield\n     else\n       &quot;no block&quot;\n     end\n   end\n   try                  #=&gt; &quot;no block&quot;\n   try { &quot;hello&quot; }      #=&gt; &quot;hello&quot;\n   try do &quot;hello&quot; end   #=&gt; &quot;hello&quot;\n"
full_name: Kernel#block_given?
is_singleton: false
name: block_given?
params: |
  block_given?   => true or false
  iterator?      => true or false

visibility: public
PKJ|[F��YGG"ri/1.8/system/Kernel/select-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>Kernel#select</tt>.
full_name: Kernel#select
is_singleton: false
name: select
params: |
  IO.select(read_array 
  [, write_array 
  [, error_array 
  [, timeout]]] ) =>  array  or  nil

visibility: public
PKJ|[���!ri/1.8/system/Kernel/scanf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Kernel#scanf
is_singleton: false
name: scanf
params: (fs,&b)
visibility: private
PKJ|[���!ri/1.8/system/Kernel/abort-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Terminate execution immediately, effectively by calling <tt>Kernel.exit(1)</tt>. If <em>msg</em> is given, it is written to STDERR prior to terminating.
full_name: Kernel#abort
is_singleton: false
name: abort
params: |
  abort
  Kernel::abort
  Process::abort

visibility: public
PKJ|[�����ri/1.8/system/Kernel/%60-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the standard output of running <em>cmd</em> in a subshell. The built-in syntax <tt>%x{...}</tt> uses this method. Sets <tt>$?</tt> to the process status.
- !ruby/struct:SM::Flow::VERB 
  body: "   `date`                   #=&gt; &quot;Wed Apr  9 08:56:30 CDT 2003\\n&quot;\n   `ls testdir`.split[1]    #=&gt; &quot;main.rb&quot;\n   `echo oops &amp;&amp; exit 99`   #=&gt; &quot;oops\\n&quot;\n   $?.exitstatus            #=&gt; 99\n"
full_name: Kernel#`
is_singleton: false
name: `
params: |
  `cmd`    => string

visibility: public
PKJ|[�]�W��"ri/1.8/system/Kernel/String-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts <em>arg</em> to a <tt>String</tt> by calling its <tt>to_s</tt> method.
- !ruby/struct:SM::Flow::VERB 
  body: "   String(self)        #=&gt; &quot;main&quot;\n   String(self.class   #=&gt; &quot;Object&quot;\n   String(123456)      #=&gt; &quot;123456&quot;\n"
full_name: Kernel#String
is_singleton: false
name: String
params: |
  String(arg)   => string

visibility: public
PKK|[�ci��!ri/1.8/system/Kernel/chomp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>$_ = $_.chomp(<em>string</em>)</tt>. See <tt>String#chomp</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   $_ = &quot;now\\n&quot;\n   chomp         #=&gt; &quot;now&quot;\n   $_            #=&gt; &quot;now&quot;\n   chomp &quot;ow&quot;    #=&gt; &quot;n&quot;\n   $_            #=&gt; &quot;n&quot;\n   chomp &quot;xxx&quot;   #=&gt; &quot;n&quot;\n   $_            #=&gt; &quot;n&quot;\n"
full_name: Kernel#chomp
is_singleton: false
name: chomp
params: |
  chomp            => $_
  chomp(string)    => $_

visibility: public
PKK|[C�\<��"ri/1.8/system/Kernel/lambda-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>Proc.new</tt>, except the resulting Proc objects check the number of parameters passed when called.
full_name: Kernel#lambda
is_singleton: false
name: lambda
params: |
  proc   { |...| block }  => a_proc
  lambda { |...| block }  => a_proc

visibility: public
PKK|[�H<<#ri/1.8/system/Kernel/gsub%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>Kernel::gsub</tt>, except <tt>nil</tt> is returned if <tt>$_</tt> is not modified.
- !ruby/struct:SM::Flow::VERB 
  body: "   $_ = &quot;quick brown fox&quot;\n   gsub! /cat/, '*'   #=&gt; nil\n   $_                 #=&gt; &quot;quick brown fox&quot;\n"
full_name: Kernel#gsub!
is_singleton: false
name: gsub!
params: |
  gsub!(pattern, replacement)    => string or nil
  gsub!(pattern) {|...| block }  => string or nil

visibility: public
PKL|[N�J�ZZ$ri/1.8/system/Kernel/readline-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>Kernel::gets</tt>, except <tt>readline</tt> raises <tt>EOFError</tt> at end of file.
full_name: Kernel#readline
is_singleton: false
name: readline
params: |
  readline(separator=$/)   => string

visibility: public
PKL|[RQ�!'ri/1.8/system/Kernel/autoload%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Registers <em>filename</em> to be loaded (using <tt>Kernel::require</tt>) the first time that <em>module</em> (which may be a <tt>String</tt> or a symbol) is accessed.
- !ruby/struct:SM::Flow::VERB 
  body: "   autoload(:MyModule, &quot;/usr/local/lib/modules/my_module.rb&quot;)\n"
full_name: Kernel#autoload?
is_singleton: false
name: autoload?
params: |
  autoload(module, filename)   => nil

visibility: public
PKL|[D_XjHH!ri/1.8/system/Kernel/raise-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: With no arguments, raises the exception in <tt>$!</tt> or raises a <tt>RuntimeError</tt> if <tt>$!</tt> is <tt>nil</tt>. With a single <tt>String</tt> argument, raises a <tt>RuntimeError</tt> with the string as a message. Otherwise, the first parameter should be the name of an <tt>Exception</tt> class (or an object that returns an <tt>Exception</tt> object when sent an <tt>exception</tt> message). The optional second parameter sets the message associated with the exception, and the third parameter is an array of callback information. Exceptions are caught by the <tt>rescue</tt> clause of <tt>begin...end</tt> blocks.
- !ruby/struct:SM::Flow::VERB 
  body: "   raise &quot;Failed to create socket&quot;\n   raise ArgumentError, &quot;No parameters&quot;, caller\n"
full_name: Kernel#raise
is_singleton: false
name: raise
params: |
  raise
  raise(string)
  raise(exception [, string [, array]])
  fail
  fail(string)
  fail(exception [, string [, array]])

visibility: public
PKL|[Qtt ri/1.8/system/Kernel/eval-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Evaluates the Ruby expression(s) in <em>string</em>. If <em>binding</em> is given, the evaluation is performed in its context. The binding may be a <tt>Binding</tt> object or a <tt>Proc</tt> object. If the optional <em>filename</em> and <em>lineno</em> parameters are present, they will be used when reporting syntax errors.
- !ruby/struct:SM::Flow::VERB 
  body: "   def getBinding(str)\n     return binding\n   end\n   str = &quot;hello&quot;\n   eval &quot;str + ' Fred'&quot;                      #=&gt; &quot;hello Fred&quot;\n   eval &quot;str + ' Fred'&quot;, getBinding(&quot;bye&quot;)   #=&gt; &quot;bye Fred&quot;\n"
full_name: Kernel#eval
is_singleton: false
name: eval
params: |
  eval(string [, binding [, filename [,lineno]]])  => obj

visibility: public
PKM|[>�_/�� ri/1.8/system/Kernel/load-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Loads and executes the Ruby program in the file <em>filename</em>. If the filename does not resolve to an absolute path, the file is searched for in the library directories listed in <tt>$:</tt>. If the optional <em>wrap</em> parameter is <tt>true</tt>, the loaded script will be executed under an anonymous module, protecting the calling program's global namespace. In no circumstance will any local variables in the loaded file be propagated to the loading environment.
full_name: Kernel#load
is_singleton: false
name: load
params: |
  load(filename, wrap=false)   => true

visibility: public
PKM|[���(�� ri/1.8/system/Kernel/proc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>Proc.new</tt>, except the resulting Proc objects check the number of parameters passed when called.
full_name: Kernel#proc
is_singleton: false
name: proc
params: |
  proc   { |...| block }  => a_proc
  lambda { |...| block }  => a_proc

visibility: public
PKM|[4�ri/1.8/system/Kernel/pp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: prints arguments in pretty form.
- !ruby/struct:SM::Flow::P 
  body: pp returns nil.
full_name: Kernel#pp
is_singleton: false
name: pp
params: (*objs)
visibility: private
PKN|[�8؄@@$ri/1.8/system/Kernel/chomp%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>$_.chomp!(<em>string</em>)</tt>. See <tt>String#chomp!</tt>
- !ruby/struct:SM::Flow::VERB 
  body: "   $_ = &quot;now\\n&quot;\n   chomp!       #=&gt; &quot;now&quot;\n   $_           #=&gt; &quot;now&quot;\n   chomp! &quot;x&quot;   #=&gt; nil\n   $_           #=&gt; &quot;now&quot;\n"
full_name: Kernel#chomp!
is_singleton: false
name: chomp!
params: |
  chomp!             => $_ or nil
  chomp!(string)     => $_ or nil

visibility: public
PKN|[U�g__&ri/1.8/system/Kernel/__method__-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the name of the current method as a Symbol. If called from inside of an aliased method it will return the original nonaliased name. If called outside of a method, it returns <tt>nil</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "  def foo\n    <em>method</em>\n  end\n  alias bar foo\n\n  foo                # =&gt; :foo\n  bar                # =&gt; :foo\n"
full_name: Kernel#__method__
is_singleton: false
name: __method__
params: |
  __method__         => symbol

visibility: public
PKN|[$*\/*ri/1.8/system/Kernel/pretty_inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: returns a pretty printed object as a string.
full_name: Kernel#pretty_inspect
is_singleton: false
name: pretty_inspect
params: ()
visibility: public
PKN|[#X5��� ri/1.8/system/Kernel/open-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: makes possible to open various resources including URIs. If the first argument respond to `open' method, the method is called with the rest arguments.
- !ruby/struct:SM::Flow::P 
  body: If the first argument is a string which begins with xxx://, it is parsed by URI.parse. If the parsed object respond to `open' method, the method is called with the rest arguments.
- !ruby/struct:SM::Flow::P 
  body: Otherwise original open is called.
- !ruby/struct:SM::Flow::P 
  body: Since open-uri.rb provides URI::HTTP#open, URI::HTTPS#open and URI::FTP#open, Kernel[#.]open can accepts such URIs and strings which begins with http://, https:// and ftp://. In these case, the opened file object is extended by OpenURI::Meta.
full_name: Kernel#open
is_singleton: false
name: open
params: (name, *rest, &block)
visibility: private
PKO|[D=_�tt#ri/1.8/system/Kernel/sprintf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns the string resulting from applying <em>format_string</em> to any additional arguments. Within the format string, any characters other than format sequences are copied to the result. A format sequence consists of a percent sign, followed by optional flags, width, and precision indicators, then terminated with a field type character. The field type controls how the corresponding <tt>sprintf</tt> argument is to be interpreted, while the flags modify that interpretation. The field type characters are listed in the table at the end of this section. The flag characters are:"
- !ruby/struct:SM::Flow::VERB 
  body: "  Flag     | Applies to   | Meaning\n  ---------+--------------+-----------------------------------------\n  space    | bdeEfgGiouxX | Leave a space at the start of\n           |              | positive numbers.\n  ---------+--------------+-----------------------------------------\n  (digit)$ | all          | Specifies the absolute argument number\n           |              | for this field. Absolute and relative\n           |              | argument numbers cannot be mixed in a\n           |              | sprintf string.\n  ---------+--------------+-----------------------------------------\n   #       | beEfgGoxX    | Use an alternative format. For the\n           |              | conversions `o', `x', `X', and `b',\n           |              | prefix the result with ``0'', ``0x'', ``0X'',\n           |              |  and ``0b'', respectively. For `e',\n           |              | `E', `f', `g', and 'G', force a decimal\n           |              | point to be added, even if no digits follow.\n           |              | For `g' and 'G', do not remove trailing zeros.\n  ---------+--------------+-----------------------------------------\n  +        | bdeEfgGiouxX | Add a leading plus sign to positive numbers.\n  ---------+--------------+-----------------------------------------\n  -        | all          | Left-justify the result of this conversion.\n  ---------+--------------+-----------------------------------------\n  0 (zero) | bdeEfgGiouxX | Pad with zeros, not spaces.\n  ---------+--------------+-----------------------------------------\n  *        | all          | Use the next argument as the field width.\n           |              | If negative, left-justify the result. If the\n           |              | asterisk is followed by a number and a dollar\n           |              | sign, use the indicated argument as the width.\n"
- !ruby/struct:SM::Flow::P 
  body: The field width is an optional integer, followed optionally by a period and a precision. The width specifies the minimum number of characters that will be written to the result for this field. For numeric fields, the precision controls the number of decimal places displayed. For string fields, the precision determines the maximum number of characters to be copied from the string. (Thus, the format sequence <tt>%10.10s</tt> will always contribute exactly ten characters to the result.)
- !ruby/struct:SM::Flow::P 
  body: "The field types are:"
- !ruby/struct:SM::Flow::VERB 
  body: "    Field |  Conversion\n    ------+--------------------------------------------------------------\n      b   | Convert argument as a binary number.\n      c   | Argument is the numeric code for a single character.\n      d   | Convert argument as a decimal number.\n      E   | Equivalent to `e', but uses an uppercase E to indicate\n          | the exponent.\n      e   | Convert floating point argument into exponential notation\n          | with one digit before the decimal point. The precision\n          | determines the number of fractional digits (defaulting to six).\n      f   | Convert floating point argument as [-]ddd.ddd,\n          |  where the precision determines the number of digits after\n          | the decimal point.\n      G   | Equivalent to `g', but use an uppercase `E' in exponent form.\n      g   | Convert a floating point number using exponential form\n          | if the exponent is less than -4 or greater than or\n          | equal to the precision, or in d.dddd form otherwise.\n      i   | Identical to `d'.\n      o   | Convert argument as an octal number.\n      p   | The valuing of argument.inspect.\n      s   | Argument is a string to be substituted. If the format\n          | sequence contains a precision, at most that many characters\n          | will be copied.\n      u   | Treat argument as an unsigned decimal number. Negative integers\n          | are displayed as a 32 bit two's complement plus one for the\n          | underlying architecture; that is, 2 ** 32 + n.  However, since\n          | Ruby has no inherent limit on bits used to represent the\n          | integer, this value is preceded by two dots (..) in order to\n          | indicate a infinite number of leading sign bits.\n      X   | Convert argument as a hexadecimal number using uppercase\n          | letters. Negative numbers will be displayed with two\n          | leading periods (representing an infinite string of\n          | leading 'FF's.\n      x   | Convert argument as a hexadecimal number.\n          | Negative numbers will be displayed with two\n          | leading periods (representing an infinite string of\n          | leading 'ff's.\n"
- !ruby/struct:SM::Flow::P 
  body: "Examples:"
- !ruby/struct:SM::Flow::VERB 
  body: "   sprintf(&quot;%d %04x&quot;, 123, 123)               #=&gt; &quot;123 007b&quot;\n   sprintf(&quot;%08b '%4s'&quot;, 123, 123)            #=&gt; &quot;01111011 ' 123'&quot;\n   sprintf(&quot;%1$*2$s %2$d %1$s&quot;, &quot;hello&quot;, 8)   #=&gt; &quot;   hello 8 hello&quot;\n   sprintf(&quot;%1$*2$s %2$d&quot;, &quot;hello&quot;, -8)       #=&gt; &quot;hello    -8&quot;\n   sprintf(&quot;%+g:% g:%-g&quot;, 1.23, 1.23, 1.23)   #=&gt; &quot;+1.23: 1.23:1.23&quot;\n   sprintf(&quot;%u&quot;, -123)                        #=&gt; &quot;..4294967173&quot;\n"
full_name: Kernel#sprintf
is_singleton: false
name: sprintf
params: |
  format(format_string [, arguments...] )   => string
  sprintf(format_string [, arguments...] )  => string

visibility: public
PKO|[��U#ri/1.8/system/Kernel/at_exit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts <em>block</em> to a <tt>Proc</tt> object (and therefore binds it at the point of call) and registers it for execution when the program exits. If multiple handlers are registered, they are executed in reverse order of registration.
- !ruby/struct:SM::Flow::VERB 
  body: "   def do_at_exit(str1)\n     at_exit { print str1 }\n   end\n   at_exit { puts &quot;cruel world&quot; }\n   do_at_exit(&quot;goodbye &quot;)\n   exit\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   goodbye cruel world\n"
full_name: Kernel#at_exit
is_singleton: false
name: at_exit
params: |
  at_exit { block } -> proc

visibility: public
PKO|[�3pOO"ri/1.8/system/Kernel/sub%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>$_.sub!(<em>args</em>)</tt>.
full_name: Kernel#sub!
is_singleton: false
name: sub!
params: |
  sub!(pattern, replacement)    => $_ or nil
  sub!(pattern) {|...| block }  => $_ or nil

visibility: public
PKP|[d���� ri/1.8/system/Kernel/loop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Repeatedly executes the block.
- !ruby/struct:SM::Flow::VERB 
  body: "   loop do\n     print &quot;Input: &quot;\n     line = gets\n     break if !line or line =~ /^qQ/\n     # ...\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: StopIteration raised in the block breaks the loop.
full_name: Kernel#loop
is_singleton: false
name: loop
params: |
  loop {|| block } 

visibility: public
PKP|[aL��[[ ri/1.8/system/Kernel/scan-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to calling <tt>$_.scan</tt>. See <tt>String#scan</tt>.
full_name: Kernel#scan
is_singleton: false
name: scan
params: |
  scan(pattern)                   => array
  scan(pattern) {|///| block }    => $_

visibility: public
PKP|[͈���#ri/1.8/system/Kernel/require-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Ruby tries to load the library named <em>string</em>, returning <tt>true</tt> if successful. If the filename does not resolve to an absolute path, it will be searched for in the directories listed in <tt>$:</tt>. If the file has the extension ``.rb'', it is loaded as a source file; if the extension is ``.so'', ``.o'', or ``.dll'', or whatever the default shared library extension is on the current platform, Ruby loads the shared library as a Ruby extension. Otherwise, Ruby tries adding ``.rb'', ``.so'', and so on to the name. The name of the loaded feature is added to the array in <tt>$&quot;</tt>. A feature will not be loaded if it's name already appears in <tt>$&quot;</tt>. However, the file name is not converted to an absolute path, so that ``<tt>require 'a';require './a'</tt>'' will load <tt>a.rb</tt> twice.
- !ruby/struct:SM::Flow::VERB 
  body: "   require &quot;my-library.rb&quot;\n   require &quot;db-driver&quot;\n"
full_name: Kernel#require
is_singleton: false
name: require
params: |
  require(string)    => true or false

visibility: public
PKP|[Qi�-- ri/1.8/system/Kernel/fork-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a subprocess. If a block is specified, that block is run in the subprocess, and the subprocess terminates with a status of zero. Otherwise, the <tt>fork</tt> call returns twice, once in the parent, returning the process ID of the child, and once in the child, returning <em>nil</em>. The child process can exit using <tt>Kernel.exit!</tt> to avoid running any <tt>at_exit</tt> functions. The parent process should use <tt>Process.wait</tt> to collect the termination statuses of its children or use <tt>Process.detach</tt> to register disinterest in their status; otherwise, the operating system may accumulate zombie processes.
- !ruby/struct:SM::Flow::P 
  body: The thread calling fork is the only thread in the created child process. fork doesn't copy other threads.
full_name: Kernel#fork
is_singleton: false
name: fork
params: |
  Kernel.fork  [{ block }]   => fixnum or nil
  Process.fork [{ block }]   => fixnum or nil

visibility: public
PKQ|[+��$dd ri/1.8/system/Kernel/exit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Initiates the termination of the Ruby script by raising the <tt>SystemExit</tt> exception. This exception may be caught. The optional parameter is used to return a status code to the invoking environment.
- !ruby/struct:SM::Flow::VERB 
  body: "   begin\n     exit\n     puts &quot;never get here&quot;\n   rescue SystemExit\n     puts &quot;rescued a SystemExit exception&quot;\n   end\n   puts &quot;after begin block&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   rescued a SystemExit exception\n   after begin block\n"
- !ruby/struct:SM::Flow::P 
  body: Just prior to termination, Ruby executes any <tt>at_exit</tt> functions (see Kernel::at_exit) and runs any object finalizers (see ObjectSpace::define_finalizer).
- !ruby/struct:SM::Flow::VERB 
  body: "   at_exit { puts &quot;at_exit function&quot; }\n   ObjectSpace.define_finalizer(&quot;string&quot;,  proc { puts &quot;in finalizer&quot; })\n   exit\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   at_exit function\n   in finalizer\n"
full_name: Kernel#exit
is_singleton: false
name: exit
params: |
  exit(integer=0)
  Kernel::exit(integer=0)
  Process::exit(integer=0)

visibility: public
PKQ|[TRL-!!ri/1.8/system/Kernel/y-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Prints any supplied <em>objects</em> out in YAML. Intended as a variation on +Kernel::p+.
- !ruby/struct:SM::Flow::VERB 
  body: "  S = Struct.new(:name, :state)\n  s = S['dave', 'TX']\n  y s\n"
- !ruby/struct:SM::Flow::P 
  body: _produces:_
- !ruby/struct:SM::Flow::VERB 
  body: "  --- !ruby/struct:S\n  name: dave\n  state: TX\n"
full_name: Kernel#y
is_singleton: false
name: y
params: ( object, *objects )
visibility: private
PKQ|[�F��!ri/1.8/system/Kernel/srand-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Seeds the pseudorandom number generator to the value of <em>number</em>.<tt>to_i.abs</tt>. If <em>number</em> is omitted, seeds the generator using a combination of the time, the process id, and a sequence number. (This is also the behavior if <tt>Kernel::rand</tt> is called without previously calling <tt>srand</tt>, but without the sequence.) By setting the seed to a known value, scripts can be made deterministic during testing. The previous seed value is returned. Also see <tt>Kernel::rand</tt>.
full_name: Kernel#srand
is_singleton: false
name: srand
params: |
  srand(number=0)    => old_seed

visibility: public
PKR|[�"����#ri/1.8/system/Kernel/exit%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Exits the process immediately. No exit handlers are run. <em>fixnum</em> is returned to the underlying system as the exit status.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.exit!(0)\n"
full_name: Kernel#exit!
is_singleton: false
name: exit!
params: |
  Process.exit!(fixnum=-1)

visibility: public
PKR|[�eh�OO!ri/1.8/system/Kernel/split-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>$_.split(<em>pattern</em>, <em>limit</em>)</tt>. See <tt>String#split</tt>.
full_name: Kernel#split
is_singleton: false
name: split
params: |
  split([pattern [, limit]])    => array

visibility: public
PKR|[/�r�**!ri/1.8/system/Kernel/sleep-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Suspends the current thread for <em>duration</em> seconds (which may be any number, including a <tt>Float</tt> with fractional seconds). Returns the actual number of seconds slept (rounded), which may be less than that asked for if another thread calls <tt>Thread#run</tt>. Zero arguments causes <tt>sleep</tt> to sleep forever.
- !ruby/struct:SM::Flow::VERB 
  body: "   Time.new    #=&gt; Wed Apr 09 08:56:32 CDT 2003\n   sleep 1.2   #=&gt; 1\n   Time.new    #=&gt; Wed Apr 09 08:56:33 CDT 2003\n   sleep 1.9   #=&gt; 2\n   Time.new    #=&gt; Wed Apr 09 08:56:35 CDT 2003\n"
full_name: Kernel#sleep
is_singleton: false
name: sleep
params: |
  sleep([duration])    => fixnum

visibility: public
PKS|[%�Ad!ri/1.8/system/Kernel/catch-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>catch</tt> executes its block. If a <tt>throw</tt> is executed, Ruby searches up its stack for a <tt>catch</tt> block with a tag corresponding to the <tt>throw</tt>'s <em>symbol</em>. If found, that block is terminated, and <tt>catch</tt> returns the value given to <tt>throw</tt>. If <tt>throw</tt> is not called, the block terminates normally, and the value of <tt>catch</tt> is the value of the last expression evaluated. <tt>catch</tt> expressions may be nested, and the <tt>throw</tt> call need not be in lexical scope.
- !ruby/struct:SM::Flow::VERB 
  body: "   def routine(n)\n     puts n\n     throw :done if n &lt;= 0\n     routine(n-1)\n   end\n\n   catch(:done) { routine(3) }\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   3\n   2\n   1\n   0\n"
full_name: Kernel#catch
is_singleton: false
name: catch
params: |
  catch(symbol) {| | block }  > obj

visibility: public
PKS|[)�&���*ri/1.8/system/Kernel/set_trace_func-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Establishes <em>proc</em> as the handler for tracing, or disables tracing if the parameter is <tt>nil</tt>. <em>proc</em> takes up to six parameters: an event name, a filename, a line number, an object id, a binding, and the name of a class. <em>proc</em> is invoked whenever an event occurs. Events are: <tt>c-call</tt> (call a C-language routine), <tt>c-return</tt> (return from a C-language routine), <tt>call</tt> (call a Ruby method), <tt>class</tt> (start a class or module definition), <tt>end</tt> (finish a class or module definition), <tt>line</tt> (execute code on a new line), <tt>raise</tt> (raise an exception), and <tt>return</tt> (return from a Ruby method). Tracing is disabled within the context of <em>proc</em>."
- !ruby/struct:SM::Flow::VERB 
  body: "    class Test\n    def test\n      a = 1\n      b = 2\n    end\n    end\n\n    set_trace_func proc { |event, file, line, id, binding, classname|\n       printf &quot;%8s %s:%-2d %10s %8s\\n&quot;, event, file, line, id, classname\n    }\n    t = Test.new\n    t.test\n\n      line prog.rb:11               false\n    c-call prog.rb:11        new    Class\n    c-call prog.rb:11 initialize   Object\n  c-return prog.rb:11 initialize   Object\n  c-return prog.rb:11        new    Class\n      line prog.rb:12               false\n      call prog.rb:2        test     Test\n      line prog.rb:3        test     Test\n      line prog.rb:4        test     Test\n    return prog.rb:4        test     Test\n"
full_name: Kernel#set_trace_func
is_singleton: false
name: set_trace_func
params: |
  set_trace_func(proc)    => proc
  set_trace_func(nil)     => nil

visibility: public
PKS|[����!ri/1.8/system/Kernel/Array-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <em>arg</em> as an <tt>Array</tt>. First tries to call <em>arg</em><tt>.to_ary</tt>, then <em>arg</em><tt>.to_a</tt>. If both fail, creates a single element array containing <em>arg</em> (unless <em>arg</em> is <tt>nil</tt>).
- !ruby/struct:SM::Flow::VERB 
  body: "   Array(1..5)   #=&gt; [1, 2, 3, 4, 5]\n"
full_name: Kernel#Array
is_singleton: false
name: Array
params: |
  Array(arg)    => array

visibility: public
PKT|[�4���,ri/1.8/system/Kernel/global_variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array of the names of global variables.
- !ruby/struct:SM::Flow::VERB 
  body: "   global_variables.grep /std/   #=&gt; [&quot;$stderr&quot;, &quot;$stdout&quot;, &quot;$stdin&quot;]\n"
full_name: Kernel#global_variables
is_singleton: false
name: global_variables
params: |
  global_variables    => array

visibility: public
PKT|[E�]0��"ri/1.8/system/Kernel/callcc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generates a <tt>Continuation</tt> object, which it passes to the associated block. Performing a <em>cont</em><tt>.call</tt> will cause the <tt>callcc</tt> to return (as will falling through the end of the block). The value returned by the <tt>callcc</tt> is the value of the block, or the value passed to <em>cont</em><tt>.call</tt>. See class <tt>Continuation</tt> for more details. Also see <tt>Kernel::throw</tt> for an alternative mechanism for unwinding a call stack.
full_name: Kernel#callcc
is_singleton: false
name: callcc
params: |
  callcc {|cont| block }   =>  obj

visibility: public
PKT|[B�j'��#ri/1.8/system/Kernel/syscall-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls the operating system function identified by <em>fixnum</em>, passing in the arguments, which must be either <tt>String</tt> objects, or <tt>Integer</tt> objects that ultimately fit within a native <tt>long</tt>. Up to nine parameters may be passed (14 on the Atari-ST). The function identified by <em>fixnum</em> is system dependent. On some Unix systems, the numbers may be obtained from a header file called <tt>syscall.h</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   syscall 4, 1, &quot;hello\\n&quot;, 6   # '4' is write(2) on our box\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   hello\n"
full_name: Kernel#syscall
is_singleton: false
name: syscall
params: |
  syscall(fixnum [, args...])   => integer

visibility: public
PKT|[E�EH��+ri/1.8/system/Kernel/local_variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the names of the current local variables.
- !ruby/struct:SM::Flow::VERB 
  body: "   fred = 1\n   for i in 1..10\n      # ...\n   end\n   local_variables   #=&gt; [&quot;fred&quot;, &quot;i&quot;]\n"
full_name: Kernel#local_variables
is_singleton: false
name: local_variables
params: |
  local_variables    => array

visibility: public
PKT|[��|�qqri/1.8/system/Kernel/p-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: For each object, directly writes <em>obj</em>.<tt>inspect</tt> followed by the current output record separator to the program's standard output.
- !ruby/struct:SM::Flow::VERB 
  body: "   S = Struct.new(:name, :state)\n   s = S['dave', 'TX']\n   p s\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   #&lt;S name=&quot;dave&quot;, state=&quot;TX&quot;&gt;\n"
full_name: Kernel#p
is_singleton: false
name: p
params: |
  p(obj, ...)    => nil

visibility: public
PKU|[�b>��'ri/1.8/system/Kernel/iterator%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <tt>yield</tt> would execute a block in the current context. The <tt>iterator?</tt> form is mildly deprecated.
- !ruby/struct:SM::Flow::VERB 
  body: "   def try\n     if block_given?\n       yield\n     else\n       &quot;no block&quot;\n     end\n   end\n   try                  #=&gt; &quot;no block&quot;\n   try { &quot;hello&quot; }      #=&gt; &quot;hello&quot;\n   try do &quot;hello&quot; end   #=&gt; &quot;hello&quot;\n"
full_name: Kernel#iterator?
is_singleton: false
name: iterator?
params: |
  block_given?   => true or false
  iterator?      => true or false

visibility: public
PKU|[;V����"ri/1.8/system/Kernel/caller-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns the current execution stack---an array containing strings in the form ``<em>file:line</em>'' or ``<em>file:line: in `method'</em>''. The optional <em>start</em> parameter determines the number of initial stack entries to omit from the result."
- !ruby/struct:SM::Flow::VERB 
  body: "   def a(skip)\n     caller(skip)\n   end\n   def b(skip)\n     a(skip)\n   end\n   def c(skip)\n     b(skip)\n   end\n   c(0)   #=&gt; [&quot;prog:2:in `a'&quot;, &quot;prog:5:in `b'&quot;, &quot;prog:8:in `c'&quot;, &quot;prog:10&quot;]\n   c(1)   #=&gt; [&quot;prog:5:in `b'&quot;, &quot;prog:8:in `c'&quot;, &quot;prog:11&quot;]\n   c(2)   #=&gt; [&quot;prog:8:in `c'&quot;, &quot;prog:12&quot;]\n   c(3)   #=&gt; [&quot;prog:13&quot;]\n"
full_name: Kernel#caller
is_singleton: false
name: caller
params: |
  caller(start=1)    => array

visibility: public
PKU|[�=�{

 ri/1.8/system/Kernel/gets-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns (and assigns to <tt>$_</tt>) the next line from the list of files in <tt>ARGV</tt> (or <tt>$*</tt>), or from standard input if no files are present on the command line. Returns <tt>nil</tt> at end of file. The optional argument specifies the record separator. The separator is included with the contents of each record. A separator of <tt>nil</tt> reads the entire contents, and a zero-length separator reads the input one paragraph at a time, where paragraphs are divided by two consecutive newlines. If multiple filenames are present in <tt>ARGV</tt>, +gets(nil)+ will read the contents one file at a time.
- !ruby/struct:SM::Flow::VERB 
  body: "   ARGV &lt;&lt; &quot;testfile&quot;\n   print while gets\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   This is line one\n   This is line two\n   This is line three\n   And so on...\n"
- !ruby/struct:SM::Flow::P 
  body: The style of programming using <tt>$_</tt> as an implicit parameter is gradually losing favor in the Ruby community.
full_name: Kernel#gets
is_singleton: false
name: gets
params: |
  gets(separator=$/)    => string or nil

visibility: public
PKV|[��2��&ri/1.8/system/Kernel/cdesc-Kernel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>Object</tt> is the parent class of all classes in Ruby. Its methods are therefore available to all objects unless explicitly overridden.
- !ruby/struct:SM::Flow::P 
  body: <tt>Object</tt> mixes in the <tt>Kernel</tt> module, making the built-in kernel functions globally accessible. Although the instance methods of <tt>Object</tt> are defined by the <tt>Kernel</tt> module, we have chosen to document them here for clarity.
- !ruby/struct:SM::Flow::P 
  body: In the descriptions of Object's methods, the parameter <em>symbol</em> refers to a symbol, which is either a quoted string or a <tt>Symbol</tt> (such as <tt>:name</tt>).
constants: []

full_name: Kernel
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: Array
- !ruby/object:RI::MethodSummary 
  name: Float
- !ruby/object:RI::MethodSummary 
  name: Integer
- !ruby/object:RI::MethodSummary 
  name: Pathname
- !ruby/object:RI::MethodSummary 
  name: String
- !ruby/object:RI::MethodSummary 
  name: URI
- !ruby/object:RI::MethodSummary 
  name: __method__
- !ruby/object:RI::MethodSummary 
  name: `
- !ruby/object:RI::MethodSummary 
  name: abort
- !ruby/object:RI::MethodSummary 
  name: at_exit
- !ruby/object:RI::MethodSummary 
  name: autoload
- !ruby/object:RI::MethodSummary 
  name: autoload?
- !ruby/object:RI::MethodSummary 
  name: binding
- !ruby/object:RI::MethodSummary 
  name: block_given?
- !ruby/object:RI::MethodSummary 
  name: callcc
- !ruby/object:RI::MethodSummary 
  name: caller
- !ruby/object:RI::MethodSummary 
  name: catch
- !ruby/object:RI::MethodSummary 
  name: chomp
- !ruby/object:RI::MethodSummary 
  name: chomp!
- !ruby/object:RI::MethodSummary 
  name: chop
- !ruby/object:RI::MethodSummary 
  name: chop!
- !ruby/object:RI::MethodSummary 
  name: eval
- !ruby/object:RI::MethodSummary 
  name: exec
- !ruby/object:RI::MethodSummary 
  name: exit
- !ruby/object:RI::MethodSummary 
  name: exit!
- !ruby/object:RI::MethodSummary 
  name: fail
- !ruby/object:RI::MethodSummary 
  name: fork
- !ruby/object:RI::MethodSummary 
  name: format
- !ruby/object:RI::MethodSummary 
  name: getc
- !ruby/object:RI::MethodSummary 
  name: gets
- !ruby/object:RI::MethodSummary 
  name: global_variables
- !ruby/object:RI::MethodSummary 
  name: gsub
- !ruby/object:RI::MethodSummary 
  name: gsub!
- !ruby/object:RI::MethodSummary 
  name: iterator?
- !ruby/object:RI::MethodSummary 
  name: lambda
- !ruby/object:RI::MethodSummary 
  name: load
- !ruby/object:RI::MethodSummary 
  name: local_variables
- !ruby/object:RI::MethodSummary 
  name: loop
- !ruby/object:RI::MethodSummary 
  name: method_missing
- !ruby/object:RI::MethodSummary 
  name: open
- !ruby/object:RI::MethodSummary 
  name: open
- !ruby/object:RI::MethodSummary 
  name: open_uri_original_open
- !ruby/object:RI::MethodSummary 
  name: p
- !ruby/object:RI::MethodSummary 
  name: pp
- !ruby/object:RI::MethodSummary 
  name: pretty_inspect
- !ruby/object:RI::MethodSummary 
  name: print
- !ruby/object:RI::MethodSummary 
  name: printf
- !ruby/object:RI::MethodSummary 
  name: proc
- !ruby/object:RI::MethodSummary 
  name: putc
- !ruby/object:RI::MethodSummary 
  name: puts
- !ruby/object:RI::MethodSummary 
  name: raise
- !ruby/object:RI::MethodSummary 
  name: rand
- !ruby/object:RI::MethodSummary 
  name: readline
- !ruby/object:RI::MethodSummary 
  name: readlines
- !ruby/object:RI::MethodSummary 
  name: require
- !ruby/object:RI::MethodSummary 
  name: scan
- !ruby/object:RI::MethodSummary 
  name: scanf
- !ruby/object:RI::MethodSummary 
  name: select
- !ruby/object:RI::MethodSummary 
  name: set_trace_func
- !ruby/object:RI::MethodSummary 
  name: sleep
- !ruby/object:RI::MethodSummary 
  name: split
- !ruby/object:RI::MethodSummary 
  name: sprintf
- !ruby/object:RI::MethodSummary 
  name: srand
- !ruby/object:RI::MethodSummary 
  name: sub
- !ruby/object:RI::MethodSummary 
  name: sub!
- !ruby/object:RI::MethodSummary 
  name: syscall
- !ruby/object:RI::MethodSummary 
  name: system
- !ruby/object:RI::MethodSummary 
  name: test
- !ruby/object:RI::MethodSummary 
  name: throw
- !ruby/object:RI::MethodSummary 
  name: trace_var
- !ruby/object:RI::MethodSummary 
  name: trap
- !ruby/object:RI::MethodSummary 
  name: untrace_var
- !ruby/object:RI::MethodSummary 
  name: warn
- !ruby/object:RI::MethodSummary 
  name: warn
- !ruby/object:RI::MethodSummary 
  name: y
name: Kernel
superclass: 
PKV|[@Xh5rr"ri/1.8/system/Kernel/format-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns the string resulting from applying <em>format_string</em> to any additional arguments. Within the format string, any characters other than format sequences are copied to the result. A format sequence consists of a percent sign, followed by optional flags, width, and precision indicators, then terminated with a field type character. The field type controls how the corresponding <tt>sprintf</tt> argument is to be interpreted, while the flags modify that interpretation. The field type characters are listed in the table at the end of this section. The flag characters are:"
- !ruby/struct:SM::Flow::VERB 
  body: "  Flag     | Applies to   | Meaning\n  ---------+--------------+-----------------------------------------\n  space    | bdeEfgGiouxX | Leave a space at the start of\n           |              | positive numbers.\n  ---------+--------------+-----------------------------------------\n  (digit)$ | all          | Specifies the absolute argument number\n           |              | for this field. Absolute and relative\n           |              | argument numbers cannot be mixed in a\n           |              | sprintf string.\n  ---------+--------------+-----------------------------------------\n   #       | beEfgGoxX    | Use an alternative format. For the\n           |              | conversions `o', `x', `X', and `b',\n           |              | prefix the result with ``0'', ``0x'', ``0X'',\n           |              |  and ``0b'', respectively. For `e',\n           |              | `E', `f', `g', and 'G', force a decimal\n           |              | point to be added, even if no digits follow.\n           |              | For `g' and 'G', do not remove trailing zeros.\n  ---------+--------------+-----------------------------------------\n  +        | bdeEfgGiouxX | Add a leading plus sign to positive numbers.\n  ---------+--------------+-----------------------------------------\n  -        | all          | Left-justify the result of this conversion.\n  ---------+--------------+-----------------------------------------\n  0 (zero) | bdeEfgGiouxX | Pad with zeros, not spaces.\n  ---------+--------------+-----------------------------------------\n  *        | all          | Use the next argument as the field width.\n           |              | If negative, left-justify the result. If the\n           |              | asterisk is followed by a number and a dollar\n           |              | sign, use the indicated argument as the width.\n"
- !ruby/struct:SM::Flow::P 
  body: The field width is an optional integer, followed optionally by a period and a precision. The width specifies the minimum number of characters that will be written to the result for this field. For numeric fields, the precision controls the number of decimal places displayed. For string fields, the precision determines the maximum number of characters to be copied from the string. (Thus, the format sequence <tt>%10.10s</tt> will always contribute exactly ten characters to the result.)
- !ruby/struct:SM::Flow::P 
  body: "The field types are:"
- !ruby/struct:SM::Flow::VERB 
  body: "    Field |  Conversion\n    ------+--------------------------------------------------------------\n      b   | Convert argument as a binary number.\n      c   | Argument is the numeric code for a single character.\n      d   | Convert argument as a decimal number.\n      E   | Equivalent to `e', but uses an uppercase E to indicate\n          | the exponent.\n      e   | Convert floating point argument into exponential notation\n          | with one digit before the decimal point. The precision\n          | determines the number of fractional digits (defaulting to six).\n      f   | Convert floating point argument as [-]ddd.ddd,\n          |  where the precision determines the number of digits after\n          | the decimal point.\n      G   | Equivalent to `g', but use an uppercase `E' in exponent form.\n      g   | Convert a floating point number using exponential form\n          | if the exponent is less than -4 or greater than or\n          | equal to the precision, or in d.dddd form otherwise.\n      i   | Identical to `d'.\n      o   | Convert argument as an octal number.\n      p   | The valuing of argument.inspect.\n      s   | Argument is a string to be substituted. If the format\n          | sequence contains a precision, at most that many characters\n          | will be copied.\n      u   | Treat argument as an unsigned decimal number. Negative integers\n          | are displayed as a 32 bit two's complement plus one for the\n          | underlying architecture; that is, 2 ** 32 + n.  However, since\n          | Ruby has no inherent limit on bits used to represent the\n          | integer, this value is preceded by two dots (..) in order to\n          | indicate a infinite number of leading sign bits.\n      X   | Convert argument as a hexadecimal number using uppercase\n          | letters. Negative numbers will be displayed with two\n          | leading periods (representing an infinite string of\n          | leading 'FF's.\n      x   | Convert argument as a hexadecimal number.\n          | Negative numbers will be displayed with two\n          | leading periods (representing an infinite string of\n          | leading 'ff's.\n"
- !ruby/struct:SM::Flow::P 
  body: "Examples:"
- !ruby/struct:SM::Flow::VERB 
  body: "   sprintf(&quot;%d %04x&quot;, 123, 123)               #=&gt; &quot;123 007b&quot;\n   sprintf(&quot;%08b '%4s'&quot;, 123, 123)            #=&gt; &quot;01111011 ' 123'&quot;\n   sprintf(&quot;%1$*2$s %2$d %1$s&quot;, &quot;hello&quot;, 8)   #=&gt; &quot;   hello 8 hello&quot;\n   sprintf(&quot;%1$*2$s %2$d&quot;, &quot;hello&quot;, -8)       #=&gt; &quot;hello    -8&quot;\n   sprintf(&quot;%+g:% g:%-g&quot;, 1.23, 1.23, 1.23)   #=&gt; &quot;+1.23: 1.23:1.23&quot;\n   sprintf(&quot;%u&quot;, -123)                        #=&gt; &quot;..4294967173&quot;\n"
full_name: Kernel#format
is_singleton: false
name: format
params: |
  format(format_string [, arguments...] )   => string
  sprintf(format_string [, arguments...] )  => string

visibility: public
PKV|[1Y
22#ri/1.8/system/Kernel/chop%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>$_.chop!</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a  = &quot;now\\r\\n&quot;\n   $_ = a\n   chop!   #=&gt; &quot;now&quot;\n   chop!   #=&gt; &quot;no&quot;\n   chop!   #=&gt; &quot;n&quot;\n   chop!   #=&gt; &quot;&quot;\n   chop!   #=&gt; nil\n   $_      #=&gt; &quot;&quot;\n   a       #=&gt; &quot;&quot;\n"
full_name: Kernel#chop!
is_singleton: false
name: chop!
params: |
  chop!    => $_ or nil

visibility: public
PKV|[EHJ� ri/1.8/system/Kernel/rand-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts <em>max</em> to an integer using max1 = max<tt>.to_i.abs</tt>. If the result is zero, returns a pseudorandom floating point number greater than or equal to 0.0 and less than 1.0. Otherwise, returns a pseudorandom integer greater than or equal to zero and less than max1. <tt>Kernel::srand</tt> may be used to ensure repeatable sequences of random numbers between different runs of the program. Ruby currently uses a modified Mersenne Twister with a period of 2**19937-1.
- !ruby/struct:SM::Flow::VERB 
  body: "   srand 1234                 #=&gt; 0\n   [ rand,  rand ]            #=&gt; [0.191519450163469, 0.49766366626136]\n   [ rand(10), rand(1000) ]   #=&gt; [6, 817]\n   srand 1234                 #=&gt; 1234\n   [ rand,  rand ]            #=&gt; [0.191519450163469, 0.49766366626136]\n"
full_name: Kernel#rand
is_singleton: false
name: rand
params: |
  rand(max=0)    => number

visibility: public
PKW|[{B�� ri/1.8/system/Kernel/getc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: obsolete
full_name: Kernel#getc
is_singleton: false
name: getc
params: ()
visibility: public
PKW|[#����%ri/1.8/system/Kernel/trace_var-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Controls tracing of assignments to global variables. The parameter +symbol_ identifies the variable (as either a string name or a symbol identifier). <em>cmd</em> (which may be a string or a <tt>Proc</tt> object) or block is executed whenever the variable is assigned. The block or <tt>Proc</tt> object receives the variable's new value as a parameter. Also see <tt>Kernel::untrace_var</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   trace_var :$_, proc {|v| puts &quot;$_ is now '#{v}'&quot; }\n   $_ = &quot;hello&quot;\n   $_ = ' there'\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   $_ is now 'hello'\n   $_ is now ' there'\n"
full_name: Kernel#trace_var
is_singleton: false
name: trace_var
params: |
  trace_var(symbol, cmd )             => nil
  trace_var(symbol) {|val| block }    => nil

visibility: public
PKW|[`/L33!ri/1.8/system/Kernel/throw-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Transfers control to the end of the active <tt>catch</tt> block waiting for <em>symbol</em>. Raises <tt>NameError</tt> if there is no <tt>catch</tt> block for the symbol. The optional second parameter supplies a return value for the <tt>catch</tt> block, which otherwise defaults to <tt>nil</tt>. For examples, see <tt>Kernel::catch</tt>.
full_name: Kernel#throw
is_singleton: false
name: throw
params: |
  throw(symbol [, obj])

visibility: public
PKW|[)j��++ ri/1.8/system/Kernel/putc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Equivalent to:"
- !ruby/struct:SM::Flow::VERB 
  body: "  $stdout.putc(int)\n"
full_name: Kernel#putc
is_singleton: false
name: putc
params: |
  putc(int)   => int

visibility: public
PKX|[J�&&!ri/1.8/system/Kernel/Float-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <em>arg</em> converted to a float. Numeric types are converted directly, the rest are converted using <em>arg</em>.to_f. As of Ruby 1.8, converting <tt>nil</tt> generates a <tt>TypeError</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   Float(1)           #=&gt; 1.0\n   Float(&quot;123.456&quot;)   #=&gt; 123.456\n"
full_name: Kernel#Float
is_singleton: false
name: Float
params: |
  Float(arg)    => float

visibility: public
PKX|[�;�zzri/1.8/system/Kernel/sub-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>$_.sub(<em>args</em>)</tt>, except that <tt>$_</tt> will be updated if substitution occurs.
full_name: Kernel#sub
is_singleton: false
name: sub
params: |
  sub(pattern, replacement)   => $_
  sub(pattern) { block }      => $_

visibility: public
PKY|[k���#ri/1.8/system/Kernel/Integer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts <em>arg</em> to a <tt>Fixnum</tt> or <tt>Bignum</tt>. Numeric types are converted directly (with floating point numbers being truncated). If <em>arg</em> is a <tt>String</tt>, leading radix indicators (<tt>0</tt>, <tt>0b</tt>, and <tt>0x</tt>) are honored. Others are converted using <tt>to_int</tt> and <tt>to_i</tt>. This behavior is different from that of <tt>String#to_i</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   Integer(123.999)    #=&gt; 123\n   Integer(&quot;0x1a&quot;)     #=&gt; 26\n   Integer(Time.new)   #=&gt; 1049896590\n"
full_name: Kernel#Integer
is_singleton: false
name: Integer
params: |
  Integer(arg)    => integer

visibility: public
PKY|[�!���'ri/1.8/system/Kernel/untrace_var-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes tracing for the specified command on the given global variable and returns <tt>nil</tt>. If no command is specified, removes all tracing for that variable and returns an array containing the commands actually removed.
full_name: Kernel#untrace_var
is_singleton: false
name: untrace_var
params: |
  untrace_var(symbol [, cmd] )   => array or nil

visibility: public
PKZ|[is�0�� ri/1.8/system/Kernel/chop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>($_.dup).chop!</tt>, except <tt>nil</tt> is never returned. See <tt>String#chop!</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a  =  &quot;now\\r\\n&quot;\n   $_ = a\n   chop   #=&gt; &quot;now&quot;\n   $_     #=&gt; &quot;now&quot;\n   chop   #=&gt; &quot;no&quot;\n   chop   #=&gt; &quot;n&quot;\n   chop   #=&gt; &quot;&quot;\n   chop   #=&gt; &quot;&quot;\n   a      #=&gt; &quot;now\\r\\n&quot;\n"
full_name: Kernel#chop
is_singleton: false
name: chop
params: |
  chop   => string

visibility: public
PKZ|[��Upp%ri/1.8/system/Kernel/readlines-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array containing the lines returned by calling <tt>Kernel.gets(<em>separator</em>)</tt> until the end of file.
full_name: Kernel#readlines
is_singleton: false
name: readlines
params: |
  readlines(separator=$/)    => array

visibility: public
PKZ|[m�'�55 ri/1.8/system/Kernel/puts-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to
- !ruby/struct:SM::Flow::VERB 
  body: "    $stdout.puts(obj, ...)\n"
full_name: Kernel#puts
is_singleton: false
name: puts
params: |
  puts(obj, ...)    => nil

visibility: public
PK[|[89�n^^ ri/1.8/system/Kernel/warn-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Display the given message (followed by a newline) on STDERR unless warnings are disabled (for example with the <tt>-W0</tt> flag).
full_name: Kernel#warn
is_singleton: false
name: warn
params: |
  warn(msg)   => nil

visibility: public
PK[|[<��RR ri/1.8/system/Kernel/test-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::VERB 
  body: " Uses the integer <em>aCmd</em> to perform various tests on\n <em>file1</em> (first table below) or on <em>file1</em> and\n <em>file2</em> (second table).\n\n File tests on a single file:\n\n   Test   Returns   Meaning\n    ?A  | Time    | Last access time for file1\n    ?b  | boolean | True if file1 is a block device\n    ?c  | boolean | True if file1 is a character device\n    ?C  | Time    | Last change time for file1\n    ?d  | boolean | True if file1 exists and is a directory\n    ?e  | boolean | True if file1 exists\n    ?f  | boolean | True if file1 exists and is a regular file\n    ?g  | boolean | True if file1 has the \\CF{setgid} bit\n        |         | set (false under NT)\n    ?G  | boolean | True if file1 exists and has a group\n        |         | ownership equal to the caller's group\n    ?k  | boolean | True if file1 exists and has the sticky bit set\n    ?l  | boolean | True if file1 exists and is a symbolic link\n    ?M  | Time    | Last modification time for file1\n    ?o  | boolean | True if file1 exists and is owned by\n        |         | the caller's effective uid\n    ?O  | boolean | True if file1 exists and is owned by\n        |         | the caller's real uid\n    ?p  | boolean | True if file1 exists and is a fifo\n    ?r  | boolean | True if file1 is readable by the effective\n        |         | uid/gid of the caller\n    ?R  | boolean | True if file is readable by the real\n        |         | uid/gid of the caller\n    ?s  | int/nil | If file1 has nonzero size, return the size,\n        |         | otherwise return nil\n    ?S  | boolean | True if file1 exists and is a socket\n    ?u  | boolean | True if file1 has the setuid bit set\n    ?w  | boolean | True if file1 exists and is writable by\n        |         | the effective uid/gid\n    ?W  | boolean | True if file1 exists and is writable by\n        |         | the real uid/gid\n    ?x  | boolean | True if file1 exists and is executable by\n        |         | the effective uid/gid\n    ?X  | boolean | True if file1 exists and is executable by\n        |         | the real uid/gid\n    ?z  | boolean | True if file1 exists and has a zero length\n"
- !ruby/struct:SM::Flow::P 
  body: "Tests that take two files:"
- !ruby/struct:SM::Flow::VERB 
  body: "    ?-  | boolean | True if file1 and file2 are identical\n    ?=  | boolean | True if the modification times of file1\n        |         | and file2 are equal\n    ?&lt;  | boolean | True if the modification time of file1\n        |         | is prior to that of file2\n    ?&gt;  | boolean | True if the modification time of file1\n        |         | is after that of file2\n"
full_name: Kernel#test
is_singleton: false
name: test
params: |
  test(int_cmd, file1 [, file2] ) => obj

visibility: public
PK\|[��!�rr ri/1.8/system/Kernel/trap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Specifies the handling of signals. The first parameter is a signal name (a string such as ``SIGALRM'', ``SIGUSR1'', and so on) or a signal number. The characters ``SIG'' may be omitted from the signal name. The command or block specifies code to be run when the signal is raised. If the command is the string ``IGNORE'' or ``SIG_IGN'', the signal will be ignored. If the command is ``DEFAULT'' or ``SIG_DFL'', the operating system's default handler will be invoked. If the command is ``EXIT'', the script will be terminated by the signal. Otherwise, the given command or block will be run. The special signal name ``EXIT'' or signal number zero will be invoked just prior to program termination. trap returns the previous handler for the given signal.
- !ruby/struct:SM::Flow::VERB 
  body: "    Signal.trap(0, proc { puts &quot;Terminating: #{$$}&quot; })\n    Signal.trap(&quot;CLD&quot;)  { puts &quot;Child died&quot; }\n    fork &amp;&amp; Process.wait\n"
- !ruby/struct:SM::Flow::P 
  body: "produces:"
- !ruby/struct:SM::Flow::VERB 
  body: "    Terminating: 27461\n    Child died\n    Terminating: 27460\n"
full_name: Kernel#trap
is_singleton: false
name: trap
params: |
  Signal.trap( signal, proc ) => obj
  Signal.trap( signal ) {| | block } => obj

visibility: public
PK\|[�l�h��%ri/1.8/system/YAML/Set/cdesc-Set.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: "Builtin collection: !set"
constants: []

full_name: YAML::Set
includes: []

instance_methods: []

name: Set
superclass: "::Hash"
PK]|[�w?:/ri/1.8/system/YAML/BaseEmitter/node_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Emit plain, normal flowing text
full_name: YAML::BaseEmitter#node_text
is_singleton: false
name: node_text
params: ( value, block = nil )
visibility: public
PK]|[yG���3ri/1.8/system/YAML/BaseEmitter/binary_base64-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Emit binary data
full_name: YAML::BaseEmitter#binary_base64
is_singleton: false
name: binary_base64
params: ( value )
visibility: public
PK]|[`����,ri/1.8/system/YAML/BaseEmitter/simple-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Emit a simple, unqouted string
full_name: YAML::BaseEmitter#simple
is_singleton: false
name: simple
params: ( value )
visibility: public
PK`|[��0��,ri/1.8/system/YAML/BaseEmitter/single-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Emit single-quoted string
full_name: YAML::BaseEmitter#single
is_singleton: false
name: single
params: ( value )
visibility: public
PK`|[�s��0ri/1.8/system/YAML/BaseEmitter/options%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::BaseEmitter#options=
is_singleton: false
name: options=
params: ( opt )
visibility: public
PK`|[�t�((1ri/1.8/system/YAML/BaseEmitter/indent_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Write a text block with the current indent
full_name: YAML::BaseEmitter#indent_text
is_singleton: false
name: indent_text
params: ( text, mod, first_line = true )
visibility: public
PKa|[*[��,ri/1.8/system/YAML/BaseEmitter/indent-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Write a current indent
full_name: YAML::BaseEmitter#indent
is_singleton: false
name: indent
params: ( mod = nil )
visibility: public
PKa|[K\�K��*ri/1.8/system/YAML/BaseEmitter/fold-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Folding paragraphs within a column
full_name: YAML::BaseEmitter#fold
is_singleton: false
name: fold
params: ( value )
visibility: public
PKa|[�����6ri/1.8/system/YAML/BaseEmitter/seq_map_shortcut-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::BaseEmitter#seq_map_shortcut
is_singleton: false
name: seq_map_shortcut
params: ()
visibility: public
PKa|[�j���)ri/1.8/system/YAML/BaseEmitter/map-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Quick mapping
full_name: YAML::BaseEmitter#map
is_singleton: false
name: map
params: ( type, &e )
visibility: public
PKa|[Kl��-ri/1.8/system/YAML/BaseEmitter/options-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::BaseEmitter#options
is_singleton: false
name: options
params: ( opt = nil )
visibility: public
PKa|[p���/ri/1.8/system/YAML/BaseEmitter/indent%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Add indent to the buffer
full_name: YAML::BaseEmitter#indent!
is_singleton: false
name: indent!
params: ()
visibility: public
PKa|[������5ri/1.8/system/YAML/BaseEmitter/cdesc-BaseEmitter.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: YAML::BaseEmitter
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: binary_base64
- !ruby/object:RI::MethodSummary 
  name: double
- !ruby/object:RI::MethodSummary 
  name: fold
- !ruby/object:RI::MethodSummary 
  name: indent
- !ruby/object:RI::MethodSummary 
  name: indent!
- !ruby/object:RI::MethodSummary 
  name: indent_text
- !ruby/object:RI::MethodSummary 
  name: map
- !ruby/object:RI::MethodSummary 
  name: node_text
- !ruby/object:RI::MethodSummary 
  name: options
- !ruby/object:RI::MethodSummary 
  name: options=
- !ruby/object:RI::MethodSummary 
  name: seq
- !ruby/object:RI::MethodSummary 
  name: seq_map_shortcut
- !ruby/object:RI::MethodSummary 
  name: simple
- !ruby/object:RI::MethodSummary 
  name: single
name: BaseEmitter
superclass: 
PKb|[��6��,ri/1.8/system/YAML/BaseEmitter/double-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Emit double-quoted string
full_name: YAML::BaseEmitter#double
is_singleton: false
name: double
params: ( value )
visibility: public
PKb|[�����)ri/1.8/system/YAML/BaseEmitter/seq-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Quick sequence
full_name: YAML::BaseEmitter#seq
is_singleton: false
name: seq
params: ( type, &e )
visibility: public
PKb|[�bZ���-ri/1.8/system/YAML/PrivateType/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::PrivateType#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PKb|[f�ԑ��5ri/1.8/system/YAML/PrivateType/cdesc-PrivateType.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: tag_subclasses?
comment: 
- !ruby/struct:SM::Flow::P 
  body: Default private type
constants: []

full_name: YAML::PrivateType
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_yaml
name: PrivateType
superclass: Object
PKc|[�E#��)ri/1.8/system/YAML/PrivateType/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::PrivateType::new
is_singleton: true
name: new
params: ( type, val )
visibility: public
PKc|[׺���7ri/1.8/system/YAML/PrivateType/tag_subclasses%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::PrivateType::tag_subclasses?
is_singleton: true
name: tag_subclasses?
params: ()
visibility: public
PKc|[8_|��&ri/1.8/system/YAML/object_maker-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Allocate blank object
full_name: YAML::object_maker
is_singleton: true
name: object_maker
params: ( obj_class, val )
visibility: public
PKc|[�M����"ri/1.8/system/YAML/unescape-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Unescape the condenses escapes
full_name: YAML::unescape
is_singleton: true
name: unescape
params: ( value )
visibility: public
PKd|[k	���%ri/1.8/system/YAML/dump_stream-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a YAML stream containing each of the items in <tt>objs</tt>, each having their own document.
- !ruby/struct:SM::Flow::VERB 
  body: "  YAML.dump_stream( 0, [], {} )\n    #=&gt; --- 0\n        --- []\n        --- {}\n"
full_name: YAML::dump_stream
is_singleton: true
name: dump_stream
params: ( *objs )
visibility: public
PKd|[S�	(ri/1.8/system/YAML/tagged_classes-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the complete dictionary of taguris, paired with classes. The key for the dictionary is the full taguri. The value for each key is the class constant associated to that taguri.
- !ruby/struct:SM::Flow::VERB 
  body: " YAML.tagged_classes[&quot;tag:yaml.org,2002:int&quot;] =&gt; Integer\n"
full_name: YAML::tagged_classes
is_singleton: true
name: tagged_classes
params: ()
visibility: public
PKd|[`�b���$ri/1.8/system/YAML/parse_file-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parse a document from the file located at <em>filepath</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "  YAML.parse_file( 'animals.yaml' )\n     #=&gt; #&lt;YAML::Syck::Node:0x82ccce0\n          @kind=:seq,\n          @value=\n           [#&lt;YAML::Syck::Node:0x82ccd94\n             @kind=:scalar,\n             @type_id=&quot;str&quot;,\n             @value=&quot;badger&quot;&gt;,\n            #&lt;YAML::Syck::Node:0x82ccd58\n             @kind=:scalar,\n             @type_id=&quot;str&quot;,\n             @value=&quot;elephant&quot;&gt;,\n            #&lt;YAML::Syck::Node:0x82ccd1c\n             @kind=:scalar,\n             @type_id=&quot;str&quot;,\n             @value=&quot;tiger&quot;&gt;]&gt;\n"
full_name: YAML::parse_file
is_singleton: true
name: parse_file
params: ( filepath )
visibility: public
PKd|[.���� ri/1.8/system/YAML/parser-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new default parser
full_name: YAML::parser
is_singleton: true
name: parser
params: ()
visibility: public
PKd|[��RSNN)ri/1.8/system/YAML/read_type_class-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Method to extract colon-seperated type and class, returning the type and the constant of the class
full_name: YAML::read_type_class
is_singleton: true
name: read_type_class
params: ( type, obj_class )
visibility: public
PKe|[�w"�RR%ri/1.8/system/YAML/load_stream-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Loads all documents from the current <em>io</em> stream, returning a +YAML::Stream+ object containing all loaded documents.
full_name: YAML::load_stream
is_singleton: true
name: load_stream
params: ( io )
visibility: public
PKe|[��&ͦ&�&"ri/1.8/system/YAML/cdesc-YAML.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_builtin_type
- !ruby/object:RI::MethodSummary 
  name: add_domain_type
- !ruby/object:RI::MethodSummary 
  name: add_private_type
- !ruby/object:RI::MethodSummary 
  name: add_ruby_type
- !ruby/object:RI::MethodSummary 
  name: detect_implicit
- !ruby/object:RI::MethodSummary 
  name: dump
- !ruby/object:RI::MethodSummary 
  name: dump_stream
- !ruby/object:RI::MethodSummary 
  name: each_document
- !ruby/object:RI::MethodSummary 
  name: each_node
- !ruby/object:RI::MethodSummary 
  name: emitter
- !ruby/object:RI::MethodSummary 
  name: escape
- !ruby/object:RI::MethodSummary 
  name: generic_parser
- !ruby/object:RI::MethodSummary 
  name: load
- !ruby/object:RI::MethodSummary 
  name: load_documents
- !ruby/object:RI::MethodSummary 
  name: load_file
- !ruby/object:RI::MethodSummary 
  name: load_stream
- !ruby/object:RI::MethodSummary 
  name: make_stream
- !ruby/object:RI::MethodSummary 
  name: object_maker
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: parse_documents
- !ruby/object:RI::MethodSummary 
  name: parse_file
- !ruby/object:RI::MethodSummary 
  name: parser
- !ruby/object:RI::MethodSummary 
  name: quick_emit
- !ruby/object:RI::MethodSummary 
  name: read_type_class
- !ruby/object:RI::MethodSummary 
  name: resolver
- !ruby/object:RI::MethodSummary 
  name: tag_class
- !ruby/object:RI::MethodSummary 
  name: tagged_classes
- !ruby/object:RI::MethodSummary 
  name: tagurize
- !ruby/object:RI::MethodSummary 
  name: transfer
- !ruby/object:RI::MethodSummary 
  name: try_implicit
- !ruby/object:RI::MethodSummary 
  name: unescape
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: YAML
- !ruby/struct:SM::Flow::P 
  body: YAML(tm) (rhymes with 'camel') is a straightforward machine parsable data serialization format designed for human readability and interaction with scripting languages such as Perl and Python. YAML is optimized for data serialization, formatted dumping, configuration files, log files, Internet messaging and filtering. This specification describes the YAML information model and serialization format. Together with the Unicode standard for characters, it provides all the information necessary to understand YAML Version 1.0 and construct computer programs to process it.
- !ruby/struct:SM::Flow::P 
  body: See http://yaml.org/ for more information. For a quick tutorial, please visit YAML In Five Minutes (http://yaml.kwiki.org/?YamlInFiveMinutes).
- !ruby/struct:SM::Flow::H 
  level: 2
  text: About This Library
- !ruby/struct:SM::Flow::P 
  body: The YAML 1.0 specification outlines four stages of YAML loading and dumping. This library honors all four of those stages, although data is really only available to you in three stages.
- !ruby/struct:SM::Flow::P 
  body: "The four stages are: native, representation, serialization, and presentation."
- !ruby/struct:SM::Flow::P 
  body: The native stage refers to data which has been loaded completely into Ruby's own types. (See +YAML::load+.)
- !ruby/struct:SM::Flow::P 
  body: The representation stage means data which has been composed into +YAML::BaseNode+ objects. In this stage, the document is available as a tree of node objects. You can perform YPath queries and transformations at this level. (See +YAML::parse+.)
- !ruby/struct:SM::Flow::P 
  body: The serialization stage happens inside the parser. The YAML parser used in Ruby is called Syck. Serialized nodes are available in the extension as SyckNode structs.
- !ruby/struct:SM::Flow::P 
  body: The presentation stage is the YAML document itself. This is accessible to you as a string. (See +YAML::dump+.)
- !ruby/struct:SM::Flow::P 
  body: For more information about the various information models, see Chapter 3 of the YAML 1.0 Specification (http://yaml.org/spec/#id2491269).
- !ruby/struct:SM::Flow::P 
  body: The YAML module provides quick access to the most common loading (YAML::load) and dumping (YAML::dump) tasks. This module also provides an API for registering global types (YAML::add_domain_type).
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Example
- !ruby/struct:SM::Flow::P 
  body: A simple round-trip (load and dump) of an object.
- !ruby/struct:SM::Flow::VERB 
  body: "    require &quot;yaml&quot;\n\n    test_obj = [&quot;dogs&quot;, &quot;cats&quot;, &quot;badgers&quot;]\n\n    yaml_obj = YAML::dump( test_obj )\n                        # -&gt; ---\n                             - dogs\n                             - cats\n                             - badgers\n    ruby_obj = YAML::load( yaml_obj )\n                        # =&gt; [&quot;dogs&quot;, &quot;cats&quot;, &quot;badgers&quot;]\n    ruby_obj == test_obj\n                        # =&gt; true\n"
- !ruby/struct:SM::Flow::P 
  body: To register your custom types with the global resolver, use <tt>add_domain_type</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "    YAML::add_domain_type( &quot;your-site.com,2004&quot;, &quot;widget&quot; ) do |type, val|\n        Widget.new( val )\n    end\n"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Constants
  name: VERSION
  value: "'0.60'"
- !ruby/object:RI::Constant 
  comment: 
  name: SUPPORTED_YAML_VERSIONS
  value: "['1.0']"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Parser tokens
  name: WORD_CHAR
  value: "'A-Za-z0-9'"
- !ruby/object:RI::Constant 
  comment: 
  name: PRINTABLE_CHAR
  value: "'-_A-Za-z0-9!?/()$\\'\". '"
- !ruby/object:RI::Constant 
  comment: 
  name: NOT_PLAIN_CHAR
  value: "'\\x7f\\x0-\\x1f\\x80-\\x9f'"
- !ruby/object:RI::Constant 
  comment: 
  name: ESCAPE_CHAR
  value: "'[\\\\x00-\\\\x09\\\\x0b-\\\\x1f]'"
- !ruby/object:RI::Constant 
  comment: 
  name: INDICATOR_CHAR
  value: "'*&!|\\\\\\\\^@%{}[]='"
- !ruby/object:RI::Constant 
  comment: 
  name: SPACE_INDICATORS
  value: "'-#:,?'"
- !ruby/object:RI::Constant 
  comment: 
  name: RESTRICTED_INDICATORS
  value: "'#:,}]'"
- !ruby/object:RI::Constant 
  comment: 
  name: DNS_COMP_RE
  value: "\"\\\\w(?:[-\\\\w]*\\\\w)?\""
- !ruby/object:RI::Constant 
  comment: 
  name: DNS_NAME_RE
  value: "\"(?:(?:#{DNS_COMP_RE}\\\\.)+#{DNS_COMP_RE}|#{DNS_COMP_RE})\""
- !ruby/object:RI::Constant 
  comment: 
  name: ESCAPES
  value: "%w{\\x00   \\x01       \\x02  \\x03     \\x04        \\x05   \\x06      \\a                              \\x08    \\t         \\n             \\v         \\f             \\r         \\x0e   \\x0f                                  \\x10       \\x11  \\x12     \\x13        \\x14   \\x15      \\x16 \\x17                                  \\x18       \\x19  \\x1a     \\e          \\x1c    \\x1d       \\x1e  \\x1f                             }"
- !ruby/object:RI::Constant 
  comment: 
  name: UNESCAPES
  value: "{                                 'a' => \"\\x07\", 'b' => \"\\x08\", 't' => \"\\x09\",                                  'n' => \"\\x0a\", 'v' => \"\\x0b\", 'f' => \"\\x0c\",                                 'r' => \"\\x0d\", 'e' => \"\\x1b\", '\\\\' => '\\\\',                             }"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Default settings
  name: DEFAULTS
  value: "{                 :Indent => 2, :UseHeader => false, :UseVersion => false, :Version => '1.0',                 :SortKeys => false, :AnchorFormat => 'id%03d', :ExplicitTypes => false,                 :WidthType => 'absolute', :BestWidth => 80,                 :UseBlock => false, :UseFold => false, :Encoding => :None"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Error messages
  name: ERROR_NO_HEADER_NODE
  value: "\"With UseHeader=false, the node Array or Hash must have elements\""
- !ruby/object:RI::Constant 
  comment: 
  name: ERROR_NEED_HEADER
  value: "\"With UseHeader=false, the node must be an Array or Hash\""
- !ruby/object:RI::Constant 
  comment: 
  name: ERROR_BAD_EXPLICIT
  value: "\"Unsupported explicit transfer: '%s'\""
- !ruby/object:RI::Constant 
  comment: 
  name: ERROR_MANY_EXPLICIT
  value: "\"More than one explicit transfer\""
- !ruby/object:RI::Constant 
  comment: 
  name: ERROR_MANY_IMPLICIT
  value: "\"More than one implicit request\""
- !ruby/object:RI::Constant 
  comment: 
  name: ERROR_NO_ANCHOR
  value: "\"No anchor for alias '%s'\""
- !ruby/object:RI::Constant 
  comment: 
  name: ERROR_BAD_ANCHOR
  value: "\"Invalid anchor: %s\""
- !ruby/object:RI::Constant 
  comment: 
  name: ERROR_MANY_ANCHOR
  value: "\"More than one anchor\""
- !ruby/object:RI::Constant 
  comment: 
  name: ERROR_ANCHOR_ALIAS
  value: "\"Can't define both an anchor and an alias\""
- !ruby/object:RI::Constant 
  comment: 
  name: ERROR_BAD_ALIAS
  value: "\"Invalid alias: %s\""
- !ruby/object:RI::Constant 
  comment: 
  name: ERROR_MANY_ALIAS
  value: "\"More than one alias\""
- !ruby/object:RI::Constant 
  comment: 
  name: ERROR_ZERO_INDENT
  value: "\"Can't use zero as an indentation width\""
- !ruby/object:RI::Constant 
  comment: 
  name: ERROR_UNSUPPORTED_VERSION
  value: "\"This release of YAML.rb does not support YAML version %s\""
- !ruby/object:RI::Constant 
  comment: 
  name: ERROR_UNSUPPORTED_ENCODING
  value: "\"Attempt to use unsupported encoding: %s\""
- !ruby/object:RI::Constant 
  comment: 
  name: Resolver
  value: YAML::Syck::Resolver
- !ruby/object:RI::Constant 
  comment: 
  name: DefaultResolver
  value: YAML::Syck::DefaultResolver
- !ruby/object:RI::Constant 
  comment: 
  name: GenericResolver
  value: YAML::Syck::GenericResolver
- !ruby/object:RI::Constant 
  comment: 
  name: Parser
  value: YAML::Syck::Parser
- !ruby/object:RI::Constant 
  comment: 
  name: Emitter
  value: YAML::Syck::Emitter
full_name: YAML
includes: []

instance_methods: []

name: YAML
superclass: 
PKe|[¡��*ri/1.8/system/YAML/add_builtin_type-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Add a transfer method for a builtin type
full_name: YAML::add_builtin_type
is_singleton: true
name: add_builtin_type
params: ( type_tag, &transfer_proc )
visibility: public
PKe|[�`�+��&ri/1.8/system/YAML/Sequence/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Sequence#add
is_singleton: false
name: add
params: ( v )
visibility: public
PKf|[����/ri/1.8/system/YAML/Sequence/cdesc-Sequence.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: YAML::Sequence
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add
name: Sequence
superclass: Array
PKf|[���	��%ri/1.8/system/YAML/make_stream-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Class method for creating streams
full_name: YAML::make_stream
is_singleton: true
name: make_stream
params: ( io )
visibility: public
PKf|[?rˮ��%ri/1.8/system/YAML/Omap/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Omap#[]
is_singleton: false
name: "[]"
params: ( k )
visibility: public
PKf|[�``'ri/1.8/system/YAML/Omap/cdesc-Omap.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Builtin collection: !omap"
constants: []

full_name: YAML::Omap
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: has_key?
- !ruby/object:RI::MethodSummary 
  name: is_complex_yaml?
- !ruby/object:RI::MethodSummary 
  name: to_yaml
- !ruby/object:RI::MethodSummary 
  name: yaml_initialize
name: Omap
superclass: "::Array"
PKg|[���:��&ri/1.8/system/YAML/Omap/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Omap#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PKg|[�B��.ri/1.8/system/YAML/Omap/yaml_initialize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Omap#yaml_initialize
is_singleton: false
name: yaml_initialize
params: ( tag, val )
visibility: public
PKg|[m�y���1ri/1.8/system/YAML/Omap/is_complex_yaml%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Omap#is_complex_yaml?
is_singleton: false
name: is_complex_yaml?
params: ()
visibility: public
PKg|[��Of��(ri/1.8/system/YAML/Omap/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Omap#[]=
is_singleton: false
name: "[]="
params: ( k, *rest )
visibility: public
PKg|[��)[��%ri/1.8/system/YAML/Omap/%5b%5d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Omap::[]
is_singleton: true
name: "[]"
params: ( *vals )
visibility: public
PKh|[�.��)ri/1.8/system/YAML/Omap/has_key%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Omap#has_key?
is_singleton: false
name: has_key?
params: ( k )
visibility: public
PKh|[��>G��)ri/1.8/system/YAML/Error/cdesc-Error.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: YAML Error classes
constants: []

full_name: YAML::Error
includes: []

instance_methods: []

name: Error
superclass: StandardError
PKh|[�N���ri/1.8/system/YAML/parse-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parse the first document from the current <em>io</em> stream
- !ruby/struct:SM::Flow::VERB 
  body: "  File.open( 'animals.yaml' ) { |yf| YAML::load( yf ) }\n     #=&gt; #&lt;YAML::Syck::Node:0x82ccce0\n          @kind=:seq,\n          @value=\n           [#&lt;YAML::Syck::Node:0x82ccd94\n             @kind=:scalar,\n             @type_id=&quot;str&quot;,\n             @value=&quot;badger&quot;&gt;,\n            #&lt;YAML::Syck::Node:0x82ccd58\n             @kind=:scalar,\n             @type_id=&quot;str&quot;,\n             @value=&quot;elephant&quot;&gt;,\n            #&lt;YAML::Syck::Node:0x82ccd1c\n             @kind=:scalar,\n             @type_id=&quot;str&quot;,\n             @value=&quot;tiger&quot;&gt;]&gt;\n"
- !ruby/struct:SM::Flow::P 
  body: Can also load from a string.
- !ruby/struct:SM::Flow::VERB 
  body: "  YAML.parse( &quot;--- :locked&quot; )\n     #=&gt; #&lt;YAML::Syck::Node:0x82edddc\n           @type_id=&quot;tag:ruby.yaml.org,2002:sym&quot;,\n           @value=&quot;:locked&quot;, @kind=:scalar&gt;\n"
full_name: YAML::parse
is_singleton: true
name: parse
params: ( io )
visibility: public
PKi|[�m ��"ri/1.8/system/YAML/resolver-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the default resolver
full_name: YAML::resolver
is_singleton: true
name: resolver
params: ()
visibility: public
PKi|[ڼ���)ri/1.8/system/YAML/YPath/cdesc-YPath.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: flags
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: predicates
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: segments
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: each_path
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: YAML::YPath
includes: []

instance_methods: []

name: YPath
superclass: Object
PKi|[�L�>��#ri/1.8/system/YAML/YPath/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::YPath::new
is_singleton: true
name: new
params: ( str )
visibility: public
PKi|[0�9l��)ri/1.8/system/YAML/YPath/each_path-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: YPath.new( path )
comment: 
full_name: YAML::YPath::each_path
is_singleton: true
name: each_path
params: ( str ) {|YPath.new( path )| ...}
visibility: public
PKj|[�����)ri/1.8/system/YAML/detect_implicit-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Detect typing of a string
full_name: YAML::detect_implicit
is_singleton: true
name: detect_implicit
params: ( val )
visibility: public
PKj|[O�z�'ri/1.8/system/YAML/add_ruby_type-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Add a transfer method for a builtin type
full_name: YAML::add_ruby_type
is_singleton: true
name: add_ruby_type
params: ( type_tag, &transfer_proc )
visibility: public
PKj|[�m���%ri/1.8/system/YAML/Mapping/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Mapping#add
is_singleton: false
name: add
params: ( k, v )
visibility: public
PKj|[�Jl&&-ri/1.8/system/YAML/Mapping/cdesc-Mapping.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Emitter helper classes
constants: []

full_name: YAML::Mapping
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add
name: Mapping
superclass: Array
PKj|[��h.$ri/1.8/system/YAML/quick_emit-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Allocate an Emitter if needed
full_name: YAML::quick_emit
is_singleton: true
name: quick_emit
params: ( oid, opts = {}, &e )
visibility: public
PKk|[�i���#ri/1.8/system/YAML/load_file-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Load a document from the file located at <em>filepath</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "  YAML.load_file( 'animals.yaml' )\n     #=&gt; ['badger', 'elephant', 'tiger']\n"
full_name: YAML::load_file
is_singleton: true
name: load_file
params: ( filepath )
visibility: public
PKk|[�Dz&��(ri/1.8/system/YAML/generic_parser-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new generic parser
full_name: YAML::generic_parser
is_singleton: true
name: generic_parser
params: ()
visibility: public
PKk|[�0F��!ri/1.8/system/YAML/emitter-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new default emitter
full_name: YAML::emitter
is_singleton: true
name: emitter
params: ()
visibility: public
PKk|[�x)K)ri/1.8/system/YAML/BaseNode/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: We want the node to act like as Hash if it is.
full_name: YAML::BaseNode#[]
is_singleton: false
name: "[]"
params: ( *key )
visibility: public
PKl|[sDZ$,ri/1.8/system/YAML/BaseNode/select%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Search for YPath entry and return transformed nodes.
full_name: YAML::BaseNode#select!
is_singleton: false
name: select!
params: ( ypath_str )
visibility: public
PKl|[FPx[)ri/1.8/system/YAML/BaseNode/select-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Search for YPath entry and return qualified nodes.
full_name: YAML::BaseNode#select
is_singleton: false
name: select
params: ( ypath_str )
visibility: public
PKl|[��d9��%ri/1.8/system/YAML/BaseNode/at-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::BaseNode#at
is_singleton: false
name: at
params: ( seg )
visibility: public
PKl|[���0ri/1.8/system/YAML/BaseNode/match_segment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Search a node for a single YPath segment
full_name: YAML::BaseNode#match_segment
is_singleton: false
name: match_segment
params: ( ypath, depth )
visibility: public
PKl|[9��Ҳ�+ri/1.8/system/YAML/BaseNode/children-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::BaseNode#children
is_singleton: false
name: children
params: ()
visibility: public
PKl|[�Y�5��'ri/1.8/system/YAML/BaseNode/emit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::BaseNode#emit
is_singleton: false
name: emit
params: ()
visibility: public
PKm|[$.w���6ri/1.8/system/YAML/BaseNode/children_with_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::BaseNode#children_with_index
is_singleton: false
name: children_with_index
params: ()
visibility: public
PKm|[��M��/ri/1.8/system/YAML/BaseNode/cdesc-BaseNode.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: YAML Generic Model container
constants: []

full_name: YAML::BaseNode
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: at
- !ruby/object:RI::MethodSummary 
  name: children
- !ruby/object:RI::MethodSummary 
  name: children_with_index
- !ruby/object:RI::MethodSummary 
  name: emit
- !ruby/object:RI::MethodSummary 
  name: match_path
- !ruby/object:RI::MethodSummary 
  name: match_segment
- !ruby/object:RI::MethodSummary 
  name: search
- !ruby/object:RI::MethodSummary 
  name: select
- !ruby/object:RI::MethodSummary 
  name: select!
name: BaseNode
superclass: 
PKm|[(f�)ri/1.8/system/YAML/BaseNode/search-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Search for YPath entry and return a list of qualified paths.
full_name: YAML::BaseNode#search
is_singleton: false
name: search
params: ( ypath_str )
visibility: public
PKm|[s�
-ri/1.8/system/YAML/BaseNode/match_path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: YPath search returning a complete depth array
full_name: YAML::BaseNode#match_path
is_singleton: false
name: match_path
params: ( ypath_str )
visibility: public
PKn|[�
�(ri/1.8/system/YAML/load_documents-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls <em>block</em> with each consecutive document in the YAML stream contained in <em>io</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "  File.open( 'many-docs.yaml' ) do |yf|\n    YAML.load_documents( yf ) do |ydoc|\n      ## ydoc contains the single object\n      ## from the YAML document\n    end\n  end\n"
full_name: YAML::load_documents
is_singleton: true
name: load_documents
params: ( io, &doc_proc )
visibility: public
PKn|[]�s�#ri/1.8/system/YAML/tag_class-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Associates a taguri <em>tag</em> with a Ruby class <em>cls</em>. The taguri is used to give types to classes when loading YAML. Taguris are of the form:"
- !ruby/struct:SM::Flow::VERB 
  body: "  tag:authorityName,date:specific\n"
- !ruby/struct:SM::Flow::P 
  body: The <tt>authorityName</tt> is a domain name or email address. The <tt>date</tt> is the date the type was issued in YYYY or YYYY-MM or YYYY-MM-DD format. The <tt>specific</tt> is a name for the type being added.
- !ruby/struct:SM::Flow::P 
  body: "For example, built-in YAML types have 'yaml.org' as the <tt>authorityName</tt> and '2002' as the <tt>date</tt>. The <tt>specific</tt> is simply the name of the type:"
- !ruby/struct:SM::Flow::VERB 
  body: " tag:yaml.org,2002:int\n tag:yaml.org,2002:float\n tag:yaml.org,2002:timestamp\n"
- !ruby/struct:SM::Flow::P 
  body: The domain must be owned by you on the <tt>date</tt> declared. If you don't own any domains on the date you declare the type, you can simply use an e-mail address.
- !ruby/struct:SM::Flow::VERB 
  body: " tag:why@ruby-lang.org,2004:notes/personal\n"
full_name: YAML::tag_class
is_singleton: true
name: tag_class
params: ( tag, cls )
visibility: public
PKn|[��K��ri/1.8/system/YAML/dump-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts <em>obj</em> to YAML and writes the YAML result to <em>io</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "  File.open( 'animals.yaml', 'w' ) do |out|\n    YAML.dump( ['badger', 'elephant', 'tiger'], out )\n  end\n"
- !ruby/struct:SM::Flow::P 
  body: If no <em>io</em> is provided, a string containing the dumped YAML is returned.
- !ruby/struct:SM::Flow::VERB 
  body: "  YAML.dump( :locked )\n     #=&gt; &quot;--- :locked&quot;\n"
full_name: YAML::dump
is_singleton: true
name: dump
params: ( obj, io = nil )
visibility: public
PKn|[5yA���3ri/1.8/system/YAML/ParseError/cdesc-ParseError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: YAML::ParseError
includes: []

instance_methods: []

name: ParseError
superclass: Error
PKn|[S����1ri/1.8/system/YAML/TypeError/cdesc-TypeError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: YAML::TypeError
includes: []

instance_methods: []

name: TypeError
superclass: StandardError
PKo|[t�y��&ri/1.8/system/YAML/Pairs/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Pairs#[]
is_singleton: false
name: "[]"
params: ( k )
visibility: public
PKo|[���׸�'ri/1.8/system/YAML/Pairs/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Pairs#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PKo|[ؼ���/ri/1.8/system/YAML/Pairs/yaml_initialize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Pairs#yaml_initialize
is_singleton: false
name: yaml_initialize
params: ( tag, val )
visibility: public
PKo|[��w��2ri/1.8/system/YAML/Pairs/is_complex_yaml%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Pairs#is_complex_yaml?
is_singleton: false
name: is_complex_yaml?
params: ()
visibility: public
PKo|[9����)ri/1.8/system/YAML/Pairs/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Pairs#[]=
is_singleton: false
name: "[]="
params: ( k, val )
visibility: public
PKp|[ 3�A��&ri/1.8/system/YAML/Pairs/%5b%5d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Pairs::[]
is_singleton: true
name: "[]"
params: ( *vals )
visibility: public
PKp|[���cc)ri/1.8/system/YAML/Pairs/cdesc-Pairs.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Builtin collection: !pairs"
constants: []

full_name: YAML::Pairs
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: has_key?
- !ruby/object:RI::MethodSummary 
  name: is_complex_yaml?
- !ruby/object:RI::MethodSummary 
  name: to_yaml
- !ruby/object:RI::MethodSummary 
  name: yaml_initialize
name: Pairs
superclass: "::Array"
PKp|[?X���*ri/1.8/system/YAML/Pairs/has_key%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Pairs#has_key?
is_singleton: false
name: has_key?
params: ( k )
visibility: public
PKp|[j���88#ri/1.8/system/YAML/each_node-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls <em>block</em> with a tree of +YAML::BaseNodes+, one tree for each consecutive document in the YAML stream contained in <em>io</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "  File.open( 'many-docs.yaml' ) do |yf|\n    YAML.each_node( yf ) do |ydoc|\n      ## ydoc contains a tree of nodes\n      ## from the YAML document\n    end\n  end\n"
full_name: YAML::each_node
is_singleton: true
name: each_node
params: ( io, &doc_proc )
visibility: public
PKq|[�F�N��$ri/1.8/system/YAML/DBM/update-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::DBM#update
is_singleton: false
name: update
params: ( hsh )
visibility: public
PKq|[h,k���$ri/1.8/system/YAML/DBM/invert-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::DBM#invert
is_singleton: false
name: invert
params: ()
visibility: public
PKq|[Ru�ި�$ri/1.8/system/YAML/DBM/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::DBM#[]
is_singleton: false
name: "[]"
params: ( key )
visibility: public
PKq|[a�vk��"ri/1.8/system/YAML/DBM/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #each_pair"
full_name: YAML::DBM#each
is_singleton: false
name: each
params: ()
visibility: public
PKq|[��v��$ri/1.8/system/YAML/DBM/select-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: k, v
comment: 
full_name: YAML::DBM#select
is_singleton: false
name: select
params: ( *keys ) {|k, v| ...}
visibility: public
PKq|[i�b��"ri/1.8/system/YAML/DBM/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::DBM#to_a
is_singleton: false
name: to_a
params: ()
visibility: public
PKr|[J,��#ri/1.8/system/YAML/DBM/store-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::DBM#store
is_singleton: false
name: store
params: ( key, val )
visibility: public
PKr|[L�����'ri/1.8/system/YAML/DBM/values_at-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::DBM#values_at
is_singleton: false
name: values_at
params: ( *keys )
visibility: public
PKr|[�k����$ri/1.8/system/YAML/DBM/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::DBM#delete
is_singleton: false
name: delete
params: ( key )
visibility: public
PKr|[���د�#ri/1.8/system/YAML/DBM/index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::DBM#index
is_singleton: false
name: index
params: ( keystr )
visibility: public
PKs|[硟��'ri/1.8/system/YAML/DBM/delete_if-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ( k, fetch( k ) )
comment: 
full_name: YAML::DBM#delete_if
is_singleton: false
name: delete_if
params: () {|k, fetch( k  )| ...}
visibility: public
PKs|[D����(ri/1.8/system/YAML/DBM/each_value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: YAML::load( v ) }
comment: 
full_name: YAML::DBM#each_value
is_singleton: false
name: each_value
params: () {|YAML::load( v ) }| ...}
visibility: public
PKs|[[)ǰ�%ri/1.8/system/YAML/DBM/replace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::DBM#replace
is_singleton: false
name: replace
params: ( hsh )
visibility: public
PKs|[<pT��$ri/1.8/system/YAML/DBM/reject-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: k, v
comment: 
full_name: YAML::DBM#reject
is_singleton: false
name: reject
params: () {|k, v| ...}
visibility: public
PKt|[{Y�h��$ri/1.8/system/YAML/DBM/values-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::DBM#values
is_singleton: false
name: values
params: ()
visibility: public
PKt|[(����%ri/1.8/system/YAML/DBM/to_hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::DBM#to_hash
is_singleton: false
name: to_hash
params: ()
visibility: public
PKu|[�J���#ri/1.8/system/YAML/DBM/shift-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::DBM#shift
is_singleton: false
name: shift
params: ()
visibility: public
PKu|[�C�a��'ri/1.8/system/YAML/DBM/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::DBM#[]=
is_singleton: false
name: "[]="
params: ( key, val )
visibility: public
PKv|[ƥ�
��'ri/1.8/system/YAML/DBM/each_pair-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: each
block_params: k, fetch( k ) }
comment: 
full_name: YAML::DBM#each_pair
is_singleton: false
name: each_pair
params: () {|k, fetch( k ) }| ...}
visibility: public
PKv|[M
gX��*ri/1.8/system/YAML/DBM/has_value%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::DBM#has_value?
is_singleton: false
name: has_value?
params: ( val )
visibility: public
PKw|[X*b
��#ri/1.8/system/YAML/DBM/fetch-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: keystr
comment: 
full_name: YAML::DBM#fetch
is_singleton: false
name: fetch
params: ( keystr, ifnone = nil ) {|keystr| ...}
visibility: public
PKw|[��


%ri/1.8/system/YAML/DBM/cdesc-DBM.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: VERSION
  value: "\"0.1\""
full_name: YAML::DBM
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: delete_if
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: each_pair
- !ruby/object:RI::MethodSummary 
  name: each_value
- !ruby/object:RI::MethodSummary 
  name: fetch
- !ruby/object:RI::MethodSummary 
  name: has_value?
- !ruby/object:RI::MethodSummary 
  name: index
- !ruby/object:RI::MethodSummary 
  name: invert
- !ruby/object:RI::MethodSummary 
  name: reject
- !ruby/object:RI::MethodSummary 
  name: replace
- !ruby/object:RI::MethodSummary 
  name: select
- !ruby/object:RI::MethodSummary 
  name: shift
- !ruby/object:RI::MethodSummary 
  name: store
- !ruby/object:RI::MethodSummary 
  name: to_a
- !ruby/object:RI::MethodSummary 
  name: to_hash
- !ruby/object:RI::MethodSummary 
  name: update
- !ruby/object:RI::MethodSummary 
  name: values
- !ruby/object:RI::MethodSummary 
  name: values_at
name: DBM
superclass: "::DBM"
PKw|[vqr�55ri/1.8/system/YAML/load-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Load a document from the current <em>io</em> stream.
- !ruby/struct:SM::Flow::VERB 
  body: "  File.open( 'animals.yaml' ) { |yf| YAML::load( yf ) }\n     #=&gt; ['badger', 'elephant', 'tiger']\n"
- !ruby/struct:SM::Flow::P 
  body: Can also load from a string.
- !ruby/struct:SM::Flow::VERB 
  body: "  YAML.load( &quot;--- :locked&quot; )\n     #=&gt; :locked\n"
full_name: YAML::load
is_singleton: true
name: load
params: ( io )
visibility: public
PKw|[�}A���'ri/1.8/system/YAML/Stream/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Stream#[]
is_singleton: false
name: "[]"
params: ( i )
visibility: public
PKx|[(⼶�%ri/1.8/system/YAML/Stream/edit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Stream#edit
is_singleton: false
name: edit
params: ( doc_num, doc )
visibility: public
PKx|[l�D��$ri/1.8/system/YAML/Stream/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Stream#add
is_singleton: false
name: add
params: ( doc )
visibility: public
PKx|[Ԇww+ri/1.8/system/YAML/Stream/cdesc-Stream.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: documents
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: options
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: YAML::Stream -- for emitting many documents
constants: []

full_name: YAML::Stream
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: edit
- !ruby/object:RI::MethodSummary 
  name: emit
name: Stream
superclass: Object
PKx|[�5�8��$ri/1.8/system/YAML/Stream/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Stream::new
is_singleton: true
name: new
params: ( opts = {} )
visibility: public
PKy|[
��4��%ri/1.8/system/YAML/Stream/emit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Stream#emit
is_singleton: false
name: emit
params: ( io = nil )
visibility: public
PKy|[:�o{��$ri/1.8/system/YAML/Store/load-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Store#load
is_singleton: false
name: load
params: (content)
visibility: public
PKy|[�²��#ri/1.8/system/YAML/Store/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Store::new
is_singleton: true
name: new
params: ( *o )
visibility: public
PKy|[5�����)ri/1.8/system/YAML/Store/cdesc-Store.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: EMPTY_MARSHAL_DATA
  value: "{}.to_yaml"
- !ruby/object:RI::Constant 
  comment: 
  name: EMPTY_MARSHAL_CHECKSUM
  value: Digest::MD5.digest(EMPTY_MARSHAL_DATA)
full_name: YAML::Store
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: dump
- !ruby/object:RI::MethodSummary 
  name: empty_marshal_checksum
- !ruby/object:RI::MethodSummary 
  name: empty_marshal_data
- !ruby/object:RI::MethodSummary 
  name: load
- !ruby/object:RI::MethodSummary 
  name: marshal_dump_supports_canonical_option?
name: Store
superclass: PStore
PKy|[}Y����2ri/1.8/system/YAML/Store/empty_marshal_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Store#empty_marshal_data
is_singleton: false
name: empty_marshal_data
params: ()
visibility: public
PKy|[.�'���Iri/1.8/system/YAML/Store/marshal_dump_supports_canonical_option%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Store#marshal_dump_supports_canonical_option?
is_singleton: false
name: marshal_dump_supports_canonical_option?
params: ()
visibility: public
PKz|[�$���6ri/1.8/system/YAML/Store/empty_marshal_checksum-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Store#empty_marshal_checksum
is_singleton: false
name: empty_marshal_checksum
params: ()
visibility: public
PKz|[k��'��$ri/1.8/system/YAML/Store/dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Store#dump
is_singleton: false
name: dump
params: (table)
visibility: public
PKz|[��h'99,ri/1.8/system/YAML/Syck/Node/cdesc-Node.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Mixin BaseNode functionality
constants: []

full_name: YAML::Syck::Node
includes: 
- !ruby/object:RI::IncludedModule 
  name: YAML::BaseNode
instance_methods: []

name: Node
superclass: Object
PK{|[�����'ri/1.8/system/YAML/Syck/cdesc-Syck.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: YAML::Syck
includes: []

instance_methods: []

name: Syck
superclass: 
PK{|[�G�kJJ)ri/1.8/system/YAML/parse_documents-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls <em>block</em> with a tree of +YAML::BaseNodes+, one tree for each consecutive document in the YAML stream contained in <em>io</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "  File.open( 'many-docs.yaml' ) do |yf|\n    YAML.parse_documents( yf ) do |ydoc|\n      ## ydoc contains a tree of nodes\n      ## from the YAML document\n    end\n  end\n"
full_name: YAML::parse_documents
is_singleton: true
name: parse_documents
params: ( io, &doc_proc )
visibility: public
PK{|[��gȹ�(ri/1.8/system/YAML/Object/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Object#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PK{|[�w��\\+ri/1.8/system/YAML/Object/cdesc-Object.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: tag_subclasses?
comment: 
- !ruby/struct:SM::Flow::P 
  body: Unresolved objects
constants: []

full_name: YAML::Object
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_yaml
name: Object
superclass: Object
PK{|[���˾�2ri/1.8/system/YAML/Object/tag_subclasses%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::Object::tag_subclasses?
is_singleton: true
name: tag_subclasses?
params: ()
visibility: public
PK||[�-Xw&ri/1.8/system/YAML/try_implicit-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Apply any implicit a node may qualify for
full_name: YAML::try_implicit
is_singleton: true
name: try_implicit
params: ( obj )
visibility: public
PK||[�
�*ri/1.8/system/YAML/add_private_type-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Add a private document type
full_name: YAML::add_private_type
is_singleton: true
name: add_private_type
params: ( type_re, &transfer_proc )
visibility: public
PK}|[�%-!+ri/1.8/system/YAML/Loader/cdesc-Loader.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: TRANSFER_DOMAINS
  value: "{             'yaml.org,2002' => {},             'ruby.yaml.org,2002' => {}"
- !ruby/object:RI::Constant 
  comment: 
  name: PRIVATE_TYPES
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  name: IMPLICIT_TYPES
  value: "[ 'null', 'bool', 'time', 'int', 'float' ]"
full_name: YAML::Loader
includes: []

instance_methods: []

name: Loader
superclass: Object
PK}|[�����"ri/1.8/system/YAML/tagurize-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a type_id to a taguri
full_name: YAML::tagurize
is_singleton: true
name: tagurize
params: ( val )
visibility: public
PK}|[��) ri/1.8/system/YAML/escape-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Escape the string, condensing common escapes
full_name: YAML::escape
is_singleton: true
name: escape
params: ( value, skip = "" )
visibility: public
PK}|[��)))ri/1.8/system/YAML/add_domain_type-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Add a global handler for a YAML domain type.
full_name: YAML::add_domain_type
is_singleton: true
name: add_domain_type
params: ( domain, type_tag, &transfer_proc )
visibility: public
PK}|[r@�ߔ�/ri/1.8/system/YAML/YamlNode/cdesc-YamlNode.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: anchor
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: kind
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: type_id
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: value
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: YAML Generic Model container
constants: []

full_name: YAML::YamlNode
includes: 
- !ruby/object:RI::IncludedModule 
  name: BaseNode
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: transform
name: YamlNode
superclass: Object
PK}|[�
��,ri/1.8/system/YAML/YamlNode/transform-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Transform this node fully into a native type
full_name: YAML::YamlNode#transform
is_singleton: false
name: transform
params: ()
visibility: public
PK}|[�+@���&ri/1.8/system/YAML/YamlNode/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::YamlNode::new
is_singleton: true
name: new
params: ( t, v )
visibility: public
PK�|[�s� ��,ri/1.8/system/YAML/SpecialHash/update-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::SpecialHash#update
is_singleton: false
name: update
params: ( h )
visibility: public
PK�|[d�'4!!5ri/1.8/system/YAML/SpecialHash/cdesc-SpecialHash.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: default
  rw: RW
class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: YAML Hash class to support comments and defaults
constants: []

full_name: YAML::SpecialHash
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: to_yaml
- !ruby/object:RI::MethodSummary 
  name: update
name: SpecialHash
superclass: "::Hash"
PK�|[���ؾ�-ri/1.8/system/YAML/SpecialHash/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::SpecialHash#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PK�|[��,���-ri/1.8/system/YAML/SpecialHash/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::SpecialHash#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[�%Q���*ri/1.8/system/YAML/SpecialHash/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::SpecialHash#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[;�jA"ri/1.8/system/YAML/transfer-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Apply a transfer method to a Ruby object
full_name: YAML::transfer
is_singleton: true
name: transfer
params: ( type_id, obj )
visibility: public
PK�|[�
Iֽ�,ri/1.8/system/YAML/DomainType/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::DomainType#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PK�|[��P���(ri/1.8/system/YAML/DomainType/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::DomainType::new
is_singleton: true
name: new
params: ( domain, type, val )
visibility: public
PK�|[i{�̓�3ri/1.8/system/YAML/DomainType/cdesc-DomainType.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: tag_subclasses?
comment: 
- !ruby/struct:SM::Flow::P 
  body: Default domain type
constants: []

full_name: YAML::DomainType
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_yaml
name: DomainType
superclass: Object
PK�|[�|J���6ri/1.8/system/YAML/DomainType/tag_subclasses%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: YAML::DomainType::tag_subclasses?
is_singleton: true
name: tag_subclasses?
params: ()
visibility: public
PK�|[���'ri/1.8/system/YAML/each_document-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls <em>block</em> with each consecutive document in the YAML stream contained in <em>io</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "  File.open( 'many-docs.yaml' ) do |yf|\n    YAML.each_document( yf ) do |ydoc|\n      ## ydoc contains the single object\n      ## from the YAML document\n    end\n  end\n"
full_name: YAML::each_document
is_singleton: true
name: each_document
params: ( io, &block )
visibility: public
PK�|[��\�__&ri/1.8/system/Abbrev/cdesc-Abbrev.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Calculate the set of unique abbreviations for a given set of strings.
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'abbrev'\n  require 'pp'\n\n  pp Abbrev::abbrev(['ruby', 'rules']).sort\n"
- !ruby/struct:SM::Flow::P 
  body: <em>Generates:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "  [[&quot;rub&quot;, &quot;ruby&quot;],\n   [&quot;ruby&quot;, &quot;ruby&quot;],\n   [&quot;rul&quot;, &quot;rules&quot;],\n   [&quot;rule&quot;, &quot;rules&quot;],\n   [&quot;rules&quot;, &quot;rules&quot;]]\n"
- !ruby/struct:SM::Flow::P 
  body: Also adds an <tt>abbrev</tt> method to class <tt>Array</tt>.
constants: []

full_name: Abbrev
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: abbrev
name: Abbrev
superclass: 
PK�|[5@yss"ri/1.8/system/Abbrev/abbrev-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Given a set of strings, calculate the set of unambiguous abbreviations for those strings, and return a hash where the keys are all the possible abbreviations and the values are the full strings. Thus, given input of &quot;car&quot; and &quot;cone&quot;, the keys pointing to &quot;car&quot; would be &quot;ca&quot; and &quot;car&quot;, while those pointing to &quot;cone&quot; would be &quot;co&quot;, &quot;con&quot;, and &quot;cone&quot;.
- !ruby/struct:SM::Flow::P 
  body: The optional <tt>pattern</tt> parameter is a pattern or a string. Only those input strings matching the pattern, or begging the string, are considered for inclusion in the output hash
full_name: Abbrev#abbrev
is_singleton: false
name: abbrev
params: (words, pattern = nil)
visibility: public
PK�|[^��<< ri/1.8/system/Mail/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the header corresponding to <tt>field</tt>.
- !ruby/struct:SM::Flow::P 
  body: Matching is case-insensitive.
full_name: Mail#[]
is_singleton: false
name: "[]"
params: (field)
visibility: public
PK�|[�
���ri/1.8/system/Mail/body-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the message body as an Array of lines
full_name: Mail#body
is_singleton: false
name: body
params: ()
visibility: public
PK�|[I����� ri/1.8/system/Mail/header-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the headers as a Hash.
full_name: Mail#header
is_singleton: false
name: header
params: ()
visibility: public
PK�|[���DDri/1.8/system/Mail/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new Mail where <tt>f</tt> is either a stream which responds to gets(), or a path to a file. If <tt>f</tt> is a path it will be opened.
- !ruby/struct:SM::Flow::P 
  body: "The whole message is read so it can be made available through the #header, #[] and #body methods."
- !ruby/struct:SM::Flow::P 
  body: The &quot;From &quot; line is ignored if the mail is in mbox format.
full_name: Mail::new
is_singleton: true
name: new
params: (f)
visibility: public
PK�|[,�>��"ri/1.8/system/Mail/cdesc-Mail.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: The Mail class represents an internet mail message (as per RFC822, RFC2822) with headers and a body.
constants: []

full_name: Mail
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: body
- !ruby/object:RI::MethodSummary 
  name: header
name: Mail
superclass: Object
PK�|[�ԯ��,ri/1.8/system/TailGroup/cdesc-TailGroup.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: TailGroup
includes: []

instance_methods: []

name: TailGroup
superclass: Test::Unit::TestCase
PK�|[�V'�tt#ri/1.8/system/FalseClass/%7c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Or---Returns <tt>false</tt> if <em>obj</em> is <tt>nil</tt> or <tt>false</tt>; <tt>true</tt> otherwise.
full_name: FalseClass#|
is_singleton: false
name: "|"
params: |
  false | obj   =>   true or false
  nil   | obj   =>   true or false

visibility: public
PK�|[m ~���#ri/1.8/system/FalseClass/%26-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: And---Returns <tt>false</tt>. <em>obj</em> is always evaluated as it is the argument to a method call---there is no short-circuit evaluation in this case.
full_name: FalseClass#&
is_singleton: false
name: "&"
params: |
  false & obj   => false
  nil & obj     => false

visibility: public
PK�|[�E"��'ri/1.8/system/FalseClass/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: FalseClass#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PK�|[�*����.ri/1.8/system/FalseClass/cdesc-FalseClass.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The global value <tt>false</tt> is the only instance of class <tt>FalseClass</tt> and represents a logically false value in boolean expressions. The class provides operators allowing <tt>false</tt> to participate correctly in logical expressions.
constants: []

full_name: FalseClass
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "&"
- !ruby/object:RI::MethodSummary 
  name: ^
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: to_yaml
- !ruby/object:RI::MethodSummary 
  name: "|"
name: FalseClass
superclass: Object
PK�|[���t��$ri/1.8/system/FalseClass/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "'nuf said..."
full_name: FalseClass#to_s
is_singleton: false
name: to_s
params: |
  false.to_s   =>  "false"

visibility: public
PK�|[}@2���#ri/1.8/system/FalseClass/%5e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Exclusive Or---If <em>obj</em> is <tt>nil</tt> or <tt>false</tt>, returns <tt>false</tt>; otherwise, returns <tt>true</tt>.
full_name: FalseClass#^
is_singleton: false
name: ^
params: |
  false ^ obj    => true or false
  nil   ^ obj    => true or false

visibility: public
PK�|[����

ri/1.8/system/Set/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: length
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of elements.
full_name: Set#size
is_singleton: false
name: size
params: ()
visibility: public
PK�|[���u"" ri/1.8/system/Set/flatten-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new set that is a copy of the set, flattening each containing set recursively.
full_name: Set#flatten
is_singleton: false
name: flatten
params: ()
visibility: public
PK�|[�K2��!ri/1.8/system/Set/empty%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the set contains no elements.
full_name: Set#empty?
is_singleton: false
name: empty?
params: ()
visibility: public
PK�|[��\�ri/1.8/system/Set/merge-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Merges the elements of the given enumerable object to the set and returns self.
full_name: Set#merge
is_singleton: false
name: merge
params: (enum)
visibility: public
PK�|[P�;z��ri/1.8/system/Set/union-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #|"
full_name: Set#union
is_singleton: false
name: union
params: (enum)
visibility: public
PK�|[��6�VVri/1.8/system/Set/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (o)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls the given block once for each element in the set, passing the element as parameter. Returns an enumerator if no block is given.
full_name: Set#each
is_singleton: false
name: each
params: () {|o| ...}
visibility: public
PK�|[�2ri/1.8/system/Set/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts the set to an array. The order of elements is uncertain.
full_name: Set#to_a
is_singleton: false
name: to_a
params: ()
visibility: public
PK�|[��3�$ri/1.8/system/Set/superset%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the set is a superset of the given set.
full_name: Set#superset?
is_singleton: false
name: superset?
params: (set)
visibility: public
PK�|[��Lppri/1.8/system/Set/%7c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: +
- !ruby/object:RI::AliasName 
  name: union
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new set built by merging the set and the elements of the given enumerable object.
full_name: Set#|
is_singleton: false
name: "|"
params: (enum)
visibility: public
PK�|[����LLri/1.8/system/Set/%26-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: intersection
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new set containing elements common to the set and the given enumerable object.
full_name: Set#&
is_singleton: false
name: "&"
params: (enum)
visibility: public
PK�|[OED��ri/1.8/system/Set/divide-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Divides the set into a set of subsets according to the commonality defined by the given block.
- !ruby/struct:SM::Flow::P 
  body: If the arity of the block is 2, elements o1 and o2 are in common if block.call(o1, o2) is true. Otherwise, elements o1 and o2 are in common if block.call(o1) == block.call(o2).
- !ruby/struct:SM::Flow::P 
  body: "e.g.:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'set'\n  numbers = Set[1, 3, 4, 6, 9, 10, 11]\n  set = numbers.divide { |i,j| (i - j).abs == 1 }\n  p set     # =&gt; #&lt;Set: {#&lt;Set: {1}&gt;,\n            #            #&lt;Set: {11, 9, 10}&gt;,\n            #            #&lt;Set: {3, 4}&gt;,\n            #            #&lt;Set: {6}&gt;}&gt;\n"
full_name: Set#divide
is_singleton: false
name: divide
params: (&func)
visibility: public
PK�|[Է׶77ri/1.8/system/Set/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes the given object from the set and returns self. Use <tt>subtract</tt> to delete several items at once.
full_name: Set#delete
is_singleton: false
name: delete
params: (o)
visibility: public
PK�|[���##!ri/1.8/system/Set/subtract-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes every element that appears in the given enumerable object and returns self.
full_name: Set#subtract
is_singleton: false
name: subtract
params: (enum)
visibility: public
PK�|[����"ri/1.8/system/Set/member%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #include?"
full_name: Set#member?
is_singleton: false
name: member?
params: (o)
visibility: public
PK�|[SƱ"ri/1.8/system/Set/reject%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (o)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to Set#delete_if, but returns nil if no changes were made.
full_name: Set#reject!
is_singleton: false
name: reject!
params: () {|o| ...}
visibility: public
PK�|[^�$00"ri/1.8/system/Set/delete_if-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (o)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes every element of the set for which block evaluates to true, and returns self.
full_name: Set#delete_if
is_singleton: false
name: delete_if
params: () {|o| ...}
visibility: public
PK�|[��ryQQri/1.8/system/Set/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: "<<"
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds the given object to the set and returns self. Use <tt>merge</tt> to add several elements at once.
full_name: Set#add
is_singleton: false
name: add
params: (o)
visibility: public
PK�|[t���II ri/1.8/system/Set/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns a string containing a human-readable representation of the set. (&quot;#&lt;Set: {element1, element2, ...}&gt;&quot;)"
full_name: Set#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[n-))ri/1.8/system/Set/add%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds the given object to the set and returns self. If the object is already in the set, returns nil.
full_name: Set#add?
is_singleton: false
name: add?
params: (o)
visibility: public
PK�|[H߁+ri/1.8/system/Set/proper_superset%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the set is a proper superset of the given set.
full_name: Set#proper_superset?
is_singleton: false
name: proper_superset?
params: (set)
visibility: public
PK�|[x��**#ri/1.8/system/Set/include%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: member?
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the set contains the given object.
full_name: Set#include?
is_singleton: false
name: include?
params: (o)
visibility: public
PK�|[�yL��ri/1.8/system/Set/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: o
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new set containing the elements of the given enumerable object.
- !ruby/struct:SM::Flow::P 
  body: If a block is given, the elements of enum are preprocessed by the given block.
full_name: Set::new
is_singleton: true
name: new
params: (enum = nil) {|o| ...}
visibility: public
PK�|[����%ri/1.8/system/Set/intersection-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #&amp;"
full_name: Set#intersection
is_singleton: false
name: intersection
params: (enum)
visibility: public
PK�|[�	�"ri/1.8/system/Set/subset%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the set is a subset of the given set.
full_name: Set#subset?
is_singleton: false
name: subset?
params: (set)
visibility: public
PK�|[�@~�EE#ri/1.8/system/Set/flatten%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to Set#flatten, but replaces the receiver with the result in place. Returns nil if no modifications were made.
full_name: Set#flatten!
is_singleton: false
name: flatten!
params: ()
visibility: public
PK�|[��a11 ri/1.8/system/Set/replace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Replaces the contents of the set with the contents of the given enumerable object and returns self.
full_name: Set#replace
is_singleton: false
name: replace
params: (enum)
visibility: public
PK�|[�[w��(ri/1.8/system/Set/initialize_copy-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Copy internal hash.
full_name: Set#initialize_copy
is_singleton: false
name: initialize_copy
params: (orig)
visibility: public
PK�|[�"!>��&ri/1.8/system/Set/flatten_merge-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Set#flatten_merge
is_singleton: false
name: flatten_merge
params: (set, seen = Set.new)
visibility: protected
PK�|[K�N�__!ri/1.8/system/Set/classify-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: o
comment: 
- !ruby/struct:SM::Flow::P 
  body: Classifies the set by the return value of the given block and returns a hash of {value =&gt; set of elements} pairs. The block is called once for each element of the set, passing the element as parameter.
- !ruby/struct:SM::Flow::P 
  body: "e.g.:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'set'\n  files = Set.new(Dir.glob(&quot;*.rb&quot;))\n  hash = files.classify { |f| File.mtime(f).year }\n  p hash    # =&gt; {2000=&gt;#&lt;Set: {&quot;a.rb&quot;, &quot;b.rb&quot;}&gt;,\n            #     2001=&gt;#&lt;Set: {&quot;c.rb&quot;, &quot;d.rb&quot;, &quot;e.rb&quot;}&gt;,\n            #     2002=&gt;#&lt;Set: {&quot;f.rb&quot;}&gt;}\n"
full_name: Set#classify
is_singleton: false
name: classify
params: ( {|o| ...}
visibility: public
PK�|[��$1��ri/1.8/system/Set/length-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #size"
full_name: Set#length
is_singleton: false
name: length
params: ()
visibility: public
PK�|[�aU���ri/1.8/system/Set/%2b-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #|"
full_name: Set#+
is_singleton: false
name: +
params: (enum)
visibility: public
PK�|[��3���ri/1.8/system/Set/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add"
full_name: Set#<<
is_singleton: false
name: "<<"
params: (o)
visibility: public
PK�|[a��33ri/1.8/system/Set/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if two sets are equal. The equality of each couple of elements is defined according to Object#eql?.
full_name: Set#==
is_singleton: false
name: ==
params: (set)
visibility: public
PK�|[�����ri/1.8/system/Set/map%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #collect!"
full_name: Set#map!
is_singleton: false
name: map!
params: ()
visibility: public
PK�|[�
�� ri/1.8/system/Set/cdesc-Set.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set implements a collection of unordered values with no duplicates. This is a hybrid of Array's intuitive inter-operation facilities and Hash's fast lookup.
- !ruby/struct:SM::Flow::P 
  body: "Several methods accept any Enumerable object (implementing <tt>each</tt>) for greater flexibility: new, replace, merge, subtract, |, &amp;, -, ^."
- !ruby/struct:SM::Flow::P 
  body: The equality of each couple of elements is determined according to Object#eql? and Object#hash, since Set uses Hash as storage.
- !ruby/struct:SM::Flow::P 
  body: Finally, if you are using class Set, you can also use Enumerable#to_set for convenience.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'set'\n  s1 = Set.new [1, 2]                   # -&gt; #&lt;Set: {1, 2}&gt;\n  s2 = [1, 2].to_set                    # -&gt; #&lt;Set: {1, 2}&gt;\n  s1 == s2                              # -&gt; true\n  s1.add(&quot;foo&quot;)                         # -&gt; #&lt;Set: {1, 2, &quot;foo&quot;}&gt;\n  s1.merge([2, 6])                      # -&gt; #&lt;Set: {6, 1, 2, &quot;foo&quot;}&gt;\n  s1.subset? s2                         # -&gt; false\n  s2.subset? s1                         # -&gt; true\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Contact
- !ruby/struct:SM::Flow::VERB 
  body: "  - Akinori MUSHA &lt;knu@iDaemons.org&gt; (current maintainer)\n"
constants: []

full_name: Set
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "&"
- !ruby/object:RI::MethodSummary 
  name: +
- !ruby/object:RI::MethodSummary 
  name: "-"
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: ^
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: add?
- !ruby/object:RI::MethodSummary 
  name: classify
- !ruby/object:RI::MethodSummary 
  name: clear
- !ruby/object:RI::MethodSummary 
  name: collect!
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: delete?
- !ruby/object:RI::MethodSummary 
  name: delete_if
- !ruby/object:RI::MethodSummary 
  name: difference
- !ruby/object:RI::MethodSummary 
  name: divide
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: empty?
- !ruby/object:RI::MethodSummary 
  name: flatten
- !ruby/object:RI::MethodSummary 
  name: flatten!
- !ruby/object:RI::MethodSummary 
  name: flatten_merge
- !ruby/object:RI::MethodSummary 
  name: include?
- !ruby/object:RI::MethodSummary 
  name: initialize_copy
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: intersection
- !ruby/object:RI::MethodSummary 
  name: length
- !ruby/object:RI::MethodSummary 
  name: map!
- !ruby/object:RI::MethodSummary 
  name: member?
- !ruby/object:RI::MethodSummary 
  name: merge
- !ruby/object:RI::MethodSummary 
  name: proper_subset?
- !ruby/object:RI::MethodSummary 
  name: proper_superset?
- !ruby/object:RI::MethodSummary 
  name: reject!
- !ruby/object:RI::MethodSummary 
  name: replace
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: subset?
- !ruby/object:RI::MethodSummary 
  name: subtract
- !ruby/object:RI::MethodSummary 
  name: superset?
- !ruby/object:RI::MethodSummary 
  name: to_a
- !ruby/object:RI::MethodSummary 
  name: union
- !ruby/object:RI::MethodSummary 
  name: "|"
name: Set
superclass: Object
PK�|[
�x�00"ri/1.8/system/Set/delete%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes the given object from the set and returns self. If the object is not in the set, returns nil.
full_name: Set#delete?
is_singleton: false
name: delete?
params: (o)
visibility: public
PK�|[<H�gccri/1.8/system/Set/%5e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new set containing elements exclusive between the set and the given enumerable object. (set ^ enum) is equivalent to ((set | enum) - (set &amp; enum)).
full_name: Set#^
is_singleton: false
name: ^
params: (enum)
visibility: public
PK�|[9�����#ri/1.8/system/Set/difference-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #-"
full_name: Set#difference
is_singleton: false
name: difference
params: (enum)
visibility: public
PK�|[1U®��ri/1.8/system/Set/%5b%5d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new set containing the given objects.
full_name: Set::[]
is_singleton: true
name: "[]"
params: (*ary)
visibility: public
PK�|[X����ri/1.8/system/Set/clear-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes all elements and returns self.
full_name: Set#clear
is_singleton: false
name: clear
params: ()
visibility: public
PK�|[�ݥX)ri/1.8/system/Set/proper_subset%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the set is a proper subset of the given set.
full_name: Set#proper_subset?
is_singleton: false
name: proper_subset?
params: (set)
visibility: public
PK�|[�M��eeri/1.8/system/Set/%2d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: difference
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new set built by duplicating the set, removing every element that appears in the given enumerable object.
full_name: Set#-
is_singleton: false
name: "-"
params: (enum)
visibility: public
PK�|[�%�#ri/1.8/system/Set/collect%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: map!
block_params: (o)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Do collect() destructively.
full_name: Set#collect!
is_singleton: false
name: collect!
params: () {|o| ...}
visibility: public
PK�|[<�5�� ri/1.8/system/Complex/%25-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Remainder after division by a real or complex number.
full_name: Complex#%
is_singleton: false
name: "%"
params: (other)
visibility: public
PK�|[�0�#ri/1.8/system/Complex/new%21-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a <tt>Complex</tt> number <tt>a</tt>+<tt>b</tt><em>i</em>.
full_name: Complex::new!
is_singleton: true
name: new!
params: (a, b=0)
visibility: public
PK�|[���z

#ri/1.8/system/Complex/%2a%2a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Raise this complex number to the given (real or complex) power.
full_name: Complex#**
is_singleton: false
name: "**"
params: (other)
visibility: public
PK�|[�����&ri/1.8/system/Complex/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compares the absolute values of the two numbers.
full_name: Complex#<=>
is_singleton: false
name: <=>
params: (other)
visibility: public
PK�|[Qbv�#ri/1.8/system/Complex/coerce-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Attempts to coerce <tt>other</tt> to a Complex number.
full_name: Complex#coerce
is_singleton: false
name: coerce
params: (other)
visibility: public
PK�|[��[�� ri/1.8/system/Complex/%2f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Division by real or complex number.
full_name: Complex#/
is_singleton: false
name: /
params: (other)
visibility: public
PK�|[�{�p��&ri/1.8/system/Complex/numerator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: FIXME
full_name: Complex#numerator
is_singleton: false
name: numerator
params: ()
visibility: public
PK�|[�f<a�� ri/1.8/system/Complex/quo-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Complex#quo
is_singleton: false
name: quo
params: (other)
visibility: public
PK�|[,w�S��!ri/1.8/system/Complex/abs2-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Square of the absolute value.
full_name: Complex#abs2
is_singleton: false
name: abs2
params: ()
visibility: public
PK�|[����!ri/1.8/system/Complex/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a hash code for the complex number.
full_name: Complex#hash
is_singleton: false
name: hash
params: ()
visibility: public
PK�|[�w� ri/1.8/system/Complex/abs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Absolute value (aka modulus): distance from the zero point on the complex plane."
full_name: Complex#abs
is_singleton: false
name: abs
params: ()
visibility: public
PK�|[�w�~��"ri/1.8/system/Complex/angle-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #arg"
full_name: Complex#angle
is_singleton: false
name: angle
params: ()
visibility: public
PK�|[X~���� ri/1.8/system/Complex/%2a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Multiplication with real or complex number.
full_name: Complex#*
is_singleton: false
name: "*"
params: (other)
visibility: public
PK�|[d�y�//"ri/1.8/system/Complex/polar-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a <tt>Complex</tt> number in terms of <tt>r</tt> (radius) and <tt>theta</tt> (angle).
full_name: Complex::polar
is_singleton: true
name: polar
params: (r, theta)
visibility: public
PK�|[AJ%�$ri/1.8/system/Complex/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns &quot;<tt>Complex(<em>real</em>, <em>image</em>)</tt>&quot;.
full_name: Complex#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[��	�� ri/1.8/system/Complex/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Complex::new
is_singleton: true
name: new
params: (a, b)
visibility: public
PK�|[�Dž8��(ri/1.8/system/Complex/denominator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: FIXME
full_name: Complex#denominator
is_singleton: false
name: denominator
params: ()
visibility: public
PK�|[p3.��� ri/1.8/system/Complex/%2b-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Addition with real or complex number.
full_name: Complex#+
is_singleton: false
name: +
params: (other)
visibility: public
PK�|[:�T��"ri/1.8/system/Complex/polar-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the absolute value <em>and</em> the argument.
full_name: Complex#polar
is_singleton: false
name: polar
params: ()
visibility: public
PK�|[��_L��!ri/1.8/system/Complex/conj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #conjugate"
full_name: Complex#conj
is_singleton: false
name: conj
params: ()
visibility: public
PK�|[4����!ri/1.8/system/Complex/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Standard string representation of the complex number.
full_name: Complex#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[���#ri/1.8/system/Complex/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Test for numerical equality (<tt>a == a + 0<em>i</em></tt>).
full_name: Complex#==
is_singleton: false
name: ==
params: (other)
visibility: public
PK�|[�ө���(ri/1.8/system/Complex/cdesc-Complex.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The imaginary part of a complex number.
  name: image
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The real part of a complex number.
  name: real
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: new!
- !ruby/object:RI::MethodSummary 
  name: polar
comment: 
- !ruby/struct:SM::Flow::P 
  body: The complex number class. See complex.rb for an overview.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: <tt>I</tt> is the imaginary number. It exists at point (0,1) on the complex plane.
  name: I
  value: Complex(0,1)
- !ruby/object:RI::Constant 
  comment: 
  name: Unify
  value: "true"
full_name: Complex
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "%"
- !ruby/object:RI::MethodSummary 
  name: "*"
- !ruby/object:RI::MethodSummary 
  name: "**"
- !ruby/object:RI::MethodSummary 
  name: +
- !ruby/object:RI::MethodSummary 
  name: "-"
- !ruby/object:RI::MethodSummary 
  name: /
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: abs
- !ruby/object:RI::MethodSummary 
  name: abs2
- !ruby/object:RI::MethodSummary 
  name: angle
- !ruby/object:RI::MethodSummary 
  name: arg
- !ruby/object:RI::MethodSummary 
  name: coerce
- !ruby/object:RI::MethodSummary 
  name: conj
- !ruby/object:RI::MethodSummary 
  name: conjugate
- !ruby/object:RI::MethodSummary 
  name: denominator
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: numerator
- !ruby/object:RI::MethodSummary 
  name: polar
- !ruby/object:RI::MethodSummary 
  name: quo
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Complex
superclass: Numeric
PK�|[�	J44&ri/1.8/system/Complex/conjugate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: conj
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Complex conjugate (<tt>z + z.conjugate = 2 * z.real</tt>).
full_name: Complex#conjugate
is_singleton: false
name: conjugate
params: ()
visibility: public
PK�|[�/γ   ri/1.8/system/Complex/arg-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: angle
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Argument (angle from (1,0) on the complex plane).
full_name: Complex#arg
is_singleton: false
name: arg
params: ()
visibility: public
PK�|[�.`��� ri/1.8/system/Complex/%2d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Subtraction with real or complex number.
full_name: Complex#-
is_singleton: false
name: "-"
params: (other)
visibility: public
PK�|[�͇~~.ri/1.8/system/IndexError/cdesc-IndexError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: IndexError
includes: []

instance_methods: []

name: IndexError
superclass: StandardError
PK�|[ʶ��''*ri/1.8/system/OpenURI/Meta/cdesc-Meta.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: returns a URI which is base of relative URIs in the data. It may differ from the URI supplied by a user because redirection.
  name: base_uri
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: returns a Hash which represents header fields. The Hash keys are downcased for canonicalization.
  name: meta
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: returns an Array which consists status code and message.
  name: status
  rw: RW
class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Mixin for holding meta-information.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: RE_LWS
  value: /[\r\n\t ]+/n
- !ruby/object:RI::Constant 
  comment: 
  name: RE_TOKEN
  value: "%r{[^\\x00- ()<>@,;:\\\\\"/\\[\\]?={}\\x7f]+}n"
- !ruby/object:RI::Constant 
  comment: 
  name: RE_QUOTED_STRING
  value: "%r{\"(?:[\\r\\n\\t !#-\\[\\]-~\\x80-\\xff]|\\\\[\\x00-\\x7f])*\"}n"
- !ruby/object:RI::Constant 
  comment: 
  name: RE_PARAMETERS
  value: "%r{(?:;#{RE_LWS}?#{RE_TOKEN}#{RE_LWS}?=#{RE_LWS}?(?:#{RE_TOKEN}|#{RE_QUOTED_STRING})#{RE_LWS}?)*}n"
full_name: OpenURI::Meta
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: charset
- !ruby/object:RI::MethodSummary 
  name: content_encoding
- !ruby/object:RI::MethodSummary 
  name: content_type
- !ruby/object:RI::MethodSummary 
  name: last_modified
name: Meta
superclass: 
PK�|[�<ff.ri/1.8/system/OpenURI/Meta/content_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: returns &quot;type/subtype&quot; which is MIME Content-Type. It is downcased for canonicalization. Content-Type parameters are stripped.
full_name: OpenURI::Meta#content_type
is_singleton: false
name: content_type
params: ()
visibility: public
PK�|[<���dd2ri/1.8/system/OpenURI/Meta/content_encoding-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: returns a list of encodings in Content-Encoding field as an Array of String. The encodings are downcased for canonicalization.
full_name: OpenURI::Meta#content_encoding
is_singleton: false
name: content_encoding
params: ()
visibility: public
PK�|[J����)ri/1.8/system/OpenURI/Meta/charset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: returns a charset parameter in Content-Type field. It is downcased for canonicalization.
- !ruby/struct:SM::Flow::P 
  body: If charset parameter is not given but a block is given, the block is called and its result is returned. It can be used to guess charset.
- !ruby/struct:SM::Flow::P 
  body: If charset parameter and block is not given, nil is returned except text type in HTTP. In that case, &quot;iso-8859-1&quot; is returned as defined by RFC2616 3.7.1.
full_name: OpenURI::Meta#charset
is_singleton: false
name: charset
params: () {|| ...}
visibility: public
PK�|[Ba�3/ri/1.8/system/OpenURI/Meta/last_modified-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: returns a Time which represents Last-Modified field.
full_name: OpenURI::Meta#last_modified
is_singleton: false
name: last_modified
params: ()
visibility: public
PK�|[�U���*ri/1.8/system/OpenURI/OpenRead/read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: OpenURI::OpenRead#read([options]) reads a content referenced by self and returns the content as string. The string is extended with OpenURI::Meta. The argument `options' is same as OpenURI::OpenRead#open.
full_name: OpenURI::OpenRead#read
is_singleton: false
name: read
params: (options={})
visibility: public
PK�|[@7�0*ri/1.8/system/OpenURI/OpenRead/open-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: OpenURI::OpenRead#open provides `open' for URI::HTTP and URI::FTP.
- !ruby/struct:SM::Flow::P 
  body: "OpenURI::OpenRead#open takes optional 3 arguments as: OpenURI::OpenRead#open([mode [, perm]] [, options]) [{|io| ... }]"
- !ruby/struct:SM::Flow::P 
  body: `mode', `perm' is same as Kernel#open.
- !ruby/struct:SM::Flow::P 
  body: However, `mode' must be read mode because OpenURI::OpenRead#open doesn't support write mode (yet). Also `perm' is just ignored because it is meaningful only for file creation.
- !ruby/struct:SM::Flow::P 
  body: `options' must be a hash.
- !ruby/struct:SM::Flow::P 
  body: Each pairs which key is a string in the hash specify a extra header field for HTTP. I.e. it is ignored for FTP without HTTP proxy.
- !ruby/struct:SM::Flow::P 
  body: "The hash may include other options which key is a symbol:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: ":proxy"
    body: "Synopsis:"
  - !ruby/struct:SM::Flow::VERB 
    body: "  :proxy =&gt; &quot;http://proxy.foo.com:8000/&quot;\n  :proxy =&gt; URI.parse(&quot;http://proxy.foo.com:8000/&quot;)\n  :proxy =&gt; true\n  :proxy =&gt; false\n  :proxy =&gt; nil\n"
  - !ruby/struct:SM::Flow::P 
    body: If :proxy option is specified, the value should be String, URI, boolean or nil. When String or URI is given, it is treated as proxy URI. When true is given or the option itself is not specified, environment variable `scheme_proxy' is examined. `scheme' is replaced by `http', `https' or `ftp'. When false or nil is given, the environment variables are ignored and connection will be made to a server directly.
  - !ruby/struct:SM::Flow::LI 
    label: ":http_basic_authentication"
    body: "Synopsis:"
  - !ruby/struct:SM::Flow::VERB 
    body: "  :http_basic_authentication=&gt;[user, password]\n"
  - !ruby/struct:SM::Flow::P 
    body: "If :http_basic_authentication is specified, the value should be an array which contains 2 strings: username and password. It is used for HTTP Basic authentication defined by RFC 2617."
  - !ruby/struct:SM::Flow::LI 
    label: ":content_length_proc"
    body: "Synopsis:"
  - !ruby/struct:SM::Flow::VERB 
    body: "  :content_length_proc =&gt; lambda {|content_length| ... }\n"
  - !ruby/struct:SM::Flow::P 
    body: If :content_length_proc option is specified, the option value procedure is called before actual transfer is started. It takes one argument which is expected content length in bytes.
  - !ruby/struct:SM::Flow::P 
    body: If two or more transfer is done by HTTP redirection, the procedure is called only one for a last transfer.
  - !ruby/struct:SM::Flow::P 
    body: When expected content length is unknown, the procedure is called with nil. It is happen when HTTP response has no Content-Length header.
  - !ruby/struct:SM::Flow::LI 
    label: ":progress_proc"
    body: "Synopsis:"
  - !ruby/struct:SM::Flow::VERB 
    body: "  :progress_proc =&gt; lambda {|size| ...}\n"
  - !ruby/struct:SM::Flow::P 
    body: If :progress_proc option is specified, the proc is called with one argument each time when `open' gets content fragment from network. The argument `size' `size' is a accumulated transfered size in bytes.
  - !ruby/struct:SM::Flow::P 
    body: If two or more transfer is done by HTTP redirection, the procedure is called only one for a last transfer.
  - !ruby/struct:SM::Flow::P 
    body: ":progress_proc and :content_length_proc are intended to be used for progress bar. For example, it can be implemented as follows using Ruby/ProgressBar."
  - !ruby/struct:SM::Flow::VERB 
    body: "  pbar = nil\n  open(&quot;http://...&quot;,\n    :content_length_proc =&gt; lambda {|t|\n      if t &amp;&amp; 0 &lt; t\n        pbar = ProgressBar.new(&quot;...&quot;, t)\n        pbar.file_transfer_mode\n      end\n    },\n    :progress_proc =&gt; lambda {|s|\n      pbar.set s if pbar\n    }) {|f| ... }\n"
  type: :LABELED
- !ruby/struct:SM::Flow::P 
  body: OpenURI::OpenRead#open returns an IO like object if block is not given. Otherwise it yields the IO object and return the value of the block. The IO object is extended with OpenURI::Meta.
full_name: OpenURI::OpenRead#open
is_singleton: false
name: open
params: (*rest, &block)
visibility: public
PK�|[�V�\\2ri/1.8/system/OpenURI/OpenRead/cdesc-OpenRead.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Mixin for HTTP and FTP URIs.
constants: []

full_name: OpenURI::OpenRead
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: open
- !ruby/object:RI::MethodSummary 
  name: read
name: OpenRead
superclass: 
PK�|[�~��444ri/1.8/system/OpenURI/HTTPError/cdesc-HTTPError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: io
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: OpenURI::HTTPError
includes: []

instance_methods: []

name: HTTPError
superclass: StandardError
PK�|[���f��*ri/1.8/system/OpenURI/HTTPError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: OpenURI::HTTPError::new
is_singleton: true
name: new
params: (message, io)
visibility: public
PK�|[�Ag���.ri/1.8/system/OpenURI/Buffer/cdesc-Buffer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: OpenURI::Buffer
includes: []

instance_methods: []

name: Buffer
superclass: Object
PK�|[�.�	xx(ri/1.8/system/OpenURI/cdesc-OpenURI.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::VERB 
  body: " OpenURI is an easy-to-use wrapper for net/http, net/https and net/ftp.\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: " It is possible to open http/https/ftp URL as usual like opening a file:\n\n   open(&quot;http://www.ruby-lang.org/&quot;) {|f|\n     f.each_line {|line| p line}\n   }\n\n The opened file has several methods for meta information as follows since\n it is extended by OpenURI::Meta.\n\n   open(&quot;http://www.ruby-lang.org/en&quot;) {|f|\n     f.each_line {|line| p line}\n     p f.base_uri         # &lt;URI::HTTP:0x40e6ef2 URL:http://www.ruby-lang.org/en/&gt;\n     p f.content_type     # &quot;text/html&quot;\n     p f.charset          # &quot;iso-8859-1&quot;\n     p f.content_encoding # []\n     p f.last_modified    # Thu Dec 05 02:45:02 UTC 2002\n   }\n\n Additional header fields can be specified by an optional hash argument.\n\n   open(&quot;http://www.ruby-lang.org/en/&quot;,\n     &quot;User-Agent&quot; =&gt; &quot;Ruby/#{RUBY_VERSION}&quot;,\n     &quot;From&quot; =&gt; &quot;foo@bar.invalid&quot;,\n     &quot;Referer&quot; =&gt; &quot;http://www.ruby-lang.org/&quot;) {|f|\n     # ...\n   }\n\n The environment variables such as http_proxy, https_proxy and ftp_proxy\n are in effect by default.  :proxy =&gt; nil disables proxy.\n\n   open(&quot;http://www.ruby-lang.org/en/raa.html&quot;, :proxy =&gt; nil) {|f|\n     # ...\n   }\n\n URI objects can be opened in a similar way.\n\n   uri = URI.parse(&quot;http://www.ruby-lang.org/en/&quot;)\n   uri.open {|f|\n     # ...\n   }\n\n URI objects can be read directly. The returned string is also extended by\n OpenURI::Meta.\n\n   str = uri.read\n   p str.base_uri\n\n Author:: Tanaka Akira &lt;akr@m17n.org&gt;\n"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Options
  value: "{     :proxy => true,     :progress_proc => true,     :content_length_proc => true,     :http_basic_authentication => true,   }"
full_name: OpenURI
includes: []

instance_methods: []

name: OpenURI
superclass: 
PK�|[��7&ri/1.8/system/Signal/cdesc-Signal.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: list
- !ruby/object:RI::MethodSummary 
  name: trap
comment: 
- !ruby/struct:SM::Flow::P 
  body: Many operating systems allow signals to be sent to running processes. Some signals have a defined effect on the process, while others may be trapped at the code level and acted upon. For example, your process may trap the USR1 signal and use it to toggle debugging, and may use TERM to initiate a controlled shutdown.
- !ruby/struct:SM::Flow::VERB 
  body: "    pid = fork do\n      Signal.trap(&quot;USR1&quot;) do\n        $debug = !$debug\n        puts &quot;Debug now: #$debug&quot;\n      end\n      Signal.trap(&quot;TERM&quot;) do\n        puts &quot;Terminating...&quot;\n        shutdown()\n      end\n      # . . . do some work . . .\n    end\n\n    Process.detach(pid)\n\n    # Controlling program:\n    Process.kill(&quot;USR1&quot;, pid)\n    # ...\n    Process.kill(&quot;USR1&quot;, pid)\n    # ...\n    Process.kill(&quot;TERM&quot;, pid)\n"
- !ruby/struct:SM::Flow::P 
  body: "produces:"
- !ruby/struct:SM::Flow::VERB 
  body: "    Debug now: true\n    Debug now: false\n   Terminating...\n"
- !ruby/struct:SM::Flow::P 
  body: The list of available signal names and their interpretation is system dependent. Signal delivery semantics may also vary between systems; in particular signal delivery may not always be reliable.
constants: []

full_name: Signal
includes: []

instance_methods: []

name: Signal
superclass: 
PK�|[1�跔� ri/1.8/system/Signal/list-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a list of signal names mapped to the corresponding underlying signal numbers.
- !ruby/struct:SM::Flow::P 
  body: "Signal.list #=&gt; {&quot;ABRT&quot;=&gt;6, &quot;ALRM&quot;=&gt;14, &quot;BUS&quot;=&gt;7, &quot;CHLD&quot;=&gt;17, &quot;CLD&quot;=&gt;17, &quot;CONT&quot;=&gt;18, &quot;FPE&quot;=&gt;8, &quot;HUP&quot;=&gt;1, &quot;ILL&quot;=&gt;4, &quot;INT&quot;=&gt;2, &quot;IO&quot;=&gt;29, &quot;IOT&quot;=&gt;6, &quot;KILL&quot;=&gt;9, &quot;PIPE&quot;=&gt;13, &quot;POLL&quot;=&gt;29, &quot;PROF&quot;=&gt;27, &quot;PWR&quot;=&gt;30, &quot;QUIT&quot;=&gt;3, &quot;SEGV&quot;=&gt;11, &quot;STOP&quot;=&gt;19, &quot;SYS&quot;=&gt;31, &quot;TERM&quot;=&gt;15, &quot;TRAP&quot;=&gt;5, &quot;TSTP&quot;=&gt;20, &quot;TTIN&quot;=&gt;21, &quot;TTOU&quot;=&gt;22, &quot;URG&quot;=&gt;23, &quot;USR1&quot;=&gt;10, &quot;USR2&quot;=&gt;12, &quot;VTALRM&quot;=&gt;26, &quot;WINCH&quot;=&gt;28, &quot;XCPU&quot;=&gt;24, &quot;XFSZ&quot;=&gt;25}"
full_name: Signal::list
is_singleton: true
name: list
params: |
  Signal.list => a_hash

visibility: public
PK�|[-�?rr ri/1.8/system/Signal/trap-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Specifies the handling of signals. The first parameter is a signal name (a string such as ``SIGALRM'', ``SIGUSR1'', and so on) or a signal number. The characters ``SIG'' may be omitted from the signal name. The command or block specifies code to be run when the signal is raised. If the command is the string ``IGNORE'' or ``SIG_IGN'', the signal will be ignored. If the command is ``DEFAULT'' or ``SIG_DFL'', the operating system's default handler will be invoked. If the command is ``EXIT'', the script will be terminated by the signal. Otherwise, the given command or block will be run. The special signal name ``EXIT'' or signal number zero will be invoked just prior to program termination. trap returns the previous handler for the given signal.
- !ruby/struct:SM::Flow::VERB 
  body: "    Signal.trap(0, proc { puts &quot;Terminating: #{$$}&quot; })\n    Signal.trap(&quot;CLD&quot;)  { puts &quot;Child died&quot; }\n    fork &amp;&amp; Process.wait\n"
- !ruby/struct:SM::Flow::P 
  body: "produces:"
- !ruby/struct:SM::Flow::VERB 
  body: "    Terminating: 27461\n    Child died\n    Terminating: 27460\n"
full_name: Signal::trap
is_singleton: true
name: trap
params: |
  Signal.trap( signal, proc ) => obj
  Signal.trap( signal ) {| | block } => obj

visibility: public
PK�|[t�U��'ri/1.8/system/XSD/XSDBoolean/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDBoolean::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[�Տ�2ri/1.8/system/XSD/XSDBoolean/cdesc-XSDBoolean.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, BooleanLiteral)
full_name: XSD::XSDBoolean
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: screen_data
name: XSDBoolean
superclass: XSDAnySimpleType
PK�|[��7���/ri/1.8/system/XSD/XSDBoolean/screen_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDBoolean#screen_data
is_singleton: false
name: screen_data
params: (value)
visibility: private
PK�|[�����+ri/1.8/system/XSD/NamedElements/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NamedElements#size
is_singleton: false
name: size
params: ()
visibility: public
PK�|[�V)��-ri/1.8/system/XSD/NamedElements/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NamedElements#[]
is_singleton: false
name: "[]"
params: (idx)
visibility: public
PK�|[�{�>��/ri/1.8/system/XSD/NamedElements/empty%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NamedElements#empty?
is_singleton: false
name: empty?
params: ()
visibility: public
PK�|[4�mQ��+ri/1.8/system/XSD/NamedElements/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (element)
comment: 
full_name: XSD::NamedElements#each
is_singleton: false
name: each
params: () {|element| ...}
visibility: public
PK�|[M�Q��2ri/1.8/system/XSD/NamedElements/elements%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NamedElements#elements=
is_singleton: false
name: elements=
params: (rhs)
visibility: protected
PK�|[1�H��0ri/1.8/system/XSD/NamedElements/find_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NamedElements#find_name
is_singleton: false
name: find_name
params: (name)
visibility: public
PK�|[myڬ�*ri/1.8/system/XSD/NamedElements/dup-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NamedElements#dup
is_singleton: false
name: dup
params: ()
visibility: public
PK�|[8��s��-ri/1.8/system/XSD/NamedElements/concat-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NamedElements#concat
is_singleton: false
name: concat
params: (rhs)
visibility: public
PK�|[`���-ri/1.8/system/XSD/NamedElements/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NamedElements#delete
is_singleton: false
name: delete
params: (rhs)
visibility: public
PK�|[�K��*ri/1.8/system/XSD/NamedElements/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NamedElements::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[n+��*ri/1.8/system/XSD/NamedElements/%2b-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NamedElements#+
is_singleton: false
name: +
params: (rhs)
visibility: public
PK�|[F=E��-ri/1.8/system/XSD/NamedElements/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NamedElements#<<
is_singleton: false
name: "<<"
params: (rhs)
visibility: public
PK�|[��@��+ri/1.8/system/XSD/NamedElements/keys-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NamedElements#keys
is_singleton: false
name: keys
params: ()
visibility: public
PK�|[���!!8ri/1.8/system/XSD/NamedElements/cdesc-NamedElements.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Empty
  value: NamedElements.new.freeze
full_name: XSD::NamedElements
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: +
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: concat
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: dup
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: elements
- !ruby/object:RI::MethodSummary 
  name: elements=
- !ruby/object:RI::MethodSummary 
  name: empty?
- !ruby/object:RI::MethodSummary 
  name: find_name
- !ruby/object:RI::MethodSummary 
  name: freeze
- !ruby/object:RI::MethodSummary 
  name: keys
- !ruby/object:RI::MethodSummary 
  name: size
name: NamedElements
superclass: Object
PK�|[��ײ�-ri/1.8/system/XSD/NamedElements/freeze-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NamedElements#freeze
is_singleton: false
name: freeze
params: ()
visibility: public
PK�|[ap���/ri/1.8/system/XSD/NamedElements/elements-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NamedElements#elements
is_singleton: false
name: elements
params: ()
visibility: protected
PK�|[X��߸�+ri/1.8/system/XSD/XSDUnsignedInt/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDUnsignedInt::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[$/���4ri/1.8/system/XSD/XSDUnsignedInt/mininclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDUnsignedInt#mininclusive
is_singleton: false
name: mininclusive
params: ()
visibility: private
PK�|[�����:ri/1.8/system/XSD/XSDUnsignedInt/cdesc-XSDUnsignedInt.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, UnsignedIntLiteral)
full_name: XSD::XSDUnsignedInt
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maxinclusive
- !ruby/object:RI::MethodSummary 
  name: mininclusive
name: XSDUnsignedInt
superclass: XSDUnsignedLong
PK�|[�]l��4ri/1.8/system/XSD/XSDUnsignedInt/maxinclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDUnsignedInt#maxinclusive
is_singleton: false
name: maxinclusive
params: ()
visibility: private
PK�|[�	s���#ri/1.8/system/XSD/XSDNil/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDNil::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[+⏙�*ri/1.8/system/XSD/XSDNil/cdesc-XSDNil.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, NilLiteral)
- !ruby/object:RI::Constant 
  comment: 
  name: Value
  value: "'true'"
full_name: XSD::XSDNil
includes: []

instance_methods: []

name: XSDNil
superclass: XSDAnySimpleType
PK�|[����>ri/1.8/system/XSD/XMLParser/XMLScanner/scanner_kcode%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::XMLScanner#scanner_kcode=
is_singleton: false
name: scanner_kcode=
params: (charset)
visibility: public
PK�|[�8�c��5ri/1.8/system/XSD/XMLParser/XMLScanner/on_etag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: def on_cdata(str); end
full_name: XSD::XMLParser::XMLScanner#on_etag
is_singleton: false
name: on_etag
params: (name)
visibility: public
PK�|[�yQ��?ri/1.8/system/XSD/XMLParser/XMLScanner/on_attr_entityref-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::XMLScanner#on_attr_entityref
is_singleton: false
name: on_attr_entityref
params: (ref)
visibility: public
PK�|[�V�6��5ri/1.8/system/XSD/XMLParser/XMLScanner/warning-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::XMLScanner#warning
is_singleton: false
name: warning
params: (msg)
visibility: public
PK�|[V�����;ri/1.8/system/XSD/XMLParser/XMLScanner/on_attr_value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::XMLScanner#on_attr_value
is_singleton: false
name: on_attr_value
params: (str)
visibility: public
PK�|[�e���9ri/1.8/system/XSD/XMLParser/XMLScanner/parse_error-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::XMLScanner#parse_error
is_singleton: false
name: parse_error
params: (msg)
visibility: public
PK�|[/�;�?ri/1.8/system/XSD/XMLParser/XMLScanner/on_stag_end_empty-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: def on_attribute_end(name); end
full_name: XSD::XMLParser::XMLScanner#on_stag_end_empty
is_singleton: false
name: on_stag_end_empty
params: (name)
visibility: public
PK�|[E���=ri/1.8/system/XSD/XMLParser/XMLScanner/on_attr_charref-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::XMLScanner#on_attr_charref
is_singleton: false
name: on_attr_charref
params: (code)
visibility: public
PK�|[��Aa��>ri/1.8/system/XSD/XMLParser/XMLScanner/wellformed_error-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::XMLScanner#wellformed_error
is_singleton: false
name: wellformed_error
params: (msg)
visibility: public
PK�|[W����6ri/1.8/system/XSD/XMLParser/XMLScanner/do_parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::XMLScanner#do_parse
is_singleton: false
name: do_parse
params: (string_or_readable)
visibility: public
PK�|[��	���8ri/1.8/system/XSD/XMLParser/XMLScanner/on_charref-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::XMLScanner#on_charref
is_singleton: false
name: on_charref
params: (code)
visibility: public
PK�|[&^���Ari/1.8/system/XSD/XMLParser/XMLScanner/on_xmldecl_encoding-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::XMLScanner#on_xmldecl_encoding
is_singleton: false
name: on_xmldecl_encoding
params: (str)
visibility: public
PK�|[K�QQ<ri/1.8/system/XSD/XMLParser/XMLScanner/cdesc-XMLScanner.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ENTITY_REF_MAP
  value: "{     'lt' => '<',     'gt' => '>',     'amp' => '&',     'quot' => '\"',     'apos' => '\\''"
full_name: XSD::XMLParser::XMLScanner
includes: 
- !ruby/object:RI::IncludedModule 
  name: XMLScan::Visitor
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: do_parse
- !ruby/object:RI::MethodSummary 
  name: on_attr_charref
- !ruby/object:RI::MethodSummary 
  name: on_attr_charref_hex
- !ruby/object:RI::MethodSummary 
  name: on_attr_entityref
- !ruby/object:RI::MethodSummary 
  name: on_attr_value
- !ruby/object:RI::MethodSummary 
  name: on_attribute
- !ruby/object:RI::MethodSummary 
  name: on_chardata
- !ruby/object:RI::MethodSummary 
  name: on_charref
- !ruby/object:RI::MethodSummary 
  name: on_charref_hex
- !ruby/object:RI::MethodSummary 
  name: on_entityref
- !ruby/object:RI::MethodSummary 
  name: on_etag
- !ruby/object:RI::MethodSummary 
  name: on_stag
- !ruby/object:RI::MethodSummary 
  name: on_stag_end
- !ruby/object:RI::MethodSummary 
  name: on_stag_end_empty
- !ruby/object:RI::MethodSummary 
  name: on_xmldecl_encoding
- !ruby/object:RI::MethodSummary 
  name: on_xmldecl_version
- !ruby/object:RI::MethodSummary 
  name: parse_error
- !ruby/object:RI::MethodSummary 
  name: scanner_kcode=
- !ruby/object:RI::MethodSummary 
  name: valid_error
- !ruby/object:RI::MethodSummary 
  name: warning
- !ruby/object:RI::MethodSummary 
  name: wellformed_error
name: XMLScanner
superclass: XSD::XMLParser::Parser
PK�|[{���:ri/1.8/system/XSD/XMLParser/XMLScanner/on_attribute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::XMLScanner#on_attribute
is_singleton: false
name: on_attribute
params: (name)
visibility: public
PK�|[�`"c��5ri/1.8/system/XSD/XMLParser/XMLScanner/on_stag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: def on_end_document; end
full_name: XSD::XMLParser::XMLScanner#on_stag
is_singleton: false
name: on_stag
params: (name)
visibility: public
PK�|[|Hu���9ri/1.8/system/XSD/XMLParser/XMLScanner/valid_error-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::XMLScanner#valid_error
is_singleton: false
name: valid_error
params: (msg)
visibility: public
PK�|[���+��Ari/1.8/system/XSD/XMLParser/XMLScanner/on_attr_charref_hex-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::XMLScanner#on_attr_charref_hex
is_singleton: false
name: on_attr_charref_hex
params: (code)
visibility: public
PK�|[��^D9ri/1.8/system/XSD/XMLParser/XMLScanner/on_chardata-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: def on_pi(target, pi); end
full_name: XSD::XMLParser::XMLScanner#on_chardata
is_singleton: false
name: on_chardata
params: (str)
visibility: public
PK�|[s�qB��9ri/1.8/system/XSD/XMLParser/XMLScanner/on_stag_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::XMLScanner#on_stag_end
is_singleton: false
name: on_stag_end
params: (name)
visibility: public
PK�|[F�a)

@ri/1.8/system/XSD/XMLParser/XMLScanner/on_xmldecl_version-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: def on_xmldecl; end
full_name: XSD::XMLParser::XMLScanner#on_xmldecl_version
is_singleton: false
name: on_xmldecl_version
params: (str)
visibility: public
PK�|[ &��<ri/1.8/system/XSD/XMLParser/XMLScanner/on_charref_hex-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::XMLScanner#on_charref_hex
is_singleton: false
name: on_charref_hex
params: (code)
visibility: public
PK�|[�E!���:ri/1.8/system/XSD/XMLParser/XMLScanner/on_entityref-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::XMLScanner#on_entityref
is_singleton: false
name: on_entityref
params: (ref)
visibility: public
PK�|[@%�JBri/1.8/system/XSD/XMLParser/XMLParser/Listener/cdesc-Listener.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XSD::XMLParser::XMLParser::Listener
includes: 
- !ruby/object:RI::IncludedModule 
  name: XML::Encoding_ja
instance_methods: []

name: Listener
superclass: XML::Parser
PK�|[�S$��5ri/1.8/system/XSD/XMLParser/XMLParser/do_parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::XMLParser#do_parse
is_singleton: false
name: do_parse
params: (string_or_readable)
visibility: public
PK�|[�T:ri/1.8/system/XSD/XMLParser/XMLParser/cdesc-XMLParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XSD::XMLParser::XMLParser
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: do_parse
name: XMLParser
superclass: XSD::XMLParser::Parser
PK�|[C���0ri/1.8/system/XSD/XMLParser/create_parser-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser#create_parser
is_singleton: false
name: create_parser
params: (host, opt)
visibility: public
PK�|[�#>��6ri/1.8/system/XSD/XMLParser/REXMLParser/tag_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::REXMLParser#tag_end
is_singleton: false
name: tag_end
params: (name)
visibility: public
PK�|[c)��6ri/1.8/system/XSD/XMLParser/REXMLParser/xmldecl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::REXMLParser#xmldecl
is_singleton: false
name: xmldecl
params: (version, encoding, standalone)
visibility: public
PK�|[Y�����7ri/1.8/system/XSD/XMLParser/REXMLParser/do_parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::REXMLParser#do_parse
is_singleton: false
name: do_parse
params: (string_or_readable)
visibility: public
PK�|[�j�aKK>ri/1.8/system/XSD/XMLParser/REXMLParser/cdesc-REXMLParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XSD::XMLParser::REXMLParser
includes: 
- !ruby/object:RI::IncludedModule 
  name: REXML::StreamListener
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: do_parse
- !ruby/object:RI::MethodSummary 
  name: epilogue
- !ruby/object:RI::MethodSummary 
  name: tag_end
- !ruby/object:RI::MethodSummary 
  name: tag_start
- !ruby/object:RI::MethodSummary 
  name: text
- !ruby/object:RI::MethodSummary 
  name: xmldecl
name: REXMLParser
superclass: XSD::XMLParser::Parser
PK�|[O���7ri/1.8/system/XSD/XMLParser/REXMLParser/epilogue-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::REXMLParser#epilogue
is_singleton: false
name: epilogue
params: ()
visibility: public
PK�|[-��]��3ri/1.8/system/XSD/XMLParser/REXMLParser/text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::REXMLParser#text
is_singleton: false
name: text
params: (text)
visibility: public
PK�|[�W���8ri/1.8/system/XSD/XMLParser/REXMLParser/tag_start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::REXMLParser#tag_start
is_singleton: false
name: tag_start
params: (name, attrs)
visibility: public
PK�|[��#���,ri/1.8/system/XSD/XMLParser/filter_ns-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser#filter_ns
is_singleton: false
name: filter_ns
params: (ns, attrs)
visibility: public
PK�|[9�y}��0ri/1.8/system/XSD/XMLParser/cdesc-XMLParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: $1 is necessary.
  name: NSParseRegexp
  value: Regexp.new('^xmlns:?(.*)$')
full_name: XSD::XMLParser
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: create_parser
- !ruby/object:RI::MethodSummary 
  name: filter_ns
name: XMLParser
superclass: 
PK�|[�N�(��2ri/1.8/system/XSD/XMLParser/Parser/prologue-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::Parser#prologue
is_singleton: false
name: prologue
params: ()
visibility: private
PK�|[{�k��Qri/1.8/system/XSD/XMLParser/Parser/FormatDecodeError/cdesc-FormatDecodeError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XSD::XMLParser::Parser::FormatDecodeError
includes: []

instance_methods: []

name: FormatDecodeError
superclass: ParseError
PK�|[U%��Yri/1.8/system/XSD/XMLParser/Parser/UnknownAttributeError/cdesc-UnknownAttributeError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XSD::XMLParser::Parser::UnknownAttributeError
includes: []

instance_methods: []

name: UnknownAttributeError
superclass: FormatDecodeError
PK�|[��p���/ri/1.8/system/XSD/XMLParser/Parser/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::Parser#parse
is_singleton: false
name: parse
params: (string_or_readable)
visibility: public
PK�|[�M
��Uri/1.8/system/XSD/XMLParser/Parser/UnknownElementError/cdesc-UnknownElementError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XSD::XMLParser::Parser::UnknownElementError
includes: []

instance_methods: []

name: UnknownElementError
superclass: FormatDecodeError
PK�|[�*,��[ri/1.8/system/XSD/XMLParser/Parser/ElementConstraintError/cdesc-ElementConstraintError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XSD::XMLParser::Parser::ElementConstraintError
includes: []

instance_methods: []

name: ElementConstraintError
superclass: FormatDecodeError
PK�|[�HTo��2ri/1.8/system/XSD/XMLParser/Parser/do_parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::Parser#do_parse
is_singleton: false
name: do_parse
params: (string_or_readable)
visibility: private
PK�|[��yy4ri/1.8/system/XSD/XMLParser/Parser/cdesc-Parser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: charset
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_factory
- !ruby/object:RI::MethodSummary 
  name: create_parser
- !ruby/object:RI::MethodSummary 
  name: factory
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: XSD::XMLParser::Parser
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: characters
- !ruby/object:RI::MethodSummary 
  name: do_parse
- !ruby/object:RI::MethodSummary 
  name: end_element
- !ruby/object:RI::MethodSummary 
  name: epilogue
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: prologue
- !ruby/object:RI::MethodSummary 
  name: start_element
- !ruby/object:RI::MethodSummary 
  name: xmldecl_encoding=
name: Parser
superclass: Object
PK�|[$����-ri/1.8/system/XSD/XMLParser/Parser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::Parser::new
is_singleton: true
name: new
params: (host, opt = {})
visibility: public
PK�|[�0�A��5ri/1.8/system/XSD/XMLParser/Parser/end_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::Parser#end_element
is_singleton: false
name: end_element
params: (name)
visibility: private
PK�|[-	p���7ri/1.8/system/XSD/XMLParser/Parser/start_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::Parser#start_element
is_singleton: false
name: start_element
params: (name, attrs)
visibility: private
PK�|[� �
��Cri/1.8/system/XSD/XMLParser/Parser/ParseError/cdesc-ParseError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XSD::XMLParser::Parser::ParseError
includes: []

instance_methods: []

name: ParseError
superclass: Error
PK�|[�;���2ri/1.8/system/XSD/XMLParser/Parser/epilogue-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::Parser#epilogue
is_singleton: false
name: epilogue
params: ()
visibility: private
PK�|[�����4ri/1.8/system/XSD/XMLParser/Parser/characters-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::Parser#characters
is_singleton: false
name: characters
params: (text)
visibility: private
PK�|[6k���5ri/1.8/system/XSD/XMLParser/Parser/add_factory-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::Parser::add_factory
is_singleton: true
name: add_factory
params: (factory)
visibility: public
PK�|[��D���[ri/1.8/system/XSD/XMLParser/Parser/UnexpectedElementError/cdesc-UnexpectedElementError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XSD::XMLParser::Parser::UnexpectedElementError
includes: []

instance_methods: []

name: UnexpectedElementError
superclass: FormatDecodeError
PK�|[!����=ri/1.8/system/XSD/XMLParser/Parser/xmldecl_encoding%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::Parser#xmldecl_encoding=
is_singleton: false
name: xmldecl_encoding=
params: (charset)
visibility: private
PK�|[��� ��7ri/1.8/system/XSD/XMLParser/Parser/create_parser-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::Parser::create_parser
is_singleton: true
name: create_parser
params: (host, opt = {})
visibility: public
PK�|[��=��1ri/1.8/system/XSD/XMLParser/Parser/factory-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XMLParser::Parser::factory
is_singleton: true
name: factory
params: ()
visibility: public
PK�|[J�?���/ri/1.8/system/XSD/XSDAnySimpleType/_to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDAnySimpleType#_to_s
is_singleton: false
name: _to_s
params: ()
visibility: private
PK�|[2�J޽�.ri/1.8/system/XSD/XSDAnySimpleType/init-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDAnySimpleType#init
is_singleton: false
name: init
params: (type, value)
visibility: private
PK�|[�ۣ$jj-ri/1.8/system/XSD/XSDAnySimpleType/set-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "set accepts a string which follows lexical space (ex. String: &quot;+123&quot;), or an object which follows canonical space (ex. Integer: 123)."
full_name: XSD::XSDAnySimpleType#set
is_singleton: false
name: set
params: (value)
visibility: public
PK�|[ZC���-ri/1.8/system/XSD/XSDAnySimpleType/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDAnySimpleType::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[���^5ri/1.8/system/XSD/XSDAnySimpleType/screen_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: raises ValueSpaceError if check failed
full_name: XSD::XSDAnySimpleType#screen_data
is_singleton: false
name: screen_data
params: (value)
visibility: private
PK�|[�r�2ff>ri/1.8/system/XSD/XSDAnySimpleType/cdesc-XSDAnySimpleType.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "@data represents canonical space (ex. Integer: 123)."
  name: data
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "@is_nil represents this data is nil or not."
  name: is_nil
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: The base class of XSD datatypes.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, AnySimpleTypeLiteral)
full_name: XSD::XSDAnySimpleType
includes: 
- !ruby/object:RI::IncludedModule 
  name: XSD
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _set
- !ruby/object:RI::MethodSummary 
  name: _to_s
- !ruby/object:RI::MethodSummary 
  name: check_lexical_format
- !ruby/object:RI::MethodSummary 
  name: init
- !ruby/object:RI::MethodSummary 
  name: screen_data
- !ruby/object:RI::MethodSummary 
  name: set
- !ruby/object:RI::MethodSummary 
  name: to_s
name: XSDAnySimpleType
superclass: NSDBase
PK�|[�8�>ri/1.8/system/XSD/XSDAnySimpleType/check_lexical_format-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: true or raise
full_name: XSD::XSDAnySimpleType#check_lexical_format
is_singleton: false
name: check_lexical_format
params: (value)
visibility: public
PK�|[�u*((.ri/1.8/system/XSD/XSDAnySimpleType/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "to_s creates a string which follows lexical space (ex. String: &quot;123&quot;)."
full_name: XSD::XSDAnySimpleType#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[Z>�A��.ri/1.8/system/XSD/XSDAnySimpleType/_set-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDAnySimpleType#_set
is_singleton: false
name: _set
params: (value)
visibility: private
PK�|[��P��,ri/1.8/system/XSD/XSDHexBinary/string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDHexBinary#string
is_singleton: false
name: string
params: ()
visibility: public
PK�|[+�x��1ri/1.8/system/XSD/XSDHexBinary/set_encoded-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDHexBinary#set_encoded
is_singleton: false
name: set_encoded
params: (value)
visibility: public
PK�|[�L��)ri/1.8/system/XSD/XSDHexBinary/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: String in Ruby could be a binary.
full_name: XSD::XSDHexBinary::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[����1ri/1.8/system/XSD/XSDHexBinary/screen_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDHexBinary#screen_data
is_singleton: false
name: screen_data
params: (value)
visibility: private
PK�|[/�c���6ri/1.8/system/XSD/XSDHexBinary/cdesc-XSDHexBinary.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, HexBinaryLiteral)
full_name: XSD::XSDHexBinary
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: screen_data
- !ruby/object:RI::MethodSummary 
  name: set_encoded
- !ruby/object:RI::MethodSummary 
  name: string
name: XSDHexBinary
superclass: XSDAnySimpleType
PK�|[@).�ZZ.ri/1.8/system/XSD/XSDFloat/cdesc-XSDFloat.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: positive?
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, FloatLiteral)
full_name: XSD::XSDFloat
includes: 
- !ruby/object:RI::IncludedModule 
  name: FloatConstants
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _to_s
- !ruby/object:RI::MethodSummary 
  name: narrow32bit
- !ruby/object:RI::MethodSummary 
  name: screen_data
name: XSDFloat
superclass: XSDAnySimpleType
PK�|[laku��-ri/1.8/system/XSD/XSDFloat/positive%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDFloat::positive?
is_singleton: true
name: positive?
params: (value)
visibility: private
PK�|['���'ri/1.8/system/XSD/XSDFloat/_to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDFloat#_to_s
is_singleton: false
name: _to_s
params: ()
visibility: private
PK�|[�M!��%ri/1.8/system/XSD/XSDFloat/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDFloat::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[#i㈽�-ri/1.8/system/XSD/XSDFloat/screen_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDFloat#screen_data
is_singleton: false
name: screen_data
params: (value)
visibility: private
PK�|[Yp�z-ri/1.8/system/XSD/XSDFloat/narrow32bit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert to single-precision 32-bit floating point value.
full_name: XSD::XSDFloat#narrow32bit
is_singleton: false
name: narrow32bit
params: (f)
visibility: private
PK�|[)�Pƌ�0ri/1.8/system/XSD/XSDAnyURI/cdesc-XSDAnyURI.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, AnyURILiteral)
full_name: XSD::XSDAnyURI
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: screen_data
name: XSDAnyURI
superclass: XSDAnySimpleType
PK�|[���&ri/1.8/system/XSD/XSDAnyURI/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDAnyURI::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[)����.ri/1.8/system/XSD/XSDAnyURI/screen_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDAnyURI#screen_data
is_singleton: false
name: screen_data
params: (value)
visibility: private
PK�|[/�!�--4ri/1.8/system/XSD/XSDDateTime/cdesc-XSDDateTime.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, DateTimeLiteral)
full_name: XSD::XSDDateTime
includes: 
- !ruby/object:RI::IncludedModule 
  name: XSDDateTimeImpl
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _set
- !ruby/object:RI::MethodSummary 
  name: _to_s
- !ruby/object:RI::MethodSummary 
  name: screen_data_str
name: XSDDateTime
superclass: XSDAnySimpleType
PK�|[�"_���*ri/1.8/system/XSD/XSDDateTime/_to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDateTime#_to_s
is_singleton: false
name: _to_s
params: ()
visibility: private
PK�|[E�l���(ri/1.8/system/XSD/XSDDateTime/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDateTime::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[`Ѵ���4ri/1.8/system/XSD/XSDDateTime/screen_data_str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDateTime#screen_data_str
is_singleton: false
name: screen_data_str
params: (t)
visibility: private
PK�|[;f���)ri/1.8/system/XSD/XSDDateTime/_set-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDateTime#_set
is_singleton: false
name: _set
params: (data)
visibility: private
PK�|[&}���8ri/1.8/system/XSD/CodeGen/CommentDef/dump_comment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::CommentDef#dump_comment
is_singleton: false
name: dump_comment
params: ()
visibility: private
PK�|[�vN�pp:ri/1.8/system/XSD/CodeGen/CommentDef/cdesc-CommentDef.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: comment
  rw: RW
class_methods: []

comment: 
constants: []

full_name: XSD::CodeGen::CommentDef
includes: 
- !ruby/object:RI::IncludedModule 
  name: GenSupport
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: dump_comment
name: CommentDef
superclass: 
PK�|[n�V���8ri/1.8/system/XSD/CodeGen/GenSupport/uncapitalize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::GenSupport#uncapitalize
is_singleton: false
name: uncapitalize
params: (target)
visibility: public
PK�|[#�4���1ri/1.8/system/XSD/CodeGen/GenSupport/untab-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::GenSupport#untab
is_singleton: false
name: untab
params: (line, ts = 8)
visibility: private
PK�|[ ����7ri/1.8/system/XSD/CodeGen/GenSupport/trim_indent-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::GenSupport#trim_indent
is_singleton: false
name: trim_indent
params: (str)
visibility: private
PK�|[��$��:ri/1.8/system/XSD/CodeGen/GenSupport/safevarname%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::GenSupport#safevarname?
is_singleton: false
name: safevarname?
params: (name)
visibility: public
PK�|[g�G��7ri/1.8/system/XSD/CodeGen/GenSupport/safevarname-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::GenSupport#safevarname
is_singleton: false
name: safevarname
params: (name)
visibility: public
PK�|[�#[���6ri/1.8/system/XSD/CodeGen/GenSupport/capitalize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::GenSupport#capitalize
is_singleton: false
name: capitalize
params: (target)
visibility: public
PK�|[�,�)��9ri/1.8/system/XSD/CodeGen/GenSupport/safeconstname-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::GenSupport#safeconstname
is_singleton: false
name: safeconstname
params: (name)
visibility: public
PK�|[��Y��:ri/1.8/system/XSD/CodeGen/GenSupport/safemethodname-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::GenSupport#safemethodname
is_singleton: false
name: safemethodname
params: (name)
visibility: public
PK�|[
ό*��=ri/1.8/system/XSD/CodeGen/GenSupport/safemethodname%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::GenSupport#safemethodname?
is_singleton: false
name: safemethodname?
params: (name)
visibility: public
PK�|[`�����2ri/1.8/system/XSD/CodeGen/GenSupport/format-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::GenSupport#format
is_singleton: false
name: format
params: (str, indent = nil)
visibility: public
PK�|[�ݜB��:ri/1.8/system/XSD/CodeGen/GenSupport/dump_emptyline-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::GenSupport#dump_emptyline
is_singleton: false
name: dump_emptyline
params: ()
visibility: private
PK�|[���:��:ri/1.8/system/XSD/CodeGen/GenSupport/cdesc-GenSupport.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XSD::CodeGen::GenSupport
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: capitalize
- !ruby/object:RI::MethodSummary 
  name: dump_emptyline
- !ruby/object:RI::MethodSummary 
  name: format
- !ruby/object:RI::MethodSummary 
  name: keyword?
- !ruby/object:RI::MethodSummary 
  name: safeconstname
- !ruby/object:RI::MethodSummary 
  name: safeconstname?
- !ruby/object:RI::MethodSummary 
  name: safemethodname
- !ruby/object:RI::MethodSummary 
  name: safemethodname?
- !ruby/object:RI::MethodSummary 
  name: safevarname
- !ruby/object:RI::MethodSummary 
  name: safevarname?
- !ruby/object:RI::MethodSummary 
  name: trim_eol
- !ruby/object:RI::MethodSummary 
  name: trim_indent
- !ruby/object:RI::MethodSummary 
  name: uncapitalize
- !ruby/object:RI::MethodSummary 
  name: untab
name: GenSupport
superclass: 
PK�|[��X��6ri/1.8/system/XSD/CodeGen/GenSupport/keyword%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::GenSupport#keyword?
is_singleton: false
name: keyword?
params: (word)
visibility: public
PK�|[֧1���<ri/1.8/system/XSD/CodeGen/GenSupport/safeconstname%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::GenSupport#safeconstname?
is_singleton: false
name: safeconstname?
params: (name)
visibility: public
PK�|[�,���4ri/1.8/system/XSD/CodeGen/GenSupport/trim_eol-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::GenSupport#trim_eol
is_singleton: false
name: trim_eol
params: (str)
visibility: private
PK�|[�8��GG,ri/1.8/system/XSD/CodeGen/cdesc-CodeGen.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: from the file 'keywords' in 1.9.
  name: KEYWORD
  value: "{}"
full_name: XSD::CodeGen
includes: []

instance_methods: []

name: CodeGen
superclass: 
PK�|[P��Z��8ri/1.8/system/XSD/CodeGen/ClassDef/dump_class_def-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ClassDef#dump_class_def
is_singleton: false
name: dump_class_def
params: ()
visibility: private
PK�|[��&��7ri/1.8/system/XSD/CodeGen/ClassDef/dump_accessor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ClassDef#dump_accessor
is_singleton: false
name: dump_accessor
params: (attrname, writable)
visibility: private
PK�|[�����7ri/1.8/system/XSD/CodeGen/ClassDef/dump_classvar-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ClassDef#dump_classvar
is_singleton: false
name: dump_classvar
params: ()
visibility: private
PK�|[�4d���-ri/1.8/system/XSD/CodeGen/ClassDef/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ClassDef::new
is_singleton: true
name: new
params: (name, baseclass = nil)
visibility: public
PK�|[
g�|��6ri/1.8/system/XSD/CodeGen/ClassDef/def_classvar-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ClassDef#def_classvar
is_singleton: false
name: def_classvar
params: (var, value)
visibility: public
PK�|[�9M?6ri/1.8/system/XSD/CodeGen/ClassDef/cdesc-ClassDef.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: XSD::CodeGen::ClassDef
includes: 
- !ruby/object:RI::IncludedModule 
  name: GenSupport
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: def_attr
- !ruby/object:RI::MethodSummary 
  name: def_classvar
- !ruby/object:RI::MethodSummary 
  name: dump
- !ruby/object:RI::MethodSummary 
  name: dump_accessor
- !ruby/object:RI::MethodSummary 
  name: dump_attribute
- !ruby/object:RI::MethodSummary 
  name: dump_attributes
- !ruby/object:RI::MethodSummary 
  name: dump_class_def
- !ruby/object:RI::MethodSummary 
  name: dump_class_def_end
- !ruby/object:RI::MethodSummary 
  name: dump_classvar
name: ClassDef
superclass: ModuleDef
PK�|[9�3��<ri/1.8/system/XSD/CodeGen/ClassDef/dump_class_def_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ClassDef#dump_class_def_end
is_singleton: false
name: dump_class_def_end
params: ()
visibility: private
PK�|[�<����9ri/1.8/system/XSD/CodeGen/ClassDef/dump_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ClassDef#dump_attributes
is_singleton: false
name: dump_attributes
params: ()
visibility: private
PK�|[��1��2ri/1.8/system/XSD/CodeGen/ClassDef/def_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ClassDef#def_attr
is_singleton: false
name: def_attr
params: (attrname, writable = true, varname = nil)
visibility: public
PK�|[,�	��.ri/1.8/system/XSD/CodeGen/ClassDef/dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ClassDef#dump
is_singleton: false
name: dump
params: ()
visibility: public
PK�|[�һ���8ri/1.8/system/XSD/CodeGen/ClassDef/dump_attribute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ClassDef#dump_attribute
is_singleton: false
name: dump_attribute
params: (attrname, writable, varname)
visibility: private
PK�|[Ӯ����;ri/1.8/system/XSD/CodeGen/ModuleDef/dump_package_def-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ModuleDef#dump_package_def
is_singleton: false
name: dump_package_def
params: (package)
visibility: private
PK�|[���4ri/1.8/system/XSD/CodeGen/ModuleDef/def_const-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ModuleDef#def_const
is_singleton: false
name: def_const
params: (const, value)
visibility: public
PK�|[ܘBG��5ri/1.8/system/XSD/CodeGen/ModuleDef/dump_const-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ModuleDef#dump_const
is_singleton: false
name: dump_const
params: ()
visibility: private
PK�|[Q��8��4ri/1.8/system/XSD/CodeGen/ModuleDef/dump_code-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ModuleDef#dump_code
is_singleton: false
name: dump_code
params: ()
visibility: private
PK�|[UԿ��?ri/1.8/system/XSD/CodeGen/ModuleDef/dump_package_def_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ModuleDef#dump_package_def_end
is_singleton: false
name: dump_package_def_end
params: (package)
visibility: private
PK�|[ZZ���>ri/1.8/system/XSD/CodeGen/ModuleDef/dump_module_def_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ModuleDef#dump_module_def_end
is_singleton: false
name: dump_module_def_end
params: ()
visibility: private
PK�|[LӴ�;ri/1.8/system/XSD/CodeGen/ModuleDef/def_publicmethod-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #def_method"
full_name: XSD::CodeGen::ModuleDef#def_publicmethod
is_singleton: false
name: def_publicmethod
params: (name, *params)
visibility: public
PK�|[�ҕ�<ri/1.8/system/XSD/CodeGen/ModuleDef/def_privatemethod-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: if block_given?
comment: 
full_name: XSD::CodeGen::ModuleDef#def_privatemethod
is_singleton: false
name: def_privatemethod
params: (name, *params) {|if block_given?| ...}
visibility: public
PK�|[lQ����6ri/1.8/system/XSD/CodeGen/ModuleDef/def_require-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ModuleDef#def_require
is_singleton: false
name: def_require
params: (path)
visibility: public
PK�|[\~��8ri/1.8/system/XSD/CodeGen/ModuleDef/cdesc-ModuleDef.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: XSD::CodeGen::ModuleDef
includes: 
- !ruby/object:RI::IncludedModule 
  name: GenSupport
- !ruby/object:RI::IncludedModule 
  name: CommentDef
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_method
- !ruby/object:RI::MethodSummary 
  name: def_code
- !ruby/object:RI::MethodSummary 
  name: def_const
- !ruby/object:RI::MethodSummary 
  name: def_method
- !ruby/object:RI::MethodSummary 
  name: def_privatemethod
- !ruby/object:RI::MethodSummary 
  name: def_protectedmethod
- !ruby/object:RI::MethodSummary 
  name: def_publicmethod
- !ruby/object:RI::MethodSummary 
  name: def_require
- !ruby/object:RI::MethodSummary 
  name: dump
- !ruby/object:RI::MethodSummary 
  name: dump_code
- !ruby/object:RI::MethodSummary 
  name: dump_const
- !ruby/object:RI::MethodSummary 
  name: dump_methods
- !ruby/object:RI::MethodSummary 
  name: dump_module_def
- !ruby/object:RI::MethodSummary 
  name: dump_module_def_end
- !ruby/object:RI::MethodSummary 
  name: dump_package_def
- !ruby/object:RI::MethodSummary 
  name: dump_package_def_end
- !ruby/object:RI::MethodSummary 
  name: dump_requirepath
- !ruby/object:RI::MethodSummary 
  name: dump_static
- !ruby/object:RI::MethodSummary 
  name: dump_value
name: ModuleDef
superclass: Object
PK�|[9��5ri/1.8/system/XSD/CodeGen/ModuleDef/dump_value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ModuleDef#dump_value
is_singleton: false
name: dump_value
params: (value)
visibility: private
PK�|[��Y''5ri/1.8/system/XSD/CodeGen/ModuleDef/def_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: def_publicmethod
block_params: if block_given?
comment: 
full_name: XSD::CodeGen::ModuleDef#def_method
is_singleton: false
name: def_method
params: (name, *params) {|if block_given?| ...}
visibility: public
PK�|[����.ri/1.8/system/XSD/CodeGen/ModuleDef/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ModuleDef::new
is_singleton: true
name: new
params: (name)
visibility: public
PK�|[CS��>ri/1.8/system/XSD/CodeGen/ModuleDef/def_protectedmethod-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: if block_given?
comment: 
full_name: XSD::CodeGen::ModuleDef#def_protectedmethod
is_singleton: false
name: def_protectedmethod
params: (name, *params) {|if block_given?| ...}
visibility: public
PK�|[�����6ri/1.8/system/XSD/CodeGen/ModuleDef/dump_static-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ModuleDef#dump_static
is_singleton: false
name: dump_static
params: (str)
visibility: private
PK�|[�c\��7ri/1.8/system/XSD/CodeGen/ModuleDef/dump_methods-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ModuleDef#dump_methods
is_singleton: false
name: dump_methods
params: ()
visibility: private
PK�|[�^i��;ri/1.8/system/XSD/CodeGen/ModuleDef/dump_requirepath-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ModuleDef#dump_requirepath
is_singleton: false
name: dump_requirepath
params: ()
visibility: private
PK�|[w�H���3ri/1.8/system/XSD/CodeGen/ModuleDef/def_code-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ModuleDef#def_code
is_singleton: false
name: def_code
params: (code)
visibility: public
PK�|[�k.߳�/ri/1.8/system/XSD/CodeGen/ModuleDef/dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ModuleDef#dump
is_singleton: false
name: dump
params: ()
visibility: public
PK�|[f�v��:ri/1.8/system/XSD/CodeGen/ModuleDef/dump_module_def-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ModuleDef#dump_module_def
is_singleton: false
name: dump_module_def
params: ()
visibility: private
PK�|[��T��5ri/1.8/system/XSD/CodeGen/ModuleDef/add_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::ModuleDef#add_method
is_singleton: false
name: add_method
params: (m, visibility = :public)
visibility: public
PK�|[H�����>ri/1.8/system/XSD/CodeGen/MethodDef/dump_method_def_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::MethodDef#dump_method_def_end
is_singleton: false
name: dump_method_def_end
params: ()
visibility: private
PK�|[|�J��.ri/1.8/system/XSD/CodeGen/MethodDef/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: if block_given?
comment: 
full_name: XSD::CodeGen::MethodDef::new
is_singleton: true
name: new
params: (name, *params) {|if block_given?| ...}
visibility: public
PK�|[^�2?��:ri/1.8/system/XSD/CodeGen/MethodDef/dump_definition-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::MethodDef#dump_definition
is_singleton: false
name: dump_definition
params: ()
visibility: private
PK�|[��Wt��8ri/1.8/system/XSD/CodeGen/MethodDef/cdesc-MethodDef.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: definition
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: XSD::CodeGen::MethodDef
includes: 
- !ruby/object:RI::IncludedModule 
  name: GenSupport
- !ruby/object:RI::IncludedModule 
  name: CommentDef
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: dump
- !ruby/object:RI::MethodSummary 
  name: dump_definition
- !ruby/object:RI::MethodSummary 
  name: dump_method_def
- !ruby/object:RI::MethodSummary 
  name: dump_method_def_end
name: MethodDef
superclass: Object
PK�|[��v��/ri/1.8/system/XSD/CodeGen/MethodDef/dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::MethodDef#dump
is_singleton: false
name: dump
params: ()
visibility: public
PK�|[Oq1$��:ri/1.8/system/XSD/CodeGen/MethodDef/dump_method_def-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::CodeGen::MethodDef#dump_method_def
is_singleton: false
name: dump_method_def
params: ()
visibility: private
PK�|[���f��/ri/1.8/system/XSD/XSDNegativeInteger/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDNegativeInteger::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[P
����8ri/1.8/system/XSD/XSDNegativeInteger/mininclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDNegativeInteger#mininclusive
is_singleton: false
name: mininclusive
params: ()
visibility: private
PK�|[0����Bri/1.8/system/XSD/XSDNegativeInteger/cdesc-XSDNegativeInteger.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, NegativeIntegerLiteral)
full_name: XSD::XSDNegativeInteger
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maxinclusive
- !ruby/object:RI::MethodSummary 
  name: mininclusive
name: XSDNegativeInteger
superclass: XSDNonPositiveInteger
PK�|[�x;���8ri/1.8/system/XSD/XSDNegativeInteger/maxinclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDNegativeInteger#maxinclusive
is_singleton: false
name: maxinclusive
params: ()
visibility: private
PK�|[�tsө�%ri/1.8/system/XSD/QName/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::QName#eql?
is_singleton: false
name: eql?
params: (rhs)
visibility: public
PK�|[A(}�55(ri/1.8/system/XSD/QName/cdesc-QName.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: namespace
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: source
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: NormalizedNameRegexp
  value: /^\{([^}]*)\}(.*)$/
- !ruby/object:RI::Constant 
  comment: 
  name: EMPTY
  value: QName.new.freeze
full_name: XSD::QName
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: ===
- !ruby/object:RI::MethodSummary 
  name: dump
- !ruby/object:RI::MethodSummary 
  name: dup_name
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: match
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: to_s
name: QName
superclass: Object
PK�|[���;��'ri/1.8/system/XSD/QName/dup_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::QName#dup_name
is_singleton: false
name: dup_name
params: (name)
visibility: public
PK�|[�H!O��#ri/1.8/system/XSD/QName/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::QName#hash
is_singleton: false
name: hash
params: ()
visibility: public
PK�|[�'ު��$ri/1.8/system/XSD/QName/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::QName#parse
is_singleton: false
name: parse
params: (str)
visibility: public
PK�|[='�߫�$ri/1.8/system/XSD/QName/match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::QName#match
is_singleton: false
name: match
params: (rhs)
visibility: public
PK�|[�d|+��&ri/1.8/system/XSD/QName/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::QName#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[��-���"ri/1.8/system/XSD/QName/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::QName::new
is_singleton: true
name: new
params: (namespace = nil, name = nil)
visibility: public
PK�|[J�w���(ri/1.8/system/XSD/QName/%3d%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::QName#===
is_singleton: false
name: ===
params: (rhs)
visibility: public
PK�|[�t{��#ri/1.8/system/XSD/QName/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::QName#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[?#���%ri/1.8/system/XSD/QName/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::QName#==
is_singleton: false
name: ==
params: (rhs)
visibility: public
PK�|[_Asߦ�#ri/1.8/system/XSD/QName/dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::QName#dump
is_singleton: false
name: dump
params: ()
visibility: public
PK�|[�Mdh��&ri/1.8/system/XSD/XSDGDay/_to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDGDay#_to_s
is_singleton: false
name: _to_s
params: ()
visibility: private
PK�|[.��G��,ri/1.8/system/XSD/XSDGDay/cdesc-XSDGDay.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, GDayLiteral)
full_name: XSD::XSDGDay
includes: 
- !ruby/object:RI::IncludedModule 
  name: XSDDateTimeImpl
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _to_s
- !ruby/object:RI::MethodSummary 
  name: screen_data_str
name: XSDGDay
superclass: XSDAnySimpleType
PK�|[�����$ri/1.8/system/XSD/XSDGDay/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDGDay::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[+��.��0ri/1.8/system/XSD/XSDGDay/screen_data_str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDGDay#screen_data_str
is_singleton: false
name: screen_data_str
params: (t)
visibility: private
PK�|[�7Y���Dri/1.8/system/XSD/XSDNormalizedString/cdesc-XSDNormalizedString.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Derived types
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, NormalizedStringLiteral)
full_name: XSD::XSDNormalizedString
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: screen_data
name: XSDNormalizedString
superclass: XSDString
PK�|[`2j*��0ri/1.8/system/XSD/XSDNormalizedString/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDNormalizedString::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[�Ё}��8ri/1.8/system/XSD/XSDNormalizedString/screen_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDNormalizedString#screen_data
is_singleton: false
name: screen_data
params: (value)
visibility: private
PK�|[�,|��$ri/1.8/system/XSD/XSDLong/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDLong::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[���,ri/1.8/system/XSD/XSDLong/cdesc-XSDLong.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, LongLiteral)
full_name: XSD::XSDLong
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maxinclusive
- !ruby/object:RI::MethodSummary 
  name: mininclusive
name: XSDLong
superclass: XSDInteger
PK�|[���H��-ri/1.8/system/XSD/XSDLong/mininclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDLong#mininclusive
is_singleton: false
name: mininclusive
params: ()
visibility: private
PK�|[Z�X^��-ri/1.8/system/XSD/XSDLong/maxinclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDLong#maxinclusive
is_singleton: false
name: maxinclusive
params: ()
visibility: private
PK�|[~����#ri/1.8/system/XSD/NS/compare-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NS#compare
is_singleton: false
name: compare
params: (ns, name, rhs)
visibility: public
PK�|[a�c���'ri/1.8/system/XSD/NS/assigner%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NS#assigner=
is_singleton: false
name: assigner=
params: (assigner)
visibility: protected
PK�|[����(ri/1.8/system/XSD/NS/Assigner/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NS::Assigner::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[p�ó�+ri/1.8/system/XSD/NS/Assigner/assign-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NS::Assigner#assign
is_singleton: false
name: assign
params: (ns)
visibility: public
PK�|[�w��1ri/1.8/system/XSD/NS/Assigner/cdesc-Assigner.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: XSD::NS::Assigner
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: assign
name: Assigner
superclass: Object
PK�|[#�|��"ri/1.8/system/XSD/NS/cdesc-NS.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: default_namespace
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: $1 and $2 are necessary.
  name: ParseRegexp
  value: Regexp.new('^([^:]+)(?::(.+))?$')
full_name: XSD::NS
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: assign
- !ruby/object:RI::MethodSummary 
  name: assigned?
- !ruby/object:RI::MethodSummary 
  name: assigned_tag?
- !ruby/object:RI::MethodSummary 
  name: assigner=
- !ruby/object:RI::MethodSummary 
  name: clone_ns
- !ruby/object:RI::MethodSummary 
  name: compare
- !ruby/object:RI::MethodSummary 
  name: each_ns
- !ruby/object:RI::MethodSummary 
  name: name
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: parse_local
name: NS
superclass: Object
PK�|[8��+ri/1.8/system/XSD/NS/assigned_tag%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NS#assigned_tag?
is_singleton: false
name: assigned_tag?
params: (tag)
visibility: public
PK�|[G��ʯ�'ri/1.8/system/XSD/NS/assigned%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NS#assigned?
is_singleton: false
name: assigned?
params: (ns)
visibility: public
PK�|[X1��!ri/1.8/system/XSD/NS/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NS#parse
is_singleton: false
name: parse
params: (str, local = false)
visibility: public
PK�|[x�%���$ri/1.8/system/XSD/NS/clone_ns-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NS#clone_ns
is_singleton: false
name: clone_ns
params: ()
visibility: public
PK�|[	�>��7ri/1.8/system/XSD/NS/FormatError/cdesc-FormatError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XSD::NS::FormatError
includes: []

instance_methods: []

name: FormatError
superclass: Error
PK�|[1�����ri/1.8/system/XSD/NS/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NS::new
is_singleton: true
name: new
params: (tag2ns = {})
visibility: public
PK�|[���"ri/1.8/system/XSD/NS/assign-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NS#assign
is_singleton: false
name: assign
params: (ns, tag = nil)
visibility: public
PK�|[%<�:��'ri/1.8/system/XSD/NS/parse_local-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: For local attribute key parsing
- !ruby/struct:SM::Flow::VERB 
  body: "  &lt;foo xmlns=&quot;urn:a&quot; xmlns:n1=&quot;urn:a&quot; bar=&quot;1&quot; n1:baz=&quot;2&quot; /&gt;\n    =&gt;\n  {}bar, {urn:a}baz\n"
full_name: XSD::NS#parse_local
is_singleton: false
name: parse_local
params: (elem)
visibility: public
PK�|[�8h��#ri/1.8/system/XSD/NS/each_ns-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (ns, tag)
comment: 
full_name: XSD::NS#each_ns
is_singleton: false
name: each_ns
params: () {|ns, tag| ...}
visibility: public
PK�|[ʫ�֧� ri/1.8/system/XSD/NS/name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NS#name
is_singleton: false
name: name
params: (name)
visibility: public
PK�|[�D����(ri/1.8/system/XSD/Error/cdesc-Error.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XSD::Error
includes: []

instance_methods: []

name: Error
superclass: StandardError
PK�|[������<ri/1.8/system/XSD/XSDUnsignedLong/cdesc-XSDUnsignedLong.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, UnsignedLongLiteral)
full_name: XSD::XSDUnsignedLong
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maxinclusive
- !ruby/object:RI::MethodSummary 
  name: mininclusive
name: XSDUnsignedLong
superclass: XSDNonNegativeInteger
PK�|[�a�ܹ�,ri/1.8/system/XSD/XSDUnsignedLong/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDUnsignedLong::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[
-�'��5ri/1.8/system/XSD/XSDUnsignedLong/mininclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDUnsignedLong#mininclusive
is_singleton: false
name: mininclusive
params: ()
visibility: private
PK�|[�_]1��5ri/1.8/system/XSD/XSDUnsignedLong/maxinclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDUnsignedLong#maxinclusive
is_singleton: false
name: maxinclusive
params: ()
visibility: private
PK�|[���&ri/1.8/system/XSD/XSDDate/_to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDate#_to_s
is_singleton: false
name: _to_s
params: ()
visibility: private
PK�|[����$ri/1.8/system/XSD/XSDDate/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDate::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[�ƩQ��0ri/1.8/system/XSD/XSDDate/screen_data_str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDate#screen_data_str
is_singleton: false
name: screen_data_str
params: (t)
visibility: private
PK�|[����,ri/1.8/system/XSD/XSDDate/cdesc-XSDDate.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, DateLiteral)
full_name: XSD::XSDDate
includes: 
- !ruby/object:RI::IncludedModule 
  name: XSDDateTimeImpl
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _to_s
- !ruby/object:RI::MethodSummary 
  name: screen_data_str
name: XSDDate
superclass: XSDAnySimpleType
PK�|[�w����,ri/1.8/system/XSD/XSDByte/cdesc-XSDByte.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, ByteLiteral)
full_name: XSD::XSDByte
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maxinclusive
- !ruby/object:RI::MethodSummary 
  name: mininclusive
name: XSDByte
superclass: XSDShort
PK�|[q��a��$ri/1.8/system/XSD/XSDByte/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDByte::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[?�߹�-ri/1.8/system/XSD/XSDByte/mininclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDByte#mininclusive
is_singleton: false
name: mininclusive
params: ()
visibility: private
PK�|[�hɹ�-ri/1.8/system/XSD/XSDByte/maxinclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDByte#maxinclusive
is_singleton: false
name: maxinclusive
params: ()
visibility: private
PK�|[{]��<ri/1.8/system/XSD/XSDBase64Binary/cdesc-XSDBase64Binary.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, Base64BinaryLiteral)
full_name: XSD::XSDBase64Binary
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: screen_data
- !ruby/object:RI::MethodSummary 
  name: set_encoded
- !ruby/object:RI::MethodSummary 
  name: string
name: XSDBase64Binary
superclass: XSDAnySimpleType
PK�|[�����/ri/1.8/system/XSD/XSDBase64Binary/string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDBase64Binary#string
is_singleton: false
name: string
params: ()
visibility: public
PK�|[��w��4ri/1.8/system/XSD/XSDBase64Binary/set_encoded-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDBase64Binary#set_encoded
is_singleton: false
name: set_encoded
params: (value)
visibility: public
PK�|[��"���,ri/1.8/system/XSD/XSDBase64Binary/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: String in Ruby could be a binary.
full_name: XSD::XSDBase64Binary::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[{����4ri/1.8/system/XSD/XSDBase64Binary/screen_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDBase64Binary#screen_data
is_singleton: false
name: screen_data
params: (value)
visibility: private
PK�|[��T��0ri/1.8/system/XSD/XSDGMonth/cdesc-XSDGMonth.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, GMonthLiteral)
full_name: XSD::XSDGMonth
includes: 
- !ruby/object:RI::IncludedModule 
  name: XSDDateTimeImpl
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _to_s
- !ruby/object:RI::MethodSummary 
  name: screen_data_str
name: XSDGMonth
superclass: XSDAnySimpleType
PK�|[:Rq߭�(ri/1.8/system/XSD/XSDGMonth/_to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDGMonth#_to_s
is_singleton: false
name: _to_s
params: ()
visibility: private
PK�|[�dz��&ri/1.8/system/XSD/XSDGMonth/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDGMonth::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[o����2ri/1.8/system/XSD/XSDGMonth/screen_data_str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDGMonth#screen_data_str
is_singleton: false
name: screen_data_str
params: (t)
visibility: private
PK�|[#n���-ri/1.8/system/XSD/XSDUnsignedShort/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDUnsignedShort::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[(�@��>ri/1.8/system/XSD/XSDUnsignedShort/cdesc-XSDUnsignedShort.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, UnsignedShortLiteral)
full_name: XSD::XSDUnsignedShort
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maxinclusive
- !ruby/object:RI::MethodSummary 
  name: mininclusive
name: XSDUnsignedShort
superclass: XSDUnsignedInt
PK�|[ژ��6ri/1.8/system/XSD/XSDUnsignedShort/mininclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDUnsignedShort#mininclusive
is_singleton: false
name: mininclusive
params: ()
visibility: private
PK�|[:���6ri/1.8/system/XSD/XSDUnsignedShort/maxinclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDUnsignedShort#maxinclusive
is_singleton: false
name: maxinclusive
params: ()
visibility: private
PK�|[|����(ri/1.8/system/XSD/Mapping/obj2xml-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::Mapping::obj2xml
is_singleton: true
name: obj2xml
params: (obj, elename = nil, io = nil)
visibility: public
PK�|[W�����(ri/1.8/system/XSD/Mapping/xml2obj-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::Mapping::xml2obj
is_singleton: true
name: xml2obj
params: (stream)
visibility: public
PK�|[)K�,ri/1.8/system/XSD/Mapping/cdesc-Mapping.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: obj2xml
- !ruby/object:RI::MethodSummary 
  name: xml2obj
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: MappingRegistry
  value: SOAP::Mapping::WSDLLiteralRegistry.new
- !ruby/object:RI::Constant 
  comment: 
  name: MappingOpt
  value: "{:default_encodingstyle => SOAP::LiteralNamespace}"
full_name: XSD::Mapping
includes: []

instance_methods: []

name: Mapping
superclass: 
PK�|[^
�y�� ri/1.8/system/XSD/cdesc-XSD.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: This program is copyrighted free software by NAKAMURA, Hiroshi. You can redistribute it and/or modify it under the same terms of Ruby's license; either the dual license version in 2003, or any later version.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Namespace
  value: "'http://www.w3.org/2001/XMLSchema'"
- !ruby/object:RI::Constant 
  comment: 
  name: InstanceNamespace
  value: "'http://www.w3.org/2001/XMLSchema-instance'"
- !ruby/object:RI::Constant 
  comment: 
  name: AttrType
  value: "'type'"
- !ruby/object:RI::Constant 
  comment: 
  name: NilValue
  value: "'true'"
- !ruby/object:RI::Constant 
  comment: 
  name: AnyTypeLiteral
  value: "'anyType'"
- !ruby/object:RI::Constant 
  comment: 
  name: AnySimpleTypeLiteral
  value: "'anySimpleType'"
- !ruby/object:RI::Constant 
  comment: 
  name: NilLiteral
  value: "'nil'"
- !ruby/object:RI::Constant 
  comment: 
  name: StringLiteral
  value: "'string'"
- !ruby/object:RI::Constant 
  comment: 
  name: BooleanLiteral
  value: "'boolean'"
- !ruby/object:RI::Constant 
  comment: 
  name: DecimalLiteral
  value: "'decimal'"
- !ruby/object:RI::Constant 
  comment: 
  name: FloatLiteral
  value: "'float'"
- !ruby/object:RI::Constant 
  comment: 
  name: DoubleLiteral
  value: "'double'"
- !ruby/object:RI::Constant 
  comment: 
  name: DurationLiteral
  value: "'duration'"
- !ruby/object:RI::Constant 
  comment: 
  name: DateTimeLiteral
  value: "'dateTime'"
- !ruby/object:RI::Constant 
  comment: 
  name: TimeLiteral
  value: "'time'"
- !ruby/object:RI::Constant 
  comment: 
  name: DateLiteral
  value: "'date'"
- !ruby/object:RI::Constant 
  comment: 
  name: GYearMonthLiteral
  value: "'gYearMonth'"
- !ruby/object:RI::Constant 
  comment: 
  name: GYearLiteral
  value: "'gYear'"
- !ruby/object:RI::Constant 
  comment: 
  name: GMonthDayLiteral
  value: "'gMonthDay'"
- !ruby/object:RI::Constant 
  comment: 
  name: GDayLiteral
  value: "'gDay'"
- !ruby/object:RI::Constant 
  comment: 
  name: GMonthLiteral
  value: "'gMonth'"
- !ruby/object:RI::Constant 
  comment: 
  name: HexBinaryLiteral
  value: "'hexBinary'"
- !ruby/object:RI::Constant 
  comment: 
  name: Base64BinaryLiteral
  value: "'base64Binary'"
- !ruby/object:RI::Constant 
  comment: 
  name: AnyURILiteral
  value: "'anyURI'"
- !ruby/object:RI::Constant 
  comment: 
  name: QNameLiteral
  value: "'QName'"
- !ruby/object:RI::Constant 
  comment: 
  name: NormalizedStringLiteral
  value: "'normalizedString'"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: 3.3.2 token 3.3.3 language 3.3.4 NMTOKEN 3.3.5 NMTOKENS 3.3.6 Name 3.3.7 NCName 3.3.8 ID 3.3.9 IDREF 3.3.10 IDREFS 3.3.11 ENTITY 3.3.12 ENTITIES
  name: IntegerLiteral
  value: "'integer'"
- !ruby/object:RI::Constant 
  comment: 
  name: NonPositiveIntegerLiteral
  value: "'nonPositiveInteger'"
- !ruby/object:RI::Constant 
  comment: 
  name: NegativeIntegerLiteral
  value: "'negativeInteger'"
- !ruby/object:RI::Constant 
  comment: 
  name: LongLiteral
  value: "'long'"
- !ruby/object:RI::Constant 
  comment: 
  name: IntLiteral
  value: "'int'"
- !ruby/object:RI::Constant 
  comment: 
  name: ShortLiteral
  value: "'short'"
- !ruby/object:RI::Constant 
  comment: 
  name: ByteLiteral
  value: "'byte'"
- !ruby/object:RI::Constant 
  comment: 
  name: NonNegativeIntegerLiteral
  value: "'nonNegativeInteger'"
- !ruby/object:RI::Constant 
  comment: 
  name: UnsignedLongLiteral
  value: "'unsignedLong'"
- !ruby/object:RI::Constant 
  comment: 
  name: UnsignedIntLiteral
  value: "'unsignedInt'"
- !ruby/object:RI::Constant 
  comment: 
  name: UnsignedShortLiteral
  value: "'unsignedShort'"
- !ruby/object:RI::Constant 
  comment: 
  name: UnsignedByteLiteral
  value: "'unsignedByte'"
- !ruby/object:RI::Constant 
  comment: 
  name: PositiveIntegerLiteral
  value: "'positiveInteger'"
- !ruby/object:RI::Constant 
  comment: 
  name: AttrTypeName
  value: QName.new(InstanceNamespace, AttrType)
- !ruby/object:RI::Constant 
  comment: 
  name: AttrNilName
  value: QName.new(InstanceNamespace, NilLiteral)
- !ruby/object:RI::Constant 
  comment: 
  name: AnyTypeName
  value: QName.new(Namespace, AnyTypeLiteral)
- !ruby/object:RI::Constant 
  comment: 
  name: AnySimpleTypeName
  value: QName.new(Namespace, AnySimpleTypeLiteral)
full_name: XSD
includes: []

instance_methods: []

name: XSD
superclass: 
PK�|[��%ri/1.8/system/XSD/NSDBase/init-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NSDBase#init
is_singleton: false
name: init
params: (type)
visibility: public
PK�|[n��$ri/1.8/system/XSD/NSDBase/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NSDBase::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[���,ri/1.8/system/XSD/NSDBase/cdesc-NSDBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: type
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: inherited
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: types
comment: 
- !ruby/struct:SM::Flow::P 
  body: The base class of all datatypes with Namespace.
constants: []

full_name: XSD::NSDBase
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: init
name: NSDBase
superclass: Object
PK�|[\s���&ri/1.8/system/XSD/NSDBase/types-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NSDBase::types
is_singleton: true
name: types
params: ()
visibility: public
PK�|[Z~G	��*ri/1.8/system/XSD/NSDBase/inherited-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::NSDBase::inherited
is_singleton: true
name: inherited
params: (klass)
visibility: public
PK�|[$&T��<ri/1.8/system/XSD/XSDDateTimeImpl/cdesc-XSDDateTimeImpl.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: SecInDay
  value: "86400"
full_name: XSD::XSDDateTimeImpl
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_tz
- !ruby/object:RI::MethodSummary 
  name: of2tz
- !ruby/object:RI::MethodSummary 
  name: screen_data
- !ruby/object:RI::MethodSummary 
  name: to_date
- !ruby/object:RI::MethodSummary 
  name: to_datetime
- !ruby/object:RI::MethodSummary 
  name: to_obj
- !ruby/object:RI::MethodSummary 
  name: to_time
- !ruby/object:RI::MethodSummary 
  name: tz2of
name: XSDDateTimeImpl
superclass: 
PK�|[h�匾�4ri/1.8/system/XSD/XSDDateTimeImpl/to_datetime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDateTimeImpl#to_datetime
is_singleton: false
name: to_datetime
params: ()
visibility: public
PK�|[D���.ri/1.8/system/XSD/XSDDateTimeImpl/of2tz-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDateTimeImpl#of2tz
is_singleton: false
name: of2tz
params: (offset)
visibility: public
PK�|[�Z:���/ri/1.8/system/XSD/XSDDateTimeImpl/add_tz-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDateTimeImpl#add_tz
is_singleton: false
name: add_tz
params: (s)
visibility: public
PK�|[�4���0ri/1.8/system/XSD/XSDDateTimeImpl/to_time-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDateTimeImpl#to_time
is_singleton: false
name: to_time
params: ()
visibility: public
PK�|[�H�w��/ri/1.8/system/XSD/XSDDateTimeImpl/to_obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDateTimeImpl#to_obj
is_singleton: false
name: to_obj
params: (klass)
visibility: public
PK�|[�b���0ri/1.8/system/XSD/XSDDateTimeImpl/to_date-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDateTimeImpl#to_date
is_singleton: false
name: to_date
params: ()
visibility: public
PK�|[�E�ӿ�4ri/1.8/system/XSD/XSDDateTimeImpl/screen_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDateTimeImpl#screen_data
is_singleton: false
name: screen_data
params: (t)
visibility: public
PK�|[xL���.ri/1.8/system/XSD/XSDDateTimeImpl/tz2of-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDateTimeImpl#tz2of
is_singleton: false
name: tz2of
params: (str)
visibility: public
PK�|[ipU��2ri/1.8/system/XSD/XSDNonNegativeInteger/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDNonNegativeInteger::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[���\��Hri/1.8/system/XSD/XSDNonNegativeInteger/cdesc-XSDNonNegativeInteger.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, NonNegativeIntegerLiteral)
full_name: XSD::XSDNonNegativeInteger
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maxinclusive
- !ruby/object:RI::MethodSummary 
  name: mininclusive
name: XSDNonNegativeInteger
superclass: XSDInteger
PK�|[CY���;ri/1.8/system/XSD/XSDNonNegativeInteger/mininclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDNonNegativeInteger#mininclusive
is_singleton: false
name: mininclusive
params: ()
visibility: private
PK�|[�1����;ri/1.8/system/XSD/XSDNonNegativeInteger/maxinclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDNonNegativeInteger#maxinclusive
is_singleton: false
name: maxinclusive
params: ()
visibility: private
PK�|[�/���2ri/1.8/system/XSD/XSDNonPositiveInteger/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDNonPositiveInteger::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[�U,u��;ri/1.8/system/XSD/XSDNonPositiveInteger/mininclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDNonPositiveInteger#mininclusive
is_singleton: false
name: mininclusive
params: ()
visibility: private
PK�|['�c��;ri/1.8/system/XSD/XSDNonPositiveInteger/maxinclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDNonPositiveInteger#maxinclusive
is_singleton: false
name: maxinclusive
params: ()
visibility: private
PK�|[f����Hri/1.8/system/XSD/XSDNonPositiveInteger/cdesc-XSDNonPositiveInteger.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, NonPositiveIntegerLiteral)
full_name: XSD::XSDNonPositiveInteger
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maxinclusive
- !ruby/object:RI::MethodSummary 
  name: mininclusive
name: XSDNonPositiveInteger
superclass: XSDInteger
PK�|[�����0ri/1.8/system/XSD/XSDString/cdesc-XSDString.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Primitive datatypes.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, StringLiteral)
full_name: XSD::XSDString
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: screen_data
name: XSDString
superclass: XSDAnySimpleType
PK�|[fR3���&ri/1.8/system/XSD/XSDString/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDString::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[Y-^Y��.ri/1.8/system/XSD/XSDString/screen_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDString#screen_data
is_singleton: false
name: screen_data
params: (value)
visibility: private
PK�|[�y8��<ri/1.8/system/XSD/ValueSpaceError/cdesc-ValueSpaceError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XSD::ValueSpaceError
includes: []

instance_methods: []

name: ValueSpaceError
superclass: Error
PK�|[�腑��%ri/1.8/system/XSD/Charset/init-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::Charset::init
is_singleton: true
name: init
params: ()
visibility: public
PK�|[?��!��,ri/1.8/system/XSD/Charset/encoding%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::Charset::encoding=
is_singleton: true
name: encoding=
params: (encoding)
visibility: public
PK�|[�\}V��,ri/1.8/system/XSD/Charset/cdesc-Charset.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: charset_label
- !ruby/object:RI::MethodSummary 
  name: charset_str
- !ruby/object:RI::MethodSummary 
  name: encoding
- !ruby/object:RI::MethodSummary 
  name: encoding=
- !ruby/object:RI::MethodSummary 
  name: encoding_conv
- !ruby/object:RI::MethodSummary 
  name: encoding_from_xml
- !ruby/object:RI::MethodSummary 
  name: encoding_to_xml
- !ruby/object:RI::MethodSummary 
  name: init
- !ruby/object:RI::MethodSummary 
  name: is_ces
- !ruby/object:RI::MethodSummary 
  name: is_euc
- !ruby/object:RI::MethodSummary 
  name: is_sjis
- !ruby/object:RI::MethodSummary 
  name: is_us_ascii
- !ruby/object:RI::MethodSummary 
  name: is_utf8
- !ruby/object:RI::MethodSummary 
  name: xml_encoding_label
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Maps
  name: EncodingConvertMap
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  name: CharsetMap
  value: "{     'NONE' => 'us-ascii',     'EUC' => 'euc-jp',     'SJIS' => 'shift_jis',     'UTF8' => 'utf-8',     'X_ISO_8859_1' => 'iso-8859-1',     'X_UNKNOWN' => nil,   }"
- !ruby/object:RI::Constant 
  comment: 
  name: USASCIIRegexp
  value: Regexp.new("\\A#{us_ascii}*\\z", nil, "NONE")
- !ruby/object:RI::Constant 
  comment: 
  name: EUCRegexp
  value: Regexp.new("\\A#{character_euc}*\\z", nil, "NONE")
- !ruby/object:RI::Constant 
  comment: 
  name: SJISRegexp
  value: Regexp.new("\\A#{character_sjis}*\\z", nil, "NONE")
- !ruby/object:RI::Constant 
  comment: 
  name: UTF8Regexp
  value: Regexp.new("\\A#{character_utf8}*\\z", nil, "NONE")
full_name: XSD::Charset
includes: []

instance_methods: []

name: Charset
superclass: 
PK�|[V1d���Rri/1.8/system/XSD/Charset/CharsetConversionError/cdesc-CharsetConversionError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XSD::Charset::CharsetConversionError
includes: []

instance_methods: []

name: CharsetConversionError
superclass: CharsetError
PK�|[@�1���(ri/1.8/system/XSD/Charset/is_sjis-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::Charset::is_sjis
is_singleton: true
name: is_sjis
params: (str)
visibility: public
PK�|[�=���,ri/1.8/system/XSD/Charset/is_us_ascii-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::Charset::is_us_ascii
is_singleton: true
name: is_us_ascii
params: (str)
visibility: public
PK�|[a����.ri/1.8/system/XSD/Charset/charset_label-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::Charset::charset_label
is_singleton: true
name: charset_label
params: (encoding)
visibility: public
PK�|[7`���'ri/1.8/system/XSD/Charset/is_euc-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::Charset::is_euc
is_singleton: true
name: is_euc
params: (str)
visibility: public
PK�|[�*$��.ri/1.8/system/XSD/Charset/encoding_conv-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::Charset::encoding_conv
is_singleton: true
name: encoding_conv
params: (str, enc_from, enc_to)
visibility: public
PK�|[�CZ9��'ri/1.8/system/XSD/Charset/is_ces-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::Charset::is_ces
is_singleton: true
name: is_ces
params: (str, code = $KCODE)
visibility: public
PK�|[�oVG��6ri/1.8/system/XSD/Charset/XSDError/cdesc-XSDError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XSD::Charset::XSDError
includes: []

instance_methods: []

name: XSDError
superclass: StandardError
PK�|[��k���0ri/1.8/system/XSD/Charset/encoding_to_xml-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::Charset::encoding_to_xml
is_singleton: true
name: encoding_to_xml
params: (str, charset)
visibility: public
PK�|[=L��,ri/1.8/system/XSD/Charset/charset_str-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::Charset::charset_str
is_singleton: true
name: charset_str
params: (label)
visibility: public
PK�|[{���Lri/1.8/system/XSD/Charset/UnknownCharsetError/cdesc-UnknownCharsetError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XSD::Charset::UnknownCharsetError
includes: []

instance_methods: []

name: UnknownCharsetError
superclass: CharsetError
PK�|[/�A��(ri/1.8/system/XSD/Charset/is_utf8-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::Charset::is_utf8
is_singleton: true
name: is_utf8
params: (str)
visibility: public
PK�|[J�Pj��>ri/1.8/system/XSD/Charset/CharsetError/cdesc-CharsetError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XSD::Charset::CharsetError
includes: []

instance_methods: []

name: CharsetError
superclass: XSDError
PK�|[������3ri/1.8/system/XSD/Charset/xml_encoding_label-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::Charset::xml_encoding_label
is_singleton: true
name: xml_encoding_label
params: ()
visibility: public
PK�|[ѡ����2ri/1.8/system/XSD/Charset/encoding_from_xml-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::Charset::encoding_from_xml
is_singleton: true
name: encoding_from_xml
params: (str, charset)
visibility: public
PK�|[�4���)ri/1.8/system/XSD/Charset/encoding-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: handlers
full_name: XSD::Charset::encoding
is_singleton: true
name: encoding
params: ()
visibility: public
PK�|[A@�m��.ri/1.8/system/XSD/XSDGYear/cdesc-XSDGYear.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, GYearLiteral)
full_name: XSD::XSDGYear
includes: 
- !ruby/object:RI::IncludedModule 
  name: XSDDateTimeImpl
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _to_s
- !ruby/object:RI::MethodSummary 
  name: screen_data_str
name: XSDGYear
superclass: XSDAnySimpleType
PK�|[#]H���'ri/1.8/system/XSD/XSDGYear/_to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDGYear#_to_s
is_singleton: false
name: _to_s
params: ()
visibility: private
PK�|[n�vG��%ri/1.8/system/XSD/XSDGYear/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDGYear::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[��_��1ri/1.8/system/XSD/XSDGYear/screen_data_str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDGYear#screen_data_str
is_singleton: false
name: screen_data_str
params: (t)
visibility: private
PK�|[#U®�)ri/1.8/system/XSD/XSDInteger/_to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDInteger#_to_s
is_singleton: false
name: _to_s
params: ()
visibility: private
PK�|[
�����,ri/1.8/system/XSD/XSDInteger/positive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDInteger#positive
is_singleton: false
name: positive
params: (v)
visibility: private
PK�|[$z�+��'ri/1.8/system/XSD/XSDInteger/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDInteger::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[�c�Q��3ri/1.8/system/XSD/XSDInteger/screen_data_str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDInteger#screen_data_str
is_singleton: false
name: screen_data_str
params: (str)
visibility: private
PK�|[z$=���,ri/1.8/system/XSD/XSDInteger/validate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDInteger#validate
is_singleton: false
name: validate
params: (v)
visibility: private
PK�|[�#��0ri/1.8/system/XSD/XSDInteger/mininclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDInteger#mininclusive
is_singleton: false
name: mininclusive
params: ()
visibility: private
PK�|[�����0ri/1.8/system/XSD/XSDInteger/maxinclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDInteger#maxinclusive
is_singleton: false
name: maxinclusive
params: ()
visibility: private
PK�|[ ��P2ri/1.8/system/XSD/XSDInteger/cdesc-XSDInteger.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, IntegerLiteral)
- !ruby/object:RI::Constant 
  comment: 
  name: PositiveMinInclusive
  value: "1"
full_name: XSD::XSDInteger
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _set
- !ruby/object:RI::MethodSummary 
  name: _to_s
- !ruby/object:RI::MethodSummary 
  name: maxinclusive
- !ruby/object:RI::MethodSummary 
  name: mininclusive
- !ruby/object:RI::MethodSummary 
  name: positive
- !ruby/object:RI::MethodSummary 
  name: screen_data_str
- !ruby/object:RI::MethodSummary 
  name: validate
name: XSDInteger
superclass: XSDDecimal
PK�|[������(ri/1.8/system/XSD/XSDInteger/_set-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDInteger#_set
is_singleton: false
name: _set
params: (value)
visibility: private
PK�|[O�^&��.ri/1.8/system/XSD/XSDShort/cdesc-XSDShort.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, ShortLiteral)
full_name: XSD::XSDShort
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maxinclusive
- !ruby/object:RI::MethodSummary 
  name: mininclusive
name: XSDShort
superclass: XSDInt
PK�|[�1�=��%ri/1.8/system/XSD/XSDShort/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDShort::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[�.ú�.ri/1.8/system/XSD/XSDShort/mininclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDShort#mininclusive
is_singleton: false
name: mininclusive
params: ()
visibility: private
PK�|[H\�պ�.ri/1.8/system/XSD/XSDShort/maxinclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDShort#maxinclusive
is_singleton: false
name: maxinclusive
params: ()
visibility: private
PK�|[�F���*ri/1.8/system/XSD/XSDDuration/_to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDuration#_to_s
is_singleton: false
name: _to_s
params: ()
visibility: private
PK�|[�p���4ri/1.8/system/XSD/XSDDuration/cdesc-XSDDuration.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: day
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: hour
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: min
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: month
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: sec
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: sign
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: year
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, DurationLiteral)
full_name: XSD::XSDDuration
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _set
- !ruby/object:RI::MethodSummary 
  name: _to_s
- !ruby/object:RI::MethodSummary 
  name: screen_data
name: XSDDuration
superclass: XSDAnySimpleType
PK�|[^�f��(ri/1.8/system/XSD/XSDDuration/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDuration::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[\NT���0ri/1.8/system/XSD/XSDDuration/screen_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDuration#screen_data
is_singleton: false
name: screen_data
params: (value)
visibility: private
PK�|[�w�i��)ri/1.8/system/XSD/XSDDuration/_set-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDuration#_set
is_singleton: false
name: _set
params: (data)
visibility: private
PK�|[)r����Bri/1.8/system/XSD/XSDPositiveInteger/cdesc-XSDPositiveInteger.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, PositiveIntegerLiteral)
full_name: XSD::XSDPositiveInteger
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maxinclusive
- !ruby/object:RI::MethodSummary 
  name: mininclusive
name: XSDPositiveInteger
superclass: XSDNonNegativeInteger
PK�|[X�����/ri/1.8/system/XSD/XSDPositiveInteger/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDPositiveInteger::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[��D��8ri/1.8/system/XSD/XSDPositiveInteger/mininclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDPositiveInteger#mininclusive
is_singleton: false
name: mininclusive
params: ()
visibility: private
PK�|[RnNR��8ri/1.8/system/XSD/XSDPositiveInteger/maxinclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDPositiveInteger#maxinclusive
is_singleton: false
name: maxinclusive
params: ()
visibility: private
PK�|[�IR��&ri/1.8/system/XSD/XSDTime/_to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDTime#_to_s
is_singleton: false
name: _to_s
params: ()
visibility: private
PK�|[o�P�!!,ri/1.8/system/XSD/XSDTime/cdesc-XSDTime.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, TimeLiteral)
full_name: XSD::XSDTime
includes: 
- !ruby/object:RI::IncludedModule 
  name: XSDDateTimeImpl
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _set
- !ruby/object:RI::MethodSummary 
  name: _to_s
- !ruby/object:RI::MethodSummary 
  name: screen_data_str
name: XSDTime
superclass: XSDAnySimpleType
PK�|[����$ri/1.8/system/XSD/XSDTime/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDTime::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[C�����0ri/1.8/system/XSD/XSDTime/screen_data_str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDTime#screen_data_str
is_singleton: false
name: screen_data_str
params: (t)
visibility: private
PK�|[E����%ri/1.8/system/XSD/XSDTime/_set-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDTime#_set
is_singleton: false
name: _set
params: (data)
visibility: private
PK�|[��(��6ri/1.8/system/XSD/IconvCharset/cdesc-IconvCharset.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: safe_iconv
comment: 
constants: []

full_name: XSD::IconvCharset
includes: []

instance_methods: []

name: IconvCharset
superclass: Object
PK�|[<�;+��0ri/1.8/system/XSD/IconvCharset/safe_iconv-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::IconvCharset::safe_iconv
is_singleton: true
name: safe_iconv
params: (to, from, str)
visibility: public
PK�|[�c�+��*ri/1.8/system/XSD/XSDInt/cdesc-XSDInt.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, IntLiteral)
full_name: XSD::XSDInt
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maxinclusive
- !ruby/object:RI::MethodSummary 
  name: mininclusive
name: XSDInt
superclass: XSDLong
PK�|[�
7
��#ri/1.8/system/XSD/XSDInt/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDInt::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[�~Nz��,ri/1.8/system/XSD/XSDInt/mininclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDInt#mininclusive
is_singleton: false
name: mininclusive
params: ()
visibility: private
PK�|[�l��,ri/1.8/system/XSD/XSDInt/maxinclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDInt#maxinclusive
is_singleton: false
name: maxinclusive
params: ()
visibility: private
PK�|[�9��,ri/1.8/system/XSD/XSDGYearMonth/_to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDGYearMonth#_to_s
is_singleton: false
name: _to_s
params: ()
visibility: private
PK�|[��-ҷ�*ri/1.8/system/XSD/XSDGYearMonth/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDGYearMonth::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[�+8ri/1.8/system/XSD/XSDGYearMonth/cdesc-XSDGYearMonth.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, GYearMonthLiteral)
full_name: XSD::XSDGYearMonth
includes: 
- !ruby/object:RI::IncludedModule 
  name: XSDDateTimeImpl
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _to_s
- !ruby/object:RI::MethodSummary 
  name: screen_data_str
name: XSDGYearMonth
superclass: XSDAnySimpleType
PK�|[N�����6ri/1.8/system/XSD/XSDGYearMonth/screen_data_str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDGYearMonth#screen_data_str
is_singleton: false
name: screen_data_str
params: (t)
visibility: private
PK�|[އ���)ri/1.8/system/XSD/XSDDecimal/_to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: 0.0 -&gt; 0; right?
full_name: XSD::XSDDecimal#_to_s
is_singleton: false
name: _to_s
params: ()
visibility: private
PK�|[��P�[[2ri/1.8/system/XSD/XSDDecimal/cdesc-XSDDecimal.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, DecimalLiteral)
full_name: XSD::XSDDecimal
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _set
- !ruby/object:RI::MethodSummary 
  name: _to_s
- !ruby/object:RI::MethodSummary 
  name: nonzero?
- !ruby/object:RI::MethodSummary 
  name: screen_data
- !ruby/object:RI::MethodSummary 
  name: screen_data_str
name: XSDDecimal
superclass: XSDAnySimpleType
PK�|[ؚKS��.ri/1.8/system/XSD/XSDDecimal/nonzero%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDecimal#nonzero?
is_singleton: false
name: nonzero?
params: ()
visibility: public
PK�|[>@�F��'ri/1.8/system/XSD/XSDDecimal/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDecimal::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[Ec��/ri/1.8/system/XSD/XSDDecimal/screen_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDecimal#screen_data
is_singleton: false
name: screen_data
params: (d)
visibility: private
PK�|[���z��3ri/1.8/system/XSD/XSDDecimal/screen_data_str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDecimal#screen_data_str
is_singleton: false
name: screen_data_str
params: (str)
visibility: private
PK�|[�3���(ri/1.8/system/XSD/XSDDecimal/_set-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDecimal#_set
is_singleton: false
name: _set
params: (data)
visibility: private
PK�|[�����+ri/1.8/system/XSD/XSDGMonthDay/_to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDGMonthDay#_to_s
is_singleton: false
name: _to_s
params: ()
visibility: private
PK�|[:ü���)ri/1.8/system/XSD/XSDGMonthDay/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDGMonthDay::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[D:JD��5ri/1.8/system/XSD/XSDGMonthDay/screen_data_str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDGMonthDay#screen_data_str
is_singleton: false
name: screen_data_str
params: (t)
visibility: private
PK�|[MT��6ri/1.8/system/XSD/XSDGMonthDay/cdesc-XSDGMonthDay.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, GMonthDayLiteral)
full_name: XSD::XSDGMonthDay
includes: 
- !ruby/object:RI::IncludedModule 
  name: XSDDateTimeImpl
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _to_s
- !ruby/object:RI::MethodSummary 
  name: screen_data_str
name: XSDGMonthDay
superclass: XSDAnySimpleType
PK�|[�u���'ri/1.8/system/XSD/XSDQName/_to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDQName#_to_s
is_singleton: false
name: _to_s
params: ()
visibility: private
PK�|[�lc��%ri/1.8/system/XSD/XSDQName/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDQName::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[�q�`��-ri/1.8/system/XSD/XSDQName/screen_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDQName#screen_data
is_singleton: false
name: screen_data
params: (value)
visibility: private
PK�|[,��p��.ri/1.8/system/XSD/XSDQName/cdesc-XSDQName.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, QNameLiteral)
full_name: XSD::XSDQName
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _set
- !ruby/object:RI::MethodSummary 
  name: _to_s
- !ruby/object:RI::MethodSummary 
  name: screen_data
name: XSDQName
superclass: XSDAnySimpleType
PK�|[����&ri/1.8/system/XSD/XSDQName/_set-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDQName#_set
is_singleton: false
name: _set
params: (data)
visibility: private
PK�|[�qP��,ri/1.8/system/XSD/XSDUnsignedByte/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDUnsignedByte::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[$k���<ri/1.8/system/XSD/XSDUnsignedByte/cdesc-XSDUnsignedByte.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, UnsignedByteLiteral)
full_name: XSD::XSDUnsignedByte
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maxinclusive
- !ruby/object:RI::MethodSummary 
  name: mininclusive
name: XSDUnsignedByte
superclass: XSDUnsignedShort
PK�|[�䢰��5ri/1.8/system/XSD/XSDUnsignedByte/mininclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDUnsignedByte#mininclusive
is_singleton: false
name: mininclusive
params: ()
visibility: private
PK�|[o�	���5ri/1.8/system/XSD/XSDUnsignedByte/maxinclusive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDUnsignedByte#maxinclusive
is_singleton: false
name: maxinclusive
params: ()
visibility: private
PK�|[/���:ri/1.8/system/XSD/FloatConstants/cdesc-FloatConstants.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: NaN
  value: 0.0/0.0
- !ruby/object:RI::Constant 
  comment: 
  name: POSITIVE_INF
  value: +1.0/0.0
- !ruby/object:RI::Constant 
  comment: 
  name: NEGATIVE_INF
  value: -1.0/0.0
- !ruby/object:RI::Constant 
  comment: 
  name: POSITIVE_ZERO
  value: +1.0/POSITIVE_INF
- !ruby/object:RI::Constant 
  comment: 
  name: NEGATIVE_ZERO
  value: -1.0/POSITIVE_INF
- !ruby/object:RI::Constant 
  comment: 
  name: MIN_POSITIVE_SINGLE
  value: 2.0 ** -149
full_name: XSD::FloatConstants
includes: []

instance_methods: []

name: FloatConstants
superclass: 
PK�|[
6W@��(ri/1.8/system/XSD/XSDDouble/_to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDouble#_to_s
is_singleton: false
name: _to_s
params: ()
visibility: private
PK�|[�ۺa��&ri/1.8/system/XSD/XSDDouble/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDouble::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[�8����.ri/1.8/system/XSD/XSDDouble/screen_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XSD::XSDDouble#screen_data
is_singleton: false
name: screen_data
params: (value)
visibility: private
PK�|[�c�UU0ri/1.8/system/XSD/XSDDouble/cdesc-XSDDouble.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Ruby's Float is double-precision 64-bit floating point value.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(Namespace, DoubleLiteral)
full_name: XSD::XSDDouble
includes: 
- !ruby/object:RI::IncludedModule 
  name: FloatConstants
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _to_s
- !ruby/object:RI::MethodSummary 
  name: screen_data
name: XSDDouble
superclass: XSDAnySimpleType
PK�|[~�k:;;.ri/1.8/system/Profiler__/cdesc-Profiler__.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: PROFILE_PROC
  value: proc{|event, file, line, id, binding, klass|     case event
full_name: Profiler__
includes: []

instance_methods: []

name: Profiler__
superclass: 
PK�|[ (]66ri/1.8/system/CGI/out-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: Print an HTTP header and body to $DEFAULT_OUTPUT ($&gt;)
- !ruby/struct:SM::Flow::P 
  body: "The header is provided by <tt>options</tt>, as for #header(). The body of the document is that returned by the passed- in block. This block takes no arguments. It is required."
- !ruby/struct:SM::Flow::VERB 
  body: "  cgi = CGI.new\n  cgi.out{ &quot;string&quot; }\n    # Content-Type: text/html\n    # Content-Length: 6\n    #\n    # string\n\n  cgi.out(&quot;text/plain&quot;) { &quot;string&quot; }\n    # Content-Type: text/plain\n    # Content-Length: 6\n    #\n    # string\n\n  cgi.out(&quot;nph&quot;        =&gt; true,\n          &quot;status&quot;     =&gt; &quot;OK&quot;,  # == &quot;200 OK&quot;\n          &quot;server&quot;     =&gt; ENV['SERVER_SOFTWARE'],\n          &quot;connection&quot; =&gt; &quot;close&quot;,\n          &quot;type&quot;       =&gt; &quot;text/html&quot;,\n          &quot;charset&quot;    =&gt; &quot;iso-2022-jp&quot;,\n            # Content-Type: text/html; charset=iso-2022-jp\n          &quot;language&quot;   =&gt; &quot;ja&quot;,\n          &quot;expires&quot;    =&gt; Time.now + (3600 * 24 * 30),\n          &quot;cookie&quot;     =&gt; [cookie1, cookie2],\n          &quot;my_header1&quot; =&gt; &quot;my_value&quot;,\n          &quot;my_header2&quot; =&gt; &quot;my_value&quot;) { &quot;string&quot; }\n"
- !ruby/struct:SM::Flow::P 
  body: Content-Length is automatically calculated from the size of the String returned by the content block.
- !ruby/struct:SM::Flow::P 
  body: If ENV['REQUEST_METHOD'] == &quot;HEAD&quot;, then only the header is outputted (the content block is still required, but it is ignored).
- !ruby/struct:SM::Flow::P 
  body: If the charset is &quot;iso-2022-jp&quot; or &quot;euc-jp&quot; or &quot;shift_jis&quot; then the content is converted to this charset, and the language is set to &quot;ja&quot;.
full_name: CGI#out
is_singleton: false
name: out
params: (options = "text/html") {|| ...}
visibility: public
PK�|[)C2b<2<2 ri/1.8/system/CGI/cdesc-CGI.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: cookie
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: inputs
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: cookie
- !ruby/object:RI::MethodSummary 
  name: error
- !ruby/object:RI::MethodSummary 
  name: escape
- !ruby/object:RI::MethodSummary 
  name: escape
- !ruby/object:RI::MethodSummary 
  name: escapeElement
- !ruby/object:RI::MethodSummary 
  name: escapeHTML
- !ruby/object:RI::MethodSummary 
  name: escapeHTML
- !ruby/object:RI::MethodSummary 
  name: header
- !ruby/object:RI::MethodSummary 
  name: message
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: pretty
- !ruby/object:RI::MethodSummary 
  name: print
- !ruby/object:RI::MethodSummary 
  name: rfc1123_date
- !ruby/object:RI::MethodSummary 
  name: rfc1123_date
- !ruby/object:RI::MethodSummary 
  name: tag
- !ruby/object:RI::MethodSummary 
  name: unescape
- !ruby/object:RI::MethodSummary 
  name: unescape
- !ruby/object:RI::MethodSummary 
  name: unescapeElement
- !ruby/object:RI::MethodSummary 
  name: unescapeHTML
comment: 
- !ruby/struct:SM::Flow::P 
  body: CGI class. See documentation for the file cgi.rb for an overview of the CGI protocol.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Introduction
- !ruby/struct:SM::Flow::P 
  body: CGI is a large class, providing several categories of methods, many of which are mixed in from other modules. Some of the documentation is in this class, some in the modules CGI::QueryExtension and CGI::HtmlExtension. See CGI::Cookie for specific information on handling cookies, and cgi/session.rb (CGI::Session) for information on sessions.
- !ruby/struct:SM::Flow::P 
  body: For queries, CGI provides methods to get at environmental variables, parameters, cookies, and multipart request data. For responses, CGI provides methods for writing output and generating HTML.
- !ruby/struct:SM::Flow::P 
  body: Read on for more details. Examples are provided at the bottom.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Queries
- !ruby/struct:SM::Flow::P 
  body: The CGI class dynamically mixes in parameter and cookie-parsing functionality, environmental variable access, and support for parsing multipart requests (including uploaded files) from the CGI::QueryExtension module.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Environmental Variables
- !ruby/struct:SM::Flow::P 
  body: "The standard CGI environmental variables are available as read-only attributes of a CGI object. The following is a list of these variables:"
- !ruby/struct:SM::Flow::VERB 
  body: "  AUTH_TYPE               HTTP_HOST          REMOTE_IDENT\n  CONTENT_LENGTH          HTTP_NEGOTIATE     REMOTE_USER\n  CONTENT_TYPE            HTTP_PRAGMA        REQUEST_METHOD\n  GATEWAY_INTERFACE       HTTP_REFERER       SCRIPT_NAME\n  HTTP_ACCEPT             HTTP_USER_AGENT    SERVER_NAME\n  HTTP_ACCEPT_CHARSET     PATH_INFO          SERVER_PORT\n  HTTP_ACCEPT_ENCODING    PATH_TRANSLATED    SERVER_PROTOCOL\n  HTTP_ACCEPT_LANGUAGE    QUERY_STRING       SERVER_SOFTWARE\n  HTTP_CACHE_CONTROL      REMOTE_ADDR\n  HTTP_FROM               REMOTE_HOST\n"
- !ruby/struct:SM::Flow::P 
  body: For each of these variables, there is a corresponding attribute with the same name, except all lower case and without a preceding HTTP_. <tt>content_length</tt> and <tt>server_port</tt> are integers; the rest are strings.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameters
- !ruby/struct:SM::Flow::P 
  body: "The method #params() returns a hash of all parameters in the request as name/value-list pairs, where the value-list is an Array of one or more values. The CGI object itself also behaves as a hash of parameter names to values, but only returns a single value (as a String) for each parameter name."
- !ruby/struct:SM::Flow::P 
  body: "For instance, suppose the request contains the parameter &quot;favourite_colours&quot; with the multiple values &quot;blue&quot; and &quot;green&quot;. The following behaviour would occur:"
- !ruby/struct:SM::Flow::VERB 
  body: "  cgi.params[&quot;favourite_colours&quot;]  # =&gt; [&quot;blue&quot;, &quot;green&quot;]\n  cgi[&quot;favourite_colours&quot;]         # =&gt; &quot;blue&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: "If a parameter does not exist, the former method will return an empty array, the latter an empty string. The simplest way to test for existence of a parameter is by the #has_key? method."
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Cookies
- !ruby/struct:SM::Flow::P 
  body: "HTTP Cookies are automatically parsed from the request. They are available from the #cookies() accessor, which returns a hash from cookie name to CGI::Cookie object."
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Multipart requests
- !ruby/struct:SM::Flow::P 
  body: "If a request's method is POST and its content type is multipart/form-data, then it may contain uploaded files. These are stored by the QueryExtension module in the parameters of the request. The parameter name is the name attribute of the file input field, as usual. However, the value is not a string, but an IO object, either an IOString for small files, or a Tempfile for larger ones. This object also has the additional singleton methods:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "#local_path():"
    body: the path of the uploaded file on the local filesystem
  - !ruby/struct:SM::Flow::LI 
    label: "#original_filename():"
    body: the name of the file on the client computer
  - !ruby/struct:SM::Flow::LI 
    label: "#content_type():"
    body: the content type of the file
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Responses
- !ruby/struct:SM::Flow::P 
  body: The CGI class provides methods for sending header and content output to the HTTP client, and mixes in methods for programmatic HTML generation from CGI::HtmlExtension and CGI::TagMaker modules. The precise version of HTML to use for HTML generation is specified at object creation time.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Writing output
- !ruby/struct:SM::Flow::P 
  body: "The simplest way to send output to the HTTP client is using the #out() method. This takes the HTTP headers as a hash parameter, and the body content via a block. The headers can be generated as a string using the #header() method. The output stream can be written directly to using the #print() method."
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Generating HTML
- !ruby/struct:SM::Flow::P 
  body: Each HTML element has a corresponding method for generating that element as a String. The name of this method is the same as that of the element, all lowercase. The attributes of the element are passed in as a hash, and the body as a no-argument block that evaluates to a String. The HTML generation module knows which elements are always empty, and silently drops any passed-in body. It also knows which elements require matching closing tags and which don't. However, it does not know what attributes are legal for which elements.
- !ruby/struct:SM::Flow::P 
  body: There are also some additional HTML generation methods mixed in from the CGI::HtmlExtension module. These include individual methods for the different types of form inputs, and methods for elements that commonly take particular attributes where the attributes can be directly specified as arguments, rather than via a hash.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Examples of use
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Get form values
- !ruby/struct:SM::Flow::VERB 
  body: "  require &quot;cgi&quot;\n  cgi = CGI.new\n  value = cgi['field_name']   # &lt;== value string for 'field_name'\n    # if not 'field_name' included, then return &quot;&quot;.\n  fields = cgi.keys            # &lt;== array of field names\n\n  # returns true if form has 'field_name'\n  cgi.has_key?('field_name')\n  cgi.has_key?('field_name')\n  cgi.include?('field_name')\n"
- !ruby/struct:SM::Flow::P 
  body: CAUTION! cgi['field_name'] returned an Array with the old cgi.rb(included in ruby 1.6)
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Get form values as hash
- !ruby/struct:SM::Flow::VERB 
  body: "  require &quot;cgi&quot;\n  cgi = CGI.new\n  params = cgi.params\n"
- !ruby/struct:SM::Flow::P 
  body: cgi.params is a hash.
- !ruby/struct:SM::Flow::VERB 
  body: "  cgi.params['new_field_name'] = [&quot;value&quot;]  # add new param\n  cgi.params['field_name'] = [&quot;new_value&quot;]  # change value\n  cgi.params.delete('field_name')           # delete param\n  cgi.params.clear                          # delete all params\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Save form values to file
- !ruby/struct:SM::Flow::VERB 
  body: "  require &quot;pstore&quot;\n  db = PStore.new(&quot;query.db&quot;)\n  db.transaction do\n    db[&quot;params&quot;] = cgi.params\n  end\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Restore form values from file
- !ruby/struct:SM::Flow::VERB 
  body: "  require &quot;pstore&quot;\n  db = PStore.new(&quot;query.db&quot;)\n  db.transaction do\n    cgi.params = db[&quot;params&quot;]\n  end\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Get multipart form values
- !ruby/struct:SM::Flow::VERB 
  body: "  require &quot;cgi&quot;\n  cgi = CGI.new\n  value = cgi['field_name']   # &lt;== value string for 'field_name'\n  value.read                  # &lt;== body of value\n  value.local_path            # &lt;== path to local file of value\n  value.original_filename     # &lt;== original filename of value\n  value.content_type          # &lt;== content_type of value\n"
- !ruby/struct:SM::Flow::P 
  body: and value has StringIO or Tempfile class methods.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Get cookie values
- !ruby/struct:SM::Flow::VERB 
  body: "  require &quot;cgi&quot;\n  cgi = CGI.new\n  values = cgi.cookies['name']  # &lt;== array of 'name'\n    # if not 'name' included, then return [].\n  names = cgi.cookies.keys      # &lt;== array of cookie names\n"
- !ruby/struct:SM::Flow::P 
  body: and cgi.cookies is a hash.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Get cookie objects
- !ruby/struct:SM::Flow::VERB 
  body: "  require &quot;cgi&quot;\n  cgi = CGI.new\n  for name, cookie in cgi.cookies\n    cookie.expires = Time.now + 30\n  end\n  cgi.out(&quot;cookie&quot; =&gt; cgi.cookies) {&quot;string&quot;}\n\n  cgi.cookies # { &quot;name1&quot; =&gt; cookie1, &quot;name2&quot; =&gt; cookie2, ... }\n\n  require &quot;cgi&quot;\n  cgi = CGI.new\n  cgi.cookies['name'].expires = Time.now + 30\n  cgi.out(&quot;cookie&quot; =&gt; cgi.cookies['name']) {&quot;string&quot;}\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Print http header and html string to $DEFAULT_OUTPUT ($&gt;)
- !ruby/struct:SM::Flow::VERB 
  body: "  require &quot;cgi&quot;\n  cgi = CGI.new(&quot;html3&quot;)  # add HTML generation methods\n  cgi.out() do\n    cgi.html() do\n      cgi.head{ cgi.title{&quot;TITLE&quot;} } +\n      cgi.body() do\n        cgi.form() do\n          cgi.textarea(&quot;get_text&quot;) +\n          cgi.br +\n          cgi.submit\n        end +\n        cgi.pre() do\n          CGI::escapeHTML(\n            &quot;params: &quot; + cgi.params.inspect + &quot;\\n&quot; +\n            &quot;cookies: &quot; + cgi.cookies.inspect + &quot;\\n&quot; +\n            ENV.collect() do |key, value|\n              key + &quot; --&gt; &quot; + value + &quot;\\n&quot;\n            end.join(&quot;&quot;)\n          )\n        end\n      end\n    end\n  end\n\n  # add HTML generation methods\n  CGI.new(&quot;html3&quot;)    # html3.2\n  CGI.new(&quot;html4&quot;)    # html4.01 (Strict)\n  CGI.new(&quot;html4Tr&quot;)  # html4.01 Transitional\n  CGI.new(&quot;html4Fr&quot;)  # html4.01 Frameset\n"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: CR
  value: "\"\\015\""
- !ruby/object:RI::Constant 
  comment: 
  name: LF
  value: "\"\\012\""
- !ruby/object:RI::Constant 
  comment: 
  name: EOL
  value: CR + LF
- !ruby/object:RI::Constant 
  comment: 
  name: RFC822_DAYS
  value: "%w[ Sun Mon Tue Wed Thu Fri Sat ]"
- !ruby/object:RI::Constant 
  comment: 
  name: RFC822_MONTHS
  value: "%w[ Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ]"
full_name: CGI
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: env_table
- !ruby/object:RI::MethodSummary 
  name: header
- !ruby/object:RI::MethodSummary 
  name: out
- !ruby/object:RI::MethodSummary 
  name: print
- !ruby/object:RI::MethodSummary 
  name: read_from_cmdline
- !ruby/object:RI::MethodSummary 
  name: stdinput
- !ruby/object:RI::MethodSummary 
  name: stdoutput
name: CGI
superclass: Object
PK�|[�T	��ri/1.8/system/CGI/print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Print an argument or list of arguments to the default output stream
- !ruby/struct:SM::Flow::VERB 
  body: "  cgi = CGI.new\n  cgi.print    # default:  cgi.print == $DEFAULT_OUTPUT.print\n"
full_name: CGI#print
is_singleton: false
name: print
params: (*options)
visibility: public
PK�|[��J}��!ri/1.8/system/CGI/unescape-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: unescape url encoded
full_name: CGI::unescape
is_singleton: true
name: unescape
params: (str)
visibility: public
PK�|[f�(ri/1.8/system/CGI/Html3/cdesc-Html3.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Mixin module for HTML version 3 generation methods.
constants: []

full_name: CGI::Html3
includes: []

instance_methods: []

name: Html3
superclass: 
PK�|[�8����ri/1.8/system/CGI/error-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: print error message to $&gt; and exit
full_name: CGI::error
is_singleton: true
name: error
params: ()
visibility: public
PK�|[��H�(ri/1.8/system/CGI/unescapeElement-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Undo escaping such as that done by CGI::escapeElement()
- !ruby/struct:SM::Flow::VERB 
  body: "  print CGI::unescapeElement(\n          CGI::escapeHTML('&lt;BR&gt;&lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;'), &quot;A&quot;, &quot;IMG&quot;)\n    # &quot;&amp;lt;BR&amp;gt;&lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;&quot;\n\n  print CGI::unescapeElement(\n          CGI::escapeHTML('&lt;BR&gt;&lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;'), [&quot;A&quot;, &quot;IMG&quot;])\n    # &quot;&amp;lt;BR&amp;gt;&lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;&quot;\n"
full_name: CGI::unescapeElement
is_singleton: true
name: unescapeElement
params: (string, *elements)
visibility: public
PK�|[������ri/1.8/system/CGI/header-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: make HTTP header string
full_name: CGI::header
is_singleton: true
name: header
params: (*options)
visibility: public
PK�|[u!�Y,ri/1.8/system/CGI/Html4Tr/cdesc-Html4Tr.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Mixin module for HTML version 4 transitional generation methods.
constants: []

full_name: CGI::Html4Tr
includes: []

instance_methods: []

name: Html4Tr
superclass: 
PK�|[�
u,ri/1.8/system/CGI/Html4Fr/cdesc-Html4Fr.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Mixin module for generating HTML version 4 with framesets.
constants: []

full_name: CGI::Html4Fr
includes: []

instance_methods: []

name: Html4Fr
superclass: 
PK�|[ՅÈ��%ri/1.8/system/CGI/rfc1123_date-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: make rfc1123 date string
full_name: CGI::rfc1123_date
is_singleton: true
name: rfc1123_date
params: (time)
visibility: public
PK�|[xז�ri/1.8/system/CGI/parse-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parse an HTTP query string into a hash of key=&gt;value pairs.
- !ruby/struct:SM::Flow::VERB 
  body: "  params = CGI::parse(&quot;query_string&quot;)\n    # {&quot;name1&quot; =&gt; [&quot;value1&quot;, &quot;value2&quot;, ...],\n    #  &quot;name2&quot; =&gt; [&quot;value1&quot;, &quot;value2&quot;, ...], ... }\n"
full_name: CGI::parse
is_singleton: true
name: parse
params: (query)
visibility: public
PK�|[�\�(ri/1.8/system/CGI/Html4/cdesc-Html4.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Mixin module for HTML version 4 generation methods.
constants: []

full_name: CGI::Html4
includes: []

instance_methods: []

name: Html4
superclass: 
PK�|[������*ri/1.8/system/CGI/Cookie/cdesc-Cookie.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: domain
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: expires
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: path
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: secure
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: value
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: parse
comment: 
- !ruby/struct:SM::Flow::P 
  body: Class representing an HTTP cookie.
- !ruby/struct:SM::Flow::P 
  body: In addition to its specific fields and methods, a Cookie instance is a delegator to the array of its values.
- !ruby/struct:SM::Flow::P 
  body: See RFC 2965.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Examples of use
- !ruby/struct:SM::Flow::VERB 
  body: "  cookie1 = CGI::Cookie::new(&quot;name&quot;, &quot;value1&quot;, &quot;value2&quot;, ...)\n  cookie1 = CGI::Cookie::new(&quot;name&quot; =&gt; &quot;name&quot;, &quot;value&quot; =&gt; &quot;value&quot;)\n  cookie1 = CGI::Cookie::new('name'    =&gt; 'name',\n                             'value'   =&gt; ['value1', 'value2', ...],\n                             'path'    =&gt; 'path',   # optional\n                             'domain'  =&gt; 'domain', # optional\n                             'expires' =&gt; Time.now, # optional\n                             'secure'  =&gt; true      # optional\n                            )\n\n  cgi.out(&quot;cookie&quot; =&gt; [cookie1, cookie2]) { &quot;string&quot; }\n\n  name    = cookie1.name\n  values  = cookie1.value\n  path    = cookie1.path\n  domain  = cookie1.domain\n  expires = cookie1.expires\n  secure  = cookie1.secure\n\n  cookie1.name    = 'name'\n  cookie1.value   = ['value1', 'value2', ...]\n  cookie1.path    = 'path'\n  cookie1.domain  = 'domain'\n  cookie1.expires = Time.now + 30\n  cookie1.secure  = true\n"
constants: []

full_name: CGI::Cookie
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: secure=
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: value=
name: Cookie
superclass: DelegateClass(Array)
PK�|[J*g��%ri/1.8/system/CGI/Cookie/parse-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parse a raw cookie string into a hash of cookie-name=&gt;Cookie pairs.
- !ruby/struct:SM::Flow::VERB 
  body: "  cookies = CGI::Cookie::parse(&quot;raw_cookie_string&quot;)\n    # { &quot;name1&quot; =&gt; cookie1, &quot;name2&quot; =&gt; cookie2, ... }\n"
full_name: CGI::Cookie::parse
is_singleton: true
name: parse
params: (raw_cookie)
visibility: public
PK�|[F�A��(ri/1.8/system/CGI/Cookie/value%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CGI::Cookie#value=
is_singleton: false
name: value=
params: (val)
visibility: public
PK�|[Lz�KJJ)ri/1.8/system/CGI/Cookie/secure%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set whether the Cookie is a secure cookie or not.
- !ruby/struct:SM::Flow::P 
  body: <tt>val</tt> must be a boolean.
full_name: CGI::Cookie#secure=
is_singleton: false
name: secure=
params: (val)
visibility: public
PK�|[�6���#ri/1.8/system/CGI/Cookie/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new CGI::Cookie object.
- !ruby/struct:SM::Flow::P 
  body: "The contents of the cookie can be specified as a <tt>name</tt> and one or more <tt>value</tt> arguments. Alternatively, the contents can be specified as a single hash argument. The possible keywords of this hash are as follows:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "name:"
    body: the name of the cookie. Required.
  - !ruby/struct:SM::Flow::LI 
    label: "value:"
    body: the cookie's value or list of values.
  - !ruby/struct:SM::Flow::LI 
    label: "path:"
    body: the path for which this cookie applies. Defaults to the base directory of the CGI script.
  - !ruby/struct:SM::Flow::LI 
    label: "domain:"
    body: the domain for which this cookie applies.
  - !ruby/struct:SM::Flow::LI 
    label: "expires:"
    body: the time at which this cookie expires, as a <tt>Time</tt> object.
  - !ruby/struct:SM::Flow::LI 
    label: "secure:"
    body: whether this cookie is a secure cookie or not (default to false). Secure cookies are only transmitted to HTTPS servers.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: These keywords correspond to attributes of the cookie object.
full_name: CGI::Cookie::new
is_singleton: true
name: new
params: (name = "", *value)
visibility: public
PK�|[��A��$ri/1.8/system/CGI/Cookie/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert the Cookie to its string representation.
full_name: CGI::Cookie#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[�e�oori/1.8/system/CGI/header-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create an HTTP header block as a string.
- !ruby/struct:SM::Flow::P 
  body: Includes the empty line that ends the header block.
- !ruby/struct:SM::Flow::P 
  body: "<tt>options</tt> can be a string specifying the Content-Type (defaults to text/html), or a hash of header key/value pairs. The following header keys are recognized:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "type:"
    body: the Content-Type header. Defaults to &quot;text/html&quot;
  - !ruby/struct:SM::Flow::LI 
    label: "charset:"
    body: the charset of the body, appended to the Content-Type header.
  - !ruby/struct:SM::Flow::LI 
    label: "nph:"
    body: a boolean value. If true, prepend protocol string and status code, and date; and sets default values for &quot;server&quot; and &quot;connection&quot; if not explicitly set.
  - !ruby/struct:SM::Flow::LI 
    label: "status:"
    body: the HTTP status code, returned as the Status header. See the list of available status codes below.
  - !ruby/struct:SM::Flow::LI 
    label: "server:"
    body: the server software, returned as the Server header.
  - !ruby/struct:SM::Flow::LI 
    label: "connection:"
    body: the connection type, returned as the Connection header (for instance, &quot;close&quot;.
  - !ruby/struct:SM::Flow::LI 
    label: "length:"
    body: the length of the content that will be sent, returned as the Content-Length header.
  - !ruby/struct:SM::Flow::LI 
    label: "language:"
    body: the language of the content, returned as the Content-Language header.
  - !ruby/struct:SM::Flow::LI 
    label: "expires:"
    body: the time on which the current content expires, as a <tt>Time</tt> object, returned as the Expires header.
  - !ruby/struct:SM::Flow::LI 
    label: "cookie:"
    body: a cookie or cookies, returned as one or more Set-Cookie headers. The value can be the literal string of the cookie; a CGI::Cookie object; an Array of literal cookie strings or Cookie objects; or a hash all of whose values are literal cookie strings or Cookie objects. These cookies are in addition to the cookies held in the @output_cookies field.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: "Other header lines can also be set; they are appended as key: value."
- !ruby/struct:SM::Flow::VERB 
  body: "  header\n    # Content-Type: text/html\n\n  header(&quot;text/plain&quot;)\n    # Content-Type: text/plain\n\n  header(&quot;nph&quot;        =&gt; true,\n         &quot;status&quot;     =&gt; &quot;OK&quot;,  # == &quot;200 OK&quot;\n           # &quot;status&quot;     =&gt; &quot;200 GOOD&quot;,\n         &quot;server&quot;     =&gt; ENV['SERVER_SOFTWARE'],\n         &quot;connection&quot; =&gt; &quot;close&quot;,\n         &quot;type&quot;       =&gt; &quot;text/html&quot;,\n         &quot;charset&quot;    =&gt; &quot;iso-2022-jp&quot;,\n           # Content-Type: text/html; charset=iso-2022-jp\n         &quot;length&quot;     =&gt; 103,\n         &quot;language&quot;   =&gt; &quot;ja&quot;,\n         &quot;expires&quot;    =&gt; Time.now + 30,\n         &quot;cookie&quot;     =&gt; [cookie1, cookie2],\n         &quot;my_header1&quot; =&gt; &quot;my_value&quot;\n         &quot;my_header2&quot; =&gt; &quot;my_value&quot;)\n"
- !ruby/struct:SM::Flow::P 
  body: "The status codes are:"
- !ruby/struct:SM::Flow::VERB 
  body: "  &quot;OK&quot;                  --&gt; &quot;200 OK&quot;\n  &quot;PARTIAL_CONTENT&quot;     --&gt; &quot;206 Partial Content&quot;\n  &quot;MULTIPLE_CHOICES&quot;    --&gt; &quot;300 Multiple Choices&quot;\n  &quot;MOVED&quot;               --&gt; &quot;301 Moved Permanently&quot;\n  &quot;REDIRECT&quot;            --&gt; &quot;302 Found&quot;\n  &quot;NOT_MODIFIED&quot;        --&gt; &quot;304 Not Modified&quot;\n  &quot;BAD_REQUEST&quot;         --&gt; &quot;400 Bad Request&quot;\n  &quot;AUTH_REQUIRED&quot;       --&gt; &quot;401 Authorization Required&quot;\n  &quot;FORBIDDEN&quot;           --&gt; &quot;403 Forbidden&quot;\n  &quot;NOT_FOUND&quot;           --&gt; &quot;404 Not Found&quot;\n  &quot;METHOD_NOT_ALLOWED&quot;  --&gt; &quot;405 Method Not Allowed&quot;\n  &quot;NOT_ACCEPTABLE&quot;      --&gt; &quot;406 Not Acceptable&quot;\n  &quot;LENGTH_REQUIRED&quot;     --&gt; &quot;411 Length Required&quot;\n  &quot;PRECONDITION_FAILED&quot; --&gt; &quot;412 Precondition Failed&quot;\n  &quot;SERVER_ERROR&quot;        --&gt; &quot;500 Internal Server Error&quot;\n  &quot;NOT_IMPLEMENTED&quot;     --&gt; &quot;501 Method Not Implemented&quot;\n  &quot;BAD_GATEWAY&quot;         --&gt; &quot;502 Bad Gateway&quot;\n  &quot;VARIANT_ALSO_VARIES&quot; --&gt; &quot;506 Variant Also Negotiates&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: This method does not perform charset conversion.
full_name: CGI#header
is_singleton: false
name: header
params: (options = "text/html")
visibility: public
PK�|[�H�*ri/1.8/system/CGI/read_from_cmdline-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: offline mode. read name=value pairs on standard input.
full_name: CGI#read_from_cmdline
is_singleton: false
name: read_from_cmdline
params: ()
visibility: public
PK�|[iI���ri/1.8/system/CGI/cookie-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: make raw cookie string
full_name: CGI::cookie
is_singleton: true
name: cookie
params: (options)
visibility: public
PK�|[:n��%ri/1.8/system/CGI/unescapeHTML-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Unescape a string that has been HTML-escaped
- !ruby/struct:SM::Flow::VERB 
  body: "  CGI::unescapeHTML(&quot;Usage: foo &amp;quot;bar&amp;quot; &amp;lt;baz&amp;gt;&quot;)\n     # =&gt; &quot;Usage: foo \\&quot;bar\\&quot; &lt;baz&gt;&quot;\n"
full_name: CGI::unescapeHTML
is_singleton: true
name: unescapeHTML
params: (string)
visibility: public
PK�|[b��ccri/1.8/system/CGI/tag-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ".to_s + \"</\" + escapeHTML(element) + \">\" : \"\")"
comment: 
- !ruby/struct:SM::Flow::P 
  body: make HTML tag string
full_name: CGI::tag
is_singleton: true
name: tag
params: "(element, attributes = {}) {|.to_s + \"</\" + escapeHTML(element) + \">\" : \"\")| ...}"
visibility: public
PK�|[�Q#�00ri/1.8/system/CGI/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new CGI instance.
- !ruby/struct:SM::Flow::P 
  body: "<tt>type</tt> specifies which version of HTML to load the HTML generation methods for. The following versions of HTML are supported:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "html3:"
    body: HTML 3.x
  - !ruby/struct:SM::Flow::LI 
    label: "html4:"
    body: HTML 4.0
  - !ruby/struct:SM::Flow::LI 
    label: "html4Tr:"
    body: HTML 4.0 Transitional
  - !ruby/struct:SM::Flow::LI 
    label: "html4Fr:"
    body: HTML 4.0 with Framesets
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: If not specified, no HTML generation methods will be loaded.
- !ruby/struct:SM::Flow::P 
  body: If the CGI object is not created in a standard CGI call environment (that is, it can't locate REQUEST_METHOD in its environment), then it will run in &quot;offline&quot; mode. In this mode, it reads its parameters from the command line or (failing that) from standard input. Otherwise, cookies and other parameters are parsed automatically from the standard CGI locations, which varies according to the REQUEST_METHOD.
full_name: CGI::new
is_singleton: true
name: new
params: (type = "query")
visibility: public
PK�|[�a�*��.ri/1.8/system/CGI/QueryExtension/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the value for the parameter with a given key.
- !ruby/struct:SM::Flow::P 
  body: "If the parameter has multiple values, only the first will be retrieved; use #params() to get the array of values."
full_name: CGI::QueryExtension#[]
is_singleton: false
name: "[]"
params: (key)
visibility: public
PK�|[�'�D��1ri/1.8/system/CGI/QueryExtension/params%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set all the parameters.
full_name: CGI::QueryExtension#params=
is_singleton: false
name: params=
params: (hash)
visibility: public
PK�|[6��*%%9ri/1.8/system/CGI/QueryExtension/read_from_cmdline-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: offline mode. read name=value pairs on standard input.
full_name: CGI::QueryExtension#read_from_cmdline
is_singleton: false
name: read_from_cmdline
params: ()
visibility: private
PK�|[ eVc��7ri/1.8/system/CGI/QueryExtension/Value/cdesc-Value.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: CGI::QueryExtension::Value
includes: []

instance_methods: []

name: Value
superclass: 
PK�|[%��KK:ri/1.8/system/CGI/QueryExtension/cdesc-QueryExtension.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Get the cookies as a hash of cookie-name=&gt;Cookie pairs.
  name: cookies
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Get the parameters as a hash of name=&gt;values pairs, where values is an Array.
  name: params
  rw: R
class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: "Mixin module. It provides the follow functionality groups:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "1."
    body: Access to CGI environment variables as methods. See documentation to the CGI class for a list of these variables.
  - !ruby/struct:SM::Flow::LI 
    label: "2."
    body: Access to cookies, including the cookies attribute.
  - !ruby/struct:SM::Flow::LI 
    label: "3."
    body: Access to parameters, including the params attribute, and overloading
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: ""
      body: to perform parameter value lookup by key.
    type: :LABELED
  - !ruby/struct:SM::Flow::LI 
    label: "4."
    body: The initialize_query method, for initialising the above mechanisms, handling multipart forms, and allowing the class to be used in &quot;offline&quot; mode.
  type: :NUMBER
constants: []

full_name: CGI::QueryExtension
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: has_key?
- !ruby/object:RI::MethodSummary 
  name: include?
- !ruby/object:RI::MethodSummary 
  name: initialize_query
- !ruby/object:RI::MethodSummary 
  name: key?
- !ruby/object:RI::MethodSummary 
  name: keys
- !ruby/object:RI::MethodSummary 
  name: multipart?
- !ruby/object:RI::MethodSummary 
  name: params=
- !ruby/object:RI::MethodSummary 
  name: raw_cookie
- !ruby/object:RI::MethodSummary 
  name: raw_cookie2
- !ruby/object:RI::MethodSummary 
  name: read_from_cmdline
- !ruby/object:RI::MethodSummary 
  name: read_multipart
name: QueryExtension
superclass: 
PK�|[f;����2ri/1.8/system/CGI/QueryExtension/include%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #has_key?"
full_name: CGI::QueryExtension#include?
is_singleton: false
name: include?
params: (*args)
visibility: public
PK�|[V*�`2ri/1.8/system/CGI/QueryExtension/raw_cookie-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the raw cookies as a string.
full_name: CGI::QueryExtension#raw_cookie
is_singleton: false
name: raw_cookie
params: ()
visibility: public
PK�|[�`Kڻ�4ri/1.8/system/CGI/QueryExtension/multipart%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CGI::QueryExtension#multipart?
is_singleton: false
name: multipart?
params: ()
visibility: public
PK�|[TQrR��8ri/1.8/system/CGI/QueryExtension/initialize_query-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Initialize the data from the query.
- !ruby/struct:SM::Flow::P 
  body: Handles multipart forms (in particular, forms that involve file uploads). Reads query parameters in the @params field, and cookies into @cookies.
full_name: CGI::QueryExtension#initialize_query
is_singleton: false
name: initialize_query
params: ()
visibility: private
PK�|[1�2���,ri/1.8/system/CGI/QueryExtension/keys-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return all parameter keys as an array.
full_name: CGI::QueryExtension#keys
is_singleton: false
name: keys
params: (*args)
visibility: public
PK�|[�s�7��6ri/1.8/system/CGI/QueryExtension/read_multipart-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CGI::QueryExtension#read_multipart
is_singleton: false
name: read_multipart
params: (boundary, content_length)
visibility: private
PK�|[��;;

3ri/1.8/system/CGI/QueryExtension/raw_cookie2-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the raw RFC2965 cookies as a string.
full_name: CGI::QueryExtension#raw_cookie2
is_singleton: false
name: raw_cookie2
params: ()
visibility: public
PK�|[Q�E���.ri/1.8/system/CGI/QueryExtension/key%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #has_key?"
full_name: CGI::QueryExtension#key?
is_singleton: false
name: key?
params: (*args)
visibility: public
PK�|[�rr2ri/1.8/system/CGI/QueryExtension/has_key%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: key?
- !ruby/object:RI::AliasName 
  name: include?
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if a given parameter key exists in the query.
full_name: CGI::QueryExtension#has_key?
is_singleton: false
name: has_key?
params: (*args)
visibility: public
PK�|[s�R�##'ri/1.8/system/CGI/Session/update-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Store session data on the server. For some session storage types, this is a no-op.
full_name: CGI::Session#update
is_singleton: false
name: update
params: ()
visibility: public
PK�|[�ķ  3ri/1.8/system/CGI/Session/MemoryStore/update-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Update session state.
- !ruby/struct:SM::Flow::P 
  body: A no-op.
full_name: CGI::Session::MemoryStore#update
is_singleton: false
name: update
params: ()
visibility: public
PK�|[���<ri/1.8/system/CGI/Session/MemoryStore/cdesc-MemoryStore.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: In-memory session storage class.
- !ruby/struct:SM::Flow::P 
  body: Implements session storage as a global in-memory hash. Session data will only persist for as long as the ruby interpreter instance does.
constants: []

full_name: CGI::Session::MemoryStore
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: restore
- !ruby/object:RI::MethodSummary 
  name: update
name: MemoryStore
superclass: Object
PK�|[I�c��3ri/1.8/system/CGI/Session/MemoryStore/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Delete the session state.
full_name: CGI::Session::MemoryStore#delete
is_singleton: false
name: delete
params: ()
visibility: public
PK�|[u�>�::4ri/1.8/system/CGI/Session/MemoryStore/restore-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Restore session state.
- !ruby/struct:SM::Flow::P 
  body: Returns session data as a hash.
full_name: CGI::Session::MemoryStore#restore
is_singleton: false
name: restore
params: ()
visibility: public
PK�|[����0ri/1.8/system/CGI/Session/MemoryStore/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new MemoryStore instance.
- !ruby/struct:SM::Flow::P 
  body: <tt>session</tt> is the session this instance is associated with. <tt>option</tt> is a list of initialisation options. None are currently recognised.
full_name: CGI::Session::MemoryStore::new
is_singleton: true
name: new
params: (session, option=nil)
visibility: public
PK�|[�uT�2ri/1.8/system/CGI/Session/MemoryStore/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Close session storage.
- !ruby/struct:SM::Flow::P 
  body: A no-op.
full_name: CGI::Session::MemoryStore#close
is_singleton: false
name: close
params: ()
visibility: public
PK�|[�Ue���'ri/1.8/system/CGI/Session/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Retrieve the session data for key <tt>key</tt>.
full_name: CGI::Session#[]
is_singleton: false
name: "[]"
params: (key)
visibility: public
PK�|[�7{�22,ri/1.8/system/CGI/Session/cdesc-Session.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The id of this session.
  name: new_session
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The id of this session.
  name: session_id
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Class representing an HTTP session. See documentation for the file cgi/session.rb for an introduction to HTTP sessions.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Lifecycle
- !ruby/struct:SM::Flow::P 
  body: "A CGI::Session instance is created from a CGI object. By default, this CGI::Session instance will start a new session if none currently exists, or continue the current session for this client if one does exist. The <tt>new_session</tt> option can be used to either always or never create a new session. See #new() for more details."
- !ruby/struct:SM::Flow::P 
  body: "#delete() deletes a session from session storage. It does not however remove the session id from the client. If the client makes another request with the same id, the effect will be to start a new session with the old session's id."
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Setting and retrieving session data.
- !ruby/struct:SM::Flow::P 
  body: The Session class associates data with a session as key-value pairs. This data can be set and retrieved by indexing the Session instance using '[]', much the same as hashes (although other hash methods are not supported).
- !ruby/struct:SM::Flow::P 
  body: When session processing has been completed for a request, the session should be closed using the close() method. This will store the session's state to persistent storage. If you want to store the session's state to persistent storage without finishing session processing for this request, call the update() method.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Storing session state
- !ruby/struct:SM::Flow::P 
  body: "The caller can specify what form of storage to use for the session's data with the <tt>database_manager</tt> option to CGI::Session::new. The following storage classes are provided as part of the standard library:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "CGI::Session::FileStore:"
    body: stores data as plain text in a flat file. Only works with String data. This is the default storage type.
  - !ruby/struct:SM::Flow::LI 
    label: "CGI::Session::MemoryStore:"
    body: stores data in an in-memory hash. The data only persists for as long as the current ruby interpreter instance does.
  - !ruby/struct:SM::Flow::LI 
    label: "CGI::Session::PStore:"
    body: stores data in Marshalled format. Provided by cgi/session/pstore.rb. Supports data of any type, and provides file-locking and transaction support.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: "Custom storage types can also be created by defining a class with the following methods:"
- !ruby/struct:SM::Flow::VERB 
  body: "   new(session, options)\n   restore  # returns hash of session data.\n   update\n   close\n   delete\n"
- !ruby/struct:SM::Flow::P 
  body: Changing storage type mid-session does not work. Note in particular that by default the FileStore and PStore session data files have the same name. If your application switches from one to the other without making sure that filenames will be different and clients still have old sessions lying around in cookies, then things will break nastily!
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Maintaining the session id.
- !ruby/struct:SM::Flow::P 
  body: Most session state is maintained on the server. However, a session id must be passed backwards and forwards between client and server to maintain a reference to this session state.
- !ruby/struct:SM::Flow::P 
  body: The simplest way to do this is via cookies. The CGI::Session class provides transparent support for session id communication via cookies if the client has cookies enabled.
- !ruby/struct:SM::Flow::P 
  body: If the client has cookies disabled, the session id must be included as a parameter of all requests sent by the client to the server. The CGI::Session class in conjunction with the CGI class will transparently add the session id as a hidden input field to all forms generated using the CGI#form() HTML generation method. No built-in support is provided for other mechanisms, such as URL re-writing. The caller is responsible for extracting the session id from the session_id attribute and manually encoding it in URLs and adding it as a hidden input to HTML forms created by other mechanisms. Also, session expiry is not automatically handled.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Examples of use
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Setting the user's name
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'cgi'\n  require 'cgi/session'\n  require 'cgi/session/pstore'     # provides CGI::Session::PStore\n\n  cgi = CGI.new(&quot;html4&quot;)\n\n  session = CGI::Session.new(cgi,\n      'database_manager' =&gt; CGI::Session::PStore,  # use PStore\n      'session_key' =&gt; '_rb_sess_id',              # custom session key\n      'session_expires' =&gt; Time.now + 30 * 60,     # 30 minute timeout\n      'prefix' =&gt; 'pstore_sid_')                   # PStore option\n  if cgi.has_key?('user_name') and cgi['user_name'] != ''\n      # coerce to String: cgi[] returns the\n      # string-like CGI::QueryExtension::Value\n      session['user_name'] = cgi['user_name'].to_s\n  elsif !session['user_name']\n      session['user_name'] = &quot;guest&quot;\n  end\n  session.close\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Creating a new session safely
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'cgi'\n  require 'cgi/session'\n\n  cgi = CGI.new(&quot;html4&quot;)\n\n  # We make sure to delete an old session if one exists,\n  # not just to free resources, but to prevent the session\n  # from being maliciously hijacked later on.\n  begin\n      session = CGI::Session.new(cgi, 'new_session' =&gt; false)\n      session.delete\n  rescue ArgumentError  # if no old session\n  end\n  session = CGI::Session.new(cgi, 'new_session' =&gt; true)\n  session.close\n"
constants: []

full_name: CGI::Session
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: create_new_id
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: update
name: Session
superclass: Object
PK�|[�����'ri/1.8/system/CGI/Session/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Delete the session from storage. Also closes the storage.
- !ruby/struct:SM::Flow::P 
  body: Note that the session's data is <em>not</em> automatically deleted upon the session expiring.
full_name: CGI::Session#delete
is_singleton: false
name: delete
params: ()
visibility: public
PK�|[��
1ri/1.8/system/CGI/Session/FileStore/update-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Save session state to the session's FileStore file.
full_name: CGI::Session::FileStore#update
is_singleton: false
name: update
params: ()
visibility: public
PK�|[��

1ri/1.8/system/CGI/Session/FileStore/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Close and delete the session's FileStore file.
full_name: CGI::Session::FileStore#delete
is_singleton: false
name: delete
params: ()
visibility: public
PK�|[�f�__2ri/1.8/system/CGI/Session/FileStore/restore-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Restore session state from the session's FileStore file.
- !ruby/struct:SM::Flow::P 
  body: Returns the session state as a hash.
full_name: CGI::Session::FileStore#restore
is_singleton: false
name: restore
params: ()
visibility: public
PK�|[$X���.ri/1.8/system/CGI/Session/FileStore/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new FileStore instance.
- !ruby/struct:SM::Flow::P 
  body: This constructor is used internally by CGI::Session. The user does not generally need to call it directly.
- !ruby/struct:SM::Flow::P 
  body: <tt>session</tt> is the session for which this instance is being created. The session id must only contain alphanumeric characters; automatically generated session ids observe this requirement.
- !ruby/struct:SM::Flow::P 
  body: "<tt>option</tt> is a hash of options for the initializer. The following options are recognised:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "tmpdir:"
    body: the directory to use for storing the FileStore file. Defaults to Dir::tmpdir (generally &quot;/tmp&quot; on Unix systems).
  - !ruby/struct:SM::Flow::LI 
    label: "prefix:"
    body: the prefix to add to the session id when generating the filename for this session's FileStore file. Defaults to the empty string.
  - !ruby/struct:SM::Flow::LI 
    label: "suffix:"
    body: the prefix to add to the session id when generating the filename for this session's FileStore file. Defaults to the empty string.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: This session's FileStore file will be created if it does not exist, or opened if it does.
full_name: CGI::Session::FileStore::new
is_singleton: true
name: new
params: (session, option={})
visibility: public
PK�|[.7<0ri/1.8/system/CGI/Session/FileStore/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Update and close the session's FileStore file.
full_name: CGI::Session::FileStore#close
is_singleton: false
name: close
params: ()
visibility: public
PK�|[��i�8ri/1.8/system/CGI/Session/FileStore/cdesc-FileStore.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: File-based session storage class.
- !ruby/struct:SM::Flow::P 
  body: Implements session storage as a flat file of 'key=value' values. This storage type only works directly with String values; the user is responsible for converting other types to Strings when storing and from Strings when retrieving.
constants: []

full_name: CGI::Session::FileStore
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: restore
- !ruby/object:RI::MethodSummary 
  name: update
name: FileStore
superclass: Object
PK�|[�a�*
*
$ri/1.8/system/CGI/Session/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new CGI::Session object for <tt>request</tt>.
- !ruby/struct:SM::Flow::P 
  body: "<tt>request</tt> is an instance of the <tt>CGI</tt> class (see cgi.rb). <tt>option</tt> is a hash of options for initialising this CGI::Session instance. The following options are recognised:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "session_key:"
    body: the parameter name used for the session id. Defaults to '_session_id'.
  - !ruby/struct:SM::Flow::LI 
    label: "session_id:"
    body: the session id to use. If not provided, then it is retrieved from the <tt>session_key</tt> parameter of the request, or automatically generated for a new session.
  - !ruby/struct:SM::Flow::LI 
    label: "new_session:"
    body: if true, force creation of a new session. If not set, a new session is only created if none currently exists. If false, a new session is never created, and if none currently exists and the <tt>session_id</tt> option is not set, an ArgumentError is raised.
  - !ruby/struct:SM::Flow::LI 
    label: "database_manager:"
    body: the name of the class providing storage facilities for session state persistence. Built-in support is provided for <tt>FileStore</tt> (the default), <tt>MemoryStore</tt>, and <tt>PStore</tt> (from cgi/session/pstore.rb). See the documentation for these classes for more details.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: The following options are also recognised, but only apply if the session id is stored in a cookie.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "session_expires:"
    body: the time the current session expires, as a <tt>Time</tt> object. If not set, the session will terminate when the user's browser is closed.
  - !ruby/struct:SM::Flow::LI 
    label: "session_domain:"
    body: the hostname domain for which this session is valid. If not set, defaults to the hostname of the server.
  - !ruby/struct:SM::Flow::LI 
    label: "session_secure:"
    body: if <tt>true</tt>, this session will only work over HTTPS.
  - !ruby/struct:SM::Flow::LI 
    label: "session_path:"
    body: the path for which this session applies. Defaults to the directory of the CGI script.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: <tt>option</tt> is also passed on to the session storage class initializer; see the documentation for each session storage class for the options they support.
- !ruby/struct:SM::Flow::P 
  body: The retrieved or created session is automatically added to <tt>request</tt> as a cookie, and also to its <tt>output_hidden</tt> table, which is used to add hidden input elements to forms.
- !ruby/struct:SM::Flow::P 
  body: <b>WARNING</b> the <tt>output_hidden</tt> fields are surrounded by a &lt;fieldset&gt; tag in HTML 4 generation, which is <em>not</em> invisible on many browsers; you may wish to disable the use of fieldsets with code similar to the following (see http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/37805)
- !ruby/struct:SM::Flow::VERB 
  body: "  cgi = CGI.new(&quot;html4&quot;)\n  class &lt;&lt; cgi\n      undef_method :fieldset\n  end\n"
full_name: CGI::Session::new
is_singleton: true
name: new
params: (request, option={})
visibility: public
PK�|[�R��.ri/1.8/system/CGI/Session/create_new_id-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new session id.
- !ruby/struct:SM::Flow::P 
  body: The session id is an MD5 hash based upon the time, a random number, and a constant string. This routine is used internally for automatically generated session ids.
full_name: CGI::Session#create_new_id
is_singleton: false
name: create_new_id
params: ()
visibility: private
PK�|[9п??&ri/1.8/system/CGI/Session/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Store session data on the server and close the session storage. For some session storage types, this is a no-op.
full_name: CGI::Session#close
is_singleton: false
name: close
params: ()
visibility: public
PK�|[rև��8ri/1.8/system/CGI/Session/NoSession/cdesc-NoSession.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: CGI::Session::NoSession
includes: []

instance_methods: []

name: NoSession
superclass: RuntimeError
PK�|[乤T��*ri/1.8/system/CGI/Session/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the session date for key <tt>key</tt>.
full_name: CGI::Session#[]=
is_singleton: false
name: "[]="
params: (key, val)
visibility: public
PK�|[��^�NN&ri/1.8/system/CGI/escapeElement-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Escape only the tags of certain HTML elements in <tt>string</tt>.
- !ruby/struct:SM::Flow::P 
  body: Takes an element or elements or array of elements. Each element is specified by the name of the element, without angle brackets. This matches both the start and the end tag of that element. The attribute list of the open tag will also be escaped (for instance, the double-quotes surrounding attribute values).
- !ruby/struct:SM::Flow::VERB 
  body: "  print CGI::escapeElement('&lt;BR&gt;&lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;', &quot;A&quot;, &quot;IMG&quot;)\n    # &quot;&lt;BR&gt;&amp;lt;A HREF=&amp;quot;url&amp;quot;&amp;gt;&amp;lt;/A&amp;gt&quot;\n\n  print CGI::escapeElement('&lt;BR&gt;&lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt;', [&quot;A&quot;, &quot;IMG&quot;])\n    # &quot;&lt;BR&gt;&amp;lt;A HREF=&amp;quot;url&amp;quot;&amp;gt;&amp;lt;/A&amp;gt&quot;\n"
full_name: CGI::escapeElement
is_singleton: true
name: escapeElement
params: (string, *elements)
visibility: public
PK�|[��I��.ri/1.8/system/CGI/TagMaker/cdesc-TagMaker.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Base module for HTML-generation mixins.
- !ruby/struct:SM::Flow::P 
  body: Provides methods for code generation for tags following the various DTD element types.
constants: []

full_name: CGI::TagMaker
includes: []

instance_methods: []

name: TagMaker
superclass: 
PK�|[����ri/1.8/system/CGI/escape-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: escape url encode
full_name: CGI::escape
is_singleton: true
name: escape
params: (str)
visibility: public
PK�|[���� ri/1.8/system/CGI/message-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: print message to $&gt;
full_name: CGI::message
is_singleton: true
name: message
params: "(message, title = \"\", header = [\"Content-Type: text/html\"])"
visibility: public
PK�|[���YBB3ri/1.8/system/CGI/HtmlExtension/image_button-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate an Image Button Input element as a string.
- !ruby/struct:SM::Flow::P 
  body: <tt>src</tt> is the URL of the image to use for the button. <tt>name</tt> is the input name. <tt>alt</tt> is the alternative text for the image.
- !ruby/struct:SM::Flow::P 
  body: Alternatively, the attributes can be specified as a hash.
- !ruby/struct:SM::Flow::VERB 
  body: "  image_button(&quot;url&quot;)\n    # &lt;INPUT TYPE=&quot;image&quot; SRC=&quot;url&quot;&gt;\n\n  image_button(&quot;url&quot;, &quot;name&quot;, &quot;string&quot;)\n    # &lt;INPUT TYPE=&quot;image&quot; SRC=&quot;url&quot; NAME=&quot;name&quot; ALT=&quot;string&quot;&gt;\n\n  image_button(&quot;SRC&quot; =&gt; &quot;url&quot;, &quot;ATL&quot; =&gt; &quot;strng&quot;)\n    # &lt;INPUT TYPE=&quot;image&quot; SRC=&quot;url&quot; ALT=&quot;string&quot;&gt;\n"
full_name: CGI::HtmlExtension#image_button
is_singleton: false
name: image_button
params: (src = "", name = nil, alt = nil)
visibility: public
PK�|[�����1ri/1.8/system/CGI/HtmlExtension/text_field-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate a text field Input element, as a String.
- !ruby/struct:SM::Flow::P 
  body: <tt>name</tt> is the name of the input field. <tt>value</tt> is its initial value. <tt>size</tt> is the size of the input area. <tt>maxlength</tt> is the maximum length of input accepted.
- !ruby/struct:SM::Flow::P 
  body: Alternatively, the attributes can be specified as a hash.
- !ruby/struct:SM::Flow::VERB 
  body: "  text_field(&quot;name&quot;)\n    # &lt;INPUT TYPE=&quot;text&quot; NAME=&quot;name&quot; SIZE=&quot;40&quot;&gt;\n\n  text_field(&quot;name&quot;, &quot;value&quot;)\n    # &lt;INPUT TYPE=&quot;text&quot; NAME=&quot;name&quot; VALUE=&quot;value&quot; SIZE=&quot;40&quot;&gt;\n\n  text_field(&quot;name&quot;, &quot;value&quot;, 80)\n    # &lt;INPUT TYPE=&quot;text&quot; NAME=&quot;name&quot; VALUE=&quot;value&quot; SIZE=&quot;80&quot;&gt;\n\n  text_field(&quot;name&quot;, &quot;value&quot;, 80, 200)\n    # &lt;INPUT TYPE=&quot;text&quot; NAME=&quot;name&quot; VALUE=&quot;value&quot; SIZE=&quot;80&quot; MAXLENGTH=&quot;200&quot;&gt;\n\n  text_field(&quot;NAME&quot; =&gt; &quot;name&quot;, &quot;VALUE&quot; =&gt; &quot;value&quot;)\n    # &lt;INPUT TYPE=&quot;text&quot; NAME=&quot;name&quot; VALUE=&quot;value&quot;&gt;\n"
full_name: CGI::HtmlExtension#text_field
is_singleton: false
name: text_field
params: (name = "", value = nil, size = 40, maxlength = nil)
visibility: public
PK�|[�8��RR8ri/1.8/system/CGI/HtmlExtension/cdesc-HtmlExtension.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Mixin module providing HTML generation methods.
- !ruby/struct:SM::Flow::P 
  body: For example,
- !ruby/struct:SM::Flow::VERB 
  body: "  cgi.a(&quot;http://www.example.com&quot;) { &quot;Example&quot; }\n    # =&gt; &quot;&lt;A HREF=\\&quot;http://www.example.com\\&quot;&gt;Example&lt;/A&gt;&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: Modules Http3, Http4, etc., contain more basic HTML-generation methods (:title, :center, etc.).
- !ruby/struct:SM::Flow::P 
  body: See class CGI for a detailed example.
constants: []

full_name: CGI::HtmlExtension
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: a
- !ruby/object:RI::MethodSummary 
  name: base
- !ruby/object:RI::MethodSummary 
  name: blockquote
- !ruby/object:RI::MethodSummary 
  name: caption
- !ruby/object:RI::MethodSummary 
  name: checkbox
- !ruby/object:RI::MethodSummary 
  name: checkbox_group
- !ruby/object:RI::MethodSummary 
  name: file_field
- !ruby/object:RI::MethodSummary 
  name: form
- !ruby/object:RI::MethodSummary 
  name: hidden
- !ruby/object:RI::MethodSummary 
  name: html
- !ruby/object:RI::MethodSummary 
  name: image_button
- !ruby/object:RI::MethodSummary 
  name: img
- !ruby/object:RI::MethodSummary 
  name: multipart_form
- !ruby/object:RI::MethodSummary 
  name: password_field
- !ruby/object:RI::MethodSummary 
  name: popup_menu
- !ruby/object:RI::MethodSummary 
  name: radio_button
- !ruby/object:RI::MethodSummary 
  name: radio_group
- !ruby/object:RI::MethodSummary 
  name: reset
- !ruby/object:RI::MethodSummary 
  name: scrolling_list
- !ruby/object:RI::MethodSummary 
  name: submit
- !ruby/object:RI::MethodSummary 
  name: text_field
- !ruby/object:RI::MethodSummary 
  name: textarea
name: HtmlExtension
superclass: 
PK�|[%&�-ri/1.8/system/CGI/HtmlExtension/hidden-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate a Hidden Input element as a string.
- !ruby/struct:SM::Flow::P 
  body: The attributes of the element can be specified as two arguments, <tt>name</tt> and <tt>value</tt>.
- !ruby/struct:SM::Flow::P 
  body: Alternatively, the attributes can be specified as a hash.
- !ruby/struct:SM::Flow::VERB 
  body: "  hidden(&quot;name&quot;)\n    # &lt;INPUT TYPE=&quot;hidden&quot; NAME=&quot;name&quot;&gt;\n\n  hidden(&quot;name&quot;, &quot;value&quot;)\n    # &lt;INPUT TYPE=&quot;hidden&quot; NAME=&quot;name&quot; VALUE=&quot;value&quot;&gt;\n\n  hidden(&quot;NAME&quot; =&gt; &quot;name&quot;, &quot;VALUE&quot; =&gt; &quot;reset&quot;, &quot;ID&quot; =&gt; &quot;foo&quot;)\n    # &lt;INPUT TYPE=&quot;hidden&quot; NAME=&quot;name&quot; VALUE=&quot;value&quot; ID=&quot;foo&quot;&gt;\n"
full_name: CGI::HtmlExtension#hidden
is_singleton: false
name: hidden
params: (name = "", value = nil)
visibility: public
PK�|[���Thh/ri/1.8/system/CGI/HtmlExtension/checkbox-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate a Checkbox Input element as a string.
- !ruby/struct:SM::Flow::P 
  body: The attributes of the element can be specified as three arguments, <tt>name</tt>, <tt>value</tt>, and <tt>checked</tt>. <tt>checked</tt> is a boolean value; if true, the CHECKED attribute will be included in the element.
- !ruby/struct:SM::Flow::P 
  body: Alternatively, the attributes can be specified as a hash.
- !ruby/struct:SM::Flow::VERB 
  body: "  checkbox(&quot;name&quot;)\n    # = checkbox(&quot;NAME&quot; =&gt; &quot;name&quot;)\n\n  checkbox(&quot;name&quot;, &quot;value&quot;)\n    # = checkbox(&quot;NAME&quot; =&gt; &quot;name&quot;, &quot;VALUE&quot; =&gt; &quot;value&quot;)\n\n  checkbox(&quot;name&quot;, &quot;value&quot;, true)\n    # = checkbox(&quot;NAME&quot; =&gt; &quot;name&quot;, &quot;VALUE&quot; =&gt; &quot;value&quot;, &quot;CHECKED&quot; =&gt; true)\n"
full_name: CGI::HtmlExtension#checkbox
is_singleton: false
name: checkbox
params: (name = "", value = nil, checked = nil)
visibility: public
PK�|[m^��++5ri/1.8/system/CGI/HtmlExtension/checkbox_group-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate a sequence of checkbox elements, as a String.
- !ruby/struct:SM::Flow::P 
  body: The checkboxes will all have the same <tt>name</tt> attribute. Each checkbox is followed by a label. There will be one checkbox for each value. Each value can be specified as a String, which will be used both as the value of the VALUE attribute and as the label for that checkbox. A single-element array has the same effect.
- !ruby/struct:SM::Flow::P 
  body: Each value can also be specified as a three-element array. The first element is the VALUE attribute; the second is the label; and the third is a boolean specifying whether this checkbox is CHECKED.
- !ruby/struct:SM::Flow::P 
  body: Each value can also be specified as a two-element array, by omitting either the value element (defaults to the same as the label), or the boolean checked element (defaults to false).
- !ruby/struct:SM::Flow::VERB 
  body: "  checkbox_group(&quot;name&quot;, &quot;foo&quot;, &quot;bar&quot;, &quot;baz&quot;)\n    # &lt;INPUT TYPE=&quot;checkbox&quot; NAME=&quot;name&quot; VALUE=&quot;foo&quot;&gt;foo\n    # &lt;INPUT TYPE=&quot;checkbox&quot; NAME=&quot;name&quot; VALUE=&quot;bar&quot;&gt;bar\n    # &lt;INPUT TYPE=&quot;checkbox&quot; NAME=&quot;name&quot; VALUE=&quot;baz&quot;&gt;baz\n\n  checkbox_group(&quot;name&quot;, [&quot;foo&quot;], [&quot;bar&quot;, true], &quot;baz&quot;)\n    # &lt;INPUT TYPE=&quot;checkbox&quot; NAME=&quot;name&quot; VALUE=&quot;foo&quot;&gt;foo\n    # &lt;INPUT TYPE=&quot;checkbox&quot; CHECKED NAME=&quot;name&quot; VALUE=&quot;bar&quot;&gt;bar\n    # &lt;INPUT TYPE=&quot;checkbox&quot; NAME=&quot;name&quot; VALUE=&quot;baz&quot;&gt;baz\n\n  checkbox_group(&quot;name&quot;, [&quot;1&quot;, &quot;Foo&quot;], [&quot;2&quot;, &quot;Bar&quot;, true], &quot;Baz&quot;)\n    # &lt;INPUT TYPE=&quot;checkbox&quot; NAME=&quot;name&quot; VALUE=&quot;1&quot;&gt;Foo\n    # &lt;INPUT TYPE=&quot;checkbox&quot; CHECKED NAME=&quot;name&quot; VALUE=&quot;2&quot;&gt;Bar\n    # &lt;INPUT TYPE=&quot;checkbox&quot; NAME=&quot;name&quot; VALUE=&quot;Baz&quot;&gt;Baz\n\n  checkbox_group(&quot;NAME&quot; =&gt; &quot;name&quot;,\n                   &quot;VALUES&quot; =&gt; [&quot;foo&quot;, &quot;bar&quot;, &quot;baz&quot;])\n\n  checkbox_group(&quot;NAME&quot; =&gt; &quot;name&quot;,\n                   &quot;VALUES&quot; =&gt; [[&quot;foo&quot;], [&quot;bar&quot;, true], &quot;baz&quot;])\n\n  checkbox_group(&quot;NAME&quot; =&gt; &quot;name&quot;,\n                   &quot;VALUES&quot; =&gt; [[&quot;1&quot;, &quot;Foo&quot;], [&quot;2&quot;, &quot;Bar&quot;, true], &quot;Baz&quot;])\n"
full_name: CGI::HtmlExtension#checkbox_group
is_singleton: false
name: checkbox_group
params: (name = "", *values)
visibility: public
PK�|[��U:ZZ1ri/1.8/system/CGI/HtmlExtension/file_field-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate an File Upload Input element as a string.
- !ruby/struct:SM::Flow::P 
  body: The attributes of the element can be specified as three arguments, <tt>name</tt>, <tt>size</tt>, and <tt>maxlength</tt>. <tt>maxlength</tt> is the maximum length of the file's <em>name</em>, not of the file's <em>contents</em>.
- !ruby/struct:SM::Flow::P 
  body: Alternatively, the attributes can be specified as a hash.
- !ruby/struct:SM::Flow::P 
  body: "See #multipart_form() for forms that include file uploads."
- !ruby/struct:SM::Flow::VERB 
  body: "  file_field(&quot;name&quot;)\n    # &lt;INPUT TYPE=&quot;file&quot; NAME=&quot;name&quot; SIZE=&quot;20&quot;&gt;\n\n  file_field(&quot;name&quot;, 40)\n    # &lt;INPUT TYPE=&quot;file&quot; NAME=&quot;name&quot; SIZE=&quot;40&quot;&gt;\n\n  file_field(&quot;name&quot;, 40, 100)\n    # &lt;INPUT TYPE=&quot;file&quot; NAME=&quot;name&quot; SIZE=&quot;40&quot; MAXLENGTH=&quot;100&quot;&gt;\n\n  file_field(&quot;NAME&quot; =&gt; &quot;name&quot;, &quot;SIZE&quot; =&gt; 40)\n    # &lt;INPUT TYPE=&quot;file&quot; NAME=&quot;name&quot; SIZE=&quot;40&quot;&gt;\n"
full_name: CGI::HtmlExtension#file_field
is_singleton: false
name: file_field
params: (name = "", size = 20, maxlength = nil)
visibility: public
PK�|[����jj2ri/1.8/system/CGI/HtmlExtension/radio_group-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate a sequence of radio button Input elements, as a String.
- !ruby/struct:SM::Flow::P 
  body: "This works the same as #checkbox_group(). However, it is not valid to have more than one radiobutton in a group checked."
- !ruby/struct:SM::Flow::VERB 
  body: "  radio_group(&quot;name&quot;, &quot;foo&quot;, &quot;bar&quot;, &quot;baz&quot;)\n    # &lt;INPUT TYPE=&quot;radio&quot; NAME=&quot;name&quot; VALUE=&quot;foo&quot;&gt;foo\n    # &lt;INPUT TYPE=&quot;radio&quot; NAME=&quot;name&quot; VALUE=&quot;bar&quot;&gt;bar\n    # &lt;INPUT TYPE=&quot;radio&quot; NAME=&quot;name&quot; VALUE=&quot;baz&quot;&gt;baz\n\n  radio_group(&quot;name&quot;, [&quot;foo&quot;], [&quot;bar&quot;, true], &quot;baz&quot;)\n    # &lt;INPUT TYPE=&quot;radio&quot; NAME=&quot;name&quot; VALUE=&quot;foo&quot;&gt;foo\n    # &lt;INPUT TYPE=&quot;radio&quot; CHECKED NAME=&quot;name&quot; VALUE=&quot;bar&quot;&gt;bar\n    # &lt;INPUT TYPE=&quot;radio&quot; NAME=&quot;name&quot; VALUE=&quot;baz&quot;&gt;baz\n\n  radio_group(&quot;name&quot;, [&quot;1&quot;, &quot;Foo&quot;], [&quot;2&quot;, &quot;Bar&quot;, true], &quot;Baz&quot;)\n    # &lt;INPUT TYPE=&quot;radio&quot; NAME=&quot;name&quot; VALUE=&quot;1&quot;&gt;Foo\n    # &lt;INPUT TYPE=&quot;radio&quot; CHECKED NAME=&quot;name&quot; VALUE=&quot;2&quot;&gt;Bar\n    # &lt;INPUT TYPE=&quot;radio&quot; NAME=&quot;name&quot; VALUE=&quot;Baz&quot;&gt;Baz\n\n  radio_group(&quot;NAME&quot; =&gt; &quot;name&quot;,\n                &quot;VALUES&quot; =&gt; [&quot;foo&quot;, &quot;bar&quot;, &quot;baz&quot;])\n\n  radio_group(&quot;NAME&quot; =&gt; &quot;name&quot;,\n                &quot;VALUES&quot; =&gt; [[&quot;foo&quot;], [&quot;bar&quot;, true], &quot;baz&quot;])\n\n  radio_group(&quot;NAME&quot; =&gt; &quot;name&quot;,\n                &quot;VALUES&quot; =&gt; [[&quot;1&quot;, &quot;Foo&quot;], [&quot;2&quot;, &quot;Bar&quot;, true], &quot;Baz&quot;])\n"
full_name: CGI::HtmlExtension#radio_group
is_singleton: false
name: radio_group
params: (name = "", *values)
visibility: public
PK�|[����/ri/1.8/system/CGI/HtmlExtension/textarea-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate a TextArea element, as a String.
- !ruby/struct:SM::Flow::P 
  body: <tt>name</tt> is the name of the textarea. <tt>cols</tt> is the number of columns and <tt>rows</tt> is the number of rows in the display.
- !ruby/struct:SM::Flow::P 
  body: Alternatively, the attributes can be specified as a hash.
- !ruby/struct:SM::Flow::P 
  body: The body is provided by the passed-in no-argument block
- !ruby/struct:SM::Flow::VERB 
  body: "  textarea(&quot;name&quot;)\n     # = textarea(&quot;NAME&quot; =&gt; &quot;name&quot;, &quot;COLS&quot; =&gt; 70, &quot;ROWS&quot; =&gt; 10)\n\n  textarea(&quot;name&quot;, 40, 5)\n     # = textarea(&quot;NAME&quot; =&gt; &quot;name&quot;, &quot;COLS&quot; =&gt; 40, &quot;ROWS&quot; =&gt; 5)\n"
full_name: CGI::HtmlExtension#textarea
is_singleton: false
name: textarea
params: (name = "", cols = 70, rows = 10) {|| ...}
visibility: public
PK�|[#����3ri/1.8/system/CGI/HtmlExtension/radio_button-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generates a radio-button Input element.
- !ruby/struct:SM::Flow::P 
  body: <tt>name</tt> is the name of the input field. <tt>value</tt> is the value of the field if checked. <tt>checked</tt> specifies whether the field starts off checked.
- !ruby/struct:SM::Flow::P 
  body: Alternatively, the attributes can be specified as a hash.
- !ruby/struct:SM::Flow::VERB 
  body: "  radio_button(&quot;name&quot;, &quot;value&quot;)\n    # &lt;INPUT TYPE=&quot;radio&quot; NAME=&quot;name&quot; VALUE=&quot;value&quot;&gt;\n\n  radio_button(&quot;name&quot;, &quot;value&quot;, true)\n    # &lt;INPUT TYPE=&quot;radio&quot; NAME=&quot;name&quot; VALUE=&quot;value&quot; CHECKED&gt;\n\n  radio_button(&quot;NAME&quot; =&gt; &quot;name&quot;, &quot;VALUE&quot; =&gt; &quot;value&quot;, &quot;ID&quot; =&gt; &quot;foo&quot;)\n    # &lt;INPUT TYPE=&quot;radio&quot; NAME=&quot;name&quot; VALUE=&quot;value&quot; ID=&quot;foo&quot;&gt;\n"
full_name: CGI::HtmlExtension#radio_button
is_singleton: false
name: radio_button
params: (name = "", value = nil, checked = nil)
visibility: public
PK�|[ED,,+ri/1.8/system/CGI/HtmlExtension/form-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate a Form element as a string.
- !ruby/struct:SM::Flow::P 
  body: <tt>method</tt> should be either &quot;get&quot; or &quot;post&quot;, and defaults to the latter. <tt>action</tt> defaults to the current CGI script name. <tt>enctype</tt> defaults to &quot;application/x-www-form-urlencoded&quot;.
- !ruby/struct:SM::Flow::P 
  body: Alternatively, the attributes can be specified as a hash.
- !ruby/struct:SM::Flow::P 
  body: "See also #multipart_form() for forms that include file uploads."
- !ruby/struct:SM::Flow::VERB 
  body: "  form{ &quot;string&quot; }\n    # &lt;FORM METHOD=&quot;post&quot; ENCTYPE=&quot;application/x-www-form-urlencoded&quot;&gt;string&lt;/FORM&gt;\n\n  form(&quot;get&quot;) { &quot;string&quot; }\n    # &lt;FORM METHOD=&quot;get&quot; ENCTYPE=&quot;application/x-www-form-urlencoded&quot;&gt;string&lt;/FORM&gt;\n\n  form(&quot;get&quot;, &quot;url&quot;) { &quot;string&quot; }\n    # &lt;FORM METHOD=&quot;get&quot; ACTION=&quot;url&quot; ENCTYPE=&quot;application/x-www-form-urlencoded&quot;&gt;string&lt;/FORM&gt;\n\n  form(&quot;METHOD&quot; =&gt; &quot;post&quot;, &quot;ENCTYPE&quot; =&gt; &quot;enctype&quot;) { &quot;string&quot; }\n    # &lt;FORM METHOD=&quot;post&quot; ENCTYPE=&quot;enctype&quot;&gt;string&lt;/FORM&gt;\n"
full_name: CGI::HtmlExtension#form
is_singleton: false
name: form
params: (method = "post", action = script_name, enctype = "application/x-www-form-urlencoded") {|| ...}
visibility: public
PK�|[G�Jgaa1ri/1.8/system/CGI/HtmlExtension/blockquote-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate a BlockQuote element as a string.
- !ruby/struct:SM::Flow::P 
  body: <tt>cite</tt> can either be a string, give the URI for the source of the quoted text, or a hash, giving all attributes of the element, or it can be omitted, in which case the element has no attributes.
- !ruby/struct:SM::Flow::P 
  body: The body is provided by the passed-in no-argument block
- !ruby/struct:SM::Flow::VERB 
  body: "  blockquote(&quot;http://www.example.com/quotes/foo.html&quot;) { &quot;Foo!&quot; }\n    #=&gt; &quot;&lt;BLOCKQUOTE CITE=\\&quot;http://www.example.com/quotes/foo.html\\&quot;&gt;Foo!&lt;/BLOCKQUOTE&gt;\n"
full_name: CGI::HtmlExtension#blockquote
is_singleton: false
name: blockquote
params: (cite = nil) {|| ...}
visibility: public
PK�|[QA�A5ri/1.8/system/CGI/HtmlExtension/scrolling_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #popup_menu"
full_name: CGI::HtmlExtension#scrolling_list
is_singleton: false
name: scrolling_list
params: (name = "", *values)
visibility: public
PK�|[ ��}@@-ri/1.8/system/CGI/HtmlExtension/submit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate a submit button Input element, as a String.
- !ruby/struct:SM::Flow::P 
  body: <tt>value</tt> is the text to display on the button. <tt>name</tt> is the name of the input.
- !ruby/struct:SM::Flow::P 
  body: Alternatively, the attributes can be specified as a hash.
- !ruby/struct:SM::Flow::VERB 
  body: "  submit\n    # &lt;INPUT TYPE=&quot;submit&quot;&gt;\n\n  submit(&quot;ok&quot;)\n    # &lt;INPUT TYPE=&quot;submit&quot; VALUE=&quot;ok&quot;&gt;\n\n  submit(&quot;ok&quot;, &quot;button1&quot;)\n    # &lt;INPUT TYPE=&quot;submit&quot; VALUE=&quot;ok&quot; NAME=&quot;button1&quot;&gt;\n\n  submit(&quot;VALUE&quot; =&gt; &quot;ok&quot;, &quot;NAME&quot; =&gt; &quot;button1&quot;, &quot;ID&quot; =&gt; &quot;foo&quot;)\n    # &lt;INPUT TYPE=&quot;submit&quot; VALUE=&quot;ok&quot; NAME=&quot;button1&quot; ID=&quot;foo&quot;&gt;\n"
full_name: CGI::HtmlExtension#submit
is_singleton: false
name: submit
params: (value = nil, name = nil)
visibility: public
PK�|[��m-!!1ri/1.8/system/CGI/HtmlExtension/popup_menu-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: scrolling_list
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate a Select element as a string.
- !ruby/struct:SM::Flow::P 
  body: <tt>name</tt> is the name of the element. The <tt>values</tt> are the options that can be selected from the Select menu. Each value can be a String or a one, two, or three-element Array. If a String or a one-element Array, this is both the value of that option and the text displayed for it. If a three-element Array, the elements are the option value, displayed text, and a boolean value specifying whether this option starts as selected. The two-element version omits either the option value (defaults to the same as the display text) or the boolean selected specifier (defaults to false).
- !ruby/struct:SM::Flow::P 
  body: The attributes and options can also be specified as a hash. In this case, options are specified as an array of values as described above, with the hash key of &quot;VALUES&quot;.
- !ruby/struct:SM::Flow::VERB 
  body: "  popup_menu(&quot;name&quot;, &quot;foo&quot;, &quot;bar&quot;, &quot;baz&quot;)\n    # &lt;SELECT NAME=&quot;name&quot;&gt;\n    #   &lt;OPTION VALUE=&quot;foo&quot;&gt;foo&lt;/OPTION&gt;\n    #   &lt;OPTION VALUE=&quot;bar&quot;&gt;bar&lt;/OPTION&gt;\n    #   &lt;OPTION VALUE=&quot;baz&quot;&gt;baz&lt;/OPTION&gt;\n    # &lt;/SELECT&gt;\n\n  popup_menu(&quot;name&quot;, [&quot;foo&quot;], [&quot;bar&quot;, true], &quot;baz&quot;)\n    # &lt;SELECT NAME=&quot;name&quot;&gt;\n    #   &lt;OPTION VALUE=&quot;foo&quot;&gt;foo&lt;/OPTION&gt;\n    #   &lt;OPTION VALUE=&quot;bar&quot; SELECTED&gt;bar&lt;/OPTION&gt;\n    #   &lt;OPTION VALUE=&quot;baz&quot;&gt;baz&lt;/OPTION&gt;\n    # &lt;/SELECT&gt;\n\n  popup_menu(&quot;name&quot;, [&quot;1&quot;, &quot;Foo&quot;], [&quot;2&quot;, &quot;Bar&quot;, true], &quot;Baz&quot;)\n    # &lt;SELECT NAME=&quot;name&quot;&gt;\n    #   &lt;OPTION VALUE=&quot;1&quot;&gt;Foo&lt;/OPTION&gt;\n    #   &lt;OPTION SELECTED VALUE=&quot;2&quot;&gt;Bar&lt;/OPTION&gt;\n    #   &lt;OPTION VALUE=&quot;Baz&quot;&gt;Baz&lt;/OPTION&gt;\n    # &lt;/SELECT&gt;\n\n  popup_menu(&quot;NAME&quot; =&gt; &quot;name&quot;, &quot;SIZE&quot; =&gt; 2, &quot;MULTIPLE&quot; =&gt; true,\n              &quot;VALUES&quot; =&gt; [[&quot;1&quot;, &quot;Foo&quot;], [&quot;2&quot;, &quot;Bar&quot;, true], &quot;Baz&quot;])\n    # &lt;SELECT NAME=&quot;name&quot; MULTIPLE SIZE=&quot;2&quot;&gt;\n    #   &lt;OPTION VALUE=&quot;1&quot;&gt;Foo&lt;/OPTION&gt;\n    #   &lt;OPTION SELECTED VALUE=&quot;2&quot;&gt;Bar&lt;/OPTION&gt;\n    #   &lt;OPTION VALUE=&quot;Baz&quot;&gt;Baz&lt;/OPTION&gt;\n    # &lt;/SELECT&gt;\n"
full_name: CGI::HtmlExtension#popup_menu
is_singleton: false
name: popup_menu
params: (name = "", *values)
visibility: public
PK�|[�;�ɾ�+ri/1.8/system/CGI/HtmlExtension/base-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate a Document Base URI element as a String.
- !ruby/struct:SM::Flow::P 
  body: <tt>href</tt> can either by a string, giving the base URL for the HREF attribute, or it can be a has of the element's attributes.
- !ruby/struct:SM::Flow::P 
  body: The passed-in no-argument block is ignored.
- !ruby/struct:SM::Flow::VERB 
  body: "  base(&quot;http://www.example.com/cgi&quot;)\n    # =&gt; &quot;&lt;BASE HREF=\\&quot;http://www.example.com/cgi\\&quot;&gt;&quot;\n"
full_name: CGI::HtmlExtension#base
is_singleton: false
name: base
params: (href = "") {|| ...}
visibility: public
PK�|[���885ri/1.8/system/CGI/HtmlExtension/multipart_form-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate a Form element with multipart encoding as a String.
- !ruby/struct:SM::Flow::P 
  body: Multipart encoding is used for forms that include file uploads.
- !ruby/struct:SM::Flow::P 
  body: <tt>action</tt> is the action to perform. <tt>enctype</tt> is the encoding type, which defaults to &quot;multipart/form-data&quot;.
- !ruby/struct:SM::Flow::P 
  body: Alternatively, the attributes can be specified as a hash.
- !ruby/struct:SM::Flow::VERB 
  body: "  multipart_form{ &quot;string&quot; }\n    # &lt;FORM METHOD=&quot;post&quot; ENCTYPE=&quot;multipart/form-data&quot;&gt;string&lt;/FORM&gt;\n\n  multipart_form(&quot;url&quot;) { &quot;string&quot; }\n    # &lt;FORM METHOD=&quot;post&quot; ACTION=&quot;url&quot; ENCTYPE=&quot;multipart/form-data&quot;&gt;string&lt;/FORM&gt;\n"
full_name: CGI::HtmlExtension#multipart_form
is_singleton: false
name: multipart_form
params: (action = nil, enctype = "multipart/form-data") {|| ...}
visibility: public
PK�|[)����(ri/1.8/system/CGI/HtmlExtension/a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate an Anchor element as a string.
- !ruby/struct:SM::Flow::P 
  body: <tt>href</tt> can either be a string, giving the URL for the HREF attribute, or it can be a hash of the element's attributes.
- !ruby/struct:SM::Flow::P 
  body: The body of the element is the string returned by the no-argument block passed in.
- !ruby/struct:SM::Flow::VERB 
  body: "  a(&quot;http://www.example.com&quot;) { &quot;Example&quot; }\n    # =&gt; &quot;&lt;A HREF=\\&quot;http://www.example.com\\&quot;&gt;Example&lt;/A&gt;&quot;\n\n  a(&quot;HREF&quot; =&gt; &quot;http://www.example.com&quot;, &quot;TARGET&quot; =&gt; &quot;_top&quot;) { &quot;Example&quot; }\n    # =&gt; &quot;&lt;A HREF=\\&quot;http://www.example.com\\&quot; TARGET=\\&quot;_top\\&quot;&gt;Example&lt;/A&gt;&quot;\n"
full_name: CGI::HtmlExtension#a
is_singleton: false
name: a
params: (href = "") {|| ...}
visibility: public
PK�|[�C���,ri/1.8/system/CGI/HtmlExtension/reset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate a reset button Input element, as a String.
- !ruby/struct:SM::Flow::P 
  body: This resets the values on a form to their initial values. <tt>value</tt> is the text displayed on the button. <tt>name</tt> is the name of this button.
- !ruby/struct:SM::Flow::P 
  body: Alternatively, the attributes can be specified as a hash.
- !ruby/struct:SM::Flow::VERB 
  body: "  reset\n    # &lt;INPUT TYPE=&quot;reset&quot;&gt;\n\n  reset(&quot;reset&quot;)\n    # &lt;INPUT TYPE=&quot;reset&quot; VALUE=&quot;reset&quot;&gt;\n\n  reset(&quot;VALUE&quot; =&gt; &quot;reset&quot;, &quot;ID&quot; =&gt; &quot;foo&quot;)\n    # &lt;INPUT TYPE=&quot;reset&quot; VALUE=&quot;reset&quot; ID=&quot;foo&quot;&gt;\n"
full_name: CGI::HtmlExtension#reset
is_singleton: false
name: reset
params: (value = nil, name = nil)
visibility: public
PK�|[r=�Y.ri/1.8/system/CGI/HtmlExtension/caption-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate a Table Caption element as a string.
- !ruby/struct:SM::Flow::P 
  body: <tt>align</tt> can be a string, giving the alignment of the caption (one of top, bottom, left, or right). It can be a hash of all the attributes of the element. Or it can be omitted.
- !ruby/struct:SM::Flow::P 
  body: The body of the element is provided by the passed-in no-argument block.
- !ruby/struct:SM::Flow::VERB 
  body: "  caption(&quot;left&quot;) { &quot;Capital Cities&quot; }\n    # =&gt; &lt;CAPTION ALIGN=\\&quot;left\\&quot;&gt;Capital Cities&lt;/CAPTION&gt;\n"
full_name: CGI::HtmlExtension#caption
is_singleton: false
name: caption
params: (align = nil) {|| ...}
visibility: public
PK�|[���xx5ri/1.8/system/CGI/HtmlExtension/password_field-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate a Password Input element as a string.
- !ruby/struct:SM::Flow::P 
  body: <tt>name</tt> is the name of the input field. <tt>value</tt> is its default value. <tt>size</tt> is the size of the input field display. <tt>maxlength</tt> is the maximum length of the inputted password.
- !ruby/struct:SM::Flow::P 
  body: Alternatively, attributes can be specified as a hash.
- !ruby/struct:SM::Flow::VERB 
  body: "  password_field(&quot;name&quot;)\n    # &lt;INPUT TYPE=&quot;password&quot; NAME=&quot;name&quot; SIZE=&quot;40&quot;&gt;\n\n  password_field(&quot;name&quot;, &quot;value&quot;)\n    # &lt;INPUT TYPE=&quot;password&quot; NAME=&quot;name&quot; VALUE=&quot;value&quot; SIZE=&quot;40&quot;&gt;\n\n  password_field(&quot;password&quot;, &quot;value&quot;, 80, 200)\n    # &lt;INPUT TYPE=&quot;password&quot; NAME=&quot;name&quot; VALUE=&quot;value&quot; SIZE=&quot;80&quot; MAXLENGTH=&quot;200&quot;&gt;\n\n  password_field(&quot;NAME&quot; =&gt; &quot;name&quot;, &quot;VALUE&quot; =&gt; &quot;value&quot;)\n    # &lt;INPUT TYPE=&quot;password&quot; NAME=&quot;name&quot; VALUE=&quot;value&quot;&gt;\n"
full_name: CGI::HtmlExtension#password_field
is_singleton: false
name: password_field
params: (name = "", value = nil, size = 40, maxlength = nil)
visibility: public
PK�|[˒#*ri/1.8/system/CGI/HtmlExtension/img-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate an Image element as a string.
- !ruby/struct:SM::Flow::P 
  body: <tt>src</tt> is the URL of the image. <tt>alt</tt> is the alternative text for the image. <tt>width</tt> is the width of the image, and <tt>height</tt> is its height.
- !ruby/struct:SM::Flow::P 
  body: Alternatively, the attributes can be specified as a hash.
- !ruby/struct:SM::Flow::VERB 
  body: "  img(&quot;src&quot;, &quot;alt&quot;, 100, 50)\n    # &lt;IMG SRC=&quot;src&quot; ALT=&quot;alt&quot; WIDTH=&quot;100&quot; HEIGHT=&quot;50&quot;&gt;\n\n  img(&quot;SRC&quot; =&gt; &quot;src&quot;, &quot;ALT&quot; =&gt; &quot;alt&quot;, &quot;WIDTH&quot; =&gt; 100, &quot;HEIGHT&quot; =&gt; 50)\n    # &lt;IMG SRC=&quot;src&quot; ALT=&quot;alt&quot; WIDTH=&quot;100&quot; HEIGHT=&quot;50&quot;&gt;\n"
full_name: CGI::HtmlExtension#img
is_singleton: false
name: img
params: (src = "", alt = "", width = nil, height = nil)
visibility: public
PK�|[���2		+ri/1.8/system/CGI/HtmlExtension/html-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate a top-level HTML element as a string.
- !ruby/struct:SM::Flow::P 
  body: The attributes of the element are specified as a hash. The pseudo-attribute &quot;PRETTY&quot; can be used to specify that the generated HTML string should be indented. &quot;PRETTY&quot; can also be specified as a string as the sole argument to this method. The pseudo-attribute &quot;DOCTYPE&quot;, if given, is used as the leading DOCTYPE SGML tag; it should include the entire text of this tag, including angle brackets.
- !ruby/struct:SM::Flow::P 
  body: The body of the html element is supplied as a block.
- !ruby/struct:SM::Flow::VERB 
  body: "  html{ &quot;string&quot; }\n    # &lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 3.2 Final//EN&quot;&gt;&lt;HTML&gt;string&lt;/HTML&gt;\n\n  html(&quot;LANG&quot; =&gt; &quot;ja&quot;) { &quot;string&quot; }\n    # &lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 3.2 Final//EN&quot;&gt;&lt;HTML LANG=&quot;ja&quot;&gt;string&lt;/HTML&gt;\n\n  html(&quot;DOCTYPE&quot; =&gt; false) { &quot;string&quot; }\n    # &lt;HTML&gt;string&lt;/HTML&gt;\n\n  html(&quot;DOCTYPE&quot; =&gt; '&lt;!DOCTYPE HTML PUBLIC &quot;-//IETF//DTD HTML//EN&quot;&gt;') { &quot;string&quot; }\n    # &lt;!DOCTYPE HTML PUBLIC &quot;-//IETF//DTD HTML//EN&quot;&gt;&lt;HTML&gt;string&lt;/HTML&gt;\n\n  html(&quot;PRETTY&quot; =&gt; &quot;  &quot;) { &quot;&lt;BODY&gt;&lt;/BODY&gt;&quot; }\n    # &lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 3.2 Final//EN&quot;&gt;\n    # &lt;HTML&gt;\n    #   &lt;BODY&gt;\n    #   &lt;/BODY&gt;\n    # &lt;/HTML&gt;\n\n  html(&quot;PRETTY&quot; =&gt; &quot;\\t&quot;) { &quot;&lt;BODY&gt;&lt;/BODY&gt;&quot; }\n    # &lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 3.2 Final//EN&quot;&gt;\n    # &lt;HTML&gt;\n    #         &lt;BODY&gt;\n    #         &lt;/BODY&gt;\n    # &lt;/HTML&gt;\n\n  html(&quot;PRETTY&quot;) { &quot;&lt;BODY&gt;&lt;/BODY&gt;&quot; }\n    # = html(&quot;PRETTY&quot; =&gt; &quot;  &quot;) { &quot;&lt;BODY&gt;&lt;/BODY&gt;&quot; }\n\n  html(if $VERBOSE then &quot;PRETTY&quot; end) { &quot;HTML string&quot; }\n"
full_name: CGI::HtmlExtension#html
is_singleton: false
name: html
params: (attributes = {}) {|| ...}
visibility: public
PK�|[���mri/1.8/system/CGI/print-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: .to_s
comment: 
- !ruby/struct:SM::Flow::P 
  body: print HTTP header and string to $&gt;
full_name: CGI::print
is_singleton: true
name: print
params: (*options) {|.to_s| ...}
visibility: public
PK�|[�ت�"ri/1.8/system/CGI/stdoutput-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CGI#stdoutput
is_singleton: false
name: stdoutput
params: ()
visibility: private
PK�|[ՋϪ�"ri/1.8/system/CGI/env_table-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CGI#env_table
is_singleton: false
name: env_table
params: ()
visibility: private
PK�|[�>���#ri/1.8/system/CGI/escapeHTML-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Escape special characters in HTML, namely &amp;\&quot;&lt;&gt;
- !ruby/struct:SM::Flow::VERB 
  body: "  CGI::escapeHTML('Usage: foo &quot;bar&quot; &lt;baz&gt;')\n     # =&gt; &quot;Usage: foo &amp;quot;bar&amp;quot; &amp;lt;baz&amp;gt;&quot;\n"
full_name: CGI::escapeHTML
is_singleton: true
name: escapeHTML
params: (string)
visibility: public
PK�|[е�ۨ�!ri/1.8/system/CGI/stdinput-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CGI#stdinput
is_singleton: false
name: stdinput
params: ()
visibility: private
PK�|[�m^�77ri/1.8/system/CGI/pretty-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Prettify (indent) an HTML string.
- !ruby/struct:SM::Flow::P 
  body: <tt>string</tt> is the HTML string to indent. <tt>shift</tt> is the indentation unit to use; it defaults to two spaces.
- !ruby/struct:SM::Flow::VERB 
  body: "  print CGI::pretty(&quot;&lt;HTML&gt;&lt;BODY&gt;&lt;/BODY&gt;&lt;/HTML&gt;&quot;)\n    # &lt;HTML&gt;\n    #   &lt;BODY&gt;\n    #   &lt;/BODY&gt;\n    # &lt;/HTML&gt;\n\n  print CGI::pretty(&quot;&lt;HTML&gt;&lt;BODY&gt;&lt;/BODY&gt;&lt;/HTML&gt;&quot;, &quot;\\t&quot;)\n    # &lt;HTML&gt;\n    #         &lt;BODY&gt;\n    #         &lt;/BODY&gt;\n    # &lt;/HTML&gt;\n"
full_name: CGI::pretty
is_singleton: true
name: pretty
params: (string, shift = " ")
visibility: public
PK�|[ї�m��(ri/1.8/system/Continuation/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invokes the continuation. The program continues from the end of the <tt>callcc</tt> block. If no arguments are given, the original <tt>callcc</tt> returns <tt>nil</tt>. If one argument is given, <tt>callcc</tt> returns it. Otherwise, an array containing <em>args</em> is returned.
- !ruby/struct:SM::Flow::VERB 
  body: "   callcc {|cont|  cont.call }           #=&gt; nil\n   callcc {|cont|  cont.call 1 }         #=&gt; 1\n   callcc {|cont|  cont.call 1, 2, 3 }   #=&gt; [1, 2, 3]\n"
full_name: Continuation#[]
is_singleton: false
name: "[]"
params: |
  cont.call(args, ...) 
  cont[args, ...]

visibility: public
PK�|[�l����&ri/1.8/system/Continuation/call-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invokes the continuation. The program continues from the end of the <tt>callcc</tt> block. If no arguments are given, the original <tt>callcc</tt> returns <tt>nil</tt>. If one argument is given, <tt>callcc</tt> returns it. Otherwise, an array containing <em>args</em> is returned.
- !ruby/struct:SM::Flow::VERB 
  body: "   callcc {|cont|  cont.call }           #=&gt; nil\n   callcc {|cont|  cont.call 1 }         #=&gt; 1\n   callcc {|cont|  cont.call 1, 2, 3 }   #=&gt; [1, 2, 3]\n"
full_name: Continuation#call
is_singleton: false
name: call
params: |
  cont.call(args, ...) 
  cont[args, ...]

visibility: public
PK�|[���K��2ri/1.8/system/Continuation/cdesc-Continuation.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Continuation objects are generated by <tt>Kernel#callcc</tt>. They hold a return address and execution context, allowing a nonlocal return to the end of the <tt>callcc</tt> block from anywhere within a program. Continuations are somewhat analogous to a structured version of C's <tt>setjmp/longjmp</tt> (although they contain more state, so you might consider them closer to threads).
- !ruby/struct:SM::Flow::P 
  body: "For instance:"
- !ruby/struct:SM::Flow::VERB 
  body: "   arr = [ &quot;Freddie&quot;, &quot;Herbie&quot;, &quot;Ron&quot;, &quot;Max&quot;, &quot;Ringo&quot; ]\n   callcc{|$cc|}\n   puts(message = arr.shift)\n   $cc.call unless message =~ /Max/\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Freddie\n   Herbie\n   Ron\n   Max\n"
- !ruby/struct:SM::Flow::P 
  body: "This (somewhat contrived) example allows the inner loop to abandon processing early:"
- !ruby/struct:SM::Flow::VERB 
  body: "   callcc {|cont|\n     for i in 0..4\n       print &quot;\\n#{i}: &quot;\n       for j in i*5...(i+1)*5\n         cont.call() if j == 17\n         printf &quot;%3d&quot;, j\n       end\n     end\n   }\n   print &quot;\\n&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   0:   0  1  2  3  4\n   1:   5  6  7  8  9\n   2:  10 11 12 13 14\n   3:  15 16\n"
constants: []

full_name: Continuation
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: call
name: Continuation
superclass: Object
PK�|[�j60;;-ri/1.8/system/WeakRef/weakref_alive%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the referenced object still exists, and false if it has been garbage collected.
full_name: WeakRef#weakref_alive?
is_singleton: false
name: weakref_alive?
params: ()
visibility: public
PK�|[	'"442ri/1.8/system/WeakRef/RefError/cdesc-RefError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: RefError is raised if an object cannot be referenced by a WeakRef.
constants: []

full_name: WeakRef::RefError
includes: []

instance_methods: []

name: RefError
superclass: StandardError
PK�|[hx
�pp(ri/1.8/system/WeakRef/cdesc-WeakRef.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: WeakRef is a class to represent a reference to an object that is not seen by the tracing phase of the garbage collector. This allows the referenced object to be garbage collected as if nothing is referring to it. Because WeakRef delegates method calls to the referenced object, it may be used in place of that object, i.e. it is of the same duck type.
- !ruby/struct:SM::Flow::P 
  body: "Usage:"
- !ruby/struct:SM::Flow::VERB 
  body: "  foo = Object.new\n  foo = Object.new\n  p foo.to_s                  # original's class\n  foo = WeakRef.new(foo)\n  p foo.to_s                  # should be same class\n  ObjectSpace.garbage_collect\n  p foo.to_s                  # should raise exception (recycled)\n"
constants: []

full_name: WeakRef
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: __getobj__
- !ruby/object:RI::MethodSummary 
  name: __setobj__
- !ruby/object:RI::MethodSummary 
  name: weakref_alive?
name: WeakRef
superclass: Delegator
PK�|[v�Ӫ��'ri/1.8/system/WeakRef/__getobj__-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the object this WeakRef references. Raises RefError if the object has been garbage collected. The object returned is the object to which method calls are delegated (see Delegator).
full_name: WeakRef#__getobj__
is_singleton: false
name: __getobj__
params: ()
visibility: public
PK�|[�|7�� ri/1.8/system/WeakRef/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new WeakRef from <tt>orig</tt>.
full_name: WeakRef::new
is_singleton: true
name: new
params: (orig)
visibility: public
PK�|[�*���'ri/1.8/system/WeakRef/__setobj__-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WeakRef#__setobj__
is_singleton: false
name: __setobj__
params: (obj)
visibility: public
PK�|[/�MSMM(ri/1.8/system/WEBrick/CGI/cdesc-CGI.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: config
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: logger
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: CGIError
  value: Class.new(StandardError)
full_name: WEBrick::CGI
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: service
- !ruby/object:RI::MethodSummary 
  name: start
name: CGI
superclass: Object
PK�|[��\��'ri/1.8/system/WEBrick/CGI/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::CGI#[]
is_singleton: false
name: "[]"
params: (key)
visibility: public
PK�|[l�RQ��(ri/1.8/system/WEBrick/CGI/service-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::CGI#service
is_singleton: false
name: service
params: (req, res)
visibility: public
PK�|[����$ri/1.8/system/WEBrick/CGI/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::CGI::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[g{���&ri/1.8/system/WEBrick/CGI/start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::CGI#start
is_singleton: false
name: start
params: (env=ENV, stdin=$stdin, stdout=$stdout)
visibility: public
PK�|[��t
��,ri/1.8/system/WEBrick/CGI/Socket/cert-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::CGI::Socket#cert
is_singleton: false
name: cert
params: ()
visibility: public
PK�|[�D��,ri/1.8/system/WEBrick/CGI/Socket/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (line)
comment: 
full_name: WEBrick::CGI::Socket#each
is_singleton: false
name: each
params: () {|line| ...}
visibility: public
PK�|[goi��,ri/1.8/system/WEBrick/CGI/Socket/read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::CGI::Socket#read
is_singleton: false
name: read
params: (size=nil)
visibility: public
PK�|[r/�%��1ri/1.8/system/WEBrick/CGI/Socket/peer_cert-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::CGI::Socket#peer_cert
is_singleton: false
name: peer_cert
params: ()
visibility: public
PK�|[S;�,��.ri/1.8/system/WEBrick/CGI/Socket/cipher-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::CGI::Socket#cipher
is_singleton: false
name: cipher
params: ()
visibility: public
PK�|[�Rb���2ri/1.8/system/WEBrick/CGI/Socket/add_header-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::CGI::Socket#add_header
is_singleton: false
name: add_header
params: (envname, hdrname)
visibility: private
PK�|[�����7ri/1.8/system/WEBrick/CGI/Socket/peer_cert_chain-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::CGI::Socket#peer_cert_chain
is_singleton: false
name: peer_cert_chain
params: ()
visibility: public
PK�|[#b���+ri/1.8/system/WEBrick/CGI/Socket/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::CGI::Socket::new
is_singleton: true
name: new
params: (config, env, stdin, stdout)
visibility: public
PK�|[1�-���0ri/1.8/system/WEBrick/CGI/Socket/peeraddr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::CGI::Socket#peeraddr
is_singleton: false
name: peeraddr
params: ()
visibility: public
PK�|[ZI���2ri/1.8/system/WEBrick/CGI/Socket/cdesc-Socket.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WEBrick::CGI::Socket
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: add_header
- !ruby/object:RI::MethodSummary 
  name: addr
- !ruby/object:RI::MethodSummary 
  name: cert
- !ruby/object:RI::MethodSummary 
  name: cipher
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: gets
- !ruby/object:RI::MethodSummary 
  name: input
- !ruby/object:RI::MethodSummary 
  name: peer_cert
- !ruby/object:RI::MethodSummary 
  name: peer_cert_chain
- !ruby/object:RI::MethodSummary 
  name: peeraddr
- !ruby/object:RI::MethodSummary 
  name: read
- !ruby/object:RI::MethodSummary 
  name: request_line
- !ruby/object:RI::MethodSummary 
  name: setup_header
name: Socket
superclass: Object
PK�|[��j��,ri/1.8/system/WEBrick/CGI/Socket/addr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::CGI::Socket#addr
is_singleton: false
name: addr
params: ()
visibility: public
PK�|[�'32��,ri/1.8/system/WEBrick/CGI/Socket/gets-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::CGI::Socket#gets
is_singleton: false
name: gets
params: (eol=LF)
visibility: public
PK�|[�]|ڲ�.ri/1.8/system/WEBrick/CGI/Socket/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::CGI::Socket#<<
is_singleton: false
name: "<<"
params: (data)
visibility: public
PK�|[8��f��-ri/1.8/system/WEBrick/CGI/Socket/input-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::CGI::Socket#input
is_singleton: false
name: input
params: ()
visibility: private
PK�|["�=��4ri/1.8/system/WEBrick/CGI/Socket/setup_header-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::CGI::Socket#setup_header
is_singleton: false
name: setup_header
params: ()
visibility: private
PK�|[3�hv��4ri/1.8/system/WEBrick/CGI/Socket/request_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::CGI::Socket#request_line
is_singleton: false
name: request_line
params: ()
visibility: private
PK�|[Xde���4ri/1.8/system/WEBrick/HTTPUtils/unescape_form-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils#unescape_form
is_singleton: false
name: unescape_form
params: (str)
visibility: public
PK�|[��34ri/1.8/system/WEBrick/HTTPUtils/cdesc-HTTPUtils.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: []

  name: DefaultMimeTypes
  value: "{       \"ai\"    => \"application/postscript\",       \"asc\"   => \"text/plain\",       \"avi\"   => \"video/x-msvideo\",       \"bin\"   => \"application/octet-stream\",       \"bmp\"   => \"image/bmp\",       \"class\" => \"application/octet-stream\",       \"cer\"   => \"application/pkix-cert\",       \"crl\"   => \"application/pkix-crl\",       \"crt\"   => \"application/x-x509-ca-cert\",      #\"crl\"   => \"application/x-pkcs7-crl\",       \"css\"   => \"text/css\",       \"dms\"   => \"application/octet-stream\",       \"doc\"   => \"application/msword\",       \"dvi\"   => \"application/x-dvi\",       \"eps\"   => \"application/postscript\",       \"etx\"   => \"text/x-setext\",       \"exe\"   => \"application/octet-stream\",       \"gif\"   => \"image/gif\",       \"htm\"   => \"text/html\",       \"html\"  => \"text/html\",       \"jpe\"   => \"image/jpeg\",       \"jpeg\"  => \"image/jpeg\",       \"jpg\"   => \"image/jpeg\",       \"lha\"   => \"application/octet-stream\",       \"lzh\"   => \"application/octet-stream\",       \"mov\"   => \"video/quicktime\",       \"mpe\"   => \"video/mpeg\",       \"mpeg\"  => \"video/mpeg\",       \"mpg\"   => \"video/mpeg\",       \"pbm\"   => \"image/x-portable-bitmap\",       \"pdf\"   => \"application/pdf\",       \"pgm\"   => \"image/x-portable-graymap\",       \"png\"   => \"image/png\",       \"pnm\"   => \"image/x-portable-anymap\",       \"ppm\"   => \"image/x-portable-pixmap\",       \"ppt\"   => \"application/vnd.ms-powerpoint\",       \"ps\"    => \"application/postscript\",       \"qt\"    => \"video/quicktime\",       \"ras\"   => \"image/x-cmu-raster\",       \"rb\"    => \"text/plain\",       \"rd\"    => \"text/plain\",       \"rtf\"   => \"application/rtf\",       \"sgm\"   => \"text/sgml\",       \"sgml\"  => \"text/sgml\",       \"tif\"   => \"image/tiff\",       \"tiff\"  => \"image/tiff\",       \"txt\"   => \"text/plain\",       \"xbm\"   => \"image/x-xbitmap\",       \"xls\"   => \"application/vnd.ms-excel\",       \"xml\"   => \"text/xml\",       \"xpm\"   => \"image/x-xpixmap\",       \"xwd\"   => \"image/x-xwindowdump\",       \"zip\"   => \"application/zip\",     }"
- !ruby/object:RI::Constant 
  comment: 
  name: UNESCAPED
  value: _make_regex(control+space+delims+unwise+nonascii)
- !ruby/object:RI::Constant 
  comment: 
  name: UNESCAPED_FORM
  value: _make_regex(reserved+control+delims+unwise+nonascii)
- !ruby/object:RI::Constant 
  comment: 
  name: NONASCII
  value: _make_regex(nonascii)
- !ruby/object:RI::Constant 
  comment: 
  name: ESCAPED
  value: /%([0-9a-fA-F]{2})/
- !ruby/object:RI::Constant 
  comment: 
  name: UNESCAPED_PCHAR
  value: _make_regex!(unreserved+":@&=+$,")
full_name: WEBrick::HTTPUtils
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _escape
- !ruby/object:RI::MethodSummary 
  name: _make_regex
- !ruby/object:RI::MethodSummary 
  name: _make_regex!
- !ruby/object:RI::MethodSummary 
  name: _unescape
- !ruby/object:RI::MethodSummary 
  name: dequote
- !ruby/object:RI::MethodSummary 
  name: escape
- !ruby/object:RI::MethodSummary 
  name: escape8bit
- !ruby/object:RI::MethodSummary 
  name: escape_form
- !ruby/object:RI::MethodSummary 
  name: escape_path
- !ruby/object:RI::MethodSummary 
  name: load_mime_types
- !ruby/object:RI::MethodSummary 
  name: mime_type
- !ruby/object:RI::MethodSummary 
  name: normalize_path
- !ruby/object:RI::MethodSummary 
  name: parse_form_data
- !ruby/object:RI::MethodSummary 
  name: parse_header
- !ruby/object:RI::MethodSummary 
  name: parse_query
- !ruby/object:RI::MethodSummary 
  name: parse_qvalues
- !ruby/object:RI::MethodSummary 
  name: parse_range_header
- !ruby/object:RI::MethodSummary 
  name: quote
- !ruby/object:RI::MethodSummary 
  name: split_header_value
- !ruby/object:RI::MethodSummary 
  name: unescape
- !ruby/object:RI::MethodSummary 
  name: unescape_form
name: HTTPUtils
superclass: 
PK�|[�ꉿ�2ri/1.8/system/WEBrick/HTTPUtils/_make_regex-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils#_make_regex
is_singleton: false
name: _make_regex
params: (str)
visibility: public
PK�|[A=BH��0ri/1.8/system/WEBrick/HTTPUtils/_unescape-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils#_unescape
is_singleton: false
name: _unescape
params: (str, regex)
visibility: public
PK�|[��l̺�6ri/1.8/system/WEBrick/HTTPUtils/FormData/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils::FormData#[]
is_singleton: false
name: "[]"
params: (*key)
visibility: public
PK�|[�҄Z��9ri/1.8/system/WEBrick/HTTPUtils/FormData/each_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (tmp)
comment: 
full_name: WEBrick::HTTPUtils::FormData#each_data
is_singleton: false
name: each_data
params: () {|tmp| ...}
visibility: public
PK�|[�a���6ri/1.8/system/WEBrick/HTTPUtils/FormData/to_ary-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #list"
full_name: WEBrick::HTTPUtils::FormData#to_ary
is_singleton: false
name: to_ary
params: ()
visibility: public
PK�|[-���3ri/1.8/system/WEBrick/HTTPUtils/FormData/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils::FormData::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[�V���6ri/1.8/system/WEBrick/HTTPUtils/FormData/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils::FormData#<<
is_singleton: false
name: "<<"
params: (str)
visibility: public
PK�|[1���4ri/1.8/system/WEBrick/HTTPUtils/FormData/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils::FormData#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[u���4ri/1.8/system/WEBrick/HTTPUtils/FormData/list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: to_ary
block_params: 
comment: 
full_name: WEBrick::HTTPUtils::FormData#list
is_singleton: false
name: list
params: ()
visibility: public
PK�|[����;ri/1.8/system/WEBrick/HTTPUtils/FormData/append_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils::FormData#append_data
is_singleton: false
name: append_data
params: (data)
visibility: public
PK�|[�F,��<ri/1.8/system/WEBrick/HTTPUtils/FormData/cdesc-FormData.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: filename
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: next_data
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: []

constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: EmptyRawHeader
  value: "[].freeze"
- !ruby/object:RI::Constant 
  comment: 
  name: EmptyHeader
  value: "{}.freeze"
full_name: WEBrick::HTTPUtils::FormData
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: append_data
- !ruby/object:RI::MethodSummary 
  name: each_data
- !ruby/object:RI::MethodSummary 
  name: list
- !ruby/object:RI::MethodSummary 
  name: to_ary
- !ruby/object:RI::MethodSummary 
  name: to_s
name: FormData
superclass: String
PK�|[0|Z��5ri/1.8/system/WEBrick/HTTPUtils/_make_regex%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils#_make_regex!
is_singleton: false
name: _make_regex!
params: (str)
visibility: public
PK�|[
� ���0ri/1.8/system/WEBrick/HTTPUtils/mime_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils#mime_type
is_singleton: false
name: mime_type
params: (filename, mime_tab)
visibility: public
PK�|[�����.ri/1.8/system/WEBrick/HTTPUtils/dequote-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: WEBrick::HTTPUtils#dequote
is_singleton: false
name: dequote
params: (str)
visibility: public
PK�|[c���6ri/1.8/system/WEBrick/HTTPUtils/parse_form_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils#parse_form_data
is_singleton: false
name: parse_form_data
params: (io, boundary)
visibility: public
PK�|[��S>��5ri/1.8/system/WEBrick/HTTPUtils/normalize_path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils#normalize_path
is_singleton: false
name: normalize_path
params: (path)
visibility: public
PK�|[|1�Y��2ri/1.8/system/WEBrick/HTTPUtils/escape_path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils#escape_path
is_singleton: false
name: escape_path
params: (str)
visibility: public
PK�|[�/Lo��1ri/1.8/system/WEBrick/HTTPUtils/escape8bit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils#escape8bit
is_singleton: false
name: escape8bit
params: (str)
visibility: public
PK�|[qv����/ri/1.8/system/WEBrick/HTTPUtils/unescape-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils#unescape
is_singleton: false
name: unescape
params: (str)
visibility: public
PK�|[��6���2ri/1.8/system/WEBrick/HTTPUtils/escape_form-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils#escape_form
is_singleton: false
name: escape_form
params: (str)
visibility: public
PK�|[���-ri/1.8/system/WEBrick/HTTPUtils/escape-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils#escape
is_singleton: false
name: escape
params: (str)
visibility: public
PK�|[hM{��3ri/1.8/system/WEBrick/HTTPUtils/parse_header-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: WEBrick::HTTPUtils#parse_header
is_singleton: false
name: parse_header
params: (raw)
visibility: public
PK�|[�t��9ri/1.8/system/WEBrick/HTTPUtils/split_header_value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils#split_header_value
is_singleton: false
name: split_header_value
params: (str)
visibility: public
PK�|[6X1
��,ri/1.8/system/WEBrick/HTTPUtils/quote-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils#quote
is_singleton: false
name: quote
params: (str)
visibility: public
PK�|[A��I6ri/1.8/system/WEBrick/HTTPUtils/load_mime_types-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Load Apache compatible mime.types file.
full_name: WEBrick::HTTPUtils#load_mime_types
is_singleton: false
name: load_mime_types
params: (file)
visibility: public
PK�|[I�=3��9ri/1.8/system/WEBrick/HTTPUtils/parse_range_header-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils#parse_range_header
is_singleton: false
name: parse_range_header
params: (ranges_specifier)
visibility: public
PK�|[�yu���2ri/1.8/system/WEBrick/HTTPUtils/parse_query-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils#parse_query
is_singleton: false
name: parse_query
params: (str)
visibility: public
PK�|[������4ri/1.8/system/WEBrick/HTTPUtils/parse_qvalues-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils#parse_qvalues
is_singleton: false
name: parse_qvalues
params: (value)
visibility: public
PK�|[7��.ri/1.8/system/WEBrick/HTTPUtils/_escape-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPUtils#_escape
is_singleton: false
name: _escape
params: (str, regex)
visibility: public
PK�|[�D���(ri/1.8/system/WEBrick/cdesc-WEBrick.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: accesslog.rb -- Access log handling utilities
- !ruby/struct:SM::Flow::P 
  body: "Author: IPR -- Internet Programming with Ruby -- writers Copyright (c) 2002 keita yamaguchi Copyright (c) 2002 Internet Programming with Ruby writers"
- !ruby/struct:SM::Flow::P 
  body: "$IPR: accesslog.rb,v 1.1 2002/10/01 17:16:32 gotoyuzo Exp $"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: NullReader
  value: Object.new
- !ruby/object:RI::Constant 
  comment: 
  name: VERSION
  value: "\"1.3.1\""
- !ruby/object:RI::Constant 
  comment: 
  name: CR
  value: "\"\\x0d\""
- !ruby/object:RI::Constant 
  comment: 
  name: LF
  value: "\"\\x0a\""
- !ruby/object:RI::Constant 
  comment: 
  name: CRLF
  value: "\"\\x0d\\x0a\""
full_name: WEBrick
includes: []

instance_methods: []

name: WEBrick
superclass: 
PK�|[��zh��/ri/1.8/system/WEBrick/SimpleServer/start-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
full_name: WEBrick::SimpleServer::start
is_singleton: true
name: start
params: () {|| ...}
visibility: public
PK�|[b.���:ri/1.8/system/WEBrick/SimpleServer/cdesc-SimpleServer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: start
comment: 
constants: []

full_name: WEBrick::SimpleServer
includes: []

instance_methods: []

name: SimpleServer
superclass: Object
PK�|[��7���-ri/1.8/system/WEBrick/HTMLUtils/escape-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTMLUtils#escape
is_singleton: false
name: escape
params: (string)
visibility: public
PK�|[�p����4ri/1.8/system/WEBrick/HTMLUtils/cdesc-HTMLUtils.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WEBrick::HTMLUtils
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: escape
name: HTMLUtils
superclass: 
PK�|[T�F��$ri/1.8/system/WEBrick/Log/log-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::Log#log
is_singleton: false
name: log
params: (level, data)
visibility: public
PK�|[�l5���$ri/1.8/system/WEBrick/Log/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::Log::new
is_singleton: true
name: new
params: (log_file=nil, level=nil)
visibility: public
PK�|[�?Q��(ri/1.8/system/WEBrick/Log/cdesc-Log.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: time_format
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WEBrick::Log
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: debug
- !ruby/object:RI::MethodSummary 
  name: log
name: Log
superclass: BasicLog
PK�|[��n��&ri/1.8/system/WEBrick/Log/debug-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
full_name: WEBrick::Log#debug
is_singleton: false
name: debug
params: (msg = nil) {|| ...}
visibility: public
PK�|[��Q��*ri/1.8/system/WEBrick/BasicLog/info-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::BasicLog#info
is_singleton: false
name: info
params: (msg)
visibility: public
PK�|[;5�h��-ri/1.8/system/WEBrick/BasicLog/info%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::BasicLog#info?
is_singleton: false
name: info?
params: ()
visibility: public
PK�|[��[��+ri/1.8/system/WEBrick/BasicLog/error-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::BasicLog#error
is_singleton: false
name: error
params: (msg)
visibility: public
PK�|[4e��.ri/1.8/system/WEBrick/BasicLog/fatal%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::BasicLog#fatal?
is_singleton: false
name: fatal?
params: ()
visibility: public
PK�|[����+ri/1.8/system/WEBrick/BasicLog/fatal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::BasicLog#fatal
is_singleton: false
name: fatal
params: (msg)
visibility: public
PK�|[�U�i��)ri/1.8/system/WEBrick/BasicLog/log-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::BasicLog#log
is_singleton: false
name: log
params: (level, data)
visibility: public
PK�|[IW(���)ri/1.8/system/WEBrick/BasicLog/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::BasicLog::new
is_singleton: true
name: new
params: (log_file=nil, level=nil)
visibility: public
PK�|[Թ�Q��,ri/1.8/system/WEBrick/BasicLog/format-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::BasicLog#format
is_singleton: false
name: format
params: (arg)
visibility: private
PK�|[�Ż'��,ri/1.8/system/WEBrick/BasicLog/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::BasicLog#<<
is_singleton: false
name: "<<"
params: (obj)
visibility: public
PK�|[��h��+ri/1.8/system/WEBrick/BasicLog/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::BasicLog#close
is_singleton: false
name: close
params: ()
visibility: public
PK�|[kB���.ri/1.8/system/WEBrick/BasicLog/debug%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::BasicLog#debug?
is_singleton: false
name: debug?
params: ()
visibility: public
PK�|[�Ѝ2ri/1.8/system/WEBrick/BasicLog/cdesc-BasicLog.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: level
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: DEBUG
  value: 1, 2, 3, 4, 5
full_name: WEBrick::BasicLog
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: debug
- !ruby/object:RI::MethodSummary 
  name: debug?
- !ruby/object:RI::MethodSummary 
  name: error
- !ruby/object:RI::MethodSummary 
  name: error?
- !ruby/object:RI::MethodSummary 
  name: fatal
- !ruby/object:RI::MethodSummary 
  name: fatal?
- !ruby/object:RI::MethodSummary 
  name: format
- !ruby/object:RI::MethodSummary 
  name: info
- !ruby/object:RI::MethodSummary 
  name: info?
- !ruby/object:RI::MethodSummary 
  name: log
- !ruby/object:RI::MethodSummary 
  name: warn
- !ruby/object:RI::MethodSummary 
  name: warn?
name: BasicLog
superclass: Object
PK�|[d�_���.ri/1.8/system/WEBrick/BasicLog/error%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::BasicLog#error?
is_singleton: false
name: error?
params: ()
visibility: public
PK�|[����-ri/1.8/system/WEBrick/BasicLog/warn%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::BasicLog#warn?
is_singleton: false
name: warn?
params: ()
visibility: public
PK�|[��]D��+ri/1.8/system/WEBrick/BasicLog/debug-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::BasicLog#debug
is_singleton: false
name: debug
params: (msg)
visibility: public
PK�|[,U���*ri/1.8/system/WEBrick/BasicLog/warn-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::BasicLog#warn
is_singleton: false
name: warn
params: (msg)
visibility: public
PK�|[I�r��0ri/1.8/system/WEBrick/Utils/getservername-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::Utils#getservername
is_singleton: false
name: getservername
params: ()
visibility: public
PK�|[9D���0ri/1.8/system/WEBrick/Utils/random_string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::Utils#random_string
is_singleton: false
name: random_string
params: (len)
visibility: public
PK�|[���_��3ri/1.8/system/WEBrick/Utils/set_non_blocking-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::Utils#set_non_blocking
is_singleton: false
name: set_non_blocking
params: (io)
visibility: public
PK�|[RAc��,ri/1.8/system/WEBrick/Utils/cdesc-Utils.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: RAND_CHARS
  value: "\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\" +                  \"0123456789\" +                  \"abcdefghijklmnopqrstuvwxyz\""
full_name: WEBrick::Utils
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: create_listeners
- !ruby/object:RI::MethodSummary 
  name: create_self_signed_cert
- !ruby/object:RI::MethodSummary 
  name: getservername
- !ruby/object:RI::MethodSummary 
  name: random_string
- !ruby/object:RI::MethodSummary 
  name: set_close_on_exec
- !ruby/object:RI::MethodSummary 
  name: set_non_blocking
- !ruby/object:RI::MethodSummary 
  name: su
name: Utils
superclass: 
PK�|[,
�m��3ri/1.8/system/WEBrick/Utils/create_listeners-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::Utils#create_listeners
is_singleton: false
name: create_listeners
params: (address, port, logger=nil)
visibility: public
PK�|[�����:ri/1.8/system/WEBrick/Utils/create_self_signed_cert-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::Utils#create_self_signed_cert
is_singleton: false
name: create_self_signed_cert
params: (bits, cn, comment)
visibility: public
PK�|[�����%ri/1.8/system/WEBrick/Utils/su-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::Utils#su
is_singleton: false
name: su
params: (user)
visibility: public
PK�|[
Xp[��4ri/1.8/system/WEBrick/Utils/set_close_on_exec-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::Utils#set_close_on_exec
is_singleton: false
name: set_close_on_exec
params: (io)
visibility: public
PK�|[
p���.ri/1.8/system/WEBrick/Cookie/expires%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::Cookie#expires=
is_singleton: false
name: expires=
params: (t)
visibility: public
PK�|[��uF��5ri/1.8/system/WEBrick/Cookie/parse_set_cookies-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::Cookie::parse_set_cookies
is_singleton: true
name: parse_set_cookies
params: (str)
visibility: public
PK�|[���n//.ri/1.8/system/WEBrick/Cookie/cdesc-Cookie.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: comment
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: domain
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: max_age
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: path
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: secure
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: value
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: version
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: parse_set_cookie
- !ruby/object:RI::MethodSummary 
  name: parse_set_cookies
comment: 
constants: []

full_name: WEBrick::Cookie
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: expires
- !ruby/object:RI::MethodSummary 
  name: expires=
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Cookie
superclass: Object
PK�|[����BB)ri/1.8/system/WEBrick/Cookie/parse-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Cookie::parse()
- !ruby/struct:SM::Flow::VERB 
  body: "  It parses Cookie field sent from the user agent.\n"
full_name: WEBrick::Cookie::parse
is_singleton: true
name: parse
params: (str)
visibility: public
PK�|[m�"'ri/1.8/system/WEBrick/Cookie/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: attr_accessor :comment_url, :discard, :port
full_name: WEBrick::Cookie::new
is_singleton: true
name: new
params: (name, value)
visibility: public
PK�|[u�m���+ri/1.8/system/WEBrick/Cookie/expires-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::Cookie#expires
is_singleton: false
name: expires
params: ()
visibility: public
PK�|[�t��(ri/1.8/system/WEBrick/Cookie/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::Cookie#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[�9���4ri/1.8/system/WEBrick/Cookie/parse_set_cookie-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::Cookie::parse_set_cookie
is_singleton: true
name: parse_set_cookie
params: (str)
visibility: public
PK�|[�y"���Hri/1.8/system/WEBrick/AccessLog/AccessLogError/cdesc-AccessLogError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WEBrick::AccessLog::AccessLogError
includes: []

instance_methods: []

name: AccessLogError
superclass: StandardError
PK�|[߰���4ri/1.8/system/WEBrick/AccessLog/cdesc-AccessLog.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: CLF_TIME_FORMAT
  value: "\"[%d/%b/%Y:%H:%M:%S %Z]\""
- !ruby/object:RI::Constant 
  comment: 
  name: COMMON_LOG_FORMAT
  value: "\"%h %l %u %t \\\"%r\\\" %s %b\""
- !ruby/object:RI::Constant 
  comment: 
  name: CLF
  value: COMMON_LOG_FORMAT
- !ruby/object:RI::Constant 
  comment: 
  name: REFERER_LOG_FORMAT
  value: "\"%{Referer}i -> %U\""
- !ruby/object:RI::Constant 
  comment: 
  name: AGENT_LOG_FORMAT
  value: "\"%{User-Agent}i\""
- !ruby/object:RI::Constant 
  comment: 
  name: COMBINED_LOG_FORMAT
  value: "\"#{CLF} \\\"%{Referer}i\\\" \\\"%{User-agent}i\\\"\""
full_name: WEBrick::AccessLog
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: escape
- !ruby/object:RI::MethodSummary 
  name: format
- !ruby/object:RI::MethodSummary 
  name: setup_params
name: AccessLog
superclass: 
PK�|[^Q�϶�-ri/1.8/system/WEBrick/AccessLog/escape-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::AccessLog#escape
is_singleton: false
name: escape
params: (data)
visibility: public
PK�|[�����-ri/1.8/system/WEBrick/AccessLog/format-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::AccessLog#format
is_singleton: false
name: format
params: (format_string, params)
visibility: public
PK�|[�n���3ri/1.8/system/WEBrick/AccessLog/setup_params-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: This format specification is a subset of mod_log_config of Apache.
- !ruby/struct:SM::Flow::VERB 
  body: "  http://httpd.apache.org/docs/mod/mod_log_config.html#formats\n"
full_name: WEBrick::AccessLog#setup_params
is_singleton: false
name: setup_params
params: (config, req, res)
visibility: public
PK�|[�w�:��4ri/1.8/system/WEBrick/HTTPResponse/chunked%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#chunked=
is_singleton: false
name: chunked=
params: (val)
visibility: public
PK�|[�����5ri/1.8/system/WEBrick/HTTPResponse/status_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#status_line
is_singleton: false
name: status_line
params: ()
visibility: public
PK�|[�J�q��0ri/1.8/system/WEBrick/HTTPResponse/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#[]
is_singleton: false
name: "[]"
params: (field)
visibility: public
PK�|[�M<v��.ri/1.8/system/WEBrick/HTTPResponse/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (k, v)
comment: 
full_name: WEBrick::HTTPResponse#each
is_singleton: false
name: each
params: () {|k, v| ...}
visibility: public
PK�|[LBN7��5ri/1.8/system/WEBrick/HTTPResponse/_write_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#_write_data
is_singleton: false
name: _write_data
params: (socket, data)
visibility: private
PK�|[n�k8��6ri/1.8/system/WEBrick/HTTPResponse/set_redirect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#set_redirect
is_singleton: false
name: set_redirect
params: (status, url)
visibility: public
PK�|[�FoU��;ri/1.8/system/WEBrick/HTTPResponse/content_length%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#content_length=
is_singleton: false
name: content_length=
params: (len)
visibility: public
PK�|[��z��9ri/1.8/system/WEBrick/HTTPResponse/content_type%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#content_type=
is_singleton: false
name: content_type=
params: (type)
visibility: public
PK�|[9����3ri/1.8/system/WEBrick/HTTPResponse/set_error-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#set_error
is_singleton: false
name: set_error
params: (ex, backtrace=false)
visibility: public
PK�|[�M��6ri/1.8/system/WEBrick/HTTPResponse/content_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#content_type
is_singleton: false
name: content_type
params: ()
visibility: public
PK�|[5��.��-ri/1.8/system/WEBrick/HTTPResponse/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse::new
is_singleton: true
name: new
params: (config)
visibility: public
PK�|[�<��4ri/1.8/system/WEBrick/HTTPResponse/_send_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#_send_file
is_singleton: false
name: _send_file
params: (output, input, offset, size)
visibility: private
PK�|[a�'���8ri/1.8/system/WEBrick/HTTPResponse/content_length-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#content_length
is_singleton: false
name: content_length
params: ()
visibility: public
PK�|[]O���7ri/1.8/system/WEBrick/HTTPResponse/send_response-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#send_response
is_singleton: false
name: send_response
params: (socket)
visibility: public
PK�|[M�5��3ri/1.8/system/WEBrick/HTTPResponse/send_body-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#send_body
is_singleton: false
name: send_body
params: (socket)
visibility: public
PK�|[Ӈ��3ri/1.8/system/WEBrick/HTTPResponse/status%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#status=
is_singleton: false
name: status=
params: (status)
visibility: public
PK�|[����:ri/1.8/system/WEBrick/HTTPResponse/send_body_string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#send_body_string
is_singleton: false
name: send_body_string
params: (socket)
visibility: private
PK�|[a\W%��.ri/1.8/system/WEBrick/HTTPResponse/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[�?����5ri/1.8/system/WEBrick/HTTPResponse/send_header-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#send_header
is_singleton: false
name: send_header
params: (socket)
visibility: public
PK�|[�\HD��7ri/1.8/system/WEBrick/HTTPResponse/keep_alive%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#keep_alive?
is_singleton: false
name: keep_alive?
params: ()
visibility: public
PK�|[�DM�	�	:ri/1.8/system/WEBrick/HTTPResponse/cdesc-HTTPResponse.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: body
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: config
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: cookies
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: filename
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: header
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: http_version
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: keep_alive
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: reason_phrase
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: request_http_version
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: request_method
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: request_uri
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: sent_size
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: status
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: BUFSIZE
  value: 1024*4
full_name: WEBrick::HTTPResponse
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: _send_file
- !ruby/object:RI::MethodSummary 
  name: _write_data
- !ruby/object:RI::MethodSummary 
  name: chunked=
- !ruby/object:RI::MethodSummary 
  name: chunked?
- !ruby/object:RI::MethodSummary 
  name: content_length
- !ruby/object:RI::MethodSummary 
  name: content_length=
- !ruby/object:RI::MethodSummary 
  name: content_type
- !ruby/object:RI::MethodSummary 
  name: content_type=
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: keep_alive?
- !ruby/object:RI::MethodSummary 
  name: send_body
- !ruby/object:RI::MethodSummary 
  name: send_body_io
- !ruby/object:RI::MethodSummary 
  name: send_body_string
- !ruby/object:RI::MethodSummary 
  name: send_header
- !ruby/object:RI::MethodSummary 
  name: send_response
- !ruby/object:RI::MethodSummary 
  name: set_error
- !ruby/object:RI::MethodSummary 
  name: set_redirect
- !ruby/object:RI::MethodSummary 
  name: setup_header
- !ruby/object:RI::MethodSummary 
  name: status=
- !ruby/object:RI::MethodSummary 
  name: status_line
- !ruby/object:RI::MethodSummary 
  name: to_s
name: HTTPResponse
superclass: Object
PK�|['[ʫ��6ri/1.8/system/WEBrick/HTTPResponse/setup_header-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#setup_header
is_singleton: false
name: setup_header
params: ()
visibility: public
PK�|[\�x���6ri/1.8/system/WEBrick/HTTPResponse/send_body_io-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#send_body_io
is_singleton: false
name: send_body_io
params: (socket)
visibility: private
PK�|[c_f��3ri/1.8/system/WEBrick/HTTPResponse/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#[]=
is_singleton: false
name: "[]="
params: (field, value)
visibility: public
PK�|[f���4ri/1.8/system/WEBrick/HTTPResponse/chunked%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPResponse#chunked?
is_singleton: false
name: chunked?
params: ()
visibility: public
PK�|[�M��@ri/1.8/system/WEBrick/HTTPServerError/cdesc-HTTPServerError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WEBrick::HTTPServerError
includes: []

instance_methods: []

name: HTTPServerError
superclass: ServerError
PK�|[�G7ɳ�1ri/1.8/system/WEBrick/GenericServer/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::GenericServer#[]
is_singleton: false
name: "[]"
params: (key)
visibility: public
PK�|[W���6ri/1.8/system/WEBrick/GenericServer/ssl_context-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::GenericServer#ssl_context
is_singleton: false
name: ssl_context
params: ()
visibility: public
PK�|[�ᓺ�3ri/1.8/system/WEBrick/GenericServer/shutdown-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::GenericServer#shutdown
is_singleton: false
name: shutdown
params: ()
visibility: public
PK�|[/��ݲ�/ri/1.8/system/WEBrick/GenericServer/stop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::GenericServer#stop
is_singleton: false
name: stop
params: ()
visibility: public
PK�|[�'���7ri/1.8/system/WEBrick/GenericServer/start_thread-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::GenericServer#start_thread
is_singleton: false
name: start_thread
params: (sock, &block)
visibility: private
PK�|[��t��<ri/1.8/system/WEBrick/GenericServer/setup_ssl_context-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::GenericServer#setup_ssl_context
is_singleton: false
name: setup_ssl_context
params: (config)
visibility: public
PK�|[�b���.ri/1.8/system/WEBrick/GenericServer/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::GenericServer::new
is_singleton: true
name: new
params: (config={}, default=Config::General)
visibility: public
PK�|[DB��<ri/1.8/system/WEBrick/GenericServer/cdesc-GenericServer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: config
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: listeners
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: logger
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: status
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: tokens
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WEBrick::GenericServer
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: accept_client
- !ruby/object:RI::MethodSummary 
  name: call_callback
- !ruby/object:RI::MethodSummary 
  name: listen
- !ruby/object:RI::MethodSummary 
  name: listen
- !ruby/object:RI::MethodSummary 
  name: run
- !ruby/object:RI::MethodSummary 
  name: setup_ssl_context
- !ruby/object:RI::MethodSummary 
  name: shutdown
- !ruby/object:RI::MethodSummary 
  name: ssl_context
- !ruby/object:RI::MethodSummary 
  name: start
- !ruby/object:RI::MethodSummary 
  name: start_thread
- !ruby/object:RI::MethodSummary 
  name: stop
name: GenericServer
superclass: Object
PK�|[�o�Ѻ�0ri/1.8/system/WEBrick/GenericServer/start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::GenericServer#start
is_singleton: false
name: start
params: (&block)
visibility: public
PK�|[I�6���8ri/1.8/system/WEBrick/GenericServer/call_callback-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::GenericServer#call_callback
is_singleton: false
name: call_callback
params: (callback_name, *args)
visibility: private
PK�|[Q�	B��1ri/1.8/system/WEBrick/GenericServer/listen-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::GenericServer#listen
is_singleton: false
name: listen
params: (address, port)
visibility: public
PK�|[u2 ��.ri/1.8/system/WEBrick/GenericServer/run-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::GenericServer#run
is_singleton: false
name: run
params: (sock)
visibility: public
PK�|[��<���8ri/1.8/system/WEBrick/GenericServer/accept_client-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::GenericServer#accept_client
is_singleton: false
name: accept_client
params: (svr)
visibility: private
PK�|[�P���.ri/1.8/system/WEBrick/HTTPServer/umount-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #unmount"
full_name: WEBrick::HTTPServer#umount
is_singleton: false
name: umount
params: (dir)
visibility: public
PK�|[����5ri/1.8/system/WEBrick/HTTPServer/lookup_server-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServer#lookup_server
is_singleton: false
name: lookup_server
params: (req)
visibility: public
PK�|[Ua����-ri/1.8/system/WEBrick/HTTPServer/mount-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServer#mount
is_singleton: false
name: mount
params: (dir, servlet, *options)
visibility: public
PK�|[?��U��2ri/1.8/system/WEBrick/HTTPServer/do_OPTIONS-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServer#do_OPTIONS
is_singleton: false
name: do_OPTIONS
params: (req, res)
visibility: public
PK�|[���h��/ri/1.8/system/WEBrick/HTTPServer/service-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServer#service
is_singleton: false
name: service
params: (req, res)
visibility: public
PK�|[l�}&��2ri/1.8/system/WEBrick/HTTPServer/mount_proc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServer#mount_proc
is_singleton: false
name: mount_proc
params: (dir, proc=nil, &block)
visibility: public
PK�|[�v"��+ri/1.8/system/WEBrick/HTTPServer/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServer::new
is_singleton: true
name: new
params: (config={}, default=Config::HTTP)
visibility: public
PK�|[��,��6ri/1.8/system/WEBrick/HTTPServer/search_servlet-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServer#search_servlet
is_singleton: false
name: search_servlet
params: (path)
visibility: public
PK�|[��l��9ri/1.8/system/WEBrick/HTTPServer/MountTable/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServer::MountTable#[]
is_singleton: false
name: "[]"
params: (dir)
visibility: public
PK�|[8fo��:ri/1.8/system/WEBrick/HTTPServer/MountTable/compile-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServer::MountTable#compile
is_singleton: false
name: compile
params: ()
visibility: private
PK�|[m5���9ri/1.8/system/WEBrick/HTTPServer/MountTable/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServer::MountTable#delete
is_singleton: false
name: delete
params: (dir)
visibility: public
PK�|[O΄a��<ri/1.8/system/WEBrick/HTTPServer/MountTable/normalize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServer::MountTable#normalize
is_singleton: false
name: normalize
params: (dir)
visibility: private
PK�|[��'Z��7ri/1.8/system/WEBrick/HTTPServer/MountTable/scan-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServer::MountTable#scan
is_singleton: false
name: scan
params: (path)
visibility: public
PK�|[�vz(��6ri/1.8/system/WEBrick/HTTPServer/MountTable/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServer::MountTable::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[4ҫ##Ari/1.8/system/WEBrick/HTTPServer/MountTable/cdesc-MountTable.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WEBrick::HTTPServer::MountTable
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: compile
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: normalize
- !ruby/object:RI::MethodSummary 
  name: scan
name: MountTable
superclass: Object
PK�|[F�]���<ri/1.8/system/WEBrick/HTTPServer/MountTable/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServer::MountTable#[]=
is_singleton: false
name: "[]="
params: (dir, val)
visibility: public
PK�|[�����/ri/1.8/system/WEBrick/HTTPServer/unmount-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: umount
block_params: 
comment: 
full_name: WEBrick::HTTPServer#unmount
is_singleton: false
name: unmount
params: (dir)
visibility: public
PK�|[���#��2ri/1.8/system/WEBrick/HTTPServer/access_log-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServer#access_log
is_singleton: false
name: access_log
params: (config, req, res)
visibility: public
PK�|[��ڱ�+ri/1.8/system/WEBrick/HTTPServer/run-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServer#run
is_singleton: false
name: run
params: (sock)
visibility: public
PK�|[��,��4ri/1.8/system/WEBrick/HTTPServer/virtual_host-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServer#virtual_host
is_singleton: false
name: virtual_host
params: (server)
visibility: public
PK�|[1&��@@6ri/1.8/system/WEBrick/HTTPServer/cdesc-HTTPServer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WEBrick::HTTPServer
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: access_log
- !ruby/object:RI::MethodSummary 
  name: do_OPTIONS
- !ruby/object:RI::MethodSummary 
  name: lookup_server
- !ruby/object:RI::MethodSummary 
  name: mount
- !ruby/object:RI::MethodSummary 
  name: mount_proc
- !ruby/object:RI::MethodSummary 
  name: run
- !ruby/object:RI::MethodSummary 
  name: search_servlet
- !ruby/object:RI::MethodSummary 
  name: service
- !ruby/object:RI::MethodSummary 
  name: umount
- !ruby/object:RI::MethodSummary 
  name: unmount
- !ruby/object:RI::MethodSummary 
  name: virtual_host
name: HTTPServer
superclass: "::WEBrick::GenericServer"
PK�|[�����2ri/1.8/system/WEBrick/HTTPVersion/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPVersion#<=>
is_singleton: false
name: <=>
params: (other)
visibility: public
PK�|[:�R���0ri/1.8/system/WEBrick/HTTPVersion/convert-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPVersion::convert
is_singleton: true
name: convert
params: (version)
visibility: public
PK�|[�[G�558ri/1.8/system/WEBrick/HTTPVersion/cdesc-HTTPVersion.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: major
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: minor
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: convert
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WEBrick::HTTPVersion
includes: 
- !ruby/object:RI::IncludedModule 
  name: Comparable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: to_s
name: HTTPVersion
superclass: Object
PK�|[A}����,ri/1.8/system/WEBrick/HTTPVersion/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPVersion::new
is_singleton: true
name: new
params: (version)
visibility: public
PK�|[��A��-ri/1.8/system/WEBrick/HTTPVersion/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPVersion#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[�^���4ri/1.8/system/WEBrick/HTTPAuth/Htdigest/flush-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Htdigest#flush
is_singleton: false
name: flush
params: (output=nil)
visibility: public
PK�|[B�=s��3ri/1.8/system/WEBrick/HTTPAuth/Htdigest/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ([user, realm, hash[user]])
comment: 
full_name: WEBrick::HTTPAuth::Htdigest#each
is_singleton: false
name: each
params: () {|[user, realm, hash[user]]| ...}
visibility: public
PK�|[�64ջ�5ri/1.8/system/WEBrick/HTTPAuth/Htdigest/reload-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Htdigest#reload
is_singleton: false
name: reload
params: ()
visibility: public
PK�|[b�#��9ri/1.8/system/WEBrick/HTTPAuth/Htdigest/get_passwd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Htdigest#get_passwd
is_singleton: false
name: get_passwd
params: (realm, user, reload_db)
visibility: public
PK�|[-��YY;ri/1.8/system/WEBrick/HTTPAuth/Htdigest/cdesc-Htdigest.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WEBrick::HTTPAuth::Htdigest
includes: 
- !ruby/object:RI::IncludedModule 
  name: UserDB
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: delete_passwd
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: flush
- !ruby/object:RI::MethodSummary 
  name: get_passwd
- !ruby/object:RI::MethodSummary 
  name: reload
- !ruby/object:RI::MethodSummary 
  name: set_passwd
name: Htdigest
superclass: Object
PK�|[�՟��2ri/1.8/system/WEBrick/HTTPAuth/Htdigest/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Htdigest::new
is_singleton: true
name: new
params: (path)
visibility: public
PK�|[�
����9ri/1.8/system/WEBrick/HTTPAuth/Htdigest/set_passwd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Htdigest#set_passwd
is_singleton: false
name: set_passwd
params: (realm, user, pass)
visibility: public
PK�|[�Y����<ri/1.8/system/WEBrick/HTTPAuth/Htdigest/delete_passwd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Htdigest#delete_passwd
is_singleton: false
name: delete_passwd
params: (realm, user)
visibility: public
PK�|[jXdP��4ri/1.8/system/WEBrick/HTTPAuth/Htpasswd/flush-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Htpasswd#flush
is_singleton: false
name: flush
params: (output=nil)
visibility: public
PK�|[���R��3ri/1.8/system/WEBrick/HTTPAuth/Htpasswd/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ([user, @passwd[user]])
comment: 
full_name: WEBrick::HTTPAuth::Htpasswd#each
is_singleton: false
name: each
params: () {|[user, @passwd[user]]| ...}
visibility: public
PK�|[�D����5ri/1.8/system/WEBrick/HTTPAuth/Htpasswd/reload-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Htpasswd#reload
is_singleton: false
name: reload
params: ()
visibility: public
PK�|[��aU��9ri/1.8/system/WEBrick/HTTPAuth/Htpasswd/get_passwd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Htpasswd#get_passwd
is_singleton: false
name: get_passwd
params: (realm, user, reload_db)
visibility: public
PK�|[}����2ri/1.8/system/WEBrick/HTTPAuth/Htpasswd/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Htpasswd::new
is_singleton: true
name: new
params: (path)
visibility: public
PK�|[�E2��9ri/1.8/system/WEBrick/HTTPAuth/Htpasswd/set_passwd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Htpasswd#set_passwd
is_singleton: false
name: set_passwd
params: (realm, user, pass)
visibility: public
PK�|[�Ji��<ri/1.8/system/WEBrick/HTTPAuth/Htpasswd/delete_passwd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Htpasswd#delete_passwd
is_singleton: false
name: delete_passwd
params: (realm, user)
visibility: public
PK�|[g
<DYY;ri/1.8/system/WEBrick/HTTPAuth/Htpasswd/cdesc-Htpasswd.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WEBrick::HTTPAuth::Htpasswd
includes: 
- !ruby/object:RI::IncludedModule 
  name: UserDB
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: delete_passwd
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: flush
- !ruby/object:RI::MethodSummary 
  name: get_passwd
- !ruby/object:RI::MethodSummary 
  name: reload
- !ruby/object:RI::MethodSummary 
  name: set_passwd
name: Htpasswd
superclass: Object
PK�|[�A�S��0ri/1.8/system/WEBrick/HTTPAuth/basic_auth-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth#basic_auth
is_singleton: false
name: basic_auth
params: (req, res, realm, &block)
visibility: public
PK�|[ݤ�1cc2ri/1.8/system/WEBrick/HTTPAuth/cdesc-HTTPAuth.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WEBrick::HTTPAuth
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _basic_auth
- !ruby/object:RI::MethodSummary 
  name: basic_auth
- !ruby/object:RI::MethodSummary 
  name: proxy_basic_auth
name: HTTPAuth
superclass: 
PK�|[�WR	��3ri/1.8/system/WEBrick/HTTPAuth/Htgroup/flush-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Htgroup#flush
is_singleton: false
name: flush
params: (output=nil)
visibility: public
PK�|[�wb��9ri/1.8/system/WEBrick/HTTPAuth/Htgroup/cdesc-Htgroup.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WEBrick::HTTPAuth::Htgroup
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: flush
- !ruby/object:RI::MethodSummary 
  name: members
- !ruby/object:RI::MethodSummary 
  name: reload
name: Htgroup
superclass: Object
PK�|[P�����4ri/1.8/system/WEBrick/HTTPAuth/Htgroup/reload-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Htgroup#reload
is_singleton: false
name: reload
params: ()
visibility: public
PK�|[��%}��1ri/1.8/system/WEBrick/HTTPAuth/Htgroup/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Htgroup#add
is_singleton: false
name: add
params: (group, members)
visibility: public
PK�|[�^VH��1ri/1.8/system/WEBrick/HTTPAuth/Htgroup/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Htgroup::new
is_singleton: true
name: new
params: (path)
visibility: public
PK�|[+���5ri/1.8/system/WEBrick/HTTPAuth/Htgroup/members-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Htgroup#members
is_singleton: false
name: members
params: (group)
visibility: public
PK�|[�p��1ri/1.8/system/WEBrick/HTTPAuth/_basic_auth-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth#_basic_auth
is_singleton: false
name: _basic_auth
params: (req, res, realm, req_field, res_field, err_type, block)
visibility: public
PK�|[4�"]��<ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/check_nonce-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::DigestAuth#check_nonce
is_singleton: false
name: check_nonce
params: (req, auth_req)
visibility: private
PK�|[
V('��=ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/check_opaque-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::DigestAuth#check_opaque
is_singleton: false
name: check_opaque
params: (opaque_struct, req, auth_req)
visibility: private
PK�|[x�-��@ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/generate_opaque-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::DigestAuth#generate_opaque
is_singleton: false
name: generate_opaque
params: (req)
visibility: private
PK�|[(O���:ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/challenge-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::DigestAuth#challenge
is_singleton: false
name: challenge
params: (req, res, stale=false)
visibility: public
PK�|[R���:ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/hexdigest-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::DigestAuth#hexdigest
is_singleton: false
name: hexdigest
params: (*args)
visibility: private
PK�|[�@���<ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/make_passwd-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::DigestAuth::make_passwd
is_singleton: true
name: make_passwd
params: (realm, user, pass)
visibility: public
PK�|[5?����Bri/1.8/system/WEBrick/HTTPAuth/DigestAuth/split_param_value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::DigestAuth#split_param_value
is_singleton: false
name: split_param_value
params: (string)
visibility: private
PK�|[�^����4ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::DigestAuth::new
is_singleton: true
name: new
params: (config, default=Config::DigestAuth)
visibility: public
PK�|[�q��?ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/cdesc-DigestAuth.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: algorithm
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: qop
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: make_passwd
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: AuthScheme
  value: "\"Digest\""
- !ruby/object:RI::Constant 
  comment: 
  name: OpaqueInfo
  value: Struct.new(:time, :nonce, :nc)
- !ruby/object:RI::Constant 
  comment: 
  name: MustParams
  value: "['username','realm','nonce','uri','response']"
- !ruby/object:RI::Constant 
  comment: 
  name: MustParamsAuth
  value: "['cnonce','nc']"
full_name: WEBrick::HTTPAuth::DigestAuth
includes: 
- !ruby/object:RI::IncludedModule 
  name: Authenticator
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _authenticate
- !ruby/object:RI::MethodSummary 
  name: authenticate
- !ruby/object:RI::MethodSummary 
  name: challenge
- !ruby/object:RI::MethodSummary 
  name: check_nonce
- !ruby/object:RI::MethodSummary 
  name: check_opaque
- !ruby/object:RI::MethodSummary 
  name: check_uri
- !ruby/object:RI::MethodSummary 
  name: generate_next_nonce
- !ruby/object:RI::MethodSummary 
  name: generate_opaque
- !ruby/object:RI::MethodSummary 
  name: hexdigest
- !ruby/object:RI::MethodSummary 
  name: split_param_value
name: DigestAuth
superclass: Object
PK�|[yA����Dri/1.8/system/WEBrick/HTTPAuth/DigestAuth/generate_next_nonce-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::DigestAuth#generate_next_nonce
is_singleton: false
name: generate_next_nonce
params: (req)
visibility: private
PK�|[]����=ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/authenticate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::DigestAuth#authenticate
is_singleton: false
name: authenticate
params: (req, res)
visibility: public
PK�|[ �d��:ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/check_uri-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::DigestAuth#check_uri
is_singleton: false
name: check_uri
params: (req, auth_req)
visibility: private
PK�|[O����>ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/_authenticate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::DigestAuth#_authenticate
is_singleton: false
name: _authenticate
params: (req, res)
visibility: private
PK�|[�?8��6ri/1.8/system/WEBrick/HTTPAuth/proxy_basic_auth-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth#proxy_basic_auth
is_singleton: false
name: proxy_basic_auth
params: (req, res, realm, &block)
visibility: public
PK�|[��& qqOri/1.8/system/WEBrick/HTTPAuth/ProxyAuthenticator/cdesc-ProxyAuthenticator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: RequestField
  value: "\"Proxy-Authorization\""
- !ruby/object:RI::Constant 
  comment: 
  name: ResponseField
  value: "\"Proxy-Authenticate\""
- !ruby/object:RI::Constant 
  comment: 
  name: InfoField
  value: "\"Proxy-Authentication-Info\""
- !ruby/object:RI::Constant 
  comment: 
  name: AuthException
  value: HTTPStatus::ProxyAuthenticationRequired
full_name: WEBrick::HTTPAuth::ProxyAuthenticator
includes: []

instance_methods: []

name: ProxyAuthenticator
superclass: 
PK�|[<��RGri/1.8/system/WEBrick/HTTPAuth/ProxyBasicAuth/cdesc-ProxyBasicAuth.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WEBrick::HTTPAuth::ProxyBasicAuth
includes: 
- !ruby/object:RI::IncludedModule 
  name: ProxyAuthenticator
instance_methods: []

name: ProxyBasicAuth
superclass: BasicAuth
PK�|[�c3���8ri/1.8/system/WEBrick/HTTPAuth/Authenticator/info-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Authenticator#info
is_singleton: false
name: info
params: (fmt, *args)
visibility: private
PK�|[���>ri/1.8/system/WEBrick/HTTPAuth/Authenticator/check_init-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Authenticator#check_init
is_singleton: false
name: check_init
params: (config)
visibility: private
PK�|[ӥ���@ri/1.8/system/WEBrick/HTTPAuth/Authenticator/check_scheme-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Authenticator#check_scheme
is_singleton: false
name: check_scheme
params: (req)
visibility: private
PK�|[K0�a��9ri/1.8/system/WEBrick/HTTPAuth/Authenticator/error-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Authenticator#error
is_singleton: false
name: error
params: (fmt, *args)
visibility: private
PK�|[H�g��7ri/1.8/system/WEBrick/HTTPAuth/Authenticator/log-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::Authenticator#log
is_singleton: false
name: log
params: (meth, fmt, *args)
visibility: private
PK�|[޷l*PPEri/1.8/system/WEBrick/HTTPAuth/Authenticator/cdesc-Authenticator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: logger
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: realm
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: userdb
  rw: R
class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: RequestField
  value: "\"Authorization\""
- !ruby/object:RI::Constant 
  comment: 
  name: ResponseField
  value: "\"WWW-Authenticate\""
- !ruby/object:RI::Constant 
  comment: 
  name: ResponseInfoField
  value: "\"Authentication-Info\""
- !ruby/object:RI::Constant 
  comment: 
  name: AuthException
  value: HTTPStatus::Unauthorized
- !ruby/object:RI::Constant 
  comment: 
  name: AuthScheme
  value: nil
full_name: WEBrick::HTTPAuth::Authenticator
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: check_init
- !ruby/object:RI::MethodSummary 
  name: check_scheme
- !ruby/object:RI::MethodSummary 
  name: error
- !ruby/object:RI::MethodSummary 
  name: info
- !ruby/object:RI::MethodSummary 
  name: log
name: Authenticator
superclass: 
PK�|[���1NNIri/1.8/system/WEBrick/HTTPAuth/ProxyDigestAuth/cdesc-ProxyDigestAuth.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WEBrick::HTTPAuth::ProxyDigestAuth
includes: 
- !ruby/object:RI::IncludedModule 
  name: ProxyAuthenticator
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: check_uri
name: ProxyDigestAuth
superclass: DigestAuth
PK�|[�y!��?ri/1.8/system/WEBrick/HTTPAuth/ProxyDigestAuth/check_uri-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::ProxyDigestAuth#check_uri
is_singleton: false
name: check_uri
params: (req, auth_req)
visibility: public
PK�|[�=B���9ri/1.8/system/WEBrick/HTTPAuth/BasicAuth/challenge-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::BasicAuth#challenge
is_singleton: false
name: challenge
params: (req, res)
visibility: public
PK�|[P;'��;ri/1.8/system/WEBrick/HTTPAuth/BasicAuth/make_passwd-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::BasicAuth::make_passwd
is_singleton: true
name: make_passwd
params: (realm, user, pass)
visibility: public
PK�|[8mU��3ri/1.8/system/WEBrick/HTTPAuth/BasicAuth/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::BasicAuth::new
is_singleton: true
name: new
params: (config, default=Config::BasicAuth)
visibility: public
PK�|[�5���<ri/1.8/system/WEBrick/HTTPAuth/BasicAuth/authenticate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::BasicAuth#authenticate
is_singleton: false
name: authenticate
params: (req, res)
visibility: public
PK�|[�TW��=ri/1.8/system/WEBrick/HTTPAuth/BasicAuth/cdesc-BasicAuth.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: logger
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: realm
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: userdb
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: make_passwd
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: AuthScheme
  value: "\"Basic\""
full_name: WEBrick::HTTPAuth::BasicAuth
includes: 
- !ruby/object:RI::IncludedModule 
  name: Authenticator
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: authenticate
- !ruby/object:RI::MethodSummary 
  name: challenge
name: BasicAuth
superclass: Object
PK�|[Jﮥ�7ri/1.8/system/WEBrick/HTTPAuth/UserDB/cdesc-UserDB.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: auth_type
  rw: RW
class_methods: []

comment: 
constants: []

full_name: WEBrick::HTTPAuth::UserDB
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: get_passwd
- !ruby/object:RI::MethodSummary 
  name: make_passwd
- !ruby/object:RI::MethodSummary 
  name: set_passwd
name: UserDB
superclass: 
PK�|[��L��7ri/1.8/system/WEBrick/HTTPAuth/UserDB/get_passwd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::UserDB#get_passwd
is_singleton: false
name: get_passwd
params: (realm, user, reload_db=false)
visibility: public
PK�|[2���8ri/1.8/system/WEBrick/HTTPAuth/UserDB/make_passwd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::UserDB#make_passwd
is_singleton: false
name: make_passwd
params: (realm, user, pass)
visibility: public
PK�|[�@���7ri/1.8/system/WEBrick/HTTPAuth/UserDB/set_passwd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPAuth::UserDB#set_passwd
is_singleton: false
name: set_passwd
params: (realm, user, pass)
visibility: public
PK�|[CѴ���8ri/1.8/system/WEBrick/ServerError/cdesc-ServerError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WEBrick::ServerError
includes: []

instance_methods: []

name: ServerError
superclass: StandardError
PK�|[ɂ���8ri/1.8/system/WEBrick/HTTPRequest/cdesc-HTTPRequest.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: accept
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: accept_charset
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: accept_encoding
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: accept_language
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: addr
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: attributes
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: cipher
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: client_cert
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Header and entity body
  name: cookies
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Header and entity body
  name: header
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Request-URI
  name: host
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: http_version
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: keep_alive
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Request-URI
  name: path
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: path_info
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: peeraddr
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Request-URI
  name: port
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: query_string
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Header and entity body
  name: raw_header
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Request line
  name: request_line
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: request_method
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: request_time
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Request-URI
  name: request_uri
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: script_name
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: server_cert
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: unparsed_uri
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Misc
  name: user
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: BODY_CONTAINABLE_METHODS
  value: "[ \"POST\", \"PUT\" ]"
- !ruby/object:RI::Constant 
  comment: 
  name: BUFSIZE
  value: 1024*4
full_name: WEBrick::HTTPRequest
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: _read_data
- !ruby/object:RI::MethodSummary 
  name: body
- !ruby/object:RI::MethodSummary 
  name: content_length
- !ruby/object:RI::MethodSummary 
  name: content_type
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: fixup
- !ruby/object:RI::MethodSummary 
  name: keep_alive?
- !ruby/object:RI::MethodSummary 
  name: meta_vars
- !ruby/object:RI::MethodSummary 
  name: meta_vars
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: parse_query
- !ruby/object:RI::MethodSummary 
  name: parse_uri
- !ruby/object:RI::MethodSummary 
  name: parse_uri
- !ruby/object:RI::MethodSummary 
  name: query
- !ruby/object:RI::MethodSummary 
  name: read_body
- !ruby/object:RI::MethodSummary 
  name: read_chunk_size
- !ruby/object:RI::MethodSummary 
  name: read_chunked
- !ruby/object:RI::MethodSummary 
  name: read_data
- !ruby/object:RI::MethodSummary 
  name: read_header
- !ruby/object:RI::MethodSummary 
  name: read_line
- !ruby/object:RI::MethodSummary 
  name: read_request_line
- !ruby/object:RI::MethodSummary 
  name: to_s
name: HTTPRequest
superclass: Object
PK�|[�:���/ri/1.8/system/WEBrick/HTTPRequest/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#[]
is_singleton: false
name: "[]"
params: (header_name)
visibility: public
PK�|[z�L-ri/1.8/system/WEBrick/HTTPRequest/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: "(k, value.empty? ? nil : value.join(\", \"))"
comment: 
full_name: WEBrick::HTTPRequest#each
is_singleton: false
name: each
params: "() {|k, value.empty? ? nil : value.join(\", \")| ...}"
visibility: public
PK�|[��A}��-ri/1.8/system/WEBrick/HTTPRequest/body-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#body
is_singleton: false
name: body
params: (&block)
visibility: public
PK�|[*�ۼ�.ri/1.8/system/WEBrick/HTTPRequest/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#parse
is_singleton: false
name: parse
params: (socket=nil)
visibility: public
PK�|[�k}���4ri/1.8/system/WEBrick/HTTPRequest/read_header-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#read_header
is_singleton: false
name: read_header
params: (socket)
visibility: private
PK�|[#�Z��5ri/1.8/system/WEBrick/HTTPRequest/content_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#content_type
is_singleton: false
name: content_type
params: ()
visibility: public
PK�|[�x���2ri/1.8/system/WEBrick/HTTPRequest/parse_uri-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#parse_uri
is_singleton: false
name: parse_uri
params: (str, scheme="https")
visibility: public
PK�|[��w&��,ri/1.8/system/WEBrick/HTTPRequest/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest::new
is_singleton: true
name: new
params: (config)
visibility: public
PK�|[1~�^��5ri/1.8/system/WEBrick/HTTPRequest/read_chunked-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#read_chunked
is_singleton: false
name: read_chunked
params: (socket, block)
visibility: private
PK�|[
ĕw��:ri/1.8/system/WEBrick/HTTPRequest/read_request_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#read_request_line
is_singleton: false
name: read_request_line
params: (socket)
visibility: private
PK�|[
�7���7ri/1.8/system/WEBrick/HTTPRequest/content_length-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#content_length
is_singleton: false
name: content_length
params: ()
visibility: public
PK�|["Vط��2ri/1.8/system/WEBrick/HTTPRequest/read_body-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#read_body
is_singleton: false
name: read_body
params: (socket, block)
visibility: private
PK�|[��Z8��4ri/1.8/system/WEBrick/HTTPRequest/parse_query-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#parse_query
is_singleton: false
name: parse_query
params: ()
visibility: private
PK�|[D�����-ri/1.8/system/WEBrick/HTTPRequest/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[�͕��3ri/1.8/system/WEBrick/HTTPRequest/_read_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#_read_data
is_singleton: false
name: _read_data
params: (io, method, arg)
visibility: private
PK�|[��G��6ri/1.8/system/WEBrick/HTTPRequest/keep_alive%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#keep_alive?
is_singleton: false
name: keep_alive?
params: ()
visibility: public
PK�|[y7vѲ�.ri/1.8/system/WEBrick/HTTPRequest/fixup-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#fixup
is_singleton: false
name: fixup
params: ()
visibility: public
PK�|[�q��2ri/1.8/system/WEBrick/HTTPRequest/read_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#read_data
is_singleton: false
name: read_data
params: (io, size)
visibility: private
PK�|[=JO��.ri/1.8/system/WEBrick/HTTPRequest/query-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#query
is_singleton: false
name: query
params: ()
visibility: public
PK�|[	4n��8ri/1.8/system/WEBrick/HTTPRequest/read_chunk_size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#read_chunk_size
is_singleton: false
name: read_chunk_size
params: (socket)
visibility: private
PK�|[�ͣV��2ri/1.8/system/WEBrick/HTTPRequest/meta_vars-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#meta_vars
is_singleton: false
name: meta_vars
params: ()
visibility: public
PK�|[a�D���2ri/1.8/system/WEBrick/HTTPRequest/read_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPRequest#read_line
is_singleton: false
name: read_line
params: (io)
visibility: private
PK�|["�z��.ri/1.8/system/WEBrick/Daemon/cdesc-Daemon.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: start
comment: 
constants: []

full_name: WEBrick::Daemon
includes: []

instance_methods: []

name: Daemon
superclass: Object
PK�|[�Ih��)ri/1.8/system/WEBrick/Daemon/start-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: if block_given?
comment: 
full_name: WEBrick::Daemon::start
is_singleton: true
name: start
params: () {|if block_given?| ...}
visibility: public
PK�|[²Ϡ"".ri/1.8/system/WEBrick/Config/cdesc-Config.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: LIBDIR
  value: File::dirname(__FILE__)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: for GenericServer
  name: General
  value: "{       :ServerName     => Utils::getservername,       :BindAddress    => nil,   # \"0.0.0.0\" or \"::\" or nil       :Port           => nil,   # users MUST specifiy this!!       :MaxClients     => 100,   # maximum number of the concurrent connections       :ServerType     => nil,   # default: WEBrick::SimpleServer       :Logger         => nil,   # default: WEBrick::Log.new       :ServerSoftware => \"WEBrick/#{WEBrick::VERSION} \" +                          \"(Ruby/#{RUBY_VERSION}/#{RUBY_RELEASE_DATE})\",       :TempDir        => ENV['TMPDIR']||ENV['TMP']||ENV['TEMP']||'/tmp',       :DoNotListen    => false,       :StartCallback  => nil,       :StopCallback   => nil,       :AcceptCallback => nil,     }"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: for HTTPServer, HTTPRequest, HTTPResponse ...
  name: HTTP
  value: "General.dup.update(       :Port           => 80,       :RequestTimeout => 30,       :HTTPVersion    => HTTPVersion.new(\"1.1\"),       :AccessLog      => nil,       :MimeTypes      => HTTPUtils::DefaultMimeTypes,       :DirectoryIndex => [\"index.html\",\"index.htm\",\"index.cgi\",\"index.rhtml\"],       :DocumentRoot   => nil,       :DocumentRootOptions => { :FancyIndexing => true },       :RequestHandler => nil,       :RequestCallback => nil,  # alias of :RequestHandler       :ServerAlias    => nil,        # for HTTPProxyServer       :ProxyAuthProc  => nil,       :ProxyContentHandler => nil,       :ProxyVia       => true,       :ProxyTimeout   => true,       :ProxyURI       => nil,        :CGIInterpreter => nil,       :CGIPathEnv     => nil,        # workaround: if Request-URIs contain 8bit chars,       # they should be escaped before calling of URI::parse().       :Escape8bitURI  => false"
- !ruby/object:RI::Constant 
  comment: 
  name: FileHandler
  value: "{       :NondisclosureName => [\".ht*\", \"*~\"],       :FancyIndexing     => false,       :HandlerTable      => {},       :HandlerCallback   => nil,       :DirectoryCallback => nil,       :FileCallback      => nil,       :UserDir           => nil,  # e.g. \"public_html\"       :AcceptableLanguages => []"
- !ruby/object:RI::Constant 
  comment: 
  name: BasicAuth
  value: "{       :AutoReloadUserDB     => true,     }"
- !ruby/object:RI::Constant 
  comment: 
  name: DigestAuth
  value: "{       :Algorithm            => 'MD5-sess', # or 'MD5'        :Domain               => nil,        # an array includes domain names.       :Qop                  => [ 'auth' ], # 'auth' or 'auth-int' or both.       :UseOpaque            => true,       :UseNextNonce         => false,       :CheckNc              => false,       :UseAuthenticationInfoHeader => true,       :AutoReloadUserDB     => true,       :NonceExpirePeriod    => 30*60,       :NonceExpireDelta     => 60,       :InternetExplorerHack => true,       :OperaHack            => true,     }"
- !ruby/object:RI::Constant 
  comment: 
  name: SSL
  value: "{       :ServerSoftware       => \"#{svrsoft} OpenSSL/#{osslv}\",       :SSLEnable            => false,       :SSLCertificate       => nil,       :SSLPrivateKey        => nil,       :SSLClientCA          => nil,       :SSLExtraChainCert    => nil,       :SSLCACertificateFile => nil,       :SSLCACertificatePath => nil,       :SSLCertificateStore  => nil,       :SSLVerifyClient      => ::OpenSSL::SSL::VERIFY_NONE,       :SSLVerifyDepth       => nil,       :SSLVerifyCallback    => nil,   # custom verification       :SSLTimeout           => nil,       :SSLOptions           => nil,       :SSLStartImmediately  => true,       # Must specify if you use auto generated certificate.       :SSLCertName          => nil,       :SSLCertComment       => \"Generated by Ruby/OpenSSL\""
full_name: WEBrick::Config
includes: []

instance_methods: []

name: Config
superclass: 
PK�|[L�0r��:ri/1.8/system/WEBrick/HTTPProxyServer/proxy_service-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPProxyServer#proxy_service
is_singleton: false
name: proxy_service
params: (req, res)
visibility: public
PK�|[5����6ri/1.8/system/WEBrick/HTTPProxyServer/proxy_uri-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPProxyServer#proxy_uri
is_singleton: false
name: proxy_uri
params: (req, res)
visibility: public
PK�|[�����7ri/1.8/system/WEBrick/HTTPProxyServer/do_OPTIONS-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPProxyServer#do_OPTIONS
is_singleton: false
name: do_OPTIONS
params: (req, res)
visibility: public
PK�|[dP���4ri/1.8/system/WEBrick/HTTPProxyServer/service-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPProxyServer#service
is_singleton: false
name: service
params: (req, res)
visibility: public
PK�|[���u��@ri/1.8/system/WEBrick/HTTPProxyServer/cdesc-HTTPProxyServer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Some header fields should not be transferred.
  name: HopByHop
  value: "%w( connection keep-alive proxy-authenticate upgrade                    proxy-authorization te trailers transfer-encoding )"
- !ruby/object:RI::Constant 
  comment: 
  name: ShouldNotTransfer
  value: "%w( set-cookie proxy-connection )"
full_name: WEBrick::HTTPProxyServer
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: choose_header
- !ruby/object:RI::MethodSummary 
  name: do_OPTIONS
- !ruby/object:RI::MethodSummary 
  name: proxy_auth
- !ruby/object:RI::MethodSummary 
  name: proxy_connect
- !ruby/object:RI::MethodSummary 
  name: proxy_service
- !ruby/object:RI::MethodSummary 
  name: proxy_uri
- !ruby/object:RI::MethodSummary 
  name: service
- !ruby/object:RI::MethodSummary 
  name: set_cookie
- !ruby/object:RI::MethodSummary 
  name: set_via
- !ruby/object:RI::MethodSummary 
  name: split_field
name: HTTPProxyServer
superclass: HTTPServer
PK�|[N�/��8ri/1.8/system/WEBrick/HTTPProxyServer/split_field-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPProxyServer#split_field
is_singleton: false
name: split_field
params: (f)
visibility: public
PK�|[/;�a��0ri/1.8/system/WEBrick/HTTPProxyServer/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPProxyServer::new
is_singleton: true
name: new
params: (config)
visibility: public
PK�|[����887ri/1.8/system/WEBrick/HTTPProxyServer/set_cookie-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Net::HTTP is stupid about the multiple header fields. Here is workaround:"
full_name: WEBrick::HTTPProxyServer#set_cookie
is_singleton: false
name: set_cookie
params: (src, dst)
visibility: public
PK�|[\z����7ri/1.8/system/WEBrick/HTTPProxyServer/proxy_auth-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPProxyServer#proxy_auth
is_singleton: false
name: proxy_auth
params: (req, res)
visibility: public
PK�|[@NP��:ri/1.8/system/WEBrick/HTTPProxyServer/choose_header-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPProxyServer#choose_header
is_singleton: false
name: choose_header
params: (src, dst)
visibility: public
PK�|[�uc
��:ri/1.8/system/WEBrick/HTTPProxyServer/proxy_connect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPProxyServer#proxy_connect
is_singleton: false
name: proxy_connect
params: (req, res)
visibility: public
PK�|[����4ri/1.8/system/WEBrick/HTTPProxyServer/set_via-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPProxyServer#set_via
is_singleton: false
name: set_via
params: (h)
visibility: public
PK�|[`��Dri/1.8/system/WEBrick/HTTPServlet/FileHandler/shift_path_info-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::FileHandler#shift_path_info
is_singleton: false
name: shift_path_info
params: (req, res, path_info, base=nil)
visibility: private
PK�|[�p����Ari/1.8/system/WEBrick/HTTPServlet/FileHandler/exec_handler-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::FileHandler#exec_handler
is_singleton: false
name: exec_handler
params: (req, res)
visibility: private
PK�|[��Q���Fri/1.8/system/WEBrick/HTTPServlet/FileHandler/search_index_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::FileHandler#search_index_file
is_singleton: false
name: search_index_file
params: (req, res)
visibility: private
PK�|['�Q��Cri/1.8/system/WEBrick/HTTPServlet/FileHandler/check_filename-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::FileHandler#check_filename
is_singleton: false
name: check_filename
params: (req, res, name)
visibility: private
PK�|[��%��<ri/1.8/system/WEBrick/HTTPServlet/FileHandler/do_POST-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::FileHandler#do_POST
is_singleton: false
name: do_POST
params: (req, res)
visibility: public
PK�|[+>���@ri/1.8/system/WEBrick/HTTPServlet/FileHandler/add_handler-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::FileHandler::add_handler
is_singleton: true
name: add_handler
params: (suffix, handler)
visibility: public
PK�|[��4?��;ri/1.8/system/WEBrick/HTTPServlet/FileHandler/do_GET-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::FileHandler#do_GET
is_singleton: false
name: do_GET
params: (req, res)
visibility: public
PK�|[����Ari/1.8/system/WEBrick/HTTPServlet/FileHandler/set_dir_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::FileHandler#set_dir_list
is_singleton: false
name: set_dir_list
params: (req, res)
visibility: private
PK�|[����?ri/1.8/system/WEBrick/HTTPServlet/FileHandler/do_OPTIONS-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::FileHandler#do_OPTIONS
is_singleton: false
name: do_OPTIONS
params: (req, res)
visibility: public
PK�|[c����<ri/1.8/system/WEBrick/HTTPServlet/FileHandler/service-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::FileHandler#service
is_singleton: false
name: service
params: (req, res)
visibility: public
PK�|[&y����Cri/1.8/system/WEBrick/HTTPServlet/FileHandler/remove_handler-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::FileHandler::remove_handler
is_singleton: true
name: remove_handler
params: (suffix)
visibility: public
PK�|[�wY���8ri/1.8/system/WEBrick/HTTPServlet/FileHandler/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::FileHandler::new
is_singleton: true
name: new
params: (server, root, options={}, default=Config::FileHandler)
visibility: public
PK�|[�/����Jri/1.8/system/WEBrick/HTTPServlet/FileHandler/nondisclosure_name%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::FileHandler#nondisclosure_name?
is_singleton: false
name: nondisclosure_name?
params: (name)
visibility: private
PK�|[	_�%��Bri/1.8/system/WEBrick/HTTPServlet/FileHandler/call_callback-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::FileHandler#call_callback
is_singleton: false
name: call_callback
params: (callback_name, req, res)
visibility: private
PK�|[�s�/

Hri/1.8/system/WEBrick/HTTPServlet/FileHandler/trailing_pathsep%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "RFC3253: Versioning Extensions to WebDAV"
- !ruby/struct:SM::Flow::VERB 
  body: "         (Web Distributed Authoring and Versioning)\n"
- !ruby/struct:SM::Flow::P 
  body: VERSION-CONTROL REPORT CHECKOUT CHECK_IN UNCHECKOUT MKWORKSPACE UPDATE LABEL MERGE ACTIVITY
full_name: WEBrick::HTTPServlet::FileHandler#trailing_pathsep?
is_singleton: false
name: trailing_pathsep?
params: (path)
visibility: private
PK�|[E�`���@ri/1.8/system/WEBrick/HTTPServlet/FileHandler/search_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::FileHandler#search_file
is_singleton: false
name: search_file
params: (req, res, basename)
visibility: private
PK�|[���=��Ari/1.8/system/WEBrick/HTTPServlet/FileHandler/set_filename-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::FileHandler#set_filename
is_singleton: false
name: set_filename
params: (req, res)
visibility: private
PK�|[�s����Pri/1.8/system/WEBrick/HTTPServlet/FileHandler/prevent_directory_traversal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::FileHandler#prevent_directory_traversal
is_singleton: false
name: prevent_directory_traversal
params: (req, res)
visibility: private
PK�|[�{���Nri/1.8/system/WEBrick/HTTPServlet/FileHandler/windows_ambiguous_name%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::FileHandler#windows_ambiguous_name?
is_singleton: false
name: windows_ambiguous_name?
params: (name)
visibility: private
PK�|[�K_A��Dri/1.8/system/WEBrick/HTTPServlet/FileHandler/cdesc-FileHandler.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_handler
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: remove_handler
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: HandlerTable
  value: Hash.new
full_name: WEBrick::HTTPServlet::FileHandler
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: call_callback
- !ruby/object:RI::MethodSummary 
  name: check_filename
- !ruby/object:RI::MethodSummary 
  name: do_GET
- !ruby/object:RI::MethodSummary 
  name: do_OPTIONS
- !ruby/object:RI::MethodSummary 
  name: do_POST
- !ruby/object:RI::MethodSummary 
  name: exec_handler
- !ruby/object:RI::MethodSummary 
  name: get_handler
- !ruby/object:RI::MethodSummary 
  name: nondisclosure_name?
- !ruby/object:RI::MethodSummary 
  name: prevent_directory_traversal
- !ruby/object:RI::MethodSummary 
  name: search_file
- !ruby/object:RI::MethodSummary 
  name: search_index_file
- !ruby/object:RI::MethodSummary 
  name: service
- !ruby/object:RI::MethodSummary 
  name: set_dir_list
- !ruby/object:RI::MethodSummary 
  name: set_filename
- !ruby/object:RI::MethodSummary 
  name: shift_path_info
- !ruby/object:RI::MethodSummary 
  name: trailing_pathsep?
- !ruby/object:RI::MethodSummary 
  name: windows_ambiguous_name?
name: FileHandler
superclass: AbstractServlet
PK�|[�����@ri/1.8/system/WEBrick/HTTPServlet/FileHandler/get_handler-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::FileHandler#get_handler
is_singleton: false
name: get_handler
params: (req, res)
visibility: private
PK�|[��>Z��<ri/1.8/system/WEBrick/HTTPServlet/ERBHandler/evaluate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::ERBHandler#evaluate
is_singleton: false
name: evaluate
params: (erb, servlet_request, servlet_response)
visibility: private
PK�|[_wP�;ri/1.8/system/WEBrick/HTTPServlet/ERBHandler/do_POST-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #do_GET"
full_name: WEBrick::HTTPServlet::ERBHandler#do_POST
is_singleton: false
name: do_POST
params: (req, res)
visibility: public
PK�|[t����:ri/1.8/system/WEBrick/HTTPServlet/ERBHandler/do_GET-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: do_POST
block_params: 
comment: 
full_name: WEBrick::HTTPServlet::ERBHandler#do_GET
is_singleton: false
name: do_GET
params: (req, res)
visibility: public
PK�|[�k���7ri/1.8/system/WEBrick/HTTPServlet/ERBHandler/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::ERBHandler::new
is_singleton: true
name: new
params: (server, name)
visibility: public
PK�|[0�$���Bri/1.8/system/WEBrick/HTTPServlet/ERBHandler/cdesc-ERBHandler.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WEBrick::HTTPServlet::ERBHandler
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: do_GET
- !ruby/object:RI::MethodSummary 
  name: do_POST
- !ruby/object:RI::MethodSummary 
  name: evaluate
name: ERBHandler
superclass: AbstractServlet
PK�|[/͉E��8ri/1.8/system/WEBrick/HTTPServlet/cdesc-HTTPServlet.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WEBrick::HTTPServlet
includes: []

instance_methods: []

name: HTTPServlet
superclass: 
PK�|[cqS;ri/1.8/system/WEBrick/HTTPServlet/CGIHandler/do_POST-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #do_GET"
full_name: WEBrick::HTTPServlet::CGIHandler#do_POST
is_singleton: false
name: do_POST
params: (req, res)
visibility: public
PK�|[A�6O��Bri/1.8/system/WEBrick/HTTPServlet/CGIHandler/cdesc-CGIHandler.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Ruby
  value: File::join(::Config::CONFIG['bindir'],                         ::Config::CONFIG['ruby_install_name'])
- !ruby/object:RI::Constant 
  comment: 
  name: CGIRunner
  value: "\"\\\"#{Ruby}\\\" \\\"#{Config::LIBDIR}/httpservlet/cgi_runner.rb\\\"\""
full_name: WEBrick::HTTPServlet::CGIHandler
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: do_GET
- !ruby/object:RI::MethodSummary 
  name: do_POST
name: CGIHandler
superclass: AbstractServlet
PK�|[�#���:ri/1.8/system/WEBrick/HTTPServlet/CGIHandler/do_GET-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: do_POST
block_params: 
comment: 
full_name: WEBrick::HTTPServlet::CGIHandler#do_GET
is_singleton: false
name: do_GET
params: (req, res)
visibility: public
PK�|[��F��7ri/1.8/system/WEBrick/HTTPServlet/CGIHandler/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::CGIHandler::new
is_singleton: true
name: new
params: (server, name)
visibility: public
PK�|[2<����Bri/1.8/system/WEBrick/HTTPServlet/DefaultFileHandler/do_GET-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::DefaultFileHandler#do_GET
is_singleton: false
name: do_GET
params: (req, res)
visibility: public
PK�|[�u�Pri/1.8/system/WEBrick/HTTPServlet/DefaultFileHandler/make_partial_content-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::DefaultFileHandler#make_partial_content
is_singleton: false
name: make_partial_content
params: (req, res, filename, filesize)
visibility: public
PK�|[Q�G���Iri/1.8/system/WEBrick/HTTPServlet/DefaultFileHandler/prepare_range-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::DefaultFileHandler#prepare_range
is_singleton: false
name: prepare_range
params: (range, filesize)
visibility: public
PK�|[��ۨ��Rri/1.8/system/WEBrick/HTTPServlet/DefaultFileHandler/cdesc-DefaultFileHandler.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WEBrick::HTTPServlet::DefaultFileHandler
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: do_GET
- !ruby/object:RI::MethodSummary 
  name: make_partial_content
- !ruby/object:RI::MethodSummary 
  name: not_modified?
- !ruby/object:RI::MethodSummary 
  name: prepare_range
name: DefaultFileHandler
superclass: AbstractServlet
PK�|[0�z���?ri/1.8/system/WEBrick/HTTPServlet/DefaultFileHandler/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::DefaultFileHandler::new
is_singleton: true
name: new
params: (server, local_path)
visibility: public
PK�|[�v����Kri/1.8/system/WEBrick/HTTPServlet/DefaultFileHandler/not_modified%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::DefaultFileHandler#not_modified?
is_singleton: false
name: not_modified?
params: (req, res, mtime, etag)
visibility: public
PK�|[s��C<ri/1.8/system/WEBrick/HTTPServlet/ProcHandler/do_POST-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #do_GET"
full_name: WEBrick::HTTPServlet::ProcHandler#do_POST
is_singleton: false
name: do_POST
params: (request, response)
visibility: public
PK�|[R����;ri/1.8/system/WEBrick/HTTPServlet/ProcHandler/do_GET-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: do_POST
block_params: 
comment: 
full_name: WEBrick::HTTPServlet::ProcHandler#do_GET
is_singleton: false
name: do_GET
params: (request, response)
visibility: public
PK�|[��I(��8ri/1.8/system/WEBrick/HTTPServlet/ProcHandler/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::ProcHandler::new
is_singleton: true
name: new
params: (proc)
visibility: public
PK�|[������Ari/1.8/system/WEBrick/HTTPServlet/ProcHandler/get_instance-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::ProcHandler#get_instance
is_singleton: false
name: get_instance
params: (server, *options)
visibility: public
PK�|[�YT���Dri/1.8/system/WEBrick/HTTPServlet/ProcHandler/cdesc-ProcHandler.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WEBrick::HTTPServlet::ProcHandler
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: do_GET
- !ruby/object:RI::MethodSummary 
  name: do_POST
- !ruby/object:RI::MethodSummary 
  name: get_instance
name: ProcHandler
superclass: AbstractServlet
PK�|[1�O��Nri/1.8/system/WEBrick/HTTPServlet/HTTPServletError/cdesc-HTTPServletError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WEBrick::HTTPServlet::HTTPServletError
includes: []

instance_methods: []

name: HTTPServletError
superclass: StandardError
PK�|[s‘Z��Eri/1.8/system/WEBrick/HTTPServlet/AbstractServlet/get_instance-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::AbstractServlet::get_instance
is_singleton: true
name: get_instance
params: (config, *options)
visibility: public
PK�|[�KV���?ri/1.8/system/WEBrick/HTTPServlet/AbstractServlet/do_GET-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::AbstractServlet#do_GET
is_singleton: false
name: do_GET
params: (req, res)
visibility: public
PK�|[�T*��Cri/1.8/system/WEBrick/HTTPServlet/AbstractServlet/do_OPTIONS-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::AbstractServlet#do_OPTIONS
is_singleton: false
name: do_OPTIONS
params: (req, res)
visibility: public
PK�|[��Q���@ri/1.8/system/WEBrick/HTTPServlet/AbstractServlet/service-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::AbstractServlet#service
is_singleton: false
name: service
params: (req, res)
visibility: public
PK�|[�-���Rri/1.8/system/WEBrick/HTTPServlet/AbstractServlet/redirect_to_directory_uri-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::AbstractServlet#redirect_to_directory_uri
is_singleton: false
name: redirect_to_directory_uri
params: (req, res)
visibility: private
PK�|[i�v�NNLri/1.8/system/WEBrick/HTTPServlet/AbstractServlet/cdesc-AbstractServlet.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: get_instance
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WEBrick::HTTPServlet::AbstractServlet
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: do_GET
- !ruby/object:RI::MethodSummary 
  name: do_HEAD
- !ruby/object:RI::MethodSummary 
  name: do_OPTIONS
- !ruby/object:RI::MethodSummary 
  name: redirect_to_directory_uri
- !ruby/object:RI::MethodSummary 
  name: service
name: AbstractServlet
superclass: Object
PK�|[\>%��<ri/1.8/system/WEBrick/HTTPServlet/AbstractServlet/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::AbstractServlet::new
is_singleton: true
name: new
params: (server, *options)
visibility: public
PK�|[�W���@ri/1.8/system/WEBrick/HTTPServlet/AbstractServlet/do_HEAD-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPServlet::AbstractServlet#do_HEAD
is_singleton: false
name: do_HEAD
params: (req, res)
visibility: public
PK�|[�a���7ri/1.8/system/WEBrick/HTTPStatus/client_error%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPStatus#client_error?
is_singleton: false
name: client_error?
params: (code)
visibility: public
PK�|[,����Cri/1.8/system/WEBrick/HTTPStatus/ClientError/cdesc-ClientError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WEBrick::HTTPStatus::ClientError
includes: []

instance_methods: []

name: ClientError
superclass: Error
PK�|[���4��=ri/1.8/system/WEBrick/HTTPStatus/EOFError/cdesc-EOFError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WEBrick::HTTPStatus::EOFError
includes: []

instance_methods: []

name: EOFError
superclass: StandardError
PK�|[�����5ri/1.8/system/WEBrick/HTTPStatus/Info/cdesc-Info.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WEBrick::HTTPStatus::Info
includes: []

instance_methods: []

name: Info
superclass: Status
PK�|[N����7ri/1.8/system/WEBrick/HTTPStatus/Error/cdesc-Error.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WEBrick::HTTPStatus::Error
includes: []

instance_methods: []

name: Error
superclass: Status
PK�|[��$���/ri/1.8/system/WEBrick/HTTPStatus/info%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPStatus#info?
is_singleton: false
name: info?
params: (code)
visibility: public
PK�|[*wۏ��;ri/1.8/system/WEBrick/HTTPStatus/Success/cdesc-Success.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WEBrick::HTTPStatus::Success
includes: []

instance_methods: []

name: Success
superclass: Status
PK�|[���3ri/1.8/system/WEBrick/HTTPStatus/redirect%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPStatus#redirect?
is_singleton: false
name: redirect?
params: (code)
visibility: public
PK�|[R����Cri/1.8/system/WEBrick/HTTPStatus/ServerError/cdesc-ServerError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WEBrick::HTTPStatus::ServerError
includes: []

instance_methods: []

name: ServerError
superclass: Error
PK�|[�IԚ��3ri/1.8/system/WEBrick/HTTPStatus/Status/to_i-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #code"
full_name: WEBrick::HTTPStatus::Status#to_i
is_singleton: false
name: to_i
params: ()
visibility: public
PK�|[��9ri/1.8/system/WEBrick/HTTPStatus/Status/cdesc-Status.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: code
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: reason_phrase
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WEBrick::HTTPStatus::Status
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: code
- !ruby/object:RI::MethodSummary 
  name: reason_phrase
- !ruby/object:RI::MethodSummary 
  name: to_i
name: Status
superclass: StandardError
PK�|[��Y��3ri/1.8/system/WEBrick/HTTPStatus/Status/code-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: to_i
block_params: 
comment: 
full_name: WEBrick::HTTPStatus::Status#code
is_singleton: false
name: code
params: ()
visibility: public
PK�|[�d�պ�2ri/1.8/system/WEBrick/HTTPStatus/Status/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPStatus::Status::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[�Dj��<ri/1.8/system/WEBrick/HTTPStatus/Status/reason_phrase-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPStatus::Status#reason_phrase
is_singleton: false
name: reason_phrase
params: ()
visibility: public
PK�|[�J��=ri/1.8/system/WEBrick/HTTPStatus/Redirect/cdesc-Redirect.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WEBrick::HTTPStatus::Redirect
includes: []

instance_methods: []

name: Redirect
superclass: Status
PK�|[�ݻ�2ri/1.8/system/WEBrick/HTTPStatus/success%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPStatus#success?
is_singleton: false
name: success?
params: (code)
visibility: public
PK�|[���x��5ri/1.8/system/WEBrick/HTTPStatus/reason_phrase-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPStatus#reason_phrase
is_singleton: false
name: reason_phrase
params: (code)
visibility: public
PK�|[/A���7ri/1.8/system/WEBrick/HTTPStatus/server_error%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPStatus#server_error?
is_singleton: false
name: server_error?
params: (code)
visibility: public
PK�|[I�{��0ri/1.8/system/WEBrick/HTTPStatus/error%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPStatus#error?
is_singleton: false
name: error?
params: (code)
visibility: public
PK�|[.����.ri/1.8/system/WEBrick/HTTPStatus/%5b%5d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WEBrick::HTTPStatus::[]
is_singleton: true
name: "[]"
params: (code)
visibility: public
PK�|[���k��6ri/1.8/system/WEBrick/HTTPStatus/cdesc-HTTPStatus.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: StatusMessage
  value: "{       100, 'Continue',       101, 'Switching Protocols',       200, 'OK',       201, 'Created',       202, 'Accepted',       203, 'Non-Authoritative Information',       204, 'No Content',       205, 'Reset Content',       206, 'Partial Content',       300, 'Multiple Choices',       301, 'Moved Permanently',       302, 'Found',       303, 'See Other',       304, 'Not Modified',       305, 'Use Proxy',       307, 'Temporary Redirect',       400, 'Bad Request',       401, 'Unauthorized',       402, 'Payment Required',       403, 'Forbidden',       404, 'Not Found',       405, 'Method Not Allowed',       406, 'Not Acceptable',       407, 'Proxy Authentication Required',       408, 'Request Timeout',       409, 'Conflict',       410, 'Gone',       411, 'Length Required',       412, 'Precondition Failed',       413, 'Request Entity Too Large',       414, 'Request-URI Too Large',       415, 'Unsupported Media Type',       416, 'Request Range Not Satisfiable',       417, 'Expectation Failed',       500, 'Internal Server Error',       501, 'Not Implemented',       502, 'Bad Gateway',       503, 'Service Unavailable',       504, 'Gateway Timeout',       505, 'HTTP Version Not Supported'"
- !ruby/object:RI::Constant 
  comment: 
  name: CodeToError
  value: "{}"
full_name: WEBrick::HTTPStatus
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: client_error?
- !ruby/object:RI::MethodSummary 
  name: error?
- !ruby/object:RI::MethodSummary 
  name: info?
- !ruby/object:RI::MethodSummary 
  name: reason_phrase
- !ruby/object:RI::MethodSummary 
  name: redirect?
- !ruby/object:RI::MethodSummary 
  name: server_error?
- !ruby/object:RI::MethodSummary 
  name: success?
name: HTTPStatus
superclass: 
PK�|[J��m��"ri/1.8/system/TCPSocket/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Opens a TCP connection to <tt>remote_host</tt> on <tt>remote_port</tt>. If <tt>local_host</tt> and <tt>local_port</tt> are specified, then those parameters are used on the local end to establish the connection.
full_name: TCPSocket::new
is_singleton: true
name: new
params: |
  TCPSocket.new(remote_host, remote_port, local_host=nil, local_port=nil)

visibility: public
PK�|[�[�b��,ri/1.8/system/TCPSocket/cdesc-TCPSocket.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: gethostbyname
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Class <tt>Socket</tt> provides access to the underlying operating system socket implementations. It can be used to provide more operating system specific functionality than the protocol-specific socket classes but at the expense of greater complexity. In particular, the class handles addresses using +struct sockaddr+ structures packed into Ruby strings, which can be a joy to manipulate.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Exception Handling
- !ruby/struct:SM::Flow::P 
  body: Ruby's implementation of <tt>Socket</tt> causes an exception to be raised based on the error generated by the system dependent implementation. This is why the methods are documented in a way that isolate Unix-based system exceptions from Windows based exceptions. If more information on particular exception is needed please refer to the Unix manual pages or the Windows WinSock reference.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Documentation by
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Zach Dennis
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Sam Roberts
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <em>Programming Ruby</em> from The Pragmatic Bookshelf.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: Much material in this documentation is taken with permission from <em>Programming Ruby</em> from The Pragmatic Bookshelf.
constants: []

full_name: TCPSocket
includes: []

instance_methods: []

name: TCPSocket
superclass: Object
PK�|[4n�EE,ri/1.8/system/TCPSocket/gethostbyname-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Resolve <tt>host</tt> and return name and address information for it, similarly to gethostbyname(3). <tt>host</tt> can be a domain name or the presentation format of an address.
- !ruby/struct:SM::Flow::P 
  body: "Returns an array of information similar to that found in a +struct hostent+:"
- !ruby/struct:SM::Flow::VERB 
  body: "  - cannonical name: the cannonical name for host in the DNS, or a\n    string representing the address\n  - aliases: an array of aliases for the canonical name, there may be no aliases\n  - address family: usually one of Socket::AF_INET or Socket::AF_INET6\n  - address: a string, the binary value of the +struct sockaddr+ for this name, in\n    the indicated address family\n  - ...: if there are multiple addresses for this host,  a series of\n    strings/+struct sockaddr+s may follow, not all necessarily in the same\n    address family. Note that the fact that they may not be all in the same\n    address family is a departure from the behaviour of gethostbyname(3).\n"
- !ruby/struct:SM::Flow::P 
  body: "Note: I believe that the fact that the multiple addresses returned are not necessarily in the same address family may be a bug, since if this function actually called gethostbyname(3), ALL the addresses returned in the trailing address list (h_addr_list from struct hostent) would be of the same address family! Examples from my system, OS X 10.3:"
- !ruby/struct:SM::Flow::VERB 
  body: "  [&quot;localhost&quot;, [], 30, &quot;\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\001&quot;, &quot;\\177\\000\\000\\001&quot;]\n    and\n  [&quot;ensemble.local&quot;, [], 30, &quot;\\376\\200\\000\\004\\000\\000\\000\\000\\002\\003\\223\\377\\376\\255\\010\\214&quot;, &quot;\\300\\250{\\232&quot; ]\n"
- !ruby/struct:SM::Flow::P 
  body: "Similar information can be returned by Socket.getaddrinfo if called as:"
- !ruby/struct:SM::Flow::VERB 
  body: "   Socket.getaddrinfo(<tt>host</tt>, 0, Socket::AF_UNSPEC, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME)\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Examples
- !ruby/struct:SM::Flow::VERB 
  body: "  Socket.gethostbyname &quot;example.com&quot;\n  =&gt; [&quot;example.com&quot;, [], 2, &quot;\\300\\000\\&quot;\\246&quot;]\n"
- !ruby/struct:SM::Flow::P 
  body: This name has no DNS aliases, and a single IPv4 address.
- !ruby/struct:SM::Flow::VERB 
  body: "  Socket.gethostbyname &quot;smtp.telus.net&quot;\n  =&gt; [&quot;smtp.svc.telus.net&quot;, [&quot;smtp.telus.net&quot;], 2, &quot;\\307\\271\\334\\371&quot;]\n"
- !ruby/struct:SM::Flow::P 
  body: This name is an an alias so the canonical name is returned, as well as the alias and a single IPv4 address.
- !ruby/struct:SM::Flow::VERB 
  body: "  Socket.gethostbyname &quot;localhost&quot;\n  =&gt; [&quot;localhost&quot;, [], 30, &quot;\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\001&quot;, &quot;\\177\\000\\000\\001&quot;]\n"
- !ruby/struct:SM::Flow::P 
  body: This machine has no aliases, returns an IPv6 address, and has an additional IPv4 address.
- !ruby/struct:SM::Flow::P 
  body: "<tt>host</tt> can also be an IP address in presentation format, in which case a reverse lookup is done on the address:"
- !ruby/struct:SM::Flow::VERB 
  body: "  Socket.gethostbyname(&quot;127.0.0.1&quot;)\n  =&gt; [&quot;localhost&quot;, [], 2, &quot;\\177\\000\\000\\001&quot;]\n\n  Socket.gethostbyname(&quot;192.0.34.166&quot;)\n  =&gt; [&quot;www.example.com&quot;, [], 2, &quot;\\300\\000\\&quot;\\246&quot;]\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: See
- !ruby/struct:SM::Flow::P 
  body: "See: Socket.getaddrinfo"
full_name: TCPSocket::gethostbyname
is_singleton: true
name: gethostbyname
params: " Socket.gethostbyname(host) => hostent\n"
visibility: public
PK�|[��\�zz2ri/1.8/system/NameError/message/cdesc-message.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: NameError::message
includes: []

instance_methods: []

name: message
superclass: Data
PK�|[~���"ri/1.8/system/NameError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Construct a new NameError exception. If given the <em>name</em> parameter may subsequently be examined using the <tt>NameError.name</tt> method.
full_name: NameError::new
is_singleton: true
name: new
params: |
  NameError.new(msg [, name])  => name_error

visibility: public
PK�|[����--#ri/1.8/system/NameError/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Produce a nicely-formated string representing the <tt>NameError</tt>.
full_name: NameError#to_s
is_singleton: false
name: to_s
params: |
  name_error.to_s   => string

visibility: public
PK�|[ݲ�^,ri/1.8/system/NameError/cdesc-NameError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: NameError
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: name
- !ruby/object:RI::MethodSummary 
  name: to_s
name: NameError
superclass: StandardError
PK�|[�f��**#ri/1.8/system/NameError/name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the name associated with this NameError exception.
full_name: NameError#name
is_singleton: false
name: name
params: |
  name_error.name    =>  string or nil

visibility: public
PK�|[�oenn0ri/1.8/system/Acceptables/cdesc-Acceptables.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Acceptable argument classes. Now contains DecimalInteger, OctalInteger and DecimalNumeric. See Acceptable argument classes (in source code).
constants: []

full_name: Acceptables
includes: []

instance_methods: []

name: Acceptables
superclass: 
PK�|[�׊T��,ri/1.8/system/Finalizer/cdesc-Finalizer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_dependency
- !ruby/object:RI::MethodSummary 
  name: delete_all_by_dependant
- !ruby/object:RI::MethodSummary 
  name: delete_all_dependency
- !ruby/object:RI::MethodSummary 
  name: delete_by_dependant
- !ruby/object:RI::MethodSummary 
  name: delete_dependency
- !ruby/object:RI::MethodSummary 
  name: final_of
- !ruby/object:RI::MethodSummary 
  name: finalize_all
- !ruby/object:RI::MethodSummary 
  name: finalize_all_by_dependant
- !ruby/object:RI::MethodSummary 
  name: finalize_all_dependency
- !ruby/object:RI::MethodSummary 
  name: finalize_by_dependant
- !ruby/object:RI::MethodSummary 
  name: finalize_dependency
- !ruby/object:RI::MethodSummary 
  name: safe
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Usage:"
- !ruby/struct:SM::Flow::P 
  body: add dependency R_method(obj, dependant)
- !ruby/struct:SM::Flow::VERB 
  body: "  add(obj, dependant, method = :finalize, *opt)\n  add_dependency(obj, dependant, method = :finalize, *opt)\n"
- !ruby/struct:SM::Flow::P 
  body: delete dependency R_method(obj, dependant)
- !ruby/struct:SM::Flow::VERB 
  body: "  delete(obj_or_id, dependant, method = :finalize)\n  delete_dependency(obj_or_id, dependant, method = :finalize)\n"
- !ruby/struct:SM::Flow::P 
  body: delete dependency R_*(obj, dependant)
- !ruby/struct:SM::Flow::VERB 
  body: "  delete_all_dependency(obj_or_id, dependant)\n"
- !ruby/struct:SM::Flow::P 
  body: delete dependency R_method(*, dependant)
- !ruby/struct:SM::Flow::VERB 
  body: "  delete_by_dependant(dependant, method = :finalize)\n"
- !ruby/struct:SM::Flow::P 
  body: delete dependency R_*(*, dependant)
- !ruby/struct:SM::Flow::VERB 
  body: "  delete_all_by_dependant(dependant)\n"
- !ruby/struct:SM::Flow::P 
  body: delete all dependency R_*(*, *)
- !ruby/struct:SM::Flow::VERB 
  body: "  delete_all\n"
- !ruby/struct:SM::Flow::P 
  body: finalize the dependant connected by dependency R_method(obj, dependtant).
- !ruby/struct:SM::Flow::VERB 
  body: "  finalize(obj_or_id, dependant, method = :finalize)\n  finalize_dependency(obj_or_id, dependant, method = :finalize)\n"
- !ruby/struct:SM::Flow::P 
  body: finalize all dependants connected by dependency R_*(obj, dependtant).
- !ruby/struct:SM::Flow::VERB 
  body: "  finalize_all_dependency(obj_or_id, dependant)\n"
- !ruby/struct:SM::Flow::P 
  body: finalize the dependant connected by dependency R_method(*, dependtant).
- !ruby/struct:SM::Flow::VERB 
  body: "  finalize_by_dependant(dependant, method = :finalize)\n"
- !ruby/struct:SM::Flow::P 
  body: finalize all dependants connected by dependency R_*(*, dependant).
- !ruby/struct:SM::Flow::VERB 
  body: "  finalize_all_by_dependant(dependant)\n"
- !ruby/struct:SM::Flow::P 
  body: finalize all dependency registered to the Finalizer.
- !ruby/struct:SM::Flow::VERB 
  body: "  finalize_all\n"
- !ruby/struct:SM::Flow::P 
  body: stop invoking Finalizer on GC.
- !ruby/struct:SM::Flow::VERB 
  body: "  safe{..}\n"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: RCS_ID
  value: "'-$Id: finalize.rb,v 1.4 1998/02/27 05:34:33 keiju Exp keiju $-'"
full_name: Finalizer
includes: []

instance_methods: []

name: Finalizer
superclass: 
PK�|[4Y//0ri/1.8/system/Finalizer/delete_dependency-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: delete dependency R_method(obj, dependant)
full_name: Finalizer::delete_dependency
is_singleton: true
name: delete_dependency
params: (id, dependant, method = :finalize)
visibility: public
PK�|[=��'ri/1.8/system/Finalizer/final_of-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: registering function to ObjectSpace#add_finalizer
full_name: Finalizer::final_of
is_singleton: true
name: final_of
params: (id)
visibility: private
PK�|[5I,�4ri/1.8/system/Finalizer/delete_all_dependency-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: delete dependency R_*(obj, dependant)
full_name: Finalizer::delete_all_dependency
is_singleton: true
name: delete_all_dependency
params: (id, dependant)
visibility: public
PK�|[�w�6ri/1.8/system/Finalizer/delete_all_by_dependant-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: delete dependency R_*(*, dependant)
full_name: Finalizer::delete_all_by_dependant
is_singleton: true
name: delete_all_by_dependant
params: (dependant)
visibility: public
PK�|[�3cOO4ri/1.8/system/Finalizer/finalize_by_dependant-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: finalize the dependant connected by dependency R_method(*, dependtant)
full_name: Finalizer::finalize_by_dependant
is_singleton: true
name: finalize_by_dependant
params: (dependant, method = :finalize)
visibility: public
PK�|[�q	8AA6ri/1.8/system/Finalizer/finalize_all_dependency-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: finalize all dependants connected by dependency R_*(obj, dependtant)
full_name: Finalizer::finalize_all_dependency
is_singleton: true
name: finalize_all_dependency
params: (id, dependant)
visibility: public
PK�|[s��)--2ri/1.8/system/Finalizer/delete_by_dependant-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: delete dependency R_method(*, dependant)
full_name: Finalizer::delete_by_dependant
is_singleton: true
name: delete_by_dependant
params: (dependant, method = :finalize)
visibility: public
PK�|[����+ri/1.8/system/Finalizer/finalize_all-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: finalize all dependants registered to the Finalizer.
full_name: Finalizer::finalize_all
is_singleton: true
name: finalize_all
params: ()
visibility: public
PK�|[Ol??8ri/1.8/system/Finalizer/finalize_all_by_dependant-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: finalize all dependants connected by dependency R_*(*, dependtant)
full_name: Finalizer::finalize_all_by_dependant
is_singleton: true
name: finalize_all_by_dependant
params: (dependant)
visibility: public
PK�|[.�aQQ2ri/1.8/system/Finalizer/finalize_dependency-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: finalize the depandant connected by dependency R_method(obj, dependtant)
full_name: Finalizer::finalize_dependency
is_singleton: true
name: finalize_dependency
params: (id, dependant, method = :finalize)
visibility: public
PK�|[e���#ri/1.8/system/Finalizer/safe-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: method to call finalize_* safely.
full_name: Finalizer::safe
is_singleton: true
name: safe
params: () {|| ...}
visibility: public
PK�|[�W�T---ri/1.8/system/Finalizer/add_dependency-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: add dependency R_method(obj, dependant)
full_name: Finalizer::add_dependency
is_singleton: true
name: add_dependency
params: (obj, dependant, method = :finalize, *opt)
visibility: public
PK�|[��[���4ri/1.8/system/SecurityError/cdesc-SecurityError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: SecurityError
includes: []

instance_methods: []

name: SecurityError
superclass: StandardError
PK�|[���>> ri/1.8/system/Logger/info-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Log an <tt>INFO</tt> message.
- !ruby/struct:SM::Flow::P 
  body: The message can come either from the <tt>progname</tt> argument or the <tt>block</tt>. If both are provided, then the <tt>block</tt> is used as the message, and <tt>progname</tt> is used as the program name.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Examples
- !ruby/struct:SM::Flow::VERB 
  body: "  logger.info(&quot;MainApp&quot;) { &quot;Received connection from #{ip}&quot; }\n  # ...\n  logger.info &quot;Waiting for input from user&quot;\n  # ...\n  logger.info { &quot;User typed #{input}&quot; }\n"
- !ruby/struct:SM::Flow::P 
  body: You'll probably stick to the second form above, unless you want to provide a program name (which you can do with <tt>Logger#progname=</tt> as well).
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Return
- !ruby/struct:SM::Flow::P 
  body: "See #add."
full_name: Logger#info
is_singleton: false
name: info
params: (progname = nil, &block)
visibility: public
PK�|[ʺ@#ri/1.8/system/Logger/unknown-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Log an <tt>UNKNOWN</tt> message. This will be printed no matter what the logger level.
- !ruby/struct:SM::Flow::P 
  body: "See #info for more information."
full_name: Logger#unknown
is_singleton: false
name: unknown
params: (progname = nil, &block)
visibility: public
PK�|[������.ri/1.8/system/Logger/Application/log%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger::Application#log=
is_singleton: false
name: log=
params: (logdev)
visibility: public
PK�|[�ܴ60ri/1.8/system/Logger/Application/level%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the logging threshold, just like <tt>Logger#level=</tt>.
full_name: Logger::Application#level=
is_singleton: false
name: level=
params: (level)
visibility: public
PK�|[�ޚ--+ri/1.8/system/Logger/Application/log-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See Logger#add. This application's <tt>appname</tt> is used.
full_name: Logger::Application#log
is_singleton: false
name: log
params: (severity, message = nil, &block)
visibility: public
PK�|[וu���7ri/1.8/system/Logger/Application/cdesc-Application.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: appname
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: logdev
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: Application -- Add logging support to your application.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Usage
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "1."
    body: Define your application class as a sub-class of this class.
  - !ruby/struct:SM::Flow::LI 
    label: "2."
    body: Override 'run' method in your class to do many things.
  - !ruby/struct:SM::Flow::LI 
    label: "3."
    body: Instantiate it and invoke 'start'.
  type: :NUMBER
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "  class FooApp &lt; Application\n    def initialize(foo_app, application_specific, arguments)\n      super('FooApp') # Name of the application.\n    end\n\n    def run\n      ...\n      log(WARN, 'warning', 'my_method1')\n      ...\n      @log.error('my_method2') { 'Error!' }\n      ...\n    end\n  end\n\n  status = FooApp.new(....).start\n"
constants: []

full_name: Logger::Application
includes: 
- !ruby/object:RI::IncludedModule 
  name: Logger::Severity
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: level=
- !ruby/object:RI::MethodSummary 
  name: log
- !ruby/object:RI::MethodSummary 
  name: log=
- !ruby/object:RI::MethodSummary 
  name: run
- !ruby/object:RI::MethodSummary 
  name: set_log
- !ruby/object:RI::MethodSummary 
  name: start
name: Application
superclass: Object
PK�|[��D��+ri/1.8/system/Logger/Application/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Synopsis
- !ruby/struct:SM::Flow::VERB 
  body: "  Application.new(appname = '')\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Args
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+appname+:"
    body: Name of the application.
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: "Create an instance. Log device is <tt>STDERR</tt> by default. This can be changed with #set_log."
full_name: Logger::Application::new
is_singleton: true
name: new
params: (appname = nil)
visibility: public
PK�|[c�hh/ri/1.8/system/Logger/Application/set_log-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the log device for this application. See the class Logger for an explanation of the arguments.
full_name: Logger::Application#set_log
is_singleton: false
name: set_log
params: (logdev, shift_age = 0, shift_size = 1024000)
visibility: public
PK�|[X�-ri/1.8/system/Logger/Application/start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Start the application. Return the status code.
full_name: Logger::Application#start
is_singleton: false
name: start
params: ()
visibility: public
PK�|[����+ri/1.8/system/Logger/Application/run-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger::Application#run
is_singleton: false
name: run
params: ()
visibility: private
PK�|[����;ri/1.8/system/Logger/ShiftingError/cdesc-ShiftingError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Logger::ShiftingError
includes: []

instance_methods: []

name: ShiftingError
superclass: Error
PK�|[�\c��+ri/1.8/system/Logger/Error/cdesc-Error.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Logger::Error
includes: []

instance_methods: []

name: Error
superclass: RuntimeError
PK�|[�y�00#ri/1.8/system/Logger/info%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> iff the current severity level allows for the printing of <tt>INFO</tt> messages.
full_name: Logger#info?
is_singleton: false
name: info?
params: ()
visibility: public
PK�|[��CC!ri/1.8/system/Logger/error-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Log an <tt>ERROR</tt> message.
- !ruby/struct:SM::Flow::P 
  body: "See #info for more information."
full_name: Logger#error
is_singleton: false
name: error
params: (progname = nil, &block)
visibility: public
PK�|[�ײ�	�	ri/1.8/system/Logger/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: log
block_params: ""
comment: 
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Synopsis
- !ruby/struct:SM::Flow::VERB 
  body: "  Logger#add(severity, message = nil, progname = nil) { ... }\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Args
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+severity+:"
    body: "Severity. Constants are defined in Logger namespace: <tt>DEBUG</tt>, <tt>INFO</tt>, <tt>WARN</tt>, <tt>ERROR</tt>, <tt>FATAL</tt>, or <tt>UNKNOWN</tt>."
  - !ruby/struct:SM::Flow::LI 
    label: "+message+:"
    body: The log message. A String or Exception.
  - !ruby/struct:SM::Flow::LI 
    label: "+progname+:"
    body: Program name string. Can be omitted. Treated as a message if no <tt>message</tt> and <tt>block</tt> are given.
  - !ruby/struct:SM::Flow::LI 
    label: "+block+:"
    body: Can be omitted. Called to get a message string if <tt>message</tt> is nil.
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Return
- !ruby/struct:SM::Flow::P 
  body: <tt>true</tt> if successful, <tt>false</tt> otherwise.
- !ruby/struct:SM::Flow::P 
  body: When the given severity is not high enough (for this particular logger), log no message, and return <tt>true</tt>.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Description
- !ruby/struct:SM::Flow::P 
  body: "Log a message if the given severity is high enough. This is the generic logging method. Users will be more inclined to use #debug, #info, #warn, #error, and #fatal."
- !ruby/struct:SM::Flow::P 
  body: "<b>Message format</b>: <tt>message</tt> can be any object, but it has to be converted to a String in order to log it. Generally, <tt>inspect</tt> is used if the given object is not a String. A special case is an <tt>Exception</tt> object, which will be printed in detail, including message, class, and backtrace. See #msg2str for the implementation if required."
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Bugs
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Logfile is not locked.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Append open does not need to lock file.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: But on the OS which supports multi I/O, records possibly be mixed.
  type: :BULLET
full_name: Logger#add
is_singleton: false
name: add
params: (severity, message = nil, progname = nil, &block) {|| ...}
visibility: public
PK�|[���Y(Y(&ri/1.8/system/Logger/cdesc-Logger.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Logging formatter. formatter#call is invoked with 4 arguments; severity, time, progname and msg for each log. Bear in mind that time is a Time and msg is an Object that user passed and it could not be a String. It is expected to return a logdev#write-able Object. Default formatter is used when no formatter is set.
  name: formatter
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Logging severity threshold (e.g. <tt>Logger::INFO</tt>).
  name: level
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Logging program name.
  name: progname
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Simple logging utility.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "Author:"
    body: NAKAMURA, Hiroshi &lt;nakahiro@sarion.co.jp&gt;
  - !ruby/struct:SM::Flow::LI 
    label: "Documentation:"
    body: NAKAMURA, Hiroshi and Gavin Sinclair
  - !ruby/struct:SM::Flow::LI 
    label: "License:"
    body: You can redistribute it and/or modify it under the same terms of Ruby's license; either the dual license version in 2003, or any later version.
  - !ruby/struct:SM::Flow::LI 
    label: "Revision:"
    body: "$Id: logger.rb 31806 2011-05-30 02:08:57Z nahi $"
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: The Logger class provides a simple but sophisticated logging utility that anyone can use because it's included in the Ruby 1.8.x standard library.
- !ruby/struct:SM::Flow::P 
  body: "The HOWTOs below give a code-based overview of Logger's usage, but the basic concept is as follows. You create a Logger object (output to a file or elsewhere), and use it to log messages. The messages will have varying levels (<tt>info</tt>, <tt>error</tt>, etc), reflecting their varying importance. The levels, and their meanings, are:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+FATAL+:"
    body: an unhandleable error that results in a program crash
  - !ruby/struct:SM::Flow::LI 
    label: "+ERROR+:"
    body: a handleable error condition
  - !ruby/struct:SM::Flow::LI 
    label: "+WARN+:"
    body: a warning
  - !ruby/struct:SM::Flow::LI 
    label: "+INFO+:"
    body: generic (useful) information about system operation
  - !ruby/struct:SM::Flow::LI 
    label: "+DEBUG+:"
    body: low-level information for developers
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: So each message has a level, and the Logger itself has a level, which acts as a filter, so you can control the amount of information emitted from the logger without having to remove actual messages.
- !ruby/struct:SM::Flow::P 
  body: For instance, in a production system, you may have your logger(s) set to <tt>INFO</tt> (or <tt>WARN</tt> if you don't want the log files growing large with repetitive information). When you are developing it, though, you probably want to know about the program's internal state, and would set them to <tt>DEBUG</tt>.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::P 
  body: "A simple example demonstrates the above explanation:"
- !ruby/struct:SM::Flow::VERB 
  body: "  log = Logger.new(STDOUT)\n  log.level = Logger::WARN\n\n  log.debug(&quot;Created logger&quot;)\n  log.info(&quot;Program started&quot;)\n  log.warn(&quot;Nothing to do!&quot;)\n\n  begin\n    File.each_line(path) do |line|\n      unless line =~ /^(\\w+) = (.*)$/\n        log.error(&quot;Line in wrong format: #{line}&quot;)\n      end\n    end\n  rescue =&gt; err\n    log.fatal(&quot;Caught exception; exiting&quot;)\n    log.fatal(err)\n  end\n"
- !ruby/struct:SM::Flow::P 
  body: Because the Logger's level is set to <tt>WARN</tt>, only the warning, error, and fatal messages are recorded. The debug and info messages are silently discarded.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Features
- !ruby/struct:SM::Flow::P 
  body: There are several interesting features that Logger provides, like auto-rolling of log files, setting the format of log messages, and specifying a program name in conjunction with the message. The next section shows you how to achieve these things.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: HOWTOs
- !ruby/struct:SM::Flow::H 
  level: 3
  text: How to create a logger
- !ruby/struct:SM::Flow::P 
  body: The options below give you various choices, in more or less increasing complexity.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "1."
    body: Create a logger which logs messages to STDERR/STDOUT.
  - !ruby/struct:SM::Flow::VERB 
    body: "  logger = Logger.new(STDERR)\n  logger = Logger.new(STDOUT)\n"
  - !ruby/struct:SM::Flow::LI 
    label: "2."
    body: Create a logger for the file which has the specified name.
  - !ruby/struct:SM::Flow::VERB 
    body: "  logger = Logger.new('logfile.log')\n"
  - !ruby/struct:SM::Flow::LI 
    label: "3."
    body: Create a logger for the specified file.
  - !ruby/struct:SM::Flow::VERB 
    body: "  file = File.open('foo.log', File::WRONLY | File::APPEND)\n  # To create new (and to remove old) logfile, add File::CREAT like;\n  #   file = open('foo.log', File::WRONLY | File::APPEND | File::CREAT)\n  logger = Logger.new(file)\n"
  - !ruby/struct:SM::Flow::LI 
    label: "4."
    body: Create a logger which ages logfile once it reaches a certain size. Leave 10 &quot;old log files&quot; and each file is about 1,024,000 bytes.
  - !ruby/struct:SM::Flow::VERB 
    body: "  logger = Logger.new('foo.log', 10, 1024000)\n"
  - !ruby/struct:SM::Flow::LI 
    label: "5."
    body: Create a logger which ages logfile daily/weekly/monthly.
  - !ruby/struct:SM::Flow::VERB 
    body: "  logger = Logger.new('foo.log', 'daily')\n  logger = Logger.new('foo.log', 'weekly')\n  logger = Logger.new('foo.log', 'monthly')\n"
  type: :NUMBER
- !ruby/struct:SM::Flow::H 
  level: 3
  text: How to log a message
- !ruby/struct:SM::Flow::P 
  body: Notice the different methods (<tt>fatal</tt>, <tt>error</tt>, <tt>info</tt>) being used to log messages of various levels. Other methods in this family are <tt>warn</tt> and <tt>debug</tt>. <tt>add</tt> is used below to log a message of an arbitrary (perhaps dynamic) level.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "1."
    body: Message in block.
  - !ruby/struct:SM::Flow::VERB 
    body: "  logger.fatal { &quot;Argument 'foo' not given.&quot; }\n"
  - !ruby/struct:SM::Flow::LI 
    label: "2."
    body: Message as a string.
  - !ruby/struct:SM::Flow::VERB 
    body: "  logger.error &quot;Argument #{ @foo } mismatch.&quot;\n"
  - !ruby/struct:SM::Flow::LI 
    label: "3."
    body: With progname.
  - !ruby/struct:SM::Flow::VERB 
    body: "  logger.info('initialize') { &quot;Initializing...&quot; }\n"
  - !ruby/struct:SM::Flow::LI 
    label: "4."
    body: With severity.
  - !ruby/struct:SM::Flow::VERB 
    body: "  logger.add(Logger::FATAL) { 'Fatal error!' }\n"
  type: :NUMBER
- !ruby/struct:SM::Flow::H 
  level: 3
  text: How to close a logger
- !ruby/struct:SM::Flow::VERB 
  body: "     logger.close\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Setting severity threshold
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "1."
    body: Original interface.
  - !ruby/struct:SM::Flow::VERB 
    body: "  logger.sev_threshold = Logger::WARN\n"
  - !ruby/struct:SM::Flow::LI 
    label: "2."
    body: Log4r (somewhat) compatible interface.
  - !ruby/struct:SM::Flow::VERB 
    body: "  logger.level = Logger::INFO\n\n  DEBUG &lt; INFO &lt; WARN &lt; ERROR &lt; FATAL &lt; UNKNOWN\n"
  type: :NUMBER
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Format
- !ruby/struct:SM::Flow::P 
  body: "Log messages are rendered in the output stream in a certain format. The default format and a sample are shown below:"
- !ruby/struct:SM::Flow::P 
  body: "Log format:"
- !ruby/struct:SM::Flow::VERB 
  body: "  SeverityID, [Date Time mSec #pid] SeverityLabel -- ProgName: message\n"
- !ruby/struct:SM::Flow::P 
  body: "Log sample:"
- !ruby/struct:SM::Flow::VERB 
  body: "  I, [Wed Mar 03 02:34:24 JST 1999 895701 #19074]  INFO -- Main: info.\n"
- !ruby/struct:SM::Flow::P 
  body: "You may change the date and time format in this manner:"
- !ruby/struct:SM::Flow::VERB 
  body: "  logger.datetime_format = &quot;%Y-%m-%d %H:%M:%S&quot;\n        # e.g. &quot;2004-01-03 00:54:26&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: There is currently no supported way to change the overall format, but you may have some luck hacking the Format constant.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: VERSION
  value: "\"1.2.6\""
- !ruby/object:RI::Constant 
  comment: 
  name: ProgName
  value: "\"#{File.basename(__FILE__)}/#{VERSION}\""
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Severity label for logging. (max 5 char)
  name: SEV_LABEL
  value: "%w(DEBUG INFO WARN ERROR FATAL ANY)"
full_name: Logger
includes: 
- !ruby/object:RI::IncludedModule 
  name: Severity
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: datetime_format
- !ruby/object:RI::MethodSummary 
  name: datetime_format=
- !ruby/object:RI::MethodSummary 
  name: debug
- !ruby/object:RI::MethodSummary 
  name: debug?
- !ruby/object:RI::MethodSummary 
  name: error
- !ruby/object:RI::MethodSummary 
  name: error?
- !ruby/object:RI::MethodSummary 
  name: fatal
- !ruby/object:RI::MethodSummary 
  name: fatal?
- !ruby/object:RI::MethodSummary 
  name: format_message
- !ruby/object:RI::MethodSummary 
  name: format_severity
- !ruby/object:RI::MethodSummary 
  name: info
- !ruby/object:RI::MethodSummary 
  name: info?
- !ruby/object:RI::MethodSummary 
  name: log
- !ruby/object:RI::MethodSummary 
  name: unknown
- !ruby/object:RI::MethodSummary 
  name: warn
- !ruby/object:RI::MethodSummary 
  name: warn?
name: Logger
superclass: Object
PK�|[�Ւ�33$ri/1.8/system/Logger/fatal%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> iff the current severity level allows for the printing of <tt>FATAL</tt> messages.
full_name: Logger#fatal?
is_singleton: false
name: fatal?
params: ()
visibility: public
PK�|[Cݴ���+ri/1.8/system/Logger/datetime_format-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger#datetime_format
is_singleton: false
name: datetime_format
params: ()
visibility: public
PK�|[a�9BB!ri/1.8/system/Logger/fatal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Log a <tt>FATAL</tt> message.
- !ruby/struct:SM::Flow::P 
  body: "See #info for more information."
full_name: Logger#fatal
is_singleton: false
name: fatal
params: (progname = nil, &block)
visibility: public
PK�|[�K��ri/1.8/system/Logger/log-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add"
full_name: Logger#log
is_singleton: false
name: log
params: (severity, message = nil, progname = nil, &block)
visibility: public
PK�|[Wb qqri/1.8/system/Logger/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Synopsis
- !ruby/struct:SM::Flow::VERB 
  body: "  Logger.new(name, shift_age = 7, shift_size = 1048576)\n  Logger.new(name, shift_age = 'weekly')\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Args
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+logdev+:"
    body: The log device. This is a filename (String) or IO object (typically <tt>STDOUT</tt>, <tt>STDERR</tt>, or an open file).
  - !ruby/struct:SM::Flow::LI 
    label: "+shift_age+:"
    body: Number of old log files to keep, <b>or</b> frequency of rotation (<tt>daily</tt>, <tt>weekly</tt> or <tt>monthly</tt>).
  - !ruby/struct:SM::Flow::LI 
    label: "+shift_size+:"
    body: Maximum logfile size (only applies when <tt>shift_age</tt> is a number).
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Description
- !ruby/struct:SM::Flow::P 
  body: Create an instance.
full_name: Logger::new
is_singleton: true
name: new
params: (logdev, shift_age = 0, shift_size = 1048576)
visibility: public
PK�|[��o��4ri/1.8/system/Logger/LogDevice/create_logfile-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger::LogDevice#create_logfile
is_singleton: false
name: create_logfile
params: (filename)
visibility: private
PK�|[z�6/��2ri/1.8/system/Logger/LogDevice/open_logfile-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger::LogDevice#open_logfile
is_singleton: false
name: open_logfile
params: (filename)
visibility: private
PK�|[��ٔGri/1.8/system/Logger/LogDevice/LogDeviceMutex/cdesc-LogDeviceMutex.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Logger::LogDevice::LogDeviceMutex
includes: 
- !ruby/object:RI::IncludedModule 
  name: MonitorMixin
instance_methods: []

name: LogDeviceMutex
superclass: Object
PK�|[91���3ri/1.8/system/Logger/LogDevice/cdesc-LogDevice.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: dev
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: filename
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: SiD
  value: 24 * 60 * 60
full_name: Logger::LogDevice
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_log_header
- !ruby/object:RI::MethodSummary 
  name: check_shift_log
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: create_logfile
- !ruby/object:RI::MethodSummary 
  name: eod
- !ruby/object:RI::MethodSummary 
  name: open_logfile
- !ruby/object:RI::MethodSummary 
  name: previous_period_end
- !ruby/object:RI::MethodSummary 
  name: shift_log_age
- !ruby/object:RI::MethodSummary 
  name: shift_log_period
- !ruby/object:RI::MethodSummary 
  name: write
name: LogDevice
superclass: Object
PK�|[�n���)ri/1.8/system/Logger/LogDevice/eod-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger::LogDevice#eod
is_singleton: false
name: eod
params: (t)
visibility: private
PK�|[-)k���)ri/1.8/system/Logger/LogDevice/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger::LogDevice::new
is_singleton: true
name: new
params: (log = nil, opt = {})
visibility: public
PK�|[�:���5ri/1.8/system/Logger/LogDevice/check_shift_log-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger::LogDevice#check_shift_log
is_singleton: false
name: check_shift_log
params: ()
visibility: private
PK�|[�]���3ri/1.8/system/Logger/LogDevice/shift_log_age-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger::LogDevice#shift_log_age
is_singleton: false
name: shift_log_age
params: ()
visibility: private
PK�|[ȅ���+ri/1.8/system/Logger/LogDevice/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger::LogDevice#write
is_singleton: false
name: write
params: (message)
visibility: public
PK�|[tF�q��6ri/1.8/system/Logger/LogDevice/shift_log_period-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger::LogDevice#shift_log_period
is_singleton: false
name: shift_log_period
params: (now)
visibility: private
PK�|[����4ri/1.8/system/Logger/LogDevice/add_log_header-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger::LogDevice#add_log_header
is_singleton: false
name: add_log_header
params: (file)
visibility: private
PK�|[\W�ͯ�+ri/1.8/system/Logger/LogDevice/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger::LogDevice#close
is_singleton: false
name: close
params: ()
visibility: public
PK�|[�q(���9ri/1.8/system/Logger/LogDevice/previous_period_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger::LogDevice#previous_period_end
is_singleton: false
name: previous_period_end
params: (now)
visibility: private
PK�|[��'��*ri/1.8/system/Logger/Formatter/call-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger::Formatter#call
is_singleton: false
name: call
params: (severity, time, progname, msg)
visibility: public
PK�|[ځ�8��-ri/1.8/system/Logger/Formatter/msg2str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger::Formatter#msg2str
is_singleton: false
name: msg2str
params: (msg)
visibility: private
PK�|[�����)ri/1.8/system/Logger/Formatter/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger::Formatter::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[Hk�333ri/1.8/system/Logger/Formatter/cdesc-Formatter.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: datetime_format
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Format
  value: "\"%s, [%s#%d] %5s -- %s: %s\\n\""
full_name: Logger::Formatter
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: call
- !ruby/object:RI::MethodSummary 
  name: format_datetime
- !ruby/object:RI::MethodSummary 
  name: msg2str
name: Formatter
superclass: Object
PK�|[�����5ri/1.8/system/Logger/Formatter/format_datetime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger::Formatter#format_datetime
is_singleton: false
name: format_datetime
params: (time)
visibility: private
PK�|[%��22"ri/1.8/system/Logger/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Dump given message to the log device without any formatting. If no log device exists, return <tt>nil</tt>.
full_name: Logger#<<
is_singleton: false
name: "<<"
params: (msg)
visibility: public
PK�|[����+ri/1.8/system/Logger/format_severity-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger#format_severity
is_singleton: false
name: format_severity
params: (severity)
visibility: private
PK�|[�{���*ri/1.8/system/Logger/format_message-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Logger#format_message
is_singleton: false
name: format_message
params: (severity, datetime, progname, msg)
visibility: private
PK�|[:,,.ri/1.8/system/Logger/datetime_format%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Logging date-time format (string passed to <tt>strftime</tt>).
full_name: Logger#datetime_format=
is_singleton: false
name: datetime_format=
params: (datetime_format)
visibility: public
PK�|[������!ri/1.8/system/Logger/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Close the logging device.
full_name: Logger#close
is_singleton: false
name: close
params: ()
visibility: public
PK�|[�➕33$ri/1.8/system/Logger/debug%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> iff the current severity level allows for the printing of <tt>DEBUG</tt> messages.
full_name: Logger#debug?
is_singleton: false
name: debug?
params: ()
visibility: public
PK�|[n�
33$ri/1.8/system/Logger/error%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> iff the current severity level allows for the printing of <tt>ERROR</tt> messages.
full_name: Logger#error?
is_singleton: false
name: error?
params: ()
visibility: public
PK�|[h�00#ri/1.8/system/Logger/warn%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> iff the current severity level allows for the printing of <tt>WARN</tt> messages.
full_name: Logger#warn?
is_singleton: false
name: warn?
params: ()
visibility: public
PK�|[I�5��1ri/1.8/system/Logger/Severity/cdesc-Severity.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Logging severity.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: DEBUG
  value: "0"
- !ruby/object:RI::Constant 
  comment: 
  name: INFO
  value: "1"
- !ruby/object:RI::Constant 
  comment: 
  name: WARN
  value: "2"
- !ruby/object:RI::Constant 
  comment: 
  name: ERROR
  value: "3"
- !ruby/object:RI::Constant 
  comment: 
  name: FATAL
  value: "4"
- !ruby/object:RI::Constant 
  comment: 
  name: UNKNOWN
  value: "5"
full_name: Logger::Severity
includes: []

instance_methods: []

name: Severity
superclass: 
PK�|[���BB!ri/1.8/system/Logger/debug-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Log a <tt>DEBUG</tt> message.
- !ruby/struct:SM::Flow::P 
  body: "See #info for more information."
full_name: Logger#debug
is_singleton: false
name: debug
params: (progname = nil, &block)
visibility: public
PK�|[k�%�?? ri/1.8/system/Logger/warn-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Log a <tt>WARN</tt> message.
- !ruby/struct:SM::Flow::P 
  body: "See #info for more information."
full_name: Logger#warn
is_singleton: false
name: warn
params: (progname = nil, &block)
visibility: public
PK�|[�EE!ri/1.8/system/Rational/%25-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the remainder when this value is divided by <tt>other</tt>.
- !ruby/struct:SM::Flow::P 
  body: "Examples:"
- !ruby/struct:SM::Flow::VERB 
  body: "  r = Rational(7,4)    # -&gt; Rational(7,4)\n  r % Rational(1,2)    # -&gt; Rational(1,4)\n  r % 1                # -&gt; Rational(3,4)\n  r % Rational(1,7)    # -&gt; Rational(1,28)\n  r % 0.26             # -&gt; 0.19\n"
full_name: Rational#%
is_singleton: false
name: "%"
params: (other)
visibility: public
PK�|[�yvv$ri/1.8/system/Rational/new%21-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Implements the constructor. This method does not reduce to lowest terms or check for division by zero. Therefore #Rational() should be preferred in normal use."
full_name: Rational::new!
is_singleton: true
name: new!
params: (num, den = 1)
visibility: public
PK�|[D			$ri/1.8/system/Rational/%2a%2a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns this value raised to the given power.
- !ruby/struct:SM::Flow::P 
  body: "Examples:"
- !ruby/struct:SM::Flow::VERB 
  body: "  r = Rational(3,4)    # -&gt; Rational(3,4)\n  r ** 2               # -&gt; Rational(9,16)\n  r ** 2.0             # -&gt; 0.5625\n  r ** Rational(1,2)   # -&gt; 0.866025403784439\n"
full_name: Rational#**
is_singleton: false
name: "**"
params: (other)
visibility: public
PK�|[h��'ri/1.8/system/Rational/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Standard comparison operator.
full_name: Rational#<=>
is_singleton: false
name: <=>
params: (other)
visibility: public
PK�|[2�u���$ri/1.8/system/Rational/coerce-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Rational#coerce
is_singleton: false
name: coerce
params: (other)
visibility: public
PK�|[e��=��"ri/1.8/system/Rational/to_i-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #truncate"
full_name: Rational#to_i
is_singleton: false
name: to_i
params: ()
visibility: public
PK�|[��|���!ri/1.8/system/Rational/%2f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the quotient of this value and <tt>a</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "  r = Rational(3,4)    # -&gt; Rational(3,4)\n  r / 2                # -&gt; Rational(3,8)\n  r / 2.0              # -&gt; 0.375\n  r / Rational(1,2)    # -&gt; Rational(3,2)\n"
full_name: Rational#/
is_singleton: false
name: /
params: (a)
visibility: public
PK�|[�TA���$ri/1.8/system/Rational/divmod-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the quotient <em>and</em> remainder.
- !ruby/struct:SM::Flow::P 
  body: "Examples:"
- !ruby/struct:SM::Flow::VERB 
  body: "  r = Rational(7,4)        # -&gt; Rational(7,4)\n  r.divmod Rational(1,2)   # -&gt; [3, Rational(1,4)]\n"
full_name: Rational#divmod
is_singleton: false
name: divmod
params: (other)
visibility: public
PK�|[����"ri/1.8/system/Rational/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a hash code for the object.
full_name: Rational#hash
is_singleton: false
name: hash
params: ()
visibility: public
PK�|[ �r���!ri/1.8/system/Rational/abs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the absolute value.
full_name: Rational#abs
is_singleton: false
name: abs
params: ()
visibility: public
PK�|[�
�//!ri/1.8/system/Rational/%2a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the product of this value and <tt>a</tt>.
- !ruby/struct:SM::Flow::P 
  body: "Examples:"
- !ruby/struct:SM::Flow::VERB 
  body: "  r = Rational(3,4)    # -&gt; Rational(3,4)\n  r * 2                # -&gt; Rational(3,2)\n  r * 4                # -&gt; Rational(3,1)\n  r * 0.5              # -&gt; 0.375\n  r * Rational(1,2)    # -&gt; Rational(3,8)\n"
full_name: Rational#*
is_singleton: false
name: "*"
params: (a)
visibility: public
PK�|[�Kkk%ri/1.8/system/Rational/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns a reconstructable string representation:"
- !ruby/struct:SM::Flow::VERB 
  body: "  Rational(5,8).inspect     # -&gt; &quot;Rational(5, 8)&quot;\n"
full_name: Rational#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[���ä�"ri/1.8/system/Rational/ceil-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Rational#ceil
is_singleton: false
name: ceil
params: ()
visibility: public
PK�|[�����!ri/1.8/system/Rational/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: This method is actually private.
full_name: Rational::new
is_singleton: true
name: new
params: (num, den)
visibility: public
PK�|[��v��$ri/1.8/system/Rational/power2-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Rational#power2
is_singleton: false
name: power2
params: (other)
visibility: public
PK�|[S�i���*ri/1.8/system/Rational/cdesc-Rational.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: denominator
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: numerator
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: new!
- !ruby/object:RI::MethodSummary 
  name: reduce
comment: 
- !ruby/struct:SM::Flow::P 
  body: Rational implements a rational class for numbers.
- !ruby/struct:SM::Flow::P 
  body: <em>A rational number is a number that can be expressed as a fraction p/q where p and q are integers and q != 0. A rational number p/q is said to have numerator p and denominator q. Numbers that are not rational are called irrational numbers.</em> (http://mathworld.wolfram.com/RationalNumber.html)
- !ruby/struct:SM::Flow::P 
  body: "To create a Rational Number:"
- !ruby/struct:SM::Flow::VERB 
  body: "  Rational(a,b)             # -&gt; a/b\n  Rational.new!(a,b)        # -&gt; a/b\n"
- !ruby/struct:SM::Flow::P 
  body: "Examples:"
- !ruby/struct:SM::Flow::VERB 
  body: "  Rational(5,6)             # -&gt; 5/6\n  Rational(5)               # -&gt; 5/1\n"
- !ruby/struct:SM::Flow::P 
  body: "Rational numbers are reduced to their lowest terms:"
- !ruby/struct:SM::Flow::VERB 
  body: "  Rational(6,10)            # -&gt; 3/5\n"
- !ruby/struct:SM::Flow::P 
  body: "But not if you use the unusual method &quot;new!&quot;:"
- !ruby/struct:SM::Flow::VERB 
  body: "  Rational.new!(6,10)       # -&gt; 6/10\n"
- !ruby/struct:SM::Flow::P 
  body: "Division by zero is obviously not allowed:"
- !ruby/struct:SM::Flow::VERB 
  body: "  Rational(3,0)             # -&gt; ZeroDivisionError\n"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Unify
  value: "true"
full_name: Rational
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "%"
- !ruby/object:RI::MethodSummary 
  name: "*"
- !ruby/object:RI::MethodSummary 
  name: "**"
- !ruby/object:RI::MethodSummary 
  name: "**"
- !ruby/object:RI::MethodSummary 
  name: +
- !ruby/object:RI::MethodSummary 
  name: "-"
- !ruby/object:RI::MethodSummary 
  name: /
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: abs
- !ruby/object:RI::MethodSummary 
  name: ceil
- !ruby/object:RI::MethodSummary 
  name: coerce
- !ruby/object:RI::MethodSummary 
  name: div
- !ruby/object:RI::MethodSummary 
  name: divmod
- !ruby/object:RI::MethodSummary 
  name: floor
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: power2
- !ruby/object:RI::MethodSummary 
  name: round
- !ruby/object:RI::MethodSummary 
  name: to_f
- !ruby/object:RI::MethodSummary 
  name: to_i
- !ruby/object:RI::MethodSummary 
  name: to_r
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: truncate
name: Rational
superclass: Object
PK�|[��$���!ri/1.8/system/Rational/%2b-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the addition of this value and <tt>a</tt>.
- !ruby/struct:SM::Flow::P 
  body: "Examples:"
- !ruby/struct:SM::Flow::VERB 
  body: "  r = Rational(3,4)      # -&gt; Rational(3,4)\n  r + 1                  # -&gt; Rational(7,4)\n  r + 0.5                # -&gt; 1.25\n"
full_name: Rational#+
is_singleton: false
name: +
params: (a)
visibility: public
PK�|[�f���&ri/1.8/system/Rational/truncate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: to_i
block_params: 
comment: 
full_name: Rational#truncate
is_singleton: false
name: truncate
params: ()
visibility: public
PK�|[e5H���"ri/1.8/system/Rational/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a string representation of the rational number.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  Rational(3,4).to_s          #  &quot;3/4&quot;\n  Rational(8).to_s            #  &quot;8&quot;\n"
full_name: Rational#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[�k��$ri/1.8/system/Rational/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> iff this value is numerically equal to <tt>other</tt>.
- !ruby/struct:SM::Flow::P 
  body: "But beware:"
- !ruby/struct:SM::Flow::VERB 
  body: "  Rational(1,2) == Rational(4,8)          # -&gt; true\n  Rational(1,2) == Rational.new!(4,8)     # -&gt; false\n"
- !ruby/struct:SM::Flow::P 
  body: Don't use Rational.new!
full_name: Rational#==
is_singleton: false
name: ==
params: (other)
visibility: public
PK�|[�����"ri/1.8/system/Rational/to_r-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>self</tt>.
full_name: Rational#to_r
is_singleton: false
name: to_r
params: ()
visibility: public
PK�|[�h.��!ri/1.8/system/Rational/div-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Rational#div
is_singleton: false
name: div
params: (other)
visibility: public
PK�|[�^W��#ri/1.8/system/Rational/round-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Rational#round
is_singleton: false
name: round
params: ()
visibility: public
PK�|[�)=���#ri/1.8/system/Rational/floor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Converts the rational to an Integer. Not the <em>nearest</em> integer, the truncated integer. Study the following example carefully:"
- !ruby/struct:SM::Flow::VERB 
  body: "  Rational(+7,4).to_i             # -&gt; 1\n  Rational(-7,4).to_i             # -&gt; -1\n  (-1.75).to_i                    # -&gt; -1\n"
- !ruby/struct:SM::Flow::P 
  body: "In other words:"
- !ruby/struct:SM::Flow::VERB 
  body: "  Rational(-7,4) == -1.75                 # -&gt; true\n  Rational(-7,4).to_i == (-1.75).to_i     # -&gt; true\n"
full_name: Rational#floor
is_singleton: false
name: floor
params: ()
visibility: public
PK�|[GwK���"ri/1.8/system/Rational/to_f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts the rational to a Float.
full_name: Rational#to_f
is_singleton: false
name: to_f
params: ()
visibility: public
PK�|[;p_033$ri/1.8/system/Rational/reduce-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reduces the given numerator and denominator to their lowest terms. Use Rational() instead.
full_name: Rational::reduce
is_singleton: true
name: reduce
params: (num, den = 1)
visibility: public
PK�|[0H�H��!ri/1.8/system/Rational/%2d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the difference of this value and <tt>a</tt>. subtracted.
- !ruby/struct:SM::Flow::P 
  body: "Examples:"
- !ruby/struct:SM::Flow::VERB 
  body: "  r = Rational(3,4)    # -&gt; Rational(3,4)\n  r - 1                # -&gt; Rational(-1,4)\n  r - 0.5              # -&gt; 0.25\n"
full_name: Rational#-
is_singleton: false
name: "-"
params: (a)
visibility: public
PK�|[�s""ri/1.8/system/Pathname/stat-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.stat</tt>. Returns a <tt>File::Stat</tt> object.
full_name: Pathname#stat
is_singleton: false
name: stat
params: ()
visibility: public
PK�|[�G�)ri/1.8/system/Pathname/split_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: split_names(path) -&gt; prefix, [name, ...]
full_name: Pathname#split_names
is_singleton: false
name: split_names
params: (path)
visibility: private
PK�|[���44ri/1.8/system/Pathname/add_trailing_separator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: add_trailing_separator(path) -&gt; path
full_name: Pathname#add_trailing_separator
is_singleton: false
name: add_trailing_separator
params: (path)
visibility: private
PK�|[?��T��,ri/1.8/system/Pathname/prepend_prefix-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Pathname#prepend_prefix
is_singleton: false
name: prepend_prefix
params: (prefix, relpath)
visibility: private
PK�|[$
����"ri/1.8/system/Pathname/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.size</tt>.
full_name: Pathname#size
is_singleton: false
name: size
params: ()
visibility: public
PK�|[�����$ri/1.8/system/Pathname/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #=="
full_name: Pathname#eql?
is_singleton: false
name: eql?
params: (other)
visibility: public
PK�|[�^�#ri/1.8/system/Pathname/ctime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.ctime</tt>. Returns last (directory entry, not file) change time.
full_name: Pathname#ctime
is_singleton: false
name: ctime
params: ()
visibility: public
PK�|[}��l&ri/1.8/system/Pathname/basename-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.basename</tt>. Returns the last component of the path.
full_name: Pathname#basename
is_singleton: false
name: basename
params: (*args)
visibility: public
PK�|[%IX+ri/1.8/system/Pathname/chop_basename-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: chop_basename(path) -&gt; [pre-basename, basename] or nil
full_name: Pathname#chop_basename
is_singleton: false
name: chop_basename
params: (path)
visibility: private
PK�|[�}�\��'ri/1.8/system/Pathname/socket%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.socket?</tt>.
full_name: Pathname#socket?
is_singleton: false
name: socket?
params: ()
visibility: public
PK�|[��K4��)ri/1.8/system/Pathname/readable%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.readable?</tt>.
full_name: Pathname#readable?
is_singleton: false
name: readable?
params: ()
visibility: public
PK�|[�D����%ri/1.8/system/Pathname/descend-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: v
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over and yields a new Pathname object for each element in the given path in descending order.
- !ruby/struct:SM::Flow::VERB 
  body: " Pathname.new('/path/to/some/file.rb').descend {|v| p v}\n    #&lt;Pathname:/&gt;\n    #&lt;Pathname:/path&gt;\n    #&lt;Pathname:/path/to&gt;\n    #&lt;Pathname:/path/to/some&gt;\n    #&lt;Pathname:/path/to/some/file.rb&gt;\n\n Pathname.new('path/to/some/file.rb').descend {|v| p v}\n    #&lt;Pathname:path&gt;\n    #&lt;Pathname:path/to&gt;\n    #&lt;Pathname:path/to/some&gt;\n    #&lt;Pathname:path/to/some/file.rb&gt;\n"
- !ruby/struct:SM::Flow::P 
  body: It doesn't access actual filesystem.
- !ruby/struct:SM::Flow::P 
  body: This method is available since 1.8.5.
full_name: Pathname#descend
is_singleton: false
name: descend
params: () {|v| ...}
visibility: public
PK�|[��7��&ri/1.8/system/Pathname/exist%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.exist?</tt>.
full_name: Pathname#exist?
is_singleton: false
name: exist?
params: ()
visibility: public
PK�|[��8�(()ri/1.8/system/Pathname/foreachline-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Pathname#foreachline is <b>obsoleted</b> at 1.8.1. Use #each_line."
full_name: Pathname#foreachline
is_singleton: false
name: foreachline
params: (*args, &block)
visibility: public
PK�|[�/H���(ri/1.8/system/Pathname/chardev%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.chardev?</tt>.
full_name: Pathname#chardev?
is_singleton: false
name: chardev?
params: ()
visibility: public
PK�|[�w�8==$ri/1.8/system/Pathname/mkpath-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileUtils.mkpath</tt>. Creates a full path, including any intermediate directories that don't yet exist.
full_name: Pathname#mkpath
is_singleton: false
name: mkpath
params: ()
visibility: public
PK�|[|�nm��#ri/1.8/system/Pathname/chmod-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.chmod</tt>. Changes permissions.
full_name: Pathname#chmod
is_singleton: false
name: chmod
params: (mode)
visibility: public
PK�|[�eH��'ri/1.8/system/Pathname/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Provides for comparing pathnames, case-sensitively.
full_name: Pathname#<=>
is_singleton: false
name: <=>
params: (other)
visibility: public
PK�|[�n�@$$+ri/1.8/system/Pathname/mountpoint%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "#mountpoint? returns <tt>true</tt> if <tt>self</tt> points to a mountpoint."
full_name: Pathname#mountpoint?
is_singleton: false
name: mountpoint?
params: ()
visibility: public
PK�|[{��#ri/1.8/system/Pathname/rmdir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>Dir.rmdir</tt>. Remove the referenced directory.
full_name: Pathname#rmdir
is_singleton: false
name: rmdir
params: ()
visibility: public
PK�|[,��))%ri/1.8/system/Pathname/entries-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the entries (files and subdirectories) in the directory, each as a Pathname object.
full_name: Pathname#entries
is_singleton: false
name: entries
params: ()
visibility: public
PK�|['F4}��"ri/1.8/system/Pathname/find-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: p
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pathname#find is an iterator to traverse a directory tree in a depth first manner. It yields a Pathname for each file under &quot;this&quot; directory.
- !ruby/struct:SM::Flow::P 
  body: Since it is implemented by <tt>find.rb</tt>, <tt>Find.prune</tt> can be used to control the traverse.
- !ruby/struct:SM::Flow::P 
  body: If <tt>self</tt> is <tt>.</tt>, yielded pathnames begin with a filename in the current directory, not <tt>./</tt>.
full_name: Pathname#find
is_singleton: false
name: find
params: () {|p| ...}
visibility: public
PK�|[��;"ri/1.8/system/Pathname/glob-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: p
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>Dir.glob</tt>. Returns or yields Pathname objects.
full_name: Pathname::glob
is_singleton: true
name: glob
params: (*args) {|p| ...}
visibility: public
PK�|[���'ri/1.8/system/Pathname/cleanpath-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns clean pathname of <tt>self</tt> with consecutive slashes and useless dots removed. The filesystem is not accessed.
- !ruby/struct:SM::Flow::P 
  body: "If <tt>consider_symlink</tt> is <tt>true</tt>, then a more conservative algorithm is used to avoid breaking symbolic linkages. This may retain more <tt>..</tt> entries than absolutely necessary, but without accessing the filesystem, this can't be avoided. See #realpath."
full_name: Pathname#cleanpath
is_singleton: false
name: cleanpath
params: (consider_symlink=false)
visibility: public
PK�|[f�:�.."ri/1.8/system/Pathname/read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>IO.read</tt>. Returns all the bytes from the file, or the first <tt>N</tt> if specified.
full_name: Pathname#read
is_singleton: false
name: read
params: (*args)
visibility: public
PK�|[^�{
��%ri/1.8/system/Pathname/TO_PATH-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #to_s"
full_name: Pathname#TO_PATH
is_singleton: false
name: TO_PATH
params: ()
visibility: public
PK�|[��X~��#ri/1.8/system/Pathname/lstat-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.lstat</tt>.
full_name: Pathname#lstat
is_singleton: false
name: lstat
params: ()
visibility: public
PK�|[�//SS$ri/1.8/system/Pathname/unlink-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: delete
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes a file or directory, using <tt>File.unlink</tt> or <tt>Dir.unlink</tt> as necessary.
full_name: Pathname#unlink
is_singleton: false
name: unlink
params: ()
visibility: public
PK�|[�_{��'ri/1.8/system/Pathname/each_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: line
comment: 
- !ruby/struct:SM::Flow::P 
  body: "#each_line iterates over the line in the file. It yields a String object for each line."
- !ruby/struct:SM::Flow::P 
  body: This method has existed since 1.8.1.
full_name: Pathname#each_line
is_singleton: false
name: each_line
params: (*args) {|line| ...}
visibility: public
PK�|[���_/ri/1.8/system/Pathname/world_readable%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.world_readable?</tt>.
full_name: Pathname#world_readable?
is_singleton: false
name: world_readable?
params: ()
visibility: public
PK�|[�M���)ri/1.8/system/Pathname/writable%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.writable?</tt>.
full_name: Pathname#writable?
is_singleton: false
name: writable?
params: ()
visibility: public
PK�|[R�y���(ri/1.8/system/Pathname/each_entry-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: p
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over the entries (files and subdirectories) in the directory. It yields a Pathname object for each entry.
- !ruby/struct:SM::Flow::P 
  body: This method has existed since 1.8.1.
full_name: Pathname#each_entry
is_singleton: false
name: each_entry
params: () {|p| ...}
visibility: public
PK�|[�KN
0ri/1.8/system/Pathname/executable_real%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.executable_real?</tt>.
full_name: Pathname#executable_real?
is_singleton: false
name: executable_real?
params: ()
visibility: public
PK�|[�y;f&&%ri/1.8/system/Pathname/foreach-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "This method is <b>obsoleted</b> at 1.8.1. Use #each_line or #each_entry."
full_name: Pathname#foreach
is_singleton: false
name: foreach
params: (*args, &block)
visibility: public
PK�|[������$ri/1.8/system/Pathname/lchmod-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.lchmod</tt>.
full_name: Pathname#lchmod
is_singleton: false
name: lchmod
params: (mode)
visibility: public
PK�|[$��4��4ri/1.8/system/Pathname/cleanpath_conservative-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Pathname#cleanpath_conservative
is_singleton: false
name: cleanpath_conservative
params: ()
visibility: private
PK�|[�����$ri/1.8/system/Pathname/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #unlink"
full_name: Pathname#delete
is_singleton: false
name: delete
params: ()
visibility: public
PK�|[�i���)ri/1.8/system/Pathname/expand_path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.expand_path</tt>.
full_name: Pathname#expand_path
is_singleton: false
name: expand_path
params: (*args)
visibility: public
PK�|[����)ri/1.8/system/Pathname/dir_foreach-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pathname#dir_foreach is <b>obsoleted</b> at 1.8.1.
full_name: Pathname#dir_foreach
is_singleton: false
name: dir_foreach
params: (*args, &block)
visibility: public
PK�|[2r���$ri/1.8/system/Pathname/rename-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.rename</tt>. Rename the file.
full_name: Pathname#rename
is_singleton: false
name: rename
params: (to)
visibility: public
PK�|[�]�"ri/1.8/system/Pathname/open-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: file
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.open</tt>. Opens the file for reading or writing.
full_name: Pathname#open
is_singleton: false
name: open
params: (*args) {|file| ...}
visibility: public
PK�|[C2~'ri/1.8/system/Pathname/make_link-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.link</tt>. Creates a hard link.
full_name: Pathname#make_link
is_singleton: false
name: make_link
params: (old)
visibility: public
PK�|[�'Ñ#ri/1.8/system/Pathname/mkdir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>Dir.mkdir</tt>. Create the referenced directory.
full_name: Pathname#mkdir
is_singleton: false
name: mkdir
params: (*args)
visibility: public
PK�|[��%ri/1.8/system/Pathname/dirname-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.dirname</tt>. Returns all but the last component of the path.
full_name: Pathname#dirname
is_singleton: false
name: dirname
params: ()
visibility: public
PK�|[l'��II)ri/1.8/system/Pathname/absolute%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Predicate method for testing whether a path is absolute. It returns <tt>true</tt> if the pathname begins with a slash.
full_name: Pathname#absolute?
is_singleton: false
name: absolute?
params: ()
visibility: public
PK�|[�nYgg!ri/1.8/system/Pathname/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a Pathname object from the given String (or String-like object). If <tt>path</tt> contains a NUL character (<tt>\0</tt>), an ArgumentError is raised.
full_name: Pathname::new
is_singleton: true
name: new
params: (path)
visibility: public
PK�|[8���)ri/1.8/system/Pathname/grpowned%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.grpowned?</tt>.
full_name: Pathname#grpowned?
is_singleton: false
name: grpowned?
params: ()
visibility: public
PK�|[z�֠II"ri/1.8/system/Pathname/link-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pathname#link is confusing and <b>obsoleted</b> because the receiver/argument order is inverted to corresponding system call.
full_name: Pathname#link
is_singleton: false
name: link
params: (old)
visibility: public
PK�|[/j��&ri/1.8/system/Pathname/readlink-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.readlink</tt>. Read symbolic link.
full_name: Pathname#readlink
is_singleton: false
name: readlink
params: ()
visibility: public
PK�|[�Ǎ�#ri/1.8/system/Pathname/split-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "See <tt>File.split</tt>. Returns the #dirname and the #basename in an Array."
full_name: Pathname#split
is_singleton: false
name: split
params: ()
visibility: public
PK�|[Ci����4ri/1.8/system/Pathname/del_trailing_separator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Pathname#del_trailing_separator
is_singleton: false
name: del_trailing_separator
params: (path)
visibility: private
PK�|[��\#ri/1.8/system/Pathname/mtime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.mtime</tt>. Returns last modification time.
full_name: Pathname#mtime
is_singleton: false
name: mtime
params: ()
visibility: public
PK�|[c"�1��&ri/1.8/system/Pathname/children-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the children of the directory (files and subdirectories, not recursive) as an array of Pathname objects. By default, the returned pathnames will have enough information to access the files. If you set <tt>with_directory</tt> to <tt>false</tt>, then the returned pathnames will contain the filename only.
- !ruby/struct:SM::Flow::P 
  body: "For example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  p = Pathname(&quot;/usr/lib/ruby/1.8&quot;)\n  p.children\n      # -&gt; [ Pathname:/usr/lib/ruby/1.8/English.rb,\n             Pathname:/usr/lib/ruby/1.8/Env.rb,\n             Pathname:/usr/lib/ruby/1.8/abbrev.rb, ... ]\n  p.children(false)\n      # -&gt; [ Pathname:English.rb, Pathname:Env.rb, Pathname:abbrev.rb, ... ]\n"
- !ruby/struct:SM::Flow::P 
  body: Note that the result never contain the entries <tt>.</tt> and <tt>..</tt> in the directory because they are not children.
- !ruby/struct:SM::Flow::P 
  body: This method has existed since 1.8.1.
full_name: Pathname#children
is_singleton: false
name: children
params: (with_directory=true)
visibility: public
PK�|[�����+ri/1.8/system/Pathname/each_filename-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: filename
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over each component of the path.
- !ruby/struct:SM::Flow::VERB 
  body: "  Pathname.new(&quot;/usr/bin/ruby&quot;).each_filename {|filename| ... }\n    # yields &quot;usr&quot;, &quot;bin&quot;, and &quot;ruby&quot;.\n"
full_name: Pathname#each_filename
is_singleton: false
name: each_filename
params: ( {|filename| ...}
visibility: public
PK�|[W��~��'ri/1.8/system/Pathname/%3d%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #=="
full_name: Pathname#===
is_singleton: false
name: ===
params: (other)
visibility: public
PK�|[#�)$ri/1.8/system/Pathname/rmtree-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileUtils.rm_r</tt>. Deletes a directory and all beneath it.
full_name: Pathname#rmtree
is_singleton: false
name: rmtree
params: ()
visibility: public
PK�|[�
3�#ri/1.8/system/Pathname/getwd-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>Dir.getwd</tt>. Returns the current working directory as a Pathname.
full_name: Pathname::getwd
is_singleton: true
name: getwd
params: ()
visibility: public
PK�|[��=J��$ri/1.8/system/Pathname/lchown-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.lchown</tt>.
full_name: Pathname#lchown
is_singleton: false
name: lchown
params: (owner, group)
visibility: public
PK�|[�6V���%ri/1.8/system/Pathname/zero%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.zero?</tt>.
full_name: Pathname#zero?
is_singleton: false
name: zero?
params: ()
visibility: public
PK�|[)����'ri/1.8/system/Pathname/sticky%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.sticky?</tt>.
full_name: Pathname#sticky?
is_singleton: false
name: sticky?
params: ()
visibility: public
PK�|[���zz!ri/1.8/system/Pathname/%2b-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pathname#+ appends a pathname fragment to this one to produce a new Pathname object.
- !ruby/struct:SM::Flow::VERB 
  body: "  p1 = Pathname.new(&quot;/usr&quot;)      # Pathname:/usr\n  p2 = p1 + &quot;bin/ruby&quot;           # Pathname:/usr/bin/ruby\n  p3 = p1 + &quot;/etc/passwd&quot;        # Pathname:/etc/passwd\n"
- !ruby/struct:SM::Flow::P 
  body: This method doesn't access the file system; it is pure string manipulation.
full_name: Pathname#+
is_singleton: false
name: +
params: (other)
visibility: public
PK�|[m!�\&ri/1.8/system/Pathname/truncate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.truncate</tt>. Truncate the file to <tt>length</tt> bytes.
full_name: Pathname#truncate
is_singleton: false
name: truncate
params: (length)
visibility: public
PK�|[���c.ri/1.8/system/Pathname/readable_real%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.readable_real?</tt>.
full_name: Pathname#readable_real?
is_singleton: false
name: readable_real?
params: ()
visibility: public
PK�|[��+�#ri/1.8/system/Pathname/utime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.utime</tt>. Update the access and modification times.
full_name: Pathname#utime
is_singleton: false
name: utime
params: (atime, mtime)
visibility: public
PK�|[�E�ll"ri/1.8/system/Pathname/join-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pathname#join joins pathnames.
- !ruby/struct:SM::Flow::P 
  body: <tt>path0.join(path1, ..., pathN)</tt> is the same as <tt>path0 + path1 + ... + pathN</tt>.
full_name: Pathname#join
is_singleton: false
name: join
params: (*args)
visibility: public
PK�|[,�xj*ri/1.8/system/Pathname/make_symlink-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.symlink</tt>. Creates a symbolic link.
full_name: Pathname#make_symlink
is_singleton: false
name: make_symlink
params: (old)
visibility: public
PK�|[+H����#ri/1.8/system/Pathname/taint-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Pathname#taint
is_singleton: false
name: taint
params: ()
visibility: public
PK�|[-P�/ri/1.8/system/Pathname/world_writable%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.world_writable?</tt>.
full_name: Pathname#world_writable?
is_singleton: false
name: world_writable?
params: ()
visibility: public
PK�|[,�a��*ri/1.8/system/Pathname/realpath_rec-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Pathname#realpath_rec
is_singleton: false
name: realpath_rec
params: (prefix, unresolved, h)
visibility: private
PK�|[š䂨�$ri/1.8/system/Pathname/freeze-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Pathname#freeze
is_singleton: false
name: freeze
params: ()
visibility: public
PK�|[��&�"ri/1.8/system/Pathname/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: TO_PATH
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the path as a String.
full_name: Pathname#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[����*ri/1.8/system/Pathname/directory%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.directory?</tt>.
full_name: Pathname#directory?
is_singleton: false
name: directory?
params: ()
visibility: public
PK�|[�~	)��(ri/1.8/system/Pathname/symlink%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.symlink?</tt>.
full_name: Pathname#symlink?
is_singleton: false
name: symlink?
params: ()
visibility: public
PK�|[N����$ri/1.8/system/Pathname/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: ===
- !ruby/object:RI::AliasName 
  name: eql?
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compare this pathname with <tt>other</tt>. The comparison is string-based. Be aware that two different paths (<tt>foo.txt</tt> and <tt>./foo.txt</tt>) can refer to the same file.
full_name: Pathname#==
is_singleton: false
name: ==
params: (other)
visibility: public
PK�|[�"�77%ri/1.8/system/Pathname/fnmatch-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.fnmatch</tt>. Return <tt>true</tt> if the receiver matches the given pattern.
full_name: Pathname#fnmatch
is_singleton: false
name: fnmatch
params: (pattern, *args)
visibility: public
PK�|[V�g�>>*ri/1.8/system/Pathname/cdesc-Pathname.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: getwd
- !ruby/object:RI::MethodSummary 
  name: glob
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Pathname
- !ruby/struct:SM::Flow::P 
  body: "Pathname represents a pathname which locates a file in a filesystem. The pathname depends on OS: Unix, Windows, etc. Pathname library works with pathnames of local OS. However non-Unix pathnames are supported experimentally."
- !ruby/struct:SM::Flow::P 
  body: It does not represent the file itself. A Pathname can be relative or absolute. It's not until you try to reference the file that it even matters whether the file exists or not.
- !ruby/struct:SM::Flow::P 
  body: Pathname is immutable. It has no method for destructive update.
- !ruby/struct:SM::Flow::P 
  body: The value of this class is to manipulate file path information in a neater way than standard Ruby provides. The examples below demonstrate the difference. <b>All</b> functionality from File, FileTest, and some from Dir and FileUtils is included, in an unsurprising way. It is essentially a facade for all of these, and more.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Examples
- !ruby/struct:SM::Flow::H 
  level: 3
  text: "Example 1: Using Pathname"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'pathname'\n  p = Pathname.new(&quot;/usr/bin/ruby&quot;)\n  size = p.size              # 27662\n  isdir = p.directory?       # false\n  dir  = p.dirname           # Pathname:/usr/bin\n  base = p.basename          # Pathname:ruby\n  dir, base = p.split        # [Pathname:/usr/bin, Pathname:ruby]\n  data = p.read\n  p.open { |f| _ }\n  p.each_line { |line| _ }\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: "Example 2: Using standard Ruby"
- !ruby/struct:SM::Flow::VERB 
  body: "  p = &quot;/usr/bin/ruby&quot;\n  size = File.size(p)        # 27662\n  isdir = File.directory?(p) # false\n  dir  = File.dirname(p)     # &quot;/usr/bin&quot;\n  base = File.basename(p)    # &quot;ruby&quot;\n  dir, base = File.split(p)  # [&quot;/usr/bin&quot;, &quot;ruby&quot;]\n  data = File.read(p)\n  File.open(p) { |f| _ }\n  File.foreach(p) { |line| _ }\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: "Example 3: Special features"
- !ruby/struct:SM::Flow::VERB 
  body: "  p1 = Pathname.new(&quot;/usr/lib&quot;)   # Pathname:/usr/lib\n  p2 = p1 + &quot;ruby/1.8&quot;            # Pathname:/usr/lib/ruby/1.8\n  p3 = p1.parent                  # Pathname:/usr\n  p4 = p2.relative_path_from(p3)  # Pathname:lib/ruby/1.8\n  pwd = Pathname.pwd              # Pathname:/home/gavin\n  pwd.absolute?                   # true\n  p5 = Pathname.new &quot;.&quot;           # Pathname:.\n  p5 = p5 + &quot;music/../articles&quot;   # Pathname:music/../articles\n  p5.cleanpath                    # Pathname:articles\n  p5.realpath                     # Pathname:/home/gavin/articles\n  p5.children                     # [Pathname:/home/gavin/articles/linux, ...]\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Breakdown of functionality
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Core methods
- !ruby/struct:SM::Flow::P 
  body: "These methods are effectively manipulating a String, because that's all a path is. Except for #mountpoint?, #children, and #realpath, they don't access the filesystem."
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: +
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#join"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#parent"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#root?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#absolute?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#relative?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#relative_path_from"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#each_filename"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#cleanpath"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#realpath"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#children"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#mountpoint?"
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: File status predicate methods
- !ruby/struct:SM::Flow::P 
  body: "These methods are a facade for FileTest:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#blockdev?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#chardev?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#directory?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#executable?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#executable_real?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#exist?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#file?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#grpowned?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#owned?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#pipe?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#readable?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#world_readable?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#readable_real?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#setgid?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#setuid?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#size"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#size?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#socket?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#sticky?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#symlink?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#writable?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#world_writable?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#writable_real?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#zero?"
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: File property and manipulation methods
- !ruby/struct:SM::Flow::P 
  body: "These methods are a facade for File:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#atime"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#ctime"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#mtime"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#chmod(mode)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#lchmod(mode)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#chown(owner, group)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#lchown(owner, group)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#fnmatch(pattern, *args)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#fnmatch?(pattern, *args)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#ftype"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#make_link(old)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#open(*args, &amp;block)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#readlink"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#rename(to)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#stat"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#lstat"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#make_symlink(old)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#truncate(length)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#utime(atime, mtime)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#basename(*args)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#dirname"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#extname"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#expand_path(*args)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#split"
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Directory methods
- !ruby/struct:SM::Flow::P 
  body: "These methods are a facade for Dir:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: Pathname.glob(*args)
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: Pathname.getwd / Pathname.pwd
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#rmdir"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#entries"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#each_entry(&amp;block)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#mkdir(*args)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#opendir(*args)"
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: IO
- !ruby/struct:SM::Flow::P 
  body: "These methods are a facade for IO:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#each_line(*args, &amp;block)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#read(*args)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#readlines(*args)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#sysopen(*args)"
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Utilities
- !ruby/struct:SM::Flow::P 
  body: "These methods are a mixture of Find, FileUtils, and others:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#find(&amp;block)"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#mkpath"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#rmtree"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#unlink / #delete"
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Method documentation
- !ruby/struct:SM::Flow::P 
  body: As the above section shows, most of the methods in Pathname are facades. The documentation for these methods generally just says, for instance, &quot;See FileTest.writable?&quot;, as you should be familiar with the original method anyway, and its documentation (e.g. through <tt>ri</tt>) will contain more information. In some cases, a brief description will follow.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: SEPARATOR_PAT
  value: /[#{Regexp.quote File::ALT_SEPARATOR}#{Regexp.quote File::SEPARATOR}]/
- !ruby/object:RI::Constant 
  comment: 
  name: SEPARATOR_PAT
  value: /#{Regexp.quote File::SEPARATOR}/
full_name: Pathname
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: +
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: ===
- !ruby/object:RI::MethodSummary 
  name: TO_PATH
- !ruby/object:RI::MethodSummary 
  name: absolute?
- !ruby/object:RI::MethodSummary 
  name: add_trailing_separator
- !ruby/object:RI::MethodSummary 
  name: ascend
- !ruby/object:RI::MethodSummary 
  name: atime
- !ruby/object:RI::MethodSummary 
  name: basename
- !ruby/object:RI::MethodSummary 
  name: blockdev?
- !ruby/object:RI::MethodSummary 
  name: chardev?
- !ruby/object:RI::MethodSummary 
  name: chdir
- !ruby/object:RI::MethodSummary 
  name: children
- !ruby/object:RI::MethodSummary 
  name: chmod
- !ruby/object:RI::MethodSummary 
  name: chop_basename
- !ruby/object:RI::MethodSummary 
  name: chown
- !ruby/object:RI::MethodSummary 
  name: chroot
- !ruby/object:RI::MethodSummary 
  name: cleanpath
- !ruby/object:RI::MethodSummary 
  name: cleanpath_aggressive
- !ruby/object:RI::MethodSummary 
  name: cleanpath_conservative
- !ruby/object:RI::MethodSummary 
  name: ctime
- !ruby/object:RI::MethodSummary 
  name: del_trailing_separator
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: descend
- !ruby/object:RI::MethodSummary 
  name: dir_foreach
- !ruby/object:RI::MethodSummary 
  name: directory?
- !ruby/object:RI::MethodSummary 
  name: dirname
- !ruby/object:RI::MethodSummary 
  name: each_entry
- !ruby/object:RI::MethodSummary 
  name: each_filename
- !ruby/object:RI::MethodSummary 
  name: each_line
- !ruby/object:RI::MethodSummary 
  name: entries
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: executable?
- !ruby/object:RI::MethodSummary 
  name: executable_real?
- !ruby/object:RI::MethodSummary 
  name: exist?
- !ruby/object:RI::MethodSummary 
  name: expand_path
- !ruby/object:RI::MethodSummary 
  name: extname
- !ruby/object:RI::MethodSummary 
  name: file?
- !ruby/object:RI::MethodSummary 
  name: find
- !ruby/object:RI::MethodSummary 
  name: fnmatch
- !ruby/object:RI::MethodSummary 
  name: fnmatch?
- !ruby/object:RI::MethodSummary 
  name: foreach
- !ruby/object:RI::MethodSummary 
  name: foreachline
- !ruby/object:RI::MethodSummary 
  name: freeze
- !ruby/object:RI::MethodSummary 
  name: ftype
- !ruby/object:RI::MethodSummary 
  name: grpowned?
- !ruby/object:RI::MethodSummary 
  name: has_trailing_separator?
- !ruby/object:RI::MethodSummary 
  name: join
- !ruby/object:RI::MethodSummary 
  name: lchmod
- !ruby/object:RI::MethodSummary 
  name: lchown
- !ruby/object:RI::MethodSummary 
  name: link
- !ruby/object:RI::MethodSummary 
  name: lstat
- !ruby/object:RI::MethodSummary 
  name: make_link
- !ruby/object:RI::MethodSummary 
  name: make_symlink
- !ruby/object:RI::MethodSummary 
  name: mkdir
- !ruby/object:RI::MethodSummary 
  name: mkpath
- !ruby/object:RI::MethodSummary 
  name: mountpoint?
- !ruby/object:RI::MethodSummary 
  name: mtime
- !ruby/object:RI::MethodSummary 
  name: open
- !ruby/object:RI::MethodSummary 
  name: opendir
- !ruby/object:RI::MethodSummary 
  name: owned?
- !ruby/object:RI::MethodSummary 
  name: parent
- !ruby/object:RI::MethodSummary 
  name: pipe?
- !ruby/object:RI::MethodSummary 
  name: plus
- !ruby/object:RI::MethodSummary 
  name: prepend_prefix
- !ruby/object:RI::MethodSummary 
  name: read
- !ruby/object:RI::MethodSummary 
  name: readable?
- !ruby/object:RI::MethodSummary 
  name: readable_real?
- !ruby/object:RI::MethodSummary 
  name: readlines
- !ruby/object:RI::MethodSummary 
  name: readlink
- !ruby/object:RI::MethodSummary 
  name: realpath
- !ruby/object:RI::MethodSummary 
  name: realpath_rec
- !ruby/object:RI::MethodSummary 
  name: relative?
- !ruby/object:RI::MethodSummary 
  name: relative_path_from
- !ruby/object:RI::MethodSummary 
  name: rename
- !ruby/object:RI::MethodSummary 
  name: rmdir
- !ruby/object:RI::MethodSummary 
  name: rmtree
- !ruby/object:RI::MethodSummary 
  name: root?
- !ruby/object:RI::MethodSummary 
  name: setgid?
- !ruby/object:RI::MethodSummary 
  name: setuid?
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: size?
- !ruby/object:RI::MethodSummary 
  name: socket?
- !ruby/object:RI::MethodSummary 
  name: split
- !ruby/object:RI::MethodSummary 
  name: split_names
- !ruby/object:RI::MethodSummary 
  name: stat
- !ruby/object:RI::MethodSummary 
  name: sticky?
- !ruby/object:RI::MethodSummary 
  name: sub
- !ruby/object:RI::MethodSummary 
  name: symlink
- !ruby/object:RI::MethodSummary 
  name: symlink?
- !ruby/object:RI::MethodSummary 
  name: sysopen
- !ruby/object:RI::MethodSummary 
  name: taint
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: truncate
- !ruby/object:RI::MethodSummary 
  name: unlink
- !ruby/object:RI::MethodSummary 
  name: untaint
- !ruby/object:RI::MethodSummary 
  name: utime
- !ruby/object:RI::MethodSummary 
  name: world_readable?
- !ruby/object:RI::MethodSummary 
  name: world_writable?
- !ruby/object:RI::MethodSummary 
  name: writable?
- !ruby/object:RI::MethodSummary 
  name: writable_real?
- !ruby/object:RI::MethodSummary 
  name: zero?
name: Pathname
superclass: Object
PK�|[�XVc��'ri/1.8/system/Pathname/setgid%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.setgid?</tt>.
full_name: Pathname#setgid?
is_singleton: false
name: setgid?
params: ()
visibility: public
PK�|[��ff2ri/1.8/system/Pathname/cleanpath_aggressive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Clean the path simply by resolving and removing excess &quot;.&quot; and &quot;..&quot; entries. Nothing more, nothing less.
full_name: Pathname#cleanpath_aggressive
is_singleton: false
name: cleanpath_aggressive
params: ()
visibility: private
PK�|[�ŭ���'ri/1.8/system/Pathname/setuid%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.setuid?</tt>.
full_name: Pathname#setuid?
is_singleton: false
name: setuid?
params: ()
visibility: public
PK�|[G*�&7ri/1.8/system/Pathname/has_trailing_separator%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: has_trailing_separator?(path) -&gt; bool
full_name: Pathname#has_trailing_separator?
is_singleton: false
name: has_trailing_separator?
params: (path)
visibility: private
PK�|[1f'��$ri/1.8/system/Pathname/chroot-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pathname#chroot is <b>obsoleted</b> at 1.8.1.
full_name: Pathname#chroot
is_singleton: false
name: chroot
params: ()
visibility: public
PK�|[~����#ri/1.8/system/Pathname/atime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.atime</tt>. Returns last access time.
full_name: Pathname#atime
is_singleton: false
name: atime
params: ()
visibility: public
PK�|[|�S%''!ri/1.8/system/Pathname/sub-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (*args)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a pathname which is substituted by String#sub.
full_name: Pathname#sub
is_singleton: false
name: sub
params: (pattern, *rest, &block) {|*args| ...}
visibility: public
PK�|[�C��$ri/1.8/system/Pathname/ascend-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: self
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over and yields a new Pathname object for each element in the given path in ascending order.
- !ruby/struct:SM::Flow::VERB 
  body: " Pathname.new('/path/to/some/file.rb').ascend {|v| p v}\n    #&lt;Pathname:/path/to/some/file.rb&gt;\n    #&lt;Pathname:/path/to/some&gt;\n    #&lt;Pathname:/path/to&gt;\n    #&lt;Pathname:/path&gt;\n    #&lt;Pathname:/&gt;\n\n Pathname.new('path/to/some/file.rb').ascend {|v| p v}\n    #&lt;Pathname:path/to/some/file.rb&gt;\n    #&lt;Pathname:path/to/some&gt;\n    #&lt;Pathname:path/to&gt;\n    #&lt;Pathname:path&gt;\n"
- !ruby/struct:SM::Flow::P 
  body: It doesn't access actual filesystem.
- !ruby/struct:SM::Flow::P 
  body: This method is available since 1.8.5.
full_name: Pathname#ascend
is_singleton: false
name: ascend
params: () {|self| ...}
visibility: public
PK�|[���^��#ri/1.8/system/Pathname/chdir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pathname#chdir is <b>obsoleted</b> at 1.8.1.
full_name: Pathname#chdir
is_singleton: false
name: chdir
params: (&block)
visibility: public
PK�|[#*����)ri/1.8/system/Pathname/blockdev%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.blockdev?</tt>.
full_name: Pathname#blockdev?
is_singleton: false
name: blockdev?
params: ()
visibility: public
PK�|[|e�%ri/1.8/system/Pathname/extname-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.extname</tt>. Returns the file's extension.
full_name: Pathname#extname
is_singleton: false
name: extname
params: ()
visibility: public
PK�|[X��(ri/1.8/system/Pathname/fnmatch%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "See <tt>File.fnmatch?</tt> (same as #fnmatch)."
full_name: Pathname#fnmatch?
is_singleton: false
name: fnmatch?
params: (pattern, *args)
visibility: public
PK�|[za_��%ri/1.8/system/Pathname/pipe%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.pipe?</tt>.
full_name: Pathname#pipe?
is_singleton: false
name: pipe?
params: ()
visibility: public
PK�|[�$T��"ri/1.8/system/Pathname/plus-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Pathname#plus
is_singleton: false
name: plus
params: (path1, path2)
visibility: private
PK�|[��\44#ri/1.8/system/Pathname/ftype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.ftype</tt>. Returns &quot;type&quot; of file (&quot;file&quot;, &quot;directory&quot;, etc).
full_name: Pathname#ftype
is_singleton: false
name: ftype
params: ()
visibility: public
PK�|[��.ri/1.8/system/Pathname/writable_real%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.writable_real?</tt>.
full_name: Pathname#writable_real?
is_singleton: false
name: writable_real?
params: ()
visibility: public
PK�|[╌$'ri/1.8/system/Pathname/readlines-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>IO.readlines</tt>. Returns all the lines from the file.
full_name: Pathname#readlines
is_singleton: false
name: readlines
params: (*args)
visibility: public
PK�|[�-��%ri/1.8/system/Pathname/opendir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: dir
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>Dir.open</tt>.
full_name: Pathname#opendir
is_singleton: false
name: opendir
params: () {|dir| ...}
visibility: public
PK�|[i����%ri/1.8/system/Pathname/untaint-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Pathname#untaint
is_singleton: false
name: untaint
params: ()
visibility: public
PK�|[�~1���%ri/1.8/system/Pathname/root%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "#root? is a predicate for root directories. I.e. it returns <tt>true</tt> if the pathname consists of consecutive slashes."
- !ruby/struct:SM::Flow::P 
  body: It doesn't access actual filesystem. So it may return <tt>false</tt> for some pathnames which points to roots such as <tt>/usr/..</tt>.
full_name: Pathname#root?
is_singleton: false
name: root?
params: ()
visibility: public
PK�|[4���0ri/1.8/system/Pathname/relative_path_from-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "#relative_path_from returns a relative path from the argument to the receiver. If <tt>self</tt> is absolute, the argument must be absolute too. If <tt>self</tt> is relative, the argument must be relative too."
- !ruby/struct:SM::Flow::P 
  body: "#relative_path_from doesn't access the filesystem. It assumes no symlinks."
- !ruby/struct:SM::Flow::P 
  body: ArgumentError is raised when it cannot find a relative path.
- !ruby/struct:SM::Flow::P 
  body: This method has existed since 1.8.1.
full_name: Pathname#relative_path_from
is_singleton: false
name: relative_path_from
params: (base_directory)
visibility: public
PK�|[�E!���&ri/1.8/system/Pathname/realpath-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a real (absolute) pathname of <tt>self</tt> in the actual filesystem. The real pathname doesn't contain symlinks or useless dots.
- !ruby/struct:SM::Flow::P 
  body: No arguments should be given; the old behaviour is <b>obsoleted</b>.
full_name: Pathname#realpath
is_singleton: false
name: realpath
params: ()
visibility: public
PK�|[9=RR%ri/1.8/system/Pathname/symlink-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pathname#symlink is confusing and <b>obsoleted</b> because the receiver/argument order is inverted to corresponding system call.
full_name: Pathname#symlink
is_singleton: false
name: symlink
params: (old)
visibility: public
PK�|[�>_��%ri/1.8/system/Pathname/sysopen-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>IO.sysopen</tt>.
full_name: Pathname#sysopen
is_singleton: false
name: sysopen
params: (*args)
visibility: public
PK�|[�U���%ri/1.8/system/Pathname/file%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.file?</tt>.
full_name: Pathname#file?
is_singleton: false
name: file?
params: ()
visibility: public
PK�|[�{Y=��+ri/1.8/system/Pathname/executable%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.executable?</tt>.
full_name: Pathname#executable?
is_singleton: false
name: executable?
params: ()
visibility: public
PK�|[U��#ri/1.8/system/Pathname/chown-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>File.chown</tt>. Change owner and group of file.
full_name: Pathname#chown
is_singleton: false
name: chown
params: (owner, group)
visibility: public
PK�|[<�����)ri/1.8/system/Pathname/relative%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "The opposite of #absolute?"
full_name: Pathname#relative?
is_singleton: false
name: relative?
params: ()
visibility: public
PK�|['o�<��&ri/1.8/system/Pathname/owned%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.owned?</tt>.
full_name: Pathname#owned?
is_singleton: false
name: owned?
params: ()
visibility: public
PK�|[IH8��%ri/1.8/system/Pathname/size%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>FileTest.size?</tt>.
full_name: Pathname#size?
is_singleton: false
name: size?
params: ()
visibility: public
PK�|[O,Y9>>$ri/1.8/system/Pathname/parent-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "#parent returns the parent directory."
- !ruby/struct:SM::Flow::P 
  body: This is same as <tt>self + '..'</tt>.
full_name: Pathname#parent
is_singleton: false
name: parent
params: ()
visibility: public
PK�|[V|�H��$ri/1.8/system/Mutex/cdesc-Mutex.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Mutex implements a simple semaphore that can be used to coordinate access to shared data from multiple concurrent threads.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'thread'\n  semaphore = Mutex.new\n\n  a = Thread.new {\n    semaphore.synchronize {\n      # access shared resource\n    }\n  }\n\n  b = Thread.new {\n    semaphore.synchronize {\n      # access shared resource\n    }\n  }\n"
constants: []

full_name: Mutex
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: exclusive_unlock
- !ruby/object:RI::MethodSummary 
  name: lock
- !ruby/object:RI::MethodSummary 
  name: locked?
- !ruby/object:RI::MethodSummary 
  name: synchronize
- !ruby/object:RI::MethodSummary 
  name: try_lock
- !ruby/object:RI::MethodSummary 
  name: unlock
name: Mutex
superclass: Object
PK�|[ֵn�11#ri/1.8/system/Mutex/try_lock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Attempts to obtain the lock and returns immediately. Returns <tt>true</tt> if the lock was granted.
full_name: Mutex#try_lock
is_singleton: false
name: try_lock
params: ()
visibility: public
PK�|[j]٤OO+ri/1.8/system/Mutex/exclusive_unlock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: If the mutex is locked, unlocks the mutex, wakes one waiting thread, and yields in a critical section.
full_name: Mutex#exclusive_unlock
is_singleton: false
name: exclusive_unlock
params: () {|| ...}
visibility: public
PK�|[�)�KK&ri/1.8/system/Mutex/synchronize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: Obtains a lock, runs the block, and releases the lock when the block completes. See the example under Mutex.
full_name: Mutex#synchronize
is_singleton: false
name: synchronize
params: () {|| ...}
visibility: public
PK�|[���7!ri/1.8/system/Mutex/unlock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Releases the lock. Returns <tt>nil</tt> if ref wasn't locked.
full_name: Mutex#unlock
is_singleton: false
name: unlock
params: ()
visibility: public
PK�|[�EW�$ri/1.8/system/Mutex/locked%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if this lock is currently held by some thread.
full_name: Mutex#locked?
is_singleton: false
name: locked?
params: ()
visibility: public
PK�|[�k���ri/1.8/system/Mutex/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new Mutex
full_name: Mutex::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[��8�ri/1.8/system/Mutex/lock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Attempts to grab the lock and waits if it isn't available.
full_name: Mutex#lock
is_singleton: false
name: lock
params: ()
visibility: public
PK�|[�$Md��(ri/1.8/system/RiError/cdesc-RiError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: []

constants: []

full_name: RiError
includes: []

instance_methods: []

name: RiError
superclass: Exception
PK�|[}K�0��@ri/1.8/system/StrictPrettyExample/cdesc-StrictPrettyExample.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: StrictPrettyExample
includes: []

instance_methods: []

name: StrictPrettyExample
superclass: Test::Unit::TestCase
PK�|[H1���/ri/1.8/system/Struct/yaml_tag_class_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Struct::yaml_tag_class_name
is_singleton: true
name: yaml_tag_class_name
params: ()
visibility: public
PK�|[[��� ri/1.8/system/Struct/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of instance variables.
- !ruby/struct:SM::Flow::VERB 
  body: "   Customer = Struct.new(:name, :address, :zip)\n   joe = Customer.new(&quot;Joe Smith&quot;, &quot;123 Maple, Anytown NC&quot;, 12345)\n   joe.length   #=&gt; 3\n"
full_name: Struct#size
is_singleton: false
name: size
params: |
  struct.length    => fixnum
  struct.size      => fixnum

visibility: public
PK�|[�|G���"ri/1.8/system/Struct/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "code-seq:"
- !ruby/struct:SM::Flow::VERB 
  body: "  struct.eql?(other)   =&gt; true or false\n"
- !ruby/struct:SM::Flow::P 
  body: Two structures are equal if they are the same object, or if all their fields are equal (using <tt>eql?</tt>).
full_name: Struct#eql?
is_singleton: false
name: eql?
params: (p1)
visibility: public
PK�|[;��VRR"ri/1.8/system/Struct/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Attribute Reference---Returns the value of the instance variable named by <em>symbol</em>, or indexed (0..length-1) by <em>fixnum</em>. Will raise <tt>NameError</tt> if the named variable does not exist, or <tt>IndexError</tt> if the index is out of range.
- !ruby/struct:SM::Flow::VERB 
  body: "   Customer = Struct.new(:name, :address, :zip)\n   joe = Customer.new(&quot;Joe Smith&quot;, &quot;123 Maple, Anytown NC&quot;, 12345)\n\n   joe[&quot;name&quot;]   #=&gt; &quot;Joe Smith&quot;\n   joe[:name]    #=&gt; &quot;Joe Smith&quot;\n   joe[0]        #=&gt; &quot;Joe Smith&quot;\n"
full_name: Struct#[]
is_singleton: false
name: "[]"
params: |
  struct[symbol]    => anObject
  struct[fixnum]    => anObject 

visibility: public
PK�|[f9���� ri/1.8/system/Struct/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls <em>block</em> once for each instance variable, passing the value as a parameter.
- !ruby/struct:SM::Flow::VERB 
  body: "   Customer = Struct.new(:name, :address, :zip)\n   joe = Customer.new(&quot;Joe Smith&quot;, &quot;123 Maple, Anytown NC&quot;, 12345)\n   joe.each {|x| puts(x) }\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Joe Smith\n   123 Maple, Anytown NC\n   12345\n"
full_name: Struct#each
is_singleton: false
name: each
params: |
  struct.each {|obj| block }  => struct

visibility: public
PK�|[V�ixuu"ri/1.8/system/Struct/select-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invokes the block passing in successive elements from <em>struct</em>, returning an array containing those elements for which the block returns a true value (equivalent to <tt>Enumerable#select</tt>).
- !ruby/struct:SM::Flow::VERB 
  body: "   Lots = Struct.new(:a, :b, :c, :d, :e, :f)\n   l = Lots.new(11, 22, 33, 44, 55, 66)\n   l.select {|v| (v % 2).zero? }   #=&gt; [22, 44, 66]\n"
full_name: Struct#select
is_singleton: false
name: select
params: |
  struct.select {|i| block }    => array

visibility: public
PK�|[�� ri/1.8/system/Struct/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the values for this instance as an array.
- !ruby/struct:SM::Flow::VERB 
  body: "   Customer = Struct.new(:name, :address, :zip)\n   joe = Customer.new(&quot;Joe Smith&quot;, &quot;123 Maple, Anytown NC&quot;, 12345)\n   joe.to_a[1]   #=&gt; &quot;123 Maple, Anytown NC&quot;\n"
full_name: Struct#to_a
is_singleton: false
name: to_a
params: |
  struct.to_a     => array
  struct.values   => array

visibility: public
PK�|[B�f��/ri/1.8/system/Struct/yaml_tag_read_class-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Struct::yaml_tag_read_class
is_singleton: true
name: yaml_tag_read_class
params: ( name )
visibility: public
PK�|[_ ��#ri/1.8/system/Struct/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Struct#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PK�|[�T� ri/1.8/system/Struct/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a hash value based on this struct's contents.
full_name: Struct#hash
is_singleton: false
name: hash
params: |
  struct.hash   => fixnum

visibility: public
PK�|[4���yy%ri/1.8/system/Struct/values_at-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array containing the elements in <em>self</em> corresponding to the given selector(s). The selectors may be either integer indices or ranges. See also &lt;/code&gt;.select&lt;code&gt;.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = %w{ a b c d e f }\n   a.values_at(1, 3, 5)\n   a.values_at(1, 3, 5, 7)\n   a.values_at(-1, -3, -5, -7)\n   a.values_at(1..3, 2...5)\n"
full_name: Struct#values_at
is_singleton: false
name: values_at
params: |
  struct.values_at(selector,... )  => an_array

visibility: public
PK�|[�I떻�$ri/1.8/system/Struct/yaml_new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Struct::yaml_new
is_singleton: true
name: yaml_new
params: ( klass, tag, val )
visibility: public
PK�|[Q��;88#ri/1.8/system/Struct/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Describe the contents of this struct in a string.
full_name: Struct#inspect
is_singleton: false
name: inspect
params: |
  struct.to_s      => string
  struct.inspect   => string

visibility: public
PK�|[+��`��ri/1.8/system/Struct/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: Struct::new
is_singleton: true
name: new
params: (...)
visibility: public
PK�|[Gy�R��(ri/1.8/system/Struct/pretty_print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Struct#pretty_print
is_singleton: false
name: pretty_print
params: (q)
visibility: public
PK�|[L��<<#ri/1.8/system/Struct/members-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array of strings representing the names of the instance variables.
- !ruby/struct:SM::Flow::VERB 
  body: "   Customer = Struct.new(:name, :address, :zip)\n   joe = Customer.new(&quot;Joe Smith&quot;, &quot;123 Maple, Anytown NC&quot;, 12345)\n   joe.members   #=&gt; [&quot;name&quot;, &quot;address&quot;, &quot;zip&quot;]\n"
full_name: Struct#members
is_singleton: false
name: members
params: |
  struct.members    => array

visibility: public
PK�|[�^���"ri/1.8/system/Struct/length-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of instance variables.
- !ruby/struct:SM::Flow::VERB 
  body: "   Customer = Struct.new(:name, :address, :zip)\n   joe = Customer.new(&quot;Joe Smith&quot;, &quot;123 Maple, Anytown NC&quot;, 12345)\n   joe.length   #=&gt; 3\n"
full_name: Struct#length
is_singleton: false
name: length
params: |
  struct.length    => fixnum
  struct.size      => fixnum

visibility: public
PK�|[Y��ff&ri/1.8/system/Struct/cdesc-Struct.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: yaml_new
- !ruby/object:RI::MethodSummary 
  name: yaml_tag_class_name
- !ruby/object:RI::MethodSummary 
  name: yaml_tag_read_class
comment: 
- !ruby/struct:SM::Flow::P 
  body: A <tt>Struct</tt> is a convenient way to bundle a number of attributes together, using accessor methods, without having to write an explicit class.
- !ruby/struct:SM::Flow::P 
  body: The <tt>Struct</tt> class is a generator of specific classes, each one of which is defined to hold a set of variables and their accessors. In these examples, we'll call the generated class ``<em>Customer</em>Class,'' and we'll show an example instance of that class as ``<em>Customer</em>Inst.''
- !ruby/struct:SM::Flow::P 
  body: In the descriptions that follow, the parameter <em>symbol</em> refers to a symbol, which is either a quoted string or a <tt>Symbol</tt> (such as <tt>:name</tt>).
constants: []

full_name: Struct
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: each_pair
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: length
- !ruby/object:RI::MethodSummary 
  name: members
- !ruby/object:RI::MethodSummary 
  name: pretty_print
- !ruby/object:RI::MethodSummary 
  name: pretty_print_cycle
- !ruby/object:RI::MethodSummary 
  name: select
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: to_a
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: to_yaml
- !ruby/object:RI::MethodSummary 
  name: values
- !ruby/object:RI::MethodSummary 
  name: values_at
name: Struct
superclass: Object
PK�|[%&�p22 ri/1.8/system/Struct/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Describe the contents of this struct in a string.
full_name: Struct#to_s
is_singleton: false
name: to_s
params: |
  struct.to_s      => string
  struct.inspect   => string

visibility: public
PK�|[w�a��"ri/1.8/system/Struct/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Equality---Returns <tt>true</tt> if <em>other_struct</em> is equal to this one: they must be of the same class as generated by <tt>Struct::new</tt>, and the values of all instance variables must be equal (according to <tt>Object#==</tt>)."
- !ruby/struct:SM::Flow::VERB 
  body: "   Customer = Struct.new(:name, :address, :zip)\n   joe   = Customer.new(&quot;Joe Smith&quot;, &quot;123 Maple, Anytown NC&quot;, 12345)\n   joejr = Customer.new(&quot;Joe Smith&quot;, &quot;123 Maple, Anytown NC&quot;, 12345)\n   jane  = Customer.new(&quot;Jane Doe&quot;, &quot;456 Elm, Anytown NC&quot;, 12345)\n   joe == joejr   #=&gt; true\n   joe == jane    #=&gt; false\n"
full_name: Struct#==
is_singleton: false
name: ==
params: |
  struct == other_struct     => true or false

visibility: public
PK�|[0^R2  "ri/1.8/system/Struct/values-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the values for this instance as an array.
- !ruby/struct:SM::Flow::VERB 
  body: "   Customer = Struct.new(:name, :address, :zip)\n   joe = Customer.new(&quot;Joe Smith&quot;, &quot;123 Maple, Anytown NC&quot;, 12345)\n   joe.to_a[1]   #=&gt; &quot;123 Maple, Anytown NC&quot;\n"
full_name: Struct#values
is_singleton: false
name: values
params: |
  struct.to_a     => array
  struct.values   => array

visibility: public
PK�|[�{O��.ri/1.8/system/Struct/pretty_print_cycle-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Struct#pretty_print_cycle
is_singleton: false
name: pretty_print_cycle
params: (q)
visibility: public
PK�|[ȫ�hh%ri/1.8/system/Struct/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Attribute Assignment---Assigns to the instance variable named by <em>symbol</em> or <em>fixnum</em> the value <em>obj</em> and returns it. Will raise a <tt>NameError</tt> if the named variable does not exist, or an <tt>IndexError</tt> if the index is out of range.
- !ruby/struct:SM::Flow::VERB 
  body: "   Customer = Struct.new(:name, :address, :zip)\n   joe = Customer.new(&quot;Joe Smith&quot;, &quot;123 Maple, Anytown NC&quot;, 12345)\n\n   joe[&quot;name&quot;] = &quot;Luke&quot;\n   joe[:zip]   = &quot;90210&quot;\n\n   joe.name   #=&gt; &quot;Luke&quot;\n   joe.zip    #=&gt; &quot;90210&quot;\n"
full_name: Struct#[]=
is_singleton: false
name: "[]="
params: |
  struct[symbol] = obj    => obj
  struct[fixnum] = obj    => obj

visibility: public
PK�|[�\�y,,%ri/1.8/system/Struct/each_pair-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls <em>block</em> once for each instance variable, passing the name (as a symbol) and the value as parameters.
- !ruby/struct:SM::Flow::VERB 
  body: "   Customer = Struct.new(:name, :address, :zip)\n   joe = Customer.new(&quot;Joe Smith&quot;, &quot;123 Maple, Anytown NC&quot;, 12345)\n   joe.each_pair {|name, value| puts(&quot;#{name} =&gt; #{value}&quot;) }\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   name =&gt; Joe Smith\n   address =&gt; 123 Maple, Anytown NC\n   zip =&gt; 12345\n"
full_name: Struct#each_pair
is_singleton: false
name: each_pair
params: |
  struct.each_pair {|sym, obj| block }     => struct

visibility: public
PK�|[��jy��5ri/1.8/system/RI/AnsiFormatter/display_heading-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::AnsiFormatter#display_heading
is_singleton: false
name: display_heading
params: (text, level, indent)
visibility: public
PK�|[�$a��7ri/1.8/system/RI/AnsiFormatter/cdesc-AnsiFormatter.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: This formatter uses ANSI escape sequences to colorize stuff works with pages such as man and less.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: HEADINGS
  value: "{       1 => [ \"\\033[1;32m\", \"\\033[m\" ] ,       2 => [\"\\033[4;32m\", \"\\033[m\" ],       3 => [\"\\033[32m\", \"\\033[m\" ]"
- !ruby/object:RI::Constant 
  comment: 
  name: ATTR_MAP
  value: "{       BOLD   => \"1\",       ITALIC => \"33\",       CODE   => \"36\""
full_name: RI::AnsiFormatter
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: bold_print
- !ruby/object:RI::MethodSummary 
  name: display_heading
- !ruby/object:RI::MethodSummary 
  name: update_attributes
- !ruby/object:RI::MethodSummary 
  name: write_attribute_text
name: AnsiFormatter
superclass: AttributeFormatter
PK�|[7���:ri/1.8/system/RI/AnsiFormatter/write_attribute_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::AnsiFormatter#write_attribute_text
is_singleton: false
name: write_attribute_text
params: (prefix, line)
visibility: public
PK�|[Րх��)ri/1.8/system/RI/AnsiFormatter/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::AnsiFormatter::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[a����7ri/1.8/system/RI/AnsiFormatter/update_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::AnsiFormatter#update_attributes
is_singleton: false
name: update_attributes
params: (attr)
visibility: private
PK�|[�⫼�0ri/1.8/system/RI/AnsiFormatter/bold_print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::AnsiFormatter#bold_print
is_singleton: false
name: bold_print
params: (txt)
visibility: public
PK�|[�#|��4ri/1.8/system/RI/TextFormatter/raw_print_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RI::TextFormatter#raw_print_line
is_singleton: false
name: raw_print_line
params: (txt)
visibility: public
PK�|[(ztt6ri/1.8/system/RI/TextFormatter/break_to_newline-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: called when we want to ensure a nbew 'wrap' starts on a newline Only needed for HtmlFormatter, because the rest do their own line breaking
full_name: RI::TextFormatter#break_to_newline
is_singleton: false
name: break_to_newline
params: ()
visibility: public
PK�|[�����6ri/1.8/system/RI/TextFormatter/strip_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::TextFormatter#strip_attributes
is_singleton: false
name: strip_attributes
params: (txt)
visibility: public
PK�|[n��̭�*ri/1.8/system/RI/TextFormatter/list-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::TextFormatter::list
is_singleton: true
name: list
params: ()
visibility: public
PK�|[��
��5ri/1.8/system/RI/TextFormatter/display_heading-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RI::TextFormatter#display_heading
is_singleton: false
name: display_heading
params: (text, level, indent)
visibility: public
PK�|[�����@ri/1.8/system/RI/TextFormatter/display_verbatim_flow_item-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RI::TextFormatter#display_verbatim_flow_item
is_singleton: false
name: display_verbatim_flow_item
params: (item, prefix=@indent)
visibility: public
PK�|[�Q�/ri/1.8/system/RI/TextFormatter/conv_html-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: convert HTML entities back to ASCII
full_name: RI::TextFormatter#conv_html
is_singleton: false
name: conv_html
params: (txt)
visibility: public
PK�|[��]���7ri/1.8/system/RI/TextFormatter/cdesc-TextFormatter.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: indent
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: for
- !ruby/object:RI::MethodSummary 
  name: list
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Finally, fill in the list of known formatters
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: FORMATTERS
  value: "{       \"ansi\"   => AnsiFormatter,       \"bs\"     => OverstrikeFormatter,       \"html\"   => HtmlFormatter,       \"plain\"  => TextFormatter,       \"simple\" => SimpleFormatter,     }"
full_name: RI::TextFormatter
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: blankline
- !ruby/object:RI::MethodSummary 
  name: bold_print
- !ruby/object:RI::MethodSummary 
  name: break_to_newline
- !ruby/object:RI::MethodSummary 
  name: conv_html
- !ruby/object:RI::MethodSummary 
  name: conv_markup
- !ruby/object:RI::MethodSummary 
  name: display_flow
- !ruby/object:RI::MethodSummary 
  name: display_flow_item
- !ruby/object:RI::MethodSummary 
  name: display_heading
- !ruby/object:RI::MethodSummary 
  name: display_list
- !ruby/object:RI::MethodSummary 
  name: display_verbatim_flow_item
- !ruby/object:RI::MethodSummary 
  name: draw_line
- !ruby/object:RI::MethodSummary 
  name: raw_print_line
- !ruby/object:RI::MethodSummary 
  name: strip_attributes
- !ruby/object:RI::MethodSummary 
  name: wrap
name: TextFormatter
superclass: Object
PK�|[��	���7ri/1.8/system/RI/TextFormatter/display_flow_item-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RI::TextFormatter#display_flow_item
is_singleton: false
name: display_flow_item
params: (item, prefix=@indent)
visibility: public
PK�|[��$ӯ�)ri/1.8/system/RI/TextFormatter/for-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::TextFormatter::for
is_singleton: true
name: for
params: (name)
visibility: public
PK�|[�c.d��)ri/1.8/system/RI/TextFormatter/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::TextFormatter::new
is_singleton: true
name: new
params: (options, indent)
visibility: public
PK�|[pg���/ri/1.8/system/RI/TextFormatter/draw_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RI::TextFormatter#draw_line
is_singleton: false
name: draw_line
params: (label=nil)
visibility: public
PK�|[$Ȅ���/ri/1.8/system/RI/TextFormatter/blankline-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RI::TextFormatter#blankline
is_singleton: false
name: blankline
params: ()
visibility: public
PK�|[i4ر��*ri/1.8/system/RI/TextFormatter/wrap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RI::TextFormatter#wrap
is_singleton: false
name: wrap
params: (txt, prefix=@indent, linelen=@width)
visibility: public
PK�|[�s� ��2ri/1.8/system/RI/TextFormatter/display_flow-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::TextFormatter#display_flow
is_singleton: false
name: display_flow
params: (flow)
visibility: public
PK�|[�$�V��0ri/1.8/system/RI/TextFormatter/bold_print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RI::TextFormatter#bold_print
is_singleton: false
name: bold_print
params: (txt)
visibility: public
PK�|[{f���2ri/1.8/system/RI/TextFormatter/display_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RI::TextFormatter#display_list
is_singleton: false
name: display_list
params: (list)
visibility: public
PK�|[DT��1ri/1.8/system/RI/TextFormatter/conv_markup-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: convert markup into display form
full_name: RI::TextFormatter#conv_markup
is_singleton: false
name: conv_markup
params: (txt)
visibility: public
PK�|[lX~���ri/1.8/system/RI/cdesc-RI.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: We handle the parsing of options, and subsequently as a singleton object to be queried for option values
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: VERSION_STRING
  value: "\"ri v1.0.1 - 20041108\""
full_name: RI
includes: []

instance_methods: []

name: RI
superclass: 
PK�|[~�m:��$ri/1.8/system/RI/Constant/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::Constant::new
is_singleton: true
name: new
params: (name, value, comment)
visibility: public
PK�|[��1oo-ri/1.8/system/RI/Constant/cdesc-Constant.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: comment
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: value
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RI::Constant
includes: []

instance_methods: []

name: Constant
superclass: NamedThing
PK�|[�����9ri/1.8/system/RI/IncludedModule/cdesc-IncludedModule.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RI::IncludedModule
includes: []

instance_methods: []

name: IncludedModule
superclass: NamedThing
PK�|[3����6ri/1.8/system/RI/HtmlFormatter/break_to_newline-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::HtmlFormatter#break_to_newline
is_singleton: false
name: break_to_newline
params: ()
visibility: public
PK�|[���0��5ri/1.8/system/RI/HtmlFormatter/display_heading-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::HtmlFormatter#display_heading
is_singleton: false
name: display_heading
params: (text, level, indent)
visibility: public
PK�|[�7�*��@ri/1.8/system/RI/HtmlFormatter/display_verbatim_flow_item-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::HtmlFormatter#display_verbatim_flow_item
is_singleton: false
name: display_verbatim_flow_item
params: (item, prefix=@indent)
visibility: public
PK�|[�|B���:ri/1.8/system/RI/HtmlFormatter/write_attribute_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::HtmlFormatter#write_attribute_text
is_singleton: false
name: write_attribute_text
params: (prefix, line)
visibility: public
PK�|[�TTM��)ri/1.8/system/RI/HtmlFormatter/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::HtmlFormatter::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[R#L[��/ri/1.8/system/RI/HtmlFormatter/draw_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::HtmlFormatter#draw_line
is_singleton: false
name: draw_line
params: (label=nil)
visibility: public
PK�|[+h�ʷ�/ri/1.8/system/RI/HtmlFormatter/blankline-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::HtmlFormatter#blankline
is_singleton: false
name: blankline
params: ()
visibility: public
PK�|[�$���,ri/1.8/system/RI/HtmlFormatter/escape-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::HtmlFormatter#escape
is_singleton: false
name: escape
params: (str)
visibility: private
PK�|[g8q��7ri/1.8/system/RI/HtmlFormatter/update_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::HtmlFormatter#update_attributes
is_singleton: false
name: update_attributes
params: (current, wanted)
visibility: private
PK�|[��r��0ri/1.8/system/RI/HtmlFormatter/bold_print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::HtmlFormatter#bold_print
is_singleton: false
name: bold_print
params: (txt)
visibility: public
PK�|[>���2ri/1.8/system/RI/HtmlFormatter/display_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RI::HtmlFormatter#display_list
is_singleton: false
name: display_list
params: (list)
visibility: public
PK�|[J��9��)ri/1.8/system/RI/HtmlFormatter/tag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
full_name: RI::HtmlFormatter#tag
is_singleton: false
name: tag
params: (code) {|| ...}
visibility: private
PK�|[���117ri/1.8/system/RI/HtmlFormatter/cdesc-HtmlFormatter.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: This formatter uses HTML.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ATTR_MAP
  value: "{       BOLD   => \"b>\",       ITALIC => \"i>\",       CODE   => \"tt>\""
full_name: RI::HtmlFormatter
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: blankline
- !ruby/object:RI::MethodSummary 
  name: bold_print
- !ruby/object:RI::MethodSummary 
  name: break_to_newline
- !ruby/object:RI::MethodSummary 
  name: display_heading
- !ruby/object:RI::MethodSummary 
  name: display_list
- !ruby/object:RI::MethodSummary 
  name: display_verbatim_flow_item
- !ruby/object:RI::MethodSummary 
  name: draw_line
- !ruby/object:RI::MethodSummary 
  name: escape
- !ruby/object:RI::MethodSummary 
  name: tag
- !ruby/object:RI::MethodSummary 
  name: update_attributes
- !ruby/object:RI::MethodSummary 
  name: write_attribute_text
name: HtmlFormatter
superclass: AttributeFormatter
PK�|[�=����#ri/1.8/system/RI/RiCache/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::RiCache::new
is_singleton: true
name: new
params: (dirs)
visibility: public
PK�|[�&oO��+ri/1.8/system/RI/RiCache/cdesc-RiCache.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: toplevel
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: We represent everything know about all 'ri' files accessible to this program
constants: []

full_name: RI::RiCache
includes: []

instance_methods: []

name: RiCache
superclass: Object
PK�|[��Z|;ri/1.8/system/RI/SimpleFormatter/cdesc-SimpleFormatter.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: This formatter reduces extra lines for a simpler output. It improves way output looks for tools like IRC bots.
constants: []

full_name: RI::SimpleFormatter
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: blankline
- !ruby/object:RI::MethodSummary 
  name: display_heading
- !ruby/object:RI::MethodSummary 
  name: draw_line
name: SimpleFormatter
superclass: TextFormatter
PK�|[kz$007ri/1.8/system/RI/SimpleFormatter/display_heading-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Place heading level indicators inline with heading.
full_name: RI::SimpleFormatter#display_heading
is_singleton: false
name: display_heading
params: (text, level, indent)
visibility: public
PK�|[�1g1ri/1.8/system/RI/SimpleFormatter/draw_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Display labels only, no lines
full_name: RI::SimpleFormatter#draw_line
is_singleton: false
name: draw_line
params: (label=nil)
visibility: public
PK�|[�;����1ri/1.8/system/RI/SimpleFormatter/blankline-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: No extra blank lines
full_name: RI::SimpleFormatter#blankline
is_singleton: false
name: blankline
params: ()
visibility: public
PK�|[,����(ri/1.8/system/RI/Options/raw_path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::Options#raw_path
is_singleton: false
name: raw_path
params: ()
visibility: public
PK�|[t)]��$ri/1.8/system/RI/Options/path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the selected documentation directories.
full_name: RI::Options#path
is_singleton: false
name: path
params: ()
visibility: public
PK�|[{Mx���,ri/1.8/system/RI/Options/show_version-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Show the version and exit
full_name: RI::Options#show_version
is_singleton: false
name: show_version
params: ()
visibility: public
PK�|[��tb��%ri/1.8/system/RI/Options/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parse command line options.
full_name: RI::Options#parse
is_singleton: false
name: parse
params: (args)
visibility: public
PK�|[�,���0ri/1.8/system/RI/Options/OptionList/usage-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Show usage and exit
full_name: RI::Options::OptionList::usage
is_singleton: true
name: usage
params: (short_form=false)
visibility: public
PK�|[��I���0ri/1.8/system/RI/Options/OptionList/error-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Show an error and exit
full_name: RI::Options::OptionList::error
is_singleton: true
name: error
params: (msg)
visibility: public
PK�|[M-����2ri/1.8/system/RI/Options/OptionList/options-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::Options::OptionList::options
is_singleton: true
name: options
params: ()
visibility: public
PK�|[e�Ѭoo9ri/1.8/system/RI/Options/OptionList/cdesc-OptionList.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: error
- !ruby/object:RI::MethodSummary 
  name: options
- !ruby/object:RI::MethodSummary 
  name: strip_output
- !ruby/object:RI::MethodSummary 
  name: usage
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: OPTION_LIST
  value: "[         [ \"--help\",          \"-h\",   nil,           \"you're looking at it\" ],          [ \"--classes\",      \"-c\",   nil,           \"Display the names of classes and modules we\\n\" +           \"know about\"],          [ \"--doc-dir\",      \"-d\",   \"<dirname>\",           \"A directory to search for documentation. If not\\n\" +           \"specified, we search the standard rdoc/ri directories.\\n\" +           \"May be repeated.\"],          [ \"--system\",       nil,    nil,           \"Include documentation from Ruby's standard library:\\n  \" +           RI::Paths::SYSDIR ],          [ \"--site\",         nil,    nil,           \"Include documentation from libraries installed in site_lib:\\n  \" +           RI::Paths::SITEDIR ],          [ \"--home\",         nil,    nil,           \"Include documentation stored in ~/.rdoc:\\n  \" +           (RI::Paths::HOMEDIR || \"No ~/.rdoc found\") ],          [ \"--gems\",         nil,    nil,           \"Include documentation from RubyGems:\\n\" +           (RI::Paths::GEMDIRS ?            Gem.path.map { |dir| \"  #{dir}/doc/*/ri\" }.join(\"\\n\") :            \"No Rubygems ri found.\") ],          [ \"--format\",       \"-f\",   \"<name>\",           \"Format to use when displaying output:\\n\" +           \"   \" + RI::TextFormatter.list + \"\\n\" +           \"Use 'bs' (backspace) with most pager programs.\\n\" +           \"To use ANSI, either also use the -T option, or\\n\" +           \"tell your pager to allow control characters\\n\" +           \"(for example using the -R option to less)\"],          [ \"--list-names\",    \"-l\",   nil,           \"List all the names known to RDoc, one per line\""
full_name: RI::Options::OptionList
includes: []

instance_methods: []

name: OptionList
superclass: 
PK�|[L2ٰ��7ri/1.8/system/RI/Options/OptionList/strip_output-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::Options::OptionList::strip_output
is_singleton: true
name: strip_output
params: (text)
visibility: public
PK�|[p����)ri/1.8/system/RI/Options/displayer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return an instance of the displayer (the thing that actually writes the information). This allows us to load in new displayer classes at runtime (for example to help with IDE integration)
full_name: RI::Options#displayer
is_singleton: false
name: displayer
params: ()
visibility: public
PK�|[\��D��#ri/1.8/system/RI/Options/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::Options::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[����+ri/1.8/system/RI/Options/cdesc-Options.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: the directory we search for original documentation
  name: doc_dir
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: the formatting we apply to the output
  name: formatter
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: should we just display a class list and exit
  name: list_classes
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: should we display a list of all names
  name: list_names
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: No not use a pager. Writable, because ri sets it if it can't find a pager
  name: use_stdout
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The width of the output line
  name: width
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RI::Options
includes: 
- !ruby/object:RI::IncludedModule 
  name: Singleton
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: displayer
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: path
- !ruby/object:RI::MethodSummary 
  name: raw_path
- !ruby/object:RI::MethodSummary 
  name: show_version
name: Options
superclass: Object
PK�|[v�C��)ri/1.8/system/RI/MethodSummary/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::MethodSummary::new
is_singleton: true
name: new
params: (name="")
visibility: public
PK�|[K(���7ri/1.8/system/RI/MethodSummary/cdesc-MethodSummary.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RI::MethodSummary
includes: []

instance_methods: []

name: MethodSummary
superclass: NamedThing
PK�|[�Pd��?ri/1.8/system/RI/MethodDescription/cdesc-MethodDescription.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: aliases
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: block_params
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: is_alias_for
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: is_class_method
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: is_singleton
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: params
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: visibility
  rw: RW
class_methods: []

comment: 
constants: []

full_name: RI::MethodDescription
includes: []

instance_methods: []

name: MethodDescription
superclass: Description
PK�|[2ʩ���,ri/1.8/system/RI/ClassEntry/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return our full name
full_name: RI::ClassEntry#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[��t��6ri/1.8/system/RI/ClassEntry/classes_and_modules-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::ClassEntry#classes_and_modules
is_singleton: false
name: classes_and_modules
params: ()
visibility: public
PK�|[�ǐ��9ri/1.8/system/RI/ClassEntry/local_methods_matching-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a list of all our methods matching a given string. Is <tt>is_class_methods</tt> if 'nil', we don't care if the method is a class method or not, otherwise we only return those methods that match
full_name: RI::ClassEntry#local_methods_matching
is_singleton: false
name: local_methods_matching
params: (name, is_class_method)
visibility: private
PK�|[�r	�8ri/1.8/system/RI/ClassEntry/contained_class_named-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return an exact match to a particular name
full_name: RI::ClassEntry#contained_class_named
is_singleton: false
name: contained_class_named
params: (name)
visibility: public
PK�|[�8'\3ri/1.8/system/RI/ClassEntry/all_method_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a list of all out method names
full_name: RI::ClassEntry#all_method_names
is_singleton: false
name: all_method_names
params: ()
visibility: public
PK�|[��s��3ri/1.8/system/RI/ClassEntry/methods_matching-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: return the list of local methods matching name We're split into two because we need distinct behavior when called from the <em>toplevel</em>
full_name: RI::ClassEntry#methods_matching
is_singleton: false
name: methods_matching
params: (name, is_class_method)
visibility: public
PK�|[����&ri/1.8/system/RI/ClassEntry/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::ClassEntry::new
is_singleton: true
name: new
params: (path_name, name, in_class)
visibility: public
PK�|[�A?�$$+ri/1.8/system/RI/ClassEntry/add_path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: We found this class in more tha one place, so add in the name from there.
full_name: RI::ClassEntry#add_path
is_singleton: false
name: add_path
params: (path)
visibility: public
PK�|[�BeeDri/1.8/system/RI/ClassEntry/recursively_find_methods_matching-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Find methods matching 'name' in ourselves and in any classes we contain
full_name: RI::ClassEntry#recursively_find_methods_matching
is_singleton: false
name: recursively_find_methods_matching
params: (name, is_class_method)
visibility: public
PK�|[�<�.��,ri/1.8/system/RI/ClassEntry/load_from-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: read in our methods and any classes and modules in our namespace. Methods are stored in files called name-c|i.yaml, where the 'name' portion is the external form of the method name and the c|i is a class|instance flag
full_name: RI::ClassEntry#load_from
is_singleton: false
name: load_from
params: (dir)
visibility: public
PK�|[��PP=ri/1.8/system/RI/ClassEntry/contained_modules_matching-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a list of any classes or modules that we contain that match a given string
full_name: RI::ClassEntry#contained_modules_matching
is_singleton: false
name: contained_modules_matching
params: (name)
visibility: public
PK�|[-.���1ri/1.8/system/RI/ClassEntry/cdesc-ClassEntry.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: path_names
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RI::ClassEntry
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_path
- !ruby/object:RI::MethodSummary 
  name: all_method_names
- !ruby/object:RI::MethodSummary 
  name: classes_and_modules
- !ruby/object:RI::MethodSummary 
  name: contained_class_named
- !ruby/object:RI::MethodSummary 
  name: contained_modules_matching
- !ruby/object:RI::MethodSummary 
  name: full_name
- !ruby/object:RI::MethodSummary 
  name: load_from
- !ruby/object:RI::MethodSummary 
  name: local_methods_matching
- !ruby/object:RI::MethodSummary 
  name: methods_matching
- !ruby/object:RI::MethodSummary 
  name: recursively_find_methods_matching
name: ClassEntry
superclass: Object
PK�|[�aG��=ri/1.8/system/RI/ClassDescription/cdesc-ClassDescription.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: superclass
  rw: RW
class_methods: []

comment: 
constants: []

full_name: RI::ClassDescription
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: display_name
- !ruby/object:RI::MethodSummary 
  name: superclass_string
name: ClassDescription
superclass: ModuleDescription
PK�|[y�k��5ri/1.8/system/RI/ClassDescription/display_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::ClassDescription#display_name
is_singleton: false
name: display_name
params: ()
visibility: public
PK�|[S�q���:ri/1.8/system/RI/ClassDescription/superclass_string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::ClassDescription#superclass_string
is_singleton: false
name: superclass_string
params: ()
visibility: public
PK�|[�=B��-ri/1.8/system/RI/RiReader/find_methods-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::RiReader#find_methods
is_singleton: false
name: find_methods
params: (name, is_class_method, namespaces)
visibility: public
PK�|[�����4ri/1.8/system/RI/RiReader/top_level_namespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::RiReader#top_level_namespace
is_singleton: false
name: top_level_namespace
params: ()
visibility: public
PK�|[�#�
��0ri/1.8/system/RI/RiReader/find_classes_in-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::RULE 
  width: 2
full_name: RI::RiReader#find_classes_in
is_singleton: false
name: find_classes_in
params: (res, klass)
visibility: private
PK�|[�A���4ri/1.8/system/RI/RiReader/lookup_namespace_in-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::RiReader#lookup_namespace_in
is_singleton: false
name: lookup_namespace_in
params: (target, namespaces)
visibility: public
PK�|[�|N�##-ri/1.8/system/RI/RiReader/cdesc-RiReader.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RI::RiReader
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: all_names
- !ruby/object:RI::MethodSummary 
  name: find_class_by_name
- !ruby/object:RI::MethodSummary 
  name: find_classes_in
- !ruby/object:RI::MethodSummary 
  name: find_methods
- !ruby/object:RI::MethodSummary 
  name: find_names_in
- !ruby/object:RI::MethodSummary 
  name: full_class_names
- !ruby/object:RI::MethodSummary 
  name: get_class
- !ruby/object:RI::MethodSummary 
  name: get_method
- !ruby/object:RI::MethodSummary 
  name: lookup_namespace_in
- !ruby/object:RI::MethodSummary 
  name: top_level_namespace
name: RiReader
superclass: Object
PK�|[٣@	1ri/1.8/system/RI/RiReader/full_class_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: return the names of all classes and modules
full_name: RI::RiReader#full_class_names
is_singleton: false
name: full_class_names
params: ()
visibility: public
PK�|[�9�î�$ri/1.8/system/RI/RiReader/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::RiReader::new
is_singleton: true
name: new
params: (ri_cache)
visibility: public
PK�|[צ�:		*ri/1.8/system/RI/RiReader/all_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: return a list of all classes, modules, and methods
full_name: RI::RiReader#all_names
is_singleton: false
name: all_names
params: ()
visibility: public
PK�|[�v33+ri/1.8/system/RI/RiReader/get_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: return the MethodDescription for a given MethodEntry by deserializing the YAML
full_name: RI::RiReader#get_method
is_singleton: false
name: get_method
params: (method_entry)
visibility: public
PK�|[
];���*ri/1.8/system/RI/RiReader/get_class-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a class description
full_name: RI::RiReader#get_class
is_singleton: false
name: get_class
params: (class_entry)
visibility: public
PK�|[,�����.ri/1.8/system/RI/RiReader/find_names_in-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::RiReader#find_names_in
is_singleton: false
name: find_names_in
params: (res, klass)
visibility: private
PK�|[��fZ��3ri/1.8/system/RI/RiReader/find_class_by_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::RiReader#find_class_by_name
is_singleton: false
name: find_class_by_name
params: (full_name)
visibility: public
PK�|[z`��nn/ri/1.8/system/RI/Attribute/cdesc-Attribute.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: comment
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: rw
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RI::Attribute
includes: []

instance_methods: []

name: Attribute
superclass: NamedThing
PK�|[%�5��%ri/1.8/system/RI/Attribute/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::Attribute::new
is_singleton: true
name: new
params: (name, rw, comment)
visibility: public
PK�|[�2�/ri/1.8/system/RI/AliasName/cdesc-AliasName.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Alias = Struct.new(:old_name, :new_name)
constants: []

full_name: RI::AliasName
includes: []

instance_methods: []

name: AliasName
superclass: NamedThing
PK�|[���00Ari/1.8/system/RI/AttributeFormatter/cdesc-AttributeFormatter.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: "Handle text with attributes. We're a base class: there are different presentation classes (one, for example, uses overstrikes to handle bold and underlining, while another using ANSI escape sequences"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: BOLD
  value: "1"
- !ruby/object:RI::Constant 
  comment: 
  name: ITALIC
  value: "2"
- !ruby/object:RI::Constant 
  comment: 
  name: CODE
  value: "4"
- !ruby/object:RI::Constant 
  comment: 
  name: ATTR_MAP
  value: "{       \"b\"    => BOLD,       \"code\" => CODE,       \"em\"   => ITALIC,       \"i\"    => ITALIC,       \"tt\"   => CODE"
full_name: RI::AttributeFormatter
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_attributes_to
- !ruby/object:RI::MethodSummary 
  name: bold_print
- !ruby/object:RI::MethodSummary 
  name: wrap
- !ruby/object:RI::MethodSummary 
  name: write_attribute_text
name: AttributeFormatter
superclass: TextFormatter
PK�|[����Cri/1.8/system/RI/AttributeFormatter/AttributeString/empty%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::AttributeFormatter::AttributeString#empty?
is_singleton: false
name: empty?
params: ()
visibility: public
PK�|[BI
��Nri/1.8/system/RI/AttributeFormatter/AttributeString/cdesc-AttributeString.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: txt
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RI::AttributeFormatter::AttributeString
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: empty?
- !ruby/object:RI::MethodSummary 
  name: next_word
name: AttributeString
superclass: Object
PK�|[$5�ADri/1.8/system/RI/AttributeFormatter/AttributeString/next_word-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: accept non space, then all following spaces
full_name: RI::AttributeFormatter::AttributeString#next_word
is_singleton: false
name: next_word
params: ()
visibility: public
PK�|[t]�Z��>ri/1.8/system/RI/AttributeFormatter/AttributeString/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::AttributeFormatter::AttributeString::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[��g��Ari/1.8/system/RI/AttributeFormatter/AttributeString/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::AttributeFormatter::AttributeString#<<
is_singleton: false
name: "<<"
params: (char)
visibility: public
PK�|[�d�V''?ri/1.8/system/RI/AttributeFormatter/write_attribute_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: overridden in specific formatters
full_name: RI::AttributeFormatter#write_attribute_text
is_singleton: false
name: write_attribute_text
params: (prefix, line)
visibility: protected
PK�|[/���/ri/1.8/system/RI/AttributeFormatter/wrap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: overrides base class. Looks for <tt>...</tt> etc sequences and generates an array of AttrChars. This array is then used as the basis for the split
full_name: RI::AttributeFormatter#wrap
is_singleton: false
name: wrap
params: (txt, prefix=@indent, linelen=@width)
visibility: public
PK�|[��;��<ri/1.8/system/RI/AttributeFormatter/add_attributes_to-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::AttributeFormatter#add_attributes_to
is_singleton: false
name: add_attributes_to
params: (txt)
visibility: private
PK�|[2�hN��5ri/1.8/system/RI/AttributeFormatter/bold_print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: again, overridden
full_name: RI::AttributeFormatter#bold_print
is_singleton: false
name: bold_print
params: (txt)
visibility: protected
PK�|[��6���7ri/1.8/system/RI/AttributeFormatter/AttrChar/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::AttributeFormatter::AttrChar::new
is_singleton: true
name: new
params: (char, attr)
visibility: public
PK�|[r�t��@ri/1.8/system/RI/AttributeFormatter/AttrChar/cdesc-AttrChar.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: attr
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: char
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "TODO: struct?"
constants: []

full_name: RI::AttributeFormatter::AttrChar
includes: []

instance_methods: []

name: AttrChar
superclass: Object
PK�|[@�c@��)ri/1.8/system/RI/NamedThing/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::NamedThing#eql?
is_singleton: false
name: eql?
params: (other)
visibility: public
PK�|[�5c��,ri/1.8/system/RI/NamedThing/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::NamedThing#<=>
is_singleton: false
name: <=>
params: (other)
visibility: public
PK�|[U�֣��'ri/1.8/system/RI/NamedThing/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::NamedThing#hash
is_singleton: false
name: hash
params: ()
visibility: public
PK�|[jkA���&ri/1.8/system/RI/NamedThing/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::NamedThing::new
is_singleton: true
name: new
params: (name)
visibility: public
PK�|[6���1ri/1.8/system/RI/NamedThing/cdesc-NamedThing.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RI::NamedThing
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: hash
name: NamedThing
superclass: Object
PK�|[��L��*ri/1.8/system/RI/RiWriter/add_class-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::RiWriter#add_class
is_singleton: false
name: add_class
params: (class_desc)
visibility: public
PK�|[�D�V

5ri/1.8/system/RI/RiWriter/external_to_internal-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: And the reverse operation
full_name: RI::RiWriter::external_to_internal
is_singleton: true
name: external_to_internal
params: (name)
visibility: public
PK�|[��5��,ri/1.8/system/RI/RiWriter/path_to_dir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::RiWriter#path_to_dir
is_singleton: false
name: path_to_dir
params: (class_name)
visibility: private
PK�|[s��ff5ri/1.8/system/RI/RiWriter/internal_to_external-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a name from internal form (containing punctuation) to an external form (where punctuation is replaced by %xx)
full_name: RI::RiWriter::internal_to_external
is_singleton: true
name: internal_to_external
params: (name)
visibility: public
PK�|[��bT��0ri/1.8/system/RI/RiWriter/class_desc_path-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::RiWriter::class_desc_path
is_singleton: true
name: class_desc_path
params: (dir, class_desc)
visibility: public
PK�|[�i��$ri/1.8/system/RI/RiWriter/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::RiWriter::new
is_singleton: true
name: new
params: (base_dir)
visibility: public
PK�|[Q��ww-ri/1.8/system/RI/RiWriter/cdesc-RiWriter.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: class_desc_path
- !ruby/object:RI::MethodSummary 
  name: external_to_internal
- !ruby/object:RI::MethodSummary 
  name: internal_to_external
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RI::RiWriter
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_class
- !ruby/object:RI::MethodSummary 
  name: add_method
- !ruby/object:RI::MethodSummary 
  name: path_to_dir
- !ruby/object:RI::MethodSummary 
  name: remove_class
name: RiWriter
superclass: Object
PK�|[U����-ri/1.8/system/RI/RiWriter/remove_class-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::RiWriter#remove_class
is_singleton: false
name: remove_class
params: (class_desc)
visibility: public
PK�|[�Q9���+ri/1.8/system/RI/RiWriter/add_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::RiWriter#add_method
is_singleton: false
name: add_method
params: (class_desc, method_desc)
visibility: public
PK�|[�ՠt'ri/1.8/system/RI/Paths/cdesc-Paths.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Encapsulate all the strangeness to do with finding out where to find RDoc files
- !ruby/struct:SM::Flow::P 
  body: "We basically deal with three directories:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "1."
    body: The 'system' documentation directory, which holds the documentation distributed with Ruby, and which is managed by the Ruby install process
  - !ruby/struct:SM::Flow::LI 
    label: "2."
    body: The 'site' directory, which contains site-wide documentation added locally.
  - !ruby/struct:SM::Flow::LI 
    label: "3."
    body: The 'user' documentation directory, stored under the user's own home directory.
  type: :NUMBER
- !ruby/struct:SM::Flow::P 
  body: "There's contention about all this, but for now:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "system:"
    body: $datadir/ri/&lt;ver&gt;/system/...
  - !ruby/struct:SM::Flow::LI 
    label: "site:"
    body: $datadir/ri/&lt;ver&gt;/site/...
  - !ruby/struct:SM::Flow::LI 
    label: "user:"
    body: ~/.rdoc
  type: :NOTE
constants: []

full_name: RI::Paths
includes: []

instance_methods: []

name: Paths
superclass: 
PK�|[Q�~®�-ri/1.8/system/RI/Description/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::Description#<=>
is_singleton: false
name: <=>
params: (other)
visibility: public
PK�|[ѵK+��-ri/1.8/system/RI/Description/serialize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::Description#serialize
is_singleton: false
name: serialize
params: ()
visibility: public
PK�|[UՂ3ri/1.8/system/RI/Description/cdesc-Description.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: comment
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: full_name
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: deserialize
comment: 
constants: []

full_name: RI::Description
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: serialize
name: Description
superclass: Object
PK�|[�� ��/ri/1.8/system/RI/Description/deserialize-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::Description::deserialize
is_singleton: true
name: deserialize
params: (from)
visibility: public
PK�|[�����/ri/1.8/system/RI/ModuleDescription/merge-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::ModuleDescription#merge
is_singleton: false
name: merge
params: (into, from)
visibility: private
PK�|[g�`m��6ri/1.8/system/RI/ModuleDescription/display_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::ModuleDescription#display_name
is_singleton: false
name: display_name
params: ()
visibility: public
PK�|[|�b2ri/1.8/system/RI/ModuleDescription/merge_in-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: merge in another class desscription into this one
full_name: RI::ModuleDescription#merge_in
is_singleton: false
name: merge_in
params: (old)
visibility: public
PK�|[�(?ri/1.8/system/RI/ModuleDescription/cdesc-ModuleDescription.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: attributes
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: class_methods
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: constants
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: includes
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: instance_methods
  rw: RW
class_methods: []

comment: 
constants: []

full_name: RI::ModuleDescription
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: display_name
- !ruby/object:RI::MethodSummary 
  name: merge
- !ruby/object:RI::MethodSummary 
  name: merge_in
- !ruby/object:RI::MethodSummary 
  name: superclass_string
name: ModuleDescription
superclass: Description
PK�|[c��a@@;ri/1.8/system/RI/ModuleDescription/superclass_string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: the 'ClassDescription' subclass overrides this to format up the name of a parent
full_name: RI::ModuleDescription#superclass_string
is_singleton: false
name: superclass_string
params: ()
visibility: public
PK�|[ ��Q""Cri/1.8/system/RI/OverstrikeFormatter/cdesc-OverstrikeFormatter.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: This formatter generates overstrike-style formatting, which works with pagers such as man and less.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: BS
  value: "\"\\C-h\""
full_name: RI::OverstrikeFormatter
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: bold_print
- !ruby/object:RI::MethodSummary 
  name: write_attribute_text
name: OverstrikeFormatter
superclass: AttributeFormatter
PK�|[���(��@ri/1.8/system/RI/OverstrikeFormatter/write_attribute_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::OverstrikeFormatter#write_attribute_text
is_singleton: false
name: write_attribute_text
params: (prefix, line)
visibility: public
PK�|[-j���6ri/1.8/system/RI/OverstrikeFormatter/bold_print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: draw a string in bold
full_name: RI::OverstrikeFormatter#bold_print
is_singleton: false
name: bold_print
params: (text)
visibility: public
PK�|[�9��-ri/1.8/system/RI/MethodEntry/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::MethodEntry#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[.K���3ri/1.8/system/RI/MethodEntry/cdesc-MethodEntry.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: path_name
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RI::MethodEntry
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: full_name
name: MethodEntry
superclass: Object
PK�|[5ذ��'ri/1.8/system/RI/MethodEntry/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::MethodEntry::new
is_singleton: true
name: new
params: (path_name, name, is_class_method, in_class)
visibility: public
PK�|[�Mpi��/ri/1.8/system/RI/TopLevelEntry/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::TopLevelEntry#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[=��%��6ri/1.8/system/RI/TopLevelEntry/methods_matching-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::TopLevelEntry#methods_matching
is_singleton: false
name: methods_matching
params: (name, is_class_method)
visibility: public
PK�|[��7ri/1.8/system/RI/TopLevelEntry/cdesc-TopLevelEntry.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: A TopLevelEntry is like a class entry, but when asked to search for methods searches all classes, not just itself
constants: []

full_name: RI::TopLevelEntry
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: full_name
- !ruby/object:RI::MethodSummary 
  name: methods_matching
- !ruby/object:RI::MethodSummary 
  name: module_named
name: TopLevelEntry
superclass: ClassEntry
PK�|[x2$���2ri/1.8/system/RI/TopLevelEntry/module_named-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RI::TopLevelEntry#module_named
is_singleton: false
name: module_named
params: (name)
visibility: public
PK�|[/B���@ri/1.8/system/NotImplementedError/cdesc-NotImplementedError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: NotImplementedError
includes: []

instance_methods: []

name: NotImplementedError
superclass: ScriptError
PK�|[�VUrr0ri/1.8/system/SocketError/cdesc-SocketError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Class <tt>Socket</tt> provides access to the underlying operating system socket implementations. It can be used to provide more operating system specific functionality than the protocol-specific socket classes but at the expense of greater complexity. In particular, the class handles addresses using +struct sockaddr+ structures packed into Ruby strings, which can be a joy to manipulate.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Exception Handling
- !ruby/struct:SM::Flow::P 
  body: Ruby's implementation of <tt>Socket</tt> causes an exception to be raised based on the error generated by the system dependent implementation. This is why the methods are documented in a way that isolate Unix-based system exceptions from Windows based exceptions. If more information on particular exception is needed please refer to the Unix manual pages or the Windows WinSock reference.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Documentation by
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Zach Dennis
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Sam Roberts
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <em>Programming Ruby</em> from The Pragmatic Bookshelf.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: Much material in this documentation is taken with permission from <em>Programming Ruby</em> from The Pragmatic Bookshelf.
constants: []

full_name: SocketError
includes: []

instance_methods: []

name: SocketError
superclass: StandardError
PK�|[�����(ri/1.8/system/IOError/cdesc-IOError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Class <tt>IO</tt> is the basis for all input and output in Ruby. An I/O stream may be <em>duplexed</em> (that is, bidirectional), and so may use more than one native operating system stream.
- !ruby/struct:SM::Flow::P 
  body: Many of the examples in this section use class <tt>File</tt>, the only standard subclass of <tt>IO</tt>. The two classes are closely associated.
- !ruby/struct:SM::Flow::P 
  body: As used in this section, <em>portname</em> may take any of the following forms.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: A plain string represents a filename suitable for the underlying operating system.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: A string starting with ``<tt>|</tt>'' indicates a subprocess. The remainder of the string following the ``<tt>|</tt>'' is invoked as a process with appropriate input/output channels connected to it.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: A string equal to ``<tt>|-</tt>'' will create another Ruby instance as a subprocess.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "Ruby will convert pathnames between different operating system conventions if possible. For instance, on a Windows system the filename ``<tt>/gumby/ruby/test.rb</tt>'' will be opened as ``<tt>\\gumby\\ruby\\test.rb</tt>''. When specifying a Windows-style filename in a Ruby string, remember to escape the backslashes:"
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;c:\\gumby\\ruby\\test.rb&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: Our examples here will use the Unix-style forward slashes; <tt>File::SEPARATOR</tt> can be used to get the platform-specific separator character.
- !ruby/struct:SM::Flow::P 
  body: I/O ports may be opened in any one of several different modes, which are shown in this section as <em>mode</em>. The mode may either be a Fixnum or a String. If numeric, it should be one of the operating system specific constants (O_RDONLY, O_WRONLY, O_RDWR, O_APPEND and so on). See man open(2) for more information.
- !ruby/struct:SM::Flow::P 
  body: If the mode is given as a String, it must be one of the values listed in the following table.
- !ruby/struct:SM::Flow::VERB 
  body: "  Mode |  Meaning\n  -----+--------------------------------------------------------\n  &quot;r&quot;  |  Read-only, starts at beginning of file  (default mode).\n  -----+--------------------------------------------------------\n  &quot;r+&quot; |  Read-write, starts at beginning of file.\n  -----+--------------------------------------------------------\n  &quot;w&quot;  |  Write-only, truncates existing file\n       |  to zero length or creates a new file for writing.\n  -----+--------------------------------------------------------\n  &quot;w+&quot; |  Read-write, truncates existing file to zero length\n       |  or creates a new file for reading and writing.\n  -----+--------------------------------------------------------\n  &quot;a&quot;  |  Write-only, starts at end of file if file exists,\n       |  otherwise creates a new file for writing.\n  -----+--------------------------------------------------------\n  &quot;a+&quot; |  Read-write, starts at end of file if file exists,\n       |  otherwise creates a new file for reading and\n       |  writing.\n  -----+--------------------------------------------------------\n   &quot;b&quot; |  (DOS/Windows only) Binary file mode (may appear with\n       |  any of the key letters listed above).\n"
- !ruby/struct:SM::Flow::P 
  body: The global constant ARGF (also accessible as $&lt;) provides an IO-like stream which allows access to all files mentioned on the command line (or STDIN if no files are mentioned). ARGF provides the methods <tt>#path</tt> and <tt>#filename</tt> to access the name of the file currently being read.
constants: []

full_name: IOError
includes: []

instance_methods: []

name: IOError
superclass: StandardError
PK�|[�J5o||0ri/1.8/system/ScriptError/cdesc-ScriptError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: ScriptError
includes: []

instance_methods: []

name: ScriptError
superclass: Exception
PK�|[cV�I$ri/1.8/system/Thread/priority-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the priority of <em>thr</em>. Default is inherited from the current thread which creating the new thread, or zero for the initial main thread; higher-priority threads will run before lower-priority threads.
- !ruby/struct:SM::Flow::VERB 
  body: "   Thread.current.priority   #=&gt; 0\n"
full_name: Thread#priority
is_singleton: false
name: priority
params: |
  thr.priority   => integer

visibility: public
PK�|[_0=%��"ri/1.8/system/Thread/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Attribute Reference---Returns the value of a thread-local variable, using either a symbol or a string name. If the specified variable does not exist, returns <tt>nil</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = Thread.new { Thread.current[&quot;name&quot;] = &quot;A&quot;; Thread.stop }\n   b = Thread.new { Thread.current[:name]  = &quot;B&quot;; Thread.stop }\n   c = Thread.new { Thread.current[&quot;name&quot;] = &quot;C&quot;; Thread.stop }\n   Thread.list.each {|x| puts &quot;#{x.inspect}: #{x[:name]}&quot; }\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   #&lt;Thread:0x401b3b3c sleep&gt;: C\n   #&lt;Thread:0x401b3bc8 sleep&gt;: B\n   #&lt;Thread:0x401b3c68 sleep&gt;: A\n   #&lt;Thread:0x401bdf4c run&gt;:\n"
full_name: Thread#[]
is_singleton: false
name: "[]"
params: |
  thr[sym]   => obj or nil

visibility: public
PK�|[G�'���'ri/1.8/system/Thread/priority%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the priority of <em>thr</em> to <em>integer</em>. Higher-priority threads will run before lower-priority threads.
- !ruby/struct:SM::Flow::VERB 
  body: "   count1 = count2 = 0\n   a = Thread.new do\n         loop { count1 += 1 }\n       end\n   a.priority = -1\n\n   b = Thread.new do\n         loop { count2 += 1 }\n       end\n   b.priority = -2\n   sleep 1   #=&gt; 1\n   Thread.critical = 1\n   count1    #=&gt; 622504\n   count2    #=&gt; 5832\n"
full_name: Thread#priority=
is_singleton: false
name: priority=
params: |
  thr.priority= integer   => thr

visibility: public
PK�|[�C�7�� ri/1.8/system/Thread/pass-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invokes the thread scheduler to pass execution to another thread.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = Thread.new { print &quot;a&quot;; Thread.pass;\n                    print &quot;b&quot;; Thread.pass;\n                    print &quot;c&quot; }\n   b = Thread.new { print &quot;x&quot;; Thread.pass;\n                    print &quot;y&quot;; Thread.pass;\n                    print &quot;z&quot; }\n   a.join\n   b.join\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   axbycz\n"
full_name: Thread::pass
is_singleton: true
name: pass
params: |
  Thread.pass   => nil

visibility: public
PK�|[\�����%ri/1.8/system/Thread/terminate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Terminates <em>thr</em> and schedules another thread to be run, returning the terminated <tt>Thread</tt>. If this is the main thread, or the last thread, exits the process.
full_name: Thread#terminate
is_singleton: false
name: terminate
params: |
  thr.exit        => thr
  thr.kill        => thr
  thr.terminate   => thr

visibility: public
PK�|[[�}�'ri/1.8/system/Thread/critical%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Sets the status of the global ``thread critical'' condition and returns it. When set to <tt>true</tt>, prohibits scheduling of any existing thread. Does not block new threads from being created and run. Certain thread operations (such as stopping or killing a thread, sleeping in the current thread, and raising an exception) may cause a thread to be scheduled even when in a critical section. <tt>Thread::critical</tt> is not intended for daily use: it is primarily there to support folks writing threading libraries."
full_name: Thread::critical=
is_singleton: true
name: critical=
params: |
  Thread.critical= boolean   => true or false

visibility: public
PK�|[��1�vv#ri/1.8/system/Thread/current-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the currently executing thread.
- !ruby/struct:SM::Flow::VERB 
  body: "   Thread.current   #=&gt; #&lt;Thread:0x401bdf4c run&gt;\n"
full_name: Thread::current
is_singleton: true
name: current
params: |
  Thread.current   => thread

visibility: public
PK�|[�ǫ�QQ"ri/1.8/system/Thread/wakeup-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Marks <em>thr</em> as eligible for scheduling (it may still remain blocked on I/O, however). Does not invoke the scheduler (see <tt>Thread#run</tt>).
- !ruby/struct:SM::Flow::VERB 
  body: "   c = Thread.new { Thread.stop; puts &quot;hey!&quot; }\n   c.wakeup\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   hey!\n"
full_name: Thread#wakeup
is_singleton: false
name: wakeup
params: |
  thr.wakeup   => thr

visibility: public
PK�|[._e@@(ri/1.8/system/Thread/terminate%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Terminates <em>thr</em> without calling ensure clauses and schedules another thread to be run, returning the terminated <tt>Thread</tt>. If this is the main thread, or the last thread, exits the process.
- !ruby/struct:SM::Flow::P 
  body: See <tt>Thread#exit</tt> for the safer version.
full_name: Thread#terminate!
is_singleton: false
name: terminate!
params: |
  thr.exit!        => thr
  thr.kill!        => thr
  thr.terminate!   => thr

visibility: public
PK�|[s9p// ri/1.8/system/Thread/kill-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Causes the given <em>thread</em> to exit (see <tt>Thread::exit</tt>).
- !ruby/struct:SM::Flow::VERB 
  body: "   count = 0\n   a = Thread.new { loop { count += 1 } }\n   sleep(0.1)       #=&gt; 0\n   Thread.kill(a)   #=&gt; #&lt;Thread:0x401b3d30 dead&gt;\n   count            #=&gt; 93947\n   a.alive?         #=&gt; false\n"
full_name: Thread::kill
is_singleton: true
name: kill
params: |
  Thread.kill(thread)   => thread

visibility: public
PK�|[Ek�Ȥ� ri/1.8/system/Thread/stop-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Stops execution of the current thread, putting it into a ``sleep'' state, and schedules execution of another thread. Resets the ``critical'' condition to <tt>false</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = Thread.new { print &quot;a&quot;; Thread.stop; print &quot;c&quot; }\n   Thread.pass\n   print &quot;b&quot;\n   a.run\n   a.join\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   abc\n"
full_name: Thread::stop
is_singleton: true
name: stop
params: |
  Thread.stop   => nil

visibility: public
PK�|[�si���!ri/1.8/system/Thread/raise-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Raises an exception (see <tt>Kernel::raise</tt>) from <em>thr</em>. The caller does not have to be <em>thr</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   Thread.abort_on_exception = true\n   a = Thread.new { sleep(200) }\n   a.raise(&quot;Gotcha&quot;)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   prog.rb:3: Gotcha (RuntimeError)\n    from prog.rb:2:in `initialize'\n    from prog.rb:2:in `new'\n    from prog.rb:2\n"
full_name: Thread#raise
is_singleton: false
name: raise
params: |
  thr.raise(exception)

visibility: public
PK�|[ΤJ�� ri/1.8/system/Thread/list-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array of <tt>Thread</tt> objects for all threads that are either runnable or stopped.
- !ruby/struct:SM::Flow::VERB 
  body: "   Thread.new { sleep(200) }\n   Thread.new { 1000000.times {|i| i*i } }\n   Thread.new { Thread.stop }\n   Thread.list.each {|t| p t}\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   #&lt;Thread:0x401b3e84 sleep&gt;\n   #&lt;Thread:0x401b3f38 run&gt;\n   #&lt;Thread:0x401b3fb0 sleep&gt;\n   #&lt;Thread:0x401bdf4c run&gt;\n"
full_name: Thread::list
is_singleton: true
name: list
params: |
  Thread.list   => array

visibility: public
PK�|[�:kfkk ri/1.8/system/Thread/main-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the main thread for the process.
- !ruby/struct:SM::Flow::VERB 
  body: "   Thread.main   #=&gt; #&lt;Thread:0x401bdf4c run&gt;\n"
full_name: Thread::main
is_singleton: true
name: main
params: |
  Thread.main   => thread

visibility: public
PK�|[�6���� ri/1.8/system/Thread/kill-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Terminates <em>thr</em> and schedules another thread to be run, returning the terminated <tt>Thread</tt>. If this is the main thread, or the last thread, exits the process.
full_name: Thread#kill
is_singleton: false
name: kill
params: |
  thr.exit        => thr
  thr.kill        => thr
  thr.terminate   => thr

visibility: public
PK�|[Tr{33$ri/1.8/system/Thread/critical-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the status of the global ``thread critical'' condition.
full_name: Thread::critical
is_singleton: true
name: critical
params: |
  Thread.critical   => true or false

visibility: public
PK�|[�"((&ri/1.8/system/Thread/safe_level-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the safe level in effect for <em>thr</em>. Setting thread-local safe levels can help when implementing sandboxes which run insecure code.
- !ruby/struct:SM::Flow::VERB 
  body: "   thr = Thread.new { $SAFE = 3; sleep }\n   Thread.current.safe_level   #=&gt; 0\n   thr.safe_level              #=&gt; 3\n"
full_name: Thread#safe_level
is_singleton: false
name: safe_level
params: |
  thr.safe_level   => integer

visibility: public
PK�|[�����.ri/1.8/system/Thread/abort_on_exception-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the status of the thread-local ``abort on exception'' condition for <em>thr</em>. The default is <tt>false</tt>. See also <tt>Thread::abort_on_exception=</tt>.
full_name: Thread#abort_on_exception
is_singleton: false
name: abort_on_exception
params: |
  thr.abort_on_exception   => true or false

visibility: public
PK�|[!��$��.ri/1.8/system/Thread/abort_on_exception-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the status of the global ``abort on exception'' condition. The default is <tt>false</tt>. When set to <tt>true</tt>, or if the global <tt>$DEBUG</tt> flag is <tt>true</tt> (perhaps because the command line option <tt>-d</tt> was specified) all threads will abort (the process will <tt>exit(0)</tt>) if an exception is raised in any thread. See also <tt>Thread::abort_on_exception=</tt>.
full_name: Thread::abort_on_exception
is_singleton: true
name: abort_on_exception
params: |
  Thread.abort_on_exception   => true or false

visibility: public
PK�|[nFVn�� ri/1.8/system/Thread/exit-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Terminates the currently running thread and schedules another thread to be run. If this thread is already marked to be killed, <tt>exit</tt> returns the <tt>Thread</tt>. If this is the main thread, or the last thread, exit the process.
full_name: Thread::exit
is_singleton: true
name: exit
params: |
  Thread.exit   => thread

visibility: public
PK�|[\�s!!#ri/1.8/system/Thread/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Dump the name, id, and status of <em>thr</em> to a string.
full_name: Thread#inspect
is_singleton: false
name: inspect
params: |
  thr.inspect   => string

visibility: public
PK�|[U�f!66#ri/1.8/system/Thread/kill%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Terminates <em>thr</em> without calling ensure clauses and schedules another thread to be run, returning the terminated <tt>Thread</tt>. If this is the main thread, or the last thread, exits the process.
- !ruby/struct:SM::Flow::P 
  body: See <tt>Thread#exit</tt> for the safer version.
full_name: Thread#kill!
is_singleton: false
name: kill!
params: |
  thr.exit!        => thr
  thr.kill!        => thr
  thr.terminate!   => thr

visibility: public
PK�|[k�

&ri/1.8/system/Thread/cdesc-Thread.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: abort_on_exception
- !ruby/object:RI::MethodSummary 
  name: abort_on_exception=
- !ruby/object:RI::MethodSummary 
  name: critical
- !ruby/object:RI::MethodSummary 
  name: critical=
- !ruby/object:RI::MethodSummary 
  name: current
- !ruby/object:RI::MethodSummary 
  name: exclusive
- !ruby/object:RI::MethodSummary 
  name: exit
- !ruby/object:RI::MethodSummary 
  name: fork
- !ruby/object:RI::MethodSummary 
  name: kill
- !ruby/object:RI::MethodSummary 
  name: list
- !ruby/object:RI::MethodSummary 
  name: main
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: pass
- !ruby/object:RI::MethodSummary 
  name: start
- !ruby/object:RI::MethodSummary 
  name: stop
comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>Thread</tt> encapsulates the behavior of a thread of execution, including the main thread of the Ruby script.
- !ruby/struct:SM::Flow::P 
  body: In the descriptions of the methods in this class, the parameter <em>sym</em> refers to a symbol, which is either a quoted string or a <tt>Symbol</tt> (such as <tt>:name</tt>).
constants: []

full_name: Thread
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: abort_on_exception
- !ruby/object:RI::MethodSummary 
  name: abort_on_exception=
- !ruby/object:RI::MethodSummary 
  name: alive?
- !ruby/object:RI::MethodSummary 
  name: exit
- !ruby/object:RI::MethodSummary 
  name: exit!
- !ruby/object:RI::MethodSummary 
  name: group
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: join
- !ruby/object:RI::MethodSummary 
  name: key?
- !ruby/object:RI::MethodSummary 
  name: keys
- !ruby/object:RI::MethodSummary 
  name: kill
- !ruby/object:RI::MethodSummary 
  name: kill!
- !ruby/object:RI::MethodSummary 
  name: priority
- !ruby/object:RI::MethodSummary 
  name: priority=
- !ruby/object:RI::MethodSummary 
  name: raise
- !ruby/object:RI::MethodSummary 
  name: run
- !ruby/object:RI::MethodSummary 
  name: safe_level
- !ruby/object:RI::MethodSummary 
  name: status
- !ruby/object:RI::MethodSummary 
  name: stop?
- !ruby/object:RI::MethodSummary 
  name: terminate
- !ruby/object:RI::MethodSummary 
  name: terminate!
- !ruby/object:RI::MethodSummary 
  name: value
- !ruby/object:RI::MethodSummary 
  name: wakeup
name: Thread
superclass: Object
PK�|[�g�ƾ� ri/1.8/system/Thread/exit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Terminates <em>thr</em> and schedules another thread to be run, returning the terminated <tt>Thread</tt>. If this is the main thread, or the last thread, exits the process.
full_name: Thread#exit
is_singleton: false
name: exit
params: |
  thr.exit        => thr
  thr.kill        => thr
  thr.terminate   => thr

visibility: public
PK�|[]#7�33ri/1.8/system/Thread/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates and runs a new thread to execute the instructions given in <em>block</em>. Any arguments passed to <tt>Thread::new</tt> are passed into the block.
- !ruby/struct:SM::Flow::VERB 
  body: "   x = Thread.new { sleep 0.1; print &quot;x&quot;; print &quot;y&quot;; print &quot;z&quot; }\n   a = Thread.new { print &quot;a&quot;; print &quot;b&quot;; sleep 0.2; print &quot;c&quot; }\n   x.join # Let the threads finish before\n   a.join # main thread exits...\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   abxyzc\n"
full_name: Thread::new
is_singleton: true
name: new
params: |
  Thread.new([arg]*) {|args| block }   => thread

visibility: public
PK�|[��;66#ri/1.8/system/Thread/exit%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Terminates <em>thr</em> without calling ensure clauses and schedules another thread to be run, returning the terminated <tt>Thread</tt>. If this is the main thread, or the last thread, exits the process.
- !ruby/struct:SM::Flow::P 
  body: See <tt>Thread#exit</tt> for the safer version.
full_name: Thread#exit!
is_singleton: false
name: exit!
params: |
  thr.exit!        => thr
  thr.kill!        => thr
  thr.terminate!   => thr

visibility: public
PK�|[����??%ri/1.8/system/Thread/exclusive-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: Wraps a block in Thread.critical, restoring the original value upon exit from the critical section.
full_name: Thread::exclusive
is_singleton: true
name: exclusive
params: () {|| ...}
visibility: public
PK�|[���??"ri/1.8/system/Thread/status-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns the status of <em>thr</em>: ``<tt>sleep</tt>'' if <em>thr</em> is sleeping or waiting on I/O, ``<tt>run</tt>'' if <em>thr</em> is executing, ``<tt>aborting</tt>'' if <em>thr</em> is aborting, <tt>false</tt> if <em>thr</em> terminated normally, and <tt>nil</tt> if <em>thr</em> terminated with an exception."
- !ruby/struct:SM::Flow::VERB 
  body: "   a = Thread.new { raise(&quot;die now&quot;) }\n   b = Thread.new { Thread.stop }\n   c = Thread.new { Thread.exit }\n   d = Thread.new { sleep }\n   Thread.critical = true\n   d.kill                  #=&gt; #&lt;Thread:0x401b3678 aborting&gt;\n   a.status                #=&gt; nil\n   b.status                #=&gt; &quot;sleep&quot;\n   c.status                #=&gt; false\n   d.status                #=&gt; &quot;aborting&quot;\n   Thread.current.status   #=&gt; &quot;run&quot;\n"
full_name: Thread#status
is_singleton: false
name: status
params: |
  thr.status   => string, false or nil

visibility: public
PK�|[���Mll1ri/1.8/system/Thread/abort_on_exception%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: When set to <tt>true</tt>, all threads will abort if an exception is raised. Returns the new state.
- !ruby/struct:SM::Flow::VERB 
  body: "   Thread.abort_on_exception = true\n   t1 = Thread.new do\n     puts  &quot;In new thread&quot;\n     raise &quot;Exception from thread&quot;\n   end\n   sleep(1)\n   puts &quot;not reached&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   In new thread\n   prog.rb:4: Exception from thread (RuntimeError)\n    from prog.rb:2:in `initialize'\n    from prog.rb:2:in `new'\n    from prog.rb:2\n"
full_name: Thread::abort_on_exception=
is_singleton: true
name: abort_on_exception=
params: |
  Thread.abort_on_exception= boolean   => true or false

visibility: public
PK�|[O�s���1ri/1.8/system/Thread/abort_on_exception%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: When set to <tt>true</tt>, causes all threads (including the main program) to abort if an exception is raised in <em>thr</em>. The process will effectively <tt>exit(0)</tt>.
full_name: Thread#abort_on_exception=
is_singleton: false
name: abort_on_exception=
params: |
  thr.abort_on_exception= boolean   => true or false

visibility: public
PK�|[M�us ri/1.8/system/Thread/keys-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an an array of the names of the thread-local variables (as Symbols).
- !ruby/struct:SM::Flow::VERB 
  body: "   thr = Thread.new do\n     Thread.current[:cat] = 'meow'\n     Thread.current[&quot;dog&quot;] = 'woof'\n   end\n   thr.join   #=&gt; #&lt;Thread:0x401b3f10 dead&gt;\n   thr.keys   #=&gt; [:dog, :cat]\n"
full_name: Thread#keys
is_singleton: false
name: keys
params: |
  thr.keys   => array

visibility: public
PK�|[��X�XX ri/1.8/system/Thread/join-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The calling thread will suspend execution and run <em>thr</em>. Does not return until <em>thr</em> exits or until <em>limit</em> seconds have passed. If the time limit expires, <tt>nil</tt> will be returned, otherwise <em>thr</em> is returned.
- !ruby/struct:SM::Flow::P 
  body: Any threads not joined will be killed when the main program exits. If <em>thr</em> had previously raised an exception and the <tt>abort_on_exception</tt> and <tt>$DEBUG</tt> flags are not set (so the exception has not yet been processed) it will be processed at this time.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = Thread.new { print &quot;a&quot;; sleep(10); print &quot;b&quot;; print &quot;c&quot; }\n   x = Thread.new { print &quot;x&quot;; Thread.pass; print &quot;y&quot;; print &quot;z&quot; }\n   x.join # Let x thread finish, a will be killed on exit.\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   axyz\n"
- !ruby/struct:SM::Flow::P 
  body: The following example illustrates the <em>limit</em> parameter.
- !ruby/struct:SM::Flow::VERB 
  body: "   y = Thread.new { 4.times { sleep 0.1; puts 'tick... ' }}\n   puts &quot;Waiting&quot; until y.join(0.15)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   tick...\n   Waiting\n   tick...\n   Waitingtick...\n\n   tick...\n"
full_name: Thread#join
is_singleton: false
name: join
params: |
  thr.join          => thr
  thr.join(limit)   => thr

visibility: public
PK�|[�j����#ri/1.8/system/Thread/stop%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>thr</em> is dead or sleeping.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = Thread.new { Thread.stop }\n   b = Thread.current\n   a.stop?   #=&gt; true\n   b.stop?   #=&gt; false\n"
full_name: Thread#stop?
is_singleton: false
name: stop?
params: |
  thr.stop?   => true or false

visibility: public
PK�|[]&q��$ri/1.8/system/Thread/alive%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>thr</em> is running or sleeping.
- !ruby/struct:SM::Flow::VERB 
  body: "   thr = Thread.new { }\n   thr.join                #=&gt; #&lt;Thread:0x401b3fb0 dead&gt;\n   Thread.current.alive?   #=&gt; true\n   thr.alive?              #=&gt; false\n"
full_name: Thread#alive?
is_singleton: false
name: alive?
params: |
  thr.alive?   => true or false

visibility: public
PK�|[�[�`}}ri/1.8/system/Thread/run-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Wakes up <em>thr</em>, making it eligible for scheduling. If not in a critical section, then invokes the scheduler.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = Thread.new { puts &quot;a&quot;; Thread.stop; puts &quot;c&quot; }\n   Thread.pass\n   puts &quot;Got here&quot;\n   a.run\n   a.join\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   a\n   Got here\n   c\n"
full_name: Thread#run
is_singleton: false
name: run
params: |
  thr.run   => thr

visibility: public
PK�|[
����� ri/1.8/system/Thread/fork-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Basically the same as <tt>Thread::new</tt>. However, if class <tt>Thread</tt> is subclassed, then calling <tt>start</tt> in that subclass will not invoke the subclass's <tt>initialize</tt> method.
full_name: Thread::fork
is_singleton: true
name: fork
params: |
  Thread.start([args]*) {|args| block }   => thread
  Thread.fork([args]*) {|args| block }    => thread

visibility: public
PK�|[��y��!ri/1.8/system/Thread/value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Waits for <em>thr</em> to complete (via <tt>Thread#join</tt>) and returns its value.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = Thread.new { 2 + 2 }\n   a.value   #=&gt; 4\n"
full_name: Thread#value
is_singleton: false
name: value
params: |
  thr.value   => obj

visibility: public
PK�|[BR���!ri/1.8/system/Thread/start-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Basically the same as <tt>Thread::new</tt>. However, if class <tt>Thread</tt> is subclassed, then calling <tt>start</tt> in that subclass will not invoke the subclass's <tt>initialize</tt> method.
full_name: Thread::start
is_singleton: true
name: start
params: |
  Thread.start([args]*) {|args| block }   => thread
  Thread.fork([args]*) {|args| block }    => thread

visibility: public
PK�|[6���mm%ri/1.8/system/Thread/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Attribute Assignment---Sets or creates the value of a thread-local variable, using either a symbol or a string. See also <tt>Thread#[]</tt>.
full_name: Thread#[]=
is_singleton: false
name: "[]="
params: |
  thr[sym] = obj   => obj

visibility: public
PK�|[+�A���!ri/1.8/system/Thread/group-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the <tt>ThreadGroup</tt> which contains <em>thr</em>, or nil if the thread is not a member of any group.
- !ruby/struct:SM::Flow::VERB 
  body: "   Thread.main.group   #=&gt; #&lt;ThreadGroup:0x4029d914&gt;\n"
full_name: Thread#group
is_singleton: false
name: group
params: |
  thr.group   => thgrp or nil

visibility: public
PK�|[2Nq��"ri/1.8/system/Thread/key%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the given string (or symbol) exists as a thread-local variable.
- !ruby/struct:SM::Flow::VERB 
  body: "   me = Thread.current\n   me[:oliver] = &quot;a&quot;\n   me.key?(:oliver)    #=&gt; true\n   me.key?(:stanley)   #=&gt; false\n"
full_name: Thread#key?
is_singleton: false
name: key?
params: |
  thr.key?(sym)   => true or false

visibility: public
PK�|[*�K���-ri/1.8/system/SOAP/SOAPEnvelope/encode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (@header)
comment: 
full_name: SOAP::SOAPEnvelope#encode
is_singleton: false
name: encode
params: (generator, ns, attrs = {}) {|@header| ...}
visibility: public
PK�|[v�US��-ri/1.8/system/SOAP/SOAPEnvelope/to_ary-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPEnvelope#to_ary
is_singleton: false
name: to_ary
params: ()
visibility: public
PK�|[�
J��*ri/1.8/system/SOAP/SOAPEnvelope/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPEnvelope::new
is_singleton: true
name: new
params: (header = nil, body = nil)
visibility: public
PK�|[��H��7ri/1.8/system/SOAP/SOAPEnvelope/cdesc-SOAPEnvelope.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: body
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: external_content
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: header
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::SOAPEnvelope
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPEnvelopeElement
- !ruby/object:RI::IncludedModule 
  name: SOAPCompoundtype
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: body=
- !ruby/object:RI::MethodSummary 
  name: encode
- !ruby/object:RI::MethodSummary 
  name: header=
- !ruby/object:RI::MethodSummary 
  name: to_ary
name: SOAPEnvelope
superclass: XSD::NSDBase
PK�|[�S?e��0ri/1.8/system/SOAP/SOAPEnvelope/header%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPEnvelope#header=
is_singleton: false
name: header=
params: (header)
visibility: public
PK�|[-����.ri/1.8/system/SOAP/SOAPEnvelope/body%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPEnvelope#body=
is_singleton: false
name: body=
params: (body)
visibility: public
PK�|[�����)ri/1.8/system/SOAP/SOAPHeader/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #length"
full_name: SOAP::SOAPHeader#size
is_singleton: false
name: size
params: ()
visibility: public
PK�|[k�	���+ri/1.8/system/SOAP/SOAPHeader/encode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (data)
comment: 
full_name: SOAP::SOAPHeader#encode
is_singleton: false
name: encode
params: (generator, ns, attrs = {}) {|data| ...}
visibility: public
PK�|[U9�4��3ri/1.8/system/SOAP/SOAPHeader/cdesc-SOAPHeader.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::SOAPHeader
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPEnvelopeElement
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: encode
- !ruby/object:RI::MethodSummary 
  name: length
- !ruby/object:RI::MethodSummary 
  name: size
name: SOAPHeader
superclass: SOAPStruct
PK�|[d�����(ri/1.8/system/SOAP/SOAPHeader/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPHeader#add
is_singleton: false
name: add
params: (name, value)
visibility: public
PK�|[�ɞ��(ri/1.8/system/SOAP/SOAPHeader/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPHeader::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[%$Q��+ri/1.8/system/SOAP/SOAPHeader/length-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: size
block_params: 
comment: 
full_name: SOAP::SOAPHeader#length
is_singleton: false
name: length
params: ()
visibility: public
PK�|[O]@��-ri/1.8/system/SOAP/SOAPNil/cdesc-SOAPNil.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPNil
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPNil
superclass: XSD::XSDNil
PK�|[	O��Eri/1.8/system/SOAP/SOAPEnvelopeElement/cdesc-SOAPEnvelopeElement.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: SOAP elements
constants: []

full_name: SOAP::SOAPEnvelopeElement
includes: []

instance_methods: []

name: SOAPEnvelopeElement
superclass: 
PK�|[z`�\1ri/1.8/system/SOAP/SOAPShort/cdesc-SOAPShort.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPShort
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPShort
superclass: XSD::XSDShort
PK�|[Ϧ{��Iri/1.8/system/SOAP/MPostUnavailableError/cdesc-MPostUnavailableError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::MPostUnavailableError
includes: []

instance_methods: []

name: MPostUnavailableError
superclass: HTTPStreamError
PK�|[�3����+ri/1.8/system/SOAP/Header/cdesc-Header.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::Header
includes: []

instance_methods: []

name: Header
superclass: 
PK�|[��HR��/ri/1.8/system/SOAP/Header/HandlerSet/dup-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Header::HandlerSet#dup
is_singleton: false
name: dup
params: ()
visibility: public
PK�|[���ƿ�2ri/1.8/system/SOAP/Header/HandlerSet/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Header::HandlerSet#delete
is_singleton: false
name: delete
params: (handler)
visibility: public
PK�|[ׅ�i��4ri/1.8/system/SOAP/Header/HandlerSet/store%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Header::HandlerSet#store=
is_singleton: false
name: store=
params: (store)
visibility: protected
PK�|[��E-6ri/1.8/system/SOAP/Header/HandlerSet/on_inbound-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "headers: SOAPHeaderItem enumerable object"
full_name: SOAP::Header::HandlerSet#on_inbound
is_singleton: false
name: on_inbound
params: (headers)
visibility: public
PK�|[g�9��/ri/1.8/system/SOAP/Header/HandlerSet/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: "<<"
block_params: 
comment: 
full_name: SOAP::Header::HandlerSet#add
is_singleton: false
name: add
params: (handler)
visibility: public
PK�|[���(��6ri/1.8/system/SOAP/Header/HandlerSet/include%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Header::HandlerSet#include?
is_singleton: false
name: include?
params: (handler)
visibility: public
PK�|[���ò�/ri/1.8/system/SOAP/Header/HandlerSet/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Header::HandlerSet::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[����2ri/1.8/system/SOAP/Header/HandlerSet/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add"
full_name: SOAP::Header::HandlerSet#<<
is_singleton: false
name: "<<"
params: (handler)
visibility: public
PK�|[��^M		7ri/1.8/system/SOAP/Header/HandlerSet/on_outbound-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "returns: Array of SOAPHeaderItem"
full_name: SOAP::Header::HandlerSet#on_outbound
is_singleton: false
name: on_outbound
params: ()
visibility: public
PK�|[@��j��:ri/1.8/system/SOAP/Header/HandlerSet/cdesc-HandlerSet.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::Header::HandlerSet
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: dup
- !ruby/object:RI::MethodSummary 
  name: include?
- !ruby/object:RI::MethodSummary 
  name: on_inbound
- !ruby/object:RI::MethodSummary 
  name: on_outbound
- !ruby/object:RI::MethodSummary 
  name: store=
name: HandlerSet
superclass: Object
PK�|[h����9ri/1.8/system/SOAP/Header/SimpleHandler/on_inbound-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Header::SimpleHandler#on_inbound
is_singleton: false
name: on_inbound
params: (header, mustunderstand)
visibility: public
PK�|["����2ri/1.8/system/SOAP/Header/SimpleHandler/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Header::SimpleHandler::new
is_singleton: true
name: new
params: (elename)
visibility: public
PK�|[�z�22@ri/1.8/system/SOAP/Header/SimpleHandler/on_simple_inbound-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Given header is a Hash, String or nil.
full_name: SOAP::Header::SimpleHandler#on_simple_inbound
is_singleton: false
name: on_simple_inbound
params: (header, mustunderstand)
visibility: public
PK�|[��8��@ri/1.8/system/SOAP/Header/SimpleHandler/cdesc-SimpleHandler.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::Header::SimpleHandler
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: on_inbound
- !ruby/object:RI::MethodSummary 
  name: on_outbound
- !ruby/object:RI::MethodSummary 
  name: on_simple_inbound
- !ruby/object:RI::MethodSummary 
  name: on_simple_outbound
name: SimpleHandler
superclass: SOAP::Header::Handler
PK�|[{����:ri/1.8/system/SOAP/Header/SimpleHandler/on_outbound-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Header::SimpleHandler#on_outbound
is_singleton: false
name: on_outbound
params: ()
visibility: public
PK�|[�$��Ari/1.8/system/SOAP/Header/SimpleHandler/on_simple_outbound-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Should return a Hash, String or nil.
full_name: SOAP::Header::SimpleHandler#on_simple_outbound
is_singleton: false
name: on_simple_outbound
params: ()
visibility: public
PK�|[���=��>ri/1.8/system/SOAP/Header/Handler/on_inbound_headeritem-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Header::Handler#on_inbound_headeritem
is_singleton: false
name: on_inbound_headeritem
params: (header)
visibility: public
PK�|[�u�((3ri/1.8/system/SOAP/Header/Handler/on_inbound-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Given header is a SOAPHeaderItem or nil.
full_name: SOAP::Header::Handler#on_inbound
is_singleton: false
name: on_inbound
params: (header, mustunderstand = false)
visibility: public
PK�|[Z�ն�,ri/1.8/system/SOAP/Header/Handler/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Header::Handler::new
is_singleton: true
name: new
params: (elename)
visibility: public
PK�|[g���4ri/1.8/system/SOAP/Header/Handler/on_outbound-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Should return a SOAP/OM, a SOAPHeaderItem or nil.
full_name: SOAP::Header::Handler#on_outbound
is_singleton: false
name: on_outbound
params: ()
visibility: public
PK�|[%��a��4ri/1.8/system/SOAP/Header/Handler/cdesc-Handler.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: elename
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: encodingstyle
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: mustunderstand
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::Header::Handler
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: on_inbound
- !ruby/object:RI::MethodSummary 
  name: on_inbound_headeritem
- !ruby/object:RI::MethodSummary 
  name: on_outbound
- !ruby/object:RI::MethodSummary 
  name: on_outbound_headeritem
name: Handler
superclass: Object
PK�|[RTj��?ri/1.8/system/SOAP/Header/Handler/on_outbound_headeritem-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Header::Handler#on_outbound_headeritem
is_singleton: false
name: on_outbound_headeritem
params: ()
visibility: public
PK�|[��ϧ

7ri/1.8/system/SOAP/SOAPDuration/cdesc-SOAPDuration.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPDuration
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPDuration
superclass: XSD::XSDDuration
PK�|['CN>5ri/1.8/system/SOAP/SOAPDecimal/cdesc-SOAPDecimal.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPDecimal
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPDecimal
superclass: XSD::XSDDecimal
PK�|[/��Ari/1.8/system/SOAP/SOAPUnsignedShort/cdesc-SOAPUnsignedShort.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPUnsignedShort
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPUnsignedShort
superclass: XSD::XSDUnsignedShort
PK�|[���~��"ri/1.8/system/SOAP/proxy%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP#proxy=
is_singleton: false
name: proxy=
params: (proxy)
visibility: public
PK�|[>����+ri/1.8/system/SOAP/create_connection-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP#create_connection
is_singleton: false
name: create_connection
params: (url)
visibility: private
PK�|[�����/ri/1.8/system/SOAP/SOAPDate/cdesc-SOAPDate.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPDate
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPDate
superclass: XSD::XSDDate
PK�|[P3F��/ri/1.8/system/SOAP/SOAPGDay/cdesc-SOAPGDay.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPGDay
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPGDay
superclass: XSD::XSDGDay
PK�|[@��=ri/1.8/system/SOAP/SOAPUnsignedInt/cdesc-SOAPUnsignedInt.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPUnsignedInt
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPUnsignedInt
superclass: XSD::XSDUnsignedInt
PK�|[t+���2ri/1.8/system/SOAP/RPC/Driver/setup_options-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#setup_options
is_singleton: false
name: setup_options
params: ()
visibility: private
PK�|[���u��2ri/1.8/system/SOAP/RPC/Driver/create_header-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#create_header
is_singleton: false
name: create_header
params: (headers)
visibility: private
PK�|[�u�U��)ri/1.8/system/SOAP/RPC/Driver/call-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#call
is_singleton: false
name: call
params: (name, *params)
visibility: public
PK�|[��t���1ri/1.8/system/SOAP/RPC/Driver/loadproperty-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#loadproperty
is_singleton: false
name: loadproperty
params: (propertyname)
visibility: public
PK�|[�3p��Bri/1.8/system/SOAP/RPC/Driver/add_document_method_interface-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#add_document_method_interface
is_singleton: false
name: add_document_method_interface
params: (name, param_def)
visibility: private
PK�|[�ә��1ri/1.8/system/SOAP/RPC/Driver/__attr_proxy-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver::__attr_proxy
is_singleton: true
name: __attr_proxy
params: (symbol, assignable = false)
visibility: public
PK�|[9;�TTTBri/1.8/system/SOAP/RPC/Driver/add_method_with_soapaction_as-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_rpc_method_with_soapaction_as"
full_name: SOAP::RPC::Driver#add_method_with_soapaction_as
is_singleton: false
name: add_method_with_soapaction_as
params: (name, name_as, soapaction, *params)
visibility: public
PK�|[r5^���9ri/1.8/system/SOAP/RPC/Driver/add_method_interface-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#add_method_interface
is_singleton: false
name: add_method_interface
params: (name, param_count)
visibility: private
PK�|[Ț�6ri/1.8/system/SOAP/RPC/Driver/add_rpc_method_as-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: add_method_as
block_params: 
comment: 
full_name: SOAP::RPC::Driver#add_rpc_method_as
is_singleton: false
name: add_rpc_method_as
params: (name, name_as, *params)
visibility: public
PK�|[�R���.ri/1.8/system/SOAP/RPC/Driver/httpproxy-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#httpproxy
is_singleton: false
name: httpproxy
params: ()
visibility: public
PK�|[�r�H��3ri/1.8/system/SOAP/RPC/Driver/add_rpc_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: add_method
block_params: 
comment: 
full_name: SOAP::RPC::Driver#add_rpc_method
is_singleton: false
name: add_rpc_method
params: (name, *params)
visibility: public
PK�|[��B��,ri/1.8/system/SOAP/RPC/Driver/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[��}Z��(ri/1.8/system/SOAP/RPC/Driver/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver::new
is_singleton: true
name: new
params: (endpoint_url, namespace = nil, soapaction = nil)
visibility: public
PK�|[!�w���5ri/1.8/system/SOAP/RPC/Driver/mandatorycharset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#mandatorycharset
is_singleton: false
name: mandatorycharset
params: ()
visibility: public
PK�|[�����8ri/1.8/system/SOAP/RPC/Driver/add_document_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#add_document_method
is_singleton: false
name: add_document_method
params: (name, soapaction, req_qname, res_qname)
visibility: public
PK�|[�8�}��1ri/1.8/system/SOAP/RPC/Driver/wiredump_dev-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#wiredump_dev
is_singleton: false
name: wiredump_dev
params: ()
visibility: public
PK�|[RP�1��=ri/1.8/system/SOAP/RPC/Driver/add_rpc_method_interface-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#add_rpc_method_interface
is_singleton: false
name: add_rpc_method_interface
params: (name, param_def)
visibility: private
PK�|[��m	��1ri/1.8/system/SOAP/RPC/Driver/httpproxy%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#httpproxy=
is_singleton: false
name: httpproxy=
params: (httpproxy)
visibility: public
PK�|[�#4FBB?ri/1.8/system/SOAP/RPC/Driver/add_method_with_soapaction-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_rpc_method_with_soapaction"
full_name: SOAP::RPC::Driver#add_method_with_soapaction
is_singleton: false
name: add_method_with_soapaction
params: (name, soapaction, *params)
visibility: public
PK�|[t�����7ri/1.8/system/SOAP/RPC/Driver/wiredump_file_base-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#wiredump_file_base
is_singleton: false
name: wiredump_file_base
params: ()
visibility: public
PK�|[���j��4ri/1.8/system/SOAP/RPC/Driver/wiredump_dev%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#wiredump_dev=
is_singleton: false
name: wiredump_dev=
params: (wiredump_dev)
visibility: public
PK�|[aAt$��6ri/1.8/system/SOAP/RPC/Driver/add_rpc_operation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#add_rpc_operation
is_singleton: false
name: add_rpc_operation
params: (qname, soapaction, name, param_def, opt = {})
visibility: public
PK�|[�ۆJJFri/1.8/system/SOAP/RPC/Driver/add_rpc_method_with_soapaction_as-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: add_method_with_soapaction_as
block_params: 
comment: 
full_name: SOAP::RPC::Driver#add_rpc_method_with_soapaction_as
is_singleton: false
name: add_rpc_method_with_soapaction_as
params: (name, name_as, soapaction, *params)
visibility: public
PK�|[�Qa7+	+	/ri/1.8/system/SOAP/RPC/Driver/cdesc-Driver.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: options
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: proxy
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: soapaction
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: __attr_proxy
- !ruby/object:RI::MethodSummary 
  name: __attr_proxy
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::RPC::Driver
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_document_method
- !ruby/object:RI::MethodSummary 
  name: add_document_method_interface
- !ruby/object:RI::MethodSummary 
  name: add_document_operation
- !ruby/object:RI::MethodSummary 
  name: add_method
- !ruby/object:RI::MethodSummary 
  name: add_method_as
- !ruby/object:RI::MethodSummary 
  name: add_method_interface
- !ruby/object:RI::MethodSummary 
  name: add_method_interface
- !ruby/object:RI::MethodSummary 
  name: add_method_with_soapaction
- !ruby/object:RI::MethodSummary 
  name: add_method_with_soapaction_as
- !ruby/object:RI::MethodSummary 
  name: add_rpc_method
- !ruby/object:RI::MethodSummary 
  name: add_rpc_method_as
- !ruby/object:RI::MethodSummary 
  name: add_rpc_method_interface
- !ruby/object:RI::MethodSummary 
  name: add_rpc_method_with_soapaction
- !ruby/object:RI::MethodSummary 
  name: add_rpc_method_with_soapaction_as
- !ruby/object:RI::MethodSummary 
  name: add_rpc_operation
- !ruby/object:RI::MethodSummary 
  name: call
- !ruby/object:RI::MethodSummary 
  name: create_header
- !ruby/object:RI::MethodSummary 
  name: httpproxy
- !ruby/object:RI::MethodSummary 
  name: httpproxy=
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: invoke
- !ruby/object:RI::MethodSummary 
  name: loadproperty
- !ruby/object:RI::MethodSummary 
  name: mandatorycharset
- !ruby/object:RI::MethodSummary 
  name: mandatorycharset=
- !ruby/object:RI::MethodSummary 
  name: set_wiredump_file_base
- !ruby/object:RI::MethodSummary 
  name: setup_options
- !ruby/object:RI::MethodSummary 
  name: wiredump_dev
- !ruby/object:RI::MethodSummary 
  name: wiredump_dev=
- !ruby/object:RI::MethodSummary 
  name: wiredump_file_base
- !ruby/object:RI::MethodSummary 
  name: wiredump_file_base=
name: Driver
superclass: Object
PK�|[�!88Cri/1.8/system/SOAP/RPC/Driver/add_rpc_method_with_soapaction-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: add_method_with_soapaction
block_params: 
comment: 
full_name: SOAP::RPC::Driver#add_rpc_method_with_soapaction
is_singleton: false
name: add_rpc_method_with_soapaction
params: (name, soapaction, *params)
visibility: public
PK�|[�NN��;ri/1.8/system/SOAP/RPC/Driver/set_wiredump_file_base-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#set_wiredump_file_base
is_singleton: false
name: set_wiredump_file_base
params: (name)
visibility: private
PK�|[b<���8ri/1.8/system/SOAP/RPC/Driver/mandatorycharset%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#mandatorycharset=
is_singleton: false
name: mandatorycharset=
params: (mandatorycharset)
visibility: public
PK�|[��O�2ri/1.8/system/SOAP/RPC/Driver/add_method_as-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_rpc_method_as"
full_name: SOAP::RPC::Driver#add_method_as
is_singleton: false
name: add_method_as
params: (name, name_as, *params)
visibility: public
PK�|[��ž�+ri/1.8/system/SOAP/RPC/Driver/invoke-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#invoke
is_singleton: false
name: invoke
params: (headers, body)
visibility: public
PK�|[�Q�/ri/1.8/system/SOAP/RPC/Driver/add_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_rpc_method"
full_name: SOAP::RPC::Driver#add_method
is_singleton: false
name: add_method
params: (name, *params)
visibility: public
PK�|[��5H��:ri/1.8/system/SOAP/RPC/Driver/wiredump_file_base%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#wiredump_file_base=
is_singleton: false
name: wiredump_file_base=
params: (wiredump_file_base)
visibility: public
PK�|[����;ri/1.8/system/SOAP/RPC/Driver/add_document_operation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Driver#add_document_operation
is_singleton: false
name: add_document_operation
params: (soapaction, name, param_def, opt = {})
visibility: public
PK�|[Uyi�JJ%ri/1.8/system/SOAP/RPC/cdesc-RPC.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: defined_methods
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ServerException
  value: Mapping::MappedException
full_name: SOAP::RPC
includes: []

instance_methods: []

name: RPC
superclass: 
PK�|[�ܱ��-ri/1.8/system/SOAP/RPC/defined_methods-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::defined_methods
is_singleton: true
name: defined_methods
params: (obj)
visibility: public
PK�|[�����7ri/1.8/system/SOAP/RPC/SOAPMethod/cdesc-SOAPMethod.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: inparam
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: outparam
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: param_def
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: retval_class_name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: retval_name
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: create_doc_param_def
- !ruby/object:RI::MethodSummary 
  name: create_rpc_param_def
- !ruby/object:RI::MethodSummary 
  name: derive_rpc_param_def
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: param_count
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: RETVAL
  value: "'retval'"
- !ruby/object:RI::Constant 
  comment: 
  name: IN
  value: "'in'"
- !ruby/object:RI::Constant 
  comment: 
  name: OUT
  value: "'out'"
- !ruby/object:RI::Constant 
  comment: 
  name: INOUT
  value: "'inout'"
full_name: SOAP::RPC::SOAPMethod
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: collect_params
- !ruby/object:RI::MethodSummary 
  name: have_outparam?
- !ruby/object:RI::MethodSummary 
  name: init_param
- !ruby/object:RI::MethodSummary 
  name: input_params
- !ruby/object:RI::MethodSummary 
  name: output_params
- !ruby/object:RI::MethodSummary 
  name: set_outparam
- !ruby/object:RI::MethodSummary 
  name: set_param
name: SOAPMethod
superclass: SOAPStruct
PK�|[ȮV��6ri/1.8/system/SOAP/RPC/SOAPMethod/output_params-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPMethod#output_params
is_singleton: false
name: output_params
params: ()
visibility: public
PK�|[p�����9ri/1.8/system/SOAP/RPC/SOAPMethod/have_outparam%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPMethod#have_outparam?
is_singleton: false
name: have_outparam?
params: ()
visibility: public
PK�|[VV�\��=ri/1.8/system/SOAP/RPC/SOAPMethod/derive_rpc_param_def-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPMethod::derive_rpc_param_def
is_singleton: true
name: derive_rpc_param_def
params: (obj, name, *param)
visibility: public
PK�|[����2ri/1.8/system/SOAP/RPC/SOAPMethod/set_param-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPMethod#set_param
is_singleton: false
name: set_param
params: (params)
visibility: public
PK�|[�U~��4ri/1.8/system/SOAP/RPC/SOAPMethod/param_count-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPMethod::param_count
is_singleton: true
name: param_count
params: (param_def, *type)
visibility: public
PK�|[H�)���7ri/1.8/system/SOAP/RPC/SOAPMethod/collect_params-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPMethod#collect_params
is_singleton: false
name: collect_params
params: (*type)
visibility: private
PK�|[�����,ri/1.8/system/SOAP/RPC/SOAPMethod/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPMethod::new
is_singleton: true
name: new
params: (qname, param_def = nil)
visibility: public
PK�|[����=ri/1.8/system/SOAP/RPC/SOAPMethod/create_doc_param_def-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPMethod::create_doc_param_def
is_singleton: true
name: create_doc_param_def
params: (req_qnames, res_qnames)
visibility: public
PK�|[���\��3ri/1.8/system/SOAP/RPC/SOAPMethod/init_param-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPMethod#init_param
is_singleton: false
name: init_param
params: (param_def)
visibility: private
PK�|[8��#��=ri/1.8/system/SOAP/RPC/SOAPMethod/create_rpc_param_def-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPMethod::create_rpc_param_def
is_singleton: true
name: create_rpc_param_def
params: (param_names)
visibility: public
PK�|[�f�Y��5ri/1.8/system/SOAP/RPC/SOAPMethod/set_outparam-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPMethod#set_outparam
is_singleton: false
name: set_outparam
params: (params)
visibility: public
PK�|[SQ^��5ri/1.8/system/SOAP/RPC/SOAPMethod/input_params-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPMethod#input_params
is_singleton: false
name: input_params
params: ()
visibility: public
PK�|[Q�����:ri/1.8/system/SOAP/RPC/SOAPlet/require_path_info%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPlet#require_path_info?
is_singleton: false
name: require_path_info?
params: ()
visibility: public
PK�|[�����Dri/1.8/system/SOAP/RPC/SOAPlet/allow_content_encoding_gzip%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPlet#allow_content_encoding_gzip=
is_singleton: false
name: allow_content_encoding_gzip=
params: (allow)
visibility: public
PK�|[�����-ri/1.8/system/SOAP/RPC/SOAPlet/do_POST-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPlet#do_POST
is_singleton: false
name: do_POST
params: (req, res)
visibility: public
PK�|[ݭ�w��1ri/1.8/system/SOAP/RPC/SOAPlet/encode_gzip-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPlet#encode_gzip
is_singleton: false
name: encode_gzip
params: (req, outstring)
visibility: private
PK�|[�U�=��6ri/1.8/system/SOAP/RPC/SOAPlet/parse_soapaction-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPlet#parse_soapaction
is_singleton: false
name: parse_soapaction
params: (soapaction)
visibility: private
PK�|[Z�s�6ri/1.8/system/SOAP/RPC/SOAPlet/app_scope_router-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: for backward compatibility
full_name: SOAP::RPC::SOAPlet#app_scope_router
is_singleton: false
name: app_scope_router
params: ()
visibility: public
PK�|[�Oר��,ri/1.8/system/SOAP/RPC/SOAPlet/do_GET-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPlet#do_GET
is_singleton: false
name: do_GET
params: (req, res)
visibility: public
PK�|[���j��/ri/1.8/system/SOAP/RPC/SOAPlet/setup_req-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPlet#setup_req
is_singleton: false
name: setup_req
params: (conn_data, req)
visibility: private
PK�|[l���,ri/1.8/system/SOAP/RPC/SOAPlet/logger-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPlet#logger
is_singleton: false
name: logger
params: ()
visibility: private
PK�|[�<~*��4ri/1.8/system/SOAP/RPC/SOAPlet/encode_gzip%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPlet#encode_gzip?
is_singleton: false
name: encode_gzip?
params: (req)
visibility: private
PK�|[0~1O��)ri/1.8/system/SOAP/RPC/SOAPlet/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPlet::new
is_singleton: true
name: new
params: (router = nil)
visibility: public
PK�|[���5		1ri/1.8/system/SOAP/RPC/SOAPlet/add_servant-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: for backward compatibility
full_name: SOAP::RPC::SOAPlet#add_servant
is_singleton: false
name: add_servant
params: (obj, namespace)
visibility: public
PK�|[nԪ2ri/1.8/system/SOAP/RPC/SOAPlet/get_instance-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Servlet interfaces for WEBrick.
full_name: SOAP::RPC::SOAPlet#get_instance
is_singleton: false
name: get_instance
params: (config, *options)
visibility: public
PK�|[qd4��/ri/1.8/system/SOAP/RPC/SOAPlet/setup_res-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPlet#setup_res
is_singleton: false
name: setup_res
params: (conn_data, req, res)
visibility: private
PK�|[�G��1ri/1.8/system/SOAP/RPC/SOAPlet/cdesc-SOAPlet.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: options
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::RPC::SOAPlet
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_servant
- !ruby/object:RI::MethodSummary 
  name: allow_content_encoding_gzip=
- !ruby/object:RI::MethodSummary 
  name: app_scope_router
- !ruby/object:RI::MethodSummary 
  name: do_GET
- !ruby/object:RI::MethodSummary 
  name: do_POST
- !ruby/object:RI::MethodSummary 
  name: encode_gzip
- !ruby/object:RI::MethodSummary 
  name: encode_gzip?
- !ruby/object:RI::MethodSummary 
  name: get_instance
- !ruby/object:RI::MethodSummary 
  name: logger
- !ruby/object:RI::MethodSummary 
  name: parse_soapaction
- !ruby/object:RI::MethodSummary 
  name: require_path_info?
- !ruby/object:RI::MethodSummary 
  name: setup_req
- !ruby/object:RI::MethodSummary 
  name: setup_res
name: SOAPlet
superclass: WEBrick::HTTPServlet::AbstractServlet
PK�|[�WAA��Bri/1.8/system/SOAP/RPC/HTTPServer/generate_explicit_type%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::HTTPServer#generate_explicit_type=
is_singleton: false
name: generate_explicit_type=
params: (generate_explicit_type)
visibility: public
PK�|[�����<ri/1.8/system/SOAP/RPC/HTTPServer/mapping_registry%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::HTTPServer#mapping_registry=
is_singleton: false
name: mapping_registry=
params: (mapping_registry)
visibility: public
PK�|[��VZ>ri/1.8/system/SOAP/RPC/HTTPServer/add_rpc_headerhandler-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_headerhandler"
full_name: SOAP::RPC::HTTPServer#add_rpc_headerhandler
is_singleton: false
name: add_rpc_headerhandler
params: (obj)
visibility: public
PK�|[�����1ri/1.8/system/SOAP/RPC/HTTPServer/shutdown-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::HTTPServer#shutdown
is_singleton: false
name: shutdown
params: ()
visibility: public
PK�|[���b��8ri/1.8/system/SOAP/RPC/HTTPServer/add_rpc_servant-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::HTTPServer#add_rpc_servant
is_singleton: false
name: add_rpc_servant
params: (obj, namespace = @default_namespace)
visibility: public
PK�|[�c���0ri/1.8/system/SOAP/RPC/HTTPServer/on_init-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::HTTPServer#on_init
is_singleton: false
name: on_init
params: ()
visibility: public
PK�|[������9ri/1.8/system/SOAP/RPC/HTTPServer/mapping_registry-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::HTTPServer#mapping_registry
is_singleton: false
name: mapping_registry
params: ()
visibility: public
PK�|[Fn�::@ri/1.8/system/SOAP/RPC/HTTPServer/add_rpc_request_servant-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: servant entry interface
full_name: SOAP::RPC::HTTPServer#add_rpc_request_servant
is_singleton: false
name: add_rpc_request_servant
params: (factory, namespace = @default_namespace)
visibility: public
PK�|[���:ri/1.8/system/SOAP/RPC/HTTPServer/add_rpc_method_as-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: add_method_as
block_params: 
comment: 
full_name: SOAP::RPC::HTTPServer#add_rpc_method_as
is_singleton: false
name: add_rpc_method_as
params: (obj, name, name_as, *param)
visibility: public
PK�|[�<�Bri/1.8/system/SOAP/RPC/HTTPServer/add_rpc_request_operation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::HTTPServer#add_rpc_request_operation
is_singleton: false
name: add_rpc_request_operation
params: (factory, qname, soapaction, name, param_def, opt = {})
visibility: public
PK�|[B�91��?ri/1.8/system/SOAP/RPC/HTTPServer/generate_explicit_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::HTTPServer#generate_explicit_type
is_singleton: false
name: generate_explicit_type
params: ()
visibility: public
PK�|[��??7ri/1.8/system/SOAP/RPC/HTTPServer/add_rpc_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: add_method
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: method entry interface
full_name: SOAP::RPC::HTTPServer#add_rpc_method
is_singleton: false
name: add_rpc_method
params: (obj, name, *param)
visibility: public
PK�|[K�?��,ri/1.8/system/SOAP/RPC/HTTPServer/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::HTTPServer::new
is_singleton: true
name: new
params: (config)
visibility: public
PK�|[G�vGri/1.8/system/SOAP/RPC/HTTPServer/add_document_request_operation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::HTTPServer#add_document_request_operation
is_singleton: false
name: add_document_request_operation
params: (factory, soapaction, name, param_def, opt = {})
visibility: public
PK�|[�5���<ri/1.8/system/SOAP/RPC/HTTPServer/add_document_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::HTTPServer#add_document_method
is_singleton: false
name: add_document_method
params: (obj, soapaction, name, req_qnames, res_qnames)
visibility: public
PK�|[ټi���/ri/1.8/system/SOAP/RPC/HTTPServer/status-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::HTTPServer#status
is_singleton: false
name: status
params: ()
visibility: public
PK�|[��F:ri/1.8/system/SOAP/RPC/HTTPServer/add_rpc_operation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::HTTPServer#add_rpc_operation
is_singleton: false
name: add_rpc_operation
params: (receiver, qname, soapaction, name, param_def, opt = {})
visibility: public
PK�|[�����,ri/1.8/system/SOAP/RPC/HTTPServer/run-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::HTTPServer#run
is_singleton: false
name: run
params: ()
visibility: private
PK�|[�R���Bri/1.8/system/SOAP/RPC/HTTPServer/add_request_headerhandler-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::HTTPServer#add_request_headerhandler
is_singleton: false
name: add_request_headerhandler
params: (factory)
visibility: public
PK�|[t):ri/1.8/system/SOAP/RPC/HTTPServer/add_headerhandler-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: add_rpc_headerhandler
block_params: 
comment: 
full_name: SOAP::RPC::HTTPServer#add_headerhandler
is_singleton: false
name: add_headerhandler
params: (obj)
visibility: public
PK�|[6�u  6ri/1.8/system/SOAP/RPC/HTTPServer/add_method_as-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_rpc_method_as"
full_name: SOAP::RPC::HTTPServer#add_method_as
is_singleton: false
name: add_method_as
params: (obj, name, name_as, *param)
visibility: public
PK�|[��zC3ri/1.8/system/SOAP/RPC/HTTPServer/add_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_rpc_method"
full_name: SOAP::RPC::HTTPServer#add_method
is_singleton: false
name: add_method
params: (obj, name, *param)
visibility: public
PK�|[���?ri/1.8/system/SOAP/RPC/HTTPServer/add_document_operation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::HTTPServer#add_document_operation
is_singleton: false
name: add_document_operation
params: (receiver, soapaction, name, param_def, opt = {})
visibility: public
PK�|[��c��7ri/1.8/system/SOAP/RPC/HTTPServer/cdesc-HTTPServer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: default_namespace
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: server
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::RPC::HTTPServer
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_document_method
- !ruby/object:RI::MethodSummary 
  name: add_document_operation
- !ruby/object:RI::MethodSummary 
  name: add_document_request_operation
- !ruby/object:RI::MethodSummary 
  name: add_headerhandler
- !ruby/object:RI::MethodSummary 
  name: add_method
- !ruby/object:RI::MethodSummary 
  name: add_method_as
- !ruby/object:RI::MethodSummary 
  name: add_request_headerhandler
- !ruby/object:RI::MethodSummary 
  name: add_rpc_headerhandler
- !ruby/object:RI::MethodSummary 
  name: add_rpc_method
- !ruby/object:RI::MethodSummary 
  name: add_rpc_method_as
- !ruby/object:RI::MethodSummary 
  name: add_rpc_operation
- !ruby/object:RI::MethodSummary 
  name: add_rpc_request_operation
- !ruby/object:RI::MethodSummary 
  name: add_rpc_request_servant
- !ruby/object:RI::MethodSummary 
  name: add_rpc_servant
- !ruby/object:RI::MethodSummary 
  name: generate_explicit_type
- !ruby/object:RI::MethodSummary 
  name: generate_explicit_type=
- !ruby/object:RI::MethodSummary 
  name: mapping_registry
- !ruby/object:RI::MethodSummary 
  name: mapping_registry=
- !ruby/object:RI::MethodSummary 
  name: on_init
- !ruby/object:RI::MethodSummary 
  name: run
- !ruby/object:RI::MethodSummary 
  name: shutdown
- !ruby/object:RI::MethodSummary 
  name: status
name: HTTPServer
superclass: Logger::Application
PK�|[@#@���3ri/1.8/system/SOAP/RPC/RPCError/cdesc-RPCError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::RPC::RPCError
includes: []

instance_methods: []

name: RPCError
superclass: Error
PK�|[N�ze��Fri/1.8/system/SOAP/RPC/SOAPMethodRequest/create_method_response-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPMethodRequest#create_method_response
is_singleton: false
name: create_method_response
params: (response_name = nil)
visibility: public
PK�|[<z���4ri/1.8/system/SOAP/RPC/SOAPMethodRequest/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (name, @inparam[name])
comment: 
full_name: SOAP::RPC::SOAPMethodRequest#each
is_singleton: false
name: each
params: () {|name, @inparam[name]| ...}
visibility: public
PK�|[��g��3ri/1.8/system/SOAP/RPC/SOAPMethodRequest/dup-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPMethodRequest#dup
is_singleton: false
name: dup
params: ()
visibility: public
PK�|[G�|��3ri/1.8/system/SOAP/RPC/SOAPMethodRequest/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPMethodRequest::new
is_singleton: true
name: new
params: (qname, param_def = nil, soapaction = nil)
visibility: public
PK�|[��}���=ri/1.8/system/SOAP/RPC/SOAPMethodRequest/check_elename-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPMethodRequest#check_elename
is_singleton: false
name: check_elename
params: (qname)
visibility: private
PK�|[��mhXXEri/1.8/system/SOAP/RPC/SOAPMethodRequest/cdesc-SOAPMethodRequest.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: soapaction
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: create_request
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::RPC::SOAPMethodRequest
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: check_elename
- !ruby/object:RI::MethodSummary 
  name: create_method_response
- !ruby/object:RI::MethodSummary 
  name: dup
- !ruby/object:RI::MethodSummary 
  name: each
name: SOAPMethodRequest
superclass: SOAPMethod
PK�|[*7����>ri/1.8/system/SOAP/RPC/SOAPMethodRequest/create_request-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPMethodRequest::create_request
is_singleton: true
name: create_request
params: (qname, *params)
visibility: public
PK�|[=�� ��?ri/1.8/system/SOAP/RPC/CGIStub/generate_explicit_type%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::CGIStub#generate_explicit_type=
is_singleton: false
name: generate_explicit_type=
params: (generate_explicit_type)
visibility: public
PK�|[�R~<��9ri/1.8/system/SOAP/RPC/CGIStub/mapping_registry%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::CGIStub#mapping_registry=
is_singleton: false
name: mapping_registry=
params: (value)
visibility: public
PK�|[\��KKFri/1.8/system/SOAP/RPC/CGIStub/add_rpc_method_with_namespace_as-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: add_method_with_namespace_as
block_params: 
comment: 
full_name: SOAP::RPC::CGIStub#add_rpc_method_with_namespace_as
is_singleton: false
name: add_rpc_method_with_namespace_as
params: (namespace, obj, name, name_as, *param)
visibility: public
PK�|[7���=ri/1.8/system/SOAP/RPC/CGIStub/SOAPStdinRequest/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::CGIStub::SOAPStdinRequest#[]
is_singleton: false
name: "[]"
params: (var)
visibility: public
PK�|[�&���Kri/1.8/system/SOAP/RPC/CGIStub/SOAPStdinRequest/cdesc-SOAPStdinRequest.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: body
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::RPC::CGIStub::SOAPStdinRequest
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: meta_vars
name: SOAPStdinRequest
superclass: SOAPRequest
PK�|[l�d��:ri/1.8/system/SOAP/RPC/CGIStub/SOAPStdinRequest/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::CGIStub::SOAPStdinRequest::new
is_singleton: true
name: new
params: (stream)
visibility: public
PK�|[14����@ri/1.8/system/SOAP/RPC/CGIStub/SOAPStdinRequest/meta_vars-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::CGIStub::SOAPStdinRequest#meta_vars
is_singleton: false
name: meta_vars
params: ()
visibility: public
PK�|[rdT;ri/1.8/system/SOAP/RPC/CGIStub/add_rpc_headerhandler-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_headerhandler"
full_name: SOAP::RPC::CGIStub#add_rpc_headerhandler
is_singleton: false
name: add_rpc_headerhandler
params: (obj)
visibility: public
PK�|[�m#RR5ri/1.8/system/SOAP/RPC/CGIStub/add_rpc_servant-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: add_servant
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: servant entry interface
full_name: SOAP::RPC::CGIStub#add_rpc_servant
is_singleton: false
name: add_rpc_servant
params: (obj, namespace = @default_namespace)
visibility: public
PK�|[ڃ�UUBri/1.8/system/SOAP/RPC/CGIStub/add_method_with_namespace_as-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_rpc_method_with_namespace_as"
full_name: SOAP::RPC::CGIStub#add_method_with_namespace_as
is_singleton: false
name: add_method_with_namespace_as
params: (namespace, obj, name, name_as, *param)
visibility: public
PK�|[G
��-ri/1.8/system/SOAP/RPC/CGIStub/on_init-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::CGIStub#on_init
is_singleton: false
name: on_init
params: ()
visibility: public
PK�|[�#n���6ri/1.8/system/SOAP/RPC/CGIStub/mapping_registry-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::CGIStub#mapping_registry
is_singleton: false
name: mapping_registry
params: ()
visibility: public
PK�|[�rC�7ri/1.8/system/SOAP/RPC/CGIStub/add_rpc_method_as-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: add_method_as
block_params: 
comment: 
full_name: SOAP::RPC::CGIStub#add_rpc_method_as
is_singleton: false
name: add_rpc_method_as
params: (obj, name, name_as, *param)
visibility: public
PK�|[hF���<ri/1.8/system/SOAP/RPC/CGIStub/generate_explicit_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::CGIStub#generate_explicit_type
is_singleton: false
name: generate_explicit_type
params: ()
visibility: public
PK�|[j��<<4ri/1.8/system/SOAP/RPC/CGIStub/add_rpc_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: add_method
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: method entry interface
full_name: SOAP::RPC::CGIStub#add_rpc_method
is_singleton: false
name: add_rpc_method
params: (obj, name, *param)
visibility: public
PK�|[���$��)ri/1.8/system/SOAP/RPC/CGIStub/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::CGIStub::new
is_singleton: true
name: new
params: (appname, default_namespace)
visibility: public
PK�|[1�g�  1ri/1.8/system/SOAP/RPC/CGIStub/add_servant-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_rpc_servant"
full_name: SOAP::RPC::CGIStub#add_servant
is_singleton: false
name: add_servant
params: (obj, namespace = @default_namespace)
visibility: public
PK�|[H��X��1ri/1.8/system/SOAP/RPC/CGIStub/cdesc-CGIStub.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: SYNOPSIS
- !ruby/struct:SM::Flow::VERB 
  body: "  CGIStub.new\n"
- !ruby/struct:SM::Flow::P 
  body: DESCRIPTION
- !ruby/struct:SM::Flow::VERB 
  body: "  To be written...\n"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: HTTPVersion
  value: WEBrick::HTTPVersion.new('1.0')
full_name: SOAP::RPC::CGIStub
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAP
- !ruby/object:RI::IncludedModule 
  name: WEBrick
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_document_operation
- !ruby/object:RI::MethodSummary 
  name: add_headerhandler
- !ruby/object:RI::MethodSummary 
  name: add_method
- !ruby/object:RI::MethodSummary 
  name: add_method_as
- !ruby/object:RI::MethodSummary 
  name: add_method_with_namespace
- !ruby/object:RI::MethodSummary 
  name: add_method_with_namespace_as
- !ruby/object:RI::MethodSummary 
  name: add_rpc_headerhandler
- !ruby/object:RI::MethodSummary 
  name: add_rpc_method
- !ruby/object:RI::MethodSummary 
  name: add_rpc_method_as
- !ruby/object:RI::MethodSummary 
  name: add_rpc_method_with_namespace
- !ruby/object:RI::MethodSummary 
  name: add_rpc_method_with_namespace_as
- !ruby/object:RI::MethodSummary 
  name: add_rpc_operation
- !ruby/object:RI::MethodSummary 
  name: add_rpc_servant
- !ruby/object:RI::MethodSummary 
  name: add_servant
- !ruby/object:RI::MethodSummary 
  name: generate_explicit_type
- !ruby/object:RI::MethodSummary 
  name: generate_explicit_type=
- !ruby/object:RI::MethodSummary 
  name: mapping_registry
- !ruby/object:RI::MethodSummary 
  name: mapping_registry=
- !ruby/object:RI::MethodSummary 
  name: on_init
- !ruby/object:RI::MethodSummary 
  name: run
- !ruby/object:RI::MethodSummary 
  name: set_fcgi_request
name: CGIStub
superclass: Logger::Application
PK�|[��=&CC?ri/1.8/system/SOAP/RPC/CGIStub/add_method_with_namespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_rpc_method_with_namespace"
full_name: SOAP::RPC::CGIStub#add_method_with_namespace
is_singleton: false
name: add_method_with_namespace
params: (namespace, obj, name, *param)
visibility: public
PK�|[M�mt��7ri/1.8/system/SOAP/RPC/CGIStub/add_rpc_operation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::CGIStub#add_rpc_operation
is_singleton: false
name: add_rpc_operation
params: (receiver, qname, soapaction, name, param_def, opt = {})
visibility: public
PK�|[�d����<ri/1.8/system/SOAP/RPC/CGIStub/SOAPFCGIRequest/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::CGIStub::SOAPFCGIRequest#[]
is_singleton: false
name: "[]"
params: (var)
visibility: public
PK�|[tc�;��Iri/1.8/system/SOAP/RPC/CGIStub/SOAPFCGIRequest/cdesc-SOAPFCGIRequest.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: body
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::RPC::CGIStub::SOAPFCGIRequest
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: meta_vars
name: SOAPFCGIRequest
superclass: SOAPRequest
PK�|[9���9ri/1.8/system/SOAP/RPC/CGIStub/SOAPFCGIRequest/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::CGIStub::SOAPFCGIRequest::new
is_singleton: true
name: new
params: (request)
visibility: public
PK�|[GJ��?ri/1.8/system/SOAP/RPC/CGIStub/SOAPFCGIRequest/meta_vars-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::CGIStub::SOAPFCGIRequest#meta_vars
is_singleton: false
name: meta_vars
params: ()
visibility: public
PK�|[[�y��)ri/1.8/system/SOAP/RPC/CGIStub/run-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::CGIStub#run
is_singleton: false
name: run
params: ()
visibility: private
PK�|[�i�l��8ri/1.8/system/SOAP/RPC/CGIStub/SOAPRequest/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::CGIStub::SOAPRequest#[]
is_singleton: false
name: "[]"
params: (var)
visibility: public
PK�|[�`�ssAri/1.8/system/SOAP/RPC/CGIStub/SOAPRequest/cdesc-SOAPRequest.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: body
  rw: R
class_methods: []

comment: 
constants: []

full_name: SOAP::RPC::CGIStub::SOAPRequest
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: meta_vars
name: SOAPRequest
superclass: Object
PK�|[�r���;ri/1.8/system/SOAP/RPC/CGIStub/SOAPRequest/meta_vars-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::CGIStub::SOAPRequest#meta_vars
is_singleton: false
name: meta_vars
params: ()
visibility: public
PK�|[I�R7ri/1.8/system/SOAP/RPC/CGIStub/add_headerhandler-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: add_rpc_headerhandler
block_params: 
comment: 
full_name: SOAP::RPC::CGIStub#add_headerhandler
is_singleton: false
name: add_headerhandler
params: (obj)
visibility: public
PK�|[�>�3ri/1.8/system/SOAP/RPC/CGIStub/add_method_as-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_rpc_method_as"
full_name: SOAP::RPC::CGIStub#add_method_as
is_singleton: false
name: add_method_as
params: (obj, name, name_as, *param)
visibility: public
PK�|[k1�O��6ri/1.8/system/SOAP/RPC/CGIStub/set_fcgi_request-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::CGIStub#set_fcgi_request
is_singleton: false
name: set_fcgi_request
params: (request)
visibility: public
PK�|["gV0ri/1.8/system/SOAP/RPC/CGIStub/add_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_rpc_method"
full_name: SOAP::RPC::CGIStub#add_method
is_singleton: false
name: add_method
params: (obj, name, *param)
visibility: public
PK�|[3�<ri/1.8/system/SOAP/RPC/CGIStub/add_document_operation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::CGIStub#add_document_operation
is_singleton: false
name: add_document_operation
params: (receiver, soapaction, name, param_def, opt = {})
visibility: public
PK�|[p΅�99Cri/1.8/system/SOAP/RPC/CGIStub/add_rpc_method_with_namespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: add_method_with_namespace
block_params: 
comment: 
full_name: SOAP::RPC::CGIStub#add_rpc_method_with_namespace
is_singleton: false
name: add_rpc_method_with_namespace
params: (namespace, obj, name, *param)
visibility: public
PK�|[D�#��Mri/1.8/system/SOAP/RPC/MethodDefinitionError/cdesc-MethodDefinitionError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::RPC::MethodDefinitionError
includes: []

instance_methods: []

name: MethodDefinitionError
superclass: RPCError
PK�|[|�p��0ri/1.8/system/SOAP/RPC/Proxy/endpoint_url-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy#endpoint_url
is_singleton: false
name: endpoint_url
params: ()
visibility: public
PK�|[rN����+ri/1.8/system/SOAP/RPC/Proxy/marshal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy#marshal
is_singleton: false
name: marshal
params: (env, opt)
visibility: private
PK�|[�0���1ri/1.8/system/SOAP/RPC/Proxy/create_header-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy#create_header
is_singleton: false
name: create_header
params: (headers)
visibility: private
PK�|[�^���)ri/1.8/system/SOAP/RPC/Proxy/route-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy#route
is_singleton: false
name: route
params: (req_header, req_body, reqopt, resopt)
visibility: public
PK�|[5�ȶ��9ri/1.8/system/SOAP/RPC/Proxy/create_request_header-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy#create_request_header
is_singleton: false
name: create_request_header
params: ()
visibility: private
PK�|[��Sd��(ri/1.8/system/SOAP/RPC/Proxy/call-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy#call
is_singleton: false
name: call
params: (name, *params)
visibility: public
PK�|[/d�.	.	-ri/1.8/system/SOAP/RPC/Proxy/cdesc-Proxy.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: allow_unqualified_element
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: default_encodingstyle
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: generate_explicit_type
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: headerhandler
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: literal_mapping_registry
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: mandatorycharset
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: mapping_registry
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: operation
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: soapaction
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: streamhandler
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::RPC::Proxy
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAP
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_document_method
- !ruby/object:RI::MethodSummary 
  name: add_document_operation
- !ruby/object:RI::MethodSummary 
  name: add_method
- !ruby/object:RI::MethodSummary 
  name: add_rpc_method
- !ruby/object:RI::MethodSummary 
  name: add_rpc_operation
- !ruby/object:RI::MethodSummary 
  name: call
- !ruby/object:RI::MethodSummary 
  name: check_fault
- !ruby/object:RI::MethodSummary 
  name: create_encoding_opt
- !ruby/object:RI::MethodSummary 
  name: create_header
- !ruby/object:RI::MethodSummary 
  name: create_mapping_opt
- !ruby/object:RI::MethodSummary 
  name: create_request_header
- !ruby/object:RI::MethodSummary 
  name: endpoint_url
- !ruby/object:RI::MethodSummary 
  name: endpoint_url=
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: invoke
- !ruby/object:RI::MethodSummary 
  name: marshal
- !ruby/object:RI::MethodSummary 
  name: receive_headers
- !ruby/object:RI::MethodSummary 
  name: reset_stream
- !ruby/object:RI::MethodSummary 
  name: route
- !ruby/object:RI::MethodSummary 
  name: set_envelopenamespace
- !ruby/object:RI::MethodSummary 
  name: set_wiredump_file_base
- !ruby/object:RI::MethodSummary 
  name: test_loopback_response
- !ruby/object:RI::MethodSummary 
  name: unmarshal
name: Proxy
superclass: Object
PK�|[#���/ri/1.8/system/SOAP/RPC/Proxy/check_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy#check_fault
is_singleton: false
name: check_fault
params: (body)
visibility: public
PK�|[ �/���3ri/1.8/system/SOAP/RPC/Proxy/endpoint_url%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy#endpoint_url=
is_singleton: false
name: endpoint_url=
params: (endpoint_url)
visibility: public
PK�|[º���>ri/1.8/system/SOAP/RPC/Proxy/Operation/response_doc_enc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#response_doc_enc
is_singleton: false
name: response_doc_enc
params: (body, mapping_registry, opt)
visibility: private
PK�|[+߂���=ri/1.8/system/SOAP/RPC/Proxy/Operation/request_doc_enc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#request_doc_enc
is_singleton: false
name: request_doc_enc
params: (values, mapping_registry, opt)
visibility: private
PK�|[4��y��=ri/1.8/system/SOAP/RPC/Proxy/Operation/request_rpc_enc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#request_rpc_enc
is_singleton: false
name: request_rpc_enc
params: (values, mapping_registry, opt)
visibility: private
PK�|[E����:ri/1.8/system/SOAP/RPC/Proxy/Operation/response_obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#response_obj
is_singleton: false
name: response_obj
params: (body, mapping_registry, literal_mapping_registry, opt)
visibility: public
PK�|[��Q��>ri/1.8/system/SOAP/RPC/Proxy/Operation/response_rpc_enc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#response_rpc_enc
is_singleton: false
name: response_rpc_enc
params: (body, mapping_registry, opt)
visibility: private
PK�|[�Y���=ri/1.8/system/SOAP/RPC/Proxy/Operation/request_rpc_lit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#request_rpc_lit
is_singleton: false
name: request_rpc_lit
params: (values, mapping_registry, opt)
visibility: private
PK�|[�%��:ri/1.8/system/SOAP/RPC/Proxy/Operation/response_doc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#response_doc
is_singleton: false
name: response_doc
params: (body, mapping_registry, literal_mapping_registry, opt)
visibility: private
PK�|[���h��7ri/1.8/system/SOAP/RPC/Proxy/Operation/check_use-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#check_use
is_singleton: false
name: check_use
params: (use)
visibility: private
PK�|[������>ri/1.8/system/SOAP/RPC/Proxy/Operation/response_rpc_lit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#response_rpc_lit
is_singleton: false
name: response_rpc_lit
params: (body, mapping_registry, opt)
visibility: private
PK�|[[y���:ri/1.8/system/SOAP/RPC/Proxy/Operation/response_rpc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#response_rpc
is_singleton: false
name: response_rpc
params: (body, mapping_registry, literal_mapping_registry, opt)
visibility: private
PK�|[��F���1ri/1.8/system/SOAP/RPC/Proxy/Operation/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation::new
is_singleton: true
name: new
params: (soapaction, param_def, opt)
visibility: public
PK�|[�4?��:ri/1.8/system/SOAP/RPC/Proxy/Operation/request_body-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#request_body
is_singleton: false
name: request_body
params: (values, mapping_registry, literal_mapping_registry, opt)
visibility: public
PK�|[�{��9ri/1.8/system/SOAP/RPC/Proxy/Operation/request_doc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#request_doc
is_singleton: false
name: request_doc
params: (values, mapping_registry, literal_mapping_registry, opt)
visibility: private
PK�|[s�.��Kri/1.8/system/SOAP/RPC/Proxy/Operation/request_default_encodingstyle-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#request_default_encodingstyle
is_singleton: false
name: request_default_encodingstyle
params: ()
visibility: public
PK�|[nUd��9ri/1.8/system/SOAP/RPC/Proxy/Operation/request_rpc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#request_rpc
is_singleton: false
name: request_rpc
params: (values, mapping_registry, literal_mapping_registry, opt)
visibility: private
PK�|[�@4��9ri/1.8/system/SOAP/RPC/Proxy/Operation/check_style-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#check_style
is_singleton: false
name: check_style
params: (style)
visibility: private
PK�|[���(��>ri/1.8/system/SOAP/RPC/Proxy/Operation/response_doc_lit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#response_doc_lit
is_singleton: false
name: response_doc_lit
params: (body, mapping_registry, opt)
visibility: private
PK�|[��5�;ri/1.8/system/SOAP/RPC/Proxy/Operation/cdesc-Operation.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: attributeformdefault
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: elementformdefault
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: request_style
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: request_use
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: response_style
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: response_use
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: soapaction
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::RPC::Proxy::Operation
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: check_style
- !ruby/object:RI::MethodSummary 
  name: check_use
- !ruby/object:RI::MethodSummary 
  name: create_request_obj
- !ruby/object:RI::MethodSummary 
  name: raise_fault
- !ruby/object:RI::MethodSummary 
  name: request_body
- !ruby/object:RI::MethodSummary 
  name: request_default_encodingstyle
- !ruby/object:RI::MethodSummary 
  name: request_doc
- !ruby/object:RI::MethodSummary 
  name: request_doc_enc
- !ruby/object:RI::MethodSummary 
  name: request_doc_lit
- !ruby/object:RI::MethodSummary 
  name: request_rpc
- !ruby/object:RI::MethodSummary 
  name: request_rpc_enc
- !ruby/object:RI::MethodSummary 
  name: request_rpc_lit
- !ruby/object:RI::MethodSummary 
  name: response_default_encodingstyle
- !ruby/object:RI::MethodSummary 
  name: response_doc
- !ruby/object:RI::MethodSummary 
  name: response_doc_enc
- !ruby/object:RI::MethodSummary 
  name: response_doc_lit
- !ruby/object:RI::MethodSummary 
  name: response_obj
- !ruby/object:RI::MethodSummary 
  name: response_rpc
- !ruby/object:RI::MethodSummary 
  name: response_rpc_enc
- !ruby/object:RI::MethodSummary 
  name: response_rpc_lit
name: Operation
superclass: Object
PK�|[����9ri/1.8/system/SOAP/RPC/Proxy/Operation/raise_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#raise_fault
is_singleton: false
name: raise_fault
params: (e, mapping_registry, literal_mapping_registry)
visibility: public
PK�|[��;=��@ri/1.8/system/SOAP/RPC/Proxy/Operation/create_request_obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#create_request_obj
is_singleton: false
name: create_request_obj
params: (names, params)
visibility: private
PK�|[}ּ���Lri/1.8/system/SOAP/RPC/Proxy/Operation/response_default_encodingstyle-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#response_default_encodingstyle
is_singleton: false
name: response_default_encodingstyle
params: ()
visibility: public
PK�|[�'w��=ri/1.8/system/SOAP/RPC/Proxy/Operation/request_doc_lit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::Operation#request_doc_lit
is_singleton: false
name: request_doc_lit
params: (values, mapping_registry, opt)
visibility: private
PK�|[�Y�s��7ri/1.8/system/SOAP/RPC/Proxy/create_encoding_opt-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy#create_encoding_opt
is_singleton: false
name: create_encoding_opt
params: (hash = nil)
visibility: private
PK�|[,a�w//2ri/1.8/system/SOAP/RPC/Proxy/add_rpc_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_rpc_operation"
full_name: SOAP::RPC::Proxy#add_rpc_method
is_singleton: false
name: add_rpc_method
params: (qname, soapaction, name, param_def, opt = {})
visibility: public
PK�|[�Á��+ri/1.8/system/SOAP/RPC/Proxy/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[K�ʹ��'ri/1.8/system/SOAP/RPC/Proxy/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy::new
is_singleton: true
name: new
params: (endpoint_url, soapaction, options)
visibility: public
PK�|[����777ri/1.8/system/SOAP/RPC/Proxy/add_document_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_document_operation"
full_name: SOAP::RPC::Proxy#add_document_method
is_singleton: false
name: add_document_method
params: (soapaction, name, param_def, opt = {})
visibility: public
PK�|[��.���6ri/1.8/system/SOAP/RPC/Proxy/create_mapping_opt-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy#create_mapping_opt
is_singleton: false
name: create_mapping_opt
params: (hash = nil)
visibility: private
PK�|[FH���:ri/1.8/system/SOAP/RPC/Proxy/test_loopback_response-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy#test_loopback_response
is_singleton: false
name: test_loopback_response
params: ()
visibility: public
PK�|[
�/4UU5ri/1.8/system/SOAP/RPC/Proxy/add_rpc_operation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: add_method
- !ruby/object:RI::AliasName 
  name: add_rpc_method
block_params: 
comment: 
full_name: SOAP::RPC::Proxy#add_rpc_operation
is_singleton: false
name: add_rpc_operation
params: (qname, soapaction, name, param_def, opt = {})
visibility: public
PK�|[^sr��3ri/1.8/system/SOAP/RPC/Proxy/receive_headers-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy#receive_headers
is_singleton: false
name: receive_headers
params: (headers)
visibility: private
PK�|[�uKg��:ri/1.8/system/SOAP/RPC/Proxy/set_wiredump_file_base-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy#set_wiredump_file_base
is_singleton: false
name: set_wiredump_file_base
params: (wiredump_file_base)
visibility: public
PK�|[1]�
��-ri/1.8/system/SOAP/RPC/Proxy/unmarshal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy#unmarshal
is_singleton: false
name: unmarshal
params: (conn_data, opt)
visibility: private
PK�|[㈗��*ri/1.8/system/SOAP/RPC/Proxy/invoke-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy#invoke
is_singleton: false
name: invoke
params: (req_header, req_body, opt = nil)
visibility: public
PK�|[|�6''.ri/1.8/system/SOAP/RPC/Proxy/add_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_rpc_operation"
full_name: SOAP::RPC::Proxy#add_method
is_singleton: false
name: add_method
params: (qname, soapaction, name, param_def, opt = {})
visibility: public
PK�|[3�,,:ri/1.8/system/SOAP/RPC/Proxy/add_document_operation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: add_document_method
block_params: 
comment: 
full_name: SOAP::RPC::Proxy#add_document_operation
is_singleton: false
name: add_document_operation
params: (soapaction, name, param_def, opt = {})
visibility: public
PK�|[�lԼ�0ri/1.8/system/SOAP/RPC/Proxy/reset_stream-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy#reset_stream
is_singleton: false
name: reset_stream
params: ()
visibility: public
PK�|[���n��9ri/1.8/system/SOAP/RPC/Proxy/set_envelopenamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Proxy#set_envelopenamespace
is_singleton: false
name: set_envelopenamespace
params: (env, namespace)
visibility: private
PK�|[����2ri/1.8/system/SOAP/RPC/StandaloneServer/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::StandaloneServer::new
is_singleton: true
name: new
params: (appname, default_namespace, host = "0.0.0.0", port = 8080)
visibility: public
PK�|[�Dg�<<Cri/1.8/system/SOAP/RPC/StandaloneServer/cdesc-StandaloneServer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::RPC::StandaloneServer
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: create_config
name: StandaloneServer
superclass: HTTPServer
PK�|[���L��<ri/1.8/system/SOAP/RPC/StandaloneServer/create_config-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::StandaloneServer#create_config
is_singleton: false
name: create_config
params: ()
visibility: private
PK�|[+��K��5ri/1.8/system/SOAP/RPC/SOAPMethodResponse/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (@retval_name, @retval)
comment: 
full_name: SOAP::RPC::SOAPMethodResponse#each
is_singleton: false
name: each
params: () {|@retval_name, @retval| ...}
visibility: public
PK�|[�
��4ri/1.8/system/SOAP/RPC/SOAPMethodResponse/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPMethodResponse::new
is_singleton: true
name: new
params: (qname, param_def = nil)
visibility: public
PK�|[�[�viiGri/1.8/system/SOAP/RPC/SOAPMethodResponse/cdesc-SOAPMethodResponse.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::RPC::SOAPMethodResponse
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: retval=
name: SOAPMethodResponse
superclass: SOAPMethod
PK�|[�����:ri/1.8/system/SOAP/RPC/SOAPMethodResponse/retval%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPMethodResponse#retval=
is_singleton: false
name: retval=
params: (retval)
visibility: public
PK�|[lT����?ri/1.8/system/SOAP/RPC/ParameterError/cdesc-ParameterError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::RPC::ParameterError
includes: []

instance_methods: []

name: ParameterError
superclass: RPCError
PK�|[ޘ����,ri/1.8/system/SOAP/RPC/Router/marshal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router#marshal
is_singleton: false
name: marshal
params: (conn_data, env, default_encodingstyle = nil)
visibility: private
PK�|[B[O��*ri/1.8/system/SOAP/RPC/Router/route-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router#route
is_singleton: false
name: route
params: (conn_data)
visibility: public
PK�|[zf�4ri/1.8/system/SOAP/RPC/Router/add_rpc_servant-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: add_servant
block_params: 
comment: 
full_name: SOAP::RPC::Router#add_rpc_servant
is_singleton: false
name: add_rpc_servant
params: (obj, namespace)
visibility: public
PK�|[ہ����5ri/1.8/system/SOAP/RPC/Router/lookup_operation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router#lookup_operation
is_singleton: false
name: lookup_operation
params: (soapaction, body)
visibility: private
PK�|[��Y&&<ri/1.8/system/SOAP/RPC/Router/add_rpc_request_servant-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: servant definition interface
full_name: SOAP::RPC::Router#add_rpc_request_servant
is_singleton: false
name: add_rpc_request_servant
params: (factory, namespace)
visibility: public
PK�|[o i��7ri/1.8/system/SOAP/RPC/Router/Operation/receiver-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::Operation#receiver
is_singleton: false
name: receiver
params: ()
visibility: private
PK�|[W\	��?ri/1.8/system/SOAP/RPC/Router/Operation/response_doc_enc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::Operation#response_doc_enc
is_singleton: false
name: response_doc_enc
params: (result, mapping_registry, opt)
visibility: private
PK�|[�3��>ri/1.8/system/SOAP/RPC/Router/Operation/request_doc_enc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::Operation#request_doc_enc
is_singleton: false
name: request_doc_enc
params: (body, mapping_registry, opt)
visibility: private
PK�|[����3ri/1.8/system/SOAP/RPC/Router/Operation/call-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::Operation#call
is_singleton: false
name: call
params: (body, mapping_registry, literal_mapping_registry, opt)
visibility: public
PK�|[JHb���>ri/1.8/system/SOAP/RPC/Router/Operation/request_rpc_enc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::Operation#request_rpc_enc
is_singleton: false
name: request_rpc_enc
params: (request, mapping_registry, opt)
visibility: private
PK�|[8n0���?ri/1.8/system/SOAP/RPC/Router/Operation/response_rpc_enc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::Operation#response_rpc_enc
is_singleton: false
name: response_rpc_enc
params: (result, mapping_registry, opt)
visibility: private
PK�|[�-���>ri/1.8/system/SOAP/RPC/Router/Operation/request_rpc_lit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::Operation#request_rpc_lit
is_singleton: false
name: request_rpc_lit
params: (request, mapping_registry, opt)
visibility: private
PK�|[���?ri/1.8/system/SOAP/RPC/Router/Operation/request_document-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::Operation#request_document
is_singleton: false
name: request_document
params: (body, mapping_registry, literal_mapping_registry, opt)
visibility: private
PK�|[�%fR;ri/1.8/system/SOAP/RPC/Router/Operation/response_doc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::Operation#response_doc
is_singleton: false
name: response_doc
params: (result, mapping_registry, literal_mapping_registry, opt)
visibility: private
PK�|[�W���8ri/1.8/system/SOAP/RPC/Router/Operation/check_use-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::Operation#check_use
is_singleton: false
name: check_use
params: (use)
visibility: private
PK�|[�����?ri/1.8/system/SOAP/RPC/Router/Operation/response_rpc_lit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::Operation#response_rpc_lit
is_singleton: false
name: response_rpc_lit
params: (result, mapping_registry, opt)
visibility: private
PK�|[�Ƌ^;ri/1.8/system/SOAP/RPC/Router/Operation/response_rpc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::Operation#response_rpc
is_singleton: false
name: response_rpc
params: (result, mapping_registry, literal_mapping_registry, opt)
visibility: private
PK�|[��_��2ri/1.8/system/SOAP/RPC/Router/Operation/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::Operation::new
is_singleton: true
name: new
params: (soapaction, name, param_def, opt)
visibility: public
PK�|[��i{��Lri/1.8/system/SOAP/RPC/Router/Operation/request_default_encodingstyle-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::Operation#request_default_encodingstyle
is_singleton: false
name: request_default_encodingstyle
params: ()
visibility: public
PK�|[&�R��:ri/1.8/system/SOAP/RPC/Router/Operation/request_rpc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::Operation#request_rpc
is_singleton: false
name: request_rpc
params: (body, mapping_registry, literal_mapping_registry, opt)
visibility: private
PK�|[흦��:ri/1.8/system/SOAP/RPC/Router/Operation/check_style-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::Operation#check_style
is_singleton: false
name: check_style
params: (style)
visibility: private
PK�|[�ت,��?ri/1.8/system/SOAP/RPC/Router/Operation/response_doc_lit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::Operation#response_doc_lit
is_singleton: false
name: response_doc_lit
params: (result, mapping_registry, opt)
visibility: private
PK�|[@i�ө�<ri/1.8/system/SOAP/RPC/Router/Operation/cdesc-Operation.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: request_style
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: request_use
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: response_style
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: response_use
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: soapaction
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::RPC::Router::Operation
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: call
- !ruby/object:RI::MethodSummary 
  name: check_style
- !ruby/object:RI::MethodSummary 
  name: check_use
- !ruby/object:RI::MethodSummary 
  name: receiver
- !ruby/object:RI::MethodSummary 
  name: request_default_encodingstyle
- !ruby/object:RI::MethodSummary 
  name: request_doc_enc
- !ruby/object:RI::MethodSummary 
  name: request_doc_lit
- !ruby/object:RI::MethodSummary 
  name: request_document
- !ruby/object:RI::MethodSummary 
  name: request_rpc
- !ruby/object:RI::MethodSummary 
  name: request_rpc_enc
- !ruby/object:RI::MethodSummary 
  name: request_rpc_lit
- !ruby/object:RI::MethodSummary 
  name: response_default_encodingstyle
- !ruby/object:RI::MethodSummary 
  name: response_doc
- !ruby/object:RI::MethodSummary 
  name: response_doc_enc
- !ruby/object:RI::MethodSummary 
  name: response_doc_lit
- !ruby/object:RI::MethodSummary 
  name: response_rpc
- !ruby/object:RI::MethodSummary 
  name: response_rpc_enc
- !ruby/object:RI::MethodSummary 
  name: response_rpc_lit
name: Operation
superclass: Object
PK�|[�s���Mri/1.8/system/SOAP/RPC/Router/Operation/response_default_encodingstyle-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::Operation#response_default_encodingstyle
is_singleton: false
name: response_default_encodingstyle
params: ()
visibility: public
PK�|[�A|���>ri/1.8/system/SOAP/RPC/Router/Operation/request_doc_lit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::Operation#request_doc_lit
is_singleton: false
name: request_doc_lit
params: (body, mapping_registry, opt)
visibility: private
PK�|[K����,ri/1.8/system/SOAP/RPC/Router/mimeize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router#mimeize
is_singleton: false
name: mimeize
params: (conn_data, ext)
visibility: private
PK�|[*^R*>ri/1.8/system/SOAP/RPC/Router/add_rpc_request_operation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router#add_rpc_request_operation
is_singleton: false
name: add_rpc_request_operation
params: (factory, qname, soapaction, name, param_def, opt = {})
visibility: public
PK�|[A��::3ri/1.8/system/SOAP/RPC/Router/add_rpc_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_rpc_operation"
full_name: SOAP::RPC::Router#add_rpc_method
is_singleton: false
name: add_rpc_method
params: (receiver, qname, soapaction, name, param_def, opt = {})
visibility: public
PK�|[��*��Cri/1.8/system/SOAP/RPC/Router/RequestScopeOperation/receiver-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::RequestScopeOperation#receiver
is_singleton: false
name: receiver
params: ()
visibility: private
PK�|[/'����>ri/1.8/system/SOAP/RPC/Router/RequestScopeOperation/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::RequestScopeOperation::new
is_singleton: true
name: new
params: (soapaction, receiver_factory, name, param_def, opt)
visibility: public
PK�|[���HHTri/1.8/system/SOAP/RPC/Router/RequestScopeOperation/cdesc-RequestScopeOperation.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::RPC::Router::RequestScopeOperation
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: receiver
name: RequestScopeOperation
superclass: Operation
PK�|[w0��5ri/1.8/system/SOAP/RPC/Router/assign_operation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router#assign_operation
is_singleton: false
name: assign_operation
params: (soapaction, qname, op)
visibility: private
PK�|[!V%���;ri/1.8/system/SOAP/RPC/Router/first_input_part_qname-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router#first_input_part_qname
is_singleton: false
name: first_input_part_qname
params: (param_def)
visibility: private
PK�|[z�	7��(ri/1.8/system/SOAP/RPC/Router/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::new
is_singleton: true
name: new
params: (actor)
visibility: public
PK�|[I-�Cri/1.8/system/SOAP/RPC/Router/add_document_request_operation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router#add_document_request_operation
is_singleton: false
name: add_document_request_operation
params: (factory, soapaction, name, param_def, opt = {})
visibility: public
PK�|[��t�BB8ri/1.8/system/SOAP/RPC/Router/add_document_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_document_operation"
full_name: SOAP::RPC::Router#add_document_method
is_singleton: false
name: add_document_method
params: (receiver, soapaction, name, param_def, opt = {})
visibility: public
PK�|[�ձ�

0ri/1.8/system/SOAP/RPC/Router/add_servant-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_rpc_servant"
full_name: SOAP::RPC::Router#add_servant
is_singleton: false
name: add_servant
params: (obj, namespace)
visibility: public
PK�|[؏94��1ri/1.8/system/SOAP/RPC/Router/call_headers-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router#call_headers
is_singleton: false
name: call_headers
params: (headerhandler)
visibility: private
PK�|[����7ri/1.8/system/SOAP/RPC/Router/create_mapping_opt-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router#create_mapping_opt
is_singleton: false
name: create_mapping_opt
params: ()
visibility: private
PK�|[��أ�6ri/1.8/system/SOAP/RPC/Router/add_rpc_operation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: add_method
- !ruby/object:RI::AliasName 
  name: add_rpc_method
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: operation definition interface
full_name: SOAP::RPC::Router#add_rpc_operation
is_singleton: false
name: add_rpc_operation
params: (receiver, qname, soapaction, name, param_def, opt = {})
visibility: public
PK�|[��A���;ri/1.8/system/SOAP/RPC/Router/create_styleuse_option-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router#create_styleuse_option
is_singleton: false
name: create_styleuse_option
params: (style, use)
visibility: private
PK�|[ӓc���;ri/1.8/system/SOAP/RPC/Router/ensure_styleuse_option-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router#ensure_styleuse_option
is_singleton: false
name: ensure_styleuse_option
params: (opt, style, use)
visibility: private
PK�|[Qn����4ri/1.8/system/SOAP/RPC/Router/receive_headers-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router#receive_headers
is_singleton: false
name: receive_headers
params: (headerhandler, headers)
visibility: private
PK�|[��ڻ��*ri/1.8/system/SOAP/RPC/Router/fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create fault response.
full_name: SOAP::RPC::Router#fault
is_singleton: false
name: fault
params: (e)
visibility: private
PK�|[�b����Gri/1.8/system/SOAP/RPC/Router/ApplicationScopeOperation/receiver-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::ApplicationScopeOperation#receiver
is_singleton: false
name: receiver
params: ()
visibility: private
PK�|[<N�MPP\ri/1.8/system/SOAP/RPC/Router/ApplicationScopeOperation/cdesc-ApplicationScopeOperation.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::RPC::Router::ApplicationScopeOperation
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: receiver
name: ApplicationScopeOperation
superclass: Operation
PK�|[��Bri/1.8/system/SOAP/RPC/Router/ApplicationScopeOperation/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router::ApplicationScopeOperation::new
is_singleton: true
name: new
params: (soapaction, receiver, name, param_def, opt)
visibility: public
PK�|[�j����.ri/1.8/system/SOAP/RPC/Router/unmarshal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router#unmarshal
is_singleton: false
name: unmarshal
params: (conn_data)
visibility: private
PK�|[�ZiA>ri/1.8/system/SOAP/RPC/Router/add_request_headerhandler-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: header handler interface
full_name: SOAP::RPC::Router#add_request_headerhandler
is_singleton: false
name: add_request_headerhandler
params: (factory)
visibility: public
PK�|[��e���6ri/1.8/system/SOAP/RPC/Router/add_headerhandler-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::Router#add_headerhandler
is_singleton: false
name: add_headerhandler
params: (handler)
visibility: public
PK�|[�${ޗ�/ri/1.8/system/SOAP/RPC/Router/cdesc-Router.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: actor
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: external_ces
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: generate_explicit_type
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: literal_mapping_registry
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: mapping_registry
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::RPC::Router
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAP
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_document_method
- !ruby/object:RI::MethodSummary 
  name: add_document_operation
- !ruby/object:RI::MethodSummary 
  name: add_document_request_operation
- !ruby/object:RI::MethodSummary 
  name: add_headerhandler
- !ruby/object:RI::MethodSummary 
  name: add_method
- !ruby/object:RI::MethodSummary 
  name: add_request_headerhandler
- !ruby/object:RI::MethodSummary 
  name: add_rpc_method
- !ruby/object:RI::MethodSummary 
  name: add_rpc_operation
- !ruby/object:RI::MethodSummary 
  name: add_rpc_request_operation
- !ruby/object:RI::MethodSummary 
  name: add_rpc_request_servant
- !ruby/object:RI::MethodSummary 
  name: add_rpc_servant
- !ruby/object:RI::MethodSummary 
  name: add_servant
- !ruby/object:RI::MethodSummary 
  name: assign_operation
- !ruby/object:RI::MethodSummary 
  name: call_headers
- !ruby/object:RI::MethodSummary 
  name: create_fault_response
- !ruby/object:RI::MethodSummary 
  name: create_mapping_opt
- !ruby/object:RI::MethodSummary 
  name: create_styleuse_option
- !ruby/object:RI::MethodSummary 
  name: ensure_styleuse_option
- !ruby/object:RI::MethodSummary 
  name: fault
- !ruby/object:RI::MethodSummary 
  name: first_input_part_qname
- !ruby/object:RI::MethodSummary 
  name: lookup_operation
- !ruby/object:RI::MethodSummary 
  name: marshal
- !ruby/object:RI::MethodSummary 
  name: mimeize
- !ruby/object:RI::MethodSummary 
  name: receive_headers
- !ruby/object:RI::MethodSummary 
  name: route
- !ruby/object:RI::MethodSummary 
  name: unmarshal
name: Router
superclass: Object
PK�|[l�22/ri/1.8/system/SOAP/RPC/Router/add_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add_rpc_operation"
full_name: SOAP::RPC::Router#add_method
is_singleton: false
name: add_method
params: (receiver, qname, soapaction, name, param_def, opt = {})
visibility: public
PK�|[Y���:ri/1.8/system/SOAP/RPC/Router/create_fault_response-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create fault response string.
full_name: SOAP::RPC::Router#create_fault_response
is_singleton: false
name: create_fault_response
params: (e)
visibility: public
PK�|[5�J77;ri/1.8/system/SOAP/RPC/Router/add_document_operation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: add_document_method
block_params: 
comment: 
full_name: SOAP::RPC::Router#add_document_operation
is_singleton: false
name: add_document_operation
params: (receiver, soapaction, name, param_def, opt = {})
visibility: public
PK�|[��?��*ri/1.8/system/SOAP/RPC/SOAPVoid/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::RPC::SOAPVoid::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[��Y[[3ri/1.8/system/SOAP/RPC/SOAPVoid/cdesc-SOAPVoid.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: To return(?) void explicitly.
- !ruby/struct:SM::Flow::VERB 
  body: " def foo(input_var)\n   ...\n   return SOAP::RPC::SOAPVoid.new\n end\n"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Name
  value: XSD::QName.new(Mapping::RubyCustomTypeNamespace, nil)
full_name: SOAP::RPC::SOAPVoid
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPVoid
superclass: XSD::XSDAnySimpleType
PK�|[VC^

7ri/1.8/system/SOAP/SOAPDateTime/cdesc-SOAPDateTime.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPDateTime
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPDateTime
superclass: XSD::XSDDateTime
PK�|[�1�

9ri/1.8/system/SOAP/SOAPHexBinary/cdesc-SOAPHexBinary.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPHexBinary
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPHexBinary
superclass: XSD::XSDHexBinary
PK�|[�Z�R��*ri/1.8/system/SOAP/SOAPBasetype/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPBasetype::new
is_singleton: true
name: new
params: (*arg)
visibility: public
PK�|[��&o��7ri/1.8/system/SOAP/SOAPBasetype/cdesc-SOAPBasetype.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: for SOAP base type
constants: []

full_name: SOAP::SOAPBasetype
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPType
- !ruby/object:RI::IncludedModule 
  name: SOAP
instance_methods: []

name: SOAPBasetype
superclass: 
PK�|[�55���#ri/1.8/system/SOAP/reset_all-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP#reset_all
is_singleton: false
name: reset_all
params: ()
visibility: public
PK�|[����1ri/1.8/system/SOAP/WSDLDriver/__attr_proxy-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::__attr_proxy
is_singleton: true
name: __attr_proxy
params: (symbol, assignable = false)
visibility: public
PK�|[�_f��3ri/1.8/system/SOAP/WSDLDriver/cdesc-WSDLDriver.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: __attr_proxy
- !ruby/object:RI::MethodSummary 
  name: __attr_proxy
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::WSDLDriver
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: httpproxy
- !ruby/object:RI::MethodSummary 
  name: httpproxy=
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: mandatorycharset
- !ruby/object:RI::MethodSummary 
  name: mandatorycharset=
- !ruby/object:RI::MethodSummary 
  name: reset_stream
- !ruby/object:RI::MethodSummary 
  name: wiredump_dev
- !ruby/object:RI::MethodSummary 
  name: wiredump_dev=
- !ruby/object:RI::MethodSummary 
  name: wiredump_file_base
- !ruby/object:RI::MethodSummary 
  name: wiredump_file_base=
name: WSDLDriver
superclass: Object
PK�|[G����<ri/1.8/system/SOAP/WSDLDriver/Servant__/headerhandler-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#headerhandler
is_singleton: false
name: headerhandler
params: ()
visibility: public
PK�|[i1\���;ri/1.8/system/SOAP/WSDLDriver/Servant__/endpoint_url-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#endpoint_url
is_singleton: false
name: endpoint_url
params: ()
visibility: public
PK�|[�;����<ri/1.8/system/SOAP/WSDLDriver/Servant__/setup_options-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#setup_options
is_singleton: false
name: setup_options
params: ()
visibility: private
PK�|[@�p��Bri/1.8/system/SOAP/WSDLDriver/Servant__/create_request_body-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#create_request_body
is_singleton: false
name: create_request_body
params: (op_info, *values)
visibility: private
PK�|[�!6��@ri/1.8/system/SOAP/WSDLDriver/Servant__/bodyitem_from_obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#bodyitem_from_obj
is_singleton: false
name: bodyitem_from_obj
params: (obj, name)
visibility: private
PK�|[���3��<ri/1.8/system/SOAP/WSDLDriver/Servant__/streamhandler-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#streamhandler
is_singleton: false
name: streamhandler
params: ()
visibility: public
PK�|[s�	���Dri/1.8/system/SOAP/WSDLDriver/Servant__/create_request_header-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#create_request_header
is_singleton: false
name: create_request_header
params: ()
visibility: private
PK�|[�fY��Lri/1.8/system/SOAP/WSDLDriver/Servant__/add_document_method_interface-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#add_document_method_interface
is_singleton: false
name: add_document_method_interface
params: (name, parts_names)
visibility: private
PK�|[`ZP���=ri/1.8/system/SOAP/WSDLDriver/Servant__/create_options-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#create_options
is_singleton: false
name: create_options
params: (hash = nil)
visibility: private
PK�|[mm����>ri/1.8/system/SOAP/WSDLDriver/Servant__/endpoint_url%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#endpoint_url=
is_singleton: false
name: endpoint_url=
params: (endpoint_url)
visibility: public
PK�|[$ې��7ri/1.8/system/SOAP/WSDLDriver/Servant__/rpc_call-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#rpc_call
is_singleton: false
name: rpc_call
params: (name, *values)
visibility: public
PK�|[m���{{<ri/1.8/system/SOAP/WSDLDriver/Servant__/document_send-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "req_header: [[element, mustunderstand, encodingstyle(QName/String)], ...] req_body: SOAPBasetype/SOAPCompoundtype"
full_name: SOAP::WSDLDriver::Servant__#document_send
is_singleton: false
name: document_send
params: (name, header_obj, body_obj)
visibility: public
PK�|[Jn*��@ri/1.8/system/SOAP/WSDLDriver/Servant__/create_method_obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#create_method_obj
is_singleton: false
name: create_method_obj
params: (names, params)
visibility: private
PK�|[zՃ��Cri/1.8/system/SOAP/WSDLDriver/Servant__/add_method_interface-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#add_method_interface
is_singleton: false
name: add_method_interface
params: (op_info)
visibility: private
PK�|[T�		<ri/1.8/system/SOAP/WSDLDriver/Servant__/cdesc-Servant__.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: allow_unqualified_element
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: default_encodingstyle
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: generate_explicit_type
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: mapping_registry
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: options
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: port
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: soapaction
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: wsdl_mapping_registry
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::WSDLDriver::Servant__
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAP
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_document_method_interface
- !ruby/object:RI::MethodSummary 
  name: add_method_interface
- !ruby/object:RI::MethodSummary 
  name: add_rpc_method_interface
- !ruby/object:RI::MethodSummary 
  name: body_from_obj
- !ruby/object:RI::MethodSummary 
  name: bodyitem_from_obj
- !ruby/object:RI::MethodSummary 
  name: create_method_obj
- !ruby/object:RI::MethodSummary 
  name: create_method_struct
- !ruby/object:RI::MethodSummary 
  name: create_options
- !ruby/object:RI::MethodSummary 
  name: create_request_body
- !ruby/object:RI::MethodSummary 
  name: create_request_header
- !ruby/object:RI::MethodSummary 
  name: document_send
- !ruby/object:RI::MethodSummary 
  name: endpoint_url
- !ruby/object:RI::MethodSummary 
  name: endpoint_url=
- !ruby/object:RI::MethodSummary 
  name: header_from_obj
- !ruby/object:RI::MethodSummary 
  name: headerhandler
- !ruby/object:RI::MethodSummary 
  name: headeritem_from_obj
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: receive_headers
- !ruby/object:RI::MethodSummary 
  name: reset_stream
- !ruby/object:RI::MethodSummary 
  name: rpc_call
- !ruby/object:RI::MethodSummary 
  name: set_wiredump_file_base
- !ruby/object:RI::MethodSummary 
  name: setup_options
- !ruby/object:RI::MethodSummary 
  name: streamhandler
- !ruby/object:RI::MethodSummary 
  name: test_loopback_response
name: Servant__
superclass: Object
PK�|[�V븽�6ri/1.8/system/SOAP/WSDLDriver/Servant__/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[�*v���<ri/1.8/system/SOAP/WSDLDriver/Servant__/body_from_obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#body_from_obj
is_singleton: false
name: body_from_obj
params: (obj, op_info)
visibility: private
PK�|[��PG��2ri/1.8/system/SOAP/WSDLDriver/Servant__/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__::new
is_singleton: true
name: new
params: (host, wsdl, port, logdev)
visibility: public
PK�|[��8���Cri/1.8/system/SOAP/WSDLDriver/Servant__/create_method_struct-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#create_method_struct
is_singleton: false
name: create_method_struct
params: (op_info, *params)
visibility: private
PK�|[%y�9��Gri/1.8/system/SOAP/WSDLDriver/Servant__/add_rpc_method_interface-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#add_rpc_method_interface
is_singleton: false
name: add_rpc_method_interface
params: (name, parts_names)
visibility: private
PK�|[j�fu��Bri/1.8/system/SOAP/WSDLDriver/Servant__/headeritem_from_obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#headeritem_from_obj
is_singleton: false
name: headeritem_from_obj
params: (obj, name)
visibility: private
PK�|[�9�t��Eri/1.8/system/SOAP/WSDLDriver/Servant__/test_loopback_response-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#test_loopback_response
is_singleton: false
name: test_loopback_response
params: ()
visibility: public
PK�|[��M��>ri/1.8/system/SOAP/WSDLDriver/Servant__/receive_headers-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#receive_headers
is_singleton: false
name: receive_headers
params: (headers)
visibility: private
PK�|[�[J
��>ri/1.8/system/SOAP/WSDLDriver/Servant__/header_from_obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#header_from_obj
is_singleton: false
name: header_from_obj
params: (obj, op_info)
visibility: private
PK�|[Q{�$��Eri/1.8/system/SOAP/WSDLDriver/Servant__/set_wiredump_file_base-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#set_wiredump_file_base
is_singleton: false
name: set_wiredump_file_base
params: (name)
visibility: private
PK�|[��@y��;ri/1.8/system/SOAP/WSDLDriver/Servant__/reset_stream-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::Servant__#reset_stream
is_singleton: false
name: reset_stream
params: ()
visibility: public
PK�|[|����.ri/1.8/system/SOAP/WSDLDriver/httpproxy-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver#httpproxy
is_singleton: false
name: httpproxy
params: ()
visibility: public
PK�|[��=J��,ri/1.8/system/SOAP/WSDLDriver/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[n�f��(ri/1.8/system/SOAP/WSDLDriver/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver::new
is_singleton: true
name: new
params: (wsdl, port, logdev)
visibility: public
PK�|[�GWq��5ri/1.8/system/SOAP/WSDLDriver/mandatorycharset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver#mandatorycharset
is_singleton: false
name: mandatorycharset
params: ()
visibility: public
PK�|[?ͽ��1ri/1.8/system/SOAP/WSDLDriver/wiredump_dev-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver#wiredump_dev
is_singleton: false
name: wiredump_dev
params: ()
visibility: public
PK�|[)W���1ri/1.8/system/SOAP/WSDLDriver/httpproxy%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver#httpproxy=
is_singleton: false
name: httpproxy=
params: (httpproxy)
visibility: public
PK�|[z��7ri/1.8/system/SOAP/WSDLDriver/wiredump_file_base-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver#wiredump_file_base
is_singleton: false
name: wiredump_file_base
params: ()
visibility: public
PK�|[ފ����4ri/1.8/system/SOAP/WSDLDriver/wiredump_dev%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver#wiredump_dev=
is_singleton: false
name: wiredump_dev=
params: (wiredump_dev)
visibility: public
PK�|[�����8ri/1.8/system/SOAP/WSDLDriver/mandatorycharset%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver#mandatorycharset=
is_singleton: false
name: mandatorycharset=
params: (mandatorycharset)
visibility: public
PK�|[Џإ��:ri/1.8/system/SOAP/WSDLDriver/wiredump_file_base%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver#wiredump_file_base=
is_singleton: false
name: wiredump_file_base=
params: (wiredump_file_base)
visibility: public
PK�|[����1ri/1.8/system/SOAP/WSDLDriver/reset_stream-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriver#reset_stream
is_singleton: false
name: reset_stream
params: ()
visibility: public
PK�|[�Q((Kri/1.8/system/SOAP/SOAPNonNegativeInteger/cdesc-SOAPNonNegativeInteger.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPNonNegativeInteger
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPNonNegativeInteger
superclass: XSD::XSDNonNegativeInteger
PK�|[W�jX��=ri/1.8/system/SOAP/ArrayStoreError/cdesc-ArrayStoreError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::ArrayStoreError
includes: []

instance_methods: []

name: ArrayStoreError
superclass: Error
PK�|[(8,y��Eri/1.8/system/SOAP/ResponseFormatError/cdesc-ResponseFormatError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::ResponseFormatError
includes: []

instance_methods: []

name: ResponseFormatError
superclass: Error
PK�|[���1ri/1.8/system/SOAP/SOAPGYear/cdesc-SOAPGYear.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPGYear
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPGYear
superclass: XSD::XSDGYear
PK�|[o��/ri/1.8/system/SOAP/SOAPTime/cdesc-SOAPTime.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPTime
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPTime
superclass: XSD::XSDTime
PK�|[L����4ri/1.8/system/SOAP/SOAPReference/create_refid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPReference::create_refid
is_singleton: true
name: create_refid
params: (obj)
visibility: public
PK�|[���5��0ri/1.8/system/SOAP/SOAPReference/refidstr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPReference#refidstr
is_singleton: false
name: refidstr
params: ()
visibility: public
PK�|[��9N��9ri/1.8/system/SOAP/SOAPReference/cdesc-SOAPReference.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: refid
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: create_refid
- !ruby/object:RI::MethodSummary 
  name: decode
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convenience datatypes.
constants: []

full_name: SOAP::SOAPReference
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: __getobj__
- !ruby/object:RI::MethodSummary 
  name: __setobj__
- !ruby/object:RI::MethodSummary 
  name: method_missing
- !ruby/object:RI::MethodSummary 
  name: refidstr
name: SOAPReference
superclass: XSD::NSDBase
PK�|[L;G�((6ri/1.8/system/SOAP/SOAPReference/method_missing-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Why don't I use delegate.rb? -&gt; delegate requires target object type at initialize time. Why don't I use forwardable.rb? -&gt; forwardable requires a list of forwarding methods.
- !ruby/struct:SM::Flow::P 
  body: "ToDo: Maybe I should use forwardable.rb and give it a methods list like delegate.rb..."
full_name: SOAP::SOAPReference#method_missing
is_singleton: false
name: method_missing
params: (msg_id, *params)
visibility: public
PK�|[i��2ri/1.8/system/SOAP/SOAPReference/__getobj__-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPReference#__getobj__
is_singleton: false
name: __getobj__
params: ()
visibility: public
PK�|[��2�+ri/1.8/system/SOAP/SOAPReference/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Override the definition in SOAPBasetype.
full_name: SOAP::SOAPReference::new
is_singleton: true
name: new
params: (obj = nil)
visibility: public
PK�|[����.ri/1.8/system/SOAP/SOAPReference/decode-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPReference::decode
is_singleton: true
name: decode
params: (elename, refidstr)
visibility: public
PK�|[���2ri/1.8/system/SOAP/SOAPReference/__setobj__-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPReference#__setobj__
is_singleton: false
name: __setobj__
params: (obj)
visibility: public
PK�|[�5.���=ri/1.8/system/SOAP/RPCRoutingError/cdesc-RPCRoutingError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::RPCRoutingError
includes: []

instance_methods: []

name: RPCRoutingError
superclass: Error
PK�|[��6���)ri/1.8/system/SOAP/Error/cdesc-Error.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::Error
includes: []

instance_methods: []

name: Error
superclass: StandardError
PK�|[Ly���7ri/1.8/system/SOAP/HTTPStreamHandler/set_options-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::HTTPStreamHandler#set_options
is_singleton: false
name: set_options
params: ()
visibility: private
PK�|[>�����Cri/1.8/system/SOAP/HTTPStreamHandler/accept_encoding_gzip%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::HTTPStreamHandler#accept_encoding_gzip=
is_singleton: false
name: accept_encoding_gzip=
params: (allow)
visibility: public
PK�|[�S���5ri/1.8/system/SOAP/HTTPStreamHandler/send_post-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::HTTPStreamHandler#send_post
is_singleton: false
name: send_post
params: (endpoint_url, conn_data, charset)
visibility: private
PK�|[��P��3ri/1.8/system/SOAP/HTTPStreamHandler/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::HTTPStreamHandler#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[��<%��/ri/1.8/system/SOAP/HTTPStreamHandler/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::HTTPStreamHandler::new
is_singleton: true
name: new
params: (options)
visibility: public
PK�|[<����Hri/1.8/system/SOAP/HTTPStreamHandler/send_accept_encoding_gzip%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::HTTPStreamHandler#send_accept_encoding_gzip?
is_singleton: false
name: send_accept_encoding_gzip?
params: ()
visibility: private
PK�|[�g���0ri/1.8/system/SOAP/HTTPStreamHandler/send-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::HTTPStreamHandler#send
is_singleton: false
name: send
params: (endpoint_url, conn_data, soapaction = nil, charset = @charset)
visibility: public
PK�|[�ת��Ari/1.8/system/SOAP/HTTPStreamHandler/cdesc-HTTPStreamHandler.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: client
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: wiredump_file_base
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Client
  value: HTTPAccess2::Client
- !ruby/object:RI::Constant 
  comment: 
  name: RETRYABLE
  value: "true"
- !ruby/object:RI::Constant 
  comment: 
  name: Client
  value: SOAP::NetHttpClient
- !ruby/object:RI::Constant 
  comment: 
  name: RETRYABLE
  value: "false"
- !ruby/object:RI::Constant 
  comment: 
  name: MAX_RETRY_COUNT
  value: "10"
full_name: SOAP::HTTPStreamHandler
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAP
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: accept_encoding_gzip=
- !ruby/object:RI::MethodSummary 
  name: decode_gzip
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: reset
- !ruby/object:RI::MethodSummary 
  name: send
- !ruby/object:RI::MethodSummary 
  name: send_accept_encoding_gzip?
- !ruby/object:RI::MethodSummary 
  name: send_post
- !ruby/object:RI::MethodSummary 
  name: set_cookie_store_file
- !ruby/object:RI::MethodSummary 
  name: set_options
- !ruby/object:RI::MethodSummary 
  name: test_loopback_response
name: HTTPStreamHandler
superclass: StreamHandler
PK�|[R-2��Bri/1.8/system/SOAP/HTTPStreamHandler/test_loopback_response-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::HTTPStreamHandler#test_loopback_response
is_singleton: false
name: test_loopback_response
params: ()
visibility: public
PK�|[�D�R��Ari/1.8/system/SOAP/HTTPStreamHandler/set_cookie_store_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::HTTPStreamHandler#set_cookie_store_file
is_singleton: false
name: set_cookie_store_file
params: (value)
visibility: private
PK�|[�w�c��1ri/1.8/system/SOAP/HTTPStreamHandler/reset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::HTTPStreamHandler#reset
is_singleton: false
name: reset
params: (endpoint_url = nil)
visibility: public
PK�|[�����7ri/1.8/system/SOAP/HTTPStreamHandler/decode_gzip-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::HTTPStreamHandler#decode_gzip
is_singleton: false
name: decode_gzip
params: (instring)
visibility: private
PK�|[{y
2

9ri/1.8/system/SOAP/SOAPGMonthDay/cdesc-SOAPGMonthDay.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPGMonthDay
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPGMonthDay
superclass: XSD::XSDGMonthDay
PK�|[G���9ri/1.8/system/SOAP/SOAPRawString/cdesc-SOAPRawString.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: SOAPRawString is for sending raw string. In contrast to SOAPString, SOAP4R does not do XML encoding and does not convert its CES. The string it holds is embedded to XML instance directly as a 'xsd:string'.
constants: []

full_name: SOAP::SOAPRawString
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPRawString
superclass: XSD::XSDString
PK�|[zG���)ri/1.8/system/SOAP/Property/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "name: a Symbol, String or an Array"
full_name: SOAP::Property#[]
is_singleton: false
name: "[]"
params: (name)
visibility: public
PK�|[y�am��+ri/1.8/system/SOAP/Property/empty%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#empty?
is_singleton: false
name: empty?
params: ()
visibility: public
PK�|[��Pe��'ri/1.8/system/SOAP/Property/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (key, value)
comment: 
full_name: SOAP::Property#each
is_singleton: false
name: each
params: () {|key, value| ...}
visibility: public
PK�|[�I�b��*ri/1.8/system/SOAP/Property/key_max-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#key_max
is_singleton: false
name: key_max
params: ()
visibility: private
PK�|[˾X?��/ri/1.8/system/SOAP/Property/local_assign-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#local_assign
is_singleton: false
name: local_assign
params: (key, value)
visibility: protected
PK�|[�=	/��,ri/1.8/system/SOAP/Property/name_to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#name_to_a
is_singleton: false
name: name_to_a
params: (name)
visibility: private
PK�|[V>_��-ri/1.8/system/SOAP/Property/local_hook-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#local_hook
is_singleton: false
name: local_hook
params: (key, direct)
visibility: protected
PK�|[�����/ri/1.8/system/SOAP/Property/loadproperty-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: find property from $:.
full_name: SOAP::Property#loadproperty
is_singleton: false
name: loadproperty
params: (propname)
visibility: public
PK�|[�����'ri/1.8/system/SOAP/Property/load-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#load
is_singleton: false
name: load
params: (stream)
visibility: public
PK�|[�3Ӧ��3ri/1.8/system/SOAP/Property/loadpropertyfile-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#loadpropertyfile
is_singleton: false
name: loadpropertyfile
params: (file)
visibility: private
PK�|[j�B��3ri/1.8/system/SOAP/Property/generate_new_key-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#generate_new_key
is_singleton: false
name: generate_new_key
params: ()
visibility: private
PK�|[�r�W��1ri/1.8/system/SOAP/Property/local_referent-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#local_referent
is_singleton: false
name: local_referent
params: (key)
visibility: protected
PK�|[��}��)ri/1.8/system/SOAP/Property/to_key-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#to_key
is_singleton: false
name: to_key
params: (name)
visibility: private
PK�|[K[���+ri/1.8/system/SOAP/Property/each_key-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (value)
comment: 
full_name: SOAP::Property#each_key
is_singleton: false
name: each_key
params: () {|value| ...}
visibility: private
PK�|[��g5��)ri/1.8/system/SOAP/Property/unlock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#unlock
is_singleton: false
name: unlock
params: (cascade = false)
visibility: public
PK�|[�~��,ri/1.8/system/SOAP/Property/locked%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#locked?
is_singleton: false
name: locked?
params: ()
visibility: public
PK�|[T���4ri/1.8/system/SOAP/Property/local_assign_hook-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#local_assign_hook
is_singleton: false
name: local_assign_hook
params: (key, cascade, &hook)
visibility: protected
PK�|[��
���.ri/1.8/system/SOAP/Property/assign_hook-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#assign_hook
is_singleton: false
name: assign_hook
params: (ary, cascade, &hook)
visibility: private
PK�|[�e����7ri/1.8/system/SOAP/Property/Util/const_from_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property::Util#const_from_name
is_singleton: false
name: const_from_name
params: (fqname)
visibility: public
PK�|[��T220ri/1.8/system/SOAP/Property/Util/cdesc-Util.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::Property::Util
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: const_from_name
- !ruby/object:RI::MethodSummary 
  name: require_from_name
name: Util
superclass: 
PK�|[�8~��9ri/1.8/system/SOAP/Property/Util/require_from_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property::Util#require_from_name
is_singleton: false
name: require_from_name
params: (fqname)
visibility: public
PK�|[��K��&ri/1.8/system/SOAP/Property/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[Ӓ�ڹ�)ri/1.8/system/SOAP/Property/assign-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#assign
is_singleton: false
name: assign
params: (ary, value)
visibility: private
PK�|[}۬ ��,ri/1.8/system/SOAP/Property/deref_key-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#deref_key
is_singleton: false
name: deref_key
params: (key)
visibility: protected
PK�|[����'ri/1.8/system/SOAP/Property/load-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property::load
is_singleton: true
name: load
params: (stream)
visibility: public
PK�|[�8[���3ri/1.8/system/SOAP/Property/assign_self_hook-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#assign_self_hook
is_singleton: false
name: assign_self_hook
params: (cascade, &hook)
visibility: private
PK�|[���)ri/1.8/system/SOAP/Property/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "value: an Object key is generated by property"
full_name: SOAP::Property#<<
is_singleton: false
name: "<<"
params: (value)
visibility: public
PK�|[����'ri/1.8/system/SOAP/Property/keys-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#keys
is_singleton: false
name: keys
params: ()
visibility: public
PK�|[AISr"
"
/ri/1.8/system/SOAP/Property/cdesc-Property.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: load
- !ruby/object:RI::MethodSummary 
  name: loadproperty
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Property stream format:"
- !ruby/struct:SM::Flow::VERB 
  body: "  line separator is \\r?\\n.  1 line per a property.\n  line which begins with '#' is a comment line.  empty line is ignored, too.\n  key/value separator is ':' or '='.\n  '\\' as escape character.  but line separator cannot be escaped.\n  \\s at the head/tail of key/value are trimmed.\n\n  '[' + key + ']' indicates property section.  for example,\n\n    [aaa.bbb]\n    ccc = ddd\n    eee.fff = ggg\n    []\n    aaa.hhh = iii\n\n  is the same as;\n\n    aaa.bbb.ccc = ddd\n    aaa.bbb.eee.fff = ggg\n    aaa.hhh = iii\n"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: FrozenError
  value: "(RUBY_VERSION >= \"1.9.0\") ? RuntimeError : TypeError"
- !ruby/object:RI::Constant 
  comment: 
  name: KEY_REGSRC
  value: "'([^=:\\\\\\\\]*(?:\\\\\\\\.[^=:\\\\\\\\]*)*)'"
- !ruby/object:RI::Constant 
  comment: 
  name: DEF_REGSRC
  value: "'\\\\s*' + KEY_REGSRC + '\\\\s*[=:]\\\\s*(.*)'"
- !ruby/object:RI::Constant 
  comment: 
  name: COMMENT_REGEXP
  value: Regexp.new('^(?:#.*|)$')
- !ruby/object:RI::Constant 
  comment: 
  name: CATDEF_REGEXP
  value: Regexp.new("^\\[\\s*#{KEY_REGSRC}\\s*\\]$")
- !ruby/object:RI::Constant 
  comment: 
  name: LINE_REGEXP
  value: Regexp.new("^#{DEF_REGSRC}$")
- !ruby/object:RI::Constant 
  comment: 
  name: NO_HOOK
  value: "[].freeze"
full_name: SOAP::Property
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: add_hook
- !ruby/object:RI::MethodSummary 
  name: assign
- !ruby/object:RI::MethodSummary 
  name: assign_hook
- !ruby/object:RI::MethodSummary 
  name: assign_self_hook
- !ruby/object:RI::MethodSummary 
  name: check_lock
- !ruby/object:RI::MethodSummary 
  name: deref_key
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: each_key
- !ruby/object:RI::MethodSummary 
  name: empty?
- !ruby/object:RI::MethodSummary 
  name: generate_new_key
- !ruby/object:RI::MethodSummary 
  name: key_max
- !ruby/object:RI::MethodSummary 
  name: keys
- !ruby/object:RI::MethodSummary 
  name: load
- !ruby/object:RI::MethodSummary 
  name: loadproperty
- !ruby/object:RI::MethodSummary 
  name: loadpropertyfile
- !ruby/object:RI::MethodSummary 
  name: loadstr
- !ruby/object:RI::MethodSummary 
  name: local_assign
- !ruby/object:RI::MethodSummary 
  name: local_assign_hook
- !ruby/object:RI::MethodSummary 
  name: local_hook
- !ruby/object:RI::MethodSummary 
  name: local_referent
- !ruby/object:RI::MethodSummary 
  name: lock
- !ruby/object:RI::MethodSummary 
  name: locked?
- !ruby/object:RI::MethodSummary 
  name: name_to_a
- !ruby/object:RI::MethodSummary 
  name: propkey?
- !ruby/object:RI::MethodSummary 
  name: referent
- !ruby/object:RI::MethodSummary 
  name: to_key
- !ruby/object:RI::MethodSummary 
  name: unlock
- !ruby/object:RI::MethodSummary 
  name: values
name: Property
superclass: Object
PK�|[�L���)ri/1.8/system/SOAP/Property/values-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#values
is_singleton: false
name: values
params: ()
visibility: public
PK�|[[�\��-ri/1.8/system/SOAP/Property/check_lock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#check_lock
is_singleton: false
name: check_lock
params: (key)
visibility: private
PK�|[$�M��-ri/1.8/system/SOAP/Property/propkey%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#propkey?
is_singleton: false
name: propkey?
params: (value)
visibility: private
PK�|[*����+ri/1.8/system/SOAP/Property/referent-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#referent
is_singleton: false
name: referent
params: (ary)
visibility: private
PK�|[A���'ri/1.8/system/SOAP/Property/lock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#lock
is_singleton: false
name: lock
params: (cascade = false)
visibility: public
PK�|[���*ri/1.8/system/SOAP/Property/loadstr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property#loadstr
is_singleton: false
name: loadstr
params: (str)
visibility: private
PK�|[;��,ri/1.8/system/SOAP/Property/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "name: a Symbol, String or an Array value: an Object"
full_name: SOAP::Property#[]=
is_singleton: false
name: "[]="
params: (name, value)
visibility: public
PK�|[Į�©�+ri/1.8/system/SOAP/Property/add_hook-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "name: a Symbol, String or an Array; nil means hook to the root cascade: true/false; for cascading hook of sub key hook: block which will be called with 2 args, name and value"
full_name: SOAP::Property#add_hook
is_singleton: false
name: add_hook
params: (name = nil, cascade = false, &hook)
visibility: public
PK�|[��m��/ri/1.8/system/SOAP/Property/loadproperty-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Property::loadproperty
is_singleton: true
name: loadproperty
params: (propname)
visibility: public
PK�|[��`���,ri/1.8/system/SOAP/SOAPElement/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPElement#[]
is_singleton: false
name: "[]"
params: (idx)
visibility: public
PK�|[
��8ri/1.8/system/SOAP/SOAPElement/safe_accessor_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPElement#safe_accessor_name
is_singleton: false
name: safe_accessor_name
params: (name)
visibility: private
PK�|[�5z���*ri/1.8/system/SOAP/SOAPElement/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (@array[idx], @data[idx])
comment: 
full_name: SOAP::SOAPElement#each
is_singleton: false
name: each
params: () {|@array[idx], @data[idx]| ...}
visibility: public
PK�|[z����.ri/1.8/system/SOAP/SOAPElement/from_obj-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPElement::from_obj
is_singleton: true
name: from_obj
params: (obj, namespace = nil)
visibility: public
PK�|[T0���,ri/1.8/system/SOAP/SOAPElement/to_obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPElement#to_obj
is_singleton: false
name: to_obj
params: ()
visibility: public
PK�|[�U�y��)ri/1.8/system/SOAP/SOAPElement/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Element interfaces.
full_name: SOAP::SOAPElement#add
is_singleton: false
name: add
params: (value)
visibility: public
PK�|[7ayKQQ5ri/1.8/system/SOAP/SOAPElement/cdesc-SOAPElement.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: elename
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: encodingstyle
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: extraattr
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: id
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: parent
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: position
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: precedents
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: qualified
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: root
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Text interface.
  name: text
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: decode
- !ruby/object:RI::MethodSummary 
  name: from_obj
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: to_elename
comment: 
- !ruby/struct:SM::Flow::P 
  body: SOAPElement is not typed so it is not derived from NSDBase.
constants: []

full_name: SOAP::SOAPElement
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: add_accessor
- !ruby/object:RI::MethodSummary 
  name: add_accessor
- !ruby/object:RI::MethodSummary 
  name: add_member
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: key?
- !ruby/object:RI::MethodSummary 
  name: members
- !ruby/object:RI::MethodSummary 
  name: safe_accessor_name
- !ruby/object:RI::MethodSummary 
  name: to_obj
name: SOAPElement
superclass: Object
PK�|['b�M��-ri/1.8/system/SOAP/SOAPElement/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPElement#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[��0���)ri/1.8/system/SOAP/SOAPElement/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPElement::new
is_singleton: true
name: new
params: (elename, text = nil)
visibility: public
PK�|[�	;��-ri/1.8/system/SOAP/SOAPElement/members-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPElement#members
is_singleton: false
name: members
params: ()
visibility: public
PK�|[�=9k��2ri/1.8/system/SOAP/SOAPElement/add_accessor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPElement#add_accessor
is_singleton: false
name: add_accessor
params: (name)
visibility: private
PK�|[ޑ�H��0ri/1.8/system/SOAP/SOAPElement/to_elename-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPElement::to_elename
is_singleton: true
name: to_elename
params: (obj, namespace = nil)
visibility: public
PK�|[sN����,ri/1.8/system/SOAP/SOAPElement/decode-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPElement::decode
is_singleton: true
name: decode
params: (elename)
visibility: public
PK�|[awj���0ri/1.8/system/SOAP/SOAPElement/add_member-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPElement#add_member
is_singleton: false
name: add_member
params: (name, value)
visibility: private
PK�|[�;���/ri/1.8/system/SOAP/SOAPElement/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPElement#[]=
is_singleton: false
name: "[]="
params: (idx, data)
visibility: public
PK�|[){N��,ri/1.8/system/SOAP/SOAPElement/key%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPElement#key?
is_singleton: false
name: key?
params: (name)
visibility: public
PK�|[�:��+ri/1.8/system/SOAP/save_cookie_store-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP#save_cookie_store
is_singleton: false
name: save_cookie_store
params: (filename)
visibility: public
PK�|[F�r�((Kri/1.8/system/SOAP/SOAPNonPositiveInteger/cdesc-SOAPNonPositiveInteger.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPNonPositiveInteger
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPNonPositiveInteger
superclass: XSD::XSDNonPositiveInteger
PK�|[ Y���=ri/1.8/system/SOAP/Mapping/schema_attribute_definition-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::schema_attribute_definition
is_singleton: true
name: schema_attribute_definition
params: (klass)
visibility: public
PK�|[lu���4ri/1.8/system/SOAP/Mapping/SOAPException/to_e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::SOAPException#to_e
is_singleton: false
name: to_e
params: ()
visibility: public
PK�|[���ɷ�3ri/1.8/system/SOAP/Mapping/SOAPException/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::SOAPException::new
is_singleton: true
name: new
params: (e)
visibility: public
PK�|['��..Ari/1.8/system/SOAP/Mapping/SOAPException/cdesc-SOAPException.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: cause
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: excn_type_name
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Inner class to pass an exception.
constants: []

full_name: SOAP::Mapping::SOAPException
includes: 
- !ruby/object:RI::IncludedModule 
  name: Marshallable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_e
name: SOAPException
superclass: Object
PK�|[��
X��?ri/1.8/system/SOAP/Mapping/MappingError/cdesc-MappingError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::Mapping::MappingError
includes: []

instance_methods: []

name: MappingError
superclass: Error
PK�|[?Ƽ���+ri/1.8/system/SOAP/Mapping/_obj2soap-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::_obj2soap
is_singleton: true
name: _obj2soap
params: (obj, registry, type = nil)
visibility: public
PK�|[5a�l��7ri/1.8/system/SOAP/Mapping/class_schema_variable-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::class_schema_variable
is_singleton: true
name: class_schema_variable
params: (sym, klass)
visibility: private
PK�|[�Al)ooKri/1.8/system/SOAP/Mapping/TypedArrayFactory_/cdesc-TypedArrayFactory_.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::Mapping::TypedArrayFactory_
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: obj2soap
- !ruby/object:RI::MethodSummary 
  name: soap2obj
name: TypedArrayFactory_
superclass: Factory
PK�|[q~߯��=ri/1.8/system/SOAP/Mapping/TypedArrayFactory_/obj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::TypedArrayFactory_#obj2soap
is_singleton: false
name: obj2soap
params: (soap_class, obj, info, map)
visibility: public
PK�|[D����8ri/1.8/system/SOAP/Mapping/TypedArrayFactory_/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::TypedArrayFactory_::new
is_singleton: true
name: new
params: (allow_original_mapping = false)
visibility: public
PK�|[��FS��=ri/1.8/system/SOAP/Mapping/TypedArrayFactory_/soap2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::TypedArrayFactory_#soap2obj
is_singleton: false
name: soap2obj
params: (obj_class, node, info, map)
visibility: public
PK�|[I^���/ri/1.8/system/SOAP/Mapping/get_attribute-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::get_attribute
is_singleton: true
name: get_attribute
params: (obj, attr_name)
visibility: public
PK�|[-��N��Eri/1.8/system/SOAP/Mapping/TraverseSupport/mark_marshalled_obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::TraverseSupport#mark_marshalled_obj
is_singleton: false
name: mark_marshalled_obj
params: (obj, soap_obj)
visibility: public
PK�|[�ѐ���Gri/1.8/system/SOAP/Mapping/TraverseSupport/mark_unmarshalled_obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::TraverseSupport#mark_unmarshalled_obj
is_singleton: false
name: mark_unmarshalled_obj
params: (node, obj)
visibility: public
PK�|[i����Eri/1.8/system/SOAP/Mapping/TraverseSupport/cdesc-TraverseSupport.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: TraverseSupport breaks following thread variables.
- !ruby/struct:SM::Flow::VERB 
  body: "  Thread.current[:SOAPMarshalDataKey]\n"
constants: []

full_name: SOAP::Mapping::TraverseSupport
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: mark_marshalled_obj
- !ruby/object:RI::MethodSummary 
  name: mark_unmarshalled_obj
name: TraverseSupport
superclass: 
PK�|[�)���Eri/1.8/system/SOAP/Mapping/MappedException/cdesc-MappedException.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::Mapping::MappedException
includes: []

instance_methods: []

name: MappedException
superclass: 
PK�|[@�
Ӽ�-ri/1.8/system/SOAP/Mapping/class2qname-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::class2qname
is_singleton: true
name: class2qname
params: (klass)
visibility: public
PK�|[J��p��8ri/1.8/system/SOAP/Mapping/ArrayFactory_/obj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "[1], [2]"
    body: is converted to Array of Array, not 2-D Array.
  type: :LABELED
- !ruby/struct:SM::Flow::P 
  body: To create M-D Array, you must call Mapping.ary2md.
full_name: SOAP::Mapping::ArrayFactory_#obj2soap
is_singleton: false
name: obj2soap
params: (soap_class, obj, info, map)
visibility: public
PK�|[�����3ri/1.8/system/SOAP/Mapping/ArrayFactory_/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::ArrayFactory_::new
is_singleton: true
name: new
params: (allow_original_mapping = false)
visibility: public
PK�|[��M���8ri/1.8/system/SOAP/Mapping/ArrayFactory_/soap2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::ArrayFactory_#soap2obj
is_singleton: false
name: soap2obj
params: (obj_class, node, info, map)
visibility: public
PK�|[ji��eeAri/1.8/system/SOAP/Mapping/ArrayFactory_/cdesc-ArrayFactory_.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::Mapping::ArrayFactory_
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: obj2soap
- !ruby/object:RI::MethodSummary 
  name: soap2obj
name: ArrayFactory_
superclass: Factory
PK�|[ʡ#��+ri/1.8/system/SOAP/Mapping/_soap2obj-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::_soap2obj
is_singleton: true
name: _soap2obj
params: (node, registry, klass = nil)
visibility: public
PK�|[g�Z���1ri/1.8/system/SOAP/Mapping/class_from_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::class_from_name
is_singleton: true
name: class_from_name
params: (name, lenient = false)
visibility: public
PK�|[�ͮm��Cri/1.8/system/SOAP/Mapping/RubytypeFactory/unknownstruct2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::RubytypeFactory#unknownstruct2obj
is_singleton: false
name: unknownstruct2obj
params: (node, info, map)
visibility: private
PK�|[�H�b��>ri/1.8/system/SOAP/Mapping/RubytypeFactory/rubytype2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::RubytypeFactory#rubytype2obj
is_singleton: false
name: rubytype2obj
params: (node, info, map, rubytype)
visibility: private
PK�|[kA�@==;ri/1.8/system/SOAP/Mapping/RubytypeFactory/array2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Only creates empty array. Do String#replace it with real string.
full_name: SOAP::Mapping::RubytypeFactory#array2obj
is_singleton: false
name: array2obj
params: (node, map, rubytype)
visibility: private
PK�|[rk�9��Hri/1.8/system/SOAP/Mapping/RubytypeFactory/singleton_methods_true-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::RubytypeFactory#singleton_methods_true
is_singleton: false
name: singleton_methods_true
params: (obj)
visibility: private
PK�|[;�����Ari/1.8/system/SOAP/Mapping/RubytypeFactory/unknowntype2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::RubytypeFactory#unknowntype2obj
is_singleton: false
name: unknowntype2obj
params: (node, info, map)
visibility: private
PK�|[��1��:ri/1.8/system/SOAP/Mapping/RubytypeFactory/obj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::RubytypeFactory#obj2soap
is_singleton: false
name: obj2soap
params: (soap_class, obj, info, map)
visibility: public
PK�|[�'���5ri/1.8/system/SOAP/Mapping/RubytypeFactory/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::RubytypeFactory::new
is_singleton: true
name: new
params: (config = {})
visibility: public
PK�|[]N����:ri/1.8/system/SOAP/Mapping/RubytypeFactory/soap2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::RubytypeFactory#soap2obj
is_singleton: false
name: soap2obj
params: (obj_class, node, info, map)
visibility: public
PK�|[�`��@@<ri/1.8/system/SOAP/Mapping/RubytypeFactory/string2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Only creates empty string. Do String#replace it with real string.
full_name: SOAP::Mapping::RubytypeFactory#string2obj
is_singleton: false
name: string2obj
params: (node, map, rubytype)
visibility: private
PK�|[�v��@ri/1.8/system/SOAP/Mapping/RubytypeFactory/addiv2soapattr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::RubytypeFactory#addiv2soapattr
is_singleton: false
name: addiv2soapattr
params: (node, obj, map)
visibility: private
PK�|[Hs�`��Eri/1.8/system/SOAP/Mapping/RubytypeFactory/cdesc-RubytypeFactory.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: TYPE_STRING
  value: XSD::QName.new(RubyTypeNamespace, 'String')
- !ruby/object:RI::Constant 
  comment: 
  name: TYPE_TIME
  value: XSD::QName.new(RubyTypeNamespace, 'Time')
- !ruby/object:RI::Constant 
  comment: 
  name: TYPE_ARRAY
  value: XSD::QName.new(RubyTypeNamespace, 'Array')
- !ruby/object:RI::Constant 
  comment: 
  name: TYPE_REGEXP
  value: XSD::QName.new(RubyTypeNamespace, 'Regexp')
- !ruby/object:RI::Constant 
  comment: 
  name: TYPE_RANGE
  value: XSD::QName.new(RubyTypeNamespace, 'Range')
- !ruby/object:RI::Constant 
  comment: 
  name: TYPE_CLASS
  value: XSD::QName.new(RubyTypeNamespace, 'Class')
- !ruby/object:RI::Constant 
  comment: 
  name: TYPE_MODULE
  value: XSD::QName.new(RubyTypeNamespace, 'Module')
- !ruby/object:RI::Constant 
  comment: 
  name: TYPE_SYMBOL
  value: XSD::QName.new(RubyTypeNamespace, 'Symbol')
- !ruby/object:RI::Constant 
  comment: 
  name: TYPE_STRUCT
  value: XSD::QName.new(RubyTypeNamespace, 'Struct')
- !ruby/object:RI::Constant 
  comment: 
  name: TYPE_HASH
  value: XSD::QName.new(RubyTypeNamespace, 'Map')
full_name: SOAP::Mapping::RubytypeFactory
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: addiv2soapattr
- !ruby/object:RI::MethodSummary 
  name: anytype2obj
- !ruby/object:RI::MethodSummary 
  name: array2obj
- !ruby/object:RI::MethodSummary 
  name: exception2obj
- !ruby/object:RI::MethodSummary 
  name: obj2soap
- !ruby/object:RI::MethodSummary 
  name: rubytype2obj
- !ruby/object:RI::MethodSummary 
  name: rubytypestruct2obj
- !ruby/object:RI::MethodSummary 
  name: singleton_methods_true
- !ruby/object:RI::MethodSummary 
  name: singleton_methods_true
- !ruby/object:RI::MethodSummary 
  name: soap2obj
- !ruby/object:RI::MethodSummary 
  name: string2obj
- !ruby/object:RI::MethodSummary 
  name: unknownobj2soap
- !ruby/object:RI::MethodSummary 
  name: unknownstruct2obj
- !ruby/object:RI::MethodSummary 
  name: unknowntype2obj
name: RubytypeFactory
superclass: Factory
PK�|[w�0���=ri/1.8/system/SOAP/Mapping/RubytypeFactory/anytype2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::RubytypeFactory#anytype2obj
is_singleton: false
name: anytype2obj
params: (node, info, map)
visibility: private
PK�|[�z��Ari/1.8/system/SOAP/Mapping/RubytypeFactory/unknownobj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::RubytypeFactory#unknownobj2soap
is_singleton: false
name: unknownobj2soap
params: (soap_class, obj, info, map)
visibility: private
PK�|[h�$��Dri/1.8/system/SOAP/Mapping/RubytypeFactory/rubytypestruct2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::RubytypeFactory#rubytypestruct2obj
is_singleton: false
name: rubytypestruct2obj
params: (node, info, map, rubytype)
visibility: private
PK�|[=�����?ri/1.8/system/SOAP/Mapping/RubytypeFactory/exception2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::RubytypeFactory#exception2obj
is_singleton: false
name: exception2obj
params: (klass, node, map)
visibility: private
PK�|[��3��6ri/1.8/system/SOAP/Mapping/define_attr_accessor-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::define_attr_accessor
is_singleton: true
name: define_attr_accessor
params: (obj, name, getterproc, setterproc = nil)
visibility: public
PK�|[PІ�5ri/1.8/system/SOAP/Mapping/create_empty_object-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: ruby/1.7 or later.
full_name: SOAP::Mapping::create_empty_object
is_singleton: true
name: create_empty_object
params: (klass)
visibility: public
PK�|[r�¹��0ri/1.8/system/SOAP/Mapping/set_attributes-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::set_attributes
is_singleton: true
name: set_attributes
params: (obj, values)
visibility: public
PK�|[�����1ri/1.8/system/SOAP/Mapping/fault2exception-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::fault2exception
is_singleton: true
name: fault2exception
params: (fault, registry = nil)
visibility: public
PK�|[m�\<<Cri/1.8/system/SOAP/Mapping/Base64Factory_/cdesc-Base64Factory_.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::Mapping::Base64Factory_
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: obj2soap
- !ruby/object:RI::MethodSummary 
  name: soap2obj
name: Base64Factory_
superclass: Factory
PK�|[����9ri/1.8/system/SOAP/Mapping/Base64Factory_/obj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Base64Factory_#obj2soap
is_singleton: false
name: obj2soap
params: (soap_class, obj, info, map)
visibility: public
PK�|[/�P���9ri/1.8/system/SOAP/Mapping/Base64Factory_/soap2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Base64Factory_#soap2obj
is_singleton: false
name: soap2obj
params: (obj_class, node, info, map)
visibility: public
PK�|[L"f��.ri/1.8/system/SOAP/Mapping/name2elename-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Allow only (Letter | '_') (Letter | Digit | '-' | '_')* here. Caution: '.' is not allowed here. To follow XML spec., it should be NCName."
- !ruby/struct:SM::Flow::VERB 
  body: "  (denied chars) =&gt; .[0-F][0-F]\n  ex. a.b =&gt; a.2eb\n"
full_name: SOAP::Mapping::name2elename
is_singleton: true
name: name2elename
params: (name)
visibility: public
PK�|["S��*ri/1.8/system/SOAP/Mapping/soap2obj-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::soap2obj
is_singleton: true
name: soap2obj
params: (node, registry = nil, klass = nil, opt = EMPTY_OPT)
visibility: public
PK�|[l,��Ari/1.8/system/SOAP/Mapping/Registry/find_mapped_soap_class-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Registry#find_mapped_soap_class
is_singleton: false
name: find_mapped_soap_class
params: (obj_class)
visibility: public
PK�|[	���8ri/1.8/system/SOAP/Mapping/Registry/addextend2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Registry#addextend2obj
is_singleton: false
name: addextend2obj
params: (obj, attr)
visibility: private
PK�|[�h���4ri/1.8/system/SOAP/Mapping/Registry/_obj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Registry#_obj2soap
is_singleton: false
name: _obj2soap
params: (obj)
visibility: private
PK�|[�
=3ri/1.8/system/SOAP/Mapping/Registry/obj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: general Registry ignores type_qname
full_name: SOAP::Mapping::Registry#obj2soap
is_singleton: false
name: obj2soap
params: (obj, type_qname = nil)
visibility: public
PK�|[gҨJK K 7ri/1.8/system/SOAP/Mapping/Registry/cdesc-Registry.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: default_factory
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: excn_handler_obj2soap
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: excn_handler_soap2obj
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: StringFactory
  value: StringFactory_.new
- !ruby/object:RI::Constant 
  comment: 
  name: BasetypeFactory
  value: BasetypeFactory_.new
- !ruby/object:RI::Constant 
  comment: 
  name: DateTimeFactory
  value: DateTimeFactory_.new
- !ruby/object:RI::Constant 
  comment: 
  name: ArrayFactory
  value: ArrayFactory_.new
- !ruby/object:RI::Constant 
  comment: 
  name: Base64Factory
  value: Base64Factory_.new
- !ruby/object:RI::Constant 
  comment: 
  name: URIFactory
  value: URIFactory_.new
- !ruby/object:RI::Constant 
  comment: 
  name: TypedArrayFactory
  value: TypedArrayFactory_.new
- !ruby/object:RI::Constant 
  comment: 
  name: TypedStructFactory
  value: TypedStructFactory_.new
- !ruby/object:RI::Constant 
  comment: 
  name: HashFactory
  value: HashFactory_.new
- !ruby/object:RI::Constant 
  comment: 
  name: SOAPBaseMap
  value: "[     [::NilClass,     ::SOAP::SOAPNil,        BasetypeFactory],     [::TrueClass,    ::SOAP::SOAPBoolean,    BasetypeFactory],     [::FalseClass,   ::SOAP::SOAPBoolean,    BasetypeFactory],     [::String,       ::SOAP::SOAPString,     StringFactory],     [::DateTime,     ::SOAP::SOAPDateTime,   DateTimeFactory],     [::Date,         ::SOAP::SOAPDate,       DateTimeFactory],     [::Time,         ::SOAP::SOAPDateTime,   DateTimeFactory],     [::Time,         ::SOAP::SOAPTime,       DateTimeFactory],     [::Float,        ::SOAP::SOAPDouble,     BasetypeFactory,       {:derived_class => true}],     [::Float,        ::SOAP::SOAPFloat,      BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPInt,        BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPLong,       BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPInteger,    BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPShort,      BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPByte,       BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPNonPositiveInteger, BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPNegativeInteger, BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPNonNegativeInteger, BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPPositiveInteger, BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPUnsignedLong, BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPUnsignedInt, BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPUnsignedShort, BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPUnsignedByte, BasetypeFactory,       {:derived_class => true}],     [::URI::Generic, ::SOAP::SOAPAnyURI,     URIFactory,       {:derived_class => true}],     [::String,       ::SOAP::SOAPBase64,     Base64Factory],     [::String,       ::SOAP::SOAPHexBinary,  Base64Factory],     [::String,       ::SOAP::SOAPDecimal,    BasetypeFactory],     [::String,       ::SOAP::SOAPDuration,   BasetypeFactory],     [::String,       ::SOAP::SOAPGYearMonth, BasetypeFactory],     [::String,       ::SOAP::SOAPGYear,      BasetypeFactory],     [::String,       ::SOAP::SOAPGMonthDay,  BasetypeFactory],     [::String,       ::SOAP::SOAPGDay,       BasetypeFactory],     [::String,       ::SOAP::SOAPGMonth,     BasetypeFactory],     [::String,       ::SOAP::SOAPQName,      BasetypeFactory],      [::Hash,         ::SOAP::SOAPArray,      HashFactory],     [::Hash,         ::SOAP::SOAPStruct,     HashFactory],      [::Array,        ::SOAP::SOAPArray,      ArrayFactory,       {:derived_class => true}],      [::SOAP::Mapping::SOAPException,                      ::SOAP::SOAPStruct,     TypedStructFactory,       {:type => XSD::QName.new(RubyCustomTypeNamespace, \"SOAPException\")}],  ]"
- !ruby/object:RI::Constant 
  comment: 
  name: RubyOriginalMap
  value: "[     [::NilClass,     ::SOAP::SOAPNil,        BasetypeFactory],     [::TrueClass,    ::SOAP::SOAPBoolean,    BasetypeFactory],     [::FalseClass,   ::SOAP::SOAPBoolean,    BasetypeFactory],     [::String,       ::SOAP::SOAPString,     StringFactory],     [::DateTime,     ::SOAP::SOAPDateTime,   DateTimeFactory],     [::Date,         ::SOAP::SOAPDate,       DateTimeFactory],     [::Time,         ::SOAP::SOAPDateTime,   DateTimeFactory],     [::Time,         ::SOAP::SOAPTime,       DateTimeFactory],     [::Float,        ::SOAP::SOAPDouble,     BasetypeFactory,       {:derived_class => true}],     [::Float,        ::SOAP::SOAPFloat,      BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPInt,        BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPLong,       BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPInteger,    BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPShort,      BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPByte,       BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPNonPositiveInteger, BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPNegativeInteger, BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPNonNegativeInteger, BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPPositiveInteger, BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPUnsignedLong, BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPUnsignedInt, BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPUnsignedShort, BasetypeFactory,       {:derived_class => true}],     [::Integer,      ::SOAP::SOAPUnsignedByte, BasetypeFactory,       {:derived_class => true}],     [::URI::Generic, ::SOAP::SOAPAnyURI,     URIFactory,       {:derived_class => true}],     [::String,       ::SOAP::SOAPBase64,     Base64Factory],     [::String,       ::SOAP::SOAPHexBinary,  Base64Factory],     [::String,       ::SOAP::SOAPDecimal,    BasetypeFactory],     [::String,       ::SOAP::SOAPDuration,   BasetypeFactory],     [::String,       ::SOAP::SOAPGYearMonth, BasetypeFactory],     [::String,       ::SOAP::SOAPGYear,      BasetypeFactory],     [::String,       ::SOAP::SOAPGMonthDay,  BasetypeFactory],     [::String,       ::SOAP::SOAPGDay,       BasetypeFactory],     [::String,       ::SOAP::SOAPGMonth,     BasetypeFactory],     [::String,       ::SOAP::SOAPQName,      BasetypeFactory],      [::Hash,         ::SOAP::SOAPArray,      HashFactory],     [::Hash,         ::SOAP::SOAPStruct,     HashFactory],      # Does not allow Array's subclass here.     [::Array,        ::SOAP::SOAPArray,      ArrayFactory],      [::SOAP::Mapping::SOAPException,                      ::SOAP::SOAPStruct,     TypedStructFactory,       {:type => XSD::QName.new(RubyCustomTypeNamespace, \"SOAPException\")}],   ]"
full_name: SOAP::Mapping::Registry
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _obj2soap
- !ruby/object:RI::MethodSummary 
  name: _soap2obj
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: addextend2obj
- !ruby/object:RI::MethodSummary 
  name: addextend2obj
- !ruby/object:RI::MethodSummary 
  name: addextend2soap
- !ruby/object:RI::MethodSummary 
  name: addiv2obj
- !ruby/object:RI::MethodSummary 
  name: find_mapped_obj_class
- !ruby/object:RI::MethodSummary 
  name: find_mapped_soap_class
- !ruby/object:RI::MethodSummary 
  name: obj2soap
- !ruby/object:RI::MethodSummary 
  name: set
- !ruby/object:RI::MethodSummary 
  name: soap2obj
name: Registry
superclass: Object
PK�|[VG6.ri/1.8/system/SOAP/Mapping/Registry/set-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add"
full_name: SOAP::Mapping::Registry#set
is_singleton: false
name: set
params: (obj_class, soap_class, factory, info = nil)
visibility: public
PK�|[a;�#4ri/1.8/system/SOAP/Mapping/Registry/_soap2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Might return nil as a mapping result.
full_name: SOAP::Mapping::Registry#_soap2obj
is_singleton: false
name: _soap2obj
params: (node, klass = nil)
visibility: private
PK�|[�K��.ri/1.8/system/SOAP/Mapping/Registry/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: set
block_params: 
comment: 
full_name: SOAP::Mapping::Registry#add
is_singleton: false
name: add
params: (obj_class, soap_class, factory, info = nil)
visibility: public
PK�|[��#���.ri/1.8/system/SOAP/Mapping/Registry/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Registry::new
is_singleton: true
name: new
params: (config = {})
visibility: public
PK�|[0d���4ri/1.8/system/SOAP/Mapping/Registry/addiv2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Registry#addiv2obj
is_singleton: false
name: addiv2obj
params: (obj, attr)
visibility: private
PK�|[g��3ri/1.8/system/SOAP/Mapping/Registry/soap2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Registry#soap2obj
is_singleton: false
name: soap2obj
params: (node, klass = nil)
visibility: public
PK�|[%g����@ri/1.8/system/SOAP/Mapping/Registry/find_mapped_obj_class-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Registry#find_mapped_obj_class
is_singleton: false
name: find_mapped_obj_class
params: (soap_class)
visibility: public
PK�|[�q���9ri/1.8/system/SOAP/Mapping/Registry/addextend2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Registry#addextend2soap
is_singleton: false
name: addextend2soap
params: (node, obj)
visibility: private
PK�|[�� ��Eri/1.8/system/SOAP/Mapping/Registry/Map/find_mapped_soap_class-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Registry::Map#find_mapped_soap_class
is_singleton: false
name: find_mapped_soap_class
params: (target_obj_class)
visibility: public
PK�|[@>�	3ri/1.8/system/SOAP/Mapping/Registry/Map/init-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Give priority to former entry.
full_name: SOAP::Mapping::Registry::Map#init
is_singleton: false
name: init
params: (init_map = [])
visibility: public
PK�|[?1v���7ri/1.8/system/SOAP/Mapping/Registry/Map/obj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Registry::Map#obj2soap
is_singleton: false
name: obj2soap
params: (obj)
visibility: public
PK�|[�{$2ri/1.8/system/SOAP/Mapping/Registry/Map/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Give priority to latter entry.
full_name: SOAP::Mapping::Registry::Map#add
is_singleton: false
name: add
params: (obj_class, soap_class, factory, info)
visibility: public
PK�|[��hh6ri/1.8/system/SOAP/Mapping/Registry/Map/cdesc-Map.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::Mapping::Registry::Map
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: clear
- !ruby/object:RI::MethodSummary 
  name: find_mapped_obj_class
- !ruby/object:RI::MethodSummary 
  name: find_mapped_soap_class
- !ruby/object:RI::MethodSummary 
  name: init
- !ruby/object:RI::MethodSummary 
  name: obj2soap
- !ruby/object:RI::MethodSummary 
  name: soap2obj
name: Map
superclass: Object
PK�|[�$~
��2ri/1.8/system/SOAP/Mapping/Registry/Map/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Registry::Map::new
is_singleton: true
name: new
params: (registry)
visibility: public
PK�|[�����7ri/1.8/system/SOAP/Mapping/Registry/Map/soap2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Registry::Map#soap2obj
is_singleton: false
name: soap2obj
params: (node, klass = nil)
visibility: public
PK�|[,IV"��Dri/1.8/system/SOAP/Mapping/Registry/Map/find_mapped_obj_class-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Registry::Map#find_mapped_obj_class
is_singleton: false
name: find_mapped_obj_class
params: (target_soap_class)
visibility: public
PK�|[r�;��4ri/1.8/system/SOAP/Mapping/Registry/Map/clear-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Registry::Map#clear
is_singleton: false
name: clear
params: ()
visibility: public
PK�|[���i��6ri/1.8/system/SOAP/Mapping/schema_ns_definition-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::schema_ns_definition
is_singleton: true
name: schema_ns_definition
params: (klass)
visibility: public
PK�|[!<y��4ri/1.8/system/SOAP/Mapping/protect_threadvars-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
full_name: SOAP::Mapping::protect_threadvars
is_singleton: true
name: protect_threadvars
params: (*symbols) {|| ...}
visibility: private
PK�|[�E����;ri/1.8/system/SOAP/Mapping/schema_element_definition-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::schema_element_definition
is_singleton: true
name: schema_element_definition
params: (klass)
visibility: public
PK�|[̷0��6ri/1.8/system/SOAP/Mapping/Factory/setiv2struct-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Factory#setiv2struct
is_singleton: false
name: setiv2struct
params: (obj, node, map)
visibility: private
PK�|[4��;dd5ri/1.8/system/SOAP/Mapping/Factory/cdesc-Factory.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::Mapping::Factory
includes: 
- !ruby/object:RI::IncludedModule 
  name: TraverseSupport
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: obj2soap
- !ruby/object:RI::MethodSummary 
  name: setiv2ary
- !ruby/object:RI::MethodSummary 
  name: setiv2obj
- !ruby/object:RI::MethodSummary 
  name: setiv2soap
- !ruby/object:RI::MethodSummary 
  name: setiv2struct
- !ruby/object:RI::MethodSummary 
  name: soap2obj
name: Factory
superclass: Object
PK�|[>�A���2ri/1.8/system/SOAP/Mapping/Factory/obj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Factory#obj2soap
is_singleton: false
name: obj2soap
params: (soap_class, obj, info, map)
visibility: public
PK�|[Y�:��4ri/1.8/system/SOAP/Mapping/Factory/setiv2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Factory#setiv2soap
is_singleton: false
name: setiv2soap
params: (node, obj, map)
visibility: public
PK�|[F�f���-ri/1.8/system/SOAP/Mapping/Factory/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Factory::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[�:�F��2ri/1.8/system/SOAP/Mapping/Factory/soap2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Factory#soap2obj
is_singleton: false
name: soap2obj
params: (obj_class, node, info, map)
visibility: public
PK�|[eaeb��3ri/1.8/system/SOAP/Mapping/Factory/setiv2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Factory#setiv2obj
is_singleton: false
name: setiv2obj
params: (obj, node, map)
visibility: public
PK�|[�x���3ri/1.8/system/SOAP/Mapping/Factory/setiv2ary-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Factory#setiv2ary
is_singleton: false
name: setiv2ary
params: (obj, node, map)
visibility: private
PK�|[�^6*ri/1.8/system/SOAP/Mapping/ary2soap-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::ary2soap
is_singleton: true
name: ary2soap
params: (ary, type_ns = XSD::Namespace, typename = XSD::AnyTypeLiteral, registry = nil, opt = EMPTY_OPT)
visibility: public
PK�|[s��(ri/1.8/system/SOAP/Mapping/ary2md-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::ary2md
is_singleton: true
name: ary2md
params: (ary, rank, type_ns = XSD::Namespace, typename = XSD::AnyTypeLiteral, registry = nil, opt = EMPTY_OPT)
visibility: public
PK�|[���;ri/1.8/system/SOAP/Mapping/BasetypeFactory_/obj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::BasetypeFactory_#obj2soap
is_singleton: false
name: obj2soap
params: (soap_class, obj, info, map)
visibility: public
PK�|[�>kkGri/1.8/system/SOAP/Mapping/BasetypeFactory_/cdesc-BasetypeFactory_.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::Mapping::BasetypeFactory_
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: obj2soap
- !ruby/object:RI::MethodSummary 
  name: soap2obj
name: BasetypeFactory_
superclass: Factory
PK�|[P�]���6ri/1.8/system/SOAP/Mapping/BasetypeFactory_/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::BasetypeFactory_::new
is_singleton: true
name: new
params: (allow_original_mapping = false)
visibility: public
PK�|[��/���;ri/1.8/system/SOAP/Mapping/BasetypeFactory_/soap2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::BasetypeFactory_#soap2obj
is_singleton: false
name: soap2obj
params: (obj_class, node, info, map)
visibility: public
PK�|[9d�}��2ri/1.8/system/SOAP/Mapping/module_from_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::module_from_name
is_singleton: true
name: module_from_name
params: (name, lenient = false)
visibility: public
PK�|[��3���;ri/1.8/system/SOAP/Mapping/Object/__set_xmlele_value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Object#__set_xmlele_value
is_singleton: false
name: __set_xmlele_value
params: (key, org, value)
visibility: private
PK�|[�����/ri/1.8/system/SOAP/Mapping/Object/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Object#[]
is_singleton: false
name: "[]"
params: (qname)
visibility: public
PK�|[����?ri/1.8/system/SOAP/Mapping/Object/__define_attr_accessor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Object#__define_attr_accessor
is_singleton: false
name: __define_attr_accessor
params: (qname)
visibility: private
PK�|[�re��1ri/1.8/system/SOAP/Mapping/Object/__xmlele-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Object#__xmlele
is_singleton: false
name: __xmlele
params: ()
visibility: public
PK�|[*Ʒ�0ri/1.8/system/SOAP/Mapping/Object/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Object#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[7m�vv3ri/1.8/system/SOAP/Mapping/Object/cdesc-Object.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "For anyType object: SOAP::Mapping::Object not ::Object"
constants: []

full_name: SOAP::Mapping::Object
includes: 
- !ruby/object:RI::IncludedModule 
  name: Marshallable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: __add_xmlele_value
- !ruby/object:RI::MethodSummary 
  name: __define_attr_accessor
- !ruby/object:RI::MethodSummary 
  name: __define_attr_accessor
- !ruby/object:RI::MethodSummary 
  name: __set_xmlele_value
- !ruby/object:RI::MethodSummary 
  name: __xmlattr
- !ruby/object:RI::MethodSummary 
  name: __xmlele
- !ruby/object:RI::MethodSummary 
  name: inspect
name: Object
superclass: Object
PK�|[�v.���,ri/1.8/system/SOAP/Mapping/Object/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Object::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[!����2ri/1.8/system/SOAP/Mapping/Object/__xmlattr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Object#__xmlattr
is_singleton: false
name: __xmlattr
params: ()
visibility: public
PK�|[��7���;ri/1.8/system/SOAP/Mapping/Object/__add_xmlele_value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Object#__add_xmlele_value
is_singleton: false
name: __add_xmlele_value
params: (qname, value)
visibility: public
PK�|[�n;W��2ri/1.8/system/SOAP/Mapping/Object/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::Object#[]=
is_singleton: false
name: "[]="
params: (qname, value)
visibility: public
PK�|[�z
��Ori/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/schema_element_definition-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: it caches @@schema_element. this means that @@schema_element must not be changed while a lifetime of a WSDLLiteralRegistry.
full_name: SOAP::Mapping::WSDLLiteralRegistry#schema_element_definition
is_singleton: false
name: schema_element_definition
params: (klass)
visibility: private
PK�|[rl����Qri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/schema_attribute_definition-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#schema_attribute_definition
is_singleton: false
name: schema_attribute_definition
params: (klass)
visibility: private
PK�|[,-ho��Bri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/stubobj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#stubobj2soap
is_singleton: false
name: stubobj2soap
params: (obj, qname)
visibility: private
PK�|[e�\���Gri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/add_elements2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#add_elements2soap
is_singleton: false
name: add_elements2soap
params: (obj, ele)
visibility: private
PK�|[�٩<��Jri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/add_elements2stubobj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#add_elements2stubobj
is_singleton: false
name: add_elements2stubobj
params: (node, obj)
visibility: private
PK�|[����Iri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/add_attributes2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#add_attributes2soap
is_singleton: false
name: add_attributes2soap
params: (obj, ele)
visibility: private
PK�|[��O���Eri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/mappingobj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#mappingobj2soap
is_singleton: false
name: mappingobj2soap
params: (obj, qname)
visibility: private
PK�|[�Ux���>ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/obj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#obj2soap
is_singleton: false
name: obj2soap
params: (obj, qname)
visibility: public
PK�|[�����>ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/any2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#any2soap
is_singleton: false
name: any2soap
params: (obj, qname)
visibility: private
PK�|[b����Bri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/obj2typesoap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#obj2typesoap
is_singleton: false
name: obj2typesoap
params: (obj, type, qualified)
visibility: private
PK�|[�GB���Dri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/simpleobj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#simpleobj2soap
is_singleton: false
name: simpleobj2soap
params: (obj, type)
visibility: private
PK�|[�Kc���=ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/any2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#any2obj
is_singleton: false
name: any2obj
params: (node, obj_class = nil)
visibility: private
PK�|[�Vo���Ari/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/obj2elesoap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#obj2elesoap
is_singleton: false
name: obj2elesoap
params: (obj, ele)
visibility: private
PK�|[�<��9ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry::new
is_singleton: true
name: new
params: (definedtypes = XSD::NamedElements::Empty, definedelements = XSD::NamedElements::Empty)
visibility: public
PK�|[��>ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/soap2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: node should be a SOAPElement
full_name: SOAP::Mapping::WSDLLiteralRegistry#soap2obj
is_singleton: false
name: soap2obj
params: (node, obj_class = nil)
visibility: public
PK�|[2����Fri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/soapele2plainobj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#soapele2plainobj
is_singleton: false
name: soapele2plainobj
params: (node)
visibility: private
PK�|[L�\ϒ�Mri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/cdesc-WSDLLiteralRegistry.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: definedelements
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: definedtypes
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: excn_handler_obj2soap
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: excn_handler_soap2obj
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: MAPPING_OPT
  value: "{ :no_reference => true }"
full_name: SOAP::Mapping::WSDLLiteralRegistry
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_attributes2plainobj
- !ruby/object:RI::MethodSummary 
  name: add_attributes2soap
- !ruby/object:RI::MethodSummary 
  name: add_attributes2stubobj
- !ruby/object:RI::MethodSummary 
  name: add_elements2plainobj
- !ruby/object:RI::MethodSummary 
  name: add_elements2soap
- !ruby/object:RI::MethodSummary 
  name: add_elements2stubobj
- !ruby/object:RI::MethodSummary 
  name: any2obj
- !ruby/object:RI::MethodSummary 
  name: any2soap
- !ruby/object:RI::MethodSummary 
  name: anytype2obj
- !ruby/object:RI::MethodSummary 
  name: base2soap
- !ruby/object:RI::MethodSummary 
  name: complexobj2soap
- !ruby/object:RI::MethodSummary 
  name: define_xmlattr
- !ruby/object:RI::MethodSummary 
  name: define_xmlattr
- !ruby/object:RI::MethodSummary 
  name: define_xmlattr_accessor
- !ruby/object:RI::MethodSummary 
  name: define_xmlattr_accessor
- !ruby/object:RI::MethodSummary 
  name: mappingobj2soap
- !ruby/object:RI::MethodSummary 
  name: obj2elesoap
- !ruby/object:RI::MethodSummary 
  name: obj2soap
- !ruby/object:RI::MethodSummary 
  name: obj2typesoap
- !ruby/object:RI::MethodSummary 
  name: schema_attribute_definition
- !ruby/object:RI::MethodSummary 
  name: schema_element_definition
- !ruby/object:RI::MethodSummary 
  name: simpleobj2soap
- !ruby/object:RI::MethodSummary 
  name: soap2obj
- !ruby/object:RI::MethodSummary 
  name: soapele2plainobj
- !ruby/object:RI::MethodSummary 
  name: soapele2stubobj
- !ruby/object:RI::MethodSummary 
  name: stubobj2soap
name: WSDLLiteralRegistry
superclass: Registry
PK�|[�����Mri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/define_xmlattr_accessor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#define_xmlattr_accessor
is_singleton: false
name: define_xmlattr_accessor
params: (obj, qname)
visibility: private
PK�|[f����Kri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/add_elements2plainobj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#add_elements2plainobj
is_singleton: false
name: add_elements2plainobj
params: (node, obj)
visibility: private
PK�|[�;����Ari/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/anytype2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#anytype2obj
is_singleton: false
name: anytype2obj
params: (node)
visibility: private
PK�|[����Eri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/soapele2stubobj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#soapele2stubobj
is_singleton: false
name: soapele2stubobj
params: (node, obj_class)
visibility: private
PK�|[�/5���Lri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/add_attributes2stubobj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#add_attributes2stubobj
is_singleton: false
name: add_attributes2stubobj
params: (node, obj)
visibility: private
PK�|[|�E1��Mri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/add_attributes2plainobj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#add_attributes2plainobj
is_singleton: false
name: add_attributes2plainobj
params: (node, obj)
visibility: private
PK�|[-�#���?ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/base2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#base2soap
is_singleton: false
name: base2soap
params: (obj, type)
visibility: private
PK�|[Py���Dri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/define_xmlattr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#define_xmlattr
is_singleton: false
name: define_xmlattr
params: (obj)
visibility: private
PK�|[�*���Eri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/complexobj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLLiteralRegistry#complexobj2soap
is_singleton: false
name: complexobj2soap
params: (obj, type, qualified)
visibility: private
PK�|[�O���7ri/1.8/system/SOAP/Mapping/HashFactory_/obj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::HashFactory_#obj2soap
is_singleton: false
name: obj2soap
params: (soap_class, obj, info, map)
visibility: public
PK�|[��_cc?ri/1.8/system/SOAP/Mapping/HashFactory_/cdesc-HashFactory_.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::Mapping::HashFactory_
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: obj2soap
- !ruby/object:RI::MethodSummary 
  name: soap2obj
name: HashFactory_
superclass: Factory
PK�|[Fg}��2ri/1.8/system/SOAP/Mapping/HashFactory_/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::HashFactory_::new
is_singleton: true
name: new
params: (allow_original_mapping = false)
visibility: public
PK�|[f�hR��7ri/1.8/system/SOAP/Mapping/HashFactory_/soap2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::HashFactory_#soap2obj
is_singleton: false
name: soap2obj
params: (obj_class, node, info, map)
visibility: public
PK�|[���)��.ri/1.8/system/SOAP/Mapping/elename2name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::elename2name
is_singleton: true
name: elename2name
params: (name)
visibility: public
PK�|[^@Lw��/ri/1.8/system/SOAP/Mapping/class2element-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::class2element
is_singleton: true
name: class2element
params: (klass)
visibility: public
PK�|[0&��*ri/1.8/system/SOAP/Mapping/obj2soap-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::obj2soap
is_singleton: true
name: obj2soap
params: (obj, registry = nil, type = nil, opt = EMPTY_OPT)
visibility: public
PK�|[MQ-��-ri/1.8/system/SOAP/Mapping/obj2element-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::obj2element
is_singleton: true
name: obj2element
params: (obj)
visibility: public
PK�|[7����9ri/1.8/system/SOAP/Mapping/define_singleton_method-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::define_singleton_method
is_singleton: true
name: define_singleton_method
params: (obj, name, &block)
visibility: public
PK�|[L�ɛ��8ri/1.8/system/SOAP/Mapping/schema_type_definition-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::schema_type_definition
is_singleton: true
name: schema_type_definition
params: (klass)
visibility: public
PK�|[)�ۃ��6ri/1.8/system/SOAP/Mapping/URIFactory_/obj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::URIFactory_#obj2soap
is_singleton: false
name: obj2soap
params: (soap_class, obj, info, map)
visibility: public
PK�|[�WB��6ri/1.8/system/SOAP/Mapping/URIFactory_/soap2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::URIFactory_#soap2obj
is_singleton: false
name: soap2obj
params: (obj_class, node, info, map)
visibility: public
PK�|[	��66=ri/1.8/system/SOAP/Mapping/URIFactory_/cdesc-URIFactory_.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::Mapping::URIFactory_
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: obj2soap
- !ruby/object:RI::MethodSummary 
  name: soap2obj
name: URIFactory_
superclass: Factory
PK�|[/{SE��;ri/1.8/system/SOAP/Mapping/DateTimeFactory_/obj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::DateTimeFactory_#obj2soap
is_singleton: false
name: obj2soap
params: (soap_class, obj, info, map)
visibility: public
PK�|[R��'��6ri/1.8/system/SOAP/Mapping/DateTimeFactory_/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::DateTimeFactory_::new
is_singleton: true
name: new
params: (allow_original_mapping = false)
visibility: public
PK�|[��ʹ��;ri/1.8/system/SOAP/Mapping/DateTimeFactory_/soap2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::DateTimeFactory_#soap2obj
is_singleton: false
name: soap2obj
params: (obj_class, node, info, map)
visibility: public
PK�|[��kkGri/1.8/system/SOAP/Mapping/DateTimeFactory_/cdesc-DateTimeFactory_.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::Mapping::DateTimeFactory_
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: obj2soap
- !ruby/object:RI::MethodSummary 
  name: soap2obj
name: DateTimeFactory_
superclass: Factory
PK�|[����ggCri/1.8/system/SOAP/Mapping/StringFactory_/cdesc-StringFactory_.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::Mapping::StringFactory_
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: obj2soap
- !ruby/object:RI::MethodSummary 
  name: soap2obj
name: StringFactory_
superclass: Factory
PK�|[�T	@��9ri/1.8/system/SOAP/Mapping/StringFactory_/obj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::StringFactory_#obj2soap
is_singleton: false
name: obj2soap
params: (soap_class, obj, info, map)
visibility: public
PK�|[�
���4ri/1.8/system/SOAP/Mapping/StringFactory_/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::StringFactory_::new
is_singleton: true
name: new
params: (allow_original_mapping = false)
visibility: public
PK�|[�����9ri/1.8/system/SOAP/Mapping/StringFactory_/soap2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::StringFactory_#soap2obj
is_singleton: false
name: soap2obj
params: (obj_class, node, info, map)
visibility: public
PK�|[b�|��-ri/1.8/system/SOAP/Mapping/cdesc-Mapping.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: _obj2soap
- !ruby/object:RI::MethodSummary 
  name: _soap2obj
- !ruby/object:RI::MethodSummary 
  name: add_md_ary
- !ruby/object:RI::MethodSummary 
  name: ary2md
- !ruby/object:RI::MethodSummary 
  name: ary2soap
- !ruby/object:RI::MethodSummary 
  name: class2element
- !ruby/object:RI::MethodSummary 
  name: class2qname
- !ruby/object:RI::MethodSummary 
  name: class_from_name
- !ruby/object:RI::MethodSummary 
  name: class_schema_variable
- !ruby/object:RI::MethodSummary 
  name: const_from_name
- !ruby/object:RI::MethodSummary 
  name: create_empty_object
- !ruby/object:RI::MethodSummary 
  name: create_empty_object
- !ruby/object:RI::MethodSummary 
  name: define_attr_accessor
- !ruby/object:RI::MethodSummary 
  name: define_singleton_method
- !ruby/object:RI::MethodSummary 
  name: elename2name
- !ruby/object:RI::MethodSummary 
  name: fault2exception
- !ruby/object:RI::MethodSummary 
  name: get_attribute
- !ruby/object:RI::MethodSummary 
  name: module_from_name
- !ruby/object:RI::MethodSummary 
  name: name2elename
- !ruby/object:RI::MethodSummary 
  name: obj2element
- !ruby/object:RI::MethodSummary 
  name: obj2soap
- !ruby/object:RI::MethodSummary 
  name: protect_threadvars
- !ruby/object:RI::MethodSummary 
  name: schema_attribute_definition
- !ruby/object:RI::MethodSummary 
  name: schema_element_definition
- !ruby/object:RI::MethodSummary 
  name: schema_ns_definition
- !ruby/object:RI::MethodSummary 
  name: schema_type_definition
- !ruby/object:RI::MethodSummary 
  name: set_attributes
- !ruby/object:RI::MethodSummary 
  name: soap2obj
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: RubyTypeNamespace
  value: "'http://www.ruby-lang.org/xmlns/ruby/type/1.6'"
- !ruby/object:RI::Constant 
  comment: 
  name: RubyTypeInstanceNamespace
  value: "'http://www.ruby-lang.org/xmlns/ruby/type-instance'"
- !ruby/object:RI::Constant 
  comment: 
  name: RubyCustomTypeNamespace
  value: "'http://www.ruby-lang.org/xmlns/ruby/type/custom'"
- !ruby/object:RI::Constant 
  comment: 
  name: ApacheSOAPTypeNamespace
  value: "'http://xml.apache.org/xml-soap'"
- !ruby/object:RI::Constant 
  comment: 
  name: EMPTY_OPT
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  name: MARSHAL_TAG
  value: "{       String => ['\"', 1],       Regexp => ['/', 2],       Array => ['[', 1],       Hash => ['{', 1]"
- !ruby/object:RI::Constant 
  comment: 
  name: RubyTypeName
  value: XSD::QName.new(RubyTypeInstanceNamespace, 'rubyType')
- !ruby/object:RI::Constant 
  comment: 
  name: RubyExtendName
  value: XSD::QName.new(RubyTypeInstanceNamespace, 'extends')
- !ruby/object:RI::Constant 
  comment: 
  name: RubyIVarName
  value: XSD::QName.new(RubyTypeInstanceNamespace, 'ivars')
- !ruby/object:RI::Constant 
  comment: 
  name: DefaultRegistry
  value: Registry.new
- !ruby/object:RI::Constant 
  comment: 
  name: RubyOriginalRegistry
  value: Registry.new(:allow_original_mapping => true)
- !ruby/object:RI::Constant 
  comment: 
  name: MapQName
  value: XSD::QName.new(ApacheSOAPTypeNamespace, 'Map')
full_name: SOAP::Mapping
includes: []

instance_methods: []

name: Mapping
superclass: 
PK�|[�b����,ri/1.8/system/SOAP/Mapping/add_md_ary-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::add_md_ary
is_singleton: true
name: add_md_ary
params: (md_ary, ary, indices, registry)
visibility: private
PK�|[Aqy���>ri/1.8/system/SOAP/Mapping/TypedStructFactory_/obj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::TypedStructFactory_#obj2soap
is_singleton: false
name: obj2soap
params: (soap_class, obj, info, map)
visibility: public
PK�|[���Q��>ri/1.8/system/SOAP/Mapping/TypedStructFactory_/soap2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::TypedStructFactory_#soap2obj
is_singleton: false
name: soap2obj
params: (obj_class, node, info, map)
visibility: public
PK�|[��hFFMri/1.8/system/SOAP/Mapping/TypedStructFactory_/cdesc-TypedStructFactory_.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::Mapping::TypedStructFactory_
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: obj2soap
- !ruby/object:RI::MethodSummary 
  name: soap2obj
name: TypedStructFactory_
superclass: Factory
PK�|[�`q��<ri/1.8/system/SOAP/Mapping/AttachmentFactory/obj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::AttachmentFactory#obj2soap
is_singleton: false
name: obj2soap
params: (soap_class, obj, info, map)
visibility: public
PK�|[F�����<ri/1.8/system/SOAP/Mapping/AttachmentFactory/soap2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::AttachmentFactory#soap2obj
is_singleton: false
name: soap2obj
params: (obj_class, node, info, map)
visibility: public
PK�|[ �FQQIri/1.8/system/SOAP/Mapping/AttachmentFactory/cdesc-AttachmentFactory.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::Mapping::AttachmentFactory
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: obj2soap
- !ruby/object:RI::MethodSummary 
  name: soap2obj
name: AttachmentFactory
superclass: SOAP::Mapping::Factory
PK�|[��'���1ri/1.8/system/SOAP/Mapping/const_from_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::const_from_name
is_singleton: true
name: const_from_name
params: (name, lenient = false)
visibility: public
PK�|[ߪ���Ori/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/schema_element_definition-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: it caches @@schema_element. this means that @@schema_element must not be changed while a lifetime of a WSDLLiteralRegistry.
full_name: SOAP::Mapping::WSDLEncodedRegistry#schema_element_definition
is_singleton: false
name: schema_element_definition
params: (klass)
visibility: private
PK�|[HDr��Jri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/add_elements2stubobj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLEncodedRegistry#add_elements2stubobj
is_singleton: false
name: add_elements2stubobj
params: (node, obj)
visibility: private
PK�|[��_
��>ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/obj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLEncodedRegistry#obj2soap
is_singleton: false
name: obj2soap
params: (obj, qname = nil)
visibility: public
PK�|[	����>ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/any2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLEncodedRegistry#any2soap
is_singleton: false
name: any2soap
params: (obj, qname)
visibility: private
PK�|[Z0���Bri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/obj2typesoap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLEncodedRegistry#obj2typesoap
is_singleton: false
name: obj2typesoap
params: (obj, type)
visibility: private
PK�|[8H���Bri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/soap2stubobj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLEncodedRegistry#soap2stubobj
is_singleton: false
name: soap2stubobj
params: (node, obj_class)
visibility: private
PK�|[�����Dri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/simpleobj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLEncodedRegistry#simpleobj2soap
is_singleton: false
name: simpleobj2soap
params: (obj, type)
visibility: private
PK�|[ 2�[��=ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/any2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLEncodedRegistry#any2obj
is_singleton: false
name: any2obj
params: (node, obj_class)
visibility: private
PK�|[�K�J��Ari/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/struct2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLEncodedRegistry#struct2soap
is_singleton: false
name: struct2soap
params: (obj, type_qname, type)
visibility: private
PK�|[B>����9ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLEncodedRegistry::new
is_singleton: true
name: new
params: (definedtypes = XSD::NamedElements::Empty)
visibility: public
PK�|[�fF==>ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/soap2obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "map anything for now: must refer WSDL while mapping. [ToDo]"
full_name: SOAP::Mapping::WSDLEncodedRegistry#soap2obj
is_singleton: false
name: soap2obj
params: (node, obj_class = nil)
visibility: public
PK�|[���Cri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/elements2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLEncodedRegistry#elements2soap
is_singleton: false
name: elements2soap
params: (obj, soap_obj, elements)
visibility: private
PK�|[wj�â�Mri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/cdesc-WSDLEncodedRegistry.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: definedelements
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: definedtypes
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: excn_handler_obj2soap
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: excn_handler_soap2obj
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: MapKeyName
  value: XSD::QName.new(nil, "key")
- !ruby/object:RI::Constant 
  comment: 
  name: MapValueName
  value: XSD::QName.new(nil, "value")
full_name: SOAP::Mapping::WSDLEncodedRegistry
includes: 
- !ruby/object:RI::IncludedModule 
  name: TraverseSupport
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_elements2stubobj
- !ruby/object:RI::MethodSummary 
  name: any2obj
- !ruby/object:RI::MethodSummary 
  name: any2soap
- !ruby/object:RI::MethodSummary 
  name: array2soap
- !ruby/object:RI::MethodSummary 
  name: base2soap
- !ruby/object:RI::MethodSummary 
  name: complexobj2soap
- !ruby/object:RI::MethodSummary 
  name: elements2soap
- !ruby/object:RI::MethodSummary 
  name: map2soap
- !ruby/object:RI::MethodSummary 
  name: obj2soap
- !ruby/object:RI::MethodSummary 
  name: obj2typesoap
- !ruby/object:RI::MethodSummary 
  name: schema_element_definition
- !ruby/object:RI::MethodSummary 
  name: simpleobj2soap
- !ruby/object:RI::MethodSummary 
  name: soap2obj
- !ruby/object:RI::MethodSummary 
  name: soap2soap
- !ruby/object:RI::MethodSummary 
  name: soap2stubobj
- !ruby/object:RI::MethodSummary 
  name: struct2soap
name: WSDLEncodedRegistry
superclass: Registry
PK�|[�Xv1��?ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/soap2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLEncodedRegistry#soap2soap
is_singleton: false
name: soap2soap
params: (obj, type_qname)
visibility: private
PK�|[����>ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/map2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLEncodedRegistry#map2soap
is_singleton: false
name: map2soap
params: (obj, type_qname, type)
visibility: private
PK�|[���&��?ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/base2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLEncodedRegistry#base2soap
is_singleton: false
name: base2soap
params: (obj, type)
visibility: private
PK�|[6^H��@ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/array2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLEncodedRegistry#array2soap
is_singleton: false
name: array2soap
params: (obj, type_qname, type)
visibility: private
PK�|[��H"��Eri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/complexobj2soap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Mapping::WSDLEncodedRegistry#complexobj2soap
is_singleton: false
name: complexobj2soap
params: (obj, type)
visibility: private
PK�|[����NNAri/1.8/system/SOAP/SOAPAnySimpleType/cdesc-SOAPAnySimpleType.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Basic datatypes.
constants: []

full_name: SOAP::SOAPAnySimpleType
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPAnySimpleType
superclass: XSD::XSDAnySimpleType
PK�|[�=ͺ�ri/1.8/system/SOAP/post-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP#post
is_singleton: false
name: post
params: (url, req_body, header = {})
visibility: public
PK�|[{�Ȋ��5ri/1.8/system/SOAP/StreamError/cdesc-StreamError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::StreamError
includes: []

instance_methods: []

name: StreamError
superclass: Error
PK�|[G^�MEri/1.8/system/SOAP/SOAPNegativeInteger/cdesc-SOAPNegativeInteger.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPNegativeInteger
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPNegativeInteger
superclass: XSD::XSDNegativeInteger
PK�|[w<`��0ri/1.8/system/SOAP/SOAPFault/faultcode%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPFault#faultcode=
is_singleton: false
name: faultcode=
params: (rhs)
visibility: public
PK�|[|t����*ri/1.8/system/SOAP/SOAPFault/encode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (self.faultcode)
comment: 
full_name: SOAP::SOAPFault#encode
is_singleton: false
name: encode
params: (generator, ns, attrs = {}) {|self.faultcode| ...}
visibility: public
PK�|[�
d5��/ri/1.8/system/SOAP/SOAPFault/faultstring-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPFault#faultstring
is_singleton: false
name: faultstring
params: ()
visibility: public
PK�|[�2`>>1ri/1.8/system/SOAP/SOAPFault/cdesc-SOAPFault.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::SOAPFault
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPEnvelopeElement
- !ruby/object:RI::IncludedModule 
  name: SOAPCompoundtype
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: detail
- !ruby/object:RI::MethodSummary 
  name: detail=
- !ruby/object:RI::MethodSummary 
  name: encode
- !ruby/object:RI::MethodSummary 
  name: faultactor
- !ruby/object:RI::MethodSummary 
  name: faultactor=
- !ruby/object:RI::MethodSummary 
  name: faultcode
- !ruby/object:RI::MethodSummary 
  name: faultcode=
- !ruby/object:RI::MethodSummary 
  name: faultstring
- !ruby/object:RI::MethodSummary 
  name: faultstring=
name: SOAPFault
superclass: SOAPStruct
PK�|[�x�h��1ri/1.8/system/SOAP/SOAPFault/faultactor%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPFault#faultactor=
is_singleton: false
name: faultactor=
params: (rhs)
visibility: public
PK�|[�܂���*ri/1.8/system/SOAP/SOAPFault/detail-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPFault#detail
is_singleton: false
name: detail
params: ()
visibility: public
PK�|[eN���'ri/1.8/system/SOAP/SOAPFault/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPFault::new
is_singleton: true
name: new
params: (faultcode = nil, faultstring = nil, faultactor = nil, detail = nil)
visibility: public
PK�|[�ڬ���-ri/1.8/system/SOAP/SOAPFault/faultcode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPFault#faultcode
is_singleton: false
name: faultcode
params: ()
visibility: public
PK�|[V�ʹ�-ri/1.8/system/SOAP/SOAPFault/detail%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPFault#detail=
is_singleton: false
name: detail=
params: (rhs)
visibility: public
PK�|[cjO���.ri/1.8/system/SOAP/SOAPFault/faultactor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPFault#faultactor
is_singleton: false
name: faultactor
params: ()
visibility: public
PK�|[�\�w��2ri/1.8/system/SOAP/SOAPFault/faultstring%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPFault#faultstring=
is_singleton: false
name: faultstring=
params: (rhs)
visibility: public
PK�|[L�T�yy;ri/1.8/system/SOAP/SOAPHeaderItem/cdesc-SOAPHeaderItem.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: element
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: encodingstyle
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: mustunderstand
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::SOAPHeaderItem
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPEnvelopeElement
- !ruby/object:RI::IncludedModule 
  name: SOAPCompoundtype
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: encode
name: SOAPHeaderItem
superclass: XSD::NSDBase
PK�|[Ӗ����/ri/1.8/system/SOAP/SOAPHeaderItem/encode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (@element)
comment: 
full_name: SOAP::SOAPHeaderItem#encode
is_singleton: false
name: encode
params: (generator, ns, attrs = {}) {|@element| ...}
visibility: public
PK�|[D��4��,ri/1.8/system/SOAP/SOAPHeaderItem/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPHeaderItem::new
is_singleton: true
name: new
params: (element, mustunderstand = true, encodingstyle = nil)
visibility: public
PK�|[�2\++3ri/1.8/system/SOAP/FaultError/cdesc-FaultError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: detail
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: faultactor
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: faultcode
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: faultstring
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::FaultError
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_s
name: FaultError
superclass: Error
PK�|[tJ�W��(ri/1.8/system/SOAP/FaultError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::FaultError::new
is_singleton: true
name: new
params: (fault)
visibility: public
PK�|[�֑��)ri/1.8/system/SOAP/FaultError/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::FaultError#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[vx
H;ri/1.8/system/SOAP/SOAPGYearMonth/cdesc-SOAPGYearMonth.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPGYearMonth
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPGYearMonth
superclass: XSD::XSDGYearMonth
PK�|[ˁ}#1ri/1.8/system/SOAP/SOAPFloat/cdesc-SOAPFloat.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPFloat
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPFloat
superclass: XSD::XSDFloat
PK�|[�����ri/1.8/system/SOAP/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::new
is_singleton: true
name: new
params: (proxy = nil, agent = nil)
visibility: public
PK�|[�E=i3ri/1.8/system/SOAP/SOAPAnyURI/cdesc-SOAPAnyURI.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPAnyURI
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPAnyURI
superclass: XSD::XSDAnyURI
PK�|[��3ri/1.8/system/SOAP/SOAPGMonth/cdesc-SOAPGMonth.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPGMonth
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPGMonth
superclass: XSD::XSDGMonth
PK�|[��K+��8ri/1.8/system/SOAP/SOAPExternalReference/refidstr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPExternalReference#refidstr
is_singleton: false
name: refidstr
params: ()
visibility: public
PK�|[bTE)��8ri/1.8/system/SOAP/SOAPExternalReference/referred-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPExternalReference#referred
is_singleton: false
name: referred
params: ()
visibility: public
PK�|[})VK��3ri/1.8/system/SOAP/SOAPExternalReference/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPExternalReference::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[Y)5���Iri/1.8/system/SOAP/SOAPExternalReference/cdesc-SOAPExternalReference.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::SOAPExternalReference
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: external_contentid
- !ruby/object:RI::MethodSummary 
  name: referred
- !ruby/object:RI::MethodSummary 
  name: refidstr
name: SOAPExternalReference
superclass: XSD::NSDBase
PK�|[�yN���Bri/1.8/system/SOAP/SOAPExternalReference/external_contentid-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPExternalReference#external_contentid
is_singleton: false
name: external_contentid
params: ()
visibility: private
PK�|[\���ri/1.8/system/SOAP/start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (worker)
comment: 
full_name: SOAP#start
is_singleton: false
name: start
params: (url) {|worker| ...}
visibility: private
PK�|[Ҷ4##8ri/1.8/system/SOAP/WSDLDriverFactory/createDriver-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #create_driver"
full_name: SOAP::WSDLDriverFactory#createDriver
is_singleton: false
name: createDriver
params: (servicename = nil, portname = nil)
visibility: public
PK�|[w�����5ri/1.8/system/SOAP/WSDLDriverFactory/partqname-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriverFactory#partqname
is_singleton: false
name: partqname
params: (part)
visibility: private
PK�|[��x��3ri/1.8/system/SOAP/WSDLDriverFactory/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriverFactory#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[^<J��Ari/1.8/system/SOAP/WSDLDriverFactory/cdesc-WSDLDriverFactory.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: wsdl
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::WSDLDriverFactory
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_operation
- !ruby/object:RI::MethodSummary 
  name: createDriver
- !ruby/object:RI::MethodSummary 
  name: create_driver
- !ruby/object:RI::MethodSummary 
  name: create_param_def
- !ruby/object:RI::MethodSummary 
  name: create_rpc_driver
- !ruby/object:RI::MethodSummary 
  name: filter_parts
- !ruby/object:RI::MethodSummary 
  name: find_port
- !ruby/object:RI::MethodSummary 
  name: import
- !ruby/object:RI::MethodSummary 
  name: init_driver
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: param_def
- !ruby/object:RI::MethodSummary 
  name: partqname
name: WSDLDriverFactory
superclass: Object
PK�|[X���=ri/1.8/system/SOAP/WSDLDriverFactory/create_rpc_driver-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriverFactory#create_rpc_driver
is_singleton: false
name: create_rpc_driver
params: (servicename = nil, portname = nil)
visibility: public
PK�|[)<�ֵ�/ri/1.8/system/SOAP/WSDLDriverFactory/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriverFactory::new
is_singleton: true
name: new
params: (wsdl)
visibility: public
PK�|[��^�SS9ri/1.8/system/SOAP/WSDLDriverFactory/create_driver-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: createDriver
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: depricated old interface
full_name: SOAP::WSDLDriverFactory#create_driver
is_singleton: false
name: create_driver
params: (servicename = nil, portname = nil)
visibility: public
PK�|[�~����7ri/1.8/system/SOAP/WSDLDriverFactory/init_driver-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriverFactory#init_driver
is_singleton: false
name: init_driver
params: (drv, port)
visibility: private
PK�|[�v���9ri/1.8/system/SOAP/WSDLDriverFactory/add_operation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriverFactory#add_operation
is_singleton: false
name: add_operation
params: (drv, port)
visibility: private
PK�|[9wQ��5ri/1.8/system/SOAP/WSDLDriverFactory/param_def-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriverFactory#param_def
is_singleton: false
name: param_def
params: (type, name, klass, partqname)
visibility: private
PK�|[+kO��5ri/1.8/system/SOAP/WSDLDriverFactory/find_port-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriverFactory#find_port
is_singleton: false
name: find_port
params: (servicename = nil, portname = nil)
visibility: private
PK�|[�|����Iri/1.8/system/SOAP/WSDLDriverFactory/FactoryError/cdesc-FactoryError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::WSDLDriverFactory::FactoryError
includes: []

instance_methods: []

name: FactoryError
superclass: StandardError
PK�|[� ���8ri/1.8/system/SOAP/WSDLDriverFactory/filter_parts-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriverFactory#filter_parts
is_singleton: false
name: filter_parts
params: (partsdef, partssource)
visibility: private
PK�|[0�ڀ��<ri/1.8/system/SOAP/WSDLDriverFactory/create_param_def-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriverFactory#create_param_def
is_singleton: false
name: create_param_def
params: (op_bind)
visibility: private
PK�|[˽n��2ri/1.8/system/SOAP/WSDLDriverFactory/import-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::WSDLDriverFactory#import
is_singleton: false
name: import
params: (location)
visibility: private
PK�|[��ĸ�0ri/1.8/system/SOAP/SOAPGenerator/prologue-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPGenerator#prologue
is_singleton: false
name: prologue
params: ()
visibility: private
PK�|[�z���Ori/1.8/system/SOAP/SOAPGenerator/FormatEncodeError/cdesc-FormatEncodeError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPGenerator::FormatEncodeError
includes: []

instance_methods: []

name: FormatEncodeError
superclass: Error
PK�|[Кs(��5ri/1.8/system/SOAP/SOAPGenerator/encode_string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPGenerator#encode_string
is_singleton: false
name: encode_string
params: (str)
visibility: public
PK�|[�>��9ri/1.8/system/SOAP/SOAPGenerator/cdesc-SOAPGenerator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: charset
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: default_encodingstyle
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: generate_explicit_type
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: use_numeric_character_reference
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: assign_ns
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "CAUTION: MT-unsafe"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: EncodeMap
  value: "{     '&' => '&amp;',     '<' => '&lt;',     '>' => '&gt;',     '\"' => '&quot;',     '\\'' => '&apos;',     \"\\r\" => '&#xd;'"
- !ruby/object:RI::Constant 
  comment: 
  name: EncodeCharRegexp
  value: Regexp.new("[#{EncodeMap.keys.join}]")
full_name: SOAP::SOAPGenerator
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAP
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_reftarget
- !ruby/object:RI::MethodSummary 
  name: element_local?
- !ruby/object:RI::MethodSummary 
  name: element_qualified?
- !ruby/object:RI::MethodSummary 
  name: encode_child
- !ruby/object:RI::MethodSummary 
  name: encode_data
- !ruby/object:RI::MethodSummary 
  name: encode_element
- !ruby/object:RI::MethodSummary 
  name: encode_name
- !ruby/object:RI::MethodSummary 
  name: encode_name_end
- !ruby/object:RI::MethodSummary 
  name: encode_rawstring
- !ruby/object:RI::MethodSummary 
  name: encode_string
- !ruby/object:RI::MethodSummary 
  name: encode_tag
- !ruby/object:RI::MethodSummary 
  name: encode_tag_end
- !ruby/object:RI::MethodSummary 
  name: epilogue
- !ruby/object:RI::MethodSummary 
  name: find_handler
- !ruby/object:RI::MethodSummary 
  name: generate
- !ruby/object:RI::MethodSummary 
  name: prologue
- !ruby/object:RI::MethodSummary 
  name: xmldecl
name: SOAPGenerator
superclass: Object
PK�|[~zn��/ri/1.8/system/SOAP/SOAPGenerator/xmldecl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPGenerator#xmldecl
is_singleton: false
name: xmldecl
params: ()
visibility: private
PK�|[�ov~��2ri/1.8/system/SOAP/SOAPGenerator/encode_tag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPGenerator#encode_tag
is_singleton: false
name: encode_tag
params: (elename, attrs = nil)
visibility: public
PK�|[	{%��6ri/1.8/system/SOAP/SOAPGenerator/encode_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPGenerator#encode_element
is_singleton: false
name: encode_element
params: (ns, obj, parent)
visibility: public
PK�|[������4ri/1.8/system/SOAP/SOAPGenerator/find_handler-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPGenerator#find_handler
is_singleton: false
name: find_handler
params: (encodingstyle)
visibility: private
PK�|[D,���+ri/1.8/system/SOAP/SOAPGenerator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPGenerator::new
is_singleton: true
name: new
params: (opt = {})
visibility: public
PK�|[��q��0ri/1.8/system/SOAP/SOAPGenerator/epilogue-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPGenerator#epilogue
is_singleton: false
name: epilogue
params: ()
visibility: private
PK�|[�n����6ri/1.8/system/SOAP/SOAPGenerator/encode_tag_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPGenerator#encode_tag_end
is_singleton: false
name: encode_tag_end
params: (elename, cr = nil)
visibility: public
PK�|[<*�k��8ri/1.8/system/SOAP/SOAPGenerator/encode_rawstring-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPGenerator#encode_rawstring
is_singleton: false
name: encode_rawstring
params: (str)
visibility: public
PK�|[q��b��3ri/1.8/system/SOAP/SOAPGenerator/encode_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPGenerator#encode_name
is_singleton: false
name: encode_name
params: (ns, data, attrs)
visibility: public
PK�|[�q�6��1ri/1.8/system/SOAP/SOAPGenerator/assign_ns-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPGenerator::assign_ns
is_singleton: true
name: assign_ns
params: (attrs, ns, namespace, tag = nil)
visibility: public
PK�|[��wH��4ri/1.8/system/SOAP/SOAPGenerator/encode_child-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPGenerator#encode_child
is_singleton: false
name: encode_child
params: (ns, child, parent)
visibility: public
PK�|[)�����<ri/1.8/system/SOAP/SOAPGenerator/element_qualified%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPGenerator#element_qualified?
is_singleton: false
name: element_qualified?
params: (element)
visibility: public
PK�|[8
����7ri/1.8/system/SOAP/SOAPGenerator/encode_name_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPGenerator#encode_name_end
is_singleton: false
name: encode_name_end
params: (ns, data)
visibility: public
PK�|[����3ri/1.8/system/SOAP/SOAPGenerator/encode_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPGenerator#encode_data
is_singleton: false
name: encode_data
params: (ns, obj, parent)
visibility: public
PK�|[_����5ri/1.8/system/SOAP/SOAPGenerator/add_reftarget-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPGenerator#add_reftarget
is_singleton: false
name: add_reftarget
params: (name, node)
visibility: public
PK�|[�LP���8ri/1.8/system/SOAP/SOAPGenerator/element_local%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPGenerator#element_local?
is_singleton: false
name: element_local?
params: (element)
visibility: public
PK�|[�-���0ri/1.8/system/SOAP/SOAPGenerator/generate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPGenerator#generate
is_singleton: false
name: generate
params: (obj, io = nil)
visibility: public
PK�|[����5ri/1.8/system/SOAP/SOAPBoolean/cdesc-SOAPBoolean.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPBoolean
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPBoolean
superclass: XSD::XSDBoolean
PK�|[�
��0ri/1.8/system/SOAP/test_loopback_response-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP#test_loopback_response
is_singleton: false
name: test_loopback_response
params: ()
visibility: public
PK�|[bT_;1ri/1.8/system/SOAP/SOAPQName/cdesc-SOAPQName.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPQName
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPQName
superclass: XSD::XSDQName
PK�|[�wh���9ri/1.8/system/SOAP/Processor/default_parser_option-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Processor::default_parser_option
is_singleton: true
name: default_parser_option
params: ()
visibility: public
PK�|[≮��4ri/1.8/system/SOAP/Processor/create_generator-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Processor::create_generator
is_singleton: true
name: create_generator
params: (opt)
visibility: private
PK�|[�;A1ri/1.8/system/SOAP/Processor/cdesc-Processor.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: create_generator
- !ruby/object:RI::MethodSummary 
  name: create_parser
- !ruby/object:RI::MethodSummary 
  name: default_parser_option
- !ruby/object:RI::MethodSummary 
  name: default_parser_option=
- !ruby/object:RI::MethodSummary 
  name: marshal
- !ruby/object:RI::MethodSummary 
  name: unmarshal
comment: 
constants: []

full_name: SOAP::Processor
includes: []

instance_methods: []

name: Processor
superclass: 
PK�|[fU-��+ri/1.8/system/SOAP/Processor/marshal-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Processor::marshal
is_singleton: true
name: marshal
params: (env, opt = {}, io = nil)
visibility: public
PK�|[�Iن��-ri/1.8/system/SOAP/Processor/unmarshal-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Processor::unmarshal
is_singleton: true
name: unmarshal
params: (stream, opt = {})
visibility: public
PK�|[���$��<ri/1.8/system/SOAP/Processor/default_parser_option%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Processor::default_parser_option=
is_singleton: true
name: default_parser_option=
params: (rhs)
visibility: public
PK�|[��
%��1ri/1.8/system/SOAP/Processor/create_parser-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Processor::create_parser
is_singleton: true
name: create_parser
params: (opt)
visibility: private
PK�|[�m��aa-ri/1.8/system/SOAP/Marshal/cdesc-Marshal.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: dump
- !ruby/object:RI::MethodSummary 
  name: load
- !ruby/object:RI::MethodSummary 
  name: marshal
- !ruby/object:RI::MethodSummary 
  name: unmarshal
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Trying xsd:dateTime data to be recovered as aTime.
  name: MarshalMappingRegistry
  value: Mapping::Registry.new(     :allow_original_mapping => true)
full_name: SOAP::Marshal
includes: []

instance_methods: []

name: Marshal
superclass: 
PK�|[��{���&ri/1.8/system/SOAP/Marshal/dump-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Marshal::dump
is_singleton: true
name: dump
params: (obj, io = nil)
visibility: public
PK�|[�W:���&ri/1.8/system/SOAP/Marshal/load-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Marshal::load
is_singleton: true
name: load
params: (stream)
visibility: public
PK�|[/03��)ri/1.8/system/SOAP/Marshal/marshal-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Marshal::marshal
is_singleton: true
name: marshal
params: (obj, mapping_registry = MarshalMappingRegistry, io = nil)
visibility: public
PK�|[S��
��+ri/1.8/system/SOAP/Marshal/unmarshal-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Marshal::unmarshal
is_singleton: true
name: unmarshal
params: (stream, mapping_registry = MarshalMappingRegistry)
visibility: public
PK�|[]]��;ri/1.8/system/SOAP/SOAPAttachment/cdesc-SOAPAttachment.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: data
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::SOAPAttachment
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: external_contentid
name: SOAPAttachment
superclass: SOAPExternalReference
PK�|[�j��,ri/1.8/system/SOAP/SOAPAttachment/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPAttachment::new
is_singleton: true
name: new
params: (value)
visibility: public
PK�|[v�)��;ri/1.8/system/SOAP/SOAPAttachment/external_contentid-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPAttachment#external_contentid
is_singleton: false
name: external_contentid
params: ()
visibility: private
PK�|[ZNFZ��6ri/1.8/system/SOAP/HTTPConfigLoader/set_options-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::HTTPConfigLoader#set_options
is_singleton: false
name: set_options
params: (client, options)
visibility: public
PK�|[���>��9ri/1.8/system/SOAP/HTTPConfigLoader/ssl_config_int-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::HTTPConfigLoader#ssl_config_int
is_singleton: false
name: ssl_config_int
params: (value)
visibility: public
PK�|[���l��8ri/1.8/system/SOAP/HTTPConfigLoader/key_from_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::HTTPConfigLoader#key_from_file
is_singleton: false
name: key_from_file
params: (filename)
visibility: public
PK�|[[U����9ri/1.8/system/SOAP/HTTPConfigLoader/cert_from_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::HTTPConfigLoader#cert_from_file
is_singleton: false
name: cert_from_file
params: (filename)
visibility: public
PK�|[�˳��9ri/1.8/system/SOAP/HTTPConfigLoader/set_ssl_config-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::HTTPConfigLoader#set_ssl_config
is_singleton: false
name: set_ssl_config
params: (client, ssl_config)
visibility: public
PK�|[.�:W?ri/1.8/system/SOAP/HTTPConfigLoader/cdesc-HTTPConfigLoader.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::HTTPConfigLoader
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: cert_from_file
- !ruby/object:RI::MethodSummary 
  name: key_from_file
- !ruby/object:RI::MethodSummary 
  name: set_basic_auth
- !ruby/object:RI::MethodSummary 
  name: set_options
- !ruby/object:RI::MethodSummary 
  name: set_ssl_config
- !ruby/object:RI::MethodSummary 
  name: ssl_config_int
name: HTTPConfigLoader
superclass: 
PK�|[~��9ri/1.8/system/SOAP/HTTPConfigLoader/set_basic_auth-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::HTTPConfigLoader#set_basic_auth
is_singleton: false
name: set_basic_auth
params: (client, basic_auth)
visibility: public
PK�|[�ͱ��;ri/1.8/system/SOAP/SessionManager/cdesc-SessionManager.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: connect_timeout
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: receive_timeout
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: send_timeout
  rw: RW
class_methods: []

comment: 
constants: []

full_name: SOAP::SessionManager
includes: []

instance_methods: []

name: SessionManager
superclass: Object
PK�|[c�2n��-ri/1.8/system/SOAP/SOAPInt/cdesc-SOAPInt.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPInt
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPInt
superclass: XSD::XSDInt
PK�|[�i�m��1ri/1.8/system/SOAP/MIMEMessage/content_str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage#content_str
is_singleton: false
name: content_str
params: ()
visibility: public
PK�|[���==7ri/1.8/system/SOAP/MIMEMessage/Header/cdesc-Header.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: key
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: root
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: str
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::MIMEMessage::Header
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Header
superclass: Object
PK�|[�0���3ri/1.8/system/SOAP/MIMEMessage/Header/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage::Header#[]
is_singleton: false
name: "[]"
params: (key)
visibility: public
PK�|[����0ri/1.8/system/SOAP/MIMEMessage/Header/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage::Header::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[�c4��1ri/1.8/system/SOAP/MIMEMessage/Header/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage::Header#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[�i
���6ri/1.8/system/SOAP/MIMEMessage/Header/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage::Header#[]=
is_singleton: false
name: "[]="
params: (key, value)
visibility: public
PK�|[�|jx��0ri/1.8/system/SOAP/MIMEMessage/Part/parse-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage::Part::parse
is_singleton: true
name: parse
params: (str)
visibility: public
PK�|[}�Ȋ��0ri/1.8/system/SOAP/MIMEMessage/Part/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage::Part#parse
is_singleton: false
name: parse
params: (str)
visibility: public
PK�|[߯oV333ri/1.8/system/SOAP/MIMEMessage/Part/cdesc-Part.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: body
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: headers
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: parse
comment: 
constants: []

full_name: SOAP::MIMEMessage::Part
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: contentid
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Part
superclass: Object
PK�|[M�i��.ri/1.8/system/SOAP/MIMEMessage/Part/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage::Part::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[�c�A��/ri/1.8/system/SOAP/MIMEMessage/Part/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage::Part#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[�Z���4ri/1.8/system/SOAP/MIMEMessage/Part/contentid-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage::Part#contentid
is_singleton: false
name: contentid
params: ()
visibility: public
PK�|[ID[��2ri/1.8/system/SOAP/MIMEMessage/has_parts%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage#has_parts?
is_singleton: false
name: has_parts?
params: ()
visibility: public
PK�|[�,�T��+ri/1.8/system/SOAP/MIMEMessage/parse-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage::parse
is_singleton: true
name: parse
params: (head, str)
visibility: public
PK�|[�G��*ri/1.8/system/SOAP/MIMEMessage/root-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage#root
is_singleton: false
name: root
params: ()
visibility: public
PK�|[Oum���+ri/1.8/system/SOAP/MIMEMessage/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage#parse
is_singleton: false
name: parse
params: (head, str)
visibility: public
PK�|[^�+O��.ri/1.8/system/SOAP/MIMEMessage/boundary-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage#boundary
is_singleton: false
name: boundary
params: ()
visibility: public
PK�|[O91��4ri/1.8/system/SOAP/MIMEMessage/add_attachment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage#add_attachment
is_singleton: false
name: add_attachment
params: (attach)
visibility: public
PK�|[w����3ri/1.8/system/SOAP/MIMEMessage/Headers/parse-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage::Headers::parse
is_singleton: true
name: parse
params: (str)
visibility: public
PK�|[�AG��3ri/1.8/system/SOAP/MIMEMessage/Headers/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage::Headers#parse
is_singleton: false
name: parse
params: (str)
visibility: public
PK�|[9R��1ri/1.8/system/SOAP/MIMEMessage/Headers/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage::Headers#add
is_singleton: false
name: add
params: (key, value)
visibility: public
PK�|[�XV��9ri/1.8/system/SOAP/MIMEMessage/Headers/cdesc-Headers.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse
comment: 
constants: []

full_name: SOAP::MIMEMessage::Headers
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: parse_line
- !ruby/object:RI::MethodSummary 
  name: parse_rhs
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Headers
superclass: Hash
PK�|[ ����7ri/1.8/system/SOAP/MIMEMessage/Headers/parse_rhs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage::Headers#parse_rhs
is_singleton: false
name: parse_rhs
params: (str)
visibility: public
PK�|[ZH� ��2ri/1.8/system/SOAP/MIMEMessage/Headers/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage::Headers#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[a ���8ri/1.8/system/SOAP/MIMEMessage/Headers/parse_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage::Headers#parse_line
is_singleton: false
name: parse_line
params: (line)
visibility: public
PK�|[�T�f��)ri/1.8/system/SOAP/MIMEMessage/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[�Li��5ri/1.8/system/SOAP/MIMEMessage/cdesc-MIMEMessage.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: headers
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: parts
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: parse
comment: 
- !ruby/struct:SM::Flow::P 
  body: Classes for MIME message handling. Should be put somewhere else! Tried using the 'tmail' module but found that I needed something lighter in weight.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: MultipartContentType
  value: "'multipart/\\w+'"
full_name: SOAP::MIMEMessage
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_attachment
- !ruby/object:RI::MethodSummary 
  name: add_part
- !ruby/object:RI::MethodSummary 
  name: boundary
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: content_str
- !ruby/object:RI::MethodSummary 
  name: has_parts?
- !ruby/object:RI::MethodSummary 
  name: headers_str
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: root
- !ruby/object:RI::MethodSummary 
  name: to_s
name: MIMEMessage
superclass: Object
PK�|[~CBμ�.ri/1.8/system/SOAP/MIMEMessage/add_part-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage#add_part
is_singleton: false
name: add_part
params: (content)
visibility: public
PK�|[B�QD��1ri/1.8/system/SOAP/MIMEMessage/headers_str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage#headers_str
is_singleton: false
name: headers_str
params: ()
visibility: public
PK�|[lOH���Kri/1.8/system/SOAP/MIMEMessage/MIMEMessageError/cdesc-MIMEMessageError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::MIMEMessage::MIMEMessageError
includes: []

instance_methods: []

name: MIMEMessageError
superclass: StandardError
PK�|[VN����*ri/1.8/system/SOAP/MIMEMessage/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[8hد�+ri/1.8/system/SOAP/MIMEMessage/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::MIMEMessage#close
is_singleton: false
name: close
params: ()
visibility: public
PK�|[�D?��/ri/1.8/system/SOAP/SOAPByte/cdesc-SOAPByte.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPByte
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPByte
superclass: XSD::XSDByte
PK�|[�ڶ��+ri/1.8/system/SOAP/SOAPStruct/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPStruct#[]
is_singleton: false
name: "[]"
params: (idx)
visibility: public
PK�|[:�gw��)ri/1.8/system/SOAP/SOAPStruct/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (@array[idx], @data[idx])
comment: 
full_name: SOAP::SOAPStruct#each
is_singleton: false
name: each
params: () {|@array[idx], @data[idx]| ...}
visibility: public
PK�|[��J���+ri/1.8/system/SOAP/SOAPStruct/to_obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPStruct#to_obj
is_singleton: false
name: to_obj
params: ()
visibility: public
PK�|[q�[��(ri/1.8/system/SOAP/SOAPStruct/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPStruct#add
is_singleton: false
name: add
params: (name, value)
visibility: public
PK�|[�"���(ri/1.8/system/SOAP/SOAPStruct/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPStruct::new
is_singleton: true
name: new
params: (type = nil)
visibility: public
PK�|[����,ri/1.8/system/SOAP/SOAPStruct/replace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (self[member])
comment: 
full_name: SOAP::SOAPStruct#replace
is_singleton: false
name: replace
params: () {|self[member]| ...}
visibility: public
PK�|[�.
���,ri/1.8/system/SOAP/SOAPStruct/members-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPStruct#members
is_singleton: false
name: members
params: ()
visibility: public
PK�|[�\5C��+ri/1.8/system/SOAP/SOAPStruct/decode-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPStruct::decode
is_singleton: true
name: decode
params: (elename, type)
visibility: public
PK�|[@k-��3ri/1.8/system/SOAP/SOAPStruct/cdesc-SOAPStruct.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: decode
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compound datatypes.
constants: []

full_name: SOAP::SOAPStruct
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPCompoundtype
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: add_member
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: key?
- !ruby/object:RI::MethodSummary 
  name: members
- !ruby/object:RI::MethodSummary 
  name: replace
- !ruby/object:RI::MethodSummary 
  name: to_obj
- !ruby/object:RI::MethodSummary 
  name: to_s
name: SOAPStruct
superclass: XSD::NSDBase
PK�|[���h��)ri/1.8/system/SOAP/SOAPStruct/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPStruct#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[l#����/ri/1.8/system/SOAP/SOAPStruct/add_member-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPStruct#add_member
is_singleton: false
name: add_member
params: (name, value = nil)
visibility: private
PK�|[�W<n��.ri/1.8/system/SOAP/SOAPStruct/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPStruct#[]=
is_singleton: false
name: "[]="
params: (idx, data)
visibility: public
PK�|[�&j��+ri/1.8/system/SOAP/SOAPStruct/key%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPStruct#key?
is_singleton: false
name: key?
params: (name)
visibility: public
PK�|[O���/ri/1.8/system/SOAP/SOAPType/cdesc-SOAPType.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: definedtype
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: elename
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: encodingstyle
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: extraattr
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: id
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: parent
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: position
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: precedents
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: root
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: for SOAP type(base and compound)
constants: []

full_name: SOAP::SOAPType
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: rootnode
name: SOAPType
superclass: 
PK�|[�r����*ri/1.8/system/SOAP/SOAPType/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPType#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[t��=��&ri/1.8/system/SOAP/SOAPType/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPType::new
is_singleton: true
name: new
params: (*arg)
visibility: public
PK�|[� ���+ri/1.8/system/SOAP/SOAPType/rootnode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPType#rootnode
is_singleton: false
name: rootnode
params: ()
visibility: public
PK�|[�w7��cri/1.8/system/SOAP/UnhandledMustUnderstandHeaderError/cdesc-UnhandledMustUnderstandHeaderError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::UnhandledMustUnderstandHeaderError
includes: []

instance_methods: []

name: UnhandledMustUnderstandHeaderError
superclass: Error
PK�|[� M��Sri/1.8/system/SOAP/ArrayIndexOutOfBoundsError/cdesc-ArrayIndexOutOfBoundsError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::ArrayIndexOutOfBoundsError
includes: []

instance_methods: []

name: ArrayIndexOutOfBoundsError
superclass: Error
PK�|[��5 ��7ri/1.8/system/SOAP/Marshallable/cdesc-Marshallable.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::Marshallable
includes: []

instance_methods: []

name: Marshallable
superclass: 
PK�|[���L��)ri/1.8/system/SOAP/SOAPBody/encode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (@data)
comment: 
full_name: SOAP::SOAPBody#encode
is_singleton: false
name: encode
params: (generator, ns, attrs = {}) {|@data| ...}
visibility: public
PK�|[;E����+ri/1.8/system/SOAP/SOAPBody/fault%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPBody#fault=
is_singleton: false
name: fault=
params: (fault)
visibility: public
PK�|[�֍��&ri/1.8/system/SOAP/SOAPBody/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPBody::new
is_singleton: true
name: new
params: (data = nil, is_fault = false)
visibility: public
PK�|[aժ��+ri/1.8/system/SOAP/SOAPBody/response-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPBody#response
is_singleton: false
name: response
params: ()
visibility: public
PK�|[D���*ri/1.8/system/SOAP/SOAPBody/request-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPBody#request
is_singleton: false
name: request
params: ()
visibility: public
PK�|[b�A���(ri/1.8/system/SOAP/SOAPBody/fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPBody#fault
is_singleton: false
name: fault
params: ()
visibility: public
PK�|[�3�e��,ri/1.8/system/SOAP/SOAPBody/outparams-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPBody#outparams
is_singleton: false
name: outparams
params: ()
visibility: public
PK�|[��L���/ri/1.8/system/SOAP/SOAPBody/cdesc-SOAPBody.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Add method definitions for RPC to common definition in element.rb
constants: []

full_name: SOAP::SOAPBody
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPEnvelopeElement
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: encode
- !ruby/object:RI::MethodSummary 
  name: fault
- !ruby/object:RI::MethodSummary 
  name: fault=
- !ruby/object:RI::MethodSummary 
  name: outparams
- !ruby/object:RI::MethodSummary 
  name: request
- !ruby/object:RI::MethodSummary 
  name: response
- !ruby/object:RI::MethodSummary 
  name: root_node
name: SOAPBody
superclass: SOAPStruct
PK�|[f�;��,ri/1.8/system/SOAP/SOAPBody/root_node-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPBody#root_node
is_singleton: false
name: root_node
params: ()
visibility: public
PK�|[���/ri/1.8/system/SOAP/SOAPLong/cdesc-SOAPLong.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPLong
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPLong
superclass: XSD::XSDLong
PK�|[�*S���ri/1.8/system/SOAP/reset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP#reset
is_singleton: false
name: reset
params: (url)
visibility: public
PK�|[�F2���=ri/1.8/system/SOAP/HTTPStreamError/cdesc-HTTPStreamError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::HTTPStreamError
includes: []

instance_methods: []

name: HTTPStreamError
superclass: StreamError
PK�|[䳗Q��,ri/1.8/system/SOAP/Attachment/content-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Attachment#content
is_singleton: false
name: content
params: ()
visibility: public
PK�|[w�x��1ri/1.8/system/SOAP/Attachment/contentid%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Attachment#contentid=
is_singleton: false
name: contentid=
params: (contentid)
visibility: public
PK�|[-�E��.ri/1.8/system/SOAP/Attachment/contentid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Attachment::contentid
is_singleton: true
name: contentid
params: (obj)
visibility: public
PK�|[�{����(ri/1.8/system/SOAP/Attachment/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Attachment::new
is_singleton: true
name: new
params: (string_or_readable = nil)
visibility: public
PK�|[l|J8��*ri/1.8/system/SOAP/Attachment/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Attachment#write
is_singleton: false
name: write
params: (out)
visibility: public
PK�|[�
�f��3ri/1.8/system/SOAP/Attachment/mime_contentid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Attachment::mime_contentid
is_singleton: true
name: mime_contentid
params: (obj)
visibility: public
PK�|['F��)ri/1.8/system/SOAP/Attachment/save-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Attachment#save
is_singleton: false
name: save
params: (filename)
visibility: public
PK�|[����??3ri/1.8/system/SOAP/Attachment/cdesc-Attachment.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: contenttype
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: io
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: contentid
- !ruby/object:RI::MethodSummary 
  name: mime_contentid
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::Attachment
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: content
- !ruby/object:RI::MethodSummary 
  name: contentid
- !ruby/object:RI::MethodSummary 
  name: contentid=
- !ruby/object:RI::MethodSummary 
  name: mime_contentid
- !ruby/object:RI::MethodSummary 
  name: save
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: write
name: Attachment
superclass: Object
PK�|[MO=f��)ri/1.8/system/SOAP/Attachment/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Attachment#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[�{*��.ri/1.8/system/SOAP/Attachment/contentid-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Attachment#contentid
is_singleton: false
name: contentid
params: ()
visibility: public
PK�|[U�e��3ri/1.8/system/SOAP/Attachment/mime_contentid-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Attachment#mime_contentid
is_singleton: false
name: mime_contentid
params: ()
visibility: public
PK�|[���*��(ri/1.8/system/SOAP/set_basic_auth-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP#set_basic_auth
is_singleton: false
name: set_basic_auth
params: (uri, user_id, passwd)
visibility: public
PK�|[��p?ri/1.8/system/SOAP/SOAPUnsignedLong/cdesc-SOAPUnsignedLong.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPUnsignedLong
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPUnsignedLong
superclass: XSD::XSDUnsignedLong
PK�|[[ ���3ri/1.8/system/SOAP/SOAPBase64/cdesc-SOAPBase64.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Type
  value: QName.new(EncodingNamespace, Base64Literal)
full_name: SOAP::SOAPBase64
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: as_xsd
name: SOAPBase64
superclass: XSD::XSDBase64Binary
PK�|[~��(ri/1.8/system/SOAP/SOAPBase64/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Override the definition in SOAPBasetype.
full_name: SOAP::SOAPBase64::new
is_singleton: true
name: new
params: (value = nil)
visibility: public
PK�|[E�ް�+ri/1.8/system/SOAP/SOAPBase64/as_xsd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPBase64#as_xsd
is_singleton: false
name: as_xsd
params: ()
visibility: public
PK�|[��y��*ri/1.8/system/SOAP/SOAPArray/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPArray#[]
is_singleton: false
name: "[]"
params: (*idxary)
visibility: public
PK�|[Z��ʾ�(ri/1.8/system/SOAP/SOAPArray/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (data)
comment: 
full_name: SOAP::SOAPArray#each
is_singleton: false
name: each
params: () {|data| ...}
visibility: public
PK�|[P����2ri/1.8/system/SOAP/SOAPArray/create_arytype-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPArray::create_arytype
is_singleton: true
name: create_arytype
params: (typename, rank)
visibility: private
PK�|[�V߇��(ri/1.8/system/SOAP/SOAPArray/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPArray#to_a
is_singleton: false
name: to_a
params: ()
visibility: public
PK�|[�v�a��,ri/1.8/system/SOAP/SOAPArray/deep_map-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPArray#deep_map
is_singleton: false
name: deep_map
params: (ary, &block)
visibility: public
PK�|[�y6��-ri/1.8/system/SOAP/SOAPArray/offset%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPArray#offset=
is_singleton: false
name: offset=
params: (var)
visibility: public
PK�|[��$���,ri/1.8/system/SOAP/SOAPArray/traverse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (v)
comment: 
full_name: SOAP::SOAPArray#traverse
is_singleton: false
name: traverse
params: () {|v| ...}
visibility: public
PK�|[O7+���1ri/1.8/system/SOAP/SOAPArray/traverse_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (*v)
comment: 
full_name: SOAP::SOAPArray#traverse_data
is_singleton: false
name: traverse_data
params: (data, rank = 1) {|*v| ...}
visibility: private
PK�|[G�2��,ri/1.8/system/SOAP/SOAPArray/position-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPArray#position
is_singleton: false
name: position
params: ()
visibility: public
PK�|[�a�n��'ri/1.8/system/SOAP/SOAPArray/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPArray#add
is_singleton: false
name: add
params: (value)
visibility: public
PK�|[��!�ss1ri/1.8/system/SOAP/SOAPArray/cdesc-SOAPArray.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: arytype
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: offset
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: rank
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: size
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: size_fixed
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: sparse
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: create_arytype
- !ruby/object:RI::MethodSummary 
  name: decode
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: parse_type
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ITEM_NAME
  value: XSD::QName.new(nil, 'item')
- !ruby/object:RI::Constant 
  comment: 
  name: TypeParseRegexp
  value: Regexp.new('^(.+)\[([\d,]*)\]$')
full_name: SOAP::SOAPArray
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPCompoundtype
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: deep_map
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: include?
- !ruby/object:RI::MethodSummary 
  name: offset=
- !ruby/object:RI::MethodSummary 
  name: offsetnext
- !ruby/object:RI::MethodSummary 
  name: position
- !ruby/object:RI::MethodSummary 
  name: ranksize
- !ruby/object:RI::MethodSummary 
  name: replace
- !ruby/object:RI::MethodSummary 
  name: retrieve
- !ruby/object:RI::MethodSummary 
  name: soap2array
- !ruby/object:RI::MethodSummary 
  name: to_a
- !ruby/object:RI::MethodSummary 
  name: traverse
- !ruby/object:RI::MethodSummary 
  name: traverse_data
name: SOAPArray
superclass: XSD::NSDBase
PK�|[%�I���.ri/1.8/system/SOAP/SOAPArray/include%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPArray#include?
is_singleton: false
name: include?
params: (var)
visibility: public
PK�|[N$}:��'ri/1.8/system/SOAP/SOAPArray/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPArray::new
is_singleton: true
name: new
params: (type = nil, rank = 1, arytype = nil)
visibility: public
PK�|[��m��+ri/1.8/system/SOAP/SOAPArray/replace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (ele)
comment: 
full_name: SOAP::SOAPArray#replace
is_singleton: false
name: replace
params: () {|ele| ...}
visibility: public
PK�|[_�-��*ri/1.8/system/SOAP/SOAPArray/decode-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Module function
full_name: SOAP::SOAPArray::decode
is_singleton: true
name: decode
params: (elename, type, arytype)
visibility: public
PK�|[�r�Ҿ�.ri/1.8/system/SOAP/SOAPArray/parse_type-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPArray::parse_type
is_singleton: true
name: parse_type
params: (string)
visibility: private
PK�|[�.˺�,ri/1.8/system/SOAP/SOAPArray/retrieve-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPArray#retrieve
is_singleton: false
name: retrieve
params: (idxary)
visibility: private
PK�|[����.ri/1.8/system/SOAP/SOAPArray/soap2array-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (v)
comment: 
full_name: SOAP::SOAPArray#soap2array
is_singleton: false
name: soap2array
params: (ary) {|v| ...}
visibility: public
PK�|[�f���,ri/1.8/system/SOAP/SOAPArray/ranksize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPArray#ranksize
is_singleton: false
name: ranksize
params: (rank)
visibility: private
PK�|[���ز�-ri/1.8/system/SOAP/SOAPArray/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPArray#[]=
is_singleton: false
name: "[]="
params: (*idxary)
visibility: public
PK�|[D�J��.ri/1.8/system/SOAP/SOAPArray/offsetnext-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPArray#offsetnext
is_singleton: false
name: offsetnext
params: ()
visibility: private
PK�|[i����*ri/1.8/system/SOAP/set_cookie_store-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP#set_cookie_store
is_singleton: false
name: set_cookie_store
params: (filename)
visibility: public
PK�|[[:�0tt=ri/1.8/system/SOAP/SOAPModuleUtils/cdesc-SOAPModuleUtils.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Mix-in module for SOAP base type classes.
constants: []

full_name: SOAP::SOAPModuleUtils
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAP
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: decode
name: SOAPModuleUtils
superclass: 
PK�|[/��μ�0ri/1.8/system/SOAP/SOAPModuleUtils/decode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPModuleUtils#decode
is_singleton: false
name: decode
params: (elename)
visibility: public
PK�|[.�Z�//9ri/1.8/system/SOAP/NetHttpClient/cdesc-NetHttpClient.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: SSLEnabled
  value: begin       require 'net/https'
full_name: SOAP::NetHttpClient
includes: []

instance_methods: []

name: NetHttpClient
superclass: Object
PK�|[=|Z��%ri/1.8/system/SOAP/no_proxy%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP#no_proxy?
is_singleton: false
name: no_proxy?
params: (uri)
visibility: private
PK�|[H����3ri/1.8/system/SOAP/Parser/find_encodingstyle-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Parser#find_encodingstyle
is_singleton: false
name: find_encodingstyle
params: (ns, attrs)
visibility: private
PK�|[D�P���Hri/1.8/system/SOAP/Parser/FormatDecodeError/cdesc-FormatDecodeError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::Parser::FormatDecodeError
includes: []

instance_methods: []

name: FormatDecodeError
superclass: ParseError
PK�|[y����/ri/1.8/system/SOAP/Parser/decode_tag_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Parser#decode_tag_end
is_singleton: false
name: decode_tag_end
params: (ns, node, encodingstyle)
visibility: private
PK�|[�
A���&ri/1.8/system/SOAP/Parser/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Parser#parse
is_singleton: false
name: parse
params: (string_or_readable)
visibility: public
PK�|[��vi��-ri/1.8/system/SOAP/Parser/find_handler-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Parser#find_handler
is_singleton: false
name: find_handler
params: (encodingstyle)
visibility: private
PK�|[�n���+ri/1.8/system/SOAP/Parser/cdesc-Parser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: allow_unqualified_element
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: decode_typemap
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: default_encodingstyle
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: envelopenamespace
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::Parser
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAP
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: characters
- !ruby/object:RI::MethodSummary 
  name: charset
- !ruby/object:RI::MethodSummary 
  name: decode_soap_envelope
- !ruby/object:RI::MethodSummary 
  name: decode_tag
- !ruby/object:RI::MethodSummary 
  name: decode_tag_end
- !ruby/object:RI::MethodSummary 
  name: decode_text
- !ruby/object:RI::MethodSummary 
  name: end_element
- !ruby/object:RI::MethodSummary 
  name: find_encodingstyle
- !ruby/object:RI::MethodSummary 
  name: find_handler
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: start_element
name: Parser
superclass: Object
PK�|[l����$ri/1.8/system/SOAP/Parser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Parser::new
is_singleton: true
name: new
params: (opt = {})
visibility: public
PK�|[![[���,ri/1.8/system/SOAP/Parser/end_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Parser#end_element
is_singleton: false
name: end_element
params: (name)
visibility: public
PK�|[�&�+��.ri/1.8/system/SOAP/Parser/start_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Parser#start_element
is_singleton: false
name: start_element
params: (name, attrs)
visibility: public
PK�|[�����:ri/1.8/system/SOAP/Parser/ParseError/cdesc-ParseError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::Parser::ParseError
includes: []

instance_methods: []

name: ParseError
superclass: Error
PK�|[{�_��(ri/1.8/system/SOAP/Parser/charset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Parser#charset
is_singleton: false
name: charset
params: ()
visibility: public
PK�|[��=��+ri/1.8/system/SOAP/Parser/characters-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Parser#characters
is_singleton: false
name: characters
params: (text)
visibility: public
PK�|[8i>^��,ri/1.8/system/SOAP/Parser/decode_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Parser#decode_text
is_singleton: false
name: decode_text
params: (ns, text, encodingstyle)
visibility: private
PK�|[�W2���Rri/1.8/system/SOAP/Parser/UnexpectedElementError/cdesc-UnexpectedElementError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::Parser::UnexpectedElementError
includes: []

instance_methods: []

name: UnexpectedElementError
superclass: ParseError
PK�|['�G��+ri/1.8/system/SOAP/Parser/decode_tag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Parser#decode_tag
is_singleton: false
name: decode_tag
params: (ns, name, attrs, parent, encodingstyle)
visibility: private
PK�|[�{(���5ri/1.8/system/SOAP/Parser/decode_soap_envelope-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Parser#decode_soap_envelope
is_singleton: false
name: decode_soap_envelope
params: (ns, ele, attrs, parent)
visibility: private
PK�|[U{[���>ri/1.8/system/SOAP/Parser/ParseFrame/NodeContainer/node-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Parser::ParseFrame::NodeContainer#node
is_singleton: false
name: node
params: ()
visibility: public
PK�|[c����=ri/1.8/system/SOAP/Parser/ParseFrame/NodeContainer/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Parser::ParseFrame::NodeContainer::new
is_singleton: true
name: new
params: (node)
visibility: public
PK�|[G��e��Fri/1.8/system/SOAP/Parser/ParseFrame/NodeContainer/replace_node-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Parser::ParseFrame::NodeContainer#replace_node
is_singleton: false
name: replace_node
params: (node)
visibility: public
PK�|[(g�ooKri/1.8/system/SOAP/Parser/ParseFrame/NodeContainer/cdesc-NodeContainer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::Parser::ParseFrame::NodeContainer
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: node
- !ruby/object:RI::MethodSummary 
  name: replace_node
name: NodeContainer
superclass: Object
PK�|[�=†��/ri/1.8/system/SOAP/Parser/ParseFrame/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Parser::ParseFrame::new
is_singleton: true
name: new
params: (ns, name, node, encodingstyle)
visibility: public
PK�|[Bn�Ǻ�3ri/1.8/system/SOAP/Parser/ParseFrame/node%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Parser::ParseFrame#node=
is_singleton: false
name: node=
params: (node)
visibility: public
PK�|[��2Y'':ri/1.8/system/SOAP/Parser/ParseFrame/cdesc-ParseFrame.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: encodingstyle
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: node
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: ns
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::Parser::ParseFrame
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: node=
name: ParseFrame
superclass: Object
PK�|[R\�V?ri/1.8/system/SOAP/SOAPUnsignedByte/cdesc-SOAPUnsignedByte.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPUnsignedByte
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPUnsignedByte
superclass: XSD::XSDUnsignedByte
PK�|[?�3ri/1.8/system/SOAP/SOAPDouble/cdesc-SOAPDouble.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPDouble
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPDouble
superclass: XSD::XSDDouble
PK�|[zd���%ri/1.8/system/SOAP/get_content-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP#get_content
is_singleton: false
name: get_content
params: (url, header = {})
visibility: public
PK�|[
��Gri/1.8/system/SOAP/PostUnavailableError/cdesc-PostUnavailableError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::PostUnavailableError
includes: []

instance_methods: []

name: PostUnavailableError
superclass: HTTPStreamError
PK�|[�����&ri/1.8/system/SOAP/Response/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Response::new
is_singleton: true
name: new
params: (res)
visibility: public
PK�|[z���/ri/1.8/system/SOAP/Response/cdesc-Response.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: content
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: contenttype
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: reason
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: status
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::Response
includes: []

instance_methods: []

name: Response
superclass: Object
PK�|[H�>�3ri/1.8/system/SOAP/SOAPString/cdesc-SOAPString.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPString
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPString
superclass: XSD::XSDString
PK�|[��UǴ�.ri/1.8/system/SOAP/SOAPCompoundtype/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::SOAPCompoundtype::new
is_singleton: true
name: new
params: (*arg)
visibility: public
PK�|[xx��?ri/1.8/system/SOAP/SOAPCompoundtype/cdesc-SOAPCompoundtype.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: for SOAP compound type
constants: []

full_name: SOAP::SOAPCompoundtype
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPType
- !ruby/object:RI::IncludedModule 
  name: SOAP
instance_methods: []

name: SOAPCompoundtype
superclass: 
PK�|[ƫ��ee"ri/1.8/system/SOAP/cdesc-SOAP.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: connect_timeout
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: debug_dev
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: no_proxy
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: protocol_version
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: proxy
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: receive_timeout
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: send_timeout
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: ssl_config
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: This program is copyrighted free software by NAKAMURA, Hiroshi. You can redistribute it and/or modify it under the same terms of Ruby's license; either the dual license version in 2003, or any later version.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: TypeMap
  value: "{   XSD::XSDAnySimpleType::Type => SOAPAnySimpleType,   XSD::XSDString::Type => SOAPString,   XSD::XSDBoolean::Type => SOAPBoolean,   XSD::XSDDecimal::Type => SOAPDecimal,   XSD::XSDFloat::Type => SOAPFloat,   XSD::XSDDouble::Type => SOAPDouble,   XSD::XSDDuration::Type => SOAPDuration,   XSD::XSDDateTime::Type => SOAPDateTime,   XSD::XSDTime::Type => SOAPTime,   XSD::XSDDate::Type => SOAPDate,   XSD::XSDGYearMonth::Type => SOAPGYearMonth,   XSD::XSDGYear::Type => SOAPGYear,   XSD::XSDGMonthDay::Type => SOAPGMonthDay,   XSD::XSDGDay::Type => SOAPGDay,   XSD::XSDGMonth::Type => SOAPGMonth,   XSD::XSDHexBinary::Type => SOAPHexBinary,   XSD::XSDBase64Binary::Type => SOAPBase64,   XSD::XSDAnyURI::Type => SOAPAnyURI,   XSD::XSDQName::Type => SOAPQName,   XSD::XSDInteger::Type => SOAPInteger,   XSD::XSDNonPositiveInteger::Type => SOAPNonPositiveInteger,   XSD::XSDNegativeInteger::Type => SOAPNegativeInteger,   XSD::XSDLong::Type => SOAPLong,   XSD::XSDInt::Type => SOAPInt,   XSD::XSDShort::Type => SOAPShort,   XSD::XSDByte::Type => SOAPByte,   XSD::XSDNonNegativeInteger::Type => SOAPNonNegativeInteger,   XSD::XSDUnsignedLong::Type => SOAPUnsignedLong,   XSD::XSDUnsignedInt::Type => SOAPUnsignedInt,   XSD::XSDUnsignedShort::Type => SOAPUnsignedShort,   XSD::XSDUnsignedByte::Type => SOAPUnsignedByte,   XSD::XSDPositiveInteger::Type => SOAPPositiveInteger,    SOAP::SOAPBase64::Type => SOAPBase64, }"
- !ruby/object:RI::Constant 
  comment: 
  name: VERSION
  value: Version = '1.5.5'
- !ruby/object:RI::Constant 
  comment: 
  name: PropertyName
  value: "'soap/property'"
- !ruby/object:RI::Constant 
  comment: 
  name: EnvelopeNamespace
  value: "'http://schemas.xmlsoap.org/soap/envelope/'"
- !ruby/object:RI::Constant 
  comment: 
  name: EncodingNamespace
  value: "'http://schemas.xmlsoap.org/soap/encoding/'"
- !ruby/object:RI::Constant 
  comment: 
  name: LiteralNamespace
  value: "'http://xml.apache.org/xml-soap/literalxml'"
- !ruby/object:RI::Constant 
  comment: 
  name: NextActor
  value: "'http://schemas.xmlsoap.org/soap/actor/next'"
- !ruby/object:RI::Constant 
  comment: 
  name: EleEnvelope
  value: "'Envelope'"
- !ruby/object:RI::Constant 
  comment: 
  name: EleHeader
  value: "'Header'"
- !ruby/object:RI::Constant 
  comment: 
  name: EleBody
  value: "'Body'"
- !ruby/object:RI::Constant 
  comment: 
  name: EleFault
  value: "'Fault'"
- !ruby/object:RI::Constant 
  comment: 
  name: EleFaultString
  value: "'faultstring'"
- !ruby/object:RI::Constant 
  comment: 
  name: EleFaultActor
  value: "'faultactor'"
- !ruby/object:RI::Constant 
  comment: 
  name: EleFaultCode
  value: "'faultcode'"
- !ruby/object:RI::Constant 
  comment: 
  name: EleFaultDetail
  value: "'detail'"
- !ruby/object:RI::Constant 
  comment: 
  name: AttrMustUnderstand
  value: "'mustUnderstand'"
- !ruby/object:RI::Constant 
  comment: 
  name: AttrEncodingStyle
  value: "'encodingStyle'"
- !ruby/object:RI::Constant 
  comment: 
  name: AttrActor
  value: "'actor'"
- !ruby/object:RI::Constant 
  comment: 
  name: AttrRoot
  value: "'root'"
- !ruby/object:RI::Constant 
  comment: 
  name: AttrArrayType
  value: "'arrayType'"
- !ruby/object:RI::Constant 
  comment: 
  name: AttrOffset
  value: "'offset'"
- !ruby/object:RI::Constant 
  comment: 
  name: AttrPosition
  value: "'position'"
- !ruby/object:RI::Constant 
  comment: 
  name: ValueArray
  value: "'Array'"
- !ruby/object:RI::Constant 
  comment: 
  name: EleEnvelopeName
  value: XSD::QName.new(EnvelopeNamespace, EleEnvelope).freeze
- !ruby/object:RI::Constant 
  comment: 
  name: EleHeaderName
  value: XSD::QName.new(EnvelopeNamespace, EleHeader).freeze
- !ruby/object:RI::Constant 
  comment: 
  name: EleBodyName
  value: XSD::QName.new(EnvelopeNamespace, EleBody).freeze
- !ruby/object:RI::Constant 
  comment: 
  name: EleFaultName
  value: XSD::QName.new(EnvelopeNamespace, EleFault).freeze
- !ruby/object:RI::Constant 
  comment: 
  name: EleFaultStringName
  value: XSD::QName.new(nil, EleFaultString).freeze
- !ruby/object:RI::Constant 
  comment: 
  name: EleFaultActorName
  value: XSD::QName.new(nil, EleFaultActor).freeze
- !ruby/object:RI::Constant 
  comment: 
  name: EleFaultCodeName
  value: XSD::QName.new(nil, EleFaultCode).freeze
- !ruby/object:RI::Constant 
  comment: 
  name: EleFaultDetailName
  value: XSD::QName.new(nil, EleFaultDetail).freeze
- !ruby/object:RI::Constant 
  comment: 
  name: AttrMustUnderstandName
  value: XSD::QName.new(EnvelopeNamespace, AttrMustUnderstand).freeze
- !ruby/object:RI::Constant 
  comment: 
  name: AttrEncodingStyleName
  value: XSD::QName.new(EnvelopeNamespace, AttrEncodingStyle).freeze
- !ruby/object:RI::Constant 
  comment: 
  name: AttrRootName
  value: XSD::QName.new(EncodingNamespace, AttrRoot).freeze
- !ruby/object:RI::Constant 
  comment: 
  name: AttrArrayTypeName
  value: XSD::QName.new(EncodingNamespace, AttrArrayType).freeze
- !ruby/object:RI::Constant 
  comment: 
  name: AttrOffsetName
  value: XSD::QName.new(EncodingNamespace, AttrOffset).freeze
- !ruby/object:RI::Constant 
  comment: 
  name: AttrPositionName
  value: XSD::QName.new(EncodingNamespace, AttrPosition).freeze
- !ruby/object:RI::Constant 
  comment: 
  name: ValueArrayName
  value: XSD::QName.new(EncodingNamespace, ValueArray).freeze
- !ruby/object:RI::Constant 
  comment: 
  name: Base64Literal
  value: "'base64'"
- !ruby/object:RI::Constant 
  comment: 
  name: SOAPNamespaceTag
  value: "'env'"
- !ruby/object:RI::Constant 
  comment: 
  name: XSDNamespaceTag
  value: "'xsd'"
- !ruby/object:RI::Constant 
  comment: 
  name: XSINamespaceTag
  value: "'xsi'"
- !ruby/object:RI::Constant 
  comment: 
  name: MediaType
  value: "'text/xml'"
- !ruby/object:RI::Constant 
  comment: 
  name: NO_PROXY_HOSTS
  value: "['localhost']"
full_name: SOAP
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: create_connection
- !ruby/object:RI::MethodSummary 
  name: get_content
- !ruby/object:RI::MethodSummary 
  name: no_proxy?
- !ruby/object:RI::MethodSummary 
  name: post
- !ruby/object:RI::MethodSummary 
  name: proxy=
- !ruby/object:RI::MethodSummary 
  name: reset
- !ruby/object:RI::MethodSummary 
  name: reset_all
- !ruby/object:RI::MethodSummary 
  name: save_cookie_store
- !ruby/object:RI::MethodSummary 
  name: set_basic_auth
- !ruby/object:RI::MethodSummary 
  name: set_cookie_store
- !ruby/object:RI::MethodSummary 
  name: start
- !ruby/object:RI::MethodSummary 
  name: test_loopback_response
name: SOAP
superclass: 
PK�|[�n��$ri/1.8/system/SOAP/Env/getenv-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::Env::getenv
is_singleton: true
name: getenv
params: (name)
visibility: public
PK�|[����%ri/1.8/system/SOAP/Env/cdesc-Env.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: getenv
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: HTTP_PROXY
  value: "use_proxy ? getenv('http_proxy') : nil"
- !ruby/object:RI::Constant 
  comment: 
  name: NO_PROXY
  value: "use_proxy ? getenv('no_proxy') : nil"
full_name: SOAP::Env
includes: []

instance_methods: []

name: Env
superclass: 
PK�|[s�S7��Cri/1.8/system/SOAP/EmptyResponseError/cdesc-EmptyResponseError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::EmptyResponseError
includes: []

instance_methods: []

name: EmptyResponseError
superclass: Error
PK�|[�.�Eri/1.8/system/SOAP/SOAPPositiveInteger/cdesc-SOAPPositiveInteger.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPPositiveInteger
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPPositiveInteger
superclass: XSD::XSDPositiveInteger
PK�|[�dAu5ri/1.8/system/SOAP/SOAPInteger/cdesc-SOAPInteger.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::SOAPInteger
includes: 
- !ruby/object:RI::IncludedModule 
  name: SOAPBasetype
instance_methods: []

name: SOAPInteger
superclass: XSD::XSDInteger
PK�|[Mv�a��9ri/1.8/system/SOAP/StreamHandler/cdesc-StreamHandler.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: create_media_type
- !ruby/object:RI::MethodSummary 
  name: parse_media_type
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: RUBY_VERSION_STRING
  value: "\"ruby #{ RUBY_VERSION } (#{ RUBY_RELEASE_DATE }) [#{ RUBY_PLATFORM }]\""
full_name: SOAP::StreamHandler
includes: []

instance_methods: []

name: StreamHandler
superclass: Object
PK�|[�N����9ri/1.8/system/SOAP/StreamHandler/create_media_type-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::StreamHandler::create_media_type
is_singleton: true
name: create_media_type
params: (charset)
visibility: public
PK�|[��fK��Iri/1.8/system/SOAP/StreamHandler/ConnectionData/cdesc-ConnectionData.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: is_fault
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: receive_contenttype
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: receive_string
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: send_contenttype
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: send_string
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: soapaction
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::StreamHandler::ConnectionData
includes: []

instance_methods: []

name: ConnectionData
superclass: Object
PK�|["�N��:ri/1.8/system/SOAP/StreamHandler/ConnectionData/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::StreamHandler::ConnectionData::new
is_singleton: true
name: new
params: (send_string = nil)
visibility: public
PK�|[*m���8ri/1.8/system/SOAP/StreamHandler/parse_media_type-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::StreamHandler::parse_media_type
is_singleton: true
name: parse_media_type
params: (str)
visibility: public
PK�|[�P����;ri/1.8/system/SOAP/EncodingStyle/Handler/add_handler-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::Handler::add_handler
is_singleton: true
name: add_handler
params: ()
visibility: private
PK�|[2i���?ri/1.8/system/SOAP/EncodingStyle/Handler/decode_prologue-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::Handler#decode_prologue
is_singleton: false
name: decode_prologue
params: ()
visibility: public
PK�|[�M���>ri/1.8/system/SOAP/EncodingStyle/Handler/decode_tag_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::Handler#decode_tag_end
is_singleton: false
name: decode_tag_end
params: (ns, name)
visibility: public
PK�|[+�k���?ri/1.8/system/SOAP/EncodingStyle/Handler/decode_epilogue-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::Handler#decode_epilogue
is_singleton: false
name: decode_epilogue
params: ()
visibility: public
PK�|[
��B��3ri/1.8/system/SOAP/EncodingStyle/Handler/uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::Handler::uri
is_singleton: true
name: uri
params: ()
visibility: public
PK�|[�e4'��3ri/1.8/system/SOAP/EncodingStyle/Handler/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::Handler::new
is_singleton: true
name: new
params: (charset)
visibility: public
PK�|[0'}Y��?ri/1.8/system/SOAP/EncodingStyle/Handler/encode_prologue-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::Handler#encode_prologue
is_singleton: false
name: encode_prologue
params: ()
visibility: public
PK�|[�8��?ri/1.8/system/SOAP/EncodingStyle/Handler/encode_data_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::Handler#encode_data_end
is_singleton: false
name: encode_data_end
params: (generator, ns, data, parent)
visibility: public
PK�|[�����Ari/1.8/system/SOAP/EncodingStyle/Handler/decode_typemap%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::Handler#decode_typemap=
is_singleton: false
name: decode_typemap=
params: (definedtypes)
visibility: public
PK�|[)͂���?ri/1.8/system/SOAP/EncodingStyle/Handler/encode_epilogue-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::Handler#encode_epilogue
is_singleton: false
name: encode_epilogue
params: ()
visibility: public
PK�|[����7ri/1.8/system/SOAP/EncodingStyle/Handler/handler-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::Handler::handler
is_singleton: true
name: handler
params: (uri)
visibility: public
PK�|[D�s��4ri/1.8/system/SOAP/EncodingStyle/Handler/each-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (value)
comment: 
full_name: SOAP::EncodingStyle::Handler::each
is_singleton: true
name: each
params: () {|value| ...}
visibility: public
PK�|[b��e��;ri/1.8/system/SOAP/EncodingStyle/Handler/cdesc-Handler.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: charset
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: generate_explicit_type
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_handler
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: handler
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: uri
comment: 
constants: []

full_name: SOAP::EncodingStyle::Handler
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: decode_epilogue
- !ruby/object:RI::MethodSummary 
  name: decode_prologue
- !ruby/object:RI::MethodSummary 
  name: decode_tag
- !ruby/object:RI::MethodSummary 
  name: decode_tag_end
- !ruby/object:RI::MethodSummary 
  name: decode_text
- !ruby/object:RI::MethodSummary 
  name: decode_typemap=
- !ruby/object:RI::MethodSummary 
  name: encode_data
- !ruby/object:RI::MethodSummary 
  name: encode_data_end
- !ruby/object:RI::MethodSummary 
  name: encode_epilogue
- !ruby/object:RI::MethodSummary 
  name: encode_prologue
name: Handler
superclass: Object
PK�|[��_gg;ri/1.8/system/SOAP/EncodingStyle/Handler/encode_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::VERB 
  body: " encode interface.\n"
- !ruby/struct:SM::Flow::P 
  body: Returns a XML instance as a string.
full_name: SOAP::EncodingStyle::Handler#encode_data
is_singleton: false
name: encode_data
params: (generator, ns, data, parent)
visibility: public
PK�|[/4W���Yri/1.8/system/SOAP/EncodingStyle/Handler/EncodingStyleError/cdesc-EncodingStyleError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::EncodingStyle::Handler::EncodingStyleError
includes: []

instance_methods: []

name: EncodingStyleError
superclass: Error
PK�|[9����;ri/1.8/system/SOAP/EncodingStyle/Handler/decode_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::Handler#decode_text
is_singleton: false
name: decode_text
params: (ns, text)
visibility: public
PK�|[*��{SS:ri/1.8/system/SOAP/EncodingStyle/Handler/decode_tag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::VERB 
  body: " decode interface.\n"
- !ruby/struct:SM::Flow::P 
  body: Returns SOAP/OM data.
full_name: SOAP::EncodingStyle::Handler#decode_tag
is_singleton: false
name: decode_tag
params: (ns, name, attrs, parent)
visibility: public
PK�|[֓�u��9ri/1.8/system/SOAP/EncodingStyle/cdesc-EncodingStyle.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SOAP::EncodingStyle
includes: []

instance_methods: []

name: EncodingStyle
superclass: 
PK�|[kP0��Cri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_basetype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#decode_basetype
is_singleton: false
name: decode_basetype
params: (klass, elename)
visibility: private
PK�|[4�?���Cri/1.8/system/SOAP/EncodingStyle/SOAPHandler/cdesc-SOAPHandler.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Namespace
  value: SOAP::EncodingNamespace
- !ruby/object:RI::Constant 
  comment: 
  name: NilLiteralMap
  value: "{     'true' => true,     '1' => true,     'false' => false,     '0' => false"
- !ruby/object:RI::Constant 
  comment: 
  name: RootLiteralMap
  value: "{     '1' => 1,     '0' => 0"
full_name: SOAP::EncodingStyle::SOAPHandler
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: content_ranksize
- !ruby/object:RI::MethodSummary 
  name: content_typename
- !ruby/object:RI::MethodSummary 
  name: create_arytype
- !ruby/object:RI::MethodSummary 
  name: decode_arypos
- !ruby/object:RI::MethodSummary 
  name: decode_attr_value
- !ruby/object:RI::MethodSummary 
  name: decode_attrs
- !ruby/object:RI::MethodSummary 
  name: decode_basetype
- !ruby/object:RI::MethodSummary 
  name: decode_defined_complextype
- !ruby/object:RI::MethodSummary 
  name: decode_defined_simpletype
- !ruby/object:RI::MethodSummary 
  name: decode_definedtype
- !ruby/object:RI::MethodSummary 
  name: decode_epilogue
- !ruby/object:RI::MethodSummary 
  name: decode_parent
- !ruby/object:RI::MethodSummary 
  name: decode_prologue
- !ruby/object:RI::MethodSummary 
  name: decode_resolve_id
- !ruby/object:RI::MethodSummary 
  name: decode_tag
- !ruby/object:RI::MethodSummary 
  name: decode_tag_by_type
- !ruby/object:RI::MethodSummary 
  name: decode_tag_by_wsdl
- !ruby/object:RI::MethodSummary 
  name: decode_tag_end
- !ruby/object:RI::MethodSummary 
  name: decode_text
- !ruby/object:RI::MethodSummary 
  name: decode_textbuf
- !ruby/object:RI::MethodSummary 
  name: encode_attr_value
- !ruby/object:RI::MethodSummary 
  name: encode_attrs
- !ruby/object:RI::MethodSummary 
  name: encode_data
- !ruby/object:RI::MethodSummary 
  name: encode_data_end
name: SOAPHandler
superclass: Handler
PK�|[e��yyOri/1.8/system/SOAP/EncodingStyle/SOAPHandler/SOAPUnknown/cdesc-SOAPUnknown.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: definedtype
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: extraattr
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: type
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::EncodingStyle::SOAPHandler::SOAPUnknown
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: as_nil
- !ruby/object:RI::MethodSummary 
  name: as_string
- !ruby/object:RI::MethodSummary 
  name: as_struct
name: SOAPUnknown
superclass: SOAPTemporalObject
PK�|[>���Fri/1.8/system/SOAP/EncodingStyle/SOAPHandler/SOAPUnknown/as_nil-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler::SOAPUnknown#as_nil
is_singleton: false
name: as_nil
params: ()
visibility: public
PK�|[��F>��Iri/1.8/system/SOAP/EncodingStyle/SOAPHandler/SOAPUnknown/as_struct-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler::SOAPUnknown#as_struct
is_singleton: false
name: as_struct
params: ()
visibility: public
PK�|[L��&��Cri/1.8/system/SOAP/EncodingStyle/SOAPHandler/SOAPUnknown/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler::SOAPUnknown::new
is_singleton: true
name: new
params: (handler, elename, type, extraattr)
visibility: public
PK�|[�8���Iri/1.8/system/SOAP/EncodingStyle/SOAPHandler/SOAPUnknown/as_string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler::SOAPUnknown#as_string
is_singleton: false
name: as_string
params: ()
visibility: public
PK�|[�\����Cri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_prologue-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#decode_prologue
is_singleton: false
name: decode_prologue
params: ()
visibility: public
PK�|[��c�Fri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_tag_by_wsdl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#decode_tag_by_wsdl
is_singleton: false
name: decode_tag_by_wsdl
params: (ns, elename, typestr, parent, arytypestr, extraattr)
visibility: private
PK�|[!FW��Bri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_tag_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#decode_tag_end
is_singleton: false
name: decode_tag_end
params: (ns, node)
visibility: public
PK�|[Q&��UU]ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/SOAPTemporalObject/cdesc-SOAPTemporalObject.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: id
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: parent
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: position
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: root
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: decode interface.
constants: []

full_name: SOAP::EncodingStyle::SOAPHandler::SOAPTemporalObject
includes: []

instance_methods: []

name: SOAPTemporalObject
superclass: Object
PK�|[�����Jri/1.8/system/SOAP/EncodingStyle/SOAPHandler/SOAPTemporalObject/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler::SOAPTemporalObject::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[���4Fri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_tag_by_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#decode_tag_by_type
is_singleton: false
name: decode_tag_by_type
params: (ns, elename, typestr, parent, arytypestr, extraattr)
visibility: private
PK�|[��Sr��Cri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_epilogue-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#decode_epilogue
is_singleton: false
name: decode_epilogue
params: ()
visibility: public
PK�|[t|

Mri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_defined_simpletype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#decode_defined_simpletype
is_singleton: false
name: decode_defined_simpletype
params: (elename, typename, typedef, arytypestr)
visibility: private
PK�|[�����Bri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_textbuf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#decode_textbuf
is_singleton: false
name: decode_textbuf
params: (node)
visibility: private
PK�|[�H�K��7ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler::new
is_singleton: true
name: new
params: (charset = nil)
visibility: public
PK�|[�-�t��Cri/1.8/system/SOAP/EncodingStyle/SOAPHandler/encode_data_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#encode_data_end
is_singleton: false
name: encode_data_end
params: (generator, ns, data, parent)
visibility: public
PK�|[y8���Fri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_definedtype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#decode_definedtype
is_singleton: false
name: decode_definedtype
params: (elename, typename, typedef, arytypestr)
visibility: private
PK�|[5����@ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_attrs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#decode_attrs
is_singleton: false
name: decode_attrs
params: (ns, attrs)
visibility: private
PK�|[�q���Dri/1.8/system/SOAP/EncodingStyle/SOAPHandler/content_typename-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#content_typename
is_singleton: false
name: content_typename
params: (typename)
visibility: private
PK�|[�q���Ari/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_parent-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#decode_parent
is_singleton: false
name: decode_parent
params: (parent, node)
visibility: public
PK�|[́܇��Ari/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_arypos-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#decode_arypos
is_singleton: false
name: decode_arypos
params: (position)
visibility: private
PK�|[C�N?ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/encode_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: encode interface.
full_name: SOAP::EncodingStyle::SOAPHandler#encode_data
is_singleton: false
name: encode_data
params: (generator, ns, data, parent)
visibility: public
PK�|[w@����@ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/encode_attrs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#encode_attrs
is_singleton: false
name: encode_attrs
params: (generator, ns, data, parent)
visibility: private
PK�|[� �Q��?ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#decode_text
is_singleton: false
name: decode_text
params: (ns, text)
visibility: public
PK�|[/�yy��Eri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_resolve_id-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#decode_resolve_id
is_singleton: false
name: decode_resolve_id
params: ()
visibility: private
PK�|[�z����Dri/1.8/system/SOAP/EncodingStyle/SOAPHandler/content_ranksize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#content_ranksize
is_singleton: false
name: content_ranksize
params: (typename)
visibility: private
PK�|[���z��>ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_tag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#decode_tag
is_singleton: false
name: decode_tag
params: (ns, elename, attrs, parent)
visibility: public
PK�|[�2h��Bri/1.8/system/SOAP/EncodingStyle/SOAPHandler/create_arytype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#create_arytype
is_singleton: false
name: create_arytype
params: (ns, data)
visibility: private
PK�|[��6Nri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_defined_complextype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#decode_defined_complextype
is_singleton: false
name: decode_defined_complextype
params: (elename, typename, typedef, arytypestr)
visibility: private
PK�|[��c��Eri/1.8/system/SOAP/EncodingStyle/SOAPHandler/encode_attr_value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#encode_attr_value
is_singleton: false
name: encode_attr_value
params: (generator, ns, qname, value)
visibility: private
PK�|[�4}���Eri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_attr_value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::SOAPHandler#decode_attr_value
is_singleton: false
name: decode_attr_value
params: (ns, qname, value)
visibility: private
PK�|[�g"�ddMri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/cdesc-ASPDotNetHandler.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Namespace
  value: "'http://tempuri.org/ASP.NET'"
full_name: SOAP::EncodingStyle::ASPDotNetHandler
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: decode_epilogue
- !ruby/object:RI::MethodSummary 
  name: decode_parent
- !ruby/object:RI::MethodSummary 
  name: decode_prologue
- !ruby/object:RI::MethodSummary 
  name: decode_tag
- !ruby/object:RI::MethodSummary 
  name: decode_tag_end
- !ruby/object:RI::MethodSummary 
  name: decode_text
- !ruby/object:RI::MethodSummary 
  name: decode_textbuf
- !ruby/object:RI::MethodSummary 
  name: encode_data
- !ruby/object:RI::MethodSummary 
  name: encode_data_end
name: ASPDotNetHandler
superclass: Handler
PK�|[�|��Tri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/SOAPUnknown/cdesc-SOAPUnknown.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::EncodingStyle::ASPDotNetHandler::SOAPUnknown
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: as_nil
- !ruby/object:RI::MethodSummary 
  name: as_string
- !ruby/object:RI::MethodSummary 
  name: as_struct
name: SOAPUnknown
superclass: SOAPTemporalObject
PK�|[�""���Kri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/SOAPUnknown/as_nil-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::ASPDotNetHandler::SOAPUnknown#as_nil
is_singleton: false
name: as_nil
params: ()
visibility: public
PK�|[����Nri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/SOAPUnknown/as_struct-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::ASPDotNetHandler::SOAPUnknown#as_struct
is_singleton: false
name: as_struct
params: ()
visibility: public
PK�|[/�~���Hri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/SOAPUnknown/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::ASPDotNetHandler::SOAPUnknown::new
is_singleton: true
name: new
params: (handler, elename)
visibility: public
PK�|[p�b;��Nri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/SOAPUnknown/as_string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::ASPDotNetHandler::SOAPUnknown#as_string
is_singleton: false
name: as_string
params: ()
visibility: public
PK�|[�a}���Hri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/decode_prologue-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::ASPDotNetHandler#decode_prologue
is_singleton: false
name: decode_prologue
params: ()
visibility: public
PK�|[�W����Gri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/decode_tag_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::ASPDotNetHandler#decode_tag_end
is_singleton: false
name: decode_tag_end
params: (ns, node)
visibility: public
PK�|[��Wz��bri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/SOAPTemporalObject/cdesc-SOAPTemporalObject.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: parent
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: decode interface.
constants: []

full_name: SOAP::EncodingStyle::ASPDotNetHandler::SOAPTemporalObject
includes: []

instance_methods: []

name: SOAPTemporalObject
superclass: Object
PK�|[�|����Ori/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/SOAPTemporalObject/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::ASPDotNetHandler::SOAPTemporalObject::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[���'��Hri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/decode_epilogue-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::ASPDotNetHandler#decode_epilogue
is_singleton: false
name: decode_epilogue
params: ()
visibility: public
PK�|[f:��Gri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/decode_textbuf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::ASPDotNetHandler#decode_textbuf
is_singleton: false
name: decode_textbuf
params: (node)
visibility: private
PK�|[\����<ri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::ASPDotNetHandler::new
is_singleton: true
name: new
params: (charset = nil)
visibility: public
PK�|[�����Hri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/encode_data_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::ASPDotNetHandler#encode_data_end
is_singleton: false
name: encode_data_end
params: (generator, ns, data, parent)
visibility: public
PK�|[w9�^��Fri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/decode_parent-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::ASPDotNetHandler#decode_parent
is_singleton: false
name: decode_parent
params: (parent, node)
visibility: public
PK�|[W�  Dri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/encode_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: encode interface.
full_name: SOAP::EncodingStyle::ASPDotNetHandler#encode_data
is_singleton: false
name: encode_data
params: (generator, ns, data, parent)
visibility: public
PK�|[�r��Dri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/decode_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::ASPDotNetHandler#decode_text
is_singleton: false
name: decode_text
params: (ns, text)
visibility: public
PK�|[0LR��Cri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/decode_tag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::ASPDotNetHandler#decode_tag
is_singleton: false
name: decode_tag
params: (ns, elename, attrs, parent)
visibility: public
PK�|[�
�k��Rri/1.8/system/SOAP/EncodingStyle/LiteralHandler/SOAPUnknown/cdesc-SOAPUnknown.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SOAP::EncodingStyle::LiteralHandler::SOAPUnknown
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: as_element
- !ruby/object:RI::MethodSummary 
  name: as_nil
- !ruby/object:RI::MethodSummary 
  name: as_string
name: SOAPUnknown
superclass: SOAPTemporalObject
PK�|[LXa��Iri/1.8/system/SOAP/EncodingStyle/LiteralHandler/SOAPUnknown/as_nil-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::LiteralHandler::SOAPUnknown#as_nil
is_singleton: false
name: as_nil
params: ()
visibility: public
PK�|[ˁ����Fri/1.8/system/SOAP/EncodingStyle/LiteralHandler/SOAPUnknown/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::LiteralHandler::SOAPUnknown::new
is_singleton: true
name: new
params: (handler, elename, extraattr)
visibility: public
PK�|[�6;���Mri/1.8/system/SOAP/EncodingStyle/LiteralHandler/SOAPUnknown/as_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::LiteralHandler::SOAPUnknown#as_element
is_singleton: false
name: as_element
params: ()
visibility: public
PK�|[9���Lri/1.8/system/SOAP/EncodingStyle/LiteralHandler/SOAPUnknown/as_string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::LiteralHandler::SOAPUnknown#as_string
is_singleton: false
name: as_string
params: ()
visibility: public
PK�|['��<��Fri/1.8/system/SOAP/EncodingStyle/LiteralHandler/decode_prologue-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::LiteralHandler#decode_prologue
is_singleton: false
name: decode_prologue
params: ()
visibility: public
PK�|[�#V��Eri/1.8/system/SOAP/EncodingStyle/LiteralHandler/decode_tag_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::LiteralHandler#decode_tag_end
is_singleton: false
name: decode_tag_end
params: (ns, node)
visibility: public
PK�|[a�Q��`ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/SOAPTemporalObject/cdesc-SOAPTemporalObject.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: parent
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: decode interface.
constants: []

full_name: SOAP::EncodingStyle::LiteralHandler::SOAPTemporalObject
includes: []

instance_methods: []

name: SOAPTemporalObject
superclass: Object
PK�|[�xqR��Mri/1.8/system/SOAP/EncodingStyle/LiteralHandler/SOAPTemporalObject/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::LiteralHandler::SOAPTemporalObject::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[>@"���Fri/1.8/system/SOAP/EncodingStyle/LiteralHandler/decode_epilogue-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::LiteralHandler#decode_epilogue
is_singleton: false
name: decode_epilogue
params: ()
visibility: public
PK�|[][��Eri/1.8/system/SOAP/EncodingStyle/LiteralHandler/decode_textbuf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::LiteralHandler#decode_textbuf
is_singleton: false
name: decode_textbuf
params: (node)
visibility: private
PK�|[�#��:ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::LiteralHandler::new
is_singleton: true
name: new
params: (charset = nil)
visibility: public
PK�|[�5]���Iri/1.8/system/SOAP/EncodingStyle/LiteralHandler/cdesc-LiteralHandler.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Namespace
  value: SOAP::LiteralNamespace
full_name: SOAP::EncodingStyle::LiteralHandler
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: decode_attrs
- !ruby/object:RI::MethodSummary 
  name: decode_epilogue
- !ruby/object:RI::MethodSummary 
  name: decode_parent
- !ruby/object:RI::MethodSummary 
  name: decode_prologue
- !ruby/object:RI::MethodSummary 
  name: decode_tag
- !ruby/object:RI::MethodSummary 
  name: decode_tag_end
- !ruby/object:RI::MethodSummary 
  name: decode_text
- !ruby/object:RI::MethodSummary 
  name: decode_textbuf
- !ruby/object:RI::MethodSummary 
  name: encode_data
- !ruby/object:RI::MethodSummary 
  name: encode_data_end
name: LiteralHandler
superclass: Handler
PK�|[�e�\��Fri/1.8/system/SOAP/EncodingStyle/LiteralHandler/encode_data_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::LiteralHandler#encode_data_end
is_singleton: false
name: encode_data_end
params: (generator, ns, data, parent)
visibility: public
PK�|[�D����Cri/1.8/system/SOAP/EncodingStyle/LiteralHandler/decode_attrs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::LiteralHandler#decode_attrs
is_singleton: false
name: decode_attrs
params: (ns, attrs)
visibility: public
PK�|[a-G���Dri/1.8/system/SOAP/EncodingStyle/LiteralHandler/decode_parent-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::LiteralHandler#decode_parent
is_singleton: false
name: decode_parent
params: (parent, node)
visibility: public
PK�|[��ĈBri/1.8/system/SOAP/EncodingStyle/LiteralHandler/encode_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: encode interface.
full_name: SOAP::EncodingStyle::LiteralHandler#encode_data
is_singleton: false
name: encode_data
params: (generator, ns, data, parent)
visibility: public
PK�|[,�����Bri/1.8/system/SOAP/EncodingStyle/LiteralHandler/decode_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::LiteralHandler#decode_text
is_singleton: false
name: decode_text
params: (ns, text)
visibility: public
PK�|[�n���Ari/1.8/system/SOAP/EncodingStyle/LiteralHandler/decode_tag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOAP::EncodingStyle::LiteralHandler#decode_tag
is_singleton: false
name: decode_tag
params: (ns, elename, attrs, parent)
visibility: public
PK�|[����#ri/1.8/system/SizedQueue/deq-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #pop"
full_name: SizedQueue#deq
is_singleton: false
name: deq
params: (*args)
visibility: public
PK�|[m�p���.ri/1.8/system/SizedQueue/cdesc-SizedQueue.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: This class represents queues of specified size capacity. The push operation may be blocked if the capacity is full.
- !ruby/struct:SM::Flow::P 
  body: See Queue for an example of how a SizedQueue works.
constants: []

full_name: SizedQueue
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: deq
- !ruby/object:RI::MethodSummary 
  name: enq
- !ruby/object:RI::MethodSummary 
  name: max
- !ruby/object:RI::MethodSummary 
  name: max=
- !ruby/object:RI::MethodSummary 
  name: num_waiting
- !ruby/object:RI::MethodSummary 
  name: pop
- !ruby/object:RI::MethodSummary 
  name: push
- !ruby/object:RI::MethodSummary 
  name: shift
name: SizedQueue
superclass: Queue
PK�|[Hܽ���#ri/1.8/system/SizedQueue/max-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the maximum size of the queue.
full_name: SizedQueue#max
is_singleton: false
name: max
params: ()
visibility: public
PK�|[�B]{��#ri/1.8/system/SizedQueue/enq-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #push"
full_name: SizedQueue#enq
is_singleton: false
name: enq
params: (obj)
visibility: public
PK�|[�M��aa#ri/1.8/system/SizedQueue/pop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: shift
- !ruby/object:RI::AliasName 
  name: deq
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Retrieves data from the queue and runs a waiting thread, if any.
full_name: SizedQueue#pop
is_singleton: false
name: pop
params: (*args)
visibility: public
PK�|[����

#ri/1.8/system/SizedQueue/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a fixed-length queue with a maximum size of <tt>max</tt>.
full_name: SizedQueue::new
is_singleton: true
name: new
params: (max)
visibility: public
PK�|[�ɮ��$ri/1.8/system/SizedQueue/push-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: "<<"
- !ruby/object:RI::AliasName 
  name: enq
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pushes <tt>obj</tt> to the queue. If there is no space left in the queue, waits until space becomes available.
full_name: SizedQueue#push
is_singleton: false
name: push
params: (obj)
visibility: public
PK�|[�����&ri/1.8/system/SizedQueue/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #push"
full_name: SizedQueue#<<
is_singleton: false
name: "<<"
params: (obj)
visibility: public
PK�|[��+��%ri/1.8/system/SizedQueue/shift-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #pop"
full_name: SizedQueue#shift
is_singleton: false
name: shift
params: (*args)
visibility: public
PK�|[����&ri/1.8/system/SizedQueue/max%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the maximum size of the queue.
full_name: SizedQueue#max=
is_singleton: false
name: max=
params: (max)
visibility: public
PK�|[y�g�+ri/1.8/system/SizedQueue/num_waiting-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of threads waiting on the queue.
full_name: SizedQueue#num_waiting
is_singleton: false
name: num_waiting
params: ()
visibility: public
PK�|[�ٻ���*ri/1.8/system/EOFError/cdesc-EOFError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Class <tt>IO</tt> is the basis for all input and output in Ruby. An I/O stream may be <em>duplexed</em> (that is, bidirectional), and so may use more than one native operating system stream.
- !ruby/struct:SM::Flow::P 
  body: Many of the examples in this section use class <tt>File</tt>, the only standard subclass of <tt>IO</tt>. The two classes are closely associated.
- !ruby/struct:SM::Flow::P 
  body: As used in this section, <em>portname</em> may take any of the following forms.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: A plain string represents a filename suitable for the underlying operating system.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: A string starting with ``<tt>|</tt>'' indicates a subprocess. The remainder of the string following the ``<tt>|</tt>'' is invoked as a process with appropriate input/output channels connected to it.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: A string equal to ``<tt>|-</tt>'' will create another Ruby instance as a subprocess.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "Ruby will convert pathnames between different operating system conventions if possible. For instance, on a Windows system the filename ``<tt>/gumby/ruby/test.rb</tt>'' will be opened as ``<tt>\\gumby\\ruby\\test.rb</tt>''. When specifying a Windows-style filename in a Ruby string, remember to escape the backslashes:"
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;c:\\gumby\\ruby\\test.rb&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: Our examples here will use the Unix-style forward slashes; <tt>File::SEPARATOR</tt> can be used to get the platform-specific separator character.
- !ruby/struct:SM::Flow::P 
  body: I/O ports may be opened in any one of several different modes, which are shown in this section as <em>mode</em>. The mode may either be a Fixnum or a String. If numeric, it should be one of the operating system specific constants (O_RDONLY, O_WRONLY, O_RDWR, O_APPEND and so on). See man open(2) for more information.
- !ruby/struct:SM::Flow::P 
  body: If the mode is given as a String, it must be one of the values listed in the following table.
- !ruby/struct:SM::Flow::VERB 
  body: "  Mode |  Meaning\n  -----+--------------------------------------------------------\n  &quot;r&quot;  |  Read-only, starts at beginning of file  (default mode).\n  -----+--------------------------------------------------------\n  &quot;r+&quot; |  Read-write, starts at beginning of file.\n  -----+--------------------------------------------------------\n  &quot;w&quot;  |  Write-only, truncates existing file\n       |  to zero length or creates a new file for writing.\n  -----+--------------------------------------------------------\n  &quot;w+&quot; |  Read-write, truncates existing file to zero length\n       |  or creates a new file for reading and writing.\n  -----+--------------------------------------------------------\n  &quot;a&quot;  |  Write-only, starts at end of file if file exists,\n       |  otherwise creates a new file for writing.\n  -----+--------------------------------------------------------\n  &quot;a+&quot; |  Read-write, starts at end of file if file exists,\n       |  otherwise creates a new file for reading and\n       |  writing.\n  -----+--------------------------------------------------------\n   &quot;b&quot; |  (DOS/Windows only) Binary file mode (may appear with\n       |  any of the key letters listed above).\n"
- !ruby/struct:SM::Flow::P 
  body: The global constant ARGF (also accessible as $&lt;) provides an IO-like stream which allows access to all files mentioned on the command line (or STDIN if no files are mentioned). ARGF provides the methods <tt>#path</tt> and <tt>#filename</tt> to access the name of the file currently being read.
constants: []

full_name: EOFError
includes: []

instance_methods: []

name: EOFError
superclass: IOError
PK�|[B���uu!ri/1.8/system/Integer/pred-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the <tt>Integer</tt> equal to <em>int</em> - 1.
- !ruby/struct:SM::Flow::VERB 
  body: "   1.pred      #=&gt; 0\n   (-1).pred   #=&gt; -2\n"
full_name: Integer#pred
is_singleton: false
name: pred
params: |
  int.pred    => integer

visibility: public
PK�|[ҟ�#ri/1.8/system/Integer/odd%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>int</em> is an odd number.
full_name: Integer#odd?
is_singleton: false
name: odd?
params: |
  int.odd? -> true or false

visibility: public
PK�|[�Q��� ri/1.8/system/Integer/chr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a string containing the ASCII character represented by the receiver's value.
- !ruby/struct:SM::Flow::VERB 
  body: "   65.chr    #=&gt; &quot;A&quot;\n   ?a.chr    #=&gt; &quot;a&quot;\n   230.chr   #=&gt; &quot;\\346&quot;\n"
full_name: Integer#chr
is_singleton: false
name: chr
params: |
  int.chr    => string

visibility: public
PK�|[�\�<'ri/1.8/system/Integer/integer%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Always returns <tt>true</tt>.
full_name: Integer#integer?
is_singleton: false
name: integer?
params: |
  int.integer? -> true

visibility: public
PK�|[�S1��!ri/1.8/system/Integer/to_i-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: As <em>int</em> is already an <tt>Integer</tt>, all these methods simply return the receiver.
full_name: Integer#to_i
is_singleton: false
name: to_i
params: |
  int.to_i      => int
  int.to_int    => int
  int.floor     => int
  int.ceil      => int
  int.round     => int
  int.truncate  => int

visibility: public
PK�|[�B�v��(ri/1.8/system/Integer/cdesc-Integer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: from_prime_division
- !ruby/object:RI::MethodSummary 
  name: induced_from
comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>Integer</tt> is the basis for the two concrete classes that hold whole numbers, <tt>Bignum</tt> and <tt>Fixnum</tt>.
constants: []

full_name: Integer
includes: 
- !ruby/object:RI::IncludedModule 
  name: Precision
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ceil
- !ruby/object:RI::MethodSummary 
  name: chr
- !ruby/object:RI::MethodSummary 
  name: denominator
- !ruby/object:RI::MethodSummary 
  name: denominator
- !ruby/object:RI::MethodSummary 
  name: downto
- !ruby/object:RI::MethodSummary 
  name: even?
- !ruby/object:RI::MethodSummary 
  name: floor
- !ruby/object:RI::MethodSummary 
  name: gcd
- !ruby/object:RI::MethodSummary 
  name: gcd
- !ruby/object:RI::MethodSummary 
  name: gcd2
- !ruby/object:RI::MethodSummary 
  name: gcdlcm
- !ruby/object:RI::MethodSummary 
  name: integer?
- !ruby/object:RI::MethodSummary 
  name: lcm
- !ruby/object:RI::MethodSummary 
  name: lcm
- !ruby/object:RI::MethodSummary 
  name: next
- !ruby/object:RI::MethodSummary 
  name: numerator
- !ruby/object:RI::MethodSummary 
  name: numerator
- !ruby/object:RI::MethodSummary 
  name: odd?
- !ruby/object:RI::MethodSummary 
  name: ord
- !ruby/object:RI::MethodSummary 
  name: pred
- !ruby/object:RI::MethodSummary 
  name: prime_division
- !ruby/object:RI::MethodSummary 
  name: round
- !ruby/object:RI::MethodSummary 
  name: succ
- !ruby/object:RI::MethodSummary 
  name: times
- !ruby/object:RI::MethodSummary 
  name: to_i
- !ruby/object:RI::MethodSummary 
  name: to_int
- !ruby/object:RI::MethodSummary 
  name: to_r
- !ruby/object:RI::MethodSummary 
  name: to_yaml
- !ruby/object:RI::MethodSummary 
  name: truncate
- !ruby/object:RI::MethodSummary 
  name: upto
name: Integer
superclass: Numeric
PK�|[߻���&ri/1.8/system/Integer/numerator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Integer#numerator
is_singleton: false
name: numerator
params: ()
visibility: public
PK�|["�yZ��$ri/1.8/system/Integer/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Integer#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PK�|[���$$!ri/1.8/system/Integer/upto-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates <em>block</em>, passing in integer values from <em>int</em> up to and including <em>limit</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   5.upto(10) { |i| print i, &quot; &quot; }\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   5 6 7 8 9 10\n"
full_name: Integer#upto
is_singleton: false
name: upto
params: |
  int.upto(limit) {|i| block }     => int

visibility: public
PK�|[�m��+ri/1.8/system/Integer/prime_division-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Integer#prime_division
is_singleton: false
name: prime_division
params: ()
visibility: public
PK�|[IL�R�� ri/1.8/system/Integer/ord-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the int itself.
- !ruby/struct:SM::Flow::VERB 
  body: "   ?a.ord    #=&gt; 97\n"
- !ruby/struct:SM::Flow::P 
  body: This method is intended for compatibility to character constant in Ruby 1.9. For example, ?a.ord returns 97 both in 1.8 and 1.9.
full_name: Integer#ord
is_singleton: false
name: ord
params: |
  int.ord    => int

visibility: public
PK�|[v@���#ri/1.8/system/Integer/gcdlcm-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns the GCD <em>and</em> the LCM (see #gcd and #lcm) of the two arguments (<tt>self</tt> and <tt>other</tt>). This is more efficient than calculating them separately."
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  6.gcdlcm 9     # -&gt; [3, 18]\n"
full_name: Integer#gcdlcm
is_singleton: false
name: gcdlcm
params: (other)
visibility: public
PK�|[�c�ڍ�!ri/1.8/system/Integer/next-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the <tt>Integer</tt> equal to <em>int</em> + 1.
- !ruby/struct:SM::Flow::VERB 
  body: "   1.next      #=&gt; 2\n   (-1).next   #=&gt; 0\n"
full_name: Integer#next
is_singleton: false
name: next
params: |
  int.next    => integer
  int.succ    => integer

visibility: public
PK�|[�4֥��!ri/1.8/system/Integer/gcd2-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Integer#gcd2
is_singleton: false
name: gcd2
params: (int)
visibility: public
PK�|[��T�� ri/1.8/system/Integer/lcm-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the <em>lowest common multiple</em> (LCM) of the two arguments (<tt>self</tt> and <tt>other</tt>).
- !ruby/struct:SM::Flow::P 
  body: "Examples:"
- !ruby/struct:SM::Flow::VERB 
  body: "  6.lcm 7        # -&gt; 42\n  6.lcm 9        # -&gt; 18\n"
full_name: Integer#lcm
is_singleton: false
name: lcm
params: (other)
visibility: public
PK�|[!щ��!ri/1.8/system/Integer/ceil-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: As <em>int</em> is already an <tt>Integer</tt>, all these methods simply return the receiver.
full_name: Integer#ceil
is_singleton: false
name: ceil
params: |
  int.to_i      => int
  int.to_int    => int
  int.floor     => int
  int.ceil      => int
  int.round     => int
  int.truncate  => int

visibility: public
PK�|[����(ri/1.8/system/Integer/denominator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Integer#denominator
is_singleton: false
name: denominator
params: ()
visibility: public
PK�|[��(�"ri/1.8/system/Integer/times-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates block <em>int</em> times, passing in values from zero to <em>int</em> - 1.
- !ruby/struct:SM::Flow::VERB 
  body: "   5.times do |i|\n     print i, &quot; &quot;\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   0 1 2 3 4\n"
full_name: Integer#times
is_singleton: false
name: times
params: |
  int.times {|i| block }     => int

visibility: public
PK�|[o5t��%ri/1.8/system/Integer/truncate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: As <em>int</em> is already an <tt>Integer</tt>, all these methods simply return the receiver.
full_name: Integer#truncate
is_singleton: false
name: truncate
params: |
  int.to_i      => int
  int.to_int    => int
  int.floor     => int
  int.ceil      => int
  int.round     => int
  int.truncate  => int

visibility: public
PK�|[�����#ri/1.8/system/Integer/to_int-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: As <em>int</em> is already an <tt>Integer</tt>, all these methods simply return the receiver.
full_name: Integer#to_int
is_singleton: false
name: to_int
params: |
  int.to_i      => int
  int.to_int    => int
  int.floor     => int
  int.ceil      => int
  int.round     => int
  int.truncate  => int

visibility: public
PK�|[�ml��!ri/1.8/system/Integer/succ-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the <tt>Integer</tt> equal to <em>int</em> + 1.
- !ruby/struct:SM::Flow::VERB 
  body: "   1.next      #=&gt; 2\n   (-1).next   #=&gt; 0\n"
full_name: Integer#succ
is_singleton: false
name: succ
params: |
  int.next    => integer
  int.succ    => integer

visibility: public
PK�|[	�,$ri/1.8/system/Integer/even%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>int</em> is an even number.
full_name: Integer#even?
is_singleton: false
name: even?
params: |
  int.even? -> true or false

visibility: public
PK�|[�޸���!ri/1.8/system/Integer/to_r-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a Rational representation of this integer.
full_name: Integer#to_r
is_singleton: false
name: to_r
params: ()
visibility: public
PK�|[{v�.. ri/1.8/system/Integer/gcd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the <em>greatest common denominator</em> of the two numbers (<tt>self</tt> and <tt>n</tt>).
- !ruby/struct:SM::Flow::P 
  body: "Examples:"
- !ruby/struct:SM::Flow::VERB 
  body: "  72.gcd 168           # -&gt; 24\n  19.gcd 36            # -&gt; 1\n"
- !ruby/struct:SM::Flow::P 
  body: The result is positive, no matter the sign of the arguments.
full_name: Integer#gcd
is_singleton: false
name: gcd
params: (other)
visibility: public
PK�|[����--)ri/1.8/system/Integer/induced_from-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert <tt>obj</tt> to an Integer.
full_name: Integer::induced_from
is_singleton: true
name: induced_from
params: |
  Integer.induced_from(obj)    =>  fixnum, bignum

visibility: public
PK�|[����"ri/1.8/system/Integer/round-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: As <em>int</em> is already an <tt>Integer</tt>, all these methods simply return the receiver.
full_name: Integer#round
is_singleton: false
name: round
params: |
  int.to_i      => int
  int.to_int    => int
  int.floor     => int
  int.ceil      => int
  int.round     => int
  int.truncate  => int

visibility: public
PK�|[u�1J��0ri/1.8/system/Integer/from_prime_division-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Integer::from_prime_division
is_singleton: true
name: from_prime_division
params: (pd)
visibility: public
PK�|[�!���"ri/1.8/system/Integer/floor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: As <em>int</em> is already an <tt>Integer</tt>, all these methods simply return the receiver.
full_name: Integer#floor
is_singleton: false
name: floor
params: |
  int.to_i      => int
  int.to_int    => int
  int.floor     => int
  int.ceil      => int
  int.round     => int
  int.truncate  => int

visibility: public
PK�|[��ee#ri/1.8/system/Integer/downto-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates <em>block</em>, passing decreasing values from <em>int</em> down to and including <em>limit</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   5.downto(1) { |n| print n, &quot;.. &quot; }\n   print &quot;  Liftoff!\\n&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   5.. 4.. 3.. 2.. 1..   Liftoff!\n"
full_name: Integer#downto
is_singleton: false
name: downto
params: |
  int.downto(limit) {|i| block }     => int

visibility: public
PK�|[$�!Ĵ�2ri/1.8/system/DRb/DRbUnknown/cdesc-DRbUnknown.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Buffer contained the marshalled, unknown object.
  name: buf
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The name of the unknown thing.
  - !ruby/struct:SM::Flow::P 
    body: Class name for unknown objects; variable name for unknown constants.
  name: name
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Class wrapping a marshalled object whose type is unknown locally.
- !ruby/struct:SM::Flow::P 
  body: If an object is returned by a method invoked over drb, but the class of the object is unknown in the client namespace, or the object is a constant unknown in the client namespace, then the still-marshalled object is returned wrapped in a DRbUnknown instance.
- !ruby/struct:SM::Flow::P 
  body: If this object is passed as an argument to a method invoked over drb, then the wrapped object is passed instead.
- !ruby/struct:SM::Flow::P 
  body: The class or constant name of the object can be read from the <tt>name</tt> attribute. The marshalled object is held in the <tt>buf</tt> attribute.
constants: []

full_name: DRb::DRbUnknown
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: exception
- !ruby/object:RI::MethodSummary 
  name: reload
name: DRbUnknown
superclass: Object
PK�|[T�Y���*ri/1.8/system/DRb/DRbUnknown/reload-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Attempt to load the wrapped marshalled object again.
- !ruby/struct:SM::Flow::P 
  body: If the class of the object is now known locally, the object will be unmarshalled and returned. Otherwise, a new but identical DRbUnknown object will be returned.
full_name: DRb::DRbUnknown#reload
is_singleton: false
name: reload
params: ()
visibility: public
PK�|[a^5`��'ri/1.8/system/DRb/DRbUnknown/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new DRbUnknown object.
- !ruby/struct:SM::Flow::P 
  body: <tt>buf</tt> is a string containing a marshalled object that could not be unmarshalled. <tt>err</tt> is the error message that was raised when the unmarshalling failed. It is used to determine the name of the unmarshalled object.
full_name: DRb::DRbUnknown::new
is_singleton: true
name: new
params: (err, buf)
visibility: public
PK�|[!�f�-ri/1.8/system/DRb/DRbUnknown/exception-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a DRbUnknownError exception containing this object.
full_name: DRb::DRbUnknown#exception
is_singleton: false
name: exception
params: ()
visibility: public
PK�|[���}��"ri/1.8/system/DRb/GW/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::GW#[]
is_singleton: false
name: "[]"
params: (key)
visibility: public
PK�|[�ڡ&��ri/1.8/system/DRb/GW/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::GW::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[J���rr"ri/1.8/system/DRb/GW/cdesc-GW.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: DRb::GW
includes: 
- !ruby/object:RI::IncludedModule 
  name: MonitorMixin
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
name: GW
superclass: Object
PK�|[I���%ri/1.8/system/DRb/GW/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::GW#[]=
is_singleton: false
name: "[]="
params: (key, v)
visibility: public
PK�|[R
P�<<6ri/1.8/system/DRb/DRbConnError/cdesc-DRbConnError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Error raised when an error occurs on the underlying communication protocol.
constants: []

full_name: DRb::DRbConnError
includes: []

instance_methods: []

name: DRbConnError
superclass: DRbError
PK�|[���hh0ri/1.8/system/DRb/DRbBadURI/cdesc-DRbBadURI.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Error raised by the DRbProtocol module when it cannot find any protocol implementation support the scheme specified in a URI.
constants: []

full_name: DRb::DRbBadURI
includes: []

instance_methods: []

name: DRbBadURI
superclass: DRbError
PK�|[�&9!--$ri/1.8/system/DRb/install_acl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the default acl.
- !ruby/struct:SM::Flow::P 
  body: See DRb::DRbServer.default_acl.
full_name: DRb#install_acl
is_singleton: false
name: install_acl
params: (acl)
visibility: public
PK�|[�@:�oo,ri/1.8/system/DRb/DRbConn/cdesc-DRbConn.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Class handling the connection between a DRbObject and the server the real object lives on.
- !ruby/struct:SM::Flow::P 
  body: This class maintains a pool of connections, to reduce the overhead of starting and closing down connections for each method call.
- !ruby/struct:SM::Flow::P 
  body: This class is used internally by DRbObject. The user does not normally need to deal with it directly.
constants: []

full_name: DRb::DRbConn
includes: []

instance_methods: []

name: DRbConn
superclass: Object
PK�|[��ȥ��)ri/1.8/system/DRb/DRbIdConv/to_obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert an object reference id to an object.
- !ruby/struct:SM::Flow::P 
  body: This implementation looks up the reference id in the local object space and returns the object it refers to.
full_name: DRb::DRbIdConv#to_obj
is_singleton: false
name: to_obj
params: (ref)
visibility: public
PK�|[�=�==0ri/1.8/system/DRb/DRbIdConv/cdesc-DRbIdConv.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Class responsible for converting between an object and its id.
- !ruby/struct:SM::Flow::P 
  body: This, the default implementation, uses an object's local ObjectSpace <em>id</em> as its id. This means that an object's identification over drb remains valid only while that object instance remains alive within the server runtime.
- !ruby/struct:SM::Flow::P 
  body: For alternative mechanisms, see DRb::TimerIdConv in rdb/timeridconv.rb and DRbNameIdConv in sample/name.rb in the full drb distribution.
constants: []

full_name: DRb::DRbIdConv
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_id
- !ruby/object:RI::MethodSummary 
  name: to_obj
name: DRbIdConv
superclass: Object
PK�|[���nn(ri/1.8/system/DRb/DRbIdConv/to_id-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert an object into a reference id.
- !ruby/struct:SM::Flow::P 
  body: This implementation returns the object's <em>id</em> in the local object space.
full_name: DRb::DRbIdConv#to_id
is_singleton: false
name: to_id
params: (obj)
visibility: public
PK�|[��;=��$ri/1.8/system/DRb/ExtServ/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::ExtServ::new
is_singleton: true
name: new
params: (there, name, server=nil)
visibility: public
PK�|[	�5���-ri/1.8/system/DRb/ExtServ/stop_service-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::ExtServ#stop_service
is_singleton: false
name: stop_service
params: ()
visibility: public
PK�|[��ӥ��)ri/1.8/system/DRb/ExtServ/alive%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::ExtServ#alive?
is_singleton: false
name: alive?
params: ()
visibility: public
PK�|[�L��&ri/1.8/system/DRb/ExtServ/front-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::ExtServ#front
is_singleton: false
name: front
params: ()
visibility: public
PK�|[�����,ri/1.8/system/DRb/ExtServ/cdesc-ExtServ.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: server
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: DRb::ExtServ
includes: 
- !ruby/object:RI::IncludedModule 
  name: DRbUndumped
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: alive?
- !ruby/object:RI::MethodSummary 
  name: front
- !ruby/object:RI::MethodSummary 
  name: stop_service
name: ExtServ
superclass: Object
PK�|[�k�H.ri/1.8/system/DRb/DRbError/cdesc-DRbError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Superclass of all errors raised in the DRb module.
constants: []

full_name: DRb::DRbError
includes: []

instance_methods: []

name: DRbError
superclass: RuntimeError
PK�|[AEKzOOri/1.8/system/DRb/uri-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the URI defining the local dRuby space.
- !ruby/struct:SM::Flow::P 
  body: "This is the URI of the current server. See #current_server."
full_name: DRb#uri
is_singleton: false
name: uri
params: ()
visibility: public
PK�|[�D��'ri/1.8/system/DRb/DRbArray/_load-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbArray::_load
is_singleton: true
name: _load
params: (s)
visibility: public
PK�|[�׫Ȫ�%ri/1.8/system/DRb/DRbArray/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbArray::new
is_singleton: true
name: new
params: (ary)
visibility: public
PK�|[�)��JJ.ri/1.8/system/DRb/DRbArray/cdesc-DRbArray.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: _load
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: DRb::DRbArray
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _dump
name: DRbArray
superclass: Object
PK�|[Cച��'ri/1.8/system/DRb/DRbArray/_dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbArray#_dump
is_singleton: false
name: _dump
params: (lv)
visibility: public
PK�|[Fկ���@ri/1.8/system/DRb/DRbServerNotFound/cdesc-DRbServerNotFound.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: "Error raised by the DRb module when an attempt is made to refer to the context's current drb server but the context does not have one. See #current_server."
constants: []

full_name: DRb::DRbServerNotFound
includes: []

instance_methods: []

name: DRbServerNotFound
superclass: DRbError
PK�|[�}�U��6ri/1.8/system/DRb/DRbURIOption/cdesc-DRbURIOption.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: DRb::DRbURIOption
includes: []

instance_methods: []

name: DRbURIOption
superclass: Object
PK�|[��/H

 ri/1.8/system/DRb/cdesc-DRb.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The primary local dRuby server.
  - !ruby/struct:SM::Flow::P 
    body: "This is the server created by the #start_service call."
  name: primary_server
  rw: RW
class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: for ruby-1.8.0
constants: []

full_name: DRb
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: config
- !ruby/object:RI::MethodSummary 
  name: current_server
- !ruby/object:RI::MethodSummary 
  name: fetch_server
- !ruby/object:RI::MethodSummary 
  name: front
- !ruby/object:RI::MethodSummary 
  name: here?
- !ruby/object:RI::MethodSummary 
  name: install_acl
- !ruby/object:RI::MethodSummary 
  name: install_id_conv
- !ruby/object:RI::MethodSummary 
  name: mutex
- !ruby/object:RI::MethodSummary 
  name: regist_server
- !ruby/object:RI::MethodSummary 
  name: remove_server
- !ruby/object:RI::MethodSummary 
  name: start_service
- !ruby/object:RI::MethodSummary 
  name: stop_service
- !ruby/object:RI::MethodSummary 
  name: thread
- !ruby/object:RI::MethodSummary 
  name: to_id
- !ruby/object:RI::MethodSummary 
  name: to_obj
- !ruby/object:RI::MethodSummary 
  name: uri
name: DRb
superclass: 
PK�|[��ݨ^^6ri/1.8/system/DRb/DRbBadScheme/cdesc-DRbBadScheme.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Error raised by a dRuby protocol when it doesn't support the scheme specified in a URI. See DRb::DRbProtocol.
constants: []

full_name: DRb::DRbBadScheme
includes: []

instance_methods: []

name: DRbBadScheme
superclass: DRbError
PK�|["�‡�ri/1.8/system/DRb/to_obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a reference into an object using the current server.
- !ruby/struct:SM::Flow::P 
  body: "This raises a DRbServerNotFound error if there is no current server. See #current_server."
full_name: DRb#to_obj
is_singleton: false
name: to_obj
params: (ref)
visibility: public
PK�|[���pp&ri/1.8/system/DRb/start_service-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Start a dRuby server locally.
- !ruby/struct:SM::Flow::P 
  body: The new dRuby server will become the primary server, even if another server is currently the primary server.
- !ruby/struct:SM::Flow::P 
  body: <tt>uri</tt> is the URI for the server to bind to. If nil, the server will bind to random port on the default local host name and use the default dRuby protocol.
- !ruby/struct:SM::Flow::P 
  body: <tt>front</tt> is the server's front object. This may be nil.
- !ruby/struct:SM::Flow::P 
  body: <tt>config</tt> is the configuration for the new server. This may be nil.
- !ruby/struct:SM::Flow::P 
  body: See DRbServer::new.
full_name: DRb#start_service
is_singleton: false
name: start_service
params: (uri=nil, front=nil, config=nil)
visibility: public
PK�|[H�)tt5ri/1.8/system/DRb/DRbServer/default_load_limit-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the default value for the :load_limit option.
- !ruby/struct:SM::Flow::P 
  body: "See #new(). The initial default value is 25 MB."
full_name: DRb::DRbServer::default_load_limit
is_singleton: true
name: default_load_limit
params: (sz)
visibility: public
PK�|[caoBrr8ri/1.8/system/DRb/DRbServer/check_insecure_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Check that a method is callable via dRuby.
- !ruby/struct:SM::Flow::P 
  body: <tt>obj</tt> is the object we want to invoke the method on. <tt>msg_id</tt> is the method name, as a Symbol.
- !ruby/struct:SM::Flow::P 
  body: "If the method is an insecure method (see #insecure_method?) a SecurityError is thrown. If the method is private or undefined, a NameError is thrown."
full_name: DRb::DRbServer#check_insecure_method
is_singleton: false
name: check_insecure_method
params: (obj, msg_id)
visibility: public
PK�|[�R�9WW-ri/1.8/system/DRb/DRbServer/verbose%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set whether to operate in verbose mode.
- !ruby/struct:SM::Flow::P 
  body: In verbose mode, failed calls are logged to stdout.
full_name: DRb::DRbServer#verbose=
is_singleton: false
name: verbose=
params: (v)
visibility: public
PK�|[cUT<<,ri/1.8/system/DRb/DRbServer/main_loop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The main loop performed by a DRbServer's internal thread.
- !ruby/struct:SM::Flow::P 
  body: Accepts a connection from a client, and starts up its own thread to handle it. This thread loops, receiving requests from the client, invoking them on a local object, and returning responses, until the client closes the connection or a local method call fails.
full_name: DRb::DRbServer#main_loop
is_singleton: false
name: main_loop
params: ()
visibility: private
PK�|[�o=^^.ri/1.8/system/DRb/DRbServer/default_acl-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the default value for the :acl option.
- !ruby/struct:SM::Flow::P 
  body: "See #new(). The initial default value is nil."
full_name: DRb::DRbServer::default_acl
is_singleton: true
name: default_acl
params: (acl)
visibility: public
PK�|[�>4���0ri/1.8/system/DRb/DRbServer/cdesc-DRbServer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The configuration of this DRbServer
  name: config
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The front object of the DRbServer.
  - !ruby/struct:SM::Flow::P 
    body: This object receives remote method calls made on the server's URI alone, with an object id.
  name: front
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: safe_level
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The main thread of this DRbServer.
  - !ruby/struct:SM::Flow::P 
    body: This is the thread that listens for and accepts connections from clients, not that handles each client's request-response session.
  name: thread
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The URI of this DRbServer.
  name: uri
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: default_acl
- !ruby/object:RI::MethodSummary 
  name: default_argc_limit
- !ruby/object:RI::MethodSummary 
  name: default_id_conv
- !ruby/object:RI::MethodSummary 
  name: default_load_limit
- !ruby/object:RI::MethodSummary 
  name: default_safe_level
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: verbose
- !ruby/object:RI::MethodSummary 
  name: verbose=
comment: 
- !ruby/struct:SM::Flow::P 
  body: Class representing a drb server instance.
- !ruby/struct:SM::Flow::P 
  body: A DRbServer must be running in the local process before any incoming dRuby calls can be accepted, or any local objects can be passed as dRuby references to remote processes, even if those local objects are never actually called remotely. You do not need to start a DRbServer in the local process if you are only making outgoing dRuby calls passing marshalled parameters.
- !ruby/struct:SM::Flow::P 
  body: Unless multiple servers are being used, the local DRbServer is normally started by calling DRb.start_service.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: List of insecure methods.
  - !ruby/struct:SM::Flow::P 
    body: These methods are not callable via dRuby.
  name: INSECURE_METHOD
  value: "[       :__send__"
full_name: DRb::DRbServer
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: alive?
- !ruby/object:RI::MethodSummary 
  name: any_to_s
- !ruby/object:RI::MethodSummary 
  name: check_insecure_method
- !ruby/object:RI::MethodSummary 
  name: insecure_method?
- !ruby/object:RI::MethodSummary 
  name: kill_sub_thread
- !ruby/object:RI::MethodSummary 
  name: main_loop
- !ruby/object:RI::MethodSummary 
  name: run
- !ruby/object:RI::MethodSummary 
  name: stop_service
- !ruby/object:RI::MethodSummary 
  name: to_id
- !ruby/object:RI::MethodSummary 
  name: to_obj
- !ruby/object:RI::MethodSummary 
  name: verbose
- !ruby/object:RI::MethodSummary 
  name: verbose=
name: DRbServer
superclass: Object
PK�|[�#6+)ri/1.8/system/DRb/DRbServer/to_obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a dRuby reference to the local object it refers to.
full_name: DRb::DRbServer#to_obj
is_singleton: false
name: to_obj
params: (ref)
visibility: public
PK�|[t�A$��2ri/1.8/system/DRb/DRbServer/kill_sub_thread-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbServer#kill_sub_thread
is_singleton: false
name: kill_sub_thread
params: ()
visibility: private
PK�|[4{,�[
[
&ri/1.8/system/DRb/DRbServer/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new DRbServer instance.
- !ruby/struct:SM::Flow::P 
  body: "<tt>uri</tt> is the URI to bind to. This is normally of the form 'druby://&lt;hostname&gt;:&lt;port&gt;' where &lt;hostname&gt; is a hostname of the local machine. If nil, then the system's default hostname will be bound to, on a port selected by the system; these value can be retrieved from the <tt>uri</tt> attribute. 'druby:' specifies the default dRuby transport protocol: another protocol, such as 'drbunix:', can be specified instead."
- !ruby/struct:SM::Flow::P 
  body: <tt>front</tt> is the front object for the server, that is, the object to which remote method calls on the server will be passed. If nil, then the server will not accept remote method calls.
- !ruby/struct:SM::Flow::P 
  body: "If <tt>config_or_acl</tt> is a hash, it is the configuration to use for this server. The following options are recognised:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: ":idconv :"
    body: an id-to-object conversion object. This defaults to an instance of the class DRb::DRbIdConv.
  - !ruby/struct:SM::Flow::LI 
    label: ":verbose :"
    body: if true, all unsuccessful remote calls on objects in the server will be logged to $stdout. false by default.
  - !ruby/struct:SM::Flow::LI 
    label: ":tcp_acl :"
    body: the access control list for this server. See the ACL class from the main dRuby distribution.
  - !ruby/struct:SM::Flow::LI 
    label: ":load_limit :"
    body: the maximum message size in bytes accepted by the server. Defaults to 25 MB (26214400).
  - !ruby/struct:SM::Flow::LI 
    label: ":argc_limit :"
    body: the maximum number of arguments to a remote method accepted by the server. Defaults to 256.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: "The default values of these options can be modified on a class-wide basis by the class methods #default_argc_limit, #default_load_limit, #default_acl, #default_id_conv, and #verbose="
- !ruby/struct:SM::Flow::P 
  body: If <tt>config_or_acl</tt> is not a hash, but is not nil, it is assumed to be the access control list for this server. See the :tcp_acl option for more details.
- !ruby/struct:SM::Flow::P 
  body: If no other server is currently set as the primary server, this will become the primary server.
- !ruby/struct:SM::Flow::P 
  body: The server will immediately start running in its own thread.
full_name: DRb::DRbServer::new
is_singleton: true
name: new
params: (uri=nil, front=nil, config_or_acl=nil)
visibility: public
PK�|[!�y��@ri/1.8/system/DRb/DRbServer/InvokeMethod/cdesc-InvokeMethod.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: DRb::DRbServer::InvokeMethod
includes: []

instance_methods: []

name: InvokeMethod
superclass: Object
PK�|[n��~~2ri/1.8/system/DRb/DRbServer/default_id_conv-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the default value for the :id_conv option.
- !ruby/struct:SM::Flow::P 
  body: "See #new(). The initial default value is a DRbIdConv instance."
full_name: DRb::DRbServer::default_id_conv
is_singleton: true
name: default_id_conv
params: (idconv)
visibility: public
PK�|[��+��/ri/1.8/system/DRb/DRbServer/stop_service-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Stop this server.
full_name: DRb::DRbServer#stop_service
is_singleton: false
name: stop_service
params: ()
visibility: public
PK�|[���b))5ri/1.8/system/DRb/DRbServer/insecure_method%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Has a method been included in the list of insecure methods?
full_name: DRb::DRbServer#insecure_method?
is_singleton: false
name: insecure_method?
params: (msg_id)
visibility: private
PK�|[��
��+ri/1.8/system/DRb/DRbServer/alive%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Is this server alive?
full_name: DRb::DRbServer#alive?
is_singleton: false
name: alive?
params: ()
visibility: public
PK�|[%Yӭ��&ri/1.8/system/DRb/DRbServer/run-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbServer#run
is_singleton: false
name: run
params: ()
visibility: private
PK�|[,�L/*ri/1.8/system/DRb/DRbServer/verbose-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the default value of the :verbose option.
full_name: DRb::DRbServer::verbose
is_singleton: true
name: verbose
params: ()
visibility: public
PK�|[;��5ri/1.8/system/DRb/DRbServer/default_safe_level-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbServer::default_safe_level
is_singleton: true
name: default_safe_level
params: (level)
visibility: public
PK�|[�E�tt5ri/1.8/system/DRb/DRbServer/default_argc_limit-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the default value for the :argc_limit option.
- !ruby/struct:SM::Flow::P 
  body: "See #new(). The initial default value is 256."
full_name: DRb::DRbServer::default_argc_limit
is_singleton: true
name: default_argc_limit
params: (argc)
visibility: public
PK�|[��(ri/1.8/system/DRb/DRbServer/to_id-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a local object to a dRuby reference.
full_name: DRb::DRbServer#to_id
is_singleton: false
name: to_id
params: (obj)
visibility: public
PK�|[�0{WW*ri/1.8/system/DRb/DRbServer/verbose-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get whether the server is in verbose mode.
- !ruby/struct:SM::Flow::P 
  body: In verbose mode, failed calls are logged to stdout.
full_name: DRb::DRbServer#verbose
is_singleton: false
name: verbose
params: ()
visibility: public
PK�|[�#V�MMNri/1.8/system/DRb/DRbServer/InvokeMethod18Mixin/cdesc-InvokeMethod18Mixin.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: DRb::DRbServer::InvokeMethod18Mixin
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: block_yield
- !ruby/object:RI::MethodSummary 
  name: perform_with_block
name: InvokeMethod18Mixin
superclass: 
PK�|[�^1(��Iri/1.8/system/DRb/DRbServer/InvokeMethod18Mixin/perform_with_block-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbServer::InvokeMethod18Mixin#perform_with_block
is_singleton: false
name: perform_with_block
params: ()
visibility: public
PK�|[͘�;��Bri/1.8/system/DRb/DRbServer/InvokeMethod18Mixin/block_yield-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbServer::InvokeMethod18Mixin#block_yield
is_singleton: false
name: block_yield
params: (x)
visibility: public
PK�|[�ԍ�\\-ri/1.8/system/DRb/DRbServer/verbose%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the default value of the :verbose option.
- !ruby/struct:SM::Flow::P 
  body: "See #new(). The initial default value is false."
full_name: DRb::DRbServer::verbose=
is_singleton: true
name: verbose=
params: (on)
visibility: public
PK�|[,��@@+ri/1.8/system/DRb/DRbServer/any_to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Coerce an object to a string, providing our own representation if to_s is not defined for the object.
full_name: DRb::DRbServer#any_to_s
is_singleton: false
name: any_to_s
params: (obj)
visibility: private
PK�|[e���2ri/1.8/system/DRb/ExtServManager/command%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::ExtServManager::command=
is_singleton: true
name: command=
params: (cmd)
visibility: public
PK�|[�b���0ri/1.8/system/DRb/ExtServManager/unregist-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::ExtServManager#unregist
is_singleton: false
name: unregist
params: (name)
visibility: public
PK�|[hw?���>ri/1.8/system/DRb/ExtServManager/invoke_service_command-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::ExtServManager#invoke_service_command
is_singleton: false
name: invoke_service_command
params: (name, command)
visibility: private
PK�|[���/ri/1.8/system/DRb/ExtServManager/service-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::ExtServManager#service
is_singleton: false
name: service
params: (name)
visibility: public
PK�|[@AK��5ri/1.8/system/DRb/ExtServManager/invoke_thread-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::ExtServManager#invoke_thread
is_singleton: false
name: invoke_thread
params: ()
visibility: private
PK�|[�S���6ri/1.8/system/DRb/ExtServManager/invoke_service-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::ExtServManager#invoke_service
is_singleton: false
name: invoke_service
params: (name)
visibility: private
PK�|[�ab���+ri/1.8/system/DRb/ExtServManager/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::ExtServManager::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[�f@KK:ri/1.8/system/DRb/ExtServManager/cdesc-ExtServManager.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: uri
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: command
- !ruby/object:RI::MethodSummary 
  name: command=
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: DRb::ExtServManager
includes: 
- !ruby/object:RI::IncludedModule 
  name: DRbUndumped
- !ruby/object:RI::IncludedModule 
  name: MonitorMixin
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: invoke_service
- !ruby/object:RI::MethodSummary 
  name: invoke_service_command
- !ruby/object:RI::MethodSummary 
  name: invoke_thread
- !ruby/object:RI::MethodSummary 
  name: regist
- !ruby/object:RI::MethodSummary 
  name: service
- !ruby/object:RI::MethodSummary 
  name: unregist
name: ExtServManager
superclass: Object
PK�|[q]����.ri/1.8/system/DRb/ExtServManager/regist-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::ExtServManager#regist
is_singleton: false
name: regist
params: (name, ro)
visibility: public
PK�|[f<H���/ri/1.8/system/DRb/ExtServManager/command-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::ExtServManager::command
is_singleton: true
name: command
params: ()
visibility: public
PK�|[���3��&ri/1.8/system/DRb/remove_server-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb#remove_server
is_singleton: false
name: remove_server
params: (server)
visibility: public
PK�|[j�׭0ri/1.8/system/DRb/DRbTCPSocket/recv_reply-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: On the client side, receive a reply from the server.
full_name: DRb::DRbTCPSocket#recv_reply
is_singleton: false
name: recv_reply
params: ()
visibility: public
PK�|[¯ڿ�3ri/1.8/system/DRb/DRbTCPSocket/getservername-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbTCPSocket::getservername
is_singleton: true
name: getservername
params: ()
visibility: public
PK�|[a�S�&&2ri/1.8/system/DRb/DRbTCPSocket/send_request-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: On the client side, send a request to the server.
full_name: DRb::DRbTCPSocket#send_request
is_singleton: false
name: send_request
params: (ref, msg_id, arg, b)
visibility: public
PK�|[z5FY0ri/1.8/system/DRb/DRbTCPSocket/uri_option-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parse <tt>uri</tt> into a [uri, option] pair.
full_name: DRb::DRbTCPSocket::uri_option
is_singleton: true
name: uri_option
params: (uri, config)
visibility: public
PK�|[2ڼ��)ri/1.8/system/DRb/DRbTCPSocket/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new DRbTCPSocket instance.
- !ruby/struct:SM::Flow::P 
  body: <tt>uri</tt> is the URI we are connected to. <tt>soc</tt> is the tcp socket we are bound to. <tt>config</tt> is our configuration.
full_name: DRb::DRbTCPSocket::new
is_singleton: true
name: new
params: (uri, soc, config={})
visibility: public
PK�|[	��%��/ri/1.8/system/DRb/DRbTCPSocket/parse_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbTCPSocket::parse_uri
is_singleton: true
name: parse_uri
params: (uri)
visibility: private
PK�|[�''.ri/1.8/system/DRb/DRbTCPSocket/peeraddr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the address of our TCP peer (the other end of the socket we are bound to.
full_name: DRb::DRbTCPSocket#peeraddr
is_singleton: false
name: peeraddr
params: ()
visibility: public
PK�|[�p�B0ri/1.8/system/DRb/DRbTCPSocket/send_reply-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: On the server side, send a reply to the client.
full_name: DRb::DRbTCPSocket#send_reply
is_singleton: false
name: send_reply
params: (succ, result)
visibility: public
PK�|[�t-GG1ri/1.8/system/DRb/DRbTCPSocket/open_server-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Open a server listening for connections at <tt>uri</tt> using configuration <tt>config</tt>.
full_name: DRb::DRbTCPSocket::open_server
is_singleton: true
name: open_server
params: (uri, config)
visibility: public
PK�|[�#��,ri/1.8/system/DRb/DRbTCPSocket/stream-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the socket.
full_name: DRb::DRbTCPSocket#stream
is_singleton: false
name: stream
params: ()
visibility: public
PK�|[��֭��<ri/1.8/system/DRb/DRbTCPSocket/open_server_inaddr_any-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbTCPSocket::open_server_inaddr_any
is_singleton: true
name: open_server_inaddr_any
params: (host, port)
visibility: public
PK�|[ZS<��,ri/1.8/system/DRb/DRbTCPSocket/accept-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "On the server side, for an instance returned by #open_server, accept a client connection and return a new instance to handle the server's side of this client-server session."
full_name: DRb::DRbTCPSocket#accept
is_singleton: false
name: accept
params: ()
visibility: public
PK�|[���+ri/1.8/system/DRb/DRbTCPSocket/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Close the connection.
- !ruby/struct:SM::Flow::P 
  body: "If this is an instance returned by #open_server, then this stops listening for new connections altogether. If this is an instance returned by #open or by #accept, then it closes this particular client-server session."
full_name: DRb::DRbTCPSocket#close
is_singleton: false
name: close
params: ()
visibility: public
PK�|[�B`2ri/1.8/system/DRb/DRbTCPSocket/recv_request-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: On the server side, receive a request from the client.
full_name: DRb::DRbTCPSocket#recv_request
is_singleton: false
name: recv_request
params: ()
visibility: public
PK�|[�
���.ri/1.8/system/DRb/DRbTCPSocket/alive%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Check to see if this connection is alive.
full_name: DRb::DRbTCPSocket#alive?
is_singleton: false
name: alive?
params: ()
visibility: public
PK�|[�Thv6ri/1.8/system/DRb/DRbTCPSocket/cdesc-DRbTCPSocket.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Get the URI that we are connected to.
  name: uri
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: getservername
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: open
- !ruby/object:RI::MethodSummary 
  name: open_server
- !ruby/object:RI::MethodSummary 
  name: open_server_inaddr_any
- !ruby/object:RI::MethodSummary 
  name: parse_uri
- !ruby/object:RI::MethodSummary 
  name: uri_option
comment: 
- !ruby/struct:SM::Flow::P 
  body: The default drb protocol.
- !ruby/struct:SM::Flow::P 
  body: Communicates over a TCP socket.
constants: []

full_name: DRb::DRbTCPSocket
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: accept
- !ruby/object:RI::MethodSummary 
  name: alive?
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: peeraddr
- !ruby/object:RI::MethodSummary 
  name: recv_reply
- !ruby/object:RI::MethodSummary 
  name: recv_request
- !ruby/object:RI::MethodSummary 
  name: send_reply
- !ruby/object:RI::MethodSummary 
  name: send_request
- !ruby/object:RI::MethodSummary 
  name: stream
name: DRbTCPSocket
superclass: Object
PK�|[7X�***ri/1.8/system/DRb/DRbTCPSocket/open-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Open a client connection to <tt>uri</tt> using configuration <tt>config</tt>.
full_name: DRb::DRbTCPSocket::open
is_singleton: true
name: open
params: (uri, config)
visibility: public
PK�|[�;M��(ri/1.8/system/DRb/DRbObject/_load-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Unmarshall a marshalled DRbObject.
- !ruby/struct:SM::Flow::P 
  body: If the referenced object is located within the local server, then the object itself is returned. Otherwise, a new DRbObject is created to act as a stub for the remote referenced object.
full_name: DRb::DRbObject::_load
is_singleton: true
name: _load
params: (s)
visibility: public
PK�|[Hd�z��)ri/1.8/system/DRb/DRbObject/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #=="
full_name: DRb::DRbObject#eql?
is_singleton: false
name: eql?
params: (other)
visibility: public
PK�|[����+ri/1.8/system/DRb/DRbObject/__drburi-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the URI of the remote object.
full_name: DRb::DRbObject#__drburi
is_singleton: false
name: __drburi
params: ()
visibility: public
PK�|[o�x�1ri/1.8/system/DRb/DRbObject/method_missing-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Routes method calls to the referenced object.
full_name: DRb::DRbObject#method_missing
is_singleton: false
name: method_missing
params: (msg_id, *a, &b)
visibility: public
PK�|[�_C���'ri/1.8/system/DRb/DRbObject/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbObject#hash
is_singleton: false
name: hash
params: ()
visibility: public
PK�|[��S���4ri/1.8/system/DRb/DRbObject/prepare_backtrace-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbObject::prepare_backtrace
is_singleton: true
name: prepare_backtrace
params: (uri, result)
visibility: public
PK�|[���

/ri/1.8/system/DRb/DRbObject/new_with_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new DRbObject from a URI alone.
full_name: DRb::DRbObject::new_with_uri
is_singleton: true
name: new_with_uri
params: (uri)
visibility: public
PK�|[b4�U��0ri/1.8/system/DRb/DRbObject/cdesc-DRbObject.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: _load
- !ruby/object:RI::MethodSummary 
  name: _load
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: new_with
- !ruby/object:RI::MethodSummary 
  name: new_with_uri
- !ruby/object:RI::MethodSummary 
  name: prepare_backtrace
- !ruby/object:RI::MethodSummary 
  name: with_friend
comment: 
- !ruby/struct:SM::Flow::P 
  body: Object wrapping a reference to a remote drb object.
- !ruby/struct:SM::Flow::P 
  body: Method calls on this object are relayed to the remote object that this object is a stub for.
constants: []

full_name: DRb::DRbObject
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: __drbref
- !ruby/object:RI::MethodSummary 
  name: __drburi
- !ruby/object:RI::MethodSummary 
  name: _dump
- !ruby/object:RI::MethodSummary 
  name: _dump
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: method_missing
- !ruby/object:RI::MethodSummary 
  name: respond_to?
name: DRbObject
superclass: Object
PK�|[u�|U��.ri/1.8/system/DRb/DRbObject/with_friend-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ()
comment: 
full_name: DRb::DRbObject::with_friend
is_singleton: true
name: with_friend
params: (uri) {|| ...}
visibility: public
PK�|[�����&ri/1.8/system/DRb/DRbObject/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new remote object stub.
- !ruby/struct:SM::Flow::P 
  body: <tt>obj</tt> is the (local) object we want to create a stub for. Normally this is <tt>nil</tt>. <tt>uri</tt> is the URI of the remote object that this will be a stub for.
full_name: DRb::DRbObject::new
is_singleton: true
name: new
params: (obj, uri=nil)
visibility: public
PK�|[�oE��0ri/1.8/system/DRb/DRbObject/respond_to%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbObject#respond_to?
is_singleton: false
name: respond_to?
params: (msg_id, priv=false)
visibility: public
PK�|[�S���+ri/1.8/system/DRb/DRbObject/new_with-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbObject::new_with
is_singleton: true
name: new_with
params: (uri, ref)
visibility: public
PK�|[Y��a+ri/1.8/system/DRb/DRbObject/__drbref-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the reference of the object, if local.
full_name: DRb::DRbObject#__drbref
is_singleton: false
name: __drbref
params: ()
visibility: public
PK�|[�|���)ri/1.8/system/DRb/DRbObject/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: eql?
block_params: 
comment: 
full_name: DRb::DRbObject#==
is_singleton: false
name: ==
params: (other)
visibility: public
PK�|[f�����(ri/1.8/system/DRb/DRbObject/_dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbObject#_dump
is_singleton: false
name: _dump
params: (lv)
visibility: public
PK�|[�ߘ[xx%ri/1.8/system/DRb/stop_service-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Stop the local dRuby server.
- !ruby/struct:SM::Flow::P 
  body: This operates on the primary server. If there is no primary server currently running, it is a noop.
full_name: DRb#stop_service
is_singleton: false
name: stop_service
params: ()
visibility: public
PK�|[9�N�XX6ri/1.8/system/DRb/DRbSSLSocket/cdesc-DRbSSLSocket.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: open
- !ruby/object:RI::MethodSummary 
  name: open_server
- !ruby/object:RI::MethodSummary 
  name: parse_uri
- !ruby/object:RI::MethodSummary 
  name: uri_option
comment: 
constants: []

full_name: DRb::DRbSSLSocket
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: accept
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: stream
name: DRbSSLSocket
superclass: DRbTCPSocket
PK�|[��1��7ri/1.8/system/DRb/DRbSSLSocket/SSLConfig/connect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbSSLSocket::SSLConfig#connect
is_singleton: false
name: connect
params: (tcp)
visibility: public
PK�|[Y�ȟ��6ri/1.8/system/DRb/DRbSSLSocket/SSLConfig/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbSSLSocket::SSLConfig#[]
is_singleton: false
name: "[]"
params: (key)
visibility: public
PK�|[ȫ���Ari/1.8/system/DRb/DRbSSLSocket/SSLConfig/setup_certificate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbSSLSocket::SSLConfig#setup_certificate
is_singleton: false
name: setup_certificate
params: ()
visibility: public
PK�|[JXV��Ari/1.8/system/DRb/DRbSSLSocket/SSLConfig/setup_ssl_context-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbSSLSocket::SSLConfig#setup_ssl_context
is_singleton: false
name: setup_ssl_context
params: ()
visibility: public
PK�|[�
��3ri/1.8/system/DRb/DRbSSLSocket/SSLConfig/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbSSLSocket::SSLConfig::new
is_singleton: true
name: new
params: (config)
visibility: public
PK�|[1���6ri/1.8/system/DRb/DRbSSLSocket/SSLConfig/accept-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbSSLSocket::SSLConfig#accept
is_singleton: false
name: accept
params: (tcp)
visibility: public
PK�|[A�h��=ri/1.8/system/DRb/DRbSSLSocket/SSLConfig/cdesc-SSLConfig.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: DEFAULT
  value: "{         :SSLCertificate       => nil,         :SSLPrivateKey        => nil,         :SSLClientCA          => nil,         :SSLCACertificatePath => nil,         :SSLCACertificateFile => nil,         :SSLVerifyMode        => ::OpenSSL::SSL::VERIFY_NONE,          :SSLVerifyDepth       => nil,         :SSLVerifyCallback    => nil,   # custom verification         :SSLCertificateStore  => nil,         # Must specify if you use auto generated certificate.         :SSLCertName          => nil,   # e.g. [[\"CN\",\"fqdn.example.com\"]]         :SSLCertComment       => \"Generated by Ruby/OpenSSL\""
full_name: DRb::DRbSSLSocket::SSLConfig
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: accept
- !ruby/object:RI::MethodSummary 
  name: connect
- !ruby/object:RI::MethodSummary 
  name: setup_certificate
- !ruby/object:RI::MethodSummary 
  name: setup_ssl_context
name: SSLConfig
superclass: Object
PK�|[�!�N��0ri/1.8/system/DRb/DRbSSLSocket/uri_option-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbSSLSocket::uri_option
is_singleton: true
name: uri_option
params: (uri, config)
visibility: public
PK�|[(L��)ri/1.8/system/DRb/DRbSSLSocket/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbSSLSocket::new
is_singleton: true
name: new
params: (uri, soc, config, is_established)
visibility: public
PK�|[?��º�/ri/1.8/system/DRb/DRbSSLSocket/parse_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbSSLSocket::parse_uri
is_singleton: true
name: parse_uri
params: (uri)
visibility: public
PK�|[O9����1ri/1.8/system/DRb/DRbSSLSocket/open_server-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbSSLSocket::open_server
is_singleton: true
name: open_server
params: (uri, config)
visibility: public
PK�|[����,ri/1.8/system/DRb/DRbSSLSocket/stream-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbSSLSocket#stream
is_singleton: false
name: stream
params: ()
visibility: public
PK�|[���l��,ri/1.8/system/DRb/DRbSSLSocket/accept-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbSSLSocket#accept
is_singleton: false
name: accept
params: ()
visibility: public
PK�|[�^a��+ri/1.8/system/DRb/DRbSSLSocket/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbSSLSocket#close
is_singleton: false
name: close
params: ()
visibility: public
PK�|[ ��@��*ri/1.8/system/DRb/DRbSSLSocket/open-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbSSLSocket::open
is_singleton: true
name: open
params: (uri, config)
visibility: public
PK�|[��=&��1ri/1.8/system/DRb/DRbUNIXSocket/uri_option-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbUNIXSocket::uri_option
is_singleton: true
name: uri_option
params: (uri, config)
visibility: public
PK�|[���>��*ri/1.8/system/DRb/DRbUNIXSocket/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbUNIXSocket::new
is_singleton: true
name: new
params: (uri, soc, config={}, server_mode = false)
visibility: public
PK�|[��O��0ri/1.8/system/DRb/DRbUNIXSocket/parse_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbUNIXSocket::parse_uri
is_singleton: true
name: parse_uri
params: (uri)
visibility: public
PK�|[ư�8ri/1.8/system/DRb/DRbUNIXSocket/cdesc-DRbUNIXSocket.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: open
- !ruby/object:RI::MethodSummary 
  name: open_server
- !ruby/object:RI::MethodSummary 
  name: parse_uri
- !ruby/object:RI::MethodSummary 
  name: temp_server
- !ruby/object:RI::MethodSummary 
  name: uri_option
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: import from tempfile.rb
  name: Max_try
  value: "10"
full_name: DRb::DRbUNIXSocket
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: accept
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: set_sockopt
name: DRbUNIXSocket
superclass: DRbTCPSocket
PK�|[i�����2ri/1.8/system/DRb/DRbUNIXSocket/open_server-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbUNIXSocket::open_server
is_singleton: true
name: open_server
params: (uri, config)
visibility: public
PK�|[�Ņm��-ri/1.8/system/DRb/DRbUNIXSocket/accept-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbUNIXSocket#accept
is_singleton: false
name: accept
params: ()
visibility: public
PK�|[w����,ri/1.8/system/DRb/DRbUNIXSocket/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbUNIXSocket#close
is_singleton: false
name: close
params: ()
visibility: public
PK�|[���2ri/1.8/system/DRb/DRbUNIXSocket/temp_server-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbUNIXSocket::temp_server
is_singleton: true
name: temp_server
params: ()
visibility: private
PK�|[����2ri/1.8/system/DRb/DRbUNIXSocket/set_sockopt-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbUNIXSocket#set_sockopt
is_singleton: false
name: set_sockopt
params: (soc)
visibility: public
PK�|[L�����+ri/1.8/system/DRb/DRbUNIXSocket/open-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbUNIXSocket::open
is_singleton: true
name: open
params: (uri, config)
visibility: public
PK�|[<����%ri/1.8/system/DRb/fetch_server-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb#fetch_server
is_singleton: false
name: fetch_server
params: (uri)
visibility: public
PK�|[#B9#�� ri/1.8/system/DRb/here%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Is <tt>uri</tt> the URI for the current local server?
full_name: DRb#here?
is_singleton: false
name: here?
params: (uri)
visibility: public
PK�|[
�m��&ri/1.8/system/DRb/regist_server-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb#regist_server
is_singleton: false
name: regist_server
params: (server)
visibility: public
PK�|[�ԫ��+ri/1.8/system/DRb/DRbRemoteError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbRemoteError::new
is_singleton: true
name: new
params: (error)
visibility: public
PK�|[\S[M��:ri/1.8/system/DRb/DRbRemoteError/cdesc-DRbRemoteError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: the class of the error, as a string.
  name: reason
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: An exception wrapping an error object
constants: []

full_name: DRb::DRbRemoteError
includes: []

instance_methods: []

name: DRbRemoteError
superclass: DRbError
PK�|[1�v��0ri/1.8/system/DRb/DRbProtocol/open_server-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Open a server listening for connections at <tt>uri</tt> with configuration <tt>config</tt>.
- !ruby/struct:SM::Flow::P 
  body: The DRbProtocol module asks each registered protocol in turn to try to open a server at the URI. Each protocol signals that it does not handle that URI by raising a DRbBadScheme error. If no protocol recognises the URI, then a DRbBadURI error is raised. If a protocol accepts the URI, but an error occurs in opening it, the underlying error is passed on to the caller.
full_name: DRb::DRbProtocol#open_server
is_singleton: false
name: open_server
params: (uri, config, first=true)
visibility: public
PK�|[�7Z88/ri/1.8/system/DRb/DRbProtocol/uri_option-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parse <tt>uri</tt> into a [uri, option] pair.
- !ruby/struct:SM::Flow::P 
  body: The DRbProtocol module asks each registered protocol in turn to try to parse the URI. Each protocol signals that it does not handle that URI by raising a DRbBadScheme error. If no protocol recognises the URI, then a DRbBadURI error is raised.
full_name: DRb::DRbProtocol#uri_option
is_singleton: false
name: uri_option
params: (uri, config, first=true)
visibility: public
PK�|[��Oq��)ri/1.8/system/DRb/DRbProtocol/open-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Open a client connection to <tt>uri</tt> with the configuration <tt>config</tt>.
- !ruby/struct:SM::Flow::P 
  body: The DRbProtocol module asks each registered protocol in turn to try to open the URI. Each protocol signals that it does not handle that URI by raising a DRbBadScheme error. If no protocol recognises the URI, then a DRbBadURI error is raised. If a protocol accepts the URI, but an error occurs in opening it, a DRbConnError is raised.
full_name: DRb::DRbProtocol#open
is_singleton: false
name: open
params: (uri, config, first=true)
visibility: public
PK�|[IV��1ri/1.8/system/DRb/DRbProtocol/add_protocol-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Add a new protocol to the DRbProtocol module.
full_name: DRb::DRbProtocol#add_protocol
is_singleton: false
name: add_protocol
params: (prot)
visibility: public
PK�|[���MM4ri/1.8/system/DRb/DRbProtocol/cdesc-DRbProtocol.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Module managing the underlying network protocol(s) used by drb.
- !ruby/struct:SM::Flow::P 
  body: "By default, drb uses the DRbTCPSocket protocol. Other protocols can be defined. A protocol must define the following class methods:"
- !ruby/struct:SM::Flow::VERB 
  body: "  [open(uri, config)] Open a client connection to the server at <tt>uri</tt>,\n                      using configuration <tt>config</tt>.  Return a protocol\n                      instance for this connection.\n  [open_server(uri, config)] Open a server listening at <tt>uri</tt>,\n                             using configuration <tt>config</tt>.  Return a\n                             protocol instance for this listener.\n  [uri_option(uri, config)] Take a URI, possibly containing an option\n                            component (e.g. a trailing '?param=val'),\n                            and return a [uri, option] tuple.\n"
- !ruby/struct:SM::Flow::P 
  body: All of these methods should raise a DRbBadScheme error if the URI does not identify the protocol they support (e.g. &quot;druby:&quot; for the standard Ruby protocol). This is how the DRbProtocol module, given a URI, determines which protocol implementation serves that protocol.
- !ruby/struct:SM::Flow::P 
  body: "The protocol instance returned by #open_server must have the following methods:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: accept
    body: Accept a new connection to the server. Returns a protocol instance capable of communicating with the client.
  - !ruby/struct:SM::Flow::LI 
    label: close
    body: Close the server connection.
  - !ruby/struct:SM::Flow::LI 
    label: uri
    body: Get the URI for this server.
  type: :LABELED
- !ruby/struct:SM::Flow::P 
  body: "The protocol instance returned by #open must have the following methods:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: send_request (ref, msg_id, arg, b)
    body: Send a request to <tt>ref</tt> with the given message id and arguments. This is most easily implemented by calling DRbMessage.send_request, providing a stream that sits on top of the current protocol.
  - !ruby/struct:SM::Flow::LI 
    label: recv_reply
    body: Receive a reply from the server and return it as a [success-boolean, reply-value] pair. This is most easily implemented by calling DRb.recv_reply, providing a stream that sits on top of the current protocol.
  - !ruby/struct:SM::Flow::LI 
    label: alive?
    body: Is this connection still alive?
  - !ruby/struct:SM::Flow::LI 
    label: close
    body: Close this connection.
  type: :LABELED
- !ruby/struct:SM::Flow::P 
  body: "The protocol instance returned by #open_server().accept() must have the following methods:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: recv_request
    body: Receive a request from the client and return a [object, message, args, block] tuple. This is most easily implemented by calling DRbMessage.recv_request, providing a stream that sits on top of the current protocol.
  - !ruby/struct:SM::Flow::LI 
    label: send_reply(succ, result)
    body: Send a reply to the client. This is most easily implemented by calling DRbMessage.send_reply, providing a stream that sits on top of the current protocol.
  - !ruby/struct:SM::Flow::LI 
    label: close
    body: Close this connection.
  type: :LABELED
- !ruby/struct:SM::Flow::P 
  body: A new protocol is registered with the DRbProtocol module using the add_protocol method.
- !ruby/struct:SM::Flow::P 
  body: For examples of other protocols, see DRbUNIXSocket in drb/unix.rb, and HTTP0 in sample/http0.rb and sample/http0serv.rb in the full drb distribution.
constants: []

full_name: DRb::DRbProtocol
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_protocol
- !ruby/object:RI::MethodSummary 
  name: open
- !ruby/object:RI::MethodSummary 
  name: open_server
- !ruby/object:RI::MethodSummary 
  name: uri_option
name: DRbProtocol
superclass: 
PK�|[�:��ri/1.8/system/DRb/config-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the configuration of the current server.
- !ruby/struct:SM::Flow::P 
  body: "If there is no current server, this returns the default configuration. See #current_server and DRbServer::make_config."
full_name: DRb#config
is_singleton: false
name: config
params: ()
visibility: public
PK�|[*�|/YYBri/1.8/system/DRb/TimerIdConv/TimerHolder2/cdesc-TimerHolder2.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: DRb::TimerIdConv::TimerHolder2
includes: 
- !ruby/object:RI::IncludedModule 
  name: MonitorMixin
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: alternate
- !ruby/object:RI::MethodSummary 
  name: fetch
- !ruby/object:RI::MethodSummary 
  name: include?
- !ruby/object:RI::MethodSummary 
  name: keeper
- !ruby/object:RI::MethodSummary 
  name: peek
name: TimerHolder2
superclass: Object
PK�|[����8ri/1.8/system/DRb/TimerIdConv/TimerHolder2/keeper-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::TimerIdConv::TimerHolder2#keeper
is_singleton: false
name: keeper
params: ()
visibility: private
PK�|[�m���6ri/1.8/system/DRb/TimerIdConv/TimerHolder2/peek-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::TimerIdConv::TimerHolder2#peek
is_singleton: false
name: peek
params: (key)
visibility: public
PK�|[";���Yri/1.8/system/DRb/TimerIdConv/TimerHolder2/InvalidIndexError/cdesc-InvalidIndexError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: DRb::TimerIdConv::TimerHolder2::InvalidIndexError
includes: []

instance_methods: []

name: InvalidIndexError
superclass: RuntimeError
PK�|[��\���5ri/1.8/system/DRb/TimerIdConv/TimerHolder2/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::TimerIdConv::TimerHolder2#add
is_singleton: false
name: add
params: (obj)
visibility: public
PK�|[8��I��<ri/1.8/system/DRb/TimerIdConv/TimerHolder2/include%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::TimerIdConv::TimerHolder2#include?
is_singleton: false
name: include?
params: (key)
visibility: public
PK�|[��Q��5ri/1.8/system/DRb/TimerIdConv/TimerHolder2/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::TimerIdConv::TimerHolder2::new
is_singleton: true
name: new
params: (timeout=600)
visibility: public
PK�|[f�9���;ri/1.8/system/DRb/TimerIdConv/TimerHolder2/alternate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::TimerIdConv::TimerHolder2#alternate
is_singleton: false
name: alternate
params: ()
visibility: private
PK�|[�\���7ri/1.8/system/DRb/TimerIdConv/TimerHolder2/fetch-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::TimerIdConv::TimerHolder2#fetch
is_singleton: false
name: fetch
params: (key, dv=@sentinel)
visibility: public
PK�|[�N%ڳ�+ri/1.8/system/DRb/TimerIdConv/to_obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::TimerIdConv#to_obj
is_singleton: false
name: to_obj
params: (ref)
visibility: public
PK�|[����(ri/1.8/system/DRb/TimerIdConv/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::TimerIdConv::new
is_singleton: true
name: new
params: (timeout=600)
visibility: public
PK�|[s(��TT4ri/1.8/system/DRb/TimerIdConv/cdesc-TimerIdConv.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: DRb::TimerIdConv
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_id
- !ruby/object:RI::MethodSummary 
  name: to_obj
name: TimerIdConv
superclass: DRbIdConv
PK�|[�jқ��*ri/1.8/system/DRb/TimerIdConv/to_id-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::TimerIdConv#to_id
is_singleton: false
name: to_id
params: (obj)
visibility: public
PK�|[�$n��ri/1.8/system/DRb/mutex-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb#mutex
is_singleton: false
name: mutex
params: ()
visibility: public
PK�|[��2/XXri/1.8/system/DRb/thread-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the thread of the primary server.
- !ruby/struct:SM::Flow::P 
  body: "This returns nil if there is no primary server. See #primary_server."
full_name: DRb#thread
is_singleton: false
name: thread
params: ()
visibility: public
PK�|[6T���'ri/1.8/system/DRb/current_server-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the 'current' server.
- !ruby/struct:SM::Flow::P 
  body: In the context of execution taking place within the main thread of a dRuby server (typically, as a result of a remote call on the server or one of its objects), the current server is that server. Otherwise, the current server is the primary server.
- !ruby/struct:SM::Flow::P 
  body: If the above rule fails to find a server, a DRbServerNotFound error is raised.
full_name: DRb#current_server
is_singleton: false
name: current_server
params: ()
visibility: public
PK�|[~�qqri/1.8/system/DRb/front-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the front object of the current server.
- !ruby/struct:SM::Flow::P 
  body: "This raises a DRbServerNotFound error if there is no current server. See #current_server."
full_name: DRb#front
is_singleton: false
name: front
params: ()
visibility: public
PK�|[��w�&&,ri/1.8/system/DRb/DRbUnknownError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new DRbUnknownError for the DRb::DRbUnknown object <tt>unknown</tt>
full_name: DRb::DRbUnknownError::new
is_singleton: true
name: new
params: (unknown)
visibility: public
PK�|[m�n���<ri/1.8/system/DRb/DRbUnknownError/cdesc-DRbUnknownError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Get the wrapped DRb::DRbUnknown object.
  name: unknown
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: An exception wrapping a DRb::DRbUnknown object
constants: []

full_name: DRb::DRbUnknownError
includes: []

instance_methods: []

name: DRbUnknownError
superclass: DRbError
PK�|[��u��7ri/1.8/system/DRb/DRbObservable/notify_observers-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbObservable#notify_observers
is_singleton: false
name: notify_observers
params: (*arg)
visibility: public
PK�|[j��118ri/1.8/system/DRb/DRbObservable/cdesc-DRbObservable.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: DRb::DRbObservable
includes: 
- !ruby/object:RI::IncludedModule 
  name: Observable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: notify_observers
name: DRbObservable
superclass: 
PK�|[��I��2ri/1.8/system/DRb/DRbMessage/cdesc-DRbMessage.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Handler for sending and receiving drb messages.
- !ruby/struct:SM::Flow::P 
  body: This takes care of the low-level marshalling and unmarshalling of drb requests and responses sent over the wire between server and client. This relieves the implementor of a new drb protocol layer with having to deal with these details.
- !ruby/struct:SM::Flow::P 
  body: The user does not have to directly deal with this object in normal use.
constants: []

full_name: DRb::DRbMessage
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: make_proxy
name: DRbMessage
superclass: Object
PK�|[��8��.ri/1.8/system/DRb/DRbMessage/make_proxy-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::DRbMessage#make_proxy
is_singleton: false
name: make_proxy
params: (obj, error=false)
visibility: private
PK�|[����ri/1.8/system/DRb/to_id-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get a reference id for an object using the current server.
- !ruby/struct:SM::Flow::P 
  body: "This raises a DRbServerNotFound error if there is no current server. See #current_server."
full_name: DRb#to_id
is_singleton: false
name: to_id
params: (obj)
visibility: public
PK�|[�BT�BB(ri/1.8/system/DRb/install_id_conv-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the default id conv object.
- !ruby/struct:SM::Flow::P 
  body: See DRbServer#default_id_conv.
full_name: DRb#install_id_conv
is_singleton: false
name: install_id_conv
params: (idconv)
visibility: public
PK�|[�Q9���(ri/1.8/system/DRb/GWIdConv/to_obj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DRb::GWIdConv#to_obj
is_singleton: false
name: to_obj
params: (ref)
visibility: public
PK�|[��i���.ri/1.8/system/DRb/GWIdConv/cdesc-GWIdConv.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: DRb::GWIdConv
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_obj
name: GWIdConv
superclass: DRbIdConv
PK�|[Ժz554ri/1.8/system/DRb/DRbUndumped/cdesc-DRbUndumped.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Mixin module making an object undumpable or unmarshallable.
- !ruby/struct:SM::Flow::P 
  body: If an object which includes this module is returned by method called over drb, then the object remains in the server space and a reference to the object is returned, rather than the object being marshalled and moved into the client space.
constants: []

full_name: DRb::DRbUndumped
includes: []

instance_methods: []

name: DRbUndumped
superclass: 
PK�|[�l�#��"ri/1.8/system/Matrix/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #=="
full_name: Matrix#eql?
is_singleton: false
name: eql?
params: (other)
visibility: public
PK�|[�c��ri/1.8/system/Matrix/tr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #trace"
full_name: Matrix#tr
is_singleton: false
name: tr
params: ()
visibility: public
PK�|[�W[���ri/1.8/system/Matrix/t-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #transpose"
full_name: Matrix#t
is_singleton: false
name: t
params: ()
visibility: public
PK�|[��x--"ri/1.8/system/Matrix/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns element (<tt>i</tt>,<tt>j</tt>) of the matrix. That is: row <tt>i</tt>, column <tt>j</tt>."
full_name: Matrix#[]
is_singleton: false
name: "[]"
params: (i, j)
visibility: public
PK�|[��L���$ri/1.8/system/Matrix/row_size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of rows.
full_name: Matrix#row_size
is_singleton: false
name: row_size
params: ()
visibility: public
PK�|['X̟�"ri/1.8/system/Matrix/%2a%2a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Matrix exponentiation. Defined for integer powers only. Equivalent to multiplying the matrix by itself N times.
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix[[7,6], [3,9]] ** 2\n    =&gt; 67 96\n       48 99\n"
full_name: Matrix#**
is_singleton: false
name: "**"
params: (other)
visibility: public
PK�|[]^N���'ri/1.8/system/Matrix/determinant-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: det
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the determinant of the matrix. If the matrix is not square, the result is 0.
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix[[7,6], [3,9]].determinant\n    =&gt; 63\n"
full_name: Matrix#determinant
is_singleton: false
name: determinant
params: ()
visibility: public
PK�|[&�	Zxx"ri/1.8/system/Matrix/column-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: e
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns column vector number <tt>j</tt> of the matrix as a Vector (starting at 0 like an array). When a block is given, the elements of that vector are iterated.
full_name: Matrix#column
is_singleton: false
name: column
params: (j) {|e| ...}
visibility: public
PK�|[�=����"ri/1.8/system/Matrix/coerce-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "FIXME: describe #coerce."
full_name: Matrix#coerce
is_singleton: false
name: coerce
params: (other)
visibility: public
PK�|[z2&ri/1.8/system/Matrix/regular%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if this is a regular matrix.
full_name: Matrix#regular?
is_singleton: false
name: regular?
params: ()
visibility: public
PK�|[\�=� ri/1.8/system/Matrix/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array of arrays that describe the rows of the matrix.
full_name: Matrix#to_a
is_singleton: false
name: to_a
params: ()
visibility: public
PK�|[C�ҙnnri/1.8/system/Matrix/%2f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Matrix division (multiplication by the inverse).
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix[[7,6], [3,9]] / Matrix[[2,9], [3,1]]\n    =&gt; -7  1\n       -3 -6\n"
full_name: Matrix#/
is_singleton: false
name: /
params: (other)
visibility: public
PK�|[��@��&ri/1.8/system/Matrix/row_vector-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a single-row matrix where the values of that row are as given in <tt>row</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix.row_vector([4,5,6])\n    =&gt; 4 5 6\n"
full_name: Matrix::row_vector
is_singleton: true
name: row_vector
params: (row)
visibility: public
PK�|[�AB__$ri/1.8/system/Matrix/identity-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates an <tt>n</tt> by <tt>n</tt> identity matrix.
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix.identity(2)\n    =&gt; 1 0\n       0 1\n"
full_name: Matrix::identity
is_singleton: true
name: identity
params: (n)
visibility: public
PK�|[y
��ll!ri/1.8/system/Matrix/minor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns a section of the matrix. The parameters are either:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: start_row, nrows, start_col, ncols; OR
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: col_range, row_range
  type: :BULLET
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix.diagonal(9, 5, -3).minor(0..1, 0..2)\n    =&gt; 9 0 0\n       0 5 0\n"
full_name: Matrix#minor
is_singleton: false
name: minor
params: (*param)
visibility: public
PK�|[�e** ri/1.8/system/Matrix/rows-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a matrix where <tt>rows</tt> is an array of arrays, each of which is a row to the matrix. If the optional argument <tt>copy</tt> is false, use the given arrays as the internal structure of the matrix without copying.
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix.rows([[25, 93], [-1, 66]])\n     =&gt;  25 93\n         -1 66\n"
full_name: Matrix::rows
is_singleton: true
name: rows
params: (rows, copy = true)
visibility: public
PK�|[�76y�� ri/1.8/system/Matrix/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a hash-code for the matrix.
full_name: Matrix#hash
is_singleton: false
name: hash
params: ()
visibility: public
PK�|[�70*ri/1.8/system/Matrix/column_vectors-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array of the column vectors of the matrix. See Vector.
full_name: Matrix#column_vectors
is_singleton: false
name: column_vectors
params: ()
visibility: public
PK�|[v2�52ri/1.8/system/Matrix/compare_by_row_vectors-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Not really intended for general consumption.
full_name: Matrix#compare_by_row_vectors
is_singleton: false
name: compare_by_row_vectors
params: (rows)
visibility: public
PK�|[l����#ri/1.8/system/Matrix/collect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: map
block_params: e
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a matrix that is the result of iteration of the given block over all elements of the matrix.
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix[ [1,2], [3,4] ].collect { |i| i**2 }\n    =&gt; 1  4\n       9 16\n"
full_name: Matrix#collect
is_singleton: false
name: collect
params: ( {|e| ...}
visibility: public
PK�|[=��BB&ri/1.8/system/Matrix/cdesc-Matrix.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: column_vector
- !ruby/object:RI::MethodSummary 
  name: columns
- !ruby/object:RI::MethodSummary 
  name: diagonal
- !ruby/object:RI::MethodSummary 
  name: identity
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: row_vector
- !ruby/object:RI::MethodSummary 
  name: rows
- !ruby/object:RI::MethodSummary 
  name: scalar
- !ruby/object:RI::MethodSummary 
  name: zero
comment: 
- !ruby/struct:SM::Flow::P 
  body: The <tt>Matrix</tt> class represents a mathematical matrix, and provides methods for creating special-case matrices (zero, identity, diagonal, singular, vector), operating on them arithmetically and algebraically, and determining their mathematical properties (trace, rank, inverse, determinant).
- !ruby/struct:SM::Flow::P 
  body: Note that although matrices should theoretically be rectangular, this is not enforced by the class.
- !ruby/struct:SM::Flow::P 
  body: Also note that the determinant of integer matrices may be incorrectly calculated unless you also <tt>require 'mathn'</tt>. This may be fixed in the future.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Method Catalogue
- !ruby/struct:SM::Flow::P 
  body: "To create a matrix:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> Matrix[*rows] </tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> Matrix.[](*rows) </tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> Matrix.rows(rows, copy = true) </tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> Matrix.columns(columns) </tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> Matrix.diagonal(*values) </tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> Matrix.scalar(n, value) </tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> Matrix.scalar(n, value) </tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> Matrix.identity(n) </tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> Matrix.unit(n) </tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> Matrix.I(n) </tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> Matrix.zero(n) </tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> Matrix.row_vector(row) </tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> Matrix.column_vector(column) </tt>
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "To access Matrix elements/columns/rows/submatrices/properties:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> [](i, j) </tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #row_size </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #column_size </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #row(i) </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #column(j) </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #collect </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #map </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #minor(*param) </tt>"
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "Properties of a matrix:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #regular? </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #singular? </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #square? </tt>"
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "Matrix arithmetic:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> *(m) </tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> +(m) </tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> -(m) </tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #/(m) </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #inverse </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #inv </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> ** </tt>
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "Matrix functions:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #determinant </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #det </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #rank </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #trace </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #tr </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #transpose </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #t </tt>"
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "Conversion to other data types:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #coerce(other) </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #row_vectors </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #column_vectors </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #to_a </tt>"
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "String representations:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #to_s </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #inspect </tt>"
  type: :BULLET
constants: []

full_name: Matrix
includes: 
- !ruby/object:RI::IncludedModule 
  name: ExceptionForMatrix
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "*"
- !ruby/object:RI::MethodSummary 
  name: "**"
- !ruby/object:RI::MethodSummary 
  name: +
- !ruby/object:RI::MethodSummary 
  name: "-"
- !ruby/object:RI::MethodSummary 
  name: /
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: clone
- !ruby/object:RI::MethodSummary 
  name: coerce
- !ruby/object:RI::MethodSummary 
  name: collect
- !ruby/object:RI::MethodSummary 
  name: column
- !ruby/object:RI::MethodSummary 
  name: column_size
- !ruby/object:RI::MethodSummary 
  name: column_vectors
- !ruby/object:RI::MethodSummary 
  name: compare_by_row_vectors
- !ruby/object:RI::MethodSummary 
  name: det
- !ruby/object:RI::MethodSummary 
  name: determinant
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: init_rows
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: inv
- !ruby/object:RI::MethodSummary 
  name: inverse
- !ruby/object:RI::MethodSummary 
  name: inverse_from
- !ruby/object:RI::MethodSummary 
  name: map
- !ruby/object:RI::MethodSummary 
  name: minor
- !ruby/object:RI::MethodSummary 
  name: rank
- !ruby/object:RI::MethodSummary 
  name: regular?
- !ruby/object:RI::MethodSummary 
  name: row
- !ruby/object:RI::MethodSummary 
  name: row_size
- !ruby/object:RI::MethodSummary 
  name: row_vectors
- !ruby/object:RI::MethodSummary 
  name: singular?
- !ruby/object:RI::MethodSummary 
  name: square?
- !ruby/object:RI::MethodSummary 
  name: t
- !ruby/object:RI::MethodSummary 
  name: to_a
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: tr
- !ruby/object:RI::MethodSummary 
  name: trace
- !ruby/object:RI::MethodSummary 
  name: transpose
name: Matrix
superclass: Object
PK�|[�Ӆ�LLri/1.8/system/Matrix/%2a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Matrix multiplication.
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix[[2,4], [6,8]] * Matrix.identity(2)\n    =&gt; 2 4\n       6 8\n"
full_name: Matrix#*
is_singleton: false
name: "*"
params: (m)
visibility: public
PK�|[�
23��ri/1.8/system/Matrix/det-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #determinant"
full_name: Matrix#det
is_singleton: false
name: det
params: ()
visibility: public
PK�|[�᷑�"ri/1.8/system/Matrix/scalar-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates an <tt>n</tt> by <tt>n</tt> diagonal matrix where each diagonal element is <tt>value</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix.scalar(2, 5)\n    =&gt; 5 0\n       0 5\n"
full_name: Matrix::scalar
is_singleton: true
name: scalar
params: (n, value)
visibility: public
PK�|[w����-ri/1.8/system/Matrix/Scalar/cdesc-Scalar.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Private CLASS
constants: []

full_name: Matrix::Scalar
includes: []

instance_methods: []

name: Scalar
superclass: Numeric
PK�|[b|K��%ri/1.8/system/Matrix/transpose-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: t
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the transpose of the matrix.
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix[[1,2], [3,4], [5,6]]\n    =&gt; 1 2\n       3 4\n       5 6\n  Matrix[[1,2], [3,4], [5,6]].transpose\n    =&gt; 1 3 5\n       2 4 6\n"
full_name: Matrix#transpose
is_singleton: false
name: transpose
params: ()
visibility: public
PK�|[��{��#ri/1.8/system/Matrix/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Overrides Object#inspect
full_name: Matrix#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[K�z��%ri/1.8/system/Matrix/init_rows-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Matrix#init_rows
is_singleton: false
name: init_rows
params: (rows, copy)
visibility: private
PK�|[��2E;;%ri/1.8/system/Matrix/square%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> is this is a square matrix. See note in column_size about this being unreliable, though.
full_name: Matrix#square?
is_singleton: false
name: square?
params: ()
visibility: public
PK�|[D�΀�!ri/1.8/system/Matrix/trace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: tr
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the trace (sum of diagonal elements) of the matrix.
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix[[7,6], [3,9]].trace\n    =&gt; 16\n"
full_name: Matrix#trace
is_singleton: false
name: trace
params: ()
visibility: public
PK�|[HĔ88ri/1.8/system/Matrix/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: This method is used by the other methods that create matrices, and is of no use to general users.
full_name: Matrix::new
is_singleton: true
name: new
params: (init_method, *argv)
visibility: public
PK�|[�-['ri/1.8/system/Matrix/row_vectors-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array of the row vectors of the matrix. See Vector.
full_name: Matrix#row_vectors
is_singleton: false
name: row_vectors
params: ()
visibility: public
PK�|[�&`��(ri/1.8/system/Matrix/inverse_from-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Not for public consumption?
full_name: Matrix#inverse_from
is_singleton: false
name: inverse_from
params: (src)
visibility: public
PK�|[[�?���ri/1.8/system/Matrix/inv-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #inverse"
full_name: Matrix#inv
is_singleton: false
name: inv
params: ()
visibility: public
PK�|[�2t�'ri/1.8/system/Matrix/singular%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> is this is a singular (i.e. non-regular) matrix.
full_name: Matrix#singular?
is_singleton: false
name: singular?
params: ()
visibility: public
PK�|[W�~��#ri/1.8/system/Matrix/inverse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: inv
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the inverse of the matrix.
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix[[1, 2], [2, 1]].inverse\n    =&gt; -1  1\n        0 -1\n"
full_name: Matrix#inverse
is_singleton: false
name: inverse
params: ()
visibility: public
PK�|[��F~��)ri/1.8/system/Matrix/column_vector-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a single-column matrix where the values of that column are as given in <tt>column</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix.column_vector([4,5,6])\n    =&gt; 4\n       5\n       6\n"
full_name: Matrix::column_vector
is_singleton: true
name: column_vector
params: (column)
visibility: public
PK�|[/��ݳ�'ri/1.8/system/Matrix/column_size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of columns. Note that it is possible to construct a matrix with uneven columns (e.g. Matrix[ [1,2,3], [4,5] ]), but this is mathematically unsound. This method uses the first row to determine the result.
full_name: Matrix#column_size
is_singleton: false
name: column_size
params: ()
visibility: public
PK�|[�ǥIIri/1.8/system/Matrix/%2b-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Matrix addition.
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix.scalar(2,5) + Matrix[[1,0], [-4,7]]\n    =&gt;  6  0\n       -4 12\n"
full_name: Matrix#+
is_singleton: false
name: +
params: (m)
visibility: public
PK�|[eOgOO ri/1.8/system/Matrix/zero-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates an <tt>n</tt> by <tt>n</tt> zero matrix.
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix.zero(2)\n    =&gt; 0 0\n       0 0\n"
full_name: Matrix::zero
is_singleton: true
name: zero
params: (n)
visibility: public
PK�|[��j�� ri/1.8/system/Matrix/rank-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the rank of the matrix. Beware that using Float values, with their usual lack of precision, can affect the value returned by this method. Use Rational values instead if this is important to you.
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix[[7,6], [3,9]].rank\n    =&gt; 2\n"
full_name: Matrix#rank
is_singleton: false
name: rank
params: ()
visibility: public
PK�|[L���oori/1.8/system/Matrix/row-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: e
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns row vector number <tt>i</tt> of the matrix as a Vector (starting at 0 like an array). When a block is given, the elements of that vector are iterated.
full_name: Matrix#row
is_singleton: false
name: row
params: (i) {|e| ...}
visibility: public
PK�|[�tg�� ri/1.8/system/Matrix/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Overrides Object#to_s
full_name: Matrix#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[9����ri/1.8/system/Matrix/map-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #collect"
full_name: Matrix#map
is_singleton: false
name: map
params: (
visibility: public
PK�|[Oz��=="ri/1.8/system/Matrix/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: eql?
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if and only if the two matrices contain equal elements.
full_name: Matrix#==
is_singleton: false
name: ==
params: (other)
visibility: public
PK�|[���((!ri/1.8/system/Matrix/clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a clone of the matrix, so that the contents of each do not reference identical objects.
full_name: Matrix#clone
is_singleton: false
name: clone
params: ()
visibility: public
PK�|[�\���$ri/1.8/system/Matrix/diagonal-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a matrix where the diagonal elements are composed of <tt>values</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix.diagonal(9, 5, -3)\n    =&gt;  9  0  0\n        0  5  0\n        0  0 -3\n"
full_name: Matrix::diagonal
is_singleton: true
name: diagonal
params: (*values)
visibility: public
PK�|[�07��#ri/1.8/system/Matrix/columns-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a matrix using <tt>columns</tt> as an array of column vectors.
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix.columns([[25, 93], [-1, 66]])\n     =&gt;  25 -1\n         93 66\n"
full_name: Matrix::columns
is_singleton: true
name: columns
params: (columns)
visibility: public
PK�|[{It�ee"ri/1.8/system/Matrix/%5b%5d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a matrix where each argument is a row.
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix[ [25, 93], [-1, 66] ]\n     =&gt;  25 93\n         -1 66\n"
full_name: Matrix::[]
is_singleton: true
name: "[]"
params: (*rows)
visibility: public
PK�|[y��0PPri/1.8/system/Matrix/%2d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Matrix subtraction.
- !ruby/struct:SM::Flow::VERB 
  body: "  Matrix[[1,5], [4,2]] - Matrix[[9,3], [-4,1]]\n    =&gt; -8  2\n        8  1\n"
full_name: Matrix#-
is_singleton: false
name: "-"
params: (m)
visibility: public
PK�|[����!!-ri/1.8/system/Delegator/method_missing-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Handles the magic of delegation through __getobj__.
full_name: Delegator#method_missing
is_singleton: false
name: method_missing
params: (m, *args, &block)
visibility: public
PK�|[�`¡DD)ri/1.8/system/Delegator/__getobj__-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: This method must be overridden by subclasses and should return the object method calls are being delegated to.
full_name: Delegator#__getobj__
is_singleton: false
name: __getobj__
params: ()
visibility: public
PK�|[c�)9<<"ri/1.8/system/Delegator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pass in the <em>obj</em> to delegate method calls to. All methods supported by <em>obj</em> will be delegated to.
full_name: Delegator::new
is_singleton: true
name: new
params: (obj)
visibility: public
PK�|[t&�TT,ri/1.8/system/Delegator/respond_to%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Checks for a method provided by this the delegate object by fowarding the call through __getobj__.
full_name: Delegator#respond_to?
is_singleton: false
name: respond_to?
params: (m, include_private = false)
visibility: public
PK�|[����+ri/1.8/system/Delegator/marshal_load-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reinitializes delegation from a serialized object.
full_name: Delegator#marshal_load
is_singleton: false
name: marshal_load
params: (obj)
visibility: public
PK�|[����II,ri/1.8/system/Delegator/cdesc-Delegator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Delegator is an abstract class used to build delegator pattern objects from subclasses. Subclasses should redefine __getobj__. For a concrete implementation, see SimpleDelegator.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: IgnoreBacktracePat
  value: "%r\"\\A#{Regexp.quote(__FILE__)}:\\d+:in `\""
full_name: Delegator
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: __getobj__
- !ruby/object:RI::MethodSummary 
  name: marshal_dump
- !ruby/object:RI::MethodSummary 
  name: marshal_load
- !ruby/object:RI::MethodSummary 
  name: method_missing
- !ruby/object:RI::MethodSummary 
  name: respond_to?
name: Delegator
superclass: Object
PK�|[�S��+ri/1.8/system/Delegator/marshal_dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Serialization support for the object returned by __getobj__.
full_name: Delegator#marshal_dump
is_singleton: false
name: marshal_dump
params: ()
visibility: public
PK�|[�}��(ri/1.8/system/UnboundMethod/arity-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an indication of the number of arguments accepted by a method. Returns a nonnegative integer for methods that take a fixed number of arguments. For Ruby methods that take a variable number of arguments, returns -n-1, where n is the number of required arguments. For methods written in C, returns -1 if the call takes a variable number of arguments.
- !ruby/struct:SM::Flow::VERB 
  body: "   class C\n     def one;    end\n     def two(a); end\n     def three(*a);  end\n     def four(a, b); end\n     def five(a, b, *c);    end\n     def six(a, b, *c, &amp;d); end\n   end\n   c = C.new\n   c.method(:one).arity     #=&gt; 0\n   c.method(:two).arity     #=&gt; 1\n   c.method(:three).arity   #=&gt; -1\n   c.method(:four).arity    #=&gt; 2\n   c.method(:five).arity    #=&gt; -3\n   c.method(:six).arity     #=&gt; -3\n\n   &quot;cat&quot;.method(:size).arity      #=&gt; 0\n   &quot;cat&quot;.method(:replace).arity   #=&gt; 1\n   &quot;cat&quot;.method(:squeeze).arity   #=&gt; -1\n   &quot;cat&quot;.method(:count).arity     #=&gt; -1\n"
full_name: UnboundMethod#arity
is_singleton: false
name: arity
params: |
  meth.arity    => fixnum

visibility: public
PK�|[D���4ri/1.8/system/UnboundMethod/cdesc-UnboundMethod.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: "Ruby supports two forms of objectified methods. Class <tt>Method</tt> is used to represent methods that are associated with a particular object: these method objects are bound to that object. Bound method objects for an object can be created using <tt>Object#method</tt>."
- !ruby/struct:SM::Flow::P 
  body: Ruby also supports unbound methods; methods objects that are not associated with a particular object. These can be created either by calling <tt>Module#instance_method</tt> or by calling <tt>unbind</tt> on a bound method object. The result of both of these is an <tt>UnboundMethod</tt> object.
- !ruby/struct:SM::Flow::P 
  body: Unbound methods can only be called after they are bound to an object. That object must be be a kind_of? the method's original class.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Square\n     def area\n       @side * @side\n     end\n     def initialize(side)\n       @side = side\n     end\n   end\n\n   area_un = Square.instance_method(:area)\n\n   s = Square.new(12)\n   area = area_un.bind(s)\n   area.call   #=&gt; 144\n"
- !ruby/struct:SM::Flow::P 
  body: "Unbound methods are a reference to the method at the time it was objectified: subsequent changes to the underlying class will not affect the unbound method."
- !ruby/struct:SM::Flow::VERB 
  body: "   class Test\n     def test\n       :original\n     end\n   end\n   um = Test.instance_method(:test)\n   class Test\n     def test\n       :modified\n     end\n   end\n   t = Test.new\n   t.test            #=&gt; :modified\n   um.bind(t).call   #=&gt; :original\n"
constants: []

full_name: UnboundMethod
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: arity
- !ruby/object:RI::MethodSummary 
  name: bind
- !ruby/object:RI::MethodSummary 
  name: clone
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: name
- !ruby/object:RI::MethodSummary 
  name: owner
- !ruby/object:RI::MethodSummary 
  name: to_s
name: UnboundMethod
superclass: Object
PK�|[���>��*ri/1.8/system/UnboundMethod/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Show the name of the underlying method.
- !ruby/struct:SM::Flow::VERB 
  body: "  &quot;cat&quot;.method(:count).inspect   #=&gt; &quot;#&lt;Method: String#count&gt;&quot;\n"
full_name: UnboundMethod#inspect
is_singleton: false
name: inspect
params: |
  meth.to_s      =>  string
  meth.inspect   =>  string

visibility: public
PK�|[Ox''(ri/1.8/system/UnboundMethod/owner-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the class or module that defines the method.
full_name: UnboundMethod#owner
is_singleton: false
name: owner
params: |
  meth.owner    => class_or_module

visibility: public
PK�|[�@?8��'ri/1.8/system/UnboundMethod/bind-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Bind <em>umeth</em> to <em>obj</em>. If <tt>Klass</tt> was the class from which <em>umeth</em> was obtained, <tt>obj.kind_of?(Klass)</tt> must be true.
- !ruby/struct:SM::Flow::VERB 
  body: "   class A\n     def test\n       puts &quot;In test, class = #{self.class}&quot;\n     end\n   end\n   class B &lt; A\n   end\n   class C &lt; B\n   end\n\n   um = B.instance_method(:test)\n   bm = um.bind(C.new)\n   bm.call\n   bm = um.bind(B.new)\n   bm.call\n   bm = um.bind(A.new)\n   bm.call\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   In test, class = C\n   In test, class = B\n   prog.rb:16:in `bind': bind argument must be an instance of B (TypeError)\n    from prog.rb:16\n"
full_name: UnboundMethod#bind
is_singleton: false
name: bind
params: |
  umeth.bind(obj) -> method

visibility: public
PK�|[K���'ri/1.8/system/UnboundMethod/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Show the name of the underlying method.
- !ruby/struct:SM::Flow::VERB 
  body: "  &quot;cat&quot;.method(:count).inspect   #=&gt; &quot;#&lt;Method: String#count&gt;&quot;\n"
full_name: UnboundMethod#to_s
is_singleton: false
name: to_s
params: |
  meth.to_s      =>  string
  meth.inspect   =>  string

visibility: public
PK�|[9piMM)ri/1.8/system/UnboundMethod/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Two method objects are equal if that are bound to the same object and contain the same body.
full_name: UnboundMethod#==
is_singleton: false
name: ==
params: |
  meth == other_meth  => true or false

visibility: public
PK�|[�I���(ri/1.8/system/UnboundMethod/clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "MISSING: documentation"
full_name: UnboundMethod#clone
is_singleton: false
name: clone
params: ()
visibility: public
PK�|[�^��'ri/1.8/system/UnboundMethod/name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the name of the method.
full_name: UnboundMethod#name
is_singleton: false
name: name
params: |
  meth.name    => string

visibility: public
PK�|[!�P�++ri/1.8/system/Math/frexp-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a two-element array containing the normalized fraction (a <tt>Float</tt>) and exponent (a <tt>Fixnum</tt>) of <em>numeric</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   fraction, exponent = Math.frexp(1234)   #=&gt; [0.6025390625, 11]\n   fraction * 2**exponent                  #=&gt; 1234.0\n"
full_name: Math::frexp
is_singleton: true
name: frexp
params: |
  Math.frexp(numeric)    => [ fraction, exponent ]

visibility: public
PK�|[�(���ri/1.8/system/Math/rsqrt-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Math#rsqrt
is_singleton: false
name: rsqrt
params: (a)
visibility: public
PK�|['�3�ri/1.8/system/Math/tan-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the tangent of <em>x</em> (expressed in radians).
full_name: Math::tan
is_singleton: true
name: tan
params: |
  Math.tan(x)    => float

visibility: public
PK�|[�A$$ri/1.8/system/Math/tanh-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Computes the hyperbolic tangent of <em>x</em> (expressed in radians).
full_name: Math::tanh
is_singleton: true
name: tanh
params: |
  Math.tanh()    => float

visibility: public
PK�|[�5����ri/1.8/system/Math/ldexp-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the value of <em>flt</em>*(2**<em>int</em>).
- !ruby/struct:SM::Flow::VERB 
  body: "   fraction, exponent = Math.frexp(1234)\n   Math.ldexp(fraction, exponent)   #=&gt; 1234.0\n"
full_name: Math::ldexp
is_singleton: true
name: ldexp
params: |
  Math.ldexp(flt, int) -> float

visibility: public
PK�|[*5�Sri/1.8/system/Math/acos-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Computes the arc cosine of <em>x</em>. Returns 0..PI.
full_name: Math::acos
is_singleton: true
name: acos
params: |
  Math.acos(x)    => float

visibility: public
PK�|[�I���ri/1.8/system/Math/hypot-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns sqrt(x**2 + y**2), the hypotenuse of a right-angled triangle with sides <em>x</em> and <em>y</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   Math.hypot(3, 4)   #=&gt; 5.0\n"
full_name: Math::hypot
is_singleton: true
name: hypot
params: |
  Math.hypot(x, y)    => float

visibility: public
PK�|[�s�d
d
"ri/1.8/system/Math/cdesc-Math.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: acos
- !ruby/object:RI::MethodSummary 
  name: acosh
- !ruby/object:RI::MethodSummary 
  name: asin
- !ruby/object:RI::MethodSummary 
  name: asinh
- !ruby/object:RI::MethodSummary 
  name: atan
- !ruby/object:RI::MethodSummary 
  name: atan2
- !ruby/object:RI::MethodSummary 
  name: atanh
- !ruby/object:RI::MethodSummary 
  name: cos
- !ruby/object:RI::MethodSummary 
  name: cosh
- !ruby/object:RI::MethodSummary 
  name: erf
- !ruby/object:RI::MethodSummary 
  name: erfc
- !ruby/object:RI::MethodSummary 
  name: exp
- !ruby/object:RI::MethodSummary 
  name: frexp
- !ruby/object:RI::MethodSummary 
  name: hypot
- !ruby/object:RI::MethodSummary 
  name: ldexp
- !ruby/object:RI::MethodSummary 
  name: log
- !ruby/object:RI::MethodSummary 
  name: log10
- !ruby/object:RI::MethodSummary 
  name: sin
- !ruby/object:RI::MethodSummary 
  name: sinh
- !ruby/object:RI::MethodSummary 
  name: sqrt
- !ruby/object:RI::MethodSummary 
  name: tan
- !ruby/object:RI::MethodSummary 
  name: tanh
comment: 
- !ruby/struct:SM::Flow::P 
  body: The <tt>Math</tt> module contains module functions for basic trigonometric and transcendental functions. See class <tt>Float</tt> for a list of constants that define Ruby's floating point accuracy.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: PI
  value: rb_float_new(M_PI)
- !ruby/object:RI::Constant 
  comment: 
  name: PI
  value: rb_float_new(atan(1.0)*4.0)
- !ruby/object:RI::Constant 
  comment: 
  name: E
  value: rb_float_new(M_E)
- !ruby/object:RI::Constant 
  comment: 
  name: E
  value: rb_float_new(exp(1.0))
full_name: Math
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: acos
- !ruby/object:RI::MethodSummary 
  name: acosh
- !ruby/object:RI::MethodSummary 
  name: asin
- !ruby/object:RI::MethodSummary 
  name: asinh
- !ruby/object:RI::MethodSummary 
  name: atan
- !ruby/object:RI::MethodSummary 
  name: atan2
- !ruby/object:RI::MethodSummary 
  name: atanh
- !ruby/object:RI::MethodSummary 
  name: cos
- !ruby/object:RI::MethodSummary 
  name: cosh
- !ruby/object:RI::MethodSummary 
  name: exp
- !ruby/object:RI::MethodSummary 
  name: log
- !ruby/object:RI::MethodSummary 
  name: log10
- !ruby/object:RI::MethodSummary 
  name: rsqrt
- !ruby/object:RI::MethodSummary 
  name: sin
- !ruby/object:RI::MethodSummary 
  name: sinh
- !ruby/object:RI::MethodSummary 
  name: sqrt
- !ruby/object:RI::MethodSummary 
  name: sqrt
- !ruby/object:RI::MethodSummary 
  name: tan
- !ruby/object:RI::MethodSummary 
  name: tanh
name: Math
superclass: 
PK�|[��|ri/1.8/system/Math/erfc-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calculates the complementary error function of x.
full_name: Math::erfc
is_singleton: true
name: erfc
params: |
  Math.erfc(x)  => float

visibility: public
PK�|[�_�ri/1.8/system/Math/log-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the natural logarithm of <em>numeric</em>.
full_name: Math::log
is_singleton: true
name: log
params: |
  Math.log(numeric)    => float

visibility: public
PK�|[��ݡ�ri/1.8/system/Math/sqrt-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Math#sqrt
is_singleton: false
name: sqrt
params: (a)
visibility: public
PK�|[T3�Z""ri/1.8/system/Math/sinh-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Computes the hyperbolic sine of <em>x</em> (expressed in radians).
full_name: Math::sinh
is_singleton: true
name: sinh
params: |
  Math.sinh(x)    => float

visibility: public
PK�|[]�茡�ri/1.8/system/Math/sinh-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Math#sinh
is_singleton: false
name: sinh
params: (z)
visibility: public
PK�|[��v1��ri/1.8/system/Math/atan2-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Math#atan2
is_singleton: false
name: atan2
params: (y,x)
visibility: public
PK�|[�%"8��ri/1.8/system/Math/asin-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Math#asin
is_singleton: false
name: asin
params: (z)
visibility: public
PK�|[iY���ri/1.8/system/Math/log10-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Redefined to handle a Complex argument.
full_name: Math#log10
is_singleton: false
name: log10
params: (z)
visibility: public
PK�|[f���$$ri/1.8/system/Math/cosh-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Computes the hyperbolic cosine of <em>x</em> (expressed in radians).
full_name: Math::cosh
is_singleton: true
name: cosh
params: |
  Math.cosh(x)    => float

visibility: public
PK�|[/�ri/1.8/system/Math/atanh-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Computes the inverse hyperbolic tangent of <em>x</em>.
full_name: Math::atanh
is_singleton: true
name: atanh
params: |
  Math.atanh(x)    => float

visibility: public
PK�|[&s;J��ri/1.8/system/Math/cosh-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Math#cosh
is_singleton: false
name: cosh
params: (z)
visibility: public
PK�|[g�0ri/1.8/system/Math/acosh-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Computes the inverse hyperbolic cosine of <em>x</em>.
full_name: Math::acosh
is_singleton: true
name: acosh
params: |
  Math.acosh(x)    => float

visibility: public
PK�|[;!@fri/1.8/system/Math/asin-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Computes the arc sine of <em>x</em>. Returns -{PI/2} .. {PI/2}.
full_name: Math::asin
is_singleton: true
name: asin
params: |
  Math.asin(x)    => float

visibility: public
PK�|[_��/��ri/1.8/system/Math/tan-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Redefined to handle a Complex argument.
full_name: Math#tan
is_singleton: false
name: tan
params: (z)
visibility: public
PK�|[�<����ri/1.8/system/Math/log-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Redefined to handle a Complex argument.
full_name: Math#log
is_singleton: false
name: log
params: (z)
visibility: public
PK�|[=�"R��ri/1.8/system/Math/atanh-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Math#atanh
is_singleton: false
name: atanh
params: (z)
visibility: public
PK�|[��uT��ri/1.8/system/Math/cos-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Redefined to handle a Complex argument.
full_name: Math#cos
is_singleton: false
name: cos
params: (z)
visibility: public
PK�|[2���ri/1.8/system/Math/log10-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the base 10 logarithm of <em>numeric</em>.
full_name: Math::log10
is_singleton: true
name: log10
params: |
  Math.log10(numeric)    => float

visibility: public
PK�|[e=%%ri/1.8/system/Math/cos-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Computes the cosine of <em>x</em> (expressed in radians). Returns -1..1.
full_name: Math::cos
is_singleton: true
name: cos
params: |
  Math.cos(x)    => float

visibility: public
PK�|[r'����ri/1.8/system/Math/exp-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns e**x.
full_name: Math::exp
is_singleton: true
name: exp
params: |
  Math.exp(x)    => float

visibility: public
PK�|[sac$ri/1.8/system/Math/asinh-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Computes the inverse hyperbolic sine of <em>x</em>.
full_name: Math::asinh
is_singleton: true
name: asinh
params: |
  Math.asinh(x)    => float

visibility: public
PK�|[��,��ri/1.8/system/Math/tanh-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Math#tanh
is_singleton: false
name: tanh
params: (z)
visibility: public
PK�|[��r��ri/1.8/system/Math/acos-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Math#acos
is_singleton: false
name: acos
params: (z)
visibility: public
PK�|[b8���ri/1.8/system/Math/erf-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calculates the error function of x.
full_name: Math::erf
is_singleton: true
name: erf
params: |
  Math.erf(x)  => float

visibility: public
PK�|[>�>��ri/1.8/system/Math/atan-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Math#atan
is_singleton: false
name: atan
params: (z)
visibility: public
PK�|[�6E��ri/1.8/system/Math/sin-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Redefined to handle a Complex argument.
full_name: Math#sin
is_singleton: false
name: sin
params: (z)
visibility: public
PK�|[sf�z��ri/1.8/system/Math/acosh-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Math#acosh
is_singleton: false
name: acosh
params: (z)
visibility: public
PK�|[��?���ri/1.8/system/Math/asinh-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Math#asinh
is_singleton: false
name: asinh
params: (z)
visibility: public
PK�|[�S\}ri/1.8/system/Math/sqrt-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the non-negative square root of <em>numeric</em>.
full_name: Math::sqrt
is_singleton: true
name: sqrt
params: |
  Math.sqrt(numeric)    => float

visibility: public
PK�|[9�����ri/1.8/system/Math/exp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Redefined to handle a Complex argument.
full_name: Math#exp
is_singleton: false
name: exp
params: (z)
visibility: public
PK�|[�\��""ri/1.8/system/Math/atan-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Computes the arc tangent of <em>x</em>. Returns -{PI/2} .. {PI/2}.
full_name: Math::atan
is_singleton: true
name: atan
params: |
  Math.atan(x)    => float

visibility: public
PK�|[?'�..ri/1.8/system/Math/atan2-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Computes the arc tangent given <em>y</em> and <em>x</em>. Returns -PI..PI.
full_name: Math::atan2
is_singleton: true
name: atan2
params: |
  Math.atan2(y, x)  => float

visibility: public
PK�|[�\	##ri/1.8/system/Math/sin-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Computes the sine of <em>x</em> (expressed in radians). Returns -1..1.
full_name: Math::sin
is_singleton: true
name: sin
params: |
  Math.sin(x)    => float

visibility: public
PK�|[Wbml4ri/1.8/system/InvalidOption/cdesc-InvalidOption.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Raises when switch is undefined.
constants: []

full_name: InvalidOption
includes: []

instance_methods: []

name: InvalidOption
superclass: ParseError
PK�|[��Vt��(ri/1.8/system/URI/FTP/typecode%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::FTP#typecode=
is_singleton: false
name: typecode=
params: (typecode)
visibility: public
PK�|[����!ri/1.8/system/URI/FTP/path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the path from an FTP URI.
- !ruby/struct:SM::Flow::P 
  body: "RFC 1738 specifically states that the path for an FTP URI does not include the / which separates the URI path from the URI host. Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "    ftp://ftp.example.com/pub/ruby\n"
- !ruby/struct:SM::Flow::P 
  body: The above URI indicates that the client should connect to ftp.example.com then cd pub/ruby from the initial login directory.
- !ruby/struct:SM::Flow::P 
  body: "If you want to cd to an absolute directory, you must include an escaped / (%2F) in the path. Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "    ftp://ftp.example.com/%2Fpub/ruby\n"
- !ruby/struct:SM::Flow::P 
  body: This method will then return &quot;/pub/ruby&quot;
full_name: URI::FTP#path
is_singleton: false
name: path
params: ()
visibility: public
PK�|[H5B::"ri/1.8/system/URI/FTP/build-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: Creates a new URI::FTP object from components, with syntax checking.
- !ruby/struct:SM::Flow::P 
  body: The components accepted are <tt>userinfo</tt>, <tt>host</tt>, <tt>port</tt>, <tt>path</tt> and <tt>typecode</tt>.
- !ruby/struct:SM::Flow::P 
  body: The components should be provided either as an Array, or as a Hash with keys formed by preceding the component names with a colon.
- !ruby/struct:SM::Flow::P 
  body: If an Array is used, the components must be passed in the order [userinfo, host, port, path, typecode]
- !ruby/struct:SM::Flow::P 
  body: "If the path supplied is absolute, it will be escaped in order to make it absolute in the URI. Examples:"
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'uri'\n\n    uri = URI::FTP.build(['user:password', 'ftp.example.com', nil,\n      '/path/file.&gt; zip', 'i'])\n    puts uri.to_s  -&gt;  ftp://user:password@ftp.example.com/%2Fpath/file.zip;type=a\n\n    uri2 = URI::FTP.build({:host =&gt; 'ftp.example.com',\n      :path =&gt; 'ruby/src'})\n    puts uri2.to_s  -&gt;  ftp://ftp.example.com/ruby/src\n"
full_name: URI::FTP::build
is_singleton: true
name: build
params: (args)
visibility: public
PK�|[��z[�� ri/1.8/system/URI/FTP/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: Creates a new URI::FTP object from generic URL components with no syntax checking.
- !ruby/struct:SM::Flow::P 
  body: Unlike build(), this method does not escape the path component as required by RFC1738; instead it is treated as per RFC2396.
- !ruby/struct:SM::Flow::P 
  body: Arguments are <tt>scheme</tt>, <tt>userinfo</tt>, <tt>host</tt>, <tt>port</tt>, <tt>registry</tt>, <tt>path</tt>, <tt>opaque</tt>, <tt>query</tt> and <tt>fragment</tt>, in that order.
full_name: URI::FTP::new
is_singleton: true
name: new
params: (*arg)
visibility: public
PK�|[2��Ӻ�+ri/1.8/system/URI/FTP/check_typecode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::FTP#check_typecode
is_singleton: false
name: check_typecode
params: (v)
visibility: private
PK�|[%�����!ri/1.8/system/URI/FTP/new2-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::FTP::new2
is_singleton: true
name: new2
params: (user, password, host, port, path, typecode = nil, arg_check = true)
visibility: public
PK�|[l����)ri/1.8/system/URI/FTP/set_typecode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::FTP#set_typecode
is_singleton: false
name: set_typecode
params: (v)
visibility: protected
PK�|[v?PO��!ri/1.8/system/URI/FTP/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::FTP#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[y 9��$ri/1.8/system/URI/FTP/cdesc-FTP.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: typecode
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: build
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: new2
comment: 
- !ruby/struct:SM::Flow::P 
  body: FTP URI syntax is defined by RFC1738 section 3.2.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: DEFAULT_PORT
  value: "21"
- !ruby/object:RI::Constant 
  comment: 
  name: COMPONENT
  value: "[       :scheme,        :userinfo, :host, :port,       :path, :typecode"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Typecode is &quot;a&quot;, &quot;i&quot; or &quot;d&quot;.
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "*"
      body: "&quot;a&quot; indicates a text file (the FTP command was ASCII)"
    - !ruby/struct:SM::Flow::LI 
      label: "*"
      body: "&quot;i&quot; indicates a binary file (FTP command IMAGE)"
    - !ruby/struct:SM::Flow::LI 
      label: "*"
      body: "&quot;d&quot; indicates the contents of a directory should be displayed"
    type: :BULLET
  name: TYPECODE
  value: "['a', 'i', 'd'].freeze"
- !ruby/object:RI::Constant 
  comment: 
  name: TYPECODE_PREFIX
  value: "';type='.freeze"
full_name: URI::FTP
includes: 
- !ruby/object:RI::IncludedModule 
  name: OpenURI::OpenRead
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: check_typecode
- !ruby/object:RI::MethodSummary 
  name: path
- !ruby/object:RI::MethodSummary 
  name: set_typecode
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: typecode=
name: FTP
superclass: Object
PK�|[��
m��(ri/1.8/system/URI/HTTPS/cdesc-HTTPS.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The default port for HTTPS URIs is 443, and the scheme is 'https:' rather than 'http:'. Other than that, HTTPS URIs are identical to HTTP URIs; see URI::HTTP.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: DEFAULT_PORT
  value: "443"
full_name: URI::HTTPS
includes: []

instance_methods: []

name: HTTPS
superclass: HTTP
PK�|[��I�� ri/1.8/system/URI/cdesc-URI.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: extract
- !ruby/object:RI::MethodSummary 
  name: join
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: regexp
- !ruby/object:RI::MethodSummary 
  name: split
comment: 
- !ruby/struct:SM::Flow::P 
  body: URI support for Ruby
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "Author:"
    body: Akira Yamada &lt;akira@ruby-lang.org&gt;
  - !ruby/struct:SM::Flow::LI 
    label: "Documentation:"
    body: Akira Yamada &lt;akira@ruby-lang.org&gt;, Dmitry V. Sabanin &lt;sdmitry@lrn.ru&gt;
  - !ruby/struct:SM::Flow::LI 
    label: "License:"
    body: Copyright (c) 2001 akira yamada &lt;akira@ruby-lang.org&gt; You can redistribute it and/or modify it under the same term as Ruby.
  - !ruby/struct:SM::Flow::LI 
    label: "Revision:"
    body: "$Id: uri.rb 16038 2008-04-15 09:41:47Z kazu $"
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: See URI for documentation
constants: []

full_name: URI
includes: 
- !ruby/object:RI::IncludedModule 
  name: REGEXP
instance_methods: []

name: URI
superclass: 
PK�|[bp=3ri/1.8/system/URI/REGEXP/PATTERN/cdesc-PATTERN.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Patterns used to parse URI's
constants: []

full_name: URI::REGEXP::PATTERN
includes: []

instance_methods: []

name: PATTERN
superclass: 
PK�|[�P*��*ri/1.8/system/URI/REGEXP/cdesc-REGEXP.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: URI::REGEXP
includes: []

instance_methods: []

name: REGEXP
superclass: 
PK�|["�`?��<ri/1.8/system/URI/InvalidURIError/cdesc-InvalidURIError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Not a URI.
constants: []

full_name: URI::InvalidURIError
includes: []

instance_methods: []

name: InvalidURIError
superclass: Error
PK�|[��W���(ri/1.8/system/URI/LDAPS/cdesc-LDAPS.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The default port for LDAPS URIs is 636, and the scheme is 'ldaps:' rather than 'ldap:'. Other than that, LDAPS URIs are identical to LDAP URIs; see URI::LDAP.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: DEFAULT_PORT
  value: "636"
full_name: URI::LDAPS
includes: []

instance_methods: []

name: LDAPS
superclass: LDAP
PK�|[m�Hri/1.8/system/URI/InvalidComponentError/cdesc-InvalidComponentError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Not a URI component.
constants: []

full_name: URI::InvalidComponentError
includes: []

instance_methods: []

name: InvalidComponentError
superclass: Error
PK�|[�Ӹ

(ri/1.8/system/URI/Error/cdesc-Error.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Base class for all URI exceptions.
constants: []

full_name: URI::Error
includes: []

instance_methods: []

name: Error
superclass: StandardError
PK�|[X�6��ri/1.8/system/URI/parse-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Synopsis
- !ruby/struct:SM::Flow::VERB 
  body: "  URI::parse(uri_str)\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Args
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+uri_str+:"
    body: String with URI.
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: Creates one of the URI's subclasses instance from the string.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Raises
- !ruby/struct:SM::Flow::P 
  body: URI::InvalidURIError
- !ruby/struct:SM::Flow::VERB 
  body: "  Raised if URI given is not a correct one.\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Usage
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'uri'\n\n  uri = URI.parse(&quot;http://www.ruby-lang.org/&quot;)\n  p uri\n  # =&gt; #&lt;URI::HTTP:0x202281be URL:http://www.ruby-lang.org/&gt;\n  p uri.scheme\n  # =&gt; &quot;http&quot;\n  p uri.host\n  # =&gt; &quot;www.ruby-lang.org&quot;\n"
full_name: URI::parse
is_singleton: true
name: parse
params: (uri)
visibility: public
PK�|[���KKri/1.8/system/URI/join-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Synopsis
- !ruby/struct:SM::Flow::VERB 
  body: "  URI::join(str[, str, ...])\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Args
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+str+:"
    body: String(s) to work with
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: Joins URIs.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Usage
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'uri'\n\n  p URI.join(&quot;http://localhost/&quot;,&quot;main.rbx&quot;)\n  # =&gt; #&lt;URI::HTTP:0x2022ac02 URL:http://localhost/main.rbx&gt;\n"
full_name: URI::join
is_singleton: true
name: join
params: (*str)
visibility: public
PK�|[>��f!!ri/1.8/system/URI/split-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Synopsis
- !ruby/struct:SM::Flow::VERB 
  body: "  URI::split(uri)\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Args
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+uri+:"
    body: String with URI.
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: "Splits the string on following parts and returns array with result:"
- !ruby/struct:SM::Flow::VERB 
  body: "  * Scheme\n  * Userinfo\n  * Host\n  * Port\n  * Registry\n  * Path\n  * Opaque\n  * Query\n  * Fragment\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Usage
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'uri'\n\n  p URI.split(&quot;http://www.ruby-lang.org/&quot;)\n  # =&gt; [&quot;http&quot;, nil, &quot;www.ruby-lang.org&quot;, nil, nil, &quot;/&quot;, nil, nil, nil]\n"
full_name: URI::split
is_singleton: true
name: split
params: (uri)
visibility: public
PK�|[A�w��&ri/1.8/system/URI/Util/cdesc-Util.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: URI::Util
includes: []

instance_methods: []

name: Util
superclass: 
PK�|[�Bm��)ri/1.8/system/URI/Generic/set_host-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#set_host
is_singleton: false
name: set_host
params: (v)
visibility: protected
PK�|[�Y�)ri/1.8/system/URI/Generic/route_to-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Args
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+oth+:"
    body: URI or String
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: Calculates relative path to oth from self
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Usage
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'uri'\n\n  uri = URI.parse('http://my.example.com')\n  p uri.route_to('http://my.example.com/main.rbx?page=1')\n  #=&gt; #&lt;URI::Generic:0x2020c2f6 URL:/main.rbx?page=1&gt;\n"
full_name: URI::Generic#route_to
is_singleton: false
name: route_to
params: (oth)
visibility: public
PK�|[��  +ri/1.8/system/URI/Generic/find_proxy-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: returns a proxy URI. The proxy URI is obtained from environment variables such as http_proxy, ftp_proxy, no_proxy, etc. If there is no proper proxy, nil is returned.
- !ruby/struct:SM::Flow::P 
  body: Note that capitalized variables (HTTP_PROXY, FTP_PROXY, NO_PROXY, etc.) are examined too.
- !ruby/struct:SM::Flow::P 
  body: "But http_proxy and HTTP_PROXY is treated specially under CGI environment. It's because HTTP_PROXY may be set by Proxy: header. So HTTP_PROXY is not used. http_proxy is not used too if the variable is case insensitive. CGI_HTTP_PROXY can be used instead."
full_name: URI::Generic#find_proxy
is_singleton: false
name: find_proxy
params: ()
visibility: public
PK�|[jPz���-ri/1.8/system/URI/Generic/check_opaque-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#check_opaque
is_singleton: false
name: check_opaque
params: (v)
visibility: private
PK�|[%�^��'ri/1.8/system/URI/Generic/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#eql?
is_singleton: false
name: eql?
params: (oth)
visibility: public
PK�|[�\��/ri/1.8/system/URI/Generic/check_fragment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#check_fragment
is_singleton: false
name: check_fragment
params: (v)
visibility: private
PK�|[*���+ri/1.8/system/URI/Generic/set_scheme-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#set_scheme
is_singleton: false
name: set_scheme
params: (v)
visibility: protected
PK�|[႘���,ri/1.8/system/URI/Generic/cdesc-Generic.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: fragment
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: host
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: opaque
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: path
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: port
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: query
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: registry
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: scheme
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: build
- !ruby/object:RI::MethodSummary 
  name: build2
- !ruby/object:RI::MethodSummary 
  name: component
- !ruby/object:RI::MethodSummary 
  name: default_port
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: use_registry
comment: 
- !ruby/struct:SM::Flow::P 
  body: Base class for all URI classes. Implements generic URI syntax as per RFC 2396.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: DEFAULT_PORT
  value: nil
- !ruby/object:RI::Constant 
  comment: 
  name: COMPONENT
  value: "[       :scheme,        :userinfo, :host, :port, :registry,        :path, :opaque,        :query,        :fragment"
- !ruby/object:RI::Constant 
  comment: 
  name: USE_REGISTRY
  value: "false"
full_name: URI::Generic
includes: 
- !ruby/object:RI::IncludedModule 
  name: URI
- !ruby/object:RI::IncludedModule 
  name: REGEXP
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: +
- !ruby/object:RI::MethodSummary 
  name: "-"
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: absolute
- !ruby/object:RI::MethodSummary 
  name: absolute?
- !ruby/object:RI::MethodSummary 
  name: check_fragment
- !ruby/object:RI::MethodSummary 
  name: check_host
- !ruby/object:RI::MethodSummary 
  name: check_opaque
- !ruby/object:RI::MethodSummary 
  name: check_password
- !ruby/object:RI::MethodSummary 
  name: check_path
- !ruby/object:RI::MethodSummary 
  name: check_port
- !ruby/object:RI::MethodSummary 
  name: check_query
- !ruby/object:RI::MethodSummary 
  name: check_registry
- !ruby/object:RI::MethodSummary 
  name: check_scheme
- !ruby/object:RI::MethodSummary 
  name: check_user
- !ruby/object:RI::MethodSummary 
  name: check_userinfo
- !ruby/object:RI::MethodSummary 
  name: coerce
- !ruby/object:RI::MethodSummary 
  name: component
- !ruby/object:RI::MethodSummary 
  name: component_ary
- !ruby/object:RI::MethodSummary 
  name: default_port
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: escape_userpass
- !ruby/object:RI::MethodSummary 
  name: find_proxy
- !ruby/object:RI::MethodSummary 
  name: fragment=
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: hierarchical?
- !ruby/object:RI::MethodSummary 
  name: host=
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: merge
- !ruby/object:RI::MethodSummary 
  name: merge!
- !ruby/object:RI::MethodSummary 
  name: merge0
- !ruby/object:RI::MethodSummary 
  name: merge_path
- !ruby/object:RI::MethodSummary 
  name: normalize
- !ruby/object:RI::MethodSummary 
  name: normalize!
- !ruby/object:RI::MethodSummary 
  name: opaque=
- !ruby/object:RI::MethodSummary 
  name: password
- !ruby/object:RI::MethodSummary 
  name: password=
- !ruby/object:RI::MethodSummary 
  name: path=
- !ruby/object:RI::MethodSummary 
  name: path_query
- !ruby/object:RI::MethodSummary 
  name: port=
- !ruby/object:RI::MethodSummary 
  name: query=
- !ruby/object:RI::MethodSummary 
  name: registry=
- !ruby/object:RI::MethodSummary 
  name: relative?
- !ruby/object:RI::MethodSummary 
  name: replace!
- !ruby/object:RI::MethodSummary 
  name: route_from
- !ruby/object:RI::MethodSummary 
  name: route_from0
- !ruby/object:RI::MethodSummary 
  name: route_from_path
- !ruby/object:RI::MethodSummary 
  name: route_to
- !ruby/object:RI::MethodSummary 
  name: scheme=
- !ruby/object:RI::MethodSummary 
  name: select
- !ruby/object:RI::MethodSummary 
  name: set_fragment
- !ruby/object:RI::MethodSummary 
  name: set_host
- !ruby/object:RI::MethodSummary 
  name: set_opaque
- !ruby/object:RI::MethodSummary 
  name: set_password
- !ruby/object:RI::MethodSummary 
  name: set_path
- !ruby/object:RI::MethodSummary 
  name: set_port
- !ruby/object:RI::MethodSummary 
  name: set_query
- !ruby/object:RI::MethodSummary 
  name: set_registry
- !ruby/object:RI::MethodSummary 
  name: set_scheme
- !ruby/object:RI::MethodSummary 
  name: set_user
- !ruby/object:RI::MethodSummary 
  name: set_userinfo
- !ruby/object:RI::MethodSummary 
  name: split_path
- !ruby/object:RI::MethodSummary 
  name: split_userinfo
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: user
- !ruby/object:RI::MethodSummary 
  name: user=
- !ruby/object:RI::MethodSummary 
  name: userinfo
- !ruby/object:RI::MethodSummary 
  name: userinfo=
name: Generic
superclass: Object
PK�|[�L~%%&ri/1.8/system/URI/Generic/merge-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: +
block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Args
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+oth+:"
    body: URI or String
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: Merges two URI's.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Usage
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'uri'\n\n  uri = URI.parse(&quot;http://my.example.com&quot;)\n  p uri.merge(&quot;/main.rbx?page=1&quot;)\n  # =&gt;  #&lt;URI::HTTP:0x2021f3b0 URL:http://my.example.com/main.rbx?page=1&gt;\n"
full_name: URI::Generic#merge
is_singleton: false
name: merge
params: (oth)
visibility: public
PK�|["��د�'ri/1.8/system/URI/Generic/coerce-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#coerce
is_singleton: false
name: coerce
params: (oth)
visibility: public
PK�|[tyu,UU'ri/1.8/system/URI/Generic/select-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Args
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+components+:"
    body: Multiple Symbol arguments defined in URI::HTTP
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: Selects specified components from URI
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Usage
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'uri'\n\n  uri = URI.parse('http://myuser:mypass@my.example.com/test.rbx')\n  p uri.select(:userinfo, :host, :path)\n  # =&gt; [&quot;myuser:mypass&quot;, &quot;my.example.com&quot;, &quot;/test.rbx&quot;]\n"
full_name: URI::Generic#select
is_singleton: false
name: select
params: (*components)
visibility: public
PK�|[�K7s��+ri/1.8/system/URI/Generic/merge_path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#merge_path
is_singleton: false
name: merge_path
params: (base, rel)
visibility: private
PK�|[*�I���+ri/1.8/system/URI/Generic/path_query-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#path_query
is_singleton: false
name: path_query
params: ()
visibility: private
PK�|[����(ri/1.8/system/URI/Generic/port%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#port=
is_singleton: false
name: port=
params: (v)
visibility: public
PK�|[�����-ri/1.8/system/URI/Generic/set_registry-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#set_registry
is_singleton: false
name: set_registry
params: (v)
visibility: protected
PK�|[���-ri/1.8/system/URI/Generic/default_port-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns default port
full_name: URI::Generic::default_port
is_singleton: true
name: default_port
params: ()
visibility: public
PK�|[8s�5��,ri/1.8/system/URI/Generic/registry%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#registry=
is_singleton: false
name: registry=
params: (v)
visibility: public
PK�|[¿tį�*ri/1.8/system/URI/Generic/opaque%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#opaque=
is_singleton: false
name: opaque=
params: (v)
visibility: public
PK�|[��(6��-ri/1.8/system/URI/Generic/set_fragment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#set_fragment
is_singleton: false
name: set_fragment
params: (v)
visibility: protected
PK�|[5��a��/ri/1.8/system/URI/Generic/split_userinfo-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#split_userinfo
is_singleton: false
name: split_userinfo
params: (ui)
visibility: private
PK�|[;��r��%ri/1.8/system/URI/Generic/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#hash
is_singleton: false
name: hash
params: ()
visibility: public
PK�|[h$ud��(ri/1.8/system/URI/Generic/user%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#user=
is_singleton: false
name: user=
params: (user)
visibility: public
PK�|[��6��)ri/1.8/system/URI/Generic/set_port-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#set_port
is_singleton: false
name: set_port
params: (v)
visibility: protected
PK�|[������)ri/1.8/system/URI/Generic/query%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#query=
is_singleton: false
name: query=
params: (v)
visibility: public
PK�|[��I��+ri/1.8/system/URI/Generic/check_path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#check_path
is_singleton: false
name: check_path
params: (v)
visibility: private
PK�|[��߶�+ri/1.8/system/URI/Generic/check_port-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#check_port
is_singleton: false
name: check_port
params: (v)
visibility: private
PK�|[�0�|'ri/1.8/system/URI/Generic/merge0-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: return base and rel. you can modify `base', but can not `rel'.
full_name: URI::Generic#merge0
is_singleton: false
name: merge0
params: (oth)
visibility: private
PK�|[�����-ri/1.8/system/URI/Generic/check_scheme-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#check_scheme
is_singleton: false
name: check_scheme
params: (v)
visibility: private
PK�|[m�R/��)ri/1.8/system/URI/Generic/set_user-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#set_user
is_singleton: false
name: set_user
params: (v)
visibility: protected
PK�|[4��R��&ri/1.8/system/URI/Generic/build-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Synopsis
- !ruby/struct:SM::Flow::P 
  body: "See #new"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: "Creates a new URI::Generic instance from components of URI::Generic with check. Components are: scheme, userinfo, host, port, registry, path, opaque, query and fragment. You can provide arguments either by an Array or a Hash. See #new for hash keys to use or for order of array items."
full_name: URI::Generic::build
is_singleton: true
name: build
params: (args)
visibility: public
PK�|[<��Ǽ�-ri/1.8/system/URI/Generic/set_password-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#set_password
is_singleton: false
name: set_password
params: (v)
visibility: protected
PK�|[i(�!��*ri/1.8/system/URI/Generic/normalize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns normalized URI
full_name: URI::Generic#normalize
is_singleton: false
name: normalize
params: ()
visibility: public
PK�|[��{���*ri/1.8/system/URI/Generic/component-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Components of the URI in the order.
full_name: URI::Generic::component
is_singleton: true
name: component
params: ()
visibility: public
PK�|[�Z��0ri/1.8/system/URI/Generic/route_from_path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#route_from_path
is_singleton: false
name: route_from_path
params: (src, dst)
visibility: private
PK�|[�����(ri/1.8/system/URI/Generic/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[�(��(ri/1.8/system/URI/Generic/host%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#host=
is_singleton: false
name: host=
params: (v)
visibility: public
PK�|[FR�##,ri/1.8/system/URI/Generic/absolute%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: absolute
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Checks if URI is an absolute one
full_name: URI::Generic#absolute?
is_singleton: false
name: absolute?
params: ()
visibility: public
PK�|[�/Y}��/ri/1.8/system/URI/Generic/check_registry-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#check_registry
is_singleton: false
name: check_registry
params: (v)
visibility: private
PK�|[7�\Y��/ri/1.8/system/URI/Generic/check_password-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#check_password
is_singleton: false
name: check_password
params: (v, user = @user)
visibility: private
PK�|[}ܡ���.ri/1.8/system/URI/Generic/component_ary-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#component_ary
is_singleton: false
name: component_ary
params: ()
visibility: protected
PK�|[:׽���0ri/1.8/system/URI/Generic/escape_userpass-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#escape_userpass
is_singleton: false
name: escape_userpass
params: (v)
visibility: private
PK�|[�۪ҫ�(ri/1.8/system/URI/Generic/path%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#path=
is_singleton: false
name: path=
params: (v)
visibility: public
PK�|[ʕ���$ri/1.8/system/URI/Generic/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Args
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+scheme+:"
    body: Protocol scheme, i.e. 'http','ftp','mailto' and so on.
  - !ruby/struct:SM::Flow::LI 
    label: "+userinfo+:"
    body: User name and password, i.e. 'sdmitry:bla'
  - !ruby/struct:SM::Flow::LI 
    label: "+host+:"
    body: Server host name
  - !ruby/struct:SM::Flow::LI 
    label: "+port+:"
    body: Server port
  - !ruby/struct:SM::Flow::LI 
    label: "+registry+:"
    body: "DOC: FIXME!"
  - !ruby/struct:SM::Flow::LI 
    label: "+path+:"
    body: Path on server
  - !ruby/struct:SM::Flow::LI 
    label: "+opaque+:"
    body: "DOC: FIXME!"
  - !ruby/struct:SM::Flow::LI 
    label: "+query+:"
    body: Query data
  - !ruby/struct:SM::Flow::LI 
    label: "+fragment+:"
    body: A part of URI after '#' sign
  - !ruby/struct:SM::Flow::LI 
    label: "+arg_check+:"
    body: Check arguments [false by default]
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: Creates a new URI::Generic instance from ``generic'' components without check.
full_name: URI::Generic::new
is_singleton: true
name: new
params: (scheme, userinfo, host, port, registry, path, opaque, query, fragment, arg_check = false)
visibility: public
PK�|[�/%��-ri/1.8/system/URI/Generic/set_userinfo-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#set_userinfo
is_singleton: false
name: set_userinfo
params: (user, password = nil)
visibility: protected
PK�|[!c���-ri/1.8/system/URI/Generic/use_registry-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "DOC: FIXME!"
full_name: URI::Generic::use_registry
is_singleton: true
name: use_registry
params: ()
visibility: public
PK�|[
vﺶ�*ri/1.8/system/URI/Generic/set_query-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#set_query
is_singleton: false
name: set_query
params: (v)
visibility: protected
PK�|[�{���0ri/1.8/system/URI/Generic/hierarchical%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Checks if URI has a path
full_name: URI::Generic#hierarchical?
is_singleton: false
name: hierarchical?
params: ()
visibility: public
PK�|[r�f���/ri/1.8/system/URI/Generic/check_userinfo-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#check_userinfo
is_singleton: false
name: check_userinfo
params: (user, password = nil)
visibility: private
PK�|[�?jB��+ri/1.8/system/URI/Generic/set_opaque-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#set_opaque
is_singleton: false
name: set_opaque
params: (v)
visibility: protected
PK�|[�T8{��)ri/1.8/system/URI/Generic/set_path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#set_path
is_singleton: false
name: set_path
params: (v)
visibility: protected
PK�|[)!�6��$ri/1.8/system/URI/Generic/%2b-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #merge"
full_name: URI::Generic#+
is_singleton: false
name: +
params: (oth)
visibility: public
PK�|[��>>'ri/1.8/system/URI/Generic/build2-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Synopsis
- !ruby/struct:SM::Flow::P 
  body: "See #new"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: At first, tries to create a new URI::Generic instance using URI::Generic::build. But, if exception URI::InvalidComponentError is raised, then it URI::Escape.escape all URI components and tries again.
full_name: URI::Generic::build2
is_singleton: true
name: build2
params: (args)
visibility: public
PK�|[d��)ri/1.8/system/URI/Generic/merge%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Args
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+oth+:"
    body: URI or String
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: "Destructive form of #merge"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Usage
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'uri'\n\n  uri = URI.parse(&quot;http://my.example.com&quot;)\n  uri.merge!(&quot;/main.rbx?page=1&quot;)\n  p uri\n  # =&gt;  #&lt;URI::HTTP:0x2021f3b0 URL:http://my.example.com/main.rbx?page=1&gt;\n"
full_name: URI::Generic#merge!
is_singleton: false
name: merge!
params: (oth)
visibility: public
PK�|[}VT]��-ri/1.8/system/URI/Generic/default_port-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#default_port
is_singleton: false
name: default_port
params: ()
visibility: public
PK�|[����-ri/1.8/system/URI/Generic/normalize%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Destructive version of #normalize"
full_name: URI::Generic#normalize!
is_singleton: false
name: normalize!
params: ()
visibility: public
PK�|[�����+ri/1.8/system/URI/Generic/replace%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: replace self by other URI object
full_name: URI::Generic#replace!
is_singleton: false
name: replace!
params: (oth)
visibility: private
PK�|[E�7'��%ri/1.8/system/URI/Generic/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Constructs String from URI
full_name: URI::Generic#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|['�D���'ri/1.8/system/URI/Generic/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compares to URI's
full_name: URI::Generic#==
is_singleton: false
name: ==
params: (oth)
visibility: public
PK�|[������,ri/1.8/system/URI/Generic/route_from0-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#route_from0
is_singleton: false
name: route_from0
params: (oth)
visibility: private
PK�|[��=��+ri/1.8/system/URI/Generic/split_path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#split_path
is_singleton: false
name: split_path
params: (path)
visibility: private
PK�|[cu���+ri/1.8/system/URI/Generic/check_host-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#check_host
is_singleton: false
name: check_host
params: (v)
visibility: private
PK�|[�����*ri/1.8/system/URI/Generic/component-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#component
is_singleton: false
name: component
params: ()
visibility: public
PK�|[*<�1��,ri/1.8/system/URI/Generic/password%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#password=
is_singleton: false
name: password=
params: (password)
visibility: public
PK�|[U�A��,ri/1.8/system/URI/Generic/fragment%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#fragment=
is_singleton: false
name: fragment=
params: (v)
visibility: public
PK�|[C�8�;;+ri/1.8/system/URI/Generic/route_from-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: "-"
block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Args
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+oth+:"
    body: URI or String
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: Calculates relative path from oth to self
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Usage
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'uri'\n\n  uri = URI.parse('http://my.example.com/main.rbx?page=1')\n  p uri.route_from('http://my.example.com')\n  #=&gt; #&lt;URI::Generic:0x20218858 URL:/main.rbx?page=1&gt;\n"
full_name: URI::Generic#route_from
is_singleton: false
name: route_from
params: (oth)
visibility: public
PK�|[R��V��%ri/1.8/system/URI/Generic/user-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#user
is_singleton: false
name: user
params: ()
visibility: public
PK�|[�rQ��)ri/1.8/system/URI/Generic/userinfo-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#userinfo
is_singleton: false
name: userinfo
params: ()
visibility: public
PK�|[��e#��)ri/1.8/system/URI/Generic/absolute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #absolute?"
full_name: URI::Generic#absolute
is_singleton: false
name: absolute
params: ()
visibility: public
PK�|[�%�N��*ri/1.8/system/URI/Generic/scheme%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#scheme=
is_singleton: false
name: scheme=
params: (v)
visibility: public
PK�|[~M߰�)ri/1.8/system/URI/Generic/password-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#password
is_singleton: false
name: password
params: ()
visibility: public
PK�|[ܺ�,ri/1.8/system/URI/Generic/userinfo%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets userinfo, argument is string like 'name:pass'
full_name: URI::Generic#userinfo=
is_singleton: false
name: userinfo=
params: (userinfo)
visibility: public
PK�|[=����+ri/1.8/system/URI/Generic/check_user-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#check_user
is_singleton: false
name: check_user
params: (v)
visibility: private
PK�|[��Վ��$ri/1.8/system/URI/Generic/%2d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #route_from"
full_name: URI::Generic#-
is_singleton: false
name: "-"
params: (oth)
visibility: public
PK�|[�	i��,ri/1.8/system/URI/Generic/check_query-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::Generic#check_query
is_singleton: false
name: check_query
params: (v)
visibility: private
PK�|[xQb��,ri/1.8/system/URI/Generic/relative%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Checks if URI is relative
full_name: URI::Generic#relative?
is_singleton: false
name: relative?
params: ()
visibility: public
PK�|[��=�� ri/1.8/system/URI/extract-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: $&
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Synopsis
- !ruby/struct:SM::Flow::VERB 
  body: "  URI::extract(str[, schemes][,&amp;blk])\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Args
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+str+:"
    body: String to extract URIs from.
  - !ruby/struct:SM::Flow::LI 
    label: "+schemes+:"
    body: Limit URI matching to a specific schemes.
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: Extracts URIs from a string. If block given, iterates through all matched URIs. Returns nil if block given or array with matches.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Usage
- !ruby/struct:SM::Flow::VERB 
  body: "  require &quot;uri&quot;\n\n  URI.extract(&quot;text here http://foo.example.org/bla and here mailto:test@example.com and here also.&quot;)\n  # =&gt; [&quot;http://foo.example.com/bla&quot;, &quot;mailto:test@example.com&quot;]\n"
full_name: URI::extract
is_singleton: true
name: extract
params: (str, schemes = nil, &block) {|$&| ...}
visibility: public
PK�|[^���4ri/1.8/system/URI/BadURIError/cdesc-BadURIError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: URI is valid, bad usage is not.
constants: []

full_name: URI::BadURIError
includes: []

instance_methods: []

name: BadURIError
superclass: Error
PK�|[sh���+ri/1.8/system/URI/LDAP/extensions%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP#extensions=
is_singleton: false
name: extensions=
params: (val)
visibility: public
PK�|[�6��&ri/1.8/system/URI/LDAP/parse_dn-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP#parse_dn
is_singleton: false
name: parse_dn
params: ()
visibility: private
PK�|[�T�Ԯ�'ri/1.8/system/URI/LDAP/filter%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP#filter=
is_singleton: false
name: filter=
params: (val)
visibility: public
PK�|[t؄��#ri/1.8/system/URI/LDAP/scope-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP#scope
is_singleton: false
name: scope
params: ()
visibility: public
PK�|[��<��$ri/1.8/system/URI/LDAP/filter-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP#filter
is_singleton: false
name: filter
params: ()
visibility: public
PK�|[O5
`��(ri/1.8/system/URI/LDAP/set_filter-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP#set_filter
is_singleton: false
name: set_filter
params: (val)
visibility: protected
PK�|[�x%���&ri/1.8/system/URI/LDAP/scope%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP#scope=
is_singleton: false
name: scope=
params: (val)
visibility: public
PK�|[n`���#ri/1.8/system/URI/LDAP/build-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP::build
is_singleton: true
name: build
params: (args)
visibility: public
PK�|[Sgwצ�#ri/1.8/system/URI/LDAP/dn%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP#dn=
is_singleton: false
name: dn=
params: (val)
visibility: public
PK�|[m2B-��,ri/1.8/system/URI/LDAP/set_extensions-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP#set_extensions
is_singleton: false
name: set_extensions
params: (val)
visibility: protected
PK�|[����NN&ri/1.8/system/URI/LDAP/cdesc-LDAP.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: build
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: LDAP URI SCHEMA (described in RFC2255) ldap://&lt;host&gt;/&lt;dn&gt;[?&lt;attrs&gt;[?&lt;scope&gt;[?&lt;filter&gt;[?&lt;extensions&gt;]]]]
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: DEFAULT_PORT
  value: "389"
- !ruby/object:RI::Constant 
  comment: 
  name: COMPONENT
  value: "[       :scheme,       :host, :port,       :dn,       :attributes,       :scope,       :filter,       :extensions,     ].freeze"
- !ruby/object:RI::Constant 
  comment: 
  name: SCOPE
  value: "[       SCOPE_ONE = 'one',       SCOPE_SUB = 'sub',       SCOPE_BASE = 'base',     ].freeze"
full_name: URI::LDAP
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: attributes
- !ruby/object:RI::MethodSummary 
  name: attributes=
- !ruby/object:RI::MethodSummary 
  name: build_path_query
- !ruby/object:RI::MethodSummary 
  name: dn
- !ruby/object:RI::MethodSummary 
  name: dn=
- !ruby/object:RI::MethodSummary 
  name: extensions
- !ruby/object:RI::MethodSummary 
  name: extensions=
- !ruby/object:RI::MethodSummary 
  name: filter
- !ruby/object:RI::MethodSummary 
  name: filter=
- !ruby/object:RI::MethodSummary 
  name: hierarchical?
- !ruby/object:RI::MethodSummary 
  name: parse_dn
- !ruby/object:RI::MethodSummary 
  name: parse_query
- !ruby/object:RI::MethodSummary 
  name: scope
- !ruby/object:RI::MethodSummary 
  name: scope=
- !ruby/object:RI::MethodSummary 
  name: set_attributes
- !ruby/object:RI::MethodSummary 
  name: set_dn
- !ruby/object:RI::MethodSummary 
  name: set_extensions
- !ruby/object:RI::MethodSummary 
  name: set_filter
- !ruby/object:RI::MethodSummary 
  name: set_scope
name: LDAP
superclass: Generic
PK�|[�qD���.ri/1.8/system/URI/LDAP/build_path_query-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP#build_path_query
is_singleton: false
name: build_path_query
params: ()
visibility: private
PK�|[+Ӳm��!ri/1.8/system/URI/LDAP/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP::new
is_singleton: true
name: new
params: (*arg)
visibility: public
PK�|[өr���(ri/1.8/system/URI/LDAP/attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP#attributes
is_singleton: false
name: attributes
params: ()
visibility: public
PK�|[GR�r��-ri/1.8/system/URI/LDAP/hierarchical%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP#hierarchical?
is_singleton: false
name: hierarchical?
params: ()
visibility: public
PK�|[��*��(ri/1.8/system/URI/LDAP/extensions-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP#extensions
is_singleton: false
name: extensions
params: ()
visibility: public
PK�|[�t��)ri/1.8/system/URI/LDAP/parse_query-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP#parse_query
is_singleton: false
name: parse_query
params: ()
visibility: private
PK�|[�����'ri/1.8/system/URI/LDAP/set_scope-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP#set_scope
is_singleton: false
name: set_scope
params: (val)
visibility: protected
PK�|[5d7G�� ri/1.8/system/URI/LDAP/dn-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP#dn
is_singleton: false
name: dn
params: ()
visibility: public
PK�|[P�띿�,ri/1.8/system/URI/LDAP/set_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP#set_attributes
is_singleton: false
name: set_attributes
params: (val)
visibility: protected
PK�|[�侫��+ri/1.8/system/URI/LDAP/attributes%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP#attributes=
is_singleton: false
name: attributes=
params: (val)
visibility: public
PK�|[&8ï�$ri/1.8/system/URI/LDAP/set_dn-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::LDAP#set_dn
is_singleton: false
name: set_dn
params: (val)
visibility: protected
PK�|[�>˗��ri/1.8/system/URI/regexp-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Synopsis
- !ruby/struct:SM::Flow::VERB 
  body: "  URI::regexp([match_schemes])\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Args
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+match_schemes+:"
    body: Array of schemes. If given, resulting regexp matches to URIs whose scheme is one of the match_schemes.
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: Returns a Regexp object which matches to URI-like strings. The Regexp object returned by this method includes arbitrary number of capture group (parentheses). Never rely on it's number.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Usage
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'uri'\n\n  # extract first URI from html_string\n  html_string.slice(URI.regexp)\n\n  # remove ftp URIs\n  html_string.sub(URI.regexp(['ftp'])\n\n  # You should not rely on the number of parentheses\n  html_string.scan(URI.regexp) do |*matches|\n    p $&amp;\n  end\n"
full_name: URI::regexp
is_singleton: true
name: regexp
params: (schemes = nil)
visibility: public
PK�|[7L���&ri/1.8/system/URI/Escape/encode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #escape"
full_name: URI::Escape#encode
is_singleton: false
name: encode
params: (str, unsafe = UNSAFE)
visibility: public
PK�|[���\\(ri/1.8/system/URI/Escape/unescape-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: decode
block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Synopsis
- !ruby/struct:SM::Flow::VERB 
  body: "  URI.unescape(str)\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Args
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+str+:"
    body: Unescapes the string.
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Usage
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'uri'\n\n  enc_uri = URI.escape(&quot;http://example.com/?a=\\11\\15&quot;)\n  p enc_uri\n  # =&gt; &quot;http://example.com/?a=%09%0D&quot;\n\n  p URI.unescape(enc_uri)\n  # =&gt; &quot;http://example.com/?a=\\t\\r&quot;\n"
full_name: URI::Escape#unescape
is_singleton: false
name: unescape
params: (str)
visibility: public
PK�|[/���PP&ri/1.8/system/URI/Escape/escape-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: encode
block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Synopsis
- !ruby/struct:SM::Flow::VERB 
  body: "  URI.escape(str [, unsafe])\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Args
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+str+:"
    body: String to replaces in.
  - !ruby/struct:SM::Flow::LI 
    label: "+unsafe+:"
    body: Regexp that matches all symbols that must be replaced with codes. By default uses <tt>REGEXP::UNSAFE</tt>. When this argument is a String, it represents a character set.
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: Escapes the string, replacing all unsafe characters with codes.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Usage
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'uri'\n\n  enc_uri = URI.escape(&quot;http://example.com/?a=\\11\\15&quot;)\n  p enc_uri\n  # =&gt; &quot;http://example.com/?a=%09%0D&quot;\n\n  p URI.unescape(enc_uri)\n  # =&gt; &quot;http://example.com/?a=\\t\\r&quot;\n\n  p URI.escape(&quot;@?@!&quot;, &quot;!?&quot;)\n  # =&gt; &quot;@%3F@%21&quot;\n"
full_name: URI::Escape#escape
is_singleton: false
name: escape
params: (str, unsafe = UNSAFE)
visibility: public
PK�|[�����&ri/1.8/system/URI/Escape/decode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #unescape"
full_name: URI::Escape#decode
is_singleton: false
name: decode
params: (str)
visibility: public
PK�|[��?_��*ri/1.8/system/URI/Escape/cdesc-Escape.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: URI::Escape
includes: 
- !ruby/object:RI::IncludedModule 
  name: REGEXP
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: decode
- !ruby/object:RI::MethodSummary 
  name: encode
- !ruby/object:RI::MethodSummary 
  name: escape
- !ruby/object:RI::MethodSummary 
  name: unescape
name: Escape
superclass: 
PK�|[�nƴ��)ri/1.8/system/URI/HTTP/request_uri-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: Returns the full path for an HTTP request, as required by Net::HTTP::Get.
- !ruby/struct:SM::Flow::P 
  body: If the URI contains a query, the full path is URI#path + '?' + URI#query. Otherwise, the path is simply URI#path.
full_name: URI::HTTP#request_uri
is_singleton: false
name: request_uri
params: ()
visibility: public
PK�|[�i	���#ri/1.8/system/URI/HTTP/build-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: Create a new URI::HTTP object from components, with syntax checking.
- !ruby/struct:SM::Flow::P 
  body: The components accepted are userinfo, host, port, path, query and fragment.
- !ruby/struct:SM::Flow::P 
  body: The components should be provided either as an Array, or as a Hash with keys formed by preceding the component names with a colon.
- !ruby/struct:SM::Flow::P 
  body: If an Array is used, the components must be passed in the order [userinfo, host, port, path, query, fragment].
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "    newuri = URI::HTTP.build({:host =&gt; 'www.example.com',\n      :path&gt; =&gt; '/foo/bar'})\n\n    newuri = URI::HTTP.build([nil, &quot;www.example.com&quot;, nil, &quot;/path&quot;,\n      &quot;query&quot;, 'fragment'])\n"
- !ruby/struct:SM::Flow::P 
  body: Currently, if passed userinfo components this method generates invalid HTTP URIs as per RFC 1738.
full_name: URI::HTTP::build
is_singleton: true
name: build
params: (args)
visibility: public
PK�|[����JJ!ri/1.8/system/URI/HTTP/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: Create a new URI::HTTP object from generic URI components as per RFC 2396. No HTTP-specific syntax checking (as per RFC 1738) is performed.
- !ruby/struct:SM::Flow::P 
  body: Arguments are <tt>scheme</tt>, <tt>userinfo</tt>, <tt>host</tt>, <tt>port</tt>, <tt>registry</tt>, <tt>path</tt>, <tt>opaque</tt>, <tt>query</tt> and <tt>fragment</tt>, in that order.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "    uri = URI::HTTP.new(['http', nil, &quot;www.example.com&quot;, nil, &quot;/path&quot;,\n      &quot;query&quot;, 'fragment'])\n"
full_name: URI::HTTP::new
is_singleton: true
name: new
params: (*arg)
visibility: public
PK�|[�����&ri/1.8/system/URI/HTTP/cdesc-HTTP.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: build
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: The syntax of HTTP URIs is defined in RFC1738 section 3.3.
- !ruby/struct:SM::Flow::P 
  body: Note that the Ruby URI library allows HTTP URLs containing usernames and passwords. This is not legal as per the RFC, but used to be supported in Internet Explorer 5 and 6, before the MS04-004 security update. See &lt;URL:http://support.microsoft.com/kb/834489&gt;.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: DEFAULT_PORT
  value: "80"
- !ruby/object:RI::Constant 
  comment: 
  name: COMPONENT
  value: "[       :scheme,        :userinfo, :host, :port,        :path,        :query,        :fragment"
full_name: URI::HTTP
includes: 
- !ruby/object:RI::IncludedModule 
  name: OpenURI::OpenRead
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: request_uri
name: HTTP
superclass: Object
PK�|[��#��+ri/1.8/system/URI/MailTo/set_headers-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::MailTo#set_headers
is_singleton: false
name: set_headers
params: (v)
visibility: protected
PK�|[G�E+��&ri/1.8/system/URI/MailTo/set_to-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::MailTo#set_to
is_singleton: false
name: set_to
params: (v)
visibility: protected
PK�|[�9!���%ri/1.8/system/URI/MailTo/build-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: Creates a new URI::MailTo object from components, with syntax checking.
- !ruby/struct:SM::Flow::P 
  body: Components can be provided as an Array or Hash. If an Array is used, the components must be supplied as [to, headers].
- !ruby/struct:SM::Flow::P 
  body: If a Hash is used, the keys are the component names preceded by colons.
- !ruby/struct:SM::Flow::P 
  body: The headers can be supplied as a pre-encoded string, such as &quot;subject=subscribe&amp;cc=address&quot;, or as an Array of Arrays like [['subject', 'subscribe'], ['cc', 'address']]
- !ruby/struct:SM::Flow::P 
  body: "Examples:"
- !ruby/struct:SM::Flow::VERB 
  body: "   require 'uri'\n\n   m1 = URI::MailTo.build(['joe@example.com', 'subject=Ruby'])\n   puts m1.to_s  -&gt;  mailto:joe@example.com?subject=Ruby\n\n   m2 = URI::MailTo.build(['john@example.com', [['Subject', 'Ruby'], ['Cc', 'jack@example.com']]])\n   puts m2.to_s  -&gt;  mailto:john@example.com?Subject=Ruby&amp;Cc=jack@example.com\n\n   m3 = URI::MailTo.build({:to =&gt; 'listman@example.com', :headers =&gt; [['subject', 'subscribe']]})\n   puts m3.to_s  -&gt;  mailto:listman@example.com?subject=subscribe\n"
full_name: URI::MailTo::build
is_singleton: true
name: build
params: (args)
visibility: public
PK�|[Y0����%ri/1.8/system/URI/MailTo/to%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::MailTo#to=
is_singleton: false
name: to=
params: (v)
visibility: public
PK�|[Qje���#ri/1.8/system/URI/MailTo/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: Creates a new URI::MailTo object from generic URL components with no syntax checking.
- !ruby/struct:SM::Flow::P 
  body: This method is usually called from URI::parse, which checks the validity of each component.
full_name: URI::MailTo::new
is_singleton: true
name: new
params: (*arg)
visibility: public
PK�|['<����*ri/1.8/system/URI/MailTo/headers%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::MailTo#headers=
is_singleton: false
name: headers=
params: (v)
visibility: public
PK�|[�ZZ��-ri/1.8/system/URI/MailTo/to_rfc822text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #to_mailtext"
full_name: URI::MailTo#to_rfc822text
is_singleton: false
name: to_rfc822text
params: ()
visibility: public
PK�|[6����+ri/1.8/system/URI/MailTo/to_mailtext-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: to_rfc822text
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the RFC822 e-mail text equivalent of the URL, as a String.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'uri'\n\n  uri = URI.parse(&quot;mailto:ruby-list@ruby-lang.org?Subject=subscribe&amp;cc=myaddr&quot;)\n  uri.to_mailtext\n  # =&gt; &quot;To: ruby-list@ruby-lang.org\\nSubject: subscribe\\nCc: myaddr\\n\\n\\n&quot;\n"
full_name: URI::MailTo#to_mailtext
is_singleton: false
name: to_mailtext
params: ()
visibility: public
PK�|[h��{��$ri/1.8/system/URI/MailTo/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::MailTo#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[2���(ri/1.8/system/URI/MailTo/check_to-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::MailTo#check_to
is_singleton: false
name: check_to
params: (v)
visibility: private
PK�|[�^����-ri/1.8/system/URI/MailTo/check_headers-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: URI::MailTo#check_headers
is_singleton: false
name: check_headers
params: (v)
visibility: private
PK�|[ċ'�==*ri/1.8/system/URI/MailTo/cdesc-MailTo.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: E-mail headers set by the URL, as an Array of Arrays
  name: headers
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The primary e-mail address of the URL, as a String
  name: to
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: build
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: RFC2368, The mailto URL scheme
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: DEFAULT_PORT
  value: nil
- !ruby/object:RI::Constant 
  comment: 
  name: COMPONENT
  value: "[ :scheme, :to, :headers ].freeze"
full_name: URI::MailTo
includes: 
- !ruby/object:RI::IncludedModule 
  name: REGEXP
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: check_headers
- !ruby/object:RI::MethodSummary 
  name: check_to
- !ruby/object:RI::MethodSummary 
  name: headers=
- !ruby/object:RI::MethodSummary 
  name: set_headers
- !ruby/object:RI::MethodSummary 
  name: set_to
- !ruby/object:RI::MethodSummary 
  name: to=
- !ruby/object:RI::MethodSummary 
  name: to_mailtext
- !ruby/object:RI::MethodSummary 
  name: to_rfc822text
- !ruby/object:RI::MethodSummary 
  name: to_s
name: MailTo
superclass: Generic
PK�|[	��q��2ri/1.8/system/RuntimeError/cdesc-RuntimeError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: RuntimeError
includes: []

instance_methods: []

name: RuntimeError
superclass: StandardError
PK�|[ϋ��+ri/1.8/system/Arguable/extend_object-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Initializes instance variable.
full_name: Arguable::extend_object
is_singleton: true
name: extend_object
params: (obj)
visibility: public
PK�|[����NN(ri/1.8/system/Arguable/permute%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parses <tt>self</tt> destructively in permutation mode and returns <tt>self</tt> containing the rest arguments left unparsed.
full_name: Arguable#permute!
is_singleton: false
name: permute!
params: ()
visibility: public
PK�|[m���*ri/1.8/system/Arguable/cdesc-Arguable.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: extend_object
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Extends command line arguments array (ARGV) to parse itself.
constants: []

full_name: Arguable
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: getopts
- !ruby/object:RI::MethodSummary 
  name: options
- !ruby/object:RI::MethodSummary 
  name: options=
- !ruby/object:RI::MethodSummary 
  name: order!
- !ruby/object:RI::MethodSummary 
  name: parse!
- !ruby/object:RI::MethodSummary 
  name: permute!
name: Arguable
superclass: 
PK�|[��Y66&ri/1.8/system/Arguable/parse%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parses <tt>self</tt> destructively and returns <tt>self</tt> containing the rest arguments left unparsed.
full_name: Arguable#parse!
is_singleton: false
name: parse!
params: ()
visibility: public
PK�|[�:?���(ri/1.8/system/Arguable/options%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets OptionParser object, when <tt>opt</tt> is <tt>false</tt> or <tt>nil</tt>, methods OptionParser::Arguable#options and OptionParser::Arguable#options= are undefined. Thus, there is no ways to access the OptionParser object via the receiver object.
full_name: Arguable#options=
is_singleton: false
name: options=
params: (opt)
visibility: public
PK�|[��8B��!ri/1.8/system/Arguable/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Arguable::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[���%ri/1.8/system/Arguable/getopts-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Substitution of getopts is possible as follows. Also see OptionParser#getopts.
- !ruby/struct:SM::Flow::VERB 
  body: "  def getopts(*args)\n    ($OPT = ARGV.getopts(*args)).each do |opt, val|\n      eval &quot;$OPT_#{opt.gsub(/[^A-Za-z0-9_]/, '_')} = val&quot;\n    end\n  rescue OptionParser::ParseError\n  end\n"
full_name: Arguable#getopts
is_singleton: false
name: getopts
params: (*args)
visibility: public
PK�|[%-ή77%ri/1.8/system/Arguable/options-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: "@optparse"
comment: 
- !ruby/struct:SM::Flow::P 
  body: Actual OptionParser object, automatically created if nonexistent.
- !ruby/struct:SM::Flow::P 
  body: If called with a block, yields the OptionParser object and returns the result of the block. If an OptionParser::ParseError exception occurs in the block, it is rescued, a error message printed to STDERR and <tt>nil</tt> returned.
full_name: Arguable#options
is_singleton: false
name: options
params: () {|@optparse| ...}
visibility: public
PK�|[�q��CC&ri/1.8/system/Arguable/order%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parses <tt>self</tt> destructively in order and returns <tt>self</tt> containing the rest arguments left unparsed.
full_name: Arguable#order!
is_singleton: false
name: order!
params: (&blk)
visibility: public
PK�|[��66'ri/1.8/system/NoMethodError/args-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the arguments passed in as the third parameter to the constructor.
full_name: NoMethodError#args
is_singleton: false
name: args
params: |
  no_method_error.args  => obj

visibility: public
PK�|[�=����4ri/1.8/system/NoMethodError/cdesc-NoMethodError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: NoMethodError
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: args
name: NoMethodError
superclass: NameError
PK�|[��3���&ri/1.8/system/NoMethodError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Construct a NoMethodError exception for a method of the given name called with the given arguments. The name may be accessed using the <tt>#name</tt> method on the resulting object, and the arguments using the <tt>#args</tt> method.
full_name: NoMethodError::new
is_singleton: true
name: new
params: |
  NoMethodError.new(msg, name [, args])  => no_method_error

visibility: public
PK�|[r�:zz,ri/1.8/system/LoadError/cdesc-LoadError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: LoadError
includes: []

instance_methods: []

name: LoadError
superclass: ScriptError
PK�|[��̞		.ri/1.8/system/OpenStruct/cdesc-OpenStruct.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "OpenStruct allows you to create data objects and set arbitrary attributes. For example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'ostruct'\n\n  record = OpenStruct.new\n  record.name    = &quot;John Smith&quot;\n  record.age     = 70\n  record.pension = 300\n\n  puts record.name     # -&gt; &quot;John Smith&quot;\n  puts record.address  # -&gt; nil\n"
- !ruby/struct:SM::Flow::P 
  body: It is like a hash with a different way to access the data. In fact, it is implemented with a hash, and you can initialize it with one.
- !ruby/struct:SM::Flow::VERB 
  body: "  hash = { &quot;country&quot; =&gt; &quot;Australia&quot;, :population =&gt; 20_000_000 }\n  data = OpenStruct.new(hash)\n\n  p data        # -&gt; &lt;OpenStruct country=&quot;Australia&quot; population=20000000&gt;\n"
constants: []

full_name: OpenStruct
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: delete_field
- !ruby/object:RI::MethodSummary 
  name: initialize_copy
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: marshal_dump
- !ruby/object:RI::MethodSummary 
  name: marshal_load
- !ruby/object:RI::MethodSummary 
  name: modifiable
- !ruby/object:RI::MethodSummary 
  name: new_ostruct_member
- !ruby/object:RI::MethodSummary 
  name: to_s
name: OpenStruct
superclass: Object
PK�|[;Bd�??'ri/1.8/system/OpenStruct/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: to_s
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a string containing a detailed summary of the keys and values.
full_name: OpenStruct#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[��q,ri/1.8/system/OpenStruct/delete_field-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Remove the named field from the object.
full_name: OpenStruct#delete_field
is_singleton: false
name: delete_field
params: (name)
visibility: public
PK�|[�˾��#ri/1.8/system/OpenStruct/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new OpenStruct object. The optional <tt>hash</tt>, if given, will generate attributes and values. For example.
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'ostruct'\n  hash = { &quot;country&quot; =&gt; &quot;Australia&quot;, :population =&gt; 20_000_000 }\n  data = OpenStruct.new(hash)\n\n  p data        # -&gt; &lt;OpenStruct country=&quot;Australia&quot; population=20000000&gt;\n"
- !ruby/struct:SM::Flow::P 
  body: By default, the resulting OpenStruct object will have no attributes.
full_name: OpenStruct::new
is_singleton: true
name: new
params: (hash=nil)
visibility: public
PK�|[�
%H��,ri/1.8/system/OpenStruct/marshal_load-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: OpenStruct#marshal_load
is_singleton: false
name: marshal_load
params: (x)
visibility: public
PK�|[���/ri/1.8/system/OpenStruct/initialize_copy-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Duplicate an OpenStruct object members.
full_name: OpenStruct#initialize_copy
is_singleton: false
name: initialize_copy
params: (orig)
visibility: public
PK�|[��o���2ri/1.8/system/OpenStruct/new_ostruct_member-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: OpenStruct#new_ostruct_member
is_singleton: false
name: new_ostruct_member
params: (name)
visibility: public
PK�|[f����,ri/1.8/system/OpenStruct/marshal_dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: OpenStruct#marshal_dump
is_singleton: false
name: marshal_dump
params: ()
visibility: public
PK�|[}���$ri/1.8/system/OpenStruct/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #inspect"
full_name: OpenStruct#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[I�&ri/1.8/system/OpenStruct/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compare this object and <tt>other</tt> for equality.
full_name: OpenStruct#==
is_singleton: false
name: ==
params: (other)
visibility: public
PK�|[��S��*ri/1.8/system/OpenStruct/modifiable-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: OpenStruct#modifiable
is_singleton: false
name: modifiable
params: ()
visibility: protected
PK�|[����$ri/1.8/system/RubyToken/Token-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyToken#Token
is_singleton: false
name: Token
params: (token, value = nil)
visibility: public
PK�|[�����>ri/1.8/system/RubyToken/TkUnknownChar/cdesc-TkUnknownChar.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RubyToken::TkUnknownChar
includes: []

instance_methods: []

name: TkUnknownChar
superclass: Token
PK�|[!f����0ri/1.8/system/RubyToken/TkUnknownChar/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyToken::TkUnknownChar::new
is_singleton: true
name: new
params: (line_no, char_no, id)
visibility: public
PK�|[7��ii0ri/1.8/system/RubyToken/TkNode/cdesc-TkNode.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: node
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: node
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RubyToken::TkNode
includes: []

instance_methods: []

name: TkNode
superclass: Token
PK�|[���>��)ri/1.8/system/RubyToken/TkNode/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyToken::TkNode::new
is_singleton: true
name: new
params: (seek, line_no, char_no)
visibility: public
PK�|[n;���,ri/1.8/system/RubyToken/TkId/cdesc-TkId.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RubyToken::TkId
includes: []

instance_methods: []

name: TkId
superclass: Token
PK�|[�V��'ri/1.8/system/RubyToken/TkId/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyToken::TkId::new
is_singleton: true
name: new
params: (line_no, char_no, name)
visibility: public
PK�|[Hs����2ri/1.8/system/RubyToken/TkError/cdesc-TkError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RubyToken::TkError
includes: []

instance_methods: []

name: TkError
superclass: Token
PK�|[��L((,ri/1.8/system/RubyToken/TkOp/cdesc-TkOp.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: RW
class_methods: []

comment: 
constants: []

full_name: RubyToken::TkOp
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: name
name: TkOp
superclass: Token
PK�|[3�̫�(ri/1.8/system/RubyToken/TkOp/name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyToken::TkOp#name
is_singleton: false
name: name
params: ()
visibility: public
PK�|[n�=��(ri/1.8/system/RubyToken/def_token-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyToken::def_token
is_singleton: true
name: def_token
params: (token_n, super_token = Token, reading = nil, *opts)
visibility: public
PK�|[�-���4ri/1.8/system/RubyToken/TkOPASGN/cdesc-TkOPASGN.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: op
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: op
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RubyToken::TkOPASGN
includes: []

instance_methods: []

name: TkOPASGN
superclass: TkOp
PK�|[�P>���+ri/1.8/system/RubyToken/TkOPASGN/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyToken::TkOPASGN::new
is_singleton: true
name: new
params: (line_no, char_no, op)
visibility: public
PK�|[+��&��1ri/1.8/system/RubyToken/set_token_position-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyToken#set_token_position
is_singleton: false
name: set_token_position
params: (line, char)
visibility: public
PK�|[_u����,ri/1.8/system/RubyToken/TkKW/cdesc-TkKW.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RubyToken::TkKW
includes: []

instance_methods: []

name: TkKW
superclass: TkId
PK�|[6��#0#0,ri/1.8/system/RubyToken/cdesc-RubyToken.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: def_token
- !ruby/object:RI::MethodSummary 
  name: def_token
comment: 
- !ruby/struct:SM::Flow::P 
  body: Definitions of all tokens involved in the lexical analysis
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: EXPR_BEG
  value: ":EXPR_BEG"
- !ruby/object:RI::Constant 
  comment: 
  name: EXPR_MID
  value: ":EXPR_MID"
- !ruby/object:RI::Constant 
  comment: 
  name: EXPR_END
  value: ":EXPR_END"
- !ruby/object:RI::Constant 
  comment: 
  name: EXPR_ARG
  value: ":EXPR_ARG"
- !ruby/object:RI::Constant 
  comment: 
  name: EXPR_FNAME
  value: ":EXPR_FNAME"
- !ruby/object:RI::Constant 
  comment: 
  name: EXPR_DOT
  value: ":EXPR_DOT"
- !ruby/object:RI::Constant 
  comment: 
  name: EXPR_CLASS
  value: ":EXPR_CLASS"
- !ruby/object:RI::Constant 
  comment: 
  name: Symbol
  value: Integer
- !ruby/object:RI::Constant 
  comment: 
  name: TokenDefinitions
  value: "[     [:TkCLASS,      TkId,  \"class\",  EXPR_CLASS],     [:TkMODULE,     TkId,  \"module\", EXPR_BEG],     [:TkDEF,        TkId,  \"def\",    EXPR_FNAME],     [:TkUNDEF,      TkId,  \"undef\",  EXPR_FNAME],     [:TkBEGIN,      TkId,  \"begin\",  EXPR_BEG],     [:TkRESCUE,     TkId,  \"rescue\", EXPR_MID],     [:TkENSURE,     TkId,  \"ensure\", EXPR_BEG],     [:TkEND,        TkId,  \"end\",    EXPR_END],     [:TkIF,         TkId,  \"if\",     EXPR_BEG, :TkIF_MOD],     [:TkUNLESS,     TkId,  \"unless\", EXPR_BEG, :TkUNLESS_MOD],     [:TkTHEN,       TkId,  \"then\",   EXPR_BEG],     [:TkELSIF,      TkId,  \"elsif\",  EXPR_BEG],     [:TkELSE,       TkId,  \"else\",   EXPR_BEG],     [:TkCASE,       TkId,  \"case\",   EXPR_BEG],     [:TkWHEN,       TkId,  \"when\",   EXPR_BEG],     [:TkWHILE,      TkId,  \"while\",  EXPR_BEG, :TkWHILE_MOD],     [:TkUNTIL,      TkId,  \"until\",  EXPR_BEG, :TkUNTIL_MOD],     [:TkFOR,        TkId,  \"for\",    EXPR_BEG],     [:TkBREAK,      TkId,  \"break\",  EXPR_END],     [:TkNEXT,       TkId,  \"next\",   EXPR_END],     [:TkREDO,       TkId,  \"redo\",   EXPR_END],     [:TkRETRY,      TkId,  \"retry\",  EXPR_END],     [:TkIN,         TkId,  \"in\",     EXPR_BEG],     [:TkDO,         TkId,  \"do\",     EXPR_BEG],     [:TkRETURN,     TkId,  \"return\", EXPR_MID],     [:TkYIELD,      TkId,  \"yield\",  EXPR_END],     [:TkSUPER,      TkId,  \"super\",  EXPR_END],     [:TkSELF,       TkId,  \"self\",   EXPR_END],     [:TkNIL,        TkId,  \"nil\",    EXPR_END],     [:TkTRUE,       TkId,  \"true\",   EXPR_END],     [:TkFALSE,      TkId,  \"false\",  EXPR_END],     [:TkAND,        TkId,  \"and\",    EXPR_BEG],     [:TkOR,         TkId,  \"or\",     EXPR_BEG],     [:TkNOT,        TkId,  \"not\",    EXPR_BEG],     [:TkIF_MOD,     TkId],     [:TkUNLESS_MOD, TkId],     [:TkWHILE_MOD,  TkId],     [:TkUNTIL_MOD,  TkId],     [:TkALIAS,      TkId,  \"alias\",    EXPR_FNAME],     [:TkDEFINED,    TkId,  \"defined?\", EXPR_END],     [:TklBEGIN,     TkId,  \"BEGIN\",    EXPR_END],     [:TklEND,       TkId,  \"END\",      EXPR_END],     [:Tk__LINE__,   TkId,  \"__LINE__\", EXPR_END],     [:Tk__FILE__,   TkId,  \"__FILE__\", EXPR_END],      [:TkIDENTIFIER, TkId],     [:TkFID,        TkId],     [:TkGVAR,       TkId],     [:TkCVAR,       TkId],     [:TkIVAR,       TkId],     [:TkCONSTANT,   TkId],      [:TkINTEGER,    TkVal],     [:TkFLOAT,      TkVal],     [:TkSTRING,     TkVal],     [:TkXSTRING,    TkVal],     [:TkREGEXP,     TkVal],     [:TkSYMBOL,     TkVal],      [:TkDSTRING,    TkNode],     [:TkDXSTRING,   TkNode],     [:TkDREGEXP,    TkNode],     [:TkNTH_REF,    TkNode],     [:TkBACK_REF,   TkNode],      [:TkUPLUS,      TkOp,   \"+@\"],     [:TkUMINUS,     TkOp,   \"-@\"],     [:TkPOW,        TkOp,   \"**\"],     [:TkCMP,        TkOp,   \"<=>\"],     [:TkEQ,         TkOp,   \"==\"],     [:TkEQQ,        TkOp,   \"===\"],     [:TkNEQ,        TkOp,   \"!=\"],     [:TkGEQ,        TkOp,   \">=\"],     [:TkLEQ,        TkOp,   \"<=\"],     [:TkANDOP,      TkOp,   \"&&\"],     [:TkOROP,       TkOp,   \"||\"],     [:TkMATCH,      TkOp,   \"=~\"],     [:TkNMATCH,     TkOp,   \"!~\"],     [:TkDOT2,       TkOp,   \"..\"],     [:TkDOT3,       TkOp,   \"...\"],     [:TkAREF,       TkOp,   \"[]\"],     [:TkASET,       TkOp,   \"[]=\"],     [:TkLSHFT,      TkOp,   \"<<\"],     [:TkRSHFT,      TkOp,   \">>\"],     [:TkCOLON2,     TkOp],     [:TkCOLON3,     TkOp], #   [:OPASGN,       TkOp],               # +=, -=  etc. #     [:TkASSOC,      TkOp,   \"=>\"],     [:TkQUESTION,   TkOp,   \"?\"],        #?     [:TkCOLON,      TkOp,   \":\"],        #:          [:TkfLPAREN],         # func( #     [:TkfLBRACK],         # func[ #     [:TkfLBRACE],         # func{ #     [:TkSTAR],            # *arg     [:TkAMPER],           # &arg #     [:TkSYMBEG],          # :SYMBOL      [:TkGT,         TkOp,   \">\"],     [:TkLT,         TkOp,   \"<\"],     [:TkPLUS,       TkOp,   \"+\"],     [:TkMINUS,      TkOp,   \"-\"],     [:TkMULT,       TkOp,   \"*\"],     [:TkDIV,        TkOp,   \"/\"],     [:TkMOD,        TkOp,   \"%\"],     [:TkBITOR,      TkOp,   \"|\"],     [:TkBITXOR,     TkOp,   \"^\"],     [:TkBITAND,     TkOp,   \"&\"],     [:TkBITNOT,     TkOp,   \"~\"],     [:TkNOTOP,      TkOp,   \"!\"],      [:TkBACKQUOTE,  TkOp,   \"`\"],      [:TkASSIGN,     Token,  \"=\"],     [:TkDOT,        Token,  \".\"],     [:TkLPAREN,     Token,  \"(\"],  #(exp)     [:TkLBRACK,     Token,  \"[\"],  #[arry]     [:TkLBRACE,     Token,  \"{\"],  #{hash}     [:TkRPAREN,     Token,  \")\"],     [:TkRBRACK,     Token,  \"]\"],     [:TkRBRACE,     Token,  \"}\"],     [:TkCOMMA,      Token,  \",\"],     [:TkSEMICOLON,  Token,  \";\"],      [:TkCOMMENT],     [:TkRD_COMMENT],     [:TkSPACE],     [:TkNL],     [:TkEND_OF_SCRIPT],      [:TkBACKSLASH,  TkUnknownChar,  \"\\\\\"],     [:TkAT,         TkUnknownChar,  \"@\"],     [:TkDOLLAR,     TkUnknownChar,  \"$\"],   ]"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "{reading =&gt; token_class} {reading =&gt; [token_class, *opt]}"
  name: TkReading2Token
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  name: TkSymbol2Token
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  name: EXPR_BEG
  value: ":EXPR_BEG"
- !ruby/object:RI::Constant 
  comment: 
  name: EXPR_MID
  value: ":EXPR_MID"
- !ruby/object:RI::Constant 
  comment: 
  name: EXPR_END
  value: ":EXPR_END"
- !ruby/object:RI::Constant 
  comment: 
  name: EXPR_ARG
  value: ":EXPR_ARG"
- !ruby/object:RI::Constant 
  comment: 
  name: EXPR_FNAME
  value: ":EXPR_FNAME"
- !ruby/object:RI::Constant 
  comment: 
  name: EXPR_DOT
  value: ":EXPR_DOT"
- !ruby/object:RI::Constant 
  comment: 
  name: EXPR_CLASS
  value: ":EXPR_CLASS"
- !ruby/object:RI::Constant 
  comment: 
  name: TokenDefinitions
  value: "[     [:TkCLASS,      TkKW,  \"class\",  EXPR_CLASS],     [:TkMODULE,     TkKW,  \"module\", EXPR_BEG],     [:TkDEF,        TkKW,  \"def\",    EXPR_FNAME],     [:TkUNDEF,      TkKW,  \"undef\",  EXPR_FNAME],     [:TkBEGIN,      TkKW,  \"begin\",  EXPR_BEG],     [:TkRESCUE,     TkKW,  \"rescue\", EXPR_MID],     [:TkENSURE,     TkKW,  \"ensure\", EXPR_BEG],     [:TkEND,        TkKW,  \"end\",    EXPR_END],     [:TkIF,         TkKW,  \"if\",     EXPR_BEG, :TkIF_MOD],     [:TkUNLESS,     TkKW,  \"unless\", EXPR_BEG, :TkUNLESS_MOD],     [:TkTHEN,       TkKW,  \"then\",   EXPR_BEG],     [:TkELSIF,      TkKW,  \"elsif\",  EXPR_BEG],     [:TkELSE,       TkKW,  \"else\",   EXPR_BEG],     [:TkCASE,       TkKW,  \"case\",   EXPR_BEG],     [:TkWHEN,       TkKW,  \"when\",   EXPR_BEG],     [:TkWHILE,      TkKW,  \"while\",  EXPR_BEG, :TkWHILE_MOD],     [:TkUNTIL,      TkKW,  \"until\",  EXPR_BEG, :TkUNTIL_MOD],     [:TkFOR,        TkKW,  \"for\",    EXPR_BEG],     [:TkBREAK,      TkKW,  \"break\",  EXPR_END],     [:TkNEXT,       TkKW,  \"next\",   EXPR_END],     [:TkREDO,       TkKW,  \"redo\",   EXPR_END],     [:TkRETRY,      TkKW,  \"retry\",  EXPR_END],     [:TkIN,         TkKW,  \"in\",     EXPR_BEG],     [:TkDO,         TkKW,  \"do\",     EXPR_BEG],     [:TkRETURN,     TkKW,  \"return\", EXPR_MID],     [:TkYIELD,      TkKW,  \"yield\",  EXPR_END],     [:TkSUPER,      TkKW,  \"super\",  EXPR_END],     [:TkSELF,       TkKW,  \"self\",   EXPR_END],     [:TkNIL,        TkKW,  \"nil\",    EXPR_END],     [:TkTRUE,       TkKW,  \"true\",   EXPR_END],     [:TkFALSE,      TkKW,  \"false\",  EXPR_END],     [:TkAND,        TkKW,  \"and\",    EXPR_BEG],     [:TkOR,         TkKW,  \"or\",     EXPR_BEG],     [:TkNOT,        TkKW,  \"not\",    EXPR_BEG],     [:TkIF_MOD,     TkKW],     [:TkUNLESS_MOD, TkKW],     [:TkWHILE_MOD,  TkKW],     [:TkUNTIL_MOD,  TkKW],     [:TkALIAS,      TkKW,  \"alias\",    EXPR_FNAME],     [:TkDEFINED,    TkKW,  \"defined?\", EXPR_END],     [:TklBEGIN,     TkKW,  \"BEGIN\",    EXPR_END],     [:TklEND,       TkKW,  \"END\",      EXPR_END],     [:Tk__LINE__,   TkKW,  \"__LINE__\", EXPR_END],     [:Tk__FILE__,   TkKW,  \"__FILE__\", EXPR_END],      [:TkIDENTIFIER, TkId],     [:TkFID,        TkId],     [:TkGVAR,       TkId],     [:TkIVAR,       TkId],     [:TkCONSTANT,   TkId],      [:TkINTEGER,    TkVal],     [:TkFLOAT,      TkVal],     [:TkSTRING,     TkVal],     [:TkXSTRING,    TkVal],     [:TkREGEXP,     TkVal],     [:TkCOMMENT,    TkVal],      [:TkDSTRING,    TkNode],     [:TkDXSTRING,   TkNode],     [:TkDREGEXP,    TkNode],     [:TkNTH_REF,    TkId],     [:TkBACK_REF,   TkId],      [:TkUPLUS,      TkOp,   \"+@\"],     [:TkUMINUS,     TkOp,   \"-@\"],     [:TkPOW,        TkOp,   \"**\"],     [:TkCMP,        TkOp,   \"<=>\"],     [:TkEQ,         TkOp,   \"==\"],     [:TkEQQ,        TkOp,   \"===\"],     [:TkNEQ,        TkOp,   \"!=\"],     [:TkGEQ,        TkOp,   \">=\"],     [:TkLEQ,        TkOp,   \"<=\"],     [:TkANDOP,      TkOp,   \"&&\"],     [:TkOROP,       TkOp,   \"||\"],     [:TkMATCH,      TkOp,   \"=~\"],     [:TkNMATCH,     TkOp,   \"!~\"],     [:TkDOT2,       TkOp,   \"..\"],     [:TkDOT3,       TkOp,   \"...\"],     [:TkAREF,       TkOp,   \"[]\"],     [:TkASET,       TkOp,   \"[]=\"],     [:TkLSHFT,      TkOp,   \"<<\"],     [:TkRSHFT,      TkOp,   \">>\"],     [:TkCOLON2,     TkOp],     [:TkCOLON3,     TkOp], #   [:OPASGN,       TkOp],               # +=, -=  etc. #     [:TkASSOC,      TkOp,   \"=>\"],     [:TkQUESTION,   TkOp,   \"?\"],        #?     [:TkCOLON,      TkOp,   \":\"],        #:          [:TkfLPAREN],         # func( #     [:TkfLBRACK],         # func[ #     [:TkfLBRACE],         # func{ #     [:TkSTAR],            # *arg     [:TkAMPER],           # &arg #     [:TkSYMBOL,     TkId],          # :SYMBOL     [:TkSYMBEG,     TkId],      [:TkGT,         TkOp,   \">\"],     [:TkLT,         TkOp,   \"<\"],     [:TkPLUS,       TkOp,   \"+\"],     [:TkMINUS,      TkOp,   \"-\"],     [:TkMULT,       TkOp,   \"*\"],     [:TkDIV,        TkOp,   \"/\"],     [:TkMOD,        TkOp,   \"%\"],     [:TkBITOR,      TkOp,   \"|\"],     [:TkBITXOR,     TkOp,   \"^\"],     [:TkBITAND,     TkOp,   \"&\"],     [:TkBITNOT,     TkOp,   \"~\"],     [:TkNOTOP,      TkOp,   \"!\"],      [:TkBACKQUOTE,  TkOp,   \"`\"],      [:TkASSIGN,     Token,  \"=\"],     [:TkDOT,        Token,  \".\"],     [:TkLPAREN,     Token,  \"(\"],  #(exp)     [:TkLBRACK,     Token,  \"[\"],  #[arry]     [:TkLBRACE,     Token,  \"{\"],  #{hash}     [:TkRPAREN,     Token,  \")\"],     [:TkRBRACK,     Token,  \"]\"],     [:TkRBRACE,     Token,  \"}\"],     [:TkCOMMA,      Token,  \",\"],     [:TkSEMICOLON,  Token,  \";\"],      [:TkRD_COMMENT],     [:TkSPACE],     [:TkNL],     [:TkEND_OF_SCRIPT],      [:TkBACKSLASH,  TkUnknownChar,  \"\\\\\"],     [:TkAT,         TkUnknownChar,  \"@\"],     [:TkDOLLAR,     TkUnknownChar,  \"\\$\"], #\"   ]"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "{reading =&gt; token_class} {reading =&gt; [token_class, *opt]}"
  name: TkReading2Token
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  name: TkSymbol2Token
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  name: NEWLINE_TOKEN
  value: TkNL.new(0,0)
full_name: RubyToken
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: Token
- !ruby/object:RI::MethodSummary 
  name: Token
- !ruby/object:RI::MethodSummary 
  name: set_token_position
name: RubyToken
superclass: 
PK�|[S;����(ri/1.8/system/RubyToken/TkVal/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyToken::TkVal::new
is_singleton: true
name: new
params: (line_no, char_no, value = nil)
visibility: public
PK�|[GD�WW.ri/1.8/system/RubyToken/TkVal/cdesc-TkVal.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: value
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RubyToken::TkVal
includes: []

instance_methods: []

name: TkVal
superclass: Token
PK�|[�{��\\.ri/1.8/system/RubyToken/Token/cdesc-Token.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: char_no
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: char_no
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: line_no
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: line_no
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: seek
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: text
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: text
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: NO_TEXT
  value: "\"??\".freeze"
full_name: RubyToken::Token
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: set_text
name: Token
superclass: Object
PK�|[y�*���(ri/1.8/system/RubyToken/Token/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RubyToken::Token::new
is_singleton: true
name: new
params: (line_no, char_no)
visibility: public
PK�|[�u��KK-ri/1.8/system/RubyToken/Token/set_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Because we're used in contexts that expect to return a token, we set the text string and then return ourselves
full_name: RubyToken::Token#set_text
is_singleton: false
name: set_text
params: (text)
visibility: public
PK�|[KFz��#ri/1.8/system/Numeric/%2b%40-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Unary Plus---Returns the receiver's value.
full_name: Numeric#+@
is_singleton: false
name: +@
params: |
  +num    => num

visibility: public
PK�|[�t8��#ri/1.8/system/Numeric/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>num</em> and <em>numeric</em> are the same type and have equal values.
- !ruby/struct:SM::Flow::VERB 
  body: "   1 == 1.0          #=&gt; true\n   1.eql?(1.0)       #=&gt; false\n   (1.0).eql?(1.0)   #=&gt; true\n"
full_name: Numeric#eql?
is_singleton: false
name: eql?
params: |
  num.eql?(numeric)    => true or false

visibility: public
PK�|[�ŰKK!ri/1.8/system/Numeric/fdiv-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>Numeric#/</tt>, but overridden in subclasses.
full_name: Numeric#fdiv
is_singleton: false
name: fdiv
params: |
  num.quo(numeric)    =>   result
  num.fdiv(numeric)   =>   result

visibility: public
PK�|[���]]'ri/1.8/system/Numeric/integer%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>num</em> is an <tt>Integer</tt> (including <tt>Fixnum</tt> and <tt>Bignum</tt>).
full_name: Numeric#integer?
is_singleton: false
name: integer?
params: |
  num.integer? -> true or false

visibility: public
PK�|[Nm�--&ri/1.8/system/Numeric/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns zero if <em>num</em> equals <em>other</em>, <tt>nil</tt> otherwise.
full_name: Numeric#<=>
is_singleton: false
name: <=>
params: |
  num <=> other -> 0 or nil

visibility: public
PK�|[�d̐#ri/1.8/system/Numeric/coerce-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "If <em>aNumeric</em> is the same type as <em>num</em>, returns an array containing <em>aNumeric</em> and <em>num</em>. Otherwise, returns an array with both <em>aNumeric</em> and <em>num</em> represented as <tt>Float</tt> objects. This coercion mechanism is used by Ruby to handle mixed-type numeric operations: it is intended to find a compatible common type between the two operands of the operator."
- !ruby/struct:SM::Flow::VERB 
  body: "   1.coerce(2.5)   #=&gt; [2.5, 1.0]\n   1.2.coerce(3)   #=&gt; [3.0, 1.2]\n   1.coerce(2)     #=&gt; [2, 1]\n"
full_name: Numeric#coerce
is_singleton: false
name: coerce
params: |
  num.coerce(numeric)   => array

visibility: public
PK�|[)�/$$#ri/1.8/system/Numeric/divmod-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array containing the quotient and modulus obtained by dividing <em>num</em> by <em>aNumeric</em>. If <tt>q, r = x.divmod(y)</tt>, then
- !ruby/struct:SM::Flow::VERB 
  body: "    q = floor(float(x)/float(y))\n    x = q*y + r\n"
- !ruby/struct:SM::Flow::P 
  body: "The quotient is rounded toward -infinity, as shown in the following table:"
- !ruby/struct:SM::Flow::VERB 
  body: "   a    |  b  |  a.divmod(b)  |   a/b   | a.modulo(b) | a.remainder(b)\n  ------+-----+---------------+---------+-------------+---------------\n   13   |  4  |   3,    1     |   3     |    1        |     1\n  ------+-----+---------------+---------+-------------+---------------\n   13   | -4  |  -4,   -3     |  -3     |   -3        |     1\n  ------+-----+---------------+---------+-------------+---------------\n  -13   |  4  |  -4,    3     |  -4     |    3        |    -1\n  ------+-----+---------------+---------+-------------+---------------\n  -13   | -4  |   3,   -1     |   3     |   -1        |    -1\n  ------+-----+---------------+---------+-------------+---------------\n   11.5 |  4  |   2,    3.5   |   2.875 |    3.5      |     3.5\n  ------+-----+---------------+---------+-------------+---------------\n   11.5 | -4  |  -3,   -0.5   |  -2.875 |   -0.5      |     3.5\n  ------+-----+---------------+---------+-------------+---------------\n  -11.5 |  4  |  -3,    0.5   |  -2.875 |    0.5      |    -3.5\n  ------+-----+---------------+---------+-------------+---------------\n  -11.5 | -4  |   2    -3.5   |   2.875 |   -3.5      |    -3.5\n"
- !ruby/struct:SM::Flow::P 
  body: Examples
- !ruby/struct:SM::Flow::VERB 
  body: "   11.divmod(3)         #=&gt; [3, 2]\n   11.divmod(-3)        #=&gt; [-4, -1]\n   11.divmod(3.5)       #=&gt; [3, 0.5]\n   (-11).divmod(3.5)    #=&gt; [-4, 3.0]\n   (11.5).divmod(3.5)   #=&gt; [3, 1.0]\n"
full_name: Numeric#divmod
is_singleton: false
name: divmod
params: |
  num.divmod( aNumeric ) -> anArray

visibility: public
PK�|[�i��II ri/1.8/system/Numeric/quo-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>Numeric#/</tt>, but overridden in subclasses.
full_name: Numeric#quo
is_singleton: false
name: quo
params: |
  num.quo(numeric)    =>   result
  num.fdiv(numeric)   =>   result

visibility: public
PK�|[L��� ri/1.8/system/Numeric/abs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the absolute value of <em>num</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   12.abs         #=&gt; 12\n   (-34.56).abs   #=&gt; 34.56\n   -34.56.abs     #=&gt; 34.56\n"
full_name: Numeric#abs
is_singleton: false
name: abs
params: |
  num.abs   => num or numeric

visibility: public
PK�|[�^@&��"ri/1.8/system/Numeric/angle-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #arg"
full_name: Numeric#angle
is_singleton: false
name: angle
params: ()
visibility: public
PK�|[�)�TT&ri/1.8/system/Numeric/remainder-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: If <em>num</em> and <em>numeric</em> have different signs, returns <em>mod</em>-<em>numeric</em>; otherwise, returns <em>mod</em>. In both cases <em>mod</em> is the value <em>num</em>.<tt>modulo(</tt><em>numeric</em><tt>)</tt>. The differences between <tt>remainder</tt> and modulo (<tt>%</tt>) are shown in the table under <tt>Numeric#divmod</tt>.
full_name: Numeric#remainder
is_singleton: false
name: remainder
params: |
  num.remainder(numeric)    => result

visibility: public
PK�|[v��p66!ri/1.8/system/Numeric/ceil-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the smallest <tt>Integer</tt> greater than or equal to <em>num</em>. Class <tt>Numeric</tt> achieves this by converting itself to a <tt>Float</tt> then invoking <tt>Float#ceil</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   1.ceil        #=&gt; 1\n   1.2.ceil      #=&gt; 2\n   (-1.2).ceil   #=&gt; -1\n   (-1.0).ceil   #=&gt; -1\n"
full_name: Numeric#ceil
is_singleton: false
name: ceil
params: |
  num.ceil    => integer

visibility: public
PK�|[��=o��'ri/1.8/system/Numeric/nonzero%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns <em>num</em> if <em>num</em> is not zero, <tt>nil</tt> otherwise. This behavior is useful when chaining comparisons:"
- !ruby/struct:SM::Flow::VERB 
  body: "   a = %w( z Bb bB bb BB a aA Aa AA A )\n   b = a.sort {|a,b| (a.downcase &lt;=&gt; b.downcase).nonzero? || a &lt;=&gt; b }\n   b   #=&gt; [&quot;A&quot;, &quot;a&quot;, &quot;AA&quot;, &quot;Aa&quot;, &quot;aA&quot;, &quot;BB&quot;, &quot;Bb&quot;, &quot;bB&quot;, &quot;bb&quot;, &quot;z&quot;]\n"
full_name: Numeric#nonzero?
is_singleton: false
name: nonzero?
params: |
  num.nonzero?    => num or nil

visibility: public
PK�|[�<��66!ri/1.8/system/Numeric/step-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invokes <em>block</em> with the sequence of numbers starting at <em>num</em>, incremented by <em>step</em> on each call. The loop finishes when the value to be passed to the block is greater than <em>limit</em> (if <em>step</em> is positive) or less than <em>limit</em> (if <em>step</em> is negative). If all the arguments are integers, the loop operates using an integer counter. If any of the arguments are floating point numbers, all are converted to floats, and the loop is executed <em>floor(n + n*epsilon)+ 1</em> times, where <em>n = (limit - num)/step</em>. Otherwise, the loop starts at <em>num</em>, uses either the <tt>&lt;</tt> or <tt>&gt;</tt> operator to compare the counter against <em>limit</em>, and increments itself using the <tt>+</tt> operator.
- !ruby/struct:SM::Flow::VERB 
  body: "   1.step(10, 2) { |i| print i, &quot; &quot; }\n   Math::E.step(Math::PI, 0.2) { |f| print f, &quot; &quot; }\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   1 3 5 7 9\n   2.71828182845905 2.91828182845905 3.11828182845905\n"
full_name: Numeric#step
is_singleton: false
name: step
params: |
  num.step(limit, step ) {|i| block }     => num

visibility: public
PK�|[ޠ�oJJ3ri/1.8/system/Numeric/singleton_method_added-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Trap attempts to add methods to <tt>Numeric</tt> objects. Always raises a <tt>TypeError</tt>
full_name: Numeric#singleton_method_added
is_singleton: false
name: singleton_method_added
params: (p1)
visibility: public
PK�|[Cc�!!$ri/1.8/system/Numeric/zero%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>num</em> has a zero value.
full_name: Numeric#zero?
is_singleton: false
name: zero?
params: |
  num.zero?    => true or false

visibility: public
PK�|[+�B��ri/1.8/system/Numeric/im-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a Complex number <tt>(0,<em>self</em>)</tt>.
full_name: Numeric#im
is_singleton: false
name: im
params: ()
visibility: public
PK�|[J
��%ri/1.8/system/Numeric/truncate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <em>num</em> truncated to an integer. <tt>Numeric</tt> implements this by converting its value to a float and invoking <tt>Float#truncate</tt>.
full_name: Numeric#truncate
is_singleton: false
name: truncate
params: |
  num.truncate    => integer

visibility: public
PK�|[">�<<#ri/1.8/system/Numeric/to_int-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invokes the child class's <tt>to_i</tt> method to convert <em>num</em> to an integer.
full_name: Numeric#to_int
is_singleton: false
name: to_int
params: |
  num.to_int    => integer

visibility: public
PK�|[�L]���"ri/1.8/system/Numeric/polar-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See Complex#polar.
full_name: Numeric#polar
is_singleton: false
name: polar
params: ()
visibility: public
PK�|[`<e��(ri/1.8/system/Numeric/cdesc-Numeric.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Numeric is a built-in class on which Fixnum, Bignum, etc., are based. Here some methods are added so that all number types can be treated to some extent as Complex numbers.
constants: []

full_name: Numeric
includes: 
- !ruby/object:RI::IncludedModule 
  name: Comparable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: +@
- !ruby/object:RI::MethodSummary 
  name: -@
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: abs
- !ruby/object:RI::MethodSummary 
  name: angle
- !ruby/object:RI::MethodSummary 
  name: arg
- !ruby/object:RI::MethodSummary 
  name: ceil
- !ruby/object:RI::MethodSummary 
  name: coerce
- !ruby/object:RI::MethodSummary 
  name: conj
- !ruby/object:RI::MethodSummary 
  name: conjugate
- !ruby/object:RI::MethodSummary 
  name: div
- !ruby/object:RI::MethodSummary 
  name: divmod
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: fdiv
- !ruby/object:RI::MethodSummary 
  name: floor
- !ruby/object:RI::MethodSummary 
  name: im
- !ruby/object:RI::MethodSummary 
  name: imag
- !ruby/object:RI::MethodSummary 
  name: image
- !ruby/object:RI::MethodSummary 
  name: integer?
- !ruby/object:RI::MethodSummary 
  name: modulo
- !ruby/object:RI::MethodSummary 
  name: nonzero?
- !ruby/object:RI::MethodSummary 
  name: polar
- !ruby/object:RI::MethodSummary 
  name: quo
- !ruby/object:RI::MethodSummary 
  name: real
- !ruby/object:RI::MethodSummary 
  name: remainder
- !ruby/object:RI::MethodSummary 
  name: round
- !ruby/object:RI::MethodSummary 
  name: singleton_method_added
- !ruby/object:RI::MethodSummary 
  name: step
- !ruby/object:RI::MethodSummary 
  name: to_int
- !ruby/object:RI::MethodSummary 
  name: truncate
- !ruby/object:RI::MethodSummary 
  name: zero?
name: Numeric
superclass: Object
PK�|[vH0���!ri/1.8/system/Numeric/conj-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #conjugate"
full_name: Numeric#conj
is_singleton: false
name: conj
params: ()
visibility: public
PK�|[�%�!!"ri/1.8/system/Numeric/image-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: imag
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The imaginary part of a complex number, i.e. 0.
full_name: Numeric#image
is_singleton: false
name: image
params: ()
visibility: public
PK�|[�����!ri/1.8/system/Numeric/imag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #image"
full_name: Numeric#imag
is_singleton: false
name: imag
params: ()
visibility: public
PK�|[������!ri/1.8/system/Numeric/real-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The real part of a complex number, i.e. <em>self</em>.
full_name: Numeric#real
is_singleton: false
name: real
params: ()
visibility: public
PK�|[���

#ri/1.8/system/Numeric/%2d%40-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Unary Minus---Returns the receiver's value, negated.
full_name: Numeric#-@
is_singleton: false
name: -@
params: |
  -num    => numeric

visibility: public
PK�|[�H��� ri/1.8/system/Numeric/div-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Uses <tt>/</tt> to perform division, then converts the result to an integer. <tt>Numeric</tt> does not define the <tt>/</tt> operator; this is left to subclasses.
full_name: Numeric#div
is_singleton: false
name: div
params: |
  num.div(numeric)    => integer

visibility: public
PK�|[�K�||"ri/1.8/system/Numeric/round-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Rounds <em>num</em> to the nearest integer. <tt>Numeric</tt> implements this by converting itself to a <tt>Float</tt> and invoking <tt>Float#round</tt>.
full_name: Numeric#round
is_singleton: false
name: round
params: |
  num.round    => integer

visibility: public
PK�|[t�o88&ri/1.8/system/Numeric/conjugate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: conj
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "See Complex#conjugate (short answer: returns <em>self</em>)."
full_name: Numeric#conjugate
is_singleton: false
name: conjugate
params: ()
visibility: public
PK�|[�j�i��"ri/1.8/system/Numeric/floor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the largest integer less than or equal to <em>num</em>. <tt>Numeric</tt> implements this by converting <em>anInteger</em> to a <tt>Float</tt> and invoking <tt>Float#floor</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   1.floor      #=&gt; 1\n   (-1).floor   #=&gt; -1\n"
full_name: Numeric#floor
is_singleton: false
name: floor
params: |
  num.floor    => integer

visibility: public
PK�|[�XI��� ri/1.8/system/Numeric/arg-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: angle
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See Complex#arg.
full_name: Numeric#arg
is_singleton: false
name: arg
params: ()
visibility: public
PK�|[]�X199#ri/1.8/system/Numeric/modulo-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <em>num</em>.<tt>divmod(</tt><em>aNumeric</em><tt>)[1]</tt>.
full_name: Numeric#modulo
is_singleton: false
name: modulo
params: |
  num.modulo(numeric)    => result

visibility: public
PK�|[�b�@++$ri/1.8/system/Process/setpgrp-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>setpgid(0,0)</tt>. Not available on all platforms.
full_name: Process::setpgrp
is_singleton: true
name: setpgrp
params: |
  Process.setpgrp   => 0

visibility: public
PK�|[}�2��$ri/1.8/system/Process/exit%21-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Exits the process immediately. No exit handlers are run. <em>fixnum</em> is returned to the underlying system as the exit status.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.exit!(0)\n"
full_name: Process::exit!
is_singleton: true
name: exit!
params: |
  Process.exit!(fixnum=-1)

visibility: public
PK�|[O���

#ri/1.8/system/Process/gid%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the group ID for this process.
full_name: Process::gid=
is_singleton: true
name: gid=
params: |
  Process.gid= fixnum   => fixnum

visibility: public
PK�|[�h�__(ri/1.8/system/Process/getpriority-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Gets the scheduling priority for specified process, process group, or user. <em>kind</em> indicates the kind of entity to find: one of <tt>Process::PRIO_PGRP</tt>, <tt>Process::PRIO_USER</tt>, or <tt>Process::PRIO_PROCESS</tt>. <em>integer</em> is an id indicating the particular process, process group, or user (an id of 0 means <em>current</em>). Lower priorities are more favorable for scheduling. Not available on all platforms."
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.getpriority(Process::PRIO_USER, 0)      #=&gt; 19\n   Process.getpriority(Process::PRIO_PROCESS, 0)   #=&gt; 19\n"
full_name: Process::getpriority
is_singleton: true
name: getpriority
params: |
  Process.getpriority(kind, integer)   => fixnum

visibility: public
PK�|[�}��$ri/1.8/system/Process/getpgid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the process group ID for the given process id. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.getpgid(Process.ppid())   #=&gt; 25527\n"
full_name: Process::getpgid
is_singleton: true
name: getpgid
params: |
  Process.getpgid(pid)   => integer

visibility: public
PK�|[>�����&ri/1.8/system/Process/maxgroups-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the maximum number of gids allowed in the supplemental group access list.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.maxgroups   #=&gt; 32\n"
full_name: Process::maxgroups
is_singleton: true
name: maxgroups
params: |
  Process.maxgroups   => fixnum

visibility: public
PK�|[j ����"ri/1.8/system/Process/abort-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Terminate execution immediately, effectively by calling <tt>Kernel.exit(1)</tt>. If <em>msg</em> is given, it is written to STDERR prior to terminating.
full_name: Process::abort
is_singleton: true
name: abort
params: |
  abort
  Kernel::abort
  Process::abort

visibility: public
PK�|[�E���!ri/1.8/system/Process/kill-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends the given signal to the specified process id(s), or to the current process if <em>pid</em> is zero. <em>signal</em> may be an integer signal number or a POSIX signal name (either with or without a <tt>SIG</tt> prefix). If <em>signal</em> is negative (or starts with a minus sign), kills process groups instead of processes. Not all signals are available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   pid = fork do\n      Signal.trap(&quot;HUP&quot;) { puts &quot;Ouch!&quot;; exit }\n      # ... do some work ...\n   end\n   # ...\n   Process.kill(&quot;HUP&quot;, pid)\n   Process.wait\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Ouch!\n"
full_name: Process::kill
is_singleton: true
name: kill
params: |
  Process.kill(signal, pid, ...)    => fixnum

visibility: public
PK�|[x�����"ri/1.8/system/Process/times-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a <tt>Tms</tt> structure (see <tt>Struct::Tms</tt> on page 388) that contains user and system CPU times for this process.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Process.times\n   [ t.utime, t.stime ]   #=&gt; [0.0, 0.02]\n"
full_name: Process::times
is_singleton: true
name: times
params: |
  Process.times   => aStructTms

visibility: public
PK�|[8��	�	�	&ri/1.8/system/Process/setrlimit-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the resource limit of the process. <em>cur_limit</em> means current (soft) limit and <em>max_limit</em> means maximum (hard) limit.
- !ruby/struct:SM::Flow::P 
  body: If <em>max_limit</em> is not given, <em>cur_limit</em> is used.
- !ruby/struct:SM::Flow::P 
  body: <em>resource</em> indicates the kind of resource to limit. The list of resources are OS dependent. Ruby may support following resources.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: Process::RLIMIT_CORE
    body: core size (bytes) (SUSv3)
  - !ruby/struct:SM::Flow::LI 
    label: Process::RLIMIT_CPU
    body: CPU time (seconds) (SUSv3)
  - !ruby/struct:SM::Flow::LI 
    label: Process::RLIMIT_DATA
    body: data segment (bytes) (SUSv3)
  - !ruby/struct:SM::Flow::LI 
    label: Process::RLIMIT_FSIZE
    body: file size (bytes) (SUSv3)
  - !ruby/struct:SM::Flow::LI 
    label: Process::RLIMIT_NOFILE
    body: file descriptors (number) (SUSv3)
  - !ruby/struct:SM::Flow::LI 
    label: Process::RLIMIT_STACK
    body: stack size (bytes) (SUSv3)
  - !ruby/struct:SM::Flow::LI 
    label: Process::RLIMIT_AS
    body: total available memory (bytes) (SUSv3, NetBSD, FreeBSD, OpenBSD but 4.4BSD-Lite)
  - !ruby/struct:SM::Flow::LI 
    label: Process::RLIMIT_MEMLOCK
    body: total size for mlock(2) (bytes) (4.4BSD, GNU/Linux)
  - !ruby/struct:SM::Flow::LI 
    label: Process::RLIMIT_NPROC
    body: number of processes for the user (number) (4.4BSD, GNU/Linux)
  - !ruby/struct:SM::Flow::LI 
    label: Process::RLIMIT_RSS
    body: resident memory size (bytes) (4.2BSD, GNU/Linux)
  - !ruby/struct:SM::Flow::LI 
    label: Process::RLIMIT_SBSIZE
    body: all socket buffers (bytes) (NetBSD, FreeBSD)
  type: :LABELED
- !ruby/struct:SM::Flow::P 
  body: Other <tt>Process::RLIMIT_???</tt> constants may be defined.
- !ruby/struct:SM::Flow::P 
  body: <em>cur_limit</em> and <em>max_limit</em> may be <tt>Process::RLIM_INFINITY</tt>, which means that the resource is not limited. They may be <tt>Process::RLIM_SAVED_MAX</tt> or <tt>Process::RLIM_SAVED_CUR</tt> too. See system setrlimit(2) manual for details.
full_name: Process::setrlimit
is_singleton: true
name: setrlimit
params: |
  Process.setrlimit(resource, cur_limit, max_limit)        => nil
  Process.setrlimit(resource, cur_limit)                   => nil

visibility: public
PK�|[^Q��]](ri/1.8/system/Process/setpriority-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>Process#getpriority</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.setpriority(Process::PRIO_USER, 0, 19)      #=&gt; 0\n   Process.setpriority(Process::PRIO_PROCESS, 0, 19)   #=&gt; 0\n   Process.getpriority(Process::PRIO_USER, 0)          #=&gt; 19\n   Process.getpriority(Process::PRIO_PROCESS, 0)       #=&gt; 19\n"
full_name: Process::setpriority
is_singleton: true
name: setpriority
params: |
  Process.setpriority(kind, integer, priority)   => 0

visibility: public
PK�|[�e��JJ)ri/1.8/system/Process/maxgroups%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the maximum number of gids allowed in the supplemental group access list.
full_name: Process::maxgroups=
is_singleton: true
name: maxgroups=
params: |
  Process.maxgroups= fixnum   => fixnum

visibility: public
PK�|[z�j��!ri/1.8/system/Process/wait-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Waits for a child process to exit, returns its process id, and sets <tt>$?</tt> to a <tt>Process::Status</tt> object containing information on that process. Which child it waits on depends on the value of <em>pid</em>:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "> 0:"
    body: Waits for the child whose process ID equals <em>pid</em>.
  - !ruby/struct:SM::Flow::LI 
    label: "0:"
    body: Waits for any child whose process group ID equals that of the calling process.
  - !ruby/struct:SM::Flow::LI 
    label: "-1:"
    body: Waits for any child process (the default if no <em>pid</em> is given).
  - !ruby/struct:SM::Flow::LI 
    label: "< -1:"
    body: Waits for any child whose process group ID equals the absolute value of <em>pid</em>.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: The <em>flags</em> argument may be a logical or of the flag values <tt>Process::WNOHANG</tt> (do not block if no child available) or <tt>Process::WUNTRACED</tt> (return stopped children that haven't been reported). Not all flags are available on all platforms, but a flag value of zero will work on all platforms.
- !ruby/struct:SM::Flow::P 
  body: Calling this method raises a <tt>SystemError</tt> if there are no child processes. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   include Process\n   fork { exit 99 }                 #=&gt; 27429\n   wait                             #=&gt; 27429\n   $?.exitstatus                    #=&gt; 99\n\n   pid = fork { sleep 3 }           #=&gt; 27440\n   Time.now                         #=&gt; Wed Apr 09 08:57:09 CDT 2003\n   waitpid(pid, Process::WNOHANG)   #=&gt; nil\n   Time.now                         #=&gt; Wed Apr 09 08:57:09 CDT 2003\n   waitpid(pid, 0)                  #=&gt; 27440\n   Time.now                         #=&gt; Wed Apr 09 08:57:12 CDT 2003\n"
full_name: Process::wait
is_singleton: true
name: wait
params: |
  Process.wait()                     => fixnum
  Process.wait(pid=-1, flags=0)      => fixnum
  Process.waitpid(pid=-1, flags=0)   => fixnum

visibility: public
PK�|[�p���!ri/1.8/system/Process/euid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the effective user ID for this process.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.euid   #=&gt; 501\n"
full_name: Process::euid
is_singleton: true
name: euid
params: |
  Process.euid           => fixnum
  Process::UID.eid       => fixnum
  Process::Sys.geteuid   => fixnum

visibility: public
PK�|[��h?��!ri/1.8/system/Process/egid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the effective group ID for this process. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.egid   #=&gt; 500\n"
full_name: Process::egid
is_singleton: true
name: egid
params: |
  Process.egid          => fixnum
  Process::GID.eid      => fixnum
  Process::Sys.geteid   => fixnum

visibility: public
PK�|[��V ��$ri/1.8/system/Process/getpgrp-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the process group ID for this process. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.getpgid(0)   #=&gt; 25527\n   Process.getpgrp      #=&gt; 25527\n"
full_name: Process::getpgrp
is_singleton: true
name: getpgrp
params: |
  Process.getpgrp   => integer

visibility: public
PK�|[�-�D��#ri/1.8/system/Process/detach-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Some operating systems retain the status of terminated child processes until the parent collects that status (normally using some variant of <tt>wait()</tt>. If the parent never collects this status, the child stays around as a <em>zombie</em> process. <tt>Process::detach</tt> prevents this by setting up a separate Ruby thread whose sole job is to reap the status of the process <em>pid</em> when it terminates. Use <tt>detach</tt> only when you do not intent to explicitly wait for the child to terminate. <tt>detach</tt> only checks the status periodically (currently once each second).
- !ruby/struct:SM::Flow::P 
  body: The waiting thread returns the exit status of the detached process when it terminates, so you can use <tt>Thread#join</tt> to know the result. If specified <em>pid</em> is not a valid child process ID, the thread returns <tt>nil</tt> immediately.
- !ruby/struct:SM::Flow::P 
  body: In this first example, we don't reap the first child process, so it appears as a zombie in the process status display.
- !ruby/struct:SM::Flow::VERB 
  body: "   p1 = fork { sleep 0.1 }\n   p2 = fork { sleep 0.2 }\n   Process.waitpid(p2)\n   sleep 2\n   system(&quot;ps -ho pid,state -p #{p1}&quot;)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   27389 Z\n"
- !ruby/struct:SM::Flow::P 
  body: In the next example, <tt>Process::detach</tt> is used to reap the child automatically.
- !ruby/struct:SM::Flow::VERB 
  body: "   p1 = fork { sleep 0.1 }\n   p2 = fork { sleep 0.2 }\n   Process.detach(p1)\n   Process.waitpid(p2)\n   sleep 2\n   system(&quot;ps -ho pid,state -p #{p1}&quot;)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>(produces no output)</em>
full_name: Process::detach
is_singleton: true
name: detach
params: |
  Process.detach(pid)   => thread

visibility: public
PK�|[��hee!ri/1.8/system/Process/exit-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Initiates the termination of the Ruby script by raising the <tt>SystemExit</tt> exception. This exception may be caught. The optional parameter is used to return a status code to the invoking environment.
- !ruby/struct:SM::Flow::VERB 
  body: "   begin\n     exit\n     puts &quot;never get here&quot;\n   rescue SystemExit\n     puts &quot;rescued a SystemExit exception&quot;\n   end\n   puts &quot;after begin block&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   rescued a SystemExit exception\n   after begin block\n"
- !ruby/struct:SM::Flow::P 
  body: Just prior to termination, Ruby executes any <tt>at_exit</tt> functions (see Kernel::at_exit) and runs any object finalizers (see ObjectSpace::define_finalizer).
- !ruby/struct:SM::Flow::VERB 
  body: "   at_exit { puts &quot;at_exit function&quot; }\n   ObjectSpace.define_finalizer(&quot;string&quot;,  proc { puts &quot;in finalizer&quot; })\n   exit\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   at_exit function\n   in finalizer\n"
full_name: Process::exit
is_singleton: true
name: exit
params: |
  exit(integer=0)
  Kernel::exit(integer=0)
  Process::exit(integer=0)

visibility: public
PK�|[r���;;$ri/1.8/system/Process/egid%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the effective group ID for this process. Not available on all platforms.
full_name: Process::egid=
is_singleton: true
name: egid=
params: |
  Process.egid = fixnum   => fixnum

visibility: public
PK�|[2�g��!ri/1.8/system/Process/exec-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Replaces the current process by running the given external <em>command</em>. If <tt>exec</tt> is given a single argument, that argument is taken as a line that is subject to shell expansion before being executed. If multiple arguments are given, the second and subsequent arguments are passed as parameters to <em>command</em> with no shell expansion. If the first argument is a two-element array, the first element is the command to be executed, and the second argument is used as the <tt>argv[0]</tt> value, which may show up in process listings. In MSDOS environments, the command is executed in a subshell; otherwise, one of the <tt>exec(2)</tt> system calls is used, so the running command may inherit some of the environment of the original program (including open file descriptors).
- !ruby/struct:SM::Flow::VERB 
  body: "   exec &quot;echo *&quot;       # echoes list of files in current directory\n   # never get here\n\n   exec &quot;echo&quot;, &quot;*&quot;    # echoes an asterisk\n   # never get here\n"
full_name: Process::exec
is_singleton: true
name: exec
params: |
  exec(command [, arg, ...])

visibility: public
PK�|[MێZ�� ri/1.8/system/Process/gid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the (real) group ID for this process.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.gid   #=&gt; 500\n"
full_name: Process::gid
is_singleton: true
name: gid
params: |
  Process.gid           => fixnum
  Process::GID.rid      => fixnum
  Process::Sys.getgid   => fixnum

visibility: public
PK�|[Ni�EE'ri/1.8/system/Process/initgroups-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Initializes the supplemental group access list by reading the system group database and using all groups of which the given user is a member. The group with the specified <em>gid</em> is also added to the list. Returns the resulting <tt>Array</tt> of the gids of all the groups in the supplementary group access list. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.groups   #=&gt; [0, 1, 2, 3, 4, 6, 10, 11, 20, 26, 27]\n   Process.initgroups( &quot;mgranger&quot;, 30 )   #=&gt; [30, 6, 10, 11]\n   Process.groups   #=&gt; [30, 6, 10, 11]\n"
full_name: Process::initgroups
is_singleton: true
name: initgroups
params: |
  Process.initgroups(username, gid)   => array

visibility: public
PK�|[.�q(��#ri/1.8/system/Process/setsid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Establishes this process as a new session and process group leader, with no controlling tty. Returns the session id. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.setsid   #=&gt; 27422\n"
full_name: Process::setsid
is_singleton: true
name: setsid
params: |
  Process.setsid   => fixnum

visibility: public
PK�|[�"�&ri/1.8/system/Process/groups%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the supplemental group access list to the given <tt>Array</tt> of group IDs.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.groups   #=&gt; [0, 1, 2, 3, 4, 6, 10, 11, 20, 26, 27]\n   Process.groups = [27, 6, 10, 11]   #=&gt; [27, 6, 10, 11]\n   Process.groups   #=&gt; [27, 6, 10, 11]\n"
full_name: Process::groups=
is_singleton: true
name: groups=
params: |
  Process.groups= array   => array

visibility: public
PK�|[��88#ri/1.8/system/Process/uid%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the (integer) user ID for this process. Not available on all platforms.
full_name: Process::uid=
is_singleton: true
name: uid=
params: |
  Process.uid= integer   => numeric

visibility: public
PK�|[�'g.nn$ri/1.8/system/Process/setpgid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the process group ID of <em>pid</em> (0 indicates this process) to <em>integer</em>. Not available on all platforms.
full_name: Process::setpgid
is_singleton: true
name: setpgid
params: |
  Process.setpgid(pid, integer)   => 0

visibility: public
PK�|[�h"ri/1.8/system/Process/wait2-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Waits for a child process to exit (see Process::waitpid for exact semantics) and returns an array containing the process id and the exit status (a <tt>Process::Status</tt> object) of that child. Raises a <tt>SystemError</tt> if there are no child processes.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.fork { exit 99 }   #=&gt; 27437\n   pid, status = Process.wait2\n   pid                        #=&gt; 27437\n   status.exitstatus          #=&gt; 99\n"
full_name: Process::wait2
is_singleton: true
name: wait2
params: |
  Process.wait2(pid=-1, flags=0)      => [pid, status]
  Process.waitpid2(pid=-1, flags=0)   => [pid, status]

visibility: public
PK�|[:�Z''(ri/1.8/system/Process/Status/to_i-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the bits in <em>stat</em> as a <tt>Fixnum</tt>. Poking around in these bits is platform dependent.
- !ruby/struct:SM::Flow::VERB 
  body: "   fork { exit 0xab }         #=&gt; 26566\n   Process.wait               #=&gt; 26566\n   sprintf('%04x', $?.to_i)   #=&gt; &quot;ab00&quot;\n"
full_name: Process::Status#to_i
is_singleton: false
name: to_i
params: |
  stat.to_i     => fixnum
  stat.to_int   => fixnum

visibility: public
PK�|[4�����.ri/1.8/system/Process/Status/stopped%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if this process is stopped. This is only returned if the corresponding <tt>wait</tt> call had the <tt>WUNTRACED</tt> flag set.
full_name: Process::Status#stopped?
is_singleton: false
name: stopped?
params: |
  stat.stopped?   => true or false

visibility: public
PK�|[8�A�NN/ri/1.8/system/Process/Status/signaled%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>stat</em> terminated because of an uncaught signal.
full_name: Process::Status#signaled?
is_singleton: false
name: signaled?
params: |
  stat.signaled?   => true or false

visibility: public
PK�|[H���'ri/1.8/system/Process/Status/%26-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Logical AND of the bits in <em>stat</em> with <em>num</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   fork { exit 0x37 }\n   Process.wait\n   sprintf('%04x', $?.to_i)       #=&gt; &quot;3700&quot;\n   sprintf('%04x', $? &amp; 0x1e00)   #=&gt; &quot;1600&quot;\n"
full_name: Process::Status#&
is_singleton: false
name: "&"
params: |
  stat & num   => fixnum

visibility: public
PK�|[ةL1tt-ri/1.8/system/Process/Status/exited%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>stat</em> exited normally (for example using an <tt>exit()</tt> call or finishing the program).
full_name: Process::Status#exited?
is_singleton: false
name: exited?
params: |
  stat.exited?   => true or false

visibility: public
PK�|[֊�ì�'ri/1.8/system/Process/Status/pid-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the process ID that this status object represents.
- !ruby/struct:SM::Flow::VERB 
  body: "   fork { exit }   #=&gt; 26569\n   Process.wait    #=&gt; 26569\n   $?.pid          #=&gt; 26569\n"
full_name: Process::Status#pid
is_singleton: false
name: pid
params: |
  stat.pid   => fixnum

visibility: public
PK�|[>��6��.ri/1.8/system/Process/Status/exitstatus-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the least significant eight bits of the return code of <em>stat</em>. Only available if <tt>exited?</tt> is <tt>true</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   fork { }           #=&gt; 26572\n   Process.wait       #=&gt; 26572\n   $?.exited?         #=&gt; true\n   $?.exitstatus      #=&gt; 0\n\n   fork { exit 99 }   #=&gt; 26573\n   Process.wait       #=&gt; 26573\n   $?.exited?         #=&gt; true\n   $?.exitstatus      #=&gt; 99\n"
full_name: Process::Status#exitstatus
is_singleton: false
name: exitstatus
params: |
  stat.exitstatus   => fixnum or nil

visibility: public
PK�|[~��.ri/1.8/system/Process/Status/cdesc-Status.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>Process::Status</tt> encapsulates the information on the status of a running or terminated system process. The built-in variable <tt>$?</tt> is either <tt>nil</tt> or a <tt>Process::Status</tt> object.
- !ruby/struct:SM::Flow::VERB 
  body: "   fork { exit 99 }   #=&gt; 26557\n   Process.wait       #=&gt; 26557\n   $?.class           #=&gt; Process::Status\n   $?.to_i            #=&gt; 25344\n   $? &gt;&gt; 8            #=&gt; 99\n   $?.stopped?        #=&gt; false\n   $?.exited?         #=&gt; true\n   $?.exitstatus      #=&gt; 99\n"
- !ruby/struct:SM::Flow::P 
  body: Posix systems record information on processes using a 16-bit integer. The lower bits record the process status (stopped, exited, signaled) and the upper bits possibly contain additional information (for example the program's return code in the case of exited processes). Pre Ruby 1.8, these bits were exposed directly to the Ruby program. Ruby now encapsulates these in a <tt>Process::Status</tt> object. To maximize compatibility, however, these objects retain a bit-oriented interface. In the descriptions that follow, when we talk about the integer value of <em>stat</em>, we're referring to this 16 bit value.
constants: []

full_name: Process::Status
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "&"
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: ">>"
- !ruby/object:RI::MethodSummary 
  name: coredump?
- !ruby/object:RI::MethodSummary 
  name: exited?
- !ruby/object:RI::MethodSummary 
  name: exitstatus
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: pid
- !ruby/object:RI::MethodSummary 
  name: signaled?
- !ruby/object:RI::MethodSummary 
  name: stopped?
- !ruby/object:RI::MethodSummary 
  name: stopsig
- !ruby/object:RI::MethodSummary 
  name: success?
- !ruby/object:RI::MethodSummary 
  name: termsig
- !ruby/object:RI::MethodSummary 
  name: to_i
- !ruby/object:RI::MethodSummary 
  name: to_int
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Status
superclass: Object
PK�|[fc�K+ri/1.8/system/Process/Status/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Override the inspection method.
full_name: Process::Status#inspect
is_singleton: false
name: inspect
params: |
  stat.inspect   => string

visibility: public
PK�|[�E��mm/ri/1.8/system/Process/Status/coredump%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>stat</em> generated a coredump when it terminated. Not available on all platforms.
full_name: Process::Status#coredump?
is_singleton: false
name: coredump?
params: |
  stat.coredump?   => true or false

visibility: public
PK�|[
(���*ri/1.8/system/Process/Status/%3e%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Shift the bits in <em>stat</em> right <em>num</em> places.
- !ruby/struct:SM::Flow::VERB 
  body: "   fork { exit 99 }   #=&gt; 26563\n   Process.wait       #=&gt; 26563\n   $?.to_i            #=&gt; 25344\n   $? &gt;&gt; 8            #=&gt; 99\n"
full_name: Process::Status#>>
is_singleton: false
name: ">>"
params: |
  stat >> num   => fixnum

visibility: public
PK�|[�¹>++*ri/1.8/system/Process/Status/to_int-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the bits in <em>stat</em> as a <tt>Fixnum</tt>. Poking around in these bits is platform dependent.
- !ruby/struct:SM::Flow::VERB 
  body: "   fork { exit 0xab }         #=&gt; 26566\n   Process.wait               #=&gt; 26566\n   sprintf('%04x', $?.to_i)   #=&gt; &quot;ab00&quot;\n"
full_name: Process::Status#to_int
is_singleton: false
name: to_int
params: |
  stat.to_i     => fixnum
  stat.to_int   => fixnum

visibility: public
PK�|[�)3֋�.ri/1.8/system/Process/Status/success%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>stat</em> is successful, <tt>false</tt> if not. Returns <tt>nil</tt> if <tt>exited?</tt> is not <tt>true</tt>.
full_name: Process::Status#success?
is_singleton: false
name: success?
params: |
  stat.success?   => true, false or nil

visibility: public
PK�|[���(ri/1.8/system/Process/Status/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <em>stat</em><tt>.to_i.to_s</tt>.
full_name: Process::Status#to_s
is_singleton: false
name: to_s
params: |
  stat.to_s   => string

visibility: public
PK�|[�jXYAA*ri/1.8/system/Process/Status/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the integer value of <em>stat</em> equals <em>other</em>.
full_name: Process::Status#==
is_singleton: false
name: ==
params: |
  stat == other   => true or false

visibility: public
PK�|[~[C���+ri/1.8/system/Process/Status/termsig-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of the signal that caused <em>stat</em> to terminate (or <tt>nil</tt> if self was not terminated by an uncaught signal).
full_name: Process::Status#termsig
is_singleton: false
name: termsig
params: |
  stat.termsig   => fixnum or nil

visibility: public
PK�|[\�D�dd+ri/1.8/system/Process/Status/stopsig-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of the signal that caused <em>stat</em> to stop (or <tt>nil</tt> if self is not stopped).
full_name: Process::Status#stopsig
is_singleton: false
name: stopsig
params: |
  stat.stopsig   => fixnum or nil

visibility: public
PK�|[$�6Ÿ�$ri/1.8/system/Process/waitpid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Waits for a child process to exit, returns its process id, and sets <tt>$?</tt> to a <tt>Process::Status</tt> object containing information on that process. Which child it waits on depends on the value of <em>pid</em>:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "> 0:"
    body: Waits for the child whose process ID equals <em>pid</em>.
  - !ruby/struct:SM::Flow::LI 
    label: "0:"
    body: Waits for any child whose process group ID equals that of the calling process.
  - !ruby/struct:SM::Flow::LI 
    label: "-1:"
    body: Waits for any child process (the default if no <em>pid</em> is given).
  - !ruby/struct:SM::Flow::LI 
    label: "< -1:"
    body: Waits for any child whose process group ID equals the absolute value of <em>pid</em>.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: The <em>flags</em> argument may be a logical or of the flag values <tt>Process::WNOHANG</tt> (do not block if no child available) or <tt>Process::WUNTRACED</tt> (return stopped children that haven't been reported). Not all flags are available on all platforms, but a flag value of zero will work on all platforms.
- !ruby/struct:SM::Flow::P 
  body: Calling this method raises a <tt>SystemError</tt> if there are no child processes. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   include Process\n   fork { exit 99 }                 #=&gt; 27429\n   wait                             #=&gt; 27429\n   $?.exitstatus                    #=&gt; 99\n\n   pid = fork { sleep 3 }           #=&gt; 27440\n   Time.now                         #=&gt; Wed Apr 09 08:57:09 CDT 2003\n   waitpid(pid, Process::WNOHANG)   #=&gt; nil\n   Time.now                         #=&gt; Wed Apr 09 08:57:09 CDT 2003\n   waitpid(pid, 0)                  #=&gt; 27440\n   Time.now                         #=&gt; Wed Apr 09 08:57:12 CDT 2003\n"
full_name: Process::waitpid
is_singleton: true
name: waitpid
params: |
  Process.wait()                     => fixnum
  Process.wait(pid=-1, flags=0)      => fixnum
  Process.waitpid(pid=-1, flags=0)   => fixnum

visibility: public
PK�|[{�z..$ri/1.8/system/Process/euid%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the effective user ID for this process. Not available on all platforms.
full_name: Process::euid=
is_singleton: true
name: euid=
params: |
  Process.euid= integer

visibility: public
PK�|[rm��aa!ri/1.8/system/Process/ppid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the process id of the parent of this process. Always returns 0 on NT. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   puts &quot;I am #{Process.pid}&quot;\n   Process.fork { puts &quot;Dad is #{Process.ppid}&quot; }\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   I am 27417\n   Dad is 27417\n"
full_name: Process::ppid
is_singleton: true
name: ppid
params: |
  Process.ppid   => fixnum

visibility: public
PK�|[�nn$ri/1.8/system/Process/waitall-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Waits for all children, returning an array of <em>pid</em>/<em>status</em> pairs (where <em>status</em> is a <tt>Process::Status</tt> object).
- !ruby/struct:SM::Flow::VERB 
  body: "   fork { sleep 0.2; exit 2 }   #=&gt; 27432\n   fork { sleep 0.1; exit 1 }   #=&gt; 27433\n   fork {            exit 0 }   #=&gt; 27434\n   p Process.waitall\n"
- !ruby/struct:SM::Flow::P 
  body: "<em>produces</em>:"
- !ruby/struct:SM::Flow::VERB 
  body: "   [[27434, #&lt;Process::Status: pid=27434,exited(0)&gt;],\n    [27433, #&lt;Process::Status: pid=27433,exited(1)&gt;],\n    [27432, #&lt;Process::Status: pid=27432,exited(2)&gt;]]\n"
full_name: Process::waitall
is_singleton: true
name: waitall
params: |
  Process.waitall   => [ [pid1,status1], ...]

visibility: public
PK�|[�a�F

%ri/1.8/system/Process/waitpid2-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Waits for a child process to exit (see Process::waitpid for exact semantics) and returns an array containing the process id and the exit status (a <tt>Process::Status</tt> object) of that child. Raises a <tt>SystemError</tt> if there are no child processes.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.fork { exit 99 }   #=&gt; 27437\n   pid, status = Process.wait2\n   pid                        #=&gt; 27437\n   status.exitstatus          #=&gt; 99\n"
full_name: Process::waitpid2
is_singleton: true
name: waitpid2
params: |
  Process.wait2(pid=-1, flags=0)      => [pid, status]
  Process.waitpid2(pid=-1, flags=0)   => [pid, status]

visibility: public
PK�|[Ʒ)ff(ri/1.8/system/Process/cdesc-Process.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: abort
- !ruby/object:RI::MethodSummary 
  name: detach
- !ruby/object:RI::MethodSummary 
  name: egid
- !ruby/object:RI::MethodSummary 
  name: egid=
- !ruby/object:RI::MethodSummary 
  name: euid
- !ruby/object:RI::MethodSummary 
  name: euid=
- !ruby/object:RI::MethodSummary 
  name: exec
- !ruby/object:RI::MethodSummary 
  name: exit
- !ruby/object:RI::MethodSummary 
  name: exit!
- !ruby/object:RI::MethodSummary 
  name: fork
- !ruby/object:RI::MethodSummary 
  name: getpgid
- !ruby/object:RI::MethodSummary 
  name: getpgrp
- !ruby/object:RI::MethodSummary 
  name: getpriority
- !ruby/object:RI::MethodSummary 
  name: getrlimit
- !ruby/object:RI::MethodSummary 
  name: gid
- !ruby/object:RI::MethodSummary 
  name: gid=
- !ruby/object:RI::MethodSummary 
  name: groups
- !ruby/object:RI::MethodSummary 
  name: groups=
- !ruby/object:RI::MethodSummary 
  name: initgroups
- !ruby/object:RI::MethodSummary 
  name: kill
- !ruby/object:RI::MethodSummary 
  name: maxgroups
- !ruby/object:RI::MethodSummary 
  name: maxgroups=
- !ruby/object:RI::MethodSummary 
  name: pid
- !ruby/object:RI::MethodSummary 
  name: ppid
- !ruby/object:RI::MethodSummary 
  name: setpgid
- !ruby/object:RI::MethodSummary 
  name: setpgrp
- !ruby/object:RI::MethodSummary 
  name: setpriority
- !ruby/object:RI::MethodSummary 
  name: setrlimit
- !ruby/object:RI::MethodSummary 
  name: setsid
- !ruby/object:RI::MethodSummary 
  name: times
- !ruby/object:RI::MethodSummary 
  name: uid
- !ruby/object:RI::MethodSummary 
  name: uid=
- !ruby/object:RI::MethodSummary 
  name: wait
- !ruby/object:RI::MethodSummary 
  name: wait2
- !ruby/object:RI::MethodSummary 
  name: waitall
- !ruby/object:RI::MethodSummary 
  name: waitpid
- !ruby/object:RI::MethodSummary 
  name: waitpid2
comment: 
- !ruby/struct:SM::Flow::P 
  body: The <tt>Process</tt> module is a collection of methods used to manipulate processes.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: WNOHANG
  value: INT2FIX(WNOHANG)
- !ruby/object:RI::Constant 
  comment: 
  name: WNOHANG
  value: INT2FIX(0)
- !ruby/object:RI::Constant 
  comment: 
  name: WUNTRACED
  value: INT2FIX(WUNTRACED)
- !ruby/object:RI::Constant 
  comment: 
  name: WUNTRACED
  value: INT2FIX(0)
- !ruby/object:RI::Constant 
  comment: 
  name: PRIO_PROCESS
  value: INT2FIX(PRIO_PROCESS)
- !ruby/object:RI::Constant 
  comment: 
  name: PRIO_PGRP
  value: INT2FIX(PRIO_PGRP)
- !ruby/object:RI::Constant 
  comment: 
  name: PRIO_USER
  value: INT2FIX(PRIO_USER)
- !ruby/object:RI::Constant 
  comment: 
  name: RLIM_INFINITY
  value: inf
- !ruby/object:RI::Constant 
  comment: 
  name: RLIM_SAVED_MAX
  value: v
- !ruby/object:RI::Constant 
  comment: 
  name: RLIM_SAVED_CUR
  value: v
- !ruby/object:RI::Constant 
  comment: 
  name: RLIMIT_CORE
  value: INT2FIX(RLIMIT_CORE)
- !ruby/object:RI::Constant 
  comment: 
  name: RLIMIT_CPU
  value: INT2FIX(RLIMIT_CPU)
- !ruby/object:RI::Constant 
  comment: 
  name: RLIMIT_DATA
  value: INT2FIX(RLIMIT_DATA)
- !ruby/object:RI::Constant 
  comment: 
  name: RLIMIT_FSIZE
  value: INT2FIX(RLIMIT_FSIZE)
- !ruby/object:RI::Constant 
  comment: 
  name: RLIMIT_NOFILE
  value: INT2FIX(RLIMIT_NOFILE)
- !ruby/object:RI::Constant 
  comment: 
  name: RLIMIT_STACK
  value: INT2FIX(RLIMIT_STACK)
- !ruby/object:RI::Constant 
  comment: 
  name: RLIMIT_AS
  value: INT2FIX(RLIMIT_AS)
- !ruby/object:RI::Constant 
  comment: 
  name: RLIMIT_MEMLOCK
  value: INT2FIX(RLIMIT_MEMLOCK)
- !ruby/object:RI::Constant 
  comment: 
  name: RLIMIT_NPROC
  value: INT2FIX(RLIMIT_NPROC)
- !ruby/object:RI::Constant 
  comment: 
  name: RLIMIT_RSS
  value: INT2FIX(RLIMIT_RSS)
- !ruby/object:RI::Constant 
  comment: 
  name: RLIMIT_SBSIZE
  value: INT2FIX(RLIMIT_SBSIZE)
full_name: Process
includes: []

instance_methods: []

name: Process
superclass: 
PK�|[�9�s..!ri/1.8/system/Process/fork-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a subprocess. If a block is specified, that block is run in the subprocess, and the subprocess terminates with a status of zero. Otherwise, the <tt>fork</tt> call returns twice, once in the parent, returning the process ID of the child, and once in the child, returning <em>nil</em>. The child process can exit using <tt>Kernel.exit!</tt> to avoid running any <tt>at_exit</tt> functions. The parent process should use <tt>Process.wait</tt> to collect the termination statuses of its children or use <tt>Process.detach</tt> to register disinterest in their status; otherwise, the operating system may accumulate zombie processes.
- !ruby/struct:SM::Flow::P 
  body: The thread calling fork is the only thread in the created child process. fork doesn't copy other threads.
full_name: Process::fork
is_singleton: true
name: fork
params: |
  Kernel.fork  [{ block }]   => fixnum or nil
  Process.fork [{ block }]   => fixnum or nil

visibility: public
PK�|[�?Kn��$ri/1.8/system/Process/GID/eid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the effective group ID for this process. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.egid   #=&gt; 500\n"
full_name: Process::GID::eid
is_singleton: true
name: eid
params: |
  Process.egid          => fixnum
  Process::GID.eid      => fixnum
  Process::Sys.geteid   => fixnum

visibility: public
PK�|[��ʥ�$ri/1.8/system/Process/GID/rid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the (real) group ID for this process.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.gid   #=&gt; 500\n"
full_name: Process::GID::rid
is_singleton: true
name: rid
params: |
  Process.gid           => fixnum
  Process::GID.rid      => fixnum
  Process::Sys.getgid   => fixnum

visibility: public
PK�|[����::'ri/1.8/system/Process/GID/switch-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Switch the effective and real group IDs of the current process. If a <em>block</em> is given, the group IDs will be switched back after the block is executed. Returns the new effective group ID if called without a block, and the return value of the block if one is given.
full_name: Process::GID::switch
is_singleton: true
name: switch
params: |
  Process::GID.switch              => fixnum
  Process::GID.switch {|| block}   => object

visibility: public
PK�|[G�t���0ri/1.8/system/Process/GID/grant_privilege-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the effective group ID, and if possible, the saved group ID of the process to the given <em>integer</em>. Returns the new effective group ID. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   [Process.gid, Process.egid]          #=&gt; [0, 0]\n   Process::GID.grant_privilege(31)     #=&gt; 33\n   [Process.gid, Process.egid]          #=&gt; [0, 33]\n"
full_name: Process::GID::grant_privilege
is_singleton: true
name: grant_privilege
params: |
  Process::GID.grant_privilege(integer)    => fixnum
  Process::GID.eid = integer               => fixnum

visibility: public
PK�|[�����1ri/1.8/system/Process/GID/change_privilege-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Change the current process's real and effective group ID to that specified by <em>integer</em>. Returns the new group ID. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   [Process.gid, Process.egid]          #=&gt; [0, 0]\n   Process::GID.change_privilege(33)    #=&gt; 33\n   [Process.gid, Process.egid]          #=&gt; [33, 33]\n"
full_name: Process::GID::change_privilege
is_singleton: true
name: change_privilege
params: |
  Process::GID.change_privilege(integer)   => fixnum

visibility: public
PK�|[@٦�%%,ri/1.8/system/Process/GID/re_exchange-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Exchange real and effective group IDs and return the new effective group ID. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   [Process.gid, Process.egid]   #=&gt; [0, 33]\n   Process::GID.re_exchange      #=&gt; 0\n   [Process.gid, Process.egid]   #=&gt; [33, 0]\n"
full_name: Process::GID::re_exchange
is_singleton: true
name: re_exchange
params: |
  Process::GID.re_exchange   => fixnum

visibility: public
PK�|[4�==(ri/1.8/system/Process/GID/cdesc-GID.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: change_privilege
- !ruby/object:RI::MethodSummary 
  name: eid
- !ruby/object:RI::MethodSummary 
  name: grant_privilege
- !ruby/object:RI::MethodSummary 
  name: re_exchange
- !ruby/object:RI::MethodSummary 
  name: re_exchangeable?
- !ruby/object:RI::MethodSummary 
  name: rid
- !ruby/object:RI::MethodSummary 
  name: sid_available?
- !ruby/object:RI::MethodSummary 
  name: switch
comment: 
- !ruby/struct:SM::Flow::P 
  body: The <tt>Process::GID</tt> module contains a collection of module functions which can be used to portably get, set, and switch the current process's real, effective, and saved group IDs.
constants: []

full_name: Process::GID
includes: []

instance_methods: []

name: GID
superclass: 
PK�|[��aa1ri/1.8/system/Process/GID/sid_available%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the current platform has saved group ID functionality.
full_name: Process::GID::sid_available?
is_singleton: true
name: sid_available?
params: |
  Process::GID.sid_available?   => true or false

visibility: public
PK�|[�%d��3ri/1.8/system/Process/GID/re_exchangeable%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the real and effective group IDs of a process may be exchanged on the current platform.
full_name: Process::GID::re_exchangeable?
is_singleton: true
name: re_exchangeable?
params: |
  Process::GID.re_exchangeable?   => true or false

visibility: public
PK�|[��a��� ri/1.8/system/Process/uid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the (real) user ID of this process.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.uid   #=&gt; 501\n"
full_name: Process::uid
is_singleton: true
name: uid
params: |
  Process.uid           => fixnum
  Process::UID.rid      => fixnum
  Process::Sys.getuid   => fixnum

visibility: public
PK�|[�<��\\(ri/1.8/system/Process/Sys/setruid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the real user ID of the calling process to <em>integer</em>. Not available on all platforms.
full_name: Process::Sys::setruid
is_singleton: true
name: setruid
params: |
  Process::Sys.setruid(integer)   => nil

visibility: public
PK�|[�eb��(ri/1.8/system/Process/Sys/geteuid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the effective user ID for this process.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.euid   #=&gt; 501\n"
full_name: Process::Sys::geteuid
is_singleton: true
name: geteuid
params: |
  Process.euid           => fixnum
  Process::UID.eid       => fixnum
  Process::Sys.geteuid   => fixnum

visibility: public
PK�|[��9��*ri/1.8/system/Process/Sys/setresuid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the (integer) real, effective, and saved user IDs of the current process to <em>rid</em>, <em>eid</em>, and <em>sid</em> respectively. A value of <tt>-1</tt> for any value means to leave that ID unchanged. Not available on all platforms.
full_name: Process::Sys::setresuid
is_singleton: true
name: setresuid
params: |
  Process::Sys.setresuid(rid, eid, sid)   => nil

visibility: public
PK�|["ՄCTT'ri/1.8/system/Process/Sys/setuid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the user ID of the current process to <em>integer</em>. Not available on all platforms.
full_name: Process::Sys::setuid
is_singleton: true
name: setuid
params: |
  Process::Sys.setuid(integer)   => nil

visibility: public
PK�|[5ȓUU'ri/1.8/system/Process/Sys/setgid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the group ID of the current process to <em>integer</em>. Not available on all platforms.
full_name: Process::Sys::setgid
is_singleton: true
name: setgid
params: |
  Process::Sys.setgid(integer)   => nil

visibility: public
PK�|[e%}�aa(ri/1.8/system/Process/Sys/seteuid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the effective user ID of the calling process to <em>integer</em>. Not available on all platforms.
full_name: Process::Sys::seteuid
is_singleton: true
name: seteuid
params: |
  Process::Sys.seteuid(integer)   => nil

visibility: public
PK�|[=!?���'ri/1.8/system/Process/Sys/getgid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the (real) group ID for this process.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.gid   #=&gt; 500\n"
full_name: Process::Sys::getgid
is_singleton: true
name: getgid
params: |
  Process.gid           => fixnum
  Process::GID.rid      => fixnum
  Process::Sys.getgid   => fixnum

visibility: public
PK�|[��ܩ�'ri/1.8/system/Process/Sys/getuid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the (real) user ID of this process.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.uid   #=&gt; 501\n"
full_name: Process::Sys::getuid
is_singleton: true
name: getuid
params: |
  Process.uid           => fixnum
  Process::UID.rid      => fixnum
  Process::Sys.getuid   => fixnum

visibility: public
PK�|[i�����(ri/1.8/system/Process/Sys/getegid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the effective group ID for this process. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.egid   #=&gt; 500\n"
full_name: Process::Sys::getegid
is_singleton: true
name: getegid
params: |
  Process.egid          => fixnum
  Process::GID.eid      => fixnum
  Process::Sys.geteid   => fixnum

visibility: public
PK�|[�����)ri/1.8/system/Process/Sys/setregid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the (integer) real and/or effective group IDs of the current process to <em>rid</em> and <em>eid</em>, respectively. A value of <tt>-1</tt> for either means to leave that ID unchanged. Not available on all platforms.
full_name: Process::Sys::setregid
is_singleton: true
name: setregid
params: |
  Process::Sys.setregid(rid, eid)   => nil

visibility: public
PK�|[�@m�  *ri/1.8/system/Process/Sys/issetugid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the process was created as a result of an execve(2) system call which had either of the setuid or setgid bits set (and extra privileges were given as a result) or if it has changed any of its real, effective or saved user or group IDs since it began execution.
full_name: Process::Sys::issetugid
is_singleton: true
name: issetugid
params: |
  Process::Sys.issetugid   => true or false

visibility: public
PK�|[��X��*ri/1.8/system/Process/Sys/setresgid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the (integer) real, effective, and saved user IDs of the current process to <em>rid</em>, <em>eid</em>, and <em>sid</em> respectively. A value of <tt>-1</tt> for any value means to leave that ID unchanged. Not available on all platforms.
full_name: Process::Sys::setresgid
is_singleton: true
name: setresgid
params: |
  Process::Sys.setresgid(rid, eid, sid)   => nil

visibility: public
PK�|[�*J���(ri/1.8/system/Process/Sys/cdesc-Sys.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: getegid
- !ruby/object:RI::MethodSummary 
  name: geteuid
- !ruby/object:RI::MethodSummary 
  name: getgid
- !ruby/object:RI::MethodSummary 
  name: getuid
- !ruby/object:RI::MethodSummary 
  name: issetugid
- !ruby/object:RI::MethodSummary 
  name: setegid
- !ruby/object:RI::MethodSummary 
  name: seteuid
- !ruby/object:RI::MethodSummary 
  name: setgid
- !ruby/object:RI::MethodSummary 
  name: setregid
- !ruby/object:RI::MethodSummary 
  name: setresgid
- !ruby/object:RI::MethodSummary 
  name: setresuid
- !ruby/object:RI::MethodSummary 
  name: setreuid
- !ruby/object:RI::MethodSummary 
  name: setrgid
- !ruby/object:RI::MethodSummary 
  name: setruid
- !ruby/object:RI::MethodSummary 
  name: setuid
comment: 
- !ruby/struct:SM::Flow::P 
  body: The <tt>Process::Sys</tt> module contains UID and GID functions which provide direct bindings to the system calls of the same names instead of the more-portable versions of the same functionality found in the <tt>Process</tt>, <tt>Process::UID</tt>, and <tt>Process::GID</tt> modules.
constants: []

full_name: Process::Sys
includes: []

instance_methods: []

name: Sys
superclass: 
PK�|[m���]](ri/1.8/system/Process/Sys/setrgid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the real group ID of the calling process to <em>integer</em>. Not available on all platforms.
full_name: Process::Sys::setrgid
is_singleton: true
name: setrgid
params: |
  Process::Sys.setrgid(integer)   => nil

visibility: public
PK�|[uC
�bb(ri/1.8/system/Process/Sys/setegid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the effective group ID of the calling process to <em>integer</em>. Not available on all platforms.
full_name: Process::Sys::setegid
is_singleton: true
name: setegid
params: |
  Process::Sys.setegid(integer)   => nil

visibility: public
PK�|[
���)ri/1.8/system/Process/Sys/setreuid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the (integer) real and/or effective user IDs of the current process to <em>rid</em> and <em>eid</em>, respectively. A value of <tt>-1</tt> for either means to leave that ID unchanged. Not available on all platforms.
full_name: Process::Sys::setreuid
is_singleton: true
name: setreuid
params: |
  Process::Sys.setreuid(rid, eid)   => nil

visibility: public
PK�|[`a�.pp ri/1.8/system/Process/pid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the process id of this process. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.pid   #=&gt; 27415\n"
full_name: Process::pid
is_singleton: true
name: pid
params: |
  Process.pid   => fixnum

visibility: public
PK�|[�����#ri/1.8/system/Process/groups-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get an <tt>Array</tt> of the gids of groups in the supplemental group access list for this process.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.groups   #=&gt; [27, 6, 10, 11]\n"
full_name: Process::groups
is_singleton: true
name: groups
params: |
  Process.groups   => array

visibility: public
PK�|[fp�dd&ri/1.8/system/Process/getrlimit-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Gets the resource limit of the process. <em>cur_limit</em> means current (soft) limit and <em>max_limit</em> means maximum (hard) limit.
- !ruby/struct:SM::Flow::P 
  body: "<em>resource</em> indicates the kind of resource to limit: such as <tt>Process::RLIMIT_CORE</tt>, <tt>Process::RLIMIT_CPU</tt>, etc. See Process.setrlimit for details."
- !ruby/struct:SM::Flow::P 
  body: <em>cur_limit</em> and <em>max_limit</em> may be <tt>Process::RLIM_INFINITY</tt>, <tt>Process::RLIM_SAVED_MAX</tt> or <tt>Process::RLIM_SAVED_CUR</tt>. See Process.setrlimit and the system getrlimit(2) manual for details.
full_name: Process::getrlimit
is_singleton: true
name: getrlimit
params: |
  Process.getrlimit(resource)   => [cur_limit, max_limit]

visibility: public
PK�|[��<<(ri/1.8/system/Process/UID/cdesc-UID.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: change_privilege
- !ruby/object:RI::MethodSummary 
  name: eid
- !ruby/object:RI::MethodSummary 
  name: grant_privilege
- !ruby/object:RI::MethodSummary 
  name: re_exchange
- !ruby/object:RI::MethodSummary 
  name: re_exchangeable?
- !ruby/object:RI::MethodSummary 
  name: rid
- !ruby/object:RI::MethodSummary 
  name: sid_available?
- !ruby/object:RI::MethodSummary 
  name: switch
comment: 
- !ruby/struct:SM::Flow::P 
  body: The <tt>Process::UID</tt> module contains a collection of module functions which can be used to portably get, set, and switch the current process's real, effective, and saved user IDs.
constants: []

full_name: Process::UID
includes: []

instance_methods: []

name: UID
superclass: 
PK�|['+�g��$ri/1.8/system/Process/UID/eid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the effective user ID for this process.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.euid   #=&gt; 501\n"
full_name: Process::UID::eid
is_singleton: true
name: eid
params: |
  Process.euid           => fixnum
  Process::UID.eid       => fixnum
  Process::Sys.geteuid   => fixnum

visibility: public
PK�|[�����$ri/1.8/system/Process/UID/rid-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the (real) user ID of this process.
- !ruby/struct:SM::Flow::VERB 
  body: "   Process.uid   #=&gt; 501\n"
full_name: Process::UID::rid
is_singleton: true
name: rid
params: |
  Process.uid           => fixnum
  Process::UID.rid      => fixnum
  Process::Sys.getuid   => fixnum

visibility: public
PK�|[xP(77'ri/1.8/system/Process/UID/switch-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Switch the effective and real user IDs of the current process. If a <em>block</em> is given, the user IDs will be switched back after the block is executed. Returns the new effective user ID if called without a block, and the return value of the block if one is given.
full_name: Process::UID::switch
is_singleton: true
name: switch
params: |
  Process::UID.switch              => fixnum
  Process::UID.switch {|| block}   => object

visibility: public
PK�|[|��B��0ri/1.8/system/Process/UID/grant_privilege-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the effective user ID, and if possible, the saved user ID of the process to the given <em>integer</em>. Returns the new effective user ID. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   [Process.uid, Process.euid]          #=&gt; [0, 0]\n   Process::UID.grant_privilege(31)     #=&gt; 31\n   [Process.uid, Process.euid]          #=&gt; [0, 31]\n"
full_name: Process::UID::grant_privilege
is_singleton: true
name: grant_privilege
params: |
  Process::UID.grant_privilege(integer)   => fixnum
  Process::UID.eid= integer               => fixnum

visibility: public
PK�|[��{c~~1ri/1.8/system/Process/UID/change_privilege-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Change the current process's real and effective user ID to that specified by <em>integer</em>. Returns the new user ID. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   [Process.uid, Process.euid]          #=&gt; [0, 0]\n   Process::UID.change_privilege(31)    #=&gt; 31\n   [Process.uid, Process.euid]          #=&gt; [31, 31]\n"
full_name: Process::UID::change_privilege
is_singleton: true
name: change_privilege
params: |
  Process::UID.change_privilege(integer)   => fixnum

visibility: public
PK�|[AA�l##,ri/1.8/system/Process/UID/re_exchange-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Exchange real and effective user IDs and return the new effective user ID. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   [Process.uid, Process.euid]   #=&gt; [0, 31]\n   Process::UID.re_exchange      #=&gt; 0\n   [Process.uid, Process.euid]   #=&gt; [31, 0]\n"
full_name: Process::UID::re_exchange
is_singleton: true
name: re_exchange
params: |
  Process::UID.re_exchange   => fixnum

visibility: public
PK�|[��ж``1ri/1.8/system/Process/UID/sid_available%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the current platform has saved user ID functionality.
full_name: Process::UID::sid_available?
is_singleton: true
name: sid_available?
params: |
  Process::UID.sid_available?   => true or false

visibility: public
PK�|[�D��3ri/1.8/system/Process/UID/re_exchangeable%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the real and effective user IDs of a process may be exchanged on the current platform.
full_name: Process::UID::re_exchangeable?
is_singleton: true
name: re_exchangeable?
params: |
  Process::UID.re_exchangeable?   => true or false

visibility: public
PK�|[Db�$$6ri/1.8/system/CSV/StringReader/cdesc-StringReader.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: CSV::StringReader
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: get_row
name: StringReader
superclass: Reader
PK�|[
n2���-ri/1.8/system/CSV/StringReader/get_row-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::StringReader#get_row
is_singleton: false
name: get_row
params: (row)
visibility: private
PK�|[�����)ri/1.8/system/CSV/StringReader/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::StringReader::new
is_singleton: true
name: new
params: (string, fs = ',', rs = nil)
visibility: public
PK�|[�(����#ri/1.8/system/CSV/parse_body-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::parse_body
is_singleton: true
name: parse_body
params: (src, idx, fs, rs)
visibility: private
PK�|[���"ri/1.8/system/CSV/parse_row-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parse a line from string. Consider using CSV.parse_line instead. To parse lines in CSV string, see EXAMPLE below.
- !ruby/struct:SM::Flow::P 
  body: EXAMPLE
- !ruby/struct:SM::Flow::VERB 
  body: "  src = &quot;a,b\\r\\nc,d\\r\\ne,f&quot;\n  idx = 0\n  begin\n    parsed = []\n    parsed_cells, idx = CSV.parse_row(src, idx, parsed)\n    puts &quot;Parsed #{ parsed_cells } cells.&quot;\n    p parsed\n  end while parsed_cells &gt; 0\n"
- !ruby/struct:SM::Flow::P 
  body: ARGS
- !ruby/struct:SM::Flow::VERB 
  body: "  src: a CSV data to be parsed.  Must respond '[](idx)'.\n    src[](idx) must return a char. (Not a string such as 'a', but 97).\n    src[](idx_out_of_bounds) must return nil.  A String satisfies this\n    requirement.\n  idx: index of parsing location of 'src'.  0 origin.\n  out_dev: buffer for parsed cells.  Must respond '&lt;&lt;(aString)'.\n  col_sep: Column separator.  ?, by default.  If you want to separate\n    fields with semicolon, give ?; here.\n  row_sep: Row separator.  nil by default.  nil means &quot;\\r\\n or \\n&quot;.  If you\n    want to separate records with \\r, give ?\\r here.\n"
- !ruby/struct:SM::Flow::P 
  body: RETURNS
- !ruby/struct:SM::Flow::VERB 
  body: "  parsed_cells: num of parsed cells.\n  idx: index of next parsing location of 'src'.\n"
full_name: CSV::parse_row
is_singleton: true
name: parse_row
params: (src, idx, out_dev, fs = nil, rs = nil)
visibility: public
PK�|[o����$ri/1.8/system/CSV/open_writer-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (writer)
comment: 
full_name: CSV::open_writer
is_singleton: true
name: open_writer
params: (path, mode, fs, rs, &block) {|writer| ...}
visibility: private
PK�|[�]��"ri/1.8/system/CSV/Cell/data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::Cell#data
is_singleton: false
name: data
params: ()
visibility: public
PK�|[>h�@@&ri/1.8/system/CSV/Cell/cdesc-Cell.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: deprecated
constants: []

full_name: CSV::Cell
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: data
name: Cell
superclass: String
PK�|[*��ƽ�!ri/1.8/system/CSV/Cell/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::Cell::new
is_singleton: true
name: new
params: (data = "", is_null = false)
visibility: public
PK�|[k(�#((&ri/1.8/system/CSV/generate_line-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a line from cells. each cell is stringified by to_s.
full_name: CSV::generate_line
is_singleton: true
name: generate_line
params: (row, fs = nil, rs = nil)
visibility: public
PK�|[��
�� ri/1.8/system/CSV/foreach-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::foreach
is_singleton: true
name: foreach
params: (path, rs = nil, &block)
visibility: public
PK�|[3����+ri/1.8/system/CSV/generate_separator-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::generate_separator
is_singleton: true
name: generate_separator
params: (type, out_dev, fs, rs)
visibility: private
PK�|[$��8��Bri/1.8/system/CSV/IllegalFormatError/cdesc-IllegalFormatError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: CSV::IllegalFormatError
includes: []

instance_methods: []

name: IllegalFormatError
superclass: RuntimeError
PK�|[Aя�MMri/1.8/system/CSV/parse-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (row)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parse lines from given string or stream. Return rows as an Array of Arrays.
full_name: CSV::parse
is_singleton: true
name: parse
params: (str_or_readable, fs = nil, rs = nil, &block) {|row| ...}
visibility: public
PK�|[��r�� ri/1.8/system/CSV/cdesc-CSV.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: foreach
- !ruby/object:RI::MethodSummary 
  name: generate
- !ruby/object:RI::MethodSummary 
  name: generate_body
- !ruby/object:RI::MethodSummary 
  name: generate_line
- !ruby/object:RI::MethodSummary 
  name: generate_row
- !ruby/object:RI::MethodSummary 
  name: generate_separator
- !ruby/object:RI::MethodSummary 
  name: open
- !ruby/object:RI::MethodSummary 
  name: open_reader
- !ruby/object:RI::MethodSummary 
  name: open_writer
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: parse_body
- !ruby/object:RI::MethodSummary 
  name: parse_line
- !ruby/object:RI::MethodSummary 
  name: parse_row
- !ruby/object:RI::MethodSummary 
  name: read
- !ruby/object:RI::MethodSummary 
  name: readlines
comment: 
- !ruby/struct:SM::Flow::P 
  body: This program is copyrighted free software by NAKAMURA, Hiroshi. You can redistribute it and/or modify it under the same terms of Ruby's license; either the dual license version in 2003, or any later version.
constants: []

full_name: CSV
includes: []

instance_methods: []

name: CSV
superclass: Object
PK�|[�ʦ���$ri/1.8/system/CSV/Row/cdesc-Row.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: deprecated
constants: []

full_name: CSV::Row
includes: []

instance_methods: []

name: Row
superclass: Array
PK�|[R�4���.ri/1.8/system/CSV/BasicWriter/terminate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::BasicWriter#terminate
is_singleton: false
name: terminate
params: ()
visibility: private
PK�|[�$��aa4ri/1.8/system/CSV/BasicWriter/cdesc-BasicWriter.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: CSV::BasicWriter
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: close_on_terminate
- !ruby/object:RI::MethodSummary 
  name: terminate
name: BasicWriter
superclass: Writer
PK�|["Zr�MM7ri/1.8/system/CSV/BasicWriter/close_on_terminate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Tell this writer to close the IO when terminated (Triggered by invoking CSV::BasicWriter#close).
full_name: CSV::BasicWriter#close_on_terminate
is_singleton: false
name: close_on_terminate
params: ()
visibility: public
PK�|[���'��(ri/1.8/system/CSV/BasicWriter/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::BasicWriter::new
is_singleton: true
name: new
params: (str_or_writable, fs = ',', rs = nil)
visibility: public
PK�|[Y�w��$ri/1.8/system/CSV/open_reader-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (row)
comment: 
full_name: CSV::open_reader
is_singleton: true
name: open_reader
params: (path, mode, fs, rs, &block) {|row| ...}
visibility: private
PK�|[��ʿ�ri/1.8/system/CSV/read-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::read
is_singleton: true
name: read
params: (path, length = nil, offset = nil)
visibility: public
PK�|[V:�+��"ri/1.8/system/CSV/readlines-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::readlines
is_singleton: true
name: readlines
params: (path, rs = nil)
visibility: public
PK�|[�O��(ri/1.8/system/CSV/IOBuf/terminate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::IOBuf#terminate
is_singleton: false
name: terminate
params: ()
visibility: private
PK�|[�X��#ri/1.8/system/CSV/IOBuf/read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::IOBuf#read
is_singleton: false
name: read
params: (size)
visibility: private
PK�|[�M����(ri/1.8/system/CSV/IOBuf/cdesc-IOBuf.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Buffered IO.
- !ruby/struct:SM::Flow::P 
  body: EXAMPLE
- !ruby/struct:SM::Flow::VERB 
  body: "  # File 'bigdata' could be a giga-byte size one!\n  buf = CSV::IOBuf.new(File.open('bigdata', 'rb'))\n  CSV::Reader.new(buf).each do |row|\n    p row\n    break if row[0].data == 'admin'\n  end\n"
constants: []

full_name: CSV::IOBuf
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: read
- !ruby/object:RI::MethodSummary 
  name: terminate
name: IOBuf
superclass: StreamBuf
PK�|[�񶐥�"ri/1.8/system/CSV/IOBuf/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::IOBuf::new
is_singleton: true
name: new
params: (s)
visibility: public
PK�|[��L��$ri/1.8/system/CSV/IOBuf/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::IOBuf#close
is_singleton: false
name: close
params: ()
visibility: public
PK�|[b۴R��)ri/1.8/system/CSV/Writer/terminate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::Writer#terminate
is_singleton: false
name: terminate
params: ()
visibility: private
PK�|[ieB-��*ri/1.8/system/CSV/Writer/cdesc-Writer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: create
- !ruby/object:RI::MethodSummary 
  name: generate
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: CSV formatted string/stream writer.
- !ruby/struct:SM::Flow::P 
  body: EXAMPLE
- !ruby/struct:SM::Flow::VERB 
  body: "  Write rows to 'csvout' file.\n\n  outfile = File.open('csvout', 'wb')\n  CSV::Writer.generate(outfile) do |csv|\n    csv &lt;&lt; ['c1', nil, '', '&quot;', &quot;\\r\\n&quot;, 'c2']\n    ...\n  end\n\n  outfile.close\n"
constants: []

full_name: CSV::Writer
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: add_row
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: terminate
name: Writer
superclass: Object
PK�|[�j�=��#ri/1.8/system/CSV/Writer/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::Writer::new
is_singleton: true
name: new
params: (dev)
visibility: public
PK�|[��j""&ri/1.8/system/CSV/Writer/create-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: str_or_writable must handle '&lt;&lt;(string)'.
full_name: CSV::Writer::create
is_singleton: true
name: create
params: (str_or_writable, fs = ',', rs = nil)
visibility: public
PK�|[�`Č;;&ri/1.8/system/CSV/Writer/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: add_row
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: dump CSV stream to the device. argument must be an Array of String.
full_name: CSV::Writer#<<
is_singleton: false
name: "<<"
params: (row)
visibility: public
PK�|[���'ri/1.8/system/CSV/Writer/add_row-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #&lt;&lt;"
full_name: CSV::Writer#add_row
is_singleton: false
name: add_row
params: (row)
visibility: public
PK�|[���uu(ri/1.8/system/CSV/Writer/generate-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (writer)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Given block is called with the writer instance. str_or_writable must handle '&lt;&lt;(string)'.
full_name: CSV::Writer::generate
is_singleton: true
name: generate
params: (str_or_writable, fs = ',', rs = nil, &block) {|writer| ...}
visibility: public
PK�|[�ֳ��%ri/1.8/system/CSV/Writer/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::Writer#close
is_singleton: false
name: close
params: ()
visibility: public
PK�|[ҢYX��)ri/1.8/system/CSV/Reader/terminate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::Reader#terminate
is_singleton: false
name: terminate
params: ()
visibility: private
PK�|[����$ri/1.8/system/CSV/Reader/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (row)
comment: 
full_name: CSV::Reader#each
is_singleton: false
name: each
params: () {|row| ...}
visibility: public
PK�|[>û���%ri/1.8/system/CSV/Reader/parse-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (row)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parse CSV data and get lines. Given block is called for each parsed row. Block value is always nil. Rows are not cached for performance reason.
full_name: CSV::Reader::parse
is_singleton: true
name: parse
params: (str_or_readable, fs = ',', rs = nil, &block) {|row| ...}
visibility: public
PK�|[�����*ri/1.8/system/CSV/Reader/cdesc-Reader.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: create
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: parse
comment: 
- !ruby/struct:SM::Flow::P 
  body: CSV formatted string/stream reader.
- !ruby/struct:SM::Flow::P 
  body: EXAMPLE
- !ruby/struct:SM::Flow::VERB 
  body: "  read CSV lines untill the first column is 'stop'.\n\n  CSV::Reader.parse(File.open('bigdata', 'rb')) do |row|\n    p row\n    break if !row[0].is_null &amp;&amp; row[0].data == 'stop'\n  end\n"
constants: []

full_name: CSV::Reader
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: get_row
- !ruby/object:RI::MethodSummary 
  name: shift
- !ruby/object:RI::MethodSummary 
  name: terminate
name: Reader
superclass: Object
PK�|[�J�3��'ri/1.8/system/CSV/Reader/get_row-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::Reader#get_row
is_singleton: false
name: get_row
params: (row)
visibility: private
PK�|[S7;���#ri/1.8/system/CSV/Reader/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::Reader::new
is_singleton: true
name: new
params: (dev)
visibility: public
PK�|[Z�yF&ri/1.8/system/CSV/Reader/create-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns reader instance.
full_name: CSV::Reader::create
is_singleton: true
name: create
params: (str_or_readable, fs = ',', rs = nil)
visibility: public
PK�|[���M��%ri/1.8/system/CSV/Reader/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::Reader#close
is_singleton: false
name: close
params: ()
visibility: public
PK�|[���i��%ri/1.8/system/CSV/Reader/shift-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::Reader#shift
is_singleton: false
name: shift
params: ()
visibility: public
PK�|[�1���!ri/1.8/system/CSV/generate-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::generate
is_singleton: true
name: generate
params: (path, fs = nil, rs = nil, &block)
visibility: public
PK�|[�\>/��+ri/1.8/system/CSV/IOReader/terminate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::IOReader#terminate
is_singleton: false
name: terminate
params: ()
visibility: private
PK�|[��rGG4ri/1.8/system/CSV/IOReader/close_on_terminate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Tell this reader to close the IO when terminated (Triggered by invoking CSV::IOReader#close).
full_name: CSV::IOReader#close_on_terminate
is_singleton: false
name: close_on_terminate
params: ()
visibility: public
PK�|[��S��)ri/1.8/system/CSV/IOReader/get_row-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::IOReader#get_row
is_singleton: false
name: get_row
params: (row)
visibility: private
PK�|[�&���%ri/1.8/system/CSV/IOReader/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::IOReader::new
is_singleton: true
name: new
params: (io, fs = ',', rs = nil)
visibility: public
PK�|[����.ri/1.8/system/CSV/IOReader/cdesc-IOReader.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: CSV::IOReader
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: close_on_terminate
- !ruby/object:RI::MethodSummary 
  name: get_row
- !ruby/object:RI::MethodSummary 
  name: terminate
name: IOReader
superclass: Reader
PK�|[�TzQQ)ri/1.8/system/CSV/StreamBuf/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: get
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "get a char or a partial string from the stream. idx: index of a string to specify a start point of a string to get. unlike String instance, idx &lt; 0 returns nil. n: size of a string to get. returns char at idx if n == nil. returns a partial string, from idx to (idx + n) if n != nil. at EOF, the string size could not equal to arg n."
full_name: CSV::StreamBuf#[]
is_singleton: false
name: "[]"
params: (idx, n = nil)
visibility: public
PK�|[�>G���,ri/1.8/system/CSV/StreamBuf/terminate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::StreamBuf#terminate
is_singleton: false
name: terminate
params: ()
visibility: protected
PK�|[F����,ri/1.8/system/CSV/StreamBuf/is_eos%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::StreamBuf#is_eos?
is_singleton: false
name: is_eos?
params: ()
visibility: public
PK�|[SxI

0ri/1.8/system/CSV/StreamBuf/cdesc-StreamBuf.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Buffered stream.
- !ruby/struct:SM::Flow::P 
  body: EXAMPLE 1 -- an IO.
- !ruby/struct:SM::Flow::VERB 
  body: "  class MyBuf &lt; StreamBuf\n    # Do initialize myself before a super class.  Super class might call my\n    # method 'read'. (Could be awful for C++ user. :-)\n    def initialize(s)\n      @s = s\n      super()\n    end\n\n    # define my own 'read' method.\n    # CAUTION: Returning nil means EnfOfStream.\n    def read(size)\n      @s.read(size)\n    end\n\n    # release buffers. in Ruby which has GC, you do not have to call this...\n    def terminate\n      @s = nil\n      super()\n    end\n  end\n\n  buf = MyBuf.new(STDIN)\n  my_str = ''\n  p buf[0, 0]               # =&gt; '' (null string)\n  p buf[0]                  # =&gt; 97 (char code of 'a')\n  p buf[0, 1]               # =&gt; 'a'\n  my_str = buf[0, 5]\n  p my_str                  # =&gt; 'abcde' (5 chars)\n  p buf[0, 6]               # =&gt; &quot;abcde\\n&quot; (6 chars)\n  p buf[0, 7]               # =&gt; &quot;abcde\\n&quot; (6 chars)\n  p buf.drop(3)             # =&gt; 3 (dropped chars)\n  p buf.get(0, 2)           # =&gt; 'de' (2 chars)\n  p buf.is_eos?             # =&gt; false (is not EOS here)\n  p buf.drop(5)             # =&gt; 3 (dropped chars)\n  p buf.is_eos?             # =&gt; true (is EOS here)\n  p buf[0]                  # =&gt; nil (is EOS here)\n"
- !ruby/struct:SM::Flow::P 
  body: EXAMPLE 2 -- String.
- !ruby/struct:SM::Flow::VERB 
  body: "  This is a conceptual example.  No pros with this.\n\n  class StrBuf &lt; StreamBuf\n    def initialize(s)\n      @str = s\n      @idx = 0\n      super()\n    end\n\n    def read(size)\n      str = @str[@idx, size]\n      @idx += str.size\n      str\n    end\n  end\n"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: BufSize
  value: 1024 * 8
full_name: CSV::StreamBuf
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: add_buf
- !ruby/object:RI::MethodSummary 
  name: buf_size
- !ruby/object:RI::MethodSummary 
  name: drop
- !ruby/object:RI::MethodSummary 
  name: get
- !ruby/object:RI::MethodSummary 
  name: idx_is_eos?
- !ruby/object:RI::MethodSummary 
  name: is_eos?
- !ruby/object:RI::MethodSummary 
  name: read
- !ruby/object:RI::MethodSummary 
  name: rel_buf
- !ruby/object:RI::MethodSummary 
  name: terminate
name: StreamBuf
superclass: Object
PK�|[��ڋ��'ri/1.8/system/CSV/StreamBuf/read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "protected method 'read' must be defined in derived classes. CAUTION: Returning a string which size is not equal to 'size' means EnfOfStream. When it is not at EOS, you must block the callee, try to read and return the sized string."
full_name: CSV::StreamBuf#read
is_singleton: false
name: read
params: (size)
visibility: protected
PK�|[!V����*ri/1.8/system/CSV/StreamBuf/add_buf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::StreamBuf#add_buf
is_singleton: false
name: add_buf
params: ()
visibility: private
PK�|[q!�ΐ�'ri/1.8/system/CSV/StreamBuf/drop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: drop a string from the stream. returns dropped size. at EOF, dropped size might not equals to arg n. Once you drop the head of the stream, access to the dropped part via [] or get returns nil.
full_name: CSV::StreamBuf#drop
is_singleton: false
name: drop
params: (n)
visibility: public
PK�|[%K
��&ri/1.8/system/CSV/StreamBuf/get-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #[]"
full_name: CSV::StreamBuf#get
is_singleton: false
name: get
params: (idx, n = nil)
visibility: public
PK�|[J{�[NN&ri/1.8/system/CSV/StreamBuf/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "WARN: Do not instantiate this class directly. Define your own class which derives this class and define 'read' instance method."
full_name: CSV::StreamBuf::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[?����0ri/1.8/system/CSV/StreamBuf/idx_is_eos%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::StreamBuf#idx_is_eos?
is_singleton: false
name: idx_is_eos?
params: (idx)
visibility: private
PK�|[;�v��*ri/1.8/system/CSV/StreamBuf/rel_buf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::StreamBuf#rel_buf
is_singleton: false
name: rel_buf
params: ()
visibility: private
PK�|[|Q����+ri/1.8/system/CSV/StreamBuf/buf_size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::StreamBuf#buf_size
is_singleton: false
name: buf_size
params: (idx)
visibility: private
PK�|[��y���&ri/1.8/system/CSV/generate_body-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: CSV::generate_body
is_singleton: true
name: generate_body
params: (cell, out_dev, fs, rs)
visibility: private
PK�|[���y��%ri/1.8/system/CSV/generate_row-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a line from cells data to string. Consider using CSV.generate_line instead. To generate multi-row CSV string, see EXAMPLE below.
- !ruby/struct:SM::Flow::P 
  body: EXAMPLE
- !ruby/struct:SM::Flow::VERB 
  body: "  row1 = ['a', 'b']\n  row2 = ['c', 'd']\n  row3 = ['e', 'f']\n  src = [row1, row2, row3]\n  buf = ''\n  src.each do |row|\n    parsed_cells = CSV.generate_row(row, 2, buf)\n    puts &quot;Created #{ parsed_cells } cells.&quot;\n  end\n  p buf\n"
- !ruby/struct:SM::Flow::P 
  body: ARGS
- !ruby/struct:SM::Flow::VERB 
  body: "  src: an Array of String to be converted to CSV string.  Must respond to\n    'size' and '[](idx)'.  src[idx] must return String.\n  cells: num of cells in a line.\n  out_dev: buffer for generated CSV string.  Must respond to '&lt;&lt;(string)'.\n  col_sep: Column separator.  ?, by default.  If you want to separate\n    fields with semicolon, give ?; here.\n  row_sep: Row separator.  nil by default.  nil means &quot;\\r\\n or \\n&quot;.  If you\n    want to separate records with \\r, give ?\\r here.\n"
- !ruby/struct:SM::Flow::P 
  body: RETURNS
- !ruby/struct:SM::Flow::VERB 
  body: "  parsed_cells: num of converted cells.\n"
full_name: CSV::generate_row
is_singleton: true
name: generate_row
params: (src, cells, out_dev, fs = nil, rs = nil)
visibility: public
PK�|[l�::#ri/1.8/system/CSV/parse_line-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parse a line from given string. Bear in mind it parses ONE LINE. Rest of the string is ignored for example &quot;a,b\r\nc,d&quot; =&gt; ['a', 'b'] and the second line 'c,d' is ignored.
- !ruby/struct:SM::Flow::P 
  body: If you don't know whether a target string to parse is exactly 1 line or not, use CSV.parse_row instead of this method.
full_name: CSV::parse_line
is_singleton: true
name: parse_line
params: (src, fs = nil, rs = nil)
visibility: public
PK�|[ �&�"	"	ri/1.8/system/CSV/open-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Open a CSV formatted file for reading or writing.
- !ruby/struct:SM::Flow::P 
  body: For reading.
- !ruby/struct:SM::Flow::P 
  body: EXAMPLE 1
- !ruby/struct:SM::Flow::VERB 
  body: "  CSV.open('csvfile.csv', 'r') do |row|\n    p row\n  end\n"
- !ruby/struct:SM::Flow::P 
  body: EXAMPLE 2
- !ruby/struct:SM::Flow::VERB 
  body: "  reader = CSV.open('csvfile.csv', 'r')\n  row1 = reader.shift\n  row2 = reader.shift\n  if row2.empty?\n    p 'row2 not find.'\n  end\n  reader.close\n"
- !ruby/struct:SM::Flow::P 
  body: ARGS
- !ruby/struct:SM::Flow::VERB 
  body: "  filename: filename to parse.\n  col_sep: Column separator.  ?, by default.  If you want to separate\n    fields with semicolon, give ?; here.\n  row_sep: Row separator.  nil by default.  nil means &quot;\\r\\n or \\n&quot;.  If you\n    want to separate records with \\r, give ?\\r here.\n"
- !ruby/struct:SM::Flow::P 
  body: RETURNS
- !ruby/struct:SM::Flow::VERB 
  body: "  reader instance.  To get parse result, see CSV::Reader#each.\n"
- !ruby/struct:SM::Flow::P 
  body: For writing.
- !ruby/struct:SM::Flow::P 
  body: EXAMPLE 1
- !ruby/struct:SM::Flow::VERB 
  body: "  CSV.open('csvfile.csv', 'w') do |writer|\n    writer &lt;&lt; ['r1c1', 'r1c2']\n    writer &lt;&lt; ['r2c1', 'r2c2']\n    writer &lt;&lt; [nil, nil]\n  end\n"
- !ruby/struct:SM::Flow::P 
  body: EXAMPLE 2
- !ruby/struct:SM::Flow::VERB 
  body: "  writer = CSV.open('csvfile.csv', 'w')\n  writer &lt;&lt; ['r1c1', 'r1c2'] &lt;&lt; ['r2c1', 'r2c2'] &lt;&lt; [nil, nil]\n  writer.close\n"
- !ruby/struct:SM::Flow::P 
  body: ARGS
- !ruby/struct:SM::Flow::VERB 
  body: "  filename: filename to generate.\n  col_sep: Column separator.  ?, by default.  If you want to separate\n    fields with semicolon, give ?; here.\n  row_sep: Row separator.  nil by default.  nil means &quot;\\r\\n or \\n&quot;.  If you\n    want to separate records with \\r, give ?\\r here.\n"
- !ruby/struct:SM::Flow::P 
  body: RETURNS
- !ruby/struct:SM::Flow::VERB 
  body: "  writer instance.  See CSV::Writer#&lt;&lt; and CSV::Writer#add_row to know how\n  to generate CSV string.\n"
full_name: CSV::open
is_singleton: true
name: open
params: (path, mode, fs = nil, rs = nil, &block)
visibility: public
PK�|[4+��&ri/1.8/system/Tracer/trace_func-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Tracer::trace_func
is_singleton: true
name: trace_func
params: (*vars)
visibility: public
PK�|[q�K��ri/1.8/system/Tracer/on-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
full_name: Tracer#on
is_singleton: false
name: "on"
params: () {|| ...}
visibility: public
PK�|[�[���$ri/1.8/system/Tracer/get_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Tracer#get_line
is_singleton: false
name: get_line
params: (file, line)
visibility: public
PK�|[(;����.ri/1.8/system/Tracer/set_get_line_procs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Tracer#set_get_line_procs
is_singleton: false
name: set_get_line_procs
params: (file, p = proc)
visibility: public
PK�|[�ۯ���&ri/1.8/system/Tracer/add_filter-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Tracer::add_filter
is_singleton: true
name: add_filter
params: (p = proc)
visibility: public
PK�|[7��k��)ri/1.8/system/Tracer/get_thread_no-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Tracer#get_thread_no
is_singleton: false
name: get_thread_no
params: ()
visibility: public
PK�|[��{��&ri/1.8/system/Tracer/trace_func-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Tracer#trace_func
is_singleton: false
name: trace_func
params: (event, file, line, id, binding, klass, *)
visibility: public
PK�|[�Q����ri/1.8/system/Tracer/on-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
full_name: Tracer::on
is_singleton: true
name: "on"
params: () {|| ...}
visibility: public
PK�|[rAD���ri/1.8/system/Tracer/off-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Tracer::off
is_singleton: true
name: "off"
params: ()
visibility: public
PK�|[Dvyb��&ri/1.8/system/Tracer/add_filter-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Tracer#add_filter
is_singleton: false
name: add_filter
params: (p = proc)
visibility: public
PK�|[5L���ri/1.8/system/Tracer/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Tracer::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[;�^@��"ri/1.8/system/Tracer/stdout-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Tracer#stdout
is_singleton: false
name: stdout
params: ()
visibility: public
PK�|[e�/+��.ri/1.8/system/Tracer/set_get_line_procs-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Tracer::set_get_line_procs
is_singleton: true
name: set_get_line_procs
params: (file_name, p = proc)
visibility: public
PK�|[ڳ�y{{&ri/1.8/system/Tracer/cdesc-Tracer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: stdout
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: verbose
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_filter
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: "off"
- !ruby/object:RI::MethodSummary 
  name: "on"
- !ruby/object:RI::MethodSummary 
  name: set_get_line_procs
- !ruby/object:RI::MethodSummary 
  name: trace_func
comment: 
- !ruby/struct:SM::Flow::P 
  body: tracer main class
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: EVENT_SYMBOL
  value: "{     \"line\" => \"-\",     \"call\" => \">\",     \"return\" => \"<\",     \"class\" => \"C\",     \"end\" => \"E\",     \"c-call\" => \">\",     \"c-return\" => \"<\",   }"
- !ruby/object:RI::Constant 
  comment: 
  name: Single
  value: new
full_name: Tracer
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_filter
- !ruby/object:RI::MethodSummary 
  name: get_line
- !ruby/object:RI::MethodSummary 
  name: get_thread_no
- !ruby/object:RI::MethodSummary 
  name: "off"
- !ruby/object:RI::MethodSummary 
  name: "on"
- !ruby/object:RI::MethodSummary 
  name: set_get_line_procs
- !ruby/object:RI::MethodSummary 
  name: stdout
- !ruby/object:RI::MethodSummary 
  name: trace_func
name: Tracer
superclass: Object
PK�|[
)����ri/1.8/system/Tracer/off-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Tracer#off
is_singleton: false
name: "off"
params: ()
visibility: public
PK�|[���OO%ri/1.8/system/Options/title%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the title, but only if not already set. This means that a title set from the command line trumps one set in a source file
full_name: Options#title=
is_singleton: false
name: title=
params: (string)
visibility: public
PK�|[�!�Npp*ri/1.8/system/Options/check_diagram-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Check that the right version of 'dot' is available. Unfortuately this doesn't work correctly under Windows NT, so we'll bypass the test under Windows
full_name: Options#check_diagram
is_singleton: false
name: check_diagram
params: ()
visibility: private
PK�|[Ku�X%%,ri/1.8/system/Options/setup_generator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set up an output generator for the format in @generator_name
full_name: Options#setup_generator
is_singleton: false
name: setup_generator
params: (generators)
visibility: private
PK�|[z/g�CC"ri/1.8/system/Options/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parse command line options. We're passed a hash containing output generators, keyed by the generator name
full_name: Options#parse
is_singleton: false
name: parse
params: (argv, generators)
visibility: public
PK�|[H��"ri/1.8/system/Options/error-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Options#error
is_singleton: false
name: error
params: (str)
visibility: private
PK�|[�v{��-ri/1.8/system/Options/OptionList/usage-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Show usage and exit
full_name: Options::OptionList::usage
is_singleton: true
name: usage
params: (generator_names)
visibility: public
PK�|[VR ��-ri/1.8/system/Options/OptionList/error-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Show an error and exit
full_name: Options::OptionList::error
is_singleton: true
name: error
params: (msg)
visibility: public
PK�|[�IYE��/ri/1.8/system/Options/OptionList/options-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Options::OptionList::options
is_singleton: true
name: options
params: ()
visibility: public
PK�|[�E��6ri/1.8/system/Options/OptionList/cdesc-OptionList.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: error
- !ruby/object:RI::MethodSummary 
  name: help_output
- !ruby/object:RI::MethodSummary 
  name: options
- !ruby/object:RI::MethodSummary 
  name: strip_output
- !ruby/object:RI::MethodSummary 
  name: usage
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: OPTION_LIST
  value: "[       [ \"--accessor\",      \"-A\",   \"accessorname[,..]\",         \"comma separated list of additional class methods\\n\" +         \"that should be treated like 'attr_reader' and\\n\" +         \"friends. Option may be repeated. Each accessorname\\n\" +         \"may have '=text' appended, in which case that text\\n\" +         \"appears where the r/w/rw appears for normal accessors.\"],                                                                           [ \"--all\",           \"-a\",   nil,         \"include all methods (not just public)\\nin the output\" ],        [ \"--charset\",       \"-c\",   \"charset\",         \"specifies HTML character-set\" ],        [ \"--debug\",         \"-D\",   nil,         \"displays lots on internal stuff\" ],        [ \"--diagram\",       \"-d\",   nil,         \"Generate diagrams showing modules and classes.\\n\" +         \"You need dot V1.8.6 or later to use the --diagram\\n\" +         \"option correctly. Dot is available from\\n\"+         \"http://www.research.att.com/sw/tools/graphviz/\" ],        [ \"--exclude\",       \"-x\",   \"pattern\",         \"do not process files or directories matching\\n\" +         \"pattern. Files given explicitly on the command\\n\" +         \"line will never be excluded.\" ],        [ \"--extension\",     \"-E\",   \"new=old\",         \"Treat files ending with .new as if they ended with\\n\" +         \".old. Using '-E cgi=rb' will cause xxx.cgi to be\\n\" +         \"parsed as a Ruby file\"],        [ \"--fileboxes\",     \"-F\",   nil,         \"classes are put in boxes which represents\\n\" +         \"files, where these classes reside. Classes\\n\" +         \"shared between more than one file are\\n\" +         \"shown with list of files that sharing them.\\n\" +         \"Silently discarded if --diagram is not given\\n\" +         \"Experimental.\" ],        [ \"--force-update\",  \"-U\",   nil,         \"forces to scan all sources even if newer than\\n\" +         \"the flag file.\" ],        [ \"--fmt\",           \"-f\",   \"format name\",         \"set the output formatter (see below)\" ],        [ \"--help\",          \"-h\",   nil,         \"you're looking at it\" ],        [ \"--help-output\",   \"-O\",   nil,         \"explain the various output options\" ],        [ \"--image-format\",  \"-I\",   \"gif/png/jpg/jpeg\",         \"Sets output image format for diagrams. Can\\n\" +         \"be png, gif, jpeg, jpg. If this option is\\n\" +         \"omitted, png is used. Requires --diagram.\" ],        [ \"--include\",       \"-i\",   \"dir[,dir...]\",         \"set (or add to) the list of directories\\n\" +         \"to be searched when satisfying :include:\\n\" +         \"requests. Can be used more than once.\" ],        [ \"--inline-source\", \"-S\",   nil,         \"Show method source code inline, rather\\n\" +         \"than via a popup link\" ],        [ \"--line-numbers\", \"-N\", nil,         \"Include line numbers in the source code\" ],        [ \"--main\",          \"-m\",   \"name\",         \"'name' will be the initial page displayed\" ],        [ \"--merge\",         \"-M\",   nil,         \"when creating ri output, merge processed classes\\n\" +         \"into previously documented classes of the name name\"],        [ \"--one-file\",      \"-1\",   nil,         \"put all the output into a single file\" ],        [ \"--op\",            \"-o\",   \"dir\",         \"set the output directory\" ],        [ \"--opname\",       \"-n\",    \"name\",         \"Set the 'name' of the output. Has no\\n\" +         \"effect for HTML.\" ],        [ \"--promiscuous\",   \"-p\",   nil,         \"When documenting a file that contains a module\\n\" +         \"or class also defined in other files, show\\n\" +         \"all stuff for that module/class in each files\\n\" +         \"page. By default, only show stuff defined in\\n\" +         \"that particular file.\" ],        [ \"--quiet\",         \"-q\",   nil,         \"don't show progress as we parse\" ],        [ \"--ri\",            \"-r\",   nil,        \"generate output for use by 'ri.' The files are\\n\" +        \"stored in the '.rdoc' directory under your home\\n\"+        \"directory unless overridden by a subsequent\\n\" +        \"--op parameter, so no special privileges are needed.\" ],        [ \"--ri-site\",       \"-R\",   nil,        \"generate output for use by 'ri.' The files are\\n\" +        \"stored in a site-wide directory, making them accessible\\n\"+        \"to others, so special privileges are needed.\" ],        [ \"--ri-system\",     \"-Y\",   nil,        \"generate output for use by 'ri.' The files are\\n\" +        \"stored in a system-level directory, making them accessible\\n\"+        \"to others, so special privileges are needed. This option\\n\"+        \"is intended to be used during Ruby installations\" ],        [ \"--show-hash\",     \"-H\",   nil,         \"A name of the form #name in a comment\\n\" +         \"is a possible hyperlink to an instance\\n\" +         \"method name. When displayed, the '#' is\\n\" +         \"removed unless this option is specified\" ],        [ \"--style\",         \"-s\",   \"stylesheet url\",         \"specifies the URL of a separate stylesheet.\" ],        [ \"--tab-width\",     \"-w\",   \"n\",         \"Set the width of tab characters (default 8)\"],        [ \"--template\",      \"-T\",   \"template name\",         \"Set the template used when generating output\" ],        [ \"--title\",         \"-t\",   \"text\",         \"Set 'txt' as the title for the output\" ],        [ \"--version\",       \"-v\",   nil,         \"display  RDoc's version\" ],        [ \"--webcvs\",        \"-W\",   \"url\",         \"Specify a URL for linking to a web frontend\\n\" +         \"to CVS. If the URL contains a '\\%s', the\\n\" +         \"name of the current file will be substituted;\\n\" +         \"if the URL doesn't contain a '\\%s', the\\n\" +         \"filename will be appended to it.\" ],     ]"
full_name: Options::OptionList
includes: []

instance_methods: []

name: OptionList
superclass: 
PK�|[��S��3ri/1.8/system/Options/OptionList/help_output-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Options::OptionList::help_output
is_singleton: true
name: help_output
params: ()
visibility: public
PK�|[�[q���4ri/1.8/system/Options/OptionList/strip_output-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Options::OptionList::strip_output
is_singleton: true
name: strip_output
params: (text)
visibility: public
PK�|[��(ri/1.8/system/Options/check_files-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Check that the files on the command line exist
full_name: Options#check_files
is_singleton: false
name: check_files
params: ()
visibility: private
PK�|[�~]���(ri/1.8/system/Options/cdesc-Options.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: should the output be placed into a single file
  name: all_one_file
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: character-set
  name: charset
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: URL of stylesheet
  name: css
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: should diagrams be drawn
  name: diagram
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: files matching this pattern will be excluded
  name: exclude
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: extra_accessor_flags
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: pattern for additional attr_... style methods
  name: extra_accessors
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: should we draw fileboxes in diagrams
  name: fileboxes
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: and the list of files to be processed
  name: files
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: scan newer sources than the flag file if true.
  name: force_update
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: description of the output generator (set with the <tt>-fmt</tt> option
  name: generator
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: image format for diagrams
  name: image_format
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: include line numbers in the source listings
  name: include_line_numbers
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: should source code be included inline, or displayed in a popup
  name: inline_source
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: name of the file, class or module to display in the initial index page (if not specified the first file we encounter is used)
  name: main_page
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: merge into classes of the name name when generating ri
  name: merge
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: the name of the output directory
  name: op_dir
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: the name to use for the output
  name: op_name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Are we promiscuous about showing module contents across multiple files
  name: promiscuous
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Don't display progress as we process the files
  name: quiet
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "array of directories to search for files to satisfy an :include:"
  name: rdoc_include
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: include private and protected methods in the output
  name: show_all
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: include the '#' at the front of hyperlinked instance method names
  name: show_hash
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: the number of columns in a tab
  name: tab_width
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: template to be used when generating output
  name: template
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: URL of web cvs frontend
  name: webcvs
  rw: R
class_methods: []

comment: 
constants: []

full_name: Options
includes: 
- !ruby/object:RI::IncludedModule 
  name: Singleton
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: check_diagram
- !ruby/object:RI::MethodSummary 
  name: check_files
- !ruby/object:RI::MethodSummary 
  name: error
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: setup_generator
- !ruby/object:RI::MethodSummary 
  name: title
- !ruby/object:RI::MethodSummary 
  name: title=
name: Options
superclass: Object
PK�|[��ե�"ri/1.8/system/Options/title-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Options#title
is_singleton: false
name: title
params: ()
visibility: public
PK�|[-$���"ri/1.8/system/RegAnd/%3d%7e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RegAnd#=~
is_singleton: false
name: =~
params: (str)
visibility: public
PK�|[+����ri/1.8/system/RegAnd/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RegAnd::new
is_singleton: true
name: new
params: (re1, re2)
visibility: public
PK�|[Qr��&ri/1.8/system/RegAnd/cdesc-RegAnd.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RegAnd
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: =~
name: RegAnd
superclass: Object
PK�|[�<\���>ri/1.8/system/RSS/ITunesModelUtils/cdesc-ITunesModelUtils.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::ITunesModelUtils
includes: 
- !ruby/object:RI::IncludedModule 
  name: Utils
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: def_class_accessor
- !ruby/object:RI::MethodSummary 
  name: def_element_class_accessor
- !ruby/object:RI::MethodSummary 
  name: def_elements_class_accessor
name: ITunesModelUtils
superclass: 
PK�|[0Y)..Eri/1.8/system/RSS/ITunesModelUtils/def_elements_class_accessor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesModelUtils#def_elements_class_accessor
is_singleton: false
name: def_elements_class_accessor
params: (klass, name, full_name, klass_name, plural_name, recommended_attribute_name=nil)
visibility: public
PK�|[�+Z��<ri/1.8/system/RSS/ITunesModelUtils/def_class_accessor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesModelUtils#def_class_accessor
is_singleton: false
name: def_class_accessor
params: (klass, name, type, *args)
visibility: public
PK�|[.�R�Dri/1.8/system/RSS/ITunesModelUtils/def_element_class_accessor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesModelUtils#def_element_class_accessor
is_singleton: false
name: def_element_class_accessor
params: (klass, name, full_name, klass_name, recommended_attribute_name=nil)
visibility: public
PK�|[�:����5ri/1.8/system/RSS/RootElementMixin/setup_maker-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RootElementMixin#setup_maker
is_singleton: false
name: setup_maker
params: (maker)
visibility: public
PK�|[h�_F��0ri/1.8/system/RSS/RootElementMixin/to_xml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RootElementMixin#to_xml
is_singleton: false
name: to_xml
params: (type=nil, &block)
visibility: public
PK�|[g����1ri/1.8/system/RSS/RootElementMixin/to_atom-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RootElementMixin#to_atom
is_singleton: false
name: to_atom
params: (type, &block)
visibility: public
PK�|[.ђ��1ri/1.8/system/RSS/RootElementMixin/xmldecl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RootElementMixin#xmldecl
is_singleton: false
name: xmldecl
params: ()
visibility: private
PK�|[�܃	��9ri/1.8/system/RSS/RootElementMixin/ns_declarations-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RootElementMixin#ns_declarations
is_singleton: false
name: ns_declarations
params: ()
visibility: private
PK�|[��M}��-ri/1.8/system/RSS/RootElementMixin/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RootElementMixin::new
is_singleton: true
name: new
params: (feed_version, version=nil, encoding=nil, standalone=nil)
visibility: public
PK�|[JG���1ri/1.8/system/RSS/RootElementMixin/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RootElementMixin#to_feed
is_singleton: false
name: to_feed
params: (type, &block)
visibility: public
PK�|[?����6ri/1.8/system/RSS/RootElementMixin/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RootElementMixin#maker_target
is_singleton: false
name: maker_target
params: (target)
visibility: private
PK�|[�v���>ri/1.8/system/RSS/RootElementMixin/cdesc-RootElementMixin.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: encoding
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: feed_subtype
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: feed_type
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: feed_version
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: output_encoding
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: standalone
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: version
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::RootElementMixin
includes: 
- !ruby/object:RI::IncludedModule 
  name: XMLStyleSheetMixin
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: feed_info
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: ns_declarations
- !ruby/object:RI::MethodSummary 
  name: output_encoding=
- !ruby/object:RI::MethodSummary 
  name: same_feed_type?
- !ruby/object:RI::MethodSummary 
  name: setup_maker
- !ruby/object:RI::MethodSummary 
  name: tag
- !ruby/object:RI::MethodSummary 
  name: to_atom
- !ruby/object:RI::MethodSummary 
  name: to_feed
- !ruby/object:RI::MethodSummary 
  name: to_rss
- !ruby/object:RI::MethodSummary 
  name: to_xml
- !ruby/object:RI::MethodSummary 
  name: xmldecl
name: RootElementMixin
superclass: 
PK�|[�z��0ri/1.8/system/RSS/RootElementMixin/to_rss-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RootElementMixin#to_rss
is_singleton: false
name: to_rss
params: (type, &block)
visibility: public
PK�|[��v��<ri/1.8/system/RSS/RootElementMixin/output_encoding%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RootElementMixin#output_encoding=
is_singleton: false
name: output_encoding=
params: (enc)
visibility: public
PK�|[�y����;ri/1.8/system/RSS/RootElementMixin/same_feed_type%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RootElementMixin#same_feed_type?
is_singleton: false
name: same_feed_type?
params: (type)
visibility: private
PK�|[h׻�3ri/1.8/system/RSS/RootElementMixin/feed_info-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RootElementMixin#feed_info
is_singleton: false
name: feed_info
params: ()
visibility: public
PK�|[���]��-ri/1.8/system/RSS/RootElementMixin/tag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RootElementMixin#tag
is_singleton: false
name: tag
params: (indent, attrs={}, &block)
visibility: private
PK�|[^�+FBri/1.8/system/RSS/TaxonomyTopicModel/cdesc-TaxonomyTopicModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: []

full_name: RSS::TaxonomyTopicModel
includes: []

instance_methods: []

name: TaxonomyTopicModel
superclass: 
PK�|[�-����;ri/1.8/system/RSS/TaxonomyTopicModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TaxonomyTopicModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[��$��Kri/1.8/system/RSS/TaxonomyTopicModel/TaxonomyTopic/cdesc-TaxonomyTopic.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_prefix
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: []

full_name: RSS::TaxonomyTopicModel::TaxonomyTopic
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS10
- !ruby/object:RI::IncludedModule 
  name: DublinCoreModel
- !ruby/object:RI::IncludedModule 
  name: TaxonomyTopicsModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: full_name
- !ruby/object:RI::MethodSummary 
  name: maker_target
name: TaxonomyTopic
superclass: Element
PK�|[���W��Cri/1.8/system/RSS/TaxonomyTopicModel/TaxonomyTopic/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TaxonomyTopicModel::TaxonomyTopic#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[��P���=ri/1.8/system/RSS/TaxonomyTopicModel/TaxonomyTopic/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TaxonomyTopicModel::TaxonomyTopic::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[��j��Iri/1.8/system/RSS/TaxonomyTopicModel/TaxonomyTopic/required_prefix-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TaxonomyTopicModel::TaxonomyTopic::required_prefix
is_singleton: true
name: required_prefix
params: ()
visibility: public
PK�|[]�L��Fri/1.8/system/RSS/TaxonomyTopicModel/TaxonomyTopic/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TaxonomyTopicModel::TaxonomyTopic#maker_target
is_singleton: false
name: maker_target
params: (target)
visibility: public
PK�|[Y�i/��Fri/1.8/system/RSS/TaxonomyTopicModel/TaxonomyTopic/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TaxonomyTopicModel::TaxonomyTopic::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[���� ri/1.8/system/RSS/cdesc-RSS.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: DC_PREFIX
  value: "'dc'"
- !ruby/object:RI::Constant 
  comment: 
  name: DC_URI
  value: "\"http://purl.org/dc/elements/1.1/\""
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: For backward compatibility
  name: DublincoreModel
  value: DublinCoreModel
- !ruby/object:RI::Constant 
  comment: 
  name: TRACKBACK_PREFIX
  value: "'trackback'"
- !ruby/object:RI::Constant 
  comment: 
  name: TRACKBACK_URI
  value: "'http://madskills.com/public/xml/rss/module/trackback/'"
- !ruby/object:RI::Constant 
  comment: 
  name: VERSION
  value: "\"0.2.4\""
- !ruby/object:RI::Constant 
  comment: 
  name: URI
  value: "\"http://purl.org/rss/1.0/\""
- !ruby/object:RI::Constant 
  comment: 
  name: DEBUG
  value: "false"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: For backward compatibility :X
  name: NotExceptedTagError
  value: NotExpectedTagError
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: for backward compatibility
  name: UnknownConvertMethod
  value: UnknownConversionMethodError
- !ruby/object:RI::Constant 
  comment: 
  name: ITUNES_PREFIX
  value: "'itunes'"
- !ruby/object:RI::Constant 
  comment: 
  name: ITUNES_URI
  value: "'http://www.itunes.com/dtds/podcast-1.0.dtd'"
- !ruby/object:RI::Constant 
  comment: 
  name: SY_PREFIX
  value: "'sy'"
- !ruby/object:RI::Constant 
  comment: 
  name: SY_URI
  value: "\"http://purl.org/rss/1.0/modules/syndication/\""
- !ruby/object:RI::Constant 
  comment: 
  name: IMAGE_PREFIX
  value: "'image'"
- !ruby/object:RI::Constant 
  comment: 
  name: IMAGE_URI
  value: "'http://purl.org/rss/1.0/modules/image/'"
- !ruby/object:RI::Constant 
  comment: 
  name: IMAGE_ELEMENTS
  value: "[]"
- !ruby/object:RI::Constant 
  comment: 
  name: CONTENT_PREFIX
  value: "'content'"
- !ruby/object:RI::Constant 
  comment: 
  name: CONTENT_URI
  value: "\"http://purl.org/rss/1.0/modules/content/\""
- !ruby/object:RI::Constant 
  comment: 
  name: AVAILABLE_PARSER_LIBRARIES
  value: "[       [\"rss/xmlparser\", :XMLParserParser],       [\"rss/xmlscanner\", :XMLScanParser],       [\"rss/rexmlparser\", :REXMLParser],     ]"
- !ruby/object:RI::Constant 
  comment: 
  name: AVAILABLE_PARSERS
  value: "[]"
- !ruby/object:RI::Constant 
  comment: 
  name: TAXO_PREFIX
  value: "\"taxo\""
- !ruby/object:RI::Constant 
  comment: 
  name: TAXO_URI
  value: "\"http://purl.org/rss/1.0/modules/taxonomy/\""
- !ruby/object:RI::Constant 
  comment: 
  name: TAXO_ELEMENTS
  value: "[]"
- !ruby/object:RI::Constant 
  comment: 
  name: SLASH_PREFIX
  value: "'slash'"
- !ruby/object:RI::Constant 
  comment: 
  name: SLASH_URI
  value: "\"http://purl.org/rss/1.0/modules/slash/\""
full_name: RSS
includes: []

instance_methods: []

name: RSS
superclass: 
PK�|[������.ri/1.8/system/RSS/REXMLListener/xmldecl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::REXMLListener#xmldecl
is_singleton: false
name: xmldecl
params: (version, encoding, standalone)
visibility: public
PK�|[F�mK��8ri/1.8/system/RSS/REXMLListener/cdesc-REXMLListener.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: raise_for_undefined_entity?
comment: 
constants: []

full_name: RSS::REXMLListener
includes: 
- !ruby/object:RI::IncludedModule 
  name: REXML::StreamListener
- !ruby/object:RI::IncludedModule 
  name: ListenerMixin
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: xmldecl
name: REXMLListener
superclass: BaseListener
PK�|[B�+��Dri/1.8/system/RSS/REXMLListener/raise_for_undefined_entity%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::REXMLListener::raise_for_undefined_entity?
is_singleton: true
name: raise_for_undefined_entity?
params: ()
visibility: public
PK�|[�1�K��,ri/1.8/system/RSS/TooMuchTagError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TooMuchTagError::new
is_singleton: true
name: new
params: (tag, parent)
visibility: public
PK�|[��%��<ri/1.8/system/RSS/TooMuchTagError/cdesc-TooMuchTagError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: parent
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: tag
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::TooMuchTagError
includes: []

instance_methods: []

name: TooMuchTagError
superclass: InvalidRSSError
PK�|[�M�J��8ri/1.8/system/RSS/SetupMaker/setup_maker_elements-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::SetupMaker#setup_maker_elements
is_singleton: false
name: setup_maker_elements
params: (parent)
visibility: private
PK�|[.A���/ri/1.8/system/RSS/SetupMaker/setup_maker-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::SetupMaker#setup_maker
is_singleton: false
name: setup_maker
params: (maker)
visibility: public
PK�|[�X��992ri/1.8/system/RSS/SetupMaker/cdesc-SetupMaker.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::SetupMaker
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: not_need_to_call_setup_maker_variables
- !ruby/object:RI::MethodSummary 
  name: setup_maker
- !ruby/object:RI::MethodSummary 
  name: setup_maker_attributes
- !ruby/object:RI::MethodSummary 
  name: setup_maker_element
- !ruby/object:RI::MethodSummary 
  name: setup_maker_elements
name: SetupMaker
superclass: 
PK�|[������7ri/1.8/system/RSS/SetupMaker/setup_maker_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::SetupMaker#setup_maker_element
is_singleton: false
name: setup_maker_element
params: (target)
visibility: private
PK�|[�۫��Jri/1.8/system/RSS/SetupMaker/not_need_to_call_setup_maker_variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::SetupMaker#not_need_to_call_setup_maker_variables
is_singleton: false
name: not_need_to_call_setup_maker_variables
params: ()
visibility: private
PK�|[�����0ri/1.8/system/RSS/SetupMaker/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::SetupMaker#maker_target
is_singleton: false
name: maker_target
params: (maker)
visibility: private
PK�|[��	L��:ri/1.8/system/RSS/SetupMaker/setup_maker_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::SetupMaker#setup_maker_attributes
is_singleton: false
name: setup_maker_attributes
params: (target)
visibility: private
PK�|[6`�=��9ri/1.8/system/RSS/SyndicationModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::SyndicationModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[O
�>ri/1.8/system/RSS/SyndicationModel/cdesc-SyndicationModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ELEMENTS
  value: "[]"
- !ruby/object:RI::Constant 
  comment: 
  name: SY_UPDATEPERIOD_AVAILABLE_VALUES
  value: "%w(hourly daily weekly monthly yearly)"
full_name: RSS::SyndicationModel
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: validate_sy_updatePeriod
name: SyndicationModel
superclass: 
PK�|[J�����Bri/1.8/system/RSS/SyndicationModel/validate_sy_updatePeriod-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::SyndicationModel#validate_sy_updatePeriod
is_singleton: false
name: validate_sy_updatePeriod
params: (value)
visibility: private
PK�|[������Ari/1.8/system/RSS/ITunesChannelModel/ITunesImage/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::ITunesImage#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[Γ=���;ri/1.8/system/RSS/ITunesChannelModel/ITunesImage/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::ITunesImage::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[�os�PPGri/1.8/system/RSS/ITunesChannelModel/ITunesImage/cdesc-ITunesImage.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_prefix
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: []

full_name: RSS::ITunesChannelModel::ITunesImage
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: full_name
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: setup_maker_attributes
name: ITunesImage
superclass: Element
PK�|[�,'��Gri/1.8/system/RSS/ITunesChannelModel/ITunesImage/required_prefix-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::ITunesImage::required_prefix
is_singleton: true
name: required_prefix
params: ()
visibility: public
PK�|[T�/���Dri/1.8/system/RSS/ITunesChannelModel/ITunesImage/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::ITunesImage#maker_target
is_singleton: false
name: maker_target
params: (target)
visibility: private
PK�|[E���Nri/1.8/system/RSS/ITunesChannelModel/ITunesImage/setup_maker_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::ITunesImage#setup_maker_attributes
is_singleton: false
name: setup_maker_attributes
params: (image)
visibility: private
PK�|[�hu���Dri/1.8/system/RSS/ITunesChannelModel/ITunesImage/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::ITunesImage::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[��^��Ari/1.8/system/RSS/ITunesChannelModel/ITunesOwner/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::ITunesOwner#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[�7�MMGri/1.8/system/RSS/ITunesChannelModel/ITunesOwner/cdesc-ITunesOwner.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_prefix
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: []

full_name: RSS::ITunesChannelModel::ITunesOwner
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: full_name
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: setup_maker_element
name: ITunesOwner
superclass: Element
PK�|[u��J��;ri/1.8/system/RSS/ITunesChannelModel/ITunesOwner/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::ITunesOwner::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[�
|��Gri/1.8/system/RSS/ITunesChannelModel/ITunesOwner/required_prefix-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::ITunesOwner::required_prefix
is_singleton: true
name: required_prefix
params: ()
visibility: public
PK�|[FkN��Kri/1.8/system/RSS/ITunesChannelModel/ITunesOwner/setup_maker_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::ITunesOwner#setup_maker_element
is_singleton: false
name: setup_maker_element
params: (owner)
visibility: private
PK�|[�#���Dri/1.8/system/RSS/ITunesChannelModel/ITunesOwner/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::ITunesOwner#maker_target
is_singleton: false
name: maker_target
params: (target)
visibility: private
PK�|[�g�/��Dri/1.8/system/RSS/ITunesChannelModel/ITunesOwner/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::ITunesOwner::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[a4$"��;ri/1.8/system/RSS/ITunesChannelModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[�:���Ori/1.8/system/RSS/ITunesChannelModel/ITunesCategory/setup_maker_elements-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::ITunesCategory#setup_maker_elements
is_singleton: false
name: setup_maker_elements
params: (category)
visibility: private
PK�|[����Mri/1.8/system/RSS/ITunesChannelModel/ITunesCategory/cdesc-ITunesCategory.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_prefix
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ITunesCategory
  value: self
full_name: RSS::ITunesChannelModel::ITunesCategory
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: full_name
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: setup_maker_attributes
- !ruby/object:RI::MethodSummary 
  name: setup_maker_elements
name: ITunesCategory
superclass: Element
PK�|[�c����Dri/1.8/system/RSS/ITunesChannelModel/ITunesCategory/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::ITunesCategory#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[m�����>ri/1.8/system/RSS/ITunesChannelModel/ITunesCategory/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::ITunesCategory::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[�0C���Jri/1.8/system/RSS/ITunesChannelModel/ITunesCategory/required_prefix-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::ITunesCategory::required_prefix
is_singleton: true
name: required_prefix
params: ()
visibility: public
PK�|[��Gri/1.8/system/RSS/ITunesChannelModel/ITunesCategory/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::ITunesCategory#maker_target
is_singleton: false
name: maker_target
params: (categories)
visibility: private
PK�|[�����Qri/1.8/system/RSS/ITunesChannelModel/ITunesCategory/setup_maker_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::ITunesCategory#setup_maker_attributes
is_singleton: false
name: setup_maker_attributes
params: (category)
visibility: private
PK�|[�-���Gri/1.8/system/RSS/ITunesChannelModel/ITunesCategory/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesChannelModel::ITunesCategory::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[Mf���Bri/1.8/system/RSS/ITunesChannelModel/cdesc-ITunesChannelModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ELEMENTS
  value: "[]"
- !ruby/object:RI::Constant 
  comment: 
  name: ELEMENT_INFOS
  value: "[                      [\"category\", :elements, \"categories\", \"text\"],                      [\"image\", :attribute, \"href\"],                      [\"owner\", :element],                      [\"new-feed-url\"],                     ] + ITunesBaseModel::ELEMENT_INFOS"
full_name: RSS::ITunesChannelModel
includes: 
- !ruby/object:RI::IncludedModule 
  name: ITunesBaseModel
instance_methods: []

name: ITunesChannelModel
superclass: 
PK�|[]iӿ77:ri/1.8/system/RSS/ImageItemModel/cdesc-ImageItemModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: []

full_name: RSS::ImageItemModel
includes: 
- !ruby/object:RI::IncludedModule 
  name: ImageModelUtils
instance_methods: []

name: ImageItemModel
superclass: 
PK�|[��u��7ri/1.8/system/RSS/ImageItemModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ImageItemModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[��C���;ri/1.8/system/RSS/ImageItemModel/ImageItem/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ImageItemModel::ImageItem#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[ˈ�y��?ri/1.8/system/RSS/ImageItemModel/ImageItem/cdesc-ImageItem.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_prefix
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: []

full_name: RSS::ImageItemModel::ImageItem
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS10
- !ruby/object:RI::IncludedModule 
  name: DublinCoreModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: full_name
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: setup_maker_attributes
name: ImageItem
superclass: Element
PK�|[H��5ri/1.8/system/RSS/ImageItemModel/ImageItem/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ImageItemModel::ImageItem::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[���X��Ari/1.8/system/RSS/ImageItemModel/ImageItem/required_prefix-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ImageItemModel::ImageItem::required_prefix
is_singleton: true
name: required_prefix
params: ()
visibility: public
PK�|[��<���>ri/1.8/system/RSS/ImageItemModel/ImageItem/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ImageItemModel::ImageItem#maker_target
is_singleton: false
name: maker_target
params: (target)
visibility: private
PK�|[�-���Hri/1.8/system/RSS/ImageItemModel/ImageItem/setup_maker_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ImageItemModel::ImageItem#setup_maker_attributes
is_singleton: false
name: setup_maker_attributes
params: (item)
visibility: private
PK�|[��p���>ri/1.8/system/RSS/ImageItemModel/ImageItem/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ImageItemModel::ImageItem::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[in��<ri/1.8/system/RSS/ITunesItemModel/cdesc-ITunesItemModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ELEMENT_INFOS
  value: ITunesBaseModel::ELEMENT_INFOS +       [["duration", :element, "content"]]
full_name: RSS::ITunesItemModel
includes: 
- !ruby/object:RI::IncludedModule 
  name: ITunesBaseModel
instance_methods: []

name: ITunesItemModel
superclass: 
PK�|[ftAW��8ri/1.8/system/RSS/ITunesItemModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesItemModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[7�����?ri/1.8/system/RSS/ITunesItemModel/ITunesDuration/hour%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesItemModel::ITunesDuration#hour=
is_singleton: false
name: hour=
params: (hour)
visibility: public
PK�|[yXW��Ari/1.8/system/RSS/ITunesItemModel/ITunesDuration/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesItemModel::ITunesDuration#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[.A����Jri/1.8/system/RSS/ITunesItemModel/ITunesDuration/cdesc-ITunesDuration.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: hour
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: minute
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: second
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: construct
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: required_prefix
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: []

full_name: RSS::ITunesItemModel::ITunesDuration
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: content=
- !ruby/object:RI::MethodSummary 
  name: full_name
- !ruby/object:RI::MethodSummary 
  name: hour=
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: minute=
- !ruby/object:RI::MethodSummary 
  name: second=
- !ruby/object:RI::MethodSummary 
  name: setup_maker_element
- !ruby/object:RI::MethodSummary 
  name: update_content
- !ruby/object:RI::MethodSummary 
  name: value=
name: ITunesDuration
superclass: Element
PK�|[�#i���Ari/1.8/system/RSS/ITunesItemModel/ITunesDuration/minute%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesItemModel::ITunesDuration#minute=
is_singleton: false
name: minute=
params: (minute)
visibility: public
PK�|[A�
���=ri/1.8/system/RSS/ITunesItemModel/ITunesDuration/parse-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesItemModel::ITunesDuration::parse
is_singleton: true
name: parse
params: (duration, do_validate=true)
visibility: public
PK�|[\�=@ri/1.8/system/RSS/ITunesItemModel/ITunesDuration/value%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #content="
full_name: RSS::ITunesItemModel::ITunesDuration#value=
is_singleton: false
name: value=
params: (value)
visibility: public
PK�|[��Q��Bri/1.8/system/RSS/ITunesItemModel/ITunesDuration/content%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: value=
block_params: 
comment: 
full_name: RSS::ITunesItemModel::ITunesDuration#content=
is_singleton: false
name: content=
params: (value)
visibility: public
PK�|[�~�u��Ari/1.8/system/RSS/ITunesItemModel/ITunesDuration/construct-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesItemModel::ITunesDuration::construct
is_singleton: true
name: construct
params: (hour, minute, second)
visibility: public
PK�|[ЌX]��Ari/1.8/system/RSS/ITunesItemModel/ITunesDuration/second%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesItemModel::ITunesDuration#second=
is_singleton: false
name: second=
params: (second)
visibility: public
PK�|[i�b��Fri/1.8/system/RSS/ITunesItemModel/ITunesDuration/update_content-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesItemModel::ITunesDuration#update_content
is_singleton: false
name: update_content
params: ()
visibility: private
PK�|[�k&���;ri/1.8/system/RSS/ITunesItemModel/ITunesDuration/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesItemModel::ITunesDuration::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[ �H/��Gri/1.8/system/RSS/ITunesItemModel/ITunesDuration/required_prefix-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesItemModel::ITunesDuration::required_prefix
is_singleton: true
name: required_prefix
params: ()
visibility: public
PK�|[F��i��Kri/1.8/system/RSS/ITunesItemModel/ITunesDuration/setup_maker_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesItemModel::ITunesDuration#setup_maker_element
is_singleton: false
name: setup_maker_element
params: (duration)
visibility: private
PK�|[��A5��Dri/1.8/system/RSS/ITunesItemModel/ITunesDuration/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesItemModel::ITunesDuration#maker_target
is_singleton: false
name: maker_target
params: (target)
visibility: private
PK�|[
I��Dri/1.8/system/RSS/ITunesItemModel/ITunesDuration/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ITunesItemModel::ITunesDuration::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[uE���1ri/1.8/system/RSS/XMLStyleSheet/guess_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLStyleSheet#guess_type
is_singleton: false
name: guess_type
params: (filename)
visibility: private
PK�|[d��
��2ri/1.8/system/RSS/XMLStyleSheet/setup_maker-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLStyleSheet#setup_maker
is_singleton: false
name: setup_maker
params: (maker)
visibility: public
PK�|[+PV��.ri/1.8/system/RSS/XMLStyleSheet/href%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLStyleSheet#href=
is_singleton: false
name: href=
params: (value)
visibility: public
PK�|[�L���*ri/1.8/system/RSS/XMLStyleSheet/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLStyleSheet::new
is_singleton: true
name: new
params: (*attrs)
visibility: public
PK�|[������+ri/1.8/system/RSS/XMLStyleSheet/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLStyleSheet#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[���cc8ri/1.8/system/RSS/XMLStyleSheet/cdesc-XMLStyleSheet.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: do_validate
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ATTRIBUTES
  value: "%w(href type title media charset alternate)"
- !ruby/object:RI::Constant 
  comment: 
  name: GUESS_TABLE
  value: "{       \"xsl\" => \"text/xsl\",       \"css\" => \"text/css\",     }"
full_name: RSS::XMLStyleSheet
includes: 
- !ruby/object:RI::IncludedModule 
  name: Utils
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: alternate=
- !ruby/object:RI::MethodSummary 
  name: guess_type
- !ruby/object:RI::MethodSummary 
  name: href=
- !ruby/object:RI::MethodSummary 
  name: setup_maker
- !ruby/object:RI::MethodSummary 
  name: to_s
name: XMLStyleSheet
superclass: Object
PK�|[��A��3ri/1.8/system/RSS/XMLStyleSheet/alternate%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLStyleSheet#alternate=
is_singleton: false
name: alternate=
params: (value)
visibility: public
PK�|[T:fـ�<ri/1.8/system/RSS/MissingTagError/cdesc-MissingTagError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: parent
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: tag
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::MissingTagError
includes: []

instance_methods: []

name: MissingTagError
superclass: InvalidRSSError
PK�|[i��,ri/1.8/system/RSS/MissingTagError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::MissingTagError::new
is_singleton: true
name: new
params: (tag, parent)
visibility: public
PK�|[��*���7ri/1.8/system/RSS/REXMLLikeXMLParser/listener%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::REXMLLikeXMLParser#listener=
is_singleton: false
name: listener=
params: (listener)
visibility: public
PK�|[n�X2��6ri/1.8/system/RSS/REXMLLikeXMLParser/endElement-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::REXMLLikeXMLParser#endElement
is_singleton: false
name: endElement
params: (name)
visibility: public
PK�|[g�����5ri/1.8/system/RSS/REXMLLikeXMLParser/character-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::REXMLLikeXMLParser#character
is_singleton: false
name: character
params: (data)
visibility: public
PK�|[`�H���Ari/1.8/system/RSS/REXMLLikeXMLParser/processingInstruction-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::REXMLLikeXMLParser#processingInstruction
is_singleton: false
name: processingInstruction
params: (target, content)
visibility: public
PK�|[�����3ri/1.8/system/RSS/REXMLLikeXMLParser/xmlDecl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::REXMLLikeXMLParser#xmlDecl
is_singleton: false
name: xmlDecl
params: (version, encoding, standalone)
visibility: public
PK�|[[��1��8ri/1.8/system/RSS/REXMLLikeXMLParser/startElement-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::REXMLLikeXMLParser#startElement
is_singleton: false
name: startElement
params: (name, attrs)
visibility: public
PK�|[���__Bri/1.8/system/RSS/REXMLLikeXMLParser/cdesc-REXMLLikeXMLParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::REXMLLikeXMLParser
includes: 
- !ruby/object:RI::IncludedModule 
  name: "::XML::Encoding_ja"
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: character
- !ruby/object:RI::MethodSummary 
  name: endElement
- !ruby/object:RI::MethodSummary 
  name: listener=
- !ruby/object:RI::MethodSummary 
  name: processingInstruction
- !ruby/object:RI::MethodSummary 
  name: startElement
- !ruby/object:RI::MethodSummary 
  name: xmlDecl
name: REXMLLikeXMLParser
superclass: "::XML::Parser"
PK�|[��n���<ri/1.8/system/RSS/BaseDublinCoreModel/append_features-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseDublinCoreModel#append_features
is_singleton: false
name: append_features
params: (klass)
visibility: public
PK�|[�G3		Dri/1.8/system/RSS/BaseDublinCoreModel/cdesc-BaseDublinCoreModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::BaseDublinCoreModel
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
name: BaseDublinCoreModel
superclass: 
PK�|[g����6ri/1.8/system/RSS/BaseModel/convert_attr_reader-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#convert_attr_reader
is_singleton: false
name: convert_attr_reader
params: (*attrs)
visibility: private
PK�|[6�D��2ri/1.8/system/RSS/BaseModel/csv_attr_reader-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#csv_attr_reader
is_singleton: false
name: csv_attr_reader
params: (*attrs)
visibility: private
PK�|[�D���.ri/1.8/system/RSS/BaseModel/date_writer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#date_writer
is_singleton: false
name: date_writer
params: (name, type, disp_name=name)
visibility: private
PK�|[����3ri/1.8/system/RSS/BaseModel/yes_other_writer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#yes_other_writer
is_singleton: false
name: yes_other_writer
params: (name, disp_name=name)
visibility: private
PK�|[m�����>ri/1.8/system/RSS/BaseModel/inherit_convert_attr_reader-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#inherit_convert_attr_reader
is_singleton: false
name: inherit_convert_attr_reader
params: (*attrs)
visibility: private
PK�|[�,����0ri/1.8/system/RSS/BaseModel/cdesc-BaseModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::BaseModel
includes: 
- !ruby/object:RI::IncludedModule 
  name: Utils
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: boolean_writer
- !ruby/object:RI::MethodSummary 
  name: content_writer
- !ruby/object:RI::MethodSummary 
  name: convert_attr_reader
- !ruby/object:RI::MethodSummary 
  name: csv_attr_reader
- !ruby/object:RI::MethodSummary 
  name: csv_integer_writer
- !ruby/object:RI::MethodSummary 
  name: csv_writer
- !ruby/object:RI::MethodSummary 
  name: date_writer
- !ruby/object:RI::MethodSummary 
  name: def_children_accessor
- !ruby/object:RI::MethodSummary 
  name: inherit_convert_attr_reader
- !ruby/object:RI::MethodSummary 
  name: install_date_element
- !ruby/object:RI::MethodSummary 
  name: install_element
- !ruby/object:RI::MethodSummary 
  name: install_have_attribute_element
- !ruby/object:RI::MethodSummary 
  name: install_have_child_element
- !ruby/object:RI::MethodSummary 
  name: install_have_children_element
- !ruby/object:RI::MethodSummary 
  name: install_text_element
- !ruby/object:RI::MethodSummary 
  name: integer_writer
- !ruby/object:RI::MethodSummary 
  name: positive_integer_writer
- !ruby/object:RI::MethodSummary 
  name: text_type_writer
- !ruby/object:RI::MethodSummary 
  name: uri_convert_attr_reader
- !ruby/object:RI::MethodSummary 
  name: yes_clean_other_attr_reader
- !ruby/object:RI::MethodSummary 
  name: yes_clean_other_writer
- !ruby/object:RI::MethodSummary 
  name: yes_other_attr_reader
- !ruby/object:RI::MethodSummary 
  name: yes_other_writer
name: BaseModel
superclass: 
PK�|[,z���5ri/1.8/system/RSS/BaseModel/csv_integer_writer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#csv_integer_writer
is_singleton: false
name: csv_integer_writer
params: (name, disp_name=name)
visibility: private
PK�|[u(���8ri/1.8/system/RSS/BaseModel/def_children_accessor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#def_children_accessor
is_singleton: false
name: def_children_accessor
params: (accessor_name, plural_name)
visibility: private
PK�|[�f3���>ri/1.8/system/RSS/BaseModel/yes_clean_other_attr_reader-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#yes_clean_other_attr_reader
is_singleton: false
name: yes_clean_other_attr_reader
params: (*attrs)
visibility: private
PK�|[��1	7ri/1.8/system/RSS/BaseModel/install_date_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#install_date_element
is_singleton: false
name: install_date_element
params: (tag_name, uri, occurs, name=nil, type=nil, disp_name=nil)
visibility: public
PK�|[�[
7ri/1.8/system/RSS/BaseModel/install_text_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#install_text_element
is_singleton: false
name: install_text_element
params: (tag_name, uri, occurs, name=nil, type=nil, disp_name=nil)
visibility: public
PK�|[���SSAri/1.8/system/RSS/BaseModel/install_have_attribute_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #install_have_child_element"
full_name: RSS::BaseModel#install_have_attribute_element
is_singleton: false
name: install_have_attribute_element
params: (tag_name, uri, occurs, name=nil, type=nil)
visibility: public
PK�|[������-ri/1.8/system/RSS/BaseModel/csv_writer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#csv_writer
is_singleton: false
name: csv_writer
params: (name, disp_name=name)
visibility: private
PK�|[�����1ri/1.8/system/RSS/BaseModel/boolean_writer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#boolean_writer
is_singleton: false
name: boolean_writer
params: (name, disp_name=name)
visibility: private
PK�|[9�9��3ri/1.8/system/RSS/BaseModel/text_type_writer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#text_type_writer
is_singleton: false
name: text_type_writer
params: (name, disp_name=name)
visibility: private
PK�|[�j����1ri/1.8/system/RSS/BaseModel/integer_writer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#integer_writer
is_singleton: false
name: integer_writer
params: (name, disp_name=name)
visibility: private
PK�|[����2ri/1.8/system/RSS/BaseModel/install_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#install_element
is_singleton: false
name: install_element
params: (name, postfix="")
visibility: private
PK�|[;r���1ri/1.8/system/RSS/BaseModel/content_writer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#content_writer
is_singleton: false
name: content_writer
params: (name, disp_name=name)
visibility: private
PK�|[�\����8ri/1.8/system/RSS/BaseModel/yes_other_attr_reader-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#yes_other_attr_reader
is_singleton: false
name: yes_other_attr_reader
params: (*attrs)
visibility: private
PK�|[��e8AA=ri/1.8/system/RSS/BaseModel/install_have_child_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: install_have_attribute_element
block_params: 
comment: 
full_name: RSS::BaseModel#install_have_child_element
is_singleton: false
name: install_have_child_element
params: (tag_name, uri, occurs, name=nil, type=nil)
visibility: public
PK�|[1���:ri/1.8/system/RSS/BaseModel/uri_convert_attr_reader-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#uri_convert_attr_reader
is_singleton: false
name: uri_convert_attr_reader
params: (*attrs)
visibility: private
PK�|[��,�@ri/1.8/system/RSS/BaseModel/install_have_children_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#install_have_children_element
is_singleton: false
name: install_have_children_element
params: (tag_name, uri, occurs, name=nil, plural_name=nil)
visibility: public
PK�|[����9ri/1.8/system/RSS/BaseModel/yes_clean_other_writer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#yes_clean_other_writer
is_singleton: false
name: yes_clean_other_writer
params: (name, disp_name=name)
visibility: private
PK�|[q���:ri/1.8/system/RSS/BaseModel/positive_integer_writer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseModel#positive_integer_writer
is_singleton: false
name: positive_integer_writer
params: (name, disp_name=name)
visibility: private
PK�|[�����:ri/1.8/system/RSS/BaseParser/ignore_unknown_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseParser#ignore_unknown_element
is_singleton: false
name: ignore_unknown_element
params: ()
visibility: public
PK�|[����2ri/1.8/system/RSS/BaseParser/do_validate%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseParser#do_validate=
is_singleton: false
name: do_validate=
params: (new_value)
visibility: public
PK�|[U���)ri/1.8/system/RSS/BaseParser/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseParser#parse
is_singleton: false
name: parse
params: ()
visibility: public
PK�|[b�Q{��2ri/1.8/system/RSS/BaseParser/cdesc-BaseParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: raise_for_undefined_entity?
comment: 
constants: []

full_name: RSS::BaseParser
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: do_validate
- !ruby/object:RI::MethodSummary 
  name: do_validate=
- !ruby/object:RI::MethodSummary 
  name: ignore_unknown_element
- !ruby/object:RI::MethodSummary 
  name: ignore_unknown_element=
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: rss
name: BaseParser
superclass: Object
PK�|[y}`��'ri/1.8/system/RSS/BaseParser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseParser::new
is_singleton: true
name: new
params: (rss)
visibility: public
PK�|[K˵&��Ari/1.8/system/RSS/BaseParser/raise_for_undefined_entity%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseParser::raise_for_undefined_entity?
is_singleton: true
name: raise_for_undefined_entity?
params: ()
visibility: public
PK�|[ �X���/ri/1.8/system/RSS/BaseParser/do_validate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseParser#do_validate
is_singleton: false
name: do_validate
params: ()
visibility: public
PK�|[�@��'ri/1.8/system/RSS/BaseParser/rss-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseParser#rss
is_singleton: false
name: rss
params: ()
visibility: public
PK�|[�$&��=ri/1.8/system/RSS/BaseParser/ignore_unknown_element%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseParser#ignore_unknown_element=
is_singleton: false
name: ignore_unknown_element=
params: (new_value)
visibility: public
PK�|[��~��<ri/1.8/system/RSS/DublinCoreModel/cdesc-DublinCoreModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: TEXT_ELEMENTS
  value: "{       \"title\" => nil,       \"description\" => nil,       \"creator\" => nil,       \"subject\" => nil,       \"publisher\" => nil,       \"contributor\" => nil,       \"type\" => nil,       \"format\" => nil,       \"identifier\" => nil,       \"source\" => nil,       \"language\" => nil,       \"relation\" => nil,       \"coverage\" => nil,       \"rights\" => \"rights_list\""
- !ruby/object:RI::Constant 
  comment: 
  name: DATE_ELEMENTS
  value: "{       \"date\" => \"w3cdtf\",     }"
- !ruby/object:RI::Constant 
  comment: 
  name: ELEMENT_NAME_INFOS
  value: DublinCoreModel::TEXT_ELEMENTS.to_a
- !ruby/object:RI::Constant 
  comment: 
  name: ELEMENTS
  value: TEXT_ELEMENTS.keys + DATE_ELEMENTS.keys
full_name: RSS::DublinCoreModel
includes: []

instance_methods: []

name: DublinCoreModel
superclass: 
PK�|[�2h���1ri/1.8/system/RSS/Rss/setup_maker_elements-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss#setup_maker_elements
is_singleton: false
name: setup_maker_elements
params: (maker)
visibility: public
PK�|[�
����9ri/1.8/system/RSS/Rss/Channel/setup_maker_elements-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel#setup_maker_elements
is_singleton: false
name: setup_maker_elements
params: (channel)
visibility: private
PK�|[�����4ri/1.8/system/RSS/Rss/Channel/Item/Source/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::Item::Source::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[�����=ri/1.8/system/RSS/Rss/Channel/Item/Source/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::Item::Source#maker_target
is_singleton: false
name: maker_target
params: (item)
visibility: private
PK�|[�A�o��;ri/1.8/system/RSS/Rss/Channel/Item/Source/cdesc-Source.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::Rss::Channel::Item::Source
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: setup_maker_attributes
name: Source
superclass: Element
PK�|[�����Gri/1.8/system/RSS/Rss/Channel/Item/Source/setup_maker_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::Item::Source#setup_maker_attributes
is_singleton: false
name: setup_maker_attributes
params: (source)
visibility: private
PK�|[�����?ri/1.8/system/RSS/Rss/Channel/Item/Category/cdesc-Category.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::Rss::Channel::Item::Category
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: setup_maker_attributes
name: Category
superclass: Element
PK�|[�����6ri/1.8/system/RSS/Rss/Channel/Item/Category/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::Item::Category::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[*Y ��?ri/1.8/system/RSS/Rss/Channel/Item/Category/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::Item::Category#maker_target
is_singleton: false
name: maker_target
params: (item)
visibility: private
PK�|[�@���Iri/1.8/system/RSS/Rss/Channel/Item/Category/setup_maker_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::Item::Category#setup_maker_attributes
is_singleton: false
name: setup_maker_attributes
params: (category)
visibility: private
PK�|[+�>ri/1.8/system/RSS/Rss/Channel/Item/_setup_maker_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #setup_maker_element"
full_name: RSS::Rss::Channel::Item#_setup_maker_element
is_singleton: false
name: _setup_maker_element
params: (item)
visibility: private
PK�|[�����=ri/1.8/system/RSS/Rss/Channel/Item/setup_maker_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::Item#setup_maker_element
is_singleton: false
name: setup_maker_element
params: (item)
visibility: private
PK�|[�y����6ri/1.8/system/RSS/Rss/Channel/Item/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::Item#maker_target
is_singleton: false
name: maker_target
params: (items)
visibility: private
PK�|[��+��Ari/1.8/system/RSS/Rss/Channel/Item/Enclosure/cdesc-Enclosure.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::Rss::Channel::Item::Enclosure
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: setup_maker_attributes
name: Enclosure
superclass: Element
PK�|[0��B��7ri/1.8/system/RSS/Rss/Channel/Item/Enclosure/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::Item::Enclosure::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[��j���@ri/1.8/system/RSS/Rss/Channel/Item/Enclosure/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::Item::Enclosure#maker_target
is_singleton: false
name: maker_target
params: (item)
visibility: private
PK�|[��S���Jri/1.8/system/RSS/Rss/Channel/Item/Enclosure/setup_maker_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::Item::Enclosure#setup_maker_attributes
is_singleton: false
name: setup_maker_attributes
params: (enclosure)
visibility: private
PK�|[��|��;ri/1.8/system/RSS/Rss/Channel/Item/Guid/PermaLink%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::Item::Guid#PermaLink?
is_singleton: false
name: PermaLink?
params: ()
visibility: public
PK�|[>I���2ri/1.8/system/RSS/Rss/Channel/Item/Guid/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::Item::Guid::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[L�a��7ri/1.8/system/RSS/Rss/Channel/Item/Guid/cdesc-Guid.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::Rss::Channel::Item::Guid
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: PermaLink?
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: setup_maker_attributes
name: Guid
superclass: Element
PK�|[� ���;ri/1.8/system/RSS/Rss/Channel/Item/Guid/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::Item::Guid#maker_target
is_singleton: false
name: maker_target
params: (item)
visibility: private
PK�|[�%���Eri/1.8/system/RSS/Rss/Channel/Item/Guid/setup_maker_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::Item::Guid#setup_maker_attributes
is_singleton: false
name: setup_maker_attributes
params: (guid)
visibility: private
PK�|[��N��2ri/1.8/system/RSS/Rss/Channel/Item/cdesc-Item.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Rss::Channel::Item
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
- !ruby/object:RI::IncludedModule 
  name: ContentModel
- !ruby/object:RI::IncludedModule 
  name: TrackBackModel20
- !ruby/object:RI::IncludedModule 
  name: ITunesItemModel
- !ruby/object:RI::IncludedModule 
  name: DublinCoreModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _setup_maker_element
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: setup_maker_element
- !ruby/object:RI::MethodSummary 
  name: setup_maker_element
name: Item
superclass: Element
PK�|[��\��2ri/1.8/system/RSS/Rss/Channel/TextInput/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::TextInput::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[��y�``<ri/1.8/system/RSS/Rss/Channel/TextInput/cdesc-TextInput.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::Rss::Channel::TextInput
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maker_target
name: TextInput
superclass: Element
PK�|[Q���;ri/1.8/system/RSS/Rss/Channel/TextInput/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::TextInput#maker_target
is_singleton: false
name: maker_target
params: (maker)
visibility: private
PK�|[�6��XX4ri/1.8/system/RSS/Rss/Channel/Image/cdesc-Image.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::Rss::Channel::Image
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maker_target
name: Image
superclass: Element
PK�|[��z��.ri/1.8/system/RSS/Rss/Channel/Image/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::Image::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[�u�+��7ri/1.8/system/RSS/Rss/Channel/Image/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::Image#maker_target
is_singleton: false
name: maker_target
params: (maker)
visibility: private
PK�|[�>k�<ri/1.8/system/RSS/Rss/Channel/SkipHours/cdesc-SkipHours.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Rss::Channel::SkipHours
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
instance_methods: []

name: SkipHours
superclass: Element
PK�|[#>����7ri/1.8/system/RSS/Rss/Channel/SkipHours/Hour/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::SkipHours::Hour::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[�7C--<ri/1.8/system/RSS/Rss/Channel/SkipHours/Hour/cdesc-Hour.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::Rss::Channel::SkipHours::Hour
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
instance_methods: []

name: Hour
superclass: Element
PK�|[���7��0ri/1.8/system/RSS/Rss/Channel/cdesc-Channel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Category
  value: Item::Category
full_name: RSS::Rss::Channel
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
- !ruby/object:RI::IncludedModule 
  name: ITunesChannelModel
- !ruby/object:RI::IncludedModule 
  name: DublinCoreModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: not_need_to_call_setup_maker_variables
- !ruby/object:RI::MethodSummary 
  name: setup_maker_elements
name: Channel
superclass: Element
PK�|[�	���.ri/1.8/system/RSS/Rss/Channel/Cloud/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::Cloud::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[}��J$$4ri/1.8/system/RSS/Rss/Channel/Cloud/cdesc-Cloud.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::Rss::Channel::Cloud
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
instance_methods: []

name: Cloud
superclass: Element
PK�|[P�2���Kri/1.8/system/RSS/Rss/Channel/not_need_to_call_setup_maker_variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel#not_need_to_call_setup_maker_variables
is_singleton: false
name: not_need_to_call_setup_maker_variables
params: ()
visibility: private
PK�|[^�����1ri/1.8/system/RSS/Rss/Channel/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel#maker_target
is_singleton: false
name: maker_target
params: (maker)
visibility: private
PK�|['y1g**9ri/1.8/system/RSS/Rss/Channel/SkipDays/Day/cdesc-Day.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::Rss::Channel::SkipDays::Day
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
instance_methods: []

name: Day
superclass: Element
PK�|[;Ԭ���5ri/1.8/system/RSS/Rss/Channel/SkipDays/Day/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::Channel::SkipDays::Day::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[C�<��:ri/1.8/system/RSS/Rss/Channel/SkipDays/cdesc-SkipDays.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Rss::Channel::SkipDays
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
instance_methods: []

name: SkipDays
superclass: Element
PK�|[��Ȏ��$ri/1.8/system/RSS/Rss/cdesc-Rss.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: feed_version
  rw: W
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::Rss
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
- !ruby/object:RI::IncludedModule 
  name: RootElementMixin
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _attrs
- !ruby/object:RI::MethodSummary 
  name: image
- !ruby/object:RI::MethodSummary 
  name: items
- !ruby/object:RI::MethodSummary 
  name: setup_maker_elements
- !ruby/object:RI::MethodSummary 
  name: textinput
name: Rss
superclass: Element
PK�|[������ ri/1.8/system/RSS/Rss/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss::new
is_singleton: true
name: new
params: (feed_version, version=nil, encoding=nil, standalone=nil)
visibility: public
PK�|[�y"���"ri/1.8/system/RSS/Rss/items-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss#items
is_singleton: false
name: items
params: ()
visibility: public
PK�|[g+bQ��"ri/1.8/system/RSS/Rss/image-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss#image
is_singleton: false
name: image
params: ()
visibility: public
PK�|[�Fө�#ri/1.8/system/RSS/Rss/_attrs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss#_attrs
is_singleton: false
name: _attrs
params: ()
visibility: private
PK�|[3����&ri/1.8/system/RSS/Rss/textinput-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Rss#textinput
is_singleton: false
name: textinput
params: ()
visibility: public
PK�|[�$%��@ri/1.8/system/RSS/NotValidXMLParser/cdesc-NotValidXMLParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::NotValidXMLParser
includes: []

instance_methods: []

name: NotValidXMLParser
superclass: Error
PK�|[S�׶�.ri/1.8/system/RSS/NotValidXMLParser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::NotValidXMLParser::new
is_singleton: true
name: new
params: (parser)
visibility: public
PK�|[�x���(ri/1.8/system/RSS/Error/cdesc-Error.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Error
includes: []

instance_methods: []

name: Error
superclass: StandardError
PK�|[���S��@ri/1.8/system/RSS/XMLParserNotFound/cdesc-XMLParserNotFound.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::XMLParserNotFound
includes: []

instance_methods: []

name: XMLParserNotFound
superclass: Error
PK�|[2���.ri/1.8/system/RSS/XMLParserNotFound/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLParserNotFound::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[��V*��1ri/1.8/system/RSS/XMLParserParser/listener-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLParserParser::listener
is_singleton: true
name: listener
params: ()
visibility: public
PK�|[D��22<ri/1.8/system/RSS/XMLParserParser/cdesc-XMLParserParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: listener
comment: 
constants: []

full_name: RSS::XMLParserParser
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _parse
name: XMLParserParser
superclass: BaseParser
PK�|[5�U8��/ri/1.8/system/RSS/XMLParserParser/_parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLParserParser#_parse
is_singleton: false
name: _parse
params: ()
visibility: private
PK�|[��V��5ri/1.8/system/RSS/Utils/new_with_value_if_need-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: If <tt>value</tt> is an instance of class <tt>klass</tt>, return it, else create a new instance of <tt>klass</tt> with value <tt>value</tt>.
full_name: RSS::Utils#new_with_value_if_need
is_singleton: false
name: new_with_value_if_need
params: (klass, value)
visibility: public
PK�|[�QV�(ri/1.8/system/RSS/Utils/cdesc-Utils.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Utils
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: element_initialize_arguments?
- !ruby/object:RI::MethodSummary 
  name: get_file_and_line_from_caller
- !ruby/object:RI::MethodSummary 
  name: h
- !ruby/object:RI::MethodSummary 
  name: html_escape
- !ruby/object:RI::MethodSummary 
  name: new_with_value_if_need
- !ruby/object:RI::MethodSummary 
  name: to_class_name
name: Utils
superclass: 
PK�|[�o��<ri/1.8/system/RSS/Utils/get_file_and_line_from_caller-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Utils#get_file_and_line_from_caller
is_singleton: false
name: get_file_and_line_from_caller
params: (i=0)
visibility: public
PK�|[%I����>ri/1.8/system/RSS/Utils/YesCleanOther/cdesc-YesCleanOther.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Utils::YesCleanOther
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse
name: YesCleanOther
superclass: 
PK�|[x�i��2ri/1.8/system/RSS/Utils/YesCleanOther/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Utils::YesCleanOther#parse
is_singleton: false
name: parse
params: (value)
visibility: public
PK�|[x����(ri/1.8/system/RSS/Utils/CSV/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Utils::CSV#parse
is_singleton: false
name: parse
params: (value, &block)
visibility: public
PK�|[�"})��*ri/1.8/system/RSS/Utils/CSV/cdesc-CSV.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Utils::CSV
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse
name: CSV
superclass: 
PK�|[���,ri/1.8/system/RSS/Utils/to_class_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a name_with_underscores to CamelCase.
full_name: RSS::Utils#to_class_name
is_singleton: false
name: to_class_name
params: (name)
visibility: public
PK�|[�*����Eri/1.8/system/RSS/Utils/InheritedReader/inherited_array_reader-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Utils::InheritedReader#inherited_array_reader
is_singleton: false
name: inherited_array_reader
params: (constant_name)
visibility: public
PK�|[��>(��Dri/1.8/system/RSS/Utils/InheritedReader/inherited_hash_reader-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Utils::InheritedReader#inherited_hash_reader
is_singleton: false
name: inherited_hash_reader
params: (constant_name)
visibility: public
PK�|[��33?ri/1.8/system/RSS/Utils/InheritedReader/inherited_reader-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (result, klass.const_get(constant_name))
comment: 
full_name: RSS::Utils::InheritedReader#inherited_reader
is_singleton: false
name: inherited_reader
params: (constant_name) {|result, klass.const_get(constant_name)| ...}
visibility: public
PK�|[�C'��Bri/1.8/system/RSS/Utils/InheritedReader/cdesc-InheritedReader.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Utils::InheritedReader
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: inherited_array_reader
- !ruby/object:RI::MethodSummary 
  name: inherited_hash_reader
- !ruby/object:RI::MethodSummary 
  name: inherited_reader
name: InheritedReader
superclass: 
PK�|[�O�� ri/1.8/system/RSS/Utils/h-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #html_escape"
full_name: RSS::Utils#h
is_singleton: false
name: h
params: (s)
visibility: public
PK�|[��T�;;*ri/1.8/system/RSS/Utils/html_escape-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: h
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: escape '&amp;', '&quot;', '&lt;' and '&gt;' for use in HTML.
full_name: RSS::Utils#html_escape
is_singleton: false
name: html_escape
params: (s)
visibility: public
PK�|[����>ri/1.8/system/RSS/Utils/element_initialize_arguments%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Utils#element_initialize_arguments?
is_singleton: false
name: element_initialize_arguments?
params: (args)
visibility: public
PK�|[��K���-ri/1.8/system/RSS/Utils/YesOther/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Utils::YesOther#parse
is_singleton: false
name: parse
params: (value)
visibility: public
PK�|[^�.��4ri/1.8/system/RSS/Utils/YesOther/cdesc-YesOther.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Utils::YesOther
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse
name: YesOther
superclass: 
PK�|[5��(DDHri/1.8/system/RSS/OverlappedPrefixError/cdesc-OverlappedPrefixError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: prefix
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::OverlappedPrefixError
includes: []

instance_methods: []

name: OverlappedPrefixError
superclass: Error
PK�|[f���2ri/1.8/system/RSS/OverlappedPrefixError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::OverlappedPrefixError::new
is_singleton: true
name: new
params: (prefix)
visibility: public
PK�|[����<ri/1.8/system/RSS/ConversionError/cdesc-ConversionError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: from
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: string
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: to
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::ConversionError
includes: []

instance_methods: []

name: ConversionError
superclass: Error
PK�|[�~���,ri/1.8/system/RSS/ConversionError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ConversionError::new
is_singleton: true
name: new
params: (string, to, from)
visibility: public
PK�|[��xx(ri/1.8/system/RSS/RSS10/cdesc-RSS10.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: NSPOOL
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  name: ELEMENTS
  value: "[]"
full_name: RSS::RSS10
includes: []

instance_methods: []

name: RSS10
superclass: 
PK�|[͖����.ri/1.8/system/RSS/RSS10/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RSS10::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[���$ri/1.8/system/RSS/NSError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::NSError::new
is_singleton: true
name: new
params: (tag, prefix, require_uri)
visibility: public
PK�|[ުu��,ri/1.8/system/RSS/NSError/cdesc-NSError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: prefix
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: tag
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: uri
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::NSError
includes: []

instance_methods: []

name: NSError
superclass: InvalidRSSError
PK�|[LIuö�/ri/1.8/system/RSS/XMLStyleSheetMixin/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLStyleSheetMixin::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[�x�||Bri/1.8/system/RSS/XMLStyleSheetMixin/cdesc-XMLStyleSheetMixin.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: xml_stylesheets
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::XMLStyleSheetMixin
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: xml_stylesheet_pi
name: XMLStyleSheetMixin
superclass: 
PK�|[������=ri/1.8/system/RSS/XMLStyleSheetMixin/xml_stylesheet_pi-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLStyleSheetMixin#xml_stylesheet_pi
is_singleton: false
name: xml_stylesheet_pi
params: ()
visibility: private
PK�|[AW���.ri/1.8/system/RSS/RSS09/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RSS09::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[�4�mxx(ri/1.8/system/RSS/RSS09/cdesc-RSS09.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: NSPOOL
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  name: ELEMENTS
  value: "[]"
full_name: RSS::RSS09
includes: []

instance_methods: []

name: RSS09
superclass: 
PK�|[񡆸�/ri/1.8/system/RSS/XMLScanListener/entity-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLScanListener#entity
is_singleton: false
name: entity
params: (ref)
visibility: private
PK�|[r%���0ri/1.8/system/RSS/XMLScanListener/on_etag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLScanListener#on_etag
is_singleton: false
name: on_etag
params: (name)
visibility: public
PK�|[�h"���>ri/1.8/system/RSS/XMLScanListener/on_xmldecl_standalone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLScanListener#on_xmldecl_standalone
is_singleton: false
name: on_xmldecl_standalone
params: (str)
visibility: public
PK�|[��Y��:ri/1.8/system/RSS/XMLScanListener/on_attr_entityref-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLScanListener#on_attr_entityref
is_singleton: false
name: on_attr_entityref
params: (ref)
visibility: public
PK�|[����6ri/1.8/system/RSS/XMLScanListener/on_attr_value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLScanListener#on_attr_value
is_singleton: false
name: on_attr_value
params: (str)
visibility: public
PK�|[��E���:ri/1.8/system/RSS/XMLScanListener/on_stag_end_empty-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLScanListener#on_stag_end_empty
is_singleton: false
name: on_stag_end_empty
params: (name)
visibility: public
PK�|[�ӽ�8ri/1.8/system/RSS/XMLScanListener/on_attr_charref-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: on_attr_charref_hex
block_params: 
comment: 
full_name: RSS::XMLScanListener#on_attr_charref
is_singleton: false
name: on_attr_charref
params: (code)
visibility: public
PK�|[|)$��<ri/1.8/system/RSS/XMLScanListener/cdesc-XMLScanListener.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ENTITIES
  value: "{       'lt' => '<',       'gt' => '>',       'amp' => '&',       'quot' => '\"',       'apos' => '\\''"
full_name: RSS::XMLScanListener
includes: 
- !ruby/object:RI::IncludedModule 
  name: XMLScan::Visitor
- !ruby/object:RI::IncludedModule 
  name: ListenerMixin
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: entity
- !ruby/object:RI::MethodSummary 
  name: on_attr_charref
- !ruby/object:RI::MethodSummary 
  name: on_attr_charref_hex
- !ruby/object:RI::MethodSummary 
  name: on_attr_entityref
- !ruby/object:RI::MethodSummary 
  name: on_attr_value
- !ruby/object:RI::MethodSummary 
  name: on_attribute
- !ruby/object:RI::MethodSummary 
  name: on_charref
- !ruby/object:RI::MethodSummary 
  name: on_charref_hex
- !ruby/object:RI::MethodSummary 
  name: on_entityref
- !ruby/object:RI::MethodSummary 
  name: on_etag
- !ruby/object:RI::MethodSummary 
  name: on_stag
- !ruby/object:RI::MethodSummary 
  name: on_stag_end
- !ruby/object:RI::MethodSummary 
  name: on_stag_end_empty
- !ruby/object:RI::MethodSummary 
  name: on_xmldecl_encoding
- !ruby/object:RI::MethodSummary 
  name: on_xmldecl_end
- !ruby/object:RI::MethodSummary 
  name: on_xmldecl_standalone
- !ruby/object:RI::MethodSummary 
  name: on_xmldecl_version
name: XMLScanListener
superclass: BaseListener
PK�|[��C��3ri/1.8/system/RSS/XMLScanListener/on_charref-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: on_charref_hex
block_params: 
comment: 
full_name: RSS::XMLScanListener#on_charref
is_singleton: false
name: on_charref
params: (code)
visibility: public
PK�|[{�:���<ri/1.8/system/RSS/XMLScanListener/on_xmldecl_encoding-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLScanListener#on_xmldecl_encoding
is_singleton: false
name: on_xmldecl_encoding
params: (str)
visibility: public
PK�|[�e����5ri/1.8/system/RSS/XMLScanListener/on_attribute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLScanListener#on_attribute
is_singleton: false
name: on_attribute
params: (name)
visibility: public
PK�|[���к�0ri/1.8/system/RSS/XMLScanListener/on_stag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLScanListener#on_stag
is_singleton: false
name: on_stag
params: (name)
visibility: public
PK�|[���<ri/1.8/system/RSS/XMLScanListener/on_attr_charref_hex-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #on_attr_charref"
full_name: RSS::XMLScanListener#on_attr_charref_hex
is_singleton: false
name: on_attr_charref_hex
params: (code)
visibility: public
PK�|[�l��4ri/1.8/system/RSS/XMLScanListener/on_stag_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLScanListener#on_stag_end
is_singleton: false
name: on_stag_end
params: (name)
visibility: public
PK�|[,&k��;ri/1.8/system/RSS/XMLScanListener/on_xmldecl_version-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLScanListener#on_xmldecl_version
is_singleton: false
name: on_xmldecl_version
params: (str)
visibility: public
PK�|[�U7ri/1.8/system/RSS/XMLScanListener/on_charref_hex-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #on_charref"
full_name: RSS::XMLScanListener#on_charref_hex
is_singleton: false
name: on_charref_hex
params: (code)
visibility: public
PK�|[|H����7ri/1.8/system/RSS/XMLScanListener/on_xmldecl_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLScanListener#on_xmldecl_end
is_singleton: false
name: on_xmldecl_end
params: ()
visibility: public
PK�|[g�����5ri/1.8/system/RSS/XMLScanListener/on_entityref-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLScanListener#on_entityref
is_singleton: false
name: on_entityref
params: (ref)
visibility: public
PK�|[�(..8ri/1.8/system/RSS/XMLScanParser/cdesc-XMLScanParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: listener
comment: 
constants: []

full_name: RSS::XMLScanParser
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _parse
name: XMLScanParser
superclass: BaseParser
PK�|[­]���/ri/1.8/system/RSS/XMLScanParser/listener-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLScanParser::listener
is_singleton: true
name: listener
params: ()
visibility: public
PK�|[\H����-ri/1.8/system/RSS/XMLScanParser/_parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLScanParser#_parse
is_singleton: false
name: _parse
params: ()
visibility: private
PK�|[~��(��-ri/1.8/system/RSS/REXMLParser/listener-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::REXMLParser::listener
is_singleton: true
name: listener
params: ()
visibility: public
PK�|[��=v**4ri/1.8/system/RSS/REXMLParser/cdesc-REXMLParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: listener
comment: 
constants: []

full_name: RSS::REXMLParser
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _parse
name: REXMLParser
superclass: BaseParser
PK�|[44*��+ri/1.8/system/RSS/REXMLParser/_parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::REXMLParser#_parse
is_singleton: false
name: _parse
params: ()
visibility: private
PK�|[{z�c��0ri/1.8/system/RSS/NotExpectedTagError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::NotExpectedTagError::new
is_singleton: true
name: new
params: (tag, uri, parent)
visibility: public
PK�|[9�(��Dri/1.8/system/RSS/NotExpectedTagError/cdesc-NotExpectedTagError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: parent
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: tag
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: uri
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::NotExpectedTagError
includes: []

instance_methods: []

name: NotExpectedTagError
superclass: InvalidRSSError
PK�|[Y[�Ժ�2ri/1.8/system/RSS/SlashModel/cdesc-SlashModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ELEMENT_INFOS
  value: \     [      ["section"],      ["department"],      ["comments", :positive_integer],      ["hit_parade", :csv_integer],     ]
full_name: RSS::SlashModel
includes: []

instance_methods: []

name: SlashModel
superclass: 
PK�|[;%�d��3ri/1.8/system/RSS/SlashModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::SlashModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[�0�0��,ri/1.8/system/RSS/BaseListener/getter-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseListener::getter
is_singleton: true
name: getter
params: (uri, tag_name)
visibility: public
PK�|[Ub��MM6ri/1.8/system/RSS/BaseListener/cdesc-BaseListener.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: available_tags
- !ruby/object:RI::MethodSummary 
  name: class_name
- !ruby/object:RI::MethodSummary 
  name: def_get_text_element
- !ruby/object:RI::MethodSummary 
  name: getter
- !ruby/object:RI::MethodSummary 
  name: install_accessor_base
- !ruby/object:RI::MethodSummary 
  name: install_class_name
- !ruby/object:RI::MethodSummary 
  name: install_get_text_element
- !ruby/object:RI::MethodSummary 
  name: raise_for_undefined_entity?
- !ruby/object:RI::MethodSummary 
  name: register_uri
- !ruby/object:RI::MethodSummary 
  name: setter
- !ruby/object:RI::MethodSummary 
  name: uri_registered?
comment: 
constants: []

full_name: RSS::BaseListener
includes: []

instance_methods: []

name: BaseListener
superclass: Object
PK�|[�4�d,ri/1.8/system/RSS/BaseListener/setter-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: return the setter for the uri, tag_name pair, or nil.
full_name: RSS::BaseListener::setter
is_singleton: true
name: setter
params: (uri, tag_name)
visibility: public
PK�|["��!!7ri/1.8/system/RSS/BaseListener/uri_registered%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: test if this uri is registered against this name
full_name: RSS::BaseListener::uri_registered?
is_singleton: true
name: uri_registered?
params: (uri, name)
visibility: public
PK�|[J�u���:ri/1.8/system/RSS/BaseListener/def_get_text_element-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseListener::def_get_text_element
is_singleton: true
name: def_get_text_element
params: (uri, element_name, file, line)
visibility: private
PK�|['Y�E4ri/1.8/system/RSS/BaseListener/available_tags-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: return the tag_names for setters associated with uri
full_name: RSS::BaseListener::available_tags
is_singleton: true
name: available_tags
params: (uri)
visibility: public
PK�|[ ��r::8ri/1.8/system/RSS/BaseListener/install_class_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: record class_name for the supplied uri and tag_name
full_name: RSS::BaseListener::install_class_name
is_singleton: true
name: install_class_name
params: (uri, tag_name, class_name)
visibility: public
PK�|[�}���>ri/1.8/system/RSS/BaseListener/install_get_text_element-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseListener::install_get_text_element
is_singleton: true
name: install_get_text_element
params: (uri, name, accessor_base)
visibility: public
PK�|[%�yfMM0ri/1.8/system/RSS/BaseListener/class_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: retrieve class_name for the supplied uri and tag_name If it doesn't exist, capitalize the tag_name
full_name: RSS::BaseListener::class_name
is_singleton: true
name: class_name
params: (uri, tag_name)
visibility: public
PK�|[2%n

2ri/1.8/system/RSS/BaseListener/register_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: register uri against this name.
full_name: RSS::BaseListener::register_uri
is_singleton: true
name: register_uri
params: (uri, name)
visibility: public
PK�|[N��<<;ri/1.8/system/RSS/BaseListener/install_accessor_base-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: set the accessor for the uri, tag_name pair
full_name: RSS::BaseListener::install_accessor_base
is_singleton: true
name: install_accessor_base
params: (uri, tag_name, accessor_base)
visibility: private
PK�|[��z���Cri/1.8/system/RSS/BaseListener/raise_for_undefined_entity%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseListener::raise_for_undefined_entity?
is_singleton: true
name: raise_for_undefined_entity?
params: ()
visibility: public
PK�|[����9ri/1.8/system/RSS/UnsupportedMakerVersionError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::UnsupportedMakerVersionError::new
is_singleton: true
name: new
params: (version)
visibility: public
PK�|[H aWSSVri/1.8/system/RSS/UnsupportedMakerVersionError/cdesc-UnsupportedMakerVersionError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: version
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::UnsupportedMakerVersionError
includes: []

instance_methods: []

name: UnsupportedMakerVersionError
superclass: Error
PK�|[Y��8��.ri/1.8/system/RSS/ListenerMixin/tag_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ListenerMixin#tag_end
is_singleton: false
name: tag_end
params: (name)
visibility: public
PK�|[�����8ri/1.8/system/RSS/ListenerMixin/initial_start_RDF-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ListenerMixin#initial_start_RDF
is_singleton: false
name: initial_start_RDF
params: (tag_name, prefix, attrs, ns)
visibility: private
PK�|[�zշ�*ri/1.8/system/RSS/ListenerMixin/_ns-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ListenerMixin#_ns
is_singleton: false
name: _ns
params: (ns, prefix)
visibility: private
PK�|[h�ACri/1.8/system/RSS/ListenerMixin/start_have_something_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ListenerMixin#start_have_something_element
is_singleton: false
name: start_have_something_element
params: (tag_name, prefix, attrs, ns, klass)
visibility: private
PK�|[�$Õ)).ri/1.8/system/RSS/ListenerMixin/xmldecl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: set instance vars for version, encoding, standalone
full_name: RSS::ListenerMixin#xmldecl
is_singleton: false
name: xmldecl
params: (version, encoding, standalone)
visibility: public
PK�|[��
��9ri/1.8/system/RSS/ListenerMixin/collect_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ListenerMixin#collect_attributes
is_singleton: false
name: collect_attributes
params: (tag_name, prefix, attrs, ns, klass)
visibility: private
PK�|[���:ri/1.8/system/RSS/ListenerMixin/initial_start_entry-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ListenerMixin#initial_start_entry
is_singleton: false
name: initial_start_entry
params: (tag_name, prefix, attrs, ns)
visibility: private
PK�|[���Q��/ri/1.8/system/RSS/ListenerMixin/check_ns-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ListenerMixin#check_ns
is_singleton: false
name: check_ns
params: (tag_name, prefix, ns, require_uri)
visibility: private
PK�|[��ۡ��8ri/1.8/system/RSS/ListenerMixin/initial_start_rss-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ListenerMixin#initial_start_rss
is_singleton: false
name: initial_start_rss
params: (tag_name, prefix, attrs, ns)
visibility: private
PK�|[A>��9ri/1.8/system/RSS/ListenerMixin/initial_start_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ListenerMixin#initial_start_feed
is_singleton: false
name: initial_start_feed
params: (tag_name, prefix, attrs, ns)
visibility: private
PK�|[*.k/��9ri/1.8/system/RSS/ListenerMixin/setup_next_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ListenerMixin#setup_next_element
is_singleton: false
name: setup_next_element
params: (tag_name, klass, attributes)
visibility: private
PK�|[%L�Ǭ�*ri/1.8/system/RSS/ListenerMixin/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ListenerMixin::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[��F���9ri/1.8/system/RSS/ListenerMixin/start_else_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ListenerMixin#start_else_element
is_singleton: false
name: start_else_element
params: (local, prefix, attrs, ns)
visibility: private
PK�|[�`R��2ri/1.8/system/RSS/ListenerMixin/instruction-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ListenerMixin#instruction
is_singleton: false
name: instruction
params: (name, content)
visibility: public
PK�|[���7ri/1.8/system/RSS/ListenerMixin/parse_pi_content-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Extract the first name=&quot;value&quot; pair from content. Works with single quotes according to the constant CONTENT_PATTERN. Return a Hash.
full_name: RSS::ListenerMixin#parse_pi_content
is_singleton: false
name: parse_pi_content
params: (content)
visibility: private
PK�|[Y�M���=ri/1.8/system/RSS/ListenerMixin/start_get_text_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ListenerMixin#start_get_text_element
is_singleton: false
name: start_get_text_element
params: (tag_name, prefix, ns, required_uri)
visibility: private
PK�|[�����8ri/1.8/system/RSS/ListenerMixin/cdesc-ListenerMixin.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: do_validate
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: ignore_unknown_element
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: rss
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: CONTENT_PATTERN
  value: /\s*([^=]+)=(["'])([^\2]+?)\2/
- !ruby/object:RI::Constant 
  comment: 
  name: NAMESPLIT
  value: /^(?:([\w:][-\w\d.]*):)?([\w:][-\w\d.]*)/
full_name: RSS::ListenerMixin
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _ns
- !ruby/object:RI::MethodSummary 
  name: check_ns
- !ruby/object:RI::MethodSummary 
  name: collect_attributes
- !ruby/object:RI::MethodSummary 
  name: initial_start_RDF
- !ruby/object:RI::MethodSummary 
  name: initial_start_entry
- !ruby/object:RI::MethodSummary 
  name: initial_start_feed
- !ruby/object:RI::MethodSummary 
  name: initial_start_rss
- !ruby/object:RI::MethodSummary 
  name: instruction
- !ruby/object:RI::MethodSummary 
  name: parse_pi_content
- !ruby/object:RI::MethodSummary 
  name: setup_next_element
- !ruby/object:RI::MethodSummary 
  name: split_name
- !ruby/object:RI::MethodSummary 
  name: start_else_element
- !ruby/object:RI::MethodSummary 
  name: start_get_text_element
- !ruby/object:RI::MethodSummary 
  name: start_have_something_element
- !ruby/object:RI::MethodSummary 
  name: tag_end
- !ruby/object:RI::MethodSummary 
  name: tag_start
- !ruby/object:RI::MethodSummary 
  name: text
- !ruby/object:RI::MethodSummary 
  name: xmldecl
name: ListenerMixin
superclass: 
PK�|[�ȫ��+ri/1.8/system/RSS/ListenerMixin/text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ListenerMixin#text
is_singleton: false
name: text
params: (data)
visibility: public
PK�|[{|����0ri/1.8/system/RSS/ListenerMixin/tag_start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ListenerMixin#tag_start
is_singleton: false
name: tag_start
params: (name, attributes)
visibility: public
PK�|[����1ri/1.8/system/RSS/ListenerMixin/split_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ListenerMixin#split_name
is_singleton: false
name: split_name
params: (name)
visibility: private
PK�|[|�����;ri/1.8/system/RSS/Converter/def_uconv_convert_if_can-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Converter#def_uconv_convert_if_can
is_singleton: false
name: def_uconv_convert_if_can
params: (meth, to_enc, from_enc, nkf_arg)
visibility: public
PK�|[T�o��>ri/1.8/system/RSS/Converter/def_to_shift_jis_from_utf_8-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Converter#def_to_shift_jis_from_utf_8
is_singleton: false
name: def_to_shift_jis_from_utf_8
params: ()
visibility: public
PK�|[�ٓz��*ri/1.8/system/RSS/Converter/convert-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Converter#convert
is_singleton: false
name: convert
params: (value)
visibility: public
PK�|[P���>ri/1.8/system/RSS/Converter/def_to_utf_8_from_shift_jis-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Converter#def_to_utf_8_from_shift_jis
is_singleton: false
name: def_to_utf_8_from_shift_jis
params: ()
visibility: public
PK�|[w�c��4ri/1.8/system/RSS/Converter/def_iconv_convert-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Converter#def_iconv_convert
is_singleton: false
name: def_iconv_convert
params: (to_enc, from_enc, depth=0)
visibility: public
PK�|[��S��Ari/1.8/system/RSS/Converter/def_to_euc_jp_from_iso_2022_jp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Converter#def_to_euc_jp_from_iso_2022_jp
is_singleton: false
name: def_to_euc_jp_from_iso_2022_jp
params: ()
visibility: public
PK�|[0$�w��/ri/1.8/system/RSS/Converter/def_same_enc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Converter#def_same_enc
is_singleton: false
name: def_same_enc
params: ()
visibility: public
PK�|[o�C��?ri/1.8/system/RSS/Converter/def_to_shift_jis_from_euc_jp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Converter#def_to_shift_jis_from_euc_jp
is_singleton: false
name: def_to_shift_jis_from_euc_jp
params: ()
visibility: public
PK�|[����&ri/1.8/system/RSS/Converter/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Converter::new
is_singleton: true
name: new
params: (to_enc, from_enc=nil)
visibility: public
PK�|[�OI//0ri/1.8/system/RSS/Converter/cdesc-Converter.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::Converter
includes: 
- !ruby/object:RI::IncludedModule 
  name: Utils
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: convert
- !ruby/object:RI::MethodSummary 
  name: def_convert
- !ruby/object:RI::MethodSummary 
  name: def_else_enc
- !ruby/object:RI::MethodSummary 
  name: def_iconv_convert
- !ruby/object:RI::MethodSummary 
  name: def_same_enc
- !ruby/object:RI::MethodSummary 
  name: def_to_euc_jp_from_iso_2022_jp
- !ruby/object:RI::MethodSummary 
  name: def_to_euc_jp_from_shift_jis
- !ruby/object:RI::MethodSummary 
  name: def_to_euc_jp_from_utf_8
- !ruby/object:RI::MethodSummary 
  name: def_to_iso_2022_jp_from_euc_jp
- !ruby/object:RI::MethodSummary 
  name: def_to_iso_8859_1_from_utf_8
- !ruby/object:RI::MethodSummary 
  name: def_to_shift_jis_from_euc_jp
- !ruby/object:RI::MethodSummary 
  name: def_to_shift_jis_from_utf_8
- !ruby/object:RI::MethodSummary 
  name: def_to_utf_8_from_euc_jp
- !ruby/object:RI::MethodSummary 
  name: def_to_utf_8_from_iso_8859_1
- !ruby/object:RI::MethodSummary 
  name: def_to_utf_8_from_shift_jis
- !ruby/object:RI::MethodSummary 
  name: def_uconv_convert_if_can
name: Converter
superclass: Object
PK�|[�	���?ri/1.8/system/RSS/Converter/def_to_utf_8_from_iso_8859_1-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Converter#def_to_utf_8_from_iso_8859_1
is_singleton: false
name: def_to_utf_8_from_iso_8859_1
params: ()
visibility: public
PK�|[%G���?ri/1.8/system/RSS/Converter/def_to_euc_jp_from_shift_jis-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Converter#def_to_euc_jp_from_shift_jis
is_singleton: false
name: def_to_euc_jp_from_shift_jis
params: ()
visibility: public
PK�|[�B�_��?ri/1.8/system/RSS/Converter/def_to_iso_8859_1_from_utf_8-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Converter#def_to_iso_8859_1_from_utf_8
is_singleton: false
name: def_to_iso_8859_1_from_utf_8
params: ()
visibility: public
PK�|[��"��;ri/1.8/system/RSS/Converter/def_to_euc_jp_from_utf_8-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Converter#def_to_euc_jp_from_utf_8
is_singleton: false
name: def_to_euc_jp_from_utf_8
params: ()
visibility: public
PK�|[��̷��.ri/1.8/system/RSS/Converter/def_convert-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Converter#def_convert
is_singleton: false
name: def_convert
params: (depth=0)
visibility: public
PK�|[�΅���Ari/1.8/system/RSS/Converter/def_to_iso_2022_jp_from_euc_jp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Converter#def_to_iso_2022_jp_from_euc_jp
is_singleton: false
name: def_to_iso_2022_jp_from_euc_jp
params: ()
visibility: public
PK�|[���v��/ri/1.8/system/RSS/Converter/def_else_enc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Converter#def_else_enc
is_singleton: false
name: def_else_enc
params: (to_enc, from_enc)
visibility: public
PK�|[��e���;ri/1.8/system/RSS/Converter/def_to_utf_8_from_euc_jp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Converter#def_to_utf_8_from_euc_jp
is_singleton: false
name: def_to_utf_8_from_euc_jp
params: ()
visibility: public
PK�|[d��1��<ri/1.8/system/RSS/InvalidRSSError/cdesc-InvalidRSSError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::InvalidRSSError
includes: []

instance_methods: []

name: InvalidRSSError
superclass: Error
PK�|[���Zri/1.8/system/RSS/Maker/AtomTextConstructBase/EnsureXMLContent/cdesc-EnsureXMLContent.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: included
comment: 
constants: []

full_name: RSS::Maker::AtomTextConstructBase::EnsureXMLContent
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ensure_xml_content
- !ruby/object:RI::MethodSummary 
  name: set_xhtml_uri_as_default_uri
- !ruby/object:RI::MethodSummary 
  name: xhtml=
- !ruby/object:RI::MethodSummary 
  name: xml_content=
name: EnsureXMLContent
superclass: 
PK�|[[�7��Tri/1.8/system/RSS/Maker/AtomTextConstructBase/EnsureXMLContent/xml_content%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomTextConstructBase::EnsureXMLContent#xml_content=
is_singleton: false
name: xml_content=
params: (content)
visibility: public
PK�|[������Xri/1.8/system/RSS/Maker/AtomTextConstructBase/EnsureXMLContent/ensure_xml_content-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomTextConstructBase::EnsureXMLContent#ensure_xml_content
is_singleton: false
name: ensure_xml_content
params: (content)
visibility: public
PK�|[Y���bri/1.8/system/RSS/Maker/AtomTextConstructBase/EnsureXMLContent/set_xhtml_uri_as_default_uri-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomTextConstructBase::EnsureXMLContent#set_xhtml_uri_as_default_uri
is_singleton: false
name: set_xhtml_uri_as_default_uri
params: (children)
visibility: private
PK�|[��5��Nri/1.8/system/RSS/Maker/AtomTextConstructBase/EnsureXMLContent/xhtml%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomTextConstructBase::EnsureXMLContent#xhtml=
is_singleton: false
name: xhtml=
params: (content)
visibility: public
PK�|[>�{��Nri/1.8/system/RSS/Maker/AtomTextConstructBase/EnsureXMLContent/included-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomTextConstructBase::EnsureXMLContent::included
is_singleton: true
name: included
params: (base)
visibility: public
PK�|[%ȃ%��Dri/1.8/system/RSS/Maker/AtomTextConstructBase/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomTextConstructBase::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[�v@�MMNri/1.8/system/RSS/Maker/AtomTextConstructBase/cdesc-AtomTextConstructBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: []

full_name: RSS::Maker::AtomTextConstructBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: EnsureXMLContent
instance_methods: []

name: AtomTextConstructBase
superclass: 
PK�|[�D���?ri/1.8/system/RSS/Maker/AtomLogo/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomLogo#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[�֗E��/ri/1.8/system/RSS/Maker/AtomLogo/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomLogo#to_feed
is_singleton: false
name: to_feed
params: (feed, current)
visibility: public
PK�|[��y444ri/1.8/system/RSS/Maker/AtomLogo/cdesc-AtomLogo.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::AtomLogo
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: AtomLogo
superclass: 
PK�|[� �KKHri/1.8/system/RSS/Maker/TaxonomyTopicModel/cdesc-TaxonomyTopicModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
- !ruby/object:RI::MethodSummary 
  name: install_taxo_topic
comment: 
constants: []

full_name: RSS::Maker::TaxonomyTopicModel
includes: []

instance_methods: []

name: TaxonomyTopicModel
superclass: 
PK�|[E���Ari/1.8/system/RSS/Maker/TaxonomyTopicModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::TaxonomyTopicModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[�J+���[ri/1.8/system/RSS/Maker/TaxonomyTopicModel/TaxonomyTopicsBase/cdesc-TaxonomyTopicsBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::TaxonomyTopicModel::TaxonomyTopicsBase
includes: []

instance_methods: []

name: TaxonomyTopicsBase
superclass: Base
PK�|[�DI���lri/1.8/system/RSS/Maker/TaxonomyTopicModel/TaxonomyTopicsBase/TaxonomyTopicBase/cdesc-TaxonomyTopicBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: value
  rw: RW
class_methods: []

comment: 
constants: []

full_name: RSS::Maker::TaxonomyTopicModel::TaxonomyTopicsBase::TaxonomyTopicBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: DublinCoreModel
- !ruby/object:RI::IncludedModule 
  name: TaxonomyTopicsModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: have_required_values?
name: TaxonomyTopicBase
superclass: Base
PK�|[_��nri/1.8/system/RSS/Maker/TaxonomyTopicModel/TaxonomyTopicsBase/TaxonomyTopicBase/have_required_values%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::TaxonomyTopicModel::TaxonomyTopicsBase::TaxonomyTopicBase#have_required_values?
is_singleton: false
name: have_required_values?
params: ()
visibility: public
PK�|[
�����Dri/1.8/system/RSS/Maker/TaxonomyTopicModel/install_taxo_topic-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::TaxonomyTopicModel::install_taxo_topic
is_singleton: true
name: install_taxo_topic
params: (klass)
visibility: public
PK�|[��S$��0ri/1.8/system/RSS/Maker/Base/setup_values-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base#setup_values
is_singleton: false
name: setup_values
params: (target)
visibility: private
PK�|[��n���7ri/1.8/system/RSS/Maker/Base/_set_default_values-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
full_name: RSS::Maker::Base#_set_default_values
is_singleton: false
name: _set_default_values
params: (&block) {|| ...}
visibility: private
PK�|[�N����3ri/1.8/system/RSS/Maker/Base/current_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base#current_element
is_singleton: false
name: current_element
params: (feed)
visibility: private
PK�|[?hM���-ri/1.8/system/RSS/Maker/Base/variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base#variables
is_singleton: false
name: variables
params: ()
visibility: private
PK�|[`�E���8ri/1.8/system/RSS/Maker/Base/setup_other_elements-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base#setup_other_elements
is_singleton: false
name: setup_other_elements
params: (feed, current=nil)
visibility: private
PK�|[2�U4��5ri/1.8/system/RSS/Maker/Base/add_other_element-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base::add_other_element
is_singleton: true
name: add_other_element
params: (variable_name)
visibility: public
PK�|[79f���2ri/1.8/system/RSS/Maker/Base/inherited_base-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base::inherited_base
is_singleton: true
name: inherited_base
params: ()
visibility: public
PK�|[It�Fri/1.8/system/RSS/Maker/Base/def_other_element_without_accessor-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base::def_other_element_without_accessor
is_singleton: true
name: def_other_element_without_accessor
params: (name)
visibility: public
PK�|[iu
�8ri/1.8/system/RSS/Maker/Base/def_classed_elements-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (local_variable_name,                                           new_value_variable_name)
comment: 
full_name: RSS::Maker::Base::def_classed_elements
is_singleton: true
name: def_classed_elements
params: (name, attribute, plural_class_name=nil, plural_name=nil, new_name=nil) {|local_variable_name, new_value_variable_name| ...}
visibility: public
PK�|[�Z��@ri/1.8/system/RSS/Maker/Base/add_need_initialize_variable-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base::add_need_initialize_variable
is_singleton: true
name: add_need_initialize_variable
params: (variable_name, init_value="nil")
visibility: public
PK�|[JJzK��.ri/1.8/system/RSS/Maker/Base/set_parent-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base#set_parent
is_singleton: false
name: set_parent
params: (target, parent)
visibility: private
PK�|[\�R���6ri/1.8/system/RSS/Maker/Base/variable_is_set%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base#variable_is_set?
is_singleton: false
name: variable_is_set?
params: ()
visibility: public
PK�|[k�:��;ri/1.8/system/RSS/Maker/Base/have_required_values%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base#have_required_values?
is_singleton: false
name: have_required_values?
params: ()
visibility: public
PK�|[������3ri/1.8/system/RSS/Maker/Base/def_csv_element-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base::def_csv_element
is_singleton: true
name: def_csv_element
params: (name, type=nil)
visibility: public
PK�|[70A�6ri/1.8/system/RSS/Maker/Base/set_default_values-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: if @default_values_are_set
comment: 
full_name: RSS::Maker::Base#set_default_values
is_singleton: false
name: set_default_values
params: (&block) {|if @default_values_are_set| ...}
visibility: private
PK�|[fq�&��'ri/1.8/system/RSS/Maker/Base/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base::new
is_singleton: true
name: new
params: (maker)
visibility: public
PK�|[�eC��8ri/1.8/system/RSS/Maker/Base/initialize_variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base#initialize_variables
is_singleton: false
name: initialize_variables
params: ()
visibility: private
PK�|[��U��Ari/1.8/system/RSS/Maker/Base/required_variables_are_set%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base#required_variables_are_set?
is_singleton: false
name: required_variables_are_set?
params: ()
visibility: private
PK�|[y���,ri/1.8/system/RSS/Maker/Base/cdesc-Base.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: maker
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_need_initialize_variable
- !ruby/object:RI::MethodSummary 
  name: add_other_element
- !ruby/object:RI::MethodSummary 
  name: def_array_element
- !ruby/object:RI::MethodSummary 
  name: def_classed_element
- !ruby/object:RI::MethodSummary 
  name: def_classed_element_without_accessor
- !ruby/object:RI::MethodSummary 
  name: def_classed_elements
- !ruby/object:RI::MethodSummary 
  name: def_csv_element
- !ruby/object:RI::MethodSummary 
  name: def_other_element
- !ruby/object:RI::MethodSummary 
  name: def_other_element_without_accessor
- !ruby/object:RI::MethodSummary 
  name: inherited
- !ruby/object:RI::MethodSummary 
  name: inherited_base
- !ruby/object:RI::MethodSummary 
  name: need_initialize_variables
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: other_elements
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: OTHER_ELEMENTS
  value: "[]"
- !ruby/object:RI::Constant 
  comment: 
  name: NEED_INITIALIZE_VARIABLES
  value: "[]"
full_name: RSS::Maker::Base
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _set_default_values
- !ruby/object:RI::MethodSummary 
  name: current_element
- !ruby/object:RI::MethodSummary 
  name: have_required_values?
- !ruby/object:RI::MethodSummary 
  name: initialize_variables
- !ruby/object:RI::MethodSummary 
  name: not_set_required_variables
- !ruby/object:RI::MethodSummary 
  name: required_variables_are_set?
- !ruby/object:RI::MethodSummary 
  name: set_default_values
- !ruby/object:RI::MethodSummary 
  name: set_parent
- !ruby/object:RI::MethodSummary 
  name: setup_other_elements
- !ruby/object:RI::MethodSummary 
  name: setup_values
- !ruby/object:RI::MethodSummary 
  name: variable_is_set?
- !ruby/object:RI::MethodSummary 
  name: variables
name: Base
superclass: Object
PK�|[�0'Hri/1.8/system/RSS/Maker/Base/def_classed_element_without_accessor-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base::def_classed_element_without_accessor
is_singleton: true
name: def_classed_element_without_accessor
params: (name, class_name=nil)
visibility: public
PK�|['�q���7ri/1.8/system/RSS/Maker/Base/def_classed_element-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base::def_classed_element
is_singleton: true
name: def_classed_element
params: (name, class_name=nil, attribute_name=nil)
visibility: public
PK�|[��|���2ri/1.8/system/RSS/Maker/Base/other_elements-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base::other_elements
is_singleton: true
name: other_elements
params: ()
visibility: public
PK�|[AJ���5ri/1.8/system/RSS/Maker/Base/def_array_element-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base::def_array_element
is_singleton: true
name: def_array_element
params: (name, plural=nil, klass_name=nil)
visibility: public
PK�|[��p��-ri/1.8/system/RSS/Maker/Base/inherited-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base::inherited
is_singleton: true
name: inherited
params: (subclass)
visibility: public
PK�|[�x~��>ri/1.8/system/RSS/Maker/Base/not_set_required_variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base#not_set_required_variables
is_singleton: false
name: not_set_required_variables
params: ()
visibility: private
PK�|[�� ���=ri/1.8/system/RSS/Maker/Base/need_initialize_variables-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base::need_initialize_variables
is_singleton: true
name: need_initialize_variables
params: ()
visibility: public
PK�|[:47��5ri/1.8/system/RSS/Maker/Base/def_other_element-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Base::def_other_element
is_singleton: true
name: def_other_element
params: (name)
visibility: public
PK�|[�.��>>>ri/1.8/system/RSS/Maker/AtomGenerator/cdesc-AtomGenerator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::AtomGenerator
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: AtomGenerator
superclass: 
PK�|[2�4��Dri/1.8/system/RSS/Maker/AtomGenerator/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomGenerator#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[�K����4ri/1.8/system/RSS/Maker/AtomGenerator/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomGenerator#to_feed
is_singleton: false
name: to_feed
params: (feed, current)
visibility: public
PK�|[��b���?ri/1.8/system/RSS/Maker/AtomLink/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomLink#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[�Dt���/ri/1.8/system/RSS/Maker/AtomLink/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomLink#to_feed
is_singleton: false
name: to_feed
params: (feed, current)
visibility: public
PK�|[K�!�444ri/1.8/system/RSS/Maker/AtomLink/cdesc-AtomLink.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::AtomLink
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: AtomLink
superclass: 
PK�|[]��Z��?ri/1.8/system/RSS/Maker/SyndicationModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::SyndicationModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[�'��

Dri/1.8/system/RSS/Maker/SyndicationModel/cdesc-SyndicationModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: []

full_name: RSS::Maker::SyndicationModel
includes: []

instance_methods: []

name: SyndicationModel
superclass: 
PK�|[�}��5ri/1.8/system/RSS/Maker/AtomCategory/variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomCategory#variables
is_singleton: false
name: variables
params: ()
visibility: private
PK�|[h�n�pp<ri/1.8/system/RSS/Maker/AtomCategory/cdesc-AtomCategory.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::AtomCategory
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
- !ruby/object:RI::MethodSummary 
  name: variables
name: AtomCategory
superclass: 
PK�|[�wV��Cri/1.8/system/RSS/Maker/AtomCategory/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomCategory#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[s�Vb��3ri/1.8/system/RSS/Maker/AtomCategory/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomCategory#to_feed
is_singleton: false
name: to_feed
params: (feed, current)
visibility: public
PK�|[�ʜ���Ari/1.8/system/RSS/Maker/ITunesChannelModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ITunesChannelModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[�
2��Yri/1.8/system/RSS/Maker/ITunesChannelModel/ITunesOwnerBase/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ITunesChannelModel::ITunesOwnerBase#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[��R��Iri/1.8/system/RSS/Maker/ITunesChannelModel/ITunesOwnerBase/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ITunesChannelModel::ITunesOwnerBase#to_feed
is_singleton: false
name: to_feed
params: (feed, current)
visibility: public
PK�|[�V/�ZZUri/1.8/system/RSS/Maker/ITunesChannelModel/ITunesOwnerBase/cdesc-ITunesOwnerBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ITunesChannelModel::ITunesOwnerBase
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: ITunesOwnerBase
superclass: Base
PK�|[���0��pri/1.8/system/RSS/Maker/ITunesChannelModel/ITunesCategoriesBase/ITunesCategoryBase/cdesc-ITunesCategoryBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: text
  rw: RW
class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ITunesChannelModel::ITunesCategoriesBase::ITunesCategoryBase
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: have_required_values?
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: ITunesCategoryBase
superclass: Base
PK�|[I�"�qri/1.8/system/RSS/Maker/ITunesChannelModel/ITunesCategoriesBase/ITunesCategoryBase/have_required_values%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ITunesChannelModel::ITunesCategoriesBase::ITunesCategoryBase#have_required_values?
is_singleton: false
name: have_required_values?
params: ()
visibility: public
PK�|[��RI��ari/1.8/system/RSS/Maker/ITunesChannelModel/ITunesCategoriesBase/ITunesCategoryBase/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ITunesChannelModel::ITunesCategoriesBase::ITunesCategoryBase#to_feed
is_singleton: false
name: to_feed
params: (feed, current)
visibility: public
PK�|[R9���_ri/1.8/system/RSS/Maker/ITunesChannelModel/ITunesCategoriesBase/cdesc-ITunesCategoriesBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ITunesChannelModel::ITunesCategoriesBase
includes: []

instance_methods: []

name: ITunesCategoriesBase
superclass: Base
PK�|[^*�D��Iri/1.8/system/RSS/Maker/ITunesChannelModel/ITunesImageBase/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ITunesChannelModel::ITunesImageBase#to_feed
is_singleton: false
name: to_feed
params: (feed, current)
visibility: public
PK�|[PϠ�UUUri/1.8/system/RSS/Maker/ITunesChannelModel/ITunesImageBase/cdesc-ITunesImageBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: href
  rw: RW
class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ITunesChannelModel::ITunesImageBase
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: ITunesImageBase
superclass: Base
PK�|[*�<�Hri/1.8/system/RSS/Maker/ITunesChannelModel/cdesc-ITunesChannelModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: []

full_name: RSS::Maker::ITunesChannelModel
includes: []

instance_methods: []

name: ITunesChannelModel
superclass: 
PK�|[��D�CC@ri/1.8/system/RSS/Maker/ImageItemModel/cdesc-ImageItemModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
- !ruby/object:RI::MethodSummary 
  name: install_image_item
comment: 
constants: []

full_name: RSS::Maker::ImageItemModel
includes: []

instance_methods: []

name: ImageItemModel
superclass: 
PK�|[�h�4��=ri/1.8/system/RSS/Maker/ImageItemModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ImageItemModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[�����@ri/1.8/system/RSS/Maker/ImageItemModel/install_image_item-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ImageItemModel::install_image_item
is_singleton: true
name: install_image_item
params: (klass)
visibility: public
PK�|[=�{Ǡ�Mri/1.8/system/RSS/Maker/ImageItemModel/ImageItemBase/cdesc-ImageItemBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: about
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: image_height
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: image_width
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: resource
  rw: RW
class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ImageItemModel::ImageItemBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: Maker::DublinCoreModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: have_required_values?
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: ImageItemBase
superclass: Base
PK�|[�R����Sri/1.8/system/RSS/Maker/ImageItemModel/ImageItemBase/have_required_values%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ImageItemModel::ImageItemBase#have_required_values?
is_singleton: false
name: have_required_values?
params: ()
visibility: public
PK�|[\�8*��Cri/1.8/system/RSS/Maker/ImageItemModel/ImageItemBase/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ImageItemModel::ImageItemBase#to_feed
is_singleton: false
name: to_feed
params: (feed, current)
visibility: public
PK�|[h6�
��Iri/1.8/system/RSS/Maker/ITunesItemModel/ITunesDurationBase/hour%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ITunesItemModel::ITunesDurationBase#hour=
is_singleton: false
name: hour=
params: (hour)
visibility: public
PK�|[�9���Kri/1.8/system/RSS/Maker/ITunesItemModel/ITunesDurationBase/minute%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ITunesItemModel::ITunesDurationBase#minute=
is_singleton: false
name: minute=
params: (minute)
visibility: public
PK�|[���,��Lri/1.8/system/RSS/Maker/ITunesItemModel/ITunesDurationBase/content%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ITunesItemModel::ITunesDurationBase#content=
is_singleton: false
name: content=
params: (content)
visibility: public
PK�|[�5o��Kri/1.8/system/RSS/Maker/ITunesItemModel/ITunesDurationBase/second%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ITunesItemModel::ITunesDurationBase#second=
is_singleton: false
name: second=
params: (second)
visibility: public
PK�|[kl��Pri/1.8/system/RSS/Maker/ITunesItemModel/ITunesDurationBase/update_content-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ITunesItemModel::ITunesDurationBase#update_content
is_singleton: false
name: update_content
params: ()
visibility: private
PK�|[�����Iri/1.8/system/RSS/Maker/ITunesItemModel/ITunesDurationBase/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ITunesItemModel::ITunesDurationBase#to_feed
is_singleton: false
name: to_feed
params: (feed, current)
visibility: public
PK�|[3E��ZZXri/1.8/system/RSS/Maker/ITunesItemModel/ITunesDurationBase/cdesc-ITunesDurationBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: content
  rw: R
class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ITunesItemModel::ITunesDurationBase
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: content=
- !ruby/object:RI::MethodSummary 
  name: hour=
- !ruby/object:RI::MethodSummary 
  name: minute=
- !ruby/object:RI::MethodSummary 
  name: second=
- !ruby/object:RI::MethodSummary 
  name: to_feed
- !ruby/object:RI::MethodSummary 
  name: update_content
name: ITunesDurationBase
superclass: Base
PK�|[��ğBri/1.8/system/RSS/Maker/ITunesItemModel/cdesc-ITunesItemModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: []

full_name: RSS::Maker::ITunesItemModel
includes: []

instance_methods: []

name: ITunesItemModel
superclass: 
PK�|[�����>ri/1.8/system/RSS/Maker/ITunesItemModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ITunesItemModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[�D*��>ri/1.8/system/RSS/Maker/DublinCoreModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::DublinCoreModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[�Z�FFBri/1.8/system/RSS/Maker/DublinCoreModel/cdesc-DublinCoreModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
- !ruby/object:RI::MethodSummary 
  name: install_dublin_core
comment: 
constants: []

full_name: RSS::Maker::DublinCoreModel
includes: []

instance_methods: []

name: DublinCoreModel
superclass: 
PK�|[�Q����Bri/1.8/system/RSS/Maker/DublinCoreModel/install_dublin_core-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::DublinCoreModel::install_dublin_core
is_singleton: true
name: install_dublin_core
params: (klass)
visibility: public
PK�|[21]4��$ri/1.8/system/RSS/Maker/maker-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::maker
is_singleton: true
name: maker
params: (version)
visibility: public
PK�|[{�|µ�#ri/1.8/system/RSS/Maker/make-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::make
is_singleton: true
name: make
params: (version, &block)
visibility: public
PK�|[vȹ���-ri/1.8/system/RSS/Maker/ImageBase/link-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ImageBase#link
is_singleton: false
name: link
params: ()
visibility: public
PK�|[}_e//6ri/1.8/system/RSS/Maker/ImageBase/cdesc-ImageBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ImageBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: DublinCoreModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: link
name: ImageBase
superclass: Object
PK�|[�a����Fri/1.8/system/RSS/Maker/AtomPersonConstructBase/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomPersonConstructBase::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[�QibRri/1.8/system/RSS/Maker/AtomPersonConstructBase/cdesc-AtomPersonConstructBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: []

full_name: RSS::Maker::AtomPersonConstructBase
includes: []

instance_methods: []

name: AtomPersonConstructBase
superclass: 
PK�|[εF���Mri/1.8/system/RSS/Maker/RSS10/Items/Item/Title/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Title#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[tWb�KK?ri/1.8/system/RSS/Maker/RSS10/Items/Item/Title/cdesc-Title.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Title
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Title
superclass: TitleBase
PK�|[��g3��=ri/1.8/system/RSS/Maker/RSS10/Items/Item/Title/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Title#to_feed
is_singleton: false
name: to_feed
params: (rss, item)
visibility: public
PK�|[۾ <��Cri/1.8/system/RSS/Maker/RSS10/Items/Item/Links/Link/cdesc-Link.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Links::Link
includes: []

instance_methods: []

name: Link
superclass: LinkBase
PK�|["l�		?ri/1.8/system/RSS/Maker/RSS10/Items/Item/Links/cdesc-Links.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Links
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Links
superclass: LinksBase
PK�|[�>���=ri/1.8/system/RSS/Maker/RSS10/Items/Item/Links/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Links#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[�R�Fri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Title/cdesc-Title.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Source::Title
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Title
superclass: TitleBase
PK�|[�K�W��Dri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Title/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Source::Title#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[+�#��Jri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Links/Link/cdesc-Link.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Source::Links::Link
includes: []

instance_methods: []

name: Link
superclass: LinkBase
PK�|[��E�Fri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Links/cdesc-Links.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Source::Links
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Links
superclass: LinksBase
PK�|[D�	9��Dri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Links/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Source::Links#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[�o�/Lri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Subtitle/cdesc-Subtitle.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Source::Subtitle
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Subtitle
superclass: SubtitleBase
PK�|[[/�U��Gri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Subtitle/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Source::Subtitle#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[j�(�Dri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Logo/cdesc-Logo.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Source::Logo
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Logo
superclass: LogoBase
PK�|[��k��Cri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Logo/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Source::Logo#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[Q��_ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Contributors/Contributor/cdesc-Contributor.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Source::Contributors::Contributor
includes: []

instance_methods: []

name: Contributor
superclass: ContributorBase
PK�|[R����Kri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Contributors/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Source::Contributors#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[��&&Tri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Contributors/cdesc-Contributors.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Source::Contributors
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Contributors
superclass: ContributorsBase
PK�|[!jƏ��>ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Source#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[��|���Eri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Rights/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Source::Rights#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[�R<�Hri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Rights/cdesc-Rights.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Source::Rights
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Rights
superclass: RightsBase
PK�|[$�GNri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Generator/cdesc-Generator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Source::Generator
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Generator
superclass: GeneratorBase
PK�|[.��'��Hri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Generator/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Source::Generator#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[F���Ari/1.8/system/RSS/Maker/RSS10/Items/Item/Source/cdesc-Source.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Source
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Source
superclass: SourceBase
PK�|[.@/��Cri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Icon/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Source::Icon#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[���Dri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Icon/cdesc-Icon.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Source::Icon
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Icon
superclass: IconBase
PK�|[�K=;��Pri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Authors/Author/cdesc-Author.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Source::Authors::Author
includes: []

instance_methods: []

name: Author
superclass: AuthorBase
PK�|[�+����Fri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Authors/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Source::Authors#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[5:|�Jri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Authors/cdesc-Authors.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Source::Authors
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Authors
superclass: AuthorsBase
PK�|[�C  Pri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Categories/cdesc-Categories.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Source::Categories
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Categories
superclass: CategoriesBase
PK�|[l$0w��Wri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Categories/Category/cdesc-Category.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Source::Categories::Category
includes: []

instance_methods: []

name: Category
superclass: CategoryBase
PK�|[��P��Iri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Categories/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Source::Categories#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[f��E��9ri/1.8/system/RSS/Maker/RSS10/Items/Item/variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item#variables
is_singleton: false
name: variables
params: ()
visibility: private
PK�|[����Gri/1.8/system/RSS/Maker/RSS10/Items/Item/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[��\5��Xri/1.8/system/RSS/Maker/RSS10/Items/Item/Contributors/Contributor/cdesc-Contributor.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Contributors::Contributor
includes: []

instance_methods: []

name: Contributor
superclass: ContributorBase
PK�|[����Dri/1.8/system/RSS/Maker/RSS10/Items/Item/Contributors/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Contributors#to_feed
is_singleton: false
name: to_feed
params: (rss, item)
visibility: public
PK�|[0|QAMri/1.8/system/RSS/Maker/RSS10/Items/Item/Contributors/cdesc-Contributors.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Contributors
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Contributors
superclass: ContributorsBase
PK�|[/p�0��7ri/1.8/system/RSS/Maker/RSS10/Items/Item/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item#to_feed
is_singleton: false
name: to_feed
params: (rss)
visibility: public
PK�|[�0|��?ri/1.8/system/RSS/Maker/RSS10/Items/Item/Content/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Content#to_feed
is_singleton: false
name: to_feed
params: (rss, item)
visibility: public
PK�|[�Z�ACri/1.8/system/RSS/Maker/RSS10/Items/Item/Content/cdesc-Content.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Content
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Content
superclass: ContentBase
PK�|[��-���>ri/1.8/system/RSS/Maker/RSS10/Items/Item/Rights/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Rights#to_feed
is_singleton: false
name: to_feed
params: (rss, item)
visibility: public
PK�|[*�@�Ari/1.8/system/RSS/Maker/RSS10/Items/Item/Rights/cdesc-Rights.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Rights
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Rights
superclass: RightsBase
PK�|[����Gri/1.8/system/RSS/Maker/RSS10/Items/Item/Enclosure/cdesc-Enclosure.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Enclosure
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Enclosure
superclass: EnclosureBase
PK�|[XBX��Ari/1.8/system/RSS/Maker/RSS10/Items/Item/Enclosure/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Enclosure#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[B����Sri/1.8/system/RSS/Maker/RSS10/Items/Item/Description/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Description#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[���o��Cri/1.8/system/RSS/Maker/RSS10/Items/Item/Description/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Description#to_feed
is_singleton: false
name: to_feed
params: (rss, item)
visibility: public
PK�|[��o]]Kri/1.8/system/RSS/Maker/RSS10/Items/Item/Description/cdesc-Description.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Description
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Description
superclass: DescriptionBase
PK�|[��֠��Iri/1.8/system/RSS/Maker/RSS10/Items/Item/Authors/Author/cdesc-Author.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Authors::Author
includes: []

instance_methods: []

name: Author
superclass: AuthorBase
PK�|[(
n��?ri/1.8/system/RSS/Maker/RSS10/Items/Item/Authors/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Authors#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|['LF�Cri/1.8/system/RSS/Maker/RSS10/Items/Item/Authors/cdesc-Authors.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Authors
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Authors
superclass: AuthorsBase
PK�|[�x�Iri/1.8/system/RSS/Maker/RSS10/Items/Item/Categories/cdesc-Categories.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Categories
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Categories
superclass: CategoriesBase
PK�|[2�H���Pri/1.8/system/RSS/Maker/RSS10/Items/Item/Categories/Category/cdesc-Category.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Categories::Category
includes: []

instance_methods: []

name: Category
superclass: CategoryBase
PK�|[$YG��Bri/1.8/system/RSS/Maker/RSS10/Items/Item/Categories/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Categories#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[��=ri/1.8/system/RSS/Maker/RSS10/Items/Item/Guid/cdesc-Guid.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item::Guid
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Guid
superclass: GuidBase
PK�|[ؽ%l��<ri/1.8/system/RSS/Maker/RSS10/Items/Item/Guid/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item::Guid#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[op���8ri/1.8/system/RSS/Maker/RSS10/Items/Item/cdesc-Item.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items::Item
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: not_set_required_variables
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
- !ruby/object:RI::MethodSummary 
  name: variables
name: Item
superclass: ItemBase
PK�|[�e�t��Jri/1.8/system/RSS/Maker/RSS10/Items/Item/not_set_required_variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items::Item#not_set_required_variables
is_singleton: false
name: not_set_required_variables
params: ()
visibility: private
PK�|[�ޖ9��4ri/1.8/system/RSS/Maker/RSS10/Items/cdesc-Items.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Items
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Items
superclass: ItemsBase
PK�|[�ָ���2ri/1.8/system/RSS/Maker/RSS10/Items/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Items#to_feed
is_singleton: false
name: to_feed
params: (rss)
visibility: public
PK�|[i�z��Jri/1.8/system/RSS/Maker/RSS10/Channel/Title/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel::Title#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[jY�}GG<ri/1.8/system/RSS/Maker/RSS10/Channel/Title/cdesc-Title.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Channel::Title
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Title
superclass: TitleBase
PK�|[
ͬl��:ri/1.8/system/RSS/Maker/RSS10/Channel/Title/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel::Title#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[	�5��Ori/1.8/system/RSS/Maker/RSS10/Channel/Links/Link/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel::Links::Link#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[u<_��?ri/1.8/system/RSS/Maker/RSS10/Channel/Links/Link/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel::Links::Link#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[ s��KK@ri/1.8/system/RSS/Maker/RSS10/Channel/Links/Link/cdesc-Link.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Channel::Links::Link
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Link
superclass: LinkBase
PK�|[؝�P<ri/1.8/system/RSS/Maker/RSS10/Channel/Links/cdesc-Links.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Channel::Links
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Links
superclass: LinksBase
PK�|[�w����:ri/1.8/system/RSS/Maker/RSS10/Channel/Links/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel::Links#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[>r���<ri/1.8/system/RSS/Maker/RSS10/Channel/setup_textinput-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel#setup_textinput
is_singleton: false
name: setup_textinput
params: (rss)
visibility: private
PK�|[{�ٚ��>ri/1.8/system/RSS/Maker/RSS10/Channel/Copyright/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel::Copyright#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[�Dri/1.8/system/RSS/Maker/RSS10/Channel/Copyright/cdesc-Copyright.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Channel::Copyright
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Copyright
superclass: CopyrightBase
PK�|[i8f��Dri/1.8/system/RSS/Maker/RSS10/Channel/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[)�\�Dri/1.8/system/RSS/Maker/RSS10/Channel/SkipHours/cdesc-SkipHours.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Channel::SkipHours
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: SkipHours
superclass: SkipHoursBase
PK�|[_�1���Dri/1.8/system/RSS/Maker/RSS10/Channel/SkipHours/Hour/cdesc-Hour.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Channel::SkipHours::Hour
includes: []

instance_methods: []

name: Hour
superclass: HourBase
PK�|[d��3��>ri/1.8/system/RSS/Maker/RSS10/Channel/SkipHours/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel::SkipHours#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[�����Uri/1.8/system/RSS/Maker/RSS10/Channel/Contributors/Contributor/cdesc-Contributor.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Channel::Contributors::Contributor
includes: []

instance_methods: []

name: Contributor
superclass: ContributorBase
PK�|[z����Ari/1.8/system/RSS/Maker/RSS10/Channel/Contributors/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel::Contributors#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[烺;Jri/1.8/system/RSS/Maker/RSS10/Channel/Contributors/cdesc-Contributors.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Channel::Contributors
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Contributors
superclass: ContributorsBase
PK�|[��V��8ri/1.8/system/RSS/Maker/RSS10/Channel/setup_items-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel#setup_items
is_singleton: false
name: setup_items
params: (rss)
visibility: private
PK�|[��//8ri/1.8/system/RSS/Maker/RSS10/Channel/cdesc-Channel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Channel
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: not_set_required_variables
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: setup_image
- !ruby/object:RI::MethodSummary 
  name: setup_items
- !ruby/object:RI::MethodSummary 
  name: setup_textinput
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Channel
superclass: ChannelBase
PK�|[Y��ֿ�4ri/1.8/system/RSS/Maker/RSS10/Channel/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel#to_feed
is_singleton: false
name: to_feed
params: (rss)
visibility: public
PK�|[Cpv(��:ri/1.8/system/RSS/Maker/RSS10/Channel/Cloud/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel::Cloud#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[�<ri/1.8/system/RSS/Maker/RSS10/Channel/Cloud/cdesc-Cloud.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Channel::Cloud
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Cloud
superclass: CloudBase
PK�|[)iDri/1.8/system/RSS/Maker/RSS10/Channel/Generator/cdesc-Generator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Channel::Generator
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Generator
superclass: GeneratorBase
PK�|[�/��>ri/1.8/system/RSS/Maker/RSS10/Channel/Generator/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel::Generator#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[u'���Pri/1.8/system/RSS/Maker/RSS10/Channel/Description/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel::Description#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[>}���@ri/1.8/system/RSS/Maker/RSS10/Channel/Description/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel::Description#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[d��YYHri/1.8/system/RSS/Maker/RSS10/Channel/Description/cdesc-Description.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Channel::Description
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Description
superclass: DescriptionBase
PK�|[,߆���Ari/1.8/system/RSS/Maker/RSS10/Channel/SkipDays/Day/cdesc-Day.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Channel::SkipDays::Day
includes: []

instance_methods: []

name: Day
superclass: DayBase
PK�|[����=ri/1.8/system/RSS/Maker/RSS10/Channel/SkipDays/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel::SkipDays#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[&�P<Bri/1.8/system/RSS/Maker/RSS10/Channel/SkipDays/cdesc-SkipDays.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Channel::SkipDays
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: SkipDays
superclass: SkipDaysBase
PK�|[ϣ����Cri/1.8/system/RSS/Maker/RSS10/Channel/Authors/Author/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel::Authors::Author#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[�5ZrFri/1.8/system/RSS/Maker/RSS10/Channel/Authors/Author/cdesc-Author.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Channel::Authors::Author
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Author
superclass: AuthorBase
PK�|[V��s��<ri/1.8/system/RSS/Maker/RSS10/Channel/Authors/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel::Authors#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[��G@ri/1.8/system/RSS/Maker/RSS10/Channel/Authors/cdesc-Authors.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Channel::Authors
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Authors
superclass: AuthorsBase
PK�|[{}Fri/1.8/system/RSS/Maker/RSS10/Channel/Categories/cdesc-Categories.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Channel::Categories
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Categories
superclass: CategoriesBase
PK�|[Mq"��Mri/1.8/system/RSS/Maker/RSS10/Channel/Categories/Category/cdesc-Category.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Channel::Categories::Category
includes: []

instance_methods: []

name: Category
superclass: CategoryBase
PK�|[߆���?ri/1.8/system/RSS/Maker/RSS10/Channel/Categories/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel::Categories#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[�
���Gri/1.8/system/RSS/Maker/RSS10/Channel/not_set_required_variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel#not_set_required_variables
is_singleton: false
name: not_set_required_variables
params: ()
visibility: private
PK�|[������8ri/1.8/system/RSS/Maker/RSS10/Channel/setup_image-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Channel#setup_image
is_singleton: false
name: setup_image
params: (rss)
visibility: private
PK�|[/���YY.ri/1.8/system/RSS/Maker/RSS10/cdesc-RSS10.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::Maker::RSS10
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: make_feed
- !ruby/object:RI::MethodSummary 
  name: setup_elements
name: RSS10
superclass: RSSBase
PK�|[���Ӳ�4ri/1.8/system/RSS/Maker/RSS10/Image/cdesc-Image.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Image
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: have_required_values?
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
- !ruby/object:RI::MethodSummary 
  name: variables
name: Image
superclass: ImageBase
PK�|[�5�W��4ri/1.8/system/RSS/Maker/RSS10/Image/variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Image#variables
is_singleton: false
name: variables
params: ()
visibility: private
PK�|[�\M���Bri/1.8/system/RSS/Maker/RSS10/Image/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Image#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[>Q���Bri/1.8/system/RSS/Maker/RSS10/Image/have_required_values%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Image#have_required_values?
is_singleton: false
name: have_required_values?
params: ()
visibility: public
PK�|[�Q�r��2ri/1.8/system/RSS/Maker/RSS10/Image/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Image#to_feed
is_singleton: false
name: to_feed
params: (rss)
visibility: public
PK�|[���
��<ri/1.8/system/RSS/Maker/RSS10/Textinput/cdesc-Textinput.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS10::Textinput
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: have_required_values?
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Textinput
superclass: TextinputBase
PK�|[{�%!��Fri/1.8/system/RSS/Maker/RSS10/Textinput/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Textinput#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[Ǩr���Fri/1.8/system/RSS/Maker/RSS10/Textinput/have_required_values%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Textinput#have_required_values?
is_singleton: false
name: have_required_values?
params: ()
visibility: public
PK�|[�.
��6ri/1.8/system/RSS/Maker/RSS10/Textinput/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::Textinput#to_feed
is_singleton: false
name: to_feed
params: (rss)
visibility: public
PK�|[%p��(ri/1.8/system/RSS/Maker/RSS10/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10::new
is_singleton: true
name: new
params: (feed_version="1.0")
visibility: public
PK�|[ȶ����3ri/1.8/system/RSS/Maker/RSS10/setup_elements-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10#setup_elements
is_singleton: false
name: setup_elements
params: (rss)
visibility: private
PK�|[�x���.ri/1.8/system/RSS/Maker/RSS10/make_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS10#make_feed
is_singleton: false
name: make_feed
params: ()
visibility: private
PK�|[$9���;ri/1.8/system/RSS/Maker/AtomPersons/def_atom_persons-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomPersons#def_atom_persons
is_singleton: false
name: def_atom_persons
params: (klass, name, maker_name, plural=nil)
visibility: public
PK�|[b��:ri/1.8/system/RSS/Maker/AtomPersons/cdesc-AtomPersons.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::AtomPersons
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: def_atom_persons
name: AtomPersons
superclass: 
PK�|[Y�Ү�'ri/1.8/system/RSS/Maker/versions-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::versions
is_singleton: true
name: versions
params: ()
visibility: public
PK�|[�<����Mri/1.8/system/RSS/Maker/RSS09/Items/Item/Title/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Title#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[�/W�KK?ri/1.8/system/RSS/Maker/RSS09/Items/Item/Title/cdesc-Title.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Title
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Title
superclass: TitleBase
PK�|[��q��=ri/1.8/system/RSS/Maker/RSS09/Items/Item/Title/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Title#to_feed
is_singleton: false
name: to_feed
params: (rss, item)
visibility: public
PK�|[��X���Rri/1.8/system/RSS/Maker/RSS09/Items/Item/Links/Link/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Links::Link#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[ZA%��Bri/1.8/system/RSS/Maker/RSS09/Items/Item/Links/Link/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Links::Link#to_feed
is_singleton: false
name: to_feed
params: (rss, item)
visibility: public
PK�|[G�vOOCri/1.8/system/RSS/Maker/RSS09/Items/Item/Links/Link/cdesc-Link.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Links::Link
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Link
superclass: LinkBase
PK�|[p�U�		?ri/1.8/system/RSS/Maker/RSS09/Items/Item/Links/cdesc-Links.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Links
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Links
superclass: LinksBase
PK�|[�O���=ri/1.8/system/RSS/Maker/RSS09/Items/Item/Links/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Links#to_feed
is_singleton: false
name: to_feed
params: (rss, item)
visibility: public
PK�|[��گFri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Title/cdesc-Title.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Source::Title
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Title
superclass: TitleBase
PK�|[����Dri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Title/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Source::Title#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[�	ܫ��Jri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Links/Link/cdesc-Link.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Source::Links::Link
includes: []

instance_methods: []

name: Link
superclass: LinkBase
PK�|[�j9lFri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Links/cdesc-Links.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Source::Links
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Links
superclass: LinksBase
PK�|[����Dri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Links/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Source::Links#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[���Lri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Subtitle/cdesc-Subtitle.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Source::Subtitle
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Subtitle
superclass: SubtitleBase
PK�|[(��Gri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Subtitle/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Source::Subtitle#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[�B*Dri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Logo/cdesc-Logo.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Source::Logo
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Logo
superclass: LogoBase
PK�|[���n��Cri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Logo/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Source::Logo#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[]A�,_ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Contributors/Contributor/cdesc-Contributor.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Source::Contributors::Contributor
includes: []

instance_methods: []

name: Contributor
superclass: ContributorBase
PK�|[�����Kri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Contributors/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Source::Contributors#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[��G�&&Tri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Contributors/cdesc-Contributors.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Source::Contributors
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Contributors
superclass: ContributorsBase
PK�|[��n��>ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Source#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[�.�u��Eri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Rights/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Source::Rights#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[�p�OHri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Rights/cdesc-Rights.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Source::Rights
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Rights
superclass: RightsBase
PK�|[M�;�Nri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Generator/cdesc-Generator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Source::Generator
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Generator
superclass: GeneratorBase
PK�|[I�E���Hri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Generator/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Source::Generator#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[�J6Ari/1.8/system/RSS/Maker/RSS09/Items/Item/Source/cdesc-Source.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Source
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Source
superclass: SourceBase
PK�|[A_�*��Cri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Icon/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Source::Icon#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[&�QDri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Icon/cdesc-Icon.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Source::Icon
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Icon
superclass: IconBase
PK�|[)"���Pri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Authors/Author/cdesc-Author.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Source::Authors::Author
includes: []

instance_methods: []

name: Author
superclass: AuthorBase
PK�|[9��p��Fri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Authors/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Source::Authors#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[���Jri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Authors/cdesc-Authors.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Source::Authors
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Authors
superclass: AuthorsBase
PK�|[�C  Pri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Categories/cdesc-Categories.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Source::Categories
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Categories
superclass: CategoriesBase
PK�|[�����Wri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Categories/Category/cdesc-Category.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Source::Categories::Category
includes: []

instance_methods: []

name: Category
superclass: CategoryBase
PK�|[*�O���Iri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Categories/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Source::Categories#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[�S���Gri/1.8/system/RSS/Maker/RSS09/Items/Item/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[ɞ��Xri/1.8/system/RSS/Maker/RSS09/Items/Item/Contributors/Contributor/cdesc-Contributor.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Contributors::Contributor
includes: []

instance_methods: []

name: Contributor
superclass: ContributorBase
PK�|[o�}��Dri/1.8/system/RSS/Maker/RSS09/Items/Item/Contributors/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Contributors#to_feed
is_singleton: false
name: to_feed
params: (rss, item)
visibility: public
PK�|[�7�uMri/1.8/system/RSS/Maker/RSS09/Items/Item/Contributors/cdesc-Contributors.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Contributors
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Contributors
superclass: ContributorsBase
PK�|[6�f��7ri/1.8/system/RSS/Maker/RSS09/Items/Item/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item#to_feed
is_singleton: false
name: to_feed
params: (rss)
visibility: public
PK�|[:Ls���?ri/1.8/system/RSS/Maker/RSS09/Items/Item/Content/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Content#to_feed
is_singleton: false
name: to_feed
params: (rss, item)
visibility: public
PK�|[�QI�Cri/1.8/system/RSS/Maker/RSS09/Items/Item/Content/cdesc-Content.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Content
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Content
superclass: ContentBase
PK�|[b2�x��>ri/1.8/system/RSS/Maker/RSS09/Items/Item/Rights/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Rights#to_feed
is_singleton: false
name: to_feed
params: (rss, item)
visibility: public
PK�|[�N�|Ari/1.8/system/RSS/Maker/RSS09/Items/Item/Rights/cdesc-Rights.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Rights
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Rights
superclass: RightsBase
PK�|[�{r�Gri/1.8/system/RSS/Maker/RSS09/Items/Item/Enclosure/cdesc-Enclosure.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Enclosure
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Enclosure
superclass: EnclosureBase
PK�|[&��G��Ari/1.8/system/RSS/Maker/RSS09/Items/Item/Enclosure/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Enclosure#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[��i���Sri/1.8/system/RSS/Maker/RSS09/Items/Item/Description/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Description#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[y����Cri/1.8/system/RSS/Maker/RSS09/Items/Item/Description/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Description#to_feed
is_singleton: false
name: to_feed
params: (rss, item)
visibility: public
PK�|[�/]]Kri/1.8/system/RSS/Maker/RSS09/Items/Item/Description/cdesc-Description.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Description
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Description
superclass: DescriptionBase
PK�|[R)��Iri/1.8/system/RSS/Maker/RSS09/Items/Item/Authors/Author/cdesc-Author.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Authors::Author
includes: []

instance_methods: []

name: Author
superclass: AuthorBase
PK�|[*T���?ri/1.8/system/RSS/Maker/RSS09/Items/Item/Authors/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Authors#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[3G�|Cri/1.8/system/RSS/Maker/RSS09/Items/Item/Authors/cdesc-Authors.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Authors
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Authors
superclass: AuthorsBase
PK�|[c\�Iri/1.8/system/RSS/Maker/RSS09/Items/Item/Categories/cdesc-Categories.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Categories
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Categories
superclass: CategoriesBase
PK�|[������Pri/1.8/system/RSS/Maker/RSS09/Items/Item/Categories/Category/cdesc-Category.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Categories::Category
includes: []

instance_methods: []

name: Category
superclass: CategoryBase
PK�|[������Bri/1.8/system/RSS/Maker/RSS09/Items/Item/Categories/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Categories#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[�v�=ri/1.8/system/RSS/Maker/RSS09/Items/Item/Guid/cdesc-Guid.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item::Guid
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Guid
superclass: GuidBase
PK�|[w�K��<ri/1.8/system/RSS/Maker/RSS09/Items/Item/Guid/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item::Guid#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[��{��8ri/1.8/system/RSS/Maker/RSS09/Items/Item/cdesc-Item.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items::Item
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: not_set_required_variables
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Item
superclass: ItemBase
PK�|[�"D>��Jri/1.8/system/RSS/Maker/RSS09/Items/Item/not_set_required_variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items::Item#not_set_required_variables
is_singleton: false
name: not_set_required_variables
params: ()
visibility: private
PK�|[��Cs��4ri/1.8/system/RSS/Maker/RSS09/Items/cdesc-Items.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Items
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Items
superclass: ItemsBase
PK�|[@��o��2ri/1.8/system/RSS/Maker/RSS09/Items/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Items#to_feed
is_singleton: false
name: to_feed
params: (rss)
visibility: public
PK�|[�n���Jri/1.8/system/RSS/Maker/RSS09/Channel/Title/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::Title#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[y�cNGG<ri/1.8/system/RSS/Maker/RSS09/Channel/Title/cdesc-Title.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Channel::Title
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Title
superclass: TitleBase
PK�|[$ߏe��:ri/1.8/system/RSS/Maker/RSS09/Channel/Title/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::Title#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[i1�L��Ori/1.8/system/RSS/Maker/RSS09/Channel/Links/Link/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::Links::Link#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[6�����?ri/1.8/system/RSS/Maker/RSS09/Channel/Links/Link/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::Links::Link#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[�܃KK@ri/1.8/system/RSS/Maker/RSS09/Channel/Links/Link/cdesc-Link.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Channel::Links::Link
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Link
superclass: LinkBase
PK�|[06W<ri/1.8/system/RSS/Maker/RSS09/Channel/Links/cdesc-Links.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Channel::Links
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Links
superclass: LinksBase
PK�|[�e����:ri/1.8/system/RSS/Maker/RSS09/Channel/Links/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::Links#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[@�ɺ��<ri/1.8/system/RSS/Maker/RSS09/Channel/setup_textinput-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel#setup_textinput
is_singleton: false
name: setup_textinput
params: (rss)
visibility: private
PK�|[��s��6ri/1.8/system/RSS/Maker/RSS09/Channel/variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel#variables
is_singleton: false
name: variables
params: ()
visibility: private
PK�|[�`���Nri/1.8/system/RSS/Maker/RSS09/Channel/Copyright/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::Copyright#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[�4���>ri/1.8/system/RSS/Maker/RSS09/Channel/Copyright/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::Copyright#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[+إSSDri/1.8/system/RSS/Maker/RSS09/Channel/Copyright/cdesc-Copyright.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Channel::Copyright
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Copyright
superclass: CopyrightBase
PK�|[����Dri/1.8/system/RSS/Maker/RSS09/Channel/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[l Dri/1.8/system/RSS/Maker/RSS09/Channel/SkipHours/cdesc-SkipHours.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Channel::SkipHours
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: SkipHours
superclass: SkipHoursBase
PK�|[�xH��Sri/1.8/system/RSS/Maker/RSS09/Channel/SkipHours/Hour/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::SkipHours::Hour#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|['yu��Cri/1.8/system/RSS/Maker/RSS09/Channel/SkipHours/Hour/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::SkipHours::Hour#to_feed
is_singleton: false
name: to_feed
params: (rss, hours)
visibility: public
PK�|[^f�OOODri/1.8/system/RSS/Maker/RSS09/Channel/SkipHours/Hour/cdesc-Hour.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Channel::SkipHours::Hour
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Hour
superclass: HourBase
PK�|[�xT��>ri/1.8/system/RSS/Maker/RSS09/Channel/SkipHours/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::SkipHours#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[�G��Uri/1.8/system/RSS/Maker/RSS09/Channel/Contributors/Contributor/cdesc-Contributor.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Channel::Contributors::Contributor
includes: []

instance_methods: []

name: Contributor
superclass: ContributorBase
PK�|[�5�<��Ari/1.8/system/RSS/Maker/RSS09/Channel/Contributors/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::Contributors#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[�祽Jri/1.8/system/RSS/Maker/RSS09/Channel/Contributors/cdesc-Contributors.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Channel::Contributors
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Contributors
superclass: ContributorsBase
PK�|[
i3j��8ri/1.8/system/RSS/Maker/RSS09/Channel/setup_items-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel#setup_items
is_singleton: false
name: setup_items
params: (rss)
visibility: private
PK�|[FүJcc8ri/1.8/system/RSS/Maker/RSS09/Channel/cdesc-Channel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Channel
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: not_set_required_variables
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: setup_image
- !ruby/object:RI::MethodSummary 
  name: setup_items
- !ruby/object:RI::MethodSummary 
  name: setup_textinput
- !ruby/object:RI::MethodSummary 
  name: to_feed
- !ruby/object:RI::MethodSummary 
  name: variables
name: Channel
superclass: ChannelBase
PK�|[�Q��4ri/1.8/system/RSS/Maker/RSS09/Channel/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel#to_feed
is_singleton: false
name: to_feed
params: (rss)
visibility: public
PK�|[����:ri/1.8/system/RSS/Maker/RSS09/Channel/Cloud/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::Cloud#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[R�<ri/1.8/system/RSS/Maker/RSS09/Channel/Cloud/cdesc-Cloud.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Channel::Cloud
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Cloud
superclass: CloudBase
PK�|[�s�Dri/1.8/system/RSS/Maker/RSS09/Channel/Generator/cdesc-Generator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Channel::Generator
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Generator
superclass: GeneratorBase
PK�|[�w���>ri/1.8/system/RSS/Maker/RSS09/Channel/Generator/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::Generator#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[
�w��Pri/1.8/system/RSS/Maker/RSS09/Channel/Description/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::Description#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[}��1��@ri/1.8/system/RSS/Maker/RSS09/Channel/Description/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::Description#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[�YYHri/1.8/system/RSS/Maker/RSS09/Channel/Description/cdesc-Description.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Channel::Description
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Description
superclass: DescriptionBase
PK�|[~�����Qri/1.8/system/RSS/Maker/RSS09/Channel/SkipDays/Day/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::SkipDays::Day#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[K/��KKAri/1.8/system/RSS/Maker/RSS09/Channel/SkipDays/Day/cdesc-Day.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Channel::SkipDays::Day
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Day
superclass: DayBase
PK�|[#�һ��Ari/1.8/system/RSS/Maker/RSS09/Channel/SkipDays/Day/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::SkipDays::Day#to_feed
is_singleton: false
name: to_feed
params: (rss, days)
visibility: public
PK�|[�Ry���=ri/1.8/system/RSS/Maker/RSS09/Channel/SkipDays/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::SkipDays#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[�K`�Bri/1.8/system/RSS/Maker/RSS09/Channel/SkipDays/cdesc-SkipDays.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Channel::SkipDays
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: SkipDays
superclass: SkipDaysBase
PK�|[D��Z��Cri/1.8/system/RSS/Maker/RSS09/Channel/Authors/Author/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::Authors::Author#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[�&�Fri/1.8/system/RSS/Maker/RSS09/Channel/Authors/Author/cdesc-Author.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Channel::Authors::Author
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Author
superclass: AuthorBase
PK�|[����<ri/1.8/system/RSS/Maker/RSS09/Channel/Authors/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::Authors#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[V*�y@ri/1.8/system/RSS/Maker/RSS09/Channel/Authors/cdesc-Authors.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Channel::Authors
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Authors
superclass: AuthorsBase
PK�|[@Y��Fri/1.8/system/RSS/Maker/RSS09/Channel/Categories/cdesc-Categories.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Channel::Categories
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Categories
superclass: CategoriesBase
PK�|[̴E���Mri/1.8/system/RSS/Maker/RSS09/Channel/Categories/Category/cdesc-Category.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Channel::Categories::Category
includes: []

instance_methods: []

name: Category
superclass: CategoryBase
PK�|[@Y��?ri/1.8/system/RSS/Maker/RSS09/Channel/Categories/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel::Categories#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[lN��Gri/1.8/system/RSS/Maker/RSS09/Channel/not_set_required_variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel#not_set_required_variables
is_singleton: false
name: not_set_required_variables
params: ()
visibility: private
PK�|[==���8ri/1.8/system/RSS/Maker/RSS09/Channel/setup_image-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Channel#setup_image
is_singleton: false
name: setup_image
params: (rss)
visibility: private
PK�|[FUVzz4ri/1.8/system/RSS/Maker/RSS09/Image/cdesc-Image.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Image
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_element?
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Image
superclass: ImageBase
PK�|[6Ά���Bri/1.8/system/RSS/Maker/RSS09/Image/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Image#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[�Y_���>ri/1.8/system/RSS/Maker/RSS09/Image/required_element%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Image#required_element?
is_singleton: false
name: required_element?
params: ()
visibility: private
PK�|[:!ƞ��2ri/1.8/system/RSS/Maker/RSS09/Image/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Image#to_feed
is_singleton: false
name: to_feed
params: (rss)
visibility: public
PK�|[H&�JJ<ri/1.8/system/RSS/Maker/RSS09/Textinput/cdesc-Textinput.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS09::Textinput
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Textinput
superclass: TextinputBase
PK�|[��1��Fri/1.8/system/RSS/Maker/RSS09/Textinput/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Textinput#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[fA\��6ri/1.8/system/RSS/Maker/RSS09/Textinput/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::Textinput#to_feed
is_singleton: false
name: to_feed
params: (rss)
visibility: public
PK�|[��(��(ri/1.8/system/RSS/Maker/RSS09/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09::new
is_singleton: true
name: new
params: (feed_version="0.92")
visibility: public
PK�|[�:MYY.ri/1.8/system/RSS/Maker/RSS09/cdesc-RSS09.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::Maker::RSS09
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: make_feed
- !ruby/object:RI::MethodSummary 
  name: setup_elements
name: RSS09
superclass: RSSBase
PK�|[h��0��3ri/1.8/system/RSS/Maker/RSS09/setup_elements-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09#setup_elements
is_singleton: false
name: setup_elements
params: (rss)
visibility: private
PK�|[�¸�.ri/1.8/system/RSS/Maker/RSS09/make_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS09#make_feed
is_singleton: false
name: make_feed
params: ()
visibility: private
PK�|[�ݖE>ri/1.8/system/RSS/Maker/TextinputBase/cdesc-TextinputBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::TextinputBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: DublinCoreModel
instance_methods: []

name: TextinputBase
superclass: Object
PK�|[�.W���+ri/1.8/system/RSS/Maker/RSSBase/make-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSSBase::make
is_singleton: true
name: make
params: (version, &block)
visibility: public
PK�|[��X\��*ri/1.8/system/RSS/Maker/RSSBase/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSSBase::new
is_singleton: true
name: new
params: (feed_version)
visibility: public
PK�|[E2��

2ri/1.8/system/RSS/Maker/RSSBase/cdesc-RSSBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: encoding
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: feed_version
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: standalone
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: version
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: make
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::Maker::RSSBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: TaxonomyTopicModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: make
- !ruby/object:RI::MethodSummary 
  name: make_xml_stylesheets
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: RSSBase
superclass: Object
PK�|[XޓT��.ri/1.8/system/RSS/Maker/RSSBase/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSSBase#to_feed
is_singleton: false
name: to_feed
params: ()
visibility: public
PK�|[F�v���;ri/1.8/system/RSS/Maker/RSSBase/make_xml_stylesheets-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSSBase#make_xml_stylesheets
is_singleton: false
name: make_xml_stylesheets
params: ()
visibility: private
PK�|[O�ւ��+ri/1.8/system/RSS/Maker/RSSBase/make-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (self)
comment: 
full_name: RSS::Maker::RSSBase#make
is_singleton: false
name: make
params: () {|self| ...}
visibility: public
PK�|[���=ri/1.8/system/RSS/Maker/TrackBackModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::TrackBackModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[�r�W@ri/1.8/system/RSS/Maker/TrackBackModel/cdesc-TrackBackModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: []

full_name: RSS::Maker::TrackBackModel
includes: []

instance_methods: []

name: TrackBackModel
superclass: 
PK�|[*�#���Yri/1.8/system/RSS/Maker/TrackBackModel/TrackBackAboutsBase/cdesc-TrackBackAboutsBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::TrackBackModel::TrackBackAboutsBase
includes: []

instance_methods: []

name: TrackBackAboutsBase
superclass: Base
PK�|[�$�lri/1.8/system/RSS/Maker/TrackBackModel/TrackBackAboutsBase/TrackBackAboutBase/have_required_values%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::TrackBackModel::TrackBackAboutsBase::TrackBackAboutBase#have_required_values?
is_singleton: false
name: have_required_values?
params: ()
visibility: public
PK�|[�
� ��\ri/1.8/system/RSS/Maker/TrackBackModel/TrackBackAboutsBase/TrackBackAboutBase/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::TrackBackModel::TrackBackAboutsBase::TrackBackAboutBase#to_feed
is_singleton: false
name: to_feed
params: (feed, current)
visibility: public
PK�|[F�r��kri/1.8/system/RSS/Maker/TrackBackModel/TrackBackAboutsBase/TrackBackAboutBase/cdesc-TrackBackAboutBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: value
  rw: RW
class_methods: []

comment: 
constants: []

full_name: RSS::Maker::TrackBackModel::TrackBackAboutsBase::TrackBackAboutBase
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: have_required_values?
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: TrackBackAboutBase
superclass: Base
PK�|[G��8ri/1.8/system/RSS/Maker/SlashModel/cdesc-SlashModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: []

full_name: RSS::Maker::SlashModel
includes: []

instance_methods: []

name: SlashModel
superclass: 
PK�|[�
�"��9ri/1.8/system/RSS/Maker/SlashModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::SlashModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[s��S��:ri/1.8/system/RSS/Maker/AtomTextConstruct/variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomTextConstruct#variables
is_singleton: false
name: variables
params: ()
visibility: private
PK�|[o���Hri/1.8/system/RSS/Maker/AtomTextConstruct/def_atom_text_construct-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomTextConstruct::def_atom_text_construct
is_singleton: true
name: def_atom_text_construct
params: (klass, name, maker_name, klass_name=nil, atom_klass_name=nil)
visibility: public
PK�|[6�	c��Fri/1.8/system/RSS/Maker/AtomTextConstruct/cdesc-AtomTextConstruct.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: def_atom_text_construct
comment: 
constants: []

full_name: RSS::Maker::AtomTextConstruct
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: variables
name: AtomTextConstruct
superclass: 
PK�|[�����Hri/1.8/system/RSS/Maker/AtomTextConstruct/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::AtomTextConstruct#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[�B�n��Cri/1.8/system/RSS/Maker/SetupDefaultDate/_set_default_values-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::SetupDefaultDate#_set_default_values
is_singleton: false
name: _set_default_values
params: (&block)
visibility: private
PK�|[5�ny��Eri/1.8/system/RSS/Maker/SetupDefaultDate/_parse_date_if_needed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::SetupDefaultDate#_parse_date_if_needed
is_singleton: false
name: _parse_date_if_needed
params: (date_value)
visibility: private
PK�|[ŕ�0NNDri/1.8/system/RSS/Maker/SetupDefaultDate/cdesc-SetupDefaultDate.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::SetupDefaultDate
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _parse_date_if_needed
- !ruby/object:RI::MethodSummary 
  name: _set_default_values
name: SetupDefaultDate
superclass: 
PK�|[�^~]]1ri/1.8/system/RSS/Maker/Atom/Feed/cdesc-Feed.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::Maker::Atom::Feed
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: make_feed
- !ruby/object:RI::MethodSummary 
  name: setup_elements
name: Feed
superclass: RSSBase
PK�|[H{�K��Kri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Links/Link/not_set_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item::Links::Link::not_set_name
is_singleton: true
name: not_set_name
params: ()
visibility: public
PK�|[�U<?HHGri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Links/Link/cdesc-Link.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: not_set_name
comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Items::Item::Links::Link
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomLink
instance_methods: []

name: Link
superclass: LinkBase
PK�|[�����Cri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Links/cdesc-Links.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Items::Item::Links
includes: []

instance_methods: []

name: Links
superclass: LinksBase
PK�|[C*�p��Rri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Links/Link/not_set_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item::Source::Links::Link::not_set_name
is_singleton: true
name: not_set_name
params: ()
visibility: public
PK�|[C�?2PPNri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Links/Link/cdesc-Link.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: not_set_name
comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Items::Item::Source::Links::Link
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomLink
instance_methods: []

name: Link
superclass: LinkBase
PK�|[Tƍ���Jri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Links/cdesc-Links.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Items::Item::Source::Links
includes: []

instance_methods: []

name: Links
superclass: LinksBase
PK�|[+�k{��Dri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item::Source#variables
is_singleton: false
name: variables
params: ()
visibility: private
PK�|[%AjC��Rri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item::Source#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[�DKIIHri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Logo/cdesc-Logo.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: not_set_name
comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Items::Item::Source::Logo
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomLogo
instance_methods: []

name: Logo
superclass: LogoBase
PK�|[���2��Lri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Logo/not_set_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item::Source::Logo::not_set_name
is_singleton: true
name: not_set_name
params: ()
visibility: public
PK�|[q�����Bri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item::Source#to_feed
is_singleton: false
name: to_feed
params: (feed, current)
visibility: public
PK�|[�pwk]]Rri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Generator/cdesc-Generator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: not_set_name
comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Items::Item::Source::Generator
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomGenerator
instance_methods: []

name: Generator
superclass: GeneratorBase
PK�|[�����Qri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Generator/not_set_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item::Source::Generator::not_set_name
is_singleton: true
name: not_set_name
params: ()
visibility: public
PK�|[�4h���Eri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/cdesc-Source.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Items::Item::Source
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
- !ruby/object:RI::MethodSummary 
  name: variables
name: Source
superclass: SourceBase
PK�|[q~E��Wri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Icon/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item::Source::Icon#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[��it��Gri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Icon/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item::Source::Icon#to_feed
is_singleton: false
name: to_feed
params: (feed, current)
visibility: public
PK�|[�ٚ�UUHri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Icon/cdesc-Icon.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Items::Item::Source::Icon
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Icon
superclass: IconBase
PK�|[�%k��Tri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Categories/cdesc-Categories.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Items::Item::Source::Categories
includes: []

instance_methods: []

name: Categories
superclass: CategoriesBase
PK�|[�_/ee[ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Categories/Category/cdesc-Category.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: not_set_name
comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Items::Item::Source::Categories::Category
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomCategory
instance_methods: []

name: Category
superclass: CategoryBase
PK�|[�	܏��[ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Categories/Category/not_set_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item::Source::Categories::Category::not_set_name
is_singleton: true
name: not_set_name
params: ()
visibility: public
PK�|[���.��Gri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/_set_default_values-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item#_set_default_values
is_singleton: false
name: _set_default_values
params: (&block)
visibility: private
PK�|[�)�
��=ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item#variables
is_singleton: false
name: variables
params: ()
visibility: private
PK�|[�_*(��Kri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[��<��Kri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/have_required_values%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item#have_required_values?
is_singleton: false
name: have_required_values?
params: ()
visibility: public
PK�|[�uT��;ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item#to_feed
is_singleton: false
name: to_feed
params: (feed)
visibility: public
PK�|[H�5��Eri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Content/variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item::Content#variables
is_singleton: false
name: variables
params: ()
visibility: private
PK�|[������Sri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Content/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item::Content#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[�����Gri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Content/xml_type%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item::Content#xml_type?
is_singleton: false
name: xml_type?
params: ()
visibility: private
PK�|[FHC��Cri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Content/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item::Content#to_feed
is_singleton: false
name: to_feed
params: (feed, current)
visibility: public
PK�|[T��Gri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Content/cdesc-Content.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Items::Item::Content
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
- !ruby/object:RI::MethodSummary 
  name: variables
- !ruby/object:RI::MethodSummary 
  name: xml_type?
name: Content
superclass: ContentBase
PK�|[�y��Kri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Enclosure/cdesc-Enclosure.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Items::Item::Enclosure
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Enclosure
superclass: EnclosureBase
PK�|[�h,[��Eri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Enclosure/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item::Enclosure#to_feed
is_singleton: false
name: to_feed
params: (feed, current)
visibility: public
PK�|["x����Mri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Categories/cdesc-Categories.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Items::Item::Categories
includes: []

instance_methods: []

name: Categories
superclass: CategoriesBase
PK�|[�zܛ]]Tri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Categories/Category/cdesc-Category.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: not_set_name
comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Items::Item::Categories::Category
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomCategory
instance_methods: []

name: Category
superclass: CategoryBase
PK�|[�F����Tri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Categories/Category/not_set_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item::Categories::Category::not_set_name
is_singleton: true
name: not_set_name
params: ()
visibility: public
PK�|[��a5Ari/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Guid/cdesc-Guid.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Items::Item::Guid
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Guid
superclass: GuidBase
PK�|[����@ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Guid/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item::Guid#to_feed
is_singleton: false
name: to_feed
params: (feed, current)
visibility: public
PK�|[Bq#�>><ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/cdesc-Item.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Items::Item
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _set_default_values
- !ruby/object:RI::MethodSummary 
  name: have_required_values?
- !ruby/object:RI::MethodSummary 
  name: not_set_required_variables
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
- !ruby/object:RI::MethodSummary 
  name: variables
name: Item
superclass: ItemBase
PK�|[*�M���Nri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/not_set_required_variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items::Item#not_set_required_variables
is_singleton: false
name: not_set_required_variables
params: ()
visibility: private
PK�|[Y�A�8ri/1.8/system/RSS/Maker/Atom/Feed/Items/cdesc-Items.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Items
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Items
superclass: ItemsBase
PK�|[��e���6ri/1.8/system/RSS/Maker/Atom/Feed/Items/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Items#to_feed
is_singleton: false
name: to_feed
params: (feed)
visibility: public
PK�|[����Hri/1.8/system/RSS/Maker/Atom/Feed/Channel/Links/Link/not_set_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Channel::Links::Link::not_set_name
is_singleton: true
name: not_set_name
params: ()
visibility: public
PK�|[k*}DDDri/1.8/system/RSS/Maker/Atom/Feed/Channel/Links/Link/cdesc-Link.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: not_set_name
comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Channel::Links::Link
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomLink
instance_methods: []

name: Link
superclass: LinkBase
PK�|[�W��@ri/1.8/system/RSS/Maker/Atom/Feed/Channel/Links/cdesc-Links.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Channel::Links
includes: []

instance_methods: []

name: Links
superclass: LinksBase
PK�|[��n��Dri/1.8/system/RSS/Maker/Atom/Feed/Channel/_set_default_values-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Channel#_set_default_values
is_singleton: false
name: _set_default_values
params: (&block)
visibility: private
PK�|[X�����:ri/1.8/system/RSS/Maker/Atom/Feed/Channel/variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Channel#variables
is_singleton: false
name: variables
params: ()
visibility: private
PK�|[� ���Hri/1.8/system/RSS/Maker/Atom/Feed/Channel/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Channel#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[�s����Cri/1.8/system/RSS/Maker/Atom/Feed/Channel/variable_is_set%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Channel#variable_is_set?
is_singleton: false
name: variable_is_set?
params: ()
visibility: private
PK�|[%�5�Hri/1.8/system/RSS/Maker/Atom/Feed/Channel/SkipHours/cdesc-SkipHours.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Channel::SkipHours
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: SkipHours
superclass: SkipHoursBase
PK�|[��{��Hri/1.8/system/RSS/Maker/Atom/Feed/Channel/SkipHours/Hour/cdesc-Hour.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Channel::SkipHours::Hour
includes: []

instance_methods: []

name: Hour
superclass: HourBase
PK�|[�����Bri/1.8/system/RSS/Maker/Atom/Feed/Channel/SkipHours/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Channel::SkipHours#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[���Hri/1.8/system/RSS/Maker/Atom/Feed/Channel/have_required_values%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Channel#have_required_values?
is_singleton: false
name: have_required_values?
params: ()
visibility: public
PK�|[2� {{<ri/1.8/system/RSS/Maker/Atom/Feed/Channel/cdesc-Channel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Channel
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _set_default_values
- !ruby/object:RI::MethodSummary 
  name: have_required_values?
- !ruby/object:RI::MethodSummary 
  name: not_set_required_variables
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
- !ruby/object:RI::MethodSummary 
  name: variable_is_set?
- !ruby/object:RI::MethodSummary 
  name: variables
name: Channel
superclass: ChannelBase
PK�|[ކ[��8ri/1.8/system/RSS/Maker/Atom/Feed/Channel/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Channel#to_feed
is_singleton: false
name: to_feed
params: (feed)
visibility: public
PK�|[S4���>ri/1.8/system/RSS/Maker/Atom/Feed/Channel/Cloud/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Channel::Cloud#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[�

@ri/1.8/system/RSS/Maker/Atom/Feed/Channel/Cloud/cdesc-Cloud.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Channel::Cloud
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Cloud
superclass: CloudBase
PK�|[}�t>QQHri/1.8/system/RSS/Maker/Atom/Feed/Channel/Generator/cdesc-Generator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: not_set_name
comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Channel::Generator
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomGenerator
instance_methods: []

name: Generator
superclass: GeneratorBase
PK�|[n���Gri/1.8/system/RSS/Maker/Atom/Feed/Channel/Generator/not_set_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Channel::Generator::not_set_name
is_singleton: true
name: not_set_name
params: ()
visibility: public
PK�|[as^���Eri/1.8/system/RSS/Maker/Atom/Feed/Channel/SkipDays/Day/cdesc-Day.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Channel::SkipDays::Day
includes: []

instance_methods: []

name: Day
superclass: DayBase
PK�|[�!��Ari/1.8/system/RSS/Maker/Atom/Feed/Channel/SkipDays/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Channel::SkipDays#to_feed
is_singleton: false
name: to_feed
params: (*args)
visibility: public
PK�|[�h�Fri/1.8/system/RSS/Maker/Atom/Feed/Channel/SkipDays/cdesc-SkipDays.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Channel::SkipDays
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: SkipDays
superclass: SkipDaysBase
PK�|[}Oݖ��Jri/1.8/system/RSS/Maker/Atom/Feed/Channel/Categories/cdesc-Categories.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Channel::Categories
includes: []

instance_methods: []

name: Categories
superclass: CategoriesBase
PK�|[�lYYQri/1.8/system/RSS/Maker/Atom/Feed/Channel/Categories/Category/cdesc-Category.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: not_set_name
comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Channel::Categories::Category
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomCategory
instance_methods: []

name: Category
superclass: CategoryBase
PK�|[.Ww���Qri/1.8/system/RSS/Maker/Atom/Feed/Channel/Categories/Category/not_set_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Channel::Categories::Category::not_set_name
is_singleton: true
name: not_set_name
params: ()
visibility: public
PK�|[��0���Kri/1.8/system/RSS/Maker/Atom/Feed/Channel/not_set_required_variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Channel#not_set_required_variables
is_singleton: false
name: not_set_required_variables
params: ()
visibility: private
PK�|[n�:�CC8ri/1.8/system/RSS/Maker/Atom/Feed/Image/cdesc-Image.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Image
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Image
superclass: ImageBase
PK�|[��#��Fri/1.8/system/RSS/Maker/Atom/Feed/Image/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Image#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[tDP��6ri/1.8/system/RSS/Maker/Atom/Feed/Image/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::Image#to_feed
is_singleton: false
name: to_feed
params: (feed)
visibility: public
PK�|[����@ri/1.8/system/RSS/Maker/Atom/Feed/Textinput/cdesc-Textinput.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Feed::Textinput
includes: []

instance_methods: []

name: Textinput
superclass: TextinputBase
PK�|[������,ri/1.8/system/RSS/Maker/Atom/Feed/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed::new
is_singleton: true
name: new
params: (feed_version="1.0")
visibility: public
PK�|[zmS��7ri/1.8/system/RSS/Maker/Atom/Feed/setup_elements-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed#setup_elements
is_singleton: false
name: setup_elements
params: (feed)
visibility: private
PK�|[����2ri/1.8/system/RSS/Maker/Atom/Feed/make_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Feed#make_feed
is_singleton: false
name: make_feed
params: ()
visibility: private
PK�|[RD<�__3ri/1.8/system/RSS/Maker/Atom/Entry/cdesc-Entry.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::Maker::Atom::Entry
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: make_feed
- !ruby/object:RI::MethodSummary 
  name: setup_elements
name: Entry
superclass: RSSBase
PK�|[�V����Hri/1.8/system/RSS/Maker/Atom/Entry/Items/Item/_set_default_values-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Entry::Items::Item#_set_default_values
is_singleton: false
name: _set_default_values
params: (&block)
visibility: private
PK�|[��%���>ri/1.8/system/RSS/Maker/Atom/Entry/Items/Item/variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Entry::Items::Item#variables
is_singleton: false
name: variables
params: ()
visibility: private
PK�|[�)�9��Lri/1.8/system/RSS/Maker/Atom/Entry/Items/Item/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Entry::Items::Item#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[����Gri/1.8/system/RSS/Maker/Atom/Entry/Items/Item/variable_is_set%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Entry::Items::Item#variable_is_set?
is_singleton: false
name: variable_is_set?
params: ()
visibility: private
PK�|[zwx��<ri/1.8/system/RSS/Maker/Atom/Entry/Items/Item/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Entry::Items::Item#to_feed
is_singleton: false
name: to_feed
params: (entry)
visibility: public
PK�|[2B~�@@=ri/1.8/system/RSS/Maker/Atom/Entry/Items/Item/cdesc-Item.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Guid
  value: Feed::Items::Item::Guid
- !ruby/object:RI::Constant 
  comment: 
  name: Enclosure
  value: Feed::Items::Item::Enclosure
- !ruby/object:RI::Constant 
  comment: 
  name: Source
  value: Feed::Items::Item::Source
- !ruby/object:RI::Constant 
  comment: 
  name: Categories
  value: Feed::Items::Item::Categories
- !ruby/object:RI::Constant 
  comment: 
  name: Authors
  value: Feed::Items::Item::Authors
- !ruby/object:RI::Constant 
  comment: 
  name: Contributors
  value: Feed::Items::Item::Contributors
- !ruby/object:RI::Constant 
  comment: 
  name: Links
  value: Feed::Items::Item::Links
- !ruby/object:RI::Constant 
  comment: 
  name: Rights
  value: Feed::Items::Item::Rights
- !ruby/object:RI::Constant 
  comment: 
  name: Description
  value: Feed::Items::Item::Description
- !ruby/object:RI::Constant 
  comment: 
  name: Title
  value: Feed::Items::Item::Title
- !ruby/object:RI::Constant 
  comment: 
  name: Content
  value: Feed::Items::Item::Content
full_name: RSS::Maker::Atom::Entry::Items::Item
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _set_default_values
- !ruby/object:RI::MethodSummary 
  name: not_set_required_variables
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
- !ruby/object:RI::MethodSummary 
  name: variable_is_set?
- !ruby/object:RI::MethodSummary 
  name: variables
name: Item
superclass: ItemBase
PK�|[Ƴ����Ori/1.8/system/RSS/Maker/Atom/Entry/Items/Item/not_set_required_variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Entry::Items::Item#not_set_required_variables
is_singleton: false
name: not_set_required_variables
params: ()
visibility: private
PK�|[b|�9ri/1.8/system/RSS/Maker/Atom/Entry/Items/cdesc-Items.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Entry::Items
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Items
superclass: ItemsBase
PK�|[_F��7ri/1.8/system/RSS/Maker/Atom/Entry/Items/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Entry::Items#to_feed
is_singleton: false
name: to_feed
params: (entry)
visibility: public
PK�|[Ա�X��Iri/1.8/system/RSS/Maker/Atom/Entry/Channel/SkipHours/cdesc-SkipHours.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Entry::Channel::SkipHours
includes: []

instance_methods: []

name: SkipHours
superclass: SkipHoursBase
PK�|[��"y��Iri/1.8/system/RSS/Maker/Atom/Entry/Channel/SkipHours/Hour/cdesc-Hour.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Entry::Channel::SkipHours::Hour
includes: []

instance_methods: []

name: Hour
superclass: HourBase
PK�|[�..B��=ri/1.8/system/RSS/Maker/Atom/Entry/Channel/cdesc-Channel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Categories
  value: Feed::Channel::Categories
- !ruby/object:RI::Constant 
  comment: 
  name: Links
  value: Feed::Channel::Links
- !ruby/object:RI::Constant 
  comment: 
  name: Authors
  value: Feed::Channel::Authors
- !ruby/object:RI::Constant 
  comment: 
  name: Contributors
  value: Feed::Channel::Contributors
- !ruby/object:RI::Constant 
  comment: 
  name: Copyright
  value: Feed::Channel::Copyright
- !ruby/object:RI::Constant 
  comment: 
  name: Title
  value: Feed::Channel::Title
full_name: RSS::Maker::Atom::Entry::Channel
includes: []

instance_methods: []

name: Channel
superclass: ChannelBase
PK�|[y"s���Ari/1.8/system/RSS/Maker/Atom/Entry/Channel/Cloud/cdesc-Cloud.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Entry::Channel::Cloud
includes: []

instance_methods: []

name: Cloud
superclass: CloudBase
PK�|[ڦ*RRIri/1.8/system/RSS/Maker/Atom/Entry/Channel/Generator/cdesc-Generator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: not_set_name
comment: 
constants: []

full_name: RSS::Maker::Atom::Entry::Channel::Generator
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomGenerator
instance_methods: []

name: Generator
superclass: GeneratorBase
PK�|[oM�6��Hri/1.8/system/RSS/Maker/Atom/Entry/Channel/Generator/not_set_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Entry::Channel::Generator::not_set_name
is_singleton: true
name: not_set_name
params: ()
visibility: public
PK�|[h��Mri/1.8/system/RSS/Maker/Atom/Entry/Channel/Description/cdesc-Description.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Entry::Channel::Description
includes: []

instance_methods: []

name: Description
superclass: DescriptionBase
PK�|[%	���Fri/1.8/system/RSS/Maker/Atom/Entry/Channel/SkipDays/Day/cdesc-Day.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Entry::Channel::SkipDays::Day
includes: []

instance_methods: []

name: Day
superclass: DayBase
PK�|[B����Gri/1.8/system/RSS/Maker/Atom/Entry/Channel/SkipDays/cdesc-SkipDays.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Entry::Channel::SkipDays
includes: []

instance_methods: []

name: SkipDays
superclass: SkipDaysBase
PK�|[��e���9ri/1.8/system/RSS/Maker/Atom/Entry/Image/cdesc-Image.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Entry::Image
includes: []

instance_methods: []

name: Image
superclass: ImageBase
PK�|[�D����Ari/1.8/system/RSS/Maker/Atom/Entry/Textinput/cdesc-Textinput.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom::Entry::Textinput
includes: []

instance_methods: []

name: Textinput
superclass: TextinputBase
PK�|[}h�1��-ri/1.8/system/RSS/Maker/Atom/Entry/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Entry::new
is_singleton: true
name: new
params: (feed_version="1.0")
visibility: public
PK�|[u�#|��8ri/1.8/system/RSS/Maker/Atom/Entry/setup_elements-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Entry#setup_elements
is_singleton: false
name: setup_elements
params: (entry)
visibility: private
PK�|[�����3ri/1.8/system/RSS/Maker/Atom/Entry/make_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::Atom::Entry#make_feed
is_singleton: false
name: make_feed
params: ()
visibility: private
PK�|[�G���,ri/1.8/system/RSS/Maker/Atom/cdesc-Atom.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::Atom
includes: []

instance_methods: []

name: Atom
superclass: 
PK�|[։����?ri/1.8/system/RSS/Maker/ITunesBaseModel/def_csv_accessor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ITunesBaseModel#def_csv_accessor
is_singleton: false
name: def_csv_accessor
params: (klass, full_name)
visibility: public
PK�|[ǤO���Eri/1.8/system/RSS/Maker/ITunesBaseModel/def_yes_other_accessor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ITunesBaseModel#def_yes_other_accessor
is_singleton: false
name: def_yes_other_accessor
params: (klass, full_name)
visibility: public
PK�|[�:G�LLJri/1.8/system/RSS/Maker/ITunesBaseModel/def_elements_class_accessor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ITunesBaseModel#def_elements_class_accessor
is_singleton: false
name: def_elements_class_accessor
params: (klass, name, full_name, full_plural_name, klass_name, plural_klass_name, recommended_attribute_name=nil)
visibility: public
PK�|[ �]���Ari/1.8/system/RSS/Maker/ITunesBaseModel/def_class_accessor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ITunesBaseModel#def_class_accessor
is_singleton: false
name: def_class_accessor
params: (klass, name, type, *args)
visibility: public
PK�|[U4ϏBri/1.8/system/RSS/Maker/ITunesBaseModel/cdesc-ITunesBaseModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ITunesBaseModel
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: def_class_accessor
- !ruby/object:RI::MethodSummary 
  name: def_csv_accessor
- !ruby/object:RI::MethodSummary 
  name: def_elements_class_accessor
- !ruby/object:RI::MethodSummary 
  name: def_yes_clean_other_accessor
- !ruby/object:RI::MethodSummary 
  name: def_yes_other_accessor
name: ITunesBaseModel
superclass: 
PK�|[U<����Kri/1.8/system/RSS/Maker/ITunesBaseModel/def_yes_clean_other_accessor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ITunesBaseModel#def_yes_clean_other_accessor
is_singleton: false
name: def_yes_clean_other_accessor
params: (klass, full_name)
visibility: public
PK�|[T����(ri/1.8/system/RSS/Maker/add_maker-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::add_maker
is_singleton: true
name: add_maker
params: (version, normalized_version, maker)
visibility: public
PK�|[m�{���Bri/1.8/system/RSS/Maker/TaxonomyTopicsModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::TaxonomyTopicsModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[I=�G��Fri/1.8/system/RSS/Maker/TaxonomyTopicsModel/install_taxo_topics-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::TaxonomyTopicsModel::install_taxo_topics
is_singleton: true
name: install_taxo_topics
params: (klass)
visibility: public
PK�|[�#S�11\ri/1.8/system/RSS/Maker/TaxonomyTopicsModel/TaxonomyTopicsBase/cdesc-TaxonomyTopicsBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: resources
  rw: R
class_methods: []

comment: 
constants: []

full_name: RSS::Maker::TaxonomyTopicsModel::TaxonomyTopicsBase
includes: []

instance_methods: []

name: TaxonomyTopicsBase
superclass: Base
PK�|[{�4NNJri/1.8/system/RSS/Maker/TaxonomyTopicsModel/cdesc-TaxonomyTopicsModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
- !ruby/object:RI::MethodSummary 
  name: install_taxo_topics
comment: 
constants: []

full_name: RSS::Maker::TaxonomyTopicsModel
includes: []

instance_methods: []

name: TaxonomyTopicsModel
superclass: 
PK�|[�"�W��5ri/1.8/system/RSS/Maker/ItemsBase/sort_if_need-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase#sort_if_need
is_singleton: false
name: sort_if_need
params: ()
visibility: private
PK�|[��\ǻ�2ri/1.8/system/RSS/Maker/ItemsBase/normalize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase#normalize
is_singleton: false
name: normalize
params: ()
visibility: public
PK�|[�*�˴�,ri/1.8/system/RSS/Maker/ItemsBase/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase::new
is_singleton: true
name: new
params: (maker)
visibility: public
PK�|[Jc�2Lri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/xml_content%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: xml=
block_params: 
comment: 
full_name: RSS::Maker::ItemsBase::ItemBase::ContentBase#xml_content=
is_singleton: false
name: xml_content=
params: (content)
visibility: public
PK�|[��,��Mri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/inline_other%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase::ItemBase::ContentBase#inline_other?
is_singleton: false
name: inline_other?
params: ()
visibility: public
PK�|[�M�u

Dri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/xml%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #xml_content="
full_name: RSS::Maker::ItemsBase::ItemBase::ContentBase#xml=
is_singleton: false
name: xml=
params: (content)
visibility: public
PK�|[�>B��Lri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/out_of_line%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase::ItemBase::ContentBase#out_of_line?
is_singleton: false
name: out_of_line?
params: ()
visibility: public
PK�|[ ����Lri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/inline_text%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase::ItemBase::ContentBase#inline_text?
is_singleton: false
name: inline_text?
params: ()
visibility: public
PK�|[��~��Mri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/inline_xhtml%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase::ItemBase::ContentBase#inline_xhtml?
is_singleton: false
name: inline_xhtml?
params: ()
visibility: public
PK�|[��2���Rri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/inline_other_text%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase::ItemBase::ContentBase#inline_other_text?
is_singleton: false
name: inline_other_text?
params: ()
visibility: public
PK�|[�jp���Lri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/inline_html%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase::ItemBase::ContentBase#inline_html?
is_singleton: false
name: inline_html?
params: ()
visibility: public
PK�|[��0��Tri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/inline_other_base64%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase::ItemBase::ContentBase#inline_other_base64?
is_singleton: false
name: inline_other_base64?
params: ()
visibility: public
PK�|[yS���Qri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/inline_other_xml%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase::ItemBase::ContentBase#inline_other_xml?
is_singleton: false
name: inline_other_xml?
params: ()
visibility: public
PK�|[�D�bbbMri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/cdesc-ContentBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ItemsBase::ItemBase::ContentBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomTextConstructBase::EnsureXMLContent
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: inline_html?
- !ruby/object:RI::MethodSummary 
  name: inline_other?
- !ruby/object:RI::MethodSummary 
  name: inline_other_base64?
- !ruby/object:RI::MethodSummary 
  name: inline_other_text?
- !ruby/object:RI::MethodSummary 
  name: inline_other_xml?
- !ruby/object:RI::MethodSummary 
  name: inline_text?
- !ruby/object:RI::MethodSummary 
  name: inline_xhtml?
- !ruby/object:RI::MethodSummary 
  name: out_of_line?
- !ruby/object:RI::MethodSummary 
  name: xml=
- !ruby/object:RI::MethodSummary 
  name: xml_content=
name: ContentBase
superclass: Base
PK�|[^�w((Uri/1.8/system/RSS/Maker/ItemsBase/ItemBase/DescriptionBase/cdesc-DescriptionBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ItemsBase::ItemBase::DescriptionBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomTextConstructBase
instance_methods: []

name: DescriptionBase
superclass: Base
PK�|[Ǭ���;ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase::ItemBase#<=>
is_singleton: false
name: <=>
params: (other)
visibility: public
PK�|[������Gri/1.8/system/RSS/Maker/ItemsBase/ItemBase/GuidBase/cdesc-GuidBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ItemsBase::ItemBase::GuidBase
includes: []

instance_methods: []

name: GuidBase
superclass: Base
PK�|[H;���9ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/date%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase::ItemBase#date=
is_singleton: false
name: date=
params: (_date)
visibility: public
PK�|[������<ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/updated%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase::ItemBase#updated=
is_singleton: false
name: updated=
params: (date)
visibility: public
PK�|[!'C�Iri/1.8/system/RSS/Maker/ItemsBase/ItemBase/TitleBase/cdesc-TitleBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ItemsBase::ItemBase::TitleBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomTextConstructBase
instance_methods: []

name: TitleBase
superclass: Base
PK�|[�u���9ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/pubDate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase::ItemBase#pubDate
is_singleton: false
name: pubDate
params: ()
visibility: public
PK�|[$hs���Qri/1.8/system/RSS/Maker/ItemsBase/ItemBase/EnclosureBase/cdesc-EnclosureBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ItemsBase::ItemBase::EnclosureBase
includes: []

instance_methods: []

name: EnclosureBase
superclass: Base
PK�|[��m��Sri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ITunesDuration/cdesc-ITunesDuration.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ItemsBase::ItemBase::ITunesDuration
includes: []

instance_methods: []

name: ITunesDuration
superclass: ITunesDurationBase
PK�|[N��u\\>ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/cdesc-ItemBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: CategoriesBase
  value: ChannelBase::CategoriesBase
- !ruby/object:RI::Constant 
  comment: 
  name: AuthorsBase
  value: ChannelBase::AuthorsBase
- !ruby/object:RI::Constant 
  comment: 
  name: LinksBase
  value: ChannelBase::LinksBase
- !ruby/object:RI::Constant 
  comment: 
  name: ContributorsBase
  value: ChannelBase::ContributorsBase
full_name: RSS::Maker::ItemsBase::ItemBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: DublinCoreModel
- !ruby/object:RI::IncludedModule 
  name: TrackBackModel
- !ruby/object:RI::IncludedModule 
  name: Maker::ITunesItemModel
- !ruby/object:RI::IncludedModule 
  name: Maker::ImageItemModel
- !ruby/object:RI::IncludedModule 
  name: ContentModel
- !ruby/object:RI::IncludedModule 
  name: TaxonomyTopicsModel
- !ruby/object:RI::IncludedModule 
  name: SetupDefaultDate
- !ruby/object:RI::IncludedModule 
  name: SlashModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: date=
- !ruby/object:RI::MethodSummary 
  name: pubDate
- !ruby/object:RI::MethodSummary 
  name: pubDate=
- !ruby/object:RI::MethodSummary 
  name: updated
- !ruby/object:RI::MethodSummary 
  name: updated=
name: ItemBase
superclass: Object
PK�|[
}���<ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/pubDate%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase::ItemBase#pubDate=
is_singleton: false
name: pubDate=
params: (date)
visibility: public
PK�|[%��Kri/1.8/system/RSS/Maker/ItemsBase/ItemBase/RightsBase/cdesc-RightsBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ItemsBase::ItemBase::RightsBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomTextConstructBase
instance_methods: []

name: RightsBase
superclass: Base
PK�|[n�x���9ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/updated-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase::ItemBase#updated
is_singleton: false
name: updated
params: ()
visibility: public
PK�|[�-T�..Zri/1.8/system/RSS/Maker/ItemsBase/ItemBase/SourceBase/SubtitleBase/cdesc-SubtitleBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ItemsBase::ItemBase::SourceBase::SubtitleBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomTextConstructBase
instance_methods: []

name: SubtitleBase
superclass: Base
PK�|[�����Rri/1.8/system/RSS/Maker/ItemsBase/ItemBase/SourceBase/IconBase/cdesc-IconBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ItemsBase::ItemBase::SourceBase::IconBase
includes: []

instance_methods: []

name: IconBase
superclass: Base
PK�|[�x���Kri/1.8/system/RSS/Maker/ItemsBase/ItemBase/SourceBase/cdesc-SourceBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: AuthorsBase
  value: ChannelBase::AuthorsBase
- !ruby/object:RI::Constant 
  comment: 
  name: CategoriesBase
  value: ChannelBase::CategoriesBase
- !ruby/object:RI::Constant 
  comment: 
  name: ContributorsBase
  value: ChannelBase::ContributorsBase
- !ruby/object:RI::Constant 
  comment: 
  name: GeneratorBase
  value: ChannelBase::GeneratorBase
- !ruby/object:RI::Constant 
  comment: 
  name: LinksBase
  value: ChannelBase::LinksBase
full_name: RSS::Maker::ItemsBase::ItemBase::SourceBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: SetupDefaultDate
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: date=
- !ruby/object:RI::MethodSummary 
  name: updated
- !ruby/object:RI::MethodSummary 
  name: updated=
name: SourceBase
superclass: Base
PK�|[)?�\��Dri/1.8/system/RSS/Maker/ItemsBase/ItemBase/SourceBase/date%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase::ItemBase::SourceBase#date=
is_singleton: false
name: date=
params: (_date)
visibility: public
PK�|[��/���Gri/1.8/system/RSS/Maker/ItemsBase/ItemBase/SourceBase/updated%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase::ItemBase::SourceBase#updated=
is_singleton: false
name: updated=
params: (date)
visibility: public
PK�|[v�N((Tri/1.8/system/RSS/Maker/ItemsBase/ItemBase/SourceBase/TitleBase/cdesc-TitleBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ItemsBase::ItemBase::SourceBase::TitleBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomTextConstructBase
instance_methods: []

name: TitleBase
superclass: Base
PK�|[��k**Vri/1.8/system/RSS/Maker/ItemsBase/ItemBase/SourceBase/RightsBase/cdesc-RightsBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ItemsBase::ItemBase::SourceBase::RightsBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomTextConstructBase
instance_methods: []

name: RightsBase
superclass: Base
PK�|[-�l���Dri/1.8/system/RSS/Maker/ItemsBase/ItemBase/SourceBase/updated-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ItemsBase::ItemBase::SourceBase#updated
is_singleton: false
name: updated
params: ()
visibility: public
PK�|[��H��Rri/1.8/system/RSS/Maker/ItemsBase/ItemBase/SourceBase/LogoBase/cdesc-LogoBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ItemsBase::ItemBase::SourceBase::LogoBase
includes: []

instance_methods: []

name: LogoBase
superclass: Base
PK�|[Y3 M��6ri/1.8/system/RSS/Maker/ItemsBase/cdesc-ItemsBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: do_sort
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: max_size
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::Maker::ItemsBase
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: normalize
- !ruby/object:RI::MethodSummary 
  name: sort_if_need
name: ItemsBase
superclass: Object
PK�|[.^���Iri/1.8/system/RSS/Maker/RSS20/Items/Item/Source/Links/Link/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Items::Item::Source::Links::Link#to_feed
is_singleton: false
name: to_feed
params: (rss, source)
visibility: public
PK�|[�T^f44Jri/1.8/system/RSS/Maker/RSS20/Items/Item/Source/Links/Link/cdesc-Link.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Items::Item::Source::Links::Link
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Link
superclass: RSS09::Items::Item::Source::Links::Link
PK�|[�i��))Fri/1.8/system/RSS/Maker/RSS20/Items/Item/Source/Links/cdesc-Links.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Items::Item::Source::Links
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Links
superclass: RSS09::Items::Item::Source::Links
PK�|[�z7���Dri/1.8/system/RSS/Maker/RSS20/Items/Item/Source/Links/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Items::Item::Source::Links#to_feed
is_singleton: false
name: to_feed
params: (rss, source)
visibility: public
PK�|[�o��Nri/1.8/system/RSS/Maker/RSS20/Items/Item/Source/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Items::Item::Source#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[�JA���>ri/1.8/system/RSS/Maker/RSS20/Items/Item/Source/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Items::Item::Source#to_feed
is_singleton: false
name: to_feed
params: (rss, item)
visibility: public
PK�|[��^^Ari/1.8/system/RSS/Maker/RSS20/Items/Item/Source/cdesc-Source.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Items::Item::Source
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Source
superclass: RSS09::Items::Item::Source
PK�|[M�����9ri/1.8/system/RSS/Maker/RSS20/Items/Item/variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Items::Item#variables
is_singleton: false
name: variables
params: ()
visibility: private
PK�|[|���Gri/1.8/system/RSS/Maker/RSS20/Items/Item/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Items::Item#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[�Z3ggGri/1.8/system/RSS/Maker/RSS20/Items/Item/Enclosure/cdesc-Enclosure.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Items::Item::Enclosure
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Enclosure
superclass: RSS09::Items::Item::Enclosure
PK�|[���B��Qri/1.8/system/RSS/Maker/RSS20/Items/Item/Enclosure/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Items::Item::Enclosure#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[�^���Ari/1.8/system/RSS/Maker/RSS20/Items/Item/Enclosure/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Items::Item::Enclosure#to_feed
is_singleton: false
name: to_feed
params: (rss, item)
visibility: public
PK�|[(��F��Fri/1.8/system/RSS/Maker/RSS20/Items/Item/Authors/Author/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Items::Item::Authors::Author#to_feed
is_singleton: false
name: to_feed
params: (rss, item)
visibility: public
PK�|[<͟g..Iri/1.8/system/RSS/Maker/RSS20/Items/Item/Authors/Author/cdesc-Author.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Items::Item::Authors::Author
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Author
superclass: RSS09::Items::Item::Authors::Author
PK�|[b�����?ri/1.8/system/RSS/Maker/RSS20/Items/Item/Authors/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Items::Item::Authors#to_feed
is_singleton: false
name: to_feed
params: (rss, item)
visibility: public
PK�|[geHCri/1.8/system/RSS/Maker/RSS20/Items/Item/Authors/cdesc-Authors.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Items::Item::Authors
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Authors
superclass: RSS09::Items::Item::Authors
PK�|[���]((Iri/1.8/system/RSS/Maker/RSS20/Items/Item/Categories/cdesc-Categories.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Items::Item::Categories
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Categories
superclass: RSS09::Items::Item::Categories
PK�|[H��||Pri/1.8/system/RSS/Maker/RSS20/Items/Item/Categories/Category/cdesc-Category.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Items::Item::Categories::Category
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Category
superclass: RSS09::Items::Item::Categories::Category
PK�|[���9��[ri/1.8/system/RSS/Maker/RSS20/Items/Item/Categories/Category/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Items::Item::Categories::Category#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[�KS��Kri/1.8/system/RSS/Maker/RSS20/Items/Item/Categories/Category/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Items::Item::Categories::Category#to_feed
is_singleton: false
name: to_feed
params: (rss, item)
visibility: public
PK�|[�U\���Bri/1.8/system/RSS/Maker/RSS20/Items/Item/Categories/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Items::Item::Categories#to_feed
is_singleton: false
name: to_feed
params: (rss, item)
visibility: public
PK�|[�����Lri/1.8/system/RSS/Maker/RSS20/Items/Item/Guid/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Items::Item::Guid#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[�Ɋ�XX=ri/1.8/system/RSS/Maker/RSS20/Items/Item/Guid/cdesc-Guid.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Items::Item::Guid
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Guid
superclass: RSS09::Items::Item::Guid
PK�|[�;}k��<ri/1.8/system/RSS/Maker/RSS20/Items/Item/Guid/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Items::Item::Guid#to_feed
is_singleton: false
name: to_feed
params: (rss, item)
visibility: public
PK�|[��W��8ri/1.8/system/RSS/Maker/RSS20/Items/Item/cdesc-Item.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Items::Item
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: not_set_required_variables
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: variables
name: Item
superclass: RSS09::Items::Item
PK�|[F٪��Jri/1.8/system/RSS/Maker/RSS20/Items/Item/not_set_required_variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Items::Item#not_set_required_variables
is_singleton: false
name: not_set_required_variables
params: ()
visibility: private
PK�|[�q�=��4ri/1.8/system/RSS/Maker/RSS20/Items/cdesc-Items.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Items
includes: []

instance_methods: []

name: Items
superclass: RSS09::Items
PK�|[\8N��Dri/1.8/system/RSS/Maker/RSS20/Channel/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Channel#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[����Dri/1.8/system/RSS/Maker/RSS20/Channel/SkipHours/cdesc-SkipHours.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Channel::SkipHours
includes: []

instance_methods: []

name: SkipHours
superclass: RSS09::Channel::SkipHours
PK�|[0���Dri/1.8/system/RSS/Maker/RSS20/Channel/SkipHours/Hour/cdesc-Hour.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Channel::SkipHours::Hour
includes: []

instance_methods: []

name: Hour
superclass: RSS09::Channel::SkipHours::Hour
PK�|[Es8ri/1.8/system/RSS/Maker/RSS20/Channel/cdesc-Channel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Channel
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
name: Channel
superclass: RSS09::Channel
PK�|[B��U��Jri/1.8/system/RSS/Maker/RSS20/Channel/Cloud/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Channel::Cloud#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[?�~���:ri/1.8/system/RSS/Maker/RSS20/Channel/Cloud/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Channel::Cloud#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[�>
�SS<ri/1.8/system/RSS/Maker/RSS20/Channel/Cloud/cdesc-Cloud.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Channel::Cloud
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Cloud
superclass: RSS09::Channel::Cloud
PK�|[��(	��Nri/1.8/system/RSS/Maker/RSS20/Channel/Generator/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Channel::Generator#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[W�{�SSDri/1.8/system/RSS/Maker/RSS20/Channel/Generator/cdesc-Generator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Channel::Generator
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Generator
superclass: GeneratorBase
PK�|[�19���>ri/1.8/system/RSS/Maker/RSS20/Channel/Generator/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Channel::Generator#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[�Kb���Ari/1.8/system/RSS/Maker/RSS20/Channel/SkipDays/Day/cdesc-Day.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Channel::SkipDays::Day
includes: []

instance_methods: []

name: Day
superclass: RSS09::Channel::SkipDays::Day
PK�|[Aj���Bri/1.8/system/RSS/Maker/RSS20/Channel/SkipDays/cdesc-SkipDays.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Channel::SkipDays
includes: []

instance_methods: []

name: SkipDays
superclass: RSS09::Channel::SkipDays
PK�|[y�X�  Fri/1.8/system/RSS/Maker/RSS20/Channel/Categories/cdesc-Categories.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Channel::Categories
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Categories
superclass: RSS09::Channel::Categories
PK�|[3���ttMri/1.8/system/RSS/Maker/RSS20/Channel/Categories/Category/cdesc-Category.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Channel::Categories::Category
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: Category
superclass: RSS09::Channel::Categories::Category
PK�|[����Xri/1.8/system/RSS/Maker/RSS20/Channel/Categories/Category/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Channel::Categories::Category#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[�i����Hri/1.8/system/RSS/Maker/RSS20/Channel/Categories/Category/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Channel::Categories::Category#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[�۽=��?ri/1.8/system/RSS/Maker/RSS20/Channel/Categories/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Channel::Categories#to_feed
is_singleton: false
name: to_feed
params: (rss, channel)
visibility: public
PK�|[c7���.ri/1.8/system/RSS/Maker/RSS20/cdesc-RSS20.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::Maker::RSS20
includes: []

instance_methods: []

name: RSS20
superclass: RSS09
PK�|[�@o		4ri/1.8/system/RSS/Maker/RSS20/Image/cdesc-Image.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Image
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: required_element?
name: Image
superclass: RSS09::Image
PK�|[�5���>ri/1.8/system/RSS/Maker/RSS20/Image/required_element%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::Image#required_element?
is_singleton: false
name: required_element?
params: ()
visibility: private
PK�|[}ؖ���<ri/1.8/system/RSS/Maker/RSS20/Textinput/cdesc-Textinput.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::RSS20::Textinput
includes: []

instance_methods: []

name: Textinput
superclass: RSS09::Textinput
PK�|[��`Y��(ri/1.8/system/RSS/Maker/RSS20/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::RSS20::new
is_singleton: true
name: new
params: (feed_version="2.0")
visibility: public
PK�|[8����Jri/1.8/system/RSS/Maker/ChannelBase/LinksBase/LinkBase/cdesc-LinkBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::LinksBase::LinkBase
includes: []

instance_methods: []

name: LinkBase
superclass: Base
PK�|[#����Bri/1.8/system/RSS/Maker/ChannelBase/LinksBase/cdesc-LinksBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::LinksBase
includes: []

instance_methods: []

name: LinksBase
superclass: Base
PK�|[��E^  Nri/1.8/system/RSS/Maker/ChannelBase/DescriptionBase/cdesc-DescriptionBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::DescriptionBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomTextConstructBase
instance_methods: []

name: DescriptionBase
superclass: Base
PK�|[�t��2ri/1.8/system/RSS/Maker/ChannelBase/icon%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ChannelBase#icon=
is_singleton: false
name: icon=
params: (url)
visibility: public
PK�|[<�t���Fri/1.8/system/RSS/Maker/ChannelBase/ITunesImage/cdesc-ITunesImage.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::ITunesImage
includes: []

instance_methods: []

name: ITunesImage
superclass: ITunesImageBase
PK�|[U5T���Jri/1.8/system/RSS/Maker/ChannelBase/GeneratorBase/cdesc-GeneratorBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::GeneratorBase
includes: []

instance_methods: []

name: GeneratorBase
superclass: Base
PK�|[S�ߞ��;ri/1.8/system/RSS/Maker/ChannelBase/lastBuildDate%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ChannelBase#lastBuildDate=
is_singleton: false
name: lastBuildDate=
params: (_date)
visibility: public
PK�|[0t���Fri/1.8/system/RSS/Maker/ChannelBase/ITunesOwner/cdesc-ITunesOwner.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::ITunesOwner
includes: []

instance_methods: []

name: ITunesOwner
superclass: ITunesOwnerBase
PK�|[�f����Bri/1.8/system/RSS/Maker/ChannelBase/CloudBase/cdesc-CloudBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::CloudBase
includes: []

instance_methods: []

name: CloudBase
superclass: Base
PK�|[N����2ri/1.8/system/RSS/Maker/ChannelBase/logo%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ChannelBase#logo=
is_singleton: false
name: logo=
params: (url)
visibility: public
PK�|[�j��/ri/1.8/system/RSS/Maker/ChannelBase/icon-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ChannelBase#icon
is_singleton: false
name: icon
params: ()
visibility: public
PK�|[��w���/ri/1.8/system/RSS/Maker/ChannelBase/logo-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ChannelBase#logo
is_singleton: false
name: logo
params: ()
visibility: public
PK�|[�t�Jri/1.8/system/RSS/Maker/ChannelBase/CopyrightBase/cdesc-CopyrightBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::CopyrightBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomTextConstructBase
instance_methods: []

name: CopyrightBase
superclass: Base
PK�|[��QO��Pri/1.8/system/RSS/Maker/ChannelBase/ITunesCategories/cdesc-ITunesCategories.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::ITunesCategories
includes: []

instance_methods: []

name: ITunesCategories
superclass: ITunesCategoriesBase
PK�|[CE�KK]ri/1.8/system/RSS/Maker/ChannelBase/ITunesCategories/ITunesCategory/cdesc-ITunesCategory.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ITunesCategory
  value: self
full_name: RSS::Maker::ChannelBase::ITunesCategories::ITunesCategory
includes: []

instance_methods: []

name: ITunesCategory
superclass: ITunesCategoryBase
PK�|[�f����2ri/1.8/system/RSS/Maker/ChannelBase/date%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ChannelBase#date=
is_singleton: false
name: date=
params: (_date)
visibility: public
PK�|[��O��5ri/1.8/system/RSS/Maker/ChannelBase/updated%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ChannelBase#updated=
is_singleton: false
name: updated=
params: (date)
visibility: public
PK�|[�`p55:ri/1.8/system/RSS/Maker/ChannelBase/cdesc-ChannelBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: DublinCoreModel
- !ruby/object:RI::IncludedModule 
  name: Maker::ITunesChannelModel
- !ruby/object:RI::IncludedModule 
  name: SyndicationModel
- !ruby/object:RI::IncludedModule 
  name: Maker::ImageFaviconModel
- !ruby/object:RI::IncludedModule 
  name: TaxonomyTopicsModel
- !ruby/object:RI::IncludedModule 
  name: SetupDefaultDate
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: date=
- !ruby/object:RI::MethodSummary 
  name: icon
- !ruby/object:RI::MethodSummary 
  name: icon=
- !ruby/object:RI::MethodSummary 
  name: lastBuildDate=
- !ruby/object:RI::MethodSummary 
  name: logo
- !ruby/object:RI::MethodSummary 
  name: logo=
- !ruby/object:RI::MethodSummary 
  name: pubDate
- !ruby/object:RI::MethodSummary 
  name: pubDate=
- !ruby/object:RI::MethodSummary 
  name: updated
- !ruby/object:RI::MethodSummary 
  name: updated=
name: ChannelBase
superclass: Object
PK�|[Qa?�Bri/1.8/system/RSS/Maker/ChannelBase/TitleBase/cdesc-TitleBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::TitleBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomTextConstructBase
instance_methods: []

name: TitleBase
superclass: Base
PK�|[��8��2ri/1.8/system/RSS/Maker/ChannelBase/pubDate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ChannelBase#pubDate
is_singleton: false
name: pubDate
params: ()
visibility: public
PK�|[�B|���Wri/1.8/system/RSS/Maker/ChannelBase/CategoriesBase/CategoryBase/cdesc-CategoryBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::CategoriesBase::CategoryBase
includes: []

instance_methods: []

name: CategoryBase
superclass: Base
PK�|[��X��Lri/1.8/system/RSS/Maker/ChannelBase/CategoriesBase/cdesc-CategoriesBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::CategoriesBase
includes: []

instance_methods: []

name: CategoriesBase
superclass: Base
PK�|[H�D���Nri/1.8/system/RSS/Maker/ChannelBase/SkipHoursBase/HourBase/cdesc-HourBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::SkipHoursBase::HourBase
includes: []

instance_methods: []

name: HourBase
superclass: Base
PK�|[�-e��Jri/1.8/system/RSS/Maker/ChannelBase/SkipHoursBase/cdesc-SkipHoursBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::SkipHoursBase
includes: []

instance_methods: []

name: SkipHoursBase
superclass: Base
PK�|[�gS44_ri/1.8/system/RSS/Maker/ChannelBase/ContributorsBase/ContributorBase/cdesc-ContributorBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::ContributorsBase::ContributorBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomPersonConstructBase
instance_methods: []

name: ContributorBase
superclass: Base
PK�|[b��~��Pri/1.8/system/RSS/Maker/ChannelBase/ContributorsBase/cdesc-ContributorsBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::ContributorsBase
includes: []

instance_methods: []

name: ContributorsBase
superclass: Base
PK�|[��ZW��Kri/1.8/system/RSS/Maker/ChannelBase/SkipDaysBase/DayBase/cdesc-DayBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::SkipDaysBase::DayBase
includes: []

instance_methods: []

name: DayBase
superclass: Base
PK�|[b�`��Hri/1.8/system/RSS/Maker/ChannelBase/SkipDaysBase/cdesc-SkipDaysBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::SkipDaysBase
includes: []

instance_methods: []

name: SkipDaysBase
superclass: Base
PK�|[!/��5ri/1.8/system/RSS/Maker/ChannelBase/pubDate%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ChannelBase#pubDate=
is_singleton: false
name: pubDate=
params: (date)
visibility: public
PK�|[O5+��2ri/1.8/system/RSS/Maker/ChannelBase/updated-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ChannelBase#updated
is_singleton: false
name: updated
params: ()
visibility: public
PK�|[�	8���Fri/1.8/system/RSS/Maker/ChannelBase/AuthorsBase/cdesc-AuthorsBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::AuthorsBase
includes: []

instance_methods: []

name: AuthorsBase
superclass: Base
PK�|[�c�5%%Pri/1.8/system/RSS/Maker/ChannelBase/AuthorsBase/AuthorBase/cdesc-AuthorBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ChannelBase::AuthorsBase::AuthorBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: AtomPersonConstructBase
instance_methods: []

name: AuthorBase
superclass: Base
PK�|[P����Sri/1.8/system/RSS/Maker/XMLStyleSheets/XMLStyleSheet/required_variable_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::XMLStyleSheets::XMLStyleSheet#required_variable_names
is_singleton: false
name: required_variable_names
params: ()
visibility: private
PK�|[�v����Nri/1.8/system/RSS/Maker/XMLStyleSheets/XMLStyleSheet/guess_type_if_need-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::XMLStyleSheets::XMLStyleSheet#guess_type_if_need
is_singleton: false
name: guess_type_if_need
params: (xss)
visibility: private
PK�|[��+���Cri/1.8/system/RSS/Maker/XMLStyleSheets/XMLStyleSheet/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::XMLStyleSheets::XMLStyleSheet#to_feed
is_singleton: false
name: to_feed
params: (feed)
visibility: public
PK�|[x ���Mri/1.8/system/RSS/Maker/XMLStyleSheets/XMLStyleSheet/cdesc-XMLStyleSheet.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::XMLStyleSheets::XMLStyleSheet
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: guess_type_if_need
- !ruby/object:RI::MethodSummary 
  name: required_variable_names
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: XMLStyleSheet
superclass: Base
PK�|[��]���@ri/1.8/system/RSS/Maker/XMLStyleSheets/cdesc-XMLStyleSheets.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Maker::XMLStyleSheets
includes: []

instance_methods: []

name: XMLStyleSheets
superclass: Base
PK�|[�����Fri/1.8/system/RSS/Maker/ImageFaviconModel/install_image_favicon-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ImageFaviconModel::install_image_favicon
is_singleton: true
name: install_image_favicon
params: (klass)
visibility: public
PK�|[�[fW��@ri/1.8/system/RSS/Maker/ImageFaviconModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ImageFaviconModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[�y�LLFri/1.8/system/RSS/Maker/ImageFaviconModel/cdesc-ImageFaviconModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
- !ruby/object:RI::MethodSummary 
  name: install_image_favicon
comment: 
constants: []

full_name: RSS::Maker::ImageFaviconModel
includes: []

instance_methods: []

name: ImageFaviconModel
superclass: 
PK�|[��k]��Yri/1.8/system/RSS/Maker/ImageFaviconModel/ImageFaviconBase/have_required_values%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ImageFaviconModel::ImageFaviconBase#have_required_values?
is_singleton: false
name: have_required_values?
params: ()
visibility: public
PK�|[x~��Iri/1.8/system/RSS/Maker/ImageFaviconModel/ImageFaviconBase/to_feed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ImageFaviconModel::ImageFaviconBase#to_feed
is_singleton: false
name: to_feed
params: (feed, current)
visibility: public
PK�|[����Vri/1.8/system/RSS/Maker/ImageFaviconModel/ImageFaviconBase/cdesc-ImageFaviconBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: about
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: image_size
  rw: RW
class_methods: []

comment: 
constants: []

full_name: RSS::Maker::ImageFaviconModel::ImageFaviconBase
includes: 
- !ruby/object:RI::IncludedModule 
  name: Maker::DublinCoreModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: have_required_values?
- !ruby/object:RI::MethodSummary 
  name: to_feed
name: ImageFaviconBase
superclass: Base
PK�|[�û��(ri/1.8/system/RSS/Maker/cdesc-Maker.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_maker
- !ruby/object:RI::MethodSummary 
  name: make
- !ruby/object:RI::MethodSummary 
  name: maker
- !ruby/object:RI::MethodSummary 
  name: makers
- !ruby/object:RI::MethodSummary 
  name: versions
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: MAKERS
  value: "{}"
full_name: RSS::Maker
includes: []

instance_methods: []

name: Maker
superclass: 
PK�|[��GV<ri/1.8/system/RSS/Maker/ContentModel/cdesc-ContentModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: []

full_name: RSS::Maker::ContentModel
includes: []

instance_methods: []

name: ContentModel
superclass: 
PK�|[B���;ri/1.8/system/RSS/Maker/ContentModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::ContentModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[�v��%ri/1.8/system/RSS/Maker/makers-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Maker::makers
is_singleton: true
name: makers
params: ()
visibility: public
PK�|[ಓ���3ri/1.8/system/RSS/NotAvailableValueError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::NotAvailableValueError::new
is_singleton: true
name: new
params: (tag, value, attribute=nil)
visibility: public
PK�|[�����Jri/1.8/system/RSS/NotAvailableValueError/cdesc-NotAvailableValueError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: attribute
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: tag
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: value
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::NotAvailableValueError
includes: []

instance_methods: []

name: NotAvailableValueError
superclass: InvalidRSSError
PK�|[g_#II>ri/1.8/system/RSS/Atom/Feed/Contributor/cdesc-Contributor.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Atom::Feed::Contributor
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
- !ruby/object:RI::IncludedModule 
  name: PersonConstruct
instance_methods: []

name: Contributor
superclass: RSS::Element
PK�|[4����7ri/1.8/system/RSS/Atom/Feed/setup_maker_elements-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed#setup_maker_elements
is_singleton: false
name: setup_maker_elements
params: (channel)
visibility: private
PK�|[��&6>>+ri/1.8/system/RSS/Atom/Feed/cdesc-Feed.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::Atom::Feed
includes: 
- !ruby/object:RI::IncludedModule 
  name: RootElementMixin
- !ruby/object:RI::IncludedModule 
  name: CommonModel
- !ruby/object:RI::IncludedModule 
  name: DuplicateLinkChecker
- !ruby/object:RI::IncludedModule 
  name: DublinCoreModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: atom_validate
- !ruby/object:RI::MethodSummary 
  name: have_author?
- !ruby/object:RI::MethodSummary 
  name: have_required_elements?
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: setup_maker_element
- !ruby/object:RI::MethodSummary 
  name: setup_maker_elements
name: Feed
superclass: RSS::Element
PK�|[��;;2ri/1.8/system/RSS/Atom/Feed/Title/cdesc-Title.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Atom::Feed::Title
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
- !ruby/object:RI::IncludedModule 
  name: TextConstruct
instance_methods: []

name: Title
superclass: RSS::Element
PK�|[��??4ri/1.8/system/RSS/Atom/Feed/Author/cdesc-Author.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Atom::Feed::Author
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
- !ruby/object:RI::IncludedModule 
  name: PersonConstruct
instance_methods: []

name: Author
superclass: RSS::Element
PK�|[�.v��0ri/1.8/system/RSS/Atom/Feed/atom_validate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed#atom_validate
is_singleton: false
name: atom_validate
params: (ignore_unknown_element, tags, uri)
visibility: private
PK�|[��AA8ri/1.8/system/RSS/Atom/Feed/Subtitle/cdesc-Subtitle.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Atom::Feed::Subtitle
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
- !ruby/object:RI::IncludedModule 
  name: TextConstruct
instance_methods: []

name: Subtitle
superclass: RSS::Element
PK�|[�V��440ri/1.8/system/RSS/Atom/Feed/Link/cdesc-Link.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Atom::Feed::Link
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maker_target
name: Link
superclass: RSS::Element
PK�|[�6M��4ri/1.8/system/RSS/Atom/Feed/Link/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Link#maker_target
is_singleton: false
name: maker_target
params: (target)
visibility: private
PK�|[�mp��2ri/1.8/system/RSS/Atom/Feed/Entry/cdesc-Entry.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Author
  value: Feed::Author
- !ruby/object:RI::Constant 
  comment: 
  name: Category
  value: Feed::Category
- !ruby/object:RI::Constant 
  comment: 
  name: Contributor
  value: Feed::Contributor
- !ruby/object:RI::Constant 
  comment: 
  name: Id
  value: Feed::Id
- !ruby/object:RI::Constant 
  comment: 
  name: Link
  value: Feed::Link
- !ruby/object:RI::Constant 
  comment: 
  name: Rights
  value: Feed::Rights
- !ruby/object:RI::Constant 
  comment: 
  name: Title
  value: Feed::Title
- !ruby/object:RI::Constant 
  comment: 
  name: Updated
  value: Feed::Updated
full_name: RSS::Atom::Feed::Entry
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
- !ruby/object:RI::IncludedModule 
  name: DuplicateLinkChecker
- !ruby/object:RI::IncludedModule 
  name: DublinCoreModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: atom_validate
- !ruby/object:RI::MethodSummary 
  name: have_author?
- !ruby/object:RI::MethodSummary 
  name: have_required_elements?
- !ruby/object:RI::MethodSummary 
  name: maker_target
name: Entry
superclass: RSS::Element
PK�|[`u./��:ri/1.8/system/RSS/Atom/Feed/Entry/Source/cdesc-Source.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Author
  value: Feed::Author
- !ruby/object:RI::Constant 
  comment: 
  name: Category
  value: Feed::Category
- !ruby/object:RI::Constant 
  comment: 
  name: Contributor
  value: Feed::Contributor
- !ruby/object:RI::Constant 
  comment: 
  name: Generator
  value: Feed::Generator
- !ruby/object:RI::Constant 
  comment: 
  name: Icon
  value: Feed::Icon
- !ruby/object:RI::Constant 
  comment: 
  name: Id
  value: Feed::Id
- !ruby/object:RI::Constant 
  comment: 
  name: Link
  value: Feed::Link
- !ruby/object:RI::Constant 
  comment: 
  name: Logo
  value: Feed::Logo
- !ruby/object:RI::Constant 
  comment: 
  name: Rights
  value: Feed::Rights
- !ruby/object:RI::Constant 
  comment: 
  name: Subtitle
  value: Feed::Subtitle
- !ruby/object:RI::Constant 
  comment: 
  name: Title
  value: Feed::Title
- !ruby/object:RI::Constant 
  comment: 
  name: Updated
  value: Feed::Updated
full_name: RSS::Atom::Feed::Entry::Source
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: have_author?
name: Source
superclass: RSS::Element
PK�|[G�����>ri/1.8/system/RSS/Atom/Feed/Entry/Source/have_author%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry::Source#have_author?
is_singleton: false
name: have_author?
params: ()
visibility: public
PK�|[#�����6ri/1.8/system/RSS/Atom/Feed/Entry/atom_validate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry#atom_validate
is_singleton: false
name: atom_validate
params: (ignore_unknown_element, tags, uri)
visibility: private
PK�|[��JJ@ri/1.8/system/RSS/Atom/Feed/Entry/Published/cdesc-Published.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Atom::Feed::Entry::Published
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
- !ruby/object:RI::IncludedModule 
  name: DateConstruct
instance_methods: []

name: Published
superclass: RSS::Element
PK�|[�K8���Bri/1.8/system/RSS/Atom/Feed/Entry/have_required_elements%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry#have_required_elements?
is_singleton: false
name: have_required_elements?
params: ()
visibility: private
PK�|[��*���@ri/1.8/system/RSS/Atom/Feed/Entry/Content/inline_other%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry::Content#inline_other?
is_singleton: false
name: inline_other?
params: ()
visibility: public
PK�|[3(�G��;ri/1.8/system/RSS/Atom/Feed/Entry/Content/mime_split-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry::Content#mime_split
is_singleton: false
name: mime_split
params: ()
visibility: public
PK�|[�~����>ri/1.8/system/RSS/Atom/Feed/Entry/Content/atom_validate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry::Content#atom_validate
is_singleton: false
name: atom_validate
params: (ignore_unknown_element, tags, uri)
visibility: public
PK�|[yX�O��?ri/1.8/system/RSS/Atom/Feed/Entry/Content/out_of_line%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry::Content#out_of_line?
is_singleton: false
name: out_of_line?
params: ()
visibility: public
PK�|[ݝ�e��4ri/1.8/system/RSS/Atom/Feed/Entry/Content/xml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry::Content#xml
is_singleton: false
name: xml
params: ()
visibility: public
PK�|[������?ri/1.8/system/RSS/Atom/Feed/Entry/Content/inline_text%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry::Content#inline_text?
is_singleton: false
name: inline_text?
params: ()
visibility: public
PK�|[2a:���@ri/1.8/system/RSS/Atom/Feed/Entry/Content/inline_xhtml%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry::Content#inline_xhtml?
is_singleton: false
name: inline_xhtml?
params: ()
visibility: public
PK�|[��pb��Ari/1.8/system/RSS/Atom/Feed/Entry/Content/empty_content%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry::Content#empty_content?
is_singleton: false
name: empty_content?
params: ()
visibility: private
PK�|[�(L��Eri/1.8/system/RSS/Atom/Feed/Entry/Content/inline_other_text%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry::Content#inline_other_text?
is_singleton: false
name: inline_other_text?
params: ()
visibility: public
PK�|[b�P��Dri/1.8/system/RSS/Atom/Feed/Entry/Content/have_xml_content%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry::Content#have_xml_content?
is_singleton: false
name: have_xml_content?
params: ()
visibility: public
PK�|[����?ri/1.8/system/RSS/Atom/Feed/Entry/Content/inline_html%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry::Content#inline_html?
is_singleton: false
name: inline_html?
params: ()
visibility: public
PK�|[�T�7��<ri/1.8/system/RSS/Atom/Feed/Entry/Content/cdesc-Content.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: xml
  rw: W
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: xml_getter
- !ruby/object:RI::MethodSummary 
  name: xml_setter
comment: 
constants: []

full_name: RSS::Atom::Feed::Entry::Content
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: atom_validate
- !ruby/object:RI::MethodSummary 
  name: empty_content?
- !ruby/object:RI::MethodSummary 
  name: have_xml_content?
- !ruby/object:RI::MethodSummary 
  name: inline_html?
- !ruby/object:RI::MethodSummary 
  name: inline_other?
- !ruby/object:RI::MethodSummary 
  name: inline_other_base64?
- !ruby/object:RI::MethodSummary 
  name: inline_other_text?
- !ruby/object:RI::MethodSummary 
  name: inline_other_xml?
- !ruby/object:RI::MethodSummary 
  name: inline_text?
- !ruby/object:RI::MethodSummary 
  name: inline_xhtml?
- !ruby/object:RI::MethodSummary 
  name: mime_split
- !ruby/object:RI::MethodSummary 
  name: need_base64_encode?
- !ruby/object:RI::MethodSummary 
  name: out_of_line?
- !ruby/object:RI::MethodSummary 
  name: xhtml
- !ruby/object:RI::MethodSummary 
  name: xml
name: Content
superclass: RSS::Element
PK�|[P
��Gri/1.8/system/RSS/Atom/Feed/Entry/Content/inline_other_base64%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry::Content#inline_other_base64?
is_singleton: false
name: inline_other_base64?
params: ()
visibility: public
PK�|[�x����Fri/1.8/system/RSS/Atom/Feed/Entry/Content/need_base64_encode%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry::Content#need_base64_encode?
is_singleton: false
name: need_base64_encode?
params: ()
visibility: public
PK�|[���Dri/1.8/system/RSS/Atom/Feed/Entry/Content/inline_other_xml%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry::Content#inline_other_xml?
is_singleton: false
name: inline_other_xml?
params: ()
visibility: public
PK�|[u;�E��;ri/1.8/system/RSS/Atom/Feed/Entry/Content/xml_getter-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry::Content::xml_getter
is_singleton: true
name: xml_getter
params: ()
visibility: public
PK�|[d�4\��;ri/1.8/system/RSS/Atom/Feed/Entry/Content/xml_setter-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry::Content::xml_setter
is_singleton: true
name: xml_setter
params: ()
visibility: public
PK�|[�9'��6ri/1.8/system/RSS/Atom/Feed/Entry/Content/xhtml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry::Content#xhtml
is_singleton: false
name: xhtml
params: ()
visibility: public
PK�|[(NK���5ri/1.8/system/RSS/Atom/Feed/Entry/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry#maker_target
is_singleton: false
name: maker_target
params: (items)
visibility: private
PK�|[3eFF<ri/1.8/system/RSS/Atom/Feed/Entry/Summary/cdesc-Summary.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Atom::Feed::Entry::Summary
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
- !ruby/object:RI::IncludedModule 
  name: TextConstruct
instance_methods: []

name: Summary
superclass: RSS::Element
PK�|[�����7ri/1.8/system/RSS/Atom/Feed/Entry/have_author%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Entry#have_author?
is_singleton: false
name: have_author?
params: (check_parent=true)
visibility: public
PK�|[~m	C��<ri/1.8/system/RSS/Atom/Feed/have_required_elements%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed#have_required_elements?
is_singleton: false
name: have_required_elements?
params: ()
visibility: private
PK�|[�y6���&ri/1.8/system/RSS/Atom/Feed/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::new
is_singleton: true
name: new
params: (version=nil, encoding=nil, standalone=nil)
visibility: public
PK�|[�<�*��0ri/1.8/system/RSS/Atom/Feed/Logo/cdesc-Logo.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Atom::Feed::Logo
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
- !ruby/object:RI::IncludedModule 
  name: URIContentModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: setup_maker_element_writer
name: Logo
superclass: RSS::Element
PK�|[�js��Bri/1.8/system/RSS/Atom/Feed/Logo/setup_maker_element_writer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Logo#setup_maker_element_writer
is_singleton: false
name: setup_maker_element_writer
params: ()
visibility: private
PK�|[.�c&��4ri/1.8/system/RSS/Atom/Feed/Logo/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Logo#maker_target
is_singleton: false
name: maker_target
params: (target)
visibility: public
PK�|[Ah>�<<8ri/1.8/system/RSS/Atom/Feed/Category/cdesc-Category.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Atom::Feed::Category
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maker_target
name: Category
superclass: RSS::Element
PK�|[b r��8ri/1.8/system/RSS/Atom/Feed/Category/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Category#maker_target
is_singleton: false
name: maker_target
params: (target)
visibility: private
PK�|[�����6ri/1.8/system/RSS/Atom/Feed/setup_maker_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed#setup_maker_element
is_singleton: false
name: setup_maker_element
params: (channel)
visibility: private
PK�|[)ET��/ri/1.8/system/RSS/Atom/Feed/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed#maker_target
is_singleton: false
name: maker_target
params: (maker)
visibility: private
PK�|[d��==4ri/1.8/system/RSS/Atom/Feed/Rights/cdesc-Rights.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Atom::Feed::Rights
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
- !ruby/object:RI::IncludedModule 
  name: TextConstruct
instance_methods: []

name: Rights
superclass: RSS::Element
PK�|[]T���:ri/1.8/system/RSS/Atom/Feed/Generator/cdesc-Generator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Atom::Feed::Generator
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
- !ruby/object:RI::IncludedModule 
  name: ContentModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: setup_maker_attributes
name: Generator
superclass: RSS::Element
PK�|[��q���Cri/1.8/system/RSS/Atom/Feed/Generator/setup_maker_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed::Generator#setup_maker_attributes
is_singleton: false
name: setup_maker_attributes
params: (target)
visibility: private
PK�|[��o�;;0ri/1.8/system/RSS/Atom/Feed/Icon/cdesc-Icon.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Atom::Feed::Icon
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
- !ruby/object:RI::IncludedModule 
  name: URIContentModel
instance_methods: []

name: Icon
superclass: RSS::Element
PK�|[ih�'77,ri/1.8/system/RSS/Atom/Feed/Id/cdesc-Id.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Atom::Feed::Id
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
- !ruby/object:RI::IncludedModule 
  name: URIContentModel
instance_methods: []

name: Id
superclass: RSS::Element
PK�|[�c��??6ri/1.8/system/RSS/Atom/Feed/Updated/cdesc-Updated.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Atom::Feed::Updated
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
- !ruby/object:RI::IncludedModule 
  name: DateConstruct
instance_methods: []

name: Updated
superclass: RSS::Element
PK�|[�ZHͻ�1ri/1.8/system/RSS/Atom/Feed/have_author%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Feed#have_author?
is_singleton: false
name: have_author?
params: ()
visibility: public
PK�|[�^o��=ri/1.8/system/RSS/Atom/TextConstruct/cdesc-TextConstruct.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: xhtml
  rw: W
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
- !ruby/object:RI::MethodSummary 
  name: xml_getter
- !ruby/object:RI::MethodSummary 
  name: xml_setter
comment: 
constants: []

full_name: RSS::Atom::TextConstruct
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: atom_validate
- !ruby/object:RI::MethodSummary 
  name: have_xml_content?
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: setup_maker_attributes
- !ruby/object:RI::MethodSummary 
  name: xhtml
name: TextConstruct
superclass: 
PK�|[xL�O��9ri/1.8/system/RSS/Atom/TextConstruct/atom_validate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::TextConstruct#atom_validate
is_singleton: false
name: atom_validate
params: (ignore_unknown_element, tags, uri)
visibility: public
PK�|[:�����;ri/1.8/system/RSS/Atom/TextConstruct/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::TextConstruct::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[Ϭ���?ri/1.8/system/RSS/Atom/TextConstruct/have_xml_content%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::TextConstruct#have_xml_content?
is_singleton: false
name: have_xml_content?
params: ()
visibility: public
PK�|[��P��8ri/1.8/system/RSS/Atom/TextConstruct/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::TextConstruct#maker_target
is_singleton: false
name: maker_target
params: (target)
visibility: private
PK�|[��-1��Bri/1.8/system/RSS/Atom/TextConstruct/setup_maker_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::TextConstruct#setup_maker_attributes
is_singleton: false
name: setup_maker_attributes
params: (target)
visibility: private
PK�|[�����6ri/1.8/system/RSS/Atom/TextConstruct/xml_getter-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::TextConstruct::xml_getter
is_singleton: true
name: xml_getter
params: ()
visibility: public
PK�|[�U����6ri/1.8/system/RSS/Atom/TextConstruct/xml_setter-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::TextConstruct::xml_setter
is_singleton: true
name: xml_setter
params: ()
visibility: public
PK�|[1p��1ri/1.8/system/RSS/Atom/TextConstruct/xhtml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::TextConstruct#xhtml
is_singleton: false
name: xhtml
params: ()
visibility: public
PK�|[�����Kri/1.8/system/RSS/Atom/DuplicateLinkChecker/validate_duplicate_links-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::DuplicateLinkChecker#validate_duplicate_links
is_singleton: false
name: validate_duplicate_links
params: (links)
visibility: public
PK�|[T]!Kri/1.8/system/RSS/Atom/DuplicateLinkChecker/cdesc-DuplicateLinkChecker.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Atom::DuplicateLinkChecker
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: validate_duplicate_links
name: DuplicateLinkChecker
superclass: 
PK�|[0W���9ri/1.8/system/RSS/Atom/CommonModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::CommonModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[^�=��9ri/1.8/system/RSS/Atom/CommonModel/cdesc-CommonModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
- !ruby/object:RI::MethodSummary 
  name: need_parent?
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: NSPOOL
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  name: ELEMENTS
  value: "[]"
full_name: RSS::Atom::CommonModel
includes: []

instance_methods: []

name: CommonModel
superclass: 
PK�|[I����8ri/1.8/system/RSS/Atom/CommonModel/need_parent%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::CommonModel::need_parent?
is_singleton: true
name: need_parent?
params: ()
visibility: public
PK�|[��X��6ri/1.8/system/RSS/Atom/CommonModel/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::CommonModel::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[QR���/ri/1.8/system/RSS/Atom/Entry/setup_maker-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Entry#setup_maker
is_singleton: false
name: setup_maker
params: (maker)
visibility: public
PK�|[YY..-ri/1.8/system/RSS/Atom/Entry/cdesc-Entry.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Author
  value: Feed::Entry::Author
- !ruby/object:RI::Constant 
  comment: 
  name: Category
  value: Feed::Entry::Category
- !ruby/object:RI::Constant 
  comment: 
  name: Content
  value: Feed::Entry::Content
- !ruby/object:RI::Constant 
  comment: 
  name: Contributor
  value: Feed::Entry::Contributor
- !ruby/object:RI::Constant 
  comment: 
  name: Id
  value: Feed::Entry::Id
- !ruby/object:RI::Constant 
  comment: 
  name: Link
  value: Feed::Entry::Link
- !ruby/object:RI::Constant 
  comment: 
  name: Published
  value: Feed::Entry::Published
- !ruby/object:RI::Constant 
  comment: 
  name: Rights
  value: Feed::Entry::Rights
- !ruby/object:RI::Constant 
  comment: 
  name: Source
  value: Feed::Entry::Source
- !ruby/object:RI::Constant 
  comment: 
  name: Summary
  value: Feed::Entry::Summary
- !ruby/object:RI::Constant 
  comment: 
  name: Title
  value: Feed::Entry::Title
- !ruby/object:RI::Constant 
  comment: 
  name: Updated
  value: Feed::Entry::Updated
full_name: RSS::Atom::Entry
includes: 
- !ruby/object:RI::IncludedModule 
  name: RootElementMixin
- !ruby/object:RI::IncludedModule 
  name: CommonModel
- !ruby/object:RI::IncludedModule 
  name: DuplicateLinkChecker
- !ruby/object:RI::IncludedModule 
  name: DublinCoreModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: atom_validate
- !ruby/object:RI::MethodSummary 
  name: have_author?
- !ruby/object:RI::MethodSummary 
  name: have_required_elements?
- !ruby/object:RI::MethodSummary 
  name: items
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: setup_maker
name: Entry
superclass: RSS::Element
PK�|[v����1ri/1.8/system/RSS/Atom/Entry/atom_validate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Entry#atom_validate
is_singleton: false
name: atom_validate
params: (ignore_unknown_element, tags, uri)
visibility: private
PK�|[Տ�F��=ri/1.8/system/RSS/Atom/Entry/have_required_elements%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Entry#have_required_elements?
is_singleton: false
name: have_required_elements?
params: ()
visibility: private
PK�|[e�����'ri/1.8/system/RSS/Atom/Entry/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Entry::new
is_singleton: true
name: new
params: (version=nil, encoding=nil, standalone=nil)
visibility: public
PK�|[%4��0ri/1.8/system/RSS/Atom/Entry/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Entry#maker_target
is_singleton: false
name: maker_target
params: (maker)
visibility: private
PK�|[؀���)ri/1.8/system/RSS/Atom/Entry/items-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Entry#items
is_singleton: false
name: items
params: ()
visibility: public
PK�|[=e-��2ri/1.8/system/RSS/Atom/Entry/have_author%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::Entry#have_author?
is_singleton: false
name: have_author?
params: ()
visibility: public
PK�|[�;Gxx&ri/1.8/system/RSS/Atom/cdesc-Atom.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: URI
  value: "\"http://www.w3.org/2005/Atom\""
- !ruby/object:RI::Constant 
  comment: 
  name: XHTML_URI
  value: "\"http://www.w3.org/1999/xhtml\""
full_name: RSS::Atom
includes: []

instance_methods: []

name: Atom
superclass: 
PK�|[acc7EE=ri/1.8/system/RSS/Atom/PersonConstruct/Email/cdesc-Email.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Atom::PersonConstruct::Email
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
- !ruby/object:RI::IncludedModule 
  name: ContentModel
instance_methods: []

name: Email
superclass: RSS::Element
PK�|[�@WCC;ri/1.8/system/RSS/Atom/PersonConstruct/Name/cdesc-Name.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Atom::PersonConstruct::Name
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
- !ruby/object:RI::IncludedModule 
  name: ContentModel
instance_methods: []

name: Name
superclass: RSS::Element
PK�|[�|�^DD9ri/1.8/system/RSS/Atom/PersonConstruct/Uri/cdesc-Uri.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Atom::PersonConstruct::Uri
includes: 
- !ruby/object:RI::IncludedModule 
  name: CommonModel
- !ruby/object:RI::IncludedModule 
  name: URIContentModel
instance_methods: []

name: Uri
superclass: RSS::Element
PK�|[��k��=ri/1.8/system/RSS/Atom/PersonConstruct/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::PersonConstruct::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[�*t;;Ari/1.8/system/RSS/Atom/PersonConstruct/cdesc-PersonConstruct.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: []

full_name: RSS::Atom::PersonConstruct
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maker_target
name: PersonConstruct
superclass: 
PK�|[��*��:ri/1.8/system/RSS/Atom/PersonConstruct/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::PersonConstruct#maker_target
is_singleton: false
name: maker_target
params: (target)
visibility: public
PK�|[�1���=ri/1.8/system/RSS/Atom/URIContentModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::URIContentModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[��Z<<Ari/1.8/system/RSS/Atom/URIContentModel/cdesc-URIContentModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: []

full_name: RSS::Atom::URIContentModel
includes: 
- !ruby/object:RI::IncludedModule 
  name: ContentModel
instance_methods: []

name: URIContentModel
superclass: 
PK�|[��~��;ri/1.8/system/RSS/Atom/ContentModel/cdesc-ContentModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: []

full_name: RSS::Atom::ContentModel
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: setup_maker_element
- !ruby/object:RI::MethodSummary 
  name: setup_maker_element_writer
name: ContentModel
superclass: 
PK�|[,(�o��Dri/1.8/system/RSS/Atom/ContentModel/ClassMethods/content_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::ContentModel::ClassMethods#content_type
is_singleton: false
name: content_type
params: ()
visibility: public
PK�|[�<�tHri/1.8/system/RSS/Atom/ContentModel/ClassMethods/cdesc-ClassMethods.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::Atom::ContentModel::ClassMethods
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: content_type
name: ClassMethods
superclass: 
PK�|[₿���:ri/1.8/system/RSS/Atom/ContentModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::ContentModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[��Tu��Eri/1.8/system/RSS/Atom/ContentModel/setup_maker_element_writer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::ContentModel#setup_maker_element_writer
is_singleton: false
name: setup_maker_element_writer
params: ()
visibility: private
PK�|[U�Ox��>ri/1.8/system/RSS/Atom/ContentModel/setup_maker_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::ContentModel#setup_maker_element
is_singleton: false
name: setup_maker_element
params: (target)
visibility: private
PK�|[hݍ���7ri/1.8/system/RSS/Atom/ContentModel/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::ContentModel#maker_target
is_singleton: false
name: maker_target
params: (target)
visibility: public
PK�|[�5-���9ri/1.8/system/RSS/Atom/DateConstruct/atom_validate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::DateConstruct#atom_validate
is_singleton: false
name: atom_validate
params: (ignore_unknown_element, tags, uri)
visibility: public
PK�|['v�
��;ri/1.8/system/RSS/Atom/DateConstruct/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Atom::DateConstruct::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[U8Jmm=ri/1.8/system/RSS/Atom/DateConstruct/cdesc-DateConstruct.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: []

full_name: RSS::Atom::DateConstruct
includes: 
- !ruby/object:RI::IncludedModule 
  name: ContentModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: atom_validate
name: DateConstruct
superclass: 
PK�|[��
AA<ri/1.8/system/RSS/ITunesBaseModel/cdesc-ITunesBaseModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ELEMENTS
  value: "[]"
- !ruby/object:RI::Constant 
  comment: 
  name: ELEMENT_INFOS
  value: "[[\"author\"],                      [\"block\", :yes_other],                      [\"explicit\", :yes_clean_other],                      [\"keywords\", :csv],                      [\"subtitle\"],                      [\"summary\"]]"
full_name: RSS::ITunesBaseModel
includes: []

instance_methods: []

name: ITunesBaseModel
superclass: 
PK�|[s���>ri/1.8/system/RSS/ImageModelUtils/validate_one_tag_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ImageModelUtils#validate_one_tag_name
is_singleton: false
name: validate_one_tag_name
params: (ignore_unknown_element, name, tags)
visibility: public
PK�|[Q]<ri/1.8/system/RSS/ImageModelUtils/cdesc-ImageModelUtils.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::ImageModelUtils
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: validate_one_tag_name
name: ImageModelUtils
superclass: 
PK�|[�b�o��%ri/1.8/system/RSS/RDF/Item/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Item::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[ᛛl��.ri/1.8/system/RSS/RDF/Item/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Item#maker_target
is_singleton: false
name: maker_target
params: (items)
visibility: private
PK�|[4��=��.ri/1.8/system/RSS/RDF/Item/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Item::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[	C���*ri/1.8/system/RSS/RDF/Item/cdesc-Item.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: []

full_name: RSS::RDF::Item
includes: 
- !ruby/object:RI::IncludedModule 
  name: ContentModel
- !ruby/object:RI::IncludedModule 
  name: TrackBackModel10
- !ruby/object:RI::IncludedModule 
  name: RSS10
- !ruby/object:RI::IncludedModule 
  name: ImageItemModel
- !ruby/object:RI::IncludedModule 
  name: TaxonomyTopicsModel
- !ruby/object:RI::IncludedModule 
  name: SlashModel
- !ruby/object:RI::IncludedModule 
  name: DublinCoreModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maker_target
name: Item
superclass: Object
PK�|[��Sn4ri/1.8/system/RSS/RDF/Channel/Items/cdesc-Items.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Seq
  value: "::RSS::RDF::Seq"
- !ruby/object:RI::Constant 
  comment: 
  name: Seq
  value: args[0]
full_name: RSS::RDF::Channel::Items
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS10
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: resources
name: Items
superclass: Element
PK�|[Z��7��4ri/1.8/system/RSS/RDF/Channel/Items/resources-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Channel::Items#resources
is_singleton: false
name: resources
params: ()
visibility: public
PK�|[-���.ri/1.8/system/RSS/RDF/Channel/Items/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Channel::Items::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[F���7ri/1.8/system/RSS/RDF/Channel/Items/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Channel::Items::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[`CN[[4ri/1.8/system/RSS/RDF/Channel/Image/cdesc-Image.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: []

full_name: RSS::RDF::Channel::Image
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS10
instance_methods: []

name: Image
superclass: Element
PK�|[>��O��.ri/1.8/system/RSS/RDF/Channel/Image/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Channel::Image::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[.�����7ri/1.8/system/RSS/RDF/Channel/Image/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Channel::Image::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[~:��cc<ri/1.8/system/RSS/RDF/Channel/Textinput/cdesc-Textinput.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: []

full_name: RSS::RDF::Channel::Textinput
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS10
instance_methods: []

name: Textinput
superclass: Element
PK�|[Vnñ��2ri/1.8/system/RSS/RDF/Channel/Textinput/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Channel::Textinput::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[��_��;ri/1.8/system/RSS/RDF/Channel/Textinput/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Channel::Textinput::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[Ә���(ri/1.8/system/RSS/RDF/Channel/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Channel::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|['=��0ri/1.8/system/RSS/RDF/Channel/cdesc-Channel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: []

full_name: RSS::RDF::Channel
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS10
- !ruby/object:RI::IncludedModule 
  name: SyndicationModel
- !ruby/object:RI::IncludedModule 
  name: ImageFaviconModel
- !ruby/object:RI::IncludedModule 
  name: TaxonomyTopicsModel
- !ruby/object:RI::IncludedModule 
  name: DublinCoreModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: setup_maker_attributes
name: Channel
superclass: Element
PK�|[C0�C��1ri/1.8/system/RSS/RDF/Channel/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Channel#maker_target
is_singleton: false
name: maker_target
params: (maker)
visibility: private
PK�|[�
��;ri/1.8/system/RSS/RDF/Channel/setup_maker_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Channel#setup_maker_attributes
is_singleton: false
name: setup_maker_attributes
params: (channel)
visibility: private
PK�|[�qT��1ri/1.8/system/RSS/RDF/Channel/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Channel::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[��qt��&ri/1.8/system/RSS/RDF/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[k��2��,ri/1.8/system/RSS/RDF/Image/cdesc-Image.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: []

full_name: RSS::RDF::Image
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS10
- !ruby/object:RI::IncludedModule 
  name: DublinCoreModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maker_target
name: Image
superclass: Element
PK�|[���&ri/1.8/system/RSS/RDF/Image/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Image::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[1h���/ri/1.8/system/RSS/RDF/Image/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Image#maker_target
is_singleton: false
name: maker_target
params: (maker)
visibility: private
PK�|[-{u��/ri/1.8/system/RSS/RDF/Image/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Image::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[�_�!��4ri/1.8/system/RSS/RDF/Textinput/cdesc-Textinput.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: []

full_name: RSS::RDF::Textinput
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS10
- !ruby/object:RI::IncludedModule 
  name: DublinCoreModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maker_target
name: Textinput
superclass: Element
PK�|[�忲�*ri/1.8/system/RSS/RDF/Textinput/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Textinput::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[�]����3ri/1.8/system/RSS/RDF/Textinput/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Textinput#maker_target
is_singleton: false
name: maker_target
params: (maker)
visibility: private
PK�|[o����3ri/1.8/system/RSS/RDF/Textinput/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Textinput::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[��J��� ri/1.8/system/RSS/RDF/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::new
is_singleton: true
name: new
params: (version=nil, encoding=nil, standalone=nil)
visibility: public
PK�|[Bg}}&ri/1.8/system/RSS/RDF/Li/cdesc-Li.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: []

full_name: RSS::RDF::Li
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS10
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: full_name
name: Li
superclass: Element
PK�|[-"�L��)ri/1.8/system/RSS/RDF/Li/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Li#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[��6׫�#ri/1.8/system/RSS/RDF/Li/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Li::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[3Qr��,ri/1.8/system/RSS/RDF/Li/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Li::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[p)����,ri/1.8/system/RSS/RDF/Seq/setup_maker-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Seq#setup_maker
is_singleton: false
name: setup_maker
params: (target)
visibility: public
PK�|[ DF��*ri/1.8/system/RSS/RDF/Seq/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Seq#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[mP;��$ri/1.8/system/RSS/RDF/Seq/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Seq::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[���(ri/1.8/system/RSS/RDF/Seq/cdesc-Seq.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Li
  value: "::RSS::RDF::Li"
full_name: RSS::RDF::Seq
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS10
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: full_name
- !ruby/object:RI::MethodSummary 
  name: setup_maker
name: Seq
superclass: Element
PK�|[f�]���-ri/1.8/system/RSS/RDF/Seq/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Seq::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[�D���$ri/1.8/system/RSS/RDF/cdesc-RDF.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: PREFIX
  value: "'rdf'"
- !ruby/object:RI::Constant 
  comment: 
  name: URI
  value: "\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\""
full_name: RSS::RDF
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS10
- !ruby/object:RI::IncludedModule 
  name: RootElementMixin
- !ruby/object:RI::IncludedModule 
  name: TaxonomyTopicModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: full_name
name: RDF
superclass: Object
PK�|[J���)ri/1.8/system/RSS/RDF/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[��
��,ri/1.8/system/RSS/RDF/Bag/setup_maker-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Bag#setup_maker
is_singleton: false
name: setup_maker
params: (target)
visibility: public
PK�|[%�n
��*ri/1.8/system/RSS/RDF/Bag/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Bag#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[����$ri/1.8/system/RSS/RDF/Bag/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Bag::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[p/��-ri/1.8/system/RSS/RDF/Bag/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::RDF::Bag::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[�T�(ri/1.8/system/RSS/RDF/Bag/cdesc-Bag.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Li
  value: "::RSS::RDF::Li"
full_name: RSS::RDF::Bag
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS10
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: full_name
- !ruby/object:RI::MethodSummary 
  name: setup_maker
name: Bag
superclass: Element
PK�|[���1��Bri/1.8/system/RSS/TrackBackModel10/TrackBackAbout/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TrackBackModel10::TrackBackAbout#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[�r]~��<ri/1.8/system/RSS/TrackBackModel10/TrackBackAbout/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TrackBackModel10::TrackBackAbout::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[7'&��Hri/1.8/system/RSS/TrackBackModel10/TrackBackAbout/required_prefix-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TrackBackModel10::TrackBackAbout::required_prefix
is_singleton: true
name: required_prefix
params: ()
visibility: public
PK�|[�1Fk��Eri/1.8/system/RSS/TrackBackModel10/TrackBackAbout/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TrackBackModel10::TrackBackAbout#maker_target
is_singleton: false
name: maker_target
params: (abouts)
visibility: private
PK�|[ʩ�TTKri/1.8/system/RSS/TrackBackModel10/TrackBackAbout/cdesc-TrackBackAbout.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_prefix
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: []

full_name: RSS::TrackBackModel10::TrackBackAbout
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS10
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: full_name
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: setup_maker_attributes
name: TrackBackAbout
superclass: Element
PK�|[R;����Ori/1.8/system/RSS/TrackBackModel10/TrackBackAbout/setup_maker_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TrackBackModel10::TrackBackAbout#setup_maker_attributes
is_singleton: false
name: setup_maker_attributes
params: (about)
visibility: private
PK�|[����Eri/1.8/system/RSS/TrackBackModel10/TrackBackAbout/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TrackBackModel10::TrackBackAbout::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[\Q�Q��>ri/1.8/system/RSS/TrackBackModel10/cdesc-TrackBackModel10.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::TrackBackModel10
includes: []

instance_methods: []

name: TrackBackModel10
superclass: 
PK�|[I���Iri/1.8/system/RSS/TrackBackModel10/TrackBackPing/cdesc-TrackBackPing.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_prefix
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: []

full_name: RSS::TrackBackModel10::TrackBackPing
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS10
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: full_name
name: TrackBackPing
superclass: Element
PK�|[�x��Ari/1.8/system/RSS/TrackBackModel10/TrackBackPing/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TrackBackModel10::TrackBackPing#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[�n`��;ri/1.8/system/RSS/TrackBackModel10/TrackBackPing/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TrackBackModel10::TrackBackPing::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[|K>��Gri/1.8/system/RSS/TrackBackModel10/TrackBackPing/required_prefix-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TrackBackModel10::TrackBackPing::required_prefix
is_singleton: true
name: required_prefix
params: ()
visibility: public
PK�|[�����Dri/1.8/system/RSS/TrackBackModel10/TrackBackPing/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TrackBackModel10::TrackBackPing::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[u�Orr4ri/1.8/system/RSS/NotSetError/cdesc-NotSetError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: variables
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::NotSetError
includes: []

instance_methods: []

name: NotSetError
superclass: Error
PK�|[�#z��(ri/1.8/system/RSS/NotSetError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::NotSetError::new
is_singleton: true
name: new
params: (name, variables)
visibility: public
PK�|[{B���Nri/1.8/system/RSS/TaxonomyTopicsModel/TaxonomyTopics/cdesc-TaxonomyTopics.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_prefix
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Bag
  value: "::RSS::RDF::Bag"
- !ruby/object:RI::Constant 
  comment: 
  name: Bag
  value: args[0]
full_name: RSS::TaxonomyTopicsModel::TaxonomyTopics
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS10
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: full_name
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: resources
name: TaxonomyTopics
superclass: Element
PK�|[������Eri/1.8/system/RSS/TaxonomyTopicsModel/TaxonomyTopics/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TaxonomyTopicsModel::TaxonomyTopics#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[D���Eri/1.8/system/RSS/TaxonomyTopicsModel/TaxonomyTopics/resources-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TaxonomyTopicsModel::TaxonomyTopics#resources
is_singleton: false
name: resources
params: ()
visibility: public
PK�|[�Wgr��?ri/1.8/system/RSS/TaxonomyTopicsModel/TaxonomyTopics/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TaxonomyTopicsModel::TaxonomyTopics::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[
����Kri/1.8/system/RSS/TaxonomyTopicsModel/TaxonomyTopics/required_prefix-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TaxonomyTopicsModel::TaxonomyTopics::required_prefix
is_singleton: true
name: required_prefix
params: ()
visibility: public
PK�|[��D���Hri/1.8/system/RSS/TaxonomyTopicsModel/TaxonomyTopics/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TaxonomyTopicsModel::TaxonomyTopics#maker_target
is_singleton: false
name: maker_target
params: (target)
visibility: public
PK�|[� )W��Hri/1.8/system/RSS/TaxonomyTopicsModel/TaxonomyTopics/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TaxonomyTopicsModel::TaxonomyTopics::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[4�Q��<ri/1.8/system/RSS/TaxonomyTopicsModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TaxonomyTopicsModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[w��Z		Dri/1.8/system/RSS/TaxonomyTopicsModel/cdesc-TaxonomyTopicsModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: []

full_name: RSS::TaxonomyTopicsModel
includes: []

instance_methods: []

name: TaxonomyTopicsModel
superclass: 
PK�|[
����Bri/1.8/system/RSS/TrackBackModel20/TrackBackAbout/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TrackBackModel20::TrackBackAbout#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[Ԫ���<ri/1.8/system/RSS/TrackBackModel20/TrackBackAbout/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TrackBackModel20::TrackBackAbout::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[y93���Hri/1.8/system/RSS/TrackBackModel20/TrackBackAbout/required_prefix-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TrackBackModel20::TrackBackAbout::required_prefix
is_singleton: true
name: required_prefix
params: ()
visibility: public
PK�|[4�Ϭ��Kri/1.8/system/RSS/TrackBackModel20/TrackBackAbout/cdesc-TrackBackAbout.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_prefix
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: []

full_name: RSS::TrackBackModel20::TrackBackAbout
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: full_name
name: TrackBackAbout
superclass: Element
PK�|[�n����Eri/1.8/system/RSS/TrackBackModel20/TrackBackAbout/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TrackBackModel20::TrackBackAbout::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[H�����>ri/1.8/system/RSS/TrackBackModel20/cdesc-TrackBackModel20.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::TrackBackModel20
includes: []

instance_methods: []

name: TrackBackModel20
superclass: 
PK�|[����Iri/1.8/system/RSS/TrackBackModel20/TrackBackPing/cdesc-TrackBackPing.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_prefix
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: []

full_name: RSS::TrackBackModel20::TrackBackPing
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS09
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: full_name
name: TrackBackPing
superclass: Element
PK�|[q6���Ari/1.8/system/RSS/TrackBackModel20/TrackBackPing/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TrackBackModel20::TrackBackPing#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[ՑM��;ri/1.8/system/RSS/TrackBackModel20/TrackBackPing/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TrackBackModel20::TrackBackPing::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[������Gri/1.8/system/RSS/TrackBackModel20/TrackBackPing/required_prefix-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TrackBackModel20::TrackBackPing::required_prefix
is_singleton: true
name: required_prefix
params: ()
visibility: public
PK�|[��sR��Dri/1.8/system/RSS/TrackBackModel20/TrackBackPing/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TrackBackModel20::TrackBackPing::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[��9���$ri/1.8/system/RSS/XML/cdesc-XML.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::XML
includes: []

instance_methods: []

name: XML
superclass: 
PK�|[^�T��+ri/1.8/system/RSS/XML/Element/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XML::Element#[]
is_singleton: false
name: "[]"
params: (name)
visibility: public
PK�|[g���)ri/1.8/system/RSS/XML/Element/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XML::Element#each
is_singleton: false
name: each
params: (&block)
visibility: public
PK�|[\����.ri/1.8/system/RSS/XML/Element/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XML::Element#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[G��Z��0ri/1.8/system/RSS/XML/Element/cdesc-Element.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: attributes
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: children
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: prefix
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: uri
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::XML::Element
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: full_name
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Element
superclass: Object
PK�|[�D��(ri/1.8/system/RSS/XML/Element/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XML::Element::new
is_singleton: true
name: new
params: (name, prefix=nil, uri=nil, attributes={}, children=[])
visibility: public
PK�|[2ԉ~��+ri/1.8/system/RSS/XML/Element/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XML::Element#<<
is_singleton: false
name: "<<"
params: (child)
visibility: public
PK�|[��e��)ri/1.8/system/RSS/XML/Element/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XML::Element#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[������+ri/1.8/system/RSS/XML/Element/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XML::Element#==
is_singleton: false
name: ==
params: (other)
visibility: public
PK�|[A.`J��.ri/1.8/system/RSS/XML/Element/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XML::Element#[]=
is_singleton: false
name: "[]="
params: (name, value)
visibility: public
PK�|[��a���:ri/1.8/system/RSS/ImageFaviconModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ImageFaviconModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[YT-\==@ri/1.8/system/RSS/ImageFaviconModel/cdesc-ImageFaviconModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: []

full_name: RSS::ImageFaviconModel
includes: 
- !ruby/object:RI::IncludedModule 
  name: ImageModelUtils
instance_methods: []

name: ImageFaviconModel
superclass: 
PK�|[a��1��Ari/1.8/system/RSS/ImageFaviconModel/ImageFavicon/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ImageFaviconModel::ImageFavicon#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[N�mRRHri/1.8/system/RSS/ImageFaviconModel/ImageFavicon/cdesc-ImageFavicon.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: required_prefix
- !ruby/object:RI::MethodSummary 
  name: required_uri
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: AVAILABLE_SIZES
  value: "%w(small medium large)"
full_name: RSS::ImageFaviconModel::ImageFavicon
includes: 
- !ruby/object:RI::IncludedModule 
  name: RSS10
- !ruby/object:RI::IncludedModule 
  name: DublinCoreModel
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: full_name
- !ruby/object:RI::MethodSummary 
  name: image_size=
- !ruby/object:RI::MethodSummary 
  name: maker_target
- !ruby/object:RI::MethodSummary 
  name: setup_maker_attributes
- !ruby/object:RI::MethodSummary 
  name: size=
name: ImageFavicon
superclass: Element
PK�|["�����;ri/1.8/system/RSS/ImageFaviconModel/ImageFavicon/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ImageFaviconModel::ImageFavicon::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�|[��iH��Gri/1.8/system/RSS/ImageFaviconModel/ImageFavicon/required_prefix-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ImageFaviconModel::ImageFavicon::required_prefix
is_singleton: true
name: required_prefix
params: ()
visibility: public
PK�|[O4��Eri/1.8/system/RSS/ImageFaviconModel/ImageFavicon/image_size%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #size="
full_name: RSS::ImageFaviconModel::ImageFavicon#image_size=
is_singleton: false
name: image_size=
params: (new_value)
visibility: public
PK�|[r����Dri/1.8/system/RSS/ImageFaviconModel/ImageFavicon/maker_target-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ImageFaviconModel::ImageFavicon#maker_target
is_singleton: false
name: maker_target
params: (target)
visibility: private
PK�|[�o���Nri/1.8/system/RSS/ImageFaviconModel/ImageFavicon/setup_maker_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ImageFaviconModel::ImageFavicon#setup_maker_attributes
is_singleton: false
name: setup_maker_attributes
params: (favicon)
visibility: private
PK�|[�m����Dri/1.8/system/RSS/ImageFaviconModel/ImageFavicon/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ImageFaviconModel::ImageFavicon::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[PP��?ri/1.8/system/RSS/ImageFaviconModel/ImageFavicon/size%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: image_size=
block_params: 
comment: 
full_name: RSS::ImageFaviconModel::ImageFavicon#size=
is_singleton: false
name: size=
params: (new_value)
visibility: public
PK�|[{=��}}<ri/1.8/system/RSS/UnknownTagError/cdesc-UnknownTagError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: tag
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: uri
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::UnknownTagError
includes: []

instance_methods: []

name: UnknownTagError
superclass: InvalidRSSError
PK�|[�6��,ri/1.8/system/RSS/UnknownTagError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::UnknownTagError::new
is_singleton: true
name: new
params: (tag, uri)
visibility: public
PK�|[�[]]6ri/1.8/system/RSS/ContentModel/cdesc-ContentModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ELEMENTS
  value: "[\"#{CONTENT_PREFIX}_encoded\"]"
full_name: RSS::ContentModel
includes: []

instance_methods: []

name: ContentModel
superclass: 
PK�|[rnz��5ri/1.8/system/RSS/ContentModel/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::ContentModel::append_features
is_singleton: true
name: append_features
params: (klass)
visibility: public
PK�|[�HS���%ri/1.8/system/RSS/Parser/parse-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Parser::parse
is_singleton: true
name: parse
params: (rss, do_validate=true, ignore_unknown_element=true, parser_class=default_parser)
visibility: public
PK�|[�)�WW1ri/1.8/system/RSS/Parser/default_parser%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set @@default_parser to new_value if it is one of the available parsers. Else raise NotValidXMLParser error.
full_name: RSS::Parser::default_parser=
is_singleton: true
name: default_parser=
params: (new_value)
visibility: public
PK�|[ؠ@�''*ri/1.8/system/RSS/Parser/cdesc-Parser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: default_parser
- !ruby/object:RI::MethodSummary 
  name: default_parser=
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: parse
comment: 
constants: []

full_name: RSS::Parser
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: maybe_xml?
- !ruby/object:RI::MethodSummary 
  name: normalize_rss
- !ruby/object:RI::MethodSummary 
  name: to_uri
name: Parser
superclass: Object
PK�|[�O����#ri/1.8/system/RSS/Parser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Parser::new
is_singleton: true
name: new
params: (rss, parser_class=self.class.default_parser)
visibility: public
PK�|[��tt-ri/1.8/system/RSS/Parser/normalize_rss-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Try to get the XML associated with <tt>rss</tt>. Return <tt>rss</tt> if it already looks like XML, or treat it as a URI, or a file to get the XML,
full_name: RSS::Parser#normalize_rss
is_singleton: false
name: normalize_rss
params: (rss)
visibility: private
PK�|[Ե���.ri/1.8/system/RSS/Parser/default_parser-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Parser::default_parser
is_singleton: true
name: default_parser
params: ()
visibility: public
PK�|[�5˨,ri/1.8/system/RSS/Parser/maybe_xml%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: maybe_xml? tests if source is a string that looks like XML.
full_name: RSS::Parser#maybe_xml?
is_singleton: false
name: maybe_xml?
params: (source)
visibility: private
PK�|[���!!&ri/1.8/system/RSS/Parser/to_uri-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Attempt to convert rss to a URI, but just return it if there's a ::URI::Error
full_name: RSS::Parser#to_uri
is_singleton: false
name: to_uri
params: (rss)
visibility: private
PK�|[T�h��;ri/1.8/system/RSS/BaseTrackBackModel/append_features-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::BaseTrackBackModel#append_features
is_singleton: false
name: append_features
params: (klass)
visibility: public
PK�|[�����Bri/1.8/system/RSS/BaseTrackBackModel/cdesc-BaseTrackBackModel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ELEMENTS
  value: "%w(ping about)"
full_name: RSS::BaseTrackBackModel
includes: 
- !ruby/object:RI::IncludedModule 
  name: TrackBackUtils
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
name: BaseTrackBackModel
superclass: 
PK�|[�q�$??@ri/1.8/system/RSS/XMLParserListener/cdesc-XMLParserListener.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::XMLParserListener
includes: 
- !ruby/object:RI::IncludedModule 
  name: ListenerMixin
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: xmldecl
name: XMLParserListener
superclass: BaseListener
PK�|[z��b��2ri/1.8/system/RSS/XMLParserListener/xmldecl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::XMLParserListener#xmldecl
is_singleton: false
name: xmldecl
params: (version, encoding, standalone)
visibility: public
PK�|[5m����:ri/1.8/system/RSS/TrackBackUtils/trackback_validate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::TrackBackUtils#trackback_validate
is_singleton: false
name: trackback_validate
params: (ignore_unknown_element, tags, uri)
visibility: private
PK�|[w�9�:ri/1.8/system/RSS/TrackBackUtils/cdesc-TrackBackUtils.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RSS::TrackBackUtils
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: trackback_validate
name: TrackBackUtils
superclass: 
PK�|[5����7ri/1.8/system/RSS/Element/have_children_elements-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::have_children_elements
is_singleton: true
name: have_children_elements
params: ()
visibility: public
PK�|[�)�L��1ri/1.8/system/RSS/Element/set_next_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#set_next_element
is_singleton: false
name: set_next_element
params: (tag_name, next_element)
visibility: public
PK�|[L�u��,ri/1.8/system/RSS/Element/calc_indent-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: For backward compatibility
full_name: RSS::Element#calc_indent
is_singleton: false
name: calc_indent
params: ()
visibility: private
PK�|[J����6ri/1.8/system/RSS/Element/add_to_element_method-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::add_to_element_method
is_singleton: true
name: add_to_element_method
params: (method_name)
visibility: public
PK�|[:�ܾ��)ri/1.8/system/RSS/Element/tag_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::tag_name
is_singleton: true
name: tag_name
params: ()
visibility: public
PK�|[P׺�0ri/1.8/system/RSS/Element/have_content%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::have_content?
is_singleton: true
name: have_content?
params: ()
visibility: public
PK�|[Xܻ=��*ri/1.8/system/RSS/Element/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK�|[u�׽�-ri/1.8/system/RSS/Element/converter%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#converter=
is_singleton: false
name: converter=
params: (converter)
visibility: public
PK�|[�B��}},ri/1.8/system/RSS/Element/cdesc-Element.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: do_validate
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: parent
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_have_children_element
- !ruby/object:RI::MethodSummary 
  name: add_need_initialize_variable
- !ruby/object:RI::MethodSummary 
  name: add_plural_form
- !ruby/object:RI::MethodSummary 
  name: add_to_element_method
- !ruby/object:RI::MethodSummary 
  name: content_setup
- !ruby/object:RI::MethodSummary 
  name: def_corresponded_attr_reader
- !ruby/object:RI::MethodSummary 
  name: def_corresponded_attr_writer
- !ruby/object:RI::MethodSummary 
  name: get_attributes
- !ruby/object:RI::MethodSummary 
  name: have_children_elements
- !ruby/object:RI::MethodSummary 
  name: have_content?
- !ruby/object:RI::MethodSummary 
  name: inherited
- !ruby/object:RI::MethodSummary 
  name: inherited_base
- !ruby/object:RI::MethodSummary 
  name: install_get_attribute
- !ruby/object:RI::MethodSummary 
  name: install_model
- !ruby/object:RI::MethodSummary 
  name: install_must_call_validator
- !ruby/object:RI::MethodSummary 
  name: install_ns
- !ruby/object:RI::MethodSummary 
  name: models
- !ruby/object:RI::MethodSummary 
  name: must_call_validators
- !ruby/object:RI::MethodSummary 
  name: need_initialize_variables
- !ruby/object:RI::MethodSummary 
  name: need_parent?
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: plural_forms
- !ruby/object:RI::MethodSummary 
  name: required_prefix
- !ruby/object:RI::MethodSummary 
  name: required_uri
- !ruby/object:RI::MethodSummary 
  name: tag_name
- !ruby/object:RI::MethodSummary 
  name: to_element_methods
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: INDENT
  value: "\"  \""
- !ruby/object:RI::Constant 
  comment: 
  name: MUST_CALL_VALIDATORS
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  name: MODELS
  value: "[]"
- !ruby/object:RI::Constant 
  comment: 
  name: GET_ATTRIBUTES
  value: "[]"
- !ruby/object:RI::Constant 
  comment: 
  name: HAVE_CHILDREN_ELEMENTS
  value: "[]"
- !ruby/object:RI::Constant 
  comment: 
  name: TO_ELEMENT_METHODS
  value: "[]"
- !ruby/object:RI::Constant 
  comment: 
  name: NEED_INITIALIZE_VARIABLES
  value: "[]"
- !ruby/object:RI::Constant 
  comment: 
  name: PLURAL_FORMS
  value: "{}"
full_name: RSS::Element
includes: 
- !ruby/object:RI::IncludedModule 
  name: Utils
- !ruby/object:RI::IncludedModule 
  name: SetupMaker
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: __validate
- !ruby/object:RI::MethodSummary 
  name: _attrs
- !ruby/object:RI::MethodSummary 
  name: _tags
- !ruby/object:RI::MethodSummary 
  name: _validate
- !ruby/object:RI::MethodSummary 
  name: calc_indent
- !ruby/object:RI::MethodSummary 
  name: children
- !ruby/object:RI::MethodSummary 
  name: collect_attrs
- !ruby/object:RI::MethodSummary 
  name: content_is_set?
- !ruby/object:RI::MethodSummary 
  name: convert
- !ruby/object:RI::MethodSummary 
  name: converter=
- !ruby/object:RI::MethodSummary 
  name: empty_content?
- !ruby/object:RI::MethodSummary 
  name: full_name
- !ruby/object:RI::MethodSummary 
  name: have_required_elements?
- !ruby/object:RI::MethodSummary 
  name: have_xml_content?
- !ruby/object:RI::MethodSummary 
  name: initialize_have_children_elements
- !ruby/object:RI::MethodSummary 
  name: initialize_variables
- !ruby/object:RI::MethodSummary 
  name: make_start_tag
- !ruby/object:RI::MethodSummary 
  name: need_base64_encode?
- !ruby/object:RI::MethodSummary 
  name: set_next_element
- !ruby/object:RI::MethodSummary 
  name: tag
- !ruby/object:RI::MethodSummary 
  name: tag_filter
- !ruby/object:RI::MethodSummary 
  name: tag_name
- !ruby/object:RI::MethodSummary 
  name: tag_name_with_prefix
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: valid?
- !ruby/object:RI::MethodSummary 
  name: validate
- !ruby/object:RI::MethodSummary 
  name: validate_attribute
- !ruby/object:RI::MethodSummary 
  name: validate_for_stream
- !ruby/object:RI::MethodSummary 
  name: xmled_content
name: Element
superclass: Object
PK�|[�0���/ri/1.8/system/RSS/Element/inherited_base-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::inherited_base
is_singleton: true
name: inherited_base
params: ()
visibility: public
PK�|[��!��(ri/1.8/system/RSS/Element/convert-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#convert
is_singleton: false
name: convert
params: (value)
visibility: public
PK�|[����+ri/1.8/system/RSS/Element/install_ns-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::install_ns
is_singleton: true
name: install_ns
params: (prefix, uri)
visibility: public
PK�|[k g���=ri/1.8/system/RSS/Element/add_need_initialize_variable-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::add_need_initialize_variable
is_singleton: true
name: add_need_initialize_variable
params: (variable_name)
visibility: public
PK�|[(+�ݫ�&ri/1.8/system/RSS/Element/_tags-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#_tags
is_singleton: false
name: _tags
params: ()
visibility: private
PK�|[�ퟯ��=ri/1.8/system/RSS/Element/def_corresponded_attr_reader-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::def_corresponded_attr_reader
is_singleton: true
name: def_corresponded_attr_reader
params: (name, type=nil)
visibility: public
PK�|[ݣJ��3ri/1.8/system/RSS/Element/validate_attribute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#validate_attribute
is_singleton: false
name: validate_attribute
params: ()
visibility: private
PK�|[�1]߿�2ri/1.8/system/RSS/Element/content_is_set%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#content_is_set?
is_singleton: false
name: content_is_set?
params: ()
visibility: private
PK�|[,ͣ���+ri/1.8/system/RSS/Element/__validate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#__validate
is_singleton: false
name: __validate
params: (ignore_unknown_element, tags=_tags, recursive=true)
visibility: private
PK�|[�\
���.ri/1.8/system/RSS/Element/install_model-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::install_model
is_singleton: true
name: install_model
params: (tag, uri, occurs=nil, getter=nil, plural=false)
visibility: public
PK�|[ w���5ri/1.8/system/RSS/Element/must_call_validators-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::must_call_validators
is_singleton: true
name: must_call_validators
params: ()
visibility: public
PK�|[.,D���:ri/1.8/system/RSS/Element/have_required_elements%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#have_required_elements?
is_singleton: false
name: have_required_elements?
params: ()
visibility: protected
PK�|[���<ri/1.8/system/RSS/Element/install_must_call_validator-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::install_must_call_validator
is_singleton: true
name: install_must_call_validator
params: (prefix, uri)
visibility: public
PK�|[q�p��$ri/1.8/system/RSS/Element/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::new
is_singleton: true
name: new
params: (do_validate=true, attrs=nil)
visibility: public
PK�|[̽r���:ri/1.8/system/RSS/Element/add_have_children_element-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::add_have_children_element
is_singleton: true
name: add_have_children_element
params: (variable_name, plural_name)
visibility: public
PK�|[���t��*ri/1.8/system/RSS/Element/_validate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#_validate
is_singleton: false
name: _validate
params: (ignore_unknown_element, tags, uri, models=self.class.models)
visibility: private
PK�|[
*Y��1ri/1.8/system/RSS/Element/empty_content%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#empty_content?
is_singleton: false
name: empty_content?
params: ()
visibility: private
PK�|[(���)ri/1.8/system/RSS/Element/valid%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#valid?
is_singleton: false
name: valid?
params: (ignore_unknown_element=true)
visibility: public
PK�|[^ً��/ri/1.8/system/RSS/Element/get_attributes-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::get_attributes
is_singleton: true
name: get_attributes
params: ()
visibility: public
PK�|[
v��)ri/1.8/system/RSS/Element/children-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#children
is_singleton: false
name: children
params: ()
visibility: private
PK�|[&�,~��5ri/1.8/system/RSS/Element/initialize_variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#initialize_variables
is_singleton: false
name: initialize_variables
params: (attrs)
visibility: private
PK�|[��[���=ri/1.8/system/RSS/Element/def_corresponded_attr_writer-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::def_corresponded_attr_writer
is_singleton: true
name: def_corresponded_attr_writer
params: (name, type=nil, disp_name=nil)
visibility: public
PK�|[������4ri/1.8/system/RSS/Element/have_xml_content%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#have_xml_content?
is_singleton: false
name: have_xml_content?
params: ()
visibility: public
PK�|[�i����0ri/1.8/system/RSS/Element/required_prefix-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::required_prefix
is_singleton: true
name: required_prefix
params: ()
visibility: public
PK�|[�jF��)ri/1.8/system/RSS/Element/validate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#validate
is_singleton: false
name: validate
params: (ignore_unknown_element=true)
visibility: public
PK�|[�3�B��.ri/1.8/system/RSS/Element/content_setup-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::content_setup
is_singleton: true
name: content_setup
params: (type=nil, disp_name=nil)
visibility: public
PK�|[�ѥ���0ri/1.8/system/RSS/Element/add_plural_form-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::add_plural_form
is_singleton: true
name: add_plural_form
params: (singular, plural)
visibility: public
PK�|[�ᵰ�)ri/1.8/system/RSS/Element/tag_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#tag_name
is_singleton: false
name: tag_name
params: ()
visibility: public
PK�|[�YZ���%ri/1.8/system/RSS/Element/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#to_s
is_singleton: false
name: to_s
params: (need_convert=true, indent='')
visibility: public
PK�|['ٖ��+ri/1.8/system/RSS/Element/tag_filter-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#tag_filter
is_singleton: false
name: tag_filter
params: (tags)
visibility: private
PK�|[���Ӹ�-ri/1.8/system/RSS/Element/plural_forms-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::plural_forms
is_singleton: true
name: plural_forms
params: ()
visibility: public
PK�|[=����'ri/1.8/system/RSS/Element/_attrs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#_attrs
is_singleton: false
name: _attrs
params: ()
visibility: private
PK�|[d&���'ri/1.8/system/RSS/Element/models-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::models
is_singleton: true
name: models
params: ()
visibility: public
PK�|[��I���4ri/1.8/system/RSS/Element/validate_for_stream-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#validate_for_stream
is_singleton: false
name: validate_for_stream
params: (tags, ignore_unknown_element=true)
visibility: public
PK�|[��P���.ri/1.8/system/RSS/Element/collect_attrs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#collect_attrs
is_singleton: false
name: collect_attrs
params: ()
visibility: private
PK�|[̲����.ri/1.8/system/RSS/Element/xmled_content-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#xmled_content
is_singleton: false
name: xmled_content
params: ()
visibility: private
PK�|[{/%z��6ri/1.8/system/RSS/Element/need_base64_encode%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#need_base64_encode?
is_singleton: false
name: need_base64_encode?
params: ()
visibility: public
PK�|[j̸�/ri/1.8/system/RSS/Element/need_parent%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::need_parent?
is_singleton: true
name: need_parent?
params: ()
visibility: public
PK�|[@nHD��-ri/1.8/system/RSS/Element/required_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::required_uri
is_singleton: true
name: required_uri
params: ()
visibility: public
PK�|[(�kt��3ri/1.8/system/RSS/Element/to_element_methods-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::to_element_methods
is_singleton: true
name: to_element_methods
params: ()
visibility: public
PK�|[e.�0��Bri/1.8/system/RSS/Element/initialize_have_children_elements-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#initialize_have_children_elements
is_singleton: false
name: initialize_have_children_elements
params: ()
visibility: private
PK�|[�O��$ri/1.8/system/RSS/Element/tag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#tag
is_singleton: false
name: tag
params: (indent, additional_attrs={}, &block)
visibility: private
PK�|[����5ri/1.8/system/RSS/Element/tag_name_with_prefix-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#tag_name_with_prefix
is_singleton: false
name: tag_name_with_prefix
params: (prefix)
visibility: private
PK�|[K�^ط�*ri/1.8/system/RSS/Element/inherited-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::inherited
is_singleton: true
name: inherited
params: (klass)
visibility: public
PK�|[���2��:ri/1.8/system/RSS/Element/need_initialize_variables-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::need_initialize_variables
is_singleton: true
name: need_initialize_variables
params: ()
visibility: public
PK�|[��A��/ri/1.8/system/RSS/Element/make_start_tag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element#make_start_tag
is_singleton: false
name: make_start_tag
params: (indent, next_indent, attrs)
visibility: private
PK�|[��V�

6ri/1.8/system/RSS/Element/install_get_attribute-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::Element::install_get_attribute
is_singleton: true
name: install_get_attribute
params: (name, uri, required=true, type=nil, disp_name=nil, element_name=nil)
visibility: public
PK�|[���/ri/1.8/system/RSS/NotWellFormedError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new NotWellFormedError for an error at <tt>line</tt> in <tt>element</tt>. If a block is given the return value of the block ends up in the error message.
full_name: RSS::NotWellFormedError::new
is_singleton: true
name: new
params: (line=nil, element=nil)
visibility: public
PK�|[nv_{~~Bri/1.8/system/RSS/NotWellFormedError/cdesc-NotWellFormedError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: element
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: line
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::NotWellFormedError
includes: []

instance_methods: []

name: NotWellFormedError
superclass: Error
PK�|[ܸ��Vri/1.8/system/RSS/UnknownConversionMethodError/cdesc-UnknownConversionMethodError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: from
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: to
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::UnknownConversionMethodError
includes: []

instance_methods: []

name: UnknownConversionMethodError
superclass: Error
PK�|[aJ_���9ri/1.8/system/RSS/UnknownConversionMethodError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::UnknownConversionMethodError::new
is_singleton: true
name: new
params: (to, from)
visibility: public
PK�|[��N��Hri/1.8/system/RSS/MissingAttributeError/cdesc-MissingAttributeError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: attribute
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: tag
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RSS::MissingAttributeError
includes: []

instance_methods: []

name: MissingAttributeError
superclass: InvalidRSSError
PK�|[�����2ri/1.8/system/RSS/MissingAttributeError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RSS::MissingAttributeError::new
is_singleton: true
name: new
params: (tag, attribute)
visibility: public
PK�|['w�mm)ri/1.8/system/Resolv/IPv4/cdesc-IPv4.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The raw IPv4 address as a String.
  name: address
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: create
comment: 
- !ruby/struct:SM::Flow::P 
  body: A Resolv::DNS IPv4 address.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Regular expression IPv4 addresses must match.
  name: Regex256
  value: /0                |1(?:[0-9][0-9]?)?                |2(?:[0-4][0-9]?|5[0-5]?|[6-9])?                |[3-9][0-9]?/x
- !ruby/object:RI::Constant 
  comment: 
  name: Regex
  value: /\A(#{Regex256})\.(#{Regex256})\.(#{Regex256})\.(#{Regex256})\z/
full_name: Resolv::IPv4
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_name
name: IPv4
superclass: Object
PK�|[��k�(ri/1.8/system/Resolv/IPv4/to_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Turns this IPv4 address into a Resolv::DNS::Name.
full_name: Resolv::IPv4#to_name
is_singleton: false
name: to_name
params: ()
visibility: public
PK�|[���ɯ�'ri/1.8/system/Resolv/IPv4/create-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Resolv::IPv4::create
is_singleton: true
name: create
params: (arg)
visibility: public
PK�|[A).ri/1.8/system/Resolv/Hosts/getaddresses-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Gets all IP addresses for <tt>name</tt> from the hosts file.
full_name: Resolv::Hosts#getaddresses
is_singleton: false
name: getaddresses
params: (name)
visibility: public
PK�|[<3�<,ri/1.8/system/Resolv/Hosts/getaddress-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Gets the IP address of <tt>name</tt> from the hosts file.
full_name: Resolv::Hosts#getaddress
is_singleton: false
name: getaddress
params: (name)
visibility: public
PK�|[����GG+ri/1.8/system/Resolv/Hosts/cdesc-Hosts.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: DNS::Hosts is a hostname resolver that uses the system hosts file.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: DefaultFileName
  value: Win32::Resolv.get_hosts_path
- !ruby/object:RI::Constant 
  comment: 
  name: DefaultFileName
  value: "'/etc/hosts'"
full_name: Resolv::Hosts
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: each_address
- !ruby/object:RI::MethodSummary 
  name: each_name
- !ruby/object:RI::MethodSummary 
  name: getaddress
- !ruby/object:RI::MethodSummary 
  name: getaddresses
- !ruby/object:RI::MethodSummary 
  name: getname
- !ruby/object:RI::MethodSummary 
  name: getnames
name: Hosts
superclass: Object
PK�|[��Pb,,%ri/1.8/system/Resolv/Hosts/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new DNS::Hosts, using <tt>filename</tt> for its data source.
full_name: Resolv::Hosts::new
is_singleton: true
name: new
params: (filename = DefaultFileName)
visibility: public
PK�|[;��88.ri/1.8/system/Resolv/Hosts/each_address-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over all IP addresses for <tt>name</tt> retrieved from the hosts file.
full_name: Resolv::Hosts#each_address
is_singleton: false
name: each_address
params: (name, &proc)
visibility: public
PK�|[N���*ri/1.8/system/Resolv/Hosts/getnames-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Gets all hostnames for <tt>address</tt> from the hosts file.
full_name: Resolv::Hosts#getnames
is_singleton: false
name: getnames
params: (address)
visibility: public
PK�|[��=�55+ri/1.8/system/Resolv/Hosts/each_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over all hostnames for <tt>address</tt> retrieved from the hosts file.
full_name: Resolv::Hosts#each_name
is_singleton: false
name: each_name
params: (address, &proc)
visibility: public
PK�|[�H��)ri/1.8/system/Resolv/Hosts/getname-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Gets the hostname of <tt>address</tt> from the hosts file.
full_name: Resolv::Hosts#getname
is_singleton: false
name: getname
params: (address)
visibility: public
PK�|[ʒ��(ri/1.8/system/Resolv/getaddresses-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Looks up all IP address for <tt>name</tt>.
full_name: Resolv::getaddresses
is_singleton: true
name: getaddresses
params: (name)
visibility: public
PK�|[�_��(ri/1.8/system/Resolv/getaddresses-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Looks up all IP address for <tt>name</tt>.
full_name: Resolv#getaddresses
is_singleton: false
name: getaddresses
params: (name)
visibility: public
PK�|[yxy��#ri/1.8/system/Resolv/getname-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Looks up the hostname of <tt>address</tt>.
full_name: Resolv::getname
is_singleton: true
name: getname
params: (address)
visibility: public
PK�|[����((7ri/1.8/system/Resolv/ResolvError/cdesc-ResolvError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Indicates a failure to resolve a name or address.
constants: []

full_name: Resolv::ResolvError
includes: []

instance_methods: []

name: ResolvError
superclass: StandardError
PK�|[B�P$ri/1.8/system/Resolv/getnames-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Looks up all hostnames for <tt>address</tt>.
full_name: Resolv::getnames
is_singleton: true
name: getnames
params: (address)
visibility: public
PK�|[��X�&ri/1.8/system/Resolv/getaddress-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Looks up the first IP address for <tt>name</tt>.
full_name: Resolv#getaddress
is_singleton: false
name: getaddress
params: (name)
visibility: public
PK�|[W�O (ri/1.8/system/Resolv/IPv6/to_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Turns this IPv6 address into a Resolv::DNS::Name.
full_name: Resolv::IPv6#to_name
is_singleton: false
name: to_name
params: ()
visibility: public
PK�|[/{1
'ri/1.8/system/Resolv/IPv6/create-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Creates a new IPv6 address from <tt>arg</tt> which may be:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "IPv6:"
    body: returns <tt>arg</tt>.
  - !ruby/struct:SM::Flow::LI 
    label: "String:"
    body: <tt>arg</tt> must match one of the IPv6::Regex* constants
  type: :NOTE
full_name: Resolv::IPv6::create
is_singleton: true
name: create
params: (arg)
visibility: public
PK�|[,c�)ri/1.8/system/Resolv/IPv6/cdesc-IPv6.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The raw IPv6 address as a String.
  name: address
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: create
comment: 
- !ruby/struct:SM::Flow::P 
  body: A Resolv::DNS IPv6 address.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: IPv6 address format a:b:c:d:e:f:g:h
  name: Regex_8Hex
  value: /\A       (?:[0-9A-Fa-f]{1,4}:){7}          [0-9A-Fa-f]{1,4}       \z/x
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Compressed IPv6 address format a::b
  name: Regex_CompressedHex
  value: "/\\A       ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) ::       ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)       \\z/x"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: IPv4 mapped IPv6 address format a:b:c:d:e:f:w.x.y.z
  name: Regex_6Hex4Dec
  value: /\A       ((?:[0-9A-Fa-f]{1,4}:){6,6})       (\d+)\.(\d+)\.(\d+)\.(\d+)       \z/x
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Compressed IPv4 mapped IPv6 address format a::b:w.x.y.z
  name: Regex_CompressedHex4Dec
  value: "/\\A       ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) ::       ((?:[0-9A-Fa-f]{1,4}:)*)       (\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)       \\z/x"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: A composite IPv6 address Regexp.
  name: Regex
  value: /       (?:#{Regex_8Hex}) |       (?:#{Regex_CompressedHex}) |       (?:#{Regex_6Hex4Dec}) |       (?:#{Regex_CompressedHex4Dec})/x
full_name: Resolv::IPv6
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_name
name: IPv6
superclass: Object
PK�|[_B��**;ri/1.8/system/Resolv/ResolvTimeout/cdesc-ResolvTimeout.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Indicates a timeout resolving a name or address.
constants: []

full_name: Resolv::ResolvTimeout
includes: []

instance_methods: []

name: ResolvTimeout
superclass: TimeoutError
PK�|[LHri/1.8/system/Resolv/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new Resolv using <tt>resolvers</tt>.
full_name: Resolv::new
is_singleton: true
name: new
params: (resolvers=[Hosts.new, DNS.new])
visibility: public
PK�|[�$O(ri/1.8/system/Resolv/each_address-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: name
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over all IP addresses for <tt>name</tt>.
full_name: Resolv#each_address
is_singleton: false
name: each_address
params: (name) {|name| ...}
visibility: public
PK�|[|�Z(ri/1.8/system/Resolv/each_address-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over all IP addresses for <tt>name</tt>.
full_name: Resolv::each_address
is_singleton: true
name: each_address
params: (name, &block)
visibility: public
PK�|[��m	m	&ri/1.8/system/Resolv/cdesc-Resolv.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: each_address
- !ruby/object:RI::MethodSummary 
  name: each_name
- !ruby/object:RI::MethodSummary 
  name: getaddress
- !ruby/object:RI::MethodSummary 
  name: getaddresses
- !ruby/object:RI::MethodSummary 
  name: getname
- !ruby/object:RI::MethodSummary 
  name: getnames
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Resolv is a thread-aware DNS resolver library written in Ruby. Resolv can handle multiple DNS requests concurrently without blocking. The ruby interpreter.
- !ruby/struct:SM::Flow::P 
  body: "See also resolv-replace.rb to replace the libc resolver with # Resolv."
- !ruby/struct:SM::Flow::P 
  body: Resolv can look up various DNS resources using the DNS module directly.
- !ruby/struct:SM::Flow::P 
  body: "Examples:"
- !ruby/struct:SM::Flow::VERB 
  body: "  p Resolv.getaddress &quot;www.ruby-lang.org&quot;\n  p Resolv.getname &quot;210.251.121.214&quot;\n\n  Resolv::DNS.open do |dns|\n    ress = dns.getresources &quot;www.ruby-lang.org&quot;, Resolv::DNS::Resource::IN::A\n    p ress.map { |r| r.address }\n    ress = dns.getresources &quot;ruby-lang.org&quot;, Resolv::DNS::Resource::IN::MX\n    p ress.map { |r| [r.exchange.to_s, r.preference] }\n  end\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Bugs
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: NIS is not supported.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: /etc/nsswitch.conf is not supported.
  type: :BULLET
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Default resolver to use for Resolv class methods.
  name: DefaultResolver
  value: self.new
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Address Regexp to use for matching IP addresses.
  name: AddressRegex
  value: /(?:#{IPv4::Regex})|(?:#{IPv6::Regex})/
full_name: Resolv
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: each_address
- !ruby/object:RI::MethodSummary 
  name: each_name
- !ruby/object:RI::MethodSummary 
  name: getaddress
- !ruby/object:RI::MethodSummary 
  name: getaddresses
- !ruby/object:RI::MethodSummary 
  name: getname
- !ruby/object:RI::MethodSummary 
  name: getnames
name: Resolv
superclass: Object
PK�|[Ah.�%ri/1.8/system/Resolv/each_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over all hostnames for <tt>address</tt>.
full_name: Resolv::each_name
is_singleton: true
name: each_name
params: (address, &proc)
visibility: public
PK�|[�21$ri/1.8/system/Resolv/getnames-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Looks up all hostnames for <tt>address</tt>.
full_name: Resolv#getnames
is_singleton: false
name: getnames
params: (address)
visibility: public
PK�|[�:b�$$%ri/1.8/system/Resolv/each_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: name.to_s
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over all hostnames for <tt>address</tt>.
full_name: Resolv#each_name
is_singleton: false
name: each_name
params: (address) {|name.to_s| ...}
visibility: public
PK�|[�����#ri/1.8/system/Resolv/getname-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Looks up the hostname of <tt>address</tt>.
full_name: Resolv#getname
is_singleton: false
name: getname
params: (address)
visibility: public
PK�|[}�X�&ri/1.8/system/Resolv/getaddress-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Looks up the first IP address for <tt>name</tt>.
full_name: Resolv::getaddress
is_singleton: true
name: getaddress
params: (name)
visibility: public
PK�|[-���1ri/1.8/system/Resolv/DNS/OpCode/cdesc-OpCode.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Resolv::DNS::OpCode
includes: []

instance_methods: []

name: OpCode
superclass: 
PK�|[s	}���,ri/1.8/system/Resolv/DNS/getaddresses-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Gets all IP addresses for <tt>name</tt> from the DNS resolver.
- !ruby/struct:SM::Flow::P 
  body: <tt>name</tt> can be a Resolv::DNS::Name or a String. Retrieved addresses will be a Resolv::IPv4 or Resolv::IPv6
full_name: Resolv::DNS#getaddresses
is_singleton: false
name: getaddresses
params: (name)
visibility: public
PK�|[t����2ri/1.8/system/Resolv/DNS/Resource/MINFO/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Resolv::DNS::Resource::MINFO::new
is_singleton: true
name: new
params: (rmailbx, emailbx)
visibility: public
PK�|[�:����8ri/1.8/system/Resolv/DNS/Resource/MINFO/cdesc-MINFO.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Mailbox to use for error messages related to the mail list or mailbox.
  name: emailbx
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Domain name responsible for this mail list or mailbox.
  name: rmailbx
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Mailing list or mailbox information.
constants: []

full_name: Resolv::DNS::Resource::MINFO
includes: []

instance_methods: []

name: MINFO
superclass: Resource
PK�|[�C?�2ri/1.8/system/Resolv/DNS/Resource/NS/cdesc-NS.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: An authoritative name server.
constants: []

full_name: Resolv::DNS::Resource::NS
includes: []

instance_methods: []

name: NS
superclass: DomainName
PK�|[�B'

4ri/1.8/system/Resolv/DNS/Resource/ANY/cdesc-ANY.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: A Query type requesting any RR.
constants: []

full_name: Resolv::DNS::Resource::ANY
includes: []

instance_methods: []

name: ANY
superclass: Query
PK�|[L�z7ri/1.8/system/Resolv/DNS/Resource/DomainName/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new DomainName from <tt>name</tt>.
full_name: Resolv::DNS::Resource::DomainName::new
is_singleton: true
name: new
params: (name)
visibility: public
PK�|[�\���Bri/1.8/system/Resolv/DNS/Resource/DomainName/cdesc-DomainName.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The name of this DomainName.
  name: name
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Domain Name resource abstract class.
constants: []

full_name: Resolv::DNS::Resource::DomainName
includes: []

instance_methods: []

name: DomainName
superclass: Resource
PK�|[�.���<ri/1.8/system/Resolv/DNS/Resource/Generic/cdesc-Generic.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Data for this generic resource.
  name: data
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A generic resource abstract class.
constants: []

full_name: Resolv::DNS::Resource::Generic
includes: []

instance_methods: []

name: Generic
superclass: Resource
PK�|[J���4ri/1.8/system/Resolv/DNS/Resource/Generic/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new generic resource.
full_name: Resolv::DNS::Resource::Generic::new
is_singleton: true
name: new
params: (data)
visibility: public
PK�|[��rJJ8ri/1.8/system/Resolv/DNS/Resource/HINFO/cdesc-HINFO.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: CPU architecture for this resource.
  name: cpu
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Operating system for this resource.
  name: os
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Host Information resource.
constants: []

full_name: Resolv::DNS::Resource::HINFO
includes: []

instance_methods: []

name: HINFO
superclass: Resource
PK�|[ F�2ri/1.8/system/Resolv/DNS/Resource/HINFO/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new HINFO running <tt>os</tt> on <tt>cpu</tt>.
full_name: Resolv::DNS::Resource::HINFO::new
is_singleton: true
name: new
params: (cpu, os)
visibility: public
PK�|[Bs0,,5ri/1.8/system/Resolv/DNS/Resource/cdesc-Resource.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Remaining Time To Live for this Resource.
  name: ttl
  rw: R
class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: A DNS resource abstract class.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ClassInsensitiveTypes
  value: "[ # :nodoc:         NS, CNAME, SOA, PTR, HINFO, MINFO, MX, TXT, ANY"
full_name: Resolv::DNS::Resource
includes: []

instance_methods: []

name: Resource
superclass: Query
PK�|[��:��3ri/1.8/system/Resolv/DNS/Resource/IN/SRV/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a SRV resource record.
- !ruby/struct:SM::Flow::P 
  body: "See the documentation for #priority, #weight, #port and #target for <tt>priority</tt>, <tt>weight</tt>, +port and <tt>target</tt> respectively."
full_name: Resolv::DNS::Resource::IN::SRV::new
is_singleton: true
name: new
params: (priority, weight, port, target)
visibility: public
PK�|[ʴ�^JJ7ri/1.8/system/Resolv/DNS/Resource/IN/SRV/cdesc-SRV.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The port on this target host of this service.
  - !ruby/struct:SM::Flow::P 
    body: The range is 0-65535.
  name: port
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The priority of this target host.
  - !ruby/struct:SM::Flow::P 
    body: A client MUST attempt to contact the target host with the lowest-numbered priority it can reach; target hosts with the same priority SHOULD be tried in an order defined by the weight field. The range is 0-65535. Note that it is not widely implemented and should be set to zero.
  name: priority
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The domain name of the target host.
  - !ruby/struct:SM::Flow::P 
    body: A target of &quot;.&quot; means that the service is decidedly not available at this domain.
  name: target
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: A server selection mechanism.
  - !ruby/struct:SM::Flow::P 
    body: The weight field specifies a relative weight for entries with the same priority. Larger weights SHOULD be given a proportionately higher probability of being selected. The range of this number is 0-65535. Domain administrators SHOULD use Weight 0 when there isn't any server selection to do, to make the RR easier to read for humans (less noisy). Note that it is not widely implemented and should be set to zero.
  name: weight
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: SRV resource record defined in RFC 2782
- !ruby/struct:SM::Flow::P 
  body: These records identify the hostname and port that a service is available at.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: TypeValue
  value: "33"
- !ruby/object:RI::Constant 
  comment: 
  name: ClassValue
  value: IN::ClassValue
full_name: Resolv::DNS::Resource::IN::SRV
includes: []

instance_methods: []

name: SRV
superclass: Resource
PK�|[�W	

4ri/1.8/system/Resolv/DNS/Resource/IN/AAAA/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new AAAA for <tt>address</tt>.
full_name: Resolv::DNS::Resource::IN::AAAA::new
is_singleton: true
name: new
params: (address)
visibility: public
PK�|[�V�nbb9ri/1.8/system/Resolv/DNS/Resource/IN/AAAA/cdesc-AAAA.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The Resolv::IPv6 address for this AAAA.
  name: address
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: An IPv6 address record.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: TypeValue
  value: "28"
- !ruby/object:RI::Constant 
  comment: 
  name: ClassValue
  value: IN::ClassValue
full_name: Resolv::DNS::Resource::IN::AAAA
includes: []

instance_methods: []

name: AAAA
superclass: Resource
PK�|[�5�;2ri/1.8/system/Resolv/DNS/Resource/IN/cdesc-IN.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: module IN contains ARPA Internet specific RRs.
constants: []

full_name: Resolv::DNS::Resource::IN
includes: []

instance_methods: []

name: IN
superclass: 
PK�|[$��1ri/1.8/system/Resolv/DNS/Resource/IN/A/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new A for <tt>address</tt>.
full_name: Resolv::DNS::Resource::IN::A::new
is_singleton: true
name: new
params: (address)
visibility: public
PK�|[�{.VV3ri/1.8/system/Resolv/DNS/Resource/IN/A/cdesc-A.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The Resolv::IPv4 address for this A.
  name: address
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: IPv4 Address resource
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: TypeValue
  value: "1"
- !ruby/object:RI::Constant 
  comment: 
  name: ClassValue
  value: IN::ClassValue
full_name: Resolv::DNS::Resource::IN::A
includes: []

instance_methods: []

name: A
superclass: Resource
PK�|[�h+�tt7ri/1.8/system/Resolv/DNS/Resource/IN/WKS/cdesc-WKS.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The host these services run on.
  name: address
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: A bit map of enabled services on this host.
  - !ruby/struct:SM::Flow::P 
    body: If protocol is 6 (TCP) then the 26th bit corresponds to the SMTP service (port 25). If this bit is set, then an SMTP server should be listening on TCP port 25; if zero, SMTP service is not supported.
  name: bitmap
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: IP protocol number for these services.
  name: protocol
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Well Known Service resource.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: TypeValue
  value: "11"
- !ruby/object:RI::Constant 
  comment: 
  name: ClassValue
  value: IN::ClassValue
full_name: Resolv::DNS::Resource::IN::WKS
includes: []

instance_methods: []

name: WKS
superclass: Resource
PK�|[�"Ӑ��3ri/1.8/system/Resolv/DNS/Resource/IN/WKS/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Resolv::DNS::Resource::IN::WKS::new
is_singleton: true
name: new
params: (address, protocol, bitmap)
visibility: public
PK�|[W��4ri/1.8/system/Resolv/DNS/Resource/PTR/cdesc-PTR.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: A Pointer to another DNS name.
constants: []

full_name: Resolv::DNS::Resource::PTR
includes: []

instance_methods: []

name: PTR
superclass: DomainName
PK�|[_snI8ri/1.8/system/Resolv/DNS/Resource/CNAME/cdesc-CNAME.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The canonical name for an alias.
constants: []

full_name: Resolv::DNS::Resource::CNAME
includes: []

instance_methods: []

name: CNAME
superclass: DomainName
PK�|[��Wee0ri/1.8/system/Resolv/DNS/Resource/SOA/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new SOA record. See the attr documentation for the details of each argument.
full_name: Resolv::DNS::Resource::SOA::new
is_singleton: true
name: new
params: (mname, rname, serial, refresh, retry_, expire, minimum)
visibility: public
PK�|[Bݮ�  4ri/1.8/system/Resolv/DNS/Resource/SOA/cdesc-SOA.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Time in seconds that a secondary name server is to use the data before refreshing from the primary name server.
  name: expire
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The minimum number of seconds to be used for TTL values in RRs.
  name: minimum
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Name of the host where the master zone file for this zone resides.
  name: mname
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: How often, in seconds, a secondary name server is to check for updates from the primary name server.
  name: refresh
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: How often, in seconds, a secondary name server is to retry after a failure to check for a refresh.
  name: retry
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The person responsible for this domain name.
  name: rname
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The version number of the zone file.
  name: serial
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Start Of Authority resource.
constants: []

full_name: Resolv::DNS::Resource::SOA
includes: []

instance_methods: []

name: SOA
superclass: Resource
PK�|[*�Q��4ri/1.8/system/Resolv/DNS/Resource/TXT/cdesc-TXT.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Returns an Array of Strings for this TXT record.
  name: strings
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Unstructured text resource.
constants: []

full_name: Resolv::DNS::Resource::TXT
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: data
name: TXT
superclass: Resource
PK�|[�E�

1ri/1.8/system/Resolv/DNS/Resource/TXT/data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the first string from <tt>strings</tt>.
full_name: Resolv::DNS::Resource::TXT#data
is_singleton: false
name: data
params: ()
visibility: public
PK�|[W��0��0ri/1.8/system/Resolv/DNS/Resource/TXT/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Resolv::DNS::Resource::TXT::new
is_singleton: true
name: new
params: (first_string, *rest_strings)
visibility: public
PK�|[j&m�BB/ri/1.8/system/Resolv/DNS/Resource/MX/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new MX record with <tt>preference</tt>, accepting mail at <tt>exchange</tt>.
full_name: Resolv::DNS::Resource::MX::new
is_singleton: true
name: new
params: (preference, exchange)
visibility: public
PK�|[˜~�882ri/1.8/system/Resolv/DNS/Resource/MX/cdesc-MX.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The host of this MX.
  name: exchange
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The preference for this MX.
  name: preference
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Mail Exchanger resource.
constants: []

full_name: Resolv::DNS::Resource::MX
includes: []

instance_methods: []

name: MX
superclass: Resource
PK�|[L�/�/ri/1.8/system/Resolv/DNS/Query/cdesc-Query.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: A DNS query abstract class.
constants: []

full_name: Resolv::DNS::Query
includes: []

instance_methods: []

name: Query
superclass: Object
PK�|[J��bb-ri/1.8/system/Resolv/DNS/each_resource-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Iterates over all <tt>typeclass</tt> DNS resources for <tt>name</tt>. See #getresource for argument details."
full_name: Resolv::DNS#each_resource
is_singleton: false
name: each_resource
params: (name, typeclass, &proc)
visibility: public
PK�|[����-ri/1.8/system/Resolv/DNS/Name/cdesc-Name.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: create
comment: 
- !ruby/struct:SM::Flow::P 
  body: A representation of a DNS name.
constants: []

full_name: Resolv::DNS::Name
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: absolute?
- !ruby/object:RI::MethodSummary 
  name: subdomain_of?
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Name
superclass: Object
PK�|[y�
���0ri/1.8/system/Resolv/DNS/Name/absolute%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: True if this name is absolute.
full_name: Resolv::DNS::Name#absolute?
is_singleton: false
name: absolute?
params: ()
visibility: public
PK�|[�"Ow��+ri/1.8/system/Resolv/DNS/Name/create-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Creates a new DNS name from <tt>arg</tt>. <tt>arg</tt> can be:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "Name:"
    body: returns <tt>arg</tt>.
  - !ruby/struct:SM::Flow::LI 
    label: "String:"
    body: Creates a new Name.
  type: :NOTE
full_name: Resolv::DNS::Name::create
is_singleton: true
name: create
params: (arg)
visibility: public
PK�|[�|D��4ri/1.8/system/Resolv/DNS/Name/subdomain_of%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if <tt>other</tt> is a subdomain.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  domain = Resolv::DNS::Name.create(&quot;y.z&quot;)\n  p Resolv::DNS::Name.create(&quot;w.x.y.z&quot;).subdomain_of?(domain) #=&gt; true\n  p Resolv::DNS::Name.create(&quot;x.y.z&quot;).subdomain_of?(domain) #=&gt; true\n  p Resolv::DNS::Name.create(&quot;y.z&quot;).subdomain_of?(domain) #=&gt; false\n  p Resolv::DNS::Name.create(&quot;z&quot;).subdomain_of?(domain) #=&gt; false\n  p Resolv::DNS::Name.create(&quot;x.y.z.&quot;).subdomain_of?(domain) #=&gt; false\n  p Resolv::DNS::Name.create(&quot;w.z&quot;).subdomain_of?(domain) #=&gt; false\n"
full_name: Resolv::DNS::Name#subdomain_of?
is_singleton: false
name: subdomain_of?
params: (other)
visibility: public
PK�|[��A�cc)ri/1.8/system/Resolv/DNS/Name/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: returns the domain name as a string.
- !ruby/struct:SM::Flow::P 
  body: The domain name doesn't have a trailing dot even if the name object is absolute.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  p Resolv::DNS::Name.create(&quot;x.y.z.&quot;).to_s #=&gt; &quot;x.y.z&quot;\n  p Resolv::DNS::Name.create(&quot;x.y.z&quot;).to_s #=&gt; &quot;x.y.z&quot;\n"
full_name: Resolv::DNS::Name#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[�����;ri/1.8/system/Resolv/DNS/Requester/Sender/cdesc-Sender.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Resolv::DNS::Requester::Sender
includes: []

instance_methods: []

name: Sender
superclass: Object
PK�|[��v{��Gri/1.8/system/Resolv/DNS/Requester/ConnectedUDP/cdesc-ConnectedUDP.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Resolv::DNS::Requester::ConnectedUDP
includes: []

instance_methods: []

name: ConnectedUDP
superclass: Requester
PK�|[Āz���Hri/1.8/system/Resolv/DNS/Requester/ConnectedUDP/Sender/cdesc-Sender.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Resolv::DNS::Requester::ConnectedUDP::Sender
includes: []

instance_methods: []

name: Sender
superclass: Requester::Sender
PK�|[+jC��Kri/1.8/system/Resolv/DNS/Requester/UnconnectedUDP/cdesc-UnconnectedUDP.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Resolv::DNS::Requester::UnconnectedUDP
includes: []

instance_methods: []

name: UnconnectedUDP
superclass: Requester
PK�|[�oE��Jri/1.8/system/Resolv/DNS/Requester/UnconnectedUDP/Sender/cdesc-Sender.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Resolv::DNS::Requester::UnconnectedUDP::Sender
includes: []

instance_methods: []

name: Sender
superclass: Requester::Sender
PK�|[�����?ri/1.8/system/Resolv/DNS/Requester/TCP/Sender/cdesc-Sender.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Resolv::DNS::Requester::TCP::Sender
includes: []

instance_methods: []

name: Sender
superclass: Requester::Sender
PK�|[ຶ���5ri/1.8/system/Resolv/DNS/Requester/TCP/cdesc-TCP.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Resolv::DNS::Requester::TCP
includes: []

instance_methods: []

name: TCP
superclass: Requester
PK�|[B����7ri/1.8/system/Resolv/DNS/Requester/cdesc-Requester.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Resolv::DNS::Requester
includes: []

instance_methods: []

name: Requester
superclass: Object
PK�|[$K�22Gri/1.8/system/Resolv/DNS/Requester/RequestError/cdesc-RequestError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Indicates a problem with the DNS request.
constants: []

full_name: Resolv::DNS::Requester::RequestError
includes: []

instance_methods: []

name: RequestError
superclass: StandardError
PK�|[�>ͪ�*ri/1.8/system/Resolv/DNS/getaddress-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Gets the IP address of <tt>name</tt> from the DNS resolver.
- !ruby/struct:SM::Flow::P 
  body: <tt>name</tt> can be a Resolv::DNS::Name or a String. Retrieved address will be a Resolv::IPv4 or Resolv::IPv6
full_name: Resolv::DNS#getaddress
is_singleton: false
name: getaddress
params: (name)
visibility: public
PK�|[�HN���#ri/1.8/system/Resolv/DNS/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new DNS resolver.
- !ruby/struct:SM::Flow::P 
  body: "<tt>config_info</tt> can be:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "nil:"
    body: Uses /etc/resolv.conf.
  - !ruby/struct:SM::Flow::LI 
    label: "String:"
    body: Path to a file using /etc/resolv.conf's format.
  - !ruby/struct:SM::Flow::LI 
    label: "Hash:"
    body: Must contain :nameserver, :search and :ndots keys.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  Resolv::DNS.new(:nameserver =&gt; ['210.251.121.21'],\n                  :search =&gt; ['ruby-lang.org'],\n                  :ndots =&gt; 1)\n"
full_name: Resolv::DNS::new
is_singleton: true
name: new
params: (config_info=nil)
visibility: public
PK�|[�\K���,ri/1.8/system/Resolv/DNS/each_address-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: resource.address
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over all IP addresses for <tt>name</tt> retrieved from the DNS resolver.
- !ruby/struct:SM::Flow::P 
  body: <tt>name</tt> can be a Resolv::DNS::Name or a String. Retrieved addresses will be a Resolv::IPv4 or Resolv::IPv6
full_name: Resolv::DNS#each_address
is_singleton: false
name: each_address
params: (name) {|resource.address| ...}
visibility: public
PK�|[O�8�ww'ri/1.8/system/Resolv/DNS/cdesc-DNS.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: open
comment: 
- !ruby/struct:SM::Flow::P 
  body: Resolv::DNS is a DNS stub resolver.
- !ruby/struct:SM::Flow::P 
  body: "Information taken from the following places:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: STD0013
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: RFC 1035
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: ftp://ftp.isi.edu/in-notes/iana/assignments/dns-parameters
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: etc.
  type: :BULLET
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Default DNS Port
  name: Port
  value: "53"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Default DNS UDP packet size
  name: UDPSize
  value: "512"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Group of DNS resolver threads (obsolete)
  name: DNSThreadGroup
  value: ThreadGroup.new
- !ruby/object:RI::Constant 
  comment: 
  name: RequestID
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  name: RequestIDMutex
  value: Mutex.new
full_name: Resolv::DNS
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: each_address
- !ruby/object:RI::MethodSummary 
  name: each_name
- !ruby/object:RI::MethodSummary 
  name: each_resource
- !ruby/object:RI::MethodSummary 
  name: getaddress
- !ruby/object:RI::MethodSummary 
  name: getaddresses
- !ruby/object:RI::MethodSummary 
  name: getname
- !ruby/object:RI::MethodSummary 
  name: getnames
- !ruby/object:RI::MethodSummary 
  name: getresource
- !ruby/object:RI::MethodSummary 
  name: getresources
name: DNS
superclass: Object
PK�|[�CN���/ri/1.8/system/Resolv/DNS/RCode/cdesc-RCode.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Resolv::DNS::RCode
includes: []

instance_methods: []

name: RCode
superclass: 
PK�|[�(��(ri/1.8/system/Resolv/DNS/getnames-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Gets all hostnames for <tt>address</tt> from the DNS resolver.
- !ruby/struct:SM::Flow::P 
  body: <tt>address</tt> must be a Resolv::IPv4, Resolv::IPv6 or a String. Retrieved names will be Resolv::DNS::Name instances.
full_name: Resolv::DNS#getnames
is_singleton: false
name: getnames
params: (address)
visibility: public
PK�|[�B.���)ri/1.8/system/Resolv/DNS/each_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: resource.name
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over all hostnames for <tt>address</tt> retrieved from the DNS resolver.
- !ruby/struct:SM::Flow::P 
  body: <tt>address</tt> must be a Resolv::IPv4, Resolv::IPv6 or a String. Retrieved names will be Resolv::DNS::Name instances.
full_name: Resolv::DNS#each_name
is_singleton: false
name: each_name
params: (address) {|resource.name| ...}
visibility: public
PK�|[x��STT,ri/1.8/system/Resolv/DNS/getresources-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Looks up all <tt>typeclass</tt> DNS resources for <tt>name</tt>. See #getresource for argument details."
full_name: Resolv::DNS#getresources
is_singleton: false
name: getresources
params: (name, typeclass)
visibility: public
PK�|[=
Z<ri/1.8/system/Resolv/DNS/Config/NXDomain/cdesc-NXDomain.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Indicates no such domain was found.
constants: []

full_name: Resolv::DNS::Config::NXDomain
includes: []

instance_methods: []

name: NXDomain
superclass: ResolvError
PK�|[�%���1ri/1.8/system/Resolv/DNS/Config/cdesc-Config.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Resolv::DNS::Config
includes: []

instance_methods: []

name: Config
superclass: Object
PK�|[6et`JJLri/1.8/system/Resolv/DNS/Config/OtherResolvError/cdesc-OtherResolvError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Indicates some other unhandled resolver error was encountered.
constants: []

full_name: Resolv::DNS::Config::OtherResolvError
includes: []

instance_methods: []

name: OtherResolvError
superclass: ResolvError
PK�|[y7���%ri/1.8/system/Resolv/DNS/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Closes the DNS resolver.
full_name: Resolv::DNS#close
is_singleton: false
name: close
params: ()
visibility: public
PK�|[:�B�44;ri/1.8/system/Resolv/DNS/EncodeError/cdesc-EncodeError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Indicates that the DNS request was unable to be encoded.
constants: []

full_name: Resolv::DNS::EncodeError
includes: []

instance_methods: []

name: EncodeError
superclass: StandardError
PK�|[���5��'ri/1.8/system/Resolv/DNS/getname-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Gets the hostname for <tt>address</tt> from the DNS resolver.
- !ruby/struct:SM::Flow::P 
  body: <tt>address</tt> must be a Resolv::IPv4, Resolv::IPv6 or a String. Retrieved name will be a Resolv::DNS::Name.
full_name: Resolv::DNS#getname
is_singleton: false
name: getname
params: (address)
visibility: public
PK�|[�oZH��1ri/1.8/system/Resolv/DNS/Label/Str/cdesc-Str.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Resolv::DNS::Label::Str
includes: []

instance_methods: []

name: Str
superclass: Object
PK�|[.ʫ��/ri/1.8/system/Resolv/DNS/Label/cdesc-Label.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Resolv::DNS::Label
includes: []

instance_methods: []

name: Label
superclass: 
PK�|[H�S55;ri/1.8/system/Resolv/DNS/DecodeError/cdesc-DecodeError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Indicates that the DNS response was unable to be decoded.
constants: []

full_name: Resolv::DNS::DecodeError
includes: []

instance_methods: []

name: DecodeError
superclass: StandardError
PK�|[C@[$��+ri/1.8/system/Resolv/DNS/getresource-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Look up the <tt>typeclass</tt> DNS resource of <tt>name</tt>.
- !ruby/struct:SM::Flow::P 
  body: <tt>name</tt> must be a Resolv::DNS::Name or a String.
- !ruby/struct:SM::Flow::P 
  body: "<tt>typeclass</tt> should be one of the following:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Resolv::DNS::Resource::IN::A
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Resolv::DNS::Resource::IN::AAAA
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Resolv::DNS::Resource::IN::ANY
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Resolv::DNS::Resource::IN::CNAME
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Resolv::DNS::Resource::IN::HINFO
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Resolv::DNS::Resource::IN::MINFO
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Resolv::DNS::Resource::IN::MX
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Resolv::DNS::Resource::IN::NS
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Resolv::DNS::Resource::IN::PTR
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Resolv::DNS::Resource::IN::SOA
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Resolv::DNS::Resource::IN::TXT
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Resolv::DNS::Resource::IN::WKS
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: Returned resource is represented as a Resolv::DNS::Resource instance, i.e. Resolv::DNS::Resource::IN::A.
full_name: Resolv::DNS#getresource
is_singleton: false
name: getresource
params: (name, typeclass)
visibility: public
PK�|[���&��Iri/1.8/system/Resolv/DNS/Message/MessageEncoder/cdesc-MessageEncoder.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Resolv::DNS::Message::MessageEncoder
includes: []

instance_methods: []

name: MessageEncoder
superclass: Object
PK�|[�"*���Iri/1.8/system/Resolv/DNS/Message/MessageDecoder/cdesc-MessageDecoder.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Resolv::DNS::Message::MessageDecoder
includes: []

instance_methods: []

name: MessageDecoder
superclass: Object
PK�|[E�~*��3ri/1.8/system/Resolv/DNS/Message/cdesc-Message.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Resolv::DNS::Message
includes: []

instance_methods: []

name: Message
superclass: Object
PK�|[QF�=��$ri/1.8/system/Resolv/DNS/open-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: dns
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new DNS resolver. See Resolv::DNS.new for argument details.
- !ruby/struct:SM::Flow::P 
  body: Yields the created DNS resolver to the block, if given, otherwise returns it.
full_name: Resolv::DNS::open
is_singleton: true
name: open
params: (*args) {|dns| ...}
visibility: public
PK�|[�v�)ri/1.8/system/MatchData/post_match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the portion of the original string after the current match. Equivalent to the special variable <tt>$'</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   m = /(.)(.)(\\d+)(\\d)/.match(&quot;THX1138: The Movie&quot;)\n   m.post_match   #=&gt; &quot;: The Movie&quot;\n"
full_name: MatchData#post_match
is_singleton: false
name: post_match
params: |
  mtch.post_match   => str

visibility: public
PK�|[djD��#ri/1.8/system/MatchData/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of elements in the match array.
- !ruby/struct:SM::Flow::VERB 
  body: "   m = /(.)(.)(\\d+)(\\d)/.match(&quot;THX1138.&quot;)\n   m.length   #=&gt; 5\n   m.size     #=&gt; 5\n"
full_name: MatchData#size
is_singleton: false
name: size
params: |
  mtch.length   => integer
  mtch.size     => integer

visibility: public
PK�|[����%ri/1.8/system/MatchData/offset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a two-element array containing the beginning and ending offsets of the <em>n</em>th match.
- !ruby/struct:SM::Flow::VERB 
  body: "   m = /(.)(.)(\\d+)(\\d)/.match(&quot;THX1138.&quot;)\n   m.offset(0)   #=&gt; [1, 7]\n   m.offset(4)   #=&gt; [6, 7]\n"
full_name: MatchData#offset
is_singleton: false
name: offset
params: |
  mtch.offset(n)   => array

visibility: public
PK�|[�pD���%ri/1.8/system/MatchData/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Match Reference---<tt>MatchData</tt> acts as an array, and may be accessed using the normal array indexing techniques. <em>mtch</em>[0] is equivalent to the special variable <tt>$&amp;</tt>, and returns the entire matched string. <em>mtch</em>[1], <em>mtch</em>[2], and so on return the values of the matched backreferences (portions of the pattern between parentheses).
- !ruby/struct:SM::Flow::VERB 
  body: "   m = /(.)(.)(\\d+)(\\d)/.match(&quot;THX1138.&quot;)\n   m[0]       #=&gt; &quot;HX1138&quot;\n   m[1, 2]    #=&gt; [&quot;H&quot;, &quot;X&quot;]\n   m[1..3]    #=&gt; [&quot;H&quot;, &quot;X&quot;, &quot;113&quot;]\n   m[-3, 2]   #=&gt; [&quot;X&quot;, &quot;113&quot;]\n"
full_name: MatchData#[]
is_singleton: false
name: "[]"
params: |
  mtch[i]               => obj
  mtch[start, length]   => array
  mtch[range]           => array

visibility: public
PK�|[L��11%ri/1.8/system/MatchData/select-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array containing match strings for which <em>block</em> gives <tt>true</tt>. MatchData#select will be removed from Ruby 1.9.
- !ruby/struct:SM::Flow::VERB 
  body: "   m = /(.)(.)(\\d+)(\\d)/.match(&quot;THX1138: The Movie&quot;)\n   p m.select{|x| /X/ =~ x}   #=&gt; [&quot;HX1138&quot;, &quot;X&quot;]\n"
full_name: MatchData#select
is_singleton: false
name: select
params: |
  mtch.select{|obj| block}   => array

visibility: public
PK�|[�#����#ri/1.8/system/MatchData/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the array of matches.
- !ruby/struct:SM::Flow::VERB 
  body: "   m = /(.)(.)(\\d+)(\\d)/.match(&quot;THX1138.&quot;)\n   m.to_a   #=&gt; [&quot;HX1138&quot;, &quot;H&quot;, &quot;X&quot;, &quot;113&quot;, &quot;8&quot;]\n"
- !ruby/struct:SM::Flow::P 
  body: Because <tt>to_a</tt> is called when expanding <tt>*</tt><em>variable</em>, there's a useful assignment shortcut for extracting matched fields. This is slightly slower than accessing the fields directly (as an intermediate array is generated).
- !ruby/struct:SM::Flow::VERB 
  body: "   all,f1,f2,f3 = *(/(.)(.)(\\d+)(\\d)/.match(&quot;THX1138.&quot;))\n   all   #=&gt; &quot;HX1138&quot;\n   f1    #=&gt; &quot;H&quot;\n   f2    #=&gt; &quot;X&quot;\n   f3    #=&gt; &quot;113&quot;\n"
full_name: MatchData#to_a
is_singleton: false
name: to_a
params: |
  mtch.to_a   => anArray

visibility: public
PK�|[)�€��%ri/1.8/system/MatchData/string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a frozen copy of the string passed in to <tt>match</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   m = /(.)(.)(\\d+)(\\d)/.match(&quot;THX1138.&quot;)\n   m.string   #=&gt; &quot;THX1138.&quot;\n"
full_name: MatchData#string
is_singleton: false
name: string
params: |
  mtch.string   => str

visibility: public
PK�|[���y��(ri/1.8/system/MatchData/values_at-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Uses each <em>index</em> to access the matching values, returning an array of the corresponding matches.
- !ruby/struct:SM::Flow::VERB 
  body: "   m = /(.)(.)(\\d+)(\\d)/.match(&quot;THX1138: The Movie&quot;)\n   m.to_a               #=&gt; [&quot;HX1138&quot;, &quot;H&quot;, &quot;X&quot;, &quot;113&quot;, &quot;8&quot;]\n   m.values_at(0, 2, -2)   #=&gt; [&quot;HX1138&quot;, &quot;X&quot;, &quot;113&quot;]\n"
full_name: MatchData#values_at
is_singleton: false
name: values_at
params: |
  mtch.values_at([index]*)   => array

visibility: public
PK�|[v���&ri/1.8/system/MatchData/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a printable version of <em>mtch</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "    puts /.$/.match(&quot;foo&quot;).inspect\n    #=&gt; #&lt;MatchData &quot;o&quot;&gt;\n\n    puts /(.)(.)(.)/.match(&quot;foo&quot;).inspect\n    #=&gt; #&lt;MatchData &quot;foo&quot; 1:&quot;f&quot; 2:&quot;o&quot; 3:&quot;o&quot;&gt;\n\n    puts /(.)(.)?(.)/.match(&quot;fo&quot;).inspect\n    #=&gt; #&lt;MatchData &quot;fo&quot; 1:&quot;f&quot; 2:nil 3:&quot;o&quot;&gt;\n"
full_name: MatchData#inspect
is_singleton: false
name: inspect
params: |
  mtch.inspect   => str

visibility: public
PK�|[�T��+ri/1.8/system/MatchData/pretty_print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: MatchData#pretty_print
is_singleton: false
name: pretty_print
params: (q)
visibility: public
PK�|[�=l���%ri/1.8/system/MatchData/length-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of elements in the match array.
- !ruby/struct:SM::Flow::VERB 
  body: "   m = /(.)(.)(\\d+)(\\d)/.match(&quot;THX1138.&quot;)\n   m.length   #=&gt; 5\n   m.size     #=&gt; 5\n"
full_name: MatchData#length
is_singleton: false
name: length
params: |
  mtch.length   => integer
  mtch.size     => integer

visibility: public
PK�|[�����(ri/1.8/system/MatchData/pre_match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the portion of the original string before the current match. Equivalent to the special variable <tt>$`</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   m = /(.)(.)(\\d+)(\\d)/.match(&quot;THX1138.&quot;)\n   m.pre_match   #=&gt; &quot;T&quot;\n"
full_name: MatchData#pre_match
is_singleton: false
name: pre_match
params: |
  mtch.pre_match   => str

visibility: public
PK�|[�����"ri/1.8/system/MatchData/end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the offset of the character immediately following the end of the <em>n</em>th element of the match array in the string.
- !ruby/struct:SM::Flow::VERB 
  body: "   m = /(.)(.)(\\d+)(\\d)/.match(&quot;THX1138.&quot;)\n   m.end(0)   #=&gt; 7\n   m.end(2)   #=&gt; 3\n"
full_name: MatchData#end
is_singleton: false
name: end
params: |
  mtch.end(n)   => integer

visibility: public
PK�|[$��#ri/1.8/system/MatchData/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the entire matched string.
- !ruby/struct:SM::Flow::VERB 
  body: "   m = /(.)(.)(\\d+)(\\d)/.match(&quot;THX1138.&quot;)\n   m.to_s   #=&gt; &quot;HX1138&quot;\n"
full_name: MatchData#to_s
is_singleton: false
name: to_s
params: |
  mtch.to_s   => str

visibility: public
PK�|[J�'''ri/1.8/system/MatchData/captures-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the array of captures; equivalent to <tt>mtch.to_a[1..-1]</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   f1,f2,f3,f4 = /(.)(.)(\\d+)(\\d)/.match(&quot;THX1138.&quot;).captures\n   f1    #=&gt; &quot;H&quot;\n   f2    #=&gt; &quot;X&quot;\n   f3    #=&gt; &quot;113&quot;\n   f4    #=&gt; &quot;8&quot;\n"
full_name: MatchData#captures
is_singleton: false
name: captures
params: |
  mtch.captures   => array

visibility: public
PK�|[�^����$ri/1.8/system/MatchData/begin-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the offset of the start of the <em>n</em>th element of the match array in the string.
- !ruby/struct:SM::Flow::VERB 
  body: "   m = /(.)(.)(\\d+)(\\d)/.match(&quot;THX1138.&quot;)\n   m.begin(0)   #=&gt; 1\n   m.begin(2)   #=&gt; 2\n"
full_name: MatchData#begin
is_singleton: false
name: begin
params: |
  mtch.begin(n)   => integer

visibility: public
PK�|[��[��,ri/1.8/system/MatchData/cdesc-MatchData.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>MatchData</tt> is the type of the special variable <tt>$~</tt>, and is the type of the object returned by <tt>Regexp#match</tt> and <tt>Regexp#last_match</tt>. It encapsulates all the results of a pattern match, results normally accessed through the special variables <tt>$&amp;</tt>, <tt>$'</tt>, <tt>$`</tt>, <tt>$1</tt>, <tt>$2</tt>, and so on. <tt>Matchdata</tt> is also known as <tt>MatchingData</tt>.
constants: []

full_name: MatchData
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: begin
- !ruby/object:RI::MethodSummary 
  name: captures
- !ruby/object:RI::MethodSummary 
  name: end
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: length
- !ruby/object:RI::MethodSummary 
  name: offset
- !ruby/object:RI::MethodSummary 
  name: post_match
- !ruby/object:RI::MethodSummary 
  name: pre_match
- !ruby/object:RI::MethodSummary 
  name: pretty_print
- !ruby/object:RI::MethodSummary 
  name: select
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: string
- !ruby/object:RI::MethodSummary 
  name: to_a
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: values_at
name: MatchData
superclass: Object
PK�|[H�Q-��.ri/1.8/system/XMP/StringInputMethod/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XMP::StringInputMethod::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[~V����/ri/1.8/system/XMP/StringInputMethod/gets-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XMP::StringInputMethod#gets
is_singleton: false
name: gets
params: ()
visibility: public
PK�|[�>���1ri/1.8/system/XMP/StringInputMethod/eof%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XMP::StringInputMethod#eof?
is_singleton: false
name: eof?
params: ()
visibility: public
PK�|[�@{"��@ri/1.8/system/XMP/StringInputMethod/cdesc-StringInputMethod.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: XMP::StringInputMethod
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: eof?
- !ruby/object:RI::MethodSummary 
  name: gets
- !ruby/object:RI::MethodSummary 
  name: puts
name: StringInputMethod
superclass: IRB::InputMethod
PK�|[z]�2��/ri/1.8/system/XMP/StringInputMethod/puts-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XMP::StringInputMethod#puts
is_singleton: false
name: puts
params: (exps)
visibility: public
PK�|[>�i8��ri/1.8/system/XMP/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XMP::new
is_singleton: true
name: new
params: (bind = nil)
visibility: public
PK�|[�wZ�

 ri/1.8/system/XMP/cdesc-XMP.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: XMP
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: puts
name: XMP
superclass: Object
PK�|[�vD`��ri/1.8/system/XMP/puts-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: XMP#puts
is_singleton: false
name: puts
params: (exps)
visibility: public
PK�|[�C'��:ri/1.8/system/Scanf/FormatSpecifier/extract_decimal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatSpecifier#extract_decimal
is_singleton: false
name: extract_decimal
params: (s)
visibility: private
PK�|[��N��6ri/1.8/system/Scanf/FormatSpecifier/extract_hex-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatSpecifier#extract_hex
is_singleton: false
name: extract_hex
params: (s)
visibility: private
PK�|[�����1ri/1.8/system/Scanf/FormatSpecifier/letter-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatSpecifier#letter
is_singleton: false
name: letter
params: ()
visibility: public
PK�|[�d�·�0ri/1.8/system/Scanf/FormatSpecifier/match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatSpecifier#match
is_singleton: false
name: match
params: (str)
visibility: public
PK�|[��!м�3ri/1.8/system/Scanf/FormatSpecifier/nil_proc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatSpecifier#nil_proc
is_singleton: false
name: nil_proc
params: (s)
visibility: private
PK�|[d�:��.ri/1.8/system/Scanf/FormatSpecifier/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatSpecifier::new
is_singleton: true
name: new
params: (str)
visibility: public
PK�|[��p>ri/1.8/system/Scanf/FormatSpecifier/cdesc-FormatSpecifier.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: conversion
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: matched
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: matched_string
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: re_string
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: Scanf::FormatSpecifier
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: count_space?
- !ruby/object:RI::MethodSummary 
  name: extract_decimal
- !ruby/object:RI::MethodSummary 
  name: extract_float
- !ruby/object:RI::MethodSummary 
  name: extract_hex
- !ruby/object:RI::MethodSummary 
  name: extract_integer
- !ruby/object:RI::MethodSummary 
  name: extract_octal
- !ruby/object:RI::MethodSummary 
  name: extract_plain
- !ruby/object:RI::MethodSummary 
  name: letter
- !ruby/object:RI::MethodSummary 
  name: match
- !ruby/object:RI::MethodSummary 
  name: mid_match?
- !ruby/object:RI::MethodSummary 
  name: nil_proc
- !ruby/object:RI::MethodSummary 
  name: skip
- !ruby/object:RI::MethodSummary 
  name: to_re
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: width
name: FormatSpecifier
superclass: Object
PK�|[�:lM��7ri/1.8/system/Scanf/FormatSpecifier/mid_match%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatSpecifier#mid_match?
is_singleton: false
name: mid_match?
params: ()
visibility: public
PK�|[��!ٳ�/ri/1.8/system/Scanf/FormatSpecifier/skip-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatSpecifier#skip
is_singleton: false
name: skip
params: ()
visibility: private
PK�|[�x�p��/ri/1.8/system/Scanf/FormatSpecifier/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatSpecifier#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[����:ri/1.8/system/Scanf/FormatSpecifier/extract_integer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatSpecifier#extract_integer
is_singleton: false
name: extract_integer
params: (s)
visibility: private
PK�|[Y5W-��8ri/1.8/system/Scanf/FormatSpecifier/extract_float-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatSpecifier#extract_float
is_singleton: false
name: extract_float
params: (s)
visibility: private
PK�|[�E���8ri/1.8/system/Scanf/FormatSpecifier/extract_octal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatSpecifier#extract_octal
is_singleton: false
name: extract_octal
params: (s)
visibility: private
PK�|[�6���0ri/1.8/system/Scanf/FormatSpecifier/to_re-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatSpecifier#to_re
is_singleton: false
name: to_re
params: ()
visibility: public
PK�|[�ֽ��0ri/1.8/system/Scanf/FormatSpecifier/width-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatSpecifier#width
is_singleton: false
name: width
params: ()
visibility: public
PK�|[���8ri/1.8/system/Scanf/FormatSpecifier/extract_plain-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatSpecifier#extract_plain
is_singleton: false
name: extract_plain
params: (s)
visibility: private
PK�|[2���9ri/1.8/system/Scanf/FormatSpecifier/count_space%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatSpecifier#count_space?
is_singleton: false
name: count_space?
params: ()
visibility: public
PK�|[�
���$ri/1.8/system/Scanf/cdesc-Scanf.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Scanf
includes: []

instance_methods: []

name: Scanf
superclass: 
PK�|[j��;��2ri/1.8/system/Scanf/FormatString/spec_count-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatString#spec_count
is_singleton: false
name: spec_count
params: ()
visibility: public
PK�|[�<'д�-ri/1.8/system/Scanf/FormatString/match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatString#match
is_singleton: false
name: match
params: (str)
visibility: public
PK�|[611;��1ri/1.8/system/Scanf/FormatString/last_spec-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatString#last_spec
is_singleton: false
name: last_spec
params: ()
visibility: public
PK�|[9�����+ri/1.8/system/Scanf/FormatString/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatString::new
is_singleton: true
name: new
params: (str)
visibility: public
PK�|[�!m�ss8ri/1.8/system/Scanf/FormatString/cdesc-FormatString.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: last_match_tried
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: last_spec_tried
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: matched_count
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: space
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: string_left
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: SPECIFIERS
  value: "'diuXxofeEgsc'"
- !ruby/object:RI::Constant 
  comment: 
  name: REGEX
  value: "/         # possible space, followed by...           (?:\\s*           # percent sign, followed by...             %             # another percent sign, or...               (?:%|                  # optional assignment suppression flag                  \\*?                  # optional maximum field width                  \\d*                    # named character class, ...                    (?:\\[\\[:\\w+:\\]\\]|                    # traditional character class, or...                       \\[[^\\]]*\\]|                    # specifier letter.                       [#{SPECIFIERS}])))|             # or miscellaneous characters               [^%\\s]+/ix"
full_name: Scanf::FormatString
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: last_spec
- !ruby/object:RI::MethodSummary 
  name: match
- !ruby/object:RI::MethodSummary 
  name: prune
- !ruby/object:RI::MethodSummary 
  name: spec_count
- !ruby/object:RI::MethodSummary 
  name: to_s
name: FormatString
superclass: Object
PK�|[�����-ri/1.8/system/Scanf/FormatString/prune-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatString#prune
is_singleton: false
name: prune
params: (n=matched_count)
visibility: public
PK�|[X9����,ri/1.8/system/Scanf/FormatString/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Scanf::FormatString#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�|[,i̋ ri/1.8/system/Hash/update-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds the contents of <em>other_hash</em> to <em>hsh</em>. If no block is specified entries with duplicate keys are overwritten with the values from <em>other_hash</em>, otherwise the value of each duplicate key is determined by calling the block with the key, its value in <em>hsh</em> and its value in <em>other_hash</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h1 = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h2 = { &quot;b&quot; =&gt; 254, &quot;c&quot; =&gt; 300 }\n   h1.merge!(h2)   #=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;254, &quot;c&quot;=&gt;300}\n\n   h1 = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h2 = { &quot;b&quot; =&gt; 254, &quot;c&quot; =&gt; 300 }\n   h1.merge!(h2) { |key, v1, v2| v1 }\n                   #=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200, &quot;c&quot;=&gt;300}\n"
full_name: Hash#update
is_singleton: false
name: update
params: |
  hsh.merge!(other_hash)                                 => hsh
  hsh.update(other_hash)                                 => hsh
  hsh.merge!(other_hash){|key, oldval, newval| block}    => hsh
  hsh.update(other_hash){|key, oldval, newval| block}    => hsh

visibility: public
PK�|[�P��))ri/1.8/system/Hash/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of key-value pairs in the hash.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;d&quot; =&gt; 100, &quot;a&quot; =&gt; 200, &quot;v&quot; =&gt; 300, &quot;e&quot; =&gt; 400 }\n   h.length        #=&gt; 4\n   h.delete(&quot;a&quot;)   #=&gt; 200\n   h.length        #=&gt; 3\n"
full_name: Hash#size
is_singleton: false
name: size
params: |
  hsh.length    =>  fixnum
  hsh.size      =>  fixnum

visibility: public
PK�|[�X�nn$ri/1.8/system/Hash/default%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the default value, the value returned for a key that does not exist in the hash. It is not possible to set the a default to a <tt>Proc</tt> that will be executed on each key lookup.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h.default = &quot;Go fish&quot;\n   h[&quot;a&quot;]     #=&gt; 100\n   h[&quot;z&quot;]     #=&gt; &quot;Go fish&quot;\n   # This doesn't do what you might hope...\n   h.default = proc do |hash, key|\n     hash[key] = key + key\n   end\n   h[2]       #=&gt; #&lt;Proc:0x401b3948@-:6&gt;\n   h[&quot;cat&quot;]   #=&gt; #&lt;Proc:0x401b3948@-:6&gt;\n"
full_name: Hash#default=
is_singleton: false
name: default=
params: |
  hsh.default = obj     => hsh

visibility: public
PK�|[4�U�JJ ri/1.8/system/Hash/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>hash</em> and <em>other</em> are both hashes with the same content.
full_name: Hash#eql?
is_singleton: false
name: eql?
params: |
  hash.eql?(other)  -> true or false

visibility: public
PK�|[6�	PZZ ri/1.8/system/Hash/invert-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new hash created by using <em>hsh</em>'s values as keys, and the keys as values.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;n&quot; =&gt; 100, &quot;m&quot; =&gt; 100, &quot;y&quot; =&gt; 300, &quot;d&quot; =&gt; 200, &quot;a&quot; =&gt; 0 }\n   h.invert   #=&gt; {0=&gt;&quot;a&quot;, 100=&gt;&quot;n&quot;, 200=&gt;&quot;d&quot;, 300=&gt;&quot;y&quot;}\n"
full_name: Hash#invert
is_singleton: false
name: invert
params: |
  hsh.invert -> aHash

visibility: public
PK�|[��??!ri/1.8/system/Hash/indexes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deprecated in favor of <tt>Hash#select</tt>.
full_name: Hash#indexes
is_singleton: false
name: indexes
params: |
  hsh.indexes(key, ...)    => array
  hsh.indices(key, ...)    => array

visibility: public
PK�|[�CS877 ri/1.8/system/Hash/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Element Reference---Retrieves the <em>value</em> object corresponding to the <em>key</em> object. If not found, returns the a default value (see <tt>Hash::new</tt> for details).
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h[&quot;a&quot;]   #=&gt; 100\n   h[&quot;c&quot;]   #=&gt; nil\n"
full_name: Hash#[]
is_singleton: false
name: "[]"
params: |
  hsh[key]    =>  value

visibility: public
PK�|[�YN�rr"ri/1.8/system/Hash/empty%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>hsh</em> contains no key-value pairs.
- !ruby/struct:SM::Flow::VERB 
  body: "   {}.empty?   #=&gt; true\n"
full_name: Hash#empty?
is_singleton: false
name: empty?
params: |
  hsh.empty?    => true or false

visibility: public
PK�|[TTri/1.8/system/Hash/merge-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new hash containing the contents of <em>other_hash</em> and the contents of <em>hsh</em>, overwriting entries in <em>hsh</em> with duplicate keys with those from <em>other_hash</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h1 = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h2 = { &quot;b&quot; =&gt; 254, &quot;c&quot; =&gt; 300 }\n   h1.merge(h2)   #=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;254, &quot;c&quot;=&gt;300}\n   h1             #=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200}\n"
full_name: Hash#merge
is_singleton: false
name: merge
params: |
  hsh.merge(other_hash)                              -> a_hash
  hsh.merge(other_hash){|key, oldval, newval| block} -> a_hash

visibility: public
PK�|[���Drrri/1.8/system/Hash/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls <em>block</em> once for each key in <em>hsh</em>, passing the key and value to the block as a two-element array. Because of the assignment semantics of block parameters, these elements will be split out if the block has two formal parameters. Also see <tt>Hash.each_pair</tt>, which will be marginally more efficient for blocks with two parameters.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h.each {|key, value| puts &quot;#{key} is #{value}&quot; }\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   a is 100\n   b is 200\n"
full_name: Hash#each
is_singleton: false
name: each
params: |
  hsh.each {| key, value | block } -> hsh

visibility: public
PK�|[���X�� ri/1.8/system/Hash/select-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new array consisting of <tt>[key,value]</tt> pairs for which the block returns true. Also see <tt>Hash.values_at</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200, &quot;c&quot; =&gt; 300 }\n   h.select {|k,v| k &gt; &quot;a&quot;}  #=&gt; [[&quot;b&quot;, 200], [&quot;c&quot;, 300]]\n   h.select {|k,v| v &lt; 200}  #=&gt; [[&quot;a&quot;, 100]]\n"
full_name: Hash#select
is_singleton: false
name: select
params: |
  hsh.select {|key, value| block}   => array

visibility: public
PK�|[�J�&&ri/1.8/system/Hash/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts <em>hsh</em> to a nested array of <tt>[</tt> <em>key, value</em> <tt>]</tt> arrays.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;c&quot; =&gt; 300, &quot;a&quot; =&gt; 100, &quot;d&quot; =&gt; 400, &quot;c&quot; =&gt; 300  }\n   h.to_a   #=&gt; [[&quot;a&quot;, 100], [&quot;c&quot;, 300], [&quot;d&quot;, 400]]\n"
full_name: Hash#to_a
is_singleton: false
name: to_a
params: |
  hsh.to_a -> array

visibility: public
PK�|[�����ri/1.8/system/Hash/store-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Element Assignment---Associates the value given by <em>value</em> with the key given by <em>key</em>. <em>key</em> should not have its value changed while it is in use as a key (a <tt>String</tt> passed as a key will be duplicated and frozen).
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h[&quot;a&quot;] = 9\n   h[&quot;c&quot;] = 4\n   h   #=&gt; {&quot;a&quot;=&gt;9, &quot;b&quot;=&gt;200, &quot;c&quot;=&gt;4}\n"
full_name: Hash#store
is_singleton: false
name: store
params: |
  hsh[key] = value        => value
  hsh.store(key, value)   => value

visibility: public
PK�|[�����!ri/1.8/system/Hash/default-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the default value, the value that would be returned by <em>hsh</em>[<em>key</em>] if <em>key</em> did not exist in <em>hsh</em>. See also <tt>Hash::new</tt> and <tt>Hash#default=</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = Hash.new                            #=&gt; {}\n   h.default                               #=&gt; nil\n   h.default(2)                            #=&gt; nil\n\n   h = Hash.new(&quot;cat&quot;)                     #=&gt; {}\n   h.default                               #=&gt; &quot;cat&quot;\n   h.default(2)                            #=&gt; &quot;cat&quot;\n\n   h = Hash.new {|h,k| h[k] = k.to_i*10}   #=&gt; {}\n   h.default                               #=&gt; nil\n   h.default(2)                            #=&gt; 20\n"
full_name: Hash#default
is_singleton: false
name: default
params: |
  hsh.default(key=nil)   => obj

visibility: public
PK�|[�E���!ri/1.8/system/Hash/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Hash#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PK�|[�vv ri/1.8/system/Hash/rehash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Rebuilds the hash based on the current hash values for each key. If values of key objects have changed since they were inserted, this method will reindex <em>hsh</em>. If <tt>Hash#rehash</tt> is called while an iterator is traversing the hash, an <tt>IndexError</tt> will be raised in the iterator.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot; ]\n   c = [ &quot;c&quot;, &quot;d&quot; ]\n   h = { a =&gt; 100, c =&gt; 300 }\n   h[a]       #=&gt; 100\n   a[0] = &quot;z&quot;\n   h[a]       #=&gt; nil\n   h.rehash   #=&gt; {[&quot;z&quot;, &quot;b&quot;]=&gt;100, [&quot;c&quot;, &quot;d&quot;]=&gt;300}\n   h[a]       #=&gt; 100\n"
full_name: Hash#rehash
is_singleton: false
name: rehash
params: |
  hsh.rehash -> hsh

visibility: public
PK�|[�K|�ggri/1.8/system/Hash/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compute a hash-code for this array. Two arrays with the same content will have the same hash code (and will compare using <tt>eql?</tt>).
full_name: Hash#hash
is_singleton: false
name: hash
params: |
  array.hash   -> fixnum

visibility: public
PK�|[�V4,ll#ri/1.8/system/Hash/values_at-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return an array containing the values associated with the given keys. Also see <tt>Hash.select</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "  h = { &quot;cat&quot; =&gt; &quot;feline&quot;, &quot;dog&quot; =&gt; &quot;canine&quot;, &quot;cow&quot; =&gt; &quot;bovine&quot; }\n  h.values_at(&quot;cow&quot;, &quot;cat&quot;)  #=&gt; [&quot;bovine&quot;, &quot;feline&quot;]\n"
full_name: Hash#values_at
is_singleton: false
name: values_at
params: |
  hsh.values_at(key, ...)   => array

visibility: public
PK�|[�Y\��)ri/1.8/system/Hash/yaml_initialize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Hash#yaml_initialize
is_singleton: false
name: yaml_initialize
params: ( tag, val )
visibility: public
PK�|[FJ�Ktt ri/1.8/system/Hash/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes and returns a key-value pair from <em>hsh</em> whose key is equal to <em>key</em>. If the key is not found, returns <tt>nil</tt>. If the optional code block is given and the key is not found, pass in the key and return the result of <em>block</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h.delete(&quot;a&quot;)                              #=&gt; 100\n   h.delete(&quot;z&quot;)                              #=&gt; nil\n   h.delete(&quot;z&quot;) { |el| &quot;#{el} not found&quot; }   #=&gt; &quot;z not found&quot;\n"
full_name: Hash#delete
is_singleton: false
name: delete
params: |
  hsh.delete(key)                   => value
  hsh.delete(key) {| key | block }  => value

visibility: public
PK�|[iE-2mm#ri/1.8/system/Hash/member%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the given key is present in <em>hsh</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h.has_key?(&quot;a&quot;)   #=&gt; true\n   h.has_key?(&quot;z&quot;)   #=&gt; false\n"
full_name: Hash#member?
is_singleton: false
name: member?
params: |
  hsh.has_key?(key)    => true or false
  hsh.include?(key)    => true or false
  hsh.key?(key)        => true or false
  hsh.member?(key)     => true or false

visibility: public
PK�|[����XX#ri/1.8/system/Hash/reject%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>Hash#delete_if</tt>, but returns <tt>nil</tt> if no changes were made.
full_name: Hash#reject!
is_singleton: false
name: reject!
params: |
  hsh.reject! {| key, value | block }  -> hsh or nil

visibility: public
PK�|[Q�@@"ri/1.8/system/Hash/each_key-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls <em>block</em> once for each key in <em>hsh</em>, passing the key as a parameter.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h.each_key {|key| puts key }\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   a\n   b\n"
full_name: Hash#each_key
is_singleton: false
name: each_key
params: |
  hsh.each_key {| key | block } -> hsh

visibility: public
PK�|[�Rz??!ri/1.8/system/Hash/indices-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deprecated in favor of <tt>Hash#select</tt>.
full_name: Hash#indices
is_singleton: false
name: indices
params: |
  hsh.indexes(key, ...)    => array
  hsh.indices(key, ...)    => array

visibility: public
PK�|[��Li��ri/1.8/system/Hash/index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the key for a given value. If not found, returns <tt>nil</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h.index(200)   #=&gt; &quot;b&quot;\n   h.index(999)   #=&gt; nil\n"
full_name: Hash#index
is_singleton: false
name: index
params: |
  hsh.index(value)    => key

visibility: public
PK�|[��;;#ri/1.8/system/Hash/delete_if-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes every key-value pair from <em>hsh</em> for which <em>block</em> evaluates to <tt>true</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200, &quot;c&quot; =&gt; 300 }\n   h.delete_if {|key, value| key &gt;= &quot;b&quot; }   #=&gt; {&quot;a&quot;=&gt;100}\n"
full_name: Hash#delete_if
is_singleton: false
name: delete_if
params: |
  hsh.delete_if {| key, value | block }  -> hsh

visibility: public
PK�|[��'�!ri/1.8/system/Hash/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the contents of this hash as a string.
full_name: Hash#inspect
is_singleton: false
name: inspect
params: |
  hsh.inspect  => string

visibility: public
PK�|[–�TT$ri/1.8/system/Hash/each_value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls <em>block</em> once for each key in <em>hsh</em>, passing the value as a parameter.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h.each_value {|value| puts value }\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   100\n   200\n"
full_name: Hash#each_value
is_singleton: false
name: each_value
params: |
  hsh.each_value {| value | block } -> hsh

visibility: public
PK�|[jv�Hoo$ri/1.8/system/Hash/include%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the given key is present in <em>hsh</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h.has_key?(&quot;a&quot;)   #=&gt; true\n   h.has_key?(&quot;z&quot;)   #=&gt; false\n"
full_name: Hash#include?
is_singleton: false
name: include?
params: |
  hsh.has_key?(key)    => true or false
  hsh.include?(key)    => true or false
  hsh.key?(key)        => true or false
  hsh.member?(key)     => true or false

visibility: public
PK�|[{.*̡�ri/1.8/system/Hash/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new, empty hash. If this hash is subsequently accessed by a key that doesn't correspond to a hash entry, the value returned depends on the style of <tt>new</tt> used to create the hash. In the first form, the access returns <tt>nil</tt>. If <em>obj</em> is specified, this single object will be used for all <em>default values</em>. If a block is specified, it will be called with the hash object and the key, and should return the default value. It is the block's responsibility to store the value in the hash if required.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = Hash.new(&quot;Go Fish&quot;)\n   h[&quot;a&quot;] = 100\n   h[&quot;b&quot;] = 200\n   h[&quot;a&quot;]           #=&gt; 100\n   h[&quot;c&quot;]           #=&gt; &quot;Go Fish&quot;\n   # The following alters the single default object\n   h[&quot;c&quot;].upcase!   #=&gt; &quot;GO FISH&quot;\n   h[&quot;d&quot;]           #=&gt; &quot;GO FISH&quot;\n   h.keys           #=&gt; [&quot;a&quot;, &quot;b&quot;]\n\n   # While this creates a new default object each time\n   h = Hash.new { |hash, key| hash[key] = &quot;Go Fish: #{key}&quot; }\n   h[&quot;c&quot;]           #=&gt; &quot;Go Fish: c&quot;\n   h[&quot;c&quot;].upcase!   #=&gt; &quot;GO FISH: C&quot;\n   h[&quot;d&quot;]           #=&gt; &quot;Go Fish: d&quot;\n   h.keys           #=&gt; [&quot;c&quot;, &quot;d&quot;]\n"
full_name: Hash::new
is_singleton: true
name: new
params: |
  Hash.new                          => hash
  Hash.new(obj)                     => aHash
  Hash.new {|hash, key| block }     => aHash

visibility: public
PK�|[�$���&ri/1.8/system/Hash/pretty_print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Hash#pretty_print
is_singleton: false
name: pretty_print
params: (q)
visibility: public
PK�|[��g!ri/1.8/system/Hash/replace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Replaces the contents of <em>hsh</em> with the contents of <em>other_hash</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h.replace({ &quot;c&quot; =&gt; 300, &quot;d&quot; =&gt; 400 })   #=&gt; {&quot;c&quot;=&gt;300, &quot;d&quot;=&gt;400}\n"
full_name: Hash#replace
is_singleton: false
name: replace
params: |
  hsh.replace(other_hash) -> hsh

visibility: public
PK�|[hD-)�� ri/1.8/system/Hash/reject-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Same as <tt>Hash#delete_if</tt>, but works on (and returns) a copy of the <em>hsh</em>. Equivalent to <tt><em>hsh</em>.dup.delete_if</tt>.
full_name: Hash#reject
is_singleton: false
name: reject
params: |
  hsh.reject {| key, value | block }  -> a_hash

visibility: public
PK�|[�3��..)ri/1.8/system/Hash/initialize_copy-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Replaces the contents of <em>hsh</em> with the contents of <em>other_hash</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h.replace({ &quot;c&quot; =&gt; 300, &quot;d&quot; =&gt; 400 })   #=&gt; {&quot;c&quot;=&gt;300, &quot;d&quot;=&gt;400}\n"
full_name: Hash#initialize_copy
is_singleton: false
name: initialize_copy
params: |
  hsh.replace(other_hash) -> hsh

visibility: public
PK�|[����-- ri/1.8/system/Hash/length-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of key-value pairs in the hash.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;d&quot; =&gt; 100, &quot;a&quot; =&gt; 200, &quot;v&quot; =&gt; 300, &quot;e&quot; =&gt; 400 }\n   h.length        #=&gt; 4\n   h.delete(&quot;a&quot;)   #=&gt; 200\n   h.length        #=&gt; 3\n"
full_name: Hash#length
is_singleton: false
name: length
params: |
  hsh.length    =>  fixnum
  hsh.size      =>  fixnum

visibility: public
PK�|[Ѷ�"ri/1.8/system/Hash/merge%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds the contents of <em>other_hash</em> to <em>hsh</em>. If no block is specified entries with duplicate keys are overwritten with the values from <em>other_hash</em>, otherwise the value of each duplicate key is determined by calling the block with the key, its value in <em>hsh</em> and its value in <em>other_hash</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h1 = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h2 = { &quot;b&quot; =&gt; 254, &quot;c&quot; =&gt; 300 }\n   h1.merge!(h2)   #=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;254, &quot;c&quot;=&gt;300}\n\n   h1 = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h2 = { &quot;b&quot; =&gt; 254, &quot;c&quot; =&gt; 300 }\n   h1.merge!(h2) { |key, v1, v2| v1 }\n                   #=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200, &quot;c&quot;=&gt;300}\n"
full_name: Hash#merge!
is_singleton: false
name: merge!
params: |
  hsh.merge!(other_hash)                                 => hsh
  hsh.update(other_hash)                                 => hsh
  hsh.merge!(other_hash){|key, oldval, newval| block}    => hsh
  hsh.update(other_hash){|key, oldval, newval| block}    => hsh

visibility: public
PK�|[�f;���"ri/1.8/system/Hash/cdesc-Hash.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A <tt>Hash</tt> is a collection of key-value pairs. It is similar to an <tt>Array</tt>, except that indexing is done via arbitrary keys of any object type, not an integer index. The order in which you traverse a hash by either key or value may seem arbitrary, and will generally not be in the insertion order.
- !ruby/struct:SM::Flow::P 
  body: Hashes have a <em>default value</em> that is returned when accessing keys that do not exist in the hash. By default, that value is <tt>nil</tt>.
- !ruby/struct:SM::Flow::P 
  body: <tt>Hash</tt> uses <tt>key.eql?</tt> to test keys for equality. If you need to use instances of your own classes as keys in a <tt>Hash</tt>, it is recommended that you define both the <tt>eql?</tt> and <tt>hash</tt> methods. The <tt>hash</tt> method must have the property that <tt>a.eql?(b)</tt> implies <tt>a.hash == b.hash</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "  class MyClass\n    attr_reader :str\n    def initialize(str)\n      @str = str\n    end\n    def eql?(o)\n      o.is_a?(MyClass) &amp;&amp; str == o.str\n    end\n    def hash\n      @str.hash\n    end\n  end\n\n  a = MyClass.new(&quot;some string&quot;)\n  b = MyClass.new(&quot;some string&quot;)\n  a.eql? b  #=&gt; true\n\n  h = {}\n\n  h[a] = 1\n  h[a]      #=&gt; 1\n  h[b]      #=&gt; 1\n\n  h[b] = 2\n  h[a]      #=&gt; 2\n  h[b]      #=&gt; 2\n"
constants: []

full_name: Hash
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: clear
- !ruby/object:RI::MethodSummary 
  name: default
- !ruby/object:RI::MethodSummary 
  name: default=
- !ruby/object:RI::MethodSummary 
  name: default_proc
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: delete_if
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: each_key
- !ruby/object:RI::MethodSummary 
  name: each_pair
- !ruby/object:RI::MethodSummary 
  name: each_value
- !ruby/object:RI::MethodSummary 
  name: empty?
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: fetch
- !ruby/object:RI::MethodSummary 
  name: has_key?
- !ruby/object:RI::MethodSummary 
  name: has_value?
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: include?
- !ruby/object:RI::MethodSummary 
  name: index
- !ruby/object:RI::MethodSummary 
  name: indexes
- !ruby/object:RI::MethodSummary 
  name: indices
- !ruby/object:RI::MethodSummary 
  name: initialize_copy
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: invert
- !ruby/object:RI::MethodSummary 
  name: key?
- !ruby/object:RI::MethodSummary 
  name: keys
- !ruby/object:RI::MethodSummary 
  name: length
- !ruby/object:RI::MethodSummary 
  name: member?
- !ruby/object:RI::MethodSummary 
  name: merge
- !ruby/object:RI::MethodSummary 
  name: merge!
- !ruby/object:RI::MethodSummary 
  name: pretty_print
- !ruby/object:RI::MethodSummary 
  name: pretty_print_cycle
- !ruby/object:RI::MethodSummary 
  name: rehash
- !ruby/object:RI::MethodSummary 
  name: reject
- !ruby/object:RI::MethodSummary 
  name: reject!
- !ruby/object:RI::MethodSummary 
  name: replace
- !ruby/object:RI::MethodSummary 
  name: select
- !ruby/object:RI::MethodSummary 
  name: shift
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: sort
- !ruby/object:RI::MethodSummary 
  name: store
- !ruby/object:RI::MethodSummary 
  name: to_a
- !ruby/object:RI::MethodSummary 
  name: to_hash
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: to_yaml
- !ruby/object:RI::MethodSummary 
  name: update
- !ruby/object:RI::MethodSummary 
  name: value?
- !ruby/object:RI::MethodSummary 
  name: values
- !ruby/object:RI::MethodSummary 
  name: values_at
- !ruby/object:RI::MethodSummary 
  name: yaml_initialize
name: Hash
superclass: Object
PK�|[ٝS�  ri/1.8/system/Hash/keys-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new array populated with the keys from this hash. See also <tt>Hash#values</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200, &quot;c&quot; =&gt; 300, &quot;d&quot; =&gt; 400 }\n   h.keys   #=&gt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;]\n"
full_name: Hash#keys
is_singleton: false
name: keys
params: |
  hsh.keys    => array

visibility: public
PK�|[��[�yy&ri/1.8/system/Hash/default_proc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: If <tt>Hash::new</tt> was invoked with a block, return that block, otherwise return <tt>nil</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = Hash.new {|h,k| h[k] = k*k }   #=&gt; {}\n   p = h.default_proc                 #=&gt; #&lt;Proc:0x401b3d08@-:1&gt;\n   a = []                             #=&gt; []\n   p.call(a, 2)\n   a                                  #=&gt; [nil, nil, 4]\n"
full_name: Hash#default_proc
is_singleton: false
name: default_proc
params: |
  hsh.default_proc -> anObject

visibility: public
PK�|[�cf�{{ri/1.8/system/Hash/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts <em>hsh</em> to a string by converting the hash to an array of <tt>[</tt> <em>key, value</em> <tt>]</tt> pairs and then converting that array to a string using <tt>Array#join</tt> with the default separator.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;c&quot; =&gt; 300, &quot;a&quot; =&gt; 100, &quot;d&quot; =&gt; 400, &quot;c&quot; =&gt; 300  }\n   h.to_s   #=&gt; &quot;a100c300d400&quot;\n"
full_name: Hash#to_s
is_singleton: false
name: to_s
params: |
  hsh.to_s   => string

visibility: public
PK�|[�h��AA ri/1.8/system/Hash/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equality---Two hashes are equal if they each contain the same number of keys and if each key-value pair is equal to (according to <tt>Object#==</tt>) the corresponding elements in the other hash.
- !ruby/struct:SM::Flow::VERB 
  body: "   h1 = { &quot;a&quot; =&gt; 1, &quot;c&quot; =&gt; 2 }\n   h2 = { 7 =&gt; 35, &quot;c&quot; =&gt; 2, &quot;a&quot; =&gt; 1 }\n   h3 = { &quot;a&quot; =&gt; 1, &quot;c&quot; =&gt; 2, 7 =&gt; 35 }\n   h4 = { &quot;a&quot; =&gt; 1, &quot;d&quot; =&gt; 2, &quot;f&quot; =&gt; 35 }\n   h1 == h2   #=&gt; false\n   h2 == h3   #=&gt; true\n   h3 == h4   #=&gt; false\n"
full_name: Hash#==
is_singleton: false
name: ==
params: |
  hsh == other_hash    => true or false

visibility: public
PK�|[���u"""ri/1.8/system/Hash/value%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the given value is present for some key in <em>hsh</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h.has_value?(100)   #=&gt; true\n   h.has_value?(999)   #=&gt; false\n"
full_name: Hash#value?
is_singleton: false
name: value?
params: |
  hsh.has_value?(value)    => true or false
  hsh.value?(value)        => true or false

visibility: public
PK�|[��i�� ri/1.8/system/Hash/values-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new array populated with the values from <em>hsh</em>. See also <tt>Hash#keys</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200, &quot;c&quot; =&gt; 300 }\n   h.values   #=&gt; [100, 200, 300]\n"
full_name: Hash#values
is_singleton: false
name: values
params: |
  hsh.values    => array

visibility: public
PK�|[F�-���,ri/1.8/system/Hash/pretty_print_cycle-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Hash#pretty_print_cycle
is_singleton: false
name: pretty_print_cycle
params: (q)
visibility: public
PK�|[�T�2��!ri/1.8/system/Hash/to_hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <em>self</em>.
full_name: Hash#to_hash
is_singleton: false
name: to_hash
params: |
  hsh.to_hash   => hsh

visibility: public
PK�|[g��&��ri/1.8/system/Hash/sort-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts <em>hsh</em> to a nested array of <tt>[</tt> <em>key, value</em> <tt>]</tt> arrays and sorts it, using <tt>Array#sort</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 20, &quot;b&quot; =&gt; 30, &quot;c&quot; =&gt; 10  }\n   h.sort                       #=&gt; [[&quot;a&quot;, 20], [&quot;b&quot;, 30], [&quot;c&quot;, 10]]\n   h.sort {|a,b| a[1]&lt;=&gt;b[1]}   #=&gt; [[&quot;c&quot;, 10], [&quot;a&quot;, 20], [&quot;b&quot;, 30]]\n"
full_name: Hash#sort
is_singleton: false
name: sort
params: |
  hsh.sort                    => array
  hsh.sort {| a, b | block }  => array

visibility: public
PK�|[��Hossri/1.8/system/Hash/shift-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes a key-value pair from <em>hsh</em> and returns it as the two-item array <tt>[</tt> <em>key, value</em> <tt>]</tt>, or the hash's default value if the hash is empty.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { 1 =&gt; &quot;a&quot;, 2 =&gt; &quot;b&quot;, 3 =&gt; &quot;c&quot; }\n   h.shift   #=&gt; [1, &quot;a&quot;]\n   h         #=&gt; {2=&gt;&quot;b&quot;, 3=&gt;&quot;c&quot;}\n"
full_name: Hash#shift
is_singleton: false
name: shift
params: |
  hsh.shift -> anArray or obj

visibility: public
PK�|[�E��#ri/1.8/system/Hash/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Element Assignment---Associates the value given by <em>value</em> with the key given by <em>key</em>. <em>key</em> should not have its value changed while it is in use as a key (a <tt>String</tt> passed as a key will be duplicated and frozen).
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h[&quot;a&quot;] = 9\n   h[&quot;c&quot;] = 4\n   h   #=&gt; {&quot;a&quot;=&gt;9, &quot;b&quot;=&gt;200, &quot;c&quot;=&gt;4}\n"
full_name: Hash#[]=
is_singleton: false
name: "[]="
params: |
  hsh[key] = value        => value
  hsh.store(key, value)   => value

visibility: public
PK�|[���j22 ri/1.8/system/Hash/%5b%5d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new hash populated with the given objects. Equivalent to the literal <tt>{ <em>key</em>, <em>value</em>, ... }</tt>. Keys and values occur in pairs, so there must be an even number of arguments.
- !ruby/struct:SM::Flow::VERB 
  body: "   Hash[&quot;a&quot;, 100, &quot;b&quot;, 200]       #=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200}\n   Hash[&quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200]   #=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200}\n   { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }     #=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200}\n"
full_name: Hash::[]
is_singleton: true
name: "[]"
params: |
  Hash[ [key =>|, value]* ]   => hash

visibility: public
PK�|[�E���ri/1.8/system/Hash/clear-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes all key-value pairs from <em>hsh</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }   #=&gt; {&quot;a&quot;=&gt;100, &quot;b&quot;=&gt;200}\n   h.clear                          #=&gt; {}\n"
full_name: Hash#clear
is_singleton: false
name: clear
params: |
  hsh.clear -> hsh

visibility: public
PK�|[�
��#ri/1.8/system/Hash/each_pair-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls <em>block</em> once for each key in <em>hsh</em>, passing the key and value as parameters.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h.each_pair {|key, value| puts &quot;#{key} is #{value}&quot; }\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   a is 100\n   b is 200\n"
full_name: Hash#each_pair
is_singleton: false
name: each_pair
params: |
  hsh.each_pair {| key_value_array | block } -> hsh

visibility: public
PK�|[5�f!**&ri/1.8/system/Hash/has_value%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the given value is present for some key in <em>hsh</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h.has_value?(100)   #=&gt; true\n   h.has_value?(999)   #=&gt; false\n"
full_name: Hash#has_value?
is_singleton: false
name: has_value?
params: |
  hsh.has_value?(value)    => true or false
  hsh.value?(value)        => true or false

visibility: public
PK�|[����gg ri/1.8/system/Hash/key%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the given key is present in <em>hsh</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h.has_key?(&quot;a&quot;)   #=&gt; true\n   h.has_key?(&quot;z&quot;)   #=&gt; false\n"
full_name: Hash#key?
is_singleton: false
name: key?
params: |
  hsh.has_key?(key)    => true or false
  hsh.include?(key)    => true or false
  hsh.key?(key)        => true or false
  hsh.member?(key)     => true or false

visibility: public
PK�|[�����ri/1.8/system/Hash/fetch-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns a value from the hash for the given key. If the key can't be found, there are several options: With no other arguments, it will raise an <tt>IndexError</tt> exception; if <em>default</em> is given, then that will be returned; if the optional code block is specified, then that will be run and its result returned."
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h.fetch(&quot;a&quot;)                            #=&gt; 100\n   h.fetch(&quot;z&quot;, &quot;go fish&quot;)                 #=&gt; &quot;go fish&quot;\n   h.fetch(&quot;z&quot;) { |el| &quot;go fish, #{el}&quot;}   #=&gt; &quot;go fish, z&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: The following example shows that an exception is raised if the key is not found and a default value is not supplied.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h.fetch(&quot;z&quot;)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   prog.rb:2:in `fetch': key not found (IndexError)\n    from prog.rb:2\n"
full_name: Hash#fetch
is_singleton: false
name: fetch
params: |
  hsh.fetch(key [, default] )       => obj
  hsh.fetch(key) {| key | block }   => obj

visibility: public
PK�|[ex{�oo$ri/1.8/system/Hash/has_key%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the given key is present in <em>hsh</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   h = { &quot;a&quot; =&gt; 100, &quot;b&quot; =&gt; 200 }\n   h.has_key?(&quot;a&quot;)   #=&gt; true\n   h.has_key?(&quot;z&quot;)   #=&gt; false\n"
full_name: Hash#has_key?
is_singleton: false
name: has_key?
params: |
  hsh.has_key?(key)    => true or false
  hsh.include?(key)    => true or false
  hsh.key?(key)        => true or false
  hsh.member?(key)     => true or false

visibility: public
PK�|[Em�))'ri/1.8/system/Symbol/all_symbols-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array of all the symbols currently in Ruby's symbol table.
- !ruby/struct:SM::Flow::VERB 
  body: "   Symbol.all_symbols.size    #=&gt; 903\n   Symbol.all_symbols[1,20]   #=&gt; [:floor, :ARGV, :Binding, :symlink,\n                                   :chown, :EOFError, :$;, :String,\n                                   :LOCK_SH, :&quot;setuid?&quot;, :$&lt;,\n                                   :default_proc, :compact, :extend,\n                                   :Tms, :getwd, :$=, :ThreadGroup,\n                                   :wait2, :$&gt;]\n"
full_name: Symbol::all_symbols
is_singleton: true
name: all_symbols
params: |
  Symbol.all_symbols    => array

visibility: public
PK�|[j@��� ri/1.8/system/Symbol/to_i-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an integer that is unique for each symbol within a particular execution of a program.
- !ruby/struct:SM::Flow::VERB 
  body: "   :fred.to_i           #=&gt; 9809\n   &quot;fred&quot;.to_sym.to_i   #=&gt; 9809\n"
full_name: Symbol#to_i
is_singleton: false
name: to_i
params: |
  sym.to_i      => fixnum

visibility: public
PK�|[�,�ܪ�#ri/1.8/system/Symbol/to_proc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a <em>Proc</em> object which respond to the given method by <em>sym</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "  (1..3).collect(&amp;:to_s)  #=&gt; [&quot;1&quot;, &quot;2&quot;, &quot;3&quot;]\n"
full_name: Symbol#to_proc
is_singleton: false
name: to_proc
params: |
  sym.to_proc

visibility: public
PK�|[��]��#ri/1.8/system/Symbol/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Symbol#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PK�|[`�湐�#ri/1.8/system/Symbol/id2name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the name or string corresponding to <em>sym</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   :fred.id2name   #=&gt; &quot;fred&quot;\n"
full_name: Symbol#id2name
is_singleton: false
name: id2name
params: |
  sym.id2name   => string
  sym.to_s      => string

visibility: public
PK�|[J��M��$ri/1.8/system/Symbol/yaml_new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Symbol::yaml_new
is_singleton: true
name: yaml_new
params: ( klass, tag, val )
visibility: public
PK�|[q��~~#ri/1.8/system/Symbol/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the representation of <em>sym</em> as a symbol literal.
- !ruby/struct:SM::Flow::VERB 
  body: "   :fred.inspect   #=&gt; &quot;:fred&quot;\n"
full_name: Symbol#inspect
is_singleton: false
name: inspect
params: |
  sym.inspect    => string

visibility: public
PK�|[A�R��"ri/1.8/system/Symbol/to_sym-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: In general, <tt>to_sym</tt> returns the <tt>Symbol</tt> corresponding to an object. As <em>sym</em> is already a symbol, <tt>self</tt> is returned in this case.
full_name: Symbol#to_sym
is_singleton: false
name: to_sym
params: |
  sym.to_sym   => sym

visibility: public
PK�|[0�NN%ri/1.8/system/Symbol/%3d%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equality---At the <tt>Object</tt> level, <tt>==</tt> returns <tt>true</tt> only if <em>obj</em> and <em>other</em> are the same object. Typically, this method is overridden in descendent classes to provide class-specific meaning.
- !ruby/struct:SM::Flow::P 
  body: "Unlike <tt>==</tt>, the <tt>equal?</tt> method should never be overridden by subclasses: it is used to determine object identity (that is, <tt>a.equal?(b)</tt> iff <tt>a</tt> is the same object as <tt>b</tt>)."
- !ruby/struct:SM::Flow::P 
  body: "The <tt>eql?</tt> method returns <tt>true</tt> if <em>obj</em> and <em>anObject</em> have the same value. Used by <tt>Hash</tt> to test members for equality. For objects of class <tt>Object</tt>, <tt>eql?</tt> is synonymous with <tt>==</tt>. Subclasses normally continue this tradition, but there are exceptions. <tt>Numeric</tt> types, for example, perform type conversion across <tt>==</tt>, but not across <tt>eql?</tt>, so:"
- !ruby/struct:SM::Flow::VERB 
  body: "   1 == 1.0     #=&gt; true\n   1.eql? 1.0   #=&gt; false\n"
full_name: Symbol#===
is_singleton: false
name: ===
params: |
  obj == other        => true or false
  obj.equal?(other)   => true or false
  obj.eql?(other)     => true or false

visibility: public
PK�|[Ŏ*��"ri/1.8/system/Symbol/to_int-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: ":nodoc:"
full_name: Symbol#to_int
is_singleton: false
name: to_int
params: ()
visibility: public
PK�|[�4��� ri/1.8/system/Symbol/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the name or string corresponding to <em>sym</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   :fred.id2name   #=&gt; &quot;fred&quot;\n"
full_name: Symbol#to_s
is_singleton: false
name: to_s
params: |
  sym.id2name   => string
  sym.to_s      => string

visibility: public
PK�|[pMGئ�"ri/1.8/system/Symbol/dclone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Symbol#dclone
is_singleton: false
name: dclone
params: ()
visibility: public
PK�|[�6�6��&ri/1.8/system/Symbol/cdesc-Symbol.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: all_symbols
- !ruby/object:RI::MethodSummary 
  name: yaml_new
comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>Symbol</tt> objects represent names and some strings inside the Ruby interpreter. They are generated using the <tt>:name</tt> and <tt>:&quot;string&quot;</tt> literals syntax, and by the various <tt>to_sym</tt> methods. The same <tt>Symbol</tt> object will be created for a given name or string for the duration of a program's execution, regardless of the context or meaning of that name. Thus if <tt>Fred</tt> is a constant in one context, a method in another, and a class in a third, the <tt>Symbol</tt> <tt>:Fred</tt> will be the same object in all three contexts.
- !ruby/struct:SM::Flow::VERB 
  body: "   module One\n     class Fred\n     end\n     $f1 = :Fred\n   end\n   module Two\n     Fred = 1\n     $f2 = :Fred\n   end\n   def Fred()\n   end\n   $f3 = :Fred\n   $f1.id   #=&gt; 2514190\n   $f2.id   #=&gt; 2514190\n   $f3.id   #=&gt; 2514190\n"
constants: []

full_name: Symbol
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ===
- !ruby/object:RI::MethodSummary 
  name: dclone
- !ruby/object:RI::MethodSummary 
  name: id2name
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: to_i
- !ruby/object:RI::MethodSummary 
  name: to_int
- !ruby/object:RI::MethodSummary 
  name: to_proc
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: to_sym
- !ruby/object:RI::MethodSummary 
  name: to_yaml
name: Symbol
superclass: Object
PK�|[��[���4ri/1.8/system/ArgumentError/cdesc-ArgumentError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: ArgumentError
includes: []

instance_methods: []

name: ArgumentError
superclass: StandardError
PK�|[�A# ��!ri/1.8/system/RegOr/%3d%7e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RegOr#=~
is_singleton: false
name: =~
params: (str)
visibility: public
PK�|[c�UU$ri/1.8/system/RegOr/cdesc-RegOr.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: this is just a proof of concept toy.
constants: []

full_name: RegOr
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: =~
name: RegOr
superclass: Object
PK�|[�-<��ri/1.8/system/RegOr/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RegOr::new
is_singleton: true
name: new
params: (re1, re2)
visibility: public
PK�|[��]���%ri/1.8/system/Base64/b64encode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: <em>Prints</em> the Base64 encoded version of <tt>bin</tt> (a <tt>String</tt>) in lines of <tt>len</tt> (default 60) characters.
- !ruby/struct:SM::Flow::VERB 
  body: "   require 'base64'\n   data = &quot;Now is the time for all good coders\\nto learn Ruby&quot;\n   Base64.b64encode(data)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>Generates:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4g\n   UnVieQ==\n"
full_name: Base64#b64encode
is_singleton: false
name: b64encode
params: (bin, len = 60)
visibility: public
PK�|[0�`JJ$ri/1.8/system/Base64/encode64-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the Base64-encoded version of <tt>str</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   require 'base64'\n   Base64.b64encode(&quot;Now is the time for all good coders\\nto learn Ruby&quot;)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>Generates:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4g\n   UnVieQ==\n"
full_name: Base64#encode64
is_singleton: false
name: encode64
params: (bin)
visibility: public
PK�|[��mpp$ri/1.8/system/Base64/decode_b-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Decodes text formatted using a subset of RFC2047 (the one used for mime-encoding mail headers).
- !ruby/struct:SM::Flow::P 
  body: Only supports an encoding type of 'b' (base 64), and only supports the character sets ISO-2022-JP and SHIFT_JIS (so the only two encoded word sequences recognized are <tt>=?ISO-2022-JP?B?...=</tt> and <tt>=?SHIFT_JIS?B?...=</tt>). Recognition of these sequences is case insensitive.
full_name: Base64#decode_b
is_singleton: false
name: decode_b
params: (str)
visibility: public
PK�|[�����$ri/1.8/system/Base64/decode64-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the Base64-decoded version of <tt>str</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'base64'\n  str = 'VGhpcyBpcyBsaW5lIG9uZQpUaGlzIG' +\n        'lzIGxpbmUgdHdvClRoaXMgaXMgbGlu' +\n        'ZSB0aHJlZQpBbmQgc28gb24uLi4K'\n  puts Base64.decode64(str)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>Generates:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   This is line one\n   This is line two\n   This is line three\n   And so on...\n"
full_name: Base64#decode64
is_singleton: false
name: decode64
params: (str)
visibility: public
PK�|[����5ri/1.8/system/Base64/Deprecated/cdesc-Deprecated.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Base64::Deprecated
includes: []

instance_methods: []

name: Deprecated
superclass: 
PK�|[8��OAA&ri/1.8/system/Base64/cdesc-Base64.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The Base64 module provides for the encoding (#encode64) and decoding (#decode64) of binary data using a Base64 representation.
- !ruby/struct:SM::Flow::P 
  body: "The following particular features are also provided:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: encode into lines of a given length (#b64encode)
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: decode the special format specified in RFC2047 for the representation of email headers (decode_b)
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Example
- !ruby/struct:SM::Flow::P 
  body: A simple encoding and decoding.
- !ruby/struct:SM::Flow::VERB 
  body: "    require &quot;base64&quot;\n\n    enc   = Base64.encode64('Send reinforcements')\n                        # -&gt; &quot;U2VuZCByZWluZm9yY2VtZW50cw==\\n&quot;\n    plain = Base64.decode64(enc)\n                        # -&gt; &quot;Send reinforcements&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: The purpose of using base64 to encode data is that it translates any binary data into purely printable characters. It is specified in RFC 2045 (http://www.faqs.org/rfcs/rfc2045.html).
constants: []

full_name: Base64
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: b64encode
- !ruby/object:RI::MethodSummary 
  name: decode64
- !ruby/object:RI::MethodSummary 
  name: decode_b
- !ruby/object:RI::MethodSummary 
  name: encode64
name: Base64
superclass: 
PK�|[������!ri/1.8/system/Open3/popen3-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Open stdin, stdout, and stderr streams and start external executable. Non-block form:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'open3'\n\n  stdin, stdout, stderr = Open3.popen3(cmd)\n"
- !ruby/struct:SM::Flow::P 
  body: "Block form:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'open3'\n\n  Open3.popen3(cmd) { |stdin, stdout, stderr| ... }\n"
- !ruby/struct:SM::Flow::P 
  body: The parameter <tt>cmd</tt> is passed directly to Kernel#exec.
- !ruby/struct:SM::Flow::P 
  body: _popen3_ is like <em>system</em> in that you can pass extra parameters, and the strings won't be mangled by shell expansion.
- !ruby/struct:SM::Flow::VERB 
  body: "  stdin, stdout, stderr = Open3.popen3('identify', '/weird path/with spaces/and &quot;strange&quot; characters.jpg')\n  result = stdout.read\n"
full_name: Open3#popen3
is_singleton: false
name: popen3
params: (*cmd) {|| ...}
visibility: public
PK�|[��FF$ri/1.8/system/Open3/cdesc-Open3.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: "Open3 grants you access to stdin, stdout, and stderr when running another program. Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require &quot;open3&quot;\n  include Open3\n\n  stdin, stdout, stderr = popen3('nroff -man')\n"
- !ruby/struct:SM::Flow::P 
  body: "Open3.popen3 can also take a block which will receive stdin, stdout and stderr as parameters. This ensures stdin, stdout and stderr are closed once the block exits. Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require &quot;open3&quot;\n\n  Open3.popen3('nroff -man') { |stdin, stdout, stderr| ... }\n"
constants: []

full_name: Open3
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: popen3
name: Open3
superclass: 
PK�|[+��(ri/1.8/system/SimpleDelegator/dup-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Duplication support for the object returned by __getobj__.
full_name: SimpleDelegator#dup
is_singleton: false
name: dup
params: ()
visibility: public
PK�|[0Q���8ri/1.8/system/SimpleDelegator/cdesc-SimpleDelegator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A concrete implementation of Delegator, this class provides the means to delegate all supported method calls to the object passed into the constructor and even to change the object being delegated to at a later time with __setobj__ .
constants: []

full_name: SimpleDelegator
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: __getobj__
- !ruby/object:RI::MethodSummary 
  name: __setobj__
- !ruby/object:RI::MethodSummary 
  name: clone
- !ruby/object:RI::MethodSummary 
  name: dup
name: SimpleDelegator
superclass: Delegator
PK�|[�J2H/ri/1.8/system/SimpleDelegator/__getobj__-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the current object method calls are being delegated to.
full_name: SimpleDelegator#__getobj__
is_singleton: false
name: __getobj__
params: ()
visibility: public
PK�|[k6(m(ri/1.8/system/SimpleDelegator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pass in the <em>obj</em> you would like to delegate method calls to.
full_name: SimpleDelegator::new
is_singleton: true
name: new
params: (obj)
visibility: public
PK�|[~W�7*ri/1.8/system/SimpleDelegator/clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Clone support for the object returned by __getobj__.
full_name: SimpleDelegator#clone
is_singleton: false
name: clone
params: ()
visibility: public
PK�|[�$�///ri/1.8/system/SimpleDelegator/__setobj__-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Changes the delegate object to <em>obj</em>.
- !ruby/struct:SM::Flow::P 
  body: It's important to note that this does <b>not</b> cause SimpleDelegator's methods to change. Because of this, you probably only want to change delegation to objects of the same type as the original delegate.
- !ruby/struct:SM::Flow::P 
  body: Here's an example of changing the delegation object.
- !ruby/struct:SM::Flow::VERB 
  body: "  names = SimpleDelegator.new(%w{James Edward Gray II})\n  puts names[1]    # =&gt; Edward\n  names.<em>setobj</em>(%w{Gavin Sinclair})\n  puts names[1]    # =&gt; Sinclair\n"
full_name: SimpleDelegator#__setobj__
is_singleton: false
name: __setobj__
params: (obj)
visibility: public
PK�|[w��d��&ri/1.8/system/Exception/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Exception#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PK�|[�ב=��'ri/1.8/system/Exception/yaml_new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Exception::yaml_new
is_singleton: true
name: yaml_new
params: ( klass, tag, val )
visibility: public
PK�|[��'��,ri/1.8/system/Exception/cdesc-Exception.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: exception
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: yaml_new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: Exception
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: backtrace
- !ruby/object:RI::MethodSummary 
  name: exception
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: message
- !ruby/object:RI::MethodSummary 
  name: set_backtrace
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: to_str
- !ruby/object:RI::MethodSummary 
  name: to_yaml
name: Exception
superclass: Object
PK�|[x�b���%ri/1.8/system/Exception/to_str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the result of invoking <tt>exception.to_s</tt>. Normally this returns the exception's message or name. By supplying a to_str method, exceptions are agreeing to be used where Strings are expected.
full_name: Exception#to_str
is_singleton: false
name: to_str
params: |
  exception.message   =>  string
  exception.to_str    =>  string

visibility: public
PK�|[����&ri/1.8/system/Exception/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return this exception's class name an message
full_name: Exception#inspect
is_singleton: false
name: inspect
params: |
  exception.inspect   => string

visibility: public
PK�|[W#e55"ri/1.8/system/Exception/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Construct a new Exception object, optionally passing in a message.
full_name: Exception::new
is_singleton: true
name: new
params: |
  Exception.new(msg = nil)   =>  exception

visibility: public
PK�|[h�� ��(ri/1.8/system/Exception/exception-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: With no argument, or if the argument is the same as the receiver, return the receiver. Otherwise, create a new exception object of the same class as the receiver, but with a message equal to <tt>string.to_str</tt>.
full_name: Exception#exception
is_singleton: false
name: exception
params: |
  exc.exception(string) -> an_exception or exc

visibility: public
PK�|[d�s���&ri/1.8/system/Exception/message-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the result of invoking <tt>exception.to_s</tt>. Normally this returns the exception's message or name. By supplying a to_str method, exceptions are agreeing to be used where Strings are expected.
full_name: Exception#message
is_singleton: false
name: message
params: |
  exception.message   =>  string
  exception.to_str    =>  string

visibility: public
PK�|[������,ri/1.8/system/Exception/set_backtrace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the backtrace information associated with <em>exc</em>. The argument must be an array of <tt>String</tt> objects in the format described in <tt>Exception#backtrace</tt>.
full_name: Exception#set_backtrace
is_singleton: false
name: set_backtrace
params: |
  exc.set_backtrace(array)   =>  array

visibility: public
PK�|[�3��88#ri/1.8/system/Exception/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns exception's message (or the name of the exception if no message is set).
full_name: Exception#to_s
is_singleton: false
name: to_s
params: |
  exception.to_s   =>  string

visibility: public
PK�|[�]��(ri/1.8/system/Exception/backtrace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns any backtrace associated with the exception. The backtrace is an array of strings, each containing either ``filename:lineNo: in `method''' or ``filename:lineNo.''"
- !ruby/struct:SM::Flow::VERB 
  body: "   def a\n     raise &quot;boom&quot;\n   end\n\n   def b\n     a()\n   end\n\n   begin\n     b()\n   rescue =&gt; detail\n     print detail.backtrace.join(&quot;\\n&quot;)\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   prog.rb:2:in `a'\n   prog.rb:6:in `b'\n   prog.rb:10\n"
full_name: Exception#backtrace
is_singleton: false
name: backtrace
params: |
  exception.backtrace    => array

visibility: public
PK�|[��a���(ri/1.8/system/Exception/exception-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: With no argument, or if the argument is the same as the receiver, return the receiver. Otherwise, create a new exception object of the same class as the receiver, but with a message equal to <tt>string.to_str</tt>.
full_name: Exception::exception
is_singleton: true
name: exception
params: |
  exc.exception(string) -> an_exception or exc

visibility: public
PK�|[�,�v��*ri/1.8/system/TokenStream/pop_token-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: TokenStream#pop_token
is_singleton: false
name: pop_token
params: ()
visibility: public
PK�|[s<z��*ri/1.8/system/TokenStream/add_token-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: TokenStream#add_token
is_singleton: false
name: add_token
params: (tk)
visibility: public
PK�|[X�L.��+ri/1.8/system/TokenStream/add_tokens-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: TokenStream#add_tokens
is_singleton: false
name: add_tokens
params: (tks)
visibility: public
PK�|[�v��PP0ri/1.8/system/TokenStream/cdesc-TokenStream.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: A TokenStream is a list of tokens, gathered during the parse of some entity (say a method). Entities populate these streams by being registered with the lexer. Any class can collect tokens by including TokenStream. From the outside, you use such an object by calling the start_collecting_tokens method, followed by calls to add_token and pop_token
constants: []

full_name: TokenStream
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_token
- !ruby/object:RI::MethodSummary 
  name: add_tokens
- !ruby/object:RI::MethodSummary 
  name: pop_token
- !ruby/object:RI::MethodSummary 
  name: start_collecting_tokens
- !ruby/object:RI::MethodSummary 
  name: token_stream
name: TokenStream
superclass: 
PK�|[�����-ri/1.8/system/TokenStream/token_stream-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: TokenStream#token_stream
is_singleton: false
name: token_stream
params: ()
visibility: public
PK�|[�nkS��8ri/1.8/system/TokenStream/start_collecting_tokens-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: TokenStream#start_collecting_tokens
is_singleton: false
name: start_collecting_tokens
params: ()
visibility: public
PK�|[���118ri/1.8/system/MissingArgument/cdesc-MissingArgument.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Raises when a switch with mandatory argument has no argument.
constants: []

full_name: MissingArgument
includes: []

instance_methods: []

name: MissingArgument
superclass: ParseError
PK�|[�e��  ri/1.8/system/created.ridnu�[���Wed, 26 Jul 2023 13:45:54 +0000
PK�|[@����ri/1.8/system/Queue/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #length"
full_name: Queue#size
is_singleton: false
name: size
params: ()
visibility: public
PK�|[%�)���ri/1.8/system/Queue/deq-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #pop"
full_name: Queue#deq
is_singleton: false
name: deq
params: (non_block=false)
visibility: public
PK�|[/P~��#ri/1.8/system/Queue/empty%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> is the queue is empty.
full_name: Queue#empty?
is_singleton: false
name: empty?
params: ()
visibility: public
PK�|[6e����ri/1.8/system/Queue/enq-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #push"
full_name: Queue#enq
is_singleton: false
name: enq
params: (obj)
visibility: public
PK�|[Ǖ�Z��ri/1.8/system/Queue/pop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: shift
- !ruby/object:RI::AliasName 
  name: deq
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Retrieves data from the queue. If the queue is empty, the calling thread is suspended until data is pushed onto the queue. If <tt>non_block</tt> is true, the thread isn't suspended, and an exception is raised.
full_name: Queue#pop
is_singleton: false
name: pop
params: (non_block=false)
visibility: public
PK�|[͒�C��ri/1.8/system/Queue/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new queue.
full_name: Queue::new
is_singleton: true
name: new
params: ()
visibility: public
PK�|[~@�<<ri/1.8/system/Queue/push-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: "<<"
- !ruby/object:RI::AliasName 
  name: enq
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pushes <tt>obj</tt> to the queue.
full_name: Queue#push
is_singleton: false
name: push
params: (obj)
visibility: public
PK�|[��!ri/1.8/system/Queue/length-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: size
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the length of the queue.
full_name: Queue#length
is_singleton: false
name: length
params: ()
visibility: public
PK�|[X��!��!ri/1.8/system/Queue/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #push"
full_name: Queue#<<
is_singleton: false
name: "<<"
params: (obj)
visibility: public
PK�|[���HH$ri/1.8/system/Queue/cdesc-Queue.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: This class provides a way to synchronize communication between threads.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'thread'\n\n  queue = Queue.new\n\n  producer = Thread.new do\n    5.times do |i|\n      sleep rand(i) # simulate expense\n      queue &lt;&lt; i\n      puts &quot;#{i} produced&quot;\n    end\n  end\n\n  consumer = Thread.new do\n    5.times do |i|\n      value = queue.pop\n      sleep rand(i/2) # simulate expense\n      puts &quot;consumed #{value}&quot;\n    end\n  end\n\n  consumer.join\n"
constants: []

full_name: Queue
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: clear
- !ruby/object:RI::MethodSummary 
  name: deq
- !ruby/object:RI::MethodSummary 
  name: empty?
- !ruby/object:RI::MethodSummary 
  name: enq
- !ruby/object:RI::MethodSummary 
  name: length
- !ruby/object:RI::MethodSummary 
  name: num_waiting
- !ruby/object:RI::MethodSummary 
  name: pop
- !ruby/object:RI::MethodSummary 
  name: push
- !ruby/object:RI::MethodSummary 
  name: shift
- !ruby/object:RI::MethodSummary 
  name: size
name: Queue
superclass: Object
PK�|[�~&�� ri/1.8/system/Queue/shift-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #pop"
full_name: Queue#shift
is_singleton: false
name: shift
params: (non_block=false)
visibility: public
PK�|[#���&ri/1.8/system/Queue/num_waiting-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of threads waiting on the queue.
full_name: Queue#num_waiting
is_singleton: false
name: num_waiting
params: ()
visibility: public
PK�|[�t%��� ri/1.8/system/Queue/clear-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes all objects from the queue.
full_name: Queue#clear
is_singleton: false
name: clear
params: ()
visibility: public
PK�|[����KK(ri/1.8/system/Monitor/cdesc-Monitor.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: "Monitors provide means of mutual exclusion for Thread programming. A critical region is created by means of the synchronize method, which takes a block. The condition variables (created with #new_cond) may be used to control the execution of a monitor with #signal and #wait."
- !ruby/struct:SM::Flow::P 
  body: the Monitor class wraps MonitorMixin, and provides aliases
- !ruby/struct:SM::Flow::VERB 
  body: " alias try_enter try_mon_enter\n alias enter mon_enter\n alias exit mon_exit\n"
- !ruby/struct:SM::Flow::P 
  body: to access its methods more concisely.
constants: []

full_name: Monitor
includes: 
- !ruby/object:RI::IncludedModule 
  name: MonitorMixin
instance_methods: []

name: Monitor
superclass: Object
PK�|[��~���.ri/1.8/system/UNIXServer/cdesc-UNIXServer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Class <tt>Socket</tt> provides access to the underlying operating system socket implementations. It can be used to provide more operating system specific functionality than the protocol-specific socket classes but at the expense of greater complexity. In particular, the class handles addresses using +struct sockaddr+ structures packed into Ruby strings, which can be a joy to manipulate.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Exception Handling
- !ruby/struct:SM::Flow::P 
  body: Ruby's implementation of <tt>Socket</tt> causes an exception to be raised based on the error generated by the system dependent implementation. This is why the methods are documented in a way that isolate Unix-based system exceptions from Windows based exceptions. If more information on particular exception is needed please refer to the Unix manual pages or the Windows WinSock reference.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Documentation by
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Zach Dennis
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Sam Roberts
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <em>Programming Ruby</em> from The Pragmatic Bookshelf.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: Much material in this documentation is taken with permission from <em>Programming Ruby</em> from The Pragmatic Bookshelf.
constants: []

full_name: UNIXServer
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: accept_nonblock
- !ruby/object:RI::MethodSummary 
  name: listen
name: UNIXServer
superclass: UNIXSocket
PK�|[��~�hh/ri/1.8/system/UNIXServer/accept_nonblock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Accepts an incoming connection using accept(2) after O_NONBLOCK is set for the underlying file descriptor. It returns an accepted UNIXSocket for the incoming connection.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "     require 'socket'\n     serv = UNIXServer.new(&quot;/tmp/sock&quot;)\n     begin\n       sock = serv.accept_nonblock\n     rescue Errno::EAGAIN, Errno::EWOULDBLOCK, Errno::ECONNABORTED, Errno::EPROTO, Errno::EINTR\n       IO.select([serv])\n       retry\n     end\n     # sock is an accepted socket.\n"
- !ruby/struct:SM::Flow::P 
  body: Refer to Socket#accept for the exceptions that may be thrown if the call to UNIXServer#accept_nonblock fails.
- !ruby/struct:SM::Flow::P 
  body: UNIXServer#accept_nonblock may raise any error corresponding to accept(2) failure, including Errno::EAGAIN.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: See
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: UNIXServer#accept
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Socket#accept
  type: :BULLET
full_name: UNIXServer#accept_nonblock
is_singleton: false
name: accept_nonblock
params: |
  unixserver.accept_nonblock => unixsocket

visibility: public
PK�|[=��((&ri/1.8/system/UNIXServer/listen-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Listens for connections, using the specified <tt>int</tt> as the backlog. A call to <em>listen</em> only applies if the <tt>socket</tt> is of type SOCK_STREAM or SOCK_SEQPACKET.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameter
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>backlog</tt> - the maximum length of the queue for pending connections.
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example 1
- !ruby/struct:SM::Flow::VERB 
  body: "     require 'socket'\n     include Socket::Constants\n     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )\n     sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )\n     socket.bind( sockaddr )\n     socket.listen( 5 )\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: "Example 2 (listening on an arbitary port, unix-based systems only):"
- !ruby/struct:SM::Flow::VERB 
  body: "     require 'socket'\n     include Socket::Constants\n     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )\n     socket.listen( 1 )\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Unix-based Exceptions
- !ruby/struct:SM::Flow::P 
  body: On unix based systems the above will work because a new <tt>sockaddr</tt> struct is created on the address ADDR_ANY, for an arbitrary port number as handed off by the kernel. It will not work on Windows, because Windows requires that the <tt>socket</tt> is bound by calling <em>bind</em> before it can <em>listen</em>.
- !ruby/struct:SM::Flow::P 
  body: If the <em>backlog</em> amount exceeds the implementation-dependent maximum queue length, the implementation's maximum queue length will be used.
- !ruby/struct:SM::Flow::P 
  body: "On unix-based based systems the following system exceptions may be raised if the call to <em>listen</em> fails:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EBADF - the <em>socket</em> argument is not a valid file descriptor
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EDESTADDRREQ - the <em>socket</em> is not bound to a local address, and the protocol does not support listening on an unbound socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINVAL - the <em>socket</em> is already connected
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOTSOCK - the <em>socket</em> argument does not refer to a socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EOPNOTSUPP - the <em>socket</em> protocol does not support listen
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EACCES - the calling process does not have approriate privileges
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINVAL - the <em>socket</em> has been shut down
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOBUFS - insufficient resources are available in the system to complete the call
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Windows Exceptions
- !ruby/struct:SM::Flow::P 
  body: "On Windows systems the following system exceptions may be raised if the call to <em>listen</em> fails:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENETDOWN - the network is down
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EADDRINUSE - the socket's local address is already in use. This usually occurs during the execution of <em>bind</em> but could be delayed if the call to <em>bind</em> was to a partially wildcard address (involving ADDR_ANY) and if a specific address needs to be commmitted at the time of the call to <em>listen</em>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINPROGRESS - a Windows Sockets 1.1 call is in progress or the service provider is still processing a callback function
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINVAL - the <tt>socket</tt> has not been bound with a call to <em>bind</em>.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EISCONN - the <tt>socket</tt> is already connected
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EMFILE - no more socket descriptors are available
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOBUFS - no buffer space is available
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOTSOC - <tt>socket</tt> is not a socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EOPNOTSUPP - the referenced <tt>socket</tt> is not a type that supports the <em>listen</em> method
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: See
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: listen manual pages on unix-based systems
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: listen function in Microsoft's Winsock functions reference
  type: :BULLET
full_name: UNIXServer#listen
is_singleton: false
name: listen
params: |
  socket.listen( int ) => 0

visibility: public
PK�|[����"ri/1.8/system/PStore/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Retrieves a value from the PStore file data, by <em>name</em>. The hierarchy of Ruby objects stored under that root <em>name</em> will be returned.
- !ruby/struct:SM::Flow::P 
  body: "<b>WARNING</b>: This method is only valid in a PStore#transaction. It will raise PStore::Error if called at any other time."
full_name: PStore#[]
is_singleton: false
name: "[]"
params: (name)
visibility: public
PK�|[�����!ri/1.8/system/PStore/abort-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Ends the current PStore#transaction, discarding any changes to the data store.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: " require &quot;pstore&quot;\n\n store = PStore.new(&quot;data_file.pstore&quot;)\n store.transaction do  # begin transaction\n   store[:one] = 1     # this change is not applied, see below...\n   store[:two] = 2     # this change is not applied, see below...\n\n   store.abort         # end transaction here, discard all changes\n\n   store[:three] = 3   # this change is never reached\n end\n"
- !ruby/struct:SM::Flow::P 
  body: "<b>WARNING</b>: This method is only valid in a PStore#transaction. It will raise PStore::Error if called at any other time."
full_name: PStore#abort
is_singleton: false
name: abort
params: ()
visibility: public
PK�|[M��""&ri/1.8/system/PStore/cdesc-PStore.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: PStore implements a file based persistence mechanism based on a Hash. User code can store hierarchies of Ruby objects (values) into the data store file by name (keys). An object hierarchy may be just a single object. User code may later read values back from the data store or even update data, as needed.
- !ruby/struct:SM::Flow::P 
  body: The transactional behavior ensures that any changes succeed or fail together. This can be used to ensure that the data store is not left in a transitory state, where some values were updated but others were not.
- !ruby/struct:SM::Flow::P 
  body: Behind the scenes, Ruby objects are stored to the data store file with Marshal. That carries the usual limitations. Proc objects cannot be marshalled, for example.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: "Usage example:"
- !ruby/struct:SM::Flow::VERB 
  body: " require &quot;pstore&quot;\n\n # a mock wiki object...\n class WikiPage\n   def initialize( page_name, author, contents )\n     @page_name = page_name\n     @revisions = Array.new\n\n     add_revision(author, contents)\n   end\n\n   attr_reader :page_name\n\n   def add_revision( author, contents )\n     @revisions &lt;&lt; { :created  =&gt; Time.now,\n                     :author   =&gt; author,\n                     :contents =&gt; contents }\n   end\n\n   def wiki_page_references\n     [@page_name] + @revisions.last[:contents].scan(/\\b(?:[A-Z]+[a-z]+){2,}/)\n   end\n\n   # ...\n end\n\n # create a new page...\n home_page = WikiPage.new( &quot;HomePage&quot;, &quot;James Edward Gray II&quot;,\n                           &quot;A page about the JoysOfDocumentation...&quot; )\n\n # then we want to update page data and the index together, or not at all...\n wiki = PStore.new(&quot;wiki_pages.pstore&quot;)\n wiki.transaction do  # begin transaction; do all of this or none of it\n   # store page...\n   wiki[home_page.page_name] = home_page\n   # ensure that an index has been created...\n   wiki[:wiki_index] ||= Array.new\n   # update wiki index...\n   wiki[:wiki_index].push(*home_page.wiki_page_references)\n end                   # commit changes to wiki data store file\n\n ### Some time later... ###\n\n # read wiki data...\n wiki.transaction(true) do  # begin read-only transaction, no changes allowed\n   wiki.roots.each do |data_root_name|\n     p data_root_name\n     p wiki[data_root_name]\n   end\n end\n"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: RDWR_ACCESS
  value: File::RDWR | File::CREAT | binmode
- !ruby/object:RI::Constant 
  comment: 
  name: RD_ACCESS
  value: File::RDONLY | binmode
- !ruby/object:RI::Constant 
  comment: 
  name: WR_ACCESS
  value: File::WRONLY | File::CREAT | File::TRUNC | binmode
full_name: PStore
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: abort
- !ruby/object:RI::MethodSummary 
  name: commit
- !ruby/object:RI::MethodSummary 
  name: commit_new
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: fetch
- !ruby/object:RI::MethodSummary 
  name: in_transaction
- !ruby/object:RI::MethodSummary 
  name: in_transaction_wr
- !ruby/object:RI::MethodSummary 
  name: path
- !ruby/object:RI::MethodSummary 
  name: root?
- !ruby/object:RI::MethodSummary 
  name: roots
- !ruby/object:RI::MethodSummary 
  name: transaction
name: PStore
superclass: Object
PK�|[*x�Z�� ri/1.8/system/PStore/path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the path to the data store file.
full_name: PStore#path
is_singleton: false
name: path
params: ()
visibility: public
PK�|[co�+ri/1.8/system/PStore/Error/cdesc-Error.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The error type thrown by all PStore methods.
constants: []

full_name: PStore::Error
includes: []

instance_methods: []

name: Error
superclass: StandardError
PK�|[6�����"ri/1.8/system/PStore/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes an object hierarchy from the data store, by <em>name</em>.
- !ruby/struct:SM::Flow::P 
  body: "<b>WARNING</b>: This method is only valid in a PStore#transaction and it cannot be read-only. It will raise PStore::Error if called at any other time."
full_name: PStore#delete
is_singleton: false
name: delete
params: (name)
visibility: public
PK�|[:⑴��!ri/1.8/system/PStore/roots-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the names of all object hierarchies currently in the store.
- !ruby/struct:SM::Flow::P 
  body: "<b>WARNING</b>: This method is only valid in a PStore#transaction. It will raise PStore::Error if called at any other time."
full_name: PStore#roots
is_singleton: false
name: roots
params: ()
visibility: public
PK�|[-x11ri/1.8/system/PStore/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: To construct a PStore object, pass in the <em>file</em> path where you would like the data to be stored.
full_name: PStore::new
is_singleton: true
name: new
params: (file)
visibility: public
PK�|[�*��^^-ri/1.8/system/PStore/in_transaction_wr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Raises PStore::Error if the calling code is not in a PStore#transaction or if the code is in a read-only PStore#transaction.
full_name: PStore#in_transaction_wr
is_singleton: false
name: in_transaction_wr
params: ()
visibility: private
PK�|[w�f��&ri/1.8/system/PStore/commit_new-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Commits changes to the data store file.
full_name: PStore#commit_new
is_singleton: false
name: commit_new
params: (f)
visibility: private
PK�|[B|��$$*ri/1.8/system/PStore/in_transaction-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Raises PStore::Error if the calling code is not in a PStore#transaction.
full_name: PStore#in_transaction
is_singleton: false
name: in_transaction
params: ()
visibility: private
PK�|[~i�||"ri/1.8/system/PStore/commit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Ends the current PStore#transaction, committing any changes to the data store immediately.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: " require &quot;pstore&quot;\n\n store = PStore.new(&quot;data_file.pstore&quot;)\n store.transaction do  # begin transaction\n   # load some data into the store...\n   store[:one] = 1\n   store[:two] = 2\n\n   store.commit        # end transaction here, committing changes\n\n   store[:three] = 3   # this change is never reached\n end\n"
- !ruby/struct:SM::Flow::P 
  body: "<b>WARNING</b>: This method is only valid in a PStore#transaction. It will raise PStore::Error if called at any other time."
full_name: PStore#commit
is_singleton: false
name: commit
params: ()
visibility: public
PK�|[z�����%ri/1.8/system/PStore/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Stores an individual Ruby object or a hierarchy of Ruby objects in the data store file under the root <em>name</em>. Assigning to a <em>name</em> already in the data store clobbers the old data.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: " require &quot;pstore&quot;\n\n store = PStore.new(&quot;data_file.pstore&quot;)\n store.transaction do  # begin transaction\n   # load some data into the store...\n   store[:single_object] = &quot;My data...&quot;\n   store[:obj_heirarchy] = { &quot;Kev Jackson&quot; =&gt; [&quot;rational.rb&quot;, &quot;pstore.rb&quot;],\n                             &quot;James Gray&quot;  =&gt; [&quot;erb.rb&quot;, &quot;pstore.rb&quot;] }\n end                   # commit changes to data store file\n"
- !ruby/struct:SM::Flow::P 
  body: "<b>WARNING</b>: This method is only valid in a PStore#transaction and it cannot be read-only. It will raise PStore::Error if called at any other time."
full_name: PStore#[]=
is_singleton: false
name: "[]="
params: (name, value)
visibility: public
PK�|[r��й�#ri/1.8/system/PStore/root%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the supplied <em>name</em> is currently in the data store.
- !ruby/struct:SM::Flow::P 
  body: "<b>WARNING</b>: This method is only valid in a PStore#transaction. It will raise PStore::Error if called at any other time."
full_name: PStore#root?
is_singleton: false
name: root?
params: (name)
visibility: public
PK�|[c�%%'ri/1.8/system/PStore/transaction-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: pstore
comment: 
- !ruby/struct:SM::Flow::P 
  body: Opens a new transaction for the data store. Code executed inside a block passed to this method may read and write data to and from the data store file.
- !ruby/struct:SM::Flow::P 
  body: At the end of the block, changes are committed to the data store automatically. You may exit the transaction early with a call to either PStore#commit or PStore#abort. See those methods for details about how changes are handled. Raising an uncaught Exception in the block is equivalent to calling PStore#abort.
- !ruby/struct:SM::Flow::P 
  body: If <em>read_only</em> is set to <tt>true</tt>, you will only be allowed to read from the data store during the transaction and any attempts to change the data will raise a PStore::Error.
- !ruby/struct:SM::Flow::P 
  body: Note that PStore does not support nested transactions.
full_name: PStore#transaction
is_singleton: false
name: transaction
params: (read_only=false) {|pstore| ...}
visibility: public
PK�|[V ����!ri/1.8/system/PStore/fetch-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: This method is just like PStore#[], save that you may also provide a <em>default</em> value for the object. In the event the specified <em>name</em> is not found in the data store, your <em>default</em> will be returned instead. If you do not specify a default, PStore::Error will be raised if the object is not found.
- !ruby/struct:SM::Flow::P 
  body: "<b>WARNING</b>: This method is only valid in a PStore#transaction. It will raise PStore::Error if called at any other time."
full_name: PStore#fetch
is_singleton: false
name: fetch
params: (name, default=PStore::Error)
visibility: public
PK�|[1� 8ri/1.8/system/SystemCallError/cdesc-SystemCallError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: ===
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: SystemCallError
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: errno
name: SystemCallError
superclass: StandardError
PK�|[��##*ri/1.8/system/SystemCallError/errno-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return this SystemCallError's error number.
full_name: SystemCallError#errno
is_singleton: false
name: errno
params: |
  system_call_error.errno   => fixnum

visibility: public
PK�|[�+`(ri/1.8/system/SystemCallError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: If <em>errno</em> corresponds to a known system error code, constructs the appropriate <tt>Errno</tt> class for that error, otherwise constructs a generic <tt>SystemCallError</tt> object. The error number is subsequently available via the <tt>errno</tt> method.
full_name: SystemCallError::new
is_singleton: true
name: new
params: |
  SystemCallError.new(msg, errno)  => system_call_error_subclass

visibility: public
PK�|[�PDo��.ri/1.8/system/SystemCallError/%3d%3d%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return <tt>true</tt> if the receiver is a generic <tt>SystemCallError</tt>, or if the error numbers <em>self</em> and <em>other</em> are the same.
full_name: SystemCallError::===
is_singleton: true
name: ===
params: |
  system_call_error === other  => true or false

visibility: public
PK�|[��
5~~.ri/1.8/system/RangeError/cdesc-RangeError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: RangeError
includes: []

instance_methods: []

name: RangeError
superclass: StandardError
PK�|[b�z��>ri/1.8/system/ExceptionForMatrix/cdesc-ExceptionForMatrix.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: ExceptionForMatrix
includes: []

instance_methods: []

name: ExceptionForMatrix
superclass: 
PK�|[&���4ri/1.8/system/StopIteration/cdesc-StopIteration.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: "call-seq:"
- !ruby/struct:SM::Flow::VERB 
  body: "  e.rewind   =&gt; e\n"
- !ruby/struct:SM::Flow::P 
  body: Rewinds the enumeration sequence by the next method.
constants: []

full_name: StopIteration
includes: []

instance_methods: []

name: StopIteration
superclass: IndexError
PK�|[��ܓ$ri/1.8/system/Net/FTP/connect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Establishes an FTP connection to host, optionally overriding the default port. If the environment variable <tt>SOCKS_SERVER</tt> is set, sets up the connection through a SOCKS proxy. Raises an exception (typically <tt>Errno::ECONNREFUSED</tt>) if the connection cannot be established.
full_name: Net::FTP#connect
is_singleton: false
name: connect
params: (host, port = FTP_PORT)
visibility: public
PK�|[l1B̯�$ri/1.8/system/Net/FTP/putline-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::FTP#putline
is_singleton: false
name: putline
params: (line)
visibility: private
PK�|[�+�K��#ri/1.8/system/Net/FTP/system-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns system information.
full_name: Net::FTP#system
is_singleton: false
name: system
params: ()
visibility: public
PK�|[&���!ri/1.8/system/Net/FTP/site-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Issues a SITE command.
full_name: Net::FTP#site
is_singleton: false
name: site
params: (arg)
visibility: public
PK�|[bf�00'ri/1.8/system/Net/FTP/storbinary-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: data
comment: 
- !ruby/struct:SM::Flow::P 
  body: Puts the connection into binary (image) mode, issues the given server-side command (such as &quot;STOR myfile&quot;), and sends the contents of the file named <tt>file</tt> to the server. If the optional block is given, it also passes it the data, in chunks of <tt>blocksize</tt> characters.
full_name: Net::FTP#storbinary
is_singleton: false
name: storbinary
params: (cmd, file, blocksize, rest_offset = nil) {|data| ...}
visibility: public
PK�|[ďU!ri/1.8/system/Net/FTP/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the size of the given (remote) filename.
full_name: Net::FTP#size
is_singleton: false
name: size
params: (filename)
visibility: public
PK�|[K�+���!ri/1.8/system/Net/FTP/mdtm-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Issues the MDTM command. TODO: more info."
full_name: Net::FTP#mdtm
is_singleton: false
name: mdtm
params: (filename)
visibility: public
PK�|[(�N~��%ri/1.8/system/Net/FTP/sendport-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::FTP#sendport
is_singleton: false
name: sendport
params: (host, port)
visibility: private
PK�|[��jX��%ri/1.8/system/Net/FTP/voidresp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::FTP#voidresp
is_singleton: false
name: voidresp
params: ()
visibility: private
PK�|[(}lZ��!ri/1.8/system/Net/FTP/help-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Issues the HELP command.
full_name: Net::FTP#help
is_singleton: false
name: help
params: (arg = nil)
visibility: public
PK�|[.0���&ri/1.8/system/Net/FTP/storlines-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: line
comment: 
- !ruby/struct:SM::Flow::P 
  body: Puts the connection into ASCII (text) mode, issues the given server-side command (such as &quot;STOR myfile&quot;), and sends the contents of the file named <tt>file</tt> to the server, one line at a time. If the optional block is given, it also passes it the lines.
full_name: Net::FTP#storlines
is_singleton: false
name: storlines
params: (cmd, file) {|line| ...}
visibility: public
PK�|[.V����"ri/1.8/system/Net/FTP/rmdir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes a remote directory.
full_name: Net::FTP#rmdir
is_singleton: false
name: rmdir
params: (dirname)
visibility: public
PK�|[�����"ri/1.8/system/Net/FTP/abort-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Aborts the previous command (ABOR command).
full_name: Net::FTP#abort
is_singleton: false
name: abort
params: ()
visibility: public
PK�|[y_�$��%ri/1.8/system/Net/FTP/makepasv-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::FTP#makepasv
is_singleton: false
name: makepasv
params: ()
visibility: private
PK�|[ُ�S��%ri/1.8/system/Net/FTP/parse229-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::FTP#parse229
is_singleton: false
name: parse229
params: (resp)
visibility: private
PK�|[����!ri/1.8/system/Net/FTP/quit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Exits the FTP session.
full_name: Net::FTP#quit
is_singleton: false
name: quit
params: ()
visibility: public
PK�|[P����#ri/1.8/system/Net/FTP/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes a file on the server.
full_name: Net::FTP#delete
is_singleton: false
name: delete
params: (filename)
visibility: public
PK�|[�6^��%ri/1.8/system/Net/FTP/parse227-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::FTP#parse227
is_singleton: false
name: parse227
params: (resp)
visibility: private
PK�|[�X�W��'ri/1.8/system/Net/FTP/getaddress-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::FTP#getaddress
is_singleton: false
name: getaddress
params: ()
visibility: private
PK�|[i�X2��(ri/1.8/system/Net/FTP/puttextfile-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: line
comment: 
- !ruby/struct:SM::Flow::P 
  body: Transfers <tt>localfile</tt> to the server in ASCII (text) mode, storing the result in <tt>remotefile</tt>. If callback or an associated block is supplied, calls it, passing in the transmitted data one line at a time.
full_name: Net::FTP#puttextfile
is_singleton: false
name: puttextfile
params: (localfile, remotefile = File.basename(localfile)) {|line| ...}
visibility: public
PK�|[������#ri/1.8/system/Net/FTP/getdir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #pwd"
full_name: Net::FTP#getdir
is_singleton: false
name: getdir
params: ()
visibility: public
PK�|[{:x���#ri/1.8/system/Net/FTP/rename-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Renames a file on the server.
full_name: Net::FTP#rename
is_singleton: false
name: rename
params: (fromname, toname)
visibility: public
PK�|[�^%��ri/1.8/system/Net/FTP/ls-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #list"
full_name: Net::FTP#ls
is_singleton: false
name: ls
params: (*args)
visibility: public
PK�|[�`���(ri/1.8/system/Net/FTP/transfercmd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::FTP#transfercmd
is_singleton: false
name: transfercmd
params: (cmd, rest_offset = nil)
visibility: private
PK�|[��<[��&ri/1.8/system/Net/FTP/retrlines-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: line
comment: 
- !ruby/struct:SM::Flow::P 
  body: Puts the connection into ASCII (text) mode, issues the given command, and passes the resulting data, one line at a time, to the associated block. If no block is given, prints the lines. Note that <tt>cmd</tt> is a server command (such as &quot;RETR myfile&quot;).
full_name: Net::FTP#retrlines
is_singleton: false
name: retrlines
params: (cmd) {|line| ...}
visibility: public
PK�|[�H����!ri/1.8/system/Net/FTP/noop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Issues a NOOP command.
full_name: Net::FTP#noop
is_singleton: false
name: noop
params: ()
visibility: public
PK�|[G�ޭ�%ri/1.8/system/Net/FTP/makeport-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::FTP#makeport
is_singleton: false
name: makeport
params: ()
visibility: private
PK�|[��C0��!ri/1.8/system/Net/FTP/acct-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Sends the ACCT command. TODO: more info."
full_name: Net::FTP#acct
is_singleton: false
name: acct
params: (account)
visibility: public
PK�|[DѤ�� ri/1.8/system/Net/FTP/get-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: data
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Retrieves <tt>remotefile</tt> in whatever mode the session is set (text or binary). See #gettextfile and #getbinaryfile."
full_name: Net::FTP#get
is_singleton: false
name: get
params: (remotefile, localfile = File.basename(remotefile), blocksize = DEFAULT_BLOCKSIZE) {|data| ...}
visibility: public
PK�|[��w6'ri/1.8/system/Net/FTP/set_socket-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: WRITEME or make private
full_name: Net::FTP#set_socket
is_singleton: false
name: set_socket
params: (sock, get_greeting = true)
visibility: public
PK�|[={'��"ri/1.8/system/Net/FTP/mkdir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a remote directory.
full_name: Net::FTP#mkdir
is_singleton: false
name: mkdir
params: (dirname)
visibility: public
PK�|[�6�� ri/1.8/system/Net/FTP/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Creates and returns a new <tt>FTP</tt> object. If a <tt>host</tt> is given, a connection is made. Additionally, if the <tt>user</tt> is given, the given user name, password, and (optionally) account are used to log in. See #login."
full_name: Net::FTP::new
is_singleton: true
name: new
params: (host = nil, user = nil, passwd = nil, acct = nil)
visibility: public
PK�|[�m�

'ri/1.8/system/Net/FTP/retrbinary-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: data
comment: 
- !ruby/struct:SM::Flow::P 
  body: Puts the connection into binary (image) mode, issues the given command, and fetches the data returned, passing it to the associated block in chunks of <tt>blocksize</tt> characters. Note that <tt>cmd</tt> is a server command (such as &quot;RETR myfile&quot;).
full_name: Net::FTP#retrbinary
is_singleton: false
name: retrbinary
params: (cmd, blocksize, rest_offset = nil) {|data| ...}
visibility: public
PK�|[�LC�yy"ri/1.8/system/Net/FTP/mtime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the last modification time of the (remote) file. If <tt>local</tt> is <tt>true</tt>, it is returned as a local time, otherwise it's a UTC time.
full_name: Net::FTP#mtime
is_singleton: false
name: mtime
params: (filename, local = false)
visibility: public
PK�|[���*ri/1.8/system/Net/FTP/putbinaryfile-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: data
comment: 
- !ruby/struct:SM::Flow::P 
  body: Transfers <tt>localfile</tt> to the server in binary mode, storing the result in <tt>remotefile</tt>. If a block is supplied, calls it, passing in the transmitted data in <tt>blocksize</tt> chunks.
full_name: Net::FTP#putbinaryfile
is_singleton: false
name: putbinaryfile
params: (localfile, remotefile = File.basename(localfile), blocksize = DEFAULT_BLOCKSIZE) {|data| ...}
visibility: public
PK�|[����#ri/1.8/system/Net/FTP/status-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the status (STAT command).
full_name: Net::FTP#status
is_singleton: false
name: status
params: ()
visibility: public
PK�|[���&ri/1.8/system/Net/FTP/closed%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> iff the connection is closed.
full_name: Net::FTP#closed?
is_singleton: false
name: closed?
params: ()
visibility: public
PK�|[N�X^��%ri/1.8/system/Net/FTP/sanitize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::FTP#sanitize
is_singleton: false
name: sanitize
params: (s)
visibility: private
PK�|[�s���+ri/1.8/system/Net/FTP/return_code%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Obsolete
full_name: Net::FTP#return_code=
is_singleton: false
name: return_code=
params: (s)
visibility: public
PK�|[�;� ri/1.8/system/Net/FTP/pwd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: getdir
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the current remote directory.
full_name: Net::FTP#pwd
is_singleton: false
name: pwd
params: ()
visibility: public
PK�|[�4����(ri/1.8/system/Net/FTP/return_code-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Obsolete
full_name: Net::FTP#return_code
is_singleton: false
name: return_code
params: ()
visibility: public
PK�|[�%��"ri/1.8/system/Net/FTP/login-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Logs in to the remote host. The session must have been previously connected. If <tt>user</tt> is the string &quot;anonymous&quot; and the <tt>password</tt> is <tt>nil</tt>, a password of <tt>user@host</tt> is synthesized. If the <tt>acct</tt> parameter is not <tt>nil</tt>, an FTP ACCT command is sent following the successful login. Raises an exception on error (typically <tt>Net::FTPPermError</tt>).
full_name: Net::FTP#login
is_singleton: false
name: login
params: (user = "anonymous", passwd = nil, acct = nil)
visibility: public
PK�|[��ڀ�� ri/1.8/system/Net/FTP/dir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #list"
full_name: Net::FTP#dir
is_singleton: false
name: dir
params: (*args)
visibility: public
PK�|[��,$ri/1.8/system/Net/FTP/voidcmd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a command and expect a response beginning with '2'.
full_name: Net::FTP#voidcmd
is_singleton: false
name: voidcmd
params: (cmd)
visibility: public
PK�|[-�����(ri/1.8/system/Net/FTP/gettextfile-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: line
comment: 
- !ruby/struct:SM::Flow::P 
  body: Retrieves <tt>remotefile</tt> in ASCII (text) mode, storing the result in <tt>localfile</tt>. If a block is supplied, it is passed the retrieved data one line at a time.
full_name: Net::FTP#gettextfile
is_singleton: false
name: gettextfile
params: (remotefile, localfile = File.basename(remotefile)) {|line| ...}
visibility: public
PK�|[R�}��%ri/1.8/system/Net/FTP/parse228-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::FTP#parse228
is_singleton: false
name: parse228
params: (resp)
visibility: private
PK�|[�y�C�� ri/1.8/system/Net/FTP/put-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Transfers <tt>localfile</tt> to the server in whatever mode the session is set (text or binary). See #puttextfile and #putbinaryfile."
full_name: Net::FTP#put
is_singleton: false
name: put
params: (localfile, remotefile = File.basename(localfile), blocksize = DEFAULT_BLOCKSIZE, &block)
visibility: public
PK�|[~��44"ri/1.8/system/Net/FTP/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Closes the connection. Further operations are impossible until you open a new connection with #connect."
full_name: Net::FTP#close
is_singleton: false
name: close
params: ()
visibility: public
PK�|[%܏l��$ri/1.8/system/Net/FTP/sendcmd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a command and returns the response.
full_name: Net::FTP#sendcmd
is_singleton: false
name: sendcmd
params: (cmd)
visibility: public
PK�|[ƠM���)ri/1.8/system/Net/FTP/getmultiline-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::FTP#getmultiline
is_singleton: false
name: getmultiline
params: ()
visibility: private
PK�|[��/���"ri/1.8/system/Net/FTP/chdir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Changes the (remote) directory.
full_name: Net::FTP#chdir
is_singleton: false
name: chdir
params: (dirname)
visibility: public
PK�|[lzë�$ri/1.8/system/Net/FTP/getline-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::FTP#getline
is_singleton: false
name: getline
params: ()
visibility: private
PK�|[�0����$ri/1.8/system/Net/FTP/cdesc-FTP.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "When <tt>true</tt>, transfers are performed in binary mode. Default: <tt>true</tt>."
  name: binary
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "When <tt>true</tt>, all traffic to and from the server is written to +$stdout+. Default: <tt>false</tt>."
  name: debug_mode
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The server's last response.
  name: last_response
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The server's last response code.
  name: last_response_code
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "When <tt>true</tt>, the connection is in passive mode. Default: <tt>false</tt>."
  name: passive
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "Sets or retrieves the <tt>resume</tt> status, which decides whether incomplete transfers are resumed or restarted. Default: <tt>false</tt>."
  name: resume
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The server's welcome message.
  name: welcome
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: open
comment: 
- !ruby/struct:SM::Flow::P 
  body: This class implements the File Transfer Protocol. If you have used a command-line FTP program, and are familiar with the commands, you will be able to use this class easily. Some extra features are included to take advantage of Ruby's style and strengths.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'net/ftp'\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example 1
- !ruby/struct:SM::Flow::VERB 
  body: "  ftp = Net::FTP.new('ftp.netlab.co.jp')\n  ftp.login\n  files = ftp.chdir('pub/lang/ruby/contrib')\n  files = ftp.list('n*')\n  ftp.getbinaryfile('nif.rb-0.91.gz', 'nif.gz', 1024)\n  ftp.close\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example 2
- !ruby/struct:SM::Flow::VERB 
  body: "  Net::FTP.open('ftp.netlab.co.jp') do |ftp|\n    ftp.login\n    files = ftp.chdir('pub/lang/ruby/contrib')\n    files = ftp.list('n*')\n    ftp.getbinaryfile('nif.rb-0.91.gz', 'nif.gz', 1024)\n  end\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Major Methods
- !ruby/struct:SM::Flow::P 
  body: "The following are the methods most likely to be useful to users:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: FTP.open
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#getbinaryfile"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#gettextfile"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#putbinaryfile"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#puttextfile"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#chdir"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#nlst"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#size"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#rename"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#delete"
  type: :BULLET
constants: []

full_name: Net::FTP
includes: 
- !ruby/object:RI::IncludedModule 
  name: MonitorMixin
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: abort
- !ruby/object:RI::MethodSummary 
  name: acct
- !ruby/object:RI::MethodSummary 
  name: chdir
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: closed?
- !ruby/object:RI::MethodSummary 
  name: connect
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: dir
- !ruby/object:RI::MethodSummary 
  name: get
- !ruby/object:RI::MethodSummary 
  name: getaddress
- !ruby/object:RI::MethodSummary 
  name: getbinaryfile
- !ruby/object:RI::MethodSummary 
  name: getdir
- !ruby/object:RI::MethodSummary 
  name: getline
- !ruby/object:RI::MethodSummary 
  name: getmultiline
- !ruby/object:RI::MethodSummary 
  name: getresp
- !ruby/object:RI::MethodSummary 
  name: gettextfile
- !ruby/object:RI::MethodSummary 
  name: help
- !ruby/object:RI::MethodSummary 
  name: list
- !ruby/object:RI::MethodSummary 
  name: login
- !ruby/object:RI::MethodSummary 
  name: ls
- !ruby/object:RI::MethodSummary 
  name: makepasv
- !ruby/object:RI::MethodSummary 
  name: makeport
- !ruby/object:RI::MethodSummary 
  name: mdtm
- !ruby/object:RI::MethodSummary 
  name: mkdir
- !ruby/object:RI::MethodSummary 
  name: mtime
- !ruby/object:RI::MethodSummary 
  name: nlst
- !ruby/object:RI::MethodSummary 
  name: noop
- !ruby/object:RI::MethodSummary 
  name: open_socket
- !ruby/object:RI::MethodSummary 
  name: parse227
- !ruby/object:RI::MethodSummary 
  name: parse228
- !ruby/object:RI::MethodSummary 
  name: parse229
- !ruby/object:RI::MethodSummary 
  name: parse257
- !ruby/object:RI::MethodSummary 
  name: put
- !ruby/object:RI::MethodSummary 
  name: putbinaryfile
- !ruby/object:RI::MethodSummary 
  name: putline
- !ruby/object:RI::MethodSummary 
  name: puttextfile
- !ruby/object:RI::MethodSummary 
  name: pwd
- !ruby/object:RI::MethodSummary 
  name: quit
- !ruby/object:RI::MethodSummary 
  name: rename
- !ruby/object:RI::MethodSummary 
  name: retrbinary
- !ruby/object:RI::MethodSummary 
  name: retrlines
- !ruby/object:RI::MethodSummary 
  name: return_code
- !ruby/object:RI::MethodSummary 
  name: return_code=
- !ruby/object:RI::MethodSummary 
  name: rmdir
- !ruby/object:RI::MethodSummary 
  name: sanitize
- !ruby/object:RI::MethodSummary 
  name: sendcmd
- !ruby/object:RI::MethodSummary 
  name: sendport
- !ruby/object:RI::MethodSummary 
  name: set_socket
- !ruby/object:RI::MethodSummary 
  name: site
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: status
- !ruby/object:RI::MethodSummary 
  name: storbinary
- !ruby/object:RI::MethodSummary 
  name: storlines
- !ruby/object:RI::MethodSummary 
  name: system
- !ruby/object:RI::MethodSummary 
  name: transfercmd
- !ruby/object:RI::MethodSummary 
  name: voidcmd
- !ruby/object:RI::MethodSummary 
  name: voidresp
name: FTP
superclass: Object
PK�|[1��}��$ri/1.8/system/Net/FTP/getresp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::FTP#getresp
is_singleton: false
name: getresp
params: ()
visibility: private
PK�|[��_��!ri/1.8/system/Net/FTP/list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: ls
- !ruby/object:RI::AliasName 
  name: dir
block_params: line
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array of file information in the directory (the output is like `ls -l`). If a block is given, it iterates through the listing.
full_name: Net::FTP#list
is_singleton: false
name: list
params: (*args) {|line| ...}
visibility: public
PK�|[�8���*ri/1.8/system/Net/FTP/getbinaryfile-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: data
comment: 
- !ruby/struct:SM::Flow::P 
  body: Retrieves <tt>remotefile</tt> in binary mode, storing the result in <tt>localfile</tt>. If a block is supplied, it is passed the retrieved data in <tt>blocksize</tt> chunks.
full_name: Net::FTP#getbinaryfile
is_singleton: false
name: getbinaryfile
params: (remotefile, localfile = File.basename(remotefile), blocksize = DEFAULT_BLOCKSIZE) {|data| ...}
visibility: public
PK�|[%Ǯ!ri/1.8/system/Net/FTP/nlst-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array of filenames in the remote directory.
full_name: Net::FTP#nlst
is_singleton: false
name: nlst
params: (dir = nil)
visibility: public
PK�|[?U��%ri/1.8/system/Net/FTP/parse257-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::FTP#parse257
is_singleton: false
name: parse257
params: (resp)
visibility: private
PK�|[�W(��(ri/1.8/system/Net/FTP/open_socket-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::FTP#open_socket
is_singleton: false
name: open_socket
params: (host, port)
visibility: private
PK�|[$����!ri/1.8/system/Net/FTP/open-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ftp
comment: 
- !ruby/struct:SM::Flow::P 
  body: A synonym for <tt>FTP.new</tt>, but with a mandatory host parameter.
- !ruby/struct:SM::Flow::P 
  body: If a block is given, it is passed the <tt>FTP</tt> object, which will be closed when the block finishes, or when an exception is raised.
full_name: Net::FTP::open
is_singleton: true
name: open
params: (host, user = nil, passwd = nil, acct = nil) {|ftp| ...}
visibility: public
PK�|[hCÕii<ri/1.8/system/Net/SMTPSyntaxError/cdesc-SMTPSyntaxError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Represents an SMTP command syntax error (error code 500)
constants: []

full_name: Net::SMTPSyntaxError
includes: 
- !ruby/object:RI::IncludedModule 
  name: SMTPError
instance_methods: []

name: SMTPSyntaxError
superclass: ProtoSyntaxError
PK�|[��5Bri/1.8/system/Net/HTTPRetriableError/cdesc-HTTPRetriableError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::HTTPRetriableError
includes: 
- !ruby/object:RI::IncludedModule 
  name: HTTPExceptions
instance_methods: []

name: HTTPRetriableError
superclass: ProtoRetriableError
PK�|[���__Jri/1.8/system/Net/SMTPUnsupportedCommand/cdesc-SMTPUnsupportedCommand.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Command is not supported on server.
constants: []

full_name: Net::SMTPUnsupportedCommand
includes: 
- !ruby/object:RI::IncludedModule 
  name: SMTPError
instance_methods: []

name: SMTPUnsupportedCommand
superclass: ProtocolError
PK�|[Nk�,ggLri/1.8/system/Net/SMTPAuthenticationError/cdesc-SMTPAuthenticationError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Represents an SMTP authentication error.
constants: []

full_name: Net::SMTPAuthenticationError
includes: 
- !ruby/object:RI::IncludedModule 
  name: SMTPError
instance_methods: []

name: SMTPAuthenticationError
superclass: ProtoAuthError
PK�|[wqE���:ri/1.8/system/Net/HTTPGenericRequest/body_stream%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPGenericRequest#body_stream=
is_singleton: false
name: body_stream=
params: (input)
visibility: public
PK�|[�*q��3ri/1.8/system/Net/HTTPGenericRequest/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPGenericRequest#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[J`O���Eri/1.8/system/Net/HTTPGenericRequest/request_body_permitted%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPGenericRequest#request_body_permitted?
is_singleton: false
name: request_body_permitted?
params: ()
visibility: public
PK�|[�)��Fri/1.8/system/Net/HTTPGenericRequest/response_body_permitted%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPGenericRequest#response_body_permitted?
is_singleton: false
name: response_body_permitted?
params: ()
visibility: public
PK�|[��f��Gri/1.8/system/Net/HTTPGenericRequest/supply_default_content_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPGenericRequest#supply_default_content_type
is_singleton: false
name: supply_default_content_type
params: ()
visibility: private
PK�|[�;����Bri/1.8/system/Net/HTTPGenericRequest/send_request_with_body-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPGenericRequest#send_request_with_body
is_singleton: false
name: send_request_with_body
params: (sock, ver, path, body)
visibility: private
PK�|[�=����Bri/1.8/system/Net/HTTPGenericRequest/cdesc-HTTPGenericRequest.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: body
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: body_stream
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: method
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: path
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parent of HTTPRequest class. Do not use this directly; use a subclass of HTTPRequest.
- !ruby/struct:SM::Flow::P 
  body: Mixes in the HTTPHeader module.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: BUFSIZE
  value: 16*1024
full_name: Net::HTTPGenericRequest
includes: 
- !ruby/object:RI::IncludedModule 
  name: HTTPHeader
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: body=
- !ruby/object:RI::MethodSummary 
  name: body_exist?
- !ruby/object:RI::MethodSummary 
  name: body_stream=
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: request_body_permitted?
- !ruby/object:RI::MethodSummary 
  name: response_body_permitted?
- !ruby/object:RI::MethodSummary 
  name: send_request_with_body
- !ruby/object:RI::MethodSummary 
  name: send_request_with_body_stream
- !ruby/object:RI::MethodSummary 
  name: supply_default_content_type
- !ruby/object:RI::MethodSummary 
  name: write_header
name: HTTPGenericRequest
superclass: Object
PK�|[�-���/ri/1.8/system/Net/HTTPGenericRequest/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPGenericRequest::new
is_singleton: true
name: new
params: (m, reqbody, resbody, path, initheader = nil)
visibility: public
PK�|[��:Z��8ri/1.8/system/Net/HTTPGenericRequest/write_header-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPGenericRequest#write_header
is_singleton: false
name: write_header
params: (sock, ver, path)
visibility: private
PK�|[��n��3ri/1.8/system/Net/HTTPGenericRequest/body%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPGenericRequest#body=
is_singleton: false
name: body=
params: (str)
visibility: public
PK�|[��6&��Iri/1.8/system/Net/HTTPGenericRequest/send_request_with_body_stream-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPGenericRequest#send_request_with_body_stream
is_singleton: false
name: send_request_with_body_stream
params: (sock, ver, path, f)
visibility: private
PK�|[JZ+���9ri/1.8/system/Net/HTTPGenericRequest/body_exist%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPGenericRequest#body_exist?
is_singleton: false
name: body_exist?
params: ()
visibility: public
PK�|[���:ri/1.8/system/Net/HTTPFatalError/cdesc-HTTPFatalError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::HTTPFatalError
includes: 
- !ruby/object:RI::IncludedModule 
  name: HTTPExceptions
instance_methods: []

name: HTTPFatalError
superclass: ProtoFatalError
PK�|[�x���.ri/1.8/system/Net/Protocol/cdesc-Protocol.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::Protocol
includes: []

instance_methods: []

name: Protocol
superclass: Object
PK�|[�ȉJJ.ri/1.8/system/Net/POPError/cdesc-POPError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Non-authentication POP3 protocol error (reply code &quot;-ERR&quot;, except authentication).
constants: []

full_name: Net::POPError
includes: []

instance_methods: []

name: POPError
superclass: ProtocolError
PK�|[7�y�ll:ri/1.8/system/Net/SMTPFatalError/cdesc-SMTPFatalError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Represents a fatal SMTP error (error code 5xx, except for 500)
constants: []

full_name: Net::SMTPFatalError
includes: 
- !ruby/object:RI::IncludedModule 
  name: SMTPError
instance_methods: []

name: SMTPFatalError
superclass: ProtoFatalError
PK�|[!4�(��Dri/1.8/system/Net/ProtoRetriableError/cdesc-ProtoRetriableError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::ProtoRetriableError
includes: []

instance_methods: []

name: ProtoRetriableError
superclass: ProtocolError
PK�|[K�9���@ri/1.8/system/Net/InternetMessageIO/cdesc-InternetMessageIO.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::InternetMessageIO
includes: []

instance_methods: []

name: InternetMessageIO
superclass: BufferedIO
PK�|[�^��Dri/1.8/system/Net/HTTPServerException/cdesc-HTTPServerException.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::HTTPServerException
includes: 
- !ruby/object:RI::IncludedModule 
  name: HTTPExceptions
instance_methods: []

name: HTTPServerException
superclass: ProtoServerError
PK�|[
�X�%%Jri/1.8/system/Net/POPAuthenticationError/cdesc-POPAuthenticationError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: POP3 authentication error.
constants: []

full_name: Net::POPAuthenticationError
includes: []

instance_methods: []

name: POPAuthenticationError
superclass: ProtoAuthError
PK�|[1�0ri/1.8/system/Net/HTTPError/cdesc-HTTPError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::HTTPError
includes: 
- !ruby/object:RI::IncludedModule 
  name: HTTPExceptions
instance_methods: []

name: HTTPError
superclass: ProtocolError
PK�|[k�y[11.ri/1.8/system/Net/HTTPHeader/basic_auth-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Set the Authorization: header for &quot;Basic&quot; authorization."
full_name: Net::HTTPHeader#basic_auth
is_singleton: false
name: basic_auth
params: (account, password)
visibility: public
PK�|[*rA"ff*ri/1.8/system/Net/HTTPHeader/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the header field corresponding to the case-insensitive key. For example, a key of &quot;Content-Type&quot; might return &quot;text/html&quot;
full_name: Net::HTTPHeader#[]
is_singleton: false
name: "[]"
params: (key)
visibility: public
PK�|[�����(ri/1.8/system/Net/HTTPHeader/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #each_header"
full_name: Net::HTTPHeader#each
is_singleton: false
name: each
params: (
visibility: public
PK�|[�`��-ri/1.8/system/Net/HTTPHeader/add_field-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "[Ruby 1.8.3] Adds header field instead of replace. Second argument <tt>val</tt> must be a String. See also #[]=, #[] and #get_fields."
- !ruby/struct:SM::Flow::VERB 
  body: "  request.add_field 'X-My-Header', 'a'\n  p request['X-My-Header']              #=&gt; &quot;a&quot;\n  p request.get_fields('X-My-Header')   #=&gt; [&quot;a&quot;]\n  request.add_field 'X-My-Header', 'b'\n  p request['X-My-Header']              #=&gt; &quot;a, b&quot;\n  p request.get_fields('X-My-Header')   #=&gt; [&quot;a&quot;, &quot;b&quot;]\n  request.add_field 'X-My-Header', 'c'\n  p request['X-My-Header']              #=&gt; &quot;a, b, c&quot;\n  p request.get_fields('X-My-Header')   #=&gt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;]\n"
full_name: Net::HTTPHeader#add_field
is_singleton: false
name: add_field
params: (key, val)
visibility: public
PK�|[�>����5ri/1.8/system/Net/HTTPHeader/content_length%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPHeader#content_length=
is_singleton: false
name: content_length=
params: (len)
visibility: public
PK�|[,���FF1ri/1.8/system/Net/HTTPHeader/set_form_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: form_data=
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set header fields and a body from HTML form data. <tt>params</tt> should be a Hash containing HTML form data. Optional argument <tt>sep</tt> means data record separator.
- !ruby/struct:SM::Flow::P 
  body: "This method also set Content-Type: header field to application/x-www-form-urlencoded."
full_name: Net::HTTPHeader#set_form_data
is_singleton: false
name: set_form_data
params: (params, sep = '&')
visibility: public
PK�|[�*��,ri/1.8/system/Net/HTTPHeader/sub_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns a content type string such as &quot;html&quot;. This method returns nil if Content-Type: header field does not exist or sub-type is not given (e.g. &quot;Content-Type: text&quot;)."
full_name: Net::HTTPHeader#sub_type
is_singleton: false
name: sub_type
params: ()
visibility: public
PK�|[��>��	�	2ri/1.8/system/Net/HTTPHeader/cdesc-HTTPHeader.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Header module.
- !ruby/struct:SM::Flow::P 
  body: Provides access to @header in the mixed-into class as a hash-like object, except with case-insensitive keys. Also provides methods for accessing commonly-used header values in a more convenient format.
constants: []

full_name: Net::HTTPHeader
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: add_field
- !ruby/object:RI::MethodSummary 
  name: basic_auth
- !ruby/object:RI::MethodSummary 
  name: basic_encode
- !ruby/object:RI::MethodSummary 
  name: canonical_each
- !ruby/object:RI::MethodSummary 
  name: capitalize
- !ruby/object:RI::MethodSummary 
  name: chunked?
- !ruby/object:RI::MethodSummary 
  name: content_length
- !ruby/object:RI::MethodSummary 
  name: content_length=
- !ruby/object:RI::MethodSummary 
  name: content_range
- !ruby/object:RI::MethodSummary 
  name: content_type
- !ruby/object:RI::MethodSummary 
  name: content_type=
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: each_capitalized
- !ruby/object:RI::MethodSummary 
  name: each_capitalized_name
- !ruby/object:RI::MethodSummary 
  name: each_header
- !ruby/object:RI::MethodSummary 
  name: each_key
- !ruby/object:RI::MethodSummary 
  name: each_name
- !ruby/object:RI::MethodSummary 
  name: each_value
- !ruby/object:RI::MethodSummary 
  name: fetch
- !ruby/object:RI::MethodSummary 
  name: form_data=
- !ruby/object:RI::MethodSummary 
  name: get_fields
- !ruby/object:RI::MethodSummary 
  name: initialize_http_header
- !ruby/object:RI::MethodSummary 
  name: key?
- !ruby/object:RI::MethodSummary 
  name: main_type
- !ruby/object:RI::MethodSummary 
  name: proxy_basic_auth
- !ruby/object:RI::MethodSummary 
  name: range
- !ruby/object:RI::MethodSummary 
  name: range=
- !ruby/object:RI::MethodSummary 
  name: range_length
- !ruby/object:RI::MethodSummary 
  name: set_content_type
- !ruby/object:RI::MethodSummary 
  name: set_form_data
- !ruby/object:RI::MethodSummary 
  name: set_range
- !ruby/object:RI::MethodSummary 
  name: sub_type
- !ruby/object:RI::MethodSummary 
  name: to_hash
- !ruby/object:RI::MethodSummary 
  name: type_params
- !ruby/object:RI::MethodSummary 
  name: urlencode
name: HTTPHeader
superclass: 
PK�|[�ݩ��,ri/1.8/system/Net/HTTPHeader/range%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #set_range"
full_name: Net::HTTPHeader#range=
is_singleton: false
name: range=
params: (r, e = nil)
visibility: public
PK�|[�u&���*ri/1.8/system/Net/HTTPHeader/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes a header field.
full_name: Net::HTTPHeader#delete
is_singleton: false
name: delete
params: (key)
visibility: public
PK�|[�)�,,.ri/1.8/system/Net/HTTPHeader/get_fields-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "[Ruby 1.8.3] Returns an array of header field strings corresponding to the case-insensitive <tt>key</tt>. This method allows you to get duplicated header fields without any processing. See also #[]."
- !ruby/struct:SM::Flow::VERB 
  body: "  p response.get_fields('Set-Cookie')\n    #=&gt; [&quot;session=al98axx; expires=Fri, 31-Dec-1999 23:58:23&quot;,\n         &quot;query=rubyscript; expires=Fri, 31-Dec-1999 23:58:23&quot;]\n  p response['Set-Cookie']\n    #=&gt; &quot;session=al98axx; expires=Fri, 31-Dec-1999 23:58:23, query=rubyscript; expires=Fri, 31-Dec-1999 23:58:23&quot;\n"
full_name: Net::HTTPHeader#get_fields
is_singleton: false
name: get_fields
params: (key)
visibility: public
PK�|[��Z���,ri/1.8/system/Net/HTTPHeader/each_key-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #each_name"
full_name: Net::HTTPHeader#each_key
is_singleton: false
name: each_key
params: ()
visibility: public
PK�|[]�#3ri/1.8/system/Net/HTTPHeader/content_type%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #set_content_type"
full_name: Net::HTTPHeader#content_type=
is_singleton: false
name: content_type=
params: (type, params = {})
visibility: public
PK�|[H���TT/ri/1.8/system/Net/HTTPHeader/each_header-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: each
block_params: +key+, +value+
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates for each header names and values.
full_name: Net::HTTPHeader#each_header
is_singleton: false
name: each_header
params: ( {|+key+, +value+| ...}
visibility: public
PK�|[PH�tdd0ri/1.8/system/Net/HTTPHeader/content_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns a content type string such as &quot;text/html&quot;. This method returns nil if Content-Type: header field does not exist."
full_name: Net::HTTPHeader#content_type
is_singleton: false
name: content_type
params: ()
visibility: public
PK�|[�9{g??4ri/1.8/system/Net/HTTPHeader/proxy_basic_auth-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Set Proxy-Authorization: header for &quot;Basic&quot; authorization."
full_name: Net::HTTPHeader#proxy_basic_auth
is_singleton: false
name: proxy_basic_auth
params: (account, password)
visibility: public
PK�|[��as��.ri/1.8/system/Net/HTTPHeader/capitalize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPHeader#capitalize
is_singleton: false
name: capitalize
params: (name)
visibility: private
PK�|[S��.ri/1.8/system/Net/HTTPHeader/each_value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: +value+
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates for each header values.
full_name: Net::HTTPHeader#each_value
is_singleton: false
name: each_value
params: ( {|+value+| ...}
visibility: public
PK�|[n��A��0ri/1.8/system/Net/HTTPHeader/basic_encode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPHeader#basic_encode
is_singleton: false
name: basic_encode
params: (account, password)
visibility: private
PK�|[�G�22ri/1.8/system/Net/HTTPHeader/canonical_each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #each_capitalized"
full_name: Net::HTTPHeader#canonical_each
is_singleton: false
name: canonical_each
params: ()
visibility: public
PK�|[��/X``2ri/1.8/system/Net/HTTPHeader/content_length-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns an Integer object which represents the Content-Length: header field or <tt>nil</tt> if that field is not provided."
full_name: Net::HTTPHeader#content_length
is_singleton: false
name: content_length
params: ()
visibility: public
PK�|[��i��-ri/1.8/system/Net/HTTPHeader/urlencode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPHeader#urlencode
is_singleton: false
name: urlencode
params: (str)
visibility: private
PK�|[s���0ri/1.8/system/Net/HTTPHeader/range_length-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "The length of the range represented in Content-Range: header."
full_name: Net::HTTPHeader#range_length
is_singleton: false
name: range_length
params: ()
visibility: public
PK�|[p���:ri/1.8/system/Net/HTTPHeader/initialize_http_header-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPHeader#initialize_http_header
is_singleton: false
name: initialize_http_header
params: (initheader)
visibility: public
PK�|[e���DD/ri/1.8/system/Net/HTTPHeader/type_params-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns content type parameters as a Hash as like {&quot;charset&quot; =&gt; &quot;iso-2022-jp&quot;}.
full_name: Net::HTTPHeader#type_params
is_singleton: false
name: type_params
params: ()
visibility: public
PK�|[3<�88-ri/1.8/system/Net/HTTPHeader/each_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: each_key
block_params: +key+
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates for each header names.
full_name: Net::HTTPHeader#each_name
is_singleton: false
name: each_name
params: () {|+key+| ...}
visibility: public
PK�|[] M���4ri/1.8/system/Net/HTTPHeader/set_content_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: content_type=
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Set Content-Type: header field by <tt>type</tt> and <tt>params</tt>. <tt>type</tt> must be a String, <tt>params</tt> must be a Hash."
full_name: Net::HTTPHeader#set_content_type
is_singleton: false
name: set_content_type
params: (type, params = {})
visibility: public
PK�|[���YY-ri/1.8/system/Net/HTTPHeader/main_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns a content type string such as &quot;text&quot;. This method returns nil if Content-Type: header field does not exist."
full_name: Net::HTTPHeader#main_type
is_singleton: false
name: main_type
params: ()
visibility: public
PK�|[�أ0ri/1.8/system/Net/HTTPHeader/form_data%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #set_form_data"
full_name: Net::HTTPHeader#form_data=
is_singleton: false
name: form_data=
params: (params, sep = '&')
visibility: public
PK�|[i)=�+ri/1.8/system/Net/HTTPHeader/to_hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a Hash consist of header names and values.
full_name: Net::HTTPHeader#to_hash
is_singleton: false
name: to_hash
params: ()
visibility: public
PK�|[7��8��1ri/1.8/system/Net/HTTPHeader/content_range-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns a Range object which represents Content-Range: header field. This indicates, for a partial entity body, where this fragment fits inside the full entity body, as range of byte offsets."
full_name: Net::HTTPHeader#content_range
is_singleton: false
name: content_range
params: ()
visibility: public
PK�|[Z�>�-ri/1.8/system/Net/HTTPHeader/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the header field corresponding to the case-insensitive key.
full_name: Net::HTTPHeader#[]=
is_singleton: false
name: "[]="
params: (key, val)
visibility: public
PK�|[��H��4ri/1.8/system/Net/HTTPHeader/each_capitalized-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: canonical_each
block_params: capitalize(k), v.join(', ')
comment: 
- !ruby/struct:SM::Flow::P 
  body: "As for #each_header, except the keys are provided in capitalized form."
full_name: Net::HTTPHeader#each_capitalized
is_singleton: false
name: each_capitalized
params: () {|capitalize(k), v.join(', ')| ...}
visibility: public
PK�|[<$�GG)ri/1.8/system/Net/HTTPHeader/range-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns an Array of Range objects which represents Range: header field, or <tt>nil</tt> if there is no such header."
full_name: Net::HTTPHeader#range
is_singleton: false
name: range
params: ()
visibility: public
PK�|[d9׃��*ri/1.8/system/Net/HTTPHeader/key%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: true if <tt>key</tt> header exists.
full_name: Net::HTTPHeader#key?
is_singleton: false
name: key?
params: (key)
visibility: public
PK�|[����.ri/1.8/system/Net/HTTPHeader/chunked%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns &quot;true&quot; if the &quot;transfer-encoding&quot; header is present and set to &quot;chunked&quot;. This is an HTTP/1.1 feature, allowing the the content to be sent in &quot;chunks&quot; without at the outset stating the entire content length.
full_name: Net::HTTPHeader#chunked?
is_singleton: false
name: chunked?
params: ()
visibility: public
PK�|[��}B��)ri/1.8/system/Net/HTTPHeader/fetch-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: +key+
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the header field corresponding to the case-insensitive key. Returns the default value <tt>args</tt>, or the result of the block, or nil, if there's no header field named key. See Hash#fetch
full_name: Net::HTTPHeader#fetch
is_singleton: false
name: fetch
params: (key, *args) {|+key+| ...}
visibility: public
PK�|[�a��009ri/1.8/system/Net/HTTPHeader/each_capitalized_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: +key+
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates for each capitalized header names.
full_name: Net::HTTPHeader#each_capitalized_name
is_singleton: false
name: each_capitalized_name
params: () {|+key+| ...}
visibility: public
PK�|[�ټ���-ri/1.8/system/Net/HTTPHeader/set_range-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: range=
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Set Range: header from Range (arg r) or beginning index and length from it (arg idx&amp;len)."
- !ruby/struct:SM::Flow::VERB 
  body: "  req.range = (0..1023)\n  req.set_range 0, 1023\n"
full_name: Net::HTTPHeader#set_range
is_singleton: false
name: set_range
params: (r, e = nil)
visibility: public
PK�|[�Za�� ri/1.8/system/Net/cdesc-Net.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net
includes: []

instance_methods: []

name: Net
superclass: 
PK�|[0sQ��>ri/1.8/system/Net/ProtoSyntaxError/cdesc-ProtoSyntaxError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::ProtoSyntaxError
includes: []

instance_methods: []

name: ProtoSyntaxError
superclass: ProtocolError
PK�|[!��oTT&ri/1.8/system/Net/APOP/cdesc-APOP.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: This class is equivalent to POP3, except that it uses APOP authentication.
constants: []

full_name: Net::APOP
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: apop?
name: APOP
superclass: POP3
PK�|[�g�O��%ri/1.8/system/Net/APOP/apop%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Always returns true.
full_name: Net::APOP#apop?
is_singleton: false
name: apop?
params: ()
visibility: public
PK�|[:��q__>ri/1.8/system/Net/SMTPUnknownError/cdesc-SMTPUnknownError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Unexpected reply code returned from server.
constants: []

full_name: Net::SMTPUnknownError
includes: 
- !ruby/object:RI::IncludedModule 
  name: SMTPError
instance_methods: []

name: SMTPUnknownError
superclass: ProtoUnknownError
PK�|[-=��1ri/1.8/system/Net/SMTP/check_auth_continue-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#check_auth_continue
is_singleton: false
name: check_auth_continue
params: (res)
visibility: private
PK�|[�V����)ri/1.8/system/Net/SMTP/cram_secret-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#cram_secret
is_singleton: false
name: cram_secret
params: (secret, mask)
visibility: private
PK�|[M����/ri/1.8/system/Net/SMTP/check_auth_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#check_auth_method
is_singleton: false
name: check_auth_method
params: (type)
visibility: private
PK�|[�>k�WW.ri/1.8/system/Net/SMTP/disable_starttls-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Disables SMTP/TLS (STARTTLS) for this object. Must be called before the connection is established to have any effect.
full_name: Net::SMTP#disable_starttls
is_singleton: false
name: disable_starttls
params: ()
visibility: public
PK�|[����2ri/1.8/system/Net/SMTP/enable_starttls_auto-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Enables SMTP/TLS (STARTTLS) for this object if server accepts. <tt>context</tt> is a OpenSSL::SSL::SSLContext object.
full_name: Net::SMTP#enable_starttls_auto
is_singleton: false
name: enable_starttls_auto
params: (context = SMTP.default_ssl_context)
visibility: public
PK�|[N_���&ri/1.8/system/Net/SMTP/mailfrom-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#mailfrom
is_singleton: false
name: mailfrom
params: (from_addr)
visibility: public
PK�|[P`t���(ri/1.8/system/Net/SMTP/enable_tls-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: enable_ssl
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Enables SMTP/TLS (SMTPS: SMTP over direct TLS connection) for this object. Must be called before the connection is established to have any effect. <tt>context</tt> is a OpenSSL::SSL::SSLContext object."
full_name: Net::SMTP#enable_tls
is_singleton: false
name: enable_tls
params: (context = SMTP.default_ssl_context)
visibility: public
PK�|[�\�X��&ri/1.8/system/Net/SMTP/esmtp%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Set whether to use ESMTP or not. This should be done before calling #start. Note that if #start is called in ESMTP mode, and the connection fails due to a ProtocolError, the SMTP object will automatically switch to plain SMTP mode and retry (but not vice versa)."
full_name: Net::SMTP#esmtp=
is_singleton: false
name: esmtp=
params: (bool)
visibility: public
PK�|[�|���#ri/1.8/system/Net/SMTP/esmtp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #esmtp?"
full_name: Net::SMTP#esmtp
is_singleton: false
name: esmtp
params: ()
visibility: public
PK�|[�"		'ri/1.8/system/Net/SMTP/send_mail-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #send_message"
full_name: Net::SMTP#send_mail
is_singleton: false
name: send_mail
params: (msgstr, from_addr, *to_addrs)
visibility: public
PK�|[�"(ri/1.8/system/Net/SMTP/started%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>true</tt> if the SMTP session has been started.
full_name: Net::SMTP#started?
is_singleton: false
name: started?
params: ()
visibility: public
PK�|[��ee-ri/1.8/system/Net/SMTP/enable_starttls-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Enables SMTP/TLS (STARTTLS) for this object. <tt>context</tt> is a OpenSSL::SSL::SSLContext object.
full_name: Net::SMTP#enable_starttls
is_singleton: false
name: enable_starttls
params: (context = SMTP.default_ssl_context)
visibility: public
PK�|[� a��)ri/1.8/system/Net/SMTP/disable_ssl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #disable_tls"
full_name: Net::SMTP#disable_ssl
is_singleton: false
name: disable_ssl
params: ()
visibility: public
PK�|[nL��+ri/1.8/system/Net/SMTP/recv_response-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#recv_response
is_singleton: false
name: recv_response
params: ()
visibility: private
PK�|[��x��"ri/1.8/system/Net/SMTP/ehlo-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#ehlo
is_singleton: false
name: ehlo
params: (domain)
visibility: public
PK�|[4sŷ��&ri/1.8/system/Net/SMTP/critical-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ()
comment: 
full_name: Net::SMTP#critical
is_singleton: false
name: critical
params: (&block) {|| ...}
visibility: private
PK�|[�JZ��,ri/1.8/system/Net/SMTP/check_continue-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#check_continue
is_singleton: false
name: check_continue
params: (res)
visibility: private
PK�|[���Z$ri/1.8/system/Net/SMTP/tls%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: ssl?
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: true if this object uses SMTP/TLS (SMTPS).
full_name: Net::SMTP#tls?
is_singleton: false
name: tls?
params: ()
visibility: public
PK�|[�*{>>&ri/1.8/system/Net/SMTP/esmtp%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: esmtp
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>true</tt> if the SMTP object uses ESMTP (which it does by default).
full_name: Net::SMTP#esmtp?
is_singleton: false
name: esmtp?
params: ()
visibility: public
PK�|[P���.ri/1.8/system/Net/SMTP/set_debug_output-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #debug_output="
full_name: Net::SMTP#set_debug_output
is_singleton: false
name: set_debug_output
params: (arg)
visibility: public
PK�|[\�??1ri/1.8/system/Net/SMTP/capable_starttls%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: true if server advertises STARTTLS. You cannot get valid value before opening SMTP session.
full_name: Net::SMTP#capable_starttls?
is_singleton: false
name: capable_starttls?
params: ()
visibility: public
PK�|[tK���&ri/1.8/system/Net/SMTP/starttls-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: SMTP command dispatcher
full_name: Net::SMTP#starttls
is_singleton: false
name: starttls
params: ()
visibility: public
PK�|[�-��#ri/1.8/system/Net/SMTP/ready-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #open_message_stream"
full_name: Net::SMTP#ready
is_singleton: false
name: ready
params: (from_addr, *to_addrs)
visibility: public
PK�|[V-����*ri/1.8/system/Net/SMTP/default_port-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The default SMTP port number, 25.
full_name: Net::SMTP::default_port
is_singleton: true
name: default_port
params: ()
visibility: public
PK�|[�=�ƫ�"ri/1.8/system/Net/SMTP/helo-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#helo
is_singleton: false
name: helo
params: (domain)
visibility: public
PK�|[5x�N��"ri/1.8/system/Net/SMTP/quit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#quit
is_singleton: false
name: quit
params: ()
visibility: public
PK�|[ye�K��-ri/1.8/system/Net/SMTP/debug_output%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: set_debug_output
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "WARNING: This method causes serious security holes. Use this method for only debugging."
- !ruby/struct:SM::Flow::P 
  body: "Set an output stream for debug logging. You must call this before #start."
- !ruby/struct:SM::Flow::VERB 
  body: "  # example\n  smtp = Net::SMTP.new(addr, port)\n  smtp.set_debug_output $stderr\n  smtp.start do |smtp|\n    ....\n  end\n"
full_name: Net::SMTP#debug_output=
is_singleton: false
name: debug_output=
params: (arg)
visibility: public
PK�|[�[��*ri/1.8/system/Net/SMTP/send_message-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: send_mail
- !ruby/object:RI::AliasName 
  name: sendmail
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends <tt>msgstr</tt> as a message. Single CR (&quot;\r&quot;) and LF (&quot;\n&quot;) found in the <tt>msgstr</tt>, are converted into the CR LF pair. You cannot send a binary message with this method. <tt>msgstr</tt> should include both the message headers and body.
- !ruby/struct:SM::Flow::P 
  body: <tt>from_addr</tt> is a String representing the source mail address.
- !ruby/struct:SM::Flow::P 
  body: <tt>to_addr</tt> is a String or Strings or Array of Strings, representing the destination mail address or addresses.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "    Net::SMTP.start('smtp.example.com') do |smtp|\n      smtp.send_message msgstr,\n                        'from@example.com',\n                        ['dest@example.com', 'dest2@example.com']\n    end\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Errors
- !ruby/struct:SM::Flow::P 
  body: "This method may raise:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Net::SMTPServerBusy
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Net::SMTPSyntaxError
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Net::SMTPFatalError
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Net::SMTPUnknownError
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: IOError
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: TimeoutError
  type: :BULLET
full_name: Net::SMTP#send_message
is_singleton: false
name: send_message
params: (msgstr, from_addr, *to_addrs)
visibility: public
PK�|[��x8zz"ri/1.8/system/Net/SMTP/data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: stream
comment: 
- !ruby/struct:SM::Flow::P 
  body: This method sends a message. If <tt>msgstr</tt> is given, sends it as a message. If block is given, yield a message writer stream. You must write message before the block is closed.
- !ruby/struct:SM::Flow::VERB 
  body: "  # Example 1 (by string)\n  smtp.data(&lt;&lt;EndMessage)\n  From: john@example.com\n  To: betty@example.com\n  Subject: I found a bug\n\n  Check vm.c:58879.\n  EndMessage\n\n  # Example 2 (by block)\n  smtp.data {|f|\n    f.puts &quot;From: john@example.com&quot;\n    f.puts &quot;To: betty@example.com&quot;\n    f.puts &quot;Subject: I found a bug&quot;\n    f.puts &quot;&quot;\n    f.puts &quot;Check vm.c:58879.&quot;\n  }\n"
full_name: Net::SMTP#data
is_singleton: false
name: data
params: (msgstr = nil) {|stream| ...}
visibility: public
PK�|[0�����1ri/1.8/system/Net/SMTP/check_auth_response-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#check_auth_response
is_singleton: false
name: check_auth_response
params: (res)
visibility: private
PK�|[��_��&ri/1.8/system/Net/SMTP/do_start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#do_start
is_singleton: false
name: do_start
params: (helo_domain, user, secret, authtype)
visibility: private
PK�|[��M�  .ri/1.8/system/Net/SMTP/starttls_auto%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: true if this object uses STARTTLS when server advertises STARTTLS.
full_name: Net::SMTP#starttls_auto?
is_singleton: false
name: starttls_auto?
params: ()
visibility: public
PK�|[د8���(ri/1.8/system/Net/SMTP/capable%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#capable?
is_singleton: false
name: capable?
params: (key)
visibility: private
PK�|[��M��5ri/1.8/system/Net/SMTP/new_internet_message_io-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#new_internet_message_io
is_singleton: false
name: new_internet_message_io
params: (s)
visibility: private
PK�|[�2��NN6ri/1.8/system/Net/SMTP/capable_cram_md5_auth%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: true if server advertises AUTH CRAM-MD5. You cannot get valid value before opening SMTP session.
full_name: Net::SMTP#capable_cram_md5_auth?
is_singleton: false
name: capable_cram_md5_auth?
params: ()
visibility: public
PK�|[A�{�EE3ri/1.8/system/Net/SMTP/capable_login_auth%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: true if server advertises AUTH LOGIN. You cannot get valid value before opening SMTP session.
full_name: Net::SMTP#capable_login_auth?
is_singleton: false
name: capable_login_auth?
params: ()
visibility: public
PK�|[z�n���1ri/1.8/system/Net/SMTP/default_ssl_context-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP::default_ssl_context
is_singleton: true
name: default_ssl_context
params: ()
visibility: public
PK�|[�^���-ri/1.8/system/Net/SMTP/check_auth_args-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#check_auth_args
is_singleton: false
name: check_auth_args
params: (user, secret)
visibility: private
PK�|[��%ri/1.8/system/Net/SMTP/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Provide human-readable stringification of class state.
full_name: Net::SMTP#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[�mb!!$ri/1.8/system/Net/SMTP/finish-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Finishes the SMTP session and closes TCP connection. Raises IOError if not started.
full_name: Net::SMTP#finish
is_singleton: false
name: finish
params: ()
visibility: public
PK�|[�- ���*ri/1.8/system/Net/SMTP/get_response-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#get_response
is_singleton: false
name: get_response
params: (reqline)
visibility: private
PK�|[�F���-ri/1.8/system/Net/SMTP/auth_capable%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#auth_capable?
is_singleton: false
name: auth_capable?
params: (type)
visibility: private
PK�|[�\1���)ri/1.8/system/Net/SMTP/rcptto_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
full_name: Net::SMTP#rcptto_list
is_singleton: false
name: rcptto_list
params: (to_addrs) {|| ...}
visibility: public
PK�|[��<+VV0ri/1.8/system/Net/SMTP/capable_auth_types-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns supported authentication methods on this server. You cannot get valid value before opening SMTP session.
full_name: Net::SMTP#capable_auth_types
is_singleton: false
name: capable_auth_types
params: ()
visibility: public
PK�|[Rk�݄�)ri/1.8/system/Net/SMTP/starttls%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns truth value if this object uses STARTTLS. If this object always uses STARTTLS, returns :always. If this object uses STARTTLS when the server support TLS, returns :auto.
full_name: Net::SMTP#starttls?
is_singleton: false
name: starttls?
params: ()
visibility: public
PK�|[�G�&ri/1.8/system/Net/SMTP/sendmail-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #send_message"
full_name: Net::SMTP#sendmail
is_singleton: false
name: sendmail
params: (msgstr, from_addr, *to_addrs)
visibility: public
PK�|[���rr!ri/1.8/system/Net/SMTP/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new Net::SMTP object.
- !ruby/struct:SM::Flow::P 
  body: <tt>address</tt> is the hostname or ip address of your SMTP server. <tt>port</tt> is the port to connect to; it defaults to port 25.
- !ruby/struct:SM::Flow::P 
  body: This method does not open the TCP connection. You can use SMTP.start instead of SMTP.new if you want to do everything at once. Otherwise, follow SMTP.new with SMTP#start.
full_name: Net::SMTP::new
is_singleton: true
name: new
params: (address, port = nil)
visibility: public
PK�|[������$ri/1.8/system/Net/SMTP/ssl%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #tls?"
full_name: Net::SMTP#ssl?
is_singleton: false
name: ssl?
params: ()
visibility: public
PK�|[�N���#ri/1.8/system/Net/SMTP/getok-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#getok
is_singleton: false
name: getok
params: (reqline)
visibility: private
PK�|[dհ��,ri/1.8/system/Net/SMTP/check_response-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#check_response
is_singleton: false
name: check_response
params: (res)
visibility: private
PK�|[��~(ri/1.8/system/Net/SMTP/enable_ssl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #enable_tls"
full_name: Net::SMTP#enable_ssl
is_singleton: false
name: enable_ssl
params: (context = SMTP.default_ssl_context)
visibility: public
PK�|[)p��Q
Q
#ri/1.8/system/Net/SMTP/start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: smtp
comment: 
- !ruby/struct:SM::Flow::P 
  body: Opens a TCP connection and starts the SMTP session.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameters
- !ruby/struct:SM::Flow::P 
  body: <tt>helo</tt> is the <em>HELO</em> <em>domain</em> that you'll dispatch mails from; see the discussion in the overview notes.
- !ruby/struct:SM::Flow::P 
  body: If both of <tt>user</tt> and <tt>secret</tt> are given, SMTP authentication will be attempted using the AUTH command. <tt>authtype</tt> specifies the type of authentication to attempt; it must be one of :login, :plain, and :cram_md5. See the notes on SMTP Authentication in the overview.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Block Usage
- !ruby/struct:SM::Flow::P 
  body: When this methods is called with a block, the newly-started SMTP object is yielded to the block, and automatically closed after the block call finishes. Otherwise, it is the caller's responsibility to close the session when finished.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::P 
  body: This is very similar to the class method SMTP.start.
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'net/smtp'\n    smtp = Net::SMTP.new('smtp.mail.server', 25)\n    smtp.start(helo_domain, account, password, authtype) do |smtp|\n      smtp.send_message msgstr, 'from@example.com', ['dest@example.com']\n    end\n"
- !ruby/struct:SM::Flow::P 
  body: The primary use of this method (as opposed to SMTP.start) is probably to set debugging (#set_debug_output) or ESMTP (#esmtp=), which must be done before the session is started.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Errors
- !ruby/struct:SM::Flow::P 
  body: If session has already been started, an IOError will be raised.
- !ruby/struct:SM::Flow::P 
  body: "This method may raise:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Net::SMTPAuthenticationError
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Net::SMTPServerBusy
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Net::SMTPSyntaxError
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Net::SMTPFatalError
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Net::SMTPUnknownError
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: IOError
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: TimeoutError
  type: :BULLET
full_name: Net::SMTP#start
is_singleton: false
name: start
params: (helo = 'localhost.localdomain', user = nil, secret = nil, authtype = nil) {|smtp| ...}
visibility: public
PK�|[V�}�/ri/1.8/system/Net/SMTP/cram_md5_response-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "CRAM-MD5: [RFC2195]"
full_name: Net::SMTP#cram_md5_response
is_singleton: false
name: cram_md5_response
params: (secret, challenge)
visibility: private
PK�|[=v����+ri/1.8/system/Net/SMTP/base64_encode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#base64_encode
is_singleton: false
name: base64_encode
params: (str)
visibility: private
PK�|[�6+���(ri/1.8/system/Net/SMTP/auth_login-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#auth_login
is_singleton: false
name: auth_login
params: (user, secret)
visibility: public
PK�|[�Eœ��%ri/1.8/system/Net/SMTP/logging-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#logging
is_singleton: false
name: logging
params: (msg)
visibility: private
PK�|[�����%ri/1.8/system/Net/SMTP/do_helo-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#do_helo
is_singleton: false
name: do_helo
params: (helo_domain)
visibility: private
PK�|[�#�]��(ri/1.8/system/Net/SMTP/auth_plain-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#auth_plain
is_singleton: false
name: auth_plain
params: (user, secret)
visibility: public
PK�|[��Ws��(ri/1.8/system/Net/SMTP/tlsconnect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#tlsconnect
is_singleton: false
name: tlsconnect
params: (s)
visibility: private
PK�|[u��V!!-ri/1.8/system/Net/SMTP/read_timeout%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the number of seconds to wait until timing-out a read(2) call.
full_name: Net::SMTP#read_timeout=
is_singleton: false
name: read_timeout=
params: (sec)
visibility: public
PK�|[���EE3ri/1.8/system/Net/SMTP/capable_plain_auth%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: true if server advertises AUTH PLAIN. You cannot get valid value before opening SMTP session.
full_name: Net::SMTP#capable_plain_auth?
is_singleton: false
name: capable_plain_auth?
params: ()
visibility: public
PK�|[�ϞX��$ri/1.8/system/Net/SMTP/rcptto-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#rcptto
is_singleton: false
name: rcptto
params: (to_addr)
visibility: public
PK�|[�D�	�	1ri/1.8/system/Net/SMTP/open_message_stream-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: ready
block_params: stream
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Opens a message writer stream and gives it to the block. The stream is valid only in the block, and has these methods:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "puts(str = ''):"
    body: outputs STR and CR LF.
  - !ruby/struct:SM::Flow::LI 
    label: "print(str):"
    body: outputs STR.
  - !ruby/struct:SM::Flow::LI 
    label: "printf(fmt, *args):"
    body: outputs sprintf(fmt,*args).
  - !ruby/struct:SM::Flow::LI 
    label: "write(str):"
    body: outputs STR and returns the length of written bytes.
  - !ruby/struct:SM::Flow::LI 
    label: "<<(str):"
    body: outputs STR and returns self.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: If a single CR (&quot;\r&quot;) or LF (&quot;\n&quot;) is found in the message, it is converted to the CR LF pair. You cannot send a binary message with this method.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameters
- !ruby/struct:SM::Flow::P 
  body: <tt>from_addr</tt> is a String representing the source mail address.
- !ruby/struct:SM::Flow::P 
  body: <tt>to_addr</tt> is a String or Strings or Array of Strings, representing the destination mail address or addresses.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "    Net::SMTP.start('smtp.example.com', 25) do |smtp|\n      smtp.open_message_stream('from@example.com', ['dest@example.com']) do |f|\n        f.puts 'From: from@example.com'\n        f.puts 'To: dest@example.com'\n        f.puts 'Subject: test message'\n        f.puts\n        f.puts 'This is a test message.'\n      end\n    end\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Errors
- !ruby/struct:SM::Flow::P 
  body: "This method may raise:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Net::SMTPServerBusy
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Net::SMTPSyntaxError
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Net::SMTPFatalError
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Net::SMTPUnknownError
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: IOError
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: TimeoutError
  type: :BULLET
full_name: Net::SMTP#open_message_stream
is_singleton: false
name: open_message_stream
params: (from_addr, *to_addrs) {|stream| ...}
visibility: public
PK�|[��	Aqq)ri/1.8/system/Net/SMTP/disable_tls-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: disable_ssl
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Disables SMTP/TLS for this object. Must be called before the connection is established to have any effect.
full_name: Net::SMTP#disable_tls
is_singleton: false
name: disable_tls
params: ()
visibility: public
PK�|[�g����*ri/1.8/system/Net/SMTP/authenticate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#authenticate
is_singleton: false
name: authenticate
params: (user, secret, authtype = DEFAULT_AUTH_TYPE)
visibility: public
PK�|[q�H��'ri/1.8/system/Net/SMTP/do_finish-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#do_finish
is_singleton: false
name: do_finish
params: ()
visibility: private
PK�|[ʽ›J&J&&ri/1.8/system/Net/SMTP/cdesc-SMTP.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The address of the SMTP server to connect to.
  name: address
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Seconds to wait while attempting to open a connection. If the connection cannot be opened within this time, a TimeoutError is raised.
  name: open_timeout
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The port number of the SMTP server to connect to.
  name: port
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Seconds to wait while reading one block (by one read(2) call). If the read(2) call does not complete within this time, a TimeoutError is raised.
  name: read_timeout
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: default_port
- !ruby/object:RI::MethodSummary 
  name: default_ssl_context
- !ruby/object:RI::MethodSummary 
  name: default_submission_port
- !ruby/object:RI::MethodSummary 
  name: default_tls_port
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: start
comment: 
- !ruby/struct:SM::Flow::H 
  level: 1
  text: Net::SMTP
- !ruby/struct:SM::Flow::H 
  level: 2
  text: What is This Library?
- !ruby/struct:SM::Flow::P 
  body: This library provides functionality to send internet mail via SMTP, the Simple Mail Transfer Protocol. For details of SMTP itself, see [RFC2821] (http://www.ietf.org/rfc/rfc2821.txt).
- !ruby/struct:SM::Flow::H 
  level: 2
  text: What is This Library NOT?
- !ruby/struct:SM::Flow::P 
  body: This library does NOT provide functions to compose internet mails. You must create them by yourself. If you want better mail support, try RubyMail or TMail. You can get both libraries from RAA. (http://www.ruby-lang.org/en/raa.html)
- !ruby/struct:SM::Flow::P 
  body: "FYI: the official documentation on internet mail is: [RFC2822] (http://www.ietf.org/rfc/rfc2822.txt)."
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Examples
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Sending Messages
- !ruby/struct:SM::Flow::P 
  body: You must open a connection to an SMTP server before sending messages. The first argument is the address of your SMTP server, and the second argument is the port number. Using SMTP.start with a block is the simplest way to do this. This way, the SMTP connection is closed automatically after the block is executed.
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'net/smtp'\n    Net::SMTP.start('your.smtp.server', 25) do |smtp|\n      # Use the SMTP object smtp only in this block.\n    end\n"
- !ruby/struct:SM::Flow::P 
  body: Replace 'your.smtp.server' with your SMTP server. Normally your system manager or internet provider supplies a server for you.
- !ruby/struct:SM::Flow::P 
  body: Then you can send messages.
- !ruby/struct:SM::Flow::VERB 
  body: "    msgstr = &lt;&lt;END_OF_MESSAGE\n    From: Your Name &lt;your@mail.address&gt;\n    To: Destination Address &lt;someone@example.com&gt;\n    Subject: test message\n    Date: Sat, 23 Jun 2001 16:26:43 +0900\n    Message-Id: &lt;unique.message.id.string@example.com&gt;\n\n    This is a test message.\n    END_OF_MESSAGE\n\n    require 'net/smtp'\n    Net::SMTP.start('your.smtp.server', 25) do |smtp|\n      smtp.send_message msgstr,\n                        'your@mail.address',\n                        'his_addess@example.com'\n    end\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Closing the Session
- !ruby/struct:SM::Flow::P 
  body: "You MUST close the SMTP session after sending messages, by calling the #finish method:"
- !ruby/struct:SM::Flow::VERB 
  body: "    # using SMTP#finish\n    smtp = Net::SMTP.start('your.smtp.server', 25)\n    smtp.send_message msgstr, 'from@address', 'to@address'\n    smtp.finish\n"
- !ruby/struct:SM::Flow::P 
  body: "You can also use the block form of SMTP.start/SMTP#start. This closes the SMTP session automatically:"
- !ruby/struct:SM::Flow::VERB 
  body: "    # using block form of SMTP.start\n    Net::SMTP.start('your.smtp.server', 25) do |smtp|\n      smtp.send_message msgstr, 'from@address', 'to@address'\n    end\n"
- !ruby/struct:SM::Flow::P 
  body: I strongly recommend this scheme. This form is simpler and more robust.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: HELO domain
- !ruby/struct:SM::Flow::P 
  body: In almost all situations, you must provide a third argument to SMTP.start/SMTP#start. This is the domain name which you are on (the host to send mail from). It is called the &quot;HELO domain&quot;. The SMTP server will judge whether it should send or reject the SMTP session by inspecting the HELO domain.
- !ruby/struct:SM::Flow::VERB 
  body: "    Net::SMTP.start('your.smtp.server', 25,\n                    'mail.from.domain') { |smtp| ... }\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: SMTP Authentication
- !ruby/struct:SM::Flow::P 
  body: "The Net::SMTP class supports three authentication schemes; PLAIN, LOGIN and CRAM MD5. (SMTP Authentication: [RFC2554]) To use SMTP authentication, pass extra arguments to SMTP.start/SMTP#start."
- !ruby/struct:SM::Flow::VERB 
  body: "    # PLAIN\n    Net::SMTP.start('your.smtp.server', 25, 'mail.from.domain',\n                    'Your Account', 'Your Password', :plain)\n    # LOGIN\n    Net::SMTP.start('your.smtp.server', 25, 'mail.from.domain',\n                    'Your Account', 'Your Password', :login)\n\n    # CRAM MD5\n    Net::SMTP.start('your.smtp.server', 25, 'mail.from.domain',\n                    'Your Account', 'Your Password', :cram_md5)\n"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Revision
  value: "%q$Revision: 28208 $.split[1]"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Authentication
  name: DEFAULT_AUTH_TYPE
  value: ":plain"
- !ruby/object:RI::Constant 
  comment: 
  name: IMASK
  value: "0x36"
- !ruby/object:RI::Constant 
  comment: 
  name: OMASK
  value: "0x5c"
- !ruby/object:RI::Constant 
  comment: 
  name: CRAM_BUFSIZE
  value: "64"
full_name: Net::SMTP
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: auth_capable?
- !ruby/object:RI::MethodSummary 
  name: auth_cram_md5
- !ruby/object:RI::MethodSummary 
  name: auth_login
- !ruby/object:RI::MethodSummary 
  name: auth_method
- !ruby/object:RI::MethodSummary 
  name: auth_plain
- !ruby/object:RI::MethodSummary 
  name: authenticate
- !ruby/object:RI::MethodSummary 
  name: base64_encode
- !ruby/object:RI::MethodSummary 
  name: capable?
- !ruby/object:RI::MethodSummary 
  name: capable_auth_types
- !ruby/object:RI::MethodSummary 
  name: capable_cram_md5_auth?
- !ruby/object:RI::MethodSummary 
  name: capable_login_auth?
- !ruby/object:RI::MethodSummary 
  name: capable_plain_auth?
- !ruby/object:RI::MethodSummary 
  name: capable_starttls?
- !ruby/object:RI::MethodSummary 
  name: check_auth_args
- !ruby/object:RI::MethodSummary 
  name: check_auth_continue
- !ruby/object:RI::MethodSummary 
  name: check_auth_method
- !ruby/object:RI::MethodSummary 
  name: check_auth_response
- !ruby/object:RI::MethodSummary 
  name: check_continue
- !ruby/object:RI::MethodSummary 
  name: check_response
- !ruby/object:RI::MethodSummary 
  name: cram_md5_response
- !ruby/object:RI::MethodSummary 
  name: cram_secret
- !ruby/object:RI::MethodSummary 
  name: critical
- !ruby/object:RI::MethodSummary 
  name: data
- !ruby/object:RI::MethodSummary 
  name: debug_output=
- !ruby/object:RI::MethodSummary 
  name: disable_ssl
- !ruby/object:RI::MethodSummary 
  name: disable_starttls
- !ruby/object:RI::MethodSummary 
  name: disable_tls
- !ruby/object:RI::MethodSummary 
  name: do_finish
- !ruby/object:RI::MethodSummary 
  name: do_helo
- !ruby/object:RI::MethodSummary 
  name: do_start
- !ruby/object:RI::MethodSummary 
  name: ehlo
- !ruby/object:RI::MethodSummary 
  name: enable_ssl
- !ruby/object:RI::MethodSummary 
  name: enable_starttls
- !ruby/object:RI::MethodSummary 
  name: enable_starttls_auto
- !ruby/object:RI::MethodSummary 
  name: enable_tls
- !ruby/object:RI::MethodSummary 
  name: esmtp
- !ruby/object:RI::MethodSummary 
  name: esmtp=
- !ruby/object:RI::MethodSummary 
  name: esmtp?
- !ruby/object:RI::MethodSummary 
  name: finish
- !ruby/object:RI::MethodSummary 
  name: get_response
- !ruby/object:RI::MethodSummary 
  name: getok
- !ruby/object:RI::MethodSummary 
  name: helo
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: logging
- !ruby/object:RI::MethodSummary 
  name: mailfrom
- !ruby/object:RI::MethodSummary 
  name: new_internet_message_io
- !ruby/object:RI::MethodSummary 
  name: open_message_stream
- !ruby/object:RI::MethodSummary 
  name: quit
- !ruby/object:RI::MethodSummary 
  name: rcptto
- !ruby/object:RI::MethodSummary 
  name: rcptto_list
- !ruby/object:RI::MethodSummary 
  name: read_timeout=
- !ruby/object:RI::MethodSummary 
  name: ready
- !ruby/object:RI::MethodSummary 
  name: recv_response
- !ruby/object:RI::MethodSummary 
  name: send_mail
- !ruby/object:RI::MethodSummary 
  name: send_message
- !ruby/object:RI::MethodSummary 
  name: sendmail
- !ruby/object:RI::MethodSummary 
  name: set_debug_output
- !ruby/object:RI::MethodSummary 
  name: ssl?
- !ruby/object:RI::MethodSummary 
  name: start
- !ruby/object:RI::MethodSummary 
  name: started?
- !ruby/object:RI::MethodSummary 
  name: starttls
- !ruby/object:RI::MethodSummary 
  name: starttls?
- !ruby/object:RI::MethodSummary 
  name: starttls_always?
- !ruby/object:RI::MethodSummary 
  name: starttls_auto?
- !ruby/object:RI::MethodSummary 
  name: tls?
- !ruby/object:RI::MethodSummary 
  name: tlsconnect
name: SMTP
superclass: Object
PK�|[|�G�
�
#ri/1.8/system/Net/SMTP/start-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: smtp
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new Net::SMTP object and connects to the server.
- !ruby/struct:SM::Flow::P 
  body: "This method is equivalent to:"
- !ruby/struct:SM::Flow::VERB 
  body: "  Net::SMTP.new(address, port).start(helo_domain, account, password, authtype)\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "    Net::SMTP.start('your.smtp.server') do |smtp|\n      smtp.send_message msgstr, 'from@example.com', ['dest@example.com']\n    end\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Block Usage
- !ruby/struct:SM::Flow::P 
  body: If called with a block, the newly-opened Net::SMTP object is yielded to the block, and automatically closed when the block finishes. If called without a block, the newly-opened Net::SMTP object is returned to the caller, and it is the caller's responsibility to close it when finished.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameters
- !ruby/struct:SM::Flow::P 
  body: <tt>address</tt> is the hostname or ip address of your smtp server.
- !ruby/struct:SM::Flow::P 
  body: <tt>port</tt> is the port to connect to; it defaults to port 25.
- !ruby/struct:SM::Flow::P 
  body: <tt>helo</tt> is the <em>HELO</em> <em>domain</em> provided by the client to the server (see overview comments); it defaults to 'localhost.localdomain'.
- !ruby/struct:SM::Flow::P 
  body: The remaining arguments are used for SMTP authentication, if required or desired. <tt>user</tt> is the account name; <tt>secret</tt> is your password or other authentication token; and <tt>authtype</tt> is the authentication type, one of :plain, :login, or :cram_md5. See the discussion of SMTP Authentication in the overview notes.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Errors
- !ruby/struct:SM::Flow::P 
  body: "This method may raise:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Net::SMTPAuthenticationError
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Net::SMTPServerBusy
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Net::SMTPSyntaxError
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Net::SMTPFatalError
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Net::SMTPUnknownError
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: IOError
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: TimeoutError
  type: :BULLET
full_name: Net::SMTP::start
is_singleton: true
name: start
params: (address, port = nil, helo = 'localhost.localdomain', user = nil, secret = nil, authtype = nil) {|smtp| ...}
visibility: public
PK�|[�-�.ri/1.8/system/Net/SMTP/default_tls_port-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The default SMTPS port number, 465.
full_name: Net::SMTP::default_tls_port
is_singleton: true
name: default_tls_port
params: ()
visibility: public
PK�|[��H���)ri/1.8/system/Net/SMTP/auth_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#auth_method
is_singleton: false
name: auth_method
params: (type)
visibility: private
PK�|[(�O��3ri/1.8/system/Net/SMTP/Response/capabilities-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP::Response#capabilities
is_singleton: false
name: capabilities
params: ()
visibility: public
PK�|[����2ri/1.8/system/Net/SMTP/Response/continue%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP::Response#continue?
is_singleton: false
name: continue?
params: ()
visibility: public
PK�|[�����7ri/1.8/system/Net/SMTP/Response/status_type_char-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP::Response#status_type_char
is_singleton: false
name: status_type_char
params: ()
visibility: public
PK�|[��y��,ri/1.8/system/Net/SMTP/Response/parse-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP::Response::parse
is_singleton: true
name: parse
params: (str)
visibility: public
PK�|[d#���*ri/1.8/system/Net/SMTP/Response/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP::Response::new
is_singleton: true
name: new
params: (status, string)
visibility: public
PK�|[�j)!!3ri/1.8/system/Net/SMTP/Response/cdesc-Response.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: status
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: string
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: parse
comment: 
constants: []

full_name: Net::SMTP::Response
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: capabilities
- !ruby/object:RI::MethodSummary 
  name: continue?
- !ruby/object:RI::MethodSummary 
  name: cram_md5_challenge
- !ruby/object:RI::MethodSummary 
  name: exception_class
- !ruby/object:RI::MethodSummary 
  name: message
- !ruby/object:RI::MethodSummary 
  name: status_type_char
- !ruby/object:RI::MethodSummary 
  name: success?
name: Response
superclass: Object
PK�|[������9ri/1.8/system/Net/SMTP/Response/cram_md5_challenge-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP::Response#cram_md5_challenge
is_singleton: false
name: cram_md5_challenge
params: ()
visibility: public
PK�|[�[����6ri/1.8/system/Net/SMTP/Response/exception_class-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP::Response#exception_class
is_singleton: false
name: exception_class
params: ()
visibility: public
PK�|[���/��1ri/1.8/system/Net/SMTP/Response/success%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP::Response#success?
is_singleton: false
name: success?
params: ()
visibility: public
PK�|[��- ��.ri/1.8/system/Net/SMTP/Response/message-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP::Response#message
is_singleton: false
name: message
params: ()
visibility: public
PK�|[{j���+ri/1.8/system/Net/SMTP/auth_cram_md5-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::SMTP#auth_cram_md5
is_singleton: false
name: auth_cram_md5
params: (user, secret)
visibility: public
PK�|[M���5ri/1.8/system/Net/SMTP/default_submission_port-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The default mail submission port number, 587.
full_name: Net::SMTP::default_submission_port
is_singleton: true
name: default_submission_port
params: ()
visibility: public
PK�|[aT0ri/1.8/system/Net/SMTP/starttls_always%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: true if this object uses STARTTLS.
full_name: Net::SMTP#starttls_always?
is_singleton: false
name: starttls_always?
params: ()
visibility: public
PK�|[���,ri/1.8/system/Net/HTTPResponse/entity-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #body"
full_name: Net::HTTPResponse#entity
is_singleton: false
name: entity
params: ()
visibility: public
PK�|[�lXM��1ri/1.8/system/Net/HTTPResponse/read_body_0-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPResponse#read_body_0
is_singleton: false
name: read_body_0
params: (dest)
visibility: private
PK�|[`�X
��.ri/1.8/system/Net/HTTPResponse/procdest-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPResponse#procdest
is_singleton: false
name: procdest
params: (dest, block)
visibility: private
PK�|[]Ƴ���6ri/1.8/system/Net/HTTPResponse/read_status_line-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPResponse::read_status_line
is_singleton: true
name: read_status_line
params: (sock)
visibility: private
PK�|[�q����:ri/1.8/system/Net/HTTPResponse/each_response_header-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: m[1], m.post_match
comment: 
full_name: Net::HTTPResponse::each_response_header
is_singleton: true
name: each_response_header
params: (sock) {|m[1], m.post_match| ...}
visibility: private
PK�|[ͅ��zz*ri/1.8/system/Net/HTTPResponse/body-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: entity
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the entity body.
- !ruby/struct:SM::Flow::P 
  body: Calling this method a second or subsequent time will return the already read string.
- !ruby/struct:SM::Flow::VERB 
  body: "  http.request_get('/index.html') {|res|\n    puts res.body\n  }\n\n  http.request_get('/index.html') {|res|\n    p res.body.object_id   # 538149362\n    p res.body.object_id   # 538149362\n  }\n"
full_name: Net::HTTPResponse#body
is_singleton: false
name: body
params: ()
visibility: public
PK�|[J`����4ri/1.8/system/Net/HTTPResponse/response_class-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPResponse::response_class
is_singleton: true
name: response_class
params: (code)
visibility: private
PK�|[��{Xqq,ri/1.8/system/Net/HTTPResponse/to_ary-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: For backward compatibility. To allow Net::HTTP 1.1 style assignment e.g.
- !ruby/struct:SM::Flow::VERB 
  body: "   response, body = Net::HTTP.get(....)\n"
full_name: Net::HTTPResponse#to_ary
is_singleton: false
name: to_ary
params: ()
visibility: public
PK�|[:���-ri/1.8/system/Net/HTTPResponse/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPResponse#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�|[�1i7ri/1.8/system/Net/HTTPResponse/body_permitted%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: true if the response has body.
full_name: Net::HTTPResponse::body_permitted?
is_singleton: true
name: body_permitted?
params: ()
visibility: public
PK�|[[L���2ri/1.8/system/Net/HTTPResponse/read_chunked-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPResponse#read_chunked
is_singleton: false
name: read_chunked
params: (dest)
visibility: private
PK�|[9��mm/ri/1.8/system/Net/HTTPResponse/read_body-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Gets entity body. If the block given, yields it to <tt>block</tt>. The body is provided in fragments, as it is read in from the socket.
- !ruby/struct:SM::Flow::P 
  body: Calling this method a second or subsequent time will return the already read string.
- !ruby/struct:SM::Flow::VERB 
  body: "  http.request_get('/index.html') {|res|\n    puts res.read_body\n  }\n\n  http.request_get('/index.html') {|res|\n    p res.read_body.object_id   # 538149362\n    p res.read_body.object_id   # 538149362\n  }\n\n  # using iterator\n  http.request_get('/index.html') {|res|\n    res.read_body do |segment|\n      print segment\n    end\n  }\n"
full_name: Net::HTTPResponse#read_body
is_singleton: false
name: read_body
params: (dest = nil, &block)
visibility: public
PK�|[����6ri/1.8/system/Net/HTTPResponse/cdesc-HTTPResponse.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: HTTP result code string. For example, '302'. You can also determine the response type by which response subclass the response object is an instance of.
  name: code
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The HTTP version supported by the server.
  name: http_version
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: HTTP result message. For example, 'Not Found'.
  name: message
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: body_permitted?
- !ruby/object:RI::MethodSummary 
  name: each_response_header
- !ruby/object:RI::MethodSummary 
  name: read_status_line
- !ruby/object:RI::MethodSummary 
  name: response_class
comment: 
- !ruby/struct:SM::Flow::P 
  body: HTTP response class. This class wraps response header and entity. Mixes in the HTTPHeader module, which provides access to response header values both via hash-like methods and individual readers. Note that each possible HTTP response code defines its own HTTPResponse subclass. These are listed below. All classes are defined under the Net module. Indentation indicates inheritance.
- !ruby/struct:SM::Flow::VERB 
  body: "  xxx        HTTPResponse\n\n    1xx        HTTPInformation\n      100        HTTPContinue\n      101        HTTPSwitchProtocol\n\n    2xx        HTTPSuccess\n      200        HTTPOK\n      201        HTTPCreated\n      202        HTTPAccepted\n      203        HTTPNonAuthoritativeInformation\n      204        HTTPNoContent\n      205        HTTPResetContent\n      206        HTTPPartialContent\n\n    3xx        HTTPRedirection\n      300        HTTPMultipleChoice\n      301        HTTPMovedPermanently\n      302        HTTPFound\n      303        HTTPSeeOther\n      304        HTTPNotModified\n      305        HTTPUseProxy\n      307        HTTPTemporaryRedirect\n\n    4xx        HTTPClientError\n      400        HTTPBadRequest\n      401        HTTPUnauthorized\n      402        HTTPPaymentRequired\n      403        HTTPForbidden\n      404        HTTPNotFound\n      405        HTTPMethodNotAllowed\n      406        HTTPNotAcceptable\n      407        HTTPProxyAuthenticationRequired\n      408        HTTPRequestTimeOut\n      409        HTTPConflict\n      410        HTTPGone\n      411        HTTPLengthRequired\n      412        HTTPPreconditionFailed\n      413        HTTPRequestEntityTooLarge\n      414        HTTPRequestURITooLong\n      415        HTTPUnsupportedMediaType\n      416        HTTPRequestedRangeNotSatisfiable\n      417        HTTPExpectationFailed\n\n    5xx        HTTPServerError\n      500        HTTPInternalServerError\n      501        HTTPNotImplemented\n      502        HTTPBadGateway\n      503        HTTPServiceUnavailable\n      504        HTTPGatewayTimeOut\n      505        HTTPVersionNotSupported\n\n    xxx        HTTPUnknownResponse\n"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: CODE_CLASS_TO_OBJ
  value: "{       '1' => HTTPInformation,       '2' => HTTPSuccess,       '3' => HTTPRedirection,       '4' => HTTPClientError,       '5' => HTTPServerError"
- !ruby/object:RI::Constant 
  comment: 
  name: CODE_TO_OBJ
  value: "{       '100' => HTTPContinue,       '101' => HTTPSwitchProtocol,        '200' => HTTPOK,       '201' => HTTPCreated,       '202' => HTTPAccepted,       '203' => HTTPNonAuthoritativeInformation,       '204' => HTTPNoContent,       '205' => HTTPResetContent,       '206' => HTTPPartialContent,        '300' => HTTPMultipleChoice,       '301' => HTTPMovedPermanently,       '302' => HTTPFound,       '303' => HTTPSeeOther,       '304' => HTTPNotModified,       '305' => HTTPUseProxy,       '307' => HTTPTemporaryRedirect,        '400' => HTTPBadRequest,       '401' => HTTPUnauthorized,       '402' => HTTPPaymentRequired,       '403' => HTTPForbidden,       '404' => HTTPNotFound,       '405' => HTTPMethodNotAllowed,       '406' => HTTPNotAcceptable,       '407' => HTTPProxyAuthenticationRequired,       '408' => HTTPRequestTimeOut,       '409' => HTTPConflict,       '410' => HTTPGone,       '411' => HTTPLengthRequired,       '412' => HTTPPreconditionFailed,       '413' => HTTPRequestEntityTooLarge,       '414' => HTTPRequestURITooLong,       '415' => HTTPUnsupportedMediaType,       '416' => HTTPRequestedRangeNotSatisfiable,       '417' => HTTPExpectationFailed,        '500' => HTTPInternalServerError,       '501' => HTTPNotImplemented,       '502' => HTTPBadGateway,       '503' => HTTPServiceUnavailable,       '504' => HTTPGatewayTimeOut,       '505' => HTTPVersionNotSupported"
full_name: Net::HTTPResponse
includes: 
- !ruby/object:RI::IncludedModule 
  name: HTTPHeader
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: body
- !ruby/object:RI::MethodSummary 
  name: entity
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: procdest
- !ruby/object:RI::MethodSummary 
  name: read_body
- !ruby/object:RI::MethodSummary 
  name: read_body_0
- !ruby/object:RI::MethodSummary 
  name: read_chunked
- !ruby/object:RI::MethodSummary 
  name: stream_check
- !ruby/object:RI::MethodSummary 
  name: to_ary
- !ruby/object:RI::MethodSummary 
  name: value
name: HTTPResponse
superclass: Object
PK�|[����2ri/1.8/system/Net/HTTPResponse/stream_check-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTPResponse#stream_check
is_singleton: false
name: stream_check
params: ()
visibility: private
PK�|[6M~[+ri/1.8/system/Net/HTTPResponse/value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Raises HTTP error if the response is not 2xx.
full_name: Net::HTTPResponse#value
is_singleton: false
name: value
params: ()
visibility: public
PK�|[%j�0ri/1.8/system/Net/SMTPError/cdesc-SMTPError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Module mixed in to all SMTP error classes
constants: []

full_name: Net::SMTPError
includes: []

instance_methods: []

name: SMTPError
superclass: 
PK�|[��aQ��2ri/1.8/system/Net/BufferedIO/cdesc-BufferedIO.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::BufferedIO
includes: []

instance_methods: []

name: BufferedIO
superclass: Object
PK�|[)����@ri/1.8/system/Net/ProtoCommandError/cdesc-ProtoCommandError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::ProtoCommandError
includes: []

instance_methods: []

name: ProtoCommandError
superclass: ProtocolError
PK�|[�>&ri/1.8/system/Net/IMAP/uid_copy-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "As for #copy(), but <tt>set</tt> contains unique identifiers."
full_name: Net::IMAP#uid_copy
is_singleton: false
name: uid_copy
params: (set, mailbox)
visibility: public
PK�|[eH	RLL(ri/1.8/system/Net/IMAP/uid_thread-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "As for #thread(), but returns unique identifiers instead of message sequence numbers."
full_name: Net::IMAP#uid_thread
is_singleton: false
name: uid_thread
params: (algorithm, search_keys, charset)
visibility: public
PK�|[��\�,,Ari/1.8/system/Net/IMAP/DataFormatError/cdesc-DataFormatError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Error raised when data is in the incorrect format.
constants: []

full_name: Net::IMAP::DataFormatError
includes: []

instance_methods: []

name: DataFormatError
superclass: Error
PK�|[�Bm���/ri/1.8/system/Net/IMAP/receive_responses-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#receive_responses
is_singleton: false
name: receive_responses
params: ()
visibility: private
PK�|[a�5�(ri/1.8/system/Net/IMAP/uid_search-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "As for #search(), but returns unique identifiers."
full_name: Net::IMAP#uid_search
is_singleton: false
name: uid_search
params: (keys, charset = nil)
visibility: public
PK�|[��fNN=ri/1.8/system/Net/IMAP/ResponseError/cdesc-ResponseError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Superclass of all errors used to encapsulate &quot;fail&quot; responses from the server.
constants: []

full_name: Net::IMAP::ResponseError
includes: []

instance_methods: []

name: ResponseError
superclass: Error
PK�|[�����,ri/1.8/system/Net/IMAP/store_internal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#store_internal
is_singleton: false
name: store_internal
params: (cmd, set, attr, flags)
visibility: private
PK�|[yG�	��"ri/1.8/system/Net/IMAP/lsub-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Sends a LSUB command, and returns a subset of names from the set of names that the user has declared as being &quot;active&quot; or &quot;subscribed&quot;. <tt>refname</tt> and <tt>mailbox</tt> are interpreted as for #list(). The return value is an array of +Net::IMAP::MailboxList+."
full_name: Net::IMAP#lsub
is_singleton: false
name: lsub
params: (refname, mailbox)
visibility: public
PK�|[��4y__)ri/1.8/system/Net/IMAP/decode_utf7-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Decode a string from modified UTF-7 format to UTF-8.
- !ruby/struct:SM::Flow::P 
  body: UTF-7 is a 7-bit encoding of Unicode [UTF7]. IMAP uses a slightly modified version of this to encode mailbox names containing non-ASCII characters; see [IMAP] section 5.1.3.
- !ruby/struct:SM::Flow::P 
  body: Net::IMAP does <em>not</em> automatically encode and decode mailbox names to and from utf7.
full_name: Net::IMAP::decode_utf7
is_singleton: true
name: decode_utf7
params: (s)
visibility: public
PK�|[��H9MM$ri/1.8/system/Net/IMAP/select-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a SELECT command to select a <tt>mailbox</tt> so that messages in the <tt>mailbox</tt> can be accessed.
- !ruby/struct:SM::Flow::P 
  body: "After you have selected a mailbox, you may retrieve the number of items in that mailbox from @responses[&quot;EXISTS&quot;][-1], and the number of recent messages from @responses[&quot;RECENT&quot;][-1]. Note that these values can change if new messages arrive during a session; see #add_response_handler() for a way of detecting this event."
- !ruby/struct:SM::Flow::P 
  body: A Net::IMAP::NoResponseError is raised if the mailbox does not exist or is for some reason non-selectable.
full_name: Net::IMAP#select
is_singleton: false
name: select
params: (mailbox)
visibility: public
PK�|[�#M���:ri/1.8/system/Net/IMAP/normalize_searching_criteria-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#normalize_searching_criteria
is_singleton: false
name: normalize_searching_criteria
params: (keys)
visibility: private
PK�|[�B����(ri/1.8/system/Net/IMAP/disconnect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Disconnects from the server.
full_name: Net::IMAP#disconnect
is_singleton: false
name: disconnect
params: ()
visibility: public
PK�|[��'''ri/1.8/system/Net/IMAP/subscribe-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Sends a SUBSCRIBE command to add the specified <tt>mailbox</tt> name to the server's set of &quot;active&quot; or &quot;subscribed&quot; mailboxes as returned by #lsub()."
- !ruby/struct:SM::Flow::P 
  body: A Net::IMAP::NoResponseError is raised if <tt>mailbox</tt> cannot be subscribed to, for instance because it does not exist.
full_name: Net::IMAP#subscribe
is_singleton: false
name: subscribe
params: (mailbox)
visibility: public
PK�|[旋���-ri/1.8/system/Net/IMAP/search_internal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#search_internal
is_singleton: false
name: search_internal
params: (cmd, keys, charset)
visibility: private
PK�|[�����2ri/1.8/system/Net/IMAP/add_response_handler-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds a response handler. For example, to detect when the server sends us a new EXISTS response (which normally indicates new messages being added to the mail box), you could add the following handler after selecting the mailbox.
- !ruby/struct:SM::Flow::VERB 
  body: "  imap.add_response_handler { |resp|\n    if resp.kind_of?(Net::IMAP::UntaggedResponse) and resp.name == &quot;EXISTS&quot;\n      puts &quot;Mailbox now has #{resp.data} messages&quot;\n    end\n  }\n"
full_name: Net::IMAP#add_response_handler
is_singleton: false
name: add_response_handler
params: (handler = Proc.new)
visibility: public
PK�|[�S��?ri/1.8/system/Net/IMAP/ResponseParser/cdesc-ResponseParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::IMAP::ResponseParser
includes: []

instance_methods: []

name: ResponseParser
superclass: Object
PK�|[Aw���#ri/1.8/system/Net/IMAP/store-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Sends a STORE command to alter data associated with messages in the mailbox, in particular their flags. The <tt>set</tt> parameter is a number or an array of numbers or a Range object. Each number is a message sequence number. <tt>attr</tt> is the name of a data item to store: 'FLAGS' means to replace the message's flag list with the provided one; '+FLAGS' means to add the provided flags; and '-FLAGS' means to remove them. <tt>flags</tt> is a list of flags."
- !ruby/struct:SM::Flow::P 
  body: "The return value is an array of Net::IMAP::FetchData. For example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  p imap.store(6..8, &quot;+FLAGS&quot;, [:Deleted])\n  #=&gt; [#&lt;Net::IMAP::FetchData seqno=6, attr={&quot;FLAGS&quot;=&gt;[:Seen, :Deleted]}&gt;, \\\n       #&lt;Net::IMAP::FetchData seqno=7, attr={&quot;FLAGS&quot;=&gt;[:Seen, :Deleted]}&gt;, \\\n       #&lt;Net::IMAP::FetchData seqno=8, attr={&quot;FLAGS&quot;=&gt;[:Seen, :Deleted]}&gt;]\n"
full_name: Net::IMAP#store
is_singleton: false
name: store
params: (set, attr, flags)
visibility: public
PK�|[b�����$ri/1.8/system/Net/IMAP/setacl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends the SETACL command along with <tt>mailbox</tt>, <tt>user</tt> and the <tt>rights</tt> that user is to have on that mailbox. If <tt>rights</tt> is nil, then that user will be stripped of any rights to that mailbox. The IMAP ACL commands are described in [RFC-2086].
full_name: Net::IMAP#setacl
is_singleton: false
name: setacl
params: (mailbox, user, rights)
visibility: public
PK�|[�}4-ri/1.8/system/Net/IMAP/Error/cdesc-Error.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Superclass of IMAP errors.
constants: []

full_name: Net::IMAP::Error
includes: []

instance_methods: []

name: Error
superclass: StandardError
PK�|[%V���&ri/1.8/system/Net/IMAP/setquota-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a SETQUOTA command along with the specified <tt>mailbox</tt> and <tt>quota</tt>. If <tt>quota</tt> is nil, then quota will be unset for that mailbox. Typically one needs to be logged in as server admin for this to work. The IMAP quota commands are described in [RFC-2087].
full_name: Net::IMAP#setquota
is_singleton: false
name: setquota
params: (mailbox, quota)
visibility: public
PK�|[m��

)ri/1.8/system/Net/IMAP/encode_utf7-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Encode a string from UTF-8 format to modified UTF-7.
full_name: Net::IMAP::encode_utf7
is_singleton: true
name: encode_utf7
params: (s)
visibility: public
PK�|[+_���$ri/1.8/system/Net/IMAP/create-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a CREATE command to create a new <tt>mailbox</tt>.
- !ruby/struct:SM::Flow::P 
  body: A Net::IMAP::NoResponseError is raised if a mailbox with that name cannot be created.
full_name: Net::IMAP#create
is_singleton: false
name: create
params: (mailbox)
visibility: public
PK�|[;�S�..&ri/1.8/system/Net/IMAP/uid_sort-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "As for #sort(), but returns an array of unique identifiers."
full_name: Net::IMAP#uid_sort
is_singleton: false
name: uid_sort
params: (sort_keys, search_keys, charset)
visibility: public
PK�|[&�G�;;%ri/1.8/system/Net/IMAP/examine-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Sends a EXAMINE command to select a <tt>mailbox</tt> so that messages in the <tt>mailbox</tt> can be accessed. Behaves the same as #select(), except that the selected <tt>mailbox</tt> is identified as read-only."
- !ruby/struct:SM::Flow::P 
  body: A Net::IMAP::NoResponseError is raised if the mailbox does not exist or is for some reason non-examinable.
full_name: Net::IMAP#examine
is_singleton: false
name: examine
params: (mailbox)
visibility: public
PK�|[vZ�ݹ�*ri/1.8/system/Net/IMAP/send_literal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#send_literal
is_singleton: false
name: send_literal
params: (str)
visibility: private
PK�|[>����$ri/1.8/system/Net/IMAP/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a DELETE command to remove the <tt>mailbox</tt>.
- !ruby/struct:SM::Flow::P 
  body: A Net::IMAP::NoResponseError is raised if a mailbox with that name cannot be deleted, either because it does not exist or because the client does not have permission to delete it.
full_name: Net::IMAP#delete
is_singleton: false
name: delete
params: (mailbox)
visibility: public
PK�|[��jf��7ri/1.8/system/Net/IMAP/MessageSet/cdesc-MessageSet.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::IMAP::MessageSet
includes: []

instance_methods: []

name: MessageSet
superclass: Object
PK�|[�W��#ri/1.8/system/Net/IMAP/check-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a CHECK command to request a checkpoint of the currently selected mailbox. This performs implementation-specific housekeeping, for instance, reconciling the mailbox's in-memory and on-disk state.
full_name: Net::IMAP#check
is_singleton: false
name: check
params: ()
visibility: public
PK�|[�L
cc$ri/1.8/system/Net/IMAP/rename-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a RENAME command to change the name of the <tt>mailbox</tt> to <tt>newname</tt>.
- !ruby/struct:SM::Flow::P 
  body: A Net::IMAP::NoResponseError is raised if a mailbox with the name <tt>mailbox</tt> cannot be renamed to <tt>newname</tt> for whatever reason; for instance, because <tt>mailbox</tt> does not exist, or because there is already a mailbox with the name <tt>newname</tt>.
full_name: Net::IMAP#rename
is_singleton: false
name: rename
params: (mailbox, newname)
visibility: public
PK�|[�fUU��Cri/1.8/system/Net/IMAP/ByeResponseError/cdesc-ByeResponseError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Error raised upon a &quot;BYE&quot; response from the server, indicating that the client is not being allowed to login, or has been timed out due to inactivity.
constants: []

full_name: Net::IMAP::ByeResponseError
includes: []

instance_methods: []

name: ByeResponseError
superclass: ResponseError
PK�|[�R���-ri/1.8/system/Net/IMAP/record_response-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#record_response
is_singleton: false
name: record_response
params: (name, data)
visibility: private
PK�|[�	��"ri/1.8/system/Net/IMAP/noop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a NOOP command to the server. It does nothing.
full_name: Net::IMAP#noop
is_singleton: false
name: noop
params: ()
visibility: public
PK�|[��K���-ri/1.8/system/Net/IMAP/thread_internal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#thread_internal
is_singleton: false
name: thread_internal
params: (cmd, algorithm, search_keys, charset)
visibility: private
PK�|[L:K���Cri/1.8/system/Net/IMAP/BadResponseError/cdesc-BadResponseError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Error raised upon a &quot;BAD&quot; response from the server, indicating that the client command violated the IMAP protocol, or an internal server failure has occurred.
constants: []

full_name: Net::IMAP::BadResponseError
includes: []

instance_methods: []

name: BadResponseError
superclass: ResponseError
PK�|[r��+��#ri/1.8/system/Net/IMAP/debug-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the debug mode.
full_name: Net::IMAP::debug
is_singleton: true
name: debug
params: ()
visibility: public
PK�|[�8G��*ri/1.8/system/Net/IMAP/get_response-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#get_response
is_singleton: false
name: get_response
params: ()
visibility: private
PK�|[�˫~��/ri/1.8/system/Net/IMAP/add_authenticator-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds an authenticator for Net::IMAP#authenticate. <tt>auth_type</tt> is the type of authentication this authenticator supports (for instance, &quot;LOGIN&quot;). The <tt>authenticator</tt> is an object which defines a process() method to handle authentication with the server. See Net::IMAP::LoginAuthenticator and Net::IMAP::CramMD5Authenticator for examples.
- !ruby/struct:SM::Flow::P 
  body: If <tt>auth_type</tt> refers to an existing authenticator, it will be replaced by the new one.
full_name: Net::IMAP::add_authenticator
is_singleton: true
name: add_authenticator
params: (auth_type, authenticator)
visibility: public
PK�|[Mbzz(ri/1.8/system/Net/IMAP/capability-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a CAPABILITY command, and returns an array of capabilities that the server supports. Each capability is a string. See [IMAP] for a list of possible capabilities.
- !ruby/struct:SM::Flow::P 
  body: Note that the Net::IMAP class does not modify its behaviour according to the capabilities of the server; it is up to the user of the class to ensure that a certain capability is supported by a server before using it.
full_name: Net::IMAP#capability
is_singleton: false
name: capability
params: ()
visibility: public
PK�|[�G��!ri/1.8/system/Net/IMAP/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new Net::IMAP object and connects it to the specified <tt>port</tt> (143 by default) on the named <tt>host</tt>. If <tt>usessl</tt> is true, then an attempt will be made to use SSL (now TLS) to connect to the server. For this to work OpenSSL [OSSL] and the Ruby OpenSSL [RSSL] extensions need to be installed. The <tt>certs</tt> parameter indicates the path or file containing the CA cert of the server, and the <tt>verify</tt> parameter is for the OpenSSL verification callback.
- !ruby/struct:SM::Flow::P 
  body: "The most common errors are:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "Errno::ECONNREFUSED:"
    body: connection refused by <tt>host</tt> or an intervening firewall.
  - !ruby/struct:SM::Flow::LI 
    label: "Errno::ETIMEDOUT:"
    body: connection timed out (possibly due to packets being dropped by an intervening firewall).
  - !ruby/struct:SM::Flow::LI 
    label: "Errno::ENETUNREACH:"
    body: there is no route to that network.
  - !ruby/struct:SM::Flow::LI 
    label: "SocketError:"
    body: hostname not known or other socket error.
  - !ruby/struct:SM::Flow::LI 
    label: "Net::IMAP::ByeResponseError:"
    body: we connected to the host, but they immediately said goodbye to us.
  type: :NOTE
full_name: Net::IMAP::new
is_singleton: true
name: new
params: (host, port = PORT, usessl = false, certs = nil, verify = false)
visibility: public
PK�|[�����%ri/1.8/system/Net/IMAP/u16tou8-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP::u16tou8
is_singleton: true
name: u16tou8
params: (s)
visibility: private
PK�|[��4���,ri/1.8/system/Net/IMAP/fetch_internal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#fetch_internal
is_singleton: false
name: fetch_internal
params: (cmd, set, attr)
visibility: private
PK�|[ʥ�f��"ri/1.8/system/Net/IMAP/copy-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a COPY command to copy the specified message(s) to the end of the specified destination <tt>mailbox</tt>. The <tt>set</tt> parameter is a number or an array of numbers or a Range object. The number is a message sequence number.
full_name: Net::IMAP#copy
is_singleton: false
name: copy
params: (set, mailbox)
visibility: public
PK�|[��-{��;ri/1.8/system/Net/IMAP/QuotedString/cdesc-QuotedString.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::IMAP::QuotedString
includes: []

instance_methods: []

name: QuotedString
superclass: Object
PK�|[1�)��+ri/1.8/system/Net/IMAP/sort_internal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#sort_internal
is_singleton: false
name: sort_internal
params: (cmd, sort_keys, search_keys, charset)
visibility: private
PK�|[?]?���7ri/1.8/system/Net/IMAP/BodyTypeText/multipart%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP::BodyTypeText#multipart?
is_singleton: false
name: multipart?
params: ()
visibility: public
PK�|[S�8ri/1.8/system/Net/IMAP/BodyTypeText/media_subtype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Obsolete: use <tt>subtype</tt> instead. Calling this will generate a warning message to <tt>stderr</tt>, then return the value of <tt>subtype</tt>."
full_name: Net::IMAP::BodyTypeText#media_subtype
is_singleton: false
name: media_subtype
params: ()
visibility: public
PK�|[8J�"";ri/1.8/system/Net/IMAP/BodyTypeText/cdesc-BodyTypeText.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Net::IMAP::BodyTypeText represents TEXT body structures of messages.
- !ruby/struct:SM::Flow::H 
  level: 4
  text: "Fields:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "lines:"
    body: Returns the size of the body in text lines.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: And Net::IMAP::BodyTypeText has all fields of Net::IMAP::BodyTypeBasic.
constants: []

full_name: Net::IMAP::BodyTypeText
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: media_subtype
- !ruby/object:RI::MethodSummary 
  name: multipart?
name: BodyTypeText
superclass: Struct.new(:media_type, :subtype,                                     :param, :content_id,                                     :description, :encoding, :size,                                     :lines,                                     :md5, :disposition, :language,                                     :extension)
PK�|[dg�OO%ri/1.8/system/Net/IMAP/expunge-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a EXPUNGE command to permanently remove from the currently selected mailbox all messages that have the \Deleted flag set.
full_name: Net::IMAP#expunge
is_singleton: false
name: expunge
params: ()
visibility: public
PK�|[:P�a$ri/1.8/system/Net/IMAP/append-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Sends a APPEND command to append the <tt>message</tt> to the end of the <tt>mailbox</tt>. The optional <tt>flags</tt> argument is an array of flags to initially passing to the new message. The optional <tt>date_time</tt> argument specifies the creation time to assign to the new message; it defaults to the current time. For example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  imap.append(&quot;inbox&quot;, &lt;&lt;EOF.gsub(/\\n/, &quot;\\r\\n&quot;), [:Seen], Time.now)\n  Subject: hello\n  From: shugo@ruby-lang.org\n  To: shugo@ruby-lang.org\n\n  hello world\n  EOF\n"
- !ruby/struct:SM::Flow::P 
  body: A Net::IMAP::NoResponseError is raised if the mailbox does not exist (it is not created automatically), or if the flags, date_time, or message arguments contain errors.
full_name: Net::IMAP#append
is_singleton: false
name: append
params: (mailbox, message, flags = nil, date_time = nil)
visibility: public
PK�|[;�c��8ri/1.8/system/Net/IMAP/BodyTypeBasic/multipart%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP::BodyTypeBasic#multipart?
is_singleton: false
name: multipart?
params: ()
visibility: public
PK�|[�D�-��9ri/1.8/system/Net/IMAP/BodyTypeBasic/media_subtype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Obsolete: use <tt>subtype</tt> instead. Calling this will generate a warning message to <tt>stderr</tt>, then return the value of <tt>subtype</tt>."
full_name: Net::IMAP::BodyTypeBasic#media_subtype
is_singleton: false
name: media_subtype
params: ()
visibility: public
PK�|[�?�		=ri/1.8/system/Net/IMAP/BodyTypeBasic/cdesc-BodyTypeBasic.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Net::IMAP::BodyTypeBasic represents basic body structures of messages.
- !ruby/struct:SM::Flow::H 
  level: 4
  text: "Fields:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "media_type:"
    body: Returns the content media type name as defined in [MIME-IMB].
  - !ruby/struct:SM::Flow::LI 
    label: "subtype:"
    body: Returns the content subtype name as defined in [MIME-IMB].
  - !ruby/struct:SM::Flow::LI 
    label: "param:"
    body: Returns a hash that represents parameters as defined in [MIME-IMB].
  - !ruby/struct:SM::Flow::LI 
    label: "content_id:"
    body: Returns a string giving the content id as defined in [MIME-IMB].
  - !ruby/struct:SM::Flow::LI 
    label: "description:"
    body: Returns a string giving the content description as defined in [MIME-IMB].
  - !ruby/struct:SM::Flow::LI 
    label: "encoding:"
    body: Returns a string giving the content transfer encoding as defined in [MIME-IMB].
  - !ruby/struct:SM::Flow::LI 
    label: "size:"
    body: Returns a number giving the size of the body in octets.
  - !ruby/struct:SM::Flow::LI 
    label: "md5:"
    body: Returns a string giving the body MD5 value as defined in [MD5].
  - !ruby/struct:SM::Flow::LI 
    label: "disposition:"
    body: Returns a Net::IMAP::ContentDisposition object giving the content disposition.
  - !ruby/struct:SM::Flow::LI 
    label: "language:"
    body: Returns a string or an array of strings giving the body language value as defined in [LANGUAGE-TAGS].
  - !ruby/struct:SM::Flow::LI 
    label: "extension:"
    body: Returns extension data.
  - !ruby/struct:SM::Flow::LI 
    label: "multipart?:"
    body: Returns false.
  type: :NOTE
constants: []

full_name: Net::IMAP::BodyTypeBasic
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: media_subtype
- !ruby/object:RI::MethodSummary 
  name: multipart?
name: BodyTypeBasic
superclass: Struct.new(:media_type, :subtype,                                      :param, :content_id,                                      :description, :encoding, :size,                                      :md5, :disposition, :language,                                      :extension)
PK�|[E&|vv$ri/1.8/system/Net/IMAP/getacl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Send the GETACL command along with specified <tt>mailbox</tt>. If this mailbox exists, an array containing objects of Net::IMAP::MailboxACLItem will be returned.
full_name: Net::IMAP#getacl
is_singleton: false
name: getacl
params: (mailbox)
visibility: public
PK�|[�����&ri/1.8/system/Net/IMAP/debug%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the debug mode.
full_name: Net::IMAP::debug=
is_singleton: true
name: debug=
params: (val)
visibility: public
PK�|[���X��*ri/1.8/system/Net/IMAP/generate_tag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#generate_tag
is_singleton: false
name: generate_tag
params: ()
visibility: private
PK�|[c�-��8ri/1.8/system/Net/IMAP/LoginAuthenticator/process-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP::LoginAuthenticator#process
is_singleton: false
name: process
params: (data)
visibility: public
PK�|[;�C��4ri/1.8/system/Net/IMAP/LoginAuthenticator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP::LoginAuthenticator::new
is_singleton: true
name: new
params: (user, password)
visibility: public
PK�|[^/�KMMGri/1.8/system/Net/IMAP/LoginAuthenticator/cdesc-LoginAuthenticator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Authenticator for the &quot;LOGIN&quot; authentication type. See #authenticate()."
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: STATE_USER
  value: ":USER"
- !ruby/object:RI::Constant 
  comment: 
  name: STATE_PASSWORD
  value: ":PASSWORD"
full_name: Net::IMAP::LoginAuthenticator
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: process
name: LoginAuthenticator
superclass: Object
PK�|[wnW::$ri/1.8/system/Net/IMAP/status-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Sends a STATUS command, and returns the status of the indicated <tt>mailbox</tt>. <tt>attr</tt> is a list of one or more attributes that we are request the status of. Supported attributes include:"
- !ruby/struct:SM::Flow::VERB 
  body: "  MESSAGES:: the number of messages in the mailbox.\n  RECENT:: the number of recent messages in the mailbox.\n  UNSEEN:: the number of unseen messages in the mailbox.\n"
- !ruby/struct:SM::Flow::P 
  body: "The return value is a hash of attributes. For example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  p imap.status(&quot;inbox&quot;, [&quot;MESSAGES&quot;, &quot;RECENT&quot;])\n  #=&gt; {&quot;RECENT&quot;=&gt;0, &quot;MESSAGES&quot;=&gt;44}\n"
- !ruby/struct:SM::Flow::P 
  body: A Net::IMAP::NoResponseError is raised if status values for <tt>mailbox</tt> cannot be returned, for instance because it does not exist.
full_name: Net::IMAP#status
is_singleton: false
name: status
params: (mailbox, attr)
visibility: public
PK�|[�1����:ri/1.8/system/Net/IMAP/BodyTypeMessage/multipart%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP::BodyTypeMessage#multipart?
is_singleton: false
name: multipart?
params: ()
visibility: public
PK�|[�~��;ri/1.8/system/Net/IMAP/BodyTypeMessage/media_subtype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Obsolete: use <tt>subtype</tt> instead. Calling this will generate a warning message to <tt>stderr</tt>, then return the value of <tt>subtype</tt>."
full_name: Net::IMAP::BodyTypeMessage#media_subtype
is_singleton: false
name: media_subtype
params: ()
visibility: public
PK}[�JN��Ari/1.8/system/Net/IMAP/BodyTypeMessage/cdesc-BodyTypeMessage.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Net::IMAP::BodyTypeMessage represents MESSAGE/RFC822 body structures of messages.
- !ruby/struct:SM::Flow::H 
  level: 4
  text: "Fields:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "envelope:"
    body: Returns a Net::IMAP::Envelope giving the envelope structure.
  - !ruby/struct:SM::Flow::LI 
    label: "body:"
    body: Returns an object giving the body structure.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: And Net::IMAP::BodyTypeMessage has all methods of Net::IMAP::BodyTypeText.
constants: []

full_name: Net::IMAP::BodyTypeMessage
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: media_subtype
- !ruby/object:RI::MethodSummary 
  name: multipart?
name: BodyTypeMessage
superclass: Struct.new(:media_type, :subtype,                                        :param, :content_id,                                        :description, :encoding, :size,                                        :envelope, :body, :lines,                                        :md5, :disposition, :language,                                        :extension)
PK}[g�����5ri/1.8/system/Net/IMAP/pick_up_tagged_response-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#pick_up_tagged_response
is_singleton: false
name: pick_up_tagged_response
params: (tag)
visibility: private
PK}[Z��K{K{&ri/1.8/system/Net/IMAP/cdesc-IMAP.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The thread to receive exceptions.
  name: client_thread
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Returns an initial greeting response from the server.
  name: greeting
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Returns all response handlers.
  name: response_handlers
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "Returns recorded untagged responses. For example:"
  - !ruby/struct:SM::Flow::VERB 
    body: "  imap.select(&quot;inbox&quot;)\n  p imap.responses[&quot;EXISTS&quot;][-1]\n  #=&gt; 2\n  p imap.responses[&quot;UIDVALIDITY&quot;][-1]\n  #=&gt; 968263756\n"
  name: responses
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_authenticator
- !ruby/object:RI::MethodSummary 
  name: debug
- !ruby/object:RI::MethodSummary 
  name: debug=
- !ruby/object:RI::MethodSummary 
  name: decode_utf7
- !ruby/object:RI::MethodSummary 
  name: encode_utf7
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: u16tou8
- !ruby/object:RI::MethodSummary 
  name: u8tou16
comment: 
- !ruby/struct:SM::Flow::P 
  body: Net::IMAP implements Internet Message Access Protocol (IMAP) client functionality. The protocol is described in [IMAP].
- !ruby/struct:SM::Flow::H 
  level: 2
  text: IMAP Overview
- !ruby/struct:SM::Flow::P 
  body: "An IMAP client connects to a server, and then authenticates itself using either #authenticate() or #login(). Having authenticated itself, there is a range of commands available to it. Most work with mailboxes, which may be arranged in an hierarchical namespace, and each of which contains zero or more messages. How this is implemented on the server is implementation-dependent; on a UNIX server, it will frequently be implemented as a files in mailbox format within a hierarchy of directories."
- !ruby/struct:SM::Flow::P 
  body: "To work on the messages within a mailbox, the client must first select that mailbox, using either #select() or (for read-only access) #examine(). Once the client has successfully selected a mailbox, they enter <em>selected</em> state, and that mailbox becomes the <em>current</em> mailbox, on which mail-item related commands implicitly operate."
- !ruby/struct:SM::Flow::P 
  body: "Messages have two sorts of identifiers: message sequence numbers, and UIDs."
- !ruby/struct:SM::Flow::P 
  body: Message sequence numbers number messages within a mail box from 1 up to the number of items in the mail box. If new message arrives during a session, it receives a sequence number equal to the new size of the mail box. If messages are expunged from the mailbox, remaining messages have their sequence numbers &quot;shuffled down&quot; to fill the gaps.
- !ruby/struct:SM::Flow::P 
  body: UIDs, on the other hand, are permanently guaranteed not to identify another message within the same mailbox, even if the existing message is deleted. UIDs are required to be assigned in ascending (but not necessarily sequential) order within a mailbox; this means that if a non-IMAP client rearranges the order of mailitems within a mailbox, the UIDs have to be reassigned. An IMAP client cannot thus rearrange message orders.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Examples of Usage
- !ruby/struct:SM::Flow::H 
  level: 3
  text: List sender and subject of all recent messages in the default mailbox
- !ruby/struct:SM::Flow::VERB 
  body: "  imap = Net::IMAP.new('mail.example.com')\n  imap.authenticate('LOGIN', 'joe_user', 'joes_password')\n  imap.examine('INBOX')\n  imap.search([&quot;RECENT&quot;]).each do |message_id|\n    envelope = imap.fetch(message_id, &quot;ENVELOPE&quot;)[0].attr[&quot;ENVELOPE&quot;]\n    puts &quot;#{envelope.from[0].name}: \\t#{envelope.subject}&quot;\n  end\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Move all messages from April 2003 from &quot;Mail/sent-mail&quot; to &quot;Mail/sent-apr03&quot;
- !ruby/struct:SM::Flow::VERB 
  body: "  imap = Net::IMAP.new('mail.example.com')\n  imap.authenticate('LOGIN', 'joe_user', 'joes_password')\n  imap.select('Mail/sent-mail')\n  if not imap.list('Mail/', 'sent-apr03')\n    imap.create('Mail/sent-apr03')\n  end\n  imap.search([&quot;BEFORE&quot;, &quot;30-Apr-2003&quot;, &quot;SINCE&quot;, &quot;1-Apr-2003&quot;]).each do |message_id|\n    imap.copy(message_id, &quot;Mail/sent-apr03&quot;)\n    imap.store(message_id, &quot;+FLAGS&quot;, [:Deleted])\n  end\n  imap.expunge\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Thread Safety
- !ruby/struct:SM::Flow::P 
  body: Net::IMAP supports concurrent threads. For example,
- !ruby/struct:SM::Flow::VERB 
  body: "  imap = Net::IMAP.new(&quot;imap.foo.net&quot;, &quot;imap2&quot;)\n  imap.authenticate(&quot;cram-md5&quot;, &quot;bar&quot;, &quot;password&quot;)\n  imap.select(&quot;inbox&quot;)\n  fetch_thread = Thread.start { imap.fetch(1..-1, &quot;UID&quot;) }\n  search_result = imap.search([&quot;BODY&quot;, &quot;hello&quot;])\n  fetch_result = fetch_thread.value\n  imap.disconnect\n"
- !ruby/struct:SM::Flow::P 
  body: This script invokes the FETCH command and the SEARCH command concurrently.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Errors
- !ruby/struct:SM::Flow::P 
  body: "An IMAP server can send three different types of responses to indicate failure:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "NO:"
    body: the attempted command could not be successfully completed. For instance, the username/password used for logging in are incorrect; the selected mailbox does not exists; etc.
  - !ruby/struct:SM::Flow::LI 
    label: "BAD:"
    body: the request from the client does not follow the server's understanding of the IMAP protocol. This includes attempting commands from the wrong client state; for instance, attempting to perform a SEARCH command without having SELECTed a current mailbox. It can also signal an internal server failure (such as a disk crash) has occurred.
  - !ruby/struct:SM::Flow::LI 
    label: "BYE:"
    body: the server is saying goodbye. This can be part of a normal logout sequence, and can be used as part of a login sequence to indicate that the server is (for some reason) unwilling to accept our connection. As a response to any other command, it indicates either that the server is shutting down, or that the server is timing out the client connection due to inactivity.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: These three error response are represented by the errors Net::IMAP::NoResponseError, Net::IMAP::BadResponseError, and Net::IMAP::ByeResponseError, all of which are subclasses of Net::IMAP::ResponseError. Essentially, all methods that involve sending a request to the server can generate one of these errors. Only the most pertinent instances have been documented below.
- !ruby/struct:SM::Flow::P 
  body: Because the IMAP class uses Sockets for communication, its methods are also susceptible to the various errors that can occur when working with sockets. These are generally represented as Errno errors. For instance, any method that involves sending a request to the server and/or receiving a response from it could raise an Errno::EPIPE error if the network connection unexpectedly goes down. See the socket(7), ip(7), tcp(7), socket(2), connect(2), and associated man pages.
- !ruby/struct:SM::Flow::P 
  body: Finally, a Net::IMAP::DataFormatError is thrown if low-level data is found to be in an incorrect format (for instance, when converting between UTF-8 and UTF-16), and Net::IMAP::ResponseParseError is thrown if a server response is non-parseable.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: References
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "[IMAP]"
    body: "M. Crispin, &quot;INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1&quot;, RFC 2060, December 1996. (Note: since obsoleted by RFC 3501)"
  - !ruby/struct:SM::Flow::LI 
    label: "[LANGUAGE-TAGS]"
    body: Alvestrand, H., &quot;Tags for the Identification of Languages&quot;, RFC 1766, March 1995.
  - !ruby/struct:SM::Flow::LI 
    label: "[MD5]"
    body: Myers, J., and M. Rose, &quot;The Content-MD5 Header Field&quot;, RFC 1864, October 1995.
  - !ruby/struct:SM::Flow::LI 
    label: "[MIME-IMB]"
    body: "Freed, N., and N. Borenstein, &quot;MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies&quot;, RFC 2045, November 1996."
  - !ruby/struct:SM::Flow::LI 
    label: "[RFC-822]"
    body: Crocker, D., &quot;Standard for the Format of ARPA Internet Text Messages&quot;, STD 11, RFC 822, University of Delaware, August 1982.
  - !ruby/struct:SM::Flow::LI 
    label: "[RFC-2087]"
    body: Myers, J., &quot;IMAP4 QUOTA extension&quot;, RFC 2087, January 1997.
  - !ruby/struct:SM::Flow::LI 
    label: "[RFC-2086]"
    body: Myers, J., &quot;IMAP4 ACL extension&quot;, RFC 2086, January 1997.
  - !ruby/struct:SM::Flow::LI 
    label: "[RFC-2195]"
    body: Klensin, J., Catoe, R., and Krumviede, P., &quot;IMAP/POP AUTHorize Extension for Simple Challenge/Response&quot;, RFC 2195, September 1997.
  - !ruby/struct:SM::Flow::LI 
    label: "[SORT-THREAD-EXT]"
    body: Crispin, M., &quot;INTERNET MESSAGE ACCESS PROTOCOL - SORT and THREAD Extensions&quot;, draft-ietf-imapext-sort, May 2003.
  - !ruby/struct:SM::Flow::LI 
    label: "[OSSL]"
    body: http://www.openssl.org
  - !ruby/struct:SM::Flow::LI 
    label: "[RSSL]"
    body: http://savannah.gnu.org/projects/rubypki
  - !ruby/struct:SM::Flow::LI 
    label: "[UTF7]"
    body: "Goldsmith, D. and Davis, M., &quot;UTF-7: A Mail-Safe Transformation Format of Unicode&quot;, RFC 2152, May 1997."
  type: :LABELED
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Flag indicating a message has been seen
  name: SEEN
  value: ":Seen"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Flag indicating a message has been answered
  name: ANSWERED
  value: ":Answered"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Flag indicating a message has been flagged for special or urgent attention
  name: FLAGGED
  value: ":Flagged"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Flag indicating a message has been marked for deletion. This will occur when the mailbox is closed or expunged.
  name: DELETED
  value: ":Deleted"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Flag indicating a message is only a draft or work-in-progress version.
  name: DRAFT
  value: ":Draft"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Flag indicating that the message is &quot;recent&quot;, meaning that this session is the first session in which the client has been notified of this message.
  name: RECENT
  value: ":Recent"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Flag indicating that a mailbox context name cannot contain children.
  name: NOINFERIORS
  value: ":Noinferiors"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Flag indicating that a mailbox is not selected.
  name: NOSELECT
  value: ":Noselect"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Flag indicating that a mailbox has been marked &quot;interesting&quot; by the server; this commonly indicates that the mailbox contains new messages.
  name: MARKED
  value: ":Marked"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Flag indicating that the mailbox does not contains new messages.
  name: UNMARKED
  value: ":Unmarked"
- !ruby/object:RI::Constant 
  comment: 
  name: DATE_MONTH
  value: "%w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Net::IMAP::ContinuationRequest represents command continuation requests.
  - !ruby/struct:SM::Flow::P 
    body: The command continuation request response is indicated by a &quot;+&quot; token instead of a tag. This form of response indicates that the server is ready to accept the continuation of a command from the client. The remainder of this response is a line of text.
  - !ruby/struct:SM::Flow::VERB 
    body: "  continue_req    ::= &quot;+&quot; SPACE (resp_text / base64)\n"
  - !ruby/struct:SM::Flow::H 
    level: 4
    text: "Fields:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "data:"
      body: Returns the data (Net::IMAP::ResponseText).
    - !ruby/struct:SM::Flow::LI 
      label: "raw_data:"
      body: Returns the raw data string.
    type: :NOTE
  name: ContinuationRequest
  value: Struct.new(:data, :raw_data)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Net::IMAP::UntaggedResponse represents untagged responses.
  - !ruby/struct:SM::Flow::P 
    body: Data transmitted by the server to the client and status responses that do not indicate command completion are prefixed with the token &quot;*&quot;, and are called untagged responses.
  - !ruby/struct:SM::Flow::VERB 
    body: "  response_data   ::= &quot;*&quot; SPACE (resp_cond_state / resp_cond_bye /\n                      mailbox_data / message_data / capability_data)\n"
  - !ruby/struct:SM::Flow::H 
    level: 4
    text: "Fields:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "name:"
      body: Returns the name such as &quot;FLAGS&quot;, &quot;LIST&quot;, &quot;FETCH&quot;....
    - !ruby/struct:SM::Flow::LI 
      label: "data:"
      body: Returns the data such as an array of flag symbols,
    - !ruby/struct:SM::Flow::VERB 
      body: " a ((&lt;Net::IMAP::MailboxList&gt;)) object....\n"
    - !ruby/struct:SM::Flow::LI 
      label: "raw_data:"
      body: Returns the raw data string.
    type: :NOTE
  name: UntaggedResponse
  value: Struct.new(:name, :data, :raw_data)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Net::IMAP::TaggedResponse represents tagged responses.
  - !ruby/struct:SM::Flow::P 
    body: The server completion result response indicates the success or failure of the operation. It is tagged with the same tag as the client command which began the operation.
  - !ruby/struct:SM::Flow::VERB 
    body: "  response_tagged ::= tag SPACE resp_cond_state CRLF\n\n  tag             ::= 1*&lt;any ATOM_CHAR except &quot;+&quot;&gt;\n\n  resp_cond_state ::= (&quot;OK&quot; / &quot;NO&quot; / &quot;BAD&quot;) SPACE resp_text\n"
  - !ruby/struct:SM::Flow::H 
    level: 4
    text: "Fields:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "tag:"
      body: Returns the tag.
    - !ruby/struct:SM::Flow::LI 
      label: "name:"
      body: Returns the name. the name is one of &quot;OK&quot;, &quot;NO&quot;, &quot;BAD&quot;.
    - !ruby/struct:SM::Flow::LI 
      label: "data:"
      body: Returns the data. See ((&lt;Net::IMAP::ResponseText&gt;)).
    - !ruby/struct:SM::Flow::LI 
      label: "raw_data:"
      body: Returns the raw data string.
    type: :NOTE
  name: TaggedResponse
  value: Struct.new(:tag, :name, :data, :raw_data)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Net::IMAP::ResponseText represents texts of responses. The text may be prefixed by the response code.
  - !ruby/struct:SM::Flow::VERB 
    body: "  resp_text       ::= [&quot;[&quot; resp_text_code &quot;]&quot; SPACE] (text_mime2 / text)\n                      ;; text SHOULD NOT begin with &quot;[&quot; or &quot;=&quot;\n"
  - !ruby/struct:SM::Flow::H 
    level: 4
    text: "Fields:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "code:"
      body: Returns the response code. See ((&lt;Net::IMAP::ResponseCode&gt;)).
    - !ruby/struct:SM::Flow::LI 
      label: "text:"
      body: Returns the text.
    type: :NOTE
  name: ResponseText
  value: Struct.new(:code, :text)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Net::IMAP::ResponseCode represents response codes.
  - !ruby/struct:SM::Flow::VERB 
    body: "  resp_text_code  ::= &quot;ALERT&quot; / &quot;PARSE&quot; /\n                      &quot;PERMANENTFLAGS&quot; SPACE &quot;(&quot; #(flag / &quot;*&quot;) &quot;)&quot; /\n                      &quot;READ-ONLY&quot; / &quot;READ-WRITE&quot; / &quot;TRYCREATE&quot; /\n                      &quot;UIDVALIDITY&quot; SPACE nz_number /\n                      &quot;UNSEEN&quot; SPACE nz_number /\n                      atom [SPACE 1*&lt;any TEXT_CHAR except &quot;]&quot;&gt;]\n"
  - !ruby/struct:SM::Flow::H 
    level: 4
    text: "Fields:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "name:"
      body: Returns the name such as &quot;ALERT&quot;, &quot;PERMANENTFLAGS&quot;, &quot;UIDVALIDITY&quot;....
    - !ruby/struct:SM::Flow::LI 
      label: "data:"
      body: Returns the data if it exists.
    type: :NOTE
  name: ResponseCode
  value: Struct.new(:name, :data)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Net::IMAP::MailboxList represents contents of the LIST response.
  - !ruby/struct:SM::Flow::VERB 
    body: "  mailbox_list    ::= &quot;(&quot; #(&quot;\\Marked&quot; / &quot;\\Noinferiors&quot; /\n                      &quot;\\Noselect&quot; / &quot;\\Unmarked&quot; / flag_extension) &quot;)&quot;\n                      SPACE (&lt;&quot;&gt; QUOTED_CHAR &lt;&quot;&gt; / nil) SPACE mailbox\n"
  - !ruby/struct:SM::Flow::H 
    level: 4
    text: "Fields:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "attr:"
      body: Returns the name attributes. Each name attribute is a symbol capitalized by String#capitalize, such as :Noselect (not :NoSelect).
    - !ruby/struct:SM::Flow::LI 
      label: "delim:"
      body: Returns the hierarchy delimiter
    - !ruby/struct:SM::Flow::LI 
      label: "name:"
      body: Returns the mailbox name.
    type: :NOTE
  name: MailboxList
  value: Struct.new(:attr, :delim, :name)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Net::IMAP::MailboxQuota represents contents of GETQUOTA response. This object can also be a response to GETQUOTAROOT. In the syntax specification below, the delimiter used with the &quot;#&quot; construct is a single space (SPACE).
  - !ruby/struct:SM::Flow::VERB 
    body: "   quota_list      ::= &quot;(&quot; #quota_resource &quot;)&quot;\n\n   quota_resource  ::= atom SPACE number SPACE number\n\n   quota_response  ::= &quot;QUOTA&quot; SPACE astring SPACE quota_list\n"
  - !ruby/struct:SM::Flow::H 
    level: 4
    text: "Fields:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "mailbox:"
      body: The mailbox with the associated quota.
    - !ruby/struct:SM::Flow::LI 
      label: "usage:"
      body: Current storage usage of mailbox.
    - !ruby/struct:SM::Flow::LI 
      label: "quota:"
      body: Quota limit imposed on mailbox.
    type: :NOTE
  name: MailboxQuota
  value: Struct.new(:mailbox, :usage, :quota)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Net::IMAP::MailboxQuotaRoot represents part of the GETQUOTAROOT response. (GETQUOTAROOT can also return Net::IMAP::MailboxQuota.)
  - !ruby/struct:SM::Flow::VERB 
    body: "   quotaroot_response ::= &quot;QUOTAROOT&quot; SPACE astring *(SPACE astring)\n"
  - !ruby/struct:SM::Flow::H 
    level: 4
    text: "Fields:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "mailbox:"
      body: The mailbox with the associated quota.
    - !ruby/struct:SM::Flow::LI 
      label: "quotaroots:"
      body: Zero or more quotaroots that effect the quota on the specified mailbox.
    type: :NOTE
  name: MailboxQuotaRoot
  value: Struct.new(:mailbox, :quotaroots)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Net::IMAP::MailboxACLItem represents response from GETACL.
  - !ruby/struct:SM::Flow::VERB 
    body: "   acl_data        ::= &quot;ACL&quot; SPACE mailbox *(SPACE identifier SPACE rights)\n\n   identifier      ::= astring\n\n   rights          ::= astring\n"
  - !ruby/struct:SM::Flow::H 
    level: 4
    text: "Fields:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "user:"
      body: Login name that has certain rights to the mailbox that was specified with the getacl command.
    - !ruby/struct:SM::Flow::LI 
      label: "rights:"
      body: The access rights the indicated user has to the mailbox.
    type: :NOTE
  name: MailboxACLItem
  value: Struct.new(:user, :rights)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Net::IMAP::StatusData represents contents of the STATUS response.
  - !ruby/struct:SM::Flow::H 
    level: 4
    text: "Fields:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "mailbox:"
      body: Returns the mailbox name.
    - !ruby/struct:SM::Flow::LI 
      label: "attr:"
      body: Returns a hash. Each key is one of &quot;MESSAGES&quot;, &quot;RECENT&quot;, &quot;UIDNEXT&quot;, &quot;UIDVALIDITY&quot;, &quot;UNSEEN&quot;. Each value is a number.
    type: :NOTE
  name: StatusData
  value: Struct.new(:mailbox, :attr)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Net::IMAP::FetchData represents contents of the FETCH response.
  - !ruby/struct:SM::Flow::H 
    level: 4
    text: "Fields:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "seqno:"
      body: "Returns the message sequence number. (Note: not the unique identifier, even for the UID command response.)"
    - !ruby/struct:SM::Flow::LI 
      label: "attr:"
      body: Returns a hash. Each key is a data item name, and each value is its value.
    - !ruby/struct:SM::Flow::P 
      body: "The current data items are:"
    - !ruby/object:SM::Flow::LIST 
      contents: 
      - !ruby/struct:SM::Flow::LI 
        label: BODY
        body: A form of BODYSTRUCTURE without extension data.
      - !ruby/struct:SM::Flow::LI 
        label: BODY[<section>]<<origin_octet>>
        body: A string expressing the body contents of the specified section.
      - !ruby/struct:SM::Flow::LI 
        label: BODYSTRUCTURE
        body: An object that describes the [MIME-IMB] body structure of a message. See Net::IMAP::BodyTypeBasic, Net::IMAP::BodyTypeText, Net::IMAP::BodyTypeMessage, Net::IMAP::BodyTypeMultipart.
      - !ruby/struct:SM::Flow::LI 
        label: ENVELOPE
        body: A Net::IMAP::Envelope object that describes the envelope structure of a message.
      - !ruby/struct:SM::Flow::LI 
        label: FLAGS
        body: A array of flag symbols that are set for this message. flag symbols are capitalized by String#capitalize.
      - !ruby/struct:SM::Flow::LI 
        label: INTERNALDATE
        body: A string representing the internal date of the message.
      - !ruby/struct:SM::Flow::LI 
        label: RFC822
        body: Equivalent to BODY[].
      - !ruby/struct:SM::Flow::LI 
        label: RFC822.HEADER
        body: Equivalent to BODY.PEEK[HEADER].
      - !ruby/struct:SM::Flow::LI 
        label: RFC822.SIZE
        body: A number expressing the [RFC-822] size of the message.
      - !ruby/struct:SM::Flow::LI 
        label: RFC822.TEXT
        body: Equivalent to BODY[TEXT].
      - !ruby/struct:SM::Flow::LI 
        label: UID
        body: A number expressing the unique identifier of the message.
      type: :LABELED
    type: :NOTE
  name: FetchData
  value: Struct.new(:seqno, :attr)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Net::IMAP::Envelope represents envelope structures of messages.
  - !ruby/struct:SM::Flow::H 
    level: 4
    text: "Fields:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "date:"
      body: Returns a string that represents the date.
    - !ruby/struct:SM::Flow::LI 
      label: "subject:"
      body: Returns a string that represents the subject.
    - !ruby/struct:SM::Flow::LI 
      label: "from:"
      body: Returns an array of Net::IMAP::Address that represents the from.
    - !ruby/struct:SM::Flow::LI 
      label: "sender:"
      body: Returns an array of Net::IMAP::Address that represents the sender.
    - !ruby/struct:SM::Flow::LI 
      label: "reply_to:"
      body: Returns an array of Net::IMAP::Address that represents the reply-to.
    - !ruby/struct:SM::Flow::LI 
      label: "to:"
      body: Returns an array of Net::IMAP::Address that represents the to.
    - !ruby/struct:SM::Flow::LI 
      label: "cc:"
      body: Returns an array of Net::IMAP::Address that represents the cc.
    - !ruby/struct:SM::Flow::LI 
      label: "bcc:"
      body: Returns an array of Net::IMAP::Address that represents the bcc.
    - !ruby/struct:SM::Flow::LI 
      label: "in_reply_to:"
      body: Returns a string that represents the in-reply-to.
    - !ruby/struct:SM::Flow::LI 
      label: "message_id:"
      body: Returns a string that represents the message-id.
    type: :NOTE
  name: Envelope
  value: Struct.new(:date, :subject, :from, :sender, :reply_to,                           :to, :cc, :bcc, :in_reply_to, :message_id)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Net::IMAP::Address represents electronic mail addresses.
  - !ruby/struct:SM::Flow::H 
    level: 4
    text: "Fields:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "name:"
      body: Returns the phrase from [RFC-822] mailbox.
    - !ruby/struct:SM::Flow::LI 
      label: "route:"
      body: Returns the route from [RFC-822] route-addr.
    - !ruby/struct:SM::Flow::LI 
      label: "mailbox:"
      body: nil indicates end of [RFC-822] group. If non-nil and host is nil, returns [RFC-822] group name. Otherwise, returns [RFC-822] local-part
    - !ruby/struct:SM::Flow::LI 
      label: "host:"
      body: nil indicates [RFC-822] group syntax. Otherwise, returns [RFC-822] domain name.
    type: :NOTE
  name: Address
  value: Struct.new(:name, :route, :mailbox, :host)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Net::IMAP::ContentDisposition represents Content-Disposition fields.
  - !ruby/struct:SM::Flow::H 
    level: 4
    text: "Fields:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "dsp_type:"
      body: Returns the disposition type.
    - !ruby/struct:SM::Flow::LI 
      label: "param:"
      body: Returns a hash that represents parameters of the Content-Disposition field.
    type: :NOTE
  name: ContentDisposition
  value: Struct.new(:dsp_type, :param)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Net::IMAP::ThreadMember represents a thread-node returned by Net::IMAP#thread
  - !ruby/struct:SM::Flow::H 
    level: 4
    text: "Fields:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "seqno:"
      body: The sequence number of this message.
    - !ruby/struct:SM::Flow::LI 
      label: "children:"
      body: an array of Net::IMAP::ThreadMember objects for mail
    type: :NOTE
  - !ruby/struct:SM::Flow::P 
    body: items that are children of this in the thread.
  name: ThreadMember
  value: Struct.new(:seqno, :children)
full_name: Net::IMAP
includes: 
- !ruby/object:RI::IncludedModule 
  name: MonitorMixin
- !ruby/object:RI::IncludedModule 
  name: OpenSSL
- !ruby/object:RI::IncludedModule 
  name: SSL
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_response_handler
- !ruby/object:RI::MethodSummary 
  name: append
- !ruby/object:RI::MethodSummary 
  name: authenticate
- !ruby/object:RI::MethodSummary 
  name: capability
- !ruby/object:RI::MethodSummary 
  name: check
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: copy
- !ruby/object:RI::MethodSummary 
  name: copy_internal
- !ruby/object:RI::MethodSummary 
  name: create
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: disconnect
- !ruby/object:RI::MethodSummary 
  name: disconnected?
- !ruby/object:RI::MethodSummary 
  name: examine
- !ruby/object:RI::MethodSummary 
  name: expunge
- !ruby/object:RI::MethodSummary 
  name: fetch
- !ruby/object:RI::MethodSummary 
  name: fetch_internal
- !ruby/object:RI::MethodSummary 
  name: generate_tag
- !ruby/object:RI::MethodSummary 
  name: get_response
- !ruby/object:RI::MethodSummary 
  name: get_tagged_response
- !ruby/object:RI::MethodSummary 
  name: getacl
- !ruby/object:RI::MethodSummary 
  name: getquota
- !ruby/object:RI::MethodSummary 
  name: getquotaroot
- !ruby/object:RI::MethodSummary 
  name: list
- !ruby/object:RI::MethodSummary 
  name: login
- !ruby/object:RI::MethodSummary 
  name: logout
- !ruby/object:RI::MethodSummary 
  name: lsub
- !ruby/object:RI::MethodSummary 
  name: noop
- !ruby/object:RI::MethodSummary 
  name: normalize_searching_criteria
- !ruby/object:RI::MethodSummary 
  name: pick_up_tagged_response
- !ruby/object:RI::MethodSummary 
  name: put_string
- !ruby/object:RI::MethodSummary 
  name: receive_responses
- !ruby/object:RI::MethodSummary 
  name: record_response
- !ruby/object:RI::MethodSummary 
  name: remove_response_handler
- !ruby/object:RI::MethodSummary 
  name: rename
- !ruby/object:RI::MethodSummary 
  name: search
- !ruby/object:RI::MethodSummary 
  name: search_internal
- !ruby/object:RI::MethodSummary 
  name: select
- !ruby/object:RI::MethodSummary 
  name: send_command
- !ruby/object:RI::MethodSummary 
  name: send_data
- !ruby/object:RI::MethodSummary 
  name: send_list_data
- !ruby/object:RI::MethodSummary 
  name: send_literal
- !ruby/object:RI::MethodSummary 
  name: send_number_data
- !ruby/object:RI::MethodSummary 
  name: send_quoted_string
- !ruby/object:RI::MethodSummary 
  name: send_string_data
- !ruby/object:RI::MethodSummary 
  name: send_symbol_data
- !ruby/object:RI::MethodSummary 
  name: send_time_data
- !ruby/object:RI::MethodSummary 
  name: setacl
- !ruby/object:RI::MethodSummary 
  name: setquota
- !ruby/object:RI::MethodSummary 
  name: sort
- !ruby/object:RI::MethodSummary 
  name: sort_internal
- !ruby/object:RI::MethodSummary 
  name: status
- !ruby/object:RI::MethodSummary 
  name: store
- !ruby/object:RI::MethodSummary 
  name: store_internal
- !ruby/object:RI::MethodSummary 
  name: subscribe
- !ruby/object:RI::MethodSummary 
  name: thread
- !ruby/object:RI::MethodSummary 
  name: thread_internal
- !ruby/object:RI::MethodSummary 
  name: uid_copy
- !ruby/object:RI::MethodSummary 
  name: uid_fetch
- !ruby/object:RI::MethodSummary 
  name: uid_search
- !ruby/object:RI::MethodSummary 
  name: uid_sort
- !ruby/object:RI::MethodSummary 
  name: uid_store
- !ruby/object:RI::MethodSummary 
  name: uid_thread
- !ruby/object:RI::MethodSummary 
  name: unsubscribe
name: IMAP
superclass: Object
PK}[�f{��.ri/1.8/system/Net/IMAP/send_number_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#send_number_data
is_singleton: false
name: send_number_data
params: (num)
visibility: private
PK}[O�5��%ri/1.8/system/Net/IMAP/u8tou16-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP::u8tou16
is_singleton: true
name: u8tou16
params: (s)
visibility: private
PK}[X^}��(ri/1.8/system/Net/IMAP/put_string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#put_string
is_singleton: false
name: put_string
params: (str)
visibility: private
PK}[l���'ri/1.8/system/Net/IMAP/send_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#send_data
is_singleton: false
name: send_data
params: (data)
visibility: private
PK}[�J��:ri/1.8/system/Net/IMAP/CramMD5Authenticator/process-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP::CramMD5Authenticator#process
is_singleton: false
name: process
params: (challenge)
visibility: public
PK}[�L���6ri/1.8/system/Net/IMAP/CramMD5Authenticator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP::CramMD5Authenticator::new
is_singleton: true
name: new
params: (user, password)
visibility: public
PK}[�E����Kri/1.8/system/Net/IMAP/CramMD5Authenticator/cdesc-CramMD5Authenticator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Authenticator for the &quot;CRAM-MD5&quot; authentication type. See #authenticate()."
constants: []

full_name: Net::IMAP::CramMD5Authenticator
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: hmac_md5
- !ruby/object:RI::MethodSummary 
  name: process
name: CramMD5Authenticator
superclass: Object
PK}[��kK��;ri/1.8/system/Net/IMAP/CramMD5Authenticator/hmac_md5-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP::CramMD5Authenticator#hmac_md5
is_singleton: false
name: hmac_md5
params: (text, key)
visibility: private
PK}[�V���Ari/1.8/system/Net/IMAP/NoResponseError/cdesc-NoResponseError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Error raised upon a &quot;NO&quot; response from the server, indicating that the client command could not be completed successfully.
constants: []

full_name: Net::IMAP::NoResponseError
includes: []

instance_methods: []

name: NoResponseError
superclass: ResponseError
PK}[�ڷ^5ri/1.8/system/Net/IMAP/remove_response_handler-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes the response handler.
full_name: Net::IMAP#remove_response_handler
is_singleton: false
name: remove_response_handler
params: (handler)
visibility: public
PK}[)�'sLL#ri/1.8/system/Net/IMAP/login-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Sends a LOGIN command to identify the client and carries the plaintext <tt>password</tt> authenticating this <tt>user</tt>. Note that, unlike calling #authenticate() with an <tt>auth_type</tt> of &quot;LOGIN&quot;, #login() does <b>not</b> use the login authenticator."
- !ruby/struct:SM::Flow::P 
  body: A Net::IMAP::NoResponseError is raised if authentication fails.
full_name: Net::IMAP#login
is_singleton: false
name: login
params: (user, password)
visibility: public
PK}[nU\���+ri/1.8/system/Net/IMAP/Atom/cdesc-Atom.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::IMAP::Atom
includes: []

instance_methods: []

name: Atom
superclass: Object
PK}[h�5���.ri/1.8/system/Net/IMAP/send_symbol_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#send_symbol_data
is_singleton: false
name: send_symbol_data
params: (symbol)
visibility: private
PK}[�Բ��1ri/1.8/system/Net/IMAP/RawData/cdesc-RawData.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::IMAP::RawData
includes: []

instance_methods: []

name: RawData
superclass: Object
PK}[S7e��$ri/1.8/system/Net/IMAP/thread-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "As for #search(), but returns message sequence numbers in threaded format, as a Net::IMAP::ThreadMember tree. The supported algorithms are:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "ORDEREDSUBJECT:"
    body: split into single-level threads according to subject, ordered by date.
  - !ruby/struct:SM::Flow::LI 
    label: "REFERENCES:"
    body: split into threads by parent/child relationships determined by which message is a reply to which.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: "Unlike #search(), <tt>charset</tt> is a required argument. US-ASCII and UTF-8 are sample values."
- !ruby/struct:SM::Flow::P 
  body: See [SORT-THREAD-EXT] for more details.
full_name: Net::IMAP#thread
is_singleton: false
name: thread
params: (algorithm, search_keys, charset)
visibility: public
PK}[a�^��+ri/1.8/system/Net/IMAP/copy_internal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#copy_internal
is_singleton: false
name: copy_internal
params: (cmd, set, mailbox)
visibility: private
PK}[E:�		-ri/1.8/system/Net/IMAP/disconnected%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if disconnected from the server.
full_name: Net::IMAP#disconnected?
is_singleton: false
name: disconnected?
params: ()
visibility: public
PK}[ƫ]oo#ri/1.8/system/Net/IMAP/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a CLOSE command to close the currently selected mailbox. The CLOSE command permanently removes from the mailbox all messages that have the \Deleted flag set.
full_name: Net::IMAP#close
is_singleton: false
name: close
params: ()
visibility: public
PK}[A����*ri/1.8/system/Net/IMAP/authenticate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Sends an AUTHENTICATE command to authenticate the client. The <tt>auth_type</tt> parameter is a string that represents the authentication mechanism to be used. Currently Net::IMAP supports authentication mechanisms:"
- !ruby/struct:SM::Flow::VERB 
  body: "  LOGIN:: login using cleartext user and password.\n  CRAM-MD5:: login with cleartext user and encrypted password\n             (see [RFC-2195] for a full description).  This\n             mechanism requires that the server have the user's\n             password stored in clear-text password.\n"
- !ruby/struct:SM::Flow::P 
  body: "For both these mechanisms, there should be two <tt>args</tt>: username and (cleartext) password. A server may not support one or other of these mechanisms; check #capability() for a capability of the form &quot;AUTH=LOGIN&quot; or &quot;AUTH=CRAM-MD5&quot;."
- !ruby/struct:SM::Flow::P 
  body: "Authentication is done using the appropriate authenticator object: see @@authenticators for more information on plugging in your own authenticator."
- !ruby/struct:SM::Flow::P 
  body: "For example:"
- !ruby/struct:SM::Flow::VERB 
  body: "   imap.authenticate('LOGIN', user, password)\n"
- !ruby/struct:SM::Flow::P 
  body: A Net::IMAP::NoResponseError is raised if authentication fails.
full_name: Net::IMAP#authenticate
is_singleton: false
name: authenticate
params: (auth_type, *args)
visibility: public
PK}[��#��,ri/1.8/system/Net/IMAP/send_time_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#send_time_data
is_singleton: false
name: send_time_data
params: (time)
visibility: private
PK}[T��88)ri/1.8/system/Net/IMAP/unsubscribe-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a UNSUBSCRIBE command to remove the specified <tt>mailbox</tt> name from the server's set of &quot;active&quot; or &quot;subscribed&quot; mailboxes.
- !ruby/struct:SM::Flow::P 
  body: A Net::IMAP::NoResponseError is raised if <tt>mailbox</tt> cannot be unsubscribed from, for instance because the client is not currently subscribed to it.
full_name: Net::IMAP#unsubscribe
is_singleton: false
name: unsubscribe
params: (mailbox)
visibility: public
PK}[f�&��1ri/1.8/system/Net/IMAP/Literal/cdesc-Literal.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::IMAP::Literal
includes: []

instance_methods: []

name: Literal
superclass: Object
PK}[�r�2��.ri/1.8/system/Net/IMAP/send_string_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#send_string_data
is_singleton: false
name: send_string_data
params: (str)
visibility: private
PK}['Hڣ�	�	$ri/1.8/system/Net/IMAP/search-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a SEARCH command to search the mailbox for messages that match the given searching criteria, and returns message sequence numbers. <tt>keys</tt> can either be a string holding the entire search string, or a single-dimension array of search keywords and arguments. The following are some common search criteria; see [IMAP] section 6.4.4 for a full list.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "<message set>:"
    body: a set of message sequence numbers. ',' indicates an interval, ':' indicates a range. For instance, '2,10:12,15' means &quot;2,10,11,12,15&quot;.
  - !ruby/struct:SM::Flow::LI 
    label: "BEFORE <date>:"
    body: messages with an internal date strictly before &lt;date&gt;. The date argument has a format similar to 8-Aug-2002.
  - !ruby/struct:SM::Flow::LI 
    label: "BODY <string>:"
    body: messages that contain &lt;string&gt; within their body.
  - !ruby/struct:SM::Flow::LI 
    label: "CC <string>:"
    body: messages containing &lt;string&gt; in their CC field.
  - !ruby/struct:SM::Flow::LI 
    label: "FROM <string>:"
    body: messages that contain &lt;string&gt; in their FROM field.
  - !ruby/struct:SM::Flow::LI 
    label: "NEW:"
    body: messages with the \Recent, but not the \Seen, flag set.
  - !ruby/struct:SM::Flow::LI 
    label: "NOT <search-key>:"
    body: negate the following search key.
  - !ruby/struct:SM::Flow::LI 
    label: "OR <search-key> <search-key>:"
    body: "&quot;or&quot; two search keys together."
  - !ruby/struct:SM::Flow::LI 
    label: "ON <date>:"
    body: messages with an internal date exactly equal to &lt;date&gt;, which has a format similar to 8-Aug-2002.
  - !ruby/struct:SM::Flow::LI 
    label: "SINCE <date>:"
    body: messages with an internal date on or after &lt;date&gt;.
  - !ruby/struct:SM::Flow::LI 
    label: "SUBJECT <string>:"
    body: messages with &lt;string&gt; in their subject.
  - !ruby/struct:SM::Flow::LI 
    label: "TO <string>:"
    body: messages with &lt;string&gt; in their TO field.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: "For example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  p imap.search([&quot;SUBJECT&quot;, &quot;hello&quot;, &quot;NOT&quot;, &quot;NEW&quot;])\n  #=&gt; [1, 6, 7, 8]\n"
full_name: Net::IMAP#search
is_singleton: false
name: search
params: (keys, charset = nil)
visibility: public
PK}[�`M���"ri/1.8/system/Net/IMAP/sort-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Sends a SORT command to sort messages in the mailbox. Returns an array of message sequence numbers. For example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  p imap.sort([&quot;FROM&quot;], [&quot;ALL&quot;], &quot;US-ASCII&quot;)\n  #=&gt; [1, 2, 3, 5, 6, 7, 8, 4, 9]\n  p imap.sort([&quot;DATE&quot;], [&quot;SUBJECT&quot;, &quot;hello&quot;], &quot;US-ASCII&quot;)\n  #=&gt; [6, 7, 8, 1]\n"
- !ruby/struct:SM::Flow::P 
  body: See [SORT-THREAD-EXT] for more details.
full_name: Net::IMAP#sort
is_singleton: false
name: sort
params: (sort_keys, search_keys, charset)
visibility: public
PK}[��<���<ri/1.8/system/Net/IMAP/BodyTypeMultipart/multipart%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP::BodyTypeMultipart#multipart?
is_singleton: false
name: multipart?
params: ()
visibility: public
PK}[��x&��=ri/1.8/system/Net/IMAP/BodyTypeMultipart/media_subtype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Obsolete: use <tt>subtype</tt> instead. Calling this will generate a warning message to <tt>stderr</tt>, then return the value of <tt>subtype</tt>."
full_name: Net::IMAP::BodyTypeMultipart#media_subtype
is_singleton: false
name: media_subtype
params: ()
visibility: public
PK}[q�@���Eri/1.8/system/Net/IMAP/BodyTypeMultipart/cdesc-BodyTypeMultipart.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Net::IMAP::BodyTypeMultipart represents multipart body structures of messages.
- !ruby/struct:SM::Flow::H 
  level: 4
  text: "Fields:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "media_type:"
    body: Returns the content media type name as defined in [MIME-IMB].
  - !ruby/struct:SM::Flow::LI 
    label: "subtype:"
    body: Returns the content subtype name as defined in [MIME-IMB].
  - !ruby/struct:SM::Flow::LI 
    label: "parts:"
    body: Returns multiple parts.
  - !ruby/struct:SM::Flow::LI 
    label: "param:"
    body: Returns a hash that represents parameters as defined in [MIME-IMB].
  - !ruby/struct:SM::Flow::LI 
    label: "disposition:"
    body: Returns a Net::IMAP::ContentDisposition object giving the content disposition.
  - !ruby/struct:SM::Flow::LI 
    label: "language:"
    body: Returns a string or an array of strings giving the body language value as defined in [LANGUAGE-TAGS].
  - !ruby/struct:SM::Flow::LI 
    label: "extension:"
    body: Returns extension data.
  - !ruby/struct:SM::Flow::LI 
    label: "multipart?:"
    body: Returns true.
  type: :NOTE
constants: []

full_name: Net::IMAP::BodyTypeMultipart
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: media_subtype
- !ruby/object:RI::MethodSummary 
  name: multipart?
name: BodyTypeMultipart
superclass: Struct.new(:media_type, :subtype,                                          :parts,                                          :param, :disposition, :language,                                          :extension)
PK}[������1ri/1.8/system/Net/IMAP/get_tagged_response-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#get_tagged_response
is_singleton: false
name: get_tagged_response
params: (tag)
visibility: private
PK}[���V��*ri/1.8/system/Net/IMAP/send_command-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#send_command
is_singleton: false
name: send_command
params: (cmd, *args, &block)
visibility: private
PK}[*���$$'ri/1.8/system/Net/IMAP/uid_store-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "As for #store(), but <tt>set</tt> contains unique identifiers."
full_name: Net::IMAP#uid_store
is_singleton: false
name: uid_store
params: (set, attr, flags)
visibility: public
PK}[���qq"ri/1.8/system/Net/IMAP/list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Sends a LIST command, and returns a subset of names from the complete set of all names available to the client. <tt>refname</tt> provides a context (for instance, a base directory in a directory-based mailbox hierarchy). <tt>mailbox</tt> specifies a mailbox or (via wildcards) mailboxes under that context. Two wildcards may be used in <tt>mailbox</tt>: '*', which matches all characters <b>including</b> the hierarchy delimiter (for instance, '/' on a UNIX-hosted directory-based mailbox hierarchy); and '%', which matches all characters <b>except</b> the hierarchy delimiter."
- !ruby/struct:SM::Flow::P 
  body: If <tt>refname</tt> is empty, <tt>mailbox</tt> is used directly to determine which mailboxes to match. If <tt>mailbox</tt> is empty, the root name of <tt>refname</tt> and the hierarchy delimiter are returned.
- !ruby/struct:SM::Flow::P 
  body: "The return value is an array of +Net::IMAP::MailboxList+. For example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  imap.create(&quot;foo/bar&quot;)\n  imap.create(&quot;foo/baz&quot;)\n  p imap.list(&quot;&quot;, &quot;foo/%&quot;)\n  #=&gt; [#&lt;Net::IMAP::MailboxList attr=[:Noselect], delim=&quot;/&quot;, name=&quot;foo/&quot;&gt;, \\\n       #&lt;Net::IMAP::MailboxList attr=[:Noinferiors, :Marked], delim=&quot;/&quot;, name=&quot;foo/bar&quot;&gt;, \\\n       #&lt;Net::IMAP::MailboxList attr=[:Noinferiors], delim=&quot;/&quot;, name=&quot;foo/baz&quot;&gt;]\n"
full_name: Net::IMAP#list
is_singleton: false
name: list
params: (refname, mailbox)
visibility: public
PK}[w����*ri/1.8/system/Net/IMAP/getquotaroot-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends the GETQUOTAROOT command along with specified <tt>mailbox</tt>. This command is generally available to both admin and user. If mailbox exists, returns an array containing objects of Net::IMAP::MailboxQuotaRoot and Net::IMAP::MailboxQuota.
full_name: Net::IMAP#getquotaroot
is_singleton: false
name: getquotaroot
params: (mailbox)
visibility: public
PK}[L��'ri/1.8/system/Net/IMAP/uid_fetch-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "As for #fetch(), but <tt>set</tt> contains unique identifiers."
full_name: Net::IMAP#uid_fetch
is_singleton: false
name: uid_fetch
params: (set, attr)
visibility: public
PK}[�
���&ri/1.8/system/Net/IMAP/getquota-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends the GETQUOTA command along with specified <tt>mailbox</tt>. If this mailbox exists, then an array containing a Net::IMAP::MailboxQuota object is returned. This command generally is only available to server admin.
full_name: Net::IMAP#getquota
is_singleton: false
name: getquota
params: (mailbox)
visibility: public
PK}[�1�&&$ri/1.8/system/Net/IMAP/logout-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a LOGOUT command to inform the server that the client is done with the connection.
full_name: Net::IMAP#logout
is_singleton: false
name: logout
params: ()
visibility: public
PK}[
����0ri/1.8/system/Net/IMAP/send_quoted_string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#send_quoted_string
is_singleton: false
name: send_quoted_string
params: (str)
visibility: private
PK}[�H�>>Gri/1.8/system/Net/IMAP/ResponseParseError/cdesc-ResponseParseError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Error raised when a response from the server is non-parseable.
constants: []

full_name: Net::IMAP::ResponseParseError
includes: []

instance_methods: []

name: ResponseParseError
superclass: Error
PK}[m�/��#ri/1.8/system/Net/IMAP/fetch-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Sends a FETCH command to retrieve data associated with a message in the mailbox. The <tt>set</tt> parameter is a number or an array of numbers or a Range object. The number is a message sequence number. <tt>attr</tt> is a list of attributes to fetch; see the documentation for Net::IMAP::FetchData for a list of valid attributes. The return value is an array of Net::IMAP::FetchData. For example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  p imap.fetch(6..8, &quot;UID&quot;)\n  #=&gt; [#&lt;Net::IMAP::FetchData seqno=6, attr={&quot;UID&quot;=&gt;98}&gt;, \\\n       #&lt;Net::IMAP::FetchData seqno=7, attr={&quot;UID&quot;=&gt;99}&gt;, \\\n       #&lt;Net::IMAP::FetchData seqno=8, attr={&quot;UID&quot;=&gt;100}&gt;]\n  p imap.fetch(6, &quot;BODY[HEADER.FIELDS (SUBJECT)]&quot;)\n  #=&gt; [#&lt;Net::IMAP::FetchData seqno=6, attr={&quot;BODY[HEADER.FIELDS (SUBJECT)]&quot;=&gt;&quot;Subject: test\\r\\n\\r\\n&quot;}&gt;]\n  data = imap.uid_fetch(98, [&quot;RFC822.SIZE&quot;, &quot;INTERNALDATE&quot;])[0]\n  p data.seqno\n  #=&gt; 6\n  p data.attr[&quot;RFC822.SIZE&quot;]\n  #=&gt; 611\n  p data.attr[&quot;INTERNALDATE&quot;]\n  #=&gt; &quot;12-Oct-2000 22:40:59 +0900&quot;\n  p data.attr[&quot;UID&quot;]\n  #=&gt; 98\n"
full_name: Net::IMAP#fetch
is_singleton: false
name: fetch
params: (set, attr)
visibility: public
PK}[<��ھ�,ri/1.8/system/Net/IMAP/send_list_data-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::IMAP#send_list_data
is_singleton: false
name: send_list_data
params: (list)
visibility: private
PK}[���9��4ri/1.8/system/Net/ReadAdapter/cdesc-ReadAdapter.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::ReadAdapter
includes: []

instance_methods: []

name: ReadAdapter
superclass: Object
PK}[y�?�:ri/1.8/system/Net/POPBadResponse/cdesc-POPBadResponse.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Unexpected response from the server.
constants: []

full_name: Net::POPBadResponse
includes: []

instance_methods: []

name: POPBadResponse
superclass: POPError
PK}[�����4ri/1.8/system/Net/HTTPRequest/cdesc-HTTPRequest.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: HTTP request class. This class wraps request header and entity path. You <b>must</b> use its subclass, Net::HTTP::Get, Post, Head.
constants: []

full_name: Net::HTTPRequest
includes: []

instance_methods: []

name: HTTPRequest
superclass: HTTPGenericRequest
PK}[5��(ri/1.8/system/Net/HTTPRequest/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates HTTP request object.
full_name: Net::HTTPRequest::new
is_singleton: true
name: new
params: (path, initheader = nil)
visibility: public
PK}[��4��8ri/1.8/system/Net/ProtocolError/cdesc-ProtocolError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::ProtocolError
includes: []

instance_methods: []

name: ProtocolError
superclass: StandardError
PK}[�?�		*ri/1.8/system/Net/Telnet/binmode%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Turn newline conversion on (false) or off (true).
full_name: Net::Telnet#binmode=
is_singleton: false
name: binmode=
params: (mode)
visibility: public
PK}[A�&��%ri/1.8/system/Net/Telnet/print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a string to the host.
- !ruby/struct:SM::Flow::P 
  body: This does <em>not</em> automatically append a newline to the string. Embedded newlines may be converted and telnet command sequences escaped depending upon the values of telnetmode, binmode, and telnet options set by the host.
full_name: Net::Telnet#print
is_singleton: false
name: print
params: (string)
visibility: public
PK}[K&��mm'ri/1.8/system/Net/Telnet/binmode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Turn newline conversion on (<tt>mode</tt> == false) or off (<tt>mode</tt> == true), or return the current value (<tt>mode</tt> is not specified).
full_name: Net::Telnet#binmode
is_singleton: false
name: binmode
params: (mode = nil)
visibility: public
PK}[]`����*ri/1.8/system/Net/Telnet/telnetmode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set telnet command interpretation on (<tt>mode</tt> == true) or off (<tt>mode</tt> == false), or return the current value (<tt>mode</tt> not provided). It should be on for true telnet sessions, off if using Net::Telnet to connect to a non-telnet service such as SMTP.
full_name: Net::Telnet#telnetmode
is_singleton: false
name: telnetmode
params: (mode = nil)
visibility: public
PK}[��Je��#ri/1.8/system/Net/Telnet/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: "mesg "
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new Net::Telnet object.
- !ruby/struct:SM::Flow::P 
  body: "Attempts to connect to the host (unless the Proxy option is provided: see below). If a block is provided, it is yielded status messages on the attempt to connect to the server, of the form:"
- !ruby/struct:SM::Flow::VERB 
  body: "  Trying localhost...\n  Connected to localhost.\n"
- !ruby/struct:SM::Flow::P 
  body: <tt>options</tt> is a hash of options. The following example lists all options and their default values.
- !ruby/struct:SM::Flow::VERB 
  body: "  host = Net::Telnet::new(\n           &quot;Host&quot;       =&gt; &quot;localhost&quot;,  # default: &quot;localhost&quot;\n           &quot;Port&quot;       =&gt; 23,           # default: 23\n           &quot;Binmode&quot;    =&gt; false,        # default: false\n           &quot;Output_log&quot; =&gt; &quot;output_log&quot;, # default: nil (no output)\n           &quot;Dump_log&quot;   =&gt; &quot;dump_log&quot;,   # default: nil (no output)\n           &quot;Prompt&quot;     =&gt; /[$%#&gt;] \\z/n, # default: /[$%#&gt;] \\z/n\n           &quot;Telnetmode&quot; =&gt; true,         # default: true\n           &quot;Timeout&quot;    =&gt; 10,           # default: 10\n             # if ignore timeout then set &quot;Timeout&quot; to false.\n           &quot;Waittime&quot;   =&gt; 0,            # default: 0\n           &quot;Proxy&quot;      =&gt; proxy         # default: nil\n                           # proxy is Net::Telnet or IO object\n         )\n"
- !ruby/struct:SM::Flow::P 
  body: "The options have the following meanings:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "Host:"
    body: the hostname or IP address of the host to connect to, as a String. Defaults to &quot;localhost&quot;.
  - !ruby/struct:SM::Flow::LI 
    label: "Port:"
    body: the port to connect to. Defaults to 23.
  - !ruby/struct:SM::Flow::LI 
    label: "Binmode:"
    body: "if false (the default), newline substitution is performed. Outgoing LF is converted to CRLF, and incoming CRLF is converted to LF. If true, this substitution is not performed. This value can also be set with the #binmode() method. The outgoing conversion only applies to the #puts() and #print() methods, not the #write() method. The precise nature of the newline conversion is also affected by the telnet options SGA and BIN."
  - !ruby/struct:SM::Flow::LI 
    label: "Output_log:"
    body: the name of the file to write connection status messages and all received traffic to. In the case of a proper Telnet session, this will include the client input as echoed by the host; otherwise, it only includes server responses. Output is appended verbatim to this file. By default, no output log is kept.
  - !ruby/struct:SM::Flow::LI 
    label: "Dump_log:"
    body: as for Output_log, except that output is written in hexdump format (16 bytes per line as hex pairs, followed by their printable equivalent), with connection status messages preceded by '#', sent traffic preceded by '&gt;', and received traffic preceded by '&lt;'. By default, not dump log is kept.
  - !ruby/struct:SM::Flow::LI 
    label: "Prompt:"
    body: a regular expression matching the host's command-line prompt sequence. This is needed by the Telnet class to determine when the output from a command has finished and the host is ready to receive a new command. By default, this regular expression is /[$%#&gt;] \z/n.
  - !ruby/struct:SM::Flow::LI 
    label: "Telnetmode:"
    body: "a boolean value, true by default. In telnet mode, traffic received from the host is parsed for special command sequences, and these sequences are escaped in outgoing traffic sent using #puts() or #print() (but not #write()). If you are using the Net::Telnet object to connect to a non-telnet service (such as SMTP or POP), this should be set to &quot;false&quot; to prevent undesired data corruption. This value can also be set by the #telnetmode() method."
  - !ruby/struct:SM::Flow::LI 
    label: "Timeout:"
    body: "the number of seconds to wait before timing out both the initial attempt to connect to host (in this constructor), and all attempts to read data from the host (in #waitfor(), #cmd(), and #login()). Exceeding this timeout causes a TimeoutError to be raised. The default value is 10 seconds. You can disable the timeout by setting this value to false. In this case, the connect attempt will eventually timeout on the underlying connect(2) socket call with an Errno::ETIMEDOUT error (but generally only after a few minutes), but other attempts to read data from the host will hand indefinitely if no data is forthcoming."
  - !ruby/struct:SM::Flow::LI 
    label: "Waittime:"
    body: the amount of time to wait after seeing what looks like a prompt (that is, received data that matches the Prompt option regular expression) to see if more data arrives. If more data does arrive in this time, Net::Telnet assumes that what it saw was not really a prompt. This is to try to avoid false matches, but it can also lead to missing real prompts (if, for instance, a background process writes to the terminal soon after the prompt is displayed). By default, set to 0, meaning not to wait for more data.
  - !ruby/struct:SM::Flow::LI 
    label: "Proxy:"
    body: a proxy object to used instead of opening a direct connection to the host. Must be either another Net::Telnet object or an IO object. If it is another Net::Telnet object, this instance will use that one's socket for communication. If an IO object, it is used directly for communication. Any other kind of object will cause an error to be raised.
  type: :NOTE
full_name: Net::Telnet::new
is_singleton: true
name: new
params: (options) {|mesg| ...}
visibility: public
PK}[�2����%ri/1.8/system/Net/Telnet/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Write <tt>string</tt> to the host.
- !ruby/struct:SM::Flow::P 
  body: Does not perform any conversions on <tt>string</tt>. Will log <tt>string</tt> to the dumplog, if the Dump_log option is set.
full_name: Net::Telnet#write
is_singleton: false
name: write
params: (string)
visibility: public
PK}[�a���*ri/1.8/system/Net/Telnet/cdesc-Telnet.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The socket the Telnet object is using. Note that this object becomes a delegate of the Telnet object, so normally you invoke its methods directly on the Telnet object.
  name: sock
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Net::Telnet
- !ruby/struct:SM::Flow::P 
  body: Provides telnet client functionality.
- !ruby/struct:SM::Flow::P 
  body: This class also has, through delegation, all the methods of a socket object (by default, a <tt>TCPSocket</tt>, but can be set by the <tt>Proxy</tt> option to <tt>new()</tt>). This provides methods such as <tt>close()</tt> to end the session and <tt>sysread()</tt> to read data directly from the host, instead of via the <tt>waitfor()</tt> mechanism. Note that if you do use <tt>sysread()</tt> directly when in telnet mode, you should probably pass the output through <tt>preprocess()</tt> to extract telnet command sequences.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Overview
- !ruby/struct:SM::Flow::P 
  body: "The telnet protocol allows a client to login remotely to a user account on a server and execute commands via a shell. The equivalent is done by creating a Net::Telnet class with the <tt>Host</tt> option set to your host, calling #login() with your user and password, issuing one or more #cmd() calls, and then calling #close() to end the session. The #waitfor(), #print(), #puts(), and #write() methods, which #cmd() is implemented on top of, are only needed if you are doing something more complicated."
- !ruby/struct:SM::Flow::P 
  body: "A Net::Telnet object can also be used to connect to non-telnet services, such as SMTP or HTTP. In this case, you normally want to provide the <tt>Port</tt> option to specify the port to connect to, and set the <tt>Telnetmode</tt> option to false to prevent the client from attempting to interpret telnet command sequences. Generally, #login() will not work with other protocols, and you have to handle authentication yourself."
- !ruby/struct:SM::Flow::P 
  body: "For some protocols, it will be possible to specify the <tt>Prompt</tt> option once when you create the Telnet object and use #cmd() calls; for others, you will have to specify the response sequence to look for as the Match option to every #cmd() call, or call #puts() and #waitfor() directly; for yet others, you will have to use #sysread() instead of #waitfor() and parse server responses yourself."
- !ruby/struct:SM::Flow::P 
  body: It is worth noting that when you create a new Net::Telnet object, you can supply a proxy IO channel via the Proxy option. This can be used to attach the Telnet object to other Telnet objects, to already open sockets, or to any read-write IO object. This can be useful, for instance, for setting up a test fixture for unit testing.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Examples
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Log in and send a command, echoing all output to stdout
- !ruby/struct:SM::Flow::VERB 
  body: "  localhost = Net::Telnet::new(&quot;Host&quot; =&gt; &quot;localhost&quot;,\n                               &quot;Timeout&quot; =&gt; 10,\n                               &quot;Prompt&quot; =&gt; /[$%#&gt;] \\z/n)\n  localhost.login(&quot;username&quot;, &quot;password&quot;) { |c| print c }\n  localhost.cmd(&quot;command&quot;) { |c| print c }\n  localhost.close\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Check a POP server to see if you have mail
- !ruby/struct:SM::Flow::VERB 
  body: "  pop = Net::Telnet::new(&quot;Host&quot; =&gt; &quot;your_destination_host_here&quot;,\n                         &quot;Port&quot; =&gt; 110,\n                         &quot;Telnetmode&quot; =&gt; false,\n                         &quot;Prompt&quot; =&gt; /^+OK/n)\n  pop.cmd(&quot;user &quot; + &quot;your_username_here&quot;) { |c| print c }\n  pop.cmd(&quot;pass &quot; + &quot;your_password_here&quot;) { |c| print c }\n  pop.cmd(&quot;list&quot;) { |c| print c }\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: References
- !ruby/struct:SM::Flow::P 
  body: There are a large number of RFCs relevant to the Telnet protocol. RFCs 854-861 define the base protocol. For a complete listing of relevant RFCs, see http://www.omnifarious.org/~hopper/technical/telnet-rfc.html
constants: []

full_name: Net::Telnet
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: binmode
- !ruby/object:RI::MethodSummary 
  name: binmode=
- !ruby/object:RI::MethodSummary 
  name: cmd
- !ruby/object:RI::MethodSummary 
  name: login
- !ruby/object:RI::MethodSummary 
  name: preprocess
- !ruby/object:RI::MethodSummary 
  name: print
- !ruby/object:RI::MethodSummary 
  name: puts
- !ruby/object:RI::MethodSummary 
  name: telnetmode
- !ruby/object:RI::MethodSummary 
  name: telnetmode=
- !ruby/object:RI::MethodSummary 
  name: waitfor
- !ruby/object:RI::MethodSummary 
  name: write
name: Telnet
superclass: SimpleDelegator
PK}[n"H��%ri/1.8/system/Net/Telnet/login-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: recvdata
comment: 
- !ruby/struct:SM::Flow::P 
  body: Login to the host with a given username and password.
- !ruby/struct:SM::Flow::P 
  body: The username and password can either be provided as two string arguments in that order, or as a hash with keys &quot;Name&quot; and &quot;Password&quot;.
- !ruby/struct:SM::Flow::P 
  body: This method looks for the strings &quot;login&quot; and &quot;Password&quot; from the host to determine when to send the username and password. If the login sequence does not follow this pattern (for instance, you are connecting to a service other than telnet), you will need to handle login yourself.
- !ruby/struct:SM::Flow::P 
  body: The password can be omitted, either by only provided one String argument, which will be used as the username, or by providing a has that has no &quot;Password&quot; key. In this case, the method will not look for the &quot;Password:&quot; prompt; if it is sent, it will have to be dealt with by later calls.
- !ruby/struct:SM::Flow::P 
  body: The method returns all data received during the login process from the host, including the echoed username but not the password (which the host should not echo). If a block is passed in, this received data is also yielded to the block as it is received.
full_name: Net::Telnet#login
is_singleton: false
name: login
params: (options, password = nil) {|recvdata| ...}
visibility: public
PK}[�΢E��#ri/1.8/system/Net/Telnet/cmd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: recvdata
comment: 
- !ruby/struct:SM::Flow::P 
  body: Send a command to the host.
- !ruby/struct:SM::Flow::P 
  body: More exactly, sends a string to the host, and reads in all received data until is sees the prompt or other matched sequence.
- !ruby/struct:SM::Flow::P 
  body: If a block is given, the received data will be yielded to it as it is read in. Whether a block is given or not, the received data will be return as a string. Note that the received data includes the prompt and in most cases the host's echo of our command.
- !ruby/struct:SM::Flow::P 
  body: "<tt>options</tt> is either a String, specified the string or command to send to the host; or it is a hash of options. If a hash, the following options can be specified:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "String:"
    body: the command or other string to send to the host.
  - !ruby/struct:SM::Flow::LI 
    label: "Match:"
    body: a regular expression, the sequence to look for in the received data before returning. If not specified, the Prompt option value specified when this instance was created will be used, or, failing that, the default prompt of /[$%#&gt;] \z/n.
  - !ruby/struct:SM::Flow::LI 
    label: "Timeout:"
    body: the seconds to wait for data from the host before raising a Timeout error. If not specified, the Timeout option value specified when this instance was created will be used, or, failing that, the default value of 10 seconds.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: The command or other string will have the newline sequence appended to it.
full_name: Net::Telnet#cmd
is_singleton: false
name: cmd
params: (options) {|recvdata| ...}
visibility: public
PK}[�j�	�	'ri/1.8/system/Net/Telnet/waitfor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: recvdata
comment: 
- !ruby/struct:SM::Flow::P 
  body: Read data from the host until a certain sequence is matched.
- !ruby/struct:SM::Flow::P 
  body: If a block is given, the received data will be yielded as it is read in (not necessarily all in one go), or nil if EOF occurs before any data is received. Whether a block is given or not, all data read will be returned in a single string, or again nil if EOF occurs before any data is received. Note that received data includes the matched sequence we were looking for.
- !ruby/struct:SM::Flow::P 
  body: "<tt>options</tt> can be either a regular expression or a hash of options. If a regular expression, this specifies the data to wait for. If a hash, this can specify the following options:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "Match:"
    body: a regular expression, specifying the data to wait for.
  - !ruby/struct:SM::Flow::LI 
    label: "Prompt:"
    body: as for Match; used only if Match is not specified.
  - !ruby/struct:SM::Flow::LI 
    label: "String:"
    body: as for Match, except a string that will be converted into a regular expression. Used only if Match and Prompt are not specified.
  - !ruby/struct:SM::Flow::LI 
    label: "Timeout:"
    body: the number of seconds to wait for data from the host before raising a TimeoutError. If set to false, no timeout will occur. If not specified, the Timeout option value specified when this instance was created will be used, or, failing that, the default value of 10 seconds.
  - !ruby/struct:SM::Flow::LI 
    label: "Waittime:"
    body: the number of seconds to wait after matching against the input data to see if more data arrives. If more data arrives within this time, we will judge ourselves not to have matched successfully, and will continue trying to match. If not specified, the Waittime option value specified when this instance was created will be used, or, failing that, the default value of 0 seconds, which means not to wait for more input.
  - !ruby/struct:SM::Flow::LI 
    label: "FailEOF:"
    body: if true, when the remote end closes the connection then an EOFError will be raised. Otherwise, defaults to the old behaviour that the function will return whatever data has been received already, or nil if nothing was received.
  type: :NOTE
full_name: Net::Telnet#waitfor
is_singleton: false
name: waitfor
params: (options) {|recvdata| ...}
visibility: public
PK}[���p*ri/1.8/system/Net/Telnet/preprocess-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Preprocess received data from the host.
- !ruby/struct:SM::Flow::P 
  body: "Performs newline conversion and detects telnet command sequences. Called automatically by #waitfor(). You should only use this method yourself if you have read input directly using sysread() or similar, and even then only if in telnet mode."
full_name: Net::Telnet#preprocess
is_singleton: false
name: preprocess
params: (string)
visibility: public
PK}[����JJ$ri/1.8/system/Net/Telnet/puts-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a string to the host.
- !ruby/struct:SM::Flow::P 
  body: "Same as #print(), but appends a newline to the string."
full_name: Net::Telnet#puts
is_singleton: false
name: puts
params: (string)
visibility: public
PK}[�衑��-ri/1.8/system/Net/Telnet/telnetmode%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Turn telnet command interpretation on (true) or off (false). It should be on for true telnet sessions, off if using Net::Telnet to connect to a non-telnet service such as SMTP.
full_name: Net::Telnet#telnetmode=
is_singleton: false
name: telnetmode=
params: (mode)
visibility: public
PK}[�I����+ri/1.8/system/Net/WriteAdapter/print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #write"
full_name: Net::WriteAdapter#print
is_singleton: false
name: print
params: (str)
visibility: public
PK}[����,ri/1.8/system/Net/WriteAdapter/printf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::WriteAdapter#printf
is_singleton: false
name: printf
params: (*args)
visibility: public
PK}[�� ���-ri/1.8/system/Net/WriteAdapter/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::WriteAdapter#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK}[%�0��)ri/1.8/system/Net/WriteAdapter/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::WriteAdapter::new
is_singleton: true
name: new
params: (socket, method)
visibility: public
PK}[C���+ri/1.8/system/Net/WriteAdapter/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: print
block_params: 
comment: 
full_name: Net::WriteAdapter#write
is_singleton: false
name: write
params: (str)
visibility: public
PK}[��S=PP6ri/1.8/system/Net/WriteAdapter/cdesc-WriteAdapter.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: The writer adapter class
constants: []

full_name: Net::WriteAdapter
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: print
- !ruby/object:RI::MethodSummary 
  name: printf
- !ruby/object:RI::MethodSummary 
  name: puts
- !ruby/object:RI::MethodSummary 
  name: write
name: WriteAdapter
superclass: Object
PK}[OC'��,ri/1.8/system/Net/WriteAdapter/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::WriteAdapter#<<
is_singleton: false
name: "<<"
params: (str)
visibility: public
PK}[��Kĵ�*ri/1.8/system/Net/WriteAdapter/puts-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::WriteAdapter#puts
is_singleton: false
name: puts
params: (str = '')
visibility: public
PK}[
cS���:ri/1.8/system/Net/ProtoAuthError/cdesc-ProtoAuthError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::ProtoAuthError
includes: []

instance_methods: []

name: ProtoAuthError
superclass: ProtocolError
PK}[�l|���,ri/1.8/system/Net/POPMail/cdesc-POPMail.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The length of the message in octets.
  name: length
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The sequence number of the message on the server.
  name: number
  rw: R
class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: This class represents a message which exists on the POP server. Instances of this class are created by the POP3 class; they should not be directly created by the user.
constants: []

full_name: Net::POPMail
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: all
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: delete!
- !ruby/object:RI::MethodSummary 
  name: deleted?
- !ruby/object:RI::MethodSummary 
  name: header
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: mail
- !ruby/object:RI::MethodSummary 
  name: pop
- !ruby/object:RI::MethodSummary 
  name: top
- !ruby/object:RI::MethodSummary 
  name: uidl
- !ruby/object:RI::MethodSummary 
  name: unique_id
name: POPMail
superclass: Object
PK}[���##$ri/1.8/system/Net/POPMail/pop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: all
- !ruby/object:RI::AliasName 
  name: mail
block_params: message_chunk
comment: 
- !ruby/struct:SM::Flow::P 
  body: This method fetches the message. If called with a block, the message is yielded to the block one chunk at a time. If called without a block, the message is returned as a String. The optional <tt>dest</tt> argument will be prepended to the returned String; this argument is essentially obsolete.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example without block
- !ruby/struct:SM::Flow::VERB 
  body: "    POP3.start('pop.example.com', 110,\n               'YourAccount, 'YourPassword') do |pop|\n      n = 1\n      pop.mails.each do |popmail|\n        File.open(&quot;inbox/#{n}&quot;, 'w') do |f|\n          f.write popmail.pop\n        end\n        popmail.delete\n        n += 1\n      end\n    end\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example with block
- !ruby/struct:SM::Flow::VERB 
  body: "    POP3.start('pop.example.com', 110,\n               'YourAccount, 'YourPassword') do |pop|\n      n = 1\n      pop.mails.each do |popmail|\n        File.open(&quot;inbox/#{n}&quot;, 'w') do |f|\n          popmail.pop do |chunk|            ####\n            f.write chunk\n          end\n        end\n        n += 1\n      end\n    end\n"
- !ruby/struct:SM::Flow::P 
  body: This method raises a POPError if an error occurs.
full_name: Net::POPMail#pop
is_singleton: false
name: pop
params: ( dest = '' ) {|message_chunk| ...}
visibility: public
PK}[,�m	��*ri/1.8/system/Net/POPMail/unique_id-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: uidl
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the unique-id of the message. Normally the unique-id is a hash string of the message.
- !ruby/struct:SM::Flow::P 
  body: This method raises a POPError if an error occurs.
full_name: Net::POPMail#unique_id
is_singleton: false
name: unique_id
params: ()
visibility: public
PK}[v�X��'ri/1.8/system/Net/POPMail/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: delete!
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Marks a message for deletion on the server. Deletion does not actually occur until the end of the session; deletion may be cancelled for <em>all</em> marked messages by calling POP3#reset().
- !ruby/struct:SM::Flow::P 
  body: This method raises a POPError if an error occurs.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "    POP3.start('pop.example.com', 110,\n               'YourAccount, 'YourPassword') do |pop|\n      n = 1\n      pop.mails.each do |popmail|\n        File.open(&quot;inbox/#{n}&quot;, 'w') do |f|\n          f.write popmail.pop\n        end\n        popmail.delete         ####\n        n += 1\n      end\n    end\n"
full_name: Net::POPMail#delete
is_singleton: false
name: delete
params: ()
visibility: public
PK}[�Ol,��'ri/1.8/system/Net/POPMail/header-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Fetches the message header.
- !ruby/struct:SM::Flow::P 
  body: The optional <tt>dest</tt> argument is obsolete.
- !ruby/struct:SM::Flow::P 
  body: This method raises a POPError if an error occurs.
full_name: Net::POPMail#header
is_singleton: false
name: header
params: (dest = '')
visibility: public
PK}[?����$ri/1.8/system/Net/POPMail/top-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Fetches the message header and <tt>lines</tt> lines of body.
- !ruby/struct:SM::Flow::P 
  body: The optional <tt>dest</tt> argument is obsolete.
- !ruby/struct:SM::Flow::P 
  body: This method raises a POPError if an error occurs.
full_name: Net::POPMail#top
is_singleton: false
name: top
params: (lines, dest = '')
visibility: public
PK}[���[		(ri/1.8/system/Net/POPMail/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Provide human-readable stringification of class state.
full_name: Net::POPMail#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK}[>2���*ri/1.8/system/Net/POPMail/delete%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #delete"
full_name: Net::POPMail#delete!
is_singleton: false
name: delete!
params: ()
visibility: public
PK}[J����+ri/1.8/system/Net/POPMail/deleted%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: True if the mail has been deleted.
full_name: Net::POPMail#deleted?
is_singleton: false
name: deleted?
params: ()
visibility: public
PK}[T����$ri/1.8/system/Net/POPMail/all-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #pop"
full_name: Net::POPMail#all
is_singleton: false
name: all
params: ( dest = '' )
visibility: public
PK}[gJ���%ri/1.8/system/Net/POPMail/mail-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #pop"
full_name: Net::POPMail#mail
is_singleton: false
name: mail
params: ( dest = '' )
visibility: public
PK}[�9[���%ri/1.8/system/Net/POPMail/uidl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #unique_id"
full_name: Net::POPMail#uidl
is_singleton: false
name: uidl
params: ()
visibility: public
PK}[���>ri/1.8/system/Net/ProtoServerError/cdesc-ProtoServerError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::ProtoServerError
includes: []

instance_methods: []

name: ProtoServerError
superclass: ProtocolError
PK}[m�],hh:ri/1.8/system/Net/SMTPServerBusy/cdesc-SMTPServerBusy.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Represents SMTP error code 420 or 450, a temporary error.
constants: []

full_name: Net::SMTPServerBusy
includes: 
- !ruby/object:RI::IncludedModule 
  name: SMTPError
instance_methods: []

name: SMTPServerBusy
superclass: ProtoServerError
PK}[]�a���2ri/1.8/system/Net/NetPrivate/cdesc-NetPrivate.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::NetPrivate
includes: []

instance_methods: []

name: NetPrivate
superclass: 
PK}[+ZG�#ri/1.8/system/Net/HTTP/head2-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #request_head"
full_name: Net::HTTP#head2
is_singleton: false
name: head2
params: (path, initheader = nil, &block)
visibility: public
PK}[�$n��%ri/1.8/system/Net/HTTP/connect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTP#connect
is_singleton: false
name: connect
params: ()
visibility: private
PK}[#(�(ri/1.8/system/Net/HTTP/proxy_user-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: User name for accessing proxy. If self does not use a proxy, nil.
full_name: Net::HTTP#proxy_user
is_singleton: false
name: proxy_user
params: ()
visibility: public
PK}[R�Ѝ��)ri/1.8/system/Net/HTTP/Put/cdesc-Put.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: METHOD
  value: "'PUT'"
- !ruby/object:RI::Constant 
  comment: 
  name: REQUEST_HAS_BODY
  value: "true"
- !ruby/object:RI::Constant 
  comment: 
  name: RESPONSE_HAS_BODY
  value: "true"
full_name: Net::HTTP::Put
includes: []

instance_methods: []

name: Put
superclass: HTTPRequest
PK}[�2�

*ri/1.8/system/Net/HTTP/get_response-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Send a GET request to the target and return the response as a Net::HTTPResponse object. The target can either be specified as (<tt>uri</tt>), or as (<tt>host</tt>, <tt>path</tt>, <tt>port</tt> = 80); so:"
- !ruby/struct:SM::Flow::VERB 
  body: "   res = Net::HTTP.get_response(URI.parse('http://www.example.com/index.html'))\n   print res.body\n"
- !ruby/struct:SM::Flow::P 
  body: "or:"
- !ruby/struct:SM::Flow::VERB 
  body: "   res = Net::HTTP.get_response('www.example.com', '/index.html')\n   print res.body\n"
full_name: Net::HTTP::get_response
is_singleton: true
name: get_response
params: (uri_or_host, path = nil, port = nil, &block)
visibility: public
PK}[�i��99"ri/1.8/system/Net/HTTP/move-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a MOVE request to the <tt>path</tt> and gets a response, as an HTTPResponse object.
full_name: Net::HTTP#move
is_singleton: false
name: move
params: (path, initheader = nil)
visibility: public
PK}[��r��7ri/1.8/system/Net/HTTP/ProxyDelta/cdesc-ProxyDelta.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::HTTP::ProxyDelta
includes: []

instance_methods: []

name: ProxyDelta
superclass: 
PK}[��ae��'ri/1.8/system/Net/HTTP/proxyport-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #proxy_port"
full_name: Net::HTTP#proxyport
is_singleton: false
name: proxyport
params: ()
visibility: public
PK}[#Rֲ�+ri/1.8/system/Net/HTTP/Move/cdesc-Move.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: METHOD
  value: "'MOVE'"
- !ruby/object:RI::Constant 
  comment: 
  name: REQUEST_HAS_BODY
  value: "false"
- !ruby/object:RI::Constant 
  comment: 
  name: RESPONSE_HAS_BODY
  value: "true"
full_name: Net::HTTP::Move
includes: []

instance_methods: []

name: Move
superclass: HTTPRequest
PK}[l�sw))(ri/1.8/system/Net/HTTP/started%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: active?
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: returns true if the HTTP session is started.
full_name: Net::HTTP#started?
is_singleton: false
name: started?
params: ()
visibility: public
PK}[��K��)ri/1.8/system/Net/HTTP/ssl_timeout-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTP#ssl_timeout
is_singleton: false
name: ssl_timeout
params: ()
visibility: public
PK}[/H`|(ri/1.8/system/Net/HTTP/proxy_pass-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: User password for accessing proxy. If self does not use a proxy, nil.
full_name: Net::HTTP#proxy_pass
is_singleton: false
name: proxy_pass
params: ()
visibility: public
PK}[v�:C/ri/1.8/system/Net/HTTP/http_default_port-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The default port to use for HTTP requests; defaults to 80.
full_name: Net::HTTP::http_default_port
is_singleton: true
name: http_default_port
params: ()
visibility: public
PK}[���+ri/1.8/system/Net/HTTP/Lock/cdesc-Lock.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: METHOD
  value: "'LOCK'"
- !ruby/object:RI::Constant 
  comment: 
  name: REQUEST_HAS_BODY
  value: "true"
- !ruby/object:RI::Constant 
  comment: 
  name: RESPONSE_HAS_BODY
  value: "true"
full_name: Net::HTTP::Lock
includes: []

instance_methods: []

name: Lock
superclass: HTTPRequest
PK}[�ў�.ri/1.8/system/Net/HTTP/set_debug_output-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: <b>WARNING</b> This method causes serious security hole. Never use this method in production code.
- !ruby/struct:SM::Flow::P 
  body: Set an output stream for debugging.
- !ruby/struct:SM::Flow::VERB 
  body: "  http = Net::HTTP.new\n  http.set_debug_output $stderr\n  http.start { .... }\n"
full_name: Net::HTTP#set_debug_output
is_singleton: false
name: set_debug_output
params: (output)
visibility: public
PK}[�����(ri/1.8/system/Net/HTTP/use_ssl%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTP#use_ssl?
is_singleton: false
name: use_ssl?
params: ()
visibility: public
PK}[�h�Z*ri/1.8/system/Net/HTTP/default_port-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The default port to use for HTTP requests; defaults to 80.
full_name: Net::HTTP::default_port
is_singleton: true
name: default_port
params: ()
visibility: public
PK}[��j�*ri/1.8/system/Net/HTTP/request_head-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: head2
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a HEAD request to the <tt>path</tt> and gets a response, as an HTTPResponse object.
- !ruby/struct:SM::Flow::P 
  body: Returns the response.
- !ruby/struct:SM::Flow::P 
  body: This method never raises Net::* exceptions.
- !ruby/struct:SM::Flow::VERB 
  body: "    response = http.request_head('/index.html')\n    p response['content-type']\n"
full_name: Net::HTTP#request_head
is_singleton: false
name: request_head
params: (path, initheader = nil, &block)
visibility: public
PK}[C���%ri/1.8/system/Net/HTTP/use_ssl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #use_ssl?"
full_name: Net::HTTP#use_ssl
is_singleton: false
name: use_ssl
params: ()
visibility: public
PK}[��V��'ri/1.8/system/Net/HTTP/peer_cert-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTP#peer_cert
is_singleton: false
name: peer_cert
params: ()
visibility: public
PK}[��	{��'ri/1.8/system/Net/HTTP/conn_port-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTP#conn_port
is_singleton: false
name: conn_port
params: ()
visibility: private
PK}[�`*���&ri/1.8/system/Net/HTTP/do_start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTP#do_start
is_singleton: false
name: do_start
params: ()
visibility: private
PK}[�
#nn"ri/1.8/system/Net/HTTP/head-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Gets only the header from <tt>path</tt> on the connected-to host. <tt>header</tt> is a Hash like { 'Accept' =&gt; '*/*', ... }.
- !ruby/struct:SM::Flow::P 
  body: This method returns a Net::HTTPResponse object.
- !ruby/struct:SM::Flow::P 
  body: In version 1.1, this method might raise an exception for 3xx (redirect). On the case you can get a HTTPResponse object by &quot;anException.response&quot;. In version 1.2, this method never raises an exception.
- !ruby/struct:SM::Flow::VERB 
  body: "    response = nil\n    Net::HTTP.start('some.www.server', 80) {|http|\n      response = http.head('/index.html')\n    }\n    p response['content-type']\n"
full_name: Net::HTTP#head
is_singleton: false
name: head
params: (path, initheader = nil)
visibility: public
PK}[�5���1ri/1.8/system/Net/HTTP/Options/cdesc-Options.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: METHOD
  value: "'OPTIONS'"
- !ruby/object:RI::Constant 
  comment: 
  name: REQUEST_HAS_BODY
  value: "false"
- !ruby/object:RI::Constant 
  comment: 
  name: RESPONSE_HAS_BODY
  value: "false"
full_name: Net::HTTP::Options
includes: []

instance_methods: []

name: Options
superclass: HTTPRequest
PK}[Z� ��+ri/1.8/system/Net/HTTP/Head/cdesc-Head.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: METHOD
  value: "'HEAD'"
- !ruby/object:RI::Constant 
  comment: 
  name: REQUEST_HAS_BODY
  value: "false"
- !ruby/object:RI::Constant 
  comment: 
  name: RESPONSE_HAS_BODY
  value: "false"
full_name: Net::HTTP::Head
includes: []

instance_methods: []

name: Head
superclass: HTTPRequest
PK}[�j^SS$ri/1.8/system/Net/HTTP/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a DELETE request to the <tt>path</tt> and gets a response, as an HTTPResponse object.
full_name: Net::HTTP#delete
is_singleton: false
name: delete
params: (path, initheader = {'Depth' => 'Infinity'})
visibility: public
PK}[q�K�#ri/1.8/system/Net/HTTP/post2-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #request_post"
full_name: Net::HTTP#post2
is_singleton: false
name: post2
params: (path, data, initheader = nil)
visibility: public
PK}[����NN'ri/1.8/system/Net/HTTP/proppatch-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a PROPPATCH request to the <tt>path</tt> and gets a response, as an HTTPResponse object.
full_name: Net::HTTP#proppatch
is_singleton: false
name: proppatch
params: (path, body, initheader = nil)
visibility: public
PK}[0��(ri/1.8/system/Net/HTTP/on_connect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTP#on_connect
is_singleton: false
name: on_connect
params: ()
visibility: private
PK}[������*ri/1.8/system/Net/HTTP/conn_address-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: without proxy
full_name: Net::HTTP#conn_address
is_singleton: false
name: conn_address
params: ()
visibility: private
PK}[J�J���3ri/1.8/system/Net/HTTP/Propfind/cdesc-Propfind.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: WebDAV methods --- RFC2518
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: METHOD
  value: "'PROPFIND'"
- !ruby/object:RI::Constant 
  comment: 
  name: REQUEST_HAS_BODY
  value: "true"
- !ruby/object:RI::Constant 
  comment: 
  name: RESPONSE_HAS_BODY
  value: "true"
full_name: Net::HTTP::Propfind
includes: []

instance_methods: []

name: Propfind
superclass: HTTPRequest
PK}[Pޣ-��'ri/1.8/system/Net/HTTP/active%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #started?"
full_name: Net::HTTP#active?
is_singleton: false
name: active?
params: ()
visibility: public
PK}[��-@@(ri/1.8/system/Net/HTTP/proxy_port-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: proxyport
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Port number of proxy host. If self does not use a proxy, nil.
full_name: Net::HTTP#proxy_port
is_singleton: false
name: proxy_port
params: ()
visibility: public
PK}[��*�EE$ri/1.8/system/Net/HTTP/unlock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a UNLOCK request to the <tt>path</tt> and gets a response, as an HTTPResponse object.
full_name: Net::HTTP#unlock
is_singleton: false
name: unlock
params: (path, body, initheader = nil)
visibility: public
PK}[��:"ri/1.8/system/Net/HTTP/post-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: +body_segment+
comment: 
- !ruby/struct:SM::Flow::P 
  body: Posts <tt>data</tt> (must be a String) to <tt>path</tt>. <tt>header</tt> must be a Hash like { 'Accept' =&gt; '*/*', ... }.
- !ruby/struct:SM::Flow::P 
  body: In version 1.1 (ruby 1.6), this method returns a pair of objects, a Net::HTTPResponse object and an entity body string. In version 1.2 (ruby 1.8), this method returns a Net::HTTPResponse object.
- !ruby/struct:SM::Flow::P 
  body: If called with a block, yields each fragment of the entity body in turn as a string as it are read from the socket. Note that in this case, the returned response object will <b>not</b> contain a (meaningful) body.
- !ruby/struct:SM::Flow::P 
  body: <tt>dest</tt> argument is obsolete. It still works but you must not use it.
- !ruby/struct:SM::Flow::P 
  body: In version 1.1, this method might raise an exception for 3xx (redirect). In this case you can get an HTTPResponse object by &quot;anException.response&quot;. In version 1.2, this method never raises exception.
- !ruby/struct:SM::Flow::VERB 
  body: "    # version 1.1\n    response, body = http.post('/cgi-bin/search.rb', 'query=foo')\n\n    # version 1.2\n    response = http.post('/cgi-bin/search.rb', 'query=foo')\n\n    # using block\n    File.open('result.txt', 'w') {|f|\n      http.post('/cgi-bin/search.rb', 'query=foo') do |str|\n        f.write str\n      end\n    }\n"
- !ruby/struct:SM::Flow::P 
  body: "You should set Content-Type: header field for POST. If no Content-Type: field given, this method uses &quot;application/x-www-form-urlencoded&quot; by default."
full_name: Net::HTTP#post
is_singleton: false
name: post
params: (path, data, initheader = nil, dest = nil) {|+body_segment+| ...}
visibility: public
PK}[N��hgg*ri/1.8/system/Net/HTTP/send_request-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends an HTTP request to the HTTP server. This method also sends DATA string if DATA is given.
- !ruby/struct:SM::Flow::P 
  body: Returns a HTTPResponse object.
- !ruby/struct:SM::Flow::P 
  body: This method never raises Net::* exceptions.
- !ruby/struct:SM::Flow::VERB 
  body: "   response = http.send_request('GET', '/index.html')\n   puts response.body\n"
full_name: Net::HTTP#send_request
is_singleton: false
name: send_request
params: (name, path, data = nil, header = nil)
visibility: public
PK}[��|��ri/1.8/system/Net/HTTP/D-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTP#D
is_singleton: false
name: D
params: (msg)
visibility: private
PK}[����!ri/1.8/system/Net/HTTP/get-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Send a GET request to the target and return the response as a string. The target can either be specified as (<tt>uri</tt>), or as (<tt>host</tt>, <tt>path</tt>, <tt>port</tt> = 80); so:"
- !ruby/struct:SM::Flow::VERB 
  body: "   print Net::HTTP.get(URI.parse('http://www.example.com/index.html'))\n"
- !ruby/struct:SM::Flow::P 
  body: "or:"
- !ruby/struct:SM::Flow::VERB 
  body: "   print Net::HTTP.get('www.example.com', '/index.html')\n"
full_name: Net::HTTP::get
is_singleton: true
name: get
params: (uri_or_host, path = nil, port = nil)
visibility: public
PK}[K4RYY!ri/1.8/system/Net/HTTP/get-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: +body_segment+
comment: 
- !ruby/struct:SM::Flow::P 
  body: Gets data from <tt>path</tt> on the connected-to host. <tt>header</tt> must be a Hash like { 'Accept' =&gt; '*/*', ... }.
- !ruby/struct:SM::Flow::P 
  body: In version 1.1 (ruby 1.6), this method returns a pair of objects, a Net::HTTPResponse object and the entity body string. In version 1.2 (ruby 1.8), this method returns a Net::HTTPResponse object.
- !ruby/struct:SM::Flow::P 
  body: If called with a block, yields each fragment of the entity body in turn as a string as it is read from the socket. Note that in this case, the returned response object will <b>not</b> contain a (meaningful) body.
- !ruby/struct:SM::Flow::P 
  body: <tt>dest</tt> argument is obsolete. It still works but you must not use it.
- !ruby/struct:SM::Flow::P 
  body: In version 1.1, this method might raise an exception for 3xx (redirect). In this case you can get a HTTPResponse object by &quot;anException.response&quot;.
- !ruby/struct:SM::Flow::P 
  body: In version 1.2, this method never raises exception.
- !ruby/struct:SM::Flow::VERB 
  body: "    # version 1.1 (bundled with Ruby 1.6)\n    response, body = http.get('/index.html')\n\n    # version 1.2 (bundled with Ruby 1.8 or later)\n    response = http.get('/index.html')\n\n    # using block\n    File.open('result.txt', 'w') {|f|\n      http.get('/~foo/') do |str|\n        f.write str\n      end\n    }\n"
full_name: Net::HTTP#get
is_singleton: false
name: get
params: (path, initheader = nil, dest = nil) {|+body_segment+| ...}
visibility: public
PK}[r;�$��%ri/1.8/system/Net/HTTP/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTP#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK}[�8��$ri/1.8/system/Net/HTTP/finish-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Finishes HTTP session and closes TCP connection. Raises IOError if not started.
full_name: Net::HTTP#finish
is_singleton: false
name: finish
params: ()
visibility: public
PK}[�_���+ri/1.8/system/Net/HTTP/end_transport-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTP#end_transport
is_singleton: false
name: end_transport
params: (req, res)
visibility: private
PK}[3��O��2ri/1.8/system/Net/HTTP/ssl_context_accessor-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTP::ssl_context_accessor
is_singleton: true
name: ssl_context_accessor
params: (name)
visibility: public
PK}[V:]<<#ri/1.8/system/Net/HTTP/trace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a TRACE request to the <tt>path</tt> and gets a response, as an HTTPResponse object.
full_name: Net::HTTP#trace
is_singleton: false
name: trace
params: (path, initheader = nil)
visibility: public
PK}[���yKK!ri/1.8/system/Net/HTTP/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new Net::HTTP object for the specified <tt>address</tt>. This method does not open the TCP connection.
full_name: Net::HTTP::new
is_singleton: true
name: new
params: (address, port = nil)
visibility: public
PK}[�,ri/1.8/system/Net/HTTP/version_1_1%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: true if net/http is in version 1.1 compatible mode. Defaults to true.
full_name: Net::HTTP::version_1_1?
is_singleton: true
name: version_1_1?
params: ()
visibility: public
PK}[���<nn)ri/1.8/system/Net/HTTP/request_get-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: get2
block_params: +response+
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a GET request to the <tt>path</tt> and gets a response, as an HTTPResponse object.
- !ruby/struct:SM::Flow::P 
  body: When called with a block, yields an HTTPResponse object. The body of this response will not have been read yet; the caller can process it using HTTPResponse#read_body, if desired.
- !ruby/struct:SM::Flow::P 
  body: Returns the response.
- !ruby/struct:SM::Flow::P 
  body: This method never raises Net::* exceptions.
- !ruby/struct:SM::Flow::VERB 
  body: "    response = http.request_get('/index.html')\n    # The entity body is already read here.\n    p response['content-type']\n    puts response.body\n\n    # using block\n    http.request_get('/index.html') {|response|\n      p response['content-type']\n      response.read_body do |str|   # read body now\n        print str\n      end\n    }\n"
full_name: Net::HTTP#request_get
is_singleton: false
name: request_get
params: (path, initheader = nil) {|+response+| ...}
visibility: public
PK}[�Q99"ri/1.8/system/Net/HTTP/copy-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a COPY request to the <tt>path</tt> and gets a response, as an HTTPResponse object.
full_name: Net::HTTP#copy
is_singleton: false
name: copy
params: (path, initheader = nil)
visibility: public
PK}[p�z��*ri/1.8/system/Net/HTTP/request_post-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: post2
block_params: +response+
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a POST request to the <tt>path</tt> and gets a response, as an HTTPResponse object.
- !ruby/struct:SM::Flow::P 
  body: When called with a block, yields an HTTPResponse object. The body of this response will not have been read yet; the caller can process it using HTTPResponse#read_body, if desired.
- !ruby/struct:SM::Flow::P 
  body: Returns the response.
- !ruby/struct:SM::Flow::P 
  body: This method never raises Net::* exceptions.
- !ruby/struct:SM::Flow::VERB 
  body: "    # example\n    response = http.request_post('/cgi-bin/nice.rb', 'datadatadata...')\n    p response.status\n    puts response.body          # body is already read\n\n    # using block\n    http.request_post('/cgi-bin/nice.rb', 'datadatadata...') {|response|\n      p response.status\n      p response['content-type']\n      response.read_body do |str|   # read body now\n        print str\n      end\n    }\n"
full_name: Net::HTTP#request_post
is_singleton: false
name: request_post
params: (path, data, initheader = nil) {|+response+| ...}
visibility: public
PK}[�<%ri/1.8/system/Net/HTTP/request-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: +response+
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends an HTTPRequest object REQUEST to the HTTP server. This method also sends DATA string if REQUEST is a post/put request. Giving DATA for get/head request causes ArgumentError.
- !ruby/struct:SM::Flow::P 
  body: When called with a block, yields an HTTPResponse object. The body of this response will not have been read yet; the caller can process it using HTTPResponse#read_body, if desired.
- !ruby/struct:SM::Flow::P 
  body: Returns a HTTPResponse object.
- !ruby/struct:SM::Flow::P 
  body: This method never raises Net::* exceptions.
full_name: Net::HTTP#request
is_singleton: false
name: request
params: (req, body = nil) {|+response+| ...}
visibility: public
PK}[�kV33#ri/1.8/system/Net/HTTP/start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: http
comment: 
- !ruby/struct:SM::Flow::P 
  body: Opens TCP connection and HTTP session.
- !ruby/struct:SM::Flow::P 
  body: When this method is called with block, gives a HTTP object to the block and closes the TCP connection / HTTP session after the block executed.
- !ruby/struct:SM::Flow::P 
  body: When called with a block, returns the return value of the block; otherwise, returns self.
full_name: Net::HTTP#start
is_singleton: false
name: start
params: ( {|http| ...}
visibility: public
PK}[w��""0ri/1.8/system/Net/HTTP/https_default_port-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The default port to use for HTTPS requests; defaults to 443.
full_name: Net::HTTP::https_default_port
is_singleton: true
name: https_default_port
params: ()
visibility: public
PK}[�c����+ri/1.8/system/Net/HTTP/Post/cdesc-Post.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: METHOD
  value: "'POST'"
- !ruby/object:RI::Constant 
  comment: 
  name: REQUEST_HAS_BODY
  value: "true"
- !ruby/object:RI::Constant 
  comment: 
  name: RESPONSE_HAS_BODY
  value: "true"
full_name: Net::HTTP::Post
includes: []

instance_methods: []

name: Post
superclass: HTTPRequest
PK}[�ψɿ�-ri/1.8/system/Net/HTTP/begin_transport-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTP#begin_transport
is_singleton: false
name: begin_transport
params: (req)
visibility: private
PK}[��W6��-ri/1.8/system/Net/HTTP/Mkcol/cdesc-Mkcol.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: METHOD
  value: "'MKCOL'"
- !ruby/object:RI::Constant 
  comment: 
  name: REQUEST_HAS_BODY
  value: "true"
- !ruby/object:RI::Constant 
  comment: 
  name: RESPONSE_HAS_BODY
  value: "true"
full_name: Net::HTTP::Mkcol
includes: []

instance_methods: []

name: Mkcol
superclass: HTTPRequest
PK}[�# ���'ri/1.8/system/Net/HTTP/addr_port-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: utils
full_name: Net::HTTP#addr_port
is_singleton: false
name: addr_port
params: ()
visibility: private
PK}[X��l��(ri/1.8/system/Net/HTTP/timeout%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #ssl_timeout="
full_name: Net::HTTP#timeout=
is_singleton: false
name: timeout=
params: (sec)
visibility: public
PK}[���,ri/1.8/system/Net/HTTP/proxy_class%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: returns true if self is a class which was created by HTTP::Proxy.
full_name: Net::HTTP::proxy_class?
is_singleton: true
name: proxy_class?
params: ()
visibility: public
PK}[
�A���'ri/1.8/system/Net/HTTP/proxyaddr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #proxy_address"
full_name: Net::HTTP#proxyaddr
is_singleton: false
name: proxyaddr
params: ()
visibility: public
PK}[H�ص��5ri/1.8/system/Net/HTTP/Proppatch/cdesc-Proppatch.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: METHOD
  value: "'PROPPATCH'"
- !ruby/object:RI::Constant 
  comment: 
  name: REQUEST_HAS_BODY
  value: "true"
- !ruby/object:RI::Constant 
  comment: 
  name: RESPONSE_HAS_BODY
  value: "true"
full_name: Net::HTTP::Proppatch
includes: []

instance_methods: []

name: Proppatch
superclass: HTTPRequest
PK}[�;j��)ri/1.8/system/Net/HTTP/Get/cdesc-Get.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: HTTP 1.1 methods --- RFC2616
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: METHOD
  value: "'GET'"
- !ruby/object:RI::Constant 
  comment: 
  name: REQUEST_HAS_BODY
  value: "false"
- !ruby/object:RI::Constant 
  comment: 
  name: RESPONSE_HAS_BODY
  value: "true"
full_name: Net::HTTP::Get
includes: []

instance_methods: []

name: Get
superclass: HTTPRequest
PK}[�sxE��'ri/1.8/system/Net/HTTP/edit_path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTP#edit_path
is_singleton: false
name: edit_path
params: (path)
visibility: private
PK}[_�U�HH#ri/1.8/system/Net/HTTP/mkcol-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a MKCOL request to the <tt>path</tt> and gets a response, as an HTTPResponse object.
full_name: Net::HTTP#mkcol
is_singleton: false
name: mkcol
params: (path, body = nil, initheader = nil)
visibility: public
PK}[�j��-ri/1.8/system/Net/HTTP/read_timeout%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Setter for the read_timeout attribute.
full_name: Net::HTTP#read_timeout=
is_singleton: false
name: read_timeout=
params: (sec)
visibility: public
PK}[
�V�,ri/1.8/system/Net/HTTP/version_1_2%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: true if net/http is in version 1.2 mode. Defaults to true.
full_name: Net::HTTP::version_1_2?
is_singleton: true
name: version_1_2?
params: ()
visibility: public
PK}[G8PA)ri/1.8/system/Net/HTTP/version_1_1-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Turns on net/http 1.1 (ruby 1.6) features. Defaults to OFF in ruby 1.8.
full_name: Net::HTTP::version_1_1
is_singleton: true
name: version_1_1
params: ()
visibility: public
PK}[rG�2��+ri/1.8/system/Net/HTTP/keep_alive%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTP#keep_alive?
is_singleton: false
name: keep_alive?
params: (req, res)
visibility: private
PK}[>�`�BB%ri/1.8/system/Net/HTTP/options-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a OPTIONS request to the <tt>path</tt> and gets a response, as an HTTPResponse object.
full_name: Net::HTTP#options
is_singleton: false
name: options
params: (path, initheader = nil)
visibility: public
PK}[�ʰ�'ri/1.8/system/Net/HTTP/do_finish-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::HTTP#do_finish
is_singleton: false
name: do_finish
params: ()
visibility: private
PK}[ ?�?"ri/1.8/system/Net/HTTP/lock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a LOCK request to the <tt>path</tt> and gets a response, as an HTTPResponse object.
full_name: Net::HTTP#lock
is_singleton: false
name: lock
params: (path, body, initheader = nil)
visibility: public
PK}[ȩ���"ri/1.8/system/Net/HTTP/get2-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #request_get"
full_name: Net::HTTP#get2
is_singleton: false
name: get2
params: (path, initheader = nil)
visibility: public
PK}[7�@�7�7&ri/1.8/system/Net/HTTP/cdesc-HTTP.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The host name to connect to.
  name: address
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: close_on_empty_response
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Seconds to wait until connection is opened. If the HTTP object cannot open a connection in this many seconds, it raises a TimeoutError exception.
  name: open_timeout
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The port number to connect to.
  name: port
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: proxy_address
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: proxy_pass
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: proxy_port
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: proxy_user
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Seconds to wait until reading one block (by one read(2) call). If the HTTP object cannot open a connection in this many seconds, it raises a TimeoutError exception.
  name: read_timeout
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: Proxy
- !ruby/object:RI::MethodSummary 
  name: default_port
- !ruby/object:RI::MethodSummary 
  name: get
- !ruby/object:RI::MethodSummary 
  name: get_print
- !ruby/object:RI::MethodSummary 
  name: get_response
- !ruby/object:RI::MethodSummary 
  name: http_default_port
- !ruby/object:RI::MethodSummary 
  name: https_default_port
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: post_form
- !ruby/object:RI::MethodSummary 
  name: proxy_class?
- !ruby/object:RI::MethodSummary 
  name: ssl_context_accessor
- !ruby/object:RI::MethodSummary 
  name: start
- !ruby/object:RI::MethodSummary 
  name: version_1_1
- !ruby/object:RI::MethodSummary 
  name: version_1_1?
- !ruby/object:RI::MethodSummary 
  name: version_1_2
- !ruby/object:RI::MethodSummary 
  name: version_1_2?
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: What Is This Library?
- !ruby/struct:SM::Flow::P 
  body: This library provides your program functions to access WWW documents via HTTP, Hyper Text Transfer Protocol version 1.1. For details of HTTP, refer [RFC2616] (http://www.ietf.org/rfc/rfc2616.txt).
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Examples
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Getting Document From WWW Server
- !ruby/struct:SM::Flow::P 
  body: "Example #1: Simple GET+print"
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'net/http'\n    Net::HTTP.get_print 'www.example.com', '/index.html'\n"
- !ruby/struct:SM::Flow::P 
  body: "Example #2: Simple GET+print by URL"
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'net/http'\n    require 'uri'\n    Net::HTTP.get_print URI.parse('http://www.example.com/index.html')\n"
- !ruby/struct:SM::Flow::P 
  body: "Example #3: More generic GET+print"
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'net/http'\n    require 'uri'\n\n    url = URI.parse('http://www.example.com/index.html')\n    res = Net::HTTP.start(url.host, url.port) {|http|\n      http.get('/index.html')\n    }\n    puts res.body\n"
- !ruby/struct:SM::Flow::P 
  body: "Example #4: More generic GET+print"
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'net/http'\n\n    url = URI.parse('http://www.example.com/index.html')\n    req = Net::HTTP::Get.new(url.path)\n    res = Net::HTTP.start(url.host, url.port) {|http|\n      http.request(req)\n    }\n    puts res.body\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Posting Form Data
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'net/http'\n    require 'uri'\n\n    #1: Simple POST\n    res = Net::HTTP.post_form(URI.parse('http://www.example.com/search.cgi'),\n                              {'q'=&gt;'ruby', 'max'=&gt;'50'})\n    puts res.body\n\n    #2: POST with basic authentication\n    res = Net::HTTP.post_form(URI.parse('http://jack:pass@www.example.com/todo.cgi'),\n                                        {'from'=&gt;'2005-01-01', 'to'=&gt;'2005-03-31'})\n    puts res.body\n\n    #3: Detailed control\n    url = URI.parse('http://www.example.com/todo.cgi')\n    req = Net::HTTP::Post.new(url.path)\n    req.basic_auth 'jack', 'pass'\n    req.set_form_data({'from'=&gt;'2005-01-01', 'to'=&gt;'2005-03-31'}, ';')\n    res = Net::HTTP.new(url.host, url.port).start {|http| http.request(req) }\n    case res\n    when Net::HTTPSuccess, Net::HTTPRedirection\n      # OK\n    else\n      res.error!\n    end\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Accessing via Proxy
- !ruby/struct:SM::Flow::P 
  body: Net::HTTP.Proxy creates http proxy class. It has same methods of Net::HTTP but its instances always connect to proxy, instead of given host.
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'net/http'\n\n    proxy_addr = 'your.proxy.host'\n    proxy_port = 8080\n            :\n    Net::HTTP::Proxy(proxy_addr, proxy_port).start('www.example.com') {|http|\n      # always connect to your.proxy.addr:8080\n            :\n    }\n"
- !ruby/struct:SM::Flow::P 
  body: Since Net::HTTP.Proxy returns Net::HTTP itself when proxy_addr is nil, there's no need to change code if there's proxy or not.
- !ruby/struct:SM::Flow::P 
  body: "There are two additional parameters in Net::HTTP.Proxy which allow to specify proxy user name and password:"
- !ruby/struct:SM::Flow::VERB 
  body: "    Net::HTTP::Proxy(proxy_addr, proxy_port, proxy_user = nil, proxy_pass = nil)\n"
- !ruby/struct:SM::Flow::P 
  body: "You may use them to work with authorization-enabled proxies:"
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'net/http'\n    require 'uri'\n\n    proxy_host = 'your.proxy.host'\n    proxy_port = 8080\n    uri = URI.parse(ENV['http_proxy'])\n    proxy_user, proxy_pass = uri.userinfo.split(/:/) if uri.userinfo\n    Net::HTTP::Proxy(proxy_host, proxy_port,\n                     proxy_user, proxy_pass).start('www.example.com') {|http|\n      # always connect to your.proxy.addr:8080 using specified username and password\n            :\n    }\n"
- !ruby/struct:SM::Flow::P 
  body: Note that net/http never rely on HTTP_PROXY environment variable. If you want to use proxy, set it explicitly.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Following Redirection
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'net/http'\n    require 'uri'\n\n    def fetch(uri_str, limit = 10)\n      # You should choose better exception.\n      raise ArgumentError, 'HTTP redirect too deep' if limit == 0\n\n      response = Net::HTTP.get_response(URI.parse(uri_str))\n      case response\n      when Net::HTTPSuccess     then response\n      when Net::HTTPRedirection then fetch(response['location'], limit - 1)\n      else\n        response.error!\n      end\n    end\n\n    print fetch('http://www.ruby-lang.org')\n"
- !ruby/struct:SM::Flow::P 
  body: Net::HTTPSuccess and Net::HTTPRedirection is a HTTPResponse class. All HTTPResponse objects belong to its own response class which indicate HTTP result status. For details of response classes, see section &quot;HTTP Response Classes&quot;.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Basic Authentication
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'net/http'\n\n    Net::HTTP.start('www.example.com') {|http|\n      req = Net::HTTP::Get.new('/secret-page.html')\n      req.basic_auth 'account', 'password'\n      response = http.request(req)\n      print response.body\n    }\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: HTTP Request Classes
- !ruby/struct:SM::Flow::P 
  body: Here is HTTP request class hierarchy.
- !ruby/struct:SM::Flow::VERB 
  body: "  Net::HTTPRequest\n      Net::HTTP::Get\n      Net::HTTP::Head\n      Net::HTTP::Post\n      Net::HTTP::Put\n      Net::HTTP::Proppatch\n      Net::HTTP::Lock\n      Net::HTTP::Unlock\n      Net::HTTP::Options\n      Net::HTTP::Propfind\n      Net::HTTP::Delete\n      Net::HTTP::Move\n      Net::HTTP::Copy\n      Net::HTTP::Mkcol\n      Net::HTTP::Trace\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: HTTP Response Classes
- !ruby/struct:SM::Flow::P 
  body: Here is HTTP response class hierarchy. All classes are defined in Net module.
- !ruby/struct:SM::Flow::VERB 
  body: "  HTTPResponse\n      HTTPUnknownResponse\n      HTTPInformation                    # 1xx\n          HTTPContinue                       # 100\n          HTTPSwitchProtocl                  # 101\n      HTTPSuccess                        # 2xx\n          HTTPOK                             # 200\n          HTTPCreated                        # 201\n          HTTPAccepted                       # 202\n          HTTPNonAuthoritativeInformation    # 203\n          HTTPNoContent                      # 204\n          HTTPResetContent                   # 205\n          HTTPPartialContent                 # 206\n      HTTPRedirection                    # 3xx\n          HTTPMultipleChoice                 # 300\n          HTTPMovedPermanently               # 301\n          HTTPFound                          # 302\n          HTTPSeeOther                       # 303\n          HTTPNotModified                    # 304\n          HTTPUseProxy                       # 305\n          HTTPTemporaryRedirect              # 307\n      HTTPClientError                    # 4xx\n          HTTPBadRequest                     # 400\n          HTTPUnauthorized                   # 401\n          HTTPPaymentRequired                # 402\n          HTTPForbidden                      # 403\n          HTTPNotFound                       # 404\n          HTTPMethodNotAllowed               # 405\n          HTTPNotAcceptable                  # 406\n          HTTPProxyAuthenticationRequired    # 407\n          HTTPRequestTimeOut                 # 408\n          HTTPConflict                       # 409\n          HTTPGone                           # 410\n          HTTPLengthRequired                 # 411\n          HTTPPreconditionFailed             # 412\n          HTTPRequestEntityTooLarge          # 413\n          HTTPRequestURITooLong              # 414\n          HTTPUnsupportedMediaType           # 415\n          HTTPRequestedRangeNotSatisfiable   # 416\n          HTTPExpectationFailed              # 417\n      HTTPServerError                    # 5xx\n          HTTPInternalServerError            # 500\n          HTTPNotImplemented                 # 501\n          HTTPBadGateway                     # 502\n          HTTPServiceUnavailable             # 503\n          HTTPGatewayTimeOut                 # 504\n          HTTPVersionNotSupported            # 505\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Switching Net::HTTP versions
- !ruby/struct:SM::Flow::P 
  body: You can use net/http.rb 1.1 features (bundled with Ruby 1.6) by calling HTTP.version_1_1. Calling Net::HTTP.version_1_2 allows you to use 1.2 features again.
- !ruby/struct:SM::Flow::VERB 
  body: "    # example\n    Net::HTTP.start {|http1| ...(http1 has 1.2 features)... }\n\n    Net::HTTP.version_1_1\n    Net::HTTP.start {|http2| ...(http2 has 1.1 features)... }\n\n    Net::HTTP.version_1_2\n    Net::HTTP.start {|http3| ...(http3 has 1.2 features)... }\n"
- !ruby/struct:SM::Flow::P 
  body: This function is NOT thread-safe.
constants: []

full_name: Net::HTTP
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: D
- !ruby/object:RI::MethodSummary 
  name: active?
- !ruby/object:RI::MethodSummary 
  name: addr_port
- !ruby/object:RI::MethodSummary 
  name: begin_transport
- !ruby/object:RI::MethodSummary 
  name: conn_address
- !ruby/object:RI::MethodSummary 
  name: conn_port
- !ruby/object:RI::MethodSummary 
  name: connect
- !ruby/object:RI::MethodSummary 
  name: copy
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: do_finish
- !ruby/object:RI::MethodSummary 
  name: do_start
- !ruby/object:RI::MethodSummary 
  name: edit_path
- !ruby/object:RI::MethodSummary 
  name: end_transport
- !ruby/object:RI::MethodSummary 
  name: finish
- !ruby/object:RI::MethodSummary 
  name: get
- !ruby/object:RI::MethodSummary 
  name: get2
- !ruby/object:RI::MethodSummary 
  name: head
- !ruby/object:RI::MethodSummary 
  name: head2
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: keep_alive?
- !ruby/object:RI::MethodSummary 
  name: lock
- !ruby/object:RI::MethodSummary 
  name: mkcol
- !ruby/object:RI::MethodSummary 
  name: move
- !ruby/object:RI::MethodSummary 
  name: on_connect
- !ruby/object:RI::MethodSummary 
  name: options
- !ruby/object:RI::MethodSummary 
  name: peer_cert
- !ruby/object:RI::MethodSummary 
  name: post
- !ruby/object:RI::MethodSummary 
  name: post2
- !ruby/object:RI::MethodSummary 
  name: propfind
- !ruby/object:RI::MethodSummary 
  name: proppatch
- !ruby/object:RI::MethodSummary 
  name: proxy?
- !ruby/object:RI::MethodSummary 
  name: proxy_address
- !ruby/object:RI::MethodSummary 
  name: proxy_pass
- !ruby/object:RI::MethodSummary 
  name: proxy_port
- !ruby/object:RI::MethodSummary 
  name: proxy_user
- !ruby/object:RI::MethodSummary 
  name: proxyaddr
- !ruby/object:RI::MethodSummary 
  name: proxyport
- !ruby/object:RI::MethodSummary 
  name: read_timeout=
- !ruby/object:RI::MethodSummary 
  name: request
- !ruby/object:RI::MethodSummary 
  name: request_get
- !ruby/object:RI::MethodSummary 
  name: request_head
- !ruby/object:RI::MethodSummary 
  name: request_post
- !ruby/object:RI::MethodSummary 
  name: send_request
- !ruby/object:RI::MethodSummary 
  name: set_debug_output
- !ruby/object:RI::MethodSummary 
  name: ssl_timeout
- !ruby/object:RI::MethodSummary 
  name: ssl_timeout=
- !ruby/object:RI::MethodSummary 
  name: start
- !ruby/object:RI::MethodSummary 
  name: started?
- !ruby/object:RI::MethodSummary 
  name: timeout=
- !ruby/object:RI::MethodSummary 
  name: trace
- !ruby/object:RI::MethodSummary 
  name: unlock
- !ruby/object:RI::MethodSummary 
  name: use_ssl
- !ruby/object:RI::MethodSummary 
  name: use_ssl=
- !ruby/object:RI::MethodSummary 
  name: use_ssl?
- !ruby/object:RI::MethodSummary 
  name: use_ssl?
name: HTTP
superclass: Protocol
PK}[��ø�/ri/1.8/system/Net/HTTP/Delete/cdesc-Delete.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: METHOD
  value: "'DELETE'"
- !ruby/object:RI::Constant 
  comment: 
  name: REQUEST_HAS_BODY
  value: "false"
- !ruby/object:RI::Constant 
  comment: 
  name: RESPONSE_HAS_BODY
  value: "true"
full_name: Net::HTTP::Delete
includes: []

instance_methods: []

name: Delete
superclass: HTTPRequest
PK}[^DU=kk(ri/1.8/system/Net/HTTP/use_ssl%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Turn on/off SSL. This flag must be set before starting session. If you change use_ssl value after session started, a Net::HTTP object raises IOError.
full_name: Net::HTTP#use_ssl=
is_singleton: false
name: use_ssl=
params: (flag)
visibility: public
PK}[�w
|��-ri/1.8/system/Net/HTTP/Trace/cdesc-Trace.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: METHOD
  value: "'TRACE'"
- !ruby/object:RI::Constant 
  comment: 
  name: REQUEST_HAS_BODY
  value: "false"
- !ruby/object:RI::Constant 
  comment: 
  name: RESPONSE_HAS_BODY
  value: "true"
full_name: Net::HTTP::Trace
includes: []

instance_methods: []

name: Trace
superclass: HTTPRequest
PK}[k��i^^&ri/1.8/system/Net/HTTP/propfind-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sends a PROPFIND request to the <tt>path</tt> and gets a response, as an HTTPResponse object.
full_name: Net::HTTP#propfind
is_singleton: false
name: propfind
params: (path, body = nil, initheader = {'Depth' => '0'})
visibility: public
PK}[JZ���,ri/1.8/system/Net/HTTP/ssl_timeout%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: timeout=
block_params: 
comment: 
full_name: Net::HTTP#ssl_timeout=
is_singleton: false
name: ssl_timeout=
params: (sec)
visibility: public
PK}[(���#ri/1.8/system/Net/HTTP/start-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: +http+
comment: 
- !ruby/struct:SM::Flow::P 
  body: creates a new Net::HTTP object and opens its TCP connection and HTTP session. If the optional block is given, the newly created Net::HTTP object is passed to it and closed when the block finishes. In this case, the return value of this method is the return value of the block. If no block is given, the return value of this method is the newly created Net::HTTP object itself, and the caller is responsible for closing it upon completion.
full_name: Net::HTTP::start
is_singleton: true
name: start
params: (address, port = nil, p_addr = nil, p_port = nil, p_user = nil, p_pass = nil) {|+http+| ...}
visibility: public
PK}[x���'ri/1.8/system/Net/HTTP/get_print-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Get body from target and output it to +$stdout+. The target can either be specified as (<tt>uri</tt>), or as (<tt>host</tt>, <tt>path</tt>, <tt>port</tt> = 80); so:"
- !ruby/struct:SM::Flow::VERB 
  body: "   Net::HTTP.get_print URI.parse('http://www.example.com/index.html')\n"
- !ruby/struct:SM::Flow::P 
  body: "or:"
- !ruby/struct:SM::Flow::VERB 
  body: "   Net::HTTP.get_print 'www.example.com', '/index.html'\n"
full_name: Net::HTTP::get_print
is_singleton: true
name: get_print
params: (uri_or_host, path = nil, port = nil)
visibility: public
PK}[T'ٲ�+ri/1.8/system/Net/HTTP/Copy/cdesc-Copy.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: METHOD
  value: "'COPY'"
- !ruby/object:RI::Constant 
  comment: 
  name: REQUEST_HAS_BODY
  value: "false"
- !ruby/object:RI::Constant 
  comment: 
  name: RESPONSE_HAS_BODY
  value: "true"
full_name: Net::HTTP::Copy
includes: []

instance_methods: []

name: Copy
superclass: HTTPRequest
PK}[�BB+ri/1.8/system/Net/HTTP/proxy_address-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: proxyaddr
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Address of proxy host. If self does not use a proxy, nil.
full_name: Net::HTTP#proxy_address
is_singleton: false
name: proxy_address
params: ()
visibility: public
PK}[6�y~��)ri/1.8/system/Net/HTTP/version_1_2-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Turns on net/http 1.2 (ruby 1.8) features. Defaults to ON in ruby 1.8.
- !ruby/struct:SM::Flow::P 
  body: I strongly recommend to call this method always.
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'net/http'\n  Net::HTTP.version_1_2\n"
full_name: Net::HTTP::version_1_2
is_singleton: true
name: version_1_2
params: ()
visibility: public
PK}[�9��###ri/1.8/system/Net/HTTP/Proxy-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates an HTTP proxy class. Arguments are address/port of proxy host and username/password if authorization on proxy server is required. You can replace the HTTP class with created proxy class.
- !ruby/struct:SM::Flow::P 
  body: If ADDRESS is nil, this method returns self (Net::HTTP).
- !ruby/struct:SM::Flow::VERB 
  body: "    # Example\n    proxy_class = Net::HTTP::Proxy('proxy.example.com', 8080)\n                    :\n    proxy_class.start('www.ruby-lang.org') {|http|\n      # connecting proxy.foo.org:8080\n                    :\n    }\n"
full_name: Net::HTTP::Proxy
is_singleton: true
name: Proxy
params: (p_addr, p_port = nil, p_user = nil, p_pass = nil)
visibility: public
PK}[Bɓ^��'ri/1.8/system/Net/HTTP/post_form-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Posts HTML form data to the <tt>URL</tt>. Form data must be represented as a Hash of String to String, e.g:"
- !ruby/struct:SM::Flow::VERB 
  body: "  { &quot;cmd&quot; =&gt; &quot;search&quot;, &quot;q&quot; =&gt; &quot;ruby&quot;, &quot;max&quot; =&gt; &quot;50&quot; }\n"
- !ruby/struct:SM::Flow::P 
  body: This method also does Basic Authentication iff <tt>URL</tt>.user exists.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'net/http'\n  require 'uri'\n\n  HTTP.post_form URI.parse('http://www.example.com/search.cgi'),\n                 { &quot;q&quot; =&gt; &quot;ruby&quot;, &quot;max&quot; =&gt; &quot;50&quot; }\n"
full_name: Net::HTTP::post_form
is_singleton: true
name: post_form
params: (url, params)
visibility: public
PK}[����&ri/1.8/system/Net/HTTP/proxy%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: True if self is a HTTP proxy class.
full_name: Net::HTTP#proxy?
is_singleton: false
name: proxy?
params: ()
visibility: public
PK}[��η�/ri/1.8/system/Net/HTTP/Unlock/cdesc-Unlock.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: METHOD
  value: "'UNLOCK'"
- !ruby/object:RI::Constant 
  comment: 
  name: REQUEST_HAS_BODY
  value: "true"
- !ruby/object:RI::Constant 
  comment: 
  name: RESPONSE_HAS_BODY
  value: "true"
full_name: Net::HTTP::Unlock
includes: []

instance_methods: []

name: Unlock
superclass: HTTPRequest
PK}[�
�++(ri/1.8/system/Net/POP3/started%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: active?
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>true</tt> if the POP3 session has started.
full_name: Net::POP3#started?
is_singleton: false
name: started?
params: ()
visibility: public
PK}[z����"ri/1.8/system/Net/POP3/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #each_mail"
full_name: Net::POP3#each
is_singleton: false
name: each
params: ()
visibility: public
PK}[7'�WW(ri/1.8/system/Net/POP3/enable_ssl-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Enable SSL for all new instances. <tt>params</tt> is passed to OpenSSL::SSLContext#set_params.
full_name: Net::POP3::enable_ssl
is_singleton: true
name: enable_ssl
params: |
  Net::POP.enable_ssl(params = {})

visibility: public
PK}[Ovx��)ri/1.8/system/Net/POP3/disable_ssl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::POP3#disable_ssl
is_singleton: false
name: disable_ssl
params: ()
visibility: public
PK}[�d�*#ri/1.8/system/Net/POP3/mails-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array of Net::POPMail objects, representing all the messages on the server. This array is renewed when the session restarts; otherwise, it is fetched from the server the first time this method is called (directly or indirectly) and cached.
- !ruby/struct:SM::Flow::P 
  body: This method raises a POPError if an error occurs.
full_name: Net::POP3#mails
is_singleton: false
name: mails
params: ()
visibility: public
PK}[ݸ6/ri/1.8/system/Net/POP3/default_pop3_port-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The default port for POP3 connections, port 110
full_name: Net::POP3::default_pop3_port
is_singleton: true
name: default_pop3_port
params: ()
visibility: public
PK}[hV����%ri/1.8/system/Net/POP3/foreach-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: message
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Starts a POP3 session and iterates over each POPMail object, yielding it to the <tt>block</tt>. This method is equivalent to:"
- !ruby/struct:SM::Flow::VERB 
  body: "    Net::POP3.start(address, port, account, password) do |pop|\n      pop.each_mail do |m|\n        yield m\n      end\n    end\n"
- !ruby/struct:SM::Flow::P 
  body: This method raises a POPAuthenticationError if authentication fails.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "    Net::POP3.foreach('pop.example.com', 110,\n                      'YourAccount', 'YourPassword') do |m|\n      file.write m.pop\n      m.delete if $DELETE\n    end\n"
full_name: Net::POP3::foreach
is_singleton: true
name: foreach
params: (address, port = nil, account = nil, password = nil, isapop = false) {|message| ...}
visibility: public
PK}[�(�ii.ri/1.8/system/Net/POP3/set_debug_output-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "<b>WARNING</b>: This method causes a serious security hole. Use this method only for debugging."
- !ruby/struct:SM::Flow::P 
  body: Set an output stream for debugging.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "  pop = Net::POP.new(addr, port)\n  pop.set_debug_output $stderr\n  pop.start(account, passwd) do |pop|\n    ....\n  end\n"
full_name: Net::POP3#set_debug_output
is_singleton: false
name: set_debug_output
params: (arg)
visibility: public
PK}[3����(ri/1.8/system/Net/POP3/use_ssl%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: does this instance use SSL?
full_name: Net::POP3#use_ssl?
is_singleton: false
name: use_ssl?
params: ()
visibility: public
PK}[���%ri/1.8/system/Net/POP3/n_bytes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the total size in bytes of all the messages on the POP server.
full_name: Net::POP3#n_bytes
is_singleton: false
name: n_bytes
params: ()
visibility: public
PK}[z�ψ��*ri/1.8/system/Net/POP3/default_port-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Class Parameters
full_name: Net::POP3::default_port
is_singleton: true
name: default_port
params: ()
visibility: public
PK}[}��4(!(!&ri/1.8/system/Net/POP3/cdesc-POP3.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The address to connect to.
  name: address
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Seconds to wait until a connection is opened. If the POP3 object cannot open a connection within this time, it raises a TimeoutError exception.
  name: open_timeout
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Seconds to wait until reading one block (by one read(1) call). If the POP3 object cannot complete a read() within this time, it raises a TimeoutError exception.
  name: read_timeout
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: APOP
- !ruby/object:RI::MethodSummary 
  name: auth_only
- !ruby/object:RI::MethodSummary 
  name: certs
- !ruby/object:RI::MethodSummary 
  name: create_ssl_params
- !ruby/object:RI::MethodSummary 
  name: default_pop3_port
- !ruby/object:RI::MethodSummary 
  name: default_pop3s_port
- !ruby/object:RI::MethodSummary 
  name: default_port
- !ruby/object:RI::MethodSummary 
  name: delete_all
- !ruby/object:RI::MethodSummary 
  name: disable_ssl
- !ruby/object:RI::MethodSummary 
  name: enable_ssl
- !ruby/object:RI::MethodSummary 
  name: foreach
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: ssl_params
- !ruby/object:RI::MethodSummary 
  name: start
- !ruby/object:RI::MethodSummary 
  name: use_ssl?
- !ruby/object:RI::MethodSummary 
  name: verify
comment: 
- !ruby/struct:SM::Flow::H 
  level: 1
  text: Net::POP3
- !ruby/struct:SM::Flow::H 
  level: 2
  text: What is This Library?
- !ruby/struct:SM::Flow::P 
  body: This library provides functionality for retrieving email via POP3, the Post Office Protocol version 3. For details of POP3, see [RFC1939] (http://www.ietf.org/rfc/rfc1939.txt).
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Examples
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Retrieving Messages
- !ruby/struct:SM::Flow::P 
  body: This example retrieves messages from the server and deletes them on the server.
- !ruby/struct:SM::Flow::P 
  body: Messages are written to files named 'inbox/1', 'inbox/2', .... Replace 'pop.example.com' with your POP3 server address, and 'YourAccount' and 'YourPassword' with the appropriate account details.
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'net/pop'\n\n    pop = Net::POP3.new('pop.example.com')\n    pop.start('YourAccount', 'YourPassword')             # (1)\n    if pop.mails.empty?\n      puts 'No mail.'\n    else\n      i = 0\n      pop.each_mail do |m|   # or &quot;pop.mails.each ...&quot;   # (2)\n        File.open(&quot;inbox/#{i}&quot;, 'w') do |f|\n          f.write m.pop\n        end\n        m.delete\n        i += 1\n      end\n      puts &quot;#{pop.mails.size} mails popped.&quot;\n    end\n    pop.finish                                           # (3)\n"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "1."
    body: Call Net::POP3#start and start POP session.
  - !ruby/struct:SM::Flow::LI 
    label: "2."
    body: Access messages by using POP3#each_mail and/or POP3#mails.
  - !ruby/struct:SM::Flow::LI 
    label: "3."
    body: "Close POP session by calling POP3#finish or use the block form of #start."
  type: :NUMBER
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Shortened Code
- !ruby/struct:SM::Flow::P 
  body: The example above is very verbose. You can shorten the code by using some utility methods. First, the block form of Net::POP3.start can be used instead of POP3.new, POP3#start and POP3#finish.
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'net/pop'\n\n    Net::POP3.start('pop.example.com', 110,\n                    'YourAccount', 'YourPassword') do |pop|\n      if pop.mails.empty?\n        puts 'No mail.'\n      else\n        i = 0\n        pop.each_mail do |m|   # or &quot;pop.mails.each ...&quot;\n          File.open(&quot;inbox/#{i}&quot;, 'w') do |f|\n            f.write m.pop\n          end\n          m.delete\n          i += 1\n        end\n        puts &quot;#{pop.mails.size} mails popped.&quot;\n      end\n    end\n"
- !ruby/struct:SM::Flow::P 
  body: "POP3#delete_all is an alternative for #each_mail and #delete."
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'net/pop'\n\n    Net::POP3.start('pop.example.com', 110,\n                    'YourAccount', 'YourPassword') do |pop|\n      if pop.mails.empty?\n        puts 'No mail.'\n      else\n        i = 1\n        pop.delete_all do |m|\n          File.open(&quot;inbox/#{i}&quot;, 'w') do |f|\n            f.write m.pop\n          end\n          i += 1\n        end\n      end\n    end\n"
- !ruby/struct:SM::Flow::P 
  body: And here is an even shorter example.
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'net/pop'\n\n    i = 0\n    Net::POP3.delete_all('pop.example.com', 110,\n                         'YourAccount', 'YourPassword') do |m|\n      File.open(&quot;inbox/#{i}&quot;, 'w') do |f|\n        f.write m.pop\n      end\n      i += 1\n    end\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Memory Space Issues
- !ruby/struct:SM::Flow::P 
  body: All the examples above get each message as one big string. This example avoids this.
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'net/pop'\n\n    i = 1\n    Net::POP3.delete_all('pop.example.com', 110,\n                         'YourAccount', 'YourPassword') do |m|\n      File.open(&quot;inbox/#{i}&quot;, 'w') do |f|\n        m.pop do |chunk|    # get a message little by little.\n          f.write chunk\n        end\n        i += 1\n      end\n    end\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Using APOP
- !ruby/struct:SM::Flow::P 
  body: "The net/pop library supports APOP authentication. To use APOP, use the Net::APOP class instead of the Net::POP3 class. You can use the utility method, Net::POP3.APOP(). For example:"
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'net/pop'\n\n    # Use APOP authentication if $isapop == true\n    pop = Net::POP3.APOP($is_apop).new('apop.example.com', 110)\n    pop.start(YourAccount', 'YourPassword') do |pop|\n      # Rest of the code is the same.\n    end\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Fetch Only Selected Mail Using 'UIDL' POP Command
- !ruby/struct:SM::Flow::P 
  body: If your POP server provides UIDL functionality, you can grab only selected mails from the POP server. e.g.
- !ruby/struct:SM::Flow::VERB 
  body: "    def need_pop?( id )\n      # determine if we need pop this mail...\n    end\n\n    Net::POP3.start('pop.example.com', 110,\n                    'Your account', 'Your password') do |pop|\n      pop.mails.select { |m| need_pop?(m.unique_id) }.each do |m|\n        do_something(m.pop)\n      end\n    end\n"
- !ruby/struct:SM::Flow::P 
  body: The POPMail#unique_id() method returns the unique-id of the message as a String. Normally the unique-id is a hash of the message.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Revision
  value: "%q$Revision: 29903 $.split[1]"
full_name: Net::POP3
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: active?
- !ruby/object:RI::MethodSummary 
  name: apop?
- !ruby/object:RI::MethodSummary 
  name: auth_only
- !ruby/object:RI::MethodSummary 
  name: command
- !ruby/object:RI::MethodSummary 
  name: delete_all
- !ruby/object:RI::MethodSummary 
  name: disable_ssl
- !ruby/object:RI::MethodSummary 
  name: do_finish
- !ruby/object:RI::MethodSummary 
  name: do_start
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: each_mail
- !ruby/object:RI::MethodSummary 
  name: enable_ssl
- !ruby/object:RI::MethodSummary 
  name: finish
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: logging
- !ruby/object:RI::MethodSummary 
  name: mails
- !ruby/object:RI::MethodSummary 
  name: n_bytes
- !ruby/object:RI::MethodSummary 
  name: n_mails
- !ruby/object:RI::MethodSummary 
  name: on_connect
- !ruby/object:RI::MethodSummary 
  name: port
- !ruby/object:RI::MethodSummary 
  name: read_timeout=
- !ruby/object:RI::MethodSummary 
  name: reset
- !ruby/object:RI::MethodSummary 
  name: set_debug_output
- !ruby/object:RI::MethodSummary 
  name: start
- !ruby/object:RI::MethodSummary 
  name: started?
- !ruby/object:RI::MethodSummary 
  name: use_ssl?
name: POP3
superclass: Protocol
PK}[HU�J��(ri/1.8/system/Net/POP3/ssl_params-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::POP3::ssl_params
is_singleton: true
name: ssl_params
params: ()
visibility: public
PK}[��I���&ri/1.8/system/Net/POP3/do_start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::POP3#do_start
is_singleton: false
name: do_start
params: (account, password)
visibility: private
PK}[�15Ҭ�%ri/1.8/system/Net/POP3/command-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::POP3#command
is_singleton: false
name: command
params: ()
visibility: private
PK}[���+��(ri/1.8/system/Net/POP3/on_connect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::POP3#on_connect
is_singleton: false
name: on_connect
params: ()
visibility: private
PK}[>m����'ri/1.8/system/Net/POP3/active%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #started?"
full_name: Net::POP3#active?
is_singleton: false
name: active?
params: ()
visibility: public
PK}[L��%ri/1.8/system/Net/POP3/n_mails-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of messages on the POP server.
full_name: Net::POP3#n_mails
is_singleton: false
name: n_mails
params: ()
visibility: public
PK}[��K%ri/1.8/system/Net/POP3/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Provide human-readable stringification of class state.
full_name: Net::POP3#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK}[����#ri/1.8/system/Net/POP3/certs-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::POP3::certs
is_singleton: true
name: certs
params: ()
visibility: public
PK}[��T$ri/1.8/system/Net/POP3/finish-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Finishes a POP3 session and closes TCP connection.
full_name: Net::POP3#finish
is_singleton: false
name: finish
params: ()
visibility: public
PK}[��R��(ri/1.8/system/Net/POP3/use_ssl%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::POP3::use_ssl?
is_singleton: true
name: use_ssl?
params: ()
visibility: public
PK}[��3��!ri/1.8/system/Net/POP3/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new POP3 object.
- !ruby/struct:SM::Flow::P 
  body: <tt>address</tt> is the hostname or ip address of your POP3 server.
- !ruby/struct:SM::Flow::P 
  body: The optional <tt>port</tt> is the port to connect to.
- !ruby/struct:SM::Flow::P 
  body: The optional <tt>isapop</tt> specifies whether this connection is going to use APOP authentication; it defaults to <tt>false</tt>.
- !ruby/struct:SM::Flow::P 
  body: This method does <b>not</b> open the TCP connection.
full_name: Net::POP3::new
is_singleton: true
name: new
params: (addr, port = nil, isapop = false)
visibility: public
PK}[�f��%ri/1.8/system/Net/POP3/apop%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Does this instance use APOP authentication?
full_name: Net::POP3#apop?
is_singleton: false
name: apop?
params: ()
visibility: public
PK}[�
���(ri/1.8/system/Net/POP3/enable_ssl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Enables SSL for this instance. Must be called before the connection is established to have any effect. +params[:port]+ is port to establish the SSL connection on; Defaults to 995. <tt>params</tt> (except :port) is passed to OpenSSL::SSLContext#set_params.
full_name: Net::POP3#enable_ssl
is_singleton: false
name: enable_ssl
params: |
  Net::POP#enable_ssl(params = {})

visibility: public
PK}[�Lu��/ri/1.8/system/Net/POP3/create_ssl_params-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::POP3::create_ssl_params
is_singleton: true
name: create_ssl_params
params: (verify_or_params = {}, certs = nil)
visibility: public
PK}[:�T��#ri/1.8/system/Net/POP3/start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: pop
comment: 
- !ruby/struct:SM::Flow::P 
  body: Starts a POP3 session.
- !ruby/struct:SM::Flow::P 
  body: When called with block, gives a POP3 object to the block and closes the session after block call finishes.
- !ruby/struct:SM::Flow::P 
  body: This method raises a POPAuthenticationError if authentication fails.
full_name: Net::POP3#start
is_singleton: false
name: start
params: (account, password) {|pop| ...}
visibility: public
PK}[qT ީ�$ri/1.8/system/Net/POP3/verify-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::POP3::verify
is_singleton: true
name: verify
params: ()
visibility: public
PK}[�v�Pgg'ri/1.8/system/Net/POP3/auth_only-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Opens a POP3 session, attempts authentication, and quits.
- !ruby/struct:SM::Flow::P 
  body: This method raises POPAuthenticationError if authentication fails.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: "Example: normal POP3"
- !ruby/struct:SM::Flow::VERB 
  body: "    Net::POP3.auth_only('pop.example.com', 110,\n                        'YourAccount', 'YourPassword')\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: "Example: APOP"
- !ruby/struct:SM::Flow::VERB 
  body: "    Net::POP3.auth_only('pop.example.com', 110,\n                        'YourAccount', 'YourPassword', true)\n"
full_name: Net::POP3::auth_only
is_singleton: true
name: auth_only
params: (address, port = nil, account = nil, password = nil, isapop = false)
visibility: public
PK}[mn��%ri/1.8/system/Net/POP3/logging-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::POP3#logging
is_singleton: false
name: logging
params: (msg)
visibility: public
PK}[��9Z��)ri/1.8/system/Net/POP3/disable_ssl-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Disable SSL for all new instances.
full_name: Net::POP3::disable_ssl
is_singleton: true
name: disable_ssl
params: ()
visibility: public
PK}[���-ri/1.8/system/Net/POP3/read_timeout%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the read timeout.
full_name: Net::POP3#read_timeout=
is_singleton: false
name: read_timeout=
params: (sec)
visibility: public
PK}[��?��'ri/1.8/system/Net/POP3/do_finish-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Net::POP3#do_finish
is_singleton: false
name: do_finish
params: ()
visibility: private
PK}[9�E���"ri/1.8/system/Net/POP3/port-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The port number to connect to.
full_name: Net::POP3#port
is_singleton: false
name: port
params: ()
visibility: public
PK}[��f"ri/1.8/system/Net/POP3/APOP-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns the APOP class if <tt>isapop</tt> is true; otherwise, returns the POP class. For example:"
- !ruby/struct:SM::Flow::VERB 
  body: "    # Example 1\n    pop = Net::POP3::APOP($is_apop).new(addr, port)\n\n    # Example 2\n    Net::POP3::APOP($is_apop).start(addr, port) do |pop|\n      ....\n    end\n"
full_name: Net::POP3::APOP
is_singleton: true
name: APOP
params: (isapop)
visibility: public
PK}[O�z�nn#ri/1.8/system/Net/POP3/reset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Resets the session. This clears all &quot;deleted&quot; marks from messages.
- !ruby/struct:SM::Flow::P 
  body: This method raises a POPError if an error occurs.
full_name: Net::POP3#reset
is_singleton: false
name: reset
params: ()
visibility: public
PK}[9ko���'ri/1.8/system/Net/POP3/auth_only-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Starts a pop3 session, attempts authentication, and quits. This method must not be called while POP3 session is opened. This method raises POPAuthenticationError if authentication fails.
full_name: Net::POP3#auth_only
is_singleton: false
name: auth_only
params: (account, password)
visibility: public
PK}[��`raa#ri/1.8/system/Net/POP3/start-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: pop
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new POP3 object and open the connection. Equivalent to
- !ruby/struct:SM::Flow::VERB 
  body: "  Net::POP3.new(address, port, isapop).start(account, password)\n"
- !ruby/struct:SM::Flow::P 
  body: If <tt>block</tt> is provided, yields the newly-opened POP3 object to it, and automatically closes it at the end of the session.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "   Net::POP3.start(addr, port, account, password) do |pop|\n     pop.each_mail do |m|\n       file.write m.pop\n       m.delete\n     end\n   end\n"
full_name: Net::POP3::start
is_singleton: true
name: start
params: (address, port = nil, account = nil, password = nil, isapop = false) {|pop| ...}
visibility: public
PK}[�B[

(ri/1.8/system/Net/POP3/delete_all-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Starts a POP3 session and deletes all messages on the server. If a block is given, each POPMail object is yielded to it before being deleted.
- !ruby/struct:SM::Flow::P 
  body: This method raises a POPAuthenticationError if authentication fails.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "    Net::POP3.delete_all('pop.example.com', 110,\n                         'YourAccount', 'YourPassword') do |m|\n      file.write m.pop\n    end\n"
full_name: Net::POP3::delete_all
is_singleton: true
name: delete_all
params: (address, port = nil, account = nil, password = nil, isapop = false, &block)
visibility: public
PK}[��0ri/1.8/system/Net/POP3/default_pop3s_port-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The default port for POP3S connections, port 995
full_name: Net::POP3::default_pop3s_port
is_singleton: true
name: default_pop3s_port
params: ()
visibility: public
PK}[u�Q��(ri/1.8/system/Net/POP3/delete_all-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: message
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes all messages on the server.
- !ruby/struct:SM::Flow::P 
  body: If called with a block, yields each message in turn before deleting it.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "    n = 1\n    pop.delete_all do |m|\n      File.open(&quot;inbox/#{n}&quot;) do |f|\n        f.write m.pop\n      end\n      n += 1\n    end\n"
- !ruby/struct:SM::Flow::P 
  body: This method raises a POPError if an error occurs.
full_name: Net::POP3#delete_all
is_singleton: false
name: delete_all
params: ( {|message| ...}
visibility: public
PK}[6���'ri/1.8/system/Net/POP3/each_mail-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: each
block_params: message
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Yields each message to the passed-in block in turn. Equivalent to:"
- !ruby/struct:SM::Flow::VERB 
  body: "  pop3.mails.each do |popmail|\n    ....\n  end\n"
- !ruby/struct:SM::Flow::P 
  body: This method raises a POPError if an error occurs.
full_name: Net::POP3#each_mail
is_singleton: false
name: each_mail
params: () {|message| ...}
visibility: public
PK}[�Ue���<ri/1.8/system/Net/ProtoFatalError/cdesc-ProtoFatalError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::ProtoFatalError
includes: []

instance_methods: []

name: ProtoFatalError
superclass: ProtocolError
PK}[��\�__:ri/1.8/system/Net/HTTPExceptions/cdesc-HTTPExceptions.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: response
  rw: R
class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: HTTP exception class. You must use its subclasses.
constants: []

full_name: Net::HTTPExceptions
includes: []

instance_methods: []

name: HTTPExceptions
superclass: 
PK}[ğF��@ri/1.8/system/Net/ProtoUnknownError/cdesc-ProtoUnknownError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::ProtoUnknownError
includes: []

instance_methods: []

name: ProtoUnknownError
superclass: ProtocolError
PK}[2�ߵ��4ri/1.8/system/Net/POP3Command/cdesc-POP3Command.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Net::POP3Command
includes: []

instance_methods: []

name: POP3Command
superclass: Object
PK}[��++:ri/1.8/system/FloatDomainError/cdesc-FloatDomainError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Turn off floating point exceptions for overflow, etc.
constants: []

full_name: FloatDomainError
includes: []

instance_methods: []

name: FloatDomainError
superclass: RangeError
PK}[nJ�,��,ri/1.8/system/IRB/FileInputMethod/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::FileInputMethod::new
is_singleton: true
name: new
params: (file)
visibility: public
PK}[L�L��-ri/1.8/system/IRB/FileInputMethod/gets-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::FileInputMethod#gets
is_singleton: false
name: gets
params: ()
visibility: public
PK}[�l��/ri/1.8/system/IRB/FileInputMethod/eof%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::FileInputMethod#eof?
is_singleton: false
name: eof?
params: ()
visibility: public
PK}[E����<ri/1.8/system/IRB/FileInputMethod/cdesc-FileInputMethod.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: file_name
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: IRB::FileInputMethod
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: eof?
- !ruby/object:RI::MethodSummary 
  name: gets
name: FileInputMethod
superclass: InputMethod
PK}[!u,��<ri/1.8/system/IRB/ContextExtender/cdesc-ContextExtender.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: def_extend_command
- !ruby/object:RI::MethodSummary 
  name: install_extend_commands
comment: 
- !ruby/struct:SM::Flow::P 
  body: extension support for Context
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: CE
  value: ContextExtender
full_name: IRB::ContextExtender
includes: []

instance_methods: []

name: ContextExtender
superclass: 
PK}[n�b��;ri/1.8/system/IRB/ContextExtender/def_extend_command-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ContextExtender::def_extend_command
is_singleton: true
name: def_extend_command
params: (cmd_name, load_file, *aliases)
visibility: public
PK}[��k#��@ri/1.8/system/IRB/ContextExtender/install_extend_commands-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ContextExtender::install_extend_commands
is_singleton: true
name: install_extend_commands
params: ()
visibility: public
PK}[�W�Ŀ�:ri/1.8/system/IRB/InputCompletor/cdesc-InputCompletor.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: select_message
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ReservedWords
  value: "[       \"BEGIN\", \"END\",       \"alias\", \"and\",        \"begin\", \"break\",        \"case\", \"class\",       \"def\", \"defined\", \"do\",       \"else\", \"elsif\", \"end\", \"ensure\",       \"false\", \"for\",        \"if\", \"in\",        \"module\",        \"next\", \"nil\", \"not\",       \"or\",        \"redo\", \"rescue\", \"retry\", \"return\",       \"self\", \"super\",       \"then\", \"true\",       \"undef\", \"unless\", \"until\",       \"when\", \"while\",       \"yield\",     ]"
- !ruby/object:RI::Constant 
  comment: 
  name: CompletionProc
  value: proc { |input|       bind = IRB.conf[:MAIN_CONTEXT].workspace.binding
- !ruby/object:RI::Constant 
  comment: 
  name: Operators
  value: "[\"%\", \"&\", \"*\", \"**\", \"+\",  \"-\",  \"/\",       \"<\", \"<<\", \"<=\", \"<=>\", \"==\", \"===\", \"=~\", \">\", \">=\", \">>\",       \"[]\", \"[]=\", \"^\",]"
full_name: IRB::InputCompletor
includes: []

instance_methods: []

name: InputCompletor
superclass: 
PK}['�PQ��6ri/1.8/system/IRB/InputCompletor/select_message-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::InputCompletor::select_message
is_singleton: true
name: select_message
params: (receiver, message, candidates)
visibility: public
PK}[/����� ri/1.8/system/IRB/cdesc-IRB.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: CurrentContext
- !ruby/object:RI::MethodSummary 
  name: CurrentContext
- !ruby/object:RI::MethodSummary 
  name: JobManager
- !ruby/object:RI::MethodSummary 
  name: conf
- !ruby/object:RI::MethodSummary 
  name: delete_caller
- !ruby/object:RI::MethodSummary 
  name: init_config
- !ruby/object:RI::MethodSummary 
  name: init_error
- !ruby/object:RI::MethodSummary 
  name: initialize_tracer
- !ruby/object:RI::MethodSummary 
  name: irb
- !ruby/object:RI::MethodSummary 
  name: irb_abort
- !ruby/object:RI::MethodSummary 
  name: irb_at_exit
- !ruby/object:RI::MethodSummary 
  name: irb_exit
- !ruby/object:RI::MethodSummary 
  name: load_modules
- !ruby/object:RI::MethodSummary 
  name: parse_opts
- !ruby/object:RI::MethodSummary 
  name: print_usage
- !ruby/object:RI::MethodSummary 
  name: rc_file
- !ruby/object:RI::MethodSummary 
  name: rc_file_generators
- !ruby/object:RI::MethodSummary 
  name: run_config
- !ruby/object:RI::MethodSummary 
  name: setup
- !ruby/object:RI::MethodSummary 
  name: start
- !ruby/object:RI::MethodSummary 
  name: version
comment: 
- !ruby/struct:SM::Flow::VERB 
  body: "  irb/help.rb - print usage module\n      $Release Version: 0.9.5$\n      $Revision: 16857 $\n      $Date: 2008-06-06 17:05:24 +0900 (Fri, 06 Jun 2008) $\n      by Keiju ISHITSUKA(keiju@ishitsuka.com)\n"
- !ruby/struct:SM::Flow::P 
  body: --
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: InputMethod
  - !ruby/struct:SM::Flow::VERB 
    body: "    StdioInputMethod\n    FileInputMethod\n    (ReadlineInputMethod)\n"
  name: STDIN_FILE_NAME
  value: "\"(line)\""
- !ruby/object:RI::Constant 
  comment: 
  name: FEATURE_IOPT_CHANGE_VERSION
  value: "\"1.9.0\""
- !ruby/object:RI::Constant 
  comment: 
  name: IRBRC_EXT
  value: "\"rc\""
full_name: IRB
includes: []

instance_methods: []

name: IRB
superclass: 
PK}[�u�J��:ri/1.8/system/IRB/HistorySavingAbility/save_history-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::HistorySavingAbility#save_history
is_singleton: false
name: save_history
params: ()
visibility: public
PK}[2ge��:ri/1.8/system/IRB/HistorySavingAbility/load_history-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::HistorySavingAbility#load_history
is_singleton: false
name: load_history
params: ()
visibility: public
PK}[v�i���6ri/1.8/system/IRB/HistorySavingAbility/extended-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: def HistorySavingAbility.create_finalizer
- !ruby/struct:SM::Flow::VERB 
  body: "  proc do\n  if num = IRB.conf[:SAVE_HISTORY] and (num = num.to_i) &gt; 0\n    if hf = IRB.conf[:HISTORY_FILE]\n      file = File.expand_path(hf)\n    end\n    file = IRB.rc_file(&quot;_history&quot;) unless file\n    open(file, 'w' ) do |f|\n      hist = HISTORY.to_a\n      f.puts(hist[-num..-1] || hist)\n    end\n  end\n  end\n"
- !ruby/struct:SM::Flow::P 
  body: end
full_name: IRB::HistorySavingAbility::extended
is_singleton: true
name: extended
params: (obj)
visibility: public
PK}[�9����Fri/1.8/system/IRB/HistorySavingAbility/cdesc-HistorySavingAbility.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: extended
comment: 
constants: []

full_name: IRB::HistorySavingAbility
includes: 
- !ruby/object:RI::IncludedModule 
  name: Readline
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: load_history
- !ruby/object:RI::MethodSummary 
  name: save_history
name: HistorySavingAbility
superclass: 
PK}[��;���:ri/1.8/system/IRB/ExtendCommandBundle/extend_object-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommandBundle::extend_object
is_singleton: true
name: extend_object
params: (obj)
visibility: public
PK}[:>
���8ri/1.8/system/IRB/ExtendCommandBundle/irb_require-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommandBundle#irb_require
is_singleton: false
name: irb_require
params: (*opts, &b)
visibility: public
PK}[5a��VVAri/1.8/system/IRB/ExtendCommandBundle/install_alias_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: override = {NO_OVERRIDE, OVERRIDE_PRIVATE_ONLY, OVERRIDE_ALL}
full_name: IRB::ExtendCommandBundle#install_alias_method
is_singleton: false
name: install_alias_method
params: (to, from, override = NO_OVERRIDE)
visibility: public
PK}[Z��HH?ri/1.8/system/IRB/ExtendCommandBundle/def_extend_command-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: aliases = [commands_alias, flag], ...
full_name: IRB::ExtendCommandBundle::def_extend_command
is_singleton: true
name: def_extend_command
params: (cmd_name, cmd_class, load_file = nil, *aliases)
visibility: public
PK}[��p���8ri/1.8/system/IRB/ExtendCommandBundle/irb_context-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommandBundle#irb_context
is_singleton: false
name: irb_context
params: ()
visibility: public
PK}[MLC���5ri/1.8/system/IRB/ExtendCommandBundle/irb_load-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommandBundle#irb_load
is_singleton: false
name: irb_load
params: (*opts, &b)
visibility: public
PK}[������Eri/1.8/system/IRB/ExtendCommandBundle/irb_original_method_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommandBundle::irb_original_method_name
is_singleton: true
name: irb_original_method_name
params: (method_name)
visibility: public
PK}[K����5ri/1.8/system/IRB/ExtendCommandBundle/irb_exit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommandBundle#irb_exit
is_singleton: false
name: irb_exit
params: (ret = 0)
visibility: public
PK}[[ڟ��Dri/1.8/system/IRB/ExtendCommandBundle/install_extend_commands-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommandBundle::install_extend_commands
is_singleton: true
name: install_extend_commands
params: ()
visibility: public
PK}[!#OODri/1.8/system/IRB/ExtendCommandBundle/cdesc-ExtendCommandBundle.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: def_extend_command
- !ruby/object:RI::MethodSummary 
  name: extend_object
- !ruby/object:RI::MethodSummary 
  name: install_extend_commands
- !ruby/object:RI::MethodSummary 
  name: irb_original_method_name
comment: 
- !ruby/struct:SM::Flow::P 
  body: IRB extended command
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: EXCB
  value: ExtendCommandBundle
- !ruby/object:RI::Constant 
  comment: 
  name: NO_OVERRIDE
  value: "0"
- !ruby/object:RI::Constant 
  comment: 
  name: OVERRIDE_PRIVATE_ONLY
  value: "0x01"
- !ruby/object:RI::Constant 
  comment: 
  name: OVERRIDE_ALL
  value: "0x02"
full_name: IRB::ExtendCommandBundle
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: install_alias_method
- !ruby/object:RI::MethodSummary 
  name: irb_context
- !ruby/object:RI::MethodSummary 
  name: irb_exit
- !ruby/object:RI::MethodSummary 
  name: irb_load
- !ruby/object:RI::MethodSummary 
  name: irb_require
name: ExtendCommandBundle
superclass: 
PK}[�b��� ri/1.8/system/IRB/rc_file-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::rc_file
is_singleton: true
name: rc_file
params: (ext = IRBRC_EXT)
visibility: public
PK}[
 ���#ri/1.8/system/IRB/init_error-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::init_error
is_singleton: true
name: init_error
params: ()
visibility: public
PK}[.o���#ri/1.8/system/IRB/run_config-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: running config
full_name: IRB::run_config
is_singleton: true
name: run_config
params: ()
visibility: public
PK}[�8/���=ri/1.8/system/IRB/IrbLoader/search_file_from_ruby_path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::IrbLoader#search_file_from_ruby_path
is_singleton: false
name: search_file_from_ruby_path
params: (fn)
visibility: public
PK}[���^��&ri/1.8/system/IRB/IrbLoader/old-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::IrbLoader#old
is_singleton: false
name: old
params: ()
visibility: public
PK}[��|��+ri/1.8/system/IRB/IrbLoader/irb_load-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::IrbLoader#irb_load
is_singleton: false
name: irb_load
params: (fn, priv = nil)
visibility: public
PK}[�s����,ri/1.8/system/IRB/IrbLoader/load_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::IrbLoader#load_file
is_singleton: false
name: load_file
params: (path, priv = nil)
visibility: public
PK}[��2t��0ri/1.8/system/IRB/IrbLoader/cdesc-IrbLoader.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: IRB::IrbLoader
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: irb_load
- !ruby/object:RI::MethodSummary 
  name: load_file
- !ruby/object:RI::MethodSummary 
  name: old
- !ruby/object:RI::MethodSummary 
  name: search_file_from_ruby_path
- !ruby/object:RI::MethodSummary 
  name: source_file
name: IrbLoader
superclass: 
PK}[Ù}��.ri/1.8/system/IRB/IrbLoader/source_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::IrbLoader#source_file
is_singleton: false
name: source_file
params: (path)
visibility: public
PK}[o����)ri/1.8/system/IRB/Frame/trace_func-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Frame#trace_func
is_singleton: false
name: trace_func
params: (event, file, line, id, binding)
visibility: public
PK}[2'�X��"ri/1.8/system/IRB/Frame/top-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Frame#top
is_singleton: false
name: top
params: (n = 0)
visibility: public
PK}[�l��"ri/1.8/system/IRB/Frame/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Frame::new
is_singleton: true
name: new
params: ()
visibility: public
PK}[��鼤�(ri/1.8/system/IRB/Frame/cdesc-Frame.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: bottom
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: sender
- !ruby/object:RI::MethodSummary 
  name: top
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: INIT_STACK_TIMES
  value: "3"
- !ruby/object:RI::Constant 
  comment: 
  name: CALL_STACK_OFFSET
  value: "3"
full_name: IRB::Frame
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: bottom
- !ruby/object:RI::MethodSummary 
  name: top
- !ruby/object:RI::MethodSummary 
  name: trace_func
name: Frame
superclass: Object
PK}[%����%ri/1.8/system/IRB/Frame/bottom-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: singleton functions
full_name: IRB::Frame::bottom
is_singleton: true
name: bottom
params: (n = 0)
visibility: public
PK}[Y��+��"ri/1.8/system/IRB/Frame/top-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Frame::top
is_singleton: true
name: top
params: (n = 0)
visibility: public
PK}[B�t��%ri/1.8/system/IRB/Frame/sender-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Frame::sender
is_singleton: true
name: sender
params: ()
visibility: public
PK}[
�w��%ri/1.8/system/IRB/Frame/bottom-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Frame#bottom
is_singleton: false
name: bottom
params: (n = 0)
visibility: public
PK}[��D��$ri/1.8/system/IRB/irb_at_exit-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::irb_at_exit
is_singleton: true
name: irb_at_exit
params: ()
visibility: public
PK}[:\����.ri/1.8/system/IRB/Context/use_loader%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #use_loader"
full_name: IRB::Context#use_loader?
is_singleton: false
name: use_loader?
params: ()
visibility: public
PK}[}{S���)ri/1.8/system/IRB/Context/evaluate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#evaluate
is_singleton: false
name: evaluate
params: (line, line_no)
visibility: public
PK}[�i��-ri/1.8/system/IRB/Context/save_history-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#save_history
is_singleton: false
name: save_history
params: ()
visibility: public
PK}[`�"��.ri/1.8/system/IRB/Context/pop_workspace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#pop_workspace
is_singleton: false
name: pop_workspace
params: ()
visibility: public
PK}[�&V��0ri/1.8/system/IRB/Context/save_history%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#save_history=
is_singleton: false
name: save_history=
params: (val)
visibility: public
PK}[��0���+ri/1.8/system/IRB/Context/use_loader-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: use_loader?
block_params: 
comment: 
full_name: IRB::Context#use_loader
is_singleton: false
name: use_loader
params: ()
visibility: public
PK}[���!��+ri/1.8/system/IRB/Context/verbose%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#verbose?
is_singleton: false
name: verbose?
params: ()
visibility: public
PK}[	;Q��0ri/1.8/system/IRB/Context/history_file%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#history_file=
is_singleton: false
name: history_file=
params: (hist)
visibility: public
PK}[}�e��.ri/1.8/system/IRB/Context/use_loader%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#use_loader=
is_singleton: false
name: use_loader=
params: (opt)
visibility: public
PK}[������+ri/1.8/system/IRB/Context/inspect%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#inspect?
is_singleton: false
name: inspect?
params: ()
visibility: public
PK}[��ݨ��/ri/1.8/system/IRB/Context/home_workspace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#home_workspace
is_singleton: false
name: home_workspace
params: ()
visibility: public
PK}[�D���0ri/1.8/system/IRB/Context/eval_history%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#eval_history=
is_singleton: false
name: eval_history=
params: (no)
visibility: public
PK}[��3��/ri/1.8/system/IRB/Context/debug_level%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#debug_level=
is_singleton: false
name: debug_level=
params: (value)
visibility: public
PK}[8t)��0ri/1.8/system/IRB/Context/inspect_mode%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#inspect_mode=
is_singleton: false
name: inspect_mode=
params: (opt)
visibility: public
PK}[
r;���/ri/1.8/system/IRB/Context/set_last_value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: _set_last_value
block_params: 
comment: 
full_name: IRB::Context#set_last_value
is_singleton: false
name: set_last_value
params: (value)
visibility: public
PK}[?��Y��.ri/1.8/system/IRB/Context/use_tracer%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#use_tracer=
is_singleton: false
name: use_tracer=
params: (opt)
visibility: public
PK}[��~��1ri/1.8/system/IRB/Context/change_workspace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#change_workspace
is_singleton: false
name: change_workspace
params: (*_main)
visibility: public
PK}[��G��(ri/1.8/system/IRB/Context/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: to_s
block_params: 
comment: 
full_name: IRB::Context#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK}[H2����0ri/1.8/system/IRB/Context/use_readline%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#use_readline=
is_singleton: false
name: use_readline=
params: (opt)
visibility: public
PK}[C�$��-ri/1.8/system/IRB/Context/history_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#history_file
is_singleton: false
name: history_file
params: ()
visibility: public
PK}[E��#��%ri/1.8/system/IRB/Context/exit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#exit
is_singleton: false
name: exit
params: (ret = 0)
visibility: public
PK}[��6��$ri/1.8/system/IRB/Context/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Arguments:"
- !ruby/struct:SM::Flow::VERB 
  body: "  input_method: nil -- stdin or readline\n                String -- File\n                other -- using this as InputMethod\n"
full_name: IRB::Context::new
is_singleton: true
name: new
params: (irb, workspace = nil, input_method = nil, output_method = nil)
visibility: public
PK}[�>�Z��2ri/1.8/system/IRB/Context/init_save_history-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#init_save_history
is_singleton: false
name: init_save_history
params: ()
visibility: public
PK}[k&cpp,ri/1.8/system/IRB/Context/cdesc-Context.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: ap_name
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: auto_indent_mode
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: back_trace_limit
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: debug_level
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: echo
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: eval_history
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: ignore_eof
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: ignore_sigint
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: inspect_mode
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: io
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: irb
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: irb_name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: irb_name
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: irb_path
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: last_value
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: load_modules
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: math_mode
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: prompt_c
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: prompt_i
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: prompt_mode
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: prompt_n
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: prompt_s
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: rc
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: return_format
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: thread
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: use_readline
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: use_tracer
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: verbose
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: workspace
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: workspace_home
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: NOPRINTING_IVARS
  value: "[\"@last_value\"]"
- !ruby/object:RI::Constant 
  comment: 
  name: NO_INSPECTING_IVARS
  value: "[\"@irb\", \"@io\"]"
- !ruby/object:RI::Constant 
  comment: 
  name: IDNAME_IVARS
  value: "[\"@prompt_mode\"]"
full_name: IRB::Context
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _set_last_value
- !ruby/object:RI::MethodSummary 
  name: change_workspace
- !ruby/object:RI::MethodSummary 
  name: debug?
- !ruby/object:RI::MethodSummary 
  name: debug_level=
- !ruby/object:RI::MethodSummary 
  name: eval_history=
- !ruby/object:RI::MethodSummary 
  name: evaluate
- !ruby/object:RI::MethodSummary 
  name: exit
- !ruby/object:RI::MethodSummary 
  name: file_input?
- !ruby/object:RI::MethodSummary 
  name: history_file
- !ruby/object:RI::MethodSummary 
  name: history_file=
- !ruby/object:RI::MethodSummary 
  name: home_workspace
- !ruby/object:RI::MethodSummary 
  name: init_save_history
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: inspect?
- !ruby/object:RI::MethodSummary 
  name: inspect?
- !ruby/object:RI::MethodSummary 
  name: inspect_mode=
- !ruby/object:RI::MethodSummary 
  name: irb_level
- !ruby/object:RI::MethodSummary 
  name: main
- !ruby/object:RI::MethodSummary 
  name: math_mode=
- !ruby/object:RI::MethodSummary 
  name: pop_workspace
- !ruby/object:RI::MethodSummary 
  name: prompt_mode=
- !ruby/object:RI::MethodSummary 
  name: prompting?
- !ruby/object:RI::MethodSummary 
  name: push_workspace
- !ruby/object:RI::MethodSummary 
  name: save_history
- !ruby/object:RI::MethodSummary 
  name: save_history=
- !ruby/object:RI::MethodSummary 
  name: set_last_value
- !ruby/object:RI::MethodSummary 
  name: set_last_value
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: use_loader
- !ruby/object:RI::MethodSummary 
  name: use_loader=
- !ruby/object:RI::MethodSummary 
  name: use_loader?
- !ruby/object:RI::MethodSummary 
  name: use_readline=
- !ruby/object:RI::MethodSummary 
  name: use_tracer=
- !ruby/object:RI::MethodSummary 
  name: verbose?
- !ruby/object:RI::MethodSummary 
  name: workspaces
name: Context
superclass: Object
PK}[&񔖴�+ri/1.8/system/IRB/Context/workspaces-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#workspaces
is_singleton: false
name: workspaces
params: ()
visibility: public
PK}[�����.ri/1.8/system/IRB/Context/file_input%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#file_input?
is_singleton: false
name: file_input?
params: ()
visibility: public
PK}[���o��%ri/1.8/system/IRB/Context/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #inspect"
full_name: IRB::Context#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK}[ D{��)ri/1.8/system/IRB/Context/debug%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#debug?
is_singleton: false
name: debug?
params: ()
visibility: public
PK}[��@��*ri/1.8/system/IRB/Context/irb_level-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#irb_level
is_singleton: false
name: irb_level
params: ()
visibility: public
PK}[T&o��/ri/1.8/system/IRB/Context/push_workspace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#push_workspace
is_singleton: false
name: push_workspace
params: (*_main)
visibility: public
PK}[}B���/ri/1.8/system/IRB/Context/prompt_mode%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#prompt_mode=
is_singleton: false
name: prompt_mode=
params: (mode)
visibility: public
PK}[̟���%ri/1.8/system/IRB/Context/main-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#main
is_singleton: false
name: main
params: ()
visibility: public
PK}[��\0ri/1.8/system/IRB/Context/_set_last_value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #set_last_value"
full_name: IRB::Context#_set_last_value
is_singleton: false
name: _set_last_value
params: (value)
visibility: public
PK}['Dy���-ri/1.8/system/IRB/Context/prompting%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#prompting?
is_singleton: false
name: prompting?
params: ()
visibility: public
PK}[�t����-ri/1.8/system/IRB/Context/math_mode%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Context#math_mode=
is_singleton: false
name: math_mode=
params: (opt)
visibility: public
PK}[�ٝ$--:ri/1.8/system/IRB/ExtendCommand/Require/cdesc-Require.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: IRB::ExtendCommand::Require
includes: 
- !ruby/object:RI::IncludedModule 
  name: IrbLoader
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: execute
name: Require
superclass: Nop
PK}[�Z�Z��6ri/1.8/system/IRB/ExtendCommand/Require/execute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommand::Require#execute
is_singleton: false
name: execute
params: (file_name)
visibility: public
PK}[���l��5ri/1.8/system/IRB/ExtendCommand/Source/execute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommand::Source#execute
is_singleton: false
name: execute
params: (file_name)
visibility: public
PK}[�,yb++8ri/1.8/system/IRB/ExtendCommand/Source/cdesc-Source.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: IRB::ExtendCommand::Source
includes: 
- !ruby/object:RI::IncludedModule 
  name: IrbLoader
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: execute
name: Source
superclass: Nop
PK}[g�����;ri/1.8/system/IRB/ExtendCommand/PopWorkspace/execute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommand::PopWorkspace#execute
is_singleton: false
name: execute
params: (*obj)
visibility: public
PK}[����Dri/1.8/system/IRB/ExtendCommand/PopWorkspace/cdesc-PopWorkspace.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: IRB::ExtendCommand::PopWorkspace
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: execute
name: PopWorkspace
superclass: Workspaces
PK}[�,���3ri/1.8/system/IRB/ExtendCommand/Help/execute-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommand::Help::execute
is_singleton: true
name: execute
params: (context, *names)
visibility: public
PK}[������4ri/1.8/system/IRB/ExtendCommand/Help/cdesc-Help.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: execute
comment: 
constants: []

full_name: IRB::ExtendCommand::Help
includes: []

instance_methods: []

name: Help
superclass: 
PK}[�;e;��9ri/1.8/system/IRB/ExtendCommand/IrbCommand/execute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommand::IrbCommand#execute
is_singleton: false
name: execute
params: (*obj)
visibility: public
PK}[�(@ri/1.8/system/IRB/ExtendCommand/IrbCommand/cdesc-IrbCommand.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: IRB::ExtendCommand::IrbCommand
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: execute
name: IrbCommand
superclass: Nop
PK}[O8ʃ��<ri/1.8/system/IRB/ExtendCommand/PushWorkspace/execute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommand::PushWorkspace#execute
is_singleton: false
name: execute
params: (*obj)
visibility: public
PK}[Cy��Fri/1.8/system/IRB/ExtendCommand/PushWorkspace/cdesc-PushWorkspace.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: IRB::ExtendCommand::PushWorkspace
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: execute
name: PushWorkspace
superclass: Workspaces
PK	}[�O��Fri/1.8/system/IRB/ExtendCommand/CurrentWorkingWorkspace/execute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommand::CurrentWorkingWorkspace#execute
is_singleton: false
name: execute
params: (*obj)
visibility: public
PK	}[�'F�Zri/1.8/system/IRB/ExtendCommand/CurrentWorkingWorkspace/cdesc-CurrentWorkingWorkspace.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: IRB::ExtendCommand::CurrentWorkingWorkspace
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: execute
name: CurrentWorkingWorkspace
superclass: Nop
PK	}[�����>ri/1.8/system/IRB/ExtendCommand/ChangeWorkspace/execute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommand::ChangeWorkspace#execute
is_singleton: false
name: execute
params: (*obj)
visibility: public
PK	}[�i�Jri/1.8/system/IRB/ExtendCommand/ChangeWorkspace/cdesc-ChangeWorkspace.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: IRB::ExtendCommand::ChangeWorkspace
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: execute
name: ChangeWorkspace
superclass: Nop
PK	}["8ޱ�.ri/1.8/system/IRB/ExtendCommand/Nop/irb-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommand::Nop#irb
is_singleton: false
name: irb
params: ()
visibility: public
PK	}[�r�H��2ri/1.8/system/IRB/ExtendCommand/Nop/cdesc-Nop.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: irb_context
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: execute
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: IRB::ExtendCommand::Nop
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: execute
- !ruby/object:RI::MethodSummary 
  name: irb
name: Nop
superclass: Object
PK	}[�c����2ri/1.8/system/IRB/ExtendCommand/Nop/execute-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommand::Nop::execute
is_singleton: true
name: execute
params: (conf, *opts)
visibility: public
PK	}[�N��2ri/1.8/system/IRB/ExtendCommand/Nop/execute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommand::Nop#execute
is_singleton: false
name: execute
params: (*opts)
visibility: public
PK	}[��ذ��.ri/1.8/system/IRB/ExtendCommand/Nop/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommand::Nop::new
is_singleton: true
name: new
params: (conf)
visibility: public
PK	}[߰����8ri/1.8/system/IRB/ExtendCommand/cdesc-ExtendCommand.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: IRB::ExtendCommand
includes: []

instance_methods: []

name: ExtendCommand
superclass: 
PK	}[�mѺ�3ri/1.8/system/IRB/ExtendCommand/Jobs/execute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommand::Jobs#execute
is_singleton: false
name: execute
params: ()
visibility: public
PK	}[h]2��4ri/1.8/system/IRB/ExtendCommand/Jobs/cdesc-Jobs.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: IRB::ExtendCommand::Jobs
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: execute
name: Jobs
superclass: Nop
PK	}[�0����9ri/1.8/system/IRB/ExtendCommand/Foreground/execute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommand::Foreground#execute
is_singleton: false
name: execute
params: (key)
visibility: public
PK	}[��o!@ri/1.8/system/IRB/ExtendCommand/Foreground/cdesc-Foreground.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: IRB::ExtendCommand::Foreground
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: execute
name: Foreground
superclass: Nop
PK	}[�.��9ri/1.8/system/IRB/ExtendCommand/Workspaces/execute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommand::Workspaces#execute
is_singleton: false
name: execute
params: (*obj)
visibility: public
PK
}[�G+�@ri/1.8/system/IRB/ExtendCommand/Workspaces/cdesc-Workspaces.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: IRB::ExtendCommand::Workspaces
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: execute
name: Workspaces
superclass: Nop
PK
}[��� ��4ri/1.8/system/IRB/ExtendCommand/Kill/cdesc-Kill.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: IRB::ExtendCommand::Kill
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: execute
name: Kill
superclass: Nop
PK
}[P�w��3ri/1.8/system/IRB/ExtendCommand/Kill/execute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommand::Kill#execute
is_singleton: false
name: execute
params: (*keys)
visibility: public
PK
}[P�>���3ri/1.8/system/IRB/ExtendCommand/Load/execute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ExtendCommand::Load#execute
is_singleton: false
name: execute
params: (file_name, priv = nil)
visibility: public
PK
}[|m#''4ri/1.8/system/IRB/ExtendCommand/Load/cdesc-Load.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: IRB::ExtendCommand::Load
includes: 
- !ruby/object:RI::IncludedModule 
  name: IrbLoader
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: execute
name: Load
superclass: Nop
PK
}[��y���3ri/1.8/system/IRB/ExtendCommand/Fork/execute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
full_name: IRB::ExtendCommand::Fork#execute
is_singleton: false
name: execute
params: (&block) {|| ...}
visibility: public
PK
}[����4ri/1.8/system/IRB/ExtendCommand/Fork/cdesc-Fork.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: IRB::ExtendCommand::Fork
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: execute
name: Fork
superclass: Nop
PK
}[���'ri/1.8/system/IRB/JobManager/irb-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::JobManager#irb
is_singleton: false
name: irb
params: (key)
visibility: public
PK
}[o���/ri/1.8/system/IRB/JobManager/main_thread-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::JobManager#main_thread
is_singleton: false
name: main_thread
params: ()
visibility: public
PK
}[T�����*ri/1.8/system/IRB/JobManager/n_jobs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::JobManager#n_jobs
is_singleton: false
name: n_jobs
params: ()
visibility: public
PK
}[���߳�,ri/1.8/system/IRB/JobManager/main_irb-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::JobManager#main_irb
is_singleton: false
name: main_irb
params: ()
visibility: public
PK
}[/�v��*ri/1.8/system/IRB/JobManager/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::JobManager#delete
is_singleton: false
name: delete
params: (key)
visibility: public
PK
}[�_�s��(ri/1.8/system/IRB/JobManager/kill-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::JobManager#kill
is_singleton: false
name: kill
params: (*keys)
visibility: public
PK
}[��ű�+ri/1.8/system/IRB/JobManager/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::JobManager#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK
}[&"�	��*ri/1.8/system/IRB/JobManager/switch-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::JobManager#switch
is_singleton: false
name: switch
params: (key)
visibility: public
PK
}[�$�G��'ri/1.8/system/IRB/JobManager/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::JobManager::new
is_singleton: true
name: new
params: ()
visibility: public
PK
}[
�*���2ri/1.8/system/IRB/JobManager/cdesc-JobManager.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: current_job
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: job management class
constants: []

full_name: IRB::JobManager
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: insert
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: irb
- !ruby/object:RI::MethodSummary 
  name: kill
- !ruby/object:RI::MethodSummary 
  name: main_irb
- !ruby/object:RI::MethodSummary 
  name: main_thread
- !ruby/object:RI::MethodSummary 
  name: n_jobs
- !ruby/object:RI::MethodSummary 
  name: search
- !ruby/object:RI::MethodSummary 
  name: switch
- !ruby/object:RI::MethodSummary 
  name: thread
name: JobManager
superclass: Object
PK
}[��A��*ri/1.8/system/IRB/JobManager/thread-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::JobManager#thread
is_singleton: false
name: thread
params: (key)
visibility: public
PK
}[�1$ɲ�*ri/1.8/system/IRB/JobManager/insert-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::JobManager#insert
is_singleton: false
name: insert
params: (irb)
visibility: public
PK
}[�ޱ���*ri/1.8/system/IRB/JobManager/search-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::JobManager#search
is_singleton: false
name: search
params: (key)
visibility: public
PK
}[��d���&ri/1.8/system/IRB/SLex/postproc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "\e$BMW%A%'%C%/\e(B?"
full_name: IRB::SLex#postproc
is_singleton: false
name: postproc
params: (token)
visibility: public
PK
}[�/��+ri/1.8/system/IRB/SLex/Node/match_io-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::SLex::Node#match_io
is_singleton: false
name: match_io
params: (io, op = "")
visibility: public
PK
}[
���(ri/1.8/system/IRB/SLex/Node/match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "chrs: String"
- !ruby/struct:SM::Flow::VERB 
  body: "      character array\n      io must have getc()/ungetc(); and ungetc() must be\n      able to be called arbitrary number of times.\n"
full_name: IRB::SLex::Node#match
is_singleton: false
name: match
params: (chrs, op = "")
visibility: public
PK
}[�iO���1ri/1.8/system/IRB/SLex/Node/create_subnode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::SLex::Node#create_subnode
is_singleton: false
name: create_subnode
params: (chrs, preproc = nil, postproc = nil)
visibility: public
PK
}[KTn0OO&ri/1.8/system/IRB/SLex/Node/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: if postproc is nil, this node is an abstract node. if postproc is non-nil, this node is a real node.
full_name: IRB::SLex::Node::new
is_singleton: true
name: new
params: (preproc = nil, postproc = nil)
visibility: public
PK
}[4��99+ri/1.8/system/IRB/SLex/Node/cdesc-Node.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: postproc
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: preproc
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: IRB::SLex::Node
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: create_subnode
- !ruby/object:RI::MethodSummary 
  name: match
- !ruby/object:RI::MethodSummary 
  name: match_io
- !ruby/object:RI::MethodSummary 
  name: search
name: Node
superclass: Object
PK
}[�5�|��)ri/1.8/system/IRB/SLex/Node/search-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::SLex::Node#search
is_singleton: false
name: search
params: (chrs, opt = nil)
visibility: public
PK
}[c�I���$ri/1.8/system/IRB/SLex/create-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::SLex#create
is_singleton: false
name: create
params: (token, preproc = nil, postproc = nil)
visibility: public
PK
}[c�v��#ri/1.8/system/IRB/SLex/match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::SLex#match
is_singleton: false
name: match
params: (token)
visibility: public
PK
}[p^=#��%ri/1.8/system/IRB/SLex/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::SLex#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK
}[�}%+��!ri/1.8/system/IRB/SLex/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::SLex::new
is_singleton: true
name: new
params: ()
visibility: public
PK
}[9����&ri/1.8/system/IRB/SLex/def_rule-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::SLex#def_rule
is_singleton: false
name: def_rule
params: (token, preproc = nil, postproc = nil, &block)
visibility: public
PK
}[\��'ri/1.8/system/IRB/SLex/def_rules-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::SLex#def_rules
is_singleton: false
name: def_rules
params: (*tokens, &block)
visibility: public
PK
}[�
&ri/1.8/system/IRB/SLex/cdesc-SLex.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: DOUT
  value: Notifier::def_notifier("SLex::")
- !ruby/object:RI::Constant 
  comment: 
  name: D_WARN
  value: "DOUT::def_notifier(1, \"Warn: \")"
- !ruby/object:RI::Constant 
  comment: 
  name: D_DEBUG
  value: "DOUT::def_notifier(2, \"Debug: \")"
- !ruby/object:RI::Constant 
  comment: 
  name: D_DETAIL
  value: "DOUT::def_notifier(4, \"Detail: \")"
full_name: IRB::SLex
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: create
- !ruby/object:RI::MethodSummary 
  name: def_rule
- !ruby/object:RI::MethodSummary 
  name: def_rules
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: match
- !ruby/object:RI::MethodSummary 
  name: postproc
- !ruby/object:RI::MethodSummary 
  name: preproc
- !ruby/object:RI::MethodSummary 
  name: search
name: SLex
superclass: Object
PK
}[#�ښ��%ri/1.8/system/IRB/SLex/preproc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::SLex#preproc
is_singleton: false
name: preproc
params: (token, proc)
visibility: public
PK
}[��I��$ri/1.8/system/IRB/SLex/search-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::SLex#search
is_singleton: false
name: search
params: (token)
visibility: public
PK
}[1�goo+ri/1.8/system/IRB/rc_file_generators-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: "proc{|rc|  rc == \"rc\" ? irbrc : irbrc+rc"
comment: 
- !ruby/struct:SM::Flow::P 
  body: enumerate possible rc-file base name generators
full_name: IRB::rc_file_generators
is_singleton: true
name: rc_file_generators
params: "() {|proc{|rc| rc == \"rc\" ? irbrc : irbrc+rc| ...}"
visibility: public
PK
}[�mm:ri/1.8/system/IRB/MethodExtender/cdesc-MethodExtender.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: IRB::MethodExtender
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: def_post_proc
- !ruby/object:RI::MethodSummary 
  name: def_pre_proc
- !ruby/object:RI::MethodSummary 
  name: new_alias_name
name: MethodExtender
superclass: 
PK
}[.�5�CC6ri/1.8/system/IRB/MethodExtender/new_alias_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "return #{prefix}#{name}#{postfix}&lt;num&gt;"
full_name: IRB::MethodExtender#new_alias_name
is_singleton: false
name: new_alias_name
params: (name, prefix = "__alias_of__", postfix = "__")
visibility: public
PK
}[�֨��4ri/1.8/system/IRB/MethodExtender/def_pre_proc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::MethodExtender#def_pre_proc
is_singleton: false
name: def_pre_proc
params: (base_method, extend_method)
visibility: public
PK
}[�D���5ri/1.8/system/IRB/MethodExtender/def_post_proc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::MethodExtender#def_post_proc
is_singleton: false
name: def_post_proc
params: (base_method, extend_method)
visibility: public
PK
}[�i�$��!ri/1.8/system/IRB/irb_exit-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::irb_exit
is_singleton: true
name: irb_exit
params: (irb, ret)
visibility: public
PK
}[[U;��%ri/1.8/system/IRB/Locale/print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Locale#print
is_singleton: false
name: print
params: (*opts)
visibility: public
PK
}[���&ri/1.8/system/IRB/Locale/printf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Locale#printf
is_singleton: false
name: printf
params: (*opts)
visibility: public
PK
}[�)L���(ri/1.8/system/IRB/Locale/lc2kconv-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Locale#lc2kconv
is_singleton: false
name: lc2kconv
params: (lang)
visibility: private
PK
}[}�,a��$ri/1.8/system/IRB/Locale/find-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Locale#find
is_singleton: false
name: find
params: (file , paths = $:)
visibility: public
PK
}[]����&ri/1.8/system/IRB/Locale/String-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Locale#String
is_singleton: false
name: String
params: (mes)
visibility: public
PK
}[d9�R��(ri/1.8/system/IRB/Locale/readline-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Locale#readline
is_singleton: false
name: readline
params: (*rs)
visibility: public
PK
}[�>��uu*ri/1.8/system/IRB/Locale/cdesc-Locale.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: lang
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: JPDefaultLocale
  value: "\"ja\""
- !ruby/object:RI::Constant 
  comment: 
  name: LOCALE_DIR
  value: "\"/lc/\""
full_name: IRB::Locale
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: String
- !ruby/object:RI::MethodSummary 
  name: find
- !ruby/object:RI::MethodSummary 
  name: format
- !ruby/object:RI::MethodSummary 
  name: gets
- !ruby/object:RI::MethodSummary 
  name: lc2kconv
- !ruby/object:RI::MethodSummary 
  name: lc_path
- !ruby/object:RI::MethodSummary 
  name: load
- !ruby/object:RI::MethodSummary 
  name: print
- !ruby/object:RI::MethodSummary 
  name: printf
- !ruby/object:RI::MethodSummary 
  name: puts
- !ruby/object:RI::MethodSummary 
  name: readline
- !ruby/object:RI::MethodSummary 
  name: real_load
- !ruby/object:RI::MethodSummary 
  name: require
- !ruby/object:RI::MethodSummary 
  name: search_file
name: Locale
superclass: Object
PK
}[<$�@��$ri/1.8/system/IRB/Locale/load-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Locale#load
is_singleton: false
name: load
params: (file, priv=nil)
visibility: public
PK
}[V�o��'ri/1.8/system/IRB/Locale/lc_path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Locale#lc_path
is_singleton: false
name: lc_path
params: (file = "", lc = @lang)
visibility: private
PK
}[�	�C��'ri/1.8/system/IRB/Locale/require-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Locale#require
is_singleton: false
name: require
params: (file, priv = nil)
visibility: public
PK
}[TP���#ri/1.8/system/IRB/Locale/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Locale::new
is_singleton: true
name: new
params: (locale = nil)
visibility: public
PK
}[
3���$ri/1.8/system/IRB/Locale/gets-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Locale#gets
is_singleton: false
name: gets
params: (*rs)
visibility: public
PK
}[fT����&ri/1.8/system/IRB/Locale/format-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Locale#format
is_singleton: false
name: format
params: (*opts)
visibility: public
PK
}[�6�ݼ�)ri/1.8/system/IRB/Locale/real_load-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Locale#real_load
is_singleton: false
name: real_load
params: (path, priv)
visibility: private
PK
}["�!��+ri/1.8/system/IRB/Locale/search_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Locale#search_file
is_singleton: false
name: search_file
params: (path, file)
visibility: private
PK
}[Uu���$ri/1.8/system/IRB/Locale/puts-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Locale#puts
is_singleton: false
name: puts
params: (*opts)
visibility: public
PK
}["xH��1ri/1.8/system/IRB/Irb/suspend_input_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: back_io
comment: 
full_name: IRB::Irb#suspend_input_method
is_singleton: false
name: suspend_input_method
params: (input_method) {|back_io| ...}
visibility: public
PK
}[\/���.ri/1.8/system/IRB/Irb/suspend_workspace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: back_workspace
comment: 
full_name: IRB::Irb#suspend_workspace
is_singleton: false
name: suspend_workspace
params: (workspace) {|back_workspace| ...}
visibility: public
PK
}[X)��$ri/1.8/system/IRB/Irb/cdesc-Irb.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: context
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: scanner
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: irb interpriter main routine
constants: []

full_name: IRB::Irb
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: eval_input
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: output_value
- !ruby/object:RI::MethodSummary 
  name: prompt
- !ruby/object:RI::MethodSummary 
  name: signal_handle
- !ruby/object:RI::MethodSummary 
  name: signal_handle
- !ruby/object:RI::MethodSummary 
  name: signal_status
- !ruby/object:RI::MethodSummary 
  name: suspend_context
- !ruby/object:RI::MethodSummary 
  name: suspend_input_method
- !ruby/object:RI::MethodSummary 
  name: suspend_name
- !ruby/object:RI::MethodSummary 
  name: suspend_workspace
name: Irb
superclass: Object
PK}[wv���#ri/1.8/system/IRB/Irb/prompt-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Irb#prompt
is_singleton: false
name: prompt
params: (prompt, ltype, indent, line_no)
visibility: public
PK}[Hi��$ri/1.8/system/IRB/Irb/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Irb#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK}[�����)ri/1.8/system/IRB/Irb/suspend_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: back_path, back_name
comment: 
full_name: IRB::Irb#suspend_name
is_singleton: false
name: suspend_name
params: (path = nil, name = nil) {|back_path, back_name| ...}
visibility: public
PK}[	�
��� ri/1.8/system/IRB/Irb/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Irb::new
is_singleton: true
name: new
params: (workspace = nil, input_method = nil, output_method = nil)
visibility: public
PK}[�sbH��*ri/1.8/system/IRB/Irb/signal_handle-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Irb#signal_handle
is_singleton: false
name: signal_handle
params: ()
visibility: public
PK}[^t��*ri/1.8/system/IRB/Irb/signal_status-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: if @signal_status == :IN_LOAD
comment: 
full_name: IRB::Irb#signal_status
is_singleton: false
name: signal_status
params: (status) {|if @signal_status == :IN_LOAD| ...}
visibility: public
PK}[�X�!��)ri/1.8/system/IRB/Irb/output_value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Irb#output_value
is_singleton: false
name: output_value
params: ()
visibility: public
PK}[MŚN��'ri/1.8/system/IRB/Irb/eval_input-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Irb#eval_input
is_singleton: false
name: eval_input
params: ()
visibility: public
PK}[�t���,ri/1.8/system/IRB/Irb/suspend_context-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: back_context
comment: 
full_name: IRB::Irb#suspend_context
is_singleton: false
name: suspend_context
params: (context) {|back_context| ...}
visibility: public
PK}[�h���'ri/1.8/system/IRB/CurrentContext-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::CurrentContext
is_singleton: true
name: CurrentContext
params: ()
visibility: public
PK}[9�����ri/1.8/system/IRB/irb-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: invoke multi-irb
full_name: IRB::irb
is_singleton: true
name: irb
params: (file = nil, *main)
visibility: public
PK}['�qɟ�ri/1.8/system/IRB/conf-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::conf
is_singleton: true
name: conf
params: ()
visibility: public
PK}[o�K��.ri/1.8/system/IRB/Notifier/def_notifier-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Notifier#def_notifier
is_singleton: false
name: def_notifier
params: (prefix = "", output_method = StdioOutputMethod.new)
visibility: public
PK}[��GT��8ri/1.8/system/IRB/Notifier/AbstructNotifier/print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Notifier::AbstructNotifier#print
is_singleton: false
name: print
params: (*opts)
visibility: public
PK}[��j��9ri/1.8/system/IRB/Notifier/AbstructNotifier/printf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Notifier::AbstructNotifier#printf
is_singleton: false
name: printf
params: (format, *opts)
visibility: public
PK}[S��
��6ri/1.8/system/IRB/Notifier/AbstructNotifier/ppx-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Notifier::AbstructNotifier#ppx
is_singleton: false
name: ppx
params: (prefix, *objs)
visibility: public
PK}[]37���5ri/1.8/system/IRB/Notifier/AbstructNotifier/pp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Notifier::AbstructNotifier#pp
is_singleton: false
name: pp
params: (*objs)
visibility: public
PK}[��{��6ri/1.8/system/IRB/Notifier/AbstructNotifier/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Notifier::AbstructNotifier::new
is_singleton: true
name: new
params: (prefix, base_notifier)
visibility: public
PK}[��BU��<ri/1.8/system/IRB/Notifier/AbstructNotifier/notify%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Notifier::AbstructNotifier#notify?
is_singleton: false
name: notify?
params: ()
visibility: public
PK}[�P�^��Gri/1.8/system/IRB/Notifier/AbstructNotifier/cdesc-AbstructNotifier.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: prefix
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: IRB::Notifier::AbstructNotifier
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: exec_if
- !ruby/object:RI::MethodSummary 
  name: notify?
- !ruby/object:RI::MethodSummary 
  name: pp
- !ruby/object:RI::MethodSummary 
  name: ppx
- !ruby/object:RI::MethodSummary 
  name: print
- !ruby/object:RI::MethodSummary 
  name: printf
- !ruby/object:RI::MethodSummary 
  name: printn
- !ruby/object:RI::MethodSummary 
  name: puts
name: AbstructNotifier
superclass: Object
PK}[Ǐ���9ri/1.8/system/IRB/Notifier/AbstructNotifier/printn-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Notifier::AbstructNotifier#printn
is_singleton: false
name: printn
params: (*opts)
visibility: public
PK}[}����7ri/1.8/system/IRB/Notifier/AbstructNotifier/puts-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Notifier::AbstructNotifier#puts
is_singleton: false
name: puts
params: (*objs)
visibility: public
PK}[�'�.��:ri/1.8/system/IRB/Notifier/AbstructNotifier/exec_if-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (@base_notifier)
comment: 
full_name: IRB::Notifier::AbstructNotifier#exec_if
is_singleton: false
name: exec_if
params: () {|@base_notifier| ...}
visibility: public
PK}[i�~�<<Iri/1.8/system/IRB/Notifier/CompositeNotifier/cdesc-CompositeNotifier.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: level_notifier
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: notifiers
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: IRB::Notifier::CompositeNotifier
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: def_notifier
- !ruby/object:RI::MethodSummary 
  name: level=
- !ruby/object:RI::MethodSummary 
  name: level_notifier=
name: CompositeNotifier
superclass: AbstructNotifier
PK}[6�?��@ri/1.8/system/IRB/Notifier/CompositeNotifier/def_notifier-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Notifier::CompositeNotifier#def_notifier
is_singleton: false
name: def_notifier
params: (level, prefix = "")
visibility: public
PK}[D��_<ri/1.8/system/IRB/Notifier/CompositeNotifier/level%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #level_notifier="
full_name: IRB::Notifier::CompositeNotifier#level=
is_singleton: false
name: level=
params: (value)
visibility: public
PK}[��,Eri/1.8/system/IRB/Notifier/CompositeNotifier/level_notifier%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: level=
block_params: 
comment: 
full_name: IRB::Notifier::CompositeNotifier#level_notifier=
is_singleton: false
name: level_notifier=
params: (value)
visibility: public
PK}[��s��7ri/1.8/system/IRB/Notifier/CompositeNotifier/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Notifier::CompositeNotifier::new
is_singleton: true
name: new
params: (prefix, base_notifier)
visibility: public
PK}[wo�(��Eri/1.8/system/IRB/Notifier/LeveledNotifier/cdesc-LeveledNotifier.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: level
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: IRB::Notifier::LeveledNotifier
includes: 
- !ruby/object:RI::IncludedModule 
  name: Comparable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: notify?
name: LeveledNotifier
superclass: AbstructNotifier
PK}[�?F��;ri/1.8/system/IRB/Notifier/LeveledNotifier/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Notifier::LeveledNotifier#<=>
is_singleton: false
name: <=>
params: (other)
visibility: public
PK}[��'k��5ri/1.8/system/IRB/Notifier/LeveledNotifier/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Notifier::LeveledNotifier::new
is_singleton: true
name: new
params: (base, level, prefix)
visibility: public
PK}[N����;ri/1.8/system/IRB/Notifier/LeveledNotifier/notify%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Notifier::LeveledNotifier#notify?
is_singleton: false
name: notify?
params: ()
visibility: public
PK}[��/AA.ri/1.8/system/IRB/Notifier/cdesc-Notifier.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: D_NOMSG
  value: NoMsgNotifier.new
full_name: IRB::Notifier
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: def_notifier
name: Notifier
superclass: 
PK}[����99Ari/1.8/system/IRB/Notifier/NoMsgNotifier/cdesc-NoMsgNotifier.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: IRB::Notifier::NoMsgNotifier
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: notify?
name: NoMsgNotifier
superclass: LeveledNotifier
PK}[V�B^��3ri/1.8/system/IRB/Notifier/NoMsgNotifier/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Notifier::NoMsgNotifier::new
is_singleton: true
name: new
params: ()
visibility: public
PK}[Z�㑾�9ri/1.8/system/IRB/Notifier/NoMsgNotifier/notify%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::Notifier::NoMsgNotifier#notify?
is_singleton: false
name: notify?
params: ()
visibility: public
PK}[�XE���(ri/1.8/system/IRB/Abort/cdesc-Abort.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: IRB::Abort
includes: []

instance_methods: []

name: Abort
superclass: Exception
PK}[
�k��#ri/1.8/system/IRB/JobManager-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::JobManager
is_singleton: true
name: JobManager
params: ()
visibility: public
PK}[�U{��"ri/1.8/system/IRB/irb_abort-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::irb_abort
is_singleton: true
name: irb_abort
params: (irb, exception = Abort)
visibility: public
PK}[��؎��0ri/1.8/system/IRB/LoadAbort/cdesc-LoadAbort.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: IRB::LoadAbort
includes: []

instance_methods: []

name: LoadAbort
superclass: Exception
PK}[�\Jv��$ri/1.8/system/IRB/print_usage-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::print_usage
is_singleton: true
name: print_usage
params: ()
visibility: public
PK}[�ҙ��(ri/1.8/system/IRB/InputMethod/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::InputMethod::new
is_singleton: true
name: new
params: (file = STDIN_FILE_NAME)
visibility: public
PK}[�� ��)ri/1.8/system/IRB/InputMethod/gets-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::InputMethod#gets
is_singleton: false
name: gets
params: ()
visibility: public
PK}[�	����4ri/1.8/system/IRB/InputMethod/cdesc-InputMethod.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: file_name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: prompt
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: IRB::InputMethod
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: gets
- !ruby/object:RI::MethodSummary 
  name: readable_atfer_eof?
name: InputMethod
superclass: Object
PK}[+�:ri/1.8/system/IRB/InputMethod/readable_atfer_eof%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::InputMethod#readable_atfer_eof?
is_singleton: false
name: readable_atfer_eof?
params: ()
visibility: public
PK}[zf�q��0ri/1.8/system/IRB/StdioOutputMethod/print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::StdioOutputMethod#print
is_singleton: false
name: print
params: (*opts)
visibility: public
PK}[�>�@ri/1.8/system/IRB/StdioOutputMethod/cdesc-StdioOutputMethod.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: IRB::StdioOutputMethod
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: print
name: StdioOutputMethod
superclass: OutputMethod
PK}[����� ri/1.8/system/IRB/version-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: IRB version method
full_name: IRB::version
is_singleton: true
name: version
params: ()
visibility: public
PK}[ْƚ��*ri/1.8/system/IRB/initialize_tracer-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: initialize tracing function
full_name: IRB::initialize_tracer
is_singleton: true
name: initialize_tracer
params: ()
visibility: public
PK}[㳖���&ri/1.8/system/IRB/delete_caller-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::delete_caller
is_singleton: true
name: delete_caller
params: ()
visibility: public
PK}[�;^K��1ri/1.8/system/IRB/ReadlineInputMethod/line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ReadlineInputMethod#line
is_singleton: false
name: line
params: (line_no)
visibility: public
PK}[얛�Dri/1.8/system/IRB/ReadlineInputMethod/cdesc-ReadlineInputMethod.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: IRB::ReadlineInputMethod
includes: 
- !ruby/object:RI::IncludedModule 
  name: Readline
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: eof?
- !ruby/object:RI::MethodSummary 
  name: gets
- !ruby/object:RI::MethodSummary 
  name: line
- !ruby/object:RI::MethodSummary 
  name: readable_atfer_eof?
name: ReadlineInputMethod
superclass: InputMethod
PK}[�r����0ri/1.8/system/IRB/ReadlineInputMethod/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ReadlineInputMethod::new
is_singleton: true
name: new
params: ()
visibility: public
PK}[�#ߏ��1ri/1.8/system/IRB/ReadlineInputMethod/gets-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ReadlineInputMethod#gets
is_singleton: false
name: gets
params: ()
visibility: public
PK}[EKd���3ri/1.8/system/IRB/ReadlineInputMethod/eof%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ReadlineInputMethod#eof?
is_singleton: false
name: eof?
params: ()
visibility: public
PK}[�
���Bri/1.8/system/IRB/ReadlineInputMethod/readable_atfer_eof%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::ReadlineInputMethod#readable_atfer_eof?
is_singleton: false
name: readable_atfer_eof?
params: ()
visibility: public
PK}[%ݝ���ri/1.8/system/IRB/setup-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: initialize config
full_name: IRB::setup
is_singleton: true
name: setup
params: (ap_path)
visibility: public
PK}[\��-��%ri/1.8/system/IRB/History/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::History#size
is_singleton: false
name: size
params: (size)
visibility: public
PK}[ܶ^:��'ri/1.8/system/IRB/History/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::History#[]
is_singleton: false
name: "[]"
params: (idx)
visibility: public
PK}[-T]���,ri/1.8/system/IRB/History/cdesc-History.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: IRB::History
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: push
- !ruby/object:RI::MethodSummary 
  name: size
name: History
superclass: Object
PK}[�H${��(ri/1.8/system/IRB/History/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::History#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK}[O��Q��$ri/1.8/system/IRB/History/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::History::new
is_singleton: true
name: new
params: (size = 16)
visibility: public
PK}[��>��%ri/1.8/system/IRB/History/push-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::History#push
is_singleton: false
name: push
params: (no, val)
visibility: public
PK}[P����$ri/1.8/system/IRB/init_config-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "@CONF default setting"
full_name: IRB::init_config
is_singleton: true
name: init_config
params: (ap_path)
visibility: public
PK}[>Pyb��+ri/1.8/system/IRB/WorkSpace/evaluate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::WorkSpace#evaluate
is_singleton: false
name: evaluate
params: (context, statements, file = nil, line = nil)
visibility: public
PK}[��cl3ri/1.8/system/IRB/WorkSpace/filter_backtrace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: error message manipulator
full_name: IRB::WorkSpace#filter_backtrace
is_singleton: false
name: filter_backtrace
params: (bt)
visibility: public
PK}[�D��BB0ri/1.8/system/IRB/WorkSpace/cdesc-WorkSpace.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: binding
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: main
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: IRB::WorkSpace
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: __evaluate__
- !ruby/object:RI::MethodSummary 
  name: evaluate
- !ruby/object:RI::MethodSummary 
  name: evaluate
- !ruby/object:RI::MethodSummary 
  name: filter_backtrace
name: WorkSpace
superclass: Object
PK}[�n��44&ri/1.8/system/IRB/WorkSpace/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: create new workspace. set self to main if specified, otherwise inherit main from TOPLEVEL_BINDING.
full_name: IRB::WorkSpace::new
is_singleton: true
name: new
params: (*main)
visibility: public
PK}[�CK~))/ri/1.8/system/IRB/WorkSpace/__evaluate__-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #evaluate"
full_name: IRB::WorkSpace#__evaluate__
is_singleton: false
name: __evaluate__
params: (context, statements, file = __FILE__, line = __LINE__)
visibility: public
PK}[�?��#ri/1.8/system/IRB/parse_opts-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: option analyzing
full_name: IRB::parse_opts
is_singleton: true
name: parse_opts
params: ()
visibility: public
PK}[ %���%ri/1.8/system/IRB/load_modules-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: loading modules
full_name: IRB::load_modules
is_singleton: true
name: load_modules
params: ()
visibility: public
PK}[1Z���ri/1.8/system/IRB/start-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: initialize IRB and start TOP_LEVEL irb
full_name: IRB::start
is_singleton: true
name: start
params: (ap_path = nil)
visibility: public
PK
}[Й@9��.ri/1.8/system/IRB/StdioInputMethod/line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::StdioInputMethod#line
is_singleton: false
name: line
params: (line_no)
visibility: public
PK
}[G(���>ri/1.8/system/IRB/StdioInputMethod/cdesc-StdioInputMethod.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: IRB::StdioInputMethod
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: eof?
- !ruby/object:RI::MethodSummary 
  name: gets
- !ruby/object:RI::MethodSummary 
  name: line
- !ruby/object:RI::MethodSummary 
  name: readable_atfer_eof?
name: StdioInputMethod
superclass: InputMethod
PK
}[�Lu��-ri/1.8/system/IRB/StdioInputMethod/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::StdioInputMethod::new
is_singleton: true
name: new
params: ()
visibility: public
PK
}[_���.ri/1.8/system/IRB/StdioInputMethod/gets-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::StdioInputMethod#gets
is_singleton: false
name: gets
params: ()
visibility: public
PK
}[�q䑱�0ri/1.8/system/IRB/StdioInputMethod/eof%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::StdioInputMethod#eof?
is_singleton: false
name: eof?
params: ()
visibility: public
PK
}[�h�Y��?ri/1.8/system/IRB/StdioInputMethod/readable_atfer_eof%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::StdioInputMethod#readable_atfer_eof?
is_singleton: false
name: readable_atfer_eof?
params: ()
visibility: public
PK
}[�J�D��+ri/1.8/system/IRB/OutputMethod/print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::OutputMethod#print
is_singleton: false
name: print
params: (*opts)
visibility: public
PK
}[!y��,ri/1.8/system/IRB/OutputMethod/printf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: extend printf
full_name: IRB::OutputMethod#printf
is_singleton: false
name: printf
params: (format, *opts)
visibility: public
PK
}[���)ri/1.8/system/IRB/OutputMethod/ppx-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::OutputMethod#ppx
is_singleton: false
name: ppx
params: (prefix, *objs)
visibility: public
PK
}[N���)ri/1.8/system/IRB/OutputMethod/foo-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::OutputMethod#foo
is_singleton: false
name: foo
params: (format)
visibility: public
PK
}[�S�uee9ri/1.8/system/IRB/OutputMethod/parse_printf_format-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "% &lt;\xA5\xD5\xA5\xE9\xA5\xB0&gt; [#0- +] &lt;\xBA\xC7\xBE\xAE\xA5\xD5\xA5\xA3\xA1\xBC\xA5\xEB\xA5\xC9\xC9\xFD&gt; (*|*[1-9][0-9]*\\$|[1-9][0-9]*) &lt;\xC0\xBA\xC5\xD9&gt;.(*|*[1-9][0-9]*\\$|[1-9][0-9]*|)? #&lt;\xC4\xB9\xA4\xB5\xBD\xA4\xC0\xB5\xCA\xB8\xBB\xFA&gt;(hh|h|l|ll|L|q|j|z|t) &lt;\xCA\xD1\xB4\xB9\xBD\xA4\xC0\xB5\xCA\xB8\xBB\xFA&gt;[diouxXeEfgGcsb%]"
full_name: IRB::OutputMethod#parse_printf_format
is_singleton: false
name: parse_printf_format
params: (format, opts)
visibility: public
PK
}[�4�M��(ri/1.8/system/IRB/OutputMethod/pp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::OutputMethod#pp
is_singleton: false
name: pp
params: (*objs)
visibility: public
PK
}[3L��,ri/1.8/system/IRB/OutputMethod/printn-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::OutputMethod#printn
is_singleton: false
name: printn
params: (*opts)
visibility: public
PK
}[�I���*ri/1.8/system/IRB/OutputMethod/puts-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IRB::OutputMethod#puts
is_singleton: false
name: puts
params: (*objs)
visibility: public
PK
}[�ё���6ri/1.8/system/IRB/OutputMethod/cdesc-OutputMethod.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: OutputMethod
- !ruby/struct:SM::Flow::VERB 
  body: "  StdioOutputMethod\n"
constants: []

full_name: IRB::OutputMethod
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: foo
- !ruby/object:RI::MethodSummary 
  name: parse_printf_format
- !ruby/object:RI::MethodSummary 
  name: pp
- !ruby/object:RI::MethodSummary 
  name: ppx
- !ruby/object:RI::MethodSummary 
  name: print
- !ruby/object:RI::MethodSummary 
  name: printf
- !ruby/object:RI::MethodSummary 
  name: printn
- !ruby/object:RI::MethodSummary 
  name: puts
name: OutputMethod
superclass: Object
PK
}[��β�ri/1.8/system/Prime/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: succ
comment: 
full_name: Prime#each
is_singleton: false
name: each
params: () {|succ| ...}
visibility: public
PK
}[ �l��$ri/1.8/system/Prime/cdesc-Prime.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: Prime
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: next
- !ruby/object:RI::MethodSummary 
  name: succ
name: Prime
superclass: Object
PK
}[��hw��ri/1.8/system/Prime/next-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #succ"
full_name: Prime#next
is_singleton: false
name: next
params: ()
visibility: public
PK
}[��I���ri/1.8/system/Prime/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Prime::new
is_singleton: true
name: new
params: ()
visibility: public
PK
}[ūb���ri/1.8/system/Prime/succ-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: next
block_params: 
comment: 
full_name: Prime#succ
is_singleton: false
name: succ
params: ()
visibility: public
PK
}[zdI��ri/1.8/system/Sync/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Sync::new
is_singleton: true
name: new
params: ()
visibility: public
PK
}[�^~�"ri/1.8/system/Sync/cdesc-Sync.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: Sync
includes: 
- !ruby/object:RI::IncludedModule 
  name: Sync_m
instance_methods: []

name: Sync
superclass: Object
PK
}[����,ri/1.8/system/TCPServer/cdesc-TCPServer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Class <tt>Socket</tt> provides access to the underlying operating system socket implementations. It can be used to provide more operating system specific functionality than the protocol-specific socket classes but at the expense of greater complexity. In particular, the class handles addresses using +struct sockaddr+ structures packed into Ruby strings, which can be a joy to manipulate.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Exception Handling
- !ruby/struct:SM::Flow::P 
  body: Ruby's implementation of <tt>Socket</tt> causes an exception to be raised based on the error generated by the system dependent implementation. This is why the methods are documented in a way that isolate Unix-based system exceptions from Windows based exceptions. If more information on particular exception is needed please refer to the Unix manual pages or the Windows WinSock reference.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Documentation by
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Zach Dennis
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Sam Roberts
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <em>Programming Ruby</em> from The Pragmatic Bookshelf.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: Much material in this documentation is taken with permission from <em>Programming Ruby</em> from The Pragmatic Bookshelf.
constants: []

full_name: TCPServer
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: accept_nonblock
- !ruby/object:RI::MethodSummary 
  name: listen
name: TCPServer
superclass: TCPSocket
PK
}[t��OO.ri/1.8/system/TCPServer/accept_nonblock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Accepts an incoming connection using accept(2) after O_NONBLOCK is set for the underlying file descriptor. It returns an accepted TCPSocket for the incoming connection.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "     require 'socket'\n     serv = TCPServer.new(2202)\n     begin\n       sock = serv.accept_nonblock\n     rescue Errno::EAGAIN, Errno::EWOULDBLOCK, Errno::ECONNABORTED, Errno::EPROTO, Errno::EINTR\n       IO.select([serv])\n       retry\n     end\n     # sock is an accepted socket.\n"
- !ruby/struct:SM::Flow::P 
  body: Refer to Socket#accept for the exceptions that may be thrown if the call to TCPServer#accept_nonblock fails.
- !ruby/struct:SM::Flow::P 
  body: TCPServer#accept_nonblock may raise any error corresponding to accept(2) failure, including Errno::EAGAIN.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: See
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: TCPServer#accept
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Socket#accept
  type: :BULLET
full_name: TCPServer#accept_nonblock
is_singleton: false
name: accept_nonblock
params: |
  tcpserver.accept_nonblock => tcpsocket

visibility: public
PK
}[���''%ri/1.8/system/TCPServer/listen-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Listens for connections, using the specified <tt>int</tt> as the backlog. A call to <em>listen</em> only applies if the <tt>socket</tt> is of type SOCK_STREAM or SOCK_SEQPACKET.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameter
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>backlog</tt> - the maximum length of the queue for pending connections.
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example 1
- !ruby/struct:SM::Flow::VERB 
  body: "     require 'socket'\n     include Socket::Constants\n     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )\n     sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )\n     socket.bind( sockaddr )\n     socket.listen( 5 )\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: "Example 2 (listening on an arbitary port, unix-based systems only):"
- !ruby/struct:SM::Flow::VERB 
  body: "     require 'socket'\n     include Socket::Constants\n     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )\n     socket.listen( 1 )\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Unix-based Exceptions
- !ruby/struct:SM::Flow::P 
  body: On unix based systems the above will work because a new <tt>sockaddr</tt> struct is created on the address ADDR_ANY, for an arbitrary port number as handed off by the kernel. It will not work on Windows, because Windows requires that the <tt>socket</tt> is bound by calling <em>bind</em> before it can <em>listen</em>.
- !ruby/struct:SM::Flow::P 
  body: If the <em>backlog</em> amount exceeds the implementation-dependent maximum queue length, the implementation's maximum queue length will be used.
- !ruby/struct:SM::Flow::P 
  body: "On unix-based based systems the following system exceptions may be raised if the call to <em>listen</em> fails:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EBADF - the <em>socket</em> argument is not a valid file descriptor
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EDESTADDRREQ - the <em>socket</em> is not bound to a local address, and the protocol does not support listening on an unbound socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINVAL - the <em>socket</em> is already connected
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOTSOCK - the <em>socket</em> argument does not refer to a socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EOPNOTSUPP - the <em>socket</em> protocol does not support listen
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EACCES - the calling process does not have approriate privileges
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINVAL - the <em>socket</em> has been shut down
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOBUFS - insufficient resources are available in the system to complete the call
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Windows Exceptions
- !ruby/struct:SM::Flow::P 
  body: "On Windows systems the following system exceptions may be raised if the call to <em>listen</em> fails:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENETDOWN - the network is down
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EADDRINUSE - the socket's local address is already in use. This usually occurs during the execution of <em>bind</em> but could be delayed if the call to <em>bind</em> was to a partially wildcard address (involving ADDR_ANY) and if a specific address needs to be commmitted at the time of the call to <em>listen</em>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINPROGRESS - a Windows Sockets 1.1 call is in progress or the service provider is still processing a callback function
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINVAL - the <tt>socket</tt> has not been bound with a call to <em>bind</em>.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EISCONN - the <tt>socket</tt> is already connected
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EMFILE - no more socket descriptors are available
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOBUFS - no buffer space is available
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOTSOC - <tt>socket</tt> is not a socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EOPNOTSUPP - the referenced <tt>socket</tt> is not a type that supports the <em>listen</em> method
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: See
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: listen manual pages on unix-based systems
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: listen function in Microsoft's Winsock functions reference
  type: :BULLET
full_name: TCPServer#listen
is_singleton: false
name: listen
params: |
  socket.listen( int ) => 0

visibility: public
PK
}[��3Q��,ri/1.8/system/NonString/cdesc-NonString.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: NonString
includes: []

instance_methods: []

name: NonString
superclass: Test::Unit::TestCase
PK
}[�5�.ri/1.8/system/SystemExit/cdesc-SystemExit.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: SystemExit
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: status
- !ruby/object:RI::MethodSummary 
  name: success?
name: SystemExit
superclass: Exception
PK
}[3�'�66#ri/1.8/system/SystemExit/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new <tt>SystemExit</tt> exception with the given status.
full_name: SystemExit::new
is_singleton: true
name: new
params: |
  SystemExit.new(status=0)   => system_exit

visibility: public
PK
}[�v��))&ri/1.8/system/SystemExit/status-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the status value associated with this system exit.
full_name: SystemExit#status
is_singleton: false
name: status
params: |
  system_exit.status   => fixnum

visibility: public
PK
}[�
-�??*ri/1.8/system/SystemExit/success%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if exiting successful, <tt>false</tt> if not.
full_name: SystemExit#success?
is_singleton: false
name: success?
params: |
  system_exit.success?  => true or false

visibility: public
PK
}[Dh�J��Cri/1.8/system/PP/ObjectMixin/pretty_print_instance_variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a sorted array of instance variable names.
- !ruby/struct:SM::Flow::P 
  body: "This method should return an array of names of instance variables as symbols or strings as: +[:@a, :@b]+."
full_name: PP::ObjectMixin#pretty_print_instance_variables
is_singleton: false
name: pretty_print_instance_variables
params: ()
visibility: public
PK
}[�a��0ri/1.8/system/PP/ObjectMixin/pretty_print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "A default pretty printing method for general objects. It calls #pretty_print_instance_variables to list instance variables."
- !ruby/struct:SM::Flow::P 
  body: "If <tt>self</tt> has a customized (redefined) #inspect method, the result of self.inspect is used but it obviously has no line break hints."
- !ruby/struct:SM::Flow::P 
  body: "This module provides predefined #pretty_print methods for some of the most commonly used built-in classes for convenience."
full_name: PP::ObjectMixin#pretty_print
is_singleton: false
name: pretty_print
params: (q)
visibility: public
PK
}[H��GG6ri/1.8/system/PP/ObjectMixin/pretty_print_cycle-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: A default pretty printing method for general objects that are detected as part of a cycle.
full_name: PP::ObjectMixin#pretty_print_cycle
is_singleton: false
name: pretty_print_cycle
params: (q)
visibility: public
PK
}[�j��3ri/1.8/system/PP/ObjectMixin/cdesc-ObjectMixin.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: PP::ObjectMixin
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: pretty_print
- !ruby/object:RI::MethodSummary 
  name: pretty_print_cycle
- !ruby/object:RI::MethodSummary 
  name: pretty_print_inspect
- !ruby/object:RI::MethodSummary 
  name: pretty_print_instance_variables
name: ObjectMixin
superclass: 
PK
}[��P�VV8ri/1.8/system/PP/ObjectMixin/pretty_print_inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Is #inspect implementation using #pretty_print. If you implement #pretty_print, it can be used as follows."
- !ruby/struct:SM::Flow::VERB 
  body: "  alias inspect pretty_print_inspect\n"
- !ruby/struct:SM::Flow::P 
  body: "However, doing this requires that every class that #inspect is called on implement #pretty_print, or a RuntimeError will be raised."
full_name: PP::ObjectMixin#pretty_print_inspect
is_singleton: false
name: pretty_print_inspect
params: ()
visibility: public
PK
}[1�Vzz%ri/1.8/system/PP/singleline_pp-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Outputs <tt>obj</tt> to <tt>out</tt> like PP.pp but with no indent and newline.
- !ruby/struct:SM::Flow::P 
  body: PP.singleline_pp returns <tt>out</tt>.
full_name: PP::singleline_pp
is_singleton: true
name: singleline_pp
params: (obj, out=$>)
visibility: public
PK
}[P���1ri/1.8/system/PP/SingleLine/cdesc-SingleLine.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: PP::SingleLine
includes: 
- !ruby/object:RI::IncludedModule 
  name: PPMethods
instance_methods: []

name: SingleLine
superclass: PrettyPrint::SingleLine
PK
}[����ri/1.8/system/PP/pp-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Outputs <tt>obj</tt> to <tt>out</tt> in pretty printed format of <tt>width</tt> columns in width.
- !ruby/struct:SM::Flow::P 
  body: If <tt>out</tt> is omitted, +$&gt;+ is assumed. If <tt>width</tt> is omitted, 79 is assumed.
- !ruby/struct:SM::Flow::P 
  body: PP.pp returns <tt>out</tt>.
full_name: PP::pp
is_singleton: true
name: pp
params: (obj, out=$>, width=79)
visibility: public
PK
}[��ri/1.8/system/PP/cdesc-PP.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Returns the sharing detection flag as a boolean value. It is false by default.
  name: sharing_detection
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: pp
- !ruby/object:RI::MethodSummary 
  name: singleline_pp
comment: 
constants: []

full_name: PP
includes: 
- !ruby/object:RI::IncludedModule 
  name: PPMethods
instance_methods: []

name: PP
superclass: PrettyPrint
PK
}[1�4��/ri/1.8/system/PP/PPMethods/cdesc-PPMethods.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: InspectKey
  value: ":__inspect_key__"
full_name: PP::PPMethods
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: comma_breakable
- !ruby/object:RI::MethodSummary 
  name: guard_inspect_key
- !ruby/object:RI::MethodSummary 
  name: object_address_group
- !ruby/object:RI::MethodSummary 
  name: object_group
- !ruby/object:RI::MethodSummary 
  name: pp
- !ruby/object:RI::MethodSummary 
  name: pp_hash
- !ruby/object:RI::MethodSummary 
  name: pp_object
- !ruby/object:RI::MethodSummary 
  name: seplist
name: PPMethods
superclass: 
PK
}[tƜ���$ri/1.8/system/PP/PPMethods/pp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds <tt>obj</tt> to the pretty printing buffer using Object#pretty_print or Object#pretty_print_cycle.
- !ruby/struct:SM::Flow::P 
  body: Object#pretty_print_cycle is used when <tt>obj</tt> is already printed, a.k.a the object reference chain has a cycle.
full_name: PP::PPMethods#pp
is_singleton: false
name: pp
params: (obj)
visibility: public
PK
}[�w����3ri/1.8/system/PP/PPMethods/guard_inspect_key-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
full_name: PP::PPMethods#guard_inspect_key
is_singleton: false
name: guard_inspect_key
params: () {|| ...}
visibility: public
PK
}[�أ��)ri/1.8/system/PP/PPMethods/pp_hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PP::PPMethods#pp_hash
is_singleton: false
name: pp_hash
params: (obj)
visibility: public
PK
}[j	"��)ri/1.8/system/PP/PPMethods/seplist-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: element
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds a separated list. The list is separated by comma with breakable space, by default.
- !ruby/struct:SM::Flow::P 
  body: "#seplist iterates the <tt>list</tt> using <tt>iter_method</tt>. It yields each object to the block given for #seplist. The procedure <tt>separator_proc</tt> is called between each yields."
- !ruby/struct:SM::Flow::P 
  body: If the iteration is zero times, <tt>separator_proc</tt> is not called at all.
- !ruby/struct:SM::Flow::P 
  body: If <tt>separator_proc</tt> is nil or not given, +lambda { comma_breakable }+ is used. If <tt>iter_method</tt> is not given, :each is used.
- !ruby/struct:SM::Flow::P 
  body: For example, following 3 code fragments has similar effect.
- !ruby/struct:SM::Flow::VERB 
  body: "  q.seplist([1,2,3]) {|v| xxx v }\n\n  q.seplist([1,2,3], lambda { comma_breakable }, :each) {|v| xxx v }\n\n  xxx 1\n  q.comma_breakable\n  xxx 2\n  q.comma_breakable\n  xxx 3\n"
full_name: PP::PPMethods#seplist
is_singleton: false
name: seplist
params: (list, sep=nil, iter_method=:each) {|element| ...}
visibility: public
PK
}[K[��+ri/1.8/system/PP/PPMethods/pp_object-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PP::PPMethods#pp_object
is_singleton: false
name: pp_object
params: (obj)
visibility: public
PK
}[B<�||.ri/1.8/system/PP/PPMethods/object_group-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: "A convenience method which is same as follows:"
- !ruby/struct:SM::Flow::VERB 
  body: "  group(1, '#&lt;' + obj.class.name, '&gt;') { ... }\n"
full_name: PP::PPMethods#object_group
is_singleton: false
name: object_group
params: (obj) {|| ...}
visibility: public
PK
}[�W���6ri/1.8/system/PP/PPMethods/object_address_group-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PP::PPMethods#object_address_group
is_singleton: false
name: object_address_group
params: (obj, &block)
visibility: public
PK
}[H���WW1ri/1.8/system/PP/PPMethods/comma_breakable-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "A convenience method which is same as follows:"
- !ruby/struct:SM::Flow::VERB 
  body: "  text ','\n  breakable\n"
full_name: PP::PPMethods#comma_breakable
is_singleton: false
name: comma_breakable
params: ()
visibility: public
PK
}[�}|nn ri/1.8/system/Foo/cdesc-Foo.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: Foo
includes: 
- !ruby/object:RI::IncludedModule 
  name: DRbUndumped
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: hello
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Foo
superclass: Object
PK
}[�N��ri/1.8/system/Foo/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Foo::new
is_singleton: true
name: new
params: (str)
visibility: public
PK
}[�}���ri/1.8/system/Foo/hello-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Foo#hello
is_singleton: false
name: hello
params: (it)
visibility: public
PK
}[�t����ri/1.8/system/Foo/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Foo#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK
}[�/�44?ri/1.8/system/SingleForwardable/def_singleton_delegators-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: def_delegators
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Shortcut for defining multiple delegator methods, but with no provision for using a different name. The following two code samples have the same effect:"
- !ruby/struct:SM::Flow::VERB 
  body: "  single_forwardable.def_delegators :@records, :size, :&lt;&lt;, :map\n\n  single_forwardable.def_delegator :@records, :size\n  single_forwardable.def_delegator :@records, :&lt;&lt;\n  single_forwardable.def_delegator :@records, :map\n"
- !ruby/struct:SM::Flow::P 
  body: See the example at forwardable.rb.
full_name: SingleForwardable#def_singleton_delegators
is_singleton: false
name: def_singleton_delegators
params: (accessor, *methods)
visibility: public
PK}[���]&&4ri/1.8/system/SingleForwardable/def_delegator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #def_singleton_delegator"
full_name: SingleForwardable#def_delegator
is_singleton: false
name: def_delegator
params: (accessor, method, ali = method)
visibility: public
PK}[	َ)00<ri/1.8/system/SingleForwardable/cdesc-SingleForwardable.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: "The SingleForwardable module provides delegation of specified methods to a designated object, using the methods #def_delegator and #def_delegators. This module is similar to Forwardable, but it works on objects themselves, instead of their defining classes."
- !ruby/struct:SM::Flow::P 
  body: Also see the example at forwardable.rb.
constants: []

full_name: SingleForwardable
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: def_delegator
- !ruby/object:RI::MethodSummary 
  name: def_delegators
- !ruby/object:RI::MethodSummary 
  name: def_singleton_delegator
- !ruby/object:RI::MethodSummary 
  name: def_singleton_delegators
name: SingleForwardable
superclass: 
PK}[�J�5ri/1.8/system/SingleForwardable/def_delegators-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #def_singleton_delegators"
full_name: SingleForwardable#def_delegators
is_singleton: false
name: def_delegators
params: (accessor, *methods)
visibility: public
PK}[}��1]]>ri/1.8/system/SingleForwardable/def_singleton_delegator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: def_delegator
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Defines a method <em>method</em> which delegates to <em>obj</em> (i.e. it calls the method of the same name in <em>obj</em>). If <em>new_name</em> is provided, it is used as the name for the delegate method.
- !ruby/struct:SM::Flow::P 
  body: See the example at forwardable.rb.
full_name: SingleForwardable#def_singleton_delegator
is_singleton: false
name: def_singleton_delegator
params: (accessor, method, ali = method)
visibility: public
PK}[2�:��0ri/1.8/system/SOCKSSocket/cdesc-SOCKSSocket.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Class <tt>Socket</tt> provides access to the underlying operating system socket implementations. It can be used to provide more operating system specific functionality than the protocol-specific socket classes but at the expense of greater complexity. In particular, the class handles addresses using +struct sockaddr+ structures packed into Ruby strings, which can be a joy to manipulate.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Exception Handling
- !ruby/struct:SM::Flow::P 
  body: Ruby's implementation of <tt>Socket</tt> causes an exception to be raised based on the error generated by the system dependent implementation. This is why the methods are documented in a way that isolate Unix-based system exceptions from Windows based exceptions. If more information on particular exception is needed please refer to the Unix manual pages or the Windows WinSock reference.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Documentation by
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Zach Dennis
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Sam Roberts
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <em>Programming Ruby</em> from The Pragmatic Bookshelf.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: Much material in this documentation is taken with permission from <em>Programming Ruby</em> from The Pragmatic Bookshelf.
constants: []

full_name: SOCKSSocket
includes: []

instance_methods: []

name: SOCKSSocket
superclass: Object
PK}[R�㱯�$ri/1.8/system/SOCKSSocket/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SOCKSSocket::new
is_singleton: true
name: new
params: (host, serv)
visibility: public
PK}[���i��ri/1.8/system/File/copy-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Copies a file <tt>from</tt> to <tt>to</tt> using #syscopy. If <tt>to</tt> is a directory, copies <tt>from</tt> to <tt>to/from</tt>. If <tt>verbose</tt> is true, <tt>from -&gt; to</tt> is printed."
full_name: File::copy
is_singleton: true
name: copy
params: (from, to, verbose = false)
visibility: public
PK}[|�Y���ri/1.8/system/File/chown-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Changes the owner and group of the named file(s) to the given numeric owner and group id's. Only a process with superuser privileges may change the owner of a file. The current owner of a file may change the file's group to any group to which the owner belongs. A <tt>nil</tt> or -1 owner or group id is ignored. Returns the number of files processed.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.chown(nil, 100, &quot;testfile&quot;)\n"
full_name: File::chown
is_singleton: true
name: chown
params: |
  File.chown(owner_int, group_int, file_name,... ) -> integer

visibility: public
PK}[��D��� ri/1.8/system/File/delete-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes the named files, returning the number of names passed as arguments. Raises an exception on any error. See also <tt>Dir::rmdir</tt>.
full_name: File::delete
is_singleton: true
name: delete
params: |
  File.delete(file_name, ...)  => integer
  File.unlink(file_name, ...)  => integer

visibility: public
PK}[X��b��ri/1.8/system/File/mtime-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the modification time for the named file as a Time object.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.mtime(&quot;testfile&quot;)   #=&gt; Tue Apr 08 12:58:04 CDT 2003\n"
full_name: File::mtime
is_singleton: true
name: mtime
params: |
  File.mtime(file_name)  =>  time

visibility: public
PK}[l���ri/1.8/system/File/umask-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the current umask value for this process. If the optional argument is given, set the umask to that value and return the previous value. Umask values are <em>subtracted</em> from the default permissions, so a umask of <tt>0222</tt> would make a file read-only for everyone.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.umask(0006)   #=&gt; 18\n   File.umask         #=&gt; 6\n"
full_name: File::umask
is_singleton: true
name: umask
params: |
  File.umask()          => integer
  File.umask(integer)   => integer

visibility: public
PK}[N ���ri/1.8/system/File/ctime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the change time for <em>file</em> (that is, the time directory information about the file was changed, not the file itself).
- !ruby/struct:SM::Flow::VERB 
  body: "   File.new(&quot;testfile&quot;).ctime   #=&gt; Wed Apr 09 08:53:14 CDT 2003\n"
full_name: File#ctime
is_singleton: false
name: ctime
params: |
  file.ctime -> time

visibility: public
PK}[��)��"ri/1.8/system/File/makedirs-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a directory and all its parent directories. For example,
- !ruby/struct:SM::Flow::VERB 
  body: "    File.makedirs '/usr/lib/ruby'\n"
- !ruby/struct:SM::Flow::P 
  body: causes the following directories to be made, if they do not exist.
- !ruby/struct:SM::Flow::VERB 
  body: "    * /usr\n    * /usr/lib\n    * /usr/lib/ruby\n"
- !ruby/struct:SM::Flow::P 
  body: You can pass several directories, each as a parameter. If the last parameter isn't a String, verbose mode will be enabled.
full_name: File::makedirs
is_singleton: true
name: makedirs
params: (*dirs)
visibility: public
PK}[l6��77!ri/1.8/system/File/file%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file exists and is a regular file.
full_name: File::file?
is_singleton: true
name: file?
params: |
  File.file?(file_name)   => true or false

visibility: public
PK}[yTee*ri/1.8/system/File/readable_real%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is readable by the real user id of this process.
full_name: File::readable_real?
is_singleton: true
name: readable_real?
params: |
  File.readable_real?(file_name)   => true or false

visibility: public
PK}[Ӹ�OOri/1.8/system/File/flock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Locks or unlocks a file according to <em>locking_constant</em> (a logical <em>or</em> of the values in the table below). Returns <tt>false</tt> if <tt>File::LOCK_NB</tt> is specified and the operation would otherwise have blocked. Not available on all platforms.
- !ruby/struct:SM::Flow::P 
  body: "Locking constants (in class File):"
- !ruby/struct:SM::Flow::VERB 
  body: "   LOCK_EX   | Exclusive lock. Only one process may hold an\n             | exclusive lock for a given file at a time.\n   ----------+------------------------------------------------\n   LOCK_NB   | Don't block when locking. May be combined\n             | with other lock options using logical or.\n   ----------+------------------------------------------------\n   LOCK_SH   | Shared lock. Multiple processes may each hold a\n             | shared lock for a given file at the same time.\n   ----------+------------------------------------------------\n   LOCK_UN   | Unlock.\n"
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "   File.new(&quot;testfile&quot;).flock(File::LOCK_UN)   #=&gt; 0\n"
full_name: File#flock
is_singleton: false
name: flock
params: |
  file.flock (locking_constant ) =>  0 or false

visibility: public
PK}[���R��!ri/1.8/system/File/fnmatch-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns true if <em>path</em> matches against <em>pattern</em> The pattern is not a regular expression; instead it follows rules similar to shell filename globbing. It may contain the following metacharacters:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "<code>*</code>:"
    body: Matches any file. Can be restricted by other values in the glob. <tt>*</tt> will match all files; <tt>c*</tt> will match all files beginning with <tt>c</tt>; <tt>*c</tt> will match all files ending with <tt>c</tt>; and <b><tt>c</tt></b> will match all files that have <tt>c</tt> in them (including at the beginning or end). Equivalent to <tt>/ .* /x</tt> in regexp.
  - !ruby/struct:SM::Flow::LI 
    label: "<code>**</code>:"
    body: Matches directories recursively or files expansively.
  - !ruby/struct:SM::Flow::LI 
    label: "<code>?</code>:"
    body: Matches any one character. Equivalent to <tt>/.{1}/</tt> in regexp.
  - !ruby/struct:SM::Flow::LI 
    label: "<code>[set]</code>:"
    body: Matches any one character in <tt>set</tt>. Behaves exactly like character sets in Regexp, including set negation (<tt>[^a-z]</tt>).
  - !ruby/struct:SM::Flow::LI 
    label: "<code>\\</code>:"
    body: Escapes the next metacharacter.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: <em>flags</em> is a bitwise OR of the <tt>FNM_xxx</tt> parameters. The same glob pattern and flags are used by <tt>Dir::glob</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.fnmatch('cat',       'cat')        #=&gt; true  : match entire string\n   File.fnmatch('cat',       'category')   #=&gt; false : only match partial string\n   File.fnmatch('c{at,ub}s', 'cats')       #=&gt; false : { } isn't supported\n\n   File.fnmatch('c?t',     'cat')          #=&gt; true  : '?' match only 1 character\n   File.fnmatch('c??t',    'cat')          #=&gt; false : ditto\n   File.fnmatch('c*',      'cats')         #=&gt; true  : '*' match 0 or more characters\n   File.fnmatch('c*t',     'c/a/b/t')      #=&gt; true  : ditto\n   File.fnmatch('ca[a-z]', 'cat')          #=&gt; true  : inclusive bracket expression\n   File.fnmatch('ca[^t]',  'cat')          #=&gt; false : exclusive bracket expression ('^' or '!')\n\n   File.fnmatch('cat', 'CAT')                     #=&gt; false : case sensitive\n   File.fnmatch('cat', 'CAT', File::FNM_CASEFOLD) #=&gt; true  : case insensitive\n\n   File.fnmatch('?',   '/', File::FNM_PATHNAME)  #=&gt; false : wildcard doesn't match '/' on FNM_PATHNAME\n   File.fnmatch('*',   '/', File::FNM_PATHNAME)  #=&gt; false : ditto\n   File.fnmatch('[/]', '/', File::FNM_PATHNAME)  #=&gt; false : ditto\n\n   File.fnmatch('\\?',   '?')                       #=&gt; true  : escaped wildcard becomes ordinary\n   File.fnmatch('\\a',   'a')                       #=&gt; true  : escaped ordinary remains ordinary\n   File.fnmatch('\\a',   '\\a', File::FNM_NOESCAPE)  #=&gt; true  : FNM_NOESACPE makes '\\' ordinary\n   File.fnmatch('[\\?]', '?')                       #=&gt; true  : can escape inside bracket expression\n\n   File.fnmatch('*',   '.profile')                      #=&gt; false : wildcard doesn't match leading\n   File.fnmatch('*',   '.profile', File::FNM_DOTMATCH)  #=&gt; true    period by default.\n   File.fnmatch('.*',  '.profile')                      #=&gt; true\n\n   rbfiles = '**' '/' '*.rb' # you don't have to do like this. just write in single string.\n   File.fnmatch(rbfiles, 'main.rb')                    #=&gt; false\n   File.fnmatch(rbfiles, './main.rb')                  #=&gt; false\n   File.fnmatch(rbfiles, 'lib/song.rb')                #=&gt; true\n   File.fnmatch('**.rb', 'main.rb')                    #=&gt; true\n   File.fnmatch('**.rb', './main.rb')                  #=&gt; false\n   File.fnmatch('**.rb', 'lib/song.rb')                #=&gt; true\n   File.fnmatch('*',           'dave/.profile')                      #=&gt; true\n\n   pattern = '*' '/' '*'\n   File.fnmatch(pattern, 'dave/.profile', File::FNM_PATHNAME)  #=&gt; false\n   File.fnmatch(pattern, 'dave/.profile', File::FNM_PATHNAME | File::FNM_DOTMATCH) #=&gt; true\n\n   pattern = '**' '/' 'foo'\n   File.fnmatch(pattern, 'a/b/c/foo', File::FNM_PATHNAME)     #=&gt; true\n   File.fnmatch(pattern, '/a/b/c/foo', File::FNM_PATHNAME)    #=&gt; true\n   File.fnmatch(pattern, 'c:/a/b/c/foo', File::FNM_PATHNAME)  #=&gt; true\n   File.fnmatch(pattern, 'a/.b/c/foo', File::FNM_PATHNAME)    #=&gt; false\n   File.fnmatch(pattern, 'a/.b/c/foo', File::FNM_PATHNAME | File::FNM_DOTMATCH) #=&gt; true\n"
full_name: File::fnmatch
is_singleton: true
name: fnmatch
params: |
  File.fnmatch( pattern, path, [flags] ) => (true or false)
  File.fnmatch?( pattern, path, [flags] ) => (true or false)

visibility: public
PK}[J�����ri/1.8/system/File/ctime-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the change time for the named file (the time at which directory information about the file was changed, not the file itself).
- !ruby/struct:SM::Flow::VERB 
  body: "   File.ctime(&quot;testfile&quot;)   #=&gt; Wed Apr 09 08:53:13 CDT 2003\n"
full_name: File::ctime
is_singleton: true
name: ctime
params: |
  File.ctime(file_name)  => time

visibility: public
PK}[i��xxri/1.8/system/File/chmod-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: o_chmod
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Changes permission bits on <em>file</em> to the bit pattern represented by <em>mode_int</em>. Actual effects are platform dependent; on Unix systems, see <tt>chmod(2)</tt> for details. Follows symbolic links. Also see <tt>File#lchmod</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;out&quot;, &quot;w&quot;);\n   f.chmod(0644)   #=&gt; 0\n"
full_name: File#chmod
is_singleton: false
name: chmod
params: |
  file.chmod(mode_int)   => 0

visibility: public
PK}[(��-�� ri/1.8/system/File/lchown-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>File::chown</tt>, but does not follow symbolic links (so it will change the owner associated with the link, not the file referenced by the link). Often not available. Returns number of files in the argument list.
full_name: File::lchown
is_singleton: true
name: lchown
params: |
  file.lchown(owner_int, group_int, file_name,..) => integer

visibility: public
PK}[�L�%%!ri/1.8/system/File/pipe%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is a pipe.
full_name: File::pipe?
is_singleton: true
name: pipe?
params: |
  File.pipe?(file_name)   =>  true or false

visibility: public
PK}[�z|�88#ri/1.8/system/File/setgid%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file has the setgid bit set.
full_name: File::setgid?
is_singleton: true
name: setgid?
params: |
  File.setgid?(file_name)   =>  true or false

visibility: public
PK}[@�I�99%ri/1.8/system/File/blockdev%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is a block device.
full_name: File::blockdev?
is_singleton: true
name: blockdev?
params: |
  File.blockdev?(file_name)   =>  true or false

visibility: public
PK}[i����� ri/1.8/system/File/lchmod-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>File::chmod</tt>, but does not follow symbolic links (so it will change the permissions associated with the link, not the file referenced by the link). Often not available.
full_name: File::lchmod
is_singleton: true
name: lchmod
params: |
  File.lchmod(mode_int, file_name, ...)  => integer

visibility: public
PK}[�"���"ri/1.8/system/File/cdesc-File.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: atime
- !ruby/object:RI::MethodSummary 
  name: basename
- !ruby/object:RI::MethodSummary 
  name: blockdev?
- !ruby/object:RI::MethodSummary 
  name: catname
- !ruby/object:RI::MethodSummary 
  name: chardev?
- !ruby/object:RI::MethodSummary 
  name: chmod
- !ruby/object:RI::MethodSummary 
  name: chmod
- !ruby/object:RI::MethodSummary 
  name: chown
- !ruby/object:RI::MethodSummary 
  name: compare
- !ruby/object:RI::MethodSummary 
  name: copy
- !ruby/object:RI::MethodSummary 
  name: ctime
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: directory?
- !ruby/object:RI::MethodSummary 
  name: dirname
- !ruby/object:RI::MethodSummary 
  name: executable?
- !ruby/object:RI::MethodSummary 
  name: executable_real?
- !ruby/object:RI::MethodSummary 
  name: exist?
- !ruby/object:RI::MethodSummary 
  name: exists?
- !ruby/object:RI::MethodSummary 
  name: expand_path
- !ruby/object:RI::MethodSummary 
  name: extname
- !ruby/object:RI::MethodSummary 
  name: file?
- !ruby/object:RI::MethodSummary 
  name: fnmatch
- !ruby/object:RI::MethodSummary 
  name: fnmatch?
- !ruby/object:RI::MethodSummary 
  name: ftype
- !ruby/object:RI::MethodSummary 
  name: grpowned?
- !ruby/object:RI::MethodSummary 
  name: identical?
- !ruby/object:RI::MethodSummary 
  name: install
- !ruby/object:RI::MethodSummary 
  name: join
- !ruby/object:RI::MethodSummary 
  name: lchmod
- !ruby/object:RI::MethodSummary 
  name: lchown
- !ruby/object:RI::MethodSummary 
  name: link
- !ruby/object:RI::MethodSummary 
  name: lstat
- !ruby/object:RI::MethodSummary 
  name: makedirs
- !ruby/object:RI::MethodSummary 
  name: move
- !ruby/object:RI::MethodSummary 
  name: mtime
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: owned?
- !ruby/object:RI::MethodSummary 
  name: pipe?
- !ruby/object:RI::MethodSummary 
  name: readable?
- !ruby/object:RI::MethodSummary 
  name: readable_real?
- !ruby/object:RI::MethodSummary 
  name: readlink
- !ruby/object:RI::MethodSummary 
  name: rename
- !ruby/object:RI::MethodSummary 
  name: safe_unlink
- !ruby/object:RI::MethodSummary 
  name: setgid?
- !ruby/object:RI::MethodSummary 
  name: setuid?
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: size?
- !ruby/object:RI::MethodSummary 
  name: socket?
- !ruby/object:RI::MethodSummary 
  name: split
- !ruby/object:RI::MethodSummary 
  name: stat
- !ruby/object:RI::MethodSummary 
  name: sticky?
- !ruby/object:RI::MethodSummary 
  name: symlink
- !ruby/object:RI::MethodSummary 
  name: symlink?
- !ruby/object:RI::MethodSummary 
  name: syscopy
- !ruby/object:RI::MethodSummary 
  name: truncate
- !ruby/object:RI::MethodSummary 
  name: umask
- !ruby/object:RI::MethodSummary 
  name: unlink
- !ruby/object:RI::MethodSummary 
  name: utime
- !ruby/object:RI::MethodSummary 
  name: writable?
- !ruby/object:RI::MethodSummary 
  name: writable_real?
- !ruby/object:RI::MethodSummary 
  name: zero?
comment: 
- !ruby/struct:SM::Flow::H 
  level: 1
  text: "ftools.rb: Extra tools for the File class"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "Author:"
    body: WATANABE, Hirofumi
  - !ruby/struct:SM::Flow::LI 
    label: "Documentation:"
    body: Zachary Landau
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: This library can be distributed under the terms of the Ruby license. You can freely distribute/modify this library.
- !ruby/struct:SM::Flow::P 
  body: It is included in the Ruby standard library.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: ftools adds several (class, not instance) methods to the File class, for copying, moving, deleting, installing, and comparing files, as well as creating a directory path. See the File class for details.
- !ruby/struct:SM::Flow::P 
  body: FileUtils contains all or nearly all the same functionality and more, and is a recommended option over ftools
- !ruby/struct:SM::Flow::P 
  body: When you
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'ftools'\n"
- !ruby/struct:SM::Flow::P 
  body: then the File class aquires some utility methods for copying, moving, and deleting files, and more.
- !ruby/struct:SM::Flow::P 
  body: See the method descriptions below, and consider using FileUtils as it is more comprehensive.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Separator
  value: separator
- !ruby/object:RI::Constant 
  comment: 
  name: SEPARATOR
  value: separator
- !ruby/object:RI::Constant 
  comment: 
  name: ALT_SEPARATOR
  value: rb_obj_freeze(rb_str_new2("\\"))
- !ruby/object:RI::Constant 
  comment: 
  name: ALT_SEPARATOR
  value: Qnil
- !ruby/object:RI::Constant 
  comment: 
  name: PATH_SEPARATOR
  value: rb_obj_freeze(rb_str_new2(PATH_SEP))
- !ruby/object:RI::Constant 
  comment: 
  name: BUFSIZE
  value: 8 * 1024
full_name: File
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: atime
- !ruby/object:RI::MethodSummary 
  name: chmod
- !ruby/object:RI::MethodSummary 
  name: chown
- !ruby/object:RI::MethodSummary 
  name: ctime
- !ruby/object:RI::MethodSummary 
  name: flock
- !ruby/object:RI::MethodSummary 
  name: lstat
- !ruby/object:RI::MethodSummary 
  name: mtime
- !ruby/object:RI::MethodSummary 
  name: o_chmod
- !ruby/object:RI::MethodSummary 
  name: path
- !ruby/object:RI::MethodSummary 
  name: truncate
name: File
superclass: IO
PK}[
0|:��ri/1.8/system/File/ftype-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Identifies the type of the named file; the return string is one of ``<tt>file</tt>'', ``<tt>directory</tt>'', ``<tt>characterSpecial</tt>'', ``<tt>blockSpecial</tt>'', ``<tt>fifo</tt>'', ``<tt>link</tt>'', ``<tt>socket</tt>'', or ``<tt>unknown</tt>''.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.ftype(&quot;testfile&quot;)            #=&gt; &quot;file&quot;\n   File.ftype(&quot;/dev/tty&quot;)            #=&gt; &quot;characterSpecial&quot;\n   File.ftype(&quot;/tmp/.X11-unix/X0&quot;)   #=&gt; &quot;socket&quot;\n"
full_name: File::ftype
is_singleton: true
name: ftype
params: |
  File.ftype(file_name)   => string

visibility: public
PK}[��tק�ri/1.8/system/File/move-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Moves a file <tt>from</tt> to <tt>to</tt> using #syscopy. If <tt>to</tt> is a directory, copies from <tt>from</tt> to <tt>to/from</tt>. If <tt>verbose</tt> is true, <tt>from -&gt; to</tt> is printed."
full_name: File::move
is_singleton: true
name: move
params: (from, to, verbose = false)
visibility: public
PK}[0�錏�ri/1.8/system/File/lstat-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Same as <tt>IO#stat</tt>, but does not follow the last symbolic link. Instead, reports on the link itself.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.symlink(&quot;testfile&quot;, &quot;link2test&quot;)   #=&gt; 0\n   File.stat(&quot;testfile&quot;).size              #=&gt; 66\n   f = File.new(&quot;link2test&quot;)\n   f.lstat.size                            #=&gt; 8\n   f.stat.size                             #=&gt; 66\n"
full_name: File#lstat
is_singleton: false
name: lstat
params: |
  file.lstat   =>  stat

visibility: public
PK}[It���%ri/1.8/system/File/expand_path-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts a pathname to an absolute pathname. Relative paths are referenced from the current working directory of the process unless <em>dir_string</em> is given, in which case it will be used as the starting point. The given pathname may start with a ``<tt>~</tt>'', which expands to the process owner's home directory (the environment variable <tt>HOME</tt> must be set correctly). ``<tt>~</tt><em>user</em>'' expands to the named user's home directory.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.expand_path(&quot;~oracle/bin&quot;)           #=&gt; &quot;/home/oracle/bin&quot;\n   File.expand_path(&quot;../../bin&quot;, &quot;/tmp/x&quot;)   #=&gt; &quot;/bin&quot;\n"
full_name: File::expand_path
is_singleton: true
name: expand_path
params: |
  File.expand_path(file_name [, dir_string] ) -> abs_file_name

visibility: public
PK}[�����ri/1.8/system/File/lstat-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Same as <tt>File::stat</tt>, but does not follow the last symbolic link. Instead, reports on the link itself.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.symlink(&quot;testfile&quot;, &quot;link2test&quot;)   #=&gt; 0\n   File.stat(&quot;testfile&quot;).size              #=&gt; 66\n   File.lstat(&quot;link2test&quot;).size            #=&gt; 8\n   File.stat(&quot;link2test&quot;).size             #=&gt; 66\n"
full_name: File::lstat
is_singleton: true
name: lstat
params: |
  File.lstat(file_name)   => stat

visibility: public
PK}['��ari/1.8/system/File/path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the pathname used to create <em>file</em> as a string. Does not normalize the name.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.new(&quot;testfile&quot;).path               #=&gt; &quot;testfile&quot;\n   File.new(&quot;/tmp/../tmp/xxx&quot;, &quot;w&quot;).path   #=&gt; &quot;/tmp/../tmp/xxx&quot;\n"
full_name: File#path
is_singleton: false
name: path
params: |
  file.path -> filename

visibility: public
PK}[k��]��ri/1.8/system/File/stat-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a <tt>File::Stat</tt> object for the named file (see <tt>File::Stat</tt>).
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).mtime   #=&gt; Tue Apr 08 12:58:04 CDT 2003\n"
full_name: File::stat
is_singleton: true
name: stat
params: |
  File.stat(file_name)   =>  stat

visibility: public
PK}[�}'�� ri/1.8/system/File/rename-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Renames the given file to the new name. Raises a <tt>SystemCallError</tt> if the file cannot be renamed.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.rename(&quot;afile&quot;, &quot;afile.bak&quot;)   #=&gt; 0\n"
full_name: File::rename
is_singleton: true
name: rename
params: |
  File.rename(old_name, new_name)   => 0

visibility: public
PK}[���Maa"ri/1.8/system/File/exist%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return <tt>true</tt> if the named file exists.
full_name: File::exist?
is_singleton: true
name: exist?
params: |
  File.exist?(file_name)    =>  true or false
  File.exists?(file_name)   =>  true or false    (obsolete)

visibility: public
PK}[������ri/1.8/system/File/join-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new string formed by joining the strings using <tt>File::SEPARATOR</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.join(&quot;usr&quot;, &quot;mail&quot;, &quot;gumby&quot;)   #=&gt; &quot;usr/mail/gumby&quot;\n"
full_name: File::join
is_singleton: true
name: join
params: |
  File.join(string, ...) -> path

visibility: public
PK}[�T�R!ri/1.8/system/File/symlink-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a symbolic link called <em>new_name</em> for the existing file <em>old_name</em>. Raises a <tt>NotImplemented</tt> exception on platforms that do not support symbolic links.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.symlink(&quot;testfile&quot;, &quot;link2test&quot;)   #=&gt; 0\n"
full_name: File::symlink
is_singleton: true
name: symlink
params: |
  File.symlink(old_name, new_name)   => 0

visibility: public
PK}[w�Kd��ri/1.8/system/File/atime-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the last access time for the named file as a Time object).
- !ruby/struct:SM::Flow::VERB 
  body: "   File.atime(&quot;testfile&quot;)   #=&gt; Wed Apr 09 08:51:48 CDT 2003\n"
full_name: File::atime
is_singleton: true
name: atime
params: |
  File.atime(file_name)  =>  time

visibility: public
PK}[�B���%ri/1.8/system/File/grpowned%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file exists and the effective group id of the calling process is the owner of the file. Returns <tt>false</tt> on Windows.
full_name: File::grpowned?
is_singleton: true
name: grpowned?
params: |
  File.grpowned?(file_name)   => true or false

visibility: public
PK}[�\auu!ri/1.8/system/File/extname-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the extension (the portion of file name in <em>path</em> after the period).
- !ruby/struct:SM::Flow::VERB 
  body: "   File.extname(&quot;test.rb&quot;)         #=&gt; &quot;.rb&quot;\n   File.extname(&quot;a/b/d/test.rb&quot;)   #=&gt; &quot;.rb&quot;\n   File.extname(&quot;test&quot;)            #=&gt; &quot;&quot;\n   File.extname(&quot;.profile&quot;)        #=&gt; &quot;&quot;\n"
full_name: File::extname
is_singleton: true
name: extname
params: |
  File.extname(path) -> string

visibility: public
PK}[�Qcc#ri/1.8/system/File/exists%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return <tt>true</tt> if the named file exists.
full_name: File::exists?
is_singleton: true
name: exists?
params: |
  File.exist?(file_name)    =>  true or false
  File.exists?(file_name)   =>  true or false    (obsolete)

visibility: public
PK}[Ў�55!ri/1.8/system/File/zero%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file exists and has a zero size.
full_name: File::zero?
is_singleton: true
name: zero?
params: |
  File.zero?(file_name)   => true or false

visibility: public
PK}[A�[[%ri/1.8/system/File/writable%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is writable by the effective user id of this process.
full_name: File::writable?
is_singleton: true
name: writable?
params: |
  File.writable?(file_name)   => true or false

visibility: public
PK}[��#ri/1.8/system/File/size-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the size of <tt>file_name</tt>.
full_name: File::size
is_singleton: true
name: size
params: |
  File.size(file_name)   => integer

visibility: public
PK}[��!!ri/1.8/system/File/split-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Splits the given string into a directory and a file component and returns them in a two-element array. See also <tt>File::dirname</tt> and <tt>File::basename</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.split(&quot;/home/gumby/.profile&quot;)   #=&gt; [&quot;/home/gumby&quot;, &quot;.profile&quot;]\n"
full_name: File::split
is_singleton: true
name: split
params: |
  File.split(file_name)   => array

visibility: public
PK}[q7��::$ri/1.8/system/File/chardev%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is a character device.
full_name: File::chardev?
is_singleton: true
name: chardev?
params: |
  File.chardev?(file_name)   =>  true or false

visibility: public
PK}[��nn#ri/1.8/system/File/Stat/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the size of <em>stat</em> in bytes.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).size   #=&gt; 66\n"
full_name: File::Stat#size
is_singleton: false
name: size
params: |
  stat.size    => fixnum

visibility: public
PK}[�����$ri/1.8/system/File/Stat/ctime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the change time for <em>stat</em> (that is, the time directory information about the file was changed, not the file itself).
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).ctime   #=&gt; Wed Apr 09 08:53:14 CDT 2003\n"
full_name: File::Stat#ctime
is_singleton: false
name: ctime
params: |
  stat.ctime -> aTime

visibility: public
PK}[�HH'ri/1.8/system/File/Stat/cdesc-Stat.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Objects of class <tt>File::Stat</tt> encapsulate common status information for <tt>File</tt> objects. The information is recorded at the moment the <tt>File::Stat</tt> object is created; changes made to the file after that point will not be reflected. <tt>File::Stat</tt> objects are returned by <tt>IO#stat</tt>, <tt>File::stat</tt>, <tt>File#lstat</tt>, and <tt>File::lstat</tt>. Many of these methods return platform-specific values, and not all values are meaningful on all systems. See also <tt>Kernel#test</tt>.
constants: []

full_name: File::Stat
includes: 
- !ruby/object:RI::IncludedModule 
  name: Comparable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: atime
- !ruby/object:RI::MethodSummary 
  name: blksize
- !ruby/object:RI::MethodSummary 
  name: blockdev?
- !ruby/object:RI::MethodSummary 
  name: blocks
- !ruby/object:RI::MethodSummary 
  name: chardev?
- !ruby/object:RI::MethodSummary 
  name: ctime
- !ruby/object:RI::MethodSummary 
  name: dev
- !ruby/object:RI::MethodSummary 
  name: dev_major
- !ruby/object:RI::MethodSummary 
  name: dev_minor
- !ruby/object:RI::MethodSummary 
  name: directory?
- !ruby/object:RI::MethodSummary 
  name: executable?
- !ruby/object:RI::MethodSummary 
  name: executable_real?
- !ruby/object:RI::MethodSummary 
  name: file?
- !ruby/object:RI::MethodSummary 
  name: ftype
- !ruby/object:RI::MethodSummary 
  name: gid
- !ruby/object:RI::MethodSummary 
  name: grpowned?
- !ruby/object:RI::MethodSummary 
  name: ino
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: mode
- !ruby/object:RI::MethodSummary 
  name: mtime
- !ruby/object:RI::MethodSummary 
  name: nlink
- !ruby/object:RI::MethodSummary 
  name: owned?
- !ruby/object:RI::MethodSummary 
  name: pipe?
- !ruby/object:RI::MethodSummary 
  name: pretty_print
- !ruby/object:RI::MethodSummary 
  name: rdev
- !ruby/object:RI::MethodSummary 
  name: rdev_major
- !ruby/object:RI::MethodSummary 
  name: rdev_minor
- !ruby/object:RI::MethodSummary 
  name: readable?
- !ruby/object:RI::MethodSummary 
  name: readable_real?
- !ruby/object:RI::MethodSummary 
  name: setgid?
- !ruby/object:RI::MethodSummary 
  name: setuid?
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: size?
- !ruby/object:RI::MethodSummary 
  name: socket?
- !ruby/object:RI::MethodSummary 
  name: sticky?
- !ruby/object:RI::MethodSummary 
  name: symlink?
- !ruby/object:RI::MethodSummary 
  name: uid
- !ruby/object:RI::MethodSummary 
  name: writable?
- !ruby/object:RI::MethodSummary 
  name: writable_real?
- !ruby/object:RI::MethodSummary 
  name: zero?
name: Stat
superclass: Object
PK}[O��4��(ri/1.8/system/File/Stat/socket%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>stat</em> is a socket, <tt>false</tt> if it isn't or if the operating system doesn't support this feature.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).socket?   #=&gt; false\n"
full_name: File::Stat#socket?
is_singleton: false
name: socket?
params: |
  stat.socket?    => true or false

visibility: public
PK}[Z���*ri/1.8/system/File/Stat/readable%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>stat</em> is readable by the effective user id of this process.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).readable?   #=&gt; true\n"
full_name: File::Stat#readable?
is_singleton: false
name: readable?
params: |
  stat.readable?    => true or false

visibility: public
PK}[d|h�		$ri/1.8/system/File/Stat/nlink-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of hard links to <em>stat</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).nlink             #=&gt; 1\n   File.link(&quot;testfile&quot;, &quot;testfile.bak&quot;)   #=&gt; 0\n   File.stat(&quot;testfile&quot;).nlink             #=&gt; 2\n"
full_name: File::Stat#nlink
is_singleton: false
name: nlink
params: |
  stat.nlink   => fixnum

visibility: public
PK}[�s���)ri/1.8/system/File/Stat/chardev%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the file is a character device, <tt>false</tt> if it isn't or if the operating system doesn't support this feature.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;/dev/tty&quot;).chardev?   #=&gt; true\n"
full_name: File::Stat#chardev?
is_singleton: false
name: chardev?
params: |
  stat.chardev?    => true or false

visibility: public
PK}[�!@��(ri/1.8/system/File/Stat/dev_minor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the minor part of <tt>File_Stat#dev</tt> or <tt>nil</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;/dev/fd1&quot;).dev_minor   #=&gt; 1\n   File.stat(&quot;/dev/tty&quot;).dev_minor   #=&gt; 0\n"
full_name: File::Stat#dev_minor
is_singleton: false
name: dev_minor
params: |
  stat.dev_minor   => fixnum

visibility: public
PK}[���(ri/1.8/system/File/Stat/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compares <tt>File::Stat</tt> objects by comparing their respective modification times.
- !ruby/struct:SM::Flow::VERB 
  body: "   f1 = File.new(&quot;f1&quot;, &quot;w&quot;)\n   sleep 1\n   f2 = File.new(&quot;f2&quot;, &quot;w&quot;)\n   f1.stat &lt;=&gt; f2.stat   #=&gt; -1\n"
full_name: File::Stat#<=>
is_singleton: false
name: <=>
params: |
  stat <=> other_stat    => -1, 0, 1

visibility: public
PK}[�v���(ri/1.8/system/File/Stat/dev_major-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the major part of <tt>File_Stat#dev</tt> or <tt>nil</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;/dev/fd1&quot;).dev_major   #=&gt; 2\n   File.stat(&quot;/dev/tty&quot;).dev_major   #=&gt; 5\n"
full_name: File::Stat#dev_major
is_singleton: false
name: dev_major
params: |
  stat.dev_major   => fixnum

visibility: public
PK}[(:�|��)ri/1.8/system/File/Stat/rdev_major-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the major part of <tt>File_Stat#rdev</tt> or <tt>nil</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;/dev/fd1&quot;).rdev_major   #=&gt; 2\n   File.stat(&quot;/dev/tty&quot;).rdev_major   #=&gt; 5\n"
full_name: File::Stat#rdev_major
is_singleton: false
name: rdev_major
params: |
  stat.rdev_major   => fixnum

visibility: public
PK}[
�
MM#ri/1.8/system/File/Stat/mode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an integer representing the permission bits of <em>stat</em>. The meaning of the bits is platform dependent; on Unix systems, see <tt>stat(2)</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.chmod(0644, &quot;testfile&quot;)   #=&gt; 1\n   s = File.stat(&quot;testfile&quot;)\n   sprintf(&quot;%o&quot;, s.mode)          #=&gt; &quot;100644&quot;\n"
full_name: File::Stat#mode
is_singleton: false
name: mode
params: |
  stat.mode   => fixnum

visibility: public
PK}[�G��)ri/1.8/system/File/Stat/rdev_minor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the minor part of <tt>File_Stat#rdev</tt> or <tt>nil</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;/dev/fd1&quot;).rdev_minor   #=&gt; 1\n   File.stat(&quot;/dev/tty&quot;).rdev_minor   #=&gt; 0\n"
full_name: File::Stat#rdev_minor
is_singleton: false
name: rdev_minor
params: |
  stat.rdev_minor   => fixnum

visibility: public
PK}[2�f���*ri/1.8/system/File/Stat/writable%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>stat</em> is writable by the effective user id of this process.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).writable?   #=&gt; true\n"
full_name: File::Stat#writable?
is_singleton: false
name: writable?
params: |
  stat.writable? -> true or false

visibility: public
PK}[įu�[[1ri/1.8/system/File/Stat/executable_real%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Same as <tt>executable?</tt>, but tests using the real owner of the process.
full_name: File::Stat#executable_real?
is_singleton: false
name: executable_real?
params: |
  stat.executable_real?    => true or false

visibility: public
PK}[[���"ri/1.8/system/File/Stat/dev-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an integer representing the device on which <em>stat</em> resides.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).dev   #=&gt; 774\n"
full_name: File::Stat#dev
is_singleton: false
name: dev
params: |
  stat.dev    => fixnum

visibility: public
PK}[��B�zz"ri/1.8/system/File/Stat/gid-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the numeric group id of the owner of <em>stat</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).gid   #=&gt; 500\n"
full_name: File::Stat#gid
is_singleton: false
name: gid
params: |
  stat.gid   => fixnum

visibility: public
PK}[1�9���&ri/1.8/system/File/Stat/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Produce a nicely formatted description of <em>stat</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "  File.stat(&quot;/etc/passwd&quot;).inspect\n     #=&gt; &quot;#&lt;File::Stat dev=0xe000005, ino=1078078, mode=0100644,\n          nlink=1, uid=0, gid=0, rdev=0x0, size=1374, blksize=4096,\n          blocks=8, atime=Wed Dec 10 10:16:12 CST 2003,\n          mtime=Fri Sep 12 15:41:41 CDT 2003,\n          ctime=Mon Oct 27 11:20:27 CST 2003&gt;&quot;\n"
full_name: File::Stat#inspect
is_singleton: false
name: inspect
params: |
  stat.inspect  =>  string

visibility: public
PK}[t����"ri/1.8/system/File/Stat/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::VERB 
  body: "  File::Stat.new(file_name)  =&gt; stat\n"
- !ruby/struct:SM::Flow::P 
  body: Create a File::Stat object for the given file name (raising an exception if the file doesn't exist).
full_name: File::Stat::new
is_singleton: true
name: new
params: |
  

visibility: public
PK}[U�lj��+ri/1.8/system/File/Stat/pretty_print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: File::Stat#pretty_print
is_singleton: false
name: pretty_print
params: (q)
visibility: public
PK}[@��(,,*ri/1.8/system/File/Stat/grpowned%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the effective group id of the process is the same as the group id of <em>stat</em>. On Windows NT, returns <tt>false</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).grpowned?      #=&gt; true\n   File.stat(&quot;/etc/passwd&quot;).grpowned?   #=&gt; false\n"
full_name: File::Stat#grpowned?
is_singleton: false
name: grpowned?
params: |
  stat.grpowned?   => true or false

visibility: public
PK}[�y�nn"ri/1.8/system/File/Stat/ino-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the inode number for <em>stat</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).ino   #=&gt; 1083669\n"
full_name: File::Stat#ino
is_singleton: false
name: ino
params: |
  stat.ino   => fixnum

visibility: public
PK}[��z��$ri/1.8/system/File/Stat/mtime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the modification time of <em>stat</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).mtime   #=&gt; Wed Apr 09 08:53:14 CDT 2003\n"
full_name: File::Stat#mtime
is_singleton: false
name: mtime
params: |
  stat.mtime -> aTime

visibility: public
PK}[�����&ri/1.8/system/File/Stat/blksize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the native file system's block size. Will return <tt>nil</tt> on platforms that don't support this information.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).blksize   #=&gt; 4096\n"
full_name: File::Stat#blksize
is_singleton: false
name: blksize
params: |
  stat.blksize   => integer or nil

visibility: public
PK}[}_T��&ri/1.8/system/File/Stat/zero%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>stat</em> is a zero-length file; <tt>false</tt> otherwise.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).zero?   #=&gt; false\n"
full_name: File::Stat#zero?
is_singleton: false
name: zero?
params: |
  stat.zero?    => true or false

visibility: public
PK}[�����(ri/1.8/system/File/Stat/sticky%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>stat</em> has its sticky bit set, <tt>false</tt> if it doesn't or if the operating system doesn't support this feature.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).sticky?   #=&gt; false\n"
full_name: File::Stat#sticky?
is_singleton: false
name: sticky?
params: |
  stat.sticky?    => true or false

visibility: public
PK}[{����%ri/1.8/system/File/Stat/blocks-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of native file system blocks allocated for this file, or <tt>nil</tt> if the operating system doesn't support this feature.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).blocks   #=&gt; 2\n"
full_name: File::Stat#blocks
is_singleton: false
name: blocks
params: |
  stat.blocks    => integer or nil

visibility: public
PK}[�t��#ri/1.8/system/File/Stat/rdev-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an integer representing the device type on which <em>stat</em> resides. Returns <tt>nil</tt> if the operating system doesn't support this feature.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;/dev/fd1&quot;).rdev   #=&gt; 513\n   File.stat(&quot;/dev/tty&quot;).rdev   #=&gt; 1280\n"
full_name: File::Stat#rdev
is_singleton: false
name: rdev
params: |
  stat.rdev   =>  fixnum or nil

visibility: public
PK}[U��1��/ri/1.8/system/File/Stat/readable_real%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>stat</em> is readable by the real user id of this process.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).readable_real?   #=&gt; true\n"
full_name: File::Stat#readable_real?
is_singleton: false
name: readable_real?
params: |
  stat.readable_real? -> true or false

visibility: public
PK}[�,=B��+ri/1.8/system/File/Stat/directory%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>stat</em> is a directory, <tt>false</tt> otherwise.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).directory?   #=&gt; false\n   File.stat(&quot;.&quot;).directory?          #=&gt; true\n"
full_name: File::Stat#directory?
is_singleton: false
name: directory?
params: |
  stat.directory?   => true or false

visibility: public
PK}[w�V

)ri/1.8/system/File/Stat/symlink%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>stat</em> is a symbolic link, <tt>false</tt> if it isn't or if the operating system doesn't support this feature. As <tt>File::stat</tt> automatically follows symbolic links, <tt>symlink?</tt> will always be <tt>false</tt> for an object returned by <tt>File::stat</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.symlink(&quot;testfile&quot;, &quot;alink&quot;)   #=&gt; 0\n   File.stat(&quot;alink&quot;).symlink?         #=&gt; false\n   File.lstat(&quot;alink&quot;).symlink?        #=&gt; true\n"
full_name: File::Stat#symlink?
is_singleton: false
name: symlink?
params: |
  stat.symlink?    => true or false

visibility: public
PK}[5"[(ri/1.8/system/File/Stat/setgid%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>stat</em> has the set-group-id permission bit set, <tt>false</tt> if it doesn't or if the operating system doesn't support this feature.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;/usr/sbin/lpc&quot;).setgid?   #=&gt; true\n"
full_name: File::Stat#setgid?
is_singleton: false
name: setgid?
params: |
  stat.setgid?   => true or false

visibility: public
PK}[��c���(ri/1.8/system/File/Stat/setuid%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>stat</em> has the set-user-id permission bit set, <tt>false</tt> if it doesn't or if the operating system doesn't support this feature.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;/bin/su&quot;).setuid?   #=&gt; true\n"
full_name: File::Stat#setuid?
is_singleton: false
name: setuid?
params: |
  stat.setuid?    => true or false

visibility: public
PK}[M&�b��$ri/1.8/system/File/Stat/atime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the last access time for this file as an object of class <tt>Time</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).atime   #=&gt; Wed Dec 31 18:00:00 CST 1969\n"
full_name: File::Stat#atime
is_singleton: false
name: atime
params: |
  stat.atime   => time

visibility: public
PK}[n��L&&*ri/1.8/system/File/Stat/blockdev%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the file is a block device, <tt>false</tt> if it isn't or if the operating system doesn't support this feature.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).blockdev?    #=&gt; false\n   File.stat(&quot;/dev/hda1&quot;).blockdev?   #=&gt; true\n"
full_name: File::Stat#blockdev?
is_singleton: false
name: blockdev?
params: |
  stat.blockdev?   => true or false

visibility: public
PK}[�'$�aa&ri/1.8/system/File/Stat/pipe%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the operating system supports pipes and <em>stat</em> is a pipe; <tt>false</tt> otherwise.
full_name: File::Stat#pipe?
is_singleton: false
name: pipe?
params: |
  stat.pipe?    => true or false

visibility: public
PK}[�?A�]]$ri/1.8/system/File/Stat/ftype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Identifies the type of <em>stat</em>. The return string is one of: ``<tt>file</tt>'', ``<tt>directory</tt>'', ``<tt>characterSpecial</tt>'', ``<tt>blockSpecial</tt>'', ``<tt>fifo</tt>'', ``<tt>link</tt>'', ``<tt>socket</tt>'', or ``<tt>unknown</tt>''."
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;/dev/tty&quot;).ftype   #=&gt; &quot;characterSpecial&quot;\n"
full_name: File::Stat#ftype
is_singleton: false
name: ftype
params: |
  stat.ftype   => string

visibility: public
PK}[��P��/ri/1.8/system/File/Stat/writable_real%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>stat</em> is writable by the real user id of this process.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).writable_real?   #=&gt; true\n"
full_name: File::Stat#writable_real?
is_singleton: false
name: writable_real?
params: |
  stat.writable_real? -> true or false

visibility: public
PK}[�R�m��&ri/1.8/system/File/Stat/file%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>stat</em> is a regular file (not a device file, pipe, socket, etc.).
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).file?   #=&gt; true\n"
full_name: File::Stat#file?
is_singleton: false
name: file?
params: |
  stat.file?    => true or false

visibility: public
PK}[#�	Czz"ri/1.8/system/File/Stat/uid-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the numeric user id of the owner of <em>stat</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).uid   #=&gt; 501\n"
full_name: File::Stat#uid
is_singleton: false
name: uid
params: |
  stat.uid    => fixnum

visibility: public
PK}[_M�o44,ri/1.8/system/File/Stat/executable%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>stat</em> is executable or if the operating system doesn't distinguish executable files from nonexecutable files. The tests are made using the effective owner of the process.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).executable?   #=&gt; false\n"
full_name: File::Stat#executable?
is_singleton: false
name: executable?
params: |
  stat.executable?    => true or false

visibility: public
PK}[}2����'ri/1.8/system/File/Stat/owned%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the effective user id of the process is the same as the owner of <em>stat</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).owned?      #=&gt; true\n   File.stat(&quot;/etc/passwd&quot;).owned?   #=&gt; false\n"
full_name: File::Stat#owned?
is_singleton: false
name: owned?
params: |
  stat.owned?    => true or false

visibility: public
PK}[�EIZrr&ri/1.8/system/File/Stat/size%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the size of <em>stat</em> in bytes.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.stat(&quot;testfile&quot;).size   #=&gt; 66\n"
full_name: File::Stat#size?
is_singleton: false
name: size?
params: |
  state.size    => integer

visibility: public
PK}[��W�}}ri/1.8/system/File/link-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new name for an existing file using a hard link. Will not overwrite <em>new_name</em> if it already exists (raising a subclass of <tt>SystemCallError</tt>). Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.link(&quot;testfile&quot;, &quot;.testfile&quot;)   #=&gt; 0\n   IO.readlines(&quot;.testfile&quot;)[0]         #=&gt; &quot;This is line one\\n&quot;\n"
full_name: File::link
is_singleton: true
name: link
params: |
  File.link(old_name, new_name)    => 0

visibility: public
PK}[H �R[[%ri/1.8/system/File/readable%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is readable by the effective user id of this process.
full_name: File::readable?
is_singleton: true
name: readable?
params: |
  File.readable?(file_name)   => true or false

visibility: public
PK}[���88#ri/1.8/system/File/sticky%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file has the sticky bit set.
full_name: File::sticky?
is_singleton: true
name: sticky?
params: |
  File.sticky?(file_name)   =>  true or false

visibility: public
PK}[���"ri/1.8/system/File/truncate-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Truncates the file <em>file_name</em> to be at most <em>integer</em> bytes long. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;out&quot;, &quot;w&quot;)\n   f.write(&quot;1234567890&quot;)     #=&gt; 10\n   f.close                   #=&gt; nil\n   File.truncate(&quot;out&quot;, 5)   #=&gt; 0\n   File.size(&quot;out&quot;)          #=&gt; 5\n"
full_name: File::truncate
is_singleton: true
name: truncate
params: |
  File.truncate(file_name, integer)  => 0

visibility: public
PK}[Y׫ri/1.8/system/File/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Opens the file named by <em>filename</em> according to <em>mode</em> (default is ``r'') and returns a new <tt>File</tt> object. See the description of class <tt>IO</tt> for a description of <em>mode</em>. The file mode may optionally be specified as a <tt>Fixnum</tt> by <em>or</em>-ing together the flags (O_RDONLY etc, again described under <tt>IO</tt>). Optional permission bits may be given in <em>perm</em>. These mode and permission bits are platform dependent; on Unix systems, see <tt>open(2)</tt> for details.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;, &quot;r&quot;)\n   f = File.new(&quot;newfile&quot;,  &quot;w+&quot;)\n   f = File.new(&quot;newfile&quot;, File::CREAT|File::TRUNC|File::RDWR, 0644)\n"
full_name: File::new
is_singleton: true
name: new
params: |
  File.new(filename, mode="r")            => file
  File.new(filename [, mode [, perm]])    => file

visibility: public
PK}[>�b��1ri/1.8/system/File/Constants/cdesc-Constants.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: this is IO's method
constants: []

full_name: File::Constants
includes: []

instance_methods: []

name: Constants
superclass: 
PK}[���.��ri/1.8/system/File/mtime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the modification time for <em>file</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.new(&quot;testfile&quot;).mtime   #=&gt; Wed Apr 09 08:53:14 CDT 2003\n"
full_name: File#mtime
is_singleton: false
name: mtime
params: |
  file.mtime -> time

visibility: public
PK}[�)�]]!ri/1.8/system/File/size%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>nil</tt> if <tt>file_name</tt> doesn't exist or has zero size, the size of the file otherwise.
full_name: File::size?
is_singleton: true
name: size?
params: |
  File.size?(file_name)   => Integer or nil

visibility: public
PK}[s���77$ri/1.8/system/File/symlink%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is a symbolic link.
full_name: File::symlink?
is_singleton: true
name: symlink?
params: |
  File.symlink?(file_name)   =>  true or false

visibility: public
PK}[&@g��ri/1.8/system/File/utime-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the access and modification times of each named file to the first two arguments. Returns the number of file names in the argument list.
full_name: File::utime
is_singleton: true
name: utime
params: |
  File.utime(atime, mtime, file_name,...)   =>  integer

visibility: public
PK}[��6NN!ri/1.8/system/File/dirname-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns all components of the filename given in <em>file_name</em> except the last one. The filename must be formed using forward slashes (``<tt>/</tt>'') regardless of the separator used on the local file system.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.dirname(&quot;/home/gumby/work/ruby.rb&quot;)   #=&gt; &quot;/home/gumby/work&quot;\n"
full_name: File::dirname
is_singleton: true
name: dirname
params: |
  File.dirname(file_name ) -> dir_name

visibility: public
PK}[�&X�� ri/1.8/system/File/unlink-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes the named files, returning the number of names passed as arguments. Raises an exception on any error. See also <tt>Dir::rmdir</tt>.
full_name: File::unlink
is_singleton: true
name: unlink
params: |
  File.delete(file_name, ...)  => integer
  File.unlink(file_name, ...)  => integer

visibility: public
PK}[�ʨ�--#ri/1.8/system/File/socket%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is a socket.
full_name: File::socket?
is_singleton: true
name: socket?
params: |
  File.socket?(file_name)   =>  true or false

visibility: public
PK}[���"ri/1.8/system/File/truncate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Truncates <em>file</em> to at most <em>integer</em> bytes. The file must be opened for writing. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;out&quot;, &quot;w&quot;)\n   f.syswrite(&quot;1234567890&quot;)   #=&gt; 10\n   f.truncate(5)              #=&gt; 0\n   f.close()                  #=&gt; nil\n   File.size(&quot;out&quot;)           #=&gt; 5\n"
full_name: File#truncate
is_singleton: false
name: truncate
params: |
  file.truncate(integer)    => 0

visibility: public
PK}[~���  !ri/1.8/system/File/install-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: If <tt>src</tt> is not the same as <tt>dest</tt>, copies it and changes the permission mode to <tt>mode</tt>. If <tt>dest</tt> is a directory, destination is <tt>dest/src</tt>. If <tt>mode</tt> is not set, default is used. If <tt>verbose</tt> is set to true, the name of each file copied will be printed.
full_name: File::install
is_singleton: true
name: install
params: (from, to, mode = nil, verbose = false)
visibility: public
PK}[�6ljmm,ri/1.8/system/File/executable_real%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is executable by the real user id of this process.
full_name: File::executable_real?
is_singleton: true
name: executable_real?
params: |
  File.executable_real?(file_name)   => true or false

visibility: public
PK}[��3H"ri/1.8/system/File/readlink-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the name of the file referenced by the given link. Not available on all platforms.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.symlink(&quot;testfile&quot;, &quot;link2test&quot;)   #=&gt; 0\n   File.readlink(&quot;link2test&quot;)              #=&gt; &quot;testfile&quot;\n"
full_name: File::readlink
is_singleton: true
name: readlink
params: |
  File.readlink(link_name) -> file_name

visibility: public
PK}[���u88#ri/1.8/system/File/setuid%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file has the setuid bit set.
full_name: File::setuid?
is_singleton: true
name: setuid?
params: |
  File.setuid?(file_name)   =>  true or false

visibility: public
PK}[�)ה��!ri/1.8/system/File/catname-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: If <tt>to</tt> is a valid directory, <tt>from</tt> will be appended to <tt>to</tt>, adding and escaping backslashes as necessary. Otherwise, <tt>to</tt> will be returned. Useful for appending <tt>from</tt> to <tt>to</tt> only if the filename was not specified in <tt>to</tt>.
full_name: File::catname
is_singleton: true
name: catname
params: (from, to)
visibility: public
PK}[�x����!ri/1.8/system/File/o_chmod-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #chmod"
full_name: File#o_chmod
is_singleton: false
name: o_chmod
params: (p1)
visibility: public
PK}[��B�zz&ri/1.8/system/File/identical%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named files are identical.
- !ruby/struct:SM::Flow::VERB 
  body: "    open(&quot;a&quot;, &quot;w&quot;) {}\n    p File.identical?(&quot;a&quot;, &quot;a&quot;)      #=&gt; true\n    p File.identical?(&quot;a&quot;, &quot;./a&quot;)    #=&gt; true\n    File.link(&quot;a&quot;, &quot;b&quot;)\n    p File.identical?(&quot;a&quot;, &quot;b&quot;)      #=&gt; true\n    File.symlink(&quot;a&quot;, &quot;c&quot;)\n    p File.identical?(&quot;a&quot;, &quot;c&quot;)      #=&gt; true\n    open(&quot;d&quot;, &quot;w&quot;) {}\n    p File.identical?(&quot;a&quot;, &quot;d&quot;)      #=&gt; false\n"
full_name: File::identical?
is_singleton: true
name: identical?
params: |
  File.identical?(file_1, file_2)   =>  true or false

visibility: public
PK}[rXf���$ri/1.8/system/File/fnmatch%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns true if <em>path</em> matches against <em>pattern</em> The pattern is not a regular expression; instead it follows rules similar to shell filename globbing. It may contain the following metacharacters:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "<code>*</code>:"
    body: Matches any file. Can be restricted by other values in the glob. <tt>*</tt> will match all files; <tt>c*</tt> will match all files beginning with <tt>c</tt>; <tt>*c</tt> will match all files ending with <tt>c</tt>; and <b><tt>c</tt></b> will match all files that have <tt>c</tt> in them (including at the beginning or end). Equivalent to <tt>/ .* /x</tt> in regexp.
  - !ruby/struct:SM::Flow::LI 
    label: "<code>**</code>:"
    body: Matches directories recursively or files expansively.
  - !ruby/struct:SM::Flow::LI 
    label: "<code>?</code>:"
    body: Matches any one character. Equivalent to <tt>/.{1}/</tt> in regexp.
  - !ruby/struct:SM::Flow::LI 
    label: "<code>[set]</code>:"
    body: Matches any one character in <tt>set</tt>. Behaves exactly like character sets in Regexp, including set negation (<tt>[^a-z]</tt>).
  - !ruby/struct:SM::Flow::LI 
    label: "<code>\\</code>:"
    body: Escapes the next metacharacter.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: <em>flags</em> is a bitwise OR of the <tt>FNM_xxx</tt> parameters. The same glob pattern and flags are used by <tt>Dir::glob</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.fnmatch('cat',       'cat')        #=&gt; true  : match entire string\n   File.fnmatch('cat',       'category')   #=&gt; false : only match partial string\n   File.fnmatch('c{at,ub}s', 'cats')       #=&gt; false : { } isn't supported\n\n   File.fnmatch('c?t',     'cat')          #=&gt; true  : '?' match only 1 character\n   File.fnmatch('c??t',    'cat')          #=&gt; false : ditto\n   File.fnmatch('c*',      'cats')         #=&gt; true  : '*' match 0 or more characters\n   File.fnmatch('c*t',     'c/a/b/t')      #=&gt; true  : ditto\n   File.fnmatch('ca[a-z]', 'cat')          #=&gt; true  : inclusive bracket expression\n   File.fnmatch('ca[^t]',  'cat')          #=&gt; false : exclusive bracket expression ('^' or '!')\n\n   File.fnmatch('cat', 'CAT')                     #=&gt; false : case sensitive\n   File.fnmatch('cat', 'CAT', File::FNM_CASEFOLD) #=&gt; true  : case insensitive\n\n   File.fnmatch('?',   '/', File::FNM_PATHNAME)  #=&gt; false : wildcard doesn't match '/' on FNM_PATHNAME\n   File.fnmatch('*',   '/', File::FNM_PATHNAME)  #=&gt; false : ditto\n   File.fnmatch('[/]', '/', File::FNM_PATHNAME)  #=&gt; false : ditto\n\n   File.fnmatch('\\?',   '?')                       #=&gt; true  : escaped wildcard becomes ordinary\n   File.fnmatch('\\a',   'a')                       #=&gt; true  : escaped ordinary remains ordinary\n   File.fnmatch('\\a',   '\\a', File::FNM_NOESCAPE)  #=&gt; true  : FNM_NOESACPE makes '\\' ordinary\n   File.fnmatch('[\\?]', '?')                       #=&gt; true  : can escape inside bracket expression\n\n   File.fnmatch('*',   '.profile')                      #=&gt; false : wildcard doesn't match leading\n   File.fnmatch('*',   '.profile', File::FNM_DOTMATCH)  #=&gt; true    period by default.\n   File.fnmatch('.*',  '.profile')                      #=&gt; true\n\n   rbfiles = '**' '/' '*.rb' # you don't have to do like this. just write in single string.\n   File.fnmatch(rbfiles, 'main.rb')                    #=&gt; false\n   File.fnmatch(rbfiles, './main.rb')                  #=&gt; false\n   File.fnmatch(rbfiles, 'lib/song.rb')                #=&gt; true\n   File.fnmatch('**.rb', 'main.rb')                    #=&gt; true\n   File.fnmatch('**.rb', './main.rb')                  #=&gt; false\n   File.fnmatch('**.rb', 'lib/song.rb')                #=&gt; true\n   File.fnmatch('*',           'dave/.profile')                      #=&gt; true\n\n   pattern = '*' '/' '*'\n   File.fnmatch(pattern, 'dave/.profile', File::FNM_PATHNAME)  #=&gt; false\n   File.fnmatch(pattern, 'dave/.profile', File::FNM_PATHNAME | File::FNM_DOTMATCH) #=&gt; true\n\n   pattern = '**' '/' 'foo'\n   File.fnmatch(pattern, 'a/b/c/foo', File::FNM_PATHNAME)     #=&gt; true\n   File.fnmatch(pattern, '/a/b/c/foo', File::FNM_PATHNAME)    #=&gt; true\n   File.fnmatch(pattern, 'c:/a/b/c/foo', File::FNM_PATHNAME)  #=&gt; true\n   File.fnmatch(pattern, 'a/.b/c/foo', File::FNM_PATHNAME)    #=&gt; false\n   File.fnmatch(pattern, 'a/.b/c/foo', File::FNM_PATHNAME | File::FNM_DOTMATCH) #=&gt; true\n"
full_name: File::fnmatch?
is_singleton: true
name: fnmatch?
params: |
  File.fnmatch( pattern, path, [flags] ) => (true or false)
  File.fnmatch?( pattern, path, [flags] ) => (true or false)

visibility: public
PK}[��"ri/1.8/system/File/basename-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the last component of the filename given in <em>file_name</em>, which must be formed using forward slashes (``<tt>/</tt>'') regardless of the separator used on the local file system. If <em>suffix</em> is given and present at the end of <em>file_name</em>, it is removed.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.basename(&quot;/home/gumby/work/ruby.rb&quot;)          #=&gt; &quot;ruby.rb&quot;\n   File.basename(&quot;/home/gumby/work/ruby.rb&quot;, &quot;.rb&quot;)   #=&gt; &quot;ruby&quot;\n"
full_name: File::basename
is_singleton: true
name: basename
params: |
  File.basename(file_name [, suffix] ) -> base_name

visibility: public
PK}[��C���!ri/1.8/system/File/compare-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if and only if the contents of files <tt>from</tt> and <tt>to</tt> are identical. If <tt>verbose</tt> is <tt>true</tt>, <tt>from &lt;=&gt; to</tt> is printed.
full_name: File::compare
is_singleton: true
name: compare
params: (from, to, verbose = false)
visibility: public
PK}[��cc'ri/1.8/system/File/executable%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is executable by the effective user id of this process.
full_name: File::executable?
is_singleton: true
name: executable?
params: |
  File.executable?(file_name)   => true or false

visibility: public
PK}[e�pw��ri/1.8/system/File/atime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the last access time (a <tt>Time</tt> object)
- !ruby/struct:SM::Flow::VERB 
  body: " for <em>file</em>, or epoch if <em>file</em> has not been accessed.\n\n   File.new(&quot;testfile&quot;).atime   #=&gt; Wed Dec 31 18:00:00 CST 1969\n"
full_name: File#atime
is_singleton: false
name: atime
params: |
  file.atime    => time

visibility: public
PK}[���J��&ri/1.8/system/File/directory%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is a directory, <tt>false</tt> otherwise.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.directory?(&quot;.&quot;)\n"
full_name: File::directory?
is_singleton: true
name: directory?
params: |
  File.directory?(file_name)   =>  true or false

visibility: public
PK}[�,˶GG!ri/1.8/system/File/syscopy-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Copies a file <tt>from</tt> to <tt>to</tt>. If <tt>to</tt> is a directory, copies <tt>from</tt> to <tt>to/from</tt>.
full_name: File::syscopy
is_singleton: true
name: syscopy
params: (from, to)
visibility: public
PK}[u�Nv��%ri/1.8/system/File/safe_unlink-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes a list of files. Each parameter should be the name of the file to delete. If the last parameter isn't a String, verbose mode will be enabled. Returns the number of files deleted.
full_name: File::safe_unlink
is_singleton: true
name: safe_unlink
params: (*files)
visibility: public
PK}[GٶUzzri/1.8/system/File/chmod-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Changes permission bits on the named file(s) to the bit pattern represented by <em>mode_int</em>. Actual effects are operating system dependent (see the beginning of this section). On Unix systems, see <tt>chmod(2)</tt> for details. Returns the number of files processed.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.chmod(0644, &quot;testfile&quot;, &quot;out&quot;)   #=&gt; 2\n"
full_name: File::chmod
is_singleton: true
name: chmod
params: |
  File.chmod(mode_int, file_name, ... ) -> integer

visibility: public
PK}[xG�Iee*ri/1.8/system/File/writable_real%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is writable by the real user id of this process.
full_name: File::writable_real?
is_singleton: true
name: writable_real?
params: |
  File.writable_real?(file_name)   => true or false

visibility: public
PK}[^�ip��ri/1.8/system/File/chown-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Changes the owner and group of <em>file</em> to the given numeric owner and group id's. Only a process with superuser privileges may change the owner of a file. The current owner of a file may change the file's group to any group to which the owner belongs. A <tt>nil</tt> or -1 owner or group id is ignored. Follows symbolic links. See also <tt>File#lchown</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.new(&quot;testfile&quot;).chown(502, 1000)\n"
full_name: File#chown
is_singleton: false
name: chown
params: |
  file.chown(owner_int, group_int )   => 0

visibility: public
PK}[��.�nn"ri/1.8/system/File/owned%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file exists and the effective used id of the calling process is the owner of the file.
full_name: File::owned?
is_singleton: true
name: owned?
params: |
  File.owned?(file_name)   => true or false

visibility: public
PK}[K�"��,ri/1.8/system/TrueClass/cdesc-TrueClass.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The global value <tt>true</tt> is the only instance of class <tt>TrueClass</tt> and represents a logically true value in boolean expressions. The class provides operators allowing <tt>true</tt> to be used in logical expressions.
constants: []

full_name: TrueClass
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "&"
- !ruby/object:RI::MethodSummary 
  name: ^
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: to_yaml
- !ruby/object:RI::MethodSummary 
  name: "|"
name: TrueClass
superclass: Object
PK}[8��hUU"ri/1.8/system/TrueClass/%7c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Or---Returns <tt>true</tt>. As <em>anObject</em> is an argument to a method call, it is always evaluated; there is no short-circuit evaluation in this case.
- !ruby/struct:SM::Flow::VERB 
  body: "   true |  puts(&quot;or&quot;)\n   true || puts(&quot;logical or&quot;)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   or\n"
full_name: TrueClass#|
is_singleton: false
name: "|"
params: |
  true | obj   => true

visibility: public
PK}[9��OO"ri/1.8/system/TrueClass/%26-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: And---Returns <tt>false</tt> if <em>obj</em> is <tt>nil</tt> or <tt>false</tt>, <tt>true</tt> otherwise.
full_name: TrueClass#&
is_singleton: false
name: "&"
params: |
  true & obj    => true or false

visibility: public
PK}[����&ri/1.8/system/TrueClass/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: TrueClass#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PK}[*3q7""#ri/1.8/system/TrueClass/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The string representation of <tt>true</tt> is &quot;true&quot;.
full_name: TrueClass#to_s
is_singleton: false
name: to_s
params: |
  true.to_s   =>  "true"

visibility: public
PK}[_��ELL"ri/1.8/system/TrueClass/%5e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Exclusive Or---Returns <tt>true</tt> if <em>obj</em> is <tt>nil</tt> or <tt>false</tt>, <tt>false</tt> otherwise.
full_name: TrueClass#^
is_singleton: false
name: ^
params: |
  true ^ obj   => !obj

visibility: public
PK}[\�֛^^$ri/1.8/system/Vector/elements-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a vector from an Array. The optional second argument specifies whether the array itself or a copy is used internally.
full_name: Vector::elements
is_singleton: true
name: elements
params: (array, copy = true)
visibility: public
PK}[�A M�� ri/1.8/system/Vector/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of elements in the vector.
full_name: Vector#size
is_singleton: false
name: size
params: ()
visibility: public
PK}[j)<��"ri/1.8/system/Vector/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #=="
full_name: Vector#eql?
is_singleton: false
name: eql?
params: (other)
visibility: public
PK}[P�		"ri/1.8/system/Vector/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns element number <tt>i</tt> (starting at zero) of the vector.
full_name: Vector#[]
is_singleton: false
name: "[]"
params: (i)
visibility: public
PK}[
A���$ri/1.8/system/Vector/covector-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a single-row matrix from this vector.
full_name: Vector#covector
is_singleton: false
name: covector
params: ()
visibility: public
PK}[�eQIIri/1.8/system/Vector/r-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the modulus (Pythagorean distance) of the vector.
- !ruby/struct:SM::Flow::VERB 
  body: "  Vector[5,8,2].r =&gt; 9.643650761\n"
full_name: Vector#r
is_singleton: false
name: r
params: ()
visibility: public
PK}[h����"ri/1.8/system/Vector/coerce-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "FIXME: describe Vector#coerce."
full_name: Vector#coerce
is_singleton: false
name: coerce
params: (other)
visibility: public
PK}[9�ʉ�� ri/1.8/system/Vector/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the elements of the vector in an array.
full_name: Vector#to_a
is_singleton: false
name: to_a
params: ()
visibility: public
PK}[w����&ri/1.8/system/Vector/compare_by-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: For internal use.
full_name: Vector#compare_by
is_singleton: false
name: compare_by
params: (elements)
visibility: public
PK}[�S�&&!ri/1.8/system/Vector/each2-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: e1, e2
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterate over the elements of this vector and <tt>v</tt> in conjunction.
full_name: Vector#each2
is_singleton: false
name: each2
params: (v) {|e1, e2| ...}
visibility: public
PK}[�vg���)ri/1.8/system/Vector/init_elements-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: For internal use.
full_name: Vector#init_elements
is_singleton: false
name: init_elements
params: (array, copy)
visibility: public
PK}[�3@8�� ri/1.8/system/Vector/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a hash-code for the vector.
full_name: Vector#hash
is_singleton: false
name: hash
params: ()
visibility: public
PK}[�rHH$ri/1.8/system/Vector/collect2-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: e1, e2
comment: 
- !ruby/struct:SM::Flow::P 
  body: Collects (as in Enumerable#collect) over the elements of this vector and <tt>v</tt> in conjunction.
full_name: Vector#collect2
is_singleton: false
name: collect2
params: (v) {|e1, e2| ...}
visibility: public
PK}[�o>+#ri/1.8/system/Vector/collect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: map
block_params: e
comment: 
- !ruby/struct:SM::Flow::P 
  body: Like Array#collect.
full_name: Vector#collect
is_singleton: false
name: collect
params: ( {|e| ...}
visibility: public
PK}[�4]�ri/1.8/system/Vector/%2a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Multiplies the vector by <tt>x</tt>, where <tt>x</tt> is a number or another vector.
full_name: Vector#*
is_singleton: false
name: "*"
params: (x)
visibility: public
PK}[	ׄ��#ri/1.8/system/Vector/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Overrides Object#inspect
full_name: Vector#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK}[vj���ri/1.8/system/Vector/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: For internal use.
full_name: Vector::new
is_singleton: true
name: new
params: (method, array, copy)
visibility: public
PK}[mEY���ri/1.8/system/Vector/%2b-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Vector addition.
full_name: Vector#+
is_singleton: false
name: +
params: (v)
visibility: public
PK}[H�0J

&ri/1.8/system/Vector/cdesc-Vector.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: elements
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: The <tt>Vector</tt> class represents a mathematical vector, which is useful in its own right, and also constitutes a row or column of a Matrix.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Method Catalogue
- !ruby/struct:SM::Flow::P 
  body: "To create a Vector:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> Vector.[](*array) </tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> Vector.elements(array, copy = true) </tt>
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "To access elements:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> [](i) </tt>
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "To enumerate the elements:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #each2(v) </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #collect2(v) </tt>"
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "Vector arithmetic:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> *(x) &quot;is matrix or number&quot; </tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> +(v) </tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt> -(v) </tt>
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "Vector functions:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #inner_product(v) </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #collect </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #map </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #map2(v) </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #r </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #size </tt>"
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "Conversion to other data types:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #covector </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #to_a </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #coerce(other) </tt>"
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "String representations:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #to_s </tt>"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt> #inspect </tt>"
  type: :BULLET
constants: []

full_name: Vector
includes: 
- !ruby/object:RI::IncludedModule 
  name: ExceptionForMatrix
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "*"
- !ruby/object:RI::MethodSummary 
  name: +
- !ruby/object:RI::MethodSummary 
  name: "-"
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: clone
- !ruby/object:RI::MethodSummary 
  name: coerce
- !ruby/object:RI::MethodSummary 
  name: collect
- !ruby/object:RI::MethodSummary 
  name: collect2
- !ruby/object:RI::MethodSummary 
  name: compare_by
- !ruby/object:RI::MethodSummary 
  name: covector
- !ruby/object:RI::MethodSummary 
  name: each2
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: init_elements
- !ruby/object:RI::MethodSummary 
  name: inner_product
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: map
- !ruby/object:RI::MethodSummary 
  name: map2
- !ruby/object:RI::MethodSummary 
  name: r
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: to_a
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Vector
superclass: Object
PK}[�t��� ri/1.8/system/Vector/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Overrides Object#to_s
full_name: Vector#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK}[�7<��ri/1.8/system/Vector/map-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #collect"
full_name: Vector#map
is_singleton: false
name: map
params: (
visibility: public
PK}[d��pp)ri/1.8/system/Vector/inner_product-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the inner product of this vector with the other.
- !ruby/struct:SM::Flow::VERB 
  body: "  Vector[4,7].inner_product Vector[10,1]  =&gt; 47\n"
full_name: Vector#inner_product
is_singleton: false
name: inner_product
params: (v)
visibility: public
PK}[����CC"ri/1.8/system/Vector/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: eql?
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> iff the two vectors have the same elements in the same order.
full_name: Vector#==
is_singleton: false
name: ==
params: (other)
visibility: public
PK}[��؎��!ri/1.8/system/Vector/clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a copy of the vector.
full_name: Vector#clone
is_singleton: false
name: clone
params: ()
visibility: public
PK}[�$� ri/1.8/system/Vector/map2-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: e1, e2
comment: 
- !ruby/struct:SM::Flow::P 
  body: Like Vector#collect2, but returns a Vector instead of an Array.
full_name: Vector#map2
is_singleton: false
name: map2
params: (v) {|e1, e2| ...}
visibility: public
PK}[УA�33"ri/1.8/system/Vector/%5b%5d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a Vector from a list of elements.
- !ruby/struct:SM::Flow::VERB 
  body: "  Vector[7, 4, ...]\n"
full_name: Vector::[]
is_singleton: true
name: "[]"
params: (*array)
visibility: public
PK}[f
}��ri/1.8/system/Vector/%2d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Vector subtraction.
full_name: Vector#-
is_singleton: false
name: "-"
params: (v)
visibility: public
PK}[�y�*ri/1.8/system/ParseError/set_option-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: ParseError#set_option
is_singleton: false
name: set_option
params: (opt, eq)
visibility: public
PK}[D8Ճ�.ri/1.8/system/ParseError/cdesc-ParseError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: args
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: reason
  rw: W
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Base class of exceptions from OptionParser.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Reason which caused the error.
  name: Reason
  value: "'parse error'.freeze"
full_name: ParseError
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: message
- !ruby/object:RI::MethodSummary 
  name: reason
- !ruby/object:RI::MethodSummary 
  name: recover
- !ruby/object:RI::MethodSummary 
  name: set_option
- !ruby/object:RI::MethodSummary 
  name: to_s
name: ParseError
superclass: RuntimeError
PK}[��ز��'ri/1.8/system/ParseError/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: ParseError#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK}[�%�-��#ri/1.8/system/ParseError/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: ParseError::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK}[�_/�33'ri/1.8/system/ParseError/message-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: to_s
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Default stringizing method to emit standard error message.
full_name: ParseError#message
is_singleton: false
name: message
params: ()
visibility: public
PK}[�݊��$ri/1.8/system/ParseError/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #message"
full_name: ParseError#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK}["�e9'ri/1.8/system/ParseError/recover-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pushes back erred argument(s) to <tt>argv</tt>.
full_name: ParseError#recover
is_singleton: false
name: recover
params: (argv)
visibility: public
PK}[IFL��&ri/1.8/system/ParseError/reason-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns error reason. Override this for I18N.
full_name: ParseError#reason
is_singleton: false
name: reason
params: ()
visibility: public
PK}[�YI||,ri/1.8/system/TypeError/cdesc-TypeError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: TypeError
includes: []

instance_methods: []

name: TypeError
superclass: StandardError
PK}[%���))+ri/1.8/system/ConditionVariable/wait-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Releases the lock held in <tt>mutex</tt> and waits; reacquires the lock on wakeup.
full_name: ConditionVariable#wait
is_singleton: false
name: wait
params: (mutex)
visibility: public
PK}[�j����*ri/1.8/system/ConditionVariable/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new ConditionVariable
full_name: ConditionVariable::new
is_singleton: true
name: new
params: ()
visibility: public
PK}[�� 0ri/1.8/system/ConditionVariable/broadcast-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Wakes up all threads waiting for this lock.
full_name: ConditionVariable#broadcast
is_singleton: false
name: broadcast
params: ()
visibility: public
PK}[>��88<ri/1.8/system/ConditionVariable/cdesc-ConditionVariable.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: ConditionVariable objects augment class Mutex. Using condition variables, it is possible to suspend while in the middle of a critical section until a resource becomes available.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'thread'\n\n  mutex = Mutex.new\n  resource = ConditionVariable.new\n\n  a = Thread.new {\n    mutex.synchronize {\n      # Thread 'a' now needs the resource\n      resource.wait(mutex)\n      # 'a' can now have the resource\n    }\n  }\n\n  b = Thread.new {\n    mutex.synchronize {\n      # Thread 'b' has finished using the resource\n      resource.signal\n    }\n  }\n"
constants: []

full_name: ConditionVariable
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: broadcast
- !ruby/object:RI::MethodSummary 
  name: signal
- !ruby/object:RI::MethodSummary 
  name: wait
name: ConditionVariable
superclass: Object
PK}[�-ri/1.8/system/ConditionVariable/signal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Wakes up the first thread in line waiting for this lock.
full_name: ConditionVariable#signal
is_singleton: false
name: signal
params: ()
visibility: public
PK}[����3ri/1.8/system/MonitorMixin/mon_exit_for_cond-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: MonitorMixin#mon_exit_for_cond
is_singleton: false
name: mon_exit_for_cond
params: ()
visibility: private
PK}[i�6..1ri/1.8/system/MonitorMixin/mon_check_owner-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Throw a ThreadError exception if the current thread does't own the monitor
full_name: MonitorMixin#mon_check_owner
is_singleton: false
name: mon_check_owner
params: ()
visibility: private
PK}[�;��/ri/1.8/system/MonitorMixin/extend_object-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: MonitorMixin::extend_object
is_singleton: true
name: extend_object
params: (obj)
visibility: public
PK}[�*�ZZ/ri/1.8/system/MonitorMixin/mon_try_enter-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: try_mon_enter
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Attempts to enter exclusive section. Returns <tt>false</tt> if lock fails.
full_name: MonitorMixin#mon_try_enter
is_singleton: false
name: mon_try_enter
params: ()
visibility: public
PK}[��6u��*ri/1.8/system/MonitorMixin/new_cond-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "FIXME: This isn't documented in Nutshell."
- !ruby/struct:SM::Flow::P 
  body: "Create a new condition variable for this monitor. This facilitates control of the monitor with #signal and #wait."
full_name: MonitorMixin#new_cond
is_singleton: false
name: new_cond
params: ()
visibility: public
PK}[+�x�%%0ri/1.8/system/MonitorMixin/mon_initialize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: called by initialize method to set defaults for instance variables.
full_name: MonitorMixin#mon_initialize
is_singleton: false
name: mon_initialize
params: ()
visibility: private
PK}[-
���4ri/1.8/system/MonitorMixin/mon_enter_for_cond-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: MonitorMixin#mon_enter_for_cond
is_singleton: false
name: mon_enter_for_cond
params: (count)
visibility: private
PK}[FmD;��-ri/1.8/system/MonitorMixin/synchronize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #mon_synchronize"
full_name: MonitorMixin#synchronize
is_singleton: false
name: synchronize
params: ()
visibility: public
PK}[�
���/ri/1.8/system/MonitorMixin/try_mon_enter-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #mon_try_enter"
full_name: MonitorMixin#try_mon_enter
is_singleton: false
name: try_mon_enter
params: ()
visibility: public
PK}[����-ri/1.8/system/MonitorMixin/mon_acquire-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: MonitorMixin#mon_acquire
is_singleton: false
name: mon_acquire
params: (queue)
visibility: private
PK}[&�f���*ri/1.8/system/MonitorMixin/mon_exit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Leaves exclusive section.
full_name: MonitorMixin#mon_exit
is_singleton: false
name: mon_exit
params: ()
visibility: public
PK}[2�
���%ri/1.8/system/MonitorMixin/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: MonitorMixin::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK}[D
��-ri/1.8/system/MonitorMixin/mon_release-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: mon_release requires Thread.critical == true
full_name: MonitorMixin#mon_release
is_singleton: false
name: mon_release
params: ()
visibility: private
PK}[�36�((>ri/1.8/system/MonitorMixin/ConditionVariable/wait_until-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "call #wait until the supplied block returns <tt>true</tt>."
full_name: MonitorMixin::ConditionVariable#wait_until
is_singleton: false
name: wait_until
params: ()
visibility: public
PK}[
'�((>ri/1.8/system/MonitorMixin/ConditionVariable/wait_while-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "call #wait while the supplied block returns <tt>true</tt>."
full_name: MonitorMixin::ConditionVariable#wait_while
is_singleton: false
name: wait_while
params: ()
visibility: public
PK}[��	L��8ri/1.8/system/MonitorMixin/ConditionVariable/wait-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Create a new timer with the argument timeout, and add the current thread to the list of waiters. Then the thread is stopped. It will be resumed when a corresponding #signal occurs."
full_name: MonitorMixin::ConditionVariable#wait
is_singleton: false
name: wait
params: (timeout = nil)
visibility: public
PK}[�@kl��7ri/1.8/system/MonitorMixin/ConditionVariable/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: MonitorMixin::ConditionVariable::new
is_singleton: true
name: new
params: (monitor)
visibility: public
PK}[�`Y�=ri/1.8/system/MonitorMixin/ConditionVariable/broadcast-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Wake up all the waiters.
full_name: MonitorMixin::ConditionVariable#broadcast
is_singleton: false
name: broadcast
params: ()
visibility: public
PK}[|����Ari/1.8/system/MonitorMixin/ConditionVariable/count_waiters-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: MonitorMixin::ConditionVariable#count_waiters
is_singleton: false
name: count_waiters
params: ()
visibility: public
PK}[)����Gri/1.8/system/MonitorMixin/ConditionVariable/Timeout/cdesc-Timeout.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: MonitorMixin::ConditionVariable::Timeout
includes: []

instance_methods: []

name: Timeout
superclass: Exception
PK}[gY�bssIri/1.8/system/MonitorMixin/ConditionVariable/cdesc-ConditionVariable.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "FIXME: This isn't documented in Nutshell."
- !ruby/struct:SM::Flow::P 
  body: Since MonitorMixin.new_cond returns a ConditionVariable, and the example above calls while_wait and signal, this class should be documented.
constants: []

full_name: MonitorMixin::ConditionVariable
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: broadcast
- !ruby/object:RI::MethodSummary 
  name: count_waiters
- !ruby/object:RI::MethodSummary 
  name: create_timer
- !ruby/object:RI::MethodSummary 
  name: signal
- !ruby/object:RI::MethodSummary 
  name: wait
- !ruby/object:RI::MethodSummary 
  name: wait_until
- !ruby/object:RI::MethodSummary 
  name: wait_while
name: ConditionVariable
superclass: Object
PK}[YY�:ri/1.8/system/MonitorMixin/ConditionVariable/signal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Wake up and run the next waiter
full_name: MonitorMixin::ConditionVariable#signal
is_singleton: false
name: signal
params: ()
visibility: public
PK}[�Ms��@ri/1.8/system/MonitorMixin/ConditionVariable/create_timer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: MonitorMixin::ConditionVariable#create_timer
is_singleton: false
name: create_timer
params: (timeout)
visibility: private
PK}[�����1ri/1.8/system/MonitorMixin/mon_synchronize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: synchronize
block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: Enters exclusive section and executes the block. Leaves the exclusive section automatically when the block exits. See example under <tt>MonitorMixin</tt>.
full_name: MonitorMixin#mon_synchronize
is_singleton: false
name: mon_synchronize
params: () {|| ...}
visibility: public
PK}[�5���+ri/1.8/system/MonitorMixin/mon_enter-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Enters exclusive section.
full_name: MonitorMixin#mon_enter
is_singleton: false
name: mon_enter
params: ()
visibility: public
PK}[�ܹ882ri/1.8/system/MonitorMixin/cdesc-MonitorMixin.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: extend_object
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Adds monitor functionality to an arbitrary object by mixing the module with <tt>include</tt>. For example:"
- !ruby/struct:SM::Flow::VERB 
  body: "   require 'monitor.rb'\n\n   buf = []\n   buf.extend(MonitorMixin)\n   empty_cond = buf.new_cond\n\n   # consumer\n   Thread.start do\n     loop do\n       buf.synchronize do\n         empty_cond.wait_while { buf.empty? }\n         print buf.shift\n       end\n     end\n   end\n\n   # producer\n   while line = ARGF.gets\n     buf.synchronize do\n       buf.push(line)\n       empty_cond.signal\n     end\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: The consumer thread waits for the producer thread to push a line to buf while buf.empty?, and the producer thread (main thread) reads a line from ARGF and push it to buf, then call empty_cond.signal.
constants: []

full_name: MonitorMixin
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: mon_acquire
- !ruby/object:RI::MethodSummary 
  name: mon_check_owner
- !ruby/object:RI::MethodSummary 
  name: mon_enter
- !ruby/object:RI::MethodSummary 
  name: mon_enter_for_cond
- !ruby/object:RI::MethodSummary 
  name: mon_exit
- !ruby/object:RI::MethodSummary 
  name: mon_exit_for_cond
- !ruby/object:RI::MethodSummary 
  name: mon_initialize
- !ruby/object:RI::MethodSummary 
  name: mon_release
- !ruby/object:RI::MethodSummary 
  name: mon_synchronize
- !ruby/object:RI::MethodSummary 
  name: mon_try_enter
- !ruby/object:RI::MethodSummary 
  name: new_cond
- !ruby/object:RI::MethodSummary 
  name: synchronize
- !ruby/object:RI::MethodSummary 
  name: try_mon_enter
name: MonitorMixin
superclass: 
PK}[�֮Ҍ�+ri/1.8/system/TSort/tsort_each_child-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: child
comment: 
- !ruby/struct:SM::Flow::P 
  body: Should be implemented by a extended class.
- !ruby/struct:SM::Flow::P 
  body: "#tsort_each_child is used to iterate for child nodes of <em>node</em>."
full_name: TSort#tsort_each_child
is_singleton: false
name: tsort_each_child
params: (node) {|child| ...}
visibility: public
PK}[8��A��<ri/1.8/system/TSort/each_strongly_connected_component-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: nodes
comment: 
- !ruby/struct:SM::Flow::P 
  body: "The iterator version of the #strongly_connected_components method. <tt><em>obj</em>.each_strongly_connected_component</tt> is similar to <tt><em>obj</em>.strongly_connected_components.each</tt>, but modification of <em>obj</em> during the iteration may lead to unexpected results."
- !ruby/struct:SM::Flow::P 
  body: "#each_strongly_connected_component returns <tt>nil</tt>."
full_name: TSort#each_strongly_connected_component
is_singleton: false
name: each_strongly_connected_component
params: ( {|nodes| ...}
visibility: public
PK}[�:\[||*ri/1.8/system/TSort/tsort_each_node-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: node
comment: 
- !ruby/struct:SM::Flow::P 
  body: Should be implemented by a extended class.
- !ruby/struct:SM::Flow::P 
  body: "#tsort_each_node is used to iterate for all nodes over a graph."
full_name: TSort#tsort_each_node
is_singleton: false
name: tsort_each_node
params: ( {|node| ...}
visibility: public
PK}[w���� ri/1.8/system/TSort/tsort-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a topologically sorted array of nodes. The array is sorted from children to parents, i.e. the first element has no child and the last node has no parent.
- !ruby/struct:SM::Flow::P 
  body: If there is a cycle, TSort::Cyclic is raised.
full_name: TSort#tsort
is_singleton: false
name: tsort
params: ()
visibility: public
PK}[!�<<Ari/1.8/system/TSort/each_strongly_connected_component_from-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: nodes
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over strongly connected component in the subgraph reachable from <em>node</em>.
- !ruby/struct:SM::Flow::P 
  body: Return value is unspecified.
- !ruby/struct:SM::Flow::P 
  body: "#each_strongly_connected_component_from doesn't call #tsort_each_node."
full_name: TSort#each_strongly_connected_component_from
is_singleton: false
name: each_strongly_connected_component_from
params: (node, id_map={}, stack=[]) {|nodes| ...}
visibility: public
PK}[s����8ri/1.8/system/TSort/strongly_connected_components-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns strongly connected components as an array of arrays of nodes. The array is sorted from children to parents. Each elements of the array represents a strongly connected component.
full_name: TSort#strongly_connected_components
is_singleton: false
name: strongly_connected_components
params: ()
visibility: public
PK}[Pp�ѡ�$ri/1.8/system/TSort/cdesc-TSort.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: TSort implements topological sorting using Tarjan's algorithm for strongly connected components.
- !ruby/struct:SM::Flow::P 
  body: TSort is designed to be able to be used with any object which can be interpreted as a directed graph.
- !ruby/struct:SM::Flow::P 
  body: TSort requires two methods to interpret an object as a graph, tsort_each_node and tsort_each_child.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: tsort_each_node is used to iterate for all nodes over a graph.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: tsort_each_child is used to iterate for child nodes of a given node.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: The equality of nodes are defined by eql? and hash since TSort uses Hash internally.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: A Simple Example
- !ruby/struct:SM::Flow::P 
  body: "The following example demonstrates how to mix the TSort module into an existing class (in this case, Hash). Here, we're treating each key in the hash as a node in the graph, and so we simply alias the required #tsort_each_node method to Hash's #each_key method. For each key in the hash, the associated value is an array of the node's child nodes. This choice in turn leads to our implementation of the required #tsort_each_child method, which fetches the array of child nodes and then iterates over that array using the user-supplied block."
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'tsort'\n\n  class Hash\n    include TSort\n    alias tsort_each_node each_key\n    def tsort_each_child(node, &amp;block)\n      fetch(node).each(&amp;block)\n    end\n  end\n\n  {1=&gt;[2, 3], 2=&gt;[3], 3=&gt;[], 4=&gt;[]}.tsort\n  #=&gt; [3, 2, 1, 4]\n\n  {1=&gt;[2], 2=&gt;[3, 4], 3=&gt;[2], 4=&gt;[]}.strongly_connected_components\n  #=&gt; [[4], [2, 3], [1]]\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: A More Realistic Example
- !ruby/struct:SM::Flow::P 
  body: "A very simple `make' like tool can be implemented as follows:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'tsort'\n\n  class Make\n    def initialize\n      @dep = {}\n      @dep.default = []\n    end\n\n    def rule(outputs, inputs=[], &amp;block)\n      triple = [outputs, inputs, block]\n      outputs.each {|f| @dep[f] = [triple]}\n      @dep[triple] = inputs\n    end\n\n    def build(target)\n      each_strongly_connected_component_from(target) {|ns|\n        if ns.length != 1\n          fs = ns.delete_if {|n| Array === n}\n          raise TSort::Cyclic.new(&quot;cyclic dependencies: #{fs.join ', '}&quot;)\n        end\n        n = ns.first\n        if Array === n\n          outputs, inputs, block = n\n          inputs_time = inputs.map {|f| File.mtime f}.max\n          begin\n            outputs_time = outputs.map {|f| File.mtime f}.min\n          rescue Errno::ENOENT\n            outputs_time = nil\n          end\n          if outputs_time == nil ||\n             inputs_time != nil &amp;&amp; outputs_time &lt;= inputs_time\n            sleep 1 if inputs_time != nil &amp;&amp; inputs_time.to_i == Time.now.to_i\n            block.call\n          end\n        end\n      }\n    end\n\n    def tsort_each_child(node, &amp;block)\n      @dep[node].each(&amp;block)\n    end\n    include TSort\n  end\n\n  def command(arg)\n    print arg, &quot;\\n&quot;\n    system arg\n  end\n\n  m = Make.new\n  m.rule(%w[t1]) { command 'date &gt; t1' }\n  m.rule(%w[t2]) { command 'date &gt; t2' }\n  m.rule(%w[t3]) { command 'date &gt; t3' }\n  m.rule(%w[t4], %w[t1 t3]) { command 'cat t1 t3 &gt; t4' }\n  m.rule(%w[t5], %w[t4 t2]) { command 'cat t4 t2 &gt; t5' }\n  m.build('t5')\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Bugs
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "'tsort.rb' is wrong name because this library uses Tarjan's algorithm for strongly connected components. Although 'strongly_connected_components.rb' is correct but too long."
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 2
  text: References
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: R.
    body: E. Tarjan, &quot;Depth First Search and Linear Graph Algorithms&quot;,
  type: :UPPERALPHA
- !ruby/struct:SM::Flow::P 
  body: <em>SIAM Journal on Computing</em>, Vol. 1, No. 2, pp. 146-160, June 1972.
constants: []

full_name: TSort
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: each_strongly_connected_component
- !ruby/object:RI::MethodSummary 
  name: each_strongly_connected_component_from
- !ruby/object:RI::MethodSummary 
  name: strongly_connected_components
- !ruby/object:RI::MethodSummary 
  name: tsort
- !ruby/object:RI::MethodSummary 
  name: tsort_each
- !ruby/object:RI::MethodSummary 
  name: tsort_each_child
- !ruby/object:RI::MethodSummary 
  name: tsort_each_node
name: TSort
superclass: 
PK}[�/�++%ri/1.8/system/TSort/tsort_each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: node
comment: 
- !ruby/struct:SM::Flow::P 
  body: "The iterator version of the #tsort method. <tt><em>obj</em>.tsort_each</tt> is similar to <tt><em>obj</em>.tsort.each</tt>, but modification of <em>obj</em> during the iteration may lead to unexpected results."
- !ruby/struct:SM::Flow::P 
  body: "#tsort_each returns <tt>nil</tt>. If there is a cycle, TSort::Cyclic is raised."
full_name: TSort#tsort_each
is_singleton: false
name: tsort_each
params: ( {|node| ...}
visibility: public
PK}[��i���,ri/1.8/system/TSort/Cyclic/cdesc-Cyclic.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: TSort::Cyclic
includes: []

instance_methods: []

name: Cyclic
superclass: StandardError
PK}[��MM8ri/1.8/system/RDoc/Fortran95parser/find_arguments-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return comments of definitions of arguments
- !ruby/struct:SM::Flow::P 
  body: If &quot;all&quot; argument is true, information of all arguments are returned. If &quot;modified_params&quot; is true, list of arguments are decorated, for example, optional arguments are parenthetic as &quot;[arg]&quot;.
full_name: RDoc::Fortran95parser#find_arguments
is_singleton: false
name: find_arguments
params: (args, text, all=nil, indent=nil, modified_params=nil)
visibility: private
PK}[R����8ri/1.8/system/RDoc/Fortran95parser/comment_out%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Comment out checker
full_name: RDoc::Fortran95parser#comment_out?
is_singleton: false
name: comment_out?
params: (line)
visibility: private
PK}[F��		Ari/1.8/system/RDoc/Fortran95parser/parse_program_or_module-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Fortran95parser#parse_program_or_module
is_singleton: false
name: parse_program_or_module
params: (container, code, visibility=:public, external=nil)
visibility: private
PK}[�O�Ӿ�2ri/1.8/system/RDoc/Fortran95parser/progress-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Fortran95parser#progress
is_singleton: false
name: progress
params: (char)
visibility: private
PK}[Qn��GG9ri/1.8/system/RDoc/Fortran95parser/definition_info-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parse string argument &quot;text&quot;, and Return Array of Fortran95Definition object
full_name: RDoc::Fortran95parser#definition_info
is_singleton: false
name: definition_info
params: (text)
visibility: private
PK}[��r�MM6ri/1.8/system/RDoc/Fortran95parser/block_end%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Which &quot;line&quot; is end of block (module, program, block data, subroutine, function) statement ?
full_name: RDoc::Fortran95parser#block_end?
is_singleton: false
name: block_end?
params: (line)
visibility: private
PK}[�x�77>ri/1.8/system/RDoc/Fortran95parser/remove_header_marker-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: header marker &quot;=&quot;, &quot;==&quot;, ... are removed
full_name: RDoc::Fortran95parser#remove_header_marker
is_singleton: false
name: remove_header_marker
params: (text)
visibility: private
PK}[���?ri/1.8/system/RDoc/Fortran95parser/collect_first_comment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Collect comment for file entity
full_name: RDoc::Fortran95parser#collect_first_comment
is_singleton: false
name: collect_first_comment
params: (body)
visibility: private
PK}[��N�//8ri/1.8/system/RDoc/Fortran95parser/find_namelists-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return comments of definitions of namelists
full_name: RDoc::Fortran95parser#find_namelists
is_singleton: false
name: find_namelists
params: (text, before_contains=nil)
visibility: private
PK}[��u͕�7ri/1.8/system/RDoc/Fortran95parser/find_comments-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Comments just after module or subprogram, or arguments are returned. If &quot;COMMENTS_ARE_UPPER&quot; is true, comments just before modules or subprograms are returned
full_name: RDoc::Fortran95parser#find_comments
is_singleton: false
name: find_comments
params: (text)
visibility: private
PK}[3�c��Ari/1.8/system/RDoc/Fortran95parser/remove_private_comments-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Fortran95parser#remove_private_comments
is_singleton: false
name: remove_private_comments
params: (body)
visibility: private
PK}[�Y7�9ri/1.8/system/RDoc/Fortran95parser/find_visibility-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Find visibility
full_name: RDoc::Fortran95parser#find_visibility
is_singleton: false
name: find_visibility
params: (container, subname, visibility_info)
visibility: private
PK}[��:�""?ri/1.8/system/RDoc/Fortran95parser/semicolon_to_linefeed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Semicolons are replaced to line feed.
full_name: RDoc::Fortran95parser#semicolon_to_linefeed
is_singleton: false
name: semicolon_to_linefeed
params: (text)
visibility: private
PK}[�����.ri/1.8/system/RDoc/Fortran95parser/scan-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: define code constructs
full_name: RDoc::Fortran95parser#scan
is_singleton: false
name: scan
params: ()
visibility: public
PK}[��SS8ri/1.8/system/RDoc/Fortran95parser/block_start%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Which &quot;line&quot; is start of block (module, program, block data, subroutine, function) statement ?
full_name: RDoc::Fortran95parser#block_start?
is_singleton: false
name: block_start?
params: (line)
visibility: private
PK}[��>,,?ri/1.8/system/RDoc/Fortran95parser/remove_trailing_alias-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Remove &quot;Alias for&quot; in end of comments
full_name: RDoc::Fortran95parser#remove_trailing_alias
is_singleton: false
name: remove_trailing_alias
params: (text)
visibility: private
PK}[y���  -ri/1.8/system/RDoc/Fortran95parser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: prepare to parse a Fortran 95 file
full_name: RDoc::Fortran95parser::new
is_singleton: true
name: new
params: (top_level, file_name, body, options, stats)
visibility: public
PK}[�WE[

<ri/1.8/system/RDoc/Fortran95parser/continuous_line%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Continuous line checker
full_name: RDoc::Fortran95parser#continuous_line?
is_singleton: false
name: continuous_line?
params: (line)
visibility: private
PK}[��;�33@ri/1.8/system/RDoc/Fortran95parser/check_external_aliases-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Check external aliases
full_name: RDoc::Fortran95parser#check_external_aliases
is_singleton: false
name: check_external_aliases
params: (subname, params, comment, test=nil)
visibility: private
PK}[����8ri/1.8/system/RDoc/Fortran95parser/set_visibility-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set visibility
- !ruby/struct:SM::Flow::P 
  body: "&quot;subname&quot; element of &quot;visibility_info&quot; is deleted."
full_name: RDoc::Fortran95parser#set_visibility
is_singleton: false
name: set_visibility
params: (container, subname, visibility_default, visibility_info)
visibility: private
PK}[�n���	�	=ri/1.8/system/RDoc/Fortran95parser/cdesc-Fortran95parser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: See rdoc/parsers/parse_f95.rb
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "\"false\":"
      body: Comments are below source code
    - !ruby/struct:SM::Flow::LI 
      label: "\"true\" :"
      body: Comments are upper source code
    type: :NOTE
  name: COMMENTS_ARE_UPPER
  value: "false"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Internal alias message
  name: INTERNAL_ALIAS_MES
  value: "\"Alias for\""
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: External alias message
  name: EXTERNAL_ALIAS_MES
  value: "\"The entity is\""
full_name: RDoc::Fortran95parser
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: block_end?
- !ruby/object:RI::MethodSummary 
  name: block_start?
- !ruby/object:RI::MethodSummary 
  name: check_external_aliases
- !ruby/object:RI::MethodSummary 
  name: check_public_methods
- !ruby/object:RI::MethodSummary 
  name: collect_first_comment
- !ruby/object:RI::MethodSummary 
  name: comment_out?
- !ruby/object:RI::MethodSummary 
  name: continuous_line?
- !ruby/object:RI::MethodSummary 
  name: definition_info
- !ruby/object:RI::MethodSummary 
  name: find_arguments
- !ruby/object:RI::MethodSummary 
  name: find_comments
- !ruby/object:RI::MethodSummary 
  name: find_namelists
- !ruby/object:RI::MethodSummary 
  name: find_visibility
- !ruby/object:RI::MethodSummary 
  name: initialize_external_method
- !ruby/object:RI::MethodSummary 
  name: initialize_public_method
- !ruby/object:RI::MethodSummary 
  name: parse_program_or_module
- !ruby/object:RI::MethodSummary 
  name: parse_subprogram
- !ruby/object:RI::MethodSummary 
  name: parse_visibility
- !ruby/object:RI::MethodSummary 
  name: progress
- !ruby/object:RI::MethodSummary 
  name: remove_empty_head_lines
- !ruby/object:RI::MethodSummary 
  name: remove_header_marker
- !ruby/object:RI::MethodSummary 
  name: remove_private_comments
- !ruby/object:RI::MethodSummary 
  name: remove_trailing_alias
- !ruby/object:RI::MethodSummary 
  name: scan
- !ruby/object:RI::MethodSummary 
  name: semicolon_to_linefeed
- !ruby/object:RI::MethodSummary 
  name: set_visibility
- !ruby/object:RI::MethodSummary 
  name: united_to_one_line
name: Fortran95parser
superclass: Object
PK}[ex���Uri/1.8/system/RDoc/Fortran95parser/Fortran95Definition/cdesc-Fortran95Definition.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Suffix of array
  name: arraysuffix
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Comments
  name: comment
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Initial Value
  name: inivalue
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Flag of non documentation
  name: nodoc
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Types of variable
  name: types
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Name of variable
  name: varname
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Information of arguments of subroutines and functions in Fortran95
constants: []

full_name: RDoc::Fortran95parser::Fortran95Definition
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: include_attr?
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Fortran95Definition
superclass: Object
PK}[��"���Ari/1.8/system/RDoc/Fortran95parser/Fortran95Definition/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Fortran95parser::Fortran95Definition::new
is_singleton: true
name: new
params: (varname, types, inivalue, arraysuffix, comment, nodoc=false)
visibility: public
PK}[B�/&&Mri/1.8/system/RDoc/Fortran95parser/Fortran95Definition/include_attr%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: If attr is included, true is returned
full_name: RDoc::Fortran95parser::Fortran95Definition#include_attr?
is_singleton: false
name: include_attr?
params: (attr)
visibility: public
PK}[�uH��Bri/1.8/system/RDoc/Fortran95parser/Fortran95Definition/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Fortran95parser::Fortran95Definition#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK}[S�P>ri/1.8/system/RDoc/Fortran95parser/check_public_methods-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Check public_methods
full_name: RDoc::Fortran95parser#check_public_methods
is_singleton: false
name: check_public_methods
params: (method, parent)
visibility: private
PK}[���:ri/1.8/system/RDoc/Fortran95parser/parse_visibility-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parse visibility
full_name: RDoc::Fortran95parser#parse_visibility
is_singleton: false
name: parse_visibility
params: (code, default, container)
visibility: private
PK}[W(?��Dri/1.8/system/RDoc/Fortran95parser/initialize_external_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create method for external alias
- !ruby/struct:SM::Flow::P 
  body: If argument &quot;internal&quot; is true, file is ignored.
full_name: RDoc::Fortran95parser#initialize_external_method
is_singleton: false
name: initialize_external_method
params: (new, old, params, file, comment, token=nil, internal=nil, nolink=nil)
visibility: private
PK}[HA�A��:ri/1.8/system/RDoc/Fortran95parser/parse_subprogram-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parse arguments, comment, code of subroutine and function. Return AnyMethod object.
full_name: RDoc::Fortran95parser#parse_subprogram
is_singleton: false
name: parse_subprogram
params: (subprogram, params, comment, code, before_contains=nil, function=nil, prefix=nil)
visibility: private
PK}[
��--Bri/1.8/system/RDoc/Fortran95parser/initialize_public_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create method for internal alias
full_name: RDoc::Fortran95parser#initialize_public_method
is_singleton: false
name: initialize_public_method
params: (method, parent)
visibility: private
PK}[A��""Ari/1.8/system/RDoc/Fortran95parser/remove_empty_head_lines-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Empty lines in header are removed
full_name: RDoc::Fortran95parser#remove_empty_head_lines
is_singleton: false
name: remove_empty_head_lines
params: (text)
visibility: private
PK}[�WLvcc<ri/1.8/system/RDoc/Fortran95parser/united_to_one_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Continuous lines are united.
- !ruby/struct:SM::Flow::P 
  body: Comments in continuous lines are removed.
full_name: RDoc::Fortran95parser#united_to_one_line
is_singleton: false
name: united_to_one_line
params: (f90src)
visibility: private
PK}[�$�S$ri/1.8/system/RDoc/no_comment-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Report the fact that no doc comment count be found
full_name: RDoc::no_comment
is_singleton: true
name: no_comment
params: ()
visibility: private
PK}[t�T��&ri/1.8/system/RDoc/Constant/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Constant::new
is_singleton: true
name: new
params: (name, value, comment)
visibility: public
PK}[�$H۩�/ri/1.8/system/RDoc/Constant/cdesc-Constant.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: value
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Represent a constant
constants: []

full_name: RDoc::Constant
includes: []

instance_methods: []

name: Constant
superclass: CodeObject
PK}[�?����*ri/1.8/system/RDoc/extract_sections-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Given an array of flow items and an array of section names, extract those sections from the flow which have headings corresponding to a section name in the list. Return them in the order of names in the <tt>sections</tt> array.
full_name: RDoc::extract_sections
is_singleton: true
name: extract_sections
params: (flow, sections)
visibility: private
PK}[`�aa-ri/1.8/system/RDoc/Require/cdesc-Require.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: a required file
constants: []

full_name: RDoc::Require
includes: []

instance_methods: []

name: Require
superclass: CodeObject
PK}[����%ri/1.8/system/RDoc/Require/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Require::new
is_singleton: true
name: new
params: (name, comment)
visibility: public
PK}[�{L���ri/1.8/system/RDoc/usage-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Display usage information from the comment at the top of the file. String arguments identify specific sections of the comment to display. An optional integer first argument specifies the exit status (defaults to 0)
full_name: RDoc::usage
is_singleton: true
name: usage
params: (*args)
visibility: public
PK}[z���'ri/1.8/system/RDoc/usage_no_exit-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Display usage
full_name: RDoc::usage_no_exit
is_singleton: true
name: usage_no_exit
params: (*args)
visibility: public
PK}[$�m	��+ri/1.8/system/RDoc/Context/add_class-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Context#add_class
is_singleton: false
name: add_class
params: (class_type, name, superclass)
visibility: public
PK}[雏��@ri/1.8/system/RDoc/Context/initialize_classes_and_modules-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Context#initialize_classes_and_modules
is_singleton: false
name: initialize_classes_and_modules
params: ()
visibility: public
PK}[�C6���,ri/1.8/system/RDoc/Context/add_module-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Context#add_module
is_singleton: false
name: add_module
params: (class_type, name)
visibility: public
PK}[U4x{''/ri/1.8/system/RDoc/Context/defined_in%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return true if at least part of this thing was defined in <tt>file</tt>
full_name: RDoc::Context#defined_in?
is_singleton: false
name: defined_in?
params: (file)
visibility: public
PK}[g��F��+ri/1.8/system/RDoc/Context/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: allow us to sort modules by name
full_name: RDoc::Context#<=>
is_singleton: false
name: <=>
params: (other)
visibility: public
PK}[ދ�#��)ri/1.8/system/RDoc/Context/classes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: map the class hash to an array externally
full_name: RDoc::Context#classes
is_singleton: false
name: classes
params: ()
visibility: public
PK}[�@[pp4ri/1.8/system/RDoc/Context/set_visibility_for-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Given an array <tt>methods</tt> of method names, set the visibility of the corresponding AnyMethod object
full_name: RDoc::Context#set_visibility_for
is_singleton: false
name: set_visibility_for
params: (methods, vis, singleton=false)
visibility: public
PK}[�t�=ri/1.8/system/RDoc/Context/find_enclosing_module_named-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: find a module at a higher scope
full_name: RDoc::Context#find_enclosing_module_named
is_singleton: false
name: find_enclosing_module_named
params: (name)
visibility: public
PK}[|$��)ri/1.8/system/RDoc/Context/modules-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: map the module hash to an array externally
full_name: RDoc::Context#modules
is_singleton: false
name: modules
params: ()
visibility: public
PK}[��2R��3ri/1.8/system/RDoc/Context/find_module_named-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Find a named module
full_name: RDoc::Context#find_module_named
is_singleton: false
name: find_module_named
params: (name)
visibility: public
PK}[��/z��(ri/1.8/system/RDoc/Context/add_to-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Context#add_to
is_singleton: false
name: add_to
params: (array, thing)
visibility: public
PK}[�|ee-ri/1.8/system/RDoc/Context/find_symbol-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Look up the given symbol. If method is non-nil, then we assume the symbol references a module that contains that method
full_name: RDoc::Context#find_symbol
is_singleton: false
name: find_symbol
params: (symbol, method=nil)
visibility: public
PK}[~���5ri/1.8/system/RDoc/Context/add_class_or_module-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Context#add_class_or_module
is_singleton: false
name: add_class_or_module
params: (collection, class_type, name, superclass=nil)
visibility: public
PK}[�#����/ri/1.8/system/RDoc/Context/add_attribute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Context#add_attribute
is_singleton: false
name: add_attribute
params: (an_attribute)
visibility: public
PK}[���+ri/1.8/system/RDoc/Context/add_alias-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Context#add_alias
is_singleton: false
name: add_alias
params: (an_alias)
visibility: public
PK}[�d�**<ri/1.8/system/RDoc/Context/find_instance_method_named-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Find a named instance method, or return nil
full_name: RDoc::Context#find_instance_method_named
is_singleton: false
name: find_instance_method_named
params: (name)
visibility: private
PK}[�pX��/ri/1.8/system/RDoc/Context/each_constant-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: c
comment: 
full_name: RDoc::Context#each_constant
is_singleton: false
name: each_constant
params: () {|c| ...}
visibility: public
PK}[LO�3ri/1.8/system/RDoc/Context/find_method_named-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Find a named method, or return nil
full_name: RDoc::Context#find_method_named
is_singleton: false
name: find_method_named
params: (name)
visibility: private
PK}[�{9-ri/1.8/system/RDoc/Context/add_require-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Requires always get added to the top-level (file) context
full_name: RDoc::Context#add_require
is_singleton: false
name: add_require
params: (a_require)
visibility: public
PK}[�Um�7ri/1.8/system/RDoc/Context/ongoing_visibility%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Change the default visibility for new methods
full_name: RDoc::Context#ongoing_visibility=
is_singleton: false
name: ongoing_visibility=
params: (vis)
visibility: public
PK}[݋���%ri/1.8/system/RDoc/Context/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Context::new
is_singleton: true
name: new
params: ()
visibility: public
PK}[�藗((2ri/1.8/system/RDoc/Context/each_classmodule-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: m
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterate over all the classes and modules in this object
full_name: RDoc::Context#each_classmodule
is_singleton: false
name: each_classmodule
params: () {|m| ...}
visibility: public
PK}[�jn�1ri/1.8/system/RDoc/Context/record_location-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Record the file that we happen to find it in
full_name: RDoc::Context#record_location
is_singleton: false
name: record_location
params: (toplevel)
visibility: public
PK}[E��E44-ri/1.8/system/RDoc/Context/cdesc-Context.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: aliases
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: attributes
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: constants
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: in_files
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: includes
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: method_list
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: requires
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: sections
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: visibility
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A Context is something that can hold modules, classes, methods, attributes, aliases, requires, and includes. Classes, modules, and files are all Contexts.
constants: []

full_name: RDoc::Context
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: add_alias
- !ruby/object:RI::MethodSummary 
  name: add_attribute
- !ruby/object:RI::MethodSummary 
  name: add_class
- !ruby/object:RI::MethodSummary 
  name: add_class_or_module
- !ruby/object:RI::MethodSummary 
  name: add_constant
- !ruby/object:RI::MethodSummary 
  name: add_include
- !ruby/object:RI::MethodSummary 
  name: add_method
- !ruby/object:RI::MethodSummary 
  name: add_module
- !ruby/object:RI::MethodSummary 
  name: add_require
- !ruby/object:RI::MethodSummary 
  name: add_to
- !ruby/object:RI::MethodSummary 
  name: classes
- !ruby/object:RI::MethodSummary 
  name: defined_in?
- !ruby/object:RI::MethodSummary 
  name: each_attribute
- !ruby/object:RI::MethodSummary 
  name: each_classmodule
- !ruby/object:RI::MethodSummary 
  name: each_constant
- !ruby/object:RI::MethodSummary 
  name: each_method
- !ruby/object:RI::MethodSummary 
  name: find_attribute_named
- !ruby/object:RI::MethodSummary 
  name: find_constant_named
- !ruby/object:RI::MethodSummary 
  name: find_enclosing_module_named
- !ruby/object:RI::MethodSummary 
  name: find_instance_method_named
- !ruby/object:RI::MethodSummary 
  name: find_local_symbol
- !ruby/object:RI::MethodSummary 
  name: find_method_named
- !ruby/object:RI::MethodSummary 
  name: find_module_named
- !ruby/object:RI::MethodSummary 
  name: find_symbol
- !ruby/object:RI::MethodSummary 
  name: initialize_classes_and_modules
- !ruby/object:RI::MethodSummary 
  name: initialize_methods_etc
- !ruby/object:RI::MethodSummary 
  name: modules
- !ruby/object:RI::MethodSummary 
  name: ongoing_visibility=
- !ruby/object:RI::MethodSummary 
  name: record_location
- !ruby/object:RI::MethodSummary 
  name: remove_classes_and_modules
- !ruby/object:RI::MethodSummary 
  name: remove_methods_etc
- !ruby/object:RI::MethodSummary 
  name: set_current_section
- !ruby/object:RI::MethodSummary 
  name: set_visibility_for
- !ruby/object:RI::MethodSummary 
  name: toplevel
name: Context
superclass: CodeObject
PK}[����44<ri/1.8/system/RDoc/Context/remove_classes_and_modules-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "and remove classes and modules when we see a :nodoc: all"
full_name: RDoc::Context#remove_classes_and_modules
is_singleton: false
name: remove_classes_and_modules
params: ()
visibility: public
PK}[�*�		5ri/1.8/system/RDoc/Context/set_current_section-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Handle sections
full_name: RDoc::Context#set_current_section
is_singleton: false
name: set_current_section
params: (title, comment)
visibility: public
PK}[�)���-ri/1.8/system/RDoc/Context/Section/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Context::Section::new
is_singleton: true
name: new
params: (title, comment)
visibility: public
PK}[5���5ri/1.8/system/RDoc/Context/Section/cdesc-Section.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: comment
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: sequence
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: title
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: RDoc::Context::Section
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: set_comment
name: Section
superclass: Object
PK}[����5ri/1.8/system/RDoc/Context/Section/set_comment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Context::Section#set_comment
is_singleton: false
name: set_comment
params: (comment)
visibility: private
PK}[�%W�5ri/1.8/system/RDoc/Context/find_constant_named-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Find a named constant, or return nil
full_name: RDoc::Context#find_constant_named
is_singleton: false
name: find_constant_named
params: (name)
visibility: private
PK}[��|�6ri/1.8/system/RDoc/Context/find_attribute_named-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Find a named attribute, or return nil
full_name: RDoc::Context#find_attribute_named
is_singleton: false
name: find_attribute_named
params: (name)
visibility: private
PK}[��bb4ri/1.8/system/RDoc/Context/remove_methods_etc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: If a class's documentation is turned off after we've started collecting methods etc., we need to remove the ones we have
full_name: RDoc::Context#remove_methods_etc
is_singleton: false
name: remove_methods_etc
params: ()
visibility: public
PK}[�MR��-ri/1.8/system/RDoc/Context/each_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: m
comment: 
full_name: RDoc::Context#each_method
is_singleton: false
name: each_method
params: () {|m| ...}
visibility: public
PK}[��+���8ri/1.8/system/RDoc/Context/initialize_methods_etc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Context#initialize_methods_etc
is_singleton: false
name: initialize_methods_etc
params: ()
visibility: public
PK}[�c]��*ri/1.8/system/RDoc/Context/toplevel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the toplevel that owns us
full_name: RDoc::Context#toplevel
is_singleton: false
name: toplevel
params: ()
visibility: public
PK}[!��,ri/1.8/system/RDoc/Context/add_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Context#add_method
is_singleton: false
name: add_method
params: (a_method)
visibility: public
PK}[qHd`��3ri/1.8/system/RDoc/Context/find_local_symbol-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Context#find_local_symbol
is_singleton: false
name: find_local_symbol
params: (symbol)
visibility: public
PK}[� '��-ri/1.8/system/RDoc/Context/add_include-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Context#add_include
is_singleton: false
name: add_include
params: (an_include)
visibility: public
PK}[S)����.ri/1.8/system/RDoc/Context/add_constant-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Context#add_constant
is_singleton: false
name: add_constant
params: (const)
visibility: public
PK}[�W����0ri/1.8/system/RDoc/Context/each_attribute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: a
comment: 
full_name: RDoc::Context#each_attribute
is_singleton: false
name: each_attribute
params: () {|a| ...}
visibility: public
PK}[�M
���.ri/1.8/system/RDoc/C_Parser/handle_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RDoc::C_Parser#handle_attr
is_singleton: false
name: handle_attr
params: (var_name, attr_name, reader, writer)
visibility: private
PK}[�b����3ri/1.8/system/RDoc/C_Parser/handle_tab_width-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::C_Parser#handle_tab_width
is_singleton: false
name: handle_tab_width
params: (body)
visibility: private
PK}[~���yy5ri/1.8/system/RDoc/C_Parser/find_const_comment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Finds a comment matching <tt>type</tt> and <tt>const_name</tt> either above the comment or in the matching Document- section.
full_name: RDoc::C_Parser#find_const_comment
is_singleton: false
name: find_const_comment
params: (type, const_name)
visibility: private
PK}[�3ۉ3ri/1.8/system/RDoc/C_Parser/handle_ifdefs_in-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Removes #ifdefs that would otherwise confuse us"
full_name: RDoc::C_Parser#handle_ifdefs_in
is_singleton: false
name: handle_ifdefs_in
params: (body)
visibility: private
PK}[{��}��+ri/1.8/system/RDoc/C_Parser/progress-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RDoc::C_Parser#progress
is_singleton: false
name: progress
params: (char)
visibility: private
PK}[��c��8ri/1.8/system/RDoc/C_Parser/find_override_comment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RDoc::C_Parser#find_override_comment
is_singleton: false
name: find_override_comment
params: (meth_name)
visibility: private
PK}[m�(��5ri/1.8/system/RDoc/C_Parser/find_class_comment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Look for class or module documentation above Init_+class_name+(void), in a Document-class <tt>class_name</tt> (or module) comment or above an rb_define_class (or module). If a comment is supplied above a matching Init_ and a rb_define_class the Init_ comment is used.
- !ruby/struct:SM::Flow::VERB 
  body: "  /*\n   * This is a comment for Foo\n   */\n  Init_Foo(void) {\n      VALUE cFoo = rb_define_class(&quot;Foo&quot;, rb_cObject);\n  }\n\n  /*\n   * Document-class: Foo\n   * This is a comment for Foo\n   */\n  Init_foo(void) {\n      VALUE cFoo = rb_define_class(&quot;Foo&quot;, rb_cObject);\n  }\n\n  /*\n   * This is a comment for Foo\n   */\n  VALUE cFoo = rb_define_class(&quot;Foo&quot;, rb_cObject);\n"
full_name: RDoc::C_Parser#find_class_comment
is_singleton: false
name: find_class_comment
params: (class_name, class_meth)
visibility: private
PK}[����-ri/1.8/system/RDoc/C_Parser/do_classes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RDoc::C_Parser#do_classes
is_singleton: false
name: do_classes
params: ()
visibility: private
PK}[��l�0ri/1.8/system/RDoc/C_Parser/handle_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RDoc::C_Parser#handle_method
is_singleton: false
name: handle_method
params: (type, var_name, meth_name, meth_body, param_count, source_file = nil)
visibility: private
PK}[c{9��:ri/1.8/system/RDoc/C_Parser/remove_private_comments-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::C_Parser#remove_private_comments
is_singleton: false
name: remove_private_comments
params: (comment)
visibility: private
PK}[˩{v��/ri/1.8/system/RDoc/C_Parser/do_constants-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RDoc::C_Parser#do_constants
is_singleton: false
name: do_constants
params: ()
visibility: private
PK}[���22'ri/1.8/system/RDoc/C_Parser/scan-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Extract the classes/modules and methods from a C file and return the corresponding top-level object
full_name: RDoc::C_Parser#scan
is_singleton: false
name: scan
params: ()
visibility: public
PK}[U,>=��6ri/1.8/system/RDoc/C_Parser/handle_class_module-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::C_Parser#handle_class_module
is_singleton: false
name: handle_class_module
params: (var_name, class_mod, class_name, parent, in_module)
visibility: private
PK}[m�p6��/ri/1.8/system/RDoc/C_Parser/cdesc-C_Parser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: progress
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "We attempt to parse C extension files. Basically we look for the standard patterns that you find in extensions: <tt>rb_define_class, rb_define_method</tt> and so on. We also try to find the corresponding C source for the methods and extract comments, but if we fail we don't worry too much."
- !ruby/struct:SM::Flow::P 
  body: "The comments associated with a Ruby method are extracted from the C comment block associated with the routine that <em>implements</em> that method, that is to say the method whose name is given in the <tt>rb_define_method</tt> call. For example, you might write:"
- !ruby/struct:SM::Flow::VERB 
  body: " /*\n  * Returns a new array that is a one-dimensional flattening of this\n  * array (recursively). That is, for every element that is an array,\n  * extract its elements into the new array.\n  *\n  *    s = [ 1, 2, 3 ]           #=&gt; [1, 2, 3]\n  *    t = [ 4, 5, 6, [7, 8] ]   #=&gt; [4, 5, 6, [7, 8]]\n  *    a = [ s, t, 9, 10 ]       #=&gt; [[1, 2, 3], [4, 5, 6, [7, 8]], 9, 10]\n  *    a.flatten                 #=&gt; [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n  */\n  static VALUE\n  rb_ary_flatten(ary)\n      VALUE ary;\n  {\n      ary = rb_obj_dup(ary);\n      rb_ary_flatten_bang(ary);\n      return ary;\n  }\n\n  ...\n\n  void\n  Init_Array()\n  {\n    ...\n    rb_define_method(rb_cArray, &quot;flatten&quot;, rb_ary_flatten, 0);\n"
- !ruby/struct:SM::Flow::P 
  body: Here RDoc will determine from the rb_define_method line that there's a method called &quot;flatten&quot; in class Array, and will look for the implementation in the method rb_ary_flatten. It will then use the comment from that method in the HTML output. This method must be in the same source file as the rb_define_method.
- !ruby/struct:SM::Flow::P 
  body: C classes can be diagrammed (see /tc/dl/ruby/ruby/error.c), and RDoc integrates C and Ruby source into one tree
- !ruby/struct:SM::Flow::P 
  body: "The comment blocks may include special directives:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "Document-class: <i>name</i>"
    body: This comment block is documentation for the given class. Use this when the <tt>Init_xxx</tt> method is not named after the class.
  - !ruby/struct:SM::Flow::LI 
    label: "Document-method: <i>name</i>"
    body: This comment documents the named method. Use when RDoc cannot automatically find the method from it's declaration
  - !ruby/struct:SM::Flow::LI 
    label: "call-seq:  <i>text up to an empty line</i>"
    body: Because C source doesn't give descriptive names to Ruby-level parameters, you need to document the calling sequence explicitly
  type: :LABELED
- !ruby/struct:SM::Flow::P 
  body: In addition, RDoc assumes by default that the C method implementing a Ruby function is in the same source file as the rb_define_method call. If this isn't the case, add the comment
- !ruby/struct:SM::Flow::VERB 
  body: "   rb_define_method(....);  // in: filename\n"
- !ruby/struct:SM::Flow::P 
  body: As an example, we might have an extension that defines multiple classes in its Init_xxx method. We could document them using
- !ruby/struct:SM::Flow::VERB 
  body: " /*\n  * Document-class:  MyClass\n  *\n  * Encapsulate the writing and reading of the configuration\n  * file. ...\n  */\n\n /*\n  * Document-method: read_value\n  *\n  * call-seq:\n  *   cfg.read_value(key)            -&gt; value\n  *   cfg.read_value(key} { |key| }  -&gt; value\n  *\n  * Return the value corresponding to <tt>key</tt> from the configuration.\n  * In the second form, if the key isn't found, invoke the\n  * block and return its value.\n  */\n"
constants: []

full_name: RDoc::C_Parser
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: do_aliases
- !ruby/object:RI::MethodSummary 
  name: do_classes
- !ruby/object:RI::MethodSummary 
  name: do_constants
- !ruby/object:RI::MethodSummary 
  name: do_includes
- !ruby/object:RI::MethodSummary 
  name: do_methods
- !ruby/object:RI::MethodSummary 
  name: find_attr_comment
- !ruby/object:RI::MethodSummary 
  name: find_body
- !ruby/object:RI::MethodSummary 
  name: find_class
- !ruby/object:RI::MethodSummary 
  name: find_class_comment
- !ruby/object:RI::MethodSummary 
  name: find_const_comment
- !ruby/object:RI::MethodSummary 
  name: find_modifiers
- !ruby/object:RI::MethodSummary 
  name: find_override_comment
- !ruby/object:RI::MethodSummary 
  name: handle_attr
- !ruby/object:RI::MethodSummary 
  name: handle_class_module
- !ruby/object:RI::MethodSummary 
  name: handle_constants
- !ruby/object:RI::MethodSummary 
  name: handle_ifdefs_in
- !ruby/object:RI::MethodSummary 
  name: handle_method
- !ruby/object:RI::MethodSummary 
  name: handle_tab_width
- !ruby/object:RI::MethodSummary 
  name: mangle_comment
- !ruby/object:RI::MethodSummary 
  name: progress
- !ruby/object:RI::MethodSummary 
  name: remove_commented_out_lines
- !ruby/object:RI::MethodSummary 
  name: remove_private_comments
- !ruby/object:RI::MethodSummary 
  name: scan
- !ruby/object:RI::MethodSummary 
  name: warn
name: C_Parser
superclass: Object
PK}[�8�T&ri/1.8/system/RDoc/C_Parser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: prepare to parse a C file
full_name: RDoc::C_Parser::new
is_singleton: true
name: new
params: (top_level, file_name, body, options, stats)
visibility: public
PK}["%��  1ri/1.8/system/RDoc/C_Parser/mangle_comment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Remove the /*'s and leading asterisks from C comments
full_name: RDoc::C_Parser#mangle_comment
is_singleton: false
name: mangle_comment
params: (comment)
visibility: private
PK}[0�x[[.ri/1.8/system/RDoc/C_Parser/do_includes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Look for includes of the form:"
- !ruby/struct:SM::Flow::VERB 
  body: "    rb_include_module(rb_cArray, rb_mEnumerable);\n"
full_name: RDoc::C_Parser#do_includes
is_singleton: false
name: do_includes
params: ()
visibility: private
PK}[>N���4ri/1.8/system/RDoc/C_Parser/find_attr_comment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RDoc::C_Parser#find_attr_comment
is_singleton: false
name: find_attr_comment
params: (attr_name)
visibility: private
PK}[~*
0ii=ri/1.8/system/RDoc/C_Parser/remove_commented_out_lines-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: removes lines that are commented out that might otherwise get picked up when scanning for classes and methods
full_name: RDoc::C_Parser#remove_commented_out_lines
is_singleton: false
name: remove_commented_out_lines
params: ()
visibility: private
PK}[IǷa��-ri/1.8/system/RDoc/C_Parser/do_methods-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RDoc::C_Parser#do_methods
is_singleton: false
name: do_methods
params: ()
visibility: private
PK}[�Ll_yy1ri/1.8/system/RDoc/C_Parser/find_modifiers-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "If the comment block contains a section that looks like:"
- !ruby/struct:SM::Flow::P 
  body: use it for the parameters.
full_name: RDoc::C_Parser#find_modifiers
is_singleton: false
name: find_modifiers
params: |
  Array.new
  Array.new(10)

visibility: private
PK}[�>��-ri/1.8/system/RDoc/C_Parser/do_aliases-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RDoc::C_Parser#do_aliases
is_singleton: false
name: do_aliases
params: ()
visibility: private
PK}[	�
��-ri/1.8/system/RDoc/C_Parser/find_class-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::C_Parser#find_class
is_singleton: false
name: find_class
params: (raw_name, name)
visibility: private
PK}[�z��00,ri/1.8/system/RDoc/C_Parser/find_body-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Find the C code corresponding to a Ruby method
full_name: RDoc::C_Parser#find_body
is_singleton: false
name: find_body
params: (meth_name, meth_obj, body, quiet = false)
visibility: private
PK}[UU����3ri/1.8/system/RDoc/C_Parser/handle_constants-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Adds constant comments. By providing some_value: at the start ofthe comment you can override the C value of the comment to give a friendly definition."
- !ruby/struct:SM::Flow::VERB 
  body: "  /* 300: The perfect score in bowling */\n  rb_define_const(cFoo, &quot;PERFECT&quot;, INT2FIX(300);\n"
- !ruby/struct:SM::Flow::P 
  body: Will override +INT2FIX(300)+ with the value +300+ in the output RDoc. Values may include quotes and escaped colons (\:).
full_name: RDoc::C_Parser#handle_constants
is_singleton: false
name: handle_constants
params: (type, var_name, const_name, definition)
visibility: private
PK}[뭙,��'ri/1.8/system/RDoc/C_Parser/warn-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::C_Parser#warn
is_singleton: false
name: warn
params: (msg)
visibility: private
PK}[<Z8��3ri/1.8/system/RDoc/NormalModule/is_module%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::NormalModule#is_module?
is_singleton: false
name: is_module?
params: ()
visibility: public
PK}[�2d�--7ri/1.8/system/RDoc/NormalModule/cdesc-NormalModule.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Module
constants: []

full_name: RDoc::NormalModule
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: is_module?
name: NormalModule
superclass: ClassModule
PK}[àg��"ri/1.8/system/RDoc/cdesc-RDoc.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: extract_sections
- !ruby/object:RI::MethodSummary 
  name: find_comment
- !ruby/object:RI::MethodSummary 
  name: gets
- !ruby/object:RI::MethodSummary 
  name: no_comment
- !ruby/object:RI::MethodSummary 
  name: usage
- !ruby/object:RI::MethodSummary 
  name: usage_no_exit
comment: 
- !ruby/struct:SM::Flow::H 
  level: 1
  text: CSS2 RDoc HTML template
- !ruby/struct:SM::Flow::P 
  body: This is a template for RDoc that uses XHTML 1.0 Transitional and dictates a bit more of the appearance of the output to cascading stylesheets than the default. It was designed for clean inline code display, and uses DHTMl to toggle the visbility of each method's source with each click on the '[source]' link.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Authors
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Michael Granger &lt;ged@FaerieMUD.org&gt;
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: Copyright (c) 2002, 2003 The FaerieMUD Consortium. Some rights reserved.
- !ruby/struct:SM::Flow::P 
  body: This work is licensed under the Creative Commons Attribution License. To view a copy of this license, visit http://creativecommons.org/licenses/by/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Ruby's built-in classes.
  name: KNOWN_CLASSES
  value: "{     \"rb_cObject\"           => \"Object\",     \"rb_cArray\"            => \"Array\",     \"rb_cBignum\"           => \"Bignum\",     \"rb_cClass\"            => \"Class\",     \"rb_cDir\"              => \"Dir\",     \"rb_cData\"             => \"Data\",     \"rb_cFalseClass\"       => \"FalseClass\",     \"rb_cFile\"             => \"File\",     \"rb_cFixnum\"           => \"Fixnum\",     \"rb_cFloat\"            => \"Float\",     \"rb_cHash\"             => \"Hash\",     \"rb_cInteger\"          => \"Integer\",     \"rb_cIO\"               => \"IO\",     \"rb_cModule\"           => \"Module\",     \"rb_cNilClass\"         => \"NilClass\",     \"rb_cNumeric\"          => \"Numeric\",     \"rb_cProc\"             => \"Proc\",     \"rb_cRange\"            => \"Range\",     \"rb_cRegexp\"           => \"Regexp\",     \"rb_cString\"           => \"String\",     \"rb_cSymbol\"           => \"Symbol\",     \"rb_cThread\"           => \"Thread\",     \"rb_cTime\"             => \"Time\",     \"rb_cTrueClass\"        => \"TrueClass\",     \"rb_cStruct\"           => \"Struct\",     \"rb_eException\"        => \"Exception\",     \"rb_eStandardError\"    => \"StandardError\",     \"rb_eSystemExit\"       => \"SystemExit\",     \"rb_eInterrupt\"        => \"Interrupt\",     \"rb_eSignal\"           => \"Signal\",     \"rb_eFatal\"            => \"Fatal\",     \"rb_eArgError\"         => \"ArgError\",     \"rb_eEOFError\"         => \"EOFError\",     \"rb_eIndexError\"       => \"IndexError\",     \"rb_eRangeError\"       => \"RangeError\",     \"rb_eIOError\"          => \"IOError\",     \"rb_eRuntimeError\"     => \"RuntimeError\",     \"rb_eSecurityError\"    => \"SecurityError\",     \"rb_eSystemCallError\"  => \"SystemCallError\",     \"rb_eTypeError\"        => \"TypeError\",     \"rb_eZeroDivError\"     => \"ZeroDivError\",     \"rb_eNotImpError\"      => \"NotImpError\",     \"rb_eNoMemError\"       => \"NoMemError\",     \"rb_eFloatDomainError\" => \"FloatDomainError\",     \"rb_eScriptError\"      => \"ScriptError\",     \"rb_eNameError\"        => \"NameError\",     \"rb_eSyntaxError\"      => \"SyntaxError\",     \"rb_eLoadError\"        => \"LoadError\",      \"rb_mKernel\"           => \"Kernel\",     \"rb_mComparable\"       => \"Comparable\",     \"rb_mEnumerable\"       => \"Enumerable\",     \"rb_mPrecision\"        => \"Precision\",     \"rb_mErrno\"            => \"Errno\",     \"rb_mFileTest\"         => \"FileTest\",     \"rb_mGC\"               => \"GC\",     \"rb_mMath\"             => \"Math\",     \"rb_mProcess\"          => \"Process\""
- !ruby/object:RI::Constant 
  comment: 
  name: GENERAL_MODIFIERS
  value: "[ 'nodoc' ].freeze"
- !ruby/object:RI::Constant 
  comment: 
  name: CLASS_MODIFIERS
  value: GENERAL_MODIFIERS
- !ruby/object:RI::Constant 
  comment: 
  name: ATTR_MODIFIERS
  value: GENERAL_MODIFIERS
- !ruby/object:RI::Constant 
  comment: 
  name: CONSTANT_MODIFIERS
  value: GENERAL_MODIFIERS
- !ruby/object:RI::Constant 
  comment: 
  name: METHOD_MODIFIERS
  value: GENERAL_MODIFIERS +      [ 'arg', 'args', 'yield', 'yields', 'notnew', 'not-new', 'not_new', 'doc' ]
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Name of the dotfile that contains the description of files to be processed in the current directory
  name: DOT_DOC_FILENAME
  value: "\".document\""
full_name: RDoc
includes: []

instance_methods: []

name: RDoc
superclass: 
PK}[�A���(ri/1.8/system/RDoc/Attr/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Attr#<=>
is_singleton: false
name: <=>
params: (other)
visibility: public
PK}[qا~~'ri/1.8/system/RDoc/Attr/cdesc-Attr.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: rw
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: text
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: visibility
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Represent attributes
constants: []

full_name: RDoc::Attr
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Attr
superclass: CodeObject
PK}[D*+��"ri/1.8/system/RDoc/Attr/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Attr::new
is_singleton: true
name: new
params: (text, name, rw, comment)
visibility: public
PK}[�bB:��#ri/1.8/system/RDoc/Attr/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Attr#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK}[��{�??1ri/1.8/system/RDoc/RDocError/cdesc-RDocError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: "Exception thrown by any rdoc error. Only the #message part is of use externally."
constants: []

full_name: RDoc::RDocError
includes: []

instance_methods: []

name: RDocError
superclass: Exception
PK}[�����#ri/1.8/system/RDoc/Alias/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Alias::new
is_singleton: true
name: new
params: (text, old_name, new_name, comment)
visibility: public
PK}[?ejQ��$ri/1.8/system/RDoc/Alias/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Alias#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK}[���ӡ�)ri/1.8/system/RDoc/Alias/cdesc-Alias.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: comment
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: new_name
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: old_name
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: text
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Represent an alias, which is an old_name/ new_name pair associated with a particular context
constants: []

full_name: RDoc::Alias
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Alias
superclass: CodeObject
PK}[��dJ��,ri/1.8/system/RDoc/RubyParser/peek_tk-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#peek_tk
is_singleton: false
name: peek_tk
params: ()
visibility: private
PK}[W+b��8ri/1.8/system/RDoc/RubyParser/parse_symbol_in_arg-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#parse_symbol_in_arg
is_singleton: false
name: parse_symbol_in_arg
params: ()
visibility: private
PK}[�J΁��5ri/1.8/system/RDoc/RubyParser/parse_statements-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#parse_statements
is_singleton: false
name: parse_statements
params: (container, single=NORMAL, current_method=nil, comment='')
visibility: private
PK}[ѳ�l��0ri/1.8/system/RDoc/RubyParser/skip_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#skip_method
is_singleton: false
name: skip_method
params: (container)
visibility: private
PK}[���[��Ari/1.8/system/RDoc/RubyParser/read_documentation_modifiers-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#read_documentation_modifiers
is_singleton: false
name: read_documentation_modifiers
params: (context, allow)
visibility: private
PK}[cě
��/ri/1.8/system/RDoc/RubyParser/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#parse_attr
is_singleton: false
name: parse_attr
params: (context, single, tk, comment)
visibility: private
PK}[�o��;;Fri/1.8/system/RDoc/RubyParser/get_constant_with_optional_parens-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get a constant that may be surrounded by parens
full_name: RDoc::RubyParser#get_constant_with_optional_parens
is_singleton: false
name: get_constant_with_optional_parens
params: ()
visibility: private
PK}[}z�M��:ri/1.8/system/RDoc/RubyParser/remove_token_listener-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#remove_token_listener
is_singleton: false
name: remove_token_listener
params: (obj)
visibility: private
PK}[��y111ri/1.8/system/RDoc/RubyParser/get_constant-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parse a constant, which might be qualified by one or more class or module names
full_name: RDoc::RubyParser#get_constant
is_singleton: false
name: get_constant
params: ()
visibility: private
PK}[?�����-ri/1.8/system/RDoc/RubyParser/progress-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#progress
is_singleton: false
name: progress
params: (char)
visibility: private
PK}[!_622Fri/1.8/system/RDoc/RubyParser/skip_optional_do_after_expression-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: while, until, and for have an optional
full_name: RDoc::RubyParser#skip_optional_do_after_expression
is_singleton: false
name: skip_optional_do_after_expression
params: ()
visibility: private
PK}[Ա�E��2ri/1.8/system/RDoc/RubyParser/parse_require-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#parse_require
is_singleton: false
name: parse_require
params: (context, comment)
visibility: private
PK}[?(�433:ri/1.8/system/RDoc/RubyParser/collect_first_comment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Look for the first comment in a file that isn't a shebang line.
full_name: RDoc::RubyParser#collect_first_comment
is_singleton: false
name: collect_first_comment
params: ()
visibility: private
PK}[{�w��/ri/1.8/system/RDoc/RubyParser/get_tkread-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#get_tkread
is_singleton: false
name: get_tkread
params: ()
visibility: private
PK}[��tE��:ri/1.8/system/RDoc/RubyParser/parse_call_parameters-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#parse_call_parameters
is_singleton: false
name: parse_call_parameters
params: (tk)
visibility: private
PK}[v�o���2ri/1.8/system/RDoc/RubyParser/parse_include-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#parse_include
is_singleton: false
name: parse_include
params: (context, comment)
visibility: private
PK}[�R^M��<ri/1.8/system/RDoc/RubyParser/remove_private_comments-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#remove_private_comments
is_singleton: false
name: remove_private_comments
params: (comment)
visibility: private
PK}[����6ri/1.8/system/RDoc/RubyParser/skip_for_variable-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: skip the var [in] part of a 'for' statement
full_name: RDoc::RubyParser#skip_for_variable
is_singleton: false
name: skip_for_variable
params: ()
visibility: private
PK}[�nO��*ri/1.8/system/RDoc/RubyParser/error-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#error
is_singleton: false
name: error
params: (msg)
visibility: private
PK}[Ѧ�<��;ri/1.8/system/RDoc/RubyParser/look_for_directives_in-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Look for directives in a normal comment block:"
- !ruby/struct:SM::Flow::VERB 
  body: "  #--       - don't display comment from this point forward\n"
- !ruby/struct:SM::Flow::P 
  body: This routine modifies it's parameter
full_name: RDoc::RubyParser#look_for_directives_in
is_singleton: false
name: look_for_directives_in
params: (context, comment)
visibility: private
PK}[�)����<ri/1.8/system/RDoc/RubyParser/parse_method_parameters-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Capture the method's parameters. Along the way, look for a comment containing
- !ruby/struct:SM::Flow::VERB 
  body: "   # yields: ....\n"
- !ruby/struct:SM::Flow::P 
  body: and add this as the block_params for the method
full_name: RDoc::RubyParser#parse_method_parameters
is_singleton: false
name: parse_method_parameters
params: (method)
visibility: private
PK}[��?�Eri/1.8/system/RDoc/RubyParser/parse_method_or_yield_parameters-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#parse_method_or_yield_parameters
is_singleton: false
name: parse_method_or_yield_parameters
params: (method=nil, modifiers=METHOD_MODIFIERS)
visibility: private
PK}[d=�:��)ri/1.8/system/RDoc/RubyParser/scan-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#scan
is_singleton: false
name: scan
params: ()
visibility: public
PK}[+[h�8ri/1.8/system/RDoc/RubyParser/get_class_or_module-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "Look for the name of a class of module (optionally with a leading :"
    body: or
  - !ruby/struct:SM::Flow::LI 
    label: "with :"
    body: separated named) and return the ultimate name and container
  type: :NOTE
full_name: RDoc::RubyParser#get_class_or_module
is_singleton: false
name: get_class_or_module
params: (container)
visibility: private
PK}[R����(ri/1.8/system/RDoc/RubyParser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser::new
is_singleton: true
name: new
params: (top_level, file_name, content, options, stats)
visibility: public
PK}[�����1ri/1.8/system/RDoc/RubyParser/skip_tkspace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#skip_tkspace
is_singleton: false
name: skip_tkspace
params: (skip_nl = true)
visibility: private
PK}[��O��9ri/1.8/system/RDoc/RubyParser/skip_tkspace_comment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#skip_tkspace_comment
is_singleton: false
name: skip_tkspace_comment
params: (skip_nl = true)
visibility: private
PK}[k�����0ri/1.8/system/RDoc/RubyParser/parse_alias-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#parse_alias
is_singleton: false
name: parse_alias
params: (context, single, tk, comment)
visibility: private
PK}[e}w�<<<ri/1.8/system/RDoc/RubyParser/get_class_specification-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a superclass, which can be either a constant of an expression
full_name: RDoc::RubyParser#get_class_specification
is_singleton: false
name: get_class_specification
params: ()
visibility: private
PK}[Vd_��.ri/1.8/system/RDoc/RubyParser/peek_read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#peek_read
is_singleton: false
name: peek_read
params: ()
visibility: private
PK}[���k��-ri/1.8/system/RDoc/RubyParser/get_bool-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#get_bool
is_singleton: false
name: get_bool
params: ()
visibility: private
PK}[�P���3ri/1.8/system/RDoc/RubyParser/parse_constant-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#parse_constant
is_singleton: false
name: parse_constant
params: (container, single, tk, comment)
visibility: private
PK}[F�%��1ri/1.8/system/RDoc/RubyParser/make_message-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#make_message
is_singleton: false
name: make_message
params: (msg)
visibility: private
PK}[y5���7ri/1.8/system/RDoc/RubyParser/add_token_listener-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#add_token_listener
is_singleton: false
name: add_token_listener
params: (obj)
visibility: private
PK}[�Qo��>ri/1.8/system/RDoc/RubyParser/parse_toplevel_statements-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#parse_toplevel_statements
is_singleton: false
name: parse_toplevel_statements
params: (container)
visibility: private
PK}[S�
<��5ri/1.8/system/RDoc/RubyParser/parse_symbol_arg-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#parse_symbol_arg
is_singleton: false
name: parse_symbol_arg
params: (no = nil)
visibility: private
PK}[�����0ri/1.8/system/RDoc/RubyParser/parse_class-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#parse_class
is_singleton: false
name: parse_class
params: (container, single, tk, comment, &block)
visibility: private
PK}[�,%��3ri/1.8/system/RDoc/RubyParser/cdesc-RubyParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: NORMAL
  value: "\"::\""
- !ruby/object:RI::Constant 
  comment: 
  name: SINGLE
  value: "\"<<\""
full_name: RDoc::RubyParser
includes: 
- !ruby/object:RI::IncludedModule 
  name: RubyToken
- !ruby/object:RI::IncludedModule 
  name: TokenStream
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_token_listener
- !ruby/object:RI::MethodSummary 
  name: collect_first_comment
- !ruby/object:RI::MethodSummary 
  name: error
- !ruby/object:RI::MethodSummary 
  name: get_bool
- !ruby/object:RI::MethodSummary 
  name: get_class_or_module
- !ruby/object:RI::MethodSummary 
  name: get_class_specification
- !ruby/object:RI::MethodSummary 
  name: get_constant
- !ruby/object:RI::MethodSummary 
  name: get_constant_with_optional_parens
- !ruby/object:RI::MethodSummary 
  name: get_symbol_or_name
- !ruby/object:RI::MethodSummary 
  name: get_tk
- !ruby/object:RI::MethodSummary 
  name: get_tkread
- !ruby/object:RI::MethodSummary 
  name: look_for_directives_in
- !ruby/object:RI::MethodSummary 
  name: make_message
- !ruby/object:RI::MethodSummary 
  name: parse_alias
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_attr_accessor
- !ruby/object:RI::MethodSummary 
  name: parse_call_parameters
- !ruby/object:RI::MethodSummary 
  name: parse_class
- !ruby/object:RI::MethodSummary 
  name: parse_constant
- !ruby/object:RI::MethodSummary 
  name: parse_include
- !ruby/object:RI::MethodSummary 
  name: parse_method
- !ruby/object:RI::MethodSummary 
  name: parse_method_or_yield_parameters
- !ruby/object:RI::MethodSummary 
  name: parse_method_parameters
- !ruby/object:RI::MethodSummary 
  name: parse_module
- !ruby/object:RI::MethodSummary 
  name: parse_require
- !ruby/object:RI::MethodSummary 
  name: parse_statements
- !ruby/object:RI::MethodSummary 
  name: parse_symbol_arg
- !ruby/object:RI::MethodSummary 
  name: parse_symbol_in_arg
- !ruby/object:RI::MethodSummary 
  name: parse_toplevel_statements
- !ruby/object:RI::MethodSummary 
  name: parse_visibility
- !ruby/object:RI::MethodSummary 
  name: parse_yield
- !ruby/object:RI::MethodSummary 
  name: parse_yield_parameters
- !ruby/object:RI::MethodSummary 
  name: peek_read
- !ruby/object:RI::MethodSummary 
  name: peek_tk
- !ruby/object:RI::MethodSummary 
  name: progress
- !ruby/object:RI::MethodSummary 
  name: read_directive
- !ruby/object:RI::MethodSummary 
  name: read_documentation_modifiers
- !ruby/object:RI::MethodSummary 
  name: remove_private_comments
- !ruby/object:RI::MethodSummary 
  name: remove_token_listener
- !ruby/object:RI::MethodSummary 
  name: scan
- !ruby/object:RI::MethodSummary 
  name: skip_for_variable
- !ruby/object:RI::MethodSummary 
  name: skip_method
- !ruby/object:RI::MethodSummary 
  name: skip_optional_do_after_expression
- !ruby/object:RI::MethodSummary 
  name: skip_tkspace
- !ruby/object:RI::MethodSummary 
  name: skip_tkspace_comment
- !ruby/object:RI::MethodSummary 
  name: unget_tk
- !ruby/object:RI::MethodSummary 
  name: warn
name: RubyParser
superclass: Object
PK}[���1ri/1.8/system/RDoc/RubyParser/parse_module-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#parse_module
is_singleton: false
name: parse_module
params: (container, single, tk, comment)
visibility: private
PK}[�����1ri/1.8/system/RDoc/RubyParser/parse_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#parse_method
is_singleton: false
name: parse_method
params: (container, single, tk, comment)
visibility: private
PK}[��L���0ri/1.8/system/RDoc/RubyParser/parse_yield-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#parse_yield
is_singleton: false
name: parse_yield
params: (context, single, tk, method)
visibility: private
PK}[]����;ri/1.8/system/RDoc/RubyParser/parse_yield_parameters-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#parse_yield_parameters
is_singleton: false
name: parse_yield_parameters
params: ()
visibility: private
PK}[2�
���5ri/1.8/system/RDoc/RubyParser/parse_visibility-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#parse_visibility
is_singleton: false
name: parse_visibility
params: (container, single, tk)
visibility: private
PK}[�ێ��-ri/1.8/system/RDoc/RubyParser/unget_tk-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#unget_tk
is_singleton: false
name: unget_tk
params: (tk)
visibility: private
PK}[�
�ll3ri/1.8/system/RDoc/RubyParser/read_directive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Directives are modifier comments that can appear after class, module, or method names. For example
- !ruby/struct:SM::Flow::VERB 
  body: "  def fred    # :yields:  a, b\n"
- !ruby/struct:SM::Flow::P 
  body: or
- !ruby/struct:SM::Flow::VERB 
  body: "  class SM  # :nodoc:\n"
- !ruby/struct:SM::Flow::P 
  body: we return the directive name and any parameters as a two element array
full_name: RDoc::RubyParser#read_directive
is_singleton: false
name: read_directive
params: (allowed)
visibility: private
PK}[�Z�p��+ri/1.8/system/RDoc/RubyParser/get_tk-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#get_tk
is_singleton: false
name: get_tk
params: ()
visibility: private
PK}[`�-��)ri/1.8/system/RDoc/RubyParser/warn-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#warn
is_singleton: false
name: warn
params: (msg)
visibility: private
PK}[!����8ri/1.8/system/RDoc/RubyParser/parse_attr_accessor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#parse_attr_accessor
is_singleton: false
name: parse_attr_accessor
params: (context, single, tk, comment)
visibility: private
PK}[oQ���7ri/1.8/system/RDoc/RubyParser/get_symbol_or_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::RubyParser#get_symbol_or_name
is_singleton: false
name: get_symbol_or_name
params: ()
visibility: private
PK}[-��C��0ri/1.8/system/RDoc/Diagram/find_full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Diagram#find_full_name
is_singleton: false
name: find_full_name
params: (name, mod)
visibility: private
PK}[������0ri/1.8/system/RDoc/Diagram/convert_to_png-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Diagram#convert_to_png
is_singleton: false
name: convert_to_png
params: (file_base, graph)
visibility: private
PK}[a8����-ri/1.8/system/RDoc/Diagram/draw_module-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Diagram#draw_module
is_singleton: false
name: draw_module
params: (mod, graph, toplevel = false, file = nil)
visibility: private
PK}[a�[��3ri/1.8/system/RDoc/Diagram/wrap_in_image_map-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Extract the client-side image map from dot, and use it to generate the imagemap proper. Return the whole &lt;map&gt;..&lt;img&gt; combination, suitable for inclusion on the page
full_name: RDoc::Diagram#wrap_in_image_map
is_singleton: false
name: wrap_in_image_map
params: (src, dot)
visibility: private
PK}[F�m::%ri/1.8/system/RDoc/Diagram/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pass in the set of top level objects. The method also creates the subdirectory to hold the images
full_name: RDoc::Diagram::new
is_singleton: true
name: new
params: (info, options)
visibility: public
PK}[�]���-ri/1.8/system/RDoc/Diagram/add_classes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Diagram#add_classes
is_singleton: false
name: add_classes
params: (container, graph, file = nil )
visibility: private
PK}[͖���,ri/1.8/system/RDoc/Diagram/find_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RDoc::Diagram#find_names
is_singleton: false
name: find_names
params: (mod)
visibility: private
PK}[�j�rr&ri/1.8/system/RDoc/Diagram/draw-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Draw the diagrams. We traverse the files, drawing a diagram for each. We also traverse each top-level class and module in that file drawing a diagram for these too.
full_name: RDoc::Diagram#draw
is_singleton: false
name: draw
params: ()
visibility: public
PK}[��F���-ri/1.8/system/RDoc/Diagram/cdesc-Diagram.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Draw a set of diagrams representing the modules and classes in the system. We draw one diagram for each file, and one for each toplevel class or module. This means there will be overlap. However, it also means that you'll get better context for objects.
- !ruby/struct:SM::Flow::P 
  body: To use, simply
- !ruby/struct:SM::Flow::VERB 
  body: "  d = Diagram.new(info)   # pass in collection of top level infos\n  d.draw\n"
- !ruby/struct:SM::Flow::P 
  body: The results will be written to the <tt>dot</tt> subdirectory. The process also sets the <tt>diagram</tt> attribute in each object it graphs to the name of the file containing the image. This can be used by output generators to insert images.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: FONT
  value: "\"Arial\""
- !ruby/object:RI::Constant 
  comment: 
  name: DOT_PATH
  value: "\"dot\""
full_name: RDoc::Diagram
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_classes
- !ruby/object:RI::MethodSummary 
  name: convert_to_png
- !ruby/object:RI::MethodSummary 
  name: draw
- !ruby/object:RI::MethodSummary 
  name: draw_module
- !ruby/object:RI::MethodSummary 
  name: find_full_name
- !ruby/object:RI::MethodSummary 
  name: find_names
- !ruby/object:RI::MethodSummary 
  name: wrap_in_image_map
name: Diagram
superclass: Object
PK}[��H�ZZri/1.8/system/RDoc/gets-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Find the first comment in the file (that isn't a shebang line) If the file doesn't start with a comment, report the fact and return empty string
full_name: RDoc::gets
is_singleton: true
name: gets
params: (file)
visibility: private
PK}[0��=��6ri/1.8/system/RDoc/RDoc/list_files_in_directory-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a list of the files to be processed in a directory. We know that this directory doesn't have a .document file, so we're looking for real files. However we may well contain subdirectories which must be tested for .document files
full_name: RDoc::RDoc#list_files_in_directory
is_singleton: false
name: list_files_in_directory
params: (dir, options)
visibility: private
PK}[�P
4��'ri/1.8/system/RDoc/RDoc/document-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Format up one or more files according to the given arguments. For simplicity, <em>argv</em> is an array of strings, equivalent to the strings that would be passed on the command line. (This isn't a coincidence, as we <em>do</em> pass in ARGV when running interactively). For a list of options, see rdoc/rdoc.rb. By default, output will be stored in a directory called <tt>doc</tt> below the current directory, so make sure you're somewhere writable before invoking.
- !ruby/struct:SM::Flow::P 
  body: "Throws: RDocError on error"
full_name: RDoc::RDoc#document
is_singleton: false
name: document
params: (argv)
visibility: public
PK}[4j>��'ri/1.8/system/RDoc/RDoc/cdesc-RDoc.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: "Encapsulate the production of rdoc documentation. Basically you can use this as you would invoke rdoc from the command line:"
- !ruby/struct:SM::Flow::VERB 
  body: "   rdoc = RDoc::RDoc.new\n   rdoc.document(args)\n"
- !ruby/struct:SM::Flow::P 
  body: where <em>args</em> is an array of strings, each corresponding to an argument you'd give rdoc on the command line. See rdoc/rdoc.rb for details.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: This is the list of output generators that we support
  name: Generator
  value: Struct.new(:file_name, :class_name, :key)
- !ruby/object:RI::Constant 
  comment: 
  name: GENERATORS
  value: "{}"
full_name: RDoc::RDoc
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: document
- !ruby/object:RI::MethodSummary 
  name: error
- !ruby/object:RI::MethodSummary 
  name: list_files_in_directory
- !ruby/object:RI::MethodSummary 
  name: normalized_file_list
- !ruby/object:RI::MethodSummary 
  name: output_flag_file
- !ruby/object:RI::MethodSummary 
  name: parse_dot_doc_file
- !ruby/object:RI::MethodSummary 
  name: parse_files
- !ruby/object:RI::MethodSummary 
  name: setup_output_dir
- !ruby/object:RI::MethodSummary 
  name: update_output_dir
name: RDoc
superclass: Object
PK}[�ݰ���1ri/1.8/system/RDoc/RDoc/parse_dot_doc_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The .document file contains a list of file and directory name patterns, representing candidates for documentation. It may also contain comments (starting with '#')
full_name: RDoc::RDoc#parse_dot_doc_file
is_singleton: false
name: parse_dot_doc_file
params: (in_dir, filename, options)
visibility: private
PK}[փN�0ri/1.8/system/RDoc/RDoc/update_output_dir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Update the flag file in an output directory.
full_name: RDoc::RDoc#update_output_dir
is_singleton: false
name: update_output_dir
params: (op_dir, time)
visibility: private
PK}[�$&&*ri/1.8/system/RDoc/RDoc/parse_files-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parse each file on the command line, recursively entering directories
full_name: RDoc::RDoc#parse_files
is_singleton: false
name: parse_files
params: (options)
visibility: private
PK}[{���$ri/1.8/system/RDoc/RDoc/error-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Report an error message and exit
full_name: RDoc::RDoc#error
is_singleton: false
name: error
params: (msg)
visibility: private
PK}[l����/ri/1.8/system/RDoc/RDoc/setup_output_dir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create an output dir if it doesn't exist. If it does exist, but doesn't contain the flag file <tt>created.rid</tt> then we refuse to use it, as we may clobber some manually generated documentation
full_name: RDoc::RDoc#setup_output_dir
is_singleton: false
name: setup_output_dir
params: (op_dir, force)
visibility: private
PK}[��͡3ri/1.8/system/RDoc/RDoc/normalized_file_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Given a list of files and directories, create a list of all the Ruby files they contain.
- !ruby/struct:SM::Flow::P 
  body: If <tt>force_doc</tt> is true, we always add the given files. If false, only add files that we guarantee we can parse It is true when looking at files given on the command line, false when recursing through subdirectories.
- !ruby/struct:SM::Flow::P 
  body: The effect of this is that if you want a file with a non- standard extension parsed, you must name it explicity.
full_name: RDoc::RDoc#normalized_file_list
is_singleton: false
name: normalized_file_list
params: (options, relative_files, force_doc = false, exclude_pattern=nil)
visibility: private
PK}[�s;�''/ri/1.8/system/RDoc/RDoc/output_flag_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the path name of the flag file in an output directory.
full_name: RDoc::RDoc#output_flag_file
is_singleton: false
name: output_flag_file
params: (op_dir)
visibility: private
PK}[�75ri/1.8/system/RDoc/NormalClass/cdesc-NormalClass.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Normal classes
constants: []

full_name: RDoc::NormalClass
includes: []

instance_methods: []

name: NormalClass
superclass: ClassModule
PK}[�Mtl��-ri/1.8/system/RDoc/AnyMethod/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::AnyMethod#<=>
is_singleton: false
name: <=>
params: (other)
visibility: public
PK}[>�E{{1ri/1.8/system/RDoc/AnyMethod/cdesc-AnyMethod.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: aliases
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: block_params
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: call_seq
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: dont_rename_initialize
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: is_alias_for
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: singleton
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: visibility
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: AnyMethod is the base class for objects representing methods
constants: []

full_name: RDoc::AnyMethod
includes: 
- !ruby/object:RI::IncludedModule 
  name: TokenStream
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: add_alias
- !ruby/object:RI::MethodSummary 
  name: param_seq
- !ruby/object:RI::MethodSummary 
  name: to_s
name: AnyMethod
superclass: CodeObject
PK}[ki�H��-ri/1.8/system/RDoc/AnyMethod/param_seq-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::AnyMethod#param_seq
is_singleton: false
name: param_seq
params: ()
visibility: public
PK}[�O��-ri/1.8/system/RDoc/AnyMethod/add_alias-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::AnyMethod#add_alias
is_singleton: false
name: add_alias
params: (method)
visibility: public
PK}[��WR��'ri/1.8/system/RDoc/AnyMethod/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::AnyMethod::new
is_singleton: true
name: new
params: (text, name)
visibility: public
PK}[��ʫ�(ri/1.8/system/RDoc/AnyMethod/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::AnyMethod#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK}[Q�3H/ri/1.8/system/RDoc/ClassModule/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the fully qualified name of this class or module
full_name: RDoc::ClassModule#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK}[]�* ��.ri/1.8/system/RDoc/ClassModule/http_url-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::ClassModule#http_url
is_singleton: false
name: http_url
params: (prefix)
visibility: public
PK}[�?�d2ri/1.8/system/RDoc/ClassModule/is_module%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return <tt>true</tt> if this object represents a module
full_name: RDoc::ClassModule#is_module?
is_singleton: false
name: is_module?
params: ()
visibility: public
PK}[�MO��5ri/1.8/system/RDoc/ClassModule/cdesc-ClassModule.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: diagram
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: superclass
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: ClassModule is the base class for objects representing either a class or a module.
constants: []

full_name: RDoc::ClassModule
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: find_class_named
- !ruby/object:RI::MethodSummary 
  name: full_name
- !ruby/object:RI::MethodSummary 
  name: http_url
- !ruby/object:RI::MethodSummary 
  name: is_module?
- !ruby/object:RI::MethodSummary 
  name: to_s
name: ClassModule
superclass: Context
PK}[�����)ri/1.8/system/RDoc/ClassModule/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::ClassModule::new
is_singleton: true
name: new
params: (name, superclass = nil)
visibility: public
PK}[�PB���*ri/1.8/system/RDoc/ClassModule/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: to_s is simply for debugging
full_name: RDoc::ClassModule#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK}[�$jO��6ri/1.8/system/RDoc/ClassModule/find_class_named-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::ClassModule#find_class_named
is_singleton: false
name: find_class_named
params: (name)
visibility: public
PK}[#�!��&ri/1.8/system/RDoc/find_comment-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::find_comment
is_singleton: true
name: find_comment
params: (file)
visibility: private
PK}[1g�oo2ri/1.8/system/RDoc/ParserFactory/parser_for-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Find the correct parser for a particular file name. Return a SimpleParser for ones that we don't know
full_name: RDoc::ParserFactory::parser_for
is_singleton: true
name: parser_for
params: (top_level, file_name, body, options, stats)
visibility: public
PK}[��A�KK<ri/1.8/system/RDoc/ParserFactory/parse_files_matching-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Record the fact that a particular class parses files that match a given extension
full_name: RDoc::ParserFactory#parse_files_matching
is_singleton: false
name: parse_files_matching
params: (regexp)
visibility: public
PK}[Z�a1ri/1.8/system/RDoc/ParserFactory/can_parse-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a parser that can handle a particular extension
full_name: RDoc::ParserFactory::can_parse
is_singleton: true
name: can_parse
params: (file_name)
visibility: public
PK}[�	[u��7ri/1.8/system/RDoc/ParserFactory/alias_extension-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Alias an extension to another extension. After this call, files ending &quot;new_ext&quot; will be parsed using the same parser as &quot;old_ext&quot;
full_name: RDoc::ParserFactory::alias_extension
is_singleton: true
name: alias_extension
params: (old_ext, new_ext)
visibility: public
PK}[Ϧq**9ri/1.8/system/RDoc/ParserFactory/cdesc-ParserFactory.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: alias_extension
- !ruby/object:RI::MethodSummary 
  name: can_parse
- !ruby/object:RI::MethodSummary 
  name: parser_for
comment: 
- !ruby/struct:SM::Flow::P 
  body: A parser is simple a class that implements
- !ruby/struct:SM::Flow::VERB 
  body: "  #initialize(file_name, body, options)\n"
- !ruby/struct:SM::Flow::P 
  body: and
- !ruby/struct:SM::Flow::VERB 
  body: "  #scan\n"
- !ruby/struct:SM::Flow::P 
  body: The initialize method takes a file name to be used, the body of the file, and an RDoc::Options object. The scan method is then called to return an appropriately parsed TopLevel code object.
- !ruby/struct:SM::Flow::P 
  body: The ParseFactory is used to redirect to the correct parser given a filename extension. This magic works because individual parsers have to register themselves with us as they are loaded in. The do this using the following incantation
- !ruby/struct:SM::Flow::VERB 
  body: "   require &quot;rdoc/parsers/parsefactory&quot;\n\n   module RDoc\n\n     class XyzParser\n       extend ParseFactory                  &lt;&lt;&lt;&lt;\n       parse_files_matching /\\.xyz$/        &lt;&lt;&lt;&lt;\n\n       def initialize(file_name, body, options)\n         ...\n       end\n\n       def scan\n         ...\n       end\n     end\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: Just to make life interesting, if we suspect a plain text file, we also look for a shebang line just in case it's a potential shell script
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Parsers
  value: Struct.new(:regexp, :parser)
full_name: RDoc::ParserFactory
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse_files_matching
name: ParserFactory
superclass: 
PK}[ܹ��5ri/1.8/system/RDoc/SingleClass/cdesc-SingleClass.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Singleton classes
constants: []

full_name: RDoc::SingleClass
includes: []

instance_methods: []

name: SingleClass
superclass: ClassModule
PK}[Z8��%ri/1.8/system/RDoc/Stats/print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Stats#print
is_singleton: false
name: print
params: ()
visibility: public
PK}[���gg)ri/1.8/system/RDoc/Stats/cdesc-Stats.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: num_classes
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: num_files
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: num_methods
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: num_modules
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Simple stats collector
constants: []

full_name: RDoc::Stats
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: print
name: Stats
superclass: Object
PK}[(j��#ri/1.8/system/RDoc/Stats/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Stats::new
is_singleton: true
name: new
params: ()
visibility: public
PK}[<h���'ri/1.8/system/RDoc/Page/cdesc-Page.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: This is how you define the HTML that RDoc generates. Simply create a file in rdoc/generators/html_templates that creates the module RDoc::Page and populate it as described below. Then invoke rdoc using the --template &lt;name of your file&gt; option, and your template will be used.
- !ruby/struct:SM::Flow::P 
  body: "The constants defining pages use a simple templating system:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: The templating system is passed a hash. Keys in the hash correspond to tags on this page. The tag %abc% is looked up in the hash, and is replaced by the corresponding hash value.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Some tags are optional. You can detect this using IF/ENDIF
  - !ruby/struct:SM::Flow::VERB 
    body: "   IF: title\n   The value of title is %title%\n   ENDIF: title\n"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "Some entries in the hash have values that are arrays, where each entry in the array is itself a hash. These are used to generate lists using the START: construct. For example, given a hash containing"
  - !ruby/struct:SM::Flow::VERB 
    body: "   { 'people' =&gt; [ { 'name' =&gt; 'Fred', 'age' =&gt; '12' },\n                   { 'name' =&gt; 'Mary', 'age' =&gt; '21' } ]\n"
  - !ruby/struct:SM::Flow::P 
    body: You could generate a simple table using
  - !ruby/struct:SM::Flow::VERB 
    body: "   &lt;table&gt;\n   START:people\n     &lt;tr&gt;&lt;td&gt;%name%&lt;td&gt;%age%&lt;/tr&gt;\n   END:people\n   &lt;/table&gt;\n"
  - !ruby/struct:SM::Flow::P 
    body: These lists can be nested to an arbitrary depth
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "the construct HREF:url:name: generates &lt;a href=&quot;%url%&quot;&gt;%name%&lt;/a&gt; if <tt>url</tt> is defined in the hash, or %name% otherwise."
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: Your file must contain the following constants
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*FONTS*"
    body: a list of fonts to be used
  - !ruby/struct:SM::Flow::LI 
    label: "*STYLE*"
    body: a CSS section (without the &lt;style&gt; or comments). This is used to generate a style.css file
  - !ruby/struct:SM::Flow::LI 
    label: "*BODY*"
    body: "The main body of all non-index RDoc pages. BODY will contain two !INCLUDE!s. The first is used to include a document-type specific header (FILE_PAGE or CLASS_PAGE). The second include is for the method list (METHOD_LIST). THe body is passed:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "%title%:"
      body: the page's title
    - !ruby/struct:SM::Flow::LI 
      label: "%style_url%:"
      body: the url of a style sheet for this page
    - !ruby/struct:SM::Flow::LI 
      label: "%diagram%:"
      body: the optional URL of a diagram for this page
    - !ruby/struct:SM::Flow::LI 
      label: "%description%:"
      body: a (potentially multi-paragraph) string containing the description for th file/class/module.
    - !ruby/struct:SM::Flow::LI 
      label: "%requires%:"
      body: an optional list of %aref%/%name% pairs, one for each module required by this file.
    - !ruby/struct:SM::Flow::LI 
      label: "%methods%:"
      body: an optional list of %aref%/%name%, one for each method documented on this page. This is intended to be an index.
    - !ruby/struct:SM::Flow::LI 
      label: "%attributes%:"
      body: "An optional list. For each attribute it contains:"
    - !ruby/object:SM::Flow::LIST 
      contents: 
      - !ruby/struct:SM::Flow::LI 
        label: "%name%:"
        body: the attribute name
      - !ruby/struct:SM::Flow::LI 
        label: "%rw%:"
        body: r/o, w/o, or r/w
      - !ruby/struct:SM::Flow::LI 
        label: "%a_desc%:"
        body: description of the attribute
      type: :NOTE
    - !ruby/struct:SM::Flow::LI 
      label: "%classlist%:"
      body: An optional string containing an already-formatted list of classes and modules documented in this file
    type: :NOTE
  - !ruby/struct:SM::Flow::P 
    body: For FILE_PAGE entries, the body will be passed
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "%short_name%:"
      body: The name of the file
    - !ruby/struct:SM::Flow::LI 
      label: "%full_path%:"
      body: The full path to the file
    - !ruby/struct:SM::Flow::LI 
      label: "%dtm_modified%:"
      body: The date/time the file was last changed
    type: :NOTE
  - !ruby/struct:SM::Flow::P 
    body: For class and module pages, the body will be passed
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "%classmod%:"
      body: The name of the class or module
    - !ruby/struct:SM::Flow::LI 
      label: "%files%:"
      body: "A list. For each file this class is defined in, it contains:"
    - !ruby/object:SM::Flow::LIST 
      contents: 
      - !ruby/struct:SM::Flow::LI 
        label: "%full_path_url%:"
        body: an (optional) URL of the RDoc page for this file
      - !ruby/struct:SM::Flow::LI 
        label: "%full_path%:"
        body: the name of the file
      type: :NOTE
    - !ruby/struct:SM::Flow::LI 
      label: "%par_url%:"
      body: The (optional) URL of the RDoc page documenting this class's parent class
    - !ruby/struct:SM::Flow::LI 
      label: "%parent%:"
      body: The name of this class's parent.
    type: :NOTE
  - !ruby/struct:SM::Flow::P 
    body: "For both files and classes, the body is passed the following information on includes and methods:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "%includes%:"
      body: Optional list of included modules. For each, it receives
    - !ruby/object:SM::Flow::LIST 
      contents: 
      - !ruby/struct:SM::Flow::LI 
        label: "%aref%:"
        body: optional URL to RDoc page for the module
      - !ruby/struct:SM::Flow::LI 
        label: "%name%:"
        body: the name of the module
      type: :NOTE
    - !ruby/struct:SM::Flow::LI 
      label: "%method_list%:"
      body: Optional list of methods of a particular class and category.
    type: :NOTE
  - !ruby/struct:SM::Flow::P 
    body: "Each method list entry contains:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "%type%:"
      body: public/private/protected
    - !ruby/struct:SM::Flow::LI 
      label: "%category%:"
      body: instance/class
    - !ruby/struct:SM::Flow::LI 
      label: "%methods%:"
      body: a list of method descriptions
    type: :NOTE
  - !ruby/struct:SM::Flow::P 
    body: "Each method description contains:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "%aref%:"
      body: a target aref, used when referencing this method description. You should code this as &lt;a name=&quot;%aref%&quot;&gt;
    - !ruby/struct:SM::Flow::LI 
      label: "%codeurl%:"
      body: the optional URL to the page containing this method's source code.
    - !ruby/struct:SM::Flow::LI 
      label: "%name%:"
      body: the method's name
    - !ruby/struct:SM::Flow::LI 
      label: "%params%:"
      body: the method's parameters
    - !ruby/struct:SM::Flow::LI 
      label: "%callseq%:"
      body: a full calling sequence
    - !ruby/struct:SM::Flow::LI 
      label: "%m_desc%:"
      body: the (potentially multi-paragraph) description of this method.
    type: :NOTE
  - !ruby/struct:SM::Flow::LI 
    label: "*CLASS_PAGE*"
    body: Header for pages documenting classes and modules. See BODY above for the available parameters.
  - !ruby/struct:SM::Flow::LI 
    label: "*FILE_PAGE*"
    body: Header for pages documenting files. See BODY above for the available parameters.
  - !ruby/struct:SM::Flow::LI 
    label: "*METHOD_LIST*"
    body: Controls the display of the listing of methods. See BODY for parameters.
  - !ruby/struct:SM::Flow::LI 
    label: "*INDEX*"
    body: The top-level index page. For a browser-like environment define a frame set that includes the file, class, and method indices. Passed
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "%title%:"
      body: title of page
    - !ruby/struct:SM::Flow::LI 
      label: "%initial_page% :"
      body: url of initial page to display
    type: :NOTE
  - !ruby/struct:SM::Flow::LI 
    label: "*CLASS_INDEX*"
    body: "Individual files for the three indexes. Passed:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "%index_url%:"
      body: URL of main index page
    - !ruby/struct:SM::Flow::LI 
      label: "%entries%:"
      body: List of
    - !ruby/object:SM::Flow::LIST 
      contents: 
      - !ruby/struct:SM::Flow::LI 
        label: "%name%:"
        body: name of an index entry
      - !ruby/struct:SM::Flow::LI 
        label: "%href%:"
        body: url of corresponding page
      type: :NOTE
    type: :NOTE
  - !ruby/struct:SM::Flow::LI 
    label: "*METHOD_INDEX*"
    body: Same as CLASS_INDEX for methods
  - !ruby/struct:SM::Flow::LI 
    label: "*FILE_INDEX*"
    body: Same as CLASS_INDEX for methods
  - !ruby/struct:SM::Flow::LI 
    label: "*FR_INDEX_BODY*"
    body: A wrapper around CLASS_INDEX, METHOD_INDEX, and FILE_INDEX. If those index strings contain the complete HTML for the output, then FR_INDEX_BODY can simply be !INCLUDE!
  - !ruby/struct:SM::Flow::LI 
    label: "*SRC_PAGE*"
    body: Page used to display source code. Passed %title% and %code%, the latter being a multi-line string of code.
  type: :LABELED
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: HPP_FILE
  value: "%{ [OPTIONS] Auto Index = Yes Compatibility=1.1 or later Compiled file=%opname%.chm Contents file=contents.hhc Full-text search=Yes Index file=index.hhk Language=0x409 English(United States) Title=%title%  [FILES] START:all_html_files %html_file_name% END:all_html_files }"
- !ruby/object:RI::Constant 
  comment: 
  name: CONTENTS
  value: "%{ <!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\"> <HTML> <HEAD> <meta name=\"GENERATOR\" content=\"Microsoft&reg; HTML Help Workshop 4.1\"> <!-- Sitemap 1.0 --> </HEAD><BODY> <OBJECT type=\"text/site properties\">         <param name=\"Foreground\" value=\"0x80\">         <param name=\"Window Styles\" value=\"0x800025\">         <param name=\"ImageType\" value=\"Folder\"> </OBJECT> <UL> START:contents         <LI> <OBJECT type=\"text/sitemap\">                 <param name=\"Name\" value=\"%c_name%\">                 <param name=\"Local\" value=\"%ref%\">                 </OBJECT> IF:methods <ul> START:methods         <LI> <OBJECT type=\"text/sitemap\">                 <param name=\"Name\" value=\"%name%\">                 <param name=\"Local\" value=\"%aref%\">                 </OBJECT> END:methods </ul> ENDIF:methods         </LI> END:contents </UL> </BODY></HTML> }"
- !ruby/object:RI::Constant 
  comment: 
  name: CHM_INDEX
  value: "%{ <!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\"> <HTML> <HEAD> <meta name=\"GENERATOR\" content=\"Microsoft&reg; HTML Help Workshop 4.1\"> <!-- Sitemap 1.0 --> </HEAD><BODY> <OBJECT type=\"text/site properties\">         <param name=\"Foreground\" value=\"0x80\">         <param name=\"Window Styles\" value=\"0x800025\">         <param name=\"ImageType\" value=\"Folder\"> </OBJECT> <UL> START:index         <LI> <OBJECT type=\"text/sitemap\">                 <param name=\"Name\" value=\"%name%\">                 <param name=\"Local\" value=\"%aref%\">                 </OBJECT> END:index </UL> </BODY></HTML> }"
- !ruby/object:RI::Constant 
  comment: 
  name: FONTS
  value: "\"Verdana,Arial,Helvetica,sans-serif\""
- !ruby/object:RI::Constant 
  comment: 
  name: STYLE
  value: "%{ body {     font-family: Verdana,Arial,Helvetica,sans-serif;     font-size:   90%;     margin: 0;     margin-left: 40px;     padding: 0;     background: white; }  h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; } h1 { font-size: 150%; } h2,h3,h4 { margin-top: 1em; }  a { background: #eef; color: #039; text-decoration: none; } a:hover { background: #039; color: #eef; }  /* Override the base stylesheet's Anchor inside a table cell */ td > a {   background: transparent;   color: #039;   text-decoration: none; }  /* and inside a section title */ .section-title > a {   background: transparent;   color: #eee;   text-decoration: none; }  /* === Structural elements =================================== */  div#index {     margin: 0;     margin-left: -40px;     padding: 0;     font-size: 90%; }   div#index a {     margin-left: 0.7em; }  div#index .section-bar {    margin-left: 0px;    padding-left: 0.7em;    background: #ccc;    font-size: small; }   div#classHeader, div#fileHeader {     width: auto;     color: white;     padding: 0.5em 1.5em 0.5em 1.5em;     margin: 0;     margin-left: -40px;     border-bottom: 3px solid #006; }  div#classHeader a, div#fileHeader a {     background: inherit;     color: white; }  div#classHeader td, div#fileHeader td {     background: inherit;     color: white; }   div#fileHeader {     background: #057; }  div#classHeader {     background: #048; }   .class-name-in-header {   font-size:  180%;   font-weight: bold; }   div#bodyContent {     padding: 0 1.5em 0 1.5em; }  div#description {     padding: 0.5em 1.5em;     background: #efefef;     border: 1px dotted #999; }  div#description h1,h2,h3,h4,h5,h6 {     color: #125;;     background: transparent; }  div#validator-badges {     text-align: center; } div#validator-badges img { border: 0; }  div#copyright {     color: #333;     background: #efefef;     font: 0.75em sans-serif;     margin-top: 5em;     margin-bottom: 0;     padding: 0.5em 2em; }   /* === Classes =================================== */  table.header-table {     color: white;     font-size: small; }  .type-note {     font-size: small;     color: #DEDEDE; }  .xxsection-bar {     background: #eee;     color: #333;     padding: 3px; }  .section-bar {    color: #333;    border-bottom: 1px solid #999;     margin-left: -20px; }   .section-title {     background: #79a;     color: #eee;     padding: 3px;     margin-top: 2em;     margin-left: -30px;     border: 1px solid #999; }  .top-aligned-row {  vertical-align: top } .bottom-aligned-row { vertical-align: bottom }  /* --- Context section classes ----------------------- */  .context-row { } .context-item-name { font-family: monospace; font-weight: bold; color: black; } .context-item-value { font-size: small; color: #448; } .context-item-desc { color: #333; padding-left: 2em; }  /* --- Method classes -------------------------- */ .method-detail {     background: #efefef;     padding: 0;     margin-top: 0.5em;     margin-bottom: 1em;     border: 1px dotted #ccc; } .method-heading {   color: black;   background: #ccc;   border-bottom: 1px solid #666;   padding: 0.2em 0.5em 0 0.5em; } .method-signature { color: black; background: inherit; } .method-name { font-weight: bold; } .method-args { font-style: italic; } .method-description { padding: 0 0.5em 0 0.5em; }  /* --- Source code sections -------------------- */  a.source-toggle { font-size: 90%; } div.method-source-code {     background: #262626;     color: #ffdead;     margin: 1em;     padding: 0.5em;     border: 1px dashed #999;     overflow: hidden; }  div.method-source-code pre { color: #ffdead; overflow: hidden; }  /* --- Ruby keyword styles --------------------- */  .standalone-code { background: #221111; color: #ffdead; overflow: hidden; }  .ruby-constant  { color: #7fffd4; background: transparent; } .ruby-keyword { color: #00ffff; background: transparent; } .ruby-ivar    { color: #eedd82; background: transparent; } .ruby-operator  { color: #00ffee; background: transparent; } .ruby-identifier { color: #ffdead; background: transparent; } .ruby-node    { color: #ffa07a; background: transparent; } .ruby-comment { color: #b22222; font-weight: bold; background: transparent; } .ruby-regexp  { color: #ffa07a; background: transparent; } .ruby-value   { color: #7fffd4; background: transparent; } }"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: H E A D E R T E M P L A T E
  name: XHTML_PREAMBLE
  value: "%{<?xml version=\"1.0\" encoding=\"%charset%\"?> <!DOCTYPE html       PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"      \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"> }"
- !ruby/object:RI::Constant 
  comment: 
  name: HEADER
  value: "XHTML_PREAMBLE + %{ <html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\"> <head>   <title>%title%</title>   <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%charset%\" />   <meta http-equiv=\"Content-Script-Type\" content=\"text/javascript\" />   <link rel=\"stylesheet\" href=\"%style_url%\" type=\"text/css\" media=\"screen\" />   <script type=\"text/javascript\">   // <![CDATA[    function popupCode( url ) {     window.open(url, \"Code\", \"resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400\")   }    function toggleCode( id ) {     if ( document.getElementById )       elem = document.getElementById( id );     else if ( document.all )       elem = eval( \"document.all.\" + id );     else       return false;      elemStyle = elem.style;          if ( elemStyle.display != \"block\" ) {       elemStyle.display = \"block\"     } else {       elemStyle.display = \"none\"     }      return true;   }      // Make codeblocks hidden by default   document.writeln( \"<style type=\\\\\"text/css\\\\\">div.method-source-code { display: none }</style>\" )      // ]]>   </script>  </head> <body> }"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: C O N T E X T C O N T E N T T E M P L A T E
  name: CONTEXT_CONTENT
  value: "%{ }"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: F O O T E R T E M P L A T E
  name: FOOTER
  value: "%{ <div id=\"validator-badges\">   <p><small><a href=\"http://validator.w3.org/check/referer\">[Validate]</a></small></p> </div>  </body> </html> }"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: F I L E P A G E H E A D E R T E M P L A T E
  name: FILE_PAGE
  value: "%{   <div id=\"fileHeader\">     <h1>%short_name%</h1>     <table class=\"header-table\">     <tr class=\"top-aligned-row\">       <td><strong>Path:</strong></td>       <td>%full_path% IF:cvsurl         &nbsp;(<a href=\"%cvsurl%\"><acronym title=\"Concurrent Versioning System\">CVS</acronym></a>) ENDIF:cvsurl       </td>     </tr>     <tr class=\"top-aligned-row\">       <td><strong>Last Update:</strong></td>       <td>%dtm_modified%</td>     </tr>     </table>   </div> }"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: C L A S S P A G E H E A D E R T E M P L A T E
  name: CLASS_PAGE
  value: "%{     <div id=\"classHeader\">         <table class=\"header-table\">         <tr class=\"top-aligned-row\">           <td><strong>%classmod%</strong></td>           <td class=\"class-name-in-header\">%full_name%</td>         </tr>         <tr class=\"top-aligned-row\">             <td><strong>In:</strong></td>             <td> START:infiles IF:full_path_url                 <a href=\"%full_path_url%\"> ENDIF:full_path_url                 %full_path% IF:full_path_url                 </a> ENDIF:full_path_url IF:cvsurl         &nbsp;(<a href=\"%cvsurl%\"><acronym title=\"Concurrent Versioning System\">CVS</acronym></a>) ENDIF:cvsurl         <br /> END:infiles             </td>         </tr>  IF:parent         <tr class=\"top-aligned-row\">             <td><strong>Parent:</strong></td>             <td> IF:par_url                 <a href=\"%par_url%\"> ENDIF:par_url                 %parent% IF:par_url                </a> ENDIF:par_url             </td>         </tr> ENDIF:parent         </table>     </div> }"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: M E T H O D L I S T T E M P L A T E
  name: METHOD_LIST
  value: "%{    <div id=\"contextContent\"> IF:diagram     <div id=\"diagram\">       %diagram%     </div> ENDIF:diagram  IF:description     <div id=\"description\">       %description%     </div> ENDIF:description  IF:requires     <div id=\"requires-list\">       <h3 class=\"section-bar\">Required files</h3>        <div class=\"name-list\"> START:requires       HREF:aref:name:&nbsp;&nbsp; END:requires       </div>     </div> ENDIF:requires  IF:toc     <div id=\"contents-list\">       <h3 class=\"section-bar\">Contents</h3>       <ul> START:toc       <li><a href=\"#%href%\">%secname%</a></li> END:toc      </ul> ENDIF:toc    </div>  IF:methods     <div id=\"method-list\">       <h3 class=\"section-bar\">Methods</h3>        <div class=\"name-list\"> START:methods       HREF:aref:name:&nbsp;&nbsp; END:methods       </div>     </div> ENDIF:methods    </div>       <!-- if includes --> IF:includes     <div id=\"includes\">       <h3 class=\"section-bar\">Included Modules</h3>        <div id=\"includes-list\"> START:includes         <span class=\"include-name\">HREF:aref:name:</span> END:includes       </div>     </div> ENDIF:includes  START:sections     <div id=\"section\"> IF:sectitle       <h2 class=\"section-title\"><a name=\"%secsequence%\">%sectitle%</a></h2> IF:seccomment       <div class=\"section-comment\">         %seccomment%       </div>       ENDIF:seccomment ENDIF:sectitle  IF:classlist     <div id=\"class-list\">       <h3 class=\"section-bar\">Classes and Modules</h3>        %classlist%     </div> ENDIF:classlist  IF:constants     <div id=\"constants-list\">       <h3 class=\"section-bar\">Constants</h3>        <div class=\"name-list\">         <table summary=\"Constants\"> START:constants         <tr class=\"top-aligned-row context-row\">           <td class=\"context-item-name\">%name%</td>           <td>=</td>           <td class=\"context-item-value\">%value%</td> IF:desc           <td width=\"3em\">&nbsp;</td>           <td class=\"context-item-desc\">%desc%</td> ENDIF:desc         </tr> END:constants         </table>       </div>     </div> ENDIF:constants  IF:aliases     <div id=\"aliases-list\">       <h3 class=\"section-bar\">External Aliases</h3>        <div class=\"name-list\">                         <table summary=\"aliases\"> START:aliases         <tr class=\"top-aligned-row context-row\">           <td class=\"context-item-name\">%old_name%</td>           <td>-&gt;</td>           <td class=\"context-item-value\">%new_name%</td>         </tr> IF:desc       <tr class=\"top-aligned-row context-row\">         <td>&nbsp;</td>         <td colspan=\"2\" class=\"context-item-desc\">%desc%</td>       </tr> ENDIF:desc END:aliases                         </table>       </div>     </div> ENDIF:aliases   IF:attributes     <div id=\"attribute-list\">       <h3 class=\"section-bar\">Attributes</h3>        <div class=\"name-list\">         <table> START:attributes         <tr class=\"top-aligned-row context-row\">           <td class=\"context-item-name\">%name%</td> IF:rw           <td class=\"context-item-value\">&nbsp;[%rw%]&nbsp;</td> ENDIF:rw IFNOT:rw           <td class=\"context-item-value\">&nbsp;&nbsp;</td> ENDIF:rw           <td class=\"context-item-desc\">%a_desc%</td>         </tr> END:attributes         </table>       </div>     </div> ENDIF:attributes              <!-- if method_list --> IF:method_list     <div id=\"methods\"> START:method_list IF:methods       <h3 class=\"section-bar\">%type% %category% methods</h3>  START:methods       <div id=\"method-%aref%\" class=\"method-detail\">         <a name=\"%aref%\"></a>          <div class=\"method-heading\"> IF:codeurl           <a href=\"%codeurl%\" target=\"Code\" class=\"method-signature\"             onclick=\"popupCode('%codeurl%');return false;\"> ENDIF:codeurl IF:sourcecode           <a href=\"#%aref%\" class=\"method-signature\"> ENDIF:sourcecode IF:callseq           <span class=\"method-name\">%callseq%</span> ENDIF:callseq IFNOT:callseq           <span class=\"method-name\">%name%</span><span class=\"method-args\">%params%</span> ENDIF:callseq IF:codeurl           </a> ENDIF:codeurl IF:sourcecode           </a> ENDIF:sourcecode         </div>                <div class=\"method-description\"> IF:m_desc           %m_desc% ENDIF:m_desc IF:sourcecode           <p><a class=\"source-toggle\" href=\"#\"             onclick=\"toggleCode('%aref%-source');return false;\">[Source]</a></p>           <div class=\"method-source-code\" id=\"%aref%-source\"> <pre> %sourcecode% </pre>           </div> ENDIF:sourcecode         </div>       </div>  END:methods ENDIF:methods END:method_list      </div> ENDIF:method_list END:sections }"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: B O D Y T E M P L A T E
  name: BODY
  value: HEADER + %{  !INCLUDE!  <!-- banner header -->    <div id="bodyContent">  } +  METHOD_LIST + %{    </div>  } + FOOTER
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: S O U R C E C O D E T E M P L A T E
  name: SRC_PAGE
  value: XHTML_PREAMBLE + %{ <html> <head>   <title>%title%</title>   <meta http-equiv="Content-Type" content="text/html; charset=%charset%" />   <link rel="stylesheet" href="%style_url%" type="text/css" media="screen" /> </head> <body class="standalone-code">   <pre>%code%</pre> </body> </html> }
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: I N D E X F I L E T E M P L A T E S
  name: FR_INDEX_BODY
  value: "%{ !INCLUDE! }"
- !ruby/object:RI::Constant 
  comment: 
  name: FILE_INDEX
  value: XHTML_PREAMBLE + %{ <!--      %list_title%    --> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head>   <title>%list_title%</title>   <meta http-equiv="Content-Type" content="text/html; charset=%charset%" />   <link rel="stylesheet" href="%style_url%" type="text/css" />   <base target="docwin" /> </head> <body> <div id="index">   <h1 class="section-bar">%list_title%</h1>   <div id="index-entries"> START:entries     <a href="%href%">%name%</a><br /> END:entries   </div> </div> </body> </html> }
- !ruby/object:RI::Constant 
  comment: 
  name: CLASS_INDEX
  value: FILE_INDEX
- !ruby/object:RI::Constant 
  comment: 
  name: METHOD_INDEX
  value: FILE_INDEX
- !ruby/object:RI::Constant 
  comment: 
  name: INDEX
  value: "%{<?xml version=\"1.0\" encoding=\"%charset%\"?> <!DOCTYPE html       PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\"      \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">  <!--      %title%    --> <html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\"> <head>   <title>%title%</title>   <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%charset%\" /> </head> <frameset rows=\"20%, 80%\">     <frameset cols=\"25%,35%,45%\">         <frame src=\"fr_file_index.html\"   title=\"Files\" name=\"Files\" />         <frame src=\"fr_class_index.html\"  name=\"Classes\" />         <frame src=\"fr_method_index.html\" name=\"Methods\" />     </frameset>     <frame src=\"%initial_page%\" name=\"docwin\" /> </frameset> </html> }"
- !ruby/object:RI::Constant 
  comment: 
  name: FONTS
  value: "\"Verdana, Arial, Helvetica, sans-serif\""
- !ruby/object:RI::Constant 
  comment: 
  name: STYLE
  value: "%{ body,td,p { font-family: %fonts%;         color: #000040; }  .attr-rw { font-size: xx-small; color: #444488 }  .title-row { background-color: #CCCCFF;              color:      #000010; }  .big-title-font {    color: black;   font-weight: bold;   font-family: %fonts%;    font-size: large;    height: 60px;   padding: 10px 3px 10px 3px; }  .small-title-font { color: black;                     font-family: %fonts%;                     font-size:10; }  .aqua { color: black }  .method-name, .attr-name {       font-family: font-family: %fonts%;        font-weight: bold;       font-size: small;       margin-left: 20px;       color: #000033; }  .tablesubtitle, .tablesubsubtitle {    width: 100%;    margin-top: 1ex;    margin-bottom: .5ex;    padding: 5px 0px 5px 3px;    font-size: large;    color: black;    background-color: #CCCCFF;    border: thin; }  .name-list {   margin-left: 5px;   margin-bottom: 2ex;   line-height: 105%; }  .description {   margin-left: 5px;   margin-bottom: 2ex;   line-height: 105%;   font-size: small; }  .methodtitle {   font-size: small;   font-weight: bold;   text-decoration: none;   color: #000033;   background-color: white;  }  .srclink {   font-size: small;   font-weight: bold;   text-decoration: none;   color: #0000DD;   background-color: white; }  .paramsig {    font-size: small; }  .srcbut { float: right }  }"
- !ruby/object:RI::Constant 
  comment: []

  name: BODY
  value: "%{ <html><head>   <title>%title%</title>   <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%charset%\">   <link rel=\"stylesheet\" href=\"%style_url%\" type=\"text/css\" media=\"screen\" />   <script type=\"text/javascript\" language=\"JavaScript\">   <!--   function popCode(url) {     parent.frames.source.location = url   }   //-->   </script> </head> <body bgcolor=\"white\">  !INCLUDE!  <!-- banner header -->  IF:diagram <table width=\"100%\"><tr><td align=\"center\"> %diagram% </td></tr></table> ENDIF:diagram  IF:description <div class=\"description\">%description%</div> ENDIF:description  IF:requires <table cellpadding=\"5\" width=\"100%\"> <tr><td class=\"tablesubtitle\">Required files</td></tr> </table><br /> <div class=\"name-list\"> START:requires HREF:aref:name: END:requires ENDIF:requires </div>  IF:methods <table cellpadding=\"5\" width=\"100%\"> <tr><td class=\"tablesubtitle\">Methods</td></tr> </table><br /> <div class=\"name-list\"> START:methods HREF:aref:name:, END:methods </div> ENDIF:methods   START:sections     <div id=\"section\"> IF:sectitle       <h2 class=\"section-title\"><a name=\"%secsequence%\">%sectitle%</a></h2> IF:seccomment       <div class=\"section-comment\">         %seccomment%       </div>       ENDIF:seccomment ENDIF:sectitle  IF:attributes <table cellpadding=\"5\" width=\"100%\"> <tr><td class=\"tablesubtitle\">Attributes</td></tr> </table><br /> <table cellspacing=\"5\"> START:attributes      <tr valign=\"top\"> IF:rw        <td align=\"center\" class=\"attr-rw\">&nbsp;[%rw%]&nbsp;</td> ENDIF:rw IFNOT:rw        <td></td> ENDIF:rw        <td class=\"attr-name\">%name%</td>        <td>%a_desc%</td>      </tr> END:attributes </table> ENDIF:attributes  IF:classlist <table cellpadding=\"5\" width=\"100%\"> <tr><td class=\"tablesubtitle\">Classes and Modules</td></tr> </table><br /> %classlist%<br /> ENDIF:classlist    !INCLUDE!  <!-- method descriptions -->  END:sections  </body> </html> }"
- !ruby/object:RI::Constant 
  comment: []

  name: FILE_PAGE
  value: <<_FILE_PAGE_ <table width="100%">  <tr class="title-row">  <td><table width="100%"><tr>    <td class="big-title-font" colspan="2"><font size="-3"><b>File</b><br /></font>%short_name%</td>    <td align="right"><table cellspacing="0" cellpadding="2">          <tr>            <td  class="small-title-font">Path:</td>            <td class="small-title-font">%full_path% IF:cvsurl                                 &nbsp;(<a href="%cvsurl%"><acronym title="Concurrent Versioning System">CVS</acronym></a>) ENDIF:cvsurl            </td>          </tr>          <tr>            <td class="small-title-font">Modified:</td>            <td class="small-title-font">%dtm_modified%</td>          </tr>         </table>     </td></tr></table></td>   </tr> </table><br /> _FILE_PAGE_
- !ruby/object:RI::Constant 
  comment: []

  name: CLASS_PAGE
  value: "%{ <table width=\"100%\" border=\"0\" cellspacing=\"0\">  <tr class=\"title-row\">  <td class=\"big-title-font\">    <font size=\"-3\"><b>%classmod%</b><br /></font>%full_name%  </td>  <td align=\"right\">    <table cellspacing=\"0\" cellpadding=\"2\">      <tr valign=\"top\">       <td class=\"small-title-font\">In:</td>       <td class=\"small-title-font\"> START:infiles HREF:full_path_url:full_path: IF:cvsurl &nbsp;(<a href=\"%cvsurl%\"><acronym title=\"Concurrent Versioning System\">CVS</acronym></a>) ENDIF:cvsurl END:infiles       </td>      </tr> IF:parent      <tr>       <td class=\"small-title-font\">Parent:</td>       <td class=\"small-title-font\"> IF:par_url         <a href=\"%par_url%\" class=\"cyan\"> ENDIF:par_url %parent% IF:par_url          </a> ENDIF:par_url       </td>      </tr> ENDIF:parent    </table>   </td>   </tr> </table><br /> }"
- !ruby/object:RI::Constant 
  comment: []

  name: METHOD_LIST
  value: "%{ IF:includes <div class=\"tablesubsubtitle\">Included modules</div><br /> <div class=\"name-list\"> START:includes     <span class=\"method-name\">HREF:aref:name:</span> END:includes </div> ENDIF:includes  IF:method_list START:method_list IF:methods <table cellpadding=5 width=\"100%\"> <tr><td class=\"tablesubtitle\">%type% %category% methods</td></tr> </table> START:methods <table width=\"100%\" cellspacing=\"0\" cellpadding=\"5\" border=\"0\"> <tr><td class=\"methodtitle\"> <a name=\"%aref%\"> IF:callseq <b>%callseq%</b> ENDIF:callseq IFNOT:callseq  <b>%name%</b>%params% ENDIF:callseq IF:codeurl <a href=\"%codeurl%\" target=\"source\" class=\"srclink\">src</a> ENDIF:codeurl </a></td></tr> </table> IF:m_desc <div class=\"description\"> %m_desc% </div> ENDIF:m_desc IF:aka <div class=\"aka\"> This method is also aliased as START:aka <a href=\"%aref%\">%name%</a> END:aka </div> ENDIF:aka IF:sourcecode <pre class=\"source\"> %sourcecode% </pre> ENDIF:sourcecode END:methods ENDIF:methods END:method_list ENDIF:method_list }"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "Source code ##########################"
  name: SRC_PAGE
  value: "%{ <html> <head><title>%title%</title> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%charset%\"> <style type=\"text/css\"> .ruby-comment    { color: green; font-style: italic } .ruby-constant   { color: #4433aa; font-weight: bold; } .ruby-identifier { color: #222222;  } .ruby-ivar       { color: #2233dd; } .ruby-keyword    { color: #3333FF; font-weight: bold } .ruby-node       { color: #777777; } .ruby-operator   { color: #111111;  } .ruby-regexp     { color: #662222; } .ruby-value      { color: #662222; font-style: italic }   .kw { color: #3333FF; font-weight: bold }   .cmt { color: green; font-style: italic }   .str { color: #662222; font-style: italic }   .re  { color: #662222; } </style> </head> <body bgcolor=\"white\"> <pre>%code%</pre> </body> </html> }"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "Index ################################"
  name: FR_INDEX_BODY
  value: "%{ !INCLUDE! }"
- !ruby/object:RI::Constant 
  comment: 
  name: FILE_INDEX
  value: "%{ <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%charset%\"> <style> <!--   body { background-color: #ddddff;      font-family: #{FONTS};         font-size: 11px;        font-style: normal;      line-height: 14px;             color: #000040;   } div.banner {   background: #0000aa;   color:      white;   padding: 1;   margin: 0;   font-size: 90%;   font-weight: bold;   line-height: 1.1;   text-align: center;   width: 100%; }    --> </style> <base target=\"docwin\"> </head> <body> <div class=\"banner\">%list_title%</div> START:entries <a href=\"%href%\">%name%</a><br /> END:entries </body></html> }"
- !ruby/object:RI::Constant 
  comment: 
  name: CLASS_INDEX
  value: FILE_INDEX
- !ruby/object:RI::Constant 
  comment: 
  name: METHOD_INDEX
  value: FILE_INDEX
- !ruby/object:RI::Constant 
  comment: 
  name: INDEX
  value: "%{ <html> <head>   <title>%title%</title>   <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%charset%\"> </head>  <frameset cols=\"20%,*\">     <frameset rows=\"15%,35%,50%\">         <frame src=\"fr_file_index.html\"   title=\"Files\" name=\"Files\">         <frame src=\"fr_class_index.html\"  name=\"Classes\">         <frame src=\"fr_method_index.html\" name=\"Methods\">     </frameset> IF:inline_source       <frame  src=\"%initial_page%\" name=\"docwin\"> ENDIF:inline_source IFNOT:inline_source     <frameset rows=\"80%,20%\">       <frame  src=\"%initial_page%\" name=\"docwin\">       <frame  src=\"blank.html\" name=\"source\">     </frameset> ENDIF:inline_source     <noframes>           <body bgcolor=\"white\">             Click <a href=\"html/index.html\">here</a> for a non-frames             version of this page.           </body>     </noframes> </frameset>  </html> }"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: and a blank page to use as a target
  name: BLANK
  value: "%{ <html><body bgcolor=\"white\"></body></html> }"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The following is used for the -1 option
  name: CONTENTS_XML
  value: "%{ IF:description %description% ENDIF:description  IF:requires <h4>Requires:</h4> <ul> START:requires IF:aref <li><a href=\"%aref%\">%name%</a></li> ENDIF:aref IFNOT:aref <li>%name%</li> ENDIF:aref  END:requires </ul> ENDIF:requires  IF:attributes <h4>Attributes</h4> <table> START:attributes <tr><td>%name%</td><td>%rw%</td><td>%a_desc%</td></tr> END:attributes </table> ENDIF:attributes  IF:includes <h4>Includes</h4> <ul> START:includes IF:aref <li><a href=\"%aref%\">%name%</a></li> ENDIF:aref IFNOT:aref <li>%name%</li> ENDIF:aref  END:includes </ul> ENDIF:includes  IF:method_list <h3>Methods</h3> START:method_list IF:methods START:methods <h4>%type% %category% method:  IF:callseq <a name=\"%aref%\">%callseq%</a> ENDIF:callseq IFNOT:callseq <a name=\"%aref%\">%name%%params%</a></h4> ENDIF:callseq  IF:m_desc %m_desc% ENDIF:m_desc  IF:sourcecode <blockquote><pre> %sourcecode% </pre></blockquote> ENDIF:sourcecode END:methods ENDIF:methods END:method_list ENDIF:method_list }"
- !ruby/object:RI::Constant 
  comment: []

  name: ONE_PAGE
  value: "%{ <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"> <html> <head>   <title>%title%</title>   <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%charset%\" /> </head> <body> START:files <h2>File: %short_name%</h2> <table>   <tr><td>Path:</td><td>%full_path%</td></tr>   <tr><td>Modified:</td><td>%dtm_modified%</td></tr> </table> } + CONTENTS_XML + %{ END:files  IF:classes <h2>Classes</h2> START:classes IF:parent <h3>%classmod% %full_name% &lt; HREF:par_url:parent:</h3> ENDIF:parent IFNOT:parent <h3>%classmod% %full_name%</h3> ENDIF:parent  IF:infiles (in files START:infiles HREF:full_path_url:full_path: END:infiles ) ENDIF:infiles } + CONTENTS_XML + %{ END:classes ENDIF:classes </body> </html> }"
- !ruby/object:RI::Constant 
  comment: 
  name: FONTS
  value: "\"Verdana, Arial, Helvetica, sans-serif\""
- !ruby/object:RI::Constant 
  comment: 
  name: STYLE
  value: "%{ body,p { font-family: Verdana, Arial, Helvetica, sans-serif;         color: #000040; background: #BBBBBB; }  td { font-family: Verdana, Arial, Helvetica, sans-serif;         color: #000040; }  .attr-rw { font-size: small; color: #444488 }  .title-row {color:      #eeeeff;             background: #BBBBDD; }  .big-title-font { color: white;                   font-family: Verdana, Arial, Helvetica, sans-serif;                   font-size: large;                    height: 50px}  .small-title-font { color: purple;                     font-family: Verdana, Arial, Helvetica, sans-serif;                     font-size: small; }  .aqua { color: purple }  .method-name, attr-name {       font-family: monospace; font-weight: bold; }  .tablesubtitle {    width: 100%;    margin-top: 1ex;    margin-bottom: .5ex;    padding: 5px 0px 5px 20px;    font-size: large;    color: purple;    background: #BBBBCC; }  .tablesubsubtitle {    width: 100%;    margin-top: 1ex;    margin-bottom: .5ex;    padding: 5px 0px 5px 20px;    font-size: medium;    color: white;    background: #BBBBCC; }  .name-list {   font-family: monospace;   margin-left: 40px;   margin-bottom: 2ex;   line-height: 140%; }  .description {   margin-left: 40px;   margin-bottom: 2ex;   line-height: 140%; }  .methodtitle {   font-size: medium;   text_decoration: none;   padding: 3px 3px 3px 20px;   color: #0000AA; }  .column-title {   font-size: medium;   font-weight: bold;   text_decoration: none;   padding: 3px 3px 3px 20px;   color: #3333CC;   }  .variable-name {   font-family: monospace;   font-size: medium;   text_decoration: none;   padding: 3px 3px 3px 20px;   color: #0000AA; }  .row-name {   font-size: medium;   font-weight: medium;   font-family: monospace;   text_decoration: none;   padding: 3px 3px 3px 20px; }  .paramsig {    font-size: small; }  .srcbut { float: right }  }"
- !ruby/object:RI::Constant 
  comment: []

  name: BODY
  value: "%{ <html><head>   <title>%title%</title>   <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%charset%\">   <link rel=\"stylesheet\" href=\"%style_url%\" type=\"text/css\" media=\"screen\" />   <script type=\"text/javascript\" language=\"JavaScript\">   <!--   function popCode(url) {     parent.frames.source.location = url   }   //-->   </script> </head> <body bgcolor=\"#BBBBBB\">  !INCLUDE!  <!-- banner header -->  IF:diagram <table width=\"100%\"><tr><td align=\"center\"> %diagram% </td></tr></table> ENDIF:diagram  IF:description <div class=\"description\">%description%</div> ENDIF:description  IF:requires <table cellpadding=\"5\" width=\"100%\"> <tr><td class=\"tablesubtitle\">Required files</td></tr> </table><br /> <div class=\"name-list\"> START:requires HREF:aref:name: END:requires ENDIF:requires </div>  IF:methods <table cellpadding=\"5\" width=\"100%\"> <tr><td class=\"tablesubtitle\">Subroutines and Functions</td></tr> </table><br /> <div class=\"name-list\"> START:methods HREF:aref:name:, END:methods </div> ENDIF:methods  IF:attributes <table cellpadding=\"5\" width=\"100%\"> <tr><td class=\"tablesubtitle\">Arguments</td></tr> </table><br /> <table cellspacing=\"5\"> START:attributes      <tr valign=\"top\"> IF:rw        <td align=\"center\" class=\"attr-rw\">&nbsp;[%rw%]&nbsp;</td> ENDIF:rw IFNOT:rw        <td></td> ENDIF:rw        <td class=\"attr-name\">%name%</td>        <td>%a_desc%</td>      </tr> END:attributes </table> ENDIF:attributes  IF:classlist <table cellpadding=\"5\" width=\"100%\"> <tr><td class=\"tablesubtitle\">Modules</td></tr> </table><br /> %classlist%<br /> ENDIF:classlist    !INCLUDE!  <!-- method descriptions -->  </body> </html> }"
- !ruby/object:RI::Constant 
  comment: []

  name: FILE_PAGE
  value: <<_FILE_PAGE_ <table width="100%">  <tr class="title-row">  <td><table width="100%"><tr>    <td class="big-title-font" colspan="2"><font size="-3"><b>File</b><br /></font>%short_name%</td>    <td align="right"><table cellspacing="0" cellpadding="2">          <tr>            <td  class="small-title-font">Path:</td>            <td class="small-title-font">%full_path% IF:cvsurl                                 &nbsp;(<a href="%cvsurl%"><acronym title="Concurrent Versioning System">CVS</acronym></a>) ENDIF:cvsurl            </td>          </tr>          <tr>            <td class="small-title-font">Modified:</td>            <td class="small-title-font">%dtm_modified%</td>          </tr>         </table>     </td></tr></table></td>   </tr> </table><br /> _FILE_PAGE_
- !ruby/object:RI::Constant 
  comment: []

  name: CLASS_PAGE
  value: "%{ <table width=\"100%\" border=\"0\" cellspacing=\"0\">  <tr class=\"title-row\">  <td class=\"big-title-font\">    <font size=\"-3\"><b>%classmod%</b><br /></font>%full_name%  </td>  <td align=\"right\">    <table cellspacing=\"0\" cellpadding=\"2\">      <tr valign=\"top\">       <td class=\"small-title-font\">In:</td>       <td class=\"small-title-font\"> START:infiles HREF:full_path_url:full_path: IF:cvsurl &nbsp;(<a href=\"%cvsurl%\"><acronym title=\"Concurrent Versioning System\">CVS</acronym></a>) ENDIF:cvsurl END:infiles       </td>      </tr> IF:parent      <tr>       <td class=\"small-title-font\">Parent:</td>       <td class=\"small-title-font\"> IF:par_url         <a href=\"%par_url%\" class=\"cyan\"> ENDIF:par_url %parent% IF:par_url          </a> ENDIF:par_url       </td>      </tr> ENDIF:parent    </table>   </td>   </tr> </table><br /> }"
- !ruby/object:RI::Constant 
  comment: []

  name: METHOD_LIST
  value: "%{ IF:includes <div class=\"tablesubsubtitle\">Uses</div><br /> <div class=\"name-list\"> START:includes     <span class=\"method-name\">HREF:aref:name:</span> END:includes </div> ENDIF:includes  IF:method_list START:method_list IF:methods <table cellpadding=\"5\" width=\"100%\"> <tr><td class=\"tablesubtitle\">%type% %category% methods</td></tr> </table> START:methods <table width=\"100%\" cellspacing=\"0\" cellpadding=\"5\" border=\"0\"> <tr><td class=\"methodtitle\"> <a name=\"%aref%\"> <b>%name%</b>%params%  IF:codeurl <a href=\"%codeurl%\" target=\"source\" class=\"srclink\">src</a> ENDIF:codeurl </a></td></tr> </table> IF:m_desc <div class=\"description\"> %m_desc% </div> ENDIF:m_desc END:methods ENDIF:methods END:method_list ENDIF:method_list }"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "Source code ##########################"
  name: SRC_PAGE
  value: "%{ <html> <head><title>%title%</title> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%charset%\"> <style type=\"text/css\">   .kw { color: #3333FF; font-weight: bold }   .cmt { color: green; font-style: italic }   .str { color: #662222; font-style: italic }   .re  { color: #662222; } .ruby-comment    { color: green; font-style: italic } .ruby-constant   { color: #4433aa; font-weight: bold; } .ruby-identifier { color: #222222;  } .ruby-ivar       { color: #2233dd; } .ruby-keyword    { color: #3333FF; font-weight: bold } .ruby-node       { color: #777777; } .ruby-operator   { color: #111111;  } .ruby-regexp     { color: #662222; } .ruby-value      { color: #662222; font-style: italic } </style> </head> <body bgcolor=\"#BBBBBB\"> <pre>%code%</pre> </body> </html> }"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "Index ################################"
  name: FR_INDEX_BODY
  value: "%{ !INCLUDE! }"
- !ruby/object:RI::Constant 
  comment: 
  name: FILE_INDEX
  value: "%{ <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%charset%\"> <style type=\"text/css\"> <!--   body { background-color: #bbbbbb;      font-family: #{FONTS};         font-size: 11px;        font-style: normal;      line-height: 14px;             color: #000040;   } div.banner {   background: #bbbbcc;   color:      white;   padding: 1;   margin: 0;   font-size: 90%;   font-weight: bold;   line-height: 1.1;   text-align: center;   width: 100%; }    --> </style> <base target=\"docwin\"> </head> <body> <div class=\"banner\">%list_title%</div> START:entries <a href=\"%href%\">%name%</a><br /> END:entries </body></html> }"
- !ruby/object:RI::Constant 
  comment: 
  name: CLASS_INDEX
  value: FILE_INDEX
- !ruby/object:RI::Constant 
  comment: 
  name: METHOD_INDEX
  value: FILE_INDEX
- !ruby/object:RI::Constant 
  comment: 
  name: INDEX
  value: "%{ <html> <head>   <title>%title%</title>   <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%charset%\"> </head>  <frameset cols=\"20%,*\">     <frameset rows=\"15%,35%,50%\">         <frame src=\"fr_file_index.html\"   title=\"Files\" name=\"Files\">         <frame src=\"fr_class_index.html\"  name=\"Modules\">         <frame src=\"fr_method_index.html\" name=\"Subroutines and Functions\">     </frameset>     <frameset rows=\"80%,20%\">       <frame  src=\"%initial_page%\" name=\"docwin\">       <frame  src=\"blank.html\" name=\"source\">     </frameset>     <noframes>           <body bgcolor=\"#BBBBBB\">             Click <a href=\"html/index.html\">here</a> for a non-frames             version of this page.           </body>     </noframes> </frameset>  </html> }"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: and a blank page to use as a target
  name: BLANK
  value: "%{ <html><body bgcolor=\"#BBBBBB\"></body></html> }"
- !ruby/object:RI::Constant 
  comment: 
  name: FONTS
  value: "\"Verdana, Arial, Helvetica, sans-serif\""
- !ruby/object:RI::Constant 
  comment: 
  name: STYLE
  value: "%{ body,td,p { font-family: %fonts%;         color: #000040; }  .attr-rw { font-size: x-small; color: #444488 }  .title-row { background: #0000aa;              color:      #eeeeff; }  .big-title-font { color: white;                   font-family: %fonts%;                   font-size: large;                    height: 50px}  .small-title-font { color: aqua;                     font-family: %fonts%;                     font-size: xx-small; }  .aqua { color: aqua }  .method-name, attr-name {       font-family: monospace; font-weight: bold; }  .tablesubtitle, .tablesubsubtitle {    width: 100%;    margin-top: 1ex;    margin-bottom: .5ex;    padding: 5px 0px 5px 20px;    font-size: large;    color: aqua;    background: #3333cc; }  .name-list {   font-family: monospace;   margin-left: 40px;   margin-bottom: 2ex;   line-height: 140%; }  .description {   margin-left: 40px;   margin-top: -2ex;   margin-bottom: 2ex; }  .description p {   line-height: 140%; }  .aka {   margin-left: 40px;   margin-bottom: 2ex;   line-height: 100%;   font-size:   small;   color:       #808080; }  .methodtitle {   font-size: medium;   text-decoration: none;   color: #0000AA;   background: white;  }  .paramsig {    font-size: small; }  .srcbut { float: right }  pre { font-size: 1.2em; } tt  { font-size: 1.2em; }  pre.source {   border-style: groove;   background-color: #ddddff;   margin-left:  40px;   padding: 1em 0em 1em 2em; }  .classlist {   margin-left: 40px;   margin-bottom: 2ex;   line-height: 140%; }  li {   display:    list-item;   margin-top: .6em; }  .ruby-comment    { color: green; font-style: italic } .ruby-constant   { color: #4433aa; font-weight: bold; } .ruby-identifier { color: #222222;  } .ruby-ivar       { color: #2233dd; } .ruby-keyword    { color: #3333FF; font-weight: bold } .ruby-node       { color: #777777; } .ruby-operator   { color: #111111;  } .ruby-regexp     { color: #662222; } .ruby-value      { color: #662222; font-style: italic }  }"
- !ruby/object:RI::Constant 
  comment: []

  name: HEADER
  value: "%{ <?xml version=\"1.0\" encoding=\"utf-8\"?> <!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\" xml:lang=\"en\" lang=\"en\"> <head>   <title>%title%</title>   <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%charset%\" />   <link rel=StyleSheet href=\"%style_url%\" type=\"text/css\" media=\"screen\" />   <script type=\"text/javascript\" language=\"JavaScript\">   <!--   function popCode(url) {     window.open(url, \"Code\",            \"resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400\")   }   //-->   </script> </head> }"
- !ruby/object:RI::Constant 
  comment: []

  name: METHOD_LIST
  value: "%{ IF:includes <table summary=\"Included modules\" cellpadding=\"5\" width=\"100%\"> <tr><td class=\"tablesubtitle\">Included modules</td></tr> </table> <div class=\"name-list\"> START:includes     <span class=\"method-name\">HREF:aref:name:</span> END:includes </div> ENDIF:includes  IF:method_list START:method_list IF:methods <table summary=\"Method list\" cellpadding=\"5\" width=\"100%\"> <tr><td class=\"tablesubtitle\">%type% %category% methods</td></tr> </table> START:methods <table summary=\"method\"  width=\"100%\" cellspacing=\"0\" cellpadding=\"5\" border=\"0\"> <tr><td class=\"methodtitle\"> <a name=\"%aref%\"></a> IF:codeurl <a href=\"%codeurl%\" target=\"Code\" class=\"methodtitle\"  onClick=\"popCode('%codeurl%');return false;\"> ENDIF:codeurl IF:callseq <b>%callseq%</b> ENDIF:callseq IFNOT:callseq <b>%name%</b>%params% ENDIF:callseq IF:codeurl </a> ENDIF:codeurl </td></tr> </table> IF:m_desc <div class=\"description\"> %m_desc% </div> ENDIF:m_desc IF:aka <div class=\"aka\"> This method is also aliased as START:aka <a href=\"%aref%\">%name%</a> END:aka </div> ENDIF:aka IF:sourcecode <pre class=\"source\"> %sourcecode% </pre> ENDIF:sourcecode END:methods ENDIF:methods END:method_list ENDIF:method_list }"
- !ruby/object:RI::Constant 
  comment: []

  name: CONTEXT_CONTENT
  value: "%{ IF:diagram <table summary=\"Diagram of classes and modules\" width=\"100%\"> <tr><td align=\"center\"> %diagram% </td></tr></table> ENDIF:diagram   IF:description <div class=\"description\">%description%</div> ENDIF:description  IF:requires <table summary=\"Requires\" cellpadding=\"5\" width=\"100%\"> <tr><td class=\"tablesubtitle\">Required files</td></tr> </table> <div class=\"name-list\"> START:requires HREF:aref:name:&nbsp; &nbsp; END:requires </div> ENDIF:requires  IF:methods <table summary=\"Methods\" cellpadding=\"5\" width=\"100%\"> <tr><td class=\"tablesubtitle\">Methods</td></tr> </table> <div class=\"name-list\"> START:methods HREF:aref:name:&nbsp; &nbsp; END:methods </div> ENDIF:methods  IF:constants <table summary=\"Constants\" cellpadding=\"5\" width=\"100%\"> <tr><td class=\"tablesubtitle\">Constants</td></tr> </table> <table cellpadding=\"5\"> START:constants <tr valign=\"top\"><td>%name%</td><td>=</td><td>%value%</td></tr> IF:desc <tr><td></td><td></td><td>%desc%</td></tr> ENDIF:desc END:constants </table> ENDIF:constants  IF:aliases <table summary=\"Aliases\" cellpadding=\"5\" width=\"100%\"> <tr><td class=\"tablesubtitle\">External Aliases</td></tr> </table> <div class=\"name-list\"> START:aliases %old_name% -> %new_name%<br /> END:aliases </div> ENDIF:aliases  IF:attributes <table summary=\"Attributes\" cellpadding=\"5\" width=\"100%\"> <tr><td class=\"tablesubtitle\">Attributes</td></tr> </table> <table summary=\"Attribute details\" cellspacing=\"5\"> START:attributes      <tr valign=\"top\">        <td class=\"attr-name\">%name%</td> IF:rw        <td align=\"center\" class=\"attr-rw\">&nbsp;[%rw%]&nbsp;</td> ENDIF:rw IFNOT:rw        <td></td> ENDIF:rw        <td>%a_desc%</td>      </tr> END:attributes </table> ENDIF:attributes  IF:classlist <table summary=\"List of classes\" cellpadding=\"5\" width=\"100%\"> <tr><td class=\"tablesubtitle\">Classes and Modules</td></tr> </table> <div class=\"classlist\"> %classlist% </div> ENDIF:classlist }"
- !ruby/object:RI::Constant 
  comment: []

  name: BODY
  value: HEADER + %{ <body bgcolor="white"> !INCLUDE!  <!-- banner header --> } + CONTEXT_CONTENT + METHOD_LIST + %{ </body> </html> }
- !ruby/object:RI::Constant 
  comment: []

  name: FILE_PAGE
  value: <<_FILE_PAGE_ <table summary="Information on file" width="100%">  <tr class="title-row">  <td><table summary="layout" width="100%"><tr>    <td class="big-title-font" colspan="2">%short_name%</td>    <td align="right"><table summary="layout" cellspacing="0" cellpadding="2">          <tr>            <td  class="small-title-font">Path:</td>            <td class="small-title-font">%full_path% IF:cvsurl                                 &nbsp;(<a href="%cvsurl%"><acronym title="Concurrent Versioning System">CVS</acronym></a>) ENDIF:cvsurl            </td>          </tr>          <tr>            <td class="small-title-font">Modified:</td>            <td class="small-title-font">%dtm_modified%</td>          </tr>         </table>     </td></tr></table></td>   </tr> </table> _FILE_PAGE_
- !ruby/object:RI::Constant 
  comment: []

  name: CLASS_PAGE
  value: "%{ <table summary=\"Information on class\" width=\"100%\" border=\"0\" cellspacing=\"0\">  <tr class=\"title-row\">  <td class=\"big-title-font\">    <sup><font color=\"aqua\">%classmod%</font></sup> %full_name%  </td>  <td align=\"right\">    <table summary=\"layout\" cellspacing=\"0\" cellpadding=\"2\">      <tr valign=\"top\">       <td class=\"small-title-font\">In:</td>       <td class=\"small-title-font\"> START:infiles IF:full_path_url         <a href=\"%full_path_url%\" class=\"aqua\"> ENDIF:full_path_url %full_path% IF:full_path_url          </a> ENDIF:full_path_url IF:cvsurl          &nbsp;(<a href=\"%cvsurl%\"><acronym title=\"Concurrent Versioning System\">CVS</acronym></a>) ENDIF:cvsurl <br /> END:infiles       </td>      </tr> IF:parent      <tr>       <td class=\"small-title-font\">Parent:</td>       <td class=\"small-title-font\"> IF:par_url         <a href=\"%par_url%\" class=\"aqua\"> ENDIF:par_url %parent% IF:par_url          </a> ENDIF:par_url       </td>      </tr> ENDIF:parent    </table>   </td>   </tr> </table> }"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "Source code ##########################"
  name: SRC_PAGE
  value: "%{ <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%charset%\"> <title>%title%</title> <link rel=\"stylesheet\" href=\"%style_url%\" type=\"text/css\" media=\"screen\" /> </head> <body bgcolor=\"white\"> <pre>%code%</pre> </body> </html> }"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "Index ################################"
  name: FR_INDEX_BODY
  value: "%{ !INCLUDE! }"
- !ruby/object:RI::Constant 
  comment: 
  name: FILE_INDEX
  value: "%{ <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%charset%\"> <title>%list_title%</title> <style type=\"text/css\"> <!--   body { background-color: #ddddff;      font-family: #{FONTS};         font-size: 11px;        font-style: normal;      line-height: 14px;             color: #000040;   } div.banner {   background: #0000aa;   color:      white;   padding: 1;   margin: 0;   font-size: 90%;   font-weight: bold;   line-height: 1.1;   text-align: center;   width: 100%; }  A.xx { color: white; font-weight: bold; } --> </style> <base target=\"docwin\"> </head> <body> <div class=\"banner\"><a href=\"%index_url%\" class=\"xx\">%list_title%</a></div> START:entries <a href=\"%href%\">%name%</a><br /> END:entries </body></html> }"
- !ruby/object:RI::Constant 
  comment: 
  name: CLASS_INDEX
  value: FILE_INDEX
- !ruby/object:RI::Constant 
  comment: 
  name: METHOD_INDEX
  value: FILE_INDEX
- !ruby/object:RI::Constant 
  comment: 
  name: INDEX
  value: "%{ <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\"> <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%charset%\"> <title>%title%</title></head>  <frameset rows=\"20%, 80%\">     <frameset cols=\"25%,35%,45%\">         <frame src=\"fr_file_index.html\"   title=\"Files\" name=\"Files\">         <frame src=\"fr_class_index.html\"  name=\"Classes\">         <frame src=\"fr_method_index.html\" name=\"Methods\">     </frameset>     <frame  src=\"%initial_page%\" name=\"docwin\">     <noframes>           <body bgcolor=\"white\">             Sorry, RDoc currently only generates HTML using frames.           </body>     </noframes> </frameset>  </html> }"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The following is used for the -1 option
  name: CONTENTS_XML
  value: "%{ IF:description %description% ENDIF:description  IF:requires <h4>Requires:</h4> <ul> START:requires IF:aref <li><a href=\"%aref%\">%name%</a></li> ENDIF:aref IFNOT:aref <li>%name%</li> ENDIF:aref  END:requires </ul> ENDIF:requires  IF:attributes <h4>Attributes</h4> <table> START:attributes <tr><td>%name%</td><td>%rw%</td><td>%a_desc%</td></tr> END:attributes </table> ENDIF:attributes  IF:includes <h4>Includes</h4> <ul> START:includes IF:aref <li><a href=\"%aref%\">%name%</a></li> ENDIF:aref IFNOT:aref <li>%name%</li> ENDIF:aref  END:includes </ul> ENDIF:includes  IF:method_list <h3>Methods</h3> START:method_list IF:methods START:methods <h4>%type% %category% method: <a name=\"%aref%\">%name%%params%</a></h4>  IF:m_desc %m_desc% ENDIF:m_desc  IF:sourcecode <blockquote><pre> %sourcecode% </pre></blockquote> ENDIF:sourcecode END:methods ENDIF:methods END:method_list ENDIF:method_list }"
- !ruby/object:RI::Constant 
  comment: 
  name: CONTENTS_XML
  value: "%{ IF:description     <description> %description%     </description> ENDIF:description     <contents> IF:requires       <required-file-list> START:requires          <required-file name=\"%name%\" IF:aref                          href=\"%aref%\" ENDIF:aref          /> END:requires       </required-file-list> ENDIF:requires IF:attributes       <attribute-list> START:attributes         <attribute name=\"%name%\"> IF:rw           <attribute-rw>%rw%</attribute-rw> ENDIF:rw           <description>%a_desc%</description>         </attribute> END:attributes       </attribute-list> ENDIF:attributes IF:includes       <included-module-list> START:includes         <included-module name=\"%name%\" IF:aref                          href=\"%aref%\" ENDIF:aref         /> END:includes       </included-module-list> ENDIF:includes IF:method_list       <method-list> START:method_list IF:methods START:methods         <method name=\"%name%\" type=\"%type%\" category=\"%category%\" id=\"%aref%\">           <parameters>%params%</parameters> IF:m_desc           <description> %m_desc%           </description> ENDIF:m_desc IF:sourcecode           <source-code-listing> %sourcecode%           </source-code-listing> ENDIF:sourcecode         </method> END:methods ENDIF:methods END:method_list       </method-list> ENDIF:method_list      </contents> }"
- !ruby/object:RI::Constant 
  comment: []

  name: ONE_PAGE
  value: "%{<?xml version=\"1.0\" encoding=\"utf-8\"?> <rdoc> <file-list> START:files   <file name=\"%short_name%\" id=\"%href%\">     <file-info>       <path>%full_path%</path>       <dtm-modified>%dtm_modified%</dtm-modified>     </file-info> } + CONTENTS_XML + %{   </file> END:files </file-list> <class-module-list> START:classes   <%classmod% name=\"%full_name%\" id=\"%full_name%\">     <classmod-info> IF:infiles       <infiles>       START:infiles         <infile>HREF:full_path_url:full_path:</infile> END:infiles       </infiles> ENDIF:infiles IF:parent      <superclass>HREF:par_url:parent:</superclass> ENDIF:parent     </classmod-info> } + CONTENTS_XML + %{   </%classmod%> END:classes </class-module-list> </rdoc> }"
- !ruby/object:RI::Constant 
  comment: 
  name: CONTENTS_RDF
  value: "%{ IF:description     <description rd:parseType=\"Literal\"> %description%     </description> ENDIF:description  IF:requires START:requires          <rd:required-file rd:name=\"%name%\" /> END:requires ENDIF:requires  IF:attributes START:attributes         <contents>         <Attribute rd:name=\"%name%\"> IF:rw           <attribute-rw>%rw%</attribute-rw> ENDIF:rw           <description rdf:parseType=\"Literal\">%a_desc%</description>         </Attribute>         </contents> END:attributes ENDIF:attributes  IF:includes       <IncludedModuleList> START:includes         <included-module rd:name=\"%name%\"  /> END:includes       </IncludedModuleList> ENDIF:includes  IF:method_list START:method_list IF:methods START:methods         <contents>         <Method rd:name=\"%name%\" rd:visibility=\"%type%\"                 rd:category=\"%category%\" rd:id=\"%aref%\">           <parameters>%params%</parameters> IF:m_desc           <description rdf:parseType=\"Literal\"> %m_desc%           </description> ENDIF:m_desc IF:sourcecode           <source-code-listing rdf:parseType=\"Literal\"> %sourcecode%           </source-code-listing> ENDIF:sourcecode         </Method>        </contents> END:methods ENDIF:methods END:method_list ENDIF:method_list      <!-- end method list --> }"
- !ruby/object:RI::Constant 
  comment: []

  name: ONE_PAGE
  value: "%{<?xml version=\"1.0\" encoding=\"utf-8\"?> <rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"         xmlns=\"http://pragprog.com/rdoc/rdoc.rdf#\"         xmlns:rd=\"http://pragprog.com/rdoc/rdoc.rdf#\">  <!-- RDoc --> START:files   <rd:File rd:name=\"%short_name%\" rd:id=\"%href%\">       <path>%full_path%</path>       <dtm-modified>%dtm_modified%</dtm-modified> } + CONTENTS_RDF + %{   </rd:File> END:files START:classes   <%classmod% rd:name=\"%full_name%\" rd:id=\"%full_name%\">     <classmod-info> IF:infiles       <InFiles> START:infiles         <infile>           <File rd:name=\"%full_path%\" IF:full_path_url                 rdf:about=\"%full_path_url%\" ENDIF:full_path_url            />          </infile> END:infiles       </InFiles> ENDIF:infiles IF:parent      <superclass>HREF:par_url:parent:</superclass> ENDIF:parent     </classmod-info> } + CONTENTS_RDF + %{   </%classmod%> END:classes <!-- /RDoc --> </rdf:RDF> }"
full_name: RDoc::Page
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: write_extra_pages
- !ruby/object:RI::MethodSummary 
  name: write_extra_pages
name: Page
superclass: 
PK}[�\���0ri/1.8/system/RDoc/Page/write_extra_pages-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Page#write_extra_pages
is_singleton: false
name: write_extra_pages
params: ()
visibility: public
PK}[������%ri/1.8/system/RDoc/Include/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Include::new
is_singleton: true
name: new
params: (name, comment)
visibility: public
PK}[��fdd-ri/1.8/system/RDoc/Include/cdesc-Include.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: an included module
constants: []

full_name: RDoc::Include
includes: []

instance_methods: []

name: Include
superclass: CodeObject
PK}[�hc���5ri/1.8/system/RDoc/CodeObject/document_self%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::CodeObject#document_self=
is_singleton: false
name: document_self=
params: (val)
visibility: public
PK}[!�M�>>.ri/1.8/system/RDoc/CodeObject/start_doc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "set and cleared by :startdoc: and :enddoc:, this is used to toggle the capturing of documentation"
full_name: RDoc::CodeObject#start_doc
is_singleton: false
name: start_doc
params: ()
visibility: public
PK}[0mOP��9ri/1.8/system/RDoc/CodeObject/document_children%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::CodeObject#document_children=
is_singleton: false
name: document_children=
params: (val)
visibility: public
PK}[7Q�ff3ri/1.8/system/RDoc/CodeObject/cdesc-CodeObject.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Access the code object's comment
  name: comment
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: do we document ourselves and our children
  name: document_children
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: do we document ourselves?
  name: document_self
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: are we done documenting (ie, did we come across a :enddoc:)?
  name: done_documenting
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Do we <em>force</em> documentation, even is we wouldn't normally show the entity
  name: force_documentation
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: parent
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Which section are we in
  name: section
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: We are the model of the code, but we know that at some point we will be worked on by viewers. By implementing the Viewable protocol, viewers can associated themselves with these objects.
  name: viewer
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: attr_overridable
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: We contain the common stuff for contexts (which are containers) and other elements (methods, attributes and so on)
constants: []

full_name: RDoc::CodeObject
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: comment=
- !ruby/object:RI::MethodSummary 
  name: document_children=
- !ruby/object:RI::MethodSummary 
  name: document_self=
- !ruby/object:RI::MethodSummary 
  name: remove_classes_and_modules
- !ruby/object:RI::MethodSummary 
  name: remove_methods_etc
- !ruby/object:RI::MethodSummary 
  name: start_doc
- !ruby/object:RI::MethodSummary 
  name: stop_doc
name: CodeObject
superclass: Object
PK}[n>�Z--5ri/1.8/system/RDoc/CodeObject/attr_overridable-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: There's a wee trick we pull. Comment blocks can have directives that override the stuff we extract during the parse. So, we have a special class method, attr_overridable, that lets code objects list those directives. Wehn a comment is assigned, we then extract out any matching directives and update our object
full_name: RDoc::CodeObject::attr_overridable
is_singleton: true
name: attr_overridable
params: (name, *aliases)
visibility: public
PK}[‘xv��(ri/1.8/system/RDoc/CodeObject/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::CodeObject::new
is_singleton: true
name: new
params: ()
visibility: public
PK}[�d�((/ri/1.8/system/RDoc/CodeObject/comment%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Update the comment, but don't overwrite a real comment with an empty one
full_name: RDoc::CodeObject#comment=
is_singleton: false
name: comment=
params: (comment)
visibility: public
PK}[HC��II?ri/1.8/system/RDoc/CodeObject/remove_classes_and_modules-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Default callbacks to nothing, but this is overridden for classes and modules
full_name: RDoc::CodeObject#remove_classes_and_modules
is_singleton: false
name: remove_classes_and_modules
params: ()
visibility: public
PK}[��n��7ri/1.8/system/RDoc/CodeObject/remove_methods_etc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::CodeObject#remove_methods_etc
is_singleton: false
name: remove_methods_etc
params: ()
visibility: public
PK}[�C����-ri/1.8/system/RDoc/CodeObject/stop_doc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::CodeObject#stop_doc
is_singleton: false
name: stop_doc
params: ()
visibility: public
PK}[�U1ri/1.8/system/RDoc/AnonClass/cdesc-AnonClass.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Anonymous classes
constants: []

full_name: RDoc::AnonClass
includes: []

instance_methods: []

name: AnonClass
superclass: ClassModule
PK}[�G�1��,ri/1.8/system/RDoc/TopLevel/full_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::TopLevel#full_name
is_singleton: false
name: full_name
params: ()
visibility: public
PK}[��d�4ri/1.8/system/RDoc/TopLevel/find_module_named-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Find a named module
full_name: RDoc::TopLevel#find_module_named
is_singleton: false
name: find_module_named
params: (name)
visibility: public
PK}[g� %%6ri/1.8/system/RDoc/TopLevel/add_class_or_module-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adding a class or module to a TopLevel is special, as we only want one copy of a particular top-level class. For example, if both file A and file B implement class C, we only want one ClassModule object for C. This code arranges to share classes and modules between files.
full_name: RDoc::TopLevel#add_class_or_module
is_singleton: false
name: add_class_or_module
params: (collection, class_type, name, superclass)
visibility: public
PK}[6
m���&ri/1.8/system/RDoc/TopLevel/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::TopLevel::new
is_singleton: true
name: new
params: (file_name)
visibility: public
PK}[��SŬ�(ri/1.8/system/RDoc/TopLevel/reset-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::TopLevel::reset
is_singleton: true
name: reset
params: ()
visibility: public
PK}[��S��=ri/1.8/system/RDoc/TopLevel/find_class_or_module_named-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::TopLevel#find_class_or_module_named
is_singleton: false
name: find_class_or_module_named
params: (symbol)
visibility: public
PK}[�U��:ri/1.8/system/RDoc/TopLevel/all_classes_and_modules-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::TopLevel::all_classes_and_modules
is_singleton: true
name: all_classes_and_modules
params: ()
visibility: public
PK}[��"11/ri/1.8/system/RDoc/TopLevel/cdesc-TopLevel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: diagram
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: file_absolute_name
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: file_relative_name
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: file_stat
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: all_classes_and_modules
- !ruby/object:RI::MethodSummary 
  name: find_class_named
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: reset
comment: 
- !ruby/struct:SM::Flow::P 
  body: A TopLevel context is a source file
constants: []

full_name: RDoc::TopLevel
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_class_or_module
- !ruby/object:RI::MethodSummary 
  name: find_class_or_module_named
- !ruby/object:RI::MethodSummary 
  name: find_local_symbol
- !ruby/object:RI::MethodSummary 
  name: find_module_named
- !ruby/object:RI::MethodSummary 
  name: full_name
name: TopLevel
superclass: Context
PK}[Yf��4ri/1.8/system/RDoc/TopLevel/find_local_symbol-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::TopLevel#find_local_symbol
is_singleton: false
name: find_local_symbol
params: (symbol)
visibility: public
PK}[39B��3ri/1.8/system/RDoc/TopLevel/find_class_named-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::TopLevel::find_class_named
is_singleton: true
name: find_class_named
params: (name)
visibility: public
PK}[�,��7ri/1.8/system/RDoc/SimpleParser/cdesc-SimpleParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: See rdoc/parsers/parse_c.rb
constants: []

full_name: RDoc::SimpleParser
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: remove_private_comments
- !ruby/object:RI::MethodSummary 
  name: scan
name: SimpleParser
superclass: Object
PK}[�)d���>ri/1.8/system/RDoc/SimpleParser/remove_private_comments-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::SimpleParser#remove_private_comments
is_singleton: false
name: remove_private_comments
params: (comment)
visibility: public
PK}[���`+ri/1.8/system/RDoc/SimpleParser/scan-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Extract the file contents and attach them to the toplevel as a comment
full_name: RDoc::SimpleParser#scan
is_singleton: false
name: scan
params: ()
visibility: public
PK}[�$k*ri/1.8/system/RDoc/SimpleParser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: prepare to parse a plain file
full_name: RDoc::SimpleParser::new
is_singleton: true
name: new
params: (top_level, file_name, body, options, stats)
visibility: public
PK}[q��'')ri/1.8/system/RDoc/Token/cdesc-Token.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: char_no
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: line_no
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: text
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: NO_TEXT
  value: "\"??\".freeze"
full_name: RDoc::Token
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: set_text
name: Token
superclass: Object
PK}[�C��#ri/1.8/system/RDoc/Token/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RDoc::Token::new
is_singleton: true
name: new
params: (line_no, char_no)
visibility: public
PK}[y�7<FF(ri/1.8/system/RDoc/Token/set_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Because we're used in contexts that expect to return a token, we set the text string and then return ourselves
full_name: RDoc::Token#set_text
is_singleton: false
name: set_text
params: (text)
visibility: public
PK}[[��y..8ri/1.8/system/AmbiguousOption/cdesc-AmbiguousOption.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Raises when ambiguously completable string is encountered.
constants: []

full_name: AmbiguousOption
includes: []

instance_methods: []

name: AmbiguousOption
superclass: ParseError
PK}[SC�MM,ri/1.8/system/ThreadGroup/enclosed%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>thgrp</em> is enclosed. See also ThreadGroup#enclose.
full_name: ThreadGroup#enclosed?
is_singleton: false
name: enclosed?
params: |
  thgrp.enclosed?   => true or false

visibility: public
PK}[�O__0ri/1.8/system/ThreadGroup/cdesc-ThreadGroup.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>ThreadGroup</tt> provides a means of keeping track of a number of threads as a group. A <tt>Thread</tt> can belong to only one <tt>ThreadGroup</tt> at a time; adding a thread to a new group will remove it from any previous group.
- !ruby/struct:SM::Flow::P 
  body: Newly created threads belong to the same group as the thread from which they were created.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Default
  value: thgroup_default
full_name: ThreadGroup
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: enclose
- !ruby/object:RI::MethodSummary 
  name: enclosed?
- !ruby/object:RI::MethodSummary 
  name: list
name: ThreadGroup
superclass: Object
PK}[���{77$ri/1.8/system/ThreadGroup/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds the given <em>thread</em> to this group, removing it from any other group to which it may have previously belonged.
- !ruby/struct:SM::Flow::VERB 
  body: "   puts &quot;Initial group is #{ThreadGroup::Default.list}&quot;\n   tg = ThreadGroup.new\n   t1 = Thread.new { sleep }\n   t2 = Thread.new { sleep }\n   puts &quot;t1 is #{t1}&quot;\n   puts &quot;t2 is #{t2}&quot;\n   tg.add(t1)\n   puts &quot;Initial group now #{ThreadGroup::Default.list}&quot;\n   puts &quot;tg group now #{tg.list}&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Initial group is #&lt;Thread:0x401bdf4c&gt;\n   t1 is #&lt;Thread:0x401b3c90&gt;\n   t2 is #&lt;Thread:0x401b3c18&gt;\n   Initial group now #&lt;Thread:0x401b3c18&gt;#&lt;Thread:0x401bdf4c&gt;\n   tg group now #&lt;Thread:0x401b3c90&gt;\n"
full_name: ThreadGroup#add
is_singleton: false
name: add
params: |
  thgrp.add(thread)   => thgrp

visibility: public
PK}[�z��NN(ri/1.8/system/ThreadGroup/enclose-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Prevents threads from being added to or removed from the receiving <tt>ThreadGroup</tt>. New threads can still be started in an enclosed <tt>ThreadGroup</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   ThreadGroup::Default.enclose        #=&gt; #&lt;ThreadGroup:0x4029d914&gt;\n   thr = Thread::new { Thread.stop }   #=&gt; #&lt;Thread:0x402a7210 sleep&gt;\n   tg = ThreadGroup::new               #=&gt; #&lt;ThreadGroup:0x402752d4&gt;\n   tg.add thr\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   ThreadError: can't move from the enclosed thread group\n"
full_name: ThreadGroup#enclose
is_singleton: false
name: enclose
params: |
  thgrp.enclose   => thgrp

visibility: public
PK}[����%ri/1.8/system/ThreadGroup/list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array of all existing <tt>Thread</tt> objects that belong to this group.
- !ruby/struct:SM::Flow::VERB 
  body: "   ThreadGroup::Default.list   #=&gt; [#&lt;Thread:0x401bdf4c run&gt;]\n"
full_name: ThreadGroup#list
is_singleton: false
name: list
params: |
  thgrp.list   => array

visibility: public
PK}[���7//"ri/1.8/system/NilClass/to_i-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Always returns zero.
- !ruby/struct:SM::Flow::VERB 
  body: "   nil.to_i   #=&gt; 0\n"
full_name: NilClass#to_i
is_singleton: false
name: to_i
params: |
  nil.to_i => 0

visibility: public
PK}[�ǧ>>"ri/1.8/system/NilClass/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Always returns an empty array.
- !ruby/struct:SM::Flow::VERB 
  body: "   nil.to_a   #=&gt; []\n"
full_name: NilClass#to_a
is_singleton: false
name: to_a
params: |
  nil.to_a    => []

visibility: public
PK}[�=�Qrr!ri/1.8/system/NilClass/%7c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Or---Returns <tt>false</tt> if <em>obj</em> is <tt>nil</tt> or <tt>false</tt>; <tt>true</tt> otherwise.
full_name: NilClass#|
is_singleton: false
name: "|"
params: |
  false | obj   =>   true or false
  nil   | obj   =>   true or false

visibility: public
PK}[�R��!ri/1.8/system/NilClass/%26-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: And---Returns <tt>false</tt>. <em>obj</em> is always evaluated as it is the argument to a method call---there is no short-circuit evaluation in this case.
full_name: NilClass#&
is_singleton: false
name: "&"
params: |
  false & obj   => false
  nil & obj     => false

visibility: public
PK}[tH���%ri/1.8/system/NilClass/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: NilClass#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PK}[�:��*ri/1.8/system/NilClass/cdesc-NilClass.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The class of the singleton object <tt>nil</tt>.
constants: []

full_name: NilClass
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "&"
- !ruby/object:RI::MethodSummary 
  name: ^
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: nil?
- !ruby/object:RI::MethodSummary 
  name: to_a
- !ruby/object:RI::MethodSummary 
  name: to_f
- !ruby/object:RI::MethodSummary 
  name: to_i
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: to_yaml
- !ruby/object:RI::MethodSummary 
  name: "|"
name: NilClass
superclass: Object
PK}[���%ri/1.8/system/NilClass/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Always returns the string &quot;nil&quot;.
full_name: NilClass#inspect
is_singleton: false
name: inspect
params: |
  nil.inspect  => "nil"

visibility: public
PK}[أh�JJ"ri/1.8/system/NilClass/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Always returns the empty string.
- !ruby/struct:SM::Flow::VERB 
  body: "   nil.to_s   #=&gt; &quot;&quot;\n"
full_name: NilClass#to_s
is_singleton: false
name: to_s
params: |
  nil.to_s    => ""

visibility: public
PK}[��NI��!ri/1.8/system/NilClass/%5e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Exclusive Or---If <em>obj</em> is <tt>nil</tt> or <tt>false</tt>, returns <tt>false</tt>; otherwise, returns <tt>true</tt>.
full_name: NilClass#^
is_singleton: false
name: ^
params: |
  false ^ obj    => true or false
  nil   ^ obj    => true or false

visibility: public
PK}[<��R66"ri/1.8/system/NilClass/to_f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Always returns zero.
- !ruby/struct:SM::Flow::VERB 
  body: "   nil.to_f   #=&gt; 0.0\n"
full_name: NilClass#to_f
is_singleton: false
name: to_f
params: |
  nil.to_f    => 0.0

visibility: public
PK}[Wol���$ri/1.8/system/NilClass/nil%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "call_seq:"
- !ruby/struct:SM::Flow::VERB 
  body: "  nil.nil?               =&gt; true\n"
- !ruby/struct:SM::Flow::P 
  body: Only the object <em>nil</em> responds <tt>true</tt> to <tt>nil?</tt>.
full_name: NilClass#nil?
is_singleton: false
name: nil?
params: ()
visibility: public
PK}[�\����4ri/1.8/system/NoMemoryError/cdesc-NoMemoryError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: NoMemoryError
includes: []

instance_methods: []

name: NoMemoryError
superclass: Exception
PK}[}�Df��"ri/1.8/system/Data/cdesc-Data.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: in class.c
constants: []

full_name: Data
includes: []

instance_methods: []

name: Data
superclass: Object
PK}[o�GFFLri/1.8/system/Test/Unit/AssertionFailedError/cdesc-AssertionFailedError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Thrown by Test::Unit::Assertions when an assertion fails.
constants: []

full_name: Test::Unit::AssertionFailedError
includes: []

instance_methods: []

name: AssertionFailedError
superclass: StandardError
PK}[��
.%%7ri/1.8/system/Test/Unit/TestResult/failure_count-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of failures this TestResult has recorded.
full_name: Test::Unit::TestResult#failure_count
is_singleton: false
name: failure_count
params: ()
visibility: public
PK}[�*��%%3ri/1.8/system/Test/Unit/TestResult/passed%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns whether or not this TestResult represents successful completion.
full_name: Test::Unit::TestResult#passed?
is_singleton: false
name: passed?
params: ()
visibility: public
PK}[b�����1ri/1.8/system/Test/Unit/TestResult/add_run-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Records a test run.
full_name: Test::Unit::TestResult#add_run
is_singleton: false
name: add_run
params: ()
visibility: public
PK}[U�J��-ri/1.8/system/Test/Unit/TestResult/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Constructs a new, empty TestResult.
full_name: Test::Unit::TestResult::new
is_singleton: true
name: new
params: ()
visibility: public
PK}[P��

5ri/1.8/system/Test/Unit/TestResult/add_failure-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Records a Test::Unit::Failure.
full_name: Test::Unit::TestResult#add_failure
is_singleton: false
name: add_failure
params: (failure)
visibility: public
PK}[�K���8ri/1.8/system/Test/Unit/TestResult/cdesc-TestResult.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: assertion_count
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: run_count
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Collects Test::Unit::Failure and Test::Unit::Error so that they can be displayed to the user. To this end, observers can be added to it, allowing the dynamic updating of, say, a UI.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: CHANGED
  value: "\"CHANGED\""
- !ruby/object:RI::Constant 
  comment: 
  name: FAULT
  value: "\"FAULT\""
full_name: Test::Unit::TestResult
includes: 
- !ruby/object:RI::IncludedModule 
  name: Util::Observable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_assertion
- !ruby/object:RI::MethodSummary 
  name: add_error
- !ruby/object:RI::MethodSummary 
  name: add_failure
- !ruby/object:RI::MethodSummary 
  name: add_run
- !ruby/object:RI::MethodSummary 
  name: error_count
- !ruby/object:RI::MethodSummary 
  name: failure_count
- !ruby/object:RI::MethodSummary 
  name: passed?
- !ruby/object:RI::MethodSummary 
  name: to_s
name: TestResult
superclass: Object
PK}[�(��		7ri/1.8/system/Test/Unit/TestResult/add_assertion-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Records an individual assertion.
full_name: Test::Unit::TestResult#add_assertion
is_singleton: false
name: add_assertion
params: ()
visibility: public
PK}[�j66.ri/1.8/system/Test/Unit/TestResult/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a string contain the recorded runs, assertions, failures and errors in this TestResult.
full_name: Test::Unit::TestResult#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK}[o*(75ri/1.8/system/Test/Unit/TestResult/error_count-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of errors this TestResult has recorded.
full_name: Test::Unit::TestResult#error_count
is_singleton: false
name: error_count
params: ()
visibility: public
PK}[]�g
3ri/1.8/system/Test/Unit/TestResult/add_error-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Records a Test::Unit::Error.
full_name: Test::Unit::TestResult#add_error
is_singleton: false
name: add_error
params: (error)
visibility: public
PK}[��A%��.ri/1.8/system/Test/Unit/Error/cdesc-Error.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: exception
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: test_name
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Encapsulates an error in a test. Created by Test::Unit::TestCase when it rescues an exception thrown during the processing of a test.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: SINGLE_CHARACTER
  value: "'E'"
full_name: Test::Unit::Error
includes: 
- !ruby/object:RI::IncludedModule 
  name: Util::BacktraceFilter
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: long_display
- !ruby/object:RI::MethodSummary 
  name: message
- !ruby/object:RI::MethodSummary 
  name: short_display
- !ruby/object:RI::MethodSummary 
  name: single_character_display
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Error
superclass: Object
PK}[��hY1ri/1.8/system/Test/Unit/Error/long_display-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a verbose version of the error description.
full_name: Test::Unit::Error#long_display
is_singleton: false
name: long_display
params: ()
visibility: public
PK}[���]2ri/1.8/system/Test/Unit/Error/short_display-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a brief version of the error description.
full_name: Test::Unit::Error#short_display
is_singleton: false
name: short_display
params: ()
visibility: public
PK}[�O}�(ri/1.8/system/Test/Unit/Error/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new Error with the given test_name and exception.
full_name: Test::Unit::Error::new
is_singleton: true
name: new
params: (test_name, exception)
visibility: public
PK}[2�-00=ri/1.8/system/Test/Unit/Error/single_character_display-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a single character representation of an error.
full_name: Test::Unit::Error#single_character_display
is_singleton: false
name: single_character_display
params: ()
visibility: public
PK}[B{w,ri/1.8/system/Test/Unit/Error/message-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the message associated with the error.
full_name: Test::Unit::Error#message
is_singleton: false
name: message
params: ()
visibility: public
PK}[9
����)ri/1.8/system/Test/Unit/Error/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Overridden to return long_display.
full_name: Test::Unit::Error#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK}[�)���,ri/1.8/system/Test/Unit/TestCase/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::TestCase#size
is_singleton: false
name: size
params: ()
visibility: public
PK}[�5��//0ri/1.8/system/Test/Unit/TestCase/teardown-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Called after every test method runs. Can be used to tear down fixture information.
full_name: Test::Unit::TestCase#teardown
is_singleton: false
name: teardown
params: ()
visibility: public
PK}[7:$ee1ri/1.8/system/Test/Unit/TestCase/passed%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns whether this individual test passed or not. Primarily for use in teardown so that artifacts can be left behind if the test fails.
full_name: Test::Unit::TestCase#passed?
is_singleton: false
name: passed?
params: ()
visibility: private
PK}[1T>>+ri/1.8/system/Test/Unit/TestCase/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new instance of the fixture for running the test represented by test_method_name.
full_name: Test::Unit::TestCase::new
is_singleton: true
name: new
params: (test_method_name)
visibility: public
PK}[e�OO-ri/1.8/system/Test/Unit/TestCase/suite-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Rolls up all of the test* methods in the fixture into one suite, creating a new instance of the fixture for each method.
full_name: Test::Unit::TestCase::suite
is_singleton: true
name: suite
params: ()
visibility: public
PK}[g{���4ri/1.8/system/Test/Unit/TestCase/default_test-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::TestCase#default_test
is_singleton: false
name: default_test
params: ()
visibility: public
PK}[��\��3ri/1.8/system/Test/Unit/TestCase/add_failure-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::TestCase#add_failure
is_singleton: false
name: add_failure
params: (message, all_locations=caller())
visibility: private
PK}[L����5ri/1.8/system/Test/Unit/TestCase/add_assertion-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::TestCase#add_assertion
is_singleton: false
name: add_assertion
params: ()
visibility: private
PK}[��s�4ri/1.8/system/Test/Unit/TestCase/cdesc-TestCase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: method_name
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: suite
comment: 
- !ruby/struct:SM::Flow::P 
  body: Ties everything together. If you subclass and add your own test methods, it takes care of making them into tests and wrapping those tests into a suite. It also does the nitty-gritty of actually running an individual test and collecting its results into a Test::Unit::TestResult object.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: STARTED
  value: name + "::STARTED"
- !ruby/object:RI::Constant 
  comment: 
  name: FINISHED
  value: name + "::FINISHED"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "These exceptions are not caught by #run."
  name: PASSTHROUGH_EXCEPTIONS
  value: "[NoMemoryError, SignalException, Interrupt,                                 SystemExit]"
full_name: Test::Unit::TestCase
includes: 
- !ruby/object:RI::IncludedModule 
  name: Assertions
- !ruby/object:RI::IncludedModule 
  name: Util::BacktraceFilter
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: add_assertion
- !ruby/object:RI::MethodSummary 
  name: add_error
- !ruby/object:RI::MethodSummary 
  name: add_failure
- !ruby/object:RI::MethodSummary 
  name: default_test
- !ruby/object:RI::MethodSummary 
  name: name
- !ruby/object:RI::MethodSummary 
  name: passed?
- !ruby/object:RI::MethodSummary 
  name: run
- !ruby/object:RI::MethodSummary 
  name: setup
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: teardown
- !ruby/object:RI::MethodSummary 
  name: to_s
name: TestCase
superclass: Object
PK}[mt����,ri/1.8/system/Test/Unit/TestCase/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Overridden to return #name."
full_name: Test::Unit::TestCase#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK}[�"f$

.ri/1.8/system/Test/Unit/TestCase/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: It's handy to be able to compare TestCase instances.
full_name: Test::Unit::TestCase#==
is_singleton: false
name: ==
params: (other)
visibility: public
PK}[`��''-ri/1.8/system/Test/Unit/TestCase/setup-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Called before every test method runs. Can be used to set up fixture information.
full_name: Test::Unit::TestCase#setup
is_singleton: false
name: setup
params: ()
visibility: public
PK}[�1�E��+ri/1.8/system/Test/Unit/TestCase/run-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (STARTED, name)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Runs the individual test method represented by this instance of the fixture, collecting statistics, failures and errors in result.
full_name: Test::Unit::TestCase#run
is_singleton: false
name: run
params: (result) {|STARTED, name| ...}
visibility: public
PK}[�"}�33,ri/1.8/system/Test/Unit/TestCase/name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a human-readable name for the specific test that this instance of TestCase represents.
full_name: Test::Unit::TestCase#name
is_singleton: false
name: name
params: ()
visibility: public
PK}[Y�4���1ri/1.8/system/Test/Unit/TestCase/add_error-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::TestCase#add_error
is_singleton: false
name: add_error
params: (exception)
visibility: private
PK}[�eR�vv-ri/1.8/system/Test/Unit/TestSuite/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Retuns the rolled up number of tests in this suite; i.e. if the suite contains other suites, it counts the tests within those suites, not the suites themselves.
full_name: Test::Unit::TestSuite#size
is_singleton: false
name: size
params: ()
visibility: public
PK}[(ލ0��1ri/1.8/system/Test/Unit/TestSuite/empty%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::TestSuite#empty?
is_singleton: false
name: empty?
params: ()
visibility: public
PK}[d�Y��/ri/1.8/system/Test/Unit/TestSuite/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::TestSuite#delete
is_singleton: false
name: delete
params: (test)
visibility: public
PK}[T{+�,ri/1.8/system/Test/Unit/TestSuite/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new TestSuite with the given name.
full_name: Test::Unit::TestSuite::new
is_singleton: true
name: new
params: (name="Unnamed TestSuite")
visibility: public
PK}[{;Q'��/ri/1.8/system/Test/Unit/TestSuite/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds the test to the suite.
full_name: Test::Unit::TestSuite#<<
is_singleton: false
name: "<<"
params: (test)
visibility: public
PK}[�twi-ri/1.8/system/Test/Unit/TestSuite/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Overridden to return the name given the suite at creation.
full_name: Test::Unit::TestSuite#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK}[J�/ri/1.8/system/Test/Unit/TestSuite/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: It's handy to be able to compare TestSuite instances.
full_name: Test::Unit::TestSuite#==
is_singleton: false
name: ==
params: (other)
visibility: public
PK}[�J~�II,ri/1.8/system/Test/Unit/TestSuite/run-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (STARTED, name)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Runs the tests and/or suites contained in this TestSuite.
full_name: Test::Unit::TestSuite#run
is_singleton: false
name: run
params: (result, &progress_block) {|STARTED, name| ...}
visibility: public
PK}[O����6ri/1.8/system/Test/Unit/TestSuite/cdesc-TestSuite.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: tests
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "A collection of tests which can be #run."
- !ruby/struct:SM::Flow::P 
  body: "Note: It is easy to confuse a TestSuite instance with something that has a static suite method; I know because <em>I</em> have trouble keeping them straight. Think of something that has a suite method as simply providing a way to get a meaningful TestSuite instance."
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: STARTED
  value: name + "::STARTED"
- !ruby/object:RI::Constant 
  comment: 
  name: FINISHED
  value: name + "::FINISHED"
full_name: Test::Unit::TestSuite
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: empty?
- !ruby/object:RI::MethodSummary 
  name: run
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: to_s
name: TestSuite
superclass: Object
PK}[ܶn���-ri/1.8/system/Test/Unit/AutoRunner/run-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::AutoRunner::run
is_singleton: true
name: run
params: (force_standalone=false, default_dir=nil, argv=ARGV, &block)
visibility: public
PK}[O����8ri/1.8/system/Test/Unit/AutoRunner/cdesc-AutoRunner.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: run
- !ruby/object:RI::MethodSummary 
  name: standalone?
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: RUNNERS
  value: "{         :console => proc do |r|           require 'test/unit/ui/console/testrunner'"
full_name: Test::Unit::AutoRunner
includes: []

instance_methods: []

name: AutoRunner
superclass: Object
PK}[�|D��7ri/1.8/system/Test/Unit/AutoRunner/standalone%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::AutoRunner::standalone?
is_singleton: true
name: standalone?
params: ()
visibility: public
PK}[j�����6ri/1.8/system/Test/Unit/Util/ProcWrapper/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #=="
full_name: Test::Unit::Util::ProcWrapper#eql?
is_singleton: false
name: eql?
params: (other)
visibility: public
PK}[��9��7ri/1.8/system/Test/Unit/Util/ProcWrapper/to_proc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::Util::ProcWrapper#to_proc
is_singleton: false
name: to_proc
params: ()
visibility: public
PK}[�B�I��4ri/1.8/system/Test/Unit/Util/ProcWrapper/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::Util::ProcWrapper#hash
is_singleton: false
name: hash
params: ()
visibility: public
PK}[97R3ri/1.8/system/Test/Unit/Util/ProcWrapper/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new wrapper for a_proc.
full_name: Test::Unit::Util::ProcWrapper::new
is_singleton: true
name: new
params: (a_proc)
visibility: public
PK}[�˪���6ri/1.8/system/Test/Unit/Util/ProcWrapper/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: eql?
block_params: 
comment: 
full_name: Test::Unit::Util::ProcWrapper#==
is_singleton: false
name: ==
params: (other)
visibility: public
PK}[�kI7""?ri/1.8/system/Test/Unit/Util/ProcWrapper/cdesc-ProcWrapper.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Allows the storage of a Proc passed through '&amp;' in a hash.
- !ruby/struct:SM::Flow::P 
  body: "Note: this may be inefficient, since the hash being used is not necessarily very good. In Observable, efficiency is not too important, since the hash is only accessed when adding and removing listeners, not when notifying."
constants: []

full_name: Test::Unit::Util::ProcWrapper
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: to_proc
name: ProcWrapper
superclass: Object
PK}[��}��,ri/1.8/system/Test/Unit/Util/cdesc-Util.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Test::Unit::Util
includes: []

instance_methods: []

name: Util
superclass: 
PK}[��H���Dri/1.8/system/Test/Unit/Util/BacktraceFilter/filter_backtrace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::Util::BacktraceFilter#filter_backtrace
is_singleton: false
name: filter_backtrace
params: (backtrace, prefix=nil)
visibility: public
PK}[ӭ�<<Gri/1.8/system/Test/Unit/Util/BacktraceFilter/cdesc-BacktraceFilter.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: TESTUNIT_FILE_SEPARATORS
  value: "%r{[\\\\/:]}"
- !ruby/object:RI::Constant 
  comment: 
  name: TESTUNIT_PREFIX
  value: __FILE__.split(TESTUNIT_FILE_SEPARATORS)[0..-3]
- !ruby/object:RI::Constant 
  comment: 
  name: TESTUNIT_RB_FILE
  value: /\.rb\Z/
full_name: Test::Unit::Util::BacktraceFilter
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: filter_backtrace
name: BacktraceFilter
superclass: 
PK}[����;ri/1.8/system/Test/Unit/Util/Observable/add_listener-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: value
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds the passed proc as a listener on the channel indicated by channel_name. listener_key is used to remove the listener later; if none is specified, the proc itself is used.
- !ruby/struct:SM::Flow::P 
  body: "Whatever is used as the listener_key is returned, making it very easy to use the proc itself as the listener_key:"
- !ruby/struct:SM::Flow::VERB 
  body: " listener = add_listener(&quot;Channel&quot;) { ... }\n remove_listener(&quot;Channel&quot;, listener)\n"
full_name: Test::Unit::Util::Observable#add_listener
is_singleton: false
name: add_listener
params: (channel_name, listener_key=NOTHING) {|value| ...}
visibility: public
PK}[����>ri/1.8/system/Test/Unit/Util/Observable/remove_listener-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes the listener indicated by listener_key from the channel indicated by channel_name. Returns the registered proc, or nil if none was found.
full_name: Test::Unit::Util::Observable#remove_listener
is_singleton: false
name: remove_listener
params: (channel_name, listener_key)
visibility: public
PK}[��q��7ri/1.8/system/Test/Unit/Util/Observable/channels-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::Util::Observable#channels
is_singleton: false
name: channels
params: ()
visibility: private
PK}[�5��=ri/1.8/system/Test/Unit/Util/Observable/cdesc-Observable.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: This is a utility class that allows anything mixing it in to notify a set of listeners about interesting events.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: We use this for defaults since nil might mean something
  name: NOTHING
  value: "\"NOTHING/#{__id__}\""
full_name: Test::Unit::Util::Observable
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_listener
- !ruby/object:RI::MethodSummary 
  name: channels
- !ruby/object:RI::MethodSummary 
  name: notify_listeners
- !ruby/object:RI::MethodSummary 
  name: remove_listener
name: Observable
superclass: 
PK}[:*���?ri/1.8/system/Test/Unit/Util/Observable/notify_listeners-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls all the procs registered on the channel indicated by channel_name. If value is specified, it is passed in to the procs, otherwise they are called with no arguments.
full_name: Test::Unit::Util::Observable#notify_listeners
is_singleton: false
name: notify_listeners
params: (channel_name, *arguments)
visibility: public
PK}[v#����%ri/1.8/system/Test/Unit/run%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Already tests have run?
full_name: Test::Unit::run?
is_singleton: true
name: run?
params: ()
visibility: public
PK}[��v3ri/1.8/system/Test/Unit/Failure/long_display-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a verbose version of the error description.
full_name: Test::Unit::Failure#long_display
is_singleton: false
name: long_display
params: ()
visibility: public
PK}[U��4ri/1.8/system/Test/Unit/Failure/short_display-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a brief version of the error description.
full_name: Test::Unit::Failure#short_display
is_singleton: false
name: short_display
params: ()
visibility: public
PK}[W�((*ri/1.8/system/Test/Unit/Failure/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new Failure with the given location and message.
full_name: Test::Unit::Failure::new
is_singleton: true
name: new
params: (test_name, location, message)
visibility: public
PK}[Y�s�33?ri/1.8/system/Test/Unit/Failure/single_character_display-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a single character representation of a failure.
full_name: Test::Unit::Failure#single_character_display
is_singleton: false
name: single_character_display
params: ()
visibility: public
PK}[��s���+ri/1.8/system/Test/Unit/Failure/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Overridden to return long_display.
full_name: Test::Unit::Failure#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK}[�d^^2ri/1.8/system/Test/Unit/Failure/cdesc-Failure.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: location
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: message
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: test_name
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Encapsulates a test failure. Created by Test::Unit::TestCase when an assertion fails.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: SINGLE_CHARACTER
  value: "'F'"
full_name: Test::Unit::Failure
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: long_display
- !ruby/object:RI::MethodSummary 
  name: short_display
- !ruby/object:RI::MethodSummary 
  name: single_character_display
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Failure
superclass: Object
PK}[�F��1�1'ri/1.8/system/Test/Unit/cdesc-Unit.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: run=
- !ruby/object:RI::MethodSummary 
  name: run?
comment: 
- !ruby/struct:SM::Flow::H 
  level: 1
  text: Test::Unit - Ruby Unit Testing Framework
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Introduction
- !ruby/struct:SM::Flow::P 
  body: Unit testing is making waves all over the place, largely due to the fact that it is a core practice of XP. While XP is great, unit testing has been around for a long time and has always been a good idea. One of the keys to good unit testing, though, is not just writing tests, but having tests. What's the difference? Well, if you just <em>write</em> a test and throw it away, you have no guarantee that something won't change later which breaks your code. If, on the other hand, you <em>have</em> tests (obviously you have to write them first), and run them as often as possible, you slowly build up a wall of things that cannot break without you immediately knowing about it. This is when unit testing hits its peak usefulness.
- !ruby/struct:SM::Flow::P 
  body: Enter Test::Unit, a framework for unit testing in Ruby, helping you to design, debug and evaluate your code by making it easy to write and have tests for it.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Notes
- !ruby/struct:SM::Flow::P 
  body: Test::Unit has grown out of and superceded Lapidary.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Feedback
- !ruby/struct:SM::Flow::P 
  body: I like (and do my best to practice) XP, so I value early releases, user feedback, and clean, simple, expressive code. There is always room for improvement in everything I do, and Test::Unit is no exception. Please, let me know what you think of Test::Unit as it stands, and what you'd like to see expanded/changed/improved/etc. If you find a bug, let me know ASAP; one good way to let me know what the bug is is to submit a new test that catches it :-) Also, I'd love to hear about any successes you have with Test::Unit, and any documentation you might add will be greatly appreciated. My contact info is below.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Contact Information
- !ruby/struct:SM::Flow::P 
  body: A lot of discussion happens about Ruby in general on the ruby-talk mailing list (http://www.ruby-lang.org/en/ml.html), and you can ask any questions you might have there. I monitor the list, as do many other helpful Rubyists, and you're sure to get a quick answer. Of course, you're also welcome to email me (Nathaniel Talbott) directly at mailto:testunit@talbott.ws, and I'll do my best to help you out.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Credits
- !ruby/struct:SM::Flow::P 
  body: I'd like to thank...
- !ruby/struct:SM::Flow::P 
  body: Matz, for a great language!
- !ruby/struct:SM::Flow::P 
  body: Masaki Suketa, for his work on RubyUnit, which filled a vital need in the Ruby world for a very long time. I'm also grateful for his help in polishing Test::Unit and getting the RubyUnit compatibility layer right. His graciousness in allowing Test::Unit to supercede RubyUnit continues to be a challenge to me to be more willing to defer my own rights.
- !ruby/struct:SM::Flow::P 
  body: Ken McKinlay, for his interest and work on unit testing, and for his willingness to dialog about it. He was also a great help in pointing out some of the holes in the RubyUnit compatibility layer.
- !ruby/struct:SM::Flow::P 
  body: Dave Thomas, for the original idea that led to the extremely simple &quot;require 'test/unit'&quot;, plus his code to improve it even more by allowing the selection of tests from the command-line. Also, without RDoc, the documentation for Test::Unit would stink a lot more than it does now.
- !ruby/struct:SM::Flow::P 
  body: Everyone who's helped out with bug reports, feature ideas, encouragement to continue, etc. It's a real privilege to be a part of the Ruby community.
- !ruby/struct:SM::Flow::P 
  body: The guys at RoleModel Software, for putting up with me repeating, &quot;But this would be so much easier in Ruby!&quot; whenever we're coding in Java.
- !ruby/struct:SM::Flow::P 
  body: My Creator, for giving me life, and giving it more abundantly.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: License
- !ruby/struct:SM::Flow::P 
  body: Test::Unit is copyright (c) 2000-2003 Nathaniel Talbott. It is free software, and is distributed under the Ruby license. See the COPYING file in the standard Ruby distribution for details.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Warranty
- !ruby/struct:SM::Flow::P 
  body: This software is provided &quot;as is&quot; and without any express or implied warranties, including, without limitation, the implied warranties of merchantibility and fitness for a particular purpose.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Author
- !ruby/struct:SM::Flow::P 
  body: Nathaniel Talbott. Copyright (c) 2000-2003, Nathaniel Talbott
- !ruby/struct:SM::Flow::RULE 
  width: 2
- !ruby/struct:SM::Flow::H 
  level: 1
  text: Usage
- !ruby/struct:SM::Flow::P 
  body: The general idea behind unit testing is that you write a <em>test</em> <em>method</em> that makes certain <em>assertions</em> about your code, working against a <em>test</em> <em>fixture</em>. A bunch of these <em>test</em> <em>methods</em> are bundled up into a <em>test</em> <em>suite</em> and can be run any time the developer wants. The results of a run are gathered in a <em>test</em> <em>result</em> and displayed to the user through some UI. So, lets break this down and see how Test::Unit provides each of these necessary pieces.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Assertions
- !ruby/struct:SM::Flow::P 
  body: These are the heart of the framework. Think of an assertion as a statement of expected outcome, i.e. &quot;I assert that x should be equal to y&quot;. If, when the assertion is executed, it turns out to be correct, nothing happens, and life is good. If, on the other hand, your assertion turns out to be false, an error is propagated with pertinent information so that you can go back and make your assertion succeed, and, once again, life is good. For an explanation of the current assertions, see Test::Unit::Assertions.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Test Method &amp; Test Fixture
- !ruby/struct:SM::Flow::P 
  body: Obviously, these assertions have to be called within a context that knows about them and can do something meaningful with their pass/fail value. Also, it's handy to collect a bunch of related tests, each test represented by a method, into a common test class that knows how to run them. The tests will be in a separate class from the code they're testing for a couple of reasons. First of all, it allows your code to stay uncluttered with test code, making it easier to maintain. Second, it allows the tests to be stripped out for deployment, since they're really there for you, the developer, and your users don't need them. Third, and most importantly, it allows you to set up a common test fixture for your tests to run against.
- !ruby/struct:SM::Flow::P 
  body: What's a test fixture? Well, tests do not live in a vacuum; rather, they're run against the code they are testing. Often, a collection of tests will run against a common set of data, also called a fixture. If they're all bundled into the same test class, they can all share the setting up and tearing down of that data, eliminating unnecessary duplication and making it much easier to add related tests.
- !ruby/struct:SM::Flow::P 
  body: "Test::Unit::TestCase wraps up a collection of test methods together and allows you to easily set up and tear down the same test fixture for each test. This is done by overriding #setup and/or #teardown, which will be called before and after each test method that is run. The TestCase also knows how to collect the results of your assertions into a Test::Unit::TestResult, which can then be reported back to you... but I'm getting ahead of myself. To write a test, follow these steps:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Make sure Test::Unit is in your library path.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: require 'test/unit' in your test script.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Create a class that subclasses Test::Unit::TestCase.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Add a method that begins with &quot;test&quot; to your class.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Make assertions in your test method.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "Optionally define #setup and/or #teardown to set up and/or tear down your common test fixture."
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: You can now run your test as you would any other Ruby script... try it and see!
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "A really simple test might look like this (#setup and #teardown are commented out to indicate that they are completely optional):"
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'test/unit'\n\n    class TC_MyTest &lt; Test::Unit::TestCase\n      # def setup\n      # end\n\n      # def teardown\n      # end\n\n      def test_fail\n        assert(false, 'Assertion was false.')\n      end\n    end\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Test Runners
- !ruby/struct:SM::Flow::P 
  body: "So, now you have this great test class, but you still need a way to run it and view any failures that occur during the run. This is where Test::Unit::UI::Console::TestRunner (and others, such as Test::Unit::UI::GTK::TestRunner) comes into play. The console test runner is automatically invoked for you if you require 'test/unit' and simply run the file. To use another runner, or to manually invoke a runner, simply call its run class method and pass in an object that responds to the suite message with a Test::Unit::TestSuite. This can be as simple as passing in your TestCase class (which has a class suite method). It might look something like this:"
- !ruby/struct:SM::Flow::VERB 
  body: "   require 'test/unit/ui/console/testrunner'\n   Test::Unit::UI::Console::TestRunner.run(TC_MyTest)\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Test Suite
- !ruby/struct:SM::Flow::P 
  body: "As more and more unit tests accumulate for a given project, it becomes a real drag running them one at a time, and it also introduces the potential to overlook a failing test because you forget to run it. Suddenly it becomes very handy that the TestRunners can take any object that returns a Test::Unit::TestSuite in response to a suite method. The TestSuite can, in turn, contain other TestSuites or individual tests (typically created by a TestCase). In other words, you can easily wrap up a group of TestCases and TestSuites like this:"
- !ruby/struct:SM::Flow::VERB 
  body: " require 'test/unit/testsuite'\n require 'tc_myfirsttests'\n require 'tc_moretestsbyme'\n require 'ts_anothersetoftests'\n\n class TS_MyTests\n   def self.suite\n     suite = Test::Unit::TestSuite.new\n     suite &lt;&lt; TC_MyFirstTests.suite\n     suite &lt;&lt; TC_MoreTestsByMe.suite\n     suite &lt;&lt; TS_AnotherSetOfTests.suite\n     return suite\n   end\n end\n Test::Unit::UI::Console::TestRunner.run(TS_MyTests)\n"
- !ruby/struct:SM::Flow::P 
  body: "Now, this is a bit cumbersome, so Test::Unit does a little bit more for you, by wrapping these up automatically when you require 'test/unit'. What does this mean? It means you could write the above test case like this instead:"
- !ruby/struct:SM::Flow::VERB 
  body: " require 'test/unit'\n require 'tc_myfirsttests'\n require 'tc_moretestsbyme'\n require 'ts_anothersetoftests'\n"
- !ruby/struct:SM::Flow::P 
  body: Test::Unit is smart enough to find all the test cases existing in the ObjectSpace and wrap them up into a suite for you. It then runs the dynamic suite using the console TestRunner.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Questions?
- !ruby/struct:SM::Flow::P 
  body: I'd really like to get feedback from all levels of Ruby practitioners about typos, grammatical errors, unclear statements, missing points, etc., in this document (or any other).
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: OUTPUT_LEVELS
  value: "[         [:silent, UI::SILENT],         [:progress, UI::PROGRESS_ONLY],         [:normal, UI::NORMAL],         [:verbose, UI::VERBOSE],       ]"
- !ruby/object:RI::Constant 
  comment: 
  name: COLLECTORS
  value: "{         :objectspace => proc do |r|           require 'test/unit/collector/objectspace'"
full_name: Test::Unit
includes: []

instance_methods: []

name: Unit
superclass: 
PK}[��.A��2ri/1.8/system/Test/Unit/Collector/filter%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::Collector#filter=
is_singleton: false
name: filter=
params: (filters)
visibility: public
PK}[2'�1��6ri/1.8/system/Test/Unit/Collector/cdesc-Collector.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: Test::Unit::Collector
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_suite
- !ruby/object:RI::MethodSummary 
  name: filter=
- !ruby/object:RI::MethodSummary 
  name: include?
- !ruby/object:RI::MethodSummary 
  name: sort
name: Collector
superclass: 
PK}[b/����3ri/1.8/system/Test/Unit/Collector/include%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::Collector#include?
is_singleton: false
name: include?
params: (test)
visibility: public
PK}[�60���,ri/1.8/system/Test/Unit/Collector/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::Collector::new
is_singleton: true
name: new
params: ()
visibility: public
PK}[Ɯn���4ri/1.8/system/Test/Unit/Collector/Dir/cdesc-Dir.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: base
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: exclude
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: pattern
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: Test::Unit::Collector::Dir
includes: 
- !ruby/object:RI::IncludedModule 
  name: Collector
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: collect
- !ruby/object:RI::MethodSummary 
  name: collect_file
- !ruby/object:RI::MethodSummary 
  name: find_test_cases
- !ruby/object:RI::MethodSummary 
  name: realdir
- !ruby/object:RI::MethodSummary 
  name: recursive_collect
name: Dir
superclass: Object
PK}[]��P��4ri/1.8/system/Test/Unit/Collector/Dir/collect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::Collector::Dir#collect
is_singleton: false
name: collect
params: (*from)
visibility: public
PK}[T�p^��0ri/1.8/system/Test/Unit/Collector/Dir/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::Collector::Dir::new
is_singleton: true
name: new
params: (dir=::Dir, file=::File, object_space=::ObjectSpace, req=nil)
visibility: public
PK}[��C���<ri/1.8/system/Test/Unit/Collector/Dir/find_test_cases-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::Collector::Dir#find_test_cases
is_singleton: false
name: find_test_cases
params: (ignore=[])
visibility: public
PK}[^X.��>ri/1.8/system/Test/Unit/Collector/Dir/recursive_collect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::Collector::Dir#recursive_collect
is_singleton: false
name: recursive_collect
params: (name, already_gathered)
visibility: public
PK}[�in��4ri/1.8/system/Test/Unit/Collector/Dir/realdir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::Collector::Dir#realdir
is_singleton: false
name: realdir
params: (path)
visibility: public
PK}[�����9ri/1.8/system/Test/Unit/Collector/Dir/collect_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::Collector::Dir#collect_file
is_singleton: false
name: collect_file
params: (name, suites, already_gathered)
visibility: public
PK}[j@%߷�-ri/1.8/system/Test/Unit/Collector/sort-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::Collector#sort
is_singleton: false
name: sort
params: (suites)
visibility: public
PK}[P�9���2ri/1.8/system/Test/Unit/Collector/add_suite-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::Collector#add_suite
is_singleton: false
name: add_suite
params: (destination, suite)
visibility: public
PK}[�/��Dri/1.8/system/Test/Unit/Collector/ObjectSpace/cdesc-ObjectSpace.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: NAME
  value: "'collected from the ObjectSpace'"
full_name: Test::Unit::Collector::ObjectSpace
includes: 
- !ruby/object:RI::IncludedModule 
  name: Collector
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: collect
name: ObjectSpace
superclass: Object
PK}[�����<ri/1.8/system/Test/Unit/Collector/ObjectSpace/collect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::Collector::ObjectSpace#collect
is_singleton: false
name: collect
params: (name=NAME)
visibility: public
PK}[�>�)��8ri/1.8/system/Test/Unit/Collector/ObjectSpace/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::Collector::ObjectSpace::new
is_singleton: true
name: new
params: (source=::ObjectSpace)
visibility: public
PK}[^O<~..%ri/1.8/system/Test/Unit/run%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set true when Test::Unit has run. If set to true Test::Unit will not automatically run at exit.
full_name: Test::Unit::run=
is_singleton: true
name: run=
params: (flag)
visibility: public
PK}[,����;ri/1.8/system/Test/Unit/UI/Tk/TestRunner/clear_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Tk::TestRunner#clear_fault
is_singleton: false
name: clear_fault
params: ()
visibility: private
PK}[���k��Bri/1.8/system/Test/Unit/UI/Tk/TestRunner/create_count_label-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Tk::TestRunner#create_count_label
is_singleton: false
name: create_count_label
params: (parent, label)
visibility: private
PK}[����4ri/1.8/system/Test/Unit/UI/Tk/TestRunner/stop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Tk::TestRunner#stop
is_singleton: false
name: stop
params: ()
visibility: private
PK}[}|��<ri/1.8/system/Test/Unit/UI/Tk/TestRunner/test_started-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Tk::TestRunner#test_started
is_singleton: false
name: test_started
params: (test_name)
visibility: private
PK}[�K(2��Bri/1.8/system/Test/Unit/UI/Tk/TestRunner/attach_to_mediator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Tk::TestRunner#attach_to_mediator
is_singleton: false
name: attach_to_mediator
params: ()
visibility: private
PK}[6�����7ri/1.8/system/Test/Unit/UI/Tk/TestRunner/started-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Tk::TestRunner#started
is_singleton: false
name: started
params: (result)
visibility: private
PK}[kjZ?��:ri/1.8/system/Test/Unit/UI/Tk/TestRunner/show_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Tk::TestRunner#show_fault
is_singleton: false
name: show_fault
params: (fault)
visibility: private
PK}[! ���8ri/1.8/system/Test/Unit/UI/Tk/TestRunner/setup_ui-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Tk::TestRunner#setup_ui
is_singleton: false
name: setup_ui
params: ()
visibility: private
PK}[�d��//3ri/1.8/system/Test/Unit/UI/Tk/TestRunner/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new TestRunner for running the passed suite.
full_name: Test::Unit::UI::Tk::TestRunner::new
is_singleton: true
name: new
params: (suite, output_level = NORMAL)
visibility: public
PK}[��>��5ri/1.8/system/Test/Unit/UI/Tk/TestRunner/start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Begins the test run.
full_name: Test::Unit::UI::Tk::TestRunner#start
is_singleton: false
name: start
params: ()
visibility: public
PK}[�_ɬ��9ri/1.8/system/Test/Unit/UI/Tk/TestRunner/add_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Tk::TestRunner#add_fault
is_singleton: false
name: add_fault
params: (fault)
visibility: private
PK}[�77r��=ri/1.8/system/Test/Unit/UI/Tk/TestRunner/output_status-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Tk::TestRunner#output_status
is_singleton: false
name: output_status
params: (string)
visibility: private
PK}[{�1^^>ri/1.8/system/Test/Unit/UI/Tk/TestRunner/cdesc-TestRunner.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Runs a Test::Unit::TestSuite in a Tk UI. Obviously, this one requires you to have Tk and the Ruby Tk extension installed.
constants: []

full_name: Test::Unit::UI::Tk::TestRunner
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_fault
- !ruby/object:RI::MethodSummary 
  name: attach_to_mediator
- !ruby/object:RI::MethodSummary 
  name: clear_fault
- !ruby/object:RI::MethodSummary 
  name: create_count_label
- !ruby/object:RI::MethodSummary 
  name: finished
- !ruby/object:RI::MethodSummary 
  name: output_status
- !ruby/object:RI::MethodSummary 
  name: raw_show_fault
- !ruby/object:RI::MethodSummary 
  name: reset_ui
- !ruby/object:RI::MethodSummary 
  name: result_changed
- !ruby/object:RI::MethodSummary 
  name: run_test
- !ruby/object:RI::MethodSummary 
  name: setup_mediator
- !ruby/object:RI::MethodSummary 
  name: setup_ui
- !ruby/object:RI::MethodSummary 
  name: show_fault
- !ruby/object:RI::MethodSummary 
  name: start
- !ruby/object:RI::MethodSummary 
  name: start_ui
- !ruby/object:RI::MethodSummary 
  name: started
- !ruby/object:RI::MethodSummary 
  name: stop
- !ruby/object:RI::MethodSummary 
  name: test_started
name: TestRunner
superclass: Object
PK}[���F��8ri/1.8/system/Test/Unit/UI/Tk/TestRunner/finished-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Tk::TestRunner#finished
is_singleton: false
name: finished
params: (elapsed_time)
visibility: private
PK}[.����8ri/1.8/system/Test/Unit/UI/Tk/TestRunner/run_test-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Tk::TestRunner#run_test
is_singleton: false
name: run_test
params: ()
visibility: private
PK}[�ұ��>ri/1.8/system/Test/Unit/UI/Tk/TestRunner/raw_show_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Tk::TestRunner#raw_show_fault
is_singleton: false
name: raw_show_fault
params: (string)
visibility: private
PK}[�����>ri/1.8/system/Test/Unit/UI/Tk/TestRunner/result_changed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Tk::TestRunner#result_changed
is_singleton: false
name: result_changed
params: (result)
visibility: private
PK}[7�����8ri/1.8/system/Test/Unit/UI/Tk/TestRunner/reset_ui-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Tk::TestRunner#reset_ui
is_singleton: false
name: reset_ui
params: (count)
visibility: private
PK}[��:~��8ri/1.8/system/Test/Unit/UI/Tk/TestRunner/start_ui-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Tk::TestRunner#start_ui
is_singleton: false
name: start_ui
params: ()
visibility: private
PK}[Ȱ#2��>ri/1.8/system/Test/Unit/UI/Tk/TestRunner/setup_mediator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Tk::TestRunner#setup_mediator
is_singleton: false
name: setup_mediator
params: ()
visibility: private
PK }[_
q��+ri/1.8/system/Test/Unit/UI/Tk/cdesc-Tk.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Test::Unit::UI::Tk
includes: []

instance_methods: []

name: Tk
superclass: 
PK }[^�����=ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/green_style-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#green_style
is_singleton: false
name: green_style
params: ()
visibility: private
PK }[Uk����=ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/clear_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#clear_fault
is_singleton: false
name: clear_fault
params: ()
visibility: private
PK }[�p�N��<ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/run_button-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#run_button
is_singleton: false
name: run_button
params: ()
visibility: public
PK }[��~��6ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/stop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#stop
is_singleton: false
name: stop
params: ()
visibility: private
PK }[T�y���>ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/status_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#status_panel
is_singleton: false
name: status_panel
params: ()
visibility: private
PK }[�֑��>ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/test_started-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#test_started
is_singleton: false
name: test_started
params: (test_name)
visibility: private
PK }[�U����Dri/1.8/system/Test/Unit/UI/GTK2/TestRunner/attach_to_mediator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#attach_to_mediator
is_singleton: false
name: attach_to_mediator
params: ()
visibility: private
PK }[�<`���<ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/fault_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#fault_list
is_singleton: false
name: fault_list
params: ()
visibility: private
PK }[p�a��9ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/started-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#started
is_singleton: false
name: started
params: (result)
visibility: private
PK }[�dhP��Ari/1.8/system/Test/Unit/UI/GTK2/TestRunner/lazy_initialize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#lazy_initialize
is_singleton: false
name: lazy_initialize
params: (symbol) {|| ...}
visibility: private
PK }[������<ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/list_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#list_panel
is_singleton: false
name: list_panel
params: ()
visibility: private
PK }[:M�3��@ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/progress_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#progress_panel
is_singleton: false
name: progress_panel
params: ()
visibility: public
PK }[ZO�Z��Dri/1.8/system/Test/Unit/UI/GTK2/TestRunner/fault_detail_label-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#fault_detail_label
is_singleton: false
name: fault_detail_label
params: ()
visibility: private
PK }[s%}���>ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/status_entry-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#status_entry
is_singleton: false
name: status_entry
params: ()
visibility: private
PK }[�Il��<ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/show_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#show_fault
is_singleton: false
name: show_fault
params: (fault)
visibility: private
PK }[x�s��Ari/1.8/system/Test/Unit/UI/GTK2/TestRunner/run_count_label-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#run_count_label
is_singleton: false
name: run_count_label
params: ()
visibility: private
PK }[�*��Fri/1.8/system/Test/Unit/UI/GTK2/TestRunner/list_scrolled_window-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#list_scrolled_window
is_singleton: false
name: list_scrolled_window
params: ()
visibility: private
PK }[������:ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/setup_ui-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#setup_ui
is_singleton: false
name: setup_ui
params: ()
visibility: private
PK }[�6��Eri/1.8/system/Test/Unit/UI/GTK2/TestRunner/failure_count_label-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#failure_count_label
is_singleton: false
name: failure_count_label
params: ()
visibility: private
PK }[��<��Gri/1.8/system/Test/Unit/UI/GTK2/TestRunner/assertion_count_label-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#assertion_count_label
is_singleton: false
name: assertion_count_label
params: ()
visibility: private
PK }[5
[d��5ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner::new
is_singleton: true
name: new
params: (suite, output_level = NORMAL)
visibility: public
PK }[)�*h��Hri/1.8/system/Test/Unit/UI/GTK2/TestRunner/detail_scrolled_window-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#detail_scrolled_window
is_singleton: false
name: detail_scrolled_window
params: ()
visibility: private
PK }[]����7ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#start
is_singleton: false
name: start
params: ()
visibility: public
PK }[_5K6��Cri/1.8/system/Test/Unit/UI/GTK2/TestRunner/test_progress_bar-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#test_progress_bar
is_singleton: false
name: test_progress_bar
params: ()
visibility: private
PK }[�f���;ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/add_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#add_fault
is_singleton: false
name: add_fault
params: (fault)
visibility: private
PK }[X�&���;ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/red_style-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#red_style
is_singleton: false
name: red_style
params: ()
visibility: private
PK }[�,���Cri/1.8/system/Test/Unit/UI/GTK2/TestRunner/error_count_label-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#error_count_label
is_singleton: false
name: error_count_label
params: ()
visibility: private
PK }[غ��?ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/output_status-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#output_status
is_singleton: false
name: output_status
params: (string)
visibility: private
PK }[��^
^
@ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/cdesc-TestRunner.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: Test::Unit::UI::GTK2::TestRunner
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_fault
- !ruby/object:RI::MethodSummary 
  name: assertion_count_label
- !ruby/object:RI::MethodSummary 
  name: attach_to_mediator
- !ruby/object:RI::MethodSummary 
  name: clear_fault
- !ruby/object:RI::MethodSummary 
  name: detail_panel
- !ruby/object:RI::MethodSummary 
  name: detail_scrolled_window
- !ruby/object:RI::MethodSummary 
  name: error_count_label
- !ruby/object:RI::MethodSummary 
  name: failure_count_label
- !ruby/object:RI::MethodSummary 
  name: fault_detail_label
- !ruby/object:RI::MethodSummary 
  name: fault_list
- !ruby/object:RI::MethodSummary 
  name: finished
- !ruby/object:RI::MethodSummary 
  name: green_style
- !ruby/object:RI::MethodSummary 
  name: info_panel
- !ruby/object:RI::MethodSummary 
  name: inner_detail_sub_panel
- !ruby/object:RI::MethodSummary 
  name: lazy_initialize
- !ruby/object:RI::MethodSummary 
  name: list_panel
- !ruby/object:RI::MethodSummary 
  name: list_scrolled_window
- !ruby/object:RI::MethodSummary 
  name: main_panel
- !ruby/object:RI::MethodSummary 
  name: main_window
- !ruby/object:RI::MethodSummary 
  name: outer_detail_sub_panel
- !ruby/object:RI::MethodSummary 
  name: output_status
- !ruby/object:RI::MethodSummary 
  name: progress_panel
- !ruby/object:RI::MethodSummary 
  name: raw_show_fault
- !ruby/object:RI::MethodSummary 
  name: red_style
- !ruby/object:RI::MethodSummary 
  name: reset_ui
- !ruby/object:RI::MethodSummary 
  name: result_changed
- !ruby/object:RI::MethodSummary 
  name: run_button
- !ruby/object:RI::MethodSummary 
  name: run_count_label
- !ruby/object:RI::MethodSummary 
  name: run_test
- !ruby/object:RI::MethodSummary 
  name: setup_mediator
- !ruby/object:RI::MethodSummary 
  name: setup_ui
- !ruby/object:RI::MethodSummary 
  name: show_fault
- !ruby/object:RI::MethodSummary 
  name: start
- !ruby/object:RI::MethodSummary 
  name: start_ui
- !ruby/object:RI::MethodSummary 
  name: started
- !ruby/object:RI::MethodSummary 
  name: status_entry
- !ruby/object:RI::MethodSummary 
  name: status_panel
- !ruby/object:RI::MethodSummary 
  name: stop
- !ruby/object:RI::MethodSummary 
  name: suite_name_entry
- !ruby/object:RI::MethodSummary 
  name: suite_panel
- !ruby/object:RI::MethodSummary 
  name: test_finished
- !ruby/object:RI::MethodSummary 
  name: test_progress_bar
- !ruby/object:RI::MethodSummary 
  name: test_started
name: TestRunner
superclass: Object
PK }[�K�^��?ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/test_finished-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#test_finished
is_singleton: false
name: test_finished
params: (result)
visibility: public
PK }[���z��:ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/finished-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#finished
is_singleton: false
name: finished
params: (elapsed_time)
visibility: private
PK }[#����<ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/main_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#main_panel
is_singleton: false
name: main_panel
params: ()
visibility: private
PK }[�~����:ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/run_test-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#run_test
is_singleton: false
name: run_test
params: ()
visibility: private
PK }[E�G��=ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/main_window-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#main_window
is_singleton: false
name: main_window
params: ()
visibility: private
PK }[;���@ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/raw_show_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#raw_show_fault
is_singleton: false
name: raw_show_fault
params: (string)
visibility: private
PK }[��(���@ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/result_changed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#result_changed
is_singleton: false
name: result_changed
params: (result)
visibility: private
PK }[���y��>ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/detail_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#detail_panel
is_singleton: false
name: detail_panel
params: ()
visibility: private
PK }[�����=ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/suite_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#suite_panel
is_singleton: false
name: suite_panel
params: ()
visibility: private
PK }[)S,��Bri/1.8/system/Test/Unit/UI/GTK2/TestRunner/suite_name_entry-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#suite_name_entry
is_singleton: false
name: suite_name_entry
params: ()
visibility: private
PK }[w|�S��:ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/reset_ui-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#reset_ui
is_singleton: false
name: reset_ui
params: (count)
visibility: private
PK }[?	�w��:ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/start_ui-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#start_ui
is_singleton: false
name: start_ui
params: ()
visibility: private
PK }[����<ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/info_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#info_panel
is_singleton: false
name: info_panel
params: ()
visibility: private
PK }[Ӽg,��Hri/1.8/system/Test/Unit/UI/GTK2/TestRunner/outer_detail_sub_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#outer_detail_sub_panel
is_singleton: false
name: outer_detail_sub_panel
params: ()
visibility: private
PK }[��q��@ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/setup_mediator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#setup_mediator
is_singleton: false
name: setup_mediator
params: ()
visibility: private
PK }[?)���Hri/1.8/system/Test/Unit/UI/GTK2/TestRunner/inner_detail_sub_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::TestRunner#inner_detail_sub_panel
is_singleton: false
name: inner_detail_sub_panel
params: ()
visibility: private
PK }[AR�Fri/1.8/system/Test/Unit/UI/GTK2/EnhancedLabel/cdesc-EnhancedLabel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Test::Unit::UI::GTK2::EnhancedLabel
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: set_text
name: EnhancedLabel
superclass: Gtk::Label
PK }[�w����=ri/1.8/system/Test/Unit/UI/GTK2/EnhancedLabel/set_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::EnhancedLabel#set_text
is_singleton: false
name: set_text
params: (text)
visibility: public
PK }[�	���:ri/1.8/system/Test/Unit/UI/GTK2/FaultList/get_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::FaultList#get_fault
is_singleton: false
name: get_fault
params: (iter)
visibility: public
PK }[�`���4ri/1.8/system/Test/Unit/UI/GTK2/FaultList/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::FaultList::new
is_singleton: true
name: new
params: ()
visibility: public
PK }[������>ri/1.8/system/Test/Unit/UI/GTK2/FaultList/cdesc-FaultList.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: Test::Unit::UI::GTK2::FaultList
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_fault
- !ruby/object:RI::MethodSummary 
  name: clear
- !ruby/object:RI::MethodSummary 
  name: get_fault
name: FaultList
superclass: Gtk::TreeView
PK }[7B�a��:ri/1.8/system/Test/Unit/UI/GTK2/FaultList/add_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::FaultList#add_fault
is_singleton: false
name: add_fault
params: (fault)
visibility: public
PK }[�/y���6ri/1.8/system/Test/Unit/UI/GTK2/FaultList/clear-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK2::FaultList#clear
is_singleton: false
name: clear
params: ()
visibility: public
PK }[�|X���/ri/1.8/system/Test/Unit/UI/GTK2/cdesc-GTK2.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Test::Unit::UI::GTK2
includes: []

instance_methods: []

name: GTK2
superclass: 
PK }[Q�v���(ri/1.8/system/Test/Unit/UI/cdesc-UI.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: SILENT
  value: "0"
- !ruby/object:RI::Constant 
  comment: 
  name: PROGRESS_ONLY
  value: "1"
- !ruby/object:RI::Constant 
  comment: 
  name: NORMAL
  value: "2"
- !ruby/object:RI::Constant 
  comment: 
  name: VERBOSE
  value: "3"
full_name: Test::Unit::UI
includes: []

instance_methods: []

name: UI
superclass: 
PK!}[֪��KKEri/1.8/system/Test/Unit/UI/GTK/FaultListItem/cdesc-FaultListItem.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: fault
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: Test::Unit::UI::GTK::FaultListItem
includes: []

instance_methods: []

name: FaultListItem
superclass: Gtk::ListItem
PK!}[�-���7ri/1.8/system/Test/Unit/UI/GTK/FaultListItem/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::FaultListItem::new
is_singleton: true
name: new
params: (fault)
visibility: public
PK!}[�N�L��-ri/1.8/system/Test/Unit/UI/GTK/cdesc-GTK.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Test::Unit::UI::GTK
includes: []

instance_methods: []

name: GTK
superclass: 
PK!}[G�����<ri/1.8/system/Test/Unit/UI/GTK/TestRunner/green_style-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#green_style
is_singleton: false
name: green_style
params: ()
visibility: private
PK!}[L����<ri/1.8/system/Test/Unit/UI/GTK/TestRunner/clear_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#clear_fault
is_singleton: false
name: clear_fault
params: ()
visibility: private
PK!}[Z�%K��;ri/1.8/system/Test/Unit/UI/GTK/TestRunner/run_button-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#run_button
is_singleton: false
name: run_button
params: ()
visibility: private
PK!}[R�'���5ri/1.8/system/Test/Unit/UI/GTK/TestRunner/stop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#stop
is_singleton: false
name: stop
params: (*)
visibility: private
PK!}[�|t���=ri/1.8/system/Test/Unit/UI/GTK/TestRunner/status_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#status_panel
is_singleton: false
name: status_panel
params: ()
visibility: private
PK!}['�w���=ri/1.8/system/Test/Unit/UI/GTK/TestRunner/test_started-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#test_started
is_singleton: false
name: test_started
params: (test_name)
visibility: private
PK!}[�,��Cri/1.8/system/Test/Unit/UI/GTK/TestRunner/attach_to_mediator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#attach_to_mediator
is_singleton: false
name: attach_to_mediator
params: ()
visibility: private
PK!}[B�^���;ri/1.8/system/Test/Unit/UI/GTK/TestRunner/fault_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#fault_list
is_singleton: false
name: fault_list
params: ()
visibility: private
PK"}[�����8ri/1.8/system/Test/Unit/UI/GTK/TestRunner/started-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#started
is_singleton: false
name: started
params: (result)
visibility: private
PK"}[�+R��@ri/1.8/system/Test/Unit/UI/GTK/TestRunner/lazy_initialize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#lazy_initialize
is_singleton: false
name: lazy_initialize
params: (symbol) {|| ...}
visibility: private
PK"}[3����;ri/1.8/system/Test/Unit/UI/GTK/TestRunner/list_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#list_panel
is_singleton: false
name: list_panel
params: ()
visibility: private
PK"}[���s��?ri/1.8/system/Test/Unit/UI/GTK/TestRunner/progress_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#progress_panel
is_singleton: false
name: progress_panel
params: ()
visibility: private
PK"}[��	���Cri/1.8/system/Test/Unit/UI/GTK/TestRunner/fault_detail_label-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#fault_detail_label
is_singleton: false
name: fault_detail_label
params: ()
visibility: private
PK"}[��p���=ri/1.8/system/Test/Unit/UI/GTK/TestRunner/status_entry-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#status_entry
is_singleton: false
name: status_entry
params: ()
visibility: private
PK"}[!d���;ri/1.8/system/Test/Unit/UI/GTK/TestRunner/show_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#show_fault
is_singleton: false
name: show_fault
params: (fault)
visibility: private
PK"}[��!���@ri/1.8/system/Test/Unit/UI/GTK/TestRunner/run_count_label-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#run_count_label
is_singleton: false
name: run_count_label
params: ()
visibility: private
PK"}[#uvC��Eri/1.8/system/Test/Unit/UI/GTK/TestRunner/list_scrolled_window-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#list_scrolled_window
is_singleton: false
name: list_scrolled_window
params: ()
visibility: private
PK"}[�����9ri/1.8/system/Test/Unit/UI/GTK/TestRunner/setup_ui-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#setup_ui
is_singleton: false
name: setup_ui
params: ()
visibility: private
PK"}[��%���Dri/1.8/system/Test/Unit/UI/GTK/TestRunner/failure_count_label-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#failure_count_label
is_singleton: false
name: failure_count_label
params: ()
visibility: private
PK"}[�����Fri/1.8/system/Test/Unit/UI/GTK/TestRunner/assertion_count_label-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#assertion_count_label
is_singleton: false
name: assertion_count_label
params: ()
visibility: private
PK"}[��K004ri/1.8/system/Test/Unit/UI/GTK/TestRunner/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new TestRunner for running the passed suite.
full_name: Test::Unit::UI::GTK::TestRunner::new
is_singleton: true
name: new
params: (suite, output_level = NORMAL)
visibility: public
PK"}[yt���Gri/1.8/system/Test/Unit/UI/GTK/TestRunner/detail_scrolled_window-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#detail_scrolled_window
is_singleton: false
name: detail_scrolled_window
params: ()
visibility: private
PK"}[��$��6ri/1.8/system/Test/Unit/UI/GTK/TestRunner/start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Begins the test run.
full_name: Test::Unit::UI::GTK::TestRunner#start
is_singleton: false
name: start
params: ()
visibility: public
PK"}[ ����Bri/1.8/system/Test/Unit/UI/GTK/TestRunner/test_progress_bar-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#test_progress_bar
is_singleton: false
name: test_progress_bar
params: ()
visibility: private
PK#}[�~���:ri/1.8/system/Test/Unit/UI/GTK/TestRunner/add_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#add_fault
is_singleton: false
name: add_fault
params: (fault)
visibility: private
PK#}[Ј/���:ri/1.8/system/Test/Unit/UI/GTK/TestRunner/red_style-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#red_style
is_singleton: false
name: red_style
params: ()
visibility: private
PK#}[kh��Bri/1.8/system/Test/Unit/UI/GTK/TestRunner/error_count_label-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#error_count_label
is_singleton: false
name: error_count_label
params: ()
visibility: private
PK#}[:����>ri/1.8/system/Test/Unit/UI/GTK/TestRunner/output_status-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#output_status
is_singleton: false
name: output_status
params: (string)
visibility: private
PK#}[��1�99?ri/1.8/system/Test/Unit/UI/GTK/TestRunner/cdesc-TestRunner.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Runs a Test::Unit::TestSuite in a Gtk UI. Obviously, this one requires you to have Gtk (http://www.gtk.org/) and the Ruby Gtk extension (http://ruby-gnome.sourceforge.net/) installed.
constants: []

full_name: Test::Unit::UI::GTK::TestRunner
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_fault
- !ruby/object:RI::MethodSummary 
  name: assertion_count_label
- !ruby/object:RI::MethodSummary 
  name: attach_to_mediator
- !ruby/object:RI::MethodSummary 
  name: clear_fault
- !ruby/object:RI::MethodSummary 
  name: detail_panel
- !ruby/object:RI::MethodSummary 
  name: detail_scrolled_window
- !ruby/object:RI::MethodSummary 
  name: error_count_label
- !ruby/object:RI::MethodSummary 
  name: failure_count_label
- !ruby/object:RI::MethodSummary 
  name: fault_detail_label
- !ruby/object:RI::MethodSummary 
  name: fault_list
- !ruby/object:RI::MethodSummary 
  name: finished
- !ruby/object:RI::MethodSummary 
  name: green_style
- !ruby/object:RI::MethodSummary 
  name: info_panel
- !ruby/object:RI::MethodSummary 
  name: inner_detail_sub_panel
- !ruby/object:RI::MethodSummary 
  name: lazy_initialize
- !ruby/object:RI::MethodSummary 
  name: list_panel
- !ruby/object:RI::MethodSummary 
  name: list_scrolled_window
- !ruby/object:RI::MethodSummary 
  name: main_panel
- !ruby/object:RI::MethodSummary 
  name: main_window
- !ruby/object:RI::MethodSummary 
  name: outer_detail_sub_panel
- !ruby/object:RI::MethodSummary 
  name: output_status
- !ruby/object:RI::MethodSummary 
  name: progress_panel
- !ruby/object:RI::MethodSummary 
  name: raw_show_fault
- !ruby/object:RI::MethodSummary 
  name: red_style
- !ruby/object:RI::MethodSummary 
  name: reset_ui
- !ruby/object:RI::MethodSummary 
  name: result_changed
- !ruby/object:RI::MethodSummary 
  name: run_button
- !ruby/object:RI::MethodSummary 
  name: run_count_label
- !ruby/object:RI::MethodSummary 
  name: run_test
- !ruby/object:RI::MethodSummary 
  name: setup_mediator
- !ruby/object:RI::MethodSummary 
  name: setup_ui
- !ruby/object:RI::MethodSummary 
  name: show_fault
- !ruby/object:RI::MethodSummary 
  name: start
- !ruby/object:RI::MethodSummary 
  name: start_ui
- !ruby/object:RI::MethodSummary 
  name: started
- !ruby/object:RI::MethodSummary 
  name: status_entry
- !ruby/object:RI::MethodSummary 
  name: status_panel
- !ruby/object:RI::MethodSummary 
  name: stop
- !ruby/object:RI::MethodSummary 
  name: suite_name_entry
- !ruby/object:RI::MethodSummary 
  name: suite_panel
- !ruby/object:RI::MethodSummary 
  name: test_finished
- !ruby/object:RI::MethodSummary 
  name: test_progress_bar
- !ruby/object:RI::MethodSummary 
  name: test_started
name: TestRunner
superclass: Object
PK#}[��F���>ri/1.8/system/Test/Unit/UI/GTK/TestRunner/test_finished-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#test_finished
is_singleton: false
name: test_finished
params: (test_name)
visibility: private
PK#}[F�wF��9ri/1.8/system/Test/Unit/UI/GTK/TestRunner/finished-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#finished
is_singleton: false
name: finished
params: (elapsed_time)
visibility: private
PK#}[�����;ri/1.8/system/Test/Unit/UI/GTK/TestRunner/main_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#main_panel
is_singleton: false
name: main_panel
params: ()
visibility: private
PK#}[���V��9ri/1.8/system/Test/Unit/UI/GTK/TestRunner/run_test-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#run_test
is_singleton: false
name: run_test
params: (*)
visibility: private
PK#}[\�]��<ri/1.8/system/Test/Unit/UI/GTK/TestRunner/main_window-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#main_window
is_singleton: false
name: main_window
params: ()
visibility: private
PK#}[�x�:��?ri/1.8/system/Test/Unit/UI/GTK/TestRunner/raw_show_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#raw_show_fault
is_singleton: false
name: raw_show_fault
params: (string)
visibility: private
PK#}[�lb��?ri/1.8/system/Test/Unit/UI/GTK/TestRunner/result_changed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#result_changed
is_singleton: false
name: result_changed
params: (result)
visibility: private
PK#}[Ud�?��=ri/1.8/system/Test/Unit/UI/GTK/TestRunner/detail_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#detail_panel
is_singleton: false
name: detail_panel
params: ()
visibility: private
PK#}[�����<ri/1.8/system/Test/Unit/UI/GTK/TestRunner/suite_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#suite_panel
is_singleton: false
name: suite_panel
params: ()
visibility: private
PK#}[<9��Ari/1.8/system/Test/Unit/UI/GTK/TestRunner/suite_name_entry-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#suite_name_entry
is_singleton: false
name: suite_name_entry
params: ()
visibility: private
PK#}[c���9ri/1.8/system/Test/Unit/UI/GTK/TestRunner/reset_ui-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#reset_ui
is_singleton: false
name: reset_ui
params: (count)
visibility: private
PK#}[�B�T��9ri/1.8/system/Test/Unit/UI/GTK/TestRunner/start_ui-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#start_ui
is_singleton: false
name: start_ui
params: ()
visibility: private
PK#}[4����;ri/1.8/system/Test/Unit/UI/GTK/TestRunner/info_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#info_panel
is_singleton: false
name: info_panel
params: ()
visibility: private
PK#}[�>9���Gri/1.8/system/Test/Unit/UI/GTK/TestRunner/outer_detail_sub_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#outer_detail_sub_panel
is_singleton: false
name: outer_detail_sub_panel
params: ()
visibility: private
PK#}[y��2��?ri/1.8/system/Test/Unit/UI/GTK/TestRunner/setup_mediator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#setup_mediator
is_singleton: false
name: setup_mediator
params: ()
visibility: private
PK#}[
�BX��Gri/1.8/system/Test/Unit/UI/GTK/TestRunner/inner_detail_sub_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::TestRunner#inner_detail_sub_panel
is_singleton: false
name: inner_detail_sub_panel
params: ()
visibility: private
PK#}[!��Eri/1.8/system/Test/Unit/UI/GTK/EnhancedLabel/cdesc-EnhancedLabel.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Test::Unit::UI::GTK::EnhancedLabel
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: set_text
name: EnhancedLabel
superclass: Gtk::Label
PK$}[�����<ri/1.8/system/Test/Unit/UI/GTK/EnhancedLabel/set_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::EnhancedLabel#set_text
is_singleton: false
name: set_text
params: (text)
visibility: public
PK$}[7(���Cri/1.8/system/Test/Unit/UI/GTK/EnhancedProgressBar/set_style-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::GTK::EnhancedProgressBar#set_style
is_singleton: false
name: set_style
params: (style)
visibility: public
PK$}[C��##Qri/1.8/system/Test/Unit/UI/GTK/EnhancedProgressBar/cdesc-EnhancedProgressBar.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Test::Unit::UI::GTK::EnhancedProgressBar
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: set_style
name: EnhancedProgressBar
superclass: Gtk::ProgressBar
PK$}[�AbHHEri/1.8/system/Test/Unit/UI/Fox/FaultListItem/cdesc-FaultListItem.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: fault
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: Test::Unit::UI::Fox::FaultListItem
includes: []

instance_methods: []

name: FaultListItem
superclass: FXListItem
PK$}[|����7ri/1.8/system/Test/Unit/UI/Fox/FaultListItem/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::FaultListItem::new
is_singleton: true
name: new
params: (fault)
visibility: public
PK$}[�����Bri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_info_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#create_info_panel
is_singleton: false
name: create_info_panel
params: (parent)
visibility: public
PK$}[�u����<ri/1.8/system/Test/Unit/UI/Fox/TestRunner/clear_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#clear_fault
is_singleton: false
name: clear_fault
params: ()
visibility: public
PK$}[���=ri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_label-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#create_label
is_singleton: false
name: create_label
params: (parent, text)
visibility: public
PK$}[�vu���Dri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_detail_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#create_detail_panel
is_singleton: false
name: create_detail_panel
params: (parent)
visibility: public
PK$}[4>A_��5ri/1.8/system/Test/Unit/UI/Fox/TestRunner/stop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#stop
is_singleton: false
name: stop
params: ()
visibility: public
PK$}[��M���=ri/1.8/system/Test/Unit/UI/Fox/TestRunner/test_started-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#test_started
is_singleton: false
name: test_started
params: (test_name)
visibility: public
PK$}[�I�m��Cri/1.8/system/Test/Unit/UI/Fox/TestRunner/attach_to_mediator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#attach_to_mediator
is_singleton: false
name: attach_to_mediator
params: ()
visibility: public
PK$}[��/;��8ri/1.8/system/Test/Unit/UI/Fox/TestRunner/started-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#started
is_singleton: false
name: started
params: (result)
visibility: public
PK$}[ae���Cri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_application-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#create_application
is_singleton: false
name: create_application
params: ()
visibility: public
PK$}[N�i���;ri/1.8/system/Test/Unit/UI/Fox/TestRunner/show_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#show_fault
is_singleton: false
name: show_fault
params: (fault)
visibility: public
PK$}[������Dri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_progress_bar-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#create_progress_bar
is_singleton: false
name: create_progress_bar
params: (parent)
visibility: public
PK$}[/y%��9ri/1.8/system/Test/Unit/UI/Fox/TestRunner/setup_ui-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#setup_ui
is_singleton: false
name: setup_ui
params: ()
visibility: public
PK$}[�4�w004ri/1.8/system/Test/Unit/UI/Fox/TestRunner/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new TestRunner for running the passed suite.
full_name: Test::Unit::UI::Fox::TestRunner::new
is_singleton: true
name: new
params: (suite, output_level = NORMAL)
visibility: public
PK$}[���v��Bri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_list_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#create_list_panel
is_singleton: false
name: create_list_panel
params: (parent)
visibility: public
PK$}[��X��6ri/1.8/system/Test/Unit/UI/Fox/TestRunner/start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Begins the test run.
full_name: Test::Unit::UI::Fox::TestRunner#start
is_singleton: false
name: start
params: ()
visibility: public
PK$}[�0h��:ri/1.8/system/Test/Unit/UI/Fox/TestRunner/add_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#add_fault
is_singleton: false
name: add_fault
params: (fault)
visibility: public
PK$}[4L9���>ri/1.8/system/Test/Unit/UI/Fox/TestRunner/output_status-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#output_status
is_singleton: false
name: output_status
params: (string)
visibility: public
PK$}[f@��Cri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_suite_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#create_suite_panel
is_singleton: false
name: create_suite_panel
params: (parent)
visibility: public
PK$}[� 7���?ri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_tooltip-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#create_tooltip
is_singleton: false
name: create_tooltip
params: (app)
visibility: public
PK$}[��>ri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_window-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#create_window
is_singleton: false
name: create_window
params: (app)
visibility: public
PK$}[�i�		?ri/1.8/system/Test/Unit/UI/Fox/TestRunner/cdesc-TestRunner.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Runs a Test::Unit::TestSuite in a Fox UI. Obviously, this one requires you to have Fox (http://www.fox-toolkit.org/fox.html) and the Ruby Fox extension (http://fxruby.sourceforge.net/) installed.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: RED_STYLE
  value: FXRGBA(0xFF,0,0,0xFF)
- !ruby/object:RI::Constant 
  comment: 
  name: GREEN_STYLE
  value: FXRGBA(0,0xFF,0,0xFF)
full_name: Test::Unit::UI::Fox::TestRunner
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_fault
- !ruby/object:RI::MethodSummary 
  name: attach_to_mediator
- !ruby/object:RI::MethodSummary 
  name: clear_fault
- !ruby/object:RI::MethodSummary 
  name: create_application
- !ruby/object:RI::MethodSummary 
  name: create_button
- !ruby/object:RI::MethodSummary 
  name: create_detail_panel
- !ruby/object:RI::MethodSummary 
  name: create_entry
- !ruby/object:RI::MethodSummary 
  name: create_fault_list
- !ruby/object:RI::MethodSummary 
  name: create_info_panel
- !ruby/object:RI::MethodSummary 
  name: create_label
- !ruby/object:RI::MethodSummary 
  name: create_list_panel
- !ruby/object:RI::MethodSummary 
  name: create_main_panel
- !ruby/object:RI::MethodSummary 
  name: create_progress_bar
- !ruby/object:RI::MethodSummary 
  name: create_suite_panel
- !ruby/object:RI::MethodSummary 
  name: create_text
- !ruby/object:RI::MethodSummary 
  name: create_tooltip
- !ruby/object:RI::MethodSummary 
  name: create_window
- !ruby/object:RI::MethodSummary 
  name: finished
- !ruby/object:RI::MethodSummary 
  name: output_status
- !ruby/object:RI::MethodSummary 
  name: raw_show_fault
- !ruby/object:RI::MethodSummary 
  name: reset_ui
- !ruby/object:RI::MethodSummary 
  name: result_changed
- !ruby/object:RI::MethodSummary 
  name: setup_mediator
- !ruby/object:RI::MethodSummary 
  name: setup_ui
- !ruby/object:RI::MethodSummary 
  name: show_fault
- !ruby/object:RI::MethodSummary 
  name: start
- !ruby/object:RI::MethodSummary 
  name: start_ui
- !ruby/object:RI::MethodSummary 
  name: started
- !ruby/object:RI::MethodSummary 
  name: stop
- !ruby/object:RI::MethodSummary 
  name: test_started
name: TestRunner
superclass: Object
PK$}[�Y@��<ri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#create_text
is_singleton: false
name: create_text
params: (parent)
visibility: public
PK$}[XZ��9ri/1.8/system/Test/Unit/UI/Fox/TestRunner/finished-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#finished
is_singleton: false
name: finished
params: (elapsed_time)
visibility: public
PK$}[)A�]��>ri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_button-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#create_button
is_singleton: false
name: create_button
params: (parent, text, action)
visibility: public
PK$}[�,	��=ri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_entry-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#create_entry
is_singleton: false
name: create_entry
params: (parent)
visibility: public
PK$}[w�����Bri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_fault_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#create_fault_list
is_singleton: false
name: create_fault_list
params: (parent)
visibility: public
PK$}[�1����Bri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_main_panel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#create_main_panel
is_singleton: false
name: create_main_panel
params: (parent)
visibility: public
PK$}[��c���?ri/1.8/system/Test/Unit/UI/Fox/TestRunner/raw_show_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#raw_show_fault
is_singleton: false
name: raw_show_fault
params: (string)
visibility: public
PK$}[�HB��?ri/1.8/system/Test/Unit/UI/Fox/TestRunner/result_changed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#result_changed
is_singleton: false
name: result_changed
params: (result)
visibility: public
PK$}[�����9ri/1.8/system/Test/Unit/UI/Fox/TestRunner/reset_ui-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#reset_ui
is_singleton: false
name: reset_ui
params: (count)
visibility: public
PK$}[����9ri/1.8/system/Test/Unit/UI/Fox/TestRunner/start_ui-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#start_ui
is_singleton: false
name: start_ui
params: ()
visibility: public
PK$}[۾�R��?ri/1.8/system/Test/Unit/UI/Fox/TestRunner/setup_mediator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Fox::TestRunner#setup_mediator
is_singleton: false
name: setup_mediator
params: ()
visibility: public
PK$}[i��ǽ�-ri/1.8/system/Test/Unit/UI/Fox/cdesc-Fox.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Test::Unit::UI::Fox
includes: []

instance_methods: []

name: Fox
superclass: 
PK$}[��X���Dri/1.8/system/Test/Unit/UI/Console/TestRunner/create_mediator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Console::TestRunner#create_mediator
is_singleton: false
name: create_mediator
params: (suite)
visibility: private
PK$}[�V���;ri/1.8/system/Test/Unit/UI/Console/TestRunner/output-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Console::TestRunner#output
is_singleton: false
name: output
params: (something, level=NORMAL)
visibility: private
PK$}[�MQ��Ari/1.8/system/Test/Unit/UI/Console/TestRunner/test_started-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Console::TestRunner#test_started
is_singleton: false
name: test_started
params: (name)
visibility: private
PK$}[e��7��Gri/1.8/system/Test/Unit/UI/Console/TestRunner/attach_to_mediator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Console::TestRunner#attach_to_mediator
is_singleton: false
name: attach_to_mediator
params: ()
visibility: private
PK$}[��b��Bri/1.8/system/Test/Unit/UI/Console/TestRunner/output_single-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Console::TestRunner#output_single
is_singleton: false
name: output_single
params: (something, level=NORMAL)
visibility: private
PK$}[�=��<ri/1.8/system/Test/Unit/UI/Console/TestRunner/started-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Console::TestRunner#started
is_singleton: false
name: started
params: (result)
visibility: private
PK$}[rܜ��8ri/1.8/system/Test/Unit/UI/Console/TestRunner/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new TestRunner for running the passed suite. If quiet_mode is true, the output while running is limited to progress dots, errors and failures, and the final result. io specifies where runner output should go to; defaults to STDOUT.
full_name: Test::Unit::UI::Console::TestRunner::new
is_singleton: true
name: new
params: (suite, output_level=NORMAL, io=STDOUT)
visibility: public
PK$}[����>ri/1.8/system/Test/Unit/UI/Console/TestRunner/output%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Console::TestRunner#output?
is_singleton: false
name: output?
params: (level)
visibility: private
PK$}[�=����:ri/1.8/system/Test/Unit/UI/Console/TestRunner/start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Begins the test run.
full_name: Test::Unit::UI::Console::TestRunner#start
is_singleton: false
name: start
params: ()
visibility: public
PK$}[ɼ���>ri/1.8/system/Test/Unit/UI/Console/TestRunner/add_fault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Console::TestRunner#add_fault
is_singleton: false
name: add_fault
params: (fault)
visibility: private
PK$}[D�'<<Cri/1.8/system/Test/Unit/UI/Console/TestRunner/cdesc-TestRunner.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Runs a Test::Unit::TestSuite on the console.
constants: []

full_name: Test::Unit::UI::Console::TestRunner
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_fault
- !ruby/object:RI::MethodSummary 
  name: attach_to_mediator
- !ruby/object:RI::MethodSummary 
  name: create_mediator
- !ruby/object:RI::MethodSummary 
  name: finished
- !ruby/object:RI::MethodSummary 
  name: nl
- !ruby/object:RI::MethodSummary 
  name: output
- !ruby/object:RI::MethodSummary 
  name: output?
- !ruby/object:RI::MethodSummary 
  name: output_single
- !ruby/object:RI::MethodSummary 
  name: setup_mediator
- !ruby/object:RI::MethodSummary 
  name: start
- !ruby/object:RI::MethodSummary 
  name: start_mediator
- !ruby/object:RI::MethodSummary 
  name: started
- !ruby/object:RI::MethodSummary 
  name: test_finished
- !ruby/object:RI::MethodSummary 
  name: test_started
name: TestRunner
superclass: Object
PK$}[A�ш��Bri/1.8/system/Test/Unit/UI/Console/TestRunner/test_finished-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Console::TestRunner#test_finished
is_singleton: false
name: test_finished
params: (name)
visibility: private
PK$}[���N��=ri/1.8/system/Test/Unit/UI/Console/TestRunner/finished-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Console::TestRunner#finished
is_singleton: false
name: finished
params: (elapsed_time)
visibility: private
PK$}[�B����7ri/1.8/system/Test/Unit/UI/Console/TestRunner/nl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Console::TestRunner#nl
is_singleton: false
name: nl
params: (level=NORMAL)
visibility: private
PK$}[��sT��Cri/1.8/system/Test/Unit/UI/Console/TestRunner/start_mediator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Console::TestRunner#start_mediator
is_singleton: false
name: start_mediator
params: ()
visibility: private
PK$}[��j:��Cri/1.8/system/Test/Unit/UI/Console/TestRunner/setup_mediator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Test::Unit::UI::Console::TestRunner#setup_mediator
is_singleton: false
name: setup_mediator
params: ()
visibility: private
PK$}[�n���5ri/1.8/system/Test/Unit/UI/Console/cdesc-Console.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Test::Unit::UI::Console
includes: []

instance_methods: []

name: Console
superclass: 
PK$}[�w],,Kri/1.8/system/Test/Unit/UI/TestRunnerMediator/cdesc-TestRunnerMediator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Provides an interface to write any given UI against, hopefully making it easy to write new UIs.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: RESET
  value: name + "::RESET"
- !ruby/object:RI::Constant 
  comment: 
  name: STARTED
  value: name + "::STARTED"
- !ruby/object:RI::Constant 
  comment: 
  name: FINISHED
  value: name + "::FINISHED"
full_name: Test::Unit::UI::TestRunnerMediator
includes: 
- !ruby/object:RI::IncludedModule 
  name: Util::Observable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: create_result
- !ruby/object:RI::MethodSummary 
  name: run_suite
name: TestRunnerMediator
superclass: Object
PK$}[\
K5$$>ri/1.8/system/Test/Unit/UI/TestRunnerMediator/run_suite-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Runs the suite the TestRunnerMediator was created with.
full_name: Test::Unit::UI::TestRunnerMediator#run_suite
is_singleton: false
name: run_suite
params: ()
visibility: public
PK$}[�&�++8ri/1.8/system/Test/Unit/UI/TestRunnerMediator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new TestRunnerMediator initialized to run the passed suite.
full_name: Test::Unit::UI::TestRunnerMediator::new
is_singleton: true
name: new
params: (suite)
visibility: public
PK$}[
Am���Bri/1.8/system/Test/Unit/UI/TestRunnerMediator/create_result-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: A factory method to create the result the mediator should run with. Can be overridden by subclasses if one wants to use a different result.
full_name: Test::Unit::UI::TestRunnerMediator#create_result
is_singleton: false
name: create_result
params: ()
visibility: private
PK$}[^V����Mri/1.8/system/Test/Unit/UI/TestRunnerUtilities/start_command_line_test-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Takes care of the ARGV parsing and suite determination necessary for running one of the TestRunners from the command line.
full_name: Test::Unit::UI::TestRunnerUtilities#start_command_line_test
is_singleton: false
name: start_command_line_test
params: ()
visibility: public
PK$}[nɐ��Mri/1.8/system/Test/Unit/UI/TestRunnerUtilities/cdesc-TestRunnerUtilities.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Provides some utilities common to most, if not all, TestRunners.
constants: []

full_name: Test::Unit::UI::TestRunnerUtilities
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: run
- !ruby/object:RI::MethodSummary 
  name: start_command_line_test
name: TestRunnerUtilities
superclass: 
PK$}[KY ((9ri/1.8/system/Test/Unit/UI/TestRunnerUtilities/run-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new TestRunner and runs the suite.
full_name: Test::Unit::UI::TestRunnerUtilities#run
is_singleton: false
name: run
params: (suite, output_level=NORMAL)
visibility: public
PK$}[��P{{6ri/1.8/system/Test/Unit/Assertions/assert_equal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes if <tt>expected</tt> == +actual.
- !ruby/struct:SM::Flow::P 
  body: Note that the ordering of arguments is important, since a helpful error message is generated when this one fails that tells you the values of expected and actual.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  assert_equal 'MY STRING', 'my string'.upcase\n"
full_name: Test::Unit::Assertions#assert_equal
is_singleton: false
name: assert_equal
params: (expected, actual, message=nil)
visibility: public
PK$}[�?I_��8ri/1.8/system/Test/Unit/Assertions/assert_not_nil-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes if ! <tt>object</tt> .nil?
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  assert_not_nil '1 two 3'.sub!(/two/, '2')\n"
full_name: Test::Unit::Assertions#assert_not_nil
is_singleton: false
name: assert_not_nil
params: (object, message="")
visibility: public
PK$}[�S��9ri/1.8/system/Test/Unit/Assertions/assert_not_same-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes if ! <tt>actual</tt> .equal? <tt>expected</tt>
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  assert_not_same Object.new, Object.new\n"
full_name: Test::Unit::Assertions#assert_not_same
is_singleton: false
name: assert_not_same
params: (expected, actual, message="")
visibility: public
PK$}[G�a���7ri/1.8/system/Test/Unit/Assertions/assert_throws-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes if the block throws <tt>expected_symbol</tt>
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  assert_throws :done do\n    throw :done\n  end\n"
full_name: Test::Unit::Assertions#assert_throws
is_singleton: false
name: assert_throws
params: (expected_symbol, message="", &proc)
visibility: public
PK$}[��g�ww/ri/1.8/system/Test/Unit/Assertions/flunk-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Flunk always fails.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  flunk 'Not done testing yet.'\n"
full_name: Test::Unit::Assertions#flunk
is_singleton: false
name: flunk
params: (message="Flunked")
visibility: public
PK$}[�i�ݼ�?ri/1.8/system/Test/Unit/Assertions/assert_nothing_thrown-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes if block does not throw anything.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: " assert_nothing_thrown do\n   [1, 2].uniq\n end\n"
full_name: Test::Unit::Assertions#assert_nothing_thrown
is_singleton: false
name: assert_nothing_thrown
params: (message="", &proc)
visibility: public
PK$}[�rź6ri/1.8/system/Test/Unit/Assertions/assert_block-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: The assertion upon which all other assertions are based. Passes if the block yields true.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  assert_block &quot;Couldn't do the thing&quot; do\n    do_the_thing\n  end\n"
full_name: Test::Unit::Assertions#assert_block
is_singleton: false
name: assert_block
params: (message="assert_block failed.") {|| ...}
visibility: public
PK$}[:JRL��7ri/1.8/system/Test/Unit/Assertions/build_message-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Builds a failure message. <tt>head</tt> is added before the <tt>template</tt> and <tt>arguments</tt> replaces the '?'s positionally in the template.
full_name: Test::Unit::Assertions#build_message
is_singleton: false
name: build_message
params: (head, template=nil, *arguments)
visibility: public
PK$}[y�,85ri/1.8/system/Test/Unit/Assertions/assert_send-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes if the method send returns a true value.
- !ruby/struct:SM::Flow::P 
  body: "<tt>send_array</tt> is composed of:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: A receiver
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: A method
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Arguments to the method
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  assert_send [[1, 2], :include?, 4]\n"
full_name: Test::Unit::Assertions#assert_send
is_singleton: false
name: assert_send
params: (send_array, message="")
visibility: public
PK$}[LW**9ri/1.8/system/Test/Unit/Assertions/assert_operator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compares the +object1+ with +object2+ using <tt>operator</tt>.
- !ruby/struct:SM::Flow::P 
  body: Passes if object1.<em>send</em>(operator, object2) is true.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  assert_operator 5, :&gt;=, 4\n"
full_name: Test::Unit::Assertions#assert_operator
is_singleton: false
name: assert_operator
params: (object1, operator, object2, message="")
visibility: public
PK$}[✟�mm3ri/1.8/system/Test/Unit/Assertions/use_pp%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Select whether or not to use the pretty-printer. If this option is set to false before any assertions are made, pp.rb will not be required.
full_name: Test::Unit::Assertions::use_pp=
is_singleton: true
name: use_pp=
params: (value)
visibility: public
PK$}[GgM��?ri/1.8/system/Test/Unit/Assertions/assert_nothing_raised-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes if block does not raise an exception.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  assert_nothing_raised do\n    [1, 2].uniq\n  end\n"
full_name: Test::Unit::Assertions#assert_nothing_raised
is_singleton: false
name: assert_nothing_raised
params: (*args) {|| ...}
visibility: public
PK$}[Ic���:ri/1.8/system/Test/Unit/Assertions/assert_not_equal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes if <tt>expected</tt> != <tt>actual</tt>
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  assert_not_equal 'some string', 5\n"
full_name: Test::Unit::Assertions#assert_not_equal
is_singleton: false
name: assert_not_equal
params: (expected, actual, message="")
visibility: public
PK%}[p
P��4ri/1.8/system/Test/Unit/Assertions/assert_nil-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes if <tt>object</tt> is nil.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  assert_nil [1, 2].uniq!\n"
full_name: Test::Unit::Assertions#assert_nil
is_singleton: false
name: assert_nil
params: (object, message="")
visibility: public
PK%}[�E��6ri/1.8/system/Test/Unit/Assertions/assert_match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes if <tt>string</tt> =~ <tt>pattern</tt>.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  assert_match(/\\d+/, 'five, 6, seven')\n"
full_name: Test::Unit::Assertions#assert_match
is_singleton: false
name: assert_match
params: (pattern, string, message="")
visibility: public
PK%}[��{�ff7ri/1.8/system/Test/Unit/Assertions/add_assertion-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Called whenever an assertion is made. Define this in classes that include Test::Unit::Assertions to record assertion counts.
full_name: Test::Unit::Assertions#add_assertion
is_singleton: false
name: add_assertion
params: ()
visibility: private
PK%}[dL__7ri/1.8/system/Test/Unit/Assertions/assert_raises-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Alias of assert_raise.
- !ruby/struct:SM::Flow::P 
  body: Will be deprecated in 1.9, and removed in 2.0.
full_name: Test::Unit::Assertions#assert_raises
is_singleton: false
name: assert_raises
params: (*args, &block)
visibility: public
PK%}[��u���;ri/1.8/system/Test/Unit/Assertions/assert_respond_to-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes if <tt>object</tt> .respond_to? <tt>method</tt>
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  assert_respond_to 'bugbear', :slice\n"
full_name: Test::Unit::Assertions#assert_respond_to
is_singleton: false
name: assert_respond_to
params: (object, method, message="")
visibility: public
PK%}[Vϔ��0ri/1.8/system/Test/Unit/Assertions/assert-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Asserts that <tt>boolean</tt> is not false or nil.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  assert [1, 2].include?(5)\n"
full_name: Test::Unit::Assertions#assert
is_singleton: false
name: assert
params: (boolean, message=nil)
visibility: public
PK%}[���9ri/1.8/system/Test/Unit/Assertions/assert_in_delta-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes if <tt>expected_float</tt> and <tt>actual_float</tt> are equal within <tt>delta</tt> tolerance.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  assert_in_delta 0.05, (50000.0 / 10**6), 0.00001\n"
full_name: Test::Unit::Assertions#assert_in_delta
is_singleton: false
name: assert_in_delta
params: (expected_float, actual_float, delta, message="")
visibility: public
PK%}[8"���5ri/1.8/system/Test/Unit/Assertions/assert_same-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes if <tt>actual</tt> .equal? <tt>expected</tt> (i.e. they are the same instance).
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  o = Object.new\n  assert_same o, o\n"
full_name: Test::Unit::Assertions#assert_same
is_singleton: false
name: assert_same
params: (expected, actual, message="")
visibility: public
PK%}[�%�UU8ri/1.8/system/Test/Unit/Assertions/cdesc-Assertions.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: use_pp=
comment: 
- !ruby/struct:SM::Flow::P 
  body: Test::Unit::Assertions contains the standard Test::Unit assertions. Assertions is included in Test::Unit::TestCase.
- !ruby/struct:SM::Flow::P 
  body: To include it in your own code and use its functionality, you simply need to rescue Test::Unit::AssertionFailedError. Additionally you may override add_assertion to get notified whenever an assertion is made.
- !ruby/struct:SM::Flow::P 
  body: "Notes:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: The message to each assertion, if given, will be propagated with the failure.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: It is easy to add your own assertions based on assert_block().
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 1
  text: Example Custom Assertion
- !ruby/struct:SM::Flow::VERB 
  body: "  def deny(boolean, message = nil)\n    message = build_message message, '&lt;?&gt; is not false or nil.', boolean\n    assert_block message do\n      not boolean\n    end\n  end\n"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: UncaughtThrow
  value: "{NameError => /^uncaught throw \\`(.+)\\'$/,                        ThreadError => /^uncaught throw \\`(.+)\\' in thread /}"
full_name: Test::Unit::Assertions
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _wrap_assertion
- !ruby/object:RI::MethodSummary 
  name: add_assertion
- !ruby/object:RI::MethodSummary 
  name: assert
- !ruby/object:RI::MethodSummary 
  name: assert_block
- !ruby/object:RI::MethodSummary 
  name: assert_equal
- !ruby/object:RI::MethodSummary 
  name: assert_in_delta
- !ruby/object:RI::MethodSummary 
  name: assert_instance_of
- !ruby/object:RI::MethodSummary 
  name: assert_kind_of
- !ruby/object:RI::MethodSummary 
  name: assert_match
- !ruby/object:RI::MethodSummary 
  name: assert_nil
- !ruby/object:RI::MethodSummary 
  name: assert_no_match
- !ruby/object:RI::MethodSummary 
  name: assert_not_equal
- !ruby/object:RI::MethodSummary 
  name: assert_not_nil
- !ruby/object:RI::MethodSummary 
  name: assert_not_same
- !ruby/object:RI::MethodSummary 
  name: assert_nothing_raised
- !ruby/object:RI::MethodSummary 
  name: assert_nothing_thrown
- !ruby/object:RI::MethodSummary 
  name: assert_operator
- !ruby/object:RI::MethodSummary 
  name: assert_raise
- !ruby/object:RI::MethodSummary 
  name: assert_raises
- !ruby/object:RI::MethodSummary 
  name: assert_respond_to
- !ruby/object:RI::MethodSummary 
  name: assert_same
- !ruby/object:RI::MethodSummary 
  name: assert_send
- !ruby/object:RI::MethodSummary 
  name: assert_throws
- !ruby/object:RI::MethodSummary 
  name: build_message
- !ruby/object:RI::MethodSummary 
  name: flunk
name: Assertions
superclass: 
PK%}[�2Q��<ri/1.8/system/Test/Unit/Assertions/assert_instance_of-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes if <tt>object</tt> .instance_of? <tt>klass</tt>
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  assert_instance_of String, 'foo'\n"
full_name: Test::Unit::Assertions#assert_instance_of
is_singleton: false
name: assert_instance_of
params: (klass, object, message="")
visibility: public
PK%}[� t��6ri/1.8/system/Test/Unit/Assertions/assert_raise-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes if the block raises one of the given exceptions.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  assert_raise RuntimeError, LoadError do\n    raise 'Boom!!!'\n  end\n"
full_name: Test::Unit::Assertions#assert_raise
is_singleton: false
name: assert_raise
params: (*args) {|| ...}
visibility: public
PK%}[|W�v��9ri/1.8/system/Test/Unit/Assertions/assert_no_match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes if <tt>regexp</tt> !~ <tt>string</tt>
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  assert_no_match(/two/, 'one 2 three')\n"
full_name: Test::Unit::Assertions#assert_no_match
is_singleton: false
name: assert_no_match
params: (regexp, string, message="")
visibility: public
PK%}[�Y���9ri/1.8/system/Test/Unit/Assertions/_wrap_assertion-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
full_name: Test::Unit::Assertions#_wrap_assertion
is_singleton: false
name: _wrap_assertion
params: () {|| ...}
visibility: private
PK%}[�����8ri/1.8/system/Test/Unit/Assertions/assert_kind_of-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes if <tt>object</tt> .kind_of? <tt>klass</tt>
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  assert_kind_of Object, 'foo'\n"
full_name: Test::Unit::Assertions#assert_kind_of
is_singleton: false
name: assert_kind_of
params: (klass, object, message="")
visibility: public
PK%}[գ����"ri/1.8/system/Test/cdesc-Test.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Test
includes: []

instance_methods: []

name: Test
superclass: 
PK%}[+$B��Dri/1.8/system/SingletonClassMethods/cdesc-SingletonClassMethods.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SingletonClassMethods
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _instantiate?
- !ruby/object:RI::MethodSummary 
  name: _load
- !ruby/object:RI::MethodSummary 
  name: clone
- !ruby/object:RI::MethodSummary 
  name: inherited
name: SingletonClassMethods
superclass: 
PK%}[(��y��:ri/1.8/system/SingletonClassMethods/_instantiate%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: waiting-loop hook
full_name: SingletonClassMethods#_instantiate?
is_singleton: false
name: _instantiate?
params: ()
visibility: private
PK%}[�?;��0ri/1.8/system/SingletonClassMethods/_load-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SingletonClassMethods#_load
is_singleton: false
name: _load
params: (str)
visibility: public
PK%}[�)ږ!!4ri/1.8/system/SingletonClassMethods/inherited-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: ensure that the Singleton pattern is properly inherited
full_name: SingletonClassMethods#inherited
is_singleton: false
name: inherited
params: (sub_klass)
visibility: private
PK%}[{�330ri/1.8/system/SingletonClassMethods/clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: properly clone the Singleton pattern - did you know that duping doesn't copy class methods?
full_name: SingletonClassMethods#clone
is_singleton: false
name: clone
params: ()
visibility: public
PK%}[�.WhVVri/1.8/system/IO/flush-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Flushes any buffered data within <em>ios</em> to the underlying operating system (note that this is Ruby internal buffering only; the OS may buffer the data as well).
- !ruby/struct:SM::Flow::VERB 
  body: "   $stdout.print &quot;no newline&quot;\n   $stdout.flush\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   no newline\n"
full_name: IO#flush
is_singleton: false
name: flush
params: |
  ios.flush    => ios

visibility: public
PK&}[���ri/1.8/system/IO/stat-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns status information for <em>ios</em> as an object of type <tt>File::Stat</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   s = f.stat\n   &quot;%o&quot; % s.mode   #=&gt; &quot;100644&quot;\n   s.blksize       #=&gt; 4096\n   s.atime         #=&gt; Wed Apr 09 08:53:54 CDT 2003\n"
full_name: IO#stat
is_singleton: false
name: stat
params: |
  ios.stat    => stat

visibility: public
PK&}[SmzOAA ri/1.8/system/IO/readbyte-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reads a character as with <tt>IO#getc</tt>, but raises an <tt>EOFError</tt> on end of file.
full_name: IO#readbyte
is_singleton: false
name: readbyte
params: |
  ios.readchar   => fixnum

visibility: public
PK&}[AEק�ri/1.8/system/IO/lines-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an enumerator that gives each line in <em>ios</em>. The stream must be opened for reading or an <tt>IOError</tt> will be raised.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.lines.to_a  #=&gt; [&quot;foo\\n&quot;, &quot;bar\\n&quot;]\n   f.rewind\n   f.lines.sort  #=&gt; [&quot;bar\\n&quot;, &quot;foo\\n&quot;]\n"
full_name: IO#lines
is_singleton: false
name: lines
params: |
  ios.lines(sep=$/)     => anEnumerator
  ios.lines(limit)      => anEnumerator
  ios.lines(sep, limit) => anEnumerator

visibility: public
PK&}[0��iiri/1.8/system/IO/chars-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls the given block once for each character in <em>ios</em>, passing the character as an argument. The stream must be opened for reading or an <tt>IOError</tt> will be raised. Multibyte characters are dealt with according to $KCODE.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.each_char {|c| print c, ' ' }   #=&gt; #&lt;File:testfile&gt;\n"
full_name: IO#chars
is_singleton: false
name: chars
params: |
  ios.each_char {|c| block }  => ios

visibility: public
PK&}[��*�CCri/1.8/system/IO/select-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>Kernel#select</tt>.
full_name: IO::select
is_singleton: true
name: select
params: |
  IO.select(read_array 
  [, write_array 
  [, error_array 
  [, timeout]]] ) =>  array  or  nil

visibility: public
PK&}[ԁdЙ�ri/1.8/system/IO/fcntl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Provides a mechanism for issuing low-level commands to control or query file-oriented I/O streams. Arguments and results are platform dependent. If <em>arg</em> is a number, its value is passed directly. If it is a string, it is interpreted as a binary sequence of bytes (<tt>Array#pack</tt> might be a useful way to build this string). On Unix platforms, see <tt>fcntl(2)</tt> for details. Not implemented on all platforms.
full_name: IO#fcntl
is_singleton: false
name: fcntl
params: |
  ios.fcntl(integer_cmd, arg)    => integer

visibility: public
PK&}[�VȟOOri/1.8/system/IO/fsync-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Immediately writes all buffered data in <em>ios</em> to disk. Returns <tt>nil</tt> if the underlying operating system does not support <em>fsync(2)</em>. Note that <tt>fsync</tt> differs from using <tt>IO#sync=</tt>. The latter ensures that data is flushed from Ruby's buffers, but doesn't not guarantee that the underlying operating system actually writes it to disk.
full_name: IO#fsync
is_singleton: false
name: fsync
params: |
  ios.fsync   => 0 or nil

visibility: public
PK&}[n���ri/1.8/system/IO/print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Writes the given object(s) to <em>ios</em>. The stream must be opened for writing. If the output record separator (<tt>$\</tt>) is not <tt>nil</tt>, it will be appended to the output. If no arguments are given, prints <tt>$_</tt>. Objects that aren't strings will be converted by calling their <tt>to_s</tt> method. With no argument, prints the contents of the variable <tt>$_</tt>. Returns <tt>nil</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   $stdout.print(&quot;This is &quot;, 100, &quot; percent.\\n&quot;)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   This is 100 percent.\n"
full_name: IO#print
is_singleton: false
name: print
params: |
  ios.print()             => nil
  ios.print(obj, ...)     => nil

visibility: public
PK&}[�h����ri/1.8/system/IO/printf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Formats and writes to <em>ios</em>, converting parameters under control of the format string. See <tt>Kernel#sprintf</tt> for details.
full_name: IO#printf
is_singleton: false
name: printf
params: |
  ios.printf(format_string [, obj, ...] )   => nil

visibility: public
PK&}[�\��//ri/1.8/system/IO/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Executes the block for every line in <em>ios</em>, where lines are separated by <em>sep_string</em>. <em>ios</em> must be opened for reading or an <tt>IOError</tt> will be raised.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.each {|line| puts &quot;#{f.lineno}: #{line}&quot; }\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   1: This is line one\n   2: This is line two\n   3: This is line three\n   4: And so on...\n"
full_name: IO#each
is_singleton: false
name: each
params: |
  ios.each(sep_string=$/)      {|line| block }  => ios
  ios.each_line(sep_string=$/) {|line| block }  => ios

visibility: public
PK&}[�����ri/1.8/system/IO/cdesc-IO.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: for_fd
- !ruby/object:RI::MethodSummary 
  name: foreach
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: open
- !ruby/object:RI::MethodSummary 
  name: pipe
- !ruby/object:RI::MethodSummary 
  name: popen
- !ruby/object:RI::MethodSummary 
  name: read
- !ruby/object:RI::MethodSummary 
  name: readlines
- !ruby/object:RI::MethodSummary 
  name: select
- !ruby/object:RI::MethodSummary 
  name: sysopen
comment: 
- !ruby/struct:SM::Flow::P 
  body: Class <tt>IO</tt> is the basis for all input and output in Ruby. An I/O stream may be <em>duplexed</em> (that is, bidirectional), and so may use more than one native operating system stream.
- !ruby/struct:SM::Flow::P 
  body: Many of the examples in this section use class <tt>File</tt>, the only standard subclass of <tt>IO</tt>. The two classes are closely associated.
- !ruby/struct:SM::Flow::P 
  body: As used in this section, <em>portname</em> may take any of the following forms.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: A plain string represents a filename suitable for the underlying operating system.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: A string starting with ``<tt>|</tt>'' indicates a subprocess. The remainder of the string following the ``<tt>|</tt>'' is invoked as a process with appropriate input/output channels connected to it.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: A string equal to ``<tt>|-</tt>'' will create another Ruby instance as a subprocess.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "Ruby will convert pathnames between different operating system conventions if possible. For instance, on a Windows system the filename ``<tt>/gumby/ruby/test.rb</tt>'' will be opened as ``<tt>\\gumby\\ruby\\test.rb</tt>''. When specifying a Windows-style filename in a Ruby string, remember to escape the backslashes:"
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;c:\\gumby\\ruby\\test.rb&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: Our examples here will use the Unix-style forward slashes; <tt>File::SEPARATOR</tt> can be used to get the platform-specific separator character.
- !ruby/struct:SM::Flow::P 
  body: I/O ports may be opened in any one of several different modes, which are shown in this section as <em>mode</em>. The mode may either be a Fixnum or a String. If numeric, it should be one of the operating system specific constants (O_RDONLY, O_WRONLY, O_RDWR, O_APPEND and so on). See man open(2) for more information.
- !ruby/struct:SM::Flow::P 
  body: If the mode is given as a String, it must be one of the values listed in the following table.
- !ruby/struct:SM::Flow::VERB 
  body: "  Mode |  Meaning\n  -----+--------------------------------------------------------\n  &quot;r&quot;  |  Read-only, starts at beginning of file  (default mode).\n  -----+--------------------------------------------------------\n  &quot;r+&quot; |  Read-write, starts at beginning of file.\n  -----+--------------------------------------------------------\n  &quot;w&quot;  |  Write-only, truncates existing file\n       |  to zero length or creates a new file for writing.\n  -----+--------------------------------------------------------\n  &quot;w+&quot; |  Read-write, truncates existing file to zero length\n       |  or creates a new file for reading and writing.\n  -----+--------------------------------------------------------\n  &quot;a&quot;  |  Write-only, starts at end of file if file exists,\n       |  otherwise creates a new file for writing.\n  -----+--------------------------------------------------------\n  &quot;a+&quot; |  Read-write, starts at end of file if file exists,\n       |  otherwise creates a new file for reading and\n       |  writing.\n  -----+--------------------------------------------------------\n   &quot;b&quot; |  (DOS/Windows only) Binary file mode (may appear with\n       |  any of the key letters listed above).\n"
- !ruby/struct:SM::Flow::P 
  body: The global constant ARGF (also accessible as $&lt;) provides an IO-like stream which allows access to all files mentioned on the command line (or STDIN if no files are mentioned). ARGF provides the methods <tt>#path</tt> and <tt>#filename</tt> to access the name of the file currently being read.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: SEEK_SET
  value: INT2FIX(SEEK_SET)
- !ruby/object:RI::Constant 
  comment: 
  name: SEEK_CUR
  value: INT2FIX(SEEK_CUR)
- !ruby/object:RI::Constant 
  comment: 
  name: SEEK_END
  value: INT2FIX(SEEK_END)
full_name: IO
includes: 
- !ruby/object:RI::IncludedModule 
  name: File::Constants
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: binmode
- !ruby/object:RI::MethodSummary 
  name: block_scanf
- !ruby/object:RI::MethodSummary 
  name: bytes
- !ruby/object:RI::MethodSummary 
  name: chars
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: close_read
- !ruby/object:RI::MethodSummary 
  name: close_write
- !ruby/object:RI::MethodSummary 
  name: closed?
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: each_byte
- !ruby/object:RI::MethodSummary 
  name: each_char
- !ruby/object:RI::MethodSummary 
  name: each_line
- !ruby/object:RI::MethodSummary 
  name: eof
- !ruby/object:RI::MethodSummary 
  name: eof?
- !ruby/object:RI::MethodSummary 
  name: fcntl
- !ruby/object:RI::MethodSummary 
  name: fileno
- !ruby/object:RI::MethodSummary 
  name: flush
- !ruby/object:RI::MethodSummary 
  name: fsync
- !ruby/object:RI::MethodSummary 
  name: getbyte
- !ruby/object:RI::MethodSummary 
  name: getc
- !ruby/object:RI::MethodSummary 
  name: gets
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: ioctl
- !ruby/object:RI::MethodSummary 
  name: isatty
- !ruby/object:RI::MethodSummary 
  name: lineno
- !ruby/object:RI::MethodSummary 
  name: lineno=
- !ruby/object:RI::MethodSummary 
  name: lines
- !ruby/object:RI::MethodSummary 
  name: pid
- !ruby/object:RI::MethodSummary 
  name: pos
- !ruby/object:RI::MethodSummary 
  name: pos=
- !ruby/object:RI::MethodSummary 
  name: print
- !ruby/object:RI::MethodSummary 
  name: printf
- !ruby/object:RI::MethodSummary 
  name: putc
- !ruby/object:RI::MethodSummary 
  name: puts
- !ruby/object:RI::MethodSummary 
  name: read
- !ruby/object:RI::MethodSummary 
  name: read_nonblock
- !ruby/object:RI::MethodSummary 
  name: readbyte
- !ruby/object:RI::MethodSummary 
  name: readbytes
- !ruby/object:RI::MethodSummary 
  name: readchar
- !ruby/object:RI::MethodSummary 
  name: readline
- !ruby/object:RI::MethodSummary 
  name: readlines
- !ruby/object:RI::MethodSummary 
  name: readpartial
- !ruby/object:RI::MethodSummary 
  name: reopen
- !ruby/object:RI::MethodSummary 
  name: rewind
- !ruby/object:RI::MethodSummary 
  name: scanf
- !ruby/object:RI::MethodSummary 
  name: seek
- !ruby/object:RI::MethodSummary 
  name: soak_up_spaces
- !ruby/object:RI::MethodSummary 
  name: stat
- !ruby/object:RI::MethodSummary 
  name: sync
- !ruby/object:RI::MethodSummary 
  name: sync=
- !ruby/object:RI::MethodSummary 
  name: sysread
- !ruby/object:RI::MethodSummary 
  name: sysseek
- !ruby/object:RI::MethodSummary 
  name: syswrite
- !ruby/object:RI::MethodSummary 
  name: tell
- !ruby/object:RI::MethodSummary 
  name: to_i
- !ruby/object:RI::MethodSummary 
  name: to_io
- !ruby/object:RI::MethodSummary 
  name: tty?
- !ruby/object:RI::MethodSummary 
  name: ungetc
- !ruby/object:RI::MethodSummary 
  name: write
- !ruby/object:RI::MethodSummary 
  name: write_nonblock
name: IO
superclass: 
PK&}[�=K��ri/1.8/system/IO/to_i-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #fileno"
full_name: IO#to_i
is_singleton: false
name: to_i
params: ()
visibility: public
PK&}[D��O��ri/1.8/system/IO/scanf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The trick here is doing a match where you grab one <b>line</b> of input at a time. The linebreak may or may not occur at the boundary where the string matches a format specifier. And if it does, some rule about whitespace may or may not be in effect...
- !ruby/struct:SM::Flow::P 
  body: That's why this is much more elaborate than the string version.
- !ruby/struct:SM::Flow::P 
  body: "For each line: Match succeeds (non-emptily) and the last attempted spec/string sub-match succeeded:"
- !ruby/struct:SM::Flow::VERB 
  body: "  could the last spec keep matching?\n    yes: save interim results and continue (next line)\n"
- !ruby/struct:SM::Flow::P 
  body: "The last attempted spec/string did not match:"
- !ruby/struct:SM::Flow::P 
  body: are we on the next-to-last spec in the string?
- !ruby/struct:SM::Flow::VERB 
  body: "  yes:\n    is fmt_string.string_left all spaces?\n      yes: does current spec care about input space?\n        yes: fatal failure\n        no: save interim results and continue\n  no: continue  [this state could be analyzed further]\n"
full_name: IO#scanf
is_singleton: false
name: scanf
params: (str,&b)
visibility: public
PK&}[`2�W00ri/1.8/system/IO/lineno-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the current line number in <em>ios</em>. The stream must be opened for reading. <tt>lineno</tt> counts the number of times <tt>gets</tt> is called, rather than the number of newlines encountered. The two values will differ if <tt>gets</tt> is called with a separator other than newline. See also the <tt>$.</tt> variable.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.lineno   #=&gt; 0\n   f.gets     #=&gt; &quot;This is line one\\n&quot;\n   f.lineno   #=&gt; 1\n   f.gets     #=&gt; &quot;This is line two\\n&quot;\n   f.lineno   #=&gt; 2\n"
full_name: IO#lineno
is_singleton: false
name: lineno
params: |
  ios.lineno    => integer

visibility: public
PK&}[�Zm ��ri/1.8/system/IO/read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reads at most <em>length</em> bytes from the I/O stream, or to the end of file if <em>length</em> is omitted or is <tt>nil</tt>. <em>length</em> must be a non-negative integer or nil. If the optional <em>buffer</em> argument is present, it must reference a String, which will receive the data.
- !ruby/struct:SM::Flow::P 
  body: At end of file, it returns <tt>nil</tt> or <tt>&quot;&quot;</tt> depend on <em>length</em>. <tt><em>ios</em>.read()</tt> and <tt><em>ios</em>.read(nil)</tt> returns <tt>&quot;&quot;</tt>. <tt><em>ios</em>.read(<em>positive-integer</em>)</tt> returns nil.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.read(16)   #=&gt; &quot;This is line one&quot;\n"
full_name: IO#read
is_singleton: false
name: read
params: |
  ios.read([length [, buffer]])    => string, buffer, or nil

visibility: public
PK&}[��Y��ri/1.8/system/IO/foreach-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Executes the block for every line in the named I/O port, where lines are separated by <em>sep_string</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   IO.foreach(&quot;testfile&quot;) {|x| print &quot;GOT &quot;, x }\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   GOT This is line one\n   GOT This is line two\n   GOT This is line three\n   GOT And so on...\n"
full_name: IO::foreach
is_singleton: true
name: foreach
params: |
  IO.foreach(name, sep_string=$/) {|line| block }   => nil

visibility: public
PK&}[a/9KK ri/1.8/system/IO/readline-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reads a line as with <tt>IO#gets</tt>, but raises an <tt>EOFError</tt> on end of file.
full_name: IO#readline
is_singleton: false
name: readline
params: |
  ios.readline(sep_string=$/)   => string

visibility: public
PK&}[6��99!ri/1.8/system/IO/each_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Executes the block for every line in <em>ios</em>, where lines are separated by <em>sep_string</em>. <em>ios</em> must be opened for reading or an <tt>IOError</tt> will be raised.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.each {|line| puts &quot;#{f.lineno}: #{line}&quot; }\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   1: This is line one\n   2: This is line two\n   3: This is line three\n   4: And so on...\n"
full_name: IO#each_line
is_singleton: false
name: each_line
params: |
  ios.each(sep_string=$/)      {|line| block }  => ios
  ios.each_line(sep_string=$/) {|line| block }  => ios

visibility: public
PK&}[h�[�ri/1.8/system/IO/pipe-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Creates a pair of pipe endpoints (connected to each other) and returns them as a two-element array of <tt>IO</tt> objects: <tt>[</tt> <em>read_file</em>, <em>write_file</em> <tt>]</tt>. Not available on all platforms."
- !ruby/struct:SM::Flow::P 
  body: In the example below, the two processes close the ends of the pipe that they are not using. This is not just a cosmetic nicety. The read end of a pipe will not generate an end of file condition if there are any writers with the pipe still open. In the case of the parent process, the <tt>rd.read</tt> will never return if it does not first issue a <tt>wr.close</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   rd, wr = IO.pipe\n\n   if fork\n     wr.close\n     puts &quot;Parent got: &lt;#{rd.read}&gt;&quot;\n     rd.close\n     Process.wait\n   else\n     rd.close\n     puts &quot;Sending message to parent&quot;\n     wr.write &quot;Hi Dad&quot;\n     wr.close\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Sending message to parent\n   Parent got: &lt;Hi Dad&gt;\n"
full_name: IO::pipe
is_singleton: true
name: pipe
params: |
  IO.pipe -> array

visibility: public
PK&}[D�q\ri/1.8/system/IO/popen-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Runs the specified command string as a subprocess; the subprocess's standard input and output will be connected to the returned <tt>IO</tt> object. If <em>cmd_string</em> starts with a ``<tt>-</tt>'', then a new instance of Ruby is started as the subprocess. The default mode for the new file object is ``r'', but <em>mode</em> may be set to any of the modes listed in the description for class IO.
- !ruby/struct:SM::Flow::P 
  body: If a block is given, Ruby will run the command as a child connected to Ruby with a pipe. Ruby's end of the pipe will be passed as a parameter to the block. At the end of block, Ruby close the pipe and sets <tt>$?</tt>. In this case <tt>IO::popen</tt> returns the value of the block.
- !ruby/struct:SM::Flow::P 
  body: "If a block is given with a <em>cmd_string</em> of ``<tt>-</tt>'', the block will be run in two separate processes: once in the parent, and once in a child. The parent process will be passed the pipe object as a parameter to the block, the child version of the block will be passed <tt>nil</tt>, and the child's standard in and standard out will be connected to the parent through the pipe. Not available on all platforms."
- !ruby/struct:SM::Flow::VERB 
  body: "   f = IO.popen(&quot;uname&quot;)\n   p f.readlines\n   puts &quot;Parent is #{Process.pid}&quot;\n   IO.popen (&quot;date&quot;) { |f| puts f.gets }\n   IO.popen(&quot;-&quot;) {|f| $stderr.puts &quot;#{Process.pid} is here, f is #{f}&quot;}\n   p $?\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   [&quot;Linux\\n&quot;]\n   Parent is 26166\n   Wed Apr  9 08:53:52 CDT 2003\n   26169 is here, f is\n   26166 is here, f is #&lt;IO:0x401b3d44&gt;\n   #&lt;Process::Status: pid=26166,exited(0)&gt;\n"
full_name: IO::popen
is_singleton: true
name: popen
params: |
  IO.popen(cmd_string, mode="r" )               => io
  IO.popen(cmd_string, mode="r" ) {|io| block } => obj

visibility: public
PK&}[������#ri/1.8/system/IO/readpartial-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reads at most <em>maxlen</em> bytes from the I/O stream. It blocks only if <em>ios</em> has no data immediately available. It doesn't block if some data available. If the optional <em>outbuf</em> argument is present, it must reference a String, which will receive the data. It raises <tt>EOFError</tt> on end of file.
- !ruby/struct:SM::Flow::P 
  body: readpartial is designed for streams such as pipe, socket, tty, etc. It blocks only when no data immediately available. This means that it blocks only when following all conditions hold.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: the buffer in the IO object is empty.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: the content of the stream is empty.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: the stream is not reached to EOF.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: When readpartial blocks, it waits data or EOF on the stream. If some data is reached, readpartial returns with the data. If EOF is reached, readpartial raises EOFError.
- !ruby/struct:SM::Flow::P 
  body: When readpartial doesn't blocks, it returns or raises immediately. If the buffer is not empty, it returns the data in the buffer. Otherwise if the stream has some content, it returns the data in the stream. Otherwise if the stream is reached to EOF, it raises EOFError.
- !ruby/struct:SM::Flow::VERB 
  body: "   r, w = IO.pipe           #               buffer          pipe content\n   w &lt;&lt; &quot;abc&quot;               #               &quot;&quot;              &quot;abc&quot;.\n   r.readpartial(4096)      #=&gt; &quot;abc&quot;       &quot;&quot;              &quot;&quot;\n   r.readpartial(4096)      # blocks because buffer and pipe is empty.\n\n   r, w = IO.pipe           #               buffer          pipe content\n   w &lt;&lt; &quot;abc&quot;               #               &quot;&quot;              &quot;abc&quot;\n   w.close                  #               &quot;&quot;              &quot;abc&quot; EOF\n   r.readpartial(4096)      #=&gt; &quot;abc&quot;       &quot;&quot;              EOF\n   r.readpartial(4096)      # raises EOFError\n\n   r, w = IO.pipe           #               buffer          pipe content\n   w &lt;&lt; &quot;abc\\ndef\\n&quot;        #               &quot;&quot;              &quot;abc\\ndef\\n&quot;\n   r.gets                   #=&gt; &quot;abc\\n&quot;     &quot;def\\n&quot;         &quot;&quot;\n   w &lt;&lt; &quot;ghi\\n&quot;             #               &quot;def\\n&quot;         &quot;ghi\\n&quot;\n   r.readpartial(4096)      #=&gt; &quot;def\\n&quot;     &quot;&quot;              &quot;ghi\\n&quot;\n   r.readpartial(4096)      #=&gt; &quot;ghi\\n&quot;     &quot;&quot;              &quot;&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: "Note that readpartial behaves similar to sysread. The differences are:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: If the buffer is not empty, read from the buffer instead of &quot;sysread for buffered IO (IOError)&quot;.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: It doesn't cause Errno::EAGAIN and Errno::EINTR. When readpartial meets EAGAIN and EINTR by read system call, readpartial retry the system call.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: The later means that readpartial is nonblocking-flag insensitive. It blocks on the situation IO#sysread causes Errno::EAGAIN as if the fd is blocking mode.
full_name: IO#readpartial
is_singleton: false
name: readpartial
params: |
  ios.readpartial(maxlen)              => string
  ios.readpartial(maxlen, outbuf)      => outbuf

visibility: public
PK&}[otS9��ri/1.8/system/IO/sysread-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reads <em>integer</em> bytes from <em>ios</em> using a low-level read and returns them as a string. Do not mix with other methods that read from <em>ios</em> or you may get unpredictable results. Raises <tt>SystemCallError</tt> on error and <tt>EOFError</tt> at end of file.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.sysread(16)   #=&gt; &quot;This is line one&quot;\n"
full_name: IO#sysread
is_singleton: false
name: sysread
params: |
  ios.sysread(integer )    => string

visibility: public
PK'}[�Spri/1.8/system/IO/binmode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Puts <em>ios</em> into binary mode. This is useful only in MS-DOS/Windows environments. Once a stream is in binary mode, it cannot be reset to nonbinary mode.
full_name: IO#binmode
is_singleton: false
name: binmode
params: |
  ios.binmode    => ios

visibility: public
PK'}[C�d��ri/1.8/system/IO/pid-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the process ID of a child process associated with <em>ios</em>. This will be set by <tt>IO::popen</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   pipe = IO.popen(&quot;-&quot;)\n   if pipe\n     $stderr.puts &quot;In parent, child pid is #{pipe.pid}&quot;\n   else\n     $stderr.puts &quot;In child, pid is #{$$}&quot;\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   In child, pid is 26209\n   In parent, child pid is 26209\n"
full_name: IO#pid
is_singleton: false
name: pid
params: |
  ios.pid    => fixnum

visibility: public
PK'}[����#ri/1.8/system/IO/block_scanf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (current)
comment: 
full_name: IO#block_scanf
is_singleton: false
name: block_scanf
params: (str) {|current| ...}
visibility: private
PK'}[��pppri/1.8/system/IO/sysseek-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Seeks to a given <em>offset</em> in the stream according to the value of <em>whence</em> (see <tt>IO#seek</tt> for values of <em>whence</em>). Returns the new offset into the file.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.sysseek(-13, IO::SEEK_END)   #=&gt; 53\n   f.sysread(10)                  #=&gt; &quot;And so on.&quot;\n"
full_name: IO#sysseek
is_singleton: false
name: sysseek
params: |
  ios.sysseek(offset, whence=SEEK_SET)   => integer

visibility: public
PK'}[����ri/1.8/system/IO/tell-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the current offset (in bytes) of <em>ios</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.pos    #=&gt; 0\n   f.gets   #=&gt; &quot;This is line one\\n&quot;\n   f.pos    #=&gt; 17\n"
full_name: IO#tell
is_singleton: false
name: tell
params: |
  ios.pos     => integer
  ios.tell    => integer

visibility: public
PK'}[r��ri/1.8/system/IO/for_fd-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Synonym for <tt>IO::new</tt>.
full_name: IO::for_fd
is_singleton: true
name: for_fd
params: |
  IO.for_fd(fd, mode)    => io

visibility: public
PK'}[3����"ri/1.8/system/IO/close_read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Closes the read end of a duplex I/O stream (i.e., one that contains both a read and a write stream, such as a pipe). Will raise an <tt>IOError</tt> if the stream is not duplexed.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = IO.popen(&quot;/bin/sh&quot;,&quot;r+&quot;)\n   f.close_read\n   f.readlines\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   prog.rb:3:in `readlines': not opened for reading (IOError)\n    from prog.rb:3\n"
full_name: IO#close_read
is_singleton: false
name: close_read
params: |
  ios.close_read    => nil

visibility: public
PK'}[�;�%%ri/1.8/system/IO/rewind-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Positions <em>ios</em> to the beginning of input, resetting <tt>lineno</tt> to zero.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.readline   #=&gt; &quot;This is line one\\n&quot;\n   f.rewind     #=&gt; 0\n   f.lineno     #=&gt; 0\n   f.readline   #=&gt; &quot;This is line one\\n&quot;\n"
full_name: IO#rewind
is_singleton: false
name: rewind
params: |
  ios.rewind    => 0

visibility: public
PK'}[��#��ri/1.8/system/IO/getbyte-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Gets the next 8-bit byte (0..255) from <em>ios</em>. Returns <tt>nil</tt> if called at end of file.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.getc   #=&gt; 84\n   f.getc   #=&gt; 104\n"
full_name: IO#getbyte
is_singleton: false
name: getbyte
params: |
  ios.getc   => fixnum or nil

visibility: public
PK'}[�@�j<<ri/1.8/system/IO/ungetc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pushes back one character (passed as a parameter) onto <em>ios</em>, such that a subsequent buffered read will return it. Only one character may be pushed back before a subsequent read operation (that is, you will be able to read only the last of several characters that have been pushed back). Has no effect with unbuffered reads (such as <tt>IO#sysread</tt>).
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)   #=&gt; #&lt;File:testfile&gt;\n   c = f.getc                 #=&gt; 84\n   f.ungetc(c)                #=&gt; nil\n   f.getc                     #=&gt; 84\n"
full_name: IO#ungetc
is_singleton: false
name: ungetc
params: |
  ios.ungetc(integer)   => nil

visibility: public
PK'}[���

ri/1.8/system/IO/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a string describing this IO object.
full_name: IO#inspect
is_singleton: false
name: inspect
params: |
  ios.inspect   => string

visibility: public
PK'}[,�Z���ri/1.8/system/IO/eof-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if <em>ios</em> is at end of file that means there are no more data to read. The stream must be opened for reading or an <tt>IOError</tt> will be raised.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   dummy = f.readlines\n   f.eof   #=&gt; true\n"
- !ruby/struct:SM::Flow::P 
  body: If <em>ios</em> is a stream such as pipe or socket, <tt>IO#eof?</tt> blocks until the other end sends some data or closes it.
- !ruby/struct:SM::Flow::VERB 
  body: "   r, w = IO.pipe\n   Thread.new { sleep 1; w.close }\n   r.eof?  #=&gt; true after 1 second blocking\n\n   r, w = IO.pipe\n   Thread.new { sleep 1; w.puts &quot;a&quot; }\n   r.eof?  #=&gt; false after 1 second blocking\n\n   r, w = IO.pipe\n   r.eof?  # blocks forever\n"
- !ruby/struct:SM::Flow::P 
  body: Note that <tt>IO#eof?</tt> reads data to a input buffer. So <tt>IO#sysread</tt> doesn't work with <tt>IO#eof?</tt>.
full_name: IO#eof
is_singleton: false
name: eof
params: |
  ios.eof     => true or false
  ios.eof?    => true or false

visibility: public
PK'}[�lY1��&ri/1.8/system/IO/soak_up_spaces-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IO#soak_up_spaces
is_singleton: false
name: soak_up_spaces
params: ()
visibility: private
PK'}[��]��%ri/1.8/system/IO/read_nonblock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reads at most <em>maxlen</em> bytes from <em>ios</em> using read(2) system call after O_NONBLOCK is set for the underlying file descriptor.
- !ruby/struct:SM::Flow::P 
  body: If the optional <em>outbuf</em> argument is present, it must reference a String, which will receive the data.
- !ruby/struct:SM::Flow::P 
  body: "read_nonblock just calls read(2). It causes all errors read(2) causes: EAGAIN, EINTR, etc. The caller should care such errors."
- !ruby/struct:SM::Flow::P 
  body: read_nonblock causes EOFError on EOF.
- !ruby/struct:SM::Flow::P 
  body: If the read buffer is not empty, read_nonblock reads from the buffer like readpartial. In this case, read(2) is not called.
full_name: IO#read_nonblock
is_singleton: false
name: read_nonblock
params: |
  ios.read_nonblock(maxlen)              => string
  ios.read_nonblock(maxlen, outbuf)      => outbuf

visibility: public
PK'}[O�.k��ri/1.8/system/IO/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new <tt>IO</tt> object (a stream) for the given integer file descriptor and mode string. See also <tt>IO#fileno</tt> and <tt>IO::for_fd</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = IO.new(2,&quot;w&quot;)      # '2' is standard error\n   $stderr.puts &quot;Hello&quot;\n   a.puts &quot;World&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Hello\n   World\n"
full_name: IO::new
is_singleton: true
name: new
params: |
  IO.new(fd, mode)   => io

visibility: public
PK'}[�bG�||&ri/1.8/system/IO/write_nonblock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Writes the given string to <em>ios</em> using write(2) system call after O_NONBLOCK is set for the underlying file descriptor.
- !ruby/struct:SM::Flow::P 
  body: "write_nonblock just calls write(2). It causes all errors write(2) causes: EAGAIN, EINTR, etc. The result may also be smaller than string.length (partial write). The caller should care such errors and partial write."
full_name: IO#write_nonblock
is_singleton: false
name: write_nonblock
params: |
  ios.write_nonblock(string)   => integer

visibility: public
PK'}[0+���!ri/1.8/system/IO/lineno%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Manually sets the current line number to the given value. <tt>$.</tt> is updated only on the next read.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.gets                     #=&gt; &quot;This is line one\\n&quot;\n   $.                         #=&gt; 1\n   f.lineno = 1000\n   f.lineno                   #=&gt; 1000\n   $. # lineno of last read   #=&gt; 1\n   f.gets                     #=&gt; &quot;This is line two\\n&quot;\n   $. # lineno of last read   #=&gt; 1001\n"
full_name: IO#lineno=
is_singleton: false
name: lineno=
params: |
  ios.lineno = integer    => integer

visibility: public
PK'}[L
V }}!ri/1.8/system/IO/each_byte-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls the given block once for each byte (0..255) in <em>ios</em>, passing the byte as an argument. The stream must be opened for reading or an <tt>IOError</tt> will be raised.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   checksum = 0\n   f.each_byte {|x| checksum ^= x }   #=&gt; #&lt;File:testfile&gt;\n   checksum                           #=&gt; 12\n"
full_name: IO#each_byte
is_singleton: false
name: each_byte
params: |
  ios.each_byte {|byte| block }  => ios

visibility: public
PK'}[I�S

ri/1.8/system/IO/isatty-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>ios</em> is associated with a terminal device (tty), <tt>false</tt> otherwise.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.new(&quot;testfile&quot;).isatty   #=&gt; false\n   File.new(&quot;/dev/tty&quot;).isatty   #=&gt; true\n"
full_name: IO#isatty
is_singleton: false
name: isatty
params: |
  ios.isatty   => true or false
  ios.tty?     => true or false

visibility: public
PK'}[qҨri/1.8/system/IO/read-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Opens the file, optionally seeks to the given offset, then returns <em>length</em> bytes (defaulting to the rest of the file). <tt>read</tt> ensures the file is closed before returning.
- !ruby/struct:SM::Flow::VERB 
  body: "   IO.read(&quot;testfile&quot;)           #=&gt; &quot;This is line one\\nThis is line two\\nThis is line three\\nAnd so on...\\n&quot;\n   IO.read(&quot;testfile&quot;, 20)       #=&gt; &quot;This is line one\\nThi&quot;\n   IO.read(&quot;testfile&quot;, 20, 10)   #=&gt; &quot;ne one\\nThis is line &quot;\n"
full_name: IO::read
is_singleton: true
name: read
params: |
  IO.read(name, [length [, offset]] )   => string

visibility: public
PK(}[�C����ri/1.8/system/IO/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Writes the given string to <em>ios</em>. The stream must be opened for writing. If the argument is not a string, it will be converted to a string using <tt>to_s</tt>. Returns the number of bytes written.
- !ruby/struct:SM::Flow::VERB 
  body: "   count = $stdout.write( &quot;This is a test\\n&quot; )\n   puts &quot;That was #{count} bytes of data&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   This is a test\n   That was 15 bytes of data\n"
full_name: IO#write
is_singleton: false
name: write
params: |
  ios.write(string)    => integer

visibility: public
PK(}[,�[Tff ri/1.8/system/IO/syswrite-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Writes the given string to <em>ios</em> using a low-level write. Returns the number of bytes written. Do not mix with other methods that write to <em>ios</em> or you may get unpredictable results. Raises <tt>SystemCallError</tt> on error.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;out&quot;, &quot;w&quot;)\n   f.syswrite(&quot;ABCDEF&quot;)   #=&gt; 6\n"
full_name: IO#syswrite
is_singleton: false
name: syswrite
params: |
  ios.syswrite(string)   => integer

visibility: public
PK(}[.Q���!ri/1.8/system/IO/closed%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>ios</em> is completely closed (for duplex streams, both reader and writer), <tt>false</tt> otherwise.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.close         #=&gt; nil\n   f.closed?       #=&gt; true\n   f = IO.popen(&quot;/bin/sh&quot;,&quot;r+&quot;)\n   f.close_write   #=&gt; nil\n   f.closed?       #=&gt; false\n   f.close_read    #=&gt; nil\n   f.closed?       #=&gt; true\n"
full_name: IO#closed?
is_singleton: false
name: closed?
params: |
  ios.closed?    => true or false

visibility: public
PK(}[Q��ri/1.8/system/IO/gets-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reads the next ``line'' from the I/O stream; lines are separated by <em>sep_string</em>. A separator of <tt>nil</tt> reads the entire contents, and a zero-length separator reads the input a paragraph at a time (two successive newlines in the input separate paragraphs). The stream must be opened for reading or an <tt>IOError</tt> will be raised. The line read in will be returned and also assigned to <tt>$_</tt>. Returns <tt>nil</tt> if called at end of file.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.new(&quot;testfile&quot;).gets   #=&gt; &quot;This is line one\\n&quot;\n   $_                          #=&gt; &quot;This is line one\\n&quot;\n"
full_name: IO#gets
is_singleton: false
name: gets
params: |
  ios.gets(sep_string=$/)   => string or nil

visibility: public
PK(}[�#���ri/1.8/system/IO/eof%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if <em>ios</em> is at end of file that means there are no more data to read. The stream must be opened for reading or an <tt>IOError</tt> will be raised.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   dummy = f.readlines\n   f.eof   #=&gt; true\n"
- !ruby/struct:SM::Flow::P 
  body: If <em>ios</em> is a stream such as pipe or socket, <tt>IO#eof?</tt> blocks until the other end sends some data or closes it.
- !ruby/struct:SM::Flow::VERB 
  body: "   r, w = IO.pipe\n   Thread.new { sleep 1; w.close }\n   r.eof?  #=&gt; true after 1 second blocking\n\n   r, w = IO.pipe\n   Thread.new { sleep 1; w.puts &quot;a&quot; }\n   r.eof?  #=&gt; false after 1 second blocking\n\n   r, w = IO.pipe\n   r.eof?  # blocks forever\n"
- !ruby/struct:SM::Flow::P 
  body: Note that <tt>IO#eof?</tt> reads data to a input buffer. So <tt>IO#sysread</tt> doesn't work with <tt>IO#eof?</tt>.
full_name: IO#eof?
is_singleton: false
name: eof?
params: |
  ios.eof     => true or false
  ios.eof?    => true or false

visibility: public
PK(}[v�5X00ri/1.8/system/IO/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: String Output---Writes <em>obj</em> to <em>ios</em>. <em>obj</em> will be converted to a string using <tt>to_s</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   $stdout &lt;&lt; &quot;Hello &quot; &lt;&lt; &quot;world!\\n&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Hello world!\n"
full_name: IO#<<
is_singleton: false
name: "<<"
params: |
  ios << obj     => ios

visibility: public
PK(}[I��Z!ri/1.8/system/IO/readlines-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reads the entire file specified by <em>name</em> as individual lines, and returns those lines in an array. Lines are separated by <em>sep_string</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = IO.readlines(&quot;testfile&quot;)\n   a[0]   #=&gt; &quot;This is line one\\n&quot;\n"
full_name: IO::readlines
is_singleton: true
name: readlines
params: |
  IO.readlines(name, sep_string=$/)   => array

visibility: public
PK(}[H�@��ri/1.8/system/IO/reopen-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reassociates <em>ios</em> with the I/O stream given in <em>other_IO</em> or to a new stream opened on <em>path</em>. This may dynamically change the actual class of this stream.
- !ruby/struct:SM::Flow::VERB 
  body: "   f1 = File.new(&quot;testfile&quot;)\n   f2 = File.new(&quot;testfile&quot;)\n   f2.readlines[0]   #=&gt; &quot;This is line one\\n&quot;\n   f2.reopen(f1)     #=&gt; #&lt;File:testfile&gt;\n   f2.readlines[0]   #=&gt; &quot;This is line one\\n&quot;\n"
full_name: IO#reopen
is_singleton: false
name: reopen
params: |
  ios.reopen(other_IO)         => ios 
  ios.reopen(path, mode_str)   => ios

visibility: public
PK(}[
Lb}��ri/1.8/system/IO/pos-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the current offset (in bytes) of <em>ios</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.pos    #=&gt; 0\n   f.gets   #=&gt; &quot;This is line one\\n&quot;\n   f.pos    #=&gt; 17\n"
full_name: IO#pos
is_singleton: false
name: pos
params: |
  ios.pos     => integer
  ios.tell    => integer

visibility: public
PK(}[DF����ri/1.8/system/IO/getc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Gets the next 8-bit byte (0..255) from <em>ios</em>. Returns <tt>nil</tt> if called at end of file.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.getc   #=&gt; 84\n   f.getc   #=&gt; 104\n"
full_name: IO#getc
is_singleton: false
name: getc
params: |
  ios.getc   => fixnum or nil

visibility: public
PK(}[;�z���!ri/1.8/system/IO/readbytes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reads exactly <tt>n</tt> bytes.
- !ruby/struct:SM::Flow::P 
  body: If the data read is nil an EOFError is raised.
- !ruby/struct:SM::Flow::P 
  body: "If the data read is too short a TruncatedDataError is raised and the read data is obtainable via its #data method."
full_name: IO#readbytes
is_singleton: false
name: readbytes
params: (n)
visibility: public
PK(}[?v��		ri/1.8/system/IO/tty%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>ios</em> is associated with a terminal device (tty), <tt>false</tt> otherwise.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.new(&quot;testfile&quot;).isatty   #=&gt; false\n   File.new(&quot;/dev/tty&quot;).isatty   #=&gt; true\n"
full_name: IO#tty?
is_singleton: false
name: tty?
params: |
  ios.isatty   => true or false
  ios.tty?     => true or false

visibility: public
PK)}[M|<gXXri/1.8/system/IO/putc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: If <em>obj</em> is <tt>Numeric</tt>, write the character whose code is <em>obj</em>, otherwise write the first character of the string representation of <em>obj</em> to <em>ios</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   $stdout.putc &quot;A&quot;\n   $stdout.putc 65\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   AA\n"
full_name: IO#putc
is_singleton: false
name: putc
params: |
  ios.putc(obj)    => obj

visibility: public
PK)}[�雂ddri/1.8/system/IO/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Closes <em>ios</em> and flushes any pending writes to the operating system. The stream is unavailable for any further data operations; an <tt>IOError</tt> is raised if such an attempt is made. I/O streams are automatically closed when they are claimed by the garbage collector.
- !ruby/struct:SM::Flow::P 
  body: If <em>ios</em> is opened by <tt>IO.popen</tt>, <tt>close</tt> sets <tt>$?</tt>.
full_name: IO#close
is_singleton: false
name: close
params: |
  ios.close   => nil

visibility: public
PK)}[?���qq!ri/1.8/system/IO/each_char-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls the given block once for each character in <em>ios</em>, passing the character as an argument. The stream must be opened for reading or an <tt>IOError</tt> will be raised. Multibyte characters are dealt with according to $KCODE.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.each_char {|c| print c, ' ' }   #=&gt; #&lt;File:testfile&gt;\n"
full_name: IO#each_char
is_singleton: false
name: each_char
params: |
  ios.each_char {|c| block }  => ios

visibility: public
PK)}[�T�H

ri/1.8/system/IO/seek-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Seeks to a given offset <em>anInteger</em> in the stream according to the value of <em>whence</em>:"
- !ruby/struct:SM::Flow::VERB 
  body: "  IO::SEEK_CUR  | Seeks to <em>amount</em> plus current position\n  --------------+----------------------------------------------------\n  IO::SEEK_END  | Seeks to <em>amount</em> plus end of stream (you probably\n                | want a negative value for <em>amount</em>)\n  --------------+----------------------------------------------------\n  IO::SEEK_SET  | Seeks to the absolute location given by <em>amount</em>\n"
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.seek(-13, IO::SEEK_END)   #=&gt; 0\n   f.readline                  #=&gt; &quot;And so on...\\n&quot;\n"
full_name: IO#seek
is_singleton: false
name: seek
params: |
  ios.seek(amount, whence=SEEK_SET) -> 0

visibility: public
PK)}[����ri/1.8/system/IO/to_io-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <em>ios</em>.
full_name: IO#to_io
is_singleton: false
name: to_io
params: |
  ios.to_io -> ios

visibility: public
PK)}[Prvvri/1.8/system/IO/sync%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the ``sync mode'' to <tt>true</tt> or <tt>false</tt>. When sync mode is true, all output is immediately flushed to the underlying operating system and is not buffered internally. Returns the new state. See also <tt>IO#fsync</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.sync = true\n"
- !ruby/struct:SM::Flow::P 
  body: <em>(produces no output)</em>
full_name: IO#sync=
is_singleton: false
name: sync=
params: |
  ios.sync = boolean   => boolean

visibility: public
PK*}["�zOAA ri/1.8/system/IO/readchar-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reads a character as with <tt>IO#getc</tt>, but raises an <tt>EOFError</tt> on end of file.
full_name: IO#readchar
is_singleton: false
name: readchar
params: |
  ios.readchar   => fixnum

visibility: public
PK*}[83����ri/1.8/system/IO/fileno-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: to_i
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an integer representing the numeric file descriptor for <em>ios</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   $stdin.fileno    #=&gt; 0\n   $stdout.fileno   #=&gt; 1\n"
full_name: IO#fileno
is_singleton: false
name: fileno
params: |
  ios.fileno    => fixnum
  ios.to_i      => fixnum

visibility: public
PK*}[�B��JJri/1.8/system/IO/ioctl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Provides a mechanism for issuing low-level commands to control or query I/O devices. Arguments and results are platform dependent. If <em>arg</em> is a number, its value is passed directly. If it is a string, it is interpreted as a binary sequence of bytes. On Unix platforms, see <tt>ioctl(2)</tt> for details. Not implemented on all platforms.
full_name: IO#ioctl
is_singleton: false
name: ioctl
params: |
  ios.ioctl(integer_cmd, arg)    => integer

visibility: public
PK*}[��ˆ��ri/1.8/system/IO/sysopen-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Opens the given path, returning the underlying file descriptor as a <tt>Fixnum</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   IO.sysopen(&quot;testfile&quot;)   #=&gt; 3\n"
full_name: IO::sysopen
is_singleton: true
name: sysopen
params: |
  IO.sysopen(path, [mode, [perm]])  => fixnum

visibility: public
PK*}[Ǧ3>  ri/1.8/system/IO/sync-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the current ``sync mode'' of <em>ios</em>. When sync mode is true, all output is immediately flushed to the underlying operating system and is not buffered by Ruby internally. See also <tt>IO#fsync</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.sync   #=&gt; false\n"
full_name: IO#sync
is_singleton: false
name: sync
params: |
  ios.sync    => true or false

visibility: public
PK*}[������!ri/1.8/system/IO/readlines-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reads all of the lines in <em>ios</em>, and returns them in <em>anArray</em>. Lines are separated by the optional <em>sep_string</em>. If <em>sep_string</em> is <tt>nil</tt>, the rest of the stream is returned as a single record. The stream must be opened for reading or an <tt>IOError</tt> will be raised.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.readlines[0]   #=&gt; &quot;This is line one\\n&quot;\n"
full_name: IO#readlines
is_singleton: false
name: readlines
params: |
  ios.readlines(sep_string=$/)  =>   array

visibility: public
PK*}[�򤸰�ri/1.8/system/IO/pos%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Seeks to the given position (in bytes) in <em>ios</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.pos = 17\n   f.gets   #=&gt; &quot;This is line two\\n&quot;\n"
full_name: IO#pos=
is_singleton: false
name: pos=
params: |
  ios.pos = integer    => integer

visibility: public
PK*}[�"�ri/1.8/system/IO/puts-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Writes the given objects to <em>ios</em> as with <tt>IO#print</tt>. Writes a record separator (typically a newline) after any that do not already end with a newline sequence. If called with an array argument, writes each element on a new line. If called without arguments, outputs a single record separator.
- !ruby/struct:SM::Flow::VERB 
  body: "   $stdout.puts(&quot;this&quot;, &quot;is&quot;, &quot;a&quot;, &quot;test&quot;)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   this\n   is\n   a\n   test\n"
full_name: IO#puts
is_singleton: false
name: puts
params: |
  ios.puts(obj, ...)    => nil

visibility: public
PK*}[r�YG��#ri/1.8/system/IO/close_write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Closes the write end of a duplex I/O stream (i.e., one that contains both a read and a write stream, such as a pipe). Will raise an <tt>IOError</tt> if the stream is not duplexed.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = IO.popen(&quot;/bin/sh&quot;,&quot;r+&quot;)\n   f.close_write\n   f.print &quot;nowhere&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   prog.rb:3:in `write': not opened for writing (IOError)\n    from prog.rb:3:in `print'\n    from prog.rb:3\n"
full_name: IO#close_write
is_singleton: false
name: close_write
params: |
  ios.close_write   => nil

visibility: public
PK*}[{�|�88ri/1.8/system/IO/bytes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an enumerator that gives each byte (0..255) in <em>ios</em>. The stream must be opened for reading or an <tt>IOError</tt> will be raised.
- !ruby/struct:SM::Flow::VERB 
  body: "   f = File.new(&quot;testfile&quot;)\n   f.bytes.to_a  #=&gt; [104, 101, 108, 108, 111]\n   f.rewind\n   f.bytes.sort  #=&gt; [101, 104, 108, 108, 111]\n"
full_name: IO#bytes
is_singleton: false
name: bytes
params: |
  ios.bytes   => anEnumerator

visibility: public
PK*}[�a}�WWri/1.8/system/IO/open-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: With no associated block, <tt>open</tt> is a synonym for <tt>IO::new</tt>. If the optional code block is given, it will be passed <em>io</em> as an argument, and the IO object will automatically be closed when the block terminates. In this instance, <tt>IO::open</tt> returns the value of the block.
full_name: IO::open
is_singleton: true
name: open
params: |
  IO.open(fd, mode_string="r" )               => io
  IO.open(fd, mode_string="r" ) {|io| block } => obj

visibility: public
PK*}[��b��3ri/1.8/system/Racc/ParseError/cdesc-ParseError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Racc::ParseError
includes: []

instance_methods: []

name: ParseError
superclass: StandardError
PK*}[���2ri/1.8/system/Racc/Parser/racc_print_stacks-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser#racc_print_stacks
is_singleton: false
name: racc_print_stacks
params: (t, v)
visibility: private
PK*}[GM�t��+ri/1.8/system/Racc/Parser/next_token-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser#next_token
is_singleton: false
name: next_token
params: ()
visibility: private
PK*}[��8���,ri/1.8/system/Racc/Parser/racc_reduce-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser#racc_reduce
is_singleton: false
name: racc_reduce
params: (toks, sim, tstack, vstack)
visibility: private
PK*}[��k��.ri/1.8/system/Racc/Parser/_racc_evalact-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: common
full_name: Racc::Parser#_racc_evalact
is_singleton: false
name: _racc_evalact
params: (act, arg)
visibility: private
PK*}[�r���(ri/1.8/system/Racc/Parser/yyparse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: yyparse
full_name: Racc::Parser#yyparse
is_singleton: false
name: yyparse
params: (recv, mid)
visibility: private
PK*}[
ڣ=��,ri/1.8/system/Racc/Parser/racc_accept-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser#racc_accept
is_singleton: false
name: racc_accept
params: ()
visibility: private
PK*}[M�6��)ri/1.8/system/Racc/Parser/on_error-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser#on_error
is_singleton: false
name: on_error
params: (t, val, vstack)
visibility: private
PK*}[�)y���2ri/1.8/system/Racc/Parser/racc_runtime_type-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser::racc_runtime_type
is_singleton: true
name: racc_runtime_type
params: ()
visibility: public
PK*}[���/ri/1.8/system/Racc/Parser/racc_token2str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser#racc_token2str
is_singleton: false
name: racc_token2str
params: (tok)
visibility: private
PK*}[x���1ri/1.8/system/Racc/Parser/_racc_yyparse_rb-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser#_racc_yyparse_rb
is_singleton: false
name: _racc_yyparse_rb
params: (recv, mid, arg, c_debug)
visibility: private
PK*}[��|��)ri/1.8/system/Racc/Parser/do_parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: do_parse
full_name: Racc::Parser#do_parse
is_singleton: false
name: do_parse
params: ()
visibility: private
PK*}[�+1��0ri/1.8/system/Racc/Parser/_racc_do_reduce-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser#_racc_do_reduce
is_singleton: false
name: _racc_do_reduce
params: (arg, act)
visibility: private
PK*}[㞧ee+ri/1.8/system/Racc/Parser/cdesc-Parser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: racc_runtime_type
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Racc_Runtime_Version
  value: "'1.4.5'"
- !ruby/object:RI::Constant 
  comment: 
  name: Racc_Runtime_Revision
  value: "'$originalRevision: 1.8 $'.split[1]"
- !ruby/object:RI::Constant 
  comment: 
  name: Racc_Runtime_Core_Version_R
  value: "'1.4.5'"
- !ruby/object:RI::Constant 
  comment: 
  name: Racc_Runtime_Core_Revision_R
  value: "'$originalRevision: 1.8 $'.split[1]"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Racc_Runtime_Core_Version_C = (defined in extention)
  name: Racc_Runtime_Core_Revision_C
  value: Racc_Runtime_Core_Id_C.split[2]
- !ruby/object:RI::Constant 
  comment: 
  name: Racc_Main_Parsing_Routine
  value: ":_racc_do_parse_c"
- !ruby/object:RI::Constant 
  comment: 
  name: Racc_YY_Parse_Method
  value: ":_racc_yyparse_c"
- !ruby/object:RI::Constant 
  comment: 
  name: Racc_Runtime_Core_Version
  value: Racc_Runtime_Core_Version_C
- !ruby/object:RI::Constant 
  comment: 
  name: Racc_Runtime_Core_Revision
  value: Racc_Runtime_Core_Revision_C
- !ruby/object:RI::Constant 
  comment: 
  name: Racc_Runtime_Type
  value: "'c'"
- !ruby/object:RI::Constant 
  comment: 
  name: Racc_Main_Parsing_Routine
  value: ":_racc_do_parse_rb"
- !ruby/object:RI::Constant 
  comment: 
  name: Racc_YY_Parse_Method
  value: ":_racc_yyparse_rb"
- !ruby/object:RI::Constant 
  comment: 
  name: Racc_Runtime_Core_Version
  value: Racc_Runtime_Core_Version_R
- !ruby/object:RI::Constant 
  comment: 
  name: Racc_Runtime_Core_Revision
  value: Racc_Runtime_Core_Revision_R
- !ruby/object:RI::Constant 
  comment: 
  name: Racc_Runtime_Type
  value: "'ruby'"
full_name: Racc::Parser
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _racc_do_parse_rb
- !ruby/object:RI::MethodSummary 
  name: _racc_do_reduce
- !ruby/object:RI::MethodSummary 
  name: _racc_evalact
- !ruby/object:RI::MethodSummary 
  name: _racc_init_sysvars
- !ruby/object:RI::MethodSummary 
  name: _racc_setup
- !ruby/object:RI::MethodSummary 
  name: _racc_yyparse_rb
- !ruby/object:RI::MethodSummary 
  name: do_parse
- !ruby/object:RI::MethodSummary 
  name: next_token
- !ruby/object:RI::MethodSummary 
  name: on_error
- !ruby/object:RI::MethodSummary 
  name: racc_accept
- !ruby/object:RI::MethodSummary 
  name: racc_e_pop
- !ruby/object:RI::MethodSummary 
  name: racc_next_state
- !ruby/object:RI::MethodSummary 
  name: racc_print_stacks
- !ruby/object:RI::MethodSummary 
  name: racc_print_states
- !ruby/object:RI::MethodSummary 
  name: racc_read_token
- !ruby/object:RI::MethodSummary 
  name: racc_reduce
- !ruby/object:RI::MethodSummary 
  name: racc_shift
- !ruby/object:RI::MethodSummary 
  name: racc_token2str
- !ruby/object:RI::MethodSummary 
  name: token_to_str
- !ruby/object:RI::MethodSummary 
  name: yyaccept
- !ruby/object:RI::MethodSummary 
  name: yyerrok
- !ruby/object:RI::MethodSummary 
  name: yyerror
- !ruby/object:RI::MethodSummary 
  name: yyparse
name: Parser
superclass: Object
PK*}[]�t��2ri/1.8/system/Racc/Parser/_racc_do_parse_rb-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser#_racc_do_parse_rb
is_singleton: false
name: _racc_do_parse_rb
params: (arg, in_debug)
visibility: private
PK*}[ڷ쫯�(ri/1.8/system/Racc/Parser/yyerror-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser#yyerror
is_singleton: false
name: yyerror
params: ()
visibility: private
PK+}[.ʃ���+ri/1.8/system/Racc/Parser/racc_e_pop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser#racc_e_pop
is_singleton: false
name: racc_e_pop
params: (state, tstack, vstack)
visibility: private
PK+}[�{���(ri/1.8/system/Racc/Parser/yyerrok-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser#yyerrok
is_singleton: false
name: yyerrok
params: ()
visibility: private
PK+}[�����-ri/1.8/system/Racc/Parser/token_to_str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser#token_to_str
is_singleton: false
name: token_to_str
params: (t)
visibility: private
PK+}[�kA��0ri/1.8/system/Racc/Parser/racc_next_state-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser#racc_next_state
is_singleton: false
name: racc_next_state
params: (curstate, state)
visibility: private
PK+}[G�5���2ri/1.8/system/Racc/Parser/racc_print_states-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser#racc_print_states
is_singleton: false
name: racc_print_states
params: (s)
visibility: private
PK+}[�m�60ri/1.8/system/Racc/Parser/racc_read_token-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: for debugging output
full_name: Racc::Parser#racc_read_token
is_singleton: false
name: racc_read_token
params: (t, tok, val)
visibility: private
PK+}[��3���,ri/1.8/system/Racc/Parser/_racc_setup-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser#_racc_setup
is_singleton: false
name: _racc_setup
params: ()
visibility: private
PK+}[�}���)ri/1.8/system/Racc/Parser/yyaccept-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser#yyaccept
is_singleton: false
name: yyaccept
params: ()
visibility: private
PK+}[B�����+ri/1.8/system/Racc/Parser/racc_shift-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser#racc_shift
is_singleton: false
name: racc_shift
params: (tok, tstack, vstack)
visibility: private
PK+}[�p�n��3ri/1.8/system/Racc/Parser/_racc_init_sysvars-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Racc::Parser#_racc_init_sysvars
is_singleton: false
name: _racc_init_sysvars
params: ()
visibility: private
PK+}[�x"ri/1.8/system/Racc/cdesc-Racc.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Racc_No_Extentions
  value: "false"
full_name: Racc
includes: []

instance_methods: []

name: Racc
superclass: 
PK+}[�Qe((,ri/1.8/system/SortedSet/cdesc-SortedSet.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: SortedSet implements a set which elements are sorted in order. See Set.
constants: []

full_name: SortedSet
includes: []

instance_methods: []

name: SortedSet
superclass: Set
PK+}[����)ri/1.8/system/Sync_m/extend_object-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Sync_m::extend_object
is_singleton: true
name: extend_object
params: (obj)
visibility: public
PK+}[wF�~��*ri/1.8/system/Sync_m/sync_locked%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: accessing
full_name: Sync_m#sync_locked?
is_singleton: false
name: sync_locked?
params: ()
visibility: public
PK+}[H��j��+ri/1.8/system/Sync_m/sync_initialize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Sync_m#sync_initialize
is_singleton: false
name: sync_initialize
params: ()
visibility: private
PK+}[�Lc'ri/1.8/system/Sync_m/Err/cdesc-Err.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: Fail
comment: 
- !ruby/struct:SM::Flow::P 
  body: exceptions
constants: []

full_name: Sync_m::Err
includes: []

instance_methods: []

name: Err
superclass: StandardError
PK,}[����$ri/1.8/system/Sync_m/Err/Fail-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Sync_m::Err::Fail
is_singleton: true
name: Fail
params: (*opt)
visibility: public
PK,}[�F[YY?ri/1.8/system/Sync_m/Err/UnknownLocker/cdesc-UnknownLocker.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: Fail
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Message
  value: "\"Thread(%s) not locked.\""
full_name: Sync_m::Err::UnknownLocker
includes: []

instance_methods: []

name: UnknownLocker
superclass: Err
PK,}[]�<��2ri/1.8/system/Sync_m/Err/UnknownLocker/Fail-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Sync_m::Err::UnknownLocker::Fail
is_singleton: true
name: Fail
params: (th)
visibility: public
PK,}[\L��ZZAri/1.8/system/Sync_m/Err/LockModeFailer/cdesc-LockModeFailer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: Fail
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Message
  value: "\"Unknown lock mode(%s)\""
full_name: Sync_m::Err::LockModeFailer
includes: []

instance_methods: []

name: LockModeFailer
superclass: Err
PK,}[���3ri/1.8/system/Sync_m/Err/LockModeFailer/Fail-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Sync_m::Err::LockModeFailer::Fail
is_singleton: true
name: Fail
params: (mode)
visibility: public
PK,}[�����+ri/1.8/system/Sync_m/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Sync_m::append_features
is_singleton: true
name: append_features
params: (cl)
visibility: public
PK,}[�0���ri/1.8/system/Sync_m/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Sync_m::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK,}[�4s���%ri/1.8/system/Sync_m/sync_lock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Sync_m#sync_lock
is_singleton: false
name: sync_lock
params: (m = EX)
visibility: public
PK,}[�M�C��-ri/1.8/system/Sync_m/sync_exclusive%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Sync_m#sync_exclusive?
is_singleton: false
name: sync_exclusive?
params: ()
visibility: public
PK-}[�a����-ri/1.8/system/Sync_m/sync_try_lock_sub-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Sync_m#sync_try_lock_sub
is_singleton: false
name: sync_try_lock_sub
params: (m)
visibility: private
PK-}[�~Pϲ�*ri/1.8/system/Sync_m/sync_shared%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Sync_m#sync_shared?
is_singleton: false
name: sync_shared?
params: ()
visibility: public
PK-}[͚�~��,ri/1.8/system/Sync_m/sync_synchronize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
full_name: Sync_m#sync_synchronize
is_singleton: false
name: sync_synchronize
params: (mode = EX) {|| ...}
visibility: public
PK-}[5�6���*ri/1.8/system/Sync_m/define_aliases-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Sync_m::define_aliases
is_singleton: true
name: define_aliases
params: (cl)
visibility: public
PK-}[6��J��)ri/1.8/system/Sync_m/sync_try_lock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: locking methods.
full_name: Sync_m#sync_try_lock
is_singleton: false
name: sync_try_lock
params: (mode = EX)
visibility: public
PK-}[��۴�)ri/1.8/system/Sync_m/sync_extended-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Sync_m#sync_extended
is_singleton: false
name: sync_extended
params: ()
visibility: public
PK.}[�O�@��&ri/1.8/system/Sync_m/cdesc-Sync_m.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: sync_ex_count
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: sync_ex_locker
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: sync_mode
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: sync_sh_locker
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: sync_upgrade_waiting
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: sync_waiting
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
- !ruby/object:RI::MethodSummary 
  name: define_aliases
- !ruby/object:RI::MethodSummary 
  name: extend_object
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: RCS_ID
  value: "'-$Header$-'"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: lock mode
  name: UN
  value: ":UN"
- !ruby/object:RI::Constant 
  comment: 
  name: SH
  value: ":SH"
- !ruby/object:RI::Constant 
  comment: 
  name: EX
  value: ":EX"
full_name: Sync_m
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: sync_exclusive?
- !ruby/object:RI::MethodSummary 
  name: sync_extended
- !ruby/object:RI::MethodSummary 
  name: sync_initialize
- !ruby/object:RI::MethodSummary 
  name: sync_lock
- !ruby/object:RI::MethodSummary 
  name: sync_locked?
- !ruby/object:RI::MethodSummary 
  name: sync_shared?
- !ruby/object:RI::MethodSummary 
  name: sync_synchronize
- !ruby/object:RI::MethodSummary 
  name: sync_try_lock
- !ruby/object:RI::MethodSummary 
  name: sync_try_lock_sub
- !ruby/object:RI::MethodSummary 
  name: sync_unlock
name: Sync_m
superclass: 
PK.}[p�R$��'ri/1.8/system/Sync_m/sync_unlock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Sync_m#sync_unlock
is_singleton: false
name: sync_unlock
params: (m = EX)
visibility: public
PK/}[��^��(ri/1.8/system/DOT/DOTSubgraph/pop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DOT::DOTSubgraph#pop
is_singleton: false
name: pop
params: ()
visibility: public
PK/}[ż��UU4ri/1.8/system/DOT/DOTSubgraph/cdesc-DOTSubgraph.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: subgraph element is the same to graph, but has another header in dot notation
constants: []

full_name: DOT::DOTSubgraph
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: each_node
- !ruby/object:RI::MethodSummary 
  name: pop
- !ruby/object:RI::MethodSummary 
  name: push
- !ruby/object:RI::MethodSummary 
  name: to_s
name: DOTSubgraph
superclass: DOTElement
PK/}['&X��(ri/1.8/system/DOT/DOTSubgraph/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DOT::DOTSubgraph::new
is_singleton: true
name: new
params: ( params = {}, option_list = GRAPH_OPTS )
visibility: public
PK0}[J>>e��)ri/1.8/system/DOT/DOTSubgraph/push-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DOT::DOTSubgraph#push
is_singleton: false
name: push
params: ( thing )
visibility: public
PK0}[�-���.ri/1.8/system/DOT/DOTSubgraph/each_node-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: i
comment: 
full_name: DOT::DOTSubgraph#each_node
is_singleton: false
name: each_node
params: () {|i| ...}
visibility: public
PK0}[M�2��+ri/1.8/system/DOT/DOTSubgraph/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DOT::DOTSubgraph#<<
is_singleton: false
name: "<<"
params: ( thing )
visibility: public
PK1}[�H�g��)ri/1.8/system/DOT/DOTSubgraph/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DOT::DOTSubgraph#to_s
is_singleton: false
name: to_s
params: ( t = '' )
visibility: public
PK1}[�8�ҷ�>ri/1.8/system/DOT/DOTSimpleElement/cdesc-DOTSimpleElement.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: a root class for any element in dot notation
constants: []

full_name: DOT::DOTSimpleElement
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_s
name: DOTSimpleElement
superclass: Object
PK1}[~BN��-ri/1.8/system/DOT/DOTSimpleElement/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DOT::DOTSimpleElement::new
is_singleton: true
name: new
params: ( params = {} )
visibility: public
PK2}[��Lʱ�.ri/1.8/system/DOT/DOTSimpleElement/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DOT::DOTSimpleElement#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK2}[}v�#ri/1.8/system/DOT/change_tab-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: if we don't like 4 spaces, we can change it any time
full_name: DOT#change_tab
is_singleton: false
name: change_tab
params: ( t )
visibility: public
PK2}[d_޳�$ri/1.8/system/DOT/DOTPort/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DOT::DOTPort::new
is_singleton: true
name: new
params: ( params = {} )
visibility: public
PK2}[! F��,ri/1.8/system/DOT/DOTPort/cdesc-DOTPort.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: label
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: this is used when we build nodes that have shape=record ports don't have options :)
constants: []

full_name: DOT::DOTPort
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_s
name: DOTPort
superclass: DOTSimpleElement
PK2}[(ר�%ri/1.8/system/DOT/DOTPort/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DOT::DOTPort#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK2}[~6����$ri/1.8/system/DOT/DOTEdge/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DOT::DOTEdge::new
is_singleton: true
name: new
params: ( params = {}, option_list = EDGE_OPTS )
visibility: public
PK2}[�G���,ri/1.8/system/DOT/DOTEdge/cdesc-DOTEdge.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: from
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: to
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: this is edge
constants: []

full_name: DOT::DOTEdge
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_s
name: DOTEdge
superclass: DOTElement
PK2}[�=���%ri/1.8/system/DOT/DOTEdge/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DOT::DOTEdge#to_s
is_singleton: false
name: to_s
params: ( t = '' )
visibility: public
PK2}[5��`��*ri/1.8/system/DOT/DOTNode/each_port-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: i
comment: 
full_name: DOT::DOTNode#each_port
is_singleton: false
name: each_port
params: () {|i| ...}
visibility: public
PK2}[�y~x,ri/1.8/system/DOT/DOTNode/cdesc-DOTNode.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: node element
constants: []

full_name: DOT::DOTNode
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: each_port
- !ruby/object:RI::MethodSummary 
  name: pop
- !ruby/object:RI::MethodSummary 
  name: push
- !ruby/object:RI::MethodSummary 
  name: to_s
name: DOTNode
superclass: DOTElement
PK2}[�JsQ��$ri/1.8/system/DOT/DOTNode/pop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DOT::DOTNode#pop
is_singleton: false
name: pop
params: ()
visibility: public
PK2}[��
���$ri/1.8/system/DOT/DOTNode/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DOT::DOTNode::new
is_singleton: true
name: new
params: ( params = {}, option_list = NODE_OPTS )
visibility: public
PK2}[dP"��%ri/1.8/system/DOT/DOTNode/push-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DOT::DOTNode#push
is_singleton: false
name: push
params: ( thing )
visibility: public
PK2}['����'ri/1.8/system/DOT/DOTNode/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DOT::DOTNode#<<
is_singleton: false
name: "<<"
params: ( thing )
visibility: public
PK2}[Yf���%ri/1.8/system/DOT/DOTNode/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DOT::DOTNode#to_s
is_singleton: false
name: to_s
params: ( t = '' )
visibility: public
PK2}[�d9��/ri/1.8/system/DOT/DOTElement/each_option-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: i
comment: 
full_name: DOT::DOTElement#each_option
is_singleton: false
name: each_option
params: () {|i| ...}
visibility: public
PK2}[�kS���2ri/1.8/system/DOT/DOTElement/cdesc-DOTElement.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: attr_reader :parent
  name: name
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: attr_reader :parent
  name: options
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: an element that has options ( node, edge or graph )
constants: []

full_name: DOT::DOTElement
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: each_option
- !ruby/object:RI::MethodSummary 
  name: each_option_pair
name: DOTElement
superclass: DOTSimpleElement
PK2}[�b���'ri/1.8/system/DOT/DOTElement/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DOT::DOTElement::new
is_singleton: true
name: new
params: ( params = {}, option_list = [] )
visibility: public
PK2}[��&��4ri/1.8/system/DOT/DOTElement/each_option_pair-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: key, val
comment: 
full_name: DOT::DOTElement#each_option_pair
is_singleton: false
name: each_option_pair
params: () {|key, val| ...}
visibility: public
PK2}[wd:�ii ri/1.8/system/DOT/cdesc-DOT.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: options for node declaration
  name: NODE_OPTS
  value: "[         'bgcolor',         'color',         'fontcolor',         'fontname',         'fontsize',         'height',         'width',         'label',         'layer',         'rank',         'shape',         'shapefile',         'style',         'URL',     ]"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: options for edge declaration
  name: EDGE_OPTS
  value: "[         'color',         'decorate',         'dir',         'fontcolor',         'fontname',         'fontsize',         'id',         'label',         'layer',         'lhead',         'ltail',         'minlen',         'style',         'weight'"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: options for graph declaration
  name: GRAPH_OPTS
  value: "[         'bgcolor',         'center',         'clusterrank',         'color',         'compound',         'concentrate',         'fillcolor',         'fontcolor',         'fontname',         'fontsize',         'label',         'layerseq',         'margin',         'mclimit',         'nodesep',         'nslimit',         'ordering',         'orientation',         'page',         'rank',         'rankdir',         'ranksep',         'ratio',         'size',         'style',         'URL'"
full_name: DOT
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: change_tab
name: DOT
superclass: 
PK2}[S�I���'ri/1.8/system/DOT/DOTDigraph/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DOT::DOTDigraph::new
is_singleton: true
name: new
params: ( params = {}, option_list = GRAPH_OPTS )
visibility: public
PK2}[y�((2ri/1.8/system/DOT/DOTDigraph/cdesc-DOTDigraph.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: this is graph
constants: []

full_name: DOT::DOTDigraph
includes: []

instance_methods: []

name: DOTDigraph
superclass: DOTSubgraph
PK2}[��k�nn.ri/1.8/system/UNIXSocket/cdesc-UNIXSocket.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Class <tt>Socket</tt> provides access to the underlying operating system socket implementations. It can be used to provide more operating system specific functionality than the protocol-specific socket classes but at the expense of greater complexity. In particular, the class handles addresses using +struct sockaddr+ structures packed into Ruby strings, which can be a joy to manipulate.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Exception Handling
- !ruby/struct:SM::Flow::P 
  body: Ruby's implementation of <tt>Socket</tt> causes an exception to be raised based on the error generated by the system dependent implementation. This is why the methods are documented in a way that isolate Unix-based system exceptions from Windows based exceptions. If more information on particular exception is needed please refer to the Unix manual pages or the Windows WinSock reference.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Documentation by
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Zach Dennis
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Sam Roberts
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <em>Programming Ruby</em> from The Pragmatic Bookshelf.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: Much material in this documentation is taken with permission from <em>Programming Ruby</em> from The Pragmatic Bookshelf.
constants: []

full_name: UNIXSocket
includes: []

instance_methods: []

name: UNIXSocket
superclass: BasicSocket
PK2}[x��|��%ri/1.8/system/IPAddr/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compares the ipaddr with another.
full_name: IPAddr#<=>
is_singleton: false
name: <=>
params: (other)
visibility: public
PK2}[t��m�� ri/1.8/system/IPAddr/to_i-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the integer representation of the ipaddr.
full_name: IPAddr#to_i
is_singleton: false
name: to_i
params: ()
visibility: public
PK2}[[�?�*ri/1.8/system/IPAddr/ipv4_compat%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the ipaddr is an IPv4-compatible IPv6 address.
full_name: IPAddr#ipv4_compat?
is_singleton: false
name: ipv4_compat?
params: ()
visibility: public
PK2}[W��U��ri/1.8/system/IPAddr/%7c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new ipaddr built by bitwise OR.
full_name: IPAddr#|
is_singleton: false
name: "|"
params: (other)
visibility: public
PK2}[� 0k��ri/1.8/system/IPAddr/%26-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new ipaddr built by bitwise AND.
full_name: IPAddr#&
is_singleton: false
name: "&"
params: (other)
visibility: public
PK2}[�m��   ri/1.8/system/IPAddr/ntop-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a network byte ordered string form of an IP address into human readable form.
full_name: IPAddr::ntop
is_singleton: true
name: ntop
params: (addr)
visibility: public
PK2}[��77'ri/1.8/system/IPAddr/ipv4_mapped-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new ipaddr built by converting the native IPv4 address into an IPv4-mapped IPv6 address.
full_name: IPAddr#ipv4_mapped
is_singleton: false
name: ipv4_mapped
params: ()
visibility: public
PK3}[l�+$��&ri/1.8/system/IPAddr/_to_string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IPAddr#_to_string
is_singleton: false
name: _to_string
params: (addr)
visibility: private
PK3}[����ri/1.8/system/IPAddr/set-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IPAddr#set
is_singleton: false
name: set
params: (addr, *family)
visibility: protected
PK3}[�_��ri/1.8/system/IPAddr/%7e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new ipaddr built by bitwise negation.
full_name: IPAddr#~
is_singleton: false
name: "~"
params: ()
visibility: public
PK3}[6�e6LL#ri/1.8/system/IPAddr/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns a string containing a human-readable representation of the ipaddr. (&quot;#&lt;IPAddr: family:address/mask&gt;&quot;)"
full_name: IPAddr#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK3}[�
�p��#ri/1.8/system/IPAddr/mask%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IPAddr#mask!
is_singleton: false
name: mask!
params: (mask)
visibility: protected
PK3}[����//$ri/1.8/system/IPAddr/new_ntoh-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new ipaddr containing the given network byte ordered string form of an IP address.
full_name: IPAddr::new_ntoh
is_singleton: true
name: new_ntoh
params: (addr)
visibility: public
PK3}[�}.xx&ri/1.8/system/IPAddr/include%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: ===
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the given ipaddr is in the range.
- !ruby/struct:SM::Flow::P 
  body: "e.g.:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'ipaddr'\n  net1 = IPAddr.new(&quot;192.168.2.0/24&quot;)\n  net2 = IPAddr.new(&quot;192.168.2.100&quot;)\n  net3 = IPAddr.new(&quot;192.168.3.0&quot;)\n  p net1.include?(net2)     #=&gt; true\n  p net1.include?(net3)     #=&gt; false\n"
full_name: IPAddr#include?
is_singleton: false
name: include?
params: (other)
visibility: public
PK3}[�2��ri/1.8/system/IPAddr/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new ipaddr object either from a human readable IP address representation in string, or from a packed in_addr value followed by an address family.
- !ruby/struct:SM::Flow::P 
  body: "In the former case, the following are the valid formats that will be recognized: &quot;address&quot;, &quot;address/prefixlen&quot; and &quot;address/mask&quot;, where IPv6 address may be enclosed in square brackets (`[' and `]'). If a prefixlen or a mask is specified, it returns a masked IP address. Although the address family is determined automatically from a specified string, you can specify one explicitly by the optional second argument."
- !ruby/struct:SM::Flow::P 
  body: Otherwise an IP addess is generated from a packed in_addr value and an address family.
- !ruby/struct:SM::Flow::P 
  body: The IPAddr class defines many methods and operators, and some of those, such as &amp;, |, include? and ==, accept a string, or a packed in_addr value instead of an IPAddr object.
full_name: IPAddr::new
is_singleton: true
name: new
params: (addr = '::', family = Socket::AF_UNSPEC)
visibility: public
PK3}[u�RV..#ri/1.8/system/IPAddr/reverse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a string for DNS reverse lookup. It returns a string in RFC3172 form for an IPv6 address.
full_name: IPAddr#reverse
is_singleton: false
name: reverse
params: ()
visibility: public
PK3}[��™��%ri/1.8/system/IPAddr/%3d%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #include?"
full_name: IPAddr#===
is_singleton: false
name: ===
params: (other)
visibility: public
PK3}[�Q4\��"ri/1.8/system/IPAddr/%3e%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new ipaddr built by bitwise right-shift.
full_name: IPAddr#>>
is_singleton: false
name: ">>"
params: (num)
visibility: public
PK3}[$(��$ri/1.8/system/IPAddr/ip6_arpa-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a string for DNS reverse lookup compatible with RFC3172.
full_name: IPAddr#ip6_arpa
is_singleton: false
name: ip6_arpa
params: ()
visibility: public
PK3}[�6#G ri/1.8/system/IPAddr/hton-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a network byte ordered string form of the IP address.
full_name: IPAddr#hton
is_singleton: false
name: hton
params: ()
visibility: public
PK3}[�i�Z;;'ri/1.8/system/IPAddr/ipv4_compat-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new ipaddr built by converting the native IPv4 address into an IPv4-compatible IPv6 address.
full_name: IPAddr#ipv4_compat
is_singleton: false
name: ipv4_compat
params: ()
visibility: public
PK3}[�ض'��"ri/1.8/system/IPAddr/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new ipaddr built by bitwise left shift.
full_name: IPAddr#<<
is_singleton: false
name: "<<"
params: (num)
visibility: public
PK3}[�s�*ri/1.8/system/IPAddr/ipv4_mapped%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the ipaddr is an IPv4-mapped IPv6 address.
full_name: IPAddr#ipv4_mapped?
is_singleton: false
name: ipv4_mapped?
params: ()
visibility: public
PK3}[��Tұ�%ri/1.8/system/IPAddr/addr_mask-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IPAddr#addr_mask
is_singleton: false
name: addr_mask
params: (addr)
visibility: private
PK3}[���� ri/1.8/system/IPAddr/succ-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the successor to the ipaddr.
full_name: IPAddr#succ
is_singleton: false
name: succ
params: ()
visibility: public
PK3}[�ل ri/1.8/system/IPAddr/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a string containing the IP address representation.
full_name: IPAddr#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK3}[�����"ri/1.8/system/IPAddr/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if two ipaddrs are equal.
full_name: IPAddr#==
is_singleton: false
name: ==
params: (other)
visibility: public
PK3}[�	+���#ri/1.8/system/IPAddr/ipv6%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the ipaddr is an IPv6 address.
full_name: IPAddr#ipv6?
is_singleton: false
name: ipv6?
params: ()
visibility: public
PK3}[N��%ri/1.8/system/IPAddr/to_string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a string containing the IP address representation in canonical form.
full_name: IPAddr#to_string
is_singleton: false
name: to_string
params: ()
visibility: public
PK3}[�6�	ww"ri/1.8/system/IPAddr/native-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new ipaddr built by converting the IPv6 address into a native IPv4 address. If the IP address is not an IPv4-mapped or IPv4-compatible IPv6 address, returns self.
full_name: IPAddr#native
is_singleton: false
name: native
params: ()
visibility: public
PK3}[֚�o4
4
&ri/1.8/system/IPAddr/cdesc-IPAddr.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Returns the address family of this IP address.
  name: family
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: new_ntoh
- !ruby/object:RI::MethodSummary 
  name: ntop
comment: 
- !ruby/struct:SM::Flow::P 
  body: IPAddr provides a set of methods to manipulate an IP address. Both IPv4 and IPv6 are supported.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'ipaddr'\n\n  ipaddr1 = IPAddr.new &quot;3ffe:505:2::1&quot;\n\n  p ipaddr1                   #=&gt; #&lt;IPAddr: IPv6:3ffe:0505:0002:0000:0000:0000:0000:0001/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff&gt;\n\n  p ipaddr1.to_s              #=&gt; &quot;3ffe:505:2::1&quot;\n\n  ipaddr2 = ipaddr1.mask(48)  #=&gt; #&lt;IPAddr: IPv6:3ffe:0505:0002:0000:0000:0000:0000:0000/ffff:ffff:ffff:0000:0000:0000:0000:0000&gt;\n\n  p ipaddr2.to_s              #=&gt; &quot;3ffe:505:2::&quot;\n\n  ipaddr3 = IPAddr.new &quot;192.168.2.0/24&quot;\n\n  p ipaddr3                   #=&gt; #&lt;IPAddr: IPv4:192.168.2.0/255.255.255.0&gt;\n"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: IN4MASK
  value: "0xffffffff"
- !ruby/object:RI::Constant 
  comment: 
  name: IN6MASK
  value: "0xffffffffffffffffffffffffffffffff"
- !ruby/object:RI::Constant 
  comment: 
  name: IN6FORMAT
  value: (["%.4x"] * 8).join(':')
full_name: IPAddr
includes: 
- !ruby/object:RI::IncludedModule 
  name: Comparable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "&"
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: ===
- !ruby/object:RI::MethodSummary 
  name: ">>"
- !ruby/object:RI::MethodSummary 
  name: _reverse
- !ruby/object:RI::MethodSummary 
  name: _to_string
- !ruby/object:RI::MethodSummary 
  name: addr_mask
- !ruby/object:RI::MethodSummary 
  name: coerce_other
- !ruby/object:RI::MethodSummary 
  name: hton
- !ruby/object:RI::MethodSummary 
  name: in6_addr
- !ruby/object:RI::MethodSummary 
  name: in_addr
- !ruby/object:RI::MethodSummary 
  name: include?
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: ip6_arpa
- !ruby/object:RI::MethodSummary 
  name: ip6_int
- !ruby/object:RI::MethodSummary 
  name: ipv4?
- !ruby/object:RI::MethodSummary 
  name: ipv4_compat
- !ruby/object:RI::MethodSummary 
  name: ipv4_compat?
- !ruby/object:RI::MethodSummary 
  name: ipv4_mapped
- !ruby/object:RI::MethodSummary 
  name: ipv4_mapped?
- !ruby/object:RI::MethodSummary 
  name: ipv6?
- !ruby/object:RI::MethodSummary 
  name: mask
- !ruby/object:RI::MethodSummary 
  name: mask!
- !ruby/object:RI::MethodSummary 
  name: native
- !ruby/object:RI::MethodSummary 
  name: reverse
- !ruby/object:RI::MethodSummary 
  name: set
- !ruby/object:RI::MethodSummary 
  name: succ
- !ruby/object:RI::MethodSummary 
  name: to_i
- !ruby/object:RI::MethodSummary 
  name: to_range
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: to_string
- !ruby/object:RI::MethodSummary 
  name: "|"
- !ruby/object:RI::MethodSummary 
  name: "~"
name: IPAddr
superclass: Object
PK3}[Qۥ�

#ri/1.8/system/IPAddr/ip6_int-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a string for DNS reverse lookup compatible with RFC1886.
full_name: IPAddr#ip6_int
is_singleton: false
name: ip6_int
params: ()
visibility: public
PK3}[��X��(ri/1.8/system/IPAddr/coerce_other-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IPAddr#coerce_other
is_singleton: false
name: coerce_other
params: (other)
visibility: private
PK3}[����#ri/1.8/system/IPAddr/ipv4%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the ipaddr is an IPv4 address.
full_name: IPAddr#ipv4?
is_singleton: false
name: ipv4?
params: ()
visibility: public
PK3}[�..���$ri/1.8/system/IPAddr/_reverse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IPAddr#_reverse
is_singleton: false
name: _reverse
params: ()
visibility: private
PK3}[�4'��$ri/1.8/system/IPAddr/in6_addr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IPAddr#in6_addr
is_singleton: false
name: in6_addr
params: (left)
visibility: private
PK3}[~�o��#ri/1.8/system/IPAddr/in_addr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: IPAddr#in_addr
is_singleton: false
name: in_addr
params: (addr)
visibility: private
PK3}[�}���$ri/1.8/system/IPAddr/to_range-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a Range object for the network address.
full_name: IPAddr#to_range
is_singleton: false
name: to_range
params: ()
visibility: public
PK3}[�Y�PP ri/1.8/system/IPAddr/mask-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new ipaddr built by masking IP address with the given prefixlen/netmask. (e.g. 8, 64, &quot;255.255.255.0&quot;, etc.)
full_name: IPAddr#mask
is_singleton: false
name: mask
params: (prefixlen)
visibility: public
PK3}[#�?��$ri/1.8/system/Float/cdesc-Float.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: induced_from
comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>Float</tt> objects represent real numbers using the native architecture's double-precision floating point representation.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ROUNDS
  value: INT2FIX(FLT_ROUNDS)
- !ruby/object:RI::Constant 
  comment: 
  name: RADIX
  value: INT2FIX(FLT_RADIX)
- !ruby/object:RI::Constant 
  comment: 
  name: MANT_DIG
  value: INT2FIX(DBL_MANT_DIG)
- !ruby/object:RI::Constant 
  comment: 
  name: DIG
  value: INT2FIX(DBL_DIG)
- !ruby/object:RI::Constant 
  comment: 
  name: MIN_EXP
  value: INT2FIX(DBL_MIN_EXP)
- !ruby/object:RI::Constant 
  comment: 
  name: MAX_EXP
  value: INT2FIX(DBL_MAX_EXP)
- !ruby/object:RI::Constant 
  comment: 
  name: MIN_10_EXP
  value: INT2FIX(DBL_MIN_10_EXP)
- !ruby/object:RI::Constant 
  comment: 
  name: MAX_10_EXP
  value: INT2FIX(DBL_MAX_10_EXP)
- !ruby/object:RI::Constant 
  comment: 
  name: MIN
  value: rb_float_new(DBL_MIN)
- !ruby/object:RI::Constant 
  comment: 
  name: MAX
  value: rb_float_new(DBL_MAX)
- !ruby/object:RI::Constant 
  comment: 
  name: EPSILON
  value: rb_float_new(DBL_EPSILON)
full_name: Float
includes: 
- !ruby/object:RI::IncludedModule 
  name: Precision
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "%"
- !ruby/object:RI::MethodSummary 
  name: "*"
- !ruby/object:RI::MethodSummary 
  name: "**"
- !ruby/object:RI::MethodSummary 
  name: +
- !ruby/object:RI::MethodSummary 
  name: "-"
- !ruby/object:RI::MethodSummary 
  name: -@
- !ruby/object:RI::MethodSummary 
  name: /
- !ruby/object:RI::MethodSummary 
  name: <
- !ruby/object:RI::MethodSummary 
  name: <=
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: ">"
- !ruby/object:RI::MethodSummary 
  name: ">="
- !ruby/object:RI::MethodSummary 
  name: abs
- !ruby/object:RI::MethodSummary 
  name: ceil
- !ruby/object:RI::MethodSummary 
  name: coerce
- !ruby/object:RI::MethodSummary 
  name: dclone
- !ruby/object:RI::MethodSummary 
  name: divmod
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: finite?
- !ruby/object:RI::MethodSummary 
  name: floor
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: infinite?
- !ruby/object:RI::MethodSummary 
  name: modulo
- !ruby/object:RI::MethodSummary 
  name: nan?
- !ruby/object:RI::MethodSummary 
  name: round
- !ruby/object:RI::MethodSummary 
  name: to_f
- !ruby/object:RI::MethodSummary 
  name: to_i
- !ruby/object:RI::MethodSummary 
  name: to_int
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: to_yaml
- !ruby/object:RI::MethodSummary 
  name: truncate
- !ruby/object:RI::MethodSummary 
  name: zero?
name: Float
superclass: Numeric
PK3}[������&ri/1.8/system/Float/infinite%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>nil</tt>, -1, or +1 depending on whether <em>flt</em> is finite, -infinity, or +infinity.
- !ruby/struct:SM::Flow::VERB 
  body: "   (0.0).infinite?        #=&gt; nil\n   (-1.0/0.0).infinite?   #=&gt; -1\n   (+1.0/0.0).infinite?   #=&gt; 1\n"
full_name: Float#infinite?
is_singleton: false
name: infinite?
params: |
  flt.infinite? -> nil, -1, +1

visibility: public
PK3}[��)e��!ri/1.8/system/Float/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> only if <em>obj</em> is a <tt>Float</tt> with the same value as <em>flt</em>. Contrast this with <tt>Float#==</tt>, which performs type conversions.
- !ruby/struct:SM::Flow::VERB 
  body: "   1.0.eql?(1)   #=&gt; false\n"
full_name: Float#eql?
is_singleton: false
name: eql?
params: |
  flt.eql?(obj)   => true or false

visibility: public
PK3}[^^¦��ri/1.8/system/Float/%25-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the modulo after division of <tt>flt</tt> by <tt>other</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   6543.21.modulo(137)      #=&gt; 104.21\n   6543.21.modulo(137.24)   #=&gt; 92.9299999999996\n"
full_name: Float#%
is_singleton: false
name: "%"
params: |
  flt % other         => float
  flt.modulo(other)   => float

visibility: public
PK3}[$}T==!ri/1.8/system/Float/%2a%2a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::VERB 
  body: " flt ** other   =&gt; float\n"
- !ruby/struct:SM::Flow::P 
  body: Raises <tt>float</tt> the <tt>other</tt> power.
full_name: Float#**
is_singleton: false
name: "**"
params: |
  

visibility: public
PK3}[7ؕ!��$ri/1.8/system/Float/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns -1, 0, or +1 depending on whether <em>flt</em> is less than, equal to, or greater than <em>numeric</em>. This is the basis for the tests in <tt>Comparable</tt>.
full_name: Float#<=>
is_singleton: false
name: <=>
params: |
  flt <=> numeric   => -1, 0, +1

visibility: public
PK3}[�b���!ri/1.8/system/Float/coerce-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "MISSING: documentation"
full_name: Float#coerce
is_singleton: false
name: coerce
params: (p1)
visibility: public
PK3}[u�``PPri/1.8/system/Float/to_i-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <em>flt</em> truncated to an <tt>Integer</tt>.
full_name: Float#to_i
is_singleton: false
name: to_i
params: |
  flt.to_i       => integer
  flt.to_int     => integer
  flt.truncate   => integer

visibility: public
PK3}[8�Ī00ri/1.8/system/Float/%2f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new float which is the result of dividing <tt>float</tt> by <tt>other</tt>.
full_name: Float#/
is_singleton: false
name: /
params: |
  float / other   => float

visibility: public
PK3}[�R�.!ri/1.8/system/Float/divmod-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>Numeric#divmod</tt>.
full_name: Float#divmod
is_singleton: false
name: divmod
params: |
  flt.divmod(numeric)    => array

visibility: public
PK3}[r��Z��"ri/1.8/system/Float/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Float#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PK3}[u䔦ri/1.8/system/Float/%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>true</tt> if <tt>flt</tt> is less than <tt>other</tt>.
full_name: Float#<
is_singleton: false
name: <
params: |
  flt < other    =>  true or false

visibility: public
PK3}[�<��ri/1.8/system/Float/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a hash code for this float.
full_name: Float#hash
is_singleton: false
name: hash
params: |
  flt.hash   => integer

visibility: public
PK3}[��%*,,!ri/1.8/system/Float/%3c%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>true</tt> if <tt>flt</tt> is less than or equal to <tt>other</tt>.
full_name: Float#<=
is_singleton: false
name: <=
params: |
  flt <= other    =>  true or false

visibility: public
PK3}[2���oori/1.8/system/Float/abs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the absolute value of <em>flt</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   (-34.56).abs   #=&gt; 34.56\n   -34.56.abs     #=&gt; 34.56\n"
full_name: Float#abs
is_singleton: false
name: abs
params: |
  flt.abs    => float

visibility: public
PK3}[�K
11!ri/1.8/system/Float/%3e%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>true</tt> if <tt>flt</tt> is greater than or equal to <tt>other</tt>.
full_name: Float#>=
is_singleton: false
name: ">="
params: |
  flt >= other    =>  true or false

visibility: public
PK3}[��S|++ri/1.8/system/Float/%2a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new float which is the product of <tt>float</tt> and <tt>other</tt>.
full_name: Float#*
is_singleton: false
name: "*"
params: |
  float * other   => float

visibility: public
PK3}[Tm�]��ri/1.8/system/Float/ceil-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the smallest <tt>Integer</tt> greater than or equal to <em>flt</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   1.2.ceil      #=&gt; 2\n   2.0.ceil      #=&gt; 2\n   (-1.2).ceil   #=&gt; -1\n   (-2.0).ceil   #=&gt; -2\n"
full_name: Float#ceil
is_singleton: false
name: ceil
params: |
  flt.ceil    => integer

visibility: public
PK3}[e–,"ri/1.8/system/Float/zero%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>flt</em> is 0.0.
full_name: Float#zero?
is_singleton: false
name: zero?
params: |
  flt.zero? -> true or false

visibility: public
PK3}[w�j%%ri/1.8/system/Float/%2b-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new float which is the sum of <tt>float</tt> and <tt>other</tt>.
full_name: Float#+
is_singleton: false
name: +
params: |
  float + other   => float

visibility: public
PK3}[���XX#ri/1.8/system/Float/truncate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <em>flt</em> truncated to an <tt>Integer</tt>.
full_name: Float#truncate
is_singleton: false
name: truncate
params: |
  flt.to_i       => integer
  flt.to_int     => integer
  flt.truncate   => integer

visibility: public
PK3}[,�$TT!ri/1.8/system/Float/to_int-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <em>flt</em> truncated to an <tt>Integer</tt>.
full_name: Float#to_int
is_singleton: false
name: to_int
params: |
  flt.to_i       => integer
  flt.to_int     => integer
  flt.truncate   => integer

visibility: public
PK3}[G�����!ri/1.8/system/Float/nan%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>flt</em> is an invalid IEEE floating point number.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = -1.0      #=&gt; -1.0\n   a.nan?        #=&gt; false\n   a = 0.0/0.0   #=&gt; NaN\n   a.nan?        #=&gt; true\n"
full_name: Float#nan?
is_singleton: false
name: nan?
params: |
  flt.nan? -> true or false

visibility: public
PK3}[�ޡ\��ri/1.8/system/Float/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a string containing a representation of self. As well as a fixed or exponential form of the number, the call may return ``<tt>NaN</tt>'', ``<tt>Infinity</tt>'', and ``<tt>-Infinity</tt>''.
full_name: Float#to_s
is_singleton: false
name: to_s
params: |
  flt.to_s    => string

visibility: public
PK3}[v�$qq$ri/1.8/system/Float/finite%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>flt</em> is a valid IEEE floating point number (it is not infinite, and <tt>nan?</tt> is <tt>false</tt>).
full_name: Float#finite?
is_singleton: false
name: finite?
params: |
  flt.finite? -> true or false

visibility: public
PK3}[9@S�""ri/1.8/system/Float/%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>true</tt> if <tt>flt</tt> is greater than <tt>other</tt>.
full_name: Float#>
is_singleton: false
name: ">"
params: |
  flt > other    =>  true or false

visibility: public
PK3}[* c���!ri/1.8/system/Float/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> only if <em>obj</em> has the same value as <em>flt</em>. Contrast this with <tt>Float#eql?</tt>, which requires <em>obj</em> to be a <tt>Float</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   1.0 == 1   #=&gt; true\n"
full_name: Float#==
is_singleton: false
name: ==
params: |
  flt == obj   => true or false

visibility: public
PK3}[�?��'ri/1.8/system/Float/induced_from-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert <tt>obj</tt> to a float.
full_name: Float::induced_from
is_singleton: true
name: induced_from
params: |
  Float.induced_from(obj)    =>  float

visibility: public
PK3}[|AO��!ri/1.8/system/Float/%2d%40-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns float, negated.
full_name: Float#-@
is_singleton: false
name: -@
params: |
  -float   => float

visibility: public
PK3}[�(�� ri/1.8/system/Float/round-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Rounds <em>flt</em> to the nearest integer. Equivalent to:"
- !ruby/struct:SM::Flow::VERB 
  body: "   def round\n     return (self+0.5).floor if self &gt; 0.0\n     return (self-0.5).ceil  if self &lt; 0.0\n     return 0\n   end\n\n   1.5.round      #=&gt; 2\n   (-1.5).round   #=&gt; -2\n"
full_name: Float#round
is_singleton: false
name: round
params: |
  flt.round   => integer

visibility: public
PK3}[����!ri/1.8/system/Float/dclone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Float#dclone
is_singleton: false
name: dclone
params: ()
visibility: public
PK3}[�B�� ri/1.8/system/Float/floor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the largest integer less than or equal to <em>flt</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   1.2.floor      #=&gt; 1\n   2.0.floor      #=&gt; 2\n   (-1.2).floor   #=&gt; -2\n   (-2.0).floor   #=&gt; -2\n"
full_name: Float#floor
is_singleton: false
name: floor
params: |
  flt.floor   => integer

visibility: public
PK3}[�Dwri/1.8/system/Float/to_f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: As <tt>flt</tt> is already a float, returns <em>self</em>.
full_name: Float#to_f
is_singleton: false
name: to_f
params: |
  flt.to_f   => flt

visibility: public
PK3}[A����!ri/1.8/system/Float/modulo-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the modulo after division of <tt>flt</tt> by <tt>other</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   6543.21.modulo(137)      #=&gt; 104.21\n   6543.21.modulo(137.24)   #=&gt; 92.9299999999996\n"
full_name: Float#modulo
is_singleton: false
name: modulo
params: |
  flt % other         => float
  flt.modulo(other)   => float

visibility: public
PK3}[N@��..ri/1.8/system/Float/%2d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new float which is the difference of <tt>float</tt> and <tt>other</tt>.
full_name: Float#-
is_singleton: false
name: "-"
params: |
  float + other   => float

visibility: public
PK3}[��-ri/1.8/system/REXML/ExternalEntity/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::ExternalEntity::new
is_singleton: true
name: new
params: ( src )
visibility: public
PK3}[^�>|VV<ri/1.8/system/REXML/ExternalEntity/cdesc-ExternalEntity.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: REXML::ExternalEntity
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: write
name: ExternalEntity
superclass: Child
PK3}[�b����/ri/1.8/system/REXML/ExternalEntity/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::ExternalEntity#write
is_singleton: false
name: write
params: ( output, indent )
visibility: public
PK3}[4ȣ
��.ri/1.8/system/REXML/ExternalEntity/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::ExternalEntity#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK3}[�����6ri/1.8/system/REXML/Declaration/cdesc-Declaration.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: This is an abstract class. You never use this directly; it serves as a parent class for the specific declarations.
constants: []

full_name: REXML::Declaration
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: write
name: Declaration
superclass: Child
PK3}[\>ů�*ri/1.8/system/REXML/Declaration/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Declaration::new
is_singleton: true
name: new
params: (src)
visibility: public
PK3}[��44,ri/1.8/system/REXML/Declaration/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: DEPRECATED
- !ruby/struct:SM::Flow::P 
  body: See REXML::Formatters
full_name: REXML::Declaration#write
is_singleton: false
name: write
params: ( output, indent )
visibility: public
PK3}[��A��+ri/1.8/system/REXML/Declaration/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Declaration#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK3}[�n���$ri/1.8/system/REXML/cdesc-REXML.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: entity_expansion_text_limit
- !ruby/object:RI::MethodSummary 
  name: entity_expansion_text_limit=
comment: 
- !ruby/struct:SM::Flow::P 
  body: This class was contributed by Mikko Tiihonen mikko DOT tiihonen AT hut DOT fi
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: COPYRIGHT
  value: "\"Copyright \\xC2\\xA9 2001-2006 Sean Russell <ser@germane-software.com>\""
- !ruby/object:RI::Constant 
  comment: 
  name: VERSION
  value: "\"3.1.7.3\""
- !ruby/object:RI::Constant 
  comment: 
  name: DATE
  value: "\"2007/275\""
- !ruby/object:RI::Constant 
  comment: 
  name: REVISION
  value: "\"$Revision: 40812 $\".gsub(/\\$Revision:|\\$/,'').strip"
- !ruby/object:RI::Constant 
  comment: 
  name: Copyright
  value: COPYRIGHT
- !ruby/object:RI::Constant 
  comment: 
  name: Version
  value: VERSION
full_name: REXML
includes: []

instance_methods: []

name: REXML
superclass: 
PK3}[�On99:ri/1.8/system/REXML/Document/entity_expansion_limit-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the entity expansion limit. By default the limit is set to 10000.
full_name: REXML::Document::entity_expansion_limit
is_singleton: true
name: entity_expansion_limit
params: ()
visibility: public
PK3}[�-k)��/ri/1.8/system/REXML/Document/add_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Document#add_element
is_singleton: false
name: add_element
params: (arg=nil, arg2=nil)
visibility: public
PK3}[5I�5$$+ri/1.8/system/REXML/Document/doctype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "@return the DocType child of the document, if one exists, and nil otherwise."
full_name: REXML::Document#doctype
is_singleton: false
name: doctype
params: ()
visibility: public
PK3}[�+�A��Bri/1.8/system/REXML/Document/entity_expansion_text_limit%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the entity expansion limit. By default the limit is set to 10240.
- !ruby/struct:SM::Flow::P 
  body: Deprecated. Use REXML.entity_expansion_text_limit= instead.
full_name: REXML::Document::entity_expansion_text_limit=
is_singleton: true
name: entity_expansion_text_limit=
params: ( val )
visibility: public
PK3}[��?KEE1ri/1.8/system/REXML/Document/expanded_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: name
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: According to the XML spec, a root node has no expanded name
full_name: REXML::Document#expanded_name
is_singleton: false
name: expanded_name
params: ()
visibility: public
PK3}[�;�<$$(ri/1.8/system/REXML/Document/root-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "@return the root Element of the document, or nil if this document has no children."
full_name: REXML::Document#root
is_singleton: false
name: root
params: ()
visibility: public
PK3}[��]���?ri/1.8/system/REXML/Document/entity_expansion_text_limit-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the entity expansion limit. By default the limit is set to 10000.
- !ruby/struct:SM::Flow::P 
  body: Deprecated. Use REXML.entity_expansion_text_limit instead.
full_name: REXML::Document::entity_expansion_text_limit
is_singleton: true
name: entity_expansion_text_limit
params: ()
visibility: public
PK3}[~���RR0ri/1.8/system/REXML/Document/cdesc-Document.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: entity_expansion_count
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: entity_expansion_limit
- !ruby/object:RI::MethodSummary 
  name: entity_expansion_limit=
- !ruby/object:RI::MethodSummary 
  name: entity_expansion_text_limit
- !ruby/object:RI::MethodSummary 
  name: entity_expansion_text_limit=
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: parse_stream
comment: 
- !ruby/struct:SM::Flow::P 
  body: Represents a full XML document, including PIs, a doctype, etc. A Document has a single child that can be accessed by root(). Note that if you want to have an XML declaration written for a document you create, you must add one; REXML documents do not write a default declaration for you. See |DECLARATION| and |write|.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "A convenient default XML declaration. If you want an XML declaration, the easiest way to add one is mydoc &lt;&lt; Document::DECLARATION <tt>DEPRECATED</tt> Use: mydoc &lt;&lt; XMLDecl.default"
  name: DECLARATION
  value: XMLDecl.default
full_name: REXML::Document
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: add_element
- !ruby/object:RI::MethodSummary 
  name: build
- !ruby/object:RI::MethodSummary 
  name: clone
- !ruby/object:RI::MethodSummary 
  name: doctype
- !ruby/object:RI::MethodSummary 
  name: encoding
- !ruby/object:RI::MethodSummary 
  name: expanded_name
- !ruby/object:RI::MethodSummary 
  name: name
- !ruby/object:RI::MethodSummary 
  name: node_type
- !ruby/object:RI::MethodSummary 
  name: record_entity_expansion
- !ruby/object:RI::MethodSummary 
  name: root
- !ruby/object:RI::MethodSummary 
  name: stand_alone?
- !ruby/object:RI::MethodSummary 
  name: version
- !ruby/object:RI::MethodSummary 
  name: write
- !ruby/object:RI::MethodSummary 
  name: xml_decl
name: Document
superclass: Element
PK3}[Pi�QQ'ri/1.8/system/REXML/Document/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: "<<"
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: We override this, because XMLDecls and DocTypes must go at the start of the document
full_name: REXML::Document#add
is_singleton: false
name: add
params: ( child )
visibility: public
PK3}[��*rNN,ri/1.8/system/REXML/Document/encoding-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "@return the XMLDecl encoding of this document as a String. If no XMLDecl has been set, returns the default encoding."
full_name: REXML::Document#encoding
is_singleton: false
name: encoding
params: ()
visibility: public
PK3}[b,Ј��0ri/1.8/system/REXML/Document/parse_stream-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Document::parse_stream
is_singleton: true
name: parse_stream
params: ( source, listener )
visibility: public
PK3}[�C//'ri/1.8/system/REXML/Document/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Constructor @param source if supplied, must be a Document, String, or IO. Documents have their context and Element attributes cloned. Strings are expected to be valid XML documents. IOs are expected to be sources of valid XML documents. @param context if supplied, contains the context of the document; this should be a Hash.
full_name: REXML::Document::new
is_singleton: true
name: new
params: ( source = nil, context = {} )
visibility: public
PK3}[*��@@,ri/1.8/system/REXML/Document/xml_decl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "@return the XMLDecl of this document; if no XMLDecl has been set, the default declaration is returned."
full_name: REXML::Document#xml_decl
is_singleton: false
name: xml_decl
params: ()
visibility: public
PK3}[��U��-ri/1.8/system/REXML/Document/node_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Document#node_type
is_singleton: false
name: node_type
params: ()
visibility: public
PK3}[���+
+
)ri/1.8/system/REXML/Document/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Write the XML tree out, optionally with indent. This writes out the entire XML document, including XML declarations, doctype declarations, and processing instructions (if any are given).
- !ruby/struct:SM::Flow::P 
  body: A controversial point is whether Document should always write the XML declaration (&lt;?xml version='1.0'?&gt;) whether or not one is given by the user (or source document). REXML does not write one if one was not specified, because it adds unnecessary bandwidth to applications such as XML-RPC.
- !ruby/struct:SM::Flow::P 
  body: See also the classes in the rexml/formatters package for the proper way to change the default formatting of XML output
- !ruby/struct:SM::Flow::P 
  body: <em>Examples</em>
- !ruby/struct:SM::Flow::VERB 
  body: "  Document.new(&quot;&lt;a&gt;&lt;b/&gt;&lt;/a&gt;&quot;).serialize\n\n  output_string = &quot;&quot;\n  tr = Transitive.new( output_string )\n  Document.new(&quot;&lt;a&gt;&lt;b/&gt;&lt;/a&gt;&quot;).serialize( tr )\n"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "output:"
    body: output an object which supports '&lt;&lt; string'; this is where the
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: "  document will be written.\n"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "indent:"
    body: An integer. If -1, no indenting will be used; otherwise, the indentation will be twice this number of spaces, and children will be indented an additional amount. For a value of 3, every item will be indented 3 more levels, or 6 more spaces (2 * 3). Defaults to -1
  - !ruby/struct:SM::Flow::LI 
    label: "trans:"
    body: If transitive is true and indent is &gt;= 0, then the output will be pretty-printed in such a way that the added whitespace does not affect the absolute <b>value</b> of the document -- that is, it leaves the value and number of Text nodes in the document unchanged.
  - !ruby/struct:SM::Flow::LI 
    label: "ie_hack:"
    body: Internet Explorer is the worst piece of crap to have ever been written, with the possible exception of Windows itself. Since IE is unable to parse proper XML, we have to provide a hack to generate XML that IE's limited abilities can handle. This hack inserts a space before the /&gt; on empty tags. Defaults to false
  type: :NOTE
full_name: REXML::Document#write
is_singleton: false
name: write
params: ( output=$stdout, indent=-1, trans=false, ie_hack=false )
visibility: public
PK3}[kw��*ri/1.8/system/REXML/Document/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add"
full_name: REXML::Document#<<
is_singleton: false
name: "<<"
params: ( child )
visibility: public
PK3}[�����)ri/1.8/system/REXML/Document/clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Should be obvious
full_name: REXML::Document#clone
is_singleton: false
name: clone
params: ()
visibility: public
PK3}[̭4*]]2ri/1.8/system/REXML/Document/stand_alone%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "@return the XMLDecl standalone value of this document as a String. If no XMLDecl has been set, returns the default setting."
full_name: REXML::Document#stand_alone?
is_singleton: false
name: stand_alone?
params: ()
visibility: public
PK3}[
����;ri/1.8/system/REXML/Document/record_entity_expansion-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Document#record_entity_expansion
is_singleton: false
name: record_entity_expansion
params: ()
visibility: public
PK3}[��!��(ri/1.8/system/REXML/Document/name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #expanded_name"
full_name: REXML::Document#name
is_singleton: false
name: name
params: ()
visibility: public
PK3}[ET��@@=ri/1.8/system/REXML/Document/entity_expansion_limit%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the entity expansion limit. By default the limit is set to 10000.
full_name: REXML::Document::entity_expansion_limit=
is_singleton: true
name: entity_expansion_limit=
params: ( val )
visibility: public
PK3}[�nA���)ri/1.8/system/REXML/Document/build-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Document#build
is_singleton: false
name: build
params: ( source )
visibility: private
PK3}[� ��JJ+ri/1.8/system/REXML/Document/version-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "@return the XMLDecl version of this document as a String. If no XMLDecl has been set, returns the default version."
full_name: REXML::Document#version
is_singleton: false
name: version
params: ()
visibility: public
PK3}[#��}��*ri/1.8/system/REXML/Source/match_to-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Source#match_to
is_singleton: false
name: match_to
params: ( char, pattern )
visibility: public
PK3}[(ż[��*ri/1.8/system/REXML/Source/empty%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "@return true if the Source is exhausted"
full_name: REXML::Source#empty?
is_singleton: false
name: empty?
params: ()
visibility: public
PK3}[��M.ri/1.8/system/REXML/Source/current_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "@return the current line in the source"
full_name: REXML::Source#current_line
is_singleton: false
name: current_line
params: ()
visibility: public
PK3}[:,E���&ri/1.8/system/REXML/Source/read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Source#read
is_singleton: false
name: read
params: ()
visibility: public
PK3}[챼���*ri/1.8/system/REXML/Source/position-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Source#position
is_singleton: false
name: position
params: ()
visibility: public
PK3}[z	�a��)ri/1.8/system/REXML/Source/consume-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Source#consume
is_singleton: false
name: consume
params: ( pattern )
visibility: public
PK3}[����'ri/1.8/system/REXML/Source/match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Source#match
is_singleton: false
name: match
params: (pattern, cons=false)
visibility: public
PK3}[���dd&ri/1.8/system/REXML/Source/scan-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Scans the source for a given pattern. Note, that this is not your usual scan() method. For one thing, the pattern argument has some requirements; for another, the source can be consumed. You can easily confuse this method. Originally, the patterns were easier to construct and this method more robust, because this method generated search regexes on the fly; however, this was computationally expensive and slowed down the entire REXML package considerably, since this is by far the most commonly called method. @param pattern must be a Regexp, and must be in the form of /^\s*(#{your pattern, with no groups})(.*)/. The first group will be returned; the second group is used if the consume flag is set. @param consume if true, the pattern returned will be consumed, leaving everything after it in the Source. @return the pattern, if found, or nil if the Source is empty or the pattern is not found.
full_name: REXML::Source#scan
is_singleton: false
name: scan
params: (pattern, cons=false)
visibility: public
PK3}[�f����%ri/1.8/system/REXML/Source/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Constructor @param arg must be a String, and should be a valid XML document @param encoding if non-null, sets the encoding of the source to this value, overriding all encoding detection
full_name: REXML::Source::new
is_singleton: true
name: new
params: (arg, encoding=nil)
visibility: public
PK3}[�l���2ri/1.8/system/REXML/Source/match_to_consume-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Source#match_to_consume
is_singleton: false
name: match_to_consume
params: ( char, pattern )
visibility: public
PK3}[���,ri/1.8/system/REXML/Source/cdesc-Source.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The current buffer (what we're going to read next)
  name: buffer
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: encoding
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The line number of the last consumed text
  name: line
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A Source can be searched for patterns, and wraps buffers and other objects and provides consumption of text
constants: []

full_name: REXML::Source
includes: 
- !ruby/object:RI::IncludedModule 
  name: Encoding
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: consume
- !ruby/object:RI::MethodSummary 
  name: current_line
- !ruby/object:RI::MethodSummary 
  name: empty?
- !ruby/object:RI::MethodSummary 
  name: encoding=
- !ruby/object:RI::MethodSummary 
  name: match
- !ruby/object:RI::MethodSummary 
  name: match_to
- !ruby/object:RI::MethodSummary 
  name: match_to_consume
- !ruby/object:RI::MethodSummary 
  name: position
- !ruby/object:RI::MethodSummary 
  name: read
- !ruby/object:RI::MethodSummary 
  name: scan
name: Source
superclass: Object
PK3}[:
��-ri/1.8/system/REXML/Source/encoding%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Inherited from Encoding Overridden to support optimized en/decoding
full_name: REXML::Source#encoding=
is_singleton: false
name: encoding=
params: (enc)
visibility: public
PK3}[^h	��&ri/1.8/system/REXML/XPath/first-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Finds and returns the first node that matches the supplied xpath.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "element:"
    body: The context element
  - !ruby/struct:SM::Flow::LI 
    label: "path:"
    body: The xpath to search for. If not supplied or nil, returns the first node matching '*'.
  - !ruby/struct:SM::Flow::LI 
    label: "namespaces:"
    body: If supplied, a Hash which defines a namespace mapping.
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " XPath.first( node )\n XPath.first( doc, &quot;//b&quot;} )\n XPath.first( node, &quot;a/x:b&quot;, { &quot;x&quot;=&gt;&quot;http://doofus&quot; } )\n"
full_name: REXML::XPath::first
is_singleton: true
name: first
params: (element, path=nil, namespaces=nil, variables={})
visibility: public
PK3}[i���$$*ri/1.8/system/REXML/XPath/cdesc-XPath.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: first
- !ruby/object:RI::MethodSummary 
  name: match
comment: 
- !ruby/struct:SM::Flow::P 
  body: Wrapper class. Use this class to access the XPath functions.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: EMPTY_HASH
  value: "{}"
full_name: REXML::XPath
includes: 
- !ruby/object:RI::IncludedModule 
  name: Functions
instance_methods: []

name: XPath
superclass: Object
PK3}[�uCk//&ri/1.8/system/REXML/XPath/match-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array of nodes matching a given XPath.
full_name: REXML::XPath::match
is_singleton: true
name: match
params: (element, path=nil, namespaces=nil, variables={})
visibility: public
PK3}[t�4��%ri/1.8/system/REXML/XPath/each-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over nodes that match the given path, calling the supplied block with the match.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "element:"
    body: The context element
  - !ruby/struct:SM::Flow::LI 
    label: "path:"
    body: The xpath to search for. If not supplied or nil, defaults to '*'
  - !ruby/struct:SM::Flow::LI 
    label: "namespaces:"
    body: If supplied, a Hash which defines a namespace mapping
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " XPath.each( node ) { |el| ... }\n XPath.each( node, '/*[@attr='v']' ) { |el| ... }\n XPath.each( node, 'ancestor::x' ) { |el| ... }\n"
full_name: REXML::XPath::each
is_singleton: true
name: each
params: (element, path=nil, namespaces=nil, variables={})
visibility: public
PK3}[�Ic��+ri/1.8/system/REXML/Parent/delete_at-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parent#delete_at
is_singleton: false
name: delete_at
params: ( index )
visibility: public
PK3}[?�R''&ri/1.8/system/REXML/Parent/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: length
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "@return the number of children of this parent"
full_name: REXML::Parent#size
is_singleton: false
name: size
params: ()
visibility: public
PK3}[�eI,ri/1.8/system/REXML/Parent/cdesc-Parent.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A parent has children, and has methods for accessing them. The Parent class is never encountered except as the superclass for some other object.
constants: []

full_name: REXML::Parent
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: children
- !ruby/object:RI::MethodSummary 
  name: deep_clone
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: delete_at
- !ruby/object:RI::MethodSummary 
  name: delete_if
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: each_child
- !ruby/object:RI::MethodSummary 
  name: each_index
- !ruby/object:RI::MethodSummary 
  name: index
- !ruby/object:RI::MethodSummary 
  name: insert_after
- !ruby/object:RI::MethodSummary 
  name: insert_before
- !ruby/object:RI::MethodSummary 
  name: length
- !ruby/object:RI::MethodSummary 
  name: parent?
- !ruby/object:RI::MethodSummary 
  name: push
- !ruby/object:RI::MethodSummary 
  name: replace_child
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: to_a
- !ruby/object:RI::MethodSummary 
  name: unshift
name: Parent
superclass: Child
PK3}[I9�^(((ri/1.8/system/REXML/Parent/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Fetches a child at a given index @param index the Integer index of the child to fetch
full_name: REXML::Parent#[]
is_singleton: false
name: "[]"
params: ( index )
visibility: public
PK3}[`X.)��&ri/1.8/system/REXML/Parent/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: each_child
block_params: 
comment: 
full_name: REXML::Parent#each
is_singleton: false
name: each
params: (&block)
visibility: public
PK3}[�����&ri/1.8/system/REXML/Parent/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: children
block_params: 
comment: 
full_name: REXML::Parent#to_a
is_singleton: false
name: to_a
params: ()
visibility: public
PK3}[kXf~''.ri/1.8/system/REXML/Parent/insert_after-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Inserts an child after another child @param child1 this is either an xpath or an Element. If an Element, child2 will be inserted after child1 in the child list of the parent. If an xpath, child2 will be inserted after the first child to match the xpath. @param child2 the child to insert @return the parent (self)
full_name: REXML::Parent#insert_after
is_singleton: false
name: insert_after
params: ( child1, child2 )
visibility: public
PK3}[/��د�+ri/1.8/system/REXML/Parent/parent%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parent#parent?
is_singleton: false
name: parent?
params: ()
visibility: public
PK3}[VtX��(ri/1.8/system/REXML/Parent/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parent#delete
is_singleton: false
name: delete
params: ( object )
visibility: public
PK3}[�H�C��/ri/1.8/system/REXML/Parent/replace_child-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Replaces one child with another, making sure the nodelist is correct @param to_replace the child to replace (must be a Child) @param replacement the child to insert into the nodelist (must be a Child)
full_name: REXML::Parent#replace_child
is_singleton: false
name: replace_child
params: ( to_replace, replacement )
visibility: public
PK3}[*��xx'ri/1.8/system/REXML/Parent/index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Fetches the index of a given child @param child the child to get the index of @return the index of the child, or nil if the object is not a child of this parent.
full_name: REXML::Parent#index
is_singleton: false
name: index
params: ( child )
visibility: public
PK3}[�T���+ri/1.8/system/REXML/Parent/delete_if-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parent#delete_if
is_singleton: false
name: delete_if
params: ( &block )
visibility: public
PK3}[���h��%ri/1.8/system/REXML/Parent/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: push
block_params: 
comment: 
full_name: REXML::Parent#add
is_singleton: false
name: add
params: ( object )
visibility: public
PK3}[�**ַ�)ri/1.8/system/REXML/Parent/unshift-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parent#unshift
is_singleton: false
name: unshift
params: ( object )
visibility: public
PK3}[�w|)%%%ri/1.8/system/REXML/Parent/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Constructor @param parent if supplied, will be set as the parent of this object
full_name: REXML::Parent::new
is_singleton: true
name: new
params: (parent=nil)
visibility: public
PK3}[GB0T��,ri/1.8/system/REXML/Parent/each_child-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #each"
full_name: REXML::Parent#each_child
is_singleton: false
name: each_child
params: (&block)
visibility: public
PK3}[cR�1��*ri/1.8/system/REXML/Parent/children-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #to_a"
full_name: REXML::Parent#children
is_singleton: false
name: children
params: ()
visibility: public
PK3}[[ӥw&ri/1.8/system/REXML/Parent/push-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: "<<"
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add"
full_name: REXML::Parent#push
is_singleton: false
name: push
params: ( object )
visibility: public
PK4}[�j_AA,ri/1.8/system/REXML/Parent/deep_clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deeply clones this object. This creates a complete duplicate of this Parent, including all descendants.
full_name: REXML::Parent#deep_clone
is_singleton: false
name: deep_clone
params: ()
visibility: public
PK4}[�yo��(ri/1.8/system/REXML/Parent/length-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #size"
full_name: REXML::Parent#length
is_singleton: false
name: length
params: ()
visibility: public
PK4}[#����(ri/1.8/system/REXML/Parent/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #push"
full_name: REXML::Parent#<<
is_singleton: false
name: "<<"
params: ( object )
visibility: public
PK4}[���,,/ri/1.8/system/REXML/Parent/insert_before-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Inserts an child before another child @param child1 this is either an xpath or an Element. If an Element, child2 will be inserted before child1 in the child list of the parent. If an xpath, child2 will be inserted before the first child to match the xpath. @param child2 the child to insert @return the parent (self)
full_name: REXML::Parent#insert_before
is_singleton: false
name: insert_before
params: ( child1, child2 )
visibility: public
PK4}[Hqdo��,ri/1.8/system/REXML/Parent/each_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parent#each_index
is_singleton: false
name: each_index
params: ( &block )
visibility: public
PK4}[�����+ri/1.8/system/REXML/Parent/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set an index entry. See Array.[]= @param index the index of the element to set @param opt either the object to set, or an Integer length @param child if opt is an Integer, this is the child to set @return the parent (self)
full_name: REXML::Parent#[]=
is_singleton: false
name: "[]="
params: ( *args )
visibility: public
PK4}[I�g@@9ri/1.8/system/REXML/entity_expansion_text_limit%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the entity expansion limit. By default the limit is set to 10240.
full_name: REXML::entity_expansion_text_limit=
is_singleton: true
name: entity_expansion_text_limit=
params: ( val )
visibility: public
PK4}[Q�}�&&6ri/1.8/system/REXML/EntityConst/cdesc-EntityConst.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: This is a set of entity constants -- the ones defined in the XML specification. These are <tt>gt</tt>, <tt>lt</tt>, <tt>amp</tt>, <tt>quot</tt> and <tt>apos</tt>.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: +&gt;+
  name: GT
  value: Entity.new( 'gt', '>' )
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: +&lt;+
  name: LT
  value: Entity.new( 'lt', '<' )
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: +&amp;+
  name: AMP
  value: Entity.new( 'amp', '&' )
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: +&quot;+
  name: QUOT
  value: Entity.new( 'quot', '"' )
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: +'+
  name: APOS
  value: Entity.new( 'apos', "'" )
full_name: REXML::EntityConst
includes: []

instance_methods: []

name: EntityConst
superclass: 
PK4}[������*ri/1.8/system/REXML/Attributes/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #length"
full_name: REXML::Attributes#size
is_singleton: false
name: size
params: ()
visibility: public
PK4}[-B$ё�,ri/1.8/system/REXML/Attributes/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Fetches an attribute value. If you want to get the Attribute itself, use get_attribute()
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "name:"
    body: an XPath attribute name. Namespaces are relevant here.
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: the String value of the matching attribute, or <tt>nil</tt> if no matching attribute was found. This is the unnormalized value (with entities expanded).
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new &quot;&lt;a foo:att='1' bar:att='2' att='&amp;lt;'/&gt;&quot;\n doc.root.attributes['att']         #-&gt; '&lt;'\n doc.root.attributes['bar:att']     #-&gt; '2'\n"
full_name: REXML::Attributes#[]
is_singleton: false
name: "[]"
params: (name)
visibility: public
PK4}[��n66*ri/1.8/system/REXML/Attributes/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: attr.expanded_name, attr.value
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over each attribute of an Element, yielding the expanded name and value as a pair of Strings.
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new '&lt;a x=&quot;1&quot; y=&quot;2&quot;/&gt;'\n doc.root.attributes.each {|name, value| p name+&quot; =&gt; &quot;+value }\n"
full_name: REXML::Attributes#each
is_singleton: false
name: each
params: () {|attr.expanded_name, attr.value| ...}
visibility: public
PK4}[��1/��*ri/1.8/system/REXML/Attributes/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Attributes#to_a
is_singleton: false
name: to_a
params: ()
visibility: public
PK4}[��?���0ri/1.8/system/REXML/Attributes/namespaces-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Attributes#namespaces
is_singleton: false
name: namespaces
params: ()
visibility: public
PK4}[�gg]��,ri/1.8/system/REXML/Attributes/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes an attribute
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "attribute:"
    body: either a String, which is the name of the attribute to remove -- namespaces are significant here -- or the attribute to remove.
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: the owning element
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new &quot;&lt;a y:foo='0' x:foo='1' foo='3' z:foo='4'/&gt;&quot;\n doc.root.attributes.delete 'foo'   #-&gt; &lt;a y:foo='0' x:foo='1' z:foo='4'/&gt;&quot;\n doc.root.attributes.delete 'x:foo' #-&gt; &lt;a y:foo='0' z:foo='4'/&gt;&quot;\n attr = doc.root.attributes.get_attribute('y:foo')\n doc.root.attributes.delete attr    #-&gt; &lt;a z:foo='4'/&gt;&quot;\n"
full_name: REXML::Attributes#delete
is_singleton: false
name: delete
params: ( attribute )
visibility: public
PK4}[a��"{{4ri/1.8/system/REXML/Attributes/cdesc-Attributes.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A class that defines the set of Attributes of an Element and provides operations for accessing elements in that set.
constants: []

full_name: REXML::Attributes
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: delete_all
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: each_attribute
- !ruby/object:RI::MethodSummary 
  name: get_attribute
- !ruby/object:RI::MethodSummary 
  name: get_attribute_ns
- !ruby/object:RI::MethodSummary 
  name: length
- !ruby/object:RI::MethodSummary 
  name: namespaces
- !ruby/object:RI::MethodSummary 
  name: prefixes
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: to_a
name: Attributes
superclass: Hash
PK5}[��t���)ri/1.8/system/REXML/Attributes/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: "<<"
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds an attribute, overriding any existing attribute by the same name. Namespaces are significant.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "attribute:"
    body: An Attribute
  type: :NOTE
full_name: REXML::Attributes#add
is_singleton: false
name: add
params: ( attribute )
visibility: public
PK5}[��P��)ri/1.8/system/REXML/Attributes/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Constructor
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "element:"
    body: the Element of which this is an Attribute
  type: :NOTE
full_name: REXML::Attributes::new
is_singleton: true
name: new
params: (element)
visibility: public
PK5}[��?	��,ri/1.8/system/REXML/Attributes/length-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: size
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of attributes the owning Element contains.
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document &quot;&lt;a x='1' y='2' foo:x='3'/&gt;&quot;\n doc.root.attributes.length        #-&gt; 3\n"
full_name: REXML::Attributes#length
is_singleton: false
name: length
params: ()
visibility: public
PK5}[k�]���3ri/1.8/system/REXML/Attributes/get_attribute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Fetches an attribute
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "name:"
    body: the name by which to search for the attribute. Can be a <tt>prefix:name</tt> namespace name.
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: The first matching attribute, or nil if there was none. This
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: value is an Attribute node, not the String value of the attribute.
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new '&lt;a x:foo=&quot;1&quot; foo=&quot;2&quot; bar=&quot;3&quot;/&gt;'\n doc.root.attributes.get_attribute(&quot;foo&quot;).value    #-&gt; &quot;2&quot;\n doc.root.attributes.get_attribute(&quot;x:foo&quot;).value  #-&gt; &quot;1&quot;\n"
full_name: REXML::Attributes#get_attribute
is_singleton: false
name: get_attribute
params: ( name )
visibility: public
PK5}[ر����,ri/1.8/system/REXML/Attributes/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add"
full_name: REXML::Attributes#<<
is_singleton: false
name: "<<"
params: ( attribute )
visibility: public
PK6}[lE��rr.ri/1.8/system/REXML/Attributes/prefixes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns an array of Strings containing all of the prefixes declared by this set of # attributes. The array does not include the default namespace declaration, if one exists."
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new(&quot;&lt;a xmlns='foo' xmlns:x='bar' xmlns:y='twee' &quot;+\n       &quot;z='glorp' p:k='gru'/&gt;&quot;)\n prefixes = doc.root.attributes.prefixes    #-&gt; ['x', 'y']\n"
full_name: REXML::Attributes#prefixes
is_singleton: false
name: prefixes
params: ()
visibility: public
PK6}[�g����6ri/1.8/system/REXML/Attributes/get_attribute_ns-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The <tt>get_attribute_ns</tt> method retrieves a method by its namespace and name. Thus it is possible to reliably identify an attribute even if an XML processor has changed the prefix.
- !ruby/struct:SM::Flow::P 
  body: Method contributed by Henrik Martensson
full_name: REXML::Attributes#get_attribute_ns
is_singleton: false
name: get_attribute_ns
params: (namespace, name)
visibility: public
PK6}[�ޮ՞�/ri/1.8/system/REXML/Attributes/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets an attribute, overwriting any existing attribute value by the same name. Namespace is significant.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "name:"
    body: the name of the attribute
  - !ruby/struct:SM::Flow::LI 
    label: "value:"
    body: (optional) If supplied, the value of the attribute. If nil, any existing matching attribute is deleted.
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: Owning element
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new &quot;&lt;a x:foo='1' foo='3'/&gt;&quot;\n doc.root.attributes['y:foo'] = '2'\n doc.root.attributes['foo'] = '4'\n doc.root.attributes['x:foo'] = nil\n"
full_name: REXML::Attributes#[]=
is_singleton: false
name: "[]="
params: ( name, value )
visibility: public
PK6}[iO��GG0ri/1.8/system/REXML/Attributes/delete_all-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes all attributes matching a name. Namespaces are significant.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "name:"
    body: A String; all attributes that match this path will be removed
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: an Array of the Attributes that were removed
  type: :NOTE
full_name: REXML::Attributes#delete_all
is_singleton: false
name: delete_all
params: ( name )
visibility: public
PK6}[ٸ,�224ri/1.8/system/REXML/Attributes/each_attribute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: attribute
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over the attributes of an Element. Yields actual Attribute nodes, not String values.
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new '&lt;a x=&quot;1&quot; y=&quot;2&quot;/&gt;'\n doc.root.attributes.each_attribute {|attr|\n   p attr.expanded_name+&quot; =&gt; &quot;+attr.value\n }\n"
full_name: REXML::Attributes#each_attribute
is_singleton: false
name: each_attribute
params: ( {|attribute| ...}
visibility: public
PK6}[
�[��2ri/1.8/system/REXML/SAX2Listener/entitydecl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "&lt;!ENTITY ...&gt; The argument passed to this method is an array of the entity declaration. It can be in a number of formats, but in general it returns (example, result):"
- !ruby/struct:SM::Flow::VERB 
  body: " &lt;!ENTITY % YN '&quot;Yes&quot;'&gt;\n [&quot;%&quot;, &quot;YN&quot;, &quot;'\\&quot;Yes\\&quot;'&quot;, &quot;\\&quot;&quot;]\n &lt;!ENTITY % YN 'Yes'&gt;\n [&quot;%&quot;, &quot;YN&quot;, &quot;'Yes'&quot;, &quot;s&quot;]\n &lt;!ENTITY WhatHeSaid &quot;He said %YN;&quot;&gt;\n [&quot;WhatHeSaid&quot;, &quot;\\&quot;He said %YN;\\&quot;&quot;, &quot;YN&quot;]\n &lt;!ENTITY open-hatch SYSTEM &quot;http://www.textuality.com/boilerplate/OpenHatch.xml&quot;&gt;\n [&quot;open-hatch&quot;, &quot;SYSTEM&quot;, &quot;\\&quot;http://www.textuality.com/boilerplate/OpenHatch.xml\\&quot;&quot;]\n &lt;!ENTITY open-hatch PUBLIC &quot;-//Textuality//TEXT Standard open-hatch boilerplate//EN&quot; &quot;http://www.textuality.com/boilerplate/OpenHatch.xml&quot;&gt;\n [&quot;open-hatch&quot;, &quot;PUBLIC&quot;, &quot;\\&quot;-//Textuality//TEXT Standard open-hatch boilerplate//EN\\&quot;&quot;, &quot;\\&quot;http://www.textuality.com/boilerplate/OpenHatch.xml\\&quot;&quot;]\n &lt;!ENTITY hatch-pic SYSTEM &quot;../grafix/OpenHatch.gif&quot; NDATA gif&gt;\n [&quot;hatch-pic&quot;, &quot;SYSTEM&quot;, &quot;\\&quot;../grafix/OpenHatch.gif\\&quot;&quot;, &quot;\\n\\t\\t\\t\\t\\t\\t\\tNDATA gif&quot;, &quot;gif&quot;]\n"
full_name: REXML::SAX2Listener#entitydecl
is_singleton: false
name: entitydecl
params: (name, decl)
visibility: public
PK6}[��m��<ri/1.8/system/REXML/SAX2Listener/start_prefix_mapping-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::SAX2Listener#start_prefix_mapping
is_singleton: false
name: start_prefix_mapping
params: (prefix, uri)
visibility: public
PK6}[/��T��/ri/1.8/system/REXML/SAX2Listener/doctype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Handles a doctype declaration. Any attributes of the doctype which are not supplied will be nil. # EG, &lt;!DOCTYPE me PUBLIC &quot;foo&quot; &quot;bar&quot;&gt; @p name the name of the doctype; EG, &quot;me&quot; @p pub_sys &quot;PUBLIC&quot;, &quot;SYSTEM&quot;, or nil. EG, &quot;PUBLIC&quot; @p long_name the supplied long name, or nil. EG, &quot;foo&quot; @p uri the uri of the doctype, or nil. EG, &quot;bar&quot;"
full_name: REXML::SAX2Listener#doctype
is_singleton: false
name: doctype
params: (name, pub_sys, long_name, uri)
visibility: public
PK6}[���6  3ri/1.8/system/REXML/SAX2Listener/attlistdecl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "If a doctype includes an ATTLIST declaration, it will cause this method to be called. The content is the declaration itself, unparsed. EG, &lt;!ATTLIST el attr CDATA #REQUIRED&gt; will come to this method as &quot;el attr CDATA #REQUIRED&quot;. This is the same for all of the .*decl methods."
full_name: REXML::SAX2Listener#attlistdecl
is_singleton: false
name: attlistdecl
params: (element, pairs, contents)
visibility: public
PK6}[ɀF��0ri/1.8/system/REXML/SAX2Listener/progress-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::SAX2Listener#progress
is_singleton: false
name: progress
params: (position)
visibility: public
PK6}[O-�ygg/ri/1.8/system/REXML/SAX2Listener/xmldecl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Called when an XML PI is encountered in the document. EG: &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf&quot;?&gt; @p version the version attribute value. EG, &quot;1.0&quot; @p encoding the encoding attribute value, or nil. EG, &quot;utf&quot; @p standalone the standalone attribute value, or nil. EG, nil @p spaced the declaration is followed by a line break"
full_name: REXML::SAX2Listener#xmldecl
is_singleton: false
name: xmldecl
params: (version, encoding, standalone)
visibility: public
PK6}[�
���6ri/1.8/system/REXML/SAX2Listener/start_document-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::SAX2Listener#start_document
is_singleton: false
name: start_document
params: ()
visibility: public
PK6}[U���3ri/1.8/system/REXML/SAX2Listener/elementdecl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "&lt;!ELEMENT ...&gt;"
full_name: REXML::SAX2Listener#elementdecl
is_singleton: false
name: elementdecl
params: (content)
visibility: public
PK6}[��Y���3ri/1.8/system/REXML/SAX2Listener/end_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::SAX2Listener#end_element
is_singleton: false
name: end_element
params: (uri, localname, qname)
visibility: public
PK6}[
���nn8ri/1.8/system/REXML/SAX2Listener/cdesc-SAX2Listener.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: A template for stream parser listeners. Note that the declarations (attlistdecl, elementdecl, etc) are trivially processed; REXML doesn't yet handle doctype entity declarations, so you have to parse them out yourself.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Missing methods from SAX2
- !ruby/struct:SM::Flow::VERB 
  body: " ignorable_whitespace\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Methods extending SAX2
- !ruby/struct:SM::Flow::P 
  body: <tt>WARNING</tt> These methods are certainly going to change, until DTDs are fully supported. Be aware of this.
- !ruby/struct:SM::Flow::VERB 
  body: " start_document\n end_document\n doctype\n elementdecl\n attlistdecl\n entitydecl\n notationdecl\n cdata\n xmldecl\n comment\n"
constants: []

full_name: REXML::SAX2Listener
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: attlistdecl
- !ruby/object:RI::MethodSummary 
  name: cdata
- !ruby/object:RI::MethodSummary 
  name: characters
- !ruby/object:RI::MethodSummary 
  name: comment
- !ruby/object:RI::MethodSummary 
  name: doctype
- !ruby/object:RI::MethodSummary 
  name: elementdecl
- !ruby/object:RI::MethodSummary 
  name: end_document
- !ruby/object:RI::MethodSummary 
  name: end_element
- !ruby/object:RI::MethodSummary 
  name: end_prefix_mapping
- !ruby/object:RI::MethodSummary 
  name: entitydecl
- !ruby/object:RI::MethodSummary 
  name: notationdecl
- !ruby/object:RI::MethodSummary 
  name: processing_instruction
- !ruby/object:RI::MethodSummary 
  name: progress
- !ruby/object:RI::MethodSummary 
  name: start_document
- !ruby/object:RI::MethodSummary 
  name: start_element
- !ruby/object:RI::MethodSummary 
  name: start_prefix_mapping
- !ruby/object:RI::MethodSummary 
  name: xmldecl
name: SAX2Listener
superclass: 
PK6}[$?%��5ri/1.8/system/REXML/SAX2Listener/start_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::SAX2Listener#start_element
is_singleton: false
name: start_element
params: (uri, localname, qname, attributes)
visibility: public
PK6}[_[99-ri/1.8/system/REXML/SAX2Listener/cdata-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Called when &lt;![CDATA[ ... ]]&gt; is encountered in a document. @p content &quot;...&quot;
full_name: REXML::SAX2Listener#cdata
is_singleton: false
name: cdata
params: (content)
visibility: public
PK6}[���2ri/1.8/system/REXML/SAX2Listener/characters-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::SAX2Listener#characters
is_singleton: false
name: characters
params: (text)
visibility: public
PK6}[� �Q��:ri/1.8/system/REXML/SAX2Listener/end_prefix_mapping-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::SAX2Listener#end_prefix_mapping
is_singleton: false
name: end_prefix_mapping
params: (prefix)
visibility: public
PK6}[R*d,,/ri/1.8/system/REXML/SAX2Listener/comment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Called when a comment is encountered. @p comment The content of the comment
full_name: REXML::SAX2Listener#comment
is_singleton: false
name: comment
params: (comment)
visibility: public
PK6}[����4ri/1.8/system/REXML/SAX2Listener/notationdecl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "&lt;!NOTATION ...&gt;"
full_name: REXML::SAX2Listener#notationdecl
is_singleton: false
name: notationdecl
params: (content)
visibility: public
PK6}[�k޿�4ri/1.8/system/REXML/SAX2Listener/end_document-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::SAX2Listener#end_document
is_singleton: false
name: end_document
params: ()
visibility: public
PK6}[nn����>ri/1.8/system/REXML/SAX2Listener/processing_instruction-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::SAX2Listener#processing_instruction
is_singleton: false
name: processing_instruction
params: (target, data)
visibility: public
PK6}[p�d�  .ri/1.8/system/REXML/Node/each_recursive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: node
comment: 
- !ruby/struct:SM::Flow::P 
  body: Visit all subnodes of <tt>self</tt> recursively
full_name: REXML::Node#each_recursive
is_singleton: false
name: each_recursive
params: () {|node| ...}
visibility: public
PK6}[�~�5ri/1.8/system/REXML/Node/previous_sibling_node-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "@return the previous sibling (nil if unset)"
full_name: REXML::Node#previous_sibling_node
is_singleton: false
name: previous_sibling_node
params: ()
visibility: public
PK6}[���e��)ri/1.8/system/REXML/Node/parent%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Node#parent?
is_singleton: false
name: parent?
params: ()
visibility: public
PK6}[H��>yy4ri/1.8/system/REXML/Node/find_first_recursive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: node
comment: 
- !ruby/struct:SM::Flow::P 
  body: Find (and return) first subnode (recursively) for which the block evaluates to true. Returns <tt>nil</tt> if none was found.
full_name: REXML::Node#find_first_recursive
is_singleton: false
name: find_first_recursive
params: () {|node| ...}
visibility: public
PK6}[ۇ��&ri/1.8/system/REXML/Node/indent-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Node#indent
is_singleton: false
name: indent
params: (to, ind)
visibility: public
PK6}[�O$Q(ri/1.8/system/REXML/Node/cdesc-Node.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Represents a node in the tree. Nodes are never encountered except as superclasses of other objects. Nodes have siblings.
constants: []

full_name: REXML::Node
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: each_recursive
- !ruby/object:RI::MethodSummary 
  name: find_first_recursive
- !ruby/object:RI::MethodSummary 
  name: indent
- !ruby/object:RI::MethodSummary 
  name: index_in_parent
- !ruby/object:RI::MethodSummary 
  name: next_sibling_node
- !ruby/object:RI::MethodSummary 
  name: parent?
- !ruby/object:RI::MethodSummary 
  name: previous_sibling_node
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Node
superclass: 
PK6}[z�ϭ�$ri/1.8/system/REXML/Node/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "indent:"
    body: <b>DEPRECATED</b> This parameter is now ignored. See the formatters in the REXML::Formatters package for changing the output style.
  type: :NOTE
full_name: REXML::Node#to_s
is_singleton: false
name: to_s
params: (indent=nil)
visibility: public
PK6}[�0�1ri/1.8/system/REXML/Node/next_sibling_node-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "@return the next sibling (nil if unset)"
full_name: REXML::Node#next_sibling_node
is_singleton: false
name: next_sibling_node
params: ()
visibility: public
PK6}[���66/ri/1.8/system/REXML/Node/index_in_parent-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the position that <tt>self</tt> holds in its parent's array, indexed from 1.
full_name: REXML::Node#index_in_parent
is_singleton: false
name: index_in_parent
params: ()
visibility: public
PK6}[���>��:ri/1.8/system/REXML/UndefinedNamespaceException/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::UndefinedNamespaceException::new
is_singleton: true
name: new
params: ( prefix, source, parser )
visibility: public
PK6}[d�iVri/1.8/system/REXML/UndefinedNamespaceException/cdesc-UndefinedNamespaceException.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: REXML::UndefinedNamespaceException
includes: []

instance_methods: []

name: UndefinedNamespaceException
superclass: ParseException
PK6}[�ڻ#��2ri/1.8/system/REXML/XMLTokens/cdesc-XMLTokens.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Defines a number of tokens used for parsing XML. Not for general consumption.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: NCNAME_STR
  value: "'[\\w:][\\-\\w\\d.]*'"
- !ruby/object:RI::Constant 
  comment: 
  name: NAME_STR
  value: "\"(?:#{NCNAME_STR}:)?#{NCNAME_STR}\""
- !ruby/object:RI::Constant 
  comment: 
  name: NAMECHAR
  value: "'[\\-\\w\\d\\.:]'"
- !ruby/object:RI::Constant 
  comment: 
  name: NAME
  value: "\"([\\\\w:]#{NAMECHAR}*)\""
- !ruby/object:RI::Constant 
  comment: 
  name: NMTOKEN
  value: "\"(?:#{NAMECHAR})+\""
- !ruby/object:RI::Constant 
  comment: 
  name: NMTOKENS
  value: "\"#{NMTOKEN}(\\\\s+#{NMTOKEN})*\""
- !ruby/object:RI::Constant 
  comment: 
  name: REFERENCE
  value: "\"(?:&#{NAME};|&#\\\\d+;|&#x[0-9a-fA-F]+;)\""
full_name: REXML::XMLTokens
includes: []

instance_methods: []

name: XMLTokens
superclass: 
PK6}[�P�++,ri/1.8/system/REXML/Comment/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compares this Comment to another; the contents of the comment are used in the comparison.
full_name: REXML::Comment#<=>
is_singleton: false
name: <=>
params: (other)
visibility: public
PK6}[VI��UU&ri/1.8/system/REXML/Comment/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Constructor. The first argument can be one of three types: @param first If String, the contents of this comment are set to the argument. If Comment, the argument is duplicated. If Source, the argument is scanned for a comment. @param second If the first argument is a Source, this argument should be nil, not supplied, or a Parent to be set as the parent of this object"
full_name: REXML::Comment::new
is_singleton: true
name: new
params: ( first, second = nil )
visibility: public
PK6}[KU#�||.ri/1.8/system/REXML/Comment/cdesc-Comment.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The content text
  name: string
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Represents an XML comment; that is, text between &lt;!-- ... --&gt;
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: START
  value: "\"<!--\""
- !ruby/object:RI::Constant 
  comment: 
  name: STOP
  value: "\"-->\""
full_name: REXML::Comment
includes: 
- !ruby/object:RI::IncludedModule 
  name: Comparable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: clone
- !ruby/object:RI::MethodSummary 
  name: node_type
- !ruby/object:RI::MethodSummary 
  name: write
name: Comment
superclass: Child
PK6}[�˽���,ri/1.8/system/REXML/Comment/node_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Comment#node_type
is_singleton: false
name: node_type
params: ()
visibility: public
PK6}[�8�O��(ri/1.8/system/REXML/Comment/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: DEPRECATED
- !ruby/struct:SM::Flow::P 
  body: See REXML::Formatters
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "output:"
    body: Where to write the string
  - !ruby/struct:SM::Flow::LI 
    label: "indent:"
    body: An integer. If -1, no indenting will be used; otherwise, the indentation will be this number of spaces, and children will be indented an additional amount.
  - !ruby/struct:SM::Flow::LI 
    label: "transitive:"
    body: Ignored by this class. The contents of comments are never modified.
  - !ruby/struct:SM::Flow::LI 
    label: "ie_hack:"
    body: Needed for conformity to the child API, but not used by this class.
  type: :NOTE
full_name: REXML::Comment#write
is_singleton: false
name: write
params: ( output, indent=-1, transitive=false, ie_hack=false )
visibility: public
PK6}[�'kR++)ri/1.8/system/REXML/Comment/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compares this Comment to another; the contents of the comment are used in the comparison.
full_name: REXML::Comment#==
is_singleton: false
name: ==
params: ( other )
visibility: public
PK6}[�2��(ri/1.8/system/REXML/Comment/clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Comment#clone
is_singleton: false
name: clone
params: ()
visibility: public
PK6}[P����7ri/1.8/system/REXML/Validation/Optional/expected-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Optional#expected
is_singleton: false
name: expected
params: ()
visibility: public
PK6}['��ɾ�3ri/1.8/system/REXML/Validation/Optional/next-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Optional#next
is_singleton: false
name: next
params: ( event )
visibility: public
PK6}[wKQ���9ri/1.8/system/REXML/Validation/Optional/matches%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Optional#matches?
is_singleton: false
name: matches?
params: (event)
visibility: public
PK6}[��aa;ri/1.8/system/REXML/Validation/Optional/cdesc-Optional.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: REXML::Validation::Optional
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: expected
- !ruby/object:RI::MethodSummary 
  name: matches?
- !ruby/object:RI::MethodSummary 
  name: next
name: Optional
superclass: State
PK6}[=`����9ri/1.8/system/REXML/Validation/Sequence/matches%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Sequence#matches?
is_singleton: false
name: matches?
params: (event)
visibility: public
PK6}[Y�|6��;ri/1.8/system/REXML/Validation/Sequence/cdesc-Sequence.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: REXML::Validation::Sequence
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: matches?
name: Sequence
superclass: State
PK6}[ț/H��5ri/1.8/system/REXML/Validation/Choice/expected-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Choice#expected
is_singleton: false
name: expected
params: ()
visibility: public
PK6}[����1ri/1.8/system/REXML/Validation/Choice/next-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Choice#next
is_singleton: false
name: next
params: ( event )
visibility: public
PK6}[h/dUU7ri/1.8/system/REXML/Validation/Choice/cdesc-Choice.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: REXML::Validation::Choice
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: add_event_to_arry
- !ruby/object:RI::MethodSummary 
  name: expected
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: matches?
- !ruby/object:RI::MethodSummary 
  name: next
- !ruby/object:RI::MethodSummary 
  name: reset
name: Choice
superclass: State
PK6}[J<����4ri/1.8/system/REXML/Validation/Choice/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Choice#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK6}[qy����0ri/1.8/system/REXML/Validation/Choice/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Choice::new
is_singleton: true
name: new
params: (context)
visibility: public
PK6}[���o��3ri/1.8/system/REXML/Validation/Choice/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Choice#<<
is_singleton: false
name: "<<"
params: ( event )
visibility: public
PK6}[������7ri/1.8/system/REXML/Validation/Choice/matches%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Choice#matches?
is_singleton: false
name: matches?
params: ( event )
visibility: public
PK6}[H:`ѷ�2ri/1.8/system/REXML/Validation/Choice/reset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Choice#reset
is_singleton: false
name: reset
params: ()
visibility: public
PK6}[�����>ri/1.8/system/REXML/Validation/Choice/add_event_to_arry-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Choice#add_event_to_arry
is_singleton: false
name: add_event_to_arry
params: ( arry, evt )
visibility: protected
PK6}[�v�7��4ri/1.8/system/REXML/Validation/State/expected-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::State#expected
is_singleton: false
name: expected
params: ()
visibility: public
PK6}[�.B���7ri/1.8/system/REXML/Validation/State/previous%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::State#previous=
is_singleton: false
name: previous=
params: ( previous )
visibility: public
PK6}[�HW��0ri/1.8/system/REXML/Validation/State/next-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::State#next
is_singleton: false
name: next
params: ( event )
visibility: public
PK7}[ �k���9ri/1.8/system/REXML/Validation/State/expand_ref_in-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::State#expand_ref_in
is_singleton: false
name: expand_ref_in
params: ( arry, ind )
visibility: protected
PK7}[m�_��3ri/1.8/system/REXML/Validation/State/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::State#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK7}[a�s��5ri/1.8/system/REXML/Validation/State/cdesc-State.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: REXML::Validation::State
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: add_event_to_arry
- !ruby/object:RI::MethodSummary 
  name: expand_ref_in
- !ruby/object:RI::MethodSummary 
  name: expected
- !ruby/object:RI::MethodSummary 
  name: generate_event
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: next
- !ruby/object:RI::MethodSummary 
  name: previous=
- !ruby/object:RI::MethodSummary 
  name: reset
- !ruby/object:RI::MethodSummary 
  name: to_s
name: State
superclass: Object
PK7}[�0���/ri/1.8/system/REXML/Validation/State/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::State::new
is_singleton: true
name: new
params: ( context )
visibility: public
PK7}[Xף���2ri/1.8/system/REXML/Validation/State/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::State#<<
is_singleton: false
name: "<<"
params: ( event )
visibility: public
PK7}[��Z���0ri/1.8/system/REXML/Validation/State/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::State#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK7}[�϶�1ri/1.8/system/REXML/Validation/State/reset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::State#reset
is_singleton: false
name: reset
params: ()
visibility: public
PK7}[�r�f��:ri/1.8/system/REXML/Validation/State/generate_event-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::State#generate_event
is_singleton: false
name: generate_event
params: ( event )
visibility: protected
PK7}[5�$+��=ri/1.8/system/REXML/Validation/State/add_event_to_arry-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::State#add_event_to_arry
is_singleton: false
name: add_event_to_arry
params: ( arry, evt )
visibility: protected
PK7}[�C`���4ri/1.8/system/REXML/Validation/cdesc-Validation.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: REXML::Validation
includes: []

instance_methods: []

name: Validation
superclass: 
PK7}[�gN��1ri/1.8/system/REXML/Validation/RelaxNG/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "FIXME: Namespaces"
full_name: REXML::Validation::RelaxNG::new
is_singleton: true
name: new
params: (source)
visibility: public
PK7}[N�K_.
.
9ri/1.8/system/REXML/Validation/RelaxNG/cdesc-RelaxNG.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: count
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: current
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: references
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Implemented:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: empty
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: element
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: attribute
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: text
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: optional
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: choice
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: oneOrMore
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: zeroOrMore
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: group
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: value
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: interleave
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: mixed
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: ref
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: grammar
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: start
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: define
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "Not implemented:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: data
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: param
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: include
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: externalRef
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: notAllowed
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: anyName
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: nsName
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: except
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: name
  type: :BULLET
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: INFINITY
  value: 1.0 / 0.0
- !ruby/object:RI::Constant 
  comment: 
  name: EMPTY
  value: Event.new( nil )
- !ruby/object:RI::Constant 
  comment: 
  name: TEXT
  value: "[:start_element, \"text\"]"
full_name: REXML::Validation::RelaxNG
includes: 
- !ruby/object:RI::IncludedModule 
  name: Validator
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: receive
name: RelaxNG
superclass: Object
PK7}[b�����5ri/1.8/system/REXML/Validation/RelaxNG/receive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::RelaxNG#receive
is_singleton: false
name: receive
params: (event)
visibility: public
PK7}[�׀^��=ri/1.8/system/REXML/Validation/Validator/cdesc-Validator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: NILEVENT
  value: "[ nil ]"
full_name: REXML::Validation::Validator
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: dump
- !ruby/object:RI::MethodSummary 
  name: reset
- !ruby/object:RI::MethodSummary 
  name: validate
name: Validator
superclass: 
PK7}[FGb���8ri/1.8/system/REXML/Validation/Validator/validate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Validator#validate
is_singleton: false
name: validate
params: ( event )
visibility: public
PK7}[gΥ/��4ri/1.8/system/REXML/Validation/Validator/dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Validator#dump
is_singleton: false
name: dump
params: ()
visibility: public
PK7}[��Hx��5ri/1.8/system/REXML/Validation/Validator/reset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Validator#reset
is_singleton: false
name: reset
params: ()
visibility: public
PK7}[}����9ri/1.8/system/REXML/Validation/Interleave/expected-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Interleave#expected
is_singleton: false
name: expected
params: ()
visibility: public
PK7}[�.��=ri/1.8/system/REXML/Validation/Interleave/next_current-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Interleave#next_current
is_singleton: false
name: next_current
params: ( event )
visibility: public
PK7}[aKH��5ri/1.8/system/REXML/Validation/Interleave/next-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Interleave#next
is_singleton: false
name: next
params: ( event )
visibility: public
PK7}[���**?ri/1.8/system/REXML/Validation/Interleave/cdesc-Interleave.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: REXML::Validation::Interleave
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: expected
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: matches?
- !ruby/object:RI::MethodSummary 
  name: next
- !ruby/object:RI::MethodSummary 
  name: next_current
- !ruby/object:RI::MethodSummary 
  name: reset
name: Interleave
superclass: Choice
PK7}[��Jӿ�8ri/1.8/system/REXML/Validation/Interleave/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Interleave#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK7}[�G?X��4ri/1.8/system/REXML/Validation/Interleave/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Interleave::new
is_singleton: true
name: new
params: (context)
visibility: public
PK7}[>�,��;ri/1.8/system/REXML/Validation/Interleave/matches%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Interleave#matches?
is_singleton: false
name: matches?
params: ( event )
visibility: public
PK7}[����6ri/1.8/system/REXML/Validation/Interleave/reset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Interleave#reset
is_singleton: false
name: reset
params: ()
visibility: public
PK7}[u���1ri/1.8/system/REXML/Validation/Ref/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Ref#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK7}[�����-ri/1.8/system/REXML/Validation/Ref/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Ref::new
is_singleton: true
name: new
params: (value)
visibility: public
PK7}[��ۑ��.ri/1.8/system/REXML/Validation/Ref/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Ref#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK7}[��v�OO1ri/1.8/system/REXML/Validation/Ref/cdesc-Ref.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: REXML::Validation::Ref
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Ref
superclass: Object
PK8}[��J��9ri/1.8/system/REXML/Validation/ZeroOrMore/expected-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::ZeroOrMore#expected
is_singleton: false
name: expected
params: ()
visibility: public
PK8}[�Wl���5ri/1.8/system/REXML/Validation/ZeroOrMore/next-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::ZeroOrMore#next
is_singleton: false
name: next
params: ( event )
visibility: public
PK8}[>{JM55?ri/1.8/system/REXML/Validation/ZeroOrMore/cdesc-ZeroOrMore.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: REXML::Validation::ZeroOrMore
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: expected
- !ruby/object:RI::MethodSummary 
  name: next
name: ZeroOrMore
superclass: Optional
PK8}[�|���=ri/1.8/system/REXML/Validation/ValidationException/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::ValidationException::new
is_singleton: true
name: new
params: (msg)
visibility: public
PK8}[���Qri/1.8/system/REXML/Validation/ValidationException/cdesc-ValidationException.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: REXML::Validation::ValidationException
includes: []

instance_methods: []

name: ValidationException
superclass: RuntimeError
PK8}[E^��8ri/1.8/system/REXML/Validation/OneOrMore/expected-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::OneOrMore#expected
is_singleton: false
name: expected
params: ()
visibility: public
PK8}[���(��=ri/1.8/system/REXML/Validation/OneOrMore/cdesc-OneOrMore.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: REXML::Validation::OneOrMore
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: expected
- !ruby/object:RI::MethodSummary 
  name: matches?
- !ruby/object:RI::MethodSummary 
  name: next
- !ruby/object:RI::MethodSummary 
  name: reset
name: OneOrMore
superclass: State
PK8}[]��п�4ri/1.8/system/REXML/Validation/OneOrMore/next-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::OneOrMore#next
is_singleton: false
name: next
params: ( event )
visibility: public
PK8}[h,���3ri/1.8/system/REXML/Validation/OneOrMore/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::OneOrMore::new
is_singleton: true
name: new
params: (context)
visibility: public
PK8}[�7����:ri/1.8/system/REXML/Validation/OneOrMore/matches%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::OneOrMore#matches?
is_singleton: false
name: matches?
params: ( event )
visibility: public
PK8}[���X��5ri/1.8/system/REXML/Validation/OneOrMore/reset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::OneOrMore#reset
is_singleton: false
name: reset
params: ()
visibility: public
PK8}[�b�Ⱥ�3ri/1.8/system/REXML/Validation/Event/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Event#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK8}[$n���5ri/1.8/system/REXML/Validation/Event/single%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Event#single?
is_singleton: false
name: single?
params: ()
visibility: public
PK8}[�>���/ri/1.8/system/REXML/Validation/Event/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Event::new
is_singleton: true
name: new
params: (event_type, event_arg=nil )
visibility: public
PK8}[8�U��3ri/1.8/system/REXML/Validation/Event/done%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Event#done?
is_singleton: false
name: done?
params: ()
visibility: public
PK8}[
�����6ri/1.8/system/REXML/Validation/Event/matches%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Event#matches?
is_singleton: false
name: matches?
params: ( event )
visibility: public
PK8}[�S�ל�5ri/1.8/system/REXML/Validation/Event/cdesc-Event.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: event_arg
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: event_type
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: REXML::Validation::Event
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: done?
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: matches?
- !ruby/object:RI::MethodSummary 
  name: single?
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Event
superclass: Object
PK8}[��*��0ri/1.8/system/REXML/Validation/Event/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Event#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK8}[-=j��2ri/1.8/system/REXML/Validation/Event/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Validation::Event#==
is_singleton: false
name: ==
params: ( other )
visibility: public
PK8}[AAn ��)ri/1.8/system/REXML/Child/document-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: the document this child belongs to, or nil if this child
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: belongs to no document
full_name: REXML::Child#document
is_singleton: false
name: document
params: ()
visibility: public
PK8}[T	Q��*ri/1.8/system/REXML/Child/parent%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the parent of this child to the supplied argument.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "other:"
    body: Must be a Parent object. If this object is the same object as the existing parent of this child, no action is taken. Otherwise, this child is removed from the current parent (if one exists), and is added to the new parent.
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: The parent added
  type: :NOTE
full_name: REXML::Child#parent=
is_singleton: false
name: parent=
params: ( other )
visibility: public
PK8}[�Q���-ri/1.8/system/REXML/Child/replace_with-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Replaces this object with another object. Basically, calls Parent.replace_child
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: self
  type: :NOTE
full_name: REXML::Child#replace_with
is_singleton: false
name: replace_with
params: ( child )
visibility: public
PK8}[Ct]rr'ri/1.8/system/REXML/Child/remove-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes this child from the parent.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: self
  type: :NOTE
full_name: REXML::Child#remove
is_singleton: false
name: remove
params: ()
visibility: public
PK8}[��M�$ri/1.8/system/REXML/Child/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Constructor. Any inheritors of this class should call super to make sure this method is called.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "parent:"
    body: if supplied, the parent of this child will be set to the supplied value, and self will be added to the parent
  type: :NOTE
full_name: REXML::Child::new
is_singleton: true
name: new
params: ( parent = nil )
visibility: public
PK9}[�Hw�{{*ri/1.8/system/REXML/Child/cdesc-Child.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: parent
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A Child object is something contained by a parent, and this class contains methods to support that. Most user code will not use this class directly.
constants: []

full_name: REXML::Child
includes: 
- !ruby/object:RI::IncludedModule 
  name: Node
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: bytes
- !ruby/object:RI::MethodSummary 
  name: document
- !ruby/object:RI::MethodSummary 
  name: next_sibling=
- !ruby/object:RI::MethodSummary 
  name: parent=
- !ruby/object:RI::MethodSummary 
  name: previous_sibling=
- !ruby/object:RI::MethodSummary 
  name: remove
- !ruby/object:RI::MethodSummary 
  name: replace_with
name: Child
superclass: Object
PK9}[d�'**4ri/1.8/system/REXML/Child/previous_sibling%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the previous sibling of this child. This can be used to insert a child before some other child.
- !ruby/struct:SM::Flow::VERB 
  body: " a = Element.new(&quot;a&quot;)\n b = a.add_element(&quot;b&quot;)\n c = Element.new(&quot;c&quot;)\n b.previous_sibling = c\n # =&gt; &lt;a&gt;&lt;b/&gt;&lt;c/&gt;&lt;/a&gt;\n"
full_name: REXML::Child#previous_sibling=
is_singleton: false
name: previous_sibling=
params: (other)
visibility: public
PK9}[梊�0ri/1.8/system/REXML/Child/next_sibling%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the next sibling of this child. This can be used to insert a child after some other child.
- !ruby/struct:SM::Flow::VERB 
  body: " a = Element.new(&quot;a&quot;)\n b = a.add_element(&quot;b&quot;)\n c = Element.new(&quot;c&quot;)\n b.next_sibling = c\n # =&gt; &lt;a&gt;&lt;b/&gt;&lt;c/&gt;&lt;/a&gt;\n"
full_name: REXML::Child#next_sibling=
is_singleton: false
name: next_sibling=
params: ( other )
visibility: public
PK9}[��8���&ri/1.8/system/REXML/Child/bytes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: This doesn't yet handle encodings
full_name: REXML::Child#bytes
is_singleton: false
name: bytes
params: ()
visibility: public
PK9}[��_YY4ri/1.8/system/REXML/SourceFactory/create_from-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generates a Source object @param arg Either a String, or an IO @return a Source, or nil if a bad argument was given
full_name: REXML::SourceFactory::create_from
is_singleton: true
name: create_from
params: (arg)
visibility: public
PK9}[q�II:ri/1.8/system/REXML/SourceFactory/cdesc-SourceFactory.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: create_from
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generates Source-s. USE THIS CLASS.
constants: []

full_name: REXML::SourceFactory
includes: []

instance_methods: []

name: SourceFactory
superclass: Object
PK9}[�z���.ri/1.8/system/REXML/XPathParser/compare-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XPathParser#compare
is_singleton: false
name: compare
params: (a, op, b)
visibility: private
PK9}[-��\��8ri/1.8/system/REXML/XPathParser/preceding_node_of-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XPathParser#preceding_node_of
is_singleton: false
name: preceding_node_of
params: ( node )
visibility: private
PK9}[.=A��Bri/1.8/system/REXML/XPathParser/equality_relational_compare-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XPathParser#equality_relational_compare
is_singleton: false
name: equality_relational_compare
params: ( set1, op, set2 )
visibility: private
PK:}[�i�$��0ri/1.8/system/REXML/XPathParser/predicate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XPathParser#predicate
is_singleton: false
name: predicate
params: (path, nodeset)
visibility: public
PK:}[��샽�,ri/1.8/system/REXML/XPathParser/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XPathParser#parse
is_singleton: false
name: parse
params: (path, nodeset)
visibility: public
PK:}[%Lr��9ri/1.8/system/REXML/XPathParser/descendant_or_self-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "FIXME The next two methods are BAD MOJO! This is my achilles heel. If anybody thinks of a better way of doing this, be my guest. This really sucks, but it is a wonder it works at all. ########################################################"
full_name: REXML::XPathParser#descendant_or_self
is_singleton: false
name: descendant_or_self
params: ( path_stack, nodeset )
visibility: private
PK:}[W�!���8ri/1.8/system/REXML/XPathParser/following_node_of-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XPathParser#following_node_of
is_singleton: false
name: following_node_of
params: ( node )
visibility: private
PK:}[Ƽ�p��,ri/1.8/system/REXML/XPathParser/match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XPathParser#match
is_singleton: false
name: match
params: ( path_stack, nodeset )
visibility: public
PK:}[|�T660ri/1.8/system/REXML/XPathParser/preceding-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Builds a nodeset of all of the preceding nodes of the supplied node, in reverse document order
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "preceding:"
    body: includes every element in the document that precedes this node,
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: except for ancestors
full_name: REXML::XPathParser#preceding
is_singleton: false
name: preceding
params: ( node )
visibility: private
PK:}[/��]��*ri/1.8/system/REXML/XPathParser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XPathParser::new
is_singleton: true
name: new
params: ( )
visibility: public
PK:}[��/��0ri/1.8/system/REXML/XPathParser/following-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XPathParser#following
is_singleton: false
name: following
params: ( node )
visibility: private
PK:}[V٨3��,ri/1.8/system/REXML/XPathParser/first-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Performs a depth-first (document order) XPath search, and returns the first match. This is the fastest, lightest way to return a single result.
- !ruby/struct:SM::Flow::P 
  body: "FIXME: This method is incomplete!"
full_name: REXML::XPathParser#first
is_singleton: false
name: first
params: ( path_stack, node )
visibility: public
PK:}[�dD#��+ri/1.8/system/REXML/XPathParser/norm-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XPathParser#norm
is_singleton: false
name: norm
params: (b)
visibility: private
PK:}[LP"���.ri/1.8/system/REXML/XPathParser/recurse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: node
comment: 
full_name: REXML::XPathParser#recurse
is_singleton: false
name: recurse
params: ( nodeset, &block ) {|node| ...}
visibility: private
PK:}[_��4ri/1.8/system/REXML/XPathParser/namespaces%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XPathParser#namespaces=
is_singleton: false
name: namespaces=
params: ( namespaces={} )
visibility: public
PK:}[���O��5ri/1.8/system/REXML/XPathParser/document_order-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reorders an array of nodes so that they are in document order It tries to do this efficiently.
- !ruby/struct:SM::Flow::P 
  body: "FIXME: I need to get rid of this, but the issue is that most of the XPath interpreter functions as a filter, which means that we lose context going in and out of function calls. If I knew what the index of the nodes was, I wouldn't have to do this. Maybe add a document IDX for each node? Problems with mutable documents. Or, rewrite everything."
full_name: REXML::XPathParser#document_order
is_singleton: false
name: document_order
params: ( array_of_nodes )
visibility: private
PK:}[����,ri/1.8/system/REXML/XPathParser/d_o_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XPathParser#d_o_s
is_singleton: false
name: d_o_s
params: ( p, ns, r )
visibility: private
PK:}[������+ri/1.8/system/REXML/XPathParser/expr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XPathParser#expr
is_singleton: false
name: expr
params: ( path_stack, nodeset, context=nil )
visibility: private
PK:}[��0��6ri/1.8/system/REXML/XPathParser/cdesc-XPathParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: You don't want to use this class. Really. Use XPath, which is a wrapper for this class. Believe me. You don't want to poke around in here. There is strange, dark magic at work in this code. Beware. Go back! Go back while you still can!
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: LITERAL
  value: /^'([^']*)'|^"([^"]*)"/u
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Expr takes a stack of path elements and a set of nodes (either a Parent or an Array and returns an Array of matching nodes
  name: ALL
  value: "[ :attribute, :element, :text, :processing_instruction, :comment ]"
- !ruby/object:RI::Constant 
  comment: 
  name: ELEMENTS
  value: "[ :element ]"
full_name: REXML::XPathParser
includes: 
- !ruby/object:RI::IncludedModule 
  name: XMLTokens
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: compare
- !ruby/object:RI::MethodSummary 
  name: d_o_s
- !ruby/object:RI::MethodSummary 
  name: descendant_or_self
- !ruby/object:RI::MethodSummary 
  name: document_order
- !ruby/object:RI::MethodSummary 
  name: equality_relational_compare
- !ruby/object:RI::MethodSummary 
  name: expr
- !ruby/object:RI::MethodSummary 
  name: first
- !ruby/object:RI::MethodSummary 
  name: following
- !ruby/object:RI::MethodSummary 
  name: following_node_of
- !ruby/object:RI::MethodSummary 
  name: get_first
- !ruby/object:RI::MethodSummary 
  name: get_namespace
- !ruby/object:RI::MethodSummary 
  name: match
- !ruby/object:RI::MethodSummary 
  name: namespaces=
- !ruby/object:RI::MethodSummary 
  name: next_sibling_node
- !ruby/object:RI::MethodSummary 
  name: norm
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: preceding
- !ruby/object:RI::MethodSummary 
  name: preceding_node_of
- !ruby/object:RI::MethodSummary 
  name: predicate
- !ruby/object:RI::MethodSummary 
  name: recurse
- !ruby/object:RI::MethodSummary 
  name: variables=
name: XPathParser
superclass: Object
PK:}[����0ri/1.8/system/REXML/XPathParser/get_first-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XPathParser#get_first
is_singleton: false
name: get_first
params: (path, nodeset)
visibility: public
PK:}[�,���8ri/1.8/system/REXML/XPathParser/next_sibling_node-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XPathParser#next_sibling_node
is_singleton: false
name: next_sibling_node
params: (node)
visibility: private
PK;}[O�D���4ri/1.8/system/REXML/XPathParser/get_namespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns a String namespace for a node, given a prefix The rules are:"
- !ruby/struct:SM::Flow::VERB 
  body: " 1. Use the supplied namespace mapping first.\n 2. If no mapping was supplied, use the context node to look up the namespace\n"
full_name: REXML::XPathParser#get_namespace
is_singleton: false
name: get_namespace
params: ( node, prefix )
visibility: private
PK;}[��U5��3ri/1.8/system/REXML/XPathParser/variables%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XPathParser#variables=
is_singleton: false
name: variables=
params: ( vars={} )
visibility: public
PK;}[ƒ[���0ri/1.8/system/REXML/XPathParser/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XPathParser#[]=
is_singleton: false
name: "[]="
params: ( variable_name, value )
visibility: public
PK;}[�I�996ri/1.8/system/REXML/entity_expansion_text_limit-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the entity expansion limit. By default the limit is set to 10240.
full_name: REXML::entity_expansion_text_limit
is_singleton: true
name: entity_expansion_text_limit
params: ()
visibility: public
PK;}[�T�311$ri/1.8/system/REXML/CData/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::VERB 
  body: "    Constructor.  CData is data between &lt;![CDATA[ ... ]]&gt;\n"
- !ruby/struct:SM::Flow::P 
  body: <em>Examples</em>
- !ruby/struct:SM::Flow::VERB 
  body: " CData.new( source )\n CData.new( &quot;Here is some CDATA&quot; )\n CData.new( &quot;Some unprocessed data&quot;, respect_whitespace_TF, parent_element )\n"
full_name: REXML::CData::new
is_singleton: true
name: new
params: ( first, whitespace=true, parent=nil )
visibility: public
PK;}[|�Qe��*ri/1.8/system/REXML/CData/cdesc-CData.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: START
  value: "'<![CDATA['"
- !ruby/object:RI::Constant 
  comment: 
  name: STOP
  value: "']]>'"
- !ruby/object:RI::Constant 
  comment: 
  name: ILLEGAL
  value: /(\]\]>)/
full_name: REXML::CData
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: clone
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: value
- !ruby/object:RI::MethodSummary 
  name: write
name: CData
superclass: Text
PK;}[��[&ri/1.8/system/REXML/CData/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: DEPRECATED
- !ruby/struct:SM::Flow::P 
  body: See the rexml/formatters package
- !ruby/struct:SM::Flow::P 
  body: Generates XML output of this object
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "output:"
    body: Where to write the string. Defaults to $stdout
  - !ruby/struct:SM::Flow::LI 
    label: "indent:"
    body: The amount to indent this node by
  - !ruby/struct:SM::Flow::LI 
    label: "transitive:"
    body: Ignored
  - !ruby/struct:SM::Flow::LI 
    label: "ie_hack:"
    body: Ignored
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: <em>Examples</em>
- !ruby/struct:SM::Flow::VERB 
  body: " c = CData.new( &quot; Some text &quot; )\n c.write( $stdout )     #-&gt;  &lt;![CDATA[ Some text ]]&gt;\n"
full_name: REXML::CData#write
is_singleton: false
name: write
params: ( output=$stdout, indent=-1, transitive=false, ie_hack=false )
visibility: public
PK;}[wz�l��%ri/1.8/system/REXML/CData/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the content of this CData object
- !ruby/struct:SM::Flow::P 
  body: <em>Examples</em>
- !ruby/struct:SM::Flow::VERB 
  body: " c = CData.new( &quot;Some text&quot; )\n c.to_s        # -&gt; &quot;Some text&quot;\n"
full_name: REXML::CData#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK;}[>Z\��&ri/1.8/system/REXML/CData/clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Make a copy of this object
- !ruby/struct:SM::Flow::P 
  body: <em>Examples</em>
- !ruby/struct:SM::Flow::VERB 
  body: " c = CData.new( &quot;Some text&quot; )\n d = c.clone\n d.to_s        # -&gt; &quot;Some text&quot;\n"
full_name: REXML::CData#clone
is_singleton: false
name: clone
params: ()
visibility: public
PK;}[��A��&ri/1.8/system/REXML/CData/value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::CData#value
is_singleton: false
name: value
params: ()
visibility: public
PK;}[��z���1ri/1.8/system/REXML/ParseException/context-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::ParseException#context
is_singleton: false
name: context
params: ()
visibility: public
PK;}[	����.ri/1.8/system/REXML/ParseException/line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::ParseException#line
is_singleton: false
name: line
params: ()
visibility: public
PK;}[IJ���2ri/1.8/system/REXML/ParseException/position-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::ParseException#position
is_singleton: false
name: position
params: ()
visibility: public
PK;}[�8���-ri/1.8/system/REXML/ParseException/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::ParseException::new
is_singleton: true
name: new
params: ( message, source=nil, parser=nil, exception=nil )
visibility: public
PK;}[��u��.ri/1.8/system/REXML/ParseException/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::ParseException#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK;}[A��T��<ri/1.8/system/REXML/ParseException/cdesc-ParseException.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: continued_exception
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: parser
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: source
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: REXML::ParseException
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: context
- !ruby/object:RI::MethodSummary 
  name: line
- !ruby/object:RI::MethodSummary 
  name: position
- !ruby/object:RI::MethodSummary 
  name: to_s
name: ParseException
superclass: RuntimeError
PK;}[�A���&ri/1.8/system/REXML/DTD/cdesc-DTD.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: REXML::DTD
includes: []

instance_methods: []

name: DTD
superclass: 
PK;}[6W=�vv:ri/1.8/system/REXML/DTD/ElementDecl/cdesc-ElementDecl.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: START
  value: "\"<!ELEMENT\""
- !ruby/object:RI::Constant 
  comment: 
  name: START_RE
  value: /^\s*#{START}/um
- !ruby/object:RI::Constant 
  comment: 
  name: PATTERN_RE
  value: /^\s*(#{START}.*?)>/um
- !ruby/object:RI::Constant 
  comment: 
  name: PATTERN_RE
  value: /^\s*#{START}\s+((?:[:\w_][-\.\w_]*:)?[-!\*\.\w_]*)(.*?)>/
full_name: REXML::DTD::ElementDecl
includes: []

instance_methods: []

name: ElementDecl
superclass: Child
PK;}[��H�.ri/1.8/system/REXML/DTD/ElementDecl/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: \s*(((([&quot;']).*?\5)|[^\/'&quot;&gt;]*)*?)(\/)?&gt;/um, true)
full_name: REXML::DTD::ElementDecl::new
is_singleton: true
name: new
params: (match)
visibility: public
PK;}[G���6ri/1.8/system/REXML/DTD/EntityDecl/parse_source-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::DTD::EntityDecl::parse_source
is_singleton: true
name: parse_source
params: (source, listener)
visibility: public
PK;}[�"��**-ri/1.8/system/REXML/DTD/EntityDecl/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "&lt;!ENTITY name SYSTEM &quot;...&quot;&gt; &lt;!ENTITY name &quot;...&quot;&gt;"
full_name: REXML::DTD::EntityDecl::new
is_singleton: true
name: new
params: (src)
visibility: public
PK;}[�t��/ri/1.8/system/REXML/DTD/EntityDecl/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::DTD::EntityDecl#write
is_singleton: false
name: write
params: ( output, indent )
visibility: public
PK;}[-�S5��.ri/1.8/system/REXML/DTD/EntityDecl/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::DTD::EntityDecl#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK;}[+�--8ri/1.8/system/REXML/DTD/EntityDecl/cdesc-EntityDecl.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: parse_source
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: START
  value: "\"<!ENTITY\""
- !ruby/object:RI::Constant 
  comment: 
  name: START_RE
  value: /^\s*#{START}/um
- !ruby/object:RI::Constant 
  comment: 
  name: PUBLIC
  value: /^\s*#{START}\s+(?:%\s+)?(\w+)\s+PUBLIC\s+((["']).*?\3)\s+((["']).*?\5)\s*>/um
- !ruby/object:RI::Constant 
  comment: 
  name: SYSTEM
  value: /^\s*#{START}\s+(?:%\s+)?(\w+)\s+SYSTEM\s+((["']).*?\3)(?:\s+NDATA\s+\w+)?\s*>/um
- !ruby/object:RI::Constant 
  comment: 
  name: PLAIN
  value: /^\s*#{START}\s+(\w+)\s+((["']).*?\3)\s*>/um
- !ruby/object:RI::Constant 
  comment: 
  name: PERCENT
  value: /^\s*#{START}\s+%\s+(\w+)\s+((["']).*?\3)\s*>/um
full_name: REXML::DTD::EntityDecl
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: write
name: EntityDecl
superclass: Child
PK;}[��A���:ri/1.8/system/REXML/DTD/AttlistDecl/cdesc-AttlistDecl.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: START
  value: "\"<!ATTLIST\""
- !ruby/object:RI::Constant 
  comment: 
  name: START_RE
  value: /^\s*#{START}/um
- !ruby/object:RI::Constant 
  comment: 
  name: PATTERN_RE
  value: /\s*(#{START}.*?>)/um
full_name: REXML::DTD::AttlistDecl
includes: []

instance_methods: []

name: AttlistDecl
superclass: Child
PK;}[Z|lm,,<ri/1.8/system/REXML/DTD/NotationDecl/cdesc-NotationDecl.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: parse_source
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: START
  value: "\"<!NOTATION\""
- !ruby/object:RI::Constant 
  comment: 
  name: START_RE
  value: /^\s*#{START}/um
- !ruby/object:RI::Constant 
  comment: 
  name: PUBLIC
  value: /^\s*#{START}\s+(\w[\w-]*)\s+(PUBLIC)\s+((["']).*?\4)\s*>/um
- !ruby/object:RI::Constant 
  comment: 
  name: SYSTEM
  value: /^\s*#{START}\s+(\w[\w-]*)\s+(SYSTEM)\s+((["']).*?\4)\s*>/um
full_name: REXML::DTD::NotationDecl
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: write
name: NotationDecl
superclass: Child
PK;}[�yo_��8ri/1.8/system/REXML/DTD/NotationDecl/parse_source-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::DTD::NotationDecl::parse_source
is_singleton: true
name: parse_source
params: (source, listener)
visibility: public
PK;}[���m��/ri/1.8/system/REXML/DTD/NotationDecl/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::DTD::NotationDecl::new
is_singleton: true
name: new
params: (src)
visibility: public
PK;}[�X��1ri/1.8/system/REXML/DTD/NotationDecl/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::DTD::NotationDecl#write
is_singleton: false
name: write
params: ( output, indent )
visibility: public
PK;}[.g!���0ri/1.8/system/REXML/DTD/NotationDecl/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::DTD::NotationDecl#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK;}[J�����+ri/1.8/system/REXML/DTD/Parser/parse-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::DTD::Parser::parse
is_singleton: true
name: parse
params: ( input )
visibility: public
PK;}[�v�))0ri/1.8/system/REXML/DTD/Parser/cdesc-Parser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: parse_helper
comment: 
constants: []

full_name: REXML::DTD::Parser
includes: []

instance_methods: []

name: Parser
superclass: Object
PK;}[C�H�

2ri/1.8/system/REXML/DTD/Parser/parse_helper-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Takes a String and parses it out
full_name: REXML::DTD::Parser::parse_helper
is_singleton: true
name: parse_helper
params: ( input )
visibility: public
PK;}[�M3���6ri/1.8/system/REXML/ElementDecl/cdesc-ElementDecl.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: REXML::ElementDecl
includes: []

instance_methods: []

name: ElementDecl
superclass: Declaration
PK;}[kR���*ri/1.8/system/REXML/ElementDecl/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::ElementDecl::new
is_singleton: true
name: new
params: ( src )
visibility: public
PK;}[�ʱ��0ri/1.8/system/REXML/IOSource/cdesc-IOSource.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A Source that wraps an IO. See the Source class for method documentation
constants: []

full_name: REXML::IOSource
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: consume
- !ruby/object:RI::MethodSummary 
  name: current_line
- !ruby/object:RI::MethodSummary 
  name: empty?
- !ruby/object:RI::MethodSummary 
  name: match
- !ruby/object:RI::MethodSummary 
  name: position
- !ruby/object:RI::MethodSummary 
  name: read
- !ruby/object:RI::MethodSummary 
  name: scan
name: IOSource
superclass: Source
PK;}[��o���,ri/1.8/system/REXML/IOSource/empty%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::IOSource#empty?
is_singleton: false
name: empty?
params: ()
visibility: public
PK;}[�E�0ri/1.8/system/REXML/IOSource/current_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "@return the current line in the source"
full_name: REXML::IOSource#current_line
is_singleton: false
name: current_line
params: ()
visibility: public
PK;}[|H��(ri/1.8/system/REXML/IOSource/read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::IOSource#read
is_singleton: false
name: read
params: ()
visibility: public
PK;}[��C���,ri/1.8/system/REXML/IOSource/position-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::IOSource#position
is_singleton: false
name: position
params: ()
visibility: public
PK;}[�Wq��+ri/1.8/system/REXML/IOSource/consume-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::IOSource#consume
is_singleton: false
name: consume
params: ( pattern )
visibility: public
PK;}[�T���)ri/1.8/system/REXML/IOSource/match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::IOSource#match
is_singleton: false
name: match
params: ( pattern, cons=false )
visibility: public
PK;}[�>ɞ��(ri/1.8/system/REXML/IOSource/scan-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::IOSource#scan
is_singleton: false
name: scan
params: (pattern, cons=false)
visibility: public
PK;}[�P|H

'ri/1.8/system/REXML/IOSource/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: block_size has been deprecated
full_name: REXML::IOSource::new
is_singleton: true
name: new
params: (arg, block_size=500, encoding=nil)
visibility: public
PK;}["F
*��2ri/1.8/system/REXML/Attribute/cdesc-Attribute.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The element to which this attribute belongs
  name: element
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The normalized value of this attribute. That is, the attribute with entities intact.
  name: normalized
  rw: W
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Defines an Element Attribute; IE, a attribute=value pair, as in: &lt;element attribute=&quot;value&quot;/&gt;. Attributes can be in their own namespaces. General users of REXML will not interact with the Attribute class much."
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: PATTERN
  value: /\s*(#{NAME_STR})\s*=\s*(["'])(.*?)\2/um
full_name: REXML::Attribute
includes: 
- !ruby/object:RI::IncludedModule 
  name: Node
- !ruby/object:RI::IncludedModule 
  name: Namespace
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: clone
- !ruby/object:RI::MethodSummary 
  name: element=
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: namespace
- !ruby/object:RI::MethodSummary 
  name: node_type
- !ruby/object:RI::MethodSummary 
  name: prefix
- !ruby/object:RI::MethodSummary 
  name: remove
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: to_string
- !ruby/object:RI::MethodSummary 
  name: value
- !ruby/object:RI::MethodSummary 
  name: write
- !ruby/object:RI::MethodSummary 
  name: xpath
name: Attribute
superclass: Object
PK;}[�m*���+ri/1.8/system/REXML/Attribute/prefix-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the namespace of the attribute.
- !ruby/struct:SM::Flow::VERB 
  body: " e = Element.new( &quot;elns:myelement&quot; )\n e.add_attribute( &quot;nsa:a&quot;, &quot;aval&quot; )\n e.add_attribute( &quot;b&quot;, &quot;bval&quot; )\n e.attributes.get_attribute( &quot;a&quot; ).prefix   # -&gt; &quot;nsa&quot;\n e.attributes.get_attribute( &quot;b&quot; ).prefix   # -&gt; &quot;elns&quot;\n a = Attribute.new( &quot;x&quot;, &quot;y&quot; )\n a.prefix                                   # -&gt; &quot;&quot;\n"
full_name: REXML::Attribute#prefix
is_singleton: false
name: prefix
params: ()
visibility: public
PK;}[���.ri/1.8/system/REXML/Attribute/namespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the namespace URL, if defined, or nil otherwise
- !ruby/struct:SM::Flow::VERB 
  body: " e = Element.new(&quot;el&quot;)\n e.add_attributes({&quot;xmlns:ns&quot;, &quot;http://url&quot;})\n e.namespace( &quot;ns&quot; )              # -&gt; &quot;http://url&quot;\n"
full_name: REXML::Attribute#namespace
is_singleton: false
name: namespace
params: (arg=nil)
visibility: public
PK;}[�/�

)ri/1.8/system/REXML/Attribute/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates (and returns) a hash from both the name and value
full_name: REXML::Attribute#hash
is_singleton: false
name: hash
params: ()
visibility: public
PK;}[�S6�zz/ri/1.8/system/REXML/Attribute/element%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the element of which this object is an attribute. Normally, this is not directly called.
- !ruby/struct:SM::Flow::P 
  body: Returns this attribute
full_name: REXML::Attribute#element=
is_singleton: false
name: element=
params: ( element )
visibility: public
PK;}[mG�jj+ri/1.8/system/REXML/Attribute/remove-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes this Attribute from the tree, and returns true if successfull
- !ruby/struct:SM::Flow::P 
  body: This method is usually not called directly.
full_name: REXML::Attribute#remove
is_singleton: false
name: remove
params: ()
visibility: public
PK;}[�\ಲ�,ri/1.8/system/REXML/Attribute/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Attribute#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK;}[����(ri/1.8/system/REXML/Attribute/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Constructor. FIXME: The parser doesn't catch illegal characters in attributes"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "first:"
    body: "Either: an Attribute, which this new attribute will become a clone of; or a String, which is the name of this attribute"
  - !ruby/struct:SM::Flow::LI 
    label: "second:"
    body: If <tt>first</tt> is an Attribute, then this may be an Element, or nil. If nil, then the Element parent of this attribute is the parent of the <tt>first</tt> Attribute. If the first argument is a String, then this must also be a String, and is the content of the attribute. If this is the content, it must be fully normalized (contain no illegal characters).
  - !ruby/struct:SM::Flow::LI 
    label: "parent:"
    body: Ignored unless <tt>first</tt> is a String; otherwise, may be the Element parent of this attribute, or nil.
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " Attribute.new( attribute_to_clone )\n Attribute.new( attribute_to_clone, parent_element )\n Attribute.new( &quot;attr&quot;, &quot;attr_value&quot; )\n Attribute.new( &quot;attr&quot;, &quot;attr_value&quot;, parent_element )\n"
full_name: REXML::Attribute::new
is_singleton: true
name: new
params: ( first, second=nil, parent=nil )
visibility: public
PK;}[��\v��.ri/1.8/system/REXML/Attribute/node_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Attribute#node_type
is_singleton: false
name: node_type
params: ()
visibility: public
PK;}['ñ,,*ri/1.8/system/REXML/Attribute/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Writes this attribute (EG, puts 'key=&quot;value&quot;' to the output)
full_name: REXML::Attribute#write
is_singleton: false
name: write
params: ( output, indent=-1 )
visibility: public
PK;}[�J�)ri/1.8/system/REXML/Attribute/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the attribute value, with entities replaced
full_name: REXML::Attribute#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK;}[ý~*+++ri/1.8/system/REXML/Attribute/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if other is an Attribute and has the same name and value, false otherwise.
full_name: REXML::Attribute#==
is_singleton: false
name: ==
params: ( other )
visibility: public
PK;}[�J����*ri/1.8/system/REXML/Attribute/clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a copy of this attribute
full_name: REXML::Attribute#clone
is_singleton: false
name: clone
params: ()
visibility: public
PK<}[��l�.ri/1.8/system/REXML/Attribute/to_string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns this attribute out as XML source, expanding the name
- !ruby/struct:SM::Flow::VERB 
  body: " a = Attribute.new( &quot;x&quot;, &quot;y&quot; )\n a.to_string     # -&gt; &quot;x='y'&quot;\n b = Attribute.new( &quot;ns:x&quot;, &quot;y&quot; )\n b.to_string     # -&gt; &quot;ns:x='y'&quot;\n"
full_name: REXML::Attribute#to_string
is_singleton: false
name: to_string
params: ()
visibility: public
PK<}[S�	��*ri/1.8/system/REXML/Attribute/xpath-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Attribute#xpath
is_singleton: false
name: xpath
params: ()
visibility: public
PK<}[1�Q799*ri/1.8/system/REXML/Attribute/value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the UNNORMALIZED value of this attribute. That is, entities have been expanded to their values
full_name: REXML::Attribute#value
is_singleton: false
name: value
params: ()
visibility: public
PK<}[Jx!ͨ�.ri/1.8/system/REXML/Entity/unnormalized-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Evaluates to the unnormalized value of this entity; that is, replacing all entities -- both %ent; and &amp;ent; entities. This differs from +value()+ in that <tt>value</tt> only replaces %ent; entities.
full_name: REXML::Entity#unnormalized
is_singleton: false
name: unnormalized
params: ()
visibility: public
PK<}[�r�nn%ri/1.8/system/REXML/Entity/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Create a new entity. Simple entities can be constructed by passing a name, value to the constructor; this creates a generic, plain entity reference. For anything more complicated, you have to pass a Source to the constructor with the entity definiton, or use the accessor methods. <tt>WARNING</tt>: There is no validation of entity state except when the entity is read from a stream. If you start poking around with the accessors, you can easily create a non-conformant Entity. The best thing to do is dump the stupid DTDs and use XMLSchema instead."
- !ruby/struct:SM::Flow::VERB 
  body: " e = Entity.new( 'amp', '&amp;' )\n"
full_name: REXML::Entity::new
is_singleton: true
name: new
params: (stream, value=nil, parent=nil, reference=false)
visibility: public
PK<}[O�sFF,ri/1.8/system/REXML/Entity/matches%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Evaluates whether the given string matchs an entity definition, returning true if so, and false otherwise.
full_name: REXML::Entity::matches?
is_singleton: true
name: matches?
params: (string)
visibility: public
PK<}[ERoo'ri/1.8/system/REXML/Entity/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Write out a fully formed, correct entity definition (assuming the Entity object itself is valid.)
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "out:"
    body: An object implementing &lt;TT&gt;&amp;lt;&amp;lt;&lt;TT&gt; to which the entity will be output
  - !ruby/struct:SM::Flow::LI 
    label: "indent:"
    body: <b>DEPRECATED</b> and ignored
  type: :NOTE
full_name: REXML::Entity#write
is_singleton: false
name: write
params: (out, indent=-1)
visibility: public
PK<}[K�8�bb,ri/1.8/system/REXML/Entity/normalized-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the value of this entity unprocessed -- raw. This is the normalized value; that is, with all %ent; and &amp;ent; entities intact
full_name: REXML::Entity#normalized
is_singleton: false
name: normalized
params: ()
visibility: public
PK<}[�?��&ri/1.8/system/REXML/Entity/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns this entity as a string. See write().
full_name: REXML::Entity#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK<}[����	�	,ri/1.8/system/REXML/Entity/cdesc-Entity.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: external
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: ndata
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: pubid
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: ref
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: matches?
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: God, I hate DTDs. I really do. Why this idiot standard still plagues us is beyond me.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: PUBIDCHAR
  value: "\"\\x20\\x0D\\x0Aa-zA-Z0-9\\\\-()+,./:=?;!*@$_%#\""
- !ruby/object:RI::Constant 
  comment: 
  name: SYSTEMLITERAL
  value: "%Q{((?:\"[^\"]*\")|(?:'[^']*'))}"
- !ruby/object:RI::Constant 
  comment: 
  name: PUBIDLITERAL
  value: "%Q{(\"[#{PUBIDCHAR}']*\"|'[#{PUBIDCHAR}]*')}"
- !ruby/object:RI::Constant 
  comment: 
  name: EXTERNALID
  value: "\"(?:(?:(SYSTEM)\\\\s+#{SYSTEMLITERAL})|(?:(PUBLIC)\\\\s+#{PUBIDLITERAL}\\\\s+#{SYSTEMLITERAL}))\""
- !ruby/object:RI::Constant 
  comment: 
  name: NDATADECL
  value: "\"\\\\s+NDATA\\\\s+#{NAME}\""
- !ruby/object:RI::Constant 
  comment: 
  name: PEREFERENCE
  value: "\"%#{NAME};\""
- !ruby/object:RI::Constant 
  comment: 
  name: ENTITYVALUE
  value: "%Q{((?:\"(?:[^%&\"]|#{PEREFERENCE}|#{REFERENCE})*\")|(?:'([^%&']|#{PEREFERENCE}|#{REFERENCE})*'))}"
- !ruby/object:RI::Constant 
  comment: 
  name: PEDEF
  value: "\"(?:#{ENTITYVALUE}|#{EXTERNALID})\""
- !ruby/object:RI::Constant 
  comment: 
  name: ENTITYDEF
  value: "\"(?:#{ENTITYVALUE}|(?:#{EXTERNALID}(#{NDATADECL})?))\""
- !ruby/object:RI::Constant 
  comment: 
  name: PEDECL
  value: "\"<!ENTITY\\\\s+(%)\\\\s+#{NAME}\\\\s+#{PEDEF}\\\\s*>\""
- !ruby/object:RI::Constant 
  comment: 
  name: GEDECL
  value: "\"<!ENTITY\\\\s+#{NAME}\\\\s+#{ENTITYDEF}\\\\s*>\""
- !ruby/object:RI::Constant 
  comment: 
  name: ENTITYDECL
  value: /\s*(?:#{GEDECL})|(?:#{PEDECL})/um
- !ruby/object:RI::Constant 
  comment: 
  name: PEREFERENCE_RE
  value: /#{PEREFERENCE}/um
full_name: REXML::Entity
includes: 
- !ruby/object:RI::IncludedModule 
  name: XMLTokens
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: normalized
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: unnormalized
- !ruby/object:RI::MethodSummary 
  name: value
- !ruby/object:RI::MethodSummary 
  name: write
name: Entity
superclass: Child
PK<}[�fy��'ri/1.8/system/REXML/Entity/value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns the value of this entity. At the moment, only internal entities are processed. If the value contains internal references (IE, %blah;), those are replaced with their values. IE, if the doctype contains:"
- !ruby/struct:SM::Flow::VERB 
  body: " &lt;!ENTITY % foo &quot;bar&quot;&gt;\n &lt;!ENTITY yada &quot;nanoo %foo; nanoo&gt;\n"
- !ruby/struct:SM::Flow::P 
  body: "then:"
- !ruby/struct:SM::Flow::VERB 
  body: " doctype.entity('yada').value   #-&gt; &quot;nanoo bar nanoo&quot;\n"
full_name: REXML::Entity#value
is_singleton: false
name: value
params: ()
visibility: public
PK<}[!�"660ri/1.8/system/REXML/StreamListener/entity-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Called when %foo; is encountered in a doctype declaration. @p content &quot;foo&quot;
full_name: REXML::StreamListener#entity
is_singleton: false
name: entity
params: (content)
visibility: public
PK<}[7�Z�jj1ri/1.8/system/REXML/StreamListener/tag_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Called when the end tag is reached. In the case of &lt;tag/&gt;, tag_end will be called immidiately after tag_start @p the name of the tag
full_name: REXML::StreamListener#tag_end
is_singleton: false
name: tag_end
params: (name)
visibility: public
PK<}[�9�׆�4ri/1.8/system/REXML/StreamListener/entitydecl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "&lt;!ENTITY ...&gt; The argument passed to this method is an array of the entity declaration. It can be in a number of formats, but in general it returns (example, result):"
- !ruby/struct:SM::Flow::VERB 
  body: " &lt;!ENTITY % YN '&quot;Yes&quot;'&gt;\n [&quot;%&quot;, &quot;YN&quot;, &quot;'\\&quot;Yes\\&quot;'&quot;, &quot;\\&quot;&quot;]\n &lt;!ENTITY % YN 'Yes'&gt;\n [&quot;%&quot;, &quot;YN&quot;, &quot;'Yes'&quot;, &quot;s&quot;]\n &lt;!ENTITY WhatHeSaid &quot;He said %YN;&quot;&gt;\n [&quot;WhatHeSaid&quot;, &quot;\\&quot;He said %YN;\\&quot;&quot;, &quot;YN&quot;]\n &lt;!ENTITY open-hatch SYSTEM &quot;http://www.textuality.com/boilerplate/OpenHatch.xml&quot;&gt;\n [&quot;open-hatch&quot;, &quot;SYSTEM&quot;, &quot;\\&quot;http://www.textuality.com/boilerplate/OpenHatch.xml\\&quot;&quot;]\n &lt;!ENTITY open-hatch PUBLIC &quot;-//Textuality//TEXT Standard open-hatch boilerplate//EN&quot; &quot;http://www.textuality.com/boilerplate/OpenHatch.xml&quot;&gt;\n [&quot;open-hatch&quot;, &quot;PUBLIC&quot;, &quot;\\&quot;-//Textuality//TEXT Standard open-hatch boilerplate//EN\\&quot;&quot;, &quot;\\&quot;http://www.textuality.com/boilerplate/OpenHatch.xml\\&quot;&quot;]\n &lt;!ENTITY hatch-pic SYSTEM &quot;../grafix/OpenHatch.gif&quot; NDATA gif&gt;\n [&quot;hatch-pic&quot;, &quot;SYSTEM&quot;, &quot;\\&quot;../grafix/OpenHatch.gif\\&quot;&quot;, &quot;\\n\\t\\t\\t\\t\\t\\t\\tNDATA gif&quot;, &quot;gif&quot;]\n"
full_name: REXML::StreamListener#entitydecl
is_singleton: false
name: entitydecl
params: (content)
visibility: public
PK<}[�����1ri/1.8/system/REXML/StreamListener/doctype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Handles a doctype declaration. Any attributes of the doctype which are not supplied will be nil. # EG, &lt;!DOCTYPE me PUBLIC &quot;foo&quot; &quot;bar&quot;&gt; @p name the name of the doctype; EG, &quot;me&quot; @p pub_sys &quot;PUBLIC&quot;, &quot;SYSTEM&quot;, or nil. EG, &quot;PUBLIC&quot; @p long_name the supplied long name, or nil. EG, &quot;foo&quot; @p uri the uri of the doctype, or nil. EG, &quot;bar&quot;"
full_name: REXML::StreamListener#doctype
is_singleton: false
name: doctype
params: (name, pub_sys, long_name, uri)
visibility: public
PK<}[(o\�//5ri/1.8/system/REXML/StreamListener/attlistdecl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "If a doctype includes an ATTLIST declaration, it will cause this method to be called. The content is the declaration itself, unparsed. EG, &lt;!ATTLIST el attr CDATA #REQUIRED&gt; will come to this method as &quot;el attr CDATA #REQUIRED&quot;. This is the same for all of the .*decl methods."
full_name: REXML::StreamListener#attlistdecl
is_singleton: false
name: attlistdecl
params: (element_name, attributes, raw_content)
visibility: public
PK<}[Q(331ri/1.8/system/REXML/StreamListener/xmldecl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Called when an XML PI is encountered in the document. EG: &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf&quot;?&gt; @p version the version attribute value. EG, &quot;1.0&quot; @p encoding the encoding attribute value, or nil. EG, &quot;utf&quot; @p standalone the standalone attribute value, or nil. EG, nil"
full_name: REXML::StreamListener#xmldecl
is_singleton: false
name: xmldecl
params: (version, encoding, standalone)
visibility: public
PK<}[��5ri/1.8/system/REXML/StreamListener/elementdecl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "&lt;!ELEMENT ...&gt;"
full_name: REXML::StreamListener#elementdecl
is_singleton: false
name: elementdecl
params: (content)
visibility: public
PK<}[~����5ri/1.8/system/REXML/StreamListener/instruction-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Called when an instruction is encountered. EG: &lt;?xsl sheet='foo'?&gt; @p name the instruction name; in the example, &quot;xsl&quot; @p instruction the rest of the instruction. In the example, &quot;sheet='foo'&quot;"
full_name: REXML::StreamListener#instruction
is_singleton: false
name: instruction
params: (name, instruction)
visibility: public
PK<}[EnX;;/ri/1.8/system/REXML/StreamListener/cdata-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Called when &lt;![CDATA[ ... ]]&gt; is encountered in a document. @p content &quot;...&quot;
full_name: REXML::StreamListener#cdata
is_singleton: false
name: cdata
params: (content)
visibility: public
PK<}[W�{�..1ri/1.8/system/REXML/StreamListener/comment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Called when a comment is encountered. @p comment The content of the comment
full_name: REXML::StreamListener#comment
is_singleton: false
name: comment
params: (comment)
visibility: public
PK<}[lv,�<ri/1.8/system/REXML/StreamListener/cdesc-StreamListener.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: A template for stream parser listeners. Note that the declarations (attlistdecl, elementdecl, etc) are trivially processed; REXML doesn't yet handle doctype entity declarations, so you have to parse them out yourself.
constants: []

full_name: REXML::StreamListener
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: attlistdecl
- !ruby/object:RI::MethodSummary 
  name: cdata
- !ruby/object:RI::MethodSummary 
  name: comment
- !ruby/object:RI::MethodSummary 
  name: doctype
- !ruby/object:RI::MethodSummary 
  name: doctype_end
- !ruby/object:RI::MethodSummary 
  name: elementdecl
- !ruby/object:RI::MethodSummary 
  name: entity
- !ruby/object:RI::MethodSummary 
  name: entitydecl
- !ruby/object:RI::MethodSummary 
  name: instruction
- !ruby/object:RI::MethodSummary 
  name: notationdecl
- !ruby/object:RI::MethodSummary 
  name: tag_end
- !ruby/object:RI::MethodSummary 
  name: tag_start
- !ruby/object:RI::MethodSummary 
  name: text
- !ruby/object:RI::MethodSummary 
  name: xmldecl
name: StreamListener
superclass: 
PK<}[R��6ri/1.8/system/REXML/StreamListener/notationdecl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "&lt;!NOTATION ...&gt;"
full_name: REXML::StreamListener#notationdecl
is_singleton: false
name: notationdecl
params: (content)
visibility: public
PK<}[���Z5ri/1.8/system/REXML/StreamListener/doctype_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Called when the doctype is done
full_name: REXML::StreamListener#doctype_end
is_singleton: false
name: doctype_end
params: ()
visibility: public
PK<}[�P�##.ri/1.8/system/REXML/StreamListener/text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Called when text is encountered in the document @p text the text content.
full_name: REXML::StreamListener#text
is_singleton: false
name: text
params: (text)
visibility: public
PK<}[�,Mx@@3ri/1.8/system/REXML/StreamListener/tag_start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Called when a tag is encountered. @p name the tag name @p attrs an array of arrays of attribute/value pairs, suitable for use with assoc or rassoc. IE, &lt;tag attr1=&quot;value1&quot; attr2=&quot;value2&quot;&gt; will result in tag_start( &quot;tag&quot;, # [[&quot;attr1&quot;,&quot;value1&quot;],[&quot;attr2&quot;,&quot;value2&quot;]])"
full_name: REXML::StreamListener#tag_start
is_singleton: false
name: tag_start
params: (name, attrs)
visibility: public
PK<}[l�u	��*ri/1.8/system/REXML/QuickPath/first-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::QuickPath::first
is_singleton: true
name: first
params: (element, path, namespaces=EMPTY_HASH)
visibility: public
PK<}[��\/��2ri/1.8/system/REXML/QuickPath/cdesc-QuickPath.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: attribute
- !ruby/object:RI::MethodSummary 
  name: axe
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: filter
- !ruby/object:RI::MethodSummary 
  name: first
- !ruby/object:RI::MethodSummary 
  name: function
- !ruby/object:RI::MethodSummary 
  name: match
- !ruby/object:RI::MethodSummary 
  name: method_missing
- !ruby/object:RI::MethodSummary 
  name: name
- !ruby/object:RI::MethodSummary 
  name: parse_args
- !ruby/object:RI::MethodSummary 
  name: predicate
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: EMPTY_HASH
  value: "{}"
full_name: REXML::QuickPath
includes: 
- !ruby/object:RI::IncludedModule 
  name: Functions
- !ruby/object:RI::IncludedModule 
  name: XMLTokens
instance_methods: []

name: QuickPath
superclass: Object
PK<}[�`]���/ri/1.8/system/REXML/QuickPath/parse_args-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::QuickPath::parse_args
is_singleton: true
name: parse_args
params: ( element, string )
visibility: public
PK<}[3�{��.ri/1.8/system/REXML/QuickPath/attribute-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::QuickPath::attribute
is_singleton: true
name: attribute
params: ( name )
visibility: public
PK<}[Wz*/��(ri/1.8/system/REXML/QuickPath/axe-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::QuickPath::axe
is_singleton: true
name: axe
params: ( elements, axe_name, rest )
visibility: public
PK<}[d�:��+ri/1.8/system/REXML/QuickPath/filter-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Given an array of nodes it filters the array based on the path. The result is that when this method returns, the array will contain elements which match the path
full_name: REXML::QuickPath::filter
is_singleton: true
name: filter
params: (elements, path)
visibility: public
PK<}[n�����.ri/1.8/system/REXML/QuickPath/predicate-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: A predicate filters a node-set with respect to an axis to produce a new node-set. For each node in the node-set to be filtered, the PredicateExpr is evaluated with that node as the context node, with the number of nodes in the node-set as the context size, and with the proximity position of the node in the node-set with respect to the axis as the context position; if PredicateExpr evaluates to true for that node, the node is included in the new node-set; otherwise, it is not included.
- !ruby/struct:SM::Flow::P 
  body: A PredicateExpr is evaluated by evaluating the Expr and converting the result to a boolean. If the result is a number, the result will be converted to true if the number is equal to the context position and will be converted to false otherwise; if the result is not a number, then the result will be converted as if by a call to the boolean function. Thus a location path para[3] is equivalent to para[position()=3].
full_name: REXML::QuickPath::predicate
is_singleton: true
name: predicate
params: ( elements, path )
visibility: public
PK<}[�-����3ri/1.8/system/REXML/QuickPath/method_missing-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::QuickPath::method_missing
is_singleton: true
name: method_missing
params: ( id, *args )
visibility: public
PK<}[�¸|��-ri/1.8/system/REXML/QuickPath/function-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::QuickPath::function
is_singleton: true
name: function
params: ( elements, fname, rest )
visibility: public
PK<}[5�b���*ri/1.8/system/REXML/QuickPath/match-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::QuickPath::match
is_singleton: true
name: match
params: (element, path, namespaces=EMPTY_HASH)
visibility: public
PK<}[������)ri/1.8/system/REXML/QuickPath/each-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::QuickPath::each
is_singleton: true
name: each
params: (element, path, namespaces=EMPTY_HASH, &block)
visibility: public
PK<}[$�ڬ�)ri/1.8/system/REXML/QuickPath/name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::QuickPath::name
is_singleton: true
name: name
params: ()
visibility: public
PK<}[-�����,ri/1.8/system/REXML/Output/cdesc-Output.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: encoding
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: REXML::Output
includes: 
- !ruby/object:RI::IncludedModule 
  name: Encoding
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Output
superclass: Object
PK=}[`D��%ri/1.8/system/REXML/Output/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Output::new
is_singleton: true
name: new
params: (real_IO, encd="iso-8859-1")
visibility: public
PK=}[�G���(ri/1.8/system/REXML/Output/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Output#<<
is_singleton: false
name: "<<"
params: ( content )
visibility: public
PK=}[M=���&ri/1.8/system/REXML/Output/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Output#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK=}[%YV���4ri/1.8/system/REXML/Parsers/BaseParser/entity-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::BaseParser#entity
is_singleton: false
name: entity
params: ( reference, entities )
visibility: public
PK=}[�$|6ri/1.8/system/REXML/Parsers/BaseParser/empty%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if there are no more events
full_name: REXML::Parsers::BaseParser#empty?
is_singleton: false
name: empty?
params: ()
visibility: public
PK=}[�.Pb��7ri/1.8/system/REXML/Parsers/BaseParser/stream%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::BaseParser#stream=
is_singleton: false
name: stream=
params: ( source )
visibility: public
PK=}[�1��yy2ri/1.8/system/REXML/Parsers/BaseParser/peek-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Peek at the <tt>depth</tt> event in the stack. The first element on the stack is at depth 0. If <tt>depth</tt> is -1, will parse to the end of the input stream and return the last event, which is always :end_document. Be aware that this causes the stream to be parsed up to the <tt>depth</tt> event, so you can effectively pre-parse the entire document (pull the entire thing into memory) using this method.
full_name: REXML::Parsers::BaseParser#peek
is_singleton: false
name: peek
params: (depth=0)
visibility: public
PK=}[�����6ri/1.8/system/REXML/Parsers/BaseParser/position-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::BaseParser#position
is_singleton: false
name: position
params: ()
visibility: public
PK=}[p	 ���:ri/1.8/system/REXML/Parsers/BaseParser/add_listener-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::BaseParser#add_listener
is_singleton: false
name: add_listener
params: ( listener )
visibility: public
PK=}[��y=""<ri/1.8/system/REXML/Parsers/BaseParser/cdesc-BaseParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: source
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::H 
  level: 1
  text: Using the Pull Parser
- !ruby/struct:SM::Flow::P 
  body: <em>This API is experimental, and subject to change.</em>
- !ruby/struct:SM::Flow::VERB 
  body: " parser = PullParser.new( &quot;&lt;a&gt;text&lt;b att='val'/&gt;txet&lt;/a&gt;&quot; )\n while parser.has_next?\n   res = parser.next\n   puts res[1]['att'] if res.start_tag? and res[0] == 'b'\n end\n"
- !ruby/struct:SM::Flow::P 
  body: See the PullEvent class for information on the content of the results. The data is identical to the arguments passed for the various events to the StreamListener API.
- !ruby/struct:SM::Flow::P 
  body: "Notice that:"
- !ruby/struct:SM::Flow::VERB 
  body: " parser = PullParser.new( &quot;&lt;a&gt;BAD DOCUMENT&quot; )\n while parser.has_next?\n   res = parser.next\n   raise res[1] if res.error?\n end\n"
- !ruby/struct:SM::Flow::P 
  body: Nat Price gave me some good ideas for the API.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: NCNAME_STR
  value: "'[\\w:][\\-\\w\\d.]*'"
- !ruby/object:RI::Constant 
  comment: 
  name: NAME_STR
  value: "\"(?:(#{NCNAME_STR}):)?(#{NCNAME_STR})\""
- !ruby/object:RI::Constant 
  comment: 
  name: UNAME_STR
  value: "\"(?:#{NCNAME_STR}:)?#{NCNAME_STR}\""
- !ruby/object:RI::Constant 
  comment: 
  name: NAMECHAR
  value: "'[\\-\\w\\d\\.:]'"
- !ruby/object:RI::Constant 
  comment: 
  name: NAME
  value: "\"([\\\\w:]#{NAMECHAR}*)\""
- !ruby/object:RI::Constant 
  comment: 
  name: NMTOKEN
  value: "\"(?:#{NAMECHAR})+\""
- !ruby/object:RI::Constant 
  comment: 
  name: NMTOKENS
  value: "\"#{NMTOKEN}(\\\\s+#{NMTOKEN})*\""
- !ruby/object:RI::Constant 
  comment: 
  name: REFERENCE
  value: "\"(?:&#{NAME};|&#\\\\d+;|&#x[0-9a-fA-F]+;)\""
- !ruby/object:RI::Constant 
  comment: 
  name: REFERENCE_RE
  value: /#{REFERENCE}/
- !ruby/object:RI::Constant 
  comment: 
  name: DOCTYPE_START
  value: /\A\s*<!DOCTYPE\s/um
- !ruby/object:RI::Constant 
  comment: 
  name: DOCTYPE_PATTERN
  value: /\s*<!DOCTYPE\s+(.*?)(\[|>)/um
- !ruby/object:RI::Constant 
  comment: 
  name: ATTRIBUTE_PATTERN
  value: /\s*(#{NAME_STR})\s*=\s*(["'])(.*?)\4/um
- !ruby/object:RI::Constant 
  comment: 
  name: COMMENT_START
  value: /\A<!--/u
- !ruby/object:RI::Constant 
  comment: 
  name: COMMENT_PATTERN
  value: /<!--(.*?)-->/um
- !ruby/object:RI::Constant 
  comment: 
  name: CDATA_START
  value: /\A<!\[CDATA\[/u
- !ruby/object:RI::Constant 
  comment: 
  name: CDATA_END
  value: /^\s*\]\s*>/um
- !ruby/object:RI::Constant 
  comment: 
  name: CDATA_PATTERN
  value: /<!\[CDATA\[(.*?)\]\]>/um
- !ruby/object:RI::Constant 
  comment: 
  name: XMLDECL_START
  value: /\A<\?xml\s/u;
- !ruby/object:RI::Constant 
  comment: 
  name: XMLDECL_PATTERN
  value: /<\?xml\s+(.*?)\?>/um
- !ruby/object:RI::Constant 
  comment: 
  name: INSTRUCTION_START
  value: /\A<\?/u
- !ruby/object:RI::Constant 
  comment: 
  name: INSTRUCTION_PATTERN
  value: /<\?(.*?)(\s+.*?)?\?>/um
- !ruby/object:RI::Constant 
  comment: 
  name: TAG_MATCH
  value: /^<((?>#{NAME_STR}))\s*((?>\s+#{UNAME_STR}\s*=\s*(["']).*?\5)*)\s*(\/)?>/um
- !ruby/object:RI::Constant 
  comment: 
  name: CLOSE_MATCH
  value: /^\s*<\/(#{NAME_STR})\s*>/um
- !ruby/object:RI::Constant 
  comment: 
  name: VERSION
  value: /\bversion\s*=\s*["'](.*?)['"]/um
- !ruby/object:RI::Constant 
  comment: 
  name: ENCODING
  value: /\bencoding\s*=\s*["'](.*?)['"]/um
- !ruby/object:RI::Constant 
  comment: 
  name: STANDALONE
  value: /\bstandalone\s*=\s["'](.*?)['"]/um
- !ruby/object:RI::Constant 
  comment: 
  name: ENTITY_START
  value: /^\s*<!ENTITY/
- !ruby/object:RI::Constant 
  comment: 
  name: IDENTITY
  value: /^([!\*\w\-]+)(\s+#{NCNAME_STR})?(\s+["'](.*?)['"])?(\s+['"](.*?)["'])?/u
- !ruby/object:RI::Constant 
  comment: 
  name: ELEMENTDECL_START
  value: /^\s*<!ELEMENT/um
- !ruby/object:RI::Constant 
  comment: 
  name: ELEMENTDECL_PATTERN
  value: /^\s*(<!ELEMENT.*?)>/um
- !ruby/object:RI::Constant 
  comment: 
  name: SYSTEMENTITY
  value: /^\s*(%.*?;)\s*$/um
- !ruby/object:RI::Constant 
  comment: 
  name: ENUMERATION
  value: "\"\\\\(\\\\s*#{NMTOKEN}(?:\\\\s*\\\\|\\\\s*#{NMTOKEN})*\\\\s*\\\\)\""
- !ruby/object:RI::Constant 
  comment: 
  name: NOTATIONTYPE
  value: "\"NOTATION\\\\s+\\\\(\\\\s*#{NAME}(?:\\\\s*\\\\|\\\\s*#{NAME})*\\\\s*\\\\)\""
- !ruby/object:RI::Constant 
  comment: 
  name: ENUMERATEDTYPE
  value: "\"(?:(?:#{NOTATIONTYPE})|(?:#{ENUMERATION}))\""
- !ruby/object:RI::Constant 
  comment: 
  name: ATTTYPE
  value: "\"(CDATA|ID|IDREF|IDREFS|ENTITY|ENTITIES|NMTOKEN|NMTOKENS|#{ENUMERATEDTYPE})\""
- !ruby/object:RI::Constant 
  comment: 
  name: ATTVALUE
  value: "\"(?:\\\"((?:[^<&\\\"]|#{REFERENCE})*)\\\")|(?:'((?:[^<&']|#{REFERENCE})*)')\""
- !ruby/object:RI::Constant 
  comment: 
  name: DEFAULTDECL
  value: "\"(#REQUIRED|#IMPLIED|(?:(#FIXED\\\\s+)?#{ATTVALUE}))\""
- !ruby/object:RI::Constant 
  comment: 
  name: ATTDEF
  value: "\"\\\\s+#{NAME}\\\\s+#{ATTTYPE}\\\\s+#{DEFAULTDECL}\""
- !ruby/object:RI::Constant 
  comment: 
  name: ATTDEF_RE
  value: /#{ATTDEF}/
- !ruby/object:RI::Constant 
  comment: 
  name: ATTLISTDECL_START
  value: /^\s*<!ATTLIST/um
- !ruby/object:RI::Constant 
  comment: 
  name: ATTLISTDECL_PATTERN
  value: /^\s*<!ATTLIST\s+#{NAME}(?:#{ATTDEF})*\s*>/um
- !ruby/object:RI::Constant 
  comment: 
  name: NOTATIONDECL_START
  value: /^\s*<!NOTATION/um
- !ruby/object:RI::Constant 
  comment: 
  name: PUBLIC
  value: /^\s*<!NOTATION\s+(\w[\-\w]*)\s+(PUBLIC)\s+(["'])(.*?)\3(?:\s+(["'])(.*?)\5)?\s*>/um
- !ruby/object:RI::Constant 
  comment: 
  name: SYSTEM
  value: /^\s*<!NOTATION\s+(\w[\-\w]*)\s+(SYSTEM)\s+(["'])(.*?)\3\s*>/um
- !ruby/object:RI::Constant 
  comment: 
  name: TEXT_PATTERN
  value: /\A([^<]*)/um
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Entity constants
  name: PUBIDCHAR
  value: "\"\\x20\\x0D\\x0Aa-zA-Z0-9\\\\-()+,./:=?;!*@$_%#\""
- !ruby/object:RI::Constant 
  comment: 
  name: SYSTEMLITERAL
  value: "%Q{((?:\"[^\"]*\")|(?:'[^']*'))}"
- !ruby/object:RI::Constant 
  comment: 
  name: PUBIDLITERAL
  value: "%Q{(\"[#{PUBIDCHAR}']*\"|'[#{PUBIDCHAR}]*')}"
- !ruby/object:RI::Constant 
  comment: 
  name: EXTERNALID
  value: "\"(?:(?:(SYSTEM)\\\\s+#{SYSTEMLITERAL})|(?:(PUBLIC)\\\\s+#{PUBIDLITERAL}\\\\s+#{SYSTEMLITERAL}))\""
- !ruby/object:RI::Constant 
  comment: 
  name: NDATADECL
  value: "\"\\\\s+NDATA\\\\s+#{NAME}\""
- !ruby/object:RI::Constant 
  comment: 
  name: PEREFERENCE
  value: "\"%#{NAME};\""
- !ruby/object:RI::Constant 
  comment: 
  name: ENTITYVALUE
  value: "%Q{((?:\"(?:[^%&\"]|#{PEREFERENCE}|#{REFERENCE})*\")|(?:'([^%&']|#{PEREFERENCE}|#{REFERENCE})*'))}"
- !ruby/object:RI::Constant 
  comment: 
  name: PEDEF
  value: "\"(?:#{ENTITYVALUE}|#{EXTERNALID})\""
- !ruby/object:RI::Constant 
  comment: 
  name: ENTITYDEF
  value: "\"(?:#{ENTITYVALUE}|(?:#{EXTERNALID}(#{NDATADECL})?))\""
- !ruby/object:RI::Constant 
  comment: 
  name: PEDECL
  value: "\"<!ENTITY\\\\s+(%)\\\\s+#{NAME}\\\\s+#{PEDEF}\\\\s*>\""
- !ruby/object:RI::Constant 
  comment: 
  name: GEDECL
  value: "\"<!ENTITY\\\\s+#{NAME}\\\\s+#{ENTITYDEF}\\\\s*>\""
- !ruby/object:RI::Constant 
  comment: 
  name: ENTITYDECL
  value: /\s*(?:#{GEDECL})|(?:#{PEDECL})/um
- !ruby/object:RI::Constant 
  comment: 
  name: EREFERENCE
  value: /&(?!#{NAME};)/
- !ruby/object:RI::Constant 
  comment: 
  name: DEFAULT_ENTITIES
  value: "{          'gt' => [/&gt;/, '&gt;', '>', />/],          'lt' => [/&lt;/, '&lt;', '<', /</],          'quot' => [/&quot;/, '&quot;', '\"', /\"/],          \"apos\" => [/&apos;/, \"&apos;\", \"'\", /'/]"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: These are patterns to identify common markup errors, to make the error messages more informative.
  name: MISSING_ATTRIBUTE_QUOTES
  value: /^<#{NAME_STR}\s+#{NAME_STR}\s*=\s*[^"']/um
full_name: REXML::Parsers::BaseParser
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_listener
- !ruby/object:RI::MethodSummary 
  name: empty?
- !ruby/object:RI::MethodSummary 
  name: entity
- !ruby/object:RI::MethodSummary 
  name: has_next?
- !ruby/object:RI::MethodSummary 
  name: normalize
- !ruby/object:RI::MethodSummary 
  name: peek
- !ruby/object:RI::MethodSummary 
  name: position
- !ruby/object:RI::MethodSummary 
  name: pull
- !ruby/object:RI::MethodSummary 
  name: stream=
- !ruby/object:RI::MethodSummary 
  name: unnormalize
- !ruby/object:RI::MethodSummary 
  name: unshift
name: BaseParser
superclass: Object
PK=}[Q56�**7ri/1.8/system/REXML/Parsers/BaseParser/normalize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Escapes all possible entities
full_name: REXML::Parsers::BaseParser#normalize
is_singleton: false
name: normalize
params: ( input, entities=nil, entity_filter=nil )
visibility: public
PK=}[��SCC5ri/1.8/system/REXML/Parsers/BaseParser/unshift-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Push an event back on the head of the stream. This method has (theoretically) infinite depth.
full_name: REXML::Parsers::BaseParser#unshift
is_singleton: false
name: unshift
params: (token)
visibility: public
PK=}[<#��1ri/1.8/system/REXML/Parsers/BaseParser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::BaseParser::new
is_singleton: true
name: new
params: ( source )
visibility: public
PK=}[Xm
P**9ri/1.8/system/REXML/Parsers/BaseParser/unnormalize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Unescapes all possible entities
full_name: REXML::Parsers::BaseParser#unnormalize
is_singleton: false
name: unnormalize
params: ( string, entities=nil, filter=nil )
visibility: public
PK=}[>T�##9ri/1.8/system/REXML/Parsers/BaseParser/has_next%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if there are more events. Synonymous with !empty?
full_name: REXML::Parsers::BaseParser#has_next?
is_singleton: false
name: has_next?
params: ()
visibility: public
PK=}[�eΰ2ri/1.8/system/REXML/Parsers/BaseParser/pull-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the next event. This is a <tt>PullEvent</tt> object.
full_name: REXML::Parsers::BaseParser#pull
is_singleton: false
name: pull
params: ()
visibility: public
PK=}[k�7���9ri/1.8/system/REXML/Parsers/XPathParser/parse_args-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::XPathParser#parse_args
is_singleton: false
name: parse_args
params: ( string )
visibility: private
PK=}[�R��MMAri/1.8/system/REXML/Parsers/XPathParser/MultiplicativeExpr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "| MultiplicativeExpr ('*' | S ('div' | 'mod') S) UnaryExpr | UnaryExpr"
full_name: REXML::Parsers::XPathParser#MultiplicativeExpr
is_singleton: false
name: MultiplicativeExpr
params: (path, parsed)
visibility: private
PK=}[�����;ri/1.8/system/REXML/Parsers/XPathParser/LocationPath-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: LocationPath
- !ruby/struct:SM::Flow::VERB 
  body: "  | RelativeLocationPath\n  | '/' RelativeLocationPath?\n  | '//' RelativeLocationPath\n"
full_name: REXML::Parsers::XPathParser#LocationPath
is_singleton: false
name: LocationPath
params: (path, parsed)
visibility: private
PK=}[��??;ri/1.8/system/REXML/Parsers/XPathParser/AdditiveExpr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "| AdditiveExpr ('+' | S '-') MultiplicativeExpr | MultiplicativeExpr"
full_name: REXML::Parsers::XPathParser#AdditiveExpr
is_singleton: false
name: AdditiveExpr
params: (path, parsed)
visibility: private
PK=}[��JC  6ri/1.8/system/REXML/Parsers/XPathParser/AndExpr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "| AndExpr S 'and' S EqualityExpr | EqualityExpr"
full_name: REXML::Parsers::XPathParser#AndExpr
is_singleton: false
name: AndExpr
params: (path, parsed)
visibility: private
PK=}[r��66;ri/1.8/system/REXML/Parsers/XPathParser/EqualityExpr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "| EqualityExpr ('=' | '!=') RelationalExpr | RelationalExpr"
full_name: REXML::Parsers::XPathParser#EqualityExpr
is_singleton: false
name: EqualityExpr
params: (path, parsed)
visibility: private
PK=}[K�k8ri/1.8/system/REXML/Parsers/XPathParser/get_group-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: get_group( '[foo]bar' ) -&gt; ['bar', '[foo]']
full_name: REXML::Parsers::XPathParser#get_group
is_singleton: false
name: get_group
params: (string)
visibility: private
PK=}[iu��8ri/1.8/system/REXML/Parsers/XPathParser/predicate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::XPathParser#predicate
is_singleton: false
name: predicate
params: (path)
visibility: public
PK=}[�p�3��4ri/1.8/system/REXML/Parsers/XPathParser/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::XPathParser#parse
is_singleton: false
name: parse
params: (path)
visibility: public
PK=}[����9ri/1.8/system/REXML/Parsers/XPathParser/abbreviate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::XPathParser#abbreviate
is_singleton: false
name: abbreviate
params: ( path )
visibility: public
PK=}[�yN���7ri/1.8/system/REXML/Parsers/XPathParser/NodeTest-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::XPathParser#NodeTest
is_singleton: false
name: NodeTest
params: (path, parsed)
visibility: private
PK=}[����Bri/1.8/system/REXML/Parsers/XPathParser/predicate_to_string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ( path )
comment: 
full_name: REXML::Parsers::XPathParser#predicate_to_string
is_singleton: false
name: predicate_to_string
params: ( path, &block ) {|path| ...}
visibility: public
PK=}[��Z�9ri/1.8/system/REXML/Parsers/XPathParser/FilterExpr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "| FilterExpr Predicate | PrimaryExpr"
full_name: REXML::Parsers::XPathParser#FilterExpr
is_singleton: false
name: FilterExpr
params: (path, parsed)
visibility: private
PK=}[
D)��:ri/1.8/system/REXML/Parsers/XPathParser/PrimaryExpr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::XPathParser#PrimaryExpr
is_singleton: false
name: PrimaryExpr
params: (path, parsed)
visibility: private
PK=}[L�s8ri/1.8/system/REXML/Parsers/XPathParser/UnionExpr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "| UnionExpr '|' PathExpr | PathExpr"
full_name: REXML::Parsers::XPathParser#UnionExpr
is_singleton: false
name: UnionExpr
params: (path, parsed)
visibility: private
PK=}[�V##8ri/1.8/system/REXML/Parsers/XPathParser/Predicate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Filters the supplied nodeset on the predicate(s)
full_name: REXML::Parsers::XPathParser#Predicate
is_singleton: false
name: Predicate
params: (path, parsed)
visibility: private
PK@}[�ɫ**;ri/1.8/system/REXML/Parsers/XPathParser/FunctionCall-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "| FUNCTION_NAME '(' ( expr ( ',' expr )* )? ')'"
full_name: REXML::Parsers::XPathParser#FunctionCall
is_singleton: false
name: FunctionCall
params: (rest, parsed)
visibility: private
PK@}[��f�QQ=ri/1.8/system/REXML/Parsers/XPathParser/RelationalExpr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "| RelationalExpr ('&lt;' | '&gt;' | '&lt;=' | '&gt;=') AdditiveExpr | AdditiveExpr"
full_name: REXML::Parsers::XPathParser#RelationalExpr
is_singleton: false
name: RelationalExpr
params: (path, parsed)
visibility: private
PK@}[����<ri/1.8/system/REXML/Parsers/XPathParser/namespaces%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::XPathParser#namespaces=
is_singleton: false
name: namespaces=
params: ( namespaces )
visibility: public
PK@}[��)��>ri/1.8/system/REXML/Parsers/XPathParser/cdesc-XPathParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: You don't want to use this class. Really. Use XPath, which is a wrapper for this class. Believe me. You don't want to poke around in here. There is strange, dark magic at work in this code. Beware. Go back! Go back while you still can!
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: LITERAL
  value: /^'([^']*)'|^"([^"]*)"/u
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: RelativeLocationPath
  - !ruby/struct:SM::Flow::VERB 
    body: "  |                                                    Step\n    | (AXIS_NAME '::' | '@' | '')                     AxisSpecifier\n      NodeTest\n        Predicate\n    | '.' | '..'                                      AbbreviatedStep\n  |  RelativeLocationPath '/' Step\n  | RelativeLocationPath '//' Step\n"
  name: AXIS
  value: /^(ancestor|ancestor-or-self|attribute|child|descendant|descendant-or-self|following|following-sibling|namespace|parent|preceding|preceding-sibling|self)::/
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::VERB 
    body: " Returns a 1-1 map of the nodeset\n The contents of the resulting array are either:\n   true/false, if a positive match\n   String, if a name match\n"
  - !ruby/struct:SM::Flow::P 
    body: NodeTest
  - !ruby/struct:SM::Flow::VERB 
    body: "  | ('*' | NCNAME ':' '*' | QNAME)                NameTest\n  | NODE_TYPE '(' ')'                              NodeType\n  | PI '(' LITERAL ')'                            PI\n    | '[' expr ']'                                Predicate\n"
  name: NCNAMETEST
  value: /^(#{NCNAME_STR}):\*/u
- !ruby/object:RI::Constant 
  comment: 
  name: QNAME
  value: Namespace::NAMESPLIT
- !ruby/object:RI::Constant 
  comment: 
  name: NODE_TYPE
  value: /^(comment|text|node)\(\s*\)/m
- !ruby/object:RI::Constant 
  comment: 
  name: PI
  value: /^processing-instruction\(/
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "| VARIABLE_REFERENCE | '(' expr ')' | LITERAL | NUMBER | FunctionCall"
  name: VARIABLE_REFERENCE
  value: /^\$(#{NAME_STR})/u
- !ruby/object:RI::Constant 
  comment: 
  name: NUMBER
  value: /^(\d*\.?\d+)/
- !ruby/object:RI::Constant 
  comment: 
  name: NT
  value: /^comment|text|processing-instruction|node$/
full_name: REXML::Parsers::XPathParser
includes: 
- !ruby/object:RI::IncludedModule 
  name: XMLTokens
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: AdditiveExpr
- !ruby/object:RI::MethodSummary 
  name: AndExpr
- !ruby/object:RI::MethodSummary 
  name: EqualityExpr
- !ruby/object:RI::MethodSummary 
  name: FilterExpr
- !ruby/object:RI::MethodSummary 
  name: FunctionCall
- !ruby/object:RI::MethodSummary 
  name: LocationPath
- !ruby/object:RI::MethodSummary 
  name: MultiplicativeExpr
- !ruby/object:RI::MethodSummary 
  name: NodeTest
- !ruby/object:RI::MethodSummary 
  name: OrExpr
- !ruby/object:RI::MethodSummary 
  name: PathExpr
- !ruby/object:RI::MethodSummary 
  name: Predicate
- !ruby/object:RI::MethodSummary 
  name: PrimaryExpr
- !ruby/object:RI::MethodSummary 
  name: RelationalExpr
- !ruby/object:RI::MethodSummary 
  name: RelativeLocationPath
- !ruby/object:RI::MethodSummary 
  name: UnaryExpr
- !ruby/object:RI::MethodSummary 
  name: UnionExpr
- !ruby/object:RI::MethodSummary 
  name: abbreviate
- !ruby/object:RI::MethodSummary 
  name: expand
- !ruby/object:RI::MethodSummary 
  name: get_group
- !ruby/object:RI::MethodSummary 
  name: namespaces=
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: parse_args
- !ruby/object:RI::MethodSummary 
  name: predicate
- !ruby/object:RI::MethodSummary 
  name: predicate_to_string
name: XPathParser
superclass: Object
PK@}[2-��8ri/1.8/system/REXML/Parsers/XPathParser/UnaryExpr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "| '-' UnaryExpr | UnionExpr"
full_name: REXML::Parsers::XPathParser#UnaryExpr
is_singleton: false
name: UnaryExpr
params: (path, parsed)
visibility: private
PK@}[�6�4��5ri/1.8/system/REXML/Parsers/XPathParser/expand-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::XPathParser#expand
is_singleton: false
name: expand
params: ( path )
visibility: public
PK@}[=�=F��Cri/1.8/system/REXML/Parsers/XPathParser/RelativeLocationPath-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::XPathParser#RelativeLocationPath
is_singleton: false
name: RelativeLocationPath
params: (path, parsed)
visibility: private
PK@}[��M�007ri/1.8/system/REXML/Parsers/XPathParser/PathExpr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "| LocationPath | FilterExpr ('/' | '//') RelativeLocationPath"
full_name: REXML::Parsers::XPathParser#PathExpr
is_singleton: false
name: PathExpr
params: (path, parsed)
visibility: private
PK@}[b�u�5ri/1.8/system/REXML/Parsers/XPathParser/OrExpr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "| OrExpr S 'or' S AndExpr | AndExpr"
full_name: REXML::Parsers::XPathParser#OrExpr
is_singleton: false
name: OrExpr
params: (path, parsed)
visibility: private
PK@}[�͡��9ri/1.8/system/REXML/Parsers/UltraLightParser/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::UltraLightParser#parse
is_singleton: false
name: parse
params: ()
visibility: public
PK@}[��`���@ri/1.8/system/REXML/Parsers/UltraLightParser/add_listener-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::UltraLightParser#add_listener
is_singleton: false
name: add_listener
params: ( listener )
visibility: public
PK@}[�
i��:ri/1.8/system/REXML/Parsers/UltraLightParser/rewind-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::UltraLightParser#rewind
is_singleton: false
name: rewind
params: ()
visibility: public
PK@}[�@]��7ri/1.8/system/REXML/Parsers/UltraLightParser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::UltraLightParser::new
is_singleton: true
name: new
params: (stream)
visibility: public
PKA}[�t�B��Hri/1.8/system/REXML/Parsers/UltraLightParser/cdesc-UltraLightParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: REXML::Parsers::UltraLightParser
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_listener
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: rewind
name: UltraLightParser
superclass: Object
PKA}[����3ri/1.8/system/REXML/Parsers/PullEvent/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::PullEvent#[]
is_singleton: false
name: "[]"
params: ( start, endd=nil)
visibility: public
PKA}[�!&�;ri/1.8/system/REXML/Parsers/PullEvent/instruction%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Content: [ String text ]"
full_name: REXML::Parsers::PullEvent#instruction?
is_singleton: false
name: instruction?
params: ()
visibility: public
PKA}[���S;ri/1.8/system/REXML/Parsers/PullEvent/end_element%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Content: [ String tag_name ]"
full_name: REXML::Parsers::PullEvent#end_element?
is_singleton: false
name: end_element?
params: ()
visibility: public
PKA}[�n##7ri/1.8/system/REXML/Parsers/PullEvent/xmldecl%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Content: [ String version, String encoding, String standalone ]"
full_name: REXML::Parsers::PullEvent#xmldecl?
is_singleton: false
name: xmldecl?
params: ()
visibility: public
PKA}[יs;ri/1.8/system/REXML/Parsers/PullEvent/elementdecl%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Content: [ String text ]"
full_name: REXML::Parsers::PullEvent#elementdecl?
is_singleton: false
name: elementdecl?
params: ()
visibility: public
PKB}[f����5ri/1.8/system/REXML/Parsers/PullEvent/cdata%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Content: [ String text ]"
full_name: REXML::Parsers::PullEvent#cdata?
is_singleton: false
name: cdata?
params: ()
visibility: public
PKB}[�
����:ri/1.8/system/REXML/Parsers/PullEvent/entitydecl%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Due to the wonders of DTDs, an entity declaration can be just about anything. There's no way to normalize it; you'll have to interpret the content yourself. However, the following is true:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "If the entity declaration is an internal entity: [ String name, String value ]"
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "Content: [ String text ]"
full_name: REXML::Parsers::PullEvent#entitydecl?
is_singleton: false
name: entitydecl?
params: ()
visibility: public
PKB}["�f��4ri/1.8/system/REXML/Parsers/PullEvent/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::PullEvent#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PKB}[�����6ri/1.8/system/REXML/Parsers/PullEvent/entity%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Content: [ String text ]"
full_name: REXML::Parsers::PullEvent#entity?
is_singleton: false
name: entity?
params: ()
visibility: public
PKB}[p(�ɛ�0ri/1.8/system/REXML/Parsers/PullEvent/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The type of this event. Will be one of :tag_start, :tag_end, :text, :processing_instruction, :comment, :doctype, :attlistdecl, :entitydecl, :notationdecl, :entity, :cdata, :xmldecl, or :error.
full_name: REXML::Parsers::PullEvent::new
is_singleton: true
name: new
params: (arg)
visibility: public
PKB}[�v�Q;ri/1.8/system/REXML/Parsers/PullEvent/attlistdecl%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Content: [ String text ]"
full_name: REXML::Parsers::PullEvent#attlistdecl?
is_singleton: false
name: attlistdecl?
params: ()
visibility: public
PKB}[�294ri/1.8/system/REXML/Parsers/PullEvent/text%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Content: [ String raw_text, String unnormalized_text ]"
full_name: REXML::Parsers::PullEvent#text?
is_singleton: false
name: text?
params: ()
visibility: public
PKB}[/Qn�=ri/1.8/system/REXML/Parsers/PullEvent/start_element%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Content: [ String tag_name, Hash attributes ]"
full_name: REXML::Parsers::PullEvent#start_element?
is_singleton: false
name: start_element?
params: ()
visibility: public
PKB}[,�r��:ri/1.8/system/REXML/Parsers/PullEvent/cdesc-PullEvent.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A parsing event. The contents of the event are accessed as an +Array?, and the type is given either by the ...? methods, or by accessing the <tt>type</tt> accessor. The contents of this object vary from event to event, but are identical to the arguments passed to +StreamListener+s for each event.
constants: []

full_name: REXML::Parsers::PullEvent
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: attlistdecl?
- !ruby/object:RI::MethodSummary 
  name: cdata?
- !ruby/object:RI::MethodSummary 
  name: comment?
- !ruby/object:RI::MethodSummary 
  name: doctype?
- !ruby/object:RI::MethodSummary 
  name: elementdecl?
- !ruby/object:RI::MethodSummary 
  name: end_element?
- !ruby/object:RI::MethodSummary 
  name: entity?
- !ruby/object:RI::MethodSummary 
  name: entitydecl?
- !ruby/object:RI::MethodSummary 
  name: error?
- !ruby/object:RI::MethodSummary 
  name: event_type
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: instruction?
- !ruby/object:RI::MethodSummary 
  name: notationdecl?
- !ruby/object:RI::MethodSummary 
  name: start_element?
- !ruby/object:RI::MethodSummary 
  name: text?
- !ruby/object:RI::MethodSummary 
  name: xmldecl?
name: PullEvent
superclass: Object
PKB}[}d<ri/1.8/system/REXML/Parsers/PullEvent/notationdecl%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Content: [ String text ]"
full_name: REXML::Parsers::PullEvent#notationdecl?
is_singleton: false
name: notationdecl?
params: ()
visibility: public
PKB}[,��й�5ri/1.8/system/REXML/Parsers/PullEvent/error%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::PullEvent#error?
is_singleton: false
name: error?
params: ()
visibility: public
PKB}[��,��7ri/1.8/system/REXML/Parsers/PullEvent/comment%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Content: [ String text ]"
full_name: REXML::Parsers::PullEvent#comment?
is_singleton: false
name: comment?
params: ()
visibility: public
PKB}[o��**7ri/1.8/system/REXML/Parsers/PullEvent/doctype%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Content: [ String name, String pub_sys, String long_name, String uri ]"
full_name: REXML::Parsers::PullEvent#doctype?
is_singleton: false
name: doctype?
params: ()
visibility: public
PKB}[ik��7ri/1.8/system/REXML/Parsers/PullEvent/event_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::PullEvent#event_type
is_singleton: false
name: event_type
params: ()
visibility: public
PKB}[wj���4ri/1.8/system/REXML/Parsers/LightParser/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::LightParser#parse
is_singleton: false
name: parse
params: ()
visibility: public
PKB}[n����;ri/1.8/system/REXML/Parsers/LightParser/add_listener-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::LightParser#add_listener
is_singleton: false
name: add_listener
params: ( listener )
visibility: public
PKB}[)�I�5ri/1.8/system/REXML/Parsers/LightParser/rewind-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::LightParser#rewind
is_singleton: false
name: rewind
params: ()
visibility: public
PKB}[�S��2ri/1.8/system/REXML/Parsers/LightParser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::LightParser::new
is_singleton: true
name: new
params: (stream)
visibility: public
PKB}[*��$��>ri/1.8/system/REXML/Parsers/LightParser/cdesc-LightParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: REXML::Parsers::LightParser
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_listener
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: rewind
name: LightParser
superclass: Object
PKB}[P©��.ri/1.8/system/REXML/Parsers/cdesc-Parsers.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: REXML::Parsers
includes: []

instance_methods: []

name: Parsers
superclass: 
PKC}[-����4ri/1.8/system/REXML/Parsers/SAX2Parser/deafen-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::SAX2Parser#deafen
is_singleton: false
name: deafen
params: ( listener=nil, &blok )
visibility: public
PKC}[_(��4ri/1.8/system/REXML/Parsers/SAX2Parser/source-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::SAX2Parser#source
is_singleton: false
name: source
params: ()
visibility: public
PKC}[Z�Yи�3ri/1.8/system/REXML/Parsers/SAX2Parser/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::SAX2Parser#parse
is_singleton: false
name: parse
params: ()
visibility: public
PKC}[����%%<ri/1.8/system/REXML/Parsers/SAX2Parser/cdesc-SAX2Parser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: SAX2Parser
constants: []

full_name: REXML::Parsers::SAX2Parser
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: add_listener
- !ruby/object:RI::MethodSummary 
  name: deafen
- !ruby/object:RI::MethodSummary 
  name: get_listeners
- !ruby/object:RI::MethodSummary 
  name: get_namespace
- !ruby/object:RI::MethodSummary 
  name: get_procs
- !ruby/object:RI::MethodSummary 
  name: handle
- !ruby/object:RI::MethodSummary 
  name: listen
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: source
name: SAX2Parser
superclass: Object
PKC}['�ւ��:ri/1.8/system/REXML/Parsers/SAX2Parser/add_listener-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::SAX2Parser#add_listener
is_singleton: false
name: add_listener
params: ( listener )
visibility: public
PKC}[ru���1ri/1.8/system/REXML/Parsers/SAX2Parser/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::SAX2Parser#add
is_singleton: false
name: add
params: ( pair )
visibility: private
PKC}[�*%��1ri/1.8/system/REXML/Parsers/SAX2Parser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::SAX2Parser::new
is_singleton: true
name: new
params: (source)
visibility: public
PKC}[_c�Z��;ri/1.8/system/REXML/Parsers/SAX2Parser/get_listeners-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::SAX2Parser#get_listeners
is_singleton: false
name: get_listeners
params: ( symbol, name )
visibility: private
PKC}[<k�j��4ri/1.8/system/REXML/Parsers/SAX2Parser/handle-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::SAX2Parser#handle
is_singleton: false
name: handle
params: ( symbol, *arguments )
visibility: private
PKC}[��4ri/1.8/system/REXML/Parsers/SAX2Parser/listen-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Listen arguments:"
- !ruby/struct:SM::Flow::P 
  body: Symbol, Array, Block
- !ruby/struct:SM::Flow::VERB 
  body: "   Listen to Symbol events on Array elements\n"
- !ruby/struct:SM::Flow::P 
  body: Symbol, Block
- !ruby/struct:SM::Flow::VERB 
  body: "  Listen to Symbol events\n"
- !ruby/struct:SM::Flow::P 
  body: Array, Listener
- !ruby/struct:SM::Flow::VERB 
  body: "   Listen to all events on Array elements\n"
- !ruby/struct:SM::Flow::P 
  body: Array, Block
- !ruby/struct:SM::Flow::VERB 
  body: "   Listen to :start_element events on Array elements\n"
- !ruby/struct:SM::Flow::P 
  body: Listener
- !ruby/struct:SM::Flow::VERB 
  body: "   Listen to All events\n"
- !ruby/struct:SM::Flow::P 
  body: "Symbol can be one of: :start_element, :end_element, :start_prefix_mapping, :end_prefix_mapping, :characters, :processing_instruction, :doctype, :attlistdecl, :elementdecl, :entitydecl, :notationdecl, :cdata, :xmldecl, :comment"
- !ruby/struct:SM::Flow::P 
  body: "There is an additional symbol that can be listened for: :progress. This will be called for every event generated, passing in the current stream position."
- !ruby/struct:SM::Flow::P 
  body: Array contains regular expressions or strings which will be matched against fully qualified element names.
- !ruby/struct:SM::Flow::P 
  body: Listener must implement the methods in SAX2Listener
- !ruby/struct:SM::Flow::P 
  body: Block will be passed the same arguments as a SAX2Listener method would be, where the method name is the same as the matched Symbol. See the SAX2Listener for more information.
full_name: REXML::Parsers::SAX2Parser#listen
is_singleton: false
name: listen
params: ( *args, &blok )
visibility: public
PKC}[������;ri/1.8/system/REXML/Parsers/SAX2Parser/get_namespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::SAX2Parser#get_namespace
is_singleton: false
name: get_namespace
params: ( prefix )
visibility: private
PKD}[C�r�>>7ri/1.8/system/REXML/Parsers/SAX2Parser/get_procs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The following methods are duplicates, but it is faster than using a helper
full_name: REXML::Parsers::SAX2Parser#get_procs
is_singleton: false
name: get_procs
params: ( symbol, name )
visibility: private
PKD}[x2dc��2ri/1.8/system/REXML/Parsers/PullParser/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: self.pull
comment: 
full_name: REXML::Parsers::PullParser#each
is_singleton: false
name: each
params: () {|self.pull| ...}
visibility: public
PKD}["bz_��2ri/1.8/system/REXML/Parsers/PullParser/peek-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::PullParser#peek
is_singleton: false
name: peek
params: (depth=0)
visibility: public
PKE}[jJ�$��<ri/1.8/system/REXML/Parsers/PullParser/cdesc-PullParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::H 
  level: 1
  text: Using the Pull Parser
- !ruby/struct:SM::Flow::P 
  body: <em>This API is experimental, and subject to change.</em>
- !ruby/struct:SM::Flow::VERB 
  body: " parser = PullParser.new( &quot;&lt;a&gt;text&lt;b att='val'/&gt;txet&lt;/a&gt;&quot; )\n while parser.has_next?\n   res = parser.next\n   puts res[1]['att'] if res.start_tag? and res[0] == 'b'\n end\n"
- !ruby/struct:SM::Flow::P 
  body: See the PullEvent class for information on the content of the results. The data is identical to the arguments passed for the various events to the StreamListener API.
- !ruby/struct:SM::Flow::P 
  body: "Notice that:"
- !ruby/struct:SM::Flow::VERB 
  body: " parser = PullParser.new( &quot;&lt;a&gt;BAD DOCUMENT&quot; )\n while parser.has_next?\n   res = parser.next\n   raise res[1] if res.error?\n end\n"
- !ruby/struct:SM::Flow::P 
  body: Nat Price gave me some good ideas for the API.
constants: []

full_name: REXML::Parsers::PullParser
includes: 
- !ruby/object:RI::IncludedModule 
  name: XMLTokens
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_listener
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: peek
- !ruby/object:RI::MethodSummary 
  name: pull
- !ruby/object:RI::MethodSummary 
  name: unshift
name: PullParser
superclass: Object
PKE}[�0�>��:ri/1.8/system/REXML/Parsers/PullParser/add_listener-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::PullParser#add_listener
is_singleton: false
name: add_listener
params: ( listener )
visibility: public
PKE}[t����5ri/1.8/system/REXML/Parsers/PullParser/unshift-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::PullParser#unshift
is_singleton: false
name: unshift
params: (token)
visibility: public
PKE}[N����1ri/1.8/system/REXML/Parsers/PullParser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::PullParser::new
is_singleton: true
name: new
params: (stream)
visibility: public
PKF}[��ɪ��2ri/1.8/system/REXML/Parsers/PullParser/pull-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::PullParser#pull
is_singleton: false
name: pull
params: ()
visibility: public
PKF}[��Ϻ�5ri/1.8/system/REXML/Parsers/StreamParser/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::StreamParser#parse
is_singleton: false
name: parse
params: ()
visibility: public
PKF}[(Sյ��<ri/1.8/system/REXML/Parsers/StreamParser/add_listener-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::StreamParser#add_listener
is_singleton: false
name: add_listener
params: ( listener )
visibility: public
PKF}[�`39��3ri/1.8/system/REXML/Parsers/StreamParser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::StreamParser::new
is_singleton: true
name: new
params: (source, listener)
visibility: public
PKF}[�-�dd@ri/1.8/system/REXML/Parsers/StreamParser/cdesc-StreamParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: REXML::Parsers::StreamParser
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_listener
- !ruby/object:RI::MethodSummary 
  name: parse
name: StreamParser
superclass: Object
PKF}[���``<ri/1.8/system/REXML/Parsers/TreeParser/cdesc-TreeParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: REXML::Parsers::TreeParser
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_listener
- !ruby/object:RI::MethodSummary 
  name: parse
name: TreeParser
superclass: Object
PKF}[�}����3ri/1.8/system/REXML/Parsers/TreeParser/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::TreeParser#parse
is_singleton: false
name: parse
params: ()
visibility: public
PKG}[N���:ri/1.8/system/REXML/Parsers/TreeParser/add_listener-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::TreeParser#add_listener
is_singleton: false
name: add_listener
params: ( listener )
visibility: public
PKG}[?�hN��1ri/1.8/system/REXML/Parsers/TreeParser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Parsers::TreeParser::new
is_singleton: true
name: new
params: ( source, build_context = Document.new )
visibility: public
PKH}[�d҃��*ri/1.8/system/REXML/DocType/context-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::DocType#context
is_singleton: false
name: context
params: ()
visibility: public
PKH}[|���ii)ri/1.8/system/REXML/DocType/system-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: This method retrieves the system identifier identifying the document's DTD
- !ruby/struct:SM::Flow::P 
  body: Method contributed by Henrik Martensson
full_name: REXML::DocType#system
is_singleton: false
name: system
params: ()
visibility: public
PKI}[ߩcY��)ri/1.8/system/REXML/DocType/entity-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::DocType#entity
is_singleton: false
name: entity
params: ( name )
visibility: public
PKI}[�����&ri/1.8/system/REXML/DocType/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::DocType#add
is_singleton: false
name: add
params: (child)
visibility: public
PKI}[eҦ��0ri/1.8/system/REXML/DocType/attributes_of-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::DocType#attributes_of
is_singleton: false
name: attributes_of
params: (element)
visibility: public
PKJ}[*&_���&ri/1.8/system/REXML/DocType/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Constructor
- !ruby/struct:SM::Flow::VERB 
  body: "  dt = DocType.new( 'foo', '-//I/Hate/External/IDs' )\n  # &lt;!DOCTYPE foo '-//I/Hate/External/IDs'&gt;\n  dt = DocType.new( doctype_to_clone )\n  # Incomplete.  Shallow clone of doctype\n"
- !ruby/struct:SM::Flow::P 
  body: "<tt>Note</tt> that the constructor:"
- !ruby/struct:SM::Flow::VERB 
  body: " Doctype.new( Source.new( &quot;&lt;!DOCTYPE foo 'bar'&gt;&quot; ) )\n"
- !ruby/struct:SM::Flow::P 
  body: is <em>deprecated</em>. Do not use it. It will probably disappear.
full_name: REXML::DocType::new
is_singleton: true
name: new
params: ( first, parent=nil )
visibility: public
PKJ}[��8|	|	.ri/1.8/system/REXML/DocType/cdesc-DocType.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: name is the name of the doctype external_id is the referenced DTD, if given
  name: entities
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: name is the name of the doctype external_id is the referenced DTD, if given
  name: external_id
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: name is the name of the doctype external_id is the referenced DTD, if given
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: name is the name of the doctype external_id is the referenced DTD, if given
  name: namespaces
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Represents an XML DOCTYPE declaration; that is, the contents of &lt;!DOCTYPE ... &gt;. DOCTYPES can be used to declare the DTD of a document, as well as being used to declare entities used in the document.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: START
  value: "\"<!DOCTYPE\""
- !ruby/object:RI::Constant 
  comment: 
  name: STOP
  value: "\">\""
- !ruby/object:RI::Constant 
  comment: 
  name: SYSTEM
  value: "\"SYSTEM\""
- !ruby/object:RI::Constant 
  comment: 
  name: PUBLIC
  value: "\"PUBLIC\""
- !ruby/object:RI::Constant 
  comment: 
  name: DEFAULT_ENTITIES
  value: "{        'gt'=>EntityConst::GT,        'lt'=>EntityConst::LT,        'quot'=>EntityConst::QUOT,        \"apos\"=>EntityConst::APOS"
full_name: REXML::DocType
includes: 
- !ruby/object:RI::IncludedModule 
  name: XMLTokens
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: attribute_of
- !ruby/object:RI::MethodSummary 
  name: attributes_of
- !ruby/object:RI::MethodSummary 
  name: clone
- !ruby/object:RI::MethodSummary 
  name: context
- !ruby/object:RI::MethodSummary 
  name: entity
- !ruby/object:RI::MethodSummary 
  name: node_type
- !ruby/object:RI::MethodSummary 
  name: notation
- !ruby/object:RI::MethodSummary 
  name: notations
- !ruby/object:RI::MethodSummary 
  name: public
- !ruby/object:RI::MethodSummary 
  name: strip_quotes
- !ruby/object:RI::MethodSummary 
  name: system
- !ruby/object:RI::MethodSummary 
  name: write
name: DocType
superclass: Parent
PKK}[��3M��,ri/1.8/system/REXML/DocType/node_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::DocType#node_type
is_singleton: false
name: node_type
params: ()
visibility: public
PKK}[�k�+��(ri/1.8/system/REXML/DocType/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "output:"
    body: Where to write the string
  - !ruby/struct:SM::Flow::LI 
    label: "indent:"
    body: An integer. If -1, no indentation will be used; otherwise, the indentation will be this number of spaces, and children will be indented an additional amount.
  - !ruby/struct:SM::Flow::LI 
    label: "transitive:"
    body: Ignored
  - !ruby/struct:SM::Flow::LI 
    label: "ie_hack:"
    body: Ignored
  type: :NOTE
full_name: REXML::DocType#write
is_singleton: false
name: write
params: ( output, indent=0, transitive=false, ie_hack=false )
visibility: public
PKL}[��)���,ri/1.8/system/REXML/DocType/notations-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: This method returns a list of notations that have been declared in the <em>internal</em> DTD subset. Notations in the external DTD subset are not listed.
- !ruby/struct:SM::Flow::P 
  body: Method contributed by Henrik Martensson
full_name: REXML::DocType#notations
is_singleton: false
name: notations
params: ()
visibility: public
PKL}[���jj)ri/1.8/system/REXML/DocType/public-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: This method retrieves the public identifier identifying the document's DTD.
- !ruby/struct:SM::Flow::P 
  body: Method contributed by Henrik Martensson
full_name: REXML::DocType#public
is_singleton: false
name: public
params: ()
visibility: public
PKL}[jg�t��(ri/1.8/system/REXML/DocType/clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::DocType#clone
is_singleton: false
name: clone
params: ()
visibility: public
PKM}[����/ri/1.8/system/REXML/DocType/attribute_of-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::DocType#attribute_of
is_singleton: false
name: attribute_of
params: (element, attribute)
visibility: public
PKN}[Ԟ����+ri/1.8/system/REXML/DocType/notation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Retrieves a named notation. Only notations declared in the internal DTD subset can be retrieved.
- !ruby/struct:SM::Flow::P 
  body: Method contributed by Henrik Martensson
full_name: REXML::DocType#notation
is_singleton: false
name: notation
params: (name)
visibility: public
PKN}[�'B/ri/1.8/system/REXML/DocType/strip_quotes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Method contributed by Henrik Martensson
full_name: REXML::DocType#strip_quotes
is_singleton: false
name: strip_quotes
params: (quoted_string)
visibility: private
PKO}[�Ȉ���7ri/1.8/system/REXML/Formatters/Pretty/write_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Formatters::Pretty#write_text
is_singleton: false
name: write_text
params: ( node, output )
visibility: protected
PKP}[�㟪��8ri/1.8/system/REXML/Formatters/Pretty/indent_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Formatters::Pretty#indent_text
is_singleton: false
name: indent_text
params: (string, level=1, style="\t", indentfirstline=true)
visibility: private
PKP}[�<s��0ri/1.8/system/REXML/Formatters/Pretty/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new pretty printer.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "output:"
    body: An object implementing '&lt;&lt;(String)', to which the output will be written.
  - !ruby/struct:SM::Flow::LI 
    label: "indentation:"
    body: An integer greater than 0. The indentation of each level will be this number of spaces. If this is &lt; 1, the behavior of this object is undefined. Defaults to 2.
  - !ruby/struct:SM::Flow::LI 
    label: "ie_hack:"
    body: If true, the printer will insert whitespace before closing empty tags, thereby allowing Internet Explorer's feeble XML parser to function. Defaults to false.
  type: :NOTE
full_name: REXML::Formatters::Pretty::new
is_singleton: true
name: new
params: ( indentation=2, ie_hack=false )
visibility: public
PKQ}[ǞN5��1ri/1.8/system/REXML/Formatters/Pretty/wrap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Formatters::Pretty#wrap
is_singleton: false
name: wrap
params: (string, width)
visibility: private
PKQ}[Ѷ�	��:ri/1.8/system/REXML/Formatters/Pretty/write_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Formatters::Pretty#write_element
is_singleton: false
name: write_element
params: (node, output)
visibility: protected
PKR}[��?��7ri/1.8/system/REXML/Formatters/Pretty/cdesc-Pretty.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: If compact is set to true, then the formatter will attempt to use as little space as possible
  name: compact
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The width of a page. Used for formatting text
  name: width
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pretty-prints an XML document. This destroys whitespace in text nodes and will insert carriage returns and indentations.
- !ruby/struct:SM::Flow::P 
  body: "TODO: Add an option to print attributes on new lines"
constants: []

full_name: REXML::Formatters::Pretty
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: indent_text
- !ruby/object:RI::MethodSummary 
  name: wrap
- !ruby/object:RI::MethodSummary 
  name: write_cdata
- !ruby/object:RI::MethodSummary 
  name: write_comment
- !ruby/object:RI::MethodSummary 
  name: write_document
- !ruby/object:RI::MethodSummary 
  name: write_element
- !ruby/object:RI::MethodSummary 
  name: write_text
name: Pretty
superclass: Default
PKR}[X%u���;ri/1.8/system/REXML/Formatters/Pretty/write_document-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Formatters::Pretty#write_document
is_singleton: false
name: write_document
params: ( node, output )
visibility: protected
PKR}[s��~��8ri/1.8/system/REXML/Formatters/Pretty/write_cdata-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Formatters::Pretty#write_cdata
is_singleton: false
name: write_cdata
params: ( node, output)
visibility: protected
PKS}[�&V���:ri/1.8/system/REXML/Formatters/Pretty/write_comment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Formatters::Pretty#write_comment
is_singleton: false
name: write_comment
params: ( node, output)
visibility: protected
PKS}[x��x��;ri/1.8/system/REXML/Formatters/Transitive/write_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Formatters::Transitive#write_text
is_singleton: false
name: write_text
params: ( node, output )
visibility: protected
PKS}[_p)%��4ri/1.8/system/REXML/Formatters/Transitive/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Formatters::Transitive::new
is_singleton: true
name: new
params: ( indentation=2 )
visibility: public
PKS}[j3����>ri/1.8/system/REXML/Formatters/Transitive/write_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Formatters::Transitive#write_element
is_singleton: false
name: write_element
params: ( node, output )
visibility: protected
PKS}[���`��?ri/1.8/system/REXML/Formatters/Transitive/cdesc-Transitive.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: The Transitive formatter writes an XML document that parses to an identical document as the source document. This means that no extra whitespace nodes are inserted, and whitespace within text nodes is preserved. Within these constraints, the document is pretty-printed, with whitespace inserted into the metadata to introduce formatting.
- !ruby/struct:SM::Flow::P 
  body: Note that this is only useful if the original XML is not already formatted. Since this formatter does not alter whitespace nodes, the results of formatting already formatted XML will be odd.
constants: []

full_name: REXML::Formatters::Transitive
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: write_element
- !ruby/object:RI::MethodSummary 
  name: write_text
name: Transitive
superclass: Default
PKS}[%���4ri/1.8/system/REXML/Formatters/cdesc-Formatters.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: REXML::Formatters
includes: []

instance_methods: []

name: Formatters
superclass: 
PKT}[B��"��8ri/1.8/system/REXML/Formatters/Default/write_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Formatters::Default#write_text
is_singleton: false
name: write_text
params: ( node, output )
visibility: protected
PKT}[�[D�!!1ri/1.8/system/REXML/Formatters/Default/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Prints out the XML document with no formatting -- except if id_hack is set.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "ie_hack:"
    body: If set to true, then inserts whitespace before the close of an empty tag, so that IE's bad XML parser doesn't choke.
  type: :NOTE
full_name: REXML::Formatters::Default::new
is_singleton: true
name: new
params: ( ie_hack=false )
visibility: public
PKT}[W��E883ri/1.8/system/REXML/Formatters/Default/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Writes the node to some output.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "node:"
    body: The node to write
  - !ruby/struct:SM::Flow::LI 
    label: "output:"
    body: A class implementing <tt>&amp;lt;&amp;lt;</tt>. Pass in an Output object to change the output encoding.
  type: :NOTE
full_name: REXML::Formatters::Default#write
is_singleton: false
name: write
params: ( node, output )
visibility: public
PKT}[ps_.��?ri/1.8/system/REXML/Formatters/Default/write_instruction-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Formatters::Default#write_instruction
is_singleton: false
name: write_instruction
params: ( node, output )
visibility: protected
PKT}[�=���;ri/1.8/system/REXML/Formatters/Default/write_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Formatters::Default#write_element
is_singleton: false
name: write_element
params: ( node, output )
visibility: protected
PKT}[�&�vv9ri/1.8/system/REXML/Formatters/Default/cdesc-Default.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: REXML::Formatters::Default
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: write
- !ruby/object:RI::MethodSummary 
  name: write_cdata
- !ruby/object:RI::MethodSummary 
  name: write_comment
- !ruby/object:RI::MethodSummary 
  name: write_document
- !ruby/object:RI::MethodSummary 
  name: write_element
- !ruby/object:RI::MethodSummary 
  name: write_instruction
- !ruby/object:RI::MethodSummary 
  name: write_text
name: Default
superclass: Object
PKT}[���J��<ri/1.8/system/REXML/Formatters/Default/write_document-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Formatters::Default#write_document
is_singleton: false
name: write_document
params: ( node, output )
visibility: protected
PKT}[�ˋ{��9ri/1.8/system/REXML/Formatters/Default/write_cdata-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Formatters::Default#write_cdata
is_singleton: false
name: write_cdata
params: ( node, output )
visibility: protected
PKT}[�Gm���;ri/1.8/system/REXML/Formatters/Default/write_comment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Formatters::Default#write_comment
is_singleton: false
name: write_comment
params: ( node, output )
visibility: protected
PKT}[���%%.ri/1.8/system/REXML/SyncEnumerator/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of enumerated Enumerable objects, i.e. the size of each row.
full_name: REXML::SyncEnumerator#size
is_singleton: false
name: size
params: ()
visibility: public
PKT}[lC2.ri/1.8/system/REXML/SyncEnumerator/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (*a[1..-1])
comment: 
- !ruby/struct:SM::Flow::P 
  body: Enumerates rows of the Enumerable objects.
full_name: REXML::SyncEnumerator#each
is_singleton: false
name: each
params: () {|*a[1..-1]| ...}
visibility: public
PKT}[-L#8��<ri/1.8/system/REXML/SyncEnumerator/cdesc-SyncEnumerator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: REXML::SyncEnumerator
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: length
- !ruby/object:RI::MethodSummary 
  name: size
name: SyncEnumerator
superclass: Object
PKT}[��H!))-ri/1.8/system/REXML/SyncEnumerator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new SyncEnumerator which enumerates rows of given Enumerable objects.
full_name: REXML::SyncEnumerator::new
is_singleton: true
name: new
params: (*enums)
visibility: public
PKT}[fa.�))0ri/1.8/system/REXML/SyncEnumerator/length-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of enumerated Enumerable objects, i.e. the size of each row.
full_name: REXML::SyncEnumerator#length
is_singleton: false
name: length
params: ()
visibility: public
PKT}[����*ri/1.8/system/REXML/XMLDecl/dowrite-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XMLDecl#dowrite
is_singleton: false
name: dowrite
params: ()
visibility: public
PKT}[�n���*ri/1.8/system/REXML/XMLDecl/content-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XMLDecl#content
is_singleton: false
name: content
params: (enc)
visibility: private
PKT}[S��\��*ri/1.8/system/REXML/XMLDecl/xmldecl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XMLDecl#xmldecl
is_singleton: false
name: xmldecl
params: (version, encoding, standalone)
visibility: public
PKT}[�BD.ri/1.8/system/REXML/XMLDecl/cdesc-XMLDecl.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: standalone
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: version
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: writeencoding
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: writethis
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: default
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: NEEDS DOCUMENTATION
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: DEFAULT_VERSION
  value: "\"1.0\";"
- !ruby/object:RI::Constant 
  comment: 
  name: DEFAULT_ENCODING
  value: "\"UTF-8\";"
- !ruby/object:RI::Constant 
  comment: 
  name: DEFAULT_STANDALONE
  value: "\"no\";"
- !ruby/object:RI::Constant 
  comment: 
  name: START
  value: "'<\\?xml';"
- !ruby/object:RI::Constant 
  comment: 
  name: STOP
  value: "'\\?>';"
full_name: REXML::XMLDecl
includes: 
- !ruby/object:RI::IncludedModule 
  name: Encoding
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: clone
- !ruby/object:RI::MethodSummary 
  name: content
- !ruby/object:RI::MethodSummary 
  name: dowrite
- !ruby/object:RI::MethodSummary 
  name: encoding=
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: node_type
- !ruby/object:RI::MethodSummary 
  name: nowrite
- !ruby/object:RI::MethodSummary 
  name: write
- !ruby/object:RI::MethodSummary 
  name: xmldecl
name: XMLDecl
superclass: Child
PKT}[������*ri/1.8/system/REXML/XMLDecl/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XMLDecl#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PKT}[�GuN��&ri/1.8/system/REXML/XMLDecl/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XMLDecl::new
is_singleton: true
name: new
params: (version=DEFAULT_VERSION, encoding=nil, standalone=nil)
visibility: public
PKT}[o�D���*ri/1.8/system/REXML/XMLDecl/default-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Only use this if you do not want the XML declaration to be written; this object is ignored by the XML writer. Otherwise, instantiate your own XMLDecl and add it to the document.
- !ruby/struct:SM::Flow::P 
  body: Note that XML 1.1 documents <b>must</b> include an XML declaration
full_name: REXML::XMLDecl::default
is_singleton: true
name: default
params: ()
visibility: public
PKT}[��j���,ri/1.8/system/REXML/XMLDecl/node_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XMLDecl#node_type
is_singleton: false
name: node_type
params: ()
visibility: public
PKT}[�6�&&(ri/1.8/system/REXML/XMLDecl/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "indent:"
    body: Ignored. There must be no whitespace before an XML declaration
  - !ruby/struct:SM::Flow::LI 
    label: "transitive:"
    body: Ignored
  - !ruby/struct:SM::Flow::LI 
    label: "ie_hack:"
    body: Ignored
  type: :NOTE
full_name: REXML::XMLDecl#write
is_singleton: false
name: write
params: (writer, indent=-1, transitive=false, ie_hack=false)
visibility: public
PKT}[3�G,��)ri/1.8/system/REXML/XMLDecl/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XMLDecl#==
is_singleton: false
name: ==
params: ( other )
visibility: public
PKT}[=�Ĭ�(ri/1.8/system/REXML/XMLDecl/clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XMLDecl#clone
is_singleton: false
name: clone
params: ()
visibility: public
PKT}[�c��.ri/1.8/system/REXML/XMLDecl/encoding%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XMLDecl#encoding=
is_singleton: false
name: encoding=
params: ( enc )
visibility: public
PKT}[�&r��*ri/1.8/system/REXML/XMLDecl/nowrite-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::XMLDecl#nowrite
is_singleton: false
name: nowrite
params: ()
visibility: public
PKT}[����,ri/1.8/system/REXML/Namespace/name%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the name and the expanded name
full_name: REXML::Namespace#name=
is_singleton: false
name: name=
params: ( name )
visibility: public
PKT}[��'Z==8ri/1.8/system/REXML/Namespace/fully_expanded_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Fully expand the name, even if the prefix wasn't specified in the source file.
full_name: REXML::Namespace#fully_expanded_name
is_singleton: false
name: fully_expanded_name
params: ()
visibility: public
PKT}[��0ri/1.8/system/REXML/Namespace/has_name%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compares names optionally WITH namespaces
full_name: REXML::Namespace#has_name?
is_singleton: false
name: has_name?
params: ( other, ns=nil )
visibility: public
PKT}[���2ri/1.8/system/REXML/Namespace/cdesc-Namespace.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The name of the object, valid if set
  name: expanded_name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The name of the object, valid if set
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The expanded name of the object, valid if name is set
  name: prefix
  rw: RW
class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds named attributes to an object.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: NAMESPLIT
  value: /^(?:(#{NCNAME_STR}):)?(#{NCNAME_STR})/u
full_name: REXML::Namespace
includes: 
- !ruby/object:RI::IncludedModule 
  name: XMLTokens
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: fully_expanded_name
- !ruby/object:RI::MethodSummary 
  name: has_name?
- !ruby/object:RI::MethodSummary 
  name: name=
name: Namespace
superclass: 
PKT}[Xݭ���(ri/1.8/system/REXML/Elements/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of <tt>Element</tt> children of the parent object.
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new '&lt;a&gt;sean&lt;b/&gt;elliott&lt;b/&gt;russell&lt;b/&gt;&lt;/a&gt;'\n doc.root.size            #-&gt; 6, 3 element and 3 text nodes\n doc.root.elements.size   #-&gt; 3\n"
full_name: REXML::Elements#size
is_singleton: false
name: size
params: ()
visibility: public
PKT}[�Y���*ri/1.8/system/REXML/Elements/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Fetches a child element. Filters only Element children, regardless of the XPath match.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "index:"
    body: the search parameter. This is either an Integer, which will be used to find the index'th child Element, or an XPath, which will be used to search for the Element. <em>Because of the nature of XPath searches, any element in the connected XML document can be fetched through any other element.</em> <b>The Integer index is 1-based, not 0-based.</b> This means that the first child element is at index 1, not 0, and the +n+th element is at index <tt>n</tt>, not <tt>n-1</tt>. This is because XPath indexes element children starting from 1, not 0, and the indexes should be the same.
  - !ruby/struct:SM::Flow::LI 
    label: "name:"
    body: optional, and only used in the first argument is an Integer. In that case, the index'th child Element that has the supplied name will be returned. Note again that the indexes start at 1.
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: the first matching Element, or nil if no child matched
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new '&lt;a&gt;&lt;b/&gt;&lt;c id=&quot;1&quot;/&gt;&lt;c id=&quot;2&quot;/&gt;&lt;d/&gt;&lt;/a&gt;'\n doc.root.elements[1]       #-&gt; &lt;b/&gt;\n doc.root.elements['c']     #-&gt; &lt;c id=&quot;1&quot;/&gt;\n doc.root.elements[2,'c']   #-&gt; &lt;c id=&quot;2&quot;/&gt;\n"
full_name: REXML::Elements#[]
is_singleton: false
name: "[]"
params: ( index, name=nil)
visibility: public
PKT}[�m)--,ri/1.8/system/REXML/Elements/empty%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if there are no <tt>Element</tt> children, <tt>false</tt> otherwise
full_name: REXML::Elements#empty?
is_singleton: false
name: empty?
params: ()
visibility: public
PKT}[�*^��(ri/1.8/system/REXML/Elements/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: e if e.kind_of? Element
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates through all of the child Elements, optionally filtering them by a given XPath
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "xpath:"
    body: optional. If supplied, this is a String XPath, and is used to filter the children, so that only matching children are yielded. Note that XPaths are automatically filtered for Elements, so that non-Element children will not be yielded
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new '&lt;a&gt;&lt;b/&gt;&lt;c/&gt;&lt;d/&gt;sean&lt;b/&gt;&lt;c/&gt;&lt;d/&gt;&lt;/a&gt;'\n doc.root.each {|e|p e}       #-&gt; Yields b, c, d, b, c, d elements\n doc.root.each('b') {|e|p e}  #-&gt; Yields b, b elements\n doc.root.each('child::node()')  {|e|p e}\n #-&gt; Yields &lt;b/&gt;, &lt;c/&gt;, &lt;d/&gt;, &lt;b/&gt;, &lt;c/&gt;, &lt;d/&gt;\n XPath.each(doc.root, 'child::node()', &amp;block)\n #-&gt; Yields &lt;b/&gt;, &lt;c/&gt;, &lt;d/&gt;, sean, &lt;b/&gt;, &lt;c/&gt;, &lt;d/&gt;\n"
full_name: REXML::Elements#each
is_singleton: false
name: each
params: ( xpath=nil, &block) {|e if e.kind_of? Element| ...}
visibility: public
PKT}[�fc]		(ri/1.8/system/REXML/Elements/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an Array of Element children. An XPath may be supplied to filter the children. Only Element children are returned, even if the supplied XPath matches non-Element children.
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new '&lt;a&gt;sean&lt;b/&gt;elliott&lt;c/&gt;&lt;/a&gt;'\n doc.root.elements.to_a                  #-&gt; [ &lt;b/&gt;, &lt;c/&gt; ]\n doc.root.elements.to_a(&quot;child::node()&quot;) #-&gt; [ &lt;b/&gt;, &lt;c/&gt; ]\n XPath.match(doc.root, &quot;child::node()&quot;)  #-&gt; [ sean, &lt;b/&gt;, elliott, &lt;c/&gt; ]\n"
full_name: REXML::Elements#to_a
is_singleton: false
name: to_a
params: ( xpath=nil )
visibility: public
PKT}[��.ri/1.8/system/REXML/Elements/literalize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Private helper class. Removes quotes from quoted strings
full_name: REXML::Elements#literalize
is_singleton: false
name: literalize
params: (name)
visibility: private
PKT}[Ҋ�8��*ri/1.8/system/REXML/Elements/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes a child Element
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "element:"
    body: Either an Element, which is removed directly; an xpath, where the first matching child is removed; or an Integer, where the n'th Element is removed.
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: the removed child
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new '&lt;a&gt;&lt;b/&gt;&lt;c/&gt;&lt;c id=&quot;1&quot;/&gt;&lt;/a&gt;'\n b = doc.root.elements[1]\n doc.root.elements.delete b           #-&gt; &lt;a&gt;&lt;c/&gt;&lt;c id=&quot;1&quot;/&gt;&lt;/a&gt;\n doc.elements.delete(&quot;a/c[@id='1']&quot;)  #-&gt; &lt;a&gt;&lt;c/&gt;&lt;/a&gt;\n doc.root.elements.delete 1           #-&gt; &lt;a/&gt;\n"
full_name: REXML::Elements#delete
is_singleton: false
name: delete
params: (element)
visibility: public
PKT}[�����+ri/1.8/system/REXML/Elements/collect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (e)
comment: 
full_name: REXML::Elements#collect
is_singleton: false
name: collect
params: ( xpath=nil, &block ) {|e| ...}
visibility: public
PKT}[�y`���)ri/1.8/system/REXML/Elements/index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the index of the supplied child (starting at 1), or -1 if the element is not a child
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "element:"
    body: an <tt>Element</tt> child
  type: :NOTE
full_name: REXML::Elements#index
is_singleton: false
name: index
params: (element)
visibility: public
PKT}[�pE4II'ri/1.8/system/REXML/Elements/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: "<<"
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds an element
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "element:"
    body: if supplied, is either an Element, String, or Source (see Element.initialize). If not supplied or nil, a new, default Element will be constructed
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: the added Element
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " a = Element.new('a')\n a.elements.add(Element.new('b'))  #-&gt; &lt;a&gt;&lt;b/&gt;&lt;/a&gt;\n a.elements.add('c')               #-&gt; &lt;a&gt;&lt;b/&gt;&lt;c/&gt;&lt;/a&gt;\n"
full_name: REXML::Elements#add
is_singleton: false
name: add
params: (element=nil)
visibility: public
PKT}[e�p�jj'ri/1.8/system/REXML/Elements/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Constructor
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "parent:"
    body: the parent Element
  type: :NOTE
full_name: REXML::Elements::new
is_singleton: true
name: new
params: (parent)
visibility: public
PKT}[�a5��*ri/1.8/system/REXML/Elements/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #add"
full_name: REXML::Elements#<<
is_singleton: false
name: "<<"
params: (element=nil)
visibility: public
PKT}[ON��0ri/1.8/system/REXML/Elements/cdesc-Elements.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A class which provides filtering of children for Elements, and XPath search support. You are expected to only encounter this class as the <tt>element.elements</tt> object. Therefore, you are <em>not</em> expected to instantiate this yourself.
constants: []

full_name: REXML::Elements
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: collect
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: delete_all
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: empty?
- !ruby/object:RI::MethodSummary 
  name: index
- !ruby/object:RI::MethodSummary 
  name: inject
- !ruby/object:RI::MethodSummary 
  name: literalize
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: to_a
name: Elements
superclass: Object
PKT}[lj>���*ri/1.8/system/REXML/Elements/inject-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ( initial, e )
comment: 
full_name: REXML::Elements#inject
is_singleton: false
name: inject
params: ( xpath=nil, initial=nil, &block ) {|initial, e| ...}
visibility: public
PKT}[G�+dll-ri/1.8/system/REXML/Elements/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets an element, replacing any previous matching element. If no existing element is found ,the element is added.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "index:"
    body: Used to find a matching element to replace. See []().
  - !ruby/struct:SM::Flow::LI 
    label: "element:"
    body: The element to replace the existing element with the previous element
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: nil if no previous element was found.
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new '&lt;a/&gt;'\n doc.root.elements[10] = Element.new('b')    #-&gt; &lt;a&gt;&lt;b/&gt;&lt;/a&gt;\n doc.root.elements[1]                        #-&gt; &lt;b/&gt;\n doc.root.elements[1] = Element.new('c')     #-&gt; &lt;a&gt;&lt;c/&gt;&lt;/a&gt;\n doc.root.elements['c'] = Element.new('d')   #-&gt; &lt;a&gt;&lt;d/&gt;&lt;/a&gt;\n"
full_name: REXML::Elements#[]=
is_singleton: false
name: "[]="
params: ( index, element )
visibility: public
PKT}[����...ri/1.8/system/REXML/Elements/delete_all-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes multiple elements. Filters for Element children, regardless of XPath matching.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "xpath:"
    body: all elements matching this String path are removed.
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: an Array of Elements that have been removed
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new '&lt;a&gt;&lt;c/&gt;&lt;c/&gt;&lt;c/&gt;&lt;c/&gt;&lt;/a&gt;'\n deleted = doc.elements.delete_all 'a/c' #-&gt; [&lt;c/&gt;, &lt;c/&gt;, &lt;c/&gt;, &lt;c/&gt;]\n"
full_name: REXML::Elements#delete_all
is_singleton: false
name: delete_all
params: ( xpath )
visibility: public
PKT}[;�?��)ri/1.8/system/REXML/Encoding/apply-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Encoding::apply
is_singleton: true
name: apply
params: (obj, enc)
visibility: public
PKU}[��m���3ri/1.8/system/REXML/Encoding/encoding_method-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Encoding::encoding_method
is_singleton: true
name: encoding_method
params: (enc)
visibility: public
PKU}[7.��0ri/1.8/system/REXML/Encoding/encode_ascii-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert from UTF-8
full_name: REXML::Encoding#encode_ascii
is_singleton: false
name: encode_ascii
params: (content)
visibility: public
PKU}[��5��0ri/1.8/system/REXML/Encoding/decode_unile-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Encoding#decode_unile
is_singleton: false
name: decode_unile
params: (str)
visibility: public
PKU}[2u)��,ri/1.8/system/REXML/Encoding/register-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Encoding::register
is_singleton: true
name: register
params: (enc, &block)
visibility: public
PKU}[�)�R��/ri/1.8/system/REXML/Encoding/encode_utf8-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Encoding#encode_utf8
is_singleton: false
name: encode_utf8
params: (content)
visibility: public
PKU}[�����0ri/1.8/system/REXML/Encoding/decode_eucjp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Encoding#decode_eucjp
is_singleton: false
name: decode_eucjp
params: (str)
visibility: public
PKU}[��q���0ri/1.8/system/REXML/Encoding/decode_ascii-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert to UTF-8
full_name: REXML::Encoding#decode_ascii
is_singleton: false
name: decode_ascii
params: (str)
visibility: public
PKU}[S-�B��/ri/1.8/system/REXML/Encoding/encode_sjis-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Encoding#encode_sjis
is_singleton: false
name: encode_sjis
params: (content)
visibility: public
PKU}[5�t��4ri/1.8/system/REXML/Encoding/from_iso_8859_15-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert to UTF-8
full_name: REXML::Encoding#from_iso_8859_15
is_singleton: false
name: from_iso_8859_15
params: (str)
visibility: public
PKU}[s])s��/ri/1.8/system/REXML/Encoding/decode_utf8-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Encoding#decode_utf8
is_singleton: false
name: decode_utf8
params: (str)
visibility: public
PKU}[�C�T��0ri/1.8/system/REXML/Encoding/encode_unile-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Encoding#encode_unile
is_singleton: false
name: encode_unile
params: (content)
visibility: public
PKU}[f��0ri/1.8/system/REXML/Encoding/decode_utf16-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Encoding#decode_utf16
is_singleton: false
name: decode_utf16
params: (str)
visibility: public
PKU}[v\���0ri/1.8/system/REXML/Encoding/encode_utf16-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Encoding#encode_utf16
is_singleton: false
name: encode_utf16
params: (content)
visibility: public
PKU}[*�fc��/ri/1.8/system/REXML/Encoding/decode_sjis-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Encoding#decode_sjis
is_singleton: false
name: decode_sjis
params: (str)
visibility: public
PKU}[�Y� ��0ri/1.8/system/REXML/Encoding/decode_iconv-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Encoding#decode_iconv
is_singleton: false
name: decode_iconv
params: (str)
visibility: public
PKU}[p>T���0ri/1.8/system/REXML/Encoding/encode_eucjp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Encoding#encode_eucjp
is_singleton: false
name: encode_eucjp
params: (content)
visibility: public
PKU}[n�,��1ri/1.8/system/REXML/Encoding/decode_cp1252-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert to UTF-8
full_name: REXML::Encoding#decode_cp1252
is_singleton: false
name: decode_cp1252
params: (str)
visibility: public
PKU}[-����0ri/1.8/system/REXML/Encoding/encode_iconv-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Encoding#encode_iconv
is_singleton: false
name: encode_iconv
params: (content)
visibility: public
PKU}[S����2ri/1.8/system/REXML/Encoding/to_iso_8859_15-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert from UTF-8
full_name: REXML::Encoding#to_iso_8859_15
is_singleton: false
name: to_iso_8859_15
params: (content)
visibility: public
PKU}[CB
���1ri/1.8/system/REXML/Encoding/encode_cp1252-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert from UTF-8
full_name: REXML::Encoding#encode_cp1252
is_singleton: false
name: encode_cp1252
params: (content)
visibility: public
PKU}[����	�	0ri/1.8/system/REXML/Encoding/cdesc-Encoding.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: ID ---&gt; Encoding name
  name: encoding
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: apply
- !ruby/object:RI::MethodSummary 
  name: encoding_method
- !ruby/object:RI::MethodSummary 
  name: register
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Native, default format is UTF-8, so it is declared here rather than in an encodings/ definition.
  name: UTF_8
  value: "'UTF-8'"
- !ruby/object:RI::Constant 
  comment: 
  name: UTF_16
  value: "'UTF-16'"
- !ruby/object:RI::Constant 
  comment: 
  name: UNILE
  value: "'UNILE'"
- !ruby/object:RI::Constant 
  comment: 
  name: SJISTOU8
  value: "'-Swm0x'"
- !ruby/object:RI::Constant 
  comment: 
  name: U8TOSJIS
  value: "'-Wsm0x'"
- !ruby/object:RI::Constant 
  comment: 
  name: EUCTOU8
  value: "'-Ewm0'"
- !ruby/object:RI::Constant 
  comment: 
  name: U8TOEUC
  value: "'-Wem0'"
full_name: REXML::Encoding
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: check_encoding
- !ruby/object:RI::MethodSummary 
  name: decode_ascii
- !ruby/object:RI::MethodSummary 
  name: decode_cp1252
- !ruby/object:RI::MethodSummary 
  name: decode_eucjp
- !ruby/object:RI::MethodSummary 
  name: decode_eucjp
- !ruby/object:RI::MethodSummary 
  name: decode_iconv
- !ruby/object:RI::MethodSummary 
  name: decode_sjis
- !ruby/object:RI::MethodSummary 
  name: decode_sjis
- !ruby/object:RI::MethodSummary 
  name: decode_unile
- !ruby/object:RI::MethodSummary 
  name: decode_utf16
- !ruby/object:RI::MethodSummary 
  name: decode_utf8
- !ruby/object:RI::MethodSummary 
  name: encode_ascii
- !ruby/object:RI::MethodSummary 
  name: encode_cp1252
- !ruby/object:RI::MethodSummary 
  name: encode_eucjp
- !ruby/object:RI::MethodSummary 
  name: encode_eucjp
- !ruby/object:RI::MethodSummary 
  name: encode_iconv
- !ruby/object:RI::MethodSummary 
  name: encode_sjis
- !ruby/object:RI::MethodSummary 
  name: encode_sjis
- !ruby/object:RI::MethodSummary 
  name: encode_unile
- !ruby/object:RI::MethodSummary 
  name: encode_utf16
- !ruby/object:RI::MethodSummary 
  name: encode_utf8
- !ruby/object:RI::MethodSummary 
  name: encoding=
- !ruby/object:RI::MethodSummary 
  name: from_iso_8859_15
- !ruby/object:RI::MethodSummary 
  name: to_iso_8859_15
name: Encoding
superclass: 
PKU}[N�Ҟ��2ri/1.8/system/REXML/Encoding/check_encoding-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Encoding#check_encoding
is_singleton: false
name: check_encoding
params: (str)
visibility: public
PKU}[{�Tݺ�/ri/1.8/system/REXML/Encoding/encoding%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Encoding#encoding=
is_singleton: false
name: encoding=
params: ( enc )
visibility: public
PKU}[<�����2ri/1.8/system/REXML/Light/Node/namespace%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#namespace=
is_singleton: false
name: namespace=
params: ( namespace )
visibility: public
PKU}[��<��*ri/1.8/system/REXML/Light/Node/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#size
is_singleton: false
name: size
params: ()
visibility: public
PKU}[C_]��,ri/1.8/system/REXML/Light/Node/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#[]
is_singleton: false
name: "[]"
params: ( reference, ns=nil )
visibility: public
PKU}[>�,`��,ri/1.8/system/REXML/Light/Node/%3d%7e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#=~
is_singleton: false
name: =~
params: ( path )
visibility: public
PKU}[���*ri/1.8/system/REXML/Light/Node/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ( at(x+4) )
comment: 
full_name: REXML::Light::Node#each
is_singleton: false
name: each
params: ( &block ) {|at(x+4 )| ...}
visibility: public
PKU}[�&m���2ri/1.8/system/REXML/Light/Node/namespace_of-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#namespace_of
is_singleton: false
name: namespace_of
params: ( node, prefix=nil )
visibility: private
PKU}[e���,ri/1.8/system/REXML/Light/Node/prefix-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#prefix
is_singleton: false
name: prefix
params: ( namespace=nil )
visibility: public
PKU}[u����/ri/1.8/system/REXML/Light/Node/namespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#namespace
is_singleton: false
name: namespace
params: ( prefix=prefix() )
visibility: public
PKU}[�Y���/ri/1.8/system/REXML/Light/Node/parent%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#parent=
is_singleton: false
name: parent=
params: ( node )
visibility: public
PKU}[JMf-��*ri/1.8/system/REXML/Light/Node/root-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#root
is_singleton: false
name: root
params: ()
visibility: public
PKU}[�I;��-ri/1.8/system/REXML/Light/Node/name%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#name=
is_singleton: false
name: name=
params: ( name_str, ns=nil )
visibility: public
PKU}[�F�S��1ri/1.8/system/REXML/Light/Node/has_name%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#has_name?
is_singleton: false
name: has_name?
params: ( name, namespace = '' )
visibility: public
PKU}[&Ed���/ri/1.8/system/REXML/Light/Node/prefix_of-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#prefix_of
is_singleton: false
name: prefix_of
params: ( node, namespace=nil )
visibility: private
PKU}[�6����)ri/1.8/system/REXML/Light/Node/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new element.
full_name: REXML::Light::Node::new
is_singleton: true
name: new
params: (node=nil)
visibility: public
PKU}[���C��-ri/1.8/system/REXML/Light/Node/text%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#text=
is_singleton: false
name: text=
params: ( foo )
visibility: public
PKU}[���j��.ri/1.8/system/REXML/Light/Node/children-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#children
is_singleton: false
name: children
params: ()
visibility: public
PKU}[3;���/ri/1.8/system/REXML/Light/Node/node_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#node_type
is_singleton: false
name: node_type
params: ()
visibility: public
PKU}[nğ$$.ri/1.8/system/REXML/Light/Node/cdesc-Node.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Represents a tagged XML element. Elements are characterized by having children, attributes, and names, and can themselves be children.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: NAMESPLIT
  value: /^(?:(#{XMLTokens::NCNAME_STR}):)?(#{XMLTokens::NCNAME_STR})/u
- !ruby/object:RI::Constant 
  comment: 
  name: PARENTS
  value: "[ :element, :document, :doctype ]"
full_name: REXML::Light::Node
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: =~
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: children
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: has_name?
- !ruby/object:RI::MethodSummary 
  name: local_name
- !ruby/object:RI::MethodSummary 
  name: local_name=
- !ruby/object:RI::MethodSummary 
  name: name
- !ruby/object:RI::MethodSummary 
  name: name=
- !ruby/object:RI::MethodSummary 
  name: namespace
- !ruby/object:RI::MethodSummary 
  name: namespace=
- !ruby/object:RI::MethodSummary 
  name: namespace_of
- !ruby/object:RI::MethodSummary 
  name: namesplit
- !ruby/object:RI::MethodSummary 
  name: node_type
- !ruby/object:RI::MethodSummary 
  name: parent
- !ruby/object:RI::MethodSummary 
  name: parent=
- !ruby/object:RI::MethodSummary 
  name: prefix
- !ruby/object:RI::MethodSummary 
  name: prefix_of
- !ruby/object:RI::MethodSummary 
  name: root
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: text=
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Node
superclass: Object
PKU}[����,ri/1.8/system/REXML/Light/Node/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Append a child to this element, optionally under a provided namespace. The namespace argument is ignored if the element argument is an Element object. Otherwise, the element argument is a string, the namespace (if provided) is the namespace the element is created in.
full_name: REXML::Light::Node#<<
is_singleton: false
name: "<<"
params: (element)
visibility: public
PKU}[�jvͺ�0ri/1.8/system/REXML/Light/Node/local_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#local_name
is_singleton: false
name: local_name
params: ()
visibility: public
PKU}[Ǥ���*ri/1.8/system/REXML/Light/Node/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PKU}[�%���*ri/1.8/system/REXML/Light/Node/name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#name
is_singleton: false
name: name
params: ()
visibility: public
PKU}[8N����/ri/1.8/system/REXML/Light/Node/namesplit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#namesplit
is_singleton: false
name: namesplit
params: ()
visibility: private
PKU}[rȌn

/ri/1.8/system/REXML/Light/Node/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Doesn't handle namespaces yet
full_name: REXML::Light::Node#[]=
is_singleton: false
name: "[]="
params: ( reference, ns, value=nil )
visibility: public
PKU}[�!�_��3ri/1.8/system/REXML/Light/Node/local_name%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#local_name=
is_singleton: false
name: local_name=
params: ( name_str )
visibility: public
PKU}[�����,ri/1.8/system/REXML/Light/Node/parent-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Light::Node#parent
is_singleton: false
name: parent
params: ()
visibility: public
PKU}[
��M��*ri/1.8/system/REXML/Light/cdesc-Light.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: REXML::Light
includes: []

instance_methods: []

name: Light
superclass: 
PKU}[m΀���0ri/1.8/system/REXML/Functions/starts_with-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Fixed by Mike Stok
full_name: REXML::Functions::starts_with
is_singleton: true
name: starts_with
params: ( string, test )
visibility: public
PKU}[�]���1ri/1.8/system/REXML/Functions/string_value-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Functions::string_value
is_singleton: true
name: string_value
params: ( o )
visibility: public
PKU}[��ʴ��2ri/1.8/system/REXML/Functions/string_length-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: UNTESTED
full_name: REXML::Functions::string_length
is_singleton: true
name: string_length
params: ( string )
visibility: public
PKU}[A���*ri/1.8/system/REXML/Functions/false-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: UNTESTED
full_name: REXML::Functions::false
is_singleton: true
name: "false"
params: ( )
visibility: public
PKV}[\B G��/ri/1.8/system/REXML/Functions/local_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: UNTESTED
full_name: REXML::Functions::local_name
is_singleton: true
name: local_name
params: ( node_set=nil )
visibility: public
PKV}[��&��+ri/1.8/system/REXML/Functions/number-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: a string that consists of optional whitespace followed by an optional minus sign followed by a Number followed by whitespace is converted to the IEEE 754 number that is nearest (according to the IEEE 754 round-to-nearest rule) to the mathematical value represented by the string; any other string is converted to NaN
- !ruby/struct:SM::Flow::P 
  body: boolean true is converted to 1; boolean false is converted to 0
- !ruby/struct:SM::Flow::P 
  body: a node-set is first converted to a string as if by a call to the string function and then converted in the same way as a string argument
- !ruby/struct:SM::Flow::P 
  body: an object of a type other than the four basic types is converted to a number in a way that is dependent on that type
full_name: REXML::Functions::number
is_singleton: true
name: number
params: ( object=nil )
visibility: public
PKV}[/tx���*ri/1.8/system/REXML/Functions/count-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Functions::count
is_singleton: true
name: count
params: ( node_set )
visibility: public
PKV}[t��y��+ri/1.8/system/REXML/Functions/string-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: A node-set is converted to a string by returning the string-value of the node in the node-set that is first in document order. If the node-set is empty, an empty string is returned.
- !ruby/struct:SM::Flow::P 
  body: A number is converted to a string as follows
- !ruby/struct:SM::Flow::P 
  body: NaN is converted to the string NaN
- !ruby/struct:SM::Flow::P 
  body: positive zero is converted to the string 0
- !ruby/struct:SM::Flow::P 
  body: negative zero is converted to the string 0
- !ruby/struct:SM::Flow::P 
  body: positive infinity is converted to the string Infinity
- !ruby/struct:SM::Flow::P 
  body: negative infinity is converted to the string -Infinity
- !ruby/struct:SM::Flow::P 
  body: if the number is an integer, the number is represented in decimal form as a Number with no decimal point and no leading zeros, preceded by a minus sign (-) if the number is negative
- !ruby/struct:SM::Flow::P 
  body: otherwise, the number is represented in decimal form as a Number including a decimal point with at least one digit before the decimal point and at least one digit after the decimal point, preceded by a minus sign (-) if the number is negative; there must be no leading zeros before the decimal point apart possibly from the one required digit immediately before the decimal point; beyond the one required digit after the decimal point there must be as many, but only as many, more digits as are needed to uniquely distinguish the number from all other IEEE 754 numeric values.
- !ruby/struct:SM::Flow::P 
  body: The boolean false value is converted to the string false. The boolean true value is converted to the string true.
- !ruby/struct:SM::Flow::P 
  body: An object of a type other than the four basic types is converted to a string in a way that is dependent on that type.
full_name: REXML::Functions::string
is_singleton: true
name: string
params: ( object=nil )
visibility: public
PKV}[��_

4ri/1.8/system/REXML/Functions/substring_after-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Kouhei fixed this too
full_name: REXML::Functions::substring_after
is_singleton: true
name: substring_after
params: ( string, test )
visibility: public
PKV}[%�R���)ri/1.8/system/REXML/Functions/last-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Functions::last
is_singleton: true
name: last
params: ( )
visibility: public
PKV}[d7j�.ri/1.8/system/REXML/Functions/translate-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: This is entirely Mike Stok's beast
full_name: REXML::Functions::translate
is_singleton: true
name: translate
params: ( string, tr1, tr2 )
visibility: public
PKV}[�/)$��.ri/1.8/system/REXML/Functions/variables-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Functions::variables
is_singleton: true
name: variables
params: ()
visibility: public
PKV}[@�Z���*ri/1.8/system/REXML/Functions/floor-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Functions::floor
is_singleton: true
name: floor
params: ( number )
visibility: public
PKV}[�����+ri/1.8/system/REXML/Functions/concat-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: UNTESTED
full_name: REXML::Functions::concat
is_singleton: true
name: concat
params: ( *objects )
visibility: public
PKV}[������,ri/1.8/system/REXML/Functions/boolean-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: UNTESTED
full_name: REXML::Functions::boolean
is_singleton: true
name: boolean
params: ( object=nil )
visibility: public
PKV}[ͼ�{Z
Z
2ri/1.8/system/REXML/Functions/cdesc-Functions.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: boolean
- !ruby/object:RI::MethodSummary 
  name: ceiling
- !ruby/object:RI::MethodSummary 
  name: compare_language
- !ruby/object:RI::MethodSummary 
  name: concat
- !ruby/object:RI::MethodSummary 
  name: contains
- !ruby/object:RI::MethodSummary 
  name: context=
- !ruby/object:RI::MethodSummary 
  name: count
- !ruby/object:RI::MethodSummary 
  name: "false"
- !ruby/object:RI::MethodSummary 
  name: floor
- !ruby/object:RI::MethodSummary 
  name: get_namespace
- !ruby/object:RI::MethodSummary 
  name: id
- !ruby/object:RI::MethodSummary 
  name: lang
- !ruby/object:RI::MethodSummary 
  name: last
- !ruby/object:RI::MethodSummary 
  name: local_name
- !ruby/object:RI::MethodSummary 
  name: method_missing
- !ruby/object:RI::MethodSummary 
  name: name
- !ruby/object:RI::MethodSummary 
  name: namespace_context
- !ruby/object:RI::MethodSummary 
  name: namespace_context=
- !ruby/object:RI::MethodSummary 
  name: namespace_uri
- !ruby/object:RI::MethodSummary 
  name: normalize_space
- !ruby/object:RI::MethodSummary 
  name: not
- !ruby/object:RI::MethodSummary 
  name: number
- !ruby/object:RI::MethodSummary 
  name: position
- !ruby/object:RI::MethodSummary 
  name: processing_instruction
- !ruby/object:RI::MethodSummary 
  name: round
- !ruby/object:RI::MethodSummary 
  name: starts_with
- !ruby/object:RI::MethodSummary 
  name: string
- !ruby/object:RI::MethodSummary 
  name: string_length
- !ruby/object:RI::MethodSummary 
  name: string_value
- !ruby/object:RI::MethodSummary 
  name: substring
- !ruby/object:RI::MethodSummary 
  name: substring_after
- !ruby/object:RI::MethodSummary 
  name: substring_before
- !ruby/object:RI::MethodSummary 
  name: sum
- !ruby/object:RI::MethodSummary 
  name: text
- !ruby/object:RI::MethodSummary 
  name: translate
- !ruby/object:RI::MethodSummary 
  name: "true"
- !ruby/object:RI::MethodSummary 
  name: variables
- !ruby/object:RI::MethodSummary 
  name: variables=
comment: 
- !ruby/struct:SM::Flow::P 
  body: "If you add a method, keep in mind two things: (1) the first argument will always be a list of nodes from which to filter. In the case of context methods (such as position), the function should return an array with a value for each child in the array. (2) all method calls from XML will have &quot;-&quot; replaced with &quot;_&quot;. Therefore, in XML, &quot;local-name()&quot; is identical (and actually becomes) &quot;local_name()&quot;"
constants: []

full_name: REXML::Functions
includes: []

instance_methods: []

name: Functions
superclass: 
PKV}[\')(ll.ri/1.8/system/REXML/Functions/substring-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Take equal portions of Mike Stok and Sean Russell; mix vigorously, and pour into a tall, chilled glass. Serves 10,000.
full_name: REXML::Functions::substring
is_singleton: true
name: substring
params: ( string, start, length=nil )
visibility: public
PKV}[��M���(ri/1.8/system/REXML/Functions/not-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: UNTESTED
full_name: REXML::Functions::not
is_singleton: true
name: not
params: ( object )
visibility: public
PKV}[tp�t5ri/1.8/system/REXML/Functions/substring_before-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Kouhei fixed this
full_name: REXML::Functions::substring_before
is_singleton: true
name: substring_before
params: ( string, test )
visibility: public
PKV}[\���)ri/1.8/system/REXML/Functions/true-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: UNTESTED
full_name: REXML::Functions::true
is_singleton: true
name: "true"
params: ( )
visibility: public
PKV}[�b5G��2ri/1.8/system/REXML/Functions/namespace_uri-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Functions::namespace_uri
is_singleton: true
name: namespace_uri
params: ( node_set=nil )
visibility: public
PKV}[�;��6ri/1.8/system/REXML/Functions/namespace_context-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Functions::namespace_context
is_singleton: true
name: namespace_context
params: ()
visibility: public
PKV}[��5ǭ�)ri/1.8/system/REXML/Functions/text-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Functions::text
is_singleton: true
name: text
params: ( )
visibility: public
PKW}[��U���(ri/1.8/system/REXML/Functions/sum-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Functions::sum
is_singleton: true
name: sum
params: ( nodes )
visibility: public
PKW}[C�]��*ri/1.8/system/REXML/Functions/round-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Functions::round
is_singleton: true
name: round
params: ( number )
visibility: public
PKW}[�����1ri/1.8/system/REXML/Functions/variables%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Functions::variables=
is_singleton: true
name: variables=
params: (x)
visibility: public
PKW}[��qε�-ri/1.8/system/REXML/Functions/position-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Functions::position
is_singleton: true
name: position
params: ( )
visibility: public
PKW}[IK`���)ri/1.8/system/REXML/Functions/lang-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: UNTESTED
full_name: REXML::Functions::lang
is_singleton: true
name: lang
params: ( language )
visibility: public
PKW}[��/��9ri/1.8/system/REXML/Functions/namespace_context%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Functions::namespace_context=
is_singleton: true
name: namespace_context=
params: (x)
visibility: public
PKW}[�����;ri/1.8/system/REXML/Functions/processing_instruction-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Functions::processing_instruction
is_singleton: true
name: processing_instruction
params: ( node )
visibility: public
PKW}[PC�O��3ri/1.8/system/REXML/Functions/method_missing-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Functions::method_missing
is_singleton: true
name: method_missing
params: ( id )
visibility: public
PKW}[��)���,ri/1.8/system/REXML/Functions/ceiling-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Functions::ceiling
is_singleton: true
name: ceiling
params: ( number )
visibility: public
PKW}[)�uA��/ri/1.8/system/REXML/Functions/context%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Functions::context=
is_singleton: true
name: context=
params: (value)
visibility: public
PKW}[�ɔ��5ri/1.8/system/REXML/Functions/compare_language-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Functions::compare_language
is_singleton: true
name: compare_language
params: (lang1, lang2)
visibility: public
PKW}[I�'zz2ri/1.8/system/REXML/Functions/get_namespace-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: "@@context[:node] if defined? @@context[:node].namespace"
comment: 
- !ruby/struct:SM::Flow::P 
  body: Helper method.
full_name: REXML::Functions::get_namespace
is_singleton: true
name: get_namespace
params: ( node_set = nil ) {|@@context[:node] if defined? @@context[:node].namespace| ...}
visibility: public
PKW}[�,P�'''ri/1.8/system/REXML/Functions/id-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Since REXML is non-validating, this method is not implemented as it requires a DTD
full_name: REXML::Functions::id
is_singleton: true
name: id
params: ( object )
visibility: public
PKW}[��'��4ri/1.8/system/REXML/Functions/normalize_space-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: UNTESTED
full_name: REXML::Functions::normalize_space
is_singleton: true
name: normalize_space
params: ( string=nil )
visibility: public
PKW}[�����)ri/1.8/system/REXML/Functions/name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Functions::name
is_singleton: true
name: name
params: ( node_set=nil )
visibility: public
PKW}[��E	��-ri/1.8/system/REXML/Functions/contains-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Fixed by Mike Stok
full_name: REXML::Functions::contains
is_singleton: true
name: contains
params: ( string, test )
visibility: public
PKX}[ٻ.PP-ri/1.8/system/REXML/AttlistDecl/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Access the attlist attribute/value pairs.
- !ruby/struct:SM::Flow::VERB 
  body: " value = attlist_decl[ attribute_name ]\n"
full_name: REXML::AttlistDecl#[]
is_singleton: false
name: "[]"
params: (key)
visibility: public
PKX}[�U�dd+ri/1.8/system/REXML/AttlistDecl/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Iterate over the key/value pairs:"
- !ruby/struct:SM::Flow::VERB 
  body: " attlist_decl.each { |attribute_name, attribute_value| ... }\n"
full_name: REXML::AttlistDecl#each
is_singleton: false
name: each
params: (&block)
visibility: public
PKX}[-���1ri/1.8/system/REXML/AttlistDecl/include%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Whether an attlist declaration includes the given attribute definition
- !ruby/struct:SM::Flow::VERB 
  body: " if attlist_decl.include? &quot;xmlns:foobar&quot;\n"
full_name: REXML::AttlistDecl#include?
is_singleton: false
name: include?
params: (key)
visibility: public
PKX}[����))*ri/1.8/system/REXML/AttlistDecl/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create an AttlistDecl, pulling the information from a Source. Notice that this isn't very convenient; to create an AttlistDecl, you basically have to format it yourself, and then have the initializer parse it. Sorry, but for the forseeable future, DTD support in REXML is pretty weak on convenience. Have I mentioned how much I hate DTDs?
full_name: REXML::AttlistDecl::new
is_singleton: true
name: new
params: (source)
visibility: public
PKX}[���0ri/1.8/system/REXML/AttlistDecl/node_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::AttlistDecl#node_type
is_singleton: false
name: node_type
params: ()
visibility: public
PKX}[��n,ri/1.8/system/REXML/AttlistDecl/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Write out exactly what we got in.
full_name: REXML::AttlistDecl#write
is_singleton: false
name: write
params: (out, indent=-1)
visibility: public
PKX}[F�u���6ri/1.8/system/REXML/AttlistDecl/cdesc-AttlistDecl.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: What is this? Got me.
  name: element_name
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "This class needs:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Documentation
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Work! Not all types of attlists are intelligently parsed, so we just
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: spew back out what we get in. This works, but it would be better if we formatted the output ourselves.
- !ruby/struct:SM::Flow::P 
  body: AttlistDecls provide <b>just</b> enough support to allow namespace declarations. If you need some sort of generalized support, or have an interesting idea about how to map the hideous, terrible design of DTD AttlistDecls onto an intuitive Ruby interface, let me know. I'm desperate for anything to make DTDs more palateable.
constants: []

full_name: REXML::AttlistDecl
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: include?
- !ruby/object:RI::MethodSummary 
  name: node_type
- !ruby/object:RI::MethodSummary 
  name: write
name: AttlistDecl
superclass: Child
PKX}[�
g�8ri/1.8/system/REXML/NotationDecl/cdesc-NotationDecl.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: public
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: system
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: REXML::NotationDecl
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: name
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: write
name: NotationDecl
superclass: Child
PKX}[GuK���+ri/1.8/system/REXML/NotationDecl/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::NotationDecl::new
is_singleton: true
name: new
params: (name, middle, pub, sys)
visibility: public
PKX}[��x��-ri/1.8/system/REXML/NotationDecl/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::NotationDecl#write
is_singleton: false
name: write
params: ( output, indent=-1 )
visibility: public
PKX}[�}���,ri/1.8/system/REXML/NotationDecl/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::NotationDecl#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PKX}[�"�OO,ri/1.8/system/REXML/NotationDecl/name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: This method retrieves the name of the notation.
- !ruby/struct:SM::Flow::P 
  body: Method contributed by Henrik Martensson
full_name: REXML::NotationDecl#name
is_singleton: false
name: name
params: ()
visibility: public
PKX}[�	�L��6ri/1.8/system/REXML/Instruction/cdesc-Instruction.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: target is the &quot;name&quot; of the Instruction; IE, the &quot;tag&quot; in &lt;?tag ...?&gt; content is everything else.
  name: content
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: target is the &quot;name&quot; of the Instruction; IE, the &quot;tag&quot; in &lt;?tag ...?&gt; content is everything else.
  name: target
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Represents an XML Instruction; IE, &lt;? ... ?&gt; TODO: Add parent arg (3rd arg) to constructor"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: START
  value: "'<\\?'"
- !ruby/object:RI::Constant 
  comment: 
  name: STOP
  value: "'\\?>'"
full_name: REXML::Instruction
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: clone
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: node_type
- !ruby/object:RI::MethodSummary 
  name: write
name: Instruction
superclass: Child
PKX}[�ɑ��.ri/1.8/system/REXML/Instruction/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Instruction#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PKX}[�34��*ri/1.8/system/REXML/Instruction/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Constructs a new Instruction @param target can be one of a number of things. If String, then the target of this instruction is set to this. If an Instruction, then the Instruction is shallowly cloned (target and content are copied). If a Source, then the source is scanned and parsed for an Instruction declaration. @param content Must be either a String, or a Parent. Can only be a Parent if the target argument is a Source. Otherwise, this String is set as the content of this instruction.
full_name: REXML::Instruction::new
is_singleton: true
name: new
params: (target, content=nil)
visibility: public
PKX}[Jf��0ri/1.8/system/REXML/Instruction/node_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Instruction#node_type
is_singleton: false
name: node_type
params: ()
visibility: public
PKX}[����aa,ri/1.8/system/REXML/Instruction/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: DEPRECATED
- !ruby/struct:SM::Flow::P 
  body: See the rexml/formatters package
full_name: REXML::Instruction#write
is_singleton: false
name: write
params: (writer, indent=-1, transitive=false, ie_hack=false)
visibility: public
PKX}[�N�!WW-ri/1.8/system/REXML/Instruction/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "@return true if other is an Instruction, and the content and target of the other matches the target and content of this object."
full_name: REXML::Instruction#==
is_singleton: false
name: ==
params: ( other )
visibility: public
PKX}[(
|s��,ri/1.8/system/REXML/Instruction/clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Instruction#clone
is_singleton: false
name: clone
params: ()
visibility: public
PKX}[�I�.ri/1.8/system/REXML/Element/add_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds a child to this element, optionally setting attributes in the element.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "element:"
    body: optional. If Element, the element is added. Otherwise, a new Element is constructed with the argument (see Element.initialize).
  - !ruby/struct:SM::Flow::LI 
    label: "attrs:"
    body: If supplied, must be a Hash containing String name,value pairs, which will be used to set the attributes of the new Element.
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: the Element that was added
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " el = doc.add_element 'my-tag'\n el = doc.add_element 'my-tag', {'attr1'=&gt;'val1', 'attr2'=&gt;'val2'}\n el = Element.new 'my-tag'\n doc.add_element el\n"
full_name: REXML::Element#add_element
is_singleton: false
name: add_element
params: (element, attrs=nil)
visibility: public
PKX}[qfi�DD3ri/1.8/system/REXML/Element/delete_attribute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes an attribute
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "key:"
    body: either an Attribute or a String. In either case, the attribute is found by matching the attribute name to the argument, and then removed. If no attribute is found, no action is taken.
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: the attribute removed, or nil if this Element did not contain a matching attribute
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " e = Element.new('E')\n e.add_attribute( 'name', 'Sean' )             #-&gt; &lt;E name='Sean'/&gt;\n r = e.add_attribute( 'sur:name', 'Russell' )  #-&gt; &lt;E name='Sean' sur:name='Russell'/&gt;\n e.delete_attribute( 'name' )                  #-&gt; &lt;E sur:name='Russell'/&gt;\n e.delete_attribute( r )                       #-&gt; &lt;E/&gt;\n"
full_name: REXML::Element#delete_attribute
is_singleton: false
name: delete_attribute
params: (key)
visibility: public
PKX}[�;��DD+ri/1.8/system/REXML/Element/document-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Evaluates to the document to which this element belongs, or nil if this element doesn't belong to a document.
full_name: REXML::Element#document
is_singleton: false
name: document
params: ()
visibility: public
PKX}[K\���3ri/1.8/system/REXML/Element/delete_namespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes a namespace from this node. This only works if the namespace is actually declared in this node. If no argument is passed, deletes the default namespace.
- !ruby/struct:SM::Flow::P 
  body: "Evaluates to: this element"
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new &quot;&lt;a xmlns:foo='bar' xmlns='twiddle'/&gt;&quot;\n doc.root.delete_namespace\n puts doc     # -&gt; &lt;a xmlns:foo='bar'/&gt;\n doc.root.delete_namespace 'foo'\n puts doc     # -&gt; &lt;a/&gt;\n"
full_name: REXML::Element#delete_namespace
is_singleton: false
name: delete_namespace
params: (namespace="xmlns")
visibility: public
PKX}[��&ri/1.8/system/REXML/Element/raw-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Evaluates to <tt>true</tt> if raw mode is set for this element. This is the case if the context has :<tt>raw</tt> set to :<tt>all</tt> or an array containing the name of this element.
- !ruby/struct:SM::Flow::P 
  body: The evaluation is tested against <tt>expanded_name</tt>, and so is namespace sensitive.
full_name: REXML::Element#raw
is_singleton: false
name: raw
params: ()
visibility: public
PKX}[������>ri/1.8/system/REXML/Element/each_element_with_attribute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: Element
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates through the child elements, yielding for each Element that has a particular attribute set.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "key:"
    body: the name of the attribute to search for
  - !ruby/struct:SM::Flow::LI 
    label: "value:"
    body: the value of the attribute
  - !ruby/struct:SM::Flow::LI 
    label: "max:"
    body: (optional) causes this method to return after yielding for this number of matching children
  - !ruby/struct:SM::Flow::LI 
    label: "name:"
    body: (optional) if supplied, this is an XPath that filters the children to check.
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new &quot;&lt;a&gt;&lt;b @id='1'/&gt;&lt;c @id='2'/&gt;&lt;d @id='1'/&gt;&lt;e/&gt;&lt;/a&gt;&quot;\n # Yields b, c, d\n doc.root.each_element_with_attribute( 'id' ) {|e| p e}\n # Yields b, d\n doc.root.each_element_with_attribute( 'id', '1' ) {|e| p e}\n # Yields b\n doc.root.each_element_with_attribute( 'id', '1', 1 ) {|e| p e}\n # Yields d\n doc.root.each_element_with_attribute( 'id', '1', 0, 'd' ) {|e| p e}\n"
full_name: REXML::Element#each_element_with_attribute
is_singleton: false
name: each_element_with_attribute
params: ( key, value=nil, max=0, name=nil ) {|Element| ...}
visibility: public
PKX}[kV���.ri/1.8/system/REXML/Element/cdesc-Element.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Mechanisms for accessing attributes and child elements of this element.
  name: attributes
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The context holds information about the processing environment, such as whitespace handling.
  name: context
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Mechanisms for accessing attributes and child elements of this element.
  name: elements
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Represents a tagged XML element. Elements are characterized by having children, attributes, and names, and can themselves be children.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: UNDEFINED
  value: "\"UNDEFINED\";"
full_name: REXML::Element
includes: 
- !ruby/object:RI::IncludedModule 
  name: Namespace
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: __to_xpath_helper
- !ruby/object:RI::MethodSummary 
  name: add_attribute
- !ruby/object:RI::MethodSummary 
  name: add_attributes
- !ruby/object:RI::MethodSummary 
  name: add_element
- !ruby/object:RI::MethodSummary 
  name: add_namespace
- !ruby/object:RI::MethodSummary 
  name: add_text
- !ruby/object:RI::MethodSummary 
  name: attribute
- !ruby/object:RI::MethodSummary 
  name: cdatas
- !ruby/object:RI::MethodSummary 
  name: clone
- !ruby/object:RI::MethodSummary 
  name: comments
- !ruby/object:RI::MethodSummary 
  name: delete_attribute
- !ruby/object:RI::MethodSummary 
  name: delete_element
- !ruby/object:RI::MethodSummary 
  name: delete_namespace
- !ruby/object:RI::MethodSummary 
  name: document
- !ruby/object:RI::MethodSummary 
  name: each_element
- !ruby/object:RI::MethodSummary 
  name: each_element_with_attribute
- !ruby/object:RI::MethodSummary 
  name: each_element_with_text
- !ruby/object:RI::MethodSummary 
  name: each_with_something
- !ruby/object:RI::MethodSummary 
  name: get_elements
- !ruby/object:RI::MethodSummary 
  name: get_text
- !ruby/object:RI::MethodSummary 
  name: has_attributes?
- !ruby/object:RI::MethodSummary 
  name: has_elements?
- !ruby/object:RI::MethodSummary 
  name: has_text?
- !ruby/object:RI::MethodSummary 
  name: ignore_whitespace_nodes
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: instructions
- !ruby/object:RI::MethodSummary 
  name: namespace
- !ruby/object:RI::MethodSummary 
  name: namespaces
- !ruby/object:RI::MethodSummary 
  name: next_element
- !ruby/object:RI::MethodSummary 
  name: node_type
- !ruby/object:RI::MethodSummary 
  name: prefixes
- !ruby/object:RI::MethodSummary 
  name: previous_element
- !ruby/object:RI::MethodSummary 
  name: raw
- !ruby/object:RI::MethodSummary 
  name: root
- !ruby/object:RI::MethodSummary 
  name: root_node
- !ruby/object:RI::MethodSummary 
  name: text
- !ruby/object:RI::MethodSummary 
  name: text=
- !ruby/object:RI::MethodSummary 
  name: texts
- !ruby/object:RI::MethodSummary 
  name: whitespace
- !ruby/object:RI::MethodSummary 
  name: write
- !ruby/object:RI::MethodSummary 
  name: xpath
name: Element
superclass: Parent
PKY}[l�W��-ri/1.8/system/REXML/Element/whitespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Evaluates to <tt>true</tt> if whitespace is respected for this element. This is the case if:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "1."
    body: Neither :<tt>respect_whitespace</tt> nor :<tt>compress_whitespace</tt> has any value
  - !ruby/struct:SM::Flow::LI 
    label: "2."
    body: The context has :<tt>respect_whitespace</tt> set to :<tt>all</tt> or an array containing the name of this element, and :<tt>compress_whitespace</tt> isn't set to :<tt>all</tt> or an array containing the name of this element.
  type: :NUMBER
- !ruby/struct:SM::Flow::P 
  body: The evaluation is tested against <tt>expanded_name</tt>, and so is namespace sensitive.
full_name: REXML::Element#whitespace
is_singleton: false
name: whitespace
params: ()
visibility: public
PKY}[v4�YY/ri/1.8/system/REXML/Element/get_elements-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Synonym for Element.to_a This is a little slower than calling elements.each directly.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "xpath:"
    body: any XPath by which to search for elements in the tree
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: an array of Elements that match the supplied path
  type: :NOTE
full_name: REXML::Element#get_elements
is_singleton: false
name: get_elements
params: ( xpath )
visibility: public
PKY}[�*ޡ�+ri/1.8/system/REXML/Element/get_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the first child Text node, if any, or <tt>nil</tt> otherwise. This method returns the actual <tt>Text</tt> node, rather than the String content.
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new &quot;&lt;p&gt;some text <b>this is bold!</b> more text&lt;/p&gt;&quot;\n # The element 'p' has two text elements, &quot;some text &quot; and &quot; more text&quot;.\n doc.root.get_text.value            #-&gt; &quot;some text &quot;\n"
full_name: REXML::Element#get_text
is_singleton: false
name: get_text
params: (path = nil)
visibility: public
PKY}[*�@**,ri/1.8/system/REXML/Element/namespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Evalutas to the URI for a prefix, or the empty string if no such namespace is declared for this element. Evaluates recursively for ancestors. Returns the default namespace, if there is one.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "prefix:"
    body: the prefix to search for. If not supplied, returns the default namespace if one exists
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: the namespace URI as a String, or nil if no such namespace exists. If the namespace is undefined, returns an empty string
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new(&quot;&lt;a xmlns='1' xmlns:y='2'&gt;&lt;b/&gt;&lt;c xmlns:z='3'/&gt;&lt;/a&gt;&quot;)\n b = doc.elements['//b']\n b.namespace           # -&gt; '1'\n b.namespace(&quot;y&quot;)      # -&gt; '2'\n"
full_name: REXML::Element#namespace
is_singleton: false
name: namespace
params: (prefix=nil)
visibility: public
PKY}[%��330ri/1.8/system/REXML/Element/add_attribute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds an attribute to this element, overwriting any existing attribute by the same name.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "key:"
    body: can be either an Attribute or a String. If an Attribute, the attribute is added to the list of Element attributes. If String, the argument is used as the name of the new attribute, and the value parameter must be supplied.
  - !ruby/struct:SM::Flow::LI 
    label: "value:"
    body: Required if <tt>key</tt> is a String, and ignored if the first argument is an Attribute. This is a String, and is used as the value of the new Attribute. This should be the unnormalized value of the attribute (without entities).
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: the Attribute added
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " e = Element.new 'e'\n e.add_attribute( 'a', 'b' )               #-&gt; &lt;e a='b'/&gt;\n e.add_attribute( 'x:a', 'c' )             #-&gt; &lt;e a='b' x:a='c'/&gt;\n e.add_attribute Attribute.new('b', 'd')   #-&gt; &lt;e a='b' x:a='c' b='d'/&gt;\n"
full_name: REXML::Element#add_attribute
is_singleton: false
name: add_attribute
params: ( key, value=nil )
visibility: public
PKY}[�6���-ri/1.8/system/REXML/Element/namespaces-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Element#namespaces
is_singleton: false
name: namespaces
params: ()
visibility: public
PKY}[��.ri/1.8/system/REXML/Element/has_text%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Evaluates to <tt>true</tt> if this element has at least one Text child
full_name: REXML::Element#has_text?
is_singleton: false
name: has_text?
params: ()
visibility: public
PKY}[
�����'ri/1.8/system/REXML/Element/root-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Element#root
is_singleton: false
name: root
params: ()
visibility: public
PKY}[)NȮ�1ri/1.8/system/REXML/Element/add_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Add multiple attributes to this element.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "hash:"
    body: is either a hash, or array of arrays
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " el.add_attributes( {&quot;name1&quot;=&gt;&quot;value1&quot;, &quot;name2&quot;=&gt;&quot;value2&quot;} )\n el.add_attributes( [ [&quot;name1&quot;,&quot;value1&quot;], [&quot;name2&quot;=&gt;&quot;value2&quot;] ] )\n"
full_name: REXML::Element#add_attributes
is_singleton: false
name: add_attributes
params: (hash)
visibility: public
PKY}[�$�v��0ri/1.8/system/REXML/Element/add_namespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds a namespace to this element.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "prefix:"
    body: the prefix string, or the namespace URI if <tt>uri</tt> is not supplied
  - !ruby/struct:SM::Flow::LI 
    label: "uri:"
    body: the namespace URI. May be nil, in which <tt>prefix</tt> is used as the URI
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: "Evaluates to: this Element"
- !ruby/struct:SM::Flow::VERB 
  body: " a = Element.new(&quot;a&quot;)\n a.add_namespace(&quot;xmlns:foo&quot;, &quot;bar&quot; )\n a.add_namespace(&quot;foo&quot;, &quot;bar&quot;)  # shorthand for previous line\n a.add_namespace(&quot;twiddle&quot;)\n puts a   #-&gt; &lt;a xmlns:foo='bar' xmlns='twiddle'/&gt;\n"
full_name: REXML::Element#add_namespace
is_singleton: false
name: add_namespace
params: ( prefix, uri=nil )
visibility: public
PKY}[�u0��(ri/1.8/system/REXML/Element/texts-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get an array of all Text children. IMMUTABLE
full_name: REXML::Element#texts
is_singleton: false
name: texts
params: ()
visibility: public
PKY}[�s����*ri/1.8/system/REXML/Element/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Element#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PKY}[��g.YY2ri/1.8/system/REXML/Element/has_elements%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Evaluates to <tt>true</tt> if this element has at least one child Element
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new &quot;&lt;a&gt;&lt;b/&gt;&lt;c&gt;Text&lt;/c&gt;&lt;/a&gt;&quot;\n doc.root.has_elements               # -&gt; true\n doc.elements[&quot;/a/b&quot;].has_elements   # -&gt; false\n doc.elements[&quot;/a/c&quot;].has_elements   # -&gt; false\n"
full_name: REXML::Element#has_elements?
is_singleton: false
name: has_elements?
params: ()
visibility: public
PKY}[Ͷz�+ri/1.8/system/REXML/Element/add_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: A helper method to add a Text child. Actual Text instances can be added with regular Parent methods, such as add() and &lt;&lt;()
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "text:"
    body: if a String, a new Text instance is created and added to the parent. If Text, the object is added directly.
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: this Element
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " e = Element.new('a')          #-&gt; &lt;e/&gt;\n e.add_text 'foo'              #-&gt; &lt;e&gt;foo&lt;/e&gt;\n e.add_text Text.new(' bar')    #-&gt; &lt;e&gt;foo bar&lt;/e&gt;\n"
- !ruby/struct:SM::Flow::P 
  body: Note that at the end of this example, the branch has <b>3</b> nodes; the 'e' element and <b>2</b> Text node children.
full_name: REXML::Element#add_text
is_singleton: false
name: add_text
params: ( text )
visibility: public
PKY}[u�>��&ri/1.8/system/REXML/Element/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Constructor
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "arg:"
    body: if not supplied, will be set to the default value. If a String, the name of this object will be set to the argument. If an Element, the object will be shallowly cloned; name, attributes, and namespaces will be copied. Children will <tt>not</tt> be copied.
  - !ruby/struct:SM::Flow::LI 
    label: "parent:"
    body: if supplied, must be a Parent, and will be used as the parent of this object.
  - !ruby/struct:SM::Flow::LI 
    label: "context:"
    body: "If supplied, must be a hash containing context items. Context items include:"
  type: :NOTE
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>:respect_whitespace</tt> the value of this is :<tt>all</tt> or an array of strings being the names of the elements to respect whitespace for. Defaults to :<tt>all</tt>.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>:compress_whitespace</tt> the value can be :<tt>all</tt> or an array of strings being the names of the elements to ignore whitespace on. Overrides :<tt>respect_whitespace</tt>.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>:ignore_whitespace_nodes</tt> the value can be :<tt>all</tt> or an array of strings being the names of the elements in which to ignore whitespace-only nodes. If this is set, Text nodes which contain only whitespace will not be added to the document tree.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>:raw</tt> can be :<tt>all</tt>, or an array of strings being the names of the elements to process in raw mode. In raw mode, special characters in text is not converted to or from entities.
  type: :BULLET
full_name: REXML::Element::new
is_singleton: true
name: new
params: ( arg = UNDEFINED, parent=nil, context=nil )
visibility: public
PKY}[
} ���*ri/1.8/system/REXML/Element/text%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the first Text child of this object. See text() for a discussion about Text children.
- !ruby/struct:SM::Flow::P 
  body: If a Text child already exists, the child is replaced by this content. This means that Text content can be deleted by calling this method with a nil argument. In this case, the next Text child becomes the first Text child. In no case is the order of any siblings disturbed.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "text:"
    body: If a String, a new Text child is created and added to this Element as the first Text child. If Text, the text is set as the first Child element. If nil, then any existing first Text child is removed.
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: this Element.
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new '&lt;a&gt;&lt;b/&gt;&lt;/a&gt;'\n doc.root.text = 'Sean'      #-&gt; '&lt;a&gt;&lt;b/&gt;Sean&lt;/a&gt;'\n doc.root.text = 'Elliott'   #-&gt; '&lt;a&gt;&lt;b/&gt;Elliott&lt;/a&gt;'\n doc.root.add_element 'c'    #-&gt; '&lt;a&gt;&lt;b/&gt;Elliott&lt;c/&gt;&lt;/a&gt;'\n doc.root.text = 'Russell'   #-&gt; '&lt;a&gt;&lt;b/&gt;Russell&lt;c/&gt;&lt;/a&gt;'\n doc.root.text = nil         #-&gt; '&lt;a&gt;&lt;b/&gt;&lt;c/&gt;&lt;/a&gt;'\n"
full_name: REXML::Element#text=
is_singleton: false
name: text=
params: ( text )
visibility: public
PKY}[�xF�??3ri/1.8/system/REXML/Element/previous_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the previous sibling that is an element, or nil if there is no Element sibling prior to this one
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new '&lt;a&gt;&lt;b/&gt;text&lt;c/&gt;&lt;/a&gt;'\n doc.root.elements['c'].previous_element          #-&gt; &lt;b/&gt;\n doc.root.elements['b'].previous_element          #-&gt; nil\n"
full_name: REXML::Element#previous_element
is_singleton: false
name: previous_element
params: ()
visibility: public
PKY}[i�U\9ri/1.8/system/REXML/Element/each_element_with_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: Element
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates through the children, yielding for each Element that has a particular text set.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "text:"
    body: the text to search for. If nil, or not supplied, will iterate over all <tt>Element</tt> children that contain at least one <tt>Text</tt> node.
  - !ruby/struct:SM::Flow::LI 
    label: "max:"
    body: (optional) causes this method to return after yielding for this number of matching children
  - !ruby/struct:SM::Flow::LI 
    label: "name:"
    body: (optional) if supplied, this is an XPath that filters the children to check.
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new '&lt;a&gt;<b>b</b>&lt;c&gt;b&lt;/c&gt;&lt;d&gt;d&lt;/d&gt;&lt;e/&gt;&lt;/a&gt;'\n # Yields b, c, d\n doc.each_element_with_text {|e|p e}\n # Yields b, c\n doc.each_element_with_text('b'){|e|p e}\n # Yields b\n doc.each_element_with_text('b', 1){|e|p e}\n # Yields d\n doc.each_element_with_text(nil, 0, 'd'){|e|p e}\n"
full_name: REXML::Element#each_element_with_text
is_singleton: false
name: each_element_with_text
params: ( text=nil, max=0, name=nil ) {|Element| ...}
visibility: public
PKY}[��E��,ri/1.8/system/REXML/Element/attribute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Attributes #"
full_name: REXML::Element#attribute
is_singleton: false
name: attribute
params: ( name, namespace=nil )
visibility: public
PKY}[g�W��,ri/1.8/system/REXML/Element/node_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Element#node_type
is_singleton: false
name: node_type
params: ()
visibility: public
PKY}[�m���(ri/1.8/system/REXML/Element/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: DEPRECATED
- !ruby/struct:SM::Flow::P 
  body: See REXML::Formatters
- !ruby/struct:SM::Flow::P 
  body: Writes out this element, and recursively, all children.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "output:"
    body: output an object which supports '&lt;&lt; string'; this is where the
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: "  document will be written.\n"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "indent:"
    body: An integer. If -1, no indenting will be used; otherwise, the indentation will be this number of spaces, and children will be indented an additional amount. Defaults to -1
  - !ruby/struct:SM::Flow::LI 
    label: "transitive:"
    body: If transitive is true and indent is &gt;= 0, then the output will be pretty-printed in such a way that the added whitespace does not affect the parse tree of the document
  - !ruby/struct:SM::Flow::LI 
    label: "ie_hack:"
    body: Internet Explorer is the worst piece of crap to have ever been written, with the possible exception of Windows itself. Since IE is unable to parse proper XML, we have to provide a hack to generate XML that IE's limited abilities can handle. This hack inserts a space before the /&gt; on empty tags. Defaults to false
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " out = ''\n doc.write( out )     #-&gt; doc is written to the string 'out'\n doc.write( $stdout ) #-&gt; doc written to the console\n"
full_name: REXML::Element#write
is_singleton: false
name: write
params: (writer=$stdout, indent=-1, transitive=false, ie_hack=false)
visibility: public
PKY}[�20884ri/1.8/system/REXML/Element/has_attributes%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Evaluates to <tt>true</tt> if this element has any attributes set, false otherwise.
full_name: REXML::Element#has_attributes?
is_singleton: false
name: has_attributes?
params: ()
visibility: public
PKY}[s^R)ri/1.8/system/REXML/Element/cdatas-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get an array of all CData children. IMMUTABLE
full_name: REXML::Element#cdatas
is_singleton: false
name: cdatas
params: ()
visibility: public
PKY}[_<��/ri/1.8/system/REXML/Element/instructions-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get an array of all Instruction children. IMMUTABLE
full_name: REXML::Element#instructions
is_singleton: false
name: instructions
params: ()
visibility: public
PKY}[�[�g��:ri/1.8/system/REXML/Element/ignore_whitespace_nodes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Element#ignore_whitespace_nodes
is_singleton: false
name: ignore_whitespace_nodes
params: ()
visibility: public
PKY}[V��((/ri/1.8/system/REXML/Element/next_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the next sibling that is an element, or nil if there is no Element sibling after this one
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new '&lt;a&gt;&lt;b/&gt;text&lt;c/&gt;&lt;/a&gt;'\n doc.root.elements['b'].next_element          #-&gt; &lt;c/&gt;\n doc.root.elements['c'].next_element          #-&gt; nil\n"
full_name: REXML::Element#next_element
is_singleton: false
name: next_element
params: ()
visibility: public
PKY}[/��+ri/1.8/system/REXML/Element/comments-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get an array of all Comment children. IMMUTABLE
full_name: REXML::Element#comments
is_singleton: false
name: comments
params: ()
visibility: public
PKY}[������(ri/1.8/system/REXML/Element/clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a shallow copy of self.
- !ruby/struct:SM::Flow::VERB 
  body: "  d = Document.new &quot;&lt;a&gt;&lt;b/&gt;&lt;b/&gt;&lt;c&gt;&lt;d/&gt;&lt;/c&gt;&lt;/a&gt;&quot;\n  new_a = d.root.clone\n  puts new_a  # =&gt; &quot;&lt;a/&gt;&quot;\n"
full_name: REXML::Element#clone
is_singleton: false
name: clone
params: ()
visibility: public
PKY}[wbR���(ri/1.8/system/REXML/Element/xpath-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Element#xpath
is_singleton: false
name: xpath
params: ()
visibility: public
PKY}[�e����4ri/1.8/system/REXML/Element/__to_xpath_helper-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Element#__to_xpath_helper
is_singleton: false
name: __to_xpath_helper
params: (node)
visibility: private
PKY}[t�+ri/1.8/system/REXML/Element/prefixes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Evaluates to an <tt>Array</tt> containing the prefixes (names) of all defined namespaces at this context node.
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new(&quot;&lt;a xmlns:x='1' xmlns:y='2'&gt;&lt;b/&gt;&lt;c xmlns:z='3'/&gt;&lt;/a&gt;&quot;)\n doc.elements['//b'].prefixes # -&gt; ['x', 'y']\n"
full_name: REXML::Element#prefixes
is_singleton: false
name: prefixes
params: ()
visibility: public
PKY}[��E�'ri/1.8/system/REXML/Element/text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: A convenience method which returns the String value of the <em>first</em> child text element, if one exists, and <tt>nil</tt> otherwise.
- !ruby/struct:SM::Flow::P 
  body: <em>Note that an element may have multiple Text elements, perhaps separated by other children</em>. Be aware that this method only returns the first Text node.
- !ruby/struct:SM::Flow::P 
  body: This method returns the <tt>value</tt> of the first text child node, which ignores the <tt>raw</tt> setting, so always returns normalized text. See the Text::value documentation.
- !ruby/struct:SM::Flow::VERB 
  body: " doc = Document.new &quot;&lt;p&gt;some text <b>this is bold!</b> more text&lt;/p&gt;&quot;\n # The element 'p' has two text elements, &quot;some text &quot; and &quot; more text&quot;.\n doc.root.text              #-&gt; &quot;some text &quot;\n"
full_name: REXML::Element#text
is_singleton: false
name: text
params: ( path = nil )
visibility: public
PKY}[�V=��1ri/1.8/system/REXML/Element/delete_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes a child element.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "element:"
    body: Must be an <tt>Element</tt>, <tt>String</tt>, or <tt>Integer</tt>. If Element, the element is removed. If String, the element is found (via XPath) and removed. &lt;em&gt;This means that any parent can remove any descendant.&lt;em&gt; If Integer, the Element indexed by that number will be removed.
  - !ruby/struct:SM::Flow::LI 
    label: "Returns:"
    body: the element that was removed.
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: " doc.delete_element &quot;/a/b/c[@id='4']&quot;\n doc.delete_element doc.elements[&quot;//k&quot;]\n doc.delete_element 1\n"
full_name: REXML::Element#delete_element
is_singleton: false
name: delete_element
params: (element)
visibility: public
PKY}[g@�""/ri/1.8/system/REXML/Element/each_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: Element
comment: 
- !ruby/struct:SM::Flow::P 
  body: Synonym for Element.elements.each
full_name: REXML::Element#each_element
is_singleton: false
name: each_element
params: ( xpath=nil ) {|Element| ...}
visibility: public
PKY}[�\�qq6ri/1.8/system/REXML/Element/each_with_something-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: child if test.call(child) and num += 1
comment: 
- !ruby/struct:SM::Flow::P 
  body: A private helper method
full_name: REXML::Element#each_with_something
is_singleton: false
name: each_with_something
params: ( test, max=0, name=nil ) {|child if test.call(child) and num += 1| ...}
visibility: private
PKY}[Y��,ri/1.8/system/REXML/Element/root_node-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Evaluates to the root node of the document that this element belongs to. If this element doesn't belong to a document, but does belong to another Element, the parent's root will be returned, until the earliest ancestor is found.
- !ruby/struct:SM::Flow::P 
  body: "Note that this is not the same as the document element. In the following example, &lt;a&gt; is the document element, and the root node is the parent node of the document element. You may ask yourself why the root node is useful: consider the doctype and XML declaration, and any processing instructions before the document element... they are children of the root node, or siblings of the document element. The only time this isn't true is when an Element is created that is not part of any Document. In this case, the ancestor that has no parent acts as the root node."
- !ruby/struct:SM::Flow::VERB 
  body: " d = Document.new '&lt;a&gt;<b>&lt;c/&gt;</b>&lt;/a&gt;'\n a = d[1] ; c = a[1][1]\n d.root_node == d   # TRUE\n a.root_node        # namely, d\n c.root_node        # again, d\n"
full_name: REXML::Element#root_node
is_singleton: false
name: root_node
params: ()
visibility: public
PKY}[M�W9)ri/1.8/system/REXML/Text/normalize-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Escapes all possible entities
full_name: REXML::Text::normalize
is_singleton: true
name: normalize
params: ( input, doctype=nil, entity_filter=nil )
visibility: public
PKY}[� ����(ri/1.8/system/REXML/Text/empty%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Text#empty?
is_singleton: false
name: empty?
params: ()
visibility: public
PKY}[٩
�++)ri/1.8/system/REXML/Text/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>other</tt> a String or a Text <tt>returns</tt> the result of (to_s &lt;=&gt; arg.to_s)
full_name: REXML::Text#<=>
is_singleton: false
name: <=>
params: ( other )
visibility: public
PKY}[as�	�	(ri/1.8/system/REXML/Text/cdesc-Text.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: If <tt>raw</tt> is true, then REXML leaves the value alone
  name: raw
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: expand
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: normalize
- !ruby/object:RI::MethodSummary 
  name: read_with_substitution
- !ruby/object:RI::MethodSummary 
  name: unnormalize
comment: 
- !ruby/struct:SM::Flow::P 
  body: Represents text nodes in an XML document
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The order in which the substitutions occur
  name: SPECIALS
  value: "[ /&(?!#?[\\w-]+;)/u, /</u, />/u, /\"/u, /'/u, /\\r/u ]"
- !ruby/object:RI::Constant 
  comment: 
  name: SUBSTITUTES
  value: "['&amp;', '&lt;', '&gt;', '&quot;', '&apos;', '&#13;']"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Characters which are substituted in written strings
  name: SLAICEPS
  value: "[ '<', '>', '\"', \"'\", '&' ]"
- !ruby/object:RI::Constant 
  comment: 
  name: SETUTITSBUS
  value: "[ /&lt;/u, /&gt;/u, /&quot;/u, /&apos;/u, /&amp;/u ]"
- !ruby/object:RI::Constant 
  comment: 
  name: ILLEGAL
  value: /(<|&(?!(#{Entity::NAME})|(#0*((?:\d+)|(?:x[a-fA-F0-9]+)));))/um
- !ruby/object:RI::Constant 
  comment: 
  name: NUMERICENTITY
  value: /&#0*((?:\d+)|(?:x[a-fA-F0-9]+));/
- !ruby/object:RI::Constant 
  comment: 
  name: REFERENCE
  value: /#{Entity::REFERENCE}/
- !ruby/object:RI::Constant 
  comment: 
  name: EREFERENCE
  value: /&(?!#{Entity::NAME};)/
full_name: REXML::Text
includes: 
- !ruby/object:RI::IncludedModule 
  name: Comparable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: clone
- !ruby/object:RI::MethodSummary 
  name: empty?
- !ruby/object:RI::MethodSummary 
  name: indent_text
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: node_type
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: value
- !ruby/object:RI::MethodSummary 
  name: value=
- !ruby/object:RI::MethodSummary 
  name: wrap
- !ruby/object:RI::MethodSummary 
  name: write
- !ruby/object:RI::MethodSummary 
  name: write_with_substitution
- !ruby/object:RI::MethodSummary 
  name: xpath
name: Text
superclass: Child
PKY}[�X�IJJ(ri/1.8/system/REXML/Text/value%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the contents of this text node. This expects the text to be unnormalized. It returns self.
- !ruby/struct:SM::Flow::VERB 
  body: "  e = Element.new( &quot;a&quot; )\n  e.add_text( &quot;foo&quot; )   # &lt;a&gt;foo&lt;/a&gt;\n  e[0].value = &quot;bar&quot;    # &lt;a&gt;bar&lt;/a&gt;\n  e[0].value = &quot;&lt;a&gt;&quot;    # &lt;a&gt;&amp;lt;a&amp;gt;&lt;/a&gt;\n"
full_name: REXML::Text#value=
is_singleton: false
name: value=
params: ( val )
visibility: public
PKY}['�#���'ri/1.8/system/REXML/Text/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Text#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PKY}[s^���+ri/1.8/system/REXML/Text/indent_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Text#indent_text
is_singleton: false
name: indent_text
params: (string, level=1, style="\t", indentfirstline=true)
visibility: public
PKY}[�^��
�
#ri/1.8/system/REXML/Text/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Constructor <tt>arg</tt> if a String, the content is set to the String. If a Text, the object is shallowly cloned.
- !ruby/struct:SM::Flow::P 
  body: <tt>respect_whitespace</tt> (boolean, false) if true, whitespace is respected
- !ruby/struct:SM::Flow::P 
  body: <tt>parent</tt> (nil) if this is a Parent object, the parent will be set to this.
- !ruby/struct:SM::Flow::P 
  body: <tt>raw</tt> (nil) This argument can be given three values. If true, then the value of used to construct this object is expected to contain no unescaped XML markup, and REXML will not change the text. If this value is false, the string may contain any characters, and REXML will escape any and all defined entities whose values are contained in the text. If this value is nil (the default), then the raw value of the parent will be used as the raw value for this node. If there is no raw value for the parent, and no value is supplied, the default is false. Use this field if you have entities defined for some text, and you don't want REXML to escape that text in output.
- !ruby/struct:SM::Flow::VERB 
  body: "  Text.new( &quot;&lt;&amp;&quot;, false, nil, false ) #-&gt; &quot;&amp;lt;&amp;amp;&quot;\n  Text.new( &quot;&amp;lt;&amp;amp;&quot;, false, nil, false ) #-&gt; &quot;&amp;amp;lt;&amp;amp;amp;&quot;\n  Text.new( &quot;&lt;&amp;&quot;, false, nil, true )  #-&gt; Parse exception\n  Text.new( &quot;&amp;lt;&amp;amp;&quot;, false, nil, true )  #-&gt; &quot;&amp;lt;&amp;amp;&quot;\n  # Assume that the entity &quot;s&quot; is defined to be &quot;sean&quot;\n  # and that the entity    &quot;r&quot; is defined to be &quot;russell&quot;\n  Text.new( &quot;sean russell&quot; )          #-&gt; &quot;&amp;s; &amp;r;&quot;\n  Text.new( &quot;sean russell&quot;, false, nil, true ) #-&gt; &quot;sean russell&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: <tt>entity_filter</tt> (nil) This can be an array of entities to match in the supplied text. This argument is only useful if <tt>raw</tt> is set to false.
- !ruby/struct:SM::Flow::VERB 
  body: "  Text.new( &quot;sean russell&quot;, false, nil, false, [&quot;s&quot;] ) #-&gt; &quot;&amp;s; russell&quot;\n  Text.new( &quot;sean russell&quot;, false, nil, true, [&quot;s&quot;] ) #-&gt; &quot;sean russell&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: In the last example, the <tt>entity_filter</tt> argument is ignored.
- !ruby/struct:SM::Flow::P 
  body: <tt>pattern</tt> INTERNAL USE ONLY
full_name: REXML::Text::new
is_singleton: true
name: new
params: (arg, respect_whitespace=false, parent=nil, raw=nil, entity_filter=nil, illegal=ILLEGAL )
visibility: public
PKY}[�\?��7ri/1.8/system/REXML/Text/write_with_substitution-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Writes out text, substituting special characters beforehand. <tt>out</tt> A String, IO, or any other object supporting &lt;&lt;( String ) <tt>input</tt> the text to substitute and the write out
- !ruby/struct:SM::Flow::VERB 
  body: "  z=utf8.unpack(&quot;U*&quot;)\n  ascOut=&quot;&quot;\n  z.each{|r|\n    if r &lt;  0x100\n      ascOut.concat(r.chr)\n    else\n      ascOut.concat(sprintf(&quot;&amp;#x%x;&quot;, r))\n    end\n  }\n  puts ascOut\n"
full_name: REXML::Text#write_with_substitution
is_singleton: false
name: write_with_substitution
params: (out, input)
visibility: public
PKY}[k%>m��)ri/1.8/system/REXML/Text/node_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Text#node_type
is_singleton: false
name: node_type
params: ()
visibility: public
PKZ}[^I.���$ri/1.8/system/REXML/Text/wrap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Text#wrap
is_singleton: false
name: wrap
params: (string, width, addnewline=false)
visibility: public
PKZ}[�C�QQ%ri/1.8/system/REXML/Text/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: DEPRECATED
- !ruby/struct:SM::Flow::P 
  body: See REXML::Formatters
full_name: REXML::Text#write
is_singleton: false
name: write
params: ( writer, indent=-1, transitive=false, ie_hack=false )
visibility: public
PKZ}[���55&ri/1.8/system/REXML/Text/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Appends text to this text node. The text is appended in the <tt>raw</tt> mode of this text node.
full_name: REXML::Text#<<
is_singleton: false
name: "<<"
params: ( to_append )
visibility: public
PKZ}[�h�$ri/1.8/system/REXML/Text/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the string value of this text node. This string is always escaped, meaning that it is a valid XML text node string, and all entities that can be escaped, have been inserted. This method respects the entity filter set in the constructor.
- !ruby/struct:SM::Flow::VERB 
  body: "  # Assume that the entity &quot;s&quot; is defined to be &quot;sean&quot;, and that the\n  # entity &quot;r&quot; is defined to be &quot;russell&quot;\n  t = Text.new( &quot;&lt; &amp; sean russell&quot;, false, nil, false, ['s'] )\n  t.to_s   #-&gt; &quot;&amp;lt; &amp;amp; &amp;s; russell&quot;\n  t = Text.new( &quot;&lt; &amp; &amp;s; russell&quot;, false, nil, false )\n  t.to_s   #-&gt; &quot;&amp;lt; &amp;amp; &amp;s; russell&quot;\n  u = Text.new( &quot;sean russell&quot;, false, nil, true )\n  u.to_s   #-&gt; &quot;sean russell&quot;\n"
full_name: REXML::Text#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PKZ}[D�`��%ri/1.8/system/REXML/Text/clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Text#clone
is_singleton: false
name: clone
params: ()
visibility: public
PKZ}[9��z''+ri/1.8/system/REXML/Text/unnormalize-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Unescapes all possible entities
full_name: REXML::Text::unnormalize
is_singleton: true
name: unnormalize
params: ( string, doctype=nil, filter=nil, illegal=nil )
visibility: public
PKZ}[7 ����%ri/1.8/system/REXML/Text/xpath-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: FIXME This probably won't work properly
full_name: REXML::Text#xpath
is_singleton: false
name: xpath
params: ()
visibility: public
PKZ}[�$��&ri/1.8/system/REXML/Text/expand-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: REXML::Text::expand
is_singleton: true
name: expand
params: (ref, doctype, filter)
visibility: public
PKZ}[cW����%ri/1.8/system/REXML/Text/value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the string value of this text. This is the text without entities, as it might be used programmatically, or printed to the console. This ignores the 'raw' attribute setting, and any entity_filter.
- !ruby/struct:SM::Flow::VERB 
  body: "  # Assume that the entity &quot;s&quot; is defined to be &quot;sean&quot;, and that the\n  # entity &quot;r&quot; is defined to be &quot;russell&quot;\n  t = Text.new( &quot;&lt; &amp; sean russell&quot;, false, nil, false, ['s'] )\n  t.value   #-&gt; &quot;&lt; &amp; sean russell&quot;\n  t = Text.new( &quot;&lt; &amp; &amp;s; russell&quot;, false, nil, false )\n  t.value   #-&gt; &quot;&lt; &amp; sean russell&quot;\n  u = Text.new( &quot;sean russell&quot;, false, nil, true )\n  u.value   #-&gt; &quot;sean russell&quot;\n"
full_name: REXML::Text#value
is_singleton: false
name: value
params: ()
visibility: public
PKZ}[�4�%%6ri/1.8/system/REXML/Text/read_with_substitution-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reads text, substituting entities
full_name: REXML::Text::read_with_substitution
is_singleton: true
name: read_with_substitution
params: ( input, illegal=nil )
visibility: public
PKZ}[����>ri/1.8/system/Iconv/IllegalSequence/cdesc-IllegalSequence.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Input conversion stopped due to an input byte that does not belong to the input codeset, or the output codeset does not contain the character.
constants: []

full_name: Iconv::IllegalSequence
includes: 
- !ruby/object:RI::IncludedModule 
  name: Iconv::Failure
instance_methods: []

name: IllegalSequence
superclass: ArgError
PKZ}[Xa��WW4ri/1.8/system/Iconv/OutOfRange/cdesc-OutOfRange.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Iconv library internal error. Must not occur.
constants: []

full_name: Iconv::OutOfRange
includes: 
- !ruby/object:RI::IncludedModule 
  name: Iconv::Failure
instance_methods: []

name: OutOfRange
superclass: RuntimeError
PKZ}[s�F��ri/1.8/system/Iconv/conv-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Document-method: Iconv::conv"
- !ruby/struct:SM::Flow::P 
  body: Shorthand for
- !ruby/struct:SM::Flow::VERB 
  body: "  Iconv.iconv(to, from, str).join\n"
- !ruby/struct:SM::Flow::P 
  body: See Iconv.iconv.
full_name: Iconv::conv
is_singleton: true
name: conv
params: " Iconv.conv(to, from, str)\n"
visibility: public
PKZ}[�n�ޛ�@ri/1.8/system/Iconv/InvalidCharacter/cdesc-InvalidCharacter.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Input conversion stopped due to an incomplete character or shift sequence at the end of the input buffer.
constants: []

full_name: Iconv::InvalidCharacter
includes: 
- !ruby/object:RI::IncludedModule 
  name: Iconv::Failure
instance_methods: []

name: InvalidCharacter
superclass: ArgError
PKZ}[��?Z33ri/1.8/system/Iconv/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates new code converter from a coding-system designated with <tt>from</tt> to another one designated with <tt>to</tt>.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameters
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+to+:"
    body: encoding name for destination
  - !ruby/struct:SM::Flow::LI 
    label: "+from+:"
    body: encoding name for source
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Exceptions
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "TypeError:"
    body: if <tt>to</tt> or <tt>from</tt> aren't String
  - !ruby/struct:SM::Flow::LI 
    label: "InvalidEncoding:"
    body: if designated converter couldn't find out
  - !ruby/struct:SM::Flow::LI 
    label: "SystemCallError:"
    body: if <tt>iconv_open(3)</tt> fails
  type: :NOTE
full_name: Iconv::new
is_singleton: true
name: new
params: " Iconv.new(to, from)\n"
visibility: public
PKZ}[+Y9�BB$ri/1.8/system/Iconv/cdesc-Iconv.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: charset_map
- !ruby/object:RI::MethodSummary 
  name: conv
- !ruby/object:RI::MethodSummary 
  name: iconv
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: open
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Document-class: Iconv::BrokenLibrary"
- !ruby/struct:SM::Flow::P 
  body: Detected a bug of underlying iconv(3) libray.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: returns an error without setting errno properly
  type: :BULLET
constants: []

full_name: Iconv
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: iconv
name: Iconv
superclass: Data
PKZ}[�0��%%&ri/1.8/system/Iconv/charset_map-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the map from canonical name to system dependent name.
full_name: Iconv::charset_map
is_singleton: true
name: charset_map
params: " Iconv.charset_map\n"
visibility: public
PKZ}[���II*ri/1.8/system/Iconv/Failure/success-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns string(s) translated successfully until the exception occurred.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: In the case of failure occurred within Iconv.iconv, returned value is an array of strings translated successfully preceding failure and the last element is string on the way.
  type: :BULLET
full_name: Iconv::Failure#success
is_singleton: false
name: success
params: " success\n"
visibility: public
PKZ}[)�Q ==*ri/1.8/system/Iconv/Failure/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns inspected string like as: #&lt;<em>class</em>: <em>success</em>, <em>failed</em>&gt;"
full_name: Iconv::Failure#inspect
is_singleton: false
name: inspect
params: " inspect\n"
visibility: public
PKZ}[�q<�<<&ri/1.8/system/Iconv/Failure/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates new code converter from a coding-system designated with <tt>from</tt> to another one designated with <tt>to</tt>.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameters
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+to+:"
    body: encoding name for destination
  - !ruby/struct:SM::Flow::LI 
    label: "+from+:"
    body: encoding name for source
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Exceptions
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "TypeError:"
    body: if <tt>to</tt> or <tt>from</tt> aren't String
  - !ruby/struct:SM::Flow::LI 
    label: "InvalidEncoding:"
    body: if designated converter couldn't find out
  - !ruby/struct:SM::Flow::LI 
    label: "SystemCallError:"
    body: if <tt>iconv_open(3)</tt> fails
  type: :NOTE
full_name: Iconv::Failure::new
is_singleton: true
name: new
params: " Iconv.new(to, from)\n"
visibility: public
PKZ}[MmGG)ri/1.8/system/Iconv/Failure/failed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns substring of the original string passed to Iconv that starts at the character caused the exception.
full_name: Iconv::Failure#failed
is_singleton: false
name: failed
params: " failed\n"
visibility: public
PKZ}[���G��.ri/1.8/system/Iconv/Failure/cdesc-Failure.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Base attributes for Iconv exceptions.
constants: []

full_name: Iconv::Failure
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: failed
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: success
name: Failure
superclass: 
PKZ}[��-� ri/1.8/system/Iconv/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Finishes conversion.
- !ruby/struct:SM::Flow::P 
  body: "After calling this, calling Iconv#iconv will cause an exception, but multiple calls of #close are guaranteed to end successfully."
- !ruby/struct:SM::Flow::P 
  body: Returns a string containing the byte sequence to change the output buffer to its initial shift state.
full_name: Iconv#close
is_singleton: false
name: close
params: ()
visibility: public
PKZ}[�=��� ri/1.8/system/Iconv/iconv-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Document-method: Iconv#iconv"
- !ruby/struct:SM::Flow::P 
  body: Converts string and returns the result.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: If <tt>str</tt> is a String, converts <tt>str[start, length]</tt> and returns the converted string.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: If <tt>str</tt> is <tt>nil</tt>, places converter itself into initial shift state and just returns a string containing the byte sequence to change the output buffer to its initial shift state.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Otherwise, raises an exception.
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameters
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "str:"
    body: string to be converted, or nil
  - !ruby/struct:SM::Flow::LI 
    label: "start:"
    body: starting offset
  - !ruby/struct:SM::Flow::LI 
    label: "length:"
    body: conversion length; nil or -1 means whole the string from start
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Exceptions
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: IconvIllegalSequence
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: IconvInvalidCharacter
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: IconvOutOfRange
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Examples
- !ruby/struct:SM::Flow::P 
  body: See the Iconv documentation.
full_name: Iconv#iconv
is_singleton: false
name: iconv
params: " iconv(str, start=0, length=-1)\n"
visibility: public
PKZ}[0���:ri/1.8/system/Iconv/BrokenLibrary/cdesc-BrokenLibrary.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Detected a bug of underlying iconv(3) libray.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: returns an error without setting errno properly
  type: :BULLET
constants: []

full_name: Iconv::BrokenLibrary
includes: 
- !ruby/object:RI::IncludedModule 
  name: Iconv::Failure
instance_methods: []

name: BrokenLibrary
superclass: RuntimeError
PKZ}[�\�hh>ri/1.8/system/Iconv/InvalidEncoding/cdesc-InvalidEncoding.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Requested coding-system is not available on this system.
constants: []

full_name: Iconv::InvalidEncoding
includes: 
- !ruby/object:RI::IncludedModule 
  name: Iconv::Failure
instance_methods: []

name: InvalidEncoding
superclass: ArgError
PKZ}[�!xx ri/1.8/system/Iconv/iconv-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Document-method: Iconv::iconv"
- !ruby/struct:SM::Flow::P 
  body: Shorthand for
- !ruby/struct:SM::Flow::VERB 
  body: "  Iconv.open(to, from) { |cd|\n    (strs + [nil]).collect { |s| cd.iconv(s) }\n  }\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameters
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "<tt>to, from</tt>:"
    body: see Iconv.new
  - !ruby/struct:SM::Flow::LI 
    label: "<tt>strs</tt>:"
    body: strings to be converted
  type: :NOTE
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Exceptions
- !ruby/struct:SM::Flow::P 
  body: Exceptions thrown by Iconv.new, Iconv.open and Iconv#iconv.
full_name: Iconv::iconv
is_singleton: true
name: iconv
params: " Iconv.iconv(to, from, *strs)\n"
visibility: public
PKZ}[�ANѕ�ri/1.8/system/Iconv/open-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to Iconv.new except that when it is called with a block, it yields with the new instance and closes it, and returns the result which returned from the block.
full_name: Iconv::open
is_singleton: true
name: open
params: " Iconv.open(to, from) { |iconv| ... }\n"
visibility: public
PKZ}[:�A�UU&ri/1.8/system/Array/permutation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: When invoked with a block, yield all permutations of length <em>n</em> of the elements of <em>ary</em>, then return the array itself. If <em>n</em> is not specified, yield all permutations of all elements. The implementation makes no guarantees about the order in which the permutations are yielded.
- !ruby/struct:SM::Flow::P 
  body: When invoked without a block, return an enumerator object instead.
- !ruby/struct:SM::Flow::P 
  body: "Examples:"
- !ruby/struct:SM::Flow::VERB 
  body: "    a = [1, 2, 3]\n    a.permutation.to_a     #=&gt; [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]\n    a.permutation(1).to_a  #=&gt; [[1],[2],[3]]\n    a.permutation(2).to_a  #=&gt; [[1,2],[1,3],[2,1],[2,3],[3,1],[3,2]]\n    a.permutation(3).to_a  #=&gt; [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]\n    a.permutation(0).to_a  #=&gt; [[]] # one permutation of length 0\n    a.permutation(4).to_a  #=&gt; []   # no permutations of length 4\n"
full_name: Array#permutation
is_singleton: false
name: permutation
params: |
  ary.permutation { |p| block }          -> array
  ary.permutation                        -> enumerator
  ary.permutation(n) { |p| block }       -> array
  ary.permutation(n)                     -> enumerator

visibility: public
PKZ}[�۩�"ri/1.8/system/Array/shuffle-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new array with elements of this array shuffled.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ 1, 2, 3 ]           #=&gt; [1, 2, 3]\n   a.shuffle                 #=&gt; [2, 3, 1]\n"
full_name: Array#shuffle
is_singleton: false
name: shuffle
params: |
  array.shuffle -> an_array

visibility: public
PKZ}[p�)�""%ri/1.8/system/Array/shuffle%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Shuffles elements in <em>self</em> in place.
full_name: Array#shuffle!
is_singleton: false
name: shuffle!
params: |
  array.shuffle!        -> array or nil

visibility: public
PKZ}[[���pp$ri/1.8/system/Array/delete_at-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes the element at the specified index, returning that element, or <tt>nil</tt> if the index is out of range. See also <tt>Array#slice!</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = %w( ant bat cat dog )\n   a.delete_at(2)    #=&gt; &quot;cat&quot;\n   a                 #=&gt; [&quot;ant&quot;, &quot;bat&quot;, &quot;dog&quot;]\n   a.delete_at(99)   #=&gt; nil\n"
full_name: Array#delete_at
is_singleton: false
name: delete_at
params: |
  array.delete_at(index)  -> obj or nil

visibility: public
PKZ}[�z,��!ri/1.8/system/Array/rassoc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Searches through the array whose elements are also arrays. Compares <em>key</em> with the second element of each contained array using <tt>==</tt>. Returns the first contained array that matches. See also <tt>Array#assoc</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ [ 1, &quot;one&quot;], [2, &quot;two&quot;], [3, &quot;three&quot;], [&quot;ii&quot;, &quot;two&quot;] ]\n   a.rassoc(&quot;two&quot;)    #=&gt; [2, &quot;two&quot;]\n   a.rassoc(&quot;four&quot;)   #=&gt; nil\n"
full_name: Array#rassoc
is_singleton: false
name: rassoc
params: |
  array.rassoc(key) -> an_array or nil

visibility: public
PKZ}[�D�>��ri/1.8/system/Array/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #length"
full_name: Array#size
is_singleton: false
name: size
params: ()
visibility: public
PKZ}[�<?�%ri/1.8/system/Array/reverse%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reverses <em>self</em> in place.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]\n   a.reverse!       #=&gt; [&quot;c&quot;, &quot;b&quot;, &quot;a&quot;]\n   a                #=&gt; [&quot;c&quot;, &quot;b&quot;, &quot;a&quot;]\n"
full_name: Array#reverse!
is_singleton: false
name: reverse!
params: |
  array.reverse!   -> array 

visibility: public
PKZ}[s(�ee!ri/1.8/system/Array/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>array</em> and <em>other</em> are the same object, or are both arrays with the same content.
full_name: Array#eql?
is_singleton: false
name: eql?
params: |
  array.eql?(other)  -> true or false

visibility: public
PKZ}[� ���� ri/1.8/system/Array/slice-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Element Reference---Returns the element at <em>index</em>, or returns a subarray starting at <em>start</em> and continuing for <em>length</em> elements, or returns a subarray specified by <em>range</em>. Negative indices count backward from the end of the array (-1 is the last element). Returns nil if the index (or starting index) are out of range.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot; ]\n   a[2] +  a[0] + a[1]    #=&gt; &quot;cab&quot;\n   a[6]                   #=&gt; nil\n   a[1, 2]                #=&gt; [ &quot;b&quot;, &quot;c&quot; ]\n   a[1..3]                #=&gt; [ &quot;b&quot;, &quot;c&quot;, &quot;d&quot; ]\n   a[4..7]                #=&gt; [ &quot;e&quot; ]\n   a[6..10]               #=&gt; nil\n   a[-3, 3]               #=&gt; [ &quot;c&quot;, &quot;d&quot;, &quot;e&quot; ]\n   # special cases\n   a[5]                   #=&gt; nil\n   a[5, 1]                #=&gt; []\n   a[5..10]               #=&gt; []\n"
full_name: Array#slice
is_singleton: false
name: slice
params: |
  array[index]                -> obj      or nil
  array[start, length]        -> an_array or nil
  array[range]                -> an_array or nil
  array.slice(index)          -> obj      or nil
  array.slice(start, length)  -> an_array or nil
  array.slice(range)          -> an_array or nil

visibility: public
PKZ}[R�XV��#ri/1.8/system/Array/slice%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Deletes the element(s) given by an index (optionally with a length) or by a range. Returns the deleted object, subarray, or <tt>nil</tt> if the index is out of range. Equivalent to:"
- !ruby/struct:SM::Flow::VERB 
  body: "   def slice!(*args)\n     result = self[*args]\n     self[*args] = nil\n     result\n   end\n\n   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]\n   a.slice!(1)     #=&gt; &quot;b&quot;\n   a               #=&gt; [&quot;a&quot;, &quot;c&quot;]\n   a.slice!(-1)    #=&gt; &quot;c&quot;\n   a               #=&gt; [&quot;a&quot;]\n   a.slice!(100)   #=&gt; nil\n   a               #=&gt; [&quot;a&quot;]\n"
full_name: Array#slice!
is_singleton: false
name: slice!
params: |
  array.slice!(index)         -> obj or nil
  array.slice!(start, length) -> sub_array or nil
  array.slice!(range)         -> sub_array or nil 

visibility: public
PKZ}[�H9�UU"ri/1.8/system/Array/indexes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deprecated; use <tt>Array#values_at</tt>.
full_name: Array#indexes
is_singleton: false
name: indexes
params: |
  array.indexes( i1, i2, ... iN )   -> an_array
  array.indices( i1, i2, ... iN )   -> an_array

visibility: public
PKZ}[�'	'ri/1.8/system/Array/pack-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Packs the contents of <em>arr</em> into a binary sequence according to the directives in <em>aTemplateString</em> (see the table below) Directives ``A,'' ``a,'' and ``Z'' may be followed by a count, which gives the width of the resulting field. The remaining directives also may take a count, indicating the number of array elements to convert. If the count is an asterisk (``<tt>*</tt>''), all remaining array elements will be converted. Any of the directives ``<tt>sSiIlL</tt>'' may be followed by an underscore (``<tt>_</tt>'') to use the underlying platform's native size for the specified type; otherwise, they use a platform-independent size. Spaces are ignored in the template string. See also <tt>String#unpack</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]\n   n = [ 65, 66, 67 ]\n   a.pack(&quot;A3A3A3&quot;)   #=&gt; &quot;a  b  c  &quot;\n   a.pack(&quot;a3a3a3&quot;)   #=&gt; &quot;a\\000\\000b\\000\\000c\\000\\000&quot;\n   n.pack(&quot;ccc&quot;)      #=&gt; &quot;ABC&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: Directives for <tt>pack</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: " Integer   | Array   |\n Directive | Element | Meaning\n ------------------------------------------------------------------------\n    C      | Integer | 8-bit unsigned integer (unsigned char)\n    S      | Integer | 16-bit unsigned integer, native endian (uint16_t)\n    L      | Integer | 32-bit unsigned integer, native endian (uint32_t)\n    Q      | Integer | 64-bit unsigned integer, native endian (uint64_t)\n           |         |\n    c      | Integer | 8-bit signed integer (char)\n    s      | Integer | 16-bit signed integer, native endian (int16_t)\n    l      | Integer | 32-bit signed integer, native endian (int32_t)\n    q      | Integer | 64-bit signed integer, native endian (int64_t)\n           |         |\n    S_     | Integer | unsigned short, native endian\n    I, I_  | Integer | unsigned int, native endian\n    L_     | Integer | unsigned long, native endian\n           |         |\n    s_     | Integer | signed short, native endian\n    i, i_  | Integer | signed int, native endian\n    l_     | Integer | signed long, native endian\n           |         |\n    n      | Integer | 16-bit unsigned integer, network (big-endian) byte order\n    N      | Integer | 32-bit unsigned integer, network (big-endian) byte order\n    v      | Integer | 16-bit unsigned integer, VAX (little-endian) byte order\n    V      | Integer | 32-bit unsigned integer, VAX (little-endian) byte order\n           |         |\n    U      | Integer | UTF-8 character\n    w      | Integer | BER-compressed integer\n\n Float     |         |\n Directive |         | Meaning\n ------------------------------------------------------------------------\n    D, d   | Float   | double-precision float, native format\n    F, f   | Float   | single-precision float, native format\n    E      | Float   | double-precision float, little-endian byte order\n    e      | Float   | single-precision float, little-endian byte order\n    G      | Float   | double-precision float, network (big-endian) byte order\n    g      | Float   | single-precision float, network (big-endian) byte order\n\n String    |         |\n Directive |         | Meaning\n ------------------------------------------------------------------------\n    A      | String  | arbitrary binary string (space padded, count is width)\n    a      | String  | arbitrary binary string (null padded, count is width)\n    Z      | String  | same as ``a'', except that null is added with *\n    B      | String  | bit string (MSB first)\n    b      | String  | bit string (LSB first)\n    H      | String  | hex string (high nibble first)\n    h      | String  | hex string (low nibble first)\n    u      | String  | UU-encoded string\n    M      | String  | quoted printable, MIME encoding (see RFC2045)\n    m      | String  | base64 encoded string (see RFC 2045, count is width)\n    P      | String  | pointer to a structure (fixed-length string)\n    p      | String  | pointer to a null-terminated string\n\n Misc.     |         |\n Directive |         | Meaning\n ------------------------------------------------------------------------\n    @      | ---     | moves to absolute position\n    X      | ---     | back up a byte\n    x      | ---     | null byte\n"
full_name: Array#pack
is_singleton: false
name: pack
params: |
  arr.pack ( aTemplateString ) -> aBinaryString

visibility: public
PKZ}[\��B��"ri/1.8/system/Array/flatten-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new array that is a one-dimensional flattening of this array (recursively). That is, for every element that is an array, extract its elements into the new array. If the optional <em>level</em> argument determines the level of recursion to flatten.
- !ruby/struct:SM::Flow::VERB 
  body: "   s = [ 1, 2, 3 ]           #=&gt; [1, 2, 3]\n   t = [ 4, 5, 6, [7, 8] ]   #=&gt; [4, 5, 6, [7, 8]]\n   a = [ s, t, 9, 10 ]       #=&gt; [[1, 2, 3], [4, 5, 6, [7, 8]], 9, 10]\n   a.flatten                 #=&gt; [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n   a = [ 1, 2, [3, [4, 5] ] ]\n   a.flatten(1)              #=&gt; [1, 2, 3, [4, 5]]\n"
full_name: Array#flatten
is_singleton: false
name: flatten
params: |
  array.flatten -> an_array
  array.flatten(level) -> an_array

visibility: public
PKZ}[�P5���!ri/1.8/system/Array/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Element Reference---Returns the element at <em>index</em>, or returns a subarray starting at <em>start</em> and continuing for <em>length</em> elements, or returns a subarray specified by <em>range</em>. Negative indices count backward from the end of the array (-1 is the last element). Returns nil if the index (or starting index) are out of range.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot; ]\n   a[2] +  a[0] + a[1]    #=&gt; &quot;cab&quot;\n   a[6]                   #=&gt; nil\n   a[1, 2]                #=&gt; [ &quot;b&quot;, &quot;c&quot; ]\n   a[1..3]                #=&gt; [ &quot;b&quot;, &quot;c&quot;, &quot;d&quot; ]\n   a[4..7]                #=&gt; [ &quot;e&quot; ]\n   a[6..10]               #=&gt; nil\n   a[-3, 3]               #=&gt; [ &quot;c&quot;, &quot;d&quot;, &quot;e&quot; ]\n   # special cases\n   a[5]                   #=&gt; nil\n   a[5, 1]                #=&gt; []\n   a[5..10]               #=&gt; []\n"
full_name: Array#[]
is_singleton: false
name: "[]"
params: |
  array[index]                -> obj      or nil
  array[start, length]        -> an_array or nil
  array[range]                -> an_array or nil
  array.slice(index)          -> obj      or nil
  array.slice(start, length)  -> an_array or nil
  array.slice(range)          -> an_array or nil

visibility: public
PKZ}[�jNtt#ri/1.8/system/Array/empty%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>self</em> array contains no elements.
- !ruby/struct:SM::Flow::VERB 
  body: "   [].empty?   #=&gt; true\n"
full_name: Array#empty?
is_singleton: false
name: empty?
params: |
  array.empty?   -> true or false

visibility: public
PKZ}[x���LLri/1.8/system/Array/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls <em>block</em> once for each element in <em>self</em>, passing that element as a parameter.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]\n   a.each {|x| print x, &quot; -- &quot; }\n"
- !ruby/struct:SM::Flow::P 
  body: "produces:"
- !ruby/struct:SM::Flow::VERB 
  body: "   a -- b -- c --\n"
full_name: Array#each
is_singleton: false
name: each
params: |
  array.each {|item| block }   ->   array

visibility: public
PKZ}[��1�FF$ri/1.8/system/Array/frozen%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return <tt>true</tt> if this array is frozen (or temporarily frozen while being sorted).
full_name: Array#frozen?
is_singleton: false
name: frozen?
params: |
  array.frozen?  -> true or false

visibility: public
PKZ}[�%��$ri/1.8/system/Array/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Comparison---Returns an integer (-1, 0, or +1) if this array is less than, equal to, or greater than other_array. Each object in each array is compared (using &lt;=&gt;). If any value isn't equal, then that inequality is the return value. If all the values found are equal, then the return is based on a comparison of the array lengths. Thus, two arrays are ``equal'' according to <tt>Array#&lt;=&gt;</tt> if and only if they have the same length and the value of each element is equal to the value of the corresponding element in the other array.
- !ruby/struct:SM::Flow::VERB 
  body: "   [ &quot;a&quot;, &quot;a&quot;, &quot;c&quot; ]    &lt;=&gt; [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]   #=&gt; -1\n   [ 1, 2, 3, 4, 5, 6 ] &lt;=&gt; [ 1, 2 ]            #=&gt; +1\n"
full_name: Array#<=>
is_singleton: false
name: <=>
params: |
  array <=> other_array   ->  -1, 0, +1

visibility: public
PKZ}[���JJ!ri/1.8/system/Array/select-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invokes the block passing in successive elements from <em>array</em>, returning an array containing those elements for which the block returns a true value (equivalent to <tt>Enumerable#select</tt>).
- !ruby/struct:SM::Flow::VERB 
  body: "   a = %w{ a b c d e f }\n   a.select {|v| v =~ /[aeiou]/}   #=&gt; [&quot;a&quot;, &quot;e&quot;]\n"
full_name: Array#select
is_singleton: false
name: select
params: |
  array.select {|item| block } -> an_array

visibility: public
PKZ}[E���BBri/1.8/system/Array/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <em>self</em>. If called on a subclass of Array, converts the receiver to an Array object.
full_name: Array#to_a
is_singleton: false
name: to_a
params: |
  array.to_a     -> array

visibility: public
PKZ}[�nY)��ri/1.8/system/Array/last-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the last element(s) of <em>self</em>. If the array is empty, the first form returns <tt>nil</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   [ &quot;w&quot;, &quot;x&quot;, &quot;y&quot;, &quot;z&quot; ].last   #=&gt; &quot;z&quot;\n"
full_name: Array#last
is_singleton: false
name: last
params: |
  array.last     ->  obj or nil
  array.last(n)  ->  an_array

visibility: public
PKZ}[���.��ri/1.8/system/Array/at-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the element at <em>index</em>. A negative index counts from the end of <em>self</em>. Returns <tt>nil</tt> if the index is out of range. See also <tt>Array#[]</tt>. (<tt>Array#at</tt> is slightly faster than <tt>Array#[]</tt>, as it does not accept ranges and so on.)
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot; ]\n   a.at(0)     #=&gt; &quot;a&quot;\n   a.at(-1)    #=&gt; &quot;e&quot;\n"
full_name: Array#at
is_singleton: false
name: at
params: |
  array.at(index)   ->   obj  or nil

visibility: public
PKZ}[��?7CC$ri/1.8/system/Array/cdesc-Array.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Arrays are ordered, integer-indexed collections of any object. Array indexing starts at 0, as in C or Java. A negative index is assumed to be relative to the end of the array---that is, an index of -1 indicates the last element of the array, -2 is the next to last element in the array, and so on.
constants: []

full_name: Array
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "&"
- !ruby/object:RI::MethodSummary 
  name: "*"
- !ruby/object:RI::MethodSummary 
  name: +
- !ruby/object:RI::MethodSummary 
  name: "-"
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: abbrev
- !ruby/object:RI::MethodSummary 
  name: assoc
- !ruby/object:RI::MethodSummary 
  name: at
- !ruby/object:RI::MethodSummary 
  name: choice
- !ruby/object:RI::MethodSummary 
  name: clear
- !ruby/object:RI::MethodSummary 
  name: collect
- !ruby/object:RI::MethodSummary 
  name: collect!
- !ruby/object:RI::MethodSummary 
  name: combination
- !ruby/object:RI::MethodSummary 
  name: compact
- !ruby/object:RI::MethodSummary 
  name: compact!
- !ruby/object:RI::MethodSummary 
  name: concat
- !ruby/object:RI::MethodSummary 
  name: count
- !ruby/object:RI::MethodSummary 
  name: cycle
- !ruby/object:RI::MethodSummary 
  name: dclone
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: delete_at
- !ruby/object:RI::MethodSummary 
  name: delete_if
- !ruby/object:RI::MethodSummary 
  name: drop
- !ruby/object:RI::MethodSummary 
  name: drop_while
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: each_index
- !ruby/object:RI::MethodSummary 
  name: empty?
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: fetch
- !ruby/object:RI::MethodSummary 
  name: fill
- !ruby/object:RI::MethodSummary 
  name: find_index
- !ruby/object:RI::MethodSummary 
  name: first
- !ruby/object:RI::MethodSummary 
  name: flatten
- !ruby/object:RI::MethodSummary 
  name: flatten!
- !ruby/object:RI::MethodSummary 
  name: frozen?
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: include?
- !ruby/object:RI::MethodSummary 
  name: index
- !ruby/object:RI::MethodSummary 
  name: indexes
- !ruby/object:RI::MethodSummary 
  name: indices
- !ruby/object:RI::MethodSummary 
  name: initialize_copy
- !ruby/object:RI::MethodSummary 
  name: insert
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: join
- !ruby/object:RI::MethodSummary 
  name: last
- !ruby/object:RI::MethodSummary 
  name: length
- !ruby/object:RI::MethodSummary 
  name: map
- !ruby/object:RI::MethodSummary 
  name: map!
- !ruby/object:RI::MethodSummary 
  name: nitems
- !ruby/object:RI::MethodSummary 
  name: pack
- !ruby/object:RI::MethodSummary 
  name: permutation
- !ruby/object:RI::MethodSummary 
  name: pop
- !ruby/object:RI::MethodSummary 
  name: pretty_print
- !ruby/object:RI::MethodSummary 
  name: pretty_print_cycle
- !ruby/object:RI::MethodSummary 
  name: product
- !ruby/object:RI::MethodSummary 
  name: push
- !ruby/object:RI::MethodSummary 
  name: rassoc
- !ruby/object:RI::MethodSummary 
  name: reject
- !ruby/object:RI::MethodSummary 
  name: reject!
- !ruby/object:RI::MethodSummary 
  name: replace
- !ruby/object:RI::MethodSummary 
  name: reverse
- !ruby/object:RI::MethodSummary 
  name: reverse!
- !ruby/object:RI::MethodSummary 
  name: reverse_each
- !ruby/object:RI::MethodSummary 
  name: rindex
- !ruby/object:RI::MethodSummary 
  name: select
- !ruby/object:RI::MethodSummary 
  name: shelljoin
- !ruby/object:RI::MethodSummary 
  name: shift
- !ruby/object:RI::MethodSummary 
  name: shuffle
- !ruby/object:RI::MethodSummary 
  name: shuffle!
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: slice
- !ruby/object:RI::MethodSummary 
  name: slice!
- !ruby/object:RI::MethodSummary 
  name: sort
- !ruby/object:RI::MethodSummary 
  name: sort!
- !ruby/object:RI::MethodSummary 
  name: take
- !ruby/object:RI::MethodSummary 
  name: take_while
- !ruby/object:RI::MethodSummary 
  name: to_a
- !ruby/object:RI::MethodSummary 
  name: to_ary
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: to_yaml
- !ruby/object:RI::MethodSummary 
  name: transpose
- !ruby/object:RI::MethodSummary 
  name: uniq
- !ruby/object:RI::MethodSummary 
  name: uniq!
- !ruby/object:RI::MethodSummary 
  name: unshift
- !ruby/object:RI::MethodSummary 
  name: values_at
- !ruby/object:RI::MethodSummary 
  name: yaml_initialize
- !ruby/object:RI::MethodSummary 
  name: zip
- !ruby/object:RI::MethodSummary 
  name: "|"
name: Array
superclass: Object
PKZ}[���ܨ�!ri/1.8/system/Array/nitems-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of non-<tt>nil</tt> elements in <em>self</em>.
- !ruby/struct:SM::Flow::P 
  body: May be zero.
- !ruby/struct:SM::Flow::VERB 
  body: "   [ 1, nil, 3, nil, 5 ].nitems   #=&gt; 3\n"
full_name: Array#nitems
is_singleton: false
name: nitems
params: |
  array.nitems -> int

visibility: public
PKZ}[k�p���ri/1.8/system/Array/pop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes the last element from <em>self</em> and returns it, or <tt>nil</tt> if the array is empty.
- !ruby/struct:SM::Flow::P 
  body: If a number <em>n</em> is given, returns an array of the last n elements (or less) just like <tt>array.slice!(-n, n)</tt> does.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot; ]\n   a.pop     #=&gt; &quot;d&quot;\n   a.pop(2)  #=&gt; [&quot;b&quot;, &quot;c&quot;]\n   a         #=&gt; [&quot;a&quot;]\n"
full_name: Array#pop
is_singleton: false
name: pop
params: |
  array.pop    -> obj or nil
  array.pop(n) -> array

visibility: public
PKZ}[Io&&ri/1.8/system/Array/%7c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set Union---Returns a new array by joining this array with other_array, removing duplicates.
- !ruby/struct:SM::Flow::VERB 
  body: "   [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ] | [ &quot;c&quot;, &quot;d&quot;, &quot;a&quot; ]\n          #=&gt; [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot; ]\n"
full_name: Array#|
is_singleton: false
name: "|"
params: |
  array | other_array     ->  an_array

visibility: public
PKZ}[q���%ri/1.8/system/Array/drop_while-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Drops elements up to, but not including, the first element for which the block returns nil or false and returns an array containing the remaining elements.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [1, 2, 3, 4, 5, 0]\n   a.drop_while {|i| i &lt; 3 }   # =&gt; [3, 4, 5, 0]\n"
full_name: Array#drop_while
is_singleton: false
name: drop_while
params: |
  ary.drop_while {|arr| block }   => array

visibility: public
PKZ}[~�dL�� ri/1.8/system/Array/cycle-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls <em>block</em> for each element repeatedly <em>n</em> times or forever if none or nil is given. If a non-positive number is given or the array is empty, does nothing. Returns nil if the loop has finished without getting interrupted.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;]\n   a.cycle {|x| puts x }  # print, a, b, c, a, b, c,.. forever.\n   a.cycle(2) {|x| puts x }  # print, a, b, c, a, b, c.\n"
full_name: Array#cycle
is_singleton: false
name: cycle
params: |
  ary.cycle {|obj| block }
  ary.cycle(n) {|obj| block }

visibility: public
PKZ}[ф)c��!ri/1.8/system/Array/abbrev-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calculates the set of unambiguous abbreviations for the strings in <tt>self</tt>. If passed a pattern or a string, only the strings matching the pattern or starting with the string are considered.
- !ruby/struct:SM::Flow::VERB 
  body: "  %w{ car cone }.abbrev   #=&gt; { &quot;ca&quot; =&gt; &quot;car&quot;, &quot;car&quot; =&gt; &quot;car&quot;,\n                                &quot;co&quot; =&gt; &quot;cone&quot;, &quot;con&quot; =&gt; cone&quot;,\n                                &quot;cone&quot; =&gt; &quot;cone&quot; }\n"
full_name: Array#abbrev
is_singleton: false
name: abbrev
params: (pattern = nil)
visibility: public
PKZ}[^����ri/1.8/system/Array/%26-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set Intersection---Returns a new array containing elements common to the two arrays, with no duplicates.
- !ruby/struct:SM::Flow::VERB 
  body: "   [ 1, 1, 3, 5 ] &amp; [ 1, 2, 3 ]   #=&gt; [ 1, 3 ]\n"
full_name: Array#&
is_singleton: false
name: "&"
params: |
  array & other_array

visibility: public
PKZ}[�u����"ri/1.8/system/Array/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Array#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PKZ}[55���!ri/1.8/system/Array/concat-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Appends the elements in other_array to <em>self</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   [ &quot;a&quot;, &quot;b&quot; ].concat( [&quot;c&quot;, &quot;d&quot;] ) #=&gt; [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot; ]\n"
full_name: Array#concat
is_singleton: false
name: concat
params: |
  array.concat(other_array)   ->  array

visibility: public
PKZ}[��Y��"ri/1.8/system/Array/compact-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a copy of <em>self</em> with all <tt>nil</tt> elements removed.
- !ruby/struct:SM::Flow::VERB 
  body: "   [ &quot;a&quot;, nil, &quot;b&quot;, nil, &quot;c&quot;, nil ].compact\n                     #=&gt; [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]\n"
full_name: Array#compact
is_singleton: false
name: compact
params: |
  array.compact     ->  an_array

visibility: public
PKZ}[�G�hhri/1.8/system/Array/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compute a hash-code for this array. Two arrays with the same content will have the same hash code (and will compare using <tt>eql?</tt>).
full_name: Array#hash
is_singleton: false
name: hash
params: |
  array.hash   -> fixnum

visibility: public
PKZ}[��Vll$ri/1.8/system/Array/values_at-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array containing the elements in <em>self</em> corresponding to the given selector(s). The selectors may be either integer indices or ranges. See also <tt>Array#select</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = %w{ a b c d e f }\n   a.values_at(1, 3, 5)\n   a.values_at(1, 3, 5, 7)\n   a.values_at(-1, -3, -5, -7)\n   a.values_at(1..3, 2...5)\n"
full_name: Array#values_at
is_singleton: false
name: values_at
params: |
  array.values_at(selector,... )  -> an_array

visibility: public
PKZ}[X�N��%ri/1.8/system/Array/take_while-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes elements to the block until the block returns nil or false, then stops iterating and returns an array of all prior elements.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [1, 2, 3, 4, 5, 0]\n   a.take_while {|i| i &lt; 3 }   # =&gt; [1, 2]\n"
full_name: Array#take_while
is_singleton: false
name: take_while
params: |
  ary.take_while {|arr| block }   => array

visibility: public
PKZ}[l����*ri/1.8/system/Array/yaml_initialize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Array#yaml_initialize
is_singleton: false
name: yaml_initialize
params: ( tag, val )
visibility: public
PKZ}[&�-��"ri/1.8/system/Array/sort%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sorts <em>self</em>. Comparisons for the sort will be done using the <tt>&lt;=&gt;</tt> operator or using an optional code block. The block implements a comparison between <em>a</em> and <em>b</em>, returning -1, 0, or +1. See also <tt>Enumerable#sort_by</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;d&quot;, &quot;a&quot;, &quot;e&quot;, &quot;c&quot;, &quot;b&quot; ]\n   a.sort                    #=&gt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot;]\n   a.sort {|x,y| y &lt;=&gt; x }   #=&gt; [&quot;e&quot;, &quot;d&quot;, &quot;c&quot;, &quot;b&quot;, &quot;a&quot;]\n"
full_name: Array#sort!
is_singleton: false
name: sort!
params: |
  array.sort!                   -> array
  array.sort! {| a,b | block }  -> array 

visibility: public
PKZ}[=%0��!ri/1.8/system/Array/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes items from <em>self</em> that are equal to <em>obj</em>. If the item is not found, returns <tt>nil</tt>. If the optional code block is given, returns the result of <em>block</em> if the item is not found.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;b&quot;, &quot;b&quot;, &quot;c&quot; ]\n   a.delete(&quot;b&quot;)                   #=&gt; &quot;b&quot;\n   a                               #=&gt; [&quot;a&quot;, &quot;c&quot;]\n   a.delete(&quot;z&quot;)                   #=&gt; nil\n   a.delete(&quot;z&quot;) { &quot;not found&quot; }   #=&gt; &quot;not found&quot;\n"
full_name: Array#delete
is_singleton: false
name: delete
params: |
  array.delete(obj)            -> obj or nil 
  array.delete(obj) { block }  -> obj or nil

visibility: public
PKZ}[��,=��$ri/1.8/system/Array/reject%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>Array#delete_if</tt>, deleting elements from <em>self</em> for which the block evaluates to true, but returns <tt>nil</tt> if no changes were made. Also see <tt>Enumerable#reject</tt>.
full_name: Array#reject!
is_singleton: false
name: reject!
params: |
  array.reject! {|item| block }  -> array or nil

visibility: public
PKZ}[e!E�"ri/1.8/system/Array/collect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invokes <em>block</em> once for each element of <em>self</em>. Creates a new array containing the values returned by the block. See also <tt>Enumerable#collect</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot; ]\n   a.collect {|x| x + &quot;!&quot; }   #=&gt; [&quot;a!&quot;, &quot;b!&quot;, &quot;c!&quot;, &quot;d!&quot;]\n   a                          #=&gt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;]\n"
full_name: Array#collect
is_singleton: false
name: collect
params: |
  array.collect {|item| block }  -> an_array
  array.map     {|item| block }  -> an_array

visibility: public
PKZ}[���3FFri/1.8/system/Array/%2a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Repetition---With a String argument, equivalent to self.join(str). Otherwise, returns a new array built by concatenating the <em>int</em> copies of <em>self</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   [ 1, 2, 3 ] * 3    #=&gt; [ 1, 2, 3, 1, 2, 3, 1, 2, 3 ]\n   [ 1, 2, 3 ] * &quot;,&quot;  #=&gt; &quot;1,2,3&quot;\n"
full_name: Array#*
is_singleton: false
name: "*"
params: |
  array * int     ->    an_array
  array * str     ->    a_string

visibility: public
PKZ}[C��;UU"ri/1.8/system/Array/indices-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deprecated; use <tt>Array#values_at</tt>.
full_name: Array#indices
is_singleton: false
name: indices
params: |
  array.indexes( i1, i2, ... iN )   -> an_array
  array.indices( i1, i2, ... iN )   -> an_array

visibility: public
PKZ}[���AA ri/1.8/system/Array/index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the index of the first object in <em>self</em> such that is <tt>==</tt> to <em>obj</em>. If a block is given instead of an argument, returns first object for which <em>block</em> is true. Returns <tt>nil</tt> if no match is found.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]\n   a.index(&quot;b&quot;)        #=&gt; 1\n   a.index(&quot;z&quot;)        #=&gt; nil\n   a.index{|x|x==&quot;b&quot;}  #=&gt; 1\n"
- !ruby/struct:SM::Flow::P 
  body: This is an alias of <tt>#find_index</tt>.
full_name: Array#index
is_singleton: false
name: index
params: |
  array.index(obj)           ->  int or nil
  array.index {|item| block} ->  int or nil

visibility: public
PKZ}[�
I��$ri/1.8/system/Array/delete_if-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes every element of <em>self</em> for which <em>block</em> evaluates to <tt>true</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]\n   a.delete_if {|x| x &gt;= &quot;b&quot; }   #=&gt; [&quot;a&quot;]\n"
full_name: Array#delete_if
is_singleton: false
name: delete_if
params: |
  array.delete_if {|item| block }  -> array

visibility: public
PKZ}[!7�$��ri/1.8/system/Array/uniq-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new array by removing duplicate values in <em>self</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;a&quot;, &quot;b&quot;, &quot;b&quot;, &quot;c&quot; ]\n   a.uniq   #=&gt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;]\n"
full_name: Array#uniq
is_singleton: false
name: uniq
params: |
  array.uniq   -> an_array

visibility: public
PKZ}[���?��!ri/1.8/system/Array/to_ary-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <em>self</em>.
full_name: Array#to_ary
is_singleton: false
name: to_ary
params: |
  array.to_ary -> array

visibility: public
PKZ}[e[��ri/1.8/system/Array/drop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Drops first n elements from <em>ary</em>, and returns rest elements in an array.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [1, 2, 3, 4, 5, 0]\n   a.drop(3)             # =&gt; [4, 5, 0]\n"
full_name: Array#drop
is_singleton: false
name: drop
params: |
  ary.drop(n)               => array

visibility: public
PKZ}[/�D��$ri/1.8/system/Array/transpose-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Assumes that <em>self</em> is an array of arrays and transposes the rows and columns.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [[1,2], [3,4], [5,6]]\n   a.transpose   #=&gt; [[1, 3, 5], [2, 4, 6]]\n"
full_name: Array#transpose
is_singleton: false
name: transpose
params: |
  array.transpose -> an_array

visibility: public
PKZ}[�F�"ri/1.8/system/Array/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a printable version of <em>array</em>.
full_name: Array#inspect
is_singleton: false
name: inspect
params: |
  array.inspect  -> string

visibility: public
PKZ}[g��ɇ�ri/1.8/system/Array/take-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns first n elements from <em>ary</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [1, 2, 3, 4, 5, 0]\n   a.take(3)             # =&gt; [1, 2, 3]\n"
full_name: Array#take
is_singleton: false
name: take
params: |
  ary.take(n)               => array

visibility: public
PKZ}[EC�~\\"ri/1.8/system/Array/unshift-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Prepends objects to the front of <em>array</em>. other elements up one.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;b&quot;, &quot;c&quot;, &quot;d&quot; ]\n   a.unshift(&quot;a&quot;)   #=&gt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;]\n   a.unshift(1, 2)  #=&gt; [ 1, 2, &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;]\n"
full_name: Array#unshift
is_singleton: false
name: unshift
params: |
  array.unshift(obj, ...)  -> array

visibility: public
PKZ}[�A�~xx"ri/1.8/system/Array/uniq%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes duplicate elements from <em>self</em>. Returns <tt>nil</tt> if no changes are made (that is, no duplicates are found).
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;a&quot;, &quot;b&quot;, &quot;b&quot;, &quot;c&quot; ]\n   a.uniq!   #=&gt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;]\n   b = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]\n   b.uniq!   #=&gt; nil\n"
full_name: Array#uniq!
is_singleton: false
name: uniq!
params: |
  array.uniq! -> array or nil

visibility: public
PKZ}[�l��II%ri/1.8/system/Array/include%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the given object is present in <em>self</em> (that is, if any object <tt>==</tt> <em>anObject</em>), <tt>false</tt> otherwise.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]\n   a.include?(&quot;b&quot;)   #=&gt; true\n   a.include?(&quot;z&quot;)   #=&gt; false\n"
full_name: Array#include?
is_singleton: false
name: include?
params: |
  array.include?(obj)   -> true or false

visibility: public
PKZ}[��o#��ri/1.8/system/Array/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new array. In the first form, the new array is empty. In the second it is created with <em>size</em> copies of <em>obj</em> (that is, <em>size</em> references to the same <em>obj</em>). The third form creates a copy of the array passed as a parameter (the array is generated by calling to_ary on the parameter). In the last form, an array of the given size is created. Each element in this array is calculated by passing the element's index to the given block and storing the return value.
- !ruby/struct:SM::Flow::VERB 
  body: "   Array.new\n   Array.new(2)\n   Array.new(5, &quot;A&quot;)\n\n   # only one copy of the object is created\n   a = Array.new(2, Hash.new)\n   a[0]['cat'] = 'feline'\n   a\n   a[1]['cat'] = 'Felix'\n   a\n\n   # here multiple copies are created\n   a = Array.new(2) { Hash.new }\n   a[0]['cat'] = 'feline'\n   a\n\n   squares = Array.new(5) {|i| i*i}\n   squares\n\n   copy = Array.new(squares)\n"
full_name: Array::new
is_singleton: true
name: new
params: |
  Array.new(size=0, obj=nil)
  Array.new(array)
  Array.new(size) {|index| block }

visibility: public
PKZ}[�S!&��'ri/1.8/system/Array/pretty_print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Array#pretty_print
is_singleton: false
name: pretty_print
params: (q)
visibility: public
PKZ}[5x����"ri/1.8/system/Array/reverse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new array containing <em>self</em>'s elements in reverse order.
- !ruby/struct:SM::Flow::VERB 
  body: "   [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ].reverse   #=&gt; [&quot;c&quot;, &quot;b&quot;, &quot;a&quot;]\n   [ 1 ].reverse               #=&gt; [1]\n"
full_name: Array#reverse
is_singleton: false
name: reverse
params: |
  array.reverse -> an_array

visibility: public
PKZ}[
|���%ri/1.8/system/Array/flatten%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Flattens <em>self</em> in place. Returns <tt>nil</tt> if no modifications were made (i.e., <em>array</em> contains no subarrays.) If the optional <em>level</em> argument determines the level of recursion to flatten.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ 1, 2, [3, [4, 5] ] ]\n   a.flatten!   #=&gt; [1, 2, 3, 4, 5]\n   a.flatten!   #=&gt; nil\n   a            #=&gt; [1, 2, 3, 4, 5]\n   a = [ 1, 2, [3, [4, 5] ] ]\n   a.flatten!(1) #=&gt; [1, 2, 3, [4, 5]]\n"
full_name: Array#flatten!
is_singleton: false
name: flatten!
params: |
  array.flatten! -> array or nil
  array.flatten!(level) -> array or nil

visibility: public
PKZ}[�-��"ri/1.8/system/Array/replace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Replaces the contents of <em>self</em> with the contents of <em>other_array</em>, truncating or expanding if necessary.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot; ]\n   a.replace([ &quot;x&quot;, &quot;y&quot;, &quot;z&quot; ])   #=&gt; [&quot;x&quot;, &quot;y&quot;, &quot;z&quot;]\n   a                              #=&gt; [&quot;x&quot;, &quot;y&quot;, &quot;z&quot;]\n"
full_name: Array#replace
is_singleton: false
name: replace
params: |
  array.replace(other_array)  -> array

visibility: public
PKZ}[�
����ri/1.8/system/Array/zip-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts any arguments to arrays, then merges elements of <em>self</em> with corresponding elements from each argument. This generates a sequence of <tt>self.size</tt> <em>n</em>-element arrays, where <em>n</em> is one more that the count of arguments. If the size of any argument is less than <tt>enumObj.size</tt>, <tt>nil</tt> values are supplied. If a block given, it is invoked for each output array, otherwise an array of arrays is returned.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ 4, 5, 6 ]\n   b = [ 7, 8, 9 ]\n\n   [1,2,3].zip(a, b)      #=&gt; [[1, 4, 7], [2, 5, 8], [3, 6, 9]]\n   [1,2].zip(a,b)         #=&gt; [[1, 4, 7], [2, 5, 8]]\n   a.zip([1,2],[8])       #=&gt; [[4,1,8], [5,2,nil], [6,nil,nil]]\n"
full_name: Array#zip
is_singleton: false
name: zip
params: |
  array.zip(arg, ...)                   -> an_array
  array.zip(arg, ...) {| arr | block }  -> nil

visibility: public
PKZ}[Z��ч�ri/1.8/system/Array/push-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Append---Pushes the given object(s) on to the end of this array. This expression returns the array itself, so several appends may be chained together.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]\n   a.push(&quot;d&quot;, &quot;e&quot;, &quot;f&quot;)\n           #=&gt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot;, &quot;f&quot;]\n"
full_name: Array#push
is_singleton: false
name: push
params: |
  array.push(obj, ... )   -> array

visibility: public
PKZ}[����ri/1.8/system/Array/fill-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The first three forms set the selected elements of <em>self</em> (which may be the entire array) to <em>obj</em>. A <em>start</em> of <tt>nil</tt> is equivalent to zero. A <em>length</em> of <tt>nil</tt> is equivalent to <em>self.length</em>. The last three forms fill the array with the value of the block. The block is passed the absolute index of each element to be filled.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot; ]\n   a.fill(&quot;x&quot;)              #=&gt; [&quot;x&quot;, &quot;x&quot;, &quot;x&quot;, &quot;x&quot;]\n   a.fill(&quot;z&quot;, 2, 2)        #=&gt; [&quot;x&quot;, &quot;x&quot;, &quot;z&quot;, &quot;z&quot;]\n   a.fill(&quot;y&quot;, 0..1)        #=&gt; [&quot;y&quot;, &quot;y&quot;, &quot;z&quot;, &quot;z&quot;]\n   a.fill {|i| i*i}         #=&gt; [0, 1, 4, 9]\n   a.fill(-2) {|i| i*i*i}   #=&gt; [0, 1, 8, 27]\n"
full_name: Array#fill
is_singleton: false
name: fill
params: |
  array.fill(obj)                                -> array
  array.fill(obj, start [, length])              -> array
  array.fill(obj, range )                        -> array
  array.fill {|index| block }                    -> array
  array.fill(start [, length] ) {|index| block } -> array
  array.fill(range) {|index| block }             -> array

visibility: public
PKZ}[r�a=GG%ri/1.8/system/Array/compact%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes <tt>nil</tt> elements from array. Returns <tt>nil</tt> if no changes were made.
- !ruby/struct:SM::Flow::VERB 
  body: "   [ &quot;a&quot;, nil, &quot;b&quot;, nil, &quot;c&quot; ].compact! #=&gt; [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]\n   [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ].compact!           #=&gt; nil\n"
full_name: Array#compact!
is_singleton: false
name: compact!
params: |
  array.compact!    ->   array  or  nil

visibility: public
PKZ}[���0PP!ri/1.8/system/Array/reject-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new array containing the items in <em>self</em> for which the block is not true.
full_name: Array#reject
is_singleton: false
name: reject
params: |
  array.reject {|item| block }  -> an_array

visibility: public
PKZ}[(7$���*ri/1.8/system/Array/initialize_copy-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Replaces the contents of <em>self</em> with the contents of <em>other_array</em>, truncating or expanding if necessary.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot; ]\n   a.replace([ &quot;x&quot;, &quot;y&quot;, &quot;z&quot; ])   #=&gt; [&quot;x&quot;, &quot;y&quot;, &quot;z&quot;]\n   a                              #=&gt; [&quot;x&quot;, &quot;y&quot;, &quot;z&quot;]\n"
full_name: Array#initialize_copy
is_singleton: false
name: initialize_copy
params: |
  array.replace(other_array)  -> array

visibility: public
PKZ}[�����!ri/1.8/system/Array/rindex-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the index of the last object in <em>array</em> <tt>==</tt> to <em>obj</em>. If a block is given instead of an argument, returns first object for which <em>block</em> is true. Returns <tt>nil</tt> if no match is found.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;b&quot;, &quot;b&quot;, &quot;c&quot; ]\n   a.rindex(&quot;b&quot;)        #=&gt; 3\n   a.rindex(&quot;z&quot;)        #=&gt; nil\n   a.rindex{|x|x==&quot;b&quot;}  #=&gt; 3\n"
full_name: Array#rindex
is_singleton: false
name: rindex
params: |
  array.rindex(obj)    ->  int or nil

visibility: public
PKZ}[~��aKK%ri/1.8/system/Array/find_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the index of the first object in <em>self</em> such that is <tt>==</tt> to <em>obj</em>. If a block is given instead of an argument, returns first object for which <em>block</em> is true. Returns <tt>nil</tt> if no match is found.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]\n   a.index(&quot;b&quot;)        #=&gt; 1\n   a.index(&quot;z&quot;)        #=&gt; nil\n   a.index{|x|x==&quot;b&quot;}  #=&gt; 1\n"
- !ruby/struct:SM::Flow::P 
  body: This is an alias of <tt>#find_index</tt>.
full_name: Array#find_index
is_singleton: false
name: find_index
params: |
  array.index(obj)           ->  int or nil
  array.index {|item| block} ->  int or nil

visibility: public
PKZ}[*����� ri/1.8/system/Array/first-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the first element, or the first <tt>n</tt> elements, of the array. If the array is empty, the first form returns <tt>nil</tt>, and the second form returns an empty array.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;q&quot;, &quot;r&quot;, &quot;s&quot;, &quot;t&quot; ]\n   a.first    #=&gt; &quot;q&quot;\n   a.first(1) #=&gt; [&quot;q&quot;]\n   a.first(3) #=&gt; [&quot;q&quot;, &quot;r&quot;, &quot;s&quot;]\n"
full_name: Array#first
is_singleton: false
name: first
params: |
  array.first   ->   obj or nil
  array.first(n) -> an_array

visibility: public
PKZ}[�c��!ri/1.8/system/Array/length-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: size
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of elements in <em>self</em>. May be zero.
- !ruby/struct:SM::Flow::VERB 
  body: "   [ 1, 2, 3, 4, 5 ].length   #=&gt; 5\n"
full_name: Array#length
is_singleton: false
name: length
params: |
  array.length -> int

visibility: public
PKZ}[x�gk��ri/1.8/system/Array/%2b-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Concatenation---Returns a new array built by concatenating the two arrays together to produce a third array.
- !ruby/struct:SM::Flow::VERB 
  body: "   [ 1, 2, 3 ] + [ 4, 5 ]    #=&gt; [ 1, 2, 3, 4, 5 ]\n"
full_name: Array#+
is_singleton: false
name: +
params: |
  array + other_array   -> an_array

visibility: public
PKZ}[�RF66!ri/1.8/system/Array/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Append---Pushes the given object on to the end of this array. This expression returns the array itself, so several appends may be chained together.
- !ruby/struct:SM::Flow::VERB 
  body: "   [ 1, 2 ] &lt;&lt; &quot;c&quot; &lt;&lt; &quot;d&quot; &lt;&lt; [ 3, 4 ]\n           #=&gt;  [ 1, 2, &quot;c&quot;, &quot;d&quot;, [ 3, 4 ] ]\n"
full_name: Array#<<
is_singleton: false
name: "<<"
params: |
  array << obj            -> array

visibility: public
PKZ}[㟆11ri/1.8/system/Array/join-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a string created by converting each element of the array to a string, separated by <em>sep</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ].join        #=&gt; &quot;abc&quot;\n   [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ].join(&quot;-&quot;)   #=&gt; &quot;a-b-c&quot;\n"
full_name: Array#join
is_singleton: false
name: join
params: |
  array.join(sep=$,)    -> str

visibility: public
PKZ}[�d5

!ri/1.8/system/Array/choice-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Choose a random element from an array.
full_name: Array#choice
is_singleton: false
name: choice
params: |
  array.choice        -> obj

visibility: public
PKZ}[\{!2tt&ri/1.8/system/Array/combination-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: When invoked with a block, yields all combinations of length <em>n</em> of elements from <em>ary</em> and then returns <em>ary</em> itself. The implementation makes no guarantees about the order in which the combinations are yielded.
- !ruby/struct:SM::Flow::P 
  body: When invoked without a block, returns an enumerator object instead.
- !ruby/struct:SM::Flow::P 
  body: "Examples:"
- !ruby/struct:SM::Flow::VERB 
  body: "    a = [1, 2, 3, 4]\n    a.combination(1).to_a  #=&gt; [[1],[2],[3],[4]]\n    a.combination(2).to_a  #=&gt; [[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]\n    a.combination(3).to_a  #=&gt; [[1,2,3],[1,2,4],[1,3,4],[2,3,4]]\n    a.combination(4).to_a  #=&gt; [[1,2,3,4]]\n    a.combination(0).to_a  #=&gt; [[]] # one combination of length 0\n    a.combination(5).to_a  #=&gt; []   # no combinations of length 5\n"
full_name: Array#combination
is_singleton: false
name: combination
params: |
  ary.combination(n) { |c| block }    -> ary
  ary.combination(n)                  -> enumerator

visibility: public
PKZ}[꾞j��ri/1.8/system/Array/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <em>self</em><tt>.join</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   [ &quot;a&quot;, &quot;e&quot;, &quot;i&quot;, &quot;o&quot; ].to_s   #=&gt; &quot;aeio&quot;\n"
full_name: Array#to_s
is_singleton: false
name: to_s
params: |
  array.to_s -> string

visibility: public
PKZ}[�E�jri/1.8/system/Array/map-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invokes <em>block</em> once for each element of <em>self</em>. Creates a new array containing the values returned by the block. See also <tt>Enumerable#collect</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot; ]\n   a.collect {|x| x + &quot;!&quot; }   #=&gt; [&quot;a!&quot;, &quot;b!&quot;, &quot;c!&quot;, &quot;d!&quot;]\n   a                          #=&gt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;]\n"
full_name: Array#map
is_singleton: false
name: map
params: |
  array.collect {|item| block }  -> an_array
  array.map     {|item| block }  -> an_array

visibility: public
PK[}[&��m��!ri/1.8/system/Array/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equality---Two arrays are equal if they contain the same number of elements and if each element is equal to (according to Object.==) the corresponding element in the other array.
- !ruby/struct:SM::Flow::VERB 
  body: "   [ &quot;a&quot;, &quot;c&quot; ]    == [ &quot;a&quot;, &quot;c&quot;, 7 ]     #=&gt; false\n   [ &quot;a&quot;, &quot;c&quot;, 7 ] == [ &quot;a&quot;, &quot;c&quot;, 7 ]     #=&gt; true\n   [ &quot;a&quot;, &quot;c&quot;, 7 ] == [ &quot;a&quot;, &quot;d&quot;, &quot;f&quot; ]   #=&gt; false\n"
full_name: Array#==
is_singleton: false
name: ==
params: |
  array == other_array   ->   bool

visibility: public
PK[}[�1U���!ri/1.8/system/Array/map%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invokes the block once for each element of <em>self</em>, replacing the element with the value returned by <em>block</em>. See also <tt>Enumerable#collect</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot; ]\n   a.collect! {|x| x + &quot;!&quot; }\n   a             #=&gt;  [ &quot;a!&quot;, &quot;b!&quot;, &quot;c!&quot;, &quot;d!&quot; ]\n"
full_name: Array#map!
is_singleton: false
name: map!
params: |
  array.collect! {|item| block }   ->   array
  array.map!     {|item| block }   ->   array

visibility: public
PK[}[~�@C�� ri/1.8/system/Array/assoc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Searches through an array whose elements are also arrays comparing <em>obj</em> with the first element of each contained array using obj.==. Returns the first contained array that matches (that is, the first associated array), or <tt>nil</tt> if no match is found. See also <tt>Array#rassoc</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   s1 = [ &quot;colors&quot;, &quot;red&quot;, &quot;blue&quot;, &quot;green&quot; ]\n   s2 = [ &quot;letters&quot;, &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]\n   s3 = &quot;foo&quot;\n   a  = [ s1, s2, s3 ]\n   a.assoc(&quot;letters&quot;)  #=&gt; [ &quot;letters&quot;, &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]\n   a.assoc(&quot;foo&quot;)      #=&gt; nil\n"
full_name: Array#assoc
is_singleton: false
name: assoc
params: |
  array.assoc(obj)   ->  an_array  or  nil

visibility: public
PK[}[<�\\!ri/1.8/system/Array/insert-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Inserts the given values before the element with the given index (which may be negative).
- !ruby/struct:SM::Flow::VERB 
  body: "   a = %w{ a b c d }\n   a.insert(2, 99)         #=&gt; [&quot;a&quot;, &quot;b&quot;, 99, &quot;c&quot;, &quot;d&quot;]\n   a.insert(-2, 1, 2, 3)   #=&gt; [&quot;a&quot;, &quot;b&quot;, 99, &quot;c&quot;, 1, 2, 3, &quot;d&quot;]\n"
full_name: Array#insert
is_singleton: false
name: insert
params: |
  array.insert(index, obj...)  -> array

visibility: public
PK[}[V]�N��-ri/1.8/system/Array/pretty_print_cycle-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Array#pretty_print_cycle
is_singleton: false
name: pretty_print_cycle
params: (q)
visibility: public
PK[}[�$;���!ri/1.8/system/Array/dclone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Array#dclone
is_singleton: false
name: dclone
params: ()
visibility: public
PK[}[��#��ri/1.8/system/Array/sort-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new array created by sorting <em>self</em>. Comparisons for the sort will be done using the <tt>&lt;=&gt;</tt> operator or using an optional code block. The block implements a comparison between <em>a</em> and <em>b</em>, returning -1, 0, or +1. See also <tt>Enumerable#sort_by</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;d&quot;, &quot;a&quot;, &quot;e&quot;, &quot;c&quot;, &quot;b&quot; ]\n   a.sort                    #=&gt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot;]\n   a.sort {|x,y| y &lt;=&gt; x }   #=&gt; [&quot;e&quot;, &quot;d&quot;, &quot;c&quot;, &quot;b&quot;, &quot;a&quot;]\n"
full_name: Array#sort
is_singleton: false
name: sort
params: |
  array.sort                   -> an_array 
  array.sort {| a,b | block }  -> an_array 

visibility: public
PK[}[�׋ֿ� ri/1.8/system/Array/shift-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the first element of <em>self</em> and removes it (shifting all other elements down by one). Returns <tt>nil</tt> if the array is empty.
- !ruby/struct:SM::Flow::P 
  body: If a number <em>n</em> is given, returns an array of the first n elements (or less) just like <tt>array.slice!(0, n)</tt> does.
- !ruby/struct:SM::Flow::VERB 
  body: "   args = [ &quot;-m&quot;, &quot;-q&quot;, &quot;filename&quot; ]\n   args.shift     #=&gt; &quot;-m&quot;\n   args           #=&gt; [&quot;-q&quot;, &quot;filename&quot;]\n\n   args = [ &quot;-m&quot;, &quot;-q&quot;, &quot;filename&quot; ]\n   args.shift(2)  #=&gt; [&quot;-m&quot;, &quot;-q&quot;]\n   args           #=&gt; [&quot;filename&quot;]\n"
full_name: Array#shift
is_singleton: false
name: shift
params: |
  array.shift    -> obj or nil
  array.shift(n) -> array

visibility: public
PK[}[@�L�**"ri/1.8/system/Array/product-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array of all combinations of elements from all arrays. The length of the returned array is the product of the length of ary and the argument arrays
- !ruby/struct:SM::Flow::VERB 
  body: "   [1,2,3].product([4,5])     # =&gt; [[1,4],[1,5],[2,4],[2,5],[3,4],[3,5]]\n   [1,2].product([1,2])       # =&gt; [[1,1],[1,2],[2,1],[2,2]]\n   [1,2].product([3,4],[5,6]) # =&gt; [[1,3,5],[1,3,6],[1,4,5],[1,4,6],\n                              #     [2,3,5],[2,3,6],[2,4,5],[2,4,6]]\n   [1,2].product()            # =&gt; [[1],[2]]\n   [1,2].product([])          # =&gt; []\n"
full_name: Array#product
is_singleton: false
name: product
params: |
  ary.product(other_ary, ...)

visibility: public
PK[}[���aa%ri/1.8/system/Array/each_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Same as <tt>Array#each</tt>, but passes the index of the element instead of the element itself.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]\n   a.each_index {|x| print x, &quot; -- &quot; }\n"
- !ruby/struct:SM::Flow::P 
  body: "produces:"
- !ruby/struct:SM::Flow::VERB 
  body: "   0 -- 1 -- 2 --\n"
full_name: Array#each_index
is_singleton: false
name: each_index
params: |
  array.each_index {|index| block }  ->  array

visibility: public
PK[}[8uዛ�$ri/1.8/system/Array/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Element Assignment---Sets the element at <em>index</em>, or replaces a subarray starting at <em>start</em> and continuing for <em>length</em> elements, or replaces a subarray specified by <em>range</em>. If indices are greater than the current capacity of the array, the array grows automatically. A negative indices will count backward from the end of the array. Inserts elements if <em>length</em> is zero. If <tt>nil</tt> is used in the second and third form, deletes elements from <em>self</em>. An <tt>IndexError</tt> is raised if a negative index points past the beginning of the array. See also <tt>Array#push</tt>, and <tt>Array#unshift</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = Array.new\n   a[4] = &quot;4&quot;;                 #=&gt; [nil, nil, nil, nil, &quot;4&quot;]\n   a[0, 3] = [ 'a', 'b', 'c' ] #=&gt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, nil, &quot;4&quot;]\n   a[1..2] = [ 1, 2 ]          #=&gt; [&quot;a&quot;, 1, 2, nil, &quot;4&quot;]\n   a[0, 2] = &quot;?&quot;               #=&gt; [&quot;?&quot;, 2, nil, &quot;4&quot;]\n   a[0..2] = &quot;A&quot;               #=&gt; [&quot;A&quot;, &quot;4&quot;]\n   a[-1]   = &quot;Z&quot;               #=&gt; [&quot;A&quot;, &quot;Z&quot;]\n   a[1..-1] = nil              #=&gt; [&quot;A&quot;]\n"
full_name: Array#[]=
is_singleton: false
name: "[]="
params: |
  array[index]         = obj                     ->  obj
  array[start, length] = obj or an_array or nil  ->  obj or an_array or nil
  array[range]         = obj or an_array or nil  ->  obj or an_array or nil

visibility: public
PK[}[#Pz�oo!ri/1.8/system/Array/%5b%5d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new array populated with the given objects.
- !ruby/struct:SM::Flow::VERB 
  body: "  Array.[]( 1, 'a', /^A/ )\n  Array[ 1, 'a', /^A/ ]\n  [ 1, 'a', /^A/ ]\n"
full_name: Array::[]
is_singleton: true
name: "[]"
params: (...)
visibility: public
PK[}[V��.�� ri/1.8/system/Array/clear-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes all elements from <em>self</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot; ]\n   a.clear    #=&gt; [ ]\n"
full_name: Array#clear
is_singleton: false
name: clear
params: |
  array.clear    ->  array

visibility: public
PK[}[�+[�� ri/1.8/system/Array/count-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of elements. If an argument is given, counts the number of elements which equals to <em>obj</em>. If a block is given, counts the number of elements yielding a true value.
- !ruby/struct:SM::Flow::VERB 
  body: "   ary = [1, 2, 4, 2]\n   ary.count             # =&gt; 4\n   ary.count(2)          # =&gt; 2\n   ary.count{|x|x%2==0}  # =&gt; 3\n"
full_name: Array#count
is_singleton: false
name: count
params: |
  array.count      -> int
  array.count(obj) -> int
  array.count { |item| block }  -> int

visibility: public
PK[}[]U׭�� ri/1.8/system/Array/fetch-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Tries to return the element at position <em>index</em>. If the index lies outside the array, the first form throws an <tt>IndexError</tt> exception, the second form returns <em>default</em>, and the third form returns the value of invoking the block, passing in the index. Negative values of <em>index</em> count from the end of the array.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ 11, 22, 33, 44 ]\n   a.fetch(1)               #=&gt; 22\n   a.fetch(-1)              #=&gt; 44\n   a.fetch(4, 'cat')        #=&gt; &quot;cat&quot;\n   a.fetch(4) { |i| i*i }   #=&gt; 16\n"
full_name: Array#fetch
is_singleton: false
name: fetch
params: |
  array.fetch(index)                    -> obj
  array.fetch(index, default )          -> obj
  array.fetch(index) {|index| block }   -> obj

visibility: public
PK[}[s.M��$ri/1.8/system/Array/shelljoin-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Builds a command line string from an argument list <tt>array</tt> joining all elements escaped for Bourne shell and separated by a space. See +Shellwords::shelljoin+ for details.
full_name: Array#shelljoin
is_singleton: false
name: shelljoin
params: |
  array.shelljoin => string

visibility: public
PK[}[r�Pri/1.8/system/Array/%2d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Array Difference---Returns a new array that is a copy of the original array, removing any items that also appear in other_array. (If you need set-like behavior, see the library class Set.)
- !ruby/struct:SM::Flow::VERB 
  body: "   [ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ]  #=&gt;  [ 3, 3, 5 ]\n"
full_name: Array#-
is_singleton: false
name: "-"
params: |
  array - other_array    -> an_array

visibility: public
PK[}[�y�-=='ri/1.8/system/Array/reverse_each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Same as <tt>Array#each</tt>, but traverses <em>self</em> in reverse order.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]\n   a.reverse_each {|x| print x, &quot; &quot; }\n"
- !ruby/struct:SM::Flow::P 
  body: "produces:"
- !ruby/struct:SM::Flow::VERB 
  body: "   c b a\n"
full_name: Array#reverse_each
is_singleton: false
name: reverse_each
params: |
  array.reverse_each {|item| block } 

visibility: public
PK[}[ti�p��%ri/1.8/system/Array/collect%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invokes the block once for each element of <em>self</em>, replacing the element with the value returned by <em>block</em>. See also <tt>Enumerable#collect</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot; ]\n   a.collect! {|x| x + &quot;!&quot; }\n   a             #=&gt;  [ &quot;a!&quot;, &quot;b!&quot;, &quot;c!&quot;, &quot;d!&quot; ]\n"
full_name: Array#collect!
is_singleton: false
name: collect!
params: |
  array.collect! {|item| block }   ->   array
  array.map!     {|item| block }   ->   array

visibility: public
PK[}[�����>ri/1.8/system/TruncatedDataError/cdesc-TruncatedDataError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The read portion of an IO#readbytes attempt.
  name: data
  rw: R
class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: TruncatedDataError is raised when IO#readbytes fails to read enough data.
constants: []

full_name: TruncatedDataError
includes: []

instance_methods: []

name: TruncatedDataError
superclass: IOError
PK[}[M�%��5ri/1.8/system/Generators/HtmlClass/parent_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlClass#parent_name
is_singleton: false
name: parent_name
params: ()
visibility: public
PK[}[vU){��3ri/1.8/system/Generators/HtmlClass/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlClass#<=>
is_singleton: false
name: <=>
params: (other)
visibility: public
PK[}[]�
=��>ri/1.8/system/Generators/HtmlClass/build_attribute_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlClass#build_attribute_list
is_singleton: false
name: build_attribute_list
params: (section)
visibility: public
PK[}[I=::2ri/1.8/system/Generators/HtmlClass/http_url-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: return the relative file name to store this class in, which is also its url
full_name: Generators::HtmlClass#http_url
is_singleton: false
name: http_url
params: (full_name, prefix)
visibility: public
PK[}[f���2ri/1.8/system/Generators/HtmlClass/write_on-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlClass#write_on
is_singleton: false
name: write_on
params: (f)
visibility: public
PK[}[D��VV7ri/1.8/system/Generators/HtmlClass/cdesc-HtmlClass.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: path
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Wrap a ClassModule context
constants: []

full_name: Generators::HtmlClass
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: build_attribute_list
- !ruby/object:RI::MethodSummary 
  name: class_attribute_values
- !ruby/object:RI::MethodSummary 
  name: http_url
- !ruby/object:RI::MethodSummary 
  name: index_name
- !ruby/object:RI::MethodSummary 
  name: name
- !ruby/object:RI::MethodSummary 
  name: parent_name
- !ruby/object:RI::MethodSummary 
  name: value_hash
- !ruby/object:RI::MethodSummary 
  name: write_on
name: HtmlClass
superclass: ContextUser
PK[}[�����-ri/1.8/system/Generators/HtmlClass/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlClass::new
is_singleton: true
name: new
params: (context, html_file, prefix, options)
visibility: public
PK[}[�18���4ri/1.8/system/Generators/HtmlClass/index_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlClass#index_name
is_singleton: false
name: index_name
params: ()
visibility: public
PK[}[6�����4ri/1.8/system/Generators/HtmlClass/value_hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlClass#value_hash
is_singleton: false
name: value_hash
params: ()
visibility: public
PK[}[d0:��.ri/1.8/system/Generators/HtmlClass/name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlClass#name
is_singleton: false
name: name
params: ()
visibility: public
PK[}[�z���@ri/1.8/system/Generators/HtmlClass/class_attribute_values-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlClass#class_attribute_values
is_singleton: false
name: class_attribute_values
params: ()
visibility: public
PK[}[l����9ri/1.8/system/Generators/RIGenerator/process_class-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::RIGenerator#process_class
is_singleton: false
name: process_class
params: (from_class)
visibility: public
PK[}[c�����;ri/1.8/system/Generators/RIGenerator/cdesc-RIGenerator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: for
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: Generators::RIGenerator
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: generate
- !ruby/object:RI::MethodSummary 
  name: generate_class_info
- !ruby/object:RI::MethodSummary 
  name: generate_method_info
- !ruby/object:RI::MethodSummary 
  name: markup
- !ruby/object:RI::MethodSummary 
  name: method_list
- !ruby/object:RI::MethodSummary 
  name: params_of
- !ruby/object:RI::MethodSummary 
  name: process_class
- !ruby/object:RI::MethodSummary 
  name: update_or_replace
name: RIGenerator
superclass: Object
PK[}[�����5ri/1.8/system/Generators/RIGenerator/params_of-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::RIGenerator#params_of
is_singleton: false
name: params_of
params: (method)
visibility: private
PK[}[�Ogg/ri/1.8/system/Generators/RIGenerator/for-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generators may need to return specific subclasses depending on the options they are passed. Because of this we create them using a factory
full_name: Generators::RIGenerator::for
is_singleton: true
name: for
params: (options)
visibility: public
PK[}[@� �88/ri/1.8/system/Generators/RIGenerator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set up a new HTML generator. Basically all we do here is load up the correct output temlate
full_name: Generators::RIGenerator::new
is_singleton: true
name: new
params: (options)
visibility: public
PK[}[����=ri/1.8/system/Generators/RIGenerator/update_or_replace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: By default we replace existing classes with the same name. If the --merge option was given, we instead merge this definition into an existing class. We add our methods, aliases, etc to that class, but do not change the class's description.
full_name: Generators::RIGenerator#update_or_replace
is_singleton: false
name: update_or_replace
params: (cls_desc)
visibility: private
PK[}[~;N���2ri/1.8/system/Generators/RIGenerator/markup-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::RIGenerator#markup
is_singleton: false
name: markup
params: (comment)
visibility: private
PK[}[G�?#aa4ri/1.8/system/Generators/RIGenerator/generate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Build the initial indices and output objects based on an array of TopLevel objects containing the extracted information.
full_name: Generators::RIGenerator#generate
is_singleton: false
name: generate
params: (toplevels)
visibility: public
PK[}[�Nn��@ri/1.8/system/Generators/RIGenerator/generate_method_info-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::RIGenerator#generate_method_info
is_singleton: false
name: generate_method_info
params: (cls_desc, method)
visibility: public
PK[}[�X�R//7ri/1.8/system/Generators/RIGenerator/method_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: return a list of class and instance methods that we'll be documenting
full_name: Generators::RIGenerator#method_list
is_singleton: false
name: method_list
params: (cls)
visibility: private
PK[}[w8)���?ri/1.8/system/Generators/RIGenerator/generate_class_info-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::RIGenerator#generate_class_info
is_singleton: false
name: generate_class_info
params: (cls)
visibility: public
PK[}[}ԕM��=ri/1.8/system/Generators/XMLGenerator/gen_method_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::XMLGenerator#gen_method_index
is_singleton: false
name: gen_method_index
params: ()
visibility: public
PK[}[3�����=ri/1.8/system/Generators/XMLGenerator/build_class_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::XMLGenerator#build_class_list
is_singleton: false
name: build_class_list
params: (from, html_file, class_dir)
visibility: public
PK[}[�;�w��<ri/1.8/system/Generators/XMLGenerator/gen_class_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::XMLGenerator#gen_class_index
is_singleton: false
name: gen_class_index
params: ()
visibility: public
PK[}[��z���0ri/1.8/system/Generators/XMLGenerator/for-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Standard generator factory
full_name: Generators::XMLGenerator::for
is_singleton: true
name: for
params: (options)
visibility: public
PK[}[��fɷ�0ri/1.8/system/Generators/XMLGenerator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::XMLGenerator::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK[}[���g��9ri/1.8/system/Generators/XMLGenerator/gen_an_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::XMLGenerator#gen_an_index
is_singleton: false
name: gen_an_index
params: (collection, title)
visibility: public
PK[}[k��
II9ri/1.8/system/Generators/XMLGenerator/generate_xml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate all the HTML. For the one-file case, we generate all the information in to one big hash
full_name: Generators::XMLGenerator#generate_xml
is_singleton: false
name: generate_xml
params: ()
visibility: public
PK[}[��t��;ri/1.8/system/Generators/XMLGenerator/gen_file_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::XMLGenerator#gen_file_index
is_singleton: false
name: gen_file_index
params: ()
visibility: public
PK[}[=�l���:ri/1.8/system/Generators/XMLGenerator/build_indices-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Generate:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: a list of HtmlFile objects for each TopLevel object.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: a list of HtmlClass objects for each first level class or module in the TopLevel objects
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: a complete list of all hyperlinkable terms (file, class, module, and method names)
  type: :BULLET
full_name: Generators::XMLGenerator#build_indices
is_singleton: false
name: build_indices
params: ()
visibility: public
PK[}[�fl�]]5ri/1.8/system/Generators/XMLGenerator/generate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Build the initial indices and output objects based on an array of TopLevel objects containing the extracted information.
full_name: Generators::XMLGenerator#generate
is_singleton: false
name: generate
params: (info)
visibility: public
PK[}[�@�kk=ri/1.8/system/Generators/XMLGenerator/cdesc-XMLGenerator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: for
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate XML output as one big file
constants: []

full_name: Generators::XMLGenerator
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: build_class_list
- !ruby/object:RI::MethodSummary 
  name: build_indices
- !ruby/object:RI::MethodSummary 
  name: gen_an_index
- !ruby/object:RI::MethodSummary 
  name: gen_class_index
- !ruby/object:RI::MethodSummary 
  name: gen_file_index
- !ruby/object:RI::MethodSummary 
  name: gen_into
- !ruby/object:RI::MethodSummary 
  name: gen_method_index
- !ruby/object:RI::MethodSummary 
  name: generate
- !ruby/object:RI::MethodSummary 
  name: generate_xml
name: XMLGenerator
superclass: HTMLGenerator
PK[}[��C]��5ri/1.8/system/Generators/XMLGenerator/gen_into-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::XMLGenerator#gen_into
is_singleton: false
name: gen_into
params: (list)
visibility: public
PK[}[H�{K��4ri/1.8/system/Generators/HtmlFile/parent_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlFile#parent_name
is_singleton: false
name: parent_name
params: ()
visibility: public
PK[}[���>��2ri/1.8/system/Generators/HtmlFile/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlFile#<=>
is_singleton: false
name: <=>
params: (other)
visibility: public
PK[}[EAw���>ri/1.8/system/Generators/HtmlFile/file_attribute_values-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlFile#file_attribute_values
is_singleton: false
name: file_attribute_values
params: ()
visibility: public
PK[}[�}�g��1ri/1.8/system/Generators/HtmlFile/http_url-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlFile#http_url
is_singleton: false
name: http_url
params: (file_dir)
visibility: public
PK[}[(-���1ri/1.8/system/Generators/HtmlFile/write_on-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlFile#write_on
is_singleton: false
name: write_on
params: (f)
visibility: public
PK[}[�b��EE5ri/1.8/system/Generators/HtmlFile/cdesc-HtmlFile.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: path
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Handles the mapping of a file's information to HTML. In reality, a file corresponds to a <tt>TopLevel</tt> object, containing modules, classes, and top-level methods. In theory it <em>could</em> contain attributes and aliases, but we ignore these for now.
constants: []

full_name: Generators::HtmlFile
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: file_attribute_values
- !ruby/object:RI::MethodSummary 
  name: filename_to_label
- !ruby/object:RI::MethodSummary 
  name: http_url
- !ruby/object:RI::MethodSummary 
  name: index_name
- !ruby/object:RI::MethodSummary 
  name: parent_name
- !ruby/object:RI::MethodSummary 
  name: value_hash
- !ruby/object:RI::MethodSummary 
  name: write_on
name: HtmlFile
superclass: ContextUser
PK[}[��8���,ri/1.8/system/Generators/HtmlFile/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlFile::new
is_singleton: true
name: new
params: (context, options, file_dir)
visibility: public
PK[}[B�f���3ri/1.8/system/Generators/HtmlFile/index_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlFile#index_name
is_singleton: false
name: index_name
params: ()
visibility: public
PK[}[�H׿��3ri/1.8/system/Generators/HtmlFile/value_hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlFile#value_hash
is_singleton: false
name: value_hash
params: ()
visibility: public
PK[}[(ߺ
��:ri/1.8/system/Generators/HtmlFile/filename_to_label-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlFile#filename_to_label
is_singleton: false
name: filename_to_label
params: ()
visibility: public
PK[}[�A���>ri/1.8/system/Generators/ContextUser/build_include_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::ContextUser#build_include_list
is_singleton: false
name: build_include_list
params: (context)
visibility: public
PK[}[�s�]((Hri/1.8/system/Generators/ContextUser/build_constants_summary_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Build a list of constants
full_name: Generators::ContextUser#build_constants_summary_list
is_singleton: false
name: build_constants_summary_list
params: (section)
visibility: public
PK[}[�����?ri/1.8/system/Generators/ContextUser/build_requires_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::ContextUser#build_requires_list
is_singleton: false
name: build_requires_list
params: (context)
visibility: public
PK[}[NX���;ri/1.8/system/Generators/ContextUser/collect_methods-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a list of HtmlMethod objects for each method in the corresponding context object. If the @options.show_all variable is set (corresponding to the <tt>--all</tt> option, we include all methods, otherwise just the public ones.
full_name: Generators::ContextUser#collect_methods
is_singleton: false
name: collect_methods
params: ()
visibility: public
PK[}[%�G�  7ri/1.8/system/Generators/ContextUser/find_symbol-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Find a symbol in ourselves or our parent
full_name: Generators::ContextUser#find_symbol
is_singleton: false
name: find_symbol
params: (symbol, method=nil)
visibility: public
PK[}[��1��Dri/1.8/system/Generators/ContextUser/build_method_detail_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Build an array of arrays of method details. The outer array has up to six entries, public, private, and protected for both class methods, the other for instance methods. The inner arrays contain a hash for each method
full_name: Generators::ContextUser#build_method_detail_list
is_singleton: false
name: build_method_detail_list
params: (section)
visibility: public
PK[}[���PPDri/1.8/system/Generators/ContextUser/build_alias_summary_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Build a list of aliases for which we couldn't find a corresponding method
full_name: Generators::ContextUser#build_alias_summary_list
is_singleton: false
name: build_alias_summary_list
params: (section)
visibility: public
PK[}[����[[<ri/1.8/system/Generators/ContextUser/build_class_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Build the structured list of classes and modules contained in this context.
full_name: Generators::ContextUser#build_class_list
is_singleton: false
name: build_class_list
params: (level, from, section, infile=nil)
visibility: public
PK[}[��pv��/ri/1.8/system/Generators/ContextUser/url-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::ContextUser#url
is_singleton: false
name: url
params: (target)
visibility: public
PK[}[2@�CC;ri/1.8/system/Generators/ContextUser/cdesc-ContextUser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: context
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "A Context is built by the parser to represent a container: contexts hold classes, modules, methods, require lists and include lists. ClassModule and TopLevel are the context objects we process here"
constants: []

full_name: Generators::ContextUser
includes: 
- !ruby/object:RI::IncludedModule 
  name: MarkUp
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_table_of_sections
- !ruby/object:RI::MethodSummary 
  name: aref_to
- !ruby/object:RI::MethodSummary 
  name: as_href
- !ruby/object:RI::MethodSummary 
  name: build_alias_summary_list
- !ruby/object:RI::MethodSummary 
  name: build_class_list
- !ruby/object:RI::MethodSummary 
  name: build_constants_summary_list
- !ruby/object:RI::MethodSummary 
  name: build_include_list
- !ruby/object:RI::MethodSummary 
  name: build_method_detail_list
- !ruby/object:RI::MethodSummary 
  name: build_method_summary_list
- !ruby/object:RI::MethodSummary 
  name: build_requires_list
- !ruby/object:RI::MethodSummary 
  name: collect_methods
- !ruby/object:RI::MethodSummary 
  name: diagram_reference
- !ruby/object:RI::MethodSummary 
  name: document_self
- !ruby/object:RI::MethodSummary 
  name: find_symbol
- !ruby/object:RI::MethodSummary 
  name: href
- !ruby/object:RI::MethodSummary 
  name: potentially_referenced_list
- !ruby/object:RI::MethodSummary 
  name: url
name: ContextUser
superclass: Object
PK[}[I���/ri/1.8/system/Generators/ContextUser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::ContextUser::new
is_singleton: true
name: new
params: (context, options)
visibility: public
PK[}[�(��9ri/1.8/system/Generators/ContextUser/document_self-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::ContextUser#document_self
is_singleton: false
name: document_self
params: ()
visibility: public
PK\}[�Ff8dd3ri/1.8/system/Generators/ContextUser/as_href-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: return a reference to outselves to be used as an href= the form depends on whether we're all in one file or in multiple files
full_name: Generators::ContextUser#as_href
is_singleton: false
name: as_href
params: (from_path)
visibility: public
PK\}[%t���3ri/1.8/system/Generators/ContextUser/aref_to-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::ContextUser#aref_to
is_singleton: false
name: aref_to
params: (target)
visibility: public
PK\}[�Q�Q��=ri/1.8/system/Generators/ContextUser/diagram_reference-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::ContextUser#diagram_reference
is_singleton: false
name: diagram_reference
params: (diagram)
visibility: public
PK\}[�X����Gri/1.8/system/Generators/ContextUser/potentially_referenced_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (i.name)
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Build a list from an array of <em>Htmlxxx</em> items. Look up each in the AllReferences hash: if we find a corresponding entry, we generate a hyperlink to it, otherwise just output the name. However, some names potentially need massaging. For example, you may require a Ruby file without the .rb extension, but the file names we know about may have it. To deal with this, we pass in a block which performs the massaging, returning an array of alternative names to match"
full_name: Generators::ContextUser#potentially_referenced_list
is_singleton: false
name: potentially_referenced_list
params: (array) {|i.name| ...}
visibility: public
PK\}[�-GGEri/1.8/system/Generators/ContextUser/build_method_summary_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Build a summary list of all the methods in this context
full_name: Generators::ContextUser#build_method_summary_list
is_singleton: false
name: build_method_summary_list
params: (path_prefix="")
visibility: public
PK\}[ڄ3�0ri/1.8/system/Generators/ContextUser/href-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: convenience method to build a hyperlink
full_name: Generators::ContextUser#href
is_singleton: false
name: href
params: (link, cls, name)
visibility: public
PK\}[�
�))Ari/1.8/system/Generators/ContextUser/add_table_of_sections-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: create table of contents if we contain sections
full_name: Generators::ContextUser#add_table_of_sections
is_singleton: false
name: add_table_of_sections
params: ()
visibility: public
PK\}[m��}II@ri/1.8/system/Generators/CHMGenerator/create_project_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The project file links together all the various files that go to make up the help.
full_name: Generators::CHMGenerator#create_project_file
is_singleton: false
name: create_project_file
params: ()
visibility: public
PK\}[6w��Fri/1.8/system/Generators/CHMGenerator/create_contents_and_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The contents is a list of all files and modules. For each we include as sub-entries the list of methods they contain. As we build the contents we also build an index file
full_name: Generators::CHMGenerator#create_contents_and_index
is_singleton: false
name: create_contents_and_index
params: ()
visibility: public
PK\}[@��Q>>@ri/1.8/system/Generators/CHMGenerator/create_help_project-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The project contains the project file, a table of contents and an index
full_name: Generators::CHMGenerator#create_help_project
is_singleton: false
name: create_help_project
params: ()
visibility: public
PK\}[X|���0ri/1.8/system/Generators/CHMGenerator/for-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Standard generator factory
full_name: Generators::CHMGenerator::for
is_singleton: true
name: for
params: (options)
visibility: public
PK\}[嚉��0ri/1.8/system/Generators/CHMGenerator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::CHMGenerator::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK\}[}O�&��Iri/1.8/system/Generators/CHMGenerator/check_for_html_help_workshop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::CHMGenerator#check_for_html_help_workshop
is_singleton: false
name: check_for_html_help_workshop
params: ()
visibility: public
PK\}[e31�''<ri/1.8/system/Generators/CHMGenerator/compile_project-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invoke the windows help compiler to compiler the project
full_name: Generators::CHMGenerator#compile_project
is_singleton: false
name: compile_project
params: ()
visibility: public
PK\}[�3�'  5ri/1.8/system/Generators/CHMGenerator/generate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate the html as normal, then wrap it in a help project
full_name: Generators::CHMGenerator#generate
is_singleton: false
name: generate
params: (info)
visibility: public
PK\}[���Y=ri/1.8/system/Generators/CHMGenerator/cdesc-CHMGenerator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: for
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: HHC_PATH
  value: "\"c:/Program Files/HTML Help Workshop/hhc.exe\""
full_name: Generators::CHMGenerator
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: check_for_html_help_workshop
- !ruby/object:RI::MethodSummary 
  name: compile_project
- !ruby/object:RI::MethodSummary 
  name: create_contents_and_index
- !ruby/object:RI::MethodSummary 
  name: create_help_project
- !ruby/object:RI::MethodSummary 
  name: create_project_file
- !ruby/object:RI::MethodSummary 
  name: generate
name: CHMGenerator
superclass: HTMLGenerator
PK\}[�n��>ri/1.8/system/Generators/HTMLGenerator/gen_method_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HTMLGenerator#gen_method_index
is_singleton: false
name: gen_method_index
params: ()
visibility: private
PK\}[o����>ri/1.8/system/Generators/HTMLGenerator/build_class_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HTMLGenerator#build_class_list
is_singleton: false
name: build_class_list
params: (from, html_file, class_dir)
visibility: private
PK\}[X�����=ri/1.8/system/Generators/HTMLGenerator/gen_class_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HTMLGenerator#gen_class_index
is_singleton: false
name: gen_class_index
params: ()
visibility: private
PK\}[jjĠAAAri/1.8/system/Generators/HTMLGenerator/gen_sub_directories-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See the comments at the top for a description of the directory structure
full_name: Generators::HTMLGenerator#gen_sub_directories
is_singleton: false
name: gen_sub_directories
params: ()
visibility: private
PK\}[�v((5ri/1.8/system/Generators/HTMLGenerator/gen_url-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: convert a target url to one that is relative to a given path
full_name: Generators::HTMLGenerator::gen_url
is_singleton: true
name: gen_url
params: (path, target)
visibility: public
PK\}[�6�ii1ri/1.8/system/Generators/HTMLGenerator/for-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generators may need to return specific subclasses depending on the options they are passed. Because of this we create them using a factory
full_name: Generators::HTMLGenerator::for
is_singleton: true
name: for
params: (options)
visibility: public
PK\}[���&&?ri/1.8/system/Generators/HTMLGenerator/write_style_sheet-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Write out the style sheet used by the main frames
full_name: Generators::HTMLGenerator#write_style_sheet
is_singleton: false
name: write_style_sheet
params: ()
visibility: private
PK\}[H�|p::1ri/1.8/system/Generators/HTMLGenerator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set up a new HTML generator. Basically all we do here is load up the correct output temlate
full_name: Generators::HTMLGenerator::new
is_singleton: true
name: new
params: (options)
visibility: public
PK\}[s��:ri/1.8/system/Generators/HTMLGenerator/gen_an_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HTMLGenerator#gen_an_index
is_singleton: false
name: gen_an_index
params: (collection, title, template, filename)
visibility: private
PK\}[-�/;ri/1.8/system/Generators/HTMLGenerator/generate_html-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate all the HTML
full_name: Generators::HTMLGenerator#generate_html
is_singleton: false
name: generate_html
params: ()
visibility: private
PK\}[ӧ���<ri/1.8/system/Generators/HTMLGenerator/gen_file_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HTMLGenerator#gen_file_index
is_singleton: false
name: gen_file_index
params: ()
visibility: private
PK\}[�%���;ri/1.8/system/Generators/HTMLGenerator/build_indices-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Generate:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: a list of HtmlFile objects for each TopLevel object.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: a list of HtmlClass objects for each first level class or module in the TopLevel objects
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: a complete list of all hyperlinkable terms (file, class, module, and method names)
  type: :BULLET
full_name: Generators::HTMLGenerator#build_indices
is_singleton: false
name: build_indices
params: ()
visibility: private
PK\}[����cc6ri/1.8/system/Generators/HTMLGenerator/generate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Build the initial indices and output objects based on an array of TopLevel objects containing the extracted information.
full_name: Generators::HTMLGenerator#generate
is_singleton: false
name: generate
params: (toplevels)
visibility: public
PK\}[�'���6ri/1.8/system/Generators/HTMLGenerator/gen_into-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HTMLGenerator#gen_into
is_singleton: false
name: gen_into
params: (list)
visibility: private
PK\}[��$���<ri/1.8/system/Generators/HTMLGenerator/gen_main_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The main index page is mostly a template frameset, but includes the initial page. If the <tt>--main</tt> option was given, we use this as our main page, otherwise we use the first file specified on the command line.
full_name: Generators::HTMLGenerator#gen_main_index
is_singleton: false
name: gen_main_index
params: ()
visibility: private
PK\}[@��:bb@ri/1.8/system/Generators/HTMLGenerator/load_html_template-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Load up the HTML template specified in the options. If the template name contains a slash, use it literally
full_name: Generators::HTMLGenerator#load_html_template
is_singleton: false
name: load_html_template
params: ()
visibility: private
PK\}[���6ri/1.8/system/Generators/HTMLGenerator/main_url-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: return the url of the main page
full_name: Generators::HTMLGenerator#main_url
is_singleton: false
name: main_url
params: ()
visibility: private
PK\}[؛����?ri/1.8/system/Generators/HTMLGenerator/cdesc-HTMLGenerator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: for
- !ruby/object:RI::MethodSummary 
  name: gen_url
- !ruby/object:RI::MethodSummary 
  name: new
comment: []

constants: []

full_name: Generators::HTMLGenerator
includes: 
- !ruby/object:RI::IncludedModule 
  name: MarkUp
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: build_class_list
- !ruby/object:RI::MethodSummary 
  name: build_indices
- !ruby/object:RI::MethodSummary 
  name: gen_an_index
- !ruby/object:RI::MethodSummary 
  name: gen_class_index
- !ruby/object:RI::MethodSummary 
  name: gen_file_index
- !ruby/object:RI::MethodSummary 
  name: gen_into
- !ruby/object:RI::MethodSummary 
  name: gen_main_index
- !ruby/object:RI::MethodSummary 
  name: gen_method_index
- !ruby/object:RI::MethodSummary 
  name: gen_sub_directories
- !ruby/object:RI::MethodSummary 
  name: generate
- !ruby/object:RI::MethodSummary 
  name: generate_html
- !ruby/object:RI::MethodSummary 
  name: load_html_template
- !ruby/object:RI::MethodSummary 
  name: main_url
- !ruby/object:RI::MethodSummary 
  name: write_style_sheet
name: HTMLGenerator
superclass: Object
PK]}[����0ri/1.8/system/Generators/MarkUp/style_url-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Qualify a stylesheet URL; if if <tt>css_name</tt> does not begin with '/' or 'http[s]://', prepend a prefix relative to <tt>path</tt>. Otherwise, return it unmodified.
full_name: Generators::MarkUp#style_url
is_singleton: false
name: style_url
params: (path, css_name=nil)
visibility: public
PK]}[買-yy-ri/1.8/system/Generators/MarkUp/markup-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a string in markup format into HTML. We keep a cached SimpleMarkup object lying around after the first time we're called per object.
full_name: Generators::MarkUp#markup
is_singleton: false
name: markup
params: (str, remove_para=false)
visibility: public
PK]}[o�D���1ri/1.8/system/Generators/MarkUp/cdesc-MarkUp.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Handle common markup tasks for the various Html classes
constants: []

full_name: Generators::MarkUp
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: cvs_url
- !ruby/object:RI::MethodSummary 
  name: markup
- !ruby/object:RI::MethodSummary 
  name: style_url
name: MarkUp
superclass: 
PK]}[,�Ԓ��.ri/1.8/system/Generators/MarkUp/cvs_url-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Build a webcvs URL with the given 'url' argument. URLs with a '%s' in them get the file's path sprintfed into them; otherwise they're just catenated together.
full_name: Generators::MarkUp#cvs_url
is_singleton: false
name: cvs_url
params: (url, full_path)
visibility: public
PK]}[�L���2ri/1.8/system/Generators/AllReferences/keys-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::AllReferences::keys
is_singleton: true
name: keys
params: ()
visibility: public
PK]}[����3ri/1.8/system/Generators/AllReferences/reset-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::AllReferences::reset
is_singleton: true
name: reset
params: ()
visibility: public
PK]}[6���?ri/1.8/system/Generators/AllReferences/cdesc-AllReferences.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: keys
- !ruby/object:RI::MethodSummary 
  name: reset
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Build a hash of all items that can be cross-referenced. This is used when we output required and included names: if the names appear in this hash, we can generate an html cross reference to the appropriate description. We also use this when parsing comment blocks: any decorated words matching an entry in this list are hyperlinked."
constants: []

full_name: Generators::AllReferences
includes: []

instance_methods: []

name: AllReferences
superclass: Object
PK]}[ןvk��1ri/1.8/system/Generators/AllReferences/add-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::AllReferences::add
is_singleton: true
name: add
params: (name, html_class)
visibility: public
PK]}[����4ri/1.8/system/Generators/AllReferences/%5b%5d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::AllReferences::[]
is_singleton: true
name: "[]"
params: (name)
visibility: public
PK]}[G��
��?ri/1.8/system/Generators/HyperlinkHtml/cdesc-HyperlinkHtml.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Subclass of the SM::ToHtml class that supports looking up words in the AllReferences list. Those that are found (like AllReferences in this comment) will be hyperlinked
constants: []

full_name: Generators::HyperlinkHtml
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: gen_url
- !ruby/object:RI::MethodSummary 
  name: handle_special_CROSSREF
- !ruby/object:RI::MethodSummary 
  name: handle_special_HYPERLINK
- !ruby/object:RI::MethodSummary 
  name: handle_special_TIDYLINK
name: HyperlinkHtml
superclass: SM::ToHtml
PK]}[��ftssEri/1.8/system/Generators/HyperlinkHtml/handle_special_CROSSREF-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "We're invoked when any text matches the CROSSREF pattern (defined in MarkUp). If we fine the corresponding reference, generate a hyperlink. If the name we're looking for contains no punctuation, we look for it up the module/class chain. For example, HyperlinkHtml is found, even without the Generators:: prefix, because we look for it in module Generators first."
full_name: Generators::HyperlinkHtml#handle_special_CROSSREF
is_singleton: false
name: handle_special_CROSSREF
params: (special)
visibility: public
PK]}[�lN*pp5ri/1.8/system/Generators/HyperlinkHtml/gen_url-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Generate a hyperlink for url, labeled with text. Handle the special cases for img: and link: described under handle_special_HYPEDLINK"
full_name: Generators::HyperlinkHtml#gen_url
is_singleton: false
name: gen_url
params: (url, text)
visibility: public
PK]}[4���Eri/1.8/system/Generators/HyperlinkHtml/handle_special_TIDYLINK-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: HEre's a hypedlink where the label is different to the URL
- !ruby/struct:SM::Flow::VERB 
  body: " &lt;label&gt;[url]\n"
full_name: Generators::HyperlinkHtml#handle_special_TIDYLINK
is_singleton: false
name: handle_special_TIDYLINK
params: (special)
visibility: public
PK]}[j퉴��Fri/1.8/system/Generators/HyperlinkHtml/handle_special_HYPERLINK-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "And we're invoked with a potential external hyperlink mailto: just gets inserted. http: links are checked to see if they reference an image. If so, that image gets inserted using an &lt;img&gt; tag. Otherwise a conventional &lt;a href&gt; is used. We also support a special type of hyperlink, link:, which is a reference to a local file whose path is relative to the --op directory."
full_name: Generators::HyperlinkHtml#handle_special_HYPERLINK
is_singleton: false
name: handle_special_HYPERLINK
params: (special)
visibility: public
PK]}[��Mqaa1ri/1.8/system/Generators/HyperlinkHtml/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: We need to record the html path of our caller so we can generate correct relative paths for any hyperlinks that we find
full_name: Generators::HyperlinkHtml::new
is_singleton: true
name: new
params: (from_path, context)
visibility: public
PK]}[��"���6ri/1.8/system/Generators/HtmlMethod/description-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlMethod#description
is_singleton: false
name: description
params: ()
visibility: public
PK]}[��^���5ri/1.8/system/Generators/HtmlMethod/visibility-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlMethod#visibility
is_singleton: false
name: visibility
params: ()
visibility: public
PK]}[��;L��6ri/1.8/system/Generators/HtmlMethod/parent_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlMethod#parent_name
is_singleton: false
name: parent_name
params: ()
visibility: public
PK]}[L�KK��4ri/1.8/system/Generators/HtmlMethod/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlMethod#<=>
is_singleton: false
name: <=>
params: (other)
visibility: public
PK]}[WJ�m��6ri/1.8/system/Generators/HtmlMethod/find_symbol-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlMethod#find_symbol
is_singleton: false
name: find_symbol
params: (symbol, method=nil)
visibility: public
PK]}[�����/ri/1.8/system/Generators/HtmlMethod/path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlMethod#path
is_singleton: false
name: path
params: ()
visibility: public
PK]}[;����3ri/1.8/system/Generators/HtmlMethod/call_seq-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlMethod#call_seq
is_singleton: false
name: call_seq
params: ()
visibility: public
PK]}[�,ȹ��.ri/1.8/system/Generators/HtmlMethod/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlMethod::new
is_singleton: true
name: new
params: (context, html_class, options)
visibility: public
PK]}[s�4<<6ri/1.8/system/Generators/HtmlMethod/markup_code-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Given a sequence of source tokens, mark up the source code to make it look purty.
full_name: Generators::HtmlMethod#markup_code
is_singleton: false
name: markup_code
params: (tokens)
visibility: public
PK]}[�s})��5ri/1.8/system/Generators/HtmlMethod/index_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlMethod#index_name
is_singleton: false
name: index_name
params: ()
visibility: public
PK]}[G$�C��8ri/1.8/system/Generators/HtmlMethod/document_self-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlMethod#document_self
is_singleton: false
name: document_self
params: ()
visibility: public
PK]}[�r8L��Bri/1.8/system/Generators/HtmlMethod/create_source_code_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlMethod#create_source_code_file
is_singleton: false
name: create_source_code_file
params: (code_body)
visibility: public
PK]}[���`��4ri/1.8/system/Generators/HtmlMethod/singleton-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlMethod#singleton
is_singleton: false
name: singleton
params: ()
visibility: public
PK]}[�r�ִ�0ri/1.8/system/Generators/HtmlMethod/reset-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlMethod::reset
is_singleton: true
name: reset
params: ()
visibility: public
PK`}[م:}cc2ri/1.8/system/Generators/HtmlMethod/as_href-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: return a reference to outselves to be used as an href= the form depends on whether we're all in one file or in multiple files
full_name: Generators::HtmlMethod#as_href
is_singleton: false
name: as_href
params: (from_path)
visibility: public
PK`}[s��P��1ri/1.8/system/Generators/HtmlMethod/params-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlMethod#params
is_singleton: false
name: params
params: ()
visibility: public
PK`}[n[g��2ri/1.8/system/Generators/HtmlMethod/section-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlMethod#section
is_singleton: false
name: section
params: ()
visibility: public
PK`}[�q.��6ri/1.8/system/Generators/HtmlMethod/all_methods-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlMethod::all_methods
is_singleton: true
name: all_methods
params: ()
visibility: public
PK`}[����2ri/1.8/system/Generators/HtmlMethod/aliases-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlMethod#aliases
is_singleton: false
name: aliases
params: ()
visibility: public
PK`}[��4Dz�/ri/1.8/system/Generators/HtmlMethod/aref-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlMethod#aref
is_singleton: false
name: aref
params: ()
visibility: public
PK`}[#�t�||;ri/1.8/system/Generators/HtmlMethod/add_line_numbers-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: we rely on the fact that the first line of a source code listing has
- !ruby/struct:SM::Flow::VERB 
  body: "   # File xxxxx, line dddd\n"
full_name: Generators::HtmlMethod#add_line_numbers
is_singleton: false
name: add_line_numbers
params: (src)
visibility: public
PK`}[N�']vv9ri/1.8/system/Generators/HtmlMethod/cdesc-HtmlMethod.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: context
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: img_url
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: source_code
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: src_url
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: all_methods
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: reset
comment: []

constants: []

full_name: Generators::HtmlMethod
includes: 
- !ruby/object:RI::IncludedModule 
  name: MarkUp
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: add_line_numbers
- !ruby/object:RI::MethodSummary 
  name: aliases
- !ruby/object:RI::MethodSummary 
  name: aref
- !ruby/object:RI::MethodSummary 
  name: as_href
- !ruby/object:RI::MethodSummary 
  name: call_seq
- !ruby/object:RI::MethodSummary 
  name: create_source_code_file
- !ruby/object:RI::MethodSummary 
  name: description
- !ruby/object:RI::MethodSummary 
  name: document_self
- !ruby/object:RI::MethodSummary 
  name: find_symbol
- !ruby/object:RI::MethodSummary 
  name: index_name
- !ruby/object:RI::MethodSummary 
  name: markup_code
- !ruby/object:RI::MethodSummary 
  name: name
- !ruby/object:RI::MethodSummary 
  name: params
- !ruby/object:RI::MethodSummary 
  name: parent_name
- !ruby/object:RI::MethodSummary 
  name: path
- !ruby/object:RI::MethodSummary 
  name: section
- !ruby/object:RI::MethodSummary 
  name: singleton
- !ruby/object:RI::MethodSummary 
  name: visibility
name: HtmlMethod
superclass: Object
PK`}[�
L���/ri/1.8/system/Generators/HtmlMethod/name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HtmlMethod#name
is_singleton: false
name: name
params: ()
visibility: public
PK`}[�sa�.ri/1.8/system/Generators/cdesc-Generators.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Name of sub-direcories that hold file and class/module descriptions
  name: FILE_DIR
  value: "\"files\""
- !ruby/object:RI::Constant 
  comment: 
  name: CLASS_DIR
  value: "\"classes\""
- !ruby/object:RI::Constant 
  comment: 
  name: CSS_NAME
  value: "\"rdoc-style.css\""
full_name: Generators
includes: []

instance_methods: []

name: Generators
superclass: 
PK`}[I�����Cri/1.8/system/Generators/HTMLGeneratorInOne/gen_method_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HTMLGeneratorInOne#gen_method_index
is_singleton: false
name: gen_method_index
params: ()
visibility: public
PK`}[�2���Cri/1.8/system/Generators/HTMLGeneratorInOne/build_class_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HTMLGeneratorInOne#build_class_list
is_singleton: false
name: build_class_list
params: (from, html_file, class_dir)
visibility: public
PK`}[�SV���Bri/1.8/system/Generators/HTMLGeneratorInOne/gen_class_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HTMLGeneratorInOne#gen_class_index
is_singleton: false
name: gen_class_index
params: ()
visibility: public
PK`}[��ν�6ri/1.8/system/Generators/HTMLGeneratorInOne/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HTMLGeneratorInOne::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK`}[�$��?ri/1.8/system/Generators/HTMLGeneratorInOne/gen_an_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HTMLGeneratorInOne#gen_an_index
is_singleton: false
name: gen_an_index
params: (collection, title)
visibility: public
PK`}[n��5OO?ri/1.8/system/Generators/HTMLGeneratorInOne/generate_xml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate all the HTML. For the one-file case, we generate all the information in to one big hash
full_name: Generators::HTMLGeneratorInOne#generate_xml
is_singleton: false
name: generate_xml
params: ()
visibility: public
PK`}[O?�Iri/1.8/system/Generators/HTMLGeneratorInOne/cdesc-HTMLGeneratorInOne.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: []

constants: []

full_name: Generators::HTMLGeneratorInOne
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: build_class_list
- !ruby/object:RI::MethodSummary 
  name: build_indices
- !ruby/object:RI::MethodSummary 
  name: gen_an_index
- !ruby/object:RI::MethodSummary 
  name: gen_class_index
- !ruby/object:RI::MethodSummary 
  name: gen_file_index
- !ruby/object:RI::MethodSummary 
  name: gen_into
- !ruby/object:RI::MethodSummary 
  name: gen_method_index
- !ruby/object:RI::MethodSummary 
  name: generate
- !ruby/object:RI::MethodSummary 
  name: generate_xml
name: HTMLGeneratorInOne
superclass: HTMLGenerator
PK`}[�Cvh��Ari/1.8/system/Generators/HTMLGeneratorInOne/gen_file_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HTMLGeneratorInOne#gen_file_index
is_singleton: false
name: gen_file_index
params: ()
visibility: public
PK`}[j+���@ri/1.8/system/Generators/HTMLGeneratorInOne/build_indices-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Generate:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: a list of HtmlFile objects for each TopLevel object.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: a list of HtmlClass objects for each first level class or module in the TopLevel objects
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: a complete list of all hyperlinkable terms (file, class, module, and method names)
  type: :BULLET
full_name: Generators::HTMLGeneratorInOne#build_indices
is_singleton: false
name: build_indices
params: ()
visibility: public
PK`}[ʌ�cc;ri/1.8/system/Generators/HTMLGeneratorInOne/generate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Build the initial indices and output objects based on an array of TopLevel objects containing the extracted information.
full_name: Generators::HTMLGeneratorInOne#generate
is_singleton: false
name: generate
params: (info)
visibility: public
PK`}[�oR���;ri/1.8/system/Generators/HTMLGeneratorInOne/gen_into-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Generators::HTMLGeneratorInOne#gen_into
is_singleton: false
name: gen_into
params: (list)
visibility: public
PK`}[��9)��.ri/1.8/system/TSortArray/cdesc-TSortArray.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: TSortArray
includes: []

instance_methods: []

name: TSortArray
superclass: Array
PK`}[IW�#ri/1.8/system/Generator/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: self.next
comment: 
- !ruby/struct:SM::Flow::P 
  body: Rewinds the generator and enumerates the elements.
full_name: Generator#each
is_singleton: false
name: each
params: () {|self.next| ...}
visibility: public
PK`}[�|�&ri/1.8/system/Generator/next%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the generator has not reached the end yet.
full_name: Generator#next?
is_singleton: false
name: next?
params: ()
visibility: public
PK`}[
M;#ri/1.8/system/Generator/next-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the element at the current position and moves forward.
full_name: Generator#next
is_singleton: false
name: next
params: ()
visibility: public
PK`}[]Cv��,ri/1.8/system/Generator/cdesc-Generator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generator converts an internal iterator (i.e. an Enumerable object) to an external iterator.
- !ruby/struct:SM::Flow::P 
  body: Note that it is not very fast since it is implemented using continuations, which are currently slow.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'generator'\n\n  # Generator from an Enumerable object\n  g = Generator.new(['A', 'B', 'C', 'Z'])\n\n  while g.next?\n    puts g.next\n  end\n\n  # Generator from a block\n  g = Generator.new { |g|\n    for i in 'A'..'C'\n      g.yield i\n    end\n\n    g.yield 'Z'\n  }\n\n  # The same result as above\n  while g.next?\n    puts g.next\n  end\n"
constants: []

full_name: Generator
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: current
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: end?
- !ruby/object:RI::MethodSummary 
  name: index
- !ruby/object:RI::MethodSummary 
  name: next
- !ruby/object:RI::MethodSummary 
  name: next?
- !ruby/object:RI::MethodSummary 
  name: pos
- !ruby/object:RI::MethodSummary 
  name: rewind
- !ruby/object:RI::MethodSummary 
  name: yield
name: Generator
superclass: Object
PK`}[~q*Z��%ri/1.8/system/Generator/rewind-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Rewinds the generator.
full_name: Generator#rewind
is_singleton: false
name: rewind
params: ()
visibility: public
PK`}[�hRS$ri/1.8/system/Generator/index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the current index (position) counting from zero.
full_name: Generator#index
is_singleton: false
name: index
params: ()
visibility: public
PK`}[[#�S"ri/1.8/system/Generator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new generator either from an Enumerable object or from a block.
- !ruby/struct:SM::Flow::P 
  body: In the former, block is ignored even if given.
- !ruby/struct:SM::Flow::P 
  body: In the latter, the given block is called with the generator itself, and expected to call the <tt>yield</tt> method for each element.
full_name: Generator::new
is_singleton: true
name: new
params: (enum = nil, &block)
visibility: public
PK`}[����&ri/1.8/system/Generator/current-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the element at the current position.
full_name: Generator#current
is_singleton: false
name: current
params: ()
visibility: public
PK`}[KZ8I"ri/1.8/system/Generator/pos-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the current index (position) counting from zero.
full_name: Generator#pos
is_singleton: false
name: pos
params: ()
visibility: public
PK`}[�A�o��%ri/1.8/system/Generator/end%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the generator has reached the end.
full_name: Generator#end?
is_singleton: false
name: end?
params: ()
visibility: public
PK`}[ Qn~��$ri/1.8/system/Generator/yield-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Yields an element to the generator.
full_name: Generator#yield
is_singleton: false
name: yield
params: (value)
visibility: public
PK`}[l����*ri/1.8/system/Shellwords/shellwords-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #shellsplit"
full_name: Shellwords#shellwords
is_singleton: false
name: shellwords
params: (line)
visibility: public
PK`}[;�C==*ri/1.8/system/Shellwords/shellsplit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: shellwords
- !ruby/object:RI::AliasName 
  name: split
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Splits a string into an array of tokens in the same way the UNIX Bourne shell does.
- !ruby/struct:SM::Flow::VERB 
  body: "  argv = Shellwords.split('here are &quot;two words&quot;')\n  argv #=&gt; [&quot;here&quot;, &quot;are&quot;, &quot;two words&quot;]\n"
- !ruby/struct:SM::Flow::P 
  body: +String#shellsplit+ is a shorthand for this function.
- !ruby/struct:SM::Flow::VERB 
  body: "  argv = 'here are &quot;two words&quot;'.shellsplit\n  argv #=&gt; [&quot;here&quot;, &quot;are&quot;, &quot;two words&quot;]\n"
full_name: Shellwords#shellsplit
is_singleton: false
name: shellsplit
params: (line)
visibility: public
PK`}[R����%ri/1.8/system/Shellwords/split-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #shellsplit"
full_name: Shellwords#split
is_singleton: false
name: split
params: (line)
visibility: public
PK`}[�k���&ri/1.8/system/Shellwords/escape-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #shellescape"
full_name: Shellwords#escape
is_singleton: false
name: escape
params: (str)
visibility: public
PK`}[�����$ri/1.8/system/Shellwords/join-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #shelljoin"
full_name: Shellwords#join
is_singleton: false
name: join
params: (array)
visibility: public
PK`}[g؃���)ri/1.8/system/Shellwords/shelljoin-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: join
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Builds a command line string from an argument list <tt>array</tt> joining all elements escaped for Bourne shell and separated by a space.
- !ruby/struct:SM::Flow::VERB 
  body: "  open('|' + Shellwords.join(['grep', pattern, *files])) { |pipe|\n    # ...\n  }\n"
- !ruby/struct:SM::Flow::P 
  body: +Array#shelljoin+ is a shorthand for this function.
- !ruby/struct:SM::Flow::VERB 
  body: "  open('|' + ['grep', pattern, *files].shelljoin) { |pipe|\n    # ...\n  }\n"
full_name: Shellwords#shelljoin
is_singleton: false
name: shelljoin
params: (array)
visibility: public
PK`}[w$�OGG+ri/1.8/system/Shellwords/shellescape-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: escape
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Escapes a string so that it can be safely used in a Bourne shell command line.
- !ruby/struct:SM::Flow::P 
  body: Note that a resulted string should be used unquoted and is not intended for use in double quotes nor in single quotes.
- !ruby/struct:SM::Flow::VERB 
  body: "  open(&quot;| grep #{Shellwords.escape(pattern)} file&quot;) { |pipe|\n    # ...\n  }\n"
- !ruby/struct:SM::Flow::P 
  body: +String#shellescape+ is a shorthand for this function.
- !ruby/struct:SM::Flow::VERB 
  body: "  open(&quot;| grep #{pattern.shellescape} file&quot;) { |pipe|\n    # ...\n  }\n"
full_name: Shellwords#shellescape
is_singleton: false
name: shellescape
params: (str)
visibility: public
PK`}[.�TBvv.ri/1.8/system/Shellwords/cdesc-Shellwords.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: This module manipulates strings according to the word parsing rules of the UNIX Bourne shell.
- !ruby/struct:SM::Flow::P 
  body: The shellwords() function was originally a port of shellwords.pl, but modified to conform to POSIX / SUSv3 (IEEE Std 1003.1-2001).
- !ruby/struct:SM::Flow::P 
  body: "Authors:"
- !ruby/struct:SM::Flow::VERB 
  body: "  - Wakou Aoyama\n  - Akinori MUSHA &lt;knu@iDaemons.org&gt;\n"
- !ruby/struct:SM::Flow::P 
  body: "Contact:"
- !ruby/struct:SM::Flow::VERB 
  body: "  - Akinori MUSHA &lt;knu@iDaemons.org&gt; (current maintainer)\n"
constants: []

full_name: Shellwords
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: escape
- !ruby/object:RI::MethodSummary 
  name: join
- !ruby/object:RI::MethodSummary 
  name: shellescape
- !ruby/object:RI::MethodSummary 
  name: shelljoin
- !ruby/object:RI::MethodSummary 
  name: shellsplit
- !ruby/object:RI::MethodSummary 
  name: shellwords
- !ruby/object:RI::MethodSummary 
  name: split
name: Shellwords
superclass: 
PK`}[��JJ#ri/1.8/system/Object/methods-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a list of the names of methods publicly accessible in <em>obj</em>. This will include all the methods accessible in <em>obj</em>'s ancestors.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Klass\n     def kMethod()\n     end\n   end\n   k = Klass.new\n   k.methods[0..9]    #=&gt; [&quot;kMethod&quot;, &quot;freeze&quot;, &quot;nil?&quot;, &quot;is_a?&quot;,\n                           &quot;class&quot;, &quot;instance_variable_set&quot;,\n                            &quot;methods&quot;, &quot;extend&quot;, &quot;<em>send</em>&quot;, &quot;instance_eval&quot;]\n   k.methods.length   #=&gt; 42\n"
full_name: Object#methods
is_singleton: false
name: methods
params: |
  obj.methods    => array

visibility: public
PK`}[�a�=cc.ri/1.8/system/Object/instance_variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array of instance variable names for the receiver. Note that simply defining an accessor does not create the corresponding instance variable.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Fred\n     attr_accessor :a1\n     def initialize\n       @iv = 3\n     end\n   end\n   Fred.new.instance_variables   #=&gt; [&quot;@iv&quot;]\n"
full_name: Object#instance_variables
is_singleton: false
name: instance_variables
params: |
  obj.instance_variables    => array

visibility: public
PK`}[:(!�PP"ri/1.8/system/Object/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equality---At the <tt>Object</tt> level, <tt>==</tt> returns <tt>true</tt> only if <em>obj</em> and <em>other</em> are the same object. Typically, this method is overridden in descendent classes to provide class-specific meaning.
- !ruby/struct:SM::Flow::P 
  body: "Unlike <tt>==</tt>, the <tt>equal?</tt> method should never be overridden by subclasses: it is used to determine object identity (that is, <tt>a.equal?(b)</tt> iff <tt>a</tt> is the same object as <tt>b</tt>)."
- !ruby/struct:SM::Flow::P 
  body: "The <tt>eql?</tt> method returns <tt>true</tt> if <em>obj</em> and <em>anObject</em> have the same value. Used by <tt>Hash</tt> to test members for equality. For objects of class <tt>Object</tt>, <tt>eql?</tt> is synonymous with <tt>==</tt>. Subclasses normally continue this tradition, but there are exceptions. <tt>Numeric</tt> types, for example, perform type conversion across <tt>==</tt>, but not across <tt>eql?</tt>, so:"
- !ruby/struct:SM::Flow::VERB 
  body: "   1 == 1.0     #=&gt; true\n   1.eql? 1.0   #=&gt; false\n"
full_name: Object#eql?
is_singleton: false
name: eql?
params: |
  obj == other        => true or false
  obj.equal?(other)   => true or false
  obj.eql?(other)     => true or false

visibility: public
PK`}[�8ÊMM!ri/1.8/system/Object/class-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the class of <em>obj</em>, now preferred over <tt>Object#type</tt>, as an object's type in Ruby is only loosely tied to that object's class. This method must always be called with an explicit receiver, as <tt>class</tt> is also a reserved word in Ruby.
- !ruby/struct:SM::Flow::VERB 
  body: "   1.class      #=&gt; Fixnum\n   self.class   #=&gt; Object\n"
full_name: Object#class
is_singleton: false
name: class
params: |
  obj.class    => class

visibility: public
PK`}[�z�k��$ri/1.8/system/Object/__send__-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invokes the method identified by <em>symbol</em>, passing it any arguments specified. You can use <tt>__send__</tt> if the name <tt>send</tt> clashes with an existing method in <em>obj</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Klass\n     def hello(*args)\n       &quot;Hello &quot; + args.join(' ')\n     end\n   end\n   k = Klass.new\n   k.send :hello, &quot;gentle&quot;, &quot;readers&quot;   #=&gt; &quot;Hello gentle readers&quot;\n"
full_name: Object#__send__
is_singleton: false
name: __send__
params: |
  obj.send(symbol [, args...])        => obj
  obj.__send__(symbol [, args...])    => obj

visibility: public
PK`}[Ɨ��bb"ri/1.8/system/Object/%3d%7e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pattern Match---Overridden by descendents (notably <tt>Regexp</tt> and <tt>String</tt>) to provide meaningful pattern-match semantics.
full_name: Object#=~
is_singleton: false
name: =~
params: |
  obj =~ other  => false

visibility: public
PK`}[1Ѝ��%ri/1.8/system/Object/frozen%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the freeze status of <em>obj</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]\n   a.freeze    #=&gt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;]\n   a.frozen?   #=&gt; true\n"
full_name: Object#frozen?
is_singleton: false
name: frozen?
params: |
  obj.frozen?    => true or false

visibility: public
PK`}[���'�� ri/1.8/system/Object/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array representation of <em>obj</em>. For objects of class <tt>Object</tt> and others that don't explicitly override the method, the return value is an array containing <tt>self</tt>. However, this latter behavior will soon be obsolete.
- !ruby/struct:SM::Flow::VERB 
  body: "   self.to_a       #=&gt; -:1: warning: default `to_a' will be obsolete\n   &quot;hello&quot;.to_a    #=&gt; [&quot;hello&quot;]\n   Time.new.to_a   #=&gt; [39, 54, 8, 9, 4, 2003, 3, 99, true, &quot;CDT&quot;]\n"
full_name: Object#to_a
is_singleton: false
name: to_a
params: |
  obj.to_a -> anArray

visibility: public
PK`}[[N�(dd%ri/1.8/system/Object/object_id-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an integer identifier for <em>obj</em>. The same number will be returned on all calls to <tt>id</tt> for a given object, and no two active objects will share an id. <tt>Object#object_id</tt> is a different concept from the <tt>:name</tt> notation, which returns the symbol id of <tt>name</tt>. Replaces the deprecated <tt>Object#id</tt>.
full_name: Object#object_id
is_singleton: false
name: object_id
params: |
  obj.__id__       => fixnum
  obj.object_id    => fixnum

visibility: public
PK`}[����#ri/1.8/system/Object/is_a%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>class</em> is the class of <em>obj</em>, or if <em>class</em> is one of the superclasses of <em>obj</em> or modules included in <em>obj</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   module M;    end\n   class A\n     include M\n   end\n   class B &lt; A; end\n   class C &lt; B; end\n   b = B.new\n   b.instance_of? A   #=&gt; false\n   b.instance_of? B   #=&gt; true\n   b.instance_of? C   #=&gt; false\n   b.instance_of? M   #=&gt; false\n   b.kind_of? A       #=&gt; true\n   b.kind_of? B       #=&gt; true\n   b.kind_of? C       #=&gt; false\n   b.kind_of? M       #=&gt; true\n"
full_name: Object#is_a?
is_singleton: false
name: is_a?
params: |
  obj.is_a?(class)       => true or false
  obj.kind_of?(class)    => true or false

visibility: public
PK`}[i����*ri/1.8/system/Object/public_methods-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the list of public methods accessible to <em>obj</em>. If the <em>all</em> parameter is set to <tt>false</tt>, only those methods in the receiver will be listed.
full_name: Object#public_methods
is_singleton: false
name: public_methods
params: |
  obj.public_methods(all=true)   => array

visibility: public
PK`}[�O���ri/1.8/system/Object/dup-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Produces a shallow copy of <em>obj</em>---the instance variables of <em>obj</em> are copied, but not the objects they reference. <tt>dup</tt> copies the tainted state of <em>obj</em>. See also the discussion under <tt>Object#clone</tt>. In general, <tt>clone</tt> and <tt>dup</tt> may have different semantics in descendent classes. While <tt>clone</tt> is used to duplicate an object, including its internal state, <tt>dup</tt> typically uses the class of the descendent object to create the new instance.
- !ruby/struct:SM::Flow::P 
  body: "This method may have class-specific behavior. If so, that behavior will be documented under the #<tt>initialize_copy</tt> method of the class."
full_name: Object#dup
is_singleton: false
name: dup
params: |
  obj.dup -> an_object

visibility: public
PK`}[@��Q��#ri/1.8/system/Object/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Object#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PK`}[�x�ri/1.8/system/Object/tap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Yields <tt>x</tt> to the block, and then returns <tt>x</tt>. The primary purpose of this method is to &quot;tap into&quot; a method chain, in order to perform operations on intermediate results within the chain.
- !ruby/struct:SM::Flow::VERB 
  body: "    (1..10).tap {\n      |x| puts &quot;original: #{x.inspect}&quot;\n    }.to_a.tap {\n      |x| puts &quot;array: #{x.inspect}&quot;\n    }.select {|x| x%2==0}.tap {\n      |x| puts &quot;evens: #{x.inspect}&quot;\n    }.map {|x| x*x}.tap {\n      |x| puts &quot;squares: #{x.inspect}&quot;\n    }\n"
full_name: Object#tap
is_singleton: false
name: tap
params: |
  obj.tap{|x|...}    => obj

visibility: public
PK`}[���BTT$ri/1.8/system/Object/equal%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equality---At the <tt>Object</tt> level, <tt>==</tt> returns <tt>true</tt> only if <em>obj</em> and <em>other</em> are the same object. Typically, this method is overridden in descendent classes to provide class-specific meaning.
- !ruby/struct:SM::Flow::P 
  body: "Unlike <tt>==</tt>, the <tt>equal?</tt> method should never be overridden by subclasses: it is used to determine object identity (that is, <tt>a.equal?(b)</tt> iff <tt>a</tt> is the same object as <tt>b</tt>)."
- !ruby/struct:SM::Flow::P 
  body: "The <tt>eql?</tt> method returns <tt>true</tt> if <em>obj</em> and <em>anObject</em> have the same value. Used by <tt>Hash</tt> to test members for equality. For objects of class <tt>Object</tt>, <tt>eql?</tt> is synonymous with <tt>==</tt>. Subclasses normally continue this tradition, but there are exceptions. <tt>Numeric</tt> types, for example, perform type conversion across <tt>==</tt>, but not across <tt>eql?</tt>, so:"
- !ruby/struct:SM::Flow::VERB 
  body: "   1 == 1.0     #=&gt; true\n   1.eql? 1.0   #=&gt; false\n"
full_name: Object#equal?
is_singleton: false
name: equal?
params: |
  obj == other        => true or false
  obj.equal?(other)   => true or false
  obj.eql?(other)     => true or false

visibility: public
PK`}[{�#� ri/1.8/system/Object/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generates a <tt>Fixnum</tt> hash value for this object. This function must have the property that <tt>a.eql?(b)</tt> implies <tt>a.hash == b.hash</tt>. The hash value is used by class <tt>Hash</tt>. Any hash value that exceeds the capacity of a <tt>Fixnum</tt> will be truncated before being used.
full_name: Object#hash
is_singleton: false
name: hash
params: |
  obj.hash    => fixnum

visibility: public
PK`}[�Sg��$ri/1.8/system/Object/enum_for-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns Enumerable::Enumerator.new(self, method, *args).
- !ruby/struct:SM::Flow::P 
  body: "e.g.:"
- !ruby/struct:SM::Flow::VERB 
  body: "   str = &quot;xyz&quot;\n\n   enum = str.enum_for(:each_byte)\n   a = enum.map {|b| '%02x' % b } #=&gt; [&quot;78&quot;, &quot;79&quot;, &quot;7a&quot;]\n\n   # protects an array from being modified\n   a = [1, 2, 3]\n   some_method(a.to_enum)\n"
full_name: Object#enum_for
is_singleton: false
name: enum_for
params: |
  obj.to_enum(method = :each, *args)
  obj.enum_for(method = :each, *args)

visibility: public
PK`}[>�qpp*ri/1.8/system/Object/instance_of%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>obj</em> is an instance of the given class. See also <tt>Object#kind_of?</tt>.
full_name: Object#instance_of?
is_singleton: false
name: instance_of?
params: |
  obj.instance_of?(class)    => true or false

visibility: public
PK`}[~w='��1ri/1.8/system/Object/instance_variable_set-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the instance variable names by <em>symbol</em> to <em>object</em>, thereby frustrating the efforts of the class's author to attempt to provide proper encapsulation. The variable did not have to exist prior to this call.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Fred\n     def initialize(p1, p2)\n       @a, @b = p1, p2\n     end\n   end\n   fred = Fred.new('cat', 99)\n   fred.instance_variable_set(:@a, 'dog')   #=&gt; &quot;dog&quot;\n   fred.instance_variable_set(:@c, 'cat')   #=&gt; &quot;cat&quot;\n   fred.inspect                             #=&gt; &quot;#&lt;Fred:0x401b3da8 @a=\\&quot;dog\\&quot;, @b=99, @c=\\&quot;cat\\&quot;&gt;&quot;\n"
full_name: Object#instance_variable_set
is_singleton: false
name: instance_variable_set
params: |
  obj.instance_variable_set(symbol, obj)    => obj

visibility: public
PK`}[!�0

 ri/1.8/system/Object/type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deprecated synonym for <tt>Object#class</tt>.
full_name: Object#type
is_singleton: false
name: type
params: |
  obj.type   => class

visibility: public
PK`}[i0�VV#ri/1.8/system/Object/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a string containing a human-readable representation of <em>obj</em>. If not overridden, uses the <tt>to_s</tt> method to generate the string.
- !ruby/struct:SM::Flow::VERB 
  body: "   [ 1, 2, 3..4, 'five' ].inspect   #=&gt; &quot;[1, 2, 3..4, \\&quot;five\\&quot;]&quot;\n   Time.new.inspect                 #=&gt; &quot;Wed Apr 09 08:54:39 CDT 2003&quot;\n"
full_name: Object#inspect
is_singleton: false
name: inspect
params: |
  obj.inspect   => string

visibility: public
PK`}[��O��&ri/1.8/system/Object/cdesc-Object.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>Object</tt> is the parent class of all classes in Ruby. Its methods are therefore available to all objects unless explicitly overridden.
- !ruby/struct:SM::Flow::P 
  body: <tt>Object</tt> mixes in the <tt>Kernel</tt> module, making the built-in kernel functions globally accessible. Although the instance methods of <tt>Object</tt> are defined by the <tt>Kernel</tt> module, we have chosen to document them here for clarity.
- !ruby/struct:SM::Flow::P 
  body: In the descriptions of Object's methods, the parameter <em>symbol</em> refers to a symbol, which is either a quoted string or a <tt>Symbol</tt> (such as <tt>:name</tt>).
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: TOPLEVEL_BINDING
  value: rb_f_binding(ruby_top_self)
- !ruby/object:RI::Constant 
  comment: 
  name: RUBY_VERSION
  value: v
- !ruby/object:RI::Constant 
  comment: 
  name: RUBY_RELEASE_DATE
  value: d
- !ruby/object:RI::Constant 
  comment: 
  name: RUBY_PLATFORM
  value: p
- !ruby/object:RI::Constant 
  comment: 
  name: RUBY_PATCHLEVEL
  value: INT2FIX(RUBY_PATCHLEVEL)
- !ruby/object:RI::Constant 
  comment: 
  name: RUBY_DESCRIPTION
  value: tmp
- !ruby/object:RI::Constant 
  comment: 
  name: RUBY_COPYRIGHT
  value: tmp
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: obsolete constants
  name: VERSION
  value: v
- !ruby/object:RI::Constant 
  comment: 
  name: RELEASE_DATE
  value: d
- !ruby/object:RI::Constant 
  comment: 
  name: PLATFORM
  value: p
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: constants to hold original stdin/stdout/stderr
  name: STDIN
  value: rb_stdin
- !ruby/object:RI::Constant 
  comment: 
  name: STDOUT
  value: rb_stdout
- !ruby/object:RI::Constant 
  comment: 
  name: STDERR
  value: rb_stderr
- !ruby/object:RI::Constant 
  comment: 
  name: ARGF
  value: argf
- !ruby/object:RI::Constant 
  comment: 
  name: ENV
  value: envtbl
- !ruby/object:RI::Constant 
  comment: 
  name: ENV
  value: envtbl
- !ruby/object:RI::Constant 
  comment: 
  name: MatchingData
  value: rb_cMatch
- !ruby/object:RI::Constant 
  comment: 
  name: NIL
  value: Qnil
- !ruby/object:RI::Constant 
  comment: 
  name: "TRUE"
  value: Qtrue
- !ruby/object:RI::Constant 
  comment: 
  name: "FALSE"
  value: Qfalse
- !ruby/object:RI::Constant 
  comment: 
  name: DATA
  value: f
- !ruby/object:RI::Constant 
  comment: 
  name: ARGV
  value: rb_argv
- !ruby/object:RI::Constant 
  comment: 
  name: IPsocket
  value: rb_cIPSocket
- !ruby/object:RI::Constant 
  comment: 
  name: TCPsocket
  value: rb_cTCPSocket
- !ruby/object:RI::Constant 
  comment: 
  name: SOCKSsocket
  value: rb_cSOCKSSocket
- !ruby/object:RI::Constant 
  comment: 
  name: TCPserver
  value: rb_cTCPServer
- !ruby/object:RI::Constant 
  comment: 
  name: UDPsocket
  value: rb_cUDPSocket
- !ruby/object:RI::Constant 
  comment: 
  name: UNIXsocket
  value: rb_cUNIXSocket
- !ruby/object:RI::Constant 
  comment: 
  name: UNIXserver
  value: rb_cUNIXServer
full_name: Object
includes: 
- !ruby/object:RI::IncludedModule 
  name: Kernel
- !ruby/object:RI::IncludedModule 
  name: PP::ObjectMixin
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: ===
- !ruby/object:RI::MethodSummary 
  name: =~
- !ruby/object:RI::MethodSummary 
  name: __id__
- !ruby/object:RI::MethodSummary 
  name: __send__
- !ruby/object:RI::MethodSummary 
  name: class
- !ruby/object:RI::MethodSummary 
  name: clone
- !ruby/object:RI::MethodSummary 
  name: dclone
- !ruby/object:RI::MethodSummary 
  name: display
- !ruby/object:RI::MethodSummary 
  name: dup
- !ruby/object:RI::MethodSummary 
  name: enum_for
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: equal?
- !ruby/object:RI::MethodSummary 
  name: extend
- !ruby/object:RI::MethodSummary 
  name: freeze
- !ruby/object:RI::MethodSummary 
  name: frozen?
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: id
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: instance_eval
- !ruby/object:RI::MethodSummary 
  name: instance_exec
- !ruby/object:RI::MethodSummary 
  name: instance_of?
- !ruby/object:RI::MethodSummary 
  name: instance_variable_defined?
- !ruby/object:RI::MethodSummary 
  name: instance_variable_get
- !ruby/object:RI::MethodSummary 
  name: instance_variable_get
- !ruby/object:RI::MethodSummary 
  name: instance_variable_set
- !ruby/object:RI::MethodSummary 
  name: instance_variable_set
- !ruby/object:RI::MethodSummary 
  name: instance_variables
- !ruby/object:RI::MethodSummary 
  name: is_a?
- !ruby/object:RI::MethodSummary 
  name: kind_of?
- !ruby/object:RI::MethodSummary 
  name: method
- !ruby/object:RI::MethodSummary 
  name: methods
- !ruby/object:RI::MethodSummary 
  name: nil?
- !ruby/object:RI::MethodSummary 
  name: object_id
- !ruby/object:RI::MethodSummary 
  name: private_methods
- !ruby/object:RI::MethodSummary 
  name: protected_methods
- !ruby/object:RI::MethodSummary 
  name: public_methods
- !ruby/object:RI::MethodSummary 
  name: remove_instance_variable
- !ruby/object:RI::MethodSummary 
  name: respond_to?
- !ruby/object:RI::MethodSummary 
  name: send
- !ruby/object:RI::MethodSummary 
  name: singleton_method_added
- !ruby/object:RI::MethodSummary 
  name: singleton_method_removed
- !ruby/object:RI::MethodSummary 
  name: singleton_method_undefined
- !ruby/object:RI::MethodSummary 
  name: singleton_methods
- !ruby/object:RI::MethodSummary 
  name: taint
- !ruby/object:RI::MethodSummary 
  name: tainted?
- !ruby/object:RI::MethodSummary 
  name: tap
- !ruby/object:RI::MethodSummary 
  name: to_a
- !ruby/object:RI::MethodSummary 
  name: to_enum
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: to_yaml
- !ruby/object:RI::MethodSummary 
  name: to_yaml_properties
- !ruby/object:RI::MethodSummary 
  name: to_yaml_style
- !ruby/object:RI::MethodSummary 
  name: type
- !ruby/object:RI::MethodSummary 
  name: untaint
name: Object
superclass: 
PK`}[��?e��ri/1.8/system/Object/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Not documented
full_name: Object::new
is_singleton: true
name: new
params: ()
visibility: public
PK`}[
AF(��)ri/1.8/system/Object/respond_to%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt>&gt; if <em>obj</em> responds to the given method. Private methods are included in the search only if the optional second parameter evaluates to <tt>true</tt>.
full_name: Object#respond_to?
is_singleton: false
name: respond_to?
params: |
  obj.respond_to?(symbol, include_private=false) => true or false

visibility: public
PK`}[a����6ri/1.8/system/Object/singleton_method_undefined-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invoked as a callback whenever a singleton method is undefined in the receiver.
- !ruby/struct:SM::Flow::VERB 
  body: "   module Chatty\n     def Chatty.singleton_method_undefined(id)\n       puts &quot;Undefining #{id.id2name}&quot;\n     end\n     def Chatty.one()   end\n     class &lt;&lt; self\n        undef_method(:one)\n     end\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Undefining one\n"
full_name: Object#singleton_method_undefined
is_singleton: false
name: singleton_method_undefined
params: |
  singleton_method_undefined(symbol)

visibility: public
PK`}[^�g{��%ri/1.8/system/Object/%3d%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Case Equality---For class <tt>Object</tt>, effectively the same as calling <tt>#==</tt>, but typically overridden by descendents to provide meaningful semantics in <tt>case</tt> statements.
full_name: Object#===
is_singleton: false
name: ===
params: |
  obj === other   => true or false

visibility: public
PK`}[�'{�)ri/1.8/system/Object/instance_exec-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Executes the given block within the context of the receiver (<em>obj</em>). In order to set the context, the variable <tt>self</tt> is set to <em>obj</em> while the code is executing, giving the code access to <em>obj</em>'s instance variables. Arguments are passed as block parameters.
- !ruby/struct:SM::Flow::VERB 
  body: "   class KlassWithSecret\n     def initialize\n       @secret = 99\n     end\n   end\n   k = KlassWithSecret.new\n   k.instance_exec(5) {|x| @secret+x }   #=&gt; 104\n"
full_name: Object#instance_exec
is_singleton: false
name: instance_exec
params: |
  obj.instance_exec(arg...) {|var...| block }                       => obj

visibility: public
PK`}[M����2ri/1.8/system/Object/singleton_method_added-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invoked as a callback whenever a singleton method is added to the receiver.
- !ruby/struct:SM::Flow::VERB 
  body: "   module Chatty\n     def Chatty.singleton_method_added(id)\n       puts &quot;Adding #{id.id2name}&quot;\n     end\n     def self.one()     end\n     def two()          end\n     def Chatty.three() end\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Adding singleton_method_added\n   Adding one\n   Adding three\n"
full_name: Object#singleton_method_added
is_singleton: false
name: singleton_method_added
params: |
  singleton_method_added(symbol)

visibility: public
PK`}[P=b]!!&ri/1.8/system/Object/tainted%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the object is tainted.
full_name: Object#tainted?
is_singleton: false
name: tainted?
params: |
  obj.tainted?    => true or false

visibility: public
PK`}[qǻp�� ri/1.8/system/Object/send-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invokes the method identified by <em>symbol</em>, passing it any arguments specified. You can use <tt>__send__</tt> if the name <tt>send</tt> clashes with an existing method in <em>obj</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Klass\n     def hello(*args)\n       &quot;Hello &quot; + args.join(' ')\n     end\n   end\n   k = Klass.new\n   k.send :hello, &quot;gentle&quot;, &quot;readers&quot;   #=&gt; &quot;Hello gentle readers&quot;\n"
full_name: Object#send
is_singleton: false
name: send
params: |
  obj.send(symbol [, args...])        => obj
  obj.__send__(symbol [, args...])    => obj

visibility: public
PK`}[��/��.ri/1.8/system/Object/to_yaml_properties-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Object#to_yaml_properties
is_singleton: false
name: to_yaml_properties
params: ()
visibility: public
PK`}[I�	�ri/1.8/system/Object/id-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Soon-to-be deprecated version of <tt>Object#object_id</tt>.
full_name: Object#id
is_singleton: false
name: id
params: |
  obj.id    => fixnum

visibility: public
PKa}[s)�X��+ri/1.8/system/Object/private_methods-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the list of private methods accessible to <em>obj</em>. If the <em>all</em> parameter is set to <tt>false</tt>, only those methods in the receiver will be listed.
full_name: Object#private_methods
is_singleton: false
name: private_methods
params: |
  obj.private_methods(all=true)   => array

visibility: public
PKa}[�]���)ri/1.8/system/Object/to_yaml_style-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Object#to_yaml_style
is_singleton: false
name: to_yaml_style
params: ()
visibility: public
PKa}['xj��8ri/1.8/system/Object/instance_variable_defined%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the given instance variable is defined in <em>obj</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Fred\n     def initialize(p1, p2)\n       @a, @b = p1, p2\n     end\n   end\n   fred = Fred.new('cat', 99)\n   fred.instance_variable_defined?(:@a)    #=&gt; true\n   fred.instance_variable_defined?(&quot;@b&quot;)   #=&gt; true\n   fred.instance_variable_defined?(&quot;@c&quot;)   #=&gt; false\n"
full_name: Object#instance_variable_defined?
is_singleton: false
name: instance_variable_defined?
params: |
  obj.instance_variable_defined?(symbol)    => true or false

visibility: public
PKa}[0S�ϙ�!ri/1.8/system/Object/taint-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Marks <em>obj</em> as tainted---if the <tt>$SAFE</tt> level is set appropriately, many method calls which might alter the running programs environment will refuse to accept tainted strings.
full_name: Object#taint
is_singleton: false
name: taint
params: |
  obj.taint -> obj

visibility: public
PKa}[���ɜ�#ri/1.8/system/Object/to_enum-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns Enumerable::Enumerator.new(self, method, *args).
- !ruby/struct:SM::Flow::P 
  body: "e.g.:"
- !ruby/struct:SM::Flow::VERB 
  body: "   str = &quot;xyz&quot;\n\n   enum = str.enum_for(:each_byte)\n   a = enum.map {|b| '%02x' % b } #=&gt; [&quot;78&quot;, &quot;79&quot;, &quot;7a&quot;]\n\n   # protects an array from being modified\n   a = [1, 2, 3]\n   some_method(a.to_enum)\n"
full_name: Object#to_enum
is_singleton: false
name: to_enum
params: |
  obj.to_enum(method = :each, *args)
  obj.enum_for(method = :each, *args)

visibility: public
PKa}[35����"ri/1.8/system/Object/freeze-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Prevents further modifications to <em>obj</em>. A <tt>TypeError</tt> will be raised if modification is attempted. There is no way to unfreeze a frozen object. See also <tt>Object#frozen?</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ &quot;a&quot;, &quot;b&quot;, &quot;c&quot; ]\n   a.freeze\n   a &lt;&lt; &quot;z&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   prog.rb:3:in `&lt;&lt;': can't modify frozen array (TypeError)\n    from prog.rb:3\n"
full_name: Object#freeze
is_singleton: false
name: freeze
params: |
  obj.freeze    => obj

visibility: public
PKa}[��\8�� ri/1.8/system/Object/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a string representing <em>obj</em>. The default <tt>to_s</tt> prints the object's class and an encoding of the object id. As a special case, the top-level object that is the initial execution context of Ruby programs returns ``main.''
full_name: Object#to_s
is_singleton: false
name: to_s
params: |
  obj.to_s    => string

visibility: public
PKa}[%!M��-ri/1.8/system/Object/singleton_methods-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array of the names of singleton methods for <em>obj</em>. If the optional <em>all</em> parameter is true, the list will include methods in modules included in <em>obj</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   module Other\n     def three() end\n   end\n\n   class Single\n     def Single.four() end\n   end\n\n   a = Single.new\n\n   def a.one()\n   end\n\n   class &lt;&lt; a\n     include Other\n     def two()\n     end\n   end\n\n   Single.singleton_methods    #=&gt; [&quot;four&quot;]\n   a.singleton_methods(false)  #=&gt; [&quot;two&quot;, &quot;one&quot;]\n   a.singleton_methods         #=&gt; [&quot;two&quot;, &quot;one&quot;, &quot;three&quot;]\n"
full_name: Object#singleton_methods
is_singleton: false
name: singleton_methods
params: |
  obj.singleton_methods(all=true)    => array

visibility: public
PKa}[c+���)ri/1.8/system/Object/instance_eval-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Evaluates a string containing Ruby source code, or the given block, within the context of the receiver (<em>obj</em>). In order to set the context, the variable <tt>self</tt> is set to <em>obj</em> while the code is executing, giving the code access to <em>obj</em>'s instance variables. In the version of <tt>instance_eval</tt> that takes a <tt>String</tt>, the optional second and third parameters supply a filename and starting line number that are used when reporting compilation errors.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Klass\n     def initialize\n       @secret = 99\n     end\n   end\n   k = Klass.new\n   k.instance_eval { @secret }   #=&gt; 99\n"
full_name: Object#instance_eval
is_singleton: false
name: instance_eval
params: |
  obj.instance_eval(string [, filename [, lineno]] )   => obj
  obj.instance_eval {| | block }                       => obj

visibility: public
PKa}[�*��LL"ri/1.8/system/Object/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equality---At the <tt>Object</tt> level, <tt>==</tt> returns <tt>true</tt> only if <em>obj</em> and <em>other</em> are the same object. Typically, this method is overridden in descendent classes to provide class-specific meaning.
- !ruby/struct:SM::Flow::P 
  body: "Unlike <tt>==</tt>, the <tt>equal?</tt> method should never be overridden by subclasses: it is used to determine object identity (that is, <tt>a.equal?(b)</tt> iff <tt>a</tt> is the same object as <tt>b</tt>)."
- !ruby/struct:SM::Flow::P 
  body: "The <tt>eql?</tt> method returns <tt>true</tt> if <em>obj</em> and <em>anObject</em> have the same value. Used by <tt>Hash</tt> to test members for equality. For objects of class <tt>Object</tt>, <tt>eql?</tt> is synonymous with <tt>==</tt>. Subclasses normally continue this tradition, but there are exceptions. <tt>Numeric</tt> types, for example, perform type conversion across <tt>==</tt>, but not across <tt>eql?</tt>, so:"
- !ruby/struct:SM::Flow::VERB 
  body: "   1 == 1.0     #=&gt; true\n   1.eql? 1.0   #=&gt; false\n"
full_name: Object#==
is_singleton: false
name: ==
params: |
  obj == other        => true or false
  obj.equal?(other)   => true or false
  obj.eql?(other)     => true or false

visibility: public
PKa}[d���4ri/1.8/system/Object/remove_instance_variable-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes the named instance variable from <em>obj</em>, returning that variable's value.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Dummy\n     attr_reader :var\n     def initialize\n       @var = 99\n     end\n     def remove\n       remove_instance_variable(:@var)\n     end\n   end\n   d = Dummy.new\n   d.var      #=&gt; 99\n   d.remove   #=&gt; 99\n   d.var      #=&gt; nil\n"
full_name: Object#remove_instance_variable
is_singleton: false
name: remove_instance_variable
params: |
  obj.remove_instance_variable(symbol)    => obj

visibility: public
PKa}[����!ri/1.8/system/Object/clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Produces a shallow copy of <em>obj</em>---the instance variables of <em>obj</em> are copied, but not the objects they reference. Copies the frozen and tainted state of <em>obj</em>. See also the discussion under <tt>Object#dup</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Klass\n      attr_accessor :str\n   end\n   s1 = Klass.new      #=&gt; #&lt;Klass:0x401b3a38&gt;\n   s1.str = &quot;Hello&quot;    #=&gt; &quot;Hello&quot;\n   s2 = s1.clone       #=&gt; #&lt;Klass:0x401b3998 @str=&quot;Hello&quot;&gt;\n   s2.str[1,4] = &quot;i&quot;   #=&gt; &quot;i&quot;\n   s1.inspect          #=&gt; &quot;#&lt;Klass:0x401b3a38 @str=\\&quot;Hi\\&quot;&gt;&quot;\n   s2.inspect          #=&gt; &quot;#&lt;Klass:0x401b3998 @str=\\&quot;Hi\\&quot;&gt;&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: "This method may have class-specific behavior. If so, that behavior will be documented under the #<tt>initialize_copy</tt> method of the class."
full_name: Object#clone
is_singleton: false
name: clone
params: |
  obj.clone -> an_object

visibility: public
PKa}[�E�՟�"ri/1.8/system/Object/__id__-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Document-method: object_id"
- !ruby/struct:SM::Flow::P 
  body: Returns an integer identifier for <em>obj</em>. The same number will be returned on all calls to <tt>id</tt> for a given object, and no two active objects will share an id. <tt>Object#object_id</tt> is a different concept from the <tt>:name</tt> notation, which returns the symbol id of <tt>name</tt>. Replaces the deprecated <tt>Object#id</tt>.
full_name: Object#__id__
is_singleton: false
name: __id__
params: |
  obj.__id__       => fixnum
  obj.object_id    => fixnum

visibility: public
PKa}[sic��"ri/1.8/system/Object/extend-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds to <em>obj</em> the instance methods from each module given as a parameter.
- !ruby/struct:SM::Flow::VERB 
  body: "   module Mod\n     def hello\n       &quot;Hello from Mod.\\n&quot;\n     end\n   end\n\n   class Klass\n     def hello\n       &quot;Hello from Klass.\\n&quot;\n     end\n   end\n\n   k = Klass.new\n   k.hello         #=&gt; &quot;Hello from Klass.\\n&quot;\n   k.extend(Mod)   #=&gt; #&lt;Klass:0x401b3bc8&gt;\n   k.hello         #=&gt; &quot;Hello from Mod.\\n&quot;\n"
full_name: Object#extend
is_singleton: false
name: extend
params: |
  obj.extend(module, ...)    => obj

visibility: public
PKa}[��*��-ri/1.8/system/Object/protected_methods-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the list of protected methods accessible to <em>obj</em>. If the <em>all</em> parameter is set to <tt>false</tt>, only those methods in the receiver will be listed.
full_name: Object#protected_methods
is_singleton: false
name: protected_methods
params: |
  obj.protected_methods(all=true)   => array

visibility: public
PKa}[ĂJ��"ri/1.8/system/Object/method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Looks up the named method as a receiver in <em>obj</em>, returning a <tt>Method</tt> object (or raising <tt>NameError</tt>). The <tt>Method</tt> object acts as a closure in <em>obj</em>'s object instance, so instance variables and the value of <tt>self</tt> remain available.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Demo\n     def initialize(n)\n       @iv = n\n     end\n     def hello()\n       &quot;Hello, @iv = #{@iv}&quot;\n     end\n   end\n\n   k = Demo.new(99)\n   m = k.method(:hello)\n   m.call   #=&gt; &quot;Hello, @iv = 99&quot;\n\n   l = Demo.new('Fred')\n   m = l.method(&quot;hello&quot;)\n   m.call   #=&gt; &quot;Hello, @iv = Fred&quot;\n"
full_name: Object#method
is_singleton: false
name: method
params: |
  obj.method(sym)    => method

visibility: public
PKa}[���z��"ri/1.8/system/Object/dclone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Object#dclone
is_singleton: false
name: dclone
params: ()
visibility: public
PKa}[䱦U��#ri/1.8/system/Object/display-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Prints <em>obj</em> on the given port (default <tt>$&gt;</tt>). Equivalent to:"
- !ruby/struct:SM::Flow::VERB 
  body: "   def display(port=$&gt;)\n     port.write self\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: "For example:"
- !ruby/struct:SM::Flow::VERB 
  body: "   1.display\n   &quot;cat&quot;.display\n   [ 4, 5, 6 ].display\n   puts\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   1cat456\n"
full_name: Object#display
is_singleton: false
name: display
params: |
  obj.display(port=$>)    => nil

visibility: public
PKa}[��vDD4ri/1.8/system/Object/singleton_method_removed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invoked as a callback whenever a singleton method is removed from the receiver.
- !ruby/struct:SM::Flow::VERB 
  body: "   module Chatty\n     def Chatty.singleton_method_removed(id)\n       puts &quot;Removing #{id.id2name}&quot;\n     end\n     def self.one()     end\n     def two()          end\n     def Chatty.three() end\n     class &lt;&lt;self\n       remove_method :three\n       remove_method :one\n     end\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Removing three\n   Removing one\n"
full_name: Object#singleton_method_removed
is_singleton: false
name: singleton_method_removed
params: |
  singleton_method_removed(symbol)

visibility: public
PKa}[ !�W��"ri/1.8/system/Object/nil%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "call_seq:"
- !ruby/struct:SM::Flow::VERB 
  body: "  nil.nil?               =&gt; true\n  &lt;anything_else&gt;.nil?   =&gt; false\n"
- !ruby/struct:SM::Flow::P 
  body: Only the object <em>nil</em> responds <tt>true</tt> to <tt>nil?</tt>.
full_name: Object#nil?
is_singleton: false
name: nil?
params: ()
visibility: public
PKa}[�C_&		#ri/1.8/system/Object/untaint-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes the taint from <em>obj</em>.
full_name: Object#untaint
is_singleton: false
name: untaint
params: |
  obj.untaint    => obj

visibility: public
PKa}[љ��PP1ri/1.8/system/Object/instance_variable_get-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the value of the given instance variable, or nil if the instance variable is not set. The <tt>@</tt> part of the variable name should be included for regular instance variables. Throws a <tt>NameError</tt> exception if the supplied symbol is not valid as an instance variable name.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Fred\n     def initialize(p1, p2)\n       @a, @b = p1, p2\n     end\n   end\n   fred = Fred.new('cat', 99)\n   fred.instance_variable_get(:@a)    #=&gt; &quot;cat&quot;\n   fred.instance_variable_get(&quot;@b&quot;)   #=&gt; 99\n"
full_name: Object#instance_variable_get
is_singleton: false
name: instance_variable_get
params: |
  obj.instance_variable_get(symbol)    => obj

visibility: public
PKa}[�M���&ri/1.8/system/Object/kind_of%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>class</em> is the class of <em>obj</em>, or if <em>class</em> is one of the superclasses of <em>obj</em> or modules included in <em>obj</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   module M;    end\n   class A\n     include M\n   end\n   class B &lt; A; end\n   class C &lt; B; end\n   b = B.new\n   b.instance_of? A   #=&gt; false\n   b.instance_of? B   #=&gt; true\n   b.instance_of? C   #=&gt; false\n   b.instance_of? M   #=&gt; false\n   b.kind_of? A       #=&gt; true\n   b.kind_of? B       #=&gt; true\n   b.kind_of? C       #=&gt; false\n   b.kind_of? M       #=&gt; true\n"
full_name: Object#kind_of?
is_singleton: false
name: kind_of?
params: |
  obj.is_a?(class)       => true or false
  obj.kind_of?(class)    => true or false

visibility: public
PKa}[ʱN��1ri/1.8/system/DEBUGGER__/debug_thread_info-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::debug_thread_info
is_singleton: true
name: debug_thread_info
params: (input, binding)
visibility: public
PKa}[��W���/ri/1.8/system/DEBUGGER__/thread_list_all-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::thread_list_all
is_singleton: true
name: thread_list_all
params: ()
visibility: public
PKa}[�my@��'ri/1.8/system/DEBUGGER__/suspend-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::suspend
is_singleton: true
name: suspend
params: ()
visibility: public
PKa}[�2�:��*ri/1.8/system/DEBUGGER__/get_thread-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::get_thread
is_singleton: true
name: get_thread
params: (num)
visibility: public
PKa}[�2\}}/ri/1.8/system/DEBUGGER__/Mutex/cdesc-Mutex.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: DEBUGGER__::Mutex
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: lock
- !ruby/object:RI::MethodSummary 
  name: locked?
- !ruby/object:RI::MethodSummary 
  name: unlock
name: Mutex
superclass: Object
PKa}[�'�
��,ri/1.8/system/DEBUGGER__/Mutex/unlock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Mutex#unlock
is_singleton: false
name: unlock
params: ()
visibility: public
PKa}[��
��/ri/1.8/system/DEBUGGER__/Mutex/locked%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Mutex#locked?
is_singleton: false
name: locked?
params: ()
visibility: public
PKa}[!z[��)ri/1.8/system/DEBUGGER__/Mutex/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Mutex::new
is_singleton: true
name: new
params: ()
visibility: public
PKa}[��'��*ri/1.8/system/DEBUGGER__/Mutex/lock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Mutex#lock
is_singleton: false
name: lock
params: ()
visibility: public
PKa}[�@��-ri/1.8/system/DEBUGGER__/Context/thnum-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#thnum
is_singleton: false
name: thnum
params: ()
visibility: public
PKa}[�n���/ri/1.8/system/DEBUGGER__/Context/context-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#context
is_singleton: false
name: context
params: (th)
visibility: public
PKa}[�V���0ri/1.8/system/DEBUGGER__/Context/trace%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#trace?
is_singleton: false
name: trace?
params: ()
visibility: public
PKa}[i�-���0ri/1.8/system/DEBUGGER__/Context/var_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#var_list
is_singleton: false
name: var_list
params: (ary, binding)
visibility: public
PKa}[b�����2ri/1.8/system/DEBUGGER__/Context/debug_eval-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#debug_eval
is_singleton: false
name: debug_eval
params: (str, binding)
visibility: public
PKa}[��'>��1ri/1.8/system/DEBUGGER__/Context/stop_next-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#stop_next
is_singleton: false
name: stop_next
params: (n=1)
visibility: public
PKa}[d�Y��3ri/1.8/system/DEBUGGER__/Context/excn_handle-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#excn_handle
is_singleton: false
name: excn_handle
params: (file, line, id, binding)
visibility: public
PKa}[5a�5��8ri/1.8/system/DEBUGGER__/Context/debug_print_help-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#debug_print_help
is_singleton: false
name: debug_print_help
params: ()
visibility: public
PKa}[|!���0ri/1.8/system/DEBUGGER__/Context/readline-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#readline
is_singleton: false
name: readline
params: (prompt, hist)
visibility: public
PKa}[�����:ri/1.8/system/DEBUGGER__/Context/check_break_points-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#check_break_points
is_singleton: false
name: check_break_points
params: (file, klass, pos, binding, id)
visibility: public
PKa}[u�D6��5ri/1.8/system/DEBUGGER__/Context/frame_set_pos-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#frame_set_pos
is_singleton: false
name: frame_set_pos
params: (file, line)
visibility: public
PKa}[��,D��5ri/1.8/system/DEBUGGER__/Context/debug_command-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#debug_command
is_singleton: false
name: debug_command
params: (file, line, id, binding)
visibility: public
PKa}[@x���;ri/1.8/system/DEBUGGER__/Context/display_expressions-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#display_expressions
is_singleton: false
name: display_expressions
params: (binding)
visibility: public
PKa}[^z:Z��;ri/1.8/system/DEBUGGER__/Context/debug_variable_info-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#debug_variable_info
is_singleton: false
name: debug_variable_info
params: (input, binding)
visibility: public
PKa}[�&���4ri/1.8/system/DEBUGGER__/Context/format_frame-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#format_frame
is_singleton: false
name: format_frame
params: (pos)
visibility: public
PKa}[*F�s��5ri/1.8/system/DEBUGGER__/Context/clear_suspend-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#clear_suspend
is_singleton: false
name: clear_suspend
params: ()
visibility: public
PKa}[���~��4ri/1.8/system/DEBUGGER__/Context/break_points-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#break_points
is_singleton: false
name: break_points
params: ()
visibility: public
PKa}[��:��2ri/1.8/system/DEBUGGER__/Context/trace_func-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#trace_func
is_singleton: false
name: trace_func
params: (event, file, line, id, binding, klass)
visibility: public
PKa}[RU�ۻ�2ri/1.8/system/DEBUGGER__/Context/resume_all-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#resume_all
is_singleton: false
name: resume_all
params: ()
visibility: public
PKa}[��#��9ri/1.8/system/DEBUGGER__/Context/debug_silent_eval-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#debug_silent_eval
is_singleton: false
name: debug_silent_eval
params: (str, binding)
visibility: public
PKa}[@1d��:ri/1.8/system/DEBUGGER__/Context/display_expression-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#display_expression
is_singleton: false
name: display_expression
params: (exp, binding)
visibility: public
PKa}[}�Gҭ�+ri/1.8/system/DEBUGGER__/Context/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context::new
is_singleton: true
name: new
params: ()
visibility: public
PKa}[n�!]��9ri/1.8/system/DEBUGGER__/Context/debug_method_info-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#debug_method_info
is_singleton: false
name: debug_method_info
params: (input, binding)
visibility: public
PKa}[�=�'��7ri/1.8/system/DEBUGGER__/Context/set_last_thread-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#set_last_thread
is_singleton: false
name: set_last_thread
params: (th)
visibility: public
PKa}[��1��1ri/1.8/system/DEBUGGER__/Context/set_trace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#set_trace
is_singleton: false
name: set_trace
params: (arg)
visibility: public
PKa}[��-���6ri/1.8/system/DEBUGGER__/Context/display_frames-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#display_frames
is_singleton: false
name: display_frames
params: (pos)
visibility: public
PKa}[e6Z�		3ri/1.8/system/DEBUGGER__/Context/cdesc-Context.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: DEBUG_LAST_CMD
  value: "[]"
- !ruby/object:RI::Constant 
  comment: 
  name: USE_READLINE
  value: "false"
full_name: DEBUGGER__::Context
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: break_points
- !ruby/object:RI::MethodSummary 
  name: check_break_points
- !ruby/object:RI::MethodSummary 
  name: check_suspend
- !ruby/object:RI::MethodSummary 
  name: clear_suspend
- !ruby/object:RI::MethodSummary 
  name: context
- !ruby/object:RI::MethodSummary 
  name: debug_command
- !ruby/object:RI::MethodSummary 
  name: debug_eval
- !ruby/object:RI::MethodSummary 
  name: debug_funcname
- !ruby/object:RI::MethodSummary 
  name: debug_method_info
- !ruby/object:RI::MethodSummary 
  name: debug_print_help
- !ruby/object:RI::MethodSummary 
  name: debug_silent_eval
- !ruby/object:RI::MethodSummary 
  name: debug_variable_info
- !ruby/object:RI::MethodSummary 
  name: display
- !ruby/object:RI::MethodSummary 
  name: display_expression
- !ruby/object:RI::MethodSummary 
  name: display_expressions
- !ruby/object:RI::MethodSummary 
  name: display_frames
- !ruby/object:RI::MethodSummary 
  name: display_list
- !ruby/object:RI::MethodSummary 
  name: excn_handle
- !ruby/object:RI::MethodSummary 
  name: format_frame
- !ruby/object:RI::MethodSummary 
  name: frame_set_pos
- !ruby/object:RI::MethodSummary 
  name: line_at
- !ruby/object:RI::MethodSummary 
  name: readline
- !ruby/object:RI::MethodSummary 
  name: readline
- !ruby/object:RI::MethodSummary 
  name: resume_all
- !ruby/object:RI::MethodSummary 
  name: set_last_thread
- !ruby/object:RI::MethodSummary 
  name: set_suspend
- !ruby/object:RI::MethodSummary 
  name: set_trace
- !ruby/object:RI::MethodSummary 
  name: set_trace_all
- !ruby/object:RI::MethodSummary 
  name: stdout
- !ruby/object:RI::MethodSummary 
  name: stop_next
- !ruby/object:RI::MethodSummary 
  name: suspend_all
- !ruby/object:RI::MethodSummary 
  name: thnum
- !ruby/object:RI::MethodSummary 
  name: trace?
- !ruby/object:RI::MethodSummary 
  name: trace_func
- !ruby/object:RI::MethodSummary 
  name: var_list
name: Context
superclass: Object
PKa}[E�07��3ri/1.8/system/DEBUGGER__/Context/set_suspend-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#set_suspend
is_singleton: false
name: set_suspend
params: ()
visibility: public
PKa}[p����5ri/1.8/system/DEBUGGER__/Context/check_suspend-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#check_suspend
is_singleton: false
name: check_suspend
params: ()
visibility: public
PKa}[R��ܿ�/ri/1.8/system/DEBUGGER__/Context/line_at-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#line_at
is_singleton: false
name: line_at
params: (file, line)
visibility: public
PKa}[�h1W��.ri/1.8/system/DEBUGGER__/Context/stdout-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#stdout
is_singleton: false
name: stdout
params: ()
visibility: public
PKa}[�KK	��4ri/1.8/system/DEBUGGER__/Context/display_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#display_list
is_singleton: false
name: display_list
params: (b, e, file, line)
visibility: public
PKa}[�M�޵�/ri/1.8/system/DEBUGGER__/Context/display-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#display
is_singleton: false
name: display
params: ()
visibility: public
PKa}[���~��5ri/1.8/system/DEBUGGER__/Context/set_trace_all-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#set_trace_all
is_singleton: false
name: set_trace_all
params: (arg)
visibility: public
PKa}[�'���6ri/1.8/system/DEBUGGER__/Context/debug_funcname-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#debug_funcname
is_singleton: false
name: debug_funcname
params: (id)
visibility: public
PKa}[y(`��3ri/1.8/system/DEBUGGER__/Context/suspend_all-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::Context#suspend_all
is_singleton: false
name: suspend_all
params: ()
visibility: public
PKa}[����0ri/1.8/system/DEBUGGER__/make_thread_list-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::make_thread_list
is_singleton: true
name: make_thread_list
params: ()
visibility: public
PKa}[�F�,��)ri/1.8/system/DEBUGGER__/interrupt-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::interrupt
is_singleton: true
name: interrupt
params: ()
visibility: public
PKa}[�X���)ri/1.8/system/DEBUGGER__/stdout%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::stdout=
is_singleton: true
name: stdout=
params: (s)
visibility: public
PKa}[��f���&ri/1.8/system/DEBUGGER__/stdout-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::stdout
is_singleton: true
name: stdout
params: ()
visibility: public
PKa}[(��+ri/1.8/system/DEBUGGER__/thread_list-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::thread_list
is_singleton: true
name: thread_list
params: (num)
visibility: public
PKa}[�
s���,ri/1.8/system/DEBUGGER__/break_points-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::break_points
is_singleton: true
name: break_points
params: ()
visibility: public
PKa}[��p�VV.ri/1.8/system/DEBUGGER__/cdesc-DEBUGGER__.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: break_points
- !ruby/object:RI::MethodSummary 
  name: context
- !ruby/object:RI::MethodSummary 
  name: debug_thread_info
- !ruby/object:RI::MethodSummary 
  name: display
- !ruby/object:RI::MethodSummary 
  name: get_thread
- !ruby/object:RI::MethodSummary 
  name: interrupt
- !ruby/object:RI::MethodSummary 
  name: make_thread_list
- !ruby/object:RI::MethodSummary 
  name: resume
- !ruby/object:RI::MethodSummary 
  name: set_last_thread
- !ruby/object:RI::MethodSummary 
  name: set_trace
- !ruby/object:RI::MethodSummary 
  name: stdout
- !ruby/object:RI::MethodSummary 
  name: stdout=
- !ruby/object:RI::MethodSummary 
  name: suspend
- !ruby/object:RI::MethodSummary 
  name: thread_list
- !ruby/object:RI::MethodSummary 
  name: thread_list_all
- !ruby/object:RI::MethodSummary 
  name: waiting
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: MUTEX
  value: Mutex.new
full_name: DEBUGGER__
includes: []

instance_methods: []

name: DEBUGGER__
superclass: Object
PKa}[',��)ri/1.8/system/DEBUGGER__/set_trace-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::set_trace
is_singleton: true
name: set_trace
params: ( arg )
visibility: public
PKa}[]�?Z��&ri/1.8/system/DEBUGGER__/resume-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::resume
is_singleton: true
name: resume
params: ()
visibility: public
PKa}[�CD��/ri/1.8/system/DEBUGGER__/set_last_thread-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::set_last_thread
is_singleton: true
name: set_last_thread
params: (th)
visibility: public
PKa}[3O8��'ri/1.8/system/DEBUGGER__/display-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::display
is_singleton: true
name: display
params: ()
visibility: public
PKa}[P�M��'ri/1.8/system/DEBUGGER__/waiting-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::waiting
is_singleton: true
name: waiting
params: ()
visibility: public
PKa}[�Vm��'ri/1.8/system/DEBUGGER__/context-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DEBUGGER__::context
is_singleton: true
name: context
params: (thread=Thread.current)
visibility: public
PKa}[4Gp��-ri/1.8/system/FileUtils/have_option%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the method <tt>mid</tt> have an option <tt>opt</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "  p FileUtils.have_option?(:cp, :noop)     #=&gt; true\n  p FileUtils.have_option?(:rm, :force)    #=&gt; true\n  p FileUtils.have_option?(:rm, :perserve) #=&gt; false\n"
full_name: FileUtils::have_option?
is_singleton: true
name: have_option?
params: (mid, opt)
visibility: private
PKa}[�a���)ri/1.8/system/FileUtils/options_of-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an Array of option names of the method <tt>mid</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "  p FileUtils.options(:rm)  #=&gt; [&quot;noop&quot;, &quot;verbose&quot;, &quot;force&quot;]\n"
full_name: FileUtils::options_of
is_singleton: true
name: options_of
params: (mid)
visibility: private
PKa}[9kU��#ri/1.8/system/FileUtils/move-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #mv"
full_name: FileUtils#move
is_singleton: false
name: move
params: (src, dest, options = {})
visibility: public
PKa}[�\H�""$ri/1.8/system/FileUtils/rm_rf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: rmtree
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: noop verbose secure"
- !ruby/struct:SM::Flow::P 
  body: Equivalent to
- !ruby/struct:SM::Flow::VERB 
  body: "  #rm_r(list, :force =&gt; true)\n"
- !ruby/struct:SM::Flow::P 
  body: "WARNING: This method causes local vulnerability. Read the documentation of #rm_r first."
full_name: FileUtils#rm_rf
is_singleton: false
name: rm_rf
params: (list, options = {})
visibility: public
PKb}[�,�#@@,ri/1.8/system/FileUtils/cdesc-FileUtils.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: collect_method
- !ruby/object:RI::MethodSummary 
  name: commands
- !ruby/object:RI::MethodSummary 
  name: have_option?
- !ruby/object:RI::MethodSummary 
  name: options
- !ruby/object:RI::MethodSummary 
  name: options_of
comment: 
- !ruby/struct:SM::Flow::H 
  level: 1
  text: fileutils.rb
- !ruby/struct:SM::Flow::P 
  body: Copyright (c) 2000-2006 Minero Aoki
- !ruby/struct:SM::Flow::P 
  body: This program is free software. You can distribute/modify this program under the same terms of ruby.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: module FileUtils
- !ruby/struct:SM::Flow::P 
  body: Namespace for several file utility methods for copying, moving, removing, etc.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Module Functions
- !ruby/struct:SM::Flow::VERB 
  body: "  cd(dir, options)\n  cd(dir, options) {|dir| .... }\n  pwd()\n  mkdir(dir, options)\n  mkdir(list, options)\n  mkdir_p(dir, options)\n  mkdir_p(list, options)\n  rmdir(dir, options)\n  rmdir(list, options)\n  ln(old, new, options)\n  ln(list, destdir, options)\n  ln_s(old, new, options)\n  ln_s(list, destdir, options)\n  ln_sf(src, dest, options)\n  cp(src, dest, options)\n  cp(list, dir, options)\n  cp_r(src, dest, options)\n  cp_r(list, dir, options)\n  mv(src, dest, options)\n  mv(list, dir, options)\n  rm(list, options)\n  rm_r(list, options)\n  rm_rf(list, options)\n  install(src, dest, mode = &lt;src's&gt;, options)\n  chmod(mode, list, options)\n  chmod_R(mode, list, options)\n  chown(user, group, list, options)\n  chown_R(user, group, list, options)\n  touch(list, options)\n"
- !ruby/struct:SM::Flow::P 
  body: The <tt>options</tt> parameter is a hash of options, taken from the list <tt>:force</tt>, <tt>:noop</tt>, <tt>:preserve</tt>, and <tt>:verbose</tt>. <tt>:noop</tt> means that no changes are made. The other two are obvious. Each method documents the options that it honours.
- !ruby/struct:SM::Flow::P 
  body: All methods that have the concept of a &quot;source&quot; file or directory can take either one file or a list of files in that argument. See the method documentation for examples.
- !ruby/struct:SM::Flow::P 
  body: "There are some `low level' methods, which do not accept any option:"
- !ruby/struct:SM::Flow::VERB 
  body: "  copy_entry(src, dest, preserve = false, dereference = false)\n  copy_file(src, dest, preserve = false, dereference = true)\n  copy_stream(srcstream, deststream)\n  remove_entry(path, force = false)\n  remove_entry_secure(path, force = false)\n  remove_file(path, force = false)\n  compare_file(path_a, path_b)\n  compare_stream(stream_a, stream_b)\n  uptodate?(file, cmp_list)\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: module FileUtils::Verbose
- !ruby/struct:SM::Flow::P 
  body: This module has all methods of FileUtils module, but it outputs messages before acting. This equates to passing the <tt>:verbose</tt> flag to methods in FileUtils.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: module FileUtils::NoWrite
- !ruby/struct:SM::Flow::P 
  body: This module has all methods of FileUtils module, but never changes files/directories. This equates to passing the <tt>:noop</tt> flag to methods in FileUtils.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: module FileUtils::DryRun
- !ruby/struct:SM::Flow::P 
  body: This module has all methods of FileUtils module, but never changes files/directories. This equates to passing the <tt>:noop</tt> and <tt>:verbose</tt> flags to methods in FileUtils.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: METHODS
  value: singleton_methods() - %w( private_module_function       commands options have_option? options_of collect_method )
full_name: FileUtils
includes: 
- !ruby/object:RI::IncludedModule 
  name: StreamUtils_
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: cd
- !ruby/object:RI::MethodSummary 
  name: chdir
- !ruby/object:RI::MethodSummary 
  name: chmod
- !ruby/object:RI::MethodSummary 
  name: chmod_R
- !ruby/object:RI::MethodSummary 
  name: chown
- !ruby/object:RI::MethodSummary 
  name: chown_R
- !ruby/object:RI::MethodSummary 
  name: cmp
- !ruby/object:RI::MethodSummary 
  name: compare_file
- !ruby/object:RI::MethodSummary 
  name: compare_stream
- !ruby/object:RI::MethodSummary 
  name: copy
- !ruby/object:RI::MethodSummary 
  name: copy_entry
- !ruby/object:RI::MethodSummary 
  name: copy_file
- !ruby/object:RI::MethodSummary 
  name: copy_stream
- !ruby/object:RI::MethodSummary 
  name: cp
- !ruby/object:RI::MethodSummary 
  name: cp_r
- !ruby/object:RI::MethodSummary 
  name: fu_have_symlink?
- !ruby/object:RI::MethodSummary 
  name: fu_world_writable?
- !ruby/object:RI::MethodSummary 
  name: getwd
- !ruby/object:RI::MethodSummary 
  name: identical?
- !ruby/object:RI::MethodSummary 
  name: install
- !ruby/object:RI::MethodSummary 
  name: link
- !ruby/object:RI::MethodSummary 
  name: ln
- !ruby/object:RI::MethodSummary 
  name: ln_s
- !ruby/object:RI::MethodSummary 
  name: ln_sf
- !ruby/object:RI::MethodSummary 
  name: makedirs
- !ruby/object:RI::MethodSummary 
  name: mkdir
- !ruby/object:RI::MethodSummary 
  name: mkdir_p
- !ruby/object:RI::MethodSummary 
  name: mkpath
- !ruby/object:RI::MethodSummary 
  name: move
- !ruby/object:RI::MethodSummary 
  name: mv
- !ruby/object:RI::MethodSummary 
  name: pwd
- !ruby/object:RI::MethodSummary 
  name: remove
- !ruby/object:RI::MethodSummary 
  name: remove_dir
- !ruby/object:RI::MethodSummary 
  name: remove_entry
- !ruby/object:RI::MethodSummary 
  name: remove_entry_secure
- !ruby/object:RI::MethodSummary 
  name: remove_file
- !ruby/object:RI::MethodSummary 
  name: rm
- !ruby/object:RI::MethodSummary 
  name: rm_f
- !ruby/object:RI::MethodSummary 
  name: rm_r
- !ruby/object:RI::MethodSummary 
  name: rm_rf
- !ruby/object:RI::MethodSummary 
  name: rmdir
- !ruby/object:RI::MethodSummary 
  name: rmtree
- !ruby/object:RI::MethodSummary 
  name: safe_unlink
- !ruby/object:RI::MethodSummary 
  name: symlink
- !ruby/object:RI::MethodSummary 
  name: touch
- !ruby/object:RI::MethodSummary 
  name: uptodate?
name: FileUtils
superclass: 
PKb}[b�ttt!ri/1.8/system/FileUtils/cp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: copy
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: preserve noop verbose"
- !ruby/struct:SM::Flow::P 
  body: Copies a file content <tt>src</tt> to <tt>dest</tt>. If <tt>dest</tt> is a directory, copies <tt>src</tt> to +dest/src+.
- !ruby/struct:SM::Flow::P 
  body: If <tt>src</tt> is a list of files, then <tt>dest</tt> must be a directory.
- !ruby/struct:SM::Flow::VERB 
  body: "  FileUtils.cp 'eval.c', 'eval.c.org'\n  FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'\n  FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6', :verbose =&gt; true\n  FileUtils.cp 'symlink', 'dest'   # copy content, &quot;dest&quot; is not a symlink\n"
full_name: FileUtils#cp
is_singleton: false
name: cp
params: (src, dest, options = {})
visibility: public
PKb}[�9��#ri/1.8/system/FileUtils/rm_r-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: force noop verbose secure"
- !ruby/struct:SM::Flow::P 
  body: remove files <tt>list</tt>[0] <tt>list</tt>[1]... If <tt>list</tt>[n] is a directory, removes its all contents recursively. This method ignores StandardError when :force option is set.
- !ruby/struct:SM::Flow::VERB 
  body: "  FileUtils.rm_r Dir.glob('/tmp/*')\n  FileUtils.rm_r '/', :force =&gt; true          #  :-)\n"
- !ruby/struct:SM::Flow::P 
  body: "WARNING: This method causes local vulnerability if one of parent directories or removing directory tree are world writable (including /tmp, whose permission is 1777), and the current process has strong privilege such as Unix super user (root), and the system has symbolic link. For secure removing, read the documentation of #remove_entry_secure carefully, and set :secure option to true. Default is :secure=&gt;false."
- !ruby/struct:SM::Flow::P 
  body: "NOTE: This method calls #remove_entry_secure if :secure option is set. See also #remove_entry_secure."
full_name: FileUtils#rm_r
is_singleton: false
name: rm_r
params: (list, options = {})
visibility: public
PKb}[-M����2ri/1.8/system/FileUtils/NoWrite/cdesc-NoWrite.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: This module has all methods of FileUtils module, but never changes files/directories. This equates to passing the <tt>:noop</tt> flag to methods in FileUtils.
constants: []

full_name: FileUtils::NoWrite
includes: 
- !ruby/object:RI::IncludedModule 
  name: FileUtils
instance_methods: []

name: NoWrite
superclass: 
PKb}[Q���uu(ri/1.8/system/FileUtils/copy_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Copies file contents of <tt>src</tt> to <tt>dest</tt>. Both of <tt>src</tt> and <tt>dest</tt> must be a path name.
full_name: FileUtils#copy_file
is_singleton: false
name: copy_file
params: (src, dest, preserve = false, dereference = true)
visibility: public
PKb}[w�b)��%ri/1.8/system/FileUtils/mkpath-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #mkdir_p"
full_name: FileUtils#mkpath
is_singleton: false
name: mkpath
params: (list, options = {})
visibility: public
PKb}[L���VV$ri/1.8/system/FileUtils/chmod-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: noop verbose"
- !ruby/struct:SM::Flow::P 
  body: Changes permission bits on the named files (in <tt>list</tt>) to the bit pattern represented by <tt>mode</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "  FileUtils.chmod 0755, 'somecommand'\n  FileUtils.chmod 0644, %w(my.rb your.rb his.rb her.rb)\n  FileUtils.chmod 0755, '/usr/bin/ruby', :verbose =&gt; true\n"
full_name: FileUtils#chmod
is_singleton: false
name: chmod
params: (mode, list, options = {})
visibility: public
PKb}[�0\�--$ri/1.8/system/FileUtils/rmdir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: noop, verbose"
- !ruby/struct:SM::Flow::P 
  body: Removes one or more directories.
- !ruby/struct:SM::Flow::VERB 
  body: "  FileUtils.rmdir 'somedir'\n  FileUtils.rmdir %w(somedir anydir otherdir)\n  # Does not really remove directory; outputs message.\n  FileUtils.rmdir 'somedir', :verbose =&gt; true, :noop =&gt; true\n"
full_name: FileUtils#rmdir
is_singleton: false
name: rmdir
params: (list, options = {})
visibility: public
PKb}[�2���"ri/1.8/system/FileUtils/cmp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #compare_file"
full_name: FileUtils#cmp
is_singleton: false
name: cmp
params: (a, b)
visibility: public
PKb}[	��V33-ri/1.8/system/FileUtils/compare_stream-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the contents of a stream <tt>a</tt> and <tt>b</tt> are identical.
full_name: FileUtils#compare_stream
is_singleton: false
name: compare_stream
params: (a, b)
visibility: public
PKb}[~��1ri/1.8/system/FileUtils/fu_have_symlink%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: FileUtils#fu_have_symlink?
is_singleton: false
name: fu_have_symlink?
params: (
visibility: public
PKb}[Q��*��'ri/1.8/system/FileUtils/makedirs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #mkdir_p"
full_name: FileUtils#makedirs
is_singleton: false
name: makedirs
params: (list, options = {})
visibility: public
PKb}[w�V��-ri/1.8/system/FileUtils/collect_method-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an Array of method names which have the option <tt>opt</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "  p FileUtils.collect_method(:preserve) #=&gt; [&quot;cp&quot;, &quot;cp_r&quot;, &quot;copy&quot;, &quot;install&quot;]\n"
full_name: FileUtils::collect_method
is_singleton: true
name: collect_method
params: (opt)
visibility: private
PKb}[���**)ri/1.8/system/FileUtils/copy_entry-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Copies a file system entry <tt>src</tt> to <tt>dest</tt>. If <tt>src</tt> is a directory, this method copies its contents recursively. This method preserves file types, c.f. symlink, directory... (FIFO, device files and etc. are not supported yet)
- !ruby/struct:SM::Flow::P 
  body: Both of <tt>src</tt> and <tt>dest</tt> must be a path name. <tt>src</tt> must exist, <tt>dest</tt> must not exist.
- !ruby/struct:SM::Flow::P 
  body: If <tt>preserve</tt> is true, this method preserves owner, group, permissions and modified time.
- !ruby/struct:SM::Flow::P 
  body: If <tt>dereference_root</tt> is true, this method dereference tree root.
- !ruby/struct:SM::Flow::P 
  body: If <tt>remove_destination</tt> is true, this method removes each destination file before copy.
full_name: FileUtils#copy_entry
is_singleton: false
name: copy_entry
params: (src, dest, preserve = false, dereference_root = false, remove_destination = false)
visibility: public
PKb}[u�=��%ri/1.8/system/FileUtils/remove-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #rm"
full_name: FileUtils#remove
is_singleton: false
name: remove
params: (list, options = {})
visibility: public
PKb}[�bH���0ri/1.8/system/FileUtils/Entry_/cdesc-Entry_.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: FileUtils::Entry_
includes: []

instance_methods: []

name: Entry_
superclass: Object
PKb}[�
��6ri/1.8/system/FileUtils/StreamUtils_/fu_blksize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: FileUtils::StreamUtils_#fu_blksize
is_singleton: false
name: fu_blksize
params: (st)
visibility: private
PKb}[��+֫�<ri/1.8/system/FileUtils/StreamUtils_/cdesc-StreamUtils_.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: FileUtils::StreamUtils_
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: fu_blksize
- !ruby/object:RI::MethodSummary 
  name: fu_default_blksize
- !ruby/object:RI::MethodSummary 
  name: fu_stream_blksize
- !ruby/object:RI::MethodSummary 
  name: fu_windows?
name: StreamUtils_
superclass: 
PKb}[o���>ri/1.8/system/FileUtils/StreamUtils_/fu_default_blksize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: FileUtils::StreamUtils_#fu_default_blksize
is_singleton: false
name: fu_default_blksize
params: ()
visibility: private
PKb}[˸���=ri/1.8/system/FileUtils/StreamUtils_/fu_stream_blksize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: FileUtils::StreamUtils_#fu_stream_blksize
is_singleton: false
name: fu_stream_blksize
params: (*streams)
visibility: private
PKb}[�g���9ri/1.8/system/FileUtils/StreamUtils_/fu_windows%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: FileUtils::StreamUtils_#fu_windows?
is_singleton: false
name: fu_windows?
params: ()
visibility: private
PKb}[����3ri/1.8/system/FileUtils/fu_world_writable%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: FileUtils#fu_world_writable?
is_singleton: false
name: fu_world_writable?
params: (st)
visibility: public
PKb}[.�
>��!ri/1.8/system/FileUtils/cd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: chdir
block_params: dir
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: verbose"
- !ruby/struct:SM::Flow::P 
  body: Changes the current directory to the directory <tt>dir</tt>.
- !ruby/struct:SM::Flow::P 
  body: If this method is called with block, resumes to the old working directory after the block execution finished.
- !ruby/struct:SM::Flow::VERB 
  body: "  FileUtils.cd('/', :verbose =&gt; true)   # chdir and report it\n"
full_name: FileUtils#cd
is_singleton: false
name: cd
params: (dir, options = {}) {|dir| ...}
visibility: public
PKb}[x�O�$ri/1.8/system/FileUtils/mkdir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: mode noop verbose"
- !ruby/struct:SM::Flow::P 
  body: Creates one or more directories.
- !ruby/struct:SM::Flow::VERB 
  body: "  FileUtils.mkdir 'test'\n  FileUtils.mkdir %w( tmp data )\n  FileUtils.mkdir 'notexist', :noop =&gt; true  # Does not really create.\n  FileUtils.mkdir 'tmp', :mode =&gt; 0700\n"
full_name: FileUtils#mkdir
is_singleton: false
name: mkdir
params: (list, options = {})
visibility: public
PKb}[Mݶ�!ri/1.8/system/FileUtils/mv-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: move
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: force noop verbose"
- !ruby/struct:SM::Flow::P 
  body: Moves file(s) <tt>src</tt> to <tt>dest</tt>. If <tt>file</tt> and <tt>dest</tt> exist on the different disk partition, the file is copied instead.
- !ruby/struct:SM::Flow::VERB 
  body: "  FileUtils.mv 'badname.rb', 'goodname.rb'\n  FileUtils.mv 'stuff.rb', '/notexist/lib/ruby', :force =&gt; true  # no error\n\n  FileUtils.mv %w(junk.txt dust.txt), '/home/aamine/.trash/'\n  FileUtils.mv Dir.glob('test*.rb'), 'test', :noop =&gt; true, :verbose =&gt; true\n"
full_name: FileUtils#mv
is_singleton: false
name: mv
params: (src, dest, options = {})
visibility: public
PKb}[�����0ri/1.8/system/FileUtils/DryRun/cdesc-DryRun.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: This module has all methods of FileUtils module, but never changes files/directories, with printing message before acting. This equates to passing the <tt>:noop</tt> and <tt>:verbose</tt> flag to methods in FileUtils.
constants: []

full_name: FileUtils::DryRun
includes: 
- !ruby/object:RI::IncludedModule 
  name: FileUtils
instance_methods: []

name: DryRun
superclass: 
PKb}[d?���#ri/1.8/system/FileUtils/link-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #ln"
full_name: FileUtils#link
is_singleton: false
name: link
params: (src, dest, options = {})
visibility: public
PKb}[�����#ri/1.8/system/FileUtils/copy-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #cp"
full_name: FileUtils#copy
is_singleton: false
name: copy
params: (src, dest, options = {})
visibility: public
PKb}[{�
�ll$ri/1.8/system/FileUtils/ln_sf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: noop verbose"
- !ruby/struct:SM::Flow::P 
  body: Same as
- !ruby/struct:SM::Flow::VERB 
  body: "  #ln_s(src, dest, :force)\n"
full_name: FileUtils#ln_sf
is_singleton: false
name: ln_sf
params: (src, dest, options = {})
visibility: public
PKb}[��<�))+ri/1.8/system/FileUtils/compare_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: identical?
- !ruby/object:RI::AliasName 
  name: cmp
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the contents of a file A and a file B are identical.
- !ruby/struct:SM::Flow::VERB 
  body: "  FileUtils.compare_file('somefile', 'somefile')  #=&gt; true\n  FileUtils.compare_file('/bin/cp', '/bin/mv')    #=&gt; maybe false\n"
full_name: FileUtils#compare_file
is_singleton: false
name: compare_file
params: (a, b)
visibility: public
PKb}[͌��%ri/1.8/system/FileUtils/rmtree-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #rm_rf"
full_name: FileUtils#rmtree
is_singleton: false
name: rmtree
params: (list, options = {})
visibility: public
PKb}[��_C��&ri/1.8/system/FileUtils/chmod_R-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: noop verbose force"
- !ruby/struct:SM::Flow::P 
  body: Changes permission bits on the named files (in <tt>list</tt>) to the bit pattern represented by <tt>mode</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "  FileUtils.chmod_R 0700, &quot;/tmp/app.#{$$}&quot;\n"
full_name: FileUtils#chmod_R
is_singleton: false
name: chmod_R
params: (mode, list, options = {})
visibility: public
PKb}[u�c��!ri/1.8/system/FileUtils/ln-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: link
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: force noop verbose"
- !ruby/struct:SM::Flow::P 
  body: <b><tt>ln(old, new, options = {})</tt></b>
- !ruby/struct:SM::Flow::P 
  body: Creates a hard link <tt>new</tt> which points to <tt>old</tt>. If <tt>new</tt> already exists and it is a directory, creates a link +new/old+. If <tt>new</tt> already exists and it is not a directory, raises Errno::EEXIST. But if :force option is set, overwrite <tt>new</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "  FileUtils.ln 'gcc', 'cc', :verbose =&gt; true\n  FileUtils.ln '/usr/bin/emacs21', '/usr/bin/emacs'\n"
- !ruby/struct:SM::Flow::P 
  body: <b><tt>ln(list, destdir, options = {})</tt></b>
- !ruby/struct:SM::Flow::P 
  body: Creates several hard links in a directory, with each one pointing to the item in <tt>list</tt>. If <tt>destdir</tt> is not a directory, raises Errno::ENOTDIR.
- !ruby/struct:SM::Flow::VERB 
  body: "  include FileUtils\n  cd '/sbin'\n  FileUtils.ln %w(cp mv mkdir), '/bin'   # Now /sbin/cp and /bin/cp are linked.\n"
full_name: FileUtils#ln
is_singleton: false
name: ln
params: (src, dest, options = {})
visibility: public
PKb}[�~����+ri/1.8/system/FileUtils/remove_entry-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: This method removes a file system entry <tt>path</tt>. <tt>path</tt> might be a regular file, a directory, or something. If <tt>path</tt> is a directory, remove it recursively.
- !ruby/struct:SM::Flow::P 
  body: "See also #remove_entry_secure."
full_name: FileUtils#remove_entry
is_singleton: false
name: remove_entry
params: (path, force = false)
visibility: public
PKb}[H��zEE*ri/1.8/system/FileUtils/remove_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes a file <tt>path</tt>. This method ignores StandardError if <tt>force</tt> is true.
full_name: FileUtils#remove_file
is_singleton: false
name: remove_file
params: (path, force = false)
visibility: public
PKb}[����&ri/1.8/system/FileUtils/options-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an Array of option names.
- !ruby/struct:SM::Flow::VERB 
  body: "  p FileUtils.options  #=&gt; [&quot;noop&quot;, &quot;force&quot;, &quot;verbose&quot;, &quot;preserve&quot;, &quot;mode&quot;]\n"
full_name: FileUtils::options
is_singleton: true
name: options
params: ()
visibility: private
PKb}[����2ri/1.8/system/FileUtils/Verbose/cdesc-Verbose.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: This module has all methods of FileUtils module, but it outputs messages before acting. This equates to passing the <tt>:verbose</tt> flag to methods in FileUtils.
constants: []

full_name: FileUtils::Verbose
includes: 
- !ruby/object:RI::IncludedModule 
  name: FileUtils
instance_methods: []

name: Verbose
superclass: 
PKb}[;��QQ"ri/1.8/system/FileUtils/pwd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: getwd
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: (none)"
- !ruby/struct:SM::Flow::P 
  body: Returns the name of the current directory.
full_name: FileUtils#pwd
is_singleton: false
name: pwd
params: ()
visibility: public
PKb}[����dd*ri/1.8/system/FileUtils/copy_stream-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Copies stream <tt>src</tt> to <tt>dest</tt>. <tt>src</tt> must respond to #read(n) and <tt>dest</tt> must respond to #write(str)."
full_name: FileUtils#copy_stream
is_singleton: false
name: copy_stream
params: (src, dest)
visibility: public
PKb}[����$ri/1.8/system/FileUtils/touch-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: noop verbose"
- !ruby/struct:SM::Flow::P 
  body: Updates modification time (mtime) and access time (atime) of file(s) in <tt>list</tt>. Files are created if they don't exist.
- !ruby/struct:SM::Flow::VERB 
  body: "  FileUtils.touch 'timestamp'\n  FileUtils.touch Dir.glob('*.c');  system 'make'\n"
full_name: FileUtils#touch
is_singleton: false
name: touch
params: (list, options = {})
visibility: public
PKb}[�h�>&&#ri/1.8/system/FileUtils/cp_r-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: preserve noop verbose dereference_root remove_destination"
- !ruby/struct:SM::Flow::P 
  body: Copies <tt>src</tt> to <tt>dest</tt>. If <tt>src</tt> is a directory, this method copies all its contents recursively. If <tt>dest</tt> is a directory, copies <tt>src</tt> to +dest/src+.
- !ruby/struct:SM::Flow::P 
  body: <tt>src</tt> can be a list of files.
- !ruby/struct:SM::Flow::VERB 
  body: "  # Installing ruby library &quot;mylib&quot; under the site_ruby\n  FileUtils.rm_r site_ruby + '/mylib', :force\n  FileUtils.cp_r 'lib/', site_ruby + '/mylib'\n\n  # Examples of copying several files to target directory.\n  FileUtils.cp_r %w(mail.rb field.rb debug/), site_ruby + '/tmail'\n  FileUtils.cp_r Dir.glob('*.rb'), '/home/aamine/lib/ruby', :noop =&gt; true, :verbose =&gt; true\n\n  # If you want to copy all contents of a directory instead of the\n  # directory itself, c.f. src/x -&gt; dest/x, src/y -&gt; dest/y,\n  # use following code.\n  FileUtils.cp_r 'src/.', 'dest'     # cp_r('src', 'dest') makes src/dest,\n                                     # but this doesn't.\n"
full_name: FileUtils#cp_r
is_singleton: false
name: cp_r
params: (src, dest, options = {})
visibility: public
PKb}[
�jp��&ri/1.8/system/FileUtils/chown_R-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: noop verbose force"
- !ruby/struct:SM::Flow::P 
  body: Changes owner and group on the named files (in <tt>list</tt>) to the user <tt>user</tt> and the group <tt>group</tt> recursively. <tt>user</tt> and <tt>group</tt> may be an ID (Integer/String) or a name (String). If <tt>user</tt> or <tt>group</tt> is nil, this method does not change the attribute.
- !ruby/struct:SM::Flow::VERB 
  body: "  FileUtils.chown_R 'www', 'www', '/var/www/htdocs'\n  FileUtils.chown_R 'cvs', 'cvs', '/var/cvs', :verbose =&gt; true\n"
full_name: FileUtils#chown_R
is_singleton: false
name: chown_R
params: (user, group, list, options = {})
visibility: public
PKb}[��ng��*ri/1.8/system/FileUtils/safe_unlink-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #rm_f"
full_name: FileUtils#safe_unlink
is_singleton: false
name: safe_unlink
params: (list, options = {})
visibility: public
PKb}[һ�`LL#ri/1.8/system/FileUtils/ln_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: symlink
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: force noop verbose"
- !ruby/struct:SM::Flow::P 
  body: <b><tt>ln_s(old, new, options = {})</tt></b>
- !ruby/struct:SM::Flow::P 
  body: Creates a symbolic link <tt>new</tt> which points to <tt>old</tt>. If <tt>new</tt> already exists and it is a directory, creates a symbolic link +new/old+. If <tt>new</tt> already exists and it is not a directory, raises Errno::EEXIST. But if :force option is set, overwrite <tt>new</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "  FileUtils.ln_s '/usr/bin/ruby', '/usr/local/bin/ruby'\n  FileUtils.ln_s 'verylongsourcefilename.c', 'c', :force =&gt; true\n"
- !ruby/struct:SM::Flow::P 
  body: <b><tt>ln_s(list, destdir, options = {})</tt></b>
- !ruby/struct:SM::Flow::P 
  body: Creates several symbolic links in a directory, with each one pointing to the item in <tt>list</tt>. If <tt>destdir</tt> is not a directory, raises Errno::ENOTDIR.
- !ruby/struct:SM::Flow::P 
  body: If <tt>destdir</tt> is not a directory, raises Errno::ENOTDIR.
- !ruby/struct:SM::Flow::VERB 
  body: "  FileUtils.ln_s Dir.glob('bin/*.rb'), '/home/aamine/bin'\n"
full_name: FileUtils#ln_s
is_singleton: false
name: ln_s
params: (src, dest, options = {})
visibility: public
PKb}[5���#ri/1.8/system/FileUtils/rm_f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: safe_unlink
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: noop verbose"
- !ruby/struct:SM::Flow::P 
  body: Equivalent to
- !ruby/struct:SM::Flow::VERB 
  body: "  #rm(list, :force =&gt; true)\n"
full_name: FileUtils#rm_f
is_singleton: false
name: rm_f
params: (list, options = {})
visibility: public
PKb}[׀�Edd)ri/1.8/system/FileUtils/remove_dir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes a directory <tt>dir</tt> and its contents recursively. This method ignores StandardError if <tt>force</tt> is true.
full_name: FileUtils#remove_dir
is_singleton: false
name: remove_dir
params: (path, force = false)
visibility: public
PKb}[�=_:��'ri/1.8/system/FileUtils/commands-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an Array of method names which have any options.
- !ruby/struct:SM::Flow::VERB 
  body: "  p FileUtils.commands  #=&gt; [&quot;chmod&quot;, &quot;cp&quot;, &quot;cp_r&quot;, &quot;install&quot;, ...]\n"
full_name: FileUtils::commands
is_singleton: true
name: commands
params: ()
visibility: private
PKb}[�X\���$ri/1.8/system/FileUtils/chdir-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #cd"
full_name: FileUtils#chdir
is_singleton: false
name: chdir
params: (dir, options = {})
visibility: public
PKb}[�<���+ri/1.8/system/FileUtils/identical%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #compare_file"
full_name: FileUtils#identical?
is_singleton: false
name: identical?
params: (a, b)
visibility: public
PKb}[џ�DD&ri/1.8/system/FileUtils/mkdir_p-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: mkpath
- !ruby/object:RI::AliasName 
  name: makedirs
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: mode noop verbose"
- !ruby/struct:SM::Flow::P 
  body: Creates a directory and all its parent directories. For example,
- !ruby/struct:SM::Flow::VERB 
  body: "  FileUtils.mkdir_p '/usr/local/lib/ruby'\n"
- !ruby/struct:SM::Flow::P 
  body: causes to make following directories, if it does not exist.
- !ruby/struct:SM::Flow::VERB 
  body: "    * /usr\n    * /usr/local\n    * /usr/local/lib\n    * /usr/local/lib/ruby\n"
- !ruby/struct:SM::Flow::P 
  body: You can pass several directories at a time in a list.
full_name: FileUtils#mkdir_p
is_singleton: false
name: mkdir_p
params: (list, options = {})
visibility: public
PKb}[P!G���2ri/1.8/system/FileUtils/remove_entry_secure-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "This method removes a file system entry <tt>path</tt>. <tt>path</tt> shall be a regular file, a directory, or something. If <tt>path</tt> is a directory, remove it recursively. This method is required to avoid TOCTTOU (time-of-check-to-time-of-use) local security vulnerability of #rm_r. #rm_r causes security hole when:"
- !ruby/struct:SM::Flow::VERB 
  body: "  * Parent directory is world writable (including /tmp).\n  * Removing directory tree includes world writable directory.\n  * The system has symbolic link.\n"
- !ruby/struct:SM::Flow::P 
  body: To avoid this security hole, this method applies special preprocess. If <tt>path</tt> is a directory, this method chown(2) and chmod(2) all removing directories. This requires the current process is the owner of the removing whole directory tree, or is the super user (root).
- !ruby/struct:SM::Flow::P 
  body: "WARNING: You must ensure that <b>ALL</b> parent directories cannot be moved by other untrusted users. For example, parent directories should not be owned by untrusted users, and should not be world writable except when the sticky bit set."
- !ruby/struct:SM::Flow::P 
  body: "WARNING: Only the owner of the removing directory tree, or Unix super user (root) should invoke this method. Otherwise this method does not work."
- !ruby/struct:SM::Flow::P 
  body: "For details of this security vulnerability, see Perl's case:"
- !ruby/struct:SM::Flow::VERB 
  body: "  http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2005-0448\n  http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2004-0452\n"
- !ruby/struct:SM::Flow::P 
  body: For fileutils.rb, this vulnerability is reported in [ruby-dev:26100].
full_name: FileUtils#remove_entry_secure
is_singleton: false
name: remove_entry_secure
params: (path, force = false)
visibility: public
PKb}[��O��&ri/1.8/system/FileUtils/install-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: mode preserve noop verbose"
- !ruby/struct:SM::Flow::P 
  body: If <tt>src</tt> is not same as <tt>dest</tt>, copies it and changes the permission mode to <tt>mode</tt>. If <tt>dest</tt> is a directory, destination is <tt>dest</tt>/<tt>src</tt>. This method removes destination before copy.
- !ruby/struct:SM::Flow::VERB 
  body: "  FileUtils.install 'ruby', '/usr/local/bin/ruby', :mode =&gt; 0755, :verbose =&gt; true\n  FileUtils.install 'lib.rb', '/usr/local/lib/ruby/site_ruby', :verbose =&gt; true\n"
full_name: FileUtils#install
is_singleton: false
name: install
params: (src, dest, options = {})
visibility: public
PKb}[�~J��$ri/1.8/system/FileUtils/getwd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #pwd"
full_name: FileUtils#getwd
is_singleton: false
name: getwd
params: ()
visibility: public
PKb}[;sJt��!ri/1.8/system/FileUtils/rm-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: remove
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: force noop verbose"
- !ruby/struct:SM::Flow::P 
  body: Remove file(s) specified in <tt>list</tt>. This method cannot remove directories. All StandardErrors are ignored when the :force option is set.
- !ruby/struct:SM::Flow::VERB 
  body: "  FileUtils.rm %w( junk.txt dust.txt )\n  FileUtils.rm Dir.glob('*.so')\n  FileUtils.rm 'NotExistFile', :force =&gt; true   # never raises exception\n"
full_name: FileUtils#rm
is_singleton: false
name: rm
params: (list, options = {})
visibility: public
PKb}[����&ri/1.8/system/FileUtils/symlink-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #ln_s"
full_name: FileUtils#symlink
is_singleton: false
name: symlink
params: (src, dest, options = {})
visibility: public
PKb}[z�*ri/1.8/system/FileUtils/uptodate%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: (none)"
- !ruby/struct:SM::Flow::P 
  body: Returns true if <tt>newer</tt> is newer than all <tt>old_list</tt>. Non-existent files are older than any file.
- !ruby/struct:SM::Flow::VERB 
  body: "  FileUtils.uptodate?('hello.o', %w(hello.c hello.h)) or    #       system 'make hello.o'\n"
full_name: FileUtils#uptodate?
is_singleton: false
name: uptodate?
params: (new, old_list, options = nil)
visibility: public
PKb}[r��E��$ri/1.8/system/FileUtils/chown-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Options: noop verbose"
- !ruby/struct:SM::Flow::P 
  body: Changes owner and group on the named files (in <tt>list</tt>) to the user <tt>user</tt> and the group <tt>group</tt>. <tt>user</tt> and <tt>group</tt> may be an ID (Integer/String) or a name (String). If <tt>user</tt> or <tt>group</tt> is nil, this method does not change the attribute.
- !ruby/struct:SM::Flow::VERB 
  body: "  FileUtils.chown 'root', 'staff', '/usr/local/bin/ruby'\n  FileUtils.chown nil, 'bin', Dir.glob('/usr/bin/*'), :verbose =&gt; true\n"
full_name: FileUtils#chown
is_singleton: false
name: chown
params: (user, group, list, options = {})
visibility: public
PKb}[ǩ��$ri/1.8/system/Method/receiver-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the bound receiver of the method object.
full_name: Method#receiver
is_singleton: false
name: receiver
params: |
  meth.receiver    => object

visibility: public
PKb}[�)��!ri/1.8/system/Method/arity-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an indication of the number of arguments accepted by a method. Returns a nonnegative integer for methods that take a fixed number of arguments. For Ruby methods that take a variable number of arguments, returns -n-1, where n is the number of required arguments. For methods written in C, returns -1 if the call takes a variable number of arguments.
- !ruby/struct:SM::Flow::VERB 
  body: "   class C\n     def one;    end\n     def two(a); end\n     def three(*a);  end\n     def four(a, b); end\n     def five(a, b, *c);    end\n     def six(a, b, *c, &amp;d); end\n   end\n   c = C.new\n   c.method(:one).arity     #=&gt; 0\n   c.method(:two).arity     #=&gt; 1\n   c.method(:three).arity   #=&gt; -1\n   c.method(:four).arity    #=&gt; 2\n   c.method(:five).arity    #=&gt; -3\n   c.method(:six).arity     #=&gt; -3\n\n   &quot;cat&quot;.method(:size).arity      #=&gt; 0\n   &quot;cat&quot;.method(:replace).arity   #=&gt; 1\n   &quot;cat&quot;.method(:squeeze).arity   #=&gt; -1\n   &quot;cat&quot;.method(:count).arity     #=&gt; -1\n"
full_name: Method#arity
is_singleton: false
name: arity
params: |
  meth.arity    => fixnum

visibility: public
PKb}[fR	���"ri/1.8/system/Method/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invokes the <em>meth</em> with the specified arguments, returning the method's return value.
- !ruby/struct:SM::Flow::VERB 
  body: "   m = 12.method(&quot;+&quot;)\n   m.call(3)    #=&gt; 15\n   m.call(20)   #=&gt; 32\n"
full_name: Method#[]
is_singleton: false
name: "[]"
params: |
  meth.call(args, ...)    => obj
  meth[args, ...]         => obj

visibility: public
PKc}[�
�� ri/1.8/system/Method/call-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invokes the <em>meth</em> with the specified arguments, returning the method's return value.
- !ruby/struct:SM::Flow::VERB 
  body: "   m = 12.method(&quot;+&quot;)\n   m.call(3)    #=&gt; 15\n   m.call(20)   #=&gt; 32\n"
full_name: Method#call
is_singleton: false
name: call
params: |
  meth.call(args, ...)    => obj
  meth[args, ...]         => obj

visibility: public
PKc}[�ܼ""#ri/1.8/system/Method/to_proc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a <tt>Proc</tt> object corresponding to this method.
full_name: Method#to_proc
is_singleton: false
name: to_proc
params: |
  meth.to_proc    => prc

visibility: public
PKc}[��|��"ri/1.8/system/Method/unbind-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Dissociates <em>meth</em> from it's current receiver. The resulting <tt>UnboundMethod</tt> can subsequently be bound to a new object of the same class (see <tt>UnboundMethod</tt>).
full_name: Method#unbind
is_singleton: false
name: unbind
params: |
  meth.unbind    => unbound_method

visibility: public
PKc}[BN僳�#ri/1.8/system/Method/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Show the name of the underlying method.
- !ruby/struct:SM::Flow::VERB 
  body: "  &quot;cat&quot;.method(:count).inspect   #=&gt; &quot;#&lt;Method: String#count&gt;&quot;\n"
full_name: Method#inspect
is_singleton: false
name: inspect
params: |
  meth.to_s      =>  string
  meth.inspect   =>  string

visibility: public
PKc}[�[�  !ri/1.8/system/Method/owner-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the class or module that defines the method.
full_name: Method#owner
is_singleton: false
name: owner
params: |
  meth.owner    => class_or_module

visibility: public
PKc}[����� ri/1.8/system/Method/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Show the name of the underlying method.
- !ruby/struct:SM::Flow::VERB 
  body: "  &quot;cat&quot;.method(:count).inspect   #=&gt; &quot;#&lt;Method: String#count&gt;&quot;\n"
full_name: Method#to_s
is_singleton: false
name: to_s
params: |
  meth.to_s      =>  string
  meth.inspect   =>  string

visibility: public
PKc}[2KZFF"ri/1.8/system/Method/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Two method objects are equal if that are bound to the same object and contain the same body.
full_name: Method#==
is_singleton: false
name: ==
params: |
  meth == other_meth  => true or false

visibility: public
PKc}[��Ի��!ri/1.8/system/Method/clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "MISSING: documentation"
full_name: Method#clone
is_singleton: false
name: clone
params: ()
visibility: public
PKc}[>km��&ri/1.8/system/Method/cdesc-Method.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>Proc</tt> objects are blocks of code that have been bound to a set of local variables. Once bound, the code may be called in different contexts and still access those variables.
- !ruby/struct:SM::Flow::VERB 
  body: "   def gen_times(factor)\n     return Proc.new {|n| n*factor }\n   end\n\n   times3 = gen_times(3)\n   times5 = gen_times(5)\n\n   times3.call(12)               #=&gt; 36\n   times5.call(5)                #=&gt; 25\n   times3.call(times5.call(4))   #=&gt; 60\n"
constants: []

full_name: Method
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: arity
- !ruby/object:RI::MethodSummary 
  name: call
- !ruby/object:RI::MethodSummary 
  name: clone
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: name
- !ruby/object:RI::MethodSummary 
  name: owner
- !ruby/object:RI::MethodSummary 
  name: receiver
- !ruby/object:RI::MethodSummary 
  name: to_proc
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: unbind
name: Method
superclass: Object
PKc}[8��� ri/1.8/system/Method/name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the name of the method.
full_name: Method#name
is_singleton: false
name: name
params: |
  meth.name    => string

visibility: public
PKc}[�9n�&ri/1.8/system/Enumerable/minmax-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns two elements array which contains the minimum and the maximum value in the enumerable. The first form assumes all objects implement <tt>Comparable</tt>; the second uses the block to return <em>a &lt;=&gt; b</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = %w(albatross dog horse)\n   a.minmax                                  #=&gt; [&quot;albatross&quot;, &quot;horse&quot;]\n   a.minmax {|a,b| a.length &lt;=&gt; b.length }   #=&gt; [&quot;dog&quot;, &quot;albatross&quot;]\n"
full_name: Enumerable#minmax
is_singleton: false
name: minmax
params: |
  enum.minmax                   => [min,max]
  enum.minmax {|a,b| block }    => [min,max]

visibility: public
PKc}[�}��#ri/1.8/system/Enumerable/max-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the object in <em>enum</em> with the maximum value. The first form assumes all objects implement <tt>Comparable</tt>; the second uses the block to return <em>a &lt;=&gt; b</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = %w(albatross dog horse)\n   a.max                                  #=&gt; &quot;horse&quot;\n   a.max {|a,b| a.length &lt;=&gt; b.length }   #=&gt; &quot;albatross&quot;\n"
full_name: Enumerable#max
is_singleton: false
name: max
params: |
  enum.max                   => obj
  enum.max {|a,b| block }    => obj

visibility: public
PKc}[���&ri/1.8/system/Enumerable/select-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array containing all elements of <em>enum</em> for which <em>block</em> is not <tt>false</tt> (see also <tt>Enumerable#reject</tt>).
- !ruby/struct:SM::Flow::VERB 
  body: "   (1..10).find_all {|i|  i % 3 == 0 }   #=&gt; [3, 6, 9]\n"
full_name: Enumerable#select
is_singleton: false
name: select
params: |
  enum.find_all {| obj | block }  => array
  enum.select   {| obj | block }  => array

visibility: public
PKc}[��-G$ri/1.8/system/Enumerable/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array containing the items in <em>enum</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   (1..7).to_a                       #=&gt; [1, 2, 3, 4, 5, 6, 7]\n   { 'a'=&gt;1, 'b'=&gt;2, 'c'=&gt;3 }.to_a   #=&gt; [[&quot;a&quot;, 1], [&quot;b&quot;, 2], [&quot;c&quot;, 3]]\n"
full_name: Enumerable#to_a
is_singleton: false
name: to_a
params: |
  enum.to_a      =>    array
  enum.entries   =>    array

visibility: public
PKd}[�^�mm&ri/1.8/system/Enumerable/any%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes each element of the collection to the given block. The method returns <tt>true</tt> if the block ever returns a value other than <tt>false</tt> or <tt>nil</tt>. If the block is not given, Ruby adds an implicit block of <tt>{|obj| obj}</tt> (that is <tt>any?</tt> will return <tt>true</tt> if at least one of the collection members is not <tt>false</tt> or <tt>nil</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   %w{ ant bear cat}.any? {|word| word.length &gt;= 3}   #=&gt; true\n   %w{ ant bear cat}.any? {|word| word.length &gt;= 4}   #=&gt; true\n   [ nil, true, 99 ].any?                             #=&gt; true\n"
full_name: Enumerable#any?
is_singleton: false
name: any?
params: |
  enum.any? [{|obj| block } ]   => true or false

visibility: public
PKd}[w��""'ri/1.8/system/Enumerable/entries-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array containing the items in <em>enum</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   (1..7).to_a                       #=&gt; [1, 2, 3, 4, 5, 6, 7]\n   { 'a'=&gt;1, 'b'=&gt;2, 'c'=&gt;3 }.to_a   #=&gt; [[&quot;a&quot;, 1], [&quot;b&quot;, 2], [&quot;c&quot;, 3]]\n"
full_name: Enumerable#entries
is_singleton: false
name: entries
params: |
  enum.to_a      =>    array
  enum.entries   =>    array

visibility: public
PKd}["}ݕyy)ri/1.8/system/Enumerable/each_cons-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates the given block for each array of consecutive &lt;n&gt; elements. If no block is given, returns an enumerator.a
- !ruby/struct:SM::Flow::P 
  body: "e.g.:"
- !ruby/struct:SM::Flow::VERB 
  body: "    (1..10).each_cons(3) {|a| p a}\n    # outputs below\n    [1, 2, 3]\n    [2, 3, 4]\n    [3, 4, 5]\n    [4, 5, 6]\n    [5, 6, 7]\n    [6, 7, 8]\n    [7, 8, 9]\n    [8, 9, 10]\n"
full_name: Enumerable#each_cons
is_singleton: false
name: each_cons
params: |
  each_cons(n) {...}
  each_cons(n)

visibility: public
PKd}[�z���$ri/1.8/system/Enumerable/find-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes each entry in <em>enum</em> to <em>block</em>. Returns the first for which <em>block</em> is not <tt>false</tt>. If no object matches, calls <em>ifnone</em> and returns its result when it is specified, or returns <tt>nil</tt>
- !ruby/struct:SM::Flow::VERB 
  body: "   (1..10).detect  {|i| i % 5 == 0 and i % 7 == 0 }   #=&gt; nil\n   (1..100).detect {|i| i % 5 == 0 and i % 7 == 0 }   #=&gt; 35\n"
full_name: Enumerable#find
is_singleton: false
name: find
params: |
  enum.detect(ifnone = nil) {| obj | block }  => obj or nil
  enum.find(ifnone = nil)   {| obj | block }  => obj or nil

visibility: public
PKd}[�爎*ri/1.8/system/Enumerable/drop_while-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Drops elements up to, but not including, the first element for which the block returns nil or false and returns an array containing the remaining elements.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [1, 2, 3, 4, 5, 0]\n   a.drop_while {|i| i &lt; 3 }   # =&gt; [3, 4, 5, 0]\n"
full_name: Enumerable#drop_while
is_singleton: false
name: drop_while
params: |
  enum.drop_while {|arr| block }   => array

visibility: public
PKd}[R�뉀�%ri/1.8/system/Enumerable/cycle-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls <em>block</em> for each element of <em>enum</em> repeatedly <em>n</em> times or forever if none or nil is given. If a non-positive number is given or the collection is empty, does nothing. Returns nil if the loop has finished without getting interrupted.
- !ruby/struct:SM::Flow::P 
  body: Enumerable#cycle saves elements in an internal array so changes to <em>enum</em> after the first pass have no effect.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;]\n   a.cycle {|x| puts x }  # print, a, b, c, a, b, c,.. forever.\n   a.cycle(2) {|x| puts x }  # print, a, b, c, a, b, c.\n"
full_name: Enumerable#cycle
is_singleton: false
name: cycle
params: |
  enum.cycle {|obj| block }
  enum.cycle(n) {|obj| block }

visibility: public
PKd}[�Qw���*ri/1.8/system/Enumerable/take_while-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes elements to the block until the block returns nil or false, then stops iterating and returns an array of all prior elements.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [1, 2, 3, 4, 5, 0]\n   a.take_while {|i| i &lt; 3 }   # =&gt; [1, 2]\n"
full_name: Enumerable#take_while
is_singleton: false
name: take_while
params: |
  enum.take_while {|arr| block }   => array

visibility: public
PKd}[��j�GG)ri/1.8/system/Enumerable/member%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if any member of <em>enum</em> equals <em>obj</em>. Equality is tested using <tt>==</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   IO.constants.include? &quot;SEEK_SET&quot;          #=&gt; true\n   IO.constants.include? &quot;SEEK_NO_FURTHER&quot;   #=&gt; false\n"
full_name: Enumerable#member?
is_singleton: false
name: member?
params: |
  enum.include?(obj)     => true or false
  enum.member?(obj)      => true or false

visibility: public
PKd}[�x?���&ri/1.8/system/Enumerable/detect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes each entry in <em>enum</em> to <em>block</em>. Returns the first for which <em>block</em> is not <tt>false</tt>. If no object matches, calls <em>ifnone</em> and returns its result when it is specified, or returns <tt>nil</tt>
- !ruby/struct:SM::Flow::VERB 
  body: "   (1..10).detect  {|i| i % 5 == 0 and i % 7 == 0 }   #=&gt; nil\n   (1..100).detect {|i| i % 5 == 0 and i % 7 == 0 }   #=&gt; 35\n"
full_name: Enumerable#detect
is_singleton: false
name: detect
params: |
  enum.detect(ifnone = nil) {| obj | block }  => obj or nil
  enum.find(ifnone = nil)   {| obj | block }  => obj or nil

visibility: public
PKd}[���aa'ri/1.8/system/Enumerable/collect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new array with the results of running <em>block</em> once for every element in <em>enum</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   (1..4).collect {|i| i*i }   #=&gt; [1, 4, 9, 16]\n   (1..4).collect { &quot;cat&quot;  }   #=&gt; [&quot;cat&quot;, &quot;cat&quot;, &quot;cat&quot;, &quot;cat&quot;]\n"
full_name: Enumerable#collect
is_singleton: false
name: collect
params: |
  enum.collect {| obj | block }  => array
  enum.map     {| obj | block }  => array

visibility: public
PKd}[�>M��.ri/1.8/system/Enumerable/cdesc-Enumerable.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The <tt>Enumerable</tt> mixin provides collection classes with several traversal and searching methods, and with the ability to sort. The class must provide a method <tt>each</tt>, which yields successive members of the collection. If <tt>Enumerable#max</tt>, <tt>#min</tt>, or <tt>#sort</tt> is used, the objects in the collection must also implement a meaningful <tt>&lt;=&gt;</tt> operator, as these methods rely on an ordering between members of the collection.
constants: []

full_name: Enumerable
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: all?
- !ruby/object:RI::MethodSummary 
  name: any?
- !ruby/object:RI::MethodSummary 
  name: collect
- !ruby/object:RI::MethodSummary 
  name: count
- !ruby/object:RI::MethodSummary 
  name: cycle
- !ruby/object:RI::MethodSummary 
  name: detect
- !ruby/object:RI::MethodSummary 
  name: drop
- !ruby/object:RI::MethodSummary 
  name: drop_while
- !ruby/object:RI::MethodSummary 
  name: each_cons
- !ruby/object:RI::MethodSummary 
  name: each_slice
- !ruby/object:RI::MethodSummary 
  name: each_with_index
- !ruby/object:RI::MethodSummary 
  name: entries
- !ruby/object:RI::MethodSummary 
  name: enum_cons
- !ruby/object:RI::MethodSummary 
  name: enum_slice
- !ruby/object:RI::MethodSummary 
  name: enum_with_index
- !ruby/object:RI::MethodSummary 
  name: find
- !ruby/object:RI::MethodSummary 
  name: find_all
- !ruby/object:RI::MethodSummary 
  name: find_index
- !ruby/object:RI::MethodSummary 
  name: first
- !ruby/object:RI::MethodSummary 
  name: grep
- !ruby/object:RI::MethodSummary 
  name: group_by
- !ruby/object:RI::MethodSummary 
  name: include?
- !ruby/object:RI::MethodSummary 
  name: inject
- !ruby/object:RI::MethodSummary 
  name: inject
- !ruby/object:RI::MethodSummary 
  name: map
- !ruby/object:RI::MethodSummary 
  name: max
- !ruby/object:RI::MethodSummary 
  name: max_by
- !ruby/object:RI::MethodSummary 
  name: member?
- !ruby/object:RI::MethodSummary 
  name: min
- !ruby/object:RI::MethodSummary 
  name: min_by
- !ruby/object:RI::MethodSummary 
  name: minmax
- !ruby/object:RI::MethodSummary 
  name: minmax_by
- !ruby/object:RI::MethodSummary 
  name: none?
- !ruby/object:RI::MethodSummary 
  name: one?
- !ruby/object:RI::MethodSummary 
  name: partition
- !ruby/object:RI::MethodSummary 
  name: reduce
- !ruby/object:RI::MethodSummary 
  name: reject
- !ruby/object:RI::MethodSummary 
  name: reverse_each
- !ruby/object:RI::MethodSummary 
  name: select
- !ruby/object:RI::MethodSummary 
  name: sort
- !ruby/object:RI::MethodSummary 
  name: sort_by
- !ruby/object:RI::MethodSummary 
  name: take
- !ruby/object:RI::MethodSummary 
  name: take_while
- !ruby/object:RI::MethodSummary 
  name: to_a
- !ruby/object:RI::MethodSummary 
  name: to_set
- !ruby/object:RI::MethodSummary 
  name: zip
name: Enumerable
superclass: 
PKd}[�\�F��#ri/1.8/system/Enumerable/min-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the object in <em>enum</em> with the minimum value. The first form assumes all objects implement <tt>Comparable</tt>; the second uses the block to return <em>a &lt;=&gt; b</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = %w(albatross dog horse)\n   a.min                                  #=&gt; &quot;albatross&quot;\n   a.min {|a,b| a.length &lt;=&gt; b.length }   #=&gt; &quot;dog&quot;\n"
full_name: Enumerable#min
is_singleton: false
name: min
params: |
  enum.min                    => obj
  enum.min {| a,b | block }   => obj

visibility: public
PKd}[�o33*ri/1.8/system/Enumerable/each_slice-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates the given block for each slice of &lt;n&gt; elements. If no block is given, returns an enumerator.
- !ruby/struct:SM::Flow::P 
  body: "e.g.:"
- !ruby/struct:SM::Flow::VERB 
  body: "    (1..10).each_slice(3) {|a| p a}\n    # outputs below\n    [1, 2, 3]\n    [4, 5, 6]\n    [7, 8, 9]\n    [10]\n"
full_name: Enumerable#each_slice
is_singleton: false
name: each_slice
params: |
  e.each_slice(n) {...}
  e.each_slice(n)

visibility: public
PKd}[�8�j(ri/1.8/system/Enumerable/find_all-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array containing all elements of <em>enum</em> for which <em>block</em> is not <tt>false</tt> (see also <tt>Enumerable#reject</tt>).
- !ruby/struct:SM::Flow::VERB 
  body: "   (1..10).find_all {|i|  i % 3 == 0 }   #=&gt; [3, 6, 9]\n"
full_name: Enumerable#find_all
is_singleton: false
name: find_all
params: |
  enum.find_all {| obj | block }  => array
  enum.select   {| obj | block }  => array

visibility: public
PKd}[z@����$ri/1.8/system/Enumerable/drop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Drops first n elements from <em>enum</em>, and returns rest elements in an array.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [1, 2, 3, 4, 5, 0]\n   a.drop(3)             # =&gt; [4, 5, 0]\n"
full_name: Enumerable#drop
is_singleton: false
name: drop
params: |
  enum.drop(n)               => array

visibility: public
PKd}[n�����$ri/1.8/system/Enumerable/take-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns first n elements from <em>enum</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [1, 2, 3, 4, 5, 0]\n   a.take(3)             # =&gt; [1, 2, 3]\n"
full_name: Enumerable#take
is_singleton: false
name: take
params: |
  enum.take(n)               => array

visibility: public
PKd}[��t{yy)ri/1.8/system/Enumerable/enum_cons-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates the given block for each array of consecutive &lt;n&gt; elements. If no block is given, returns an enumerator.a
- !ruby/struct:SM::Flow::P 
  body: "e.g.:"
- !ruby/struct:SM::Flow::VERB 
  body: "    (1..10).each_cons(3) {|a| p a}\n    # outputs below\n    [1, 2, 3]\n    [2, 3, 4]\n    [3, 4, 5]\n    [4, 5, 6]\n    [5, 6, 7]\n    [6, 7, 8]\n    [7, 8, 9]\n    [8, 9, 10]\n"
full_name: Enumerable#enum_cons
is_singleton: false
name: enum_cons
params: |
  each_cons(n) {...}
  each_cons(n)

visibility: public
PKd}[y5�MM$ri/1.8/system/Enumerable/grep-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array of every element in <em>enum</em> for which <tt>Pattern === element</tt>. If the optional <em>block</em> is supplied, each matching element is passed to it, and the block's result is stored in the output array.
- !ruby/struct:SM::Flow::VERB 
  body: "   (1..100).grep 38..44   #=&gt; [38, 39, 40, 41, 42, 43, 44]\n   c = IO.constants\n   c.grep(/SEEK/)         #=&gt; [&quot;SEEK_END&quot;, &quot;SEEK_SET&quot;, &quot;SEEK_CUR&quot;]\n   res = c.grep(/SEEK/) {|v| IO.const_get(v) }\n   res                    #=&gt; [2, 0, 1]\n"
full_name: Enumerable#grep
is_singleton: false
name: grep
params: |
  enum.grep(pattern)                   => array
  enum.grep(pattern) {| obj | block }  => array

visibility: public
PKd}[�϶�II*ri/1.8/system/Enumerable/include%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if any member of <em>enum</em> equals <em>obj</em>. Equality is tested using <tt>==</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   IO.constants.include? &quot;SEEK_SET&quot;          #=&gt; true\n   IO.constants.include? &quot;SEEK_NO_FURTHER&quot;   #=&gt; false\n"
full_name: Enumerable#include?
is_singleton: false
name: include?
params: |
  enum.include?(obj)     => true or false
  enum.member?(obj)      => true or false

visibility: public
PKd}[	A�cc/ri/1.8/system/Enumerable/Enumerator/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates the given block using the object and the method specified in the first place. If no block is given, returns self.
full_name: Enumerable::Enumerator#each
is_singleton: false
name: each
params: |
  enum.each {...}

visibility: public
PKd}[{���++9ri/1.8/system/Enumerable/Enumerator/cdesc-Enumerator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A class which provides a method `each' to be used as an Enumerable object.
constants: []

full_name: Enumerable::Enumerator
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: __generator
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: each_with_index
- !ruby/object:RI::MethodSummary 
  name: next
- !ruby/object:RI::MethodSummary 
  name: next
- !ruby/object:RI::MethodSummary 
  name: rewind
- !ruby/object:RI::MethodSummary 
  name: rewind
- !ruby/object:RI::MethodSummary 
  name: with_index
name: Enumerator
superclass: Object
PKd}[f2��/ri/1.8/system/Enumerable/Enumerator/next-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the next object in the enumerator, and move the internal position forward. When the position reached at the end, internal position is rewinded then StopIteration is raised.
- !ruby/struct:SM::Flow::P 
  body: Note that enumeration sequence by next method does not affect other non-external enumeration methods, unless underlying iteration methods itself has side-effect, e.g. IO#each_line.
- !ruby/struct:SM::Flow::P 
  body: "Caution: Calling this method causes the &quot;generator&quot; library to be loaded."
full_name: Enumerable::Enumerator#next
is_singleton: false
name: next
params: |
  e.next   => object

visibility: public
PKd}[3�X��5ri/1.8/system/Enumerable/Enumerator/with_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates the given block for each elements with an index, which start from 0. If no block is given, returns an enumerator.
full_name: Enumerable::Enumerator#with_index
is_singleton: false
name: with_index
params: |
  e.with_index {|(*args), idx| ... }
  e.with_index

visibility: public
PKd}[�bzc!!1ri/1.8/system/Enumerable/Enumerator/rewind-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Rewinds the enumeration sequence by the next method.
full_name: Enumerable::Enumerator#rewind
is_singleton: false
name: rewind
params: |
  e.rewind   => e

visibility: public
PKd}[q>#���6ri/1.8/system/Enumerable/Enumerator/__generator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Enumerable::Enumerator#__generator
is_singleton: false
name: __generator
params: ()
visibility: private
PKd}[A��.ri/1.8/system/Enumerable/Enumerator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new Enumerable::Enumerator object, which is to be used as an Enumerable object using the given object's given method with the given arguments.
- !ruby/struct:SM::Flow::P 
  body: Use of this method is discouraged. Use Kernel#enum_for() instead.
full_name: Enumerable::Enumerator::new
is_singleton: true
name: new
params: |
  Enumerable::Enumerator.new(obj, method = :each, *args)

visibility: public
PKd}[�Pӛ�:ri/1.8/system/Enumerable/Enumerator/each_with_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates the given block for each elements with an index, which start from 0. If no block is given, returns an enumerator.
full_name: Enumerable::Enumerator#each_with_index
is_singleton: false
name: each_with_index
params: |
  e.with_index {|(*args), idx| ... }
  e.with_index

visibility: public
PKe}[�9��)ri/1.8/system/Enumerable/partition-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns two arrays, the first containing the elements of <em>enum</em> for which the block evaluates to true, the second containing the rest.
- !ruby/struct:SM::Flow::VERB 
  body: "   (1..6).partition {|i| (i&amp;1).zero?}   #=&gt; [[2, 4, 6], [1, 3, 5]]\n"
full_name: Enumerable#partition
is_singleton: false
name: partition
params: |
  enum.partition {| obj | block }  => [ true_array, false_array ]

visibility: public
PKe}[����		#ri/1.8/system/Enumerable/zip-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts any arguments to arrays, then merges elements of <em>enum</em> with corresponding elements from each argument. This generates a sequence of <tt>enum#size</tt> <em>n</em>-element arrays, where <em>n</em> is one more that the count of arguments. If the size of any argument is less than <tt>enum#size</tt>, <tt>nil</tt> values are supplied. If a block given, it is invoked for each output array, otherwise an array of arrays is returned.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = [ 4, 5, 6 ]\n   b = [ 7, 8, 9 ]\n\n   (1..3).zip(a, b)      #=&gt; [[1, 4, 7], [2, 5, 8], [3, 6, 9]]\n   &quot;cat\\ndog&quot;.zip([1])   #=&gt; [[&quot;cat\\n&quot;, 1], [&quot;dog&quot;, nil]]\n   (1..3).zip            #=&gt; [[1], [2], [3]]\n"
full_name: Enumerable#zip
is_singleton: false
name: zip
params: |
  enum.zip(arg, ...)                   => array
  enum.zip(arg, ...) {|arr| block }    => nil

visibility: public
PKe}[�ِu��&ri/1.8/system/Enumerable/reject-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array for all elements of <em>enum</em> for which <em>block</em> is false (see also <tt>Enumerable#find_all</tt>).
- !ruby/struct:SM::Flow::VERB 
  body: "   (1..10).reject {|i|  i % 3 == 0 }   #=&gt; [1, 2, 4, 5, 7, 8, 10]\n"
full_name: Enumerable#reject
is_singleton: false
name: reject
params: |
  enum.reject {| obj | block }  => array

visibility: public
PKe}[���aa/ri/1.8/system/Enumerable/each_with_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls <em>block</em> with two arguments, the item and its index, for each item in <em>enum</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   hash = Hash.new\n   %w(cat dog wombat).each_with_index {|item, index|\n     hash[item] = index\n   }\n   hash   #=&gt; {&quot;cat&quot;=&gt;0, &quot;wombat&quot;=&gt;2, &quot;dog&quot;=&gt;1}\n"
full_name: Enumerable#each_with_index
is_singleton: false
name: each_with_index
params: |
  enum.each_with_index {|obj, i| block }  -> enum

visibility: public
PKe}[7�u]*ri/1.8/system/Enumerable/find_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compares each entry in <em>enum</em> with <em>value</em> or passes to <em>block</em>. Returns the index for the first for which the evaluated value is non-false. If no object matches, returns <tt>nil</tt>
- !ruby/struct:SM::Flow::VERB 
  body: "   (1..10).find_index  {|i| i % 5 == 0 and i % 7 == 0 }   #=&gt; nil\n   (1..100).find_index {|i| i % 5 == 0 and i % 7 == 0 }   #=&gt; 34\n   (1..100).find_index(50)                                #=&gt; 49\n"
full_name: Enumerable#find_index
is_singleton: false
name: find_index
params: |
  enum.find_index(value)            => int or nil
  enum.find_index {| obj | block }  => int or nil

visibility: public
PKe}[�)XX33*ri/1.8/system/Enumerable/enum_slice-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates the given block for each slice of &lt;n&gt; elements. If no block is given, returns an enumerator.
- !ruby/struct:SM::Flow::P 
  body: "e.g.:"
- !ruby/struct:SM::Flow::VERB 
  body: "    (1..10).each_slice(3) {|a| p a}\n    # outputs below\n    [1, 2, 3]\n    [4, 5, 6]\n    [7, 8, 9]\n    [10]\n"
full_name: Enumerable#enum_slice
is_singleton: false
name: enum_slice
params: |
  e.each_slice(n) {...}
  e.each_slice(n)

visibility: public
PKe}[)�5��%ri/1.8/system/Enumerable/first-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the first element, or the first <tt>n</tt> elements, of the enumerable. If the enumerable is empty, the first form returns <tt>nil</tt>, and the second form returns an empty array.
full_name: Enumerable#first
is_singleton: false
name: first
params: |
  enum.first      -> obj or nil
  enum.first(n)   -> an_array

visibility: public
PKe}[�(H(ri/1.8/system/Enumerable/group_by-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a hash, which keys are evaluated result from the block, and values are arrays of elements in <em>enum</em> corresponding to the key.
- !ruby/struct:SM::Flow::VERB 
  body: "   (1..6).group_by {|i| i%3}   #=&gt; {0=&gt;[3, 6], 1=&gt;[1, 4], 2=&gt;[2, 5]}\n"
full_name: Enumerable#group_by
is_singleton: false
name: group_by
params: |
  enum.group_by {| obj | block }  => a_hash

visibility: public
PKe}[ާ�}}&ri/1.8/system/Enumerable/one%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes each element of the collection to the given block. The method returns <tt>true</tt> if the block returns <tt>true</tt> exactly once. If the block is not given, <tt>one?</tt> will return <tt>true</tt> only if exactly one of the collection members is true.
- !ruby/struct:SM::Flow::VERB 
  body: "   %w{ant bear cat}.one? {|word| word.length == 4}   #=&gt; true\n   %w{ant bear cat}.one? {|word| word.length &gt; 4}    #=&gt; false\n   %w{ant bear cat}.one? {|word| word.length &lt; 4}    #=&gt; false\n   [ nil, true, 99 ].one?                            #=&gt; false\n   [ nil, true, false ].one?                         #=&gt; true\n"
full_name: Enumerable#one?
is_singleton: false
name: one?
params: |
  enum.one? [{|obj| block }]   => true or false

visibility: public
PKf}[�z��&ri/1.8/system/Enumerable/min_by-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the object in <em>enum</em> that gives the minimum value from the given block.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = %w(albatross dog horse)\n   a.min_by {|x| x.length }   #=&gt; &quot;dog&quot;\n"
full_name: Enumerable#min_by
is_singleton: false
name: min_by
params: |
  enum.min_by {| obj| block }   => obj

visibility: public
PKf}[�Jt���&ri/1.8/system/Enumerable/max_by-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the object in <em>enum</em> that gives the maximum value from the given block.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = %w(albatross dog horse)\n   a.max_by {|x| x.length }   #=&gt; &quot;albatross&quot;\n"
full_name: Enumerable#max_by
is_singleton: false
name: max_by
params: |
  enum.max_by {| obj| block }   => obj

visibility: public
PKf}[!�S<'ri/1.8/system/Enumerable/none%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes each element of the collection to the given block. The method returns <tt>true</tt> if the block never returns <tt>true</tt> for all elements. If the block is not given, <tt>none?</tt> will return <tt>true</tt> only if none of the collection members is true.
- !ruby/struct:SM::Flow::VERB 
  body: "   %w{ant bear cat}.none? {|word| word.length == 5}  #=&gt; true\n   %w{ant bear cat}.none? {|word| word.length &gt;= 4}  #=&gt; false\n   [].none?                                          #=&gt; true\n   [nil].none?                                       #=&gt; true\n   [nil,false].none?                                 #=&gt; true\n"
full_name: Enumerable#none?
is_singleton: false
name: none?
params: |
  enum.none? [{|obj| block }]   => true or false

visibility: public
PKf}[G8��YY#ri/1.8/system/Enumerable/map-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new array with the results of running <em>block</em> once for every element in <em>enum</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   (1..4).collect {|i| i*i }   #=&gt; [1, 4, 9, 16]\n   (1..4).collect { &quot;cat&quot;  }   #=&gt; [&quot;cat&quot;, &quot;cat&quot;, &quot;cat&quot;, &quot;cat&quot;]\n"
full_name: Enumerable#map
is_singleton: false
name: map
params: |
  enum.collect {| obj | block }  => array
  enum.map     {| obj | block }  => array

visibility: public
PKf}[i�rXX&ri/1.8/system/Enumerable/all%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes each element of the collection to the given block. The method returns <tt>true</tt> if the block never returns <tt>false</tt> or <tt>nil</tt>. If the block is not given, Ruby adds an implicit block of <tt>{|obj| obj}</tt> (that is <tt>all?</tt> will return <tt>true</tt> only if none of the collection members are <tt>false</tt> or <tt>nil</tt>.)
- !ruby/struct:SM::Flow::VERB 
  body: "   %w{ ant bear cat}.all? {|word| word.length &gt;= 3}   #=&gt; true\n   %w{ ant bear cat}.all? {|word| word.length &gt;= 4}   #=&gt; false\n   [ nil, true, 99 ].all?                             #=&gt; false\n"
full_name: Enumerable#all?
is_singleton: false
name: all?
params: |
  enum.all? [{|obj| block } ]   => true or false

visibility: public
PKf}[�*�\\&ri/1.8/system/Enumerable/to_set-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Makes a set from the enumerable object with given arguments. Needs to +require &quot;set&quot;+ to use this method.
full_name: Enumerable#to_set
is_singleton: false
name: to_set
params: (klass = Set, *args, &block)
visibility: public
PKf}[:^�55&ri/1.8/system/Enumerable/reduce-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::VERB 
  body: "   enum.reduce(initial, sym) =&gt; obj\n   enum.reduce(sym)          =&gt; obj\n   enum.reduce(initial) {| memo, obj | block }  =&gt; obj\n   enum.reduce          {| memo, obj | block }  =&gt; obj\n"
- !ruby/struct:SM::Flow::P 
  body: Combines all elements of <em>enum</em> by applying a binary operation, specified by a block or a symbol that names a method or operator.
- !ruby/struct:SM::Flow::P 
  body: If you specify a block, then for each element in <em>enum&lt;i&gt; the block is passed an accumulator value (&lt;i&gt;memo</em>) and the element. If you specify a symbol instead, then each element in the collection will be passed to the named method of <em>memo</em>. In either case, the result becomes the new value for <em>memo</em>. At the end of the iteration, the final value of <em>memo</em> is the return value fo the method.
- !ruby/struct:SM::Flow::P 
  body: If you do not explicitly specify an <em>initial</em> value for <em>memo</em>, then uses the first element of collection is used as the initial value of <em>memo</em>.
- !ruby/struct:SM::Flow::P 
  body: "Examples:"
- !ruby/struct:SM::Flow::VERB 
  body: "   # Sum some numbers\n   (5..10).reduce(:+)                            #=&gt; 45\n   # Same using a block and inject\n   (5..10).inject {|sum, n| sum + n }            #=&gt; 45\n   # Multiply some numbers\n   (5..10).reduce(1, :*)                         #=&gt; 151200\n   # Same using a block\n   (5..10).inject(1) {|product, n| product * n } #=&gt; 151200\n   # find the longest word\n   longest = %w{ cat sheep bear }.inject do |memo,word|\n      memo.length &gt; word.length ? memo : word\n   end\n   longest                                       #=&gt; &quot;sheep&quot;\n"
full_name: Enumerable#reduce
is_singleton: false
name: reduce
params: |
  enum.inject(initial, sym) => obj
  enum.inject(sym)          => obj
  enum.inject(initial) {| memo, obj | block }  => obj
  enum.inject          {| memo, obj | block }  => obj

visibility: public
PKf}[�e5p��$ri/1.8/system/Enumerable/sort-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array containing the items in <em>enum</em> sorted, either according to their own <tt>&lt;=&gt;</tt> method, or by using the results of the supplied block. The block should return -1, 0, or +1 depending on the comparison between <em>a</em> and <em>b</em>. As of Ruby 1.8, the method <tt>Enumerable#sort_by</tt> implements a built-in Schwartzian Transform, useful when key computation or comparison is expensive..
- !ruby/struct:SM::Flow::VERB 
  body: "   %w(rhea kea flea).sort         #=&gt; [&quot;flea&quot;, &quot;kea&quot;, &quot;rhea&quot;]\n   (1..10).sort {|a,b| b &lt;=&gt; a}   #=&gt; [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]\n"
full_name: Enumerable#sort
is_singleton: false
name: sort
params: |
  enum.sort                     => array
  enum.sort {| a, b | block }   => array

visibility: public
PKf}[!	�1��&ri/1.8/system/Enumerable/inject-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (result, item)
comment: 
full_name: Enumerable#inject
is_singleton: false
name: inject
params: (init) {|result, item| ...}
visibility: public
PKf}[/�n77)ri/1.8/system/Enumerable/minmax_by-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns two elements array array containing the objects in <em>enum</em> that gives the minimum and maximum values respectively from the given block.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = %w(albatross dog horse)\n   a.minmax_by {|x| x.length }   #=&gt; [&quot;dog&quot;, &quot;albatross&quot;]\n"
full_name: Enumerable#minmax_by
is_singleton: false
name: minmax_by
params: |
  enum.minmax_by {| obj| block }   => [min, max]

visibility: public
PKf}[5�'#//%ri/1.8/system/Enumerable/count-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns the number of items in <em>enum</em>, where #size is called if it responds to it, otherwise the items are counted through enumeration. If an argument is given, counts the number of items in <em>enum</em>, for which equals to <em>item</em>. If a block is given, counts the number of elements yielding a true value."
- !ruby/struct:SM::Flow::VERB 
  body: "   ary = [1, 2, 4, 2]\n   ary.count             # =&gt; 4\n   ary.count(2)          # =&gt; 2\n   ary.count{|x|x%2==0}  # =&gt; 3\n"
full_name: Enumerable#count
is_singleton: false
name: count
params: |
  enum.count                   => int
  enum.count(item)             => int
  enum.count {| obj | block }  => int

visibility: public
PKf}[uAaa/ri/1.8/system/Enumerable/enum_with_index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls <em>block</em> with two arguments, the item and its index, for each item in <em>enum</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   hash = Hash.new\n   %w(cat dog wombat).each_with_index {|item, index|\n     hash[item] = index\n   }\n   hash   #=&gt; {&quot;cat&quot;=&gt;0, &quot;wombat&quot;=&gt;2, &quot;dog&quot;=&gt;1}\n"
full_name: Enumerable#enum_with_index
is_singleton: false
name: enum_with_index
params: |
  enum.each_with_index {|obj, i| block }  -> enum

visibility: public
PKf}[�*>n��'ri/1.8/system/Enumerable/sort_by-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sorts <em>enum</em> using a set of keys generated by mapping the values in <em>enum</em> through the given block.
- !ruby/struct:SM::Flow::VERB 
  body: "   %w{ apple pear fig }.sort_by {|word| word.length}\n                #=&gt; [&quot;fig&quot;, &quot;pear&quot;, &quot;apple&quot;]\n"
- !ruby/struct:SM::Flow::P 
  body: The current implementation of <tt>sort_by</tt> generates an array of tuples containing the original collection element and the mapped value. This makes <tt>sort_by</tt> fairly expensive when the keysets are simple
- !ruby/struct:SM::Flow::VERB 
  body: "   require 'benchmark'\n   include Benchmark\n\n   a = (1..100000).map {rand(100000)}\n\n   bm(10) do |b|\n     b.report(&quot;Sort&quot;)    { a.sort }\n     b.report(&quot;Sort by&quot;) { a.sort_by {|a| a} }\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   user     system      total        real\n   Sort        0.180000   0.000000   0.180000 (  0.175469)\n   Sort by     1.980000   0.040000   2.020000 (  2.013586)\n"
- !ruby/struct:SM::Flow::P 
  body: However, consider the case where comparing the keys is a non-trivial operation. The following code sorts some files on modification time using the basic <tt>sort</tt> method.
- !ruby/struct:SM::Flow::VERB 
  body: "   files = Dir[&quot;*&quot;]\n   sorted = files.sort {|a,b| File.new(a).mtime &lt;=&gt; File.new(b).mtime}\n   sorted   #=&gt; [&quot;mon&quot;, &quot;tues&quot;, &quot;wed&quot;, &quot;thurs&quot;]\n"
- !ruby/struct:SM::Flow::P 
  body: "This sort is inefficient: it generates two new <tt>File</tt> objects during every comparison. A slightly better technique is to use the <tt>Kernel#test</tt> method to generate the modification times directly."
- !ruby/struct:SM::Flow::VERB 
  body: "   files = Dir[&quot;*&quot;]\n   sorted = files.sort { |a,b|\n     test(?M, a) &lt;=&gt; test(?M, b)\n   }\n   sorted   #=&gt; [&quot;mon&quot;, &quot;tues&quot;, &quot;wed&quot;, &quot;thurs&quot;]\n"
- !ruby/struct:SM::Flow::P 
  body: This still generates many unnecessary <tt>Time</tt> objects. A more efficient technique is to cache the sort keys (modification times in this case) before the sort. Perl users often call this approach a Schwartzian Transform, after Randal Schwartz. We construct a temporary array, where each element is an array containing our sort key along with the filename. We sort this array, and then extract the filename from the result.
- !ruby/struct:SM::Flow::VERB 
  body: "   sorted = Dir[&quot;*&quot;].collect { |f|\n      [test(?M, f), f]\n   }.sort.collect { |f| f[1] }\n   sorted   #=&gt; [&quot;mon&quot;, &quot;tues&quot;, &quot;wed&quot;, &quot;thurs&quot;]\n"
- !ruby/struct:SM::Flow::P 
  body: This is exactly what <tt>sort_by</tt> does internally.
- !ruby/struct:SM::Flow::VERB 
  body: "   sorted = Dir[&quot;*&quot;].sort_by {|f| test(?M, f)}\n   sorted   #=&gt; [&quot;mon&quot;, &quot;tues&quot;, &quot;wed&quot;, &quot;thurs&quot;]\n"
full_name: Enumerable#sort_by
is_singleton: false
name: sort_by
params: |
  enum.sort_by {| obj | block }    => array

visibility: public
PKf}[=^b)),ri/1.8/system/Enumerable/reverse_each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Traverses <em>enum</em> in reverse order.
full_name: Enumerable#reverse_each
is_singleton: false
name: reverse_each
params: |
  enum.reverse_each {|item| block } 

visibility: public
PKf}[��:ri/1.8/system/SystemStackError/cdesc-SystemStackError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>Proc</tt> objects are blocks of code that have been bound to a set of local variables. Once bound, the code may be called in different contexts and still access those variables.
- !ruby/struct:SM::Flow::VERB 
  body: "   def gen_times(factor)\n     return Proc.new {|n| n*factor }\n   end\n\n   times3 = gen_times(3)\n   times5 = gen_times(5)\n\n   times3.call(12)               #=&gt; 36\n   times5.call(5)                #=&gt; 25\n   times3.call(times5.call(4))   #=&gt; 60\n"
constants: []

full_name: SystemStackError
includes: []

instance_methods: []

name: SystemStackError
superclass: StandardError
PKf}[��_l��4ri/1.8/system/StandardError/cdesc-StandardError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: StandardError
includes: []

instance_methods: []

name: StandardError
superclass: Exception
PKf}[�sҔ��8ri/1.8/system/SignalException/cdesc-SignalException.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: SignalException
includes: []

instance_methods: []

name: SignalException
superclass: Exception
PKf}[�}ri/1.8/system/NKF/guess1-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns guessed encoding of <em>str</em> as integer.
- !ruby/struct:SM::Flow::P 
  body: "Algorithm described in: Ken Lunde. `Understanding Japanese Information Processing' Sebastopol, CA: O'Reilly &amp; Associates."
- !ruby/struct:SM::Flow::VERB 
  body: "    case NKF.guess1(input)\n    when NKF::JIS\n      &quot;ISO-2022-JP&quot;\n    when NKF::SJIS\n      &quot;Shift_JIS&quot;\n    when NKF::EUC\n      &quot;EUC-JP&quot;\n    when NKF::UNKNOWN\n      &quot;UNKNOWN(ASCII)&quot;\n    when NKF::BINARY\n      &quot;BINARY&quot;\n    end\n"
full_name: NKF::guess1
is_singleton: true
name: guess1
params: |
  NKF.guess1(str)  -> integer

visibility: public
PKf}[�T�_��ri/1.8/system/NKF/guess2-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns guessed encoding of <em>str</em> as integer by nkf routine.
- !ruby/struct:SM::Flow::VERB 
  body: "   case NKF.guess(input)\n   when NKF::ASCII\n     &quot;ASCII&quot;\n   when NKF::JIS\n     &quot;ISO-2022-JP&quot;\n   when NKF::SJIS\n     &quot;Shift_JIS&quot;\n   when NKF::EUC\n     &quot;EUC-JP&quot;\n   when NKF::UTF8\n     &quot;UTF-8&quot;\n   when NKF::UTF16\n     &quot;UTF-16&quot;\n   when NKF::UNKNOWN\n     &quot;UNKNOWN&quot;\n   when NKF::BINARY\n     &quot;BINARY&quot;\n   end\n"
full_name: NKF::guess2
is_singleton: true
name: guess2
params: |
  NKF.guess2(str)  -> integer

visibility: public
PKf}[���Xo3o3 ri/1.8/system/NKF/cdesc-NKF.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: guess1
- !ruby/object:RI::MethodSummary 
  name: guess2
- !ruby/object:RI::MethodSummary 
  name: nkf
comment: 
- !ruby/struct:SM::Flow::P 
  body: NKF - Ruby extension for Network Kanji Filter
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Description
- !ruby/struct:SM::Flow::P 
  body: This is a Ruby Extension version of nkf (Netowrk Kanji Filter). It converts the first argument and return converted result. Conversion details are specified by flags as the first argument.
- !ruby/struct:SM::Flow::P 
  body: <b>Nkf</b> is a yet another kanji code converter among networks, hosts and terminals. It converts input kanji code to designated kanji code such as ISO-2022-JP, Shift_JIS, EUC-JP, UTF-8 or UTF-16.
- !ruby/struct:SM::Flow::P 
  body: One of the most unique faculty of <b>nkf</b> is the guess of the input kanji encodings. It currently recognizes ISO-2022-JP, Shift_JIS, EUC-JP, UTF-8 and UTF-16. So users needn't set the input kanji code explicitly.
- !ruby/struct:SM::Flow::P 
  body: By default, X0201 kana is converted into X0208 kana. For X0201 kana, SO/SI, SSO and ESC-(-I methods are supported. For automatic code detection, nkf assumes no X0201 kana in Shift_JIS. To accept X0201 in Shift_JIS, use <b>-X</b>, <b>-x</b> or <b>-S</b>.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Flags
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -b -u
- !ruby/struct:SM::Flow::P 
  body: Output is buffered (DEFAULT), Output is unbuffered.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -j -s -e -w -w16
- !ruby/struct:SM::Flow::P 
  body: Output code is ISO-2022-JP (7bit JIS), Shift_JIS, EUC-JP, UTF-8N, UTF-16BE. Without this option and compile option, ISO-2022-JP is assumed.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -J -S -E -W -W16
- !ruby/struct:SM::Flow::P 
  body: Input assumption is JIS 7 bit, Shift_JIS, EUC-JP, UTF-8, UTF-16LE.
- !ruby/struct:SM::Flow::H 
  level: 4
  text: -J
- !ruby/struct:SM::Flow::P 
  body: Assume JIS input. It also accepts EUC-JP. This is the default. This flag does not exclude Shift_JIS.
- !ruby/struct:SM::Flow::H 
  level: 4
  text: -S
- !ruby/struct:SM::Flow::P 
  body: Assume Shift_JIS and X0201 kana input. It also accepts JIS. EUC-JP is recognized as X0201 kana. Without <b>-x</b> flag, X0201 kana (halfwidth kana) is converted into X0208.
- !ruby/struct:SM::Flow::H 
  level: 4
  text: -E
- !ruby/struct:SM::Flow::P 
  body: Assume EUC-JP input. It also accepts JIS. Same as -J.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -t
- !ruby/struct:SM::Flow::P 
  body: No conversion.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -i_
- !ruby/struct:SM::Flow::P 
  body: Output sequence to designate JIS-kanji. (DEFAULT B)
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -o_
- !ruby/struct:SM::Flow::P 
  body: Output sequence to designate ASCII. (DEFAULT B)
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -r
- !ruby/struct:SM::Flow::P 
  body: "{de/en}crypt ROT13/47"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -h[123] --hiragana --katakana --katakana-hiragana
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: -h1 --hiragana
    body: Katakana to Hiragana conversion.
  - !ruby/struct:SM::Flow::LI 
    label: -h2 --katakana
    body: Hiragana to Katakana conversion.
  - !ruby/struct:SM::Flow::LI 
    label: -h3 --katakana-hiragana
    body: Katakana to Hiragana and Hiragana to Katakana conversion.
  type: :LABELED
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -T
- !ruby/struct:SM::Flow::P 
  body: Text mode output (MS-DOS)
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -l
- !ruby/struct:SM::Flow::P 
  body: ISO8859-1 (Latin-1) support
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -f[<tt>m</tt> [- <tt>n</tt>]]
- !ruby/struct:SM::Flow::P 
  body: Folding on <tt>m</tt> length with <tt>n</tt> margin in a line. Without this option, fold length is 60 and fold margin is 10.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -F
- !ruby/struct:SM::Flow::P 
  body: New line preserving line folding.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -Z[0-3]
- !ruby/struct:SM::Flow::P 
  body: Convert X0208 alphabet (Fullwidth Alphabets) to ASCII.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: -Z -Z0
    body: Convert X0208 alphabet to ASCII.
  - !ruby/struct:SM::Flow::LI 
    label: -Z1
    body: Converts X0208 kankaku to single ASCII space.
  - !ruby/struct:SM::Flow::LI 
    label: -Z2
    body: Converts X0208 kankaku to double ASCII spaces.
  - !ruby/struct:SM::Flow::LI 
    label: -Z3
    body: Replacing Fullwidth &gt;, &lt;, &quot;, &amp; into '&amp;gt;', '&amp;lt;', '&amp;quot;', '&amp;amp;' as in HTML.
  type: :LABELED
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -X -x
- !ruby/struct:SM::Flow::P 
  body: Assume X0201 kana in MS-Kanji. With <b>-X</b> or without this option, X0201 is converted into X0208 Kana. With <b>-x</b>, try to preserve X0208 kana and do not convert X0201 kana to X0208. In JIS output, ESC-(-I is used. In EUC output, SSO is used.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -B[0-2]
- !ruby/struct:SM::Flow::P 
  body: Assume broken JIS-Kanji input, which lost ESC. Useful when your site is using old B-News Nihongo patch.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: -B1
    body: allows any char after ESC-( or ESC-$.
  - !ruby/struct:SM::Flow::LI 
    label: -B2
    body: forces ASCII after NL.
  type: :LABELED
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -I
- !ruby/struct:SM::Flow::P 
  body: Replacing non iso-2022-jp char into a geta character (substitute character in Japanese).
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -d -c
- !ruby/struct:SM::Flow::P 
  body: Delete \r in line feed, Add \r in line feed.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -m[BQN0]
- !ruby/struct:SM::Flow::P 
  body: MIME ISO-2022-JP/ISO8859-1 decode. (DEFAULT) To see ISO8859-1 (Latin-1) -l is necessary.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: -mB
    body: Decode MIME base64 encoded stream. Remove header or other part before
  type: :LABELED
- !ruby/struct:SM::Flow::P 
  body: conversion.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: -mQ
    body: Decode MIME quoted stream. '_' in quoted stream is converted to space.
  - !ruby/struct:SM::Flow::LI 
    label: -mN
    body: Non-strict decoding.
  type: :LABELED
- !ruby/struct:SM::Flow::P 
  body: It allows line break in the middle of the base64 encoding.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: -m0
    body: No MIME decode.
  type: :LABELED
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -M
- !ruby/struct:SM::Flow::P 
  body: MIME encode. Header style. All ASCII code and control characters are intact. Kanji conversion is performed before encoding, so this cannot be used as a picture encoder.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: -MB
    body: MIME encode Base64 stream.
  - !ruby/struct:SM::Flow::LI 
    label: -MQ
    body: Perfome quoted encoding.
  type: :LABELED
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -l
- !ruby/struct:SM::Flow::P 
  body: Input and output code is ISO8859-1 (Latin-1) and ISO-2022-JP. <b>-s</b>, <b>-e</b> and <b>-x</b> are not compatible with this option.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: -L[uwm]
- !ruby/struct:SM::Flow::P 
  body: new line mode Without this option, nkf doesn't convert line breaks.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: -Lu
    body: unix (LF)
  - !ruby/struct:SM::Flow::LI 
    label: -Lw
    body: windows (CRLF)
  - !ruby/struct:SM::Flow::LI 
    label: -Lm
    body: mac (CR)
  type: :LABELED
- !ruby/struct:SM::Flow::H 
  level: 3
  text: --fj --unix --mac --msdos --windows
- !ruby/struct:SM::Flow::P 
  body: convert for these system
- !ruby/struct:SM::Flow::H 
  level: 3
  text: --jis --euc --sjis --mime --base64
- !ruby/struct:SM::Flow::P 
  body: convert for named code
- !ruby/struct:SM::Flow::H 
  level: 3
  text: --jis-input --euc-input --sjis-input --mime-input --base64-input
- !ruby/struct:SM::Flow::P 
  body: assume input system
- !ruby/struct:SM::Flow::H 
  level: 3
  text: --ic=<tt>input codeset</tt> --oc=<tt>output codeset</tt>
- !ruby/struct:SM::Flow::P 
  body: Set the input or output codeset. NKF supports following codesets and those codeset name are case insensitive.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: ISO-2022-JP
    body: a.k.a. RFC1468, 7bit JIS, JUNET
  - !ruby/struct:SM::Flow::LI 
    label: EUC-JP (eucJP-nkf)
    body: a.k.a. AT&amp;T JIS, Japanese EUC, UJIS
  - !ruby/struct:SM::Flow::LI 
    label: eucJP-ascii
    body: a.k.a. x-eucjp-open-19970715-ascii
  - !ruby/struct:SM::Flow::LI 
    label: eucJP-ms
    body: a.k.a. x-eucjp-open-19970715-ms
  - !ruby/struct:SM::Flow::LI 
    label: CP51932
    body: Microsoft Version of EUC-JP.
  - !ruby/struct:SM::Flow::LI 
    label: Shift_JIS
    body: SJIS, MS-Kanji
  - !ruby/struct:SM::Flow::LI 
    label: CP932
    body: a.k.a. Windows-31J
  - !ruby/struct:SM::Flow::LI 
    label: UTF-8
    body: same as UTF-8N
  - !ruby/struct:SM::Flow::LI 
    label: UTF-8N
    body: UTF-8 without BOM
  - !ruby/struct:SM::Flow::LI 
    label: UTF-8-BOM
    body: UTF-8 with BOM
  - !ruby/struct:SM::Flow::LI 
    label: UTF-16
    body: same as UTF-16BE
  - !ruby/struct:SM::Flow::LI 
    label: UTF-16BE
    body: UTF-16 Big Endian without BOM
  - !ruby/struct:SM::Flow::LI 
    label: UTF-16BE-BOM
    body: UTF-16 Big Endian with BOM
  - !ruby/struct:SM::Flow::LI 
    label: UTF-16LE
    body: UTF-16 Little Endian without BOM
  - !ruby/struct:SM::Flow::LI 
    label: UTF-16LE-BOM
    body: UTF-16 Little Endian with BOM
  - !ruby/struct:SM::Flow::LI 
    label: UTF8-MAC
    body: NKDed UTF-8, a.k.a. UTF8-NFD (input only)
  type: :LABELED
- !ruby/struct:SM::Flow::H 
  level: 3
  text: --fb-{skip, html, xml, perl, java, subchar}
- !ruby/struct:SM::Flow::P 
  body: Specify the way that nkf handles unassigned characters. Without this option, --fb-skip is assumed.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: --prefix= <tt>escape character</tt> <tt>target character</tt> ..
- !ruby/struct:SM::Flow::P 
  body: When nkf converts to Shift_JIS, nkf adds a specified escape character to specified 2nd byte of Shift_JIS characters. 1st byte of argument is the escape character and following bytes are target characters.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: --disable-cp932ext
- !ruby/struct:SM::Flow::P 
  body: Handle the characters extended in CP932 as unassigned characters.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: --cap-input
- !ruby/struct:SM::Flow::P 
  body: Decode hex encoded characters.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: --url-input
- !ruby/struct:SM::Flow::P 
  body: Unescape percent escaped characters.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: --
- !ruby/struct:SM::Flow::P 
  body: Ignore rest of -option.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Auto-Detect
  name: AUTO
  value: INT2FIX(_AUTO)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: ISO-2022-JP
  name: JIS
  value: INT2FIX(_JIS)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: EUC-JP
  name: EUC
  value: INT2FIX(_EUC)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Shift_JIS
  name: SJIS
  value: INT2FIX(_SJIS)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: BINARY
  name: BINARY
  value: INT2FIX(_BINARY)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: No conversion
  name: NOCONV
  value: INT2FIX(_NOCONV)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: ASCII
  name: ASCII
  value: INT2FIX(_ASCII)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: UTF-8
  name: UTF8
  value: INT2FIX(_UTF8)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: UTF-16
  name: UTF16
  value: INT2FIX(_UTF16)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: UTF-32
  name: UTF32
  value: INT2FIX(_UTF32)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: UNKNOWN
  name: UNKNOWN
  value: INT2FIX(_UNKNOWN)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Full version string of nkf
  name: VERSION
  value: rb_str_new2(RUBY_NKF_VERSION)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Version of nkf
  name: NKF_VERSION
  value: rb_str_new2(NKF_VERSION)
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Release date of nkf
  name: NKF_RELEASE_DATE
  value: rb_str_new2(NKF_RELEASE_DATE)
full_name: NKF
includes: []

instance_methods: []

name: NKF
superclass: 
PKf}[��5WWri/1.8/system/NKF/nkf-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert <em>str</em> and return converted result. Conversion details are specified by <em>opt</em> as String.
- !ruby/struct:SM::Flow::VERB 
  body: "   require 'nkf'\n   output = NKF.nkf(&quot;-s&quot;, input)\n"
- !ruby/struct:SM::Flow::P 
  body: <b>Note</b> By default, nkf decodes MIME encoded string. If you want not to decode input, use NKF.nkf with <b>-m0</b> flag.
full_name: NKF::nkf
is_singleton: true
name: nkf
params: |
  NKF.nkf(opt, str)   -> string

visibility: public
PKf}[�J��(ri/1.8/system/Marshal/cdesc-Marshal.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: dump
- !ruby/object:RI::MethodSummary 
  name: load
- !ruby/object:RI::MethodSummary 
  name: restore
comment: 
- !ruby/struct:SM::Flow::P 
  body: The marshaling library converts collections of Ruby objects into a byte stream, allowing them to be stored outside the currently active script. This data may subsequently be read and the original objects reconstituted. Marshaled data has major and minor version numbers stored along with the object information. In normal use, marshaling can only load data written with the same major version number and an equal or lower minor version number. If Ruby's ``verbose'' flag is set (normally using -d, -v, -w, or --verbose) the major and minor numbers must match exactly. Marshal versioning is independent of Ruby's version numbers. You can extract the version by reading the first two bytes of marshaled data.
- !ruby/struct:SM::Flow::VERB 
  body: "    str = Marshal.dump(&quot;thing&quot;)\n    RUBY_VERSION   #=&gt; &quot;1.8.0&quot;\n    str[0]         #=&gt; 4\n    str[1]         #=&gt; 8\n"
- !ruby/struct:SM::Flow::P 
  body: "Some objects cannot be dumped: if the objects to be dumped include bindings, procedure or method objects, instances of class IO, or singleton objects, a TypeError will be raised. If your class has special serialization needs (for example, if you want to serialize in some specific format), or if it contains objects that would otherwise not be serializable, you can implement your own serialization strategy by defining two methods, _dump and _load: The instance method _dump should return a String object containing all the information necessary to reconstitute objects of this class and all referenced objects up to a maximum depth given as an integer parameter (a value of -1 implies that you should disable depth checking). The class method _load should take a String and return an object of this class."
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: MAJOR_VERSION
  value: INT2FIX(MARSHAL_MAJOR)
- !ruby/object:RI::Constant 
  comment: 
  name: MINOR_VERSION
  value: INT2FIX(MARSHAL_MINOR)
full_name: Marshal
includes: []

instance_methods: []

name: Marshal
superclass: 
PKf}[��n�,,$ri/1.8/system/Marshal/restore-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the result of converting the serialized data in source into a Ruby object (possibly with associated subordinate objects). source may be either an instance of IO or an object that responds to to_str. If proc is specified, it will be passed each object as it is deserialized.
full_name: Marshal::restore
is_singleton: true
name: restore
params: |
  load( source [, proc] ) => obj
  restore( source [, proc] ) => obj

visibility: public
PKg}[����!ri/1.8/system/Marshal/dump-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Serializes obj and all descendent objects. If anIO is specified, the serialized data will be written to it, otherwise the data will be returned as a String. If limit is specified, the traversal of subobjects will be limited to that depth. If limit is negative, no checking of depth will be performed.
- !ruby/struct:SM::Flow::VERB 
  body: "    class Klass\n      def initialize(str)\n        @str = str\n      end\n      def sayHello\n        @str\n      end\n    end\n"
- !ruby/struct:SM::Flow::P 
  body: (produces no output)
- !ruby/struct:SM::Flow::VERB 
  body: "    o = Klass.new(&quot;hello\\n&quot;)\n    data = Marshal.dump(o)\n    obj = Marshal.load(data)\n    obj.sayHello   #=&gt; &quot;hello\\n&quot;\n"
full_name: Marshal::dump
is_singleton: true
name: dump
params: |
  dump( obj [, anIO] , limit=--1 ) => anIO

visibility: public
PKg}[o��&&!ri/1.8/system/Marshal/load-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the result of converting the serialized data in source into a Ruby object (possibly with associated subordinate objects). source may be either an instance of IO or an object that responds to to_str. If proc is specified, it will be passed each object as it is deserialized.
full_name: Marshal::load
is_singleton: true
name: load
params: |
  load( source [, proc] ) => obj
  restore( source [, proc] ) => obj

visibility: public
PKg}[}�u�� ri/1.8/system/Bignum/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of bytes in the machine representation of <em>big</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   (256**10 - 1).size   #=&gt; 12\n   (256**20 - 1).size   #=&gt; 20\n   (256**40 - 1).size   #=&gt; 40\n"
full_name: Bignum#size
is_singleton: false
name: size
params: |
  big.size -> integer

visibility: public
PKg}[r�)K��"ri/1.8/system/Bignum/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> only if <em>obj</em> is a <tt>Bignum</tt> with the same value as <em>big</em>. Contrast this with <tt>Bignum#==</tt>, which performs type conversions.
- !ruby/struct:SM::Flow::VERB 
  body: "   68719476736.eql?(68719476736.0)   #=&gt; false\n"
full_name: Bignum#eql?
is_singleton: false
name: eql?
params: |
  big.eql?(obj)   => true or false

visibility: public
PKg}[�%W;QQ"ri/1.8/system/Bignum/rpower-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: "**"
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a Rational number if the result is in fact rational (i.e. <tt>other</tt> &lt; 0).
full_name: Bignum#rpower
is_singleton: false
name: rpower
params: (other)
visibility: public
PKg}[R��yGGri/1.8/system/Bignum/%25-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns big modulo other. See Numeric.divmod for more information.
full_name: Bignum#%
is_singleton: false
name: "%"
params: |
  big % other         => Numeric
  big.modulo(other)   => Numeric

visibility: public
PKg}[�*
�pp"ri/1.8/system/Bignum/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Bit Reference---Returns the <em>n</em>th bit in the (assumed) binary representation of <em>big</em>, where <em>big</em>[0] is the least significant bit.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = 9**15\n   50.downto(0) do |n|\n     print a[n]\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   000101110110100000111000011110010100111100010111001\n"
full_name: Bignum#[]
is_singleton: false
name: "[]"
params: |
  big[n] -> 0, 1

visibility: public
PKg}[�Ĝ^�� ri/1.8/system/Bignum/fdiv-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the floating point result of dividing <em>big</em> by <em>numeric</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   -1234567890987654321.quo(13731)      #=&gt; -89910996357705.5\n   -1234567890987654321.quo(13731.24)   #=&gt; -89909424858035.7\n"
full_name: Bignum#fdiv
is_singleton: false
name: fdiv
params: |
  big.quo(numeric) -> float
  big.fdiv(numeric) -> float

visibility: public
PKg}[GM��uu"ri/1.8/system/Bignum/%2a%2a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: power!
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Raises <em>big</em> to the <em>exponent</em> power (which may be an integer, float, or anything that will coerce to a number). The result may be a Fixnum, Bignum, or Float
- !ruby/struct:SM::Flow::VERB 
  body: "  123456789 ** 2      #=&gt; 15241578750190521\n  123456789 ** 1.2    #=&gt; 5126464716.09932\n  123456789 ** -2     #=&gt; 6.5610001194102e-17\n"
full_name: Bignum#**
is_singleton: false
name: "**"
params: |
  big ** exponent   #=> numeric

visibility: public
PKg}[�3�9��%ri/1.8/system/Bignum/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Comparison---Returns -1, 0, or +1 depending on whether <em>big</em> is less than, equal to, or greater than <em>numeric</em>. This is the basis for the tests in <tt>Comparable</tt>.
full_name: Bignum#<=>
is_singleton: false
name: <=>
params: |
  big <=> numeric   => -1, 0, +1

visibility: public
PKg}[�V����"ri/1.8/system/Bignum/coerce-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "MISSING: documentation"
full_name: Bignum#coerce
is_singleton: false
name: coerce
params: (p1)
visibility: public
PKg}[��v��ri/1.8/system/Bignum/%2f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #quo"
full_name: Bignum#/
is_singleton: false
name: /
params: (p1)
visibility: public
PKg}[�((ri/1.8/system/Bignum/%7c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Performs bitwise <tt>or</tt> between <em>big</em> and <em>numeric</em>.
full_name: Bignum#|
is_singleton: false
name: "|"
params: |
  big | numeric   =>  integer

visibility: public
PKg}[�'V6"ri/1.8/system/Bignum/divmod-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See <tt>Numeric#divmod</tt>.
full_name: Bignum#divmod
is_singleton: false
name: divmod
params: |
  big.divmod(numeric)   => array

visibility: public
PKg}[��ی))ri/1.8/system/Bignum/%26-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Performs bitwise <tt>and</tt> between <em>big</em> and <em>numeric</em>.
full_name: Bignum#&
is_singleton: false
name: "&"
params: |
  big & numeric   =>  integer

visibility: public
PKg}[��KKri/1.8/system/Bignum/quo-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: /
- !ruby/object:RI::AliasName 
  name: rdiv
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the floating point result of dividing <em>big</em> by <em>numeric</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   -1234567890987654321.quo(13731)      #=&gt; -89910996357705.5\n   -1234567890987654321.quo(13731.24)   #=&gt; -89909424858035.7\n"
full_name: Bignum#quo
is_singleton: false
name: quo
params: |
  big.quo(numeric) -> float
  big.fdiv(numeric) -> float

visibility: public
PKg}[2o{� ri/1.8/system/Bignum/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compute a hash based on the value of <em>big</em>.
full_name: Bignum#hash
is_singleton: false
name: hash
params: |
  big.hash   => fixnum

visibility: public
PKg}[��7iiri/1.8/system/Bignum/abs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the absolute value of <em>big</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   -1234567890987654321.abs   #=&gt; 1234567890987654321\n"
full_name: Bignum#abs
is_singleton: false
name: abs
params: |
  big.abs -> aBignum

visibility: public
PKg}[�lEYri/1.8/system/Bignum/%2a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Multiplies big and other, returning the result.
full_name: Bignum#*
is_singleton: false
name: "*"
params: |
  big * other  => Numeric

visibility: public
PKg}[s�%���%ri/1.8/system/Bignum/remainder-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the remainder after dividing <em>big</em> by <em>numeric</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   -1234567890987654321.remainder(13731)      #=&gt; -6966\n   -1234567890987654321.remainder(13731.24)   #=&gt; -9906.22531493148\n"
full_name: Bignum#remainder
is_singleton: false
name: remainder
params: |
  big.remainder(numeric)    => number

visibility: public
PKg}[U�0���$ri/1.8/system/Bignum/power%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #**"
full_name: Bignum#power!
is_singleton: false
name: power!
params: (p1)
visibility: public
PKg}[���11ri/1.8/system/Bignum/%7e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Inverts the bits in big. As Bignums are conceptually infinite length, the result acts as if it had an infinite number of one bits to the left. In hex representations, this is displayed as two periods to the left of the digits.
- !ruby/struct:SM::Flow::VERB 
  body: "  sprintf(&quot;%X&quot;, ~0x1122334455)    #=&gt; &quot;..FEEDDCCBBAA&quot;\n"
full_name: Bignum#~
is_singleton: false
name: "~"
params: |
  ~big  =>  integer

visibility: public
PKg}[�rR�� ri/1.8/system/Bignum/rdiv-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #quo"
full_name: Bignum#rdiv
is_singleton: false
name: rdiv
params: (p1)
visibility: public
PKg}[v���	�	&ri/1.8/system/Bignum/cdesc-Bignum.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Bignum objects hold integers outside the range of Fixnum. Bignum objects are created automatically when integer calculations would otherwise overflow a Fixnum. When a calculation involving Bignum objects returns a result that will fit in a Fixnum, the result is automatically converted.
- !ruby/struct:SM::Flow::P 
  body: For the purposes of the bitwise operations and <tt>[]</tt>, a Bignum is treated as if it were an infinite-length bitstring with 2's complement representation.
- !ruby/struct:SM::Flow::P 
  body: While Fixnum values are immediate, Bignum objects are not---assignment and parameter passing work with references to objects, not the objects themselves.
constants: []

full_name: Bignum
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "%"
- !ruby/object:RI::MethodSummary 
  name: "&"
- !ruby/object:RI::MethodSummary 
  name: "*"
- !ruby/object:RI::MethodSummary 
  name: "**"
- !ruby/object:RI::MethodSummary 
  name: "**"
- !ruby/object:RI::MethodSummary 
  name: +
- !ruby/object:RI::MethodSummary 
  name: "-"
- !ruby/object:RI::MethodSummary 
  name: -@
- !ruby/object:RI::MethodSummary 
  name: /
- !ruby/object:RI::MethodSummary 
  name: /
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: ">>"
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: ^
- !ruby/object:RI::MethodSummary 
  name: abs
- !ruby/object:RI::MethodSummary 
  name: coerce
- !ruby/object:RI::MethodSummary 
  name: div
- !ruby/object:RI::MethodSummary 
  name: divmod
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: fdiv
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: modulo
- !ruby/object:RI::MethodSummary 
  name: power!
- !ruby/object:RI::MethodSummary 
  name: quo
- !ruby/object:RI::MethodSummary 
  name: quo
- !ruby/object:RI::MethodSummary 
  name: rdiv
- !ruby/object:RI::MethodSummary 
  name: remainder
- !ruby/object:RI::MethodSummary 
  name: rpower
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: to_f
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: "|"
- !ruby/object:RI::MethodSummary 
  name: "~"
name: Bignum
superclass: Integer
PKg}[�?7�77"ri/1.8/system/Bignum/%3e%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Shifts big right <em>numeric</em> positions (left if <em>numeric</em> is negative).
full_name: Bignum#>>
is_singleton: false
name: ">>"
params: |
  big >> numeric   =>  integer

visibility: public
PKh}[e��Fri/1.8/system/Bignum/%2b-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds big and other, returning the result.
full_name: Bignum#+
is_singleton: false
name: +
params: |
  big + other  => Numeric

visibility: public
PKh}[�D��77"ri/1.8/system/Bignum/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Shifts big left <em>numeric</em> positions (right if <em>numeric</em> is negative).
full_name: Bignum#<<
is_singleton: false
name: "<<"
params: |
  big << numeric   =>  integer

visibility: public
PKh}[���� ri/1.8/system/Bignum/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a string containing the representation of <em>big</em> radix <em>base</em> (2 through 36).
- !ruby/struct:SM::Flow::VERB 
  body: "   12345654321.to_s         #=&gt; &quot;12345654321&quot;\n   12345654321.to_s(2)      #=&gt; &quot;1011011111110110111011110000110001&quot;\n   12345654321.to_s(8)      #=&gt; &quot;133766736061&quot;\n   12345654321.to_s(16)     #=&gt; &quot;2dfdbbc31&quot;\n   78546939656932.to_s(36)  #=&gt; &quot;rubyrules&quot;\n"
full_name: Bignum#to_s
is_singleton: false
name: to_s
params: |
  big.to_s(base=10)   =>  string

visibility: public
PKh}[��Yp��"ri/1.8/system/Bignum/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> only if <em>obj</em> has the same value as <em>big</em>. Contrast this with <tt>Bignum#eql?</tt>, which requires <em>obj</em> to be a <tt>Bignum</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   68719476736 == 68719476736.0   #=&gt; true\n"
full_name: Bignum#==
is_singleton: false
name: ==
params: |
  big == obj  => true or false

visibility: public
PKh}[� J�"ri/1.8/system/Bignum/%2d%40-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Unary minus (returns a new Bignum whose value is 0-big)
full_name: Bignum#-@
is_singleton: false
name: -@
params: |
  -big   =>  other_big

visibility: public
PKh}[,��**ri/1.8/system/Bignum/div-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Divides big by other, returning the result.
full_name: Bignum#div
is_singleton: false
name: div
params: |
  big / other     => Numeric
  big.div(other)  => Numeric

visibility: public
PKh}[�cN�))ri/1.8/system/Bignum/%5e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Performs bitwise +exclusive or+ between <em>big</em> and <em>numeric</em>.
full_name: Bignum#^
is_singleton: false
name: ^
params: |
  big ^ numeric   =>  integer

visibility: public
PKh}[�CgNN ri/1.8/system/Bignum/to_f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts <em>big</em> to a <tt>Float</tt>. If <em>big</em> doesn't fit in a <tt>Float</tt>, the result is infinity.
full_name: Bignum#to_f
is_singleton: false
name: to_f
params: |
  big.to_f -> float

visibility: public
PKh}[�o�OO"ri/1.8/system/Bignum/modulo-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns big modulo other. See Numeric.divmod for more information.
full_name: Bignum#modulo
is_singleton: false
name: modulo
params: |
  big % other         => Numeric
  big.modulo(other)   => Numeric

visibility: public
PKh}[P�>�ri/1.8/system/Bignum/%2d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Subtracts other from big, returning the result.
full_name: Bignum#-
is_singleton: false
name: "-"
params: |
  big - other  => Numeric

visibility: public
PKh}[� Nǣ�$ri/1.8/system/Rinda/cdesc-Rinda.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: A module to implement the Linda distributed computing paradigm in Ruby.
- !ruby/struct:SM::Flow::P 
  body: Rinda is part of DRb (dRuby).
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Example(s)
- !ruby/struct:SM::Flow::P 
  body: See the sample/drb/ directory in the Ruby distribution, from 1.8.2 onwards.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The default port Ring discovery will use.
  name: Ring_PORT
  value: "7647"
full_name: Rinda
includes: []

instance_methods: []

name: Rinda
superclass: 
PKh}[��A2##)ri/1.8/system/Rinda/Template/match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Matches this template against <tt>tuple</tt>. The <tt>tuple</tt> must be the same size as the template. An element with a <tt>nil</tt> value in a template acts as a wildcard, matching any value in the corresponding position in the tuple. Elements of the template match the <tt>tuple</tt> if the are #== or #===."
- !ruby/struct:SM::Flow::VERB 
  body: "  Template.new([:foo, 5]).match   Tuple.new([:foo, 5]) # =&gt; true\n  Template.new([:foo, nil]).match Tuple.new([:foo, 5]) # =&gt; true\n  Template.new([String]).match    Tuple.new(['hello']) # =&gt; true\n\n  Template.new([:foo]).match      Tuple.new([:foo, 5]) # =&gt; false\n  Template.new([:foo, 6]).match   Tuple.new([:foo, 5]) # =&gt; false\n  Template.new([:foo, nil]).match Tuple.new([:foo])    # =&gt; false\n  Template.new([:foo, 6]).match   Tuple.new([:foo])    # =&gt; false\n"
full_name: Rinda::Template#match
is_singleton: false
name: match
params: (tuple)
visibility: public
PKh}[�4}��-ri/1.8/system/Rinda/Template/%3d%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #match."
full_name: Rinda::Template#===
is_singleton: false
name: ===
params: (tuple)
visibility: public
PKh}[b.oo0ri/1.8/system/Rinda/Template/cdesc-Template.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Templates are used to match tuples in Rinda.
constants: []

full_name: Rinda::Template
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ===
- !ruby/object:RI::MethodSummary 
  name: match
name: Template
superclass: Tuple
PKh}[�H>>Bri/1.8/system/Rinda/WaitTemplateEntry/cdesc-WaitTemplateEntry.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: found
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: <em>Documentation?</em>
constants: []

full_name: Rinda::WaitTemplateEntry
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: cancel
- !ruby/object:RI::MethodSummary 
  name: read
- !ruby/object:RI::MethodSummary 
  name: signal
- !ruby/object:RI::MethodSummary 
  name: wait
name: WaitTemplateEntry
superclass: TemplateEntry
PKh}[��m��1ri/1.8/system/Rinda/WaitTemplateEntry/read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Rinda::WaitTemplateEntry#read
is_singleton: false
name: read
params: (tuple)
visibility: public
PKh}[K)%ȴ�1ri/1.8/system/Rinda/WaitTemplateEntry/wait-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Rinda::WaitTemplateEntry#wait
is_singleton: false
name: wait
params: ()
visibility: public
PKh}[XN���0ri/1.8/system/Rinda/WaitTemplateEntry/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Rinda::WaitTemplateEntry::new
is_singleton: true
name: new
params: (place, ary, expires=nil)
visibility: public
PKh}[�y��3ri/1.8/system/Rinda/WaitTemplateEntry/signal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Rinda::WaitTemplateEntry#signal
is_singleton: false
name: signal
params: ()
visibility: public
PKh}[rϮq��3ri/1.8/system/Rinda/WaitTemplateEntry/cancel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Rinda::WaitTemplateEntry#cancel
is_singleton: false
name: cancel
params: ()
visibility: public
PKh}[$zb���*ri/1.8/system/Rinda/TupleEntry/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The size of the tuple.
full_name: Rinda::TupleEntry#size
is_singleton: false
name: size
params: ()
visibility: public
PKh}[z����,ri/1.8/system/Rinda/TupleEntry/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Retrieves <tt>key</tt> from the tuple.
full_name: Rinda::TupleEntry#[]
is_singleton: false
name: "[]"
params: (key)
visibility: public
PKh}[��PPP4ri/1.8/system/Rinda/TupleEntry/cdesc-TupleEntry.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: expires
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A TupleEntry is a Tuple (i.e. a possible entry in some Tuplespace) together with expiry and cancellation data.
constants: []

full_name: Rinda::TupleEntry
includes: 
- !ruby/object:RI::IncludedModule 
  name: DRbUndumped
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: alive?
- !ruby/object:RI::MethodSummary 
  name: cancel
- !ruby/object:RI::MethodSummary 
  name: canceled?
- !ruby/object:RI::MethodSummary 
  name: expired?
- !ruby/object:RI::MethodSummary 
  name: fetch
- !ruby/object:RI::MethodSummary 
  name: get_renewer
- !ruby/object:RI::MethodSummary 
  name: make_expires
- !ruby/object:RI::MethodSummary 
  name: make_tuple
- !ruby/object:RI::MethodSummary 
  name: renew
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: value
name: TupleEntry
superclass: Object
PKh}[�q@���+ri/1.8/system/Rinda/TupleEntry/renew-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reset the expiry time according to <tt>sec_or_renewer</tt>.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+nil+:"
    body: it is set to expire in the far future.
  - !ruby/struct:SM::Flow::LI 
    label: "+false+:"
    body: it has expired.
  - !ruby/struct:SM::Flow::LI 
    label: "Numeric:"
    body: it will expire in that many seconds.
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: Otherwise the argument refers to some kind of renewer object which will reset its expiry time.
full_name: Rinda::TupleEntry#renew
is_singleton: false
name: renew
params: (sec_or_renewer)
visibility: public
PKh}[��r���2ri/1.8/system/Rinda/TupleEntry/make_expires-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns an expiry Time based on <tt>sec</tt> which can be one of:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "Numeric:"
    body: <tt>sec</tt> seconds into the future
  - !ruby/struct:SM::Flow::LI 
    label: "+true+:"
    body: the expiry time is the start of 1970 (i.e. expired)
  - !ruby/struct:SM::Flow::LI 
    label: "+nil+:"
    body: it is Tue Jan 19 03:14:07 GMT Standard Time 2038 (i.e. when UNIX clocks will die)
  type: :NOTE
full_name: Rinda::TupleEntry#make_expires
is_singleton: false
name: make_expires
params: (sec=nil)
visibility: public
PKh}[�]����1ri/1.8/system/Rinda/TupleEntry/get_renewer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a valid argument to make_expires and the renewer or nil.
- !ruby/struct:SM::Flow::P 
  body: Given <tt>true</tt>, <tt>nil</tt>, or Numeric, returns that value and <tt>nil</tt> (no actual renewer). Otherwise it returns an expiry value from calling +it.renew+ and the renewer.
full_name: Rinda::TupleEntry#get_renewer
is_singleton: false
name: get_renewer
params: (it)
visibility: private
PKh}[��Kl��)ri/1.8/system/Rinda/TupleEntry/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a TupleEntry based on <tt>ary</tt> with an optional renewer or expiry time <tt>sec</tt>.
- !ruby/struct:SM::Flow::P 
  body: A renewer must implement the <tt>renew</tt> method which returns a Numeric, nil, or true to indicate when the tuple has expired.
full_name: Rinda::TupleEntry::new
is_singleton: true
name: new
params: (ary, sec=nil)
visibility: public
PKh}[2,E		0ri/1.8/system/Rinda/TupleEntry/make_tuple-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a Rinda::Tuple for <tt>ary</tt>.
full_name: Rinda::TupleEntry#make_tuple
is_singleton: false
name: make_tuple
params: (ary)
visibility: public
PKh}[T]ɶ��1ri/1.8/system/Rinda/TupleEntry/canceled%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the canceled status.
full_name: Rinda::TupleEntry#canceled?
is_singleton: false
name: canceled?
params: ()
visibility: public
PKh}[��E+

.ri/1.8/system/Rinda/TupleEntry/alive%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: A TupleEntry is dead when it is canceled or expired.
full_name: Rinda::TupleEntry#alive?
is_singleton: false
name: alive?
params: ()
visibility: public
PKh}[��t+ri/1.8/system/Rinda/TupleEntry/value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Return the object which makes up the tuple itself: the Array or Hash."
full_name: Rinda::TupleEntry#value
is_singleton: false
name: value
params: ()
visibility: public
PKh}[�D���,ri/1.8/system/Rinda/TupleEntry/cancel-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Marks this TupleEntry as canceled.
full_name: Rinda::TupleEntry#cancel
is_singleton: false
name: cancel
params: ()
visibility: public
PKh}[$��z��0ri/1.8/system/Rinda/TupleEntry/expired%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Has this tuple expired? (true/false).
- !ruby/struct:SM::Flow::P 
  body: "A tuple has expired when its expiry timer based on the <tt>sec</tt> argument to #initialize runs out."
full_name: Rinda::TupleEntry#expired?
is_singleton: false
name: expired?
params: ()
visibility: public
PKh}[nFAv��+ri/1.8/system/Rinda/TupleEntry/fetch-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Fetches <tt>key</tt> from the tuple.
full_name: Rinda::TupleEntry#fetch
is_singleton: false
name: fetch
params: (key)
visibility: public
PKh}[�`=-ri/1.8/system/Rinda/RingFinger/primary-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the first advertised TupleSpace.
full_name: Rinda::RingFinger::primary
is_singleton: true
name: primary
params: ()
visibility: public
PKh}[Z9~���1ri/1.8/system/Rinda/RingFinger/lookup_ring-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Looks up RingServers waiting <tt>timeout</tt> seconds. RingServers will be given <tt>block</tt> as a callback, which will be called with the remote TupleSpace.
full_name: Rinda::RingFinger#lookup_ring
is_singleton: false
name: lookup_ring
params: (timeout=5, &block)
visibility: public
PKh}[X8�*00*ri/1.8/system/Rinda/RingFinger/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (@primary)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over all discovered TupleSpaces starting with the primary.
full_name: Rinda::RingFinger#each
is_singleton: false
name: each
params: () {|@primary| ...}
visibility: public
PKh}[��o�dd5ri/1.8/system/Rinda/RingFinger/lookup_ring_any-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the first found remote TupleSpace. Any further recovered TupleSpaces can be found by calling <tt>to_a</tt>.
full_name: Rinda::RingFinger#lookup_ring_any
is_singleton: false
name: lookup_ring_any
params: (timeout=5)
visibility: public
PKh}[��qL

*ri/1.8/system/Rinda/RingFinger/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Contains all discovered TupleSpaces except for the primary.
full_name: Rinda::RingFinger#to_a
is_singleton: false
name: to_a
params: ()
visibility: public
PKh}[�G`�GG4ri/1.8/system/Rinda/RingFinger/cdesc-RingFinger.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The list of addresses where RingFinger will send query packets.
  name: broadcast_list
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The port that RingFinger will send query packets to.
  name: port
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Contain the first advertised TupleSpace after lookup_ring_any is called.
  name: primary
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: finger
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: primary
- !ruby/object:RI::MethodSummary 
  name: to_a
comment: 
- !ruby/struct:SM::Flow::P 
  body: RingFinger is used by RingServer clients to discover the RingServer's TupleSpace. Typically, all a client needs to do is call RingFinger.primary to retrieve the remote TupleSpace, which it can then begin using.
constants: []

full_name: Rinda::RingFinger
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: lookup_ring
- !ruby/object:RI::MethodSummary 
  name: lookup_ring_any
- !ruby/object:RI::MethodSummary 
  name: to_a
name: RingFinger
superclass: Object
PKh}[?��gtt)ri/1.8/system/Rinda/RingFinger/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new RingFinger that will look for RingServers at <tt>port</tt> on the addresses in <tt>broadcast_list</tt>.
full_name: Rinda::RingFinger::new
is_singleton: true
name: new
params: (broadcast_list=@@broadcast_list, port=Ring_PORT)
visibility: public
PKh}[RcW�00,ri/1.8/system/Rinda/RingFinger/finger-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a singleton RingFinger and looks for a RingServer. Returns the created RingFinger.
full_name: Rinda::RingFinger::finger
is_singleton: true
name: finger
params: ()
visibility: public
PKh}[|

*ri/1.8/system/Rinda/RingFinger/to_a-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Contains all discovered TupleSpaces except for the primary.
full_name: Rinda::RingFinger::to_a
is_singleton: true
name: to_a
params: ()
visibility: public
PKh}[/��11Hri/1.8/system/Rinda/RequestCanceledError/cdesc-RequestCanceledError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Raised when trying to use a canceled tuple.
constants: []

full_name: Rinda::RequestCanceledError
includes: []

instance_methods: []

name: RequestCanceledError
superclass: ThreadError
PKh}[7�N�ww.ri/1.8/system/Rinda/TemplateEntry/match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: ===
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Matches this TemplateEntry against <tt>tuple</tt>. See Template#match for details on how a Template matches a Tuple.
full_name: Rinda::TemplateEntry#match
is_singleton: false
name: match
params: (tuple)
visibility: public
PKh}[BhA��2ri/1.8/system/Rinda/TemplateEntry/%3d%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #match"
full_name: Rinda::TemplateEntry#===
is_singleton: false
name: ===
params: (tuple)
visibility: public
PKh}[��w���:ri/1.8/system/Rinda/TemplateEntry/cdesc-TemplateEntry.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: A TemplateEntry is a Template together with expiry and cancellation data.
constants: []

full_name: Rinda::TemplateEntry
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ===
- !ruby/object:RI::MethodSummary 
  name: match
name: TemplateEntry
superclass: TupleEntry
PKh}[C�p?		4ri/1.8/system/Rinda/RindaError/cdesc-RindaError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Rinda error base class
constants: []

full_name: Rinda::RindaError
includes: []

instance_methods: []

name: RindaError
superclass: RuntimeError
PKh}[s�V���:ri/1.8/system/Rinda/SimpleRenewer/cdesc-SimpleRenewer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: An SimpleRenewer allows a TupleSpace to check if a TupleEntry is still alive.
constants: []

full_name: Rinda::SimpleRenewer
includes: 
- !ruby/object:RI::IncludedModule 
  name: DRbUndumped
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: renew
name: SimpleRenewer
superclass: Object
PKh}[�w�.ri/1.8/system/Rinda/SimpleRenewer/renew-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Called by the TupleSpace to check if the object is still alive.
full_name: Rinda::SimpleRenewer#renew
is_singleton: false
name: renew
params: ()
visibility: public
PKh}[��D22,ri/1.8/system/Rinda/SimpleRenewer/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new SimpleRenewer that keeps an object alive for another <tt>sec</tt> seconds.
full_name: Rinda::SimpleRenewer::new
is_singleton: true
name: new
params: (sec=180)
visibility: public
PKh}[40W���8ri/1.8/system/Rinda/RingProvider/cdesc-RingProvider.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: RingProvider uses a RingServer advertised TupleSpace as a name service. TupleSpace clients can register themselves with the remote TupleSpace and look up other provided services via the remote TupleSpace.
- !ruby/struct:SM::Flow::P 
  body: Services are registered with a tuple of the format [:name, klass, DRbObject, description].
constants: []

full_name: Rinda::RingProvider
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: provide
name: RingProvider
superclass: Object
PKh}[�-{��+ri/1.8/system/Rinda/RingProvider/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a RingProvider that will provide a <tt>klass</tt> service running on <tt>front</tt>, with a <tt>description</tt>. <tt>renewer</tt> is optional.
full_name: Rinda::RingProvider::new
is_singleton: true
name: new
params: (klass, front, desc, renewer = nil)
visibility: public
PKh}[�/�/ri/1.8/system/Rinda/RingProvider/provide-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Advertises this service on the primary remote TupleSpace.
full_name: Rinda::RingProvider#provide
is_singleton: false
name: provide
params: ()
visibility: public
PKh}[��Q

(ri/1.8/system/Rinda/TupleBag/find-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Finds a live tuple that matches <tt>template</tt>.
full_name: Rinda::TupleBag#find
is_singleton: false
name: find
params: (template)
visibility: public
PKh}[l����.ri/1.8/system/Rinda/TupleBag/each_entry-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Rinda::TupleBag#each_entry
is_singleton: false
name: each_entry
params: (&blk)
visibility: private
PKh}[Kʻ"��0ri/1.8/system/Rinda/TupleBag/bin_for_find-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Rinda::TupleBag#bin_for_find
is_singleton: false
name: bin_for_find
params: (template)
visibility: private
PKh}[���>>7ri/1.8/system/Rinda/TupleBag/delete_unless_alive-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Delete tuples which dead tuples from the TupleBag, returning the deleted tuples.
full_name: Rinda::TupleBag#delete_unless_alive
is_singleton: false
name: delete_unless_alive
params: ()
visibility: public
PKh}[�*ri/1.8/system/Rinda/TupleBag/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes <tt>tuple</tt> from the TupleBag.
full_name: Rinda::TupleBag#delete
is_singleton: false
name: delete
params: (tuple)
visibility: public
PKh}[юJ*,ri/1.8/system/Rinda/TupleBag/find_all-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Finds all live tuples that match <tt>template</tt>.
full_name: Rinda::TupleBag#find_all
is_singleton: false
name: find_all
params: (template)
visibility: public
PKh}[ _η�+ri/1.8/system/Rinda/TupleBag/bin_key-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Rinda::TupleBag#bin_key
is_singleton: false
name: bin_key
params: (tuple)
visibility: private
PKh}[�G4��(ri/1.8/system/Rinda/TupleBag/push-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Add <tt>tuple</tt> to the TupleBag.
full_name: Rinda::TupleBag#push
is_singleton: false
name: push
params: (tuple)
visibility: public
PKi}[�D��TT5ri/1.8/system/Rinda/TupleBag/find_all_template-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Finds all tuples in the TupleBag which when treated as templates, match <tt>tuple</tt> and are alive.
full_name: Rinda::TupleBag#find_all_template
is_singleton: false
name: find_all_template
params: (tuple)
visibility: public
PKi}[���DD0ri/1.8/system/Rinda/TupleBag/cdesc-TupleBag.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: TupleBag is an unordered collection of tuples. It is the basis of Tuplespace.
constants: []

full_name: Rinda::TupleBag
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: bin_for_find
- !ruby/object:RI::MethodSummary 
  name: bin_key
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: delete_unless_alive
- !ruby/object:RI::MethodSummary 
  name: each_entry
- !ruby/object:RI::MethodSummary 
  name: find
- !ruby/object:RI::MethodSummary 
  name: find_all
- !ruby/object:RI::MethodSummary 
  name: find_all_template
- !ruby/object:RI::MethodSummary 
  name: has_expires?
- !ruby/object:RI::MethodSummary 
  name: push
name: TupleBag
superclass: Object
PKi}[W$���1ri/1.8/system/Rinda/TupleBag/TupleBin/find-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (x)
comment: 
full_name: Rinda::TupleBag::TupleBin#find
is_singleton: false
name: find
params: (&blk) {|x| ...}
visibility: public
PKi}[���1��3ri/1.8/system/Rinda/TupleBag/TupleBin/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Rinda::TupleBag::TupleBin#delete
is_singleton: false
name: delete
params: (tuple)
visibility: public
PKi}[�O��0ri/1.8/system/Rinda/TupleBag/TupleBin/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Rinda::TupleBag::TupleBin#add
is_singleton: false
name: add
params: (tuple)
visibility: public
PKi}[+~��0ri/1.8/system/Rinda/TupleBag/TupleBin/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Rinda::TupleBag::TupleBin::new
is_singleton: true
name: new
params: ()
visibility: public
PKi}[1�Փ��9ri/1.8/system/Rinda/TupleBag/TupleBin/cdesc-TupleBin.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: Rinda::TupleBag::TupleBin
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: find
name: TupleBin
superclass: Object
PKi}[^}l##2ri/1.8/system/Rinda/TupleBag/has_expires%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>true</tt> if the TupleBag to see if it has any expired entries.
full_name: Rinda::TupleBag#has_expires?
is_singleton: false
name: has_expires?
params: ()
visibility: public
PKi}[f�_''*ri/1.8/system/Rinda/TupleSpace/move-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (template)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Moves <tt>tuple</tt> to <tt>port</tt>.
full_name: Rinda::TupleSpace#move
is_singleton: false
name: move
params: (port, tuple, sec=nil) {|template| ...}
visibility: public
PKi}[�:�[((*ri/1.8/system/Rinda/TupleSpace/read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (template)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reads <tt>tuple</tt>, but does not remove it.
full_name: Rinda::TupleSpace#read
is_singleton: false
name: read
params: (tuple, sec=nil) {|template| ...}
visibility: public
PKi}[�>N,,.ri/1.8/system/Rinda/TupleSpace/read_all-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns all tuples matching <tt>tuple</tt>. Does not remove the found tuples.
full_name: Rinda::TupleSpace#read_all
is_singleton: false
name: read_all
params: (tuple)
visibility: public
PKi}[��8�II2ri/1.8/system/Rinda/TupleSpace/notify_event-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Notifies all registered listeners for <tt>event</tt> of a status change of <tt>tuple</tt>.
full_name: Rinda::TupleSpace#notify_event
is_singleton: false
name: notify_event
params: (event, tuple)
visibility: private
PKi}[)c���*ri/1.8/system/Rinda/TupleSpace/take-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes <tt>tuple</tt>
full_name: Rinda::TupleSpace#take
is_singleton: false
name: take
params: (tuple, sec=nil, &block)
visibility: public
PKi}[8�9�)ri/1.8/system/Rinda/TupleSpace/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new TupleSpace. <tt>period</tt> is used to control how often to look for dead tuples after modifications to the TupleSpace.
- !ruby/struct:SM::Flow::P 
  body: If no dead tuples are found <tt>period</tt> seconds after the last modification, the TupleSpace will stop looking for dead tuples.
full_name: Rinda::TupleSpace::new
is_singleton: true
name: new
params: (period=60)
visibility: public
PKi}[�;���,ri/1.8/system/Rinda/TupleSpace/notify-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Registers for notifications of <tt>event</tt>. Returns a NotifyTemplateEntry. See NotifyTemplateEntry for examples of how to listen for notifications.
- !ruby/struct:SM::Flow::P 
  body: "<tt>event</tt> can be:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "'write':"
    body: A tuple was added
  - !ruby/struct:SM::Flow::LI 
    label: "'take':"
    body: A tuple was taken or moved
  - !ruby/struct:SM::Flow::LI 
    label: "'delete':"
    body: A tuple was lost after being overwritten or expiring
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: The TupleSpace will also notify you of the 'close' event when the NotifyTemplateEntry has expired.
full_name: Rinda::TupleSpace#notify
is_singleton: false
name: notify
params: (event, tuple, sec=nil)
visibility: public
PKi}[-�H1��+ri/1.8/system/Rinda/TupleSpace/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds <tt>tuple</tt>
full_name: Rinda::TupleSpace#write
is_singleton: false
name: write
params: (tuple, sec=nil)
visibility: public
PKi}[Nʻb��4ri/1.8/system/Rinda/TupleSpace/cdesc-TupleSpace.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: The Tuplespace manages access to the tuples it contains, ensuring mutual exclusion requirements are met.
- !ruby/struct:SM::Flow::P 
  body: The <tt>sec</tt> option for the write, take, move, read and notify methods may either be a number of seconds or a Renewer object.
constants: []

full_name: Rinda::TupleSpace
includes: 
- !ruby/object:RI::IncludedModule 
  name: DRbUndumped
- !ruby/object:RI::IncludedModule 
  name: MonitorMixin
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: create_entry
- !ruby/object:RI::MethodSummary 
  name: keep_clean
- !ruby/object:RI::MethodSummary 
  name: move
- !ruby/object:RI::MethodSummary 
  name: need_keeper?
- !ruby/object:RI::MethodSummary 
  name: notify
- !ruby/object:RI::MethodSummary 
  name: notify_event
- !ruby/object:RI::MethodSummary 
  name: read
- !ruby/object:RI::MethodSummary 
  name: read_all
- !ruby/object:RI::MethodSummary 
  name: start_keeper
- !ruby/object:RI::MethodSummary 
  name: take
- !ruby/object:RI::MethodSummary 
  name: write
name: TupleSpace
superclass: Object
PKi}[!�m���0ri/1.8/system/Rinda/TupleSpace/keep_clean-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes dead tuples.
full_name: Rinda::TupleSpace#keep_clean
is_singleton: false
name: keep_clean
params: ()
visibility: private
PKi}[V�B���2ri/1.8/system/Rinda/TupleSpace/create_entry-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Rinda::TupleSpace#create_entry
is_singleton: false
name: create_entry
params: (tuple, sec)
visibility: private
PKi}[cj�4ri/1.8/system/Rinda/TupleSpace/need_keeper%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Checks the tuplespace to see if it needs cleaning.
full_name: Rinda::TupleSpace#need_keeper?
is_singleton: false
name: need_keeper?
params: ()
visibility: private
PKi}[����!!2ri/1.8/system/Rinda/TupleSpace/start_keeper-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a thread that scans the tuplespace for expired tuples.
full_name: Rinda::TupleSpace#start_keeper
is_singleton: false
name: start_keeper
params: ()
visibility: private
PKi}[-�4xx4ri/1.8/system/Rinda/RingServer/cdesc-RingServer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "A RingServer allows a Rinda::TupleSpace to be located via UDP broadcasts. Service location uses the following steps:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "1."
    body: A RingServer begins listening on the broadcast UDP address.
  - !ruby/struct:SM::Flow::LI 
    label: "2."
    body: A RingFinger sends a UDP packet containing the DRb URI where it will listen for a reply.
  - !ruby/struct:SM::Flow::LI 
    label: "3."
    body: The RingServer receives the UDP packet and connects back to the provided DRb URI with the DRb service.
  type: :NUMBER
constants: []

full_name: Rinda::RingServer
includes: 
- !ruby/object:RI::IncludedModule 
  name: DRbUndumped
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: do_reply
- !ruby/object:RI::MethodSummary 
  name: do_write
- !ruby/object:RI::MethodSummary 
  name: reply_service
- !ruby/object:RI::MethodSummary 
  name: write_service
name: RingServer
superclass: Object
PKi}[���^'')ri/1.8/system/Rinda/RingServer/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Advertises <tt>ts</tt> on the UDP broadcast address at <tt>port</tt>.
full_name: Rinda::RingServer::new
is_singleton: true
name: new
params: (ts, port=Ring_PORT)
visibility: public
PKi}[�s�$ii.ri/1.8/system/Rinda/RingServer/do_write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Extracts the response URI from <tt>msg</tt> and adds it to TupleSpace where it will be picked up by <tt>reply_service</tt> for notification.
full_name: Rinda::RingServer#do_write
is_singleton: false
name: do_write
params: (msg)
visibility: public
PKi}[��~�883ri/1.8/system/Rinda/RingServer/write_service-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a thread that picks up UDP packets and passes them to do_write for decoding.
full_name: Rinda::RingServer#write_service
is_singleton: false
name: write_service
params: ()
visibility: public
PKi}[�
Pg''3ri/1.8/system/Rinda/RingServer/reply_service-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a thread that notifies waiting clients from the TupleSpace.
full_name: Rinda::RingServer#reply_service
is_singleton: false
name: reply_service
params: ()
visibility: public
PKi}[o���CC.ri/1.8/system/Rinda/RingServer/do_reply-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pulls lookup tuples out of the TupleSpace and sends their DRb object the address of the local TupleSpace.
full_name: Rinda::RingServer#do_reply
is_singleton: false
name: do_reply
params: ()
visibility: public
PKi}[6u�55Fri/1.8/system/Rinda/InvalidHashTupleKey/cdesc-InvalidHashTupleKey.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Raised when a hash-based tuple has an invalid key.
constants: []

full_name: Rinda::InvalidHashTupleKey
includes: []

instance_methods: []

name: InvalidHashTupleKey
superclass: RindaError
PKi}[K;6S//Fri/1.8/system/Rinda/RequestExpiredError/cdesc-RequestExpiredError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Raised when trying to use an expired tuple.
constants: []

full_name: Rinda::RequestExpiredError
includes: []

instance_methods: []

name: RequestExpiredError
superclass: ThreadError
PKi}[�e��33/ri/1.8/system/Rinda/TupleSpaceProxy/read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reads <tt>tuple</tt> from the proxied TupleSpace. See TupleSpace#read.
full_name: Rinda::TupleSpaceProxy#read
is_singleton: false
name: read
params: (tuple, sec=nil, &block)
visibility: public
PKi}[�{�BB3ri/1.8/system/Rinda/TupleSpaceProxy/read_all-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reads all tuples matching <tt>tuple</tt> from the proxied TupleSpace. See TupleSpace#read_all.
full_name: Rinda::TupleSpaceProxy#read_all
is_singleton: false
name: read_all
params: (tuple)
visibility: public
PKi}[ ���OO>ri/1.8/system/Rinda/TupleSpaceProxy/cdesc-TupleSpaceProxy.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: TupleSpaceProxy allows a remote Tuplespace to appear as local.
constants: []

full_name: Rinda::TupleSpaceProxy
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: notify
- !ruby/object:RI::MethodSummary 
  name: read
- !ruby/object:RI::MethodSummary 
  name: read_all
- !ruby/object:RI::MethodSummary 
  name: take
- !ruby/object:RI::MethodSummary 
  name: write
name: TupleSpaceProxy
superclass: Object
PKi}[����33/ri/1.8/system/Rinda/TupleSpaceProxy/take-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Takes <tt>tuple</tt> from the proxied TupleSpace. See TupleSpace#take.
full_name: Rinda::TupleSpaceProxy#take
is_singleton: false
name: take
params: (tuple, sec=nil, &block)
visibility: public
PKi}[�q'�		.ri/1.8/system/Rinda/TupleSpaceProxy/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new TupleSpaceProxy to wrap <tt>ts</tt>.
full_name: Rinda::TupleSpaceProxy::new
is_singleton: true
name: new
params: (ts)
visibility: public
PKi}[�4��NN1ri/1.8/system/Rinda/TupleSpaceProxy/notify-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Registers for notifications of event <tt>ev</tt> on the proxied TupleSpace. See TupleSpace#notify
full_name: Rinda::TupleSpaceProxy#notify
is_singleton: false
name: notify
params: (ev, tuple, sec=nil)
visibility: public
PKi}[�wC�++0ri/1.8/system/Rinda/TupleSpaceProxy/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds <tt>tuple</tt> to the proxied TupleSpace. See TupleSpace#write.
full_name: Rinda::TupleSpaceProxy#write
is_singleton: false
name: write
params: (tuple, sec=nil)
visibility: public
PKi}[�6j==0ri/1.8/system/Rinda/DRbObjectTemplate/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new DRbObjectTemplate that will match against <tt>uri</tt> and <tt>ref</tt>.
full_name: Rinda::DRbObjectTemplate::new
is_singleton: true
name: new
params: (uri=nil, ref=nil)
visibility: public
PKi}[�(�^^6ri/1.8/system/Rinda/DRbObjectTemplate/%3d%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: This DRbObjectTemplate matches <tt>ro</tt> if the remote object's drburi and drbref are the same. <tt>nil</tt> is used as a wildcard.
full_name: Rinda::DRbObjectTemplate#===
is_singleton: false
name: ===
params: (ro)
visibility: public
PKi}[���GhhBri/1.8/system/Rinda/DRbObjectTemplate/cdesc-DRbObjectTemplate.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: <em>Documentation?</em>
constants: []

full_name: Rinda::DRbObjectTemplate
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ===
name: DRbObjectTemplate
superclass: Object
PKi}[�A3�;;3ri/1.8/system/Rinda/NotifyTemplateEntry/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: event, tuple
comment: 
- !ruby/struct:SM::Flow::P 
  body: Yields event/tuple pairs until this NotifyTemplateEntry expires.
full_name: Rinda::NotifyTemplateEntry#each
is_singleton: false
name: each
params: ( {|event, tuple| ...}
visibility: public
PKi}[�
#442ri/1.8/system/Rinda/NotifyTemplateEntry/pop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Retrieves a notification. Raises RequestExpiredError when this NotifyTemplateEntry expires.
full_name: Rinda::NotifyTemplateEntry#pop
is_singleton: false
name: pop
params: ()
visibility: public
PKi}[�:q\^^2ri/1.8/system/Rinda/NotifyTemplateEntry/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new NotifyTemplateEntry that watches <tt>place</tt> for +event+s that match <tt>tuple</tt>.
full_name: Rinda::NotifyTemplateEntry::new
is_singleton: true
name: new
params: (place, event, tuple, expires=nil)
visibility: public
PKi}[S,�((5ri/1.8/system/Rinda/NotifyTemplateEntry/notify-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Called by TupleSpace to notify this NotifyTemplateEntry of a new event.
full_name: Rinda::NotifyTemplateEntry#notify
is_singleton: false
name: notify
params: (ev)
visibility: public
PKi}[Y��nnFri/1.8/system/Rinda/NotifyTemplateEntry/cdesc-NotifyTemplateEntry.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A NotifyTemplateEntry is returned by TupleSpace#notify and is notified of TupleSpace changes. You may receive either your subscribed event or the 'close' event when iterating over notifications.
- !ruby/struct:SM::Flow::P 
  body: See TupleSpace#notify_event for valid notification types.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "  ts = Rinda::TupleSpace.new\n  observer = ts.notify 'write', [nil]\n\n  Thread.start do\n    observer.each { |t| p t }\n  end\n\n  3.times { |i| ts.write [i] }\n"
- !ruby/struct:SM::Flow::P 
  body: "Outputs:"
- !ruby/struct:SM::Flow::VERB 
  body: "  ['write', [0]]\n  ['write', [1]]\n  ['write', [2]]\n"
constants: []

full_name: Rinda::NotifyTemplateEntry
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: notify
- !ruby/object:RI::MethodSummary 
  name: pop
name: NotifyTemplateEntry
superclass: TemplateEntry
PKi}[W2>Q

.ri/1.8/system/Rinda/Tuple/init_with_ary-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Munges <tt>ary</tt> into a valid Tuple.
full_name: Rinda::Tuple#init_with_ary
is_singleton: false
name: init_with_ary
params: (ary)
visibility: private
PKi}[k��J��%ri/1.8/system/Rinda/Tuple/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The number of elements in the tuple.
full_name: Rinda::Tuple#size
is_singleton: false
name: size
params: ()
visibility: public
PKi}[U�[���'ri/1.8/system/Rinda/Tuple/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Accessor method for elements of the tuple.
full_name: Rinda::Tuple#[]
is_singleton: false
name: "[]"
params: (k)
visibility: public
PKi}[�J�((*ri/1.8/system/Rinda/Tuple/cdesc-Tuple.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A tuple is the elementary object in Rinda programming. Tuples may be matched against templates if the tuple and the template are the same size.
constants: []

full_name: Rinda::Tuple
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: fetch
- !ruby/object:RI::MethodSummary 
  name: hash?
- !ruby/object:RI::MethodSummary 
  name: init_with_ary
- !ruby/object:RI::MethodSummary 
  name: init_with_hash
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: value
name: Tuple
superclass: Object
PKi}[�
��ZZ%ri/1.8/system/Rinda/Tuple/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (k, v)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterate through the tuple, yielding the index or key, and the value, thus ensuring arrays are iterated similarly to hashes.
full_name: Rinda::Tuple#each
is_singleton: false
name: each
params: ( {|k, v| ...}
visibility: public
PKi}[�I�f��(ri/1.8/system/Rinda/Tuple/hash%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Rinda::Tuple#hash?
is_singleton: false
name: hash?
params: (ary_or_hash)
visibility: private
PKi}[f��W

/ri/1.8/system/Rinda/Tuple/init_with_hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Ensures <tt>hash</tt> is a valid Tuple.
full_name: Rinda::Tuple#init_with_hash
is_singleton: false
name: init_with_hash
params: (hash)
visibility: private
PKi}[��1##$ri/1.8/system/Rinda/Tuple/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new Tuple from <tt>ary_or_hash</tt> which must be an Array or Hash.
full_name: Rinda::Tuple::new
is_singleton: true
name: new
params: (ary_or_hash)
visibility: public
PKi}[Ä
��&ri/1.8/system/Rinda/Tuple/value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the tuple itself
full_name: Rinda::Tuple#value
is_singleton: false
name: value
params: ()
visibility: public
PKi}[3*��&ri/1.8/system/Rinda/Tuple/fetch-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Fetches item <tt>k</tt> from the tuple.
full_name: Rinda::Tuple#fetch
is_singleton: false
name: fetch
params: (k)
visibility: public
PKi}[8A��(ri/1.8/system/ParseDate/parsedate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Parse a string representation of a date into values. For example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'parsedate'\n\n  ParseDate.parsedate &quot;Tuesday, July 5th, 2007, 18:35:20 UTC&quot;\n  # =&gt; [2007, 7, 5, 18, 35, 20, &quot;UTC&quot;, 2]\n"
- !ruby/struct:SM::Flow::P 
  body: The order is of the form [year, month, day of month, hour, minute, second, timezone, day of week].
- !ruby/struct:SM::Flow::P 
  body: "ParseDate.parsedate can also take a second argument, <tt>comp</tt>, which is a boolean telling the method to compensate for dates with years expressed as two digits. Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'parsedate'\n\n  ParseDate.parsedate &quot;Mon Dec 25 00 06:53:24 UTC&quot;, true\n  # =&gt; [2000, 12, 25, 6, 53, 24, &quot;UTC&quot;, 1]\n"
full_name: ParseDate#parsedate
is_singleton: false
name: parsedate
params: (str, comp=false)
visibility: public
PKi}[̊�e��,ri/1.8/system/ParseDate/cdesc-ParseDate.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: ParseDate
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parsedate
name: ParseDate
superclass: 
PKi}[_]*��"ri/1.8/system/Singleton/dup-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Singleton#dup
is_singleton: false
name: dup
params: ()
visibility: public
PKi}[k�a��,ri/1.8/system/Singleton/cdesc-Singleton.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The Singleton module implements the Singleton pattern.
- !ruby/struct:SM::Flow::P 
  body: "Usage:"
- !ruby/struct:SM::Flow::VERB 
  body: "   class Klass\n      include Singleton\n      # ...\n   end\n"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: this ensures that only one instance of Klass lets call it ``the instance'' can be created.
  - !ruby/struct:SM::Flow::P 
    body: "a,b = Klass.instance, Klass.instance a == b # =&gt; true a.new # NoMethodError - new is private ..."
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: ``The instance'' is created at instantiation time, in other words the first call of Klass.instance(), thus
  - !ruby/struct:SM::Flow::VERB 
    body: "  class OtherKlass\n    include Singleton\n    # ...\n  end\n  ObjectSpace.each_object(OtherKlass){} # =&gt; 0.\n"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: This behavior is preserved under inheritance and cloning.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: This is achieved by marking
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Klass.new and Klass.allocate - as private
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: Providing (or modifying) the class methods
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Klass.inherited(sub_klass) and Klass.clone() - to ensure that the Singleton pattern is properly inherited and cloned.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "Klass.instance() - returning ``the instance''. After a successful self modifying (normally the first) call the method body is a simple:"
  - !ruby/struct:SM::Flow::VERB 
    body: "   def Klass.instance()\n     return @<em>instance</em>\n   end\n"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Klass._load(str) - calling Klass.instance()
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Klass._instantiate?() - returning ``the instance'' or nil. This hook method puts a second (or nth) thread calling Klass.instance() on a waiting loop. The return value signifies the successful completion or premature termination of the first, or more generally, current &quot;instantiation thread&quot;.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: The instance method of Singleton are
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: clone and dup - raising TypeErrors to prevent cloning or duping
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: _dump(depth) - returning the empty string. Marshalling strips by default all state information, e.g. instance variables and taint state, from ``the instance''. Providing custom _load(str) and _dump(depth) hooks allows the (partially) resurrections of a previous state of ``the instance''.
  type: :BULLET
constants: []

full_name: Singleton
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: _dump
- !ruby/object:RI::MethodSummary 
  name: clone
- !ruby/object:RI::MethodSummary 
  name: dup
name: Singleton
superclass: 
PKi}[}i�d��$ri/1.8/system/Singleton/clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: disable build-in copying methods
full_name: Singleton#clone
is_singleton: false
name: clone
params: ()
visibility: public
PKi}[ųK���$ri/1.8/system/Singleton/_dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: default marshalling strategy
full_name: Singleton#_dump
is_singleton: false
name: _dump
params: (depth=-1)
visibility: public
PKi}[�K3�� ri/1.8/system/DateTime/jd-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new DateTime object corresponding to the specified Julian Day Number <tt>jd</tt> and hour <tt>h</tt>, minute <tt>min</tt>, second <tt>s</tt>.
- !ruby/struct:SM::Flow::P 
  body: The 24-hour clock is used. Negative values of <tt>h</tt>, <tt>min</tt>, and <tt>sec</tt> are treating as counting backwards from the end of the next larger unit (e.g. a <tt>min</tt> of -2 is treated as 58). No wraparound is performed. If an invalid time portion is specified, an ArgumentError is raised.
- !ruby/struct:SM::Flow::P 
  body: <tt>of</tt> is the offset from UTC as a fraction of a day (defaults to 0). <tt>sg</tt> specifies the Day of Calendar Reform.
- !ruby/struct:SM::Flow::P 
  body: All day/time values default to 0.
full_name: DateTime::jd
is_singleton: true
name: jd
params: (jd=0, h=0, min=0, s=0, of=0, sg=ITALY)
visibility: public
PKi}[��9#ri/1.8/system/DateTime/civil-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new DateTime object corresponding to the specified Civil Date and hour <tt>h</tt>, minute <tt>min</tt>, second <tt>s</tt>.
- !ruby/struct:SM::Flow::P 
  body: The 24-hour clock is used. Negative values of <tt>h</tt>, <tt>min</tt>, and <tt>sec</tt> are treating as counting backwards from the end of the next larger unit (e.g. a <tt>min</tt> of -2 is treated as 58). No wraparound is performed. If an invalid time portion is specified, an ArgumentError is raised.
- !ruby/struct:SM::Flow::P 
  body: <tt>of</tt> is the offset from UTC as a fraction of a day (defaults to 0). <tt>sg</tt> specifies the Day of Calendar Reform.
- !ruby/struct:SM::Flow::P 
  body: <tt>y</tt> defaults to -4712, <tt>m</tt> to 1, and <tt>d</tt> to 1; this is Julian Day Number day 0. The time values default to 0.
full_name: DateTime::civil
is_singleton: true
name: civil
params: (y=-4712, m=1, d=1, h=0, min=0, s=0, of=0, sg=ITALY)
visibility: public
PKi}[�����#ri/1.8/system/DateTime/parse-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new DateTime object by parsing from a String, without specifying the format.
- !ruby/struct:SM::Flow::P 
  body: "<tt>str</tt> is a String holding a date-time representation. <tt>comp</tt> specifies whether to interpret 2-digit years as 19XX (&gt;= 69) or 20XX (&lt; 69); the default is not to. The method will attempt to parse a date-time from the String using various heuristics; see #_parse in date/format.rb for more details. If parsing fails, an ArgumentError will be raised."
- !ruby/struct:SM::Flow::P 
  body: The default <tt>str</tt> is '-4712-01-01T00:00:00+00:00'; this is Julian Day Number day 0.
- !ruby/struct:SM::Flow::P 
  body: <tt>sg</tt> specifies the Day of Calendar Reform.
full_name: DateTime::parse
is_singleton: true
name: parse
params: (str='-4712-01-01T00:00:00+00:00', comp=false, sg=ITALY)
visibility: public
PKi}[�����'ri/1.8/system/DateTime/_strptime-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DateTime::_strptime
is_singleton: true
name: _strptime
params: (str, fmt='%FT%T%z')
visibility: public
PKi}[.�#%��&ri/1.8/system/DateTime/strftime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DateTime#strftime
is_singleton: false
name: strftime
params: (fmt='%FT%T%:z')
visibility: public
PKi}[��z���&ri/1.8/system/DateTime/strptime-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new DateTime object by parsing from a String according to a specified format.
- !ruby/struct:SM::Flow::P 
  body: <tt>str</tt> is a String holding a date-time representation. <tt>fmt</tt> is the format that the date-time is in. See date/format.rb for details on supported formats.
- !ruby/struct:SM::Flow::P 
  body: The default <tt>str</tt> is '-4712-01-01T00:00:00+00:00', and the default <tt>fmt</tt> is '%FT%T%z'. This gives midnight on Julian Day Number day 0.
- !ruby/struct:SM::Flow::P 
  body: <tt>sg</tt> specifies the Day of Calendar Reform.
- !ruby/struct:SM::Flow::P 
  body: An ArgumentError will be raised if <tt>str</tt> cannot be parsed.
full_name: DateTime::strptime
is_singleton: true
name: strptime
params: (str='-4712-01-01T00:00:00+00:00', fmt='%FT%T%z', sg=ITALY)
visibility: public
PKi}[O�6~��"ri/1.8/system/DateTime/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: ":minute, :second, :second_fraction"
full_name: DateTime#to_s
is_singleton: false
name: to_s
params: (
visibility: public
PKi}[)ƸQSS(ri/1.8/system/DateTime/commercial-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new DateTime object corresponding to the specified Commercial Date and hour <tt>h</tt>, minute <tt>min</tt>, second <tt>s</tt>.
- !ruby/struct:SM::Flow::P 
  body: The 24-hour clock is used. Negative values of <tt>h</tt>, <tt>min</tt>, and <tt>sec</tt> are treating as counting backwards from the end of the next larger unit (e.g. a <tt>min</tt> of -2 is treated as 58). No wraparound is performed. If an invalid time portion is specified, an ArgumentError is raised.
- !ruby/struct:SM::Flow::P 
  body: <tt>of</tt> is the offset from UTC as a fraction of a day (defaults to 0). <tt>sg</tt> specifies the Day of Calendar Reform.
- !ruby/struct:SM::Flow::P 
  body: <tt>y</tt> defaults to 1582, <tt>w</tt> to 41, and <tt>d</tt> to 5; this is the Day of Calendar Reform for Italy and the Catholic countries. The time values default to 0.
full_name: DateTime::commercial
is_singleton: true
name: commercial
params: (y=1582, w=41, d=5, h=0, min=0, s=0, of=0, sg=ITALY)
visibility: public
PKi}[d~�z�	�	*ri/1.8/system/DateTime/cdesc-DateTime.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: _strptime
- !ruby/object:RI::MethodSummary 
  name: civil
- !ruby/object:RI::MethodSummary 
  name: commercial
- !ruby/object:RI::MethodSummary 
  name: jd
- !ruby/object:RI::MethodSummary 
  name: ordinal
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: strptime
comment: 
- !ruby/struct:SM::Flow::P 
  body: Class representing a date and time.
- !ruby/struct:SM::Flow::P 
  body: See the documentation to the file date.rb for an overview.
- !ruby/struct:SM::Flow::P 
  body: DateTime objects are immutable once created.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Other methods.
- !ruby/struct:SM::Flow::P 
  body: The following methods are defined in Date, but declared private there. They are made public in DateTime. They are documented here.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: hour()
- !ruby/struct:SM::Flow::P 
  body: Get the hour-of-the-day of the time. This is given using the 24-hour clock, counting from midnight. The first hour after midnight is hour 0; the last hour of the day is hour 23.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: min()
- !ruby/struct:SM::Flow::P 
  body: Get the minute-of-the-hour of the time.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: sec()
- !ruby/struct:SM::Flow::P 
  body: Get the second-of-the-minute of the time.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: sec_fraction()
- !ruby/struct:SM::Flow::P 
  body: Get the fraction of a second of the time. This is returned as a <tt>Rational</tt>. The unit is in days. I do NOT recommend you to use this method.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: zone()
- !ruby/struct:SM::Flow::P 
  body: Get the time zone as a String. This is representation of the time offset such as &quot;+1000&quot;, not the true time-zone name.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: offset()
- !ruby/struct:SM::Flow::P 
  body: Get the time zone offset as a fraction of a day. This is returned as a <tt>Rational</tt>.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: new_offset(of=0)
- !ruby/struct:SM::Flow::P 
  body: Create a new DateTime object, identical to the current one, except with a new time zone offset of <tt>of</tt>. <tt>of</tt> is the new offset from UTC as a fraction of a day.
constants: []

full_name: DateTime
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: strftime
- !ruby/object:RI::MethodSummary 
  name: to_s
name: DateTime
superclass: Date
PKi}[^N�%ri/1.8/system/DateTime/ordinal-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new DateTime object corresponding to the specified Ordinal Date and hour <tt>h</tt>, minute <tt>min</tt>, second <tt>s</tt>.
- !ruby/struct:SM::Flow::P 
  body: The 24-hour clock is used. Negative values of <tt>h</tt>, <tt>min</tt>, and <tt>sec</tt> are treating as counting backwards from the end of the next larger unit (e.g. a <tt>min</tt> of -2 is treated as 58). No wraparound is performed. If an invalid time portion is specified, an ArgumentError is raised.
- !ruby/struct:SM::Flow::P 
  body: <tt>of</tt> is the offset from UTC as a fraction of a day (defaults to 0). <tt>sg</tt> specifies the Day of Calendar Reform.
- !ruby/struct:SM::Flow::P 
  body: <tt>y</tt> defaults to -4712, and <tt>d</tt> to 1; this is Julian Day Number day 0. The time values default to 0.
full_name: DateTime::ordinal
is_singleton: true
name: ordinal
params: (y=-4712, d=1, h=0, min=0, s=0, of=0, sg=ITALY)
visibility: public
PKi}[R�
�� ri/1.8/system/List/update-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds <tt>sw</tt> according to <tt>sopts</tt>, <tt>lopts</tt> and <tt>nlopts</tt>.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+sw+:"
    body: OptionParser::Switch instance to be added.
  - !ruby/struct:SM::Flow::LI 
    label: "+sopts+:"
    body: Short style option list.
  - !ruby/struct:SM::Flow::LI 
    label: "+lopts+:"
    body: Long style option list.
  - !ruby/struct:SM::Flow::LI 
    label: "+nlopts+:"
    body: Negated long style options list.
  type: :NOTE
full_name: List#update
is_singleton: false
name: update
params: (sw, sopts, lopts, nsw = nil, nlopts = nil)
visibility: private
PKi}[��0%ri/1.8/system/List/each_option-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over each option, passing the option to the <tt>block</tt>.
full_name: List#each_option
is_singleton: false
name: each_option
params: (&block)
visibility: public
PKi}[�	��"ri/1.8/system/List/cdesc-List.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Map from acceptable argument types to pattern and converter pairs.
  name: atype
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: List of all switches and summary string.
  name: list
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Map from long style option switches to actual switch objects.
  name: long
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Map from short style option switches to actual switch objects.
  name: short
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Simple option list providing mapping from short and/or long option string to OptionParser::Switch and mapping from acceptable argument to matching pattern and converter pair. Also provides summary feature.
constants: []

full_name: List
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: accept
- !ruby/object:RI::MethodSummary 
  name: append
- !ruby/object:RI::MethodSummary 
  name: complete
- !ruby/object:RI::MethodSummary 
  name: each_option
- !ruby/object:RI::MethodSummary 
  name: prepend
- !ruby/object:RI::MethodSummary 
  name: reject
- !ruby/object:RI::MethodSummary 
  name: search
- !ruby/object:RI::MethodSummary 
  name: summarize
- !ruby/object:RI::MethodSummary 
  name: update
name: List
superclass: Object
PKi}[R����ri/1.8/system/List/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Just initializes all instance variables.
full_name: List::new
is_singleton: true
name: new
params: ()
visibility: public
PKi}[��7@�� ri/1.8/system/List/append-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Appends <tt>switch</tt> at the tail of the list, and associates short, long and negated long options. Arguments are:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+switch+:"
    body: OptionParser::Switch instance to be inserted.
  - !ruby/struct:SM::Flow::LI 
    label: "+short_opts+:"
    body: List of short style options.
  - !ruby/struct:SM::Flow::LI 
    label: "+long_opts+:"
    body: List of long style options.
  - !ruby/struct:SM::Flow::LI 
    label: "+nolong_opts+:"
    body: List of long style options with &quot;no-&quot; prefix.
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: "  append(switch, short_opts, long_opts, nolong_opts)\n"
full_name: List#append
is_singleton: false
name: append
params: (*args)
visibility: public
PKi}[�{�m�� ri/1.8/system/List/reject-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See OptionParser.reject.
full_name: List#reject
is_singleton: false
name: reject
params: (t)
visibility: public
PKi}[�t��� ri/1.8/system/List/accept-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See OptionParser.accept.
full_name: List#accept
is_singleton: false
name: accept
params: (t, pat = /.*/nm, &block)
visibility: public
PKi}[V�wVff ri/1.8/system/List/search-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (val)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Searches <tt>key</tt> in <tt>id</tt> list. The result is returned or yielded if a block is given. If it isn't found, nil is returned.
full_name: List#search
is_singleton: false
name: search
params: (id, key) {|val| ...}
visibility: public
PKi}[#4̶��"ri/1.8/system/List/complete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Searches list <tt>id</tt> for <tt>opt</tt> and the optional patterns for completion <tt>pat</tt>. If <tt>icase</tt> is true, the search is case insensitive. The result is returned or yielded if a block is given. If it isn't found, nil is returned.
full_name: List#complete
is_singleton: false
name: complete
params: (id, opt, icase = false, *pat, &block)
visibility: public
PKi}[�Yb��#ri/1.8/system/List/summarize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates the summary table, passing each line to the <tt>block</tt> (without newline). The arguments <tt>args</tt> are passed along to the summarize method which is called on every option.
full_name: List#summarize
is_singleton: false
name: summarize
params: (*args, &block)
visibility: public
PKi}[�<j��!ri/1.8/system/List/prepend-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Inserts <tt>switch</tt> at the head of the list, and associates short, long and negated long options. Arguments are:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+switch+:"
    body: OptionParser::Switch instance to be inserted.
  - !ruby/struct:SM::Flow::LI 
    label: "+short_opts+:"
    body: List of short style options.
  - !ruby/struct:SM::Flow::LI 
    label: "+long_opts+:"
    body: List of long style options.
  - !ruby/struct:SM::Flow::LI 
    label: "+nolong_opts+:"
    body: List of long style options with &quot;no-&quot; prefix.
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: "  prepend(switch, short_opts, long_opts, nolong_opts)\n"
full_name: List#prepend
is_singleton: false
name: prepend
params: (*args)
visibility: public
PKi}[��]7��"ri/1.8/system/GServer/serve-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: GServer#serve
is_singleton: false
name: serve
params: (io)
visibility: public
PKj}[[�f��%ri/1.8/system/GServer/shutdown-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: GServer#shutdown
is_singleton: false
name: shutdown
params: ()
visibility: public
PKj}[���'ri/1.8/system/GServer/stopped%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: GServer#stopped?
is_singleton: false
name: stopped?
params: ()
visibility: public
PKj}[�AMs��!ri/1.8/system/GServer/stop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: GServer#stop
is_singleton: false
name: stop
params: ()
visibility: public
PKj}[V���!ri/1.8/system/GServer/stop-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: GServer::stop
is_singleton: true
name: stop
params: (port, host = DEFAULT_HOST)
visibility: public
PKj}[��#���%ri/1.8/system/GServer/starting-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: GServer#starting
is_singleton: false
name: starting
params: ()
visibility: protected
PKj}[�E2���"ri/1.8/system/GServer/error-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: GServer#error
is_singleton: false
name: error
params: (detail)
visibility: protected
PKj}[�X>��*ri/1.8/system/GServer/in_service%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: GServer::in_service?
is_singleton: true
name: in_service?
params: (port, host = DEFAULT_HOST)
visibility: public
PKj}[�肏��*ri/1.8/system/GServer/disconnecting-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: GServer#disconnecting
is_singleton: false
name: disconnecting
params: (clientPort)
visibility: protected
PKj}[�@h�� ri/1.8/system/GServer/log-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: GServer#log
is_singleton: false
name: log
params: (msg)
visibility: protected
PKj}[�r'�� ri/1.8/system/GServer/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: GServer::new
is_singleton: true
name: new
params: (port, host = DEFAULT_HOST, maxConnections = 4, stdlog = $stderr, audit = false, debug = false)
visibility: public
PKj}[�����"ri/1.8/system/GServer/start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: GServer#start
is_singleton: false
name: start
params: (maxConnections = -1)
visibility: public
PKj}[S6~~(ri/1.8/system/GServer/cdesc-GServer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: audit
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: debug
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: host
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: maxConnections
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: port
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: stdlog
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: in_service?
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: stop
comment: 
- !ruby/struct:SM::Flow::P 
  body: GServer implements a generic server, featuring thread pool management, simple logging, and multi-server management. See HttpServer in <tt>xmlrpc/httpserver.rb</tt> in the Ruby standard library for an example of GServer in action.
- !ruby/struct:SM::Flow::P 
  body: Any kind of application-level server can be implemented using this class. It accepts multiple simultaneous connections from clients, up to an optional maximum number. Several <em>services</em> (i.e. one service per TCP port) can be run simultaneously, and stopped at any time through the class method <tt>GServer.stop(port)</tt>. All the threading issues are handled, saving you the effort. All events are optionally logged, but you can provide your own event handlers if you wish.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::P 
  body: "Using GServer is simple. Below we implement a simple time server, run it, query it, and shut it down. Try this code in <tt>irb</tt>:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'gserver'\n\n  #\n  # A server that returns the time in seconds since 1970.\n  #\n  class TimeServer &lt; GServer\n    def initialize(port=10001, *args)\n      super(port, *args)\n    end\n    def serve(io)\n      io.puts(Time.now.to_i)\n    end\n  end\n\n  # Run the server with logging enabled (it's a separate thread).\n  server = TimeServer.new\n  server.audit = true                  # Turn logging on.\n  server.start\n\n  # *** Now point your browser to http://localhost:10001 to see it working ***\n\n  # See if it's still running.\n  GServer.in_service?(10001)           # -&gt; true\n  server.stopped?                      # -&gt; false\n\n  # Shut the server down gracefully.\n  server.shutdown\n\n  # Alternatively, stop it immediately.\n  GServer.stop(10001)\n  # or, of course, &quot;server.stop&quot;.\n"
- !ruby/struct:SM::Flow::P 
  body: All the business of accepting connections and exception handling is taken care of. All we have to do is implement the method that actually serves the client.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Advanced
- !ruby/struct:SM::Flow::P 
  body: As the example above shows, the way to use GServer is to subclass it to create a specific server, overriding the <tt>serve</tt> method. You can override other methods as well if you wish, perhaps to collect statistics, or emit more detailed logging.
- !ruby/struct:SM::Flow::VERB 
  body: "  connecting\n  disconnecting\n  starting\n  stopping\n"
- !ruby/struct:SM::Flow::P 
  body: The above methods are only called if auditing is enabled.
- !ruby/struct:SM::Flow::P 
  body: You can also override <tt>log</tt> and <tt>error</tt> if, for example, you wish to use a more sophisticated logging system.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: DEFAULT_HOST
  value: "\"127.0.0.1\""
full_name: GServer
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: connecting
- !ruby/object:RI::MethodSummary 
  name: connections
- !ruby/object:RI::MethodSummary 
  name: disconnecting
- !ruby/object:RI::MethodSummary 
  name: error
- !ruby/object:RI::MethodSummary 
  name: join
- !ruby/object:RI::MethodSummary 
  name: log
- !ruby/object:RI::MethodSummary 
  name: serve
- !ruby/object:RI::MethodSummary 
  name: shutdown
- !ruby/object:RI::MethodSummary 
  name: start
- !ruby/object:RI::MethodSummary 
  name: starting
- !ruby/object:RI::MethodSummary 
  name: stop
- !ruby/object:RI::MethodSummary 
  name: stopped?
- !ruby/object:RI::MethodSummary 
  name: stopping
name: GServer
superclass: Object
PKj}[A����!ri/1.8/system/GServer/join-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: GServer#join
is_singleton: false
name: join
params: ()
visibility: public
PKj}[б�(ri/1.8/system/GServer/connections-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: GServer#connections
is_singleton: false
name: connections
params: ()
visibility: public
PKj}[ncG���'ri/1.8/system/GServer/connecting-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: GServer#connecting
is_singleton: false
name: connecting
params: (client)
visibility: protected
PKj}[�т��%ri/1.8/system/GServer/stopping-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: GServer#stopping
is_singleton: false
name: stopping
params: ()
visibility: protected
PKj}[�I�ZZ5ri/1.8/system/TemplatePage/Context/find_scalar-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Find a scalar value, throwing an exception if not found. This method is used when substituting the %xxx% constructs
full_name: TemplatePage::Context#find_scalar
is_singleton: false
name: find_scalar
params: (key)
visibility: public
PKj}[	N�8��-ri/1.8/system/TemplatePage/Context/pop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: TemplatePage::Context#pop
is_singleton: false
name: pop
params: ()
visibility: public
PKj}[��8K��-ri/1.8/system/TemplatePage/Context/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: TemplatePage::Context::new
is_singleton: true
name: new
params: ()
visibility: public
PKj}[��YI0ri/1.8/system/TemplatePage/Context/lookup-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Lookup any key in the stack of hashes
full_name: TemplatePage::Context#lookup
is_singleton: false
name: lookup
params: (key)
visibility: public
PKj}[e�*õ�.ri/1.8/system/TemplatePage/Context/push-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: TemplatePage::Context#push
is_singleton: false
name: push
params: (hash)
visibility: public
PKj}[	�cW��5ri/1.8/system/TemplatePage/Context/cdesc-Context.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A context holds a stack of key/value pairs (like a symbol table). When asked to resolve a key, it first searches the top of the stack, then the next level, and so on until it finds a match (or runs out of entries)
constants: []

full_name: TemplatePage::Context
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: find_scalar
- !ruby/object:RI::MethodSummary 
  name: lookup
- !ruby/object:RI::MethodSummary 
  name: pop
- !ruby/object:RI::MethodSummary 
  name: push
name: Context
superclass: Object
PKj}[��ju��/ri/1.8/system/TemplatePage/write_html_on-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Render the templates into HTML, storing the result on <tt>op</tt> using the method <tt>&lt;&lt;</tt>. The <tt>value_hash</tt> contains key/value pairs used to drive the substitution (as described above)
full_name: TemplatePage#write_html_on
is_singleton: false
name: write_html_on
params: (op, value_hash)
visibility: public
PKj}[�Q����%ri/1.8/system/TemplatePage/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>templates</tt> is an array of strings containing the templates. We start at the first, and substitute in subsequent ones where the string <tt>!INCLUDE!</tt> occurs. For example, we could have the overall page template containing
- !ruby/struct:SM::Flow::VERB 
  body: "  &lt;html&gt;&lt;body&gt;\n    &lt;h1&gt;Master&lt;/h1&gt;\n    !INCLUDE!\n  &lt;/bost&gt;&lt;/html&gt;\n"
- !ruby/struct:SM::Flow::P 
  body: and substitute subpages in to it by passing [master, sub_page]. This gives us a cheap way of framing pages
full_name: TemplatePage::new
is_singleton: true
name: new
params: (*templates)
visibility: public
PKj}[�O�)

1ri/1.8/system/TemplatePage/substitute_into-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Substitute a set of key/value pairs into the given template. Keys with scalar values have them substituted directly into the page. Those with array values invoke <tt>substitute_array</tt> (below), which examples a block of the template once for each row in the array.
- !ruby/struct:SM::Flow::P 
  body: "This routine also copes with the <tt>IF:</tt><em>key</em> directive, removing chunks of the template if the corresponding key does not appear in the hash, and the START: directive, which loops its contents for each value in an array"
full_name: TemplatePage#substitute_into
is_singleton: false
name: substitute_into
params: (lines, values)
visibility: public
PKj}["+MM-ri/1.8/system/TemplatePage/expand_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Given an individual line, we look for %xxx% constructs and HREF:ref:name: constructs, substituting for each."
full_name: TemplatePage#expand_line
is_singleton: false
name: expand_line
params: (line)
visibility: public
PKj}[-��
��1ri/1.8/system/TemplatePage/LineReader/read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: read the next line
full_name: TemplatePage::LineReader#read
is_singleton: false
name: read
params: ()
visibility: public
PKj}[�TFF7ri/1.8/system/TemplatePage/LineReader/read_up_to-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a list of lines up to the line that matches a pattern. That last line is discarded.
full_name: TemplatePage::LineReader#read_up_to
is_singleton: false
name: read_up_to
params: (pattern)
visibility: public
PKj}[D�bn0ri/1.8/system/TemplatePage/LineReader/dup-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a copy of ourselves that can be modified without affecting us
full_name: TemplatePage::LineReader#dup
is_singleton: false
name: dup
params: ()
visibility: public
PKj}[Bo�R0ri/1.8/system/TemplatePage/LineReader/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: we're initialized with an array of lines
full_name: TemplatePage::LineReader::new
is_singleton: true
name: new
params: (lines)
visibility: public
PKj}[�s���;ri/1.8/system/TemplatePage/LineReader/cdesc-LineReader.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Simple class to read lines out of a string
constants: []

full_name: TemplatePage::LineReader
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: dup
- !ruby/object:RI::MethodSummary 
  name: read
- !ruby/object:RI::MethodSummary 
  name: read_up_to
name: LineReader
superclass: Object
PKj}[�&TT2ri/1.8/system/TemplatePage/cdesc-TemplatePage.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Cheap-n-cheerful HTML page template system. You create a template containing:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: variable names between percent signs (<tt>%fred%</tt>)
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "blocks of repeating stuff:"
  - !ruby/struct:SM::Flow::VERB 
    body: "  START:key\n    ... stuff\n  END:key\n"
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: You feed the code a hash. For simple variables, the values are resolved directly from the hash. For blocks, the hash entry corresponding to <tt>key</tt> will be an array of hashes. The block will be generated once for each entry. Blocks can be nested arbitrarily deeply.
- !ruby/struct:SM::Flow::P 
  body: The template may also contain
- !ruby/struct:SM::Flow::VERB 
  body: "  IF:key\n    ... stuff\n  ENDIF:key\n"
- !ruby/struct:SM::Flow::P 
  body: <em>stuff</em> will only be included in the output if the corresponding key is set in the value hash.
- !ruby/struct:SM::Flow::P 
  body: "Usage: Given a set of templates <tt>T1, T2,</tt> etc"
- !ruby/struct:SM::Flow::VERB 
  body: "           values = { &quot;name&quot; =&gt; &quot;Dave&quot;, state =&gt; &quot;TX&quot; }\n\n           t = TemplatePage.new(T1, T2, T3)\n           File.open(name, &quot;w&quot;) {|f| t.write_html_on(f, values)}\n        or\n           res = ''\n           t.write_html_on(res, values)\n"
constants: []

full_name: TemplatePage
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: expand_line
- !ruby/object:RI::MethodSummary 
  name: substitute_into
- !ruby/object:RI::MethodSummary 
  name: write_html_on
name: TemplatePage
superclass: Object
PKj}[�
����&ri/1.8/system/PrettyPrint/flush-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: outputs buffered data.
full_name: PrettyPrint#flush
is_singleton: false
name: flush
params: ()
visibility: public
PKj}[�d%tt2ri/1.8/system/PrettyPrint/singleline_format-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: q
comment: 
- !ruby/struct:SM::Flow::P 
  body: This is similar to PrettyPrint::format but the result has no breaks.
- !ruby/struct:SM::Flow::P 
  body: <tt>maxwidth</tt>, <tt>newline</tt> and <tt>genspace</tt> are ignored.
- !ruby/struct:SM::Flow::P 
  body: The invocation of <tt>breakable</tt> in the block doesn't break a line and is treated as just an invocation of <tt>text</tt>.
full_name: PrettyPrint::singleline_format
is_singleton: true
name: singleline_format
params: (output='', maxwidth=nil, newline=nil, genspace=nil) {|q| ...}
visibility: public
PKj}[��߹�.ri/1.8/system/PrettyPrint/current_group-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint#current_group
is_singleton: false
name: current_group
params: ()
visibility: public
PKj}[U�g�0ri/1.8/system/PrettyPrint/Group/cdesc-Group.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: breakables
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: depth
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: PrettyPrint::Group
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: break
- !ruby/object:RI::MethodSummary 
  name: break?
- !ruby/object:RI::MethodSummary 
  name: first?
name: Group
superclass: Object
PKj}[Hϭ���/ri/1.8/system/PrettyPrint/Group/break%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint::Group#break?
is_singleton: false
name: break?
params: ()
visibility: public
PKj}[봡��*ri/1.8/system/PrettyPrint/Group/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint::Group::new
is_singleton: true
name: new
params: (depth)
visibility: public
PKj}[�F;���,ri/1.8/system/PrettyPrint/Group/break-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint::Group#break
is_singleton: false
name: break
params: ()
visibility: public
PKj}[���s��/ri/1.8/system/PrettyPrint/Group/first%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint::Group#first?
is_singleton: false
name: first?
params: ()
visibility: public
PKj}[��5ri/1.8/system/PrettyPrint/break_outmost_groups-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint#break_outmost_groups
is_singleton: false
name: break_outmost_groups
params: ()
visibility: public
PKj}[ON>;nn$ri/1.8/system/PrettyPrint/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a buffer for pretty printing.
- !ruby/struct:SM::Flow::P 
  body: <tt>output</tt> is an output target. If it is not specified, '' is assumed. It should have a &lt;&lt; method which accepts the first argument <tt>obj</tt> of PrettyPrint#text, the first argument <tt>sep</tt> of PrettyPrint#breakable, the first argument <tt>newline</tt> of PrettyPrint.new, and the result of a given block for PrettyPrint.new.
- !ruby/struct:SM::Flow::P 
  body: <tt>maxwidth</tt> specifies maximum line length. If it is not specified, 79 is assumed. However actual outputs may overflow <tt>maxwidth</tt> if long non-breakable texts are provided.
- !ruby/struct:SM::Flow::P 
  body: <tt>newline</tt> is used for line breaks. &quot;\n&quot; is used if it is not specified.
- !ruby/struct:SM::Flow::P 
  body: The block is used to generate spaces. {|width| ' ' * width} is used if it is not given.
full_name: PrettyPrint::new
is_singleton: true
name: new
params: (output='', maxwidth=79, newline="\n", &genspace)
visibility: public
PKj}[H����'ri/1.8/system/PrettyPrint/format-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: q
comment: 
- !ruby/struct:SM::Flow::P 
  body: "This is a convenience method which is same as follows:"
- !ruby/struct:SM::Flow::VERB 
  body: "  begin\n    q = PrettyPrint.new(output, maxwidth, newline, &amp;genspace)\n    ...\n    q.flush\n    output\n  end\n"
full_name: PrettyPrint::format
is_singleton: true
name: format
params: (output='', maxwidth=79, newline="\n", genspace=lambda {|n| ' ' * n} {|q| ...}
visibility: public
PKj}[�����1ri/1.8/system/PrettyPrint/SingleLine/flush-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint::SingleLine#flush
is_singleton: false
name: flush
params: ()
visibility: public
PKj}[T��&��/ri/1.8/system/PrettyPrint/SingleLine/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint::SingleLine::new
is_singleton: true
name: new
params: (output, maxwidth=nil, newline=nil)
visibility: public
PKj}[�Jf��0ri/1.8/system/PrettyPrint/SingleLine/nest-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
full_name: PrettyPrint::SingleLine#nest
is_singleton: false
name: nest
params: (indent) {|| ...}
visibility: public
PKj}[�=��0ri/1.8/system/PrettyPrint/SingleLine/text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint::SingleLine#text
is_singleton: false
name: text
params: (obj, width=nil)
visibility: public
PKj}[��4j:ri/1.8/system/PrettyPrint/SingleLine/cdesc-SingleLine.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: PrettyPrint::SingleLine
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: breakable
- !ruby/object:RI::MethodSummary 
  name: first?
- !ruby/object:RI::MethodSummary 
  name: flush
- !ruby/object:RI::MethodSummary 
  name: group
- !ruby/object:RI::MethodSummary 
  name: nest
- !ruby/object:RI::MethodSummary 
  name: text
name: SingleLine
superclass: Object
PKj}[a=^���5ri/1.8/system/PrettyPrint/SingleLine/breakable-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint::SingleLine#breakable
is_singleton: false
name: breakable
params: (sep=' ', width=nil)
visibility: public
PKj}[.�1ri/1.8/system/PrettyPrint/SingleLine/group-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
full_name: PrettyPrint::SingleLine#group
is_singleton: false
name: group
params: (indent=nil, open_obj='', close_obj='', open_width=nil, close_width=nil) {|| ...}
visibility: public
PKj}[�8Ʌ��4ri/1.8/system/PrettyPrint/SingleLine/first%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint::SingleLine#first?
is_singleton: false
name: first?
params: ()
visibility: public
PKj}[�ܠ���*ri/1.8/system/PrettyPrint/group_sub-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
full_name: PrettyPrint#group_sub
is_singleton: false
name: group_sub
params: () {|| ...}
visibility: public
PKj}[�99%ri/1.8/system/PrettyPrint/nest-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: Increases left margin after newline with <tt>indent</tt> for line breaks added in the block.
full_name: PrettyPrint#nest
is_singleton: false
name: nest
params: (indent) {|| ...}
visibility: public
PKj}[76�x��0ri/1.8/system/PrettyPrint/cdesc-PrettyPrint.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: genspace
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: group_queue
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: indent
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: maxwidth
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: newline
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: output
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: format
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: singleline_format
comment: 
- !ruby/struct:SM::Flow::P 
  body: This class implements a pretty printing algorithm. It finds line breaks and nice indentations for grouped structure.
- !ruby/struct:SM::Flow::P 
  body: "By default, the class assumes that primitive elements are strings and each byte in the strings have single column in width. But it can be used for other situations by giving suitable arguments for some methods:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: newline object and space generation block for PrettyPrint.new
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: optional width argument for PrettyPrint#text
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: PrettyPrint#breakable
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "There are several candidate uses:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: text formatting using proportional fonts
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: multibyte characters which has columns different to number of bytes
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: non-string formatting
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Bugs
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Box based formatting?
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Other (better) model/algorithm?
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 2
  text: References
- !ruby/struct:SM::Flow::P 
  body: Christian Lindig, Strictly Pretty, March 2000, http://www.st.cs.uni-sb.de/~lindig/papers/#pretty
- !ruby/struct:SM::Flow::P 
  body: Philip Wadler, A prettier printer, March 1998, http://homepages.inf.ed.ac.uk/wadler/topics/language-design.html#prettier
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Author
- !ruby/struct:SM::Flow::P 
  body: Tanaka Akira &lt;akr@m17n.org&gt;
constants: []

full_name: PrettyPrint
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: break_outmost_groups
- !ruby/object:RI::MethodSummary 
  name: breakable
- !ruby/object:RI::MethodSummary 
  name: current_group
- !ruby/object:RI::MethodSummary 
  name: fill_breakable
- !ruby/object:RI::MethodSummary 
  name: first?
- !ruby/object:RI::MethodSummary 
  name: flush
- !ruby/object:RI::MethodSummary 
  name: group
- !ruby/object:RI::MethodSummary 
  name: group_sub
- !ruby/object:RI::MethodSummary 
  name: nest
- !ruby/object:RI::MethodSummary 
  name: text
name: PrettyPrint
superclass: Object
PKj}[0m3���%ri/1.8/system/PrettyPrint/text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: This adds <tt>obj</tt> as a text of <tt>width</tt> columns in width.
- !ruby/struct:SM::Flow::P 
  body: If <tt>width</tt> is not specified, obj.length is used.
full_name: PrettyPrint#text
is_singleton: false
name: text
params: (obj, width=obj.length)
visibility: public
PKj}[��d��*ri/1.8/system/PrettyPrint/breakable-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: This tells &quot;you can break a line here if necessary&quot;, and a <tt>width</tt>\-column text <tt>sep</tt> is inserted if a line is not broken at the point.
- !ruby/struct:SM::Flow::P 
  body: If <tt>sep</tt> is not specified, &quot; &quot; is used.
- !ruby/struct:SM::Flow::P 
  body: If <tt>width</tt> is not specified, +sep.length+ is used. You will have to specify this when <tt>sep</tt> is a multibyte character, for example.
full_name: PrettyPrint#breakable
is_singleton: false
name: breakable
params: (sep=' ', width=sep.length)
visibility: public
PKj}[ӌE��/ri/1.8/system/PrettyPrint/fill_breakable-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint#fill_breakable
is_singleton: false
name: fill_breakable
params: (sep=' ', width=sep.length)
visibility: public
PKj}[�Y��/ri/1.8/system/PrettyPrint/GroupQueue/deq-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint::GroupQueue#deq
is_singleton: false
name: deq
params: ()
visibility: public
PKj}['(2��/ri/1.8/system/PrettyPrint/GroupQueue/enq-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint::GroupQueue#enq
is_singleton: false
name: enq
params: (group)
visibility: public
PKj}[Ic�t��2ri/1.8/system/PrettyPrint/GroupQueue/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint::GroupQueue#delete
is_singleton: false
name: delete
params: (group)
visibility: public
PKj}[S��q��/ri/1.8/system/PrettyPrint/GroupQueue/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint::GroupQueue::new
is_singleton: true
name: new
params: (*groups)
visibility: public
PKj}[T>��:ri/1.8/system/PrettyPrint/GroupQueue/cdesc-GroupQueue.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: PrettyPrint::GroupQueue
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: deq
- !ruby/object:RI::MethodSummary 
  name: enq
name: GroupQueue
superclass: Object
PKj}[�s����&ri/1.8/system/PrettyPrint/group-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: Groups line break hints added in the block. The line break hints are all to be used or not.
- !ruby/struct:SM::Flow::P 
  body: If <tt>indent</tt> is specified, the method call is regarded as nested by nest(indent) { ... }.
- !ruby/struct:SM::Flow::P 
  body: If <tt>open_obj</tt> is specified, <tt>text open_obj, open_width</tt> is called before grouping. If <tt>close_obj</tt> is specified, <tt>text close_obj, close_width</tt> is called after grouping.
full_name: PrettyPrint#group
is_singleton: false
name: group
params: (indent=0, open_obj='', close_obj='', open_width=open_obj.length, close_width=close_obj.length) {|| ...}
visibility: public
PKj}[�olL��1ri/1.8/system/PrettyPrint/Breakable/output-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint::Breakable#output
is_singleton: false
name: output
params: (out, output_width)
visibility: public
PKj}[�1�[��.ri/1.8/system/PrettyPrint/Breakable/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint::Breakable::new
is_singleton: true
name: new
params: (sep, width, q)
visibility: public
PKj}[9/���8ri/1.8/system/PrettyPrint/Breakable/cdesc-Breakable.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: indent
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: obj
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: width
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: PrettyPrint::Breakable
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: output
name: Breakable
superclass: Object
PKj}[��&P��)ri/1.8/system/PrettyPrint/first%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: first? is a predicate to test the call is a first call to first? with current group.
- !ruby/struct:SM::Flow::P 
  body: "It is useful to format comma separated values as:"
- !ruby/struct:SM::Flow::VERB 
  body: "  q.group(1, '[', ']') {\n    xxx.each {|yyy|\n      unless q.first?\n        q.text ','\n        q.breakable\n      end\n      ... pretty printing yyy ...\n    }\n  }\n"
- !ruby/struct:SM::Flow::P 
  body: first? is obsoleted in 1.8.2.
full_name: PrettyPrint#first?
is_singleton: false
name: first?
params: ()
visibility: public
PKj}[�n�%��,ri/1.8/system/PrettyPrint/Text/output-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint::Text#output
is_singleton: false
name: output
params: (out, output_width)
visibility: public
PKj}[/���.ri/1.8/system/PrettyPrint/Text/cdesc-Text.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: width
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: PrettyPrint::Text
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: output
name: Text
superclass: Object
PKj}[.-µ�)ri/1.8/system/PrettyPrint/Text/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint::Text#add
is_singleton: false
name: add
params: (obj, width)
visibility: public
PKj}[��#.��)ri/1.8/system/PrettyPrint/Text/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: PrettyPrint::Text::new
is_singleton: true
name: new
params: ()
visibility: public
PKj}[�E�#ri/1.8/system/StringIO/flush-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <b>strio</b> itself. Just for compatibility to IO.
full_name: StringIO#flush
is_singleton: false
name: flush
params: " strio.flush -> strio "
visibility: public
PKj}[)(qe��&ri/1.8/system/StringIO/readbyte-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#readchar.
full_name: StringIO#readbyte
is_singleton: false
name: readbyte
params: |
  strio.readchar   -> fixnum

visibility: public
PKj}[w!O�MM#ri/1.8/system/StringIO/lines-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#each.
full_name: StringIO#lines
is_singleton: false
name: lines
params: |
  strio.each(sep_string=$/)      {|line| block }  -> strio
  strio.each_line(sep_string=$/) {|line| block }  -> strio

visibility: public
PKj}[��K#ri/1.8/system/StringIO/chars-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#each_char.
full_name: StringIO#chars
is_singleton: false
name: chars
params: |
  strio.each_char {|char| block }  -> strio

visibility: public
PKj}[���		"ri/1.8/system/StringIO/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the size of the buffer string.
full_name: StringIO#size
is_singleton: false
name: size
params: |
  strio.size   -> integer

visibility: public
PKj}[ۂ����#ri/1.8/system/StringIO/fcntl-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Raises NotImplementedError.
full_name: StringIO#fcntl
is_singleton: false
name: fcntl
params: " strio.fcntl "
visibility: public
PKj}[Dl�F#ri/1.8/system/StringIO/fsync-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns 0. Just for compatibility to IO.
full_name: StringIO#fsync
is_singleton: false
name: fsync
params: " strio.fsync -> 0 "
visibility: public
PKj}[�T1�#ri/1.8/system/StringIO/print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#print.
full_name: StringIO#print
is_singleton: false
name: print
params: |
  strio.print()             -> nil
  strio.print(obj, ...)     -> nil

visibility: public
PKj}[W/�$ri/1.8/system/StringIO/printf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#printf.
full_name: StringIO#printf
is_singleton: false
name: printf
params: |
  strio.printf(format_string [, obj, ...] )   -> nil

visibility: public
PKj}[���KK"ri/1.8/system/StringIO/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#each.
full_name: StringIO#each
is_singleton: false
name: each
params: |
  strio.each(sep_string=$/)      {|line| block }  -> strio
  strio.each_line(sep_string=$/) {|line| block }  -> strio

visibility: public
PKj}[��Dk55$ri/1.8/system/StringIO/lineno-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the current line number in <b>strio</b>. The stringio must be opened for reading. <tt>lineno</tt> counts the number of times <tt>gets</tt> is called, rather than the number of newlines encountered. The two values will differ if <tt>gets</tt> is called with a separator other than newline. See also the <tt>$.</tt> variable.
full_name: StringIO#lineno
is_singleton: false
name: lineno
params: |
  strio.lineno    -> integer

visibility: public
PKj}[ܤb�$ri/1.8/system/StringIO/string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns underlying String object, the subject of IO.
full_name: StringIO#string
is_singleton: false
name: string
params: " strio.string     -> string\n"
visibility: public
PKj}[d�?"ri/1.8/system/StringIO/read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#read.
full_name: StringIO#read
is_singleton: false
name: read
params: |
  strio.read([length [, buffer]])    -> string, buffer, or nil

visibility: public
PKj}[��{

&ri/1.8/system/StringIO/readline-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#readline.
full_name: StringIO#readline
is_singleton: false
name: readline
params: |
  strio.readline(sep_string=$/)   -> string

visibility: public
PKj}[)Yz6UU'ri/1.8/system/StringIO/each_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#each.
full_name: StringIO#each_line
is_singleton: false
name: each_line
params: |
  strio.each(sep_string=$/)      {|line| block }  -> strio
  strio.each_line(sep_string=$/) {|line| block }  -> strio

visibility: public
PKj}[cOi%ri/1.8/system/StringIO/sysread-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Similar to #read, but raises <tt>EOFError</tt> at end of string instead of returning <tt>nil</tt>, as well as IO#sysread does."
full_name: StringIO#sysread
is_singleton: false
name: sysread
params: |
  strio.sysread(integer[, outbuf])    -> string

visibility: public
PKj}[k��V  %ri/1.8/system/StringIO/binmode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <b>strio</b> itself. Just for compatibility to IO.
full_name: StringIO#binmode
is_singleton: false
name: binmode
params: " strio.binmode -> true "
visibility: public
PKj}[�p"ri/1.8/system/StringIO/path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>nil</tt>. Just for compatibility to IO.
full_name: StringIO#path
is_singleton: false
name: path
params: " strio.path -> nil "
visibility: public
PKj}[i��!ri/1.8/system/StringIO/pid-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>nil</tt>. Just for compatibility to IO.
full_name: StringIO#pid
is_singleton: false
name: pid
params: " strio.pid -> nil "
visibility: public
PKj}[Rf�55"ri/1.8/system/StringIO/tell-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the current offset (in bytes) of <b>strio</b>.
full_name: StringIO#tell
is_singleton: false
name: tell
params: |
  strio.pos     -> integer
  strio.tell    -> integer

visibility: public
PKj}[b��/XX(ri/1.8/system/StringIO/close_read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Closes the read end of a StringIO. Will raise an <tt>IOError</tt> if the <b>strio</b> is not readable.
full_name: StringIO#close_read
is_singleton: false
name: close_read
params: |
  strio.close_read    -> nil

visibility: public
PKj}[��6���$ri/1.8/system/StringIO/rewind-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: StringIO#rewind
is_singleton: false
name: rewind
params: ()
visibility: public
PKj}[P 6��%ri/1.8/system/StringIO/getbyte-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#getc.
full_name: StringIO#getbyte
is_singleton: false
name: getbyte
params: |
  strio.getc   -> fixnum or nil

visibility: public
PKj}[�W�$ri/1.8/system/StringIO/ungetc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pushes back one character (passed as a parameter) onto <b>strio</b> such that a subsequent buffered read will return it. Pushing back behind the beginning of the buffer string is not possible. Nothing will be done if such an attempt is made. In other case, there is no limitation for multiple pushbacks.
full_name: StringIO#ungetc
is_singleton: false
name: ungetc
params: |
  strio.ungetc(integer)   -> nil

visibility: public
PKj}[��߇�!ri/1.8/system/StringIO/eof-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if <b>strio</b> is at end of file. The stringio must be opened for reading or an <tt>IOError</tt> will be raised.
full_name: StringIO#eof
is_singleton: false
name: eof
params: |
  strio.eof     -> true or false
  strio.eof?    -> true or false

visibility: public
PKj}[�>W55!ri/1.8/system/StringIO/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates new StringIO instance from with <em>string</em> and <em>mode</em>.
full_name: StringIO::new
is_singleton: true
name: new
params: " StringIO.new(string=\"\"[, mode])\n"
visibility: public
PKj}[*=ii]]'ri/1.8/system/StringIO/lineno%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Manually sets the current line number to the given value. <tt>$.</tt> is updated only on the next read.
full_name: StringIO#lineno=
is_singleton: false
name: lineno=
params: |
  strio.lineno = integer    -> integer

visibility: public
PKj}[Yh1q'ri/1.8/system/StringIO/each_byte-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#each_byte.
full_name: StringIO#each_byte
is_singleton: false
name: each_byte
params: |
  strio.each_byte {|byte| block }  -> strio

visibility: public
PKj}["Y{�,,$ri/1.8/system/StringIO/isatty-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>false</tt>. Just for compatibility to IO.
full_name: StringIO#isatty
is_singleton: false
name: isatty
params: |
  strio.isatty -> nil
  strio.tty? -> nil

visibility: public
PKj}[� �

#ri/1.8/system/StringIO/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Appends the given string to the underlying buffer string of <b>strio</b>. The stream must be opened for writing. If the argument is not a string, it will be converted to a string using <tt>to_s</tt>. Returns the number of bytes written. See IO#write.
full_name: StringIO#write
is_singleton: false
name: write
params: |
  strio.write(string)    -> integer
  strio.syswrite(string) -> integer

visibility: public
PKj}[<�j&ri/1.8/system/StringIO/syswrite-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Appends the given string to the underlying buffer string of <b>strio</b>. The stream must be opened for writing. If the argument is not a string, it will be converted to a string using <tt>to_s</tt>. Returns the number of bytes written. See IO#write.
full_name: StringIO#syswrite
is_singleton: false
name: syswrite
params: |
  strio.write(string)    -> integer
  strio.syswrite(string) -> integer

visibility: public
PKj}[�+2�HH'ri/1.8/system/StringIO/closed%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <b>strio</b> is completely closed, <tt>false</tt> otherwise.
full_name: StringIO#closed?
is_singleton: false
name: closed?
params: |
  strio.closed?    -> true or false

visibility: public
PKk}[{�r
"ri/1.8/system/StringIO/gets-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#gets.
full_name: StringIO#gets
is_singleton: false
name: gets
params: |
  strio.gets(sep_string=$/)   -> string or nil

visibility: public
PKk}[��QT��$ri/1.8/system/StringIO/eof%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #eof"
full_name: StringIO#eof?
is_singleton: false
name: eof?
params: ()
visibility: public
PKk}[}#��

$ri/1.8/system/StringIO/length-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the size of the buffer string.
full_name: StringIO#length
is_singleton: false
name: length
params: |
  strio.size   -> integer

visibility: public
PKk}[(2-^^&ri/1.8/system/StringIO/truncate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Truncates the buffer string to at most <em>integer</em> bytes. The <b>strio</b> must be opened for writing.
full_name: StringIO#truncate
is_singleton: false
name: truncate
params: |
  strio.truncate(integer)    -> 0

visibility: public
PKk}[��>;��$ri/1.8/system/StringIO/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#&lt;&lt;.
full_name: StringIO#<<
is_singleton: false
name: "<<"
params: |
  strio << obj     -> strio

visibility: public
PKk}[�STu��$ri/1.8/system/StringIO/reopen-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reinitializes <b>strio</b> with the given <em>other_StrIO</em> or <em>string</em> and <em>mode</em> (see StringIO#new).
full_name: StringIO#reopen
is_singleton: false
name: reopen
params: |
  strio.reopen(other_StrIO)     -> strio
  strio.reopen(string, mode)    -> strio

visibility: public
PKk}[�33!ri/1.8/system/StringIO/pos-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the current offset (in bytes) of <b>strio</b>.
full_name: StringIO#pos
is_singleton: false
name: pos
params: |
  strio.pos     -> integer
  strio.tell    -> integer

visibility: public
PKk}[lVD���"ri/1.8/system/StringIO/getc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#getc.
full_name: StringIO#getc
is_singleton: false
name: getc
params: |
  strio.getc   -> fixnum or nil

visibility: public
PKk}[s��(($ri/1.8/system/StringIO/tty%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>false</tt>. Just for compatibility to IO.
full_name: StringIO#tty?
is_singleton: false
name: tty?
params: |
  strio.isatty -> nil
  strio.tty? -> nil

visibility: public
PKk}[@�K\��"ri/1.8/system/StringIO/putc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#putc.
full_name: StringIO#putc
is_singleton: false
name: putc
params: |
  strio.putc(obj)    -> obj

visibility: public
PKk}[��dii#ri/1.8/system/StringIO/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Closes strio. The <b>strio</b> is unavailable for any further data operations; an <tt>IOError</tt> is raised if such an attempt is made.
full_name: StringIO#close
is_singleton: false
name: close
params: |
  strio.close  -> nil

visibility: public
PKk}[�;�)'ri/1.8/system/StringIO/each_char-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#each_char.
full_name: StringIO#each_char
is_singleton: false
name: each_char
params: |
  strio.each_char {|char| block }  -> strio

visibility: public
PKk}[���bb"ri/1.8/system/StringIO/seek-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Seeks to a given offset <em>amount</em> in the stream according to the value of <em>whence</em> (see IO#seek).
full_name: StringIO#seek
is_singleton: false
name: seek
params: |
  strio.seek(amount, whence=SEEK_SET) -> 0

visibility: public
PKk}[G1RR,ri/1.8/system/StringIO/closed_read%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <b>strio</b> is not readable, <tt>false</tt> otherwise.
full_name: StringIO#closed_read?
is_singleton: false
name: closed_read?
params: |
  strio.closed_read?    -> true or false

visibility: public
PKk}[Sll))%ri/1.8/system/StringIO/sync%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the argument unchanged. Just for compatibility to IO.
full_name: StringIO#sync=
is_singleton: false
name: sync=
params: " strio.sync = boolean -> boolean "
visibility: public
PKk}[T[S5��&ri/1.8/system/StringIO/readchar-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#readchar.
full_name: StringIO#readchar
is_singleton: false
name: readchar
params: |
  strio.readchar   -> fixnum

visibility: public
PKk}[$9$ri/1.8/system/StringIO/fileno-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>nil</tt>. Just for compatibility to IO.
full_name: StringIO#fileno
is_singleton: false
name: fileno
params: " strio.fileno -> nil "
visibility: public
PKk}[���;��"ri/1.8/system/StringIO/sync-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> always.
full_name: StringIO#sync
is_singleton: false
name: sync
params: |
  strio.sync    -> true

visibility: public
PKk}[9�:('ri/1.8/system/StringIO/readlines-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#readlines.
full_name: StringIO#readlines
is_singleton: false
name: readlines
params: |
  strio.readlines(sep_string=$/)  ->   array

visibility: public
PKk}[)y��$$$ri/1.8/system/StringIO/pos%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Seeks to the given position (in bytes) in <b>strio</b>.
full_name: StringIO#pos=
is_singleton: false
name: pos=
params: |
  strio.pos = integer    -> integer

visibility: public
PKk}[?�X&&'ri/1.8/system/StringIO/string%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Changes underlying String object, the subject of IO.
full_name: StringIO#string=
is_singleton: false
name: string=
params: |
  strio.string = string  -> string

visibility: public
PKk}[*n���"ri/1.8/system/StringIO/puts-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#puts.
full_name: StringIO#puts
is_singleton: false
name: puts
params: |
  strio.puts(obj, ...)    -> nil

visibility: public
PKk}[��/�
�
*ri/1.8/system/StringIO/cdesc-StringIO.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: open
comment: 
- !ruby/struct:SM::Flow::P 
  body: Pseudo I/O on String object.
constants: []

full_name: StringIO
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: binmode
- !ruby/object:RI::MethodSummary 
  name: bytes
- !ruby/object:RI::MethodSummary 
  name: chars
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: close_read
- !ruby/object:RI::MethodSummary 
  name: close_write
- !ruby/object:RI::MethodSummary 
  name: closed?
- !ruby/object:RI::MethodSummary 
  name: closed_read?
- !ruby/object:RI::MethodSummary 
  name: closed_write?
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: each_byte
- !ruby/object:RI::MethodSummary 
  name: each_char
- !ruby/object:RI::MethodSummary 
  name: each_line
- !ruby/object:RI::MethodSummary 
  name: eof
- !ruby/object:RI::MethodSummary 
  name: eof
- !ruby/object:RI::MethodSummary 
  name: eof?
- !ruby/object:RI::MethodSummary 
  name: eof?
- !ruby/object:RI::MethodSummary 
  name: fcntl
- !ruby/object:RI::MethodSummary 
  name: fileno
- !ruby/object:RI::MethodSummary 
  name: flush
- !ruby/object:RI::MethodSummary 
  name: fsync
- !ruby/object:RI::MethodSummary 
  name: getbyte
- !ruby/object:RI::MethodSummary 
  name: getc
- !ruby/object:RI::MethodSummary 
  name: gets
- !ruby/object:RI::MethodSummary 
  name: isatty
- !ruby/object:RI::MethodSummary 
  name: length
- !ruby/object:RI::MethodSummary 
  name: lineno
- !ruby/object:RI::MethodSummary 
  name: lineno=
- !ruby/object:RI::MethodSummary 
  name: lines
- !ruby/object:RI::MethodSummary 
  name: path
- !ruby/object:RI::MethodSummary 
  name: pid
- !ruby/object:RI::MethodSummary 
  name: pos
- !ruby/object:RI::MethodSummary 
  name: pos
- !ruby/object:RI::MethodSummary 
  name: pos=
- !ruby/object:RI::MethodSummary 
  name: print
- !ruby/object:RI::MethodSummary 
  name: printf
- !ruby/object:RI::MethodSummary 
  name: putc
- !ruby/object:RI::MethodSummary 
  name: puts
- !ruby/object:RI::MethodSummary 
  name: read
- !ruby/object:RI::MethodSummary 
  name: readbyte
- !ruby/object:RI::MethodSummary 
  name: readchar
- !ruby/object:RI::MethodSummary 
  name: readline
- !ruby/object:RI::MethodSummary 
  name: readline
- !ruby/object:RI::MethodSummary 
  name: readlines
- !ruby/object:RI::MethodSummary 
  name: reopen
- !ruby/object:RI::MethodSummary 
  name: rewind
- !ruby/object:RI::MethodSummary 
  name: rewind
- !ruby/object:RI::MethodSummary 
  name: seek
- !ruby/object:RI::MethodSummary 
  name: seek
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: string
- !ruby/object:RI::MethodSummary 
  name: string=
- !ruby/object:RI::MethodSummary 
  name: sync
- !ruby/object:RI::MethodSummary 
  name: sync=
- !ruby/object:RI::MethodSummary 
  name: sysread
- !ruby/object:RI::MethodSummary 
  name: syswrite
- !ruby/object:RI::MethodSummary 
  name: tell
- !ruby/object:RI::MethodSummary 
  name: truncate
- !ruby/object:RI::MethodSummary 
  name: tty?
- !ruby/object:RI::MethodSummary 
  name: ungetc
- !ruby/object:RI::MethodSummary 
  name: write
name: StringIO
superclass: Object
PKk}[.���UU-ri/1.8/system/StringIO/closed_write%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <b>strio</b> is not writable, <tt>false</tt> otherwise.
full_name: StringIO#closed_write?
is_singleton: false
name: closed_write?
params: |
  strio.closed_write?    -> true or false

visibility: public
PKk}[ʨM�]])ri/1.8/system/StringIO/close_write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Closes the write end of a StringIO. Will raise an <tt>IOError</tt> if the <b>strio</b> is not writeable.
full_name: StringIO#close_write
is_singleton: false
name: close_write
params: |
  strio.close_write    -> nil

visibility: public
PKk}[
�ʷ#ri/1.8/system/StringIO/bytes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See IO#each_byte.
full_name: StringIO#bytes
is_singleton: false
name: bytes
params: |
  strio.each_byte {|byte| block }  -> strio

visibility: public
PKk}[�U1���"ri/1.8/system/StringIO/open-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to StringIO.new except that when it is called with a block, it yields with the new instance and closes it, and returns the result which returned from the block.
full_name: StringIO::open
is_singleton: true
name: open
params: " StringIO.open(string=\"\"[, mode]) {|strio| ...}\n"
visibility: public
PKk}[�,���!ri/1.8/system/String/lines-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an enumerator that gives each line in the string. If a block is given, it iterates over each line in the string.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;foo\\nbar\\n&quot;.lines.to_a   #=&gt; [&quot;foo\\n&quot;, &quot;bar\\n&quot;]\n   &quot;foo\\nb ar&quot;.lines.sort    #=&gt; [&quot;b ar&quot;, &quot;foo\\n&quot;]\n"
full_name: String#lines
is_singleton: false
name: lines
params: |
  str.lines(separator=$/)   => anEnumerator
  str.lines(separator=$/) {|substr| block }        => str

visibility: public
PKk}[dֵn��"ri/1.8/system/String/center-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: If <em>integer</em> is greater than the length of <em>str</em>, returns a new <tt>String</tt> of length <em>integer</em> with <em>str</em> centered and padded with <em>padstr</em>; otherwise, returns <em>str</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hello&quot;.center(4)         #=&gt; &quot;hello&quot;\n   &quot;hello&quot;.center(20)        #=&gt; &quot;       hello        &quot;\n   &quot;hello&quot;.center(20, '123') #=&gt; &quot;1231231hello12312312&quot;\n"
full_name: String#center
is_singleton: false
name: center
params: |
  str.center(integer, padstr)   => new_str

visibility: public
PKk}[`�J!ri/1.8/system/String/chars-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an enumerator that gives each character in the string. If a block is given, it iterates over each character in the string.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;foo&quot;.chars.to_a   #=&gt; [&quot;f&quot;,&quot;o&quot;,&quot;o&quot;]\n"
full_name: String#chars
is_singleton: false
name: chars
params: |
  str.chars                   => anEnumerator
  str.chars {|substr| block } => str

visibility: public
PKk}[z�] ri/1.8/system/String/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the length of <em>str</em>.
full_name: String#size
is_singleton: false
name: size
params: |
  str.length   => integer

visibility: public
PKk}[/֘&ri/1.8/system/String/reverse%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reverses <em>str</em> in place.
full_name: String#reverse!
is_singleton: false
name: reverse!
params: |
  str.reverse!   => str

visibility: public
PKk}[Z�
N**"ri/1.8/system/String/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Two strings are equal if the have the same length and content.
full_name: String#eql?
is_singleton: false
name: eql?
params: |
  str.eql?(other)   => true or false

visibility: public
PKk}[���|	|	!ri/1.8/system/String/slice-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Element Reference---If passed a single <tt>Fixnum</tt>, returns the code of the character at that position. If passed two <tt>Fixnum</tt> objects, returns a substring starting at the offset given by the first, and a length given by the second. If given a range, a substring containing characters at offsets given by the range is returned. In all three cases, if an offset is negative, it is counted from the end of <em>str</em>. Returns <tt>nil</tt> if the initial offset falls outside the string, the length is negative, or the beginning of the range is greater than the end.
- !ruby/struct:SM::Flow::P 
  body: If a <tt>Regexp</tt> is supplied, the matching portion of <em>str</em> is returned. If a numeric parameter follows the regular expression, that component of the <tt>MatchData</tt> is returned instead. If a <tt>String</tt> is given, that string is returned if it occurs in <em>str</em>. In both cases, <tt>nil</tt> is returned if there is no match.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = &quot;hello there&quot;\n   a[1]                   #=&gt; 101\n   a[1,3]                 #=&gt; &quot;ell&quot;\n   a[1..3]                #=&gt; &quot;ell&quot;\n   a[-3,2]                #=&gt; &quot;er&quot;\n   a[-4..-2]              #=&gt; &quot;her&quot;\n   a[12..-1]              #=&gt; nil\n   a[-2..-4]              #=&gt; &quot;&quot;\n   a[/[aeiou](.)\\1/]      #=&gt; &quot;ell&quot;\n   a[/[aeiou](.)\\1/, 0]   #=&gt; &quot;ell&quot;\n   a[/[aeiou](.)\\1/, 1]   #=&gt; &quot;l&quot;\n   a[/[aeiou](.)\\1/, 2]   #=&gt; nil\n   a[&quot;lo&quot;]                #=&gt; &quot;lo&quot;\n   a[&quot;bye&quot;]               #=&gt; nil\n"
full_name: String#slice
is_singleton: false
name: slice
params: |
  str[fixnum]                 => fixnum or nil
  str[fixnum, fixnum]         => new_str or nil
  str[range]                  => new_str or nil
  str[regexp]                 => new_str or nil
  str[regexp, fixnum]         => new_str or nil
  str[other_str]              => new_str or nil
  str.slice(fixnum)           => fixnum or nil
  str.slice(fixnum, fixnum)   => new_str or nil
  str.slice(range)            => new_str or nil
  str.slice(regexp)           => new_str or nil
  str.slice(regexp, fixnum)   => new_str or nil
  str.slice(other_str)        => new_str or nil

visibility: public
PKk}[���[[$ri/1.8/system/String/slice%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes the specified portion from <em>str</em>, and returns the portion deleted. The forms that take a <tt>Fixnum</tt> will raise an <tt>IndexError</tt> if the value is out of range; the <tt>Range</tt> form will raise a <tt>RangeError</tt>, and the <tt>Regexp</tt> and <tt>String</tt> forms will silently ignore the assignment.
- !ruby/struct:SM::Flow::VERB 
  body: "   string = &quot;this is a string&quot;\n   string.slice!(2)        #=&gt; 105\n   string.slice!(3..6)     #=&gt; &quot; is &quot;\n   string.slice!(/s.*t/)   #=&gt; &quot;sa st&quot;\n   string.slice!(&quot;r&quot;)      #=&gt; &quot;r&quot;\n   string                  #=&gt; &quot;thing&quot;\n"
full_name: String#slice!
is_singleton: false
name: slice!
params: |
  str.slice!(fixnum)           => fixnum or nil
  str.slice!(fixnum, fixnum)   => new_str or nil
  str.slice!(range)            => new_str or nil
  str.slice!(regexp)           => new_str or nil
  str.slice!(other_str)        => new_str or nil

visibility: public
PKk}[��
��ri/1.8/system/String/tr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a copy of <em>str</em> with the characters in <em>from_str</em> replaced by the corresponding characters in <em>to_str</em>. If <em>to_str</em> is shorter than <em>from_str</em>, it is padded with its last character. Both strings may use the c1--c2 notation to denote ranges of characters, and <em>from_str</em> may start with a <tt>^</tt>, which denotes all characters except those listed.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hello&quot;.tr('aeiou', '*')    #=&gt; &quot;h*ll*&quot;\n   &quot;hello&quot;.tr('^aeiou', '*')   #=&gt; &quot;<b>e</b>*o&quot;\n   &quot;hello&quot;.tr('el', 'ip')      #=&gt; &quot;hippo&quot;\n   &quot;hello&quot;.tr('a-y', 'b-z')    #=&gt; &quot;ifmmp&quot;\n"
full_name: String#tr
is_singleton: false
name: tr
params: |
  str.tr(from_str, to_str)   => new_str

visibility: public
PKk}[F�����!ri/1.8/system/String/crypt-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Applies a one-way cryptographic hash to <em>str</em> by invoking the standard library function <tt>crypt</tt>. The argument is the salt string, which should be two characters long, each character drawn from <tt>[a-zA-Z0-9./]</tt>.
full_name: String#crypt
is_singleton: false
name: crypt
params: |
  str.crypt(other_str)   => new_str

visibility: public
PKk}[<p���ri/1.8/system/String/%25-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Format---Uses <em>str</em> as a format specification, and returns the result of applying it to <em>arg</em>. If the format specification contains more than one substitution, then <em>arg</em> must be an <tt>Array</tt> containing the values to be substituted. See <tt>Kernel::sprintf</tt> for details of the format string.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;%05d&quot; % 123                       #=&gt; &quot;00123&quot;\n   &quot;%-5s: %08x&quot; % [ &quot;ID&quot;, self.id ]   #=&gt; &quot;ID   : 200e14d6&quot;\n"
full_name: String#%
is_singleton: false
name: "%"
params: |
  str % arg   => new_str

visibility: public
PKl}[R��x	x	"ri/1.8/system/String/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Element Reference---If passed a single <tt>Fixnum</tt>, returns the code of the character at that position. If passed two <tt>Fixnum</tt> objects, returns a substring starting at the offset given by the first, and a length given by the second. If given a range, a substring containing characters at offsets given by the range is returned. In all three cases, if an offset is negative, it is counted from the end of <em>str</em>. Returns <tt>nil</tt> if the initial offset falls outside the string, the length is negative, or the beginning of the range is greater than the end.
- !ruby/struct:SM::Flow::P 
  body: If a <tt>Regexp</tt> is supplied, the matching portion of <em>str</em> is returned. If a numeric parameter follows the regular expression, that component of the <tt>MatchData</tt> is returned instead. If a <tt>String</tt> is given, that string is returned if it occurs in <em>str</em>. In both cases, <tt>nil</tt> is returned if there is no match.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = &quot;hello there&quot;\n   a[1]                   #=&gt; 101\n   a[1,3]                 #=&gt; &quot;ell&quot;\n   a[1..3]                #=&gt; &quot;ell&quot;\n   a[-3,2]                #=&gt; &quot;er&quot;\n   a[-4..-2]              #=&gt; &quot;her&quot;\n   a[12..-1]              #=&gt; nil\n   a[-2..-4]              #=&gt; &quot;&quot;\n   a[/[aeiou](.)\\1/]      #=&gt; &quot;ell&quot;\n   a[/[aeiou](.)\\1/, 0]   #=&gt; &quot;ell&quot;\n   a[/[aeiou](.)\\1/, 1]   #=&gt; &quot;l&quot;\n   a[/[aeiou](.)\\1/, 2]   #=&gt; nil\n   a[&quot;lo&quot;]                #=&gt; &quot;lo&quot;\n   a[&quot;bye&quot;]               #=&gt; nil\n"
full_name: String#[]
is_singleton: false
name: "[]"
params: |
  str[fixnum]                 => fixnum or nil
  str[fixnum, fixnum]         => new_str or nil
  str[range]                  => new_str or nil
  str[regexp]                 => new_str or nil
  str[regexp, fixnum]         => new_str or nil
  str[other_str]              => new_str or nil
  str.slice(fixnum)           => fixnum or nil
  str.slice(fixnum, fixnum)   => new_str or nil
  str.slice(range)            => new_str or nil
  str.slice(regexp)           => new_str or nil
  str.slice(regexp, fixnum)   => new_str or nil
  str.slice(other_str)        => new_str or nil

visibility: public
PKl}[���#ri/1.8/system/String/toutf16-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert <tt>self</tt> to UTF-16
- !ruby/struct:SM::Flow::P 
  body: <b>Note</b> This method decode MIME encoded string and convert halfwidth katakana to fullwidth katakana. If you don't want it, use NKF.nkf('-w16xm0', str).
full_name: String#toutf16
is_singleton: false
name: toutf16
params: |
  String#toutf16   -> string

visibility: public
PKl}[�kGk��"ri/1.8/system/String/tosjis-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert <tt>self</tt> to Shift_JIS
- !ruby/struct:SM::Flow::P 
  body: <b>Note</b> This method decode MIME encoded string and convert halfwidth katakana to fullwidth katakana. If you don't want it, use NKF.nkf('-sxm0', str).
full_name: String#tosjis
is_singleton: false
name: tosjis
params: |
  String#tosjis   -> string

visibility: public
PKl}[[��~��$ri/1.8/system/String/empty%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>str</em> has a length of zero.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hello&quot;.empty?   #=&gt; false\n   &quot;&quot;.empty?        #=&gt; true\n"
full_name: String#empty?
is_singleton: false
name: empty?
params: |
  str.empty?   => true or false

visibility: public
PKl}[�zEheeri/1.8/system/String/hex-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Treats leading characters from <em>str</em> as a string of hexadecimal digits (with an optional sign and an optional <tt>0x</tt>) and returns the corresponding number. Zero is returned on error.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;0x0a&quot;.hex     #=&gt; 10\n   &quot;-1234&quot;.hex    #=&gt; -4660\n   &quot;0&quot;.hex        #=&gt; 0\n   &quot;wombat&quot;.hex   #=&gt; 0\n"
full_name: String#hex
is_singleton: false
name: hex
params: |
  str.hex   => integer

visibility: public
PKl}[&���!ri/1.8/system/String/strip-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a copy of <em>str</em> with leading and trailing whitespace removed.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;    hello    &quot;.strip   #=&gt; &quot;hello&quot;\n   &quot;\\tgoodbye\\r\\n&quot;.strip   #=&gt; &quot;goodbye&quot;\n"
full_name: String#strip
is_singleton: false
name: strip
params: |
  str.strip   => new_str

visibility: public
PKl}[CKv��"ri/1.8/system/String/%3d%7e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Match---If <em>obj</em> is a <tt>Regexp</tt>, use it as a pattern to match against <em>str</em>,and returns the position the match starts, or <tt>nil</tt> if there is no match. Otherwise, invokes <em>obj.=~</em>, passing <em>str</em> as an argument. The default <tt>=~</tt> in <tt>Object</tt> returns <tt>false</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;cat o' 9 tails&quot; =~ /\\d/   #=&gt; 7\n   &quot;cat o' 9 tails&quot; =~ 9      #=&gt; false\n"
full_name: String#=~
is_singleton: false
name: =~
params: |
  str =~ obj   => fixnum or nil

visibility: public
PKl}[��e�� ri/1.8/system/String/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Splits <em>str</em> using the supplied parameter as the record separator (<tt>$/</tt> by default), passing each substring in turn to the supplied block. If a zero-length record separator is supplied, the string is split into paragraphs delimited by multiple successive newlines.
- !ruby/struct:SM::Flow::VERB 
  body: "   print &quot;Example one\\n&quot;\n   &quot;hello\\nworld&quot;.each {|s| p s}\n   print &quot;Example two\\n&quot;\n   &quot;hello\\nworld&quot;.each('l') {|s| p s}\n   print &quot;Example three\\n&quot;\n   &quot;hello\\n\\n\\nworld&quot;.each('') {|s| p s}\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Example one\n   &quot;hello\\n&quot;\n   &quot;world&quot;\n   Example two\n   &quot;hel&quot;\n   &quot;l&quot;\n   &quot;o\\nworl&quot;\n   &quot;d&quot;\n   Example three\n   &quot;hello\\n\\n\\n&quot;\n   &quot;world&quot;\n"
full_name: String#each
is_singleton: false
name: each
params: |
  str.each(separator=$/) {|substr| block }        => str
  str.each_line(separator=$/) {|substr| block }   => str

visibility: public
PKm}[y��4!4!&ri/1.8/system/String/cdesc-String.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: yaml_new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A <tt>String</tt> object holds and manipulates an arbitrary sequence of bytes, typically representing characters. String objects may be created using <tt>String::new</tt> or as literals.
- !ruby/struct:SM::Flow::P 
  body: Because of aliasing issues, users of strings should be aware of the methods that modify the contents of a <tt>String</tt> object. Typically, methods with names ending in ``!'' modify their receiver, while those without a ``!'' return a new <tt>String</tt>. However, there are exceptions, such as <tt>String#[]=</tt>.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: PATTERN_SJIS
  value: "'[\\x81-\\x9f\\xe0-\\xef][\\x40-\\x7e\\x80-\\xfc]'"
- !ruby/object:RI::Constant 
  comment: 
  name: PATTERN_EUC
  value: "'[\\xa1-\\xfe][\\xa1-\\xfe]'"
- !ruby/object:RI::Constant 
  comment: 
  name: PATTERN_UTF8
  value: "'[\\xc0-\\xdf][\\x80-\\xbf]|[\\xe0-\\xef][\\x80-\\xbf][\\x80-\\xbf]'"
- !ruby/object:RI::Constant 
  comment: 
  name: RE_SJIS
  value: Regexp.new(PATTERN_SJIS, 0, 'n')
- !ruby/object:RI::Constant 
  comment: 
  name: RE_EUC
  value: Regexp.new(PATTERN_EUC, 0, 'n')
- !ruby/object:RI::Constant 
  comment: 
  name: RE_UTF8
  value: Regexp.new(PATTERN_UTF8, 0, 'n')
- !ruby/object:RI::Constant 
  comment: 
  name: SUCC
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  name: HashCache
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  name: TrPatternCache
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  name: DeletePatternCache
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  name: SqueezePatternCache
  value: "{}"
full_name: String
includes: 
- !ruby/object:RI::IncludedModule 
  name: Comparable
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "%"
- !ruby/object:RI::MethodSummary 
  name: "*"
- !ruby/object:RI::MethodSummary 
  name: +
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: =~
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: "[]="
- !ruby/object:RI::MethodSummary 
  name: _expand_ch
- !ruby/object:RI::MethodSummary 
  name: _regex_quote
- !ruby/object:RI::MethodSummary 
  name: block_scanf
- !ruby/object:RI::MethodSummary 
  name: bytes
- !ruby/object:RI::MethodSummary 
  name: bytesize
- !ruby/object:RI::MethodSummary 
  name: capitalize
- !ruby/object:RI::MethodSummary 
  name: capitalize!
- !ruby/object:RI::MethodSummary 
  name: casecmp
- !ruby/object:RI::MethodSummary 
  name: center
- !ruby/object:RI::MethodSummary 
  name: chars
- !ruby/object:RI::MethodSummary 
  name: chomp
- !ruby/object:RI::MethodSummary 
  name: chomp!
- !ruby/object:RI::MethodSummary 
  name: chop
- !ruby/object:RI::MethodSummary 
  name: chop
- !ruby/object:RI::MethodSummary 
  name: chop!
- !ruby/object:RI::MethodSummary 
  name: chop!
- !ruby/object:RI::MethodSummary 
  name: concat
- !ruby/object:RI::MethodSummary 
  name: count
- !ruby/object:RI::MethodSummary 
  name: crypt
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: delete!
- !ruby/object:RI::MethodSummary 
  name: delete!
- !ruby/object:RI::MethodSummary 
  name: downcase
- !ruby/object:RI::MethodSummary 
  name: downcase!
- !ruby/object:RI::MethodSummary 
  name: dump
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: each_byte
- !ruby/object:RI::MethodSummary 
  name: each_char
- !ruby/object:RI::MethodSummary 
  name: each_char
- !ruby/object:RI::MethodSummary 
  name: each_line
- !ruby/object:RI::MethodSummary 
  name: empty?
- !ruby/object:RI::MethodSummary 
  name: end_regexp
- !ruby/object:RI::MethodSummary 
  name: end_with?
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: expand_ch_hash
- !ruby/object:RI::MethodSummary 
  name: gsub
- !ruby/object:RI::MethodSummary 
  name: gsub!
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: hex
- !ruby/object:RI::MethodSummary 
  name: include?
- !ruby/object:RI::MethodSummary 
  name: index
- !ruby/object:RI::MethodSummary 
  name: initialize_copy
- !ruby/object:RI::MethodSummary 
  name: insert
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: intern
- !ruby/object:RI::MethodSummary 
  name: is_binary_data?
- !ruby/object:RI::MethodSummary 
  name: is_complex_yaml?
- !ruby/object:RI::MethodSummary 
  name: iseuc
- !ruby/object:RI::MethodSummary 
  name: issjis
- !ruby/object:RI::MethodSummary 
  name: isutf8
- !ruby/object:RI::MethodSummary 
  name: jcount
- !ruby/object:RI::MethodSummary 
  name: jlength
- !ruby/object:RI::MethodSummary 
  name: jsize
- !ruby/object:RI::MethodSummary 
  name: kconv
- !ruby/object:RI::MethodSummary 
  name: length
- !ruby/object:RI::MethodSummary 
  name: lines
- !ruby/object:RI::MethodSummary 
  name: ljust
- !ruby/object:RI::MethodSummary 
  name: lstrip
- !ruby/object:RI::MethodSummary 
  name: lstrip!
- !ruby/object:RI::MethodSummary 
  name: match
- !ruby/object:RI::MethodSummary 
  name: mbchar?
- !ruby/object:RI::MethodSummary 
  name: next
- !ruby/object:RI::MethodSummary 
  name: next!
- !ruby/object:RI::MethodSummary 
  name: oct
- !ruby/object:RI::MethodSummary 
  name: original_succ
- !ruby/object:RI::MethodSummary 
  name: original_succ!
- !ruby/object:RI::MethodSummary 
  name: partition
- !ruby/object:RI::MethodSummary 
  name: replace
- !ruby/object:RI::MethodSummary 
  name: reverse
- !ruby/object:RI::MethodSummary 
  name: reverse!
- !ruby/object:RI::MethodSummary 
  name: rindex
- !ruby/object:RI::MethodSummary 
  name: rjust
- !ruby/object:RI::MethodSummary 
  name: rpartition
- !ruby/object:RI::MethodSummary 
  name: rstrip
- !ruby/object:RI::MethodSummary 
  name: rstrip!
- !ruby/object:RI::MethodSummary 
  name: scan
- !ruby/object:RI::MethodSummary 
  name: scanf
- !ruby/object:RI::MethodSummary 
  name: shellescape
- !ruby/object:RI::MethodSummary 
  name: shellsplit
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: slice
- !ruby/object:RI::MethodSummary 
  name: slice!
- !ruby/object:RI::MethodSummary 
  name: split
- !ruby/object:RI::MethodSummary 
  name: squeeze
- !ruby/object:RI::MethodSummary 
  name: squeeze
- !ruby/object:RI::MethodSummary 
  name: squeeze!
- !ruby/object:RI::MethodSummary 
  name: squeeze!
- !ruby/object:RI::MethodSummary 
  name: start_with?
- !ruby/object:RI::MethodSummary 
  name: strip
- !ruby/object:RI::MethodSummary 
  name: strip!
- !ruby/object:RI::MethodSummary 
  name: sub
- !ruby/object:RI::MethodSummary 
  name: sub!
- !ruby/object:RI::MethodSummary 
  name: succ
- !ruby/object:RI::MethodSummary 
  name: succ
- !ruby/object:RI::MethodSummary 
  name: succ!
- !ruby/object:RI::MethodSummary 
  name: succ!
- !ruby/object:RI::MethodSummary 
  name: sum
- !ruby/object:RI::MethodSummary 
  name: swapcase
- !ruby/object:RI::MethodSummary 
  name: swapcase!
- !ruby/object:RI::MethodSummary 
  name: to_f
- !ruby/object:RI::MethodSummary 
  name: to_i
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: to_str
- !ruby/object:RI::MethodSummary 
  name: to_sym
- !ruby/object:RI::MethodSummary 
  name: to_yaml
- !ruby/object:RI::MethodSummary 
  name: toeuc
- !ruby/object:RI::MethodSummary 
  name: tojis
- !ruby/object:RI::MethodSummary 
  name: tosjis
- !ruby/object:RI::MethodSummary 
  name: toutf16
- !ruby/object:RI::MethodSummary 
  name: toutf8
- !ruby/object:RI::MethodSummary 
  name: tr
- !ruby/object:RI::MethodSummary 
  name: tr
- !ruby/object:RI::MethodSummary 
  name: tr!
- !ruby/object:RI::MethodSummary 
  name: tr!
- !ruby/object:RI::MethodSummary 
  name: tr_s
- !ruby/object:RI::MethodSummary 
  name: tr_s
- !ruby/object:RI::MethodSummary 
  name: tr_s!
- !ruby/object:RI::MethodSummary 
  name: tr_s!
- !ruby/object:RI::MethodSummary 
  name: unpack
- !ruby/object:RI::MethodSummary 
  name: upcase
- !ruby/object:RI::MethodSummary 
  name: upcase!
- !ruby/object:RI::MethodSummary 
  name: upto
name: String
superclass: Object
PKm}[�k�e��-ri/1.8/system/String/is_binary_data%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: String#is_binary_data?
is_singleton: false
name: is_binary_data?
params: ()
visibility: public
PKm}[ϯG�ll#ri/1.8/system/String/succ%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: original_succ!
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>String#succ</tt>, but modifies the receiver in place.
full_name: String#succ!
is_singleton: false
name: succ!
params: |
  str.succ!   => str
  str.next!   => str

visibility: public
PKm}[�-s2��#ri/1.8/system/String/squeeze-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Builds a set of characters from the <em>other_str</em> parameter(s) using the procedure described for <tt>String#count</tt>. Returns a new string where runs of the same character that occur in this set are replaced by a single character. If no arguments are given, all runs of identical characters are replaced by a single character.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;yellow moon&quot;.squeeze                  #=&gt; &quot;yelow mon&quot;\n   &quot;  now   is  the&quot;.squeeze(&quot; &quot;)         #=&gt; &quot; now is the&quot;\n   &quot;putters shoot balls&quot;.squeeze(&quot;m-z&quot;)   #=&gt; &quot;puters shot balls&quot;\n"
full_name: String#squeeze
is_singleton: false
name: squeeze
params: |
  str.squeeze([other_str]*)    => new_str

visibility: public
PKn}[�
֑�%ri/1.8/system/String/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Comparison---Returns -1 if <em>other_str</em> is less than, 0 if <em>other_str</em> is equal to, and +1 if <em>other_str</em> is greater than <em>str</em>. If the strings are of different lengths, and the strings are equal when compared up to the shortest length, then the longer string is considered greater than the shorter one. If the variable <tt>$=</tt> is <tt>false</tt>, the comparison is based on comparing the binary values of each character in the string. In older versions of Ruby, setting <tt>$=</tt> allowed case-insensitive comparisons; this is now deprecated in favor of using <tt>String#casecmp</tt>.
- !ruby/struct:SM::Flow::P 
  body: <tt>&lt;=&gt;</tt> is the basis for the methods <tt>&lt;</tt>, <tt>&lt;=</tt>, <tt>&gt;</tt>, <tt>&gt;=</tt>, and <tt>between?</tt>, included from module <tt>Comparable</tt>. The method <tt>String#==</tt> does not use <tt>Comparable#==</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;abcdef&quot; &lt;=&gt; &quot;abcde&quot;     #=&gt; 1\n   &quot;abcdef&quot; &lt;=&gt; &quot;abcdef&quot;    #=&gt; 0\n   &quot;abcdef&quot; &lt;=&gt; &quot;abcdefg&quot;   #=&gt; -1\n   &quot;abcdef&quot; &lt;=&gt; &quot;ABCDEF&quot;    #=&gt; 1\n"
full_name: String#<=>
is_singleton: false
name: <=>
params: |
  str <=> other_str   => -1, 0, +1

visibility: public
PKn}[�Rp� ri/1.8/system/String/to_i-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the result of interpreting leading characters in <em>str</em> as an integer base <em>base</em> (between 2 and 36). Extraneous characters past the end of a valid number are ignored. If there is not a valid number at the start of <em>str</em>, <tt>0</tt> is returned. This method never raises an exception.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;12345&quot;.to_i             #=&gt; 12345\n   &quot;99 red balloons&quot;.to_i   #=&gt; 99\n   &quot;0a&quot;.to_i                #=&gt; 0\n   &quot;0a&quot;.to_i(16)            #=&gt; 10\n   &quot;hello&quot;.to_i             #=&gt; 0\n   &quot;1100101&quot;.to_i(2)        #=&gt; 101\n   &quot;1100101&quot;.to_i(8)        #=&gt; 294977\n   &quot;1100101&quot;.to_i(10)       #=&gt; 1100101\n   &quot;1100101&quot;.to_i(16)       #=&gt; 17826049\n"
full_name: String#to_i
is_singleton: false
name: to_i
params: |
  str.to_i(base=10)   => integer

visibility: public
PKn}[��B�(( ri/1.8/system/String/gsub-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a copy of <em>str</em> with <em>all</em> occurrences of <em>pattern</em> replaced with either <em>replacement</em> or the value of the block. The <em>pattern</em> will typically be a <tt>Regexp</tt>; if it is a <tt>String</tt> then no regular expression metacharacters will be interpreted (that is <tt>/\d/</tt> will match a digit, but <tt>'\d'</tt> will match a backslash followed by a 'd').
- !ruby/struct:SM::Flow::P 
  body: If a string is used as the replacement, special variables from the match (such as <tt>$&amp;</tt> and <tt>$1</tt>) cannot be substituted into it, as substitution into the string occurs before the pattern match starts. However, the sequences <tt>\1</tt>, <tt>\2</tt>, and so on may be used to interpolate successive groups in the match.
- !ruby/struct:SM::Flow::P 
  body: In the block form, the current match string is passed in as a parameter, and variables such as <tt>$1</tt>, <tt>$2</tt>, <tt>$`</tt>, <tt>$&amp;</tt>, and <tt>$'</tt> will be set appropriately. The value returned by the block will be substituted for the match on each call.
- !ruby/struct:SM::Flow::P 
  body: The result inherits any tainting in the original string or any supplied replacement string.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hello&quot;.gsub(/[aeiou]/, '*')              #=&gt; &quot;h*ll*&quot;\n   &quot;hello&quot;.gsub(/([aeiou])/, '&lt;\\1&gt;')         #=&gt; &quot;h&lt;e&gt;ll&lt;o&gt;&quot;\n   &quot;hello&quot;.gsub(/./) {|s| s[0].to_s + ' '}   #=&gt; &quot;104 101 108 108 111 &quot;\n"
full_name: String#gsub
is_singleton: false
name: gsub
params: |
  str.gsub(pattern, replacement)       => new_str
  str.gsub(pattern) {|match| block }   => new_str

visibility: public
PKn}[`�F��*ri/1.8/system/String/expand_ch_hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: String#expand_ch_hash
is_singleton: false
name: expand_ch_hash
params: (from, to)
visibility: private
PKn}[ܦ$
!ri/1.8/system/String/kconv-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert <tt>self</tt> to out_code. <tt>out_code</tt> and <tt>in_code</tt> are given as constants of Kconv.
- !ruby/struct:SM::Flow::P 
  body: <b>Note</b> This method decode MIME encoded string and convert halfwidth katakana to fullwidth katakana. If you don't want to decode them, use NKF.nkf.
full_name: String#kconv
is_singleton: false
name: kconv
params: |
  String#kconv(out_code, in_code = Kconv::AUTO)

visibility: public
PKn}[
��J��!ri/1.8/system/String/scanf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: String#scanf
is_singleton: false
name: scanf
params: (fstr,&b)
visibility: public
PKn}[�>�NNri/1.8/system/String/oct-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Treats leading characters of <em>str</em> as a string of octal digits (with an optional sign) and returns the corresponding number. Returns 0 if the conversion fails.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;123&quot;.oct       #=&gt; 83\n   &quot;-377&quot;.oct      #=&gt; -255\n   &quot;bad&quot;.oct       #=&gt; 0\n   &quot;0377bad&quot;.oct   #=&gt; 255\n"
full_name: String#oct
is_singleton: false
name: oct
params: |
  str.oct   => integer

visibility: public
PKn}[��d33!ri/1.8/system/String/chomp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new <tt>String</tt> with the given record separator removed from the end of <em>str</em> (if present). If <tt>$/</tt> has not been changed from the default Ruby record separator, then <tt>chomp</tt> also removes carriage return characters (that is it will remove <tt>\n</tt>, <tt>\r</tt>, and <tt>\r\n</tt>).
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hello&quot;.chomp            #=&gt; &quot;hello&quot;\n   &quot;hello\\n&quot;.chomp          #=&gt; &quot;hello&quot;\n   &quot;hello\\r\\n&quot;.chomp        #=&gt; &quot;hello&quot;\n   &quot;hello\\n\\r&quot;.chomp        #=&gt; &quot;hello\\n&quot;\n   &quot;hello\\r&quot;.chomp          #=&gt; &quot;hello&quot;\n   &quot;hello \\n there&quot;.chomp   #=&gt; &quot;hello \\n there&quot;\n   &quot;hello&quot;.chomp(&quot;llo&quot;)     #=&gt; &quot;he&quot;\n"
full_name: String#chomp
is_singleton: false
name: chomp
params: |
  str.chomp(separator=$/)   => new_str

visibility: public
PKn}[��$ri/1.8/system/String/downcase-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a copy of <em>str</em> with all uppercase letters replaced with their lowercase counterparts. The operation is locale insensitive---only characters ``A'' to ``Z'' are affected.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hEllO&quot;.downcase   #=&gt; &quot;hello&quot;\n"
full_name: String#downcase
is_singleton: false
name: downcase
params: |
  str.downcase   => new_str

visibility: public
PKn}[|~��SS"ri/1.8/system/String/unpack-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Decodes <em>str</em> (which may contain binary data) according to the format string, returning an array of each value extracted. The format string consists of a sequence of single-character directives, summarized in the table at the end of this entry. Each directive may be followed by a number, indicating the number of times to repeat with this directive. An asterisk (``<tt>*</tt>'') will use up all remaining elements. The directives <tt>sSiIlL</tt> may each be followed by an underscore (``<tt>_</tt>'') to use the underlying platform's native size for the specified type; otherwise, it uses a platform-independent consistent size. Spaces are ignored in the format string. See also <tt>Array#pack</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;abc \\0\\0abc \\0\\0&quot;.unpack('A6Z6')   #=&gt; [&quot;abc&quot;, &quot;abc &quot;]\n   &quot;abc \\0\\0&quot;.unpack('a3a3')           #=&gt; [&quot;abc&quot;, &quot; \\000\\000&quot;]\n   &quot;abc \\0abc \\0&quot;.unpack('Z*Z*')       #=&gt; [&quot;abc &quot;, &quot;abc &quot;]\n   &quot;aa&quot;.unpack('b8B8')                 #=&gt; [&quot;10000110&quot;, &quot;01100001&quot;]\n   &quot;aaa&quot;.unpack('h2H2c')               #=&gt; [&quot;16&quot;, &quot;61&quot;, 97]\n   &quot;\\xfe\\xff\\xfe\\xff&quot;.unpack('sS')     #=&gt; [-2, 65534]\n   &quot;now=20is&quot;.unpack('M*')             #=&gt; [&quot;now is&quot;]\n   &quot;whole&quot;.unpack('xax2aX2aX1aX2a')    #=&gt; [&quot;h&quot;, &quot;e&quot;, &quot;l&quot;, &quot;l&quot;, &quot;o&quot;]\n"
- !ruby/struct:SM::Flow::P 
  body: This table summarizes the various formats and the Ruby classes returned by each.
- !ruby/struct:SM::Flow::VERB 
  body: "   Format | Returns | Function\n   -------+---------+-----------------------------------------\n     A    | String  | with trailing nulls and spaces removed\n   -------+---------+-----------------------------------------\n     a    | String  | string\n   -------+---------+-----------------------------------------\n     B    | String  | extract bits from each character (msb first)\n   -------+---------+-----------------------------------------\n     b    | String  | extract bits from each character (lsb first)\n   -------+---------+-----------------------------------------\n     C    | Fixnum  | extract a character as an unsigned integer\n   -------+---------+-----------------------------------------\n     c    | Fixnum  | extract a character as an integer\n   -------+---------+-----------------------------------------\n     d,D  | Float   | treat sizeof(double) characters as\n          |         | a native double\n   -------+---------+-----------------------------------------\n     E    | Float   | treat sizeof(double) characters as\n          |         | a double in little-endian byte order\n   -------+---------+-----------------------------------------\n     e    | Float   | treat sizeof(float) characters as\n          |         | a float in little-endian byte order\n   -------+---------+-----------------------------------------\n     f,F  | Float   | treat sizeof(float) characters as\n          |         | a native float\n   -------+---------+-----------------------------------------\n     G    | Float   | treat sizeof(double) characters as\n          |         | a double in network byte order\n   -------+---------+-----------------------------------------\n     g    | Float   | treat sizeof(float) characters as a\n          |         | float in network byte order\n   -------+---------+-----------------------------------------\n     H    | String  | extract hex nibbles from each character\n          |         | (most significant first)\n   -------+---------+-----------------------------------------\n     h    | String  | extract hex nibbles from each character\n          |         | (least significant first)\n   -------+---------+-----------------------------------------\n     I    | Integer | treat sizeof(int) (modified by _)\n          |         | successive characters as an unsigned\n          |         | native integer\n   -------+---------+-----------------------------------------\n     i    | Integer | treat sizeof(int) (modified by _)\n          |         | successive characters as a signed\n          |         | native integer\n   -------+---------+-----------------------------------------\n     L    | Integer | treat four (modified by _) successive\n          |         | characters as an unsigned native\n          |         | long integer\n   -------+---------+-----------------------------------------\n     l    | Integer | treat four (modified by _) successive\n          |         | characters as a signed native\n          |         | long integer\n   -------+---------+-----------------------------------------\n     M    | String  | quoted-printable\n   -------+---------+-----------------------------------------\n     m    | String  | base64-encoded\n   -------+---------+-----------------------------------------\n     N    | Integer | treat four characters as an unsigned\n          |         | long in network byte order\n   -------+---------+-----------------------------------------\n     n    | Fixnum  | treat two characters as an unsigned\n          |         | short in network byte order\n   -------+---------+-----------------------------------------\n     P    | String  | treat sizeof(char *) characters as a\n          |         | pointer, and  return \\emph{len} characters\n          |         | from the referenced location\n   -------+---------+-----------------------------------------\n     p    | String  | treat sizeof(char *) characters as a\n          |         | pointer to a  null-terminated string\n   -------+---------+-----------------------------------------\n     Q    | Integer | treat 8 characters as an unsigned\n          |         | quad word (64 bits)\n   -------+---------+-----------------------------------------\n     q    | Integer | treat 8 characters as a signed\n          |         | quad word (64 bits)\n   -------+---------+-----------------------------------------\n     S    | Fixnum  | treat two (different if _ used)\n          |         | successive characters as an unsigned\n          |         | short in native byte order\n   -------+---------+-----------------------------------------\n     s    | Fixnum  | Treat two (different if _ used)\n          |         | successive characters as a signed short\n          |         | in native byte order\n   -------+---------+-----------------------------------------\n     U    | Integer | UTF-8 characters as unsigned integers\n   -------+---------+-----------------------------------------\n     u    | String  | UU-encoded\n   -------+---------+-----------------------------------------\n     V    | Fixnum  | treat four characters as an unsigned\n          |         | long in little-endian byte order\n   -------+---------+-----------------------------------------\n     v    | Fixnum  | treat two characters as an unsigned\n          |         | short in little-endian byte order\n   -------+---------+-----------------------------------------\n     w    | Integer | BER-compressed integer (see Array.pack)\n   -------+---------+-----------------------------------------\n     X    | ---     | skip backward one character\n   -------+---------+-----------------------------------------\n     x    | ---     | skip forward one character\n   -------+---------+-----------------------------------------\n     Z    | String  | with trailing nulls removed\n          |         | upto first null with *\n   -------+---------+-----------------------------------------\n     @    | ---     | skip to the offset given by the\n          |         | length argument\n   -------+---------+-----------------------------------------\n"
full_name: String#unpack
is_singleton: false
name: unpack
params: |
  str.unpack(format)   => anArray

visibility: public
PKn}[:����#ri/1.8/system/String/gsub%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Performs the substitutions of <tt>String#gsub</tt> in place, returning <em>str</em>, or <tt>nil</tt> if no substitutions were performed.
full_name: String#gsub!
is_singleton: false
name: gsub!
params: |
  str.gsub!(pattern, replacement)        => str or nil
  str.gsub!(pattern) {|match| block }    => str or nil

visibility: public
PKn}[^"��"ri/1.8/system/String/isutf8-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns whether <tt>self</tt>'s encoding is UTF-8 or not.
- !ruby/struct:SM::Flow::P 
  body: <b>Note</b> don't expect this return value is MatchData.
full_name: String#isutf8
is_singleton: false
name: isutf8
params: |
  String#isutf8   -> obj or nil

visibility: public
PKn}[׊���#ri/1.8/system/String/jlength-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: jsize
block_params: 
comment: 
full_name: String#jlength
is_singleton: false
name: jlength
params: ()
visibility: public
PKn}[��0p��!ri/1.8/system/String/rjust-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: If <em>integer</em> is greater than the length of <em>str</em>, returns a new <tt>String</tt> of length <em>integer</em> with <em>str</em> right justified and padded with <em>padstr</em>; otherwise, returns <em>str</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hello&quot;.rjust(4)            #=&gt; &quot;hello&quot;\n   &quot;hello&quot;.rjust(20)           #=&gt; &quot;               hello&quot;\n   &quot;hello&quot;.rjust(20, '1234')   #=&gt; &quot;123412341234123hello&quot;\n"
full_name: String#rjust
is_singleton: false
name: rjust
params: |
  str.rjust(integer, padstr=' ')   => new_str

visibility: public
PKn}[���,��%ri/1.8/system/String/each_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Splits <em>str</em> using the supplied parameter as the record separator (<tt>$/</tt> by default), passing each substring in turn to the supplied block. If a zero-length record separator is supplied, the string is split into paragraphs delimited by multiple successive newlines.
- !ruby/struct:SM::Flow::VERB 
  body: "   print &quot;Example one\\n&quot;\n   &quot;hello\\nworld&quot;.each {|s| p s}\n   print &quot;Example two\\n&quot;\n   &quot;hello\\nworld&quot;.each('l') {|s| p s}\n   print &quot;Example three\\n&quot;\n   &quot;hello\\n\\n\\nworld&quot;.each('') {|s| p s}\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Example one\n   &quot;hello\\n&quot;\n   &quot;world&quot;\n   Example two\n   &quot;hel&quot;\n   &quot;l&quot;\n   &quot;o\\nworl&quot;\n   &quot;d&quot;\n   Example three\n   &quot;hello\\n\\n\\n&quot;\n   &quot;world&quot;\n"
full_name: String#each_line
is_singleton: false
name: each_line
params: |
  str.each(separator=$/) {|substr| block }        => str
  str.each_line(separator=$/) {|substr| block }   => str

visibility: public
PKn}[�nk���#ri/1.8/system/String/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: String#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PKn}[Hc�~�� ri/1.8/system/String/upto-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates through successive values, starting at <em>str</em> and ending at <em>other_str</em> inclusive, passing each value in turn to the block. The <tt>String#succ</tt> method is used to generate each value. If optional second argument exclusive is omitted or is <tt>false</tt>, the last value will be included; otherwise it will be excluded.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;a8&quot;.upto(&quot;b6&quot;) {|s| print s, ' ' }\n   for s in &quot;a8&quot;..&quot;b6&quot;\n     print s, ' '\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   a8 a9 b0 b1 b2 b3 b4 b5 b6\n   a8 a9 b0 b1 b2 b3 b4 b5 b6\n"
full_name: String#upto
is_singleton: false
name: upto
params: |
  str.upto(other_str, exclusive=false) {|s| block }   => str

visibility: public
PKn}[%c���"ri/1.8/system/String/concat-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Append---Concatenates the given object to <em>str</em>. If the object is a <tt>Fixnum</tt> between 0 and 255, it is converted to a character before concatenation.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = &quot;hello &quot;\n   a &lt;&lt; &quot;world&quot;   #=&gt; &quot;hello world&quot;\n   a.concat(33)   #=&gt; &quot;hello world!&quot;\n"
full_name: String#concat
is_singleton: false
name: concat
params: |
  str << fixnum        => str
  str.concat(fixnum)   => str
  str << obj           => str
  str.concat(obj)      => str

visibility: public
PKn}[��g�}}!ri/1.8/system/String/tr%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Translates <em>str</em> in place, using the same rules as <tt>String#tr</tt>. Returns <em>str</em>, or <tt>nil</tt> if no changes were made.
full_name: String#tr!
is_singleton: false
name: tr!
params: |
  str.tr!(from_str, to_str)   => str or nil

visibility: public
PKn}[�!U���!ri/1.8/system/String/jsize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #jlength"
full_name: String#jsize
is_singleton: false
name: jsize
params: ()
visibility: public
PKn}[R�2 ri/1.8/system/String/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a hash based on the string's length and content.
full_name: String#hash
is_singleton: false
name: hash
params: |
  str.hash   => fixnum

visibility: public
PKn}[	�25%ri/1.8/system/String/rstrip%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes trailing whitespace from <em>str</em>, returning <tt>nil</tt> if no change was made. See also <tt>String#lstrip!</tt> and <tt>String#strip!</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;  hello  &quot;.rstrip   #=&gt; &quot;  hello&quot;\n   &quot;hello&quot;.rstrip!      #=&gt; nil\n"
full_name: String#rstrip!
is_singleton: false
name: rstrip!
params: |
  str.rstrip!   => self or nil

visibility: public
PKn}[rh^���'ri/1.8/system/String/block_scanf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (current)
comment: 
full_name: String#block_scanf
is_singleton: false
name: block_scanf
params: (fstr,&b) {|current| ...}
visibility: public
PKo}[UG5"ri/1.8/system/String/rstrip-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a copy of <em>str</em> with trailing whitespace removed. See also <tt>String#lstrip</tt> and <tt>String#strip</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;  hello  &quot;.rstrip   #=&gt; &quot;  hello&quot;\n   &quot;hello&quot;.rstrip       #=&gt; &quot;hello&quot;\n"
full_name: String#rstrip
is_singleton: false
name: rstrip
params: |
  str.rstrip   => new_str

visibility: public
PKo}[
6��@@%ri/1.8/system/String/upcase%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Upcases the contents of <em>str</em>, returning <tt>nil</tt> if no changes were made.
full_name: String#upcase!
is_singleton: false
name: upcase!
params: |
  str.upcase!   => str or nil

visibility: public
PKo}[K|��"ri/1.8/system/String/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a copy of <em>str</em> with all characters in the intersection of its arguments deleted. Uses the same rules for building the set of characters as <tt>String#count</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hello&quot;.delete &quot;l&quot;,&quot;lo&quot;        #=&gt; &quot;heo&quot;\n   &quot;hello&quot;.delete &quot;lo&quot;            #=&gt; &quot;he&quot;\n   &quot;hello&quot;.delete &quot;aeiou&quot;, &quot;^e&quot;   #=&gt; &quot;hell&quot;\n   &quot;hello&quot;.delete &quot;ej-m&quot;          #=&gt; &quot;ho&quot;\n"
full_name: String#delete
is_singleton: false
name: delete
params: |
  str.delete([other_str]+)   => new_str

visibility: public
PKo}[� ri/1.8/system/String/next-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the successor to <em>str</em>. The successor is calculated by incrementing characters starting from the rightmost alphanumeric (or the rightmost character if there are no alphanumerics) in the string. Incrementing a digit always results in another digit, and incrementing a letter results in another letter of the same case. Incrementing nonalphanumerics uses the underlying character set's collating sequence.
- !ruby/struct:SM::Flow::P 
  body: If the increment generates a ``carry,'' the character to the left of it is incremented. This process repeats until there is no carry, adding an additional character if necessary.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;abcd&quot;.succ        #=&gt; &quot;abce&quot;\n   &quot;THX1138&quot;.succ     #=&gt; &quot;THX1139&quot;\n   &quot;&lt;&lt;koala&gt;&gt;&quot;.succ   #=&gt; &quot;&lt;&lt;koalb&gt;&gt;&quot;\n   &quot;1999zzz&quot;.succ     #=&gt; &quot;2000aaa&quot;\n   &quot;ZZZ9999&quot;.succ     #=&gt; &quot;AAAA0000&quot;\n   &quot;***&quot;.succ         #=&gt; &quot;**+&quot;\n"
full_name: String#next
is_singleton: false
name: next
params: |
  str.succ   => new_str
  str.next   => new_str

visibility: public
PKo}[`)=B��$ri/1.8/system/String/chomp%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Modifies <em>str</em> in place as described for <tt>String#chomp</tt>, returning <em>str</em>, or <tt>nil</tt> if no modifications were made.
full_name: String#chomp!
is_singleton: false
name: chomp!
params: |
  str.chomp!(separator=$/)   => str or nil

visibility: public
PKo}[�׻�$ri/1.8/system/String/yaml_new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: String::yaml_new
is_singleton: true
name: yaml_new
params: ( klass, tag, val )
visibility: public
PKo}[������ri/1.8/system/String/%2a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Copy---Returns a new <tt>String</tt> containing <em>integer</em> copies of the receiver.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;Ho! &quot; * 3   #=&gt; &quot;Ho! Ho! Ho! &quot;\n"
full_name: String#*
is_singleton: false
name: "*"
params: |
  str * integer   => new_str

visibility: public
PKo}[�>LHH'ri/1.8/system/String/downcase%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Downcases the contents of <em>str</em>, returning <tt>nil</tt> if no changes were made.
full_name: String#downcase!
is_singleton: false
name: downcase!
params: |
  str.downcase!   => str or nil

visibility: public
PKo}[΁�H??)ri/1.8/system/String/start_with%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if <em>str</em> starts with the prefix given.
full_name: String#start_with?
is_singleton: false
name: start_with?
params: |
  str.start_with?([prefix]+)   => true or false

visibility: public
PKo}[��H���(ri/1.8/system/String/_regex_quote-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: String#_regex_quote
is_singleton: false
name: _regex_quote
params: (str)
visibility: private
PKo}[4�U��!ri/1.8/system/String/ljust-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: If <em>integer</em> is greater than the length of <em>str</em>, returns a new <tt>String</tt> of length <em>integer</em> with <em>str</em> left justified and padded with <em>padstr</em>; otherwise, returns <em>str</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hello&quot;.ljust(4)            #=&gt; &quot;hello&quot;\n   &quot;hello&quot;.ljust(20)           #=&gt; &quot;hello               &quot;\n   &quot;hello&quot;.ljust(20, '1234')   #=&gt; &quot;hello123412341234123&quot;\n"
full_name: String#ljust
is_singleton: false
name: ljust
params: |
  str.ljust(integer, padstr=' ')   => new_str

visibility: public
PKo}[�O*��!ri/1.8/system/String/index-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the index of the first occurrence of the given <em>substring</em>, character (<em>fixnum</em>), or pattern (<em>regexp</em>) in <em>str</em>. Returns <tt>nil</tt> if not found. If the second parameter is present, it specifies the position in the string to begin the search.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hello&quot;.index('e')             #=&gt; 1\n   &quot;hello&quot;.index('lo')            #=&gt; 3\n   &quot;hello&quot;.index('a')             #=&gt; nil\n   &quot;hello&quot;.index(101)             #=&gt; 1\n   &quot;hello&quot;.index(/[aeiou]/, -3)   #=&gt; 4\n"
full_name: String#index
is_singleton: false
name: index
params: |
  str.index(substring [, offset])   => fixnum or nil
  str.index(fixnum [, offset])      => fixnum or nil
  str.index(regexp [, offset])      => fixnum or nil

visibility: public
PKo}[U�S���&ri/1.8/system/String/squeeze%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: String#squeeze!
is_singleton: false
name: squeeze!
params: (del=nil)
visibility: public
PKo}[�)��~~!ri/1.8/system/String/match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts <em>pattern</em> to a <tt>Regexp</tt> (if it isn't already one), then invokes its <tt>match</tt> method on <em>str</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   'hello'.match('(.)\\1')      #=&gt; #&lt;MatchData:0x401b3d30&gt;\n   'hello'.match('(.)\\1')[0]   #=&gt; &quot;ll&quot;\n   'hello'.match(/(.)\\1/)[0]   #=&gt; &quot;ll&quot;\n   'hello'.match('xx')         #=&gt; nil\n"
full_name: String#match
is_singleton: false
name: match
params: |
  str.match(pattern)   => matchdata or nil

visibility: public
PKo}[��
::#ri/1.8/system/String/next%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>String#succ</tt>, but modifies the receiver in place.
full_name: String#next!
is_singleton: false
name: next!
params: |
  str.succ!   => str
  str.next!   => str

visibility: public
PKo}[��/W"ri/1.8/system/String/to_str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the receiver.
full_name: String#to_str
is_singleton: false
name: to_str
params: |
  str.to_s     => str
  str.to_str   => str

visibility: public
PKo}[KQ��$ri/1.8/system/String/bytesize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the length of <em>str</em>.
full_name: String#bytesize
is_singleton: false
name: bytesize
params: |
  str.length   => integer

visibility: public
PKp}[^cܪ��#ri/1.8/system/String/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a printable version of <em>str</em>, with special characters escaped.
- !ruby/struct:SM::Flow::VERB 
  body: "   str = &quot;hello&quot;\n   str[3] = 8\n   str.inspect       #=&gt; &quot;hel\\010o&quot;\n"
full_name: String#inspect
is_singleton: false
name: inspect
params: |
  str.inspect   => string

visibility: public
PKp}[�Z�G��"ri/1.8/system/String/sub%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Performs the substitutions of <tt>String#sub</tt> in place, returning <em>str</em>, or <tt>nil</tt> if no substitutions were performed.
full_name: String#sub!
is_singleton: false
name: sub!
params: |
  str.sub!(pattern, replacement)          => str or nil
  str.sub!(pattern) {|match| block }      => str or nil

visibility: public
PKp}[�2AA&ri/1.8/system/String/capitalize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a copy of <em>str</em> with the first character converted to uppercase and the remainder to lowercase.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hello&quot;.capitalize    #=&gt; &quot;Hello&quot;\n   &quot;HELLO&quot;.capitalize    #=&gt; &quot;Hello&quot;\n   &quot;123ABC&quot;.capitalize   #=&gt; &quot;123abc&quot;\n"
full_name: String#capitalize
is_singleton: false
name: capitalize
params: |
  str.capitalize   => new_str

visibility: public
PKp}[�ÿ�## ri/1.8/system/String/scan-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Both forms iterate through <em>str</em>, matching the pattern (which may be a <tt>Regexp</tt> or a <tt>String</tt>). For each match, a result is generated and either added to the result array or passed to the block. If the pattern contains no groups, each individual result consists of the matched string, <tt>$&amp;</tt>. If the pattern contains groups, each individual result is itself an array containing one entry per group.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = &quot;cruel world&quot;\n   a.scan(/\\w+/)        #=&gt; [&quot;cruel&quot;, &quot;world&quot;]\n   a.scan(/.../)        #=&gt; [&quot;cru&quot;, &quot;el &quot;, &quot;wor&quot;]\n   a.scan(/(...)/)      #=&gt; [[&quot;cru&quot;], [&quot;el &quot;], [&quot;wor&quot;]]\n   a.scan(/(..)(..)/)   #=&gt; [[&quot;cr&quot;, &quot;ue&quot;], [&quot;l &quot;, &quot;wo&quot;]]\n"
- !ruby/struct:SM::Flow::P 
  body: "And the block form:"
- !ruby/struct:SM::Flow::VERB 
  body: "   a.scan(/\\w+/) {|w| print &quot;&lt;&lt;#{w}&gt;&gt; &quot; }\n   print &quot;\\n&quot;\n   a.scan(/(.)(.)/) {|x,y| print y, x }\n   print &quot;\\n&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   &lt;&lt;cruel&gt;&gt; &lt;&lt;world&gt;&gt;\n   rceu lowlr\n"
full_name: String#scan
is_singleton: false
name: scan
params: |
  str.scan(pattern)                         => array
  str.scan(pattern) {|match, ...| block }   => str

visibility: public
PKp}[}H9Vnn&ri/1.8/system/String/shellsplit-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Splits <tt>str</tt> into an array of tokens in the same way the UNIX Bourne shell does. See +Shellwords::shellsplit+ for details.
full_name: String#shellsplit
is_singleton: false
name: shellsplit
params: |
  str.shellsplit => array

visibility: public
PKp}[۴[�II&ri/1.8/system/String/include%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>str</em> contains the given string or character.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hello&quot;.include? &quot;lo&quot;   #=&gt; true\n   &quot;hello&quot;.include? &quot;ol&quot;   #=&gt; false\n   &quot;hello&quot;.include? ?h     #=&gt; true\n"
full_name: String#include?
is_singleton: false
name: include?
params: |
  str.include? other_str   => true or false
  str.include? fixnum      => true or false

visibility: public
PKp}[���%%ri/1.8/system/String/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new string object containing a copy of <em>str</em>.
full_name: String::new
is_singleton: true
name: new
params: |
  String.new(str="")   => new_str

visibility: public
PKp}[����#ri/1.8/system/String/reverse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new string with the characters from <em>str</em> in reverse order.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;stressed&quot;.reverse   #=&gt; &quot;desserts&quot;\n"
full_name: String#reverse
is_singleton: false
name: reverse
params: |
  str.reverse   => new_str

visibility: public
PKp}[�S/k��&ri/1.8/system/String/end_regexp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: String#end_regexp
is_singleton: false
name: end_regexp
params: ()
visibility: public
PKp}[��ܫpp"ri/1.8/system/String/intern-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the <tt>Symbol</tt> corresponding to <em>str</em>, creating the symbol if it did not previously exist. See <tt>Symbol#id2name</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;Koala&quot;.intern         #=&gt; :Koala\n   s = 'cat'.to_sym       #=&gt; :cat\n   s == :cat              #=&gt; true\n   s = '@cat'.to_sym      #=&gt; :@cat\n   s == :@cat             #=&gt; true\n"
- !ruby/struct:SM::Flow::P 
  body: This can also be used to create symbols that cannot be represented using the <tt>:xxx</tt> notation.
- !ruby/struct:SM::Flow::VERB 
  body: "   'cat and dog'.to_sym   #=&gt; :&quot;cat and dog&quot;\n"
full_name: String#intern
is_singleton: false
name: intern
params: |
  str.intern   => symbol
  str.to_sym   => symbol

visibility: public
PKp}[4��}PP!ri/1.8/system/String/split-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Divides <em>str</em> into substrings based on a delimiter, returning an array of these substrings.
- !ruby/struct:SM::Flow::P 
  body: If <em>pattern</em> is a <tt>String</tt>, then its contents are used as the delimiter when splitting <em>str</em>. If <em>pattern</em> is a single space, <em>str</em> is split on whitespace, with leading whitespace and runs of contiguous whitespace characters ignored.
- !ruby/struct:SM::Flow::P 
  body: If <em>pattern</em> is a <tt>Regexp</tt>, <em>str</em> is divided where the pattern matches. Whenever the pattern matches a zero-length string, <em>str</em> is split into individual characters.
- !ruby/struct:SM::Flow::P 
  body: If <em>pattern</em> is omitted, the value of <tt>$;</tt> is used. If <tt>$;</tt> is <tt>nil</tt> (which is the default), <em>str</em> is split on whitespace as if ` ' were specified.
- !ruby/struct:SM::Flow::P 
  body: If the <em>limit</em> parameter is omitted, trailing null fields are suppressed. If <em>limit</em> is a positive number, at most that number of fields will be returned (if <em>limit</em> is <tt>1</tt>, the entire string is returned as the only entry in an array). If negative, there is no limit to the number of fields returned, and trailing null fields are not suppressed.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot; now's  the time&quot;.split        #=&gt; [&quot;now's&quot;, &quot;the&quot;, &quot;time&quot;]\n   &quot; now's  the time&quot;.split(' ')   #=&gt; [&quot;now's&quot;, &quot;the&quot;, &quot;time&quot;]\n   &quot; now's  the time&quot;.split(/ /)   #=&gt; [&quot;&quot;, &quot;now's&quot;, &quot;&quot;, &quot;the&quot;, &quot;time&quot;]\n   &quot;1, 2.34,56, 7&quot;.split(%r{,\\s*}) #=&gt; [&quot;1&quot;, &quot;2.34&quot;, &quot;56&quot;, &quot;7&quot;]\n   &quot;hello&quot;.split(//)               #=&gt; [&quot;h&quot;, &quot;e&quot;, &quot;l&quot;, &quot;l&quot;, &quot;o&quot;]\n   &quot;hello&quot;.split(//, 3)            #=&gt; [&quot;h&quot;, &quot;e&quot;, &quot;llo&quot;]\n   &quot;hi mom&quot;.split(%r{\\s*})         #=&gt; [&quot;h&quot;, &quot;i&quot;, &quot;m&quot;, &quot;o&quot;, &quot;m&quot;]\n\n   &quot;mellow yellow&quot;.split(&quot;ello&quot;)   #=&gt; [&quot;m&quot;, &quot;w y&quot;, &quot;w&quot;]\n   &quot;1,2,,3,4,,&quot;.split(',')         #=&gt; [&quot;1&quot;, &quot;2&quot;, &quot;&quot;, &quot;3&quot;, &quot;4&quot;]\n   &quot;1,2,,3,4,,&quot;.split(',', 4)      #=&gt; [&quot;1&quot;, &quot;2&quot;, &quot;&quot;, &quot;3,4,,&quot;]\n   &quot;1,2,,3,4,,&quot;.split(',', -4)     #=&gt; [&quot;1&quot;, &quot;2&quot;, &quot;&quot;, &quot;3&quot;, &quot;4&quot;, &quot;&quot;, &quot;&quot;]\n"
full_name: String#split
is_singleton: false
name: split
params: |
  str.split(pattern=$;, [limit])   => anArray

visibility: public
PKp}[qo)L��%ri/1.8/system/String/delete%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: String#delete!
is_singleton: false
name: delete!
params: (del)
visibility: public
PKp}[ɡW�pp"ri/1.8/system/String/to_sym-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the <tt>Symbol</tt> corresponding to <em>str</em>, creating the symbol if it did not previously exist. See <tt>Symbol#id2name</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;Koala&quot;.intern         #=&gt; :Koala\n   s = 'cat'.to_sym       #=&gt; :cat\n   s == :cat              #=&gt; true\n   s = '@cat'.to_sym      #=&gt; :@cat\n   s == :@cat             #=&gt; true\n"
- !ruby/struct:SM::Flow::P 
  body: This can also be used to create symbols that cannot be represented using the <tt>:xxx</tt> notation.
- !ruby/struct:SM::Flow::VERB 
  body: "   'cat and dog'.to_sym   #=&gt; :&quot;cat and dog&quot;\n"
full_name: String#to_sym
is_singleton: false
name: to_sym
params: |
  str.intern   => symbol
  str.to_sym   => symbol

visibility: public
PKp}[�c��#ri/1.8/system/String/replace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Replaces the contents and taintedness of <em>str</em> with the corresponding values in <em>other_str</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   s = &quot;hello&quot;         #=&gt; &quot;hello&quot;\n   s.replace &quot;world&quot;   #=&gt; &quot;world&quot;\n"
full_name: String#replace
is_singleton: false
name: replace
params: |
  str.replace(other_str)   => str

visibility: public
PKp}[.�}��%ri/1.8/system/String/partition-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Searches the string for <em>sep</em> and returns the part before it, the <em>sep</em>, and the part after it. If <em>sep</em> is not found, returns <em>str</em> and two empty strings. If no argument is given, Enumerable#partition is called.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hello&quot;.partition(&quot;l&quot;)         #=&gt; [&quot;he&quot;, &quot;l&quot;, &quot;lo&quot;]\n   &quot;hello&quot;.partition(&quot;x&quot;)         #=&gt; [&quot;hello&quot;, &quot;&quot;, &quot;&quot;]\n"
full_name: String#partition
is_singleton: false
name: partition
params: |
  str.partition(sep)              => [head, sep, tail]

visibility: public
PKp}[�V� ri/1.8/system/String/tr_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: String#tr_s
is_singleton: false
name: tr_s
params: (from, to)
visibility: public
PKp}[r�ʍ%ri/1.8/system/String/each_byte-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes each byte in <em>str</em> to the given block.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hello&quot;.each_byte {|c| print c, ' ' }\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   104 101 108 108 111\n"
full_name: String#each_byte
is_singleton: false
name: each_byte
params: |
  str.each_byte {|fixnum| block }    => str

visibility: public
PKp}[�C���!ri/1.8/system/String/tojis-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert <tt>self</tt> to ISO-2022-JP
- !ruby/struct:SM::Flow::P 
  body: <b>Note</b> This method decode MIME encoded string and convert halfwidth katakana to fullwidth katakana. If you don't want it, use NKF.nkf('-jxm0', str).
full_name: String#tojis
is_singleton: false
name: tojis
params: |
  String#tojis   -> string

visibility: public
PKp}[�Ip}}'ri/1.8/system/String/swapcase%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to <tt>String#swapcase</tt>, but modifies the receiver in place, returning <em>str</em>, or <tt>nil</tt> if no changes were made.
full_name: String#swapcase!
is_singleton: false
name: swapcase!
params: |
  str.swapcase!   => str or nil

visibility: public
PKp}[t�8��"ri/1.8/system/String/issjis-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns whether <tt>self</tt>'s encoding is Shift_JIS or not.
- !ruby/struct:SM::Flow::P 
  body: <b>Note</b> don't expect this return value is MatchData.
full_name: String#issjis
is_singleton: false
name: issjis
params: |
  String#issjis   -> obj or nil

visibility: public
PKp}[�+�		+ri/1.8/system/String/initialize_copy-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Replaces the contents and taintedness of <em>str</em> with the corresponding values in <em>other_str</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   s = &quot;hello&quot;         #=&gt; &quot;hello&quot;\n   s.replace &quot;world&quot;   #=&gt; &quot;world&quot;\n"
full_name: String#initialize_copy
is_singleton: false
name: initialize_copy
params: |
  str.replace(other_str)   => str

visibility: public
PKp}[!��c��"ri/1.8/system/String/rindex-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the index of the last occurrence of the given <em>substring</em>, character (<em>fixnum</em>), or pattern (<em>regexp</em>) in <em>str</em>. Returns <tt>nil</tt> if not found. If the second parameter is present, it specifies the position in the string to end the search---characters beyond this point will not be considered.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hello&quot;.rindex('e')             #=&gt; 1\n   &quot;hello&quot;.rindex('l')             #=&gt; 3\n   &quot;hello&quot;.rindex('a')             #=&gt; nil\n   &quot;hello&quot;.rindex(101)             #=&gt; 1\n   &quot;hello&quot;.rindex(/[aeiou]/, -2)   #=&gt; 1\n"
full_name: String#rindex
is_singleton: false
name: rindex
params: |
  str.rindex(substring [, fixnum])   => fixnum or nil
  str.rindex(fixnum [, fixnum])   => fixnum or nil
  str.rindex(regexp [, fixnum])   => fixnum or nil

visibility: public
PKp}[�R���)ri/1.8/system/String/original_succ-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #succ"
full_name: String#original_succ
is_singleton: false
name: original_succ
params: ()
visibility: private
PKp}[��:��"ri/1.8/system/String/upcase-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a copy of <em>str</em> with all lowercase letters replaced with their uppercase counterparts. The operation is locale insensitive---only characters ``a'' to ``z'' are affected.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hEllO&quot;.upcase   #=&gt; &quot;HELLO&quot;\n"
full_name: String#upcase
is_singleton: false
name: upcase
params: |
  str.upcase   => new_str

visibility: public
PKp}[4M=@��"ri/1.8/system/String/toutf8-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert <tt>self</tt> to UTF-8
- !ruby/struct:SM::Flow::P 
  body: <b>Note</b> This method decode MIME encoded string and convert halfwidth katakana to fullwidth katakana. If you don't want it, use NKF.nkf('-wxm0', str).
full_name: String#toutf8
is_singleton: false
name: toutf8
params: |
  String#toutf8   -> string

visibility: public
PKp}[0k��"ri/1.8/system/String/length-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the length of <em>str</em>.
full_name: String#length
is_singleton: false
name: length
params: |
  str.length   => integer

visibility: public
PKp}[әM�))$ri/1.8/system/String/swapcase-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a copy of <em>str</em> with uppercase alphabetic characters converted to lowercase and lowercase characters converted to uppercase.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;Hello&quot;.swapcase          #=&gt; &quot;hELLO&quot;\n   &quot;cYbEr_PuNk11&quot;.swapcase   #=&gt; &quot;CyBeR_pUnK11&quot;\n"
full_name: String#swapcase
is_singleton: false
name: swapcase
params: |
  str.swapcase   => new_str

visibility: public
PKp}[�FS��ri/1.8/system/String/%2b-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Concatenation---Returns a new <tt>String</tt> containing <em>other_str</em> concatenated to <em>str</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;Hello from &quot; + self.to_s   #=&gt; &quot;Hello from main&quot;\n"
full_name: String#+
is_singleton: false
name: +
params: |
  str + other_str   => new_str

visibility: public
PKp}[�'�=��"ri/1.8/system/String/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Append---Concatenates the given object to <em>str</em>. If the object is a <tt>Fixnum</tt> between 0 and 255, it is converted to a character before concatenation.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = &quot;hello &quot;\n   a &lt;&lt; &quot;world&quot;   #=&gt; &quot;hello world&quot;\n   a.concat(33)   #=&gt; &quot;hello world!&quot;\n"
full_name: String#<<
is_singleton: false
name: "<<"
params: |
  str << fixnum        => str
  str.concat(fixnum)   => str
  str << obj           => str
  str.concat(obj)      => str

visibility: public
PKp}[�		�EE)ri/1.8/system/String/capitalize%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Modifies <em>str</em> by converting the first character to uppercase and the remainder to lowercase. Returns <tt>nil</tt> if no changes are made.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = &quot;hello&quot;\n   a.capitalize!   #=&gt; &quot;Hello&quot;\n   a               #=&gt; &quot;Hello&quot;\n   a.capitalize!   #=&gt; nil\n"
full_name: String#capitalize!
is_singleton: false
name: capitalize!
params: |
  str.capitalize!   => str or nil

visibility: public
PKp}[J����#ri/1.8/system/String/chop%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: String#chop!
is_singleton: false
name: chop!
params: ()
visibility: public
PKp}[I�����,ri/1.8/system/String/original_succ%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #succ!"
full_name: String#original_succ!
is_singleton: false
name: original_succ!
params: ()
visibility: private
PKp}[ݶk�RR#ri/1.8/system/String/casecmp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Case-insensitive version of <tt>String#&lt;=&gt;</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;abcdef&quot;.casecmp(&quot;abcde&quot;)     #=&gt; 1\n   &quot;aBcDeF&quot;.casecmp(&quot;abcdef&quot;)    #=&gt; 0\n   &quot;abcdef&quot;.casecmp(&quot;abcdefg&quot;)   #=&gt; -1\n   &quot;abcdef&quot;.casecmp(&quot;ABCDEF&quot;)    #=&gt; 0\n"
full_name: String#casecmp
is_singleton: false
name: casecmp
params: |
  str.casecmp(other_str)   => -1, 0, +1

visibility: public
PKp}[�ɴ��� ri/1.8/system/String/succ-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: String#succ
is_singleton: false
name: succ
params: ()
visibility: public
PKp}[|���!ri/1.8/system/String/toeuc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert <tt>self</tt> to EUC-JP
- !ruby/struct:SM::Flow::P 
  body: <b>Note</b> This method decode MIME encoded string and convert halfwidth katakana to fullwidth katakana. If you don't want it, use NKF.nkf('-exm0', str).
full_name: String#toeuc
is_singleton: false
name: toeuc
params: |
  String#toeuc   -> string

visibility: public
PKp}[2d�%ri/1.8/system/String/mbchar%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: String#mbchar?
is_singleton: false
name: mbchar?
params: ()
visibility: public
PKp}[gi ri/1.8/system/String/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the receiver.
full_name: String#to_s
is_singleton: false
name: to_s
params: |
  str.to_s     => str
  str.to_str   => str

visibility: public
PKp}[Dr�%ri/1.8/system/String/lstrip%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes leading whitespace from <em>str</em>, returning <tt>nil</tt> if no change was made. See also <tt>String#rstrip!</tt> and <tt>String#strip!</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;  hello  &quot;.lstrip   #=&gt; &quot;hello  &quot;\n   &quot;hello&quot;.lstrip!      #=&gt; nil\n"
full_name: String#lstrip!
is_singleton: false
name: lstrip!
params: |
  str.lstrip!   => self or nil

visibility: public
PKp}[�����"ri/1.8/system/String/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equality---If <em>obj</em> is not a <tt>String</tt>, returns <tt>false</tt>. Otherwise, returns <tt>true</tt> if <em>str</em> <tt>&lt;=&gt;</tt> <em>obj</em> returns zero.
full_name: String#==
is_singleton: false
name: ==
params: |
  str == obj   => true or false

visibility: public
PKp}[���xx"ri/1.8/system/String/insert-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Inserts <em>other_str</em> before the character at the given <em>index</em>, modifying <em>str</em>. Negative indices count from the end of the string, and insert <em>after</em> the given character. The intent is insert <em>aString</em> so that it starts at the given <em>index</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;abcd&quot;.insert(0, 'X')    #=&gt; &quot;Xabcd&quot;\n   &quot;abcd&quot;.insert(3, 'X')    #=&gt; &quot;abcXd&quot;\n   &quot;abcd&quot;.insert(4, 'X')    #=&gt; &quot;abcdX&quot;\n   &quot;abcd&quot;.insert(-3, 'X')   #=&gt; &quot;abXcd&quot;\n   &quot;abcd&quot;.insert(-1, 'X')   #=&gt; &quot;abcdX&quot;\n"
full_name: String#insert
is_singleton: false
name: insert
params: |
  str.insert(index, other_str)   => str

visibility: public
PKp}[�_��%ri/1.8/system/String/each_char-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Passes each character in <em>str</em> to the given block.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hello&quot;.each_char {|c| print c, ' ' }\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   h e l l o\n"
full_name: String#each_char
is_singleton: false
name: each_char
params: |
  str.each_char {|cstr| block }    => str

visibility: public
PKp}[�r�d��ri/1.8/system/String/sub-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a copy of <em>str</em> with the <em>first</em> occurrence of <em>pattern</em> replaced with either <em>replacement</em> or the value of the block. The <em>pattern</em> will typically be a <tt>Regexp</tt>; if it is a <tt>String</tt> then no regular expression metacharacters will be interpreted (that is <tt>/\d/</tt> will match a digit, but <tt>'\d'</tt> will match a backslash followed by a 'd').
- !ruby/struct:SM::Flow::P 
  body: If the method call specifies <em>replacement</em>, special variables such as <tt>$&amp;</tt> will not be useful, as substitution into the string occurs before the pattern match starts. However, the sequences <tt>\1</tt>, <tt>\2</tt>, etc., may be used.
- !ruby/struct:SM::Flow::P 
  body: In the block form, the current match string is passed in as a parameter, and variables such as <tt>$1</tt>, <tt>$2</tt>, <tt>$`</tt>, <tt>$&amp;</tt>, and <tt>$'</tt> will be set appropriately. The value returned by the block will be substituted for the match on each call.
- !ruby/struct:SM::Flow::P 
  body: The result inherits any tainting in the original string or any supplied replacement string.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hello&quot;.sub(/[aeiou]/, '*')               #=&gt; &quot;h*llo&quot;\n   &quot;hello&quot;.sub(/([aeiou])/, '&lt;\\1&gt;')          #=&gt; &quot;h&lt;e&gt;llo&quot;\n   &quot;hello&quot;.sub(/./) {|s| s[0].to_s + ' ' }   #=&gt; &quot;104 ello&quot;\n"
full_name: String#sub
is_singleton: false
name: sub
params: |
  str.sub(pattern, replacement)         => new_str
  str.sub(pattern) {|match| block }     => new_str

visibility: public
PKp}[u�"�ri/1.8/system/String/sum-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a basic <em>n</em>-bit checksum of the characters in <em>str</em>, where <em>n</em> is the optional <tt>Fixnum</tt> parameter, defaulting to 16. The result is simply the sum of the binary value of each character in <em>str</em> modulo <tt>2n - 1</tt>. This is not a particularly good checksum.
full_name: String#sum
is_singleton: false
name: sum
params: |
  str.sum(n=16)   => integer

visibility: public
PKp}[f��zz#ri/1.8/system/String/tr_s%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Performs <tt>String#tr_s</tt> processing on <em>str</em> in place, returning <em>str</em>, or <tt>nil</tt> if no changes were made.
full_name: String#tr_s!
is_singleton: false
name: tr_s!
params: |
  str.tr_s!(from_str, to_str)   => str or nil

visibility: public
PKp}[���hh ri/1.8/system/String/dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Produces a version of <em>str</em> with all nonprinting characters replaced by <tt>\nnn</tt> notation and all special characters escaped.
full_name: String#dump
is_singleton: false
name: dump
params: |
  str.dump   => new_str

visibility: public
PKp}[�.�Q��&ri/1.8/system/String/_expand_ch-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: String#_expand_ch
is_singleton: false
name: _expand_ch
params: (str)
visibility: private
PKp}[�(��"ri/1.8/system/String/lstrip-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a copy of <em>str</em> with leading whitespace removed. See also <tt>String#rstrip</tt> and <tt>String#strip</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;  hello  &quot;.lstrip   #=&gt; &quot;hello  &quot;\n   &quot;hello&quot;.lstrip       #=&gt; &quot;hello&quot;\n"
full_name: String#lstrip
is_singleton: false
name: lstrip
params: |
  str.lstrip   => new_str

visibility: public
PKp}[@�@XX$ri/1.8/system/String/strip%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes leading and trailing whitespace from <em>str</em>. Returns <tt>nil</tt> if <em>str</em> was not altered.
full_name: String#strip!
is_singleton: false
name: strip!
params: |
  str.strip!   => str or nil

visibility: public
PKp}[�DZ��.ri/1.8/system/String/is_complex_yaml%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: String#is_complex_yaml?
is_singleton: false
name: is_complex_yaml?
params: ()
visibility: public
PKp}[������ ri/1.8/system/String/to_f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the result of interpreting leading characters in <em>str</em> as a floating point number. Extraneous characters past the end of a valid number are ignored. If there is not a valid number at the start of <em>str</em>, <tt>0.0</tt> is returned. This method never raises an exception.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;123.45e1&quot;.to_f        #=&gt; 1234.5\n   &quot;45.67 degrees&quot;.to_f   #=&gt; 45.67\n   &quot;thx1138&quot;.to_f         #=&gt; 0.0\n"
full_name: String#to_f
is_singleton: false
name: to_f
params: |
  str.to_f   => float

visibility: public
PKp}[=e@W��%ri/1.8/system/String/%5b%5d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Element Assignment---Replaces some or all of the content of <em>str</em>. The portion of the string affected is determined using the same criteria as <tt>String#[]</tt>. If the replacement string is not the same length as the text it is replacing, the string will be adjusted accordingly. If the regular expression or string is used as the index doesn't match a position in the string, <tt>IndexError</tt> is raised. If the regular expression form is used, the optional second <tt>Fixnum</tt> allows you to specify which portion of the match to replace (effectively using the <tt>MatchData</tt> indexing rules. The forms that take a <tt>Fixnum</tt> will raise an <tt>IndexError</tt> if the value is out of range; the <tt>Range</tt> form will raise a <tt>RangeError</tt>, and the <tt>Regexp</tt> and <tt>String</tt> forms will silently ignore the assignment.
full_name: String#[]=
is_singleton: false
name: "[]="
params: |
  str[fixnum] = fixnum
  str[fixnum] = new_str
  str[fixnum, fixnum] = new_str
  str[range] = aString
  str[regexp] = new_str
  str[regexp, fixnum] = new_str
  str[other_str] = new_str

visibility: public
PKp}[���&!ri/1.8/system/String/iseuc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns whether <tt>self</tt>'s encoding is EUC-JP or not.
- !ruby/struct:SM::Flow::P 
  body: <b>Note</b> don't expect this return value is MatchData.
full_name: String#iseuc
is_singleton: false
name: iseuc
params: |
  String#iseuc   -> obj or nil

visibility: public
PKp}[�8���� ri/1.8/system/String/chop-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: String#chop
is_singleton: false
name: chop
params: ()
visibility: public
PKp}[
qgQ��&ri/1.8/system/String/rpartition-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Searches <em>sep</em> in the string from the end of the string, and returns the part before it, the <em>sep</em>, and the part after it. If <em>sep</em> is not found, returns two empty strings and <em>str</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hello&quot;.rpartition(&quot;l&quot;)         #=&gt; [&quot;hel&quot;, &quot;l&quot;, &quot;o&quot;]\n   &quot;hello&quot;.rpartition(&quot;x&quot;)         #=&gt; [&quot;&quot;, &quot;&quot;, &quot;hello&quot;]\n"
full_name: String#rpartition
is_singleton: false
name: rpartition
params: |
  str.rpartition(sep)            => [head, sep, tail]

visibility: public
PKp}[��!ri/1.8/system/String/count-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Each <em>other_str</em> parameter defines a set of characters to count. The intersection of these sets defines the characters to count in <em>str</em>. Any <em>other_str</em> that starts with a caret (^) is negated. The sequence c1--c2 means all characters between c1 and c2.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = &quot;hello world&quot;\n   a.count &quot;lo&quot;            #=&gt; 5\n   a.count &quot;lo&quot;, &quot;o&quot;       #=&gt; 2\n   a.count &quot;hello&quot;, &quot;^l&quot;   #=&gt; 4\n   a.count &quot;ej-m&quot;          #=&gt; 4\n"
full_name: String#count
is_singleton: false
name: count
params: |
  str.count([other_str]+)   => fixnum

visibility: public
PKq}[.�77'ri/1.8/system/String/end_with%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if <em>str</em> ends with the suffix given.
full_name: String#end_with?
is_singleton: false
name: end_with?
params: |
  str.end_with?([suffix]+)   => true or false

visibility: public
PKq}[�#t��"ri/1.8/system/String/jcount-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: String#jcount
is_singleton: false
name: jcount
params: (str)
visibility: public
PKq}[�n��nn'ri/1.8/system/String/shellescape-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Escapes <tt>str</tt> so that it can be safely used in a Bourne shell command line. See +Shellwords::shellescape+ for details.
full_name: String#shellescape
is_singleton: false
name: shellescape
params: |
  str.shellescape => string

visibility: public
PKq}[�9b��!ri/1.8/system/String/bytes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an enumerator that gives each byte in the string. If a block is given, it iterates over each byte in the string.
- !ruby/struct:SM::Flow::VERB 
  body: "   &quot;hello&quot;.bytes.to_a        #=&gt; [104, 101, 108, 108, 111]\n"
full_name: String#bytes
is_singleton: false
name: bytes
params: |
  str.bytes   => anEnumerator
  str.bytes {|fixnum| block }    => str

visibility: public
PKq}[���}'ri/1.8/system/Benchmark/realtime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the elapsed real time used to execute the given block.
full_name: Benchmark#realtime
is_singleton: false
name: realtime
params: () {|| ...}
visibility: public
PKq}[����BB!ri/1.8/system/Benchmark/bm-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: report
comment: 
- !ruby/struct:SM::Flow::P 
  body: "A simple interface to the #benchmark method, #bm is generates sequential reports with labels. The parameters have the same meaning as for #benchmark."
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'benchmark'\n\n    n = 50000\n    Benchmark.bm(7) do |x|\n      x.report(&quot;for:&quot;)   { for i in 1..n; a = &quot;1&quot;; end }\n      x.report(&quot;times:&quot;) { n.times do   ; a = &quot;1&quot;; end }\n      x.report(&quot;upto:&quot;)  { 1.upto(n) do ; a = &quot;1&quot;; end }\n    end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>Generates:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "                    user     system      total        real\n       for:     1.050000   0.000000   1.050000 (  0.503462)\n       times:   1.533333   0.016667   1.550000 (  0.735473)\n       upto:    1.500000   0.016667   1.516667 (  0.711239)\n"
full_name: Benchmark#bm
is_singleton: false
name: bm
params: (label_width = 0, *labels) {|report| ...}
visibility: public
PKq}[�Vu2AA#ri/1.8/system/Benchmark/bmbm-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: job
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Sometimes benchmark results are skewed because code executed earlier encounters different garbage collection overheads than that run later. #bmbm attempts to minimize this effect by running the tests twice, the first time as a rehearsal in order to get the runtime environment stable, the second time for real. <tt>GC.start</tt> is executed before the start of each of the real timings; the cost of this is not included in the timings. In reality, though, there's only so much that #bmbm can do, and the results are not guaranteed to be isolated from garbage collection and other effects."
- !ruby/struct:SM::Flow::P 
  body: "Because #bmbm takes two passes through the tests, it can calculate the required label width."
- !ruby/struct:SM::Flow::VERB 
  body: "      require 'benchmark'\n\n      array = (1..1000000).map { rand }\n\n      Benchmark.bmbm do |x|\n        x.report(&quot;sort!&quot;) { array.dup.sort! }\n        x.report(&quot;sort&quot;)  { array.dup.sort  }\n      end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>Generates:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "       Rehearsal -----------------------------------------\n       sort!  11.928000   0.010000  11.938000 ( 12.756000)\n       sort   13.048000   0.020000  13.068000 ( 13.857000)\n       ------------------------------- total: 25.006000sec\n\n                   user     system      total        real\n       sort!  12.959000   0.010000  12.969000 ( 13.793000)\n       sort   12.007000   0.000000  12.007000 ( 12.791000)\n"
- !ruby/struct:SM::Flow::P 
  body: "#bmbm yields a Benchmark::Job object and returns an array of Benchmark::Tms objects."
full_name: Benchmark#bmbm
is_singleton: false
name: bmbm
params: (width = 0) {|job| ...}
visibility: public
PKq}[ʻ��dd*ri/1.8/system/Benchmark/Job/cdesc-Job.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: A Job is a sequence of labelled blocks to be processed by the Benchmark.bmbm method. It is of little direct interest to the user.
constants: []

full_name: Benchmark::Job
includes: []

instance_methods: []

name: Job
superclass: Object
PKq}[�I�11&ri/1.8/system/Benchmark/measure-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the time used to execute the given block as a Benchmark::Tms object.
full_name: Benchmark#measure
is_singleton: false
name: measure
params: (label = "") {|| ...}
visibility: public
PKq}[m�;���,ri/1.8/system/Benchmark/cdesc-Benchmark.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The Benchmark module provides methods to measure and report the time used to execute Ruby code.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "Measure the time to construct the string given by the expression <tt>&quot;a&quot;*1_000_000</tt>:"
  - !ruby/struct:SM::Flow::VERB 
    body: "    require 'benchmark'\n\n    puts Benchmark.measure { &quot;a&quot;*1_000_000 }\n"
  - !ruby/struct:SM::Flow::P 
    body: "On my machine (FreeBSD 3.2 on P5, 100MHz) this generates:"
  - !ruby/struct:SM::Flow::VERB 
    body: "    1.166667   0.050000   1.216667 (  0.571355)\n"
  - !ruby/struct:SM::Flow::P 
    body: This report shows the user CPU time, system CPU time, the sum of the user and system CPU times, and the elapsed real time. The unit of time is seconds.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "Do some experiments sequentially using the #bm method:"
  - !ruby/struct:SM::Flow::VERB 
    body: "    require 'benchmark'\n\n    n = 50000\n    Benchmark.bm do |x|\n      x.report { for i in 1..n; a = &quot;1&quot;; end }\n      x.report { n.times do   ; a = &quot;1&quot;; end }\n      x.report { 1.upto(n) do ; a = &quot;1&quot;; end }\n    end\n"
  - !ruby/struct:SM::Flow::P 
    body: "The result:"
  - !ruby/struct:SM::Flow::VERB 
    body: "           user     system      total        real\n       1.033333   0.016667   1.016667 (  0.492106)\n       1.483333   0.000000   1.483333 (  0.694605)\n       1.516667   0.000000   1.516667 (  0.711077)\n"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "Continuing the previous example, put a label in each report:"
  - !ruby/struct:SM::Flow::VERB 
    body: "    require 'benchmark'\n\n    n = 50000\n    Benchmark.bm(7) do |x|\n      x.report(&quot;for:&quot;)   { for i in 1..n; a = &quot;1&quot;; end }\n      x.report(&quot;times:&quot;) { n.times do   ; a = &quot;1&quot;; end }\n      x.report(&quot;upto:&quot;)  { 1.upto(n) do ; a = &quot;1&quot;; end }\n    end\n"
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "The result:"
- !ruby/struct:SM::Flow::VERB 
  body: "                    user     system      total        real\n       for:     1.050000   0.000000   1.050000 (  0.503462)\n       times:   1.533333   0.016667   1.550000 (  0.735473)\n       upto:    1.500000   0.016667   1.516667 (  0.711239)\n"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "The times for some benchmarks depend on the order in which items are run. These differences are due to the cost of memory allocation and garbage collection. To avoid these discrepancies, the #bmbm method is provided. For example, to compare ways to sort an array of floats:"
  - !ruby/struct:SM::Flow::VERB 
    body: "    require 'benchmark'\n\n    array = (1..1000000).map { rand }\n\n    Benchmark.bmbm do |x|\n      x.report(&quot;sort!&quot;) { array.dup.sort! }\n      x.report(&quot;sort&quot;)  { array.dup.sort  }\n    end\n"
  - !ruby/struct:SM::Flow::P 
    body: "The result:"
  - !ruby/struct:SM::Flow::VERB 
    body: "     Rehearsal -----------------------------------------\n     sort!  11.928000   0.010000  11.938000 ( 12.756000)\n     sort   13.048000   0.020000  13.068000 ( 13.857000)\n     ------------------------------- total: 25.006000sec\n\n                 user     system      total        real\n     sort!  12.959000   0.010000  12.969000 ( 13.793000)\n     sort   12.007000   0.000000  12.007000 ( 12.791000)\n"
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "Report statistics of sequential experiments with unique labels, using the #benchmark method:"
  - !ruby/struct:SM::Flow::VERB 
    body: "    require 'benchmark'\n\n    n = 50000\n    Benchmark.benchmark(&quot; &quot;*7 + CAPTION, 7, FMTSTR, &quot;&gt;total:&quot;, &quot;&gt;avg:&quot;) do |x|\n      tf = x.report(&quot;for:&quot;)   { for i in 1..n; a = &quot;1&quot;; end }\n      tt = x.report(&quot;times:&quot;) { n.times do   ; a = &quot;1&quot;; end }\n      tu = x.report(&quot;upto:&quot;)  { 1.upto(n) do ; a = &quot;1&quot;; end }\n      [tf+tt+tu, (tf+tt+tu)/3]\n    end\n"
  - !ruby/struct:SM::Flow::P 
    body: "The result:"
  - !ruby/struct:SM::Flow::VERB 
    body: "                  user     system      total        real\n     for:     1.016667   0.016667   1.033333 (  0.485749)\n     times:   1.450000   0.016667   1.466667 (  0.681367)\n     upto:    1.533333   0.000000   1.533333 (  0.722166)\n     &gt;total:  4.000000   0.033333   4.033333 (  1.889282)\n     &gt;avg:    1.333333   0.011111   1.344444 (  0.629761)\n"
  type: :BULLET
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: BENCHMARK_VERSION
  value: "\"2002-04-25\""
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The default caption string (heading above the output times).
  name: CAPTION
  value: Benchmark::Tms::CAPTION
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The default format string used to display times. See also Benchmark::Tms#format.
  name: FMTSTR
  value: Benchmark::Tms::FMTSTR
full_name: Benchmark
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: benchmark
- !ruby/object:RI::MethodSummary 
  name: bm
- !ruby/object:RI::MethodSummary 
  name: bmbm
- !ruby/object:RI::MethodSummary 
  name: measure
- !ruby/object:RI::MethodSummary 
  name: realtime
name: Benchmark
superclass: 
PKq}[��G�??(ri/1.8/system/Benchmark/benchmark-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: report
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invokes the block with a <tt>Benchmark::Report</tt> object, which may be used to collect and report on the results of individual benchmark tests. Reserves <em>label_width</em> leading spaces for labels on each line. Prints <em>caption</em> at the top of the report, and uses <em>fmt</em> to format each line. If the block returns an array of <tt>Benchmark::Tms</tt> objects, these will be used to format additional lines of output. If <em>label</em> parameters are given, these are used to label these extra lines.
- !ruby/struct:SM::Flow::P 
  body: "<em>Note</em>: Other methods provide a simpler interface to this one, and are suitable for nearly all benchmarking requirements. See the examples in Benchmark, and the #bm and #bmbm methods."
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "    require 'benchmark'\n    include Benchmark          # we need the CAPTION and FMTSTR constants\n\n    n = 50000\n    Benchmark.benchmark(&quot; &quot;*7 + CAPTION, 7, FMTSTR, &quot;&gt;total:&quot;, &quot;&gt;avg:&quot;) do |x|\n      tf = x.report(&quot;for:&quot;)   { for i in 1..n; a = &quot;1&quot;; end }\n      tt = x.report(&quot;times:&quot;) { n.times do   ; a = &quot;1&quot;; end }\n      tu = x.report(&quot;upto:&quot;)  { 1.upto(n) do ; a = &quot;1&quot;; end }\n      [tf+tt+tu, (tf+tt+tu)/3]\n    end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>Generates:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "                    user     system      total        real\n       for:     1.016667   0.016667   1.033333 (  0.485749)\n       times:   1.450000   0.016667   1.466667 (  0.681367)\n       upto:    1.533333   0.000000   1.533333 (  0.722166)\n       &gt;total:  4.000000   0.033333   4.033333 (  1.889282)\n       &gt;avg:    1.333333   0.011111   1.344444 (  0.629761)\n"
full_name: Benchmark#benchmark
is_singleton: false
name: benchmark
params: (caption = "", label_width = nil, fmtstr = nil, *labels) {|report| ...}
visibility: public
PKq}[h�D(]]0ri/1.8/system/Benchmark/Report/cdesc-Report.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: This class is used by the Benchmark.benchmark and Benchmark.bm methods. It is of little direct interest to the user.
constants: []

full_name: Benchmark::Report
includes: []

instance_methods: []

name: Report
superclass: Object
PKq}[F�+D��)ri/1.8/system/Benchmark/Tms/add%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "An in-place version of #add."
full_name: Benchmark::Tms#add!
is_singleton: false
name: add!
params: ()
visibility: public
PKq}[�H	rr'ri/1.8/system/Benchmark/Tms/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new 6-element array, consisting of the label, user CPU time, system CPU time, children's user CPU time, children's system CPU time and elapsed real time.
full_name: Benchmark::Tms#to_a
is_singleton: false
name: to_a
params: ()
visibility: public
PKq}[��Yvv&ri/1.8/system/Benchmark/Tms/%2f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns a new Tms object obtained by memberwise division of the individual times for this Tms object by <em>x</em>. This method and #+() are useful for taking statistics."
full_name: Benchmark::Tms#/
is_singleton: false
name: /
params: (x)
visibility: public
PKq}[�B��-ri/1.8/system/Benchmark/Tms/memberwise-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Benchmark::Tms#memberwise
is_singleton: false
name: memberwise
params: (op, x)
visibility: protected
PKq}[�vEE&ri/1.8/system/Benchmark/Tms/%2a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new Tms object obtained by memberwise multiplication of the individual times for this Tms object by <em>x</em>.
full_name: Benchmark::Tms#*
is_singleton: false
name: "*"
params: (x)
visibility: public
PKq}[I�kk&ri/1.8/system/Benchmark/Tms/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new Tms object whose times are the sum of the times for this Tms object, plus the time required to execute the code block (<em>blk</em>).
full_name: Benchmark::Tms#add
is_singleton: false
name: add
params: () {|| ...}
visibility: public
PKq}[��6�&ri/1.8/system/Benchmark/Tms/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an initialized Tms object which has <em>u</em> as the user CPU time, <em>s</em> as the system CPU time, <em>cu</em> as the children's user CPU time, <em>cs</em> as the children's system CPU time, <em>real</em> as the elapsed real time and <em>l</em> as the label.
full_name: Benchmark::Tms::new
is_singleton: true
name: new
params: (u = 0.0, s = 0.0, cu = 0.0, cs = 0.0, real = 0.0, l = nil)
visibility: public
PKq}[��f��&ri/1.8/system/Benchmark/Tms/%2b-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns a new Tms object obtained by memberwise summation of the individual times for this Tms object with those of the other Tms object. This method and #/() are useful for taking statistics."
full_name: Benchmark::Tms#+
is_singleton: false
name: +
params: (other)
visibility: public
PKq}[��s.55)ri/1.8/system/Benchmark/Tms/format-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns the contents of this Tms object as a formatted string, according to a format string like that passed to Kernel.format. In addition, #format accepts the following extensions:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "<tt>%u</tt>:"
    body: Replaced by the user CPU time, as reported by Tms#utime.
  - !ruby/struct:SM::Flow::LI 
    label: "<tt>%y</tt>:"
    body: "Replaced by the system CPU time, as reported by #stime (Mnemonic: y of &quot;s*y*stem&quot;)"
  - !ruby/struct:SM::Flow::LI 
    label: "<tt>%U</tt>:"
    body: Replaced by the children's user CPU time, as reported by Tms#cutime
  - !ruby/struct:SM::Flow::LI 
    label: "<tt>%Y</tt>:"
    body: Replaced by the children's system CPU time, as reported by Tms#cstime
  - !ruby/struct:SM::Flow::LI 
    label: "<tt>%t</tt>:"
    body: Replaced by the total CPU time, as reported by Tms#total
  - !ruby/struct:SM::Flow::LI 
    label: "<tt>%r</tt>:"
    body: Replaced by the elapsed real time, as reported by Tms#real
  - !ruby/struct:SM::Flow::LI 
    label: "<tt>%n</tt>:"
    body: "Replaced by the label string, as reported by Tms#label (Mnemonic: n of &quot;*n*ame&quot;)"
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: If <em>fmtstr</em> is not given, FMTSTR is used as default value, detailing the user, system and real elapsed time.
full_name: Benchmark::Tms#format
is_singleton: false
name: format
params: (arg0 = nil, *args)
visibility: public
PKq}[�A�£�*ri/1.8/system/Benchmark/Tms/cdesc-Tms.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: System CPU time of children
  name: cstime
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: User CPU time of children
  name: cutime
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Label
  name: label
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Elapsed real time
  name: real
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: System CPU time
  name: stime
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Total time, that is <em>utime</em> + <em>stime</em> + <em>cutime</em> + <em>cstime</em>
  name: total
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: User CPU time
  name: utime
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A data object, representing the times associated with a benchmark measurement.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: CAPTION
  value: "\"      user     system      total        real\\n\""
- !ruby/object:RI::Constant 
  comment: 
  name: FMTSTR
  value: "\"%10.6u %10.6y %10.6t %10.6r\\n\""
full_name: Benchmark::Tms
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "*"
- !ruby/object:RI::MethodSummary 
  name: +
- !ruby/object:RI::MethodSummary 
  name: "-"
- !ruby/object:RI::MethodSummary 
  name: /
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: add!
- !ruby/object:RI::MethodSummary 
  name: format
- !ruby/object:RI::MethodSummary 
  name: memberwise
- !ruby/object:RI::MethodSummary 
  name: to_a
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Tms
superclass: Object
PKq}[����'ri/1.8/system/Benchmark/Tms/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Same as #format."
full_name: Benchmark::Tms#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PKq}[I�v[[&ri/1.8/system/Benchmark/Tms/%2d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new Tms object obtained by memberwise subtraction of the individual times for the other Tms object from those of this Tms object.
full_name: Benchmark::Tms#-
is_singleton: false
name: "-"
params: (other)
visibility: public
PKq}[x�Ԍ�.ri/1.8/system/BasicSocket/recv_nonblock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Receives up to <em>maxlen</em> bytes from <tt>socket</tt> using recvfrom(2) after O_NONBLOCK is set for the underlying file descriptor. <em>flags</em> is zero or more of the <tt>MSG_</tt> options. The result, <em>mesg</em>, is the data received.
- !ruby/struct:SM::Flow::P 
  body: "When recvfrom(2) returns 0, Socket#recv_nonblock returns an empty string as data. The meaning depends on the socket: EOF on TCP, empty packet on UDP, etc."
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameters
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>maxlen</tt> - the number of bytes to receive from the socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>flags</tt> - zero or more of the <tt>MSG_</tt> options
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "     serv = TCPServer.new(&quot;127.0.0.1&quot;, 0)\n     af, port, host, addr = serv.addr\n     c = TCPSocket.new(addr, port)\n     s = serv.accept\n     c.send &quot;aaa&quot;, 0\n     IO.select([s])\n     p s.recv_nonblock(10) #=&gt; &quot;aaa&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: Refer to Socket#recvfrom for the exceptions that may be thrown if the call to <em>recv_nonblock</em> fails.
- !ruby/struct:SM::Flow::P 
  body: BasicSocket#recv_nonblock may raise any error corresponding to recvfrom(2) failure, including Errno::EAGAIN.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: See
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Socket#recvfrom
  type: :BULLET
full_name: BasicSocket#recv_nonblock
is_singleton: false
name: recv_nonblock
params: |
  basicsocket.recv_nonblock(maxlen) => mesg
  basicsocket.recv_nonblock(maxlen, flags) => mesg

visibility: public
PKq}[j�`�+ri/1.8/system/BasicSocket/setsockopt-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets a socket option. These are protocol and system specific, see your local sytem documentation for details.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameters
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>level</tt> is an integer, usually one of the SOL_ constants such as Socket::SOL_SOCKET, or a protocol level.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>optname</tt> is an integer, usually one of the SO_ constants, such as Socket::SO_REUSEADDR.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: "<tt>optval</tt> is the value of the option, it is passed to the underlying setsockopt() as a pointer to a certain number of bytes. How this is done depends on the type:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "-"
      body: "Fixnum: value is assigned to an int, and a pointer to the int is passed, with length of sizeof(int)."
    - !ruby/struct:SM::Flow::LI 
      label: "-"
      body: "true or false: 1 or 0 (respectively) is assigned to an int, and the int is passed as for a Fixnum. Note that <tt>false</tt> must be passed, not <tt>nil</tt>."
    - !ruby/struct:SM::Flow::LI 
      label: "-"
      body: "String: the string's data and length is passed to the socket."
    type: :BULLET
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Examples
- !ruby/struct:SM::Flow::P 
  body: "Some socket options are integers with boolean values, in this case #setsockopt could be called like this:"
- !ruby/struct:SM::Flow::VERB 
  body: "  sock.setsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR, true)\n"
- !ruby/struct:SM::Flow::P 
  body: "Some socket options are integers with numeric values, in this case #setsockopt could be called like this:"
- !ruby/struct:SM::Flow::VERB 
  body: "  sock.setsockopt(Socket::IPPROTO_IP, Socket::IP_TTL, 255)\n"
- !ruby/struct:SM::Flow::P 
  body: "Option values may be structs. Passing them can be complex as it involves examining your system headers to determine the correct definition. An example is an <tt>ip_mreq</tt>, which may be defined in your system headers as:"
- !ruby/struct:SM::Flow::VERB 
  body: "  struct ip_mreq {\n    struct  in_addr imr_multiaddr;\n    struct  in_addr imr_interface;\n  };\n"
- !ruby/struct:SM::Flow::P 
  body: "In this case #setsockopt could be called like this:"
- !ruby/struct:SM::Flow::VERB 
  body: "  optval =  IPAddr.new(&quot;224.0.0.251&quot;) + Socket::INADDR_ANY\n  sock.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, optval)\n"
full_name: BasicSocket#setsockopt
is_singleton: false
name: setsockopt
params: " setsockopt(level, optname, optval)\n"
visibility: public
PKq}[9�&���+ri/1.8/system/BasicSocket/getsockopt-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Gets a socket option. These are protocol and system specific, see your local sytem documentation for details. The option is returned as a String with the data being the binary value of the socket option.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameters
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>level</tt> is an integer, usually one of the SOL_ constants such as Socket::SOL_SOCKET, or a protocol level.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>optname</tt> is an integer, usually one of the SO_ constants, such as Socket::SO_REUSEADDR.
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Examples
- !ruby/struct:SM::Flow::P 
  body: "Some socket options are integers with boolean values, in this case #getsockopt could be called like this:"
- !ruby/struct:SM::Flow::VERB 
  body: "  optval = sock.getsockopt(Socket::SOL_SOCKET,Socket::SO_REUSEADDR)\n  optval = optval.unpack &quot;i&quot;\n  reuseaddr = optval[0] == 0 ? false : true\n"
- !ruby/struct:SM::Flow::P 
  body: "Some socket options are integers with numeric values, in this case #getsockopt could be called like this:"
- !ruby/struct:SM::Flow::VERB 
  body: "  optval = sock.getsockopt(Socket::IPPROTO_IP, Socket::IP_TTL)\n  ipttl = optval.unpack(&quot;i&quot;)[0]\n"
- !ruby/struct:SM::Flow::P 
  body: "Option values may be structs. Decoding them can be complex as it involves examining your system headers to determine the correct definition. An example is a +struct linger+, which may be defined in your system headers as:"
- !ruby/struct:SM::Flow::VERB 
  body: "  struct linger {\n    int l_onoff;\n    int l_linger;\n  };\n"
- !ruby/struct:SM::Flow::P 
  body: "In this case #getsockopt could be called like this:"
- !ruby/struct:SM::Flow::VERB 
  body: "  optval =  sock.getsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER)\n  onoff, linger = optval.unpack &quot;ii&quot;\n"
full_name: BasicSocket#getsockopt
is_singleton: false
name: getsockopt
params: " getsockopt(level, optname)\n"
visibility: public
PKq}[J�d�0ri/1.8/system/BasicSocket/cdesc-BasicSocket.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Class <tt>Socket</tt> provides access to the underlying operating system socket implementations. It can be used to provide more operating system specific functionality than the protocol-specific socket classes but at the expense of greater complexity. In particular, the class handles addresses using +struct sockaddr+ structures packed into Ruby strings, which can be a joy to manipulate.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Exception Handling
- !ruby/struct:SM::Flow::P 
  body: Ruby's implementation of <tt>Socket</tt> causes an exception to be raised based on the error generated by the system dependent implementation. This is why the methods are documented in a way that isolate Unix-based system exceptions from Windows based exceptions. If more information on particular exception is needed please refer to the Unix manual pages or the Windows WinSock reference.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Documentation by
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Zach Dennis
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Sam Roberts
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <em>Programming Ruby</em> from The Pragmatic Bookshelf.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: Much material in this documentation is taken with permission from <em>Programming Ruby</em> from The Pragmatic Bookshelf.
constants: []

full_name: BasicSocket
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: getsockopt
- !ruby/object:RI::MethodSummary 
  name: recv_nonblock
- !ruby/object:RI::MethodSummary 
  name: setsockopt
name: BasicSocket
superclass: IO
PKq}[�����ri/1.8/system/Dir/chroot-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Changes this process's idea of the file system root. Only a privileged process may make this call. Not available on all platforms. On Unix systems, see <tt>chroot(2)</tt> for more information.
full_name: Dir::chroot
is_singleton: true
name: chroot
params: |
  Dir.chroot( string ) => 0

visibility: public
PKq}[*�v��ri/1.8/system/Dir/delete-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes the named directory. Raises a subclass of <tt>SystemCallError</tt> if the directory isn't empty.
full_name: Dir::delete
is_singleton: true
name: delete
params: |
  Dir.delete( string ) => 0
  Dir.rmdir( string ) => 0
  Dir.unlink( string ) => 0

visibility: public
PKq}[�M���� ri/1.8/system/Dir/cdesc-Dir.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: chdir
- !ruby/object:RI::MethodSummary 
  name: chroot
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: entries
- !ruby/object:RI::MethodSummary 
  name: foreach
- !ruby/object:RI::MethodSummary 
  name: getwd
- !ruby/object:RI::MethodSummary 
  name: glob
- !ruby/object:RI::MethodSummary 
  name: mkdir
- !ruby/object:RI::MethodSummary 
  name: mktmpdir
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: open
- !ruby/object:RI::MethodSummary 
  name: pwd
- !ruby/object:RI::MethodSummary 
  name: rmdir
- !ruby/object:RI::MethodSummary 
  name: tmpdir
- !ruby/object:RI::MethodSummary 
  name: unlink
comment: 
- !ruby/struct:SM::Flow::P 
  body: Objects of class <tt>Dir</tt> are directory streams representing directories in the underlying file system. They provide a variety of ways to list directories and their contents. See also <tt>File</tt>.
- !ruby/struct:SM::Flow::P 
  body: The directory used in these examples contains the two regular files (<tt>config.h</tt> and <tt>main.rb</tt>), the parent directory (<tt>..</tt>), and the directory itself (<tt>.</tt>).
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: CSIDL_LOCAL_APPDATA
  value: "0x001c"
full_name: Dir
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: path
- !ruby/object:RI::MethodSummary 
  name: pos
- !ruby/object:RI::MethodSummary 
  name: pos=
- !ruby/object:RI::MethodSummary 
  name: read
- !ruby/object:RI::MethodSummary 
  name: rewind
- !ruby/object:RI::MethodSummary 
  name: seek
- !ruby/object:RI::MethodSummary 
  name: tell
name: Dir
superclass: Object
PKq}[��.cuuri/1.8/system/Dir/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls the block once for each entry in this directory, passing the filename of each entry as a parameter to the block.
- !ruby/struct:SM::Flow::VERB 
  body: "   d = Dir.new(&quot;testdir&quot;)\n   d.each  {|x| puts &quot;Got #{x}&quot; }\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Got .\n   Got ..\n   Got config.h\n   Got main.rb\n"
full_name: Dir#each
is_singleton: false
name: each
params: |
  dir.each { |filename| block }  => dir

visibility: public
PKq}[��s��
�
ri/1.8/system/Dir/glob-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the filenames found by expanding <em>pattern</em> which is an <tt>Array</tt> of the patterns or the pattern <tt>String</tt>, either as an <em>array</em> or as parameters to the block. Note that this pattern is not a regexp (it's closer to a shell glob). See <tt>File::fnmatch</tt> for the meaning of the <em>flags</em> parameter. Note that case sensitivity depends on your system (so <tt>File::FNM_CASEFOLD</tt> is ignored)
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "<code>*</code>:"
    body: Matches any file. Can be restricted by other values in the glob. <tt>*</tt> will match all files; <tt>c*</tt> will match all files beginning with <tt>c</tt>; <tt>*c</tt> will match all files ending with <tt>c</tt>; and <b><tt>c</tt></b> will match all files that have <tt>c</tt> in them (including at the beginning or end). Equivalent to <tt>/ .* /x</tt> in regexp.
  - !ruby/struct:SM::Flow::LI 
    label: "<code>**</code>:"
    body: Matches directories recursively.
  - !ruby/struct:SM::Flow::LI 
    label: "<code>?</code>:"
    body: Matches any one character. Equivalent to <tt>/.{1}/</tt> in regexp.
  - !ruby/struct:SM::Flow::LI 
    label: "<code>[set]</code>:"
    body: Matches any one character in <tt>set</tt>. Behaves exactly like character sets in Regexp, including set negation (<tt>[^a-z]</tt>).
  - !ruby/struct:SM::Flow::LI 
    label: "<code>{p,q}</code>:"
    body: Matches either literal <tt>p</tt> or literal <tt>q</tt>. Matching literals may be more than one character in length. More than two literals may be specified. Equivalent to pattern alternation in regexp.
  - !ruby/struct:SM::Flow::LI 
    label: "<code>\\</code>:"
    body: Escapes the next metacharacter.
  type: :NOTE
- !ruby/struct:SM::Flow::VERB 
  body: "   Dir[&quot;config.?&quot;]                     #=&gt; [&quot;config.h&quot;]\n   Dir.glob(&quot;config.?&quot;)                #=&gt; [&quot;config.h&quot;]\n   Dir.glob(&quot;*.[a-z][a-z]&quot;)            #=&gt; [&quot;main.rb&quot;]\n   Dir.glob(&quot;*.[^r]*&quot;)                 #=&gt; [&quot;config.h&quot;]\n   Dir.glob(&quot;*.{rb,h}&quot;)                #=&gt; [&quot;main.rb&quot;, &quot;config.h&quot;]\n   Dir.glob(&quot;*&quot;)                       #=&gt; [&quot;config.h&quot;, &quot;main.rb&quot;]\n   Dir.glob(&quot;*&quot;, File::FNM_DOTMATCH)   #=&gt; [&quot;.&quot;, &quot;..&quot;, &quot;config.h&quot;, &quot;main.rb&quot;]\n\n   rbfiles = File.join(&quot;**&quot;, &quot;*.rb&quot;)\n   Dir.glob(rbfiles)                   #=&gt; [&quot;main.rb&quot;,\n                                            &quot;lib/song.rb&quot;,\n                                            &quot;lib/song/karaoke.rb&quot;]\n   libdirs = File.join(&quot;**&quot;, &quot;lib&quot;)\n   Dir.glob(libdirs)                   #=&gt; [&quot;lib&quot;]\n\n   librbfiles = File.join(&quot;**&quot;, &quot;lib&quot;, &quot;**&quot;, &quot;*.rb&quot;)\n   Dir.glob(librbfiles)                #=&gt; [&quot;lib/song.rb&quot;,\n                                            &quot;lib/song/karaoke.rb&quot;]\n\n   librbfiles = File.join(&quot;**&quot;, &quot;lib&quot;, &quot;*.rb&quot;)\n   Dir.glob(librbfiles)                #=&gt; [&quot;lib/song.rb&quot;]\n"
full_name: Dir::glob
is_singleton: true
name: glob
params: |
  Dir.glob( pattern, [flags] ) => array
  Dir.glob( pattern, [flags] ) {| filename | block }  => nil

visibility: public
PKq}[/��ri/1.8/system/Dir/read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Reads the next entry from <em>dir</em> and returns it as a string. Returns <tt>nil</tt> at the end of the stream.
- !ruby/struct:SM::Flow::VERB 
  body: "   d = Dir.new(&quot;testdir&quot;)\n   d.read   #=&gt; &quot;.&quot;\n   d.read   #=&gt; &quot;..&quot;\n   d.read   #=&gt; &quot;config.h&quot;\n"
full_name: Dir#read
is_singleton: false
name: read
params: |
  dir.read => string or nil

visibility: public
PKq}[�5��� ri/1.8/system/Dir/foreach-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls the block once for each entry in the named directory, passing the filename of each entry as a parameter to the block.
- !ruby/struct:SM::Flow::VERB 
  body: "   Dir.foreach(&quot;testdir&quot;) {|x| puts &quot;Got #{x}&quot; }\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Got .\n   Got ..\n   Got config.h\n   Got main.rb\n"
full_name: Dir::foreach
is_singleton: true
name: foreach
params: |
  Dir.foreach( dirname ) {| filename | block }  => nil

visibility: public
PKq}[����ri/1.8/system/Dir/path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the path parameter passed to <em>dir</em>'s constructor.
- !ruby/struct:SM::Flow::VERB 
  body: "   d = Dir.new(&quot;..&quot;)\n   d.path   #=&gt; &quot;..&quot;\n"
full_name: Dir#path
is_singleton: false
name: path
params: |
  dir.path => string or nil

visibility: public
PKq}[O;�e��ri/1.8/system/Dir/pwd-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the path to the current working directory of this process as a string.
- !ruby/struct:SM::Flow::VERB 
  body: "   Dir.chdir(&quot;/tmp&quot;)   #=&gt; 0\n   Dir.getwd           #=&gt; &quot;/tmp&quot;\n"
full_name: Dir::pwd
is_singleton: true
name: pwd
params: |
  Dir.getwd => string
  Dir.pwd => string

visibility: public
PKq}[,��J��ri/1.8/system/Dir/tell-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the current position in <em>dir</em>. See also <tt>Dir#seek</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   d = Dir.new(&quot;testdir&quot;)\n   d.tell   #=&gt; 0\n   d.read   #=&gt; &quot;.&quot;\n   d.tell   #=&gt; 12\n"
full_name: Dir#tell
is_singleton: false
name: tell
params: |
  dir.pos => integer
  dir.tell => integer

visibility: public
PKq}[g����ri/1.8/system/Dir/tmpdir-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the operating system's temporary file path.
full_name: Dir::tmpdir
is_singleton: true
name: tmpdir
params: ()
visibility: public
PKq}[������ri/1.8/system/Dir/rewind-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Repositions <em>dir</em> to the first entry.
- !ruby/struct:SM::Flow::VERB 
  body: "   d = Dir.new(&quot;testdir&quot;)\n   d.read     #=&gt; &quot;.&quot;\n   d.rewind   #=&gt; #&lt;Dir:0x401b3fb0&gt;\n   d.read     #=&gt; &quot;.&quot;\n"
full_name: Dir#rewind
is_singleton: false
name: rewind
params: |
  dir.rewind => dir

visibility: public
PKq}[�R7�

 ri/1.8/system/Dir/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a string describing this Dir object.
full_name: Dir#inspect
is_singleton: false
name: inspect
params: |
  dir.inspect => string

visibility: public
PKr}[jj�yri/1.8/system/Dir/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new directory object for the named directory.
full_name: Dir::new
is_singleton: true
name: new
params: |
  Dir.new( string ) -> aDir

visibility: public
PKr}[�輓��ri/1.8/system/Dir/getwd-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the path to the current working directory of this process as a string.
- !ruby/struct:SM::Flow::VERB 
  body: "   Dir.chdir(&quot;/tmp&quot;)   #=&gt; 0\n   Dir.getwd           #=&gt; &quot;/tmp&quot;\n"
full_name: Dir::getwd
is_singleton: true
name: getwd
params: |
  Dir.getwd => string
  Dir.pwd => string

visibility: public
PKr}[�Y���ri/1.8/system/Dir/unlink-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes the named directory. Raises a subclass of <tt>SystemCallError</tt> if the directory isn't empty.
full_name: Dir::unlink
is_singleton: true
name: unlink
params: |
  Dir.delete( string ) => 0
  Dir.rmdir( string ) => 0
  Dir.unlink( string ) => 0

visibility: public
PKr}[�
�q��ri/1.8/system/Dir/pos-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the current position in <em>dir</em>. See also <tt>Dir#seek</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   d = Dir.new(&quot;testdir&quot;)\n   d.tell   #=&gt; 0\n   d.read   #=&gt; &quot;.&quot;\n   d.tell   #=&gt; 12\n"
full_name: Dir#pos
is_singleton: false
name: pos
params: |
  dir.pos => integer
  dir.tell => integer

visibility: public
PKr}[?�'�## ri/1.8/system/Dir/entries-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array containing all of the filenames in the given directory. Will raise a <tt>SystemCallError</tt> if the named directory doesn't exist.
- !ruby/struct:SM::Flow::VERB 
  body: "   Dir.entries(&quot;testdir&quot;)   #=&gt; [&quot;.&quot;, &quot;..&quot;, &quot;config.h&quot;, &quot;main.rb&quot;]\n"
full_name: Dir::entries
is_singleton: true
name: entries
params: |
  Dir.entries( dirname ) => array

visibility: public
PKr}[Y|R0��ri/1.8/system/Dir/rmdir-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deletes the named directory. Raises a subclass of <tt>SystemCallError</tt> if the directory isn't empty.
full_name: Dir::rmdir
is_singleton: true
name: rmdir
params: |
  Dir.delete( string ) => 0
  Dir.rmdir( string ) => 0
  Dir.unlink( string ) => 0

visibility: public
PKr}[F����ri/1.8/system/Dir/chdir-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Changes the current working directory of the process to the given string. When called without an argument, changes the directory to the value of the environment variable <tt>HOME</tt>, or <tt>LOGDIR</tt>. <tt>SystemCallError</tt> (probably <tt>Errno::ENOENT</tt>) if the target directory does not exist.
- !ruby/struct:SM::Flow::P 
  body: If a block is given, it is passed the name of the new current directory, and the block is executed with that as the current directory. The original working directory is restored when the block exits. The return value of <tt>chdir</tt> is the value of the block. <tt>chdir</tt> blocks can be nested, but in a multi-threaded program an error will be raised if a thread attempts to open a <tt>chdir</tt> block while another thread has one open.
- !ruby/struct:SM::Flow::VERB 
  body: "   Dir.chdir(&quot;/var/spool/mail&quot;)\n   puts Dir.pwd\n   Dir.chdir(&quot;/tmp&quot;) do\n     puts Dir.pwd\n     Dir.chdir(&quot;/usr&quot;) do\n       puts Dir.pwd\n     end\n     puts Dir.pwd\n   end\n   puts Dir.pwd\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   /var/spool/mail\n   /tmp\n   /usr\n   /tmp\n   /var/spool/mail\n"
full_name: Dir::chdir
is_singleton: true
name: chdir
params: |
  Dir.chdir( [ string] ) => 0
  Dir.chdir( [ string] ) {| path | block }  => anObject

visibility: public
PKr}[�!�[��ri/1.8/system/Dir/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Closes the directory stream. Any further attempts to access <em>dir</em> will raise an <tt>IOError</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   d = Dir.new(&quot;testdir&quot;)\n   d.close   #=&gt; nil\n"
full_name: Dir#close
is_singleton: false
name: close
params: |
  dir.close => nil

visibility: public
PKr}[�
�#��ri/1.8/system/Dir/seek-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Seeks to a particular location in <em>dir</em>. <em>integer</em> must be a value returned by <tt>Dir#tell</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   d = Dir.new(&quot;testdir&quot;)   #=&gt; #&lt;Dir:0x401b3c40&gt;\n   d.read                   #=&gt; &quot;.&quot;\n   i = d.tell               #=&gt; 12\n   d.read                   #=&gt; &quot;..&quot;\n   d.seek(i)                #=&gt; #&lt;Dir:0x401b3c40&gt;\n   d.read                   #=&gt; &quot;..&quot;\n"
full_name: Dir#seek
is_singleton: false
name: seek
params: |
  dir.seek( integer ) => dir

visibility: public
PKr}[t$N~a	a	!ri/1.8/system/Dir/mktmpdir-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: path
comment: 
- !ruby/struct:SM::Flow::P 
  body: Dir.mktmpdir creates a temporary directory.
- !ruby/struct:SM::Flow::P 
  body: The directory is created with 0700 permission.
- !ruby/struct:SM::Flow::P 
  body: The prefix and suffix of the name of the directory is specified by the optional first argument, <em>prefix_suffix</em>.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: If it is not specified or nil, &quot;d&quot; is used as the prefix and no suffix is used.
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: If it is a string, it is used as the prefix and no suffix is used.
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: If it is an array, first element is used as the prefix and second element is used as a suffix.
  type: :BULLET
- !ruby/struct:SM::Flow::VERB 
  body: " Dir.mktmpdir {|dir| dir is &quot;.../d...&quot; }\n Dir.mktmpdir(&quot;foo&quot;) {|dir| dir is &quot;.../foo...&quot; }\n Dir.mktmpdir([&quot;foo&quot;, &quot;bar&quot;]) {|dir| dir is &quot;.../foo...bar&quot; }\n"
- !ruby/struct:SM::Flow::P 
  body: The directory is created under Dir.tmpdir or the optional second argument <em>tmpdir</em> if non-nil value is given.
- !ruby/struct:SM::Flow::VERB 
  body: " Dir.mktmpdir {|dir| dir is &quot;#{Dir.tmpdir}/d...&quot; }\n Dir.mktmpdir(nil, &quot;/var/tmp&quot;) {|dir| dir is &quot;/var/tmp/d...&quot; }\n"
- !ruby/struct:SM::Flow::P 
  body: If a block is given, it is yielded with the path of the directory. The directory and its contents are removed using FileUtils.remove_entry_secure before Dir.mktmpdir returns. The value of the block is returned.
- !ruby/struct:SM::Flow::VERB 
  body: " Dir.mktmpdir {|dir|\n   # use the directory...\n   open(&quot;#{dir}/foo&quot;, &quot;w&quot;) { ... }\n }\n"
- !ruby/struct:SM::Flow::P 
  body: If a block is not given, The path of the directory is returned. In this case, Dir.mktmpdir doesn't remove the directory.
- !ruby/struct:SM::Flow::VERB 
  body: " dir = Dir.mktmpdir\n begin\n   # use the directory...\n   open(&quot;#{dir}/foo&quot;, &quot;w&quot;) { ... }\n ensure\n   # remove the directory.\n   FileUtils.remove_entry_secure dir\n end\n"
full_name: Dir::mktmpdir
is_singleton: true
name: mktmpdir
params: (prefix_suffix=nil, tmpdir=nil) {|path| ...}
visibility: public
PKr}[�+�=]]ri/1.8/system/Dir/mkdir-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Makes a new directory named by <em>string</em>, with permissions specified by the optional parameter <em>anInteger</em>. The permissions may be modified by the value of <tt>File::umask</tt>, and are ignored on NT. Raises a <tt>SystemCallError</tt> if the directory cannot be created. See also the discussion of permissions in the class documentation for <tt>File</tt>.
full_name: Dir::mkdir
is_singleton: true
name: mkdir
params: |
  Dir.mkdir( string [, integer] ) => 0

visibility: public
PKr}[g�5d��ri/1.8/system/Dir/%5b%5d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to calling <tt>Dir.glob(</tt><em>array,</em><tt>0)</tt> and <tt>Dir.glob([</tt><em>string,...</em><tt>],0)</tt>.
full_name: Dir::[]
is_singleton: true
name: "[]"
params: |
  Dir[ array ]                 => array
  Dir[ string [, string ...] ] => array

visibility: public
PKr}[S`�||ri/1.8/system/Dir/pos%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Synonym for <tt>Dir#seek</tt>, but returns the position parameter.
- !ruby/struct:SM::Flow::VERB 
  body: "   d = Dir.new(&quot;testdir&quot;)   #=&gt; #&lt;Dir:0x401b3c40&gt;\n   d.read                   #=&gt; &quot;.&quot;\n   i = d.pos                #=&gt; 12\n   d.read                   #=&gt; &quot;..&quot;\n   d.pos = i                #=&gt; 12\n   d.read                   #=&gt; &quot;..&quot;\n"
full_name: Dir#pos=
is_singleton: false
name: pos=
params: |
  dir.pos( integer ) => integer

visibility: public
PKr}[��b��ri/1.8/system/Dir/open-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: With no block, <tt>open</tt> is a synonym for <tt>Dir::new</tt>. If a block is present, it is passed <em>aDir</em> as a parameter. The directory is closed at the end of the block, and <tt>Dir::open</tt> returns the value of the block.
full_name: Dir::open
is_singleton: true
name: open
params: |
  Dir.open( string ) => aDir
  Dir.open( string ) {| aDir | block } => anObject

visibility: public
PKr}[�;��&ri/1.8/system/Zlib/zlib_version-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the string which represents the version of zlib library.
full_name: Zlib::zlib_version
is_singleton: true
name: zlib_version
params: ()
visibility: public
PKr}[�3����*ri/1.8/system/Zlib/GzipWriter/flush-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Flushes all the internal buffers of the GzipWriter object. The meaning of <tt>flush</tt> is same as in Zlib::Deflate#deflate. <tt>Zlib::SYNC_FLUSH</tt> is used if <tt>flush</tt> is omitted. It is no use giving flush <tt>Zlib::NO_FLUSH</tt>.
full_name: Zlib::GzipWriter#flush
is_singleton: false
name: flush
params: " flush(flush=nil)\n"
visibility: public
PKr}[��k�***ri/1.8/system/Zlib/GzipWriter/print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Document-method: print Same as IO."
- !ruby/struct:SM::Flow::P 
  body: Same as IO.
full_name: Zlib::GzipWriter#print
is_singleton: false
name: print
params: (...)
visibility: public
PKr}[�`߹--+ri/1.8/system/Zlib/GzipWriter/printf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Document-method: printf Same as IO."
- !ruby/struct:SM::Flow::P 
  body: Same as IO.
full_name: Zlib::GzipWriter#printf
is_singleton: false
name: printf
params: (...)
visibility: public
PKr}[GҨa��-ri/1.8/system/Zlib/GzipWriter/mtime%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: ???
full_name: Zlib::GzipWriter#mtime=
is_singleton: false
name: mtime=
params: (p1)
visibility: public
PKr}[,if��)ri/1.8/system/Zlib/GzipWriter/tell-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: ???
full_name: Zlib::GzipWriter#tell
is_singleton: false
name: tell
params: ()
visibility: public
PKr}[�����1ri/1.8/system/Zlib/GzipWriter/orig_name%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: ???
full_name: Zlib::GzipWriter#orig_name=
is_singleton: false
name: orig_name=
params: (p1)
visibility: public
PKr}[�~WV;;(ri/1.8/system/Zlib/GzipWriter/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a GzipWriter object associated with <tt>io</tt>. <tt>level</tt> and <tt>strategy</tt> should be the same as the arguments of Zlib::Deflate.new. The GzipWriter object writes gzipped data to <tt>io</tt>. At least, <tt>io</tt> must respond to the <tt>write</tt> method that behaves same as write method in IO class.
full_name: Zlib::GzipWriter::new
is_singleton: true
name: new
params: " Zlib::GzipWriter.new(io, level, strategy)\n"
visibility: public
PKr}[rtƴ��/ri/1.8/system/Zlib/GzipWriter/comment%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: ???
full_name: Zlib::GzipWriter#comment=
is_singleton: false
name: comment=
params: (p1)
visibility: public
PKr}[��	_��3ri/1.8/system/Zlib/GzipWriter/cdesc-GzipWriter.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: open
comment: 
- !ruby/struct:SM::Flow::P 
  body: Zlib::GzipWriter is a class for writing gzipped files. GzipWriter should be used with an instance of IO, or IO-like, object.
- !ruby/struct:SM::Flow::P 
  body: "For example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  Zlib::GzipWriter.open('hoge.gz') do |gz|\n    gz.write 'jugemu jugemu gokou no surikire...'\n  end\n\n  File.open('hoge.gz', 'w') do |f|\n    gz = Zlib::GzipWriter.new(f)\n    gz.write 'jugemu jugemu gokou no surikire...'\n    gz.close\n  end\n\n  # TODO: test these.  Are they equivalent?  Can GzipWriter.new take a\n  # block?\n"
- !ruby/struct:SM::Flow::P 
  body: "NOTE: Due to the limitation of Ruby's finalizer, you must explicitly close GzipWriter objects by Zlib::GzipWriter#close etc. Otherwise, GzipWriter will be not able to write the gzip footer and will generate a broken gzip file."
constants: []

full_name: Zlib::GzipWriter
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: comment=
- !ruby/object:RI::MethodSummary 
  name: flush
- !ruby/object:RI::MethodSummary 
  name: mtime=
- !ruby/object:RI::MethodSummary 
  name: orig_name=
- !ruby/object:RI::MethodSummary 
  name: pos
- !ruby/object:RI::MethodSummary 
  name: print
- !ruby/object:RI::MethodSummary 
  name: printf
- !ruby/object:RI::MethodSummary 
  name: putc
- !ruby/object:RI::MethodSummary 
  name: puts
- !ruby/object:RI::MethodSummary 
  name: tell
- !ruby/object:RI::MethodSummary 
  name: write
name: GzipWriter
superclass: Zlib::GzipFile
PKr}[S�����*ri/1.8/system/Zlib/GzipWriter/write-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Same as IO.
full_name: Zlib::GzipWriter#write
is_singleton: false
name: write
params: (p1)
visibility: public
PKr}[|'��((+ri/1.8/system/Zlib/GzipWriter/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Document-method: &lt;&lt; Same as IO."
- !ruby/struct:SM::Flow::P 
  body: Same as IO.
full_name: Zlib::GzipWriter#<<
is_singleton: false
name: "<<"
params: (p1)
visibility: public
PKr}[��d;��(ri/1.8/system/Zlib/GzipWriter/pos-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: ???
full_name: Zlib::GzipWriter#pos
is_singleton: false
name: pos
params: ()
visibility: public
PKr}[2�����)ri/1.8/system/Zlib/GzipWriter/putc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Same as IO.
full_name: Zlib::GzipWriter#putc
is_singleton: false
name: putc
params: (p1)
visibility: public
PKr}[�iޗ'')ri/1.8/system/Zlib/GzipWriter/puts-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Document-method: puts Same as IO."
- !ruby/struct:SM::Flow::P 
  body: Same as IO.
full_name: Zlib::GzipWriter#puts
is_singleton: false
name: puts
params: (...)
visibility: public
PKr}[V�\��)ri/1.8/system/Zlib/GzipWriter/open-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Opens a file specified by <tt>filename</tt> for writing gzip compressed data, and returns a GzipWriter object associated with that file. Further details of this method are found in Zlib::GzipWriter.new and Zlib::GzipWriter#wrap.
full_name: Zlib::GzipWriter::open
is_singleton: true
name: open
params: " Zlib::GzipWriter.open(filename, level=nil, strategy=nil) { |gz| ... }\n"
visibility: public
PKr}[A�)ri/1.8/system/Zlib/Error/cdesc-Error.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The superclass for all exceptions raised by Ruby/zlib.
- !ruby/struct:SM::Flow::P 
  body: The following exceptions are defined as subclasses of Zlib::Error. These exceptions are raised when zlib library functions return with an error status.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: Zlib::StreamEnd
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: Zlib::NeedDict
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: Zlib::DataError
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: Zlib::StreamError
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: Zlib::MemError
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: Zlib::BufError
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: Zlib::VersionError
  type: :BULLET
constants: []

full_name: Zlib::Error
includes: []

instance_methods: []

name: Error
superclass: StandardError
PKr}[���D�	�	/ri/1.8/system/Zlib/BufError/cdesc-BufError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The Zlib module contains several classes for compressing and decompressing streams, and for working with &quot;gzip&quot; files.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Classes
- !ruby/struct:SM::Flow::P 
  body: "Following are the classes that are most likely to be of interest to the user: Zlib::Inflate Zlib::Deflate Zlib::GzipReader Zlib::GzipWriter"
- !ruby/struct:SM::Flow::P 
  body: "There are two important base classes for the classes above: Zlib::ZStream and Zlib::GzipFile. Everything else is an error class."
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Constants
- !ruby/struct:SM::Flow::P 
  body: Here's a list.
- !ruby/struct:SM::Flow::VERB 
  body: "  Zlib::VERSION\n      The Ruby/zlib version string.\n\n  Zlib::ZLIB_VERSION\n      The string which represents the version of zlib.h.\n\n  Zlib::BINARY\n  Zlib::ASCII\n  Zlib::UNKNOWN\n      The integers representing data types which Zlib::ZStream#data_type\n      method returns.\n\n  Zlib::NO_COMPRESSION\n  Zlib::BEST_SPEED\n  Zlib::BEST_COMPRESSION\n  Zlib::DEFAULT_COMPRESSION\n      The integers representing compression levels which are an argument\n      for Zlib::Deflate.new, Zlib::Deflate#deflate, and so on.\n\n  Zlib::FILTERED\n  Zlib::HUFFMAN_ONLY\n  Zlib::DEFAULT_STRATEGY\n      The integers representing compression methods which are an argument\n      for Zlib::Deflate.new and Zlib::Deflate#params.\n\n  Zlib::DEF_MEM_LEVEL\n  Zlib::MAX_MEM_LEVEL\n      The integers representing memory levels which are an argument for\n      Zlib::Deflate.new, Zlib::Deflate#params, and so on.\n\n  Zlib::MAX_WBITS\n      The default value of windowBits which is an argument for\n      Zlib::Deflate.new and Zlib::Inflate.new.\n\n  Zlib::NO_FLUSH\n  Zlib::SYNC_FLUSH\n  Zlib::FULL_FLUSH\n  Zlib::FINISH\n      The integers to control the output of the deflate stream, which are\n      an argument for Zlib::Deflate#deflate and so on.\n\n  Zlib::OS_CODE\n  Zlib::OS_MSDOS\n  Zlib::OS_AMIGA\n  Zlib::OS_VMS\n  Zlib::OS_UNIX\n  Zlib::OS_VMCMS\n  Zlib::OS_ATARI\n  Zlib::OS_OS2\n  Zlib::OS_MACOS\n  Zlib::OS_ZSYSTEM\n  Zlib::OS_CPM\n  Zlib::OS_TOPS20\n  Zlib::OS_WIN32\n  Zlib::OS_QDOS\n  Zlib::OS_RISCOS\n  Zlib::OS_UNKNOWN\n      The return values of Zlib::GzipFile#os_code method.\n"
constants: []

full_name: Zlib::BufError
includes: []

instance_methods: []

name: BufError
superclass: Zlib::Error
PKr}[�.>��-ri/1.8/system/Zlib/ZStream/finished%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the stream is finished.
full_name: Zlib::ZStream#finished?
is_singleton: false
name: finished?
params: ()
visibility: public
PKr}[E�n==-ri/1.8/system/Zlib/ZStream/cdesc-ZStream.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: "Zlib::ZStream is the abstract class for the stream which handles the compressed data. The operations are defined in the subclasses: Zlib::Deflate for compression, and Zlib::Inflate for decompression."
- !ruby/struct:SM::Flow::P 
  body: An instance of Zlib::ZStream has one stream (struct zstream in the source) and two variable-length buffers which associated to the input (next_in) of the stream and the output (next_out) of the stream. In this document, &quot;input buffer&quot; means the buffer for input, and &quot;output buffer&quot; means the buffer for output.
- !ruby/struct:SM::Flow::P 
  body: Data input into an instance of Zlib::ZStream are temporally stored into the end of input buffer, and then data in input buffer are processed from the beginning of the buffer until no more output from the stream is produced (i.e. until avail_out &gt; 0 after processing). During processing, output buffer is allocated and expanded automatically to hold all output data.
- !ruby/struct:SM::Flow::P 
  body: Some particular instance methods consume the data in output buffer and return them as a String.
- !ruby/struct:SM::Flow::P 
  body: "Here is an ascii art for describing above:"
- !ruby/struct:SM::Flow::VERB 
  body: "   +================ an instance of Zlib::ZStream ================+\n   ||                                                            ||\n   ||     +--------+          +-------+          +--------+      ||\n   ||  +--| output |&lt;---------|zstream|&lt;---------| input  |&lt;--+  ||\n   ||  |  | buffer |  next_out+-------+next_in   | buffer |   |  ||\n   ||  |  +--------+                             +--------+   |  ||\n   ||  |                                                      |  ||\n   +===|======================================================|===+\n       |                                                      |\n       v                                                      |\n   &quot;output data&quot;                                         &quot;input data&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: If an error occurs during processing input buffer, an exception which is a subclass of Zlib::Error is raised. At that time, both input and output buffer keep their conditions at the time when the error occurs.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Method Catalogue
- !ruby/struct:SM::Flow::P 
  body: Many of the methods in this class are fairly low-level and unlikely to be of interest to users. In fact, users are unlikely to use this class directly; rather they will be interested in Zlib::Inflate and Zlib::Deflate.
- !ruby/struct:SM::Flow::P 
  body: The higher level methods are listed below.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#total_in"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#total_out"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#data_type"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#adler"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#reset"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#finish"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#finished?"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#close"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#closed?"
  type: :BULLET
constants: []

full_name: Zlib::ZStream
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: adler
- !ruby/object:RI::MethodSummary 
  name: avail_in
- !ruby/object:RI::MethodSummary 
  name: avail_out
- !ruby/object:RI::MethodSummary 
  name: avail_out=
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: closed?
- !ruby/object:RI::MethodSummary 
  name: data_type
- !ruby/object:RI::MethodSummary 
  name: end
- !ruby/object:RI::MethodSummary 
  name: ended?
- !ruby/object:RI::MethodSummary 
  name: finish
- !ruby/object:RI::MethodSummary 
  name: finished?
- !ruby/object:RI::MethodSummary 
  name: flush_next_in
- !ruby/object:RI::MethodSummary 
  name: flush_next_out
- !ruby/object:RI::MethodSummary 
  name: reset
- !ruby/object:RI::MethodSummary 
  name: stream_end?
- !ruby/object:RI::MethodSummary 
  name: total_in
- !ruby/object:RI::MethodSummary 
  name: total_out
name: ZStream
superclass: Object
PKr}[ma�	0ri/1.8/system/Zlib/ZStream/flush_next_out-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Flushes output buffer and returns all data in that buffer.
full_name: Zlib::ZStream#flush_next_out
is_singleton: false
name: flush_next_out
params: ()
visibility: public
PKr}[�_Df��+ri/1.8/system/Zlib/ZStream/data_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Guesses the type of the data which have been inputed into the stream. The returned value is either <tt>Zlib::BINARY</tt>, <tt>Zlib::ASCII</tt>, or <tt>Zlib::UNKNOWN</tt>.
full_name: Zlib::ZStream#data_type
is_singleton: false
name: data_type
params: ()
visibility: public
PKr}[�ǩ���.ri/1.8/system/Zlib/ZStream/avail_out%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Allocates <tt>size</tt> bytes of free space in the output buffer. If there are more than <tt>size</tt> bytes already in the buffer, the buffer is truncated. Because free space is allocated automatically, you usually don't need to use this method.
full_name: Zlib::ZStream#avail_out=
is_singleton: false
name: avail_out=
params: (p1)
visibility: public
PKr}[�����'ri/1.8/system/Zlib/ZStream/adler-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the adler-32 checksum.
full_name: Zlib::ZStream#adler
is_singleton: false
name: adler
params: ()
visibility: public
PKs}[�j�p/ri/1.8/system/Zlib/ZStream/stream_end%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the stream is finished.
full_name: Zlib::ZStream#stream_end?
is_singleton: false
name: stream_end?
params: ()
visibility: public
PKs}[��{cc+ri/1.8/system/Zlib/ZStream/avail_out-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns number of bytes of free spaces in output buffer. Because the free space is allocated automatically, this method returns 0 normally.
full_name: Zlib::ZStream#avail_out
is_singleton: false
name: avail_out
params: ()
visibility: public
PKs}[�BZ
*ri/1.8/system/Zlib/ZStream/avail_in-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns bytes of data in the input buffer. Normally, returns 0.
full_name: Zlib::ZStream#avail_in
is_singleton: false
name: avail_in
params: ()
visibility: public
PKs}[�{��PP(ri/1.8/system/Zlib/ZStream/finish-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Finishes the stream and flushes output buffer. See Zlib::Deflate#finish and Zlib::Inflate#finish for details of this behavior.
full_name: Zlib::ZStream#finish
is_singleton: false
name: finish
params: ()
visibility: public
PKs}[$�Pr*ri/1.8/system/Zlib/ZStream/total_in-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the total bytes of the input data to the stream. FIXME
full_name: Zlib::ZStream#total_in
is_singleton: false
name: total_in
params: ()
visibility: public
PKs}[e/<w/ri/1.8/system/Zlib/ZStream/flush_next_in-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Flushes input buffer and returns all data in that buffer.
full_name: Zlib::ZStream#flush_next_in
is_singleton: false
name: flush_next_in
params: ()
visibility: public
PKs}[�+�=��+ri/1.8/system/Zlib/ZStream/closed%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the stream is closed.
full_name: Zlib::ZStream#closed?
is_singleton: false
name: closed?
params: ()
visibility: public
PKs}[4~�l%ri/1.8/system/Zlib/ZStream/end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Closes the stream. All operations on the closed stream will raise an exception.
full_name: Zlib::ZStream#end
is_singleton: false
name: end
params: ()
visibility: public
PKs}[������*ri/1.8/system/Zlib/ZStream/ended%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the stream is closed.
full_name: Zlib::ZStream#ended?
is_singleton: false
name: ended?
params: ()
visibility: public
PKs}[�C�N'ri/1.8/system/Zlib/ZStream/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Closes the stream. All operations on the closed stream will raise an exception.
full_name: Zlib::ZStream#close
is_singleton: false
name: close
params: ()
visibility: public
PKs}[�;w**'ri/1.8/system/Zlib/ZStream/reset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Resets and initializes the stream. All data in both input and output buffer are discarded.
full_name: Zlib::ZStream#reset
is_singleton: false
name: reset
params: ()
visibility: public
PKs}[�[�Z+ri/1.8/system/Zlib/ZStream/total_out-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the total bytes of the output data from the stream. FIXME
full_name: Zlib::ZStream#total_out
is_singleton: false
name: total_out
params: ()
visibility: public
PKs}[v���	�	5ri/1.8/system/Zlib/StreamError/cdesc-StreamError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The Zlib module contains several classes for compressing and decompressing streams, and for working with &quot;gzip&quot; files.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Classes
- !ruby/struct:SM::Flow::P 
  body: "Following are the classes that are most likely to be of interest to the user: Zlib::Inflate Zlib::Deflate Zlib::GzipReader Zlib::GzipWriter"
- !ruby/struct:SM::Flow::P 
  body: "There are two important base classes for the classes above: Zlib::ZStream and Zlib::GzipFile. Everything else is an error class."
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Constants
- !ruby/struct:SM::Flow::P 
  body: Here's a list.
- !ruby/struct:SM::Flow::VERB 
  body: "  Zlib::VERSION\n      The Ruby/zlib version string.\n\n  Zlib::ZLIB_VERSION\n      The string which represents the version of zlib.h.\n\n  Zlib::BINARY\n  Zlib::ASCII\n  Zlib::UNKNOWN\n      The integers representing data types which Zlib::ZStream#data_type\n      method returns.\n\n  Zlib::NO_COMPRESSION\n  Zlib::BEST_SPEED\n  Zlib::BEST_COMPRESSION\n  Zlib::DEFAULT_COMPRESSION\n      The integers representing compression levels which are an argument\n      for Zlib::Deflate.new, Zlib::Deflate#deflate, and so on.\n\n  Zlib::FILTERED\n  Zlib::HUFFMAN_ONLY\n  Zlib::DEFAULT_STRATEGY\n      The integers representing compression methods which are an argument\n      for Zlib::Deflate.new and Zlib::Deflate#params.\n\n  Zlib::DEF_MEM_LEVEL\n  Zlib::MAX_MEM_LEVEL\n      The integers representing memory levels which are an argument for\n      Zlib::Deflate.new, Zlib::Deflate#params, and so on.\n\n  Zlib::MAX_WBITS\n      The default value of windowBits which is an argument for\n      Zlib::Deflate.new and Zlib::Inflate.new.\n\n  Zlib::NO_FLUSH\n  Zlib::SYNC_FLUSH\n  Zlib::FULL_FLUSH\n  Zlib::FINISH\n      The integers to control the output of the deflate stream, which are\n      an argument for Zlib::Deflate#deflate and so on.\n\n  Zlib::OS_CODE\n  Zlib::OS_MSDOS\n  Zlib::OS_AMIGA\n  Zlib::OS_VMS\n  Zlib::OS_UNIX\n  Zlib::OS_VMCMS\n  Zlib::OS_ATARI\n  Zlib::OS_OS2\n  Zlib::OS_MACOS\n  Zlib::OS_ZSYSTEM\n  Zlib::OS_CPM\n  Zlib::OS_TOPS20\n  Zlib::OS_WIN32\n  Zlib::OS_QDOS\n  Zlib::OS_RISCOS\n  Zlib::OS_UNKNOWN\n      The return values of Zlib::GzipFile#os_code method.\n"
constants: []

full_name: Zlib::StreamError
includes: []

instance_methods: []

name: StreamError
superclass: Zlib::Error
PKs}[%,���)ri/1.8/system/Zlib/Inflate/inflate-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Decompresses <tt>string</tt>. Raises a Zlib::NeedDict exception if a preset dictionary is needed for decompression.
- !ruby/struct:SM::Flow::P 
  body: "This method is almost equivalent to the following code:"
- !ruby/struct:SM::Flow::VERB 
  body: "  def inflate(string)\n    zstream = Zlib::Inflate.new\n    buf = zstream.inflate(string)\n    zstream.finish\n    zstream.close\n    buf\n  end\n"
full_name: Zlib::Inflate::inflate
is_singleton: true
name: inflate
params: " Zlib::Inflate.inflate(string)\n"
visibility: public
PKs}[�x���%ri/1.8/system/Zlib/Inflate/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new inflate stream for decompression. See zlib.h for details of the argument. If <tt>window_bits</tt> is <tt>nil</tt>, the default value is used.
- !ruby/struct:SM::Flow::P 
  body: "TODO: document better!"
full_name: Zlib::Inflate::new
is_singleton: true
name: new
params: " Zlib::Inflate.new(window_bits)\n"
visibility: public
PKs}[����0ri/1.8/system/Zlib/Inflate/set_dictionary-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the preset dictionary and returns <tt>string</tt>. This method is available just only after a Zlib::NeedDict exception was raised. See zlib.h for details.
- !ruby/struct:SM::Flow::P 
  body: "TODO: document better!"
full_name: Zlib::Inflate#set_dictionary
is_singleton: false
name: set_dictionary
params: (p1)
visibility: public
PKs}[go`8��(ri/1.8/system/Zlib/Inflate/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Same as IO.
full_name: Zlib::Inflate#<<
is_singleton: false
name: "<<"
params: (p1)
visibility: public
PKs}[�oh)ri/1.8/system/Zlib/Inflate/inflate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Inputs <tt>string</tt> into the inflate stream and returns the output from the stream. Calling this method, both the input and the output buffer of the stream are flushed. If string is <tt>nil</tt>, this method finishes the stream, just like Zlib::ZStream#finish.
- !ruby/struct:SM::Flow::P 
  body: Raises a Zlib::NeedDict exception if a preset dictionary is needed to decompress. Set the dictionary by Zlib::Inflate#set_dictionary and then call this method again with an empty string. (<em>???</em>)
- !ruby/struct:SM::Flow::P 
  body: "TODO: document better!"
full_name: Zlib::Inflate#inflate
is_singleton: false
name: inflate
params: " inflate(string)\n"
visibility: public
PKs}[��^uu/ri/1.8/system/Zlib/Inflate/sync_point%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Quoted verbatim from original documentation:"
- !ruby/struct:SM::Flow::VERB 
  body: "  What is this?\n"
- !ruby/struct:SM::Flow::P 
  body: <tt>:)</tt>
full_name: Zlib::Inflate#sync_point?
is_singleton: false
name: sync_point?
params: ()
visibility: public
PKs}[�pV�&ri/1.8/system/Zlib/Inflate/sync-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Inputs <tt>string</tt> into the end of input buffer and skips data until a full flush point can be found. If the point is found in the buffer, this method flushes the buffer and returns false. Otherwise it returns <tt>true</tt> and the following data of full flush point is preserved in the buffer.
full_name: Zlib::Inflate#sync
is_singleton: false
name: sync
params: " sync(string)\n"
visibility: public
PKs}[�zv���-ri/1.8/system/Zlib/Inflate/cdesc-Inflate.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: inflate
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Zlib:Inflate is the class for decompressing compressed data. Unlike Zlib::Deflate, an instance of this class is not able to duplicate (clone, dup) itself.
constants: []

full_name: Zlib::Inflate
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: inflate
- !ruby/object:RI::MethodSummary 
  name: set_dictionary
- !ruby/object:RI::MethodSummary 
  name: sync
- !ruby/object:RI::MethodSummary 
  name: sync_point?
name: Inflate
superclass: Zlib::ZStream
PKs}[��z���'ri/1.8/system/Zlib/Deflate/flush-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: This method is equivalent to <tt>deflate('', flush)</tt>. If flush is omitted, <tt>Zlib::SYNC_FLUSH</tt> is used as flush. This method is just provided to improve the readability of your Ruby program.
- !ruby/struct:SM::Flow::P 
  body: "TODO: document better!"
full_name: Zlib::Deflate#flush
is_singleton: false
name: flush
params: " flush(flush)\n"
visibility: public
PKs}[^6=�		)ri/1.8/system/Zlib/Deflate/deflate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Inputs <tt>string</tt> into the deflate stream and returns the output from the stream. On calling this method, both the input and the output buffers of the stream are flushed. If <tt>string</tt> is nil, this method finishes the stream, just like Zlib::ZStream#finish.
- !ruby/struct:SM::Flow::P 
  body: The value of <tt>flush</tt> should be either <tt>Zlib::NO_FLUSH</tt>, <tt>Zlib::SYNC_FLUSH</tt>, <tt>Zlib::FULL_FLUSH</tt>, or <tt>Zlib::FINISH</tt>. See zlib.h for details.
- !ruby/struct:SM::Flow::P 
  body: "TODO: document better!"
full_name: Zlib::Deflate#deflate
is_singleton: false
name: deflate
params: " deflate(string[, flush])\n"
visibility: public
PKs}[Mu����%ri/1.8/system/Zlib/Deflate/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new deflate stream for compression. See zlib.h for details of each argument. If an argument is nil, the default value of that argument is used.
- !ruby/struct:SM::Flow::P 
  body: "TODO: document better!"
full_name: Zlib::Deflate::new
is_singleton: true
name: new
params: " Zlib::Deflate.new(level=nil, windowBits=nil, memlevel=nil, strategy=nil)\n"
visibility: public
PKs}[�<��-ri/1.8/system/Zlib/Deflate/cdesc-Deflate.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: deflate
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Zlib::Deflate is the class for compressing data. See Zlib::Stream for more information.
constants: []

full_name: Zlib::Deflate
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: deflate
- !ruby/object:RI::MethodSummary 
  name: flush
- !ruby/object:RI::MethodSummary 
  name: initialize_copy
- !ruby/object:RI::MethodSummary 
  name: params
- !ruby/object:RI::MethodSummary 
  name: set_dictionary
name: Deflate
superclass: Zlib::ZStream
PKs}[�*,�1ri/1.8/system/Zlib/Deflate/initialize_copy-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Duplicates the deflate stream.
full_name: Zlib::Deflate#initialize_copy
is_singleton: false
name: initialize_copy
params: (p1)
visibility: public
PKs}[ؤ���0ri/1.8/system/Zlib/Deflate/set_dictionary-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the preset dictionary and returns <tt>string</tt>. This method is available just only after Zlib::Deflate.new or Zlib::ZStream#reset method was called. See zlib.h for details.
- !ruby/struct:SM::Flow::P 
  body: "TODO: document better!"
full_name: Zlib::Deflate#set_dictionary
is_singleton: false
name: set_dictionary
params: " set_dictionary(string)\n"
visibility: public
PKt}[v�X��(ri/1.8/system/Zlib/Deflate/params-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Changes the parameters of the deflate stream. See zlib.h for details. The output from the stream by changing the params is preserved in output buffer.
- !ruby/struct:SM::Flow::P 
  body: "TODO: document better!"
full_name: Zlib::Deflate#params
is_singleton: false
name: params
params: " params(level, strategy)\n"
visibility: public
PKt}[)ʳ��(ri/1.8/system/Zlib/Deflate/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Same as IO.
full_name: Zlib::Deflate#<<
is_singleton: false
name: "<<"
params: (p1)
visibility: public
PKt}[�ᰍ;;)ri/1.8/system/Zlib/Deflate/deflate-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compresses the given <tt>string</tt>. Valid values of level are <tt>Zlib::NO_COMPRESSION</tt>, <tt>Zlib::BEST_SPEED</tt>, <tt>Zlib::BEST_COMPRESSION</tt>, <tt>Zlib::DEFAULT_COMPRESSION</tt>, and an integer from 0 to 9.
- !ruby/struct:SM::Flow::P 
  body: "This method is almost equivalent to the following code:"
- !ruby/struct:SM::Flow::VERB 
  body: "  def deflate(string, level)\n    z = Zlib::Deflate.new(level)\n    dst = z.deflate(string, Zlib::FINISH)\n    z.close\n    dst\n  end\n"
- !ruby/struct:SM::Flow::P 
  body: "TODO: what's default value of <tt>level</tt>?"
full_name: Zlib::Deflate::deflate
is_singleton: true
name: deflate
params: " Zlib::Deflate.deflate(string[, level])\n"
visibility: public
PKt}[��{*

#ri/1.8/system/Zlib/crc_table-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the table for calculating CRC checksum as an array.
full_name: Zlib::crc_table
is_singleton: true
name: crc_table
params: ()
visibility: public
PKt}[�W�E		)ri/1.8/system/Zlib/GzipReader/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See Zlib::GzipReader documentation for a description.
full_name: Zlib::GzipReader#each
is_singleton: false
name: each
params: (...)
visibility: public
PKt}[�Z�:��+ri/1.8/system/Zlib/GzipReader/lineno-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: ???
full_name: Zlib::GzipReader#lineno
is_singleton: false
name: lineno
params: ()
visibility: public
PKt}[��		)ri/1.8/system/Zlib/GzipReader/read-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See Zlib::GzipReader documentation for a description.
full_name: Zlib::GzipReader#read
is_singleton: false
name: read
params: (...)
visibility: public
PKt}[D�]-ri/1.8/system/Zlib/GzipReader/readline-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See Zlib::GzipReader documentation for a description.
full_name: Zlib::GzipReader#readline
is_singleton: false
name: readline
params: (...)
visibility: public
PKt}[W �.ri/1.8/system/Zlib/GzipReader/each_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See Zlib::GzipReader documentation for a description.
full_name: Zlib::GzipReader#each_line
is_singleton: false
name: each_line
params: (...)
visibility: public
PKt}[J����)ri/1.8/system/Zlib/GzipReader/tell-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: ???
full_name: Zlib::GzipReader#tell
is_singleton: false
name: tell
params: ()
visibility: public
PKt}[Ψmoo+ri/1.8/system/Zlib/GzipReader/rewind-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Resets the position of the file pointer to the point created the GzipReader object. The associated IO object needs to respond to the <tt>seek</tt> method.
full_name: Zlib::GzipReader#rewind
is_singleton: false
name: rewind
params: ()
visibility: public
PKt}[�(�5+ri/1.8/system/Zlib/GzipReader/ungetc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See Zlib::GzipReader documentation for a description.
full_name: Zlib::GzipReader#ungetc
is_singleton: false
name: ungetc
params: (p1)
visibility: public
PKt}[?2r���(ri/1.8/system/Zlib/GzipReader/eof-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: ???
full_name: Zlib::GzipReader#eof
is_singleton: false
name: eof
params: ()
visibility: public
PKt}[���'bb(ri/1.8/system/Zlib/GzipReader/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a GzipReader object associated with <tt>io</tt>. The GzipReader object reads gzipped data from <tt>io</tt>, and parses/decompresses them. At least, <tt>io</tt> must have a <tt>read</tt> method that behaves same as the <tt>read</tt> method in IO class.
- !ruby/struct:SM::Flow::P 
  body: If the gzip file header is incorrect, raises an Zlib::GzipFile::Error exception.
full_name: Zlib::GzipReader::new
is_singleton: true
name: new
params: " Zlib::GzipReader.new(io)\n"
visibility: public
PKt}[�����.ri/1.8/system/Zlib/GzipReader/lineno%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: ???
full_name: Zlib::GzipReader#lineno=
is_singleton: false
name: lineno=
params: (p1)
visibility: public
PKt}[ݎ��.ri/1.8/system/Zlib/GzipReader/each_byte-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See Zlib::GzipReader documentation for a description.
full_name: Zlib::GzipReader#each_byte
is_singleton: false
name: each_byte
params: ()
visibility: public
PKt}[��X8SS+ri/1.8/system/Zlib/GzipReader/unused-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the rest of the data which had read for parsing gzip format, or <tt>nil</tt> if the whole gzip file is not parsed yet.
full_name: Zlib::GzipReader#unused
is_singleton: false
name: unused
params: ()
visibility: public
PKt}[}v�v		)ri/1.8/system/Zlib/GzipReader/gets-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See Zlib::GzipReader documentation for a description.
full_name: Zlib::GzipReader#gets
is_singleton: false
name: gets
params: (...)
visibility: public
PKt}[�
�9��+ri/1.8/system/Zlib/GzipReader/eof%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: ???
full_name: Zlib::GzipReader#eof?
is_singleton: false
name: eof?
params: ()
visibility: public
PKt}[�g���(ri/1.8/system/Zlib/GzipReader/pos-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: ???
full_name: Zlib::GzipReader#pos
is_singleton: false
name: pos
params: ()
visibility: public
PKt}[��')ri/1.8/system/Zlib/GzipReader/getc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See Zlib::GzipReader documentation for a description.
full_name: Zlib::GzipReader#getc
is_singleton: false
name: getc
params: ()
visibility: public
PKt}[����-ri/1.8/system/Zlib/GzipReader/readchar-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See Zlib::GzipReader documentation for a description.
full_name: Zlib::GzipReader#readchar
is_singleton: false
name: readchar
params: ()
visibility: public
PKt}[���0.ri/1.8/system/Zlib/GzipReader/readlines-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See Zlib::GzipReader documentation for a description.
full_name: Zlib::GzipReader#readlines
is_singleton: false
name: readlines
params: (...)
visibility: public
PKt}[�<<3ri/1.8/system/Zlib/GzipReader/cdesc-GzipReader.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: open
comment: 
- !ruby/struct:SM::Flow::P 
  body: Zlib::GzipReader is the class for reading a gzipped file. GzipReader should be used an IO, or -IO-lie, object.
- !ruby/struct:SM::Flow::VERB 
  body: "  Zlib::GzipReader.open('hoge.gz') {|gz|\n    print gz.read\n  }\n\n  File.open('hoge.gz') do |f|\n    gz = Zlib::GzipReader.new(f)\n    print gz.read\n    gz.close\n  end\n\n  # TODO: test these.  Are they equivalent?  Can GzipReader.new take a\n  # block?\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Method Catalogue
- !ruby/struct:SM::Flow::P 
  body: The following methods in Zlib::GzipReader are just like their counterparts in IO, but they raise Zlib::Error or Zlib::GzipFile::Error exception if an error was found in the gzip file.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#each"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#each_line"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#each_byte"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#gets"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#getc"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#lineno"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#lineno="
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#read"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#readchar"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#readline"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#readlines"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "#ungetc"
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: Be careful of the footer of the gzip file. A gzip file has the checksum of pre-compressed data in its footer. GzipReader checks all uncompressed data against that checksum at the following cases, and if it fails, raises <tt>Zlib::GzipFile::NoFooter</tt>, <tt>Zlib::GzipFile::CRCError</tt>, or <tt>Zlib::GzipFile::LengthError</tt> exception.
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: When an reading request is received beyond the end of file (the end of compressed data). That is, when Zlib::GzipReader#read, Zlib::GzipReader#gets, or some other methods for reading returns nil.
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: When Zlib::GzipFile#close method is called after the object reaches the end of file.
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: When Zlib::GzipReader#unused method is called after the object reaches the end of file.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: The rest of the methods are adequately described in their own documentation.
constants: []

full_name: Zlib::GzipReader
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: each_byte
- !ruby/object:RI::MethodSummary 
  name: each_line
- !ruby/object:RI::MethodSummary 
  name: eof
- !ruby/object:RI::MethodSummary 
  name: eof?
- !ruby/object:RI::MethodSummary 
  name: getc
- !ruby/object:RI::MethodSummary 
  name: gets
- !ruby/object:RI::MethodSummary 
  name: lineno
- !ruby/object:RI::MethodSummary 
  name: lineno=
- !ruby/object:RI::MethodSummary 
  name: pos
- !ruby/object:RI::MethodSummary 
  name: read
- !ruby/object:RI::MethodSummary 
  name: readchar
- !ruby/object:RI::MethodSummary 
  name: readline
- !ruby/object:RI::MethodSummary 
  name: readlines
- !ruby/object:RI::MethodSummary 
  name: rewind
- !ruby/object:RI::MethodSummary 
  name: tell
- !ruby/object:RI::MethodSummary 
  name: ungetc
- !ruby/object:RI::MethodSummary 
  name: unused
name: GzipReader
superclass: Zlib::GzipFile
PKt}[��w^��)ri/1.8/system/Zlib/GzipReader/open-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Opens a file specified by <tt>filename</tt> as a gzipped file, and returns a GzipReader object associated with that file. Further details of this method are in Zlib::GzipReader.new and ZLib::GzipReader.wrap.
full_name: Zlib::GzipReader::open
is_singleton: true
name: open
params: " Zlib::GzipReader.open(filename) {|gz| ... }\n"
visibility: public
PKt}[@tn""!ri/1.8/system/Zlib/adler32-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calculates Adler-32 checksum for <tt>string</tt>, and returns updated value of <tt>adler</tt>. If <tt>string</tt> is omitted, it returns the Adler-32 initial value. If <tt>adler</tt> is omitted, it assumes that the initial value is given to <tt>adler</tt>.
- !ruby/struct:SM::Flow::P 
  body: "FIXME: expression."
full_name: Zlib::adler32
is_singleton: true
name: adler32
params: " Zlib.adler32(string, adler)\n"
visibility: public
PKt}[�
��	�	1ri/1.8/system/Zlib/DataError/cdesc-DataError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The Zlib module contains several classes for compressing and decompressing streams, and for working with &quot;gzip&quot; files.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Classes
- !ruby/struct:SM::Flow::P 
  body: "Following are the classes that are most likely to be of interest to the user: Zlib::Inflate Zlib::Deflate Zlib::GzipReader Zlib::GzipWriter"
- !ruby/struct:SM::Flow::P 
  body: "There are two important base classes for the classes above: Zlib::ZStream and Zlib::GzipFile. Everything else is an error class."
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Constants
- !ruby/struct:SM::Flow::P 
  body: Here's a list.
- !ruby/struct:SM::Flow::VERB 
  body: "  Zlib::VERSION\n      The Ruby/zlib version string.\n\n  Zlib::ZLIB_VERSION\n      The string which represents the version of zlib.h.\n\n  Zlib::BINARY\n  Zlib::ASCII\n  Zlib::UNKNOWN\n      The integers representing data types which Zlib::ZStream#data_type\n      method returns.\n\n  Zlib::NO_COMPRESSION\n  Zlib::BEST_SPEED\n  Zlib::BEST_COMPRESSION\n  Zlib::DEFAULT_COMPRESSION\n      The integers representing compression levels which are an argument\n      for Zlib::Deflate.new, Zlib::Deflate#deflate, and so on.\n\n  Zlib::FILTERED\n  Zlib::HUFFMAN_ONLY\n  Zlib::DEFAULT_STRATEGY\n      The integers representing compression methods which are an argument\n      for Zlib::Deflate.new and Zlib::Deflate#params.\n\n  Zlib::DEF_MEM_LEVEL\n  Zlib::MAX_MEM_LEVEL\n      The integers representing memory levels which are an argument for\n      Zlib::Deflate.new, Zlib::Deflate#params, and so on.\n\n  Zlib::MAX_WBITS\n      The default value of windowBits which is an argument for\n      Zlib::Deflate.new and Zlib::Inflate.new.\n\n  Zlib::NO_FLUSH\n  Zlib::SYNC_FLUSH\n  Zlib::FULL_FLUSH\n  Zlib::FINISH\n      The integers to control the output of the deflate stream, which are\n      an argument for Zlib::Deflate#deflate and so on.\n\n  Zlib::OS_CODE\n  Zlib::OS_MSDOS\n  Zlib::OS_AMIGA\n  Zlib::OS_VMS\n  Zlib::OS_UNIX\n  Zlib::OS_VMCMS\n  Zlib::OS_ATARI\n  Zlib::OS_OS2\n  Zlib::OS_MACOS\n  Zlib::OS_ZSYSTEM\n  Zlib::OS_CPM\n  Zlib::OS_TOPS20\n  Zlib::OS_WIN32\n  Zlib::OS_QDOS\n  Zlib::OS_RISCOS\n  Zlib::OS_UNKNOWN\n      The return values of Zlib::GzipFile#os_code method.\n"
constants: []

full_name: Zlib::DataError
includes: []

instance_methods: []

name: DataError
superclass: Zlib::Error
PKt}[��ǫ�
�
"ri/1.8/system/Zlib/cdesc-Zlib.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: adler32
- !ruby/object:RI::MethodSummary 
  name: crc32
- !ruby/object:RI::MethodSummary 
  name: crc_table
- !ruby/object:RI::MethodSummary 
  name: zlib_version
comment: 
- !ruby/struct:SM::Flow::P 
  body: GZIP_SUPPORT
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: VERSION
  value: rb_str_new2(RUBY_ZLIB_VERSION)
- !ruby/object:RI::Constant 
  comment: 
  name: ZLIB_VERSION
  value: rb_str_new2(ZLIB_VERSION)
- !ruby/object:RI::Constant 
  comment: 
  name: BINARY
  value: INT2FIX(Z_BINARY)
- !ruby/object:RI::Constant 
  comment: 
  name: ASCII
  value: INT2FIX(Z_ASCII)
- !ruby/object:RI::Constant 
  comment: 
  name: UNKNOWN
  value: INT2FIX(Z_UNKNOWN)
- !ruby/object:RI::Constant 
  comment: 
  name: NO_COMPRESSION
  value: INT2FIX(Z_NO_COMPRESSION)
- !ruby/object:RI::Constant 
  comment: 
  name: BEST_SPEED
  value: INT2FIX(Z_BEST_SPEED)
- !ruby/object:RI::Constant 
  comment: 
  name: BEST_COMPRESSION
  value: INT2FIX(Z_BEST_COMPRESSION)
- !ruby/object:RI::Constant 
  comment: 
  name: DEFAULT_COMPRESSION
  value: INT2FIX(Z_DEFAULT_COMPRESSION)
- !ruby/object:RI::Constant 
  comment: 
  name: FILTERED
  value: INT2FIX(Z_FILTERED)
- !ruby/object:RI::Constant 
  comment: 
  name: HUFFMAN_ONLY
  value: INT2FIX(Z_HUFFMAN_ONLY)
- !ruby/object:RI::Constant 
  comment: 
  name: DEFAULT_STRATEGY
  value: INT2FIX(Z_DEFAULT_STRATEGY)
- !ruby/object:RI::Constant 
  comment: 
  name: MAX_WBITS
  value: INT2FIX(MAX_WBITS)
- !ruby/object:RI::Constant 
  comment: 
  name: DEF_MEM_LEVEL
  value: INT2FIX(DEF_MEM_LEVEL)
- !ruby/object:RI::Constant 
  comment: 
  name: MAX_MEM_LEVEL
  value: INT2FIX(MAX_MEM_LEVEL)
- !ruby/object:RI::Constant 
  comment: 
  name: NO_FLUSH
  value: INT2FIX(Z_NO_FLUSH)
- !ruby/object:RI::Constant 
  comment: 
  name: SYNC_FLUSH
  value: INT2FIX(Z_SYNC_FLUSH)
- !ruby/object:RI::Constant 
  comment: 
  name: FULL_FLUSH
  value: INT2FIX(Z_FULL_FLUSH)
- !ruby/object:RI::Constant 
  comment: 
  name: FINISH
  value: INT2FIX(Z_FINISH)
- !ruby/object:RI::Constant 
  comment: 
  name: OS_CODE
  value: INT2FIX(OS_CODE)
- !ruby/object:RI::Constant 
  comment: 
  name: OS_MSDOS
  value: INT2FIX(OS_MSDOS)
- !ruby/object:RI::Constant 
  comment: 
  name: OS_AMIGA
  value: INT2FIX(OS_AMIGA)
- !ruby/object:RI::Constant 
  comment: 
  name: OS_VMS
  value: INT2FIX(OS_VMS)
- !ruby/object:RI::Constant 
  comment: 
  name: OS_UNIX
  value: INT2FIX(OS_UNIX)
- !ruby/object:RI::Constant 
  comment: 
  name: OS_ATARI
  value: INT2FIX(OS_ATARI)
- !ruby/object:RI::Constant 
  comment: 
  name: OS_OS2
  value: INT2FIX(OS_OS2)
- !ruby/object:RI::Constant 
  comment: 
  name: OS_MACOS
  value: INT2FIX(OS_MACOS)
- !ruby/object:RI::Constant 
  comment: 
  name: OS_TOPS20
  value: INT2FIX(OS_TOPS20)
- !ruby/object:RI::Constant 
  comment: 
  name: OS_WIN32
  value: INT2FIX(OS_WIN32)
- !ruby/object:RI::Constant 
  comment: 
  name: OS_VMCMS
  value: INT2FIX(OS_VMCMS)
- !ruby/object:RI::Constant 
  comment: 
  name: OS_ZSYSTEM
  value: INT2FIX(OS_ZSYSTEM)
- !ruby/object:RI::Constant 
  comment: 
  name: OS_CPM
  value: INT2FIX(OS_CPM)
- !ruby/object:RI::Constant 
  comment: 
  name: OS_QDOS
  value: INT2FIX(OS_QDOS)
- !ruby/object:RI::Constant 
  comment: 
  name: OS_RISCOS
  value: INT2FIX(OS_RISCOS)
- !ruby/object:RI::Constant 
  comment: 
  name: OS_UNKNOWN
  value: INT2FIX(OS_UNKNOWN)
full_name: Zlib
includes: []

instance_methods: []

name: Zlib
superclass: 
PKt}[�c��	�	7ri/1.8/system/Zlib/VersionError/cdesc-VersionError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The Zlib module contains several classes for compressing and decompressing streams, and for working with &quot;gzip&quot; files.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Classes
- !ruby/struct:SM::Flow::P 
  body: "Following are the classes that are most likely to be of interest to the user: Zlib::Inflate Zlib::Deflate Zlib::GzipReader Zlib::GzipWriter"
- !ruby/struct:SM::Flow::P 
  body: "There are two important base classes for the classes above: Zlib::ZStream and Zlib::GzipFile. Everything else is an error class."
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Constants
- !ruby/struct:SM::Flow::P 
  body: Here's a list.
- !ruby/struct:SM::Flow::VERB 
  body: "  Zlib::VERSION\n      The Ruby/zlib version string.\n\n  Zlib::ZLIB_VERSION\n      The string which represents the version of zlib.h.\n\n  Zlib::BINARY\n  Zlib::ASCII\n  Zlib::UNKNOWN\n      The integers representing data types which Zlib::ZStream#data_type\n      method returns.\n\n  Zlib::NO_COMPRESSION\n  Zlib::BEST_SPEED\n  Zlib::BEST_COMPRESSION\n  Zlib::DEFAULT_COMPRESSION\n      The integers representing compression levels which are an argument\n      for Zlib::Deflate.new, Zlib::Deflate#deflate, and so on.\n\n  Zlib::FILTERED\n  Zlib::HUFFMAN_ONLY\n  Zlib::DEFAULT_STRATEGY\n      The integers representing compression methods which are an argument\n      for Zlib::Deflate.new and Zlib::Deflate#params.\n\n  Zlib::DEF_MEM_LEVEL\n  Zlib::MAX_MEM_LEVEL\n      The integers representing memory levels which are an argument for\n      Zlib::Deflate.new, Zlib::Deflate#params, and so on.\n\n  Zlib::MAX_WBITS\n      The default value of windowBits which is an argument for\n      Zlib::Deflate.new and Zlib::Inflate.new.\n\n  Zlib::NO_FLUSH\n  Zlib::SYNC_FLUSH\n  Zlib::FULL_FLUSH\n  Zlib::FINISH\n      The integers to control the output of the deflate stream, which are\n      an argument for Zlib::Deflate#deflate and so on.\n\n  Zlib::OS_CODE\n  Zlib::OS_MSDOS\n  Zlib::OS_AMIGA\n  Zlib::OS_VMS\n  Zlib::OS_UNIX\n  Zlib::OS_VMCMS\n  Zlib::OS_ATARI\n  Zlib::OS_OS2\n  Zlib::OS_MACOS\n  Zlib::OS_ZSYSTEM\n  Zlib::OS_CPM\n  Zlib::OS_TOPS20\n  Zlib::OS_WIN32\n  Zlib::OS_QDOS\n  Zlib::OS_RISCOS\n  Zlib::OS_UNKNOWN\n      The return values of Zlib::GzipFile#os_code method.\n"
constants: []

full_name: Zlib::VersionError
includes: []

instance_methods: []

name: VersionError
superclass: Zlib::Error
PKt}[���ri/1.8/system/Zlib/crc32-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calculates CRC checksum for <tt>string</tt>, and returns updated value of <tt>crc</tt>. If <tt>string</tt> is omitted, it returns the CRC initial value. If <tt>crc</tt> is omitted, it assumes that the initial value is given to <tt>crc</tt>.
- !ruby/struct:SM::Flow::P 
  body: "FIXME: expression."
full_name: Zlib::crc32
is_singleton: true
name: crc32
params: " Zlib.crc32(string, adler)\n"
visibility: public
PKt}[���

*ri/1.8/system/Zlib/GzipFile/os_code-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns OS code number recorded in the gzip file header.
full_name: Zlib::GzipFile#os_code
is_singleton: false
name: os_code
params: ()
visibility: public
PKt}[�_z���&ri/1.8/system/Zlib/GzipFile/crc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns CRC value of the uncompressed data.
full_name: Zlib::GzipFile#crc
is_singleton: false
name: crc
params: ()
visibility: public
PKt}[x�3��/ri/1.8/system/Zlib/GzipFile/cdesc-GzipFile.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: wrap
comment: 
- !ruby/struct:SM::Flow::P 
  body: Zlib::GzipFile is an abstract class for handling a gzip formatted compressed file. The operations are defined in the subclasses, Zlib::GzipReader for reading, and Zlib::GzipWriter for writing.
- !ruby/struct:SM::Flow::P 
  body: GzipReader should be used by associating an IO, or IO-like, object.
constants: []

full_name: Zlib::GzipFile
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: closed?
- !ruby/object:RI::MethodSummary 
  name: comment
- !ruby/object:RI::MethodSummary 
  name: crc
- !ruby/object:RI::MethodSummary 
  name: finish
- !ruby/object:RI::MethodSummary 
  name: level
- !ruby/object:RI::MethodSummary 
  name: mtime
- !ruby/object:RI::MethodSummary 
  name: orig_name
- !ruby/object:RI::MethodSummary 
  name: os_code
- !ruby/object:RI::MethodSummary 
  name: sync
- !ruby/object:RI::MethodSummary 
  name: sync=
- !ruby/object:RI::MethodSummary 
  name: to_io
name: GzipFile
superclass: Object
PKt}[h|�O��>ri/1.8/system/Zlib/GzipFile/LengthError/cdesc-LengthError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Raised when the data length recorded in the gzip file footer is not equivalent to the length of the actual uncompressed data.
constants: []

full_name: Zlib::GzipFile::LengthError
includes: []

instance_methods: []

name: LengthError
superclass: Zlib::GzipFile::Error
PKt}[���8ri/1.8/system/Zlib/GzipFile/CRCError/cdesc-CRCError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Raised when the CRC checksum recorded in gzip file footer is not equivalent to the CRC checksum of the actual uncompressed data.
constants: []

full_name: Zlib::GzipFile::CRCError
includes: []

instance_methods: []

name: CRCError
superclass: Zlib::GzipFile::Error
PKt}[�=��++8ri/1.8/system/Zlib/GzipFile/NoFooter/cdesc-NoFooter.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Raised when gzip file footer is not found.
constants: []

full_name: Zlib::GzipFile::NoFooter
includes: []

instance_methods: []

name: NoFooter
superclass: Zlib::GzipFile::Error
PKt}[�i,,2ri/1.8/system/Zlib/GzipFile/Error/cdesc-Error.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Base class of errors that occur when processing GZIP files.
constants: []

full_name: Zlib::GzipFile::Error
includes: []

instance_methods: []

name: Error
superclass: Zlib::Error
PKt}["�ss)ri/1.8/system/Zlib/GzipFile/finish-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Closes the GzipFile object. Unlike Zlib::GzipFile#close, this method never calls the close method of the associated IO object. Returns the associated IO object.
full_name: Zlib::GzipFile#finish
is_singleton: false
name: finish
params: ()
visibility: public
PKt}[���(ri/1.8/system/Zlib/GzipFile/mtime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns last modification time recorded in the gzip file header.
full_name: Zlib::GzipFile#mtime
is_singleton: false
name: mtime
params: ()
visibility: public
PKt}[g����(ri/1.8/system/Zlib/GzipFile/level-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns compression level.
full_name: Zlib::GzipFile#level
is_singleton: false
name: level
params: ()
visibility: public
PKt}[+/�(��,ri/1.8/system/Zlib/GzipFile/closed%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Same as IO.
full_name: Zlib::GzipFile#closed?
is_singleton: false
name: closed?
params: ()
visibility: public
PKt}[���r'ri/1.8/system/Zlib/GzipFile/wrap-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: See Zlib::GzipReader#wrap and Zlib::GzipWriter#wrap.
full_name: Zlib::GzipFile::wrap
is_singleton: true
name: wrap
params: (...)
visibility: public
PKt}[{�>b..*ri/1.8/system/Zlib/GzipFile/comment-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns comments recorded in the gzip file header, or nil if the comments is not present.
full_name: Zlib::GzipFile#comment
is_singleton: false
name: comment
params: ()
visibility: public
PKt}[��\JJ(ri/1.8/system/Zlib/GzipFile/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Closes the GzipFile object. This method calls close method of the associated IO object. Returns the associated IO object.
full_name: Zlib::GzipFile#close
is_singleton: false
name: close
params: ()
visibility: public
PKt}[������(ri/1.8/system/Zlib/GzipFile/to_io-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Same as IO.
full_name: Zlib::GzipFile#to_io
is_singleton: false
name: to_io
params: ()
visibility: public
PKt}[>��*ri/1.8/system/Zlib/GzipFile/sync%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Same as IO. If flag is <tt>true</tt>, the associated IO object must respond to the <tt>flush</tt> method. While <tt>sync</tt> mode is <tt>true</tt>, the compression ratio decreases sharply.
full_name: Zlib::GzipFile#sync=
is_singleton: false
name: sync=
params: " sync = flag\n"
visibility: public
PKt}[y)��II,ri/1.8/system/Zlib/GzipFile/orig_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns original filename recorded in the gzip file header, or <tt>nil</tt> if original filename is not present.
full_name: Zlib::GzipFile#orig_name
is_singleton: false
name: orig_name
params: ()
visibility: public
PKt}[�ae��'ri/1.8/system/Zlib/GzipFile/sync-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Same as IO.
full_name: Zlib::GzipFile#sync
is_singleton: false
name: sync
params: ()
visibility: public
PKt}[��+�	�	/ri/1.8/system/Zlib/MemError/cdesc-MemError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The Zlib module contains several classes for compressing and decompressing streams, and for working with &quot;gzip&quot; files.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Classes
- !ruby/struct:SM::Flow::P 
  body: "Following are the classes that are most likely to be of interest to the user: Zlib::Inflate Zlib::Deflate Zlib::GzipReader Zlib::GzipWriter"
- !ruby/struct:SM::Flow::P 
  body: "There are two important base classes for the classes above: Zlib::ZStream and Zlib::GzipFile. Everything else is an error class."
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Constants
- !ruby/struct:SM::Flow::P 
  body: Here's a list.
- !ruby/struct:SM::Flow::VERB 
  body: "  Zlib::VERSION\n      The Ruby/zlib version string.\n\n  Zlib::ZLIB_VERSION\n      The string which represents the version of zlib.h.\n\n  Zlib::BINARY\n  Zlib::ASCII\n  Zlib::UNKNOWN\n      The integers representing data types which Zlib::ZStream#data_type\n      method returns.\n\n  Zlib::NO_COMPRESSION\n  Zlib::BEST_SPEED\n  Zlib::BEST_COMPRESSION\n  Zlib::DEFAULT_COMPRESSION\n      The integers representing compression levels which are an argument\n      for Zlib::Deflate.new, Zlib::Deflate#deflate, and so on.\n\n  Zlib::FILTERED\n  Zlib::HUFFMAN_ONLY\n  Zlib::DEFAULT_STRATEGY\n      The integers representing compression methods which are an argument\n      for Zlib::Deflate.new and Zlib::Deflate#params.\n\n  Zlib::DEF_MEM_LEVEL\n  Zlib::MAX_MEM_LEVEL\n      The integers representing memory levels which are an argument for\n      Zlib::Deflate.new, Zlib::Deflate#params, and so on.\n\n  Zlib::MAX_WBITS\n      The default value of windowBits which is an argument for\n      Zlib::Deflate.new and Zlib::Inflate.new.\n\n  Zlib::NO_FLUSH\n  Zlib::SYNC_FLUSH\n  Zlib::FULL_FLUSH\n  Zlib::FINISH\n      The integers to control the output of the deflate stream, which are\n      an argument for Zlib::Deflate#deflate and so on.\n\n  Zlib::OS_CODE\n  Zlib::OS_MSDOS\n  Zlib::OS_AMIGA\n  Zlib::OS_VMS\n  Zlib::OS_UNIX\n  Zlib::OS_VMCMS\n  Zlib::OS_ATARI\n  Zlib::OS_OS2\n  Zlib::OS_MACOS\n  Zlib::OS_ZSYSTEM\n  Zlib::OS_CPM\n  Zlib::OS_TOPS20\n  Zlib::OS_WIN32\n  Zlib::OS_QDOS\n  Zlib::OS_RISCOS\n  Zlib::OS_UNKNOWN\n      The return values of Zlib::GzipFile#os_code method.\n"
constants: []

full_name: Zlib::MemError
includes: []

instance_methods: []

name: MemError
superclass: Zlib::Error
PKt}[GZ��	�	/ri/1.8/system/Zlib/NeedDict/cdesc-NeedDict.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The Zlib module contains several classes for compressing and decompressing streams, and for working with &quot;gzip&quot; files.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Classes
- !ruby/struct:SM::Flow::P 
  body: "Following are the classes that are most likely to be of interest to the user: Zlib::Inflate Zlib::Deflate Zlib::GzipReader Zlib::GzipWriter"
- !ruby/struct:SM::Flow::P 
  body: "There are two important base classes for the classes above: Zlib::ZStream and Zlib::GzipFile. Everything else is an error class."
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Constants
- !ruby/struct:SM::Flow::P 
  body: Here's a list.
- !ruby/struct:SM::Flow::VERB 
  body: "  Zlib::VERSION\n      The Ruby/zlib version string.\n\n  Zlib::ZLIB_VERSION\n      The string which represents the version of zlib.h.\n\n  Zlib::BINARY\n  Zlib::ASCII\n  Zlib::UNKNOWN\n      The integers representing data types which Zlib::ZStream#data_type\n      method returns.\n\n  Zlib::NO_COMPRESSION\n  Zlib::BEST_SPEED\n  Zlib::BEST_COMPRESSION\n  Zlib::DEFAULT_COMPRESSION\n      The integers representing compression levels which are an argument\n      for Zlib::Deflate.new, Zlib::Deflate#deflate, and so on.\n\n  Zlib::FILTERED\n  Zlib::HUFFMAN_ONLY\n  Zlib::DEFAULT_STRATEGY\n      The integers representing compression methods which are an argument\n      for Zlib::Deflate.new and Zlib::Deflate#params.\n\n  Zlib::DEF_MEM_LEVEL\n  Zlib::MAX_MEM_LEVEL\n      The integers representing memory levels which are an argument for\n      Zlib::Deflate.new, Zlib::Deflate#params, and so on.\n\n  Zlib::MAX_WBITS\n      The default value of windowBits which is an argument for\n      Zlib::Deflate.new and Zlib::Inflate.new.\n\n  Zlib::NO_FLUSH\n  Zlib::SYNC_FLUSH\n  Zlib::FULL_FLUSH\n  Zlib::FINISH\n      The integers to control the output of the deflate stream, which are\n      an argument for Zlib::Deflate#deflate and so on.\n\n  Zlib::OS_CODE\n  Zlib::OS_MSDOS\n  Zlib::OS_AMIGA\n  Zlib::OS_VMS\n  Zlib::OS_UNIX\n  Zlib::OS_VMCMS\n  Zlib::OS_ATARI\n  Zlib::OS_OS2\n  Zlib::OS_MACOS\n  Zlib::OS_ZSYSTEM\n  Zlib::OS_CPM\n  Zlib::OS_TOPS20\n  Zlib::OS_WIN32\n  Zlib::OS_QDOS\n  Zlib::OS_RISCOS\n  Zlib::OS_UNKNOWN\n      The return values of Zlib::GzipFile#os_code method.\n"
constants: []

full_name: Zlib::NeedDict
includes: []

instance_methods: []

name: NeedDict
superclass: Zlib::Error
PKt}[걳��	�	1ri/1.8/system/Zlib/StreamEnd/cdesc-StreamEnd.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The Zlib module contains several classes for compressing and decompressing streams, and for working with &quot;gzip&quot; files.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Classes
- !ruby/struct:SM::Flow::P 
  body: "Following are the classes that are most likely to be of interest to the user: Zlib::Inflate Zlib::Deflate Zlib::GzipReader Zlib::GzipWriter"
- !ruby/struct:SM::Flow::P 
  body: "There are two important base classes for the classes above: Zlib::ZStream and Zlib::GzipFile. Everything else is an error class."
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Constants
- !ruby/struct:SM::Flow::P 
  body: Here's a list.
- !ruby/struct:SM::Flow::VERB 
  body: "  Zlib::VERSION\n      The Ruby/zlib version string.\n\n  Zlib::ZLIB_VERSION\n      The string which represents the version of zlib.h.\n\n  Zlib::BINARY\n  Zlib::ASCII\n  Zlib::UNKNOWN\n      The integers representing data types which Zlib::ZStream#data_type\n      method returns.\n\n  Zlib::NO_COMPRESSION\n  Zlib::BEST_SPEED\n  Zlib::BEST_COMPRESSION\n  Zlib::DEFAULT_COMPRESSION\n      The integers representing compression levels which are an argument\n      for Zlib::Deflate.new, Zlib::Deflate#deflate, and so on.\n\n  Zlib::FILTERED\n  Zlib::HUFFMAN_ONLY\n  Zlib::DEFAULT_STRATEGY\n      The integers representing compression methods which are an argument\n      for Zlib::Deflate.new and Zlib::Deflate#params.\n\n  Zlib::DEF_MEM_LEVEL\n  Zlib::MAX_MEM_LEVEL\n      The integers representing memory levels which are an argument for\n      Zlib::Deflate.new, Zlib::Deflate#params, and so on.\n\n  Zlib::MAX_WBITS\n      The default value of windowBits which is an argument for\n      Zlib::Deflate.new and Zlib::Inflate.new.\n\n  Zlib::NO_FLUSH\n  Zlib::SYNC_FLUSH\n  Zlib::FULL_FLUSH\n  Zlib::FINISH\n      The integers to control the output of the deflate stream, which are\n      an argument for Zlib::Deflate#deflate and so on.\n\n  Zlib::OS_CODE\n  Zlib::OS_MSDOS\n  Zlib::OS_AMIGA\n  Zlib::OS_VMS\n  Zlib::OS_UNIX\n  Zlib::OS_VMCMS\n  Zlib::OS_ATARI\n  Zlib::OS_OS2\n  Zlib::OS_MACOS\n  Zlib::OS_ZSYSTEM\n  Zlib::OS_CPM\n  Zlib::OS_TOPS20\n  Zlib::OS_WIN32\n  Zlib::OS_QDOS\n  Zlib::OS_RISCOS\n  Zlib::OS_UNKNOWN\n      The return values of Zlib::GzipFile#os_code method.\n"
constants: []

full_name: Zlib::StreamEnd
includes: []

instance_methods: []

name: StreamEnd
superclass: Zlib::Error
PKt}[�D!+��0ri/1.8/system/RiDriver/report_class_stuff-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RiDriver#report_class_stuff
is_singleton: false
name: report_class_stuff
params: (namespaces)
visibility: public
PKt}[�[%FF:ri/1.8/system/RiDriver/report_missing_documentation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Couldn't find documentation in <tt>path</tt>, so tell the user what to do
full_name: RiDriver#report_missing_documentation
is_singleton: false
name: report_missing_documentation
params: (path)
visibility: public
PKt}[���*ri/1.8/system/RiDriver/process_args-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RiDriver#process_args
is_singleton: false
name: process_args
params: ()
visibility: public
PKt}[D�O*ri/1.8/system/RiDriver/cdesc-RiDriver.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: []

constants: []

full_name: RiDriver
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: get_info_for
- !ruby/object:RI::MethodSummary 
  name: process_args
- !ruby/object:RI::MethodSummary 
  name: report_class_stuff
- !ruby/object:RI::MethodSummary 
  name: report_method_stuff
- !ruby/object:RI::MethodSummary 
  name: report_missing_documentation
name: RiDriver
superclass: Object
PKt}[�(0��!ri/1.8/system/RiDriver/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RiDriver::new
is_singleton: true
name: new
params: ()
visibility: public
PKt}[Jaź�*ri/1.8/system/RiDriver/get_info_for-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: RiDriver#get_info_for
is_singleton: false
name: get_info_for
params: (arg)
visibility: public
PKt}[���1ri/1.8/system/RiDriver/report_method_stuff-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: If the list of matching methods contains exactly one entry, or if it contains an entry that exactly matches the requested method, then display that entry, otherwise display the list of matching method names
full_name: RiDriver#report_method_stuff
is_singleton: false
name: report_method_stuff
params: (requested_method_name, methods)
visibility: public
PKt}[�ب�(ri/1.8/system/SyncEnumerator/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of enumerated Enumerable objects, i.e. the size of each row.
full_name: SyncEnumerator#size
is_singleton: false
name: size
params: ()
visibility: public
PKt}[5�(ri/1.8/system/SyncEnumerator/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ret
comment: 
- !ruby/struct:SM::Flow::P 
  body: Enumerates rows of the Enumerable objects.
full_name: SyncEnumerator#each
is_singleton: false
name: each
params: () {|ret| ...}
visibility: public
PKt}[����zz6ri/1.8/system/SyncEnumerator/cdesc-SyncEnumerator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: SyncEnumerator creates an Enumerable object from multiple Enumerable objects and enumerates them synchronously.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'generator'\n\n  s = SyncEnumerator.new([1,2,3], ['a', 'b', 'c'])\n\n  # Yields [1, 'a'], [2, 'b'], and [3,'c']\n  s.each { |row| puts row.join(', ') }\n"
constants: []

full_name: SyncEnumerator
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: end?
- !ruby/object:RI::MethodSummary 
  name: length
- !ruby/object:RI::MethodSummary 
  name: size
name: SyncEnumerator
superclass: Object
PKt}[���""'ri/1.8/system/SyncEnumerator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new SyncEnumerator which enumerates rows of given Enumerable objects.
full_name: SyncEnumerator::new
is_singleton: true
name: new
params: (*enums)
visibility: public
PKt}[�D!""*ri/1.8/system/SyncEnumerator/length-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of enumerated Enumerable objects, i.e. the size of each row.
full_name: SyncEnumerator#length
is_singleton: false
name: length
params: ()
visibility: public
PKt}[}���vv*ri/1.8/system/SyncEnumerator/end%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns true if the given nth Enumerable object has reached the end. If no argument is given, returns true if any of the Enumerable objects has reached the end.
full_name: SyncEnumerator#end?
is_singleton: false
name: end?
params: (i = nil)
visibility: public
PKt}[�<i��0ri/1.8/system/RUNIT/ToPublic/cdesc-ToPublic.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RUNIT::ToPublic
includes: []

instance_methods: []

name: ToPublic
superclass: 
PKt}[#����0ri/1.8/system/RUNIT/TestResult/error_size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::TestResult#error_size
is_singleton: false
name: error_size
params: ()
visibility: public
PKt}[�)����/ri/1.8/system/RUNIT/TestResult/run_tests-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::TestResult#run_tests
is_singleton: false
name: run_tests
params: ()
visibility: public
PKt}[~����2ri/1.8/system/RUNIT/TestResult/failure_size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::TestResult#failure_size
is_singleton: false
name: failure_size
params: ()
visibility: public
PKt}[?��K��0ri/1.8/system/RUNIT/TestResult/succeed%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::TestResult#succeed?
is_singleton: false
name: succeed?
params: ()
visibility: public
PKt}[1��$��1ri/1.8/system/RUNIT/TestResult/add_failure-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::TestResult#add_failure
is_singleton: false
name: add_failure
params: (failure)
visibility: public
PKt}[5>^���4ri/1.8/system/RUNIT/TestResult/cdesc-TestResult.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: errors
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: failures
  rw: R
class_methods: []

comment: 
constants: []

full_name: RUNIT::TestResult
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_error
- !ruby/object:RI::MethodSummary 
  name: add_failure
- !ruby/object:RI::MethodSummary 
  name: error_size
- !ruby/object:RI::MethodSummary 
  name: failure_size
- !ruby/object:RI::MethodSummary 
  name: run_asserts
- !ruby/object:RI::MethodSummary 
  name: run_tests
- !ruby/object:RI::MethodSummary 
  name: succeed?
name: TestResult
superclass: Test::Unit::TestResult
PKt}[�v|���1ri/1.8/system/RUNIT/TestResult/run_asserts-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::TestResult#run_asserts
is_singleton: false
name: run_asserts
params: ()
visibility: public
PKt}[����/ri/1.8/system/RUNIT/TestResult/add_error-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::TestResult#add_error
is_singleton: false
name: add_error
params: (error)
visibility: public
PKt}[����9ri/1.8/system/RUNIT/CUI/TestRunner/create_mediator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::CUI::TestRunner#create_mediator
is_singleton: false
name: create_mediator
params: (suite)
visibility: public
PKt}[&��P��7ri/1.8/system/RUNIT/CUI/TestRunner/quiet_mode%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::CUI::TestRunner::quiet_mode=
is_singleton: true
name: quiet_mode=
params: (boolean)
visibility: public
PKt}[@B���-ri/1.8/system/RUNIT/CUI/TestRunner/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::CUI::TestRunner::new
is_singleton: true
name: new
params: ()
visibility: public
PKt}[i1F8ri/1.8/system/RUNIT/CUI/TestRunner/cdesc-TestRunner.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: quiet_mode=
- !ruby/object:RI::MethodSummary 
  name: run
comment: 
constants: []

full_name: RUNIT::CUI::TestRunner
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: create_mediator
- !ruby/object:RI::MethodSummary 
  name: create_result
- !ruby/object:RI::MethodSummary 
  name: run
name: TestRunner
superclass: Test::Unit::UI::Console::TestRunner
PKt}[����-ri/1.8/system/RUNIT/CUI/TestRunner/run-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::CUI::TestRunner::run
is_singleton: true
name: run
params: (suite)
visibility: public
PKt}[+����7ri/1.8/system/RUNIT/CUI/TestRunner/create_result-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::CUI::TestRunner#create_result
is_singleton: false
name: create_result
params: ()
visibility: public
PKt}[**���-ri/1.8/system/RUNIT/CUI/TestRunner/run-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::CUI::TestRunner#run
is_singleton: false
name: run
params: (suite, quiet_mode=@@quiet_mode)
visibility: public
PKt}[�9!��&ri/1.8/system/RUNIT/CUI/cdesc-CUI.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RUNIT::CUI
includes: []

instance_methods: []

name: CUI
superclass: 
PKt}[l����'ri/1.8/system/RUNIT/TestCase/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::TestCase::new
is_singleton: true
name: new
params: (test_name, suite_name=self.class.name)
visibility: public
PKt}[v����)ri/1.8/system/RUNIT/TestCase/suite-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::TestCase::suite
is_singleton: true
name: suite
params: ()
visibility: public
PKt}[Lt���0ri/1.8/system/RUNIT/TestCase/cdesc-TestCase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: suite
comment: 
constants: []

full_name: RUNIT::TestCase
includes: 
- !ruby/object:RI::IncludedModule 
  name: RUNIT::Assert
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: assert_equals
- !ruby/object:RI::MethodSummary 
  name: name
- !ruby/object:RI::MethodSummary 
  name: run
name: TestCase
superclass: Test::Unit::TestCase
PKt}[i	��'ri/1.8/system/RUNIT/TestCase/run-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::TestCase#run
is_singleton: false
name: run
params: (result, &progress_block)
visibility: public
PKt}[�^,\��(ri/1.8/system/RUNIT/TestCase/name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::TestCase#name
is_singleton: false
name: name
params: ()
visibility: public
PKt}[�
o��1ri/1.8/system/RUNIT/TestCase/assert_equals-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::TestCase#assert_equals
is_singleton: false
name: assert_equals
params: (*args)
visibility: public
PKt}[tP���5ri/1.8/system/RUNIT/TestSuite/count_test_cases-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::TestSuite#count_test_cases
is_singleton: false
name: count_test_cases
params: ()
visibility: public
PKt}[�,N��(ri/1.8/system/RUNIT/TestSuite/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::TestSuite#add
is_singleton: false
name: add
params: (*args)
visibility: public
PKt}[���A��-ri/1.8/system/RUNIT/TestSuite/add_test-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::TestSuite#add_test
is_singleton: false
name: add_test
params: (*args)
visibility: public
PKu}[��u_��(ri/1.8/system/RUNIT/TestSuite/run-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::TestSuite#run
is_singleton: false
name: run
params: (result, &progress_block)
visibility: public
PKu}[A��K��2ri/1.8/system/RUNIT/TestSuite/cdesc-TestSuite.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RUNIT::TestSuite
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: add_test
- !ruby/object:RI::MethodSummary 
  name: count_test_cases
- !ruby/object:RI::MethodSummary 
  name: run
name: TestSuite
superclass: Test::Unit::TestSuite
PKu}[�-�ww$ri/1.8/system/RUNIT/cdesc-RUNIT.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "Author:"
    body: Nathaniel Talbott.
  - !ruby/struct:SM::Flow::LI 
    label: "Copyright:"
    body: Copyright (c) 2000-2002 Nathaniel Talbott. All rights reserved.
  - !ruby/struct:SM::Flow::LI 
    label: "License:"
    body: Ruby license.
  type: :NOTE
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: AssertionFailedError
  value: Test::Unit::AssertionFailedError
full_name: RUNIT
includes: []

instance_methods: []

name: RUNIT
superclass: 
PKu}[v�#��0ri/1.8/system/RUNIT/Assert/assert_matches-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::Assert#assert_matches
is_singleton: false
name: assert_matches
params: (*args)
visibility: public
PKu}[ɮZ���0ri/1.8/system/RUNIT/Assert/assert_not_nil-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::Assert#assert_not_nil
is_singleton: false
name: assert_not_nil
params: (actual, message="")
visibility: public
PKu}[$w��4ri/1.8/system/RUNIT/Assert/assert_equal_float-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::Assert#assert_equal_float
is_singleton: false
name: assert_equal_float
params: (expected, actual, delta, message="")
visibility: public
PKu}[ciN���2ri/1.8/system/RUNIT/Assert/assert_exception-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::Assert#assert_exception
is_singleton: false
name: assert_exception
params: (exception, message="", &block)
visibility: public
PKu}[�e�*��.ri/1.8/system/RUNIT/Assert/setup_assert-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::Assert#setup_assert
is_singleton: false
name: setup_assert
params: ()
visibility: public
PKu}[�y�1��2ri/1.8/system/RUNIT/Assert/assert_not_match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::Assert#assert_not_match
is_singleton: false
name: assert_not_match
params: (actual_string, expected_re, message="")
visibility: public
PKu}[�T��-ri/1.8/system/RUNIT/Assert/assert_send-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::Assert#assert_send
is_singleton: false
name: assert_send
params: (object, method, *args)
visibility: public
PKu}[Z�M���-ri/1.8/system/RUNIT/Assert/assert_fail-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::Assert#assert_fail
is_singleton: false
name: assert_fail
params: (message="")
visibility: public
PKu}[Ẋ��5ri/1.8/system/RUNIT/Assert/assert_no_exception-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::Assert#assert_no_exception
is_singleton: false
name: assert_no_exception
params: (*args, &block)
visibility: public
PKu}[�MZ��.ri/1.8/system/RUNIT/Assert/assert_match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: To deal with the fact that RubyUnit does not check that the regular expression is, indeed, a regular expression, if it is not, we do our own assertion using the same semantics as RubyUnit
full_name: RUNIT::Assert#assert_match
is_singleton: false
name: assert_match
params: (actual_string, expected_re, message="")
visibility: public
PKu}[]I1
��3ri/1.8/system/RUNIT/Assert/assert_respond_to-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::Assert#assert_respond_to
is_singleton: false
name: assert_respond_to
params: (method, object, message="")
visibility: public
PKu}[�����6ri/1.8/system/RUNIT/Assert/called_internally%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RUNIT::Assert#called_internally?
is_singleton: false
name: called_internally?
params: ()
visibility: public
PKu}[������,ri/1.8/system/RUNIT/Assert/cdesc-Assert.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: RUNIT::Assert
includes: 
- !ruby/object:RI::IncludedModule 
  name: Test::Unit::Assertions
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: assert_equal_float
- !ruby/object:RI::MethodSummary 
  name: assert_exception
- !ruby/object:RI::MethodSummary 
  name: assert_fail
- !ruby/object:RI::MethodSummary 
  name: assert_match
- !ruby/object:RI::MethodSummary 
  name: assert_matches
- !ruby/object:RI::MethodSummary 
  name: assert_no_exception
- !ruby/object:RI::MethodSummary 
  name: assert_not_match
- !ruby/object:RI::MethodSummary 
  name: assert_not_nil
- !ruby/object:RI::MethodSummary 
  name: assert_respond_to
- !ruby/object:RI::MethodSummary 
  name: assert_send
- !ruby/object:RI::MethodSummary 
  name: called_internally?
- !ruby/object:RI::MethodSummary 
  name: setup_assert
name: Assert
superclass: 
PKu}[�ߓII/ri/1.8/system/Observable/delete_observer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Delete <tt>observer</tt> as an observer on this object. It will no longer receive notifications.
full_name: Observable#delete_observer
is_singleton: false
name: delete_observer
params: (observer)
visibility: public
PKu}[�˽���0ri/1.8/system/Observable/notify_observers-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: If this object's changed state is <tt>true</tt>, invoke the update method in each currently associated observer in turn, passing it the given arguments. The changed state is then set to <tt>false</tt>.
full_name: Observable#notify_observers
is_singleton: false
name: notify_observers
params: (*arg)
visibility: public
PKu}[lWd�0ri/1.8/system/Observable/delete_observers-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Delete all observers associated with this object.
full_name: Observable#delete_observers
is_singleton: false
name: delete_observers
params: ()
visibility: public
PKu}[�R?II,ri/1.8/system/Observable/add_observer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Add <tt>observer</tt> as an observer on this object. <tt>observer</tt> will now receive notifications.
full_name: Observable#add_observer
is_singleton: false
name: add_observer
params: (observer)
visibility: public
PKu}[�t��*ri/1.8/system/Observable/changed%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Query the changed state of this object.
full_name: Observable#changed?
is_singleton: false
name: changed?
params: ()
visibility: public
PKu}[���PP'ri/1.8/system/Observable/changed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set the changed state of this object. Notifications will be sent only if the changed <tt>state</tt> is <tt>true</tt>.
full_name: Observable#changed
is_singleton: false
name: changed
params: (state=true)
visibility: public
PKu}[~�����.ri/1.8/system/Observable/cdesc-Observable.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Implements the Observable design pattern as a mixin so that other objects can be notified of changes in state. See observer.rb for details and an example.
constants: []

full_name: Observable
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_observer
- !ruby/object:RI::MethodSummary 
  name: changed
- !ruby/object:RI::MethodSummary 
  name: changed?
- !ruby/object:RI::MethodSummary 
  name: count_observers
- !ruby/object:RI::MethodSummary 
  name: delete_observer
- !ruby/object:RI::MethodSummary 
  name: delete_observers
- !ruby/object:RI::MethodSummary 
  name: notify_observers
name: Observable
superclass: 
PKu}[�uX�/ri/1.8/system/Observable/count_observers-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the number of observers associated with this object.
full_name: Observable#count_observers
is_singleton: false
name: count_observers
params: ()
visibility: public
PKu}[m����!ri/1.8/system/Binding/eval-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Evaluates the Ruby expression(s) in <em>string</em>, in the <em>binding</em>'s context. If the optional <em>filename</em> and <em>lineno</em> parameters are present, they will be used when reporting syntax errors.
- !ruby/struct:SM::Flow::VERB 
  body: "   def getBinding(param)\n     return binding\n   end\n   b = getBinding(&quot;hello&quot;)\n   b.eval(&quot;param&quot;)   #=&gt; &quot;hello&quot;\n"
full_name: Binding#eval
is_singleton: false
name: eval
params: |
  binding.eval(string [, filename [,lineno]])  => obj

visibility: public
PKu}[�<T��"ri/1.8/system/Binding/clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "MISSING: documentation"
full_name: Binding#clone
is_singleton: false
name: clone
params: ()
visibility: public
PKu}[�hyy(ri/1.8/system/Binding/cdesc-Binding.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Objects of class <tt>Binding</tt> encapsulate the execution context at some particular place in the code and retain this context for future use. The variables, methods, value of <tt>self</tt>, and possibly an iterator block that can be accessed in this context are all retained. Binding objects can be created using <tt>Kernel#binding</tt>, and are made available to the callback of <tt>Kernel#set_trace_func</tt>.
- !ruby/struct:SM::Flow::P 
  body: These binding objects can be passed as the second argument of the <tt>Kernel#eval</tt> method, establishing an environment for the evaluation.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Demo\n     def initialize(n)\n       @secret = n\n     end\n     def getBinding\n       return binding()\n     end\n   end\n\n   k1 = Demo.new(99)\n   b1 = k1.getBinding\n   k2 = Demo.new(-3)\n   b2 = k2.getBinding\n\n   eval(&quot;@secret&quot;, b1)   #=&gt; 99\n   eval(&quot;@secret&quot;, b2)   #=&gt; -3\n   eval(&quot;@secret&quot;)       #=&gt; nil\n"
- !ruby/struct:SM::Flow::P 
  body: Binding objects have no class-specific methods.
constants: []

full_name: Binding
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: clone
- !ruby/object:RI::MethodSummary 
  name: eval
name: Binding
superclass: Object
PKu}[��5t��)ri/1.8/system/CompletingHash/match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Completion for hash key.
full_name: CompletingHash#match
is_singleton: false
name: match
params: (key)
visibility: public
PKu}[�R���6ri/1.8/system/CompletingHash/cdesc-CompletingHash.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Hash with completion search feature. See OptionParser::Completion.
constants: []

full_name: CompletingHash
includes: 
- !ruby/object:RI::IncludedModule 
  name: Completion
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: match
name: CompletingHash
superclass: Hash
PKu}[mZC\"ri/1.8/system/FileTest/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the size of <tt>file_name</tt>.
full_name: FileTest#size
is_singleton: false
name: size
params: |
  File.size(file_name)   => integer

visibility: public
PKu}[#Yw11'ri/1.8/system/FileTest/socket%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is a socket.
full_name: FileTest#socket?
is_singleton: false
name: socket?
params: |
  File.socket?(file_name)   =>  true or false

visibility: public
PKu}[___)ri/1.8/system/FileTest/readable%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is readable by the effective user id of this process.
full_name: FileTest#readable?
is_singleton: false
name: readable?
params: |
  File.readable?(file_name)   => true or false

visibility: public
PKu}[�xee&ri/1.8/system/FileTest/exist%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return <tt>true</tt> if the named file exists.
full_name: FileTest#exist?
is_singleton: false
name: exist?
params: |
  File.exist?(file_name)    =>  true or false
  File.exists?(file_name)   =>  true or false    (obsolete)

visibility: public
PKu}[�L��>>(ri/1.8/system/FileTest/chardev%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is a character device.
full_name: FileTest#chardev?
is_singleton: false
name: chardev?
params: |
  File.chardev?(file_name)   =>  true or false

visibility: public
PKu}[]K�__)ri/1.8/system/FileTest/writable%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is writable by the effective user id of this process.
full_name: FileTest#writable?
is_singleton: false
name: writable?
params: |
  File.writable?(file_name)   => true or false

visibility: public
PKu}[�k2qq0ri/1.8/system/FileTest/executable_real%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is executable by the real user id of this process.
full_name: FileTest#executable_real?
is_singleton: false
name: executable_real?
params: |
  File.executable_real?(file_name)   => true or false

visibility: public
PKu}["���*ri/1.8/system/FileTest/cdesc-FileTest.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: "<tt>FileTest</tt> implements file test operations similar to those used in <tt>File::Stat</tt>. It exists as a standalone module, and its methods are also insinuated into the <tt>File</tt> class. (Note that this is not done by inclusion: the interpreter cheats)."
constants: []

full_name: FileTest
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: blockdev?
- !ruby/object:RI::MethodSummary 
  name: chardev?
- !ruby/object:RI::MethodSummary 
  name: directory?
- !ruby/object:RI::MethodSummary 
  name: executable?
- !ruby/object:RI::MethodSummary 
  name: executable_real?
- !ruby/object:RI::MethodSummary 
  name: exist?
- !ruby/object:RI::MethodSummary 
  name: exists?
- !ruby/object:RI::MethodSummary 
  name: file?
- !ruby/object:RI::MethodSummary 
  name: grpowned?
- !ruby/object:RI::MethodSummary 
  name: identical?
- !ruby/object:RI::MethodSummary 
  name: owned?
- !ruby/object:RI::MethodSummary 
  name: pipe?
- !ruby/object:RI::MethodSummary 
  name: readable?
- !ruby/object:RI::MethodSummary 
  name: readable_real?
- !ruby/object:RI::MethodSummary 
  name: setgid?
- !ruby/object:RI::MethodSummary 
  name: setuid?
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: size?
- !ruby/object:RI::MethodSummary 
  name: socket?
- !ruby/object:RI::MethodSummary 
  name: sticky?
- !ruby/object:RI::MethodSummary 
  name: symlink?
- !ruby/object:RI::MethodSummary 
  name: writable?
- !ruby/object:RI::MethodSummary 
  name: writable_real?
- !ruby/object:RI::MethodSummary 
  name: zero?
name: FileTest
superclass: 
PKu}[�</'��)ri/1.8/system/FileTest/grpowned%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file exists and the effective group id of the calling process is the owner of the file. Returns <tt>false</tt> on Windows.
full_name: FileTest#grpowned?
is_singleton: false
name: grpowned?
params: |
  File.grpowned?(file_name)   => true or false

visibility: public
PKu}[[��99%ri/1.8/system/FileTest/zero%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file exists and has a zero size.
full_name: FileTest#zero?
is_singleton: false
name: zero?
params: |
  File.zero?(file_name)   => true or false

visibility: public
PKu}[��(�<<'ri/1.8/system/FileTest/sticky%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file has the sticky bit set.
full_name: FileTest#sticky?
is_singleton: false
name: sticky?
params: |
  File.sticky?(file_name)   =>  true or false

visibility: public
PKu}[�3�Sii.ri/1.8/system/FileTest/readable_real%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is readable by the real user id of this process.
full_name: FileTest#readable_real?
is_singleton: false
name: readable_real?
params: |
  File.readable_real?(file_name)   => true or false

visibility: public
PKu}[����*ri/1.8/system/FileTest/directory%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is a directory, <tt>false</tt> otherwise.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.directory?(&quot;.&quot;)\n"
full_name: FileTest#directory?
is_singleton: false
name: directory?
params: |
  File.directory?(file_name)   =>  true or false

visibility: public
PKu}[M�&�;;(ri/1.8/system/FileTest/symlink%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is a symbolic link.
full_name: FileTest#symlink?
is_singleton: false
name: symlink?
params: |
  File.symlink?(file_name)   =>  true or false

visibility: public
PKu}[�]U�<<'ri/1.8/system/FileTest/setgid%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file has the setgid bit set.
full_name: FileTest#setgid?
is_singleton: false
name: setgid?
params: |
  File.setgid?(file_name)   =>  true or false

visibility: public
PKu}[,�-�<<'ri/1.8/system/FileTest/setuid%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file has the setuid bit set.
full_name: FileTest#setuid?
is_singleton: false
name: setuid?
params: |
  File.setuid?(file_name)   =>  true or false

visibility: public
PKu}[�6�h==)ri/1.8/system/FileTest/blockdev%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is a block device.
full_name: FileTest#blockdev?
is_singleton: false
name: blockdev?
params: |
  File.blockdev?(file_name)   =>  true or false

visibility: public
PKu}[����gg'ri/1.8/system/FileTest/exists%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return <tt>true</tt> if the named file exists.
full_name: FileTest#exists?
is_singleton: false
name: exists?
params: |
  File.exist?(file_name)    =>  true or false
  File.exists?(file_name)   =>  true or false    (obsolete)

visibility: public
PKu}[S�!~~*ri/1.8/system/FileTest/identical%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named files are identical.
- !ruby/struct:SM::Flow::VERB 
  body: "    open(&quot;a&quot;, &quot;w&quot;) {}\n    p File.identical?(&quot;a&quot;, &quot;a&quot;)      #=&gt; true\n    p File.identical?(&quot;a&quot;, &quot;./a&quot;)    #=&gt; true\n    File.link(&quot;a&quot;, &quot;b&quot;)\n    p File.identical?(&quot;a&quot;, &quot;b&quot;)      #=&gt; true\n    File.symlink(&quot;a&quot;, &quot;c&quot;)\n    p File.identical?(&quot;a&quot;, &quot;c&quot;)      #=&gt; true\n    open(&quot;d&quot;, &quot;w&quot;) {}\n    p File.identical?(&quot;a&quot;, &quot;d&quot;)      #=&gt; false\n"
full_name: FileTest#identical?
is_singleton: false
name: identical?
params: |
  File.identical?(file_1, file_2)   =>  true or false

visibility: public
PKu}[��T�))%ri/1.8/system/FileTest/pipe%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is a pipe.
full_name: FileTest#pipe?
is_singleton: false
name: pipe?
params: |
  File.pipe?(file_name)   =>  true or false

visibility: public
PKu}[�;�Yii.ri/1.8/system/FileTest/writable_real%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is writable by the real user id of this process.
full_name: FileTest#writable_real?
is_singleton: false
name: writable_real?
params: |
  File.writable_real?(file_name)   => true or false

visibility: public
PKu}[�@�1;;%ri/1.8/system/FileTest/file%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file exists and is a regular file.
full_name: FileTest#file?
is_singleton: false
name: file?
params: |
  File.file?(file_name)   => true or false

visibility: public
PKu}[5>�vgg+ri/1.8/system/FileTest/executable%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file is executable by the effective user id of this process.
full_name: FileTest#executable?
is_singleton: false
name: executable?
params: |
  File.executable?(file_name)   => true or false

visibility: public
PKu}[��3�rr&ri/1.8/system/FileTest/owned%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named file exists and the effective used id of the calling process is the owner of the file.
full_name: FileTest#owned?
is_singleton: false
name: owned?
params: |
  File.owned?(file_name)   => true or false

visibility: public
PKu}[��:Xaa%ri/1.8/system/FileTest/size%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>nil</tt> if <tt>file_name</tt> doesn't exist or has zero size, the size of the file otherwise.
full_name: FileTest#size?
is_singleton: false
name: size?
params: |
  File.size?(file_name)   => Integer or nil

visibility: public
PKu}[p�fII"ri/1.8/system/Regexp/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equality---Two regexps are equal if their patterns are identical, they have the same character set code, and their <tt>casefold?</tt> values are the same.
- !ruby/struct:SM::Flow::VERB 
  body: "   /abc/  == /abc/x   #=&gt; false\n   /abc/  == /abc/i   #=&gt; false\n   /abc/u == /abc/n   #=&gt; false\n"
full_name: Regexp#eql?
is_singleton: false
name: eql?
params: |
  rxp == other_rxp      => true or false
  rxp.eql?(other_rxp)   => true or false

visibility: public
PKu}[XRQ"ri/1.8/system/Regexp/%3d%7e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a <tt>MatchData</tt> object describing the match, or <tt>nil</tt> if there was no match. This is equivalent to retrieving the value of the special variable <tt>$~</tt> following a normal match.
- !ruby/struct:SM::Flow::VERB 
  body: "   /(.)(.)(.)/.match(&quot;abc&quot;)[2]   #=&gt; &quot;b&quot;\n"
full_name: Regexp#=~
is_singleton: false
name: =~
params: |
  rxp.match(str)   => matchdata or nil

visibility: public
PKu}[�Ȁdd"ri/1.8/system/Regexp/source-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the original string of the pattern.
- !ruby/struct:SM::Flow::VERB 
  body: "   /ab+c/ix.source   #=&gt; &quot;ab+c&quot;\n"
full_name: Regexp#source
is_singleton: false
name: source
params: |
  rxp.source   => str

visibility: public
PKu}[
[�ri/1.8/system/Regexp/%7c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Regexp#|
is_singleton: false
name: "|"
params: (other)
visibility: public
PKu}[�P���ri/1.8/system/Regexp/%26-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Regexp#&
is_singleton: false
name: "&"
params: (other)
visibility: public
PKu}[
w����#ri/1.8/system/Regexp/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Regexp#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PKu}[D�v|&ri/1.8/system/Regexp/last_match-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The first form returns the <tt>MatchData</tt> object generated by the last successful pattern match. Equivalent to reading the global variable <tt>$~</tt>. The second form returns the nth field in this <tt>MatchData</tt> object.
- !ruby/struct:SM::Flow::VERB 
  body: "   /c(.)t/ =~ 'cat'       #=&gt; 0\n   Regexp.last_match      #=&gt; #&lt;MatchData:0x401b3d30&gt;\n   Regexp.last_match(0)   #=&gt; &quot;cat&quot;\n   Regexp.last_match(1)   #=&gt; &quot;a&quot;\n   Regexp.last_match(2)   #=&gt; nil\n"
full_name: Regexp::last_match
is_singleton: true
name: last_match
params: |
  Regexp.last_match           => matchdata
  Regexp.last_match(fixnum)   => str

visibility: public
PKu}[�!ri/1.8/system/Regexp/kcode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the character set code for the regexp.
full_name: Regexp#kcode
is_singleton: false
name: kcode
params: |
  rxp.kcode   => str

visibility: public
PKu}[97�&& ri/1.8/system/Regexp/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Produce a hash based on the text and options of this regular expression.
full_name: Regexp#hash
is_singleton: false
name: hash
params: |
  rxp.hash   => fixnum

visibility: public
PKv}[BтOO!ri/1.8/system/Regexp/quote-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Escapes any characters that would have special meaning in a regular expression. Returns a new escaped string, or self if no characters are escaped. For any string, <tt>Regexp.escape(<em>str</em>)=~<em>str</em></tt> will be true.
- !ruby/struct:SM::Flow::VERB 
  body: "   Regexp.escape('\\*?{}.')   #=&gt; \\\\*\\?\\{\\}\\.\n"
full_name: Regexp::quote
is_singleton: true
name: quote
params: |
  Regexp.escape(str)   => a_str
  Regexp.quote(str)    => a_str

visibility: public
PKv}[H�I���$ri/1.8/system/Regexp/yaml_new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Regexp::yaml_new
is_singleton: true
name: yaml_new
params: ( klass, tag, val )
visibility: public
PKv}[�(�$$!ri/1.8/system/Regexp/match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a <tt>MatchData</tt> object describing the match, or <tt>nil</tt> if there was no match. This is equivalent to retrieving the value of the special variable <tt>$~</tt> following a normal match.
- !ruby/struct:SM::Flow::VERB 
  body: "   /(.)(.)(.)/.match(&quot;abc&quot;)[2]   #=&gt; &quot;b&quot;\n"
full_name: Regexp#match
is_singleton: false
name: match
params: |
  rxp.match(str)   => matchdata or nil

visibility: public
PKv}[R ���ri/1.8/system/Regexp/%7e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Match---Matches <em>rxp</em> against the contents of <tt>$_</tt>. Equivalent to <tt><em>rxp</em> =~ $_</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   $_ = &quot;input data&quot;\n   ~ /at/   #=&gt; 7\n"
full_name: Regexp#~
is_singleton: false
name: "~"
params: |
  ~ rxp   => integer or nil

visibility: public
PKv}[r~��#ri/1.8/system/Regexp/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Produce a nicely formatted string-version of <em>rxp</em>. Perhaps surprisingly, <tt>#inspect</tt> actually produces the more natural version of the string than <tt>#to_s</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "    /ab+c/ix.to_s         #=&gt; /ab+c/ix\n"
full_name: Regexp#inspect
is_singleton: false
name: inspect
params: |
  rxp.inspect   => string

visibility: public
PKv}[�߬jjri/1.8/system/Regexp/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Constructs a new regular expression from <em>pattern</em>, which can be either a <tt>String</tt> or a <tt>Regexp</tt> (in which case that regexp's options are propagated, and new options may not be specified (a change as of Ruby 1.8). If <em>options</em> is a <tt>Fixnum</tt>, it should be one or more of the constants <tt>Regexp::EXTENDED</tt>, <tt>Regexp::IGNORECASE</tt>, and <tt>Regexp::MULTILINE</tt>, <em>or</em>-ed together. Otherwise, if <em>options</em> is not <tt>nil</tt>, the regexp will be case insensitive. The <em>lang</em> parameter enables multibyte support for the regexp: `n', `N' = none, `e', `E' = EUC, `s', `S' = SJIS, `u', `U' = UTF-8."
- !ruby/struct:SM::Flow::VERB 
  body: "   r1 = Regexp.new('^a-z+:\\s+\\w+')           #=&gt; /^a-z+:\\s+\\w+/\n   r2 = Regexp.new('cat', true)               #=&gt; /cat/i\n   r3 = Regexp.new('dog', Regexp::EXTENDED)   #=&gt; /dog/x\n   r4 = Regexp.new(r2)                        #=&gt; /cat/i\n"
full_name: Regexp::new
is_singleton: true
name: new
params: |
  Regexp.new(string [, options [, lang]])       => regexp
  Regexp.new(regexp)                            => regexp
  Regexp.compile(string [, options [, lang]])   => regexp
  Regexp.compile(regexp)                        => regexp

visibility: public
PKv}[9!���%ri/1.8/system/Regexp/%3d%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Case Equality---Synonym for <tt>Regexp#=~</tt> used in case statements.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = &quot;HELLO&quot;\n   case a\n   when /^[a-z]*$/; print &quot;Lower case\\n&quot;\n   when /^[A-Z]*$/; print &quot;Upper case\\n&quot;\n   else;            print &quot;Mixed case\\n&quot;\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Upper case\n"
full_name: Regexp#===
is_singleton: false
name: ===
params: |
  rxp === str   => true or false

visibility: public
PKv}[�g	C�� ri/1.8/system/Regexp/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a string containing the regular expression and its options (using the <tt>(?xxx:yyy)</tt> notation. This string can be fed back in to <tt>Regexp::new</tt> to a regular expression with the same semantics as the original. (However, <tt>Regexp#==</tt> may not return true when comparing the two, as the source of the regular expression itself may differ, as the example shows). <tt>Regexp#inspect</tt> produces a generally more readable version of <em>rxp</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   r1 = /ab+c/ix         #=&gt; /ab+c/ix\n   s1 = r1.to_s          #=&gt; &quot;(?ix-m:ab+c)&quot;\n   r2 = Regexp.new(s1)   #=&gt; /(?ix-m:ab+c)/\n   r1 == r2              #=&gt; false\n   r1.source             #=&gt; &quot;ab+c&quot;\n   r2.source             #=&gt; &quot;(?ix-m:ab+c)&quot;\n"
full_name: Regexp#to_s
is_singleton: false
name: to_s
params: |
  rxp.to_s   => str

visibility: public
PKv}[	h_0EE"ri/1.8/system/Regexp/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equality---Two regexps are equal if their patterns are identical, they have the same character set code, and their <tt>casefold?</tt> values are the same.
- !ruby/struct:SM::Flow::VERB 
  body: "   /abc/  == /abc/x   #=&gt; false\n   /abc/  == /abc/i   #=&gt; false\n   /abc/u == /abc/n   #=&gt; false\n"
full_name: Regexp#==
is_singleton: false
name: ==
params: |
  rxp == other_rxp      => true or false
  rxp.eql?(other_rxp)   => true or false

visibility: public
PKv}[U�/��#ri/1.8/system/Regexp/options-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns the set of bits corresponding to the options used when creating this Regexp (see <tt>Regexp::new</tt> for details. Note that additional bits may be set in the returned options: these are used internally by the regular expression code. These extra bits are ignored if the options are passed to <tt>Regexp::new</tt>."
- !ruby/struct:SM::Flow::VERB 
  body: "   Regexp::IGNORECASE                  #=&gt; 1\n   Regexp::EXTENDED                    #=&gt; 2\n   Regexp::MULTILINE                   #=&gt; 4\n\n   /cat/.options                       #=&gt; 128\n   /cat/ix.options                     #=&gt; 131\n   Regexp.new('cat', true).options     #=&gt; 129\n   Regexp.new('cat', 0, 's').options   #=&gt; 384\n\n   r = /cat/ix\n   Regexp.new(r.source, r.options)     #=&gt; /cat/ix\n"
full_name: Regexp#options
is_singleton: false
name: options
params: |
  rxp.options   => fixnum

visibility: public
PKv}[(�E+QQ"ri/1.8/system/Regexp/escape-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Escapes any characters that would have special meaning in a regular expression. Returns a new escaped string, or self if no characters are escaped. For any string, <tt>Regexp.escape(<em>str</em>)=~<em>str</em></tt> will be true.
- !ruby/struct:SM::Flow::VERB 
  body: "   Regexp.escape('\\*?{}.')   #=&gt; \\\\*\\?\\{\\}\\.\n"
full_name: Regexp::escape
is_singleton: true
name: escape
params: |
  Regexp.escape(str)   => a_str
  Regexp.quote(str)    => a_str

visibility: public
PKv}[׬�##'ri/1.8/system/Regexp/casefold%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the value of the case-insensitive flag.
full_name: Regexp#casefold?
is_singleton: false
name: casefold?
params: |
  rxp.casefold?   => true or false

visibility: public
PKv}[ep
<**!ri/1.8/system/Regexp/union-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a <tt>Regexp</tt> object that is the union of the given <em>pattern</em>s, i.e., will match any of its parts. The <em>pattern</em>s can be Regexp objects, in which case their options will be preserved, or Strings. If no patterns are given, returns <tt>/(?!)/</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   Regexp.union                         #=&gt; /(?!)/\n   Regexp.union(&quot;penzance&quot;)             #=&gt; /penzance/\n   Regexp.union(&quot;a+b*c&quot;)                #=&gt; /a+b*c/\n   Regexp.union(&quot;skiing&quot;, &quot;sledding&quot;)   #=&gt; /skiing|sledding/\n   Regexp.union([&quot;skiing&quot;, &quot;sledding&quot;]) #=&gt; /skiing|sledding/\n   Regexp.union(/dogs/, /cats/i)        #=&gt; /(?-mix:dogs)|(?i-mx:cats)/\n"
full_name: Regexp::union
is_singleton: true
name: union
params: |
  Regexp.union(pat1, pat2, ...)            => new_regexp
  Regexp.union(pats_ary)                   => new_regexp

visibility: public
PKv}[�����#ri/1.8/system/Regexp/compile-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Synonym for <tt>Regexp.new</tt>
full_name: Regexp::compile
is_singleton: true
name: compile
params: (...)
visibility: public
PKv}[	*WW&ri/1.8/system/Regexp/cdesc-Regexp.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: compile
- !ruby/object:RI::MethodSummary 
  name: escape
- !ruby/object:RI::MethodSummary 
  name: last_match
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: quote
- !ruby/object:RI::MethodSummary 
  name: union
- !ruby/object:RI::MethodSummary 
  name: yaml_new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Document-class: Regexp"
- !ruby/struct:SM::Flow::P 
  body: A <tt>Regexp</tt> holds a regular expression, used to match a pattern against strings. Regexps are created using the <tt>/.../</tt> and <tt>%r{...}</tt> literals, and by the <tt>Regexp::new</tt> constructor.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: IGNORECASE
  value: INT2FIX(RE_OPTION_IGNORECASE)
- !ruby/object:RI::Constant 
  comment: 
  name: EXTENDED
  value: INT2FIX(RE_OPTION_EXTENDED)
- !ruby/object:RI::Constant 
  comment: 
  name: MULTILINE
  value: INT2FIX(RE_OPTION_MULTILINE)
full_name: Regexp
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "&"
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: ===
- !ruby/object:RI::MethodSummary 
  name: =~
- !ruby/object:RI::MethodSummary 
  name: casefold?
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: kcode
- !ruby/object:RI::MethodSummary 
  name: match
- !ruby/object:RI::MethodSummary 
  name: options
- !ruby/object:RI::MethodSummary 
  name: source
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: to_yaml
- !ruby/object:RI::MethodSummary 
  name: "|"
- !ruby/object:RI::MethodSummary 
  name: "~"
name: Regexp
superclass: Object
PKv}[Ķܸ�*ri/1.8/system/Mutex_m/extend_object-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Mutex_m::extend_object
is_singleton: true
name: extend_object
params: (obj)
visibility: public
PKv}[�;��&ri/1.8/system/Mutex_m/mu_unlock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Mutex_m#mu_unlock
is_singleton: false
name: mu_unlock
params: ()
visibility: public
PKv}[��w,��(ri/1.8/system/Mutex_m/mu_try_lock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Mutex_m#mu_try_lock
is_singleton: false
name: mu_try_lock
params: ()
visibility: public
PKv}[9D���)ri/1.8/system/Mutex_m/mu_locked%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Mutex_m#mu_locked?
is_singleton: false
name: mu_locked?
params: ()
visibility: public
PKv}[�r8���*ri/1.8/system/Mutex_m/mu_initialize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Mutex_m#mu_initialize
is_singleton: false
name: mu_initialize
params: ()
visibility: private
PKv}[�Ѭ~��+ri/1.8/system/Mutex_m/mu_synchronize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: ""
comment: 
- !ruby/struct:SM::Flow::P 
  body: locking
full_name: Mutex_m#mu_synchronize
is_singleton: false
name: mu_synchronize
params: () {|| ...}
visibility: public
PKv}[�	U���,ri/1.8/system/Mutex_m/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Mutex_m::append_features
is_singleton: true
name: append_features
params: (cl)
visibility: public
PKv}[3��L�� ri/1.8/system/Mutex_m/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Mutex_m::new
is_singleton: true
name: new
params: (*args)
visibility: public
PKv}[{H+"��(ri/1.8/system/Mutex_m/mu_extended-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Mutex_m#mu_extended
is_singleton: false
name: mu_extended
params: ()
visibility: public
PKv}[L?n��$ri/1.8/system/Mutex_m/mu_lock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Mutex_m#mu_lock
is_singleton: false
name: mu_lock
params: ()
visibility: public
PKv}[	��5��+ri/1.8/system/Mutex_m/define_aliases-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Mutex_m::define_aliases
is_singleton: true
name: define_aliases
params: (cl)
visibility: public
PKv}[C5 ���(ri/1.8/system/Mutex_m/cdesc-Mutex_m.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
- !ruby/object:RI::MethodSummary 
  name: define_aliases
- !ruby/object:RI::MethodSummary 
  name: extend_object
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Usage
- !ruby/struct:SM::Flow::P 
  body: "Extend an object and use it like a Mutex object:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require &quot;mutex_m.rb&quot;\n  obj = Object.new\n  obj.extend Mutex_m\n  # ...\n"
- !ruby/struct:SM::Flow::P 
  body: "Or, include Mutex_m in a class to have its instances behave like a Mutex object:"
- !ruby/struct:SM::Flow::VERB 
  body: "  class Foo\n    include Mutex_m\n    # ...\n  end\n\n  obj = Foo.new\n"
constants: []

full_name: Mutex_m
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: mu_extended
- !ruby/object:RI::MethodSummary 
  name: mu_initialize
- !ruby/object:RI::MethodSummary 
  name: mu_lock
- !ruby/object:RI::MethodSummary 
  name: mu_locked?
- !ruby/object:RI::MethodSummary 
  name: mu_synchronize
- !ruby/object:RI::MethodSummary 
  name: mu_try_lock
- !ruby/object:RI::MethodSummary 
  name: mu_unlock
name: Mutex_m
superclass: 
PKv}[�����0ri/1.8/system/RegexpError/cdesc-RegexpError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: "Document-class: Regexp"
- !ruby/struct:SM::Flow::P 
  body: A <tt>Regexp</tt> holds a regular expression, used to match a pattern against strings. Regexps are created using the <tt>/.../</tt> and <tt>%r{...}</tt> literals, and by the <tt>Regexp::new</tt> constructor.
constants: []

full_name: RegexpError
includes: []

instance_methods: []

name: RegexpError
superclass: StandardError
PKv}[�ñMM!ri/1.8/system/Range/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns <tt>true</tt> only if <em>obj</em> is a Range, has equivalent beginning and end items (by comparing them with #eql?), and has the same #exclude_end? setting as <em>rng</em>."
- !ruby/struct:SM::Flow::VERB 
  body: "  (0..2) == (0..2)            #=&gt; true\n  (0..2) == Range.new(0,2)    #=&gt; true\n  (0..2) == (0...2)           #=&gt; false\n"
full_name: Range#eql?
is_singleton: false
name: eql?
params: |
  rng.eql?(obj)    => true or false

visibility: public
PKv}[��*��ri/1.8/system/Range/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over the elements <em>rng</em>, passing each in turn to the block. You can only iterate if the start object of the range supports the <tt>succ</tt> method (which means that you can't iterate over ranges of <tt>Float</tt> objects).
- !ruby/struct:SM::Flow::VERB 
  body: "   (10..15).each do |n|\n      print n, ' '\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   10 11 12 13 14 15\n"
full_name: Range#each
is_singleton: false
name: each
params: |
  rng.each {| i | block } => rng

visibility: public
PKv}[��'��ri/1.8/system/Range/last-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the object that defines the end of <em>rng</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   (1..10).end    #=&gt; 10\n   (1...10).end   #=&gt; 10\n"
full_name: Range#last
is_singleton: false
name: last
params: |
  rng.end    => obj
  rng.last   => obj

visibility: public
PKv}[�Z+��"ri/1.8/system/Range/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Range#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PKv}[�gX��ri/1.8/system/Range/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate a hash value such that two ranges with the same start and end points, and the same value for the &quot;exclude end&quot; flag, generate the same hash value.
full_name: Range#hash
is_singleton: false
name: hash
params: |
  rng.hash    => fixnum

visibility: public
PKv}[�-�T::)ri/1.8/system/Range/exclude_end%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>rng</em> excludes its end value.
full_name: Range#exclude_end?
is_singleton: false
name: exclude_end?
params: |
  rng.exclude_end?    => true or false

visibility: public
PKv}[���33$ri/1.8/system/Range/member%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>obj</em> is an element of <em>rng</em>, <tt>false</tt> otherwise. Conveniently, <tt>===</tt> is the comparison operator used by <tt>case</tt> statements.
- !ruby/struct:SM::Flow::VERB 
  body: "   case 79\n   when 1..50   then   print &quot;low\\n&quot;\n   when 51..75  then   print &quot;medium\\n&quot;\n   when 76..100 then   print &quot;high\\n&quot;\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   high\n"
full_name: Range#member?
is_singleton: false
name: member?
params: |
  rng === obj       =>  true or false
  rng.member?(val)  =>  true or false
  rng.include?(val) =>  true or false

visibility: public
PKv}[�}ú�#ri/1.8/system/Range/yaml_new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Range::yaml_new
is_singleton: true
name: yaml_new
params: ( klass, tag, val )
visibility: public
PKv}[gQ�QQ"ri/1.8/system/Range/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert this range object to a printable form (using <tt>inspect</tt> to convert the start and end objects).
full_name: Range#inspect
is_singleton: false
name: inspect
params: |
  rng.inspect  => string

visibility: public
PKv}[�.��^^$ri/1.8/system/Range/cdesc-Range.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: yaml_new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A <tt>Range</tt> represents an interval---a set of values with a start and an end. Ranges may be constructed using the <em>s</em><tt>..</tt><em>e</em> and <em>s</em><tt>...</tt><em>e</em> literals, or with <tt>Range::new</tt>. Ranges constructed using <tt>..</tt> run from the start to the end inclusively. Those created using <tt>...</tt> exclude the end value. When used as an iterator, ranges return each value in the sequence.
- !ruby/struct:SM::Flow::VERB 
  body: "   (-1..-5).to_a      #=&gt; []\n   (-5..-1).to_a      #=&gt; [-5, -4, -3, -2, -1]\n   ('a'..'e').to_a    #=&gt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot;]\n   ('a'...'e').to_a   #=&gt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;]\n"
- !ruby/struct:SM::Flow::P 
  body: Ranges can be constructed using objects of any type, as long as the objects can be compared using their <tt>&lt;=&gt;</tt> operator and they support the <tt>succ</tt> method to return the next object in sequence.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Xs                # represent a string of 'x's\n     include Comparable\n     attr :length\n     def initialize(n)\n       @length = n\n     end\n     def succ\n       Xs.new(@length + 1)\n     end\n     def &lt;=&gt;(other)\n       @length &lt;=&gt; other.length\n     end\n     def to_s\n       sprintf &quot;%2d #{inspect}&quot;, @length\n     end\n     def inspect\n       'x' * @length\n     end\n   end\n\n   r = Xs.new(3)..Xs.new(6)   #=&gt; xxx..xxxxxx\n   r.to_a                     #=&gt; [xxx, xxxx, xxxxx, xxxxxx]\n   r.member?(Xs.new(5))       #=&gt; true\n"
- !ruby/struct:SM::Flow::P 
  body: In the previous code example, class <tt>Xs</tt> includes the <tt>Comparable</tt> module. This is because <tt>Enumerable#member?</tt> checks for equality using <tt>==</tt>. Including <tt>Comparable</tt> ensures that the <tt>==</tt> method is defined in terms of the <tt>&lt;=&gt;</tt> method implemented in <tt>Xs</tt>.
constants: []

full_name: Range
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: ===
- !ruby/object:RI::MethodSummary 
  name: begin
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: end
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: exclude_end?
- !ruby/object:RI::MethodSummary 
  name: first
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: include?
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: last
- !ruby/object:RI::MethodSummary 
  name: member?
- !ruby/object:RI::MethodSummary 
  name: pretty_print
- !ruby/object:RI::MethodSummary 
  name: step
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: to_yaml
name: Range
superclass: Object
PKv}[�ʐ�55%ri/1.8/system/Range/include%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>obj</em> is an element of <em>rng</em>, <tt>false</tt> otherwise. Conveniently, <tt>===</tt> is the comparison operator used by <tt>case</tt> statements.
- !ruby/struct:SM::Flow::VERB 
  body: "   case 79\n   when 1..50   then   print &quot;low\\n&quot;\n   when 51..75  then   print &quot;medium\\n&quot;\n   when 76..100 then   print &quot;high\\n&quot;\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   high\n"
full_name: Range#include?
is_singleton: false
name: include?
params: |
  rng === obj       =>  true or false
  rng.member?(val)  =>  true or false
  rng.include?(val) =>  true or false

visibility: public
PKv}[M��1��ri/1.8/system/Range/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Constructs a range using the given <em>start</em> and <em>end</em>. If the third parameter is omitted or is <tt>false</tt>, the <em>range</em> will include the end object; otherwise, it will be excluded.
full_name: Range::new
is_singleton: true
name: new
params: |
  Range.new(start, end, exclusive=false)    => range

visibility: public
PKv}[�|����'ri/1.8/system/Range/pretty_print-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Range#pretty_print
is_singleton: false
name: pretty_print
params: (q)
visibility: public
PKv}[�!�/++$ri/1.8/system/Range/%3d%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>obj</em> is an element of <em>rng</em>, <tt>false</tt> otherwise. Conveniently, <tt>===</tt> is the comparison operator used by <tt>case</tt> statements.
- !ruby/struct:SM::Flow::VERB 
  body: "   case 79\n   when 1..50   then   print &quot;low\\n&quot;\n   when 51..75  then   print &quot;medium\\n&quot;\n   when 76..100 then   print &quot;high\\n&quot;\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   high\n"
full_name: Range#===
is_singleton: false
name: ===
params: |
  rng === obj       =>  true or false
  rng.member?(val)  =>  true or false
  rng.include?(val) =>  true or false

visibility: public
PKv}[����ri/1.8/system/Range/step-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Iterates over <em>rng</em>, passing each <em>n</em>th element to the block. If the range contains numbers, <em>n</em> is added for each iteration. Otherwise <tt>step</tt> invokes <tt>succ</tt> to iterate through range elements. The following code uses class <tt>Xs</tt>, which is defined in the class-level documentation.
- !ruby/struct:SM::Flow::VERB 
  body: "   range = Xs.new(1)..Xs.new(10)\n   range.step(2) {|x| puts x}\n   range.step(3) {|x| puts x}\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "    1 x\n    3 xxx\n    5 xxxxx\n    7 xxxxxxx\n    9 xxxxxxxxx\n    1 x\n    4 xxxx\n    7 xxxxxxx\n   10 xxxxxxxxxx\n"
full_name: Range#step
is_singleton: false
name: step
params: |
  rng.step(n=1) {| obj | block }    => rng

visibility: public
PKv}[���; ri/1.8/system/Range/first-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the first object in <em>rng</em>.
full_name: Range#first
is_singleton: false
name: first
params: |
  rng.first    => obj
  rng.begin    => obj

visibility: public
PKv}[�����ri/1.8/system/Range/end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the object that defines the end of <em>rng</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   (1..10).end    #=&gt; 10\n   (1...10).end   #=&gt; 10\n"
full_name: Range#end
is_singleton: false
name: end
params: |
  rng.end    => obj
  rng.last   => obj

visibility: public
PKv}[~�)ri/1.8/system/Range/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert this range object to a printable form.
full_name: Range#to_s
is_singleton: false
name: to_s
params: |
  rng.to_s   => string

visibility: public
PKv}[�(�VV!ri/1.8/system/Range/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns <tt>true</tt> only if <em>obj</em> is a Range, has equivalent beginning and end items (by comparing them with <tt>==</tt>), and has the same #exclude_end? setting as &lt;i&gt;rng&lt;/t&gt;."
- !ruby/struct:SM::Flow::VERB 
  body: "  (0..2) == (0..2)            #=&gt; true\n  (0..2) == Range.new(0,2)    #=&gt; true\n  (0..2) == (0...2)           #=&gt; false\n"
full_name: Range#==
is_singleton: false
name: ==
params: |
  rng == obj    => true or false

visibility: public
PKv}[��o] ri/1.8/system/Range/begin-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the first object in <em>rng</em>.
full_name: Range#begin
is_singleton: false
name: begin
params: |
  rng.first    => obj
  rng.begin    => obj

visibility: public
PKv}[227��1ri/1.8/system/Exception2MessageMapper/fail-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Exception2MessageMapper#fail
is_singleton: false
name: fail
params: (err = nil, *rest)
visibility: public
PKv}[�LO��2ri/1.8/system/Exception2MessageMapper/Raise-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: Fail
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Fail(err, *rest)
- !ruby/struct:SM::Flow::VERB 
  body: "    err:        exception\n    rest:       message arguments\n"
full_name: Exception2MessageMapper#Raise
is_singleton: false
name: Raise
params: (err = nil, *rest)
visibility: public
PKv}[�H��1ri/1.8/system/Exception2MessageMapper/Fail-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #Raise"
full_name: Exception2MessageMapper#Fail
is_singleton: false
name: Fail
params: (err = nil, *rest)
visibility: public
PKv}[��^��:ri/1.8/system/Exception2MessageMapper/def_e2message-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: def_e2message(c, m)
- !ruby/struct:SM::Flow::VERB 
  body: "        c:  exception\n        m:  message_form\n    define exception c with message m.\n"
full_name: Exception2MessageMapper#def_e2message
is_singleton: false
name: def_e2message
params: (c, m)
visibility: public
PKv}[_=1��?ri/1.8/system/Exception2MessageMapper/E2MM/extend_object-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Exception2MessageMapper::E2MM::extend_object
is_singleton: true
name: extend_object
params: (cl)
visibility: public
PKv}[�]�H��>ri/1.8/system/Exception2MessageMapper/E2MM/e2mm_message-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Exception2MessageMapper::E2MM::e2mm_message
is_singleton: true
name: e2mm_message
params: (klass, exp)
visibility: public
PKv}[����:ri/1.8/system/Exception2MessageMapper/E2MM/cdesc-E2MM.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: Raise
- !ruby/object:RI::MethodSummary 
  name: def_e2message
- !ruby/object:RI::MethodSummary 
  name: def_exception
- !ruby/object:RI::MethodSummary 
  name: e2mm_message
- !ruby/object:RI::MethodSummary 
  name: extend_object
- !ruby/object:RI::MethodSummary 
  name: extend_to
comment: 
constants: []

full_name: Exception2MessageMapper::E2MM
includes: []

instance_methods: []

name: E2MM
superclass: 
PKv}[y=ێ��7ri/1.8/system/Exception2MessageMapper/E2MM/Raise-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Fail(klass, err, *rest)
- !ruby/struct:SM::Flow::VERB 
  body: "    klass:  class to define exception under.\n    err:        exception\n    rest:       message arguments\n"
full_name: Exception2MessageMapper::E2MM::Raise
is_singleton: true
name: Raise
params: (klass = E2MM, err = nil, *rest)
visibility: public
PKv}[e�� ��?ri/1.8/system/Exception2MessageMapper/E2MM/def_e2message-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: E2MM.def_exception(k, e, m)
- !ruby/struct:SM::Flow::VERB 
  body: "        k:  class to define exception under.\n        e:  exception\n        m:  message_form\n    define exception c with message m.\n"
full_name: Exception2MessageMapper::E2MM::def_e2message
is_singleton: true
name: def_e2message
params: (k, c, m)
visibility: public
PKv}[X�E�?ri/1.8/system/Exception2MessageMapper/E2MM/def_exception-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: E2MM.def_exception(k, n, m, s)
- !ruby/struct:SM::Flow::VERB 
  body: "        k:  class to define exception under.\n        n:  exception_name\n        m:  message_form\n        s:      superclass(default: StandardError)\n    define exception named ``c'' with message m.\n"
full_name: Exception2MessageMapper::E2MM::def_exception
is_singleton: true
name: def_exception
params: (k, n, m, s = StandardError)
visibility: public
PKv}[~<�;��;ri/1.8/system/Exception2MessageMapper/E2MM/extend_to-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: backward compatibility
full_name: Exception2MessageMapper::E2MM::extend_to
is_singleton: true
name: extend_to
params: (b)
visibility: public
PKv}[Ղ|)��1ri/1.8/system/Exception2MessageMapper/bind-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Exception2MessageMapper#bind
is_singleton: false
name: bind
params: (cl)
visibility: public
PKv}[���uSSHri/1.8/system/Exception2MessageMapper/cdesc-Exception2MessageMapper.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: E2MM
  value: Exception2MessageMapper
full_name: Exception2MessageMapper
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: Fail
- !ruby/object:RI::MethodSummary 
  name: Raise
- !ruby/object:RI::MethodSummary 
  name: bind
- !ruby/object:RI::MethodSummary 
  name: def_e2message
- !ruby/object:RI::MethodSummary 
  name: def_exception
- !ruby/object:RI::MethodSummary 
  name: fail
name: Exception2MessageMapper
superclass: 
PKv}[�t���:ri/1.8/system/Exception2MessageMapper/def_exception-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: def_exception(n, m, s)
- !ruby/struct:SM::Flow::VERB 
  body: "        n:  exception_name\n        m:  message_form\n        s:      superclass(default: StandardError)\n    define exception named ``c'' with message m.\n"
full_name: Exception2MessageMapper#def_exception
is_singleton: false
name: def_exception
params: (n, m, s = StandardError)
visibility: public
PKv}[p�K�###ri/1.8/system/Socket/connect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Requests a connection to be made on the given <tt>server_sockaddr</tt>. Returns 0 if successful, otherwise an exception is raised.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameter
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>server_sockaddr</tt> - the <tt>struct</tt> sockaddr contained in a string
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "     # Pull down Google's web page\n     require 'socket'\n     include Socket::Constants\n     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )\n     sockaddr = Socket.pack_sockaddr_in( 80, 'www.google.com' )\n     socket.connect( sockaddr )\n     socket.write( &quot;GET / HTTP/1.0\\r\\n\\r\\n&quot; )\n     results = socket.read\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Unix-based Exceptions
- !ruby/struct:SM::Flow::P 
  body: "On unix-based systems the following system exceptions may be raised if the call to <em>connect</em> fails:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EACCES - search permission is denied for a component of the prefix path or write access to the <tt>socket</tt> is denided
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EADDRINUSE - the <em>sockaddr</em> is already in use
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EADDRNOTAVAIL - the specified <em>sockaddr</em> is not available from the local machine
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EAFNOSUPPORT - the specified <em>sockaddr</em> is not a valid address for the address family of the specified <tt>socket</tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EALREADY - a connection is already in progress for the specified socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EBADF - the <tt>socket</tt> is not a valid file descriptor
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ECONNREFUSED - the target <em>sockaddr</em> was not listening for connections refused the connection request
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ECONNRESET - the remote host reset the connection request
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EFAULT - the <em>sockaddr</em> cannot be accessed
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EHOSTUNREACH - the destination host cannot be reached (probably because the host is down or a remote router cannot reach it)
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINPROGRESS - the O_NONBLOCK is set for the <tt>socket</tt> and the connection cnanot be immediately established; the connection will be established asynchronously
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINTR - the attempt to establish the connection was interrupted by delivery of a signal that was caught; the connection will be established asynchronously
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EISCONN - the specified <tt>socket</tt> is already connected
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINVAL - the address length used for the <em>sockaddr</em> is not a valid length for the address family or there is an invalid family in <em>sockaddr</em>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENAMETOOLONG - the pathname resolved had a length which exceeded PATH_MAX
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENETDOWN - the local interface used to reach the destination is down
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENETUNREACH - no route to the network is present
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOBUFS - no buffer space is available
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOSR - there were insufficient STREAMS resources available to complete the operation
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOTSOCK - the <tt>socket</tt> argument does not refer to a socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EOPNOTSUPP - the calling <tt>socket</tt> is listening and cannot be connected
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EPROTOTYPE - the <em>sockaddr</em> has a different type than the socket bound to the specified peer address
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ETIMEDOUT - the attempt to connect time out before a connection was made.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "On unix-based systems if the address family of the calling <tt>socket</tt> is AF_UNIX the follow exceptions may be raised if the call to <em>connect</em> fails:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EIO - an i/o error occured while reading from or writing to the file system
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ELOOP - too many symbolic links were encountered in translating the pathname in <em>sockaddr</em>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENAMETOOLLONG - a component of a pathname exceeded NAME_MAX characters, or an entired pathname exceeded PATH_MAX characters
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOENT - a component of the pathname does not name an existing file or the pathname is an empty string
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOTDIR - a component of the path prefix of the pathname in <em>sockaddr</em> is not a directory
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Windows Exceptions
- !ruby/struct:SM::Flow::P 
  body: "On Windows systems the following system exceptions may be raised if the call to <em>connect</em> fails:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENETDOWN - the network is down
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EADDRINUSE - the socket's local address is already in use
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINTR - the socket was cancelled
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINPROGRESS - a blocking socket is in progress or the service provider is still processing a callback function. Or a nonblocking connect call is in progress on the <tt>socket</tt>.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EALREADY - see Errno::EINVAL
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EADDRNOTAVAIL - the remote address is not a valid address, such as ADDR_ANY TODO check ADDRANY TO INADDR_ANY
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EAFNOSUPPORT - addresses in the specified family cannot be used with with this <tt>socket</tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ECONNREFUSED - the target <em>sockaddr</em> was not listening for connections refused the connection request
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EFAULT - the socket's internal address or address length parameter is too small or is not a valid part of the user space address
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINVAL - the <tt>socket</tt> is a listening socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EISCONN - the <tt>socket</tt> is already connected
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENETUNREACH - the network cannot be reached from this host at this time
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EHOSTUNREACH - no route to the network is present
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOBUFS - no buffer space is available
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOTSOCK - the <tt>socket</tt> argument does not refer to a socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ETIMEDOUT - the attempt to connect time out before a connection was made.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EWOULDBLOCK - the socket is marked as nonblocking and the connection cannot be completed immediately
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EACCES - the attempt to connect the datagram socket to the broadcast address failed
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: See
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: connect manual pages on unix-based systems
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: connect function in Microsoft's Winsock functions reference
  type: :BULLET
full_name: Socket#connect
is_singleton: false
name: connect
params: |
  socket.connect(server_sockaddr) => 0

visibility: public
PKv}[N7(��$ri/1.8/system/Socket/recvfrom-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Receives up to <em>maxlen</em> bytes from <tt>socket</tt>. <em>flags</em> is zero or more of the <tt>MSG_</tt> options. The first element of the results, <em>mesg</em>, is the data received. The second element, <em>sender_sockaddr</em>, contains protocol-specific information on the sender.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameters
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>maxlen</tt> - the number of bytes to receive from the socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>flags</tt> - zero or more of the <tt>MSG_</tt> options
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "     # In one file, start this first\n     require 'socket'\n     include Socket::Constants\n     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )\n     sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )\n     socket.bind( sockaddr )\n     socket.listen( 5 )\n     client, client_sockaddr = socket.accept\n     data = client.recvfrom( 20 )[0].chomp\n     puts &quot;I only received 20 bytes '#{data}'&quot;\n     sleep 1\n     socket.close\n\n     # In another file, start this second\n     require 'socket'\n     include Socket::Constants\n     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )\n     sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )\n     socket.connect( sockaddr )\n     socket.puts &quot;Watch this get cut short!&quot;\n     socket.close\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Unix-based Exceptions
- !ruby/struct:SM::Flow::P 
  body: "On unix-based based systems the following system exceptions may be raised if the call to <em>recvfrom</em> fails:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EAGAIN - the <tt>socket</tt> file descriptor is marked as O_NONBLOCK and no data is waiting to be received; or MSG_OOB is set and no out-of-band data is available and either the <tt>socket</tt> file descriptor is marked as O_NONBLOCK or the <tt>socket</tt> does not support blocking to wait for out-of-band-data
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EWOULDBLOCK - see Errno::EAGAIN
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EBADF - the <tt>socket</tt> is not a valid file descriptor
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ECONNRESET - a connection was forcibly closed by a peer
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EFAULT - the socket's internal buffer, address or address length cannot be accessed or written
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINTR - a signal interupted <em>recvfrom</em> before any data was available
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINVAL - the MSG_OOB flag is set and no out-of-band data is available
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EIO - an i/o error occurred while reading from or writing to the filesystem
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOBUFS - insufficient resources were available in the system to perform the operation
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOMEM - insufficient memory was available to fulfill the request
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOSR - there were insufficient STREAMS resources available to complete the operation
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOTCONN - a receive is attempted on a connection-mode socket that is not connected
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOTSOCK - the <tt>socket</tt> does not refer to a socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EOPNOTSUPP - the specified flags are not supported for this socket type
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ETIMEDOUT - the connection timed out during connection establishment or due to a transmission timeout on an active connection
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Windows Exceptions
- !ruby/struct:SM::Flow::P 
  body: "On Windows systems the following system exceptions may be raised if the call to <em>recvfrom</em> fails:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENETDOWN - the network is down
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EFAULT - the internal buffer and from parameters on <tt>socket</tt> are not part of the user address space, or the internal fromlen parameter is too small to accomodate the peer address
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINTR - the (blocking) call was cancelled by an internal call to the WinSock function WSACancelBlockingCall
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINPROGRESS - a blocking Windows Sockets 1.1 call is in progress or the service provider is still processing a callback function
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINVAL - <tt>socket</tt> has not been bound with a call to <em>bind</em>, or an unknown flag was specified, or MSG_OOB was specified for a socket with SO_OOBINLINE enabled, or (for byte stream-style sockets only) the internal len parameter on <tt>socket</tt> was zero or negative
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EISCONN - <tt>socket</tt> is already connected. The call to <em>recvfrom</em> is not permitted with a connected socket on a socket that is connetion oriented or connectionless.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENETRESET - the connection has been broken due to the keep-alive activity detecting a failure while the operation was in progress.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EOPNOTSUPP - MSG_OOB was specified, but <tt>socket</tt> is not stream-style such as type SOCK_STREAM. OOB data is not supported in the communication domain associated with <tt>socket</tt>, or <tt>socket</tt> is unidirectional and supports only send operations
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ESHUTDOWN - <tt>socket</tt> has been shutdown. It is not possible to call <em>recvfrom</em> on a socket after <em>shutdown</em> has been invoked.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EWOULDBLOCK - <tt>socket</tt> is marked as nonblocking and a call to <em>recvfrom</em> would block.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EMSGSIZE - the message was too large to fit into the specified buffer and was truncated.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ETIMEDOUT - the connection has been dropped, because of a network failure or because the system on the other end went down without notice
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ECONNRESET - the virtual circuit was reset by the remote side executing a hard or abortive close. The application should close the socket; it is no longer usable. On a UDP-datagram socket this error indicates a previous send operation resulted in an ICMP Port Unreachable message.
  type: :BULLET
full_name: Socket#recvfrom
is_singleton: false
name: recvfrom
params: |
  socket.recvfrom(maxlen) => [mesg, sender_sockaddr]
  socket.recvfrom(maxlen, flags) => [mesg, sender_sockaddr]

visibility: public
PKv}[#�k���)ri/1.8/system/Socket/getservbyname-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>name</tt> is a service name (&quot;ftp&quot;, &quot;telnet&quot;, ...) and proto is a protocol name (&quot;udp&quot;, &quot;tcp&quot;, ...). '/etc/services' (or your system's equivalent) is searched for a service for <tt>name</tt> and <tt>proto</tt>, and the port number is returned.
- !ruby/struct:SM::Flow::P 
  body: Note that unlike Socket.getaddrinfo, <tt>proto</tt> may not be specified using the Socket::SOCK_* constants, a string must must be used.
full_name: Socket::getservbyname
is_singleton: true
name: getservbyname
params: " Socket.getservbyname(name, proto=\"tcp\") => port\n"
visibility: public
PKv}[N����3ri/1.8/system/Socket/Constants/cdesc-Constants.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: constants
constants: []

full_name: Socket::Constants
includes: []

instance_methods: []

name: Constants
superclass: 
PKv}[ y�''	'	&ri/1.8/system/Socket/cdesc-Socket.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: getaddrinfo
- !ruby/object:RI::MethodSummary 
  name: gethostbyname
- !ruby/object:RI::MethodSummary 
  name: getservbyname
comment: 
- !ruby/struct:SM::Flow::P 
  body: Class <tt>Socket</tt> provides access to the underlying operating system socket implementations. It can be used to provide more operating system specific functionality than the protocol-specific socket classes but at the expense of greater complexity. In particular, the class handles addresses using +struct sockaddr+ structures packed into Ruby strings, which can be a joy to manipulate.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Exception Handling
- !ruby/struct:SM::Flow::P 
  body: Ruby's implementation of <tt>Socket</tt> causes an exception to be raised based on the error generated by the system dependent implementation. This is why the methods are documented in a way that isolate Unix-based system exceptions from Windows based exceptions. If more information on particular exception is needed please refer to the Unix manual pages or the Windows WinSock reference.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Documentation by
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Zach Dennis
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Sam Roberts
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <em>Programming Ruby</em> from The Pragmatic Bookshelf.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: Much material in this documentation is taken with permission from <em>Programming Ruby</em> from The Pragmatic Bookshelf.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: AF_INET6
  value: Object.new
full_name: Socket
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: accept
- !ruby/object:RI::MethodSummary 
  name: accept_nonblock
- !ruby/object:RI::MethodSummary 
  name: bind
- !ruby/object:RI::MethodSummary 
  name: connect
- !ruby/object:RI::MethodSummary 
  name: connect_nonblock
- !ruby/object:RI::MethodSummary 
  name: listen
- !ruby/object:RI::MethodSummary 
  name: recvfrom
- !ruby/object:RI::MethodSummary 
  name: recvfrom_nonblock
- !ruby/object:RI::MethodSummary 
  name: sysaccept
name: Socket
superclass: Object
PKv}[�7��
�
-ri/1.8/system/Socket/recvfrom_nonblock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Receives up to <em>maxlen</em> bytes from <tt>socket</tt> using recvfrom(2) after O_NONBLOCK is set for the underlying file descriptor. <em>flags</em> is zero or more of the <tt>MSG_</tt> options. The first element of the results, <em>mesg</em>, is the data received. The second element, <em>sender_sockaddr</em>, contains protocol-specific information on the sender.
- !ruby/struct:SM::Flow::P 
  body: "When recvfrom(2) returns 0, Socket#recvfrom_nonblock returns an empty string as data. The meaning depends on the socket: EOF on TCP, empty packet on UDP, etc."
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameters
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>maxlen</tt> - the number of bytes to receive from the socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>flags</tt> - zero or more of the <tt>MSG_</tt> options
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "     # In one file, start this first\n     require 'socket'\n     include Socket::Constants\n     socket = Socket.new(AF_INET, SOCK_STREAM, 0)\n     sockaddr = Socket.sockaddr_in(2200, 'localhost')\n     socket.bind(sockaddr)\n     socket.listen(5)\n     client, client_sockaddr = socket.accept\n     begin\n       pair = client.recvfrom_nonblock(20)\n     rescue Errno::EAGAIN, Errno::EWOULDBLOCK\n       IO.select([client])\n       retry\n     end\n     data = pair[0].chomp\n     puts &quot;I only received 20 bytes '#{data}'&quot;\n     sleep 1\n     socket.close\n\n     # In another file, start this second\n     require 'socket'\n     include Socket::Constants\n     socket = Socket.new(AF_INET, SOCK_STREAM, 0)\n     sockaddr = Socket.sockaddr_in(2200, 'localhost')\n     socket.connect(sockaddr)\n     socket.puts &quot;Watch this get cut short!&quot;\n     socket.close\n"
- !ruby/struct:SM::Flow::P 
  body: Refer to Socket#recvfrom for the exceptions that may be thrown if the call to <em>recvfrom_nonblock</em> fails.
- !ruby/struct:SM::Flow::P 
  body: Socket#recvfrom_nonblock may raise any error corresponding to recvfrom(2) failure, including Errno::EAGAIN.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: See
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Socket#recvfrom
  type: :BULLET
full_name: Socket#recvfrom_nonblock
is_singleton: false
name: recvfrom_nonblock
params: |
  socket.recvfrom_nonblock(maxlen) => [mesg, sender_sockaddr]
  socket.recvfrom_nonblock(maxlen, flags) => [mesg, sender_sockaddr]

visibility: public
PKv}[5�YY ri/1.8/system/Socket/bind-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Binds to the given <tt>struct</tt> sockaddr.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameter
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>server_sockaddr</tt> - the <tt>struct</tt> sockaddr contained in a string
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "     require 'socket'\n     include Socket::Constants\n     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )\n     sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )\n     socket.bind( sockaddr )\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Unix-based Exceptions
- !ruby/struct:SM::Flow::P 
  body: "On unix-based based systems the following system exceptions may be raised if the call to <em>bind</em> fails:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EACCES - the specified <em>sockaddr</em> is protected and the current user does not have permission to bind to it
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EADDRINUSE - the specified <em>sockaddr</em> is already in use
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EADDRNOTAVAIL - the specified <em>sockaddr</em> is not available from the local machine
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EAFNOSUPPORT - the specified <em>sockaddr</em> isnot a valid address for the family of the calling <tt>socket</tt>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EBADF - the <em>sockaddr</em> specified is not a valid file descriptor
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EFAULT - the <em>sockaddr</em> argument cannot be accessed
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINVAL - the <tt>socket</tt> is already bound to an address, and the protocol does not support binding to the new <em>sockaddr</em> or the <tt>socket</tt> has been shut down.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINVAL - the address length is not a valid length for the address family
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENAMETOOLONG - the pathname resolved had a length which exceeded PATH_MAX
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOBUFS - no buffer space is available
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOSR - there were insufficient STREAMS resources available to complete the operation
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOTSOCK - the <tt>socket</tt> does not refer to a socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EOPNOTSUPP - the socket type of the <tt>socket</tt> does not support binding to an address
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: "On unix-based based systems if the address family of the calling <tt>socket</tt> is Socket::AF_UNIX the follow exceptions may be raised if the call to <em>bind</em> fails:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EACCES - search permission is denied for a component of the prefix path or write access to the <tt>socket</tt> is denided
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EDESTADDRREQ - the <em>sockaddr</em> argument is a null pointer
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EISDIR - same as Errno::EDESTADDRREQ
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EIO - an i/o error occurred
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ELOOP - too many symbolic links were encountered in translating the pathname in <em>sockaddr</em>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENAMETOOLLONG - a component of a pathname exceeded NAME_MAX characters, or an entired pathname exceeded PATH_MAX characters
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOENT - a component of the pathname does not name an existing file or the pathname is an empty string
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOTDIR - a component of the path prefix of the pathname in <em>sockaddr</em> is not a directory
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EROFS - the name would reside on a read only filesystem
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Windows Exceptions
- !ruby/struct:SM::Flow::P 
  body: "On Windows systems the following system exceptions may be raised if the call to <em>bind</em> fails:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENETDOWN-- the network is down
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EACCES - the attempt to connect the datagram socket to the broadcast address failed
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EADDRINUSE - the socket's local address is already in use
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EADDRNOTAVAIL - the specified address is not a valid address for this computer
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EFAULT - the socket's internal address or address length parameter is too small or is not a valid part of the user space addressed
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINVAL - the <tt>socket</tt> is already bound to an address
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOBUFS - no buffer space is available
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOTSOCK - the <tt>socket</tt> argument does not refer to a socket
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: See
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: bind manual pages on unix-based systems
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: bind function in Microsoft's Winsock functions reference
  type: :BULLET
full_name: Socket#bind
is_singleton: false
name: bind
params: |
  socket.bind(server_sockaddr) => 0

visibility: public
PKv}[Acu�zz+ri/1.8/system/Socket/accept_nonblock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Accepts an incoming connection using accept(2) after O_NONBLOCK is set for the underlying file descriptor. It returns an array containg the accpeted socket for the incoming connection, <em>client_socket</em>, and a string that contains the <tt>struct</tt> sockaddr information about the caller, <em>client_sockaddr</em>.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "     # In one script, start this first\n     require 'socket'\n     include Socket::Constants\n     socket = Socket.new(AF_INET, SOCK_STREAM, 0)\n     sockaddr = Socket.sockaddr_in(2200, 'localhost')\n     socket.bind(sockaddr)\n     socket.listen(5)\n     begin\n       client_socket, client_sockaddr = socket.accept_nonblock\n     rescue Errno::EAGAIN, Errno::EWOULDBLOCK, Errno::ECONNABORTED, Errno::EPROTO, Errno::EINTR\n       IO.select([socket])\n       retry\n     end\n     puts &quot;The client said, '#{client_socket.readline.chomp}'&quot;\n     client_socket.puts &quot;Hello from script one!&quot;\n     socket.close\n\n     # In another script, start this second\n     require 'socket'\n     include Socket::Constants\n     socket = Socket.new(AF_INET, SOCK_STREAM, 0)\n     sockaddr = Socket.sockaddr_in(2200, 'localhost')\n     socket.connect(sockaddr)\n     socket.puts &quot;Hello from script 2.&quot;\n     puts &quot;The server said, '#{socket.readline.chomp}'&quot;\n     socket.close\n"
- !ruby/struct:SM::Flow::P 
  body: Refer to Socket#accept for the exceptions that may be thrown if the call to <em>accept_nonblock</em> fails.
- !ruby/struct:SM::Flow::P 
  body: Socket#accept_nonblock may raise any error corresponding to accept(2) failure, including Errno::EAGAIN.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: See
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Socket#accept
  type: :BULLET
full_name: Socket#accept_nonblock
is_singleton: false
name: accept_nonblock
params: |
  socket.accept_nonblock => [client_socket, client_sockaddr]

visibility: public
PKv}[.��vBB)ri/1.8/system/Socket/gethostbyname-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Resolve <tt>host</tt> and return name and address information for it, similarly to gethostbyname(3). <tt>host</tt> can be a domain name or the presentation format of an address.
- !ruby/struct:SM::Flow::P 
  body: "Returns an array of information similar to that found in a +struct hostent+:"
- !ruby/struct:SM::Flow::VERB 
  body: "  - cannonical name: the cannonical name for host in the DNS, or a\n    string representing the address\n  - aliases: an array of aliases for the canonical name, there may be no aliases\n  - address family: usually one of Socket::AF_INET or Socket::AF_INET6\n  - address: a string, the binary value of the +struct sockaddr+ for this name, in\n    the indicated address family\n  - ...: if there are multiple addresses for this host,  a series of\n    strings/+struct sockaddr+s may follow, not all necessarily in the same\n    address family. Note that the fact that they may not be all in the same\n    address family is a departure from the behaviour of gethostbyname(3).\n"
- !ruby/struct:SM::Flow::P 
  body: "Note: I believe that the fact that the multiple addresses returned are not necessarily in the same address family may be a bug, since if this function actually called gethostbyname(3), ALL the addresses returned in the trailing address list (h_addr_list from struct hostent) would be of the same address family! Examples from my system, OS X 10.3:"
- !ruby/struct:SM::Flow::VERB 
  body: "  [&quot;localhost&quot;, [], 30, &quot;\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\001&quot;, &quot;\\177\\000\\000\\001&quot;]\n    and\n  [&quot;ensemble.local&quot;, [], 30, &quot;\\376\\200\\000\\004\\000\\000\\000\\000\\002\\003\\223\\377\\376\\255\\010\\214&quot;, &quot;\\300\\250{\\232&quot; ]\n"
- !ruby/struct:SM::Flow::P 
  body: "Similar information can be returned by Socket.getaddrinfo if called as:"
- !ruby/struct:SM::Flow::VERB 
  body: "   Socket.getaddrinfo(<tt>host</tt>, 0, Socket::AF_UNSPEC, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME)\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Examples
- !ruby/struct:SM::Flow::VERB 
  body: "  Socket.gethostbyname &quot;example.com&quot;\n  =&gt; [&quot;example.com&quot;, [], 2, &quot;\\300\\000\\&quot;\\246&quot;]\n"
- !ruby/struct:SM::Flow::P 
  body: This name has no DNS aliases, and a single IPv4 address.
- !ruby/struct:SM::Flow::VERB 
  body: "  Socket.gethostbyname &quot;smtp.telus.net&quot;\n  =&gt; [&quot;smtp.svc.telus.net&quot;, [&quot;smtp.telus.net&quot;], 2, &quot;\\307\\271\\334\\371&quot;]\n"
- !ruby/struct:SM::Flow::P 
  body: This name is an an alias so the canonical name is returned, as well as the alias and a single IPv4 address.
- !ruby/struct:SM::Flow::VERB 
  body: "  Socket.gethostbyname &quot;localhost&quot;\n  =&gt; [&quot;localhost&quot;, [], 30, &quot;\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\001&quot;, &quot;\\177\\000\\000\\001&quot;]\n"
- !ruby/struct:SM::Flow::P 
  body: This machine has no aliases, returns an IPv6 address, and has an additional IPv4 address.
- !ruby/struct:SM::Flow::P 
  body: "<tt>host</tt> can also be an IP address in presentation format, in which case a reverse lookup is done on the address:"
- !ruby/struct:SM::Flow::VERB 
  body: "  Socket.gethostbyname(&quot;127.0.0.1&quot;)\n  =&gt; [&quot;localhost&quot;, [], 2, &quot;\\177\\000\\000\\001&quot;]\n\n  Socket.gethostbyname(&quot;192.0.34.166&quot;)\n  =&gt; [&quot;www.example.com&quot;, [], 2, &quot;\\300\\000\\&quot;\\246&quot;]\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: See
- !ruby/struct:SM::Flow::P 
  body: "See: Socket.getaddrinfo"
full_name: Socket::gethostbyname
is_singleton: true
name: gethostbyname
params: " Socket.gethostbyname(host) => hostent\n"
visibility: public
PKv}[�֎��'ri/1.8/system/Socket/getaddrinfo-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return address information for <tt>host</tt> and <tt>port</tt>. The remaining arguments are hints that limit the address information returned.
- !ruby/struct:SM::Flow::P 
  body: This method corresponds closely to the POSIX.1g getaddrinfo() definition.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameters
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: <tt>host</tt> is a host name or an address string (dotted decimal for IPv4, or a hex string for IPv6) for which to return information. A nil is also allowed, its meaning depends on <tt>flags</tt>, see below.
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: <tt>service</tt> is a service name (&quot;http&quot;, &quot;ssh&quot;, ...), or a port number (80, 22, ...), see Socket.getservbyname for more information. A nil is also allowed, meaning zero.
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: <tt>family</tt> limits the output to a specific address family, one of the Socket::AF_* constants. Socket::AF_INET (IPv4) and Socket::AF_INET6 (IPv6) are the most commonly used families. You will usually pass either nil or Socket::AF_UNSPEC, allowing the IPv6 information to be returned first if <tt>host</tt> is reachable via IPv6, and IPv4 information otherwise. The two strings &quot;AF_INET&quot; or &quot;AF_INET6&quot; are also allowed, they are converted to their respective Socket::AF_* constants.
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: <tt>socktype</tt> limits the output to a specific type of socket, one of the Socket::SOCK_* constants. Socket::SOCK_STREAM (for TCP) and Socket::SOCK_DGRAM (for UDP) are the most commonly used socket types. If nil, then information for all types of sockets supported by <tt>service</tt> will be returned. You will usually know what type of socket you intend to create, and should pass that socket type in.
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: <tt>protocol</tt> limits the output to a specific protocol numpber, one of the Socket::IPPROTO_* constants. It is usually implied by the socket type (Socket::SOCK_STREAM =&gt; Socket::IPPROTO_TCP, ...), if you pass other than nil you already know what this is for.
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "<tt>flags</tt> is one of the Socket::AI_* constants. They mean:"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "-"
      body: "Socket::AI_PASSIVE: when set, if <tt>host</tt> is nil the 'any' address will be returned, Socket::INADDR_ANY or 0 for IPv4, &quot;0::0&quot; or &quot;::&quot; for IPv6. This address is suitable for use by servers that will bind their socket and do a passive listen, thus the name of the flag. Otherwise the local or loopback address will be returned, this is &quot;127.0.0.1&quot; for IPv4 and &quot;::1' for IPv6."
    - !ruby/struct:SM::Flow::LI 
      label: "-"
      body: ...
    type: :BULLET
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Returns
- !ruby/struct:SM::Flow::P 
  body: "Returns an array of arrays, where each subarray contains:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: address family, a string like &quot;AF_INET&quot; or &quot;AF_INET6&quot;
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: port number, the port number for <tt>service</tt>
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: host name, either a canonical name for <tt>host</tt>, or it's address in presentation format if the address could not be looked up.
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: host IP, the address of <tt>host</tt> in presentation format
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: address family, as a numeric value (one of the Socket::AF_* constants).
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: socket type, as a numeric value (one of the Socket::SOCK_* constants).
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: protocol number, as a numeric value (one of the Socket::IPPROTO_* constants).
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: The first four values are identical to what is commonly returned as an address array, see IPSocket for more information.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Examples
- !ruby/struct:SM::Flow::P 
  body: Not all input combinations are valid, and while there are many combinations, only a few cases are common.
- !ruby/struct:SM::Flow::P 
  body: "A typical client will call getaddrinfo with the <tt>host</tt> and <tt>service</tt> it wants to connect to. It knows that it will attempt to connect with either TCP or UDP, and specifies <tt>socktype</tt> accordingly. It loops through all returned addresses, and try to connect to them in turn:"
- !ruby/struct:SM::Flow::VERB 
  body: "  addrinfo = Socket::getaddrinfo('www.example.com', 'www', nil, Socket::SOCK_STREAM)\n  addrinfo.each do |af, port, name, addr|\n    begin\n      sock = TCPSocket.new(addr, port)\n      # ...\n      exit 1\n    rescue\n    end\n  end\n"
- !ruby/struct:SM::Flow::P 
  body: With UDP you don't know if connect suceeded, but if communication fails, the next address can be tried.
- !ruby/struct:SM::Flow::P 
  body: "A typical server will call getaddrinfo with a <tt>host</tt> of nil, the <tt>service</tt> it listens to, and a <tt>flags</tt> of Socket::AI_PASSIVE. It will listen for connections on the first returned address:"
- !ruby/struct:SM::Flow::VERB 
  body: "  addrinfo = Socket::getaddrinfo(nil, 'www', nil, Socket::SOCK_STREAM, nil, Socket::AI_PASSIVE)\n  af, port, name, addr = addrinfo.first\n  sock = TCPServer(addr, port)\n  while( client = s.accept )\n    # ...\n  end\n"
full_name: Socket::getaddrinfo
is_singleton: true
name: getaddrinfo
params: " Socket.getaddrinfo(host, service, family=nil, socktype=nil, protocol=nil, flags=nil) => addrinfo\n"
visibility: public
PKv}[1IZZ"ri/1.8/system/Socket/accept-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Accepts an incoming connection returning an array containing a new Socket object and a string holding the <tt>struct</tt> sockaddr information about the caller.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "     # In one script, start this first\n     require 'socket'\n     include Socket::Constants\n     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )\n     sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )\n     socket.bind( sockaddr )\n     socket.listen( 5 )\n     client, client_sockaddr = socket.accept\n     puts &quot;The client said, '#{client.readline.chomp}'&quot;\n     client.puts &quot;Hello from script one!&quot;\n     socket.close\n\n     # In another script, start this second\n     require 'socket'\n     include Socket::Constants\n     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )\n     sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )\n     socket.connect( sockaddr )\n     socket.puts &quot;Hello from script 2.&quot;\n     puts &quot;The server said, '#{socket.readline.chomp}'&quot;\n     socket.close\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Unix-based Exceptions
- !ruby/struct:SM::Flow::P 
  body: "On unix-based based systems the following system exceptions may be raised if the call to <em>accept</em> fails:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EAGAIN - O_NONBLOCK is set for the <tt>socket</tt> file descriptor and no connections are parent to be accepted
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EWOULDBLOCK - same as Errno::EAGAIN
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EBADF - the <tt>socket</tt> is not a valid file descriptor
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ECONNABORTED - a connection has been aborted
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EFAULT - the socket's internal address or address length parameter cannot be access or written
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINTR - the <em>accept</em> method was interrupted by a signal that was caught before a valid connection arrived
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINVAL - the <tt>socket</tt> is not accepting connections
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EMFILE - OPEN_MAX file descriptors are currently open in the calling process
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOBUFS - no buffer space is available
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOMEM - there was insufficient memory available to complete the operation
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOSR - there was insufficient STREAMS resources available to complete the operation
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENFILE - the maximum number of file descriptors in the system are already open
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOTSOCK - the <tt>socket</tt> does not refer to a socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EOPNOTSUPP - the socket type for the calling <tt>socket</tt> does not support accept connections
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EPROTO - a protocol error has occurred
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Windows Exceptions
- !ruby/struct:SM::Flow::P 
  body: "On Windows systems the following system exceptions may be raised if the call to <em>accept</em> fails:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ECONNRESET - an incoming connection was indicated, but was terminated by the remote peer prior to accepting the connection
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EFAULT - the socket's internal address or address length parameter is too small or is not a valid part of the user space address
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINVAL - the <em>listen</em> method was not invoked prior to calling <em>accept</em>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINPROGRESS - a blocking Windows Sockets 1.1 call is in progress or the service provider is still processing a callback function
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EMFILE - the queue is not empty, upong etry to <em>accept</em> and there are no socket descriptors available
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENETDOWN - the network is down
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOBUFS - no buffer space is available
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOTSOCK - <tt>socket</tt> is not a socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EOPNOTSUPP - <tt>socket</tt> is not a type that supports connection-oriented service.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EWOULDBLOCK - <tt>socket</tt> is marked as nonblocking and no connections are present to be accepted
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: See
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: accept manual pages on unix-based systems
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: accept function in Microsoft's Winsock functions reference
  type: :BULLET
full_name: Socket#accept
is_singleton: false
name: accept
params: |
  socket.accept => [ socket, string ]

visibility: public
PKv}[H�$$"ri/1.8/system/Socket/listen-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Listens for connections, using the specified <tt>int</tt> as the backlog. A call to <em>listen</em> only applies if the <tt>socket</tt> is of type SOCK_STREAM or SOCK_SEQPACKET.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameter
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>backlog</tt> - the maximum length of the queue for pending connections.
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example 1
- !ruby/struct:SM::Flow::VERB 
  body: "     require 'socket'\n     include Socket::Constants\n     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )\n     sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )\n     socket.bind( sockaddr )\n     socket.listen( 5 )\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: "Example 2 (listening on an arbitary port, unix-based systems only):"
- !ruby/struct:SM::Flow::VERB 
  body: "     require 'socket'\n     include Socket::Constants\n     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )\n     socket.listen( 1 )\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Unix-based Exceptions
- !ruby/struct:SM::Flow::P 
  body: On unix based systems the above will work because a new <tt>sockaddr</tt> struct is created on the address ADDR_ANY, for an arbitrary port number as handed off by the kernel. It will not work on Windows, because Windows requires that the <tt>socket</tt> is bound by calling <em>bind</em> before it can <em>listen</em>.
- !ruby/struct:SM::Flow::P 
  body: If the <em>backlog</em> amount exceeds the implementation-dependent maximum queue length, the implementation's maximum queue length will be used.
- !ruby/struct:SM::Flow::P 
  body: "On unix-based based systems the following system exceptions may be raised if the call to <em>listen</em> fails:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EBADF - the <em>socket</em> argument is not a valid file descriptor
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EDESTADDRREQ - the <em>socket</em> is not bound to a local address, and the protocol does not support listening on an unbound socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINVAL - the <em>socket</em> is already connected
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOTSOCK - the <em>socket</em> argument does not refer to a socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EOPNOTSUPP - the <em>socket</em> protocol does not support listen
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EACCES - the calling process does not have approriate privileges
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINVAL - the <em>socket</em> has been shut down
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOBUFS - insufficient resources are available in the system to complete the call
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Windows Exceptions
- !ruby/struct:SM::Flow::P 
  body: "On Windows systems the following system exceptions may be raised if the call to <em>listen</em> fails:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENETDOWN - the network is down
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EADDRINUSE - the socket's local address is already in use. This usually occurs during the execution of <em>bind</em> but could be delayed if the call to <em>bind</em> was to a partially wildcard address (involving ADDR_ANY) and if a specific address needs to be commmitted at the time of the call to <em>listen</em>
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINPROGRESS - a Windows Sockets 1.1 call is in progress or the service provider is still processing a callback function
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EINVAL - the <tt>socket</tt> has not been bound with a call to <em>bind</em>.
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EISCONN - the <tt>socket</tt> is already connected
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EMFILE - no more socket descriptors are available
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOBUFS - no buffer space is available
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::ENOTSOC - <tt>socket</tt> is not a socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Errno::EOPNOTSUPP - the referenced <tt>socket</tt> is not a type that supports the <em>listen</em> method
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: See
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: listen manual pages on unix-based systems
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: listen function in Microsoft's Winsock functions reference
  type: :BULLET
full_name: Socket#listen
is_singleton: false
name: listen
params: |
  socket.listen( int ) => 0

visibility: public
PKv}[�e�h66%ri/1.8/system/Socket/sysaccept-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Accepts an incoming connection returnings an array containg the (integer) file descriptor for the incoming connection, <em>client_socket_fd</em>, and a string that contains the <tt>struct</tt> sockaddr information about the caller, <em>client_sockaddr</em>.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "     # In one script, start this first\n     require 'socket'\n     include Socket::Constants\n     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )\n     sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )\n     socket.bind( sockaddr )\n     socket.listen( 5 )\n     client_fd, client_sockaddr = socket.sysaccept\n     client_socket = Socket.for_fd( client_fd )\n     puts &quot;The client said, '#{client_socket.readline.chomp}'&quot;\n     client_socket.puts &quot;Hello from script one!&quot;\n     socket.close\n\n     # In another script, start this second\n     require 'socket'\n     include Socket::Constants\n     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )\n     sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )\n     socket.connect( sockaddr )\n     socket.puts &quot;Hello from script 2.&quot;\n     puts &quot;The server said, '#{socket.readline.chomp}'&quot;\n     socket.close\n"
- !ruby/struct:SM::Flow::P 
  body: Refer to Socket#accept for the exceptions that may be thrown if the call to <em>sysaccept</em> fails.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: See
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Socket#accept
  type: :BULLET
full_name: Socket#sysaccept
is_singleton: false
name: sysaccept
params: |
  socket.sysaccept => [client_socket_fd, client_sockaddr]

visibility: public
PKv}[�!Ɍ

,ri/1.8/system/Socket/connect_nonblock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Requests a connection to be made on the given <tt>server_sockaddr</tt> after O_NONBLOCK is set for the underlying file descriptor. Returns 0 if successful, otherwise an exception is raised.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameter
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>server_sockaddr</tt> - the <tt>struct</tt> sockaddr contained in a string
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "     # Pull down Google's web page\n     require 'socket'\n     include Socket::Constants\n     socket = Socket.new(AF_INET, SOCK_STREAM, 0)\n     sockaddr = Socket.sockaddr_in(80, 'www.google.com')\n     begin\n       socket.connect_nonblock(sockaddr)\n     rescue Errno::EINPROGRESS\n       IO.select(nil, [socket])\n       begin\n         socket.connect_nonblock(sockaddr)\n       rescue Errno::EISCONN\n       end\n     end\n     socket.write(&quot;GET / HTTP/1.0\\r\\n\\r\\n&quot;)\n     results = socket.read\n"
- !ruby/struct:SM::Flow::P 
  body: Refer to Socket#connect for the exceptions that may be thrown if the call to <em>connect_nonblock</em> fails.
- !ruby/struct:SM::Flow::P 
  body: Socket#connect_nonblock may raise any error corresponding to connect(2) failure, including Errno::EINPROGRESS.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: See
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Socket#connect
  type: :BULLET
full_name: Socket#connect_nonblock
is_singleton: false
name: connect_nonblock
params: |
  socket.connect_nonblock(server_sockaddr) => 0

visibility: public
PKv}[��?;;6ri/1.8/system/LocalJumpError/cdesc-LocalJumpError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>Proc</tt> objects are blocks of code that have been bound to a set of local variables. Once bound, the code may be called in different contexts and still access those variables.
- !ruby/struct:SM::Flow::VERB 
  body: "   def gen_times(factor)\n     return Proc.new {|n| n*factor }\n   end\n\n   times3 = gen_times(3)\n   times5 = gen_times(5)\n\n   times3.call(12)               #=&gt; 36\n   times5.call(5)                #=&gt; 25\n   times3.call(times5.call(4))   #=&gt; 60\n"
constants: []

full_name: LocalJumpError
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: exit_value
- !ruby/object:RI::MethodSummary 
  name: reason
name: LocalJumpError
superclass: StandardError
PKv}[�����.ri/1.8/system/LocalJumpError/exit_value-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "call_seq:"
- !ruby/struct:SM::Flow::VERB 
  body: "  local_jump_error.exit_value  =&gt; obj\n"
- !ruby/struct:SM::Flow::P 
  body: Returns the exit value associated with this <tt>LocalJumpError</tt>.
full_name: LocalJumpError#exit_value
is_singleton: false
name: exit_value
params: ()
visibility: public
PKv}[����UU*ri/1.8/system/LocalJumpError/reason-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "The reason this block was terminated: :break, :redo, :retry, :next, :return, or :noreason."
full_name: LocalJumpError#reason
is_singleton: false
name: reason
params: |
  local_jump_error.reason   => symbol

visibility: public
PKv}[!$		,ri/1.8/system/ThreadsWait/finished%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if any thread has terminated.
full_name: ThreadsWait#finished?
is_singleton: false
name: finished?
params: ()
visibility: public
PKv}[��)ri/1.8/system/ThreadsWait/empty%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if there are no threads to be synchronized.
full_name: ThreadsWait#empty?
is_singleton: false
name: empty?
params: ()
visibility: public
PKv}[�h���*ri/1.8/system/ThreadsWait/all_waits-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: th if block_given?
comment: 
- !ruby/struct:SM::Flow::P 
  body: Waits until all of the specified threads are terminated. If a block is supplied for the method, it is executed for each thread termination.
- !ruby/struct:SM::Flow::P 
  body: Raises exceptions in the same manner as <tt>next_wait</tt>.
full_name: ThreadsWait#all_waits
is_singleton: false
name: all_waits
params: () {|th if block_given?| ...}
visibility: public
PKv}[[�E�DD0ri/1.8/system/ThreadsWait/cdesc-ThreadsWait.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Returns the array of threads in the wait queue.
  name: threads
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: all_waits
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: This class watches for termination of multiple threads. Basic functionality (wait until specified threads have terminated) can be accessed through the class method ThreadsWait::all_waits. Finer control can be gained using instance methods.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  ThreadsWait.all_wait(thr1, thr2, ...) do |t|\n    STDERR.puts &quot;Thread #{t} has terminated.&quot;\n  end\n"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: RCS_ID
  value: "'-$Id: thwait.rb,v 1.3 1998/06/26 03:19:34 keiju Exp keiju $-'"
full_name: ThreadsWait
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: all_waits
- !ruby/object:RI::MethodSummary 
  name: empty?
- !ruby/object:RI::MethodSummary 
  name: finished?
- !ruby/object:RI::MethodSummary 
  name: join
- !ruby/object:RI::MethodSummary 
  name: join_nowait
- !ruby/object:RI::MethodSummary 
  name: next_wait
name: ThreadsWait
superclass: Object
PKv}[�%�933,ri/1.8/system/ThreadsWait/join_nowait-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Specifies the threads that this object will wait for, but does not actually wait.
full_name: ThreadsWait#join_nowait
is_singleton: false
name: join_nowait
params: (*threads)
visibility: public
PKv}[ɗ��  $ri/1.8/system/ThreadsWait/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a ThreadsWait object, specifying the threads to wait on. Non-blocking.
full_name: ThreadsWait::new
is_singleton: true
name: new
params: (*threads)
visibility: public
PKv}[M��--%ri/1.8/system/ThreadsWait/join-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Waits for specified threads to terminate, and returns when one of the threads terminated.
full_name: ThreadsWait#join
is_singleton: false
name: join
params: (*threads)
visibility: public
PKv}[f���ii*ri/1.8/system/ThreadsWait/all_waits-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: thread
comment: 
- !ruby/struct:SM::Flow::P 
  body: Waits until all specified threads have terminated. If a block is provided, it is executed for each thread termination.
full_name: ThreadsWait::all_waits
is_singleton: true
name: all_waits
params: (*threads) {|thread| ...}
visibility: public
PKv}[!�\U*ri/1.8/system/ThreadsWait/next_wait-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Waits until any of the specified threads has terminated, and returns the one that does.
- !ruby/struct:SM::Flow::P 
  body: If there is no thread to wait, raises <tt>ErrNoWaitingThread</tt>. If <tt>nonblock</tt> is true, and there is no terminated thread, raises <tt>ErrNoFinishedThread</tt>.
full_name: ThreadsWait#next_wait
is_singleton: false
name: next_wait
params: (nonblock = nil)
visibility: public
PKv}[�}k,��*ri/1.8/system/IPSocket/cdesc-IPSocket.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: IPSocket is the parent of TCPSocket and UDPSocket and implements functionality common to them.
- !ruby/struct:SM::Flow::P 
  body: "A number of APIs in IPSocket, Socket, and their descendants return an address as an array. The members of that array are:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "address family: A string like &quot;AF_INET&quot; or &quot;AF_INET6&quot; if it is one of the commonly used families, the string &quot;unknown:#&quot; (where `#' is the address family number) if it is not one of the common ones. The strings map to the Socket::AF_* constants."
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "port: The port number."
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "name: Either the canonical name from looking the address up in the DNS, or the address in presentation format"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "address: The address in presentation format (a dotted decimal string for IPv4, a hex string for IPv6)."
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: The address and port can be used directly to create sockets and to bind or connect them to the address.
constants: []

full_name: IPSocket
includes: []

instance_methods: []

name: IPSocket
superclass: BasicSocket
PKv}[O��ϵ�$ri/1.8/system/ERB/set_eoutvar-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Can be used to set <em>eoutvar</em> as described in ERB#new. It's probably easier to just use the constructor though, since calling this method requires the setup of an ERB <em>compiler</em> object.
full_name: ERB#set_eoutvar
is_singleton: false
name: set_eoutvar
params: (compiler, eoutvar = '_erbout')
visibility: public
PKv}[$��Iri/1.8/system/ERB/result-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Executes the generated ERB code to produce a completed template, returning the results of that code. (See ERB#new for details on how this process can be affected by <em>safe_level</em>.)
- !ruby/struct:SM::Flow::P 
  body: <em>b</em> accepts a Binding or Proc object which is used to set the context of code evaluation.
full_name: ERB#result
is_singleton: false
name: result
params: (b=TOPLEVEL_BINDING)
visibility: public
PKv}[Ĩ�#�# ri/1.8/system/ERB/cdesc-ERB.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The optional <em>filename</em> argument passed to Kernel#eval when the ERB code is run
  name: filename
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The Ruby code generated by ERB
  name: src
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: version
comment: 
- !ruby/struct:SM::Flow::H 
  level: 1
  text: ERB -- Ruby Templating
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Introduction
- !ruby/struct:SM::Flow::P 
  body: 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.
- !ruby/struct:SM::Flow::P 
  body: "A very simple example is this:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'erb'\n\n  x = 42\n  template = ERB.new &lt;&lt;-EOF\n    The value of x is: &lt;%= x %&gt;\n  EOF\n  puts template.result(binding)\n"
- !ruby/struct:SM::Flow::P 
  body: "<em>Prints:</em> The value of x is: 42"
- !ruby/struct:SM::Flow::P 
  body: More complex examples are given below.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Recognized Tags
- !ruby/struct:SM::Flow::P 
  body: "ERB recognizes certain tags in the provided template and converts them based on the rules below:"
- !ruby/struct:SM::Flow::VERB 
  body: "  &lt;% Ruby code -- inline with output %&gt;\n  &lt;%= Ruby expression -- replace with result %&gt;\n  &lt;%# comment -- ignored -- useful in testing %&gt;\n  % a line of Ruby code -- treated as &lt;% line %&gt; (optional -- see ERB.new)\n  %% replaced with % if first thing on a line and % processing is used\n  &lt;%% or %%&gt; -- replace with &lt;% or %&gt; respectively\n"
- !ruby/struct:SM::Flow::P 
  body: All other text is passed through ERB filtering unchanged.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Options
- !ruby/struct:SM::Flow::P 
  body: "There are several settings you can change when you use ERB:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: the nature of the tags that are recognized;
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: the value of <tt>$SAFE</tt> under which the template is run;
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: the binding used to resolve local variables in the template.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: See the ERB.new and ERB#result methods for more detail.
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Examples
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Plain Text
- !ruby/struct:SM::Flow::P 
  body: ERB is useful for any generic templating situation. Note that in this example, we use the convenient &quot;% at start of line&quot; tag, and we quote the template literally with <tt>%q{...}</tt> to avoid trouble with the backslash.
- !ruby/struct:SM::Flow::VERB 
  body: "  require &quot;erb&quot;\n\n  # Create template.\n  template = %q{\n    From:  James Edward Gray II &lt;james@grayproductions.net&gt;\n    To:  &lt;%= to %&gt;\n    Subject:  Addressing Needs\n\n    &lt;%= to[/\\w+/] %&gt;:\n\n    Just wanted to send a quick note assuring that your needs are being\n    addressed.\n\n    I want you to know that my team will keep working on the issues,\n    especially:\n\n    &lt;%# ignore numerous minor requests -- focus on priorities %&gt;\n    % priorities.each do |priority|\n      * &lt;%= priority %&gt;\n    % end\n\n    Thanks for your patience.\n\n    James Edward Gray II\n  }.gsub(/^  /, '')\n\n  message = ERB.new(template, 0, &quot;%&lt;&gt;&quot;)\n\n  # Set up template data.\n  to = &quot;Community Spokesman &lt;spokesman@ruby_community.org&gt;&quot;\n  priorities = [ &quot;Run Ruby Quiz&quot;,\n                 &quot;Document Modules&quot;,\n                 &quot;Answer Questions on Ruby Talk&quot; ]\n\n  # Produce result.\n  email = message.result\n  puts email\n"
- !ruby/struct:SM::Flow::P 
  body: <em>Generates:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "  From:  James Edward Gray II &lt;james@grayproductions.net&gt;\n  To:  Community Spokesman &lt;spokesman@ruby_community.org&gt;\n  Subject:  Addressing Needs\n\n  Community:\n\n  Just wanted to send a quick note assuring that your needs are being addressed.\n\n  I want you to know that my team will keep working on the issues, especially:\n\n      * Run Ruby Quiz\n      * Document Modules\n      * Answer Questions on Ruby Talk\n\n  Thanks for your patience.\n\n  James Edward Gray II\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Ruby in HTML
- !ruby/struct:SM::Flow::P 
  body: ERB is often used in <tt>.rhtml</tt> files (HTML with embedded Ruby). Notice the need in this example to provide a special binding when the template is run, so that the instance variables in the Product object can be resolved.
- !ruby/struct:SM::Flow::VERB 
  body: "  require &quot;erb&quot;\n\n  # Build template data class.\n  class Product\n    def initialize( code, name, desc, cost )\n      @code = code\n      @name = name\n      @desc = desc\n      @cost = cost\n\n      @features = [ ]\n    end\n\n    def add_feature( feature )\n      @features &lt;&lt; feature\n    end\n\n    # Support templating of member data.\n    def get_binding\n      binding\n    end\n\n    # ...\n  end\n\n  # Create template.\n  template = %{\n    &lt;html&gt;\n      &lt;head&gt;&lt;title&gt;Ruby Toys -- &lt;%= @name %&gt;&lt;/title&gt;&lt;/head&gt;\n      &lt;body&gt;\n\n        &lt;h1&gt;&lt;%= @name %&gt; (&lt;%= @code %&gt;)&lt;/h1&gt;\n        &lt;p&gt;&lt;%= @desc %&gt;&lt;/p&gt;\n\n        &lt;ul&gt;\n          &lt;% @features.each do |f| %&gt;\n            &lt;li&gt;<b>&lt;%= f %&gt;</b>&lt;/li&gt;\n          &lt;% end %&gt;\n        &lt;/ul&gt;\n\n        &lt;p&gt;\n          &lt;% if @cost &lt; 10 %&gt;\n            <b>Only &lt;%= @cost %&gt;!!!</b>\n          &lt;% else %&gt;\n             Call for a price, today!\n          &lt;% end %&gt;\n        &lt;/p&gt;\n\n      &lt;/body&gt;\n    &lt;/html&gt;\n  }.gsub(/^  /, '')\n\n  rhtml = ERB.new(template)\n\n  # Set up template data.\n  toy = Product.new( &quot;TZ-1002&quot;,\n                     &quot;Rubysapien&quot;,\n                     &quot;Geek's Best Friend!  Responds to Ruby commands...&quot;,\n                     999.95 )\n  toy.add_feature(&quot;Listens for verbal commands in the Ruby language!&quot;)\n  toy.add_feature(&quot;Ignores Perl, Java, and all C variants.&quot;)\n  toy.add_feature(&quot;Karate-Chop Action!!!&quot;)\n  toy.add_feature(&quot;Matz signature on left leg.&quot;)\n  toy.add_feature(&quot;Gem studded eyes... Rubies, of course!&quot;)\n\n  # Produce result.\n  rhtml.run(toy.get_binding)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>Generates (some blank lines removed):</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   &lt;html&gt;\n     &lt;head&gt;&lt;title&gt;Ruby Toys -- Rubysapien&lt;/title&gt;&lt;/head&gt;\n     &lt;body&gt;\n\n       &lt;h1&gt;Rubysapien (TZ-1002)&lt;/h1&gt;\n       &lt;p&gt;Geek's Best Friend!  Responds to Ruby commands...&lt;/p&gt;\n\n       &lt;ul&gt;\n           &lt;li&gt;<b>Listens for verbal commands in the Ruby language!</b>&lt;/li&gt;\n           &lt;li&gt;<b>Ignores Perl, Java, and all C variants.</b>&lt;/li&gt;\n           &lt;li&gt;<b>Karate-Chop Action!!!</b>&lt;/li&gt;\n           &lt;li&gt;<b>Matz signature on left leg.</b>&lt;/li&gt;\n           &lt;li&gt;<b>Gem studded eyes... Rubies, of course!</b>&lt;/li&gt;\n       &lt;/ul&gt;\n\n       &lt;p&gt;\n            Call for a price, today!\n       &lt;/p&gt;\n\n     &lt;/body&gt;\n   &lt;/html&gt;\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Notes
- !ruby/struct:SM::Flow::P 
  body: "There are a variety of templating solutions available in various Ruby projects:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: ERB's big brother, eRuby, works the same but is written in C for speed;
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Amrita (smart at producing HTML/XML);
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: cs/Template (written in C for speed);
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: RDoc, distributed with Ruby, uses its own template engine, which can be reused elsewhere;
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: and others; search the RAA.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: Rails, the web application framework, uses ERB to create views.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Revision
  value: "'$Date: 2009-02-24 02:44:50 +0900 (Tue, 24 Feb 2009) $'"
full_name: ERB
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: def_class
- !ruby/object:RI::MethodSummary 
  name: def_method
- !ruby/object:RI::MethodSummary 
  name: def_module
- !ruby/object:RI::MethodSummary 
  name: result
- !ruby/object:RI::MethodSummary 
  name: run
- !ruby/object:RI::MethodSummary 
  name: set_eoutvar
name: ERB
superclass: Object
PKv}[��
���"ri/1.8/system/ERB/def_class-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Define unnamed class which has <em>methodname</em> as instance method, and return it.
- !ruby/struct:SM::Flow::P 
  body: "example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  class MyClass_\n    def initialize(arg1, arg2)\n      @arg1 = arg1;  @arg2 = arg2\n    end\n  end\n  filename = 'example.rhtml'  # @arg1 and @arg2 are used in example.rhtml\n  erb = ERB.new(File.read(filename))\n  erb.filename = filename\n  MyClass = erb.def_class(MyClass_, 'render()')\n  print MyClass.new('foo', 123).render()\n"
full_name: ERB#def_class
is_singleton: false
name: def_class
params: (superklass=Object, methodname='result')
visibility: public
PKv}[����&ri/1.8/system/ERB/Util/cdesc-Util.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: A utility module for conversion routines, often handy in HTML generation.
constants: []

full_name: ERB::Util
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: h
- !ruby/object:RI::MethodSummary 
  name: html_escape
- !ruby/object:RI::MethodSummary 
  name: u
- !ruby/object:RI::MethodSummary 
  name: url_encode
name: Util
superclass: 
PKv}[���T��ri/1.8/system/ERB/Util/u-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #url_encode"
full_name: ERB::Util#u
is_singleton: false
name: u
params: (s)
visibility: public
PKv}[!X'���ri/1.8/system/ERB/Util/h-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #html_escape"
full_name: ERB::Util#h
is_singleton: false
name: h
params: (s)
visibility: public
PKv}[�zee)ri/1.8/system/ERB/Util/html_escape-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: h
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: A utility method for escaping HTML tag characters in <em>s</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "  require &quot;erb&quot;\n  include ERB::Util\n\n  puts html_escape(&quot;is a &gt; 0 &amp; a &lt; 10?&quot;)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>Generates</em>
- !ruby/struct:SM::Flow::VERB 
  body: "  is a &amp;gt; 0 &amp;amp; a &amp;lt; 10?\n"
full_name: ERB::Util#html_escape
is_singleton: false
name: html_escape
params: (s)
visibility: public
PKv}[9ύ���(ri/1.8/system/ERB/Util/url_encode-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: u
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: A utility method for encoding the String <em>s</em> as a URL.
- !ruby/struct:SM::Flow::VERB 
  body: "  require &quot;erb&quot;\n  include ERB::Util\n\n  puts url_encode(&quot;Programming Ruby:  The Pragmatic Programmer's Guide&quot;)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>Generates</em>
- !ruby/struct:SM::Flow::VERB 
  body: "  Programming%20Ruby%3A%20%20The%20Pragmatic%20Programmer%27s%20Guide\n"
full_name: ERB::Util#url_encode
is_singleton: false
name: url_encode
params: (s)
visibility: public
PKv}[�\׋vv#ri/1.8/system/ERB/def_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Define <em>methodname</em> as instance method of <em>mod</em> from compiled ruby source.
- !ruby/struct:SM::Flow::P 
  body: "example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  filename = 'example.rhtml'   # 'arg1' and 'arg2' are used in example.rhtml\n  erb = ERB.new(File.read(filename))\n  erb.def_method(MyClass, 'render(arg1, arg2)', filename)\n  print MyClass.new.render('foo', 123)\n"
full_name: ERB#def_method
is_singleton: false
name: def_method
params: (mod, methodname, fname='(ERB)')
visibility: public
PKw}[�HɌ�
�
ri/1.8/system/ERB/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Constructs a new ERB object with the template specified in <em>str</em>.
- !ruby/struct:SM::Flow::P 
  body: An ERB object works by building a chunk of Ruby code that will output the completed template when run. If <em>safe_level</em> is set to a non-nil value, ERB code will be run in a separate thread with <b>$SAFE</b> set to the provided level.
- !ruby/struct:SM::Flow::P 
  body: "If <em>trim_mode</em> is passed a String containing one or more of the following modifiers, ERB will adjust its code generation as listed:"
- !ruby/struct:SM::Flow::VERB 
  body: "    %  enables Ruby code processing for lines beginning with %\n    &lt;&gt; omit newline for lines starting with &lt;% and ending in %&gt;\n    &gt;  omit newline for lines ending in %&gt;\n"
- !ruby/struct:SM::Flow::P 
  body: <em>eoutvar</em> can be used to set the name of the variable ERB will build up its output in. This is useful when you need to run multiple ERB templates through the same binding and/or when you want to control where output ends up. Pass the name of the variable to be used inside a String.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: " require &quot;erb&quot;\n\n # build data class\n class Listings\n   PRODUCT = { :name =&gt; &quot;Chicken Fried Steak&quot;,\n               :desc =&gt; &quot;A well messages pattie, breaded and fried.&quot;,\n               :cost =&gt; 9.95 }\n\n   attr_reader :product, :price\n\n   def initialize( product = &quot;&quot;, price = &quot;&quot; )\n     @product = product\n     @price = price\n   end\n\n   def build\n     b = binding\n     # create and run templates, filling member data variables\n     ERB.new(&lt;&lt;-'END_PRODUCT'.gsub(/^\\s+/, &quot;&quot;), 0, &quot;&quot;, &quot;@product&quot;).result b\n       &lt;%= PRODUCT[:name] %&gt;\n       &lt;%= PRODUCT[:desc] %&gt;\n     END_PRODUCT\n     ERB.new(&lt;&lt;-'END_PRICE'.gsub(/^\\s+/, &quot;&quot;), 0, &quot;&quot;, &quot;@price&quot;).result b\n       &lt;%= PRODUCT[:name] %&gt; -- &lt;%= PRODUCT[:cost] %&gt;\n       &lt;%= PRODUCT[:desc] %&gt;\n     END_PRICE\n   end\n end\n\n # setup template data\n listings = Listings.new\n listings.build\n\n puts listings.product + &quot;\\n&quot; + listings.price\n"
- !ruby/struct:SM::Flow::P 
  body: <em>Generates</em>
- !ruby/struct:SM::Flow::VERB 
  body: " Chicken Fried Steak\n A well messages pattie, breaded and fried.\n\n Chicken Fried Steak -- 9.95\n A well messages pattie, breaded and fried.\n"
full_name: ERB::new
is_singleton: true
name: new
params: (str, safe_level=nil, trim_mode=nil, eoutvar='_erbout')
visibility: public
PKw}[K'b��#ri/1.8/system/ERB/def_module-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create unnamed module, define <em>methodname</em> as instance method of it, and return it.
- !ruby/struct:SM::Flow::P 
  body: "example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  filename = 'example.rhtml'   # 'arg1' and 'arg2' are used in example.rhtml\n  erb = ERB.new(File.read(filename))\n  erb.filename = filename\n  MyModule = erb.def_module('render(arg1, arg2)')\n  class MyClass\n    include MyModule\n  end\n"
full_name: ERB#def_module
is_singleton: false
name: def_module
params: (methodname='erb')
visibility: public
PKw}[Z���0ri/1.8/system/ERB/DefMethod/cdesc-DefMethod.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Utility module to define eRuby script as instance method.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::P 
  body: "example.rhtml:"
- !ruby/struct:SM::Flow::VERB 
  body: "  &lt;% for item in @items %&gt;\n  <b>&lt;%= item %&gt;</b>\n  &lt;% end %&gt;\n"
- !ruby/struct:SM::Flow::P 
  body: "example.rb:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'erb'\n  class MyClass\n    extend ERB::DefMethod\n    def_erb_method('render()', 'example.rhtml')\n    def initialize(items)\n      @items = items\n    end\n  end\n  print MyClass.new([10,20,30]).render()\n"
- !ruby/struct:SM::Flow::P 
  body: "result:"
- !ruby/struct:SM::Flow::VERB 
  body: "  <b>10</b>\n\n  <b>20</b>\n\n  <b>30</b>\n"
constants: []

full_name: ERB::DefMethod
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: def_erb_method
name: DefMethod
superclass: 
PKw}[�ݸ�ZZ1ri/1.8/system/ERB/DefMethod/def_erb_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: define <em>methodname</em> as instance method of current module, using ERB object or eRuby file
full_name: ERB::DefMethod#def_erb_method
is_singleton: false
name: def_erb_method
params: (methodname, erb_or_fname)
visibility: public
PKw}[��Mp�� ri/1.8/system/ERB/version-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns revision information for the erb.rb module.
full_name: ERB::version
is_singleton: true
name: version
params: ()
visibility: public
PKw}[�W]���.ri/1.8/system/ERB/Compiler/cdesc-Compiler.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: ERB::Compiler
includes: []

instance_methods: []

name: Compiler
superclass: Object
PKw}[�"f���5ri/1.8/system/ERB/Compiler/Scanner/cdesc-Scanner.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: ERB::Compiler::Scanner
includes: []

instance_methods: []

name: Scanner
superclass: Object
PKw}[ȯk��Eri/1.8/system/ERB/Compiler/ExplicitScanner/cdesc-ExplicitScanner.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: ERB::Compiler::ExplicitScanner
includes: []

instance_methods: []

name: ExplicitScanner
superclass: Scanner
PKw}[w��)��3ri/1.8/system/ERB/Compiler/Buffer/cdesc-Buffer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: ERB::Compiler::Buffer
includes: []

instance_methods: []

name: Buffer
superclass: Object
PKw}[cz?���=ri/1.8/system/ERB/Compiler/PercentLine/cdesc-PercentLine.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: ERB::Compiler::PercentLine
includes: []

instance_methods: []

name: PercentLine
superclass: Object
PKw}[.�3��Cri/1.8/system/ERB/Compiler/SimpleScanner2/cdesc-SimpleScanner2.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: ERB::Compiler::SimpleScanner2
includes: []

instance_methods: []

name: SimpleScanner2
superclass: Scanner
PKw}[e�����=ri/1.8/system/ERB/Compiler/TrimScanner/cdesc-TrimScanner.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: ERB::Compiler::TrimScanner
includes: []

instance_methods: []

name: TrimScanner
superclass: Scanner
PKw}[�ˡ���Ari/1.8/system/ERB/Compiler/SimpleScanner/cdesc-SimpleScanner.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: ERB::Compiler::SimpleScanner
includes: []

instance_methods: []

name: SimpleScanner
superclass: Scanner
PKw}[N�1ri/1.8/system/ERB/run-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Generate results and print them. (see ERB#result)
full_name: ERB#run
is_singleton: false
name: run
params: (b=TOPLEVEL_BINDING)
visibility: public
PKw}[��b��,ri/1.8/system/Module/const_defined%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if a constant with the given name is defined by <em>mod</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   Math.const_defined? &quot;PI&quot;   #=&gt; true\n"
full_name: Module#const_defined?
is_singleton: false
name: const_defined?
params: |
  mod.const_defined?(sym)   => true or false

visibility: public
PKw}[+{SOO+ri/1.8/system/Module/instance_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an <tt>UnboundMethod</tt> representing the given instance method in <em>mod</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Interpreter\n     def do_a() print &quot;there, &quot;; end\n     def do_d() print &quot;Hello &quot;;  end\n     def do_e() print &quot;!\\n&quot;;     end\n     def do_v() print &quot;Dave&quot;;    end\n     Dispatcher = {\n      ?a =&gt; instance_method(:do_a),\n      ?d =&gt; instance_method(:do_d),\n      ?e =&gt; instance_method(:do_e),\n      ?v =&gt; instance_method(:do_v)\n     }\n     def interpret(string)\n       string.each_byte {|b| Dispatcher[b].bind(self).call }\n     end\n   end\n\n   interpreter = Interpreter.new\n   interpreter.interpret('dave')\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Hello there, Dave!\n"
full_name: Module#instance_method
is_singleton: false
name: instance_method
params: |
  mod.instance_method(symbol)   => unbound_method

visibility: public
PKw}[���z��+ri/1.8/system/Module/module_function-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates module functions for the named methods. These functions may be called with the module as a receiver, and also become available as instance methods to classes that mix in the module. Module functions are copies of the original, and so may be changed independently. The instance-method versions are made private. If used with no arguments, subsequently defined methods become module functions.
- !ruby/struct:SM::Flow::VERB 
  body: "   module Mod\n     def one\n       &quot;This is one&quot;\n     end\n     module_function :one\n   end\n   class Cls\n     include Mod\n     def callOne\n       one\n     end\n   end\n   Mod.one     #=&gt; &quot;This is one&quot;\n   c = Cls.new\n   c.callOne   #=&gt; &quot;This is one&quot;\n   module Mod\n     def one\n       &quot;This is the new one&quot;\n     end\n   end\n   Mod.one     #=&gt; &quot;This is one&quot;\n   c.callOne   #=&gt; &quot;This is the new one&quot;\n"
full_name: Module#module_function
is_singleton: false
name: module_function
params: |
  module_function(symbol, ...)    => self

visibility: public
PKw}[������*ri/1.8/system/Module/method_removed-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Not documented
full_name: Module#method_removed
is_singleton: false
name: method_removed
params: (p1)
visibility: public
PKw}[��.���$ri/1.8/system/Module/extended-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Not documented
full_name: Module#extended
is_singleton: false
name: extended
params: (p1)
visibility: public
PKw}[t�0775ri/1.8/system/Module/class_variable_defined%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the given class variable is defined in <em>obj</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Fred\n     @@foo = 99\n   end\n   Fred.class_variable_defined?(:@@foo)    #=&gt; true\n   Fred.class_variable_defined?(:@@bar)    #=&gt; false\n"
full_name: Module#class_variable_defined?
is_singleton: false
name: class_variable_defined?
params: |
  obj.class_variable_defined?(symbol)    => true or false

visibility: public
PKw}[i[���(ri/1.8/system/Module/remove_const-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes the definition of the given constant, returning that constant's value. Predefined classes and singleton objects (such as <em>true</em>) cannot be removed.
full_name: Module#remove_const
is_singleton: false
name: remove_const
params: |
  remove_const(sym)   => obj

visibility: public
PKw}[mѺqQQ$ri/1.8/system/Module/autoload-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Registers <em>filename</em> to be loaded (using <tt>Kernel::require</tt>) the first time that <em>name</em> (which may be a <tt>String</tt> or a symbol) is accessed in the namespace of <em>mod</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   module A\n   end\n   A.autoload(:B, &quot;b&quot;)\n   A::B.doit            # autoloads &quot;b&quot;\n"
full_name: Module#autoload
is_singleton: false
name: autoload
params: |
  mod.autoload(name, filename)   => nil

visibility: public
PKw}[�Ug%ri/1.8/system/Module/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Comparison---Returns -1 if <em>mod</em> includes <em>other_mod</em>, 0 if <em>mod</em> is the same as <em>other_mod</em>, and +1 if <em>mod</em> is included by <em>other_mod</em> or if <em>mod</em> has no relationship with <em>other_mod</em>. Returns <tt>nil</tt> if <em>other_mod</em> is not a module.
full_name: Module#<=>
is_singleton: false
name: <=>
params: |
  mod <=> other_mod   => -1, 0, +1, or nil

visibility: public
PKw}[���'ri/1.8/system/Module/module_eval-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Evaluates the string or block in the context of <em>mod</em>. This can be used to add methods to a class. <tt>module_eval</tt> returns the result of evaluating its argument. The optional <em>filename</em> and <em>lineno</em> parameters set the text for error messages.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Thing\n   end\n   a = %q{def hello() &quot;Hello there!&quot; end}\n   Thing.module_eval(a)\n   puts Thing.new.hello()\n   Thing.module_eval(&quot;invalid code&quot;, &quot;dummy&quot;, 123)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Hello there!\n   dummy:123:in `module_eval': undefined local variable\n       or method `code' for Thing:Class\n"
full_name: Module#module_eval
is_singleton: false
name: module_eval
params: |
  mod.class_eval(string [, filename [, lineno]])  => obj
  mod.module_eval {|| block }                     => obj

visibility: public
PKw}[yDD/ri/1.8/system/Module/public_class_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Makes a list of existing class methods public.
full_name: Module#public_class_method
is_singleton: false
name: public_class_method
params: |
  mod.public_class_method(symbol, ...)    => mod

visibility: public
PKw}[���;��&ri/1.8/system/Module/class_exec-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Evaluates the given block in the context of the class/module. The method defined in the block will belong to the receiver.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Thing\n   end\n   Thing.class_exec{\n     def hello() &quot;Hello there!&quot; end\n   }\n   puts Thing.new.hello()\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Hello there!\n"
full_name: Module#class_exec
is_singleton: false
name: class_exec
params: |
  mod.module_exec(arg...) {|var...| block }       => obj
  mod.class_exec(arg...) {|var...| block }        => obj

visibility: public
PKw}[��p'ri/1.8/system/Module/autoload%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <em>filename</em> to be loaded if <em>name</em> is registered as <tt>autoload</tt> in the namespace of <em>mod</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   module A\n   end\n   A.autoload(:B, &quot;b&quot;)\n   A.autoload?(:B)            # =&gt; &quot;b&quot;\n"
full_name: Module#autoload?
is_singleton: false
name: autoload?
params: |
  mod.autoload?(name)   => String or nil

visibility: public
PKw}[�����%ri/1.8/system/Module/protected-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: With no arguments, sets the default visibility for subsequently defined methods to protected. With arguments, sets the named methods to have protected visibility.
full_name: Module#protected
is_singleton: false
name: protected
params: |
  protected                => self
  protected(symbol, ...)   => self

visibility: public
PKw}[9[\\'ri/1.8/system/Module/attr_writer-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates an accessor method to allow assignment to the attribute <em>aSymbol</em><tt>.id2name</tt>.
full_name: Module#attr_writer
is_singleton: false
name: attr_writer
params: |
  attr_writer(symbol, ...)    => nil

visibility: public
PKx}[�$ʄ�%ri/1.8/system/Module/const_get-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the value of the named constant in <em>mod</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   Math.const_get(:PI)   #=&gt; 3.14159265358979\n"
full_name: Module#const_get
is_singleton: false
name: const_get
params: |
  mod.const_get(sym)    => obj

visibility: public
PKx}[�BE.��ri/1.8/system/Module/%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns true if <em>mod</em> is a subclass of <em>other</em>. Returns <tt>nil</tt> if there's no relationship between the two. (Think of the relationship in terms of the class definition: &quot;class A&lt;B&quot; implies &quot;A&lt;B&quot;)."
full_name: Module#<
is_singleton: false
name: <
params: |
  mod < other   =>  true, false, or nil

visibility: public
PKx}[.�"ri/1.8/system/Module/%3c%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns true if <em>mod</em> is a subclass of <em>other</em> or is the same as <em>other</em>. Returns <tt>nil</tt> if there's no relationship between the two. (Think of the relationship in terms of the class definition: &quot;class A&lt;B&quot; implies &quot;A&lt;B&quot;)."
full_name: Module#<=
is_singleton: false
name: <=
params: |
  mod <= other   =>  true, false, or nil

visibility: public
PKx}[t:"��7ri/1.8/system/Module/protected_method_defined%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named protected method is defined by <em>mod</em> (or its included modules and, if <em>mod</em> is a class, its ancestors).
- !ruby/struct:SM::Flow::VERB 
  body: "   module A\n     def method1()  end\n   end\n   class B\n     protected\n     def method2()  end\n   end\n   class C &lt; B\n     include A\n     def method3()  end\n   end\n\n   A.method_defined? :method1              #=&gt; true\n   C.protected_method_defined? &quot;method1&quot;   #=&gt; false\n   C.protected_method_defined? &quot;method2&quot;   #=&gt; true\n   C.method_defined? &quot;method2&quot;             #=&gt; true\n"
full_name: Module#protected_method_defined?
is_singleton: false
name: protected_method_defined?
params: |
  mod.protected_method_defined?(symbol)   => true or false

visibility: public
PKx}[�D1"ri/1.8/system/Module/%3e%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns true if <em>mod</em> is an ancestor of <em>other</em>, or the two modules are the same. Returns <tt>nil</tt> if there's no relationship between the two. (Think of the relationship in terms of the class definition: &quot;class A&lt;B&quot; implies &quot;B&gt;A&quot;)."
full_name: Module#>=
is_singleton: false
name: ">="
params: |
  mod >= other   =>  true, false, or nil

visibility: public
PKx}[���OO%ri/1.8/system/Module/const_set-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the named constant to the given object, returning that object. Creates a new constant if no constant with the given name previously existed.
- !ruby/struct:SM::Flow::VERB 
  body: "   Math.const_set(&quot;HIGH_SCHOOL_PI&quot;, 22.0/7.0)   #=&gt; 3.14285714285714\n   Math::HIGH_SCHOOL_PI - Math::PI              #=&gt; 0.00126448926734968\n"
full_name: Module#const_set
is_singleton: false
name: const_set
params: |
  mod.const_set(sym, obj)    => obj

visibility: public
PKx}[�Ql�ss+ri/1.8/system/Module/append_features-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: When this module is included in another, Ruby calls <tt>append_features</tt> in this module, passing it the receiving module in <em>mod</em>. Ruby's default implementation is to add the constants, methods, and module variables of this module to <em>mod</em> if this module has not already been added to <em>mod</em> or one of its ancestors. See also <tt>Module#include</tt>.
full_name: Module#append_features
is_singleton: false
name: append_features
params: |
  append_features(mod)   => mod

visibility: public
PKx}[������(ri/1.8/system/Module/method_added-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Not documented
full_name: Module#method_added
is_singleton: false
name: method_added
params: (p1)
visibility: public
PKx}[�]����(ri/1.8/system/Module/alias_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Makes <em>new_name</em> a new copy of the method <em>old_name</em>. This can be used to retain access to methods that are overridden.
- !ruby/struct:SM::Flow::VERB 
  body: "   module Mod\n     alias_method :orig_exit, :exit\n     def exit(code=0)\n       puts &quot;Exiting with code #{code}&quot;\n       orig_exit(code)\n     end\n   end\n   include Mod\n   exit(99)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Exiting with code 99\n"
full_name: Module#alias_method
is_singleton: false
name: alias_method
params: |
  alias_method(new_name, old_name)   => self

visibility: public
PKx}[��F>��%ri/1.8/system/Module/constants-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array of the names of all constants defined in the system. This list includes the names of all modules and classes.
- !ruby/struct:SM::Flow::VERB 
  body: "   p Module.constants.sort[1..5]\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   [&quot;ARGV&quot;, &quot;ArgumentError&quot;, &quot;Array&quot;, &quot;Bignum&quot;, &quot;Binding&quot;]\n"
full_name: Module::constants
is_singleton: true
name: constants
params: |
  Module.constants   => array

visibility: public
PKx}[�j��5ri/1.8/system/Module/private_method_defined%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named private method is defined by _ mod_ (or its included modules and, if <em>mod</em> is a class, its ancestors).
- !ruby/struct:SM::Flow::VERB 
  body: "   module A\n     def method1()  end\n   end\n   class B\n     private\n     def method2()  end\n   end\n   class C &lt; B\n     include A\n     def method3()  end\n   end\n\n   A.method_defined? :method1            #=&gt; true\n   C.private_method_defined? &quot;method1&quot;   #=&gt; false\n   C.private_method_defined? &quot;method2&quot;   #=&gt; true\n   C.method_defined? &quot;method2&quot;           #=&gt; false\n"
full_name: Module#private_method_defined?
is_singleton: false
name: private_method_defined?
params: |
  mod.private_method_defined?(symbol)    => true or false

visibility: public
PKx}[�gmm0ri/1.8/system/Module/private_class_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Makes existing class methods private. Often used to hide the default constructor <tt>new</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   class SimpleSingleton  # Not thread safe\n     private_class_method :new\n     def SimpleSingleton.create(*args, &amp;block)\n       @me = new(*args, &amp;block) if ! @me\n       @me\n     end\n   end\n"
full_name: Module#private_class_method
is_singleton: false
name: private_class_method
params: |
  mod.private_class_method(symbol, ...)   => mod

visibility: public
PKx}[���mAA&ri/1.8/system/Module/include%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>module</em> is included in <em>mod</em> or one of <em>mod</em>'s ancestors.
- !ruby/struct:SM::Flow::VERB 
  body: "   module A\n   end\n   class B\n     include A\n   end\n   class C &lt; B\n   end\n   B.include?(A)   #=&gt; true\n   C.include?(A)   #=&gt; true\n   A.include?(A)   #=&gt; false\n"
full_name: Module#include?
is_singleton: false
name: include?
params: |
  mod.include?(module)    => true or false

visibility: public
PKx}[�O�ri/1.8/system/Module/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new anonymous module. If a block is given, it is passed the module object, and the block is evaluated in the context of this module using <tt>module_eval</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   Fred = Module.new do\n     def meth1\n       &quot;hello&quot;\n     end\n     def meth2\n       &quot;bye&quot;\n     end\n   end\n   a = &quot;my string&quot;\n   a.extend(Fred)   #=&gt; &quot;my string&quot;\n   a.meth1          #=&gt; &quot;hello&quot;\n   a.meth2          #=&gt; &quot;bye&quot;\n"
full_name: Module::new
is_singleton: true
name: new
params: |
  Module.new                  => mod
  Module.new {|mod| block }   => mod

visibility: public
PKx}[�<���'ri/1.8/system/Module/module_exec-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Evaluates the given block in the context of the class/module. The method defined in the block will belong to the receiver.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Thing\n   end\n   Thing.class_exec{\n     def hello() &quot;Hello there!&quot; end\n   }\n   puts Thing.new.hello()\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Hello there!\n"
full_name: Module#module_exec
is_singleton: false
name: module_exec
params: |
  mod.module_exec(arg...) {|var...| block }       => obj
  mod.class_exec(arg...) {|var...| block }        => obj

visibility: public
PKx}[�D%��4ri/1.8/system/Module/public_method_defined%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named public method is defined by <em>mod</em> (or its included modules and, if <em>mod</em> is a class, its ancestors).
- !ruby/struct:SM::Flow::VERB 
  body: "   module A\n     def method1()  end\n   end\n   class B\n     protected\n     def method2()  end\n   end\n   class C &lt; B\n     include A\n     def method3()  end\n   end\n\n   A.method_defined? :method1           #=&gt; true\n   C.public_method_defined? &quot;method1&quot;   #=&gt; true\n   C.public_method_defined? &quot;method2&quot;   #=&gt; false\n   C.method_defined? &quot;method2&quot;          #=&gt; true\n"
full_name: Module#public_method_defined?
is_singleton: false
name: public_method_defined?
params: |
  mod.public_method_defined?(symbol)   => true or false

visibility: public
PKx}[�W�r��%ri/1.8/system/Module/%3d%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Case Equality---Returns <tt>true</tt> if <em>anObject</em> is an instance of <em>mod</em> or one of <em>mod</em>'s descendents. Of limited use for modules, but can be used in <tt>case</tt> statements to classify objects by class.
full_name: Module#===
is_singleton: false
name: ===
params: |
  mod === obj    => true or false

visibility: public
PKx}[3a�oo1ri/1.8/system/Module/remove_class_variable-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes the definition of the <em>sym</em>, returning that constant's value.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Dummy\n     @@var = 99\n     puts @@var\n     remove_class_variable(:@@var)\n     puts(defined? @@var)\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   99\n   nil\n"
full_name: Module#remove_class_variable
is_singleton: false
name: remove_class_variable
params: |
  remove_class_variable(sym)    => obj

visibility: public
PKx}[���ouu)ri/1.8/system/Module/remove_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes the method identified by <em>symbol</em> from the current class. For an example, see <tt>Module.undef_method</tt>.
full_name: Module#remove_method
is_singleton: false
name: remove_method
params: |
  remove_method(symbol)   => self

visibility: public
PKx}[�Y�^��3ri/1.8/system/Module/public_instance_methods-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a list of the public instance methods defined in <em>mod</em>. If the optional parameter is not <tt>false</tt>, the methods of any ancestors are included.
full_name: Module#public_instance_methods
is_singleton: false
name: public_instance_methods
params: |
  mod.public_instance_methods(include_super=true)   => array

visibility: public
PKx}[%Fn���&ri/1.8/system/Module/cdesc-Module.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: constants
- !ruby/object:RI::MethodSummary 
  name: nesting
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A <tt>Module</tt> is a collection of methods and constants. The methods in a module may be instance methods or module methods. Instance methods appear as methods in a class when the module is included, module methods do not. Conversely, module methods may be called without creating an encapsulating object, while instance methods may not. (See <tt>Module#module_function</tt>)
- !ruby/struct:SM::Flow::P 
  body: In the descriptions that follow, the parameter <em>syml</em> refers to a symbol, which is either a quoted string or a <tt>Symbol</tt> (such as <tt>:name</tt>).
- !ruby/struct:SM::Flow::VERB 
  body: "   module Mod\n     include Math\n     CONST = 1\n     def meth\n       #  ...\n     end\n   end\n   Mod.class              #=&gt; Module\n   Mod.constants          #=&gt; [&quot;E&quot;, &quot;PI&quot;, &quot;CONST&quot;]\n   Mod.instance_methods   #=&gt; [&quot;meth&quot;]\n"
constants: []

full_name: Module
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: <
- !ruby/object:RI::MethodSummary 
  name: <=
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: ===
- !ruby/object:RI::MethodSummary 
  name: ">"
- !ruby/object:RI::MethodSummary 
  name: ">="
- !ruby/object:RI::MethodSummary 
  name: alias_method
- !ruby/object:RI::MethodSummary 
  name: ancestors
- !ruby/object:RI::MethodSummary 
  name: append_features
- !ruby/object:RI::MethodSummary 
  name: attr
- !ruby/object:RI::MethodSummary 
  name: attr_accessor
- !ruby/object:RI::MethodSummary 
  name: attr_reader
- !ruby/object:RI::MethodSummary 
  name: attr_writer
- !ruby/object:RI::MethodSummary 
  name: autoload
- !ruby/object:RI::MethodSummary 
  name: autoload?
- !ruby/object:RI::MethodSummary 
  name: class_eval
- !ruby/object:RI::MethodSummary 
  name: class_exec
- !ruby/object:RI::MethodSummary 
  name: class_variable_defined?
- !ruby/object:RI::MethodSummary 
  name: class_variable_get
- !ruby/object:RI::MethodSummary 
  name: class_variable_set
- !ruby/object:RI::MethodSummary 
  name: class_variables
- !ruby/object:RI::MethodSummary 
  name: const_defined?
- !ruby/object:RI::MethodSummary 
  name: const_get
- !ruby/object:RI::MethodSummary 
  name: const_missing
- !ruby/object:RI::MethodSummary 
  name: const_set
- !ruby/object:RI::MethodSummary 
  name: constants
- !ruby/object:RI::MethodSummary 
  name: define_method
- !ruby/object:RI::MethodSummary 
  name: extend_object
- !ruby/object:RI::MethodSummary 
  name: extended
- !ruby/object:RI::MethodSummary 
  name: freeze
- !ruby/object:RI::MethodSummary 
  name: include
- !ruby/object:RI::MethodSummary 
  name: include?
- !ruby/object:RI::MethodSummary 
  name: included
- !ruby/object:RI::MethodSummary 
  name: included_modules
- !ruby/object:RI::MethodSummary 
  name: instance_method
- !ruby/object:RI::MethodSummary 
  name: instance_methods
- !ruby/object:RI::MethodSummary 
  name: method_added
- !ruby/object:RI::MethodSummary 
  name: method_defined?
- !ruby/object:RI::MethodSummary 
  name: method_removed
- !ruby/object:RI::MethodSummary 
  name: method_undefined
- !ruby/object:RI::MethodSummary 
  name: module_eval
- !ruby/object:RI::MethodSummary 
  name: module_exec
- !ruby/object:RI::MethodSummary 
  name: module_function
- !ruby/object:RI::MethodSummary 
  name: name
- !ruby/object:RI::MethodSummary 
  name: private
- !ruby/object:RI::MethodSummary 
  name: private_class_method
- !ruby/object:RI::MethodSummary 
  name: private_instance_methods
- !ruby/object:RI::MethodSummary 
  name: private_method_defined?
- !ruby/object:RI::MethodSummary 
  name: protected
- !ruby/object:RI::MethodSummary 
  name: protected_instance_methods
- !ruby/object:RI::MethodSummary 
  name: protected_method_defined?
- !ruby/object:RI::MethodSummary 
  name: public
- !ruby/object:RI::MethodSummary 
  name: public_class_method
- !ruby/object:RI::MethodSummary 
  name: public_instance_methods
- !ruby/object:RI::MethodSummary 
  name: public_method_defined?
- !ruby/object:RI::MethodSummary 
  name: remove_class_variable
- !ruby/object:RI::MethodSummary 
  name: remove_const
- !ruby/object:RI::MethodSummary 
  name: remove_method
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: undef_method
name: Module
superclass: 
PKx}[�kxg��4ri/1.8/system/Module/private_instance_methods-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a list of the private instance methods defined in <em>mod</em>. If the optional parameter is not <tt>false</tt>, the methods of any ancestors are included.
- !ruby/struct:SM::Flow::VERB 
  body: "   module Mod\n     def method1()  end\n     private :method1\n     def method2()  end\n   end\n   Mod.instance_methods           #=&gt; [&quot;method2&quot;]\n   Mod.private_instance_methods   #=&gt; [&quot;method1&quot;]\n"
full_name: Module#private_instance_methods
is_singleton: false
name: private_instance_methods
params: |
  mod.private_instance_methods(include_super=true)    => array

visibility: public
PKx}[�W�ee.ri/1.8/system/Module/class_variable_set-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Sets the class variable names by <em>symbol</em> to <em>object</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Fred\n     @@foo = 99\n     def foo\n       @@foo\n     end\n   end\n\n   def Fred.foo\n     class_variable_set(:@@foo, 101)      #=&gt; 101\n   end\n   Fred.foo\n   Fred.new.foo                             #=&gt; 101\n"
full_name: Module#class_variable_set
is_singleton: false
name: class_variable_set
params: |
  obj.class_variable_set(symbol, obj)    => obj

visibility: public
PKx}[�\���#ri/1.8/system/Module/private-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: With no arguments, sets the default visibility for subsequently defined methods to private. With arguments, sets the named methods to have private visibility.
- !ruby/struct:SM::Flow::VERB 
  body: "   module Mod\n     def a()  end\n     def b()  end\n     private\n     def c()  end\n     private :a\n   end\n   Mod.private_instance_methods   #=&gt; [&quot;a&quot;, &quot;c&quot;]\n"
full_name: Module#private
is_singleton: false
name: private
params: |
  private                 => self
  private(symbol, ...)    => self

visibility: public
PKx}[zޞ{��%ri/1.8/system/Module/constants-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array of the names of the constants accessible in <em>mod</em>. This includes the names of constants in any included modules (example at start of section).
full_name: Module#constants
is_singleton: false
name: constants
params: |
  mod.constants    => array

visibility: public
PKx}[�u\]] ri/1.8/system/Module/attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Defines a named attribute for this module, where the name is <em>symbol.</em><tt>id2name</tt>, creating an instance variable (<tt>@name</tt>) and a corresponding access method to read it. If the optional <em>writable</em> argument is <tt>true</tt>, also creates a method called <tt>name=</tt> to set the attribute.
- !ruby/struct:SM::Flow::VERB 
  body: "   module Mod\n     attr  :size, true\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: <em>is equivalent to:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   module Mod\n     def size\n       @size\n     end\n     def size=(val)\n       @size = val\n     end\n   end\n"
full_name: Module#attr
is_singleton: false
name: attr
params: |
  attr(symbol, writable=false)    => nil

visibility: public
PKx}[N��Y&ri/1.8/system/Module/class_eval-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Evaluates the string or block in the context of <em>mod</em>. This can be used to add methods to a class. <tt>module_eval</tt> returns the result of evaluating its argument. The optional <em>filename</em> and <em>lineno</em> parameters set the text for error messages.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Thing\n   end\n   a = %q{def hello() &quot;Hello there!&quot; end}\n   Thing.module_eval(a)\n   puts Thing.new.hello()\n   Thing.module_eval(&quot;invalid code&quot;, &quot;dummy&quot;, 123)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Hello there!\n   dummy:123:in `module_eval': undefined local variable\n       or method `code' for Thing:Class\n"
full_name: Module#class_eval
is_singleton: false
name: class_eval
params: |
  mod.class_eval(string [, filename [, lineno]])  => obj
  mod.module_eval {|| block }                     => obj

visibility: public
PKx}[Wk�55)ri/1.8/system/Module/attr_accessor-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equivalent to calling ``<tt>attr</tt><em>symbol</em><tt>, true</tt>'' on each <em>symbol</em> in turn.
- !ruby/struct:SM::Flow::VERB 
  body: "   module Mod\n     attr_accessor(:one, :two)\n   end\n   Mod.instance_methods.sort   #=&gt; [&quot;one&quot;, &quot;one=&quot;, &quot;two&quot;, &quot;two=&quot;]\n"
full_name: Module#attr_accessor
is_singleton: false
name: attr_accessor
params: |
  attr_accessor(symbol, ...)    => nil

visibility: public
PKx}[(�[GG,ri/1.8/system/Module/instance_methods-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array containing the names of public instance methods in the receiver. For a module, these are the public methods; for a class, they are the instance (not singleton) methods. With no argument, or with an argument that is <tt>false</tt>, the instance methods in <em>mod</em> are returned, otherwise the methods in <em>mod</em> and <em>mod</em>'s superclasses are returned.
- !ruby/struct:SM::Flow::VERB 
  body: "   module A\n     def method1()  end\n   end\n   class B\n     def method2()  end\n   end\n   class C &lt; B\n     def method3()  end\n   end\n\n   A.instance_methods                #=&gt; [&quot;method1&quot;]\n   B.instance_methods(false)         #=&gt; [&quot;method2&quot;]\n   C.instance_methods(false)         #=&gt; [&quot;method3&quot;]\n   C.instance_methods(true).length   #=&gt; 43\n"
full_name: Module#instance_methods
is_singleton: false
name: instance_methods
params: |
  mod.instance_methods(include_super=true)   => array

visibility: public
PKx}[JA.�"ri/1.8/system/Module/freeze-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Prevents further modifications to <em>mod</em>.
full_name: Module#freeze
is_singleton: false
name: freeze
params: |
  mod.freeze

visibility: public
PKx}[�ê$��"ri/1.8/system/Module/public-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: With no arguments, sets the default visibility for subsequently defined methods to public. With arguments, sets the named methods to have public visibility.
full_name: Module#public
is_singleton: false
name: public
params: |
  public                 => self
  public(symbol, ...)    => self

visibility: public
PKx}[�P���(ri/1.8/system/Module/undef_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Prevents the current class from responding to calls to the named method. Contrast this with <tt>remove_method</tt>, which deletes the method from the particular class; Ruby will still search superclasses and mixed-in modules for a possible receiver.
- !ruby/struct:SM::Flow::VERB 
  body: "   class Parent\n     def hello\n       puts &quot;In parent&quot;\n     end\n   end\n   class Child &lt; Parent\n     def hello\n       puts &quot;In child&quot;\n     end\n   end\n\n   c = Child.new\n   c.hello\n\n   class Child\n     remove_method :hello  # remove from child, still in parent\n   end\n   c.hello\n\n   class Child\n     undef_method :hello   # prevent any calls to 'hello'\n   end\n   c.hello\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   In child\n   In parent\n   prog.rb:23: undefined method `hello' for #&lt;Child:0x401b3bb4&gt; (NoMethodError)\n"
full_name: Module#undef_method
is_singleton: false
name: undef_method
params: |
  undef_method(symbol)    => self

visibility: public
PKx}[R@�*�� ri/1.8/system/Module/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a string representing this module or class. For basic classes and modules, this is the name. For singletons, we show information on the thing we're attached to as well.
full_name: Module#to_s
is_singleton: false
name: to_s
params: |
  mod.to_s   => string

visibility: public
PKx}[8o��ri/1.8/system/Module/%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns true if <em>mod</em> is an ancestor of <em>other</em>. Returns <tt>nil</tt> if there's no relationship between the two. (Think of the relationship in terms of the class definition: &quot;class A&lt;B&quot; implies &quot;B&gt;A&quot;)."
full_name: Module#>
is_singleton: false
name: ">"
params: |
  mod > other   =>  true, false, or nil

visibility: public
PKx}[Ҙ�`LL"ri/1.8/system/Module/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Equality---At the <tt>Object</tt> level, <tt>==</tt> returns <tt>true</tt> only if <em>obj</em> and <em>other</em> are the same object. Typically, this method is overridden in descendent classes to provide class-specific meaning.
- !ruby/struct:SM::Flow::P 
  body: "Unlike <tt>==</tt>, the <tt>equal?</tt> method should never be overridden by subclasses: it is used to determine object identity (that is, <tt>a.equal?(b)</tt> iff <tt>a</tt> is the same object as <tt>b</tt>)."
- !ruby/struct:SM::Flow::P 
  body: "The <tt>eql?</tt> method returns <tt>true</tt> if <em>obj</em> and <em>anObject</em> have the same value. Used by <tt>Hash</tt> to test members for equality. For objects of class <tt>Object</tt>, <tt>eql?</tt> is synonymous with <tt>==</tt>. Subclasses normally continue this tradition, but there are exceptions. <tt>Numeric</tt> types, for example, perform type conversion across <tt>==</tt>, but not across <tt>eql?</tt>, so:"
- !ruby/struct:SM::Flow::VERB 
  body: "   1 == 1.0     #=&gt; true\n   1.eql? 1.0   #=&gt; false\n"
full_name: Module#==
is_singleton: false
name: ==
params: |
  obj == other        => true or false
  obj.equal?(other)   => true or false
  obj.eql?(other)     => true or false

visibility: public
PKx}[|4l��-ri/1.8/system/Module/method_defined%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if the named method is defined by <em>mod</em> (or its included modules and, if <em>mod</em> is a class, its ancestors). Public and protected methods are matched.
- !ruby/struct:SM::Flow::VERB 
  body: "   module A\n     def method1()  end\n   end\n   class B\n     def method2()  end\n   end\n   class C &lt; B\n     include A\n     def method3()  end\n   end\n\n   A.method_defined? :method1    #=&gt; true\n   C.method_defined? &quot;method1&quot;   #=&gt; true\n   C.method_defined? &quot;method2&quot;   #=&gt; true\n   C.method_defined? &quot;method3&quot;   #=&gt; true\n   C.method_defined? &quot;method4&quot;   #=&gt; false\n"
full_name: Module#method_defined?
is_singleton: false
name: method_defined?
params: |
  mod.method_defined?(symbol)    => true or false

visibility: public
PKx}[��R��$ri/1.8/system/Module/included-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Callback invoked whenever the receiver is included in another module or class. This should be used in preference to <tt>Module.append_features</tt> if your code wants to perform some action when a module is included in another.
- !ruby/struct:SM::Flow::VERB 
  body: "       module A\n         def A.included(mod)\n           puts &quot;#{self} included in #{mod}&quot;\n         end\n       end\n       module Enumerable\n         include A\n       end\n"
full_name: Module#included
is_singleton: false
name: included
params: |
  included( othermod )

visibility: public
PKx}[���I11#ri/1.8/system/Module/include-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invokes <tt>Module.append_features</tt> on each parameter in turn.
full_name: Module#include
is_singleton: false
name: include
params: |
  include(module, ...)    => self

visibility: public
PKx}[�1c
bb+ri/1.8/system/Module/class_variables-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an array of the names of class variables in <em>mod</em> and the ancestors of <em>mod</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   class One\n     @@var1 = 1\n   end\n   class Two &lt; One\n     @@var2 = 2\n   end\n   One.class_variables   #=&gt; [&quot;@@var1&quot;]\n   Two.class_variables   #=&gt; [&quot;@@var2&quot;, &quot;@@var1&quot;]\n"
full_name: Module#class_variables
is_singleton: false
name: class_variables
params: |
  mod.class_variables   => array

visibility: public
PKx}[����)ri/1.8/system/Module/const_missing-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Invoked when a reference is made to an undefined constant in <em>mod</em>. It is passed a symbol for the undefined constant, and returns a value to be used for that constant. The following code is a (very bad) example: if reference is made to an undefined constant, it attempts to load a file whose name is the lowercase version of the constant (thus class <tt>Fred</tt> is assumed to be in file <tt>fred.rb</tt>). If found, it returns the value of the loaded class. It therefore implements a perverse kind of autoload facility."
- !ruby/struct:SM::Flow::VERB 
  body: "  def Object.const_missing(name)\n    @looked_for ||= {}\n    str_name = name.to_s\n    raise &quot;Class not found: #{name}&quot; if @looked_for[str_name]\n    @looked_for[str_name] = 1\n    file = str_name.downcase\n    require file\n    klass = const_get(name)\n    return klass if klass\n    raise &quot;Class not found: #{name}&quot;\n  end\n"
full_name: Module#const_missing
is_singleton: false
name: const_missing
params: |
  mod.const_missing(sym)    => obj

visibility: public
PKx}[�4�< ri/1.8/system/Module/name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the name of the module <em>mod</em>.
full_name: Module#name
is_singleton: false
name: name
params: |
  mod.name    => string

visibility: public
PKx}[�ܤ���)ri/1.8/system/Module/extend_object-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Extends the specified object by adding this module's constants and methods (which are added as singleton methods). This is the callback method used by <tt>Object#extend</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   module Picky\n     def Picky.extend_object(o)\n       if String === o\n         puts &quot;Can't add Picky to a String&quot;\n       else\n         puts &quot;Picky added to #{o.class}&quot;\n         super\n       end\n     end\n   end\n   (s = Array.new).extend Picky  # Call Object.extend\n   (s = &quot;quick brown fox&quot;).extend Picky\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Picky added to Array\n   Can't add Picky to a String\n"
full_name: Module#extend_object
is_singleton: false
name: extend_object
params: |
  extend_object(obj)    => obj

visibility: public
PKx}[A^(��#ri/1.8/system/Module/nesting-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the list of <tt>Modules</tt> nested at the point of call.
- !ruby/struct:SM::Flow::VERB 
  body: "   module M1\n     module M2\n       $a = Module.nesting\n     end\n   end\n   $a           #=&gt; [M1::M2, M1]\n   $a[0].name   #=&gt; &quot;M1::M2&quot;\n"
full_name: Module::nesting
is_singleton: true
name: nesting
params: |
  Module.nesting    => array

visibility: public
PKx}[�8h)ri/1.8/system/Module/define_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Defines an instance method in the receiver. The <em>method</em> parameter can be a <tt>Proc</tt> or <tt>Method</tt> object. If a block is specified, it is used as the method body. This block is evaluated using <tt>instance_eval</tt>, a point that is tricky to demonstrate because <tt>define_method</tt> is private. (This is why we resort to the <tt>send</tt> hack in this example.)
- !ruby/struct:SM::Flow::VERB 
  body: "   class A\n     def fred\n       puts &quot;In Fred&quot;\n     end\n     def create_method(name, &amp;block)\n       self.class.send(:define_method, name, &amp;block)\n     end\n     define_method(:wilma) { puts &quot;Charge it!&quot; }\n   end\n   class B &lt; A\n     define_method(:barney, instance_method(:fred))\n   end\n   a = B.new\n   a.barney\n   a.wilma\n   a.create_method(:betty) { p self }\n   a.betty\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   In Fred\n   Charge it!\n   #&lt;B:0x401b39e8&gt;\n"
full_name: Module#define_method
is_singleton: false
name: define_method
params: |
  define_method(symbol, method)     => new_method
  define_method(symbol) { block }   => proc

visibility: public
PKx}[w��7\\.ri/1.8/system/Module/class_variable_get-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the value of the given class variable (or throws a <tt>NameError</tt> exception). The <tt>@@</tt> part of the variable name should be included for regular class variables
- !ruby/struct:SM::Flow::VERB 
  body: "   class Fred\n     @@foo = 99\n   end\n\n   def Fred.foo\n     class_variable_get(:@@foo)     #=&gt; 99\n   end\n"
full_name: Module#class_variable_get
is_singleton: false
name: class_variable_get
params: |
  mod.class_variable_get(symbol)    => obj

visibility: public
PKx}[���%ri/1.8/system/Module/ancestors-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a list of modules included in <em>mod</em> (including <em>mod</em> itself).
- !ruby/struct:SM::Flow::VERB 
  body: "   module Mod\n     include Math\n     include Comparable\n   end\n\n   Mod.ancestors    #=&gt; [Mod, Comparable, Math]\n   Math.ancestors   #=&gt; [Math]\n"
full_name: Module#ancestors
is_singleton: false
name: ancestors
params: |
  mod.ancestors -> array

visibility: public
PKx}[�����,ri/1.8/system/Module/method_undefined-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Not documented
full_name: Module#method_undefined
is_singleton: false
name: method_undefined
params: (p1)
visibility: public
PKx}[�s����6ri/1.8/system/Module/protected_instance_methods-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a list of the protected instance methods defined in <em>mod</em>. If the optional parameter is not <tt>false</tt>, the methods of any ancestors are included.
full_name: Module#protected_instance_methods
is_singleton: false
name: protected_instance_methods
params: |
  mod.protected_instance_methods(include_super=true)   => array

visibility: public
PKx}[%QO���,ri/1.8/system/Module/included_modules-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the list of modules included in <em>mod</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   module Mixin\n   end\n\n   module Outer\n     include Mixin\n   end\n\n   Mixin.included_modules   #=&gt; []\n   Outer.included_modules   #=&gt; [Mixin]\n"
full_name: Module#included_modules
is_singleton: false
name: included_modules
params: |
  mod.included_modules -> array

visibility: public
PKx}[o"f��'ri/1.8/system/Module/attr_reader-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates instance variables and corresponding methods that return the value of each instance variable. Equivalent to calling ``<tt>attr</tt><em>:name</em>'' on each name in turn.
full_name: Module#attr_reader
is_singleton: false
name: attr_reader
params: |
  attr_reader(symbol, ...)    => nil

visibility: public
PKx}[��Z6��,ri/1.8/system/TSortTest/cdesc-TSortTest.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: TSortTest
includes: []

instance_methods: []

name: TSortTest
superclass: Test::Unit::TestCase
PKx}[�����,ri/1.8/system/WSDL/Service/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Service#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKx}[BL	M��/ri/1.8/system/WSDL/Service/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Service#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKx}[�٧�%ri/1.8/system/WSDL/Service/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Service::new
is_singleton: true
name: new
params: ()
visibility: public
PKx}["&��1ri/1.8/system/WSDL/Service/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Service#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PKx}[���eQQ-ri/1.8/system/WSDL/Service/cdesc-Service.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: ports
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: soap_address
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::Service
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: Service
superclass: Info
PKx}[��]��2ri/1.8/system/WSDL/Documentation/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Documentation#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKx}[�8v���5ri/1.8/system/WSDL/Documentation/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Documentation#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKx}[�M���+ri/1.8/system/WSDL/Documentation/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Documentation::new
is_singleton: true
name: new
params: ()
visibility: public
PKx}[%?O;``9ri/1.8/system/WSDL/Documentation/cdesc-Documentation.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::Documentation
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
name: Documentation
superclass: Info
PKx}[mf��)ri/1.8/system/WSDL/Part/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Part#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKx}[���,ri/1.8/system/WSDL/Part/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Part#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKx}[e��'ri/1.8/system/WSDL/Part/cdesc-Part.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: element
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: type
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::Part
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
name: Part
superclass: Info
PKx}[s�>N��"ri/1.8/system/WSDL/Part/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Part::new
is_singleton: true
name: new
params: ()
visibility: public
PKx}[���x��;ri/1.8/system/WSDL/SOAP/MethodDefCreator/dump_method-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::MethodDefCreator#dump_method
is_singleton: false
name: dump_method
params: (operation, binding)
visibility: private
PKx}[.�����@ri/1.8/system/WSDL/SOAP/MethodDefCreator/elementqualified-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::MethodDefCreator#elementqualified
is_singleton: false
name: elementqualified
params: (part)
visibility: private
PKx}[�#����9ri/1.8/system/WSDL/SOAP/MethodDefCreator/param2str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::MethodDefCreator#param2str
is_singleton: false
name: param2str
params: (params)
visibility: private
PKx}[���OODri/1.8/system/WSDL/SOAP/MethodDefCreator/cdesc-MethodDefCreator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: definitions
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::SOAP::MethodDefCreator
includes: 
- !ruby/object:RI::IncludedModule 
  name: ClassDefCreatorSupport
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: cdr
- !ruby/object:RI::MethodSummary 
  name: collect_documentparameter
- !ruby/object:RI::MethodSummary 
  name: collect_rpcparameter
- !ruby/object:RI::MethodSummary 
  name: collect_type
- !ruby/object:RI::MethodSummary 
  name: documentdefinedtype
- !ruby/object:RI::MethodSummary 
  name: dump
- !ruby/object:RI::MethodSummary 
  name: dump_method
- !ruby/object:RI::MethodSummary 
  name: ele2str
- !ruby/object:RI::MethodSummary 
  name: elementqualified
- !ruby/object:RI::MethodSummary 
  name: param2str
- !ruby/object:RI::MethodSummary 
  name: param_set
- !ruby/object:RI::MethodSummary 
  name: rpcdefinedtype
- !ruby/object:RI::MethodSummary 
  name: type2str
name: MethodDefCreator
superclass: Object
PKx}[d<�M��Iri/1.8/system/WSDL/SOAP/MethodDefCreator/collect_documentparameter-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::MethodDefCreator#collect_documentparameter
is_singleton: false
name: collect_documentparameter
params: (operation)
visibility: public
PKx}[�=L%��3ri/1.8/system/WSDL/SOAP/MethodDefCreator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::MethodDefCreator::new
is_singleton: true
name: new
params: (definitions)
visibility: public
PKx}[��^���>ri/1.8/system/WSDL/SOAP/MethodDefCreator/rpcdefinedtype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::MethodDefCreator#rpcdefinedtype
is_singleton: false
name: rpcdefinedtype
params: (part)
visibility: private
PKx}[�ٙ^��Dri/1.8/system/WSDL/SOAP/MethodDefCreator/collect_rpcparameter-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::MethodDefCreator#collect_rpcparameter
is_singleton: false
name: collect_rpcparameter
params: (operation)
visibility: public
PKx}[�!�n��<ri/1.8/system/WSDL/SOAP/MethodDefCreator/collect_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::MethodDefCreator#collect_type
is_singleton: false
name: collect_type
params: (type)
visibility: private
PKx}[:�I��7ri/1.8/system/WSDL/SOAP/MethodDefCreator/ele2str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::MethodDefCreator#ele2str
is_singleton: false
name: ele2str
params: (ele)
visibility: private
PKx}[�~����8ri/1.8/system/WSDL/SOAP/MethodDefCreator/type2str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::MethodDefCreator#type2str
is_singleton: false
name: type2str
params: (type)
visibility: private
PKx}[�QLo��9ri/1.8/system/WSDL/SOAP/MethodDefCreator/param_set-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::MethodDefCreator#param_set
is_singleton: false
name: param_set
params: (io_type, name, type, ele = nil)
visibility: private
PKx}[
T��4ri/1.8/system/WSDL/SOAP/MethodDefCreator/dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::MethodDefCreator#dump
is_singleton: false
name: dump
params: (porttype)
visibility: public
PKx}[X=��3ri/1.8/system/WSDL/SOAP/MethodDefCreator/cdr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::MethodDefCreator#cdr
is_singleton: false
name: cdr
params: (ary)
visibility: private
PKx}[�:����Cri/1.8/system/WSDL/SOAP/MethodDefCreator/documentdefinedtype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::MethodDefCreator#documentdefinedtype
is_singleton: false
name: documentdefinedtype
params: (part)
visibility: private
PKx}[m����0ri/1.8/system/WSDL/SOAP/Header/cdesc-Header.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: encodingstyle
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: headerfault
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: message
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: namespace
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: part
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: use
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::SOAP::Header
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: find_message
- !ruby/object:RI::MethodSummary 
  name: find_part
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: Header
superclass: Info
PKx}[��a��0ri/1.8/system/WSDL/SOAP/Header/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Header#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKx}[�[v��3ri/1.8/system/WSDL/SOAP/Header/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Header#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKx}[
�K��/ri/1.8/system/WSDL/SOAP/Header/find_part-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Header#find_part
is_singleton: false
name: find_part
params: ()
visibility: public
PKx}[��3���2ri/1.8/system/WSDL/SOAP/Header/find_message-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Header#find_message
is_singleton: false
name: find_message
params: ()
visibility: public
PKx}[�/=��)ri/1.8/system/WSDL/SOAP/Header/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Header::new
is_singleton: true
name: new
params: ()
visibility: public
PKx}[њ�N��5ri/1.8/system/WSDL/SOAP/Header/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Header#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PKx}[
Cn��4ri/1.8/system/WSDL/SOAP/WSDL2Ruby/create_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::WSDL2Ruby#create_file
is_singleton: false
name: create_file
params: ()
visibility: private
PKx}[g��]��3ri/1.8/system/WSDL/SOAP/WSDL2Ruby/check_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::WSDL2Ruby#check_file
is_singleton: false
name: check_file
params: (filename)
visibility: private
PKx}[�S���6ri/1.8/system/WSDL/SOAP/WSDL2Ruby/cdesc-WSDL2Ruby.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: basedir
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: location
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: logger
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: opt
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::SOAP::WSDL2Ruby
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: check_file
- !ruby/object:RI::MethodSummary 
  name: create_cgi_stub
- !ruby/object:RI::MethodSummary 
  name: create_classdef
- !ruby/object:RI::MethodSummary 
  name: create_client_skelton
- !ruby/object:RI::MethodSummary 
  name: create_driver
- !ruby/object:RI::MethodSummary 
  name: create_file
- !ruby/object:RI::MethodSummary 
  name: create_name
- !ruby/object:RI::MethodSummary 
  name: create_servant_skelton
- !ruby/object:RI::MethodSummary 
  name: create_standalone_server_stub
- !ruby/object:RI::MethodSummary 
  name: import
- !ruby/object:RI::MethodSummary 
  name: run
- !ruby/object:RI::MethodSummary 
  name: shbang
- !ruby/object:RI::MethodSummary 
  name: write_file
name: WSDL2Ruby
superclass: Object
PKx}[�l��4ri/1.8/system/WSDL/SOAP/WSDL2Ruby/create_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::WSDL2Ruby#create_name
is_singleton: false
name: create_name
params: (name)
visibility: private
PKx}[��?��3ri/1.8/system/WSDL/SOAP/WSDL2Ruby/write_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: f
comment: 
full_name: WSDL::SOAP::WSDL2Ruby#write_file
is_singleton: false
name: write_file
params: (filename) {|f| ...}
visibility: private
PKx}[u�6��,ri/1.8/system/WSDL/SOAP/WSDL2Ruby/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::WSDL2Ruby::new
is_singleton: true
name: new
params: ()
visibility: public
PKx}[ ����?ri/1.8/system/WSDL/SOAP/WSDL2Ruby/create_servant_skelton-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::WSDL2Ruby#create_servant_skelton
is_singleton: false
name: create_servant_skelton
params: (porttypename)
visibility: private
PKx}[�%�2��6ri/1.8/system/WSDL/SOAP/WSDL2Ruby/create_driver-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::WSDL2Ruby#create_driver
is_singleton: false
name: create_driver
params: (porttypename)
visibility: private
PKx}[L���>ri/1.8/system/WSDL/SOAP/WSDL2Ruby/create_client_skelton-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::WSDL2Ruby#create_client_skelton
is_singleton: false
name: create_client_skelton
params: (servicename)
visibility: private
PKx}[Fh��,ri/1.8/system/WSDL/SOAP/WSDL2Ruby/run-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::WSDL2Ruby#run
is_singleton: false
name: run
params: ()
visibility: public
PKx}[��f��8ri/1.8/system/WSDL/SOAP/WSDL2Ruby/create_classdef-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::WSDL2Ruby#create_classdef
is_singleton: false
name: create_classdef
params: ()
visibility: private
PKx}[�����Fri/1.8/system/WSDL/SOAP/WSDL2Ruby/create_standalone_server_stub-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::WSDL2Ruby#create_standalone_server_stub
is_singleton: false
name: create_standalone_server_stub
params: (servicename)
visibility: private
PKx}[WI��8ri/1.8/system/WSDL/SOAP/WSDL2Ruby/create_cgi_stub-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::WSDL2Ruby#create_cgi_stub
is_singleton: false
name: create_cgi_stub
params: (servicename)
visibility: private
PKx}[y����/ri/1.8/system/WSDL/SOAP/WSDL2Ruby/shbang-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::WSDL2Ruby#shbang
is_singleton: false
name: shbang
params: ()
visibility: private
PKx}[�b���/ri/1.8/system/WSDL/SOAP/WSDL2Ruby/import-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::WSDL2Ruby#import
is_singleton: false
name: import
params: (location)
visibility: private
PKx}[c—��/ri/1.8/system/WSDL/SOAP/Fault/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Fault#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKx}[����2ri/1.8/system/WSDL/SOAP/Fault/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Fault#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKx}[�tC��(ri/1.8/system/WSDL/SOAP/Fault/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Fault::new
is_singleton: true
name: new
params: ()
visibility: public
PKx}[������4ri/1.8/system/WSDL/SOAP/Fault/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Fault#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PKx}[@�8x��.ri/1.8/system/WSDL/SOAP/Fault/cdesc-Fault.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: encodingstyle
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: namespace
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: use
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::SOAP::Fault
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: Fault
superclass: Info
PKx}[P�����Bri/1.8/system/WSDL/SOAP/ClassDefCreator/dump_simpleclassdef-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreator#dump_simpleclassdef
is_singleton: false
name: dump_simpleclassdef
params: (type_or_element)
visibility: private
PKx}[�>����Ari/1.8/system/WSDL/SOAP/ClassDefCreator/dump_simpletypedef-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreator#dump_simpletypedef
is_singleton: false
name: dump_simpletypedef
params: (qname, simpletype)
visibility: private
PKx}[��
��Ari/1.8/system/WSDL/SOAP/ClassDefCreator/attribute_basetype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreator#attribute_basetype
is_singleton: false
name: attribute_basetype
params: (attr)
visibility: private
PKx}[Kn����>ri/1.8/system/WSDL/SOAP/ClassDefCreator/dump_simpletype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreator#dump_simpletype
is_singleton: false
name: dump_simpletype
params: ()
visibility: private
PKx}[�!E���<ri/1.8/system/WSDL/SOAP/ClassDefCreator/dump_classdef-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreator#dump_classdef
is_singleton: false
name: dump_classdef
params: (qname, typedef, qualified = false)
visibility: private
PKx}[S�z���Bri/1.8/system/WSDL/SOAP/ClassDefCreator/cdesc-ClassDefCreator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: DEFAULT_ITEM_NAME
  value: XSD::QName.new(nil, 'item')
full_name: WSDL::SOAP::ClassDefCreator
includes: 
- !ruby/object:RI::IncludedModule 
  name: ClassDefCreatorSupport
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: attribute_basetype
- !ruby/object:RI::MethodSummary 
  name: basetype_class
- !ruby/object:RI::MethodSummary 
  name: define_attribute
- !ruby/object:RI::MethodSummary 
  name: dump
- !ruby/object:RI::MethodSummary 
  name: dump_arraydef
- !ruby/object:RI::MethodSummary 
  name: dump_classdef
- !ruby/object:RI::MethodSummary 
  name: dump_complextype
- !ruby/object:RI::MethodSummary 
  name: dump_element
- !ruby/object:RI::MethodSummary 
  name: dump_simpleclassdef
- !ruby/object:RI::MethodSummary 
  name: dump_simpletype
- !ruby/object:RI::MethodSummary 
  name: dump_simpletypedef
- !ruby/object:RI::MethodSummary 
  name: element_basetype
- !ruby/object:RI::MethodSummary 
  name: name_attribute
- !ruby/object:RI::MethodSummary 
  name: name_element
name: ClassDefCreator
superclass: Object
PKx}[R�D���?ri/1.8/system/WSDL/SOAP/ClassDefCreator/dump_complextype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreator#dump_complextype
is_singleton: false
name: dump_complextype
params: ()
visibility: private
PKx}[�ӢQ��=ri/1.8/system/WSDL/SOAP/ClassDefCreator/name_attribute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreator#name_attribute
is_singleton: false
name: name_attribute
params: (attribute)
visibility: private
PKx}[��3I��2ri/1.8/system/WSDL/SOAP/ClassDefCreator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreator::new
is_singleton: true
name: new
params: (definitions)
visibility: public
PKx}[$���?ri/1.8/system/WSDL/SOAP/ClassDefCreator/element_basetype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreator#element_basetype
is_singleton: false
name: element_basetype
params: (ele)
visibility: private
PKx}[�#(���;ri/1.8/system/WSDL/SOAP/ClassDefCreator/name_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreator#name_element
is_singleton: false
name: name_element
params: (element)
visibility: private
PKx}[��{���;ri/1.8/system/WSDL/SOAP/ClassDefCreator/dump_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreator#dump_element
is_singleton: false
name: dump_element
params: ()
visibility: private
PKx}[���a��3ri/1.8/system/WSDL/SOAP/ClassDefCreator/dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreator#dump
is_singleton: false
name: dump
params: (type = nil)
visibility: public
PKx}[��c��?ri/1.8/system/WSDL/SOAP/ClassDefCreator/define_attribute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreator#define_attribute
is_singleton: false
name: define_attribute
params: (c, attributes)
visibility: private
PKx}[��T��=ri/1.8/system/WSDL/SOAP/ClassDefCreator/basetype_class-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreator#basetype_class
is_singleton: false
name: basetype_class
params: (type)
visibility: private
PKx}[����<ri/1.8/system/WSDL/SOAP/ClassDefCreator/dump_arraydef-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreator#dump_arraydef
is_singleton: false
name: dump_arraydef
params: (complextype)
visibility: private
PKx}[���<��.ri/1.8/system/WSDL/SOAP/Body/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Body#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKx}[<�^��1ri/1.8/system/WSDL/SOAP/Body/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Body#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKx}[��(~��'ri/1.8/system/WSDL/SOAP/Body/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Body::new
is_singleton: true
name: new
params: ()
visibility: public
PKx}[�� ^[[,ri/1.8/system/WSDL/SOAP/Body/cdesc-Body.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: encodingstyle
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: namespace
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: parts
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: use
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::SOAP::Body
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
name: Body
superclass: Info
PKx}[�V����>ri/1.8/system/WSDL/SOAP/DriverCreator/cdesc-DriverCreator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: definitions
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::SOAP::DriverCreator
includes: 
- !ruby/object:RI::IncludedModule 
  name: ClassDefCreatorSupport
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: dump
- !ruby/object:RI::MethodSummary 
  name: dump_porttype
name: DriverCreator
superclass: Object
PKx}[��C���:ri/1.8/system/WSDL/SOAP/DriverCreator/dump_porttype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::DriverCreator#dump_porttype
is_singleton: false
name: dump_porttype
params: (name)
visibility: private
PKx}[�+���0ri/1.8/system/WSDL/SOAP/DriverCreator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::DriverCreator::new
is_singleton: true
name: new
params: (definitions)
visibility: public
PKx}[ߔȚ��1ri/1.8/system/WSDL/SOAP/DriverCreator/dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::DriverCreator#dump
is_singleton: false
name: dump
params: (porttype = nil)
visibility: public
PKx}[\O�r��3ri/1.8/system/WSDL/SOAP/Operation/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Operation#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKx}[����6ri/1.8/system/WSDL/SOAP/Operation/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Operation#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKx}[�I���7ri/1.8/system/WSDL/SOAP/Operation/parent_binding-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Operation#parent_binding
is_singleton: false
name: parent_binding
params: ()
visibility: private
PKx}[Q���:ri/1.8/system/WSDL/SOAP/Operation/OperationInfo/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Operation::OperationInfo::new
is_singleton: true
name: new
params: (style, op_name, optype_name, headerparts, bodyparts, faultpart, soapaction)
visibility: public
PKx}[��G��Hri/1.8/system/WSDL/SOAP/Operation/OperationInfo/cdesc-OperationInfo.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: bodyparts
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: faultpart
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: headerparts
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: op_name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: optype_name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: soapaction
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: style
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::SOAP::Operation::OperationInfo
includes: []

instance_methods: []

name: OperationInfo
superclass: Object
PKx}[�=����,ri/1.8/system/WSDL/SOAP/Operation/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Operation::new
is_singleton: true
name: new
params: ()
visibility: public
PKy}[����3ri/1.8/system/WSDL/SOAP/Operation/input_info-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Operation#input_info
is_singleton: false
name: input_info
params: ()
visibility: public
PKy}[T0����3ri/1.8/system/WSDL/SOAP/Operation/param_info-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Operation#param_info
is_singleton: false
name: param_info
params: (name_info, param)
visibility: private
PKy}[bw���6ri/1.8/system/WSDL/SOAP/Operation/cdesc-Operation.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: soapaction
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: style
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::SOAP::Operation
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: input_info
- !ruby/object:RI::MethodSummary 
  name: operation_style
- !ruby/object:RI::MethodSummary 
  name: output_info
- !ruby/object:RI::MethodSummary 
  name: param_info
- !ruby/object:RI::MethodSummary 
  name: parent_binding
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
name: Operation
superclass: Info
PKy}[i(0��8ri/1.8/system/WSDL/SOAP/Operation/operation_style-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Operation#operation_style
is_singleton: false
name: operation_style
params: ()
visibility: public
PKy}[��п�4ri/1.8/system/WSDL/SOAP/Operation/output_info-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Operation#output_info
is_singleton: false
name: output_info
params: ()
visibility: public
PKy}[���J��<ri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/dqname-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreatorSupport#dqname
is_singleton: false
name: dqname
params: (qname)
visibility: public
PKy}[��nu��9ri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/ndq-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreatorSupport#ndq
is_singleton: false
name: ndq
params: (ele)
visibility: public
PKy}[���ʿ�9ri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/sym-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreatorSupport#sym
is_singleton: false
name: sym
params: (ele)
visibility: public
PKy}[�F�N��8ri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/dq-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreatorSupport#dq
is_singleton: false
name: dq
params: (ele)
visibility: public
PKy}[ZI����Kri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/basetype_mapped_class-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreatorSupport#basetype_mapped_class
is_singleton: false
name: basetype_mapped_class
params: (name)
visibility: public
PKy}[�U	2��Eri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/dump_inputparam-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreatorSupport#dump_inputparam
is_singleton: false
name: dump_inputparam
params: (input)
visibility: private
PKy}[{&�8��<ri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/add_at-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreatorSupport#add_at
is_singleton: false
name: add_at
params: (base, str, pos)
visibility: private
PKy}[i}����Eri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/dump_inout_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreatorSupport#dump_inout_type
is_singleton: false
name: dump_inout_type
params: (param)
visibility: private
PKy}[�kO���Kri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/dump_method_signature-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreatorSupport#dump_method_signature
is_singleton: false
name: dump_method_signature
params: (operation)
visibility: public
PKy}[x>"%��Gri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/create_class_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClassDefCreatorSupport#create_class_name
is_singleton: false
name: create_class_name
params: (qname)
visibility: public
PKy}[�F:88Pri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/cdesc-ClassDefCreatorSupport.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WSDL::SOAP::ClassDefCreatorSupport
includes: 
- !ruby/object:RI::IncludedModule 
  name: XSD::CodeGen::GenSupport
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_at
- !ruby/object:RI::MethodSummary 
  name: basetype_mapped_class
- !ruby/object:RI::MethodSummary 
  name: create_class_name
- !ruby/object:RI::MethodSummary 
  name: dq
- !ruby/object:RI::MethodSummary 
  name: dqname
- !ruby/object:RI::MethodSummary 
  name: dump_inout_type
- !ruby/object:RI::MethodSummary 
  name: dump_inputparam
- !ruby/object:RI::MethodSummary 
  name: dump_method_signature
- !ruby/object:RI::MethodSummary 
  name: ndq
- !ruby/object:RI::MethodSummary 
  name: sym
name: ClassDefCreatorSupport
superclass: 
PKy}[��AWeeLri/1.8/system/WSDL/SOAP/ClientSkeltonCreator/cdesc-ClientSkeltonCreator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: definitions
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::SOAP::ClientSkeltonCreator
includes: 
- !ruby/object:RI::IncludedModule 
  name: ClassDefCreatorSupport
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: dump
- !ruby/object:RI::MethodSummary 
  name: dump_input_init
- !ruby/object:RI::MethodSummary 
  name: dump_operation
- !ruby/object:RI::MethodSummary 
  name: dump_porttype
name: ClientSkeltonCreator
superclass: Object
PKy}[M�fF��Bri/1.8/system/WSDL/SOAP/ClientSkeltonCreator/dump_operation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClientSkeltonCreator#dump_operation
is_singleton: false
name: dump_operation
params: (operation)
visibility: private
PKy}[��tf��Ari/1.8/system/WSDL/SOAP/ClientSkeltonCreator/dump_porttype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClientSkeltonCreator#dump_porttype
is_singleton: false
name: dump_porttype
params: (name)
visibility: private
PKy}[$թ:��Cri/1.8/system/WSDL/SOAP/ClientSkeltonCreator/dump_input_init-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClientSkeltonCreator#dump_input_init
is_singleton: false
name: dump_input_init
params: (input)
visibility: private
PKy}[
���7ri/1.8/system/WSDL/SOAP/ClientSkeltonCreator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClientSkeltonCreator::new
is_singleton: true
name: new
params: (definitions)
visibility: public
PKy}[']O���8ri/1.8/system/WSDL/SOAP/ClientSkeltonCreator/dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ClientSkeltonCreator#dump
is_singleton: false
name: dump
params: (service_name)
visibility: public
PKy}[e�����;ri/1.8/system/WSDL/SOAP/CGIStubCreator/dump_porttype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::CGIStubCreator#dump_porttype
is_singleton: false
name: dump_porttype
params: (name)
visibility: private
PKy}[�/z��1ri/1.8/system/WSDL/SOAP/CGIStubCreator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::CGIStubCreator::new
is_singleton: true
name: new
params: (definitions)
visibility: public
PKy}[�ݨ���2ri/1.8/system/WSDL/SOAP/CGIStubCreator/dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::CGIStubCreator#dump
is_singleton: false
name: dump
params: (service_name)
visibility: public
PKy}[�����@ri/1.8/system/WSDL/SOAP/CGIStubCreator/cdesc-CGIStubCreator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: definitions
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::SOAP::CGIStubCreator
includes: 
- !ruby/object:RI::IncludedModule 
  name: ClassDefCreatorSupport
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: dump
- !ruby/object:RI::MethodSummary 
  name: dump_porttype
name: CGIStubCreator
superclass: Object
PKy}[�W��Bri/1.8/system/WSDL/SOAP/ServantSkeltonCreator/dump_porttype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ServantSkeltonCreator#dump_porttype
is_singleton: false
name: dump_porttype
params: (name)
visibility: private
PKy}[9�&3��8ri/1.8/system/WSDL/SOAP/ServantSkeltonCreator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ServantSkeltonCreator::new
is_singleton: true
name: new
params: (definitions)
visibility: public
PKy}[��3��9ri/1.8/system/WSDL/SOAP/ServantSkeltonCreator/dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::ServantSkeltonCreator#dump
is_singleton: false
name: dump
params: (porttype = nil)
visibility: public
PKy}[ ��88Nri/1.8/system/WSDL/SOAP/ServantSkeltonCreator/cdesc-ServantSkeltonCreator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: definitions
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::SOAP::ServantSkeltonCreator
includes: 
- !ruby/object:RI::IncludedModule 
  name: ClassDefCreatorSupport
- !ruby/object:RI::IncludedModule 
  name: XSD::CodeGen::GenSupport
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: dump
- !ruby/object:RI::MethodSummary 
  name: dump_porttype
name: ServantSkeltonCreator
superclass: Object
PKy}[�rv���5ri/1.8/system/WSDL/SOAP/HeaderFault/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::HeaderFault#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKy}[�Q�`��8ri/1.8/system/WSDL/SOAP/HeaderFault/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::HeaderFault#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKy}[���)��:ri/1.8/system/WSDL/SOAP/HeaderFault/cdesc-HeaderFault.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: encodingstyle
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: message
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: namespace
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: part
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: use
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::SOAP::HeaderFault
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
name: HeaderFault
superclass: Info
PKy}[�m#��.ri/1.8/system/WSDL/SOAP/HeaderFault/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::HeaderFault::new
is_singleton: true
name: new
params: ()
visibility: public
PKy}[<����Hri/1.8/system/WSDL/SOAP/MappingRegistryCreator/dump_array_typemap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::MappingRegistryCreator#dump_array_typemap
is_singleton: false
name: dump_array_typemap
params: (definedtype)
visibility: private
PKy}[��w���Bri/1.8/system/WSDL/SOAP/MappingRegistryCreator/dump_typemap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::MappingRegistryCreator#dump_typemap
is_singleton: false
name: dump_typemap
params: (type)
visibility: private
PKy}[W���9ri/1.8/system/WSDL/SOAP/MappingRegistryCreator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::MappingRegistryCreator::new
is_singleton: true
name: new
params: (definitions)
visibility: public
PKy}[d.�~ppPri/1.8/system/WSDL/SOAP/MappingRegistryCreator/cdesc-MappingRegistryCreator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: definitions
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::SOAP::MappingRegistryCreator
includes: 
- !ruby/object:RI::IncludedModule 
  name: ClassDefCreatorSupport
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: dump
- !ruby/object:RI::MethodSummary 
  name: dump_array_typemap
- !ruby/object:RI::MethodSummary 
  name: dump_struct_typemap
- !ruby/object:RI::MethodSummary 
  name: dump_typemap
name: MappingRegistryCreator
superclass: Object
PKy}[�����Iri/1.8/system/WSDL/SOAP/MappingRegistryCreator/dump_struct_typemap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::MappingRegistryCreator#dump_struct_typemap
is_singleton: false
name: dump_struct_typemap
params: (definedtype)
visibility: private
PKy}[�=��:ri/1.8/system/WSDL/SOAP/MappingRegistryCreator/dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::MappingRegistryCreator#dump
is_singleton: false
name: dump
params: (types)
visibility: public
PKy}[58�:��1ri/1.8/system/WSDL/SOAP/Binding/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Binding#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKy}[�E���4ri/1.8/system/WSDL/SOAP/Binding/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Binding#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKy}[I=fr��*ri/1.8/system/WSDL/SOAP/Binding/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Binding::new
is_singleton: true
name: new
params: ()
visibility: public
PKy}[�ŋt��2ri/1.8/system/WSDL/SOAP/Binding/cdesc-Binding.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: style
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: transport
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::SOAP::Binding
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
name: Binding
superclass: Info
PKy}[Dl�Zri/1.8/system/WSDL/SOAP/StandaloneServerStubCreator/cdesc-StandaloneServerStubCreator.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: definitions
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::SOAP::StandaloneServerStubCreator
includes: 
- !ruby/object:RI::IncludedModule 
  name: ClassDefCreatorSupport
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: dump
- !ruby/object:RI::MethodSummary 
  name: dump_porttype
name: StandaloneServerStubCreator
superclass: Object
PKy}[i���Hri/1.8/system/WSDL/SOAP/StandaloneServerStubCreator/dump_porttype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::StandaloneServerStubCreator#dump_porttype
is_singleton: false
name: dump_porttype
params: (name)
visibility: private
PKy}[W�NF��>ri/1.8/system/WSDL/SOAP/StandaloneServerStubCreator/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::StandaloneServerStubCreator::new
is_singleton: true
name: new
params: (definitions)
visibility: public
PKy}[tBO��?ri/1.8/system/WSDL/SOAP/StandaloneServerStubCreator/dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::StandaloneServerStubCreator#dump
is_singleton: false
name: dump
params: (service_name)
visibility: public
PKy}[T#����2ri/1.8/system/WSDL/SOAP/Address/cdesc-Address.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: location
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::SOAP::Address
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
name: Address
superclass: Info
PKy}[Z$|���1ri/1.8/system/WSDL/SOAP/Address/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Address#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKy}[�!P��4ri/1.8/system/WSDL/SOAP/Address/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Address#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKy}[�0�6��*ri/1.8/system/WSDL/SOAP/Address/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::SOAP::Address::new
is_singleton: true
name: new
params: ()
visibility: public
PKy}[��2��'ri/1.8/system/WSDL/SOAP/cdesc-SOAP.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: HeaderFaultName
  value: XSD::QName.new(SOAPBindingNamespace, 'headerfault')
- !ruby/object:RI::Constant 
  comment: 
  name: LocationAttrName
  value: XSD::QName.new(nil, 'location')
- !ruby/object:RI::Constant 
  comment: 
  name: StyleAttrName
  value: XSD::QName.new(nil, 'style')
- !ruby/object:RI::Constant 
  comment: 
  name: TransportAttrName
  value: XSD::QName.new(nil, 'transport')
- !ruby/object:RI::Constant 
  comment: 
  name: UseAttrName
  value: XSD::QName.new(nil, 'use')
- !ruby/object:RI::Constant 
  comment: 
  name: PartsAttrName
  value: XSD::QName.new(nil, 'parts')
- !ruby/object:RI::Constant 
  comment: 
  name: PartAttrName
  value: XSD::QName.new(nil, 'part')
- !ruby/object:RI::Constant 
  comment: 
  name: NameAttrName
  value: XSD::QName.new(nil, 'name')
- !ruby/object:RI::Constant 
  comment: 
  name: MessageAttrName
  value: XSD::QName.new(nil, 'message')
- !ruby/object:RI::Constant 
  comment: 
  name: EncodingStyleAttrName
  value: XSD::QName.new(nil, 'encodingStyle')
- !ruby/object:RI::Constant 
  comment: 
  name: NamespaceAttrName
  value: XSD::QName.new(nil, 'namespace')
- !ruby/object:RI::Constant 
  comment: 
  name: SOAPActionAttrName
  value: XSD::QName.new(nil, 'soapAction')
full_name: WSDL::SOAP
includes: []

instance_methods: []

name: SOAP
superclass: 
PKy}[Y�
���-ri/1.8/system/WSDL/Info/parse_epilogue-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Info#parse_epilogue
is_singleton: false
name: parse_epilogue
params: ()
visibility: public
PKy}[�Ty��)ri/1.8/system/WSDL/Info/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Info#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKy}[!T�xx'ri/1.8/system/WSDL/Info/cdesc-Info.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: id
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: parent
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: root
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::Info
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: parse_epilogue
name: Info
superclass: Object
PKy}[��2��,ri/1.8/system/WSDL/Info/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Info#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKy}[��l��&ri/1.8/system/WSDL/Info/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Info#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PKy}[�"����"ri/1.8/system/WSDL/Info/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Info::new
is_singleton: true
name: new
params: ()
visibility: public
PKy}[đZ��9ri/1.8/system/WSDL/XMLSchema/Annotation/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Annotation#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKy}[�����<ri/1.8/system/WSDL/XMLSchema/Annotation/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Annotation#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKy}[p��`ee=ri/1.8/system/WSDL/XMLSchema/Annotation/cdesc-Annotation.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::Annotation
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
name: Annotation
superclass: Info
PKy}[�µ�2ri/1.8/system/WSDL/XMLSchema/Annotation/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Annotation::new
is_singleton: true
name: new
params: ()
visibility: public
PKy}[/����6ri/1.8/system/WSDL/XMLSchema/Pattern/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Pattern#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKy}[��g���9ri/1.8/system/WSDL/XMLSchema/Pattern/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Pattern#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKy}[�f���/ri/1.8/system/WSDL/XMLSchema/Pattern/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Pattern::new
is_singleton: true
name: new
params: ()
visibility: public
PKy}[�l�__7ri/1.8/system/WSDL/XMLSchema/Pattern/cdesc-Pattern.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::Pattern
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
name: Pattern
superclass: Info
PKy}[��;\��5ri/1.8/system/WSDL/XMLSchema/Length/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Length#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKy}[��\��8ri/1.8/system/WSDL/XMLSchema/Length/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Length#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKy}[Q=�G��.ri/1.8/system/WSDL/XMLSchema/Length/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Length::new
is_singleton: true
name: new
params: ()
visibility: public
PKy}[�
�]]5ri/1.8/system/WSDL/XMLSchema/Length/cdesc-Length.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::Length
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
name: Length
superclass: Info
PKy}[m����7ri/1.8/system/WSDL/XMLSchema/Sequence/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Sequence#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKy}[�)0��:ri/1.8/system/WSDL/XMLSchema/Sequence/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Sequence#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKy}[�����0ri/1.8/system/WSDL/XMLSchema/Sequence/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Sequence::new
is_singleton: true
name: new
params: ()
visibility: public
PKy}[t�h��<ri/1.8/system/WSDL/XMLSchema/Sequence/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Sequence#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PKy}[�f����3ri/1.8/system/WSDL/XMLSchema/Sequence/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Sequence#<<
is_singleton: false
name: "<<"
params: (element)
visibility: public
PKy}[��{��9ri/1.8/system/WSDL/XMLSchema/Sequence/cdesc-Sequence.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: elements
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: maxoccurs
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: minoccurs
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::Sequence
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: elementformdefault
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: Sequence
superclass: Info
PKy}[`*{��?ri/1.8/system/WSDL/XMLSchema/Sequence/elementformdefault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Sequence#elementformdefault
is_singleton: false
name: elementformdefault
params: ()
visibility: public
PKy}[������2ri/1.8/system/WSDL/XMLSchema/Any/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Any#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKy}[�{����5ri/1.8/system/WSDL/XMLSchema/Any/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Any#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKy}[y8���/ri/1.8/system/WSDL/XMLSchema/Any/cdesc-Any.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: maxoccurs
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: minoccurs
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: namespace
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: process_contents
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::Any
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: Any
superclass: Info
PKy}[������+ri/1.8/system/WSDL/XMLSchema/Any/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Any::new
is_singleton: true
name: new
params: ()
visibility: public
PKy}[\h`)��7ri/1.8/system/WSDL/XMLSchema/Any/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Any#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PKy}[g�h��5ri/1.8/system/WSDL/XMLSchema/Choice/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Choice#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKy}[����8ri/1.8/system/WSDL/XMLSchema/Choice/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Choice#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKy}[�~o��5ri/1.8/system/WSDL/XMLSchema/Choice/cdesc-Choice.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: elements
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: maxoccurs
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: minoccurs
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::Choice
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: elementformdefault
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: Choice
superclass: Info
PKy}[�����.ri/1.8/system/WSDL/XMLSchema/Choice/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Choice::new
is_singleton: true
name: new
params: ()
visibility: public
PKy}[V��g��:ri/1.8/system/WSDL/XMLSchema/Choice/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Choice#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PKy}[U)�!��1ri/1.8/system/WSDL/XMLSchema/Choice/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Choice#<<
is_singleton: false
name: "<<"
params: (element)
visibility: public
PKy}[����=ri/1.8/system/WSDL/XMLSchema/Choice/elementformdefault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Choice#elementformdefault
is_singleton: false
name: elementformdefault
params: ()
visibility: public
PKy}[�3(���9ri/1.8/system/WSDL/XMLSchema/SimpleType/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleType#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKy}[H����<ri/1.8/system/WSDL/XMLSchema/SimpleType/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleType#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKy}[5����@ri/1.8/system/WSDL/XMLSchema/SimpleType/check_restriction-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleType#check_restriction
is_singleton: false
name: check_restriction
params: (value)
visibility: private
PKy}[���տ�2ri/1.8/system/WSDL/XMLSchema/SimpleType/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleType::new
is_singleton: true
name: new
params: (name = nil)
visibility: public
PKy}[�����>ri/1.8/system/WSDL/XMLSchema/SimpleType/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleType#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PKy}[l�
��Cri/1.8/system/WSDL/XMLSchema/SimpleType/check_lexical_format-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleType#check_lexical_format
is_singleton: false
name: check_lexical_format
params: (value)
visibility: public
PKy}[ Q�ʷ�3ri/1.8/system/WSDL/XMLSchema/SimpleType/base-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleType#base
is_singleton: false
name: base
params: ()
visibility: public
PKy}[�)���=ri/1.8/system/WSDL/XMLSchema/SimpleType/cdesc-SimpleType.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: restriction
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::SimpleType
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: base
- !ruby/object:RI::MethodSummary 
  name: check_lexical_format
- !ruby/object:RI::MethodSummary 
  name: check_restriction
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: SimpleType
superclass: Info
PKy}[H����=ri/1.8/system/WSDL/XMLSchema/XSD2Ruby/create_classname-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::XSD2Ruby#create_classname
is_singleton: false
name: create_classname
params: (xsd)
visibility: private
PKy}[89��8ri/1.8/system/WSDL/XMLSchema/XSD2Ruby/create_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::XSD2Ruby#create_file
is_singleton: false
name: create_file
params: ()
visibility: private
PKy}[��L���7ri/1.8/system/WSDL/XMLSchema/XSD2Ruby/check_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::XSD2Ruby#check_file
is_singleton: false
name: check_file
params: (filename)
visibility: private
PKy}[��t���7ri/1.8/system/WSDL/XMLSchema/XSD2Ruby/write_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: f
comment: 
full_name: WSDL::XMLSchema::XSD2Ruby#write_file
is_singleton: false
name: write_file
params: (filename) {|f| ...}
visibility: private
PKy}[KL1��0ri/1.8/system/WSDL/XMLSchema/XSD2Ruby/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::XSD2Ruby::new
is_singleton: true
name: new
params: ()
visibility: public
PKy}[��UZnn9ri/1.8/system/WSDL/XMLSchema/XSD2Ruby/cdesc-XSD2Ruby.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: basedir
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: location
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: logger
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: opt
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::XSD2Ruby
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: check_file
- !ruby/object:RI::MethodSummary 
  name: create_classdef
- !ruby/object:RI::MethodSummary 
  name: create_classname
- !ruby/object:RI::MethodSummary 
  name: create_file
- !ruby/object:RI::MethodSummary 
  name: import
- !ruby/object:RI::MethodSummary 
  name: run
- !ruby/object:RI::MethodSummary 
  name: write_file
name: XSD2Ruby
superclass: Object
PKy}[x�Hֳ�0ri/1.8/system/WSDL/XMLSchema/XSD2Ruby/run-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::XSD2Ruby#run
is_singleton: false
name: run
params: ()
visibility: public
PKy}[�dE��<ri/1.8/system/WSDL/XMLSchema/XSD2Ruby/create_classdef-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::XSD2Ruby#create_classdef
is_singleton: false
name: create_classdef
params: ()
visibility: private
PKy}[-F2��3ri/1.8/system/WSDL/XMLSchema/XSD2Ruby/import-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::XSD2Ruby#import
is_singleton: false
name: import
params: (location)
visibility: private
PKy}[�e��>ri/1.8/system/WSDL/XMLSchema/SimpleExtension/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleExtension#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKy}[�a�[[Gri/1.8/system/WSDL/XMLSchema/SimpleExtension/cdesc-SimpleExtension.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: attributes
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: base
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::SimpleExtension
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
- !ruby/object:RI::MethodSummary 
  name: valid?
name: SimpleExtension
superclass: Info
PKy}[�m����Ari/1.8/system/WSDL/XMLSchema/SimpleExtension/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleExtension#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKy}[ku����7ri/1.8/system/WSDL/XMLSchema/SimpleExtension/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleExtension::new
is_singleton: true
name: new
params: ()
visibility: public
PKy}[W����Cri/1.8/system/WSDL/XMLSchema/SimpleExtension/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleExtension#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PKy}[;�J]��<ri/1.8/system/WSDL/XMLSchema/SimpleExtension/valid%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleExtension#valid?
is_singleton: false
name: valid?
params: (value)
visibility: public
PKy}[��ʧ��9ri/1.8/system/WSDL/XMLSchema/SimpleContent/content-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleContent#content
is_singleton: false
name: content
params: ()
visibility: private
PKy}[ѱf��?ri/1.8/system/WSDL/XMLSchema/SimpleContent/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleContent#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKy}[-8���7ri/1.8/system/WSDL/XMLSchema/SimpleContent/check-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleContent#check
is_singleton: false
name: check
params: (value)
visibility: private
PKy}[V���5ri/1.8/system/WSDL/XMLSchema/SimpleContent/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleContent::new
is_singleton: true
name: new
params: ()
visibility: public
PKz}[.��\��Ari/1.8/system/WSDL/XMLSchema/SimpleContent/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleContent#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PKz}[��g��Fri/1.8/system/WSDL/XMLSchema/SimpleContent/check_lexical_format-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleContent#check_lexical_format
is_singleton: false
name: check_lexical_format
params: (value)
visibility: public
PKz}[��V ��6ri/1.8/system/WSDL/XMLSchema/SimpleContent/base-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleContent#base
is_singleton: false
name: base
params: ()
visibility: public
PKz}[|�����Cri/1.8/system/WSDL/XMLSchema/SimpleContent/cdesc-SimpleContent.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: extension
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: restriction
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::SimpleContent
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: base
- !ruby/object:RI::MethodSummary 
  name: check
- !ruby/object:RI::MethodSummary 
  name: check_lexical_format
- !ruby/object:RI::MethodSummary 
  name: content
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: SimpleContent
superclass: Info
PKz}[U.U�qq1ri/1.8/system/WSDL/XMLSchema/cdesc-XMLSchema.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: AllName
  value: XSD::QName.new(XSD::Namespace, 'all')
- !ruby/object:RI::Constant 
  comment: 
  name: AnnotationName
  value: XSD::QName.new(XSD::Namespace, 'annotation')
- !ruby/object:RI::Constant 
  comment: 
  name: AnyName
  value: XSD::QName.new(XSD::Namespace, 'any')
- !ruby/object:RI::Constant 
  comment: 
  name: AttributeName
  value: XSD::QName.new(XSD::Namespace, 'attribute')
- !ruby/object:RI::Constant 
  comment: 
  name: ChoiceName
  value: XSD::QName.new(XSD::Namespace, 'choice')
- !ruby/object:RI::Constant 
  comment: 
  name: ComplexContentName
  value: XSD::QName.new(XSD::Namespace, 'complexContent')
- !ruby/object:RI::Constant 
  comment: 
  name: ComplexTypeName
  value: XSD::QName.new(XSD::Namespace, 'complexType')
- !ruby/object:RI::Constant 
  comment: 
  name: ElementName
  value: XSD::QName.new(XSD::Namespace, 'element')
- !ruby/object:RI::Constant 
  comment: 
  name: EnumerationName
  value: XSD::QName.new(XSD::Namespace, 'enumeration')
- !ruby/object:RI::Constant 
  comment: 
  name: ExtensionName
  value: XSD::QName.new(XSD::Namespace, 'extension')
- !ruby/object:RI::Constant 
  comment: 
  name: ImportName
  value: XSD::QName.new(XSD::Namespace, 'import')
- !ruby/object:RI::Constant 
  comment: 
  name: IncludeName
  value: XSD::QName.new(XSD::Namespace, 'include')
- !ruby/object:RI::Constant 
  comment: 
  name: LengthName
  value: XSD::QName.new(XSD::Namespace, 'length')
- !ruby/object:RI::Constant 
  comment: 
  name: PatternName
  value: XSD::QName.new(XSD::Namespace, 'pattern')
- !ruby/object:RI::Constant 
  comment: 
  name: RestrictionName
  value: XSD::QName.new(XSD::Namespace, 'restriction')
- !ruby/object:RI::Constant 
  comment: 
  name: SequenceName
  value: XSD::QName.new(XSD::Namespace, 'sequence')
- !ruby/object:RI::Constant 
  comment: 
  name: SchemaName
  value: XSD::QName.new(XSD::Namespace, 'schema')
- !ruby/object:RI::Constant 
  comment: 
  name: SimpleContentName
  value: XSD::QName.new(XSD::Namespace, 'simpleContent')
- !ruby/object:RI::Constant 
  comment: 
  name: SimpleTypeName
  value: XSD::QName.new(XSD::Namespace, 'simpleType')
- !ruby/object:RI::Constant 
  comment: 
  name: UniqueName
  value: XSD::QName.new(XSD::Namespace, 'unique')
- !ruby/object:RI::Constant 
  comment: 
  name: AttributeFormDefaultAttrName
  value: XSD::QName.new(nil, 'attributeFormDefault')
- !ruby/object:RI::Constant 
  comment: 
  name: BaseAttrName
  value: XSD::QName.new(nil, 'base')
- !ruby/object:RI::Constant 
  comment: 
  name: DefaultAttrName
  value: XSD::QName.new(nil, 'default')
- !ruby/object:RI::Constant 
  comment: 
  name: ElementFormDefaultAttrName
  value: XSD::QName.new(nil, 'elementFormDefault')
- !ruby/object:RI::Constant 
  comment: 
  name: FinalAttrName
  value: XSD::QName.new(nil, 'final')
- !ruby/object:RI::Constant 
  comment: 
  name: FixedAttrName
  value: XSD::QName.new(nil, 'fixed')
- !ruby/object:RI::Constant 
  comment: 
  name: FormAttrName
  value: XSD::QName.new(nil, 'form')
- !ruby/object:RI::Constant 
  comment: 
  name: IdAttrName
  value: XSD::QName.new(nil, 'id')
- !ruby/object:RI::Constant 
  comment: 
  name: MaxOccursAttrName
  value: XSD::QName.new(nil, 'maxOccurs')
- !ruby/object:RI::Constant 
  comment: 
  name: MinOccursAttrName
  value: XSD::QName.new(nil, 'minOccurs')
- !ruby/object:RI::Constant 
  comment: 
  name: MixedAttrName
  value: XSD::QName.new(nil, 'mixed')
- !ruby/object:RI::Constant 
  comment: 
  name: NameAttrName
  value: XSD::QName.new(nil, 'name')
- !ruby/object:RI::Constant 
  comment: 
  name: NamespaceAttrName
  value: XSD::QName.new(nil, 'namespace')
- !ruby/object:RI::Constant 
  comment: 
  name: NillableAttrName
  value: XSD::QName.new(nil, 'nillable')
- !ruby/object:RI::Constant 
  comment: 
  name: ProcessContentsAttrName
  value: XSD::QName.new(nil, 'processContents')
- !ruby/object:RI::Constant 
  comment: 
  name: RefAttrName
  value: XSD::QName.new(nil, 'ref')
- !ruby/object:RI::Constant 
  comment: 
  name: SchemaLocationAttrName
  value: XSD::QName.new(nil, 'schemaLocation')
- !ruby/object:RI::Constant 
  comment: 
  name: TargetNamespaceAttrName
  value: XSD::QName.new(nil, 'targetNamespace')
- !ruby/object:RI::Constant 
  comment: 
  name: TypeAttrName
  value: XSD::QName.new(nil, 'type')
- !ruby/object:RI::Constant 
  comment: 
  name: UseAttrName
  value: XSD::QName.new(nil, 'use')
- !ruby/object:RI::Constant 
  comment: 
  name: ValueAttrName
  value: XSD::QName.new(nil, 'value')
full_name: WSDL::XMLSchema
includes: []

instance_methods: []

name: XMLSchema
superclass: 
PKz}[�Q�q��>ri/1.8/system/WSDL/XMLSchema/Attribute/directelement%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Attribute#directelement?
is_singleton: false
name: directelement?
params: ()
visibility: private
PKz}[*�1���8ri/1.8/system/WSDL/XMLSchema/Attribute/refelement-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Attribute#refelement
is_singleton: false
name: refelement
params: ()
visibility: public
PKz}[Ή����8ri/1.8/system/WSDL/XMLSchema/Attribute/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Attribute#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKz}[�%%��=ri/1.8/system/WSDL/XMLSchema/Attribute/attr_reader_ref-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Attribute::attr_reader_ref
is_singleton: true
name: attr_reader_ref
params: (symbol)
visibility: public
PKz}[�>k���;ri/1.8/system/WSDL/XMLSchema/Attribute/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Attribute#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKz}[�f����;ri/1.8/system/WSDL/XMLSchema/Attribute/cdesc-Attribute.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: arytype
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: default
  rw: W
- !ruby/object:RI::Attribute 
  comment: 
  name: fixed
  rw: W
- !ruby/object:RI::Attribute 
  comment: 
  name: form
  rw: W
- !ruby/object:RI::Attribute 
  comment: 
  name: local_simpletype
  rw: W
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: W
- !ruby/object:RI::Attribute 
  comment: 
  name: ref
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: type
  rw: W
- !ruby/object:RI::Attribute 
  comment: 
  name: use
  rw: W
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: attr_reader_ref
- !ruby/object:RI::MethodSummary 
  name: attr_reader_ref
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::Attribute
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: directelement?
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: refelement
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: Attribute
superclass: Info
PKz}[�`d��1ri/1.8/system/WSDL/XMLSchema/Attribute/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Attribute::new
is_singleton: true
name: new
params: ()
visibility: public
PKz}[p�_���=ri/1.8/system/WSDL/XMLSchema/Attribute/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Attribute#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PKz}[@={C��:ri/1.8/system/WSDL/XMLSchema/Content/parse_epilogue-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Content#parse_epilogue
is_singleton: false
name: parse_epilogue
params: ()
visibility: public
PKz}[��j��6ri/1.8/system/WSDL/XMLSchema/Content/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Content#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKz}[��ټ��0ri/1.8/system/WSDL/XMLSchema/Content/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: content
comment: 
full_name: WSDL::XMLSchema::Content#each
is_singleton: false
name: each
params: () {|content| ...}
visibility: public
PKz}[������9ri/1.8/system/WSDL/XMLSchema/Content/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Content#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKz}[�C���/ri/1.8/system/WSDL/XMLSchema/Content/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Content::new
is_singleton: true
name: new
params: ()
visibility: public
PKz}[�v���;ri/1.8/system/WSDL/XMLSchema/Content/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Content#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PKz}[�nx~��;ri/1.8/system/WSDL/XMLSchema/Content/update_elements-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Content#update_elements
is_singleton: false
name: update_elements
params: ()
visibility: private
PKz}[���O��7ri/1.8/system/WSDL/XMLSchema/Content/cdesc-Content.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: contents
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: elements
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: final
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: mixed
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: type
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::Content
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: parse_epilogue
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
- !ruby/object:RI::MethodSummary 
  name: update_elements
name: Content
superclass: Info
PKz}[ad]ƹ�2ri/1.8/system/WSDL/XMLSchema/Content/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Content#<<
is_singleton: false
name: "<<"
params: (content)
visibility: public
PKz}[��@���=ri/1.8/system/WSDL/XMLSchema/ComplexContent/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexContent#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKz}[��O>��@ri/1.8/system/WSDL/XMLSchema/ComplexContent/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexContent#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKz}[ɵ@X  Eri/1.8/system/WSDL/XMLSchema/ComplexContent/cdesc-ComplexContent.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: attributes
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: base
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: content
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: derivetype
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::ComplexContent
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: basetype
- !ruby/object:RI::MethodSummary 
  name: elementformdefault
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: ComplexContent
superclass: Info
PKz}[�E�a��6ri/1.8/system/WSDL/XMLSchema/ComplexContent/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexContent::new
is_singleton: true
name: new
params: ()
visibility: public
PKz}[ۛF��Bri/1.8/system/WSDL/XMLSchema/ComplexContent/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexContent#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PKz}[�/޽��;ri/1.8/system/WSDL/XMLSchema/ComplexContent/basetype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexContent#basetype
is_singleton: false
name: basetype
params: ()
visibility: public
PKz}[3��K��Eri/1.8/system/WSDL/XMLSchema/ComplexContent/elementformdefault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexContent#elementformdefault
is_singleton: false
name: elementformdefault
params: ()
visibility: public
PKz}[;�����:ri/1.8/system/WSDL/XMLSchema/Enumeration/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Enumeration#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKz}[�2���=ri/1.8/system/WSDL/XMLSchema/Enumeration/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Enumeration#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKz}[ϝiQ��3ri/1.8/system/WSDL/XMLSchema/Enumeration/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Enumeration::new
is_singleton: true
name: new
params: ()
visibility: public
PKz}[�3�)gg?ri/1.8/system/WSDL/XMLSchema/Enumeration/cdesc-Enumeration.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::Enumeration
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
name: Enumeration
superclass: Info
PKz}[J�n��6ri/1.8/system/WSDL/XMLSchema/Schema/location%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Schema#location=
is_singleton: false
name: location=
params: (location)
visibility: public
PKz}[v�Ho��5ri/1.8/system/WSDL/XMLSchema/Schema/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Schema#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKz}[j�~X��8ri/1.8/system/WSDL/XMLSchema/Schema/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Schema#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKz}[�;zc��=ri/1.8/system/WSDL/XMLSchema/Schema/collect_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Schema#collect_attributes
is_singleton: false
name: collect_attributes
params: ()
visibility: public
PKz}[�/�S��8ri/1.8/system/WSDL/XMLSchema/Schema/parse_element-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Schema::parse_element
is_singleton: true
name: parse_element
params: (element)
visibility: public
PKz}[*�=��3ri/1.8/system/WSDL/XMLSchema/Schema/location-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Schema#location
is_singleton: false
name: location
params: ()
visibility: public
PKz}[�v~��;ri/1.8/system/WSDL/XMLSchema/Schema/collect_elements-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Schema#collect_elements
is_singleton: false
name: collect_elements
params: ()
visibility: public
PKz}[���	��?ri/1.8/system/WSDL/XMLSchema/Schema/collect_complextypes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Schema#collect_complextypes
is_singleton: false
name: collect_complextypes
params: ()
visibility: public
PKz}[FDZ>��.ri/1.8/system/WSDL/XMLSchema/Schema/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Schema::new
is_singleton: true
name: new
params: ()
visibility: public
PKz}[˕�{��>ri/1.8/system/WSDL/XMLSchema/Schema/collect_simpletypes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Schema#collect_simpletypes
is_singleton: false
name: collect_simpletypes
params: ()
visibility: public
PKz}[�Phvv5ri/1.8/system/WSDL/XMLSchema/Schema/cdesc-Schema.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: attributeformdefault
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: attributes
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: complextypes
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: elementformdefault
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: elements
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: importedschema
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: imports
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: simpletypes
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: targetnamespace
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: parse_element
comment: 
constants: []

full_name: WSDL::XMLSchema::Schema
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: collect_attributes
- !ruby/object:RI::MethodSummary 
  name: collect_complextypes
- !ruby/object:RI::MethodSummary 
  name: collect_elements
- !ruby/object:RI::MethodSummary 
  name: collect_simpletypes
- !ruby/object:RI::MethodSummary 
  name: location
- !ruby/object:RI::MethodSummary 
  name: location=
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
name: Schema
superclass: Info
PKz}[2ERZZ5ri/1.8/system/WSDL/XMLSchema/Import/cdesc-Import.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: content
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: namespace
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: schemalocation
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::Import
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: import
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
name: Import
superclass: Info
PKz}[�-2��5ri/1.8/system/WSDL/XMLSchema/Import/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Import#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKz}[8�$D��8ri/1.8/system/WSDL/XMLSchema/Import/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Import#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKz}[��ȱ�.ri/1.8/system/WSDL/XMLSchema/Import/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Import::new
is_singleton: true
name: new
params: ()
visibility: public
PKz}[��E��1ri/1.8/system/WSDL/XMLSchema/Import/import-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Import#import
is_singleton: false
name: import
params: (location)
visibility: private
PKz}[e�D���@ri/1.8/system/WSDL/XMLSchema/SimpleRestriction/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleRestriction#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PKz}[��&+��Cri/1.8/system/WSDL/XMLSchema/SimpleRestriction/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleRestriction#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PKz}[�X%�VVKri/1.8/system/WSDL/XMLSchema/SimpleRestriction/cdesc-SimpleRestriction.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: base
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: enumeration
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: length
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: pattern
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::SimpleRestriction
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: check_length
- !ruby/object:RI::MethodSummary 
  name: check_pattern
- !ruby/object:RI::MethodSummary 
  name: check_restriction
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: valid?
name: SimpleRestriction
superclass: Info
PKz}[z�2��Gri/1.8/system/WSDL/XMLSchema/SimpleRestriction/check_restriction-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleRestriction#check_restriction
is_singleton: false
name: check_restriction
params: (value)
visibility: private
PKz}[4V,���Bri/1.8/system/WSDL/XMLSchema/SimpleRestriction/check_length-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleRestriction#check_length
is_singleton: false
name: check_length
params: (value)
visibility: private
PKz}[�k���9ri/1.8/system/WSDL/XMLSchema/SimpleRestriction/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleRestriction::new
is_singleton: true
name: new
params: ()
visibility: public
PKz}[�����>ri/1.8/system/WSDL/XMLSchema/SimpleRestriction/valid%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleRestriction#valid?
is_singleton: false
name: valid?
params: (value)
visibility: public
PKz}[V��B��Cri/1.8/system/WSDL/XMLSchema/SimpleRestriction/check_pattern-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::SimpleRestriction#check_pattern
is_singleton: false
name: check_pattern
params: (value)
visibility: private
PKz}[6���2ri/1.8/system/WSDL/XMLSchema/Importer/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Importer#parse
is_singleton: false
name: parse
params: (content, location, originalroot)
visibility: private
PKz}[�L<z��3ri/1.8/system/WSDL/XMLSchema/Importer/import-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Importer::import
is_singleton: true
name: import
params: (location, originalroot = nil)
visibility: public
PKz}[�8���0ri/1.8/system/WSDL/XMLSchema/Importer/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Importer::new
is_singleton: true
name: new
params: ()
visibility: public
PK{}[IC-C��7ri/1.8/system/WSDL/XMLSchema/Importer/web_client-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Importer#web_client
is_singleton: false
name: web_client
params: ()
visibility: private
PK{}[^��Z��9ri/1.8/system/WSDL/XMLSchema/Importer/cdesc-Importer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: import
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::Importer
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: fetch
- !ruby/object:RI::MethodSummary 
  name: import
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: web_client
name: Importer
superclass: Object
PK{}[��?��2ri/1.8/system/WSDL/XMLSchema/Importer/fetch-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Importer#fetch
is_singleton: false
name: fetch
params: (location)
visibility: private
PK{}[?�]��3ri/1.8/system/WSDL/XMLSchema/Importer/import-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Importer#import
is_singleton: false
name: import
params: (location, originalroot = nil)
visibility: public
PK{}[��<`ri/1.8/system/WSDL/XMLSchema/Parser/AttributeConstraintError/cdesc-AttributeConstraintError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WSDL::XMLSchema::Parser::AttributeConstraintError
includes: []

instance_methods: []

name: AttributeConstraintError
superclass: FormatDecodeError
PK{}[��%��Rri/1.8/system/WSDL/XMLSchema/Parser/FormatDecodeError/cdesc-FormatDecodeError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WSDL::XMLSchema::Parser::FormatDecodeError
includes: []

instance_methods: []

name: FormatDecodeError
superclass: ParseError
PK{}[X9��9ri/1.8/system/WSDL/XMLSchema/Parser/decode_tag_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Parser#decode_tag_end
is_singleton: false
name: decode_tag_end
params: (ns, node)
visibility: private
PK{}[��9��Zri/1.8/system/WSDL/XMLSchema/Parser/UnknownAttributeError/cdesc-UnknownAttributeError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WSDL::XMLSchema::Parser::UnknownAttributeError
includes: []

instance_methods: []

name: UnknownAttributeError
superclass: FormatDecodeError
PK{}[�����0ri/1.8/system/WSDL/XMLSchema/Parser/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Parser#parse
is_singleton: false
name: parse
params: (string_or_readable)
visibility: public
PK{}[@P���Vri/1.8/system/WSDL/XMLSchema/Parser/UnknownElementError/cdesc-UnknownElementError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WSDL::XMLSchema::Parser::UnknownElementError
includes: []

instance_methods: []

name: UnknownElementError
superclass: FormatDecodeError
PK{}[A����\ri/1.8/system/WSDL/XMLSchema/Parser/ElementConstraintError/cdesc-ElementConstraintError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WSDL::XMLSchema::Parser::ElementConstraintError
includes: []

instance_methods: []

name: ElementConstraintError
superclass: FormatDecodeError
PK{}[�!��5ri/1.8/system/WSDL/XMLSchema/Parser/cdesc-Parser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::Parser
includes: 
- !ruby/object:RI::IncludedModule 
  name: XSD
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: characters
- !ruby/object:RI::MethodSummary 
  name: charset
- !ruby/object:RI::MethodSummary 
  name: decode_tag
- !ruby/object:RI::MethodSummary 
  name: decode_tag_end
- !ruby/object:RI::MethodSummary 
  name: decode_text
- !ruby/object:RI::MethodSummary 
  name: end_element
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: start_element
name: Parser
superclass: Object
PK{}[�05��.ri/1.8/system/WSDL/XMLSchema/Parser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Parser::new
is_singleton: true
name: new
params: (opt = {})
visibility: public
PK{}[_����6ri/1.8/system/WSDL/XMLSchema/Parser/end_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Parser#end_element
is_singleton: false
name: end_element
params: (name)
visibility: public
PK{}[K����8ri/1.8/system/WSDL/XMLSchema/Parser/start_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Parser#start_element
is_singleton: false
name: start_element
params: (name, attrs)
visibility: public
PK{}[�d#���Dri/1.8/system/WSDL/XMLSchema/Parser/ParseError/cdesc-ParseError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WSDL::XMLSchema::Parser::ParseError
includes: []

instance_methods: []

name: ParseError
superclass: Error
PK{}[�x�ڹ�2ri/1.8/system/WSDL/XMLSchema/Parser/charset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Parser#charset
is_singleton: false
name: charset
params: ()
visibility: public
PK{}[��9[��5ri/1.8/system/WSDL/XMLSchema/Parser/characters-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Parser#characters
is_singleton: false
name: characters
params: (text)
visibility: public
PK{}[��P��6ri/1.8/system/WSDL/XMLSchema/Parser/decode_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Parser#decode_text
is_singleton: false
name: decode_text
params: (ns, text)
visibility: private
PK{}[z����\ri/1.8/system/WSDL/XMLSchema/Parser/UnexpectedElementError/cdesc-UnexpectedElementError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WSDL::XMLSchema::Parser::UnexpectedElementError
includes: []

instance_methods: []

name: UnexpectedElementError
superclass: FormatDecodeError
PK{}[$u��5ri/1.8/system/WSDL/XMLSchema/Parser/decode_tag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Parser#decode_tag
is_singleton: false
name: decode_tag
params: (ns, name, attrs, parent)
visibility: private
PK{}[�~���9ri/1.8/system/WSDL/XMLSchema/Parser/ParseFrame/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Parser::ParseFrame::new
is_singleton: true
name: new
params: (ns, name, node)
visibility: public
PK{}[��Dri/1.8/system/WSDL/XMLSchema/Parser/ParseFrame/cdesc-ParseFrame.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: node
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: ns
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::Parser::ParseFrame
includes: []

instance_methods: []

name: ParseFrame
superclass: Object
PK{}[{�r���:ri/1.8/system/WSDL/XMLSchema/ComplexType/check_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexType#check_type
is_singleton: false
name: check_type
params: ()
visibility: public
PK{}[;����Dri/1.8/system/WSDL/XMLSchema/ComplexType/find_element_by_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexType#find_element_by_name
is_singleton: false
name: find_element_by_name
params: (name)
visibility: public
PK{}[�Հ���:ri/1.8/system/WSDL/XMLSchema/ComplexType/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexType#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PK{}[������Iri/1.8/system/WSDL/XMLSchema/ComplexType/child_defined_complextype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexType#child_defined_complextype
is_singleton: false
name: child_defined_complextype
params: (name)
visibility: public
PK{}[��+L��Dri/1.8/system/WSDL/XMLSchema/ComplexType/sequence_elements%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexType#sequence_elements=
is_singleton: false
name: sequence_elements=
params: (elements)
visibility: public
PK{}[�5W���=ri/1.8/system/WSDL/XMLSchema/ComplexType/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexType#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PK{}[~a�e��:ri/1.8/system/WSDL/XMLSchema/ComplexType/child_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexType#child_type
is_singleton: false
name: child_type
params: (name = nil)
visibility: public
PK{}[�����<ri/1.8/system/WSDL/XMLSchema/ComplexType/compoundtype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexType#compoundtype
is_singleton: false
name: compoundtype
params: ()
visibility: public
PK{}[�X��bb?ri/1.8/system/WSDL/XMLSchema/ComplexType/cdesc-ComplexType.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: attributes
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: complexcontent
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: content
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: final
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: mixed
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: simplecontent
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: AnyAsElement
  value: Element.new(XSD::QName.new(nil, 'any'), XSD::AnyTypeName)
full_name: WSDL::XMLSchema::ComplexType
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: all_elements=
- !ruby/object:RI::MethodSummary 
  name: check_array_content
- !ruby/object:RI::MethodSummary 
  name: check_type
- !ruby/object:RI::MethodSummary 
  name: child_defined_complextype
- !ruby/object:RI::MethodSummary 
  name: child_type
- !ruby/object:RI::MethodSummary 
  name: compoundtype
- !ruby/object:RI::MethodSummary 
  name: content_arytype
- !ruby/object:RI::MethodSummary 
  name: each_element
- !ruby/object:RI::MethodSummary 
  name: element_simpletype
- !ruby/object:RI::MethodSummary 
  name: elementformdefault
- !ruby/object:RI::MethodSummary 
  name: find_aryelement
- !ruby/object:RI::MethodSummary 
  name: find_arytype
- !ruby/object:RI::MethodSummary 
  name: find_element
- !ruby/object:RI::MethodSummary 
  name: find_element_by_name
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: sequence_elements=
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: ComplexType
superclass: Info
PK{}[']�1��3ri/1.8/system/WSDL/XMLSchema/ComplexType/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexType::new
is_singleton: true
name: new
params: (name = nil)
visibility: public
PK|}[]�_]��?ri/1.8/system/WSDL/XMLSchema/ComplexType/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexType#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PK|}[6����<ri/1.8/system/WSDL/XMLSchema/ComplexType/find_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexType#find_element
is_singleton: false
name: find_element
params: (name)
visibility: public
PK|}[��}���Bri/1.8/system/WSDL/XMLSchema/ComplexType/element_simpletype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexType#element_simpletype
is_singleton: false
name: element_simpletype
params: (element)
visibility: private
PK|}[�c���?ri/1.8/system/WSDL/XMLSchema/ComplexType/find_aryelement-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexType#find_aryelement
is_singleton: false
name: find_aryelement
params: ()
visibility: public
PK|}[L����?ri/1.8/system/WSDL/XMLSchema/ComplexType/content_arytype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexType#content_arytype
is_singleton: false
name: content_arytype
params: ()
visibility: private
PK|}[ulcJ��?ri/1.8/system/WSDL/XMLSchema/ComplexType/all_elements%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexType#all_elements=
is_singleton: false
name: all_elements=
params: (elements)
visibility: public
PK|}[��P���<ri/1.8/system/WSDL/XMLSchema/ComplexType/each_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (AnyAsElement)
comment: 
full_name: WSDL::XMLSchema::ComplexType#each_element
is_singleton: false
name: each_element
params: () {|AnyAsElement| ...}
visibility: public
PK|}[Z��G��Bri/1.8/system/WSDL/XMLSchema/ComplexType/elementformdefault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexType#elementformdefault
is_singleton: false
name: elementformdefault
params: ()
visibility: public
PK|}[Z܅���Cri/1.8/system/WSDL/XMLSchema/ComplexType/check_array_content-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexType#check_array_content
is_singleton: false
name: check_array_content
params: (content)
visibility: private
PK|}[�HL���<ri/1.8/system/WSDL/XMLSchema/ComplexType/find_arytype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::ComplexType#find_arytype
is_singleton: false
name: find_arytype
params: ()
visibility: public
PK|}[@TI��6ri/1.8/system/WSDL/XMLSchema/Include/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Include#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PK|}[��m��9ri/1.8/system/WSDL/XMLSchema/Include/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Include#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PK|}[G�'J��/ri/1.8/system/WSDL/XMLSchema/Include/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Include::new
is_singleton: true
name: new
params: ()
visibility: public
PK|}[��7ri/1.8/system/WSDL/XMLSchema/Include/cdesc-Include.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: content
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: schemalocation
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::Include
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: import
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
name: Include
superclass: Info
PK|}[cO�.��2ri/1.8/system/WSDL/XMLSchema/Include/import-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Include#import
is_singleton: false
name: import
params: (location)
visibility: private
PK|}[h�.���<ri/1.8/system/WSDL/XMLSchema/Element/directelement%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Element#directelement?
is_singleton: false
name: directelement?
params: ()
visibility: private
PK|}[DI����6ri/1.8/system/WSDL/XMLSchema/Element/refelement-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Element#refelement
is_singleton: false
name: refelement
params: ()
visibility: public
PK|}[0mtT��7ri/1.8/system/WSDL/XMLSchema/Element/elementform-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Element#elementform
is_singleton: false
name: elementform
params: ()
visibility: public
PK|}[�@��6ri/1.8/system/WSDL/XMLSchema/Element/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Element#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PK|}[�����;ri/1.8/system/WSDL/XMLSchema/Element/attr_reader_ref-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Element::attr_reader_ref
is_singleton: true
name: attr_reader_ref
params: (symbol)
visibility: public
PK|}[D�l���9ri/1.8/system/WSDL/XMLSchema/Element/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Element#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PK|}[-7zi��7ri/1.8/system/WSDL/XMLSchema/Element/cdesc-Element.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: constraint
  rw: W
- !ruby/object:RI::Attribute 
  comment: 
  name: form
  rw: W
- !ruby/object:RI::Attribute 
  comment: 
  name: local_complextype
  rw: W
- !ruby/object:RI::Attribute 
  comment: 
  name: local_simpletype
  rw: W
- !ruby/object:RI::Attribute 
  comment: 
  name: maxoccurs
  rw: W
- !ruby/object:RI::Attribute 
  comment: 
  name: minoccurs
  rw: W
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: W
- !ruby/object:RI::Attribute 
  comment: 
  name: nillable
  rw: W
- !ruby/object:RI::Attribute 
  comment: 
  name: ref
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: type
  rw: W
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: attr_reader_ref
- !ruby/object:RI::MethodSummary 
  name: attr_reader_ref
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::Element
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: attributes
- !ruby/object:RI::MethodSummary 
  name: directelement?
- !ruby/object:RI::MethodSummary 
  name: elementform
- !ruby/object:RI::MethodSummary 
  name: elementformdefault
- !ruby/object:RI::MethodSummary 
  name: map_as_array?
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: refelement
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: Element
superclass: Info
PK|}[�:��/ri/1.8/system/WSDL/XMLSchema/Element/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Element::new
is_singleton: true
name: new
params: (name = nil, type = nil)
visibility: public
PK|}[�E�"��;ri/1.8/system/WSDL/XMLSchema/Element/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Element#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PK|}[�Ҏ���;ri/1.8/system/WSDL/XMLSchema/Element/map_as_array%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Element#map_as_array?
is_singleton: false
name: map_as_array?
params: ()
visibility: public
PK|}[�,���6ri/1.8/system/WSDL/XMLSchema/Element/attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Element#attributes
is_singleton: false
name: attributes
params: ()
visibility: public
PK|}[m�xx��>ri/1.8/system/WSDL/XMLSchema/Element/elementformdefault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Element#elementformdefault
is_singleton: false
name: elementformdefault
params: ()
visibility: public
PK}}[�Ԕ��2ri/1.8/system/WSDL/XMLSchema/All/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::All#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PK}}[+p���5ri/1.8/system/WSDL/XMLSchema/All/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::All#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PK}}[ꎠ��+ri/1.8/system/WSDL/XMLSchema/All/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::All::new
is_singleton: true
name: new
params: ()
visibility: public
PK}}[��@��7ri/1.8/system/WSDL/XMLSchema/All/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::All#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PK}}[��ݵ�.ri/1.8/system/WSDL/XMLSchema/All/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::All#<<
is_singleton: false
name: "<<"
params: (element)
visibility: public
PK}}[�C����/ri/1.8/system/WSDL/XMLSchema/All/cdesc-All.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: elements
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: maxoccurs
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: minoccurs
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::All
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: elementformdefault
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: All
superclass: Info
PK}}[���:ri/1.8/system/WSDL/XMLSchema/All/elementformdefault-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::All#elementformdefault
is_singleton: false
name: elementformdefault
params: ()
visibility: public
PK}}[��h��5ri/1.8/system/WSDL/XMLSchema/Unique/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Unique#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PK}}[� �-��8ri/1.8/system/WSDL/XMLSchema/Unique/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Unique#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PK}}[�w�E��.ri/1.8/system/WSDL/XMLSchema/Unique/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::XMLSchema::Unique::new
is_singleton: true
name: new
params: ()
visibility: public
PK}}[�mt�]]5ri/1.8/system/WSDL/XMLSchema/Unique/cdesc-Unique.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::XMLSchema::Unique
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
name: Unique
superclass: Info
PK}}[������)ri/1.8/system/WSDL/Error/cdesc-Error.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WSDL::Error
includes: []

instance_methods: []

name: Error
superclass: StandardError
PK}}[V
:��.ri/1.8/system/WSDL/Operation/inputparts-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Operation#inputparts
is_singleton: false
name: inputparts
params: ()
visibility: public
PK}}[h�ֆ��-ri/1.8/system/WSDL/Operation/inputname-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Operation#inputname
is_singleton: false
name: inputname
params: ()
visibility: public
PK}}[�T�i��.ri/1.8/system/WSDL/Operation/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Operation#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PK}}[�ֻ)��1ri/1.8/system/WSDL/Operation/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Operation#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PK}}[�:��'ri/1.8/system/WSDL/Operation/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Operation::new
is_singleton: true
name: new
params: ()
visibility: public
PK}}[��,y��3ri/1.8/system/WSDL/Operation/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Operation#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PK}}[^�g���0ri/1.8/system/WSDL/Operation/NameInfo/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Operation::NameInfo::new
is_singleton: true
name: new
params: (op_name, optype_name, parts)
visibility: public
PK}}[��\���9ri/1.8/system/WSDL/Operation/NameInfo/cdesc-NameInfo.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: op_name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: optype_name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: parts
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::Operation::NameInfo
includes: []

instance_methods: []

name: NameInfo
superclass: Object
PK�}[�	��.ri/1.8/system/WSDL/Operation/input_info-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Operation#input_info
is_singleton: false
name: input_info
params: ()
visibility: public
PK�}[q�\��.ri/1.8/system/WSDL/Operation/sort_parts-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Operation#sort_parts
is_singleton: false
name: sort_parts
params: (parts)
visibility: private
PK�}[h2zw��1ri/1.8/system/WSDL/Operation/cdesc-Operation.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: fault
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: input
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: output
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: parameter_order
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: type
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::Operation
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: input_info
- !ruby/object:RI::MethodSummary 
  name: inputname
- !ruby/object:RI::MethodSummary 
  name: inputparts
- !ruby/object:RI::MethodSummary 
  name: output_info
- !ruby/object:RI::MethodSummary 
  name: outputname
- !ruby/object:RI::MethodSummary 
  name: outputparts
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: sort_parts
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: Operation
superclass: Info
PK�}[V_c?��.ri/1.8/system/WSDL/Operation/outputname-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Operation#outputname
is_singleton: false
name: outputname
params: ()
visibility: public
PK�}[�^ ��/ri/1.8/system/WSDL/Operation/outputparts-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Operation#outputparts
is_singleton: false
name: outputparts
params: ()
visibility: public
PK�}[mԹ�/ri/1.8/system/WSDL/Operation/output_info-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Operation#output_info
is_singleton: false
name: output_info
params: ()
visibility: public
PK�}[J4k���5ri/1.8/system/WSDL/OperationBinding/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::OperationBinding#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PK�}[=�T��8ri/1.8/system/WSDL/OperationBinding/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::OperationBinding#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PK�}[�%��>ri/1.8/system/WSDL/OperationBinding/soapoperation_style-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::OperationBinding#soapoperation_style
is_singleton: false
name: soapoperation_style
params: ()
visibility: public
PK�}[�w���9ri/1.8/system/WSDL/OperationBinding/find_operation-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::OperationBinding#find_operation
is_singleton: false
name: find_operation
params: ()
visibility: public
PK�}[������.ri/1.8/system/WSDL/OperationBinding/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::OperationBinding::new
is_singleton: true
name: new
params: ()
visibility: public
PK�}[m��o��:ri/1.8/system/WSDL/OperationBinding/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::OperationBinding#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PK�}[�}�=��5ri/1.8/system/WSDL/OperationBinding/soapaction-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::OperationBinding#soapaction
is_singleton: false
name: soapaction
params: ()
visibility: public
PK�}[TT���=ri/1.8/system/WSDL/OperationBinding/soapoperation_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::OperationBinding#soapoperation_name
is_singleton: false
name: soapoperation_name
params: ()
visibility: public
PK�}[)祺�3ri/1.8/system/WSDL/OperationBinding/porttype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::OperationBinding#porttype
is_singleton: false
name: porttype
params: ()
visibility: public
PK�}[��?ri/1.8/system/WSDL/OperationBinding/cdesc-OperationBinding.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: fault
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: input
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: output
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: soapoperation
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::OperationBinding
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: find_operation
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: porttype
- !ruby/object:RI::MethodSummary 
  name: soapaction
- !ruby/object:RI::MethodSummary 
  name: soapoperation_name
- !ruby/object:RI::MethodSummary 
  name: soapoperation_style
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: OperationBinding
superclass: Info
PK�}[����$$"ri/1.8/system/WSDL/cdesc-WSDL.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: This program is copyrighted free software by NAKAMURA, Hiroshi. You can redistribute it and/or modify it under the same terms of Ruby's license; either the dual license version in 2003, or any later version.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ArrayTypeAttrName
  value: XSD::QName.new(Namespace, 'arrayType')
- !ruby/object:RI::Constant 
  comment: 
  name: BindingName
  value: XSD::QName.new(Namespace, 'binding')
- !ruby/object:RI::Constant 
  comment: 
  name: DefinitionsName
  value: XSD::QName.new(Namespace, 'definitions')
- !ruby/object:RI::Constant 
  comment: 
  name: DocumentationName
  value: XSD::QName.new(Namespace, 'documentation')
- !ruby/object:RI::Constant 
  comment: 
  name: FaultName
  value: XSD::QName.new(Namespace, 'fault')
- !ruby/object:RI::Constant 
  comment: 
  name: ImportName
  value: XSD::QName.new(Namespace, 'import')
- !ruby/object:RI::Constant 
  comment: 
  name: InputName
  value: XSD::QName.new(Namespace, 'input')
- !ruby/object:RI::Constant 
  comment: 
  name: MessageName
  value: XSD::QName.new(Namespace, 'message')
- !ruby/object:RI::Constant 
  comment: 
  name: OperationName
  value: XSD::QName.new(Namespace, 'operation')
- !ruby/object:RI::Constant 
  comment: 
  name: OutputName
  value: XSD::QName.new(Namespace, 'output')
- !ruby/object:RI::Constant 
  comment: 
  name: PartName
  value: XSD::QName.new(Namespace, 'part')
- !ruby/object:RI::Constant 
  comment: 
  name: PortName
  value: XSD::QName.new(Namespace, 'port')
- !ruby/object:RI::Constant 
  comment: 
  name: PortTypeName
  value: XSD::QName.new(Namespace, 'portType')
- !ruby/object:RI::Constant 
  comment: 
  name: ServiceName
  value: XSD::QName.new(Namespace, 'service')
- !ruby/object:RI::Constant 
  comment: 
  name: TypesName
  value: XSD::QName.new(Namespace, 'types')
- !ruby/object:RI::Constant 
  comment: 
  name: SchemaName
  value: XSD::QName.new(XSD::Namespace, 'schema')
- !ruby/object:RI::Constant 
  comment: 
  name: SOAPAddressName
  value: XSD::QName.new(SOAPBindingNamespace, 'address')
- !ruby/object:RI::Constant 
  comment: 
  name: SOAPBindingName
  value: XSD::QName.new(SOAPBindingNamespace, 'binding')
- !ruby/object:RI::Constant 
  comment: 
  name: SOAPHeaderName
  value: XSD::QName.new(SOAPBindingNamespace, 'header')
- !ruby/object:RI::Constant 
  comment: 
  name: SOAPBodyName
  value: XSD::QName.new(SOAPBindingNamespace, 'body')
- !ruby/object:RI::Constant 
  comment: 
  name: SOAPFaultName
  value: XSD::QName.new(SOAPBindingNamespace, 'fault')
- !ruby/object:RI::Constant 
  comment: 
  name: SOAPOperationName
  value: XSD::QName.new(SOAPBindingNamespace, 'operation')
- !ruby/object:RI::Constant 
  comment: 
  name: BindingAttrName
  value: XSD::QName.new(nil, 'binding')
- !ruby/object:RI::Constant 
  comment: 
  name: ElementAttrName
  value: XSD::QName.new(nil, 'element')
- !ruby/object:RI::Constant 
  comment: 
  name: LocationAttrName
  value: XSD::QName.new(nil, 'location')
- !ruby/object:RI::Constant 
  comment: 
  name: MessageAttrName
  value: XSD::QName.new(nil, 'message')
- !ruby/object:RI::Constant 
  comment: 
  name: NameAttrName
  value: XSD::QName.new(nil, 'name')
- !ruby/object:RI::Constant 
  comment: 
  name: NamespaceAttrName
  value: XSD::QName.new(nil, 'namespace')
- !ruby/object:RI::Constant 
  comment: 
  name: ParameterOrderAttrName
  value: XSD::QName.new(nil, 'parameterOrder')
- !ruby/object:RI::Constant 
  comment: 
  name: TargetNamespaceAttrName
  value: XSD::QName.new(nil, 'targetNamespace')
- !ruby/object:RI::Constant 
  comment: 
  name: TypeAttrName
  value: XSD::QName.new(nil, 'type')
- !ruby/object:RI::Constant 
  comment: 
  name: Version
  value: "'0.0.2'"
- !ruby/object:RI::Constant 
  comment: 
  name: Namespace
  value: "'http://schemas.xmlsoap.org/wsdl/'"
- !ruby/object:RI::Constant 
  comment: 
  name: SOAPBindingNamespace
  value: "'http://schemas.xmlsoap.org/wsdl/soap/'"
full_name: WSDL
includes: []

instance_methods: []

name: WSDL
superclass: 
PK�}[��̷�/ri/1.8/system/WSDL/Definitions/porttypes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#porttypes
is_singleton: false
name: porttypes
params: ()
visibility: public
PK�}[�����-ri/1.8/system/WSDL/Definitions/binding-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#binding
is_singleton: false
name: binding
params: (name)
visibility: public
PK�}[>mb���0ri/1.8/system/WSDL/Definitions/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PK�}[
���6ri/1.8/system/WSDL/Definitions/porttype_binding-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#porttype_binding
is_singleton: false
name: porttype_binding
params: (name)
visibility: public
PK�}[��|���.ri/1.8/system/WSDL/Definitions/bindings-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#bindings
is_singleton: false
name: bindings
params: ()
visibility: public
PK�}[y�����7ri/1.8/system/WSDL/Definitions/array_complextype-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions::array_complextype
is_singleton: true
name: array_complextype
params: ()
visibility: public
PK�}[A���.ri/1.8/system/WSDL/Definitions/services-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#services
is_singleton: false
name: services
params: ()
visibility: public
PK�}[��^��3ri/1.8/system/WSDL/Definitions/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PK�}[�oc���8ri/1.8/system/WSDL/Definitions/collect_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#collect_attributes
is_singleton: false
name: collect_attributes
params: ()
visibility: public
PK�}[.AU��3ri/1.8/system/WSDL/Definitions/parse_element-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions::parse_element
is_singleton: true
name: parse_element
params: (element)
visibility: public
PK�}[���.��-ri/1.8/system/WSDL/Definitions/service-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#service
is_singleton: false
name: service
params: (name)
visibility: public
PK�}[X[���6ri/1.8/system/WSDL/Definitions/collect_elements-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#collect_elements
is_singleton: false
name: collect_elements
params: ()
visibility: public
PK�}[���:ri/1.8/system/WSDL/Definitions/collect_complextypes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#collect_complextypes
is_singleton: false
name: collect_complextypes
params: ()
visibility: public
PK�}[�<�ڳ�-ri/1.8/system/WSDL/Definitions/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�}[?�h���7ri/1.8/system/WSDL/Definitions/fault_complextype-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions::fault_complextype
is_singleton: true
name: fault_complextype
params: ()
visibility: public
PK�}[�脹��)ri/1.8/system/WSDL/Definitions/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions::new
is_singleton: true
name: new
params: ()
visibility: public
PK�}[�MWS��5ri/1.8/system/WSDL/Definitions/cdesc-Definitions.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: importedschema
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: imports
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: location
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: targetnamespace
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: array_complextype
- !ruby/object:RI::MethodSummary 
  name: exception_complextype
- !ruby/object:RI::MethodSummary 
  name: fault_complextype
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: soap_rpc_complextypes
comment: 
constants: []

full_name: WSDL::Definitions
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_type
- !ruby/object:RI::MethodSummary 
  name: binding
- !ruby/object:RI::MethodSummary 
  name: bindings
- !ruby/object:RI::MethodSummary 
  name: collect_attributes
- !ruby/object:RI::MethodSummary 
  name: collect_complextypes
- !ruby/object:RI::MethodSummary 
  name: collect_elements
- !ruby/object:RI::MethodSummary 
  name: collect_fault_messages
- !ruby/object:RI::MethodSummary 
  name: collect_faulttypes
- !ruby/object:RI::MethodSummary 
  name: collect_simpletypes
- !ruby/object:RI::MethodSummary 
  name: elements_from_message
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: message
- !ruby/object:RI::MethodSummary 
  name: messages
- !ruby/object:RI::MethodSummary 
  name: op_bind_rpc?
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: porttype
- !ruby/object:RI::MethodSummary 
  name: porttype_binding
- !ruby/object:RI::MethodSummary 
  name: porttypes
- !ruby/object:RI::MethodSummary 
  name: rpc_operation_complextypes
- !ruby/object:RI::MethodSummary 
  name: service
- !ruby/object:RI::MethodSummary 
  name: services
- !ruby/object:RI::MethodSummary 
  name: soap_rpc_complextypes
- !ruby/object:RI::MethodSummary 
  name: targetnamespace=
name: Definitions
superclass: Info
PK�}[����;ri/1.8/system/WSDL/Definitions/exception_complextype-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions::exception_complextype
is_singleton: true
name: exception_complextype
params: ()
visibility: public
PK�}[6�Q.ri/1.8/system/WSDL/Definitions/add_type-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "ToDo: simpletype must be accepted..."
full_name: WSDL::Definitions#add_type
is_singleton: false
name: add_type
params: (complextype)
visibility: public
PK�}["�q��8ri/1.8/system/WSDL/Definitions/collect_faulttypes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#collect_faulttypes
is_singleton: false
name: collect_faulttypes
params: ()
visibility: public
PK�}[U���;ri/1.8/system/WSDL/Definitions/soap_rpc_complextypes-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions::soap_rpc_complextypes
is_singleton: true
name: soap_rpc_complextypes
params: ()
visibility: public
PK�}[>,���;ri/1.8/system/WSDL/Definitions/soap_rpc_complextypes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#soap_rpc_complextypes
is_singleton: false
name: soap_rpc_complextypes
params: (binding)
visibility: public
PK�}[������-ri/1.8/system/WSDL/Definitions/message-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#message
is_singleton: false
name: message
params: (name)
visibility: public
PK�}[>S̓��9ri/1.8/system/WSDL/Definitions/collect_simpletypes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#collect_simpletypes
is_singleton: false
name: collect_simpletypes
params: ()
visibility: public
PK�}[�z]P��4ri/1.8/system/WSDL/Definitions/op_bind_rpc%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#op_bind_rpc?
is_singleton: false
name: op_bind_rpc?
params: (op_bind)
visibility: private
PK�}[�y����@ri/1.8/system/WSDL/Definitions/rpc_operation_complextypes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#rpc_operation_complextypes
is_singleton: false
name: rpc_operation_complextypes
params: (binding)
visibility: private
PK�}[�?�S��;ri/1.8/system/WSDL/Definitions/elements_from_message-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#elements_from_message
is_singleton: false
name: elements_from_message
params: (message)
visibility: private
PK�}[��Z��8ri/1.8/system/WSDL/Definitions/targetnamespace%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#targetnamespace=
is_singleton: false
name: targetnamespace=
params: (targetnamespace)
visibility: public
PK�}[�h�ݹ�.ri/1.8/system/WSDL/Definitions/porttype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#porttype
is_singleton: false
name: porttype
params: (name)
visibility: public
PK�}[a���.ri/1.8/system/WSDL/Definitions/messages-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#messages
is_singleton: false
name: messages
params: ()
visibility: public
PK�}[�A���<ri/1.8/system/WSDL/Definitions/collect_fault_messages-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Definitions#collect_fault_messages
is_singleton: false
name: collect_fault_messages
params: ()
visibility: private
PK�}[��9��)ri/1.8/system/WSDL/Types/cdesc-Types.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: schemas
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::Types
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
name: Types
superclass: Info
PK�}[�7Uk��*ri/1.8/system/WSDL/Types/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Types#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PK�}[-�q��-ri/1.8/system/WSDL/Types/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Types#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PK�}[���#ri/1.8/system/WSDL/Types/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Types::new
is_singleton: true
name: new
params: ()
visibility: public
PK�}[>��II+ri/1.8/system/WSDL/Import/cdesc-Import.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: content
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: location
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: namespace
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::Import
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: import
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
name: Import
superclass: Info
PK�}[@���+ri/1.8/system/WSDL/Import/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Import#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PK�}[J��.ri/1.8/system/WSDL/Import/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Import#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PK�}[x�@��$ri/1.8/system/WSDL/Import/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Import::new
is_singleton: true
name: new
params: ()
visibility: public
PK�}[E�Q��'ri/1.8/system/WSDL/Import/import-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Import#import
is_singleton: false
name: import
params: (location)
visibility: private
PK�}[v�C��*ri/1.8/system/WSDL/Param/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Param#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PK�}[�\g��-ri/1.8/system/WSDL/Param/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Param#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PK�}[�U���,ri/1.8/system/WSDL/Param/find_message-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Param#find_message
is_singleton: false
name: find_message
params: ()
visibility: public
PK�}[�����#ri/1.8/system/WSDL/Param/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Param::new
is_singleton: true
name: new
params: ()
visibility: public
PK�}[g�%��/ri/1.8/system/WSDL/Param/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Param#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PK�}[�F|BB)ri/1.8/system/WSDL/Param/cdesc-Param.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: message
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: soapbody
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: soapfault
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: soapheader
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::Param
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: find_message
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: soapbody_use
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: Param
superclass: Info
PK�}[�)����,ri/1.8/system/WSDL/Param/soapbody_use-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Param#soapbody_use
is_singleton: false
name: soapbody_use
params: ()
visibility: public
PK�}[	�j��,ri/1.8/system/WSDL/Binding/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Binding#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PK�}[)dk���/ri/1.8/system/WSDL/Binding/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Binding#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PK�}[�{��%ri/1.8/system/WSDL/Binding/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Binding::new
is_singleton: true
name: new
params: ()
visibility: public
PK�}[�fܿ�1ri/1.8/system/WSDL/Binding/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Binding#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PK�}[��Hq��-ri/1.8/system/WSDL/Binding/cdesc-Binding.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: operations
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: soapbinding
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: type
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::Binding
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: Binding
superclass: Info
PK�}[�H|��(ri/1.8/system/WSDL/Importer/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Importer#parse
is_singleton: false
name: parse
params: (content, location, originalroot)
visibility: private
PK�}[�3sr��)ri/1.8/system/WSDL/Importer/import-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Importer::import
is_singleton: true
name: import
params: (location, originalroot = nil)
visibility: public
PK�}[�-�l11/ri/1.8/system/WSDL/Importer/cdesc-Importer.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: import
comment: 
constants: []

full_name: WSDL::Importer
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse
name: Importer
superclass: WSDL::XMLSchema::Importer
PK�}[H#|!��2ri/1.8/system/WSDL/Port/outputoperation_map-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Port#outputoperation_map
is_singleton: false
name: outputoperation_map
params: ()
visibility: public
PK�}[�P(��)ri/1.8/system/WSDL/Port/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Port#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PK�}[�����,ri/1.8/system/WSDL/Port/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Port#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PK�}[la�T��"ri/1.8/system/WSDL/Port/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Port::new
is_singleton: true
name: new
params: ()
visibility: public
PK�}[7T���.ri/1.8/system/WSDL/Port/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Port#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PK�}[OD]^��+ri/1.8/system/WSDL/Port/find_binding-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Port#find_binding
is_singleton: false
name: find_binding
params: ()
visibility: public
PK�}[�.9�22'ri/1.8/system/WSDL/Port/cdesc-Port.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: binding
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: soap_address
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::Port
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: find_binding
- !ruby/object:RI::MethodSummary 
  name: inputoperation_map
- !ruby/object:RI::MethodSummary 
  name: outputoperation_map
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: porttype
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: Port
superclass: Info
PK�}[e����1ri/1.8/system/WSDL/Port/inputoperation_map-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Port#inputoperation_map
is_singleton: false
name: inputoperation_map
params: ()
visibility: public
PK�}[,�{���'ri/1.8/system/WSDL/Port/porttype-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Port#porttype
is_singleton: false
name: porttype
params: ()
visibility: public
PK�}[�}#��-ri/1.8/system/WSDL/PortType/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::PortType#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PK�}[��y���0ri/1.8/system/WSDL/PortType/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::PortType#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PK�}[�X�8��&ri/1.8/system/WSDL/PortType/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::PortType::new
is_singleton: true
name: new
params: ()
visibility: public
PK�}[�����2ri/1.8/system/WSDL/PortType/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::PortType#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PK�}[�}}D��/ri/1.8/system/WSDL/PortType/find_binding-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::PortType#find_binding
is_singleton: false
name: find_binding
params: ()
visibility: public
PK�}[jz
F||/ri/1.8/system/WSDL/PortType/cdesc-PortType.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: operations
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::PortType
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: find_binding
- !ruby/object:RI::MethodSummary 
  name: locations
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: PortType
superclass: Info
PK�}[9�(7��,ri/1.8/system/WSDL/PortType/locations-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::PortType#locations
is_singleton: false
name: locations
params: ()
visibility: public
PK�}[I����Vri/1.8/system/WSDL/Parser/AttributeConstraintError/cdesc-AttributeConstraintError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WSDL::Parser::AttributeConstraintError
includes: []

instance_methods: []

name: AttributeConstraintError
superclass: FormatDecodeError
PK�}[k�����Hri/1.8/system/WSDL/Parser/FormatDecodeError/cdesc-FormatDecodeError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WSDL::Parser::FormatDecodeError
includes: []

instance_methods: []

name: FormatDecodeError
superclass: ParseError
PK�}[<��!��/ri/1.8/system/WSDL/Parser/decode_tag_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Parser#decode_tag_end
is_singleton: false
name: decode_tag_end
params: (ns, node)
visibility: private
PK�}[Ik���Pri/1.8/system/WSDL/Parser/UnknownAttributeError/cdesc-UnknownAttributeError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WSDL::Parser::UnknownAttributeError
includes: []

instance_methods: []

name: UnknownAttributeError
superclass: FormatDecodeError
PK�}[Q&3��&ri/1.8/system/WSDL/Parser/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Parser#parse
is_singleton: false
name: parse
params: (string_or_readable)
visibility: public
PK�}[�^W���Lri/1.8/system/WSDL/Parser/UnknownElementError/cdesc-UnknownElementError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WSDL::Parser::UnknownElementError
includes: []

instance_methods: []

name: UnknownElementError
superclass: FormatDecodeError
PK�}[�WD���Rri/1.8/system/WSDL/Parser/ElementConstraintError/cdesc-ElementConstraintError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WSDL::Parser::ElementConstraintError
includes: []

instance_methods: []

name: ElementConstraintError
superclass: FormatDecodeError
PK�}[��C���+ri/1.8/system/WSDL/Parser/cdesc-Parser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::Parser
includes: 
- !ruby/object:RI::IncludedModule 
  name: WSDL
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: characters
- !ruby/object:RI::MethodSummary 
  name: charset
- !ruby/object:RI::MethodSummary 
  name: decode_tag
- !ruby/object:RI::MethodSummary 
  name: decode_tag_end
- !ruby/object:RI::MethodSummary 
  name: decode_text
- !ruby/object:RI::MethodSummary 
  name: end_element
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: start_element
name: Parser
superclass: Object
PK�}[�lj5��$ri/1.8/system/WSDL/Parser/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Parser::new
is_singleton: true
name: new
params: (opt = {})
visibility: public
PK�}[������,ri/1.8/system/WSDL/Parser/end_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Parser#end_element
is_singleton: false
name: end_element
params: (name)
visibility: public
PK�}[w
����.ri/1.8/system/WSDL/Parser/start_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Parser#start_element
is_singleton: false
name: start_element
params: (name, attrs)
visibility: public
PK�}[lp�	��:ri/1.8/system/WSDL/Parser/ParseError/cdesc-ParseError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WSDL::Parser::ParseError
includes: []

instance_methods: []

name: ParseError
superclass: Error
PK�}[�$�ڮ�(ri/1.8/system/WSDL/Parser/charset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Parser#charset
is_singleton: false
name: charset
params: ()
visibility: public
PK�}[�,���+ri/1.8/system/WSDL/Parser/characters-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Parser#characters
is_singleton: false
name: characters
params: (text)
visibility: public
PK�}[:u����,ri/1.8/system/WSDL/Parser/decode_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Parser#decode_text
is_singleton: false
name: decode_text
params: (ns, text)
visibility: private
PK�}[�<*@��Rri/1.8/system/WSDL/Parser/UnexpectedElementError/cdesc-UnexpectedElementError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WSDL::Parser::UnexpectedElementError
includes: []

instance_methods: []

name: UnexpectedElementError
superclass: FormatDecodeError
PK�}[��z
��+ri/1.8/system/WSDL/Parser/decode_tag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Parser#decode_tag
is_singleton: false
name: decode_tag
params: (ns, name, attrs, parent)
visibility: private
PK�}[���/ri/1.8/system/WSDL/Parser/ParseFrame/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Parser::ParseFrame::new
is_singleton: true
name: new
params: (ns, name, node)
visibility: public
PK�}[S�"���:ri/1.8/system/WSDL/Parser/ParseFrame/cdesc-ParseFrame.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: node
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: ns
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::Parser::ParseFrame
includes: []

instance_methods: []

name: ParseFrame
superclass: Object
PK�}[������,ri/1.8/system/WSDL/Message/parse_attr-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Message#parse_attr
is_singleton: false
name: parse_attr
params: (attr, value)
visibility: public
PK�}[��!��/ri/1.8/system/WSDL/Message/parse_element-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Message#parse_element
is_singleton: false
name: parse_element
params: (element)
visibility: public
PK�}[e²��%ri/1.8/system/WSDL/Message/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Message::new
is_singleton: true
name: new
params: ()
visibility: public
PK�}[$>���1ri/1.8/system/WSDL/Message/targetnamespace-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: WSDL::Message#targetnamespace
is_singleton: false
name: targetnamespace
params: ()
visibility: public
PK�}[L���

-ri/1.8/system/WSDL/Message/cdesc-Message.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: name
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: parts
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: WSDL::Message
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse_attr
- !ruby/object:RI::MethodSummary 
  name: parse_element
- !ruby/object:RI::MethodSummary 
  name: targetnamespace
name: Message
superclass: Info
PK�}[�\2ʭ� ri/1.8/system/XML/cdesc-XML.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XML
includes: []

instance_methods: []

name: XML
superclass: 
PK�}[�y��*ri/1.8/system/XML/Parser/cdesc-Parser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: Error
  value: "::XMLParserError"
full_name: XML::Parser
includes: []

instance_methods: []

name: Parser
superclass: Object
PK�}[s����8ri/1.8/system/Errno/ECONNABORTED/cdesc-ECONNABORTED.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Errno::ECONNABORTED
includes: []

instance_methods: []

name: ECONNABORTED
superclass: SystemCallError
PK�}[��z��,ri/1.8/system/Errno/EPROTO/cdesc-EPROTO.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Errno::EPROTO
includes: []

instance_methods: []

name: EPROTO
superclass: SystemCallError
PK�}[\!f--$ri/1.8/system/Errno/cdesc-Errno.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: compat.rb -- cross platform compatibility
- !ruby/struct:SM::Flow::P 
  body: "Author: IPR -- Internet Programming with Ruby -- writers Copyright (c) 2002 GOTOU Yuuzou Copyright (c) 2002 Internet Programming with Ruby writers. All rights reserved."
- !ruby/struct:SM::Flow::P 
  body: "$IPR: compat.rb,v 1.6 2002/10/01 17:16:32 gotoyuzo Exp $"
constants: []

full_name: Errno
includes: []

instance_methods: []

name: Errno
superclass: 
PK�}[�kP��4ri/1.8/system/Errno/ECONNRESET/cdesc-ECONNRESET.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Errno::ECONNRESET
includes: []

instance_methods: []

name: ECONNRESET
superclass: SystemCallError
PK�}[F�j۽�,ri/1.8/system/TSortHash/cdesc-TSortHash.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: TSortHash
includes: []

instance_methods: []

name: TSortHash
superclass: Hash
PK�}[vG���.ri/1.8/system/RiDisplay/append_features-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RiDisplay::append_features
is_singleton: true
name: append_features
params: (display_class)
visibility: public
PK�}[�f�>��"ri/1.8/system/RiDisplay/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: RiDisplay::new
is_singleton: true
name: new
params: (*args)
visibility: public
PK�}[7�[���,ri/1.8/system/RiDisplay/cdesc-RiDisplay.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: append_features
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: This is a kind of 'flag' module. If you want to write your own 'ri' display module (perhaps because you'r writing an IDE or somesuch beast), you simply write a class which implements the various 'display' methods in 'DefaultDisplay', and include the 'RiDisplay' module in that class.
- !ruby/struct:SM::Flow::P 
  body: To access your class from the command line, you can do
- !ruby/struct:SM::Flow::VERB 
  body: "   ruby -r &lt;your source file&gt;  ../ri ....\n"
- !ruby/struct:SM::Flow::P 
  body: If folks <em>really</em> want to do this from the command line, I'll build an option in
constants: []

full_name: RiDisplay
includes: []

instance_methods: []

name: RiDisplay
superclass: 
PK�}[�r],ri/1.8/system/Timeout/Error/cdesc-Error.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Raised by Timeout#timeout when the block times out.
constants: []

full_name: Timeout::Error
includes: []

instance_methods: []

name: Error
superclass: Interrupt
PK�}[}����<ri/1.8/system/Timeout/ExitException/cdesc-ExitException.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Timeout::ExitException
includes: []

instance_methods: []

name: ExitException
superclass: "::Exception"
PK�}[ύ�0��$ri/1.8/system/Timeout/timeout-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: if sec == nil or sec.zero?
comment: 
- !ruby/struct:SM::Flow::P 
  body: Executes the method's block. If the block execution terminates before <tt>sec</tt> seconds has passed, it returns true. If not, it terminates the execution and raises <tt>exception</tt> (which defaults to Timeout::Error).
- !ruby/struct:SM::Flow::P 
  body: "Note that this is both a method of module Timeout, so you can 'include Timeout' into your classes so they have a #timeout method, as well as a module method, so you can call it directly as Timeout.timeout()."
full_name: Timeout#timeout
is_singleton: false
name: timeout
params: (sec, klass = nil) {|if sec == nil or sec.zero?| ...}
visibility: public
PK�}[�8]PP(ri/1.8/system/Timeout/cdesc-Timeout.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::H 
  level: 1
  text: Description
- !ruby/struct:SM::Flow::P 
  body: A way of performing a potentially long-running operation in a thread, and terminating it's execution if it hasn't finished within fixed amount of time.
- !ruby/struct:SM::Flow::P 
  body: "Previous versions of timeout didn't use a module for namespace. This version provides both Timeout.timeout, and a backwards-compatible #timeout."
- !ruby/struct:SM::Flow::H 
  level: 1
  text: Synopsis
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'timeout'\n  status = Timeout::timeout(5) {\n    # Something that should be interrupted if it takes too much time...\n  }\n"
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: THIS_FILE
  value: /\A#{Regexp.quote(__FILE__)}:/o
- !ruby/object:RI::Constant 
  comment: 
  name: CALLER_OFFSET
  value: "((c = caller[0]) && THIS_FILE =~ c) ? 1 : 0"
full_name: Timeout
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: timeout
name: Timeout
superclass: 
PK�}[�^��pp$ri/1.8/system/fatal/cdesc-fatal.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Descendents of class <tt>Exception</tt> are used to communicate between <tt>raise</tt> methods and <tt>rescue</tt> statements in <tt>begin/end</tt> blocks. <tt>Exception</tt> objects carry information about the exception---its type (the exception's class name), an optional descriptive string, and optional traceback information. Programs may subclass <tt>Exception</tt> to add additional information.
constants: []

full_name: fatal
includes: []

instance_methods: []

name: fatal
superclass: Exception
PK�}[��HLL%ri/1.8/system/Precision/prec_i-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an <tt>Integer</tt> converted from <em>num</em>. It is equivalent to <tt>prec(Integer)</tt>.
full_name: Precision#prec_i
is_singleton: false
name: prec_i
params: |
  num.prec_i  =>  Integer

visibility: public
PK�}[�����,ri/1.8/system/Precision/cdesc-Precision.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: included
comment: 
- !ruby/struct:SM::Flow::P 
  body: Precision is a mixin for concrete numeric classes with precision. Here, `precision' means the fineness of approximation of a real number, so, this module should not be included into anything which is not a subset of Real (so it should not be included in classes such as <tt>Complex</tt> or <tt>Matrix</tt>).
constants: []

full_name: Precision
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: prec
- !ruby/object:RI::MethodSummary 
  name: prec_f
- !ruby/object:RI::MethodSummary 
  name: prec_i
name: Precision
superclass: 
PK�}[�3�JJ#ri/1.8/system/Precision/prec-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts <em>self</em> into an instance of <em>klass</em>. By default, <tt>prec</tt> invokes
- !ruby/struct:SM::Flow::VERB 
  body: "   klass.induced_from(num)\n"
- !ruby/struct:SM::Flow::P 
  body: and returns its value. So, if <tt>klass.induced_from</tt> doesn't return an instance of <em>klass</em>, it will be necessary to reimplement <tt>prec</tt>.
full_name: Precision#prec
is_singleton: false
name: prec
params: |
  num.prec(klass)   => a_klass

visibility: public
PK�}[эQ�EE%ri/1.8/system/Precision/prec_f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a <tt>Float</tt> converted from <em>num</em>. It is equivalent to <tt>prec(Float)</tt>.
full_name: Precision#prec_f
is_singleton: false
name: prec_f
params: |
  num.prec_f  =>  Float

visibility: public
PK�}[
���'ri/1.8/system/Precision/included-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "call_seq:"
- !ruby/struct:SM::Flow::VERB 
  body: "  included\n"
- !ruby/struct:SM::Flow::P 
  body: When the <tt>Precision</tt> module is mixed-in to a class, this <tt>included</tt> method is used to add our default <tt>induced_from</tt> implementation to the host class.
full_name: Precision::included
is_singleton: true
name: included
params: (p1)
visibility: public
PK�}[ia_�==<ri/1.8/system/AmbiguousArgument/cdesc-AmbiguousArgument.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Raises when the given argument word can't be completed uniquely.
constants: []

full_name: AmbiguousArgument
includes: []

instance_methods: []

name: AmbiguousArgument
superclass: InvalidArgument
PK�}[�_,ri/1.8/system/SM/SimpleMarkup/content-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: for debugging, we allow access to our line contents as text
full_name: SM::SimpleMarkup#content
is_singleton: false
name: content
params: ()
visibility: public
PK�}[��`&&0ri/1.8/system/SM/SimpleMarkup/group_lines-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Return a block consisting of fragments which are paragraphs, list entries or verbatim text. We merge consecutive lines of the same type and level together. We are also slightly tricky with lists: the lines following a list introduction look like paragraph lines at the next level, and we remap them into list entries instead"
full_name: SM::SimpleMarkup#group_lines
is_singleton: false
name: group_lines
params: ()
visibility: private
PK�}[HN9��,ri/1.8/system/SM/SimpleMarkup/convert-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: We take a string, split it into lines, work out the type of each line, and from there deduce groups of lines (for example all lines in a paragraph). We then invoke the output formatter using a Visitor to display the result
full_name: SM::SimpleMarkup#convert
is_singleton: false
name: convert
params: (str, op)
visibility: public
PK�}[%�9ri/1.8/system/SM/SimpleMarkup/handled_labeled_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Handle labeled list entries, We have a special case to deal with. Because the labels can be long, they force the remaining block of text over the to right:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "this is a long label that I wrote:"
    body: and here is the block of text with a silly margin
  type: :NOTE
- !ruby/struct:SM::Flow::P 
  body: So we allow the special case. If the label is followed by nothing, and if the following line is indented, then we take the indent of that line as the new margin
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "this is a long label that I wrote:"
    body: here is a more reasonably indented block which will ab attached to the label.
  type: :NOTE
full_name: SM::SimpleMarkup#handled_labeled_list
is_singleton: false
name: handled_labeled_list
params: (line, level, margin, offset, prefix)
visibility: private
PK�}[��E�-ri/1.8/system/SM/SimpleMarkup/add_html-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Add to the sequences recognized as general markup
full_name: SM::SimpleMarkup#add_html
is_singleton: false
name: add_html
params: (tag, name)
visibility: public
PK�}[�֑�uu(ri/1.8/system/SM/SimpleMarkup/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: take a block of text and use various heuristics to determine it's structure (paragraphs, lists, and so on). Invoke an event handler as we identify significant chunks.
full_name: SM::SimpleMarkup::new
is_singleton: true
name: new
params: ()
visibility: public
PK�}[G�(G**0ri/1.8/system/SM/SimpleMarkup/add_special-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Add to other inline sequences. For example, we could add WikiWords using something like:"
- !ruby/struct:SM::Flow::VERB 
  body: "   parser.add_special(/\\b([A-Z][a-z]+[A-Z]\\w+)/, :WIKIWORD)\n"
- !ruby/struct:SM::Flow::P 
  body: Each wiki word will be presented to the output formatter via the accept_special method
full_name: SM::SimpleMarkup#add_special
is_singleton: false
name: add_special
params: (pattern, name)
visibility: public
PK�}[��a>��2ri/1.8/system/SM/SimpleMarkup/add_word_pair-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Add to the sequences used to add formatting to an individual word (such as <b>bold</b>). Matching entries will generate attibutes that the output formatters can recognize by their <tt>name</tt>
full_name: SM::SimpleMarkup#add_word_pair
is_singleton: false
name: add_word_pair
params: (start, stop, name)
visibility: public
PK�}[���G3ri/1.8/system/SM/SimpleMarkup/get_line_types-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: for debugging, return the list of line types
full_name: SM::SimpleMarkup#get_line_types
is_singleton: false
name: get_line_types
params: ()
visibility: public
PK�}[7����:ri/1.8/system/SM/SimpleMarkup/assign_types_to_lines-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Look through the text at line indentation. We flag each line as being Blank, a paragraph, a list element, or verbatim text
full_name: SM::SimpleMarkup#assign_types_to_lines
is_singleton: false
name: assign_types_to_lines
params: (margin = 0, level = 0)
visibility: private
PK�}[�I`�h
h
5ri/1.8/system/SM/SimpleMarkup/cdesc-SimpleMarkup.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Synopsis
- !ruby/struct:SM::Flow::P 
  body: This code converts <tt>input_string</tt>, which is in the format described in markup/simple_markup.rb, to HTML. The conversion takes place in the <tt>convert</tt> method, so you can use the same SimpleMarkup object to convert multiple input strings.
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'rdoc/markup/simple_markup'\n  require 'rdoc/markup/simple_markup/to_html'\n\n  p = SM::SimpleMarkup.new\n  h = SM::ToHtml.new\n\n  puts p.convert(input_string, h)\n"
- !ruby/struct:SM::Flow::P 
  body: "You can extend the SimpleMarkup parser to recognise new markup sequences, and to add special processing for text that matches a regular epxression. Here we make WikiWords significant to the parser, and also make the sequences {word} and &lt;no&gt;text...&lt;/no&gt; signify strike-through text. When then subclass the HTML output class to deal with these:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'rdoc/markup/simple_markup'\n  require 'rdoc/markup/simple_markup/to_html'\n\n  class WikiHtml &lt; SM::ToHtml\n    def handle_special_WIKIWORD(special)\n      &quot;&lt;font color=red&gt;&quot; + special.text + &quot;&lt;/font&gt;&quot;\n    end\n  end\n\n  p = SM::SimpleMarkup.new\n  p.add_word_pair(&quot;{&quot;, &quot;}&quot;, :STRIKE)\n  p.add_html(&quot;no&quot;, :STRIKE)\n\n  p.add_special(/\\b([A-Z][a-z]+[A-Z]\\w+)/, :WIKIWORD)\n\n  h = WikiHtml.new\n  h.add_tag(:STRIKE, &quot;&lt;strike&gt;&quot;, &quot;&lt;/strike&gt;&quot;)\n\n  puts &quot;&lt;body&gt;&quot; + p.convert(ARGF.read, h) + &quot;&lt;/body&gt;&quot;\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Output Formatters
- !ruby/struct:SM::Flow::P 
  body: <em>missing</em>
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: SPACE
  value: ?\s
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: "List entries look like:"
  - !ruby/struct:SM::Flow::VERB 
    body: " *       text\n 1.      text\n [label] text\n label:: text\n"
  - !ruby/struct:SM::Flow::P 
    body: Flag it as a list entry, and work out the indent for subsequent lines
  name: SIMPLE_LIST_RE
  value: /^(                   (  \*          (?# bullet)                     |-           (?# bullet)                     |\d+\.       (?# numbered )                     |[A-Za-z]\.  (?# alphabetically numbered )                   )                   \s+                 )\S/x
- !ruby/object:RI::Constant 
  comment: 
  name: LABEL_LIST_RE
  value: "/^(                         (  \\[.*?\\]    (?# labeled  )                           |\\S.*::     (?# note     )                         )(?:\\s+|$)                       )/x"
full_name: SM::SimpleMarkup
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_html
- !ruby/object:RI::MethodSummary 
  name: add_special
- !ruby/object:RI::MethodSummary 
  name: add_word_pair
- !ruby/object:RI::MethodSummary 
  name: assign_types_to_lines
- !ruby/object:RI::MethodSummary 
  name: content
- !ruby/object:RI::MethodSummary 
  name: convert
- !ruby/object:RI::MethodSummary 
  name: get_line_types
- !ruby/object:RI::MethodSummary 
  name: group_lines
- !ruby/object:RI::MethodSummary 
  name: handled_labeled_list
name: SimpleMarkup
superclass: Object
PK�}[�<��'ri/1.8/system/SM/Line/isBlank%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return true if this line is blank
full_name: SM::Line#isBlank?
is_singleton: false
name: isBlank?
params: ()
visibility: public
PK�}[=��� ri/1.8/system/SM/Line/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Line::new
is_singleton: true
name: new
params: (text)
visibility: public
PK�}[u�! ��!ri/1.8/system/SM/Line/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Line#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�}[z�Y�!!"ri/1.8/system/SM/Line/stamp-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: stamp a line with a type, a level, a prefix, and a flag
full_name: SM::Line#stamp
is_singleton: false
name: stamp
params: (type, level, param="", flag=nil)
visibility: public
PK�}[��E��%ri/1.8/system/SM/Line/cdesc-Line.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: true if this line has been deleted from the list of lines
  name: deleted
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: A flag. For list lines, this is the type of the list
  name: flag
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: the number of leading spaces
  name: leading_spaces
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The indentation nesting level
  name: level
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: A prefix or parameter. For LIST lines, this is the text that introduced the list item (the label)
  name: param
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The contents
  name: text
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: line type
  name: type
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: INFINITY
  value: "9999"
- !ruby/object:RI::Constant 
  comment: 
  name: BLANK
  value: ":BLANK"
- !ruby/object:RI::Constant 
  comment: 
  name: HEADING
  value: ":HEADING"
- !ruby/object:RI::Constant 
  comment: 
  name: LIST
  value: ":LIST"
- !ruby/object:RI::Constant 
  comment: 
  name: RULE
  value: ":RULE"
- !ruby/object:RI::Constant 
  comment: 
  name: PARAGRAPH
  value: ":PARAGRAPH"
- !ruby/object:RI::Constant 
  comment: 
  name: VERBATIM
  value: ":VERBATIM"
full_name: SM::Line
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: isBlank?
- !ruby/object:RI::MethodSummary 
  name: stamp
- !ruby/object:RI::MethodSummary 
  name: strip_leading
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Line
superclass: Object
PK�}[s��o��*ri/1.8/system/SM/Line/strip_leading-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Strip off the leading margin
full_name: SM::Line#strip_leading
is_singleton: false
name: strip_leading
params: (size)
visibility: public
PK�}[�=�jj/ri/1.8/system/SM/Paragraph/cdesc-Paragraph.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: A paragraph is a fragment which gets wrapped to fit. We remove all newlines when we're created, and have them put back on output
constants: []

full_name: SM::Paragraph
includes: []

instance_methods: []

name: Paragraph
superclass: Fragment
PK�}[�=��#ri/1.8/system/SM/ListEnd/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ListEnd::new
is_singleton: true
name: new
params: (level, type)
visibility: public
PK�}[ȓ
��+ri/1.8/system/SM/ListEnd/cdesc-ListEnd.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SM::ListEnd
includes: []

instance_methods: []

name: ListEnd
superclass: ListBase
PK�}[|%����/ri/1.8/system/SM/BlankLine/cdesc-BlankLine.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SM::BlankLine
includes: []

instance_methods: []

name: BlankLine
superclass: Paragraph
PK�}[���k��)ri/1.8/system/SM/Fragment/add_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Fragment#add_text
is_singleton: false
name: add_text
params: (txt)
visibility: public
PK�}[��L0��*ri/1.8/system/SM/Fragment/type_name-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Fragment::type_name
is_singleton: true
name: type_name
params: (name)
visibility: public
PK�}[C�,���$ri/1.8/system/SM/Fragment/for-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Fragment::for
is_singleton: true
name: for
params: (line)
visibility: public
PK�}[��
���$ri/1.8/system/SM/Fragment/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Fragment::new
is_singleton: true
name: new
params: (level, param, type, txt)
visibility: public
PK�}[X�ߨ�%ri/1.8/system/SM/Fragment/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Fragment#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�}[l�-ri/1.8/system/SM/Fragment/cdesc-Fragment.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: level
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: param
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: txt
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: type
  rw: RW
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: for
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: type_name
comment: 
- !ruby/struct:SM::Flow::P 
  body: A Fragment is a chunk of text, subclassed as a paragraph, a list entry, or verbatim text
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: This is a simple factory system that lets us associate fragement types (a string) with a subclass of fragment
  name: TYPE_MAP
  value: "{}"
full_name: SM::Fragment
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_text
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Fragment
superclass: Object
PK�}[�2~��/ri/1.8/system/SM/ListStart/cdesc-ListStart.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SM::ListStart
includes: []

instance_methods: []

name: ListStart
superclass: ListBase
PK�}[=��ܹ�%ri/1.8/system/SM/ListStart/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ListStart::new
is_singleton: true
name: new
params: (level, param, type)
visibility: public
PK�}[�"y	-ri/1.8/system/SM/ListBase/cdesc-ListBase.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: A List is a fragment with some kind of label
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: List types
  name: BULLET
  value: ":BULLET"
- !ruby/object:RI::Constant 
  comment: 
  name: NUMBER
  value: ":NUMBER"
- !ruby/object:RI::Constant 
  comment: 
  name: UPPERALPHA
  value: ":UPPERALPHA"
- !ruby/object:RI::Constant 
  comment: 
  name: LOWERALPHA
  value: ":LOWERALPHA"
- !ruby/object:RI::Constant 
  comment: 
  name: LABELED
  value: ":LABELED"
- !ruby/object:RI::Constant 
  comment: 
  name: NOTE
  value: ":NOTE"
full_name: SM::ListBase
includes: []

instance_methods: []

name: ListBase
superclass: Paragraph
PK�}[���A/ri/1.8/system/SM/Attribute/cdesc-Attribute.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: as_string
- !ruby/object:RI::MethodSummary 
  name: bitmap_for
- !ruby/object:RI::MethodSummary 
  name: each_name_of
comment: 
- !ruby/struct:SM::Flow::P 
  body: We manage a set of attributes. Each attribute has a symbol name and a bit value
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: SPECIAL
  value: "1"
full_name: SM::Attribute
includes: []

instance_methods: []

name: Attribute
superclass: Object
PK�}[#�h��+ri/1.8/system/SM/Attribute/as_string-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Attribute::as_string
is_singleton: true
name: as_string
params: (bitmap)
visibility: public
PK�}[�F��.ri/1.8/system/SM/Attribute/each_name_of-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: name.to_s if (bitmap & bit) != 0
comment: 
full_name: SM::Attribute::each_name_of
is_singleton: true
name: each_name_of
params: (bitmap) {|name.to_s if (bitmap & bit) != 0| ...}
visibility: public
PK�}[�0���,ri/1.8/system/SM/Attribute/bitmap_for-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Attribute::bitmap_for
is_singleton: true
name: bitmap_for
params: (name)
visibility: public
PK�}[��C}��&ri/1.8/system/SM/Lines/empty%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Lines#empty?
is_singleton: false
name: empty?
params: ()
visibility: public
PK�}[]�.���"ri/1.8/system/SM/Lines/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: line unless line.deleted
comment: 
full_name: SM::Lines#each
is_singleton: false
name: each
params: () {|line unless line.deleted| ...}
visibility: public
PK�}[��&k��#ri/1.8/system/SM/Lines/unget-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Lines#unget
is_singleton: false
name: unget
params: ()
visibility: public
PK�}[�%�F��$ri/1.8/system/SM/Lines/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Lines#delete
is_singleton: false
name: delete
params: (a_line)
visibility: public
PK�}[��ュ�"ri/1.8/system/SM/Lines/next-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Lines#next
is_singleton: false
name: next
params: ()
visibility: public
PK�}[ֹ�p��'ri/1.8/system/SM/Lines/normalize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Lines#normalize
is_singleton: false
name: normalize
params: ()
visibility: public
PK�}[�F9r>>$ri/1.8/system/SM/Lines/rewind-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: def [](index)
- !ruby/struct:SM::Flow::VERB 
  body: "  @lines[index]\n"
- !ruby/struct:SM::Flow::P 
  body: end
full_name: SM::Lines#rewind
is_singleton: false
name: rewind
params: ()
visibility: public
PK�}[�[���!ri/1.8/system/SM/Lines/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Lines::new
is_singleton: true
name: new
params: (lines)
visibility: public
PK�}[|�<T��%ri/1.8/system/SM/Lines/as_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Lines#as_text
is_singleton: false
name: as_text
params: ()
visibility: public
PK�}[����(ri/1.8/system/SM/Lines/line_types-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Lines#line_types
is_singleton: false
name: line_types
params: ()
visibility: public
PK�}[��ܩQQ'ri/1.8/system/SM/Lines/cdesc-Lines.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: lines
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A container for all the lines
constants: []

full_name: SM::Lines
includes: 
- !ruby/object:RI::IncludedModule 
  name: Enumerable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: as_text
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: empty?
- !ruby/object:RI::MethodSummary 
  name: line_types
- !ruby/object:RI::MethodSummary 
  name: next
- !ruby/object:RI::MethodSummary 
  name: normalize
- !ruby/object:RI::MethodSummary 
  name: rewind
- !ruby/object:RI::MethodSummary 
  name: unget
name: Lines
superclass: Object
PK�}[8����ri/1.8/system/SM/cdesc-SM.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: require 'rdoc/markup/simple_markup/to_flow.rb'
constants: []

full_name: SM
includes: []

instance_methods: []

name: SM
superclass: 
PK�}[�sW{��'ri/1.8/system/SM/AttrSpan/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::AttrSpan#[]
is_singleton: false
name: "[]"
params: (n)
visibility: public
PK�}[�C:7��-ri/1.8/system/SM/AttrSpan/cdesc-AttrSpan.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: An array of attributes which parallels the characters in a string
constants: []

full_name: SM::AttrSpan
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: set_attrs
name: AttrSpan
superclass: Object
PK�}[5��!��$ri/1.8/system/SM/AttrSpan/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::AttrSpan::new
is_singleton: true
name: new
params: (length)
visibility: public
PK�}[�-J���*ri/1.8/system/SM/AttrSpan/set_attrs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::AttrSpan#set_attrs
is_singleton: false
name: set_attrs
params: (start, length, bits)
visibility: public
PK�}[㝿��+ri/1.8/system/SM/LineCollection/each-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::LineCollection#each
is_singleton: false
name: each
params: (&b)
visibility: public
PK�}[XU���+ri/1.8/system/SM/LineCollection/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: For testing
full_name: SM::LineCollection#to_a
is_singleton: false
name: to_a
params: ()
visibility: public
PK�}[7�[p7ri/1.8/system/SM/LineCollection/tidy_blank_lines-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Finally tidy up the blank lines:"
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: change Blank/ListEnd into ListEnd/Blank
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: remove blank lines at the front
  type: :BULLET
full_name: SM::LineCollection#tidy_blank_lines
is_singleton: false
name: tidy_blank_lines
params: ()
visibility: private
PK�}[&��Bri/1.8/system/SM/LineCollection/change_verbatim_blank_lines-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "If you have:"
- !ruby/struct:SM::Flow::VERB 
  body: "   normal paragraph text.\n\n      this is code\n\n      and more code\n"
- !ruby/struct:SM::Flow::P 
  body: You'll end up with the fragments Paragraph, BlankLine, Verbatim, BlankLine, Verbatim, BlankLine, etc
- !ruby/struct:SM::Flow::P 
  body: The BlankLine in the middle of the verbatim chunk needs to be changed to a real verbatim newline, and the two verbatim blocks merged
full_name: SM::LineCollection#change_verbatim_blank_lines
is_singleton: false
name: change_verbatim_blank_lines
params: ()
visibility: private
PK�}[��~{��0ri/1.8/system/SM/LineCollection/normalize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: tidy up at the end
full_name: SM::LineCollection#normalize
is_singleton: false
name: normalize
params: ()
visibility: public
PK�}[����*ri/1.8/system/SM/LineCollection/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::LineCollection#add
is_singleton: false
name: add
params: (fragment)
visibility: public
PK�}[
���HH6ri/1.8/system/SM/LineCollection/add_list_breaks-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: now insert start/ends between list entries at the same level that have different element types
full_name: SM::LineCollection#add_list_breaks
is_singleton: false
name: add_list_breaks
params: ()
visibility: private
PK�}[���pp>ri/1.8/system/SM/LineCollection/add_list_start_and_ends-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: List nesting is implicit given the level of Make it explicit, just to make life a tad easier for the output processors
full_name: SM::LineCollection#add_list_start_and_ends
is_singleton: false
name: add_list_start_and_ends
params: ()
visibility: private
PK�}[�i���*ri/1.8/system/SM/LineCollection/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::LineCollection::new
is_singleton: true
name: new
params: ()
visibility: public
PK�}[�M����9ri/1.8/system/SM/LineCollection/cdesc-LineCollection.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Collect groups of lines together. Each group will end up containing a flow of text
constants: []

full_name: SM::LineCollection
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: accept
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: add_list_breaks
- !ruby/object:RI::MethodSummary 
  name: add_list_start_and_ends
- !ruby/object:RI::MethodSummary 
  name: change_verbatim_blank_lines
- !ruby/object:RI::MethodSummary 
  name: each
- !ruby/object:RI::MethodSummary 
  name: fragment_for
- !ruby/object:RI::MethodSummary 
  name: normalize
- !ruby/object:RI::MethodSummary 
  name: tidy_blank_lines
- !ruby/object:RI::MethodSummary 
  name: to_a
- !ruby/object:RI::MethodSummary 
  name: to_s
name: LineCollection
superclass: Object
PK�}[.A����+ri/1.8/system/SM/LineCollection/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::LineCollection#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�}[�K:��-ri/1.8/system/SM/LineCollection/accept-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::LineCollection#accept
is_singleton: false
name: accept
params: (am, visitor)
visibility: public
PK�}[,+�93ri/1.8/system/SM/LineCollection/fragment_for-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Factory for different fragment types
full_name: SM::LineCollection#fragment_for
is_singleton: false
name: fragment_for
params: (*args)
visibility: public
PK�}[m�~��Ari/1.8/system/SM/AttributeManager/mask_protected_sequences-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::AttributeManager#mask_protected_sequences
is_singleton: false
name: mask_protected_sequences
params: ()
visibility: public
PK�}[A(����1ri/1.8/system/SM/AttributeManager/add_html-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::AttributeManager#add_html
is_singleton: false
name: add_html
params: (tag, name)
visibility: public
PK�}[	H���;ri/1.8/system/SM/AttributeManager/display_attributes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::AttributeManager#display_attributes
is_singleton: false
name: display_attributes
params: ()
visibility: public
PK�}[éA��-ri/1.8/system/SM/AttributeManager/flow-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::AttributeManager#flow
is_singleton: false
name: flow
params: (str)
visibility: public
PK�}[(L'8��Bri/1.8/system/SM/AttributeManager/changed_attribute_by_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::AttributeManager#changed_attribute_by_name
is_singleton: false
name: changed_attribute_by_name
params: (current_set, new_set)
visibility: public
PK�}[�A�<��,ri/1.8/system/SM/AttributeManager/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::AttributeManager::new
is_singleton: true
name: new
params: ()
visibility: public
PK�}[�M���4ri/1.8/system/SM/AttributeManager/copy_string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::AttributeManager#copy_string
is_singleton: false
name: copy_string
params: (start_pos, end_pos)
visibility: public
PK�}[HN�d��9ri/1.8/system/SM/AttributeManager/change_attribute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::AttributeManager#change_attribute
is_singleton: false
name: change_attribute
params: (current, new)
visibility: public
PK�}[�t����4ri/1.8/system/SM/AttributeManager/add_special-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::AttributeManager#add_special
is_singleton: false
name: add_special
params: (pattern, name)
visibility: public
PK�}[z����6ri/1.8/system/SM/AttributeManager/add_word_pair-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::AttributeManager#add_word_pair
is_singleton: false
name: add_word_pair
params: (start, stop, name)
visibility: public
PK�}[�F�/772ri/1.8/system/SM/AttributeManager/attribute-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return an attribute object with the given turn_on and turn_off bits set
full_name: SM::AttributeManager#attribute
is_singleton: false
name: attribute
params: (turn_on, turn_off)
visibility: public
PK�}[�!�p��8ri/1.8/system/SM/AttributeManager/split_into_flow-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::AttributeManager#split_into_flow
is_singleton: false
name: split_into_flow
params: ()
visibility: public
PK�}[�аk��5ri/1.8/system/SM/AttributeManager/convert_html-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::AttributeManager#convert_html
is_singleton: false
name: convert_html
params: (str, attrs)
visibility: public
PK�}[@���9ri/1.8/system/SM/AttributeManager/convert_specials-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::AttributeManager#convert_specials
is_singleton: false
name: convert_specials
params: (str, attrs)
visibility: public
PK�}[a�z��Cri/1.8/system/SM/AttributeManager/unmask_protected_sequences-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::AttributeManager#unmask_protected_sequences
is_singleton: false
name: unmask_protected_sequences
params: ()
visibility: public
PK�}[R�8���6ri/1.8/system/SM/AttributeManager/convert_attrs-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Map attributes like <b>text</b>to the sequence \001\002&lt;char&gt;\001\003&lt;char&gt;, where &lt;char&gt; is a per-attribute specific character
full_name: SM::AttributeManager#convert_attrs
is_singleton: false
name: convert_attrs
params: (str, attrs)
visibility: public
PK�}[x~�P�
�
=ri/1.8/system/SM/AttributeManager/cdesc-AttributeManager.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: "NULL"
  value: "\"\\000\".freeze"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: We work by substituting non-printing characters in to the text. For now I'm assuming that I can substitute a character in the range 0..8 for a 7 bit character without damaging the encoded string, but this might be optimistic
  name: A_PROTECT
  value: "004"
- !ruby/object:RI::Constant 
  comment: 
  name: PROTECT_ATTR
  value: A_PROTECT.chr
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: This maps delimiters that occur around words (such as <b>bold</b> or <tt>tt</tt>) where the start and end delimiters and the same. This lets us optimize the regexp
  name: MATCHING_WORD_PAIRS
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: And this is used when the delimiters aren't the same. In this case the hash maps a pattern to the attribute character
  name: WORD_PAIR_MAP
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: This maps HTML tags to the corresponding attribute char
  name: HTML_TAGS
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: And this maps <em>special</em> sequences to a name. A special sequence is something like a WikiWord
  name: SPECIAL
  value: "{}"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: A \ in front of a character that would normally be processed turns off processing. We do this by turning &lt; into &lt;#{PROTECT}
  name: PROTECTABLE
  value: "[ \"<\" << \"\\\\\" ]"
full_name: SM::AttributeManager
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_html
- !ruby/object:RI::MethodSummary 
  name: add_special
- !ruby/object:RI::MethodSummary 
  name: add_word_pair
- !ruby/object:RI::MethodSummary 
  name: attribute
- !ruby/object:RI::MethodSummary 
  name: change_attribute
- !ruby/object:RI::MethodSummary 
  name: changed_attribute_by_name
- !ruby/object:RI::MethodSummary 
  name: convert_attrs
- !ruby/object:RI::MethodSummary 
  name: convert_html
- !ruby/object:RI::MethodSummary 
  name: convert_specials
- !ruby/object:RI::MethodSummary 
  name: copy_string
- !ruby/object:RI::MethodSummary 
  name: display_attributes
- !ruby/object:RI::MethodSummary 
  name: flow
- !ruby/object:RI::MethodSummary 
  name: mask_protected_sequences
- !ruby/object:RI::MethodSummary 
  name: split_into_flow
- !ruby/object:RI::MethodSummary 
  name: unmask_protected_sequences
name: AttributeManager
superclass: Object
PK�}[�䍳�)ri/1.8/system/SM/Verbatim/add_text-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Verbatim#add_text
is_singleton: false
name: add_text
params: (txt)
visibility: public
PK�}[����LL-ri/1.8/system/SM/Verbatim/cdesc-Verbatim.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Verbatim code contains lines that don't get wrapped.
constants: []

full_name: SM::Verbatim
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add_text
name: Verbatim
superclass: Fragment
PK�}[��(��-ri/1.8/system/SM/ListItem/cdesc-ListItem.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SM::ListItem
includes: []

instance_methods: []

name: ListItem
superclass: ListBase
PK�}[ɑ�9��0ri/1.8/system/SM/ToHtml/accept_blank_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToHtml#accept_blank_line
is_singleton: false
name: accept_blank_line
params: (am, fragment)
visibility: public
PK�}[x$�t(ri/1.8/system/SM/ToHtml/init_tags-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set up the standard mapping of attributes to HTML tags
full_name: SM::ToHtml#init_tags
is_singleton: false
name: init_tags
params: ()
visibility: public
PK�}["�hֹ�&ri/1.8/system/SM/ToHtml/on_tags-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: SM::ToHtml#on_tags
is_singleton: false
name: on_tags
params: (res, item)
visibility: private
PK�}[Pl�[��0ri/1.8/system/SM/ToHtml/accept_list_start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToHtml#accept_list_start
is_singleton: false
name: accept_list_start
params: (am, fragment)
visibility: public
PK�}[鐮��.ri/1.8/system/SM/ToHtml/convert_heading-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToHtml#convert_heading
is_singleton: false
name: convert_heading
params: (level, flow)
visibility: private
PK�}[Eb����'ri/1.8/system/SM/ToHtml/off_tags-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToHtml#off_tags
is_singleton: false
name: off_tags
params: (res, item)
visibility: private
PK�}[�iD��+ri/1.8/system/SM/ToHtml/convert_flow-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToHtml#convert_flow
is_singleton: false
name: convert_flow
params: (flow)
visibility: private
PK�}[,!���"ri/1.8/system/SM/ToHtml/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToHtml::new
is_singleton: true
name: new
params: ()
visibility: public
PK�}[�je.ri/1.8/system/SM/ToHtml/start_accepting-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Here's the client side of the visitor pattern
full_name: SM::ToHtml#start_accepting
is_singleton: false
name: start_accepting
params: ()
visibility: public
PK�}[�L-��.ri/1.8/system/SM/ToHtml/list_item_start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToHtml#list_item_start
is_singleton: false
name: list_item_start
params: (am, fragment)
visibility: private
PK�}[t=Z��-ri/1.8/system/SM/ToHtml/html_list_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToHtml#html_list_name
is_singleton: false
name: html_list_name
params: (list_type, is_open_tag)
visibility: private
PK�}[5��#ri/1.8/system/SM/ToHtml/wrap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: This is a higher speed (if messier) version of wrap
full_name: SM::ToHtml#wrap
is_singleton: false
name: wrap
params: (txt, line_len = 76)
visibility: public
PK�}[Ґ�X��.ri/1.8/system/SM/ToHtml/accept_verbatim-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToHtml#accept_verbatim
is_singleton: false
name: accept_verbatim
params: (am, fragment)
visibility: public
PK�}[@�z��,ri/1.8/system/SM/ToHtml/end_accepting-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToHtml#end_accepting
is_singleton: false
name: end_accepting
params: ()
visibility: public
PK�}[x�G�-ri/1.8/system/SM/ToHtml/convert_string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: some of these patterns are taken from SmartyPants...
full_name: SM::ToHtml#convert_string
is_singleton: false
name: convert_string
params: (item)
visibility: private
PK�}[ͩy��/ri/1.8/system/SM/ToHtml/accept_paragraph-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToHtml#accept_paragraph
is_singleton: false
name: accept_paragraph
params: (am, fragment)
visibility: public
PK�}[�^/�CC&ri/1.8/system/SM/ToHtml/add_tag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Add a new set of HTML tags for an attribute. We allow separate start and end tags for flexibility
full_name: SM::ToHtml#add_tag
is_singleton: false
name: add_tag
params: (name, start, stop)
visibility: public
PK�}[6�ͻ��'ri/1.8/system/SM/ToHtml/annotate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Given an HTML tag, decorate it with class information and the like if required. This is a no-op in the base class, but is overridden in HTML output classes that implement style sheets
full_name: SM::ToHtml#annotate
is_singleton: false
name: annotate
params: (tag)
visibility: public
PK�}[��k��*ri/1.8/system/SM/ToHtml/accept_rule-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToHtml#accept_rule
is_singleton: false
name: accept_rule
params: (am, fragment)
visibility: public
PK�}[�Xx���)ri/1.8/system/SM/ToHtml/cdesc-ToHtml.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: LIST_TYPE_TO_HTML
  value: "{       ListBase::BULLET =>  [ \"<ul>\", \"</ul>\" ],       ListBase::NUMBER =>  [ \"<ol>\", \"</ol>\" ],       ListBase::UPPERALPHA =>  [ \"<ol>\", \"</ol>\" ],       ListBase::LOWERALPHA =>  [ \"<ol>\", \"</ol>\" ],       ListBase::LABELED => [ \"<dl>\", \"</dl>\" ],       ListBase::NOTE    => [ \"<table>\", \"</table>\" ],     }"
- !ruby/object:RI::Constant 
  comment: 
  name: InlineTag
  value: Struct.new(:bit, :on, :off)
full_name: SM::ToHtml
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: accept_blank_line
- !ruby/object:RI::MethodSummary 
  name: accept_heading
- !ruby/object:RI::MethodSummary 
  name: accept_list_end
- !ruby/object:RI::MethodSummary 
  name: accept_list_item
- !ruby/object:RI::MethodSummary 
  name: accept_list_start
- !ruby/object:RI::MethodSummary 
  name: accept_paragraph
- !ruby/object:RI::MethodSummary 
  name: accept_rule
- !ruby/object:RI::MethodSummary 
  name: accept_verbatim
- !ruby/object:RI::MethodSummary 
  name: add_tag
- !ruby/object:RI::MethodSummary 
  name: annotate
- !ruby/object:RI::MethodSummary 
  name: convert_flow
- !ruby/object:RI::MethodSummary 
  name: convert_heading
- !ruby/object:RI::MethodSummary 
  name: convert_special
- !ruby/object:RI::MethodSummary 
  name: convert_string
- !ruby/object:RI::MethodSummary 
  name: end_accepting
- !ruby/object:RI::MethodSummary 
  name: html_list_name
- !ruby/object:RI::MethodSummary 
  name: init_tags
- !ruby/object:RI::MethodSummary 
  name: list_end_for
- !ruby/object:RI::MethodSummary 
  name: list_item_start
- !ruby/object:RI::MethodSummary 
  name: off_tags
- !ruby/object:RI::MethodSummary 
  name: on_tags
- !ruby/object:RI::MethodSummary 
  name: start_accepting
- !ruby/object:RI::MethodSummary 
  name: wrap
name: ToHtml
superclass: Object
PK�}[88����/ri/1.8/system/SM/ToHtml/accept_list_item-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToHtml#accept_list_item
is_singleton: false
name: accept_list_item
params: (am, fragment)
visibility: public
PK�}[�ED���+ri/1.8/system/SM/ToHtml/list_end_for-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToHtml#list_end_for
is_singleton: false
name: list_end_for
params: (fragment_type)
visibility: private
PK�}[�~��-ri/1.8/system/SM/ToHtml/accept_heading-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToHtml#accept_heading
is_singleton: false
name: accept_heading
params: (am, fragment)
visibility: public
PK�}[{����.ri/1.8/system/SM/ToHtml/accept_list_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToHtml#accept_list_end
is_singleton: false
name: accept_list_end
params: (am, fragment)
visibility: public
PK�}[��;x��.ri/1.8/system/SM/ToHtml/convert_special-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToHtml#convert_special
is_singleton: false
name: convert_special
params: (special)
visibility: private
PK�}[l4�V��*ri/1.8/system/SM/Flow/LIST/cdesc-LIST.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: contents
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: type
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: SM::Flow::LIST
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: "<<"
name: LIST
superclass: Object
PK�}[��y���%ri/1.8/system/SM/Flow/LIST/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Flow::LIST::new
is_singleton: true
name: new
params: (type)
visibility: public
PK�}[|rx��(ri/1.8/system/SM/Flow/LIST/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Flow::LIST#<<
is_singleton: false
name: "<<"
params: (stuff)
visibility: public
PK�}[)�JNN%ri/1.8/system/SM/Flow/cdesc-Flow.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: P
  value: Struct.new(:body)
- !ruby/object:RI::Constant 
  comment: 
  name: VERB
  value: Struct.new(:body)
- !ruby/object:RI::Constant 
  comment: 
  name: RULE
  value: Struct.new(:width)
- !ruby/object:RI::Constant 
  comment: 
  name: LI
  value: Struct.new(:label, :body)
- !ruby/object:RI::Constant 
  comment: 
  name: H
  value: Struct.new(:level, :text)
full_name: SM::Flow
includes: []

instance_methods: []

name: Flow
superclass: 
PK�}[�S����3ri/1.8/system/SM/AttrChanger/cdesc-AttrChanger.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SM::AttrChanger
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: to_s
name: AttrChanger
superclass: Object
PK�}[�o/��(ri/1.8/system/SM/AttrChanger/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::AttrChanger#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�}[SI㞯�#ri/1.8/system/SM/Special/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Special::new
is_singleton: true
name: new
params: (type, text)
visibility: public
PK�}[`���+ri/1.8/system/SM/Special/cdesc-Special.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: text
  rw: RW
- !ruby/object:RI::Attribute 
  comment: 
  name: type
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Hold details of a special sequence
constants: []

full_name: SM::Special
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Special
superclass: Object
PK�}[UHѫ��$ri/1.8/system/SM/Special/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Special#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�}[��դ�&ri/1.8/system/SM/Special/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Special#==
is_singleton: false
name: ==
params: (o)
visibility: public
PK�}[����+ri/1.8/system/SM/Heading/cdesc-Heading.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: SM::Heading
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: head_level
name: Heading
superclass: Paragraph
PK�}[/�aZ��*ri/1.8/system/SM/Heading/head_level-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::Heading#head_level
is_singleton: false
name: head_level
params: ()
visibility: public
PK�}[�-	���%ri/1.8/system/SM/Rule/cdesc-Rule.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: A horizontal rule
constants: []

full_name: SM::Rule
includes: []

instance_methods: []

name: Rule
superclass: Fragment
PK�}[��zH��0ri/1.8/system/SM/ToFlow/accept_blank_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToFlow#accept_blank_line
is_singleton: false
name: accept_blank_line
params: (am, fragment)
visibility: public
PK�}[	���(ri/1.8/system/SM/ToFlow/init_tags-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set up the standard mapping of attributes to HTML tags
full_name: SM::ToFlow#init_tags
is_singleton: false
name: init_tags
params: ()
visibility: public
PK�}[ZV��&ri/1.8/system/SM/ToFlow/on_tags-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: SM::ToFlow#on_tags
is_singleton: false
name: on_tags
params: (res, item)
visibility: private
PK�}[g^*��0ri/1.8/system/SM/ToFlow/accept_list_start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToFlow#accept_list_start
is_singleton: false
name: accept_list_start
params: (am, fragment)
visibility: public
PK�}[�\���'ri/1.8/system/SM/ToFlow/off_tags-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToFlow#off_tags
is_singleton: false
name: off_tags
params: (res, item)
visibility: private
PK�}[2i^p��+ri/1.8/system/SM/ToFlow/convert_flow-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToFlow#convert_flow
is_singleton: false
name: convert_flow
params: (flow)
visibility: private
PK�}[(�4��"ri/1.8/system/SM/ToFlow/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToFlow::new
is_singleton: true
name: new
params: ()
visibility: public
PK�}[oZ��.ri/1.8/system/SM/ToFlow/start_accepting-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Here's the client side of the visitor pattern
full_name: SM::ToFlow#start_accepting
is_singleton: false
name: start_accepting
params: ()
visibility: public
PK�}[j�%��.ri/1.8/system/SM/ToFlow/accept_verbatim-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToFlow#accept_verbatim
is_singleton: false
name: accept_verbatim
params: (am, fragment)
visibility: public
PK�}[�6	&��,ri/1.8/system/SM/ToFlow/end_accepting-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToFlow#end_accepting
is_singleton: false
name: end_accepting
params: ()
visibility: public
PK�}[�qV�-ri/1.8/system/SM/ToFlow/convert_string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: some of these patterns are taken from SmartyPants...
full_name: SM::ToFlow#convert_string
is_singleton: false
name: convert_string
params: (item)
visibility: private
PK�}[��z���/ri/1.8/system/SM/ToFlow/accept_paragraph-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToFlow#accept_paragraph
is_singleton: false
name: accept_paragraph
params: (am, fragment)
visibility: public
PK�}[*b��CC&ri/1.8/system/SM/ToFlow/add_tag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Add a new set of HTML tags for an attribute. We allow separate start and end tags for flexibility
full_name: SM::ToFlow#add_tag
is_singleton: false
name: add_tag
params: (name, start, stop)
visibility: public
PK�}[&�w��)ri/1.8/system/SM/ToFlow/cdesc-ToFlow.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: LIST_TYPE_TO_HTML
  value: "{       SM::ListBase::BULLET     =>  [ \"<ul>\", \"</ul>\" ],       SM::ListBase::NUMBER     =>  [ \"<ol>\", \"</ol>\" ],       SM::ListBase::UPPERALPHA =>  [ \"<ol>\", \"</ol>\" ],       SM::ListBase::LOWERALPHA =>  [ \"<ol>\", \"</ol>\" ],       SM::ListBase::LABELED    =>  [ \"<dl>\", \"</dl>\" ],       SM::ListBase::NOTE       =>  [ \"<table>\", \"</table>\" ],     }"
- !ruby/object:RI::Constant 
  comment: 
  name: InlineTag
  value: Struct.new(:bit, :on, :off)
full_name: SM::ToFlow
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: accept_blank_line
- !ruby/object:RI::MethodSummary 
  name: accept_heading
- !ruby/object:RI::MethodSummary 
  name: accept_list_end
- !ruby/object:RI::MethodSummary 
  name: accept_list_item
- !ruby/object:RI::MethodSummary 
  name: accept_list_start
- !ruby/object:RI::MethodSummary 
  name: accept_paragraph
- !ruby/object:RI::MethodSummary 
  name: accept_rule
- !ruby/object:RI::MethodSummary 
  name: accept_verbatim
- !ruby/object:RI::MethodSummary 
  name: add_tag
- !ruby/object:RI::MethodSummary 
  name: annotate
- !ruby/object:RI::MethodSummary 
  name: convert_flow
- !ruby/object:RI::MethodSummary 
  name: convert_special
- !ruby/object:RI::MethodSummary 
  name: convert_string
- !ruby/object:RI::MethodSummary 
  name: end_accepting
- !ruby/object:RI::MethodSummary 
  name: init_tags
- !ruby/object:RI::MethodSummary 
  name: off_tags
- !ruby/object:RI::MethodSummary 
  name: on_tags
- !ruby/object:RI::MethodSummary 
  name: start_accepting
name: ToFlow
superclass: Object
PK�}[m�H���'ri/1.8/system/SM/ToFlow/annotate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Given an HTML tag, decorate it with class information and the like if required. This is a no-op in the base class, but is overridden in HTML output classes that implement style sheets
full_name: SM::ToFlow#annotate
is_singleton: false
name: annotate
params: (tag)
visibility: public
PK�}[�g�G��*ri/1.8/system/SM/ToFlow/accept_rule-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToFlow#accept_rule
is_singleton: false
name: accept_rule
params: (am, fragment)
visibility: public
PK�}[<e�=��/ri/1.8/system/SM/ToFlow/accept_list_item-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToFlow#accept_list_item
is_singleton: false
name: accept_list_item
params: (am, fragment)
visibility: public
PK�}[�/=~��-ri/1.8/system/SM/ToFlow/accept_heading-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToFlow#accept_heading
is_singleton: false
name: accept_heading
params: (am, fragment)
visibility: public
PK�}[ñb���.ri/1.8/system/SM/ToFlow/accept_list_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToFlow#accept_list_end
is_singleton: false
name: accept_list_end
params: (am, fragment)
visibility: public
PK�}[���.ri/1.8/system/SM/ToFlow/convert_special-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToFlow#convert_special
is_singleton: false
name: convert_special
params: (special)
visibility: private
PK�}[�.��..1ri/1.8/system/SM/PreProcess/cdesc-PreProcess.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Handle common directives that can occur in a block of text:"
- !ruby/struct:SM::Flow::P 
  body: ": include : filename"
constants: []

full_name: SM::PreProcess
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: find_include_file
- !ruby/object:RI::MethodSummary 
  name: handle
- !ruby/object:RI::MethodSummary 
  name: include_file
name: PreProcess
superclass: Object
PK�}[o�%���&ri/1.8/system/SM/PreProcess/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::PreProcess::new
is_singleton: true
name: new
params: (input_file_name, include_path)
visibility: public
PK�}[yi��zz4ri/1.8/system/SM/PreProcess/find_include_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Look for the given file in the directory containing the current file, and then in each of the directories specified in the RDOC_INCLUDE path
full_name: SM::PreProcess#find_include_file
is_singleton: false
name: find_include_file
params: (name)
visibility: private
PK�}[0���~~)ri/1.8/system/SM/PreProcess/handle-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (directive, param)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Look for common options in a chunk of text. Options that we don't handle are passed back to our caller as |directive, param|
full_name: SM::PreProcess#handle
is_singleton: false
name: handle
params: (text) {|directive, param| ...}
visibility: public
PK�}[�X*/ri/1.8/system/SM/PreProcess/include_file-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Include a file, indenting it correctly
full_name: SM::PreProcess#include_file
is_singleton: false
name: include_file
params: (name, indent)
visibility: private
PK�}[5+���!ri/1.8/system/SM/ToLaTeX/l-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToLaTeX#l
is_singleton: false
name: l
params: (arg)
visibility: public
PK�}[�+{��!ri/1.8/system/SM/ToLaTeX/l-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToLaTeX::l
is_singleton: true
name: l
params: (str)
visibility: public
PK�}[	ض<��1ri/1.8/system/SM/ToLaTeX/accept_blank_line-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToLaTeX#accept_blank_line
is_singleton: false
name: accept_blank_line
params: (am, fragment)
visibility: public
PK�}[�b)ri/1.8/system/SM/ToLaTeX/init_tags-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Set up the standard mapping of attributes to LaTeX
full_name: SM::ToLaTeX#init_tags
is_singleton: false
name: init_tags
params: ()
visibility: public
PK�}[{�����'ri/1.8/system/SM/ToLaTeX/on_tags-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: SM::ToLaTeX#on_tags
is_singleton: false
name: on_tags
params: (res, item)
visibility: private
PK�}[�%�^��1ri/1.8/system/SM/ToLaTeX/accept_list_start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToLaTeX#accept_list_start
is_singleton: false
name: accept_list_start
params: (am, fragment)
visibility: public
PK�}[��C���/ri/1.8/system/SM/ToLaTeX/convert_heading-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToLaTeX#convert_heading
is_singleton: false
name: convert_heading
params: (level, flow)
visibility: private
PK�}[�~v��+ri/1.8/system/SM/ToLaTeX/cdesc-ToLaTeX.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: l
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert SimpleMarkup to basic LaTeX report format
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: BS
  value: "\"\\020\""
- !ruby/object:RI::Constant 
  comment: 
  name: CB
  value: "\"\\022\""
- !ruby/object:RI::Constant 
  comment: 
  name: DL
  value: "\"\\023\""
- !ruby/object:RI::Constant 
  comment: 
  name: BACKSLASH
  value: "\"#{BS}symbol#{OB}92#{CB}\""
- !ruby/object:RI::Constant 
  comment: 
  name: HAT
  value: "\"#{BS}symbol#{OB}94#{CB}\""
- !ruby/object:RI::Constant 
  comment: 
  name: BACKQUOTE
  value: "\"#{BS}symbol#{OB}0#{CB}\""
- !ruby/object:RI::Constant 
  comment: 
  name: TILDE
  value: "\"#{DL}#{BS}sim#{DL}\""
- !ruby/object:RI::Constant 
  comment: 
  name: LESSTHAN
  value: "\"#{DL}<#{DL}\""
- !ruby/object:RI::Constant 
  comment: 
  name: GREATERTHAN
  value: "\"#{DL}>#{DL}\""
- !ruby/object:RI::Constant 
  comment: 
  name: LIST_TYPE_TO_LATEX
  value: "{       ListBase::BULLET =>  [ l(\"\\\\begin{itemize}\"), l(\"\\\\end{itemize}\") ],       ListBase::NUMBER =>  [ l(\"\\\\begin{enumerate}\"), l(\"\\\\end{enumerate}\"), \"\\\\arabic\" ],       ListBase::UPPERALPHA =>  [ l(\"\\\\begin{enumerate}\"), l(\"\\\\end{enumerate}\"), \"\\\\Alph\" ],       ListBase::LOWERALPHA =>  [ l(\"\\\\begin{enumerate}\"), l(\"\\\\end{enumerate}\"), \"\\\\alph\" ],       ListBase::LABELED => [ l(\"\\\\begin{description}\"), l(\"\\\\end{description}\") ],       ListBase::NOTE    => [         l(\"\\\\begin{tabularx}{\\\\linewidth}{@{} l X @{}}\"),          l(\"\\\\end{tabularx}\") ],     }"
- !ruby/object:RI::Constant 
  comment: 
  name: InlineTag
  value: Struct.new(:bit, :on, :off)
full_name: SM::ToLaTeX
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: accept_blank_line
- !ruby/object:RI::MethodSummary 
  name: accept_heading
- !ruby/object:RI::MethodSummary 
  name: accept_list_end
- !ruby/object:RI::MethodSummary 
  name: accept_list_item
- !ruby/object:RI::MethodSummary 
  name: accept_list_start
- !ruby/object:RI::MethodSummary 
  name: accept_paragraph
- !ruby/object:RI::MethodSummary 
  name: accept_rule
- !ruby/object:RI::MethodSummary 
  name: accept_verbatim
- !ruby/object:RI::MethodSummary 
  name: add_tag
- !ruby/object:RI::MethodSummary 
  name: convert_flow
- !ruby/object:RI::MethodSummary 
  name: convert_heading
- !ruby/object:RI::MethodSummary 
  name: convert_special
- !ruby/object:RI::MethodSummary 
  name: convert_string
- !ruby/object:RI::MethodSummary 
  name: end_accepting
- !ruby/object:RI::MethodSummary 
  name: escape
- !ruby/object:RI::MethodSummary 
  name: init_tags
- !ruby/object:RI::MethodSummary 
  name: l
- !ruby/object:RI::MethodSummary 
  name: list_end_for
- !ruby/object:RI::MethodSummary 
  name: list_item_start
- !ruby/object:RI::MethodSummary 
  name: list_name
- !ruby/object:RI::MethodSummary 
  name: off_tags
- !ruby/object:RI::MethodSummary 
  name: on_tags
- !ruby/object:RI::MethodSummary 
  name: start_accepting
- !ruby/object:RI::MethodSummary 
  name: wrap
name: ToLaTeX
superclass: Object
PK�}[��"��(ri/1.8/system/SM/ToLaTeX/off_tags-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToLaTeX#off_tags
is_singleton: false
name: off_tags
params: (res, item)
visibility: private
PK�}[�����,ri/1.8/system/SM/ToLaTeX/convert_flow-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToLaTeX#convert_flow
is_singleton: false
name: convert_flow
params: (flow)
visibility: private
PK�}[qTOe��#ri/1.8/system/SM/ToLaTeX/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToLaTeX::new
is_singleton: true
name: new
params: ()
visibility: public
PK�}[��%�/ri/1.8/system/SM/ToLaTeX/start_accepting-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Here's the client side of the visitor pattern
full_name: SM::ToLaTeX#start_accepting
is_singleton: false
name: start_accepting
params: ()
visibility: public
PK�}[d����/ri/1.8/system/SM/ToLaTeX/list_item_start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToLaTeX#list_item_start
is_singleton: false
name: list_item_start
params: (am, fragment)
visibility: private
PK�}[���P��&ri/1.8/system/SM/ToLaTeX/escape-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Escape a LaTeX string
full_name: SM::ToLaTeX#escape
is_singleton: false
name: escape
params: (str)
visibility: public
PK�}[�9F�$ri/1.8/system/SM/ToLaTeX/wrap-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: This is a higher speed (if messier) version of wrap
full_name: SM::ToLaTeX#wrap
is_singleton: false
name: wrap
params: (txt, line_len = 76)
visibility: public
PK�}[p�=��/ri/1.8/system/SM/ToLaTeX/accept_verbatim-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToLaTeX#accept_verbatim
is_singleton: false
name: accept_verbatim
params: (am, fragment)
visibility: public
PK�}[��U��-ri/1.8/system/SM/ToLaTeX/end_accepting-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToLaTeX#end_accepting
is_singleton: false
name: end_accepting
params: ()
visibility: public
PK�}[�H�U.ri/1.8/system/SM/ToLaTeX/convert_string-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: some of these patterns are taken from SmartyPants...
full_name: SM::ToLaTeX#convert_string
is_singleton: false
name: convert_string
params: (item)
visibility: private
PK�}[FƉ
��0ri/1.8/system/SM/ToLaTeX/accept_paragraph-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToLaTeX#accept_paragraph
is_singleton: false
name: accept_paragraph
params: (am, fragment)
visibility: public
PK�}[�}��EE'ri/1.8/system/SM/ToLaTeX/add_tag-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Add a new set of LaTeX tags for an attribute. We allow separate start and end tags for flexibility
full_name: SM::ToLaTeX#add_tag
is_singleton: false
name: add_tag
params: (name, start, stop)
visibility: public
PK�}[�6�v��+ri/1.8/system/SM/ToLaTeX/accept_rule-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToLaTeX#accept_rule
is_singleton: false
name: accept_rule
params: (am, fragment)
visibility: public
PK�}[�١���)ri/1.8/system/SM/ToLaTeX/list_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToLaTeX#list_name
is_singleton: false
name: list_name
params: (list_type, is_open_tag)
visibility: private
PK�}[�W&���0ri/1.8/system/SM/ToLaTeX/accept_list_item-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToLaTeX#accept_list_item
is_singleton: false
name: accept_list_item
params: (am, fragment)
visibility: public
PK�}[��]f��,ri/1.8/system/SM/ToLaTeX/list_end_for-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToLaTeX#list_end_for
is_singleton: false
name: list_end_for
params: (fragment_type)
visibility: private
PK�}[�}���.ri/1.8/system/SM/ToLaTeX/accept_heading-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToLaTeX#accept_heading
is_singleton: false
name: accept_heading
params: (am, fragment)
visibility: public
PK�}[��8���/ri/1.8/system/SM/ToLaTeX/accept_list_end-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToLaTeX#accept_list_end
is_singleton: false
name: accept_list_end
params: (am, fragment)
visibility: public
PK�}[�;"���/ri/1.8/system/SM/ToLaTeX/convert_special-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: SM::ToLaTeX#convert_special
is_singleton: false
name: convert_special
params: (special)
visibility: private
PK�}[#�"OO#ri/1.8/system/Comparable/%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compares two objects based on the receiver's <tt>&lt;=&gt;</tt> method, returning true if it returns -1.
full_name: Comparable#<
is_singleton: false
name: <
params: |
  obj < other    => true or false

visibility: public
PK�}[(^�yWW&ri/1.8/system/Comparable/%3c%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compares two objects based on the receiver's <tt>&lt;=&gt;</tt> method, returning true if it returns -1 or 0.
full_name: Comparable#<=
is_singleton: false
name: <=
params: |
  obj <= other    => true or false

visibility: public
PK�}[C�	�XX&ri/1.8/system/Comparable/%3e%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compares two objects based on the receiver's <tt>&lt;=&gt;</tt> method, returning true if it returns 0 or 1.
full_name: Comparable#>=
is_singleton: false
name: ">="
params: |
  obj >= other    => true or false

visibility: public
PK�}[mqԻ�.ri/1.8/system/Comparable/cdesc-Comparable.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: The <tt>Comparable</tt> mixin is used by classes whose objects may be ordered. The class must define the <tt>&lt;=&gt;</tt> operator, which compares the receiver against another object, returning -1, 0, or +1 depending on whether the receiver is less than, equal to, or greater than the other object. <tt>Comparable</tt> uses <tt>&lt;=&gt;</tt> to implement the conventional comparison operators (<tt>&lt;</tt>, <tt>&lt;=</tt>, <tt>==</tt>, <tt>&gt;=</tt>, and <tt>&gt;</tt>) and the method <tt>between?</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   class SizeMatters\n     include Comparable\n     attr :str\n     def &lt;=&gt;(anOther)\n       str.size &lt;=&gt; anOther.str.size\n     end\n     def initialize(str)\n       @str = str\n     end\n     def inspect\n       @str\n     end\n   end\n\n   s1 = SizeMatters.new(&quot;Z&quot;)\n   s2 = SizeMatters.new(&quot;YY&quot;)\n   s3 = SizeMatters.new(&quot;XXX&quot;)\n   s4 = SizeMatters.new(&quot;WWWW&quot;)\n   s5 = SizeMatters.new(&quot;VVVVV&quot;)\n\n   s1 &lt; s2                       #=&gt; true\n   s4.between?(s1, s3)           #=&gt; false\n   s4.between?(s3, s5)           #=&gt; true\n   [ s3, s2, s5, s4, s1 ].sort   #=&gt; [Z, YY, XXX, WWWW, VVVVV]\n"
constants: []

full_name: Comparable
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: <
- !ruby/object:RI::MethodSummary 
  name: <=
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: ">"
- !ruby/object:RI::MethodSummary 
  name: ">="
- !ruby/object:RI::MethodSummary 
  name: between?
name: Comparable
superclass: 
PK�}[�4$PP#ri/1.8/system/Comparable/%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compares two objects based on the receiver's <tt>&lt;=&gt;</tt> method, returning true if it returns 1.
full_name: Comparable#>
is_singleton: false
name: ">"
params: |
  obj > other    => true or false

visibility: public
PK�}[����&ri/1.8/system/Comparable/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compares two objects based on the receiver's <tt>&lt;=&gt;</tt> method, returning true if it returns 0. Also returns true if <em>obj</em> and <em>other</em> are the same object.
full_name: Comparable#==
is_singleton: false
name: ==
params: |
  obj == other    => true or false

visibility: public
PK�}[�:���*ri/1.8/system/Comparable/between%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>false</tt> if <em>obj</em> <tt>&lt;=&gt;</tt> <em>min</em> is less than zero or if <em>anObject</em> <tt>&lt;=&gt;</tt> <em>max</em> is greater than zero, <tt>true</tt> otherwise.
- !ruby/struct:SM::Flow::VERB 
  body: "   3.between?(1, 5)               #=&gt; true\n   6.between?(1, 5)               #=&gt; false\n   'cat'.between?('ant', 'dog')   #=&gt; true\n   'gnu'.between?('ant', 'dog')   #=&gt; false\n"
full_name: Comparable#between?
is_singleton: false
name: between?
params: |
  obj.between?(min, max)    => true or false

visibility: public
PK�}[`�͵��4ri/1.8/system/WadlerExample/cdesc-WadlerExample.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WadlerExample
includes: []

instance_methods: []

name: WadlerExample
superclass: Test::Unit::TestCase
PK�}[��N��0ri/1.8/system/WadlerExample/Tree/cdesc-Tree.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: WadlerExample::Tree
includes: []

instance_methods: []

name: Tree
superclass: Object
PK�}['�(�<<:ri/1.8/system/NeedlessArgument/cdesc-NeedlessArgument.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Raises when there is an argument for a switch which takes no argument.
constants: []

full_name: NeedlessArgument
includes: []

instance_methods: []

name: NeedlessArgument
superclass: ParseError
PK�}[��}��!ri/1.8/system/GC/stress%3d-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: updates GC stress mode.
- !ruby/struct:SM::Flow::P 
  body: "When GC.stress = true, GC is invoked for all GC opportunity: all memory and object allocation."
- !ruby/struct:SM::Flow::P 
  body: Since it makes Ruby very slow, it is only for debugging.
full_name: GC::stress=
is_singleton: true
name: stress=
params: |
  GC.stress = bool          => bool

visibility: public
PK�}[�9%P��'ri/1.8/system/GC/garbage_collect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Initiates garbage collection, unless manually disabled.
full_name: GC#garbage_collect
is_singleton: false
name: garbage_collect
params: |
  GC.start                     => nil
  gc.garbage_collect           => nil
  ObjectSpace.garbage_collect  => nil

visibility: public
PK�}[v�n���ri/1.8/system/GC/cdesc-GC.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: disable
- !ruby/object:RI::MethodSummary 
  name: enable
- !ruby/object:RI::MethodSummary 
  name: start
- !ruby/object:RI::MethodSummary 
  name: stress
- !ruby/object:RI::MethodSummary 
  name: stress=
comment: 
- !ruby/struct:SM::Flow::P 
  body: The <tt>GC</tt> module provides an interface to Ruby's mark and sweep garbage collection mechanism. Some of the underlying methods are also available via the <tt>ObjectSpace</tt> module.
constants: []

full_name: GC
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: garbage_collect
name: GC
superclass: 
PK�}[�
ri/1.8/system/GC/stress-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: returns current status of GC stress mode.
full_name: GC::stress
is_singleton: true
name: stress
params: |
  GC.stress                 => true or false

visibility: public
PK�}[���Ư�ri/1.8/system/GC/disable-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Disables garbage collection, returning <tt>true</tt> if garbage collection was already disabled.
- !ruby/struct:SM::Flow::VERB 
  body: "   GC.disable   #=&gt; false\n   GC.disable   #=&gt; true\n"
full_name: GC::disable
is_singleton: true
name: disable
params: |
  GC.disable    => true or false

visibility: public
PK�}[fuS���ri/1.8/system/GC/enable-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Enables garbage collection, returning <tt>true</tt> if garbage collection was previously disabled.
- !ruby/struct:SM::Flow::VERB 
  body: "   GC.disable   #=&gt; false\n   GC.enable    #=&gt; true\n   GC.enable    #=&gt; false\n"
full_name: GC::enable
is_singleton: true
name: enable
params: |
  GC.enable    => true or false

visibility: public
PK�}[˭��nnri/1.8/system/GC/start-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Initiates garbage collection, unless manually disabled.
full_name: GC::start
is_singleton: true
name: start
params: |
  GC.start                     => nil
  gc.garbage_collect           => nil
  ObjectSpace.garbage_collect  => nil

visibility: public
PK�}[��z��"ri/1.8/system/Ping/cdesc-Ping.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Ping contains routines to test for the reachability of remote hosts. Currently the only routine implemented is pingecho().
- !ruby/struct:SM::Flow::P 
  body: Ping.pingecho uses a TCP echo (not an ICMP echo) to determine if the remote host is reachable. This is usually adequate to tell that a remote host is available to telnet, ftp, or ssh to.
- !ruby/struct:SM::Flow::P 
  body: "Warning: Ping.pingecho may block for a long time if DNS resolution is slow. Requiring 'resolv-replace' allows non-blocking name resolution."
- !ruby/struct:SM::Flow::P 
  body: "Usage:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'ping'\n\n  puts &quot;'jimmy' is alive and kicking&quot; if Ping.pingecho('jimmy', 10)\n"
constants: []

full_name: Ping
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: pingecho
name: Ping
superclass: 
PK�}[� =ZKK"ri/1.8/system/Ping/pingecho-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return true if we can open a connection to the hostname or IP address <tt>host</tt> on port <tt>service</tt> (which defaults to the &quot;echo&quot; port) waiting up to <tt>timeout</tt> seconds.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'ping'\n\n  Ping.pingecho &quot;google.com&quot;, 10, 80\n"
full_name: Ping#pingecho
is_singleton: false
name: pingecho
params: (host, timeout=5, service="echo")
visibility: public
PK�}[��V��'ri/1.8/system/NameDescriptor/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: arg may be
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "1."
    body: a class or module name (optionally qualified with other class or module names (Kernel, File::Stat etc)
  - !ruby/struct:SM::Flow::LI 
    label: "2."
    body: a method name
  - !ruby/struct:SM::Flow::LI 
    label: "3."
    body: a method name qualified by a optionally fully qualified class or module name
  type: :NUMBER
- !ruby/struct:SM::Flow::P 
  body: "We're fairly casual about delimiters: folks can say Kernel::puts, Kernel.puts, or Kernel\\#puts for example. There's one exception: if you say IO::read, we look for a class method, but if you say IO.read, we look for an instance method"
full_name: NameDescriptor::new
is_singleton: true
name: new
params: (arg)
visibility: public
PK�}[�(�DKK3ri/1.8/system/NameDescriptor/full_class_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the full class name (with '::' between the components) or &quot;&quot; if there's no class name
full_name: NameDescriptor#full_class_name
is_singleton: false
name: full_class_name
params: ()
visibility: public
PK�}[�T��6ri/1.8/system/NameDescriptor/cdesc-NameDescriptor.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: class_names
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: true and false have the obvious meaning. nil means we don't care
  name: is_class_method
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: method_name
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Break argument into its constituent class or module names, an optional method type, and a method name
constants: []

full_name: NameDescriptor
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: full_class_name
name: NameDescriptor
superclass: Object
PK�}[�^�ri/1.8/system/Time/_load-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Unmarshal a dumped <tt>Time</tt> object.
full_name: Time::_load
is_singleton: true
name: _load
params: |
  Time._load(string)   => time

visibility: public
PK�}[�y����ri/1.8/system/Time/utc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts <em>time</em> to UTC (GMT), modifying the receiver.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now   #=&gt; Wed Apr 09 08:56:03 CDT 2003\n   t.gmt?         #=&gt; false\n   t.gmtime       #=&gt; Wed Apr 09 13:56:03 UTC 2003\n   t.gmt?         #=&gt; true\n\n   t = Time.now   #=&gt; Wed Apr 09 08:56:04 CDT 2003\n   t.utc?         #=&gt; false\n   t.utc          #=&gt; Wed Apr 09 13:56:04 UTC 2003\n   t.utc?         #=&gt; true\n"
full_name: Time#utc
is_singleton: false
name: utc
params: |
  time.gmtime    => time
  time.utc       => time

visibility: public
PK�}[i��c�� ri/1.8/system/Time/tv_sec-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the value of <em>time</em> as an integer number of seconds since epoch.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now\n   &quot;%10.5f&quot; % t.to_f   #=&gt; &quot;1049896564.17839&quot;\n   t.to_i              #=&gt; 1049896564\n"
full_name: Time#tv_sec
is_singleton: false
name: tv_sec
params: |
  time.to_i   => int
  time.tv_sec => int

visibility: public
PK�}[�j���ri/1.8/system/Time/mon-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the month of the year (1..12) for <em>time</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now   #=&gt; Wed Apr 09 08:56:03 CDT 2003\n   t.mon          #=&gt; 4\n   t.month        #=&gt; 4\n"
full_name: Time#mon
is_singleton: false
name: mon
params: |
  time.mon   => fixnum
  time.month => fixnum

visibility: public
PK�}[d�Q�� ri/1.8/system/Time/gmtime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts <em>time</em> to UTC (GMT), modifying the receiver.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now   #=&gt; Wed Apr 09 08:56:03 CDT 2003\n   t.gmt?         #=&gt; false\n   t.gmtime       #=&gt; Wed Apr 09 13:56:03 UTC 2003\n   t.gmt?         #=&gt; true\n\n   t = Time.now   #=&gt; Wed Apr 09 08:56:04 CDT 2003\n   t.utc?         #=&gt; false\n   t.utc          #=&gt; Wed Apr 09 13:56:04 UTC 2003\n   t.utc?         #=&gt; true\n"
full_name: Time#gmtime
is_singleton: false
name: gmtime
params: |
  time.gmtime    => time
  time.utc       => time

visibility: public
PK�}[60�z��ri/1.8/system/Time/day-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the day of the month (1..n) for <em>time</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now   #=&gt; Wed Apr 09 08:56:03 CDT 2003\n   t.day          #=&gt; 9\n   t.mday         #=&gt; 9\n"
full_name: Time#day
is_singleton: false
name: day
params: |
  time.day  => fixnum
  time.mday => fixnum

visibility: public
PK�}[���gg ri/1.8/system/Time/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return <tt>true</tt> if <em>time</em> and <em>other_time</em> are both <tt>Time</tt> objects with the same seconds and fractional seconds.
full_name: Time#eql?
is_singleton: false
name: eql?
params: |
  time.eql?(other_time)

visibility: public
PK�}[����ri/1.8/system/Time/ctime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a canonical string representation of <em>time</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   Time.now.asctime   #=&gt; &quot;Wed Apr  9 08:56:03 2003&quot;\n"
full_name: Time#ctime
is_singleton: false
name: ctime
params: |
  time.asctime => string
  time.ctime   => string

visibility: public
PK�}[���FFri/1.8/system/Time/isdst-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>time</em> occurs during Daylight Saving Time in its time zone.
- !ruby/struct:SM::Flow::VERB 
  body: "   Time.local(2000, 7, 1).isdst   #=&gt; true\n   Time.local(2000, 1, 1).isdst   #=&gt; false\n   Time.local(2000, 7, 1).dst?    #=&gt; true\n   Time.local(2000, 1, 1).dst?    #=&gt; false\n"
full_name: Time#isdst
is_singleton: false
name: isdst
params: |
  time.isdst => true or false
  time.dst?  => true or false

visibility: public
PK�}[�&��!ri/1.8/system/Time/iso8601-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #xmlschema"
full_name: Time#iso8601
is_singleton: false
name: iso8601
params: (fraction_digits=0)
visibility: public
PK�}[�1*��ri/1.8/system/Time/mday-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the day of the month (1..n) for <em>time</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now   #=&gt; Wed Apr 09 08:56:03 CDT 2003\n   t.day          #=&gt; 9\n   t.mday         #=&gt; 9\n"
full_name: Time#mday
is_singleton: false
name: mday
params: |
  time.day  => fixnum
  time.mday => fixnum

visibility: public
PK�}[�Na�� ri/1.8/system/Time/w3cdtf-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Time::w3cdtf
is_singleton: true
name: w3cdtf
params: (date)
visibility: public
PK�}[�`�j��#ri/1.8/system/Time/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Comparison---Compares <em>time</em> with <em>other_time</em> or with <em>numeric</em>, which is the number of seconds (possibly fractional) since epoch.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now       #=&gt; Wed Apr 09 08:56:03 CDT 2003\n   t2 = t + 2592000   #=&gt; Fri May 09 08:56:03 CDT 2003\n   t &lt;=&gt; t2           #=&gt; -1\n   t2 &lt;=&gt; t           #=&gt; 1\n   t &lt;=&gt; t            #=&gt; 0\n"
full_name: Time#<=>
is_singleton: false
name: <=>
params: |
  time <=> other_time => -1, 0, +1 
  time <=> numeric    => -1, 0, +1

visibility: public
PK�}[�0����ri/1.8/system/Time/at-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new time object with the value given by <em>aTime</em>, or the given number of <em>seconds</em> (and optional <em>microseconds</em>) from epoch. A non-portable feature allows the offset to be negative on some systems.
- !ruby/struct:SM::Flow::VERB 
  body: "   Time.at(0)            #=&gt; Wed Dec 31 18:00:00 CST 1969\n   Time.at(946702800)    #=&gt; Fri Dec 31 23:00:00 CST 1999\n   Time.at(-284061600)   #=&gt; Sat Dec 31 00:00:00 CST 1960\n"
full_name: Time::at
is_singleton: true
name: at
params: |
  Time.at( aTime ) => time
  Time.at( seconds [, microseconds] ) => time

visibility: public
PK�}[�y���ri/1.8/system/Time/to_i-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the value of <em>time</em> as an integer number of seconds since epoch.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now\n   &quot;%10.5f&quot; % t.to_f   #=&gt; &quot;1049896564.17839&quot;\n   t.to_i              #=&gt; 1049896564\n"
full_name: Time#to_i
is_singleton: false
name: to_i
params: |
  time.to_i   => int
  time.tv_sec => int

visibility: public
PK�}[b�]�� ri/1.8/system/Time/w3cdtf-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Time#w3cdtf
is_singleton: false
name: w3cdtf
params: ()
visibility: public
PK�}[k[P�jj ri/1.8/system/Time/mktime-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Same as <tt>Time::gm</tt>, but interprets the values in the local time zone.
- !ruby/struct:SM::Flow::VERB 
  body: "   Time.local(2000,&quot;jan&quot;,1,20,15,1)   #=&gt; Sat Jan 01 20:15:01 CST 2000\n"
full_name: Time::mktime
is_singleton: true
name: mktime
params: |
  Time.local( year [, month, day, hour, min, sec, usec] ) => time
  Time.local( sec, min, hour, day, month, year, wday, yday, isdst,
  tz ) => time
  Time.mktime( year, month, day, hour, min, sec, usec )   => time

visibility: public
PK�}[�����ri/1.8/system/Time/to_a-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns a ten-element <em>array</em> of values for <em>time</em>: {<tt>[ sec, min, hour, day, month, year, wday, yday, isdst, zone ]</tt>}. See the individual methods for an explanation of the valid ranges of each value. The ten elements can be passed directly to <tt>Time::utc</tt> or <tt>Time::local</tt> to create a new <tt>Time</tt>."
- !ruby/struct:SM::Flow::VERB 
  body: "   now = Time.now   #=&gt; Wed Apr 09 08:56:04 CDT 2003\n   t = now.to_a     #=&gt; [4, 56, 8, 9, 4, 2003, 3, 99, true, &quot;CDT&quot;]\n"
full_name: Time#to_a
is_singleton: false
name: to_a
params: |
  time.to_a => array

visibility: public
PK�}[��
~��ri/1.8/system/Time/hour-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the hour of the day (0..23) for <em>time</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now   #=&gt; Wed Apr 09 08:56:03 CDT 2003\n   t.hour         #=&gt; 8\n"
full_name: Time#hour
is_singleton: false
name: hour
params: |
  time.hour => fixnum

visibility: public
PK�}[�L�ri/1.8/system/Time/times-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Deprecated in favor of <tt>Process::times</tt>
full_name: Time::times
is_singleton: true
name: times
params: |
  Time.times => struct_tms

visibility: public
PK�}[�����%ri/1.8/system/Time/to_datetime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Time#to_datetime
is_singleton: false
name: to_datetime
params: ()
visibility: private
PK�}[$���&ri/1.8/system/Time/apply_offset-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Time::apply_offset
is_singleton: true
name: apply_offset
params: (year, mon, day, hour, min, sec, off)
visibility: private
PK�}[n@|ri/1.8/system/Time/gm-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a time based on given values, interpreted as UTC (GMT). The year must be specified. Other values default to the minimum value for that field (and may be <tt>nil</tt> or omitted). Months may be specified by numbers from 1 to 12, or by the three-letter English month names. Hours are specified on a 24-hour clock (0..23). Raises an <tt>ArgumentError</tt> if any values are out of range. Will also accept ten arguments in the order output by <tt>Time#to_a</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   Time.utc(2000,&quot;jan&quot;,1,20,15,1)  #=&gt; Sat Jan 01 20:15:01 UTC 2000\n   Time.gm(2000,&quot;jan&quot;,1,20,15,1)   #=&gt; Sat Jan 01 20:15:01 UTC 2000\n"
full_name: Time::gm
is_singleton: true
name: gm
params: |
  Time.utc( year [, month, day, hour, min, sec, usec] ) => time
  Time.utc( sec, min, hour, day, month, year, wday, yday, isdst, tz
  ) => time
  Time.gm( year [, month, day, hour, min, sec, usec] ) => time
  Time.gm( sec, min, hour, day, month, year, wday, yday, isdst, tz
  ) => time

visibility: public
PK�}[���O__ri/1.8/system/Time/sec-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the second of the minute (0..60)<em>[Yes, seconds really can range from zero to 60. This allows the system to inject leap seconds every now and then to correct for the fact that years are not really a convenient number of hours long.]</em> for <em>time</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now   #=&gt; Wed Apr 09 08:56:04 CDT 2003\n   t.sec          #=&gt; 4\n"
full_name: Time#sec
is_singleton: false
name: sec
params: |
  time.sec => fixnum

visibility: public
PK�}[�l{��!ri/1.8/system/Time/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Time#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PK�}[��{0��$ri/1.8/system/Time/month_days-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Time::month_days
is_singleton: true
name: month_days
params: (y, m)
visibility: private
PK�}[��-�ri/1.8/system/Time/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a hash code for this time object.
full_name: Time#hash
is_singleton: false
name: hash
params: |
  time.hash   => fixnum

visibility: public
PK�}[� �|
|
ri/1.8/system/Time/parse-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (year)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parses <tt>date</tt> using Date._parse and converts it to a Time object.
- !ruby/struct:SM::Flow::P 
  body: "If a block is given, the year described in <tt>date</tt> is converted by the block. For example:"
- !ruby/struct:SM::Flow::VERB 
  body: "    Time.parse(...) {|y| y &lt; 100 ? (y &gt;= 69 ? y + 1900 : y + 2000) : y}\n"
- !ruby/struct:SM::Flow::P 
  body: "If the upper components of the given time are broken or missing, they are supplied with those of <tt>now</tt>. For the lower components, the minimum values (1 or 0) are assumed if broken or missing. For example:"
- !ruby/struct:SM::Flow::VERB 
  body: "    # Suppose it is &quot;Thu Nov 29 14:33:20 GMT 2001&quot; now and\n    # your timezone is GMT:\n    Time.parse(&quot;16:30&quot;)     #=&gt; Thu Nov 29 16:30:00 GMT 2001\n    Time.parse(&quot;7/23&quot;)      #=&gt; Mon Jul 23 00:00:00 GMT 2001\n    Time.parse(&quot;Aug 31&quot;)    #=&gt; Fri Aug 31 00:00:00 GMT 2001\n"
- !ruby/struct:SM::Flow::P 
  body: "Since there are numerous conflicts among locally defined timezone abbreviations all over the world, this method is not made to understand all of them. For example, the abbreviation &quot;CST&quot; is used variously as:"
- !ruby/struct:SM::Flow::VERB 
  body: "    -06:00 in America/Chicago,\n    -05:00 in America/Havana,\n    +08:00 in Asia/Harbin,\n    +09:30 in Australia/Darwin,\n    +10:30 in Australia/Adelaide,\n    etc.\n"
- !ruby/struct:SM::Flow::P 
  body: Based on the fact, this method only understands the timezone abbreviations described in RFC 822 and the system timezone, in the order named. (i.e. a definition in RFC 822 overrides the system timezone definition.) The system timezone is taken from <tt>Time.local(year, 1, 1).zone</tt> and <tt>Time.local(year, 7, 1).zone</tt>. If the extracted timezone abbreviation does not match any of them, it is ignored and the given time is regarded as a local time.
- !ruby/struct:SM::Flow::P 
  body: ArgumentError is raised if Date._parse cannot extract information from <tt>date</tt> or Time class cannot represent specified date.
- !ruby/struct:SM::Flow::P 
  body: "This method can be used as fail-safe for other parsing methods as:"
- !ruby/struct:SM::Flow::VERB 
  body: "  Time.rfc2822(date) rescue Time.parse(date)\n  Time.httpdate(date) rescue Time.parse(date)\n  Time.xmlschema(date) rescue Time.parse(date)\n"
- !ruby/struct:SM::Flow::P 
  body: A failure for Time.parse should be checked, though.
full_name: Time::parse
is_singleton: true
name: parse
params: (date, now=self.now) {|year| ...}
visibility: public
PK�}[�-Y��$ri/1.8/system/Time/utc_offset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the offset in seconds between the timezone of <em>time</em> and UTC.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.gm(2000,1,1,20,15,1)   #=&gt; Sat Jan 01 20:15:01 UTC 2000\n   t.gmt_offset                    #=&gt; 0\n   l = t.getlocal                  #=&gt; Sat Jan 01 14:15:01 CST 2000\n   l.gmt_offset                    #=&gt; -21600\n"
full_name: Time#utc_offset
is_singleton: false
name: utc_offset
params: |
  time.gmt_offset => fixnum
  time.gmtoff     => fixnum
  time.utc_offset => fixnum

visibility: public
PK�}[�vZ}} ri/1.8/system/Time/gmt%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>time</em> represents a time in UTC (GMT).
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now                        #=&gt; Wed Apr 09 08:56:04 CDT 2003\n   t.utc?                              #=&gt; false\n   t = Time.gm(2000,&quot;jan&quot;,1,20,15,1)   #=&gt; Sat Jan 01 20:15:01 UTC 2000\n   t.utc?                              #=&gt; true\n\n   t = Time.now                        #=&gt; Wed Apr 09 08:56:03 CDT 2003\n   t.gmt?                              #=&gt; false\n   t = Time.gm(2000,1,1,20,15,1)       #=&gt; Sat Jan 01 20:15:01 UTC 2000\n   t.gmt?                              #=&gt; true\n"
full_name: Time#gmt?
is_singleton: false
name: gmt?
params: |
  time.utc? => true or false
  time.gmt? => true or false

visibility: public
PK�}[��K!ri/1.8/system/Time/tv_usec-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns just the number of microseconds for <em>time</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now        #=&gt; Wed Apr 09 08:56:04 CDT 2003\n   &quot;%10.6f&quot; % t.to_f   #=&gt; &quot;1049896564.259970&quot;\n   t.usec              #=&gt; 259970\n"
full_name: Time#tv_usec
is_singleton: false
name: tv_usec
params: |
  time.usec    => int
  time.tv_usec => int

visibility: public
PK�}[�J�۠� ri/1.8/system/Time/getutc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new <tt>new_time</tt> object representing <em>time</em> in UTC.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.local(2000,1,1,20,15,1)   #=&gt; Sat Jan 01 20:15:01 CST 2000\n   t.gmt?                             #=&gt; false\n   y = t.getgm                        #=&gt; Sun Jan 02 02:15:01 UTC 2000\n   y.gmt?                             #=&gt; true\n   t == y                             #=&gt; true\n"
full_name: Time#getutc
is_singleton: false
name: getutc
params: |
  time.getgm  => new_time
  time.getutc => new_time

visibility: public
PK�}[ٱeU��"ri/1.8/system/Time/yaml_new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Time::yaml_new
is_singleton: true
name: yaml_new
params: ( klass, tag, val )
visibility: public
PK�}[w_=��ri/1.8/system/Time/min-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the minute of the hour (0..59) for <em>time</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now   #=&gt; Wed Apr 09 08:56:03 CDT 2003\n   t.min          #=&gt; 56\n"
full_name: Time#min
is_singleton: false
name: min
params: |
  time.min => fixnum

visibility: public
PK�}[zW���!ri/1.8/system/Time/to_date-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: def to_time() getlocal end
full_name: Time#to_date
is_singleton: false
name: to_date
params: ()
visibility: private
PK�}[���̖�ri/1.8/system/Time/year-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the year for <em>time</em> (including the century).
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now   #=&gt; Wed Apr 09 08:56:04 CDT 2003\n   t.year         #=&gt; 2003\n"
full_name: Time#year
is_singleton: false
name: year
params: |
  time.year => fixnum

visibility: public
PK�}[�;"ri/1.8/system/Time/strftime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Formats <em>time</em> according to the directives in the given format string. Any text not listed as a directive will be passed through to the output string.
- !ruby/struct:SM::Flow::P 
  body: "Format meaning:"
- !ruby/struct:SM::Flow::VERB 
  body: "  %a - The abbreviated weekday name (``Sun'')\n  %A - The  full  weekday  name (``Sunday'')\n  %b - The abbreviated month name (``Jan'')\n  %B - The  full  month  name (``January'')\n  %c - The preferred local date and time representation\n  %d - Day of the month (01..31)\n  %H - Hour of the day, 24-hour clock (00..23)\n  %I - Hour of the day, 12-hour clock (01..12)\n  %j - Day of the year (001..366)\n  %m - Month of the year (01..12)\n  %M - Minute of the hour (00..59)\n  %p - Meridian indicator (``AM''  or  ``PM'')\n  %S - Second of the minute (00..60)\n  %U - Week  number  of the current year,\n          starting with the first Sunday as the first\n          day of the first week (00..53)\n  %W - Week  number  of the current year,\n          starting with the first Monday as the first\n          day of the first week (00..53)\n  %w - Day of the week (Sunday is 0, 0..6)\n  %x - Preferred representation for the date alone, no time\n  %X - Preferred representation for the time alone, no date\n  %y - Year without a century (00..99)\n  %Y - Year with century\n  %Z - Time zone name\n  %% - Literal ``%'' character\n\n   t = Time.now\n   t.strftime(&quot;Printed on %m/%d/%Y&quot;)   #=&gt; &quot;Printed on 04/09/2003&quot;\n   t.strftime(&quot;at %I:%M%p&quot;)            #=&gt; &quot;at 08:56AM&quot;\n"
full_name: Time#strftime
is_singleton: false
name: strftime
params: |
  time.strftime( string ) => string

visibility: public
PK�}[��Q$//!ri/1.8/system/Time/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a string representing <em>time</em>. Equivalent to calling <tt>Time#strftime</tt> with a format string of ``<tt>%a</tt> <tt>%b</tt> <tt>%d</tt> <tt>%H:%M:%S</tt> <tt>%Z</tt> <tt>%Y</tt>''.
- !ruby/struct:SM::Flow::VERB 
  body: "   Time.now.to_s   #=&gt; &quot;Wed Apr 09 08:56:04 CDT 2003&quot;\n"
full_name: Time#inspect
is_singleton: false
name: inspect
params: |
  time.inspect => string
  time.to_s    => string

visibility: public
PK�}[:ʹ}��ri/1.8/system/Time/wday-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an integer representing the day of the week, 0..6, with Sunday == 0.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now   #=&gt; Wed Apr 09 08:56:04 CDT 2003\n   t.wday         #=&gt; 3\n"
full_name: Time#wday
is_singleton: false
name: wday
params: |
  time.wday => fixnum

visibility: public
PK�}[m]�--#ri/1.8/system/Time/localtime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts <em>time</em> to local time (using the local time zone in effect for this process) modifying the receiver.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.gm(2000, &quot;jan&quot;, 1, 20, 15, 1)\n   t.gmt?        #=&gt; true\n   t.localtime   #=&gt; Sat Jan 01 14:15:01 CST 2000\n   t.gmt?        #=&gt; false\n"
full_name: Time#localtime
is_singleton: false
name: localtime
params: |
  time.localtime => time

visibility: public
PK�}[������"ri/1.8/system/Time/httpdate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns a string which represents the time as rfc1123-date of HTTP-date defined by RFC 2616:"
- !ruby/struct:SM::Flow::VERB 
  body: "  day-of-week, DD month-name CCYY hh:mm:ss GMT\n"
- !ruby/struct:SM::Flow::P 
  body: Note that the result is always UTC (GMT).
full_name: Time#httpdate
is_singleton: false
name: httpdate
params: ()
visibility: public
PK�}[��(hhri/1.8/system/Time/local-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Same as <tt>Time::gm</tt>, but interprets the values in the local time zone.
- !ruby/struct:SM::Flow::VERB 
  body: "   Time.local(2000,&quot;jan&quot;,1,20,15,1)   #=&gt; Sat Jan 01 20:15:01 CST 2000\n"
full_name: Time::local
is_singleton: true
name: local
params: |
  Time.local( year [, month, day, hour, min, sec, usec] ) => time
  Time.local( sec, min, hour, day, month, year, wday, yday, isdst,
  tz ) => time
  Time.mktime( year, month, day, hour, min, sec, usec )   => time

visibility: public
PK�}[gR�޸�ri/1.8/system/Time/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Document-method: now"
- !ruby/struct:SM::Flow::P 
  body: Synonym for <tt>Time.new</tt>. Returns a <tt>Time</tt> object initialized tot he current system time.
- !ruby/struct:SM::Flow::P 
  body: Returns a <tt>Time</tt> object initialized to the current system time. <b>Note:</b> The object created will be created using the resolution available on your system clock, and so may include fractional seconds.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = Time.new      #=&gt; Wed Apr 09 08:56:03 CDT 2003\n   b = Time.new      #=&gt; Wed Apr 09 08:56:03 CDT 2003\n   a == b            #=&gt; false\n   &quot;%.6f&quot; % a.to_f   #=&gt; &quot;1049896563.230740&quot;\n   &quot;%.6f&quot; % b.to_f   #=&gt; &quot;1049896563.231466&quot;\n"
full_name: Time::new
is_singleton: true
name: new
params: |
  Time.new -> time

visibility: public
PK�}[�����&ri/1.8/system/Time/marshal_load-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: undocumented
full_name: Time#marshal_load
is_singleton: false
name: marshal_load
params: (p1)
visibility: public
PK�}[h����� ri/1.8/system/Time/rfc822-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #rfc2822"
full_name: Time#rfc822
is_singleton: false
name: rfc822
params: ()
visibility: public
PK�}[����ri/1.8/system/Time/usec-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns just the number of microseconds for <em>time</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now        #=&gt; Wed Apr 09 08:56:04 CDT 2003\n   &quot;%10.6f&quot; % t.to_f   #=&gt; &quot;1049896564.259970&quot;\n   t.usec              #=&gt; 259970\n"
full_name: Time#usec
is_singleton: false
name: usec
params: |
  time.usec    => int
  time.tv_usec => int

visibility: public
PK�}[-���%ri/1.8/system/Time/zone_offset-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Time::zone_offset
is_singleton: true
name: zone_offset
params: (zone, year=self.now.year)
visibility: public
PK�}[��Z�FF"ri/1.8/system/Time/cdesc-Time.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: _load
- !ruby/object:RI::MethodSummary 
  name: apply_offset
- !ruby/object:RI::MethodSummary 
  name: at
- !ruby/object:RI::MethodSummary 
  name: gm
- !ruby/object:RI::MethodSummary 
  name: httpdate
- !ruby/object:RI::MethodSummary 
  name: local
- !ruby/object:RI::MethodSummary 
  name: make_time
- !ruby/object:RI::MethodSummary 
  name: mktime
- !ruby/object:RI::MethodSummary 
  name: month_days
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: now
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: rfc2822
- !ruby/object:RI::MethodSummary 
  name: times
- !ruby/object:RI::MethodSummary 
  name: utc
- !ruby/object:RI::MethodSummary 
  name: w3cdtf
- !ruby/object:RI::MethodSummary 
  name: xmlschema
- !ruby/object:RI::MethodSummary 
  name: yaml_new
- !ruby/object:RI::MethodSummary 
  name: zone_offset
- !ruby/object:RI::MethodSummary 
  name: zone_utc?
comment: 
- !ruby/struct:SM::Flow::P 
  body: Implements the extensions to the Time class that are described in the documentation for the time.rb library.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: ZoneOffset
  value: "{       'UTC' => 0,       # ISO 8601       'Z' => 0,       # RFC 822       'UT' => 0, 'GMT' => 0,       'EST' => -5, 'EDT' => -4,       'CST' => -6, 'CDT' => -5,       'MST' => -7, 'MDT' => -6,       'PST' => -8, 'PDT' => -7,       # Following definition of military zones is original one.       # See RFC 1123 and RFC 2822 for the error in RFC 822.       'A' => +1, 'B' => +2, 'C' => +3, 'D' => +4,  'E' => +5,  'F' => +6,        'G' => +7, 'H' => +8, 'I' => +9, 'K' => +10, 'L' => +11, 'M' => +12,       'N' => -1, 'O' => -2, 'P' => -3, 'Q' => -4,  'R' => -5,  'S' => -6,        'T' => -7, 'U' => -8, 'V' => -9, 'W' => -10, 'X' => -11, 'Y' => -12,     }"
- !ruby/object:RI::Constant 
  comment: 
  name: LeapYearMonthDays
  value: "[31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]"
- !ruby/object:RI::Constant 
  comment: 
  name: CommonYearMonthDays
  value: "[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]"
- !ruby/object:RI::Constant 
  comment: 
  name: MonthValue
  value: "{       'JAN' => 1, 'FEB' => 2, 'MAR' => 3, 'APR' => 4, 'MAY' => 5, 'JUN' => 6,       'JUL' => 7, 'AUG' => 8, 'SEP' => 9, 'OCT' =>10, 'NOV' =>11, 'DEC' =>12"
- !ruby/object:RI::Constant 
  comment: 
  name: RFC2822_DAY_NAME
  value: "[     'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'"
- !ruby/object:RI::Constant 
  comment: 
  name: RFC2822_MONTH_NAME
  value: "[     'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',     'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'"
full_name: Time
includes: 
- !ruby/object:RI::IncludedModule 
  name: Comparable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: +
- !ruby/object:RI::MethodSummary 
  name: "-"
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: _dump
- !ruby/object:RI::MethodSummary 
  name: asctime
- !ruby/object:RI::MethodSummary 
  name: ctime
- !ruby/object:RI::MethodSummary 
  name: day
- !ruby/object:RI::MethodSummary 
  name: dst?
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: getgm
- !ruby/object:RI::MethodSummary 
  name: getlocal
- !ruby/object:RI::MethodSummary 
  name: getutc
- !ruby/object:RI::MethodSummary 
  name: gmt?
- !ruby/object:RI::MethodSummary 
  name: gmt_offset
- !ruby/object:RI::MethodSummary 
  name: gmtime
- !ruby/object:RI::MethodSummary 
  name: gmtoff
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: hour
- !ruby/object:RI::MethodSummary 
  name: httpdate
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: isdst
- !ruby/object:RI::MethodSummary 
  name: iso8601
- !ruby/object:RI::MethodSummary 
  name: localtime
- !ruby/object:RI::MethodSummary 
  name: marshal_dump
- !ruby/object:RI::MethodSummary 
  name: marshal_load
- !ruby/object:RI::MethodSummary 
  name: mday
- !ruby/object:RI::MethodSummary 
  name: min
- !ruby/object:RI::MethodSummary 
  name: mon
- !ruby/object:RI::MethodSummary 
  name: month
- !ruby/object:RI::MethodSummary 
  name: rfc2822
- !ruby/object:RI::MethodSummary 
  name: rfc822
- !ruby/object:RI::MethodSummary 
  name: sec
- !ruby/object:RI::MethodSummary 
  name: strftime
- !ruby/object:RI::MethodSummary 
  name: succ
- !ruby/object:RI::MethodSummary 
  name: to_a
- !ruby/object:RI::MethodSummary 
  name: to_date
- !ruby/object:RI::MethodSummary 
  name: to_datetime
- !ruby/object:RI::MethodSummary 
  name: to_f
- !ruby/object:RI::MethodSummary 
  name: to_i
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: to_yaml
- !ruby/object:RI::MethodSummary 
  name: tv_sec
- !ruby/object:RI::MethodSummary 
  name: tv_usec
- !ruby/object:RI::MethodSummary 
  name: usec
- !ruby/object:RI::MethodSummary 
  name: utc
- !ruby/object:RI::MethodSummary 
  name: utc?
- !ruby/object:RI::MethodSummary 
  name: utc_offset
- !ruby/object:RI::MethodSummary 
  name: w3cdtf
- !ruby/object:RI::MethodSummary 
  name: wday
- !ruby/object:RI::MethodSummary 
  name: xmlschema
- !ruby/object:RI::MethodSummary 
  name: yday
- !ruby/object:RI::MethodSummary 
  name: year
- !ruby/object:RI::MethodSummary 
  name: zone
name: Time
superclass: Object
PK�}[���� ri/1.8/system/Time/gmtoff-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the offset in seconds between the timezone of <em>time</em> and UTC.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.gm(2000,1,1,20,15,1)   #=&gt; Sat Jan 01 20:15:01 UTC 2000\n   t.gmt_offset                    #=&gt; 0\n   l = t.getlocal                  #=&gt; Sat Jan 01 14:15:01 CST 2000\n   l.gmt_offset                    #=&gt; -21600\n"
full_name: Time#gmtoff
is_singleton: false
name: gmtoff
params: |
  time.gmt_offset => fixnum
  time.gmtoff     => fixnum
  time.utc_offset => fixnum

visibility: public
PK�}[1V3�66ri/1.8/system/Time/zone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the name of the time zone used for <em>time</em>. As of Ruby 1.8, returns ``UTC'' rather than ``GMT'' for UTC times.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.gm(2000, &quot;jan&quot;, 1, 20, 15, 1)\n   t.zone   #=&gt; &quot;UTC&quot;\n   t = Time.local(2000, &quot;jan&quot;, 1, 20, 15, 1)\n   t.zone   #=&gt; &quot;CST&quot;\n"
full_name: Time#zone
is_singleton: false
name: zone
params: |
  time.zone => string

visibility: public
PK�}[m�hޯ�%ri/1.8/system/Time/zone_utc%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Time::zone_utc?
is_singleton: true
name: zone_utc?
params: (zone)
visibility: private
PK�}[����ff#ri/1.8/system/Time/xmlschema-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parses <tt>date</tt> as dateTime defined by XML Schema and converts it to a Time object. The format is restricted version of the format defined by ISO 8601.
- !ruby/struct:SM::Flow::P 
  body: ArgumentError is raised if <tt>date</tt> is not compliant with the format or Time class cannot represent specified date.
- !ruby/struct:SM::Flow::P 
  body: "See #xmlschema for more information on this format."
full_name: Time::xmlschema
is_singleton: true
name: xmlschema
params: (date)
visibility: public
PK�}[AK=͞�ri/1.8/system/Time/getgm-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new <tt>new_time</tt> object representing <em>time</em> in UTC.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.local(2000,1,1,20,15,1)   #=&gt; Sat Jan 01 20:15:01 CST 2000\n   t.gmt?                             #=&gt; false\n   y = t.getgm                        #=&gt; Sun Jan 02 02:15:01 UTC 2000\n   y.gmt?                             #=&gt; true\n   t == y                             #=&gt; true\n"
full_name: Time#getgm
is_singleton: false
name: getgm
params: |
  time.getgm  => new_time
  time.getutc => new_time

visibility: public
PK�}[�pA���ri/1.8/system/Time/month-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the month of the year (1..12) for <em>time</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now   #=&gt; Wed Apr 09 08:56:03 CDT 2003\n   t.mon          #=&gt; 4\n   t.month        #=&gt; 4\n"
full_name: Time#month
is_singleton: false
name: month
params: |
  time.mon   => fixnum
  time.month => fixnum

visibility: public
PK�}[�J#���ri/1.8/system/Time/%2b-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Addition---Adds some number of seconds (possibly fractional) to <em>time</em> and returns that value as a new time.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now         #=&gt; Wed Apr 09 08:56:03 CDT 2003\n   t + (60 * 60 * 24)   #=&gt; Thu Apr 10 08:56:03 CDT 2003\n"
full_name: Time#+
is_singleton: false
name: +
params: |
  time + numeric => time

visibility: public
PK�}[]w�w"ri/1.8/system/Time/httpdate-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parses <tt>date</tt> as HTTP-date defined by RFC 2616 and converts it to a Time object.
- !ruby/struct:SM::Flow::P 
  body: ArgumentError is raised if <tt>date</tt> is not compliant with RFC 2616 or Time class cannot represent specified date.
- !ruby/struct:SM::Flow::P 
  body: "See #httpdate for more information on this format."
full_name: Time::httpdate
is_singleton: true
name: httpdate
params: (date)
visibility: public
PK�}[:C_�ri/1.8/system/Time/succ-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a new time object, one second later than <tt>time</tt>.
full_name: Time#succ
is_singleton: false
name: succ
params: |
  time.succ   => new_time

visibility: public
PK�}[d@���&ri/1.8/system/Time/marshal_dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: undocumented
full_name: Time#marshal_dump
is_singleton: false
name: marshal_dump
params: ()
visibility: public
PK�}[���4��"ri/1.8/system/Time/getlocal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a new <tt>new_time</tt> object representing <em>time</em> in local time (using the local time zone in effect for this process).
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.gm(2000,1,1,20,15,1)   #=&gt; Sat Jan 01 20:15:01 UTC 2000\n   t.gmt?                          #=&gt; true\n   l = t.getlocal                  #=&gt; Sat Jan 01 14:15:01 CST 2000\n   l.gmt?                          #=&gt; false\n   t == l                          #=&gt; true\n"
full_name: Time#getlocal
is_singleton: false
name: getlocal
params: |
  time.getlocal => new_time

visibility: public
PK�}[s�X))ri/1.8/system/Time/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a string representing <em>time</em>. Equivalent to calling <tt>Time#strftime</tt> with a format string of ``<tt>%a</tt> <tt>%b</tt> <tt>%d</tt> <tt>%H:%M:%S</tt> <tt>%Z</tt> <tt>%Y</tt>''.
- !ruby/struct:SM::Flow::VERB 
  body: "   Time.now.to_s   #=&gt; &quot;Wed Apr 09 08:56:04 CDT 2003&quot;\n"
full_name: Time#to_s
is_singleton: false
name: to_s
params: |
  time.inspect => string
  time.to_s    => string

visibility: public
PK�}[UӪri/1.8/system/Time/_dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Dump <em>time</em> for marshaling.
full_name: Time#_dump
is_singleton: false
name: _dump
params: |
  time._dump   => string

visibility: public
PK�}[w�!55!ri/1.8/system/Time/rfc2822-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: rfc822
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns a string which represents the time as date-time defined by RFC 2822:"
- !ruby/struct:SM::Flow::VERB 
  body: "  day-of-week, DD month-name CCYY hh:mm:ss zone\n"
- !ruby/struct:SM::Flow::P 
  body: where zone is [+-]hhmm.
- !ruby/struct:SM::Flow::P 
  body: If <tt>self</tt> is a UTC time, -0000 is used as zone.
full_name: Time#rfc2822
is_singleton: false
name: rfc2822
params: ()
visibility: public
PK�}[1D�؁�ri/1.8/system/Time/utc-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a time based on given values, interpreted as UTC (GMT). The year must be specified. Other values default to the minimum value for that field (and may be <tt>nil</tt> or omitted). Months may be specified by numbers from 1 to 12, or by the three-letter English month names. Hours are specified on a 24-hour clock (0..23). Raises an <tt>ArgumentError</tt> if any values are out of range. Will also accept ten arguments in the order output by <tt>Time#to_a</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   Time.utc(2000,&quot;jan&quot;,1,20,15,1)  #=&gt; Sat Jan 01 20:15:01 UTC 2000\n   Time.gm(2000,&quot;jan&quot;,1,20,15,1)   #=&gt; Sat Jan 01 20:15:01 UTC 2000\n"
full_name: Time::utc
is_singleton: true
name: utc
params: |
  Time.utc( year [, month, day, hour, min, sec, usec] ) => time
  Time.utc( sec, min, hour, day, month, year, wday, yday, isdst, tz
  ) => time
  Time.gm( year [, month, day, hour, min, sec, usec] ) => time
  Time.gm( sec, min, hour, day, month, year, wday, yday, isdst, tz
  ) => time

visibility: public
PK�}[&�7��$ri/1.8/system/Time/gmt_offset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the offset in seconds between the timezone of <em>time</em> and UTC.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.gm(2000,1,1,20,15,1)   #=&gt; Sat Jan 01 20:15:01 UTC 2000\n   t.gmt_offset                    #=&gt; 0\n   l = t.getlocal                  #=&gt; Sat Jan 01 14:15:01 CST 2000\n   l.gmt_offset                    #=&gt; -21600\n"
full_name: Time#gmt_offset
is_singleton: false
name: gmt_offset
params: |
  time.gmt_offset => fixnum
  time.gmtoff     => fixnum
  time.utc_offset => fixnum

visibility: public
PK�}[�L�;pp!ri/1.8/system/Time/rfc2822-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parses <tt>date</tt> as date-time defined by RFC 2822 and converts it to a Time object. The format is identical to the date format defined by RFC 822 and updated by RFC 1123.
- !ruby/struct:SM::Flow::P 
  body: ArgumentError is raised if <tt>date</tt> is not compliant with RFC 2822 or Time class cannot represent specified date.
- !ruby/struct:SM::Flow::P 
  body: "See #rfc2822 for more information on this format."
full_name: Time::rfc2822
is_singleton: true
name: rfc2822
params: (date)
visibility: public
PK�}[�R�}} ri/1.8/system/Time/utc%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>time</em> represents a time in UTC (GMT).
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now                        #=&gt; Wed Apr 09 08:56:04 CDT 2003\n   t.utc?                              #=&gt; false\n   t = Time.gm(2000,&quot;jan&quot;,1,20,15,1)   #=&gt; Sat Jan 01 20:15:01 UTC 2000\n   t.utc?                              #=&gt; true\n\n   t = Time.now                        #=&gt; Wed Apr 09 08:56:03 CDT 2003\n   t.gmt?                              #=&gt; false\n   t = Time.gm(2000,1,1,20,15,1)       #=&gt; Sat Jan 01 20:15:01 UTC 2000\n   t.gmt?                              #=&gt; true\n"
full_name: Time#utc?
is_singleton: false
name: utc?
params: |
  time.utc? => true or false
  time.gmt? => true or false

visibility: public
PK�}[L�DD ri/1.8/system/Time/dst%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns <tt>true</tt> if <em>time</em> occurs during Daylight Saving Time in its time zone.
- !ruby/struct:SM::Flow::VERB 
  body: "   Time.local(2000, 7, 1).isdst   #=&gt; true\n   Time.local(2000, 1, 1).isdst   #=&gt; false\n   Time.local(2000, 7, 1).dst?    #=&gt; true\n   Time.local(2000, 1, 1).dst?    #=&gt; false\n"
full_name: Time#dst?
is_singleton: false
name: dst?
params: |
  time.isdst => true or false
  time.dst?  => true or false

visibility: public
PK�}[�p��ri/1.8/system/Time/to_f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the value of <em>time</em> as a floating point number of seconds since epoch.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now\n   &quot;%10.5f&quot; % t.to_f   #=&gt; &quot;1049896564.13654&quot;\n   t.to_i              #=&gt; 1049896564\n"
full_name: Time#to_f
is_singleton: false
name: to_f
params: |
  time.to_f => float

visibility: public
PK�}[KEk���#ri/1.8/system/Time/xmlschema-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: iso8601
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Returns a string which represents the time as dateTime defined by XML Schema:"
- !ruby/struct:SM::Flow::VERB 
  body: "  CCYY-MM-DDThh:mm:ssTZD\n  CCYY-MM-DDThh:mm:ss.sssTZD\n"
- !ruby/struct:SM::Flow::P 
  body: where TZD is Z or [+-]hh:mm.
- !ruby/struct:SM::Flow::P 
  body: If self is a UTC time, Z is used as TZD. [+-]hh:mm is used otherwise.
- !ruby/struct:SM::Flow::P 
  body: <tt>fractional_seconds</tt> specifies a number of digits of fractional seconds. Its default value is 0.
full_name: Time#xmlschema
is_singleton: false
name: xmlschema
params: (fraction_digits=0)
visibility: public
PK�}[UU��}}ri/1.8/system/Time/now-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Synonym for <tt>Time.new</tt>. Returns a <tt>Time</tt> object initialized tot he current system time.
- !ruby/struct:SM::Flow::P 
  body: Returns a <tt>Time</tt> object initialized to the current system time. <b>Note:</b> The object created will be created using the resolution available on your system clock, and so may include fractional seconds.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = Time.new      #=&gt; Wed Apr 09 08:56:03 CDT 2003\n   b = Time.new      #=&gt; Wed Apr 09 08:56:03 CDT 2003\n   a == b            #=&gt; false\n   &quot;%.6f&quot; % a.to_f   #=&gt; &quot;1049896563.230740&quot;\n   &quot;%.6f&quot; % b.to_f   #=&gt; &quot;1049896563.231466&quot;\n"
full_name: Time::now
is_singleton: true
name: now
params: |
  Time.new -> time

visibility: public
PK�}[�t
���#ri/1.8/system/Time/make_time-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Time::make_time
is_singleton: true
name: make_time
params: (year, mon, day, hour, min, sec, sec_fraction, zone, now)
visibility: private
PK�}[y�I��ri/1.8/system/Time/yday-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns an integer representing the day of the year, 1..366.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now   #=&gt; Wed Apr 09 08:56:04 CDT 2003\n   t.yday         #=&gt; 99\n"
full_name: Time#yday
is_singleton: false
name: yday
params: |
  time.yday => fixnum

visibility: public
PK�}[(���!ri/1.8/system/Time/asctime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns a canonical string representation of <em>time</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   Time.now.asctime   #=&gt; &quot;Wed Apr  9 08:56:03 2003&quot;\n"
full_name: Time#asctime
is_singleton: false
name: asctime
params: |
  time.asctime => string
  time.ctime   => string

visibility: public
PK�}[��џ�ri/1.8/system/Time/%2d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Difference---Returns a new time that represents the difference between two times, or subtracts the given number of seconds in <em>numeric</em> from <em>time</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "   t = Time.now       #=&gt; Wed Apr 09 08:56:03 CDT 2003\n   t2 = t + 2592000   #=&gt; Fri May 09 08:56:03 CDT 2003\n   t2 - t             #=&gt; 2592000.0\n   t2 - 2592000       #=&gt; Wed Apr 09 08:56:03 CDT 2003\n"
full_name: Time#-
is_singleton: false
name: "-"
params: |
  time - other_time => float
  time - numeric    => time

visibility: public
PK�}[H!�IIGri/1.8/system/OptionParser/RequiredArgument/cdesc-RequiredArgument.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Switch that takes an argument.
constants: []

full_name: OptionParser::RequiredArgument
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse
name: RequiredArgument
superclass: self
PK�}[���8ri/1.8/system/OptionParser/RequiredArgument/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Raises an exception if argument is not present.
full_name: OptionParser::RequiredArgument#parse
is_singleton: false
name: parse
params: (arg, argv)
visibility: public
PK�}[J��""2ri/1.8/system/OptionParser/cdesc-OptionParser.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::H 
  level: 2
  text: Developer Documentation (not for RDoc output)
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Class tree
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "OptionParser:: front end"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "OptionParser::Switch:: each switches"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "OptionParser::List:: options list"
  - !ruby/struct:SM::Flow::LI 
    label: "-"
    body: "OptionParser::ParseError:: errors on parsing"
  - !ruby/object:SM::Flow::LIST 
    contents: 
    - !ruby/struct:SM::Flow::LI 
      label: "-"
      body: OptionParser::AmbiguousOption
    - !ruby/struct:SM::Flow::LI 
      label: "-"
      body: OptionParser::NeedlessArgument
    - !ruby/struct:SM::Flow::LI 
      label: "-"
      body: OptionParser::MissingArgument
    - !ruby/struct:SM::Flow::LI 
      label: "-"
      body: OptionParser::InvalidOption
    - !ruby/struct:SM::Flow::LI 
      label: "-"
      body: OptionParser::InvalidArgument
    - !ruby/object:SM::Flow::LIST 
      contents: 
      - !ruby/struct:SM::Flow::LI 
        label: "-"
        body: OptionParser::AmbiguousArgument
      type: :BULLET
    type: :BULLET
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Object relationship diagram
- !ruby/struct:SM::Flow::VERB 
  body: "  +--------------+\n  | OptionParser |&lt;&gt;-----+\n  +--------------+       |                      +--------+\n                         |                    ,-| Switch |\n       on_head --------&gt;+---------------+    /  +--------+\n       accept/reject --&gt;| List          |&lt;|&gt;-\n                        |               |&lt;|&gt;-  +----------+\n       on -------------&gt;+---------------+    `-| argument |\n                          :           :        |  class   |\n                        +---------------+      |==========|\n       on_tail --------&gt;|               |      |pattern   |\n                        +---------------+      |----------|\n  OptionParser.accept -&gt;| DefaultList   |      |converter |\n               reject   |(shared between|      +----------+\n                        | all instances)|\n                        +---------------+\n"
- !ruby/struct:SM::Flow::H 
  level: 2
  text: OptionParser
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Introduction
- !ruby/struct:SM::Flow::P 
  body: OptionParser is a class for command-line option analysis. It is much more advanced, yet also easier to use, than GetoptLong, and is a more Ruby-oriented solution.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Features
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "1."
    body: The argument specification and the code to handle it are written in the same place.
  - !ruby/struct:SM::Flow::LI 
    label: "2."
    body: It can output an option summary; you don't need to maintain this string separately.
  - !ruby/struct:SM::Flow::LI 
    label: "3."
    body: Optional and mandatory arguments are specified very gracefully.
  - !ruby/struct:SM::Flow::LI 
    label: "4."
    body: Arguments can be automatically converted to a specified class.
  - !ruby/struct:SM::Flow::LI 
    label: "5."
    body: Arguments can be restricted to a certain set.
  type: :NUMBER
- !ruby/struct:SM::Flow::P 
  body: All of these features are demonstrated in the examples below.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Minimal example
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'optparse'\n\n  options = {}\n  OptionParser.new do |opts|\n    opts.banner = &quot;Usage: example.rb [options]&quot;\n\n    opts.on(&quot;-v&quot;, &quot;--[no-]verbose&quot;, &quot;Run verbosely&quot;) do |v|\n      options[:verbose] = v\n    end\n  end.parse!\n\n  p options\n  p ARGV\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Complete example
- !ruby/struct:SM::Flow::P 
  body: The following example is a complete Ruby program. You can run it and see the effect of specifying various options. This is probably the best way to learn the features of <tt>optparse</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "  require 'optparse'\n  require 'optparse/time'\n  require 'ostruct'\n  require 'pp'\n\n  class OptparseExample\n\n    CODES = %w[iso-2022-jp shift_jis euc-jp utf8 binary]\n    CODE_ALIASES = { &quot;jis&quot; =&gt; &quot;iso-2022-jp&quot;, &quot;sjis&quot; =&gt; &quot;shift_jis&quot; }\n\n    #\n    # Return a structure describing the options.\n    #\n    def self.parse(args)\n      # The options specified on the command line will be collected in <b>options</b>.\n      # We set default values here.\n      options = OpenStruct.new\n      options.library = []\n      options.inplace = false\n      options.encoding = &quot;utf8&quot;\n      options.transfer_type = :auto\n      options.verbose = false\n\n      opts = OptionParser.new do |opts|\n        opts.banner = &quot;Usage: example.rb [options]&quot;\n\n        opts.separator &quot;&quot;\n        opts.separator &quot;Specific options:&quot;\n\n        # Mandatory argument.\n        opts.on(&quot;-r&quot;, &quot;--require LIBRARY&quot;,\n                &quot;Require the LIBRARY before executing your script&quot;) do |lib|\n          options.library &lt;&lt; lib\n        end\n\n        # Optional argument; multi-line description.\n        opts.on(&quot;-i&quot;, &quot;--inplace [EXTENSION]&quot;,\n                &quot;Edit ARGV files in place&quot;,\n                &quot;  (make backup if EXTENSION supplied)&quot;) do |ext|\n          options.inplace = true\n          options.extension = ext || ''\n          options.extension.sub!(/\\A\\.?(?=.)/, &quot;.&quot;)  # Ensure extension begins with dot.\n        end\n\n        # Cast 'delay' argument to a Float.\n        opts.on(&quot;--delay N&quot;, Float, &quot;Delay N seconds before executing&quot;) do |n|\n          options.delay = n\n        end\n\n        # Cast 'time' argument to a Time object.\n        opts.on(&quot;-t&quot;, &quot;--time [TIME]&quot;, Time, &quot;Begin execution at given time&quot;) do |time|\n          options.time = time\n        end\n\n        # Cast to octal integer.\n        opts.on(&quot;-F&quot;, &quot;--irs [OCTAL]&quot;, OptionParser::OctalInteger,\n                &quot;Specify record separator (default \\0)&quot;) do |rs|\n          options.record_separator = rs\n        end\n\n        # List of arguments.\n        opts.on(&quot;--list x,y,z&quot;, Array, &quot;Example 'list' of arguments&quot;) do |list|\n          options.list = list\n        end\n\n        # Keyword completion.  We are specifying a specific set of arguments (CODES\n        # and CODE_ALIASES - notice the latter is a Hash), and the user may provide\n        # the shortest unambiguous text.\n        code_list = (CODE_ALIASES.keys + CODES).join(',')\n        opts.on(&quot;--code CODE&quot;, CODES, CODE_ALIASES, &quot;Select encoding&quot;,\n                &quot;  (#{code_list})&quot;) do |encoding|\n          options.encoding = encoding\n        end\n\n        # Optional argument with keyword completion.\n        opts.on(&quot;--type [TYPE]&quot;, [:text, :binary, :auto],\n                &quot;Select transfer type (text, binary, auto)&quot;) do |t|\n          options.transfer_type = t\n        end\n\n        # Boolean switch.\n        opts.on(&quot;-v&quot;, &quot;--[no-]verbose&quot;, &quot;Run verbosely&quot;) do |v|\n          options.verbose = v\n        end\n\n        opts.separator &quot;&quot;\n        opts.separator &quot;Common options:&quot;\n\n        # No argument, shows at tail.  This will print an options summary.\n        # Try it and see!\n        opts.on_tail(&quot;-h&quot;, &quot;--help&quot;, &quot;Show this message&quot;) do\n          puts opts\n          exit\n        end\n\n        # Another typical switch to print the version.\n        opts.on_tail(&quot;--version&quot;, &quot;Show version&quot;) do\n          puts OptionParser::Version.join('.')\n          exit\n        end\n      end\n\n      opts.parse!(args)\n      options\n    end  # parse()\n\n  end  # class OptparseExample\n\n  options = OptparseExample.parse(ARGV)\n  pp options\n"
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Further documentation
- !ruby/struct:SM::Flow::P 
  body: The above examples should be enough to learn how to use this class. If you have any questions, email me (gsinclair@soyabean.com.au) and I will update this document.
constants: []

full_name: OptionParser
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: switch_name
name: OptionParser
superclass: Object
PK�}[����\\9ri/1.8/system/OptionParser/OptionMap/cdesc-OptionMap.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Map from option/keyword string to object with completion.
constants: []

full_name: OptionParser::OptionMap
includes: 
- !ruby/object:RI::IncludedModule 
  name: Completion
instance_methods: []

name: OptionMap
superclass: Hash
PK�}[!I�DD2ri/1.8/system/OptionParser/NoArgument/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (NeedlessArgument, arg)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Raises an exception if any arguments given.
full_name: OptionParser::NoArgument#parse
is_singleton: false
name: parse
params: (arg, argv) {|NeedlessArgument, arg| ...}
visibility: public
PK�}[VވX��Iri/1.8/system/OptionParser/NoArgument/incompatible_argument_styles-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: OptionParser::NoArgument::incompatible_argument_styles
is_singleton: true
name: incompatible_argument_styles
params: (*)
visibility: public
PK�}[��O���;ri/1.8/system/OptionParser/NoArgument/cdesc-NoArgument.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: incompatible_argument_styles
- !ruby/object:RI::MethodSummary 
  name: pattern
comment: 
- !ruby/struct:SM::Flow::P 
  body: Switch that takes no arguments.
constants: []

full_name: OptionParser::NoArgument
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse
name: NoArgument
superclass: self
PK�}[M1���4ri/1.8/system/OptionParser/NoArgument/pattern-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: OptionParser::NoArgument::pattern
is_singleton: true
name: pattern
params: ()
visibility: public
PK�}[��T��4ri/1.8/system/OptionParser/Completion/convert-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: OptionParser::Completion#convert
is_singleton: false
name: convert
params: (opt = nil, val = nil, *)
visibility: public
PK�}[��\��;ri/1.8/system/OptionParser/Completion/cdesc-Completion.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Keyword completion module. This allows partial arguments to be specified and resolved against a list of acceptable values.
constants: []

full_name: OptionParser::Completion
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: complete
- !ruby/object:RI::MethodSummary 
  name: convert
name: Completion
superclass: 
PK�}[��Լ��5ri/1.8/system/OptionParser/Completion/complete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (key, *sw)
comment: 
full_name: OptionParser::Completion#complete
is_singleton: false
name: complete
params: (key, icase = false, pat = nil) {|key, *sw| ...}
visibility: public
PK�}[ j��IIGri/1.8/system/OptionParser/OptionalArgument/cdesc-OptionalArgument.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Switch that can omit argument.
constants: []

full_name: OptionParser::OptionalArgument
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse
name: OptionalArgument
superclass: self
PK�}[���""8ri/1.8/system/OptionParser/OptionalArgument/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parses argument if given, or uses default value.
full_name: OptionParser::OptionalArgument#parse
is_singleton: false
name: parse
params: (arg, argv, &error)
visibility: public
PK�}[�6z�ddCri/1.8/system/OptionParser/PlacedArgument/cdesc-PlacedArgument.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Switch that takes an argument, which does not begin with '-'.
constants: []

full_name: OptionParser::PlacedArgument
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: parse
name: PlacedArgument
superclass: self
PK�}[���**6ri/1.8/system/OptionParser/PlacedArgument/parse-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns nil if argument is not present or begins with '-'.
full_name: OptionParser::PlacedArgument#parse
is_singleton: false
name: parse
params: (arg, argv, &error)
visibility: public
PK�}[T����-ri/1.8/system/OptionParser/switch_name-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Main name of the switch.
full_name: OptionParser#switch_name
is_singleton: false
name: switch_name
params: ()
visibility: public
PK�}[��"��3ri/1.8/system/OptionParser/Switch/cdesc-Switch.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  name: arg
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: block
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: conv
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: desc
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: long
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: pattern
  rw: R
- !ruby/object:RI::Attribute 
  comment: 
  name: short
  rw: R
class_methods: 
- !ruby/object:RI::MethodSummary 
  name: guess
- !ruby/object:RI::MethodSummary 
  name: incompatible_argument_styles
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: pattern
comment: 
- !ruby/struct:SM::Flow::P 
  body: Individual switch class. Not important to the user.
- !ruby/struct:SM::Flow::P 
  body: "Defined within Switch are several Switch-derived classes: NoArgument, RequiredArgument, etc."
constants: []

full_name: OptionParser::Switch
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: conv_arg
- !ruby/object:RI::MethodSummary 
  name: parse_arg
- !ruby/object:RI::MethodSummary 
  name: summarize
name: Switch
superclass: Object
PK�}[D�NN.ri/1.8/system/OptionParser/Switch/guess-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Guesses argument style from <tt>arg</tt>. Returns corresponding OptionParser::Switch class (OptionalArgument, etc.).
full_name: OptionParser::Switch::guess
is_singleton: true
name: guess
params: (arg)
visibility: public
PK�}[��4���1ri/1.8/system/OptionParser/Switch/conv_arg-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parses argument, converts and returns <tt>arg</tt>, <tt>block</tt> and result of conversion. Yields at semi-error condition instead of raising an exception.
full_name: OptionParser::Switch#conv_arg
is_singleton: false
name: conv_arg
params: (arg, val = nil)
visibility: private
PK�}[E�)A��Eri/1.8/system/OptionParser/Switch/incompatible_argument_styles-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: OptionParser::Switch::incompatible_argument_styles
is_singleton: true
name: incompatible_argument_styles
params: (arg, t)
visibility: public
PK�}[0;%�,ri/1.8/system/OptionParser/Switch/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: OptionParser::Switch::new
is_singleton: true
name: new
params: (pattern = nil, conv = nil, short = nil, long = nil, arg = nil, desc = ([] if short or long), block = Proc.new)
visibility: public
PK�}[ƣi���2ri/1.8/system/OptionParser/Switch/parse_arg-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (InvalidArgument, arg)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Parses <tt>arg</tt> and returns rest of <tt>arg</tt> and matched portion to the argument pattern. Yields when the pattern doesn't match substring.
full_name: OptionParser::Switch#parse_arg
is_singleton: false
name: parse_arg
params: (arg) {|InvalidArgument, arg| ...}
visibility: private
PK�}[�qnn2ri/1.8/system/OptionParser/Switch/summarize-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (indent + l)
comment: 
- !ruby/struct:SM::Flow::P 
  body: Produces the summary text. Each line of the summary is yielded to the block (without newline).
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "+sdone+:"
    body: Already summarized short style options keyed hash.
  - !ruby/struct:SM::Flow::LI 
    label: "+ldone+:"
    body: Already summarized long style options keyed hash.
  - !ruby/struct:SM::Flow::LI 
    label: "+width+:"
    body: Width of left side (option part). In other words, the right side (description part) starts after <tt>width</tt> columns.
  - !ruby/struct:SM::Flow::LI 
    label: "+max+:"
    body: Maximum width of left side -&gt; the options are filled within <tt>max</tt> columns.
  - !ruby/struct:SM::Flow::LI 
    label: "+indent+:"
    body: Prefix string indents all summarized lines.
  type: :NOTE
full_name: OptionParser::Switch#summarize
is_singleton: false
name: summarize
params: (sdone = [], ldone = [], width = 1, max = width - 1, indent = "") {|indent + l| ...}
visibility: public
PK�}[���ж�0ri/1.8/system/OptionParser/Switch/pattern-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: OptionParser::Switch::pattern
is_singleton: true
name: pattern
params: ()
visibility: public
PK�}[Y�i4��&ri/1.8/system/UDPSocket/connect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: UDPSocket#connect
is_singleton: false
name: connect
params: (host, port)
visibility: public
PK�}[u�00,ri/1.8/system/UDPSocket/cdesc-UDPSocket.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Class <tt>Socket</tt> provides access to the underlying operating system socket implementations. It can be used to provide more operating system specific functionality than the protocol-specific socket classes but at the expense of greater complexity. In particular, the class handles addresses using +struct sockaddr+ structures packed into Ruby strings, which can be a joy to manipulate.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Exception Handling
- !ruby/struct:SM::Flow::P 
  body: Ruby's implementation of <tt>Socket</tt> causes an exception to be raised based on the error generated by the system dependent implementation. This is why the methods are documented in a way that isolate Unix-based system exceptions from Windows based exceptions. If more information on particular exception is needed please refer to the Unix manual pages or the Windows WinSock reference.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Documentation by
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Zach Dennis
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Sam Roberts
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <em>Programming Ruby</em> from The Pragmatic Bookshelf.
  type: :BULLET
- !ruby/struct:SM::Flow::P 
  body: Much material in this documentation is taken with permission from <em>Programming Ruby</em> from The Pragmatic Bookshelf.
constants: []

full_name: UDPSocket
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: bind
- !ruby/object:RI::MethodSummary 
  name: connect
- !ruby/object:RI::MethodSummary 
  name: recvfrom_nonblock
- !ruby/object:RI::MethodSummary 
  name: send
name: UDPSocket
superclass: Object
PK�}[DP���#ri/1.8/system/UDPSocket/send-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: UDPSocket#send
is_singleton: false
name: send
params: (mesg, flags, *rest)
visibility: public
PK�}[�`�J��0ri/1.8/system/UDPSocket/recvfrom_nonblock-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Receives up to <em>maxlen</em> bytes from <tt>udpsocket</tt> using recvfrom(2) after O_NONBLOCK is set for the underlying file descriptor. <em>flags</em> is zero or more of the <tt>MSG_</tt> options. The first element of the results, <em>mesg</em>, is the data received. The second element, <em>sender_inet_addr</em>, is an array to represent the sender address.
- !ruby/struct:SM::Flow::P 
  body: When recvfrom(2) returns 0, Socket#recvfrom_nonblock returns an empty string as data. It means an empty packet.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Parameters
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>maxlen</tt> - the number of bytes to receive from the socket
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: <tt>flags</tt> - zero or more of the <tt>MSG_</tt> options
  type: :BULLET
- !ruby/struct:SM::Flow::H 
  level: 3
  text: Example
- !ruby/struct:SM::Flow::VERB 
  body: "     require 'socket'\n     s1 = UDPSocket.new\n     s1.bind(&quot;127.0.0.1&quot;, 0)\n     s2 = UDPSocket.new\n     s2.bind(&quot;127.0.0.1&quot;, 0)\n     s2.connect(*s1.addr.values_at(3,1))\n     s1.connect(*s2.addr.values_at(3,1))\n     s1.send &quot;aaa&quot;, 0\n     IO.select([s2])\n     p s2.recvfrom_nonblock(10)  #=&gt; [&quot;aaa&quot;, [&quot;AF_INET&quot;, 33302, &quot;localhost.localdomain&quot;, &quot;127.0.0.1&quot;]]\n"
- !ruby/struct:SM::Flow::P 
  body: Refer to Socket#recvfrom for the exceptions that may be thrown if the call to <em>recvfrom_nonblock</em> fails.
- !ruby/struct:SM::Flow::P 
  body: UDPSocket#recvfrom_nonblock may raise any error corresponding to recvfrom(2) failure, including Errno::EAGAIN.
- !ruby/struct:SM::Flow::H 
  level: 3
  text: See
- !ruby/object:SM::Flow::LIST 
  contents: 
  - !ruby/struct:SM::Flow::LI 
    label: "*"
    body: Socket#recvfrom
  type: :BULLET
full_name: UDPSocket#recvfrom_nonblock
is_singleton: false
name: recvfrom_nonblock
params: |
  udpsocket.recvfrom_nonblock(maxlen) => [mesg, sender_inet_addr]
  udpsocket.recvfrom_nonblock(maxlen, flags) => [mesg, sender_inet_addr]

visibility: public
PK�}[�G�ǯ�#ri/1.8/system/UDPSocket/bind-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: UDPSocket#bind
is_singleton: false
name: bind
params: (host, port)
visibility: public
PK�}[�VaP��"ri/1.8/system/Fill/cdesc-Fill.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Fill
includes: []

instance_methods: []

name: Fill
superclass: Test::Unit::TestCase
PK�}[�q��?ri/1.8/system/XMLEncoding_ja/SJISHandler/cdesc-SJISHandler.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XMLEncoding_ja::SJISHandler
includes: 
- !ruby/object:RI::IncludedModule 
  name: Kconv
instance_methods: []

name: SJISHandler
superclass: Object
PK�}[��$V��6ri/1.8/system/XMLEncoding_ja/cdesc-XMLEncoding_ja.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: XMLEncoding_ja
includes: []

instance_methods: []

name: XMLEncoding_ja
superclass: 
PK�}[�Xhh1ri/1.8/system/ObjectSpace/define_finalizer-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Adds <em>aProc</em> as a finalizer, to be called after <em>obj</em> was destroyed.
full_name: ObjectSpace::define_finalizer
is_singleton: true
name: define_finalizer
params: |
  ObjectSpace.define_finalizer(obj, aProc=proc())

visibility: public
PK�}[I�#�663ri/1.8/system/ObjectSpace/undefine_finalizer-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Removes all finalizers for <em>obj</em>.
full_name: ObjectSpace::undefine_finalizer
is_singleton: true
name: undefine_finalizer
params: |
  ObjectSpace.undefine_finalizer(obj)

visibility: public
PK�}[� !'��/ri/1.8/system/ObjectSpace/call_finalizer-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: deprecated
full_name: ObjectSpace::call_finalizer
is_singleton: true
name: call_finalizer
params: (p1)
visibility: public
PK�}[&��8~~(ri/1.8/system/ObjectSpace/_id2ref-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Converts an object id to a reference to the object. May not be called on an object id passed as a parameter to a finalizer.
- !ruby/struct:SM::Flow::VERB 
  body: "   s = &quot;I am a string&quot;                    #=&gt; &quot;I am a string&quot;\n   r = ObjectSpace._id2ref(s.object_id)   #=&gt; &quot;I am a string&quot;\n   r == s                                 #=&gt; true\n"
full_name: ObjectSpace::_id2ref
is_singleton: true
name: _id2ref
params: |
  ObjectSpace._id2ref(object_id) -> an_object

visibility: public
PK�}[;����0ri/1.8/system/ObjectSpace/cdesc-ObjectSpace.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: _id2ref
- !ruby/object:RI::MethodSummary 
  name: add_finalizer
- !ruby/object:RI::MethodSummary 
  name: call_finalizer
- !ruby/object:RI::MethodSummary 
  name: define_finalizer
- !ruby/object:RI::MethodSummary 
  name: each_object
- !ruby/object:RI::MethodSummary 
  name: finalizers
- !ruby/object:RI::MethodSummary 
  name: garbage_collect
- !ruby/object:RI::MethodSummary 
  name: remove_finalizer
- !ruby/object:RI::MethodSummary 
  name: undefine_finalizer
comment: 
- !ruby/struct:SM::Flow::P 
  body: The <tt>ObjectSpace</tt> module contains a number of routines that interact with the garbage collection facility and allow you to traverse all living objects with an iterator.
- !ruby/struct:SM::Flow::P 
  body: <tt>ObjectSpace</tt> also provides support for object finalizers, procs that will be called when a specific object is about to be destroyed by garbage collection.
- !ruby/struct:SM::Flow::VERB 
  body: "   include ObjectSpace\n\n   a = &quot;A&quot;\n   b = &quot;B&quot;\n   c = &quot;C&quot;\n\n   define_finalizer(a, proc {|id| puts &quot;Finalizer one on #{id}&quot; })\n   define_finalizer(a, proc {|id| puts &quot;Finalizer two on #{id}&quot; })\n   define_finalizer(b, proc {|id| puts &quot;Finalizer three on #{id}&quot; })\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Finalizer three on 537763470\n   Finalizer one on 537763480\n   Finalizer two on 537763480\n"
constants: []

full_name: ObjectSpace
includes: []

instance_methods: []

name: ObjectSpace
superclass: 
PK�}[�d�h��1ri/1.8/system/ObjectSpace/remove_finalizer-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: deprecated
full_name: ObjectSpace::remove_finalizer
is_singleton: true
name: remove_finalizer
params: (p1)
visibility: public
PK�}[�%����0ri/1.8/system/ObjectSpace/garbage_collect-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Initiates garbage collection, unless manually disabled.
full_name: ObjectSpace::garbage_collect
is_singleton: true
name: garbage_collect
params: |
  GC.start                     => nil
  gc.garbage_collect           => nil
  ObjectSpace.garbage_collect  => nil

visibility: public
PK�}[���?��,ri/1.8/system/ObjectSpace/each_object-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls the block once for each living, nonimmediate object in this Ruby process. If <em>module</em> is specified, calls the block for only those classes or modules that match (or are a subclass of) <em>module</em>. Returns the number of objects found. Immediate objects (<tt>Fixnum</tt>s, <tt>Symbol</tt>s <tt>true</tt>, <tt>false</tt>, and <tt>nil</tt>) are never returned. In the example below, <tt>each_object</tt> returns both the numbers we defined and several constants defined in the <tt>Math</tt> module.
- !ruby/struct:SM::Flow::VERB 
  body: "   a = 102.7\n   b = 95       # Won't be returned\n   c = 12345678987654321\n   count = ObjectSpace.each_object(Numeric) {|x| p x }\n   puts &quot;Total count: #{count}&quot;\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   12345678987654321\n   102.7\n   2.71828182845905\n   3.14159265358979\n   2.22044604925031e-16\n   1.7976931348623157e+308\n   2.2250738585072e-308\n   Total count: 7\n"
full_name: ObjectSpace::each_object
is_singleton: true
name: each_object
params: |
  ObjectSpace.each_object([module]) {|obj| ... } => fixnum

visibility: public
PK�}[������.ri/1.8/system/ObjectSpace/add_finalizer-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: deprecated
full_name: ObjectSpace::add_finalizer
is_singleton: true
name: add_finalizer
params: (p1)
visibility: public
PK�}[��63��+ri/1.8/system/ObjectSpace/finalizers-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: deprecated
full_name: ObjectSpace::finalizers
is_singleton: true
name: finalizers
params: ()
visibility: public
PK�}[��ubb"ri/1.8/system/Tempfile/size-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: length
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the size of the temporary file. As a side effect, the IO buffer is flushed before determining the size.
full_name: Tempfile#size
is_singleton: false
name: size
params: ()
visibility: public
PK�}[�Ziؽ�$ri/1.8/system/Tempfile/unlink-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: delete
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Unlinks the file. On UNIX-like systems, it is often a good idea to unlink a temporary file immediately after creating and opening it, because it leaves other programs zero chance to access the file.
full_name: Tempfile#unlink
is_singleton: false
name: unlink
params: ()
visibility: public
PK�}[�o���"ri/1.8/system/Tempfile/path-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the full path name of the temporary file.
full_name: Tempfile#path
is_singleton: false
name: path
params: ()
visibility: public
PK�}[���w��$ri/1.8/system/Tempfile/delete-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #unlink"
full_name: Tempfile#delete
is_singleton: false
name: delete
params: ()
visibility: public
PK�}[�I���"ri/1.8/system/Tempfile/open-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Opens or reopens the file with mode &quot;r+&quot;.
full_name: Tempfile#open
is_singleton: false
name: open
params: ()
visibility: public
PK�}[&�XO��!ri/1.8/system/Tempfile/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a temporary file of mode 0600 in the temporary directory, opens it with mode &quot;w+&quot;, and returns a Tempfile object which represents the created temporary file. A Tempfile object can be treated just like a normal File object.
- !ruby/struct:SM::Flow::P 
  body: The basename parameter is used to determine the name of a temporary file. If an Array is given, the first element is used as prefix string and the second as suffix string, respectively. Otherwise it is treated as prefix string.
- !ruby/struct:SM::Flow::P 
  body: If tmpdir is omitted, the temporary directory is determined by Dir::tmpdir provided by 'tmpdir.rb'. When $SAFE &gt; 0 and the given tmpdir is tainted, it uses /tmp. (Note that ENV values are tainted by default)
full_name: Tempfile::new
is_singleton: true
name: new
params: (basename, tmpdir=Dir::tmpdir)
visibility: public
PK�}[��Y��*ri/1.8/system/Tempfile/make_tmpname-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Tempfile#make_tmpname
is_singleton: false
name: make_tmpname
params: (basename, n)
visibility: private
PK�}[iOa{��$ri/1.8/system/Tempfile/length-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #size"
full_name: Tempfile#length
is_singleton: false
name: length
params: ()
visibility: public
PK�}[��MȻ�#ri/1.8/system/Tempfile/close-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Closes the file. If the optional flag is true, unlinks the file after closing.
- !ruby/struct:SM::Flow::P 
  body: If you don't explicitly unlink the temporary file, the removal will be delayed until the object is finalized.
full_name: Tempfile#close
is_singleton: false
name: close
params: (unlink_now=false)
visibility: public
PK�}[$����*ri/1.8/system/Tempfile/cdesc-Tempfile.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: open
comment: 
- !ruby/struct:SM::Flow::P 
  body: A class for managing temporary files. This library is written to be thread safe.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: MAX_TRY
  value: "10"
full_name: Tempfile
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: close
- !ruby/object:RI::MethodSummary 
  name: close!
- !ruby/object:RI::MethodSummary 
  name: delete
- !ruby/object:RI::MethodSummary 
  name: length
- !ruby/object:RI::MethodSummary 
  name: make_tmpname
- !ruby/object:RI::MethodSummary 
  name: open
- !ruby/object:RI::MethodSummary 
  name: path
- !ruby/object:RI::MethodSummary 
  name: size
- !ruby/object:RI::MethodSummary 
  name: unlink
name: Tempfile
superclass: DelegateClass(File)
PK�}[m,f��&ri/1.8/system/Tempfile/close%21-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Closes and unlinks the file.
full_name: Tempfile#close!
is_singleton: false
name: close!
params: ()
visibility: public
PK�}[]�����"ri/1.8/system/Tempfile/open-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: (tempfile)
comment: 
- !ruby/struct:SM::Flow::P 
  body: If no block is given, this is a synonym for new().
- !ruby/struct:SM::Flow::P 
  body: If a block is given, it will be passed tempfile as an argument, and the tempfile will automatically be closed when the block terminates. In this case, open() returns nil.
full_name: Tempfile::open
is_singleton: true
name: open
params: (*args) {|tempfile| ...}
visibility: public
PK�}[�$O��ri/1.8/system/Date/_load-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Load from Marshal format.
full_name: Date::_load
is_singleton: true
name: _load
params: (str)
visibility: public
PK�}[���##!ri/1.8/system/Date/england-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a copy of this Date object that uses the English/Colonial Day of Calendar Reform.
full_name: Date#england
is_singleton: false
name: england
params: ()
visibility: public
PK�}[$�(��+ri/1.8/system/Date/Format/cdesc-Format.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Date::Format
includes: []

instance_methods: []

name: Format
superclass: 
PK�}[l++��,ri/1.8/system/Date/Format/Bag/cdesc-Bag.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Date::Format::Bag
includes: []

instance_methods: []

name: Bag
superclass: Object
PK�}[�^�"�""ri/1.8/system/Date/cdesc-Date.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: _load
- !ruby/object:RI::MethodSummary 
  name: _parse
- !ruby/object:RI::MethodSummary 
  name: _strptime
- !ruby/object:RI::MethodSummary 
  name: ajd_to_amjd
- !ruby/object:RI::MethodSummary 
  name: ajd_to_jd
- !ruby/object:RI::MethodSummary 
  name: amjd_to_ajd
- !ruby/object:RI::MethodSummary 
  name: civil
- !ruby/object:RI::MethodSummary 
  name: civil_to_jd
- !ruby/object:RI::MethodSummary 
  name: commercial
- !ruby/object:RI::MethodSummary 
  name: commercial_to_jd
- !ruby/object:RI::MethodSummary 
  name: day_fraction_to_time
- !ruby/object:RI::MethodSummary 
  name: gregorian?
- !ruby/object:RI::MethodSummary 
  name: gregorian_leap?
- !ruby/object:RI::MethodSummary 
  name: jd
- !ruby/object:RI::MethodSummary 
  name: jd_to_ajd
- !ruby/object:RI::MethodSummary 
  name: jd_to_civil
- !ruby/object:RI::MethodSummary 
  name: jd_to_commercial
- !ruby/object:RI::MethodSummary 
  name: jd_to_ld
- !ruby/object:RI::MethodSummary 
  name: jd_to_mjd
- !ruby/object:RI::MethodSummary 
  name: jd_to_ordinal
- !ruby/object:RI::MethodSummary 
  name: jd_to_wday
- !ruby/object:RI::MethodSummary 
  name: julian?
- !ruby/object:RI::MethodSummary 
  name: julian_leap?
- !ruby/object:RI::MethodSummary 
  name: ld_to_jd
- !ruby/object:RI::MethodSummary 
  name: mjd_to_jd
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: now
- !ruby/object:RI::MethodSummary 
  name: ordinal
- !ruby/object:RI::MethodSummary 
  name: ordinal_to_jd
- !ruby/object:RI::MethodSummary 
  name: parse
- !ruby/object:RI::MethodSummary 
  name: s3e
- !ruby/object:RI::MethodSummary 
  name: strptime
- !ruby/object:RI::MethodSummary 
  name: time_to_day_fraction
- !ruby/object:RI::MethodSummary 
  name: time_to_day_fraction
- !ruby/object:RI::MethodSummary 
  name: today
- !ruby/object:RI::MethodSummary 
  name: valid_civil?
- !ruby/object:RI::MethodSummary 
  name: valid_commercial?
- !ruby/object:RI::MethodSummary 
  name: valid_jd?
- !ruby/object:RI::MethodSummary 
  name: valid_ordinal?
- !ruby/object:RI::MethodSummary 
  name: valid_time?
comment: 
- !ruby/struct:SM::Flow::P 
  body: Class representing a date.
- !ruby/struct:SM::Flow::P 
  body: See the documentation to the file date.rb for an overview.
- !ruby/struct:SM::Flow::P 
  body: Internally, the date is represented as an Astronomical Julian Day Number, <tt>ajd</tt>. The Day of Calendar Reform, <tt>sg</tt>, is also stored, for conversions to other date formats. (There is also an <tt>of</tt> field for a time zone offset, but this is only for the use of the DateTime subclass.)
- !ruby/struct:SM::Flow::P 
  body: A new Date object is created using one of the object creation class methods named after the corresponding date format, and the arguments appropriate to that date format; for instance, Date::civil() (aliased to Date::new()) with year, month, and day-of-month, or Date::ordinal() with year and day-of-year. All of these object creation class methods also take the Day of Calendar Reform as an optional argument.
- !ruby/struct:SM::Flow::P 
  body: Date objects are immutable once created.
- !ruby/struct:SM::Flow::P 
  body: "Once a Date has been created, date values can be retrieved for the different date formats supported using instance methods. For instance, #mon() gives the Civil month, #cwday() gives the Commercial day of the week, and #yday() gives the Ordinal day of the year. Date values can be retrieved in any format, regardless of what format was used to create the Date instance."
- !ruby/struct:SM::Flow::P 
  body: The Date class includes the Comparable module, allowing date objects to be compared and sorted, ranges of dates to be created, and so forth.
constants: 
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Full month names, in English. Months count from 1 to 12; a month's numerical representation indexed into this array gives the name of that month (hence the first element is nil).
  name: MONTHNAMES
  value: "[nil] + %w(January February March April May June July                           August September October November December)"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Full names of days of the week, in English. Days of the week count from 0 to 6 (except in the commercial week); a day's numerical representation indexed into this array gives the name of that day.
  name: DAYNAMES
  value: "%w(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Abbreviated month names, in English.
  name: ABBR_MONTHNAMES
  value: "[nil] + %w(Jan Feb Mar Apr May Jun                                Jul Aug Sep Oct Nov Dec)"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: Abbreviated day names, in English.
  name: ABBR_DAYNAMES
  value: "%w(Sun Mon Tue Wed Thu Fri Sat)"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The Julian Day Number of the Day of Calendar Reform for Italy and the Catholic countries.
  name: ITALY
  value: "2299161"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: The Julian Day Number of the Day of Calendar Reform for England and her Colonies.
  name: ENGLAND
  value: "2361222"
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: A constant used to indicate that a Date should always use the Julian calendar.
  name: JULIAN
  value: Infinity.new
- !ruby/object:RI::Constant 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: A constant used to indicate that a Date should always use the Gregorian calendar.
  name: GREGORIAN
  value: -Infinity.new
full_name: Date
includes: 
- !ruby/object:RI::IncludedModule 
  name: Comparable
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: +
- !ruby/object:RI::MethodSummary 
  name: "-"
- !ruby/object:RI::MethodSummary 
  name: "<<"
- !ruby/object:RI::MethodSummary 
  name: <=>
- !ruby/object:RI::MethodSummary 
  name: ===
- !ruby/object:RI::MethodSummary 
  name: ">>"
- !ruby/object:RI::MethodSummary 
  name: _dump
- !ruby/object:RI::MethodSummary 
  name: ajd
- !ruby/object:RI::MethodSummary 
  name: amjd
- !ruby/object:RI::MethodSummary 
  name: asctime
- !ruby/object:RI::MethodSummary 
  name: civil
- !ruby/object:RI::MethodSummary 
  name: commercial
- !ruby/object:RI::MethodSummary 
  name: ctime
- !ruby/object:RI::MethodSummary 
  name: cwday
- !ruby/object:RI::MethodSummary 
  name: cweek
- !ruby/object:RI::MethodSummary 
  name: cwyear
- !ruby/object:RI::MethodSummary 
  name: day
- !ruby/object:RI::MethodSummary 
  name: day_fraction
- !ruby/object:RI::MethodSummary 
  name: downto
- !ruby/object:RI::MethodSummary 
  name: england
- !ruby/object:RI::MethodSummary 
  name: eql?
- !ruby/object:RI::MethodSummary 
  name: gregorian
- !ruby/object:RI::MethodSummary 
  name: gregorian?
- !ruby/object:RI::MethodSummary 
  name: hash
- !ruby/object:RI::MethodSummary 
  name: hour
- !ruby/object:RI::MethodSummary 
  name: inspect
- !ruby/object:RI::MethodSummary 
  name: italy
- !ruby/object:RI::MethodSummary 
  name: jd
- !ruby/object:RI::MethodSummary 
  name: julian
- !ruby/object:RI::MethodSummary 
  name: julian?
- !ruby/object:RI::MethodSummary 
  name: ld
- !ruby/object:RI::MethodSummary 
  name: leap?
- !ruby/object:RI::MethodSummary 
  name: mday
- !ruby/object:RI::MethodSummary 
  name: min
- !ruby/object:RI::MethodSummary 
  name: mjd
- !ruby/object:RI::MethodSummary 
  name: mon
- !ruby/object:RI::MethodSummary 
  name: month
- !ruby/object:RI::MethodSummary 
  name: new_offset
- !ruby/object:RI::MethodSummary 
  name: new_start
- !ruby/object:RI::MethodSummary 
  name: next
- !ruby/object:RI::MethodSummary 
  name: next_day
- !ruby/object:RI::MethodSummary 
  name: offset
- !ruby/object:RI::MethodSummary 
  name: ordinal
- !ruby/object:RI::MethodSummary 
  name: sec
- !ruby/object:RI::MethodSummary 
  name: sec_fraction
- !ruby/object:RI::MethodSummary 
  name: start
- !ruby/object:RI::MethodSummary 
  name: step
- !ruby/object:RI::MethodSummary 
  name: strftime
- !ruby/object:RI::MethodSummary 
  name: succ
- !ruby/object:RI::MethodSummary 
  name: time
- !ruby/object:RI::MethodSummary 
  name: to_s
- !ruby/object:RI::MethodSummary 
  name: to_yaml
- !ruby/object:RI::MethodSummary 
  name: upto
- !ruby/object:RI::MethodSummary 
  name: wday
- !ruby/object:RI::MethodSummary 
  name: weeknum0
- !ruby/object:RI::MethodSummary 
  name: weeknum1
- !ruby/object:RI::MethodSummary 
  name: wnum0
- !ruby/object:RI::MethodSummary 
  name: wnum1
- !ruby/object:RI::MethodSummary 
  name: yday
- !ruby/object:RI::MethodSummary 
  name: year
- !ruby/object:RI::MethodSummary 
  name: zone
name: Date
superclass: Object
PK�}[.�i���+ri/1.8/system/Date/gregorian_leap%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Is a year a leap year in the Gregorian calendar?
- !ruby/struct:SM::Flow::P 
  body: All years divisible by 4 are leap years in the Gregorian calendar, except for years divisible by 100 and not by 400.
full_name: Date::gregorian_leap?
is_singleton: true
name: gregorian_leap?
params: (y)
visibility: public
PK�}[т�??ri/1.8/system/Date/mon-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: month
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the month of this date.
- !ruby/struct:SM::Flow::P 
  body: January is month 1.
full_name: Date#mon
is_singleton: false
name: mon
params: ()
visibility: public
PK�}[��|OO ri/1.8/system/Date/cwyear-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the commercial year of this date. See <b>Commercial</b> <b>Date</b> in the introduction for how this differs from the normal year.
full_name: Date#cwyear
is_singleton: false
name: cwyear
params: ()
visibility: public
PK�}[��'N��ri/1.8/system/Date/day-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #mday"
full_name: Date#day
is_singleton: false
name: day
params: ()
visibility: public
PK�}[�>��gg(ri/1.8/system/Date/julian_leap%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Is a year a leap year in the Julian calendar?
- !ruby/struct:SM::Flow::P 
  body: All years divisible by 4 are leap years in the Julian calendar.
full_name: Date::julian_leap?
is_singleton: true
name: julian_leap?
params: (y)
visibility: public
PK�}[��[[ ri/1.8/system/Date/eql%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Is this Date equal to <tt>other</tt>?
- !ruby/struct:SM::Flow::P 
  body: <tt>other</tt> must both be a Date object, and represent the same date.
full_name: Date#eql?
is_singleton: false
name: eql?
params: (other)
visibility: public
PK�}[�|ׇ�� ri/1.8/system/Date/offset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Date#offset
is_singleton: false
name: offset
params: ()
visibility: private
PK�}[=ֳ���ri/1.8/system/Date/ctime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #asctime"
full_name: Date#ctime
is_singleton: false
name: ctime
params: ()
visibility: public
PK�}[?��<!ri/1.8/system/Date/ordinal-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the date as an Ordinal Date, [year, day_of_year]
full_name: Date#ordinal
is_singleton: false
name: ordinal
params: ()
visibility: private
PK�}[U9�ori/1.8/system/Date/civil-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the date as a Civil Date, [year, month, day_of_month]
full_name: Date#civil
is_singleton: false
name: civil
params: ()
visibility: private
PK�}[�V��#ri/1.8/system/Date/gregorian-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a copy of this Date object that always uses the Gregorian Calendar.
full_name: Date#gregorian
is_singleton: false
name: gregorian
params: ()
visibility: public
PK�}[0�_�ri/1.8/system/Date/mday-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: day
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the day-of-the-month of this date.
full_name: Date#mday
is_singleton: false
name: mday
params: ()
visibility: public
PK�}[�ppQQri/1.8/system/Date/today-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new Date object representing today.
- !ruby/struct:SM::Flow::P 
  body: <tt>sg</tt> specifies the Day of Calendar Reform.
full_name: Date::today
is_singleton: true
name: today
params: (sg=ITALY)
visibility: public
PK�}[�S�699"ri/1.8/system/Date/jd_to_ld-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a Julian Day Number to the number of days since the adoption of the Gregorian Calendar (in Italy).
full_name: Date::jd_to_ld
is_singleton: true
name: jd_to_ld
params: (jd)
visibility: public
PK�}[��9�DD"ri/1.8/system/Date/ld_to_jd-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a count of the number of days since the adoption of the Gregorian Calendar (in Italy) to a Julian Day Number.
full_name: Date::ld_to_jd
is_singleton: true
name: ld_to_jd
params: (ld)
visibility: public
PK�}[�/���#ri/1.8/system/Date/%3c%3d%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Compare this date with another date.
- !ruby/struct:SM::Flow::P 
  body: <tt>other</tt> can also be a Numeric value, in which case it is interpreted as an Astronomical Julian Day Number.
- !ruby/struct:SM::Flow::P 
  body: Comparison is by Astronomical Julian Day Number, including fractional days. This means that both the time and the timezone offset are taken into account when comparing two DateTime instances. When comparing a DateTime instance with a Date instance, the time of the latter will be considered as falling on midnight UTC.
full_name: Date#<=>
is_singleton: false
name: <=>
params: (other)
visibility: public
PK�}[�	�[SS#ri/1.8/system/Date/jd_to_ajd-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a (civil) Julian Day Number to an Astronomical Julian Day Number.
- !ruby/struct:SM::Flow::P 
  body: <tt>jd</tt> is the Julian Day Number to convert, and <tt>fr</tt> is a fractional day. <tt>of</tt> is the offset from UTC as a fraction of a day (defaults to 0).
- !ruby/struct:SM::Flow::P 
  body: Returns the Astronomical Julian Day Number as a single numeric value.
full_name: Date::jd_to_ajd
is_singleton: true
name: jd_to_ajd
params: (jd, fr, of=0)
visibility: public
PK�}[�)��ri/1.8/system/Date/amjd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the date as an Astronomical Modified Julian Day Number.
full_name: Date#amjd
is_singleton: false
name: amjd
params: ()
visibility: public
PK�}[ <L"��ri/1.8/system/Date/hour-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the hour of this date.
full_name: Date#hour
is_singleton: false
name: hour
params: ()
visibility: private
PK�}[vu�H��"ri/1.8/system/Date/weeknum0-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Date#weeknum0
is_singleton: false
name: weeknum0
params: ()
visibility: private
PK�}[��"�""*ri/1.8/system/Date/jd_to_commercial-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a Julian Day Number to a Commercial Date
- !ruby/struct:SM::Flow::P 
  body: <tt>jd</tt> is the Julian Day Number to convert. <tt>sg</tt> specifies the Day of Calendar Reform.
- !ruby/struct:SM::Flow::P 
  body: Returns the corresponding Commercial Date as [commercial_year, week_of_year, day_of_week]
full_name: Date::jd_to_commercial
is_singleton: true
name: jd_to_commercial
params: (jd, sg=GREGORIAN)
visibility: public
PK�}[V�v��&ri/1.8/system/Date/day_fraction-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get any fractional day part of the date.
full_name: Date#day_fraction
is_singleton: false
name: day_fraction
params: ()
visibility: public
PK�}[/Fi��ri/1.8/system/Date/jd-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new Date object from a Julian Day Number.
- !ruby/struct:SM::Flow::P 
  body: <tt>jd</tt> is the Julian Day Number; if not specified, it defaults to 0. <tt>sg</tt> specifies the Day of Calendar Reform.
full_name: Date::jd
is_singleton: true
name: jd
params: (jd=0, sg=ITALY)
visibility: public
PK�}[����@@&ri/1.8/system/Date/sec_fraction-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the fraction-of-a-second of this date. The unit is in days. I do NOT recommend you to use this method.
full_name: Date#sec_fraction
is_singleton: false
name: sec_fraction
params: ()
visibility: private
PK�}[7X4��!ri/1.8/system/Date/leap%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Is this a leap year?
full_name: Date#leap?
is_singleton: false
name: leap?
params: ()
visibility: public
PK�}[';�J

#ri/1.8/system/Date/jd_to_mjd-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a Julian Day Number to a Modified Julian Day Number.
full_name: Date::jd_to_mjd
is_singleton: true
name: jd_to_mjd
params: (jd)
visibility: public
PK�}[kㆷ��ri/1.8/system/Date/cweek-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the commercial week of the year of this date.
full_name: Date#cweek
is_singleton: false
name: cweek
params: ()
visibility: public
PK�}[|g�UXXri/1.8/system/Date/civil-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new Date object for the Civil Date specified by year <tt>y</tt>, month <tt>m</tt>, and day-of-month <tt>d</tt>.
- !ruby/struct:SM::Flow::P 
  body: <tt>m</tt> and <tt>d</tt> can be negative, in which case they count backwards from the end of the year and the end of the month respectively. No wraparound is performed, however, and invalid values cause an ArgumentError to be raised. can be negative
- !ruby/struct:SM::Flow::P 
  body: <tt>y</tt> defaults to -4712, <tt>m</tt> to 1, and <tt>d</tt> to 1; this is Julian Day Number day 0.
- !ruby/struct:SM::Flow::P 
  body: <tt>sg</tt> specifies the Day of Calendar Reform.
full_name: Date::civil
is_singleton: true
name: civil
params: (y=-4712, m=1, d=1, sg=ITALY)
visibility: public
PK�}[���^^$ri/1.8/system/Date/jd_to_wday-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a Julian Day Number to the day of the week.
- !ruby/struct:SM::Flow::P 
  body: Sunday is day-of-week 0; Saturday is day-of-week 6.
full_name: Date::jd_to_wday
is_singleton: true
name: jd_to_wday
params: (jd)
visibility: public
PK�}[��T���ri/1.8/system/Date/sec-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the second of this date.
full_name: Date#sec
is_singleton: false
name: sec
params: ()
visibility: private
PK�}[÷���!ri/1.8/system/Date/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Date#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PK�}[ڴ��==ri/1.8/system/Date/upto-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: date
comment: 
- !ruby/struct:SM::Flow::P 
  body: Step forward one day at a time until we reach <tt>max</tt> (inclusive), yielding each date as we go.
full_name: Date#upto
is_singleton: false
name: upto
params: (max) {|date| ...}
visibility: public
PK�}[�/��ri/1.8/system/Date/jd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the date as a Julian Day Number.
full_name: Date#jd
is_singleton: false
name: jd
params: ()
visibility: public
PK�}[i#��"ri/1.8/system/Date/next_day-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Date#next_day
is_singleton: false
name: next_day
params: (n=1)
visibility: private
PK�}[?�Ȱ��ri/1.8/system/Date/hash-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calculate a hash value for this date.
full_name: Date#hash
is_singleton: false
name: hash
params: ()
visibility: public
PK�}[D|���ri/1.8/system/Date/parse-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new Date object by parsing from a String, without specifying the format.
- !ruby/struct:SM::Flow::P 
  body: "<tt>str</tt> is a String holding a date representation. <tt>comp</tt> specifies whether to interpret 2-digit years as 19XX (&gt;= 69) or 20XX (&lt; 69); the default is not to. The method will attempt to parse a date from the String using various heuristics; see #_parse in date/format.rb for more details. If parsing fails, an ArgumentError will be raised."
- !ruby/struct:SM::Flow::P 
  body: The default <tt>str</tt> is '-4712-01-01'; this is Julian Day Number day 0.
- !ruby/struct:SM::Flow::P 
  body: <tt>sg</tt> specifies the Day of Calendar Reform.
full_name: Date::parse
is_singleton: true
name: parse
params: (str='-4712-01-01', comp=false, sg=ITALY)
visibility: public
PK�}[�]���ri/1.8/system/Date/wnum1-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Date#wnum1
is_singleton: false
name: wnum1
params: ()
visibility: private
PK�}[���/ri/1.8/system/Date/Infinity/cdesc-Infinity.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
constants: []

full_name: Date::Infinity
includes: []

instance_methods: []

name: Infinity
superclass: Numeric
PK�}[�Z�//%ri/1.8/system/Date/amjd_to_ajd-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert an Astronomical Modified Julian Day Number to an Astronomical Julian Day Number.
full_name: Date::amjd_to_ajd
is_singleton: true
name: amjd_to_ajd
params: (amjd)
visibility: public
PK�}[�zC�ri/1.8/system/Date/next-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: succ
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a new Date one day after this one.
full_name: Date#next
is_singleton: false
name: next
params: ()
visibility: public
PK�}[�}k��"ri/1.8/system/Date/weeknum1-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Date#weeknum1
is_singleton: false
name: weeknum1
params: ()
visibility: private
PK�}[Z���ri/1.8/system/Date/ajd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the date as an Astronomical Julian Day Number.
full_name: Date#ajd
is_singleton: false
name: ajd
params: ()
visibility: public
PK�}[`��س� ri/1.8/system/Date/_parse-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Date::_parse
is_singleton: true
name: _parse
params: (str, comp=false)
visibility: public
PK�}[��EN��ri/1.8/system/Date/wnum0-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Date#wnum0
is_singleton: false
name: wnum0
params: ()
visibility: private
PK�}[uJ���ri/1.8/system/Date/min-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the minute of this date.
full_name: Date#min
is_singleton: false
name: min
params: ()
visibility: private
PK�}[�����ri/1.8/system/Date/year-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the year of this date.
full_name: Date#year
is_singleton: false
name: year
params: ()
visibility: public
PK�}[4;�4#ri/1.8/system/Date/mjd_to_jd-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a Modified Julian Day Number to a Julian Day Number.
full_name: Date::mjd_to_jd
is_singleton: true
name: mjd_to_jd
params: (mjd)
visibility: public
PK�}[`�^��#ri/1.8/system/Date/_strptime-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Date::_strptime
is_singleton: true
name: _strptime
params: (str, fmt='%F')
visibility: public
PK�}[��R��"ri/1.8/system/Date/strftime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Date#strftime
is_singleton: false
name: strftime
params: (fmt='%F')
visibility: public
PK�}[^Z��!ri/1.8/system/Date/inspect-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return internal object state as a programmer-readable string.
full_name: Date#inspect
is_singleton: false
name: inspect
params: ()
visibility: public
PK�}[�P��*ri/1.8/system/Date/commercial_to_jd-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a Commercial Date to a Julian Day Number.
- !ruby/struct:SM::Flow::P 
  body: <tt>y</tt>, <tt>w</tt>, and <tt>d</tt> are the (commercial) year, week of the year, and day of the week of the Commercial Date to convert. <tt>sg</tt> specifies the Day of Calendar Reform.
full_name: Date::commercial_to_jd
is_singleton: true
name: commercial_to_jd
params: (y, w, d, ns=GREGORIAN)
visibility: public
PK�}[ ��ri/1.8/system/Date/wday-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the week day of this date. Sunday is day-of-week 0; Saturday is day-of-week 6.
full_name: Date#wday
is_singleton: false
name: wday
params: ()
visibility: public
PK�}[IM�6��ri/1.8/system/Date/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "<b>NOTE</b> this is the documentation for the method new!(). If you are reading this as the documentation for new(), that is because rdoc doesn't fully support the aliasing of the initialize() method. new() is in fact an alias for #civil(): read the documentation for that method instead."
- !ruby/struct:SM::Flow::P 
  body: Create a new Date object.
- !ruby/struct:SM::Flow::P 
  body: <tt>ajd</tt> is the Astronomical Julian Day Number. <tt>of</tt> is the offset from UTC as a fraction of a day. Both default to 0.
- !ruby/struct:SM::Flow::P 
  body: <tt>sg</tt> specifies the Day of Calendar Reform to use for this Date object.
- !ruby/struct:SM::Flow::P 
  body: Using one of the factory methods such as Date::civil is generally easier and safer.
full_name: Date::new
is_singleton: true
name: new
params: (ajd=0, of=0, sg=ITALY)
visibility: public
PK�}[|�.�zz%ri/1.8/system/Date/valid_jd%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Is <tt>jd</tt> a valid Julian Day Number?
- !ruby/struct:SM::Flow::P 
  body: If it is, returns it. In fact, any value is treated as a valid Julian Day Number.
full_name: Date::valid_jd?
is_singleton: true
name: valid_jd?
params: (jd, sg=ITALY)
visibility: public
PK�}[Hi��&ri/1.8/system/Date/gregorian%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Is the current date new-style (Gregorian Calendar)?
full_name: Date#gregorian?
is_singleton: false
name: gregorian?
params: ()
visibility: public
PK�}[Eȷ���#ri/1.8/system/Date/%3d%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: The relationship operator for Date.
- !ruby/struct:SM::Flow::P 
  body: Compares dates by Julian Day Number. When comparing two DateTime instances, or a DateTime with a Date, the instances will be regarded as equivalent if they fall on the same date in local time.
full_name: Date#===
is_singleton: false
name: ===
params: (other)
visibility: public
PK�}[ �~Զ�-ri/1.8/system/Date/valid_commercial%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Do year <tt>y</tt>, week-of-year <tt>w</tt>, and day-of-week <tt>d</tt> make a valid Commercial Date? Returns the corresponding Julian Day Number if they do, nil if they don't.
- !ruby/struct:SM::Flow::P 
  body: Monday is day-of-week 1; Sunday is day-of-week 7.
- !ruby/struct:SM::Flow::P 
  body: <tt>w</tt> and <tt>d</tt> can be negative, in which case they count backwards from the end of the year and the end of the week respectively. No wraparound is performed, however, and invalid values cause an ArgumentError to be raised. A date falling in the period skipped in the Day of Calendar Reform adjustment is not valid.
- !ruby/struct:SM::Flow::P 
  body: <tt>sg</tt> specifies the Day of Calendar Reform.
full_name: Date::valid_commercial?
is_singleton: true
name: valid_commercial?
params: (y, w, d, sg=ITALY)
visibility: public
PK�}[��]��ri/1.8/system/Date/step-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: date
comment: 
- !ruby/struct:SM::Flow::P 
  body: Step the current date forward <tt>step</tt> days at a time (or backward, if <tt>step</tt> is negative) until we reach <tt>limit</tt> (inclusive), yielding the resultant date at each step.
full_name: Date#step
is_singleton: false
name: step
params: (limit, step=1) {|date| ...}
visibility: public
PK�}[!c���ri/1.8/system/Date/start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: When is the Day of Calendar Reform for this Date object?
full_name: Date#start
is_singleton: false
name: start
params: ()
visibility: public
PK�}[��t_�� ri/1.8/system/Date/%3e%3e-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a new Date object that is <tt>n</tt> months later than the current one.
- !ruby/struct:SM::Flow::P 
  body: If the day-of-the-month of the current Date is greater than the last day of the target month, the day-of-the-month of the returned Date will be the last day of the target month.
full_name: Date#>>
is_singleton: false
name: ">>"
params: (n)
visibility: public
PK�}[��֯$ri/1.8/system/Date/commercial-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the date as a Commercial Date, [year, week_of_year, day_of_week]
full_name: Date#commercial
is_singleton: false
name: commercial
params: ()
visibility: private
PK�}[x�%{ri/1.8/system/Date/time-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the time of this date as [hours, minutes, seconds, fraction_of_a_second]
full_name: Date#time
is_singleton: false
name: time
params: ()
visibility: private
PK�}[e���??ri/1.8/system/Date/cwday-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the commercial day of the week of this date. Monday is commercial day-of-week 1; Sunday is commercial day-of-week 7.
full_name: Date#cwday
is_singleton: false
name: cwday
params: ()
visibility: public
PK�}[h�sq��%ri/1.8/system/Date/jd_to_civil-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a Julian Day Number to a Civil Date. <tt>jd</tt> is the Julian Day Number. <tt>sg</tt> specifies the Day of Calendar Reform.
- !ruby/struct:SM::Flow::P 
  body: Returns the corresponding [year, month, day_of_month] as a three-element array.
full_name: Date::jd_to_civil
is_singleton: true
name: jd_to_civil
params: (jd, sg=GREGORIAN)
visibility: public
PK�}[�ք���ri/1.8/system/Date/zone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: ":minute, :second, :second_fraction"
full_name: Date#zone
is_singleton: false
name: zone
params: ()
visibility: private
PK�}[�8* ri/1.8/system/Date/julian-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a copy of this Date object that always uses the Julian Calendar.
full_name: Date#julian
is_singleton: false
name: julian
params: ()
visibility: public
PK�}[��Rrvv*ri/1.8/system/Date/valid_ordinal%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Do the year <tt>y</tt> and day-of-year <tt>d</tt> make a valid Ordinal Date? Returns the corresponding Julian Day Number if they do, or nil if they don't.
- !ruby/struct:SM::Flow::P 
  body: <tt>d</tt> can be a negative number, in which case it counts backwards from the end of the year (-1 being the last day of the year). No year wraparound is performed, however, so valid values of <tt>d</tt> are -365 .. -1, 1 .. 365 on a non-leap-year, -366 .. -1, 1 .. 366 on a leap year. A date falling in the period skipped in the Day of Calendar Reform adjustment is not valid.
- !ruby/struct:SM::Flow::P 
  body: <tt>sg</tt> specifies the Day of Calendar Reform.
full_name: Date::valid_ordinal?
is_singleton: true
name: valid_ordinal?
params: (y, d, sg=ITALY)
visibility: public
PK�}[vSl���'ri/1.8/system/Date/jd_to_ordinal-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a Julian Day Number to an Ordinal Date.
- !ruby/struct:SM::Flow::P 
  body: <tt>jd</tt> is the Julian Day Number to convert. <tt>sg</tt> specifies the Day of Calendar Reform.
- !ruby/struct:SM::Flow::P 
  body: Returns the corresponding Ordinal Date as [year, day_of_year]
full_name: Date::jd_to_ordinal
is_singleton: true
name: jd_to_ordinal
params: (jd, sg=GREGORIAN)
visibility: public
PK�}[,Ӓz��ri/1.8/system/Date/month-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #mon"
full_name: Date#month
is_singleton: false
name: month
params: ()
visibility: public
PK�}[��6.QQri/1.8/system/Date/%2b-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a new Date object that is <tt>n</tt> days later than the current one.
- !ruby/struct:SM::Flow::P 
  body: "<tt>n</tt> may be a negative value, in which case the new Date is earlier than the current one; however, #-() might be more intuitive."
- !ruby/struct:SM::Flow::P 
  body: If <tt>n</tt> is not a Numeric, a TypeError will be thrown. In particular, two Dates cannot be added to each other.
full_name: Date#+
is_singleton: false
name: +
params: (n)
visibility: public
PK�}[BAfj"ri/1.8/system/Date/strptime-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new Date object by parsing from a String according to a specified format.
- !ruby/struct:SM::Flow::P 
  body: <tt>str</tt> is a String holding a date representation. <tt>fmt</tt> is the format that the date is in. See date/format.rb for details on supported formats.
- !ruby/struct:SM::Flow::P 
  body: The default <tt>str</tt> is '-4712-01-01', and the default <tt>fmt</tt> is '%F', which means Year-Month-Day_of_Month. This gives Julian Day Number day 0.
- !ruby/struct:SM::Flow::P 
  body: <tt>sg</tt> specifies the Day of Calendar Reform.
- !ruby/struct:SM::Flow::P 
  body: An ArgumentError will be raised if <tt>str</tt> cannot be parsed.
full_name: Date::strptime
is_singleton: true
name: strptime
params: (str='-4712-01-01', fmt='%F', sg=ITALY)
visibility: public
PK�}[�C¡�� ri/1.8/system/Date/%3c%3c-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return a new Date object that is <tt>n</tt> months earlier than the current one.
- !ruby/struct:SM::Flow::P 
  body: If the day-of-the-month of the current Date is greater than the last day of the target month, the day-of-the-month of the returned Date will be the last day of the target month.
full_name: Date#<<
is_singleton: false
name: "<<"
params: (n)
visibility: public
PK�}[�qL��ri/1.8/system/Date/mjd-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the date as a Modified Julian Day Number.
full_name: Date#mjd
is_singleton: false
name: mjd
params: ()
visibility: public
PK�}[����.ri/1.8/system/Date/time_to_day_fraction-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Date::time_to_day_fraction
is_singleton: true
name: time_to_day_fraction
params: (h, min, s)
visibility: public
PK�}[�H���ri/1.8/system/Date/succ-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #next"
full_name: Date#succ
is_singleton: false
name: succ
params: ()
visibility: public
PK�}[׬��#ri/1.8/system/Date/julian%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Is the current date old-style (Julian Calendar)?
full_name: Date#julian?
is_singleton: false
name: julian?
params: ()
visibility: public
PK�}[��uZZ#ri/1.8/system/Date/ajd_to_jd-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert an Astronomical Julian Day Number to a (civil) Julian Day Number.
- !ruby/struct:SM::Flow::P 
  body: <tt>ajd</tt> is the Astronomical Julian Day Number to convert. <tt>of</tt> is the offset from UTC as a fraction of a day (defaults to 0).
- !ruby/struct:SM::Flow::P 
  body: Returns the (civil) Julian Day Number as [day_number, fraction] where <tt>fraction</tt> is always 1/2.
full_name: Date::ajd_to_jd
is_singleton: true
name: ajd_to_jd
params: (ajd, of=0)
visibility: public
PK�}[���33ri/1.8/system/Date/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return the date as a human-readable string.
- !ruby/struct:SM::Flow::P 
  body: The format used is YYYY-MM-DD.
full_name: Date#to_s
is_singleton: false
name: to_s
params: ()
visibility: public
PK�}[���0>>.ri/1.8/system/Date/day_fraction_to_time-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a fractional day <tt>fr</tt> to [hours, minutes, seconds, fraction_of_a_second]
full_name: Date::day_fraction_to_time
is_singleton: true
name: day_fraction_to_time
params: (fr)
visibility: public
PK�}[��x�((#ri/1.8/system/Date/new_start-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a copy of this Date object using a new Day of Calendar Reform.
full_name: Date#new_start
is_singleton: false
name: new_start
params: (sg=self.class::ITALY)
visibility: public
PK�}[���++ri/1.8/system/Date/ld-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the date as the number of days since the Day of Calendar Reform (in Italy and the Catholic countries).
full_name: Date#ld
is_singleton: false
name: ld
params: ()
visibility: public
PK�}[�W_�ii#ri/1.8/system/Date/julian%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Does a given Julian Day Number fall inside the old-style (Julian) calendar?
- !ruby/struct:SM::Flow::P 
  body: <tt>jd</tt> is the Julian Day Number in question. <tt>sg</tt> may be Date::GREGORIAN, in which case the answer is false; it may be Date::JULIAN, in which case the answer is true; or it may a number representing the Day of Calendar Reform. Date::ENGLAND and Date::ITALY are two possible such days.
full_name: Date::julian?
is_singleton: true
name: julian?
params: (jd, sg)
visibility: public
PK�}[yH�D��ri/1.8/system/Date/s3e-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Date::s3e
is_singleton: true
name: s3e
params: (e, y, m, d, bc=false)
visibility: private
PK�}[�Z���ri/1.8/system/Date/_dump-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Dump to Marshal format.
full_name: Date#_dump
is_singleton: false
name: _dump
params: (limit)
visibility: public
PK�}[�rܺ��'ri/1.8/system/Date/valid_time%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Do hour <tt>h</tt>, minute <tt>min</tt>, and second <tt>s</tt> constitute a valid time?
- !ruby/struct:SM::Flow::P 
  body: If they do, returns their value as a fraction of a day. If not, returns nil.
- !ruby/struct:SM::Flow::P 
  body: The 24-hour clock is used. Negative values of <tt>h</tt>, <tt>min</tt>, and <tt>sec</tt> are treating as counting backwards from the end of the next larger unit (e.g. a <tt>min</tt> of -2 is treated as 58). No wraparound is performed.
full_name: Date::valid_time?
is_singleton: true
name: valid_time?
params: (h, min, s)
visibility: public
PK�}[Y���$ri/1.8/system/Date/new_offset-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Date#new_offset
is_singleton: false
name: new_offset
params: (of=0)
visibility: private
PK�}[��M'ri/1.8/system/Date/ordinal_to_jd-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert an Ordinal Date to a Julian Day Number.
- !ruby/struct:SM::Flow::P 
  body: <tt>y</tt> and <tt>d</tt> are the year and day-of-year to convert. <tt>sg</tt> specifies the Day of Calendar Reform.
- !ruby/struct:SM::Flow::P 
  body: Returns the corresponding Julian Day Number.
full_name: Date::ordinal_to_jd
is_singleton: true
name: ordinal_to_jd
params: (y, d, sg=GREGORIAN)
visibility: public
PK�}[�pߜ��$ri/1.8/system/Date/commercial-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new Date object for the Commercial Date specified by year <tt>y</tt>, week-of-year <tt>w</tt>, and day-of-week <tt>d</tt>.
- !ruby/struct:SM::Flow::P 
  body: Monday is day-of-week 1; Sunday is day-of-week 7.
- !ruby/struct:SM::Flow::P 
  body: <tt>w</tt> and <tt>d</tt> can be negative, in which case they count backwards from the end of the year and the end of the week respectively. No wraparound is performed, however, and invalid values cause an ArgumentError to be raised.
- !ruby/struct:SM::Flow::P 
  body: <tt>y</tt> defaults to 1582, <tt>w</tt> to 41, and <tt>d</tt> to 5, the Day of Calendar Reform for Italy and the Catholic countries.
- !ruby/struct:SM::Flow::P 
  body: <tt>sg</tt> specifies the Day of Calendar Reform.
full_name: Date::commercial
is_singleton: true
name: commercial
params: (y=1582, w=41, d=5, sg=ITALY)
visibility: public
PK�}[y;�eri/1.8/system/Date/italy-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a copy of this Date object that uses the Italian/Catholic Day of Calendar Reform.
full_name: Date#italy
is_singleton: false
name: italy
params: ()
visibility: public
PK�}[e�g!BB ri/1.8/system/Date/downto-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: date
comment: 
- !ruby/struct:SM::Flow::P 
  body: Step backward one day at a time until we reach <tt>min</tt> (inclusive), yielding each date as we go.
full_name: Date#downto
is_singleton: false
name: downto
params: (min) {|date| ...}
visibility: public
PK�}[h����&ri/1.8/system/Date/gregorian%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Does a given Julian Day Number fall inside the new-style (Gregorian) calendar?
- !ruby/struct:SM::Flow::P 
  body: The reverse of self.os? See the documentation for that method for more details.
full_name: Date::gregorian?
is_singleton: true
name: gregorian?
params: (jd, sg)
visibility: public
PK�}[�
�]]ri/1.8/system/Date/now-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new DateTime object representing the current time.
- !ruby/struct:SM::Flow::P 
  body: <tt>sg</tt> specifies the Day of Calendar Reform.
full_name: Date::now
is_singleton: true
name: now
params: (sg=ITALY)
visibility: private
PK�}[3T�m--ri/1.8/system/Date/yday-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Get the day-of-the-year of this date.
- !ruby/struct:SM::Flow::P 
  body: January 1 is day-of-the-year 1
full_name: Date#yday
is_singleton: false
name: yday
params: ()
visibility: public
PK�}[h/�!ri/1.8/system/Date/asctime-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: ctime
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: alias_method :format, :strftime
full_name: Date#asctime
is_singleton: false
name: asctime
params: ()
visibility: public
PK�}[4�����!ri/1.8/system/Date/ordinal-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Create a new Date object from an Ordinal Date, specified by year <tt>y</tt> and day-of-year <tt>d</tt>. <tt>d</tt> can be negative, in which it counts backwards from the end of the year. No year wraparound is performed, however. An invalid value for <tt>d</tt> results in an ArgumentError being raised.
- !ruby/struct:SM::Flow::P 
  body: <tt>y</tt> defaults to -4712, and <tt>d</tt> to 1; this is Julian Day Number day 0.
- !ruby/struct:SM::Flow::P 
  body: <tt>sg</tt> specifies the Day of Calendar Reform.
full_name: Date::ordinal
is_singleton: true
name: ordinal
params: (y=-4712, d=1, sg=ITALY)
visibility: public
PK�}[���&LL(ri/1.8/system/Date/valid_civil%3f-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Do year <tt>y</tt>, month <tt>m</tt>, and day-of-month <tt>d</tt> make a valid Civil Date? Returns the corresponding Julian Day Number if they do, nil if they don't.
- !ruby/struct:SM::Flow::P 
  body: <tt>m</tt> and <tt>d</tt> can be negative, in which case they count backwards from the end of the year and the end of the month respectively. No wraparound is performed, however, and invalid values cause an ArgumentError to be raised. A date falling in the period skipped in the Day of Calendar Reform adjustment is not valid.
- !ruby/struct:SM::Flow::P 
  body: <tt>sg</tt> specifies the Day of Calendar Reform.
full_name: Date::valid_civil?
is_singleton: true
name: valid_civil?
params: (y, m, d, sg=ITALY)
visibility: public
PK�}[���gUUri/1.8/system/Date/%2d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: If <tt>x</tt> is a Numeric value, create a new Date object that is <tt>x</tt> days earlier than the current one.
- !ruby/struct:SM::Flow::P 
  body: If <tt>x</tt> is a Date, return the number of days between the two dates; or, more precisely, how many days later the current date is than <tt>x</tt>.
- !ruby/struct:SM::Flow::P 
  body: If <tt>x</tt> is neither Numeric nor a Date, a TypeError is raised.
full_name: Date#-
is_singleton: false
name: "-"
params: (x)
visibility: public
PK�}[�˗��%ri/1.8/system/Date/civil_to_jd-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert a Civil Date to a Julian Day Number. <tt>y</tt>, <tt>m</tt>, and <tt>d</tt> are the year, month, and day of the month. <tt>sg</tt> specifies the Day of Calendar Reform.
- !ruby/struct:SM::Flow::P 
  body: Returns the corresponding Julian Day Number.
full_name: Date::civil_to_jd
is_singleton: true
name: civil_to_jd
params: (y, m, d, sg=GREGORIAN)
visibility: public
PK�}[Ѭ�..%ri/1.8/system/Date/ajd_to_amjd-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Convert an Astronomical Julian Day Number to an Astronomical Modified Julian Day Number.
full_name: Date::ajd_to_amjd
is_singleton: true
name: ajd_to_amjd
params: (ajd)
visibility: public
PK�}[��9#��ri/1.8/system/Proc/arity-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the number of arguments that would not be ignored. If the block is declared to take no arguments, returns 0. If the block is known to take exactly n arguments, returns n. If the block has optional arguments, return -n-1, where n is the number of mandatory arguments. A <tt>proc</tt> with no argument declarations is the same a block declaring <tt>||</tt> as its arguments.
- !ruby/struct:SM::Flow::VERB 
  body: "   Proc.new {}.arity          #=&gt;  0\n   Proc.new {||}.arity        #=&gt;  0\n   Proc.new {|a|}.arity       #=&gt;  1\n   Proc.new {|a,b|}.arity     #=&gt;  2\n   Proc.new {|a,b,c|}.arity   #=&gt;  3\n   Proc.new {|*a|}.arity      #=&gt; -1\n   Proc.new {|a,*b|}.arity    #=&gt; -2\n"
full_name: Proc#arity
is_singleton: false
name: arity
params: |
  prc.arity -> fixnum

visibility: public
PK�}[b
�vv ri/1.8/system/Proc/%5b%5d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invokes the block, setting the block's parameters to the values in <em>params</em> using something close to method calling semantics. Generates a warning if multiple values are passed to a proc that expects just one (previously this silently converted the parameters to an array).
- !ruby/struct:SM::Flow::P 
  body: For procs created using <tt>Kernel.proc</tt>, generates an error if the wrong number of parameters are passed to a proc with multiple parameters. For procs created using <tt>Proc.new</tt>, extra parameters are silently discarded.
- !ruby/struct:SM::Flow::P 
  body: Returns the value of the last expression evaluated in the block. See also <tt>Proc#yield</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a_proc = Proc.new {|a, *b| b.collect {|i| i*a }}\n   a_proc.call(9, 1, 2, 3)   #=&gt; [9, 18, 27]\n   a_proc[9, 1, 2, 3]        #=&gt; [9, 18, 27]\n   a_proc = Proc.new {|a,b| a}\n   a_proc.call(1,2,3)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   prog.rb:5: wrong number of arguments (3 for 2) (ArgumentError)\n    from prog.rb:4:in `call'\n    from prog.rb:5\n"
full_name: Proc#[]
is_singleton: false
name: "[]"
params: |
  prc.call(params,...)   => obj
  prc[params,...]        => obj

visibility: public
PK�}[z-�YY!ri/1.8/system/Proc/binding-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the binding associated with <em>prc</em>. Note that <tt>Kernel#eval</tt> accepts either a <tt>Proc</tt> or a <tt>Binding</tt> object as its second parameter.
- !ruby/struct:SM::Flow::VERB 
  body: "   def fred(param)\n     proc {}\n   end\n\n   b = fred(99)\n   eval(&quot;param&quot;, b.binding)   #=&gt; 99\n   eval(&quot;param&quot;, b)           #=&gt; 99\n"
full_name: Proc#binding
is_singleton: false
name: binding
params: |
  prc.binding    => binding

visibility: public
PK�}[OS��xxri/1.8/system/Proc/call-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Invokes the block, setting the block's parameters to the values in <em>params</em> using something close to method calling semantics. Generates a warning if multiple values are passed to a proc that expects just one (previously this silently converted the parameters to an array).
- !ruby/struct:SM::Flow::P 
  body: For procs created using <tt>Kernel.proc</tt>, generates an error if the wrong number of parameters are passed to a proc with multiple parameters. For procs created using <tt>Proc.new</tt>, extra parameters are silently discarded.
- !ruby/struct:SM::Flow::P 
  body: Returns the value of the last expression evaluated in the block. See also <tt>Proc#yield</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   a_proc = Proc.new {|a, *b| b.collect {|i| i*a }}\n   a_proc.call(9, 1, 2, 3)   #=&gt; [9, 18, 27]\n   a_proc[9, 1, 2, 3]        #=&gt; [9, 18, 27]\n   a_proc = Proc.new {|a,b| a}\n   a_proc.call(1,2,3)\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   prog.rb:5: wrong number of arguments (3 for 2) (ArgumentError)\n    from prog.rb:4:in `call'\n    from prog.rb:5\n"
full_name: Proc#call
is_singleton: false
name: call
params: |
  prc.call(params,...)   => obj
  prc[params,...]        => obj

visibility: public
PK�}[M��!``!ri/1.8/system/Proc/to_proc-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Part of the protocol for converting objects to <tt>Proc</tt> objects. Instances of class <tt>Proc</tt> simply return themselves.
full_name: Proc#to_proc
is_singleton: false
name: to_proc
params: |
  prc.to_proc -> prc

visibility: public
PK�}[�͓�cc"ri/1.8/system/Proc/cdesc-Proc.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>Proc</tt> objects are blocks of code that have been bound to a set of local variables. Once bound, the code may be called in different contexts and still access those variables.
- !ruby/struct:SM::Flow::VERB 
  body: "   def gen_times(factor)\n     return Proc.new {|n| n*factor }\n   end\n\n   times3 = gen_times(3)\n   times5 = gen_times(5)\n\n   times3.call(12)               #=&gt; 36\n   times5.call(5)                #=&gt; 25\n   times3.call(times5.call(4))   #=&gt; 60\n"
constants: []

full_name: Proc
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: ==
- !ruby/object:RI::MethodSummary 
  name: "[]"
- !ruby/object:RI::MethodSummary 
  name: arity
- !ruby/object:RI::MethodSummary 
  name: binding
- !ruby/object:RI::MethodSummary 
  name: call
- !ruby/object:RI::MethodSummary 
  name: clone
- !ruby/object:RI::MethodSummary 
  name: to_proc
- !ruby/object:RI::MethodSummary 
  name: to_s
name: Proc
superclass: Object
PK�}[��J�ri/1.8/system/Proc/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new <tt>Proc</tt> object, bound to the current context. <tt>Proc::new</tt> may be called without a block only within a method with an attached block, in which case that block is converted to the <tt>Proc</tt> object.
- !ruby/struct:SM::Flow::VERB 
  body: "   def proc_from\n     Proc.new\n   end\n   proc = proc_from { &quot;hello&quot; }\n   proc.call   #=&gt; &quot;hello&quot;\n"
full_name: Proc::new
is_singleton: true
name: new
params: |
  Proc.new {|...| block } => a_proc 
  Proc.new                => a_proc 

visibility: public
PK�}[����>>ri/1.8/system/Proc/to_s-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Shows the unique identifier for this proc, along with an indication of where the proc was defined.
full_name: Proc#to_s
is_singleton: false
name: to_s
params: |
  prc.to_s   => string

visibility: public
PK�}[���ff ri/1.8/system/Proc/%3d%3d-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Return <tt>true</tt> if <em>prc</em> is the same object as <em>other_proc</em>, or if they are both procs with the same body.
full_name: Proc#==
is_singleton: false
name: ==
params: |
  prc == other_proc   =>  true or false

visibility: public
PK�}[O�$���ri/1.8/system/Proc/clone-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "MISSING: documentation"
full_name: Proc#clone
is_singleton: false
name: clone
params: ()
visibility: public
PK�}[��5��.ri/1.8/system/ACL/ACLEntry/cdesc-ACLEntry.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: ACL::ACLEntry
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: dot_pat
- !ruby/object:RI::MethodSummary 
  name: dot_pat_str
- !ruby/object:RI::MethodSummary 
  name: match
name: ACLEntry
superclass: Object
PK�}[e��̯�'ri/1.8/system/ACL/ACLEntry/match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: ACL::ACLEntry#match
is_singleton: false
name: match
params: (addr)
visibility: public
PK�}[�T�p��%ri/1.8/system/ACL/ACLEntry/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: ACL::ACLEntry::new
is_singleton: true
name: new
params: (str)
visibility: public
PK�}[S�2s��-ri/1.8/system/ACL/ACLEntry/dot_pat_str-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: ACL::ACLEntry#dot_pat_str
is_singleton: false
name: dot_pat_str
params: (str)
visibility: private
PK�}[����)ri/1.8/system/ACL/ACLEntry/dot_pat-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: ACL::ACLEntry#dot_pat
is_singleton: false
name: dot_pat
params: (str)
visibility: private
PK�}[<�;���ri/1.8/system/ACL/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: ACL::new
is_singleton: true
name: new
params: (list=nil, order = DENY_ALLOW)
visibility: public
PK�}[��s��&ri/1.8/system/ACL/allow_addr%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: ACL#allow_addr?
is_singleton: false
name: allow_addr?
params: (addr)
visibility: public
PK�}[l�����(ri/1.8/system/ACL/allow_socket%3f-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: ACL#allow_socket?
is_singleton: false
name: allow_socket?
params: (soc)
visibility: public
PK�}[�%p���%ri/1.8/system/ACL/install_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: ACL#install_list
is_singleton: false
name: install_list
params: (list)
visibility: public
PK�}[��Y__ ri/1.8/system/ACL/cdesc-ACL.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: 
- !ruby/object:RI::Constant 
  comment: 
  name: VERSION
  value: "[\"2.0.0\"]"
- !ruby/object:RI::Constant 
  comment: 
  name: DENY_ALLOW
  value: "0"
- !ruby/object:RI::Constant 
  comment: 
  name: ALLOW_DENY
  value: "1"
full_name: ACL
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: allow_addr?
- !ruby/object:RI::MethodSummary 
  name: allow_socket?
- !ruby/object:RI::MethodSummary 
  name: install_list
name: ACL
superclass: Object
PK�}[t��6��&ri/1.8/system/ACL/ACLList/match-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: ACL::ACLList#match
is_singleton: false
name: match
params: (addr)
visibility: public
PK�}[�����$ri/1.8/system/ACL/ACLList/add-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: ACL::ACLList#add
is_singleton: false
name: add
params: (str)
visibility: public
PK�}[�6B��$ri/1.8/system/ACL/ACLList/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: ACL::ACLList::new
is_singleton: true
name: new
params: ()
visibility: public
PK�}[�t
FF,ri/1.8/system/ACL/ACLList/cdesc-ACLList.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
constants: []

full_name: ACL::ACLList
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: add
- !ruby/object:RI::MethodSummary 
  name: match
name: ACLList
superclass: Object
PK�}[
�u��%ri/1.8/system/Class/superclass-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Returns the superclass of <em>class</em>, or <tt>nil</tt>.
- !ruby/struct:SM::Flow::VERB 
  body: "   File.superclass     #=&gt; IO\n   IO.superclass       #=&gt; Object\n   Object.superclass   #=&gt; nil\n"
full_name: Class#superclass
is_singleton: false
name: superclass
params: |
  class.superclass -> a_super_class or nil

visibility: public
PK�}[ƫ���	�	$ri/1.8/system/Class/cdesc-Class.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: Classes in Ruby are first-class objects---each is an instance of class <tt>Class</tt>.
- !ruby/struct:SM::Flow::P 
  body: "When a new class is created (typically using <tt>class Name ... end</tt>), an object of type <tt>Class</tt> is created and assigned to a global constant (<tt>Name</tt> in this case). When <tt>Name.new</tt> is called to create a new object, the <tt>new</tt> method in <tt>Class</tt> is run by default. This can be demonstrated by overriding <tt>new</tt> in <tt>Class</tt>:"
- !ruby/struct:SM::Flow::VERB 
  body: "   class Class\n      alias oldNew  new\n      def new(*args)\n        print &quot;Creating a new &quot;, self.name, &quot;\\n&quot;\n        oldNew(*args)\n      end\n    end\n\n    class Name\n    end\n\n    n = Name.new\n"
- !ruby/struct:SM::Flow::P 
  body: <em>produces:</em>
- !ruby/struct:SM::Flow::VERB 
  body: "   Creating a new Name\n"
- !ruby/struct:SM::Flow::P 
  body: Classes, modules, and objects are interrelated. In the diagram that follows, the vertical arrows represent inheritance, and the parentheses meta-classes. All metaclasses are instances of the class `Class'.
- !ruby/struct:SM::Flow::VERB 
  body: "                          +------------------+\n                          |                  |\n            Object----&gt;(Object)              |\n             ^  ^        ^  ^                |\n             |  |        |  |                |\n             |  |  +-----+  +---------+      |\n             |  |  |                  |      |\n             |  +-----------+         |      |\n             |     |        |         |      |\n      +------+     |     Module---&gt;(Module)  |\n      |            |        ^         ^      |\n OtherClass--&gt;(OtherClass)  |         |      |\n                            |         |      |\n                          Class----&gt;(Class)  |\n                            ^                |\n                            |                |\n                            +----------------+\n"
constants: []

full_name: Class
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: allocate
- !ruby/object:RI::MethodSummary 
  name: inherited
- !ruby/object:RI::MethodSummary 
  name: new
- !ruby/object:RI::MethodSummary 
  name: superclass
- !ruby/object:RI::MethodSummary 
  name: to_yaml
name: Class
superclass: Module
PK�}[�P����"ri/1.8/system/Class/to_yaml-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: Class#to_yaml
is_singleton: false
name: to_yaml
params: ( opts = {} )
visibility: public
PK�}[��W]��#ri/1.8/system/Class/allocate-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Allocates space for a new object of <em>class</em>'s class and does not call initialize on the new instance. The returned object must be an instance of <em>class</em>.
- !ruby/struct:SM::Flow::VERB 
  body: "    klass = Class.new do\n      def initialize(*args)\n        @initialized = true\n      end\n\n      def initialized?\n        @initialized || false\n      end\n    end\n\n    klass.allocate.initialized? #=&gt; false\n"
full_name: Class#allocate
is_singleton: false
name: allocate
params: |
  class.allocate()   =>   obj

visibility: public
PK�}[�]HG��ri/1.8/system/Class/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Creates a new anonymous (unnamed) class with the given superclass (or <tt>Object</tt> if no parameter is given). You can give a class a name by assigning the class object to a constant.
full_name: Class::new
is_singleton: true
name: new
params: |
  Class.new(super_class=Object)   =>    a_class

visibility: public
PK�}[ڰ`���ri/1.8/system/Class/new-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Calls <tt>allocate</tt> to create a new object of <em>class</em>'s class, then invokes that object's <tt>initialize</tt> method, passing it <em>args</em>. This is the method that ends up getting called whenever an object is constructed using .new.
full_name: Class#new
is_singleton: false
name: new
params: |
  class.new(args, ...)    =>  obj

visibility: public
PK�}[E:�1��$ri/1.8/system/Class/inherited-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Callback invoked whenever a subclass of the current class is created.
- !ruby/struct:SM::Flow::P 
  body: "Example:"
- !ruby/struct:SM::Flow::VERB 
  body: "   class Foo\n      def self.inherited(subclass)\n         puts &quot;New subclass: #{subclass}&quot;\n      end\n   end\n\n   class Bar &lt; Foo\n   end\n\n   class Baz &lt; Bar\n   end\n"
- !ruby/struct:SM::Flow::P 
  body: "produces:"
- !ruby/struct:SM::Flow::VERB 
  body: "   New subclass: Bar\n   New subclass: Baz\n"
full_name: Class#inherited
is_singleton: false
name: inherited
params: |
  inherited(subclass)

visibility: public
PK�}[?W��(ri/1.8/system/DefaultDisplay/page-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: unless pager = setup_pager
comment: []

full_name: DefaultDisplay#page
is_singleton: false
name: page
params: () {|unless pager = setup_pager| ...}
visibility: private
PK�}[8��PP6ri/1.8/system/DefaultDisplay/cdesc-DefaultDisplay.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: 
- !ruby/object:RI::MethodSummary 
  name: new
comment: 
- !ruby/struct:SM::Flow::P 
  body: A paging display module. Uses the ri_formatter class to do the actual presentation
constants: []

full_name: DefaultDisplay
includes: 
- !ruby/object:RI::IncludedModule 
  name: RiDisplay
instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: display_class_info
- !ruby/object:RI::MethodSummary 
  name: display_class_list
- !ruby/object:RI::MethodSummary 
  name: display_flow
- !ruby/object:RI::MethodSummary 
  name: display_method_info
- !ruby/object:RI::MethodSummary 
  name: display_method_list
- !ruby/object:RI::MethodSummary 
  name: display_params
- !ruby/object:RI::MethodSummary 
  name: display_usage
- !ruby/object:RI::MethodSummary 
  name: list_known_classes
- !ruby/object:RI::MethodSummary 
  name: list_known_names
- !ruby/object:RI::MethodSummary 
  name: page
- !ruby/object:RI::MethodSummary 
  name: setup_pager
- !ruby/object:RI::MethodSummary 
  name: warn_no_database
name: DefaultDisplay
superclass: Object
PK�}[�;����1ri/1.8/system/DefaultDisplay/display_usage-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: DefaultDisplay#display_usage
is_singleton: false
name: display_usage
params: ()
visibility: public
PK�}[{gzH7ri/1.8/system/DefaultDisplay/display_method_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Display a list of method names
full_name: DefaultDisplay#display_method_list
is_singleton: false
name: display_method_list
params: (methods)
visibility: public
PK�}[��2}��6ri/1.8/system/DefaultDisplay/display_class_list-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: DefaultDisplay#display_class_list
is_singleton: false
name: display_class_list
params: (namespaces)
visibility: public
PK�}[AT���4ri/1.8/system/DefaultDisplay/warn_no_database-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: DefaultDisplay#warn_no_database
is_singleton: false
name: warn_no_database
params: ()
visibility: private
PK�}[ �P���6ri/1.8/system/DefaultDisplay/list_known_classes-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: DefaultDisplay#list_known_classes
is_singleton: false
name: list_known_classes
params: (classes)
visibility: public
PK�}[��*��'ri/1.8/system/DefaultDisplay/new-c.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
full_name: DefaultDisplay::new
is_singleton: true
name: new
params: (options)
visibility: public
PK�}[��t|��/ri/1.8/system/DefaultDisplay/setup_pager-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: DefaultDisplay#setup_pager
is_singleton: false
name: setup_pager
params: ()
visibility: private
PK�}[�M��6ri/1.8/system/DefaultDisplay/display_class_info-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: DefaultDisplay#display_class_info
is_singleton: false
name: display_class_info
params: (klass, ri_reader)
visibility: public
PK�}[i[$��0ri/1.8/system/DefaultDisplay/display_flow-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: DefaultDisplay#display_flow
is_singleton: false
name: display_flow
params: (flow)
visibility: private
PK�}[��A��7ri/1.8/system/DefaultDisplay/display_method_info-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: DefaultDisplay#display_method_info
is_singleton: false
name: display_method_info
params: (method)
visibility: public
PK�}[F�_���4ri/1.8/system/DefaultDisplay/list_known_names-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: DefaultDisplay#list_known_names
is_singleton: false
name: list_known_names
params: (names)
visibility: public
PK�}[��6c��2ri/1.8/system/DefaultDisplay/display_params-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: []

full_name: DefaultDisplay#display_params
is_singleton: false
name: display_params
params: (method)
visibility: private
PK�}[m�440ri/1.8/system/ThreadError/cdesc-ThreadError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: <tt>Thread</tt> encapsulates the behavior of a thread of execution, including the main thread of the Ruby script.
- !ruby/struct:SM::Flow::P 
  body: In the descriptions of the methods in this class, the parameter <em>sym</em> refers to a symbol, which is either a quoted string or a <tt>Symbol</tt> (such as <tt>:name</tt>).
constants: []

full_name: ThreadError
includes: []

instance_methods: []

name: ThreadError
superclass: StandardError
PK�}[a�dII0ri/1.8/system/Forwardable/cdesc-Forwardable.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: 
- !ruby/object:RI::Attribute 
  comment: 
  - !ruby/struct:SM::Flow::P 
    body: force Forwardable to show up in stack backtraces of delegated methods
  name: debug
  rw: RW
class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: "The Forwardable module provides delegation of specified methods to a designated object, using the methods #def_delegator and #def_delegators."
- !ruby/struct:SM::Flow::P 
  body: "For example, say you have a class RecordCollection which contains an array <tt>@records</tt>. You could provide the lookup method #record_number(), which simply calls #[] on the <tt>@records</tt> array, like this:"
- !ruby/struct:SM::Flow::VERB 
  body: "  class RecordCollection\n    extend Forwardable\n    def_delegator :@records, :[], :record_number\n  end\n"
- !ruby/struct:SM::Flow::P 
  body: "Further, if you wish to provide the methods #size, #&lt;&lt;, and #map, all of which delegate to @records, this is how you can do it:"
- !ruby/struct:SM::Flow::VERB 
  body: "  class RecordCollection\n    # extend Forwardable, but we did that above\n    def_delegators :@records, :size, :&lt;&lt;, :map\n  end\n"
- !ruby/struct:SM::Flow::P 
  body: Also see the example at forwardable.rb.
constants: []

full_name: Forwardable
includes: []

instance_methods: 
- !ruby/object:RI::MethodSummary 
  name: def_delegator
- !ruby/object:RI::MethodSummary 
  name: def_delegators
- !ruby/object:RI::MethodSummary 
  name: def_instance_delegator
- !ruby/object:RI::MethodSummary 
  name: def_instance_delegators
name: Forwardable
superclass: 
PK�}[��nC.ri/1.8/system/Forwardable/def_delegator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #def_instance_delegator"
full_name: Forwardable#def_delegator
is_singleton: false
name: def_delegator
params: (accessor, method, ali = method)
visibility: public
PK�}[�
��8ri/1.8/system/Forwardable/def_instance_delegators-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: def_delegators
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Shortcut for defining multiple delegator methods, but with no provision for using a different name. The following two code samples have the same effect:"
- !ruby/struct:SM::Flow::VERB 
  body: "  def_delegators :@records, :size, :&lt;&lt;, :map\n\n  def_delegator :@records, :size\n  def_delegator :@records, :&lt;&lt;\n  def_delegator :@records, :map\n"
- !ruby/struct:SM::Flow::P 
  body: See the examples at Forwardable and forwardable.rb.
full_name: Forwardable#def_instance_delegators
is_singleton: false
name: def_instance_delegators
params: (accessor, *methods)
visibility: public
PK�}[hA�tff7ri/1.8/system/Forwardable/def_instance_delegator-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: 
- !ruby/object:RI::AliasName 
  name: def_delegator
block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: Defines a method <em>method</em> which delegates to <em>obj</em> (i.e. it calls the method of the same name in <em>obj</em>). If <em>new_name</em> is provided, it is used as the name for the delegate method.
- !ruby/struct:SM::Flow::P 
  body: See the examples at Forwardable and forwardable.rb.
full_name: Forwardable#def_instance_delegator
is_singleton: false
name: def_instance_delegator
params: (accessor, method, ali = method)
visibility: public
PK�}[�J@H/ri/1.8/system/Forwardable/def_delegators-i.yamlnu�[���--- !ruby/object:RI::MethodDescription 
aliases: []

block_params: 
comment: 
- !ruby/struct:SM::Flow::P 
  body: "Alias for #def_instance_delegators"
full_name: Forwardable#def_delegators
is_singleton: false
name: def_delegators
params: (accessor, *methods)
visibility: public
PK�}[ZrW�00<ri/1.8/system/ZeroDivisionError/cdesc-ZeroDivisionError.yamlnu�[���--- !ruby/object:RI::ClassDescription 
attributes: []

class_methods: []

comment: 
- !ruby/struct:SM::Flow::P 
  body: Turn off floating point exceptions for overflow, etc.
constants: []

full_name: ZeroDivisionError
includes: []

instance_methods: []

name: ZeroDivisionError
superclass: StandardError
PK~[Z�>u�J�Jman/man1/ruby.1nu�[���.\"Ruby is copyrighted by Yukihiro Matsumoto <matz@netlab.jp>.
.Dd April 14, 2018
.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
The Ruby interpreter accepts the 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, and quits immediately without running any
script.
.Pp
.It Fl -version
Prints the version of the Ruby interpreter, and quits immediately without
running any script.
.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 the 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 chomp! .
.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 information.
.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 script arguments (script file or
.Fl e
options) are present, Ruby quits immediately.
.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: 524288 (32-bit CPU) or 1048575 (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~[0���man/man1/erb.1nu�[���.\"Ruby is copyrighted by Yukihiro Matsumoto <matz@netlab.jp>.
.Dd December 16, 2018
.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
Disables ruby code evaluation for lines beginning with
.Li "%" .
.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~[Сy
y
man/man1/irb.1nu�[��� -execute-continue Ar CODE
Execute some Ruby code, then continue with normal task processing.
.Pp
.It Fl G
.It Fl -no-system
.It Fl -nosystem
Use standard project Rakefile search paths, ignore system wide rakefiles.
.Pp
.It Fl I Ar LIBDIR
.It Fl -libdir Ar LIBDIR
Include
.Ar LIBDIR
in the search path for required modules.
.Pp
.It Fl N
.It Fl -no-search
.It Fl -nosearch
Do not search parent directories for the Rakefile.
.Pp
.It Fl P
.It Fl -prereqs
Display the tasks and dependencies, then exit.
.Pp
.It Fl R Ar RAKELIBDIR
.It Fl -rakelib Ar RAKELIBDIR
.It Fl -rakelibdir Ar RAKELIBDIR
Auto-import any .rake files in
.Ar RAKELIBDIR .
(default is
.Pa rakelib
)
.Pp
.It Fl T Op Ar PATTERN
.It Fl -tasks Op Ar PATTERN
Display the tasks (matching optional
.Ar PATTERN Ns
) with descriptions, then exit.
.Pp
.It Fl e Ar CODE
.It Fl -execute Ar CODE
Execute some Ruby code and exit.
.Pp
.It Fl f Ar FILE
.It Fl -rakefile Ar FILE
Use FILE as the rakefile.
.Pp
.It Fl h
.It Fl -help
Prints a summary of options.
.Pp
.It Fl g
.It Fl -system
Using system wide (global) rakefiles (usually
.Pa ~/.rake/*.rake
).
.Pp
.It Fl n
.It Fl -dry-run
Do a dry run without executing actions.
.Pp
.It Fl p Ar CODE
.It Fl -execute-print Ar CODE
Execute some Ruby code, print the result, then exit.
.Pp
.It Fl q
.It Fl -quiet
Do not log messages to standard output.
.Pp
.It Fl r Ar MODULE
.It Fl -require Ar MODULE
Require MODULE before executing rakefile.
.Pp
.It Fl s
.It Fl -silent
Like
.Fl -quiet ,
but also suppresses the 'in directory' announcement.
.Pp
.It Fl t
.It Fl -trace
Turn on invoke/execute tracing, enable full backtrace.
.Pp
.It Fl v
.It Fl -verbose
Log message to standard output (default).
.Pp
.It Fl -rules
Trace the rules resolution.
.Pp
.El
.Pp
.Sh SEE ALSO
.Xr ruby 1
.Xr make 1
.Pp
http://rake.rubyforge.org/
.Sh REPORTING BUGS
Bugs, features requests and other issues can be logged at
<\fBhttp://onestepback.org/redmine/projects/show/rake\fR>.
.Pp
You will need an account to before you can post issues. Register at <\fBhttp://onestepback.org/redmine/account/register\fR>.
Or you can send an email to the author.
.Sh AUTHOR
.Nm Rake
is written by
.An Jim Weirich Aq jim@weirichhouse.org
PK~[���
man/man1/ri.1nu�[���.\"Ruby is copyrighted by Yukihiro Matsumoto <matz@netlab.jp>.
.Dd December 29, 2008
.Dt RI(1) "" "Ruby Programmers Reference Guide"
.Os UNIX
.Sh NAME
.Nm ri
.Nd Ruby API reference front end
.Sh SYNOPSIS
.Nm
.Op Fl Ti
.Op Fl d Ar directory
.Op Fl f Ar format
.Op Fl -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 use-cache
.Op Fl -width Ns = Ns Ar width
.Op Ar target ...
.Sh DESCRIPTION
.Nm
is a CUI front end for the Ruby API reference.
You can search and read API reference for classes and methods with
.Nm .
.Pp
.Nm
is a part of Ruby.
.Pp
.Ar target
can be one of the following forms:
.Bl -diag -offset indent
.It Class
for classes
.It Class::method
for class methods
.It Class#method
for instance methods
.It Class.method
for both class and instance methods
.It method
for both class and instance methods
.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
For example:
.Bd -literal -offset indent
ri Fil
ri File
ri File.new
ri zip
.Ed
.Pp
Note that shell quoting may be required for methPK~[�����man/man1/rake.1nu�[���.Dd June 12, 2016
.Dt RAKE 1
.Os rake 11.2.2
.Sh NAME
.Nm rake
.Nd make-like build utility for Ruby
.Sh SYNOPSIS
.Nm
.Op Fl f Ar rakefile
.Op Ar options
.Ar targets ...
.Sh DESCRIPTION
.Nm
is a
.Xr make 1 Ns -like
build utility for Ruby.
Tasks and dependencies are specified in standard Ruby syntax.
.Sh OPTIONS
.Bl -tag -width Ds
.It Fl m , Fl -multitask
Treat all tasks as multitasks.
.It Fl B , Fl -build-all
Build all prerequisites, including those which are up\-to\-date.
.It Fl j , Fl -jobs Ar num_jobs
Specifies the maximum number of tasks to execute in parallel (default is number of CPU cores + 4).
.El
.Ss Modules
.Bl -tag -width Ds
.It Fl I , Fl -libdir Ar libdir
Include
.Ar libdir
in the search path for required modules.
.It Fl r , Fl -require Ar module
Require
.Ar module
before executing
.Pa rakefile .
.El
.Ss Rakefile location
.Bl -tag -width Ds
.It Fl f , Fl -rakefile Ar filename
Use
.Ar filename
as the rakefile to search for.
.It Fl N , Fl -no-search , Fl -nosearch
Do not search parent directories for the Rakefile.
.It Fl G , Fl -no-system , Fl -nosystem
Use standard project Rakefile search paths, ignore system wide rakefiles.
.It Fl R , Fl -rakelib Ar rakelibdir , Fl -rakelibdir Ar rakelibdir
Auto-import any .rake files in
.Ar rakelibdir
(default is
.Sq rakelib )
.It Fl g , Fl -system
Use system-wide (global) rakefiles (usually
.Pa ~/.rake/*.rake ) .
.El
.Ss Debugging
.Bl -tag -width Ds
.It Fl -backtrace Ns = Ns Ar out
Enable full backtrace.
.Ar out
can be
.Dv stderr
(default) or
.Dv stdout .
.It Fl t , Fl -trace Ns = Ns Ar out
Turn on invoke/execute tracing, enable full backtrace.
.Ar out
can be
.Dv stderr
(default) or
.Dv stdout .
.It Fl -suppress-backtrace Ar pattern
Suppress backtrace lines matching regexp
.Ar pattern .
Ignored if
.Fl -trace
is on.
.It Fl -rules
Trace the rules resolution.
.It Fl n , Fl -dry-run
Do a dry run without executing actions.
.It Fl T , Fl -tasks Op Ar pattern
Display the tasks (matching optional
.Ar pattern )
with descriptions, then exit.
.It Fl D , Fl -describe Op Ar pattern
Describe the tasks (matching optional
.Ar pattern ) ,
then exit.
.It Fl W , Fl -where Op Ar pattern
Describe the tasks (matching optional
.Ar pattern ) ,
then exit.
.It Fl P , Fl -prereqs
Display the tasks and dependencies, then exit.
.It Fl e , Fl -execute Ar code
Execute some Ruby code and exit.
.It Fl p , Fl -execute-print Ar code
Execute some Ruby code, print the result, then exit.
.It Fl E , Fl -execute-continue Ar code
Execute some Ruby code, then continue with normal task processing.
.El
.Ss Information
.Bl -tag -width Ds
.It Fl v , Fl -verbose
Log message to standard output.
.It Fl q , Fl -quiet
Do not log messages to standard output.
.It Fl s , Fl -silent
Like
.Fl -quiet ,
but also suppresses the
.Sq in directory
announcement.
.It Fl X , Fl -no-deprecation-warnings
Disable the deprecation warnings.
.It Fl -comments
Show commented tasks only
.It Fl A , Fl -all
Show all tasks, even uncommented ones (in combination with
.Fl T
or
.Fl D )
.It Fl -job-stats Op Ar level
Display job statistics.
If
.Ar level
is
.Sq history ,
displays a complete job list.
.It Fl V , Fl -version
Display the program version.
.It Fl h , Fl H , Fl -help
Display a help message.
.El
.Sh SEE ALSO
The complete documentation for
.Nm rake
has been installed at
.Pa /usr/share/doc/rake-doc/html/index.html .
It is also available online at
.Lk https://ruby.github.io/rake .
.Sh AUTHORS
.An -nosplit
.Nm
was written by
.An Jim Weirich Aq Mt jim@weirichhouse.org .
.Pp
This manual was created by
.An Caitlin Matos Aq Mt caitlin.matos@zoho.com
for the Debian project (but may be used by others).
It was inspired by the manual by
.An Jani Monoses Aq Mt jani@iv.ro
for the Ubuntu project.
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~[2?N�doc/alt-ruby21/README.janu�[�����比較的簡単で, +gc.c+ でスタックをマークしている
部分にアラインメントのバイト数だけずらしてマークするコードを
追加するだけで済みます.<tt>defined(\_\_mc68000\_\_)</tt>で括られてい
る部分を参考にしてください.

レジスタウィンドウを持つCPUでは,レジスタウィンドウをスタッ
クにフラッシュするアセンブラコードを追加する必要があるかも知
れません.


== 配布条件

+COPYING.ja+ ファイルを参照してください。


== 著者

コメント,バグレポートその他は mailto:matz@ruby-lang.org まで.
-------------------------------------------------------
created at: Thu Aug  3 11:57:36 JST 1995
--
Local variables:
mode: rdoc
end:
PK~[n��I�Idoc/alt-ruby21/ChangeLognu�[���Fri Apr  1 00:41:17 2016  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/rubygems/test_gem_commands_environment_command.rb (test_execute):
	  version number may be two-digit.

Fri Apr  1 00:00:31 2016  NAKAMURA Usaku  <usa@ruby-lang.org>

	* version.h: bump to 2.1.10.  welcome to two-digit version!

Wed Mar 30 18:45:26 2016  Kimura Wataru  <kimuraw@i.nifty.jp>

	* test/ruby/test_io.rb: handled rlimit value same as r52277
	  [Bug #11852][ruby-dev:49446]

Tue Mar 29 21:10:10 2016  Kazuki Yamaguchi  <k@rhe.jp>

	* ext/openssl/extconf.rb: check SSL_CTX_set_next_proto_select_cb
	  function rather than OPENSSL_NPN_NEGOTIATED macro. it exists
	  even if it is disabled by OpenSSL configuration.
	  [ruby-core:74384] [Bug #12182]

	* ext/openssl/ossl_ssl.c: update #ifdef(s) as above.

	* test/openssl/test_ssl.rb: skip NPN tests if NPN is disabled.

Tue Mar 29 21:09:02 2016  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/uri/http.rb (URI::HTTP#initialize): [DOC] fix example,
	  missing mandatory arguments.  [ruby-core:74540] [Bug #12215]

Tue Mar 29 21:07:30 2016  NARUSE, Yui  <naruse@ruby-lang.org>

	* thread_pthread.c (reserve_stack): fix reserving position where
	  the stack growing bottom to top. [Bug #12118]

Fri Mar 25 18:42:46 2016  Koichi ITO  <koic.ito@gmail.com>

	* variable.c: Added documentation about order of `Module#constants`
	  [ci skip][Bug #12121][ruby-dev:49505][fix GH-1301]

Fri Mar 25 18:41:14 2016  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (enc_succ_alnum_char): try to skip an invalid character
	  gap between GREEK CAPITAL RHO and SIGMA.
	  [ruby-core:74478] [Bug #12204]

Fri Mar 25 18:38:42 2016  NARUSE, Yui  <naruse@ruby-lang.org>

	* enc/trans/JIS: update Unicode's notice. [Bug #11844]

Fri Mar 25 18:36:04 2016  Eric Wong  <e@80x24.org>

	* ext/openssl/ossl_ssl.c (ossl_sslctx_setup): document as MT-unsafe
	  [ruby-core:73803] [Bug #12069]

Fri Mar 25 18:35:08 2016  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* ext/tk/lib/tkextlib/tcllib/tablelist_tile.rb: fix method name typo.
	  [ruby-core:72513] [Bug #11893] The patch provided by Akira Matsuda.


Fri Mar 25 18:34:20 2016  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* ext/tk/lib/tkextlib/tcllib/toolbar.rb: fix method name typo.
	  [ruby-core:72511] [Bug #11891] The patch provided by Akira Matsuda.


Fri Mar 25 18:33:34 2016  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* ext/tk/lib/tkextlib/blt/tree.rb: fix method name typo.
	  [ruby-core:72510] [Bug #11890] The patch provided by Akira Matsuda.


Fri Mar 25 18:32:44 2016  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* ext/tk/lib/tk/menubar.rb: fix a typo in font name. [ruby-core:72505]
	  [Bug #11886] The patch provided by Akira Matsuda.

	* ext/tk/sample/*.rb: ditto.

Fri Mar 25 18:30:55 2016  Anthony Dmitriyev  <antstorm@gmail.com>

	* net/ftp.rb: add NullSocket#closed? to fix closing not opened
	  connection.  [Fix GH-1232]

Fri Mar 25 18:24:04 2016  Victor Nawothnig  <Victor.Nawothnig@gmail.com>

	* parse.y (parse_numvar): NTH_REF must be less than a half of
	  INT_MAX, as it is left-shifted to be ORed with back-ref flag.
	  [ruby-core:74444] [Bug#12192] [Fix GH-1296]

Fri Mar 25 18:18:29 2016  Eric Hodel  <drbrain@segment7.net>

	* marshal.c (r_object0):  raise ArgumentError when linking to undefined
	  object.

Fri Mar 25 18:18:29 2016  Eric Hodel  <drbrain@segment7.net>

	* marshal.c (r_object0): Fix Marshal crash for corrupt extended object.

Fri Mar 25 18:07:48 2016  Yutaka Kanemoto  <kanemoto@ruby-lang.org>

	* cont.c (rb_fiber_struct): keep context.uc_stack.ss_sp and context.uc_stack.ss_size
	  for later use. Patch by Rei Odaira. [ruby-core:62945] [Bug #9905]

Fri Mar 25 17:52:46 2016  Tanaka Akira  <akr@fsij.org>

	* test/openssl/utils.rb (start_server, server_loop): Use a
	  pipe to stop server instead of shutdown/close a listening socket.

Fri Mar 25 17:52:46 2016  Tanaka Akira  <akr@fsij.org>

	* test/ruby/envutil.rb (assert_join_threads): New assertion to
	  join multiple threads without exceptions.

Fri Mar 25 17:52:46 2016  Tanaka Akira  <akr@fsij.org>

	* ext/openssl/lib/openssl/ssl.rb (SSLServer#accept): Close a socket
	  if any exception occur. 

Fri Mar 25 17:52:46 2016  Tanaka Akira  <akr@fsij.org>

	* ext/openssl/ossl_ssl.c (ossl_ssl_close): Fix sync_close to work
	  when SSL is not started.
	  This fix the fd leak by test_https_proxy_authentication in
	  test/net/http/test_https_proxy.rb.

Fri Mar 25 17:52:46 2016  Tanaka Akira  <akr@fsij.org>

	* test/openssl: Join threads.

Fri Mar 25 17:47:06 2016  NARUSE, Yui  <naruse@ruby-lang.org>

	* insns.def (opt_mod): show its method name on ZeroDivisionError.
	  [Bug #12158]

Fri Mar 25 17:45:36 2016  Rei Odaira  <Rei.Odaira@gmail.com>

	* test/ruby/test_process.rb (TestProcess#test_setsid): AIX
	  does not allow Process::getsid(pid) when pid is in a
	  different session.

Fri Mar 25 17:42:34 2016  Rei Odaira  <Rei.Odaira@gmail.com>

	* test/ruby/test_process.rb (test_execopts_gid): Skip a test
	  that is known to fail on AIX. AIX allows setgid to
	  a supplementary group, but Ruby does not allow the "-e"
	  option when setgid'ed, so the test does not work as intended.

Fri Mar 25 17:36:24 2016  Rei Odaira  <Rei.Odaira@gmail.com>

	* test/rinda/test_rinda.rb (test_make_socket_ipv4_multicast):
	  The fifth argument to getsockopt(2) should be modified to
	  indicate the actual size of the value on return,
	  but not in AIX. This is a know bug. Skip related tests.
	* test/rinda/test_rinda.rb (test_ring_server_ipv4_multicast):
	  ditto.
	* test/rinda/test_rinda.rb (test_make_socket_unicast): ditto.
	* test/socket/test_basicsocket.rb (test_getsockopt): ditto.
	* test/socket/test_sockopt.rb (test_bool): ditto.

Fri Mar 25 17:35:06 2016  Rei Odaira  <Rei.Odaira@gmail.com>

	* test/zlib/test_zlib.rb (test_adler32_combine, test_crc32_combine):
	  Skip two tests on AIX because zconf.h in zlib does not correctly
	  recognize _LARGE_FILES in AIX. The problem was already reported
	  to zlib, and skip these tests until it is fixed.

Fri Mar 25 17:33:52 2016  Rei Odaira  <Rei.Odaira@gmail.com>

	* test/socket/test_addrinfo.rb (test_ipv6_address_predicates):
	  IN6_IS_ADDR_V4COMPAT and IN6_IS_ADDR_V4MAPPED are broken
	  on AIX, so skip related tests.

Fri Mar 25 17:32:34 2016  Rei Odaira  <Rei.Odaira@gmail.com>

	* test/gdbm/test_gdbm.rb (TestGDBM#test_s_open_lock): skip
	  this test on AIX. The issue is the same as on Solaris.
	  [ruby-dev:47631]

Fri Mar 25 17:28:13 2016  Rei Odaira  <Rei.Odaira@gmail.com>

	* thread_pthread.c (getstack): __pi_stacksize returned by
	  pthread_getthrds_np() is wrong on AIX. Use
	  __pi_stackend - __pi_stackaddr instead.

Fri Mar 25 17:21:51 2016  Alex Boyd  <alex@opengroove.org>

	* lib/irb.rb: avoid to needless truncation when using back_trace_limit option.
	  [fiPK~[n��I�Idoc/alt-ruby21/ChangeLognu�[���sa Goto  <ngotogenome@gmail.com>

	* enc/windows_1250.c: Should not use C++ style comments (C99 feature).
	  [Bug #11843]

Fri Mar 25 17:15:19 2016  Martin Duerst  <duerst@it.aoyama.ac.jp>

	* enc/iso_8859_2.c, enc/windows_1250.c: separate Windows-1250
	  from ISO-8859-2 to fix 0x80..0x9e range (from Kimihito Matsui)

Fri Mar 25 17:15:19 2016  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enc/windows_1252.c: separate from ISO-8859-1 to fix 0x80..0x9e
	  range.  [ruby-core:64049] [Bug #10097]

Fri Mar 25 17:15:19 2016  Martin Duerst  <duerst@it.aoyama.ac.jp>

	* enc/iso_8859_13.c: Added three missing lower/upper-case
	  character pairs (from Kimihito Matsui)

Fri Mar 25 17:15:19 2016  Martin Duerst  <duerst@it.aoyama.ac.jp>

	* enc/iso_8859_4.c: Added missing lower/upper-case character
	  pair (U+014A and U+014B, LATIN CAPITAL/SMALL LETTER ENG)
	  (from Kimihito Matsui)

Fri Mar 25 16:53:41 2016  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_scrub): the result should be infected by the
	  original string.

Fri Mar 25 16:53:41 2016  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* transcode.c (rb_econv_substr_append, econv_primitive_convert):
	  the result should be infected by the original string.

Fri Mar 25 16:53:41 2016  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/ruby.h: add raw FL macros, which assume always the
	  argument object is not a special constant.

	* internal.h (STR_EMBED_P, STR_SHARED_P): valid only for T_STRING.

	* string.c: deal with taint flags directly across String instances.

Thu Feb 25 20:03:32 2016  Naotoshi Seo  <sonots@gmail.com>

	* lib/logger.rb: Remove block from Logger.add as it's not needed
	  patch provided by Daniel Lobato Garcia [fix GH-1240] [Bug #12054]

Thu Feb 25 19:58:48 2016  Zachary Scott  <zzak@ruby-lang.org>

	* re.c: Remove deprecated kcode argument from Regexp.new and compile
	  patch provided by Dylan Pulliam [Bug #11495]

Thu Feb 25 19:49:31 2016  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/socket/socket.c (sock_gethostname): support unlimited size
	  hostname.

Thu Feb 25 19:28:19 2016  Kouhei Sutou  <kou@cozmixng.org>

	* lib/xmlrpc/client.rb: Support SSL options in async methods of
	  XMLRPC::Client.
	  [Bug #11489]
	  Reported by Aleksandar Kostadinov. Thanks!!!

Thu Feb 25 19:25:25 2016  NARUSE, Yui  <naruse@ruby-lang.org>

	* marshal.c (r_object0): honor Marshal.load post proc
	  value for TYPE_LINK.  by Hiroshi Nakamura <nahi@ruby-lang.org>
	  https://github.com/ruby/ruby/pull/1204 fix GH-1204

Thu Feb 25 18:59:27 2016  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/socket/option.c (sockopt_bool): relax boolean size to be one
	  too not only sizeof(int).  Winsock getsockopt() returns a single
	  byte as a boolean socket option.  [ruby-core:72730] [Bug #11958]

Thu Feb 25 18:36:26 2016  NAKAMURA Usaku  <usa@ruby-lang.org>

	* process.c (rb_execarg_parent_start1): need to convert the encoding to
	  ospath's one.

Thu Feb 25 18:36:26 2016  NAKAMURA Usaku  <usa@ruby-lang.org>

	* process.c: use rb_w32_uchdir() instead of plain chdir() on Windows.
	  reported by naruse via twitter.

	* process.c (rb_execarg_addopt): need to convert the encoding to
	  ospath's one.

Thu Feb 25 18:21:55 2016  Eric Wong  <e@80x24.org>

	* ext/stringio/stringio.c (strio_binmode): implement to set encoding
	* test/stringio/test_stringio.rb (test_binmode): new test
	  [ruby-core:72699] [Bug #11945]

Thu Feb 25 18:12:00 2016  Eric Wong  <e@80x24.org>

	* io.c (io_getpartial): remove unused kwarg from template
	* test/ruby/test_io.rb (test_readpartial_bad_args): new
	  [Bug #11885]

Thu Feb 25 17:51:35 2016  Tadashi Saito  <tad.a.digger@gmail.com>

	* compile.c, cont.c, doc, man: fix common misspelling.
	  [ruby-core:72466] [Bug #11870]

Thu Feb 25 17:48:16 2016  Eric Wong  <e@80x24.org>

	* ext/socket/init.c (rsock_init_sock): reject reserved FDs
	  [ruby-core:72445] [Bug #11862]

Thu Feb 25 17:38:59 2016  Eric Wong  <e@80x24.org>

	* ext/socket/init.c (rsock_init_sock): check FD after validating
	* test/socket/test_basicsocket.rb (test_for_fd): new
	  [ruby-core:72418] [Bug #11854]

Thu Feb 25 17:33:38 2016  SHIBATA Hiroshi  <hsbt@ruby-lang.org>

	* cont.c: fix a double word typo.
	  [Bug #11313][ruby-core:69749]

Thu Feb 25 17:32:23 2016  SHIBATA Hiroshi  <hsbt@ruby-lang.org>

	* ext/tk/lib/multi-tk.rb: fix typos.
	  [Bug #11764][ruby-core:71800]

Thu Feb 25 16:46:37 2016  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* re.c (reg_names_iter): should consider encoding of regexp.
	  [ruby-core:72185] [Bug #11825]

Wed Dec 23 14:13:59 2015  NAKAMURA Usaku  <usa@ruby-lang.org>

	* version.h: bump to 2.1.9.  may this version be the last of 2.1.

Wed Dec 16 21:10:03 2015  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* ext/fiddle/handle.c: check tainted string arguments.
	  Patch provided by tenderlove and nobu.

	* test/fiddle/test_handle.rb (class TestHandle): add test for above.

Wed Dec 16 21:10:03 2015  Yuki Sonoda (Yugui)  <yugui@yugui.jp>

	* ext/dl/handle.c (rb_dlhandle_initialize): prohibits DL::dlopen
	  with a tainted name of library.
	  Patch by sheepman <sheepman AT sheepman.sakura.ne.jp>.

	* ext/dl/handle.c (rb_dlhandle_sym): ditto

Wed Dec 16 16:13:04 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (parse_mode_enc): fix buffer overflow.

Wed Dec 16 16:10:52 2015  Eric Wong  <e@80x24.org>

	* insns.def (opt_case_dispatch): avoid converting Infinity
	* test/ruby/test_optimization.rb (test_opt_case_dispatch_inf): new
	  [ruby-dev:49423] [Bug #11804]'

Wed Dec 16 16:07:29 2015  Rei Odaira  <Rei.Odaira@gmail.com>

	* configure.in: pthread_getattr_np is broken on AIX.
	  More specifically, the stack address and size returned are
	  not correct.

Wed Dec 16 16:04:27 2015  Eric Wong  <e@80x24.org>

	* insns.def (opt_case_dispatch): check Float#=== redefinition
	* test/ruby/test_optimization.rb (test_opt_case_dispatch): new
	  [ruby-core:71920] [Bug #11784]

Tue Dec  8 11:53:06 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ruby_atomic.h (ATOMIC_SIZE_CAS): fix the argument order of
	  InterlockedCompareExchange64.  new value and then old value is
	  the last.

Tue Dec  8 11:45:42 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* encoding.c (enc_m_loader): defer finding encoding object not to
	  be infected by marshal source.  [ruby-core:71793] [Bug #11760]

	* marshal.c (r_object0): enable compatible loader on USERDEF
	  class.  the loader function is called with the class itself,
	  instead of an allocated object, and the loaded data.

	* marshal.c (compat_allocator_table): initialize
	  compat_allocator_tbl on demand.

	* object.c (rb_undefined_alloc): extract from rb_obj_alloc.

Fri Dec  4 10:55:08 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* range.c (range_to_s): should be infected by the receiver.
	  str2 infects by appending.  [ruby-core:71811] [Bug #11767]

Wed Dec  2 15:14:29 2015  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/readline/extconf.rb: call dir_config("libedit")
	  if --enable-libedit is spcified. [Bug #11751]
	  patched by John Hein

Tue Dec  1 16:57:57 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_each_codepoint): raise an exception at incomplete
	  character before EOF when conversion takes place.  [Bug #11444]

Tue Dec  1 16:57:57 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_each_codepoint): read more data when read partially.
	  [ruby-core:70379] [Bug #11444]

Tue Dec  1 13:06:29 2015  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/digest/sha1/sha1ossl.c: fixed build error introduced at r52797.

Mon Nov 30 21:29:57 2015  Koichi Sasada  <ko1@atdot.net>

	* insns.def (defined): skip respond_to_missing? when
	  a method is available.
	  [Bug #11211]

	* test/ruby/test_defined.rb: add a test for this fix.

Mon Nov 30 21:27:09 2015  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/digest/rmd160/rmd160.c: fixed commit mistake at r52797.

Mon Nov 30 21:18:24 2015  Shugo Maeda  <shugo@ruby-lang.org>

	* io.c (argf_getpartial): should not resize str if the second
	  argument is not given.
	  [ruby-core:71668] [Bug #11738]

Mon Nov 30 21:17:08 2015  SHIBATA Hiroshi  <hsbt@ruby-lang.org>

	* lib/net/http.rb: set hostname before call ossl_ssl_set_session.
	  [Bug #11401][ruby-core:70152][fix GH-964] Patch by @mkarnebeek

Mon Nov 30 21:09:48 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* transcode.c (rb_econv_open0): rb_econv_t::source_encoding_name
	  and rb_econv_t::destination_encoding_name should refer static
	  strings always or NULL.  [ruby-core:70247] [Bug #11416]

Mon Nov 30 21:02:21 2015  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/digest/*/*.[ch]: include ruby.h before digest.h to avoid
	  includeing ext/digest/extconf.h. [Bug #3231]
	  https://msdn.microsoft.com/library/36k2cdd4.aspx

	* ext/digest/*/extconf.rb: remove ext/digest from include search path
	  to avoid confusion of cl.exe.

	* ext/digest/*/*.[ch]: explicitly specify def.h's path.

Mon Nov 30 20:54:22 2015  SHIBATA Hiroshi  <hsbt@ruby-lang.org>

	* Added missing reference of GitHub

Mon Nov 30 20:54:22 2015  Trevor Rowe  <trevorrowe@gmail.com>

	* lib/net/http.rb: Fixed regression for Net::HTTP::PUT with "Expect-100"
	  header. [fix GH-949]
	* test/net/http/test_http.rb: added test.

Wed Nov 18 20:56:50 2015  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/date/extconf.rb: try_cflags("-std=iso9899:1999") [Bug #10906]
	  ruby itself (including numeric.c) is built with strict compile
	  options including -std=iso9899:1999, but ext/date is not.
	  By the way -std=iso9899:1999 is not only a warning option but also
	  changes behavior like MACRO definitions for example INFINITY.
	  gcc on Solaris affect this.

Wed Nov 18 20:38:15 2015  Zachary Scott  <zzak@ruby-lang.org>

	* ext/openssl/ossl_pkey.c: Merge ruby/openssl@b9ea8ef [Bug #10735]

Wed Nov 18 20:31:56 2015  Aaron Patterson <tenderlove@ruby-lang.org>

	* ext/openssl/ossl_ssl.c (ossl_ssl_method_tab): Only add SSLv3 support
	  if the SSL library supports it.  Thanks Kurt Roeckx <kurt@roeckx.be>
	  [Bug #11376]

	* ext/openssl/extconf.rb: check for SSLv3 support in the SSL
	  implementation.

	* test/openssl/test_ssl.rb (class OpenSSL): Skip tests that need SSLv3
	  if there is no support.

Wed Nov 18 20:26:08 2015  Koichi Sasada  <ko1@atdot.net>

	* vm_trace.c (rb_threadptr_exec_event_hooks_orig):
	  maintain trace_running counter on internal events.

	  This patch is made by Takashi Kokubun <takashikkbn@gmail.com>.
	  [Bug #11603] https://github.com/ruby/ruby/pull/1059

Wed Nov 18 20:19:49 2015  Koichi Sasada  <ko1@atdot.net>

	* compile.c (iseq_compile_each): remove duplicated line event.
	  [Bug #10449]

	* test/ruby/test_settracefunc.rb: add and fix tests.

Wed Nov 18 20:14:38 2015  Koichi Sasada  <ko1@atdot.net>

	* vm.c (hook_before_rewind): prevent kicking :return event while
	  finishing vm_exec func because invoke_block_from_c() kick a :return
	  event for bmethods.
	  [Bug #11492]

	* test/ruby/test_settracefunc.rb: add a test.

Wed Nov 18 20:10:31 2015  Aaron Patterson <tenderlove@ruby-lang.org>

	* test/openssl/test_ssl_session.rb: Fix tests so that they take in to
	  account OpenSSL installations that have SSLv3 disabled by default.
	  Thanks Jeremy Evans <code@jeremyevans.net> for the patches.
	  [Bug #11366] [Bug #11367]

Wed Nov 18 20:04:50 2015  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* test/openssl/test_ssl_session.rb (OpenSSL#test_ctx_client_session_cb):
	  fix test failure with OpenSSL disabled SSLv3 protocol.
	  [ruby-core:63772] [Bug #10046]

Thu Oct 29 23:54:35 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (sym_to_proc), proc.c (rb_block_clear_env_self): clear
	  caller's self which is useless, so that it can get collected.
	  [Fixes GH-592]

Thu Oct 29 23:30:20 2015  SHIBATA Hiroshi  <hsbt@ruby-lang.org>

	* lib/ipaddr.rb, test/test_ipaddr.rb: Reject invalid address contained
	  EOL string. Patch by @kachick [fix GH-942][Bug #11513]

	* lib/ipaddr.rb, test/test_ipaddr.rb: split test code from library
	  script and move to test script, just like trunk.

Thu Oct 29 23:04:04 2015  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/openssl/ossl_ssl.c (ssl_npn_select_cb): explicitly raise error
	  in ext/openssl instead of OpenSSL itself because LibreSSL
	  silently truncate the selected protocol name by casting the length
	  from int to unsigned char. [Bug #11369]
	  Patch by Jeremy Evans <merch-redmine@jeremyevans.net>

Thu Oct 29 22:56:01 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: check for libunwind.h, which is not available in
	  very old OS X SDK.  [ruby-core:71080] [Bug #11591]

Thu Oct 29 22:51:59 2015  Masatoshi SEKI  <m_seki@mva.biglobe.ne.jp>

	* test/drb/test_drb.rb: Run Rinda/DRb tests on localhost. [Fix GH-1027]
	  patch by voxik.

	* test/rinda/test_rinda.rb: ditto

Tue Sep 29 17:39:42 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (literal_concat_gen, evstr2dstr_gen): keep literal
	  encoding beginning with an interpolation same as the source file
	  encoding.  [ruby-core:70703] [Bug #11519]

Tue Sep 29 17:33:13 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/rss/rss.rb (Time#w3cdtf): fix zero-trimmed width of fraction
	  digits.  [ruby-core:70667] [Bug #11509]

Tue Sep 29 17:25:14 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* re.c (rb_memsearch_wchar, rb_memsearch_qchar): test matching
	  till the end of string.  [ruby-core:70592] [Bug #11488]

	* test/ruby/test_m17n.rb (test_include?, tet_index): add tests by
	  Tom Stuart.

Tue Sep 29 17:20:07 2015  NARUSE, Yui  <naruse@ruby-lang.org>

	* thread_pthread.c (reserve_stack): ensure the memory is really
	  allocated. [Bug #11457]

Tue Sep 29 17:18:40 2015  NAKAMURA Usaku  <usa@ruby-lang.org>

	* version.h (RUBY_VERSION): bump RUBY_VERSION to 2.1.8.

Tue Aug 18 21:40:43 2015  SHIBATA Hiroshi  <hsbt@ruby-lang.org>

	* lib/rubygems.rb: bump version to 2.2.5. this version fixed
	  CVE-2015-3900.

	* lib/rubygems/remote_fetcher.rb: ditto.

	* test/rubygems/test_gem_remote_fetcher.rb: added testcase for CVE-2015-3900

Mon Aug 17 23:27:45 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/win32/lib/win32/registry.rb (API#SetValue): data size should
	  be in bytes, not in chars.  [ruby-core:70365] [Bug #11439]

Mon Aug 17 23:27:45 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/win32/lib/win32/registry.rb (API#SetValue): add terminator
	  size, not 1 byte.  [ruby-core:70365] [Bug #11439]

Mon Aug 17 17:57:12 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* re.c (rb_memsearch): should match only char boundaries in wide
	  character encodings.  [ruby-core:70220] [Bug #11413]

Mon Aug 17 17:54:33 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* transcode.c (rb_econv_set_replacement): target encoding name can
	  be empty now.  [ruby-core:69841] [Bug #11324]

Mon Aug 17 17:52:11 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (rb_any_hash): fix Float hash.  rb_dbl_hash() returns a
	  Fixnum, but not a long.  [Bug #9381]

Mon Aug 17 17:43:56 2015  Eric Wong  <e@80x24.org>

	* io.c (rb_io_oflags_modestr): handle O_TRUNC correctly
	* test/ruby/test_io.rb (test_reopen_stdio): new test
	  Patch-by: cremno phobia <cremno@mail.ru>
	  [ruby-core:69779] [Bug #11319]

Mon Aug 17 17:42:18 2015  Benoit Daloze  <eregontp@gmail.com>

	* lib/net/ftp.rb (makeport): close the TCPServer
	  when sending the port fails.

	* test/net/ftp/test_ftp.rb: test for above.

Mon Aug 17 17:38:15 2015  Kazuki Tsujimoto  <kazuki@callcc.net>

	* lib/net/http/response.rb (Net::HTTPResponse::Inflater#finish):
	  fix a bug that empty gzipped response body causes Zlib::BufError.
	  [ruby-core:68846] [Bug #11058]

	* test/net/http/test_httpresponse.rb: tests for the above.

Mon Aug 17 17:38:15 2015  Kazuki Tsujimoto  <kazuki@callcc.net>

	* lib/net/http/response.rb (Net::HTTPResponse#inflater):
	  fix TypeError. An exception object might be nil.
	  [ruby-core:68846] [Bug #11058]

Mon Aug 17 17:38:15 2015  NARUSE, Yui  <naruse@ruby-lang.org>

	* lib/net/http/response.rb (Net::HTTPResponse.each_response_header):
	  raise first exception even if inflate_body_io.finish raises error.
	  when begin block raises error, finish usually raises error too.

Mon Aug 17 17:16:22 2015  Aaron Patterson <tenderlove@ruby-lang.org>

	* .travis.yml: update libssl before running tests. 
	  Thanks to Chris Sinjakli <chris@sinjakli.co.uk> for figuring out the
	  travis settings!

Mon Aug 17 17:16:22 2015  Aaron Patterson <tenderlove@ruby-lang.org>

	* ext/openssl/lib/openssl/ssl.rb (module OpenSSL): raise a more
	  helpful exception when verifying the peer connection and an
	  anonymous cipher has been selected. [ruby-core:68330] [Bug #10910]
	  Thanks to Chris Sinjakli <chris@sinjakli.co.uk> for the patch.

	* test/openssl/test_ssl.rb (class OpenSSL): test for change

Mon Aug 17 17:12:46 2015  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (waitpid): return immediately if interrupted.
	  reported by <takkanm AT gmail.com> [ruby-dev:49176] [Bug #11340]

Mon Aug 17 17:09:02 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (lambda_body): pop cmdarg stack for lookahead
	  token.  [ruby-core:70067] [Bug #11380]

Mon Aug 17 17:04:57 2015  Jeremy Evans  <merch-redmine@jeremyevans.net>

	* test/openssl/test_ssl.rb: Fix LocalJumpErrors being raised
	  in OpenSSL tests. [ruby-core:70020][Bug #11368]

Mon Aug 17 16:51:45 2015  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* lib/timeout.rb (ExitException): leave Timeout::ExitException as an
	  alias of Timeout::Error for backward compatibility in stable branch.
	  [ruby-dev:49179] [Bug #11344]

Mon Aug 17 16:51:45 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/timeout.rb (ExitException): removed internal exception class
	  and use Timeout::Error instead, as using throw/catch to isolate
	  each timeouts now.  [ruby-dev:49179] [Bug #11344]

Mon Aug 17 16:49:00 2015  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* test/net/http/test_httpresponse.rb
	(HTTPResponseTest#test_read_body_content_encoding_deflate_uppercase):
	fix a failure without zlib.

Mon Aug 17 16:49:00 2015  NARUSE, Yui  <naruse@ruby-lang.org>

	* lib/net/http/response.rb (inflater): CONTENT_ENCODING can be upper
	  case. [ruby-core:69670] [Bug #11285] patched by Andy Chu

Mon Aug 17 16:46:28 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm.c (m_core_hash_merge_ptr): copy the arguments to the machine
	  stack before rewinding the control frame pointer and leaving the
	  arguments outside valid region of the value stack.
	  [ruby-core:69969] [Bug #11352]

	* vm.c (REWIND_CFP): keep the arguments region inside the valid
	  value stack.  [ruby-core:69969] [Bug #11352]

Mon Aug 17 16:44:01 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_reverse): reversed string is not a substring,
	  and should not set coderange of the original string.
	  [ruby-dev:49189] [Bug #11387]

Mon Aug 17 16:24:10 2015  Tanaka Akira  <akr@fsij.org>

	* lib/time.rb (strptime): Support %s.%N.
	  [ruby-core:68301] [Bug #10904] Patch by Sadayuki Furuhashi.

Mon Aug 17 16:22:28 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* transcode.c (load_transcoder_entry): fix transcoder loading race
	  condition, by waiting in require.  [ruby-dev:49106] [Bug #11277]

Mon Aug 17 16:18:13 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (ary_ensure_room_for_push): check if array size will
	  exceed maximum size to get rid of buffer overflow.
	  [ruby-dev:49043] [Bug #11235]

	* array.c (ary_ensure_room_for_unshift, rb_ary_splice): ditto.

Mon Aug 17 16:14:38 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/win32/lib/win32/registry.rb (Win32::Registry::API): use wide
	  versions of RegDeleteValue and RegDeleteKey.
	  [ruby-core:67958] [Bug #10820]

Tue Jul  7 13:39:46 2015  SHIBATA Hiroshi  <hsbt@ruby-lang.org>

	* ext/zlib/zlib.c: Fix indentation for rdoc.
	  [Bug #11221][ruby-core:69465]

Tue Jul  7 13:37:34 2015  SHIBATA Hiroshi  <hsbt@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.gemspec: Fix require paths for released gem.
	  [fix GH-929] Patch by @voxik
	* ext/io/console/io-console.gemspec: ditto.

Fri Jul  3 21:54:46 2015  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/ruby/test_require.rb (TestRequire#test_loading_fifo_threading):
	  fix previous commit.  [Bug #11060]

Fri Jul  3 19:28:51 2015  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/ruby/test_require.rb (TestRequire#test_loading_fifo_threading):
	  ignore Errno::ENOENT on unlinking.  [Bug #11060]

Fri Jul  3 18:40:48 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (pkg_config): split --libs if --libs-only-l option
	  is not available.  patch in [ruby-core:69428] by Hans Mackowiak.
	  [ruby-core:69421] [Bug #11201]

Fri Jul  3 18:32:37 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* compile.c (iseq_compile_each): out of range NTH_REF is always
	  nil.

	* parse.y (parse_numvar): check overflow of NTH_REF and range.
	  [ruby-core:69393] [Bug #11192]

	* util.c (ruby_scan_digits): make public and add length parameter.

Fri Jul  3 17:53:43 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_eval.c (rb_method_call_status): resolve refined method entry
	  to check if undefined.  [ruby-core:69064] [Bug #11117]

Fri Jul  3 17:53:43 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_eval.c (rb_method_call_status): undefined refined method is
	  not callable unless using.  [ruby-core:69064] [Bug #11117]

Fri Jul  3 17:44:27 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_file_load_ok): try opening file without gvl not to
	  lock entire process.  [Bug #11060]

Tue Jun 30 11:56:24 2015  Eric Wong  <e@80x24.org>

	* numeric.c (bit_coerce): use original value for error message
	  [ruby-core:67405] [Bug #10711]
	* test/ruby/test_numeric.rb (test_coerce): check error message

Mon Jun 29 13:22:14 2015  Shota Fukumori  <her@sorah.jp>

	* ext/objspace/objspace_dump.c(dump_object): Return empty JSON object when
	  passed object is a special const, instead of SEGV.
	  Based patch by Kohei Suzuki (eagletmt). [ruby-core:69692] [Bug #11291]

	* test/objspace/test_objspace.rb(test_dump_special_consts): Test for above fix.


Wed Jun 17 11:39:15 2015  Koichi Sasada  <ko1@atdot.net>

	* vm_insnhelper.c (lep_svar_set): add WBs.

Tue Jun  9 16:29:49 2015  Eric Wong  <e@80x24.org>

	* ext/socket/ancdata.c: use RB_GC_GUARD instead of volatile
	  [ruby-core:69419] [Feature #11198]

Tue Jun  9 16:26:48 2015  Eric Wong  <e@80x24.org>

	* ext/openssl/ossl_asn1.c (ossl_asn1_traverse, ossl_asn1_decode,
	  ossl_asn1_decode_all): use RB_GC_GUARD instead of volatile
	  [ruby-core:69371] [Bug #11185]

Tue Jun  9 16:24:25 2015  NARUSE, Yui  <naruse@ruby-lang.org>

	* win32/win32.c (setup_overlapped): seek to the file end only when
	  writing (mode:a), not reading (mode:a+, read).

Tue Jun  9 16:15:31 2015  Aaron Patterson <tenderlove@ruby-lang.org>

	* load.c (loaded_feature_path): stop returning false negatives for
	  filenames which are trailing substrings of file extensions.  For
	  example, 'b', which a trailing substring of ".rb" should not return
	  false. [Bug #11155][ruby-core:69206]

	* test/ruby/test_autoload.rb: test for fix

Fri May 29 14:03:33 2015  Matt Hoyle  <matt@deployable.co>

	* ext/bigdecimal/bigdecimal.c (VpSetPTR): fix a typo, 'expoennt'
	  to 'exponent'.  [ruby-core:67980] [Bug #10823] [Fix GH-825]

Fri May 29 14:00:16 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/file.c (rb_file_expand_path_internal): neither the drive
	  of base directory nor the current drive are involved in the
	  result if different than the drive of path.
	  [ruby-core:68130] [Bug #10858]

Fri May 29 14:00:16 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/file.c (rb_file_expand_path_internal): do not make invalid
	  (or ADS) path if the path has a drive letter, the result also
	  should have be under it.  [ruby-core:68130] [Bug #10858]

Fri May 29 13:41:44 2015  NAKAMURA Usaku  <usa@ruby-lang.org>

	* marshal.c (r_symreal): register the symbol name first so that
	  r_symlink always returns valid names. [Bug #10991]

Thu May 28 09:51:28 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (rb_any_hash): use same hash values with Float#hash so
	  that -0.0 and +0.0 will be identical.
	  [ruby-core:68541] [Bug #10979]

Thu May 21 14:15:10 2015  Eric Wong  <e@80x24.org>

	* ext/socket/ancdata.c (bsock_recvmsg_internal): GC guard
	  [Bug #11123]

Thu May 21 14:11:50 2015  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (body_ext_mpart): should work even if body-fld-dsp
	  is omitted.  [ruby-core:69093] [Bug #11128]

Thu May 21 14:08:15 2015  SHIBATA Hiroshi  <hsbt@ruby-lang.org>

	* string.c: added documentation for character sequence \' with String#sub
	  [Bug #11132][ruby-core:69121][fix GH-900][ci skip] Patch by @shishir127

Thu May 21 14:04:06 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* range.c (linear_object_p, range_include): test if covered for
	  linear objects.  [ruby-core:69052] [Bug #11113]

Thu May 21 14:01:40 2015  SHIBATA Hiroshi  <hsbt@ruby-lang.org>

	* rational.c: Added documentation for rational literal.
	  [Bug #11075][fix GH-885][ci skip] Patch by @shishir127

Thu May 21 13:57:47 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/socket/ipsocket.c (init_inetsock_internal): preserve errno
	  before other library calls and use rb_syserr_fail.
	  [ruby-core:68531] [Bug #10975]

Thu May 21 13:32:52 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/-test-/printf/printf.c (uint_to_str): renamed to get rid of
	  conflict on cygwin.  [ruby-core:68877] [Bug #11065]

Thu May 21 13:28:03 2015  Koichi Sasada  <ko1@atdot.net>

	* vm.c (vm_exec): check other events when RETURN is thrown.
	  [Bug #10724]

	* test/ruby/test_settracefunc.rb: add a test.

Thu May 21 13:23:44 2015  Masahiro Tomita  <tommy@tmtm.org>

	* ext/socket/raddrinfo.c (addrinfo_mload): fix memory leak of
	  addrinfo.  [ruby-dev:48923] [Bug #11051]

Thu May 21 13:19:52 2015  Kenta Murata  <mrkn@cookpad.com>

	* bigdecimal: conform to ruby's license.  [ruby-core:68466] [Bug #10952]

Thu May 21 09:49:01 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (id2ref): prohibit from accessing internal objects.
	  [ruby-core:68348] [Bug #10918]

Thu May 21 09:46:58 2015  Rei Odaira  <Rei.Odaira@gmail.com>

	* ext/pty/pty.c: AIX supports autopush.
	  Patch by Perry Smith [ruby-core:58539] [Bug #9144]

Wed May 20 17:34:43 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* iseq.c (rb_iseq_compile_with_option): check source type, must be
	  an IO or a String.  [ruby-core:69219] [Bug #11159]

Wed May 13 14:32:13 2015  Tanaka Akira  <akr@fsij.org>

	* lib/resolv.rb (Resolv::DNS::Label::Str#==): Check class equality.
	  (Resolv::DNS::Name#initialize): Normalize labels as
	  Resolv::DNS::Label::Str objects.

Tue May 12 16:11:55 2015  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/tk/extconf.rb: support Tcl/Tk8.6.

	* ext/tk/tcltklib.c, ext/tk/lib/tk.rb: get rid of SEGV with Tcl/Tk8.6.
	  [Backport #10401]

Mon May 11 11:09:08 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dln.c (dln_load): check if a different libruby is loaded by the
	  extension library, and then bail out to get rid of very frequent
	  reported stale bug reports.

	* dln.c (dln_load): raise fatal error on OSX not other extension
	  libraries to refer different libruby.

Mon May 11 10:59:53 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (lambda): push and reset cmdarg_stack in lambda body.
	  [ruby-core:69017] [Bug #11107]

Tue Apr 28 14:15:49 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/fileutils.rb (FileUtils#mv): show the exact target path in
	  the error message instead of the destination parent directory
	  name.  patched by Joao Britto <jabcalves AT gmail.com> at
	  [ruby-core:68706].  [Bug #11021]

Tue Apr 28 14:14:16 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* thread_pthread.c (reserve_stack): keep sp safe zone to get rid
	  of crash by -fstack-check.  [ruby-core:68740] [Bug #11030]

Fri Apr 24 17:27:31 2015  Koichi Sasada  <ko1@atdot.net>

	* test/fiddle/test_handle.rb: fix syntax.

Tue Apr 14 16:02:07 2015  NAKAMURA Usaku  <usa@ruby-lang.org>

	* version.h (RUBY_VERSION): bump RUBY_VERSION to 2.1.7.

Mon Apr 13 22:17:59 2015  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* ext/openssl/lib/openssl/ssl.rb: stricter hostname verification
	  following RFC 6125. with the patch provided by Tony Arcieri and
	  Hiroshi Nakamura [ruby-core:61545] [Bug #9644]
	* test/openssl/test_ssl.rb: add tests for above.

Mon Apr 13 17:09:06 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (different_device_p): compare by volume serial
	  numbers, not by path names.  [ruby-core:68162] [Bug #10865]

Mon Apr 13 17:09:06 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (wrename): return EXDEV if moving a directory to
	  another drive, since MoveFileExW does not set proper error code.
	  [ruby-core:68162] [Bug #10865]

Mon Apr 13 17:02:25 2015  Scott Francis  <scott.francis@shopify.com>

	* thread_pthread.c (reserve_stack): fix intermittent SIGBUS on
	  Linux, by reserving the stack virtual address space at process
	  start up so that it will not clash with the heap space.
	  [Fix GH-822]

Mon Apr 13 16:52:14 2015  Koichi Sasada  <ko1@atdot.net>

	* class.c (rb_prepend_module): need a WB for klass -> origin.

Mon Apr 13 16:48:14 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_eval.c (vm_call_super): search next super class from the
	  original class, to get rid of infinite recursion with
	  prepending.  a patch by Seiei Higa <hanachin AT gmail.com> at
	  [ruby-core:68434].  [ruby-core:68093] [Bug #10847]

Mon Apr 13 16:39:57 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (arg): fix segfault by null caused by syntax error.
	  [ruby-core:68851] [Bug #10957]

Tue Mar 31 00:49:23 2015  Naohisa Goto  <ngotogenome@gmail.com>

	* gc.c (wmap_final_func): fix memory size shortage when realloc wmap.
	  Fix SEGV during finalize of WeakRef on Solaris (though the SEGV
	  could occur on all OS/platforms). [ruby-dev:48779] [Bug #10646]

Tue Mar 31 00:38:14 2015  Seiei Higa  <hanachin@gmail.com>

	* vm_method.c (rb_method_entry): if no super class, no original
	  method entry.  [ruby-core:67389] [Bug #10707]

Tue Mar 31 00:34:39 2015  Vit Ondruch  <vondruch@redhat.com>

	* configure.in (RUBY_SETJMP_TYPE): Remove superfluous semicolon
	  which causes a syntax error with autoconf 2.63.
	  [ruby-core:67429] [Bug #10716]

Tue Mar 31 00:32:04 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/fiddle/test_handle.rb (test_NEXT): use -test-/dln/empty
	  which is always a shared object and is not used by others.
	  [ruby-dev:48629] [Bug #10384]

Tue Mar 31 00:18:12 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (primary): empty parentheses at cmdarg can be null.
	  [ruby-core:68477] [Bug #10957]

Mon Mar 30 23:30:57 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/io/console/console.c (console_dev): id_console is not a
	  constant name, use rb_const_remove() to get rid of NameError.

Sun Mar 22 04:15:39 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/thread/thread.c (Init_thread): ConditionVariable and Queue
	  are not able to copy.  [ruby-core:59961] [Bug #9440]

Wed Mar 18 02:42:37 2015  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (w32_spawn): `v2` is used not only for `shell` but also
	  `cmd`, so must not free before using `cmd`.
	  [ruby-core:66648] [Bug #10563]

Wed Mar 18 02:40:18 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (constat_reset): do nothing on non-standard
	  console emulators.  [ruby-core:66471] [Bug #10546]

Wed Mar 18 02:03:02 2015  Kazuki Tsujimoto  <kazuki@callcc.net>

	* vm_insnhelper.c (rb_vm_rewrite_cref_stack): copy nd_refinements
	  of original crefs. It fixes segmentation fault when calling
	  refined method in duplicate module. [ruby-dev:48878] [Bug #10885]

	* vm_core.h, class.c: change accordingly.

	* test/ruby/test_refinement.rb: add a test for above.

Wed Mar 18 01:58:18 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/sdbm/_sdbm.c: include ruby/ruby.h for PRIdPTRDIFF when a
	  macro `DEBUG` is defined.  based on the patch by Owen Rodley in
	  [ruby-core:67987]. [Bug #10825]

Wed Mar 18 01:45:12 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (try_cppflags, try_cflags, try_ldflags): get rid of
	  interference by modifying global variables in have_devel? method.
	  [ruby-core:67962] [Bug #10821]

Wed Mar 18 00:58:43 2015  Shugo Maeda  <shugo@ruby-lang.org>

	* class.c (method_entry_i, class_instance_method_list,
	  rb_obj_singleton_methods): should not include methods of
	  superclasses if recur is false. [ruby-dev:48854] [Bug #10826]

Wed Mar 18 00:58:43 2015  Shugo Maeda  <shugo@ruby-lang.org>

	* vm_method.c (remove_method): When remove refined
	  method, raise a NameError if the method is not
	  defined in refined class.
	
	  But if the method is defined in refined class,
	  it should keep refined method and remove original
	  method.
	  
	  Patch by Seiei Higa. [ruby-core:67722] [Bug #10765]

Wed Mar 18 00:32:08 2015  Seiei Higa  <hanachin@gmail.com>

	* vm_method.c (check_definition): Module#public_method_defined?,
	  Module#private_method_defined?, Module#protected_method_defined?
	  should not use refinements. [ruby-core:67656] [Bug #10753]

Tue Mar 10 02:40:11 2015  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* thread.c: Improve documentation for Thread#value
	  [Bug #10694][ruby-core:67324][ci skip]

Tue Mar 10 02:37:55 2015  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* string.c: [DOC] Add missing documentation around String#chomp.
	  Patch by @stderr [ci skip][fix GH-780]

Mon Mar  9 22:30:50 2015  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* spec/default.mspec: use default configuration file name.
	  https://github.com/ruby/rubyspec/commit/cc69f337b06362e5607ffa3e3ad40ef7494960cf

Mon Mar  9 22:30:50 2015  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* spec/default.mspec: remove specific version number.
	  https://github.com/ruby/rubyspec/commit/7a909e925c1baa9c700bd44af9241aef6e596714

Mon Mar  9 22:27:47 2015  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* common.mk: use ruby organization for rubyspec.

Mon Mar  9 21:52:41 2015  NARUSE, Yui  <naruse@ruby-lang.org>

	* lib/uri/generic.rb (URI::Generic.build):
	  use hostname= to detect and wrap IPv6 hosts.
	  Build is accepting URI components and users may not expect
	  that a host component needs to be wrapped with square brackets
	  since it's not providing a URI.
	  Note: initialize with arg_check => true does not wrap IPv6 hosts.
	  by Joe Rafaniello <jrafanie@redhat.com>
	  https://github.com/ruby/ruby/pull/765 fix GH-765

	* test/uri/test_generic.rb: Add more tests

Tue Mar  3 02:42:27 2015  Eric Wong  <e@80x24.org>

	* ext/io/wait/wait.c (io_nread): wrap return value with INT2FIX
	  Thanks to Yura Sokolov <funny.falcon@gmail.com>
	  [ruby-core:68369] [Bug#10923]
	* test/io/wait/test_io_wait.rb (test_nread_buffered):
	  fix broken test

Sun Mar  1 02:30:23 2015  Seiei Higa  <hanachin@gmail.com>

	* vm_method.c (rb_alias): raise a NameError when creating alias to
	  a refined method if the original method of the refined method is
	  not defined.  [ruby-core:67523] [Bug #10731]

Sun Mar  1 01:17:24 2015  Seiei Higa  <hanachin@gmail.com>

	* vm_method.c (rb_export_method): bail out if the original method
	  is undefined when the method is refined.
	  [ruby-core:67387] [Bug #10706]

Sun Mar  1 01:14:59 2015  Eric Wong  <e@80x24.org>

	* lib/resolv.rb: consider ENETUNREACH as ResolvTimeout
	  [ruby-core:67411] [Bug #10712]

Sun Mar  1 01:01:21 2015  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* lib/net/http.rb (Net::HTTP#send_request): there is no response body
	  with HEAD request. Patch by @rodrigosaito [fix GH-520]

Sun Mar  1 01:01:21 2015  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* test/net/http/test_http.rb (_test_send_request__HEAD): Added
	  failing test for send_request with HEAD method.

Sun Mar  1 00:58:30 2015  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* ext/zlib/zlib.c: fix document of method signatures.
	  [Bug #10668][ruby-core:67186][ci skip]

Sat Feb 28 02:13:17 2015  Tanaka Akira  <akr@fsij.org>

	* lib/resolv.rb (Resolv::DNS::Name#==): Compare an array of Label:Str
	  objects.  Label#Str#== is case-insensitive.

Sat Feb 28 02:13:17 2015  Ben Miller  <bmiller@rackspace.com>

	* lib/resolv.rb (Resolv::DNS::Name#==): DNS is case-insensitive, so the
	  comparison should be case-insensitive as well.
	  [ruby-core:66498] [Bug #10550]

Sat Feb 28 02:13:17 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/resolv.rb (Resolv::DNS::Name): names with different dots
	  should be different.

Thu Feb 19 19:14:34 2015  NARUSE, Yui  <naruse@ruby-lang.org>

	* lib/net/http/response.rb (Net::HTTPResponse): require one or more
	  spaces [Bug #10591].
	  by leriksen <leif.eriksen.au@gmail.com>
	  https://github.com/ruby/ruby/pull/782 fix GH-782
	  NOTE: graph.facebook.com returns without SP Reason-Phrase.

Thu Feb 19 19:10:53 2015  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* ext/tk/lib/tkextlib/tcllib/plotchart.rb: fix to invoke correct function
	  of tcllib. Patch by @zalt50 [fix GH-787]

Wed Feb 18 00:27:57 2015  Eric Hodel  <drbrain@segment7.net>

	* lib/net/http.rb:  Do not attempt SSL session resumption when the
	  session is expired.  [Bug #10533]

Wed Feb 18 00:20:36 2015  Eric Wong  <e@80x24.org>

	* vm_eval.c (rb_yield_splat): add missing GC guard
	  [Bug #10509]

Wed Feb 18 00:18:12 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/rdoc/text.rb (expand_tabs): get rid of infinite loop with
	  CR.  should check if substitution occurred too.
	  [ruby-dev:48813] [Bug #10732]

Tue Feb 17 22:59:31 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/resolv.rb (Resolv::DNS::Resource#==, #hash): elements
	  returned by Kernel#instance_variables are Symbols now.
	  [ruby-core:68128] [Bug #10857]

Sun Feb 15 07:29:12 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/socket/getaddrinfo.c (get_addr): reject too long hostname to
	  get rid of GHOST vulnerability on very old platforms.

	* ext/socket/raddrinfo.c (make_hostent_internal): ditto, paranoic
	  check for the canonical name.

Mon Feb  2 22:57:30 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/etc/etc.c (etc_getlogin): set login name encoding properly.
	  [ruby-core:66163] [Bug #10493]

Mon Feb  2 22:47:35 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* proc.c (method_proc): the receiver of binding from method should
	  be same as the receiver of the method.
	  [ruby-core:65917] [Bug #10432]

Mon Feb  2 22:43:42 2015  Aaron Patterson <aaron@tenderlovemaking.com>

	* lib/resolv.rb: fall back if canonicalization fails.
	  Thanks Vit Ondruch for the patch!  [ruby-core:65836]

	* test/resolv/test_dns.rb: test for patch

Mon Feb  2 22:38:53 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (rb_cv_binary_elf): get rid of -e option of cat
	  which is not available on BusyBox, use tr instead.
	  [ruby-core:64824] [Bug #10210]

Thu Jan 22 20:40:36 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/openssl/ossl_cipher.c (ossl_cipher_update_long): update huge
	  data gradually not to exceed INT_MAX.  workaround of OpenSSL API
	  limitation.  [ruby-core:67043] [Bug #10633]

Thu Jan 22 01:14:12 2015  NAKAMURA Usaku  <usa@ruby-lang.org>

	* signal.c (ruby_signal): since SIGKILL is not supported by MSVCRT,
	  should be treated before calling signal(3).
	  [Bug #10615]

Thu Jan 22 01:02:16 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* thread.c (exec_recursive): use the same last method name as
	  recursive_push in the error message when recursive_pop failed.
	  [ruby-core:66742] [Bug #10579]

Thu Jan 22 01:02:16 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_frame_last_func): return the most recent frame method
	  name.

	* thread.c (recursive_list_access): use the last method name,
	  instead of the current method name which can be unset in some
	  cases, not to use a symbol by the invalid ID.
	  [ruby-core:66742] [Bug #10579]

Thu Jan 22 00:54:00 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (symbol_list): fix the node type of literal symbol list
	  with no interpolation.  [ruby-core:66343]

Thu Jan 22 00:49:52 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* object.c: [DOC] Revise documentation by Marcus Stollsteimer at
	  [ruby-core:66368].  [Bug #10526]

	  * #inspect: be more specific about generated string, remove
	    obsolete example.
	  * #nil?: use code examples instead of different call-seq's.
	  * #tap: clarify what is yielded.
	  * Integer(): be more specific about to_int and to_i, remove
	    reference to Ruby 1.8.
	  * Array(): fix error.
	  * Class: fix variable name style and indentation in example.
	  * improve consistency, fix typos and formatting.

Thu Jan 22 00:49:52 2015  Benoit Daloze  <eregontp@gmail.com>

	* object.c (Module#const_defined?): [DOC] Revise the documentation.
	  Patch by Xavier Noria.
	  [Fixes GH-754] https://github.com/ruby/ruby/pull/754

Thu Jan 22 00:49:52 2015  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* object.c: fix document of Kernel.Stirng by @suzukaze
	  [fix GH-743][ci skip]

Thu Jan 22 00:25:15 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* load.c (rb_f_load): path name needs to be transcoded to OS path
	  encoding.  [ruby-list:49994]

Wed Jan 21 04:36:27 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (NET_LUID): include winsock2.h instead of windows.h.
	  patch by Jon Forums in [ruby-core:67125].  [Bug #10640]

Wed Jan 21 04:36:27 2015  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (NET_LUID): include also ifdef.h as a workaround of
	  a bug in mingw-w64 header.  [ruby-core:67103] [Bug #10640]

Wed Jan  7 22:34:52 2015  NARUSE, Yui  <naruse@ruby-lang.org>

	* tool/config_files.rb: use config.guess in gcc repo.

Tue Jan  6 00:04:38 2015  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* test/ruby/test_io.rb: added timeout for AIX environment.
	  [ruby-core:62983][Bug #9917]

Mon Jan  5 23:58:50 2015  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* test/ruby/test_string.rb(test_LSHIFT_neary_long_max):
	  increase timeout for Arch Linux CI environment.

Wed Dec 31 00:00:09 2014  NARUSE, Yui  <naruse@ruby-lang.org>

	* lib/net/http.rb (Net::HTTP.proxy_uri): use initializer instead
	  of parser to handle IPv6 address. [Bug #9129]

Tue Dec 30 23:46:26 2014  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* lib/rubygems/*: upgrade to RubyGems 2.2.3. [Backport #10515]

Thu Nov 13 22:32:34 2014  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* lib/rexml/document.rb: add REXML::Document#document.
	  reported by Tomas Hoger <thoger@redhat.com> and patched by nahi.

Thu Nov  6 22:57:43 2014  Naohisa Goto  <ngotogenome@gmail.com>

	* bignum.c (absint_numwords_generic): set an array element after
	  definition of a variable to fix compile error with older version
	  of fcc (Fujitsu C Compiler) 5.6 on Solaris 10 on Sparc.
	  [Bug #10350] [ruby-dev:48608]

Thu Nov  6 22:36:55 2014  Naohisa Goto  <ngotogenome@gmail.com>

	* compile.c (compile_data_alloc): add padding when strict alignment
	  is required for memory access. Currently, the padding is enabled
	  only when the CPU is 32-bit SPARC and the compiler is GCC.
	  [Bug #9681] [ruby-core:61715]

	* compile.c (STRICT_ALIGNMENT): defined if strict alignment is required

	* compile.c (ALIGNMENT_SIZE, ALIGNMENT_SIZE_MASK, PADDING_SIZE_MAX):
	  new macros for alignemnt word size, bit mask, max size of padding.

	* compile.c (calc_padding): new function to calculate padding size.

Wed Nov  5 00:18:22 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (__builtin_setjmp): disable with gcc/clang earlier
	  than 4.3 on Mac OS X.  [ruby-core:65174] [Bug #10272]

Wed Nov  5 00:01:04 2014  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_mul_balance_with_mulfunc): Fix free work area
	  location.
	  [ruby-dev:48723] [Bug #10464]
	  [ruby-core:66044] [Bug #10465]
	  Reported by Kohji Nishihama.

Tue Oct 28 22:30:21 2014  NARUSE, Yui  <naruse@ruby-lang.org>

	* configure.in: remove apple-gcc4.2 from CC candidates.

Tue Oct 28 22:19:44 2014  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* version.h (RUBY_VERSION): bump RUBY_VERSION to 2.1.5.

Mon Oct 27 20:20:14 2014  NAKAMURA Usaku  <usa@ruby-lang.org>

	* lib/rexml/entity.rb: keep the entity size within the limitation.
	  reported by Willis Vandevanter <will@silentrobots.com> and
	  patched by nahi.

Sun Oct 26 03:31:46 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_method.c (rb_method_entry_make): warn redefinition only for
	  already defined methods, but not for undefined methods.
	  [ruby-dev:48691] [Bug #10421]

Sun Oct 26 03:21:30 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* class.c (unknown_keyword_error): delete expected keywords
	  directly from raw table, so that the given block is not called.
	  [ruby-core:65837] [Bug #10413]

Wed Oct 22 23:02:49 2014  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* ext/openssl/lib/openssl/ssl.rb (DEFAULT_PARAMS): override
	  options even if OpenSSL::SSL::OP_NO_SSLv3 is not defined.
	  this is pointed out by Stephen Touset. [ruby-core:65711] [Bug #9424]

Wed Oct 22 23:02:49 2014  Martin Bosslet  <Martin.Bosslet@gmail.com>

	* test/openssl/test_ssl.rb: Reuse TLS default options from
	  OpenSSL::SSL::SSLContext::DEFAULT_PARAMS.

Wed Oct 22 23:02:49 2014  Martin Bosslet  <Martin.Bosslet@gmail.com>

	* lib/openssl/ssl.rb: Explicitly whitelist the default
	  SSL/TLS ciphers. Forbid SSLv2 and SSLv3, disable
	  compression by default.
	  Reported by Jeff Hodges.
	  [ruby-core:59829] [Bug #9424]

Sun Oct 19 03:22:53 2014  Kazuki Tsujimoto  <kazuki@callcc.net>

	* vm_core.h, vm.c, proc.c: fix GC mark miss on bindings.
	  [ruby-dev:48616] [Bug #10368]

	* test/ruby/test_eval.rb: add a test code.

Sun Oct 19 03:13:38 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (parser_here_document): do not append already appended
	  and disposed code fragment.  [ruby-dev:48647] [Bug #10392]

Thu Oct 16 22:10:11 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c (strio_write): ASCII-8BIT StringIO
	  should be writable any encoding strings, without conversion.
	  [ruby-core:65240] [Bug #10285]

Thu Oct 16 22:06:03 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_eval.c (eval_string_with_cref): fix super from eval with
	  scope.  set klass in the current control frame to the class of
	  the receiver in the context to be evaluated, this class/module
	  must match the actual receiver to call super.
	  [ruby-core:65122] [Bug #10263]

Thu Oct 16 00:30:30 2014  Tanaka Akira  <akr@fsij.org>

	* lib/find.rb (Find.find): Call to_path for arguments to obtain
	  strings.
	  [ruby-core:63713] [Bug #10035] Reported by Herwin.

Thu Oct 16 00:20:12 2014  Eric Wong  <e@80x24.org>

	* object.c (rb_class_real): do not dereference 0 VALUE

	* test/ruby/test_module.rb (test_inspect_segfault):
	  Test case and bug report by Thomas Stratmann.
	  [ruby-core:65214] [Bug #10282]

Thu Oct 16 00:10:45 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* signal.c (rb_f_kill): get rid of deadlock as unhandled and
	  discarded signals do not make interrupt_cond signaled.
	  based on the patch by Kazuki Tsujimoto at [ruby-dev:48606].
	  [Bug #9820]

Thu Oct 16 00:10:45 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* signal.c (rb_f_kill): should not ignore signal unless the
	  default handler is registered.  [ruby-dev:48592] [Bug #9820]

Wed Oct 15 23:58:13 2014  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	merge r47598 partially. extracted commits are as follows. [Bug #9728]
	https://github.com/k-takata/Onigmo/commit/15ddec6d18e27fdc1988236764e766fd5892ecf5

Wed Oct 15 23:50:33 2014  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* lib/fileutils.rb: handle ENOENT error with symlink targeted to
	  non-exists file. [ruby-dev:45933] [Bug #6716]

Wed Oct 15 23:25:24 2014  NARUSE, Yui  <naruse@ruby-lang.org>

	* configure.in: NetBSD's ksh, used by configure, needs escapes.

Wed Oct 15 23:13:43 2014  Eric Wong  <e@80x24.org>

	* array.c (ary_recycle_hash): add RB_GC_GUARD
	  (rb_ary_diff): remove volatile
	  [Bug #10369]

Wed Oct 15 23:10:07 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (dir_s_aref): fix rdoc.  `Dir.glob` allows an array but
	  `Dir[]` not.  the former accepts an optional parameter `flags`,
	  while the latter accepts arbitrary number of arguments but no
	  `flags`.  [ruby-core:65265] [Bug #10294]

Wed Oct 15 23:08:02 2014  Rei Odaira  <Rei.Odaira@gmail.com>

	* configure.in: Fix typo. [Bug #9914]

Wed Oct 15 22:46:52 2014  NAKAMURA Usaku  <usa@ruby-lang.org>

	* error.c: update exception tree. [DOC]
	  reported by @hemge via twitter.

Wed Sep 24 02:30:55 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (parse_ident): just after a label, new expression should
	  start, cannot be a modifier.  [ruby-core:65211] [Bug #10279]

Wed Sep 24 02:21:41 2014  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/Makefile.sub (VCSUP): nothing to do if this worktree is not
	  under any VCS (it means that the worktree may be from the release
	  package).

Wed Sep 24 02:06:33 2014  Tanaka Akira  <akr@fsij.org>

	* test/ruby/test_time_tz.rb: Fix test error with tzdata-2014g.
	  [ruby-core:65058] [Bug #10245] Reported by Vit Ondruch.

Wed Sep 24 02:06:33 2014  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* test/minitest/test_minitest_unit.rb: removed obsoleted condition
	  for Ruby 1.8.
	* test/ruby/test_time_tz.rb: ditto.

Wed Sep 24 01:43:13 2014  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* version.h (RUBY_VERSION): bump RUBY_VERSION to 2.1.4.

Fri Sep 19 00:58:34 2014  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* version.h (RUBY_VERSION): bump RUBY_VERSION to 2.1.3.

Mon Sep 15 23:12:47 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* signal.c (check_stack_overflow): drop the last tag too close to
	  the fault page, to get rid of stack overflow deadlock.
	  [Bug #9971]

Mon Sep 15 22:34:39 2014  Natalie Weizenbaum  <nweiz@google.com>

	* ext/pathname/lib/pathname.rb (SAME_PATHS):
	  Pathname#relative_path_from uses String#casecmp to compare strings
	  on case-insensitive filesystem platforms (e.g., Windows). This can
	  return nil for strings with different encodings, and the code
	  previously assumed that it always returned a Fixnum.  [Fix GH-713]

Mon Sep 15 22:31:33 2014  Sho Hashimoto  <sho.hsmt@gmail.com>

	* ext/fiddle/lib/fiddle/import.rb (Fiddle::Importer#sizeof): fix typo,
	  SIZEOF_LONG_LON.  [Fix GH-714]

Mon Sep 15 11:08:23 2014  Shota Fukumori  <her@sorah.jp>

	* lib/mkmf.rb (configuration): Make CXXFLAGS customizable.
	  Patch by Kohei Suzuki (eagletmt). [Fixes GH-492]

Mon Sep 15 01:06:35 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (MakeMakefile#pkg_config): append --cflags to also
	  $CXXFLAGS, as they are often used by C++ compiler.
	  [ruby-core:54532] [Bug #8315]

Mon Sep 15 00:02:20 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/csv.rb (CSV#<<): honor explicitly given encoding.  based on
	  the patch by DAISUKE TANIWAKI <daisuketaniwaki AT gmail.com> at
	  [ruby-core:62113].  [Bug #9766]

Wed Sep 10 23:36:38 2014  Koichi Sasada  <ko1@atdot.net>

	* test/ruby/test_object.rb: extend timeout.

Wed Sep 10 23:36:38 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* object.c (rb_obj_copy_ivar): allocate no memory for empty
	  instance variables.  [ruby-core:64700] [Bug #10191]

Wed Sep 10 23:36:38 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* object.c (rb_obj_copy_ivar): extract function to copy instance
	  variables only for T_OBJECT from init_copy.

Wed Sep 10 23:14:42 2014  NARUSE, Yui  <naruse@ruby-lang.org>

	merge r46831 partially. extracted commits are as follows. [Bug #9344]
	https://github.com/k-takata/Onigmo/commit/bdfc1997aa15b6baddaf9a482c6610b32504bd86

	* regcomp.c: Merge Onigmo 5.14.1 25a8a69fc05ae3b56a09.
	  this includes Support for Unicode 7.0 [Bug #9092].

Wed Sep 10 22:58:25 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (Doxyfile): revert r43888, not to require preinstalled
	  ruby.  [ruby-core:64488] [Bug #10161]

Wed Sep 10 03:29:48 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (io_close): ignore only "closed stream" IOError and
	  NoMethodError, do not swallow other exceptions at the end of
	  block.  [ruby-core:64463] [Bug #10153]

Wed Sep 10 03:17:13 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enc/trans/euckr-tbl.rb (EUCKR_TO_UCS_TBL): add missing euro and
	  registered signs.  [ruby-core:64452] [Bug #10149]

Wed Sep 10 03:01:31 2014  Eric Wong  <e@80x24.org>

	* time.c (time_timespec): fix tv_nsec overflow
	  [Bug #10144]

Wed Sep 10 02:51:38 2014  Koichi Sasada  <ko1@atdot.net>

	* iseq.c (rb_iseq_clone): Should not insert write barrier from
	  non-RVALUE data (to non-RVALUE data, of course).

	  Ruby 2.1 also has a same problem.

Wed Sep 10 02:33:08 2014  Koichi Sasada  <ko1@atdot.net>

	* parse.y (setup_fake_str): fake strings should not set class by
	  RBASIC_SET_CLASS() because it insert write barriers to fake
	  (non-RVALUE) structure.

	  It can cause unexpected behaviour.

Fri Sep  5 17:01:38 2014  Zachary Scott  <e@zzak.io>

	* lib/rdoc/generator/template/darkfish/js/jquery.js: Backport
	  rdoc/rdoc@74f60fcb04fee1778fe2694d1a0ea6513f8e67b7

Sat Sep  6 00:57:07 2014  Eric Wong  <e@80x24.org>

	* ext/zlib/zlib.c (gzfile_reset): preserve ZSTREAM_FLAG_GZFILE
	  [Bug #10101]

	* test/zlib/test_zlib.rb (test_rewind): test each_byte

Sat Sep  6 00:47:32 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (rb_cv_broken_backtrace): exit with failure
	  normally, no needs to abort.  [ruby-core:63678] [Bug #10008]

Sat Sep  6 00:05:02 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/win32.h, win32/win32.c (rb_w32_inet_pton): add a
	  wrapper function for inet_pton minimum supported client is
	  Vista, as well as inet_ntop.

Sat Sep  6 00:05:02 2014  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* ext/socket/raddrinfo.c (rb_getaddrinfo): second argument of
	  MEMZERO is type.  Coverity Scan found this bug.

Sat Sep  6 00:05:02 2014  Tanaka Akira  <akr@fsij.org>

	* ext/socket/raddrinfo.c (numeric_getaddrinfo): Use xcalloc.
	  Suggested by Eric Wong.
	  https://bugs.ruby-lang.org/issues/9525#note-14

Sat Sep  6 00:05:02 2014  Tanaka Akira  <akr@fsij.org>

	* ext/socket: Bypass getaddrinfo() if node and serv are numeric.
	  Reporeted by Naotoshi Seo.  [ruby-core:60801] [Bug #9525]

	* ext/socket/extconf.rb: Detect struct sockaddr_in6.sin6_len.

	* ext/socket/sockport.h (SET_SIN6_LEN): New macro.
	  (INIT_SOCKADDR_IN6): Ditto.

	* ext/socket/rubysocket.h (struct rb_addrinfo): Add
	  allocated_by_malloc field.

	* ext/socket/raddrinfo.c (numeric_getaddrinfo): New function.
	  (rb_getaddrinfo): Call numeric_getaddrinfo at first.
	  (rb_freeaddrinfo): Free struct addrinfo properly when it is
	  allocated by numeric_getaddrinfo.

Sat Sep  6 00:05:02 2014  Tanaka Akira  <akr@fsij.org>

	* ext/socket: Wrap struct addrinfo by struct rb_addrinfo.

Thu Sep  4 00:31:23 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/thread/thread.c (get_array): check instance variables are
	  initialized properly.  [ruby-core:63826][Bug #10062]

Thu Sep  4 00:29:10 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_initialize): [DOC] fix rdoc of append mode.  it does
	  not move the pointer at open.  [ruby-core:63747] [Bug #10039]

Thu Sep  4 00:23:15 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* sprintf.c (GETASTER): should not use the numbered argument to be
	  formatted, raise ArgumentError instead.
	  [ruby-dev:48330] [Bug #9982]

Thu Sep  4 00:21:05 2014  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* test/openssl/test_pkey_rsa.rb (OpenSSL#test_sign_verify_memory_leak):
	  added timeout into testcase for low performance environment.
	  [Bug #9984][ruby-core:63367]

Tue Sep  2 02:21:58 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (env_aset, env_has_key, env_assoc, env_has_value),
	  (env_rassoc, env_key): prohibit tainted strings if $SAFE is
	  non-zero.  [Bug #9976]

Tue Sep  2 02:08:12 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* signal.c (rb_f_kill): directly enqueue an ignored signal to self,
	  except for SIGSEGV and SIGBUS.  [ruby-dev:48203] [Bug #9820]

Sun Aug 31 01:13:21 2014  Koichi Sasada  <ko1@atdot.net>

	* gc.c: change full GC timing to keep lower memory usage.

	  Extend heap only at
	  (1) after major GC
	  or
	  (2) after several (two times, at current) minor GC

	  Details in https://bugs.ruby-lang.org/issues/9607#note-9
	  [Bug #9607]

Sun Aug 31 01:07:05 2014  Masaki Suketa <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c (ole_create_dcom): use the converted
	  result if the argument can be converted to a string, to get rid
	  of invalid access. Thanks to nobu. [ruby-dev:48467] [Bug #10127]

Sun Aug 31 00:54:47 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* process.c (open): use UTF-8 version function to support
	  non-ascii path properly.  [ruby-core:63185] [Bug #9946]

Tue Aug 26 00:08:40 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (RUBY_SETJMP_TYPE): check for setjmp type after
	  CCDLFLAGS is appended to CFLAGS, since __builtin_setjmp can be
	  affected.  [ruby-core:62469] [Bug #9818]

Tue Aug 26 00:07:20 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: get rid of __builtin_setjmp/__builtin_longjmp on
	  x64-mingw, which causes SEGV with callcc.
	  [ruby-core:61887] [Bug #9710]

Tue Aug 26 00:06:05 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (ac_cv_func___builtin_setjmp): should not skip
	  flags restoration in RUBY_WERROR_FLAG by `break`.
	  [ruby-dev:48086] [Bug #9698]

Tue Aug 26 00:02:51 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (ac_cv_func___builtin_setjmp): __builtin_longjmp()
	  in Apple LLVM 5.1 (LLVM 3.4svn) uses `void**`, not `jmp_buf`.
	  [Bug #9692]

Tue Aug 26 00:02:51 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (ac_cv_func___builtin_setjmp): gcc 4.9 disallows a
	  variable as the second argument of __builtin_longjmp().
	  [ruby-core:61800] [Bug #9692]

Mon Aug 25 00:36:56 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (parser_yylex): fix invalid char in eval, should raise
	  an syntax error too, as well as directly coded.
	  [ruby-core:64243] [Bug #10117]

Mon Aug 25 00:26:12 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (parser_yyerror): preserve source code encoding in
	  syntax error messages.  [ruby-core:64228] [Bug #10114]

Sat Aug 23 02:39:20 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_insnhelper.c (vm_call_method): unusable super class should cause
	  method missing when BasicObject is refined but not been using.
	  [ruby-core:64166] [Bug #10106]

Sat Aug 23 02:22:02 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_count): fix wrong single-byte optimization.
	  7bit ascii can be a trailing byte in Shift_JIS.
	  [ruby-dev:48442] [Bug #10078]

Thu Aug 21 01:44:46 2014  Tanaka Akira  <akr@fsij.org>

	* gc.c (mark_current_machine_context): Call SET_STACK_END.
	  This reverts a hunk of r40703 by ko1.
	  This fixes [ruby-dev:48098] [Bug #9717].

Thu Aug 21 01:41:09 2014  Tanaka Akira  <akr@fsij.org>

	* lib/time.rb (Time.parse): [DOC] Fix an example in the documentation
	  to use EST.
	  Reported by Marcus Stollsteimer.
	  [ruby-core:60778] [Bug #9521] and [ruby-core:61718] [Bug #9682]

Thu Aug 21 01:41:09 2014  Zachary Scott  <e@zzak.io>

	* lib/time.rb: [DOC] Fix timezone in example of Time.parse [Bug #9521]
	  Based on patch by @stomar

Tue Aug 19 23:31:48 2014  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	merge r46831 partially. extracted commits are as follows.
	https://github.com/k-takata/Onigmo/commit/b9fba1dc63ccb42a86e934011b468e6022fabb74
	https://github.com/k-takata/Onigmo/commit/c1fc76b9bd463948ffc5058bc352bf93732f0314
	https://github.com/k-takata/Onigmo/commit/a0efc0a200f7108ca3d5ac3039c8f952e0051619
	https://github.com/k-takata/Onigmo/commit/c7cda4ed5676167b0d01bb5555724f6164fbdb13
	[Bug #8716]

	* include/ruby/oniguruma.h (ONIG_MAX_CAPTURE_GROUP_NUM,
	  ONIGERR_TOO_MANY_CAPTURE_GROUPS): add cheking the number of capture
	  groups.

	* regerror.c (onig_error_code_to_format): ditto.

	* regparse.c (scan_env_add_mem_entry): ditto.

	* regexec.c (onig_region_copy, match_at): fix: segmation fault occurs
	  when many groups are used.

Mon Aug 18 23:38:21 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* encoding.c (enc_find): [DOC] never accepted a symbol.
	  [ruby-dev:48308] [Bug #9966]

Mon Aug 18 23:22:03 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_resize): update capa only when buffer get
	  reallocated.
	  http://d.hatena.ne.jp/nagachika/20140613/ruby_trunk_changes_46413_46420#r46413

Mon Aug 18 23:22:03 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_resize): should consider the capacity instead
	  of the old length, as pointed out by nagachika.

Mon Aug 18 23:22:03 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (expand_path): shrink expanded path which no longer needs
	  rooms to append.  [ruby-core:63114] [Bug #9934]

Mon Aug 11 23:55:32 2014  Mark Lorenz  <mlorenz@covermymeds.com>

	* lib/erb.rb (result): [DOC] no longer accepts a Proc, as
	  Kernel.eval does not.  [fix GH-619]

Mon Aug 11 23:38:20 2014  Tanaka Akira  <akr@fsij.org>

	* io.c (rb_io_autoclose_p): Don't raise on frozen IO.

Mon Aug 11 23:38:20 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_fileno, rb_io_inspect): non-modification does not
	  error on frozen IO.  [ruby-dev:48241] [Bug #9865]

Mon Aug 11 22:34:47 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (posix_fadvise): disable use of posix_fadvise
	  itself on 32-bit AIX.  [ruby-core:62968] [Bug #9914]

Mon Aug 11 22:34:47 2014    <kanemoto@ruby-lang.org>

	* io.c (rb_io_advise): AIX currently does not support a 32-bit call to
	  posix_fadvise() if _LARGE_FILES is defined. Patch by Rei Odaira.
	  [ruby-core:62968] [Bug #9914]

Mon Aug 11 22:14:28 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_insnhelper.c (vm_callee_setup_keyword_arg): adjust VM stack
	  pointer to get rid of overwriting splat arguments by arguments
	  for `to_hash` conversion.  [ruby-core:63593] [Bug #10016]

Fri Aug  8 23:36:01 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c (strio_write): use rb_str_append to
	  reuse coderange bits other than ASCII-8BIT, and keep
	  taintedness.  [ruby-dev:48118] [Bug #9769]

Mon Aug  4 01:29:57 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (env_shift): fix memory leak on Windows, free environment
	  strings block always.  [ruby-dev:48332] [Bug #9983]

Mon Aug  4 01:26:46 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (env_select): fix memory leak and crash on Windows, make
	  keys array first instead of iterating on environ directly.
	  [ruby-dev:48325] [Bug #9978]

Mon Aug  4 01:24:09 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (ruby_setenv): fix memory leak on Windows, free
	  environment strings block after check for the size.
	  [ruby-dev:48323] [Bug #9977]

Mon Aug  4 01:11:07 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* re.c (match_aref, rb_reg_regsub): consider encoding of captured
	  names, encoding-incompatible should not match.
	  [ruby-dev:48278] [Bug #9903]

Mon Aug  4 00:52:42 2014  Koichi Sasada  <ko1@atdot.net>

	* vm_eval.c (rb_catch_protect): fix same problem of [Bug #9961].

	* vm_eval.c (rb_iterate): ditto.

Mon Aug  4 00:52:42 2014  Koichi Sasada  <ko1@atdot.net>

	* vm.c (rb_vm_rewind_cfp): add new function to rewind specified cfp
	  with invoking RUBY_EVENT_C_RETURN.
	  [Bug #9961]

	* vm_core.h: ditto.

	* eval.c (rb_protect): use it.

	* eval.c (rb_rescue2): ditto.

	* vm_eval.c (rb_iterate): ditto.

	* test/ruby/test_settracefunc.rb: add a test.

	* vm_core.h (rb_vm_rewind_cfp): add the prototype declaration.

Sun Aug  3 00:06:10 2014  Charlie Somerville  <charliesome@ruby-lang.org>

	* node.c (dump_node): handle nd_value == (NODE *)-1 to mean this
	  keyword argument is required

Thu Jul 31 01:56:11 2014  Koichi Sasada  <ko1@atdot.net>

	* compile.c (rb_iseq_compile_node): put start label of block after
	  trace (b_call).
	  [Bug #9964]

	* test/ruby/test_settracefunc.rb: add a test.

	  added assert_consistent_call_return() method check call/return
	  consistency.

Thu Jul 31 01:22:43 2014  Koichi Sasada  <ko1@atdot.net>

	* vm.c (invoke_block_from_c): move call/return event timing for
	  bmethod. It can invoke inconsistent call event if this call raises
	  argument error.
	  [Bug #9959]

	* vm_insnhelper.c (vm_call_bmethod_body): ditto.

	* test/ruby/test_settracefunc.rb: add a test.

Thu Jul 31 01:12:55 2014  Koichi Sasada  <ko1@atdot.net>

	* vm_core.h: add VM_FRAME_MAGIC_RESCUE to recognize normal block or
	  rescue clause.

	* vm.c (vm_exec): use VM_FRAME_MAGIC_RESCUE on at rescue/ensure.

	* test/ruby/test_settracefunc.rb: should not invoke b_return at rescue
	  clause.
	  [Bug #9957]

	* vm_dump.c (control_frame_dump): check VM_FRAME_MAGIC_RESCUE.

	* vm_dump.c (vm_stack_dump_each): ditto.

Thu Jul 31 00:44:34 2014  Koichi Sasada  <ko1@atdot.net>

	* vm_trace.c: clear and restore recursive checking thread local data
	  to avoid unexpected throw from TracePoint.
	  [Bug #9940]

	* test/ruby/test_settracefunc.rb: add a test.

	* thread.c: added
	  * rb_threadptr_reset_recursive_data(rb_thread_t *th);
	  * rb_threadptr_restore_recursive_data(rb_thread_t *th, VALUE old);

	* vm_core.h: ditto.

Wed Jul 23 23:49:59 2014  Hiroshi Shirosaki  <h.shirosaki@gmail.com>

	* lib/test/unit/parallel.rb: fix test-all parallel failure if a test
	  is skipped after raise.
	  DL::TestFunc#test_sinf is skipped after raise on mingw ruby.
	  But it causes Marshal.load failure due to undefined class/module
	  DL::DLError when doing test-all parallel and test-all doesn't
	  complete. We create new MiniTest::Skip object to avoid Marshal.load
	  failure.
	  [ruby-core:62133] [Bug #9767]

	* test/testunit/test_parallel.rb (TestParallel): add a test.

	* test/testunit/tests_for_parallel/ptest_forth.rb: ditto.

Wed Jul 23 23:11:28 2014  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* test/socket/test_socket.rb: unix socket is required by test case.

Wed Jul 23 23:11:28 2014  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* test/socket/test_addrinfo.rb: remove unused variables.
	* test/socket/test_nonblock.rb: ditto.
	* test/socket/test_socket.rb: ditto.
	* test/socket/test_unix.rb: ditto.
	* test/testunit/test_parallel.rb: ditto.
	* test/webrick/test_filehandler.rb: ditto.
	* test/xmlrpc/test_features.rb: ditto.
	* test/zlib/test_zlib.rb: ditto.

Wed Jul 23 23:05:19 2014  Tanaka Akira  <akr@fsij.org>

	* ext/pathname/lib/pathname.rb (cleanpath_aggressive): make all
	  separators File::SEPARATOR from File::ALT_SEPARATOR.
	  Reported by Daniel Rikowski.
	  Fixed by Nobuyoshi Nakada.  [Bug #9618]

	* ext/pathname/lib/pathname.rb (cleanpath_conservative): ditto.

Wed Jul 23 22:51:34 2014  Naohisa Goto  <ngotogenome@gmail.com>

	* lib/fileutils.rb (rmdir): rescue Errno::EEXIST in addition to
	  ENOTEMPTY (and ENOENT), because SUSv3 describes that "If the
	  directory is not an empty directory, rmdir() shall fail and set
	  errno to [EEXIST] or [ENOTEMPTY]" and Solaris uses EEXIST.
	  [Bug #9571] [ruby-dev:48017]

Wed Jul 23 22:43:50 2014  Tanaka Akira  <akr@fsij.org>

	* lib/resolv.rb (bind_random_port): Rescue EPERM for FreeBSD which
	  security.mac.portacl.port_high is changed.
	  See mac_portacl(4) for details.
	  Reported by Jakub Szafranski.  [ruby-core:60917] [Bug #9544]

Wed Jul 23 22:24:26 2014  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* test/openssl/test_x509cert.rb: split assertions into algorithms.
	  CentOS 7 seems finish MD5 support
	  http://chkbuild005.hsbt.org/chkbuild/ruby-trunk/log/20140722T140010Z.fail.html.gz

	* test/openssl/test_x509req.rb: ditto.

Sat Jul 19 01:44:34 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* re.c (match_aref): should not ignore name after NUL byte.
	  [ruby-dev:48275] [Bug #9902]

Sun Jul 13 23:28:41 2014  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* test/test_timeout.rb (test_timeout): inverted test condition.
	  [Bug #8523]

Sun Jul 13 23:18:11 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/digest/digest.c (rb_digest_instance_equal): no need to call
	  `to_s` twice.  [Bug #9913]

Sun Jul 13 23:18:11 2014  Benoit Daloze  <eregontp@gmail.com>

	* ext/digest/digest.c (rb_digest_instance_equal):
	  fix #== for non-string arguments. [ruby-core:62967] [Bug #9913]

	* test/digest/test_digest.rb: add test for above.

Sun Jul 13 23:10:03 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (yield_indexed_values): extract from permute0(),
	  rpermute0(), and rcombinate0().

Sun Jul 13 23:02:36 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (rb_ary_permutation): `p` is the array of size `r`, as
	  commented at permute0().  since `n >= r` here, buffer overflow
	  never happened, just reduce unnecessary allocation though.

Sun Jul 13 22:52:43 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* pack.c (encodes): fix buffer overrun by tail_lf.  Thanks to
	  Mamoru Tasaka and Tomas Hoger.  [ruby-core:63604] [Bug #10019]

Sun Jul 13 22:44:05 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/thread/thread.c (undumpable): ConditionVariable and Queue
	  are not dumpable.  [ruby-core:61677] [Bug #9674]

Fri Jul 11 23:07:09 2014  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* lib/matrix.rb: Fix sign for cross_product [#9499]

Sun Jul  6 23:16:30 2014  Masaya Tarui  <tarui@ruby-lang.org>

	* st.c (st_foreach_check): change start point of search at check
	  from top to current. [ruby-dev:48047] [Bug #9646]

Sun Jul  6 22:56:03 2014  Zachary Scott  <e@zzak.io>

	* lib/gserver.rb: [DOC] Fixed typo in example by @stomar [Bug #9543]

Fri Jul  4 00:46:03 2014  Zachary Scott  <e@zzak.io>

	* enumerator.c: [DOC] Fix example to show Enumerator#peek behavior
	  Patch by Erik Hollembeak [Bug #9814]

Fri Jul  4 00:44:43 2014  Zachary Scott  <e@zzak.io>

	* enum.c: [DOC] Use #find in example to clarify alias by @rachellogie
	  Patch submitted via documenting-ruby/ruby#34

Fri Jul  4 00:42:57 2014  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* man/ruby.1: remove deadlink. [ruby-core:62145][Bug #9773]

Fri Jul  4 00:25:16 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* struct.c (not_a_member): extract name error and use same error
	  messages.  based on the patch by Marcus Stollsteimer <sto.mar AT
	  web.de> at [ruby-core:61721].  [Bug #9684]

Thu Jul  3 01:19:50 2014  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* numeric.c (num_step_scan_args): table argument of rb_get_kwargs() is
	  array of IDs, not Symbols. [ruby-dev:48353] [Bug #9811]

Thu Jul  3 01:19:50 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* numeric.c (num_step_scan_args): check keyword arguments and fail
	  if they conflict with positional arguments.
	  [ruby-dev:48177] [Bug #9811]

Tue Jul  1 03:05:22 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (read_all): truncate the buffer before appending read data,
	  instead of truncating before reading.
	  [ruby-core:55951] [Bug #8625]

Tue Jul  1 03:05:22 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (io_setstrbuf, io_read): should not shorten the given buffer until
	  read succeeds.  [ruby-core:55951] [Bug #8625]

Mon Jun 30 03:15:59 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm.c (core_hash_merge_kwd): should return the result hash, which
	  may be converted from and differ from the given argument.
	  [ruby-core:62921] [Bug #9898]

Mon Jun 30 03:07:22 2014  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/ftp.rb (gets, readline): read lines without LF properly.
	  [ruby-core:63205] [Bug #9949]

	* test/net/ftp/test_buffered_socket.rb: related test.

Mon Jun 30 02:59:08 2014  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (body_type_1part): Gmail IMAP reports a body
	  type as "MIXED" followed immediately by params
	  [ruby-core:62864] [Bug #9885]
	  Patch by @rayners (David Raynes). [Fixes GH-622] 
	  https://github.com/ruby/ruby/pull/622

Mon Jun 30 02:46:44 2014  Rei Odaira  <Rei.Odaira@gmail.com>

	* signal.c (ruby_signal): should return either `old.sa_sigaction`
	  or `old.sa_handler`, depending on whether `SA_SIGINFO` is set in
	  `old.sa_flags`, because they may not be a union.
	  [ruby-core:62836] [Bug #9878]

Mon Jun 30 02:36:08 2014  Eric Wong  <e@80x24.org>

	* process.c (proc_getgroups, proc_setgroups): use ALLOCV_N
	  [Bug #9856]

Mon Jun 30 02:28:10 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (io_setstrbuf): always check if the buffer is modifiable.
	  [ruby-core:62643] [Bug #9847]

Mon Jun 30 02:25:00 2014  Tanaka Akira  <akr@fsij.org>

	* ext/openssl/lib/openssl/ssl.rb (OpenSSL::SSL::SSLServer#accept):
	  Consider Socket#accept as well as TCPServer#accept.
	  Reported by Sam Stelfox.  [ruby-core:62064] [Bug #9750]

Mon Jun 30 02:18:47 2014  Eric Wong  <e@80x24.org>

	* complex.c (parse_comp): replace ALLOCA_N with ALLOCV_N/ALLOCV_END
	  [Bug #9608]
	* rational.c (read_digits): ditto

Mon Jun 30 02:10:34 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vsnprintf.c (BSD_vfprintf): fix string width when precision is
	  given.  as the result of `memchr` is NULL or its offset from the
	  start cannot exceed the size, the comparison was always false.
	  [ruby-core:62737] [Bug #9861]

Mon Jun 30 01:46:19 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/fiddle/extconf.rb: supply 0 to fill RUBY_LIBFFI_MODVERSION
	  with 3-digit.  libffi 3.1 returns just 2-digit.
	  [ruby-core:62920] [Bug #9897]

Mon Jun 30 00:57:05 2014  Koichi Sasada  <ko1@atdot.net>

	* vm.c (rb_vm_pop_cfunc_frame): added.  It cares c_return event.
	  The patch base by drkaes (Stefan Kaes).
	  [Bug #9321]

	* variable.c (rb_mod_const_missing): use rb_vm_pop_cfunc_frame()
	  instead of rb_frame_pop().

	* vm_eval.c (raise_method_missing): ditto.

	* vm_eval.c (rb_iterate): ditto.

	* internal.h (rb_vm_pop_cfunc_frame): add decl.

	* test/ruby/test_settracefunc.rb: add tests.
	  provided by drkaes (Stefan Kaes).

	* vm.c, eval.c, include/ruby/intern.h (rb_frame_pop):
	  move definition of rb_frame_pop() and deprecate it.
	  It doesn't care about `return' events.

Sun Jun 29 01:34:06 2014  Tanaka Akira  <akr@fsij.org>

	* lib/webrick/utils.rb (create_listeners): Close socket objects.

Sat Jun 28 16:35:51 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_substr): need to reset code range for shared
	  string too, not only copied string.
	  [ruby-core:62842] [Bug #9882]

Sat Jun 28 14:37:17 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (local_tbl_gen): remove local variables duplicated with
	  arguments.
	  [ruby-core:60501] [Bug #9486]

Tue Jun 24 00:21:58 2014  Koichi Sasada  <ko1@atdot.net>

	* eval.c (rb_using_refinement): add write-barriers for
	  cref->nd_refinements.

Tue Jun 24 00:14:20 2014  Tanaka Akira  <akr@fsij.org>

	* lib/net/ftp.rb (transfercmd): Close TCP server socket even if an
	  exception occur.

Tue Jun 24 00:06:41 2014  Hiroshi Shirosaki  <h.shirosaki@gmail.com>

	* thread_win32.c (rb_w32_stack_overflow_handler): use Structured
	  Exception Handling by AddVectoredExceptionHandler() for machine
	  stack overflow on mingw.
	  This would be equivalent to the handling using __try and __except
	  on mswin introduced by r43748.

Mon Jun 23 23:56:54 2014  Eric Wong  <e@80x24.org>

	* signal.c (signal_exec): ignore immediate cmd for SIG_IGN
	* signal.c (trap_handler): set cmd to true for SIG_IGN
	* signal.c (trap): handle nil and true values for oldcmd
	  [Bug #9835]

Mon Jun 23 02:46:14 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* class.c (rb_mod_init_copy): always clear instance variable,
	  constant and method tables first, regardless the source tables.
	  [ruby-dev:48182] [Bug #9813]

Mon Jun 23 02:36:04 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* thread.c (thread_start_func_2): stop if forked in a sub-thread,
	  the thread has become the main thread.
	  [ruby-core:62070] [Bug #9751]

Mon Jun 23 01:53:18 2014  Josh Goebel  <dreamer3@gmail.com>

	* net/protocol.rb (using_each_crlf_line): fix SMTP dot-stuffing
	  for messages not ending with a new-line.
	  [ruby-core:61441] [Bug #9627] [fix GH-616]

Fri Jun 20 00:40:06 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* thread_pthread.c (ruby_init_stack, ruby_stack_overflowed_p):
	  place get_stack above others to get stack boundary information.
	  [ruby-core:60113] [Bug #9454]

Fri Jun 20 00:40:06 2014  NARUSE, Yui  <naruse@ruby-lang.org>

	* thread_pthread.c: rlimit is only available on Linux.
	  At least r44712 breaks FreeBSD.
	  [ruby-core:60113] [Bug #9454]

Fri Jun 20 00:40:06 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* thread_pthread.c: get current main thread stack size, which may
	  be expanded than allocated size at initialization, by rlimit().
	  [ruby-core:60113] [Bug #9454]

Fri Jun 20 00:20:02 2014  Hiroshi Shirosaki  <h.shirosaki@gmail.com>

	* configure.in: enable SSE2 on mingw. target='i386-pc-mingw32'.
	  [ruby-core:62095] [Bug #8358]

Tue Jun 17 00:45:44 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* compile.c (compile_array_): make copy a first hash not to modify
	  the argument itself.  keyword splat should be non-destructive.
	  [ruby-core:62161] [Bug #9776]

Tue Jun 17 00:37:15 2014  Bugra Barin  <bugrabarin@hotmail.com>

	* dln.c (dln_load): use wchar version to load a library in
	  non-ascii path on Windows.  based on the patch by Bugra Barin
	  <bugrabarin AT hotmail.com> in [ruby-core:61845].  [Bug #9699]

Tue Jun 17 00:26:59 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* process.c (obj2uid, obj2gid): now getpwnam_r() and getgrnam_r()
	  may need larger buffers than sysconf values, so retry with
	  expanding the buffer when ERANGE is returned.
	  [ruby-core:61325] [Bug #9600]

Wed Jun 11 22:58:30 2014  Eric Wong  <e@80x24.org>

	* gc.c (ruby_gc_set_params): simplify condition

Wed Jun 11 22:58:30 2014  Eric Wong  <e@80x24.org>

	* gc.c (ruby_gc_set_params): fix building without RGenGC

Wed Jun 11 02:43:32 2014  Kazuki Tsujimoto  <kazuki@callcc.net>

	* test/objspace/test_objspace.rb (TestObjSpace#test_dump_uninitialized_file):
	  remove dependency on json library.

Wed Jun 11 02:43:32 2014  Scott Francis  <scott.francis@shopify.com>

	* ext/objspace/objspace_dump.c: Check fptr before trying to dump RFILE
	  object fd. [GH-562]

	* test/objspace/test_objspace.rb: add test

Wed Jun 11 02:27:55 2014  Akinori MUSHA  <knu@iDaemons.org>

	* configure.in: Fix a build problem with clang and --with-opt-dir.
	  If ruby is configured with --with-opt-dir=dir when using clang
	  as compiler, a warning `clang: warning: argument unused during
	  compilation: '-I dir'` is emitted almost every time clang
	  compiles a file.  Unfortunately, RUBY_CHECK_PRINTF_PREFIX takes
	  any output from the compiler as fatal error, and the check thus
	  fails due to the warning.  This is an attempt to fix the problem
	  by adding a flag -Qunused-arguments to CFLAGS locally in the
	  function to suppress the warning. [ruby-dev:48062] [Bug #9658]
	  [Fixes GH-571] https://github.com/ruby/ruby/pull/571

Wed Jun 11 02:18:34 2014  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* numeric.c: Fix Numeric#step with 0 unit [Bug #9575]

Wed Jun 11 00:36:05 2014  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* test/ruby/test_string (test_LSHIFT_neary_long_max): extend timeout.
	  this test fails on some CI environment by timeout.

Sat Jun  7 01:17:16 2014  Tanaka Akira  <akr@fsij.org>

	* signal.c (check_stack_overflow): Don't use ucontext_t if ucontext.h
	  is not available.
	  Fixes build on Android (x86).

Tue Jun  3 00:38:33 2014  Eric Wong  <e@80x24.org>

	* class.c (rb_class_subclass_add): use xmalloc
	* class.c (rb_module_add_to_subclasses_list): ditto
	* class.c (rb_class_remove_from_super_subclasses): use xfree
	* class.c (rb_class_remove_from_module_subclasses): ditto
	  [Bug #9616]

Mon Jun  2 02:19:30 2014  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (rb_w32_accept, open_ifs_socket, socketpair_internal):
	  reset inherit flag of socket to avoid unintentional inheritance of
	  socket.  note that the return value of SetHandleInformation() is not
	  verified intentionally because old Windows may return an error.
	  [Bug #9688] [ruby-core:61754]

Mon Jun  2 02:12:10 2014  Eric Wong  <e@80x24.org>

	* time.c (time_mload): freeze and preserve marshal-loaded time zone
	* test/ruby/test_time.rb: add test for GC on loaded object
	  [Bug #9652]

Mon Jun  2 01:57:59 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_insnhelper.c (vm_callee_setup_arg): turn a macro into an
	  inline function.

Mon Jun  2 01:46:43 2014  Eric Wong  <e@80x24.org>

	* variable.c (rb_const_set): delete existing entry on redefinition
	  [Bug #9645]
	* test/ruby/test_const.rb (test_redefinition): test for leak

Fri May 30 00:13:19 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (setup_exception): preserve errinfo across calling #to_s
	  method on the exception.  [ruby-core:61091] [Bug #9568]

Thu May 29 20:57:59 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* numeric.c (ruby_num_interval_step_size): check signs and get rid
	  of implementation dependent behavior of negative division.
	  [ruby-core:61106] [Bug #9570]

Wed May 28 23:47:22 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (rb_cv_func___builtin_unreachable): try with an
	  external variable not only by a warning, which might not be
	  shown due to the optimization.  [ruby-core:61647] [Bug #9665]

Wed May 28 23:40:57 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/openssl/ossl_asn1.c (ossl_asn1_initialize): SYMID on a value
	  other than Symbol is an undefined behavior.  fix up r31699.
	  [ruby-core:62142] [Bug #9771]

Wed May 28 23:37:32 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/stringio/stringio.c (strio_putc): fix for non-ascii
	  encoding, like as IO#putc.  [ruby-dev:48114] [Bug #9765]

Wed May 28 01:05:06 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/fileutils.rb (FileUtils#copy_entry): update rdoc about
	  preserve option and permissions, following r31123.
	  [ruby-core:62065] [Bug #9748]

Wed May 28 00:57:06 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* proc.c (umethod_bind): use the ancestor iclass instead of new
	  iclass to get rid of infinite recursion, if the defined module
	  is already included.  [ruby-core:62014] [Bug #9721]

Wed May 28 00:57:06 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* proc.c (rb_method_call_with_block, umethod_bind): call with
	  IClass including the module for a module instance method.
	  [ruby-core:61936] [Bug #9721]

	* vm_insnhelper.c (vm_search_super_method): allow bound
	  UnboundMethod case.

Wed May 28 00:38:37 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (ary_reject): may be turned into a shared array during
	  the given block.  [ruby-dev:48101] [Bug #9727]

Wed May 28 00:29:02 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (str_buf_cat): should round up the capacity by 4KiB,
	  but not number of rooms.  [ruby-core:61886] [Bug #9709]

Wed May 28 00:23:11 2014  NARUSE, Yui  <naruse@ruby-lang.org>

	* lib/xmlrpc/client.rb (do_rpc): don't check body length.
	  If HTTP content-encoding is used, the length may be different.
	  [Bug #8182] [ruby-core:53811]

Wed May 28 00:18:29 2014  Tadayoshi Funaba  <tadf@dotrb.org>

	* ext/date/date_core.c (d_lite_cmp): should compare with #<.

Fri May 23 00:04:13 2014  Tanaka Akira  <akr@fsij.org>

	* ext/socket/socket.c (sock_s_getnameinfo): Save errno for EAI_SYSTEM.
	  Reported by Saravana kumar.  [ruby-core:61820] [Bug #9697]
	  Fixed by Heesob Park.  [ruby-core:61868]

Fri May 23 00:04:13 2014  Tanaka Akira  <akr@fsij.org>

	* ext/socket: Wrap struct addrinfo by struct rb_addrinfo.

Fri May 23 00:04:13 2014  Tanaka Akira  <akr@fsij.org>

	* ext/socket/ipsocket.c (ip_s_getaddress): Don't access freed memory.

Mon May 19 00:47:00 2014  Koichi Sasada  <ko1@atdot.net>

	* test/ruby/test_array.rb: remove useless `assert'.

Mon May 19 00:47:00 2014  Koichi Sasada  <ko1@atdot.net>

	* array.c (rb_ary_modify): remember shared array owner if a shared
	  array owner is promoted and a shared array is not promoted.

	  Now, shared array is WB-unprotected so that shared arrays are not
	  promoted.  All objects referred from shared array should be marked
	  correctly.

	  [ruby-core:61919] [ruby-trunk - Bug #9718]

	* test/ruby/test_array.rb: add a test for above.

Mon May 19 00:26:53 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (parser_yylex): only a newline after label should be
	  significant.  [ruby-core:61658] [Bug #9669]

Mon May 19 00:26:53 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (lex_state_e, parser_params, f_arglist, parser_yylex):
	  separate EXPR_LABELARG from EXPR_BEG and let newline significant,
	  so that required keyword argument can place at the end of
	  argument list without parentheses.  [ruby-core:61658] [Bug #9669]

Fri May 16 00:27:02 2014  James Edward Gray II  <james@graysoftinc.com>

	* lib/csv.rb: Fixed a broken regular expression that was causing
	  CSV to miss escaping some special meaning characters when used
	  in parsing.
	  Reported by David Unric
	  [ruby-core:54986] [Bug #8405]

Fri May 16 00:14:25 2014  Kohei Suzuki  <eagletmt@gmail.com>

	* vm_method.c (rb_method_entry_get_without_cache): me->klass is 0
	  for a method aliased in a module.  [ruby-core:61636] [Bug #9663]

Fri May 16 00:14:25 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_method.c (rb_method_entry_get_without_cache): get rid of
	  infinite recursion at aliases in a subclass and a superclass.
	  return actually defined class for other than singleton class.
	  [ruby-core:60431] [Bug #9475]

Mon May 12 22:53:08 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (primary): flush cmdarg flags inside left-paren in a
	  command argument, to allow parenthesed do-block as an argument
	  without arguments parentheses.  [ruby-core:61950] [Bug #9726]

Mon May 12 22:22:43 2014  Koichi Sasada  <ko1@atdot.net>

	* vm.c (invoke_block_from_c): add VM_FRAME_FLAG_BMETHOD to record
	  it is bmethod frame.

	* vm.c (vm_exec): invoke RUBY_EVENT_RETURN event if rollbacked frame
	  is VM_FRAME_FLAG_BMETHOD.
	  [Bug #9759]

	* test/ruby/test_settracefunc.rb: add a test for TracePoint/set_trace_func.

	* vm_core.h: rename rb_thread_t::passed_me to
	  rb_thread_t::passed_bmethod_me to clarify the usage.

	* vm_insnhelper.c (vm_call_bmethod_body): use renamed member.

Mon May 12 22:11:47 2014  Shota Fukumori  <her@sorah.jp>

	* vm_eval.c (eval_string_with_cref): Unify to use NIL_P.

Mon May 12 22:11:47 2014  Shota Fukumori  <her@sorah.jp>

	* vm_eval.c (eval_string_with_cref): Use file path even if scope is
	  given. Related to [ruby-core:56099] [Bug #8662] and r42103.

Thu May  8 01:13:10 2014  NARUSE, Yui  <naruse@ruby-lang.org>

	* configure.in: correct pthread_setname_np's prototype on NetBSD.
	  [Bug #9586]

Tue May  6 00:54:56 2014  Narihiro Nakamura  <authornari@gmail.com>

	* gc.c (gc_after_sweep): suppress unnecessary expanding heap.
	  Tomb heap pages are freed pages here, so expanding heap is
	  not required.

Mon May  5 02:35:20 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/openssl/ossl_pkey.c (ossl_pkey_verify): as EVP_VerifyFinal()
	  finalizes only a copy of the digest context, the context must be
	  cleaned up after initialization by EVP_MD_CTX_cleanup() or a
	  memory leak will occur.  [ruby-core:62038] [Bug #9743]

Mon May  5 02:21:48 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/dl/cptr.c (dlptr_free), ext/dl/handle.c (dlhandle_free),
	  ext/fiddle/handle.c (fiddle_handle_free),
	  ext/fiddle/pointer.c (fiddle_ptr_free): fix memory leak.
	  based on the patch Heesob Park at [ruby-dev:48021] [Bug #9599].

Mon May  5 01:20:27 2014  Eric Wong  <e@80x24.org>

	* gc.c (rb_gc_writebarrier): drop special case for big hash/array
	  [Bug #9518]

Mon May  5 01:13:00 2014  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_before_sweep): cap `malloc_limit' to
	  gc_params.malloc_limit_max.  It can grow and grow with such case:
	    `loop{"a" * (1024 ** 2)}'
	  [Bug #9687]

	  This issue is pointed by Tim Robertson.
	  http://www.omniref.com/blog/blog/2014/03/27/ruby-garbage-collection-still-not-ready-for-production/

Mon May  5 00:52:18 2014  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (BigDecimal_initialize): Insert GC guard.

	* ext/bigdecimal/bigdecimal.c (BigDecimal_global_new): ditto.

Mon May  5 00:42:35 2014  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* ext/psych/psych.gemspec: update gemspec for psych-2.0.5

Mon May  5 00:42:35 2014  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* ext/psych/lib/psych.rb: Merge psych-2.0.5. bump version to
	  libyaml-0.1.6 for CVE-2014-2525.
	* ext/psych/yaml/config.h: ditto.
	* ext/psych/yaml/scanner.c: ditto.
	* ext/psych/yaml/yaml_private.h: ditto.

Mon May  5 00:35:20 2014  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych/visitors/yaml_tree.rb: support dumping Encoding
	  objects.

	* ext/psych/lib/psych/visitors/to_ruby.rb: support loading Encoding
	  objects.

	* test/psych/test_encoding.rb: add test

	* ext/psych/lib/psych.rb: add version

Mon May  5 00:16:35 2014  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* gc.c: Fix up default GC params by @csfrancis [fix GH-556]

Fri May  2 00:19:36 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/openssl/ossl.c (ossl_make_error): check NULL for unknown
	  error reasons with old OpenSSL, and insert a colon iff formatted
	  message is not empty.

Thu May  1 20:56:56 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/readline/extconf.rb (rl_hook_func_t): check pointer type.
	  [ruby-dev:48089] [Bug #9702]

Thu May  1 20:47:08 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/readline/extconf.rb: fix typo, `$defs` not `$DEFS`.
	  [ruby-core:61756] [Bug #9578]

Thu May  1 20:47:08 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/readline/extconf.rb (rl_hook_func_t): define as Function for
	  very old readline versions.  [ruby-core:61209] [Bug #9578]

Thu May  1 20:47:08 2014  Tanaka Akira  <akr@fsij.org>

	* ext/readline/readline.c (Init_readline): Use rl_hook_func_t instead
	  of Function to support readline-6.3.  (rl_hook_func_t is available
	  since readline-4.2.)
	  Reported by Dmitry Medvinsky.  [ruby-core:61141] [Bug #9578]

Sat Mar  1 21:00:27 2014  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* proc.c: Having optional keyword arguments makes maximum arity +1,
	  not unlimited [#8072]

Sat Mar  1 17:25:12 2014  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* proc.c: Having any mandatory keyword argument increases min arity
	  [#9299]

Mon Feb 24 14:56:41 2014  WATANABE Hirofumi  <eban@ruby-lang.org>

	* tool/make-snapshot: needs CXXFLAGS.  [ruby-core:59393][Bug #9320]

Mon Feb 24 14:56:41 2014  NAKAMURA Usaku  <usa@ruby-lang.org>

	* tool/make-snapshot: support new version scheme.

Mon Feb 24 13:05:48 2014  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych.rb: New release of psych.
	* ext/psych/psych.gemspec: ditto

Mon Feb 24 13:05:48 2014  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/yaml/emitter.c: merge libyaml 0.1.5
	* ext/psych/yaml/loader.c: ditto
	* ext/psych/yaml/parser.c: ditto
	* ext/psych/yaml/reader.c: ditto
	* ext/psych/yaml/scanner.c: ditto
	* ext/psych/yaml/writer.c: ditto
	* ext/psych/yaml/yaml_private.h: ditto

Sat Feb 22 22:26:43 2014  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/io/console/console.c (console_dev): need read access for conout$
	  because some functions need it.  [Bug#9554]

Sat Feb 22 21:56:26 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* compile.c (iseq_set_arguments): set arg_keyword_check from
	  nd_cflag, which is set by parser.  internal ID is used for
	  unnamed keyword rest argument, which should be separated from no
	  keyword check.

	* iseq.c (rb_iseq_parameters): if no keyword check, keyword rest is
	  present.

	* parse.y (new_args_tail_gen): set keywords check to nd_cflag, which
	  equals to that keyword rest is not present.

Sat Feb 22 21:56:26 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* iseq.c (rb_iseq_parameters): push argument type symbol only for
	  unnamed rest keywords argument.

Sat Feb 22 21:56:26 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* proc.c (rb_iseq_min_max_arity): maximum argument is unlimited if
	  having rest keywords argument.  [ruby-core:53298] [Bug #8072]

Sat Feb 22 18:55:08 2014  Shugo Maeda  <shugo@ruby-lang.org>

	* ext/socket/init.c (wait_connectable): break if the socket is
	  writable to avoid infinite loops on FreeBSD and other platforms
	  which conforms to SUSv3.  This problem cannot be reproduced with
	  loopback interfaces, so it's hard to write test code.
	  rsock_connect() and wait_connectable() are overly complicated, so
	  they should be refactored, but I commit this fix as a workaround
	  for the release of Ruby 1.9.3 scheduled on Feb 24.
	  [ruby-core:60940] [Bug #9547]

Sat Feb 22 18:48:57 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* class.c (rb_mod_init_copy): do nothing if copying self.
	  [ruby-dev:47989] [Bug #9535]

	* hash.c (rb_hash_initialize_copy): ditto.

Sat Feb 22 18:20:58 2014  Masaki Matsushita  <glass.saga@gmail.com>

	* hash.c (rb_hash_flatten): fix behavior of flatten(-1).
	  [ruby-dev:47988] [Bug #9533]

	* test/ruby/test_array.rb: test for above.

Sat Feb 22 17:46:32 2014  Tanaka Akira  <akr@fsij.org>

	* lib/open-uri.rb: Make proxy disabling working again.
	  Fixed by Christophe Philemotte.   [ruby-core:59650] [Bug #9385]

Sat Feb 22 17:33:39 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_mod_s_constants): return its own constants for other
	  than Module itself.  [ruby-core:59763] [Bug #9413]

Sat Feb 22 16:51:36 2014  Eric Wong <e@80x24.org>

	* ext/json/generator/depend: add build dependencies for json extension
	  [Bug #9374] [ruby-core:59609]
	* ext/json/parser/depend: ditto

Sat Feb 22 16:34:12 2014  Yusuke Endoh  <mame@tsg.ne.jp>

	* ext/fiddle/closure.c: use sizeof(*pcl) for correct sizeof value.
	  [ruby-core:57599] [Bug #8978].

Sat Feb 22 16:34:12 2014  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/fiddle/closure.c: use sizeof(*pcl) for correct sizeof value.
	  [ruby-core:57599] [Bug #8978].  Thanks mame!

Sat Feb 22 16:17:54 2014  Eric Wong  <e@80x24.org>

	* ext/socket/ancdata.c (bsock_sendmsg_internal): only retry on error
	  (bsock_recvmsg_internal): ditto
	* test/socket/test_unix.rb: test above for infinite loop

Sat Feb 22 15:56:53 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* thread_pthread.c (rb_thread_create_timer_thread): fix for platforms
	  where PTHREAD_STACK_MIN is a dynamic value and not a compile-time
	  constant.  [ruby-dev:47911] [Bug #9436]

Sat Feb 22 15:56:53 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* thread_pthread.c (rb_thread_create_timer_thread): expand timer
	  thread stack size to get rid of segfault on FreeBSD/powerpc64.
	  based on the patch by Steve Wills at [ruby-core:59923].
	  [ruby-core:56590] [Bug #8783]

Sat Feb 22 15:13:38 2014  Benoit Daloze  <eregontp@gmail.com>

	* range.c (Range#size): [DOC] improve description and add examples.
	  Patch by @skade. [Fixes GH-501]

Sat Feb 22 15:07:58 2014  Zachary Scott  <e@zzak.io>

	* lib/racc/rdoc/grammar.en.rdoc: [DOC] Correct grammar and typos
	  Patch by Giorgos Tsiftsis [Bug #9429] [ci skip]

Sat Feb 22 15:06:32 2014  Zachary Scott  <e@zzak.io>

	* lib/open-uri.rb: [DOC] use lower case version of core classes, same
	  as commit r44878, based on patch by Jonathan Jackson [Bug #9483]

Sat Feb 22 15:06:32 2014  Zachary Scott  <e@zzak.io>

	* ext/ripper/lib/ripper/lexer.rb: [DOC] use lower case version of core
	  classes when referring to return value, since we aren't directly
	  talking about the class. Patch by Jonathan Jackson [Bug #9483]

Sat Feb 22 15:03:05 2014  Ayumu AIZAWA  <ayumu.aizawa@gmail.com>

	* variable.c: adding extra example in docs.
	  patched by Steve Klabnik. [Bug #9210]

Sat Feb 22 15:01:21 2014  Tanaka Akira  <akr@fsij.org>

	* lib/resolv.rb (Resolv::DNS::Resource::TXT#data): Return concatenated
	  string.
	  Patch by Ryan Brunner.  [ruby-core:58220] [Bug #9093]

Sat Feb 22 14:52:55 2014  Zachary Scott  <e@zzak.io>

	* ext/openssl/ossl_pkey_dh.c: Fixed typo by Sandor Szuecs [Bug #9243]

Sat Feb 22 14:45:36 2014  Zachary Scott  <e@zzak.io>

	* lib/xmlrpc/client.rb: [DOC] Remove note about SSL package on RAA
	  Since RAA has been deprecated, and the SSL package has been replaced
	  with net/https this statement is entirely false and should be
	  deleted. [Bug #9152]

Sat Feb 22 14:31:23 2014  Zachary Scott  <e@zzak.io>

	* lib/net/smtp.rb: [DOC] Remove dead link to RAA by Giorgos Tsiftsis
	  Fixes the following bugs: [Bug #9152] [Bug #9268] [Bug #9394]
	* lib/open-uri.rb: ditto

Sat Feb 22 14:18:35 2014  Tanaka Akira  <akr@fsij.org>

	* lib/resolv.rb: Ignore name servers which cause EAFNOSUPPORT on
	  socket creation.
	  Reported by Bjoern Rennhak.  [ruby-core:60442] [Bug #9477]

Sat Feb 22 14:07:04 2014  Tanaka Akira  <akr@fsij.org>

	* lib/resolv.rb (Resolv::DNS::Message::MessageDecoder): Raise
	  DecodeError if no data before the limit.
	  Reported by Will Bryant.  [ruby-core:60557] [Bug #9498]

Sat Feb 22 13:49:30 2014  Shugo Maeda  <shugo@ruby-lang.org>

	* vm_insnhelper.c (vm_call_method): should check ci->me->flag of
	  a refining method in case the method is private.
	  [ruby-core:60111] [Bug #9452]

	* vm_method.c (make_method_entry_refined): set me->flag of a refined
	  method entry to NOEX_PUBLIC in case the original method is private
	  and it is refined as a public method.  The original flag is stored
	  in me->def->body.orig_me, so it's OK to make a refined method
	  entry public.  [ruby-core:60111] [Bug #9452]

	* test/ruby/test_refinement.rb: related tests.

Sat Feb 22 13:26:57 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* iseq.c (iseq_load): keep type_map to get rid of memory leak.
	  based on a patch by Eric Wong at [ruby-core:59699].  [Bug #9399]

Sat Feb 22 13:17:32 2014  Masaki Matsushita  <glass.saga@gmail.com>

	* ext/thread/thread.c (rb_szqueue_clear): notify SZQUEUE_WAITERS
	  on SizedQueue#clear. [ruby-core:59462] [Bug #9342]

	* test/thread/test_queue.rb: add test. the patch is from
	  Justin Collins.

Sat Feb 22 01:35:02 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: check if pthread_setname_np is available.

	* thread_pthread.c: pthread_setname_np is not available on old
	  Darwins.  [ruby-core:60524] [Bug #9492]

Sat Feb 22 00:21:50 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (local_push_gen, local_pop_gen): save cmdarg_stack to
	  isolate command argument state from outer scope.
	  [ruby-core:59342] [Bug #9308]

Fri Feb 21 23:51:38 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* encoding.c (must_encindex, rb_enc_from_index, rb_obj_encoding): mask
	  encoding index and ignore dummy flags.  [ruby-core:59354] [Bug #9314]

Fri Feb 21 23:10:12 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (RbConfig): expand RUBY_SO_NAME for extensions
	  backward compatibility.  [ruby-core:59426] [Bug #9329]

Fri Feb 21 23:07:56 2014  Akio Tajima <artonx@yahoo.co.jp>

	* win32/Makefile.sub: remove HAVE_FSEEKO because fseeko removed from win32/win32.c
	  Fixed [Bug #9333].

Fri Feb 21 23:00:34 2014  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych/visitors/yaml_tree.rb: dumping strings with
	  quotes should not have changed.  [ruby-core:59316] [Bug #9300]

	* ext/psych/lib/psych.rb: fixed missing require.

	* test/psych/test_string.rb: test

Sun Feb 2 05:48:42 2014  Eric Wong <e@80x24.org>

	* io.c (rb_io_syswrite): add RB_GC_GUARD
	  [Bug #9472][ruby-core:60407]

Fri Feb 21 17:42:42 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/resolv.rb (Resolv::Hosts#lazy_initialize): should not
	  consider encodings in hosts file.  [ruby-core:59239] [Bug #9273]

	* lib/resolv.rb (Resolv::Config.parse_resolv_conf): ditto.

Fri Feb 21 16:47:20 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (get_encoding): respect BOM on pseudo encodings.
	  [ruby-dev:47895] [Bug #9415]

Fri Feb 21 16:47:20 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (get_actual_encoding): get actual encoding according to
	  the BOM if exists.

	* string.c (rb_str_inspect): use according encoding, instead of
	  pseudo encodings, UTF-{16,32}.  [ruby-core:59757] [Bug #8940]

Fri Feb 21 13:39:21 2014  Charlie Somerville  <charliesome@ruby-lang.org>

	* compile.c (iseq_build_from_ary_body): Use :blockptr instead of :block
	  as hash key when loading serialized instruction sequences from arrays.
	  [Bug #9455] [ruby-core:60146]

Thu Feb 20 12:58:45 2014  Tanaka Akira  <akr@fsij.org>

	* process.c (READ_FROM_CHILD): Apply the last hunk of
	  0001-process.c-avoid-EINTR-from-Process.spawn.patch written by
	  Eric Wong in [Bug #8770].

Thu Feb 20 12:58:45 2014  Eric Wong  <normalperson@yhbt.net>

	* process.c (send_child_error): retry write on EINTR to fix
	  occasional Errno::EINTR from Process.spawn.

	* process.c (recv_child_error): retry read on EINTR to fix
	  occasional Errno::EINTR from Process.spawn.

Thu Feb 20 12:24:59 2014  Eric Hodel  <drbrain@segment7.net>

	* lib/rinda/ring.rb (Rinda::RingFinger#make_socket):  Use
	  ipv4_multicast_ttl option for portability.

Thu Feb 20 10:19:40 2014  Tanaka Akira  <akr@fsij.org>

	* ext/socket/option.c: IP_MULTICAST_LOOP and IP_MULTICAST_TTL socket
	  option takes a byte on OpenBSD.
	  Fixed by Jeremy Evans.  [ruby-core:59496] [Bug #9350]

Wed Feb 19 15:25:13 2014  Koichi Sasada  <ko1@atdot.net>

	* gc.c (ruby_gc_set_params): don't show obsolete warnings for
	  RUBY_FREE_MIN/RUBY_HEAP_MIN_SLOTS if
	  RUBY_GC_HEAP_FREE_SLOTS/RUBY_GC_HEAP_INIT_SLOTS are given.
	  [Bug #9276]

Wed Feb 19 14:25:55 2014  Koichi Sasada  <ko1@atdot.net>

	* test/ruby/test_gc.rb: ignore warning messages for running with -w
	  option such as chkbuild.

Wed Feb 19 14:25:55 2014  Koichi Sasada  <ko1@atdot.net>

	* gc.c (get_envparam_double): fix a warning message.

Wed Feb 19 14:25:55 2014  Koichi Sasada  <ko1@atdot.net>

	* gc.c: introduce new environment variable
	  "RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR" to control major/minor GC
	  frequency.

	  Do 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 just after last full GC.

	* test/ruby/test_gc.rb: add a test.

Wed Feb 19 07:51:02 2014  Eric Hodel  <drbrain@segment7.net>

	* lib/rinda/ring.rb (Rinda::RingFinger#make_socket):  Use
	  ipv4_multicast_loop option for portability.  Patch by Jeremy Evans.
	  [ruby-trunk - Bug #9351]

Mon Feb 17 05:43:20 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: reset LDFLAGS and DLDFLAGS for opt-dir again after
	  LIBPATHFLAG and RPATHFLAG are set.  [ruby-dev:47868] [Bug #9317]

Sun Feb 16 07:13:36 2014  Tanaka Akira  <akr@fsij.org>

	* configure.in: Fix compilation error.
	  https://bugs.ruby-lang.org/issues/8358#note-16

Sun Feb 16 07:13:36 2014  Vit Ondruch  <vondruch@redhat.com>

	* configure.in: add qouting brackets and append wildcard for the
	  rest after target_cpu, to properly detect platform for SSE2
	  instructions.  [ruby-core:60576] [Bug #8358]

Sun Feb 16 07:13:36 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: -mstackrealign is necessary for -msse2 working.
	  [ruby-core:54716] [Bug #8349]

Sun Feb 16 07:13:36 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: -mstackrealign is necessary for -msse2 working.
	  [ruby-core:54716] [Bug #8349]

	* configure.in: use SSE2 instructions to drop unexpected precisions on
	  other than mingw.  [ruby-core:59472] [Bug #8358]

Sun Feb 16 07:13:36 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: use SSE2 instructions for drop unexpected
	  precisions.  [ruby-core:54738] [Bug #8358]

Fri Feb  7 04:19:19 2014  Koichi Sasada  <ko1@atdot.net>

	* gc.c (get_envparam_int): correct warning messsages.

	* gc.c (get_envparam_double): ditto.

Fri Feb  7 04:19:19 2014  Koichi Sasada  <ko1@atdot.net>

	* gc.c (get_envparam_int): don't accept a value equals to lowerbound
	  (changed by last commit) because "" or "foo" (not a number) strings
	  are parsed as 0. They should be rejected.

	* gc.c (get_envparam_double): ditto.

Thu Feb 6 08:23:28 2014  Eric Wong  <e@80x24.org>

	* ext/thread/thread.c (rb_szqueue_max_set): use correct queue and
	  limit wakeups.  [Bug #9343][ruby-core:60517]
	* test/thread/test_queue.rb (test_sized_queue_assign_max):
	  test for bug

Thu Feb  6 11:27:39 2014  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems: RubyGems 2.2.2 which contains the following bug fixes:
	  http://rubygems.rubyforge.org/rubygems-update/History_txt.html#label-2.2.2+%2F+2014-02-05
	  https://bugs.ruby-lang.org/issues/9489

Thu Feb  6 11:23:59 2014  Koichi Sasada  <ko1@atdot.net>

	* gc.c (ruby_gc_set_params): if RUBY_GC_OLDMALLOC_LIMIT is provided,
	  then set objspace->rgengc.oldmalloc_increase_limit.
	  Without this fix, the env variable RUBY_GC_OLDMALLOC_LIMIT
	  does not work.

	* gc.c (get_envparam_int): accept a value equals to lowerbound.

	* gc.c (get_envparam_double): ditto.

Wed Feb  5 23:57:05 2014  Charlie Somerville  <charliesome@ruby-lang.org>

	* ext/thread/thread.c (rb_szqueue_push): check GET_SZQUEUE_WAITERS
	  instead of GET_QUEUE_WAITERS to prevent deadlock. Patch by Eric Wong.
	  [Bug #9302] [ruby-core:59324]

	* test/thread/test_queue.rb: add test

Wed Feb  5 23:43:30 2014  NAKAMURA Usaku  <usa@ruby-lang.org>

	* hash.c (rb_objid_hash): should return `long'.  brushup r44534.

	* object.c (rb_obj_hash): follow above change.

Wed Feb  5 23:43:30 2014  NAKAMURA Usaku  <usa@ruby-lang.org>

	* hash.c (rb_any_hash): should treat the return value of rb_objid_hash()
	  as `long', because ruby assumes the hash value of the object id of
	  an object is `long'.
	  this fixes test failures on mswin64 introduced at r44525.

Wed Feb  5 23:43:30 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (rb_objid_hash): return hash value from object ID with a
	  salt, extract from rb_any_hash().

	* object.c (rb_obj_hash): return same value as rb_any_hash().
	  fix r44125.  [ruby-core:59638] [Bug #9381]

Wed Feb  5 22:28:41 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_insnhelper.c (vm_search_super_method): allow bound method from a
	  module, yet another method transplanting.

Wed Feb  5 22:28:41 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_insnhelper.c (vm_search_super_method): when super called in a
	  bound UnboundMethod generated from a module, no superclass is
	  found since the current defined class is the module, then call
	  method_missing in that case.  [ruby-core:59619] [Bug #9377]

Wed Feb  5 21:57:40 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/socket/socket.c (rsock_syserr_fail_host_port): add errno
	  argument version anduse rb_syserr_fail_str() instead of
	  rb_sys_fail_str() with restoring errno.

	* ext/socket/socket.c (rsock_syserr_fail_path): ditto, and
	  rb_syserr_fail().

	* ext/socket/socket.c (rsock_sys_fail_sockaddr): ditto, use
	  rsock_syserr_fail_raddrinfo().

	* ext/socket/socket.c (rsock_sys_fail_raddrinfo): ditto.

	* ext/socket/socket.c (setup_domain_and_type): ditto.

Wed Feb  5 21:57:40 2014  Eric Wong  <normalperson@yhbt.net>

	* ext/socket/socket.c (rsock_sys_fail_host_port): save and restore errno
	  before calling rb_sys_fail_str to prevent [BUG] errno == 0.
	  Patch by Eric Wong. [ruby-core:59498] [Bug #9352]

	* ext/socket/socket.c (rsock_sys_fail_path): ditto
	* ext/socket/socket.c (rsock_sys_fail_sockaddr): ditto
	* ext/socket/socket.c (rsock_sys_fail_raddrinfo): ditto
	* ext/socket/socket.c (rsock_sys_fail_raddrinfo_or_sockaddr): ditto

Wed Feb  5 21:12:02 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/timeout.rb (Timeout::ExitException.catch): pass arguments
	  for new instance.

	* lib/timeout.rb (Timeout::ExitException#exception): fallback to
	  Timeout::Error if couldn't throw.  [ruby-dev:47872] [Bug #9380]

	* lib/timeout.rb (Timeout#timeout): initialize ExitException with
	  message for the fallback case.

Wed Feb  5 21:12:02 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/timeout.rb (Timeout#timeout): should not rescue ordinarily
	  raised ExitException, which should not be thrown.

	* lib/timeout.rb (Timeout::ExitException.catch): set @thread only if
	  it ought to be caught.

	* lib/timeout.rb (Timeout#timeout): when a custom exception is given,
	  no instance is needed to be caught, so defer creating new instance
	  until it is raised.  [ruby-core:59511] [Bug #9354]

Wed Feb  5 17:55:28 2014  Aman Gupta <ruby@tmm1.net>

	* array.c (ary_add_hash): Fix consistency issue between Array#uniq and
	  Array#uniq! [Bug #9340] [ruby-core:59457]
	* test/ruby/test_array.rb (class TestArray): regression test for above.

Wed Feb  5 11:48:42 2014  Charlie Somerville  <charliesome@ruby-lang.org>

	* struct.c (rb_struct_set): return assigned value from setter method
	  rather than struct object. [Bug #9353] [ruby-core:59509]

	* test/ruby/test_struct.rb (test_setter_method_returns_value): add test

Wed Feb  5 11:13:21 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_modify_expand): enable capacity and disable
	  assocation with packed objects when setting capa, so that
	  pack("p") string fails to unpack properly after modified.

Sun Feb  2 22:39:28 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/delegate.rb (Delegator): keep source information methods
	  which start and end with '__'.  [ruby-core:59718] [Bug #9403]

Fri Jan 31 12:10:16 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* proc.c (mnew_from_me): keep iclass as-is, to make inheritance
	  chain consistent.  [ruby-core:59358] [Bug #9315]

	* proc.c (method_owner): return the original defined_class from
	  prepended iclass, instead.

Fri Jan 31 12:05:59 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: let mingw do something black-magic, and check if
	  _gmtime64_s() is available actually.

	* win32/win32.c (gmtime_s, localtime_s): use _gmtime64_s() and
	  _localtime64_s() if available, not depending on very confusing
	  mingw variants macros.  based on the patch by phasis68 (Heesob
	  Park) at [ruby-core:58764].  [ruby-core:58391] [Bug #9119]

Thu Jan 30 15:02:35 2014  Shugo Maeda  <shugo@ruby-lang.org>

	* configure.in: use $@ instead of $(.TARGET) because .TARGET is not
	  supported by GNU make.

Mon Jan 27 16:49:52 2014  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (BigDecimal_divide): Add an additional
	  digit for the quotient to be compatible with bigdecimal 1.2.1 and
	  the former.  [ruby-core:59365] [#9316] [#9305]

	* test/bigdecimal/test_bigdecimal.rb: tests for the above change.

	* ext/bigdecimal/bigdecimal.gemspec: bigdecimal version 1.2.4.

Mon Jan 27 16:45:34 2014  Yamashita Yuu  <yamashita@geishatokyo.com>

	* ext/openssl/ossl_ssl.c (Init_ossl_ssl): Declare a constant
	  `OP_MSIE_SSLV2_RSA_PADDING` only if the macro is defined.  The
	  `SSL_OP_MSIE_SSLV2_RSA_PADDING` has been removed from latest
	  snapshot of OpenSSL 1.0.1.  [Fixes GH-488]

Thu Jan 23 10:37:24 2014  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (HAS_EXTRA_STATES): warn extra states only when something
	  differ.  [ruby-core:59254] [Bug #9275]

Thu Jan  9 14:05:24 2014  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/{setup.mak,Makefile.sub}: update fake.rb like
	  template/fake.rb.in.

Thu Jan  9 14:05:24 2014  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/Makefile.sub (fake.rb): should depend on version.h because
	  if RUBY_VERSION is updated, fake.rb need to say the new version
	  to avoid install error in rbconfig.rb.

Thu Jan  9 08:21:00 2014  Aman Gupta <ruby@tmm1.net>

	* test/net/imap/cacert.pem: generate new CA cert, since the last one
	  expired. [Bug #9341] [ruby-core:59459]
	* test/net/imap/server.crt: new server cert signed with updated CA.
	* test/net/imap/Makefile: add `make regen_certs` to automate this
	  process.

Thu Dec 26 03:28:11 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_insnhelper.c (argument_error): insert dummy frame to make
	  a backtrace object intead of modify backtrace string array.
	  [Bug #9295]

	* test/ruby/test_backtrace.rb: add a test for this patch.
	  fix test to compare a result of Exception#backtrace with
	  a result of Exception#backtrace_locations.

Wed Dec 25 16:58:31 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* proc.c (rb_mod_define_method): consider visibility only if self
	  in the caller is same as the receiver, otherwise make public as
	  well as old behavior.  [ruby-core:57747] [Bug #9005]
	  [ruby-core:58497] [Bug #9141]

	* vm.c (rb_vm_cref_in_context): return ruby level cref if self is
	  same.

Wed Dec 25 16:35:34 2013  Yusuke Endoh  <mame@tsg.ne.jp>

	* sample/trick2013/: added the award-winning entries of TRICK 2013.
	  See https://github.com/tric/trick2013 for the contest outline.
	  (Matz has approved the attachment.)

Tue Dec 24 23:47:50 2013  Koichi Sasada  <ko1@atdot.net>

	* README.EXT: add a refer to URL.

Tue Dec 24 23:47:50 2013  Koichi Sasada  <ko1@atdot.net>

	* README.EXT: add a document about RGenGC.
	  Reviewed by havenwood.
	  [misc #8962]

	* README.EXT.ja: ditto.

Mon Dec 23 19:00:00 2013  Eric Hodel  <drbrain@segment7.net>

	* test/rubygems/test_gem_ext_builder.rb:  Fix warning due to ambiguous
	  expression.

Mon Dec 23 16:13:10 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems/commands/install_command.rb:  Restore gem install
	  --ignore-dependencies for remote gems
	* test/rubygems/test_gem_commands_install_command.rb:  Test for the
	  above.

Mon Dec 23 16:12:24 2013  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* array.c: Have to_h raise on elements that are not key-value pairs
	  [#9239]

	* enum.c: ditto

Sun Dec 22 19:22:52 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rdoc.rb:  Set RDoc to release version.

Sun Dec 22 19:22:31 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems.rb:  Set RubyGems to release version.

Sun Dec 22 19:22:01 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems.rb (module Gem):  Fix comment for
	  Gem::load_path_insert_index.

Sun Dec 22 18:08:42 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/Makefile.sub (fake.rb): fixed wrong RUBY_PLATFORM, to correctly
	  install win32.h.
	  [ruby-core:58801][Bug #9199] reported by arton.

Fri Dec 20 17:52:50 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_method.c: check definition of
	  GLOBAL_METHOD_CACHE_SIZE and GLOBAL_METHOD_CACHE_MASK.

Fri Dec 20 17:03:10 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: rename OBJ_WRITE and OBJ_WRITTEN into
	  RB_OBJ_WRITE and RB_OBJ_WRITTEN.

	* array.c, class.c, compile.c, hash.c, internal.h, iseq.c,
	  proc.c, process.c, re.c, string.c, variable.c, vm.c,
	  vm_eval.c, vm_insnhelper.c, vm_insnhelper.h, 
	  vm_method.c: catch up this change.

Fri Dec 20 16:01:35 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: add a comment for WB interfaces.

Fri Dec 20 16:00:52 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: DLDFLAGS is defined in --with-opt-dir handler, so
	  ${DLDFLAGS=} does not work now.  use RUBY_APPEND_OPTIONS instead.
	  [ruby-dev:47855] [Bug #9256]

Fri Dec 20 14:19:12 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* configure.in (AC_ARG_WITH): use withval directly.
	  fix failure on FreeBSD.
	  http://fb32.rubyci.org/~chkbuild/ruby-trunk/log/20131217T070301Z.diff.html.gz

Fri Dec 20 14:00:01 2013  Aman Gupta <ruby@tmm1.net>

	* include/ruby/ruby.h (struct RClass): add super, remove iv_index_tbl.
	  since RCLASS_SUPER() is commonly used inside while loops, we move it
	  back inside struct RClass to improve cache hits. this provides a
	  small improvement (1%) in hotspots like rb_obj_is_kind_of()
	* internal.h (struct rb_classext_struct): remove super, add
	  iv_index_table
	* internal.h (RCLASS_SUPER): update for new location
	* internal.h (RCLASS_SET_SUPER): ditto
	* internal.h (RCLASS_IV_INDEX_TBL): ditto
	* object.c (rb_class_get_superclass): ditto
	* include/ruby/backward/classext.h (RCLASS_SUPER): ditto

Fri Dec 20 07:07:35 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master 03d6ae7.  Changes include:

	  * Fixed typos.

	  * Relaxed Gem.ruby test for ruby packagers that do not use `ruby`.

	* test/rubygems:  ditto.

Thu Dec 19 14:03:04 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (heap_get_freeobj): improve hot path performance.

	* gc.c (heap_get_freeobj_from_next_freepage): replace with
	  heap_get_freepage(). It returns freeobj instead of freepage.
	  This is not on hot path.

Thu Dec 19 12:05:17 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master af60443.  Changes include:

	  * Improved speed of `gem install --ignore-dependencies`.

	  * Open read-write for exclusive flock.  [ruby-trunk - Bug #9257]

	  * Remove specification before install to prevent infinite loop.

Thu Dec 19 11:23:49 2013  Aman Gupta <ruby@tmm1.net>

	* vm_insnhelper.c (vm_call_iseq_setup_normal): simple for loop
	  condition optimization. this area shows up as a hotspot in VM
	  profiles.

Thu Dec 19 10:50:13 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (newobj_of): don't need to RBASIC_SET_CLASS() which includes WB
	  here because created obj is always YOUNG/INFANT.

Thu Dec 19 10:48:37 2013  Koichi Sasada  <ko1@atdot.net>

	* benchmark/gc/gcbench.rb: check GC::OPTS availability
	  for not MRI 2.1.0.

Thu Dec 19 03:10:30 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c (heap_get_freeobj): remove redundant assignment. heap->freelist
	  is set after the while() loop already.

Thu Dec 19 01:54:30 2013  Koichi Sasada  <ko1@atdot.net>

	* test/runner.rb: fix commit miss on r44278.

Thu Dec 19 00:26:11 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (garbage_collect_body): lazy_sweep setting should work
	  without USE_RGENGC.

Wed Dec 18 23:31:04 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_profile_dump_major_reason): fix this function because major_reason
	  can be OR of multiple reasons.

	* gc.c (gc_profile_dump_on): ditto.

Wed Dec 18 17:03:00 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_profile_record_get): should return an empty array
	  when profiling is active.

Wed Dec 18 16:49:40 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_profile_clear, gc_profile_enable): remove rest_sweep().

	* gc.c: check objspace->profile.current_record before inserting
	  profiling record by new macro gc_prof_enabled().

Wed Dec 18 14:32:06 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_exec.h (VM_DEBUG_STACKOVERFLOW): added.
	  disable stack overflow check for every stack pushing as default.

	* vm_exec.c (vm_stack_overflow_for_insn): ditto.

Wed Dec 18 10:00:22 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master d8f12e2.  This increases the
	  speed of `gem install --ignore-dependencies` which helps bundler
	  tests.
	* test/rubygems:  ditto.

Wed Dec 18 09:00:17 2013  Koichi Sasada  <ko1@atdot.net>

	* test/ruby/test_gc.rb (test_expand_heap): allow +/-1 diff.

Tue Dec 17 23:44:15 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* test/ruby/test_io.rb: fix duplicated test name.

Tue Dec 17 20:15:00 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (rb_hash_reject): revert to deprecated behavior, with
	  warnings, due to compatibility for HashWithDifferentAccess.
	  [ruby-core:59154] [Bug #9223]

Tue Dec 17 17:30:56 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-electric.el: Import version 2.1.1 from
	  https://github.com/knu/ruby-electric.el.

	  * ruby-electric-delete-backward-char: Enable support for number
	    prefix.

	  * ruby-electric-curlies: Fix electric operation after an open
	    curly.

Tue Dec 17 16:19:09 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_trace.c (rb_postponed_job_flush): isolate exceptions in
	  postponed jobs and restore outer ones.  based on a patch by
	  tarui.  [ruby-core:58652] [Bug #9168]

Tue Dec 17 10:48:04 2013  Aman Gupta <ruby@tmm1.net>

	* configure.in (RUBY_DTRACE_POSTPROCESS): Fix compatibility with
	  systemtap on linux. stap requires `dtrace -G` post-processing, but
	  the dtrace compatibility wrapper is very strict about probes.d
	  syntax.

Tue Dec 17 05:18:17 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master 1c5f4b3.  Allows rubygems
	  repackagers to disable backward-compatible shared gem directory
	  behavior.
	* test/rubygems:  ditto.

Tue Dec 17 05:14:35 2013  Eric Hodel  <drbrain@segment7.net>

	* NEWS (RDoc):  Update version number so I don't have to change it
	  for the final release.

Mon Dec 16 19:19:19 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rb_objspace_markable_object_p): should check special_const_p
	  first (by is_markable_object()).

Mon Dec 16 19:12:54 2013  Koichi Sasada  <ko1@atdot.net>

	* ext/objspace/objspace.c (reachable_object_from_root_i): use
	  compare_by_identity hash to avoid hash modify problem
	  during iteration.
	  [Bug #9252]

	* ext/objspace/objspace.c (reachable_objects_from_root): ditto.

Mon Dec 16 18:16:28 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_verify_internal_consistency): should not use
	  rb_objspace_each_objects() because it call rest_sweep().

Mon Dec 16 18:07:30 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rb_objspace_markable_object_p): fix last commit (build error).

Mon Dec 16 18:04:28 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rb_objspace_markable_object_p): it should be live objects.

Mon Dec 16 18:00:51 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rb_objspace_each_objects): should not clear dont_lazy_sweep
	  flag in nested case.

Mon Dec 16 16:40:35 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_method.c (rb_method_entry_make): fix WB miss.
	  Note that rb_method_entry_t::klass is not constified.
	  We may  constify this field.

	* test/ruby/test_alias.rb: add a test.

Mon Dec 16 14:14:22 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: use gc_verify_internal_consistency() instead of
	  gc_check_before_marks_i() for check consistency
	  on RGENGC_CHECK_MODE >= 2.

Mon Dec 16 14:01:48 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* process.c (make_clock_result): add :second as a unit for
	  Process.clock_gettime.

Mon Dec 16 13:10:54 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: introduce GC.verify_internal_consistency method to verify GC
	  internal data structure.

	  Now this method only checks generation (old/young) consistency.

Mon Dec 16 11:49:26 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c (gc_info_decode): Fix build errors when compiled with
	  RGENGC_ESTIMATE_OLDMALLOC=0
	* gc.c (objspace_malloc_increase): ditto

Sun Dec 15 13:38:29 2013  Koichi Sasada  <ko1@atdot.net>

	* ext/objspace/objspace.c (reachable_object_from_root_i):
	  reachable objects should not include categories and
	  category_objects because it is noisy information.

	  In fact, objects created after calling
	  ObjectSpace.reachable_objects_from_root should not be included
	  as a returning hash objects. Currently, mswin64 platform has a
	  problem because of this behavior. Should we trace new objects?

Sun Dec 15 07:09:28 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rdoc:  Update to RDoc master 263a9e5.  This improves the
	  accessibility of the search box.

Sat Dec 14 17:39:00 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_insnhelper.c (vm_callee_setup_arg_complex): count post
	  arguments as mandatory arguments.  [ruby-core:57706] [Bug #8993]

	* vm_insnhelper.c (vm_yield_setup_block_args): ditto.

Sat Dec 14 16:26:46 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (rubylibprefix): replace exec_prefix as well as
	  bindir and libdir.  a patch by kimuraw (Wataru Kimura) at
	  [ruby-dev:47852].  [Bug #9160]

Sat Dec 14 14:42:53 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/logger.rb (lock_shift_log): no need to rotate the log file
	  if it has been rotated by another process.  based on the patch
	  by no6v (Nobuhiro IMAI) in [ruby-core:58620].  [Bug #9133]

Sat Dec 14 13:01:45 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* proc.c (mnew_from_me): method by respond_to_missing? should be
	  owned by the original class.

Sat Dec 14 11:55:31 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/scanf.rb (IO#scanf): fix mistaken use of rescue modifier.
	  a patch by Mon_Ouie at [ruby-core:52813].  [Bug #7940]

Sat Dec 14 11:44:52 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* util.c (ruby_qsort): fix potential stack overflow on a large
	  machine.  based on the patch by Conrad Irwin <conrad.irwin AT
	  gmail.com> at [ruby-core:51816].  [Bug #7772]

Sat Dec 14 11:25:56 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* object.c (rb_mod_const_defined): support nested class path as
	  well as const_get.  [Feature #7414]

Sat Dec 14 01:31:52 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_rescue2): reuse tags pushed for body proc to protect
	  rescue proc too.

Sat Dec 14 01:15:51 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (wmap_final_func): Bugfix. Should update *value to new pointer.

Sat Dec 14 01:05:46 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/lib/socket.rb: Don't test $! in "ensure" clause because
	  it may be set before the body.
	  Reported by ko1 and mrkn.  [ruby-core:59088] [Bug #9247]

	* lib/cgi/core.rb: Ditto.

	* lib/drb/ssl.rb: Ditto.

Sat Dec 14 00:34:31 2013  Naohisa Goto  <ngotogenome@gmail.com>

	* internal.h (ruby_sized_xrealloc2): fix typo introduced in r44117,
	  which cause compile error on Solaris.

Sat Dec 14 00:22:16 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* thread.c: (exec_recursive): use rb_catch_protect() instead of
	  rb_catch_obj() and PUSH_TAG(), and reduce pushing tags and
	  machine stack usage.

Sat Dec 14 00:18:08 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* proc.c (mnew_from_me): achieve the original defined_class from
	  prepended iclass, to fix inherited owner.

	* proc.c (method_owner): return the defined class, but not the
	  class which the method object is created from.

Fri Dec 13 22:29:21 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* proc.c (method_owner): return the class where alias is defined, not
	  the class original method is defined.

	* vm_method.c (rb_method_entry_make, rb_alias): store the originally
	  defined class in me.  [Bug #7993] [Bug #7842] [Bug #9236]

	* vm_method.c (rb_method_entry_get_without_cache): cache included
	  module but not iclass.

Fri Dec 13 16:27:17 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c (gc_info_decode): Use :major_by=>:nofree as fallback reason
	  when other trigger conditions are present.

Fri Dec 13 13:25:30 2013  Koichi Sasada  <ko1@atdot.net>

	* error.c: add Exception#backtrace_locations.
	  Now, there are no setter and independent from Exception#backtrace.
	  [Feature #8960]

	* eval.c (setup_exception): set backtrace locations for `bt_location'
	  special attribute.

	* vm_backtrace.c (rb_backtrace_to_location_ary): added.

	* internal.h: ditto.

	* test/ruby/test_backtrace.rb: add a test for
	  Exception#backtrace_locations.

Fri Dec 13 12:01:07 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (garbage_collect_body): use rb_bug() and explicit error message
	  instead of using assert().
	  [Bug #9222]

Fri Dec 13 11:52:41 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c: fix comment to remove the word "shady".

	* variable.c: ditto.

Fri Dec 13 11:33:55 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: rename *shady* func/macros.
	  * RVALUE_RAW_SHADY()   -> RVALUE_WB_PROTECTED_RAW()
	  * RVALUE_SHADY()       -> RVALUE_RAW_SHADY()
	  * rgengc_check_shady() -> rgengc_check_relation().
	  And fix some messages using "shady" to "non-WB-protected".

Fri Dec 13 10:04:23 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems/request_set/lockfile.rb:  Import RubyGems master a8d0669
	  with a 1.8.7 compatibility fix.
	* test/rubygems/test_gem_request_set_lockfile.rb:  ditto.

Fri Dec 13 09:50:49 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master ddac51f.  Changes:

	  * Allow override for the shared gem installation directory for
	    rubygems packagers.

	  * Lock gem cache files for read and write to improve thread safety.

	  * Use io/console when available.

	  * Minor cleanup.

	* test/rubygems:  ditto.

Fri Dec 13 08:15:31 2013  Aman Gupta <ruby@tmm1.net>

	* class.c (include_modules_at): use RCLASS_M_TBL_WRAPPER for
	  equality checks. this avoids an unnecessary deference inside a tight
	  loop, fixing a performance regression from r43973.
	* object.c (rb_obj_is_kind_of): ditto.
	* object.c (rb_class_inherited_p): ditto.

Wed Dec 13 02:00:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (VpSetPTR): fix for limitation of the resulting
	  precision.
	  [ruby-core:50269] [Bug #7458]

	* test/bigdecimal/test_bigdecimal.rb (test_limit): add tests for the above
	  change.

Wed Dec 13 01:56:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (VpAddAbs): put out a conditional branch from
	  the inside of while-loop.

	* ext/bigdecimal/bigdecimal.c (VpSubAbs): ditto.

Wed Dec 13 01:53:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (VPrint): be a static function, support another
	  dump formats, and add more information of the given bigdecimal.

	* ext/bigdecimal/bigdecimal.h: ditto.

Wed Dec 11 16:45:58 2013  Koichi Sasada  <ko1@atdot.net>

	* eval.c (rb_raise_jump): call c_return hook immediately after
	  popping `raise' frame.
	  Patches by deivid (David Rodriguez). [Bug #8886]

	* test/ruby/test_settracefunc.rb: catch up this fix.

Wed Dec 11 16:01:26 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (rb_hash_reject): return a plain hash, without copying
	  the class, default value, instance variables, and taintedness.
	  they had been copied just by accident.
	  [ruby-core:59045] [Bug #9223]

Wed Dec 11 15:36:15 2013  Aman Gupta <ruby@tmm1.net>

	* compile.c (iseq_specialized_instruction): emit opt_aset instruction
	  to optimize Hash#[]= and Array#[]= when called with Fixnum argument.
	  [Bug #9227] [ruby-core:58956]

Wed Dec 11 04:54:03 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master ec8ed22.  Notable changes
	  include:

	  * Renamed extension_install_dir to extension_dir (backwards
	    compatible).

	  * Fixed creation of gem.deps.rb.lock file from
	    TestGemRequestSet#test_install_from_gemdeps_install_dir

	  * Fixed a typo and some documentation.

	* test/rubygems:  ditto.

Wed Dec 11 03:18:08 2013  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* insns.def: Fix optimization bug of Float#/ [Bug #9238]

Tue Dec 10 23:58:30 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/date/date_strptime.c (date__strptime_internal): unset
	  case-insensitive flag for [:alpha:], which already implies both
	  cases, to get rid of backtrack explosion.  [ruby-core:58984]
	  [Bug #9221]

Tue Dec 10 23:44:42 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (rb_ary_hash): add salt to differentiate false and empty
	  array.  [ruby-core:58993] [Bug #9231]

	* hash.c (rb_any_hash, rb_hash_hash): ditto.

Tue Dec 10 18:16:09 2013  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* man/ruby.1: [DOC] Use www.ruby-toolbox.com instead of RAA.

Tue Dec 10 17:21:30 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (wmap_finalize, wmap_aset_update): use simple malloced array
	  instead of T_ARRAY, to reduce GC pressure.

Tue Dec 10 15:56:48 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c (reflist_add): revert changes from r44109. it is unnecessary
	  after r44113
	* gc.c (allrefs_i): fix whitespace
	* gc.c (allrefs_roots_i): fix whitespace

Tue Dec 10 15:46:03 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (allrefs_add): push obj only if allrefs table doesn't have
	  obj.

	* gc.c (allrefs_roots_i): ditto.

Tue Dec 10 15:28:10 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (RGENGC_CHECK_MODE): separate checkers to different modes.
	  * 2: enable generational bits check (for debugging)
	  * 3: enable livness check
	  * 4: show all references

Tue Dec 10 15:15:37 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_marks_check): disable GC during checking and
	  restore malloc_increase info.

Tue Dec 10 14:41:53 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c (reflist_add): return 0 if reference already exists
	* gc.c (allrefs_add): return 1 on newly added references
	* gc.c (allrefs_i): follow references to construct complete object
	  graph. before this patch, RGENGC_CHECK could fail to verify some WB
	  miss issues. [Bug #9226] [ruby-core:58959]

Tue Dec 10 11:20:56 2013  Aman Gupta <ruby@tmm1.net>

	* ext/objspace/objspace_dump.c (dump_object): include fstring flag on
	  strings. include gc flags (old, remembered, wb_protected) on all objects.
	* ext/objspace/objspace_dump.c (Init_objspace_dump): initialize lazy
	  IDs before first use.
	* gc.c (rb_obj_gc_flags): new function to retrieve object flags
	* internal.h (RB_OBJ_GC_FLAGS_MAX): maximum flags allowed for one obj
	* test/objspace/test_objspace.rb (test_dump_flags): test for above
	* test/objspace/test_objspace.rb (test_trace_object_allocations):
	  resolve name before dump (for rb_class_path_cached)

Tue Dec 10 07:48:29 2013  Aman Gupta <ruby@tmm1.net>

	* vm_method.c (rb_clear_method_cache_by_class): fire
	  ruby::method-cache-clear probe on global or klass-level method cache
	  clear [Bug #9190]
	* probes.d (provider ruby): new dtrace probe
	* doc/dtrace_probes.rdoc: docs for new probe
	* test/dtrace/test_method_cache.rb: test for new probe

Tue Dec 10 06:14:11 2013  Eric Hodel  <drbrain@segment7.net>

	* ext/.document:  Remove curses from documentable directories.

Tue Dec 10 04:55:36 2013  Zachary Scott  <e@zzak.io>

	* ext/openssl/lib/openssl/digest.rb: Deprecate OpenSSL::Digest::Digest
	  [Fixes GH-446] https://github.com/ruby/ruby/pull/446

Tue Dec 10 00:41:42 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* ext/thread/thread.c: [DOC] add call-seq alias for Queue#enq, #<<, etc.

	* ext/thread/thread.c (Init_thread): use rb_define_alias instead of
	  rb_alias to document alias.

Mon Dec  9 20:00:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* internal.h (RCLASS_SERIAL): Add RCLASS_SERIAL as a convenience
	  accessor for RCLASS_EXT(klass)->class_serial.

	* class.c, vm_insnhelper.c, vm_method.c: Use RCLASS_SERIAL

Mon Dec  9 19:50:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* compile.c, insns.def, test/ruby/test_rubyvm.rb, vm.c, vm_core.h,
	  vm_insnhelper.c, vm_insnhelper.h, vm_method.c: Rename method_serial
	  to global_method_state and constant_serial to global_constant_state
	  after discussion with ko1.

Mon Dec  9 18:50:43 2013  Aman Gupta <ruby@tmm1.net>

	* hash.c (rb_hash_replace): fix segv on `{}.replace({})` introduced
	  in r44060 [Bug #9230] [ruby-core:58991]
	* test/ruby/test_hash.rb: regression test for above

Mon Dec  9 18:10:10 2013  Koichi Sasada  <ko1@atdot.net>

	* vm.c (vm_stat): renamed from ruby_vm_stat.
	  Should not use ruby_ prefix here.

Mon Dec  9 16:13:31 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (wmap_size): add ObjectSpace::WeakMap#size and #length.

Mon Dec  9 15:26:17 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* test/test_curses.rb: removed.

Mon Dec  9 13:36:55 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* ext/curses, sample/curses: removed curses.

	* NEWS: added an entry for the above change.

Mon Dec  9 12:26:05 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/objspace/object_tracing.c (newobj_i): use cached class path
	  only to get rid object allocation during NEWOBJ hook.
	  [ruby-core:58853] [Bug #9212]

	* variable.c (rb_class_path_cached): returns cached class path
	  only, without searching and allocating new class path string.

Mon Dec  9 11:14:26 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/date/date_parse.c (parse_time): unset case-insensitive flag
	  for [:alpha:], which already implies both cases, to get rid of
	  backtrack explosion.  [ruby-core:58876] [Bug #9221]

Mon Dec  9 08:40:40 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master bf37240.  Fixes useless
	  error message with `gem install -g` with no gem dependencies file.
	* test/rubygems:  ditto.

Mon Dec  9 04:52:25 2013  Eric Hodel  <drbrain@segment7.net>

	* NEWS:  Update RubyGems entry with notable features.

Mon Dec  9 04:43:54 2013  Eric Hodel  <drbrain@segment7.net>

	* ext/.document:  Add syslog/lib and thread/thread.c to documentable
	  items.  [ruby-trunk - Bug #9228]

Mon Dec  9 04:28:50 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master 096db36.  Changes include
	  support for PATH in Gemfile.lock and a typo fix from Akira Matsuda.
	* test/rubygems:  ditto.

Mon Dec  9 02:10:32 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* lib/net/http/responses.rb:
	  Add `HTTPIMUsed`, as it is also supported by rack/rails.
	  RFC - http://tools.ietf.org/html/rfc3229
	  by Vipul A M <vipulnsward@gmail.com>
	  https://github.com/ruby/ruby/pull/447 fix GH-447

Sun Dec  8 20:47:35 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* class.c (rb_get_kwargs): when values is non-null, remove
	  extracted keywords from the rest keyword argument.

Sun Dec  8 20:26:54 2013  Yutaka Kanemoto  <kanemoto@ruby-lang.org>

	* common.mk (ruby.imp): avoid circular dependency on AIX

Sun Dec  8 20:21:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* bigdecimal.c (BigDecimal_coerce): convert a Float to a BigDecimal instead
	  of converting the receiver to a Float.  The reason is there are BigDecimal
	  instances with precisions that is smaller than the Float's precision.
	  [ruby-core:58756] [Bug #9192]

	* test/bigdecimal/test_bigdecimal.rb: add tests for the above change.

Sun Dec  8 18:28:20 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* NEWS: [DOC] update NEWS about GC.

Sun Dec  8 17:52:24 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* object.c: [DOC] document Module#singleton_class?.

Sun Dec  8 16:19:28 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* class.c (rb_get_kwargs): if optional is negative, unknown
	  keywords are allowed.

	* vm_insnhelper.c (vm_callee_setup_keyword_arg): check unknown
	  keywords.

Sun Dec  8 14:55:12 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* array.c (rb_ary_shuffle_bang, rb_ary_sample): rename local variables.

Sun Dec  8 13:59:38 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* array.c (rb_ary_shuffle_bang, rb_ary_sample): check
	  unknown keywords.

	* test/ruby/test_array.rb (test_shuffle, test_sample): tests for
	  the above.

Sun Dec  8 13:01:11 2013  Aman Gupta <ruby@tmm1.net>

	* vm.c (ruby_vm_stat): add RubyVM.stat() for access to internal cache
	  counters. this methods behaves like GC.stat, accepting an optional
	  hash or symbol argument. [Bug #9190] [ruby-core:58750]
	* test/ruby/test_rubyvm.rb: test for new method

Sun Dec  8 11:59:40 2013  Aman Gupta <ruby@tmm1.net>

	* hash.c (rb_hash_replace): add a write barrier to fix GC mark miss on
	  hashes using Hash#replace [Bug #9226] [ruby-core:58948]

Sun Dec  8 11:21:00 2013  Aman Gupta <ruby@tmm1.net>

	* include/ruby/ruby.h: add RGENGC_WB_PROTECTED_NODE_CREF setting
	  In a large app, this reduces the size of
	  remembered_shady_object_count by 80%. [Bug #9225] [ruby-core:58947]
	* gc.c (rb_node_newnode): add FL_WB_PROTECTED flag to NODE_CREF
	* class.c (rewrite_cref_stack): insert OBJ_WRITE for NODE_CREF
	* iseq.c (set_relation): ditto
	* iseq.c (rb_iseq_clone): ditto
	* vm_eval.c (rb_yield_refine_block): ditto
	* vm_insnhelper.c (vm_cref_push): ditto
	* vm_insnhelper.h (COPY_CREF): ditto

Sun Dec  8 10:45:05 2013  Aman Gupta <ruby@tmm1.net>

	* hash.c (hash_aset_str): revert r43870 due to performance issue
	  [Bug #9188] [ruby-core:58730]
	* parse.y (assoc): convert literal string hash keys to fstrings
	* test/ruby/test_hash.rb (class TestHash): expand test

Sun Dec  8 10:22:38 2013  Aman Gupta <ruby@tmm1.net>

	* parse.y (register_symid_str): use fstrings in symbol table
	  [Bug #9171] [ruby-core:58656]
	* parse.y (rb_id2str): ditto
	* string.c (rb_fstring): create frozen_strings on first usage. this
	  allows rb_fstring() calls from the parser (before cString is created)
	* string.c (fstring_set_class_i): set klass on fstrings generated
	  before cString was defined
	* string.c (Init_String): convert frozen_strings table to String
	  objects after boot
	* ext/-test-/symbol/type.c (bug_sym_id2str): expose rb_id2str()
	* test/-ext-/symbol/test_type.rb (module Test_Symbol): verify symbol
	  table entries are fstrings

Sun Dec  8 10:24:20 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems.rb:  Update version for upcoming ruby 2.1.0 RC.

Sun Dec  8 10:21:36 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master 14749ce.  This fixes bugs
	  handling of gem dependencies lockfiles (Gemfile.lock).

	* test/rubygems:  ditto.

Sun Dec  8 09:40:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* array.c (rb_ary_or): use RHASH_TBL_RAW instead of RHASH_TBL

	* process.c (rb_execarg_fixup): use RHASH_TBL_RAW and insert write
	  barriers where appropriate

	* vm.c (kwmerge_i): use RHASH_TBL_RAW

	* vm.c (HASH_ASET): use rb_hash_aset instead of calling directly into
	  st_insert

Sat Dec  7 11:15:52 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (rb_hash_reject): copy unrejected elements only to new hash,
	  so that the change on the original receiver can affect.
	  [ruby-core:58914] [Bug #9223]

Sat Dec  7 08:25:00 2013  Richo Healey  <richo@psych0tik.net>

	* test/ruby/test_struct.rb: Add regression test for question marks and
	  bangs in struct members. [Closes GH-468]

Fri Dec  6 19:33:39 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* class.c (rb_extract_keywords, rb_get_kwargs): move from
	  vm_insnhelper.c.

Fri Dec  6 19:18:02 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: change oldmalloc meaning.
	  Increase oldmalloc_increase with malloc_increase
	  instead of using obj_memsize_of().

	  This change will avoid the danger of memory full without major GC.

Fri Dec  6 19:08:48 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (atomic_sub_nounderflow): not 0 but val itself.

Fri Dec  6 18:37:11 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rb_objspace_alloc, Init_heap): initialize
	  oldmalloc_increase_limit at Init_heap.

	  rb_objspace_alloc() is not called on some platforms.

Fri Dec  6 18:33:39 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (garbage_collect_body): bug fix.
	  initialize after recording.

Fri Dec  6 17:49:46 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (atomic_sub_nounderflow): added to simplify atomic sub with
	  care about underflow.

	* gc.c (objspace_malloc_increase): use it.

Fri Dec  6 17:10:44 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_insnhelper.c (rb_get_kwargs): get keyword argument values from an
	  option hash, not only checking keys.

	* dir.c (dir_initialize): use rb_get_kwargs.

	* gc.c (gc_start_internal): ditto.

Fri Dec  6 16:47:45 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* misc/ruby-mode.el (ruby-brace-to-do-end): split single line block.

	* misc/ruby-mode.el (ruby-do-end-to-brace): shrink single line block
	  to one line.

Fri Dec  6 16:16:30 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_start_internal): do not use rb_gc_start() and rb_gc().

Fri Dec  6 15:24:30 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_start_internal, rb_gc): do not need
	  heap_pages_free_unused_pages() here.
	  It was done in after_sweep().

	* gc.c (rb_gc): The reason is now GPR_FLAG_CAPI.

Fri Dec  6 14:05:19 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c (gc_start_internal): GC.start() now accepts two optional
	  keyword arguments. These can be used to disable full_mark (minor
	  mark only) or disable immediate_sweep (use lazy sweep). These new
	  options are useful for benchmarking GC behavior, or performing minor
	  GC out-of-band.
	* test/ruby/test_gc.rb (class TestGc): tests for new options.

Fri Dec  6 11:51:28 2013  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* lib/erb.rb: [DOC] fix broken link, Use rubygems.org and www.ruby-toolbox.com instead of RAA.
	  [Bug #9197]

Fri Dec  6 10:50:54 2013  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* lib/webrick/httprequest.rb: [DOC] Fix broken link of CGI specification by @udzura [fix GH-466]

Thu Dec  6 01:27:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (GetVpValueWithPrec):
	  treat 0.0 and -0.0 of floating-point numbers specially for an optimization
	  and to correctly propagate its signbit to the result.
	  [Bug #9214] [ruby-core:58858]

	* test/bigdecimal/test_bigdecimal.rb: add tests case for the above change.

	* test/bigdecimal/test_bigdecimal_util.rb: ditto.

Thu Dec  5 22:18:01 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (configuration): strip destdir part from prefix to get
	  rid of duplication.  a patch by arton at [ruby-core:58859].
	  [ruby-core:58856] [Bug #9213]

Thu Dec  5 21:53:29 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (rb_ary_or): lhs elements are preferred, so should not
	  replace with rhs elements.

	* test/ruby/test_array.rb (test_OR_in_order): import the test failed
	  by r43969 from rubyspec/core/array/union_spec.rb.

Thu Dec  5 21:05:42 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_info_decode): fix to avoid syntax error on VS2012.

Thu Dec  5 19:35:35 2013  Martin Duerst <duerst@it.aoyama.ac.jp>

	* st.c: tweaked comment

Thu Dec  5 19:21:10 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c (struct rb_objspace): rename internal last_collection_flags to
	  latest_gc_info
	* gc.c (gc_latest_collection_info): add GC.latest_gc_info() with similar
	  behavior to GC.stat()
	* gc.c (rb_gc_latest_gc_info): new c-api for above
	* gc.c (gc_stat_internal): remove :last_collection_flags from GC.stat
	* gc.c (gc_profile_decode_flags): remove GC::Profiler.decode_flags
	* include/ruby/intern.h (rb_gc_latest_gc_info): export new c-api
	* test/ruby/test_gc.rb (class TestGc): test for new behavior
	* NEWS: note about new api

	* gc.c (gc_stat_internal): raise TypeError on wrong type
	* gc.c (gc_stat): fix error message

Thu Dec  5 18:18:08 2013  Aman Gupta <ruby@tmm1.net>

	* ext/objspace/gc_hook.c: remove this file
	* ext/-test-/tracepoint/gc_hook.c: new filename for above
	* ext/objspace/objspace.c: remove ObjectSpace.after_gc_start_hook=
	* test/objspace/test_objspace.rb: remove test
	* test/-ext-/tracepoint/test_tracepoint.rb: add above test for
	  tracepoint re-entry

Thu Dec  5 17:44:53 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: change function names vm_ prefix to objspace_ prefix.
	  They are objspace_ functionality.

Thu Dec  5 16:11:04 2013  Aman Gupta <ruby@tmm1.net>

	* include/ruby/intern.h: add rb_gc_stat() for access to GC.stat
	  variables from c-api
	* gc.c (rb_gc_stat): new c-api method. accepts either VALUE hash like
	  GC.stat, or VALUE symbol key and returns size_t directly. the second
	  form is useful to avoid allocations, i.e. for usage inside
	  INTERNAL_EVENT_GC tracepoints.
	* gc.c (gc_stat): add GC.stat(:key) to return single value instead of hash
	* gc.c (gc_stat_internal): helper method to retrieve single or all stat values
	* test/ruby/test_gc.rb (class TestGc): test for new behavior
	* NEWS: note about this new api

Thu Dec  5 14:40:41 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (rb_hash): revert r43981 and bail out to the outermost frame
	  when recursion is detected.

Thu Dec  5 13:47:15 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (vm_malloc_size): added.
	  return malloc_usable_size() if possible.

	* gc.c (MALLOC_ALLOCATED_SIZE): add new setting macro to enable
	  GC.allocated_size.
	  If platform supports `malloc_usable_size()' (or similar one),
	  GC.allocated_size can be implemented with this function.
	  Default is 0.

	* gc.c (vm_xmalloc, vm_xrealloc, vm_xfree): use vm_malloc_size()
	  to detect collect allocated size.

	* gc.c (vm_malloc_increase): refactoring.

Thu Dec  5 13:19:03 2013  Aman Gupta <ruby@tmm1.net>

	* include/ruby/ruby.h: remove INTERNAL_EVENT_GC_END and replace with
	  two new events: GC_END_MARK and GC_END_SWEEP
	* gc.c (gc_after_sweep): emit GC_END_SWEEP after lazy sweep is done
	* gc.c (gc_marks_body): emit GC_END_MARK at end of minor/major mark
	* ext/-test-/tracepoint/tracepoint.c (struct tracepoint_track): tests
	  for new events.
	* test/-ext-/tracepoint/test_tracepoint.rb (class TestTracepointObj):
	  ditto.
	* NEWS: remove ObjectSpace.after_gc_*_hook. These are only a sample,
	  and will be removed before ruby 2.1.
	* ext/objspace/gc_hook.c: remove ObjectSpace.after_gc_end_hook=

Thu Dec  5 10:47:56 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ruby_atomic.h (ATOMIC_PTR_EXCHANGE): atomic exchange function for
	  a generic pointer.

Thu Dec  5 10:47:09 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (finalize_deferred): flush all deferred finalizers while other
	  finalizers can get ready to run newly by lazy sweep.
	  [ruby-core:58833] [Bug #9205]

Thu Dec  5 09:07:59 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c (ruby_gc_set_params): Accept safe_level argument so GC tuning
	  settings can be applied before rb_safe_level() is available.
	* internal.h (rb_gc_set_params): ditto.
	* ruby.c (process_options): Apply GC tuning early during boot process
	  so boot-time allocations can benefit. This also benefits any code
	  loaded in via `ruby -r`.

Wed Dec  4 13:02:13 2013  Aman Gupta <ruby@tmm1.net>

	* vm_trace.c (rb_suppress_tracing): Fix initialization of stack
	  allocated rb_trace_arg_t structure. Without this patch, sometimes
	  INTERNAL_EVENT_GC would be skipped accidentally inside
	  rb_threadptr_exec_event_hooks_orig().

Wed Dec  4 12:57:24 2013  Aman Gupta <ruby@tmm1.net>

	* string.c (fstr_update_callback): Improve implementation in r43968
	  based on feedback from @nagachika. In the existing case, we can
	  return ST_STOP to prevent any hash modification. In the !existing
	  case, set both key and value to the fstr.

Wed Dec  4 12:47:54 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/delegate.rb (Delegator#method_missing): ignore the target if not
	  set, and delegate to global methods.  [ruby-core:58572] [Bug #9155]

	* lib/delegate.rb (Delegator#respond_to_missing): ditto.

	* lib/delegate.rb (SimpleDelegator#__getobj__): yield and return if
	  not delegated but a block is given, like as Hash#fetch.

	* lib/delegate.rb (DelegateClass#__getobj__): ditto.

Tue Dec  3 23:48:18 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: check malloc_size() availability.

	* gc.c: use malloc_size() with malloc/malloc.h if available.

Tue Dec  3 23:06:20 2013  Narihiro Nakamura  <authornari@gmail.com>

	* object.c (rb_obj_clone): don't copy FL_WB_PROTECTED of a
	  original object.

Tue Dec  3 22:32:18 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (rb_hash_recursive): make similar (recursive) constructs
	  return same hash value.  execute recursively, and rewind to the
	  topmost frame with an object which .eql? to the recursive
	  object, if recursion is detected.

	* hash.c (rb_hash): detect recursion for all `hash' methods.  each
	  `hash' methods no longer need to use rb_exec_recursive().

Tue Dec  3 21:53:15 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_eval.c (rb_catch_protect): new function similar to
	  rb_catch_obj(), but protect from all global jumps like as
	  rb_load_protect(), rb_protect(), etc.

Tue Dec  3 20:18:46 2013  Narihiro Nakamura  <authornari@gmail.com>

	* object.c (rb_obj_clone): Protect FL_PROMOTED and FL_WB_PROTECTED
	  flags of a destination object.

Tue Dec  3 20:16:38 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_hash_rehash): use hash_alloc() instead of rb_hash_new(),
	  to hide temporary object from ObjectSpace.  [Bug #9187]

Tue Dec  3 17:11:47 2013  Aman Gupta <ruby@tmm1.net>

	* load.c (features_index_add_single): Move loaded_features_index array values off
	  the ruby heap. [Bug #9201] [ruby-core:58805]
	* load.c (loaded_features_index_clear_i): Clean up off-heap array structure.
	* vm.c (rb_vm_mark): Remove unnecessary mark_tbl for loaded_features_index.
	  This improves minor GC time by 15% in a large application.

Tue Dec  3 17:01:45 2013  Aman Gupta <ruby@tmm1.net>

	* include/ruby/ruby.h (struct RClass): Add wrapper struct around
	  RClass->m_tbl with serial. This prevents double marking method
	  tables, since many classes/modules can share the same method table.
	  This improves minor mark time in a large application by 30%.
	* internal.h (struct method_table_wrapper): Define new
	  wrapper struct with additional serial.
	* internal.h (RCLASS_M_TBL_INIT): New macro for initializing method
	  table wrapper and st_table.
	* method.h (void rb_sweep_method_entry): Rename rb_free_m_table to
	  rb_free_m_tbl for consistency
	* .gdbinit (define rb_method_entry): Update rb_method_entry gdb helper
	  for new method table structure.
	* class.c: Use RCLASS_M_TBL_WRAPPER and
	  RCLASS_M_TBL_INIT macros.
	* class.c (rb_include_class_new): Share WRAPPER between module and
	  iclass, so serial can prevent double marking.
	* eval.c (rb_prepend_module): ditto.
	* eval.c (rb_using_refinement): ditto.
	* gc.c: Mark and free new wrapper struct.
	* gc.c (obj_memsize_of): Count size of additional wrapper struct.

Tue Dec  3 14:05:49 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_uniq_bang): remove duplicate code.

Tue Dec  3 13:40:42 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (ary_add_hash): set and return values because string keys
	  will be frozen. [ruby-core:58809] [Bug #9202]

	* array.c (rb_ary_uniq_bang): ditto.

	* array.c (rb_ary_or): ditto.

	* array.c (rb_ary_uniq): ditto.

	* test/ruby/test_array.rb: tests for above.

	The patch is from normalperson (Eric Wong).

Tue Dec  3 12:20:21 2013  Aman Gupta <ruby@tmm1.net>

	* string.c (rb_fstring): Use st_update instead of st_lookup +
	  st_insert.
	* string.c (fstr_update_callback): New callback for st_update.

Tue Dec  3 12:17:59 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/rdoc/constant.rb (RDoc::Constant#documented?): workaround for
	  NoMethodError when the original of alias is not found.

Tue Dec  3 10:43:58 2013  Eric Hodel  <drbrain@segment7.net>

	* ext/openssl/lib/openssl/buffering.rb:  Return ASCII-8BIT strings from
	  SSLSocket methods.  [ruby-trunk - Bug #9028]
	* test/openssl/test_ssl.rb:  Test for the above.

Tue Dec  3 09:42:27 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rdoc:  Update to RDoc master 900de99.  Changes include:

	  Fixed documentation display of constants

	  Fixed handling of unknown parsers

	* test/rdoc:  ditto.

Mon Dec  2 22:30:10 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* hash.c (getenv): fixed test failures introduced by r43950.
	  [ruby-core:58774] [Bug #9195] reported by phasis68 (Heesob Park).

Mon Dec  2 21:49:19 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* hash.c (rb_hash_rehash): make temporary st_table under the control
	  of GC. [Bug #9187]

	* test/ruby/test_hash.rb: add a test for above.

Mon Dec  2 17:23:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* variable.c (rb_mod_constants): when calling Module#constants with
	  inherit=false, there is no need to use a hashtable to deduplicate
	  constant names. [Feature #9196] [ruby-core:58786]

Mon Dec  2 14:16:52 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/net/smtp.rb (Net::SMTP#critical):  Always return a
	  Net::SMTP::Response.  Patch by Pawel Veselov.
	  [ruby-trunk - Bug #9125]
	* test/net/smtp/test_smtp.rb:  Test for the above.

Mon Dec  2 05:52:33 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master baa965b.  Notable changes:

	  Copy directories to lib/ when installing extensions.  This completes
	  the fix for [ruby-trunk - Bug #9106]

	* test/rubygems:  ditto.

Mon Dec  2 02:03:47 2013  Shota Fukumori  <her@sorah.jp>

	* test/ruby/test_case.rb (test_nomethoderror):
	  Add test related to r43913, r43914

Mon Dec  2 00:53:01 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* hash.c (getenv): use ANSI codepage version of getenv() for miniruby
	  on Windows.
	  [ruby-core:58732] [Bug #9189] reported by phasis68 (Heesob Park).

Sun Dec  1 22:14:27 2013  Zachary Scott  <e@zzak.io>

	* doc/contributors.rdoc: [DOC] Import contributors from redmine wiki
	  Many wiki pages have become outdated and spam-ridden, we will import
	  these to trunk and begin maintaining them in ruby-trunk. This will
	  also allow new contributors to easily contribute patches to update
	  these pages, where previously a redmine account with wiki access was
	  required. Another bonus is having a contributors file to show thanks
	  to all of the people who have submitted a patch to Ruby.

Sun Dec  1 18:03:26 2013  Zachary Scott  <e@zzak.io>

	* doc/maintainers.rdoc: [DOC] Current maintainers of Ruby

Sun Dec  1 17:17:36 2013  Zachary Scott  <e@zzak.io>

	* doc/contributing.rdoc: [DOC] Current branch maintainers

Sun Dec  1 17:16:36 2013  Zachary Scott  <e@zzak.io>

	* doc/contributing.rdoc: [DOC] Reporting other (ruby-lang.org) issues

Sun Dec  1 17:15:51 2013  Zachary Scott  <e@zzak.io>

	* doc/contributing.rdoc: [DOC] Current platform maintainers

Sun Dec  1 17:14:55 2013  Zachary Scott  <e@zzak.io>

	* doc/contributing.rdoc: [DOC] Reporting downstream distro issues

Sun Dec  1 14:37:20 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* hash.c (rb_hash_to_a): specify array capa.

Sun Dec  1 14:15:36 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* hash.c (rb_hash_rehash): fix to free new st_table when exception
	  is raised in do_hash(). [Bug #9187]

Sun Dec  1 11:57:59 2013  Zachary Scott  <e@zzak.io>

	* ext/openssl/lib/openssl/buffering.rb: Fix warning in copyright

Sun Dec  1 08:27:28 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master 66e5c39.  Notable changes:

	  Implement gem.deps.rb (Gemfile) .lock support

	  Fixed `gem uninstall` for a relative directory in GEM_HOME.

	* test/rubygems:  ditto.

Sun Dec  1 06:00:49 2013  Aman Gupta <ruby@tmm1.net>

	* test/ruby/test_gc.rb (test_gc_reason): Force minor GC by consuming
	  free slots to fix test.

Sat Nov 30 21:22:11 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (dir_initialize): check unknown keywords.  [ruby-dev:47152]
	  [Bug #8060]

Sat Nov 30 18:05:38 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/win32ole/win32ole.c (hash2named_arg): correct declaration to fix
	  build failure.  a patch by phasis68 (Heesob Park) at
	  [ruby-core:58710].  [Bug #9184]

Sat Nov 30 17:46:35 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (ruby_cleanup): determine exit status and signal to terminate
	  before finalization, to get rid of access destroyed T_DATA exception
	  object.  [ruby-core:58643] [Bug #9167]

Sat Nov 30 16:25:14 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enumerator.c (enumerator_with_index): should not store local variable
	  address to memoize the arguments.  it is invalidated after the return.
	  [ruby-core:58692] [Bug #9178]

Sat Nov 30 13:28:13 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* siphash.c (sip_hash24): fix for aligned word access little endian
	  platforms.  [ruby-core:58658] [Bug #9172]

Sat Nov 30 13:21:15 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_eval.c (rb_yield_block): implement non-nil block argument.

Fri Nov 29 20:59:39 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* vm_dump.c (rb_vmdebug_debug_print_pre): Bugfix. Get PC directly.
	  PC is cached into local stack and cfp->pc is incorrect at next of
	  branch or jump.
	* vm_exec.h (DEBUG_ENTER_INSN): catch up this change.
	* vm_core.h: update signature of rb_vmdebug_debug_print_pre.

Fri Nov 29 20:43:57 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* compile.c: Bugsfix for dump_disasm_list.
	  rb_inspect denies a hidden object. So, insert wrapper that creates
	  the unhidden one.
	  adjust->label is null sometimes.
	  insn_data_line_no makes no sense at all.

Fri Nov 29 18:06:45 2013  Shota Fukumori  <her@sorah.jp>

	* test/ruby/test_case.rb (test_method_missing): Test for r43913.

Fri Nov 29 17:53:22 2013  Shota Fukumori  <her@sorah.jp>

	* vm_insnhelper.c (check_match): Fix SEGV with VM_CHECKMATCH_TYPE_CASE
	  and class of `pattern` has `method_missing`
	  [Bug #8872] [ruby-core:58606]

Fri Nov 29 17:06:09 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_eval.c (rb_yield_block): yield block with rb_block_call_func
	  arguments.

	* range.c (range_each): use rb_yield_block.

	* include/ruby/ruby.h (RB_BLOCK_CALL_FUNC_ARGLIST): constify argv.

	* enum.c (rb_enum_values_pack): ditto.

	* vm_eval.c (rb_block_call, rb_check_block_call): ditto.

	* include/ruby/ruby.h (RB_BLOCK_CALL_FUNC_ARGLIST): for declaration
	  argument list of rb_block_call_func.

Fri Nov 29 11:26:43 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/ruby.h (rb_block_call_func): add blockarg.  block
	  function can take block argument, e.g., proc {|&blockarg| ...}.

Thu Nov 28 21:43:48 2013  Zachary Scott  <e@zzak.io>

	* doc/dtrace_probes.rdoc: [DOC] Import dtrace probes doc from wiki

Thu Nov 28 21:17:32 2013  Zachary Scott  <e@zzak.io>

	* doc/contributing.rdoc: [DOC] Add heading above ChangeLog tips to
	  setup entry for commits, its not required. Actually easier if
	  contributors don't include a ChangeLog entry.

Thu Nov 28 21:16:18 2013  Zachary Scott  <e@zzak.io>

	* doc/contributing.rdoc: [DOC] Add coding style heading for patch
	  rules

Thu Nov 28 21:15:45 2013  Zachary Scott  <e@zzak.io>

	* doc/contributing.rdoc: [DOC] Add notes about deciding what to patch

Thu Nov 28 19:43:45 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* benchmark/bm_hash_flatten.rb: added. r43896 is about 4 times faster
	  than 2.0.0p353.

	* benchmark/bm_hash_keys.rb: added. r43896 is about 5 times faster
	  than 2.0.0p353.

	* benchmark/bm_hash_values.rb: added. r43896 is about 5 times faster
	  than 2.0.0p353.

Thu Nov 28 19:29:04 2013  Zachary Scott  <e@zzak.io>

	* doc/contributing.rdoc: [DOC] Add notes about slideshow proposals
	  from wiki page: HowToRequestFeatures

Thu Nov 28 17:34:42 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* st.c: add st_values() and st_values_check().

	* include/ruby/st.h: add prototypes for above.

	* hash.c (rb_hash_values): use st_values_check() for performance
	  improvement if VALUE and st_data_t are compatible.

Thu Nov 28 17:14:14 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* st.c (st_keys): fix not to use Qundef in st.c.

	* include/ruby/st.h: define modified prototype.

	* hash.c (rb_hash_keys): use modified st_keys().

Thu Nov 28 16:34:43 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c: Expose details about last garbage collection via GC.stat.
	* gc.c (gc_stat): Add :last_collection_flags for reason/trigger/type of
	  last GC run.
	* gc.c (gc_prof_sweep_timer_stop): Record HAVE_FINALIZE GPR even
	  without GC_PROFILE_MORE_DETAIL.
	* gc.c (gc_profile_flags): Add GC::Profiler.decode_flags to make sense
	  of GC.stat[:last_collection_flags]
	* test/ruby/test_gc.rb (class TestGc): Test for above.

Thu Nov 28 16:15:47 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (rb_w32_dup2): extract from rb_cloexec_dup2() and
	  redirect_dup2().

Tue Nov 28 14:40:00 2013  Akira Matsuda  <ronnie@dio.jp>

	* lib/drb/ssl.rb:  [Doc] Fix typo

Thu Nov 28 13:56:05 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (Doxyfile): tool/file2lastrev.rb needs running with
	  BASERUBY since r43617.  [ruby-dev:47823] [Bug #9169]

Thu Nov 28 09:18:39 2013  Koichi Sasada  <ko1@atdot.net>

	* string.c (rb_fstring): fstrings should be ELTS_SHARED.
	  If we resurrect dying objects (non-marked, but not swept yet),
	  pointing shared string can be collected.
	  To avoid such issue, fstrings (recorded to fstring_table)
	  should not be ELTS_SHARED (should not have a shared string).

Thu Nov 28 01:35:08 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* st.c (st_keys): fix to use st_index_t for size of hash.

Thu Nov 28 00:36:52 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* st.c (st_keys): define st_keys(). it writes each key to buffer.

	* hash.c (rb_hash_keys): use st_keys() for performance improvement
	  if st_data_t and VALUE are compatible.

	* include/ruby/st.h: define macro ST_DATA_COMPATIBLE_P() to predicate
	  whether st_data_t and passed type are compatible.

	* configure.in: check existence of builtin function to use in
	  ST_DATA_COMPATIBLE_P().

Thu Nov 28 00:07:28 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* ruby_atomic.h: remove duplicate definitions between ATOMIC_XXX
	  and ATOMIC_SIZE_XXX.

Wed Nov 27 23:55:50 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* ruby_atomic.h: define ATOMIC_SIZE_CAS() with
	  __atomic_compare_exchange_n() and refactoring.

Tue Nov 27 21:43:00 2013  Akira Matsuda  <ronnie@dio.jp>

	* lib/irb/notifier.rb:  [Doc] Fix typo
	* ext/json/lib/json/common.rb:  Ditto.

Tue Nov 27 18:04:57 2013  Akira Matsuda  <ronnie@dio.jp>

	* lib/irb/notifier.rb:  Fix typo

Wed Nov 27 17:54:57 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_mark_stacked_objects): check only when check_mode > 0.

Wed Nov 27 16:07:19 2013  Aman Gupta <ruby@tmm1.net>

	* test/ruby/test_gc.rb (class TestGc): Fix warning in
	  test_expand_heap.

Wed Nov 27 15:55:52 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c (Init_GC): Add new GC::INTERNAL_CONSTANTS for information about
	  GC heap/page/slot sizing.
	* test/ruby/test_gc.rb (class TestGc): test for above.

Wed Nov 27 15:21:17 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c (gc_page_sweep): Fix compile warning from last commit.
	* hash.c (hash_aset_str): Re-use existing variable to avoid
	  unnecessary pointer dereferencing.

Wed Nov 27 15:12:55 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_page_sweep): disable debug print.

Wed Nov 27 15:05:59 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_stat): add new information heap_eden_page_length and
	  heap_tomb_page_length.

	* test/ruby/test_gc.rb: fix to use GC.stat[:heap_eden_page_length]
	  instead of GC.stat[:heap_length].
	  This test expects `heap_eden_page_length' (used pages size).

Wed Nov 27 15:02:53 2013  Aman Gupta <ruby@tmm1.net>

	* test/ruby/test_eval.rb (class TestEval): Use assert_same instead of
	  assert_equal.
	* test/ruby/test_hash.rb (class TestHash): ditto.
	* test/ruby/test_iseq.rb (class TestISeq): ditto.

Wed Nov 27 14:50:02 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rinda/ring.rb:  Announce RingServer for the same process.
	  [ruby-trunk - Bug #9163]
	* test/rinda/test_rinda.rb:  Tests for the above.

Wed Nov 27 14:37:33 2013  Aman Gupta <ruby@tmm1.net>

	* test/ruby/test_eval.rb (class TestEval): Add test for shared eval
	  filenames via rb_fstring().
	* test/ruby/test_iseq.rb (class TestISeq): Add test for shared
	  iseq labels via rb_fstring(). [Bug #9159]

Wed Nov 27 14:24:55 2013  Aman Gupta <ruby@tmm1.net>

	* hash.c (hash_aset_str): Use rb_fstring() to de-duplicate hash string
	  keys. Patch by Eric Wong. [Bug #8998] [ruby-core:57727]
	* test/ruby/test_hash.rb (class TestHash): test for above.

Wed Nov 27 10:39:39 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c: Rename rb_heap_t members:
	    used -> page_length
	    limit -> total_slots

Wed Nov 27 08:24:49 2013  Aman Gupta <ruby@tmm1.net>

	* compile.c: Use rb_fstring() to de-duplicate string literals in code.
	  [ruby-core:58599] [Bug #9159] [ruby-core:54405]
	* iseq.c (prepare_iseq_build): De-duplicate iseq labels and source
	  locations.
	* re.c (rb_reg_initialize): Use rb_fstring() for regex string.
	* string.c (rb_fstring): Handle non-string and already-fstr arguments.
	* vm_eval.c (eval_string_with_cref): De-duplicate eval source
	  filename.

Wed Nov 27 07:13:54 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych.rb: psych version 2.0.2
	* ext/psych/psych.gemspec: ditto

Wed Nov 27 06:40:18 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych/scalar_scanner.rb: fix support for negative
	  years.
	* ext/psych/lib/psych/visitors/yaml_tree.rb: ditto
	* test/psych/test_date_time.rb: test for change.
	  Fixes: https://github.com/tenderlove/psych/issues/168

Wed Nov 27 04:46:55 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych/scalar_scanner.rb: fix regexp for matching TIME
	  strings.
	* test/psych/test_date_time.rb: test for change.
	  Fixes: https://github.com/tenderlove/psych/issues/171

Wed Nov 27 02:26:58 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (str_new4): copy the original capacity so that memsize of
	  frozen shared string returns correct size.

Wed Nov 27 02:20:13 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (rb_ary_hash): should not ignore the rest of recursive
	  constructs.

	* hash.c (rb_hash_hash): ditto.

	* range.c (range_hash): ditto.

	* struct.c (rb_struct_hash): ditto.

	* test/-ext-/test_recursion.rb (TestRecursion): separate from
	  test/ruby/test_thread.rb.

Tue Nov 26 22:43:36 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (rb_hash): cut off if recursion detected to get rid of stack
	  overflow.  [ruby-core:58567] [Bug #9151]

Tue Nov 26 20:02:39 2013  Koichi Sasada  <ko1@atdot.net>

	* test/ruby/test_settracefunc.rb: add tests for a_call/a_return
	  by Brandur <brandur@mutelight.org> [Feature #9120]

Tue Nov 26 19:29:52 2013  Koichi Sasada  <ko1@atdot.net>

	* common.mk: add useful config "set breakpoint pending on"
	  for run.gdb.

Tue Nov 26 19:17:47 2013  Koichi Sasada  <ko1@atdot.net>

	* ext/objspace/object_tracing.c (newobj_i): skip class_path if class
	  is frozen.

	  rb_class_path() can modify frozen classes (and causes errors).
	  This patch is temporary. We need no-modification/no-allocation
	  class path function.

Tue Nov 26 18:12:13 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_trace.c: skip "exception check" and "reentrant check (only normal
	  events)  for internal events.

	  Reentrant check for internal events are remaining.

Tue Nov 26 17:38:16 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_trace.c: prohibit to specify normal events and internal events
	  simultaneously.
	  I will introduce special care for internal events later.

	* ext/-test-/tracepoint/tracepoint.c: test this behavior.

	* test/-ext-/tracepoint/test_tracepoint.rb: ditto.

Tue Nov 26 16:30:31 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_readlink): fix buffer overflow on a long symlink. since
	  rb_str_modify_expand() expands from its length but not its capacity,
	  need to set the length properly for each expansion.
	  [ruby-core:58592] [Bug #9157]

Tue Nov 26 14:23:17 2013  Aman Gupta <ruby@tmm1.net>

	* ext/objspace/objspace_dump.c (dump_append_string_value): Escape
	  control characters for strict json parsers.
	* ext/objspace/objspace_dump.c (objspace_dump): Document File/IO
	  output option.

Tue Nov 26 11:43:19 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* ruby_atomic.h: use __atomic builtin functions supported by GCC.
	  __sync family are legacy functions now and it is recommended
	  that new code use the __atomic functions.
	  http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html

	* configure.in: check existence of __atomic functions.

Tue Nov 26 10:57:49 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.gemspec: revert Gem::Specification#date
	  for snapshot/release tarballs.

Tue Nov 26 06:42:50 2013  Aman Gupta <ruby@tmm1.net>

	* NEWS: Add ObjectSpace.after_gc_{start,end}_hook=
	* ext/objspace/objspace_dump.c: [DOC] catch up dump/dump_all to r43679

Tue Nov 26 04:12:10 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master 612f85a.  Notable changes:

	  Fixed installation and activation of git: and path: gems via
	  Gem.use_gemdeps

	  Improved documentation coverage

	* test/rubygems:  ditto.

Mon Nov 25 22:23:03 2013  Zachary Scott  <e@zzak.io>

	* lib/xmlrpc.rb: [DOC] Fix link to xmlrpc4r site [Bug #9148]
	  Patch by Giorgos Tsiftsis

Mon Nov 25 19:48:10 2013  Zachary Scott  <e@zzak.io>

	* lib/uri/common.rb: [DOC] typo fixes by @vipulnsward [Fixes GH-456]
	  https://github.com/ruby/ruby/pull/456
	* lib/uri/generic.rb: [DOC] ditto.

Mon Nov 25 14:34:42 2013  Zachary Scott  <e@zzak.io>

	* ext/bigdecimal/bigdecimal.gemspec: bump BigDecimal to 1.2.3 for
	  proper release date in RubyGems

Mon Nov 25 14:25:08 2013  Zachary Scott  <e@zzak.io>

	* ext/bigdecimal/bigdecimal.gemspec: Remove Gem::Specification#date
	  We should rely on rubygems to create the date the gem was released
	  for each version.

Mon Nov 25 06:53:30 2013  Koichi Sasada  <ko1@atdot.net>

	* internal.h: do not use ruby_sized_xrealloc() and ruby_sized_xfree()
	  if HAVE_MALLOC_USABLE_SIZE (or _WIN32) is defined.

	  We don't need these function if malloc_usable_size() is available.

	* gc.c: catch up this change.

	* gc.c: define HAVE_MALLOC_USABLE_SIZE on _WIN32.

	* array.c (ary_resize_capa): do not use ruby_sized_xfree() with
	  local variable to avoid "unused local variable" warning.
	  This change only has few impact.

	* string.c (rb_str_resize): ditto.

Mon Nov 25 05:05:04 2013  Koichi Sasada  <ko1@atdot.net>

	* test/-ext-/tracepoint/test_tracepoint.rb: catch up GC.stat changes
	  at r43835.

Mon Nov 25 04:45:59 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: continue to change OLDSPACE -> OLDMALLOC.
	  RGENGC_ESTIMATE_OLDSPACE -> RGENGC_ESTIMATE_OLDMALLOC.

	* gc.c: add a new major GC reason GPR_FLAG_MAJOR_BY_OLDMALLOC.

Mon Nov 25 04:16:09 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: change terminology "..._num" to "..._slots" about slot operation.
	  * final_num -> final_slots
	  * objspace_live_num() -> objspace_live_slots()
	  * objspace_limit_num() -> objspace_limit_slots()
	  * objspace_free_num() -> objspace_free_slots()

Mon Nov 25 04:03:12 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_stat): add internal information.
	  * heap_swept_slot
	  * malloc_increase
	  * malloc_limit
	  * remembered_shady_object
	  * remembered_shady_object_limit
	  * old_object
	  * old_object_limit
	  * oldmalloc_increase
	  * oldmalloc_limit

	* gc.c (gc_stat): rename names.
	  * heap_live_num -> heap_live_slot
	  * heap_free_num -> heap_free_slot
	  * heap_final_slot -> heap_final_slot

	  Quote from RDoc of GC.stat():
	    "The contents of the hash are implementation specific and may
	    be changed in the future."

	* test/ruby/test_gc.rb: catch up this change.

Mon Nov 25 03:59:45 2013  Koichi Sasada  <ko1@atdot.net>

	* test/ruby/test_gc.rb: catch up last commit.
	  Now RUBY_GC_OLDSPACE_LIMIT(...) is RUBY_GC_OLDMALLOC_LIMIT(...).

Mon Nov 25 03:10:46 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: change terminology OLDSPACE -> OLDMALLOC.
	  (oldspace -> oldmalloc for variable names)

	  OLDSPACE is confusing because it is not includes slots.
	  To more clearly, rename such as (oldspace_limit -> oldmalloc_limit).
	  It is clear that it measures (estimates) malloc()'ed size.

Mon Nov 25 00:50:03 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* internal.h: use __builtin_bswap16() if possible.

	* configure.in: check existence of __builtin_bswap16().

Sun Nov 24 22:24:19 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigxor_int): Apply BIGLO for long in a BDIGIT expression.
	  (bigor_int): Ditto.
	  (bigand_int): Ditto.

Sun Nov 24 18:13:23 2013  Tanaka Akira  <akr@fsij.org>

	* include/ruby/defines.h (SIZEOF_ACTUAL_BDIGIT): Defined.

	* include/ruby/ruby.h (RBIGNUM_EMBED_LEN_MAX): Use
	  SIZEOF_ACTUAL_BDIGIT instead of SIZEOF_BDIGITS.
	  SIZEOF_BDIGITS can be different to sizeof(BDIGIT).

Sun Nov 24 13:49:08 2013  Tanaka Akira  <akr@fsij.org>

	* include/ruby/defines.h: Don't use int128_t for Bignum.
	  It's not always faster.

	* bignum.c: Ditto.

Sun Nov 24 10:18:15 2013  Aman Gupta <ruby@tmm1.net>

	* NEWS: Add details about new debugging features and APIs.

Sun Nov 24 09:37:20 2013  Andrew Vit  <andrew@avit.ca>

	* lib/csv.rb: Optimize header hashes by freezing string keys.
	  [ruby-core:58510]

Sun Nov 24 09:18:06 2013  Aman Gupta <ruby@tmm1.net>

	* ext/objspace/objspace_dump.c (dump_object): Use PRIuSIZE to print
	  size_t for better win32 compatibility.
	* test/objspace/test_objspace.rb (test_dump_all): Hold reference to
	  test string to avoid failure due to GC. Reduce size of failure message
	  using grep(/TEST STRING/).

Sun Nov 24 08:38:00 2013  Kyle Stevens  <kstevens715@gmail.com>

	* lib/csv.rb: If skip_lines is set to a String, convert it to a Regexp
	  to prevent the alternative, which is that each line in the CSV gets
	  converted to a Regexp when calling skip_lines#match.

Sun Nov 24 01:03:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (BigDecimal_power): Use FIX2LONG instead
	  of FIX2INT to avoid conversion error.

Sun Nov 24 00:44:30 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/ruby.h (RBIGNUM_EMBED_LEN_MAX): define by macros
	  defined in defines.h, instead of complex and repeated expression.

Sat Nov 23 22:22:26 2013  Tanaka Akira  <akr@fsij.org>

	* include/ruby/ruby.h (RBIGNUM_EMBED_LEN_MAX): Limit the value to
	  less than 8.

Sat Nov 23 19:52:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/lib/bigdecimal/math.rb (BigMath.E): Use BigMath.exp.
	  [Feature #6857] [ruby-core:47130]

Sat Nov 23 19:46:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (BigMath_s_exp): Optimize the
	  calculation algorithm to reduce the number of divisions.
	  This optimization was proposed by Rafal Michalski.
	  [Feature #6857] [ruby-core:47130]

Sat Nov 23 19:20:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (BigDecimal_div2): The signature was
	  changed to allow us to pass arguments directly.

	* ext/bigdecimal/bigdecimal.c (BigDecimal_div3): Added for the role of
	  the old BigDecimal_div2.

Sat Nov 23 12:31:00 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: fix global variable name.
	  Now we have following environments (and related variable names).

	  * RUBY_GC_HEAP_INIT_SLOTS
	  * RUBY_GC_HEAP_FREE_SLOTS
	  * RUBY_GC_HEAP_GROWTH_FACTOR (new from 2.1)
	  * RUBY_GC_HEAP_GROWTH_MAX_SLOTS (new from 2.1)

	  * obsolete
	    * RUBY_FREE_MIN       -> RUBY_GC_HEAP_FREE_SLOTS (from 2.1)
	    * RUBY_HEAP_MIN_SLOTS -> RUBY_GC_HEAP_INIT_SLOTS (from 2.1)

	  * RUBY_GC_MALLOC_LIMIT
	  * RUBY_GC_MALLOC_LIMIT_MAX (new from 2.1)
	  * RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR (new from 2.1)

	  * RUBY_GC_OLDSPACE_LIMIT (new from 2.1)
	  * RUBY_GC_OLDSPACE_LIMIT_MAX (new from 2.1)
	  * RUBY_GC_OLDSPACE_LIMIT_GROWTH_FACTOR (new from 2.1)

	* test/ruby/test_gc.rb: catch up this change.

Sat Nov 23 09:45:49 2013  Aman Gupta <ruby@tmm1.net>

	* marshal.c (w_object): Use HASH_PROC_DEFAULT directly from internal.h

Sat Nov 23 08:43:23 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c: Rename heap_pages_swept_num to heap_pages_swept_slots to
	  clarify meaning (number of slots, not pages).

Sat Nov 23 08:23:23 2013  Aman Gupta <ruby@tmm1.net>

	* lib/set.rb (class SortedSet): Fix source_location for methods
	  defined via eval.

Sat Nov 23 03:44:03 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master dcce4ff.  Important changes
	  in this commit:

	  Remove automatic detection of gem dependencies files.  This prevents a
	  security hole as described in [ruby-core:58490]

	  Fixed bugs for installing git gems.

	* test/rubygems:  ditto.

Fri Nov 22 22:30:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (BigDecimal_power):
	  Round the result value only if the precision is given.

Fri Nov 22 17:20:50 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* transcode.c (str_transcode0): don't scrub invalid chars if
	  str.encode doesn't have explicit invalid: :replace.
	  workaround fix for see #8995

Fri Nov 22 17:11:26 2013  Narihiro Nakamura  <authornari@gmail.com>

	* include/ruby/intern.h, internal.h: Expose rb_gc_count().

Fri Nov 22 17:07:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.gemspec: version 1.2.2.

Fri Nov 22 17:04:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (BigDecimal_data_type):
	  Use RUBY_TYPED_FREE_IMMEDIATELY only if it is available.

Fri Nov 22 16:49:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (BigDecimal_power): Round the result value.
	  [Bug #8818] [ruby-core:56802]

	* test/bigdecimal/test_bigdecimal.rb: Add a test for the above fix.

Fri Nov 22 16:25:43 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (heap_set_increment): accept minimum additional page number.

	* gc.c (gc_after_sweep): allocate pages to allocate at least
	   RUBY_HEAP_MIN_SLOTS.
	   [Bug #9137]

Fri Nov 22 16:19:52 2013  Narihiro Nakamura  <authornari@gmail.com>

	* include/ruby/intern.h (rb_gc_set_params): Deprecate
	  rb_gc_set_params because it's only used in ruby internal.

	* internal.h (ruby_gc_set_params): Declare rb_gc_set_params's
	  alias function.

	* gc.c: ditto.

	* ruby.c: use ruby_gc_set_params.

Fri Nov 22 14:55:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (BigMath_s_exp): Insert rb_thread_check_ints.

Fri Nov 22 14:35:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (BigMath_s_exp): Fix the inserting points
	  of RB_GC_GUARDs.

Fri Nov 22 14:31:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c: Fix indentation.

Fri Nov 22 14:03:00 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/nkf: merge nkf 2.1.3 2a2f2c5.

Fri Nov 22 12:43:52 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* util.c (ruby_strtod): ignore too long fraction part, which does not
	  affect the result.

Fri Nov 22 12:17:14 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/openssl/lib/openssl/buffering.rb (OpenSSL::Buffering#initialize):
	  initialize of a module should pass arguments to super.

Fri Nov 22 12:02:58 2013  Tanaka Akira  <akr@fsij.org>

	* test/ruby/test_settracefunc.rb: Ignore events from other threads.

Fri Nov 22 10:35:57 2013  Koichi Sasada  <ko1@atdot.net>

	* vm.c (ruby_vm_destruct): do not use ruby_xfree() after freeing
	  objspace.

	* gc.c (ruby_mimfree): added. It is similar to ruby_mimmalloc().

	* internal.h: ditto.

Fri Nov 22 09:42:35 2013  Zachary Scott  <e@zzak.io>

	* test/digest/test_digest.rb: Reverse order of assert_equal
	  Reported by @splattael

Fri Nov 22 09:03:16 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* gc.c: fix build failure on FreeBSD introduced by r43763.
	  malloc_usable_size() is defined by malloc_np.h on FreeBSD.

	* configure.in: check malloc.h and malloc_np.h.

Fri Nov 22 08:27:13 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master 50a8210.  Important changes
	  in this commit:

	  RubyGems now automatically checks for gem.deps.rb or Gemfile when
	  running ruby executables.  This behavior is similar to `bundle exec
	  rake`.  This change may be reverted before Ruby 2.1.0 if too many bugs
	  are found.

	* test/rubygems:  ditto.

Thu Nov 21 22:33:59 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: RGENGC_CHECK_MODE should be 0.

Thu Nov 21 21:40:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (VpAlloc): Fix the expr to adjust the size
	  of the digit array.

Thu Nov 21 21:36:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (BigDecimal_sqrt): Fix the precision of
	  the result BigDecimal of sqrt.
	  [Bug #5266] [ruby-dev:44450]

	* test/bigdecimal/test_bigdecimal.rb: add tests for the above changes.

Thu Nov 21 18:49:02 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (vm_xrealloc, vm_xfree): use malloc_usable_size() to obtain old
	  size if available.

Thu Nov 21 18:47:29 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/delegate.rb (SimpleDelegator#__getobj__): target object must be set.

	* lib/delegate.rb (DelegateClass#__getobj__): ditto.

Thu Nov 21 18:28:42 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/tempfile.rb (Tempfile#initialize): use class method to get rid
	  of warnings when $VERBOSE.

Thu Nov 21 17:43:29 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: rename initial_xxx variables to gc_params.xxx.
	  They are not only used initial values.

	  Chikanaga-san: Congratulations on RubyPrize!

Thu Nov 21 17:16:00 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: enable "RGENGC_ESTIMATE_OLDSPACE" option as default.
	  Without this option, some application consumes huge memory.
	  (and there are only a few performance down)

	  Introduced new environment variables:
	  * RUBY_GC_HEAP_OLDSPACE (default 16MB)
	  * RUBY_GC_HEAP_OLDSPACE_MAX (default 128 MB)
	  * RUBY_GC_HEAP_OLDSPACE_GROWTH_FACTOR (default 1.2)

	* gc.c (initial_malloc_limit): rename to initial_malloc_limit_min.

Thu Nov 21 16:51:34 2013  Zachary Scott  <e@zzak.io>

	* ext/digest/bubblebabble/bubblebabble.c: Teach RDoc digest/bubblebabble

Thu Nov 21 16:50:16 2013  Zachary Scott  <e@zzak.io>

	* test/digest/test_digest.rb: Add more tests for digest/bubblebabble

Thu Nov 21 16:32:47 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/delegate.rb (Delegator#method_missing): try private methods defined in
	  Kernel after the target.  [Fixes GH-449]

Thu Nov 21 16:25:08 2013  Akinori MUSHA  <knu@iDaemons.org>

	* test/uri/test_generic.rb (URI#test_merge): Test uri + URI(path)
	  in addition to uri + path.

Thu Nov 21 15:36:08 2013  Zachary Scott  <e@zzak.io>

	* ext/openssl/lib/openssl/buffering.rb: [DOC] Fix HEREDOC comment for
	  OpenSSL::Buffering which breaks overview because of RDoc bug

Thu Nov 21 14:46:57 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* eval_intern.h (SAVE_ROOT_JMPBUF): workaround for the failure of
	  test/ruby/test_exception.rb on Windows.
	  wrap by __try and __exception statements on mswin to raise SIGSEGV
	  when EXCEPTION_STACK_OVERFLOW is occurred, because MSVCRT doesn't
	  handle the exception.
	  however, (1) mingw-gcc doesn't support __try and __exception
	  statements, and (2) we cannot retry SystemStackError after this
	  change yet (maybe crashed) because SEH and longjmp() are too
	  uncongenial.

	* signal.c (check_stack_overflow, CHECK_STACK_OVERFLOW): now defined on
	  Windows, too.

	* thread_win32.c (ruby_stack_overflowed_p): ditto.

Thu Nov 21 14:18:24 2013  Zachary Scott  <e@zzak.io>

	* object.c: [DOC] Clarify Object#dup vs #clone [Bug #9128]
	  Moving existing doc for this comparison to separate section of #dup
	  Adding examples to document behavior of #dup with Module#extend.
	  Based on a patch by stevegoobermanhill

Thu Nov 21 14:06:02 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_marks_check): do not dump all refs.

	* gc.c (allrefs_dump_i): fix output format.

Thu Nov 21 13:43:07 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: change RGENGC_CHECK_MODE (>= 2) logic.
	  Basically, make an object graph of all of living objects before and
	  after marking and check status.

	  [Before marking: check WB sanity]
	  If there is a non-old object `obj' pointed from old object
	  (`parent') then `parent' or `obj' should be remembered.

	  [After marking: check marking miss]
	  Traversible objects with the object graph should be marked.
	  (However, this alert about objects pointed by machine context
	   can be false positive. We only display alert.)

	  [Implementation memo]
	  objspace_allrefs() creates an object graph.
	  The object graph is represented by st_table, key is object (VALUE)
	  and value is referring objects. Referring objects are stored by
	  "struct reflist".

	* gc.c (init_mark_stack): do not use push_mark_stack_chunk() at init.
	  This pre-allocation causes failure on is_mark_stack_empty()
	  without any pushing.

Thu Nov 21 13:40:20 2013  Zachary Scott  <e@zzak.io>

	* lib/observer.rb: [DOC] Clarify default observer method.
	  By @edward [Fixes GH-450] https://github.com/ruby/ruby/pull/450

Thu Nov 21 13:32:53 2013  Zachary Scott  <e@zzak.io>

	* ext/openssl/ossl_engine.c: [DOC] Documentation for OpenSSL::Engine
	  This patch is based off work by @vbatts in GH-436 completing the
	  documentation for this class and its methods.
	  https://github.com/ruby/ruby/pull/436

Thu Nov 21 10:45:22 2013  Zachary Scott  <e@zzak.io>

	* ext/openssl/lib/openssl/buffering.rb: Remove unused arguments from
	  OpenSSL::Buffering.new [Fixes GH-445]

Thu Nov 21 10:30:47 2013  Zachary Scott  <e@zzak.io>

	* test/digest/test_digest.rb: Add test for Digest::SHA256.bubblebabble

Wed Nov 20 20:54:01 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* tool/instruction.rb : fix typo.

Wed Nov 20 19:45:22 2013  Tanaka Akira  <akr@fsij.org>

	* random.c (rand_init): Make it possible to specify arbitrary array
	  for init_genrand().

Wed Nov 20 17:34:13 2013  Koichi Sasada  <ko1@atdot.net>

	* parse.y (rb_gc_mark_symbols): set global_symbols.minor_marked only
	  when full_mark is 0.
	  rb_gc_mark_symbols() (with full_mark == 1) can be called by other
	  than GC (such as rb_objspace_reachable_objects_from_root()).

Wed Nov 20 11:46:38 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/json: merge JSON 1.8.1.
	  https://github.com/nurse/json/compare/002ac2771ce32776b32ccd2d06e5604de6c36dcd...e09ffc0d7da25d0393873936c118c188c78dbac3
	* Remove Rubinius exception since transcoding should be working now.
	* Fix https://github.com/flori/json/issues/162 reported by Marc-Andre
	  Lafortune <github_rocks@marc-andre.ca>. Thanks!
	* Applied patches by Yui NARUSE <naruse@airemix.jp> to suppress
	  warning with -Wchar-subscripts and better validate UTF-8 strings.
	* Applied patch by ginriki@github to remove unnecessary if.
	* Add load/dump interface to JSON::GenericObject to make
	  serialize :some_attribute, JSON::GenericObject
	  work in Rails active models for convenient
	  SomeModel#some_attribute.foo.bar access to serialised JSON data.

Wed Nov 20 01:39:02 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/rdoc/constant.rb (RDoc::Constant#documented?): workaround for
	  NoMethodError when the original of alias is not found.

Tue Nov 19 23:38:49 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (--with-os-version-style): option to transform target
	  OS version string.

Tue Nov 19 21:27:33 2013  Tanaka Akira  <akr@fsij.org>

	* test/net/http/utils.rb (spawn_server): Specify zero for port to
	  avoid reusing an allocated port.

	* test/net/http/test_http.rb: Don't specify port here.

	* test/net/http/test_https.rb: Ditto.

Tue Nov 19 18:52:10 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (heap_is_swept_object): use heap_page::before_sweep flag.

Tue Nov 19 18:49:32 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rb_objspace_reachable_objects_from_root): do major marking.

Tue Nov 19 18:45:40 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rb_gc_resurrect): added.
	  rb_fstring() used rb_gc_mark() to avoid freeing used string.
	  However, rb_gc_mark() set mark bit *and* pushes mark_stack.
	  rb_gc_resurrect() does only set mark bit if it is before sweeping.

	* string.c (rb_fstring): use rb_gc_resurrect.

	* internal.h: add decl.

Tue Nov 19 09:47:02 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rdoc:  Update to RDoc master a1195ce.  Changes include:

	  Improved accessibility of the main sidebar navigation.

	  Fixed handling of regexp options in HTML source highlighting.

	* test/rdoc:  ditto.

Tue Nov 19 09:33:52 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master 6a3d9f9.  Changes include:

	  Compatibly renamed Gem::DependencyResolver to Gem::Resolver.

	  Added support for git gems in gem.deps.rb and Gemfile.

	  Fixed resolver bugs.

	* test/rubygems: ditto.

	* lib/rubygems/LICENSE.txt:  Updated to license from RubyGems trunk.
	  [ruby-trunk - Bug #9086]

	* lib/rubygems/commands/which_command.rb:  RubyGems now indicates
	  failure when any file is missing.  [ruby-trunk - Bug #9004]

	* lib/rubygems/ext/builder:  Extensions are now installed into the
	  extension install directory and the first directory in the require
	  path from the gem.  This allows backwards compatibility with msgpack
	  and other gems that calculate full require paths.
	  [ruby-trunk - Bug #9106]


Tue Nov 19 07:21:56 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in (LOCALTIME_OVERFLOW_PROBLEM): Define it for cross
	  compiling.
	  [ruby-core:58391] [Bug #9119] Reported by Luis Lavena.
	  Analyzed by Heesob Park.

Tue Nov 19 05:55:05 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rdoc/rubygems_hook.rb:  Remove debugging puts committed by
	  accident.

Mon Nov 18 22:47:54 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval_intern.h (TH_PUSH_TAG, TH_EXEC_TAG): refine stack overflow
	  detection.  chain local tag after setjmp() successed on it, because
	  calling setjmp() also can overflow the stack.
	  [ruby-dev:47804] [Bug #9109]

	* vm_eval.c (rb_catch_obj): now th->tag points previous tag until
	  TH_EXEC_TAG().

	* thread_pthread.c (ruby_init_stack): set stack_start properly by
	  get_main_stack() if possible.

Mon Nov 18 22:45:49 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval_jump.c (rb_exec_end_proc): unlink and free procs data before
	  calling for each procs.  [Bug #9110]

Sun Nov 17 06:33:32 2013  Shota Fukumori  <her@sorah.jp>

	* configure.in: Use $LIBS for base of $SOLIBS, also in darwin.
	  By this fix, environment that libgmp is located in $LIBS can build
	  ruby.

Sun Nov 17 01:56:32 2013  Tanaka Akira  <akr@fsij.org>

	* thread_pthread.c (rb_thread_create_timer_thread): Show error
	  message instead of error number.
	  (thread_create_core): Ditto.

	* cont.c (fiber_machine_stack_alloc): Ditto.

Sat Nov 16 18:28:08 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/parsers/ultralightparser.rb
	  (REXML::Parsers::UltraLightParser#parse): Fix wrong :start_doctype
	  position.
	  [Bug #9061] [ruby-dev:47778]
	  Patch by Ippei Obayashi. Thanks!!!

	* test/rexml/parser/test_ultra_light.rb: Add a test for this case.

Sat Nov 16 02:13:56 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* cont.c : Introduce ensure rollback mechanism. Please see below.

	* internal.h (ruby_register_rollback_func_for_ensure): catch up above change.
	  Add rollback mechanism API.

	* vm_core.h (typedef struct rb_vm_struct): catch up above change.
	  Introduce ensure-rollback relation table.

	* vm_core.h (typedef struct rb_thread_struct): catch up above change.
	  Introduce ensure stack.

	* eval.c (rb_ensure): catch up above change.
	  Introduce ensure stack.

	* hash.c : New function for rollback ensure, and register it to
	  ensure-rollback relation table. [ruby-dev:47803] [Bug #9105]

	Ensure Rollback Mechanism:
	A rollback's function is a function to rollback a state before ensure's
	function execution.
	When the jump of callcc is across the scope of rb_ensure,
	ensure's functions and rollback's functions are executed appropriately
	for keeping consistency.

	Current API is unstable, and only internal use.

	ruby_register_rollback_func_for_ensure(ensure_func,rollback_func)
	This API create relation ensure's function to rollback's function.
	By registered rollback's function, it is executed When jumping into
	corresponding rb_ensure scope.

Sat Nov 16 00:18:36 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* eval_jump.c (rb_exec_end_proc): fix double free or corruption error
	  when reentering by callcc. [ruby-core:58329] [Bug #9110]

	* test/ruby/test_beginendblock.rb: test for above.

Fri Nov 15 01:06:04 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/objspace/objspace_dump.c (dump_output): allow IO object as
	  output, and use Tempfile.create and return open file instead of
	  mkstemp() and path name for :file output.
	  [ruby-core:58266] [Bug #9102]

	* test/objspace/test_objspace.rb (TestObjSpace#dump_my_heap_please):
	  remove temporary output file.

Thu Nov 14 23:39:00 2013  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* ext/bigdecimal/lib/bigdecimal/util.rb: [DOC] remove example of
	  Rational#to_d without argument. [Bug #8958]

Thu Nov 14 20:24:15 2013  Naohisa Goto  <ngotogenome@gmail.com>

	* ruby_atomic.h (ATOMIC_SIZE_CAS): fix compile error on Solaris
	  since r43460.

Thu Nov 14 19:53:00 2013  Tanaka Akira  <akr@fsij.org>

	* test/openssl/test_cipher.rb (test_aes_gcm_wrong_tag): Don't use
	  String#succ because it can make modified (wrong) auth_tag longer
	  than 16 bytes.  The longer auth_tag makes that
	  EVP_CIPHER_CTX_ctrl (and internally aes_gcm_ctrl) fail.
	  [ruby-core:55143] [Bug #8439] reported by Vit Ondruch.

Thu Nov 14 11:33:47 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (foreach_safe_i, hash_foreach_iter): deal with error detected
	  by ST_CHECK.

	* st.c (st_foreach_check): call with non-error argument in normal case.

Thu Nov 14 02:37:14 2013  Zachary Scott  <e@zzak.io>

	* ext/thread/thread.c: [DOC] This patch accomplishes the following:

	  - Teach RDoc about ConditionVariable
	  - Teach RDoc about Queue
	  - Teach RDoc about SizedQueue
	  - Use fully-qualified namespace for Document-method
	    This is necessary to separate definitions between classes
	  - Fix rdoc bug in call_seq vs. call-seq
	  - Correct doc for SizedQueue#pop patch by @jackdanger [Bug #8988]

Thu Nov 14 01:11:54 2013  Zachary Scott  <e@zzak.io>

	* ext/bigdecimal/lib/bigdecimal/util.rb: [DOC] +precision+ is required

Wed Nov 13 19:21:36 2013  Zachary Scott  <e@zzak.io>

	* ext/bigdecimal/lib/bigdecimal/util.rb: [DOC] Document the required
	  +precision+ argument for Rational#to_d [Bug #8958]

Wed Nov 13 19:02:05 2013  Zachary Scott  <e@zzak.io>

	* ext/digest/*: [DOC] Fix several typos and broken http links.
	  Improved examples for Digest overview and fixed a broken example in
	  Digest::HMAC overview. This patch also adds a description of
	  Digest::SHA256.bubblebabble to the Digest overview.

	  Patched by @stomar [Bug #9027]

Wed Nov 13 18:32:12 2013  Zachary Scott  <e@zzak.io>

	* ext/openssl/ossl_config.c: [DOC] Document the following:

	  - OpenSSL::ConfigError
	  - OpenSSL::Config::DEFAULT_CONFIG_FILE

	  Patched by @vbatts via GH-436
	  https://github.com/ruby/ruby/pull/436

Wed Nov 13 18:03:00 2013  Zachary Scott  <e@zzak.io>

	* ext/openssl/ossl_asn1.c: [DOC] Document parts of
	  OpenSSL::ASN1::ObjectId included a fix for the class overview, which
	  previously showed the documentation for Constructive due to missing
	  ObjectId overview. This patch also includes a note for Primitive.

	  Based on a patch by @vbatts via GH-436
	  https://github.com/ruby/ruby/pull/436

Wed Nov 13 17:19:36 2013  Zachary Scott  <e@zzak.io>

	* ext/openssl/lib/openssl/config.rb: In #parse use +string+ for +str+

Wed Nov 13 17:09:45 2013  Zachary Scott  <e@zzak.io>

	* ext/openssl/lib/openssl/*.rb: [DOC] Document the following:

	  - Integer#to_bn
	  - OpenSSL::Buffering module
	  - Deprecated OpenSSL::Digest::Digest compatibility class
	  - OpenSSL::Config

	  These changes were based on a patch by @vbatts via GH-436
	  https://github.com/ruby/ruby/pull/436

Wed Nov 13 10:55:43 2013  Zachary Scott  <e@zzak.io>

	* doc/regexp.rdoc: [DOC] Fix typo in Special global variables section.
	  Reported by Alex Johnson on ruby-doc.org

Wed Nov 13 10:43:19 2013  Zachary Scott  <e@zzak.io>

	* hash.c: [DOC] Adds an example for Hash#store

Wed Nov 13 09:03:40 2013  Zachary Scott  <e@zzak.io>

	* doc/regexp.rdoc: [DOC] add note about Bug #4044 as suggested by
	  duerst-san in [ruby-core:43612] [Fixes GH-443] Patched by @rosenfeld
	  https://github.com/ruby/ruby/pull/443

Tue Nov 12 10:15:14 2013  Eric Hodel  <drbrain@segment7.net>

	* test/rubygems/insure_session.rb:  Remove unused test file.

Tue Nov 12 09:16:24 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master b9213d7.  Changes include:

	  Fixed tests on Windows (I hope) by forcing platform for
	  platform-dependent tests.

	  Fixed File.exists? warnings.

	  Improved testing infrastructure.

	* test/rubygems:  ditto.

	* test/rdoc/test_rdoc_rubygems_hook.rb:  Switch to util_spec like
	  RubyGems.

Mon Nov 11 18:31:12 2013  Aman Gupta <ruby@tmm1.net>

	* internal.h: move common string/hash flags to include file.
	* ext/objspace/objspace_dump.c: remove flags shared above.
	* hash.c: ditto.
	* string.c: ditto.

Mon Nov 11 04:36:14 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems/specification.rb:  Include 2.2.0.preview.2 when checking
	  if extensions should be built.  Fixes a ruby-ci failure.
	* test/rubygems/test_gem_specification.rb:  Test for the above.

Mon Nov 11 03:15:56 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_trace.c (symbol2event_flag): add secret feature.
	  add a_call/a_return events.
	  a_call is call | b_call | c_call, and same as a_return.

Mon Nov 11 02:51:17 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems: Update to RubyGems master 4bdc4f2.  Important changes
	  in this commit:

	  RubyGems now chooses the test server port reliably.  Patch by akr.

	  Partial implementation of bundler's Gemfile format.

	  Refactorings to improve the new resolver.

	  Fixes bugs in the resolver.

	* test/rubygems:  Tests for the above.

Mon Nov 11 01:02:06 2013  Zachary Scott  <e@zzak.io>

	* lib/timeout.rb: [DOC] Add note about change from #8730 [Fixes GH-440]
	* NEWS: [DOC] Improve grammar on change to Timeout
	  Patched by @srawlins in https://github.com/ruby/ruby/pull/440

Sun Nov 10 23:47:05 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* gc.c (rb_gcdebug_print_obj_condition): catch up recent changes
	  to compile on GC_DEBUG.

Sun Nov 10 22:16:19 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* error.c (exc_cause): captured previous exception.

	* eval.c (make_exception): capture previous exception automagically.
	  [Feature #8257]

Sun Nov 10 08:37:20 2013  Zachary Scott  <e@zzak.io>

	* thread.c: [DOC] Remove duplicate reference

Sun Nov 10 08:09:29 2013  Zachary Scott  <e@zzak.io>

	* lib/drb/drb.rb: [DOC] promote better windows-safe filename regular
	  expression in DRb Logger example. Reported by Chris Pheonix
	  [Bug #9074]

Sun Nov 10 08:03:05 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (rb_define_finalizer, rb_undefine_finalizer): rename and export
	  finalizer functions.

Sun Nov 10 07:41:22 2013  Zachary Scott  <e@zzak.io>

	* lib/weakref.rb: [DOC] fix typos by @xaviershay [Fixes GH-439]
	  https://github.com/ruby/ruby/pull/439

Sun Nov 10 06:14:39 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* compile.c (iseq_compile_each): emit opt_str_freeze if the #freeze
	  method is called on a static string literal with no arguments.

	* defs/id.def (firstline): add freeze so idFreeze is available

	* insns.def (opt_str_freeze): add opt_str_freeze instruction which
	  pushes a frozen string literal without allocating a new object if
	  String#freeze is not overridden

	* string.c (Init_String): define String#freeze

	* vm.c (vm_init_redefined_flag): define BOP_FREEZE on String class as
	  a basic operation

	* vm_insnhelper.h: ditto

	[Feature #8992] [ruby-core:57705]

Sun Nov 10 01:34:14 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (vm_malloc_increase): sweep immediately on GC due to malloc().
	  To reduce memory usage, sweep as soon as possible.
	  This behavior is same as Ruby 2.0.0 and before.

Sun Nov 10 00:39:26 2013  Koichi Sasada  <ko1@atdot.net>

	* benchmark/gc/gcbench.rb: output version description and GC::OPTS.

Sun Nov 10 00:36:42 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (should_be_callable): allow private call since rb_eval_cmd
	  calls even private methods.

Sun Nov 10 00:33:17 2013  Zachary Scott  <e@zzak.io>

	* lib/racc/rdoc/grammar.en.rdoc: [DOC] fix typo by Tsuyoshi Sawada
	  [Bug #9077]

Sat Nov  9 22:35:35 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* tool/rbinstall.rb (Gem::Specification.load): obtain spec date from
	  VCS for the case using git, RUBY_RELEASE_DATE is the last resort.
	  probably fixes [Bug #9085].

Sat Nov  9 20:56:12 2013  Narihiro Nakamura  <authornari@gmail.com>

	* ext/objspace/object_tracing.c: use declarations in internal.h.

	* ext/objspace/objspace.c: ditto

Sat Nov  9 20:32:59 2013  Tanaka Akira  <akr@fsij.org>

	* test/objspace/test_objspace.rb (test_dump_all): Make the test string
	  shorter to be an embedded string on 32bit environment as well as
	  64bit environment.

Sat Nov  9 15:00:16 2013  Zachary Scott  <e@zzak.io>

	* io.c: [DOC] ARGF.gets may return nil [Bug #9029] patch by znz

Sat Nov  9 14:54:52 2013  Zachary Scott  <e@zzak.io>

	* lib/rss/*: [DOC] document various constants @steveklabnik [Bug #8812]

Sat Nov  9 14:50:09 2013  Zachary Scott  <e@zzak.io>

	* lib/rss/rss.rb: [DOC] document Time#w3cdtf by @steveklabnik
	  [Bug #8821]

Sat Nov  9 14:29:04 2013  Zachary Scott  <e@zzak.io>

	* ext/dl/cfunc.c: [DOC] fix typo in example [Bug #8944]
	  Patched by Heesob Park

Sat Nov  9 13:59:58 2013  Zachary Scott  <e@zzak.io>

	* lib/test/unit/assertions.rb: [DOC] better example for assert_send()
	  Patch by Andrew Grimm [Bug #8975]

Sat Nov  9 12:45:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* insns.def: unify ic_constant_serial and ic_class_serial into one field
	  ic_serial. This is possible because these fields are only ever used
	  exclusively with each other.

	* insns.def: ditto
	* vm_core.h: ditto
	* vm_insnhelper.c: ditto

Sat Nov  9 12:31:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* class.c: unify names of vm state version counters to 'serial'.
	  This includes renaming 'vm_state_version_t' to 'rb_serial_t',
	  'method_state' to 'method_serial', 'seq' to 'class_serial',
	  'vmstat' to 'constant_serial', etc.

	* insns.def: ditto
	* internal.h: ditto
	* vm.c: ditto
	* vm_core.h: ditto
	* vm_insnhelper.c: ditto
	* vm_insnhelper.h: ditto
	* vm_method.c: ditto

Sat Nov  9 09:22:29 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (gc_page_sweep, rgengc_rememberset_mark): Refactoring.
	  Get bitmaps directly.

Sat Nov  9 09:16:36 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (RVALUE_PROMOTE_INFANT): Refactoring. Remove duplicated nonsense
	  code.

Sat Nov  9 09:04:48 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (gc_marks_test): Bugfix. Fix a struct member name for build
	  with RGENGC_CHECK_MODE.

Sat Nov  9 08:58:23 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c : Add GC_PROFILE_DETAIL_MEMORY option.
	  If GC_PROFILE_MORE_DETAIL && GC_PROFILE_DETAIL_MEMORY,
	  maxrss, minflt and majflt are added to each profile record.

Sat Nov  9 07:41:41 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* internal.h (rb_vm_backtrace_object, rb_gc_count): make prototype
	  declarations, not old-K&R style.

Sat Nov  9 06:11:14 2013  vo.x (Vit Ondruch)  <vondruch@redhat.com>

	* tool/rbinstall.rb (Gem::Specification#collect): make stable
	  Gem::Specification.files in default .gemspecs the different order of
	  "files" in .gemspec files makes them different therefore possibly
	  conflicting in multilib scenario.  patch by vo.x (Vit Ondruch) at
	  [ruby-core:57544] [Bug #8623].

Sat Nov  9 01:59:18 2013  Aman Gupta <ruby@tmm1.net>

	* ext/objspace/objspace_dump.c: Add experimental methods to
	  dump objectspace as json: ObjectSpace.dump_all and
	  ObjectSpace.dump(obj). These methods are useful for debugging
	  reference leaks and memory growth in large ruby applications.
	  [Bug #9026] [ruby-core:57893] [Fixes GH-423]
	* test/objspace/test_objspace.rb: tests for above.

Sat Nov  9 00:26:50 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (GetLastError): already defined in windows.h on nowadays
	  cygwin, and caused the confliction with the system provided
	  definition on cygwin64.  by @kou1okada [Fixes GH-433].

Fri Nov  8 18:35:31 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* lib/open3.rb: receive arguments as keyword arguments.

Fri Nov  8 13:19:26 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* io.c (rb_io_open_with_args): use RARRAY_CONST_PTR().

	* io.c (rb_scan_open_args): use const qualifier for above.

	* io.c (rb_open_file): ditto.

	* io.c (rb_io_open_with_args): ditto.

Fri Nov  8 11:35:06 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* dir.c, pack.c, ruby.c, struct.c, vm_eval.c: use RARRAY_CONST_PTR().

Fri Nov  8 10:58:02 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* compile.c (iseq_build_from_ary_exception): use RARRAY_CONST_PTR().

	* compile.c (iseq_build_from_ary_body): ditto.

Fri Nov  8 10:49:34 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* enumerator.c (append_method): use RARRAY_CONST_PTR().

	* enumerator.c (lazy_init_iterator): ditto.

Fri Nov  8 02:44:29 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (vm_malloc_increase): check GVL before gc_rest_sweep().
	  vm_malloc_increase() can be called without GVL.
	  However, gc_rest_sweep() assumes acquiring GVL.
	  To avoid this problem, check GVL before gc_rest_sweep().
	  [Bug #9090]

	  This workaround introduces possibility to set malloc_limit as
	  wrong value (*1). However, this may be rare case. So I commit it.

	  *1: Without rest_sweep() here, gc_rest_sweep() can decrease
	      malloc_increase due to ruby_sized_xfree().

Fri Nov  8 02:50:25 2013  Zachary Scott  <e@zzak.io>

	* lib/securerandom.rb: [DOC] specify arguments passed to ::random_bytes
	  By @chastell [Fixes GH-412] https://github.com/ruby/ruby/pull/412

Fri Nov  8 02:43:01 2013  Zachary Scott  <e@zzak.io>

	* ext/objspace/object_tracing.c: [DOC] trace_object_allocations_stop
	  By @srawlins [Fixes GH-421] https://github.com/ruby/ruby/pull/421

Fri Nov  8 02:34:20 2013  Zachary Scott  <e@zzak.io>

	* lib/net/ftp.rb: [DOC] Document Net::FTP.mdtm and .set_socket and fix
	  spelling typo, based on patch by @artfuldodger [Fixes GH-426]
	  https://github.com/ruby/ruby/pull/426

Fri Nov  8 02:14:37 2013  Zachary Scott  <e@zzak.io>

	* array.c: [DOC] Add note about negative indices in Array overview
	  By @ckaenzig [Fixes GH-427] https://github.com/ruby/ruby/pull/427

Fri Nov  8 02:09:12 2013  Zachary Scott  <e@zzak.io>

	* lib/csv.rb: [DOC] Fix typo in CSV.parse_line by @funky-bibimbap
	  [Fixes GH-430] https://github.com/ruby/ruby/pull/430

Fri Nov  8 01:01:54 2013  Zachary Scott  <e@zzak.io>

	* golf_prelude.rb: syntax formatting for whitespace [Fixes GH-425]
	  Patch by @edward https://github.com/ruby/ruby/pull/425

Thu Nov  7 19:36:09 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: modify malloc_limit strategy.

	  * fix default values:
	    GC_MALLOC_LIMIT_GROWTH_FACTOR
	    GC_MALLOC_LIMIT: 8MB -> 16MB
	    GC_MALLOC_LIMIT_MAX: 384MB -> 32MB

	  * algorithm of malloc_limit increment.
	    if (malloc_increase < malloc_limit) {
	      next_malloc_limit = malloc_limit * factor
	      if (malloc_limit > malloc_limit_max) {
	        malloc_limit = malloc_increase
	      }
	    }
	    This algorithm change malloc_limit from
	    16MB -> 32MB slowly.
	    If malloc_limit exceeds malloc_limit_max, then
	    increase with malloc_increase.

Thu Nov  7 11:06:05 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_shuffle_bang): use RARRAY_PTR_USE() without WB
	  because there are not new relations.

Thu Nov  7 10:34:12 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_sample): use rb_ary_dup().

Thu Nov  7 09:39:41 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_trace.c (rb_threadptr_exec_event_hooks_orig): errinfo should not
	  be propagated to trace blocks so that no argument raise does not
	  throw internal objects.  [ruby-dev:47793] [Bug #9088]

Wed Nov  6 21:30:55 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (gc_before_sweep): Change algorithm of malloc_limit to
	  conservative for closing to memory consumption of ruby 2.0.

	* gc.c (GC_MALLOC_LIMIT, GC_MALLOC_LIMIT_GROWTH_FACTOR):
	  Adjust parameters for new algorithm.

Wed Nov  6 21:16:51 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_shift_m): use RARRAY_PTR_USE() without WB because
	  there are not new relations.

Wed Nov  6 21:05:20 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_reverse): use RARRAY_PTR_USE().

Wed Nov  6 19:30:44 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* common.mk (help): add texts about gcbench.

Wed Nov  6 16:32:32 2013  Martin Duerst <duerst@it.aoyama.ac.jp>

	* lib/open3.rb: tweaked grammar in comments

Wed Nov  6 11:46:36 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_sample): use RARRAY_AREF() and RARRAY_PTR_USE()
	  instead of RARRAY_PTR().

Wed Nov  6 10:37:07 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_and): defer hash creation and some refactoring.

Wed Nov  6 09:14:31 2013  Koichi Sasada  <ko1@atdot.net>

	* benchmark/bm_vm1_gc_short_lived.rb: added.
	  These GC benchmarks do not reflect practical applications.
	  They are only for tuning.

	* benchmark/bm_vm1_gc_short_with_complex_long.rb: added.

	* benchmark/bm_vm1_gc_short_with_long.rb: added.

	* benchmark/bm_vm1_gc_short_with_symbol.rb: added.

	* benchmark/bm_vm1_gc_wb_ary.rb: added.

	* benchmark/bm_vm1_gc_wb_obj.rb: added.

	* benchmark/bm_vm_thread_queue.rb: added.
	  This benchmark is added to know how fast C version of thread.so.

Wed Nov  6 09:13:32 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: define RGENGC_ESTIMATE_OLDSPACE == 0 if USE_RGENGC is 0.

Wed Nov  6 07:13:18 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (Init_GC): add GC::OPTS to show options.

Wed Nov  6 07:12:17 2013  Koichi Sasada  <ko1@atdot.net>

	* benchmark/gc/gcbench.rb: add some options to make quiet.

Wed Nov  6 04:14:25 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych/visitors/to_ruby.rb: process merge keys before
	  reviving objects. Fixes GH psych #168
	* test/psych/test_merge_keys.rb: test for change
	  https://github.com/tenderlove/psych/issues/168

Tue Nov  5 21:21:47 2013  Tanaka Akira  <akr@fsij.org>

	* test/ruby/test_thread.rb (test_thread_join_in_trap):
	  Run the test in a different process.

Tue Nov  5 20:14:32 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (is_live_object): A hidden object may be a live object.
	  [ruby-dev:47788] [Bug #9072]

Tue Nov  5 13:37:19 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: add support to estimate increase of oldspace memory usage.
	  This is another approach to solve an issue discussed at r43530.
	  This feature is disabled as default.

	  This feature measures an increment of memory consumption by oldgen
	  objects. It measures memory consumption for each objects when
	  the object is promoted. However, measurement of memory consumption
	  is not accurate now. So that this measurement is `estimation'.

	  To implement this feature, move memsize_of() function from
	  ext/objspace/objspace.c and expose rb_obj_memsize_of().

	  Some memsize() functions for T_DATA (T_TYPEDDATA) have problem to
	  measure memory size, so that we ignores T_DATA objects now.
	  For example, some functions skip NULL check for pointer.

	  The macro RGENGC_ESTIMATE_OLDSPACE enables/disables this feature,
	  and turned off as default.

	  We need to compare 3gen GC and this feature carefully.
	  (it is possible to enable both feature)
	  We need a help to compare them.

	* internal.h: expose rb_obj_memsize_of().

	* ext/objspace/objspace.c: use rb_obj_memsize_of() function.

	* cont.c (fiber_memsize): fix to check NULL.

	* variable.c (autoload_memsize): ditto.

	* vm.c (vm_memsize): ditto.

Tue Nov  5 04:03:07 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (GC_MALLOC_LIMIT_MAX): fix default value 512MB -> 384MB.
	  512MB is huge.

Tue Nov  5 03:31:23 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: add 3gen GC patch, but disabled as default.

	  RGenGC is designed as 2 generational GC, young and old generation.
	  Young objects will be promoted to old objects after one GC.
	  Old objects are not collect until major (full) GC.

	  The issue of this approach is some objects can promoted as old
	  objects accidentally and not freed until major GC.
	  Major GC is not frequently so short-lived but accidentally becoming
	  old objects are not freed.

	  For example, the program "loop{Array.new(1_000_000)}" consumes huge
	  memories because short lived objects (an array which has 1M
	  elements) are promoted while GC and they are not freed before major
	  GC.

	  To solve this problem, generational GC with more generations
	  technique is known. This patch implements three generations gen GC.

	  At first, newly created objects are "Infant" objects.
	  After surviving one GC, "Infant" objects are promoted to "Young"
	  objects.
	  "Young" objects are promoted to "Old" objects after surviving
	  next GC.
	  "Infant" and "Young" objects are collected if it is not marked
	  while minor GC. So that this technique solves this problem.

	  Representation of generations:
	  * Infant: !FL_PROMOTED and !oldgen_bitmap [00]
	  * Young :  FL_PROMOTED and !oldgen_bitmap [10]
	  * Old   :  FL_PROMOTED and  oldgen_bitmap [11]

	  The macro "RGENGC_THREEGEN" enables/disables this feature, and
	  turned off as default because there are several problems.
	  (1) Failed sometimes (Heisenbugs).
	  (2) Performance down.
	      Especially on write barriers. We need to detect Young or Old
	      object by oldgen_bitmap. It is slower than checking flags.

	  To evaluate this feature on more applications, I commit this patch.
	  Reports are very welcome.

	  This patch includes some refactoring (renaming names, etc).

	* include/ruby/ruby.h: catch up 3gen GC.

	* .gdbinit: fix to show a prompt "[PROMOTED]" for promoted objects.

Tue Nov  5 00:05:51 2013  Koichi Sasada  <ko1@atdot.net>

	* node.h: catch up comments for last commit.

Tue Nov  5 00:02:00 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: rename FL_OLDGEN to FL_PROMOTED.
	  This flag represents that "this object is promoted at least once."

	* gc.c, debug.c, object.c: catch up this change.

Mon Nov  4 22:20:16 2013  Tanaka Akira  <akr@fsij.org>

	* test/xmlrpc: Don't use fixed ports: 8070 and 8071.

Mon Nov  4 15:25:52 2013  Tanaka Akira  <akr@fsij.org>

	* test/xmlrpc/webrick_testing.rb (start_server): Initialize the server
	  at main thread to fail early.

Mon Nov  4 10:08:17 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval_intern.h (TH_EXEC_TAG, TH_JUMP_TAG): get rid of undefined
	  behavior of setjmp() in rhs of assignment expression.
	  [ISO/IEC 9899:1999] 7.13.1.1

Sun Nov  3 23:06:51 2013  Tanaka Akira  <akr@fsij.org>

	* sample/test.rb: Make temporary file names unique.

Sun Nov  3 20:41:17 2013  Tanaka Akira  <akr@fsij.org>

	* test/xmlrpc: Wrap definitions by TestXMLRPC module.

Sun Nov  3 20:23:38 2013  Tanaka Akira  <akr@fsij.org>

	* test/xmlrpc/webrick_testing.rb (stop_server): Don't try to shutdown
	  the server if the server is not started.

Sun Nov  3 09:35:47 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* load.c (rb_feature_p): deal with default loadable suffixes.

	* load.c (load_lock): initialize statically linked extensions.

	* load.c (search_required, rb_require_safe): deal with statically
	  linked extensions.

	* load.c (ruby_init_ext): defer initialization of statically linked
	  extensions until required actually.  [Bug #8883]

Sat Nov  2 15:14:33 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/logger.rb (Logger::LogDevice::LogDeviceMutex#lock_shift_log):
	  open file can't be removed or renamed on Windows.  [ruby-dev:47790]
	  [Bug #9046]

	* test/logger/test_logger.rb (TestLogDevice#run_children): don't use
	  fork.

Sat Nov  2 07:08:43 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* lib/logger.rb: Inter-process locking for log rotation
	  Current implementation fails log rotation on multi process env.
	  by sonots <sonots@gmail.com>
	  https://github.com/ruby/ruby/pull/428 fix GH-428 [Bug #9046]

Fri Nov  1 23:24:31 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (wmap_mark_map): mark live objects only, but delete zombies.
	  [ruby-dev:47787] [Bug #9069]

Fri Nov  1 22:45:54 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (struct heap_page, gc_page_sweep, gc_sweep): Refactoring for
	  performance. Add before_sweep condition to heap_page structure.

	* gc.c (rb_gc_force_recycle): Use before_sweep member.

	* gc.c (heap_is_before_sweep, is_before_sweep): Remove. They have not
	  already been used.

Fri Nov  1 22:20:28 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (make_deferred): Refactoring. Collect codes which should be
	  atomic.

	* gc.c (make_io_deferred, obj_free, rb_objspace_call_finalizer,
	  gc_page_sweep): Correspond to the above.

Fri Nov  1 21:40:35 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (typedef struct rb_objspace): Refactoring. Move some members
	  into profile member.

	* gc.c (newobj_of): Correspond to the above.

	* gc.c (finalize_list): Ditto.

	* gc.c (objspace_live_num): Ditto.

	* gc.c (gc_page_sweep): Ditto.

	* gc.c (rb_gc_force_recycle): Ditto.

	* gc.c (garbage_collect_body): Ditto.

	* gc.c (rb_gc_count): Ditto.

	* gc.c (gc_stat): Ditto.

	* gc.c (gc_prof_set_heap_info): Ditto.

	* gc.c (gc_profile_dump_on): Ditto.

Fri Nov  1 20:53:56 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_scrub): fix typo, should yield invalid byte
	  sequence to be scrubbed.  reported by znz at IRC.

Fri Nov  1 17:25:30 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (is_live_object): finalizer may not run because of lazy-sweep.
	  [ruby-dev:47786] [Bug #9069]

Fri Nov  1 16:55:52 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_scrub): export with fixed length arguments, and
	  allow nil as replacement string instead of omitting.

Fri Nov  1 06:20:44 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* thread.c (rb_mutex_struct): reduce rb_mutex_t size by 8 bytes
	  on 64bit platform. Patch by Eric Wong. [Feature #9068][ruby-core:58114]

Fri Nov  1 01:08:33 2013  Koichi Sasada  <ko1@atdot.net>

	* benchmark/gc/gcbench.rb: print HWM (high water mark) if possible.

Thu Oct 31 21:48:31 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/parsers/streamparser.rb: Add dependency file require.
	  [Bug #9062] [ruby-dev:47779]
	  Reported by Ippei Obayashi. Thanks!!!

Thu Oct 31 14:09:32 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_method.c (rb_method_entry_make): fix to pass an ISeq value.
	  OBJ_WRITTEN() accepts only VALUE.

Wed Oct 30 19:07:57 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-additional.el (ruby-brace-to-do-end)
	  (ruby-do-end-to-brace, ruby-toggle-block): Remove functions that
	  are already in the latest released version of Emacs (24.3).
	  [Bug #7565]

Wed Oct 30 12:44:28 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/Makefile.sub (config.status): add missing variables,
	  PLATFORM_DIR and THREAD_MODEL.

Wed Oct 30 12:20:32 2013  Tanaka Akira  <akr@fsij.org>

	* time.c (v2w): Normalize a rational value to an integer if possible.
	  [ruby-core:58070] [Bug #9059] reported by Isaac Schwabacher.

Wed Oct 30 12:08:41 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_uniq_bang): use rb_ary_modify_check() instead of
	  rb_ary_modify() because the array will be unshared soon.

Wed Oct 30 03:25:10 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych/visitors/yaml_tree.rb: make less garbage when
	  testing if a string is binary.

Wed Oct 30 03:08:24 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych/visitors/yaml_tree.rb: string subclasses should
	  not be considered to be binary.  Fixes Psych / GH 166
	  https://github.com/tenderlove/psych/issues/166

	* test/psych/test_string.rb: test for fix

Tue Oct 29 23:01:18 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_zip): some refactoring.

Tue Oct 29 22:11:37 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_uniq_bang): use st_foreach() instead of for loop.

Tue Oct 29 20:01:58 2013  Koichi Sasada  <ko1@atdot.net>

	* add RUBY_TYPED_FREE_IMMEDIATELY to data types which only use
	  safe functions during garbage collection such as xfree().

	  On default, T_DATA objects are freed at same points as finalizers.
	  This approach protects issues such as reported by [ruby-dev:35578].
	  However, freeing T_DATA objects immediately helps heap usage.

	  Most of T_DATA (in other words, most of dfree functions) are safe.
	  However, we turned off RUBY_TYPED_FREE_IMMEDIATELY by default
	  for safety.

	* cont.c: ditto.

	* dir.c: ditto.

	* encoding.c: ditto.

	* enumerator.c: ditto.

	* error.c: ditto.

	* file.c: ditto.

	* gc.c: ditto.

	* io.c: ditto.

	* iseq.c: ditto.

	* marshal.c: ditto.

	* parse.y: ditto.

	* proc.c: ditto.

	* process.c: ditto.

	* random.c: ditto.

	* thread.c: ditto.

	* time.c: ditto.

	* transcode.c: ditto.

	* variable.c: ditto.

	* vm.c: ditto.

	* vm_backtrace.c: ditto.

	* vm_trace.c: ditto.

	* ext/bigdecimal/bigdecimal.c: ditto.

	* ext/objspace/objspace.c: ditto.

	* ext/stringio/stringio.c: ditto.

	* ext/strscan/strscan.c: ditto.

Tue Oct 29 19:48:33 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: fix typo (FL_WB_PROTECT -> FL_WB_PROTECTED).

Tue Oct 29 18:45:08 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_trace.c (tp_free): removed because empty free function.
	  Use RUBY_TYPED_NEVER_FREE instead.

Tue Oct 29 18:37:33 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: introduce new flags for T_TYPEDDATA.
	  * RUBY_TYPED_FREE_IMMEDIATELY: free the data given by DATA_PTR()
	    with dfree function immediately.  Otherwise (default), the data
	    freed at finalization point.
	  * RUBY_TYPED_WB_PROTECTED: make this object with FL_WB_PROTECT
	    (not shady).

	* gc.c (obj_free): support RUBY_TYPED_FREE_IMMEDIATELY.

Tue Oct 29 16:49:03 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (vm_malloc_increase): decrease it more carefully.

Tue Oct 29 16:24:52 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (heap_page_resurrect): return a page in tomb heap even if
	  freelist is NULL.

Tue Oct 29 15:46:30 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ruby_atomic.h (ATOMIC_SIZE_CAS): new macro, compare and swap size_t.

Tue Oct 29 12:08:05 2013  Tanaka Akira  <akr@fsij.org>

	* ext/readline/readline.c (readline_getc): Consider
	  NULL as input.

Tue Oct 29 11:10:08 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c (gc_profile_total_time): fix off-by-one error in
	  GC::Profiler.total_time.
	* test/ruby/test_gc.rb (class TestGc): test for above.

Tue Oct 29 09:53:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* insns.def, vm.c, vm_insnhelper.c, vm_insnhelper.h, vm_method.c: split
	  ruby_vm_global_state_version into two separate counters - one for the
	  global method state and one for the global constant state. This means
	  changes to constants do not affect method caches, and changes to
	  methods do not affect constant caches. In particular, this means
	  inclusions of modules containing constants no longer globally
	  invalidate the method cache.

	* class.c, eval.c, include/ruby/intern.h, insns.def, vm.c, vm_method.c:
	  rename rb_clear_cache_by_class to rb_clear_method_cache_by_class

	* class.c, include/ruby/intern.h, variable.c, vm_method.c: add
	  rb_clear_constant_cache

	* compile.c, vm_core.h, vm_insnhelper.c: rename vmstat field in
	  rb_call_info_struct to method_state

	* vm_method.c: rename vmstat field in struct cache_entry to method_state

Mon Oct 28 23:26:04 2013  Tanaka Akira  <akr@fsij.org>

	* test/readline/test_readline.rb (teardown): Clear Readline.input and
	  Readline.output.

Mon Oct 28 21:35:31 2013  Tanaka Akira  <akr@fsij.org>

	* ext/-test-/file/depend, ext/-test-/postponed_job/depend,
	  ext/-test-/tracepoint/depend: New files for dependencies.

Mon Oct 28 15:32:18 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/openssl/depend (ossl.o): work around of dependency of
	  thread_native.h, which depends on headers by THREAD_MODEL.
	  [ruby-dev:47777]

	* ext/openssl/extconf.rb: need THREAD_MODEL.

Mon Oct 28 14:57:01 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* load.c (ruby_init_ext): share feature names between frame name and
	  provided features.

Mon Oct 28 14:41:27 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-electric.el: Import ruby-electric.el 2.1 from
	  https://github.com/knu/ruby-electric.el.

	  * Hitting the newline-and-indent key within a comment fires
	    comment-indent-new-line.

	  * Introduce a new feature
	    `ruby-electric-autoindent-on-closing-char`.

	  * Fix fallback behavior of ruby-electric-space/return that
	    caused error with auto-complete.

Mon Oct 28 13:17:17 2013  Or Cohen  <orc@fewbytes.com>

	* error.c (name_err_to_s): remove no longer needed overriding, since
	  r30455 which made exc_to_s almost same.  Fixes [GH-413].

Mon Oct 28 12:42:11 2013  Tanaka Akira  <akr@fsij.org>

	* common.mk, ext/objspace/depend, ext/coverage/depend,
	  ext/-test-/debug/depend, ext/date/depend: Update dependencies.

Mon Oct 28 09:29:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* vm.c: vm_clear_all_cache is not necessary now we use a 64 bit counter
	  for global state version.

	* vm_insnhelper.h: ruby_vm_global_state_version overflow is unnecessary

Mon Oct 28 07:47:32 2013  Aman Gupta <ruby@tmm1.net>

	* vm_backtrace.c (rb_profile_frame_classpath): do not use rb_inspect
	  directly, since it might have a custom implementation or show ivars.

Mon Oct 28 04:10:41 2013  Aman Gupta <ruby@tmm1.net>

	* vm_backtrace.c (rb_profile_frame_classpath): handle singleton
	  methods defined directly on an object.
	* test/-ext-/debug/test_profile_frames.rb: test for above.

Mon Oct 28 00:52:36 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* struct.c (new_struct): fix warning message, class name and encoding.

Sun Oct 27 20:53:08 2013  Tanaka Akira  <akr@fsij.org>

	* ext/readline/readline.c: Include ruby/thread.h for
	  rb_thread_call_without_gvl2.
	  (readline_rl_instream, readline_rl_outstream): Record FILE
	  structures allocated by this extension.
	  (getc_body): New function extracted from readline_getc.
	  (getc_func): New function.
	  (readline_getc): Use rb_thread_call_without_gvl2 to invoke getc_func.
	  [ruby-dev:47033] [Bug #8749]
	  (clear_rl_instream, clear_rl_outstream): Close FILE structure
	  allocated by this extension reliably.  [ruby-core:57951] [Bug #9040]
	  (readline_readline): Use clear_rl_instream and clear_rl_outstream.
	  (readline_s_set_input): Set readline_rl_instream.
	  (readline_s_set_output): Set readline_rl_outstream.
	  (Init_readline): Don't call readline_s_set_input because
	  readline_getc doesn't block other threads for any FILE structure now.

	  [ruby-dev:47033] [Bug #8749] reported by Nobuhiro IMAI.
	  [ruby-core:57951] [Bug #9040] reported by Eamonn Webster.

Sat Oct 26 19:31:28 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* gc.c: catch up recent changes to compile on GC_DEBUG,
	  RGENGC_CHECK_MODE.

Sat Oct 26 19:08:00 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* range.c (range_initialize_copy): disallow to modify after
	  initialized.

Sat Oct 26 17:48:54 2013  Tanaka Akira  <akr@fsij.org>

	* lib/open-uri.rb (meta_add_field): : Re-implemented.
	   [ruby-core:58017] [Bug #9051] patch by Eamonn Webster.

Sat Oct 26 14:35:09 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_profile_dump_on): use "Page" terminology.

Sat Oct 26 13:25:45 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_sweep, gc_heap_lazy_sweep): fix measurement code.
	  We only need one sweep time measurement without lazy sweep.

Sat Oct 26 11:59:13 2013  Tanaka Akira  <akr@fsij.org>

	* addr2line.c: Include ELF header after system headers (especially
	  sys/types.h) to avoid compilation failure,
	  "usr/include/sh3/elf_machdep.h:4:2: error: #error Define _BYTE_ORDER!",
	  on NetBSD/sh3 (dreamcast, hpcsh, landisk, mmeye).

Sat Oct 26 11:35:22 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: tuning parameters.

	* gc.c (GC_MALLOC_LIMIT): change default value to 16MB.

	* gc.c (GC_MALLOC_LIMIT_GROWTH_FACTOR): change default value to 2.0.

	* gc.c (gc_before_sweep): change decrease ratio of `malloc_limit'
	  from 1/4 to 1/10.

Sat Oct 26 11:30:07 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (vm_malloc_increase): do gc_rest_sweep() before GC.
	  gc_rest_sweep() can reduce malloc_increase, so try it before GC.
	  Otherwise, malloc_increase can be less than malloc_limit at
	  gc_before_sweep(). This means that re-calculation of malloc_limit
	  may be wrong value.

Sat Oct 26 06:35:41 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (gc_before_heap_sweep): Restructure code to mean clearly.
	  heap->freelist is connected to end of list.

Sat Oct 26 04:01:35 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_before_heap_sweep): fix freelist management.
	  After rb_gc_force_recycle() for a object belonging to heap->freelist,
	  `heap->using_page->freelist' is not null.

Thu Oct 24 21:57:24 2013  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* parse.y: Remove +(binary) and -(binary) special cases
	  [Feature #9048]

Thu Oct 24 12:45:53 2013  Zachary Scott  <e@zzak.io>

	* object.c: [DOC] Document first argument also takes string for:

	  rb_mod_const_get, rb_mod_const_set, rb_mod_const_defined

	  Also added note about NameError exception for invalid constant name

Thu Oct 24 12:23:58 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* thread.c (rb_thread_terminate_all): add a comment why we need
	  state check and call terminate_i again.

Thu Oct 24 12:15:02 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* thread.c (rb_thread_terminate_all): add a comment why infinite
	  sleep is safe.

Thu Oct 24 07:41:42 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c: add new initial_growth_max tuning parameter.
	  [ruby-core:57928] [Bug #9035]
	* gc.c (heap_set_increment): when initial_growth_max is set,
	  do not grow number of slots by more than growth_max at a time.
	* gc.c (rb_gc_set_params): load optional new tuning value from
	  RUBY_HEAP_SLOTS_GROWTH_MAX environment variable.
	* test/ruby/test_gc.rb (class TestGc): test for above.

Thu Oct 24 01:34:12 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/win32.h (rb_infinity_float): suppress overflow in
	  constant arithmetic warnings.  [ruby-core:57981] [Bug #9044]

Thu Oct 24 00:11:24 2013  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* lib/ostruct.rb: raise NoMethodError with a #name and #args.
	  Raise RuntimeError when modifying frozen instances
	  instead of TypeError.
	  (OpenStruct#each_pair): Return an enumerator with size
	  (OpenStruct#delete): Use the converted argument.
	  Patches by Kenichi Kamiya. [Fixes GH-383]

	* test/ostruct/test_ostruct.rb: Added tests for above.

Thu Oct 24 00:10:22 2013  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* array.c: Add Array#to_h [Feature #7292]

	* enum.c: Add Enumerable#to_h

Wed Oct 23 23:48:28 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c: Rename free_min to min_free_slots and free_min_page to
	  max_free_slots. The algorithm for heap growth is:
	    if (swept_slots < min_free_slots) pages++
	    if (swept_slots > max_free_slots) pages--

Wed Oct 23 22:51:03 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/Makefile.sub (config.h): VC 2013 supports C99 mathematics
	  functions.  [ruby-core:57981] [Bug #9044]

Wed Oct 23 19:13:18 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: move increment from heap to heap_pages.
	  Share `increment' information with heaps.

	* gc.c: change ratio of heap_pages_free_min_page
	  to 0.80.
	  This change means slow down page freeing speed.

Wed Oct 23 17:52:03 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (heap_pages_free_unused_pages): cast to (int) for size_t
	  variable `i'.

Wed Oct 23 17:39:35 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: introduce tomb heap.
	  Tomb heap is where zombie objects and ghost (freed slot) lived in.
	  Separate from other heaps (now there is only eden heap) at sweeping
	  helps freeing pages more efficiently.
	  Before this patch, even if there is an empty page at former phase
	  of sweeping, we can't free it.

	  Algorithm:
	    (1) Sweeping all pages in a heap and move empty pages from the
	        heap to tomb_heap.
	    (2) Check all existing pages and free a page
	        if all slots of this page are empty and
	           there is enough empty slots (checking by swept_num)

	  To introduce this patch, there are several tuning of GC parameters.

Wed Oct 23 14:20:56 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_prof_sweep_timer_stop): catch up recent changes
	  to compile on GC_PROFILE_MORE_DETAIL=1.

Wed Oct 23 11:43:27 2013  Zachary Scott  <e@zzak.io>

	* file.c: [DOC] fix rdoc format of File#expand_path from r43386

Tue Oct 22 21:58:28 2013  URABE Shyouhei  <shyouhei@ruby-lang.org>

	* vm_core.h (enum): avoid syntax error.

	* method.h: ditto.

	* internal.h: ditto.

Tue Oct 22 19:53:16 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (Init_heap): move logics from heap_pages_init() and remove
	  heap_pages_init().

Tue Oct 22 19:19:05 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: allow multiple heaps.
	  Now, objects are managed by page. And a set of pages is called heap.
	  This commit supports multiple heaps in the object space.

	  * Functions heap_* and rb_heap_t manages heap data structure.
	  * Functions heap_page_* and struct heap_page manage page data
	    structure.
	  * Functions heap_pages_* and struct rb_objspace_t::heap_pages
	    maintains all pages.
	    For example, pages are allocated from the heap_pages.

	  See https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/GC_design
	  and https://bugs.ruby-lang.org/attachments/4015/data-heap_structure_with_multiple_heaps.png
	  for more details.

	  Now, there is only one heap called `eden', which is a space for all
	  new generated objects.

Tue Oct 22 18:26:12 2013  Tanaka Akira  <akr@fsij.org>

	* lib/pp.rb (object_address_group): Use Kernel#to_s to obtain the class
	  name and object address.
	  This fix a problem caused by %p in C generates variable length
	  address.
	  Reported by ko1 via IRC.

Tue Oct 22 16:57:48 2013  Benoit Daloze  <eregontp@gmail.com>

	* file.c (File#expand_path): [DOC] improve documentation of File#expand_path.
	  Based on patch by Prathamesh Sonpatki. [ruby-core:57734] [Bug #9002]

Tue Oct 22 15:59:51 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (glob_helper): don't skip current directories if FNM_DOTMATCH
	  is given.  [ruby-core:53108] [Bug #8006]

Tue Oct 22 14:53:11 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_trace.c: exterminate Zombies.
	  There is a bug that T_ZOMBIE objects are not collected.
	  Because there is a pass to miss finalizer postponed job
	  with multi-threading. This patch solve this issue.

	* vm_trace.c (rb_postponed_job_register_one): set
	  RUBY_VM_SET_POSTPONED_JOB_INTERRUPT(th) if another same job
	  is registered.
	  There is a possibility to remain a postponed job without
	  interrupt flag.

	* vm_trace.c (rb_postponed_job_register_one): check interrupt
	  carefully.

	* vm_trace.c (rb_postponed_job_register_one): use additional space
	  to avoid buffer full.

	* gc.c (gc_finalize_deferred_register): check failure.

	* thread.c (rb_threadptr_execute_interrupts): check
	  `postponed_job_interrupt' immediately.  There is a possibility
	  to miss this flag.

Tue Oct 22 12:11:16 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: check if the given CFLAGS and LDFLAGS are working, and
	  bail out early if not.

Tue Oct 22 00:06:57 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_file_exists_p): warn deprecated name.  [Bug #9041]

Mon Oct 21 23:57:53 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* encoding.c (load_encoding): should preserve outer errinfo, so that
	  expected exception may not be lost.  [ruby-core:57949] [Bug #9038]

Sun Oct 20 15:41:22 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_reopen): create a new, temporary FD via rb_sysopen and
	  call rb_cloexec_dup2 on it to atomically replace the file fptr->fd
	  points to.  This leaves no possible window where fptr->fd is invalid
	  to userspace (even for any threads running w/o GVL).  based on the
	  patch by Eric Wong <normalperson@yhbt.net> at [ruby-core:57943].
	  [Bug #9036]

Sun Oct 20 15:29:05 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* error.c (rb_syserr_fail_path_in): new function split from
	  rb_sys_fail_path_in to raise SystemCallError without errno.

	* internal.h (rb_syserr_fail_path): like rb_sys_fail_path but without
	  errno.

Sun Oct 20 13:58:47 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/ruby.h (rb_obj_wb_unprotect, rb_obj_written),
	  (rb_obj_write): suppress unused-parameter warnings.

Sun Oct 20 10:32:48 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update RubyGems to master 0886307.  This commit
	  improves documentation and should bring ruby above 75% documented on
	  rubyci.

Sun Oct 20 09:30:56 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master 3de7e0f.  Changes:

	  Only attempt to build extensions for newly-installed gems.  This
	  prevents compilation attempts at gem activation time for gems that
	  already have extensions built.

	  Fix crash in the dependency resolver for dependencies that cannot be
	  resolved.

	* test/rubygems:  ditto.

Sun Oct 20 05:24:29 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* variable.c (rb_class2name): should return real class name, not
	  singleton class or iclass.

Sun Oct 20 04:18:48 2013  Aman Gupta <ruby@tmm1.net>

	* variable.c (rb_class2name): call rb_tmp_class_path() directly to
	  avoid extra rb_str_dup() from rb_class_name().

Sat Oct 19 19:59:02 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/file.c (code_page): use simple array instead of st_table.

	* encoding.c (rb_locale_encindex): defer initialization of win32 code
	  page table until encoding db loaded.

Sat Oct 19 08:25:05 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: fix rb_objspace_t.
	  * make "struct heap" and move most of variables
	    in rb_objspace_t::heap.
	  * rename rb_objspace_t::heap::sorted to
	    rb_objspace_t::heap_sorted_pages
	    and make a macro heap_sorted_pages.
	  * rename rb_objspace_t::heap::range to
	    rb_objspace_t::heap_range and rename macros
	    lomem/himem to heap_lomem/heap_himem.

Sat Oct 19 07:14:40 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master 42543b6.  Changes:

	  Fix `gem update` for gems with multiple platforms.

	* test/rubygems:  ditto.

Sat Oct 19 06:55:52 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master 0a3814b.  Changes:

	  Fixed extension directory in Gem::Specification#require_paths.

	  Allow installation of gems when $HOME is nonexistent or unwritable.

	  Use proper API in InstallCommand.

	  Improve support for path option in gem dependency files.

	  Remove warnings.

	* test/rubygems:  ditto.

Fri Oct 18 15:23:34 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: change terminology of heap.
	  Change "slot" to "page". "Slot" is a space of RVALUE.
	  1. "Heap" consists of a set of "heap_page"s (pages).
	  2. Each "heap_page" has "heap_page_body".
	  3. "heap_page_body" has RVALUE (a.k.a. "slot") spaces.
	  4. "sorted" is a sorted array of "heap_page"s, sorted
	     by address of heap_page_body (for "is_pointer_to_heap").

	  See https://bugs.ruby-lang.org/attachments/4008/data-heap_structure.png.

Fri Oct 18 09:40:43 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master cee6788.  Changes:

	  Fix test failure on vc10-x64 Server on rubyci.org due to attempting
	  to File.chmod where it is not supported.

	  Continuing work on improved gem dependencies file (Gemfile) support.

	* test:  ditto.

Fri Oct 18 06:02:49 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master f738c67.  Changes:

	  Fixed test bug for ruby with ENABLE_SHARED = no

	* test/rubygems:  ditto.

Fri Oct 18 00:57:07 2013  Tanaka Akira  <akr@fsij.org>

	* lib/tsort.rb (TSort.tsort): Extracted from TSort#tsort.
	  (TSort.tsort_each): Extracted from TSort#tsort_each.
	  (TSort.strongly_connected_components): Extracted from
	  TSort#strongly_connected_components.
	  (TSort.each_strongly_connected_component): Extracted from
	  TSort#each_strongly_connected_component.

Thu Oct 17 18:50:08 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (CALC_EXACT_MALLOC_SIZE_CHECK_OLD_SIZE): introduced.
	  This macro enable checker compare with allocated memory and
	  declared old_size of sized_xfree and sized_xrealloc.

Thu Oct 17 18:45:41 2013  Koichi Sasada  <ko1@atdot.net>

	* string.c (STR_HEAP_SIZE): includes TERM_LEN(str).

	* string.c (rb_str_memsize): use STR_HEAP_SIZE().

Thu Oct 17 17:43:00 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* vm_insnhelper.c (vm_call_method): set ci->me to 0 when the
	  original method of a refined method is undef to avoid SEGV.

	* vm_method.c (rb_method_entry_without_refinements): return 0 when
	  the original method of a refined method is undef to avoid SEGV.

	* test/ruby/test_refinement.rb: related test.

Thu Oct 17 17:38:36 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c, internal.h: rename ruby_xsizefree/realloc to
	  rb_sized_free/realloc.

	* array.c: catch up these changes.

	* string.c: ditto.

Thu Oct 17 17:32:51 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c, string.c: use ruby_xsizedfree() and ruby_xsizedrealloc().

	* internal.h (SIZED_REALLOC_N): define a macro as REALLOC_N().

Thu Oct 17 17:11:17 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (console_emulator_p): check by comparison between
	  module handle of WriteConsoleW and kernel32.dll.

	* configure.in, win32/Makefile.sub, win32/setup.mak: no longer need
	  psapi.lib.

Thu Oct 17 16:53:30 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c, internal.h: add new internal memory management functions.
	  * void *ruby_xsizedrealloc(void *ptr, size_t new_size, size_t old_size)
	  * void ruby_xsizedfree(void *x, size_t size)
	  These functions accept additional size parameter to calculate more
	  accurate malloc_increase parameter which control GC timing.
	  [Feature #8985]

Thu Oct 17 14:21:34 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/file.c (rb_file_expand_path_internal): fix memory leaks at
	  a non-absolute home exception.

Thu Oct 17 14:06:39 2013  Koichi Sasada  <ko1@atdot.net>

	* ext/objspace/object_tracing.c (newobj_i): fix memory leak.
	  There is possibility to remain info due to missing FREEOBJ event.
	  FREEOBJ events are skipped while suppress_tracing state, for example,
	  during trace events are invoking.

Thu Oct 17 12:30:16 2013  Tanaka Akira  <akr@fsij.org>

	* lib/tsort.rb (TSort.each_strongly_connected_component_from):
	  Extracted from TSort#each_strongly_connected_component_from.

Thu Oct 17 11:07:06 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master 941c21a.  Changes:

	  Restored method bundler wants to remove for compatibility.

	  Improvements to Gemfile compatibility.

	* test/rubygems:  ditto.

Thu Oct 17 08:08:11 2013  Koichi Sasada  <ko1@atdot.net>

	* ext/objspace/object_tracing.c (newobj_i): add workaround.
	  some bugs hits this check.

	* ext/objspace/object_tracing.c (object_allocations_reporter_i): cast as pointer.

Thu Oct 17 07:36:53 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master 2abce58.  Changes:

	  Fixed documentation generation when sdoc and json are installed as
	  gems.

	  Added some missing documentation.

Thu Oct 17 07:10:26 2013  Zachary Scott  <e@zzak.io>

	* ext/curses/curses.c: [DOC] Cleaned up formatting consistency of rdoc
	  comments for Curses, including period spacing and column width.

	  This patch also fixed some typos. Thanks to @postmodern for the patch!
	  [Fixes GH-420] https://github.com/ruby/ruby/pull/420

Thu Oct 17 06:58:42 2013  Zachary Scott  <e@zzak.io>

	* ext/date/date_core.c: [DOC] plural grammar fixed by @scott113341
	  Contributed via documenting-ruby.org: documenting-ruby/ruby#16
	  https://github.com/documenting-ruby/ruby/pull/16

Thu Oct 17 05:52:31 2013  Zachary Scott  <e@zzak.io>

	* ext/io/nonblock/nonblock.c: [DOC] Document io/nonblock by reprah
	  [Fixes GH-418] https://github.com/ruby/ruby/pull/418 based on the
	  original discussion from documenting-ruby/ruby#18

Thu Oct 17 05:40:33 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (objspace_each_objects): do not skip empty RVALUEs.

Thu Oct 17 05:31:31 2013  Koichi Sasada  <ko1@atdot.net>

	* error.c (rb_bug_reporter_add): return simply 0 if failed.
	  Please check return value.

Thu Oct 17 05:17:33 2013  Koichi Sasada  <ko1@atdot.net>

	* ext/objspace/object_tracing.c: add new method
	  ObjectSpace.trace_object_allocations_debug_start for GC debugging.
	  If you encounter the BUG "... is T_NONE" (and so on) on your
	  application, please try this method at the beginning of your app.

Wed Oct 16 22:35:27 2013  Zachary Scott  <e@zzak.io>

	* ext/io/nonblock/nonblock.c: use rb_cIO instead of VALUE

Wed Oct 16 17:45:13 2013  Koichi Sasada  <ko1@atdot.net>

	* bootstraptest/runner.rb: check nil before calling `signal?'
	  for a process status.

Wed Oct 16 17:37:17 2013  Koichi Sasada  <ko1@atdot.net>

	* error.c, internal.h (rb_bug_reporter_add): add a new C-API.
	  rb_bug_reporter_add() allows to register a function which
	  is called at rb_bug() called.

	* ext/-test-/bug_reporter/bug_reporter.c: add a test for this C-API.

	* ext/-test-/bug_reporter/extconf.rb: ditto.

	* test/-ext-/bug_reporter/test_bug_reporter.rb: ditto.

Wed Oct 16 15:14:21 2013  Koichi Sasada  <ko1@atdot.net>

	* NEWS: add a line into NEWS for last commit.

Wed Oct 16 15:09:14 2013  Koichi Sasada  <ko1@atdot.net>

	* ext/objspace/objspace.c: add a new method `reachable_objects_from_root'.
	  ObjectSpace.reachable_objects_from_root returns all objects referred
	  from root (called "root objects").
	  This feature is for deep object analysis.

	* test/objspace/test_objspace.rb: add a test.

Wed Oct 16 15:00:21 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master b955554.  Changes:

	  Fixed NameError for Gem::Ext due to re-entering file lookup in
	  RubyGems' overridden require.  Bug by Koichi Sasada.

	  Fixed possible circular require warning in tests.

	  Used existing constant for `gem install -g` dependency file list.

	* test/rubygems:  ditto.

Wed Oct 16 09:42:42 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master 278d00d.  Changes:

	  Fixes building extensions without a "clean" make rule

	  Adds gem dependency file autodetection to "gem install -g"

	* test/rubygems:  Tests for the above.

Wed Oct 16 09:12:23 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems master commit 2a74263.  This fixes
	  several bugs in RubyGems 2.2.0.preview.1.

	* test/rubygems:  ditto.

Wed Oct 16 07:25:02 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c (gc_mark_roots): rename roots to be categories
	  instead of function names.

Tue Oct 15 19:18:13 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.h (rb_objspace_reachable_objects_from_root): added.
	  This API provides information which objects are root objects.
	  `category' shows what kind of root objects.

	* gc.c (gc_mark_roots): separate from gc_marks_body().

Tue Oct 15 17:47:59 2013  Tanaka Akira  <akr@fsij.org>

	* process.c: Fix a typo.  MacOS X doesn't have ENOTSUPP.

Mon Oct 14 12:32:52 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ruby.c (process_options): load statically linked extensions before
	  rubygems, because of ext/thread.

	* ruby.c (process_options): use gem_prelude instead of requiring
	  rubygems directly when --enable=gems is given.

	* Makefile.in (DEFAULT_PRELUDES): always use gem_prelude regardless of
	  --disable-rubygems.

Mon Oct 14 11:07:51 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (have_framework): should append framework options to
	  $LIBS, not $LDFLAGS.  The former is propagated to exts.mk when
	  enable-static-linked-ext.

	* lib/mkmf.rb (create_makefile): ranlib on static library, not DLLIB.

Sun Oct 13 23:53:40 2013  Andrew Grimm  <andrew.j.grimm@gmail.com>

	* vsnprintf.c: Fix spelling from compliment to complement.
	  Patch by @agrimm.

	* include/ruby/ruby.h: ditto

Sun Oct 13 20:59:27 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm.c (Init_BareVM): initialize defined_module_hash here,
	  Init_top_self() is too late to register core classes/modules.

	* compile.c (compile_array_): no hash to merge if it is empty.

	* vm.c (m_core_hash_merge_kwd): just check keys if only one argument
	  is given, without merging.

Sat Oct 12 06:35:01 2013-10-11  Eric Hodel  <drbrain@segment7.net>

	* lib/rake:  Update to rake 10.1.0
	* bin/rake:  ditto.
	* test/rake:  ditto.

	* NEWS:  Update NEWS to include rake 10.1.0 and links to release notes.

Sat Oct 12 03:26:04 2013  Koichi Sasada  <ko1@atdot.net>

	* class.c, variable.c, gc.c (rb_class_tbl): removed.

	* vm.c, vm_core.h (rb_vm_add_root_module): added to register as a
	  defined root module or class.
	  This guard helps mark miss from defined classes/modules they are
	  only referred from C's global variables in C-exts.
	  Basically, it is extension's bug.
	  Register to hash object VM has.
	  Marking a hash objects allows generational GC supports.

	* gc.c (RGENGC_PRINT_TICK): disable (revert).

Sat Oct 12 03:24:49 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_method.c (rb_gc_mark_unlinked_live_method_entries):
	  revert last commit to introduce debug prints.

Fri Oct 11 21:05:19 2013  Koichi Sasada  <ko1@atdot.net>

	* internal.h, parse.y: use `full_mark' instead of `full_marking'.

Fri Oct 11 20:58:16 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: use terminology `full_mark' instead of `minor_gc'
	  in mark functions.

Fri Oct 11 20:46:09 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: use __GNUC__ instead of __GCC__.

Fri Oct 11 20:35:59 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c, parse.y: support generational Symbol related marking.
	  Each symbols has String objects respectively to represent
	  Symbols.
	  These objects are marked only when:
	  * full marking
	  * new symbols are added
	  This hack reduce symbols (related strings) marking time.
	  For example, on my Linux environment, the following code
	    "20_000_000.times{''}"
	  with 40k symbols (similar symbol number on Rails 3.2.14 app,
	  @jugyo tells me) boosts, from 7.3sec to 4.2sec.

	* internal.h: change prototype of rb_gc_mark_symbols().

Fri Oct 11 19:27:22 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-electric.el: Import ruby-electric.el 2.0.1 which fixes
	  a bug and a flaw with auto-end introduced in the revamp.

	  * ruby-forward-sexp is inappropriate here because it moves the
	    cursor past the keyword.

	  * Fix a reversed looking-back check in
	    ruby-electric--block-beg-keyword-at-point-p.

	  * Do not add end again if space or return is hit repeatedly
	    after a block beginning keyword.

Fri Oct 11 18:12:47 2013  Koichi Sasada  <ko1@atdot.net>

	* ext/objspace/gc_hook.c: prohibit reentrant.

Fri Oct 11 18:11:34 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_trace.c (rb_postponed_job_flush): fix bit operation.

Fri Oct 11 17:33:24 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-electric.el: Import ruby-electric.el 2.0 from
	  https://github.com/knu/ruby-electric.el which integrates changes
	  from another fork by @qoobaa.

	  * Allow ruby-electric-mode to be disabled by introducing a
	    dedicated key map.  Electric key bindings are now defined in
	    ruby-electric-mode-map instead of overwriting ruby-mode-map.

	  * Add ruby-electric-mode-hook.

	  * Use a remap in binding ruby-electric-delete-backward-char.

	  * Totally revamp electric keywords and then introduce electric
	    return.  Modifier keywords are now properly detected making
	    use of ruby-mode's indentation level calculator, and

	  * block-mid keywords (then, else, elsif, when, rescue and
	    ensure) also become electric with automatic reindentation.

	  * Add standardized comments for ELPA integration.

	  * Fix interaction with smartparens-mode by disabling its end
	    keyword completion, since ruby-electric has become more clever
	    at it.

	  * The custom variable `ruby-electric-keywords` is changed to
	    `ruby-electric-keywords-alist`, allowing user to fine-grained
	    configuration.

Fri Oct 11 16:53:28 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_trace.c (rb_postponed_job_flush): simplify.

Fri Oct 11 03:36:49 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* thread.c (rb_threadptr_execute_interrupts): flush postponed job only
	  once at last.

	* vm_trace.c (rb_postponed_job_flush): defer calling postponed jobs
	  registered while flushing to get rid of infinite reentrance of
	  ObjectSpace.after_gc_start_hook.  [ruby-dev:47400] [Bug #8492]

Thu Oct 10 23:04:00 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_or): remove unused variables.

Thu Oct 10 23:01:16 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_or): use rb_hash_keys().

Thu Oct 10 21:36:16 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_compact_bang): use ary_resize_smaller().

Thu Oct 10 17:25:28 2013  Koichi Sasada  <ko1@atdot.net>

	* vm.c (vm_exec): support :b_return event for "lambda{return}.call".
	  [Bug #8622]

	* test/ruby/test_settracefunc.rb: add a test.

Thu Oct 10 13:52:37 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_trace.c (postponed_job): use preallocated buffer.
	  Pre-allocate MAX_POSTPONED_JOB (1024) sized buffer
	  and use it.
	  If rb_postponed_job_register() cause overflow, simply it
	  fails and returns 0.
	  And maybe rb_postponed_job_register() is signal safe.

	* vm_core.h: change data structure.

Thu Oct 10 11:11:33 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm.c (Init_VM): hide also the singleton class of frozen-core, not
	  only frozen-core itself.

Thu Oct 10 06:02:08 2013  Koichi Sasada  <ko1@atdot.net>

	* test/ruby/test_rand.rb: fix r43224. local variable `e' is
	  no longer available.

Thu Oct 10 00:02:35 2013  Yusuke Endoh  <mame@tsg.ne.jp>

	* numeric.c (fix_aref): avoid a possible undefined behavior.
	  1L << 63 on 64-bit platform is undefined, at least, according to
	  ISO/IEC 9899 (C99) 6.5.7.

Wed Oct  9 23:57:02 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* object.c (id_for_attr): avoid inadvertent symbol creation.

Wed Oct  9 18:03:01 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_method.c (rb_attr): preserve encoding of the attribute ID in
	  error message.

Wed Oct  9 17:40:16 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_fstring): because of lazy sweep, str may be unmarked
	  already and swept at next time, so mark it for the time being.
	  [ruby-core:57756]

Wed Oct  9 13:53:14 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* compar.c (cmp_eq): fail if recursion.  [ruby-core:57736] [Bug #9003]

	* thread.c (rb_exec_recursive_paired_outer): new function which is
	  combination of paired and outer variants.

Wed Oct  9 09:18:14 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/debug.h,
	  vm_backtrace.c (rb_profile_frame_full_label): add new C API
	  rb_profile_frame_full_label() which returns label with
	  qualified method name.
	  Note that in future version of Ruby label() may return
	  same return value of full_label().

	* ext/-test-/debug/profile_frames.c,
	  test/-ext-/debug/test_profile_frames.rb: fix a test for this change.


Wed Oct  9 00:55:51 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* load.c (load_lock): display backtrace to $stderr at circular
	  require.

	* vm_backtrace.c (rb_backtrace_print_to): new function to print
	  backtrace to the given output.

Tue Oct  8 21:03:35 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_backtrace.c, include/ruby/debug.h: add new APIs
	  * VALUE rb_profile_frame_method_name(VALUE frame)
	  * VALUE rb_profile_frame_qualified_method_name(VALUE frame)

	* iseq.c (rb_iseq_klass), internal.h: add new internal function
	  rb_iseq_method_name().

	* ext/-test-/debug/profile_frames.c (profile_frames),
	  test/-ext-/debug/test_profile_frames.rb: add a test.

Tue Oct  8 16:11:11 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (rb_ary_uniq): use rb_hash_values(), as well as the case no
	  block is given.

	* internal.h: define rb_hash_values() as internal API.

Tue Oct  8 13:53:21 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_uniq): use rb_hash_keys().

	* internal.h: define rb_hash_keys() as internal API.

	* hash.c (rb_hash_keys): ditto.

Tue Oct  8 10:56:39 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* cont.c: disable FIBER_USE_NATIVE on GNU/Hurd because it doesn't
	  support a combination getcontext() and threads. Patch by
	  Gabriele Giacone (1o5g4r8o@gmail.com). [Bug #8990][ruby-core:57685]

Tue Oct  8 05:58:12 2013  Tanaka Akira  <akr@fsij.org>

	* lib/time.rb (Time.strptime): Time.strptime('0', '%s') returns local
	  time Time object as Ruby 2.0 and before.

Tue Oct  8 05:40:37 2013  Eric Hodel  <drbrain@segment7.net>

	* .travis.yml:  Rebuild Travis CI's "ruby-head" version on successful
	  build.  Patch by Konstantin Haase.  [Fixes GH-417]
	  https://github.com/ruby/ruby/pull/417

Tue Oct  8 04:28:25 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-mode.el: Use preceding-char/following-char
	  (returning 0 at BOF/EOF) instead of char-before/char-after
	  (returning nil at BOF/EOF) to avoid error from char-syntax when
	  at BOF/EOF.

Tue Oct  8 04:12:45 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-additional.el (ruby-mode-set-encoding): Add a missing
	  else clause to unbreak with `cp932`, etc.

	* misc/ruby-mode.el (ruby-mode-set-encoding): Ditto.

Tue Oct  8 03:57:34 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-additional.el (ruby-mode-set-encoding): Use
	  `default-buffer-file-coding-system` if the :prefer-utf-8
	  property is not available.

	* misc/ruby-mode.el (ruby-mode-set-encoding): Ditto.

	* misc/ruby-additional.el (ruby-encoding-map): Override the
	  default value.

Tue Oct  8 03:19:19 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-additional.el (ruby-mode-set-encoding): Add support
	  for `prefer-utf-8` which was introduced in Emacs trunk.

	* misc/ruby-additional.el (ruby-encoding-map): Add a mapping from
	  `japanese-cp932` to `cp932` to fix the problem where saving a
	  source file written in Shift_JIS twice would end up having
	  `coding: japanese-cp932` which Ruby could not recognize.

	* misc/ruby-additional.el (ruby-mode-set-encoding): Add support
	  for encodings mapped to nil in `ruby-encoding-map`.

	* misc/ruby-additional.el (ruby-encoding-map): Map `us-ascii` and
	  `utf-8` to nil by default, meaning they need not be explicitly
	  declared in magic comment.

	* misc/ruby-additional.el (ruby-encoding-map): Add type
	  declaration for better customize UI.

	* misc/ruby-mode.el: Ditto for the above.

Tue Oct  8 00:14:53 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-additional.el: Add a standard header and footer,
	  including (provide 'ruby-additional).

Mon Oct  7 22:52:45 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-electric.el (ruby-electric-space-can-be-expanded-p):
	  Return nil to avoid "end" insertion when in smartparens-mode
	  that is configured to insert "end" for the same keyword.

	* misc/ruby-electric.el (ruby-electric-keywords): New custom
	  variable to replace `ruby-electric-simple-keywords-re` with.

Mon Oct  7 22:52:16 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-additional.el: Use preceding-char/following-char
	  (returning 0 at BOF/EOF) instead of char-before/char-after
	  (returning nil at BOF/EOF) to avoid error from char-syntax when
	  at BOF/EOF.

Mon Oct  7 22:45:20 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* cont.c (FIBER_USE_NATIVE): split long conditions.

Mon Oct  7 20:29:31 2013  Zachary Scott  <e@zzak.io>

	* lib/time.rb: [DOC] typo in Time.rb overview by @srt32 [Fixes GH-416]
	  https://github.com/ruby/ruby/pull/416

Mon Oct  7 20:07:20 2013  Tanaka Akira  <akr@fsij.org>

	* lib/time.rb (Time.strptime): Use :offset.
	  Patch by Felipe Contreras.  [ruby-core:57694]

Mon Oct  7 16:47:27 2013  Koichi Sasada  <ko1@atdot.net>

	* test/-ext-/debug/test_profile_frames.rb: rename class C to
	  something long name because one test depends on absence of
	  class ::C.

Mon Oct  7 16:33:10 2013  Koichi Sasada  <ko1@atdot.net>

	* ext/-test-/debug/profile_frames.c:
	  test/-ext-/debug/test_profile_frames.rb: add a test for new C-APIs.

Mon Oct  7 16:12:36 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/debug.h: add backtrace collecting APIs for profiler.
	  * int rb_profile_frames(int start, int limit, VALUE *buff, int *lines);
	    Collect information of frame information.

	  * VALUE rb_profile_frame_path(VALUE frame);
	  * VALUE rb_profile_frame_absolute_path(VALUE frame);
	  * VALUE rb_profile_frame_label(VALUE frame);
	  * VALUE rb_profile_frame_base_label(VALUE frame);
	  * VALUE rb_profile_frame_first_lineno(VALUE frame);
	  * VALUE rb_profile_frame_classpath(VALUE frame);
	  * VALUE rb_profile_frame_singleton_method_p(VALUE frame);
	    Get information about each frame.

	  These APIs are designed for profilers, for example, no object allocation,
	  and enough information for profilers.
	  In this version, this API collects only Ruby level frames.
	  This issue will be fixed after Ruby 2.1.

	* vm_backtrace.c: implement above APIs.

	* iseq.c (rb_iseq_klass): return local_iseq's class.

Mon Oct  7 14:26:01 2013  Koichi Sasada  <ko1@atdot.net>

	* proc.c: catch up last commit.
	  Type of return value of rb_iseq_first_lineno() is now VALUE.

	* vm_insnhelper.c (argument_error): ditto.

	* vm_method.c (rb_method_entry_make): ditto.

Mon Oct  7 14:07:45 2013  Koichi Sasada  <ko1@atdot.net>

	* iseq.c, internal.h: change to public (but internal) functions
	  * VALUE rb_iseq_path(VALUE iseqval);
	  * VALUE rb_iseq_absolute_path(VALUE iseqval);
	  * VALUE rb_iseq_label(VALUE iseqval);
	  * VALUE rb_iseq_base_label(VALUE iseqval);
	  * VALUE rb_iseq_first_lineno(VALUE iseqval);
	  And new (temporary) function:
	  * VALUE rb_iseq_klass(VALUE iseqval);

	* iseq.c. vm_core.h (int rb_iseq_first_lineno): remove
	  function `int rb_iseq_first_lineno(const rb_iseq_t *iseq)'.
	  Use `VALUE rb_iseq_first_lineno(VALUE iseqval)' instead.

	* proc.c. vm_insnhelper.c, vm_method.c: catch up this change.

Sun Oct  6 08:37:39 2013  Zachary Scott  <e@zzak.io>

	* lib/webrick.rb: [DOC] fix grammar in WEBrick overview [Fixes GH-413]
	  Based on patch by @chastell https://github.com/ruby/ruby/pull/413

Sat Oct  5 11:21:01 2013  Aaron Pfeifer  <aaron.pfeifer@gmail.com>

	* thread.c (terminate_atfork_i): fix locking mutexes not unlocked in
	  forks when not tracked in thread.  [ruby-core:55102] [Bug #8433]

Fri Oct  4 19:54:09 2013  Zachary Scott  <e@zzak.io>

	* ext/dbm/dbm.c: [DOC] Fix wrong constant name in DBM by @edward
	  [Fixes GH-409] https://github.com/ruby/ruby/pull/409

Fri Oct  4 19:49:42 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c: rename heap.free_num as heap.swept_num to clarify meaning and
	  avoid confusion with objspace_free_num().

Fri Oct  4 19:02:01 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c (objspace_free_num): new method for available/free slots on
	  heap. [ruby-core:57633] [Bug #8983]
	* gc.c (gc_stat): change heap_free_num definition to use new method.
	* test/ruby/test_gc.rb: test for above.

Fri Oct  4 18:53:42 2013  Aman Gupta <ruby@tmm1.net>

	* gc.c: add rb_objspace.limit to keep accurate count of total heap
	  slots [ruby-core:57633] [Bug #8983]

Fri Oct  4 09:32:33 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/csv.rb (CSV.foreach): support enumerator.  based on a patch by
	  Hanmac (Hans Mackowiak) at [ruby-core:57643].  [ruby-core:57283]
	  [Feature #8929]

Thu Oct  3 18:20:47 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (console_emulator_p, constat_handle): disable built-in
	  console colorizing when console-emulator-like DLL is injected.
	  [Feature #8201]

Thu Oct  3 18:01:44 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: define gc_profile_record::allocated_size if
	  CALC_EXACT_MALLOC_SIZE is true.

Thu Oct  3 13:42:51 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (yes-test-sample): use RUNRUBY instead of MINIRUBY to set
	  runtime library path and run the built ruby.  [Bug #8971]

Thu Oct  3 00:17:15 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-additional.el: Properly quote the body.  An unquoted
	  body given to eval-after-load is evaluated immediately!

Wed Oct  2 21:38:30 2013  Yusuke Endoh  <mame@tsg.ne.jp>

	* ext/socket/ifaddr.c (rsock_getifaddrs): fix possible memory leak.
	  When a system had no interface, this function used xmalloc for root
	  but did not return any reference to it.  This patch fixes it by
	  immediately returning an empty array if no interface is found.
	  Coverity Scan found this bug.

Wed Oct  2 21:37:04 2013  Yusuke Endoh  <mame@tsg.ne.jp>

	* random.c (make_seed_value): a local array declaration was accessed
	  out of scope.  Coverity Scan found this bug.

Wed Oct  2 18:52:40 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: relax GC condition due to malloc_limit.

	* gc.c (GC_MALLOC_LIMIT_MAX): change default value
	  (256MB -> 512MB) and permit zero to ignore max value.

	* gc.c (vm_malloc_increase, vm_xrealloc): do not cause GC on realloc.

	* gc.c (gc_before_sweep): change debug messages.

Wed Oct  2 16:26:49 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_close_read): duplex IO should wait its child process
	  even after close_read.

Wed Oct  2 15:39:13 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* vm_core.h: use __has_attribute() instead of __clang__major__ because
	  clang says "Note that marketing version numbers should not be used
	  to check for language features, as different vendors use different
	  numbering schemes. Instead, use the Feature Checking Macros."
	  http://clang.llvm.org/docs/LanguageExtensions.html

Wed Oct  2 14:19:57 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_close_write): detach tied IO for writing before closing
	  to get rid of race condition.  [ruby-list:49598]

	* io.c (rb_io_close_read): keep fptr in write_io to be discarded, to
	  fix freed pointer access when it is in use by other threads, and get
	  rid of potential memory/fd leak.

Tue Oct  1 23:44:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* vm_core.h: use __attribute__((unused)) in UNINITIALIZED_VAR on clang
	  4.0+ instead of just on 4.2. Clang has supported the unused attribute
	  since before version 4, so this should be safe.

Tue Oct  1 22:03:48 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/tempfile.rb (Tempfile#unlink): finalizer is no longer needed
	  after unlinking.  patched by by normalperson (Eric Wong) at
	  [ruby-core:56521] [Bug #8768]

Tue Oct  1 20:54:33 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (stat_new_0): constify.

	* file.c (rb_stat_new): constify and export.  based on a patch by
	  Hanmac (Hans Mackowiak) at [ruby-core:53225].  [Feature #8050]

Tue Oct  1 16:03:42 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/ruby.h (ruby_safe_level_4_warning): needed by extension
	  libraries which check safe level 4.  [ruby-dev:47517] [Bug #8652]

Mon Sep 30 23:14:36 2013  Zachary Scott  <e@zzak.io>

	* ext/objspace/objspace.c: [DOC] Cleaned up many rdoc formatting
	  issues and several duplicate grammar bugs.

Mon Sep 30 23:01:01 2013  Zachary Scott  <e@zzak.io>

	* ext/objspace/object_tracing.c: [DOC] Adjust rdoc formatting and fix
	  small grammar typo

Mon Sep 30 17:28:39 2013  Koichi Sasada  <ko1@atdot.net>

	* ext/objspace/object_tracing.c: [DOC] add some notes for
	  ObjectSpace::trace_object_allocations.

Mon Sep 30 16:46:58 2013  Koichi Sasada  <ko1@atdot.net>

	* ext/objspace/object_tracing.c: add new 3 methods to control tracing.
	  * ObjectSpace::trace_object_allocations_start
	  * ObjectSpace::trace_object_allocations_stop
	  * ObjectSpace::trace_object_allocations_clear
	  And some refactoring.

	* test/objspace/test_objspace.rb: add a test for new methods.

	* NEWS: add a description for new methods.

Mon Sep 30 11:18:04 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rb_gc_disable): do rest_sweep() before disable GC.
	  This fix may solve a failure of
	  TestTracepointObj#test_tracks_objspace_events
	  [test/-ext-/tracepoint/test_tracepoint.rb:43].

Mon Sep 30 10:40:20 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* vm_method.c (rb_undef): raise a NameError if the original method
	  of a refined method is not defined.

	* vm_insnhelper.c (rb_method_entry_eq): added NULL check to avoid SEGV.

	* test/ruby/test_refinement.rb: related test.

Sun Sep 29 23:45:42 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (rb_id_attrset, intern_str): allow junk attrset ID for
	  Struct.

	* parse.y (rb_id_attrset): fix inconsistency with literals, allow
	  ID_ATTRSET and return it itself, but ID_JUNK cannot make ID_ATTRSET.
	  and raise a NameError instead of rb_bug() for invalid argument.

Sun Sep 29 18:45:05 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* vm_insnhelper.c (vm_callee_setup_arg_complex, vm_yield_setup_block_args):
	  clear keyword arguments to prevent GC bug which occurs
	  while marking VM stack.
	  [ruby-dev:47729] [Bug #8964]

	* test/ruby/test_keyword.rb: tests for the above.

Sat Sep 28 23:25:56 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* math.c (math_log, math_log2, math_log10): fix for Bignum argument.
	  numbits should be add only when right shifted.

Sat Sep 28 14:30:29 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* test/dl/test_base.rb: {libc, libm} detection now handle GNU/Hurd
	  correctly. Patch by Gabriele Giacone (1o5g4r8o@gmail.com).
	  [Bug #8937][ruby-core:57311]
	* test/fiddle/helper.rb: ditto.

Sat Sep 28 00:19:41 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* ext/curses/extconf.rb: check the size of chtype.

	* ext/curses/curses.c (NUM2CH, CH2NUM): use proper macros for
	  the size of chtype.

	[ruby-core:56090] [Bug #8659]

Fri Sep 27 18:33:23 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: add two GC tuning environment variables.
	  RUBY_GC_MALLOC_LIMIT_MAX and RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR.
	  See r43067 for details.

	* gc.c (rb_gc_set_params): refactoring. And change verbose notation.
	  Mostly duplicated functions get_envparam_int/double is not cool.
	  Please rewrite it.

	* test/ruby/test_gc.rb: fix a test for this change.

Fri Sep 27 17:44:41 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (GC_MALLOC_LIMIT): 8,000,000 -> 8 * 1,024 * 1,024.

Fri Sep 27 17:19:39 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_before_sweep): cast to size_t to suppress warnings.

Fri Sep 27 17:07:55 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: add some fine-grained profiling codes to tuning marking phase.
	  If you enable RGENGC_PRINT_TICK to 1, then profiling results by RDTSC
	  (on x86/amd64 environment) are printed at last.
	  Thanks Yoshii-san.

Fri Sep 27 16:32:27 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: simplify threshold of GC caused by malloc_increase.
	  Now, malloc_limit is increased/decreased by mysterious logic.
	  This fix simplify malloc_limit increase/decrease logic such as:
	    if (malloc_increase > malloc_limit) /* so many malloc */
	      malloc_limit += malloc_limit * (GC_MALLOC_LIMIT_FACTOR-1);
	    else
	      malloc_limit -= malloc_limit * (GC_MALLOC_LIMIT_FACTOR-1)/4;
	  Default value of GC_MALLOC_LIMIT_FACTOR is 1.8.
	  malloc_limit is bounded by GC_MALLOC_LIMIT_MAX (256MB by default).
	  This logic runs at gc_before_sweep(). So there are no effect from
	  caused by lazy sweep. And we can remove malloc_increase2.

	* gc.c (HEAP_MIN_SLOTS, FREE_MIN, HEAP_GROWTH_FACTOR): rename to
	  GC_HEAP_MIN_SLOTS, GC_FREE_MIN, GC_HEAP_GROWTH_FACTOR respectively.
	  Check them by `#ifndef' so you can specify these values outside gc.c.

	* gc.c (ruby_gc_params_t): add initial_malloc_limit_factor and
	  initial_malloc_limit_max.

	* gc.c (vm_malloc_prepare, vm_xrealloc): use vm_malloc_increase to
	  add and check malloc_increase.

Fri Sep 27 01:05:00 2013  Zachary Scott  <e@zzak.io>

	* re.c: [DOC] arguments of Regexp::union receive #to_regexp [Bug #8205]

Fri Sep 27 00:39:27 2013  Zachary Scott  <e@zzak.io>

	* struct.c: [DOC] grammar of ArgumentError in Struct.new [Bug #8936]
	  Patch by Prathamesh Sonpatki

Thu Sep 26 22:11:56 2013  Zachary Scott  <e@zzak.io>

	* ext/bigdecimal/bigdecimal.c: [DOC] several fixes by @chastell
	  This includes fixing the capitalization of Infinity, return value of
	  example "BigDecimal.new('NaN') == 0.0", and code style in example.
	  [Fixes GH-398] https://github.com/ruby/ruby/pull/398

Thu Sep 26 22:08:11 2013  Zachary Scott  <e@zzak.io>

	* lib/observer.rb: [DOC] syntax improvement in example by @chastell
	  [Fixes GH-400] https://github.com/ruby/ruby/pull/400

Thu Sep 26 22:03:15 2013  Zachary Scott  <e@zzak.io>

	* ext/digest/digest.c: [DOC] typo in overview by @chastell
	  [Fixes GH-399] https://github.com/ruby/ruby/pull/399

Thu Sep 26 22:00:42 2013  Zachary Scott  <e@zzak.io>

	* ext/openssl/ossl.c: [DOC] typo in example by @zoranzaric
	  [Fixes GH-401] https://github.com/ruby/ruby/pull/401

Thu Sep 26 21:07:49 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-electric.el (ruby-electric-delete-backward-char): Add
	  support for smartparens-mode.

	* misc/ruby-electric.el (ruby-electric-cua-replace-region-maybe)
	  (ruby-electric-cua-delete-region-maybe): New functions that
	  combine `ruby-electric-cua-*-region` with
	  `ruby-electric-cua-*-region-p`, using a slightly better way to
	  detect if it is in cua-mode.

Thu Sep 26 16:51:00 2013  Shota Fukumori  <her@sorah.jp>

	* insns.def (opt_regexpmatch2): Check String#=~ hasn't overridden
	  before calling rb_reg_match().

	* test/ruby/test_string.rb: Test for above.

	* vm.c (vm_init_redefined_flag): Add BOP flag for String#=~

	[ruby-core:57385] [Bug #8953]

Thu Sep 26 16:43:42 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-electric.el: Avoid use of the interactive function
	  `self-insert-command` which fires `post-self-insert-hook` and
	  `post-command-hook`, to make the ruby-electric commands work
	  nicely with those minor modes that make use of them to do
	  similar input assistance, such as electric-pair-mode,
	  autopair-mode and smartparens-mode.

Thu Sep 26 16:24:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* insns.def (opt_regexpmatch1): check Regexp#=~ is not defined before
	  calling rb_reg_match()

	* test/ruby/test_regexp.rb: add test

	* vm.c (ruby_vm_redefined_flag): change type to short[]

	* vm.c (vm_redefinition_check_flag): return REGEXP_REDEFINED_OP_FLAG if
	  klass == rb_cRegexp

	* vm.c (vm_init_redefined_flag): setup BOP flag for Regexp#=~

	* vm_insnhelper.h: add REGEXP_REDEFINED_OP_FLAG

	[ruby-core:57385] [Bug #8953]

Thu Sep 26 14:46:49 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (mark_locations_array): disable AddressSanitizer.  based on a
	  patch by halfie (Ruby Guy) at [ruby-core:57372].
	  [ruby-core:56155] [Bug #8680]

Wed Sep 25 17:41:29 2013  Koichi Sasada  <ko1@atdot.net>

	* README.EXT, README.EXT.ja: remove description of RARRAY_PTR()
	  and add a caution of accessing internal data structure directly.
	  Also add a description of rb_ary_store().
	  [Bug #8399]

Wed Sep 25 17:12:08 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: rename RARRAY_RAWPTR() to RARRAY_CONST_PTR().
	  RARRAY_RAWPTR(ary) returns (const VALUE *) type pointer and
	  usecase of this macro is not acquire raw pointer, but acquire
	  read-only pointer. So we rename to better name.
	  RSTRUCT_RAWPTR() is also renamed to RSTRUCT_CONST_PTR()
	  (I expect that nobody use it).

	* array.c, compile.c, cont.c, enumerator.c, gc.c, proc.c, random.c,
	  string.c, struct.c, thread.c, vm_eval.c, vm_insnhelper.c:
	  catch up this change.

Wed Sep 25 16:58:33 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* internal.h (rb_float_value, rb_float_new): move inline functions
	  from ruby/ruby.h.

	* numeric.c (rb_float_value, rb_float_new): define external functions
	  for extension libraries.

Wed Sep 25 15:37:02 2013  Koichi Sasada  <ko1@atdot.net>

	* test/rdoc/test_rdoc_generator_darkfish.rb: add a guard for windows.

Wed Sep 25 09:53:11 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Fix CVE-2013-4363.  Miscellaneous minor improvements.

	* test/rubygems:  Tests for the above.

Tue Sep 24 17:38:56 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_inspect): get rid of out-of-bound access.

	* string.c (rb_str_inspect): when a UTF-16/32 string doesn't have a
	  BOM, inspect as a dummy encoding string.

Tue Sep 24 17:15:10 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enc/encdb.c (ENC_DUMMY_UNICODE): make BOM-encodings dummy.

	* encoding.c (enc_autoload): keep dummy encodings dummy.

Tue Sep 24 16:41:15 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/win32/lib/win32/registry.rb (Win32::Registry#write): data size
	  is in bytes, not chars.  terminators should be placed automatically.

Tue Sep 24 16:39:36 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/win32/lib/win32/registry.rb (Win32::Registry#each_value): encode
	  name.

	* ext/win32/lib/win32/registry.rb (Win32::Registry#each_key): ditto.

	* ext/win32/lib/win32/registry.rb (Win32::Registry#export_string):
	  encode to locale encoding if default internal is not set.

Tue Sep 24 16:35:09 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/win32/lib/win32/registry.rb (Win32::Registry::API#EnumKey):
	  size of the name is in WCHARs, not in bytes.

Tue Sep 24 14:07:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* gc.c (free_method_cache_entry_i): unused function

	* gc.c (rb_free_mc_table): ditto

	* internal.h (method_cache_entry_t): unused struct

	* vm_method.c (verify_method_cache): remove unused variable

	* vm_method.c (rb_method_entry): ditto

Tue Sep 24 14:01:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* class.c (class_alloc): remove mc_tbl

	* gc.c (obj_free): ditto

	* internal.h (struct rb_classext_struct): ditto

	* method.h (rb_method_entry): remove ent param

	* vm_method.c: restore the global method cache. Per class cache tables
	  turned out to be far too slow.

	  [ruby-core:57289] [Bug #8930]

Tue Sep 24 12:51:07 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/win32/lib/win32/registry.rb (Win32::Registry::API): need
	  Constants.

	* ext/win32/lib/win32/registry.rb (Win32::Registry::API#EnumValue):
	  size of the name is in WCHARs, not in bytes.

Mon Sep 23 22:16:09 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enc/encdb.c, enc/utf_16_32.h (ENC_DUMMY_UNICODE): Unicode with BOM
	  must be based on big endian variants, so that actual encodings would
	  work.  [ruby-core:57318] [Bug #8940]

Mon Sep 23 12:11:26 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* hash.c (env_each_pair): do not call rb_assoc_new() if
	  it isn't needed.

Mon Sep 23 10:42:30 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/ruby/test_module.rb (TestModule#test_include_toplevel): test
	  for top level main.include.  based on a part of the patch by
	  kyrylo at [GH-395].

Mon Sep 23 05:07:49 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/intern.h (rb_ary_cat): move from internal.h, since it
	  is described in README.EXT.

Sun Sep 22 20:55:20 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* vm_insnhelper.c (vm_make_proc_with_iseq): fix bug message.
	  This is follow up to changes in r42637.

Sun Sep 22 20:35:38 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* ext/-test-/tracepoint/tracepoint.c (Init_tracepoint): prevent from GC.

Sun Sep 22 19:00:28 2013  Benoit Daloze  <eregontp@gmail.com>

	* benchmark/bm_app_answer.rb: revert r42990, benchmark scripts should
	  be self-contained and avoid dependencies, especially such small one.
	  See https://github.com/ruby/ruby/pull/393#issuecomment-24861301.

Sat Sep 21 20:11:06 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* process.c (rb_fork_internal): remove cloexec setting on pipes
	  created by rb_cloexec_pipe.  patch by normalperson (Eric Wong) at
	  [ruby-core:56523].  [Bug #8769]

Sat Sep 21 01:04:25 2013  Zachary Scott  <e@zzak.io>

	* lib/benchmark.rb: [DOC] grammar of Benchmark#bm [Bug #8888]
	  Patch by Prathamesh Sonpatki

Sat Sep 21 00:50:02 2013  Zachary Scott  <e@zzak.io>

	* enumerator.c: [DOC] Enumerator#each arguments documentation [GH-388]
	  Patch by @kachick  https://github.com/ruby/ruby/pull/388

Sat Sep 21 00:49:16 2013  Zachary Scott  <e@zzak.io>

	* enum.c: [DOC] Enumerable#to_a accepts arguments [GH-388]
	  Patch by @kachick https://github.com/ruby/ruby/pull/388

Sat Sep 21 00:47:44 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_conv_enc_opts): make sure to scan coderange to get
	  rid of unnecessary conversion.

Sat Sep 21 00:21:08 2013  Zachary Scott  <e@zzak.io>

	* ext/openssl/lib/openssl/ssl.rb: [DOC] Document OpenSSL::SSLServer
	  Based on a patch by Rafal Lisowski [Bug #8758]

Fri Sep 20 23:54:03 2013  Zachary Scott  <e@zzak.io>

	* lib/gserver.rb: [DOC] correct gserver.rb license [Bug #8913]

Fri Sep 20 23:48:34 2013  Zachary Scott  <e@zzak.io>

	* ext/psych/yaml/yaml.h: [DOC] merge upstream typo fix by @GreenGeorge
	  https://github.com/tenderlove/psych/pull/161

Fri Sep 20 23:37:40 2013  Zachary Scott  <e@zzak.io>

	* lib/securerandom.rb: [DOC] SecureRandom.hex length argument
	  [Fixes GH-394] Patch by @avdi https://github.com/ruby/ruby/pull/394

Fri Sep 20 23:34:48 2013  Zachary Scott  <e@zzak.io>

	* benchmark/bm_app_answer.rb: removed duplicate code [Fixes GH-393]
	  Patch by @gouravtiwari https://github.com/ruby/ruby/pull/393

Fri Sep 20 23:24:08 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (btest, btest-ruby, test-knownbug): add $(RUN_OPTS) to
	  ruby to be run, so that tests are runnable before making exts.

	* common.mk (test-sample): ditto, and use $(MINIRUBY) as rubytest.rb
	  does not need extension libraries.

	* tool/rubytest.rb: pass $(RUN_OPTS) to testing ruby using --run-opt.

Fri Sep 20 15:01:46 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (intern_str): sigil only names are junk, at least one
	  identifier character is needed.  [ruby-dev:47723] [Bug #8928]

	* parse.y (rb_enc_symname_type): fix out of bound access.

Fri Sep 20 14:14:32 2013  Tanaka Akira  <akr@fsij.org>

	* ext/-test-/printf/printf.c (printf_test_call): Fix an end of buffer
	  argument.

Thu Sep 19 16:59:02 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (lambda): adjust position to the beginning of the block.

Thu Sep 19 16:25:06 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vsnprintf.c (BSD_vfprintf): initialize cp so that size is 0 in the
	  commented case.  fix an accidental bug at r16716.

Thu Sep 19 14:33:14 2013  Koichi Sasada  <ko1@atdot.net>

	* NEWS: add a news for r42974.

Thu Sep 19 14:12:02 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: make Symbol objects frozen.
	  [Feature #8906]
	  I want to freeze this good day, too.

	* test/ruby/test_eval.rb: catch up this change.

	* test/ruby/test_symbol.rb: add a test to check frozen symbols.

Thu Sep 19 09:11:33 2013  Eric Hodel  <drbrain@segment7.net>

	* NEWS:  Update for RDoc 4.1.0.preview.1 and RubyGems 2.2.0.preview.1

Thu Sep 19 08:59:41 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rdoc/markdown/literals_1_9.rb:  Fix trailing whitespace.

	  Previously kpeg (which generates this file) added trailing
	  whitespace, but this bug is now fixed.

	* lib/rdoc/markdown.rb:  ditto.

Thu Sep 19 08:33:14 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rdoc:  Update to RDoc 4.1.0.preview.1

	  RDoc 4.1.0 contains a number of enhancements including a new default
	  style and accessibility support.  You can see the changelog here:

	  https://github.com/rdoc/rdoc/blob/v4.1.0.preview.1/History.rdoc

	* test/rdoc:  ditto.

Thu Sep 19 07:16:26 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych.rb: updating Psych version

	* ext/psych/psych.gemspec: ditto

Thu Sep 19 06:39:40 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems/dependency_resolver.rb:  Switch the iterative resolver
	  algorithm from recursive to iterative to avoid possible
	  SystemStackError.

Thu Sep 19 06:29:30 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems 2.2.0.preview.1

	  This brings several new features to RubyGems summarized here:

	  https://github.com/rubygems/rubygems/blob/v2.2.0.preview.1/History.txt

	* test/rubygems:  ditto.

Wed Sep 18 23:14:58 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* string.c (rb_str_enumerate_lines): make String#each_line and
	  #lines not raise invalid byte sequence error when it is called
	  with an argument. The patch also causes performance improvement.
	  [ruby-dev:47549] [Bug #8698]

	* test/ruby/test_m17n_comb.rb (test_str_each_line): remove
	  assertions which check that String#each_line and #lines will
	  raise an error if the receiver includes invalid byte sequence.

Wed Sep 18 16:32:15 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* proc.c (mnew_from_me): allocate structs after allocated wrapper
	  object successfully, to get rid of potential memory leak.

Tue Sep 17 15:54:03 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/shell/command-processor.rb (Shell::CommandProcessor#find_system_command):
	  return executable file only, should ignore directories and
	  unexecutable files.  [ruby-core:57235] [Bug #8918]

	* lib/test/unit/assertions.rb (Test::Unit::Assertions#assert_throw):
	  assertion for throw.  MiniTest::Assertions#assert_throws discards
	  the caught value.

	* lib/test/unit/assertions.rb (Test::Unit::Assertions#assert_nothing_thrown):
	  returns the result of the given block.

Tue Sep 17 12:55:58 2013  Eric Hodel  <drbrain@segment7.net>

	* doc/regexp.rdoc:  [DOC] Replace paragraphs in verbatim sections with
	  plain paragraphs to improve readability as ri and HTML.

Mon Sep 16 07:32:35 2013  Tadayoshi Funaba  <tadf@dotrb.org>

	* complex.c: removed meaningless lines.
	* rational.c: ditto.

Mon Sep 16 00:44:23 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* ext/socket/mkconstants.rb: define MSG_FASTOPEN.
	  [ruby-core:57138] [Feature #8897]

Sun Sep 15 13:31:23 2013  Tadayoshi Funaba  <tadf@dotrb.org>

	* rational.c (nurat_div): reverted r28844, r28886 and r28887.
	  REASON: Nobuyoshi Nakada  <nobu@ruby-lang.org>'s commits are buggy.
	  So Rational#/ may produce exact number with inexact number.
	  Moreover, without reducing.
	  REALLY NONSENSE COMMITS.
	  A bug report by me [ruby-dev:44710] is also caused by this behavior.
	  Kenta Murata  <mrkn@mrkn.jp> patched it up.
	  But he did not fix the origin.
	  Today, the bug is still alive in ruby 1.9.3 and 2.0.0.

Sat Sep 14 06:08:10 2013  Eric Hodel  <drbrain@segment7.net>

	* dir.c (dir_s_glob):  [DOC] Improve wording and layout.

	* dir.c (file_s_fnmatch):  ditto.

	* dir.c (Init_Dir):  [DOC] Document File::Constants::FNM_XXX
	  constants.  (These won't show up in RDoc until a new RDoc is
	  imported.)

Thu Sep 12 14:58:58 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* lib/uri/generic.rb (URI::Generic.find_proxy): return nil if
	  http_proxy environment variable is empty string.
	  [ruby-core:57140] [Bug #8898]

Fri Sep 13 10:40:28 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems 2.1.3

	  Fixed installing platform gems

	  Restored concurrent requires

	  Fixed installing gems with extensions with --install-dir

	  Fixed `gem fetch -v` to install the latest version

	  Fixed installing gems with "./" in their files entries

	* test/rubygems/test_gem_package.rb:  Tests for the above.

	* NEWS:  Updated for RubyGems 2.1.3

Thu Sep 12 22:40:03 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (RUBY_CHECK_SIGNEDNESS): macro to check signedness of a
	  type.

	* configure.in (size_t): must be unsigned.
	  [ruby-core:57149] [Feature #8890]

Thu Sep 12 22:37:08 2013  Anton Ovchinnikov  <revolver112@gmail.com>

	* ext/bigdecimal/bigdecimal.c, ext/digest/md5/md5.c,
	  ext/json/fbuffer/fbuffer.h, ext/json/generator/generator.c:
	  Eliminate less-than-zero checks for unsigned variables.
	  According to section 4.1.5 of C89 standard, size_t is an unsigned
	  type.  These checks were found with 'cppcheck' static analysis tool.
	  [ruby-core:57117] [Feature #8890]

Thu Sep 12 21:35:46 2013  Naohisa Goto  <ngotogenome@gmail.com>

	* Makefile.in (libruby-static.a): change LDFLAGS order. LDFLAGS may
	  include library path that should be specified before LIBS.
	  [ruby-dev:47707] [Bug #8901]

Thu Sep 12 20:07:29 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vsnprintf.c (MAXEXP, MAXFRACT): calculate depending on constants in
	  float.h.

	* vsnprintf.c (BSD_vfprintf): limit length for cvt() to get rid of
	  buffer overflow.  [ruby-core:57023] [Bug #8864]

	* vsnprintf.c (exponent): make expbuf size more precise.

Wed Sep 11 17:30:45 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (RUNRUBY): append -- only after runruby.rb, not
	  cross-compiling baseruby, so that $(RUN_OPT) can be command line
	  options.  [ruby-dev:47703] [Bug #8893]

Wed Sep 11 07:55:17 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* thread.c (rb_mutex_unlock): Mutex#unlock no longer raise
	  an exception even if uses on trap. [Bug #8891]

Tue Sep 10 14:37:01 2013  Shota Fukumori  <sorah@tubusu.net>

	* vm_backtrace.c (vm_backtrace_to_ary): Ignore the second argument if
	  it is nil. [Bug #8884] [ruby-core:57094]

	* test/ruby/test_backtrace.rb (test_caller_with_nil_length):
	  Test for above.

Tue Sep 10 12:39:17 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* class.c (method_entry_i): should exclude refined methods from
	  instance method list.  [ruby-core:57080] [Bug #8881]

Tue Sep 10 12:05:04 2013  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* io.c (rb_f_printf): [DOC] add missing parenthesis in rdoc.

Tue Sep 10 10:08:00 2013  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* NEWS: Update RubyGems note.

Tue Sep 10 09:51:22 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems 2.1.0.  Fixes CVE-2013-4287.

	  See http://rubygems.rubyforge.org/rubygems-update/CVE-2013-4287_txt.html
	  for CVE information.

	  See http://rubygems.rubyforge.org/rubygems-update/History_txt.html#label-2.1.0+%2F+2013-09-09
	  for release notes.

	* test/rubygems:  Tests for the above.

Mon Sep  9 21:31:45 2013  Tanaka Akira  <akr@fsij.org>

	* process.c: Remove spaces between SI prefix and unit to follow
	  SI brochure.
	  http://www.bipm.org/en/si/si_brochure/
	  https://www.nmij.jp/library/units/si/

	* time.c: Ditto.

	* ext/socket/ancdata.c: Ditto.

Mon Sep  9 16:55:59 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_method.c (rb_add_refined_method_entry): clear cache in the
	  refined class since refining a method entry is modifying the class.
	  [ruby-core:57079] [Bug #8880]

Mon Sep  9 09:14:58 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* tool/rbinstall.rb (Gem::Specification#initialize): default date to
	  RUBY_RELEASE_DATE.  [ruby-core:57072] [Bug #8878]

	* tool/rbinstall.rb (Gem::Specification#to_ruby): add date.

Sun Sep  8 16:01:54 2013  Tanaka Akira  <akr@fsij.org>

	* rational.c (f_gcd): Relax the condition to use GMP.

Sun Sep  8 13:56:38 2013  Masaki Suketa <masaki.suketa@nifty.ne.jp>

	* ext/win32ole/win32ole.c (folevariant_initialize): check type of
	  element of array.

	* test/win32ole/test_win32ole_variant.rb (test_s_new_ary): ditto.

Sat Sep  7 21:33:10 2013  Tanaka Akira  <akr@fsij.org>

	* math.c (math_log): Test the sign for bignums.
	  (math_log2): Ditto.
	  (math_log10): Ditto.

Sat Sep  7 20:25:47 2013  Tanaka Akira  <akr@fsij.org>

	* math.c (math_log): Support bignums bigger than 2**1024.
	  (math_log2): Ditto.
	  (math_log10): Ditto.

Sat Sep  7 15:36:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* vm_eval.c (vm_call0): fix prototype, the id parameter should be of
	  type ID, not VALUE

	* vm_insnhelper.c (check_match): the rb_funcall family of functions
	  does not care about refinements. We need to use
	  rb_method_entry_with_refinements instead to call === with
	  refinements. Thanks to Jon Conley for reporting this bug.
	  [ruby-core:57051] [Bug #8872]

	* test/ruby/test_refinement.rb: add test

Sat Sep  7 13:49:40 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* variable.c (classname): the name of class that has
	  non class id should not be nil. This bug was introduced
	  in r36577.

	* test/thread/test_cv.rb: test for change.

Sat Sep  7 13:29:22 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* lib/find.rb (Find.find): respect the encodings of arguments.
	  [ruby-dev:47530] [Feature #8657]

	* test/test_find.rb: add tests.

Sat Sep  7 10:40:32 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/mkconstants.rb (TCP_FASTOPEN): Defined for TCP fast open.
	  [ruby-core:57048] [Feature #8871] patch by Masaki Matsushita.

Fri Sep  6 23:53:31 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* common.mk: use RUNRUBY instead of MINIRUBY because MINIRUBY can't
	  require extension libraries. The patch is from nobu
	  (Nobuyoshi Nakada).

	* ext/thread/extconf.rb: for build ext/thread/thread.c.

	* include/ruby/intern.h: ditto.

	* thread.c: ditto.

	* lib/thread.rb: removed and replaced by ext/thread/thread.c.

	* ext/thread/thread.c: Queue, SizedQueue and ConditionVariable
	  implementations in C. This patch is based on patches from panaggio
	  (Ricardo Panaggio) and funny_falcon (Yura Sokolov) and  ko1
	  (Koichi Sasada). [ruby-core:31513] [Feature #3620]

	* test/thread/test_queue.rb (test_queue_thread_raise): add a test for
	  ensuring that killed thread should be removed from waiting threads.
	  It is based on a code by ko1 (Koichi Sasada). [ruby-core:45950]

Fri Sep  6 22:47:12 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: Define ac_cv_func_clock_getres to yes for mingw*.

Fri Sep  6 21:04:10 2013  Tanaka Akira  <akr@fsij.org>

	* rational.c: Include gmp.h if GMP is used.
	  (GMP_GCD_DIGITS): New macro.
	  (rb_gcd_gmp): New function.
	  (f_gcd_normal): Renamed from f_gcd.
	  (rb_gcd_normal): New function.
	  (f_gcd): Invoke rb_gcd_gmp or f_gcd_normal.

	* internal.h (rb_gcd_normal): Declared.
	  (rb_gcd_gmp): Ditto.

	* ext/-test-/rational: New directory.

	* test/-ext-/rational: New directory.

Fri Sep  6 14:23:22 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (clock_getres): required as well as clock_gettime().
	  [ruby-dev:47699] [Bug #8869]

Fri Sep  6 11:45:27 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* transcode.c (rb_econv_append): new function to append a string data
	  with converting its encoding.  split from rb_econv_substr_append.

Fri Sep  6 02:37:22 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych/visitors/yaml_tree.rb: use double quotes when
	  strings start with special characters.
	  https://github.com/tenderlove/psych/issues/157

	* test/psych/test_string.rb: test for change.

Fri Sep  6 00:05:14 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* class.c (rewrite_cref_stack): remove recursion.

Thu Sep  5 18:05:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* string.c (fstring_cmp): take string encoding into account when
	  comparing fstrings [ruby-core:57037] [Bug #8866]

	* test/ruby/test_string.rb: add test

Thu Sep  5 17:25:49 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_fstring, rb_str_free): use st_data_t instead of VALUE.

	* string.c (rb_fstring): get rid of duplicating already frozen object.

Thu Sep  5 14:01:22 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/optparse.rb:  The Integer acceptable now allows binary and
	  hexadecimal numbers per the documentation.  [ruby-trunk - Bug #8865]

	  DecimalInteger, OctalInteger, DecimalNumeric now validate their input
	  before converting to a number.  [ruby-trunk - Bug #8865]

	* test/optparse/test_acceptable.rb:  Tests for the above, tests for all
	  numeric acceptables for existing behavior.

Thu Sep  5 13:49:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* include/ruby/ruby.h: add RSTRING_FSTR flag

	* internal.h: add rb_fstring() prototype

	* string.c (rb_fstring): deduplicate frozen string literals

	* string.c (rb_str_free): delete fstrings from frozen_strings table when
	  they are GC'd

	* string.c (Init_String): initialize frozen_strings table

Thu Sep  5 12:48:00 2013  Kenta Murata  <mrkn@cookpad.com>

	* configure.in (with_gmp): set with_gmp no if it is empty.

Thu Sep  5 10:41:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* vm_insnhelper.c (vm_getivar): use class sequence to check class
	  identity, instead of pointer + vm state

	* vm_insnhelper.c (vm_setivar): ditto

Thu Sep  5 08:20:58 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (GMP_DIV_DIGITS): New macro.
	  (bary_divmod_gmp): New function.
	  (rb_big_divrem_gmp): Ditto.
	  (bary_divmod_branch): Ditto.
	  (bary_divmod): Use bary_divmod_branch.
	  (bigdivrem): Ditto.

	* internal.h (rb_big_divrem_gmp): Declared.

Thu Sep  5 06:22:42 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_divmod_normal): Reduce temporary array allocations.

Thu Sep  5 02:17:06 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big_divrem_normal): Add GC guards.

Thu Sep  5 00:38:32 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big_divrem_normal): New function.

	* internal.h (rb_big_divrem_normal): Declared.

	* ext/-test-/bignum/div.c: New file.

	* test/-ext-/bignum/test_div.rb: New file.

Thu Sep  5 00:08:44 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigdivrem_normal): Removed.
	  (bary_divmod_normal): New function.
	  (bary_divmod): Use bary_divmod_normal.
	  (bigdivrem): Use bary_divmod_normal.

Wed Sep  4 23:02:12 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigdivrem): Useless declaration removed.

Wed Sep  4 22:56:49 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* numeric.c (NUM_STEP_GET_INF): split from NUM_STEP_SCAN_ARGS(), since
	  inf is not used in num_step_size().

Wed Sep  4 20:22:43 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigdivrem_normal): Add assertions.

Wed Sep  4 19:18:40 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* internal.h (vm_state_version_t): prefer LONG_LONG to uint64_t.

Wed Sep  4 16:28:14 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* internal.h (vm_state_version_t): use uint64_t when it is larger than
	  LONG_LONG, and fallback to unsigned long.

Wed Sep  4 15:37:05 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* enc/trans/utf8_mac-tbl.rb: fix r42789.
	  Fix conversion table and logic. [ruby-dev:47680]

Wed Sep  4 14:08:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* class.c, compile.c, eval.c, gc.h, insns.def, internal.h, method.h,
	  variable.c, vm.c, vm_core.c, vm_insnhelper.c, vm_insnhelper.h,
	  vm_method.c: Implement class hierarchy method cache invalidation.

	  [ruby-core:55053] [Feature #8426] [GH-387]

Wed Sep  4 11:13:40 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (str_gsub): use BEG(0) for whole matched position not
	  return value from rb_reg_search(), for \K matching.
	  [ruby-dev:47694] [Bug #8856]

Wed Sep  4 11:11:37 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (SOLIBS): LIBRUBY_SO also needs linking with gmp, to
	  run worker processes in test-all on non-ELF platforms.

Tue Sep  3 23:01:41 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/parser/test_tree.rb
	  (TestTreeParser::TestInvalid#test_unmatched_close_tag):
	  Compute expected value from test value.

Tue Sep  3 22:59:58 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/parsers/treeparser.rb (REXML::Parsers::TreeParser#parse):
	  Add source information to parse exception on no close tag error.
	  [Bug #8844]  [ruby-dev:47672]
	  Patch by Ippei Obayashi. Thanks!!!
	* test/rexml/parser/test_tree.rb: Add a test for the above case.

Tue Sep  3 22:57:57 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/parser/test_tree.rb: Fix test name to describe test
	  content.

Tue Sep  3 22:54:46 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/parsers/treeparser.rb (REXML::Parsers::TreeParser#parse):
	  Remove needless nested parse exception information.
	  [Bug #8844]  [ruby-dev:47672]
	  Reported by Ippei Obayashi. Thanks!!!
	* test/rexml/parser/test_tree.rb: Add a test for the above case.

Tue Sep  3 22:03:49 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_enc_str_new_cstr): new function to create a string from
	  the C-string pointer with the specified encoding.

Tue Sep  3 21:41:37 2013  Akira Matsuda  <ronnie@dio.jp>

	* eval.c (Init_eval): Make Module#include and Module#prepend public
	  [Feature #8846]

	* test/ruby/test_module.rb (class TestModule): Test for above

Tue Sep  3 21:35:19 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* thread_pthread.c (sys/dyntune.h): for gettune().

	* thread_pthread.c (hpux_attr_getstackaddr): fix missing *.
	  [ruby-core:56983] [Feature #8793]

Tue Sep  3 20:12:46 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (GMP_STR2BIG_DIGITS): New macro.
	  (str2big_gmp): New function.
	  (rb_cstr_to_inum): Use str2big_gmp for big bignums.
	  (rb_str2big_gmp): New function.

	* internal.h (rb_str2big_gmp): Declared.

Tue Sep  3 19:44:40 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/win32/lib/win32/registry.rb (Win32::Registry#values): added.
	  [Feature #7763] [ruby-core:51783]

Tue Sep  3 18:26:00 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/inf-ruby.el (inf-ruby-keys, run-ruby): Add magic autoload
	  comments.

	* misc/rdoc-mode.el (rdoc-mode): Ditto.

	* misc/ruby-electric.el (ruby-electric-mode): Ditto.

	* misc/ruby-style.el (ruby-style-c-mode): Ditto.

Tue Sep  3 17:06:15 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/ruby/test_rubyoptions.rb
	  (TestRubyOptions::SEGVTest::ExpectedStderr): the URL was changed at
	  r42800.

Tue Sep  3 14:48:25 2013  Zachary Scott  <e@zzak.io>

	* lib/thread.rb: [DOC] CV#wait typo by @avdi [Fixes GH-386]
	  https://github.com/ruby/ruby/pull/386

Tue Sep  3 14:37:53 2013  Zachary Scott  <e@zzak.io>

	* error.c: [DOC] Update bug tracker url by @ScotterC [Fixes GH-390]
	  https://github.com/ruby/ruby/pull/390

Tue Sep  3 12:45:23 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_str2big_poweroftwo): New function.
	  (rb_str2big_normal): Ditto.
	  (rb_str2big_karatsuba): Ditto.

	* internal.h (rb_str2big_poweroftwo): Declared.
	  (rb_str2big_normal): Ditto.
	  (rb_str2big_karatsuba): Ditto.

	* ext/-test-/bignum/str2big.c: New file.

	* test/-ext-/bignum/test_str2big.rb: New file.

	* ext/-test-/bignum/depend: Add the dependency for str2big.c.

Tue Sep  3 12:09:08 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (rb_clock_gettime): Support times() based monotonic clock.
	  (rb_clock_getres): Ditto.

Tue Sep  3 12:03:02 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (str2big_scan_digits): Extracted from rb_cstr_to_inum.

Tue Sep  3 11:23:57 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (rb_w32_select_with_thread): rounding up the fraction of
	  tv_usec instead of rounding down.
	  this change is an experiment to get rid of failures on vc10-x64 CI.

Tue Sep  3 11:00:28 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (do_select): constify timeout.

	* win32/win32.c (rb_w32_select_with_thread): constify 10ms wait and
	  0ms wait structs.

Tue Sep  3 10:03:42 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/openssl/test_pair.rb
	  (OpenSSL::TestPair#test_write_nonblock_no_exceptions): on some CIs
	  such as Debian 6.0, Ubuntu 10.04, CentOS and vc10-x64 (maybe depend
	  on OpenSSL version), writing to SSLSocket after SSL_ERROR_WANT_WRITE
	  causes SSL_ERROR_SSL "bad write retry".

Tue Sep  3 08:20:46 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* enc/trans/utf8_mac-tbl.rb: update conversion table to recent OS X.
	  Previous table is used on Mac OS X 10.1 or prior.
	  This table is used on 10.2 or later. [ruby-dev:47680]

Tue Sep  3 07:49:25 2013  Akinori MUSHA  <knu@iDaemons.org>

	* numeric.c (NUM_STEP_SCAN_ARGS): On second thought, keep
	  Numeric#step backward compatible in that it raises TypeError
	  when nil is given as second argument.

	* test/ruby/test_float.rb (TestFloat#test_num2dbl): Revert.

	* test/ruby/test_numeric.rb (TestNumeric#test_step): Fix test
	  cases for the above change.

Tue Sep  3 07:39:58 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bytes_2comp): Define it only for little endian
	  environment.

Tue Sep  3 07:31:29 2013  Akinori MUSHA  <knu@iDaemons.org>

	* numeric.c (NUM_STEP_SCAN_ARGS): Numeric#step should raise
	  TypeError if a non-numeric parameter is given.

	* test/ruby/test_float.rb (TestFloat#test_num2dbl): Allow nil as
	  step, as with the keyword argument.

	* test/ruby/test_numeric.rb (TestNumeric#test_step): Add tests for
	  nil as step or limit.

Tue Sep  3 07:28:49 2013  Tanaka Akira  <akr@fsij.org>

	* internal.h (bit_length): Add casts to fix compilation error with
	  clang 3.0 -Werror,-Wshorten-64-to-32.
	  [ruby-dev:47687] reported by SASADA Koichi.

Tue Sep  3 03:17:26 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_insnhelper.c (vm_search_super_method): use ci->argc instead of
	  ci->orig_argc. ci->argc can be changed by splat arguments.
	  [ruby-list:49575]
	  This fix should be applied to Ruby 2.0.0 series.

	* test/ruby/test_super.rb: add a test for above.

Mon Sep  2 23:46:29 2013  Akinori MUSHA  <knu@iDaemons.org>

	* numeric.c (num_step): Default the limit argument to infinity and
	  allow it to be omitted.  Keyword arguments (by: and to:) are
	  introduced for ease of use. [Feature #8838] [ruby-dev:47662]
	  [ruby-dev:42194]

	* numeric.c (num_step): Optimize for infinite loop.

Mon Sep  2 22:55:59 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (ISDIGIT): Unused macro removed.

Mon Sep  2 22:49:15 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (str2big_poweroftwo): Extracted from rb_cstr_to_inum.
	  (str2big_normal): Ditto.
	  (str2big_karatsuba): Ditto.

Mon Sep  2 14:39:29 2013  Akinori MUSHA  <knu@iDaemons.org>

	* ruby.c (Process#setproctitle): [DOC] Fix and improve rdoc.

	* ruby.c (Process#argv0): [DOC] Improve rdoc.

Mon Sep  2 14:15:00 2013  Kenta Murata  <mrkn@cookpad.com>

	* NEWS: fix description of number literal suffixes.

Mon Sep  2 14:01:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* test/rake/test_rake_rules.rb: add space after string literal to
	  prevent conflict with string options syntax "foo"opts

	* test/rss/rss-assertions.rb: ditto

Mon Sep  2 12:28:38 2013  Tanaka Akira  <akr@fsij.org>

	* test/ruby/test_bignum.rb (test_interrupt_during_to_s): Disable it
	  when GMP is used.

Mon Sep  2 07:02:10 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (Init_Bignum): Define Bignum::GMP_VERSION when GMP is used.

Mon Sep  2 01:46:14 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2str_generic): Reduce arguments.
	  (big2str_gmp): Ditto.
	  (rb_big2str1): Follow the above change.

Mon Sep  2 00:08:08 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (get_mach_timebase_info): Extracted from rb_clock_gettime.
	  (rb_clock_gettime): Use get_mach_timebase_info.
	  (rb_clock_getres): Support MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC.

Sun Sep  1 23:30:47 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (GMP_BIG2STR_DIGITS): New constant.
	  (big2str_gmp): New function.
	  (rb_big2str1): Use big2str_gmp for big bignums.

	* internal.h (rb_big2str_gmp): Declared.

	* ext/-test-/bignum/big2str.c (big2str_gmp): New method.

Sun Sep  1 22:37:51 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_mul_gmp): Use mpz_init and mpz_clear instead of
	  mpz_inits and mpz_clears.
	  Older GMP don't have them.

Sun Sep  1 21:17:54 2013  Tanaka Akira  <akr@fsij.org>

	* test/net/http/test_http.rb (test_bind_to_local_port): Choose an open
	  port more reliably.

Sun Sep  1 20:32:40 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2str_base_poweroftwo): Renamed from
	  big2str_base_powerof2.
	  (rb_big2str_poweroftwo): New function for test.
	  (big2str_generic): Extracted from rb_big2str1.
	  (rb_big2str_generic): New function for test.

	* internal.h (rb_big2str_poweroftwo): Declared.
	  (rb_big2str_generic): Ditto.

	* ext/-test-/bignum/big2str.c: New file.

	* test/-ext-/bignum/test_big2str.rb: New file.

Sun Sep  1 15:21:21 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2str_2bdigits): Renamed from big2str_orig.

Sun Sep  1 13:02:24 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c: Remove BITSPERDIG >= INT_MAX test.  The static assertion,
	  SIZEOF_BDIGITS <= sizeof(BDIGIT) is enough.

Sun Sep  1 11:38:26 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (maxpow_in_bdigit): Removed.

Sun Sep  1 10:30:42 2013  Tanaka Akira  <akr@fsij.org>

	* numeric.c (rb_fix_bit_length): Moved from bignum.c.

Sun Sep  1 09:55:45 2013  Tanaka Akira  <akr@fsij.org>

	* internal.h (bit_length): Moved from bignum.c.
	  (nlz_int): Ditto.
	  (nlz_long): Ditto.
	  (nlz_long_long): Ditto.
	  (nlz_int128): Ditto.

Sun Sep  1 03:32:22 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bit_length): Renamed from bitsize.

Sun Sep  1 00:07:09 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big_bit_length): New method.
	  (rb_fix_bit_length): Ditto.
	  [ruby-core:56247] [Feature #8700]

Sat Aug 31 22:18:29 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (rb_clock_getres): New method.
	  (timetick2dblnum_reciprocal): New function.

	* configure.in: Check clock_getres.

	[ruby-core:56780] [Feature #8809] accepted as a CRuby feature at
	DevelopersMeeting20130831Japan
	https://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20130831Japan

Sat Aug 31 21:02:07 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c: Use GMP to accelerate big Bignum multiplication.
	  (bary_mul_gmp): New function.
	  (bary_mul): Use bary_mul_gmp.
	  (bigsq): Use different threshold with GMP.

	* configure.in: Detect GMP.

	[ruby-core:56658] [Feature #8796]

Sat Aug 31 15:03:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* compile.c (NODE_MATCH3): pass CALL_INFO to opt_regexpmatch2

	* insns.def (opt_regexpmatch2): use CALL_SIMPLE_METHOD to call =~ if
	  the receiver is not a T_STRING [Bug #8847] [ruby-core:56916]

Sat Aug 31 14:07:11 2013  Tanaka Akira  <akr@fsij.org>

	* lib/securerandom.rb (random_bytes): Use Process.clock_gettime.

Sat Aug 31 00:25:15 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/encoding.h (rb_{ascii8bit,utf8,usascii}_encindex): get
	  rid of conflict with macros defined in internal.h.

Fri Aug 30 22:37:57 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* thread_pthread.c (native_thread_init_stack): wait the creator thread
	  to fill machine stack info, if get_stack_of() is available.

	* thread_pthread.c (native_thread_create): fill the created thread
	  stack info after starting, if get_stack_of() is available.

	* thread_pthread.c (native_thread_create): define attr only if it is
	  used, and merge pthread_create() calls.

	* thread_pthread.c (get_main_stack): separate function to get stack of
	  main thread.

Thu Aug 29 18:05:33 2013  Koichi Sasada  <ko1@atdot.net>

	* struct.c (rb_struct_define_without_accessor_under): added.
	  This function is similar to rb_define_class_under() against
	  rb_define_class().

	* include/ruby/intern.h: add a declaration of this function.

Thu Aug 29 17:03:10 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_insnhelper.c (vm_call_method): a method entry refers the based
	  class/module, so should search superclass from the origin i-class
	  where the entry belongs to, to get rid of infinite loop when zsuper
	  in a prepended class/module.  [ruby-core:54105] [Bug #8238]

Thu Aug 29 05:35:58 2013  Eric Hodel  <drbrain@segment7.net>

	* ext/zlib/zlib.c (zstream_run):  Fix handling of deflate streams that
	  need a dictionary but are being decompressed by Zlib::Inflate.inflate
	  (which has no option to set a dictionary).  Now Zlib::NeedDict is
	  raised instead of crashing.  [ruby-trunk - Bug #8829]
	* test/zlib/test_zlib.rb (TestZlibInflate):  Test for the above.

Thu Aug 29 02:40:45 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych/scalar_scanner.rb: invalid floats should be
	  treated as strings.
	  https://github.com/tenderlove/psych/issues/156

	* test/psych/test_string.rb: test for change

Wed Aug 28 17:20:07 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* thread_pthread.c (hpux_attr_getstackaddr): basic support for the
	  get_stack() under HP-UX.  based on the patch by michal@rokos.cz
	  (Michal Rokos) at [ruby-core:56645].  [Feature #8793]

Wed Aug 28 11:24:20 2013  Michal Rokos  <michal@rokos.cz>

	* configure.in (sys/pstat.h): fix missing header check for
	  missing/setproctitle.c on HP-UX.  [ruby-core:56644] [Bug #8792]

Wed Aug 28 04:54:33 2013  Eric Hodel  <drbrain@segment7.net>

	* ext/openssl/ossl_ssl.c (ossl_ssl_read):  Replace duplicate
	  wait_writable with wait_readable.

Tue Aug 27 17:18:40 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/timeout.rb (Timeout#timeout): skip rescue clause only when no
	  exception class is given.

Tue Aug 27 17:02:58 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (copy_stream_body): should write in binary mode.  based on a
	  patch by godfat (Lin Jen-Shin) at [ruby-core:56556].
	  [ruby-core:56518] [Bug #8767]

Tue Aug 27 17:02:33 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (copy_stream_body): move common open flags.

Tue Aug 27 16:56:50 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enumerator.c (enumerator_size): use rb_check_funcall() instead of
	  respond_to? and call.

	* enumerator.c (enumerator_each): ensure that argument array size
	  does not overflow at appending.

Tue Aug 27 16:46:05 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (rb_ary_index, rb_ary_rindex): use optimized equality to
	  improve performance.  [Feature #8820]

	* vm_insnhelper.c (rb_equal_opt): optimized equality function.

Tue Aug 27 16:11:05 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_insnhelper.c (opt_eq_func): use RBASIC_CLASS() instead of HEAP_CLASS_OF().

	* insns.def (opt_plus, opt_minus, opt_mult, opt_div, opt_mod, opt_lt),
	  (opt_gt, opt_ltlt, opt_aref, opt_aset, opt_length, opt_size),
	  (opt_empty_p, opt_succ): ditto.

Tue Aug 27 16:08:26 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_eval.c (rb_check_funcall, rb_check_funcall_with_hook): constify
	  argv.

Tue Aug 27 13:03:33 2013  Koichi Sasada  <ko1@atdot.net>

	* ext/stringio/stringio.c (strio_read_nonblock): declare local
	  variables at the first of function.

Tue Aug 27 11:51:37 2013  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* enumerator.c: Allow Enumerator size argument to be any callable.
	  Patch by Avdi Grimm. [bug #8641] [ruby-core:56032] [fix GH-362]

	* test/ruby/test_enumerator.rb: Test for above

Tue Aug 27 11:46:31 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_profile_clear): do rest_sweep() before clearing
	  profile.current_record.

Tue Aug 27 07:35:05 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* io.c (io_read_nonblock): support non-blocking reads without raising
	  exceptions. As in: `io.read_nonblock(size, exception: false)`
	  [ruby-core:38666] [Feature #5138]
	* ext/openssl/ossl_ssl.c (ossl_ssl_read_internal): ditto
	* ext/stringio/stringio.c (strio_sysread): ditto
	* io.c (rb_io_write_nonblock): support non-blocking writes without
	  raising an exception.
	* ext/openssl/ossl_ssl.c (ossl_ssl_write_internal): ditto
	* test/openssl/test_pair.rb (class OpenSSL): tests
	* test/ruby/test_io.rb (class TestIO): ditto
	* test/socket/test_nonblock.rb (class TestSocketNonblock): ditto
	* test/stringio/test_stringio.rb (class TestStringIO): ditto

Tue Aug 27 05:24:34 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Import RubyGems 2.1.0 Release Candidate
	* test/rubygems:  ditto.

Mon Aug 26 16:24:58 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (parser_nextc): warn carriage return in middle of line.
	  [ruby-core:56240] [Feature #8699]

Mon Aug 26 15:27:39 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/timeout.rb (Timeout#timeout): should not be caught by rescue
	  clause.  [Bug #8730]

Mon Aug 26 14:44:26 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c (rb_ary_splice): use RARRAY_PTR_USE() without WB because
	  there are not new relations.

	* enum.c (enum_sort_by): ditto.

	* struct.c (setup_struct): use RARRAY_RAWPTR().

	* vm_eval.c (yield_under): ditto.

	* ext/pathname/pathname.c (path_entries): use RARRAY_AREF().

	* ext/pathname/pathname.c (path_s_glob): ditto.

Mon Aug 26 13:11:10 2013  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* array.c (ary_ensure_room_for_push): fix typo in r42658.

Mon Aug 26 12:37:10 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* template/sizes.c.tmpl: generate automatically by extracting
	  RUBY_CHECK_SIZEOF from configure.in.

Mon Aug 26 10:16:59 2013  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* process.c (gcd_timetick_int): Renamed from gcd_timtick_int.

Sun Aug 25 21:02:15 2013  Tanaka Akira  <akr@fsij.org>

	* sizes.c (Init_sizes): Define the size of clock_t.

Sun Aug 25 01:47:47 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (BARY_SHORT_MUL): Renamed from BARY_MUL1.
	  (bary_short_mul): Renamed from bary_mul1.

Sat Aug 24 10:35:09 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (rb_clock_gettime): The emulated clock names changed.

Fri Aug 23 22:22:07 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (rb_clock_gettime): Add a cast to fix compile error by
	  -Werror,-Wshorten-64-to-32.

Fri Aug 23 22:12:13 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* process.c (rb_intern): no symbol cache while initialization.

Fri Aug 23 22:07:45 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (clock_t): needs time.h.

Fri Aug 23 21:37:28 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (reduce_factors): New function.
	  (timetick2dblnum): Use reduce_factors.
	  (timetick2integer): Ditto.
	  (make_clock_result): Follow the above change.
	  (rb_clock_gettime): Ditto.

Fri Aug 23 21:00:55 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (timetick_int_t): Renamed from timetick_giga_count_t.
	  (gcd_timtick_int): Renamed from gcd_ul and make the arguments
	  timetick_giga_count_t.
	  (reduce_fraction): Make the arguments timetick_int_t.
	  (timetick2integer): Ditto.
	  (make_clock_result): Ditto.
	  (timetick2dblnum): Fix the return type.
	  (rb_clock_gettime): Use timetick_int_t.

Fri Aug 23 20:50:40 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (gcd_ul): New function.
	  (reduce_fraction): Ditto.
	  (reduce_fraction): Ditto.
	  (timetick2dblnum): Ditto.
	  (timetick2integer): Ditto.
	  (make_clock_result): Use timetick2dblnum and timetick2integer.
	  (rb_clock_gettime): Follow the make_clock_result change.

Fri Aug 23 18:39:04 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c (ary_make_shared): shared ary as shady. Need more effort to
	  make it normal object.

	* array.c (rb_ary_modify): use RARRAY_PTR_USE() without WB because
	  there are not new relations.

	* array.c (ary_ensure_room_for_unshift): use RARRAY_RAWPTR() because
	  there are not new relations.

Fri Aug 23 11:25:57 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c: introduce ARY_SHARED_OCCUPIED(shared).

Fri Aug 23 11:07:08 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/Makefile.sub (config.h): now SIZEOF_CLOCK_T is needed for
	  unsigned_clock_t.

Thu Aug 22 22:01:04 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (rb_clock_gettime): Strip "s" from unit names.

Thu Aug 22 20:14:59 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (unsigned_clock_t): Defined.
	  (rb_clock_gettime): Consider clock_t overflow for
	  ISO_C_CLOCK_BASED_CLOCK_PROCESS_CPUTIME_ID.

	* configure.in: Check the size of clock_t.

Thu Aug 22 16:22:48 2013  Koichi Sasada  <ko1@atdot.net>

	* compile.c (build_postexe_iseq): fix to setup the local table.

Thu Aug 22 15:42:43 2013  Koichi Sasada  <ko1@atdot.net>

	* compile.c (rb_iseq_compile_node): accept NODE_IFUNC to support
	  custom compilation.

	* compile.c (NODE_POSTEXE): compile to
	  "ONCE{ VMFrozenCore::core#set_postexe{...} }" with a new custom
	  compiler `build_postexe_iseq()'.

	* vm.c (m_core_set_postexe): remove parameters (passed by a block).

Thu Aug 22 06:54:15 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (rb_clock_gettime): Change emulation symbols for
	  Process.clock_gettime.

Thu Aug 22 06:24:54 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (make_clock_result): Extracted from rb_clock_gettime.

Wed Aug 21 22:30:51 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (rb_clock_gettime): clock() based CLOCK_PROCESS_CPUTIME_ID
	  emulation implemented.

Wed Aug 21 21:02:37 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (rb_proc_times): Use RB_GC_GUARD to guard objects from GC.

Wed Aug 21 20:33:01 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (get_clk_tck): Extracted from rb_proc_times.
	  (rb_clock_gettime): times() based CLOCK_PROCESS_CPUTIME_ID emulation
	  is implemented.

Wed Aug 21 19:31:48 2013  Tanaka Akira  <akr@fsij.org>

	* process.c: POSIX_GETTIMEOFDAY_CLOCK_REALTIME is renamed to
	  SUS_GETTIMEOFDAY_CLOCK_REALTIME.

Wed Aug 21 19:17:46 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (rb_clock_gettime): CLOCK_PROCESS_CPUTIME_ID emulation
	  using getrusage is implemented.

Wed Aug 21 17:34:27 2013  Tanaka Akira  <akr@fsij.org>

	* gc.c (getrusage_time): Fallback clock_gettime to getrusage when
	  clock_gettime fails.
	  Reported by Eric Saxby.  [ruby-core:56762] [Bug #8805]

Wed Aug 21 02:32:32 2013  Koichi Sasada  <ko1@atdot.net>

	* insns.def: fix regexp's once option behavior.
	  fix [ruby-trunk - Bug #6701]

	* insns.def: remove `onceinlinecache' and introduce `once' instruction.
	  `once' doesn't use `setinlinecache' insn any more.

	* vm_core.h: `union iseq_inline_storage_entry' to store once data.

	* compile.c: catch up above changes.

	* iseq.c: ditto.

	* vm.c, vm_insnhelper.c: ditto. fix `m_core_set_postexe()' which
	  is depend on `onceinlinecache' insn.

	* test/ruby/test_regexp.rb: add tests.

	* iseq.c: ISEQ_MINOR_VERSION to 1 (should increment major?)

Wed Aug 21 02:30:15 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rb_gcdebug_print_obj_condition): add printing information.

Tue Aug 20 13:38:00 2013  Naohisa Goto  <ngotogenome@gmail.com>

	* test/gdbm/test_gdbm.rb: skip TestGDBM#test_s_open_lock on Solaris.
	  On Solaris (and platforms which do not have flock and have lockf),
	  with GDBM 1.10, gdbm_open(3) blocks when opening already locked
	  gdbm file. [Bug #8790] [ruby-dev:47631]

Tue Aug 20 02:32:52 2013  Zachary Scott  <e@zzak.io>

	* lib/test/: [DOC] Document Test::Unit, hide most submodules and
	  classes from rdoc. Since lib/test is only present as a compatibility
	  layer with the legacy test suite many test/unit users will be using
	  minitest or the test/unit gem instead. It is recommended to use one
	  of these alternatives for writing new tests.

	  This patch was based on a patch submitted by Steve Klabnik.
	  [ruby-core:56694] [Bug #8778]

Tue Aug 20 02:10:19 2013  Zachary Scott  <e@zzak.io>

	* lib/rss/rss.rb: [DOC] Document for constants by Steve Klabnik
	  [ruby-core:56705] [Bug #8798]

Tue Aug 20 02:01:10 2013  Zachary Scott  <e@zzak.io>

	* lib/rss/xmlparser.rb: [DOC] Hide legacy constant from rdoc
	  Patch by Steve Klabnik [ruby-core:56708] [Bug #8799]

Tue Aug 20 01:52:05 2013  Zachary Scott  <e@zzak.io>

	* ext/socket/unixserver.c: [DOC] Document #accept
	* ext/socket/tcpserver.c: ditto
	* ext/socket/udpsocket.c: [DOC] Fix indentation of documentation
	* ext/socket/socket.c: ditto
	  Patches by David Rodr'iguez [ruby-core:56734] [Bug #8802]

Tue Aug 20 01:19:22 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: Define ac_cv_func_clock_gettime to yes for mingw*.

Mon Aug 19 21:31:35 2013  Tanaka Akira  <akr@fsij.org>

	* include/ruby/defines.h: Fix a compilation error with
	  i586-mingw32msvc-gcc of gcc-mingw32 package on Debian squeeze.
	  ruby/missing.h should be included before include/ruby/win32.h
	  because struct timespec, used in the clock_gettime declaration in
	  include/ruby/win32.h, is defined in ruby/missing.h instead of
	  system headers.

Mon Aug 19 20:55:12 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: fix around GC_DEBUG.

	* gc.c (RVALUE::line): should be VALUE. On some environment
	  (such as mswin64), `int' introduces alignment mismatch.

	* gc.c (newobj_of): add an assertion to check VALUE alignment.

	* gc.c (aligned_malloc): `&' is low priority than `=='.

	* gc.c: define GC_DEBUG everytime and use it as value 0 or 1.

Mon Aug 19 17:43:44 2013  Koichi Sasada  <ko1@atdot.net>

	* test/ruby/test_fiber.rb: collect garbage fibers immediately.

Mon Aug 19 17:41:49 2013  Koichi Sasada  <ko1@atdot.net>

	* test/profile_test_all.rb: add `failed?' information.

Mon Aug 19 17:00:53 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* process.c (retry_fork): retry with GC if ENOMEM occurred, to free
	  swap/kernel space.

Mon Aug 19 13:28:47 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* include/ruby/win32.h (CLOCK_MONOTONIC): typo.

	* win32/win32.c: removed duplicated declarations.

Mon Aug 19 13:03:08 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (clock_gettime): should not overwrite cache variable
	  with different condition.  otherwise -lrt is not linked and the link
	  fails, after reconfig.

Mon Aug 19 12:56:49 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (Init_process): Add constants: CLOCK_REALTIME_ALARM and
	  CLOCK_BOOTTIME_ALARM.

Sun Aug 18 20:17:41 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* variable.c, vm_method.c: remove dead code.

	* test/ruby/test_fiber.rb, test/ruby/test_thread.rb:
	  change accordingly.

Sun Aug 18 19:32:26 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* error.c, file.c, gc.c, hash.c, thread.c, variable.c, vm_eval.c, bin/erb:
	  $SAFE=4 is obsolete.

Sun Aug 18 14:30:47 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (rb_clock_gettime): Rename POSIX_TIME_CLOCK_REALTIME to
	  ISO_C_TIME_CLOCK_REALTIME.

Sun Aug 18 14:22:45 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: Revert r42604.  It causes linking librt on systems
	  with newer glibc uselessly.

Sun Aug 18 13:18:38 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (Init_process): Add constants: CLOCK_REALTIME_COARSE,
	  CLOCK_MONOTONIC_COARSE and CLOCK_BOOTTIME.

Sun Aug 18 12:41:50 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (clock_gettime): need to check with -lrt prior to check
	  for the function only.  otherwise -lrt is not linked and the link
	  fails, when ac_cv_func_clock_gettime is cached as yes.

Sun Aug 18 10:05:12 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big2str1): Make an expression more explicit.

Sun Aug 18 03:18:45 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big2str1): Use power_level instead of bitsize(xn).

Sun Aug 18 00:44:58 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (BIGDIVREM_EXTRA_WORDS): Redefine to 1.
	  (bigdivrem_num_extra_words): Removed.
	  (bigdivrem_normal): Simplified.
	  (big2str_karatsuba): Ditto.

Sat Aug 17 23:25:19 2013  Benoit Daloze  <eregontp@gmail.com>

	* test/ruby/test_time.rb: use the in_timezone() helper
	  and define it at the top with other helpers.

Sat Aug 17 22:20:47 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* time.c (time_mload): ignore auxiliary data, offset and zone, if
	  invalid.  [ruby-core:56648] [Bug #8795]

Sat Aug 17 20:11:49 2013  Benoit Daloze  <eregontp@gmail.com>

	* process.c: [DOC] MACH_ABSOLUTE_TIME_CLOCK_MONOTONIC is an
	  available emulation for a monotonic clock on Darwin.
	  https://developer.apple.com/library/mac/qa/qa1398/_index.html

Fri Aug 16 18:12:05 2013  Koichi Sasada  <ko1@atdot.net>

	* test/profile_test_all.rb: fix typo.

Fri Aug 16 18:09:20 2013  Koichi Sasada  <ko1@atdot.net>

	* test/profile_test_all.rb: remove space characters from test names.

Fri Aug 16 17:32:02 2013  Koichi Sasada  <ko1@atdot.net>

	* test/profile_test_all.rb: refactoring memory profiling tool for
	  test-all.
	  Add profiling targets /proc/meminfo and /proc/self/status.

	* test/runner.rb: accept other than 'true'.

Fri Aug 16 11:23:35 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* file.c (rb_file_size, rb_file_flock): improve performance of Windows.

	* file.c (rb_file_truncate): removed unnecessary #ifdef.

	* test/test_file.rb (TestFile#test_truncate_size): added an assertion
	  for File#size.

Fri Aug 16 10:07:59 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigdivrem_single1): Renamed from bigdivrem_single.  Add
	  x_higher_bdigit argument.
	  (bigdivrem_single): Just call bigdivrem_single1.
	  (bigdivrem_restoring): Use bigdivrem_single1 to avoid memmove.

Fri Aug 16 09:17:00 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_small_rshift): Specify the higher BDIGIT instead of
	  sign bit.
	  (big_shift3): Follow the above change.

Fri Aug 16 02:20:39 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_mul_toom3): Reduce a branch.

Fri Aug 16 02:14:09 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* process.c (rb_clock_gettime): add CLOCK_MONOTONIC support on OS X.
	  http://developer.apple.com/library/mac/qa/qa1398/_index.html
	  [Feature #8658]

Fri Aug 16 01:37:43 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigdivrem_single): Use shift when y is a power of two.

Fri Aug 16 01:09:33 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigdivrem_restoring): Use bigdivrem_single if non-topmost
	  BDIGITs of y are zero.

Fri Aug 16 00:33:12 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big2str1): Truncate topmost zeros of x.

Fri Aug 16 00:00:57 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_divmod): Simplify an expression.

Thu Aug 15 23:26:12 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigdivrem_normal): Remove a local variable.

Thu Aug 15 23:08:32 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2str_karatsuba): Use bigdivrem_restoring directly to
	  reduce working buffer and memory copy.
	  (rb_big2str1): Allocate working buffer for big2str_karatsuba here.

Thu Aug 15 20:51:29 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* io.c, internal.h (rb_io_flush_raw): new function to select calling
	  fsync() (on Windows).

	* io.c (rb_io_flush_raw): use above function.

	* file.c (rb_file_truncate): use above function.

	* test/ruby/test_file.rb (TestFile#test_truncate_size): test for
	  above changes.

Thu Aug 15 18:39:31 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (clock_gettime): improve precision when freq is less
	  than and nearly equals 10**9.

Thu Aug 15 17:43:15 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_lazy_sweep): remove heap_increment() here because heap_inc
	  may be 0.

Thu Aug 15 16:59:56 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* io.c (rb_io_rewind): remove fsync() for Windows to improve the
	  performance.

Thu Aug 15 16:30:23 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/fileutils/test_fileutils.rb (TestFileUtils#test_rmdir):
	  FileUtils.rmdir ignores Errno::ENOTEMPTY, so, in such cases, this
	  assertion is nonsense.

Thu Aug 15 15:49:35 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (rb_clock_gettime): [DOC] FreeBSD 7.1 supports
	  CLOCK_THREAD_CPUTIME_ID.
	  http://www.freebsd.org/releases/7.1R/relnotes.html

Thu Aug 15 14:30:23 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* include/ruby/win32.h, win32/Makefile.sub, win32/win32.c
	  (clock_gettime): [experimental] emulates clock_gettime(2) of posix.

Thu Aug 15 02:32:40 2013  Zachary Scott  <e@zzak.io>

	* hash.c (rb_hash_aset): [DOC] Document key dup patch by @kachick
	  [Fixes GH-382] https://github.com/ruby/ruby/pull/382

Wed Aug 14 14:28:39 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* proc.c (rb_mod_define_method): now they return the symbols of the
	  defined methods, not the methods/procs themselves.
	  [ruby-dev:42151] [Feature #3753]

	* NEWS: documents about above change and def-expr (see r42337).

	* test/ruby/test_module.rb: tests about above change.

Wed Aug 14 00:51:14 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigdivrem_restoring): xn argument removed.
	  (bigdivrem_normal): Follow the above change.

Wed Aug 14 00:18:39 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big_div_struct): Remove xn and j field.  Add zn field.
	  (bigdivrem1): Follow the above change.
	  (bigdivrem_restoring): Ditto.

Tue Aug 13 23:38:17 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big_div_struct): ynzero field removed.
	  (bigdivrem1): Follow the above change.
	  (bigdivrem_restoring): Ditto.

Tue Aug 13 23:01:16 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigdivrem_restoring): Extracted from bigdivrem_normal.

Tue Aug 13 22:12:59 2013  Kenichi Kamiya  <kachick1@gmail.com>

	* random.c (rb_random_ulong_limited): coerce before check negative.
	  [Fixes GH-379]

Tue Aug 13 21:52:15 2013  Kenichi Kamiya  <kachick1@gmail.com>

	* object.c (Init_Object): undef Module#prepend_features on Class, as
	  well as Module#append_features.  [Fixes GH-376]

	* test_class.rb: Added test for above. And ensure type checking
	  on similar methods as module_function.

Tue Aug 13 08:52:18 2013  Zachary Scott  <e@zzak.io>

	* doc/syntax/literals.rdoc: [DOC] String literal concat by @cknadler
	  [Fixes GH-380] https://github.com/ruby/ruby/pull/380

Mon Aug 12 23:07:21 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (gc_marks_test): inhibit gc for st's operation.

Mon Aug 12 15:59:50 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (parser_whole_match_p): treat CR in middle of a line as a
	  mere whitespace.

Mon Aug 12 15:16:58 2013  Koichi Sasada  <ko1@atdot.net>

	* class.c (rb_prepend_module): make T_ICLASS object shady because
	  this T_ICLASS object seems to share method table with other class
	  objects. It was causes WB miss.
	  TODO: need to know the data structure.

	* test/ruby/test_module.rb: add a test for WB miss.

Mon Aug 12 13:47:54 2013  Zachary Scott  <e@zzak.io>

	* process.c: [DOC] RDoc formatting of Process.clock_gettime

Mon Aug 12 13:29:09 2013  Zachary Scott  <e@zzak.io>

	* lib/yaml/dbm.rb: [DOC] Document call-seq for YAML::DBM

Mon Aug 12 12:57:26 2013  Zachary Scott  <e@zzak.io>

	* ext/dbm/extconf.rb: [DOC] Hide from RDoc
	  Some libraries might want to document extconf.rb so RDoc treats it
	  like any other ruby program. However, DBM users shouldn't care about
	  these methods.

Mon Aug 12 12:53:39 2013  Zachary Scott  <e@zzak.io>

	* ext/dbm/dbm.c: [DOC] Reformat headings of DBM class

Mon Aug 12 12:46:31 2013  Zachary Scott  <e@zzak.io>

	* lib/yaml.rb, lib/yaml/: [DOC] Document YAML::DBM#key and add
	  references to similar methods with more detail. This patch brings
	  lib/yaml to 100% documentation coverage.

Mon Aug 12 02:51:32 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/readline/readline.c (readline_s_set_input): on OS X with editline,
	  Readline.readline doesn't work because readline_get doesn't use
	  rl_getc. The difference is introduced by r42402 [ruby-dev:47509]
	  [Bug #8644]. Before it rb_io_stdio_file set ifp->stdio_file.
	  Therefore add manually setting the value.

	* ext/readline/readline.c (readline_s_set_output): ditto.

Sun Aug 11 23:27:00 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_str_encode_ospath): OS path encoding on Mac OS X is also
	  fixed.

Sun Aug 11 22:57:24 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/ruby/test_require.rb (assert_require_nonascii_path): OS path
	  encoding on Windows is fixed, so encoding of __FILE__ should be it.
	  [ruby-core:56498] [Bug #8764]

Sun Aug 11 19:11:45 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/parser/test_sax2.rb: Expand abbreviated class name.

Sun Aug 11 19:06:03 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/sax2listener.rb (REXML::SAX2Listener#notationdecl): Fix
	  wrong number of arguments in the template listener.
	  [Bug #8731] [ruby-dev:47582]
	  Reported by Ippei Obayashi.
	* test/rexml/parser/test_sax2.rb: Add tests for parsing notation
	  declarations with SAX2 API.

Sun Aug 11 18:44:04 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/sax2listener.rb (REXML::SAX2Listener#elementdecl): Fix wrong
	  examples. [Bug #8731] [ruby-dev:47582]
	  Reported by Ippei Obayashi.

Sun Aug 11 18:42:13 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/parsers/sax2parser.rb
	  (REXML::Parsers::SAX2Parser#handle_entitydecl): Extract.

Sun Aug 11 18:40:25 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/parsers/sax2parser.rb (REXML::Parsers::SAX2Parser#parse):
	  Fix wrong "%" position in parameter entity declaration event argument.
	* test/rexml/parser/test_sax2.rb: Add tests for the above case.

Sun Aug 11 18:08:40 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/parsers/sax2parser.rb (REXML::Parsers::SAX2Parser#parse):
	  Support NDATA in external ID entity declaration.
	* test/rexml/parser/test_sax2.rb: Add tests for the above case.

Sun Aug 11 18:07:39 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/parsers/baseparser.rb
	  (REXML::Parsers::BaseParser#pull_event): Support optional NDATA
	  in external ID entity declaration.

Sun Aug 11 17:54:07 2013  Kouhei Sutou  <kou@cozmixng.org>

	* NEWS (REXML::Parsers::SAX2Parser): Add about this change.
	* lib/rexml/parsers/sax2parser.rb (REXML::Parsers::SAX2Parser#parse):
	  Fix wrong number of arguments. Document says "an array of the
	  entity declaration" but it passes two or more arguments.
	  This is a bug but it break backward compatibility.
	  Reported by Ippei Obayashi. [Bug #8731] [ruby-dev:47582]
	* lib/rexml/sax2listener.rb (REXML::SAX2Listener#entitydecl): ditto.
	  The listener template accepted two arguments.
	* test/rexml/parser/test_sax2.rb: Add tests for external ID case.

Sun Aug 11 17:41:41 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/parser/test_sax2.rb: Add SAX2 API test.

Sun Aug 11 15:10:40 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (rb_enc_symname_type): allow ID_ATTRSET for ID_INSTANCE,
	  ID_GLOBAL, ID_CLASS, ID_JUNK too.  [Bug #8756]

Sun Aug 11 13:17:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* include/ruby/encoding.h: Reduce ENCODING_INLINE_MAX to 127 as this
	  should be sufficient to represent all the encodings Ruby supports.

Sun Aug 11 11:54:38 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (rb_clock_gettime): New method.
	  This is accepted in the meeting:
	  https://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20130809
	  This method is accepted as a CRuby feature.
	  I.e. Other Ruby implementations don't need to implement it.
	  [ruby-core:56087] [Feature #8658]

Sun Aug 11 10:40:48 2013  Zachary Scott  <e@zzak.io>

	* lib/time.rb: [DOC] Correcting rdoc visibility of time.rb constants
	  Reported by Tanaka Akira [ruby-core:56517]

Sun Aug 11 04:48:14 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* file.c (rb_str_normalize_ospath):
	  HFS Plus (Mac OS Extended) uses a variant of Normal Form D in which
	  U+2000 through U+2FFF, U+F900 through U+FAFF, and U+2F800 through
	  U+2FAFF are not decomposed (this avoids problems with round trip
	  conversions from old Mac text encodings).
	  http://developer.apple.com/library/mac/qa/qa1173/_index.html
	  Therefore fix r42457 to exclude the range.

Sun Aug 11 03:26:07 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bitsize): Fix a conditional expression.

Sun Aug 11 02:44:03 2013  Zachary Scott  <e@zzak.io>

	* lib/time.rb: [DOC] Document constants by @markijbema [Fixes GH-377]
	  https://github.com/ruby/ruby/pull/377

Sun Aug 11 01:28:52 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: Revert r42458.
	  It removes the HAVE_CLOCK_GETTIME from config.h.
	  http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20130809T044800Z.diff.html.gz

Sat Aug 10 13:53:22 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (rb_id_attrset): allow other than ID_ATTRSET.

	* parse.y (intern_str): ditto.  try stem ID for ID_INSTANCE,
	  ID_GLOBAL, ID_CLASS, ID_JUNK too.  [Bug #8756]

Sat Aug 10 12:49:50 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/parsers/baseparser.rb
	  (REXML::Parsers::BaseParser::CDATA_END): Use "\A" instead of "^".
	  It is not an used constant but I fix it. (Or should I remove it?)

Sat Aug 10 12:47:19 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/parsers/baseparser.rb (REXML::Parsers::BaseParser):
	  Fix wrong constant name. "]>" pattern match is the same but
	  it is used for "<!DOCTYPE" end mark not "<![CDATA[" end mark.

Sat Aug 10 12:43:15 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/parsers/baseparser.rb (REXML::Parsers::BaseParser):
	  Use "\A" instead of "^" in document type declaration patterns
	  because they are used as the head match in content not the head
	  match in line. They don't cause any problems in the current code
	  but it should be fixed.

Sat Aug 10 12:39:00 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/parse/test_document_type_declaration.rb: Add tests for
	  parsing document type declaration.

Sat Aug 10 12:00:45 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/parsers/baseparser.rb (REXML::Parsers::BaseParser::SYSTEM):
	  Fix loose "head" match regular expression. It doesn't cause any
	  problem in the current code but it should be fixed because readers
	  may confuse it.
	  Patch by Ippei Obayashi. Thanks!!!

Sat Aug 10 11:58:24 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/parse/test_notation_declaration.rb (#test_system_public):
	  Add a test for PUBLIC notation and SYSTEM notation order case.

Sat Aug 10 11:31:35 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/parsers/baseparser.rb (REXML::Parsers::BaseParser::PUBLIC):
	  Fix loose "head" match regular expression.
	  [Bug #8701] [ruby-dev:47551]
	  Patch by Ippei Obayashi. Thanks!!!
	* test/rexml/parse/test_notation_declaration.rb (#test_system_public):
	  Add a test for the above case.

Sat Aug 10 09:20:21 2013  Zachary Scott  <e@zzak.io>

	* NEWS: [DOC] typo in example reported by @moretea
	  https://github.com/ruby/ruby/commit/a39e724#commitcomment-3831489

Sat Aug 10 09:19:04 2013  Zachary Scott  <e@zzak.io>

	* proc.c: [DOC] rdoc code formatting

Sat Aug 10 09:12:01 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (rb_id_attrset): check if the argument is valid type as an
	  attribute.

Sat Aug 10 05:44:08 2013  Zachary Scott  <e@zzak.io>

	* lib/rss/trackback.rb: [DOC] Hide RSS::Trackback from rdoc
	  Patch by Steve Klabnik [Bug #8755] [ruby-core:56456]

Sat Aug 10 04:52:21 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big_div_struct): Use size_t.
	  (bigdivrem1): Ditto.
	  (bigdivrem_num_extra_words): Ditto.
	  (bigdivrem_single): Ditto.
	  (bigdivrem_normal): Ditto.
	  (bary_divmod): Ditto.

Fri Aug  9 23:47:15 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/rexmlparser.rb: Remove needless REXML version check.
	  Both RSS Parser and REXML are bundled in Ruby. RSS Parser can
	  always use the latest REXML. [Bug #8754] [ruby-core:56454]
	  Patch by Steve Klabnik. Thanks!!!

Fri Aug  9 22:51:10 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (XLDFLAGS, LIBRUBYARG_STATIC): CoreFoundation framework
	  option is now needed always, regardless enable-shared.
	  [ruby-core:56467] [Bug #8759]

Fri Aug  9 22:20:51 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ruby.c (load_file_internal): use rb_parser_compile_string_path and
	  rb_parser_compile_file_path, String path name versions.  [Bug #8753]

Fri Aug  9 07:16:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* ext/io/console/console.c: delete redefinition of rb_cloexec_open.
	  drop support for 1.8 and 1.9 from the next release of io-console gem.

Fri Aug  9 19:13:54 2013  Koichi Sasada  <ko1@atdot.net>

	* NEWS: update about new methods for Binding.

Fri Aug  9 18:48:09 2013  Koichi Sasada  <ko1@atdot.net>

	* proc.c: add Binding#local_variable_get/set/defined?
	  to access local variables which a binding contains.
	  Most part of implementation by nobu.

	* test/ruby/test_proc.rb: add a tests for above.

	* vm.c, vm_core.h (rb_binding_add_dynavars): add a new function
	  to add a new environment to create space for new local variables.

Fri Aug  9 14:02:01 2013  SHIBATA Hiroshi  <shibata.hiroshi@gmail.com>

	* tool/make-snapshot: Fix order of priority for option parameter.

Fri Aug  9 12:06:49 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_str_normalize_ospath): normalize to Normalization Form C
	  using CFString.

Fri Aug  9 10:53:57 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* time.c (get_timeval, get_new_timeval): use rb_obj_class()
	  instead of CLASS_OF() because CLASS_OF() may return
	  a singleton class.

Fri Aug  9 10:42:11 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* vm_insnhelper.c (vm_invoke_block): returning from lambda proc
	  now always exits from the Proc. [ruby-core:56193] [Feature #8693]

	* NEWS, test/ruby/test_lambda.rb: ditto. Patch by nobu.

Fri Aug  9 00:10:32 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enumerator.c (lazy_zip_func): fix non-single argument.  fix
	  out-of-bound access and pack multiple yielded values.
	  [ruby-core:56383] [Bug #8735]

Thu Aug  8 23:01:20 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* object.c (rb_mod_singleton_p): new method Module#singleton_class? to
	  return whether the receiver is a singleton class or not.
	  [ruby-core:51087] [Feature #7609]

Thu Aug  8 21:56:44 2013  Tanaka Akira  <akr@fsij.org>

	* time.c (time_overflow_p): Avoid signed integer overflow.
	  (rb_time_new): Fix overflow condition.

Thu Aug  8 19:58:02 2013  Koichi Sasada  <ko1@atdot.net>

	* thread.c (rb_threadptr_pending_interrupt_check_mask):
	  use RARRAY_RAWPTR() instead of RARRAY_PTR() because
	  there is no new reference.

Thu Aug  8 19:56:52 2013  Koichi Sasada  <ko1@atdot.net>

	* string.c (rb_str_format_m): use RARRAY_RAWPTR() instead of
	  RARRAY_PTR() because there is no new reference.

Thu Aug  8 19:55:51 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: define USE_RGENGC_LOGGING_WB_UNPROTECT.

Thu Aug  8 16:44:25 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: add old macro name `RUBY_EVENT_SWITCH'.
	  This macro name is obsolete because it is renamed to
	  RUBY_INTERNAL_EVENT_SWITCH, but it has compatibility problem
	  using this macro name like ruby-prof.
	  I want to remove this macro after ruby 2.1.

Thu Aug  8 15:37:53 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/coverage/test_coverage.rb (TestCoverage#test_big_code): use `1'
	  instead of `p' to get rid of a side effect.
	  Kernel#p without any argument seems to do nothing, but flushes stdout.
	  and, if stdout is redirected to file, fsync() will be called on
	  Windows.  so, when running test-all on Windows with redirection, such
	  as CI environment, this test took a lot of time.

Thu Aug  8 14:54:18 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* NEWS: add description of incompatibility introduced by r42396.
	  [ruby-core:56329] [Bug #8722]

Thu Aug  8 14:50:36 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* common.mk (mini): portable target to build miniruby

	* common.mk (bisect): run git-bisect with miniruby

	* common.mk (bisect-ruby): run git-bisect with ruby

	* tool/bisect.sh: script for git-bisect

Thu Aug  8 12:11:43 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/webrick/test_httpresponse.rb (test_send_body_*_chunked): these
	  expectations assumes that the IOs are binmode.  fixed test failures
	  introduced at r42427 on Windows.

Thu Aug  8 10:27:18 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* range.c (range_last): revert r42400.  [Bug #8739]

Thu Aug  8 10:26:25 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_str_normalize_ospath): extract and move from dir.c.

Thu Aug  8 05:59:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* test/openssl/test_ssl.rb: Fix test for CVE-2013-4073.
	  Patch by Antonio Terceiro. [Bug #8750] [ruby-core:56437]

Thu Aug  8 03:37:38 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/webrick/httpresponse.rb:  Allow #body to be an IO-like object
	  that responds to #readpartial and #read.
	  [ruby-trunk - Feature #8155]
	* NEWS:  NEWS for above
	* test/webrick/test_httpresponse.rb:  Tests for above.

Wed Aug  7 23:06:26 2013  Akinori MUSHA  <knu@iDaemons.org>

	* ruby.c (Process.argv0): New method to return the original value
	  of $0. [Feature #8696]

Wed Aug  7 23:05:55 2013  Akinori MUSHA  <knu@iDaemons.org>

	* ruby.c (Process.setproctitle): New method to change the title of
	  the running process that is shown in ps(1). [Feature #8696]

Wed Aug  7 20:05:38 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big_odd_p): Check the bignum length.
	  (rb_big_even_p): Ditto.

Wed Aug  7 19:29:26 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (dbl2big): A condition simplified.

Wed Aug  7 16:34:30 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/webrick/test_cgi.rb (TestWEBrickCGI#{start_cgi_server,test_cgi}):
	  mswin is not only mswin32 but also mswin64. [Bug #8746]

Wed Aug  7 16:19:12 2013  Koichi Sasada  <ko1@atdot.net>

	* cont.c (rb_fiber_start): use RARRAY_RAWPTR() instead of
	  RARRAY_PTR() because there is no new reference.

	* proc.c (curry): ditto.

	* proc.c (rb_proc_call): remove line break.

Wed Aug  7 13:20:12 2013  Koichi Sasada  <ko1@atdot.net>

	* random.c (random_load): use RARRAY_RAWPTR() instead of
	  RARRAY_PTR() because there is no new reference.

Wed Aug  7 12:58:23 2013  Koichi Sasada  <ko1@atdot.net>

	* thread.c (thread_start_func_2): use RARRAY_RAWPTR() instead of
	  RARRAY_PTR() because there is no new reference.

Wed Aug  7 09:00:24 2013  Zachary Scott  <e@zzak.io>

	* string.c: [DOC] Description of rb_str_equal [Fixes GH-375]
	  Based on a patch by @markijbema
	  https://github.com/ruby/ruby/pull/375

Wed Aug  7 08:30:38 2013  Zachary Scott  <e@zzak.io>

	* ext/openssl/ossl_hmac.c: [DOC] Documentation for OpenSSL::HMAC
	  based on a patch by @repah documenting-ruby/ruby#14
	  https://github.com/documenting-ruby/ruby/pull/14

Wed Aug  7 07:46:23 2013  Zachary Scott  <e@zzak.io>

	* lib/rss/utils.rb: [DOC] RSS::Utils by Steve Klabnik [Bug #8745]

Wed Aug  7 07:38:39 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (nlz16): Removed.
	  (nlz32): Ditto.
	  (nlz64): Ditto.
	  (nlz128): Ditto.
	  (nlz_int): New function.
	  (nlz_long): New function.
	  (nlz_long_long): New function.
	  (nlz_int128): New function.
	  (nlz): Follow above changes.
	  (bitsize): Follow above changes.

Tue Aug  6 22:38:15 2013  Zachary Scott  <e@zzak.io>

	* time.c: [DOC] Typo in Time overview by @sparr [Fixes GH-374]
	  https://github.com/ruby/ruby/pull/374

Tue Aug  6 22:35:32 2013  Zachary Scott  <e@zzak.io>

	* lib/rss/1.0.rb: [DOC] Document RSS10 by Steve Klabnik [Bug #8740]

Tue Aug  6 22:14:11 2013  Kouji Takao  <kouji.takao@gmail.com>

	* ext/readline/readline.c (readline_s_delete_text): remove
	  checking "$SAFE == 4".

	* ext/readline/readline.c: fix rdoc, remove "Raises SecurityError"
	  and add "Raises NotImplementedError".

Tue Aug  6 22:04:38 2013  Kouji Takao  <kouji.takao@gmail.com>

	* ext/readline/readline.c, test/readline/test_readline.rb: fix
	  indent.

Tue Aug  6 21:59:56 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* range.c (range_last): return nil for empty range, or in the case the
	  predecessor is smaller than the begin.  [Bug #8739]

Tue Aug  6 21:48:31 2013  Kouji Takao  <kouji.takao@gmail.com>

	* ext/readline/readline.c (readline_s_set_point, Init_readline):
	  add Readline.point=(pos). Patched by naruse.  [ruby-dev:47535]
	  [Feature #8675]

Tue Aug  6 21:14:11 2013  Kouji Takao  <kouji.takao@gmail.com>

	* ext/readline/readline.c (Init_readline, readline_s_set_output)
	(clear_rl_outstream, readline_s_set_input, clear_rl_instream)
	(readline_readline): fix causing SEGV if closed IO object that is
	  set Readline.input or Readline.output. Patched by akr
	  [ruby-dev:47509] [Bug #8644]

Tue Aug  6 17:56:40 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_insnhelper.c (vm_push_frame): change type of stack_max to size_t.

Tue Aug  6 17:42:47 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* range.c (range_last): exclude the last number of the exclusive range
	  if the end is Numeric.  [ruby-dev:47587] [Bug #8739]

Tue Aug  6 17:42:21 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (rb_w32_conv_from_wchar): converted string to CP_UTF8
	  should have UTF-8 encoding.  otherwise no conversion takes place
	  later.

Tue Aug  6 17:21:38 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_insnhelper.c (vm_push_frame): fix stack overflow check codes.
	  Stack overflow check should be done *after* pushing a stack frame.
	  However, some stack overflow checking codes checked *before*
	  pushing a stack frame with iseq->stack_max.
	  To solve this problem, add a new parameter `stack_max' to specify
	  a possible consuming stack size.

	* vm_core.h (CHECK_VM_STACK_OVERFLOW0): add to share the stack overflow
	  checking code.

	* insns.def: catch up this change.

	* vm.c, vm_eval.c: ditto.

	* test/ruby/test_exception.rb: add a stack overflow test.
	  This code is reported by nobu.

Tue Aug  6 17:02:17 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (rb_w32_conv_from_wchar): use WideCharToMultiByte(),
	  as like as mbstr_to_wstr(), in the first step of the conversion from
	  WCHAR.

Tue Aug  6 16:14:32 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* vm_eval.c (eval_string_with_cref): copy cref to limit the scope of
	  refinements in the eval string. [ruby-core:56329] [Bug #8722]

	* test/ruby/test_refinement.rb: related test.

Tue Aug  6 12:23:12 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big_realloc): Use VALGRIND_MAKE_MEM_UNDEFINED to
	  declare undefined memory area.
	  (bignew_1): Ditto.

	* internal.h (VALGRIND_MAKE_MEM_DEFINED): Moved from gc.c
	  (VALGRIND_MAKE_MEM_UNDEFINED): Ditto.

Tue Aug  6 01:40:37 2013  Zachary Scott  <e@zzak.io>

	* process.c: [DOC] Document caveats of command form of Process.spawn
	  with regard to the shell and OS. Patched by Steve Klabnik [Bug #8550]

Tue Aug  6 01:28:35 2013  Zachary Scott  <e@zzak.io>

	* lib/rss/0.9.rb: [DOC] Typo in example [Bug #8732]

Tue Aug  6 01:22:37 2013  Zachary Scott  <e@zzak.io>

	* lib/rss/2.0.rb: [DOC] Document RSS::Rss by Steve Klabnik #8740
	* lib/rss/atom.rb: [DOC] Typo in rdoc by Steve Klabnik

Mon Aug  5 23:47:59 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c: Rename local variables.

Mon Aug  5 22:23:59 2013  Zachary Scott  <e@zzak.io>

	* vm_trace.c: [DOC] Fix TracePoint return values in examples
	  Based on a patch by @sho-h [Fixes GH-373]
	  https://github.com/ruby/ruby/pull/373

Mon Aug  5 17:38:15 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (rb_w32_write_console): use MultiByteToWideChar() for
	  the last step of conversion to WCHAR, to get rid of warnings from
	  rb_enc_find() in miniruby.  [ruby-dev:47584] [Bug #8733]

	* win32/win32.c (wstr_to_mbstr, mbstr_to_wstr): fix wrong trimming.
	  WideCharToMultiByte() and MultiByteToWideChar() do not count
	  NUL-terminator in the size for conversion result, unless the input
	  length is -1.

Mon Aug  5 11:51:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* include/ruby/encoding.h: document which user flags are used by
	  ENCODING_MASK for better greppability

Mon Aug  5 10:01:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* object.c (rb_class_inherited_p): allow iclasses to be tested for
	  inheritance. [Bug #8686] [ruby-core:56174]

	* test/ruby/test_method.rb: add test

Mon Aug  5 06:13:48 2013  Zachary Scott  <e@zzak.io>

	* enumerator.c: [DOC] Remove reference to Enumerator::Lazy#cycle
	  Patch by @kachick [Fixes GH-372]
	  https://github.com/ruby/ruby/pull/372

Mon Aug  5 03:57:16 2013  Zachary Scott  <e@zzak.io>

	* lib/rss/0.9.rb: [DOC] Document RSS09 by Steve Klabnik [Bug #8732]

Mon Aug  5 03:35:11 2013  Zachary Scott  <e@zzak.io>

	* lib/rexml/attribute.rb: [DOC] Update example for #namespace
	  Patch by Ippei Obayashi [Bug #8685] [ruby-core:56173]

Sun Aug  4 21:08:29 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_zip): performance implement by using
	  ALLOCA_N() to allocate tmp buffer.

Sun Aug  4 07:14:49 2013  Tanaka Akira  <akr@fsij.org>

	* README.EXT, README.EXT.ja: Mention rb_integer_pack and
	  rb_integer_unpack.

Sun Aug  4 01:54:45 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (BARY_TRUNC): New macro.
	  (bary_cmp): Use BARY_TRUNC.
	  (bary_mul_toom3): Ditto.
	  (bary_divmod): Ditto.
	  (abs2twocomp): Ditto.
	  (bigfixize): Ditto.
	  (rb_cstr_to_inum): Ditto.
	  (big2str_karatsuba): Ditto.
	  (bigdivrem): Ditto.

Sun Aug  4 00:57:58 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2str_karatsuba): Don't allocate new temporary buffer
	  if the buffer is enough for current invocation.

Sun Aug  4 00:22:34 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary2bdigitdbl): New function.
	  (bdigitdbl2bary): Ditto.
	  (bary_mul_single): Use bdigitdbl2bary.
	  (power_cache_get_power): Ditto.
	  (bary_divmod): Use bary2bdigitdbl.
	  (big2str_orig): Ditto.
	  (bigdivrem): Ditto.

Sat Aug  3 22:47:11 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c: The branch condition of selecting multiplication
	  algorithms should check smaller argument because Karatsuba and Toom3
	  is effective only if both arguments are big.
	  (bary_mul_toom3_branch): Compare the smaller argument to
	  TOOM3_MUL_DIGITS.
	  (bary_mul): Compare the smaller argument to KARATSUBA_MUL_DIGITS.

Sat Aug  3 22:23:31 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2str_orig): Receive the number to stringize as
	  BDIGIT array and size.
	  (big2str_karatsuba): Receive the number to stringize as BDIGIT array
	  and size.  Use an temporary array of BDIGIT.
	  (rb_big2str1): Follow the above change.

Sat Aug  3 13:30:04 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (MAX_BASE36_POWER_TABLE_ENTRIES): Renamed from
	  MAX_BIG2STR_TABLE_ENTRIES.
	  (base36_power_cache): Renamed from big2str_power_cache.
	  (base36_numdigits_cache): Renamed from big2str_numdigits_cache.

Sat Aug  3 10:33:52 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (parser_set_integer_literal): use rb_rational_raw1() for
	  integral rational because no reduction is needed with 1.

Sat Aug  3 09:46:07 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/etc/etc.c (setup_passwd, setup_group): set proper encodings to
	  string members.

Sat Aug  3 09:30:57 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* struct.c (rb_struct_define_under): new function to define Struct
	  under the given namespace, not under Struct.  [Feature #8264]

	* ext/etc/etc.c: use rb_struct_define_under.

Sat Aug  3 06:55:29 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* parse.y (value_expr_gen): now NODE_DEFN and NODE_DEFS are not void
	  value expressions.  get rid of wrong warning with -w, and make to
	  pass tests with chkbuild.  ref. [Feature #3753]

Sat Aug  3 04:23:48 2013  Eric Hodel  <drbrain@segment7.net>

	* doc/syntax/refinements.rdoc:  Remove mention of instance_eval and
	  module_eval from scope section per:
	  http://twitter.com/shugomaeda/status/363219951336693761

Sat Aug  3 02:22:05 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2str_orig): Refactored.

Sat Aug  3 01:20:19 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigadd_core): Removed.
	  (bigadd): Use bary_add instead of bigadd_core.

Sat Aug  3 00:52:43 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big2str1): Simplify power_level calculation.

Sat Aug  3 00:34:20 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_zip): use rb_ary_new2() to create buffer
	  if rb_block_arity() > 1.

Sat Aug  3 00:12:00 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* NEWS: Add the description that IO#seek supports SEEK_DATA
	  and SEEK_HOLE.

Fri Aug  2 23:57:57 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* vm.c (m_core_define_method, m_core_define_singleton_method): now
	  the value of def-expr is the Symbol of the name of the method, not
	  nil.
	  ref. [ruby-dev:42151] [Feature #3753]

	* test/ruby/test_syntax.rb (TestSyntax#test_value_of_def): test for
	  above changes.

Fri Aug  2 23:54:11 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_zip): performance improvement by avoiding
	  array creation if rb_block_arity() > 1.

Fri Aug  2 23:50:53 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (power_cache_get_power): Apply bigtrunc to the result of
	  bigsq.
	  (big2str_karatsuba): Fix number of leading zero characters.

Fri Aug  2 23:48:36 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (parser_yylex): calculate denominator directly as powers of
	  ten, not parsing string.

	* parse.y (parser_number_literal_suffix): return bit set of found
	  suffixes.

	* parse.y (parser_set_number_literal, parser_set_integer_literal):
	  split from parser_number_literal_suffix to set yylval.

	* parse.y (parser_yylex): parse rational number literal with decimal
	  point precisely.

	* parse.y (simple_numeric): integrate numeric literals and simplify
	  numeric rules.

	* ext/ripper/eventids2.c (ripper_init_eventids2): ripper support for
	  new literals, tRATIONAL and tIMAGINARY.

Fri Aug  2 18:33:28 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2str_karatsuba): Reduce power_level more than one at
	  recursion, if possible.
	  (rb_big2str1): Follow the above change.

Fri Aug  2 12:25:15 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_mul): Swap x and y for bary_mul1 if x is longer than y.
	  [ruby-dev:47565] [Bug #8719] Reported by Narihiro Nakamura.

Fri Aug  2 10:39:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* parse.y (negate_lit): add T_RATIONAL and T_COMPLEX to the switch
	  statement, and call rb_bug() if an unknown type is passed to
	  negate_lit(). [ruby-core:56316] [Bug #8717]

	* bootstraptest/test_literal_suffix.rb (assert_equal): add test

Fri Aug  2 09:14:47 2013  Eric Hodel  <drbrain@segment7.net>

	* doc/syntax/refinements.rdoc:  Improve description of where you may
	  activate refinements.

Fri Aug  2 07:45:55 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2str_orig): Remove len argument.
	  (big2str_karatsuba): Ditto.
	  (rb_big2str1): Follow above change.

Thu Aug  2 02:32:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* NEWS: Add the description of number literal suffixes.

Thu Aug  2 00:02:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* bootstraptest/test_literal_suffix.rb: add two test cases to
	  examine that "1if true" and "1rescue nil" are recognized as 1.

Thu Aug  1 23:45:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* rational.c (rb_flt_rationalize_with_prec): new public C function
	  to rationalize a Float instance with a precision.

	* rational.c (rb_flt_rationalize): new public C function to
	 rationalize a Float instance.  A precision is calculated from
	 the given float number.

	* include/ruby/intern.h: Add rb_flt_rationalize_with_prec and
	  rb_flt_rationalize.

	* parse.y: implement number literal suffixes, 'r' and 'i'.
	  [ruby-core:55096] [Feature #8430]

	* bootstraptest/test_literal_suffix.rb: add tests for parser to scan
	  number literals with the above tsuffixes.

Thu Aug  1 23:55:08 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big2str1): Remove a local variable.

Thu Aug  1 23:33:01 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_cstr_to_inum): Use power_cache_get_power.

Thu Aug  1 21:02:48 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big2str1): Raise an error for too big number.

Thu Aug  1 20:46:29 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (power_cache_get_power): Hide cached Bignum objects.

Thu Aug  1 19:15:05 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big2str1): Remove non-trim mode.
	  (rb_big2str0): Non-trim mode implemented here.
	  (big2str_find_n1): Change the result type to long again.
	  (big2str_base_powerof2): Don't take arguments: len and trim.
	  (rb_big2str): Follow above change.

Thu Aug  1 12:37:58 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2str_alloc): New function to allocate the result string.
	  It is called after actual length is calculated.
	  (big2str_struct): Add fields: negative, result and ptr.
	  (big2str_orig): Write out the result via b2s->ptr.
	  (big2str_orig): Ditto.
	  (rb_big2str1): Don't allocate the result string at beginning.

Thu Aug  1 07:36:27 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2str_orig): Use temporary buffer when trim mode.

Thu Aug  1 06:28:48 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2str_orig): Simplified because RBIGNUM_LEN(x) <= 2 now.
	  (big2str_struct): Two fields added: hbase2, hbase2_numdigits.
	  (rb_big2str1): Initialize above fields.

Thu Aug  1 04:06:17 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/rdoc/options.rb (RDoc#finish): include root path in include
	  paths, to work in another directory than the source directory.
	  [ruby-core:56282] [Bug #8712]

	* test/test_rdoc_markup_pre_process.rb (TestRDocMarkupPreProcess#setup):
	  fix input_file_name, as the test script is not pre-processed.

Thu Aug  1 01:45:18 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2str_karatsuba): Fix a condition of power_level.

Thu Aug  1 01:09:02 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (LOG2_KARATSUBA_BIG2STR_DIGITS): Removed.
	  (KARATSUBA_BIG2STR_DIGITS): Removed.
	  (big2str_numdigits_cache): New variable.
	  (power_cache_get_power): Merged with power_cache_get_power0.
	  This function returns maxpow_in_bdigit_dbl(base)**(2**power_level).
	  (rb_big2str1): use power_cache_get_power.

Wed Jul 31 23:59:28 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2str_find_n1): Change the return type to size_t.
	  (big2str_orig): Ditto.
	  (big2str_karatsuba): Ditto.
	  (rb_big2str1): Follow the above changes.

Wed Jul 31 23:19:06 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (power_cache_get_power): Change numdigits_ret to size_t *.
	  (big2str_orig): Change len argument to size_t.
	  (big2str_karatsuba): Ditto.
	  (rb_big2str1): Follow the above changes.

Wed Jul 31 22:59:47 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/parse/test_notation_declaration.rb: Change class
	  name to follow file name change.

Wed Jul 31 22:57:50 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/test_notationdecl_parsetest.rb: Rename to ...
	* test/rexml/parse/test_notation_declaration.rb: ... this.

Wed Jul 31 22:54:39 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/test_notationdecl_mixin.rb: Remove duplicated tests.

Wed Jul 31 22:52:55 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/test_notationdecl_parsetest.rb: Fix typos in expected
	  value.
	  pubilc ->
	  public
	     ^^

Wed Jul 31 22:50:51 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/test_notationdecl_parsetest.rb: Add tests that focus
	  system literal in external ID system notation declaration.

Wed Jul 31 22:36:21 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_cmp): Extracted from rb_big_cmp.
	  (power_cache_get_power): Change n1 argument (number of digits) to
	  power_level which is just passed to power_cache_get_power0.
	  (big2str_karatsuba): Ditto.
	  (rb_big2str1): Calculate the initial power_level.

Wed Jul 31 22:04:36 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/test_notationdecl_parsetest.rb: Fix a typo.
	  Extern  ID ->
	  ExternalID
	        ^^

Wed Jul 31 22:01:36 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/test_notationdecl_parsetest.rb: Add tests that focus
	  public ID in external ID notation declaration.

Wed Jul 31 22:01:24 2013  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* parse.y: fix build error with bison-3.0.

Wed Jul 31 21:58:53 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/test_notationdecl_parsetest.rb: Split test patterns.

Wed Jul 31 21:42:33 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/test_notationdecl_parsetest.rb: Group tests.

Wed Jul 31 21:37:51 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/test_notationdecl_mixin.rb (TestNotationDecl#test_name):
	  Move to ...
	* test/rexml/test_notationdecl_parsetest.rb
	  (TestNotationDecl#test_name): ... here.

Wed Jul 31 21:37:47 2013  Kouhei Sutou  <kou@cozmixng.org>

Wed Jul 31 21:31:49 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/test_notationdecl_parsetest.rb: Remove setup because it
	  doesn't share anything with other tests.

Wed Jul 31 21:24:55 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/test_attributes_mixin.rb: Remove a needless shebang.
	* test/rexml/test_notationdecl_mixin.rb: ditto.
	* test/rexml/test_doctype.rb: ditto.
	* test/rexml/test_xml_declaration.rb: ditto.
	* test/rexml/test_changing_encoding.rb: ditto.

Wed Jul 31 21:20:08 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/test_notationdecl_parsetest.rb: remove a needless shebang.

Wed Jul 31 20:11:01 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* string.c (rb_str_rindex): fix bug introduced in r42269.
	  "".rindex("") should return 0.
	  (str_rindex): ditto.

Wed Jul 31 19:55:33 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (MAX_BIG2STR_TABLE_ENTRIES): Use SIZEOF_SIZE_T.
	  (power_cache_get_power0): Add rb_bug call for too bit i argument.
	  (power_cache_get_power): Simplified.

Wed Jul 31 18:32:25 2013  Akinori MUSHA  <knu@iDaemons.org>

	* lib/uri/common.rb (URI.decode_www_form_component): Use String#b.

Wed Jul 31 18:24:02 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* eval.c (rb_mod_refine, mod_using, top_using): don't show
	  warnings because Refinements are no longer experimental.
	  [ruby-core:55993] [Feature #8632]

	* test/ruby/test_refinement.rb: related test.

	* NEWS: fixes for the above change.

Wed Jul 31 17:55:55 2013  Shota Fukumori  <her@sorah.jp>

	* lib/uri/common.rb (URI.decode_www_form_component):
	  Don't raise error when str includes multibyte characters.

Wed Jul 31 17:45:39 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* string.c (rb_str_rindex): performance improvement by using
	  memrchr(3).

Wed Jul 31 16:43:30 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* string.c (rb_str_rindex): refactoring and avoid to call str_nth() if
	  pos == 0.

Wed Jul 31 14:41:36 2013  Akinori MUSHA  <knu@iDaemons.org>

	* lib/set.rb: [DOC] Add a couple of notes on Hash as storage.
	  ref. [Feature #6589]

Wed Jul 31 14:38:52 2013  Akinori MUSHA  <knu@iDaemons.org>

	* lib/set.rb: [DOC] Fix example result.  Hash is now ordered.

Wed Jul 31 14:38:10 2013  Akinori MUSHA  <knu@iDaemons.org>

	* lib/set.rb: [DOC] Use the term "sorted" instead of "ordered"
	  when mentioning SortSet.

Wed Jul 31 12:18:47 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2str_struct): New structure.
	  (big2str_orig): Use big2str_struct.
	  (big2str_karatsuba): Ditto.
	  (rb_big2str1): Ditto.

Wed Jul 31 12:02:16 2013  Zachary Scott  <e@zzak.io>

	* lib/rubygems.rb: [DOC] typo in url patch by @Red54 [Fixes #369]
	  https://github.com/ruby/ruby/pull/369

Wed Jul 31 07:09:07 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Import RubyGems from master as of commit 523551c
	* test/rubygems:  ditto.

Tue Jul 30 22:21:54 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* test/ruby/test_hash.rb: add a test for enumeration order of Hash.

Tue Jul 30 18:52:27 2013  Akinori MUSHA  <knu@iDaemons.org>

	* lib/set.rb (Set#intersect?, Set#disjoint?): Add new methods for
	  testing if two sets have any element in common.
	  [ruby-core:45641] [Feature #6588] Based on the code by marcandre.

Tue Jul 30 17:16:15 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* sprintf.c (ruby__sfvextra): add QUOTE flag to escape unprintable
	  characters.

Tue Jul 30 11:00:52 2013  Zachary Scott  <e@zzak.io>

	* ext/curses/extconf.rb: [DOC] nodoc to reduce Object pollution

Tue Jul 30 08:19:42 2013  Tanaka Akira  <akr@fsij.org>

	* sizes.c (Init_sizes): Define sizes only if the type actually exists.

Mon Jul 29 22:55:26 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* sizes.c (Init_sizes): define RbConfig::SIZEOF.  [Feature #8568]

Mon Jul 29 22:25:20 2013  Zachary Scott  <e@zzak.io>

	* ext/curses/curses.c: [DOC] Update location of samples
	* samples/curses/*: Move Curses samples and refactor from mixin
	  The samples are included in rdoc for module and use of mixin is
	  confusing

Mon Jul 29 22:16:11 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (LOG2_KARATSUBA_BIG2STR_DIGITS): Renamed from
	  LOG2_KARATSUBA_DIGITS.
	  (KARATSUBA_BIG2STR_DIGITS): Renamed from KARATSUBA_DIGITS.

Mon Jul 29 22:04:45 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* hash.c (rb_hash_compare_by_id): add function prototype.

Mon Jul 29 21:53:41 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* hash.c (rb_hash_compare_by_id): don't call rb_hash_rehash()
	  if self.compare_by_identity? == true.

Mon Jul 29 21:29:48 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* hash.c (rb_hash_assoc): performance improvement by replacing
	  compare function in RHASH(hash)->ntbl->type temporarily like r42224.
	  it falls back to rb_hash_foreach() if st_lookup() doesn't find the key.

	* test/ruby/test_hash.rb: add a test for above.

Mon Jul 29 21:15:30 2013  Akinori MUSHA  <knu@iDaemons.org>

	* test/ruby/test_lazy_enumerator.rb
	  (TestLazyEnumerator#test_initialize): Make sure
	  Enumerator::Lazy#initialize raises error if the object is
	  frozen.  The check was performed by rb_ivar_set() before
	  rb_check_frozen() was added to enumerator_init().

Mon Jul 29 21:06:42 2013  Akinori MUSHA  <knu@iDaemons.org>

	* enumerator.c (enumerator_init): Add a frozenness check to
	  prevent a frozen Enumerator object from being reinitialized with
	  a different enumerable object.  This is the least we should do,
	  and more fixes will follow. [Fixes GH-368] Patch by Kenichi
	  Kamiya.

	* enumerator.c (generator_init): Ditto.

Mon Jul 29 20:14:24 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* hash.c (rb_hash_assoc): revert r42224. table->type->compare is
	  called only if hashes are matched.

	* test/ruby/test_hash.rb: add a test to check using #== to compare.

Mon Jul 29 17:00:31 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (yycompile): store file name as String to keep the encoding.

	* parse.y (rb_parser_compile_string_path, rb_parser_compile_file_path):
	  new functions to pass file name as a String.

	* parse.y (gettable_gen): return a copy of the original file name, not
	  a copy in filesystem encoding.

	* vm_eval.c (eval_string_with_cref): use Qundef instead of "(eval)".

Mon Jul 29 16:53:18 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (rb_hash_initialize_copy): copy st_table type even if empty.
	  [ruby-core:56256] [Bug #8703]

Mon Jul 29 16:34:29 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (rb_hash_initialize_copy): clear old table before copy new
	  table.

Mon Jul 29 16:34:09 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (rb_hash_assoc): aggregate object can be initialized only
	  with link time constants.

Mon Jul 29 14:54:44 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* hash.c (rb_hash_assoc): performance improvement by replacing
	  compare function in RHASH(hash)->ntbl->type temporarily.

Mon Jul 29 14:52:46 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (xsystem): expand environment variable in all macros not
	  expanded with RbConfig.  [Bug #8702]

	* test/mkmf/test_framework.rb (create_framework): replace all $@ not
	  only once.

Mon Jul 29 06:54:30 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (rb_w32_pipe): use enum for compile time constants,
	  instead of const int for debugging.

Mon Jul 29 00:11:49 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigdivrem): Specialized implementation added for
	  nx == 2 && ny == 2

Sun Jul 28 20:28:41 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* io.c (io_getpartial): use rb_str_locktmp_ensure().
	  [ruby-core:56121] [Bug #8669]

	* io.c (rb_io_sysread): ditto.

	* test/ruby/test_io.rb: add tests for above.

Sun Jul 28 20:10:49 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb (extmake): should make static libraries for extensions
	  to be statically linked.  [Bug #7948]

Sun Jul 28 17:38:32 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* string.c: add internal API rb_str_locktmp_ensure().

	* io.c (io_fread): use rb_str_locktmp_ensure().
	  [ruby-core:56121] [Bug #8669]

	* test/ruby/test_io.rb: add a test for above.

Sun Jul 28 13:04:39 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* io.c (interpret_seek_whence): support SEEK_DATA and SEEK_HOLE.
	  These are whences for lseek(2) supported by Linux since version 3.1.
	  [ruby-core:56123] [Feature #8671]

	* test/ruby/test_io.rb: Add tests for above.

Sun Jul 28 12:41:39 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (absint_numwords_generic): The char_bit variable changed
	  to static constant.

Sun Jul 28 12:03:23 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c: Constify bary_* functions.

Sun Jul 28 11:12:07 2013  Tanaka Akira  <akr@fsij.org>

	* include/ruby/intern.h (rb_absint_size): Declaration moved from
	  internal.h to calculate required buffer size to pack integers.
	  (rb_absint_numwords): Ditto.
	  (rb_absint_singlebit_p): Ditto.
	  [ruby-core:42813] [Feature #6065]

Sun Jul 28 10:54:26 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (rb_w32_pipe): fix pipe name formatting.  as "%x" may
	  not contain '0' at all, fill at fixed position instead.

Sun Jul 28 00:35:14 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big_size): Return the bignum "bytewise" size.
	  [ruby-core:55578] [Feature #8553]
	  This is accepted by matz on DevelopersMeeting20130727Japan.

Sun Jul 28 00:07:48 2013  Tanaka Akira  <akr@fsij.org>

	* include/ruby/intern.h (rb_integer_pack): Declaration moved from
	  internal.h.
	  (rb_integer_unpack): Ditto.
	  [ruby-core:42813] [Feature #6065]

Fri Jul 26 23:18:13 2013  Kouhei Sutou  <kou@cozmixng.org>

	* NEWS: Add a new feature that REXML::Parsers::StreamParser
	  supports "entity" event.

Fri Jul 26 23:14:31 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/parsers/streamparser.rb
	  (REXML::Parsers::StreamParser#parse): Add "entity" event support to
	  listener. [Bug #8689] [ruby-dev:47542]
	  Reported by Ippei Obayashi.
	* test/rexml/test_stream.rb (StreamTester#entity): Add a test for
	  the above case.

Fri Jul 26 23:05:27 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (parser_yylex): separate numeric literal from succeeding
	  token, and treat 'e' as floating point number only if followed by
	  exponent part.

Fri Jul 26 22:14:10 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_exec.h (CHECK_VM_STACK_OVERFLOW_FOR_INSN): surround with
	  do/while (0), and remove unnecessary casts.

Fri Jul 26 20:12:07 2013  Akinori MUSHA  <knu@iDaemons.org>

	* ext/syslog/lib/syslog/logger.rb (Syslog::Logger): Add facility
	  to Syslog::Logger. [Fixes GH-305] patch by Max Shytikov
	  https://github.com/ruby/ruby/pull/305

Fri Jul 26 19:25:17 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_exec.h, tool/instruction.rb: not an error, but a BUG if stack
	  overflow checking failed just before/after the beginning of an
	  instruction. It should be treated as a BUG.
	  Please tell us if your code cause BUG with this problem.
	  This check will removed soon (for performance).

Fri Jul 26 18:30:14 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c (ary_memcpy): cast to int to suppress a warning.

Fri Jul 26 18:21:58 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c (ary_memcpy): try to enable optimization.
	  At least on my environments, I don't see any errors
	  with many trials. Please tell us if you find any GC bugs.

Fri Jul 26 17:49:26 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/file.c (fix_string_encoding): fix target encoding.  the
	  parameter `encoding' is not the target encoding but the original
	  encoding.

Fri Jul 26 14:05:19 2013  Zachary Scott  <e@zzak.io>

	* ext/fiddle/*: [DOC] More doc on dlopen and RTLD_DEFAULT from r42184

Fri Jul 26 13:08:53 2013  Zachary Scott  <e@zzak.io>

	* ext/fiddle/lib/fiddle.rb: [DOC] Document Fiddle.dlopen(nil)
	* ext/fiddle/handle.c: [DOC] Document Fiddle::Handle.new(nil)

Fri Jul 26 13:04:15 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* load.c (rb_load_internal): use rb_load_file_str() to keep path
	  encoding.

	* load.c (rb_require_safe): search in OS path encoding for Windows.

	* ruby.c (rb_load_file_str): load file with keeping path encoding.

	* win32/file.c (rb_file_load_ok): use WCHAR type API assuming incoming
	  path is encoded in UTF-8.  [ruby-core:56136] [Bug #8676]

	* file.c (rb_str_encode_ospath): simplify using rb_str_conv_enc().

	* win32/file.c (fix_string_encoding): simplify with rb_str_conv_enc().

	* win32/file.c (convert_mb_to_wchar): use bare pointer instead of
	  VALUE, and remove useless argument.

Fri Jul 26 11:42:07 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* rational.c (f_round_common): Rational is expected to be returned by
	  Rational#*, but mathn.rb breaks that assumption.  [ruby-core:56177]
	  [Bug #8687]

Fri Jul 26 01:37:45 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* include/ruby/ruby.h: check defined(USE_RGENGC_LOGGING_WB_UNPROTECT)

Fri Jul 26 01:21:41 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* file.c (rb_file_expand_path_internal): fix r42160; skip '~'.

Thu Jul 25 17:53:18 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* lib/net/http.rb (Net::HTTP#connect): disable Nagle's algorithm on
	  HTTP connection. [ruby-core:56158] [Feature #8681]

Thu Jul 25 17:49:42 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* re.c (rb_reg_to_s): convert closing parenthesis to the target encoding
	  if it is ASCII incompatible encoding. [ruby-core:56063] [Bug #8650]

Thu Jul 25 17:21:21 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* encoding.c (is_obj_encoding): new macro to check if obj is an
	  Encoding.  obj can be any type while is_data_encoding expects T_DATA
	  only.

Thu Jul 25 17:17:52 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_file_expand_path_internal): should clear coderange after
	  copying user name as binary data.

Thu Jul 25 16:17:55 2013  Koichi Sasada  <ko1@atdot.net>

	* encoding.c (check_encoding): Check T_DATA or not.
	  is_data_encoding(obj) assumes that `obj' is T_DATA.

Thu Jul 25 13:06:46 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (dir_s_home): use rb_home_dir_of and rb_default_home_dir.

	* file.c (rb_home_dir_of): split from rb_home_dir() for the home
	  directry of the given user, and the user name is a VALUE, not a bare
	  pointer.  should raise if the user does not exist.

	* file.c (rb_default_home_dir): split from rb_home_dir() for the home
	  directry of the current user.

Thu Jul 25 12:32:11 2013  Koichi Sasada  <ko1@atdot.net>

	* ext/openssl/ossl.c: support additional three thread synchronization
	  functions. [ruby-trunk - Bug #8386]

Thu Jul 25 07:15:58 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Import RubyGems from master as of commit 4ff70cc
	* test/rubygems:  ditto.

Wed Jul 24 20:57:44 2013  Koichi Sasada  <ko1@atdot.net>

	* compile.c (iseq_set_arguments): use RARRAY_RAWPTR() instead of
	  RARRAY_PTR() because there is no new reference.

	* compile.c (iseq_set_exception_table): ditto.

Wed Jul 24 19:49:54 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* lib/uri/generic.rb (find_proxy): raise BadURIError if the URI is
	  a relative URI. [Bug #8645]

Wed Jul 24 18:56:06 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_insnhelper.c (vm_expandarray): use RARRAY_RAWPTR() instead of
	  RARRAY_PTR() because there is no new reference.

	* vm_insnhelper.c (vm_caller_setup_args): ditto.

	* vm_insnhelper.c (vm_yield_setup_block_args): ditto.

Wed Jul 24 18:40:11 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c, gc.c: move ary_unprotect_logging() into
	  rb_gc_unprotect_logging() which is general version

	* include/ruby/ruby.h: add USE_RGENGC_LOGGING_WB_UNPROTECT
	  to enable.

Wed Jul 24 17:37:50 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_file_expand_path_internal): preserve the file name
	  encoding in an exception message.

Wed Jul 24 08:04:49 2013  Koichi Sasada  <ko1@atdot.net>

	* test/-ext-/tracepoint/test_tracepoint.rb: add GC on/off to count
	  GC events strictly.

Tue Jul 23 23:19:24 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/openssl/extconf.rb (CRYPTO_THREADID): check exist or not.

	* ext/openssl/ossl.c (ossl_thread_id): use rb_nativethread_self()
	  implemented at r42137 to allow threads which doesn't associated with
	  Ruby thread to use openssl functions.

	* ext/openssl/ossl.c (Init_ossl_locks): If CRYPTO_THREADID is defined
	  (OpenSSL 1.0.0 or later has it) use CRYPTO_THREADID_set_callback()
	  instead of CRYPTO_set_id_callback() because its argument is
	  unsigned long; it may cause id collision on mswin64
	  whose sizeof(unsigned long) < sizeof(void*).
	  http://www.openssl.org/docs/crypto/threads.html

	* ext/openssl/ossl.c (ossl_threadid_func): defined for above.

Tue Jul 23 20:47:36 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c: Move functions.

Tue Jul 23 20:14:55 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_divmod): Add special cases for x < y easily detected
	  and nx == 2 && ny == 2.

Tue Jul 23 19:48:38 2013  Koichi Sasada  <ko1@atdot.net>

	* thread_(pthread|win32).h: rename rb_thread_cond_t to
	  rb_nativethread_cond_t.

	* thread.c, thread_pthread.c, thread_win32.c, vm_core.h: catch up
	  renaming.

Tue Jul 23 19:44:32 2013  Koichi Sasada  <ko1@atdot.net>

	* thread_native.h: add rb_nativethread_self() which returns
	  current running native thread identifier.

	* thread_[pthread|win32].c: implement rb_nativethread_self().

Tue Jul 23 19:34:11 2013  Koichi Sasada  <ko1@atdot.net>

	* thread_pthread.h, thread_win32.h: rename rb_thread_id_t to
	  rb_nativethread_id_t.

	* thread_pthread.c, vm_core.h: use rb_nativethread_id_t.

Tue Jul 23 18:56:11 2013  Koichi Sasada  <ko1@atdot.net>

	* ext/openssl/ossl.c: use system native (system provided)
	  thread locking APIs added by last commit.
	  This patch fixes [Bug #8386].
	  "rb_mutex_*" APIs control only "Ruby" threads.
	  Not for native threads.

Tue Jul 23 18:44:15 2013  Koichi Sasada  <ko1@atdot.net>

	* thread_native.h: added.
	  Move native thread related lines from vm_core.h.
	  And declare several functions "rb_nativethread_lock_*",
	  manipulate locking.

	* common.mk: add thread_native.h.

	* thread.c: add functions "rb_nativethread_lock_*".

	* thread.c, thread_[pthread,win32].[ch]: rename rb_thread_lock_t
	  to rb_nativethread_lock_t to make it clear that this lock is for
	  native threads, not for ruby threads.

Tue Jul 23 16:14:57 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_before_sweep): fix spacing.

Tue Jul 23 15:57:11 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (heap_get_freeobj): clear slot->freelist here.
	  This means that this slot doesn't have any free objects.
	  And store this slot with objspace->heap.using_slot.

	* gc.c (gc_before_sweep): restore objspace->freelist
	  into objspace->heap.using_slot->freelist.
	  This means that using_slot has free objects which are
	  pointed from objspace->freelist.

	* gc.c (gc_slot_sweep): do not need to clear slot->freelist.

Tue Jul 23 09:34:49 2013  Zachary Scott  <e@zzak.io>

	* sample/drb/README*.rdoc: [DOC] migrate DRb sample READMEs to rdoc

Tue Jul 23 09:28:05 2013  Zachary Scott  <e@zzak.io>

	* lib/drb/invokemethod.rb: [DOC] nodoc InvokeMethod18Mixin

Tue Jul 23 08:44:37 2013  Eric Hodel  <drbrain@segment7.net>

	* ext/openssl/ossl_asn1.c (asn1time_to_time):  Implement YYMMDDhhmmZ
	  format for ASN.1 UTCTime.  [ruby-trunk - Bug #8664]
	* test/openssl/test_asn1.rb:  Test for the above.

Tue Jul 23 08:11:32 2013  Zachary Scott  <e@zzak.io>

	* lib/rexml/streamlistener.rb: [DOC] Fix examples in
	  REXML::StreamListener#entitydecl patch by Ippei Obayashi [Bug #8665]

Tue Jul 23 07:44:59 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Import RubyGems from master as of commit b165260
	* test/rubygems:  ditto.

Tue Jul 23 07:14:31 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_mulsub_1xN): New function.
	  (bary_mul_toom3): Use bary_mulsub_1xN.

Tue Jul 23 03:32:23 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (KARATSUBA_BALANCED): New macro.
	  (TOOM3_BALANCED): Ditto.
	  (bary_mul_balance_with_mulfunc): Use KARATSUBA_BALANCED and
	  TOOM3_BALANCED.
	  (rb_big_mul_balance): Relax a condition.
	  (rb_big_mul_karatsuba): Use KARATSUBA_BALANCED.
	  (rb_big_mul_toom3): Use TOOM3_BALANCED.
	  (bary_mul_karatsuba_branch): Use KARATSUBA_BALANCED.
	  (bary_mul_toom3_branch): Use TOOM3_BALANCED.

Tue Jul 23 01:34:45 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigdivrem_mulsub): Extracted from bigdivrem1.
	  (bigdivrem1): Use bary_add.

Mon Jul 22 18:39:52 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* string.c (rb_str_enumerate_chars): specify array capa
	  with str_strlen().

	* string.c (rb_str_enumerate_codepoints): ditto.

Mon Jul 22 18:01:33 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* string.c (rb_str_enumerate_chars): specify array capa.

Mon Jul 22 17:24:14 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* string.c (rb_str_each_char_size): performance improvement by
	  using rb_str_length().

Mon Jul 22 16:32:48 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_eval.c (eval_string_with_cref): check by Check_TypedStruct
	  instead of rb_obj_is_kind_of.

Mon Jul 22 13:19:22 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c (ary_resize_capa): use RARRAY_RAWPTR() because
	  this code creates no new references.

Mon Jul 22 12:58:18 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c (ary_memfill): added.

	* array.c (rb_ary_initialize): use ary_memfill().

	* array.c (rb_ary_fill): ditto.

	* array.c (rb_ary_slice_bang): use RARRAY_RAWPTR() because
	  this code creates no new references.

Mon Jul 22 10:09:46 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_slot_sweep): need to add empty RVALUE as freeobj.

Mon Jul 22 09:48:31 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_eval.c (eval_string_with_cref): use the given file name unless
	  eval even if scope is given.  additional fix for [Bug #8436].
	  based on the patch by srawlins at [ruby-core:56099] [Bug #8662].

Mon Jul 22 09:24:19 2013  Kouji Takao  <kouji@takao7.net>

	* ext/readline/readline.c (Init_readline): added
	  Readline.delete_text. [ruby-dev:45789] [Feature #6626]
	* ext/readline/extconf.rb: check for rl_delete_text() in Readline library.

	  Thanks, Nobuyoshi Nakada, for the patch.

Mon Jul 22 03:15:54 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/date/date_parse.c (rfc2822_cb): check if wday is given, since it
	  can be omitted.

Mon Jul 22 00:15:20 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_sq_fast): Refine expressions.

Sun Jul 21 21:08:59 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_mul): Use simple multiplication if yl is small.
	  (rb_cstr_to_inum): Invoke bigsq instead of bigmul0.
	  (bigsq): Re-implemented.
	  (bigmul0): Invoke bigsq if two arguments are identical.

Sun Jul 21 09:58:19 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_mul_toom3): New function based on bigmul1_toom3.
	  (bary_mul_toom3_branch): Call bary_mul_toom3.
	  (rb_big_mul_toom3): Ditto.
	  (bigmul1_toom3): Removed.
	  (big_real_len): Ditto.
	  (big_split): Ditto.
	  (big_split3): Ditto.

Sun Jul 21 08:12:16 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* proc.c (proc_to_s): use PRIsVALUE to preserve the result encoding.

Sun Jul 21 03:36:18 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* hash.c (rb_hash_flatten): use NUM2INT to raise TypeError on 32bit
	  platform. it's introduced by r42039

Sun Jul 21 01:07:45 2013  Benoit Daloze  <eregontp@gmail.com>

	* common.mk (help): Fix environment variable name and argument.
	  Actually it can also be a directory or any argument for
	  test/unit runner. [Fixes GH-363]

Sat Jul 20 22:44:50 2013  Zachary Scott  <e@zzak.io>

	* common.mk: Document running a single test [Fixes GH-363]
	  Patch by Avdi Grimm https://github.com/ruby/ruby/pull/363

Sat Jul 20 22:39:56 2013  Zachary Scott  <e@zzak.io>

	* sample/*: whitespace patch by Sergio Campama [Fixes GH-364]
	  https://github.com/ruby/ruby/pull/364

Sat Jul 20 22:33:13 2013  Zachary Scott  <e@zzak.io>

	* doc/regexp.rdoc: [DOC] Fix typo in example [Fixes GH-365]
	  Patch by Juanito Fatas https://github.com/ruby/ruby/pull/365

Sat Jul 20 17:46:03 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* string.c (rb_str_succ): add missing case NEIGHBOR_WRAPPED.
	  r42078 caused buggy behavior like "\xFF".b -> "\x01\xFF".b

Sat Jul 20 15:22:38 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c (rb_ary_resize): use simple memcpy because there are no new
	  references.

Sat Jul 20 15:02:51 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* safe.c (ruby_safe_level_4_warning): define for old extension
	  libraries.  [Bug #8652]

Sat Jul 20 14:38:00 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c (ary_make_shared): make shared array shady.
	  Making non-shady shared array causes SEGV (see rubyci).
	  It seems a bug around shared array.

Sat Jul 20 12:14:07 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (enc_succ_char, enc_pred_char): consider wchar case.
	  [ruby-core:56071] [Bug #8653]

	* string.c (rb_str_succ): do not replace with invalid char.

	* encoding.c (rb_enc_code_to_mbclen): add new function which returns
	  mbclen from codepoint like as rb_enc_codelen() but 0 for invalid
	  char.

	* include/ruby/encoding.h (rb_enc_code_to_mbclen): declaration and
	  shortcut macro.

Fri Jul 19 21:59:12 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: declare type_name() at the beginning of file.

Fri Jul 19 21:35:09 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c: reduce shady operations.

	* array.c (rb_ary_modify, ary_make_partial, rb_ary_splice,
	  rb_ary_replace, rb_ary_eql, rb_ary_compact_bang):
	  use RARRAY_RAWPTR() instead of RARRAY_PTR().

	* array.c (rb_ary_shift): use RARRAY_PTR_USE() without WB because
	  there are not new relations.

	* array.c (ary_ensure_room_for_unshift): ditto.

	* array.c (rb_ary_sort_bang): ditto.

	* array.c (rb_ary_delete_at): ditto.

	* array.c (rb_ary_reverse_m): use RARRAY_RAWPTR() because
	  there are not new relations.

Fri Jul 19 20:58:20 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c: reduce shade operations.

	* array.c (rb_ary_modify): use RARRAY_RAWPTR().

	* array.c (ary_make_substitution, rb_ary_s_create, ary_make_partial,
	  rb_ary_splice, rb_ary_resize, rb_ary_rotate_m, rb_ary_times):
	  use ary_memcpy().

Fri Jul 19 19:55:28 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c (ary_mem_clear): added. This operation doesn't need WB
	  because this operation creates a reference to Qnil.

	* array.c (ary_make_shared, rb_ary_store, rb_ary_shift_m,
	  rb_ary_splice, rb_ary_resize, rb_ary_fill): use ary_mem_clear()
	  instead of rb_mem_clear().

	* array.c (ary_make_shared): use RARRAY_RAWPTR() instead of RARRAY_PTR().

Fri Jul 19 19:18:51 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c: fix commit miss.
	  RGENGC_UNPROTECT_LOGGING should be 0.

Fri Jul 19 19:15:30 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c (rb_ary_resurrect): use RARRAY_RAWPTR() because there is no
	  writing.

	* array.c (rb_ary_new_from_values): use ary_memcpy().

Fri Jul 19 19:07:31 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c (ary_memcpy): add a function to copy VALUEs into ary
	  with write barrier. If ary is promoted, use write barrier correctly.

	* array.c (rb_ary_cat, rb_ary_unshift_m, rb_ary_dup,
	  rb_ary_sort_bang, rb_ary_replace, rb_ary_plus): use ary_memcpy().

Fri Jul 19 15:32:57 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c (rb_ary_store): use RARRAY_PTR_USE() instead of RARRAY_PTR().
	  Clearing memory space doesn't need WBs.

Fri Jul 19 15:19:37 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c (ary_ensure_room_for_push): use RARRAY_RAWPTR() instead of
	  RARRAY_PTR. In this code, there are no "write" operation.

	* array.c (rb_ary_equal): ditto.

	* array.c (recursive_equal): ditto.

Fri Jul 19 15:09:22 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c, internal.h (rb_gc_writebarrier_remember_promoted): add a new
	  function to remember an specified object. This api is only
	  experimental (strongly depend on WB/rgengc strategy).

Fri Jul 19 14:56:00 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c (ary_unprotect_logging): use (void *) for first parameter
	  because VALUE is not defined before including ruby/ruby.h.

Fri Jul 19 14:19:48 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* ext/pathname/pathname.c (path_inspect): use PRIsVALUE to preserve
	  the result encoding.

Fri Jul 19 12:35:41 2013  Tanaka Akira  <akr@fsij.org>

	* test/socket/test_tcp.rb (test_initialize_failure): Use EADDRNOTAVAIL
	  to test an error message generated by bind() failure.

Fri Jul 19 11:27:38 2013  Zachary Scott  <e@zzak.io>

	* lib/racc/parser.rb: [DOC] Capitalize "Ruby" in documentation
	  Patch by Dave Worth https://github.com/ruby/ruby/pull/341

Fri Jul 19 11:26:28 2013  Zachary Scott  <e@zzak.io>

	* ext/psych/lib/psych*: [DOC] Capitalize "Ruby" in documentation
	  Patch by Dave Worth https://github.com/ruby/ruby/pull/341

Fri Jul 19 11:25:12 2013  Zachary Scott  <e@zzak.io>

	* lib/rdoc/*: [DOC] Capitalize "Ruby" in documentation
	  Patch by Dave Worth https://github.com/ruby/ruby/pull/341

Fri Jul 19 11:23:55 2013  Zachary Scott  <e@zzak.io>

	* lib/rubygems*: [DOC] Capitalize "Ruby" in documentation
	  Patch by Dave Worth https://github.com/ruby/ruby/pull/341

Fri Jul 19 11:16:54 2013  Akinori MUSHA  <knu@iDaemons.org>

	* lib/set.rb (Set#to_set): Define Set#to_set so that aSet.to_set
	  returns self. [Fixes GH-359]

Fri Jul 19 11:10:23 2013  Zachary Scott  <e@zzak.io>

	* lib/rake/*: [DOC] Capitalize "Ruby" in documentation
	  Patch by Dave Worth https://github.com/ruby/ruby/pull/341

Fri Jul 19 01:04:14 2013  Tanaka Akira  <akr@fsij.org>

	* ext/-test-/bignum/intpack.c: Renamed from ext/-test-/bignum/pack.c.
	  (Init_intpack): Renamed from Init_pack.
	  Reported by Naohisa Goto.  [ruby-dev:47526] [Bug #8655]

Fri Jul 19 00:54:27 2013  Benoit Daloze  <eregontp@gmail.com>

	* test/ruby/test_array.rb (test_count): add a test case for #count
	  with an argument. See Bug #8654.

Thu Jul 18 23:45:06 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_eql): compare RARRAY_PTR() for performance
	  improvement in case of that self and other are shared.

Thu Jul 18 22:46:42 2013  Zachary Scott  <e@zzak.io>

	* lib/cgi.rb: [DOC] Capitalize "Ruby" in documentation [Fixes GH-341]
	  Patch by Dave Worth https://github.com/ruby/ruby/pull/341
	* lib/webrick.rb: ditto
	* lib/scanf.rb: ditto
	* lib/xmlrpc/config.rb: ditto
	* lib/resolv.rb: ditto
	* lib/e2mmap.rb: ditto
	* lib/fileutils.rb: ditto
	* lib/mkmf.rb: ditto
	* lib/cgi/session.rb: ditto
	* lib/yaml.rb: ditto
	* lib/erb.rb: ditto
	* lib/irb.rb: ditto
	* lib/tracer.rb: ditto
	* lib/net/http.rb: ditto
	* ext/syslog/lib/syslog/logger.rb: ditto
	* sample/pty/expect_sample.rb: ditto

Thu Jul 18 21:30:50 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_sq_fast): Specialize the last iteration of the
	  outer loop.
	  (bigfixize): A condition simplified.

Thu Jul 18 21:15:41 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_equal): compare RARRAY_PTR() for performance
	  improvement in case of that self and other are shared.

Thu Jul 18 20:44:51 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_fill): use memfill().

Thu Jul 18 20:35:14 2013  Benoit Daloze  <eregontp@gmail.com>

	* array.c (rb_ary_count): check length to avoid SEGV
	  while iterating. Remove other pointer loop when arg is given.

	* test/ruby/test_array.rb (test_count): add test for bug.
	  [ruby-core:56072] [Bug #8654]

Thu Jul 18 18:14:36 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* array.c (rb_ary_count): iterate items appropriately.
	  [Bug #8654]

Thu Jul 18 17:35:41 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* hash.c (rb_hash_flatten): performance improvement by not using
	  rb_hash_to_a() to avoid array creation with rb_assoc_new().

Thu Jul 18 16:16:17 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c: add logging feature for RGenGC's write barrier unprotect
	  event.

Thu Jul 18 15:45:47 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/ruby.h (RUBY_SAFE_LEVEL_CHECK): make only
	  rb_set_safe_level(4) an error always but make rb_secure(4) an error
	  only in the core.  [ruby-dev:47517] [Bug #8652]

Thu Jul 18 15:42:01 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: fix spell miss.

Thu Jul 18 15:11:11 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/ruby.h (ruby_safe_level_4): get rid of special
	  character.  [ruby-dev:47512] [misc #8646]

Thu Jul 18 14:51:39 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c (ary_alloc): slim setup process.

Thu Jul 18 14:37:57 2013  Koichi Sasada  <ko1@atdot.net>

	* string.c (str_alloc): no need to clear RString (already cleared).

Thu Jul 18 12:57:47 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (BDIGITS_ZERO): Defined.
	  (bary_pack): Use BDIGITS_ZERO.
	  (bary_unpack): Ditto.
	  (bary_mul_single): Ditto.
	  (bary_mul_normal): Ditto.
	  (bary_sq_fast): Ditto.
	  (bary_mul_balance_with_mulfunc): Ditto.
	  (bary_mul_precheck): Ditto.
	  (bary_mul_toom3_branch): Ditto.
	  (rb_cstr_to_inum): Ditto.
	  (big_shift3): Ditto.
	  (bigmul1_toom3): Ditto.
	  (bary_divmod): Ditto.

Thu Jul 18 06:30:02 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: rename gc related functions with prefix "gc_".
	  * before_gc_sweep() -> gc_before_sweep().
	  * after_gc_sweep()  -> gc_after_sweep().
	  * lazy_sweep()      -> gc_lazy_sweep().
	  * rest_sweep()      -> gc_rest_sweep().
	  * slot_sweep()      -> gc_slot_sweep().

	* gc.c: rename a heap management function with prefix "heap_".
	  * get_freeobj() -> heap_get_freeobj().

	* gc.c: rename markable_object_p() to is_markable_object().

Wed Jul 17 22:57:40 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* hash.c (delete_if_i): use ST_DELETE.

Wed Jul 17 22:34:47 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c: An static assertion for relation of SIZEOF_LONG and
	  SIZEOF_BDIGITS is added.
	  (bary_mul_precheck): Reduce comparisons.
	  (bary_mul): Invoke bary_sq_fast or bary_mul1 if the bignum size is
	  small.
	  (bigfixize): Resize the argument bignum here.
	  (bignorm): Don't call bigtrunc after bigfixize.

Wed Jul 17 22:13:26 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* hash.c (rb_hash_replace): performance improvement by using
	  st_copy().

Wed Jul 17 17:19:54 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: rename heap management functions with prefix "heap_".
	  * allocate_sorted_array() -> heap_allocate_sorted_array().
	  * slot_add_freeobj()      -> heap_slot_add_freeobj().
	  * assign_heap_slot()      -> heap_assign_slot().
	  * add_heap_slots()        -> heap_add_slots().
	  * init_heap()             -> heap_init().
	  * set_heap_increment()    -> heap_set_increment().

	* gc.c (initial_expand_heap): inlined in rb_gc_set_params().

Wed Jul 17 17:12:23 2013  Matthew M. Boedicker  <matthewm@boedicker.org>

	* hash.c (env_fetch): Add key name to message on ENV.fetch KeyError,
	  as well as Hash#fetch.  [ruby-core:56062] [Feature #8649]

Wed Jul 17 15:59:33 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: catch up last changes for debugging/checking mode.

Wed Jul 17 15:50:10 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rb_objspace_free): free slot itself.

	* gc.c (objspace_each_objects): fix condition.
	  Use slot->body instead of slot.

	* gc.c (count_objects): use "slot" variable.

Wed Jul 17 15:21:10 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (unlink_heap_slot): fix memory leak.
	  free slot itself at free_heap_slot().

	  Reproduce-able code is here:
	    N1 = 100_000; N2 = 1_000_000
	    N1.times{ary = []; N2.times{ary << ''}}
	  Maybe this problem is remaining in Ruby 2.0.0.

	* gc.c (unlink_heap_slot): remove not working code.

Wed Jul 17 14:31:13 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: re-design the heap structure.

	  (1) The heap is consists of a set of slots.
	  (2) Each "slot" has a "slot_body".
	      slot::start and slot::limit specify RVALUE beginning address
	      and number of RVALUE in a "slot_body".
	  (3) "slot_body" contains a pointer to slot (slot_body::header::slot)
	      and an array of RVALUE.
	  (4) heap::sorted is an array of "slots", sorted by an address of
	      slot::body.

	  See https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/GC_design
	  for more details (figure).

	* gc.c: Avoid "heaps" terminology. It is ambiguous.

Wed Jul 17 13:29:16 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: fix heaps_header and heaps_slot to reduce memory consumption.
	  (1) move heaps_header::start and limit to  heaps_slot.
	  (2) remove heaps_header::end which can be calculated by start+limit.

	* gc.c: catch up above change.

Wed Jul 17 12:30:05 2013  Tanaka Akira  <akr@fsij.org>

	* include/ruby/st.h (st_strcasecmp): Macro defined for compatibility.
	  (st_strncasecmp): Ditto.

Wed Jul 17 11:57:45 2013  Takeyuki FUJIOKA  <xibbar@ruby-lang.org>

	* lib/cgi/util.rb (CGI::Util#escape, unescape): Avoid use of regexp
	  special global variable. [Feature #8648] Thanks to fotos.

Wed Jul 17 11:57:10 2013  Takeyuki FUJIOKA  <xibbar@ruby-lang.org>

	* lib/erb.rb (ERB::Util#url_encode): Avoid use of regexp special global
	  variable. [Feature #8648] Thanks to fotos.

Wed Jul 17 08:12:41 2013  Tanaka Akira  <akr@fsij.org>

	* st.c (st_locale_insensitive_strcasecmp): Renamed from st_strcasecmp.
	  (st_locale_insensitive_strncasecmp): Renamed from st_strncasecmp.

	* include/ruby/st.h: Follow above changes.

	* include/ruby/ruby.h: Ditto.

Wed Jul 17 00:14:59 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigmul1_toom3): Use bigdivrem_single instead of bigdivrem.
	  (big_three): Removed.
	  (Init_Bignum): Don't initialize big_three.

Tue Jul 16 21:46:03 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* configure.in: revert r42008. strcasecmp() uses the current locale.

	* include/ruby/ruby.h: ditto.

	* st.c (st_strcasecmp): ditto.

Tue Jul 16 21:07:04 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* configure.in: check strcasecmp().

	* include/ruby/ruby.h: use strcasecmp() as st_strcasecmp() if it
	  exists.

	* st.c (st_strcasecmp): define the function only if strcasecmp()
	  doesn't exist.

Tue Jul 16 20:21:28 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigsq): Renamed from bigsqr.

Tue Jul 16 19:42:08 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (USHORT): Unused macro removed.

Tue Jul 16 19:18:51 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: slim a path of newobj_of().

	* gc.c (objspace): add a new field objspace::freelist, which contains
	  available RVALUEs.

	* gc.c (newobj_of): simply call new function `get_freeobj()'.
	  get_freeobj() returns objspace::freelist. If  objspace::freelist
	  is not available, refill objspace::freelist with a slot pointed by
	  objspace::heap::free_slots.

	* gc.c (before_gc_sweep): clear objspace::freelist.

	* gc.c (slot_sweep): clear slot::freelist.

	* gc.c (heaps_prepare_freeslot): renamed to heaps_prepare_freeslot.

	* gc.c (unlink_free_heap_slot): remove unused function.

	* gc.c (rb_free_const_table): remove unused function.

Tue Jul 16 19:05:12 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big_shift3): Big shift width is not a problem for right
	  shift.

Tue Jul 16 18:50:08 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (rb_ary_count): [DOC] fix typo.  Array#count uses ==, not
	  ===.  a question at asakusa.rb ML.

Tue Jul 16 18:35:48 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_mul_karatsuba): Avoid duplicate calculation when
	  squaring.
	  (bary_mul_toom3_branch): Ditto.

Tue Jul 16 17:43:22 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (link_free_heap_slot): removed.

	* gc.c (slot_sweep): use `heaps_add_freeslot' instead of
	  `link_free_heap_slot'.

	* gc.c (assign_heap_slot): use local variable `slot' instead of
	  `heaps'.

Tue Jul 16 17:21:39 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (assign_heap_slot): refactoring variable names.

	* gc.c (slot_add_freeobj): added.

	* gc.c (heaps_add_freeslot): added.

	* gc.c (finalize_list, rb_gc_force_recycle, slot_sweep): use
	  `slot_add_freeobj' instead of modifying linked list directly.

Tue Jul 16 16:30:58 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (lazy_sweep): refactoring.

Tue Jul 16 13:32:06 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* encoding.c (enc_set_index): since r41967, old terminator is dealt
	  with in str_fill_term().  should not consider it here because this
	  function is called before any encoding is set.

Tue Jul 16 11:12:03 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* proc.c (rb_block_arity): raise ArgumentError if no block given.

Tue Jul 16 08:15:22 2013  Zachary Scott  <e@zzak.io>

	* ext/bigdecimal/lib/bigdecimal/util.rb: [DOC] document top-level
	  classes from BigDecimal utils native extensions

Tue Jul 16 03:23:03 2013  Zachary Scott  <e@zzak.io>

	* numeric.c: [DOC] improve rdoc formatting for parameters and links

Mon Jul 15 14:40:00 2013  Tanaka Akira  <akr@fsij.org>

	* include/ruby/intern.h (rb_big2str0): Deprecated.

	* bignum.c (rb_big2str1): Renamed from rb_big2str0.
	  (rb_big2str0): Deprecated wrapper for rb_big2str1.
	  (rb_big2str): Invoke rb_big2str1 instead of rb_big2str0.

Mon Jul 15 14:13:02 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* struct.c (rb_struct_each_pair): use rb_yield_values(2, key, value)
	  instead of rb_yield(rb_assoc_new(key, value)) if rb_block_arity()
	  is greater than 1.

Mon Jul 15 13:46:26 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c: Add static assertions.

Mon Jul 15 13:36:02 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* hash.c (rb_hash_each_pair): performance improvement by using
	  rb_block_arity().

Mon Jul 15 13:15:37 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* proc.c (rb_block_arity): create internal API rb_block_arity().
	  it returns arity of given block.

Mon Jul 15 13:07:27 2013  Yuki Yugui Sonoda  <yugui@yugui.jp>

	* lib/prime.rb (Prime::EratosthenesGenerator,
	  Prime::EratosthenesSieve): New implementation by
	  robertjlooby <robertjlooby AT gmail.com>.

	* test/test_prime.rb: updated with new method name

Mon Jul 15 11:32:46 2013  Zachary Scott  <e@zzak.io>

	* numeric.c (rb_cNumeric): [DOC] Added comment for Numeric to fix doc

Mon Jul 15 11:24:48 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (maxpow_in_bdigit_dbl): Useless #if removed.

Mon Jul 15 11:10:46 2013  Zachary Scott  <e@zzak.io>

	* bignum.c (rb_big_coerce): [DOC] Add docs for Bignum#coerce
	  Based on patch by Juanito Fatas [Fixes GH-360]
	  https://github.com/ruby/ruby/pull/360

Mon Jul 15 10:56:01 2013  Zachary Scott  <e@zzak.io>

	* thread.c (mutex_sleep): [DOC] Awake thread will reacquire lock
	  By Tim Abdulla [Fixes GH-342] https://github.com/ruby/ruby/pull/342

Mon Jul 15 10:45:09 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (nlz16): Use __builtin_clz if possible.
	  (nlz32): Use __builtin_clz or __builtin_clzl if possible.
	  (nlz64): Use __builtin_clzl or __builtin_clzll if possible.
	  (nlz128): Use __builtin_clzll if possible.

	* configure.in: Check __builtin_clz, __builtin_clzl and
	  __builtin_clzll.

Mon Jul 15 09:39:07 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (power_cache_get_power): Use bitsize instead of ceil_log2.
	  (ones): Removed.
	  (next_pow2): Removed.
	  (floor_log2): Removed.
	  (ceil_log2): Removed.

	* configure.in (__builtin_popcountl): Don't check.

Mon Jul 15 02:47:09 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* localeinit.c (rb_locale_charmap, Init_enc_set_filesystem_encoding):
	  move from encoding.c.

	* miniinit.c (rb_locale_charmap, Init_enc_set_filesystem_encoding):
	  define miniruby specific functions only.

Mon Jul 15 02:32:58 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* encoding.c (rb_enc_init): no longer needs NO_PRESERVED_ENCODING.

	* encoding.c (enc_inspect): defer loading autoloaded encoding.

	* encoding.c (enc_check_encoding): use is_data_encoding() to check
	  type consistently.

	* encoding.c (must_encoding): return rb_encoding* instead of encoding
	  index.

	* encoding.c (enc_check_encoding): use is_data_encoding() to check
	  type consistently.

	* encoding.c (must_encoding): return rb_encoding* instead of encoding
	  index.

Mon Jul 15 02:21:39 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (str_fill_term): consider old terminator length, and should
	  not use rb_enc_ascget since it depends on the current encoding which
	  may not be compatible with the new terminator.  [Bug #8634]

	* encoding.c (enc_inspect): use PRIsVALUE to preserve the result
	  encoding.

Sun Jul 14 23:21:47 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: Check __builtin_popcountl, __builtin_bswap32 and
	  __builtin_bswap64.

	* internal.h (swap32): Use the configure result for the condition to
	  use __builtin_bswap32.
	  (swap64): Use the configure result for the condition to use
	  __builtin_bswap64.

	* bignum.c (ones): Use the configure result for the condition to use
	  __builtin_popcountl.
	  (bary_unpack_internal): Use appropriate types for swap argument.

Sun Jul 14 22:21:11 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_subb): Support xn < yn.
	  (bigsub_core): Removed.
	  (bigsub): Don't compare before subtraction.  Just subtract and
	  get the two's complement if the subtraction causes a borrow.

Sun Jul 14 00:36:03 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (DIGSPERLONG): Unused macro removed.
	  (DIGSPERLL): Ditto.

Sun Jul 14 00:32:51 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big_aref): Less scan when the number is negative.

Sun Jul 14 00:17:42 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big_shift): Avoid signed integer overflow.

Sun Jul 14 00:14:15 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_mul_precheck): Use bary_small_lshift or
	  bary_mul_normal if xl is 1.

Sat Jul 13 22:58:16 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big_shift3): New function.
	  big_lshift and big_rshift are merged.
	  (big_shift2): New function.
	  (big_lshift): Use big_shift3.
	  (big_rshift): Ditto.
	  (check_shiftdown): Removed.
	  (rb_big_lshift): Use big_shift2 and big_shift3.
	  (rb_big_rshift): Ditto.
	  (big_lshift): Removed.
	  (big_rshift): Ditto.

Sat Jul 13 15:51:38 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_small_lshift): Use size_t instead of long.
	  (bary_small_rshift): Ditto.

Sat Jul 13 15:33:33 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_small_lshift): Functions moved to remove
	  declaration.
	  (bary_small_rshift): Ditto.

Sat Jul 13 12:27:34 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* encoding.c (rb_enc_associate_index): fill new terminator length, not
	  old one.

Sat Jul 13 12:24:24 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/win32: move from ext/dl and ext/fiddle.  since ext/extmk.rb
	  builds extensions in alphabetical order, compiled?('fiddle') under
	  ext/dl makes no sense.

Sat Jul 13 09:26:09 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (biglsh_bang): Removed.
	  (bigrsh_bang): Ditto.
	  (bigmul1_toom3): Use bary_small_lshift and bary_small_rshift.

Sat Jul 13 01:04:43 2013  Zachary Scott  <e@zzak.io>

	* lib/rubygems/psych_additions.rb: Ignore Psych docs here

Fri Jul 12 18:10:46 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/fiddle/win32/lib/win32/registry.rb
	  (Win32::Registry::API#make_wstr): same as r41922.

Fri Jul 12 16:28:37 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* encoding.c (rb_enc_associate_index): refill the terminator if it
	  becomes longer than before.  [ruby-dev:47500] [Bug #8624]

	* string.c (str_null_char, str_fill_term): get rid of out of bound
	  access.

	* string.c (rb_str_fill_terminator): add a parameter for the length of
	  new terminator.

Fri Jul 12 11:26:25 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* hash.c (rb_hash_reject_bang): do not call rb_hash_foreach() if RHash
	  has ntbl and it is empty.

Fri Jul 12 11:17:41 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* hash.c (recursive_hash): use RHASH_SIZE() to check hash size.

Fri Jul 12 00:20:00 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* hash.c (rb_hash_size): use RHASH_SIZE().

Fri Jul 12 00:08:24 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* hash.c (rb_hash_values): set array capa to RHASH_SIZE().

Thu Jul 11 23:54:45 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* hash.c (rb_hash_keys): set array capa to RHASH_SIZE().

Thu Jul 11 21:30:17 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (rb_w32_pow): undef pow to get rid of infinite
	  recursive call.  re-fix [Bug #8495].  [ruby-core:55923] [Bug #8621]

Thu Jul 11 20:18:13 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/dl/win32/lib/win32/registry.rb (Win32::Registry::API#make_wstr):
	  remove workaround to append WCHAR terminator.

	* transcode.c (str_encode_associate): fill terminator after conversion.

	* string.c (rb_enc_str_new, rb_str_set_len, rb_str_resize): fill
	  minimum length of the encoding as the terminator.

	* string.c (str_buf_cat, rb_str_buf_append, rb_str_splice_0): ditto.

	* string.c (str_make_independent_expand, rb_str_modify_expand): make
	  the capacity enough for multi-byte terminator.

	* string.c (rb_string_value_cstr): fill minimum length of the encoding
	  as the terminator.

	* string.c (rb_string_value_cstr): check null char in char, not in
	  byte.

Thu Jul 11 14:48:35 2013  Zachary Scott  <e@zzak.io>

	* array.c: Replace confusing example for #reverse_each in overview
	  Patch by Earl St Sauver [Fixes documenting-ruby/ruby-12]
	  https://github.com/documenting-ruby/ruby/pull/12

Thu Jul 11 14:22:37 2013  Zachary Scott  <e@zzak.io>

	* test/drb/ut_eq.rb: Use localhost for drb tests [Bug #7311]
	  Patch by Vit Ondruch [ruby-core:49101]
	* test/drb/ut_array.rb: ditto
	* test/drb/ut_array_drbssl.rb: ditto

Thu Jul 11 13:48:03 2013  Zachary Scott  <e@zzak.io>

	* sprintf.c: Fix typo patch by @hynkle [Fixes GH-357]
	  https://github.com/ruby/ruby/pull/357

Thu Jul 11 13:00:34 2013  Zachary Scott  <e@zzak.io>

	* lib/securerandom.rb: Refactor conditions by Rafal Chmiel
	  [Fixes GH-326] https://github.com/ruby/ruby/pull/326

Thu Jul 11 12:04:47 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c: Don't use toom3 after once karatsuba is chosen.
	  (mulfunc_t): New type.
	  (bary_mul_toom3_start): Renamed from bary_mul.
	  (bary_mul_karatsuba_start): Renamed from bary_mul.
	  (bary_mul_balance_with_mulfunc): Renamed from bary_mul_balance and
	  new argument, mulfunc, is added.
	  (rb_big_mul_balance): Invoke bary_mul_balance_with_mulfunc with
	  bary_mul_toom3_start.
	  (bary_mul_karatsuba): Invoke bary_mul_karatsuba_start instead of
	  bary_mul.
	  (bary_mul_precheck): Extracted from bary_mul.
	  (bary_mul_karatsuba_branch): Extracted from bary_mul.
	  (bary_mul_karatsuba_start): New function to call bary_mul_precheck
	  and bary_mul_karatsuba_branch.
	  (bary_mul_toom3_branch): Extracted from bary_mul.
	  (bary_mul_toom3_start): New function to call bary_mul_precheck and
	  bary_mul_toom3_branch.
	  (bary_mul): Just call bary_mul_toom3_start.
	  Arguments for work memory are removed.
	  (rb_cstr_to_inum): Follow the bary_mul change.
	  (bigmul0): Ditto.

Thu Jul 11 10:46:38 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* tool/probes_to_wiki.rb: fix usage comment.  use Enumerable#grep
	  which yields each elements to reduce unnecessary array.

Thu Jul 11 10:09:18 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* process.c (rb_daemon): daemon(3) is implemented with fork(2).
	  Therefore it needs rb_thread_atfork(). (and revert r41903)

Thu Jul 11 03:22:10 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* tool/probes_to_wiki.rb: adding a script to convert probes.d to wiki
	  format for easy wiki updates.

Thu Jul 11 00:54:07 2013  Zachary Scott  <zachary@zacharyscott.net>

	* man/ri.1: Incorrect use of .Dd macro [Bug #8620] by Tristan Hill

Thu Jul 11 00:48:29 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/delegate.rb: Add example for __setobj__ and __getobj__
	  [Bug #8615] Patch by Caleb Thompson

Wed Jul 10 23:29:22 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/logger.rb: Use :call-seq: for method signature rdoc

Wed Jul 10 23:23:18 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/logger.rb (#add): Remove incorrect rdoc for return value
	  [Bug #8567] Reported by Tim Pease.

Wed Jul 10 23:12:00 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_subpos): make public function.

Wed Jul 10 22:44:19 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c: Add a static assertion for RBIGNUM_EMBED_LEN_MAX.

Wed Jul 10 22:31:25 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* string.c (rb_str_index): cache single byte flag and some
	  cosmetic changes.

Wed Jul 10 22:03:27 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_2comp): Don't use bary_plus_one.
	  (bary_add_one): Replaced by the implementation of bary_plus_one.

Wed Jul 10 20:48:22 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (sizeof_bdigit_dbl): check sizeof(BDIGIT_DBL).

	* internal.h (STATIC_ASSERT): move from enum.c.

Wed Jul 10 20:08:21 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (SIZEOF_BDIGIT_DBL): Add a ifdef guard for test.

Wed Jul 10 14:18:59 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* process.c (fork_daemon): kill the other threads all and abandon the
	  kept mutexes.

Wed Jul 10 11:35:36 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/net/http/test_http.rb (TestNetHTTP_v1_2#test_get,
	  TestNetHTTP_v1_2_chunked#test_get): shouldn't check
	  HttpResponse#decode_content if Zlib is not available.
	  ko1 complained via IRC.

Wed Jul 10 10:20:07 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* tool/rbinstall.rb: always require rubygems to stabilize rubygems
	  related status like whether Gem::Specification is defined or not.

	* tool/rbinstall.rb (Gem::Specification.unresolved_deps): define stub.

Wed Jul 10 08:21:15 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Import RubyGems 2.1
	* test/rubygems:  Ditto.

Wed Jul 10 07:34:34 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems/ext/ext_conf_builder.rb:  Remove siteconf file after
	  building the gem.
	* test/rubygems/test_gem_ext_ext_conf_builder.rb:  Test for the above.

	* lib/rubygems/psych_tree.rb (module Gem):  Add backward compatibility
	  for r41148

	* test/rubygems/test_gem_package.rb:  Add backward compatibility for
	  double-slash elimination.

Wed Jul 10 06:22:27 2013  Tadayoshi Funaba  <tadf@dotrb.org>

	* ext/date/date_parse.c (date_zone_to_diff): [ruby-core:55831].

Wed Jul 10 00:41:42 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_mul): x*1 is x.

Tue Jul  9 22:24:39 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_mul1): No need to invoke MEMZERO at last.
	  (bary_mul_single): Invoke MEMZERO here.

Tue Jul  9 21:40:01 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/rexml/test_text.rb: Add missing tests for Text#<<.
	  Reported by nagachika. Thanks!!!

Tue Jul  9 18:02:38 2013  Akinori MUSHA  <knu@iDaemons.org>

	* lib/fileutils.rb (FileUtils#chown_R): Do not skip traversal even
	  if user and group are both nil, to be consistent with #chown and
	  other commands.

Tue Jul  9 17:58:26 2013  Akinori MUSHA  <knu@iDaemons.org>

	* test/fileutils/test_fileutils.rb
	  (TestFileUtils#assert_output_lines): New utility assertion
	  method for testing verbose output.

Tue Jul  9 17:43:57 2013  Koichi Sasada  <ko1@atdot.net>

	* test/test_tracer.rb: catch up recent rubygems changes.

Tue Jul  9 16:58:30 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/{dl,fiddle}/win32/lib/win32/registry.rb: hope that the final
	  resolution to fix the failure of test-all.  and includes Win64
	  support (fixed a potential bug).

Tue Jul  9 15:57:20 2013  Akinori MUSHA  <knu@iDaemons.org>

	* object.c: Fix rdoc for Kernel#<=>. [Fixes GH-352]

Tue Jul  9 15:53:51 2013  Akinori MUSHA  <knu@iDaemons.org>

	* lib/fileutils.rb (FileUtils#mode_to_s): Define mode_to_s() also
	  as singleton method, or FileUtils.chmod fails in verbose mode.

Tue Jul  9 15:16:02 2013  Akinori MUSHA  <knu@iDaemons.org>

	* test/fileutils/fileasserts.rb
	  (Test::Unit::FileAssertions#assert_not_symlink): Add a missing
	  optional argument "message".

Tue Jul  9 15:03:24 2013  Akinori MUSHA  <knu@iDaemons.org>

	* lib/fileutils.rb (FileUtils#chown, FileUtils#chown_R): If user
	  and group are both nil, print ":".

Tue Jul  9 12:47:08 2013  Masaki Matsushita  <glass.saga@gmail.com>

	* io.c (appendline): use READ_CHAR_PENDING_XXX macros and
	  RSTRING_END().

	* io.c (rb_io_getline_1): rewrite nested if statement into one
	  statement.

Tue Jul  9 11:04:35 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/{dl,fiddle}/win32/lib/win32/registry.rb (Win32::Registry#check):
	  should report the position of the error.

	* ext/{dl,fiddle}/win32/lib/win32/registry.rb
	  (Win32::Registry#QueryValue): workaround for test-all crash.

Tue Jul  9 10:27:56 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/{dl,fiddle}/win32/lib/win32/registry.rb
	  (Win32::Registry.expand_environ): use suitable encoding for the
	  string.

	* ext/{dl,fiddle}/win32/lib/win32/registry.rb (Win32::Registry#read):
	  should return REG_SZ, REG_EXPAND_SZ and REG_MULTI_SZ values with
	  the expected encoding -- assumed as the same encoding of name.

Tue Jul  9 10:02:45 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/{dl,fiddle}/win32/lib/win32/registry.rb
	  (Win32::Registry::Error#initialize): use suitable encoding for the
	  string.

Tue Jul  9 09:46:53 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/dl/win32/lib/win32/registry.rb (Win32::Registry.expand_environ):
	  use suitable encoding for the string.  fixed a test-all error of
	  r41838.

	* ext/fiddle/win32/lib/win32/registry.rb: same changes of r41838 and
	  this revision of dl's win32/registry.rb.

Tue Jul  9 07:39:45 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems 2.0.4.  See
	  https://github.com/rubygems/rubygems/blob/2.0/History.txt for changes

Tue Jul  9 01:47:16 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (biglsh_bang): Don't shift a BDIGIT with BITSPERDIG bits.
	  (bigrsh_bang): Ditto.

Tue Jul  9 01:17:57 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigrsh_bang): Fix bignum digits overrun.

Tue Jul  9 00:46:22 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (biglsh_bang): Fix bignum digits under-run.

Mon Jul  8 23:36:45 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/dl/win32/lib/win32/registry.rb (Error, API): use WCHAR
	  interfaces.  c.f. [Bug #8508]

Mon Jul  8 23:13:11 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (rb_w32_pow): move from win32.h and disable strict
	  ANSI mode macro to let _controlfp() stuff defined.
	  [ruby-core:55312] [Bug #8495]

	* numeric.c (finite): add declaration for strict ANSI.
	  [ruby-core:55312] [Bug #8495]

	* thread_win32.c (w32_thread_start_func, thread_start_func_1),
	  (timer_thread_func): use __stdcall instead of _stdcall which is
	  unavailable in strict ANSI mode.  [ruby-core:55312] [Bug #8495]

	* win32/win32.c (gettimeofday): use __cdecl instead of _cdecl.

Mon Jul  8 22:41:12 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_mul): Arguments for work memory added.
	  (bary_mul_balance): Ditto.
	  (bary_mul_karatsuba): Ditto.

Mon Jul  8 22:03:30 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big_sq_fast): New function for testing.
	  (rb_big_mul_toom3): Ditto.

	* internal.h (rb_big_sq_fast): Declared.
	  (rb_big_mul_toom3): Ditto.

Mon Jul  8 21:59:34 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_mul_balance): Initialize a local variable to suppress
	  a warning.

Mon Jul  8 20:55:22 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_mul_balance): Reduce work memory.

Mon Jul  8 08:26:15 2013  Martin Bosslet  <Martin.Bosslet@gmail.com>

	* test/openssl/test_pkey_ec.rb: Skip tests for "Oakley" curves as
	  they are not suitable for ECDSA.
	  [ruby-core:54881] [Bug #8384]

Mon Jul  8 08:03:01 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_mul): Add a RB_GC_GUARD.

Sun Jul  7 23:56:32 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_mul_karatsuba): Unreachable code removed.  Remove
	  several branches.

Sun Jul  7 22:59:06 2013  Tanaka Akira  <akr@fsij.org>

	* internal.h (rb_big_mul_normal): Declared.
	  (rb_big_mul_balance): Ditto.
	  (rb_big_mul_karatsuba): Ditto.

	* bignum.c (rb_big_mul_normal): New function for tests.
	  (rb_big_mul_balance): Ditto.
	  (rb_big_mul_karatsuba): Ditto.

Sun Jul  7 19:21:30 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c: Reorder functions to decrease forward reference.

Sun Jul  7 14:41:57 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c: (bigsub_core): Use bary_sub.
	  (bary_sub): Returns a borrow flag.  Use bary_subb.
	  (bary_subb): New function for actually calculating subtraction with
	  borrow.
	  (bary_sub_one): New function.
	  (bigadd_core): Use bary_add.
	  (bary_add): Returns a carry flag.  Use bary_addc.
	  (bary_addc): New function for actually calculating addition with
	  carry.
	  (bary_add_one): New function.
	  (bary_muladd_1xN): Extracted from bary_mul_normal.
	  (bigmul1_normal): Removed.
	  (bary_mul_karatsuba): New function.
	  (bary_mul1): Invoke rb_thread_check_ints after bary_mul_normal.
	  (bary_mul): Remove most and least significant zeros before actual
	  multiplication.  Use bary_sq_fast, bary_mul_balance,
	  bary_mul_karatsuba and bigmul1_toom3 as bigmul0.
	  (bigmul1_balance): Removed.
	  (bigmul1_karatsuba): Removed.
	  (bigsqr_fast): Removed.
	  (bary_sparse_p): Extracted from big_sparse_p.
	  (big_sparse_p): Removed.
	  (bigmul0): Use bary_mul.

Sun Jul  7 11:54:33 2013  Kouhei Sutou  <kou@cozmixng.org>

	* NEWS: Add REXML::Text#<< related updates.

Sun Jul  7 11:49:19 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/text.rb (REXML::Text#<<): Support appending in not
	  "raw" mode. [Bug #8602] [ruby-dev:47482]
	  Reported by Ippei Obayashi. Thanks!!!

Sun Jul  7 11:43:13 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/text.rb (REXML::Text#<<): Support method chain use by "<<"
	  like other objects.

Sun Jul  7 11:34:18 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/text.rb (REXML::Text#clear_cache): Extract common
	  cache clear code.

Sun Jul  7 11:01:03 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (RUBY_DTRACE_POSTPROCESS): dtrace version SUN D 1.11
	  introduces a check in the dtrace compiler to ensure that probes
	  actually exist. If there are no probes, then the -G step will
	  fail. As this test is only being used to determine whether -G is
	  necessary (for instance, on OSX it is not), adding a real probe to
	  the conftest allows it to succeed on newer versions of dtrace.
	  Patch by Eric Saxby <sax AT livinginthepast.org> at
	  [ruby-core:55826].  [Fixes GH-351], [Bug #8606].

Sun Jul  7 10:07:22 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_sq_fast): Extracted from bigsqr_fast and
	  ensure not to access zds[2*xn].
	  (bigsqr_fast): Allocate the result bignum with 2*xn words.

Sat Jul  6 07:37:43 2013  Martin Bosslet  <Martin.Bosslet@gmail.com>

	* ext/openssl/ossl_pkey_ec.c: Ensure compatibility to builds of
	  OpenSSL with OPENSSL_NO_EC2M defined, but OPENSSL_NO_EC not
	  defined.
	* test/openssl/test_pkey_ec.rb: Iterate over built-in curves
	  (and assert their non-emptiness!) instead of hard-coding them, as
	  this may cause problems with respect to the different availability
	  of individual curves in individual OpenSSL builds.
	  [ruby-core:54881] [Bug #8384]

	  Thanks to Vit Ondruch for providing the patch!

Sat Jul  6 07:12:39 2013  Martin Bosslet  <Martin.Bosslet@gmail.com>

	* test/openssl/test_x509crl.rb: Remove unused variable.
	  [ruby-core:53501] [Bug #8114]

	  Thanks, Vipul Amler, for pointing this out!

Sat Jul  6 06:37:10 2013  Martin Bosslet  <Martin.Bosslet@gmail.com>

	* ext/openssl/ossl.c: Provide CRYPTO_set_locking_callback() and
	  CRYPTO_set_id_callback() callback functions ossl_thread_id and
	  ossl_lock_callback to ensure the OpenSSL extension is usable in
	  multi-threaded environments.
	  [ruby-core:54900] [Bug #8386]

	  Thanks, Dirkjan Bussink, for the patch!

Sat Jul  6 06:06:16 2013  Martin Bosslet  <Martin.Bosslet@gmail.com>

	* lib/openssl/ssl.rb: Fix SSL client connection crash for SAN marked
	  critical.
	  The patch for CVE-2013-4073 caused SSL crash when a SSL server returns
	  the certificate that has critical SAN value.  X509 extension could
	  include 2 or 3 elements in it:

	  [id, criticality, octet_string] if critical,
	  [id, octet_string] if not.

	  Making sure to pick the last element of X509 extension and use it as
	  SAN value.
	  [ruby-core:55685] [Bug #8575]

	  Thank you @nahi for providing the patch!

Sat Jul  6 04:49:38 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych/visitors/yaml_tree.rb: register time objects so
	  they are referenced as ids during output.
	* test/psych/test_date_time.rb: corresponding test.

Fri Jul  5 20:46:39 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/ruby/test_unicode_escape.rb (TestUnicodeEscape#test_basic): this
	  assertion doesn't seems to be checking the unicode string on command
	  line, but seems to be checking how to treat the unicode string from
	  stdin.  so, should escape '\' before 'u'.  this fixes a test failure
	  on Windows.

Fri Jul  5 19:05:40 2013  Akinori MUSHA  <knu@iDaemons.org>

	* lib/fileutils.rb (FileUtils#chown, FileUtils#chown_R): Fix the
	  wrong output message when user is nil, which should be "chown
	  :group file" instead of "chown group file".

Fri Jul  5 16:21:56 2013  Akinori MUSHA  <knu@iDaemons.org>

	* test/ruby/test_regexp.rb
	  (TestRegexp#test_options_in_look_behind)
	  (TestRegexp#assert_match_at): Add tests for another problem
	  fixed in Onigmo 5.13.5.  Previously Onigmo did not allow option
	  enclosures in look-behind, which makes it impossible to
	  interpolate a regexp into another in the middle of a look-behind
	  pattern.  cf. https://github.com/k-takata/Onigmo/pull/17

	* test/ruby/test_regexp.rb
	  (TestRegexp#test_options_in_look_behind)
	  (TestRegexp#assert_match_at): Parse regexps in run time rather
	  than in compile time.

Fri Jul  5 12:14:40 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/ruby/test_rubyoptions.rb (TestRubyOptions#test_notfound): after
	  r41710, the path of command uses backslash as the separator on
	  Windows.

Fri Jul  5 11:29:47 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/test/unit/assertions.rb (assert_raise_with_message): move from
	  test/fileutils/test_fileutils.rb.  this is still experimental and
	  the interface may be changed.

Fri Jul  5 11:08:00 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (w32_spawn): r41710 made that if the command starts with
	  a quote and includes slash, removed the top quote and NOT removed the
	  last quote.
	  this fixes test failures on test/ruby/test_process.rb and
	  test/webrick.

Fri Jul  5 09:53:15 2013  NARUSE, Yui  <naruse@ruby-lang.org>
	* lib/mkmf.rb (CONFIG['CPPOUTFILE']): fix r41769; CONFIG['CPPOUTFILE']
	  may be nil.

Fri Jul  5 05:39:53 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (BARY_MUL1): Renamed from BARY_MUL.
	  (bary_mul1): Renamed from bary_mul.
	  (bary_mul): Renamed from bary_mul2.

Fri Jul  5 04:58:05 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_mul_balance): Extracted from bigmul1_balance and
	  use bary_mul2 and bary_add to decrease allocations.

Fri Jul  5 02:14:00 2013  Akinori MUSHA  <knu@iDaemons.org>

	* lib/fileutils.rb (FileUtils#symbolic_modes_to_i): Fix the wrong
	  character class [+-=], which happened to match all desired
	  characters but also match undesired characters.

	* lib/fileutils.rb (FileUtils.chmod{,_R}): Enhance the symbolic
	  mode parser to support the permission symbols u/g/o and multiple
	  actions as defined in SUS, so that chmod("g=o+w", file) works as
	  expected.  Invalid symbolic modes are now rejected with
	  ArgumentError.

Fri Jul  5 00:25:39 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (have_framework): allow header file to check.
	  [ruby-core:55745] [Bug #8593]

Thu Jul  4 22:31:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* object.c (rb_obj_equal): Fixed an rb_obj_equal documentation typo
	  where "a" was used instead of "obj".
	  Fixes GH-349. Patch by @adnandoric

Thu Jul  4 20:39:20 2013  Tanaka Akira  <akr@fsij.org>

	* tool/make-snapshot: Exit with EXIT_FAILURE when it fails.

Thu Jul  4 20:20:23 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (maxpow_in_bdigit_dbl): Use tables if available.
	  (maxpow_in_bdigit): Ditto.
	  (U16): New macro.
	  (U32): Ditto.
	  (U64): Ditto.
	  (U128): Ditto.
	  (maxpow16_exp): New table.
	  (maxpow16_num): New table.
	  (maxpow32_exp): New table.
	  (maxpow32_num): New table.
	  (maxpow64_exp): New table.
	  (maxpow64_num): New table.
	  (maxpow128_exp): New table.
	  (maxpow128_num): New table.

Thu Jul  4 18:25:25 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_cstr_to_inum): Avoid temporary buffer allocation except
	  very big base non-power-of-2 numbers.

Thu Jul  4 15:51:56 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* string.c (rb_str_succ): use ONIGENC_MBCLEN_CHARFOUND_P correctly.

	* string.c (rb_str_dump): ditto.

Thu Jul  4 10:04:11 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* regcomp.c (): Merge Onigmo 5.13.5 23b523076d6f1161.

	  * [bug]  (thanks Akinori MUSHA and Ippei Obayashi)
	           Fix a renumbering bug in condition regexp with a named
	           capture. [Bug #8583]
	  * [spec] (thanks Akinori MUSHA)
	    Allow ENCLOSE_OPTION in look-behind.

Thu Jul  4 00:36:03 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* internal.h (SIGNED_INTEGER_MAX): suppress warning C4146 on VC6.
	  seems a logical ORed expression becomes unsigned.

Thu Jul  4 00:13:01 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ruby_atomic.h (rb_w32_atomic_cas): call InterlockedCompareExchange
	  directly.

	* ruby_atomic.h (ATOMIC_CAS): fix missing function call.

Wed Jul  3 23:47:35 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ruby_atomic.h (ATOMIC_CAS): suppress C4022 and C4047 warnings in
	  VC6.  only InterlockedCompareExchange is declared using PVOID.

Wed Jul  3 22:29:20 2013  Tanaka Akira  <akr@fsij.org>

	* internal.h (ruby_digit36_to_number_table): Declared.

	* util.c (ruby_digit36_to_number_table): Moved from scan_digits.

	* bignum.c (conv_digit): Use ruby_digit36_to_number_table.

	* pack.c (hex2num): Ditto.

Wed Jul  3 18:12:56 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (install_dirs): revert DESTDIR prefix by r39841, since
	  it is fixed by r41648.  [ruby-core:55760] [Bug #8115]

Wed Jul  3 14:15:25 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (do_stat): use rb_w32_ustati64() in win32.c to get rid of
	  mysterious behavior of FindFirstFile() Windows API which treat "<"
	  and ">" like as wildcard characters.  [ruby-core:55764] [Bug #8597]

Wed Jul  3 12:06:42 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (maxpow_in_bdigit): Renamed from calc_hbase and return
	  maxpow.

Tue Jul  2 23:47:50 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (roomof): Cast to long.
	  (rb_ull2big): Fix bignew arguments.

Tue Jul  2 21:17:37 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_cstr_to_inum): Merge two temporary buffers.

Tue Jul  2 20:25:04 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_cstr_to_inum): Use BDIGIT_DBL to collect adjacent digits.
	  (BDIGIT_DBL_MAX): New macro.
	  (maxpow_in_bdigit_dbl): New function.

Tue Jul  2 17:23:33 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* doc/syntax/refinements.rdoc: add description of Module#using and
	  refinement inheritance by module inclusion.

Tue Jul  2 17:22:44 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* internal.h: add EUC-JP and Windows-31J.

	* re.c (rb_char_to_option_kcode): use built-in encoding indexes in
	  internal.h.

	* internal.h: add UTF8-MAC.

	* dir.c (rb_utf8mac_encoding): use built-in encoding indexes in
	  internal.h.

	* internal.h: add UTF-{16,32} dummy encodings.

	* string.c (rb_str_inspect, str_scrub0): use built-in encoding indexes
	  in internal.h.

	* internal.h: add UTF-{16,32}{BE,LE}.

	* io.c (io_strip_bom): use built-in encoding indexes in internal.h.

	* internal.h (rb_{ascii8bit,utf8,usascii}_encindex): use built-in
	  encoding indexes for optimization.

	* encoding.c (enc_inspect, rb_locale_encindex),
	  (enc_set_filesystem_encoding, rb_filesystem_encindex): use built-in
	  encoding indexes directly.

	* encoding.c (rb_enc_set_index, rb_enc_associate_index): validate
	  argument encoding index.

	* include/ruby/encoding.h (ENCODING_SET): use rb_enc_set_index()
	  instead of setting inlined bits directly.

	* encoding.c (rb_enc_init): register preserved indexes.

	* internal.h (ruby_preserved_encindex): move from encoding.c.

Tue Jul  2 11:14:36 2013  Shota Fukumori  <sorah@cookpad.com>

	* lib/mkmf.rb (try_config): Fix to not replace $LDFLAGS with $libs
	  (1.9.3 behavior) [ruby-core:55752] [Bug #8595]

Tue Jul  2 00:39:59 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/ipsocket.c (init_inetsock_internal): Don't try mismatched
	  address family if already failed.

Mon Jul  1 23:07:38 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* template/encdb.h.tmpl: define encoding index macros to use the index
	  statically from C source.

Mon Jul  1 22:57:19 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_mul2): New function.
	  (rb_cstr_to_inum): Use a better algorithm to compose the result
	  if input length is very long.

Mon Jul  1 20:22:00 2013  Kenta Murata  <mrkn@cookpad.com>

	* ext/bigdecimal/bigdecimal.h (RB_UNUSED_VAR, UNREACHABLE):
	  import macros from ruby.h for 1.9.3.
	  [Bug #8588] [ruby-core:55730]

	* ext/bigdecimal/bigdecimal.gemspec: Bump version to 1.2.1.

Mon Jul  1 20:03:39 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/ipsocket.c (init_inetsock_internal): Use an address
	  family for local address which is different to the remote
	  address if no other choice.

Mon Jul  1 15:05:00 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/csv.rb (CSV#<<): use StringIO#set_encoding instead of creating
	  new StringIO instance with String#force_encoding, forcing encoding
	  discards the cached coderange bits and can make further operations
	  very slow.  [ruby-core:55714] [Bug #8585]

	* ext/stringio/stringio.c (strio_write): keep coderange of
	  ptr->string.

	* string.c (rb_enc_cr_str_buf_cat, rb_str_append): consider an empty
	  string 7bit-clean and should not discard cached coderange of string
	  to be appended.

Mon Jul  1 12:56:41 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* eval.c (rb_using_module): activate refinements in the ancestors of
	  the argument module to support refinement inheritance by
	  Module#include.  [ruby-core:55671] [Feature #8571]

	* test/ruby/test_refinement.rb: related test.

Mon Jul  1 12:02:39 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_cstr_to_inum): Skip leading zeros.

Mon Jul  1 00:59:23 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (nlz16): New function.
	  (nlz32): Ditto.
	  (nlz64): Ditto.
	  (nlz128): Ditto.
	  (nlz): Redefined using an above function.
	  (bitsize): New macro.
	  (rb_cstr_to_inum): Use bitsize instead of nlz.

Sun Jun 30 22:40:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* lib/prime.rb: Corrected a few comments. Patch by @Nullset14.
	  Fixes GH-346.

Sun Jun 30 21:53:38 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_cstr_to_inum): Use rb_integer_unpack if base is a power
	  of 2.

Sun Jun 30 10:59:23 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (join_argv): use backslash instead of slash in program
	  path, otherwise cannot invoke "./c\u{1ee7}a.exe" for some reason.
	  [ruby-core:24309] [Bug #1771]

	* io.c (spawnv, spawn): use UTF-8 spawn family.  [Bug #1771]

	* process.c (proc_exec_sh, proc_spawn_cmd, proc_spawn_sh): ditto.

	* win32/win32.c (translate_char, join_argv, has_redirection): make
	  codepage aware.

	* win32/win32.c (rb_w32_udln_find_exe_r, rb_w32_udln_find_file_r):
	  codepage independent versions.

	* win32/win32.c (w32_spawn): extract codepage aware code from
	  rb_w32_spawn().

	* win32/win32.c (rb_w32_uspawn): add UTF-8 version function.

	* win32/win32.c (w32_aspawn_flags): extract codepage aware code from
	  rb_w32_aspawn_flags().

	* win32/win32.c (rb_w32_uaspawn_flags, rb_w32_uaspawn_flags): add
	  UTF-8 version functions.

	* win32/win32.c (w32_getenv): extract codepage aware code from
	  rb_w32_ugetenv() and rb_w32_getenv().

	* win32/win32.c (w32_stati64): extract codepage aware code from
	  rb_w32_ustati64() and rb_w32_stati64().

	* dln.h (DLN_FIND_EXTRA_ARG, DLN_FIND_EXTRA_ARG_DECL): allow extra
	  arguments to dln_find_{exe,file}_r().

	* dln_find.c (dln_find_exe_r, dln_find_file_r): add extract arguments.

	* process.c (EXPORT_STR, EXPORT_DUP): convert to default process
	  encoding if defined.

	* process.c (check_exec_env_i): convert environment variables too.

	* process.c (rb_exec_fillarg): convert program path and arguments too.

Sun Jun 30 01:57:08 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big_rshift): Use abs2twocomp and twocomp2abs_bang.

Sun Jun 30 00:14:20 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (RBIGNUM_SET_NEGATIVE_SIGN): New macro.
	  (RBIGNUM_SET_POSITIVE_SIGN): Ditto.
	  (rb_big_neg): Inline get2comp to avoid double negation.

Sat Jun 29 23:26:41 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_neg): Extracted from bary_2comp.
	  (bary_plus_one): Extracted from bary_2comp.
	  (bary_2comp): Use bary_neg and bary_plus_one.
	  (big_extend_carry): Extracted from get2comp.
	  (get2comp): Use big_extend_carry.
	  (rb_integer_unpack): Use big_extend_carry.
	  (rb_big_neg): Use bary_neg.

Sat Jun 29 22:31:59 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_2comp): Simplified.

Sat Jun 29 09:33:53 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigor_int): Return -1 if y == -1.

Sat Jun 29 09:07:16 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigor_int): Use RB_GC_GUARD.
	  (bigxor_int): Take xn and hibitsx arguments.  Use twocomp2abs_bang.
	  (rb_big_xor): Use abs2twocomp and twocomp2abs_bang.

Sat Jun 29 08:19:58 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigand_int): Don't apply bitwise and for BDIGIT and long.
	  (bigor_int): Take xn and hibitsx arguments.  Use twocomp2abs_bang.
	  (rb_big_or): Use abs2twocomp and twocomp2abs_bang.

Fri Jun 29 01:08:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* numeric.c (fix_mul): remove FIT_SQRT_LONG test as it was causing
	  fix_mul to return an incorrect result for -2147483648*-2147483648
	  on 64 bit platforms

	* test/ruby/test_integer_comb.rb (class TestIntegerComb): add test case

Fri Jun 28 12:26:53 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big_and): Allocate new bignum with same size to shorter
	  argument if it's high bits are zero.

Fri Jun 28 12:14:04 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/ipsocket.c (init_inetsock_internal): Don't use local
	  addresses which address family is different to remote address.

Fri Jun 28 08:06:22 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigand_int): Add arguments, xn and hibitsx.
	  Use twocomp2abs_bang.

Thu Jun 27 23:58:13 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (abs2twocomp_bang): Removed.
	  (abs2twocomp): Take n_ret argument to return actual length.
	  (rb_big_and): Follow above change.

Thu Jun 27 22:52:19 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (get2comp): Use bary_2comp.
	  (abs2twocomp_bang): New function.
	  (abs2twocomp): New function.
	  (twocomp2abs_bang): New function.
	  (rb_big_and): Use abs2twocomp and twocomp2abs_bang.

Thu Jun 27 20:03:13 2013  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* ext/openssl/lib/openssl/ssl.rb (verify_certificate_identity): fix
	  hostname verification. Patched by nahi.

	* test/openssl/test_ssl.rb (test_verify_certificate_identity): test for
	  above.


Thu Jun 27 00:23:57 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big_pow): Retry if y is a Bignum and it is
	  representable as a Fixnum.
	  Use rb_absint_numwords.

Wed Jun 26 23:53:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c (BigDecimal_save_rounding_mode): fix typo.
	  Fixes GH-343. Patch by @jgarber.

Wed Jun 26 23:22:21 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enumerator.c (rb_enumeratorize_with_size): use strict definition
	  rb_enumerator_size_func.

Wed Jun 26 23:11:14 2013  Kouhei Sutou  <kou@cozmixng.org>

	* gc.c (is_before_sweep): Add a missing space before a parenthesis.
	* gc.c (rb_gc_force_recycle): Add a missing space around a parenthesis.

Wed Jun 26 22:44:00 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/intern.h (rb_enumeratorize_with_size): cast for
	  backward compatibility.

	* include/ruby/intern.h (rb_enumerator_size_func): define strict
	  function declaration for rb_enumeratorize_with_size().

Wed Jun 26 21:01:22 2013  Hiroshi Shirosaki  <h.shirosaki@gmail.com>

	* test/ruby/test_io.rb (TestIO#test_write_32bit_boundary): skip if
	  writing a file is slow.
	  [ruby-core:55541] [Bug #8519]

Wed Jun 26 16:42:11 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb: should use expanded values for header directories
	  unless extmk.  patch by vo.x (Vit Ondruch) at [ruby-core:55653]
	  [Bug #8115], rhbz#921650.

Wed Jun 26 12:48:22 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigxor_int): Fix a buffer over read.

Wed Jun 26 12:13:12 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigand_int): Consider negative values.
	  (bigor_int): The allocated bignum should have enough size
	  to store long.
	  This fixes (bignum fits in a BDIGIT) | (fixnum bigger than BDIGIT)
	  on platforms which SIZEOF_BDIGITS < SIZEOF_LONG,
	  such as LP64 with 32bit BDIGIT (no int128).

Wed Jun 26 12:08:51 2013  Tanaka Akira  <akr@fsij.org>

	* test/socket/test_udp.rb: Close sockets explicitly.
	  Don't use fixed port number.

Wed Jun 26 07:27:17 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigand_int): Fix a buffer over read.

Wed Jun 26 06:48:07 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigadd_int): Fix a buffer over read.

Wed Jun 26 01:18:13 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (is_before_sweep): Add new helper function that check the object
	  is before sweep?
	* gc.c (rb_gc_force_recycle): Have to clear mark bit if object's slot
	  already ready to minor sweep.

Wed Jun 26 01:17:29 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigsub_int): Fix a buffer over read.

Tue Jun 25 22:45:43 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_absint_singlebit_p): Use POW2_P.
	  (bary_pack): Ditto.
	  (rb_big2str0): Ditto.
	  (POW2_P): Moved to top.

Tue Jun 25 22:28:07 2013  Akinori MUSHA  <knu@iDaemons.org>

	* lib/rubygems/ext/builder.rb (Gem::Ext::Builder.make): Pass
	  DESTDIR via command line to override what's in MAKEFLAGS.  This
	  fixes an installation problem under a package building
	  environment where DESTDIR is specified in the (parent) command
	  line. [Fixes GH-327]

Tue Jun 25 21:43:13 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2dbl): Use (BDIGIT)1 instead of 1UL.
	  (bary_mul_normal): Remove a useless cast.

Tue Jun 25 21:26:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (BigMath_s_exp): Fix for the cases when
	  the argument x is not a BigDecimal.
	  This change is based on the patch made by Heesob Park and Garth Snyder.
	  [Bug #6862] [ruby-core:47145]
	  [Fixes GH-332] https://github.com/ruby/ruby/pull/332

Tue Jun 25 20:36:31 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2ulong): "check" argument removed.
	  (rb_big2ulong): Follow above change.
	  (rb_big2long): Ditto.
	  (rb_big_rshift): Ditto.
	  (rb_big_aref): Ditto.

Tue Jun 25 20:08:29 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big2ulong_pack): Use rb_integer_pack.
	  (rb_big_aref): Call big2ulong with TRUE for "check" argument.
	  It should be non-effective.

Tue Jun 25 19:07:33 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (LSHIFTX): Revert r41611.
	  The redundant expression suppresses a warning, C4293, by Visual
	  Studio.
	  http://ruby-mswin.cloudapp.net/vc10-x64/ruby-trunk/log/20130625T072854Z.log.html.gz#miniruby

Tue Jun 25 19:03:00 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2ulong): Add a cast.
	  (big2ull): Add a specialized code for SIZEOF_LONG_LONG <=
	  SIZEOF_BDIGITS.

Tue Jun 25 12:42:57 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (integer_unpack_single_bdigit): Use "1 + ~u" instead of
	  "-u" to suppress warning (C4146) by Visual Studio.
	  Reported by ko1 via IRC.

Tue Jun 25 12:28:57 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2ulong): Add code specialized for SIZEOF_LONG <=
	  SIZEOF_BDIGITS.
	  This prevents shift width warning from "num <<= BITSPERDIG".

Tue Jun 25 12:23:30 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: fix oldgen/remembered_shady counting algorithm.

	* gc.c (rgengc_check_shady): increment
	  `objspace->rgengc.remembered_shady_object_count' here.

	* gc.c (rgengc_remember): return FALSE if obj is already remembered.

	* gc.c (rgengc_rememberset_mark): make it void.

	* gc.c (gc_mark_children): fix to double counting oldgen_object_count
	  at minor GC.

Tue Jun 25 12:07:18 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (MSB): Removed.
	  (BDIGIT_MSB): Defined using BIGRAD_HALF.
	  (bary_2comp): Apply BIGLO after possible over flow of BDIGIT.
	  (get2comp): Ditto.
	  (bary_unpack_internal): Use BDIGIT_MSB.
	  Apply BIGLO after possible over flow of BDIGIT.
	  (rb_integer_unpack): Use BDIGIT_MSB.
	  (calc_hbase): Use BDIGMAX.
	  (big2dbl): Use BDIGMAX.
	  Apply BIGLO after possible over flow of BDIGIT.
	  (rb_big_neg): Apply BIGLO after possible over flow of BDIGIT.
	  (biglsh_bang): Ditto.
	  (bigrsh_bang): Ditto.
	  (bary_divmod): Use BDIGIT_MSB.
	  (bigdivrem): Ditto.
	  (bigxor_int): Apply BIGLO after possible over flow of BDIGIT.

	* marshal.c (shortlen): Use SIZEOF_BDIGITS instead of sizeof(BDIGIT).

	* ext/openssl/ossl_bn.c (ossl_bn_initialize): Use SIZEOF_BDIGITS
	  instead of sizeof(BDIGIT).

Tue Jun 25 11:40:08 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (big2ulong): suppress shorten-64-to-32 warning.  BDIGIT can
	  be bigger than long now.

	* bignum.c (LSHIFTX): remove redundant never-true expression.

Tue Jun 25 00:55:54 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (typedef struct rb_objspace): Change members for monitor objects.
	* gc.c (gc_marks_test): Check all WriteBarrier Errors and track them in obj-tree.
	* gc.c (rgengc_check_shady): Ditto.
	* gc.c (gc_marks): Move 2 function calls to gc_marks_test for test initialize.

Mon Jun 24 23:30:31 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (integer_unpack_single_bdigit): Refine code to filling
	  higher bits and use BIGLO.

Mon Jun 24 22:26:31 2013  Hiroshi Shirosaki  <h.shirosaki@gmail.com>

	* test/rinda/test_rinda.rb (RingIPv6#prepare_ipv6):
	  ifindex() function may not be implemented on Windows. We use another
	  check for the case.

Mon Jun 24 22:11:37 2013  Hiroshi Shirosaki  <h.shirosaki@gmail.com>

	* test/gdbm/test_gdbm.rb (TestGDBM#test_s_open_nolock):
	  skip a failing test on Windows because flock() implementation is
	  different from Unix.

Mon Jun 24 22:06:14 2013  Hiroshi Shirosaki  <h.shirosaki@gmail.com>

	* test/rubygems/test_gem_installer.rb (test_install_extension_flat):
	  use ruby in build directory in case ruby is not installed.
	  [ruby-core:53265] [Bug #8058]

Mon Jun 24 22:04:02 2013  Hiroshi Shirosaki  <h.shirosaki@gmail.com>

	* ext/dl/cfunc.c (rb_dlcfunc_call): fix conversion from Bignum to
	  pointer. sizeof(DLSTACK_TYPE) is larger than sizeof(long) on
	  Windows x64 and higher bits over sizeof(long) of DLSTACK_TYPE was
	  zero even if a pointer value was over 32 bits which causes SEGV on
	  DL::TestCPtr#test_to_ptr_io. Adding a cast solves the bug.

Mon Jun 24 22:04:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* eval_error.c (warn_printf): use rb_vsprintf instead so ruby specific
	  extensions like PRIsVALUE can be used in format strings
	* eval_error.c (error_print): use warn_print_str (alias for
	  rb_write_error_str) to print a string value instead of using
	  RSTRING_PTR and RSTRING_LEN manually
	* eval.c (setup_exception): use PRIsVALUE instead of %s and RSTRING_PTR

Mon Jun 24 20:31:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* compile.c (make_name_for_block): use PRIsVALUE in format string
	  instead of %s and RSTRING_PTR to protect objects from being garbage
	  collected too soon
	* encoding.c (str_to_encindex): ditto
	* hash.c (rb_hash_fetch_m): ditto
	* io.c (rb_io_reopen): ditto
	* parse.y (reg_fragment_check_gen): ditto
	* parse.y (reg_compile_gen): ditto
	* parse.y (ripper_assert_Qundef): ditto
	* re.c (rb_reg_raise): ditto
	* ruby.c (set_option_encoding_once): ditto
	* vm_eval.c (rb_throw_obj): ditto

Mon Jun 24 07:57:18 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (after_gc_sweep): Have to record malloc info before reset.
	* gc.c (gc_prof_timer_start): Pick out part of new record creation as gc_prof_setup_new_record.
	* gc.c (gc_prof_set_malloc_info): Move point of recording allocation size to front of mark.

Mon Jun 24 02:53:09 2013  Zachary Scott  <zachary@zacharyscott.net>

	* array.c: Return value in Array overview example found by @PragTob
	  [Fixes GH-336] https://github.com/ruby/ruby/pull/336

Mon Jun 24 02:45:51 2013  Zachary Scott  <zachary@zacharyscott.net>

	* array.c (rb_ary_zip): typo by @PragTob [Fixes GH-337]
	  https://github.com/ruby/ruby/pull/337

Mon Jun 24 02:42:01 2013  Zachary Scott  <zachary@zacharyscott.net>

	* win32/README.win32: grammar typo by @blankenshipz [Fixes GH-334]
	  https://github.com/ruby/ruby/pull/334

Mon Jun 24 00:59:35 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (BIGUP): Use LSHIFTX and avoid cast to consider the type
	  of x is bigger than BDIGIT_DBL.
	  (big2ulong): Use unsigned long to store the result.
	  (big2ull): Use unsigned LONG_LONG to store the result.
	  (bigand_int): Use long for num to avoid data loss.
	  (bigor_int): Ditto.
	  (bigxor_int): Ditto.

Sun Jun 23 23:05:58 2013  Tanaka Akira  <akr@fsij.org>

	* include/ruby/defines.h (BDIGIT): Define it only if it is not defined
	  yet.  This eases tests and debug.
	  (SIZEOF_BDIGITS): Ditto.
	  (BDIGIT_DBL): Ditto.
	  (BDIGIT_DBL_SIGNED): Ditto.
	  (PRI_BDIGIT_PREFIX): Ditto.
	  (PRI_BDIGIT_DBL_PREFIX): Ditto.
	  (PRIdBDIGIT): Define it only if PRI_BDIGIT_PREFIX is defined.
	  (PRIiBDIGIT): Ditto.
	  (PRIoBDIGIT): Ditto.
	  (PRIuBDIGIT): Ditto.
	  (PRIxBDIGIT): Ditto.
	  (PRIXBDIGIT): Ditto.
	  (PRIdBDIGIT_DBL): Ditto.
	  (PRIiBDIGIT_DBL): Ditto.
	  (PRIoBDIGIT_DBL): Ditto.
	  (PRIuBDIGIT_DBL): Ditto.
	  (PRIxBDIGIT_DBL): Ditto.
	  (PRIXBDIGIT_DBL): Ditto.

	* include/ruby/ruby.h (RBIGNUM_EMBED_LEN_MAX): Define it only if it is
	  not defined yet.

Sun Jun 23 17:29:51 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (integer_unpack_single_bdigit): Use a cast.

Sun Jun 23 15:38:07 2013  Koichi Sasada  <ko1@atdot.net>

	* bootstraptest/test_thread.rb: rescue resource limitation errors.

Sun Jun 23 08:19:27 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (integer_unpack_single_bdigit): Extracted from
	  bary_unpack_internal.

Sun Jun 23 07:41:52 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_unpack_internal): Suppress warnings (C4146) on Visual Studio.
	  Reported by ko1 via IRC.

Sun Jun 23 06:49:28 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h, gc.c: rename macros and functions:
	  OBJ_WB_GIVEUP() -> OBJ_WB_UNPROTECT(),
	  rb_obj_wb_giveup() -> rb_obj_wb_unprotect(),
	  rb_gc_giveup_promoted_writebarrier() ->
	  rb_gc_writebarrier_unprotect_promoted(),

	* class.c, eval.c, hash.c: use OBJ_WB_UNPROTECT().

Sun Jun 23 05:41:32 2013  Koichi Sasada  <ko1@atdot.net>

	* class.c (rb_include_class_new), eval.c (rb_using_refinement):
	  make classes/modules (who share method table) shady.
	  If module `a' and `b' shares method table m_tbl and new method
	  with iseq is added, then write barrier is applied only `a' or `b'.
	  To avoid this issue, shade such classes/modules.

	* vm_method.c (rb_method_entry_make): add write barriers.

Sun Jun 23 01:27:54 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bytes_zero_p): Removed.
	  (bary_pack): Don't call bytes_zero_p.

Sun Jun 23 00:51:29 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bytes_zero_p): Extracted from bary_pack.
	  (bary_pack): Use bytes_zero_p.

Sun Jun 23 00:16:57 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (MSB): New macro.
	  (bary_unpack_internal): Use MSB.
	  (bary_divmod): Ditto.
	  (bigdivrem): Ditto.

Sat Jun 22 23:45:22 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_swap): New function.
	  (bary_pack): Use bary_swap.
	  (bary_unpack_internal): Ditto.

Sat Jun 22 23:18:39 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bytes_2comp): Renamed from quad_buf_complement.
	  (bary_pack): Use bytes_2comp.
	  (rb_quad_pack): Use rb_integer_pack.
	  (rb_quad_unpack): Use rb_integer_unpack.

Sat Jun 22 21:46:18 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_integer_unpack): Don't allocate a Bignum if possible.

Sat Jun 22 21:03:58 2013  Tanaka Akira  <akr@fsij.org>

	* pack.c (pack_unpack): Remove specialized unpackers for integers.

Sat Jun 22 20:36:50 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_unpack_internal): Specialized unpacker implemented.
	  (bary_unpack): Support INTEGER_PACK_FORCE_GENERIC_IMPLEMENTATION.
	  (rb_integer_unpack): Support INTEGER_PACK_FORCE_GENERIC_IMPLEMENTATION.

Sat Jun 22 18:53:10 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_pack): Support
	  INTEGER_PACK_FORCE_GENERIC_IMPLEMENTATION flag.
	  Fix byte order and word order handling in code specialized for
	  wordsize % SIZEOF_BDIGITS == 0.

	* internal.h (INTEGER_PACK_FORCE_GENERIC_IMPLEMENTATION): Defined.

Sat Jun 22 15:41:25 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rgengc_check_shady): add new WB miss checking
	  on RGENGC_CHECK_MODE >= 2.

	    (1) Save bitmaps before marking
	    (2) Run full marking
	    (3) On each traceable object,
	      (a) object        was not oldgen (== newly or shady object) &&
	      (b) parent object was     oldgen &&
	      (c) parent object was not remembered &&
	      (d) object        was not remembered
	      then, it should be WB miss.

	  This idea of this checker is by Masaya Tarui <tarui@ruby-lang.org>.

Sat Jun 22 15:25:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* ext/etc/etc.c (setup_passwd): revert r41560, unnecessary

Sat Jun 22 14:39:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* ext/etc/etc.c (Init_etc): omit 'passwd' from definition of Etc::Passwd
	  if HAVE_STRUCT_PASSWD_PW_PASSWD is not defined to prevent mismatch of
	  fields and values in setup_passwd

Sat Jun 22 14:35:40 2013  Tanaka Akira  <akr@fsij.org>

	* ext/dl/cfunc.c (rb_dlcfunc_call): Use rb_big_pack instead of
	  rb_big2ulong_pack and rb_big2ull.

	* include/ruby/intern.h (rb_big2ulong_pack): Deprecated.

Sat Jun 22 14:31:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* ext/etc/etc.c (setup_passwd): pass 0 as VALUE to rb_struct_new to
	  prevent segfault if the compiler passes it as a 32 bit integer on
	  a 64 bit ruby

Sat Jun 22 13:47:13 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_pack): MEMZERO can be used even if nails is not zero.

Sat Jun 22 13:43:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* ext/etc/etc.c (etc_getpwnam): use PRIsVALUE in format string instead
	  of %s and RSTRING_PTR

	* ext/etc/etc.c (etc_getgrnam): ditto

Sat Jun 22 13:07:15 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (CLEAR_LOWBITS): Rewritten without RSHIFTX.
	  (RSHIFTX): Removed.

Sat Jun 22 10:38:03 2013  Tanaka Akira  <akr@fsij.org>

	* pack.c (num2i32): Removed.
	  (pack_pack): Don't use num2i32.

Sat Jun 22 09:55:13 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (LSHIFTX): Defined to suppress a warning.
	  (RSHIFTX): Ditto.
	  (CLEAR_LOWBITS): Use LSHIFTX and RSHIFTX.
	  (FILL_LOWBITS): Use LSHIFTX.
	  Reported by ko1 via IRC.

Sat Jun 22 09:11:33 2013  Ryan Davis  <ryand-ruby@zenspider.com>

	* lib/minitest/*: Imported minitest 4.7.5 (r8724)
	* test/minitest/*: ditto

Sat Jun 22 07:20:30 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_prof_set_heap_info, after_gc_sweep): call
	  gc_prof_set_heap_info() just after sweeping to calculate
	  live object number correctly.
	  (live object number = total generated number (before marking) -
	                        total freed number (after sweeping))

	* gc.c (gc_marks): record `oldgen_object_count' into current profile`
	  record directly.

	* gc.c (rgengc_rememberset_mark): same for remembered_normal_objects
	  and remembered_shady_objects.

Sat Jun 22 06:46:04 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rb_objspace::profile): rename rb_objspace::profile::record to
	  records (because it points a set of records) and add a field
	  rb_objspace::profile::current_record to point a current profiling
	  record.

	* gc.c: use above fields.

Sat Jun 22 06:05:36 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rb_gc_giveup_promoted_writebarrier): remove `rest_sweep()'
	  because all of remembered objects are called for gc_mark_children().

Sat Jun 22 05:08:03 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rgengc_rememberset_mark): call gc_mark_children() for
	  remembered objects directly instead of pushing on the mark stack.

Sat Jun 22 04:48:53 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h (OBJ_WRITE): cast to (VALUE *) for second
	  parameter `slot'. You don't need to write a cast (VALUE *) any more.

	* class.c, compile.c, hash.c, iseq.c, proc.c, re.c, variable.c,
	  vm.c, vm_method.c: remove cast expressions for OBJ_WRITE().

Sat Jun 22 04:37:08 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (slot_sweep_body): rename to slot_sweep().
	  No need to separate major/minor GC.

	* gc.c (gc_setup_mark_bits): remove gc_clear_mark_bits() and unify to
	  this function.

Sat Jun 22 04:20:21 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (check_bitmap_consistency): add to check flag and bitmap consistency.
	  Use this function in several places.

Sat Jun 22 02:18:07 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_pack): Specialized packers implemented.
	  (HOST_BIGENDIAN_P): New macro.
	  (ALIGNOF): New macro.
	  (CLEAR_LOWBITS): New macro.
	  (FILL_LOWBITS): New macro.
	  (swap_bdigit): New macro.
	  (bary_2comp): Returns an int.

	* internal.h (swap16): Moved from pack.c
	  (swap32): Ditto.
	  (swap64): Ditto.

Fri Jun 21 21:29:49 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (typedef enum): Introduce flags of major gc reason.
	* gc.c (garbage_collect_body): Ditto.
	* gc.c (gc_profile_flags): Ditto.
	* gc.c (gc_profile_dump_on): Ditto.

Fri Jun 21 21:11:53 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (allocate_sorted_heaps): remove unused variable `add'.

Fri Jun 21 20:50:32 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: constify RArray::as::ary and RArray::heap::ptr.
	  Use RARRAY_ASET() or RARRAY_PTR_USE() to modify Array objects.

	* array.c, gc.c: catch up above changes.

Fri Jun 21 20:32:13 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_eval.c (eval_string_with_cref): fix WB miss.

Fri Jun 21 20:15:49 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: support write barrier protection for T_STRUCT.
	  Introduce the following C APIs:
	    * RSTRUCT_RAWPTR(st) returns pointer (do WB on your risk).
	      The type of returned pointer is (const VALUE *).
	    * RSTRUCT_GET(st, idx) returns idx-th value of struct.
	    * RSTRUCT_SET(st, idx, v) set idx-th value by v with WB.
	  And
	    * RSTRUCT_PTR(st) returns pointer with shady operation.
	      The type of returned pointer is (VALUE *).

	* struct.c, re.c, gc.c, marshal.c: rewrite with above APIs.

Fri Jun 21 19:38:37 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (BDIGMAX): Use BIGRAD.
	  (BIGLO): Use BDIGMAX.
	  (bigdivrem1): Ditto.
	  (bigor_int): Ditto.
	  (rb_big_or): Ditto.

Fri Jun 21 19:18:48 2013  Tanaka Akira  <akr@fsij.org>

	* pack.c (pack_pack): Move the implementation for 'c' directive after
	  pack_integer label.

Fri Jun 21 19:11:56 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h, re.c: support write barrier for T_REGEXP.

	   Note: T_MATCH object is also easy to support write barriers.
	         However, most of T_MATCH objects are short-lived objects.
	         So I skipped to support non-shady T_MATCH.

Fri Jun 21 18:56:58 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigsub_int): Use bdigit_roomof.
	  (bigadd_int): Ditto.
	  (bigand_int): Ditto.
	  (bigor_int): Ditto.
	  (bigxor_int): Ditto.

Fri Jun 21 17:56:25 2013  Koichi Sasada  <ko1@atdot.net>

	* benchmark/gc/gcbench.rb: fix summary of benchmark result notation.

Fri Jun 21 16:38:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* ext/openssl/ossl_x509attr.c: change OSSL_X509ATTR_IS_SINGLE and
	  OSSL_X509ATTR_SET_SINGLE macros to use ->value.set rather than
	  ->set to fix compile failure

Fri Jun 21 15:26:45 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_sweep): profile sweep time correctly when LAZY_SWEEP is
	  disabled.

	* gc.c (gc_marks_test): store oldgen count and shady count
	  before test marking and restore them after marking.

Fri Jun 21 15:07:42 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: enable lazy sweep (commit miss).

Fri Jun 21 14:31:29 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* hash.c (ruby_setenv): refine error message so include the variable
	  name.

Fri Jun 21 14:15:08 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: fix to use total_allocated_object_num and heaps_used
	  at the GC time for profiler.

Fri Jun 21 12:35:35 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: RGENGC_CHECK_MODE should be 0.

Fri Jun 21 11:18:25 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_marks_body): fix to get `th' in this function.

Fri Jun 21 10:21:44 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (heaps_header/heaps_slot): embed bitmaps into heaps_slot.
	  no need to maintain allocation/free bitmaps.

Fri Jun 21 09:22:16 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (slot_sweep_body): add counters at a time.

	* gc.c (gc_profile_dump_on): fix line break position.

Fri Jun 21 08:14:00 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c: refactoring bitmaps. introduce bits_t type and some Consts.

Fri Jun 21 08:04:32 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: fix to support USE_RGENGC == 0 (disable RGenGC).
	  If USE_RGENGC==0, it caused compilation error.

Fri Jun 21 08:08:11 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (lazy_sweep): Use is_lazy_sweeping()
	* gc.c (rest_sweep): Ditto.
	* gc.c (gc_prepare_free_objects): Ditto.

Fri Jun 21 07:34:47 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_profile_record::oldgen_objects): added.

	* gc.c (gc_profile_dump_on): print the following information:
	  * Living object counts
	  * Free object counts
	  If RGENGC_PROFILE > 0 then
	  * Oldgen object counts
	  * Remembered normal object counts
	  * Remembered shady object counts

Fri Jun 21 06:43:59 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_ull2big): Refactored.
	  (rb_uint2big): Useless code removed.

Fri Jun 21 05:37:39 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_prof_sweep_timer_stop): accumulate sweep time only when
	  record->gc_time > 0.

Fri Jun 21 00:37:31 2013  Tanaka Akira  <akr@fsij.org>

	* ext/bigdecimal: Workaround fix for bigdecimal test failures caused
	  by [ruby-dev:47413] [Feature #8509]

	* ext/bigdecimal/bigdecimal.h (BDIGIT): Make it independent from the
	  definition for bignum.c.
	  (SIZEOF_BDIGITS): Ditto.
	  (BDIGIT_DBL): Ditto.
	  (BDIGIT_DBL_SIGNED): Ditto.
	  (PRI_BDIGIT_PREFIX): Undefine the definition.
	  (PRI_BDIGIT_DBL_PREFIX): Ditto.

	* ext/bigdecimal/bigdecimal.c (RBIGNUM_ZERO_P): Use rb_bigzero_p.
	  (bigzero_p): Removed.
	  (is_even): Use rb_big_pack.

Thu Jun 20 22:52:42 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigmul1_toom3): Don't call bignorm twice.

Thu Jun 20 22:49:27 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bignorm): Don't call bigtrunc if the result is a fixnum.

Thu Jun 20 22:29:42 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_uint2big): Refactored.

Thu Jun 20 22:24:41 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (dump_bignum): Use SIZEOF_BDIGITS.

Thu Jun 20 22:22:46 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2ulong): Change the return type to unsigned long.
	  (rb_big2ulong_pack): Follow the above change.
	  (rb_big2long): Ditto.
	  (rb_big_lshift): Ditto.
	  (rb_big_rshift): Ditto.
	  (rb_big_aref): Ditto.

Thu Jun 20 22:02:46 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_unpack_internal): Return -2 when negative overflow.
	  (bary_unpack): Set the overflowed bit if an extra BDIGIT exists.
	  (rb_integer_unpack): Set the overflowed bit.

Thu Jun 20 21:17:19 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rgengc_rememberset_mark): record
	  (1) normal objects count in remember set
	  (2) shady objects count in remember set
	  each GC timing.

	* gc.c (gc_profile_record_get): enable to access above information
	  and REMOVING_OBJECTS, EMPTY_OBJECTS.

Thu Jun 20 18:29:26 2013  Koichi Sasada  <ko1@atdot.net>

	* benchmark/gc/gcbench.rb: Do not use GC::Profiler::disable because
	  GC::Profiler::disable prohibit to access profiling data. It should
	  be spec bug.

	  Skip GC::Profiler::report if RUBY_VERSION < '2.0.0'

Thu Jun 20 17:59:08 2013  Koichi Sasada  <ko1@atdot.net>

	* benchmark/gc/gcbench.rb: stop GC::Profiler before output results.
	  Generating GC::Profiler result under profiling causes infinite loop.

Thu Jun 20 17:24:24 2013  Koichi Sasada  <ko1@atdot.net>

	* benchmark/gc/gcbench.rb: don't use __dir__ to make compatible
	  with ruby 1.9.3.

Thu Jun 20 16:57:19 2013  Koichi Sasada  <ko1@atdot.net>

	* benchmark/bm_app_aobench.rb: use attr_accessor/reader instead of
	  defining methods.

Thu Jun 20 16:46:46 2013  Koichi Sasada  <ko1@atdot.net>

	* benchmark/bm_app_aobench.rb: added.

	* benchmark/gc/aobench.rb: added.

Thu Jun 20 16:28:33 2013  Koichi Sasada  <ko1@atdot.net>

	* benchmark/bm_so_binary_trees.rb: disable `puts' method
	  and change iteration parameter to increase execution time.

	* benchmark/gc/binarytree.rb: added.

Thu Jun 20 16:06:37 2013  Koichi Sasada  <ko1@atdot.net>

	* benchmark/gc/pentomino.rb: added.
	  Simply load pentomino puzzle in the benchmark/ directory.

Thu Jun 20 15:32:56 2013  Koichi Sasada  <ko1@atdot.net>

	* benchmark/gc/redblack.rb: import red black tree benchmark from
	  https://github.com/jruby/rubybench/blob/master/time/bench_red_black.rb

	* benchmark/gc/ring.rb: add a benchmark. This benchmark create many
	  old objects.

Thu Jun 20 15:14:00 2013  Koichi Sasada  <ko1@atdot.net>

	* benchmark/gc: create a directory to store GC related benchmark.

	* benchmark/gc/gcbench.rb: moved from tool/gcbench.rb.

	* benchmark/gc/hash(1|2).rb: ditto.

	* benchmark/gc/rdoc.rb: ditto.

	* benchmark/gc/null.rb: added.

	* common.mk: fix rule.

Thu Jun 20 14:09:54 2013  Koichi Sasada  <ko1@atdot.net>

	* tool/hashbench1.rb: fix parameter too. Increase temporary objects.

Thu Jun 20 14:01:35 2013  Koichi Sasada  <ko1@atdot.net>

	* tool/hashbench1.rb: fix parameters.

Thu Jun 20 14:00:34 2013  Koichi Sasada  <ko1@atdot.net>

	* common.mk: remove dependency from ruby.

Thu Jun 20 13:14:06 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* error.c (rb_check_backtrace): evaluate RARRAY_AREF only once.
	  the first argument of RB_TYPE_P is expanded twice for non-immediate
	  types.

Thu Jun 20 08:09:29 2013  Koichi Sasada  <ko1@atdot.net>

	* tool/gcbench.rb: Summary in one line.

	* common.mk: separate gcbench-hash to gcbench-hash1 and gcbench-hash2.

Thu Jun 20 08:07:23 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (BIGSIZE): New macro.
	  (bigfixize): Use BIGSIZE.
	  (big2ulong): Ditto.
	  (check_shiftdown): Ditto.
	  (rb_big_aref): Ditto.

Thu Jun 20 07:46:48 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (rb_gc_writebarrier): give up rescan A and register B directly
	  if A has huge number of children.

Thu Jun 20 07:30:35 2013  Koichi Sasada  <ko1@atdot.net>

	* common.mk: add new rules `gcbench-rdoc', `gcbench-hash'.

	* tool/gcbench.rb: separate GC bench framework and process.

	* tool/hashbench1.rb, tool/hashbench2.rb: add two types GC bench.
	  hashbench1: many temporal objects (GC by newobj)
	  hashbench2: hash size becomes bigger and bigger (GC by malloc)
	  Two benches are executed by `gcbench-hash' rule.

	* tool/rdocbench.rb: separated.

Thu Jun 20 06:25:39 2013  Koichi Sasada  <ko1@atdot.net>

	* tool/rdocbench.rb: add summary.

Thu Jun 20 06:18:01 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_profile_total_time): check objspace->profile.next_index > 0.

Thu Jun 20 05:47:41 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_prof_sweep_timer_start): fix merge miss.

	* gc.c (GC_PROFILE_MORE_DETAIL): set it 0.

Thu Jun 20 05:38:56 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: Accumulate sweep time to GC time.
	  Now [GC time] is [mark time] + [sweep time] + [misc].
	  ([GC time] >= [mark time] + [sweep time])

	* gc.c (gc_prof_sweep_slot_timer_start/stop): rename to
	  gc_prof_sweep_timer_start/stop and locate at lazy_sweep().

	* gc.c (elapsed_time_from): add a utility function.

Thu Jun 20 05:08:53 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_marks): fix wrong option. FALSE means major/full GC.
	  It should be TRUE (minor marking).

Thu Jun 20 02:44:45 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (waitpid): should not return 0 but wait until exit
	  unless WNOHANG is given.  waiting huge process may return while
	  active, for some reason.

Thu Jun 20 01:34:15 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bdigit_roomof): Use SIZEOF_BDIGITS.
	  (bigfixize): Refine an ifdef condition.
	  (rb_absint_size): Use bdigit_roomof.
	  (rb_absint_singlebit_p): Ditto.
	  (rb_integer_pack): Ditto.
	  (integer_pack_fill_dd): Use BITSPERDIG.
	  (integer_unpack_push_bits): Use BITSPERDIG, BIGLO and BIGDN.

Thu Jun 20 01:07:39 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (MARKED_IN_BITMAP, FL_TEST2): return boolean value since always
	  used as boolean value.

	* gc.c (MARK_IN_BITMAP, CLEAR_IN_BITMAP): evaluate bits once.

Thu Jun 20 00:05:07 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (RVALUE_PROMOTED): fix type.

Wed Jun 19 23:39:01 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_marks_test): rewrite checking code.
	  When RGENGC_CHECK_MODE >= 2, all minor marking, run normal minor
	  marking *and* major/full marking. After that, compare the results
	  and shows BUG if a object living with major/full marking but dead
	  with minor marking.
	  After detecting bugs, print references information.
	  (RGENGC_CHECK_MODE == 2, show references to dead object)
	  (RGENGC_CHECK_MODE == 3, show all references)

Wed Jun 19 23:51:48 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigfixize): Use rb_absint_size.
	  (check_shiftdown): Ditto.
	  (big2ulong): Use bdigit_roomof.

Wed Jun 19 23:32:23 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (RVALUE_PROMOTED): check consistency between oldgen flag and
	  oldgen bitmap if RGENGC_CHECK_MODE > 0.

Wed Jun 19 23:29:29 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rb_gc_force_recycle): clear oldgen bitmap, too.

Wed Jun 19 21:02:13 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_uint2big): Consider environments BDIGIT is bigger than
	  long.
	  (big2ulong): Ditto.
	  (rb_big_aref): Ditto.
	  (rb_big_pack): Just call rb_integer_pack.
	  (rb_big_unpack): Just call rb_integer_unpack.

Wed Jun 19 20:51:21 2013  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* gc.c (gc_stress_get): GC.stress can be Fixnum.

Wed Jun 19 19:31:30 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (DIGSPERLONG): Don't define if BDIGIT is bigger than long.
	  (DIGSPERLL): Don't define if BDIGIT is bigger than LONG_LONG
	  (rb_absint_size): Consider environments BDIGIT is bigger than long.
	  Use BIGLO and BIGDN.
	  (rb_absint_singlebit_p): Ditto.
	  (rb_integer_pack): Ditto.
	  (bigsub_int): Consider environments BDIGIT is bigger than long.
	  Use SIZEOF_BDIGITS instead of sizeof(BDIGIT).
	  (bigadd_int): Ditto.
	  (bigand_int): Ditto.
	  (bigor_int): Ditto.
	  (bigxor_int): Ditto.

Wed Jun 19 15:14:30 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h (struct rb_data_type_struct), gc.c: add
	  rb_data_type_struct::flags. Now, this flags is passed
	  at T_DATA object creation. You can specify FL_WB_PROTECTED
	  on this flag.

	* iseq.c: making non-shady iseq objects.

	* class.c, compile.c, proc.c, vm.c: add WB for iseq objects.

	* vm_core.h, iseq.h: constify fields to detect WB insertion.

Wed Jun 19 15:11:13 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (gc_mark_children): show more info for broken object.

Wed Jun 19 14:04:41 2013  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* test/ruby/envutil.rb (EnvUtil#rubybin): remove unnecessary
	  unless expression.

Wed Jun 19 07:47:48 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (garbage_collect_body): use FIX2INT for ruby_gc_stress.

Wed Jun 19 07:44:31 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rb_objspace::gc_stress): int -> VALUE to store Fixnum object.

Wed Jun 19 07:25:35 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (make_deferred): clear flags to T_ZOMBIE.

	* gc.c (slot_sweep_body): fix indent.

Wed Jun 19 07:18:47 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big_aref): Apply BIGLO to ~xds[i] for environment which
	  BDIGIT is 16bit.

Wed Jun 19 07:09:26 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rgengc_remember): fix output level.

	* gc.c (rgengc_rememberset_mark): fix to output clear count.
	  (shady_object_count + clear_count = count of remembered objects)

Wed Jun 19 07:06:21 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rgengc_remember): check T_NONE and T_ZOMBIE
	  if RGENGC_CHECK_MODE > 0.

Wed Jun 19 07:02:19 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (RGENGC_CHECK_MODE): add new check mode `3'.
	  In this mode, show all references if there is
	  a miss-corrected object.

Wed Jun 19 06:31:08 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_stress_set): add special option of GC.stress.
	  `GC.stress=(flag)' accepts integer to control behavior of GC.
	  See code for details. Of course, this feature is only for MRI.

	  You can debug RGenGC (WB) using `GC.stress = 1'.
	  Using this option, do minor marking at all possible places.

	  GC::STRESS_MINOR_MARK = 1 and GC::STRESS_LAZY_SWEEP = 2
	  seem good to add.

Wed Jun 19 06:29:31 2013  Koichi Sasada  <ko1@atdot.net>

	* vm.c (kwmerge_i): add WB.

Wed Jun 19 06:26:49 2013  Koichi Sasada  <ko1@atdot.net>

	* hash.c: `st_update()' also has same issue of last fix.
	  write barriers at callback function are too early.
	  All write barriers are executed after `st_update()'

Wed Jun 19 04:33:22 2013  Koichi Sasada  <ko1@atdot.net>

	* variable.c (rb_const_set): fix WB miss.

	  WBs had located before creating reference between a klass
	  and constant value. It causes GC bug.

	    # pseudo code:
	    WB(klass, value); # WB and remember klass
	    st_insert(klass->const_table, const_id, value);

	  `st_insert()' can cause GC before inserting `value' and
	  forget `klass' from the remember set. After that, relationship
	  between `klass' and `value' are created with constant table.
	  Now, `value' can be young (shady) object and `klass' can be old
	  object, without remembering `klass' object.
	  At the next GC, old `klass' object will be skipped and
	  young (shady) `value' will be miss-collected. -> GC bug

	  Lesson: The place of a WB is important.

Tue Jun 18 22:01:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* vm_insnhelper.c (vm_call_method): ensure methods of type
	  VM_METHOD_TYPE_ATTR_SET are called with 1 argument

	* test/ruby/test_module.rb
	  (TestModule#test_attr_writer_with_no_arguments): add test
	  [ruby-core:55543] [Bug #8540]

Tue Jun 18 22:36:23 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (gc_profile_record_flag): fix typo.

Tue Jun 18 22:08:53 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/objspace/object_tracing.c: Return for ::allocation_generation

Tue Jun 18 22:04:35 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/objspace/object_tracing.c: Document object_tracing methods.

Tue Jun 18 21:58:17 2013  Zachary Scott  <zachary@zacharyscott.net>

	* gc.c: Rename rb_mObSpace -> rb_mObjSpace

Tue Jun 18 20:55:05 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/objspace/objspace.c: Document ObjectSpace::InternalObjectWrapper.

Tue Jun 18 20:39:04 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/objspace/object_tracing.c: Teach rdoc object_tracing.c [Bug #8537]

Tue Jun 18 20:29:47 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/.document: add object_tracing.c to document file

Tue Jun 18 20:20:27 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/objspace/objspace.c: rdoc on require to overview from r41355

Tue Jun 18 18:39:58 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: Check __int128.

	* include/ruby/defines.h (BDIGIT_DBL): Use uint128_t if it is available.
	  (BDIGIT): Use uint64_t if uint128_t is available.
	  (SIZEOF_BDIGITS): Defined for above case.
	  (BDIGIT_DBL_SIGNED): Ditto.
	  (PRI_BDIGIT_PREFIX): Ditto.

	* include/ruby/ruby.h (PRI_64_PREFIX): Defined.

	* bignum.c (rb_big_pow): Don't use BITSPERDIG for the condition which
	  rb_big_pow returns Float or Bignum.

	[ruby-dev:47413] [Feature #8509]

Tue Jun 18 16:43:44 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (parser_heredoc_restore): clear lex_strterm always to get
	  rid of marking recycled node.  this bug is revealed by r41372 with
	  GC.stress=true.

Tue Jun 18 12:53:25 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (nlz): Cast the result explicitly.
	  (big2dbl): Don't assign BDIGIT values to int variable.

Tue Jun 18 12:25:16 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big_xor): Non-effective code removed.

Tue Jun 18 11:26:05 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_stat): add `generated_normal_object_count_types' for
	  RGENGC_PROFILE >= 2.

Tue Jun 18 11:02:18 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_mark_maybe): check to skip T_NONE.

	* gc.c (markable_object_p): do not need to check (flags == 0) here.

Tue Jun 18 10:17:37 2013  Koichi Sasada  <ko1@atdot.net>

	* variable.c (rb_autoload): fix WB miss.

Tue Jun 18 04:20:18 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_mark_children): don't need to care about T_ZOMBIE here.

Mon Jun 17 22:16:02 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* test/ruby/test_proc.rb (TestProc#test_block_given_method_to_proc):
	  run test for r41359.

Mon Jun 17 21:42:18 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* include/ruby/ruby.h, vm_eval.c (rb_funcall_with_block):
	  new function to invoke a method with a block passed
	  as an argument.

	* string.c (sym_call): use the above function to avoid
	  a block sharing. [ruby-dev:47438] [Bug #8531]

	* vm_insnhelper.c (vm_yield_with_cfunc): don't set block
	  in the frame.

	* test/ruby/test_symbol.rb (TestSymbol#test_block_given_to_proc):
	  run related tests.

Mon Jun 17 21:33:27 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* include/ruby/intern.h, proc.c (rb_method_call_with_block):
	  new function to invoke a Method object with a block passed
	  as an argument.

	* proc.c (bmcall): use the above function to avoid a block sharing.
	  [ruby-core:54626] [Bug #8341]

	* test/ruby/test_proc.rb (TestProc#test_block_persist_between_calls):
	  run related tests.

Mon Jun 17 20:53:21 2013  Tanaka Akira  <akr@fsij.org>

	* loadpath.c (RUBY_REVISION): Defined to suppress revision.h
	  inclusion actually.  r41352 removes the dependency.

Mon Jun 17 18:15:57 2013  Benoit Daloze  <eregontp@gmail.com>

	* ext/objspace/objspace.c: let rdoc know about objspace methods.
	  Specify 'objspace' should be required. See #8537.

Mon Jun 17 17:44:31 2013  Benoit Daloze  <eregontp@gmail.com>

	* gc.c (ObjectSpace): is a module not a class.

	* ext/objspace/objspace.c: try to include overview in rdoc,
	  see #8537.

Mon Jun 17 17:38:24 2013  Benoit Daloze  <eregontp@gmail.com>

	* gc.c: fix example of ObjectSpace.define_finalizer in overview

Mon Jun 17 16:59:53 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/tk/tkutil/tkutil.c: use rb_sprintf(), rb_id2str(), and
	  rb_intern_str() instead of rb_intern() and RSTRING_PTR() with
	  RB_GC_GUARD(), to prevent temporary objects from GC.
	  [ruby-core:39000] [Bug #5199]

Mon Jun 17 14:27:54 2013  Zachary Scott  <zachary@zacharyscott.net>

	* vm_backtrace.c: Update rdoc for Backtrace#label with @_ko1

Mon Jun 17 13:04:01 2013  Akinori MUSHA  <knu@iDaemons.org>

	* tool/ifchange (until): Fix the condition, although harmless in
	  this case.

Mon Jun 17 11:50:29 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_mark_maybe): added. check `is_pointer_to_heap()' and
	  type is not T_ZOMBIE.

	* gc.c: use `gc_mark_maybe()'. T_ZOMBIE objects should not be pushed
	  to the mark stack.

Mon Jun 17 07:56:24 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_small_lshift): Renamed from bdigs_small_lshift.
	  (bary_small_rshift): Renamed from bdigs_small_rshift.

Mon Jun 17 07:38:48 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (absint_numwords_bytes): Removed.
	  (rb_absint_numwords): Don't call absint_numwords_bytes.

Sun Jun 16 23:14:58 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (BARY_ADD): New macro.
	  (BARY_SUB): Ditto.
	  (BARY_MUL): Ditto.
	  (BARY_DIVMOD): Ditto.
	  (BARY_ZERO_P): Ditto.
	  (absint_numwords_generic): Use these macros.

Sun Jun 16 21:41:39 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_2comp): Extracted from get2comp.
	  (integer_unpack_num_bdigits): Extracted from
	  rb_integer_unpack_internal.
	  (bary_unpack_internal): Renamed from bary_unpack and support
	  INTEGER_PACK_2COMP.
	  (bary_unpack): New function to validate arguments and invoke
	  bary_unpack_internal.
	  (rb_integer_unpack_internal): Removed.
	  (rb_integer_unpack): Invoke bary_unpack_internal.
	  (rb_integer_unpack_2comp): Removed.

	* internal.h (rb_integer_unpack_2comp): Removed.

	* pack.c: Follow the above change.

Sun Jun 16 18:41:42 2013  Tanaka Akira  <akr@fsij.org>

	* internal.h (INTEGER_PACK_2COMP): Defined.
	  (rb_integer_pack_2comp): Removed.

	* bignum.c (bary_pack): Support INTEGER_PACK_2COMP.
	  (rb_integer_pack): Invoke bary_pack directly.
	  (rb_integer_pack_2comp): Removed.
	  (rb_integer_pack_internal): Ditto.
	  (absint_numwords_generic): Follow the above change.

	* pack.c (pack_pack): Ditto.

	* sprintf.c (rb_str_format): Ditto.

Sun Jun 16 17:48:14 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (absint_numwords_generic): rb_funcall invocations removed.

Sun Jun 16 16:04:38 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* tool/config_files.rb: use URI.read to allow it runs with Ruby 1.8.5.

Sun Jun 16 14:32:25 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_pack) Extracted from rb_integer_pack_internal.
	  (absint_numwords_generic): Use bary_pack.

Sun Jun 16 11:01:57 2013  Kouhei Sutou  <kou@cozmixng.org>

	* NEWS (XMLRPC::Client#http): Add.
	  [ruby-core:55197] [Feature #8461]

Sun Jun 16 10:38:45 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_add): New function.
	  (bary_zero_p): Extracted from bigzero_p.
	  (absint_numwords_generic): Use bary_zero_p and bary_add.
	  (bary_mul): Fix an argument for bary_mul_single.
	  (bary_divmod): Use size_t for arguments.

Sun Jun 16 08:55:22 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigdivrem): Use a BDIGIT variable to store the return
	  value of bigdivrem_single.

Sun Jun 16 08:43:59 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_divmod): New function.
	  (absint_numwords_generic): Use bary_divmod.
	  (bigdivrem_num_extra_words): Extracted from bigdivrem.
	  (bigdivrem_single): Ditto.
	  (bigdivrem_normal): Ditto.
	  (BIGDIVREM_EXTRA_WORDS): Defined.

Sun Jun 16 05:51:51 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c: Fixup around GC by MALLOC.
	  Add allocate size to malloc_increase before GC
	  for updating limit in after_gc_sweep.
	  Reset malloc_increase into garbage_collect()
	  for preventing GC again soon.

Sun Jun 16 05:15:36 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c: Add some columns to more detail profile.
	  new columns: Allocated size, Prepare Time, Removing Objects, Empty Objects

Sun Jun 16 02:04:40 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (gc_prof_timer_stop): Merge function codes of GC_PROFILE_MORE_DETAIL and !GC_PROFILE_MORE_DETAIL.
	* gc.c (gc_prof_mark_timer_start): Ditto.
	* gc.c (gc_prof_mark_timer_stop): Ditto.
	* gc.c (gc_prof_sweep_slot_timer_start): Ditto.
	* gc.c (gc_prof_sweep_slot_timer_stop): Ditto.
	* gc.c (gc_prof_set_malloc_info): Ditto.
	* gc.c (gc_prof_set_heap_info): Ditto.

Sat Jun 15 23:50:24 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_sub): New function.
	  (absint_numwords_generic): Use bary_sub.
	  (bigsub_core): Skip unnecessary copy.

Sat Jun 15 22:05:30 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_mul): New function.
	  (absint_numwords_generic): Use bary_mul.
	  (bary_mul_single): Extracted from bigmul1_single.
	  (bary_mul_normal): Extracted from bigmul1_normal.

Sat Jun 15 20:13:46 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bary_unpack): Extracted from rb_integer_unpack_internal.
	  (absint_numwords_generic): Use bary_unpack.
	  (roomof): Defined.
	  (bdigit_roomof): Defined.
	  (BARY_ARGS): Defined.
	  (bary_unpack): Declared.

Sat Jun 15 19:35:04 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (absint_numwords_bytes): Make it static.
	  (absint_numwords_small): Ditto.
	  (absint_numwords_generic): Ditto.

Sat Jun 15 17:14:32 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigmul1_normal): Shrink the result Bignum length.

Sat Jun 15 10:19:42 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/bigdecimal/bigdecimal.c: Update overview formatting of headers

Sat Jun 15 10:19:06 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/bigdecimal/bigdecimal.gemspec: Update authors

Sat Jun 15 10:02:26 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bdigs_small_rshift): Extracted from big_rshift.
	  (bigdivrem): Use bdigs_small_rshift.

Sat Jun 15 08:37:28 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_eval.c (eval_string_with_cref): propagate absolute path from the
	  binding if it is given explicitly.  patch by Gat (Dawid Janczak) at
	  [ruby-core:55123]. [Bug #8436]

Sat Jun 15 02:40:18 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bdigs_small_lshift): Extracted from big_lshift.
	  (bigdivrem): Use bdigs_small_lshift.

Fri Jun 14 20:47:41 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigdivrem): Reduce number of digits before bignew() for div.

Fri Jun 14 20:12:37 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigdivrem): Use bignew when ny == 1.

Fri Jun 14 18:52:51 2013  Koichi Sasada  <ko1@atdot.net>

	* compile.c (rb_iseq_compile_node): fix location of a `trace'
	  instruction (b_return event).
	  [ruby-core:55305] [ruby-trunk - Bug #8489]
	  (need a backport to 2.0.0?)

	* test/ruby/test_settracefunc.rb: add a test.

Fri Jun 14 18:18:07 2013  Koichi Sasada  <ko1@atdot.net>

	* class.c, include/ruby/ruby.h: add write barriers for T_CLASS,
	  T_MODULE, T_ICLASS.

	* constant.h: constify rb_const_entry_t::value and file to detect
	  assignment.

	* variable.c, internal.h (rb_st_insert_id_and_value, rb_st_copy):
	  added. update table with write barrier.

	* method.h: constify some variables to detect assignment.

	* object.c (init_copy): add WBs.

	* variable.c: ditto.

	* vm_method.c (rb_add_method): ditto.

Fri Jun 14 14:33:47 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* NEWS: add a note for Module#using.

Fri Jun 14 13:40:27 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* .travis.yml (before_script): update config files.

	* common.mk ($(srcdir)/tool/config.{guess,sub}): use get-config_files.

	* tool/config_files.rb: split get-config_files.

	* common.mk (update-config_files): rule to download config files.

	* tool/config.guess, tool/config.sub: remove and download from the
	  upstream.

	* tool/config_files.rb: download config files from GNU.

Fri Jun 14 12:21:20 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/ruby.h (RUBY_SAFE_LEVEL_CHECK): suppress warnings
	  "left-hand operand of comma expression has no effect", on gcc 4.4.

Fri Jun 14 09:48:48 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* NEWS: add notes for $SAFE.

	* doc/security.rdoc: remove the description of $SAFE=4.

Fri Jun 14 00:14:29 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigdivrem): Zero test condition simplified.

Thu Jun 13 23:43:11 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/bigdecimal/*: improve documentation, nodoc samples with @mrkn

Thu Jun 13 23:02:14 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/xmlrpc/client.rb (XMLRPC::Client#http): Add reader for raw
	  Net::HTTP. [ruby-core:55197] [Feature #8461]
	  Reported by Herwin Weststrate. Thanks!!!

Thu Jun 13 22:44:52 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/xmlrpc/client.rb (XMLRPC::Client#parse_set_cookies): Support
	  multiple names in a response. [ruby-core:41711] [Bug #5774]
	  Reported by Roman Riha. Thanks!!!
	* test/xmlrpc/test_client.rb (XMLRPC::ClientTest#test_cookie_override):
	  Add a test of the above case.

Thu Jun 13 22:35:50 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/xmlrpc/client.rb (XMLRPC::Client#parse_set_cookies): Use
	  guard style.

Thu Jun 13 22:12:32 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/fileutils.rb (FileUtils#rmdir): fix traversal loop, not trying
	  remove same directory only.

Thu Jun 13 21:30:14 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (opt-dir), tool/ifchange: get rid of "alternate value"
	  expansion for legacy sh.  [ruby-dev:47420] [Bug #8524]

Thu Jun 13 21:24:09 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigdivrem): Refactored to use ALLOCV_N for temporary
	  buffers.

Thu Jun 13 18:54:11 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* bignum.c (integer_unpack_num_bdigits_generic): reorder terms (but not
	  changed the intention of the expression) because VC++ reports a
	  warning for it.  reported by ko1 via IRC.

Thu Jun 13 18:53:14 2013  Tanaka Akira  <akr@fsij.org>

	* test/ruby/test_thread.rb (test_thread_local_security): Don't create
	  an unused thread.

Thu Jun 13 18:34:20 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bigdivrem): Use nlz.

Thu Jun 13 14:51:06 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/ruby.h (RUBY_SAFE_LEVEL_CHECK): check constant safe
	  level at compile time.

Thu Jun 13 14:39:08 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* test/-ext-/test_printf.rb, test/rss/test_parser.rb,
	  test/ruby/test_array.rb, test/ruby/test_hash.rb,
	  test/ruby/test_m17n.rb, test/ruby/test_marshal.rb,
	  test/ruby/test_object.rb, test/ruby/test_string.rb: don't use
	  untrusted?, untrust, and trust to avoid warnings in case $VERBOSE is
	  true.

Thu Jun 13 10:47:16 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* bootstraptest/test_autoload.rb, bootstraptest/test_method.rb:
	  remove tests for $SAFE=4.

	* lib/pp.rb: use taint instead of untrust to avoid warnings when
	  $VERBOSE is set to true.

Thu Jun 13 06:12:18 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (integer_unpack_num_bdigits_small): Fix a compile error on
	  clang -Werror,-Wshorten-64-to-32
	  Reported by Eric Hodel.  [ruby-core:55467] [Bug #8522]

Thu Jun 13 05:32:13 2013  Eric Hodel  <drbrain@segment7.net>

	* ext/socket/extconf.rb:  Enable RFC 3542 IPV6 socket options for OS X
	  10.7+.  [ruby-trunk - Bug #8517]

Thu Jun 13 00:17:18 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_integer_unpack_2comp): New function.
	  (rb_integer_unpack_internal): Extracted from rb_integer_unpack and
	  nlp_bits_ret argument added.
	  (integer_unpack_num_bdigits_small): nlp_bits_ret argument added to
	  return number of leading padding bits.
	  (integer_unpack_num_bdigits_generic): Ditto.

	* internal.h (rb_integer_unpack_2comp): Declared.

	* pack.c (pack_unpack): Use rb_integer_unpack_2comp and
	  rb_integer_unpack.

Wed Jun 12 23:27:03 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* eval.c (mod_using): new method Module#using, which activates
	  refinements of the specified module only in the current class or
	  module definition.  [ruby-core:55273] [Feature #8481]

	* test/ruby/test_refinement.rb: related test.

Wed Jun 12 22:58:48 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* safe.c (rb_set_safe_level, safe_setter): raise an ArgumentError
	  when $SAFE is set to 4.  $SAFE=4 is now obsolete.
	  [ruby-core:55222] [Feature #8468]

	* object.c (rb_obj_untrusted, rb_obj_untrust, rb_obj_trust):
	  Kernel#untrusted?, untrust, and trust are now deprecated.
	  Their behavior is same as tainted?, taint, and untaint,
	  respectively.

	* include/ruby/ruby.h (OBJ_UNTRUSTED, OBJ_UNTRUST): OBJ_UNTRUSTED()
	  and OBJ_UNTRUST() are aliases of OBJ_TAINTED() and OBJ_TAINT(),
	  respectively.

	* array.c, class.c, debug.c, dir.c, encoding.c, error.c, eval.c,
	  ext/curses/curses.c, ext/dbm/dbm.c, ext/dl/cfunc.c,
	  ext/dl/cptr.c, ext/dl/dl.c, ext/etc/etc.c, ext/fiddle/fiddle.c,
	  ext/fiddle/pointer.c, ext/gdbm/gdbm.c, ext/readline/readline.c,
	  ext/sdbm/init.c, ext/socket/ancdata.c, ext/socket/basicsocket.c,
	  ext/socket/socket.c, ext/socket/udpsocket.c,
	  ext/stringio/stringio.c, ext/syslog/syslog.c, ext/tk/tcltklib.c,
	  ext/win32ole/win32ole.c, file.c, gc.c, hash.c, io.c, iseq.c,
	  load.c, marshal.c, object.c, proc.c, process.c, random.c, re.c,
	  safe.c, string.c, thread.c, transcode.c, variable.c,
	  vm_insnhelper.c, vm_method.c, vm_trace.c: remove code for
	  $SAFE=4.

	* test/dl/test_dl2.rb, test/erb/test_erb.rb,
	  test/readline/test_readline.rb,
	  test/readline/test_readline_history.rb, test/ruby/test_alias.rb,
	  test/ruby/test_array.rb, test/ruby/test_dir.rb,
	  test/ruby/test_encoding.rb, test/ruby/test_env.rb,
	  test/ruby/test_eval.rb, test/ruby/test_exception.rb,
	  test/ruby/test_file_exhaustive.rb, test/ruby/test_hash.rb,
	  test/ruby/test_io.rb, test/ruby/test_method.rb,
	  test/ruby/test_module.rb, test/ruby/test_object.rb,
	  test/ruby/test_pack.rb, test/ruby/test_rand.rb,
	  test/ruby/test_regexp.rb, test/ruby/test_settracefunc.rb,
	  test/ruby/test_struct.rb, test/ruby/test_thread.rb,
	  test/ruby/test_time.rb: remove tests for $SAFE=4.

Wed Jun 12 22:18:23 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (integer_unpack_num_bdigits_generic): Rewritten without
	  rb_funcall.
	  (integer_unpack_num_bdigits_bytes): Removed.
	  (rb_integer_unpack): integer_unpack_num_bdigits_bytes invocation
	  removed.

Wed Jun 12 20:18:03 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/xmlrpc/client.rb (XMLRPC::Client#parse_set_cookies): Extract.

Wed Jun 12 18:19:41 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (validate_integer_pack_format): supported_flags argument
	  added and validate given flags.
	  (rb_integer_pack_internal): Specify supported_flags.
	  (rb_integer_unpack): Ditto.

Wed Jun 12 16:41:38 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (rb_ary_sort_bang): remove duplicated assertions.
	  ARY_HEAP_PTR() implies ary not to be embedded.  [ruby-dev:47419]
	  [Bug #8518]

Wed Jun 12 12:44:45 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (io_getc): fix 7bit coderange condition, check if ascii read
	  data instead of read length. [ruby-core:55444] [Bug #8516]

Wed Jun 12 12:35:13 2013  Tanaka Akira  <akr@fsij.org>

	* pack.c (pack_pack): Use rb_integer_pack_2comp.

Wed Jun 12 12:07:04 2013  Tanaka Akira  <akr@fsij.org>

	* sprintf.c (rb_str_format): Fix a dynamic format string.

Wed Jun 12 12:04:09 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (rb_ary_uniq_bang): must not be modified once frozen even in
	  a callback method.

Wed Jun 12 12:03:43 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (rb_ary_sort_bang): must not be modified once frozen even in
	  a callback method.

Wed Jun 12 12:00:15 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (FL_SET_EMBED): shared object is frozen even when get
	  unshared.

	* array.c (rb_ary_modify): ARY_SET_CAPA needs unshared array.

Wed Jun 12 07:32:01 2013  Tanaka Akira  <akr@fsij.org>

	* random.c (rand_int): Use rb_big_uminus.

Wed Jun 12 07:12:54 2013  Eric Hodel  <drbrain@segment7.net>

	* struct.c:  Improve documentation: replace "instance variable" with
	  "member", recommend the use of a block to customize structs, note
	  that member accessors are created, general cleanup.

Wed Jun 12 06:35:01 2013  Tanaka Akira  <akr@fsij.org>

	* internal.h (INTEGER_PACK_NEGATIVE): Defined.
	  (rb_integer_unpack): sign argument removed.

	* bignum.c (rb_integer_unpack): sign argument removed.
	  Non-negative integers generated by default.
	  INTEGER_PACK_NEGATIVE flag is used to generate non-positive integers.

	* pack.c (pack_unpack): Follow the above change.

	* random.c (int_pair_to_real_inclusive): Ditto.
	  (make_seed_value): Ditto.
	  (mt_state): Ditto.
	  (limited_big_rand): Ditto.

	* marshal.c (r_object0): Ditto.

Wed Jun 12 00:07:46 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/xmlrpc/test_client.rb (XMLRPC::ClientTest#test_cookie_simple):
	  Add a test for the extracted method.

Tue Jun 11 23:56:24 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/xmlrpc/test_client.rb (XMLRPC::ClientTest::Fake::HTTP#started):
	  Add a missing empty line.

Tue Jun 11 23:37:19 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (validate_integer_pack_format): Don't require a word order
	  flag if numwords is 1 or less.
	  (absint_numwords_generic): Don't specify a word order for
	  rb_integer_pack.

	* hash.c (rb_hash): Ditto.

	* time.c (v2w_bignum): Ditto.

Tue Jun 11 23:01:57 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (validate_integer_pack_format): Refine error messages.

Tue Jun 11 22:25:04 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (validate_integer_pack_format): numwords argument added.
	  Move a varidation from rb_integer_pack_internal and rb_integer_unpack.
	  (rb_integer_pack_internal): Follow above change.
	  (rb_integer_unpack): Ditto.

Tue Jun 11 20:52:43 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_integer_pack_internal): Renamed from rb_integer_pack
	  and overflow_2comp argument added.
	  (rb_integer_pack): Just call rb_integer_pack_internal.
	  (rb_integer_pack_2comp): New function.

	* internal.h (rb_integer_pack_2comp): Declared.

	* sprintf.c (rb_str_format): Use rb_integer_pack and
	  rb_integer_pack_2comp to format binary/octal/hexadecimal integers.
	  (ruby_digitmap): Declared.
	  (remove_sign_bits): Removed.
	  (BITSPERDIG): Ditto.
	  (EXTENDSIGN): Ditto.

Tue Jun 11 16:15:03 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (ary_shrink_capa): shrink the capacity so it fits just with
	  the length.

	* array.c (ary_make_shared): release never used elements from frozen
	  array to be shared.  [ruby-dev:47416] [Bug #8510]

Tue Jun 11 12:49:01 2013  Zachary Scott  <zachary@zacharyscott.net>

	* doc/re.rdoc: Rename to doc/regexp.rdoc
	* re.c: Update rdoc include for rename of file

Tue Jun 11 07:13:13 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* eval_error.c (error_print): keep that errat is non-shady object.
	  and guard errat from GC.

Tue Jun 11 05:04:25 2013  Benoit Daloze  <eregontp@gmail.com>

	* ext/racc/cparse/cparse.c: use rb_ary_entry() and
	  rb_ary_subseq() instead of RARRAY_PTR.
	  Based on a patch by Dirkjan Bussink. See Bug #8399.

Mon Jun 10 23:51:51 2013  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* array.c (rb_ary_new_from_values): fix a typo. pointed out by
	  nagachika.
	  http://d.hatena.ne.jp/nagachika/20130610/ruby_trunk_changes_41199_41220

Mon Jun 10 21:51:03 2013  Kouhei Sutou  <kou@cozmixng.org>

	* ext/socket/raddrinfo.c (nogvl_getaddrinfo): Fix indent.

Mon Jun 10 21:49:43 2013  Kouhei Sutou  <kou@cozmixng.org>

	* ext/socket/raddrinfo.c (nogvl_getaddrinfo): Add missing return
	  value assignment.

Mon Jun 10 20:58:11 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/socket/raddrinfo.c (nogvl_getaddrinfo): work around for Ubuntu
	  13.04's getaddrinfo issue with mdns4. [ruby-list:49420]

Mon Jun 10 19:34:39 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_integer_pack): Returns sign instead of words.
	  (absint_numwords_generic): Follow the above change.
	  (big2str_base_powerof2): Follow the above change.

	* internal.h: Ditto.

	* hash.c (rb_hash): Ditto.

	* pack.c (pack_pack): Ditto.

	* random.c (int_pair_to_real_inclusive): Ditto.
	  (rand_init): Ditto.
	  (random_load): Ditto.
	  (limited_big_rand): Ditto.

	* time.c (v2w_bignum): Ditto.

Mon Jun 10 17:20:01 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rgengc_remember): permit promoted object.
	  (rb_gc_writebarrier -> remember)

Mon Jun 10 17:14:01 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (RVALUE_PROMOTE): fix parameter name (`x' to `obj')
	  and make it inline function (like RVALUE_PROMOTE).

Mon Jun 10 16:22:50 2013  Koichi Sasada  <ko1@atdot.net>

	* array.c (rb_ary_new_from_values): add assertion
	  (ary should be young object).

Mon Jun 10 16:05:59 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (wmap_mark): check allocation of `w->obj2wmap'.
	  (no-allocation `w->obj2wmap' will be NULL pointer reference)

Mon Jun 10 15:36:00 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval_error.c (error_print): use checking functions instead of
	  catching exceptions.

	* eval_error.c (error_print): restore errinfo for the case new
	  exception raised while printing the message.  [ruby-core:55365]
	  [Bug #8501]

	* eval_error.c (error_print): reduce calling setjmp.

Mon Jun 10 12:10:06 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (integer_unpack_num_bdigits_small: Extracted from
	  rb_integer_unpack.
	  (integer_unpack_num_bdigits_generic): Ditto.
	  (integer_unpack_num_bdigits_bytes): New function.
	  (rb_integer_unpack): Use above functions.
	  Return a Bignum for INTEGER_PACK_FORCE_BIGNUM even when the result
	  is zero.

Mon Jun 10 05:38:23 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (absint_numwords_small): New function.
	  (absint_numwords_generic): Use absint_numwords_small if possible.

Mon Jun 10 01:07:57 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (absint_numwords_bytes): New function.
	  (absint_numwords_generic): Extracted from rb_absint_numwords.
	  (rb_absint_numwords): Use absint_numwords_bytes if possible.

Sun Jun  9 21:33:15 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_absint_numwords): Return (size_t)-1 when overflow.
	  Refine variable names.
	  (rb_absint_size): Refine variable names.

	* internal.h (rb_absint_size): Refine an argument name.
	  (rb_absint_numwords): Ditto.

Sun Jun  9 16:51:41 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_absint_numwords): Renamed from rb_absint_size_in_word.

	* internal.h (rb_absint_numwords): Follow the above change.

	* pack.c (pack_pack): Ditto.

	* random.c (rand_init): Ditto.
	  (limited_big_rand): Ditto.

Sun Jun  9 14:41:05 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_integer_pack): numwords_allocated argument removed.

	* internal.h (rb_integer_pack): Follow the above change.

	* hash.c (rb_hash): Ditto.

	* time.c (v2w_bignum): Ditto.

	* pack.c (pack_pack): Ditto.

	* random.c (int_pair_to_real_inclusive): Ditto.
	  (rand_init): Ditto.
	  (random_load): Ditto.
	  (limited_big_rand): Ditto.

Sun Jun  9 09:34:44 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big2str_base_powerof2): New function.
	  (rb_big2str0): Use big2str_base_powerof2 if base is 2, 4, 8, 16 or 32.

Sun Jun  9 00:59:04 2013  Tanaka Akira  <akr@fsij.org>

	* hash.c (rb_hash): Use rb_integer_pack to obtain least significant
	  long integer.

Sat Jun  8 23:56:00 2013  Tanaka Akira  <akr@fsij.org>

	* numeric.c (rb_num_to_uint): Use rb_absint_size instead of
	  RBIGNUM_LEN.

Sat Jun  8 22:53:45 2013  Tanaka Akira  <akr@fsij.org>

	* marshal.c (r_object0): Use rb_integer_unpack.

Sat Jun  8 22:18:57 2013  Tanaka Akira  <akr@fsij.org>

	* time.c (v2w): Use rb_absint_size instead of RBIGNUM_LEN.

Sat Jun  8 21:47:33 2013  Tanaka Akira  <akr@fsij.org>

	* time.c (v2w_bignum): Simplified using rb_integer_pack.
	  (rb_big_abs_find_maxbit): Removed.

Sat Jun  8 21:03:40 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_absint_singlebit_p): New function.

	* internal.h (rb_absint_singlebit_p): Declared.

	* time.c (v2w_bignum): Use rb_absint_singlebit_p instead of
	  rb_big_abs_find_minbit.
	  (rb_big_abs_find_minbit): Removed.

Sat Jun  8 20:24:23 2013  Tanaka Akira  <akr@fsij.org>

	* time.c (rb_big_abs_find_maxbit): Use rb_absint_size.
	  (bdigit_find_maxbit): Removed.

Sat Jun  8 19:47:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* class.c (include_modules_at): invalidate method cache if included
	  module contains constants

	* test/ruby/test_module.rb: add test

Sat Jun  8 19:31:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* random.c (limited_big_rand): declare rnd, lim and mask as uint32_t
	  to avoid 64 bit to 32 bit shorten warnings.

Sat Jun  8 19:23:53 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* win32/Makefile.sub: r41163 changed win32/win32.c and configure.in
	  but it didn't treat about mswin32/mswin64, so fix it.
	  NOTE: this needs a review by usa whether additional condition is
	  required or not.

Sat Jun  8 19:06:26 2013  Tanaka Akira  <akr@fsij.org>

	* random.c: Unused RBignum internal accessing macros removed.

Sat Jun  8 19:04:15 2013  Tanaka Akira  <akr@fsij.org>

	* random.c (limited_big_rand): The argument, limit, is changed to
	  VALUE.  Use rb_integer_pack and rb_integer_unpack.

Sat Jun  8 17:15:18 2013  Tanaka Akira  <akr@fsij.org>

	* random.c (make_seed_value): Fix the length given for
	  rb_integer_unpack.

Sat Jun  8 16:38:02 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_integer_unpack): Don't use rb_funcall if possible.

	* random.c: Use uint32_t for elements of seed.
	  (make_seed_value): Use rb_integer_unpack.

Sat Jun  8 15:58:18 2013  Tanaka Akira  <akr@fsij.org>

	* random.c (rand_init): Add a cast to fix clang compile error:
	  random.c:410:32: error: implicit conversion loses integer precision:
	  'size_t' (aka 'unsigned long') to 'int' [-Werror,-Wshorten-64-to-32]
	  This cast doesn't cause a problem because len is not bigger than
	  MT_MAX_STATE.

Sat Jun  8 15:30:03 2013  Tanaka Akira  <akr@fsij.org>

	* random.c (rand_init): Use rb_integer_pack.
	  (roomof): Removed.

Sat Jun  8 14:58:32 2013  Tanaka Akira  <akr@fsij.org>

	* internal.h (INTEGER_PACK_FORCE_BIGNUM): New flag constant.

	* bignum.c (rb_integer_unpack): Support INTEGER_PACK_FORCE_BIGNUM.

	* random.c (int_pair_to_real_inclusive): Use
	  INTEGER_PACK_FORCE_BIGNUM to use rb_big_mul instead of rb_funcall.

Sat Jun  8 14:17:01 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: check for NET_LUID.  header macro varies across
	  compiler versions.

	* win32/win32.c: use configured macro.

Sat Jun  8 11:59:55 2013  Tanaka Akira  <akr@fsij.org>

	* random.c (int_pair_to_real_inclusive): Use rb_funcall instead of
	  rb_big_mul because rb_integer_unpack can return a Fixnum.

Sat Jun  8 11:17:39 2013  Tanaka Akira  <akr@fsij.org>

	* random.c (int_pair_to_real_inclusive): Use rb_integer_pack.

Sat Jun  8 09:49:42 2013  Tanaka Akira  <akr@fsij.org>

	* random.c (int_pair_to_real_inclusive): Use rb_integer_unpack.

Sat Jun  8 08:12:22 2013  Tanaka Akira  <akr@fsij.org>

	* random.c (random_load): Use rb_integer_pack.

Sat Jun  8 06:15:46 2013  Tanaka Akira  <akr@fsij.org>

	* random.c (numberof): Removed.

Sat Jun  8 06:00:47 2013  Tanaka Akira  <akr@fsij.org>

	* random.c: include internal.h.
	  (mt_state): Use rb_integer_unpack.

Sat Jun  8 00:55:51 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (integer_pack_loop_setup): word_num_nailbytes_ret argument
	  removed.
	  (rb_integer_pack): Follow the above change.
	  (rb_integer_unpack): Follow the above change.

Sat Jun  8 00:37:32 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (validate_integer_pack_format): Renamed from
	  validate_integer_format.
	  (integer_pack_loop_setup): Renamed from integer_format_loop_setup.
	  (integer_pack_fill_dd): Renamed from int_export_fill_dd.
	  (integer_pack_take_lowbits): Renamed from int_export_take_lowbits.
	  (integer_unpack_push_bits): Renamed from int_import_push_bits.

Fri Jun  7 23:58:06 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_integer_pack): Arguments changed.  Use flags to
	  specify word order and byte order.
	  (rb_integer_unpack): Ditto.
	  (validate_integer_format): Follow the above change.
	  (integer_format_loop_setup): Ditto.

	* pack.c: Ditto.

	* internal.h: Ditto.
	  (INTEGER_PACK_MSWORD_FIRST): Defined.
	  (INTEGER_PACK_LSWORD_FIRST): Ditto.
	  (INTEGER_PACK_MSBYTE_FIRST): Ditto.
	  (INTEGER_PACK_LSBYTE_FIRST): Ditto.
	  (INTEGER_PACK_NATIVE_BYTE_ORDER): Ditto.
	  (INTEGER_PACK_LITTLE_ENDIAN): Ditto.
	  (INTEGER_PACK_BIG_ENDIAN): Ditto.

Fri Jun  7 22:10:50 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* lib/rubygems/specification.rb (Gem::Specification#to_yaml):
	  use Gem::NoAliasYAMLTree.create instead of Gem::NoAliasYAMLTree.new
	  to suppress deprecated warnings.

Fri Jun  7 21:39:39 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_integer_pack): Renamed from rb_int_export.
	  (rb_integer_unpack): Renamed from rb_int_import.

	* internal.h, pack.c: Follow the above change.

Fri Jun  7 21:05:26 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (integer_format_loop_setup): Extracted from rb_int_export
	  and rb_int_import.

Fri Jun  7 19:48:38 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (validate_integer_format): Extracted from rb_int_export and
	  rb_int_import.

Fri Jun  7 19:23:15 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_absint_size): Use numberof.
	  (rb_int_export): Ditto.

Fri Jun  7 18:58:56 2013  Tanaka Akira  <akr@fsij.org>

	* internal.h (numberof): Gathered from various files.

	* array.c, math.c, thread_pthread.c, iseq.c, enum.c, string.c, io.c,
	  load.c, compile.c, struct.c, eval.c, gc.c, parse.y, process.c,
	  error.c, ruby.c: Remove the definitions of numberof.

Fri Jun  7 18:24:39 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_absint_size): Declare a variable, i, just before used
	  to suppress a warning.
	  (rb_int_export): Ditto.

Fri Jun  7 17:41:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* bignum.c (rb_absint_size): explicit cast to BDIGIT to avoid implicit
	  64 bit to 32 bit shortening warning
	* bignum.c (rb_int_export): ditto
	* bignum.c (int_import_push_bits): ditto

Fri Jun  7 17:31:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* internal.h (RCLASS_SUPER): use descriptive variable name
	* internal.h (RCLASS_SET_SUPER): ditto

Fri Jun  7 13:25:27 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/json/fbuffer/fbuffer.h (fbuffer_append_str): change the place of
	  RB_GC_GUARD. it should be after the object is used.

Fri Jun  7 13:22:43 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* gc.c (before_gc_sweep): noinline can also avoid the segv instead of
	  -O0 of r41084. this way is expected less slow.

Fri Jun  7 11:45:42 2013  Kenta Murata  <mrkn@cookpad.com>

	* rational.c (numeric_quo): move num_quo in numeric.c to numeric_quo
	  in rational.c to refer canonicalization state for mathn support.
	  [ruby-core:41575] [Bug #5736]

	* numeric.c (num_quo): ditto.

	* test/test_mathn.rb: add a test for the change at r41109.

Fri Jun  7 11:41:42 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: revert r41106.  size_t may not be unsigned

	* bignum.c (rb_absint_size_in_word, rb_int_export, rb_int_import): use
	  NUM2SIZET() and SIZET2NUM() already defined in ruby/ruby.h.

Fri Jun  7 11:28:37 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c: use oldgen bitmap as initial mark bitmap when major gc.
	  so can skip oldgen bitmap check around mark & sweep.
	* gc.c (slot_sweep_body): change scan algorithm for performance:
	  from object's pointer base to bitmap one.

Fri Jun  7 11:25:56 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c: introduce oldgen bitmap for preparing performance tuning.

Fri Jun  7 11:20:57 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (MARKED_IN_BITMAP, MARK_IN_BITMAP, CLEAR_IN_BITMAP): bring
	  bitmap macros in one place, and introduce BITMAP_BIT.

Fri Jun  7 11:18:35 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* array.c (ary_new): change order of allocation in order
	  to remove FL_OLDGEN operation.

Fri Jun  7 11:16:28 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* tool/rdocbench.rb: add gc total time information.

Fri Jun  7 10:12:01 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: remove "Sunny" terminology.
	  "Sunny" doesn't mean antonym of "Shady" (questionable, doubtful, etc).
	  Instead of "Sunny", use "non-shady" or "normal".

Fri Jun  7 09:29:33 2013  Kenta Murata  <mrkn@cookpad.com>

	* bignum.c (rb_int_import): explicitly casting BDIGIT_DBL to BDIGIT
	  to prevent warning.

Fri Jun  7 07:29:33 2013  Tanaka Akira  <akr@fsij.org>

	* internal.h (rb_int_export): countp argument is split into
	  wordcount_allocated and wordcount.

	* bignum.c (rb_int_export): Follow the above change.

	* pack.c (pack_pack): Ditto.

Fri Jun  7 07:17:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* NEWS: describe a compatibility issue of Numeric#quo
	  introduced at r41109.

Fri Jun  7 07:15:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* NEWS: fix style.

Fri Jun  7 06:48:17 2013  Benoit Daloze  <eregontp@gmail.com>

	* numeric.c: remove unused ID id_to_r introduced in r41109.

Fri Jun  7 06:15:31 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_int_import): New function.
	  (int_import_push_bits): Ditto.

	* internal.h (rb_int_import): Declared.

	* pack.c (pack_unpack): Use rb_int_import for BER compressed integer.

Thu Jun  6 22:24:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* numeric.c (num_quo): Use to_r method to convert the receiver to
	  rational.  [ruby-core:41575] [Bug #5736]

	* test/ruby/test_numeric.rb: add a test for the above change.

Thu Jun  6 20:40:17 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: Invoke RUBY_REPLACE_TYPE for size_t.
	  Don't invoke RUBY_CHECK_PRINTF_PREFIX for size_t to avoid conflict
	  with RUBY_REPLACE_TYPE.

	* internal.h (rb_absint_size): Declared.
	  (rb_absint_size_in_word): Ditto.
	  (rb_int_export): Ditto.

	* bignum.c (rb_absint_size): New function.
	  (rb_absint_size_in_word): Ditto.
	  (int_export_fill_dd): Ditto.
	  (int_export_take_lowbits): Ditto.
	  (rb_int_export): Ditto.

	* pack.c (pack_pack): Use rb_int_export for BER compressed integer.

Thu Jun  6 19:31:33 2013  Tadayoshi Funaba  <tadf@dotrb.org>

	* ext/date/date_core.c: fixed coding error [ruby-core:55337].
	  reported by Riley Lynch.

Thu Jun  6 14:16:37 2013  Narihiro Nakamura  <authornari@gmail.com>

	* ext/objspace/object_tracing.c: rename allocation_info to
	  lookup_allocation_info. At times I confused "struct
	  allocation_info" with "function allocation_info".

Thu Jun  6 13:57:06 2013  Narihiro Nakamura  <authornari@gmail.com>

	* ext/objspace/object_tracing.c: allocation_info function isn't
	  called by any other file.

Thu Jun  6 09:41:00 2013  Kenta Murata  <mrkn@cookpad.com>

	* numeric.c (num_quo): should return a Float for a Float argument.
	  [ruby-dev:44710] [Bug #5515]

	* test/ruby/test_fixnum.rb: Add an assertion for the above change.

	* test/ruby/test_bignum.rb: ditto.

Thu Jun  6 00:59:44 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (gc_mark): get rid of pushing useless objects.
	* gc.c (rgengc_rememberset_mark): bypass gc_mark() in order to push
	  sunny old object at minor gc.
	* gc.c (gc_mark_children): move sunny old check to gc_mark().
	* gc.c (rgengc_check_shady): remove DEMOTE that already unnecessary.
	* gc.c (rb_gc_writebarrier): ditto.

	  change sunny old check point in order to save mark stack and
	  remove unnatural rest_sweep & demote.

Thu Jun  6 00:52:42 2013  Masaya Tarui  <tarui@ruby-lang.org>

	* gc.c (rgengc_rememberset_mark): change scan algorithm for performance:
	  from object's pointer base to bitmap one.

Thu Jun  6 00:30:04 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* win32/win32.c (NET_LUID): define it on MinGW32.
	  mingw-w64 has NET_LUID but mingw32 (mingw.org) still doesn't have
	  NET_LUID. reported by taco on IRC

Thu Jun  6 00:05:08 2013  Akinori MUSHA  <knu@iDaemons.org>

	* string.c (String#b): Allow code range scan to happen later so
	  ascii_only? on a result string returns the correct value.
	  [ruby-core:55315] [Bug #8496]

Wed Jun  5 22:40:42 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (capability_response): should ignore trailing
	  spaces.  Thanks, Peter Kovacs.  [ruby-core:55024] [Bug #8415]

	* test/net/imap/test_imap_response_parser.rb: related test.

Wed Jun  5 21:17:08 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (big_fdiv): Use nlz() instead of bdigbitsize().
	  (bdigbitsize): Removed.

Wed Jun  5 20:32:00 2013  Kenta Murata  <mrkn@cookpad.com>

	* include/ruby/ruby.h: fix alignment in comment.

Wed Jun  5 20:05:29 2013  Tanaka Akira  <akr@fsij.org>

	* random.c (int_pair_to_real_inclusive): Add a cast to BDIGIT.
	  (random_load): Fix shift width for fixnums.
	  Re-implement bignum extraction without ifdefs.

Wed Jun  5 15:26:10 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* gc.c (before_gc_sweep): don't optimize it to avoid segv on Ubuntu
	  10.04 gcc 4.4.
	  http://u32.rubyci.org/~chkbuild/ruby-trunk/log/20130527T190301Z.diff.html.gz

Wed Jun  5 09:46:46 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* test/fileutils/test_fileutils.rb (TestFileUtils#test_mkdir): add
	  EACCES for Windows.

Wed Jun  5 08:13:37 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_big_pow): Don't need to multiply SIZEOF_BDIGITS.
	  Use nlz instead of bitlength_bdigit.
	  (bitlength_bdigit): Removed.

Wed Jun  5 07:14:18 2013  Tadayoshi Funaba  <tadf@dotrb.org>

	* ext/date/date_core.c (d_lite_cmp, d_lite_equal): simplified.

Wed Jun  5 07:07:01 2013  Tadayoshi Funaba  <tadf@dotrb.org>

	* ext/date/date_core.c: fixed a bug [ruby-core:55295].  reported
	  by Riley Lynch.

Wed Jun  5 06:44:08 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems:  Update to RubyGems 2.0.3

	* test/rubygems:  Tests for the above.

	* NEWS:  Added RubyGems 2.0.3 note.

Wed Jun  5 06:35:15 2013  Eric Hodel  <drbrain@segment7.net>

	* doc/marshal.rdoc:  Add description of Marshal format.

Wed Jun  5 01:16:09 2013  Benoit Daloze  <eregontp@gmail.com>

	* array.c (Array#+): fix documentation example.
	  Patch by Logan Serman. [Fixes GH-324]

Wed Jun  5 00:21:54 2013  Ayumu AIZAWA  <ayumu.aizawa@gmail.com>

	* lib/irb/lc/ja/help-message: update help messages.
	  following r41028. [ruby-dev:46707] [Feature #7510]

Wed Jun  5 00:09:32 2013  Tanaka Akira  <akr@fsij.org>

	* marshal.c (r_object0): Generalize a round up expression.
	  Use BDIGIT instead of int.

Tue Jun  4 23:44:02 2013  Ayumu AIZAWA  <ayumu.aizawa@gmail.com>

	* object.c (rb_Hash): fix docs. patched by Stefan Sch"ussler.
	  [ruby-core:55299] [Bug #8487]

Tue Jun  4 23:16:49 2013  Benoit Daloze  <eregontp@gmail.com>

	* lib/irb/completion.rb: Use %w literal construction for long lists.
	  Patch by Dave Goodchild. [Fixes GH-299]

Tue Jun  4 23:08:42 2013  Benoit Daloze  <eregontp@gmail.com>

	* ext/objspace/objspace.c: improve wording and remove duplicated comment.
	  Based on a patch by Dave Goodchild. [Fixes GH-299]

Tue Jun  4 18:41:47 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bitlength_bdigit): Fix an off-by-one error.

Tue Jun  4 15:30:00 2013  Kenta Murata  <mrkn@cookpad.com>

	* ext/bigdecimal/lib/bigdecimal/util.rb (Float#to_d): fix the number
	  of figures.  Patch by Vipul A M <vipulnsward@gmail.com>.
	  https://github.com/ruby/ruby/pull/323  fix GH-323

	* test/bigdecimal/test_bigdecimal_util.rb: fix for the above change.

Tue Jun  4 00:44:27 2013  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* test/fileutils/test_fileutils.rb (TestFileUtils#test_mkdir): add
	  EEXIST for Linux. (suggested by nurse)

Mon Jun  3 23:58:19 2013  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* lib/fileutils.rb (FileUtils.rmdir): use remove_tailing_slash.
	* test/fileutils/test_fileutils.rb: test for above.

Mon Jun  3 23:47:55 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (bitlength_bdigit): New function.
	  (rb_big_pow): Use bitlength_bdigit instead of ffs.

Mon Jun  3 23:11:19 2013  Ayumu AIZAWA  <ayumu.aizawa@gmail.com>

	* lib/fileutils.rb: fix behavior when mkdir/mkdir_p accepted "/".
	* test/fileutils/test_fileutils.rb: add test for above change.
	  Patched by Mitsunori Komatsu. [GH-319]

Mon Jun  3 19:02:20 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (is_hfs): use the file descriptor instead of a path.

Mon Jun  3 07:15:17 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* configure.in: removes AC_CHECK_FUNCS(readdir_r). readdir_r()
	  is only used from dir.c and it doesn't need readdir_r().
	* configure.in (SIZEOF_STRUCT_DIRENT_TOO_SMALL): removed. It is
	  only used for readdir_r.
	* dir.c: removes NAME_MAX_FOR_STRUCT_DIRENT. It is not right way
	  to detect maximum length of path len. POSIX require to use
	  fpathconf(). IOW, it might have lead to make a vulnerability
	  using stack smashing. Moreover, readdir() works enough for our
	  usage.
	* dir.c (READDIR): removes an implementation which uses
	  readdir_r() and parenthesize in a macro body correctly.
	* dir.c (dir_read): removes IF_HAVE_READDIR_R(DEFINE_STRUCT_DIRENT
	  entry), it is used only for readdir_r().
	* dir.c (dir_each): ditto.
	* dir.c (glob_helper): ditto.

	* dir.c (READDIR): removes entry and dp argument.
	* dir.c (dir_read): adjust for the above change.
	* dir.c (dir_each): ditto.
	* dir.c (glob_helper): ditto.

Mon Jun  3 03:40:29 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* vm_insnhelper.c (vm_yield_setup_block_args): partially revert r41019.
	  The code is not useless.

Mon Jun  3 01:25:25 2013  Ayumu AIZAWA  <ayumu.aizawa@gmail.com>

	* test/socket/test_sockopt.rb: change test name. follow r41037.

Mon Jun  3 01:08:43 2013  Ayumu AIZAWA  <ayumu.aizawa@gmail.com>

	* test/rinda/test_rinda.rb: rename functions introduced in r41009.

Sun Jun  2 23:33:42 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* enc/trans/japanese_euc.trans, test/ruby/test_transcode.rb,
	  tool/transcode-tblgen.rb: change EUC-JP-2004 to EUC-JIS-2004.
	  This is follow up to changes in r41024.

Sun Jun  2 22:44:42 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/socket/option.c: rename functions introduced in r41009
	  s/ip/ipv4/g because they are ipv4 functions.
	  (there's a policy that the name "ip" is for methods which supports
	   both ipv4 and ipv6)

Sun Jun  2 16:15:29 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dln_find.c (dln_find_exe, dln_find_file): remove deprecated
	  non-reentrant functions.

Sun Jun  2 15:04:35 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/cgi/util.rb, lib/erb.rb: Use String#b [Feature #8394] by znz

Sun Jun  2 14:10:21 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/irb/lc/help-message: Apply english updates for irb --help #7510

Sun Jun  2 12:03:58 2013  Zachary Scott  <zachary@zacharyscott.net>

	* range.c: Fix rdoc on Range#bsearch [Bug #8242] [ruby-core:54143]

Sun Jun  2 02:08:37 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* enc/euc_jp.c: fix typo: the name of EUC-JIS-2004.

Sat Jun  1 23:17:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* vm_eval.c (rb_mod_module_eval): mention in docs that arguments passed
	  to the method are passed to the block

Sat Jun  1 17:58:13 2013  Akinori MUSHA  <knu@iDaemons.org>

	* lib/set.rb (Set#freeze, taint, untaint): Save a "self" by
	  utilizing super returning self, and add tests while at it.

Sat Jun  1 17:24:47 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* compile.c (iseq_set_arguments): not a simple single argument if any
	  keyword arguments exist.  [ruby-core:55203] [Bug #8463]

	* vm_insnhelper.c (vm_yield_setup_block_args): split single parameter
	  if any keyword arguments exist, and then extract keyword arguments.
	  [ruby-core:55203] [Bug #8463]

Sat Jun  1 11:16:22 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* error.c (rb_exc_new_cstr): rename from rb_exc_new2.

	* error.c (rb_exc_new_str): rename from rb_exc_new3.

Sat Jun  1 10:13:17 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_new[2-5], rb_{tainted,usascii}_str_new2),
	  (rb_str_buf_new2): remove old interfaces.

Sat Jun  1 08:00:46 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/zlib/zlib.c (gzfile_read, gzfile_read_all, gzfile_getc),
	  (gzreader_gets): check EOF.  [ruby-core:55220] [Bug #8467]

Sat Jun  1 07:32:15 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c: Use BDIGIT type for hbase.

Sat Jun  1 02:37:35 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/socket/option.c (sockopt_s_byte): constructor of the sockopt
	  whose value's is byte.

	* ext/socket/option.c (sockopt_byte): getter for above.

	* ext/socket/option.c (inspect_byte): inspect for above.

	* ext/socket/option.c (sockopt_s_ip_multicast_loop): constructor of
	  the sockopt whose optname is IP_MULTICAST_LOOP.

	* ext/socket/option.c (sockopt_ip_multicast_loop): getter for above.

	* ext/socket/option.c (sockopt_s_ip_multicast_ttl): constructor of
	  the sockopt whose optname is IP_MULTICAST_TTL.

	* ext/socket/option.c (sockopt_ip_multicast_ttl): getter for above.

	* ext/socket/option.c (sockopt_inspect): use above.

Sat Jun 01 01:50:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (BigDecimal_power): use rb_dbl2big
	  to convert a double value to a Bignum.

Sat Jun  1 00:19:50 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (calc_hbase): Make hbase the maximum power of base
	  representable in BDIGIT.

Fri May 31 23:56:13 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (calc_hbase): Extracted from rb_big2str0.

Fri May 31 23:22:24 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c: Don't hard code SIZEOF_BDIGITS for log_base(hbase).
	  (big2str_orig): hbase_numdigits argument added.
	  (big2str_karatsuba): Ditto.
	  (rb_big2str0): Calculate hbase_numdigits.

Fri May 31 17:57:21 2013  Zachary Scott  <zachary@zacharyscott.net>

	* process.c: Improve Process::exec documentation

Fri May 31 17:26:42 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_eval.c (rb_funcallv): add better names of rb_funcall2.

	* vm_eval.c (rb_funcallv_public): ditto for rb_funcall3.

Fri May 31 17:04:45 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* array.c (rb_ary_new_capa): add better names of rb_ary_new2.

	* array.c (rb_ary_new_from_args): ditto for rb_ary_new3.

	* array.c (rb_ary_new_from_values): ditto for rb_ary_new4.

Fri May 31 16:35:44 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (HAVE_ATTRIBUTE_FUNCTION_ALIAS): define to tell if
	  alias attribute is available.

Fri May 31 16:03:23 2013  Zachary Scott  <zachary@zacharyscott.net>

	* object.c, proc.c: s/call_seq/call-seq in rdoc. [Fixes GH-322]

Fri May 31 15:56:36 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/openssl/ossl_ssl.c: Add missing paren in rdoc [Fixes GH-321]

Fri May 31 11:58:24 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_method.c (set_visibility): extract from rb_mod_public(),
	  rb_mod_protected() and rb_mod_private().

Thu May 30 19:47:42 2013  Yusuke Endoh  <mame@tsg.ne.jp>

	* vm_insnhelper.c (vm_callee_setup_keyword_arg,
	  vm_callee_setup_arg_complex): consider a hash argument for keyword
	  only when the number of arguments is more than the expected
	  mandatory parameters.  [ruby-core:53199] [ruby-trunk - Bug #8040]

	* test/ruby/test_keyword.rb: update a test for above.

Thu May 30 17:55:04 2013  Zachary Scott  <zachary@zacharyscott.net>

	* process.c: RDoc on Process.spawn

Thu May 30 00:08:14 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_profile_enable): rest_sweep() to finish last GC.
	  Profiling record is allocated at first of marking phase.
	  Enable at lazy sweeping may cause an error (SEGV).

Wed May 29 10:33:27 2013  Koichi Sasada  <ko1@atdot.net>

	* hash.c: fix WB bug.
	  (1) Hash's key also needs WB.
	  (2) callback parameter *key and *value of st_update() is not a
	      storage of st_table itself (only local variable). So that
	      OBJ_WRITE() is not suitable, especially for `!existing'.
	      OBJ_WRITTEN() is used instead of OBJ_WRITE().

Tue May 28 12:31:21 2013  Koichi Sasada  <ko1@atdot.net>

	* ext/objspace/object_tracing.c: fix a bug reported at
	  "[ruby-core:55182] [ruby-trunk - Bug #8456][Open] Sugfault in Ruby Head"
	  Care about the case TracePoint#path #=> `nil'.

	* ext/objspace/object_tracing.c: add two new methods:
	  * ObjectSpace.allocation_class_path(o)
	  * ObjectSpace.allocation_method_id(o)
	  They are not useful for Object.new because they are always
	  "Class" and :new.
	  To trace more useful information, we need to maintain call-tree
	  using call/return hooks, which is implemented by
	  ll-prof <http://sunagae.net/wiki/doku.php?id=software:llprof>

	* test/objspace/test_objspace.rb: add a test.

Tue May 28 11:30:02 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb (extmake): leave makefiles untouched if the content is
	  not changed, to get rid of unnecessary re-linking.

Tue May 28 03:11:02 2013  Koichi Sasada  <ko1@atdot.net>

	* ext/objspace/gc_hook.c, ext/objspace/objspace.c: add new methods to
	  hook GC invocation.
	  * ObjectSpace.after_gc_start_hook=(proc)
	  * ObjectSpace.after_gc_end_hook=(proc)

	  Note that hooks are not kicked immediately. Procs are kicked
	  at postponed_job.

	  This feature is a sample of new internal event and
	  rb_postponed_job API.

Tue May 28 02:56:15 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_stat): remove wrong rest_sweep().

Tue May 28 02:44:23 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (garbage_collect_body): fix GC_ENABLE_LAZY_SWEEP condition.

	* gc.c (GC_NOTIFY): move debug print location and use stderr instead
	  of stdout.

Tue May 28 02:07:21 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_trace.c (rb_postponed_job_register_one): fix iteration bug.

	* ext/-test-/postponed_job/postponed_job.c,
	  test/-ext-/postponed_job/test_postponed_job.rb: add a test.

Tue May 28 00:34:23 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h, gc.c: add new internal event
	  RUBY_INTERNAL_EVENT_GC_END. This event invokes at the end of
	  after_sweep().
	  Time chart with lazy sweep is:
	    (1) Kick RUBY_INTERNAL_EVENT_GC_START
	    (2) [gc_marks()]
	    (3) [lazy_sweep()]
	    (4) [... run Ruby program (mutator) with lazy_sweep() ...]
	    (5) [after_sweep()]
	    (6) Kick RUBY_INTERNAL_EVENT_GC_END
	    (7) [... run Ruby program (mutator), and go to (1) ...]
	  Time chart without lazy sweep (GC.start, etc) is:
	    (1) Kick RUBY_INTERNAL_EVENT_GC_START
	    (2) [gc_marks()]
	    (3) [gc_sweep()]
	    (4) [after_sweep()]
	    (5) Kick RUBY_INTERNAL_EVENT_GC_END
	    (6) [... run Ruby program (mutator), and go to (1) ...]

	* ext/-test-/tracepoint/tracepoint.c,
	  test/-ext-/tracepoint/test_tracepoint.rb: modify a test.

Tue May 28 00:18:57 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_trace.c (rb_postponed_job_flush): remove a wrong comment.

Mon May 27 22:09:33 2013  Tanaka Akira  <akr@fsij.org>

	* include/ruby/ruby.h (RHASH_SIZE): Add a cast to suppress a
	  warning, comparison between signed and unsigned integer
	  expressions [-Wsign-compare], on ILP32.

Mon May 27 19:25:47 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: rename RUBY_INTERNAL_EVENT_FREE to
	  RUBY_INTERNAL_EVENT_FREEOBJ.

	* ext/-test-/tracepoint/tracepoint.c,
	  ext/objspace/object_tracing.c,
	  gc.c, vm_trace.c: catch up this change.

Mon May 27 18:57:28 2013  Koichi Sasada  <ko1@atdot.net>

	* ext/objspace/objspace.c: support ObjectSpace.trace_object_allocations.
	  Read the following test to know HOWTO.
	  This feature is a sample of RUBY_INTERNAL_EVENT.

	* test/objspace/test_objspace.rb: add a test.

	* ext/objspace/object_tracing.c: ditto.

	* gc.c (rb_gc_count): add. This function returns GC count.

	* internal.h: add decl. of rb_gc_count(). Same as `GC.count'.

Mon May 27 17:33:28 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* tool/rbinstall.rb (install_recursive): add maxdepth option.

	* tool/rbinstall.rb (bin-comm): limit depth of bindir and reject empty
	  files.  [ruby-core:55101] [Bug #8432]

Mon May 27 16:16:18 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_trace.c (rb_postponed_job_flush, rb_postponed_job_register): use
	  ruby_xmalloc/xfree. It is safe during GC.

Mon May 27 09:24:03 2013  Koichi Sasada  <ko1@atdot.net>

	* test/-ext-/postponed_job/test_postponed_job.rb: fix typo and class name.

Mon May 27 09:05:17 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h, gc.c, vm_trace.c: add internal events.
	  * RUBY_INTERNAL_EVENT_NEWOBJ: object created.
	  * RUBY_INTERNAL_EVENT_FREE: object freed.
	  * RUBY_INTERNAL_EVENT_GC_START: GC started.
	  And rename `RUBY_EVENT_SWITCH' to `RUBY_INTERNAL_EVENT_SWITCH'.

	  Internal events can not invoke any Ruby program because the tracing
	  timing may be critical (under huge restriction).
	  These events can be hooked only by C-extensions.
	  We recommend to use rb_postponed_job_register() API to call Ruby
	  program safely.

	  This change is mostly written by Aman Gupta (tmm1).
	  https://bugs.ruby-lang.org/issues/8107#note-12
	  [Feature #8107]

	* include/ruby/debug.h, vm_trace.c: added two new APIs.
	  * rb_tracearg_event_flag() returns rb_event_flag_t of this event.
	  * rb_tracearg_object() returns created/freed object.

	* ext/-test-/tracepoint/extconf.rb,
	  ext/-test-/tracepoint/tracepoint.c,
	  test/-ext-/tracepoint/test_tracepoint.rb: add a test.

Mon May 27 08:38:21 2013  Koichi Sasada  <ko1@atdot.net>

	* ext/-test-/postponed_job/postponed_job.c: fix `init' function name.

Mon May 27 06:22:41 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/debug.h, vm_trace.c: add rb_postponed_job API.
	  Postponed jobs are registered with this API. Registered jobs
	  are invoked at `ruby-running-safe-point' as soon as possible.
	  This timing is completely same as finalizer timing.

	  There are two APIs:
	  * rb_postponed_job_register(flags, func, data): register a
	    postponed job with data. flags are reserved.
	  * rb_postponed_job_register_one(flags, func, data): same as
	    `rb_postponed_job_register', but only one `func' job is
	    registered (skip if `func' is already registered).

	  This change is mostly written by Aman Gupta (tmm1).
	  https://bugs.ruby-lang.org/issues/8107#note-15
	  [Feature #8107]

	* gc.c: use postponed job API for finalizer.

	* common.mk: add dependency from vm_trace.c to debug.h.

	* ext/-test-/postponed_job/extconf.rb, postponed_job.c,
	  test/-ext-/postponed_job/test_postponed_job.rb: add a test.

	* thread.c: implement postponed API.

	* vm_core.h: ditto.

Mon May 27 02:26:02 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_stat): collect promote_operation_count and
	  types (RGENGC_PROFILE >= 2).

Mon May 27 01:40:58 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_stat): collect shade_operation_count,
	  remembered_sunny_object_count and remembered_shady_object_count
	  for each types when RGENGC_PROFILE >= 2.
	  They are informative for optimization.

Mon May 27 01:15:22 2013  Koichi Sasada  <ko1@atdot.net>

	* hash.c (rb_hash_tbl_raw), internal.h: added.
	  Returns st_table without shading hash.

	* array.c: use rb_hash_tbl_raw() for read-only purpose.

	* compile.c (iseq_compile_each): ditto.

	* gc.c (count_objects): ditto.

	* insns.def: ditto.

	* process.c: ditto.

	* thread.c (clear_coverage): ditto.

	* vm_insnhelper.c: ditto.

Mon May 27 00:31:09 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* tool/make-snapshot: use ENV["AUTOCONF"] instead of directly using
	  literal "autoconf".

Sun May 26 21:31:46 2013  Koichi Sasada  <ko1@atdot.net>

	* hash.c, include/ruby/ruby.h: support WB protected hash.
	  * constify RHash::ifnone and make new macro RHASH_SET_IFNONE().
	  * insert write barrier for st_update().

	* include/ruby/intern.h: declare rb_hash_set_ifnone(hash, ifnone).

	* marshal.c (r_object0): use RHASH_SET_IFNONE().

	* ext/openssl/ossl_x509name.c (Init_ossl_x509name): ditto.

Sat May 25 23:22:38 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* test/fiddle/test_c_struct_entry.rb,
	  test/fiddle/test_c_union_entity.rb,
	  test/fiddle/test_cparser.rb, test/fiddle/test_func.rb,
	  test/fiddle/test_handle.rb, test/fiddle/test_import.rb,
	  test/fiddle/test_pointer.rb: don't run test if the system
	  don't support fiddle.

Sat May 25 21:29:34 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/pty/pty.c (get_device_once): FreeBSD 10-current and 9-stable
	  added O_CLOEXEC support to posix_openpt, so assume FreeBSD 9.2 or
	  later supports it.
	  http://www.freebsd.org/cgi/query-pr.cgi?pr=162374

Sat May 25 18:46:23 2013  Yusuke Endoh  <mame@tsg.ne.jp>

	* proc.c (rb_method_entry_min_max_arity): fix missing break in switch.
	  This was introduced in r38236, which is not intentional apparently.
	  This has caused no actual harm because VM_METHOD_TYPE_OPTIMIZED is
	  not used except for OPTIMIZED_METHOD_TYPE_SEND, but may do in
	  future.  Coverity Scan found this inadequacy.

Sat May 25 18:08:06 2013  Yusuke Endoh  <mame@tsg.ne.jp>

	* dir.c (bracket): fix copy-paste error.  When the first and last
	  characters of fnmatch range have different length, fnmatch may
	  have wrongly matched a path that does not really match.
	  Coverity Scan found this bug.

Sat May 25 17:06:25 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (after_gc_sweep): reduce full GC timing.

Sat May 25 11:28:49 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* variable.c (set_const_visibility): return without clearing method
	  cache if no arguments.

	* vm_method.c (set_method_visibility): ditto.

Sat May 25 11:27:32 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_method.c (set_method_visibility): quote unprintable method name.

Sat May 25 11:24:24 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval.c (rb_frame_callee): returns the called name of the current
	  frame, not the previous frame.

	* eval.c (prev_frame_callee, prev_frame_func): rename and make static,
	  as these are used by rb_f_method_name() and rb_f_callee_name() only.

	* variable.c (set_const_visibility): use the called name.

Sat May 25 08:58:23 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_quote_unprintable): check if argument is a string.

Fri May 24 19:32:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* variable.c (set_const_visibility): use rb_frame_this_func() instead
	  of rb_frame_callee() for getting the name of the called method

	* test/ruby/test_module.rb: add test for private_constant with no args

Fri May 24 18:53:10 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: do major/full GC when:
	  * number of oldgen object is bigger than twice of
	    number of oldgen object at last full GC.
	  * number of remembered shady object is bigger than twice of
	    number of remembered shady object at last full GC.
	  * number of oldgen object and remembered shady object is bigger
	    than half of total object space.
	  (please fix my English!)

Fri May 24 17:07:00 2013  Charlie Somerville  <charliesome@ruby-lang.org>

	* intern.h: remove dangling rb_class_init_copy declaration
	  [ruby-core:55120] [Bug #8434]

Fri May 24 16:31:23 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/strscan/strscan.c (strscan_aref): raise error if given
	  name reference is not found.

Fri May 24 15:48:18 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (after_gc_sweep, garbage_collect_body): do major GC (full GC)
	  before extending heaps.
	  TODO: do major GC when there are many old (promoted) objects.

	* gc.c (after_gc_sweep): remove TODO comments.

Fri May 24 11:04:00 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (LIBRUBY_RPATHFLAGS): do not append -L option with
	  runtime library directory if cross compiling, but only -R option.
	  runtime path makes no sense on the host system.  [ruby-dev:47363]
	  [Bug #8443]

Fri May 24 02:57:17 2013  Koichi Sasada  <ko1@atdot.net>

	* object.c (rb_obj_clone): should not propagate OLDGEN status.
	  This propagation had caused WB miss for class.

Thu May 23 17:35:30 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* load.c (loaded_feature_path): fix invalid read by index underflow.
	  the beginning of name is also a boundary as well as just after '/'.

Thu May 23 17:21:22 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (gc_profile_dump_on): revert r40898.  ok to show the record
	  accumulating while lazy_sweep().

Wed May 22 16:50:18 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (gc_profile_dump_on): use size_t to get rid of overflow and
	  show the header when next_index > 0, instead of next_index != 1.

Wed May 22 15:18:59 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (setup_overlapped): check the error code in addition
	  to the result of SetFilePointer() to determine if an error occurred,
	  because INVALID_SET_FILE_POINTER is a valid value.
	  [ruby-core:55098] [Bug #8431]

	* win32/win32.c (setup_overlapped, finish_overlapped): extract from
	  rb_w32_read() and rb_w32_write().

Wed May 22 14:19:56 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_prepare_free_objects, rest_sweep, lazy_sweep): fix position
	  of `during_gc' setting.

Wed May 22 07:36:08 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (garbage_collect): all GC is start from garbage_collect()
	  (or garbage_collect_body()). `garbage_collect()' accept additional
	  two parameters `full_mark' and `immediate_sweep'.
	  If `full_mark' is TRUE, then force it full gc (major gc), otherwise,
	  it depends on status of object space. Now, it will be minor gc.
	  If `immediate_sweep' is TRUE, then disable lazy sweep.
	  To allocate free memory, `full_mark' and `immediate_sweep' should be
	  TRUE. Otherwise, they should be FALSE.

	* gc.c (gc_prepare_free_objects): use `garbage_collect_body()'.

	* gc.c (slot_sweep, before_gc_sweep, after_gc_sweep): add logging code.

Tue May 21 22:47:06 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/strscan/strscan.c (strscan_aref): support named captures.
	  patched by Konstantin Haase [ruby-core:54664] [Feature #8343]

Tue May 21 21:48:44 2013  Kouhei Sutou  <kou@cozmixng.org>

	* test/ruby/test_dir_m17n.rb (TestDir_M17N#test_entries_compose):
	  Use #each instead of #map just for iteration.

Tue May 21 19:57:22 2013  Akinori MUSHA  <knu@iDaemons.org>

	* ext/digest/lib/digest.rb (Digest::Class.file): Take optional
	  arguments that are passed to the constructor of the digest
	  class.

Tue May 21 17:21:12 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: remove gc_profile_record::is_marked. always true.

Tue May 21 17:13:40 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: fix to collect additional information for GC::Profiler.
	  * major/minor GC
	  * trigger reason of GC

	* gc.c (gc_profile_dump_on): change reporting format with
	  added information.

	* gc.c (gc_profile_record_get): return added information by
	  :GC_FLAGS => array.

Tue May 21 16:45:31 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: GC::Profiler's sweeping time is accumulated all slot
	  sweeping time. At lazy GC, GC::Profiler makes new record entry
	  for each lazy_sweep(). In this change, accumulating all
	  slot_sweep() time.
	  And change indentation.

Tue May 21 16:29:09 2013  Koichi Sasada  <ko1@atdot.net>

	* common.mk (rdoc-bench): add a benchmark rule
	  using RDoc. Generate all rdoc related files
	  (same as `make rdoc') in temporary directory
	  and remove them. Execution time, GC::Profiler
	  and results of GC.stat are printed.

	* tool/rdocbench.rb: added for `rdoc-bench'.

Tue May 21 16:25:05 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (gc_profile_dump_on): `count' should be (int) because it
	  can be negative number.
	  And use pointer for `record' (don't copy).

Tue May 21 03:11:18 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (dir_each): compose HFS file names from
	  UTF8-MAC. [ruby-core:48745] [Bug #7267]

Tue May 21 03:08:52 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/ruby/envutil.rb (assert_separately): require envutil in the
	  child process too.

Tue May 21 03:07:26 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_conv_enc_opts): should infect.

Mon May 20 22:24:45 2013  Akinori MUSHA  <knu@iDaemons.org>

	* lib/set.rb (Set#delete_if, Set#keep_if): Avoid blockless call of
	  proc, which is not portable to JRuby.  Replace &method() with
	  faster and simpler literal blocks while at it.

Mon May 20 22:00:31 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/e2mmap.rb: Format of E2MM documentation

Mon May 20 21:41:15 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/extmk.rb: nodoc this file

Mon May 20 20:43:32 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/cmath.rb: Remove duplicate RDoc heading from overview

Mon May 20 20:36:19 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/securerandom.rb: Update position of overview for RDoc

Mon May 20 19:33:55 2013  Benoit Daloze  <eregontp@gmail.com>

	* math.c: improve and fix documentation of sin, tan and log

Mon May 20 19:31:49 2013  Benoit Daloze  <eregontp@gmail.com>

	* lib/logger.rb (Logger::Application): show namespace in documentation

Mon May 20 11:50:12 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/pp.rb: Revert part of r40834 and nodoc PP::ObjectMixin
	  [ruby-core:55068]

Mon May 20 10:40:21 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/webrick/htmlutils.rb (WEBrick::HTMLUtils#escape): replace HTML
	  meta chars even in non-ascii string.  [Bug #8425] [ruby-core:55052]

	* lib/webrick/httputils.rb (WEBrick::HTTPUtils#{_escape,_unescape}):
	  fix %-escape encodings.  [Bug #8425] [ruby-core:55052]

	* lib/webrick/httpservlet/filehandler.rb (set_dir_list): revert r20152
	  partially and fix misuse of bytesize and regexp repetition operator.

Mon May 20 08:03:51 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/profiler.rb: Document Profiler__ methods

Mon May 20 08:02:13 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/tempfile.rb: nodoc Tempfile#inspect

Mon May 20 07:48:24 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/stringio/stringio.c: Correct position of method rdoc

Mon May 20 07:27:41 2013  Zachary Scott  <zachary@zacharyscott.net>

	* math.c: RDoc formatting of Math core docs with domains and codomains
	  Patch by @eLobato [Fixes GH-309]

Mon May 20 05:58:12 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/bigdecimal/bigdecimal.c: Formatting for BigMath [Fixes GH-306]
	  Based on a patch by @eLobato.
	* ext/bigdecimal/lib/bigdecimal/math.rb: ditto

Mon May 20 04:56:59 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/forwardable.rb: Forwardable examples in overview were broken
	  Based on patch by @joem [Fixes GH-303] [Bug #8392]

Mon May 20 03:35:26 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/optparse.rb: nodoc OptionParser::Version and SPLAT_PROC

Mon May 20 03:16:52 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/pp.rb: Document PP::ObjectMixin [Fixes GH-312]

Sun May 19 23:52:22 2013  Ayumu AIZAWA  <ayumu.aizawa@gmail.com>

	* test/webrick/test_htmlutils.rb: add test for WEBrick::HTMLUtils.

Sun May 19 23:12:07 2013  Ayumu AIZAWA  <ayumu.aizawa@gmail.com>

	* encoding.c: document fix, change default script encoding.
	  patched by @windwiny [Fixes GH-310]

Sun May 19 17:29:07 2013  Akinori MUSHA  <knu@iDaemons.org>

	* lib/set.rb (Set#delete_if, Set#keep_if): Add comments.

Sun May 19 11:37:36 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* ext/fiddle/extconf.rb: ignore rc version of libffi to fix build failure.

Sun May 19 10:38:50 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-electric.el (ruby-electric-delete-backward-char): Use
	  delete-char instead of delete-backward-char, which is an
	  interactive function.

Sun May 19 03:59:29 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* string.c (str_scrub0): added for refactoring.

Sun May 19 03:48:26 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* lib/uri/common.rb (URI.decode_www_form): scrub string if decoded
	  bytes are invalid for the encoding.

Sun May 19 02:46:32 2013  Akinori MUSHA  <knu@iDaemons.org>

	* lib/set.rb (Set#delete_if, Set#keep_if): Make Set#delete_if and
	  Set#keep_if more space and time efficient by avoiding to_a.

Sun May 19 02:33:09 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-electric.el (ruby-electric-setup-keymap): Make
	  backquotes electric as well.  It was listed in
	  ruby-electric-expand-delimiters-list but not activated.

	* misc/ruby-electric.el (ruby-electric-delete-backward-char):
	  Introduce electric DEL that deletes what the previous electric
	  command has input.

	* misc/ruby-electric.el (ruby-electric-matching-char): Make
	  electric quotes work again at the end of buffer.

Sun May 19 01:39:50 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (setjmp-type): check if setjmpex() is really available.
	  workaround for i686-w64-mingw32 which declares it but lacks its
	  definition.

	* include/ruby/defines.h: include setjmpex.h only if also setjmpex()
	  is available.

Sat May 18 23:57:46 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (setjmp-type): use setjmpex() on w64-mingw32 to get rid
	  of -Wclobbered warnings.

	* include/ruby/defines.h: include setjmpex.h here becase setjmp.h is
	  included from win32.h via intrin.h, winnt.h, and so on.

Sat May 18 20:28:12 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/mkconstants.rb (INTEGER2NUM): Make less comparisons.

Sat May 18 20:15:28 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* string.c (str_scrub_bang): add String#scrub!. [Feature #8414]

Sat May 18 16:59:52 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/mkconstants.rb (INTEGER2NUM): Renamed from INTEGER2VALUE.

Sat May 18 16:57:58 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/mkconstants.rb (INTEGER2VALUE): Suppress a warning:
	  comparison between signed and unsigned integer expressions

Sat May 18 16:38:39 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* compile.c (iseq_compile_each): forward anonymous and first keyword
	  rest argument one.  [ruby-core:55033] [Bug #8416].

Sat May 18 15:49:14 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_core.h (rb_vm_tag): move jmpbuf between tag and prev so ensure to
	  be accessible.

Sat May 18 11:05:14 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enumerator.c (inspect_enumerator): use VALUE instead of mere char*
	  by using rb_sprintf() and rb_id2str().

	* enumerator.c (append_method): extract from inspect_enumerator().

Sat May 18 09:00:32 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/mkconstants.rb (INTEGER2VALUE): Use LONG2FIX if possible.

Sat May 18 00:38:47 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/mkconstants.rb: Convert integer constants bigger than int
	  correctly.

Fri May 17 22:02:15 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/ifaddr.c: Use unsigned LONG_LONG to represent flags
	  because SunOS 5.11 (OpenIndiana) defines ifa_flags as uint64_t.

Fri May 17 21:47:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* cont.c: Typo in constant MAX_MACHINE_STACK_CACHE from '..MAHINE..'
	  patch by @schmurfy [Fixes GH-307]

Fri May 17 19:18:24 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-electric.el (ruby-electric-matching-char): Do not put
	  a closing quote when the quote typed does not start a string, as
	  in $', ?\' or ?\".

Fri May 17 18:06:15 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: Consider error messages to find out version option of
	  C compiler.
	  The C compiler of Sun Studio C emits "Warning: Option -qversion
	  passed to ld, if ld is invoked, ignored otherwise" and exit
	  successfully.

Fri May 17 17:34:48 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* gc.c (rb_gc_guarded_ptr): unoptimize on other compilers than gcc and
	  msvc.

Fri May 17 11:06:48 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* eval_intern.h (TH_PUSH_TAG): ensure jmpbuf to be accessible before
	  pushing tag to get rid of unaccessible tag by stack overflow.

Thu May 16 17:15:32 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* vm_eval.c (rb_catch_obj): add volatile to tag to prevent crash
	  experimentally.
	  http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20130515T133500Z.log.html.gz

Thu May 16 16:19:50 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/Makefile.sub (verconf.in): no longer used.

	* win32/Makefile.sub (config.status): fix typo.

	* configure.in, template/verconf.h.in (RUBY_EXEC_PREFIX): fix for
	  default prefix.

Thu May 16 13:12:27 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* template/verconf.h.in: generate verconf.h from the template and
	  rbconfig.rb.

Thu May 16 05:47:18 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych/visitors/yaml_tree.rb: fix syntax error.
	  Thanks @spastorino! [ruby-core:55011]

Thu May 16 03:05:45 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rb_node_newnode): use newobj_of() instead of rb_newobj().

Thu May 16 02:03:39 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/depend: Add a dependency for ifaddr.o.

Thu May 16 01:44:45 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (verconf.h): $< cannot be used in explicit rules with
	  nmake.

	* win32/Makefile.sub (CONFIG_H): create verconf.in instead of
	  verconf.h.

Thu May 16 01:25:07 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych/visitors/yaml_tree.rb: only emit warnings when
	  -w is enabled.

Wed May 15 18:58:17 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (newobj): rename to `newobj_of' and accept additional
	  three parameters v1, v2, v3. newobj_of() do OBJSETUP() and
	  fill values with v1, v2, v3.

	* gc.c (rb_data_object_alloc, rb_data_typed_object_alloc):
	  use newobj_of().

Wed May 15 17:55:49 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (RUBY_PLATFORM): move to config.h as needed by
	  version.c.

Wed May 15 17:04:11 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: add an additional RGENGC_PROFILE mode (2).
	  Profiling result can be check by GC.stat.

	* gc.c (type_name): separate from obj_type_name().

Wed May 15 16:58:24 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: save configured load path values into verconf.in.

	* common.mk (verconf.h): create from verconf.in with shvar_to_cpp.rb.

	* tool/shvar_to_cpp.rb: turn shell variables into C macros.
	  [Bug #7959]

	* loadpath.c: split load path staffs from version.c.

	* dmyloadpath.c: miniruby has no builtin load paths, so verconf.h is
	  not needed.

Wed May 15 03:56:09 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych/visitors/yaml_tree.rb: adding backwards
	  compatible YAMLTree.new method

Wed May 15 02:22:16 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych.rb: Adding Psych.safe_load for loading a user
	  defined, restricted subset of Ruby object types.
	* ext/psych/lib/psych/class_loader.rb: A class loader for
	  encapsulating the logic for which objects are allowed to be
	  deserialized.
	* ext/psych/lib/psych/deprecated.rb: Changes to use the class loader
	* ext/psych/lib/psych/exception.rb: ditto
	* ext/psych/lib/psych/json/stream.rb: ditto
	* ext/psych/lib/psych/nodes/node.rb: ditto
	* ext/psych/lib/psych/scalar_scanner.rb: ditto
	* ext/psych/lib/psych/stream.rb: ditto
	* ext/psych/lib/psych/streaming.rb: ditto
	* ext/psych/lib/psych/visitors/json_tree.rb: ditto
	* ext/psych/lib/psych/visitors/to_ruby.rb: ditto
	* ext/psych/lib/psych/visitors/yaml_tree.rb: ditto
	* ext/psych/psych_to_ruby.c: ditto
	* test/psych/helper.rb: ditto
	* test/psych/test_safe_load.rb: tests for restricted subset.
	* test/psych/test_scalar_scanner.rb: ditto
	* test/psych/visitors/test_to_ruby.rb: ditto
	* test/psych/visitors/test_yaml_tree.rb: ditto

Wed May 15 02:06:35 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* test/psych/helper.rb: envutil is not available outside Ruby, so
	  port the functions from envutil to the test helper.

	* test/psych/test_deprecated.rb: ditto

	* test/psych/test_encoding.rb: ditto

Wed May 15 00:42:54 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* signal.c: need to include unistd.h for write(2).
	  unistd.h is now included via ruby/defines.h, but should explicitly
	  include here.  (suggested by kosaki)

Tue May 14 23:43:05 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/.document: Add ifaddr.c.

Tue May 14 23:24:31 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/socket/extconf.rb: check for if_nametoindex() for
	  i686-w64-mingw32, and check for declarations of if_indextoname() and
	  if_nametoindex().

	* ext/socket/ifaddr.c (ifaddr_ifindex): not-implement unless
	  if_nametoindex() is available.

	* ext/socket/rubysocket.h: declare if_indextoname() and
	  if_nametoindex() if available but not declared.

Tue May 14 19:58:17 2013  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* ext/dl/lib/dl/func.rb (DL::Function#call): check tainted when
	  $SAFE > 0.
	* ext/fiddle/function.c (function_call): check tainted when $SAFE > 0.
	* test/fiddle/test_func.rb (module Fiddle): add test for above.


Tue May 14 14:51:52 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/win32.h (INTPTR_MAX, INTPTR_MIN, UINTPTR_MAX): split
	  from intptr_t and uintptr_t, since VC9 defines the latter only in
	  crtdefs.h.

Tue May 14 12:21:28 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (NET_LUID): mingw may have NET_LUID and not defined
	  _IFDEF_.

Tue May 14 03:33:17 2013  Koichi Sasada  <ko1@atdot.net>

	* string.c (rb_str_new_frozen): remove debug print.

Tue May 14 03:22:51 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: enable to generate write barrier protected
	  arrays (T_ARRAY).

Tue May 14 03:21:42 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: enable to generate write barrier protected
	  strings (T_STRING).

Tue May 14 03:19:59 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: enable to generate write barrier protected
	  objects (T_OBJECT).

Tue May 14 03:17:15 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: enable to generate write barrier protected
	  objects for numeric types (Float, Complex, Rational, Bignum).

Tue May 14 03:10:59 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: enable RGENGC (USE_RGENGC)
	  but no type creates write protected (sunny) objects
	  (RGENGC_WB_PROTECTED_* == 0).

Tue May 14 02:47:30 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: support RGENGC. [ruby-trunk - Feature #8339]
	  See this ticket about RGENGC.

	* gc.c: Add several flags:
	  * RGENGC_DEBUG: if >0, then prints debug information.
	  * RGENGC_CHECK_MODE: if >0, add assertions.
	  * RGENGC_PROFILE: if >0, add profiling features.
	    check GC.stat and GC::Profiler.

	* include/ruby/ruby.h: disable RGENGC by default (USE_RGENGC == 0).

	* array.c: add write barriers for T_ARRAY and generate sunny objects.

	* include/ruby/ruby.h (RARRAY_PTR_USE): added. Use this macro if
	  you want to access raw pointers. If you modify the contents which
	  pointer pointed, then you need to care write barrier.

	* bignum.c, marshal.c, random.c: generate T_BIGNUM sunny objects.

	* complex.c, include/ruby/ruby.h: add write barriers for T_COMPLEX
	  and generate sunny objects.

	* rational.c (nurat_s_new_internal), include/ruby/ruby.h: add write
	  barriers for T_RATIONAL and generate sunny objects.

	* internal.h: add write barriers for RBasic::klass.

	* numeric.c (rb_float_new_in_heap): generate sunny T_FLOAT objects.

	* object.c (rb_class_allocate_instance), range.c:
	  generate sunny T_OBJECT objects.

	* string.c: add write barriers for T_STRING and generate sunny objects.

	* variable.c: add write barriers for ivars.

	* vm_insnhelper.c (vm_setivar): ditto.

	* include/ruby/ruby.h, debug.c: use two flags
	  FL_WB_PROTECTED and FL_OLDGEN.

	* node.h (NODE_FL_CREF_PUSHED_BY_EVAL, NODE_FL_CREF_OMOD_SHARED):
	  move flag bits.

Tue May 14 01:54:48 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: remove rb_objspace_t::marked_num.
	  We can use `objspace_live_num()' instead of removed `marked_num'
	  if it is after `after_gc_sweep()' function call.

	* gc.c (after_gc_sweep): use objspace_live_num() instead of removed
	  rb_objspace_t::marked_num.

	* gc.c (gc_mark_ptr, gc_marks): remove rb_objspace_t::marked_num code.

	* gc.c (gc_prepare_free_objects): do not call set_heaps_increment()
	  with checking objspace->heap.marked_num. At this point, we only
	  need to check availability of free-cell.

	* gc.c (lazy_sweep): call after_gc_sweep() if there are no sweep_able entry.

	* gc.c (rest_sweep, gc_prepare_free_objects): remove after_gc_sweep() call.

Tue May 14 01:50:41 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: disable GC_PROFILE_MORE_DETAIL (fix last commit).

	* gc.c (gc_prof_set_malloc_info): fix "objspace->heap.live_num" to
	  "objspace_live_num(objspace)". There is no such member variable.

Tue May 14 01:25:55 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c: refactoring GC::Profiler.

	* gc.c (gc_prof_sweep_timer_start/stop): removed because
	  they doesn't support lazy sweep.

	* gc.c (gc_prof_sweep_slot_timer_start/stop): added.
	  redefine `sweeping time' to accumulated time of all of
	  slot_sweep().

	* gc.c (rb_objspace_t::profile::count): renamed to
	  rb_objspace_t::profile::next_index. `counter' seems ambiguous.
	  increment it when next record is acquired.

Tue May 14 00:48:55 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: constify RRational::(num,den) and
	  RComplex::(real,imag).
	  Add macro to set these values:
	    * RRATIONAL_SET_NUM()
	    * RRATIONAL_SET_DEN()
	    * RCOMPLEX_SET_REAL()
	    * RCOMPLEX_SET_IMAG()
	  This change is a part of RGENGC branch [ruby-trunk - Feature #8339].

	  TODO: API design. RRATIONAL_SET(rat,num,den) is enough?
	  TODO: Setting constify variable with cast has same issue of r40691.

	* complex.c, rational.c: use above macros.

Mon May 13 21:49:17 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: Check socketpair again.
	  It is required on Unix.

Mon May 13 21:20:32 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (getipaddrs): use alternative interface name if
	  available, because if_nametoindex() requires them.

Mon May 13 20:23:24 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c, include/ruby/win32.h (getipaddrs): [experimental]
	  emulate getipaddrs(3) on Unix.

	* win32/Makefile.sub, configure.in (LIBS): need iphlpapi.lib for above
	  function.

	* include/ruby/win32.h (socketpair): rb_w32_socketpair() doesn't
	  substitute for any function, so use non-prefixed name.

	* ext/socket/extconf.rb (socketpair); follow above change.

Mon May 13 20:11:06 2013  Koichi Sasada  <ko1@atdot.net>

	* iseq.c (prepare_iseq_build): remove additional line break.

Mon May 13 19:29:54 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: constify RBasic::klass and add
	  RBASIC_CLASS(obj) macro which returns a class of `obj'.
	  This change is a part of RGENGC branch [ruby-trunk - Feature #8339].

	* object.c: add new function rb_obj_reveal().
	  This function reveal internal (hidden) object by rb_obj_hide().
	  Note that do not change class before and after hiding.
	  Only permitted example is:
	    klass = RBASIC_CLASS(obj);
	    rb_obj_hide(obj);
	    ....
	    rb_obj_reveal(obj, klass);

	  TODO: API design. rb_obj_reveal() should be replaced with others.

	  TODO: modify constified variables using cast may be harmful for
	        compiler's analysis and optimization.
	        Any idea to prohibit inserting RBasic::klass directly?
	        If rename RBasic::klass and force to use RBASIC_CLASS(obj),
	        then all codes such as `RBASIC(obj)->klass' will be
	        compilation error. Is it acceptable? (We have similar
	        experience at Ruby 1.9,
	        for example "RARRAY(ary)->ptr" to "RARRAY_PTR(ary)".

	* internal.h: add some macros.
	  * RBASIC_CLEAR_CLASS(obj) clear RBasic::klass to make it internal
	    object.
	  * RBASIC_SET_CLASS(obj, cls) set RBasic::klass.
	  * RBASIC_SET_CLASS_RAW(obj, cls) same as RBASIC_SET_CLASS
	    without write barrier (planned).
	  * RCLASS_SET_SUPER(a, b) set super class of a.

	* array.c, class.c, compile.c, encoding.c, enum.c, error.c, eval.c,
	  file.c, gc.c, hash.c, io.c, iseq.c, marshal.c, object.c,
	  parse.y, proc.c, process.c, random.c, ruby.c, sprintf.c,
	  string.c, thread.c, transcode.c, vm.c, vm_eval.c, win32/file.c:
	  Use above macros and functions to access RBasic::klass.

	* ext/coverage/coverage.c, ext/readline/readline.c,
	  ext/socket/ancdata.c, ext/socket/init.c,
	* ext/zlib/zlib.c: ditto.

Mon May 13 18:44:14 2013  Koichi Sasada  <ko1@atdot.net>

	* *.c, parse.y, insns.def: use RARRAY_AREF/ASET macro
	  instead of using RARRAY_PTR().

Mon May 13 16:53:53 2013  Koichi Sasada  <ko1@atdot.net>

	* include/ruby/ruby.h: add new utility macros to access
	  Array's element.
	  * RARRAY_AREF(a, i) returns i-th element of an array `a'
	  * RARRAY_ASET(a, i, v) set i-th element of `a' to `v'
	  This change is a part of RGENGC branch [ruby-trunk - Feature #8339].

Mon May 13 15:31:10 2013  Koichi Sasada  <ko1@atdot.net>

	* object.c (rb_obj_setup): added.

	* include/ruby/ruby.h (OBJSETUP): use rb_obj_setup() instead of
	  a macro.

Mon May 13 15:24:16 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rb_data_object_alloc): check klass only if klass is not 0.
	  klass==0 means internal object.

Mon May 13 14:57:28 2013  Koichi Sasada  <ko1@atdot.net>

	* gc.c (rb_data_object_alloc, rb_data_typed_object_alloc):
	  use NEWOBJ_OF() instead of NEWOBJ().

Mon May 13 14:51:59 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* proc.c (rb_obj_singleton_method): new method Kernel#singleton_method
	  which returns a Method object of the singleton method.
	  non-singleton method causes NameError, but not aliased or zsuper
	  method, right now.
	  [ruby-core:54914] [Feature #8391]

	* vm_method.c (rb_method_entry_at): return the method entry for id at
	  klass, without ancestors.

	* class.c (rb_singleton_class_get): get the singleton class if exists,
	  or nil.

Mon May 13 10:20:59 2013  Yuki Yugui Sonoda  <yugui@google.com>

	* ext/openssl/ossl_ssl.c: Disabled OpenSSL::SSL::SSLSocket if
	  defined(OPENSSL_NO_SOCK).

	  This fixes a linkage error on platforms which do not have socket.
	  OpenSSL itself is still useful as a set of cryptographic functions
	  even on such platforms.

Mon May 13 10:30:04 2013  Zachary Scott  <zachary@zacharyscott.net>

	* hash.c: Hash[] and {} are not equivalent by @eam [Fixes GH-301]

Mon May 13 10:04:22 2013  Zachary Scott  <zachary@zacharyscott.net>

	* random.c: Document Random::DEFAULT by @eLobato [Fixes GH-304]

Sun May 12 21:12:42 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/ruby.h (OFFT2NUM): RUBY_REPLACE_TYPE also defines macro
	  to convert int type to VALUE if found.

Wed May  8 13:46:52 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* include/ruby/intern.h (rb_iv_set, rb_iv_get): removed. Because
	  ruby.h has a declaration for that.

Wed May  8 13:49:06 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* include/ruby/intern.h (rb_uint2big, rb_int2big, rb_uint2inum)
	(rb_int2inum, rb_ll2inum, rb_ull2inum): removed because ruby.h
	  has a declaration for these.

Sun May 12 17:52:23 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* configure.in: removes 'ac_cv_func_fseeko=yes' form MinGW
	  specific definitions.

Sun May 12 17:25:46 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* file.c (rb_file_s_truncate): use correct type. chsize takes
	  a long.

Sun May 12 17:18:46 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* process.c: move '#define HAVE_SPAWNV 1' to win32/Makefile.sub.
	* win32/Makefile.sub: see above.

Sun May 12 17:13:32 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* configure.in: removes AC_CHECK_FUNCS(setitimer) because it's
	  unused.

Sun May 12 17:08:16 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* configure.in: removes AC_CHECK_FUNCS(pause) because it's unused.

Sun May 12 17:05:18 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* signal.c (rb_f_kill): fixes typo. s/HAS_KILLPG/HAVE_KILLPG/.

Sun May 12 17:03:27 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* configure.in: abort if gettimeofday doesn't exist.

Sun May 12 16:31:27 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* configure.in: adds RUBY_REPLACE_TYPE(off_t) for creating
	  NUM2OFFT.
	* file.c (rb_file_truncate): use correct type. chsize() take
	  a long.
	* include/ruby/ruby.h (NUM2OFFT): use a definition created by
	  a configure script by default.

Sun May 12 16:03:41 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* configure.in: removes AC_CHECK_FUNC(fseeko, fseeko64, ftello,
	  ftello64). They are not used from anywhere.

	* win32/win32.c (fseeko): removes.
	* win32/win32.c (rb_w32_ftello): removes.
	* include/ruby/win32.h: removes declarations of rb_w32_ftello and
	  rb_w32_fseeko.
	* win32/Makefile.sub: removes '#define HAVE_FTELLO 1'.

Sun May 12 15:51:47 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* configure.in: remove AC_CHECK_FUNC(close). It is not used from
	  anywhere.

Sun May 12 15:50:45 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* configure.in: adds comments for setjmp check.

Sun May 12 15:38:09 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* configure.in: move clock_gettime() check into regular place.

Wed May  8 13:45:53 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* configure.in: add getenv() declaration check.
	* dln_find.c: add HAVE_DECL_GETENV test.

Sun May 12 15:33:18 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* configure.in: sorts AC_CHECK_FUNCS()s as alphabetical order.

Wed May  8 13:41:57 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* bignum.c: remove redundant decl for big_lshift() big_rshift().

Sun May 12 16:06:43 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/socket/rubysocket.h (rsock_inspect_sockaddr): as r40646
	  check HAVE_TYPE_STRUCT_SOCKADDR_DL.

Sat May 11 23:01:58 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/socket/rubysocket.h (HAVE_TYPE_STRUCT_SOCKADDR_DL):
	  MSVC has struct sockaddr_dl, but its content is broken.
	  http://ruby-mswin.cloudapp.net/vc10-x64/ruby-trunk/log/20130511T103938Z.log.html.gz

Sat May 11 22:07:42 2013  Tanaka Akira  <akr@fsij.org>

	* test/rinda/test_rinda.rb: Socket.getifaddrs may returns an interface
	  which #addr method returns nil for venet0 in OpenVZ.

Sat May 11 21:56:34 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/raddrinfo.c (rsock_inspect_sockaddr): Add casts to
	  suppress warnings.

Sat May 11 17:28:51 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket: New method, Socket.getifaddrs, implemented.
	  [ruby-core:54777] [Feature #8368]

Sat May 11 00:47:22 2013  Tanaka Akira  <akr@fsij.org>

	* gc.h (SET_MACHINE_STACK_END): Add !defined(_ILP32) to a defining
	  condition to avoid compilation error on x32.
	  https://sites.google.com/site/x32abi/

Fri May 10 23:56:34 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (parser_peek_variable_name): treat invalid global, class,
	  and instance variable names as mere strings rather than errors.
	  [ruby-core:54885] [Bug #8375]

Fri May 10 20:22:40 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: Move library checks into "Checks for libraries." part.

Fri May 10 19:32:01 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: Reformat arguments of AC_CHECK_HEADERS and
	  AC_CHECK_FUNCS to track modifications easily.

Fri May 10 12:01:36 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: Don't link librt if clock_gettime is available in
	  the main C library.
	  glibc 2.17 moves clock_* from librt to the main C library.
	  http://sourceware.org/ml/libc-announce/2012/msg00001.html

Thu May  9 22:00:35 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/ancdata.c (bsock_sendmsg_internal): controls_num should
	  not be negative.

Thu May  9 21:09:57 2013  Tanaka Akira  <akr@fsij.org>

	* file.c, ext/etc/etc.c, ext/socket/unixsocket.c,
	  ext/openssl/ossl.h, ext/openssl/openssl_missing.c: Use
	  HAVE_AGGREGATE_MEMBER instead of HAVE_ST_MEMBER.

Thu May  9 20:43:41 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/ancdata.c (bsock_sendmsg_internal): Always set
	  controls_num to raise NotImplementedError appropriately.
	  (bsock_recvmsg_internal): Raise NotImplementedError if
	  :scm_rights=>true is given on platforms which don't have
	  4.4BSD style control message.

Thu May  9 12:06:07 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/rubysocket.h, ext/socket/unixsocket.c,
	  ext/socket/ancdata.c: Use HAVE_STRUCT_MSGHDR_MSG_CONTROL instead
	  of HAVE_ST_MSG_CONTROL.

Thu May  9 11:30:02 2013  Zachary Scott	 <zachary@zacharyscott.net>

	* string.c: Add call-seq alias for String#=== [Bug #8381]

Thu May  9 11:14:18 2013  Zachary Scott	 <zachary@zacharyscott.net>

	* doc/contributing.rdoc: Add guide for contributing to CRuby

Thu May  9 04:55:49 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: Check socket library again.  shutdown() is used in
	  io.c.

Thu May  9 01:52:31 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: Don't check socketpair.  socketpair is not used in
	  ruby command itself.

Thu May  9 01:05:41 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* class.c (rb_mod_included_modules): should not include non-modules.
	  [ruby-core:53158] [Bug #8025]

Wed May  8 22:46:59 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* class.c (rb_mod_included_modules): should not include the original
	  module itself.  [ruby-core:53158] [Bug #8025]

Wed May  8 17:43:55 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* io.c (rb_io_ext_int_to_encs): ignore internal encoding if external
	  encoding is ASCII-8BIT. [Bug #8342]

Wed May  8 13:49:38 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/json/generator/generator.c (isArrayOrObject): cast char to
	  unsigned char. [Bug #8378]

Wed May  8 13:46:10 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/json/generator/depend: fix dependencies [Bug #8379]

	* ext/json/parser/depend: ditto.

Wed May  8 13:07:17 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (parser_yylex): fail if $, @, @@ are not followed by a valid
	  name character.  [ruby-core:54846] [Bug #8375].

Wed May  8 13:06:31 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/ruby.h (ISGRAPH): add missing macro.

Wed May  8 06:42:56 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/socket/socket.c (socket_s_ip_address_list): fix wrongly filled
	  sin6_scope_id on KAME introduced by r40593 for OpenIndiana.
	  KAME uses fe80:<scope_id>::<interface id> for link-local address
	  internally.
	  Setting sin6_scope_id causes it leaked.
	  see also comments of sockaddr_obj().

Tue May  7 22:12:34 2013  Tanaka Akira  <akr@fsij.org>

	* ext/readline/readline.c (insert_ignore_escape): Add a cast to
	  unsigned char * before dereference.
	  This suppress a warning on Cygwin.

Tue May  7 12:15:24 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/ancdata.c (bsock_recvmsg_internal): Add a cast to
	  suppress warning.
	  Bionic defines socklen_t as int.
	  Bionic defines msg_controllen as unsigned int (__kernel_size_t)
	  instead of socklen_t as POSIX.

Tue May  7 12:12:42 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/ancdata.c (ancillary_inspect): Don't call
	  anc_inspect_ipv6_pktinfo if !HAVE_TYPE_STRUCT_IN6_PKTINFO.
	  anc_inspect_ipv6_pktinfo is not defined in the case.

Tue May  7 12:10:52 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/socket.c (socket_s_ip_address_list): Cast EXTRA_SPACE as
	  int.  This suppress a warning.

Tue May  7 12:09:29 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: Set close_fds false for Cygwin.
	  Cygwin doesn't support fd passing.
	  This enables socket extension library cross-compilable by default.

Tue May  7 12:07:35 2013  Tanaka Akira  <akr@fsij.org>

	* pack.c (swap32): Don't redefine it if it is already defined.
	  Bionic defines it.
	  (swap64): Ditto.

Mon May  6 20:50:37 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/socket.c (socket_s_ip_address_list): Fill sin6_scope_id
	  if getifaddrs() returns an IPv6 link local address which
	  sin6_scope_id is zero, such as on OpenIndiana SunOS 5.11.

Sun May  5 18:56:52 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* insns.def (defined): use vm_search_superclass() like as normal super
	  call.  based on a patch <https://gist.github.com/wanabe/5520026> by
	  wanabe.

	* vm_insnhelper.c (vm_search_superclass): return error but not raise
	  exceptions.

	* vm_insnhelper.c (vm_search_super_method): check the result of
	  vm_search_superclass and raise exceptions on error.

Sun May  5 16:29:41 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* insns.def (defined): get method entry from the method top level
	  frame, not block frame.  [ruby-core:54769] [Bug #8367]

Sun May  5 13:28:54 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* template/ruby.pc.in (Cflags): use rubyarchhdrdir for multiarch.
	  [Bug #7874]

Sat May  4 07:20:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* doc/security.rdoc: Add note about reporting security vulns

Sat May  4 04:13:27 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* include/ruby/defines.h (RUBY_ATTR_ALLOC_SIZE): New for
	  attribute((alloc_size(params))).

	* include/ruby/defines.h (xmalloc, xmalloc2, xcalloc)
	(xrealloc, xrealloc2): Annotated by RUBY_ATTR_ALLOC_SIZE.
	* include/ruby/ruby.h (rb_alloc_tmp_buffer): ditto.

Fri May  3 19:32:13 2013  Takeyuki FUJIOKA  <xibbar@ruby-lang.org>

	* lib/cgi/util.rb: All class methods modulized.
	  We can use these methods like a function when "include CGI::Util".
	  [Feature #8354]

Fri May  3 14:09:45 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: Make default_ipv6 true for Cygwin.
	  Cygwin supports IPv6 since Cygwin 1.7.1 (2009-12).
	  http://cygwin.com/ml/cygwin-announce/2009-12/msg00027.html

Fri May  3 13:35:26 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/socket/{getaddrinfo,getnameinfo}.c: define socklen_t if not
	  defined, e.g., older VC.

Fri May  3 13:29:11 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/win32.h (INTPTR_MAX, INTPTR_MIN, UINTPTR_MAX): also
	  should be defined when defining intptr_t and uintptr_t.
	  bigdecimal.c requires the former two now.

Fri May  3 13:22:12 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (poll_child_status): fix build error on older mingw.

Fri May  3 00:15:58 2013  Ayumu AIZAWA  <ayumu.aizawa@gmail.com>

	* common.mk: remove timestamps in distclean-ext realclean-ext.

Thu May  2 23:23:49 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* object.c (rb_obj_is_kind_of): skip prepending modules.
	  [ruby-core:54742] [Bug #8357]

	* object.c (rb_class_inherited_p): ditto.
	  [ruby-core:54736] [Bug #8357]

Thu May  2 22:11:47 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bin/irb: remove dead code from sample/irb.rb.

Thu May  2 17:32:45 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (copy_ivar_i): get rid of overwriting already copied
	  instance variables.  c.f. [Bug #8276]

Thu May  2 16:55:43 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* thread.c (id_locals): use cached ID.

	* vm.c (ruby_thread_init): ditto.

	* defs/id.def: add more predefined IDs used in core.

Thu May  2 13:42:42 2013  Ryan Davis  <ryand-ruby@zenspider.com>

	* lib/minitest/*: Imported minitest 4.7.4 (r8483)
	* test/minitest/*: ditto

Thu May  2 11:32:22 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (poll_child_status): [experimental] set the cause of
	  a child's death to status if its exitcode seems to be an error.

	* test/ruby/test_process.rb (TestProcess#test_no_curdir): maybe now
	  we can test it.

	* test/ruby/test_thread.rb (TestThread#test_thread_timer_and_interrupt):
	  ditto.

Thu May  2 11:24:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/yaml.rb: nodoc EngineManager, add History doc #8344

Wed May  1 21:11:17 2013  Tanaka Akira  <akr@fsij.org>

	* time.c (localtime_with_gmtoff_zone): musl libc may return NULL for
	  tm_zone.

Wed May  1 18:59:36 2013  Benoit Daloze  <eregontp@gmail.com>

	* enum.c (Enumerable#chunk): fix grammar of error message
	  for symbols beginning with an underscore [Bug #8351]

Wed May  1 16:47:47 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/curses/extconf.rb (curses_version): try once for each tests, a
	  function or a variable.  fallback to variable for old SVR4.

Wed May  1 16:17:46 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/extmk.rb (extmake): extensions not to be installed should not
	  make static libraries, but make dynamic libraries always.

Wed May  1 12:20:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/rake/version.rb: Fix RDoc warning with  :include: [Bug #8347]

Wed May  1 11:40:25 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* defs/id.def (predefined): add "idProc".

	* eval.c (frame_func_id): use predefined IDs.

	* proc.c (mnew, mproc, mlambda): use predefined IDs.

	* vm.c (rb_vm_control_frame_id_and_class): ditto.

	* vm.c (Init_VM): ditto.

Tue Apr 30 23:18:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/benchmark.rb: Update Benchmark results on newer CPU

Tue Apr 30 12:31:40 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* proc.c (mproc, mlambda): use frozen core methods instead of plain
	  global methods, so that methods cannot be overridden.
	  [ruby-core:54687] [Bug #8345]

	* vm.c (Init_VM): define proc and lambda on the frozen core object.

	* include/ruby/intern.h (rb_block_lambda): add declaration instead of
	  deprecated rb_f_lambda.

Mon Apr 29 17:02:30 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/nkf/nkf-utf8/nkf.h: Bionic libc doesn't have locale.
	  [Feature #8338]


Mon Apr 29 06:58:30 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/openssl/ossl_bn.c (ossl_bn_initialize): no need of alloca for
	  small fixed size array.

	* ext/openssl/ossl_bn.c (ossl_bn_initialize): check overflow first,
	  and use alloca for small size input.

Mon Apr 29 00:40:13 2013  Benoit Daloze  <eregontp@gmail.com>

	* lib/yaml.rb: Clarify documentation about YAML being always Psych.
	  Give a tip about using Syck. See #8344.

Sun Apr 28 23:34:01 2013  Benoit Daloze  <eregontp@gmail.com>

	* lib/yaml.rb: Use another trick to define the YAML module.
	  https://twitter.com/n0kada/status/328342207511801856

Sun Apr 28 23:19:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/pp.rb: Update PP module overview by @geopet

Sun Apr 28 22:04:37 2013  Hiroshi Shirosaki  <h.shirosaki@gmail.com>

	* ext/openssl/ossl_bn.c (ossl_bn_initialize): fix buffer overflow on
	  x64 Windows and memory leak when initializing with integer.
	  [ruby-core:54615] [Bug #8337]

Sun Apr 28 12:38:04 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* README.EXT: correct method name to be used.  [Bug #7982]

	* README.EXT.ja: add notes too.

Sun Apr 28 10:35:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* object.c: With feedback from Steve Klabnik, reverted a change to
	  #untrusted? and #tainted?. Also adjusted grammar for $SAFE levels

Sun Apr 28 10:10:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/yaml.rb: Disable setting YAML const twice [ruby-core:54642]

Sun Apr 28 09:50:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* object.c: Documentation for taint and trust [Bug #8162]

Sun Apr 28 09:40:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* README.EXT: Copy note from r40505 for rb_sprintf() [Bug #7982]

Sun Apr 28 08:28:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/curses/curses.c: Update Curses::Window example for nicer output
	  Patch by Michal Suchanek [Bug #8121] [ruby-core:53520]

Sun Apr 28 08:10:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* README.EXT: Update note from r40504, by Jeremy Evans [Bug #7982]

Sun Apr 28 08:02:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* README.EXT: Add note to warn use of %i in Exceptions [Bug #7982]

Sun Apr 28 02:41:05 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: Fix a typo.  Should check endgrent() instead of
	  endgrnam().

Sun Apr 28 00:35:45 2013  Tanaka Akira  <akr@fsij.org>

	* process.c (obj2gid): Don't call endgrent() if not exist.
	  Bionic (Android's libc) don't have endgrent().

	* configure.in: Check endgrnam function.

Sat Apr 27 23:53:00 2013  Charlie Somerville  <charlie@charliesomerville.com>

	* lib/yaml.rb: add security warning to YAML documentation

Sat Apr 27 23:25:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/yaml.rb: Documentation for YAML module [Bug #8213]

Sat Apr 27 20:19:21 2013  Tanaka Akira  <akr@fsij.org>

	* thread_pthread.c (ruby_init_stack): Add STACK_GROW_DIR_DETECTION.
	  This fixes a compilation failure while cross-compiling for Tensilica
	  Xtensa Processor.

Sat Apr 27 19:32:44 2013  Benoit Daloze  <eregontp@gmail.com>

	* thread.c: fix typos and documentation

Sat Apr 27 19:04:55 2013  Tanaka Akira  <akr@fsij.org>

	* sparc.c: Use __asm__ instead of asm for gcc.
	  gcc doesn't provide asm keyword if -ansi option is given.
	  http://gcc.gnu.org/onlinedocs/gcc/Alternate-Keywords.html

Sat Apr 27 17:22:50 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: Redundant test removed.

Sat Apr 27 16:00:10 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb (test_recvmsg_with_msg_peek_creates_fds):
	  Extracted.

Sat Apr 27 15:50:40 2013  Tanaka Akira  <akr@fsij.org>

	* internal.h (SIGNED_INTEGER_TYPE_P): New macro.
	  (SIGNED_INTEGER_MAX): Ditto.
	  (SIGNED_INTEGER_MIN): Ditto.
	  (UNSIGNED_INTEGER_MAX): Ditto.
	  (TIMET_MAX): Use SIGNED_INTEGER_MAX and UNSIGNED_INTEGER_MAX.
	  (TIMET_MIN): Use SIGNED_INTEGER_MIN.

	* thread.c (TIMEVAL_SEC_MAX): Use SIGNED_INTEGER_MAX.
	  (TIMEVAL_SEC_MIN): Use SIGNED_INTEGER_MIN.

Sat Apr 27 10:52:52 2013  Tanaka Akira  <akr@fsij.org>

	* thread.c (TIMEVAL_SEC_MAX, TIMEVAL_SEC_MIN): Consider environments,
	  sizeof(time_t) is smaller than sizeof(tv_sec), such as
	  OpenBSD 5.2 (amd64).

Fri Apr 26 23:34:59 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/text.rb (REXML::Text.normalize): Fix a bug that all
	  entity filters are ignored. [ruby-dev:47278] [Bug #8302]
	  Patch by Ippei Obayashi. Thanks!!!
	* test/rexml/test_entity.rb (EntityTester#test_entity_filter): Add
	  a test of the above change.

Fri Apr 26 22:53:55 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/element.rb (REXML::Attributes#to_a): Support
	  namespaced attributes. [ruby-dev:47277] [Bug #8301]
	  Patch by Ippei Obayashi. Thanks!!!
	* test/rexml/test_attributes.rb
	  (AttributesTester#test_to_a_with_namespaces): Add a test of the
	  above change.

Fri Apr 26 21:48:29 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/atom.rb (RSS::Atom::Entry): Fix indent of document comment.

Fri Apr 26 21:21:17 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rss/maker.rb (RSS::Maker): Fix indent of document comment.

Fri Apr 26 18:41:04 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: Use a block of enable_config() for
	  --{enable,disable}-close-fds-by-recvmsg-with-peek configure option

Fri Apr 26 18:08:08 2013  Tanaka Akira  <akr@fsij.org>

	* dir.c (dir_set_pos): Fix a compilation error when seekdir() is not
	  exist.

Fri Apr 26 17:41:17 2013  Tanaka Akira  <akr@fsij.org>

	* thread_pthread.c (ruby_init_stack): Add STACK_GROW_DIR_DETECTION.
	  This fixes a compilation failure while cross-compiling for ARM.

Fri Apr 26 14:35:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/rss/atom.rb: Documentation for RSS::Atom based on a patch by
	  Michael Denomy
	* lib/rss/maker.rb: Documentation for RSS::Maker also by @mdenomy

Fri Apr 26 12:41:22 2013  Tanaka Akira  <akr@fsij.org>

	* ext/curses/extconf.rb: Test linkability of curses_version at first.

	* ext/socket/extconf.rb: Test the behavior of fd passing with MSG_PEEK
	  only if recvmsg(), msg_control member, AF_UNIX and SCM_RIGHTS are
	  available.

Fri Apr 26 00:07:52 2013  Hiroshi Shirosaki  <h.shirosaki@gmail.com>

	* lib/rinda/ring.rb (Rinda::RingServer#initialize): accept array
	  arguments of address to specify multicast interface.

	* lib/rinda/ring.rb (Rinda::RingServer#make_socket): add optional
	  arguments for multicast interface.

	* test/rinda/test_rinda.rb
	  (TestRingFinger#test_ring_server_ipv4_multicast,
	   TestRingFinger#test_ring_server_ipv6_multicast): add tests for
	  above change.

	* test/rinda/test_rinda.rb
	  (TestRingServer#test_make_socket_ipv4_multicast,
	   TestRingServer#test_make_socket_ipv6_multicast): change bound
	  interface address because multicast address is not allowed on Linux
	  or Windows.
	  [ruby-core:53692] [Bug #8159]

Thu Apr 25 23:45:02 2013  Hiroshi Shirosaki  <h.shirosaki@gmail.com>

	* lib/rinda/ring.rb (Rinda::RingServer#initialize): add a socket
	  to @sockets in make_socket() to close sockets on shutdown even if
	  make_socket() is called after initialize.

	* lib/rinda/ring.rb (Rinda::RingServer#make_socket): ditto.

Thu Apr 25 23:39:42 2013  Hiroshi Shirosaki  <h.shirosaki@gmail.com>

	* test/rinda/test_rinda.rb (TupleSpaceProxyTest#test_take_bug_8215):
	  use KILL on Windows since TERM doen't work and ruby process remains
	  after test-all on Windows.

Thu Apr 25 23:16:28 2013  Tanaka Akira  <akr@fsij.org>

	* ext/curses/extconf.rb: Implement
	  --with-curses-version={function,variable} configure option for
	  cross-compiling.

Thu Apr 25 18:15:46 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: Don't use WIDE getaddrinfo by default.

Thu Apr 25 17:56:39 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: Remove obsolete options: ---with-ipv6-lib and
	  --with-ipv6-libdir.

Thu Apr 25 17:43:49 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: Implement
	  --{enable,disable}-close-fds-by-recvmsg-with-peek configure option
	  for cross-compiling.
	  Make --{enable,disable}-wide-getaddrinfo configure option
	  cross-compiling friendly.

Thu Apr 25 16:11:06 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (rb_io_ext_int_to_encs, parse_mode_enc): bom-prefixed name is
	  not a real encoding name, just a fallback.  so the proper conversion
	  should take place even if if the internal encoding is equal to the
	  bom-prefixed name, unless actual encoding is equal to the internal
	  encoding.  [ruby-core:54563] [Bug #8323]

	* io.c (io_set_encoding_by_bom): reset extenal encoding if no BOM
	  found.  [ruby-core:54569]

Thu Apr 25 14:35:01 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/openssl/ossl_bn.c (ossl_bn_initialize): allow Fixnum and Bignum.
	  [ruby-core:53986] [Feature #8217]

Thu Apr 25 14:26:32 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* lib/uri/common.rb (URI.decode_www_form): follow current URL Standard.
	  It gets encoding argument to specify the character encoding.
	  It now allows loose percent encoded strings, but denies ;-separator.
	  [ruby-core:53475] [Bug #8103]

	* lib/uri/common.rb (URI.decode_www_form): follow current URL Standard.
	  It gets encoding argument to convert before percent encode.
	  Now UTF-16 strings aren't converted to UTF-8 before percent encode
	  by default.

Wed Apr 25 14:26:00 2013  Charlie Somerville  <charlie@charliesomerville.com>

	* benchmark/bm_hash_shift.rb: add benchmark for Hash#shift

	* hash.c (rb_hash_shift): use st_shift if hash is not being iterated to
	  delete element without iterating the whole hash.

	* hash.c (shift_i): remove function

	* include/ruby/st.h (st_shift): add st_shift function

	* st.c (st_shift): ditto

	[Bug #8312] [ruby-core:54524] Patch by funny-falcon

Thu Apr 25 12:03:38 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: Extract C programs as toplevel constants.

Thu Apr 25 02:23:28 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (RUBY_RM_RECURSIVE): this hack is needed by only
	  autoconf 2.69 or earlier on darwin.

Thu Apr 25 01:22:41 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/tracer.rb (get_line): simply read by File.readlines.

	* lib/debug.rb (script_lines): get source lines from SCRIPT_LINES__ or
	  read from the file.

	* lib/debug.rb (display_list): use script_lines instead of recursion.
	  [Bug #8318]

	* lib/debug.rb (line_at): use script_lines same as display_list.

	* lib/debug.rb (display_list): Fix debug listing when called from the
	  same file it has been required.  patch by Dario Bertini <berdario AT
	  gmail.com> [Bug #8318] [fix GH-280]

Wed Apr 24 21:51:13 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: Check mblen().
	  mblen() is optional in uClibc.

	* eval_intern.h (CharNext): Don't use mblen() is not available.

Wed Apr 24 15:55:06 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* io.c (rb_fd_fix_cloexec): use rb_update_max_fd().

Wed Apr 24 14:08:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* numeric.c: Fix wiki link on Float imprecision in overview, patched
	  by Makoto Kishimoto [Bug #8304] [ruby-dev:47280]

Wed Apr 24 14:03:59 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (parser_yylex): disallow $- without following identifier
	  character.  [ruby-talk:406969]

	* parse.y (is_special_global_name): mere $- is not a valid global
	  variable name.

Wed Apr 24 13:54:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* string.c: Document String#setbyte return value by @gjmurakami-10gen
	  [Fixes GH-294]

Wed Apr 24 13:45:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* class.c: Example of Object#methods by @windwiny [Fixes GH-293]
	* ruby.c: Document return values of Kernel #sub, #gsub, and #chop

Wed Apr 24 12:54:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/socket/lib/socket.rb: Doc typos by @vipulnsward [Fixes GH-292]


Wed Apr 24 12:54:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/socket/lib/socket.rb: Doc typos by @vipulnsward [Fixes GH-292]

Wed Apr 24 12:27:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* array.c: Fix documentation for Array#index and #replace aliases
	  Based on a patch by @phiggins [Fixes GH-282]

Tue Apr 23 21:14:38 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* string.c (rb_str_inspect): refix r40413, on Ruby 1.9 usual character
	  escape uses hex/Unicode escapes, so fix to use Unicode escape on
	  Unicode strings and hex on others. [ruby-core:54458] [Bug #8290]

Tue Apr 23 20:10:02 2013  Tanaka Akira  <akr@fsij.org>

	* missing/isnan.c (isnan): Don't define if isnan() macro is defined.
	  This fixes a compilation failure on uClibc based Gentoo system.

Tue Apr 23 17:40:40 2013  Martin Duerst <duerst@it.aoyama.ac.jp>

	* lib/rexml/document.rb, lib/rexml/element.rb,
	  lib/rexml/formatters/pretty.rb: remove opinionated
	  language in documentation. [Bug #8309],
	  reported by Charles Beckmann

Tue Apr 23 14:04:44 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (getacl_response): parse the mailbox of an ACL
	  response correctly.  [ruby-core:54365] [Bug #8281]

Tue Apr 23 11:58:46 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_scrub): fix for UTF-32.  strlen() on strings
	  contain NUL returns wrong result, use sizeof operator instead.
	  [ruby-dev:45975] [Feature #6752]

Tue Apr 23 10:26:50 2013  Akinori MUSHA  <knu@iDaemons.org>

	* test/ruby/test_module.rb
	  (TestModule#test_const_get_invalid_name)
	  (test_const_defined_invalid_name): Fix expected values.

Tue Apr 23 09:51:26 2013  Akinori MUSHA  <knu@iDaemons.org>

	* string.c (rb_str_inspect): NUL should not be represented as "\0"
	  when octal digits may follow.  [ruby-core:54458] [Bug #8290]

Mon Apr 22 22:54:00 2013  Charlie Somerville  <charlie@charliesomerville.com>

	* insns.def (opt_mod): Use % operator if both operands are positive for
	  a significant performance improvement. Thanks to @samsaffron.

Mon Apr 22 17:09:37 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (r_object0): copy all instance variables not only generic
	  ivars, before calling post proc.  [ruby-core:51163] [Bug #7627]

Mon Apr 22 10:25:21 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* util.c (ruby_hdtoa): revert r29729.
	  If you want ruby to behave as before on x86, specify to use SSE like
	  -msse2 -mfpmath=sse for gcc.

Sun Apr 21 23:19:00 2013  Charlie Somerville  <charlie@charliesomerville.com>

	* configure.in: Revert using sigsetjmp by default due to performance
	  problems on some systems (eg. older Linux)

Sun Apr 21 21:35:00 2013  Charlie Somerville  <charlie@charliesomerville.com>

	* configure.in: Use sigsetjmp by default so jumping out of signal
	  handlers properly restores the signal mask and SS_ONSTACK flag.
	  [ruby-core:54175] [Bug #8254]

	* configure.in: Manually check for presence of sigsetjmp. It is not a
	  function on some systems, so AC_CHECK_FUNCS cannot be used.

Sun Apr 21 08:00:55 2013  Tanaka Akira  <akr@fsij.org>

	* test/csv/test_features.rb, test/logger/test_logger.rb
	  test/mkmf/test_have_macro.rb, test/net/http/test_http.rb,
	  test/openssl/test_config.rb, test/psych/test_encoding.rb,
	  test/psych/test_exception.rb, test/psych/test_psych.rb,
	  test/psych/test_tainted.rb, test/readline/test_readline.rb,
	  test/rexml/test_contrib.rb, test/ruby/test_autoload.rb,
	  test/ruby/test_beginendblock.rb, test/ruby/test_exception.rb,
	  test/ruby/test_file.rb, test/ruby/test_io.rb,
	  test/ruby/test_marshal.rb, test/ruby/test_process.rb,
	  test/ruby/test_require.rb, test/ruby/test_rubyoptions.rb,
	  test/syslog/test_syslog_logger.rb, test/webrick/test_httpauth.rb,
	  test/zlib/test_zlib.rb: Use Tempfile.create.

Sun Apr 21 00:15:36 2013  Tanaka Akira  <akr@fsij.org>

	* lib/tempfile.rb (Tempfile.create): Close when the block exits.

Sat Apr 20 23:38:14 2013  Tanaka Akira  <akr@fsij.org>

	* lib/webrick/httpauth/htpasswd.rb: Use Tempfile.create to avoid
	  unintentional unlink() by the finalizer.
	  lib/webrick/httpauth/htdigest.rb: Ditto.

Sat Apr 20 22:47:48 2013  Tanaka Akira  <akr@fsij.org>

	* lib/tempfile.rb (Tempfile.create): New method.
	  The method name is proposed by Shugo Maeda.  [ruby-dev:47220]
	  [ruby-core:41478] [Feature #5707]

Sat Apr 20 14:22:10 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (w_object): dump no ivars to the original by marshal_dump.
	  [ruby-core:54334] [Bug #8276]

	* marshal.c (r_object0): copy all ivars of marshal_dump data to the
	  result object instead.  [ruby-core:51163] [Bug #7627]

Sat Apr 20 02:33:27 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* string.c (str_scrub): add ruby method String#scrub which verify and
	  fix invalid byte sequence. [ruby-dev:45975] [Feature #6752]

	* string.c (str_compat_and_valid): check given string is compatible
	  and valid with given encoding.

	* transcode.c (str_transcode0): If invalid: :replace is specified for
	  String#encode, replace invalid byte sequence even if the destination
	  encoding equals to the source encoding.

Fri Apr 19 21:55:40 2013  Kouhei Sutou  <kou@cozmixng.org>

	* README.EXT.ja (Data_Wrap_Struct): Remove a description about
	  orphan argument. Oh, I renamed the argument name without
	  changing description at r36180... Sorry....
	  Patch by Makoto Kishimoto. Thanks!!! [ruby-dev:47269] [Bug #8292]
	* README.EXT.ja (Data_Make_Struct): Add a sample code that describes
	  how it works.
	  Patch by Makoto Kishimoto. Thanks!!! [ruby-dev:47269] [Bug #8292]

Fri Apr 19 17:54:57 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* lib/net/imap.rb (body_type_msg): should accept
	  message/delivery-status with extra data.
	  [ruby-core:53741] [Bug #8167]

	* test/net/imap/test_imap_response_parser.rb: related test.

Fri Apr 19 13:03:14 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (w_object): do not dump encoding which is dumped with
	  marshal_dump data.  [ruby-core:54334] [Bug #8276]

Fri Apr 19 11:36:53 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (stack_protector): control use of -fstack-protector.

	* configure.in (debugflags): let -fstack-protector precede and disable
	  debugflags, because they can't work together on SmartOS.  [Bug #8268]

Fri Apr 19 07:43:52 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* test/openssl/test_cipher.rb: Correct a typo
	  by jgls <joerg@joergleis.com>
	  https://github.com/ruby/ruby/pull/291 fix GH-291

Thu Apr 18 16:58:51 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_method.c (rb_mod_public_method): fix visibility on anonymous
	  module. set visibility of singleton method, not method in base
	  class.  [ruby-core:54404] [Bug #8284]

Thu Apr 18 16:20:51 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (glob_helper): should skip dot directories only for recursion,
	  but should not if matching to the given pattern.  [ruby-core:54387]
	  [Bug #8283]

Thu Apr 18 16:20:21 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* pack.c (pack_unpack): increase buffer size to fix buffer overflow,
	  and fix garbage just after unpacking without missing paddings.
	  [Bug #8286]

Thu Apr 18 13:35:54 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* pack.c (pack_unpack): output characters even if the input doesn't
	  have paddings. [Bug #8286]

Thu Apr 18 08:20:48 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* common.mk (clean-ext): remove timestamps.

Wed Apr 17 22:07:50 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/rubysocket.h (SOCKLEN_MAX): Expression simplified.

Wed Apr 17 20:09:19 2013  Aman Gupta  <ruby@tmm1.net>

	* compile.c (iseq_add_mark_object): Use new rb_iseq_add_mark_object().

	* insns.def (setinlinecache): Ditto.

	* iseq.c (rb_iseq_add_mark_object): New function to allocate
	  iseq->mark_ary on demand. [Bug #8142]

	* iseq.h (rb_iseq_add_mark_object): Ditto.

	* iseq.c (prepare_iseq_build): Avoid allocating mark_ary until needed.

	* iseq.c (rb_iseq_build_for_ruby2cext): Ditto.

Wed Apr 17 20:00:18 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/rubysocket.h (SOCKLEN_MAX): Defined.

	* ext/socket/raddrinfo.c (ext/socket/raddrinfo.c): Reject too long
	  Linux abstract socket name.

Wed Apr 17 19:45:27 2013  Aman Gupta  <tmm1@ruby-lang.org>

	* iseq.c (iseq_location_setup): re-use existing string when iseq has
	  the same path and absolute_path. [Bug #8149]

Wed Apr 17 11:38:37 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/test/unit/assertions.rb (Test::Unit::Assertions#assert):
	  UNASSIGNED is not a valid message.

Wed Apr 17 10:58:18 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* thread.c (sleep_timeval): get rid of overflow on Windows where
	  timeval.tv_sec is not time_t but mere long.

Tue Apr 16 23:07:12 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/unixsocket.c (unix_send_io): Suppress a warning by clang.
	  (unix_recv_io): Ditto.

Tue Apr 16 12:27:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/sdbm/init.c: Fix comment indentation, by windwiny [Fixes GH-277]

Tue Apr 16 12:25:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/socket/option.c: Document synonymous methods, by windwiny [GH-277]
	* ext/stringio/stringio.c: ditto
	* ext/io/wait/wait.c: ditto
	* ext/gdbm/gdbm.c: ditto
	* ext/dl/cfunc.c: ditto
	* ext/zlib/zlib.c: ditto
	* ext/win32ole/win32ole.c: ditto
	* ext/dbm/dbm.c: ditto
	* ext/json/generator/generator.c: ditto
	* ext/date/date_core.c: ditto

Tue Apr 16 11:23:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/openssl/*: Document synonymous methods, by windwiny [GH-277]

Mon Apr 15 22:21:42 2013  Tanaka Akira  <akr@fsij.org>

	* ext/fiddle/depend: New file.

Mon Apr 15 22:01:02 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-electric.el (ruby-electric-insert): Check
	  ruby-electric-is-last-command-char-expandable-punct-p here.

	* misc/ruby-electric.el (ruby-electric-closing-char): New
	  interactive function bound to closing characters.  Typing one of
	  those closing characters right after the matching counterpart
	  cancels the effect of automatic closing.  For example, typing
	  "{" followed by "}" simply makes "{}" instead of "{ } }".

Mon Apr 15 12:54:42 2013  Martin Bosslet  <Martin.Bosslet@gmail.com>

	* ext/openssl/ossl_ssl.c: Correct shutdown behavior w.r.t GC.

	* test/openssl/test_ssl.rb: Add tests to verify correct behavior.

	[Bug #8240] Patch provided by Shugo Maeda. Thanks!

Mon Apr 15 10:23:39 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/coverage/depend: fix id.h place as r40283.

	* ext/coverage/extconf.rb: add topdir and topsrcdir to VPATH.

Sun Apr 14 19:46:14 2013  Tanaka Akira  <akr@fsij.org>

	* ext/-test-/debug/depend: New file.

	* ext/-test-/exception/depend: Ditto.

	* ext/-test-/printf/depend: Ditto.

	* ext/-test-/string/depend: Ditto.

	* ext/coverage/depend: Ditto.

	* ext/io/console/depend: Ditto.

	* ext/io/nonblock/depend: Ditto.

	* ext/io/wait/depend: Ditto.

	* ext/openssl/depend: Ditto.

	* ext/pathname/depend: Ditto.

	* ext/psych/depend: Ditto.

	* ext/zlib/depend: Ditto.

Sun Apr 14 02:46:50 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* lib/mkmf.rb (MakeMakefile#create_makefile): remove {$(VPATH)} other
	  than nmake.

	* ext/ripper/depend: use VPATH expecting removed by above.

Sat Apr 13 23:06:20 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (timestamp_file): gather timestamp files in one
	  directory from each extension directories.

Sat Apr 13 21:09:02 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* lib/mkmf.rb (MakeMakefile#create_makefile): output new macro
	  disthdrdir to specify the path of id.h, parse.h and etc.

	* ext/ripper/depend: use above macro.

Sat Apr 13 20:28:08 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* Merge Onigmo 5.13.4 f22cf2e566712cace60d17f84d63119d7c5764ee.
	  [bug] fix problem with optimization of \z (Issue #16) [Bug #8210]

Sat Apr 13 18:56:15 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/ripper/depend: parse.h and id.h may be created on topdir.

Sat Apr 13 12:08:16 2013  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* lib/matrix.rb: Add Vector#cross_product, patch by Luis Ezcurdia
	  [fix GH-276] [rubyspec:81eec89a124]

Sat Apr 13 10:20:37 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* struct.c (rb_struct_define_without_accessor, rb_struct_define),
	  (rb_struct_s_def): hide member names array.

	* struct.c (anonymous_struct, new_struct, setup_struct): split
	  make_struct() for each purpose.

Sat Apr 13 09:34:31 2013  Tanaka Akira  <akr@fsij.org>

	* lib/mkmf.rb: Add ruby/ruby.h, ruby/missing.h, ruby/intern.h,
	  ruby/st.h and ruby/subst.h for ruby_headers in generated Makefile.

	* ext/-test-/old_thread_select/depend: Update dependencies.

	* ext/-test-/wait_for_single_fd/depend: Ditto.

	* ext/bigdecimal/depend: Ditto.

	* ext/curses/depend: Ditto.

	* ext/digest/bubblebabble/depend: Ditto.

	* ext/digest/depend: Ditto.

	* ext/digest/md5/depend: Ditto.

	* ext/digest/rmd160/depend: Ditto.

	* ext/digest/sha1/depend: Ditto.

	* ext/digest/sha2/depend: Ditto.

	* ext/dl/callback/depend: Ditto.

	* ext/dl/depend: Ditto.

	* ext/etc/depend: Ditto.

	* ext/nkf/depend: Ditto.

	* ext/objspace/depend: Ditto.

	* ext/pty/depend: Ditto.

	* ext/readline/depend: Ditto.

	* ext/ripper/depend: Ditto.

	* ext/sdbm/depend: Ditto.

	* ext/socket/depend: Ditto.

	* ext/stringio/depend: Ditto.

	* ext/strscan/depend: Ditto.

	* ext/syslog/depend: Ditto.

	* ext/-test-/num2int/depend: Removed.

	* ext/dbm/depend: Ditto.

	* ext/fcntl/depend: Ditto.

	* ext/gdbm/depend: Ditto.

	* ext/racc/cparse/depend: Ditto.

Sat Apr 13 00:15:54 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/etc/etc.c (Init_etc): move Passwd and Group under Etc namespace
	  as primary names.

Fri Apr 12 21:06:55 2013  Tanaka Akira  <akr@fsij.org>

	* common.mk: pack.o depends on internal.h.

Fri Apr 12 20:59:24 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (ones): Use __builtin_popcountl if available.

	* internal.h (GCC_VERSION_SINCE): Macro moved from pack.c.

	* pack.c: Include internal.h for GCC_VERSION_SINCE.

Fri Apr 12 18:29:42 2013  Tanaka Akira  <akr@fsij.org>

	* common.mk: version.o depends on $(srcdir)/include/ruby/version.h
	  instead of {$(VPATH)}version.h to avoid confusion by VPATH between
	  top level version.h and include/ruby/version.h for build in-place.
	  [ruby-dev:47249] [Bug #8256]

Fri Apr 12 15:21:24 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_insnhelper.c (vm_callee_setup_keyword_arg): non-symbol key is not
	  a keyword argument, keep it as a positional argument.

Fri Apr 12 11:58:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* array.c: Document synonymous methods, by windwiny [GH-277]
	* bignum.c: ditto
	* complex.c: ditto
	* dir.c: ditto
	* encoding.c: ditto
	* enumerator.c: ditto
	* numeric.c: ditto
	* proc.c: ditto
	* re.c: ditto
	* string.c: ditto

Thu Apr 11 23:41:46 2013  Tanaka Akira  <akr@fsij.org>

	* common.mk: Add dependencies for include/ruby.h

	* tool/update-deps: Use "make -p all miniruby ruby golf" to extract
	  dependencies in makefiles.

Thu Apr 11 23:21:17 2013  Tanaka Akira  <akr@fsij.org>

	* tool/update-deps: Use "make -p all golf" to extract dependencies in
	  makefiles.

Thu Apr 11 21:02:19 2013  Tanaka Akira  <akr@fsij.org>

	* common.mk: Dependency updated.

	* tool/update-deps: Rewritten.

Thu Apr 11 19:59:48 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* common.mk: partially revert r40183, which breaks building on
	  other than source directory. (its commit log also says the same
	  thing, but such failure is not reproducible on my environment
	  and the commit breaks build on my environment)

Thu Apr 11 16:10:01 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/fiddle/closure.c (USE_FFI_CLOSURE_ALLOC): define 0 on
	  Mac OS X and Linux [Bug #3371]

Thu Apr 11 13:19:22 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/drb/drbtest.rb (Drb{Core,Ary}#teardown): retry Process.kill
	  if it fails with Errno::EPERM on Windows (workaround).
	  [ruby-dev:47245] [Bug #8251]

Thu Apr 11 11:11:38 2013  Akinori MUSHA  <knu@iDaemons.org>

	* dir.c: Fix a typo.

Thu Apr 11 10:39:34 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/fiddle/closure.c (USE_FFI_CLOSURE_ALLOC): add missing case:
	  RUBY_LIBFFI_MODVERSION is not defined (usually on Windows).

Thu Apr 11 09:27:04 2013  Konstantin Haase  <me@rkh.im>

	* dir.c (file_s_fnmatch): Document File::FNM_EXTGLOB flag.

Thu Apr 11 09:17:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* README: Fix typo by Benjamin Winkler [Fixes GH-281]

Thu Apr 11 06:15:51 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* regint.h: fix typo: _M_AMD86 -> _M_AMD64.

	* siphash.c: ditto.

	* st.c: ditto.

Thu Apr 11 06:09:57 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/fiddle/extconf.rb: define RUBY_LIBFFI_MODVERSION macro.

	* ext/fiddle/closure.c (USE_FFI_CLOSURE_ALLOC): define 0 or 1
	  with platform and libffi's version. [Bug #3371]

Thu Apr 11 05:30:43 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* lib/mkmf.rb (pkg_config): Add optional argument "option".
	  If it is given, it returns the result of
	  `pkg-config --<option> <pkgname>`.

Thu Apr 11 03:33:05 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/fiddle/closure.c (initialize): check mprotect's return value.
	  If mprotect is failed because of PaX or something, its function call
	  will cause SEGV.
	  http://c5664.rubyci.org/~chkbuild/ruby-trunk/log/20130401T210301Z.diff.html.gz

Wed Apr 10 17:39:13 2013  Tanaka Akira  <akr@fsij.org>

	* ext/bigdecimal/bigdecimal.c (VpCtoV): Initialize a local variable
	  even when overflow.

Wed Apr 10 12:32:37 2013  Tanaka Akira  <akr@fsij.org>

	* bignum.c (rb_ll2big): Don't overflow on signed integer negation.

	* ext/bigdecimal/bigdecimal.c (MUL_OVERFLOW_SIGNED_VALUE_P): New
	  macro.
	  (AddExponent): Don't overflow on signed integer multiplication.
	  (VpCtoV): Don't overflow on signed integer arithmetic.
	  (VpCtoV): Don't overflow on signed integer arithmetic.

Wed Apr 10 06:32:12 2013  Tanaka Akira  <akr@fsij.org>

	* internal.h (MUL_OVERFLOW_INT_P): New macro.

	* sprintf.c (GETNUM): Don't overflow on signed integer multiplication.

Tue Apr  9 20:38:20 2013  Tanaka Akira  <akr@fsij.org>

	* internal.h (MUL_OVERFLOW_SIGNED_INTEGER_P): New macro.
	  (MUL_OVERFLOW_FIXNUM_P): Ditto.
	  (MUL_OVERFLOW_LONG_P): Ditto.

	* array.c (rb_ary_product): Don't overflow on signed integer
	  multiplication.

	* numeric.c (fix_mul): Ditto.
	  (int_pow): Ditto.

	* rational.c (f_imul): Ditto.

	* insns.def (opt_mult): Ditto.

	* thread.c (sleep_timeval): Don't overflow on signed integer addition.

	* bignum.c (rb_int2big): Don't overflow on signed integer negation.
	  (rb_big2ulong): Ditto.
	  (rb_big2long): Ditto.
	  (rb_big2ull): Ditto.
	  (rb_big2ll): Ditto.

Tue Apr  9 19:45:44 2013  Tanaka Akira  <akr@fsij.org>

	* lib/open-uri.rb: Support multiple fields with same field
	  name (like Set-Cookie).
	  (OpenURI::Meta#metas): New accessor to obtain fields as a Hash from
	  field name (string) to field values (array of strings).
	  [ruby-core:37734] [Bug #4964] reported by ren li.

Tue Apr  9 15:26:12 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* compile.c (iseq_compile_each): append keyword hash to argument array
	  to splat if needed.  [ruby-core:54094] [Bug #8236]

Tue Apr  9 10:02:39 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (timestamp_file): gather timestamp files in one
	  directory from each extension directories, with considering
	  target_prefix.

Tue Apr  9 04:57:59 JST 2013  Charles Oliver Nutter  <headius@headius.com>

	* error.c: Capture EAGAIN, EWOULDBLOCK, EINPROGRESS exceptions and
	  export them for use in WaitReadable/Writable exceptions.
	* io.c: Create versions of EAGAIN, EWOULDBLOCK, EINPROGRESS that
	  include WaitReadable and WaitWritable. Add rb_readwrite_sys_fail
	  for nonblocking failures using those exceptions. Use that
	  function in io_getpartial and io_write_nonblock instead of
	  rb_mod_sys_fail
	* ext/openssl/ossl_ssl.c: Add new SSLError subclasses that include
	  WaitReadable and WaitWritable. Use those classes for
	  write_would_block and read_would_block instead of rb_mod_sys_fail.
	* ext/socket/ancdata.c: Use rb_readwrite_sys_fail instead of
	  rb_mod_sys_fail in bsock_sendmsg_internal and
	  bsock_recvmsg_internal.
	* ext/socket/init.c: Use rb_readwrite_sys_fail instead of
	  rb_mod_sys_fail in rsock_s_recvfrom_nonblock and
	  rsock_s_connect_nonblock.
	* ext/socket/socket.c: Use rb_readwrite_sys_fail instead of
	  rb_mod_sys_fail in sock_connect_nonblock.
	* include/ruby/ruby.h: Export rb_readwrite_sys_fail for use instead
	  of rb_mod_sys_fail. Introduce new constants RB_IO_WAIT_READABLE and
	  RB_IO_WAIT_WRITABLE for first arg to rb_readwrite_sys_fail.

Tue Apr  9 02:44:32 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/socket/extconf.rb: $defs needs -D or -U.  nothing is added
	  otherwize.

	* ext/socket/extconf.rb: check struct in_addr6, which is defined in
	  VC6 instead of in6_addr.

	* ext/socket/option.c (optname_to_sym): fix macro name.

	* ext/socket/constants.c (rsock_cmsg_type_arg): fix macro name.

Mon Apr  8 23:57:21 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* object.c (id_for_setter): extract common code from const, class
	  variable, instance variable setters.

Mon Apr  8 23:55:53 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/depend (ENCOBJS, TRANSOBJS): use explicit path to ruby.h for
	  nmake.

	* ext/depend (ENCOBJS, TRANSOBJS): fix header dependency, VPATH has
	  $(srcdir)/include/ruby but not $(srcdir)/include, so cannot find out
	  ruby/ruby.h.  use ruby.h instead and ../ruby for include/ruby.h.

Mon Apr  8 20:30:37 2013  Yuki Yugui Sonoda  <yugui@google.com>

	* ext/depend (ENCOBJS, TRANSOBJS): Add missing dependencies.

Mon Apr  8 17:19:28 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/win32ole/win32ole.c (fole_missing): should check actual argument
	  count before accessing.

Mon Apr  8 16:03:55 2013  Yuki Yugui Sonoda  <yugui@google.com>

	Fixes a build failure of ext/ripper/ripper.c on building out of place.
	* common.mk (id.h, id.c): Always generated in $(srcdir).
	(ext/ripper/ripper.c): Passes $(PATH_SEPARATOR) too to the sub make.

Mon Apr  8 12:05:02 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* object.c (rb_obj_ivar_set): call to_str for string only once.
	  to_str was called from rb_is_const_name and rb_to_id before.

	* object.c (rb_mod_const_set): ditto.

	* object.c (rb_mod_cvar_set): ditto.

Sun Apr  7 13:56:16 2013  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* test/ruby/test_require.rb (TestRequire#test_require_nonascii_path):
	  RUBY_PLATFORM should escape as Regexp,
	  because RUBY_PLATFORM may contain '.'.

Sun Apr  7 10:44:01 2013  Tanaka Akira  <akr@fsij.org>

	* include/ruby/defines.h: Simplify the logic to include sys/select.h.
	  This fixes a compilation error on Haiku (gcc2 and gcc4).

	* configure.in: Use shared linker as $(CC) for Haiku.
	  This fixes a build error on Haiku (gcc2).

Sun Apr  7 10:41:30 2013  Tanaka Akira  <akr@fsij.org>

	* lib/resolv.rb (MDNSOneShot#sender): Delete an unused variable.

Sun Apr  7 03:24:36 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* addr2line.c: use more generic type:
	  * u_char -> unsigned char
	  * u_short -> unsigned short
	  * u_int -> unsigned int
	  * u_long -> unsigned long
	  * quad_t -> int64_t
	  * u_quad_t -> uint64_t

	* addr2line.c (imax): inline is defined by configure.

Sun Apr  7 01:40:39 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-electric.el (ruby-electric-hash): New electric
	  function that expands a hash sign inside a string or regexp to
	  "#{}".

	* misc/ruby-electric.el (ruby-electric-curlies): Do not insert
	  spaces inside when the curly brace is a delimiter of %r, %w,
	  etc.

	* misc/ruby-electric.el (ruby-electric-curlies): Insert another
	  space before a closing curly brace when
	  ruby-electric-newline-before-closing-bracket is nil.

Sun Apr  7 01:01:26 2013  Tanaka Akira  <akr@fsij.org>

	* strftime.c (rb_strftime_with_timespec): Test yday range.
	  [ruby-core:44088] [Bug #6247] reported by Ruby Submit.

Sat Apr  6 23:46:54 2013  Naohisa Goto  <ngotogenome@gmail.com>

	* configure.in (AC_CHECK_HEADERS): atomic.h for Solaris atomic_ops.

	* ruby_atomic.h: Skip using Solaris10 atomic_ops on Solaris 9 or
	  earlier if atomic.h is not available. [ruby-dev:47229] [Bug #8228]

Sat Apr  6 23:40:40 2013  Tanaka Akira  <akr@fsij.org>

	* lib/resolv.rb: Support LOC resources.
	  [ruby-core:23361] [Feature #1436] by JB Smith.

Sat Apr  6 23:38:09 2013  Naohisa Goto  <ngotogenome@gmail.com>

	* addr2line.c: quad_t and u_quad_t is not available on Solaris.
	  __inline is not available with old compilers on Solaris.
	  [ruby-dev:47229] [Bug #8227]

Sat Apr  6 23:31:38 2013  Tanaka Akira  <akr@fsij.org>

	* lib/resolv.rb: Add one-shot multicast DNS support.
	  [ruby-core:53387] [Feature #8089] by Eric Hodel.

Sat Apr  6 22:12:01 2013  Tanaka Akira  <akr@fsij.org>

	* lib/resolv.rb (Resolv::DNS.fetch_resource): New method to obtain
	  full result.
	  [ruby-dev:43587] [Feature #4788] proposed by Makoto Kishimoto.

Sat Apr  6 20:17:51 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/socket.c (rsock_sys_fail_raddrinfo): Renamed from
	  rsock_sys_fail_addrinfo.
	  (rsock_sys_fail_raddrinfo_or_sockaddr): Renamed from
	  rsock_sys_fail_addrinfo_or_sockaddr.

	* ext/socket/rubysocket.h: Follow the above change.

Sat Apr  6 19:24:59 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/socket.c (rsock_sys_fail_sockaddr): Takes struct sockaddr
	  and socklen_t instead of String object.
	  (rsock_sys_fail_addrinfo_or_sockaddr): Follow the above change.

	* ext/socket/rubysocket.h (rsock_sys_fail_sockaddr): Follow the above
	  change.

Sat Apr  6 14:28:23 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/rubysocket.h (SockAddrStringValueWithAddrinfo): New macro.
	  (rsock_sockaddr_string_value_with_addrinfo): New declaration.
	  (rsock_addrinfo_inspect_sockaddr): Ditto.
	  (rsock_sys_fail_addrinfo): Ditto.
	  (rsock_sys_fail_sockaddr_or_addrinfo): Ditto.

	* ext/socket/raddrinfo.c (rsock_addrinfo_inspect_sockaddr): Renamed
	  from addrinfo_inspect_sockaddr and exported.
	  (rsock_sockaddr_string_value_with_addrinfo): New function to obtain
	  string and possibly addrinfo object.

	* ext/socket/socket.c (rsock_sys_fail_sockaddr): Don't use
	  rsock_sys_fail_host_port which is IP dependent.  Invoke
	  rsock_sys_fail_addrinfo.
	  (rsock_sys_fail_addrinfo): New function using
	  rsock_addrinfo_inspect_sockaddr.
	  (rsock_sys_fail_addrinfo_or_sockaddr): New function.
	  (sock_connect): Use SockAddrStringValueWithAddrinfo and
	  rsock_sys_fail_addrinfo_or_sockaddr.
	  (sock_connect_nonblock): Ditto.
	  (sock_bind): Ditto.

Sat Apr  6 13:34:20 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/socket.c (rsock_sys_fail_sockaddr): Delete 2nd argument.

	* ext/socket/rubysocket.h (rsock_sys_fail_sockaddr): Follow above
	  change.

Sat Apr  6 13:13:39 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/socket.c (rsock_sys_fail_path): Use rb_str_inspect only
	  for String to avoid SEGV.

Sat Apr  6 12:40:16 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/rubysocket.h (rsock_sys_fail_host_port): Wrap by NORETURN.
	  (rsock_sys_fail_path): Ditto.
	  (rsock_sys_fail_sockaddr): Ditto.

Sat Apr  6 11:49:35 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/socket.c (rsock_sys_fail_path): Use rb_str_inspect if the
	  path contains a NUL.

Sat Apr  6 11:39:19 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket: Improve socket exception message to show socket address.
	  [ruby-core:45617] [Feature #6583] proposed Eric Hodel.

	* ext/socket/rubysocket.h (rsock_sys_fail_host_port): Declared.
	  (rsock_sys_fail_path): Ditto.
	  (rsock_sys_fail_sockaddr): Ditto.

	* ext/socket/udpsocket.c (udp_connect): Use rsock_sys_fail_host_port.
	  (udp_bind): Ditto.
	  (udp_send): Ditto.

	* ext/socket/init.c (rsock_init_sock): Specify a string for rb_sys_fail
	  argument.
	  (make_fd_nonblock): Ditto.
	  (rsock_s_accept): Ditto.

	* ext/socket/ipsocket.c (init_inetsock_internal): Use
	  rsock_sys_fail_host_port.

	* ext/socket/socket.c (rsock_sys_fail_host_port): Defined.
	  (rsock_sys_fail_path): Ditto.
	  (rsock_sys_fail_sockaddr): Ditto.
	  (setup_domain_and_type): Use rsock_sys_fail_sockaddr.
	  (sock_connect_nonblock): Ditto.
	  (sock_bind): Ditto.
	  (sock_gethostname): Specify a string for rb_sys_fail argument.
	  (socket_s_ip_address_list): Ditto.

	* ext/socket/basicsocket.c (bsock_shutdown): Specify a string for
	  rb_sys_fail argument.
	  (bsock_setsockopt): Use rsock_sys_fail_path.
	  (bsock_getsockopt): Ditto.
	  (bsock_getpeereid): Refine the argument for rb_sys_fail.

	* ext/socket/unixsocket.c (rsock_init_unixsock): Use
	  rsock_sys_fail_path.
	  (unix_path): Ditto.
	  (unix_send_io): Ditto.
	  (unix_recv_io): Ditto.
	  (unix_addr): Ditto.
	  (unix_peeraddr): Ditto.

Sat Apr  6 11:23:18 2013  Hiroshi Shirosaki  <h.shirosaki@gmail.com>

	* test/ruby/test_require.rb (TestRequire#test_require_nonascii_path):
	  fix load path for encoding to run the test as stand-alone.

Sat Apr  6 09:54:20 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* pack.c (NATINT_LEN): fix definition order, must be after
	  NATINT_PACK.

Sat Apr  6 03:11:07 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych/visitors/yaml_tree.rb: fix symbol keys in coder
	  emission.  Thanks @tjwallace
	* test/psych/test_coder.rb: test for change

Sat Apr  6 02:54:08 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych/exception.rb: there should be only one exception
	  base class. Fixes tenderlove/psych #125
	* ext/psych/lib/psych.rb: require the correct exception class
	* ext/psych/lib/psych/syntax_error.rb: ditto
	* ext/psych/lib/psych/visitors/to_ruby.rb: ditto

Sat Apr  6 02:30:28 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (new_defined): remove all extra parentheses, and return
	  "nil" for defined? with empty expression.
	  [ruby-core:54024] [Bug #8224]

Sat Apr  6 02:06:04 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* ext/psych/lib/psych/visitors/to_ruby.rb: correctly register
	  self-referential strings. Fixes tenderlove/psych #135

	* test/psych/test_string.rb: appropriate test.

Sat Apr  6 01:21:56 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/init.c (cloexec_accept): Fix a compile error on
	  Debian GNU/kFreeBSD.  Consider HAVE_ACCEPT4 is defined
	  but SOCK_CLOEXEC is not defined.

Sat Apr  6 00:19:30 2013  Hiroshi Shirosaki  <h.shirosaki@gmail.com>

	* load.c (features_index_add): use rb_str_subseq() to specify C string
	  position properly to fix require non ascii path.
	  [ruby-core:53733] [Bug #8165]

	* test/ruby/test_require.rb (TestRequire#test_require_nonascii_path):
	  a test for the above.

Fri Apr  5 20:41:49 2013  Tanaka Akira  <akr@fsij.org>

	* include/ruby/defines.h (HAVE_TRUE_LONG_LONG): Defined to distinguish
	  availability of long long and availability of 64bit integer type.

	* pack.c: Use HAVE_TRUE_LONG_LONG to distinguish q! and Q! support.

Fri Apr  5 20:19:42 2013  Tanaka Akira  <akr@fsij.org>

	* addr2line.c: Include ruby/missing.h to fix compile error on Debian.

Fri Apr  5 19:39:52 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* compile.c (iseq_compile_each): fix of defined? with empty
	  expression.  [ruby-core:53999] [Bug #8220]

Fri Apr  5 13:22:59 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/curses/curses.c (Init_curses): fix implementation function,
	  crmode should be same as cbreak.  [ruby-core:54013] [Bug #8222]

Fri Apr  5 12:06:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/curses/hello.rb: Typo in Curses example by Drew Blas
	  [Fixes GH-273]

Thu Apr  4 23:45:13 2013  Tanaka Akira  <akr@fsij.org>

	* lib/resolv.rb (bind_random_port): Rescue EACCES for SunOS.
	  bind() on SunOS for port 2049 (nfs) and 4045 (lockd) causes
	  EACCES with unprivileged process.  cf. PRIV_SYS_NFS in privileges(5)
	  [ruby-core:48064] [Bug #7183] reported by Frank Meier.

Thu Apr  4 23:24:45 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: Remove condition for bcc.

Thu Apr  4 22:53:23 2013  Tanaka Akira  <akr@fsij.org>

	* include/ruby/ruby.h (FIX2LONG): Parenthesize the macro body.

Thu Apr  4 22:32:32 2013  Tanaka Akira  <akr@fsij.org>

	* time.c (time_strftime): Describe %L and %N truncates digits under
	  the specified length.
	  [ruby-core:52130] [Bug #7829]

Thu Apr  4 22:08:46 2013  Tanaka Akira  <akr@fsij.org>

	* object.c (rb_mod_cvar_set): Reverted "avoid inadvertent
	  symbol creation" to avoid SEGV by
	  Class.new.class_variable_set(1, 2).

Thu Apr  4 20:07:19 2013  Tanaka Akira  <akr@fsij.org>

	* ext/pathname/pathname.c (path_write): New method.
	  (path_binwrite): Ditto.
	  [ruby-core:49468] [Feature #7378]

Thu Apr  4 16:51:29 2013  Yuki Yugui Sonoda  <yugui@google.com>

	* thread_pthread.c: Fixes wrong scopes of #if USE_SLEEPY_TIMER_THREAD
	  .. #endif sections.  This fixes a build error on NativeClient.

Wed Apr  3 17:25:31 2013  Yuki Yugui Sonoda  <yugui@google.com>

	* thread_pthread.c (ruby_init_stack): Avoid using uninitialized value.
	  stackaddr and size are not set if get_stack() fails.

Thu Apr  4 16:55:08 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* struct.c (make_struct): avoid inadvertent symbol creation.
	  (rb_struct_aref): ditto.
	  (rb_struct_aset): ditto.

Thu Apr  4 16:54:40 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* object.c (rb_mod_const_set): avoid inadvertent symbol creation.
	  (rb_obj_ivar_set): ditto.
	  (rb_mod_cvar_set): ditto.

Thu Apr  4 15:46:48 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enum.c (enum_inject): avoid inadvertent symbol creation.

Thu Apr  4 14:37:07 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* thread.c (rb_thread_aref): avoid inadvertent symbol creation.
	  (rb_thread_variable_get): ditto.
	  (rb_thread_key_p): ditto.
	  (rb_thread_variable_p): ditto.

Thu Apr  4 11:33:57 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/openssl/ossl_bn.c (ossl_bn_to_i): Use bn2hex to speed up.
	  In general, binary to/from decimal needs extra cost.

Thu Apr  4 07:24:18 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: Specify arguments to test functions.

Thu Apr  4 03:25:09 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/openssl/ossl_bn.c (ossl_bn_initialize): fix can't create from bn.

Wed Apr  3 22:09:25 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: Test functions and libraries after headers.

Wed Apr  3 21:23:29 2013  Tanaka Akira  <akr@fsij.org>

	 * io.c (rb_io_seek_m): Accept :CUR, :END, :SET as "whence" argument.
	   (interpret_seek_whence): New function.
	   [ruby-dev:45818] [Feature #6643]

Wed Apr  3 20:52:49 2013  Tanaka Akira  <akr@fsij.org>

	* process.c: Describe the behavior which Ruby invokes a commandline
	  directly without shell if the commandline is simple enough.
	  [ruby-core:50459] [Bug #7489]

Wed Apr  3 20:27:37 2013  Tanaka Akira  <akr@fsij.org>

	* ext/extmk.rb (extmake): Invoke Logging::log_close in a ensure
	  clause.

Wed Apr  3 18:53:58 2013  Tanaka Akira  <akr@fsij.org>

	* ext/extmk.rb (extmake): Use Logging.open to switch stdout and
	  stderr.  Delay Logging::log_close until the failure message is
	  written.  Write the failure message only if log file is opened.

	* lib/mkmf.rb (Logging.log_opened?): New method.

	  [ruby-dev:47215] [Bug #8209]

Wed Apr  3 17:11:15 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/win32.c (constat_apply): pass through unknown sequence which
	  starts with ESC but is not followed by a bracket.  [ruby-core:53879]
	  [Bug #8201]

Wed Apr  3 16:35:32 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* bignum.c (rb_big_eq): hide intermediate Bignums not just freeing
	  memory.  [ruby-core:53893] [Bug #8204]

	* object.c (rb_obj_hide): hide an object by clearing klass.

	* bignum.c (rb_big_eq): test as Fixnum if possible and get rid of zero
	  length Bignum.  [ruby-core:53893] [Bug #8204]

Tue Apr  2 23:56:03 2013  Tanaka Akira  <akr@fsij.org>

	* lib/securerandom.rb (SecureRandom.random_bytes): Use
	  OpenSSL::Random.random_add instead of OpenSSL::Random.seed and
	  specify 0.0 as the entropy.
	  [ruby-core:47308] [Bug #6928]

Tue Apr  2 20:24:52 2013  Tanaka Akira  <akr@fsij.org>

	* pack.c: Support Q! and q! for long long.
	  (natstr): Moved to toplevel.  Add q and Q if there is long long type.
	  (endstr): Moved to toplevel.
	  (NATINT_PACK): Consider long long.
	  (NATINT_LEN_Q): New macro.
	  (pack_pack): Support Q! and q!.
	  (pack_unpack): Ditto.
	  [ruby-dev:43970] [Feature #3946]

Tue Apr  2 19:24:26 2013  Tanaka Akira  <akr@fsij.org>

	* ext/-test-/num2int/num2int.c: Define utility methods
	  as module methods of Num2int.

	* test/-ext-/num2int/test_num2int.rb: Follow the above change.

Tue Apr  2 18:49:01 2013  Tanaka Akira  <akr@fsij.org>

	* lib/securerandom.rb: Don't use Array#to_s.
	   [ruby-core:52058] [Bug #7811] fixed by zzak (Zachary Scott).

Tue Apr  2 17:38:20 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* re.c (rb_reg_to_s): suppress duplicated charclass warning.
	  Regexp#to_s suppress extra its whole regexp options by calling
	  onig_new with its source, but it doesn't call rb_reg_preprocess.
	  Therefore its Unicode escapes (\u{XXXX}) are given as is,
	  and it may cause duplicated charclass warning for example
	  "[\u{33}]" (3 is duplicated) or "[\u{a}\u{b}]" (u is duplicated).
	  [ruby-core:53649] [Bug #8151]

Tue Apr  2 16:00:06 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* vm_dump.c (rb_print_backtrace): separate to ease showing C backtrace.

	* internal.h (rb_print_backtrace): ditto.

Tue Apr  2 15:22:09 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* test/ruby/envutil.rb (assert_separately): stop_auto_run of
	  Test::Unit::Runner to prevent auto runner use ARGV.

	* test/ruby/envutil.rb (assert_separately): add $: to separate process.

	* test/ruby/envutil.rb (assert_separately): fail if stderr is not
	  empty and ignore_stderr is false.

Tue Apr  2 06:46:59 2013  Tanaka Akira  <akr@fsij.org>

	* ext/-test-/num2int/num2int.c: Rename utility methods
	  to global functions to ease manual experiments.

	* test/-ext-/num2int/test_num2int.rb: Follow the above change.

Mon Apr  1 22:26:17 2013  Tanaka Akira  <akr@fsij.org>

	* ext/zlib/zlib.c (rb_gzfile_set_mtime): Use NUM2UINT.
	  The old logic doesn't work well on LP64 platforms as:
	  .. -2**63-1 => error,
	  -2**63 .. -2**62-1 => success,
	  -2**62 .. -2**31-1 => error,
	  -2**31 .. 2**31-1 => success,
	  2**31 .. 2**62-1 => error,
	  2**62 .. 2**64-1 => success,
	  2**64 ..  => error.

Mon Apr  1 22:08:02 2013  Benoit Daloze  <eregontp@gmail.com>

	* ext/zlib/zlib.c (Zlib::Inflate.new):
	  Fix documentation syntax and naming errors.
	  Based on patch by Robin Dupret. Fix GH-271.

Mon Apr  1 21:22:31 2013  Tanaka Akira  <akr@fsij.org>

	* test/-ext-/num2int/test_num2int.rb: Test small bignums.

Mon Apr  1 21:10:56 2013  Tanaka Akira  <akr@fsij.org>

	* numeric.c (rb_num2ulong_internal): Don't cast a negative double value
	  into unsigned long, which is undefined behavior.
	  (rb_num2ull): Don't cast a value bigger than LLONG_MAX into
	  long long, which is undefined behavior.

Mon Apr  1 20:57:57 2013  Tanaka Akira  <akr@fsij.org>

	* ext/-test-/num2int/num2int.c: Return string for result, instead of
	  printing.

	* test/-ext-/num2int/test_num2int.rb: updated to follow above change.

Mon Apr  1 20:08:07 2013  Tanaka Akira  <akr@fsij.org>

	* numeric.c (rb_num2long): Don't use SIGNED_VALUE uselessly.
	  (check_int): Ditto.
	  (check_short): Ditto.
	  (rb_num2fix): Ditto.
	  (rb_num2ulong_internal): Add a cast.

Mon Apr  1 18:41:35 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: skip autoconf 2.64 and 2.66, 2.67 seems short-lived
	  but stick on it for Debian Squeeze.

Mon Apr  1 14:22:52 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: check clang version by predefined macro values.
	  [Bug #8192]

Mon Apr  1 12:05:15 2013  Tanaka Akira  <akr@fsij.org>

	* numeric.c (check_uint): Take the 1st argument as unsigned long,
	  instead of VALUE.  Refine the validity test conditions.
	  (check_ushort): Ditto.

Mon Apr  1 07:15:03 2013  Ayumu AIZAWA  <ayumu.aizawa@gmail.com>

	* configure.in: use quadrigraph to put '[' or ']'. [Bug #8192]

Mon Apr  1 04:16:41 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* configure.in: kick old clang. [ruby-dev:47204] [Bug #8192]

Mon Apr  1 01:12:46 2013  Tanaka Akira  <akr@fsij.org>

	* include/ruby/ruby.h (FIX2ULONG): Make it consistent with NUM2ULONG.

	* ext/-test-/num2int/num2int.c: Add utility methods for FIX2XXX tests.

	* test/-ext-/num2int/test_num2int.rb: Add tests for FIX2XXX.

Sun Mar 31 17:17:56 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* proc.c (rb_mod_define_method): consider visibility in define_method.
	  patch by mashiro <mail AT mashiro.org>.  fix GH-268.

Sun Mar 31 15:40:30 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/configure.bat: try to fix option arguments split by commas and
	  equals here.  this batch file no longer run with old command.com.

	* tool/mkconfig.rb: no hacks for cmd.exe.

Sun Mar 31 13:47:04 2013  Tanaka Akira  <akr@fsij.org>

	* numeric.c (rb_num2ulong_internal): New function similar to
	  rb_num2ulong but integer wrap around flag is also returned.
	  (rb_num2ulong): Use rb_num2ulong_internal.
	  (rb_num2uint): Use rb_num2ulong_internal and the wrap around flag is
	  used instead of negative_int_p(val).
	  (rb_num2ushort): ditto.

Sun Mar 31 06:27:17 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* class.c (HAVE_METACLASS_P): should check FL_SINGLETON flag before get
	  instance variable to get rid of wrong warning about __attached__.
	  [ruby-core:53839] [Bug #8188]

Sat Mar 30 14:11:28 2013  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* bcc32: removed. agreed at
	  http://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20130223Japan

Sat Mar 30 03:58:00 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/file.c (code_page): use cp1252 instead of cp20127 as US-ASCII.
	  fix [ruby-core:53079] [Bug #7996]
	  reported and patched by mmeltner (Michael Meltner).

Sat Mar 30 03:49:21 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* win32/win32.c (wrename): use MoveFileExW instead of MoveFileW,
	  because the latter fails on cross device file move of some
	  environments.
	  fix [ruby-core:53492] [Bug #8109]
	  reported by mitchellh (Mitchell Hashimoto).

Fri Mar 29 22:09:46 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* thread.c (rb_mutex_synchronize_m): yield no block params.  patch by
	  splattael (Peter Suschlik) in [ruby-core:53773] [Bug #8097].
	  fix GH-266.

Fri Mar 29 16:51:39 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* io.c (argf_next_argv): set init flag if succeeded to forward, after
	  skipping.

	* io.c (argf_block_call_i, argf_block_call): no more forwarding if
	  forwarded after skipping.  [ruby-list:49185]

	* io.c (argf_close): deal with init flag.

	* io.c (argf_block_call_i, argf_block_call): forward next file if
	  skipped while iteration, to get rid of IOError.  [ruby-list:49185]

Fri Mar 29 11:09:48 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (configuration): not include all CFLAGS in CXXFLAGS, to
	  use different set than C for C++.  [ruby-core:45273] [Bug #6504]

Fri Mar 29 10:24:10 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/io.h: undef POSIX compliant names on AIX, which are no
	  longer needed.  patch suggested by edelsohn (David Edelsohn) in
	  [ruby-core:53815].  [Bug #8174]

Fri Mar 29 06:39:42 2013  Tanaka Akira  <akr@fsij.org>

	* numeric.c (rb_num2ull): Cast double to unsigned LONG_LONG via
	  LONG_LONG instead of double to unsigned LONG_LONG directly.
	  This is a challenge to fix a test_num2ull(TestNum2int)
	  failure (NUM2ULL(-1.0) should be "18446744073709551615" but was "0")
	  on Mac OS X with 32bit clang.
	  http://a.mrkn.jp/~mrkn/chkbuild/mountain_lion/ruby-trunk-m32-o0/log/20130328T191100Z.diff.html.gz

Fri Mar 29 00:54:54 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (MAIN_DOES_NOTHING): ensure symbols for tests to be
	  preserved.  [ruby-core:53745] [Bug #8169]

Thu Mar 28 23:11:25 2013  Tanaka Akira  <akr@fsij.org>

	* lib/resolv.rb: Test Windows platform by detecting LoadError when
	  require 'win32/resolv' suggested by Nobuyoshi Nakada [ruby-core:53389].
	  [ruby-core:53388] [Feature #8090] Reported by Charles Nutter.

Thu Mar 28 23:10:10 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/io.h: rename SVR3,4 member names as POSIX compliant,
	  to get rid of conflict on AIX.  [ruby-core:53765] [Bug #8174]

Thu Mar 28 18:22:21 2013  Tanaka Akira  <akr@fsij.org>

	* test/-ext-/num2int/test_num2int.rb: extract
	  assert_num2i_success_internal and assert_num2i_error_internal and
	  provide assertion messages as "NUM2XXX(NNN)".

Thu Mar 28 07:05:25 2013  Tanaka Akira  <akr@fsij.org>

	* include/ruby/intern.h: Delete redundant inclusions caused by
	  AC_INCLUDES_DEFAULT in defines.h.

	* include/ruby/defines.h: Ditto.

	* include/ruby/ruby.h: Ditto.

	* include/ruby/st.h: Ditto.

Thu Mar 28 06:51:31 2013  Tanaka Akira  <akr@fsij.org>

	* include/ruby/defines.h: Fix a compilation error on NetBSD,
	  "type of formal parameter 1 is incomplete" for the rb_thread_wait_for
	  invocation in rb_file_flock, by including header files as
	  AC_INCLUDES_DEFAULT of autoconf.

Wed Mar 27 22:09:14 2013  Tanaka Akira  <akr@fsij.org>

	* numeric.c (LONG_MIN_MINUS_ONE_IS_LESS_THAN): New macro.
	  (LLONG_MIN_MINUS_ONE_IS_LESS_THAN): Ditto.
	  (rb_num2long): Use LONG_MIN_MINUS_ONE_IS_LESS_THAN.
	  (rb_num2ulong): Ditto.
	  (rb_num2ll): Use LLONG_MIN_MINUS_ONE_IS_LESS_THAN.
	  (rb_num2ull): Ditto.

	* test/-ext-/num2int/test_num2int.rb (assert_num2i_success): Test the
	  value converted into a Float if Float can represent the value
	  exactly.
	  (assert_num2i_error): Ditto.

Wed Mar 27 20:59:47 2013  Tanaka Akira  <akr@fsij.org>

	* test/-ext-/num2int/test_num2int.rb (assert_num2i_success): New
	  utility method.
	  (assert_num2i_error): Ditto.

Wed Mar 27 20:37:59 2013  Tanaka Akira  <akr@fsij.org>

	* time.c (num_exact): Use to_r method only if to_int method is
	  available.
	  [ruby-core:53764] [Bug #8173] Reported by Hiro Asari.

Wed Mar 27 12:07:40 2013  Tanaka Akira  <akr@fsij.org>

	* test/-ext-/num2int/test_num2int.rb (test_num2ll): test LLONG_MIN,
	  not LONG_MIN.

Wed Mar 27 12:02:45 2013  Tanaka Akira  <akr@fsij.org>

	* internal.h (TIMET_MAX_PLUS_ONE): definition simplified.

Wed Mar 27 06:39:41 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (MAIN_DOES_NOTHING): force to refer symbols for tests
	  to be preserved.  [ruby-core:53745] [Bug #8169]

Wed Mar 27 05:15:37 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (RUBY_REPLACE_TYPE): define SIGNEDNESS_OF_type same as
	  check_signedness of mkmf.rb.

	* internal.h (TIMET_MAX, TIMET_MIN, TIMET_MAX_PLUS_ONE): use
	  SIGNEDNESS_OF_TIME_T.

Wed Mar 27 00:28:45 2013  Tanaka Akira  <akr@fsij.org>

	* internal.h (TIMET_MAX_PLUS_ONE): Defined.

	* thread.c (double2timeval): Saturate out-of-range values.

Tue Mar 26 23:41:18 2013  Tanaka Akira  <akr@fsij.org>

	* internal.h: Define TIMET_MAX and TIMET_MIN here.

	* time.c: Remove TIMET_MAX and TIMET_MIN definitions.

	* thread.c: Ditto.

	* thread_pthread.c: Remove TIMET_MAX definition.

	* thread_win32.c: Ditto.

Tue Mar 26 22:31:10 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/socket.c (sockaddr_len): return the shortest length for
	  unknown socket address.

Tue Mar 26 22:14:46 2013  Tanaka Akira  <akr@fsij.org>

	* thread.c (double2timeval): convert the infinity to TIME_MAX to avoid
	  SEGV by Thread.new {}.join(Float::INFINITY) on
	  Debian GNU/Linux (amd64).

Mon Mar 25 07:09:20 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rinda/tuplespace.rb:  Only return tuple entry once on move,
	  either through port or regular return, not both.  This results in a
	  120% speedup when combined with #8125.  Patch by Joel VanderWerf.
	  [ruby-trunk - Feature #8119]

Mon Mar 25 06:59:01 2013  Eric Hodel  <drbrain@segment7.net>

	* test/rinda/test_rinda.rb:  Skip IPv6 tests if no IPv6 addresses
	  exist.  Skip fork-dependent test if fork is not available.
	  [ruby-trunk - Bug #8159]

Sun Mar 24 10:38:24 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* addr2line.c (putce): suppress unused return value warning.

Mon Mar 25 02:01:03 2013  Narihiro Nakamura  <authornari@gmail.com>

	* proc.c (bm_free): need to clean up the mark flag of a free and
	  unlinked method entry. [Bug #8100] [ruby-core:53439]

Sun Mar 24 22:13:51 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* string.c (rb_str_rpartition): revert r39903, and convert byte offset
	  to char offset; the return value of rb_reg_search is byte offset,
	  but other than it of rb_str_rpartition expects char offset.
	  [Bug #8138] [ruby-dev:47183]

Sun Mar 24 18:29:46 2013  Akinori MUSHA  <knu@iDaemons.org>

	* string.c (rb_str_rpartition): Fix String#rpartition(/re/)
	  against a multibyte string. [Bug #8138] [ruby-dev:47183]

Sun Mar 24 13:42:24 2013  Narihiro Nakamura  <authornari@gmail.com>

	* gc.c (GC_ENABLE_LAZY_SWEEP): new macro to switch lazy sweeping
	  for debugging. [Feature #8024] [ruby-dev:47135]

Sun Mar 24 12:55:47 2013  Narihiro Nakamura  <authornari@gmail.com>

	* gc.c: We have no chance to expand the heap when lazy sweeping is
	  restricted. So collecting is often invoked if there is not
	  enough free space in the heap. Try to expand heap when this is
	  the case.

Sun Mar 24 11:03:31 2013  Tanaka Akira  <akr@fsij.org>

	* test/ruby/test_require.rb: Remove temporally files in the tests.

	* test/ruby/test_rubyoptions.rb: Ditto.

	* test/logger/test_logger.rb: Ditto.

	* test/psych/test_psych.rb: Ditto.

	* test/readline/test_readline.rb: Ditto.

	* test/syslog/test_syslog_logger.rb: Ditto.

	* test/webrick/test_httpauth.rb: Ditto.

	* test/zlib/test_zlib.rb: Ditto.

Sun Mar 24 05:36:29 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rinda/ring.rb:  Added documentation for multicast support.

	* NEWS:  Point to above documentation.

Sun Mar 24 05:32:39 2013  Eric Hodel  <drbrain@segment7.net>

	* test/rinda/test_rinda.rb:  Restore tests commented out while fixing
	  test slowdown bug before r39895.

Sun Mar 24 05:03:36 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rinda/ring.rb:  Add multicast support to Rinda::RingFinger and
	  Rinda::RingServer.  [ruby-trunk - Bug #8073]
	* test/rinda/test_rinda.rb:  Test for the above.

	* NEWS: Update with Rinda multicast support

Sun Mar 24 04:13:27 2013  Eric Hodel  <drbrain@segment7.net>

	* test/rinda/test_rinda.rb:  Fixed test failures in r39890 and r39891
	  due to stopping DRb service.

Sun Mar 24 03:34:02 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rinda/rinda.rb:  Fixed loss of tuple when remote is alive but the
	  call stack was unwound.  Patch by Joel VanderWerf.
	  [ruby-trunk - Bug #8125]
	* test/rinda/test_rinda.rb:  Test for the above.

Sun Mar 24 02:14:53 2013  Tanaka Akira  <akr@fsij.org>

	* test/mkmf/test_have_macro.rb: remove temporally files in the tests.

Sat Mar 23 23:50:04 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* addr2line.c (kprintf): added from FreeBSD libstand's printf.
	  this is consided as async signal safe function.

	* addr2line.c (rb_dump_backtrace_with_lines): use kfprintf.
	  [Bug #8144] [ruby-core:53632]

Sat Mar 23 23:28:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.c (BigDecimal_divide): Use Qnil and NIL_P
	  instead of (VALUE)0 as a return value.

	* ext/bigdecimal/bigdecimal.c (BigDecimal_div): ditto.

	* ext/bigdecimal/bigdecimal.c (BigDecimal_divremain): ditto.

	* ext/bigdecimal/bigdecimal.c (BigDecimal_remainder): ditto.

Sat Mar 23 17:39:49 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_eval.c (check_funcall_respond_to): preserve passed_block, which
	  is modified in vm_call0_body() via vm_call0(), and caused a bug of
	  rb_check_funcall() by false negative result of rb_block_given_p().
	  re-fix [ruby-core:53650] [Bug #8153].
	  [ruby-core:53653] [Bug #8154]

Fri Mar 22 17:48:34 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/forwardable.rb (Forwardable::FILE_REGEXP): create regexp object
	  outside sources for eval, to reduce allocations in def_delegators
	  wrappers.  //o option does not make each regexps shared.  patch by
	  tmm1 (Aman Gupta) in [ruby-core:53620] [Bug #8143].

Fri Mar 22 17:38:42 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* load.c (rb_feature_p), vm_core.h (rb_vm_struct): turn
	  loaded_features_index into st_table.  patches by tmm1 (Aman Gupta)
	  in [ruby-core:53251] and [ruby-core:53274] [Bug #8048]

Fri Mar 22 10:29:00 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/bigdecimal/bigdecimal.c: Fix style.

Fri Mar 22 05:30:49 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (ambiguous_operator): refine warning message, since this
	  warning is shown after literal too.

Fri Mar 22 04:51:14 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_insnhelper.c (vm_callee_setup_keyword_arg): should check required
	  keyword arguments even if rest hash is defined.  [ruby-core:53608]
	  [Bug #8139]

Fri Mar 22 01:00:17 2013  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* process.c (rb_execarg_addopt, run_exec_pgroup): use rb_pid_t
	  instead of pid_t.

	* ext/pty/pty.c (raise_from_check, pty_check): ditto.

Fri Mar 22 00:04:15 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* addr2line.c (rb_dump_backtrace_with_lines): output line at once.

Thu Mar 21 23:17:08 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* thread.c (ruby_kill): get rid of deadlock on signal 0.
	  [ruby-dev:47182] [Bug #8137]

Thu Mar 21 22:39:46 2013  Naohisa Goto  <ngotogenome@gmail.com>

	* marshal.c (marshal_dump, marshal_load): workaround for segv on
	  Intel Solaris compiled with Oracle SolarisStudio 12.3.
	  Partly revert r38174. [ruby-core:52042] [Bug #7805]

Thu Mar 21 16:48:06 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (simple_re_meta): escape all closing characters, not only
	  round parenthesis.  [ruby-core:53578] [Bug #8133]

Thu Mar 21 13:50:46 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_core.h (UNINITIALIZED_VAR): suppress warnings by clang 4.2.
	  [ruby-core:51742] [Bug #7756]

Thu Mar 21 07:34:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/date/date_core.c: Typo in Date::MONTHNAMES by Matt Gauger
	  [GH fixes #261]

Wed Mar 20 22:53:14 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (find_library): fix to format message.
	  [ruby-core:53568] [Bug #8130]

Wed Mar 20 22:52:52 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (install_dirs, with_destdir): prefix with DESTDIR
	  directories to install only unless bundled extension libraries.
	  [ruby-core:53502] [Bug #8115]

Wed Mar 20 17:47:53 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/win32ole/test_err_in_callback.rb (TestErrInCallBack#setup):
	  allow using different root for source and build directories.
	  this may fixes a minor problem of r39834.

Wed Mar 20 16:40:48 2013  Hiroshi Shirosaki  <h.shirosaki@gmail.com>

	* test/ruby/test_signal.rb (test_hup_me): skip if HUP isn't supported.
	  On Windows this test causes ArgumentError.

Wed Mar 20 16:24:12 2013  Hiroshi Shirosaki  <h.shirosaki@gmail.com>

	* test/rubygems/test_gem_installer.rb (test_install_extension_flat):
	  use ruby in build directory in case ruby is not installed.
	  [ruby-core:53265] [Bug #8058]

Wed Mar 20 15:22:07 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/win32ole/test_err_in_callback.rb (TestErrInCallBack#setup): use
	  relative path to get rid of "too long commandline" error.

Wed Mar 20 04:27:42 2013  Ayumu AIZAWA  <ayumu.aizawa@gmail.com>

	* test/rinda/test_rinda.rb: remove unused variables.
	  patched by Vipul A M <vipulnsward@gmail.com>

Wed Mar 20 04:15:32 2013  Ayumu AIZAWA  <ayumu.aizawa@gmail.com>

	* ext/bigdecimal/bigdecimal.c: fixed typo.
	  patched by Vipul A M <vipulnsward@gmail.com>

Sat Mar 16 03:40:49 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* test/ruby/test_signal.rb (test_hup_me): added a few comments.

Sat Mar 16 03:39:38 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* thread.c (ruby_kill): added a few comments.

Sat Mar 16 03:36:56 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* thread.c (ruby_kill): release GVL while waiting signal delivered.

Tue Mar 19 19:50:48 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ruby_kill (internal.h, thread.c): use rb_pid_t instead of pid_t.
	  this fixes the build failure of mswin introduced at r39819.

Tue Mar 19 17:09:30 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* string.c (rb_str_conv_enc_opts): convert with one converter, instead
	  of re-creating converters for each buffer expansion.

Tue Mar 19 17:06:50 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (glob_helper): compose HFS file names from UTF8-MAC.
	  [ruby-core:48745] [Bug #7267]

Sat Mar 16 01:44:29 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* internal.h: added a declaration of ruby_kill().
	* thread.c (ruby_kill): helper function of kill().

	* signal.c (rb_f_kill): use ruby_kill() instead of kill().
	* signal.c (rb_f_kill): call rb_thread_execute_interrupts()
	  to ensure that make SignalException if sent a signal
	  to myself. [Bug #7951] [ruby-core:52864]

	* vm_core.h (typedef struct rb_thread_struct): added
	  th->interrupt_cond.
	* thread.c (rb_threadptr_interrupt_common): added to
	  initialization of th->interrupt_cond.
	* thread.c (thread_create_core): ditto.

	* test/ruby/test_signal.rb (TestSignal#test_hup_me): test for
	  the above.

Sat Mar 16 00:42:39 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* io.c (linux_iocparm_len): enable only exist _IOC_SIZE().
	  Because musl libc doesn't have it. [Bug #8051] [ruby-core:53229]

Tue Mar 19 10:05:04 2013  Shota Fukumori  <her@sorah.jp>

	* ext/objspace/objspace.c: Fix typo in doc. Patch by Sho Hashimoto.
	  [Bug #8116] [ruby-dev:47177]

Tue Mar 19 02:13:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* configure.in: set ac_cv_prog_cxx if CXX is supplied.

Tue Mar 19 01:18:00 2013  Kenta Murata  <mrkn@mrkn.jp>

	* configure.in: Fix c++ compiler auto-selection not only for
	  Darwin 11.x, but also the other versions of Darwin.

Tue Mar 19 00:26:22 2013  Narihiro Nakamura  <authornari@gmail.com>

	* gc.c: Improve accuracy of objspace_live_num() and
	  allocated/freed counters. patched by tmm1(Aman Gupta).
	  [Bug #8092] [ruby-core:53392]

Mon Mar 18 21:42:48 2013  Narihiro Nakamura  <authornari@gmail.com>

	* gc.c: Avoid unnecessary heap growth. patched by tmm1(Aman Gupta).
	  [Bug #8093] [ruby-core:53393]

Mon Mar 18 17:58:36 2013  Narihiro Nakamura  <authornari@gmail.com>

	* gc.c: Fix unlimited memory growth with large values of
	  RUBY_FREE_MIN. patched by tmm1(Aman Gupta).
	  [Bug #8095] [ruby-core:53405]

Mon Mar 18 14:46:19 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/win32ole/test_err_in_callback.rb
	  (TestErrInCallBack#test_err_in_callback): shouldn't create a file in
	  the top of build directory.

Mon Mar 18 13:29:52 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* vm_dump.c (backtrace): on darwin use custom backtrace() to trace
	  beyond _sigtramp. darwin's backtrace can't trace beyond signal
	  trampoline with sigaltstack.

	* configure.in: check execinfo.h on darwin.

Mon Mar 18 11:03:23 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* vm_exec.h (END_INSN): revert r39517 because the segv seems fixed by
	  r39806.

Mon Mar 18 10:41:06 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* vm_exec.c: Correct predefined macro name. This typo is introduced by
	  r36534 and should be backported to ruby_2_0_0.

Mon Mar 18 03:18:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* array.c: Typo in Array#delete by Timo Sand [GH fixes #258]

Mon Mar 18 01:14:56 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* io.c (io_fillbuf): show fd number on failure to debug.
	  http://c5632.rubyci.org/~chkbuild/ruby-trunk/log/20130316T050302Z.diff.html.gz

Sun Mar 17 02:38:21 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* ext/date/date_core.c: include sys/time.h for avoiding implicit
	  declaration of gettimeofday().

Sun Mar 17 00:55:31 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* include/ruby/missing.h: removed __linux__. it's unnecessary.

Fri Mar 15 14:57:16 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* thread.c: disabled _FORTIFY_SOURCE for avoid to hit glibc bug.
	  [Bug #8080] [ruby-core:53349]
	* test/ruby/test_io.rb (TestIO#test_io_select_with_many_files):
	  test for the above.

Wed Mar 13 15:16:35 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* include/ruby/missing.h (__syscall): moved to...
	* io.c: here. because __syscall() is only used from io.c.

	* include/ruby/missing.h: move "#include <sys/type.h>" to ....
	* include/ruby/intern.h: here. because it was introduced for
	  fixing NFDBITS issue. [ruby-core:05179].

Wed Mar 13 14:38:53 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* include/ruby/missing.h (struct timespec): include <sys/time.h>

Wed Mar 13 13:54:45 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* configure.in: check struct timeval exist or not.
	* include/ruby/missing.h (struct timeval): check HAVE_STRUCT_TIMEVAL
	  properly. and don't include sys/time.h if struct timeval exist.

	* file.c: include sys/time.h explicitly.
	* random.c: ditto.
	* thread_pthread.c: ditto.
	* time.c: ditto.
	* ext/date/date_strftime.c: ditto.

Fri Mar 15 14:45:02 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* configure.in (_FORTIFY_SOURCE): added a few comments.

Fri Mar 15 14:17:55 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* thread_pthread.c (numberof): renamed from ARRAY_SIZE() because
	  other all files use numberof().

Say Mar 15 01:33:00 2013  Charles Oliver Nutter <headius@headius.com>

	* test/ruby/test_lazy_enumerator.rb (TestLazyEnumerator#test_drop_while):
	  Modify while condition to show dropping remains off after first false
	  value. This change was made in 39711.

Fri Mar 15 23:06:18 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* time.c (GetTimeval): check if already initialized instance.

	* time.c (GetNewTimeval): check if newly created instance.

	* time.c (time_init_0, time_init_1, time_init_copy, time_mload): must
	  be newly created instance.  [ruby-core:53436] [Bug #8099]

Fri Mar 15 14:51:33 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* file.c (rb_sys_fail_path_with_func): share same function, and path
	  may be nil.

Fri Mar 15 08:24:51 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* io.c (rb_sys_fail_path): define & use rb_sys_fail_path0 like r39752

Fri Mar 15 04:08:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* proc.c: Typo in Proc.arity found by Jack Nagel [Bug #8094]

Thu Mar 14 16:59:09 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (rb_cv_function_name_string): macro for function name
	  string predefined identifier, __func__ in C99, or __FUNCTION__ in
	  gcc.

	* file.c (rb_sys_fail_path): use RUBY_FUNCTION_NAME_STRING.

Thu Mar 14 14:12:34 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* file.c (rb_sys_fail_path): use rb_sys_fail_path0 only on GCC.
	  __func__ is C99 feature.

Thu Mar 14 12:59:59 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* file.c (rb_sys_fail_path0): add to append the name of called function
	  to ease debugging for example blow umask_spec failure.
	  http://fbsd.rubyci.org/~chkbuild/ruby-trunk/log/20130309T010202Z.diff.html.gz

	* file.c (rb_sys_fail_path): use rb_sys_fail_path0.

Thu Mar 14 12:53:15 2013  Luis Lavena  <luislavena@gmail.com>

	* win32/file.c (get_user_from_path):  add internal function that retrieves
	  username from supplied path (refactored).
	* win32/file.c (rb_file_expand_path_internal):  refactor expansion of user
	  home to use get_user_from_path and cover dir_string corner cases.
	  [ruby-core:53168] [Bug #8034]

Thu Mar 14 11:53:01 2013  Narihiro Nakamura  <authornari@gmail.com>

	* NEWS: describe RUBY_HEAP_SLOTS_GROWTH_FACTOR.

Thu Mar 14 10:01:12 2013  Eric Hodel  <drbrain@segment7.net>

	* doc/globals.rdoc:  $? is thread-local

Wed Mar 13 23:25:59 2013  Narihiro Nakamura  <authornari@gmail.com>

	* gc.c: allow to tune growth of heap by environment variable
	  RUBY_HEAP_SLOTS_GROWTH_FACTOR. patched by tmm1(Aman Gupta).
	  [Feature #8015] [ruby-core:53131]

Wed Mar 13 19:43:46 2013  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* doc/irb/irb.rd.ja: fix typo

	* ext/tk/MANUAL_tcltklib.eng: fix typos

	* ext/tk/sample/tktextframe.rb (Tk#component_delegates): fix typo

Wed Mar 13 15:13:04 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* class.c (rb_obj_singleton_methods): collect methods from the origin
	  class.  [ruby-core:53207] [Bug #8044]

Wed Mar 13 14:51:26 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_method.c (rb_export_method): directly override the flag of method
	  defined in prepending class too, not adding zsuper entry.
	  [ruby-core:53106] [Bug #8005]

Wed Mar 13 13:06:26 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (rm, shvar_to_cpp, unexpand_shvar): local is not
	  available on old shells.

	* configure.in (shvar_to_cpp): escape quotes for old shells.
	  [Bug #7959] [Bug #8071]

Wed Mar 13 11:11:07 2013  Shugo Maeda  <shugo@ruby-lang.org>

	* object.c (Init_Object): remove Module#used, which has been
	  introduced in Ruby 2.0 by mistake.  [Bug #7916] [ruby-core:52719]

Wed Mar 13 05:49:29 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/irb.rb:  Fix typo

Tue Mar 12 22:20:47 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* compile.c (iseq_set_arguments, iseq_compile_each): support required
	  keyword arguments.   [ruby-core:51454] [Feature #7701]

	* iseq.c (rb_iseq_parameters): ditto.

	* parse.y (f_kw, f_block_kw): ditto.  this syntax is still
	  experimental, the notation may change.

	* vm_core.h (rb_iseq_struct): ditto.

	* vm_insnhelper.c (vm_callee_setup_keyword_arg): ditto.

Tue Mar 12 17:02:53 2013  TAKANO Mitsuhiro <tak@no32.tk>

	* date_core.c: clearly specify operator precedence.

Tue Mar 12 17:00:45 2013  TAKANO Mitsuhiro <tak@no32.tk>

	* insns.def: fix condition.

Tue Mar 12 16:48:19 2013  TAKANO Mitsuhiro <tak@no32.tk>

	* rational.c: fix dangling if, else-if and else.

Tue Mar 12 06:27:59 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems/commands/setup_command.rb:  Don't delete non-rubygems
	  files when installing RubyGems.
	* test/rubygems/test_gem_commands_setup_command.rb:  Test for the
	  above.

	* lib/rubygems/ext/ext_conf_builder.rb:  Use full path to siteconf.rb
	  in case the extconf.rb changes directories (like memcached does).

	* lib/rubygems/package.rb:  Remove double slash from path.
	* test/rubygems/test_gem_package.rb:  Test for the above.
	* test/rubygems/test_gem_package_old.rb:  ditto.

	* lib/rubygems/source.rb:  Revert automatic HTTPS upgrade
	* lib/rubygems/spec_fetcher.rb:  ditto.
	* test/rubygems/test_gem_remote_fetcher.rb:  ditto.
	* test/rubygems/test_gem_source.rb:  ditto.
	* test/rubygems/test_gem_spec_fetcher.rb:  ditto.

Tue Mar 12 02:25:19 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/net/smtp.rb:  Added Net::SMTP#rset method to implement the SMTP
	  RSET command.  [ruby-trunk - Feature #5373]
	* NEWS:  ditto.
	* test/net/smtp/test_smtp.rb:  Test for the above.

Mon Mar 11 22:44:57 2013  Tanaka Akira  <akr@fsij.org>

	* lib/resolv-replace.rb (TCPSocket#initialize): resolve the 3rd
	  argument only if non-nil value is given.
	  [ruby-dev:47150] [ruby-trunk - Bug #8054] reported and analyzed by
	  mrkn.

Mon Mar 11 19:22:54 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* test/mkmf/base.rb: class name conflict.

Mon Mar 11 18:45:09 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* enumerator.c (enumerator_with_index): try to convert given offset to
	  integer. fix bug introduced in r39594.

Mon Mar 11 17:27:57 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* test/ruby/envutil.rb (EnvUtil.with_default_external): add for
	  changing Encoding.default_external without warnings.

	* test/ruby/envutil.rb (EnvUtil.with_default_internal): ditto.

	* test/ruby/test_io_m17n.rb: use above with_default_external.

Mon Mar 11 16:57:00 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* io.c (extract_binmode): raise error even if binmode and textmode
	  don't conflict. [Bug #5918] [ruby-core:42199]

Mon Mar 11 12:25:12 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* Merge Onigmo d4bad41e16e3eccd97ccce6f1f96712e557c4518.
	  fix lookbehind assertion fails with /m mode enabled. [Bug #8023]
	  fix \Z matches where it shouldn't. [Bug #8001]

Mon Mar 11 11:53:35 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (MakeMakefile#dir_config, MakeMakefile#_libdir_basename):
	  defer use of instance variable until needed.  [Bug #8074]

Thu Mar  7 10:42:28 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* lib/thread.rb (Queue#clear): return self.
	  Patch by Cubing Cube. Thank you! [Bug #7947] [ruby-dev:47098]
	* lib/thread.rb (Queue#push): ditto.
	* lib/thread.rb (SizedQueue#push): ditto.
	* test/thread/test_queue.rb: add tests for the above.

Thu Mar  7 10:40:49 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* tool/change_maker.rb (#diff2index): check Encoding::BINARY.
	  BASERUBY may still be 1.8.x.

Thu Mar  7 08:47:42 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* NEWS (Mutex#owned?): no longer experimental.

Sun Mar 10 23:38:15 2013  Luis Lavena  <luislavena@gmail.com>

	* win32/file.c (rb_file_expand_path_internal):  Expand home directory when
	  used as second parameter (dir_string).  [ruby-core:53168] [Bug #8034]
	* test/ruby/test_file_exhaustive.rb: add test to verify.

Sun Mar 10 23:27:05 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/rubygems/ext/ext_conf_builder.rb (Gem::Ext::ExtConfBuilder.build):
	  it is impossible to predict which file will be installed to where,
	  by the arguments, so use intermediate destination directory always.
	  [Bug #7698]

Sun Mar 10 17:00:22 2013  Tadayoshi Funaba  <tadf@dotrb.org>

	* complex.c: edited rdoc.
	* rational.c: ditto.

Sun Mar 10 15:02:39 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* process.c (setup_communication_pipe): remove unused function.
	  it was unintentionally added r39683.

Wed Mar  6 00:30:40 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* tool/gen_ruby_tapset.rb: add tapset generator.

Wed Mar  6 03:27:43 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* probes.d (symbol-create): change argument name `string' to
	  `str'. `string' is a keyword for systemtap.

Tue Mar  5 22:23:01 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* probes.d: added argument name

Thu Mar  7 01:17:00 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* test/thread/test_queue.rb (TestQueue#test_thr_kill): reduce
	  iterations from 2000 to 250. When running on uniprocessor
	  systems, every th.kill needs TIME_QUANTUM_USEC time (i.e.
	  100msec on posix systems). Because, "r.read 1" is 3 steps
	  operations that 1) release GVL 2) read 3) acquire gvl and
	  (1) invoke context switch to main thread. and then, main
	  thread's th.kill resume (1), but not (2). Thus read interrupt
	  need TIME_QUANTUM_USEC. Then maximum iteration is 30sec/100msec
	  = 300.

Thu Mar  7 00:14:51 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* io.c (rb_update_max_fd): use ATOMIC_CAS because this function
	  is used from timer thread too.

Wed Mar  6 23:30:21 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* thread_pthread.c (ARRAY_SIZE): new.
	* thread_pthread.c (gvl_acquire_common): use low priority
	  notification for avoiding timer thread interval confusion.
	  If we use timer_thread_pipe[1], every gvl_yield() request
	  one more gvl_yield(). It lead to thread starvation.
	  [Bug #7999] [ruby-core:53095]
	* thread_pthread.c (rb_reserved_fd_p): adds timer_thread_pipe_low
	  to reserved fds.

Wed Mar  6 22:36:19 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* thread_pthread.c (rb_thread_wakeup_timer_thread_fd): add fd
	  argument and remove hardcoded dependency of timer_thread_pipe[1].
	* thread_pthread.c (consume_communication_pipe): add fd argument.
	* thread_pthread.c (close_communication_pipe): ditto.

	* thread_pthread.c (timer_thread_sleep): adjust the above changes.

	* thread_pthread.c (setup_communication_pipe_internal): factor
	  out pipe initialize logic.

Wed Mar  6 22:56:14 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* thread_pthread.c (ubf_select): add to small comments why we
	  need to call rb_thread_wakeup_timer_thread().

Wed Mar  6 21:42:24 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* thread_pthread.c (rb_thread_create_timer_thread): factor out
	  creating communication pipe logic into separate function.
	* thread_pthread.c (setup_communication_pipe): new helper function.
	* thread_pthread.c (set_nonblock): moves a definition before
	  setup_communication_pipe.

Sun Mar  3 02:42:29 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* thread_pthread.c (consume_communication_pipe): retry when
	  read returned CCP_READ_BUFF_SIZE.

Wed Mar  6 21:31:35 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* thread_pthread.c (timer_thread_sleep): use poll() instead of
	  select(). select doesn't work if timer_thread_pipe[0] is
	  greater than FD_SETSIZE.
	* thread_pthread.c (USE_SLEEPY_TIMER_THREAD): add a dependency
	  against poll.

Wed Mar  6 21:00:23 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* thread_pthread.c (USE_SLEEPY_TIMER_THREAD): use more accurate
	  ifdef conditions.

Sun Mar  3 02:30:36 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* thread_pthread.c (set_nonblock): new helper function for set
	  O_NONBLOCK.
	* thread_pthread.c (rb_thread_create_timer_thread): set O_NONBLOCK
	  to timer_thread_pipe[0] too.

Sun Mar 10 09:12:51 2013  Tadayoshi Funaba  <tadf@dotrb.org>

	* complex.c: described syntax of string form.
	* rational.c: ditto.

Sat Mar  9 11:58:39 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (w_extended): check for prepended object.
	  [ruby-core:53206] [Bug #8043]

Sat Mar  9 08:36:58 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* load.c (features_index_add_single, rb_feature_p): store single index
	  as Fixnum to reduce the number of arrays for the indexes.  based on
	  the patch by tmm1 (Aman Gupta) in [ruby-core:53216] [Bug #8048].

Sat Mar  9 00:25:57 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* marshal.c (r_object0): load prepended objects.  treat the class of
	  extended object in the included modules as prepended singleton
	  class. [ruby-core:53202] [Bug #8041]

Fri Mar  8 19:44:00 2013  Akinori MUSHA  <knu@iDaemons.org>

	* man/rake.1, man/ruby.1: Use the Pa macro to make URLs stand out.

Fri Mar  8 13:20:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/pathname/pathname.c (path_f_pathname): rdoc for Pathname()

Fri Mar  8 12:00:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* man/rake.1: Document ENVIRONMENT variables on RAKE(1) manpage

Fri Mar  8 10:44:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/webrick/httpproxy.rb: Fix typos in HTTPProxyServer [Bug #8013]
	  Patch by Nobuhiro IMAI [ruby-core:53127]

Fri Mar  8 03:16:15 2013  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* class.c (rb_mod_ancestors): Include singleton_class in ancestors
	  list [Feature #8035]

	* test/ruby/test_module.rb (class): test for above

	* test/ruby/marshaltestlib.rb (module): adapt test

	* NEWS: list change

Thu Mar  7 14:21:37 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* compile.c (iseq_compile_each): pass keyword arguments to zsuper,
	  with current values.  [ruby-core:53114] [Bug #8008]

Thu Mar  7 12:53:47 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems/commands/setup_command.rb:  Install .pem files.
	* test/rubygems/test_gem_commands_setup_command.rb:  Test for the
	  above.

	* lib/rubygems/spec_fetcher.rb:  Test HTTPS upgrade with URI::HTTPS,
	  not URI::HTTP.  Fixes bug in automatic HTTPS upgrade.
	* test/rubygems/test_gem_spec_fetcher.rb:  Test for the above.

	* lib/rubygems.rb:  Version 2.0.2

	* lib/rubygems/test_utilities.rb:  Ensure scheme and uri class match.

Thu Mar  7 10:39:04 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* tool/rbinstall.rb (gem): Gem.ensure_gem_subdirectories now has mode
	  option since r39607.  refix of r38870.

Wed Mar  6 13:14:28 2013  Eric Hodel  <drbrain@segment7.net>

	* test/rubygems/test_gem_spec_fetcher.rb:  Removed unused variable.

Wed Mar  6 08:10:15 2013  Eric Hodel  <drbrain@segment7.net>

	* test/rubygems/test_require.rb:  Fix tests when 'a.rb' exists.
	  [ruby-trunk - Bug #7749]

Wed Mar  6 08:00:59 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems.rb:  Allow specification of directory permissions.
	  [ruby-trunk - Bug #7713]
	* test/rubygems/test_gem.rb:  Test for the above.

Wed Mar  6 07:40:21 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems/commands/query_command.rb:  Only fetch remote specs when
	  showing details.  [ruby-trunk - Bug #8019]  RubyGems bug #487
	* lib/rubygems/remote_fetcher.rb:  ditto.
	* lib/rubygems/security/policy.rb:  ditto.
	* test/rubygems/test_gem_commands_query_command.rb:  Test for the
	  above.

	* lib/rubygems/security.rb:  Make OpenSSL optional for RubyGems.
	* lib/rubygems/commands/cert_command.rb:  ditto.

	* lib/rubygems/config_file.rb:  Display file with YAML error, not
	  ~/.gemrc

	* lib/rubygems/remote_fetcher.rb:  Only create gem subdirectories when
	  installing gems.
	* lib/rubygems/dependency_resolver.rb:  ditto.
	* lib/rubygems/test_utilities.rb:  ditto.
	* test/rubygems/test_gem_commands_fetch_command.rb:  Test for the
	  above.

	* lib/rubygems/spec_fetcher.rb:  Only try to upgrade
	  http://rubygems.org to HTTPS
	* test/rubygems/test_gem_spec_fetcher.rb:  Test for the above.

	* lib/rubygems.rb:  Update win_platform? check for JRuby compatibility.

	* test/rubygems/test_gem_installer.rb:  Update for Ruby 1.9.2
	  compatibility

Wed Mar  6 01:19:28 2013  Kazuhiro NISHIYAMA  <zn@mbf.nifty.com>

	* enumerator.c (enumerator_with_index, lazy_take): use INT2FIX(0)
	  instead of INT2NUM(0).

	* ext/bigdecimal/bigdecimal.c (BigMath_s_exp): ditto.

	* ext/fiddle/function.c (function_call): ditto.

	* ext/openssl/ossl_x509store.c (ossl_x509store_initialize): ditto.

	* process.c (proc_getsid): ditto.

	* transcode.c (econv_finish): ditto.

Tue Mar  5 21:36:43 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* class.c (rb_prepend_module): check redefinition of built-in optimized
	  methods.  [ruby-dev:47124] [Bug #7983]

	* vm.c (rb_vm_check_redefinition_by_prepend): ditto.

Tue Mar  5 20:29:25 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* proc.c (mnew): revert r39224.  [ruby-core:53038] [Bug #7988]

Tue Mar  5 20:23:54 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/intern.h (rb_check_arity): make a static inline
	  function so it can be used as an expression and argc would be
	  evaluated only once.

Tue Mar  5 12:30:55 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems.rb:  Bump version to 2.0.1 for upcoming bugfix release

	* lib/rubygems/ext/ext_conf_builder.rb:  Restore ruby 1.8 compatibility
	  for [Bug #7698]
	* test/rubygems/test_gem_installer.rb:  Ditto.

	* lib/rubygems/package.rb:  Restore ruby 1.8 compatibility.

	* test/rubygems/test_gem_dependency_installer.rb:  Fix warnings

Tue Mar  5 12:24:23 2013  Eric Hodel  <drbrain@segment7.net>

	* enumerator.c (enumerator_with_index):  Restore handling of a nil memo
	  from r39594.

Tue Mar  5 10:40:22 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/objspace/objspace.c (count_nodes): count also newly added nodes,
	  and fix key for unknown node.  patch by tmm1 (Aman Gupta) in
	  [ruby-core:53130] [Bug #8014]

Tue Mar  5 10:20:16 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enumerator.c (enumerator_with_index_i): allow Bignum as offset, to
	  get rid of conversion exception and integer overflow.
	  [ruby-dev:47131] [Bug #8010]

	* numeric.c (rb_int_succ, rb_int_pred): shortcut optimization for
	  Bignum.

Tue Mar  5 10:02:48 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/rubygems/ext/ext_conf_builder.rb (Gem::Ext::ExtConfBuilder.build):
	  clear DESTDIR so RUBYARCHDIR and RUBYLIBDIR are not be overridden.
	  [Bug #7698]

Mon Mar  4 15:33:40 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/rubygems/ext/ext_conf_builder.rb (Gem::Ext::ExtConfBuilder.build):
	  fix for unusual cases again.  install to a temporary directory once
	  and move installed files to the destination directory, if it is same
	  as the current directory.  [Bug #7698]

Mon Mar  4 14:13:36 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* Makefile.in (miniruby, ruby): move MAINLIBC because linker arguments
	  must appear after object files with newer versions of gcc.  patch by
	  tmm1 (Aman Gupta) in [ruby-core:53121] [Bug #8009]

Mon Mar  4 10:23:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* encoding.c: Typo in Encoding overview by Tom Wardrop [GH fixes #255]

Sun Mar  3 12:35:08 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (MakeMakefile#libpath_env): set runtime library path for
	  the case rpath is disabled.

Sun Mar  3 12:17:47 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/rubygems/ext/ext_conf_builder.rb
	  (Gem::Ext::ExtConfBuilder.hack_for_obsolete_style_gems): remove
	  circular dependencies in install-so too.  [ruby-core:52882]
	  [Bug #7698]

Sun Mar  3 07:33:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/socket/tcpserver.c: Grammar for TCPServer.new from r39554

Sun Mar  3 01:17:20 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/rubygems/ext/ext_conf_builder.rb
	  (Gem::Ext::ExtConfBuilder.hack_for_obsolete_style_gems): remove
	  circular dependencies for old style gems which locate extconf.rb on
	  the toplevel.  [ruby-core:53059] [ruby-trunk - Bug #7698]

	* lib/rubygems/ext/ext_conf_builder.rb (Gem::Ext::ExtConfBuilder.build):
	  use RUBYOPT instead of -r option, and revert some tests.  [Bug #7698]

	* lib/rubygems/ext/ext_conf_builder.rb (Gem::Ext::ExtConfBuilder.build):
	  revert use of temporary directory for build, to work some buggy
	  extconf.rb which cannot build outside the source directory.
	  [ruby-core:53056] [Bug #7698]

Sun Mar  3 00:04:20 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enc/depend (CPPFLAGS), lib/mkmf.rb (MakeMakefile#create_makefile):
	  define RUBY_EXPORT for static-linked-ext mswin.  [Bug #7960]

Sat Mar  2 22:49:47 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* win32/Makefile.sub (ENCOBJS, EXTOBJS, config.h): definitions for
	  static-linked-ext.  [Bug #7960]

Sat Mar  2 17:34:19 2013  Tanaka Akira  <akr@fsij.org>

	* lib/webrick/utils.rb: use Socket.tcp_server_sockets to create server
	  sockets.
	  fix [Bug #7100] https://bugs.ruby-lang.org/issues/7100
	  reported by sho-h (Sho Hashimoto).

Sat Mar  2 02:45:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* array.c: typo in comment patch by Nami-Doc [Github fixes #253]

Sat Mar  2 01:33:17 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* Merge Onigmo 0fe387da2fee089254f6b04990541c731a26757f
	  v5.13.3 [Bug#7972] [Bug#7974]

Fri Mar  1 11:09:06 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/fileutils.rb:  Revert r34669 which altered the way
	  metaprogramming in FileUtils occurred.  [ruby-trunk - Bug #7958]

	* test/fileutils/visibility_tests.rb:  Refactored tests of FileUtils
	  options modules to expose bug found in #7958
	* test/fileutils/test_dryrun.rb:  ditto.
	* test/fileutils/test_nowrite.rb:  ditto.
	* test/fileutils/test_verbose.rb:  ditto.

Fri Mar  1 09:18:00 2013  Zachary Scott <zachary@zacharyscott.net>

	* lib/psych.rb: specify in rdoc what object is returned in parser
	  By Adam Stankiewicz [Github tenderlove/psych#133]

Fri Mar  1 07:21:41 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems/ext/builder.rb:  Fix incompatibilities when installing
	  extensions.  Patch by Nobu.
	  [ruby-trunk - Bug #7698] [ruby-trunk - Bug #7971]
	* lib/rubygems/ext/ext_conf_builder.rb:  ditto.
	* lib/rubygems/installer.rb:  ditto.
	* test/rubygems/test_gem_ext_ext_conf_builder.rb:  Test for the above.
	* test/rubygems/test_gem_installer.rb:  ditto.

	* lib/rubygems/commands/sources_command.rb:  Prefer HTTPS over HTTP.
	* lib/rubygems/defaults.rb:  ditto
	* lib/rubygems/dependency_resolver.rb:  Ditto.
	* lib/rubygems/source.rb:  ditto.
	* lib/rubygems/spec_fetcher.rb:  ditto.
	* lib/rubygems/specification.rb:  ditto.
	* lib/rubygems/test_utilities.rb:  ditto.
	* test/rubygems/test_gem.rb:  Test for the above.
	* test/rubygems/test_gem_commands_sources_command.rb:  ditto.
	* test/rubygems/test_gem_dependency_resolver_api_set.rb:  ditto.
	* test/rubygems/test_gem_remote_fetcher.rb:  ditto.
	* test/rubygems/test_gem_source.rb:  ditto.
	* test/rubygems/test_gem_spec_fetcher.rb:  ditto.

Fri Mar 1 03:25:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/psych/lib/psych.rb: rdoc for Psych overview by Adam Stankiewicz
	  [Github tenderlove/psych#134]

Thu Feb 28 22:57:48 2013  Koichi Sasada  <ko1@atdot.net>

	* compile.c (iseq_compile_each): remove redundant trace(line)
	  instruction. for example, at the following script
	    def m()
	      p:xyzzy
	      1
	      2
	    end
	  compiler ignores `1' because there is no effect. However,
	  `trace(line)' instruction remains in bytecode.
	  This modification removes such redundant trace(line) instruction.

	* test/ruby/test_iseq.rb: add a test.

Thu Feb 28 22:23:27 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/raddrinfo.c (inspect_sockaddr): don't show that Unix
	  domain socket filename is bigger than sizeof(sun_path).
	  This limit is not rigid on some platforms such as Darwin and SunOS.

Thu Feb 28 21:33:01 2013  WATANABE Hirofumi  <eban@ruby-lang.org>

	* configure.in(AC_DISABLE_OPTION_CHECKING): avoid warning "WARNING:
	  Unrecognized options: --with-PACKAGE".

Thu Feb 28 20:22:04 2013  Koichi Sasada  <ko1@atdot.net>

	* iseq.c (iseq_data_to_ary): fix condition.
	  r34303 introduces a bug to avoid all line information from
	  a result of ISeq#to_a. This is a regression problem from 2.0.0p0.

	* test/ruby/test_iseq.rb: add a test of lines after ISeq#to_a.

Thu Feb 28 08:20:33 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems/available_set.rb:  Undent for style

	* lib/rubygems/dependency_installer.rb:  Pick latest prerelease gem to
	  install.  Fixes RubyGems bug #468.
	* test/rubygems/test_gem_dependency_installer.rb:  Test for the above.

	* lib/rubygems/dependency_installer.rb:  Don't display "Done installing
	  documentation" if documentation will not be installed.
	* lib/rubygems/rdoc.rb:  ditto

	* lib/rubygems/dependency_list.rb:  Use Array#concat for Ruby 1.x
	  performance.

	* lib/rubygems/installer.rb:  Use formatted program name when comparing
	  executables.  RubyGems pull request #471
	* test/rubygems/test_gem_installer.rb:  Test for the above.

	* lib/rubygems/package.rb:  Use more explicit feature check to work
	  around JRuby bug #552

	* lib/rubygems/ssl_certs/GeoTrust_Global_CA.pem:  Added GeoTrust root
	  certificate.

	* test/rubygems/test_gem_source_list.rb:  Use "example" instead of real
	  hostname

Thu Feb 28 05:57:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* thread.c: rdoc formatting for Thread, ThreadGroup, and ThreadError

Thu Feb 28 02:42:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* vm.c: Typo in overview for example of Thread#status returning false
	  Reported by Lee Jarvis

Wed Feb 27 22:54:27 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/rubysocket.h (union_sockaddr): make it longer for SunOS
	  and Darwin.

Wed Feb 27 21:14:34 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/security.rb (REXML::Security): create.
	* lib/rexml/rexml.rb: move entity_expansion_limit and
	  entity_expansion_text_limit accessors to ...
	* lib/rexml/security.rb: ... here.
	* lib/rexml/document.rb: use REXML::Security.
	* lib/rexml/text.rb: use REXML::Security.
	* test/rexml/test_document.rb: use REXML::Security.

Wed Feb 27 19:53:32 2013  Benoit Daloze  <eregontp@gmail.com>

	* vm.c (Thread): fix typos in overview

Wed Feb 27 13:21:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* vm.c (Thread): Typo in overview, swap setting and getting

Wed Feb 27 13:02:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* vm.c (Thread): Documentation overview of Thread class

Wed Feb 27 12:57:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* thread.c (rb_thread_wakeup): rdoc formatting

Wed Feb 27 12:53:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* thread.c (rb_thread_group): rdoc formatting

Wed Feb 27 12:33:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/ostruct.rb: Typo in OpenStruct overview [Github Fixes #251]
	  Patch by Chun-wei Kuo

Wed Feb 27 12:13:32 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* vm_exec.h (END_INSN): llvm-gcc may optimize out reg_cfp and cause
	  Stack/cfp consistency error when the instruction doesn't use reg_cfp.
	  Usually instructions use PUSH() but for example trace doesn't.
	  This hack cause speed down but you shouldn't use llvm-gcc, use clang.
	  [Bug #7938]

Wed Feb 27 10:23:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* thread.c (thread_raise_m): rdoc formatting

Tue Feb 26 23:32:44 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/document.rb: move entity_expansion_limit accessor to ...
	* lib/rexml/rexml.rb: ... here for consistency.
	* lib/rexml/document.rb (REXML::Document.entity_expansion_limit):
	  deprecated.
	* lib/rexml/document.rb (REXML::Document.entity_expansion_limit=):
	  deprecated.

Tue Feb 26 23:26:13 2013  Kouhei Sutou  <kou@cozmixng.org>

	* lib/rexml/document.rb: move entity_expansion_text_limit accessor to ...
	* lib/rexml/rexml.rb: ... here to make rexml/text independent from
	  REXML::Document. It causes circular require.
	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
	  deprecated.
	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit=):
	  deprecated.
	* lib/rexml/text.rb: add missing require "rexml/rexml" for
	  REXML.entity_expansion_text_limit.
	  Reported by Robert Ulejczyk. Thanks!!! [ruby-core:52895] [Bug #7961]

Tue Feb 26 15:12:11 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* tool/mkconfig.rb: reconstruct comma separated list values.  a
	  command line to Windows batch file is split not only by spaces
	  and equal signs but also by commas and semicolons.

Tue Feb 26 15:04:19 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (unexpand_shvar): get rid of non-portable shell
	  behavior on OpenBSD, so no extra quotes.  [Bug #7959]

Tue Feb 26 10:24:49 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* parse.y (IS_LABEL_POSSIBLE): allow labels for keyword arguments just
	  after method definition without a parenthesis.  [ruby-core:52820]
	  [Bug #7942]

Tue Feb 26 04:50:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* error.c: clarify reason for sleep in SignalException example

Tue Feb 26 03:47:00 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* error.c: clarify a document of SignalException. Process.kill()
	  doesn't have any guarantee when signal will be delivered.
	  [Bug #7951] [ruby-core:52864]

Mon Feb 25 23:51:04 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/version.h: bump RUBY_API_VERSION same as RUBY_VERSION.

Mon Feb 25 21:03:34 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* string.c (str_byte_substr): don't set coderange if it's not known.
	  [Bug #7954] [ruby-dev:47108]

Mon Feb 25 16:47:02 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* common.mk (realclean-local): miniprelude.c is made by srcs, so it
	  should not removed by distclean but by realclean.  [Bug #6807]

Mon Feb 25 16:30:30 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems/config_file.rb:  Lazily load .gem/credentials to only
	  check permissions when necessary.  RubyGems bug #465
	* test/rubygems/test_gem_config_file.rb:  Test for the above.

	* test/rubygems/test_gem_commands_push_command.rb:  Remove duplicated
	  test.

Mon Feb 25 15:47:18 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* enc/depend (ARFLAGS): VisualC++ linker does not allow spaces between
	  output option and the output file name.  [Bug #7950]

	* enc/depend (RANLIB): set default command to do nothing, or make the
	  entire line a label on Windows.

Mon Feb 25 14:41:07 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (MakeMakefile#init_mkmf): default libdirname to libdir.

	* tool/rbinstall.rb: ditto.

Mon Feb 25 13:12:39 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (setup): find Setup file from target_os 1. by
	  suffix (e.g. Setup.nacl, Setup.atheos), 2. by "platform"
	  option (e.g. Setup.nt, Setup.emx), and 3. default Setup.  And
	  Setup.dj had been removed.

Mon Feb 25 12:48:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* thread.c: Document Thread::new, clean up ::fork and mention calling
	  super if subclassing Thread

Mon Feb 25 12:38:50 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: don't test ss_family and ss_len member of
	  struct sockaddr_storage.  They are not used now except SunOS
	  specific code.

Mon Feb 25 11:03:38 2013  Akinori MUSHA  <knu@iDaemons.org>

	* configure.in (unexpand_shvar): Use the numeric comparison
	  operator instead of '==' which is a ksh extension. [Bug #7941]

Mon Feb 25 02:37:56 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket: define and use union_sockaddr instead of struct
	  sockaddr_storage for less casts.

	* ext/socket/rubysocket.h (union_sockaddr): defined.

	* ext/socket/socket.c (sock_accept): use union_sockaddr.
	  (sock_accept_nonblock): ditto.
	  (sock_sysaccept): ditto.
	  (sock_s_getnameinfo): ditto.

	* ext/socket/basicsocket.c (bsock_getsockname): ditto.
	  (bsock_getpeername): ditto.
	  (bsock_local_address): ditto.
	  (bsock_remote_address): ditto.

	* ext/socket/ancdata.c (bsock_recvmsg_internal): ditto.

	* ext/socket/init.c (recvfrom_arg): ditto.
	  (recvfrom_blocking): ditto.
	  (rsock_s_recvfrom): ditto.
	  (rsock_s_recvfrom_nonblock): ditto.
	  (rsock_getfamily): ditto.

	* ext/socket/raddrinfo.c (rb_addrinfo_t): ditto.
	  (ai_get_afamily): ditto.
	  (inspect_sockaddr): ditto.
	  (addrinfo_mdump): ditto.
	  (addrinfo_mload): ditto.
	  (addrinfo_getnameinfo): ditto.
	  (addrinfo_ip_port): ditto.
	  (extract_in_addr): ditto.
	  (addrinfo_ipv6_to_ipv4): ditto.
	  (addrinfo_unix_path): ditto.

	* ext/socket/tcpserver.c (tcp_accept): ditto.
	  (tcp_accept_nonblock): ditto.
	  (tcp_sysaccept): ditto.

	* ext/socket/ipsocket.c (ip_addr): ditto.
	  (ip_peeraddr): ditto.
	  (ip_s_getaddress): ditto.

Sun Feb 24 21:15:05 2013  Tadayoshi Funaba  <tadf@dotrb.org>

	* ext/date/date_core.c: [ruby-core:52303]

Sun Feb 24 15:33:46 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* random.c (rb_random_ulong_limited): limit is inclusive, but generic
	  rand method should return a number less than it, so increase for the
	  difference.  [ruby-core:52779] [Bug #7935]

Sun Feb 24 15:32:36 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* random.c (rb_random_ulong_limited): limit is inclusive, but generic
	  rand method should return a number less than it, so increase for the
	  difference.  [ruby-core:52779] [Bug #7935]

Sun Feb 24 15:14:43 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/net/http.rb:  Removed duplicate Accept-Encoding in Net::HTTP#get.
	  [ruby-trunk - Bug #7924]
	* test/net/http/test_http.rb:  Test for the above.

Wed Feb 20 14:28:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* thread.c: Document ThreadGroup::Default

Wed Feb 20 14:23:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* thread.c: Grammar for #backtrace_locations and ::handle_interrupt

Sun Feb 24 13:35:57 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_insnhelper.c (vm_call_method): block level control frame does not
	  have method entry, so obtain the method entry from method top-level
	  control frame to be compared with refined method entry.
	  [ruby-core:52750] [Bug #7925]

Wed Feb 20 13:23:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* object.c: Document methods receiving string and convert to symbol
	  Patch by Stefan Rusterholz
	* vm_eval.c: ditto
	* vm_method.c: ditto

Wed Feb 20 07:20:56 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* signal.c (sigsegv): suppress unused result warning. Because
	  write(2) is marked __warn_unused_result__ on Linux glibc.

Sun Feb 24 07:50:53 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* compile.c (iseq_set_arguments): no keyword check if any keyword rest
	  argument exists, even unnamed.  [ruby-core:52744] [Bug #7922]

Sat Feb 23 16:51:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* thread.c: Documentation for Thread#backtrace_locations

Sat Feb 23 16:05:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* vm.c: Typo in ObjectSpace::WeakMap overview

Sat Feb 23 16:00:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* thread.c: Improved rdoc for ::handle_interrupt, ::pending_interrupt?
	  and #pending_interrupt?

Sat Feb 23 12:26:43 2013  Akinori MUSHA  <knu@iDaemons.org>

	* misc/ruby-electric.el (ruby-electric-curlies)
	  (ruby-electric-matching-char, ruby-electric-bar): Avoid electric
	  insertion when there is a prefix argument.

	* misc/ruby-electric.el (ruby-electric-insert)
	  (ruby-electric-cua-replace-region-p)
	  (ruby-electric-cua-replace-region): Avoid electric insertion and
	  fall back when cua-mode is enabled and a region is active.

Sat Feb 23 12:35:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* array.c: Document #<=> return values and formatting
	* bignum.c: ditto
	* file.c: ditto
	* object.c: ditto
	* numeric.c: ditto
	* rational.c: ditto
	* string.c: ditto
	* time.c: ditto

Sat Feb 23 10:50:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* array.c (rb_ary_diff, rb_ary_and, rb_ary_or): Document return order
	  [RubySpec #7803]

Sat Feb 23 10:17:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* object.c (rb_obj_comp): Documenting Object#<=> return values
	  Patch by Stefan Rusterholz

Sat Feb 23 09:48:41 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* dir.c (file_s_fnmatch, fnmatch_brace): encoding-incompatible pattern
	  and string do not match, instead of exception.  [ruby-dev:47069]
	  [Bug #7911]

Sat Feb 23 08:57:46 2013  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* doc/NEWS-*: Update NEWS from their respective branches

Sat Feb 23 08:14:43 2013  Marc-Andre Lafortune  <ruby-core@marc-andre.ca>

	* NEWS: many additions for Ruby 2.0.0

	* object.c: Add doc for Module.prepended

Sat Feb 23 07:52:53 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* template/ruby.pc.in: reorder library flags which may refer library
	  names.  [Bug #7913]

Fri Feb 22 23:46:20 2013  CHIKANAGA Tomoyuki  <nagachika@ruby-lang.org>

	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
	  fix a typo in comment in r39384.

Fri Feb 22 18:31:46 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
	  new attribute to read/write entity expansion text limit.  the default
	  limit is 10Kb.

	* lib/rexml/text.rb (REXML::Text.unnormalize): check above attribute.

Fri Feb 22 17:36:23 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* test/test_rbconfig.rb (TestRbConfig): fix r39372.
	  It must see RbConfig::CONFIG instead of CONFIG.

Fri Feb 22 14:55:41 2013  Naohisa Goto  <ngotogenome@gmail.com>

	* signal.c (ruby_abort): fix typo in r39354 [Bug #5014]

Fri Feb 22 12:46:41 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* random.c (rb_random_ulong_limited): fix error message for negative
	  value.  [ruby-dev:47061] [Bug #7903]

Fri Feb 22 11:36:45 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* test/test_rbconfig.rb (TestRbConfig): skip user defined values by
	  configuration options.  [Bug #7902]

Fri Feb 22 11:33:42 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (MakeMakefile#init_mkmf): adjust default library path
	  for multiarch.  [Bug #7874]

Fri Feb 22 11:10:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* enum.c (Enumerable#chunk: Improved examples, grammar, and formatting
	  Patch by Dan Bernier and Rich Bruchal of newhaven.rb
	  [Github documenting-ruby/ruby#8]

Fri Feb 22 11:00:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* numeric.c: Examples and formatting for Numeric and Float
	  Based on a patch by Zach Morek and Oren K of newhaven.rb
	  [Github documenting-ruby/ruby#5]

Fri Feb 22 07:04:41 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems/installer.rb (build_extensions):  Create extension
	  install destination before building extension.  Patch by Kenta Murata.
	  [ruby-trunk - Bug #7897]
	* test/rubygems/test_gem_installer.rb:  Test for the above.

Fri Feb 22 06:30:57 2013  Eric Hodel  <drbrain@segment7.net>

	* doc/globals.rdoc:  Document what setting $DEBUG does.

	* doc/globals.rdoc:  Added pointer to $-d for full documentation.

Fri Feb 22 06:27:07 2013  Eric Hodel  <drbrain@segment7.net>

	* doc/globals.rdoc:  Document what setting $VERBOSE does.  [Bug #7899]

	* doc/globals.rdoc:  Added pointer to $-w and $-v for full
	  documentation.

Fri Feb 22 02:33:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/abbrev.rb: Add words parameter to Abbrev::abbrev
	  Patch by Devin Weaver [Github documenting-ruby/ruby#7]

Thu Feb 21 17:28:14 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* tool/merger.rb: add interaction when only ChangeLog is modified.

Thu Feb 21 16:34:46 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* signal.c (check_stack_overflow): extract duplicated code and get rid
	  of declaration-after-statement.  [Bug #5014]

Thu Feb 21 14:14:13 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* signal.c (sigsegv): avoid to use async signal unsafe functions
	  when nested sigsegv is happen.
	  [Bug #5014] [ruby-dev:44082]

Thu Feb 21 13:47:59 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* file.c (rb_group_member): added an error check. SUS says,
	  getgroups(small_value) may return EINVAL.

Thu Feb 21 13:37:07 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* process.c (RB_MAX_GROUPS): moved to
	* internal.h (RB_MAX_GROUPS): here.

	* file.c (rb_group_member): use RB_MAX_GROUPS instead of
	  RUBY_GROUP_MAX. They are the same.

Thu Feb 21 13:15:40 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* file.c (access_internal): removed.
	* file.c (rb_file_readable_real): use access() instead of
	  access_internal().
	* file.c (rb_file_writable_real): ditto.
	* file.c (rb_file_executable_real): ditto.

Thu Feb 21 13:04:59 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* file.c (eaccess): use access() when not using setuid nor setgid.
	  This is minor optimization.

Thu Feb 21 12:56:19 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* file.c (rb_group_member): get rid of NGROUPS dependency.
	  [Bug #7886] [ruby-core:52537]

Thu Feb 21 12:45:03 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ruby.c (ruby_init_loadpath_safe): try two levels upper for stripping
	  libdir name.  [Bug #7874]

	* configure.in (libdir_basename): expand with multiarch in configure,
	  not to defer the expansion till ruby.pc.in and mkmf.rb.  [Bug #7874]

	* configure.in (libdir_basename): also -rpath and -install_name flags
	  are affected when libruby directory changes.  [Bug #7874]

Wed Feb 20 19:27:02 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* include/ruby/ruby.h (HAVE_RB_SCAN_ARGS_OPTIONAL_HASH): for
	  rb_scan_args() optional hash feature.  [Bug #7861]

Wed Feb 20 18:02:26 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (target_os): do not strip -gnu suffix on Linux if
	  --target is given explicitly.  [Bug #7874]

	* configure.in (libdirname): adjust library path name which libruby
	  files will be installed.  [Bug #7874]

	* tool/rbinstall.rb (libdir): ditto.

Wed Feb 20 13:37:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/pty/pty.c: Documentation for the PTY module

Wed Feb 20 12:18:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* object.c: Document Data class [Bug #7890] [ruby-core:52549]
	  Patch by Matthew Mongeau

Wed Feb 20 11:50:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/mutex_m.rb: Add rdoc for Mutex_m module

Wed Feb 20 09:34:43 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems/commands/update_command.rb:  Create the installer after
	  options are processed.  [ruby-trunk - Bug #7779]
	* test/rubygems/test_gem_commands_update_command.rb:  Test for the
	  above.

Wed Feb 20 07:51:19 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems/installer.rb:  Use gsub instead of gsub! to avoid
	  altering @bin_dir.  Fixes tests on windows.  [ruby-trunk - Bug #7885]

Tue Feb 19 20:50:00 2013  Kenta MURATA  <mrkn@mrkn.jp>

	* ext/bigdecimal/bigdecimal.gemspec: bump to 1.2.0.
	  [ruby-core:51777] [Bug #7761]

Tue Feb 19 13:07:25 2013  Akinori MUSHA  <knu@iDaemons.org>

	* ext/syslog/syslog.c (Init_syslog): Define inspect as a singleton
	  method and remove it as an instance method. [Bug #6502]

Tue Feb 19 12:30:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* object.c: rdoc formatting for Kernel#Array()
	* array.c: Add rdoc for Array() method to Creating Arrays section

Tue Feb 19 10:35:52 2013  Eric Hodel  <drbrain@segment7.net>

	* ext/openssl/ossl.c (class OpenSSL):  Use only inner parenthesis in
	  create_extension examples.

Tue Feb 19 10:27:12 2013  Eric Hodel  <drbrain@segment7.net>

	* ext/openssl/ossl.c (class OpenSSL):  Fixed ExtensionFactory example.
	  Patch by Richard Bradley.  [ruby-trunk - Bug #7551]

Tue Feb 19 08:32:11 2013  Koichi Sasada  <ko1@atdot.net>

	* vm_eval.c (vm_call0_body): check interrupts after method dispatch
	  from C methods. [Bug #7878]

Tue Feb 19 08:14:40 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems/installer.rb:  Fixed placement of executables with
	  --user-install.  [ruby-trunk - Bug #7779]
	* test/rubygems/test_gem_installer.rb:  Test for above.

Tue Feb 19 06:04:06 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* vm_dump: FreeBSD ports' libexecinfo's backtrace(3) can't trace
	  beyond signal trampoline, and as described in r38342 it can't
	  trace on -O because it see stack frame pointers.
	  libunwind unw_backtrace see dwarf information in the binary
	  and it works with -O (without frame pointers).

	* configure.in: remove r38342's hack and check libunwind.

Tue Feb 19 04:26:29 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* configure.in: check whether backtrace(3) works well or not.

	* vm_dump.c: set HAVE_BACKTRACE 0 if BROKEN_BACKTRACE.

Mon Feb 18 16:30:18 2013  Akinori MUSHA  <knu@iDaemons.org>

	* lib/ipaddr.rb (IPAddr#in6_addr): Fix a typo with the closing
	  parenthesis.

Mon Feb 18 12:32:24 2013  Akinori MUSHA  <knu@iDaemons.org>

	* lib/ipaddr.rb (IPAddr#in6_addr): Fix the parser so that it can
	  recognize IPv6 addresses with only one edge 16-bit piece
	  compressed, like [::2:3:4:5:6:7:8] or [1:2:3:4:5:6:7::].
	  [Bug #7477]

Mon Feb 18 10:09:54 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (unexpand_shvar): regularize a shell variable by
	  unexpanding shell variables in it.

Sun Feb 17 20:55:44 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* compar.c (rb_invcmp): compare by inversed comparison, with preventing
	  from infinite recursion.  [ruby-core:52305] [Bug #7870]

	* string.c (rb_str_cmp_m), time.c (time_cmp): get rid of infinite
	  recursion.

Sun Feb 17 17:23:22 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb: remove extra topdir in VPATH, which was in
	  win32/Makefile.sub for some reason and moved from there.
	  [ruby-dev:46998] [Bug #7864]

Sun Feb 17 01:19:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* ext/psych/lib/psych/y.rb: Document Kernel#y by Adam Stankiewicz
	  [Github tenderlove/psych#127]

Sun Feb 17 00:52:14 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* tool/mkconfig.rb: remove prefix from rubyarchdir.
	  r39267 expands variables, it changes expansion timing,
	  breaks RbConfig::CONFIG["includedir"] and building
	  extension libraries with installed ruby.

Sat Feb 16 20:51:17 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* vm.c (ENV_IN_HEAP_P): fix off-by-one error.

Sat Feb 16 20:47:16 2013  Akinori MUSHA  <knu@iDaemons.org>

	* configure.in (LIBRUBY_DLDFLAGS): Fix a bug where --with-opt-dir
	  options given were not reflected to LIBRUBY_DLDFLAGS on many
	  platforms including Linux and other GNU-based systems, NetBSD,
	  AIX and BeOS.

Sat Feb 16 20:43:20 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/ancdata.c (rsock_recvmsg): ignore truncated part of
	  socket address returned from recvmsg().

	* ext/socket/init.c (recvfrom_blocking): ignore truncated part of
	  socket address returned from recvfrom().
	  (rsock_s_recvfrom_nonblock): ditto.

Sat Feb 16 20:05:26 2013  Ayumu AIZAWA  <ayumu.aizawa@gmail.com>

	* test/ruby/test_thread.rb: fixed typo
	  patched by Hiroki Matsue via https://github.com/ruby/ruby/pull/248

Sat Feb 16 16:08:35 2013  Koichi Sasada  <ko1@atdot.net>

	* vm.c (rb_thread_mark): mark a working Proc of bmethod
	  (a method defined by define_method) even if the method was removed.
	  We could not trace working Proc object which represents the body
	  of bmethod if the method was removed (alias/undef/overridden).
	  Simply, it was mark miss.
	  This patch by Kazuki Tsujimoto. [Bug #7825]

	  NOTE: We can brush up this marking because we do not need to mark
	  `me' on each living control frame. We need to mark `me's
	  only if `me' was free'ed. This is future work after Ruby 2.0.0.

	* test/ruby/test_method.rb: add a test.

Sat Feb 16 15:45:56 2013  Koichi Sasada  <ko1@atdot.net>

	* proc.c (rb_binding_new_with_cfp): create binding object even if
	  the frame is IFUNC. But return a ruby-level binding to keep
	  compatibility.
	  This patch fix degradation introduced from r39067.
	  [Bug #7774] [ruby-dev:46960]

	* test/ruby/test_settracefunc.rb: add a test.

Sat Feb 16 13:40:13 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (shvar_to_cpp): do not substitute exec_prefix itself
	  with RUBY_EXEC_PREFIX, which cause recursive definition.
	  [ruby-core:52296] [Bug #7860]

Sat Feb 16 13:13:04 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* ext/io/console/io-console.gemspec: bump to 0.4.2.  now explicitly
	  requires ruby 1.9.3 or later.  [Bug #7847]

	* ext/io/console/console.c (console_dev): compatibility with ruby 1.8.

	* ext/io/console/console.c (rawmode_opt, console_dev): compatibility
	  with ruby 1.9.  [ruby-core:52220] [Bug #7847]

Sat Feb 16 12:45:50 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: unexpand arch sitearch and exec_prefix values, so
	  directly specified bindir, libdir, rubyprefix, etc can be properly
	  substituted.  [ruby-core:52296] [Bug #7860]

Sat Feb 16 12:15:20 2013  Aaron Patterson <aaron@tenderlovemaking.com>

	* parse.y: add dtrace probe for symbol create.

	* probes.d: ditto

Sat Feb 16 09:27:37 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: don't test sys/feature_tests.h which is not
	  used now.
	  It was included in r7901 as "bug of gcc 3.0 on Solaris 8 ?".

Sat Feb 16 09:24:37 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: reorder header tests to consider inclusion
	  order in rubysocket.h.

Sat Feb 16 08:42:58 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in, ext/socket/extconf.rb: test netinet/in_systm.h in
	  ext/socket/extconf.rb instead of configure.in.

	  Originally, netinet/in_systm.h is included for NextStep, OpenStep,
	  and Rhapsody.  [ruby-core:1596]

Sat Feb 16 07:55:40 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: don't test xti.h here.

	* ext/socket/extconf.rb: test xti.h here.

	  Originally, xti.h is included for IRIX [ruby-core:14447].

Sat Feb 16 07:16:49 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: test struct sockaddr_un and its member,
	  sun_len.

	* ext/socket/sockport.h (INIT_SOCKADDR_UN): new macro defined.

	* ext/socket/socket.c (sock_s_pack_sockaddr_un): use INIT_SOCKADDR_UN.

	* ext/socket/unixsocket.c (rsock_init_unixsock): ditto.

	* ext/socket/raddrinfo.c (init_unix_addrinfo): ditto.
	  (addrinfo_mload): ditto.

Sat Feb 16 07:05:59 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/sockport.h (INIT_SOCKADDR_IN): don't need family
	  argument.  it is always AF_INET.

	* ext/socket/raddrinfo.c (make_inetaddr): follow INIT_SOCKADDR_IN
	  change.
	  (addrinfo_ipv6_to_ipv4): ditto.

Sat Feb 16 04:21:07 2013  NAKAMURA Usaku  <usa@ruby-lang.org>

	* ext/socket/extconf.rb: workaround for mswin/mingw build problem.
	  sendmsg emulation in win32/win32.c is not enough.

Sat Feb 16 00:19:20 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: use all all tested available headers for
	  have_func.

Fri Feb 15 22:21:37 2013  Akinori MUSHA  <knu@iDaemons.org>

	* configure.in: Fix a bug introduced in r38342 that the cflagspat
	  substitution is messed up by the way CFLAGS and optflags are
	  modified, which affected FreeBSD and NetBSD/amd64 when
	  configured to use libexecinfo.  This bug resulted in CFLAGS and
	  CXXFLAGS in RbConfig::CONFIG having warnflags expanded in them,
	  forcing third-party C/C++ extensions to follow what warnflags
	  demands, like ANSI/ISO-C90 conformance.  ref [Bug #7101]

Fri Feb 15 20:29:11 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/sockport.h (SET_SIN_LEN): defined for strict-aliasing
	  rule.
	  (INIT_SOCKADDR_IN): ditto.

	* ext/socket/raddrinfo.c (make_inetaddr): use INIT_SOCKADDR_IN.
	  (addrinfo_ipv6_to_ipv4): ditto.

Fri Feb 15 18:24:48 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* lib/mkmf.rb (MakeMakefile#try_run): bail out explicitly if cross
	  compiling, because it cannot work of course.

Fri Feb 15 12:34:58 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: test struct sockaddr_storage directly.

	* ext/socket/rubysocket.h: use HAVE_TYPE_STRUCT_SOCKADDR_STORAGE.

Fri Feb 15 12:26:13 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/getaddrinfo.c (GET_AI): don't cast 1st argument for
	  INIT_SOCKADDR.

Fri Feb 15 08:12:11 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/sockport.h (SET_SS_LEN): removed.
	  (SET_SIN_LEN): removed.
	  (INIT_SOCKADDR): new macro.

	* ext/socket/ancdata.c (extract_ipv6_pktinfo): use INIT_SOCKADDR.

	* ext/socket/raddrinfo.c (make_inetaddr): use INIT_SOCKADDR.
	  (addrinfo_ipv6_to_ipv4): ditto.

	* ext/socket/getaddrinfo.c (GET_AI): use INIT_SOCKADDR.

Fri Feb 15 07:49:27 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rdoc.rb:  Update to release version of 4.0.0

	* lib/rubygems.rb:  Update to release version of 2.0.0

Fri Feb 15 07:07:27 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/sockport.h (SA_LEN): removed because unused now.
	  (SS_LEN): ditto.
	  (SIN_LEN): ditto.

Thu Feb 14 10:45:31 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* test/ruby/test_process.rb (test_setsid): Added a workaround for
	  MacOS X. Patch by nagachika. [Bug #7826] [ruby-core:52126]

Fri Feb 15 00:15:31 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/sockport.h (VALIDATE_SOCKLEN): new macro to validate
	  sa_len member of 4.4BSD socket address.

	* ext/socket/getnameinfo.c (getnameinfo): use VALIDATE_SOCKLEN,
	  instead of SA_LEN.

	* ext/socket/socket.c (sock_s_getnameinfo): use VALIDATE_SOCKLEN
	  instead of SS_LEN.

Thu Feb 14 22:25:54 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/socket.c (sockaddr_len): extracted from sockaddr_obj.
	  (sockaddr_obj): add an argument to length of socket address.
	  (socket_s_ip_address_list): call sockaddr_obj with actual socket
	  address length if given, use sockaddr_len otherwise.

Thu Feb 14 20:11:23 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket: always operate length of socket address companion with
	  socket address.

	* ext/socket/rubysocket.h (rsock_make_ipaddr): add an argument for
	  socket address length.
	  (rsock_ipaddr): ditto.

	* ext/socket/ipsocket.c (ip_addr): pass length to rsock_ipaddr.
	  (ip_peeraddr): ditto.
	  (ip_s_getaddress): pass length to rsock_make_ipaddr.

	* ext/socket/socket.c (make_addrinfo): pass length to rsock_ipaddr.
	  (sock_s_getnameinfo): pass actual address length to rb_getnameinfo.
	  (sock_s_unpack_sockaddr_in): pass length to rsock_make_ipaddr.

	* ext/socket/init.c (rsock_s_recvfrom): pass length to rsock_ipaddr.
	  (rsock_s_recvfrom_nonblock): ditto.

	* ext/socket/tcpsocket.c (tcp_sockaddr): pass length to
	  rsock_make_ipaddr.

	* ext/socket/raddrinfo.c (make_ipaddr0): add an argument for socket
	  address length.  pass the length to rb_getnameinfo.
	  (rsock_ipaddr): ditto.
	  (rsock_make_ipaddr): add an argument for socket address length.
	  pass the length to make_ipaddr0.
	  (make_inetaddr): pass length to make_ipaddr0.
	  a local variable renamed.
	  (host_str): a local variable renamed.
	  (port_str): ditto.

Thu Feb 14 14:31:43 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/net/http.rb:  Removed OpenSSL dependency from Net::HTTP.

	* test/net/http/test_http.rb:  Remove Zlib dependency from tests.
	* test/net/http/test_http_request.rb:  ditto.

Thu Feb 14 11:08:15 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* class.c (include_modules_at): detect cyclic prepend with original
	  method table.  [ruby-core:52205] [Bug #7841]

Thu Feb 14 10:30:41 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* vm_method.c: call method_removed hook on called class, not on
	  prepending iclass.  [ruby-core:52207] [Bug #7843]

Thu Feb 14 10:05:57 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/net/http:  Do not handle Content-Encoding when the user sets
	  Accept-Encoding.  This allows users to handle Content-Encoding for
	  themselves.  This restores backwards-compatibility with Ruby 1.x.
	  [ruby-trunk - Bug #7831]
	* lib/net/http/generic_request.rb:  ditto.
	* lib/net/http/response.rb:  ditto
	* test/net/http/test_http.rb:  Test for the above.
	* test/net/http/test_http_request.rb:  ditto.
	* test/net/http/test_httpresponse.rb:  ditto.

Thu Feb 14 08:18:47 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: don't define HAVE_SA_LEN and HAVE_SA_LEN.
	  use HAVE_STRUCT_SOCKADDR_SA_LEN and HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
	  instead.

Wed Feb 13 20:59:48 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: don't define socklen_t here, just test.

	* ext/socket/rubysocket.h: define socklen_t if not available.

Wed Feb 13 18:37:50 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* proc.c (mnew): skip prepending modules and return the method bound
	  on the given class.  [ruby-core:52160] [Bug #7836]

Wed Feb 13 18:11:59 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* proc.c (method_original_name): new methods Method#original_name and
	  UnboundMethod#original_name.  [ruby-core:52048] [Bug #7806]
	  [EXPERIMENTAL]

	* proc.c (method_inspect): show the given name primarily, and
	  original_id if aliased.  [ruby-core:52048] [Bug #7806]

Wed Feb 13 17:56:39 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (warnflags): disable -Werror by default unless
	  development.  [ruby-core:52131] [Bug #7830]

Wed Feb 13 06:05:52 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems.rb:  Return BINARY strings from Gem.gzip and Gem.gunzip.
	  Fixes intermittent test failures.  RubyGems issue #450 by Jeremey
	  Kemper.
	* test/rubygems/test_gem.rb:  Test for the above.

Wed Feb 13 05:49:21 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: test functions just after struct members.

Tue Feb 12 12:02:35 2013  NARUSE, Yui  <naruse@ruby-lang.org>

	* ext/json: merge JSON 1.7.7.
	  This includes security fix. [CVE-2013-0269]
	  https://github.com/flori/json/commit/d0a62f3ced7560daba2ad546d83f0479a5ae2cf2
	  https://groups.google.com/d/topic/rubyonrails-security/4_YvCpLzL58/discussion

Mon Feb 11 23:08:48 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: enable rb_cv_page_size_log test for MirOS BSD.

Mon Feb 11 20:06:38 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: use -pthread on mirbsd*.

Mon Feb 11 16:07:09 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: add SOLIBS and LIBRUBY_SO definition for mirbsd*.

Mon Feb 11 13:17:20 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in (rubysitearchprefix): sitearchdir and vendorarchdir
	  should use sitearch, not arch.  [ruby-dev:46964] [Bug #7823]

	* win32/Makefile.sub (config.status): site and vendor directories
	  should use sitearch, not arch.  [ruby-dev:46964] [Bug #7823]

Mon Feb 11 12:31:25 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: move OS specific header/function knowledge before
	  automatic header tests.

Mon Feb 11 11:04:29 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: move the test for -march=i486 just after
	  RUBY_UNIVERSAL_ARCH/RUBY_DEFAULT_ARCH.

Sun Feb 10 23:42:26 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: test structure members just after types test.

Sun Feb 10 20:58:17 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: test types just after headers test.

Sun Feb  10 16:00:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/rake/doc/MIT-LICENSE: Add license file from upstream
	* lib/rake/doc/README.rdoc: Link to license file from Rake README
	* lib/rake/version.rb: Include README rdoc for Rake module overview

Sun Feb  10 15:26:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/rake/doc/*: Sync Rake rdoc files from upstream

Sun Feb 10 15:50:02 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* vm_exec.h (DISPATCH_ARCH_DEPEND_WAY): use __asm__ __volatile__
	  instead of asm volatile.

Sun Feb 10 15:50:02 2013  KOSAKI Motohiro  <kosaki.motohiro@gmail.com>

	* gc.h (SET_MACHINE_STACK_END): use __volatile__ instead of volatile.

Sun Feb 10 14:25:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* doc/rake/, lib/rake/doc/: Move Rake rdoc files to lib/rake

Sun Feb 10 12:10:25 2013  Tanaka Akira  <akr@fsij.org>

	* ext/socket/extconf.rb: test headers at first.

Sun Feb  10 12:00:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* doc/rake/*: Removed stale Rake static files

Sun Feb  10 09:10:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* lib/pp.rb, lib/prettyprint.rb: Documentation for PP and PrettyPrint
	  Based on a patch by Vincent Batts [ruby-core:51253] [Bug #7656]

Sat Feb  9 21:11:21 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: move header files check to the beginning of
	  "header and library section".
	  test rlim_t with sys/types.h and sys/time.h for MirOS BSD.
	  sys/types.h and sys/time.h is guarded by #ifdef and the above
	  move is required for this change.

Sat Feb  9 17:45:58 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in, version.c: prevent duplicated load paths by empty
	  version string, it does not work right now.

Sat Feb  9 17:38:41 2013  Nobuyoshi Nakada  <nobu@ruby-lang.org>

	* configure.in: fix arch parameters in help message.  [Bug #7804]

Sat Feb  9 13:13:00 2013  Zachary Scott  <zachary@zacharyscott.net>

	* vm_trace.c: Note about TracePoint events set, and comment on
	  Kernel#set_trace_func to prefer new TracePoint API

Sat Feb  9 10:07:47 2013  Kazuki Tsujimoto  <kazuki@callcc.net>

	* BSDL: update copyright notice for 2013.

Sat Feb  9 09:24:38 2013  Eric Hodel  <drbrain@segment7.net>

	* lib/rubygems/package/old.rb:  Fix behavior only on ruby 1.8.

	* lib/rubygems/package.rb:  Include checksums.yaml.gz signatures for
	  verification.
	* test/rubygems/test_gem_package.rb:  Test for the above.

Sat Feb  9 01:23:24 2013  Tanaka Akira  <akr@fsij.org>

	* test/fiddle/helper.rb: specify libc and libm locations for MirOS BSD.

	* test/dl/test_base.rb: ditto.

Fri Feb  8 23:25:33 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: change CFLAGS temporally to test
	  ARCH_FLAG="-march=i486".

Fri Feb  8 21:19:41 2013  Tanaka Akira  <akr@fsij.org>

	* configure.in: don't define ARCH_FLAG="-march=i486" if it causes
	  compilation problem.

For the changes before 2.0.0, see doc/ChangeLog-2.0.0
For the changes before 1.9.3, see doc/ChangeLog-1.9.3
For the changes before 1.8.0, see doc/ChangeLog-1.8.0

Local variables:
coding: us-ascii
add-log-time-format: (lambda ()
  (let* ((time (current-time))
	 (system-time-locale "C")
	 (diff (+ (cadr time) 32400))
	 (lo (% diff 65536))
	 (hi (+ (car time) (/ diff 65536))))
  (format-time-string "%a %b %e %H:%M:%S %Y" (list hi lo) t)))
indent-tabs-mode: t
tab-width: 8
change-log-indent-text: 2
end:
vim: tabstop=8 shiftwidth=2
PK~[p.ܻ0�0doc/alt-ruby21/NEWSnu�[���# -*- rdoc -*-

= NEWS for Ruby 2.1.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.

== Changes since the 2.0.0 release

=== Language changes

* Now the default values of keyword arguments can be omitted.  Those
  "required keyword arguments" need giving explicitly at the call time.

* Added suffixes for integer and float literals: 'r', 'i', and 'ri'.
  * "42r" and "3.14r" are evaluated as Rational(42, 1) and 3.14.rationalize,
    respectively.  But exponential form with 'r' suffix like "6.022e+23r" is
    not accepted because it is misleading.
  * "42i" and "3.14i" are evaluated as Complex(0, 42) and Complex(0, 3.14),
    respectively.
  * "42ri" and "3.14ri" are evaluated as Complex(0, 42r) and Complex(0, 3.14r),
    respectively.

* def-expr now returns the symbol of its name instead of nil.

=== Core classes updates (outstanding ones only)

* Array
  * New methods
    * Array#to_h converts an array of key-value pairs into a Hash.

* Binding
  * New methods
    * Binding#local_variable_get(symbol)
    * Binding#local_variable_set(symbol, obj)
    * Binding#local_variable_defined?(symbol)

* Enumerable
  * New methods
    * Enumerable#to_h converts a list of key-value pairs into a Hash.

* Exception
  * New methods
    * Exception#cause provides the previous exception which has been caught
      at where raising the new exception.

* GC
  * improvements:
    * introduced the generational GC a.k.a RGenGC.
  * added environment variables:
    * RUBY_GC_HEAP_INIT_SLOTS
    * RUBY_GC_HEAP_FREE_SLOTS
    * RUBY_GC_HEAP_GROWTH_FACTOR
    * RUBY_GC_HEAP_GROWTH_MAX_SLOTS
    * RUBY_GC_MALLOC_LIMIT_MAX
    * RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR
    * RUBY_GC_OLDMALLOC_LIMIT
    * RUBY_GC_OLDMALLOC_LIMIT_MAX
    * RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR
  * obsoleted environment variables:
    * RUBY_FREE_MIN (Use RUBY_GC_HEAP_FREE_SLOTS instead)
    * RUBY_HEAP_MIN_SLOTS (Use RUBY_GC_HEAP_INIT_SLOTS instead)

* Integer
  * New methods
    * Fixnum#bit_length
    * Bignum#bit_length
  * Bignum performance improvement
    * Use GMP if available.
      GMP is used only for several operations:
      multiplication, division, radix conversion, GCD

* IO
  * extended methods:
    * IO#seek supports SEEK_DATA and SEEK_HOLE as whence.
    * IO#seek accepts symbols (:CUR, :END, :SET, :DATA, :HOLE) for 2nd argument.
    * IO#read_nonblock accepts optional `exception: false` to return symbols
    * IO#write_nonblock accepts optional `exception: false` to return symbols

* Kernel
  * New methods:
    * Kernel#singleton_method

* Module
  * New methods:
    * Module#using, which activates refinements of the specified module only
      in the current class or module definition.
    * Module#singleton_class? returns true if the receiver is a singleton class
      or false if it is an ordinary class or module.
  * extended methods:
    * Module#refine is no longer experimental.
    * Module#include and Module#prepend are now public methods.

* Mutex
  * misc
    * Mutex#owned? is no longer experimental.

* Numeric
  * extended methods:
    * Numeric#step allows the limit argument to be omitted, in which
      case an infinite sequence of numbers is generated.  Keyword
      arguments `to` and `by` are introduced for ease of use.

* Process
  * New methods:
    * alternative methods to $0/$0=:
      * Process.argv0() returns the original value of $0.
      * Process.setproctitle() sets the process title without affecting $0.
    * Process.clock_gettime
    * Process.clock_getres

* String
  * "literal".freeze is now optimized to return the same object
  * New methods:
    * String#scrub and String#scrub! verify and fix invalid byte sequence.
      If you want to use this function with older Ruby,
      consider to use string-scrub.gem.

* Symbol
  * All symbols are now frozen.

* pack/unpack (Array/String)
  * Q! and q! directives for long long type if platform has the type.

* toplevel
  * extended methods:
    * main.using is no longer experimental. The method activates refinements
      in the ancestors of the argument module to support refinement
      inheritance by Module#include.

=== Core classes compatibility issues (excluding feature bug fixes)

* Dir
  * incompatible changes:
    * Dir#glob returns composed characters (previously Apple Modofied UTF-8).

* Hash
  * incompatible changes:
    * Hash#reject will return plain Hash object in the future versions, that
      is the original object's subclass, instance variables, default value,
      and taintedness will be no longer copied, so now warnings are emitted
      when called with such Hash.

* IO
  * incompatible changes:
    * open ignore internal encoding if external encoding is ASCII-8BIT.
  * IO#each_codepoint raises an exception at incomplete character
    before EOF when conversion takes place.  [Bug #11444]

* Kernel#eval, Kernel#instance_eval, and Module#module_eval.
  * Copies the scope information of the original environment, which means
    that private, protected, public, and module_function without arguments
    do not affect the environment outside the eval string.
    For example, `class Foo; eval "private"; def foo; end; end' doesn't make
    Foo#foo private.

* Kernel#untrusted?, untrust, and trust
  * These methods are deprecated and their behavior is same as tainted?,
    taint, and untaint, respectively.  If $VERBOSE is true, they show warnings.

* Module#ancestors
  * The ancestors of a singleton class now include singleton classes,
    in particular itself.

* Module#define_method and Object#define_singleton_method
  * Now they return the symbols of the defined methods, not the methods/procs
    themselves.

* Numeric#quo
  * Raises TypeError instead of ArgumentError if the receiver doesn't have
    to_r method.

* Proc
  * Returning from lambda proc now always exits from the Proc, not from the
    method where the lambda is created.  Returning from non-lambda proc exits
    from the method, same as the former behavior.

String
  * If invalid: :replace is specified for String#encode, replace
    invalid byte sequence even if the destination encoding equals to
    the source encoding.

=== Stdlib updates (outstanding ones only)

* CGI::Util
  * All class methods modulized.

* Digest
  * extended methods:
    * Digest::Class.file takes optional arguments for its constructor

* Matrix
  * Added Vector#cross_product.

* Net::SMTP
  * Added Net::SMTP#rset to implement the RSET command

* objspace
  * new method:
    * ObjectSpace.trace_object_allocations
    * ObjectSpace.trace_object_allocations_starPK~[p.ܻ0�0doc/alt-ruby21/NEWSnu�[���.trace_object_allocations_clear
    * ObjectSpace.allocation_sourcefile
    * ObjectSpace.allocation_sourceline
    * ObjectSpace.allocation_class_path
    * ObjectSpace.allocation_method_id
    * ObjectSpace.allocation_generation
    * ObjectSpace.reachable_objects_from_root
    * ObjectSpace.dump
    * ObjectSpace.dump_all

* OpenSSL::BN
  * extended methods:
    * OpenSSL::BN.new allows Fixnum/Bignum argument.

* open-uri
  * Support multiple fields with same field name (like Set-Cookie).

* Pathname
  * New methods:
    * Pathname#write
    * Pathname#binwrite

* rake
  * Updated to 10.1.0.  Major changes include removal of the class namespace,
    Rake::DSL to hold the rake DSL methods and removal of support for legacy
    rake features.

    For a complete list of changes since rake 0.9.6 see:

    http://rake.rubyforge.org/doc/release_notes/rake-10_1_0_rdoc.html

    http://rake.rubyforge.org/doc/release_notes/rake-10_0_3_rdoc.html

* RbConfig
  * New constants:
    * RbConfig::SIZEOF is added to provide the size of C types.

* RDoc
  * Updated to 4.1.0.  Major enhancements include a modified default template
  * and accessibility enhancements.

    For a list of minor enhancements and bug fixes see:
    https://github.com/rdoc/rdoc/blob/v4.1.0.preview.1/History.rdoc

* Resolv
  * New methods:
    * Resolv::DNS.fetch_resource
  * One-shot multicast DNS support
  * Support LOC resources

* REXML::Parsers::SAX2Parser
  * Fixes wrong number of arguments of entitydecl event. Document of the event
    says "an array of the entity declaration" but implementation passes two
    or more arguments. It is an implementation bug but it breaks backward
    compatibility.

* REXML::Parsers::StreamParser
  * Supports "entity" event.

* REXML::Text
  * REXML::Text#<< supports method chain like 'text << "XXX" << "YYY"'.
  * REXML::Text#<< supports not "raw" mode.

* Rinda::RingServer, Rinda::RingFinger
  * Rinda now supports multicast sockets.  See Rinda::RingServer and
    Rinda::RingFinger for details.

* RubyGems
  * Updated to 2.2.0.  Notable new features include:

    * Gemfile or gem.deps.rb support including Gem.file.lock (experimental)
    * Improved, iterative resolver (compared to RubyGems 2.1 and earlier)
    * Support for a sharing a GEM_HOME across ruby platforms and versions

  * Updated to 2.2.2.  Fixes some minor bugs and performance regressions.

    For a complete list of enhancements and bug fixes see:
    https://github.com/rubygems/rubygems/tree/master/History.txt

* Set
  * New methods:
    * Set#intersect?
    * Set#disjoint?

* Socket
  * New methods:
    * Socket.getifaddrs

* StringScanner
  * extended methods:
    * StringScanner#[] supports named captures.

* Syslog::Logger
  * Added facility.

* Tempfile
  * New methods:
    * Tempfile.create

* Timeout
  * The exception to terminate the given block can no longer be rescued
    inside the block, by default, unless the exception class is given
    explicitly.

* TSort
  * New methods:
    * TSort.tsort
    * TSort.tsort_each
    * TSort.strongly_connected_components
    * TSort.each_strongly_connected_component
    * TSort.each_strongly_connected_component_from

* WEBrick
  * The body of a response may now be a StringIO or other IO-like that responds
    to #readpartial and #read.

* XMLRPC::Client
  * New methods:
    * XMLRPC::Client#http. It returns Net::HTTP for the client. Normally,
      it is not needed. It is useful when you want to change minor HTTP client
      options. You can change major HTTP client options by XMLRPC::Client
      methods. You should use XMLRPC::Client methods for changing major
      HTTP client options instead of XMLRPC::Client#http.

=== Stdlib compatibility issues (excluding feature bug fixes)

* Set
  * incompatible changes:
    * Set#to_set now returns self instead of generating a copy.

* URI
  * incompatible changes:
    * URI.decode_www_form follows current WHATWG URL Standard.
      It gets encoding argument to specify the character encoding.
      It now allows loose percent encoded strings, but denies ;-separator.
    * URI.encode_www_form follows current WHATWG URL Standard.
      It gets encoding argument to convert before percent encode.
      UTF-16 strings aren't converted to UTF-8 before percent encode by default.

* curses
  * Removed.
    curses is now available as a gem.
    See https://rubygems.org/gems/curses for details.

=== Built-in global variables compatibility issues

* $SAFE
  * $SAFE=4 is obsolete.  If $SAFE is set to 4 or larger, an ArgumentError
    is raised.

=== C API updates

* rb_gc_set_params() is deprecated. This is only used in Ruby internal.

* rb_gc_count() added. This returns the number of times GC occurred.

* rb_gc_stat() added. This allows access to specific GC.stat() values from C
  without any allocation overhead.

* rb_gc_latest_gc_info() added. This allows access to GC.latest_gc_info().

* rb_postponed_job_register() added. Takes a function callback which is invoked
  when the VM is in a consistent state, i.e. to perform work from a C signal
  handler.

* rb_profile_frames() added. Provides low-cost access to the current ruby stack
  for callstack profiling.

* rb_tracepoint_new() supports new internal events accessible only from C:
  * RUBY_INTERNAL_EVENT_NEWOBJ
  * RUBY_INTERNAL_EVENT_FREEOBJ
  * RUBY_INTERNAL_EVENT_GC_START
  * RUBY_INTERNAL_EVENT_GC_END_MARK
  * RUBY_INTERNAL_EVENT_GC_END_SWEEP
  * Note that you *can not* specify "internal events" with normal events
    (such as RUBY_EVENT_CALL, RUBY_EVENT_RETURN) simultaneously.
PK~[�C,@
@
doc/alt-ruby21/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~[�;����doc/alt-ruby21/README.EXTnu�[���# README.EXT -  -*- RDoc -*- created at: Mon Aug  7 16:45:54 JST 1995

This document explains how to make extension libraries for Ruby.

= Basic Knowledge

In C, variables have types and data do not have types.  In contrast,
Ruby variables do not have a static type, and data themselves have
types, so data will need to be converted between the languages.

Data in Ruby are represented by the C type `VALUE'.  Each VALUE data
has its data-type.

To retrieve C data from a VALUE, you need to:

1. Identify the VALUE's data type
2. Convert the VALUE into C data

Converting to the wrong data type may cause serious problems.

== Data-Types

The Ruby interpreter has the following data types:

T_NIL       :: nil
T_OBJECT    :: ordinary object
T_CLASS     :: class
T_MODULE    :: module
T_FLOAT     :: floating point number
T_STRING    :: string
T_REGEXP    :: regular expression
T_ARRAY     :: array
T_HASH      :: associative array
T_STRUCT    :: (Ruby) structure
T_BIGNUM    :: multi precision integer
T_FIXNUM    :: Fixnum(31bit or 63bit integer)
T_COMPLEX   :: complex number
T_RATIONAL  :: rational number
T_FILE      :: IO
T_TRUE      :: true
T_FALSE     :: false
T_DATA      :: data
T_SYMBOL    :: symbol

In addition, there are several other types used internally:

T_ICLASS    :: included module
T_MATCH     :: MatchData object
T_UNDEF     :: undefined
T_NODE      :: syntax tree node
T_ZOMBIE    :: object awaiting finalization

Most of the types are represented by C structures.

== Check Data Type of the VALUE

The macro TYPE() defined in ruby.h shows the data type of the VALUE.
TYPE() returns the constant number T_XXXX described above.  To handle
data types, your code will look something like this:

  switch (TYPE(obj)) {
    case T_FIXNUM:
      /* process Fixnum */
      break;
    case T_STRING:
      /* process String */
      break;
    case T_ARRAY:
      /* process Array */
      break;
    default:
      /* raise exception */
      rb_raise(rb_eTypeError, "not valid value");
      break;
  }

There is the data-type check function

  void Check_Type(VALUE value, int type)

which raises an exception if the VALUE does not have the type
specified.

There are also faster check macros for fixnums and nil.

  FIXNUM_P(obj)
  NIL_P(obj)

== Convert VALUE into C Data

The data for type T_NIL, T_FALSE, T_TRUE are nil, false, true
respectively.  They are singletons for the data type.
The equivalent C constants are: Qnil, Qfalse, Qtrue.
Note that Qfalse is false in C also (i.e. 0), but not Qnil.

The T_FIXNUM data is a 31bit or 63bit length fixed integer.
This size is depend on the size of long: if long is 32bit then
T_FIXNUM is 31bit, if long is 64bit then T_FIXNUM is 63bit.
T_FIXNUM can be converted to a C integer by using the
FIX2INT() macro or FIX2LONG().  Though you have to check that the
data is really FIXNUM before using them, they are faster.  FIX2LONG()
never raises exceptions, but FIX2INT() raises RangeError if the
result is bigger or smaller than the size of int.
There are also NUM2INT() and NUM2LONG() which converts any Ruby
numbers into C integers.  These macros includes a type check,
so an exception will be raised if the conversion failed.  NUM2DBL()
can be used to retrieve the double float value in the same way.

You can use the macros
StringValue() and StringValuePtr() to get a char* from a VALUE.
StringValue(var) replaces var's value with the result of "var.to_str()".
StringValuePtr(var) does same replacement and returns char*
representation of var.  These macros will skip the replacement if var
is a String.  Notice that the macros take only the lvalue as their
argument, to change the value of var in place.

You can also use the macro named StringValueCStr(). This is just
like StringValuePtr(), but always add nul character at the end of
the result. If the result contains nul character, this macro causes
the ArgumentError exception.
StringValuePtr() doesn't guarantee the existence of a nul at the end
of the result, and the result may contain nul.

Other data types have corresponding C structures, e.g. struct RArray
for T_ARRAY etc. The VALUE of PK~[�C,@
@
doc/alt-ruby21/COPYING.janu�[���e pointer to the struct.  The
casting macro will be of the form RXXXX for each data type; for
instance, RARRAY(obj).  See "ruby.h".  However, we do not recommend
to access RXXXX data directly because these data structure is complex.
Use corresponding rb_xxx() functions to access internal struct.
For example, to access an entry of array, use rb_ary_entry(ary, offset)
and rb_ary_store(ary, offset, obj).

There are some accessing macros for structure members, for example
`RSTRING_LEN(str)' to get the size of the Ruby String object.  The
allocated region can be accessed by `RSTRING_PTR(str)'.

Notice: Do not change the value of the structure directly, unless you
are responsible for the result.  This ends up being the cause of
interesting bugs.

== Convert C Data into VALUE

To convert C data to Ruby values:

FIXNUM ::

  left shift 1 bit, and turn on LSB.

Other pointer values::

  cast to VALUE.

You can determine whether a VALUE is pointer or not by checking its LSB.

Notice Ruby does not allow arbitrary pointer values to be a VALUE.  They
should be pointers to the structures which Ruby knows about.  The known
structures are defined in <ruby.h>.

To convert C numbers to Ruby values, use these macros.

INT2FIX() :: for integers within 31bits.
INT2NUM() :: for arbitrary sized integer.

INT2NUM() converts an integer into a Bignum if it is out of the FIXNUM
range, but is a bit slower.

== Manipulating Ruby Data

As I already mentioned, it is not recommended to modify an object's
internal structure.  To manipulate objects, use the functions supplied
by the Ruby interpreter. Some (not all) of the useful functions are
listed below:

=== String Functions

rb_str_new(const char *ptr, long len) ::

  Creates a new Ruby string.

rb_str_new2(const char *ptr) ::
rb_str_new_cstr(const char *ptr) ::

  Creates a new Ruby string from a C string.  This is equivalent to
  rb_str_new(ptr, strlen(ptr)).

rb_tainted_str_new(const char *ptr, long len) ::

  Creates a new tainted Ruby string.  Strings from external data
  sources should be tainted.

rb_tainted_str_new2(const char *ptr) ::
rb_tainted_str_new_cstr(const char *ptr) ::

  Creates a new tainted Ruby string from a C string.

rb_sprintf(const char *format, ...) ::
rb_vsprintf(const char *format, va_list ap) ::

  Creates a new Ruby string with printf(3) format.

  Note: In the format string, %i is used for Object#to_s (or Object#inspect if
  '+' flag is set) output (and related argument must be a VALUE).  For integers
  in format strings, use %d.

rb_str_cat(VALUE str, const char *ptr, long len) ::

  Appends len bytes of data from ptr to thePK~[�;����doc/alt-ruby21/README.EXTnu�[���ring ptr to Ruby string str.  This function is
  equivalent to rb_str_cat(str, ptr, strlen(ptr)).

rb_str_catf(VALUE str, const char* format, ...) ::
rb_str_vcatf(VALUE str, const char* format, va_list ap) ::

  Appends C string format and successive arguments to Ruby string
  str according to a printf-like format.  These functions are
  equivalent to rb_str_cat2(str, rb_sprintf(format, ...)) and
  rb_str_cat2(str, rb_vsprintf(format, ap)), respectively.

rb_enc_str_new(const char *ptr, long len, rb_encoding *enc) ::
rb_enc_str_new_cstr(const char *ptr, rb_encoding *enc) ::

  Creates a new Ruby string with the specified encoding.

rb_usascii_str_new(const char *ptr, long len) ::
rb_usascii_str_new_cstr(const char *ptr) ::

  Creates a new Ruby string with encoding US-ASCII.

rb_str_resize(VALUE str, long len) ::

  Resizes Ruby string to len bytes.  If str is not modifiable, this
  function raises an exception.  The length of str must be set in
  advance.  If len is less than the old length the content beyond
  len bytes is discarded, else if len is greater than the old length
  the content beyond the old length bytes will not be preserved but
  will be garbage.  Note that RSTRING_PTR(str) may change by calling
  this function.

rb_str_set_len(VALUE str, long len) ::

  Sets the length of Ruby string.  If str is not modifiable, this
  function raises an exception.  This function preserves the content
  upto len bytes, regardless RSTRING_LEN(str).  len must not exceed
  the capacity of str.

=== Array Functions

rb_ary_new() ::

  Creates an array with no elements.

rb_ary_new2(long len) ::
rb_ary_new_capa(long len) ::

  Creates an array with no elements, allocating internal buffer
  for len elements.

rb_ary_new3(long n, ...) ::
rb_ary_new_from_args(long n, ...) ::

  Creates an n-element array from the arguments.

rb_ary_new4(long n, VALUE *elts) ::
rb_ary_new_from_values(long n, VALUE *elts) ::

  Creates an n-element array from a C array.

rb_ary_to_ary(VALUE obj) ::

  Converts the object into an array.
  Equivalent to Object#to_ary.

There are many functions to operate an array.  They may dump core if other
types are given.

rb_ary_aref(argc, VALUE *argv, VALUE ary) ::

  Equivalent to Array#[].

rb_ary_entry(VALUE ary, long offset) ::

  ary[offset]

rb_ary_store(VALUE ary, long offset, VALUE obj) ::

  ary[offset] = obj

rb_ary_subseq(VALUE ary, long beg, long len) ::

  ary[beg, len]

rb_ary_push(VALUE ary, VALUE val) ::
rb_ary_pop(VALUE ary) ::
rb_ary_shift(VALUE ary) ::
rb_ary_unshift(VALUE ary, VALUE val) ::

rb_ary_cat(VALUE ary, const VALUE *ptr, long len) ::

  Appends len elements of objects from ptr to the array.

= Extending Ruby with C

== Adding New Features to Ruby

You can add new features (classes, methods, etc.) to the Ruby
interpreter.  Ruby provides APIs for defining the following things:

* Classes, Modules
* Methods, Singleton Methods
* Constants

=== Class and Module Definition

To define a class or module, use the functions below:

  VALUE rb_define_class(const char *name, VALUE super)
  VALUE rb_define_module(const char *name)

These functions return the newly created class or module.  You may
want to save this reference into a variable to use later.

To define nested classes or modules, use the functions below:

  VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
  VALUE rb_define_module_under(VALUE outer, const char *name)

=== Method and Singleton Method Definition

To define methods or singleton methods, use these functions:

  void rb_define_method(VALUE klass, const char *name,
		        VALUE (*func)(), int argc)

  void rb_define_singleton_method(VALUE object, const char *name,
			          VALUE (*func)(), int argc)

The `argc' represents the number of the arguments to the C function,
which must be less than 17.  But I doubt you'll need that many.

If `argc' is negative, it specifies the calling sequence, not number of
the arguments.

If argc is -1, the function will be called as:

  VALUE func(int argc, VALUE *argv, VALUE obj)

where argc is the actual number of arguments, argv is the C array of
the arguments, and obj is the receiver.

If argc is -2, the arguments are passed in a Ruby array. The function
will be called like:

  VALUE func(VALUE obj, VALUE args)

where obj is the receiver, and args is the Ruby array containing
actual arguments.

There are some more functions to define methods. One takes an ID
as the name of method to be defined. See also ID or Symbol below.

  void rb_define_method_id(VALUE klass, ID name,
                           VALUE (*func)(ANYARGS), int argc)

There are two functions to define private/protected methods:

  void rb_define_private_method(VALUE klass, const char *name,
			        VALUE (*func)(), int argc)
  void rb_define_protected_method(VALUE klass, const char *name,
			          VALUE (*func)(), int argc)

At last, rb_define_module_function defines a module functions,
which are private AND singleton methods of the module.
For example, sqrt is the module function defined in Math module.
It can be called in the following way:

  Math.sqrt(4)

or

  include Math
  sqrt(4)

To define module functions, use:

  void rb_define_module_function(VALUE module, const char *name,
				 VALUE (*func)(), int argc)

In addition, function-like methods, which are private methods defined
in the Kernel module, can be defined using:

  void rb_define_global_function(const char *name, VALUE (*func)(), int argc)

To define an alias for the method,

  void rb_define_alias(VALUE module, const char* new, const char* old);

To define a reader/writer for an attribute,

  void rb_define_attr(VALUE klass, const char *name, int read, int write)

To define and undefine the `allocate' class method,

  void rb_define_alloc_func(VALUE klass, VALUE (*func)(VALUE klass));
  void rb_undef_alloc_func(VALUE klass);

func has to take the klass as the argument and return a newly
allocated instance.  This instance should be as empty as possible,
without any expensive (including external) resources.

=== Constant Definition

We have 2 functions to define constants:

  void rb_define_const(VALUE klass, const char *name, VALUE val)
  void rb_define_global_const(const char *name, VALUE val)

The former is to define a constant under specified class/module.  The
latter is to define a global constant.

== Use Ruby Features from C

There are several ways to invoke Ruby's features from C code.

=== Evaluate Ruby Programs in a String

The easiest way to use Ruby's functionality from a C program is to
evaluate the string as Ruby program.  This function will do the job:

  VALUE rb_eval_string(const char *str)

Evaluation is done under the current context, thus current local variables
of the innermost method (which is defined by Ruby) can be accessed.

Note that the evaluation can raise an exception. There is a safer
function:

  VALUE rb_eval_string_protect(const char *str, int *state)

It returns nil when an error occur. Moreover, *state is zero if str was
successfully evaluated, or nonzero otherwise.

=== ID or Symbol

You can invoke methods directly, without parsing the string.  First I
need to explain about ID.  ID is the integer number to represent
Ruby's identifiers such as variable names.  The Ruby data type
corresponding to ID is Symbol.  It can be accessed from Ruby in the
form:

  :Identifier

or

  :"any kind of string"

You can get the ID value from a string within C code by using

  rb_intern(const char *name)
  rb_intern_str(VALUE name)

You can retrieve ID from Ruby object (Symbol or String) given as an
argument by using

  rb_to_id(VALUE symbol)
  rb_check_id(volatile VALUE *name)
  rb_check_id_cstr(const char *name, long len, rb_encoding *enc)

These functions try to convert the argument to a String if it was not
a Symbol nor a String.  The second function stores the converted
result into *name, and returns 0 if the string is not a known symbol.
After this function returned a non-zero value, *name is always a
Symbol or a String, otherwise it is a String if the result is 0.
The third function takes NUL-terminated C string, not Ruby VALUE.

You can convert C ID to Ruby Symbol by using

  VALUE ID2SYM(ID id)

and to convert Ruby Symbol object to ID, use

  ID SYM2ID(VALUE symbol)

=== Invoke Ruby Method from C

To invoke methods directly, you can use the function below

  VALUE rb_funcall(VALUE recv, ID mid, int argc, ...)

This function invokes a method on the recv, with the method name
specified by the symbol mid.

=== Accessing the Variables and Constants

You can access class variables and instance variables using access
functions.  Also, global variables can be shared between both
environments.  There's no way to access Ruby's local variables.

The functions to access/modify instance variables are below:

  VALUE rb_ivar_get(VALUE obj, ID id)
  VALUE rb_ivar_set(VALUE obj, ID id, VALUE val)

id must be the symbol, which can be retrieved by rb_intern().

To access the constants of the class/module:

  VALUE rb_const_get(VALUE obj, ID id)

See also Constant Definition above.

= Information Sharing Between Ruby and C

=== Ruby Constants That C Can Be Accessed From C

As stated in section 1.3,
the following Ruby constants can be referred from C.

  Qtrue
  Qfalse

Boolean values.  Qfalse is false in C also (i.e. 0).

  Qnil

Ruby nil in C scope.

== Global Variables Shared Between C and Ruby

Information can be shared between the two environments using shared global
variables.  To define them, you can use functions listed below:

  void rb_define_variable(const char *name, VALUE *var)

This function defines the variable which is shared by both environments.
The value of the global variable pointed to by `var' can be accessed
through Ruby's global variable named `name'.

You can define read-only (from Ruby, of course) variables using the
function below.

  void rb_define_readonly_variable(const char *name, VALUE *var)

You can defined hooked variables.  The accessor functions (getter and
setter) are called on access to the hooked variables.

  void rb_define_hooked_variable(const char *name, VALUE *var,
				 VALUE (*getter)(), void (*setter)())

If you need to supply either setter or getter, just supply 0 for the
hook you don't need.  If both hooks are 0, rb_define_hooked_variable()
works just like rb_define_variable().

The prototypes of the getter and setter functions are as follows:

  VALUE (*getter)(ID id, VALUE *var);
  void (*setter)(VALUE val, ID id, VALUE *var);


Also you can define a Ruby global variable without a corresponding C
variable.  The value of the variable will be set/get only by hooks.

  void rb_define_virtual_variable(const char *name,
				  VALUE (*getter)(), void (*setter)())

The prototypes of the getter and setter functions are as follows:

  VALUE (*getter)(ID id);
  void (*setter)(VALUE val, ID id);


== Encapsulate C Data into a Ruby Object

To wrap and objectify a C pointer as a Ruby object (so called
DATA), use Data_Wrap_Struct().

  Data_Wrap_Struct(klass, mark, free, sval)

Data_Wrap_Struct() returns a created DATA object.  The klass argument
is the class for the DATA object.  The mark argument is the function
to mark Ruby objects pointed by this data.  The free argument is the
function to free the pointer allocation.  If this is -1, the pointer
will be just freed.  The functions mark and free will be called from
garbage collector.

These mark / free functions are invoked during GC execution.  No
object allocations are allowed during it, so do not allocate ruby
objects inside them.

You can allocate and wrap the structure in one step.

  Data_Make_Struct(klass, type, mark, free, sval)

This macro returns an allocated Data object, wrapping the pointer to
the structure, which is also allocated.  This macro works like:

  (sval = ALLOC(type), Data_Wrap_Struct(klass, mark, free, sval))

Arguments klass, mark, and free work like their counterparts in
Data_Wrap_Struct().  A pointer to the allocated structure will be
assigned to sval, which should be a pointer of the type specified.

To retrieve the C pointer from the Data object, use the macro
Data_Get_Struct().

  Data_Get_Struct(obj, type, sval)

A pointer to the structure will be assigned to the variable sval.

See the example below for details.

= Example - Creating dbm Extension

OK, here's the example of making an extension library.  This is the
extension to access DBMs.  The full source is included in the ext/
directory in the Ruby's source tree.

== Make the Directory

  % mkdir ext/dbm

Make a directory for the extension library under ext directory.

== Design the Library

You need to design the library features, before making it.

== Write the C Code

You need to write C code for your extension library.  If your library
has only one source file, choosing ``LIBRARY.c'' as a file name is
preferred.  On the other hand, in case your library has multiple source
files, avoid choosing ``LIBRARY.c'' for a file name.  It may conflict
with an intermediate file ``LIBRARY.o'' on some platforms.
Note that some functions in mkmf library described below generate
a file ``conftest.c'' for checking with compilation.  You shouldn't
choose ``conftest.c'' as a name of a source file.

Ruby will execute the initializing function named ``Init_LIBRARY'' in
the library.  For example, ``Init_dbm()'' will be executed when loading
the library.

Here's the example of an initializing function.

  void
  Init_dbm(void)
  {
      /* define DBM class */
      cDBM = rb_define_class("DBM", rb_cObject);
      /* DBM includes Enumerable module */
      rb_include_module(cDBM, rb_mEnumerable);

      /* DBM has class method open(): arguments are received as C array */
      rb_define_singleton_method(cDBM, "open", fdbm_s_open, -1);

      /* DBM instance method close(): no args */
      rb_define_method(cDBM, "close", fdbm_close, 0);
      /* DBM instance method []: 1 argument */
      rb_define_method(cDBM, "[]", fdbm_fetch, 1);

      /* ... */

      /* ID for a instance variable to store DBM data */
      id_dbm = rb_intern("dbm");
  }

The dbm extension wraps the dbm struct in the C environment using
Data_Make_Struct.

  struct dbmdata {
      int  di_size;
      DBM *di_dbm;
  };

  obj = Data_Make_Struct(klass, struct dbmdata, 0, free_dbm, dbmp);

This code wraps the dbmdata structure into a Ruby object.  We avoid
wrapping DBM* directly, because we want to cache size information.

To retrieve the dbmdata structure from a Ruby object, we define the
following macro:

  #define GetDBM(obj, dbmp) {\
      Data_Get_Struct(obj, struct dbmdata, dbmp);\
      if (dbmp->di_dbm == 0) closed_dbm();\
  }

This sort of complicated macro does the retrieving and close checking for
the DBM.

There are three kinds of way to receive method arguments.  First,
methods with a fixed number of arguments receive arguments like this:

  static VALUE
  fdbm_delete(VALUE obj, VALUE keystr)
  {
        /* ... */
  }

The first argument of the C function is the self, the rest are the
arguments to the method.

Second, methods with an arbitrary number of arguments receive
arguments like this:

  static VALUE
  fdbm_s_open(int argc, VALUE *argv, VALUE klass)
  {
      /* ... */
      if (rb_scan_args(argc, argv, "11", &file, &vmode) == 1) {
          mode = 0666;		/* default value */
      }
      /* ... */
  }

The first argument is the number of method arguments, the second
argument is the C array of the method arguments, and the third
argument is the receiver of the method.

You can use the function rb_scan_args() to check and retrieve the
arguments.  The third argument is a string that specifies how to
capture method arguments and assign them to the following VALUE
references.


The following is an example of a method that takes arguments by Ruby's
array:

  static VALUE
  thread_initialize(VALUE thread, VALUE args)
  {
      /* ... */
  }

The first argument is the receiver, the second one is the Ruby array
which contains the arguments to the method.

*Notice*: GC should know about global variables which refer to Ruby's objects,
but are not exported to the Ruby world.  You need to protect them by

  void rb_global_variable(VALUE *var)

== Prepare extconf.rb

If the file named extconf.rb exists, it will be executed to generate
Makefile.

extconf.rb is the file for checking compilation conditions etc.  You
need to put

  require 'mkmf'

at the top of the file.  You can use the functions below to check
various conditions.

  have_macro(macro[, headers[, opt]]): check whether macro is defined
  have_library(lib[, func[, headers[, opt]]]): check whether library containing function exists
  find_library(lib[, func, *paths]): find library from paths
  have_func(func[, headers[, opt]): check whether function exists
  have_var(var[, headers[, opt]]): check whether variable exists
  have_header(header[, preheaders[, opt]]): check whether header file exists
  find_header(header, *paths): find header from paths
  have_framework(fw): check whether framework exists (for MacOS X)
  have_struct_member(type, member[, headers[, opt]]): check whether struct has member
  have_type(type[, headers[, opt]]): check whether type exists
  find_type(type, opt, *headers): check whether type exists in headers
  have_const(const[, headers[, opt]]): check whether constant is defined
  check_sizeof(type[, headers[, opts]]): check size of type
  check_signedness(type[, headers[, opts]]): check signedness of type
  convertible_int(type[, headers[, opts]]): find convertible integer type
  find_executable(bin[, path]): find executable file path
  create_header(header): generate configured header
  create_makefile(target[, target_prefix]): generate Makefile

See MakeMakefile for full documentation of these functions.

The value of the variables below will affect the Makefile.

  $CFLAGS: included in CFLAGS make variable (such as -O)
  $CPPFLAGS: included in CPPFLAGS make variable (such as -I, -D)
  $LDFLAGS: included in LDFLAGS make variable (such as -L)
  $objs: list of object file names

Normally, the object files list is automatically generated by searching
source files, but you must define them explicitly if any sources will
be generated while building.

If a compilation condition is not fulfilled, you should not call
``create_makefile''.  The Makefile will not be generated, compilation will
not be done.

== Prepare Depend (Optional)

If the file named depend exists, Makefile will include that file to
check dependencies.  You can make this file by invoking

  % gcc -MM *.c > depend

It's harmless.  Prepare it.

== Generate Makefile

Try generating the Makefile by:

  ruby extconf.rb

If the library should be installed under vendor_ruby directory
instead of site_ruby directory, use --vendor option as follows.

  ruby extconf.rb --vendor

You don't need this step if you put the extension library under the ext
directory of the ruby source tree.  In that case, compilation of the
interpreter will do this step for you.

== Run make

Type

  make

to compile your extension.  You don't need this step either if you have
put the extension library under the ext directory of the ruby source tree.

== Debug

You may need to rb_debug the extension.  Extensions can be linked
statically by adding the directory name in the ext/Setup file so that
you can inspect the extension with the debugger.

== Done! Now You Have the Extension Library

You can do anything you want with your library.  The author of Ruby
will not claim any restrictions on your code depending on the Ruby API.
Feel free to use, modify, distribute or sell your program.

= Appendix A. Ruby Source Files Overview

== Ruby Language Core

class.c    :: classes and modules
error.c    :: exception classes and exception mechanism
gc.c       :: memory management
load.c     :: library loading
object.c   :: objects
variable.c :: variables and constants

== Ruby Syntax Parser

parse.y  :: grammar definition
parse.c  :: automatically generated from parse.y
keywords :: reserved keywords
lex.c    :: automatically generated from keywords

== Ruby Evaluator (a.k.a. YARV)

  compile.c
  eval.c
  eval_error.c
  eval_jump.c
  eval_safe.c
  insns.def           : definition of VM instructions
  iseq.c              : implementation of VM::ISeq
  thread.c            : thread management and context switching
  thread_win32.c      : thread implementation
  thread_pthread.c    : ditto
  vm.c
  vm_dump.c
  vm_eval.c
  vm_exec.c
  vm_insnhelper.c
  vm_method.c

  opt_insns_unif.def  : instruction unification
  opt_operand.def     : definitions for optimization

    -> insn*.inc      : automatically generated
    -> opt*.inc       : automatically generated
    -> vm.inc         : automatically generated

== Regular Expression Engine (Oniguruma)

  regex.c
  regcomp.c
  regenc.c
  regerror.c
  regexec.c
  regparse.c
  regsyntax.c

== Utility Functions

debug.c    :: debug symbols for C debugger
dln.c      :: dynamic loading
st.c       :: general purpose hash table
strftime.c :: formatting times
util.c     :: misc utilities

== Ruby Interpreter Implementation

  dmyext.c
  dmydln.c
  dmyencoding.c
  id.c
  inits.c
  main.c
  ruby.c
  version.c

  gem_prelude.rb
  prelude.rb

== Class Library

array.c      :: Array
bignum.c     :: Bignum
compar.c     :: Comparable
complex.c    :: Complex
cont.c       :: Fiber, Continuation
dir.c        :: Dir
enum.c       :: Enumerable
enumerator.c :: Enumerator
file.c       :: File
hash.c       :: Hash
io.c         :: IO
marshal.c    :: Marshal
math.c       :: Math
numeric.c    :: Numeric, Integer, Fixnum, Float
pack.c       :: Array#pack, String#unpack
proc.c       :: Binding, Proc
process.c    :: Process
random.c     :: random number
range.c      :: Range
rational.c   :: Rational
re.c         :: Regexp, MatchData
signal.c     :: Signal
sprintf.c    :: String#sprintf
string.c     :: String
struct.c     :: Struct
time.c       :: Time

defs/known_errors.def :: Errno::* exception classes
-> known_errors.inc   :: automatically generated

== Multilingualization

encoding.c  :: Encoding
transcode.c :: Encoding::Converter
enc/*.c     :: encoding classes
enc/trans/* :: codepoint mapping tables

== goruby Interpreter Implementation

  goruby.c
  golf_prelude.rb     : goruby specific libraries.
    -> golf_prelude.c : automatically generated


= Appendix B. Ruby Extension API Reference

== Types

VALUE ::

  The type for the Ruby object.  Actual structures are defined in ruby.h,
  such as struct RString, etc.  To refer the values in structures, use
  casting macros like RSTRING(obj).

== Variables and Constants

Qnil::
  nil object

Qtrue::
  true object (default true value)

Qfalse::
  false object

== C Pointer Wrapping

Data_Wrap_Struct(VALUE klass, void (*mark)(), void (*free)(), void *sval) ::

  Wrap a C pointer into a Ruby object.  If object has references to other
  Ruby objects, they should be marked by using the mark function during
  the GC process.  Otherwise, mark should be 0.  When this object is no
  longer referred by anywhere, the pointer will be discarded by free
  function.

Data_Make_Struct(klass, type, mark, free, sval) ::

  This macro allocates memory using malloc(), assigns it to the variable
  sval, and returns the DATA encapsulating the pointer to memory region.

Data_Get_Struct(data, type, sval) ::

  This macro retrieves the pointer value from DATA, and assigns it to
  the variable sval.

== Checking Data Types

TYPE(value) ::

  Internal type (T_NIL, T_FIXNUM, etc.)

FIXNUM_P(value) ::

  Is +value+ a Fixnum?

NIL_P(value) ::

  Is +value+ nil?

void Check_Type(VALUE value, int type) ::

  Ensures +value+ is of the given internal +type+ or raises a TypeError

SaveStringValue(value) ::

  Checks that +value+ is a String and is not tainted

== Data Type Conversion

FIX2INT(value), INT2FIX(i) ::

  Fixnum <-> integer

FIX2LONG(value), LONG2FIX(l) ::

  Fixnum <-> long

NUM2INT(value), INT2NUM(i) ::

  Numeric <-> integer

NUM2UINT(value), UINT2NUM(ui) ::

  Numeric <-> unsigned integer

NUM2LONG(value), LONG2NUM(l) ::

  Numeric <-> long

NUM2ULONG(value), ULONG2NUM(ul) ::

  Numeric <-> unsigned long

NUM2LL(value), LL2NUM(ll) ::

  Numeric <-> long long

NUM2ULL(value), ULL2NUM(ull) ::

  Numeric <-> unsigned long long

NUM2OFFT(value), OFFT2NUM(off) ::

  Numeric <-> off_t

NUM2SIZET(value), SIZET2NUM(size) ::

  Numeric <-> size_t

NUM2SSIZET(value), SSIZET2NUM(ssize) ::

  Numeric <-> ssize_t

rb_integer_pack(value, words, numwords, wordsize, nails, flags), rb_integer_unpack(words, numwords, wordsize, nails, flags) ::

  Numeric <-> Arbitrary size integer buffer

NUM2DBL(value) ::

  Numeric -> double

rb_float_new(f) ::

  double -> Float

StringValue(value) ::

  Object with #to_str -> String

StringValuePtr(value) ::

  Object with #to_str -> pointer to String data

StringValueCStr(value) ::

  Object with #to_str -> pointer to String data without NULL bytes

rb_str_new2(s) ::

  char * -> String

== Defining Class and Module

VALUE rb_define_class(const char *name, VALUE super) ::

  Defines a new Ruby class as a subclass of super.

VALUE rb_define_class_under(VALUE module, const char *name, VALUE super) ::

  Creates a new Ruby class as a subclass of super, under the module's
  namespace.

VALUE rb_define_module(const char *name) ::

  Defines a new Ruby module.

VALUE rb_define_module_under(VALUE module, const char *name) ::

  Defines a new Ruby module under the module's namespace.

void rb_include_module(VALUE klass, VALUE module) ::

  Includes module into class.  If class already includes it, just ignored.

void rb_extend_object(VALUE object, VALUE module) ::

  Extend the object with the module's attributes.

== Defining Global Variables

void rb_define_variable(const char *name, VALUE *var) ::

  Defines a global variable which is shared between C and Ruby.  If name
  contains a character which is not allowed to be part of the symbol,
  it can't be seen from Ruby programs.

void rb_define_readonly_variable(const char *name, VALUE *var) ::

  Defines a read-only global variable.  Works just like
  rb_define_variable(), except the defined variable is read-only.

void rb_define_virtual_variable(const char *name, VALUE (*getter)(), VALUE (*setter)()) ::

  Defines a virtual variable, whose behavior is defined by a pair of C
  functions.  The getter function is called when the variable is
  referenced.  The setter function is called when the variable is set to a
  value.  The prototype for getter/setter functions are:

    VALUE getter(ID id)
    void setter(VALUE val, ID id)

  The getter function must return the value for the access.

void rb_define_hooked_variable(const char *name, VALUE *var, VALUE (*getter)(), VALUE (*setter)()) ::

  Defines hooked variable.  It's a virtual variable with a C variable.
  The getter is called as

    VALUE getter(ID id, VALUE *var)

  returning a new value.  The setter is called as

    void setter(VALUE val, ID id, VALUE *var)

  GC requires C global variables which hold Ruby values to be marked.

void rb_global_variable(VALUE *var)

  Tells GC to protect these variables.

== Constant Definition

void rb_define_const(VALUE klass, const char *name, VALUE val) ::

  Defines a new constant under the class/module.

void rb_define_global_const(const char *name, VALUE val) ::

  Defines a global constant.  This is just the same as

    rb_define_const(cKernal, name, val)

== Method Definition

rb_define_method(VALUE klass, const char *name, VALUE (*func)(), int argc) ::

  Defines a method for the class.  func is the function pointer.  argc
  is the number of arguments.  if argc is -1, the function will receive
  3 arguments: argc, argv, and self.  if argc is -2, the function will
  receive 2 arguments, self and args, where args is a Ruby array of
  the method arguments.

rb_define_private_method(VALUE klass, const char *name, VALUE (*func)(), int argc) ::

  Defines a private method for the class.  Arguments are same as
  rb_define_method().

rb_define_singleton_method(VALUE klass, const char *name, VALUE (*func)(), int argc) ::

  Defines a singleton method.  Arguments are same as rb_define_method().

rb_scan_args(int argc, VALUE *argv, const char *fmt, ...) ::

  Retrieve argument from argc and argv to given VALUE references
  according to the format string.  The format can be described in ABNF
  as follows:

    scan-arg-spec  := param-arg-spec [option-hash-arg-spec] [block-arg-spec]

    param-arg-spec := pre-arg-spec [post-arg-spec] / post-arg-spec /
                      pre-opt-post-arg-spec
    pre-arg-spec   := num-of-leading-mandatory-args [num-of-optional-args]
    post-arg-spec  := sym-for-variable-length-args
                      [num-of-trailing-mandatory-args]
    pre-opt-post-arg-spec := num-of-leading-mandatory-args num-of-optional-args
                             num-of-trailing-mandatory-args
    option-hash-arg-spec := sym-for-option-hash-arg
    block-arg-spec := sym-for-block-arg

    num-of-leading-mandatory-args  := DIGIT ; The number of leading
                                            ; mandatory arguments
    num-of-optional-args           := DIGIT ; The number of optional
                                            ; arguments
    sym-for-variable-length-args   := "*"   ; Indicates that variable
                                            ; length arguments are
                                            ; captured as a ruby array
    num-of-trailing-mandatory-args := DIGIT ; The number of trailing
                                            ; mandatory arguments
    sym-for-option-hash-arg        := ":"   ; Indicates that an option
                                            ; hash is captured if the last
                                            ; argument is a hash or can be
                                            ; converted to a hash with
                                            ; #to_hash.  When the last
                                            ; argument is nil, it is
                                            ; captured if it is not
                                            ; ambiguous to take it as
                                            ; empty option hash; i.e. '*'
                                            ; is not specified and
                                            ; arguments are given more
                                            ; than sufficient.
    sym-for-block-arg              := "&"   ; Indicates that an iterator
                                            ; block should be captured if
                                            ; given

  For example, "12" means that the method requires at least one
  argument, and at most receives three (1+2) arguments.  So, the format
  string must be followed by three variable references, which are to be
  assigned to captured arguments.  For omitted arguments, variables are
  set to Qnil.  NULL can be put in place of a variable reference, which
  means the corresponding captured argument(s) should be just dropped.

  The number of given arguments, excluding an option hash or iterator
  block, is returned.

== Invoking Ruby method

VALUE rb_funcall(VALUE recv, ID mid, int narg, ...) ::

  Invokes a method.  To retrieve mid from a method name, use rb_intern().
  Able to call even private/protected methods.

VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv) ::
VALUE rb_funcallv(VALUE recv, ID mid, int argc, VALUE *argv) ::

  Invokes a method, passing arguments as an array of values.
  Able to call even private/protected methods.

VALUE rb_funcallv_public(VALUE recv, ID mid, int argc, VALUE *argv) ::

  Invokes a method, passing arguments as an array of values.
  Able to call only public methods.

VALUE rb_eval_string(const char *str) ::

  Compiles and executes the string as a Ruby program.

ID rb_intern(const char *name) ::

  Returns ID corresponding to the name.

char *rb_id2name(ID id) ::

  Returns the name corresponding ID.

char *rb_class2name(VALUE klass) ::

  Returns the name of the class.

int rb_respond_to(VALUE object, ID id) ::

  Returns true if the object responds to the message specified by id.

== Instance Variables

VALUE rb_iv_get(VALUE obj, const char *name) ::

  Retrieve the value of the instance variable.  If the name is not
  prefixed by `@', that variable shall be inaccessible from Ruby.

VALUE rb_iv_set(VALUE obj, const char *name, VALUE val) ::

  Sets the value of the instance variable.

== Control Structure

VALUE rb_block_call(VALUE recv, ID mid, int argc, VALUE * argv, VALUE (*func) (ANYARGS), VALUE data2) ::

  Calls a method on the recv, with the method name specified by the
  symbol mid, with argc arguments in argv, supplying func as the
  block. When func is called as the block, it will receive the value
  from yield as the first argument, and data2 as the second argument.
  When yielded with multiple values (in C, rb_yield_values(),
  rb_yield_values2() and rb_yield_splat()), data2 is packed as an Array,
  whereas yielded values can be gotten via argc/argv of the third/fourth
  arguments.

[OBSOLETE] VALUE rb_iterate(VALUE (*func1)(), void *arg1, VALUE (*func2)(), void *arg2) ::

  Calls the function func1, supplying func2 as the block.  func1 will be
  called with the argument arg1.  func2 receives the value from yield as
  the first argument, arg2 as the second argument.

  When rb_iterate is used in 1.9, func1 has to call some Ruby-level method.
  This function is obsolete since 1.9; use rb_block_call instead.

VALUE rb_yield(VALUE val) ::

  Evaluates the block with value val.

VALUE rb_rescue(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2) ::

  Calls the function func1, with arg1 as the argument.  If an exception
  occurs during func1, it calls func2 with arg2 as the argument.  The
  return value of rb_rescue() is the return value from func1 if no
  exception occurs, from func2 otherwise.

VALUE rb_ensure(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2) ::

  Calls the function func1 with arg1 as the argument, then calls func2
  with arg2 if execution terminated.  The return value from
  rb_ensure() is that of func1 when no exception occurred.

VALUE rb_protect(VALUE (*func) (VALUE), VALUE arg, int *state) ::

  Calls the function func with arg as the argument.  If no exception
  occurred during func, it returns the result of func and *state is zero.
  Otherwise, it returns Qnil and sets *state to nonzero.  If state is
  NULL, it is not set in both cases.
  You have to clear the error info with rb_set_errinfo(Qnil) when
  ignoring the caught exception.

void rb_jump_tag(int state) ::

  Continues the exception caught by rb_protect() and rb_eval_string_protect().
  state must be the returned value from those functions.  This function
  never return to the caller.

void rb_iter_break() ::

  Exits from the current innermost block.  This function never return to
  the caller.

void rb_iter_break_value(VALUE value) ::

  Exits from the current innermost block with the value.  The block will
  return the given argument value.  This function never return to the
  caller.

== Exceptions and Errors

void rb_warn(const char *fmt, ...) ::

  Prints a warning message according to a printf-like format.

void rb_warning(const char *fmt, ...) ::

  Prints a warning message according to a printf-like format, if
  $VERBOSE is true.

void rb_raise(rb_eRuntimeError, const char *fmt, ...) ::

  Raises RuntimeError.  The fmt is a format string just like printf().

void rb_raise(VALUE exception, const char *fmt, ...) ::

  Raises a class exception.  The fmt is a format string just like printf().

void rb_fatal(const char *fmt, ...) ::

  Raises a fatal error, terminates the interpreter.  No exception handling
  will be done for fatal errors, but ensure blocks will be executed.

void rb_bug(const char *fmt, ...) ::

  Terminates the interpreter immediately.  This function should be
  called under the situation caused by the bug in the interpreter.  No
  exception handling nor ensure execution will be done.

Note: In the format string, %i is used for Object#to_s (or Object#inspect if
'+' flag is set) output (and related argument must be a VALUE).  For integers
in format strings, use %d.

== Initialize and Start the Interpreter

The embedding API functions are below (not needed for extension libraries):

void ruby_init() ::

  Initializes the interpreter.

void ruby_options(int argc, char **argv) ::

  Process command line arguments for the interpreter.

void ruby_run() ::

  Starts execution of the interpreter.

void ruby_script(char *name) ::

  Specifies the name of the script ($0).

== Hooks for the Interpreter Events

  void rb_add_event_hook(rb_event_hook_func_t func, rb_event_flag_t events,
                         VALUE data)

Adds a hook function for the specified interpreter events.
events should be OR'ed value of:

  RUBY_EVENT_LINE
  RUBY_EVENT_CLASS
  RUBY_EVENT_END
  RUBY_EVENT_CALL
  RUBY_EVENT_RETURN
  RUBY_EVENT_C_CALL
  RUBY_EVENT_C_RETURN
  RUBY_EVENT_RAISE
  RUBY_EVENT_ALL

The definition of rb_event_hook_func_t is below:

  typedef void (*rb_event_hook_func_t)(rb_event_t event, VALUE data,
                                       VALUE self, ID id, VALUE klass)

The third argument `data' to rb_add_event_hook() is passed to the hook
function as the second argument, which was the pointer to the current
NODE in 1.8.  See RB_EVENT_HOOKS_HAVE_CALLBACK_DATA below.

  int rb_remove_event_hook(rb_event_hook_func_t func)

Removes the specified hook function.

== Macros for Compatibility

Some macros to check API compatibilities are available by default.

NORETURN_STYLE_NEW ::

  Means that NORETURN macro is functional style instead of prefix.

HAVE_RB_DEFINE_ALLOC_FUNC ::

  Means that function rb_define_alloc_func() is provided, that means the
  allocation framework is used.  This is same as the result of
  have_func("rb_define_alloc_func", "ruby.h").

HAVE_RB_REG_NEW_STR ::

  Means that function rb_reg_new_str() is provided, that creates Regexp
  object from String object.  This is same as the result of
  have_func("rb_reg_new_str", "ruby.h").

HAVE_RB_IO_T ::

  Means that type rb_io_t is provided.

USE_SYMBOL_AS_METHOD_NAME ::

  Means that Symbols will be returned as method names, e.g.,
  Module#methods, #singleton_methods and so on.

HAVE_RUBY_*_H ::

  Defined in ruby.h and means corresponding header is available.  For
  instance, when HAVE_RUBY_ST_H is defined you should use ruby/st.h not
  mere st.h.

RB_EVENT_HOOKS_HAVE_CALLBACK_DATA ::

  Means that rb_add_event_hook() takes the third argument `data', to be
  passed to the given event hook function.

= Appendix C. Functions available for use in extconf.rb

See documentation for {mkmf}[rdoc-ref:MakeMakefile].

= Appendix D. Generational GC

Ruby 2.1 introduced a generational garbage collector (called RGenGC).
RGenGC (mostly) keeps compatibility.

Generally, the use of the technique called write barriers is required in
extension libraries for generational GC
(http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29).
RGenGC works fine without write barriers in extension libraries.

If your library adheres to the following tips, performance can
be further improved. Especially, the "Don't touch pointers directly" section is
important.

== Incompatibility

You can't write RBASIC(obj)->klass field directly because it is const
value now.

Basically you should not write this field because MRI expects it to be
an immutable field, but if you want to do it in your extension you can
use the following functions:

VALUE rb_obj_hide(VALUE obj) ::

  Clear RBasic::klass field. The object will be an internal object.
  ObjectSpace::each_object can't find this object.

VALUE rb_obj_reveal(VALUE obj, VALUE klass) ::

  Reset RBasic::klass to be klass.
  We expect the `klass' is hidden class by rb_obj_hide().

== Write barriers

RGenGC doesn't require write barriers to support generational GC.
However, caring about write barrier can improve the performance of
RGenGC. Please check the following tips.

=== Don't touch pointers directly

In MRI (include/ruby/ruby.h), some macros to acquire pointers to the
internal data structures are supported such as RARRAY_PTR(),
RSTRUCT_PTR() and so on.

DO NOT USE THESE MACROS and instead use the corresponding C-APIs such as
rb_ary_aref(), rb_ary_store() and so on.

=== Consider whether to insert write barriers

You don't need to care about write barriers if you only use built-in
types.

If you support T_DATA objects, you may consider using write barriers.

Inserting write barriers into T_DATA objects only works with the
following type objects: (a) long-lived objects, (b) when a huge number
of objects are generated and (c) container-type objects that have
references to other objects. If your extension provides such a type of
T_DATA objects, consider inserting write barriers.

(a): short-lived objects don't become old generation objects.
(b): only a few oldgen objects don't have performance impact.
(c): only a few references don't have performance impact.

Inserting write barriers is a very difficult hack, it is easy to
introduce critical bugs. And inserting write barriers has several areas
of overhead. Basically we don't recommend you insert write barriers.
Please carefully consider the risks.

=== Combine with built-in types

Please consider utilizing built-in types. Most built-in types support
write barrier, so you can use them to avoid manually inserting write
barriers.

For example, if your T_DATA has references to other objects, then you
can move these references to Array. A T_DATA object only has a reference
to an array object. Or you can also use a Struct object to gather a
T_DATA object (without any references) and an that Array contains
references.

With use of such techniques, you don't need to insert write barriers
anymore.

=== Insert write barriers

[AGAIN] Inserting write barriers is a very difficult hack, and it is
easy to introduce critical bugs. And inserting write barriers has
several areas of overhead. Basically we don't recommend you insert write
barriers. Please carefully consider the risks.

Before inserting write barriers, you need to know about RGenGC algorithm
(gc.c will help you). Macros and functions to insert write barriers are
available in in include/ruby/ruby.h. An example is available in iseq.c.

For a complete guide for RGenGC and write barriers, please refer to
<https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/RGenGC>.

/*
 * Local variables:
 * fill-column: 70
 * end:
 */
PK~[|��Y�Ydoc/alt-ruby21/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.

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

Oniguruma  ----   (C) K.Kosako <sndgk393 AT ybb DOT ne DOT jp>

http://www.geocities.jp/kosako3/oniguruma/
http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/oniguruma/
http://www.freebsd.org/cgi/cvsweb.cgi/ports/devel/oniguruma/

   When this software is partly used or it is distributed with Ruby, 
   this of Ruby follows the license of Ruby.

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 POSSIBILITPK~[|��Y�Ydoc/alt-ruby21/LEGALnu�[���SD 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

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.[ch]:
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/strstr.c:
missing/strtol.c:
missing/tgamma.c:
ext/digest/sha1/sha1.[ch]:

  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 the new-style BSD license.

   Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
   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 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 ``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 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/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/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/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.
PK~[�9���doc/alt-ruby21/README.EXT.janu�[���# README.EXT.ja -  -*- RDoc -*- created at: Mon Aug  7 16:45:54 JST 1995

Rubyの拡張ライブラリの作り方を説明します.

= 基礎知識

Cの変数には型があり,データには型がありません.ですから,た
とえばポインタをintの変数に代入すると,その値は整数として取
り扱われます.逆にRubyの変数には型がなく,データに型がありま
す.この違いのため,CとRubyは相互に変換しなければ,お互いの
データをアクセスできません.

RubyのデータはVALUEというCの型で表現されます.VALUE型のデー
タはそのデータタイプを自分で知っています.このデータタイプと
いうのはデータ(オブジェクト)の実際の構造を意味していて,Ruby
のクラスとはまた違ったものです.

VALUEからCにとって意味のあるデータを取り出すためには

1. VALUEのデータタイプを知る
2. VALUEをCのデータに変換する

の両方が必要です.(1)を忘れると間違ったデータの変換が行われ
て,最悪プログラムがcore dumpします.

== データタイプ

Rubyにはユーザが使う可能性のある以下のタイプがあります.

T_NIL      :: nil
T_OBJECT   :: 通常のオブジェクト
T_CLASS    :: クラス
T_MODULE   :: モジュール
T_FLOAT    :: 浮動小数点数
T_STRING   :: 文字列
T_REGEXP   :: 正規表現
T_ARRAY    :: 配列
T_HASH     :: 連想配列
T_STRUCT   :: (Rubyの)構造体
T_BIGNUM   :: 多倍長整数
T_FIXNUM   :: Fixnum(31bitまたは63bit長整数)
T_COMPLEX  :: 複素数
T_RATIONAL :: 有理数
T_FILE     :: 入出力
T_TRUE     :: 真
T_FALSE    :: 偽
T_DATA     :: データ
T_SYMBOL   :: シンボル

その他に内部で利用されている以下のタイプがあります.

  T_ICLASS
  T_MATCH
  T_UNDEF
  T_NODE
  T_ZOMBIE

ほとんどのタイプはCの構造体で実装されています.

== VALUEのデータタイプをチェックする

ruby.hではTYPE()というマクロが定義されていて,VALUEのデータ
タイプを知ることが出来ます.TYPE()マクロは上で紹介したT_XXXX
の形式の定数を返します.VALUEのデータタイプに応じて処理する
場合には,TYPE()の値で分岐することになります.

  switch (TYPE(obj)) {
    case T_FIXNUM:
      /* FIXNUMの処理 */
      break;
    case T_STRING:
      /* 文字列の処理 */
      break;
    case T_ARRAY:
      /* 配列の処理 */
      break;
    default:
      /* 例外を発生させる */
      rb_raise(rb_eTypeError, "not valid value");
      break;
  }

それとデータタイプをチェックして,正しくなければ例外を発生す
る関数が用意されています.

  void Check_Type(VALUE value, int type)

この関数はvalueがtypeで無ければ,例外を発生させます.引数と
して与えられたVALUEのデータタイプが正しいかどうかチェックす
るためには,この関数を使います.

FIXNUMとNILに関してはより高速な判別マクロが用意されています.

  FIXNUM_P(obj)
  NIL_P(obj)

== VALUEをCのデータに変換する

データタイプがT_NIL,T_FALSE,T_TRUEである時,データはそれぞ
れnil,false,trueです.このデータタイプのオブジェクトはひと
つずつしか存在しません.

データタイプがT_FIXNUMの時,これは31bitまたは63bitのサイズを
持つ整数です.longのサイズが32bitのプラットフォームであれば
31bitに,longのサイズが64bitのプラットフォームであれば63bit
になります. FIXNUM を C の整数に変換するためにはマクロ
「FIX2INT()」または「FIX2LONG()」を使います.これらのマクロ
を使用する際には事前にデータタイプがFIXNUMであることを確認す
る必要がありますが,比較的高速に変換を行うことができます.ま
た,「FIX2LONG()」は例外を発生しませんが,「FIX2INT()」は変
換結果がintのサイズに収まらない場合には例外を発生します.
それから,FIXNUMに限らずRubyのデータを整数に変換する
「NUM2INT()」および「NUM2LONG()」というマクロがあります.こ
れらのマクロはマクロはデータタイプのチェック無しで使えます
(整数に変換できない場合には例外が発生する).同様にチェック無
で使える変換マクロはdoubleを取り出す「NUM2DBL()」があります.

char* を取り出す場合, StringValue() と StringValuePtr()
を使います.
StringValue(var) は var が String
であれば何もせず,そうでなければ var を var.to_str() の結果
に置き換えるマクロ,StringValuePtr(var) は同様に var を
String に置き換えてから var のバイト列表現に対する char* を
返すマクロです.var の内容を直接置き換える処理が入るので,
var は lvalue である必要があります.
また,StringValuePtr() に類似した StringValueCStr() というマ
クロもあります.StringValueCStr(var) は var を String に置き
換えてから var の文字列表現に対する char* を返します.返され
る文字列の末尾には nul 文字が付加されます.なお,途中に nul
文字が含まれる場合は ArgumentError が発生します.
一方,StringValuePtr() では,末尾に nul 文字がある保証はなく,
途中に nul 文字が含まれている可能性もあります.

それ以外のデータタイプは対応するCの構造体があります.対応す
る構造体のあるVALUEはそのままキャスト(型変換)すれば構造体の
ポインタに変換できます.

構造体は「struct RXxxxx」という名前でruby.hで定義されていま
す.例えば文字列は「struct RString」です.実際に使う可能性が
あるのは文字列と配列くらいだと思います.

ruby.hでは構造体へキャストするマクロも「RXXXXX()」(全部大文
字にしたもの)という名前で提供されています(例: RSTRING()).た
だし、構造体への直接のアクセスはできるだけ避け,対応する
rb_xxxx() といった関数を使うようにして下さい.例えば,配列の
要素へアクセスする場合は,rb_ary_entry(ary, offset),
rb_ary_store(ary, offset, obj) を利用するようにして下さい.

構造体からデータを取り出すマクロが提供されています.文字列
strの長さを得るためには「RSTRING_LEN(str)」とし,文字列strを
char*として得るためには「RSTRING_PTR(str)」とします.

Rubyの構造体をPK~[�9���doc/alt-ruby21/README.EXT.janu�[���,配列や文字列の構造体の中身は参照するだけで,直接変更し
ないことです.直接変更した場合,オブジェクトの内容の整合性が
とれなくなって,思わぬバグの原因になります.

== CのデータをVALUEに変換する

VALUEの実際の構造は

FIXNUMの場合 ::

  1bit左シフトして,LSBを立てる.

その他のポインタの場合 ::

  そのままVALUEにキャストする.

となっています.よって,LSBをチェックすればVALUEがFIXNUMかど
うかわかるわけです(ポインタのLSBが立っていないことを仮定して
いる).

ですから,FIXNUM以外のRubyのオブジェクトの構造体は単にVALUE
にキャストするだけでVALUEに変換出来ます.ただし,任意の構造
体がVALUEにキャスト出来るわけではありません.キャストするの
はRubyの知っている構造体(ruby.hで定義されているstruct RXxxx
のもの)だけです.

FIXNUMに関しては変換マクロを経由する必要があります.Cの整数
からVALUEに変換するマクロは以下のものがあります.必要に応じ
て使い分けてください.

INT2FIX() :: もとの整数が31bitまたは63bit以内に収まる自信
      	     がある時
INT2NUM() :: 任意の整数からVALUEへ

INT2NUM()は整数がFIXNUMの範囲に収まらない場合,Bignumに変換
してくれます(が,少し遅い).

== Rubyのデータを操作する

先程も述べた通り,Rubyの構造体をアクセスする時に内容の更新を
行うことは勧められません.で,Rubyのデータを操作する時には
Rubyが用意している関数を用いてください.

ここではもっとも使われるであろう文字列と配列の生成/操作を行
う関数をあげます(全部ではないです).

=== 文字列に対する関数

rb_str_new(const char *ptr, long len) ::

  新しいRubyの文字列を生成する.

rb_str_new2(const char *ptr)
rb_str_new_cstr(const char *ptr)

  Cの文字列からRubyの文字列を生成する.この関数の機能は
  rb_str_new(ptr, strlen(ptr))と同等である.

rb_tainted_str_new(const char *ptr, long len)

  汚染マークが付加された新しいRubyの文字列を生成する.外部
  からのデータに基づく文字列には汚染マークが付加されるべき
  である.

rb_tainted_str_new2(const char *ptr)
rb_tainted_str_new_cstr(const char *ptr)

  Cの文字列から汚染マークが付加されたRubyの文字列を生成する.

rb_sprintf(const char *format, ...)
rb_vsprintf(const char *format, va_list ap)

  Cの文字列formatと続く引数をprintf(3)のフォーマットにしたがって
  整形し,Rubyの文字列を生成する.

  注意: %iはObject#to_s('+'フラグが指定されているときはObject#inspect)を
  使ったVALUEの出力に使用されているため,整数には%dを使用すること.

rb_str_cat(VALUE str, const char *ptr, long len)

  Rubyの文字列strにlenバイトの文字列ptrを追加する.

rb_str_cat2(VALUE str, const char* ptr)

  Rubyの文字列strにCの文字列ptrを追加する.この関数の機能は
  rb_str_cat(str, ptr, strlen(ptr))と同等である.

rb_str_catf(VALUE str, const char* format, ...)
rb_str_vcatf(VALUE str, const char* format, va_list ap)

  Cの文字列formatと続く引数をprintf(3)のフォーマットにしたがって
  整形し,Rubyの文字列strに追加する.この関数の機能は,それぞれ
  rb_str_cat2(str, rb_sprintf(format, ...)) や
  rb_str_cat2(str, rb_vsprintf(format, ap)) と同等である.

rb_enc_str_new(const char *ptr, long len, rb_encoding *enc)
rb_enc_str_new_cstr(const char *ptr, rb_encoding *enc)

  指定されたエンコーディングでRubyの文字列を生成する.

rb_usascii_str_new(const char *ptr, long len)
rb_usascii_str_new_cstr(const char *ptr)

  エンコーディングがUS-ASCIIのRubyの文字列を生成する.

rb_str_resize(VALUE str, long len)

  Rubyの文字列のサイズをlenバイトに変更する.strの長さは前
  以てセットされていなければならない.lenが元の長さよりも短
  い時は,lenバイトを越えた部分の内容は捨てられる.lenが元
  の長さよりも長い時は,元の長さを越えた部分の内容は保存さ
  れないでゴミになるだろう.この関数の呼び出しによって
  RSTRING_PTR(str)が変更されるかもしれないことに注意.

rb_str_set_len(VALUE str, long len)

  Rubyの文字列のサイズをlenバイトにセットする.strが変更可
  能でなければ例外が発生する.RSTRING_LEN(str)とは無関係に,
  lenバイトまでの内容は保存される.lenはstrの容量を越えてい
  てはならない.


== 配列に対する関数

rb_ary_new()

  要素が0の配列を生成する.

rb_ary_new2(long len)
rb_ary_new_capa(long len)

  要素が0の配列を生成する.len要素分の領域をあらかじめ割り
  当てておく.

rb_ary_new3(long n, ...)
rb_ary_new_from_args(long n, ...)

  引数で指定したn要素を含む配列を生成する.

rb_ary_new4(long n, VALUE *elts)
rb_ary_new_from_values(long n, VALUE *elts)

  配列で与えたn要素の配列を生成する.

rb_ary_to_ary(VALUE obj)

  オブジェクトを配列に変換する.
  Object#to_aryと同等である.

他にも配列を操作する関数が多数ある. これらは
引数aryに配列を渡さなければならない. さもないと
コアを吐く.

rb_ary_aref(argc, VALUE *argv, VALUE ary)

  Array#[]と同等.

rb_ary_entry(VALUE ary, long offset)

  ary[offset]

rb_ary_store(VALUE ary, long offset, VALUE obj) ::

  ary[offset] = obj

rb_ary_subseq(VALUE ary, long beg, long len)

  ary[beg, len]

rb_ary_push(VALUE ary, VALUE val)
rb_ary_pop(VALUE ary)
rb_ary_shift(VALUE ary)
rb_ary_unshift(VALUE ary, VALUE val)

rb_ary_cat(VALUE ary, const VALUE *ptr, long len)

  配列aryにptrからlen個のオブジェクトを追加する.

= Rubyの機能を使う

原理的にRubyで書けることはCでも書けます.RubyそのものがCで記
述されているんですから,当然といえば当然なんですけど.ここで
はRubyの拡張に使うことが多いだろうと予測される機能を中心に紹
介します.

== Rubyに機能を追加する

Rubyで提供されている関数を使えばRubyインタプリタに新しい機能
を追加することができます.Rubyでは以下の機能を追加する関数が
提供されています.

* クラス,モジュール
* メソッド,特異メソッドなど
* 定数

では順に紹介します.

=== クラス/モジュール定義

クラスやモジュールを定義するためには,以下の関数を使います.

  VALUE rb_define_class(const char *name, VALUE super)
  VALUE rb_define_module(const char *name)

これらの関数は新しく定義されたクラスやモジュールを返します.
メソッドや定数の定義にこれらの値が必要なので,ほとんどの場合
は戻り値を変数に格納しておく必要があるでしょう.

クラスやモジュールを他のクラスの内部にネストして定義する時に
は以下の関数を使います.

  VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super)
  VALUE rb_define_module_under(VALUE outer, const char *name)

=== メソッド/特異メソッド定義

メソッドや特異メソッドを定義するには以下の関数を使います.

  void rb_define_method(VALUE klass, const char *name,
                        VALUE (*func)(), int argc)

  void rb_define_singleton_method(VALUE object, const char *name,
                                  VALUE (*func)(), int argc)


念のため説明すると「特異メソッド」とは,その特定のオブジェク
トに対してだけ有効なメソッドです.RubyではよくSmalltalkにお
けるクラスメソッドとして,クラスに対する特異メソッドが使われ
ます.

これらの関数の argcという引数はCの関数へ渡される引数の数(と
形式)を決めます.argcが0以上の時は関数に引き渡す引数の数を意
味します.16個以上の引数は使えません(が,要りませんよね,そ
んなに).実際の関数には先頭の引数としてselfが与えられますの
で,指定した数より1多い引数を持つことになります.

argcが負の時は引数の数ではなく,形式を指定したことになります.
argcが-1の時は引数を配列に入れて渡されます.argcが-2の時は引
数はRubyの配列として渡されます.

メソッドを定義する関数はまだいくつかあります. ひとつはメソッド
名としてIDを取ります. IDについては2.2.2を参照.

  void rb_define_method_id(VALUE klass, ID name,
                           VALUE (*func)(ANYARGS), int argc)

private/protectedなメソッドを定義するふたつの関数があります.

  void rb_define_private_method(VALUE klass, const char *name,
				VALUE (*func)(), int argc)
  void rb_define_protected_method(VALUE klass, const char *name,
			          VALUE (*func)(), int argc)

privateメソッドとは関数形式でしか呼び出すことの出来ないメソッ
ドです.

最後に, rb_define_module関数はモジュール関数を定義します.
モジュール関数とはモジュールの特異メソッドであり,同時に
privateメソッドでもあるものです.例をあげるとMathモジュール
のsqrt()などがあげられます.このメソッドは

  Math.sqrt(4)

という形式でも

  include Math
  sqrt(4)

という形式でも使えます.モジュール関数を定義する関数は以下の
通りです.

  void rb_define_module_function(VALUE module, const char *name,
		                 VALUE (*func)(), int argc)

関数的メソッド(Kernelモジュールのprivate method)を定義するた
めの関数は以下の通りです.

  void rb_define_global_function(const char *name, VALUE (*func)(), int argc)


メソッドの別名を定義するための関数は以下の通りです.

  void rb_define_alias(VALUE module, const char* new, const char* old);

属性の取得・設定メソッドを定義するには

  void rb_define_attr(VALUE klass, const char *name, int read, int write)

クラスメソッドallocateを定義したり削除したりするための関数は
以下の通りです.

  void rb_define_alloc_func(VALUE klass, VALUE (*func)(VALUE klass));
  void rb_undef_alloc_func(VALUE klass);

funcはクラスを引数として受け取って,新しく割り当てられたイン
スタンスを返さなくてはなりません.このインスタンスは,外部リ
ソースなどを含まない,できるだけ「空」のままにしておいたほう
がよいでしょう.

=== 定数定義

拡張ライブラリが必要な定数はあらかじめ定義しておいた方が良い
でしょう.定数を定義する関数は二つあります.

  void rb_define_const(VALUE klass, const char *name, VALUE val)
  void rb_define_global_const(const char *name, VALUE val)

前者は特定のクラス/モジュールに属する定数を定義するもの,後
者はグローバルな定数を定義するものです.

== Rubyの機能をCから呼び出す

既に『1.5 Rubyのデータを操作する』で一部紹介したような関数を
使えば,Rubyの機能を実現している関数を直接呼び出すことが出来
ます.

# このような関数の一覧表はいまのところありません.ソースを見
# るしかないですね.

それ以外にもRubyの機能を呼び出す方法はいくつかあります.

=== Rubyのプログラムをevalする

CからRubyの機能を呼び出すもっとも簡単な方法として,文字列で
与えられたRubyのプログラムを評価する以下の関数があります.

  VALUE rb_eval_string(const char *str)

この評価は現在の環境で行われます.つまり,現在のローカル変数
などを受け継ぎます.

評価は例外を発生するかもしれないことに注意しましょう. より安全
な関数もあります.

  VALUE rb_eval_string_protect(const char *str, int *state)

この関数はエラーが発生するとnilを返します.そして,成功時には
*stateはゼロに,さもなくば非ゼロになります.

=== IDまたはシンボル

Cから文字列を経由せずにRubyのメソッドを呼び出すこともできま
す.その前に,Rubyインタプリタ内でメソッドや変数名を指定する
時に使われているIDについて説明しておきましょう.

IDとは変数名,メソッド名を表す整数です.Rubyの中では

 :識別子

または

 :"任意の文字列"

でアクセスできます.Cからこの整数を得るためには関数

  rb_intern(const char *name)
  rb_intern_str(VALUE name)

を使います.Rubyから引数として与えられたシンボル(または文字
列)をIDに変換するには以下の関数を使います.

  rb_to_id(VALUE symbol)
  rb_check_id(volatile VALUE *name)
  rb_check_id_cstr(const char *name, long len, rb_encoding *enc)

もし引数がシンボルでも文字列でもなければ、to_strメソッドで文
字列に変換しようとします.第二の関数はその変換結果を*nameに保
存し,その名前が既知のシンボルでない場合は0を返します.この関
数が0以外を返した場合は*nameは常にシンボルか文字列であり、0を
返した場合は常に文字列です.第三の関数はRubyの文字列ではなく
NUL終端されたCの文字列を使います.

=== CからRubyのメソッドを呼び出す

Cから文字列を経由せずにRubyのメソッドを呼び出すためには以下
の関数を使います.

  VALUE rb_funcall(VALUE recv, ID mid, int argc, ...)

この関数はオブジェクトrecvのmidで指定されるメソッドを呼び出
します.その他に引数の指定の仕方が違う以下の関数もあります.

  VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv)
  VALUE rb_funcallv(VALUE recv, ID mid, int argc, VALUE *argv)
  VALUE rb_apply(VALUE recv, ID mid, VALUE args)

applyには引数としてRubyの配列を与えます.

=== 変数/定数を参照/更新する

Cから関数を使って参照・更新できるのは,定数,インスタンス変
数です.大域変数は一部のものはCの大域変数としてアクセスでき
ます.ローカル変数を参照する方法は公開していません.

オブジェクトのインスタンス変数を参照・更新する関数は以下の通
りです.

  VALUE rb_ivar_get(VALUE obj, ID id)
  VALUE rb_ivar_set(VALUE obj, ID id, VALUE val)

idはrb_intern()で得られるものを使ってください.

定数を参照するには以下の関数を使ってください.

  VALUE rb_const_get(VALUE obj, ID id)

定数を新しく定義するためには『2.1.3 定数定義』で紹介さ
れている関数を使ってください.

= RubyとCとの情報共有

C言語とRubyの間で情報を共有する方法について解説します.

== Cから参照できるRubyの定数

以下のRubyの定数はCのレベルから参照できます.

  Qtrue
  Qfalse

真偽値.QfalseはC言語でも偽とみなされます(つまり0).

  Qnil

C言語から見た「nil」.

== CとRubyで共有される大域変数

CとRubyで大域変数を使って情報を共有できます.共有できる大域
変数にはいくつかの種類があります.そのなかでもっとも良く使わ
れると思われるのはrb_define_variable()です.

  void rb_define_variable(const char *name, VALUE *var)

この関数はRubyとCとで共有する大域変数を定義します.変数名が
`$'で始まらない時には自動的に追加されます.この変数の値を変
更すると自動的にRubyの対応する変数の値も変わります.

またRuby側からは更新できない変数もあります.このread onlyの
変数は以下の関数で定義します.

  void rb_define_readonly_variable(const char *name, VALUE *var)

これら変数の他にhookをつけた大域変数を定義できます.hook付き
の大域変数は以下の関数を用いて定義します.hook付き大域変数の
値の参照や設定はhookで行う必要があります.

  void rb_define_hooked_variable(const char *name, VALUE *var,
				 VALUE (*getter)(), void (*setter)())

この関数はCの関数によってhookのつけられた大域変数を定義しま
す.変数が参照された時には関数getterが,変数に値がセットされ
た時には関数setterが呼ばれる.hookを指定しない場合はgetterや
setterに0を指定します.
# getterもsetterも0ならばrb_define_variable()と同じになる.

getterとsetterの仕様は次の通りです.

  VALUE (*getter)(ID id, VALUE *var);
  void (*setter)(VALUE val, ID id, VALUE *var);


それから,対応するCの変数を持たないRubyの大域変数を定義する
こともできます. その変数の値はフック関数のみによって取得・設定
されます.

  void rb_define_virtual_variable(const char *name,
				  VALUE (*getter)(), void (*setter)())

この関数によって定義されたRubyの大域変数が参照された時には
getterが,変数に値がセットされた時にはsetterが呼ばれます.

getterとsetterの仕様は以下の通りです.

  (*getter)(ID id);
  (*setter)(VALUE val, ID id);

== CのデータをRubyオブジェクトにする

Cの世界で定義されたデータ(構造体)をRubyのオブジェクトとして
取り扱いたい場合がありえます.このような場合には,Dataという
RubyオブジェクトにCの構造体(へのポインタ)をくるむことでRuby
オブジェクトとして取り扱えるようになります.

Dataオブジェクトを生成して構造体をRubyオブジェクトにカプセル
化するためには,以下のマクロを使います.

  Data_Wrap_Struct(klass, mark, free, sval)

このマクロの戻り値は生成されたDataオブジェクトです.

klassはこのDataオブジェクトのクラスです.markはこの構造体が
Rubyのオブジェクトへの参照がある時に使う関数です.そのような
参照を含まない時には0を指定します.

# そのような参照は勧められません.

freeはこの構造体がもう不要になった時に呼ばれる関数です.この
関数がガーベージコレクタから呼ばれます.これが-1の場合は,単
純に開放されます.

markおよびfree関数はGC実行中に呼び出されます.
なお, GC実行中はRubyオブジェクトのアロケーションは禁止されま
す. よって, markおよびfree関数でRubyオブジェクトのアロケーシ
ョンは行わないでください.

Cの構造体の割当とDataオブジェクトの生成を同時に行うマクロと
して以下のものが提供されています.

  Data_Make_Struct(klass, type, mark, free, sval)

このマクロの戻り値は生成されたDataオブジェクトです.このマク
ロは以下の式のように働きます:

  (sval = ALLOC(type), Data_Wrap_Struct(klass, mark, free, sval))

klass, mark, freeはData_Wrap_Structと同じ働きをします.type
は割り当てるC構造体の型です.割り当てられた構造体は変数sval
に代入されます.この変数の型は (type*) である必要があります.

Dataオブジェクトからポインタを取り出すのは以下のマクロを用い
ます.

  Data_Get_Struct(obj, type, sval)

Cの構造体へのポインタは変数svalに代入されます.

これらのDataの使い方はちょっと分かりにくいので,後で説明する
例題を参照してください.

= 例題 - dbmパッケージを作る

ここまでの説明でとりあえず拡張ライブラリは作れるはずです.
Rubyのextディレクトリにすでに含まれているdbmライブラリを例に
して段階的に説明します.

== ディレクトリを作る

  % mkdir ext/dbm

Ruby 1.1からは任意のディレクトリでダイナミックライブラリを作
ることができるようになりました.Rubyに静的にリンクする場合に
はRubyを展開したディレクトリの下,extディレクトリの中に拡張
ライブラリ用のディレクトリを作る必要があります.名前は適当に
選んで構いません.

== 設計する

まあ,当然なんですけど,どういう機能を実現するかどうかまず設
計する必要があります.どんなクラスをつくるか,そのクラスには
どんなメソッドがあるか,クラスが提供する定数などについて設計
します.

== Cコードを書く

拡張ライブラリ本体となるC言語のソースを書きます.C言語のソー
スがひとつの時には「ライブラリ名.c」を選ぶと良いでしょう.C
言語のソースが複数の場合には逆に「ライブラリ名.c」というファ
イル名は避ける必要があります.オブジェクトファイルとモジュー
ル生成時に中間的に生成される「ライブラリ名.o」というファイル
とが衝突するからです.また,後述する mkmf ライブラリのいくつ
かの関数がコンパイルを要するテストのために「conftest.c」とい
うファイル名を使用することに注意してください.ソースファイル
名として「conftest.c」を使用してはなりません.

Rubyは拡張ライブラリをロードする時に「Init_ライブラリ名」と
いう関数を自動的に実行します.dbmライブラリの場合「Init_dbm」
です.この関数の中でクラス,モジュール,メソッド,定数などの
定義を行います.dbm.cから一部引用します.

  void
  Init_dbm(void)
  {
      /* DBMクラスを定義する */
      cDBM = rb_define_class("DBM", rb_cObject);
      /* DBMはEnumerableモジュールをインクルードする */
      rb_include_module(cDBM, rb_mEnumerable);

      /* DBMクラスのクラスメソッドopen(): 引数はCの配列で受ける */
      rb_define_singleton_method(cDBM, "open", fdbm_s_open, -1);

      /* DBMクラスのメソッドclose(): 引数はなし */
      rb_define_method(cDBM, "close", fdbm_close, 0);
      /* DBMクラスのメソッド[]: 引数は1個 */
      rb_define_method(cDBM, "[]", fdbm_fetch, 1);

      /* ... */

      /* DBMデータを格納するインスタンス変数名のためのID */
      id_dbm = rb_intern("dbm");
  }

DBMライブラリはdbmのデータと対応するオブジェクトになるはずで
すから,Cの世界のdbmをRubyの世界に取り込む必要があります.

dbm.cではData_Make_Structを以下のように使っています.

  struct dbmdata {
      int  di_size;
      DBM *di_dbm;
  };


  obj = Data_Make_Struct(klass, struct dbmdata, 0, free_dbm, dbmp);

ここではdbmstruct構造体へのポインタをDataにカプセル化してい
ます.DBM*を直接カプセル化しないのはclose()した時の処理を考
えてのことです.

Dataオブジェクトからdbmstruct構造体のポインタを取り出すため
に以下のマクロを使っています.

  #define GetDBM(obj, dbmp) {\
      Data_Get_Struct(obj, struct dbmdata, dbmp);\
      if (dbmp->di_dbm == 0) closed_dbm();\
  }

ちょっと複雑なマクロですが,要するにdbmdata構造体のポインタ
の取り出しと,closeされているかどうかのチェックをまとめてい
るだけです.

DBMクラスにはたくさんメソッドがありますが,分類すると3種類の
引数の受け方があります.ひとつは引数の数が固定のもので,例と
してはdeleteメソッドがあります.deleteメソッドを実装している
fdbm_delete()はこのようになっています.

  static VALUE
  fdbm_delete(VALUE obj, VALUE keystr)
  {
      /* ... */
  }

引数の数が固定のタイプは第1引数がself,第2引数以降がメソッド
の引数となります.

引数の数が不定のものはCの配列で受けるものとRubyの配列で受け
るものとがあります.dbmライブラリの中で,Cの配列で受けるもの
はDBMのクラスメソッドであるopen()です.これを実装している関
数fdbm_s_open()はこうなっています.

  static VALUE
  fdbm_s_open(int argc, VALUE *argv, VALUE klass)
  {
      /* ... */

      if (rb_scan_args(argc, argv, "11", &file, &vmode) == 1) {
  	mode = 0666;		/* default value */
      }

      /* ... */
  }

このタイプの関数は第1引数が与えられた引数の数,第2引数が与え
られた引数の入っている配列になります.selfは第3引数として与
えられます.

この配列で与えられた引数を解析するための関数がopen()でも使わ
れているrb_scan_args()です.第3引数に指定したフォーマットに従
い,第4変数以降に指定したVALUEへの参照に値を代入してくれま
す.


引数をRubyの配列として受け取るメソッドの例には
Thread#initializeがあります.実装はこうです.

  static VALUE
  thread_initialize(VALUE thread, VALUE args)
  {
      /* ... */
  }

第1引数はself,第2引数はRubyの配列です.

*注意事項*

Rubyと共有はしないがRubyのオブジェクトを格納する可能性のある
Cの大域変数は以下の関数を使ってRubyインタプリタに変数の存在
を教えてあげてください.でないとGCでトラブルを起こします.

  void rb_global_variable(VALUE *var)

== extconf.rbを用意する

Makefileを作る場合の雛型になるextconf.rbというファイルを作り
ます.extconf.rbはライブラリのコンパイルに必要な条件のチェッ
クなどを行うことが目的です.まず,

  require 'mkmf'

をextconf.rbの先頭に置きます.extconf.rbの中では以下のRuby関
数を使うことが出来ます.

  have_library(lib, func): ライブラリの存在チェック
  have_func(func, header): 関数の存在チェック
  have_header(header): ヘッダファイルの存在チェック
  create_makefile(target[, target_prefix]): Makefileの生成

以下の変数を使うことができます.

  $CFLAGS: コンパイル時に追加的に指定するフラグ(-Oなど)
  $CPPFLAGS: プリプロセッサに追加的に指定するフラグ(-Iや-Dなど)
  $LDFLAGS: リンク時に追加的に指定するフラグ(-Lなど)
  $objs: リンクされるオブジェクトファイル名のリスト

オブジェクトファイルのリストは,通常はソースファイルを検索し
て自動的に生成されますが,makeの途中でソースを生成するような
場合は明示的に指定する必要があります.

ライブラリをコンパイルする条件が揃わず,そのライブラリをコン
パイルしない時にはcreate_makefileを呼ばなければMakefileは生
成されず,コンパイルも行われません.

== dependを用意する

もし,ディレクトリにdependというファイルが存在すれば,
Makefileが依存関係をチェックしてくれます.

  % gcc -MM *.c > depend

などで作ることが出来ます.あって損は無いでしょう.

== Makefileを生成する

Makefileを実際に生成するためには

  ruby extconf.rb

とします.extconf.rbに require 'mkmf' の行がない場合にはエラー
になりますので,引数を追加して

  ruby -r mkmf extconf.rb

としてください.

site_ruby ディレクトリでなく,
vendor_ruby ディレクトリにインストールする場合には
以下のように --vendor オプションを加えてください.

  ruby extconf.rb --vendor

ディレクトリをext以下に用意した場合にはRuby全体のmakeの時に
自動的にMakefileが生成されますので,このステップは不要です.

== makeする

動的リンクライブラリを生成する場合にはその場でmakeしてくださ
い.必要であれば make install でインストールされます.

ext以下にディレクトリを用意した場合は,Rubyのディレクトリで
makeを実行するとMakefileを生成からmake,必要によってはそのモ
ジュールのRubyへのリンクまで自動的に実行してくれます.
extconf.rbを書き換えるなどしてMakefileの再生成が必要な時はま
たRubyディレクトリでmakeしてください.

拡張ライブラリはmake installでRubyライブラリのディレクトリの
下にコピーされます.もし拡張ライブラリと協調して使うRubyで記
述されたプログラムがあり,Rubyライブラリに置きたい場合には,
拡張ライブラリ用のディレクトリの下に lib というディレクトリ
を作り,そこに 拡張子 .rb のファイルを置いておけば同時にイン
ストールされます.

== デバッグ

まあ,デバッグしないと動かないでしょうね.ext/Setupにディレ
クトリ名を書くと静的にリンクするのでデバッガが使えるようにな
ります.その分コンパイルが遅くなりますけど.

== できあがり

後はこっそり使うなり,広く公開するなり,売るなり,ご自由にお
使いください.Rubyの作者は拡張ライブラリに関して一切の権利を
主張しません.

= Appendix A. Rubyのソースコードの分類

Rubyのソースはいくつかに分類することが出来ます.このうちクラ
スライブラリの部分は基本的に拡張ライブラリと同じ作り方になっ
ています.これらのソースは今までの説明でほとんど理解できると
思います.

== Ruby言語のコア

class.c    :: クラスとモジュール
error.c    :: 例外クラスと例外機構
gc.c       :: 記憶領域管理
load.c     :: ライブラリのロード
object.c   :: オブジェクト
variable.c :: 変数と定数

== Rubyの構文解析器

  parse.y      : 字句解析器と構文定義
    -> parse.c : 自動生成
  keywords     : 予約語
    -> lex.c   : 自動生成

== Rubyの評価器 (通称YARV)
  compile.c
  eval.c
  eval_error.c
  eval_jump.c
  eval_safe.c
  insns.def           : 仮想機械語の定義
  iseq.c              : VM::ISeqの実装
  thread.c            : スレッド管理とコンテキスト切り替え
  thread_win32.c      : スレッド実装
  thread_pthread.c    : 同上
  vm.c
  vm_dump.c
  vm_eval.c
  vm_exec.c
  vm_insnhelper.c
  vm_method.c

  opt_insns_unif.def  : 命令融合
  opt_operand.def     : 最適化のための定義

    -> insn*.inc      : 自動生成
    -> opt*.inc       : 自動生成
    -> vm.inc         : 自動生成

== 正規表現エンジン (鬼車)

  regex.c
  regcomp.c
  regenc.c
  regerror.c
  regexec.c
  regparse.c
  regsyntax.c

== ユーティリティ関数

debug.c    :: Cデバッガ用のデバッグシンボル
dln.c      :: 動的ローディング
st.c       :: 汎用ハッシュ表
strftime.c :: 時刻整形
util.c     :: その他のユーティリティ

== Rubyコマンドの実装

  dmyext.c
  dmydln.c
  dmyencoding.c
  id.c
  inits.c
  main.c
  ruby.c
  version.c

  gem_prelude.rb
  prelude.rb

== クラスライブラリ

array.c      :: Array
bignum.c     :: Bignum
compar.c     :: Comparable
complex.c    :: Complex
cont.c       :: Fiber, Continuation
dir.c        :: Dir
enum.c       :: Enumerable
enumerator.c :: Enumerator
file.c       :: File
hash.c       :: Hash
io.c         :: IO
marshal.c    :: Marshal
math.c       :: Math
numeric.c    :: Numeric, Integer, Fixnum, Float
pack.c       :: Array#pack, String#unpack
proc.c       :: Binding, Proc
process.c    :: Process
random.c     :: 乱数
range.c      :: Range
rational.c   :: Rational
re.c         :: Regexp, MatchData
signal.c     :: Signal
sprintf.c    :: String#sprintf
string.c     :: String
struct.c     :: Struct
time.c       :: Time
defs/known_errors.def :: 例外クラス Errno::*
-> known_errors.inc   :: 自動生成

== 多言語化

encoding.c  :: Encoding
transcode.c :: Encoding::Converter
enc/*.c     :: エンコーディングクラス群
enc/trans/* :: コードポイント対応表

== gorubyコマンドの実装

  goruby.c
  golf_prelude.rb      : goruby固有のライブラリ
    -> golf_prelude.c  : 自動生成

= Appendix B. 拡張用関数リファレンス

C言語からRubyの機能を利用するAPIは以下の通りである.

== 型

VALUE ::

  Rubyオブジェクトを表現する型.必要に応じてキャストして用いる.
  組み込み型を表現するCの型はruby.hに記述してあるRで始まる構造
  体である.VALUE型をこれらにキャストするためにRで始まる構造体
  名を全て大文字にした名前のマクロが用意されている.

== 変数・定数

Qnil ::

  定数: nilオブジェクト

Qtrue ::

  定数: trueオブジェクト(真のデフォルト値)

Qfalse ::

  定数: falseオブジェクト

== Cデータのカプセル化

Data_Wrap_Struct(VALUE klass, void (*mark)(), void (*free)(), void *sval) ::

  Cの任意のポインタをカプセル化したRubyオブジェクトを返す.こ
  のポインタがRubyからアクセスされなくなった時,freeで指定した
  関数が呼ばれる.また,このポインタの指すデータが他のRubyオブ
  ジェクトを指している場合,markに指定する関数でマークする必要
  がある.

Data_Make_Struct(klass, type, mark, free, sval) ::

  type型のメモリをmallocし,変数svalに代入した後,それをカプセ
  ル化したデータを返すマクロ.

Data_Get_Struct(data, type, sval) ::

  dataからtype型のポインタを取り出し変数svalに代入するマクロ.

== 型チェック

  TYPE(value)
  FIXNUM_P(value)
  NIL_P(value)
  void Check_Type(VALUE value, int type)
  SafeStringValue(value)

== 型変換

  FIX2INT(value), INT2FIX(i)
  FIX2LONG(value), LONG2FIX(l)
  NUM2INT(value), INT2NUM(i)
  NUM2UINT(value), UINT2NUM(ui)
  NUM2LONG(value), LONG2NUM(l)
  NUM2ULONG(value), ULONG2NUM(ul)
  NUM2LL(value), LL2NUM(ll)
  NUM2ULL(value), ULL2NUM(ull)
  NUM2OFFT(value), OFFT2NUM(off)
  NUM2SIZET(value), SIZET2NUM(size)
  NUM2SSIZET(value), SSIZET2NUM(ssize)
  rb_integer_pack(value, words, numwords, wordsize, nails, flags), rb_integer_unpack(words, numwords, wordsize, nails, flags)
  NUM2DBL(value)
  rb_float_new(f)
  StringValue(value)
  StringValuePtr(value)
  StringValueCStr(value)
  rb_str_new2(s)

== クラス/モジュール定義

VALUE rb_define_class(const char *name, VALUE super) ::

  superのサブクラスとして新しいRubyクラスを定義する.

VALUE rb_define_class_under(VALUE module, const char *name, VALUE super) ::

  superのサブクラスとして新しいRubyクラスを定義し,moduleの
  定数として定義する.

VALUE rb_define_module(const char *name) ::

  新しいRubyモジュールを定義する.

VALUE rb_define_module_under(VALUE module, const char *name) ::

  新しいRubyモジュールを定義し,moduleの定数として定義する.

void rb_include_module(VALUE klass, VALUE module) ::

  モジュールをインクルードする.classがすでにmoduleをインク
  ルードしている時には何もしない(多重インクルードの禁止).

void rb_extend_object(VALUE object, VALUE module) ::

  オブジェクトをモジュール(で定義されているメソッド)で拡張する.

== 大域変数定義

void rb_define_variable(const char *name, VALUE *var) ::

  RubyとCとで共有するグローバル変数を定義する.変数名が`$'で
  始まらない時には自動的に追加される.nameとしてRubyの識別子
  として許されない文字(例えば` ')を含む場合にはRubyプログラ
  ムからは見えなくなる.

void rb_define_readonly_variable(const char *name, VALUE *var) ::

  RubyとCとで共有するread onlyのグローバル変数を定義する.
  read onlyであること以外はrb_define_variable()と同じ.

void rb_define_virtual_variable(const char *name, VALUE (*getter)(), void (*setter)()) ::

  関数によって実現されるRuby変数を定義する.変数が参照された
  時にはgetterが,変数に値がセットされた時にはsetterが呼ばれ
  る.

void rb_define_hooked_variable(const char *name, VALUE *var, VALUE (*getter)(), void (*setter)()) ::

  関数によってhookのつけられたグローバル変数を定義する.変数
  が参照された時にはgetterが,関数に値がセットされた時には
  setterが呼ばれる.getterやsetterに0を指定した時にはhookを
  指定しないのと同じ事になる.

void rb_global_variable(VALUE *var)

  GCのため,Rubyプログラムからはアクセスされないが, Rubyオブ
  ジェクトを含む大域変数をマークする.

== 定数

void rb_define_const(VALUE klass, const char *name, VALUE val) ::

  定数を定義する.

void rb_define_global_const(const char *name, VALUE val) ::

  大域定数を定義する.

    rb_define_const(rb_cObject, name, val)

  と同じ意味.

== メソッド定義

rb_define_method(VALUE klass, const char *name, VALUE (*func)(), int argc) ::

  メソッドを定義する.argcはselfを除く引数の数.argcが-1の時,
  関数には引数の数(selfを含まない)を第1引数, 引数の配列を第2
  引数とする形式で与えられる(第3引数はself).argcが-2の時,
  第1引数がself, 第2引数がargs(argsは引数を含むRubyの配列)と
  いう形式で与えられる.

rb_define_private_method(VALUE klass, const char *name, VALUE (*func)(), int argc) ::

  privateメソッドを定義する.引数はrb_define_method()と同じ.

rb_define_singleton_method(VALUE klass, const char *name, VALUE (*func)(), int argc) ::

  特異メソッドを定義する.引数はrb_define_method()と同じ.

rb_scan_args(int argc, VALUE *argv, const char *fmt, ...) ::

  argc, argv形式で与えられた指定されたフォーマットに従って引
  数を分解し,続くVALUEへの参照にセットします.このフォーマッ
  トは,ABNFで記述すると以下の通りです.

    scan-arg-spec  := param-arg-spec [option-hash-arg-spec] [block-arg-spec]

    param-arg-spec := pre-arg-spec [post-arg-spec] / post-arg-spec /
                      pre-opt-post-arg-spec
    pre-arg-spec   := num-of-leading-mandatory-args [num-of-optional-args]
    post-arg-spec  := sym-for-variable-length-args
                      [num-of-trailing-mandatory-args]
    pre-opt-post-arg-spec := num-of-leading-mandatory-args num-of-optional-args
                             num-of-trailing-mandatory-args
    option-hash-arg-spec := sym-for-option-hash-arg
    block-arg-spec := sym-for-block-arg

    num-of-leading-mandatory-args  := DIGIT ; 先頭に置かれる省略不能な引数の数
    num-of-optional-args           := DIGIT ; 続いて置かれる省略可能な引数の数
    sym-for-variable-length-args   := "*"   ; 続いて置かれる可変長引数を
                                            ; Rubyの配列で取得するための指定
    num-of-trailing-mandatory-args := DIGIT ; 終端に置かれる省略不能な引数の数
    sym-for-option-hash-arg        := ":"   ; オプションハッシュを取得する
                                            ; ための指定; 省略不能な引数の
                                            ; 数よりも多くの引数が指定され,
                                            ; 最後の引数がハッシュ(または
                                            ; #to_hashで変換可能)の場合に
                                            ; 取得される.最後の引数がnilの
                                            ; 場合,可変長引数指定がなく,
                                            ; 省略不能引数の数よりも多くの
                                            ; 引数が指定された場合に取得される
    sym-for-block-arg              := "&"   ; イテレータブロックを取得するための
                                            ; 指定

  フォーマットが"12"の場合,引数は最低1つで,3つ(1+2)まで許さ
  れるという意味になります.従って,フォーマット文字列に続い
  て3つのVALUEへの参照を置く必要があります.それらには取得した
  変数がセットされます.変数への参照の代わりにNULLを指定する
  こともでき,その場合は取得した引数の値は捨てられます.なお,
  省略可能引数が省略された時の変数の値はnil(C言語のレベルでは
  Qnil)になります.

  返り値は与えられた引数の数です.オプションハッシュおよびイ
  テレータブロックは数えません.

== Rubyメソッド呼び出し

VALUE rb_funcall(VALUE recv, ID mid, int narg, ...) ::

  メソッド呼び出し.文字列からmidを得るためにはrb_intern()を
  使う.
  private/protectedなメソッドでも呼び出せる.

VALUE rb_funcall2(VALUE recv, ID mid, int argc, VALUE *argv) ::
VALUE rb_funcallv(VALUE recv, ID mid, int argc, VALUE *argv) ::

  メソッド呼び出し.引数をargc, argv形式で渡す.
  private/protectedなメソッドでも呼び出せる.

VALUE rb_funcallv_public(VALUE recv, ID mid, int argc, VALUE *argv) ::

  メソッド呼び出し.
  publicなメソッドしか呼べない.

VALUE rb_eval_string(const char *str)

  文字列をRubyスクリプトとしてコンパイル・実行する.

ID rb_intern(const char *name) ::

  文字列に対応するIDを返す.

char *rb_id2name(ID id) ::

  IDに対応する文字列を返す(デバッグ用).

char *rb_class2name(VALUE klass) ::

  クラスの名前を返す(デバッグ用).クラスが名前を持たない時に
  は, 祖先を遡って名前を持つクラスの名前を返す.

int rb_respond_to(VALUE obj, ID id) ::

  objがidで示されるメソッドを持つかどうかを返す.

== インスタンス変数

VALUE rb_iv_get(VALUE obj, const char *name) ::

  objのインスタンス変数の値を得る.`@'で始まらないインスタン
  ス変数は Rubyプログラムからアクセスできない「隠れた」イン
  スタンス変数になる.定数は大文字の名前を持つクラス(または
  モジュール)のインスタンス変数として実装されている.

VALUE rb_iv_set(VALUE obj, const char *name, VALUE val) ::

  objのインスタンス変数をvalにセットする.

== 制御構造

VALUE rb_block_call(VALUE obj, ID mid, int argc, VALUE * argv, VALUE (*func) (ANYARGS), VALUE data2) ::

  funcをブロックとして設定し,objをレシーバ,argcとargvを引数
  としてmidメソッドを呼び出す.funcは第一引数にyieldされた値,
  第二引数にdata2を受け取る.複数の値がyieldされた場合(Cでは
  rb_yield_values()とrb_yield_values2(), rb_yield_splat()),
  data2はArrayとしてパックされている.第三, 第四引数のargcと
  argvによってyieldされた値を取り出すことができる.

[OBSOLETE] VALUE rb_iterate(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2) ::

  func2をブロックとして設定し, func1をイテレータとして呼ぶ.
  func1には arg1が引数として渡され, func2には第1引数にイテレー
  タから与えられた値, 第2引数にarg2が渡される.

  1.9でrb_iterateを使う場合は, func1の中でRubyレベルのメソッド
  を呼び出さなければならない.
  1.9でobsoleteとなった. 代わりにrb_block_callが用意された.

VALUE rb_yield(VALUE val) ::

  valを値としてイテレータブロックを呼び出す.

VALUE rb_rescue(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2) ::

  関数func1をarg1を引数に呼び出す.func1の実行中に例外が発生
  した時には func2をarg2を引数として呼ぶ.戻り値は例外が発生
  しなかった時はfunc1の戻り値, 例外が発生した時にはfunc2の戻
  り値である.

VALUE rb_ensure(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2) ::

  関数func1をarg1を引数として実行し, 実行終了後(たとえ例外が
  発生しても) func2をarg2を引数として実行する.戻り値はfunc1
  の戻り値である(例外が発生した時は戻らない).

VALUE rb_protect(VALUE (*func) (VALUE), VALUE arg, int *state) ::

  関数funcをargを引数として実行し, 例外が発生しなければその戻
  り値を返す.例外が発生した場合は, *stateに非0をセットして
  Qnilを返す.
  rb_jump_tag()を呼ばずに捕捉した例外を無視する場合には,
  rb_set_errinfo(Qnil)でエラー情報をクリアしなければならない.

void rb_jump_tag(int state) ::

  rb_protect()やrb_eval_string_protect()で捕捉された例外を再
  送する.stateはそれらの関数から返された値でなければならない.
  この関数は直接の呼び出し元に戻らない.

void rb_iter_break() ::

  現在の最も内側のブロックを終了する.この関数は直接の呼び出
  し元に戻らない.

void rb_iter_break_value(VALUE value) ::

  現在の最も内側のブロックをvalueで終了する.ブロックは引数で
  与えられたvalueを返す.この関数は直接の呼び出し元に戻らない.

== 例外・エラー

void rb_warning(const char *fmt, ...) ::

  rb_verbose時に標準エラー出力に警告情報を表示する.引数は
  printf()と同じ.

void rb_raise(rb_eRuntimeError, const char *fmt, ...) ::

  RuntimeError例外を発生させる.引数はprintf()と同じ.

void rb_raise(VALUE exception, const char *fmt, ...) ::

  exceptionで指定した例外を発生させる.fmt以下の引数は
  printf()と同じ.

void rb_fatal(const char *fmt, ...) ::

  致命的例外を発生させる.通常の例外処理は行なわれず, インター
  プリタが終了する(ただしensureで指定されたコードは終了前に
  実行される).

void rb_bug(const char *fmt, ...) ::

  インタープリタなどプログラムのバグでしか発生するはずのない
  状況の時呼ぶ.インタープリタはコアダンプし直ちに終了する.
  例外処理は一切行なわれない.

注意: %iはObject#to_s('+'フラグが指定されているときはObject#inspect)を
使ったVALUEの出力に使用されているため,整数には%dを使用すること.

== Rubyの初期化・実行

Rubyをアプリケーションに埋め込む場合には以下のインタフェース
を使う.通常の拡張ライブラリには必要ない.

void ruby_init() ::

  Rubyインタプリタの初期化を行なう.

void ruby_options(int argc, char **argv) ::

  Rubyインタプリタのコマンドライン引数の処理を行なう.

void ruby_run() ::

  Rubyインタプリタを実行する.

void ruby_script(char *name) ::

  Rubyのスクリプト名($0)を設定する.

== インタプリタのイベントのフック

  void rb_add_event_hook(rb_event_hook_func_t func, rb_event_flag_t events,
                         VALUE data)

指定されたインタプリタのイベントに対するフック関数を追加します.
eventsは以下の値のorでなければなりません:

  RUBY_EVENT_LINE
  RUBY_EVENT_CLASS
  RUBY_EVENT_END
  RUBY_EVENT_CALL
  RUBY_EVENT_RETURN
  RUBY_EVENT_C_CALL
  RUBY_EVENT_C_RETURN
  RUBY_EVENT_RAISE
  RUBY_EVENT_ALL

rb_event_hook_func_tの定義は以下の通りです:

  typedef void (*rb_event_hook_func_t)(rb_event_t event, VALUE data,
                                       VALUE self, ID id, VALUE klass)

rb_add_event_hook() の第3引数 data は,フック関数の第2引数と
して渡されます.これは1.8では現在のNODEへのポインタでした.以
下の RB_EVENT_HOOKS_HAVE_CALLBACK_DATA も参照してください.

  int rb_remove_event_hook(rb_event_hook_func_t func)

指定されたフック関数を削除します.

== 互換性のためのマクロ

APIの互換性をチェックするために以下のマクロがデフォルトで定義されています.

NORETURN_STYLE_NEW ::

  NORETURN マクロが関数型マクロとして定義されていることを意味する.

HAVE_RB_DEFINE_ALLOC_FUNC ::

  rb_define_alloc_func() 関数が提供されていること,つまり
  allocation framework が使われることを意味する.
  have_func("rb_define_alloc_func", "ruby.h")
  の結果と同じ.

HAVE_RB_REG_NEW_STR ::

  StringオブジェクトからRegexpオブジェクトを作る
  rb_reg_new_str() 関数が提供されていることを意味する.
  have_func("rb_reg_new_str", "ruby.h").
  の結果と同じ.

HAVE_RB_IO_T ::

  rb_io_t 型が提供されていることを意味する.

USE_SYMBOL_AS_METHOD_NAME ::

  メソッド名を返すメソッド,Module#methods, #singleton_methods
  などがSymbolを返すことを意味する.

HAVE_RUBY_*_H ::

  ruby.h で定義されている.対応するヘッダが提供されていること
  を意味する.たとえば,HAVE_RUBY_ST_H が定義されている場合は
  単なる st.h ではなく ruby/st.h を使用する.

RB_EVENT_HOOKS_HAVE_CALLBACK_DATA ::

  rb_add_event_hook() がフック関数に渡す data を第3引数として
  受け取ることを意味する.

= Appendix C. extconf.rbで使える関数たち

extconf.rbの中では利用可能なコンパイル条件チェックの関数は以
下の通りである.

have_macro(macro, headers) ::

  ヘッダファイルheaderをインクルードしてマクロmacroが定義さ
  れているかどうかチェックする.マクロが定義されている時true
  を返す.

have_library(lib, func) ::

  関数funcを定義しているライブラリlibの存在をチェックする.
  チェックに成功すると,-llibを$libsに追加し,trueを返す.

find_library(lib, func, path...) ::

  関数funcを定義しているライブラリlibの存在を -Lpath を追加
  しながらチェックする.チェックに成功すると,-llibを$libsに
  追加し,trueを返す.

have_func(func, header) ::

  ヘッダファイルheaderをインクルードして関数funcの存在をチェ
  ックする.funcが標準ではリンクされないライブラリ内のもので
  ある時には先にhave_libraryでそのライブラリをチェックしてお
  く事.チェックに成功すると,プリプロセッサマクロ
  `HAVE_{FUNC}` を定義し,trueを返す.

have_var(var, header) ::

  ヘッダファイルheaderをインクルードして変数varの存在をチェッ
  クする.varが標準ではリンクされないライブラリ内のものであ
  る時には先にhave_libraryでそのライブラリをチェックしておく
  事.チェックに成功すると,プリプロセッサマクロ
  `HAVE_{VAR}` を定義し,trueを返す.

have_header(header) ::

  ヘッダファイルの存在をチェックする.チェックに成功すると,
  プリプロセッサマクロ `HAVE_{HEADER_H}` を定義し,trueを返す.
  (スラッシュやドットはアンダースコアに置換される)

find_header(header, path...) ::

  ヘッダファイルheaderの存在を -Ipath を追加しながらチェック
  する.チェックに成功すると,プリプロセッサマクロ
  `HAVE_{HEADER_H}` を定義し,trueを返す.
  (スラッシュやドットはアンダースコアに置換される)

have_struct_member(type, member[, header[, opt]]) ::

  ヘッダファイルheaderをインクルードして型typeが定義され,
  なおかつメンバmemberが存在するかをチェックする.チェックに
  成功すると,プリプロセッサマクロ `HAVE_{TYPE}_{MEMBER}` を
  定義し,trueを返す.

have_type(type, header, opt) ::

  ヘッダファイルheaderをインクルードして型typeが存在するかを
  チェックする.チェックに成功すると,プリプロセッサマクロ
  `HAVE_TYPE_{TYPE}` を定義し,trueを返す.

check_sizeof(type, header) ::

  ヘッダファイルheaderをインクルードして型typeのchar単位サイ
  ズを調べる.チェックに成功すると,プリプロセッサマクロ
  `SIZEOF_{TYPE}` を定義し,そのサイズを返す.定義されていな
  いときはnilを返す.

create_makefile(target[, target_prefix]) ::

  拡張ライブラリ用のMakefileを生成する.この関数を呼ばなけれ
  ばそのライブラリはコンパイルされない.targetはモジュール名
  を表す.

find_executable(command, path) ::

  コマンドcommandをFile::PATH_SEPARATORで区切られたパス名の
  リストpathから探す.pathがnilまたは省略された場合は,環境
  変数PATHの値を使用する.実行可能なコマンドが見つかった場合
  はパスを含むファイル名,見つからなかった場合はnilを返す.

with_config(withval[, default=nil]) ::

  コマンドライン上の--with-<withval>で指定されたオプション値
  を得る.

enable_config(config, *defaults) ::
disable_config(config, *defaults) ::

  コマンドライン上の--enable-<config>または
  --disable-<config>で指定された真偽値を得る.
  --enable-<config>が指定されていた場合はtrue,
  --disable-<config>が指定されていた場合はfalseを返す.
  どちらも指定されていない場合は,ブロックつきで呼び出されて
  いる場合は*defaultsをyieldした結果,ブロックなしなら
  *defaultsを返す.

dir_config(target[, default_dir]) ::
dir_config(target[, default_include, default_lib]) ::

  コマンドライン上の--with-<target>-dir, --with-<target>-include,
  --with-<target>-libのいずれかで指定されるディレクトリを
  $CFLAGS や $LDFLAGS に追加する.--with-<target>-dir=/pathは
  --with-<target>-include=/path/include --with-<target>-lib=/path/lib
  と等価である.追加された include ディレクトリと lib ディレ
  クトリの配列を返す. ([include_dir, lib_dir])

pkg_config(pkg, option=nil) ::

  pkg-configコマンドからパッケージpkgの情報を [cflags, ldflags, libs]
  の配列として得る.$CFLAGS, $LDFLAGS, $libs にはそれぞれの値が
  追加される.

  pkg-configの実際のコマンドは,以下の順で試される.

  1. コマンドラインで--with-{pkg}-config={command}オプションが
     指定された場合: {command} {option}
  2. {pkg}-config {option}
  3. pkg-config {option} {pkg}

  optionが指定された場合は、上記の配列の代わりにそのオプションを
  指定して得られた出力をstripしたものを返す.

= Appendix D. 世代別GC

Ruby 2.1から世代別GCに対応しました。我々はこれをRGenGCと呼んでいます。
RGenGCは、過去の拡張ライブラリに(ほぼ)互換性を保つように開発されている
ため、拡張ライブラリ側の対応はほぼ不要です。

ただし、対応をすることで性能を向上することができる可能性があります。もし
拡張ライブラリに高い性能が必要である場合は対応を検討して下さい。

とくにRARRAY_PTR()/RHASH_TBL()のようなマクロを用いてポインタに直接アクセ
スするようなコードは書かないようにして下さい。代わりに、rb_ary_aref(),
rb_ary_store() などの、適切な API 関数を利用するようにして下さい。

そのほか、対応についての詳細は README.ext の「Appendix D. Generational
GC」を参照して下さい。

/*
 * Local variables:
 * fill-column: 60
 * end:
 */
PK~[�qodoc/alt-ruby21/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~[���	�	doc/alt-ruby21/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~[`���doc/alt-ruby21/READMEnu�[���= 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(ex. class, method calls)
*   *Advanced* Object-Oriented features(ex. Mix-in, Singleton-method)
*   Operator Overloading
*   Exception Handling
*   Iterators and Closures
*   Garbage Collection
*   Dynamic Loading of Object files(on some architecture)
*   Highly Portable (works on many Unix-like/POSIX compatible platforms
    as well as Windows, Mac OS X, BeOS etc.)
    cf. http://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:

http://www.ruby-lang.org/en/downloads/

The Ruby distribution files can be found in 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 http://svn.ruby-lang.org/repos/ruby/trunk/ ruby

Or if you are using git then use the following command:

  $ git clone git://github.com/ruby/ruby.git

There are some other branches under development.  Try the following
command and see the list of branches:

  $ svn ls http://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:

http://www.ruby-lang.org/


== Mailing list

There is a mailing list to talk about Ruby.
To subscribe this list, please send the following phrase

        subscribe YourFirstName YourFamilyName
e.g.
        subscribe Joseph Smith

in the mail body (not subject) to the address <mailto:ruby-talk-ctl@ruby-lang.org>.


== How to compile and install

This is what you need to do to compile and install Ruby:

0.   If you want to use Microsoft Visual C++ to compile ruby,
     read win32/README.win32 instead of this document.

1.   If +./configure+ does not exist or is older than configure.in,
     run autoconf to (re)generate configure.

2.   Run +./configure+, which will generate config.h and Makefile.

     Some C compiler flags may be added by default depending on your
     environment.  Specify <tt>optflags=..</tt> and <tt>warnflags=..</tt> as
     necessary to override them.

3.   Edit +defines.h+ if you need. Usually this step will not be needed.

4.   Remove comment mark(<tt>#</tt>) 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 does not allow dynamic loading),
     remove comment mark from thPK~[�qodoc/alt-ruby21/BSDLnu�[���lly this step will not be needed.

5.   Run +make+.

6.   Optionally, run '<tt>make check</tt>' to check whether the compiled Ruby
     interpreter works well. If you see the message "<tt>check succeeded</tt>",
     your ruby works as it should (hopefully).

7.   Run '<tt>make install</tt>'

     This command will create following directories and install files
     onto them.

     * <tt>${DESTDIR}${prefix}/bin</tt>
     * <tt>${DESTDIR}${prefix}/include/ruby-${MAJOR}.${MINOR}.${TEENY}</tt>
     * <tt>${DESTDIR}${prefix}/include/ruby-${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}</tt>
     * <tt>${DESTDIR}${prefix}/lib</tt>
     * <tt>${DESTDIR}${prefix}/lib/ruby</tt>
     * <tt>${DESTDIR}${prefix}/lib/ruby/${MAJOR}.${MINOR}.${TEENY}</tt>
     * <tt>${DESTDIR}${prefix}/lib/ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}</tt>
     * <tt>${DESTDIR}${prefix}/lib/ruby/site_ruby</tt>
     * <tt>${DESTDIR}${prefix}/lib/ruby/site_ruby/${MAJOR}.${MINOR}.${TEENY}</tt>
     * <tt>${DESTDIR}${prefix}/lib/ruby/site_ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}</tt>
     * <tt>${DESTDIR}${prefix}/lib/ruby/vendor_ruby</tt>
     * <tt>${DESTDIR}${prefix}/lib/ruby/vendor_ruby/${MAJOR}.${MINOR}.${TEENY}</tt>
     * <tt>${DESTDIR}${prefix}/lib/ruby/vendor_ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATPK~[���	�	doc/alt-ruby21/COPYINGnu�[���OR}.${TEENY}</tt>
     * <tt>${DESTDIR}${prefix}/share/man/man1</tt>
     * <tt>${DESTDIR}${prefix}/share/ri/${MAJOR}.${MINOR}.${TEENY}/system</tt>

     If Ruby's API version is '_x.y.z_', the <tt>${MAJOR}</tt> is '_x_', the
     <tt>${MINOR}</tt> is '_y_', and the <tt>${TEENY}</tt> 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
'<tt>make distclean-ext</tt>' to remove old configuration after
installing them in such case.

== Copying

See the file +COPYING+.

== Feedback

Questions about the Ruby language can be asked on the Ruby-Talk mailing list
(http://www.ruby-lang.org/en/community/mailing-lists) or on websites like
(http://stackoverflow.com).

Bug reports should be filed at http://bugs.ruby-lang.org

== The Author

Ruby was originally designed and developed by Yukihiro Matsumoto (Matz) in 1995.

<mailto:matz@ruby-lang.org>

--
Local variables:
mode: rdoc
end:
PK~[��FN�F�Fdoc/alt-ruby21/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 receivPK~[`���doc/alt-ruby21/READMEnu�[���oftware 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 onPK~[��FN�F�Fdoc/alt-ruby21/GPLnu�[���) 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.
PK~[�z���#doc/alt-ruby21-rubygems/LICENSE.txtnu�[���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.

PKo�[�'���man/man1/sqlite3.1nu�[���.\"                                      Hey, EMACS: -*- nroff -*-
.\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1)
.TH SQLITE3 1 "Fri Aug 11 23:50:12 CET 2023"
.\" Please adjust this date whenever revising the manpage.
.\"
.\" Some roff macros, for reference:
.\" .nh        disable hyphenation
.\" .hy        enable hyphenation
.\" .ad l      left justify
.\" .ad b      justify to both left and right margins
.\" .nf        disable filling
.\" .fi        enable filling
.\" .br        insert line break
.\" .sp <n>    insert n+1 empty lines
.\" for manpage-specific macros, see man(7)
.SH NAME
.B sqlite3 
\- A command line interface for SQLite version 3

.SH SYNOPSIS
.B sqlite3
.RI [ options ]
.RI [ databasefile ]
.RI [ SQL ]

.SH SUMMARY
.PP
.B sqlite3
is a terminal-based front-end to the SQLite library that can evaluate
queries interactively and display the results in multiple formats.
.B sqlite3
can also be used within shell scripts and other applications to provide
batch processing features.

.SH DESCRIPTION
To start a
.B sqlite3
interactive session, invoke the
.B sqlite3
command and optionally provide the name of a database file.  If the
database file does not exist, it will be created.  If the database file
does exist, it will be opened.

For example, to create a new database file named "mydata.db", create
a table named "memos" and insert a couple of records into that table:
.sp
$ 
.B sqlite3 mydata.db
.br
SQLite version 3.43.0 2023-08-11 17:45:23
.br
Enter ".help" for usage hints.
.br
sqlite>
.B create table memos(text, priority INTEGER);
.br
sqlite>
.B insert into memos values('deliver project description', 10);
.br
sqlite>
.B insert into memos values('lunch with Christine', 100);
.br
sqlite>
.B select * from memos;
.br
deliver project description|10
.br
lunch with Christine|100
.br
sqlite>
.sp

If no database name is supplied, the ATTACH sql command can be used
to attach to existing or create new database files.  ATTACH can also
be used to attach to multiple databases within the same interactive
session.  This is useful for migrating data between databases,
possibly changing the schema along the way.

Optionally, a SQL statement or set of SQL statements can be supplied as
a single argument.  Multiple statements should be separated by
semi-colons.

For example:
.sp
$ 
.B sqlite3 -line mydata.db 'select * from memos where priority > 20;'
.br
    text = lunch with Christine
.br
priority = 100
.br
.sp

.SS SQLITE META-COMMANDS
.PP
The interactive interpreter offers a set of meta-commands that can be
used to control the output format, examine the currently attached
database files, or perform administrative operations upon the
attached databases (such as rebuilding indices).   Meta-commands are
always prefixed with a dot (.).

A list of available meta-commands can be viewed at any time by issuing
the '.help' command.  For example:
.sp
sqlite>
.B .help
.nf
.tr %.
...
.sp
.fi

The available commands differ by version and build options, so they
are not listed here. Please refer to your local copy for all available
options.


.SH INIT FILE
.B sqlite3
reads an initialization file to set the configuration of the
interactive environment.  Throughout initialization, any previously
specified setting can be overridden.  The sequence of initialization is
as follows:

o The default configuration is established as follows:

.sp
.nf
.cc |
mode            = LIST
separator       = "|"
main prompt     = "sqlite> "
continue prompt = "   ...> "
|cc .
.sp
.fi

o If the file
.B ${XDG_CONFIG_HOME}/sqlite3/sqliterc
or
.B ~/.sqliterc
exists, the first of those to be found is processed during startup.
It should generally only contain meta-commands.

o If the -init option is present, the specified file is processed.

o All other command line options are processed.

.SH SEE ALSO
https://sqlite.org/cli.html
.br
https://sqlite.org/fiddle (a WebAssembly build of the CLI app)
.br
The sqlite3-doc package.
.SH AUTHOR
This manual page was originally written by Andreas Rottmann
<rotty@debian.org>, for the Debian GNU/Linux system (but may be used
by others). It was subsequently revised by Bill Bumgarner <bbum@mac.com>,
Laszlo Boszormenyi <gcs@debian.hu>, and the sqlite3 developers.
PKo�[��D�B�Bdoc/alt-sqlite/README.mdnu�[���<h1 align="center">SQLite Source Repository</h1>

This repositoPK~[�z���#doc/alt-ruby21-rubygems/LICENSE.txtnu�[���e.org/).  Some test scripts
are also included.  However, many other test scripts
and most of the documentation are managed separately.

## Version Control

SQLite sources are managed using
[Fossil](https://www.fossil-scm.org/), a distributed version control system
that was specifically designed and written to support SQLite development.
The [Fossil repository](https://sqlite.org/src/timeline) contains the urtext.

If you are reading this on GitHub or some other Git repository or service,
then you are looking at a mirror.  The names of check-ins and
other artifacts in a Git mirror are different from the official
names for those objects.  The official names for check-ins are
found in a footer on the check-in comment for authorized mirrors.
The official check-in name can also be seen in the `manifest.uuid` file
in the root of the tree.  Always use the official name, not  the
Git-name, when communicating about an SQLite check-in.

If you pulled your SQLite source code from a secondary source and want to
verify its integrity, there are hints on how to do that in the
[Verifying Code Authenticity](#vauth) section below.

## Contacting The SQLite Developers

The preferred way to ask questions or make comments about SQLite or to
report bugs against SQLite is to visit the 
[SQLite Forum](https://sqlite.org/forum) at <https://sqlite.org/forum/>.
Anonymous postings are permitted.

If you think you have found a bug that has security implications and
you do not want to report it on the public forum, you can send a private
email to drh at sqlite dot org.

## Public Domain

The SQLite source code is in the public domain.  See
<https://sqlite.org/copyright.html> for details. 

Because SQLite is in the public domain, we do not normally accept pull
requests, because if we did take a pull request, the changes in that
pull request might carry a copyright and the SQLite source code would
then no longer be fully in the public domain.

## Obtaining The SQLite Source Code

If you do not want to use Fossil, you can download tarballs or ZIP
archives or [SQLite archives](https://sqlite.org/cli.html#sqlar) as follows:

  *  Latest trunk check-in as
     [Tarball](https://www.sqlite.org/src/tarball/sqlite.tar.gz),
     [ZIP-archive](https://www.sqlite.orgPKo�[�'���man/man1/sqlite3.1nu�[���.\"                                      Hey, EMACS: -*- nroff -*-
.\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1)
.TH SQLITE3 1 "Fri Aug 11 23:50:12 CET 2023"
.\" Please adjust this date whenever revising the manpage.
.\"
.\" Some roff macros, for reference:
.\" .nh        disable hyphenation
.\" .hy        enable hyphenation
.\" .ad l      left justify
.\" .ad b      justify to both left and right margins
.\" .nf        disable filling
.\" .fi        enable filling
.\" .br        insert line break
.\" .sp <n>    insert n+1 empty lines
.\" for manpage-specific macros, see man(7)
.SH NAME
.B sqlite3 
\- A command line interface for SQLite version 3

.SH SYNOPSIS
.B sqlite3
.RI [ options ]
.RI [ databasefile ]
.RI [ SQL ]

.SH SUMMARY
.PP
.B sqlite3
is a terminal-based front-end to the SQLite library that can evaluate
queries interactively and display the results in multiple formats.
.B sqlite3
can also be used within shell scripts and other applications to provide
batch processing features.

.SH DESCRIPTION
To start a
.B sqlite3
interactive session, invoke the
.B sqlite3
command and optionally provide the name of a database file.  If the
database file does not exist, it will be created.  If the database file
does exist, it will be opened.

For example, to create a new database file named "mydata.db", create
a table named "memos" and insert a couple of records into that table:
.sp
$ 
.B sqlite3 mydata.db
.br
SQLite version 3.43.0 2023-08-11 17:45:23
.br
Enter ".help" for usage hints.
.br
sqlite>
.B create table memos(text, priority INTEGER);
.br
sqlite>
.B insert into memos values('deliver project description', 10);
.br
sqlite>
.B insert into memos values('lunch with Christine', 100);
.br
sqlite>
.B select * from memos;
.br
deliver project description|10
.br
lunch with Christine|100
.br
sqlite>
.sp

If no database name is supplied, the ATTACH sql command can be used
to attach to existing or create new database files.  ATTACH can also
be used to attach to multiple databases within the same interactive
session.  This is useful for migrating data between databases,
possibly changing the schema along the way.

Optionally, a SQL statement or set of SQL statements can be supplied as
a single argument.  Multiple statements should be separated by
semi-colons.

For example:
.sp
$ 
.B sqlite3 -line mydata.db 'select * from memos where priority > 20;'
.br
    text = lunch with Christine
.br
priority = 100
.br
.sp

.SS SQLITE META-COMMANDS
.PP
The interactive interpreter offers a set of meta-commands that can be
used to control the output format, examine the currently attached
database files, or perform administrative operations upon the
attached databases (such as rebuilding indices).   Meta-commands are
always prefixed with a dot (.).

A list of available meta-commands can be viewed at any time by issuing
the '.help' command.  For example:
.sp
sqlite>
.B .help
.nf
.tr %.
...
.sp
.fi

The available commands differ by version and build options, so they
are not listed here. Please refer to your local copy for all available
options.


.SH INIT FILE
.B sqlite3
reads an initialization file to set the configuration of the
interactive environment.  Throughout initialization, any previously
specified setting can be overridden.  The sequence of initialization is
as follows:

o The default configuration is established as follows:

.sp
.nf
.cc |
mode            = LIST
separator       = "|"
main prompt     = "sqlite> "
continue prompt = "   ...> "
|cc .
.sp
.fi

o If the file
.B ${XDG_CONFIG_HOME}/sqlite3/sqliterc
or
.B ~/.sqliterc
exists, the first of those to be found is processed during startup.
It should generally only contain meta-commands.

o If the -init option is present, the specified file is processed.

o All other command line options are processed.

.SH SEE ALSO
https://sqlite.org/cli.html
.br
https://sqlite.org/fiddle (a WebAssembly build of the CLI app)
.br
The sqlite3-doc package.
.SH AUTHOR
This manual page was originally written by Andreas Rottmann
<rotty@debian.org>, for the Debian GNU/Linux system (but may be used
by others). It was subsequently revised by Bill Bumgarner <bbum@mac.com>,
Laszlo Boszormenyi <gcs@debian.hu>, and the sqlite3 developers.
PKo�[��D�B�Bdoc/alt-sqlite/README.mdnu�[���<h1 align="center">SQLite Source Repository</h1>

This repository contains the complete source code for the
[SQLite database engine](https://sqlite.org/).  Some test scripts
are also included.  However, many other test scripts
and most of the documentation are managed separately.

## Version Control

SQLite sources are managed using
[Fossil](https://www.fossil-scm.org/), a distributed version control system
that was specifically designed and written to support SQLite development.
The [Fossil repository](https://sqlite.org/src/timeline) contains the urtext.

If you are reading this on GitHub or some other Git repository or service,
then you are looking at a mirror.  The names of check-ins and
other artifacts in a Git mirror are different from the official
names for those objects.  The official names for check-ins are
found in a footer on the check-in comment for authorized mirrors.
The official check-in name can also be seen in the `manifest.uuid` file
in the root of the tree.  Always use the official name, not  the
Git-name, when communicating about an SQLite check-in.

If you pulled your SQLite source code from a secondary source and want to
verify its integrity, there are hints on how to do that in the
[Verifying Code Authenticity](#vauth) section below.

## Contacting The SQLite Developers

The preferred way to ask questions or make comments about SQLite or to
report bugs against SQLite is to visit the 
[SQLite Forum](https://sqlite.org/forum) at <https://sqlite.org/forum/>.
Anonymous postings are permitted.

If you think you have found a bug that has security implications and
you do not want to report it on the public forum, you can send a private
email to drh at sqlite dot org.

## Public Domain

The SQLite source code is in the public domain.  See
<https://sqlite.org/copyright.html> for details. 

Because SQLite is in the public domain, we do not normally accept pull
requests, because if we did take a pull request, the changes in that
pull request might carry a copyright and the SQLite source code would
then no longer be fully in the public domain.

## Obtaining The SQLite Source Code

If you do not want to use Fossil, you can download tarballs or ZIP
archives or [SQLite archives](https://sqlite.org/cli.html#sqlar) as follows:

  *  Latest trunk check-in as
     [Tarball](https://www.sqlite.org/src/tarball/sqlite.tar.gz),
     [ZIP-archive](https://www.sqlite.org/src/zip/sqlite.zip), or
     [SQLite-archive](https://www.sqlite.org/src/sqlar/sqlite.sqlar).

  *  Latest release as
     [Tarball](https://www.sqlite.org/src/tarball/sqlite.tar.gz?r=release),
     [ZIP-archive](https://www.sqlite.org/src/zip/sqlite.zip?r=release), or
     [SQLite-archive](https://www.sqlite.org/src/sqlar/sqlite.sqlar?r=release).

  *  For other check-ins, substitute an appropriate branch name or
     tag or hash prefix in place of "release" in the URLs of the previous
     bullet.  Or browse the [timeline](https://www.sqlite.org/src/timeline)
     to locate the check-in desired, click on its information page link,
     then click on the "Tarball" or "ZIP Archive" links on the information
     page.

If you do want to use Fossil to check out the source tree,
first install Fossil version 2.0 or later.
(Source tarballs and precompiled binaries available
[here](https://www.fossil-scm.org/fossil/uv/download.html).  Fossil is
a stand-alone program.  To install, simply download or build the single
executable file and put that file someplace on your $PATH.)
Then run commands like this:

        mkdir -p ~/sqlite ~/Fossils
        cd ~/sqlite
        fossil clone https://www.sqlite.org/src ~/Fossils/sqlite.fossil
        fossil open ~/Fossils/sqlite.fossil

After setting up a repository using the steps above, you can always
update to the latest version using:

        fossil update trunk   ;# latest trunk check-in
        fossil update release ;# latest official release

Or type "fossil ui" to get a web-based user interface.

## Compiling for Unix-like systems

First create a directory in which to place
the build products.  It is recommended, but not required, that the
build directory be separate from the source directory.  Cd into the
build directory and then from the build directory run the configure
script found at the root of the source tree.  Then run "make".

For example:

        tar xzf sqlite.tar.gz    ;#  Unpack the source tree into "sqlite"
        mkdir bld                ;#  Build will occur in a sibling directory
        cd bld                   ;#  Change to the build directory
        ../sqlite/configure      ;#  Run the configure script
        make                     ;#  Builds the "sqlite3" command-line tool
        make sqlite3.c           ;#  Build the "amalgamation" source file
        make devtest             ;#  Run some tests (requires Tcl)

See the makefile for additional targets.

The configure script uses autoconf 2.61 and libtool.  If the configure
script does not work out for you, there is a generic makefile named
"Makefile.linux-gcc" in the top directory of the source tree that you
can copy and edit to suit your needs.  Comments on the generic makefile
show what changes are needed.

## Compiling for Windows Using MSVC

On Windows, all applicable build products can be compiled with MSVC.
You will also need a working installation of TCL.
See the [compile-for-windows.md](doc/compile-for-windows.md) document for
additional information about how to install MSVC and TCL and configure your
build environment.

If you want to run tests, you need to let SQLite know the location of your
TCL library, using a command like this:

        set TCLDIR=c:\Tcl

SQLite uses "tclsh.exe" as part of the build process, and so that utility
program will need to be somewhere on your %PATH%.  The finished SQLite library
does not contain any TCL code, but it does use TCL to help with the build process
and to run tests.

Build using Makefile.msc.  Example:

        nmake /f Makefile.msc
        nmake /f Makefile.msc sqlite3.c
        nmake /f Makefile.msc devtest
        nmake /f Makefile.msc releasetest
 
There are many other makefile targets.  See comments in Makefile.msc for
details.

## Source Code Tour

Most of the core source files are in the **src/** subdirectory.  The
**src/** folder also contains files used to build the "testfixture" test
harness. The names of the source files used by "testfixture" all begin
with "test".
The **src/** also contains the "shell.c" file
which is the main program for the "sqlite3.exe"
[command-line shell](https://sqlite.org/cli.html) and
the "tclsqlite.c" file which implements the
[Tcl bindings](https://sqlite.org/tclsqlite.html) for SQLite.
(Historical note:  SQLite began as a Tcl
extension and only later escaped to the wild as an independent library.)

Test scripts and programs are found in the **test/** subdirectory.
Additional test code is found in other source repositories.
See [How SQLite Is Tested](https://www.sqlite.org/testing.html) for
additional information.

The **ext/** subdirectory contains code for extensions.  The
Full-text search engine is in **ext/fts3**.  The R-Tree engine is in
**ext/rtree**.  The **ext/misc** subdirectory contains a number of
smaller, single-file extensions, such as a REGEXP operator.

The **tool/** subdirectory contains various scripts and programs used
for building generated source code files or for testing or for generating
accessory programs such as "sqlite3_analyzer(.exe)".

### Generated Source Code Files

Several of the C-language source files used by SQLite are generated from
other sources rather than being typed in manually by a programmer.  This
section will summarize those automatically-generated files.  To create all
of the automatically-generated files, simply run "make target&#95;source".
The "target&#95;source" make target will create a subdirectory "tsrc/" and
fill it with all the source files needed to build SQLite, both
manually-edited files and automatically-generated files.

The SQLite interface is defined by the **sqlite3.h** header file, which is
generated from src/sqlite.h.in, ./manifest.uuid, and ./VERSION.  The
[Tcl script](https://www.tcl.tk) at tool/mksqlite3h.tcl does the conversion.
The manifest.uuid file contains the SHA3 hash of the particular check-in
and is used to generate the SQLITE\_SOURCE\_ID macro.  The VERSION file
contains the current SQLite version number.  The sqlite3.h header is really
just a copy of src/sqlite.h.in with the source-id and version number inserted
at just the right spots. Note that comment text in the sqlite3.h file is
used to generate much of the SQLite API documentation.  The Tcl scripts
used to generate that documentation are in a separate source repository.

The SQL language parser is **parse.c** which is generated from a grammar in
the src/parse.y file.  The conversion of "parse.y" into "parse.c" is done
by the [lemon](./doc/lemon.html) LALR(1) parser generator.  The source code
for lemon is at tool/lemon.c.  Lemon uses the tool/lempar.c file as a
template for generating its parser.
Lemon also generates the **parse.h** header file, at the same time it
generates parse.c.

The **opcodes.h** header file contains macros that define the numbers
corresponding to opcodes in the "VDBE" virtual machine.  The opcodes.h
file is generated by scanning the src/vdbe.c source file.  The
Tcl script at ./mkopcodeh.tcl does this scan and generates opcodes.h.
A second Tcl script, ./mkopcodec.tcl, then scans opcodes.h to generate
the **opcodes.c** source file, which contains a reverse mapping from
opcode-number to opcode-name that is used for EXPLAIN output.

The **keywordhash.h** header file contains the definition of a hash table
that maps SQL language keywords (ex: "CREATE", "SELECT", "INDEX", etc.) into
the numeric codes used by the parse.c parser.  The keywordhash.h file is
generated by a C-language program at tool mkkeywordhash.c.

The **pragma.h** header file contains various definitions used to parse
and implement the PRAGMA statements.  The header is generated by a
script **tool/mkpragmatab.tcl**. If you want to add a new PRAGMA, edit
the **tool/mkpragmatab.tcl** file to insert the information needed by the
parser for your new PRAGMA, then run the script to regenerate the
**pragma.h** header file.

### The Amalgamation

All of the individual C source code and header files (both manually-edited
and automatically-generated) can be combined into a single big source file
**sqlite3.c** called "the amalgamation".  The amalgamation is the recommended
way of using SQLite in a larger application.  Combining all individual
source code files into a single big source code file allows the C compiler
to perform more cross-procedure analysis and generate better code.  SQLite
runs about 5% faster when compiled from the amalgamation versus when compiled
from individual source files.

The amalgamation is generated from the tool/mksqlite3c.tcl Tcl script.
First, all of the individual source files must be gathered into the tsrc/
subdirectory (using the equivalent of "make target_source") then the
tool/mksqlite3c.tcl script is run to copy them all together in just the
right order while resolving internal "#include" references.

The amalgamation source file is more than 200K lines long.  Some symbolic
debuggers (most notably MSVC) are unable to deal with files longer than 64K
lines.  To work around this, a separate Tcl script, tool/split-sqlite3c.tcl,
can be run on the amalgamation to break it up into a single small C file
called **sqlite3-all.c** that does #include on about seven other files
named **sqlite3-1.c**, **sqlite3-2.c**, ..., **sqlite3-7.c**.  In this way,
all of the source code is contained within a single translation unit so
that the compiler can do extra cross-procedure optimization, but no
individual source file exceeds 32K lines in length.

## How It All Fits Together

SQLite is modular in design.
See the [architectural description](https://www.sqlite.org/arch.html)
for details. Other documents that are useful in
(helping to understand how SQLite works include the
[file format](https://www.sqlite.org/fileformat2.html) description,
the [virtual machine](https://www.sqlite.org/opcode.html) that runs
prepared statements, the description of
[how transactions work](https://www.sqlite.org/atomiccommit.html), and
the [overview of the query planner](https://www.sqlite.org/optoverview.html).

Years of effort have gone into optimizing SQLite, both
for small size and high performance.  And optimizations tend to result in
complex code.  So there is a lot of complexity in the current SQLite
implementation.  It will not be the easiest library in the world to hack.

Key files:

  *  **sqlite.h.in** - This file defines the public interface to the SQLite
     library.  Readers will need to be familiar with this interface before
     trying to understand how the library works internally.

  *  **sqliteInt.h** - this header file defines many of the data objects
     used internally by SQLite.  In addition to "sqliteInt.h", some
     subsystems have their own header files.

  *  **parse.y** - This file describes the LALR(1) grammar that SQLite uses
     to parse SQL statements, and the actions that are taken at each step
     in the parsing process.

  *  **vdbe.c** - This file implements the virtual machine that runs
     prepared statements.  There are various helper files whose names
     begin with "vdbe".  The VDBE has access to the vdbeInt.h header file
     which defines internal data objects.  The rest of SQLite interacts
     with the VDBE through an interface defined by vdbe.h.

  *  **where.c** - This file (together with its helper files named
     by "where*.c") analyzes the WHERE clause and generates
     virtual machine code to run queries efficiently.  This file is
     sometimes called the "query optimizer".  It has its own private
     header file, whereInt.h, that defines data objects used internally.

  *  **btree.c** - This file contains the implementation of the B-Tree
     storage engine used by SQLite.  The interface to the rest of the system
     is defined by "btree.h".  The "btreeInt.h" header defines objects
     used internally by btree.c and not published to the rest of the system.

  *  **pager.c** - This file contains the "pager" implementation, the
     module that implements transactions.  The "pager.h" header file
     defines the interface between pager.c and the rest of the system.

  *  **os_unix.c** and **os_win.c** - These two files implement the interface
     between SQLite and the underlying operating system using the run-time
     pluggable VFS interface.

  *  **shell.c.in** - This file is not part of the core SQLite library.  This
     is the file that, when linked against sqlite3.a, generates the
     "sqlite3.exe" command-line shell.  The "shell.c.in" file is transformed
     into "shell.c" as part of the build process.

  *  **tclsqlite.c** - This file implements the Tcl bindings for SQLite.  It
     is not part of the core SQLite library.  But as most of the tests in this
     repository are written in Tcl, the Tcl language bindings are important.

  *  **test\*.c** - Files in the src/ folder that begin with "test" go into
     building the "testfixture.exe" program.  The testfixture.exe program is
     an enhanced Tcl shell.  The testfixture.exe program runs scripts in the
     test/ folder to validate the core SQLite code.  The testfixture program
     (and some other test programs too) is built and run when you type
     "make test".

There are many other source files.  Each has a succinct header comment that
describes its purpose and role within the larger system.

<a name="vauth"></a>
## Verifying Code Authenticity

The `manifest` file at the root directory of the source tree
contains either a SHA3-256 hash or a SHA1 hash
for every source file in the repository.
The name of the version of the entire source tree is just the
SHA3-256 hash of the `manifest` file itself, possibly with the
last line of that file omitted if the last line begins with
"`# Remove this line`".
The `manifest.uuid` file should contain the SHA3-256 hash of the
`manifest` file. If all of the above hash comparisons are correct, then
you can be confident that your source tree is authentic and unadulterated.
Details on the format for the `manifest` files are available
[on the Fossil website](https://fossil-scm.org/fossil/doc/trunk/www/fileformat.wiki#manifest).

The process of checking source code authenticity is automated by the 
makefile:

>   make verify-source

Or on windows:

>   nmake /f Makefile.msc verify-source

Using the makefile to verify source integrity is good for detecting
accidental changes to the source tree, but malicious changes could be
hidden by also modifying the makefiles.

## Contacts

The main SQLite website is [https://sqlite.org/](https://sqlite.org/)
with geographically distributed backups at
[https://www2.sqlite.org/](https://www2.sqlite.org) and
[https://www3.sqlite.org/](https://www3.sqlite.org).
PK
B![p���(licenses/alt-php70-snuffleupagus/LICENSEnu�[���umbered 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.
PKB![c��^0,0,+doc/alt-php70-ioncube-loader/USER-GUIDE.txtnu�[���ionCube Loader 14.4 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.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 ; defaulPKB![c��^0,0,+doc/alt-php70-ioncube-loader/USER-GUIDE.txtnu�[���es:

   * "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. 2025
PKB![}��6�6�+doc/alt-php70-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:20250130155421Z)
>>
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  
131.750000  0]
endobj
12 0 obj
[0 /XYZ 33  
296  0]
endobj
13 0 obj
[0 /XYZ 33  
97.2500000  0]
endobj
14 0 obj
<<
/Type /Annot
/Subtype /Link
/Rect [71.2500000  66.5000000  144.750000  75.5000000 ]
/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��][��8v~�_��FI���@w� �0l A�l���8;��Ϗ.TU�򱪾�(���H�\lR���_�ۗo��#y����|�r�RSd�I���ej�'�P�{��Ï�����s�����~�n�|���{ޡ������/�ɿ��{�_�]��.���#L�,/������Sd�Nu%���=������O�o�>���2)�T������魞�eZ	�s�e�]y��J7ߕ�5X��}�I.����/�ߟ���ㄪ�>Oʰ�WVEXx
=��12����E��?�fy���C���}�5eH��5�^���k���N��%y����׿tjJ!����َ�"�t��ӈ�Gre�s�n�L��)�s��ӈ�GL��=�FL7���,�#��u5yNկ�������|�[�k��ҎTi�=�]<>g<�
G>�#&UE���w ���D�o*D����
aϧ�����Ont)�}���o��ɻ�����/_���ɇ��Ǘ���xy��y�������sf}��6��&-��.#�wV�-�Ϡ��7��t�w�i5����Av
u٣�N5����}�i9>wQ�9�z�v-�-�Ң{��y�TM�K�պ9j
�M�0D0�p?O�|Lg��Y�����a`�9�
�����SL�I7�H˞]��
B�a�X���x�ρ��s,�WSJ�*xs�`����q���-��}���;�ۈqS7���i/ƪ@���~��S1���[^o&�'�^�/8ާ�s�B�+y�����q��6s�1��1w&8�co�����&��:���b�"��eBѷ��R�)g#�fW���x�c׌��H��s0�������ɮ�EVv�:�a�Y
�|��>2��ءӜ�ַ֊��El��|�_w�{�N��A<����v�V)a��-�ë��lr
�E
��Z��-e�`�->S��Y��xݵT�^k�;�
�1M�{�v��w��:I#�(@�(Yw\-t�9]�����4b�Tr:��9cG�<:�&� ^�CQ�j�t�U��	S|�3A�8g��M�^���c�@8Vðf���c��5;�s��@�9�>!�ٽ�5{�����%)�&ěpW7aMW�g7c�R��<����&M��o�ףO��{�Y��Ms���|�tFs�Z-��`�b|����~��z�?��^���{��G~�����o���bN�ҝ[�V���5t��8�q�f5*؈p�:H��a��K�u���–n_��99��F���] p�9��\rSݟ�LfG��Օ�6��` 1|���=ę0 <dz���#��ص�.�#��1J���*K�|�ɔU��T}���=��(��DT��?6��3��)Z���1��xG69Qp$�#�p���T�<��gbo/Į�j��2��|�#��?����������8*I�d�.6��u4r��Y&iRqC�
c���
��PF\Ƥń�<N"H�����,�U�щ�d�>L��N���L����4�шy��w�!�5a<t��k���2���g?�W�g��e�-镫��� @'-��~�7�?�$�h0W�.��-��m@$
�XL�^�3�
��ǁ��L�T(A����e�n����v�W��7����U��\KL�q,����j�^Y!��D���a�M����`p	n��$N&$0�J5��?",�~}�����3��d츮�M���rb�#�($fR��>m��~��E�ofw(n�K�ox,��ŰƄ�H�Z�)&�X�c�n�
3L]0�|�5���x� �b�X�Zڈ��׏��r�_��TK�WL$�W��p���,�9�&F�Q6ܾ����*u��կ9���?���{Z�ߙ���5� �u�_�9��L�O�!h��IH�˴{UN=K�$���ue��B&Bm?ץ��9���b$k�<Я��l���t�!:98"�D�Ah��� ���i㣗4J�r
�v�<b�x�U���9ۊ����E*��__�_ߚ�Y�a�T��[�b{h�l	������"���/MV
��L�/Y����1��1�s~�1�
��Ռ"�׿�Pu�ٰQΫ�p5ח/0oe2J�.�)�^��i�9�TM�&��cE�JkY�?��~��2/Êaeq��r4n).c<C��fD�P�L���ע��φʋc<8�½0�p��Y�k���7�х�k �Ţ7s֍�ni��;�%�҉���vF�c���ե����t��Y��oZ�Se�f��L'r18�X�.��s��K�)Y
8�\�`��v+�i+�$�RɯݗZ���BW��[^��(i���RiY�ʺ��T�V�W�a�2��Z����gԿ��$c���OA����cp�TG�_ ����7N�k����I�a��ğ�-�v)� P�H��\�0;�d��"h�2�W�� �x1��Ȓl�fpıF�âO�s�
(T;�⁀��#�L�I^�l��֯�hT�߮K��J(;�@A9ҒHKV�%Gߪ�T��<���y*��)��<��j0I�ku:OY��<eծUu��w3�d�ZK�<U�k�<��|�5�ɡ{�˯�JiCX�b��dži����~�,�җ��6<rf� �"Kr�7R#��,�(�F�7����aq4�R�.�7p��*�j��vPL��jx�ձ�M�:y9�:��Q��������T�V�:y1�:m|d�1P���`��k-�:���L���
2�g�C�w��߮T�6��5��cr3����-gtR4�7�r�J�4�9ጲZ8Y�!��(,�3Z�m���&E�KV&�n�������)�;����L�2o�2�iP�Vm~��
Jg��z������T�V�A�L�hP�M�o?T��L2v��5�ZH��i��¶8�8
��n�q)p����e!R�<i�B��*�iE�����Y���U��
;�p���� ��U~�m#���ԺS4�(b��]
&�v�Ni)�"�_۵�Q�`��L2v���#O#�MT�ՇQ6���r��֧r@��0p`/~Sj���B(��pձ��0�}�����9b��`�8/�M(��j�S�?Մ��xpx�6���|�v�E3R���.��,�Bԇ4y_�ƶ�03��؝yqY��f�Njj��豤��XǒZ^RK6U�Ϯ�ߖ�a�m�Y	�ӓ`f�ud��s�k߳�hޚ*�
�k�qo�����z�5$�����W��3�k���L*m��|�75/:QT��QS�i����T��bANx��(,~��VLW	'�;�l%�Z8��fn1WGe*^�v�3�s��ֶ�l�Uc�1�cKR��vC�u9��ܤ�;��~��M
[&��g��%_Y8P������IM5V�;��Sk�pT�3]��ϱxw6�j�SL��F��
|� S=`�=��k��T*GsT��b��i�V2T7��j&��G�	#�ln2�R�s�@�i<z����ʉ~����d�0�bB�O��m��"pC0�bN���K=���$���"m���F�{�|��C�P�	�8*��W6
����u��C�����W�2��gn����׳B�
��2_��a�*B\칺 k�@Fv�2FpL���g̼��L�C�1ta��3�Y�H���-�Ӊ��"!�*O>�9�.�[�J��c�p@���K��:u�%�ʑ]�E.j�4�WaY�W�R(�j����׃O�q)��1WF:����i*��=�ƛ��X�-��g1f޽����ύ��J
'V�%����ȓ��UO)���"�0R�s$<�O!ެx���fI3����A0	�?��^뵽�f��i��'�}���a�&lM�42,��
]ji��2�>t���ˠ��`�j�S�c)����;���&U�ݑ�2U���c�慜T���B����֡��ӉM��Y��ϱ���Y�XA�st�bނ6����s ��s?b]Gc�^?����)zLF���S��v<�|�����ݦ0��2�qc�w��왎(û/��-y�>y��~�����#y�!��!y��r0in-���D
)H� ��?�\_�سtY�b����1@ԭ_��)����($����Y3�`���D29K^˕1p�5�b����Mo����7��I~����`�ôue
�1��op��0�`�!�n3QA�V
���P!%��fxp(:�6-Æ��+E{��~���{~�W�v4 d�'pSI�o3ɳ��"�)�1I0�"pN�ΰ*�WRw!�}4�
!����9wV�4�a+d�6�u���S�x�w�1�1;���(��F�}3�s��Q&#�)�@�)LUbc���e�oQ��D���y����lQ�7"�
fQw0<�B3�yaX3�>C6�Ҭ��[fF%`�lw0D�z�fb܁��o]�G
�c� 
�a�"_��gS���`��d^����7#m^z��f��X|1}�sa�HP���,㛹W�욹W��i�^�YӀ��4soW�I�]�m�^=�̽��]��4so7�IƮ�p3��T�`��l;��~s��������n:�0��6m����f�.�,��h�>��J1�vw�x$���G�7+���G���j�ρ�ԍ��<խ��H�7���p��멡�ԍ��<ӯ���T?�/�((�'���ի}GQ�D�H��q^fv�f��
c>9����� ҃M�G0�-��gxැ�ߐ9�>�9�e�o��c�YX���*|��T��;�7�
��M�F?c*Py��ן#SA3��T��5�l�T�2�^66t>��y�_oqS��+'FSA�� �
�j�h��.��E�l�Ekѱ�sĢ�5����,�.��.�w�0c݌��<ӯ�8��}٭Ȣ7n��pBżm�!��84F����z\UjD�F��g��݅`D��Mp-u/��fNp-�N�,˱�ڌ��<խg�2�\Kk�*��ڌ��<ӯ���Z)
��z9�,��D1��Ĭ��-Eq(�8�@T�h��^.�y��$�������$D�
6��PPjG�`�������A��Ϯ'F�R;b�L��҂�&
Joc�欞�i�a"J��#8{��)�pb��:=��Q<ݴx�6:�/ة�|���jѲ��~[�&26N���ĝ>�#CnԒ�#�<;�F��&�rA1���d}5����w0���~$���
�t5�ڟ�$����r�PI��(�2U5�f��9�V7
{̰�c���q�1�v ����r�M�j��p��	�~�t�X:)�v��f1�:��=�#�3ŧp�!R�`�h��x|K�ix��"9����o�R���_ds��E6�\ds��m��{N��0
�Fy,�!{J�O��������I���ޜr�gK�Z�p���jڎ��~s�;g�;UZ���0XLM-Y�g�s�i5D��s�9ֽQ���s��Kp&����gT��nE�k�f���=���33#�7�g�����z�x�w���J�����	JR����zB�v�)�ka���
Ʒⵃ0���PKB![}��6�6�+doc/alt-php70-ioncube-loader/USER-GUIDE.pdfnu�[����|�5�������Yϭ��T59(j�p仼��W���=��A;�Nw<.=�A5�]�<���kF<�j��+��y�*�GT�'e���w�����7bo[&�L�.*���SN[����k#/���53c����.l9H:T96�a�=����#Bm�"T&L�`ج��T��M�p�f����)�
�L�VA���h��@����[Y�9֬SLu
�VC4ᢚVy��{��$�5.U��!�������Sl�)����ɫ��t��k��$��RzQ����x��{ʤ���3΂��������'��H�@����EaJ�%0F6c�JnJ�H�]~=���z$�K��o�=	�R�4�yp`<�k��i�R�@�u�[�ނ�@���< ��p�g��XL���Nل��ݴ>���׮�pc���_j�1�g|`LQ�L�)�Ѷ�>rS0��e�E)��*F�,�^���Y�ê����2X��j��wai�EU]�!�1~T�4^�E"�n���4��ӳ���W�1��r"�Fg&��2��oh�>#.<kU˗��ŀwP�ptk��]�s0l�Zk�����	�F��+����S�>��K~8�|z;�*�~N>�I�˙
endstream
endobj
16 0 obj
6379
endobj
20 0 obj
[1 /XYZ 33  
760.250000  0]
endobj
21 0 obj
[1 /XYZ 33  
672.500000  0]
endobj
22 0 obj
[1 /XYZ 33  
158.750000  0]
endobj
23 0 obj
<<
/Type /Annot
/Subtype /Link
/Rect [102  696.500000  175.500000  705.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��][k�H~�_��Ȫ*�.`�maaL���C�dv���d��+�JmK꯺��QIrk㶫���:��\��o>F��#����-zr?o>l�8�I�_T�{������P�}���l�G�7����7���x���h��4�p���"�����_��~�����e��<�_�l��痿�$��TeQ�=�Z���?��V�H�"I�6ڨf,��߽x��=��K�gi�آ��mZ&����&o~���JuE5�迟6�V�?w]�X]���\�؎��:)�Ĕ��]�&�vm�w]X=Q�:Iҩ�V:��k3ݬm�w�~� ���c[׏���,R:z�5j���X��2���KtYq�۫��M�L[�C]�ݶ�b�iV�5:�LRl[t\6��hɷ-YlR�k�ٶ�q���Ӣ�ۊ�ߦ�{F5C;f�ʺgt�t����Ūf�[�kɒ�tG-ۏE�xf�w�j[��768S��c�<CЁʶ-*iሱ�Pccf�W��^�d��;�z�L=���h�N��z�n�gf��ZU“Ep�RU�7�����#P7��6�{C��Y˟k�6�	c���Sg��ʡVKM���ⳍ�vݞ���·u
�֔�􆟁3U�n��h(�.�����u+�d����pl�,`���L��Cڡ�CU�Wam���@��Ң��ū����[��k�G��YQ<6QY�5֞�:�������aLT��W�je�~Ō��%xl��q�4sd���{��p>�}��ӆ��q^�9 >-�B«������lY%�IBʾ��S/��2r�s�	�Jiӌ�Ϝ9��߆׍�q?�؄W�uX�1���0(>?��Q{��P�@s<���
�,���9Ƣ �A�=���fzռ��!Y����2��68��#��`��,����5�ش,�ʌs�72#���-<Z�!��y�(���&��H��1)�3�5�H�㑍p�L��i�׎
�(���(�Ö#�_�������LM߶�I�&��X��Ԝ�Y棢t��=,�O]�`��Lg�c��~��||�Dc<c��]����+F�y����L���M���*y,+S��<�V'T���і��1��P���o������"�yZK𹓃r���;u�Z+ĩS�wwF����윪�o��g܊�=�C�������i^w�3-������-o���
��ma�s�=-�|��[k7��V]|���kty]�����Ϗ���]^EWW��Me��Ԭ[:�-�����@z�x
Yj��$�S����x%�Q��Pnj,T��	.U��9%A�itzSQ6�`֩���qf9J�ך�����!v�Ѐ���=Ϻ1#M=�*�h�ŒӠ�]K��J�^��b''�U���@/Lo�N��:�dD00�h`��]�i�c��P�t!*��IE��|1�I���a*Ɣ���Hr	v�^�ƊNmՎ�9i��lL(�:D�d0�a�ztZ�дCr��H��uW}N�_]��.f�"�=���i�zi]iӥv,�-�#'���̽��AP%n�Ex=�;=���dG���lt��ӬC���Ɣ�8�'Iq
O%,&�
%#�F(�u���u�Y���%Ťp�"_�!r�* �	k	�L��̙�i�H*�S�h�u��u�OMYf�2�5��L��Z0e����u
_�ܨ�I �F�Dcӈ��Ri���U����х���"!���S�J�T#F�I��c��>ƶ��ƒ�k���-�u��Ze7}խ���q�Ͳ
eh��E�'��QO?E{
�	����`7�8z����6`�;���f\?.�w����:�昬7��M m�z���k�۽�た��'Z��^:~z�5����6*���06{�-0��S6/+ΚD�[�vL�'SJZM��RԢ3ؒ÷�?c`�{�Ƕ+Yp�v���
?��CN�=��X���~q��cv��Q�������>;�={C{����-����kf�:�EA�2\�c�(�py� �\}E^G���̉�t\&f'��e| ��Ӣ�ZZhDiaܢ�( %Q�2XQ�h�Y_��2��s�*︨_&N���.����?ӗ
UR+�n���Ƕ͜��"�! �TD*+�H%��0&UcLy�bLnj��1ݞ���0�|��б�ɔtn�H�zI�a@?��>�w��ZO?p���P��p���h��u�?�
����׀���3�����mx>pv�){J�vDxfzD�;��8"J7Ӂ�\8��Ԧ�eo{f��ɫ�2!�TBR�[̙��P�P5��LgL;�[ô���
=�`� �G��n�w�L<
�N�g�O�^��ee�,f��w�2�eW��:���F>���QO�u<gY.N+��
N��Q��xu���g�����5�s�5�iM�2E�y�!���!ѬvFV�t��)X���9'���5�i����j%VPa����%�.����z•���4��D&
��у��PQ��WӔ�K�	D��S�%�S��7f�Dtc(z���c(8���R��#�C�YSl"��S���)�CY��n"���N�}��1o����A�pd���%IJp���T���N�(:ĈR�2��Rr���o���[Ӭ_q��8N�_!��zb��I��b.\�\W5gj��AK�� 2��P9���R�����:5]~��2֣	�)U{}r4P��9㫢!�]�	N���Q:a��H2��ZF�Jx`8c��R�B�<�������L֑��ߕ3k���
ߜߐ��D�R"��rԱ��|��	��Ռ�]�����хSC$�褲�I�59f��]�*�jq�1/�|�cN��#�xl8����*4D�,\�œ�B����6�R���I�3��'զiQI||�OQD��a8���"56,v���f`{�1f�"��)Мq��
 ������E��dZ&\;��:)�:��.�-����I�zc�#X(7��&�J�Ya�sm������5)���r���6�U
�	˘v0T��|�:Õ�3�p4AUA�QSz��l����}���PWN0�o�f&
=P��$p-ҁ$�N-꘠�F��YWa�zeyqJ(�䭭5S@`r�D$�w�eʛ ��ں��k�K��]�ʚH��s-?��eO�C|����`�ū�]��NZ|�^�%�|�f�e{���oCA�L�;%���b\p�q�@�D��Y__q>.+Y�6��dwA��REsj�p�-�Fvi�+���75���g2���t"C��@������iA/L]&&�;ZTa4/J'c¢�u(Cp��"�ra�!,Z��|*Hyx���g�|�!�K��Ҥ���Ɋe^��9��[8P0*e0�D� :ZF�O�+Yu{�4�	�Ǻ7��8,��k�

��֙���%!�F�u�"�{8�؈;N4����\���p��sL�'%�]�G��f��n`竩�ʗ$
��W3���CwӟƼ1�NDY�
<j�?ؕKd=c!�Y��8C�s% vM3��%#v�L�j�|4n��
�3̮���!Z&����C���'�u�>��a`��_E�d��dM�*Ü���C��'�)ܽHת��J�b�	#8��%g��3�e���C�ݭ��$���t��s�;���?����i��fH�MUv�4�2N�~�Y�bE[dg���y�[��u�dE
�pL\���x��5p��_����G�gZ��%-��'�~�q?��i:p>�G{�;<86Ϩ�Z�)E{�Z����Ňo�F�����~������Utu]�����I�Ļ���{��MO(l���>H"=�������.��gڿ�tJ�/~�ǯ�߆Qc�~b&�^`�`�36<S쩹{f1#��<k�;�1��(���*�mN�]*�?�5���P	@�_\!�dR�2LX��%g�$H�&�@#|��
L�B�DR�T-���e��1��r�<Ӄ�#mu}q��O*��d͇2��ZD��S�|ژʒ.mj�c:ϙ�}���Oi��T�ޗ����T����}�m����-q�vY�b0�e�e3!��*u�2bh,�m}ߎ��s�ަ,�)���Z ���w���]�g�z�
S��p"e�0.L��>w$!�S�
�T�����Ϟ�ߊ��s�y����'�Mټ����uK�y.o�7��Ow	0��7�v0����bJcȂ��0��<��Q�;���Ս�Ӎ�@7�N7����tc�W7�N7���:��vtcD7�vd�u�<�=+r��E߽;2��d�=l��S
endstream
endobj
25 0 obj
4362
endobj
29 0 obj
[2 /XYZ 33  
122.750000  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��]߯۶~�_��QDR% ����A�a�C��+��h�
۟?ɢl�G��=�$�-��k]Q$ux~~����}��?��O�>��O7E�l��u��:�B׹�������/����͇͇�߯�a��?>��y�?k�����f:�s��/����������S.�V�����_UQVyը�n�/����߾�~k�Q�uQhm�Q�\F���EcrS��u�'}�޼����)U����\U��sS4ua�F�8�:Ӯ6Y]����������L�6j�U�v��z�-˹]٣G��4�i
�w�6���L���OY?�W��Oݤ_�J�٧�7�����/�k�cd�ʷ�+-+��ck�+��^�y��rp�m�T�)���T����NSTz|��J�'s�G�y���Q��NF�g���}{�iZb)lKC�g�m���>��c��P�mYE�������.�~��J��P����Ŗ芮�G���g�G�s��	���<�|�4��wľ���{�[PO�
�Q|O��RK�����liBQ`�0��R\n{�xf�',3b5����h�>;��\#>.��3��S�˕=�G�p�X�a�7P���]1�z�w�dn{�Tǣ����;�
�
�SL!�9��8^)�~�J��M���k5�S]���&NcO	��J1+
�5���g��A9�U̩'T�نs���;�g;0L���̿o�����$��E!�-�`�_��{��4|����w��s�Ѱ·�~�	֍?����ϡ�)>��,œj��h�,���Jg|^i�]T1l�5o�9�mc
���ŋ�|���kF�3r�
����R/~�hS{?��x^������#�1��+�s���O�!��7�K5Bã�xLU�v��5���`���ю
�C�d���L��L;w�s�<�Hfn�aC�Q
"�,��)d���u�=��D�ak��Q���X�c�/���r����X�a_�����a�8�!4�
a<�8��d�\���!�nʒH�����̬3ұJ��1��v���q4·&�!�:����坨�)�	{K�g�mh|�HD,����vCx�(l�|a�/~��i�*/Ϟ�h�S	O��P��/�DL�c��o���:M&1.Ӯ��T�(m����ДݷMfl���Ƙ�nli
��1��L?^�w�'�q6���l�w�'�W��>7�����7�v�%�R
�b��� v)��:î�����e�?�	̸(0�"f��eR�9�Ue����b�sZs���DZ=�AkΉA[�b��y$�+ft����b��Ġ-�xű쮸�}nor1��ދ4"��`�F�7o^˫��&%��f=G�i��.'~u��{J��$��D�hxw�Y��-����=
����'�m?����+)=Vڙ�R��q��@=Djh����F�ר�D
��$��0f��
f,8
*�<��v�̕#��=&U�EgM�W��:�D���R�wJ���hIK��H�C�T�X�w�J�dV�@� ]SPeF�L!�i�zj_JU���g�0)��l�X�{�q�2%c�)܏�M؟�%���?NȾ1=$��Uy�X���X��-���9F�m���}��G�5�<�k���G(��7��
�M�k��-9��5�I��6L���a��t%�2�0%u���l@1Ʀ	��X5!��	�V�l�F��HuW��>ӏ煐n�	!�gu?��Pwō�s�x��vJ=�:I�'|Xc	��W�J(I��'P�a�[N[���d.��=1Hٸ06>q&��u���O�sc�W���C��J1�2����Ʀ%ƣ�H(��*S�����4Ʉ`��.�:x � 6+�l��`� R"r��k�uJdu�%ci��Ho�Ա�t�3$қ���\۵%�PJ�? �u%��Y��jb�8%]�Y�D���Dz�B�x8Z��͛bo�ԁ��JJ��;��)���Q;����N�Kn�i��o�$x�#��G�:�DG�K��D��z�R�R�BZ���C(=�x�B�����l`bс�K����K��f'�����ޛ]��\OJqN)�aJL)α��M3�CJq��g��o��~:���v����9�.믘�}�o�]�~:���֏w����F��a����ڧUvd��F+�S�İ伳X{�d'6U�F6�l���%;Vdx1�����4�k�mz�|���bF��~<���5����cF�7�;��
�M��w��,��C	��"ӞR���͠d��u��o[p���Od\�L�FYe<I�E����7�(p�xJ|�t�;3�\?��[oF�쯘�}��K�s��o�x'f��f��Q1�	e�0�����dV�;�&J�ξ��Ғ~?�c�#�����0:���=r��VE��\]��~�6�p4�4d�0�"�R|�h�3fp������q�9!��;
��"��Ce��<�յ����N�s�s��J�d��ld����P���'[l��+D�8Z-aѽ��=ӆ�rO-8�("�q��XE�0�%��i��$Yr�E{����ej����A0ώ׊��'۴���2��ފ���_��������HA�̖�hG�
5�&7t1��wZ�zO@��.1��c\�9�33P��)*%�V�ܶx=Li"\	;Zq�!Y�:Q$kՅ��z��x��n�Kkԕ*�p�
"�qkPvk0�d�2���N���iķ���)����1���$�� *���s�E��f�p��:�W�4�Z�p�^��>q��f�w�/!x�a�jD����ڬ�V�\W�Q�Np�&zΚ)6��	�������%�X���v'�a��.��4G�]^۫�Ԉ�d�����i���D���ɋ�i���d!���(`E
�S05��d���0�	�<Z�;���l>�%�Clk�T63�j��U�˥�C�-M��z�D8�8Z�=�B1uK/e�i�*�A�_�C��d��=/i�B{��B؏�W�=<�9�<"Sۮ��
���a�����|�sD�����@t����x���M�E���h��D��<�=8��R�i���X
Y�e=3�G������b5�����Z��8�mw�u�xkd=I҄��0>t&Qg��%hG[��{�|�J��?M�-�N���rs�Ө�M��ȾZ2�_D�Mh�VM1�'&1X����{�e뙊�~Y4���p�q1���l���7�
Y�-07l�0�3eO��=?z`�����pNe+�&~jsK��e�zu��H���$|?�Q7�\S�e�R6��e�D�[`w?X@b0~��9.W7�`٬M٦DK)>s�M4�� ���yͮ���,���5b�p¨�!:FP�.ք������I�{Sp��)pS{��u��|kY�1�@ٜs�$u�U��������&�Z@c�h�jA�{�h��0o�;)�e���'�-b�2�#��E#���/���~I*:gAP�T�]��t�mA�==P9��K��Pxw�zp)�K]z�f��uD{2��T�}�+�	C��~.�P�M������R�C�q�{b�K�L�����`���h�
�>A��ݡ�'�*2�*���K6�R��H&�(T9VP�1�e_� !LX_�l.C�'��OW?�2hiLЖI|`����Zp�<�!��U�uHgL!�DJ��FHe�Dʞ{��%�����e�#tsʏ 
Hf\�E�W�[p˄%�y����C6%���~��@���jx�=p�O`�5�ҿ��0>O�r����lS�/
ܣj��d�s�=�Ze�rmp�=%�G���K��LJ"��Aհ����y��~�`рl����d�쌚|�nRluE�23N�Y����sƸ�rB��+3ZٜY��jFs���Q5�9�'K6�K������qn�\��ŝr�RUc.��JL�A&�ɸ�M�q�1u2���x=Tg5�
��y�@L���ك�Tp��)��0�?��*�P+
50�UYY�)Q�n(��2��F
��s��3����>T�X��H�e�
�@D%*�π�ek��j�8��L�,�Ra,�{�Ehk���u+�Eh[����"t�G+;c�iBUu�]�qY�y��������*+(�w��dmelj�륱RyY�x�?I�Y�fl��r��'�ɟ��<�]d�?�W����y��@��m7���@���u��'�M�gpZy�	�
�?�P�8�X��>&������͛�����������y��}����S#��t�Q����/OGKX-yu'qzO��9q�uQfz]j�W�'��q��PR��8.��g�Qp�
�5~���q�#�F0��v���BLj���ui���#��u� �<Ǫ<L�Lj�x���B��$eG�}S~R��1~s�Q`����]��g�F��A\����2�|&�Ō�JL`��tL�
�c�f��I���!�Ʌ���*��h�B6�?�5�r������9S�N1�_89�-�G;2Z���ឪ���LQ��\�S{b�Q�]�u���T�T�I5,�T�J����N�z(��_�����2�'Y-�WF����6�kO��C����T�}�T���V���M�}�3c���7��ucKS�o��g��k?u���订��k�w������~޼�f�l���U�m-w�c�UG+0�,?�
�i*v�2{@(��y���.���DTIej��Տ�"����s�T��T1,���i{̘ژv���D:����y��נ�;���C�a��l��
endstream
endobj
31 0 obj
4897
endobj
35 0 obj
[3 /XYZ 33  
765.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 14.4 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��[mk�8��_��u�jIP
M��AI�>��d�X�e�����?9gc'��L��^wj'�F�g4�������MLf�/bI�ټ��w��'�g�_�Pҽ�нX��ⱸ-n��Ǣm���|(&M_E��|�{��Gh�k��I��W��%�����+_�M+�>~�����*�����~�c����e�Rk��jl�|>3��Rz]=���-C���hU}�.�W֧�(c�&j�ixO�0��F|}W��=v�a��a�:7:�Lsg��xW	S57��ߦ?��.��H��I���3M{�s��l]-I���NOI�;z�m�c1}�c���:]��J(-�E�γ沸/lHތ����<���B,>U�5u��O5����2Va;k�Q�DV�#�:�qʭ��QkZ�$��}ܚ6+�++�Bg<J�N�0�=�s6$�$��=�A�d�Z���>�X0m[���ܬ$׋Y�	��*6�
h�k/Tj��虦=
�v��uԞ�J-�=߶w�Pq����H��'���i±TU���N�X<�����i�j86���e����
+��=J۟guI�m�h����Zs$1Dt��Op�.����}�~h�w-�
�M]�E��w
�-c�"–�t��6C�@V�'~2�r� ����r���ϋw�~���BL�f�o���	�����f�s�i�9�E�/��3�h�69l�B�-%9~Hk�$��A�Ϸ�%���I�x<ж��8�C�Hە�9�'|Ɯ�<��H1尚���o����:��	ýÊ���4u,P��:r��������kF�Lɣ�2o�9�5JX8��o<ی�o��0w�5;j��V��-7q}�a�q�����U�'7�+�wr��^�t}ﵳ1A��o�qi{����"�� �LSZ�����T� ق��dž[-��
J<l-@�5�(�����l5��V(���H�Q���&��Xpu.��AI����X.�D+[K�h{A�y�4��T���8�7=����T���l�p5R�XX�Dl5&[��a	
��g�8&[X��=�$�A�2�A9[Ƒ�>/�U�F�=�l}8��l�q���kΜ���x��yo��Z�)�`Te���/m�(�%N���b(c�S|=Y
[�WN!��a�a�i�:��x‘|�����̄���.Y��3?��>r��b$�f�8�9ebNfb�-�Xqkx�F-��r=^�Y3�U74�}��GʚG{����ɚo��9��L��É�qW
�	���Ki�������i�G?X��8��3��N������돶*��)#�<��������aX�*N�{<��-2��sh�Q�aU?�T/�T2���F��a���F����g�.����13�ގS������ [�'�Y�����B֬�^:�� ��F�_�U�o��u��|˾V���-W��h�#�D���D��~3���
[�Gj�8�18��<���Lk�o�6��L?��K��]bT[^����'_0��ls��K��[��Y{XE�얞�]�^u�����H��Ȍ��d��}����jz�
endstream
endobj
51 0 obj
1581
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+Ȍ�`�P`&�7�)ry" �9ܠ� ry+(*�&��&Fr�I0�$���[s=�xd�M6	0��g0׾���ꪯ���5B�
�L8B����j�=���bI��_�y=�����Н����q!l!���';Ư������삲*���`�B`l�1-���#d~&��UE$�,�v#�U����7�	Bh;��`:Rp����$��V,�-BGb�j���!K�������eD$$S�A�e�x?�4�C��Hm�9"'���B�j��S{5�A�M3ϥ����a����F9QG�5��S��rs���R�*Z9�%M1�_��$���Wq
{��Q�87���K��0Q.�LպA��t�'�蝝���>��y?p��rqQ�r����j���G�J�����J��˴HF���t4x�o��v�\�j��b��͍s�Kv�����}{\,�'�4��Sm��MAA;��Vo���m�����3�((D���'�.�J��^�Q�Y�˱
���˰�3Q�޸* ���5k�z�f����6�~�R��]�}��ȲF�uS��F7�� U
R�)u��Ͽ�c�}��q�C�O}��2��_b��LY9ik�=��W���h:�ցCq�[�x::��ip���V=��m���@��Z��)&���p�
�>�r���ө�͐��O��A����.I�C��dg����i�D���Q�Т�5(	�c^UR�w�h�m*�����x~I™��aT�s��=52b~������Y�%���,\'	���y2�� C.���
(����*����z�����<����zy�Yï\ޒ�]�$~X��Sl�&ž]�O=�ych0���b���4�>m���Ҹ=�GG2u�_8������
��g��_<r�9%���7ȝ+�Dv��4ȡ���	�P���*�����R�t�)lk�9��
[6}s�Ͽ(- z��7-��7/GpZ��->	����W��HNJH�O]pLTĬ�����8~�r�������Ӌq�9��~�-���e�B��ՙ�%�J�ʊ/Mݶ�K/TT� *��'6�(�ˁ�Z�=Hʚu�,7eew�wsr�^@�q��!�-@�,����<��t�[�w�3�Of�05�a���Y�L�{A画�-t�3���kȽ��"C�#e��	����B�5�shk�y�;�����[�}7�K�1�v���*�-�ta@#Q�$u�����;�	�i����s����E�1g�
@5E��c7��
N���7��7�aD�w�M[n�ݱ^Z��c�@85<��k���͟s���:���e�:���d���(%���z�r栱
�o�me�Ĝɀ�Q0��l���N�b�se%��f���[�fN(-?_��a�5�!A%ً�KČi.SfL���ٺz���}zf��5ST3f��Oܓ�`��ؔ$�Gf�`��C	���e�����S��7����h�Qy��j�Fx}CϳM�Qh&����fU�A���P\t!�R��C�.����:���g�C�����R��=0i�/�f�7��96Ԓ��|�8���g
�:Gc0���:���l�ε�!��j�C����_�!Ӻ���@lx�e�@L秅���榦ܬ�C�,���*���М��Q�us�L�O��{�ȎTo��q2_�}��3��-�Ȫpu��Ip)�y�f4��xk-i�O�x�8�e	��&7��Ouv@И��g0�T���� 6�gҁR�y��^��@��7�lc;r�&
��Y7s��R p���Wh�:l�<y��ox`����Bqp�9u��zl�Ĉ�fzt'HrS��{�,6\�75X���/���Ū��C�,k2�&� Β�Y^�I9DL���-9Ē�-�	�Aa�O��⋗�L]�E���	ډ�ا�c�-Y����!�`�^q�?����C�򲑃��܀́�Z���8�\��ҁ��O&%u/\0��{%��m�ɝƧ��ص�z����N@����{�y
�i��J����t��K�4L�Yf�)�e/_2�vU�\+/*�K�8�a�PV�|DĶ����Eb�5��h��um�z��\n܋Ѹ9i�:��s�w�^*e�>�M��8Z���U�8`XG
9}�M���-v���q��q;����|I8�ֿ���28����6:���;��>$i�y��:��yj_��"=nNN�w��,~��#b���bRӱ�r���<�ďCk[��;�b㫑[F'�#��caP�5��%�����f�6GF��n���}q=�h+���X�r��:7��{�{�
������*��l��H��F8-ԞY(3R{{��I�o!m�����.q��o�~��r3p����¹vH�R�V�W��`@;�?|I�ʸ�	�Z��i���an搋�=7��ws�,�g[�C�E����
w��Do�q{��e:�x�S��zE�Ͽ�3��Xc��Ajd�a��^�/�g?6ԇE�B�s!hw$�Ò�v�Ce~V8UT�NSz���m,�&<�f[h��4W��/q�H�`��i��\ø�ܔ��lQo�0I��ѰȲ����AK����	�	����[{N�7�F��5ԟ�i�z���?���A^��73��]�u���ĸ��Wr�?�,!>���w(������w삦ъ�d��9���
{�'��pn��_�&�S��{T��j��j��C��Q��Ć(8K�e�?������2w6]��NP�~s|�3T��x����]��[fa ��_h.^��\��u��,�o��!����Z��r"�s
ӡ��.8�Ҟ�K�钘��_�>p�fK�©���C�'�w���x&�47�$����1)� �.A�X�eV5<@�Q$!��H��$ǣ�?��o�,_��b|����1q�Lv��gs��ں���kSo�]I��s�<U\�矑��.*�-0��7_��7?6��tn�?����>2j���ܹR̟����2�����Ar@�\��;M�_�i.�]����P*��{�c}�F�I��a�S�r_��F��GLs@��t�,�L��Y	��e��Ξr-�
��VUmqۓ�l������%�^}��+d}�#~� ֈ_v���@<��
HqҨm�1����-M������_��N{09���Y�1����y~4��W�:V\��Oࡺz���K�û�z�
R���nc�C��

���?�;������@�|��@��k�M�/�Q
U2m@�Z����������{<�?����v�ֱ��1F���L]���2�)
�~*��w?�׉�22�\	��\s3�ف���ѠF�1�p���a4�bW�IH~%�~c~vVn�k���6|��
v=va!�[�Ö�ԯ��w�K@��O>�Ry�/�,X�b���+���4\��k~A�b��G�$���߁|T>SG���z��@CKmd�Ⱥ�Pl��[����V-^�i�[W6m鍈ظ����{[8/(�EO��^LY�r����1k�g�� $�nS`���d�͟��z+jU�h'����b.��r�zDox�XD�Gr8�'8�;0���koG��y5A��G`�_-�A�5�^�K�������~I��\���a`���Po�,���}F�nS�����1Q
O,[q�aIuٿoK�����mz1�v@n�,
-�킁D\����x���˽/��&`�6���G]��W
��5 �Y�ꖳ�{�5�ؑ�A�kX���.޴��k7â�%k
�Be��}�����O'�au��a ~S�8�ޅ�s���+^,*����k��$&���k����H���P\�
*-


(*	F���yi�C�<�,'&Noga[±Z]��1����3��19��;.������-{�t�)�'Xt�p��qw�s�����]�0/�\��uN���c�s��J���l����G���d���ؗ\~	q4��~�*`��w-eI��Ҙ��a�.�>"l��U[�]�t۶�G����u����/!��ի�ڒV�&�FF�F)�;�S�NB��Q_d���;W���4�.�q�����*��o�����K"A�L샩5Q�!;�/����ˌ��1u՚M��b�]� $h=Ƞc����G}��R:��eŌ��'�Wԥ�}�0R��Y���4��F�_�f��ZO1��]3�m���z0Ƃ�	T��x	9q{���0��0�=�*��7��� F�
��qęat;�T��b�?�����s�ϛ���<Y?��s2�7&^���4�8�yp����P��m��'?<�G�����1CvO�<S�����E����8�PvO���+�k%�����"��\�*�I%��r�!��<�C(�h�ů$|I��a�FҍEO'�]��U$Y(%�Kē�ƶY-�H=Bl�[D��3z�52�)�X�%�!]��8#�$�N��82�{�8��=r���1�I�lߏ'6^X��.��#d}�l������$
�x��Fҁe
�D��Ä��d:�Kƾ(,EXJ���C���+I&J�Dw�F�z��Ë$���,��x�O�D:�.��t#�;�rq\%w�����Z^�g�����`/L��B���p_��"d�&�Q��Z./���$����M�M��36l�ٺ��l�m���4f՘�1c��<6�IKd�#i�/;r�A��b�3�wZ���s�:��oX�<�oY�����u����d�
g�^@�HX?��)�z�Z�Ek��5k] n䶵.#N���Ǔx��IYGJH�"٤��P��o	��F��'�
#�$����"���w�Y�R+�H���8��֕�de���<<=U!FcV~�*�0m�jQ~�*�}*U�f�f�Td��X\o-�2,$ָ�X��H.��㒩H��fd�秖����Cg��V)�k�M�-��
��?�0���c��k�����x6�����x�p��EJ�-b����8�K~��'f��|d'
{
%��bO$�8�!‰ç�Ħ-++�3���rvjQjZv�lcI֜�����Ҍ�9�aA�qA�^�q��G+�
endstream
endobj
58 0 obj
5244
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 270 745 469 564 611 548 682 866 647 707 651 589 880 339 345 492 240 503 557 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> <0034> <002E> <0055> <0073> <0047> <0054> <0068> <0063> <006D> <0074> <0076> <006C> <0070> <0066> <0067> <0050> <0048> <002C> <0032> <0049> <0077> <0079> <0045> <0052> <0046> <004F> <004D> <0041> <004E> <0044> <0053> <0057> <0028> <0029> <0078> <003A> <006B> <0035> <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 
0000038255 00000 n 
0000000187 00000 n 
0000000282 00000 n 
0000000756 00000 n 
0000029337 00000 n 
0000038121 00000 n 
0000000319 00000 n 
0000000362 00000 n 
0000000405 00000 n 
0000000449 00000 n 
0000000493 00000 n 
0000000530 00000 n 
0000000574 00000 n 
0000001080 00000 n 
0000007535 00000 n 
0000000877 00000 n 
0000001053 00000 n 
0000007863 00000 n 
0000007556 00000 n 
0000007600 00000 n 
0000007644 00000 n 
0000007688 00000 n 
0000008188 00000 n 
0000012626 00000 n 
0000007985 00000 n 
0000008161 00000 n 
0000012691 00000 n 
0000012647 00000 n 
0000013009 00000 n 
0000017982 00000 n 
0000012813 00000 n 
0000012989 00000 n 
0000020361 00000 n 
0000018003 00000 n 
0000018047 00000 n 
0000020194 00000 n 
0000020020 00000 n 
0000018298 00000 n 
0000018452 00000 n 
0000018591 00000 n 
0000018987 00000 n 
0000019859 00000 n 
0000018784 00000 n 
0000019263 00000 n 
0000019391 00000 n 
0000019554 00000 n 
0000019723 00000 n 
0000020257 00000 n 
0000020679 00000 n 
0000022336 00000 n 
0000020483 00000 n 
0000020659 00000 n 
0000022357 00000 n 
0000022621 00000 n 
0000027977 00000 n 
0000028459 00000 n 
0000027956 00000 n 
0000029477 00000 n 
0000029735 00000 n 
0000037122 00000 n 
0000037327 00000 n 
0000037101 00000 n 
trailer
<<
/Size 64
/Info 1 0 R
/Root 49 0 R
>>
startxref
38374
%%EOF
PKB![&�**(doc/alt-php70-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 possibPKB![&�**(doc/alt-php70-ioncube-loader/LICENSE.txtnu�[���ations 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
PKB![�_Y@����.doc/alt-php70-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.73";
}

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) {
                    brePKB![�_Y@����.doc/alt-php70-ioncube-loader/loader-wizard.phpnu�[���= $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 (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 = @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 = @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);
}
PKB![P�$���'doc/alt-php70-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-2025 ionCube Ltd.           Last revised January 2025
PKB![$�u���%doc/alt-php70-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 raisPKB![P�$���'doc/alt-php70-ioncube-loader/README.txtnu�[��� 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)

PKB![�E#/&&+doc/alt-php70-snuffleupagus/CONTRIBUTING.mdnu�[���## Contributing

First off, thank you for considering contributing to snuffleupagus.

### 1. Where do I go from here?

If you've nPKB![$�u���%doc/alt-php70-snuffleupagus/README.mdnu�[���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*
PKB![�0,�%%doc/alt-php70-suhosin/CREDITSnu�[���suhosin7
Stefan Esser
Ben Fuhrmannek
PK4D![tjB�E�Elicenses/ea-libargon2/LICENSEnu�[���Argon2 reference source code package - reference C implementations

Copyright 2015
Daniel Dinu, Dmitry Khovratovich, Jean-Philippe Aumasson, and Samuel Neves

You may use this work under the terms of a Creative Commons CC0 1.0 
License/Waiver or the Apache Public License 2.0, at your option. The terms of
these licenses can be found at:

- CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0
- Apache 2.0        : http://www.apache.org/licenses/LICENSE-2.0

The terms of the licenses are reproduced below.

--------------------------------------------------------------------------------

Creative Commons Legal Code

CC0 1.0 Universal

    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
    LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
    ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
    INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
  PKB![�E#/&&+doc/alt-php70-snuffleupagus/CONTRIBUTING.mdnu�[���D DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
    THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
    HEREUNDER.

Statement of Purpose

The laws of most jurisdictions throughout the world automatically confer
exclusive Copyright and Related Rights (defined below) upon the creator
and subsequent owner(s) (each and all, an "owner") of an original work of
authorship and/or a database (each, a "Work").

Certain owners wish to permanently relinquish those rights to a Work for
the purpose of contributing to a commons of creative, cultural and
scientific works ("Commons") that the public can reliably and without fear
of later claims of infringement build upon, modify, incorporate in other
works, reuse and redistribute as freely as possible in any form whatsoever
and for any purposes, including without limitation commercial purposes.
These owners may contribute to the Commons to promote the ideal of a free
culture and the further production of creative, cultural and scientific
works, or to gain reputation or greater distribution for their Work in
part through the use and efforts of others.

For these and/or other purposes and motivations, and without any
expectation of additional consideration or compensation, the person
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
is an owner of Copyright and Related Rights in the Work, voluntarily
elects to apply CC0 to the Work and publicly distribute the Work under its
terms, with knowledge of his or her Copyright and Related Rights in the
Work and the meaning and intended legal effect of CC0 on those rights.

1. Copyright and Related Rights. A Work made available under CC0 may be
protected by copyright and related or neighboring rights ("Copyright and
Related Rights"). Copyright and Related Rights include, but are not
limited to, the following:

  i. the right to reproduce, adapt, distribute, perform, display,
     communicate, and translate a Work;
 ii. moral rights retained by the original author(s) and/or performer(s);
iii. publicity and privacy rights pertaining to a person's image or
     likeness depicted in a Work;
 iv. rights protecting against unfair competition in regards to a Work,
     subject to the limitations in paragraph 4(a), below;
  v. rights protecting the extraction, dissemination, use and reuse of data
     in a Work;
 vi. database rights (such as those arising under Directive 96/9/EC of the
     European Parliament and of the Council of 11 March 1996 on the legal
     protection of databases, and under any national implementation
     thereof, including any amended or successor version of such
     directive); and
vii. other similar, equivalent or corresponding rights throughout the
     world based on applicable law or treaty, and any national
     implementations thereof.

2. Waiver. To the greatest extent permitted by, but not in contravention
of, applicable law, Affirmer hereby overtly, fully, permanently,
irrevocably and unconditionally waives, abandons, and surrenders all of
Affirmer's Copyright and Related Rights and associated claims and causes
of action, whether now known or unknown (including existing as well as
future claims and causes of action), in the Work (i) in all territories
worldwide, (ii) for the maximum duration provided by applicable law or
treaty (including future time extensions), (iii) in any current or future
medium and for any number of copies, and (iv) for any purpose whatsoever,
including without limitation commercial, advertising or promotional
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
member of the public at large and to the detriment of Affirmer's heirs and
successors, fully intending that such Waiver shall not be subject to
revocation, rescission, cancellation, termination, or any other legal or
equitable action to disrupt the quiet enjoyment of the Work by the public
as contemplated by Affirmer's express Statement of Purpose.

3. Public License Fallback. Should any part of the Waiver for any reason
be judged legally invalid or ineffective under applicable law, then the
Waiver shall be preserved to the maximum extent permitted taking into
account Affirmer's express Statement of Purpose. In addition, to the
extent the Waiver is so judged Affirmer hereby grants to each affected
person a royalty-free, non transferable, non sublicensable, non exclusive,
irrevocable and unconditional license to exercise Affirmer's Copyright and
Related Rights in the Work (i) in all territories worldwide, (ii) for the
maximum duration provided by applicable law or treaty (including future
time extensions), (iii) in any current or future medium and for any number
of copies, and (iv) for any purpose whatsoever, including without
limitation commercial, advertising or promotional purposes (the
"License"). The License shall be deemed effective as of the date CC0 was
applied by Affirmer to the Work. Should any part of the License for any
reason be judged legally invalid or ineffective under applicable law, such
partial invalidity or ineffectiveness shall not invalidate the remainder
of the License, and in such case Affirmer hereby affirms that he or she
will not (i) exercise any of his or her remaining Copyright and Related
Rights in the Work or (ii) assert any associated claims and causes of
action with respect to the Work, in either case contrary to Affirmer's
express Statement of Purpose.

4. Limitations and Disclaimers.

 a. No trademark or patent rights held by Affirmer are waived, abandoned,
    surrendered, licensed or otherwise affected by this document.
 b. Affirmer offers the Work as-is and makes no representations or
PKB![�0,�%%doc/alt-php70-suhosin/CREDITSnu�[���ry or otherwise, including without liPK4D![tjB�E�Elicenses/ea-libargon2/LICENSEnu�[���urpose, non
    infringement, or the absence of latent or other defects, accuracy, or
    the present or absence of errors, whether or not discoverable, all to
    the greatest extent permissible under applicable law.
 c. Affirmer disclaims responsibility for clearing rights of other persons
    that may apply to the Work or any use thereof, including without
    limitation any person's Copyright and Related Rights in the Work.
    Further, Affirmer disclaims responsibility for obtaining any necessary
    consents, permissions or other rights required for any use of the
    Work.
 d. Affirmer understands and acknowledges that Creative Commons is not a
    party to this document and has no duty or obligation with respect to
    this CC0 or use of the Work.

--------------------------------------------------------------------------------

                                 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+<$[�A���man/man5/FontDatabase.5nu�[���.TH FONTDATABASE 5
.SH NAME
FontDataBase \- database of fonts accessible to t1lib.
.SH DESCRIPTION
This manual page has been written for the Debian GNU/Linux
distribution.  It has been adapted from the documentation included in
the upstream
.B t1lib
distribution.
.PP
.B /etc/t1lib/FontDataBase
is a text file which contains, minimally, the basenames of Type 1 font 
files to be made accessible to the
.B t1lib
font rasterizer library.  The format is intentionally similar to that
of the
.B fonts.dir
and
.B fonts.scale
files used by X11.
.PP
Line 1 of this file contains a positive integer specifying the number
of fonts declared in that file. This is as in the
.B fonts.dir
files of the X11 system.
.PP
All remaining lines contain declarations of one font each. The only
thing taken from such a line is the last string (delimited by white
space) in it. It is assumed to be a filename of the format
\fIbasename\fR.\fIsomeextension\fR.
.PP
The \fIbasename\fR part is assumed to be the
.BR basename (1)
of a fontfile.  After the a string has been parsed, the
.I extension
is cut off and replaced in turn with
.I .pfa
and
.I .pfb.
The initialization routine tries to open a font file in
its search path with one of the resulting filenames.
.PP
The remainder of the line, i.e., from beginning to the start of the
filename string, is completely ignored and thus may contain
information for other programs.
.SH EXAMPLES
Here is a minimal font database file for 4 fonts:
.sp
.nf
4
isvl.afm
isvli.afm
isvd.afm
isvdi.afm
.fi
.PP
This file is \fIminimal\fR, because it contains just the information
needed, and nothing not needed by the library. 
.PP
Here is a more realistic example, which allows an application to match
a fully qualified X11 fontname to a FontID in
.B t1lib.
This is also a valid font database file:
.sp
.nf
4
Souvenir Souvenir-Light       --- -itc-souvenir-light-r-normal--#-0-0-0-p-0-iso8859-1 isvl.afm
Souvenir Souvenir-LightItalic -*- -itc-souvenir-light-i-normal--#-0-0-0-p-0-iso8859-1 isvli.afm
          Souvenir-Demi       *-- -itc-souvenir-demi-r-normal--#-0-0-0-p-0-iso8859-1 isvd.afm
          Souvenir-DemiItalic **- -itc-souvenir-demi-i-normal--#-0-0-0-p-0-iso8859-1 isvdi.afm
.fi
.PP
.SH FILES
.I /etc/t1lib/FontDataBase
.SH "SEE ALSO"
.BR mkfontdir (1x)

PK+<$[|v���man/man8/t1libconfig.8nu�[���.TH T1LIBCONFIG 8
.SH NAME
.B t1libconfig
\- create the t1lib.config and FontDataBase files for t1lib
.SH SYNOPSIS
.B t1libconfig
[
.BR \-v\fP, \fB\-\-version
]
[
.BR \-h\fP, \fB\-\-help
]
.B \-\-force
]
[
.B fontdirectory...
]
.SH DESCRIPTION
.B t1libconfig
scans a list of directories for Type 1 fonts and font metric files,
and generates a configuration file and font database file for the
.B t1lib
rasterizer library accordingly.  By default, it looks in all
subdirectories of /usr/X11R6/lib/X11/fonts, and in
/usr/lib/ghostscript.  Extra directories to search may be specified on 
the command line.  The
.B t1libconfig
script tries not to scan the same directory twice (this is, however,
not foolproof, since /usr/X11R6/lib/X11/fonts and /usr/lib/X11/fonts
typically point to the same directory on GNU/Linux systems).
.SH OPTIONS
.TP
.BR \-v\fP, \fB\-\-version
Print the version of
.B t1libconfig
and exit.
.TP
.BR \-h\fP, \fB\-\-help
Print help about usage and exit.
.TP
.B \-\-force
Force the generation of new configuration files even if these files
already exist on the system.
.SH FILES
.TP 25
.B /etc/t1lib/t1lib.config
Contains configuration information for t1lib, including
colon-separated lists of paths to Type 1 font files and font metrics
files, and the location of the default font database file
.TP 25
.B /etc/t1lib/FontDataBase
Contains a list of the names of Type 1 font files to be used by t1lib.
.SH AUTHOR
David Huggins-Daines <dhd@debian.org>
.SH SEE ALSO
.BR FontDataBase (5)

PK+<$[��t1lib/t1lib.confignu�[���t1lib.config - global configuration file for t1lib.
It was created automatically on Sun Mar  3 19:12:29 UTC 2024
by the t1libconfig script.

Run /usr/sbin/t1libconfig --force to rebuild it.
    
ENCODING=.
AFM=
TYPE1=
FONTDATABASE=/opt/alt/t1lib/usr/share/t1lib/FontDatabase
PK+<$[iJs�>F>Fdoc/alt-t1lib/LICENSEnu�[���		    GNU GENERAL PUBLIC LICENSE
		       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
                          675 Mass Ave, Cambridge, MA 02139, 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 Library 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 PK+<$[�A���man/man5/FontDatabase.5nu�[���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 dPK+<$[|v���man/man8/t1libconfig.8nu�[��� 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 noPK+<$[��t1lib/t1lib.confignu�[���s 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 oPK+<$[iJs�>F>Fdoc/alt-t1lib/LICENSEnu�[���ot 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

	Appendix: 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) 19yy  <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., 675 Mass Ave, Cambridge, MA 02139, 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) 19yy 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 Library General
Public License instead of this License.
PK+<$[�C�6b6bdoc/alt-t1lib/Changesnu�[���Nov 1996: t1lib-0.1-alpha
-------------------------

- first public release of t1lib with all basic functionality



May 1997: t1lib-0.2-beta
-------------------------


- Now uses autoconf to configure the software for the system.


- All functions put into one library.


- ATTENTION: Argument order for the glyph-setting functions changed to be 
             consistent with the info functions. Programs that already use
	     t1lib have to be rewritten  (sorry....)


- Function for computing the width of a string added (T1_GetStringWidth()).


- Function for computing the BoundingBox of a string added
  (T1_GetStringBBox()).


- Function T1_GetMetricsInfo() added. It returns a struct containing width,
  bounding box, number of characters and horizontal position of the characters
  in character space coordinates (afm-units).  


- Function T1_GetBBox() renamed to T1_GetCharBBox() for consistency reasons. 


- All exit() calls removed from library and replaced by appropriate error
  return codes.


- t1lib now optionally supports a logfile for logging of error- and 
  warning-messages at runtime. The "verbosity" of this logfile may be chosen
  by the user.


- Documentation more complete.



July 1997: t1lib-0.3-beta
-------------------------


- Code for placing character bitmaps in T1_SetString() slightly advanced; the 
  restrictions concerning slanted fonts are eliminated.


- T1_GetStringBBox()/T1_GetCharBBox() extended. It is now possible to get the
  bounding box if the font is slanted. This is implemented by examining the 
  characters outline at 1000bp. 
 

- Some Bugs in the code managing linked lists of font sizes have been
  corrected. 


- Bug in T1_CopyFont() has been corrected. This should work now.


- The behavior during configuration file searching has been changed to
  be compatible to well known UNIX-conventions.


- As the main new feature in this release t1lib now has direct support
  for X11 (optionally). There is a set of functions that act similar
  to XDrawText(), i.e. they draw directly into a drawable (pixmap or
  window). 

    - Caching of bitmaps of the X11 rastering functions is also done
      in the X-Server for maximum performance (although it is not as
      fast as I dreamed of, admittedly).
      
    - X11 rastering functions use the current foreground/background
      colors

    - The X11 rastering functions implement automatical antialiasing
      between foreground and background color
 
    - The X11 rastering functions provide an opaque and a transparent
      mode

    - The X11 rastering functions can draw into drawable of any depth 
      (provided the depth is large enough)


- A new target has been added to the makefiles allowing to remove 
  a t1lib-installation automatically from a system.



December 1997: t1lib-0.4-beta
-----------------------------


- Many memory allocation bugs fixed. t1lib is now "libefence-proved".


- Kerning and Metrics-Lookup rewritten. The corresponding functions are now
  based on character indices rather than on character names which makes them
  up to 8 x faster than before, depeding on data and context.


- Raph Levien (raph@acm.org) contributed a fast algorithm for subsampling
  which improves Antialiasing time significantly.


- Fred L. Drake, Jr. (fdrake@acm.org) contributed a Python-interface
  to t1lib.  This allows Python programmers to make use of Adobe Type
  1 fonts. This package, called t1python, is distributed with t1lib in
  an independent subdirectory of the distribution. See README.t1python
  for more information on t1python.


- Bitmaps and antialiased bitmaps may now be padded 8, 16 or 32 bits. This
  allows (with some restrictions) somewhat faster concatenation of
  characterbitmaps to stringbitmaps. The padding-value may be set and queried
  at runtime.


- The optional X11-interface, introduced in t1lib-0.3-beta, has been reduced
  to a simple wrapper. X11-pixmap caching has been completely dropped since it
  has proven to be too inefficient. However, at the level of the function
  calls, nothing has changed. 


- Configuration of t1lib (with or without X11-interface) may be queried by
  applicationprogrammers at compiletime or by applications at runtime. 


- Two functions for informations on fonts have been added:
  
  1) T1_GetFontBBox(): Return a fonts' bounding box.

  2) T1_GetAllCharNames(): Return a list of all character defined in a Type 1
			   font. This might be of interest if somebody wants
			   to set up new encodings.


- Function T1_CloseLib() added. This function allows to completely free the
  data-structures of t1lib. T1_CloseLib() should be called in future when an
  application using t1lib exits. 


- Many other things not worth to be metioned ...



March 1998: t1lib-0.5-beta
--------------------------


- Changed the license to the GNU General Public Library License (LGPL)


- Definition of INFINITY removed from
  lib/type1/[regions.c|regions.h|t1imager.h]. Collided with a
  definition in math.h on OS/2.


- Implemented proper handling of environment variables CFLAGS, LDFLAGS
  and CC during build process.


- Added target 'without_doc' for people who have a very rudimentary or
  no LaTeX-System at all


- Fixed some bugs that appeared when font files from database were not
  found


- Clipmask Bug in the X11-rastering functions fixed


- Bugs in VM-reallocation (T1_LoadFont()) repeatedly fixed. It is now
  ANSI-C compliant.


- Alignment of VM changed. This was needed on some systems.


- Set of functions for accessing information from FontInfo dictionary
  is now complete. This introduces  the new functions
  T1_GetFullName(), T1_GetFamilyName(), T1_GetWeight(),
  T1_GetItalicAngle(), T1_GetIsFixedPitch(), T1_GetVersion(),
  T1_GetNotice(). 


- ATTENTION: In the above context, T1_GetPostScriptName() has been
  renamed to T1_GetFontName() for consistency reasons, sorry. 


- ATTENTION: All types "unsigned char (*)" have been changed to 
  char (*) in the API functions. This was necessary while adapting
  t1lib to ANSI-standard to make it portable. Sorry for this
  confusion. 


- New function T1_AddFont(): Fonts can now be added to the font
  database at runtime. This means especially, one can ignore a
  FontDataBase file thus can start t1lib-programs on single fontfiles
  without doing a complete setup before. 


- There is now also the possibility to ignore the currently active
  configuration file, thereby setting all search paths to the current
  working directory and having an empty font data base. This is meant
  for small applications that work on single files. 


- t1lib is now able to work with fonts without corresponding
  afm-files. AFM-information can be produced from pfa- and
  pfb-files. This, of course, refers only to character-metrics
  information. 
PK+<$[�C�6b6bdoc/alt-t1lib/Changesnu�[���  dump metrics information to a valid AFM-file.  


- New subdirectory type1afm created which contains type1afm, a program
  to extract afm files from Type 1 font files. 


- Renamed definitions MAX, MIN, ABS, TRUE and FALSE because they
  collided with system header files on some systems.


- Corrected antialiasing functions. The metrics should now be as
  correct as possible and black pixel at the right edge of the bitmaps
  should not appear any more.


- Handling of unencoded characters in strings (such as adieresis in
  AdobeStandardEncoding) is now consistent in rotated and non-rotated 
  glyphs.   


- A few functions have been added to get information on the file search 
  environment and to manipulate the search paths from within applications.


- Mixed endian setups (i.e., client and X-server on different machines
  with different endianess) should now be handled correctly.


- In summary t1lib should now be much more portable than before. 


- Update to t1python-0.3



March 1998: t1lib-0.6-beta
--------------------------


- Cleaned up the sources in type1-directory


- Functions Xalloc() and Xfree removed. x11dummy.c from list of source files
  removed.


- A few bugs fixed


- Character positioning rewritten. It does now handle strings
  correctly in which the leftmost pixels does not belong to the first
  character and the rightmost pixels do not belong to the last character.


- t1lib now substitutes .notdef for defined character names that have
  no corresponding charstring. This is a workaround for some fonts in
  the ghostscript distribution (e.g., s050000l.pfb)


- Separated the X11-wrapper from the rest of t1-stuff. t1lib now
  consists of two libraries and two include files. 


- Cleaned up configuration and compilation process.



May 1998: t1lib-0.7-beta
------------------------


- Athena libraries are explicitly located for non-standard system


- glyph-structure changed. glyph.metrics.characterWidth is replaced
  glyph.metrics.advanceX and an entry glyph.metrics.advanceY is added.


- Interpretation of the sign of glyph.metrics.descent has changed.


- String-rastering functions now support Underlining, Overlining and
  Overstriking. 


- Functions for overriding default line-parameters implemented.


- Whitespace at beginning and ending of glyphs is now correctly recorded into
  leftSideBearing and RightSideBearing.


- Function T1_ConcatGlyphs() added to API. It concatenates two glyphs of
  identical depth with an optional displacement inserted.


- xglyph output window has changed for X-rastering functions. It is now of
  constant size with the logical origin in the center. Too large glyphs are
  simply clipped.


- t1lib can be compiled and run on VMS thanks to John Hasstedt
  (John.Hasstedt@sunysb.edu). A configure.com script for building on VMS is
  included in the toplevel directory.


- T1_GetMetricsInfo() and T1_GetStringBBox() fixed. Now results are correct
  also if the leftmost pixel in a glyph doesn't belong to the first char and if
  the rightmost pixel does not belong to the last character.


- Leading and trailing white space in glyphs should now be recorded
  consistently and correctly for all rastering functions.


- xglyph can now display a character map of a font.


- Global variable T1_errno introduced. It basically works the same way
  as the errno in libc. This allows applications a unified
  error-handling. 


- Update to t1python-0.7.



November 1998: t1lib-0.8-beta
-----------------------------


- T1_GetAllCharNames() returned invalid list if the Charstrings dictionary was
  larger than the actual number of charstrings defined (which is perfectly
  valid, even if it does not make much sense) --> fixed.


- 4 x Antialiasing implemented. This can improve the quality at small sizes
  once more, at the cost of some computational and memory requirement. It is
  possible to work with 2 x and 4 x concurrently.


- Function T1_GetLibIdent() added to API.


- Function T1_SetRasterFlags() added to API. It allows to selectively enable
  or disable certain rasterizer features like, e.g.,  hinting.


- xglyph extended to support 4 x antialiasing. 


- xglyph now recognizes a few commandline options, primarily intended for
  debugging purposes.


- xglyph is now somewhat more intelligent (and faster) if slanting,
  extending or reencoding is applied to a font.


- New function T1_SetDefaultEncoding(). It allows to set a default 
  encoding vector which then is applied to all subsequently loaded fonts 
  that have StandardEncoding. 


- Bug in Type 1 rasterizer corrected which prevented fonts with non-standard
  lenIV values from being correctly decrypted (Charstring decryption).


- Internal ISOLatin1Encoding removed from rasterizer since there's no reason
  for mainting this encoding scheme internally 


- tlib now has notion of "Encoding Schemes". The format of encoding files is
  extended correspondingly and is backward compatible. 


- Memory leaks eliminated, thanks to David Huggins-Daines. 


- Some slight performance improvements.


- Kerning performance improved. Moreover, kerning pairs need no longer be 
  alphabetically sorted.


- AFM-parser modified to work with DOS-style AFM-files.


- Some bugs in scan-code of Type 1 rasterizer corrected. Scanner is now aware 
  of pfb-blocks and can scan files with multiple binary data segments.


- t1lib now uses GNU-libtool, thanks to Hirotsugo Kakugawa
  (h.kakugawa@computer.org) 


- An encoding file for IsoLatin2 charset is included thanks to Jiri
  Pavlovsky (jirap@bajt.cz).


- The angle-argument of the rastering functions has been replaced by a more
  general transformation specification. This is an incompatible change to 
  previous versions, but I think it should be worth it.


- t1lib can now handle fontfile names with arbitrary extensions and
  even without extension.


- t1lib compiles and runs under Win32 using the cygwin32 toolkit.


- Maximum number of stem-hints enlarged (-> 256) because 128 were not enough
  for complicated fonts.



May 1999: t1lib-0.9
-------------------


- Sub-Pixel positioning for Antialiasing functions enthanced (It was in fact
  not correct before.


- Multiple Master fonts are rejected instead of SIGSEGV (nearly as
  professional as supporting them ;)


- An additional set of functions allows access, filling and manipulation of
  outlines.


- Functionality for non-antialiased "bytemaps".


- "Smart Antialiasing", allows to automatically let t1lib decide what AA-level
  to use. The switchlimits are adjustable.


- An AFM-filename may explicitly be specified. This suppresses t1lib´s search
  for these files. This allows interfacing with other path search systems like
  kpathsea. This was suggested by Nicolai Langfeldt (janl@math.uio.no).


- Some problems with aspect ratios different from 1 and transformed glyphs
  fixed.


- Support for Right-To-Left typesetting. This might be experimental because I 
  don't know the rules for this exactly.


- In the context of Right-To-Left typesetting T1_ConcatGlyphs() expects one
  additional argument "mode". 
  ATTENTION: This is an incompatible change with respect to V. 0.8.


- abort()-calls in type1-sources are caught by longjmp(). t1lib does not
  any longer exit a program. Rather, errors may be handled by the user.


- If a rastering operation did not produce any black pixels, the rastering 
  fuctions do not return a NULL-glyph any longer. Rather, a glyph with the
  correct metrics and NULL-bitmap pointer is returned. This seems to come 
  closer to accepted standards.


- The t1python-package is currently not distributed with t1lib because the 
  interface is not up to date.


- A lot of bugs fixed (and a lot of others introduced, of course :)




June 1999: t1lib-0.9.1
---------------------


- Several Bug-fixes, some functions that have been reported to be missing by
  users, but no general new features.


- New functions T1_GetExtend(), T1_GetSlant() and T1_GetTransform() which give
  access to currently active values of fontlevel transformations


- New function T1_GetNoKernPairs() which gives access to the number of defined 
  kerningpairs.


- New functions to query the grayvalue settings (T1_AAGetGrayValues(),
  T1_AAHGetGrayValues() and T1_AANGetGrayValues()) 


- Arbitrary linear transformations on fontlevel including caching using
  T1_TransformFont() (on suggestion and patches by Derek B. Noonburg,
  (derekn@foolabs.com) 


- Introduction of the initialization flag T1_NO_AFM which suppresses use of
  AFM data. This limits the functionality of t1lib considerably but
  applications that do not need those advanced functions can gain some
  performance boost while loading fonts because AFM files are not parsed and
  the mapping tables are not setup (also by Derek B. Noonburg)


- xglyph clips output window for the function fonttable() to the physical
  screen size. This is to prevent from freezing or exceeding resources if the
  fonttable button had accidentally been pressed while a large size was active.


- The utility function T1_DumpPixmap() removed from API. New function
  T1_XImageFromGlyph() added to X11 interface. This function allows, together
  with the Xpm-library function XpmWriteFileFromImage(), to write xpm-files
  from glyphs of arbitrary depths, colors, etc ...


- Functions T1_CopyOutline() and T1_FreeOutline() added to the outline interface.


- Fixed alignment problem on 64bit architecture.



September 1999: t1lib-0.9.2:
----------------------------


- Support for EMX-environments under MSDOS. This concerns the file locating
  routines. 


- t1lib now allows for charstring code 15 and escape code 15 by ignoring
  these. They may appear in some old Adobe fonts.


- Makefiles are more independent of GNU make.


- Finally, undefined/missing characters are handled consistent in all rastering
  functions by substituting .notdef. 


- Several bug-fixes



November 1999: t1lib-1.0:
-------------------------


- Bug-fixes. 


- There happen to exist different assumptions about what exactly ISOLatin1Encoding
  is. Especially the name for char 45 (dec) is not uniquely specified in 
  ISO 8859-1. Thus t1lib provides two encoding files ISOLatin1Encoding one
  which (PSLatin1.enc) is compatible with PostScript Level 2 and above.



March 2000: t1lib-1.0.1:
-------------------------


- A few bug Fixes.


- lenIV=-1 is now handled. According to an undocumented Adobe convention
  lenIV=-1 indicates suppressing of charstring encryption.
 

- Patches to compile t1lib und MS Visual C++ 6.0. In case something goes
  wrong, please contact Nakano Hideo (hideo@mb.infoeddy.ne.jp).



February 2001: t1lib-1.1.0:
---------------------------


- Bug Fixes.


- Functions T1_GetFontFilePath() and T1_GetAfmFilePath() which return the
  complete path of the files used by t1lib.


- Fixed parser code which previously failed on ASCII-encrypted files in 
  which the hex-lines were separated by <LF><CR> instead of by <LF> (Yes, 
  there such DOSian files out there ...).


- Multiple inclusion protection for t1lib.h


- T1_QueryLigs() fixed. It did not work correct if successors and/or 
  ligatures were not in the current encoding.


- New patches for VMS by Martin P. J. Zinser (zinser@decus.de).


- Patch by Sergey Babkin (babkin@bellatlantic.net) to correct the rasterizer 
  to respect StdStemWidths.


- General support for font subsetting.


- Dokumentation also provided as pdf for those people who do not have LaTeX
  installed. This is due to suggestions and patches by Nguyen-Dai Quy
  (NDQ@iris.ltas.ulg.ac.be).



April 2001: t1lib-1.1.1:
------------------------


- Update to libtool-1.3.5.


- T1_GetFontBBox() also accepts specification consisting of floating point
  numbers (as suggested by Derek B. Noonburg (derekn@foolabs.com)).


- Within the near future the t1lib-webpage will be no longer available  
  because I will change my employer.


- Similarly, the sources will be distributed from sunsite only from then on.


- The Author's eMail-address will also become invalid in the near future. The
  new and hopefully permanent eMail.address will be "Rainer.Menzner@web.de".



July 2001: t1lib-1.2:
----------------------


- Fixed bug in subsetting code.


- Fixed bug in AFM-parser code.


- Fixed kerning mapping code. Kerning did not work correctly for characters
  that appeared multiple times in an encoding vector. 


- In the same context a new function, T1_GetEncodingIndices() has been added
  to the API. It returns an array of indices (by contrast,
  T1_GetEncodingIndex() returns only the lowest index found).


- Support for composite characters.


- Additional support for dvips encoding files (thanks to suggestion and
  contribution by Nicolai Langfeldt (janl@linpro.no).


- Documentation is installed in PostScript and PDF format, but no longer in
  DVI format.



October 2001: t1lib-1.3:
------------------------


- *Really* an update to libtool-1.3.5


- Global Font Metrics Information is loaded from AFM files in order to be able
  to read the typographic ascender. Line ruling did not behave as
  documented. However, problems could still exist because the typographic
  ascender specification is optional in AFMs.


- Reorganized search path handling and, in particular, the respective
  documentation is more detailed. 


- The configuration file now allows multiple lines of one type of search path
  specification and it is also possible to quote path specification in order
  to specify paths that contains special characters like spaces, colons, etc. 


- Multiple font databases are supported. 


- T1_PrintLog() extended to accept a variable argument list. 


- The environment variable T1LIB_LOGMODE is evaluated to give the user the
  chance to specify a loglevel and hence to detect t1lib-problems even if the
  application programmer did not enable the log file features.


- Further bug fixes



November 2001: t1lib-1.3.1:
---------------------------


- Color problem in t1x11-module fixed.


- Fixes in AFM parser. Among others, Version had been read as name, instead of
  as string. This led to a failure to scan global font info for some standard AFMs.


- Fixes in of OpenVMS special code


- Further Fixes



January 2003: t1lib-5.0.0:
--------------------------


- Forced PostScript target in the doc directory to file.


- Subsetting code extended in order to ensure that components of
  composite characters are also part of the subset.


- Hinting meachanism reworked in order to get rid of some 
  rasterizing artifacts.


- Experimental support for stroked fonts (PaintType=1)


- Experimental support for stroking standard ATM fonts with PaintType=0.


- For historical reasons, there happened to exist a few documented API 
  functions that did not adhere to the T1_... naming convention. After
  considering the pro's and con's, I have decided to cleanup the interface,
  thus making this version incompatible to the previous version. Especially 
  in the type1 subdirectory there are still a lot of global symbols, but at 
  least these are not part of the documented API. The following functions 
  are affected:

  CheckForInit()           --> T1_CheckForInit()
  CheckForFontID()         --> T1_CheckForFontID()
  T1_Get_no_fonts()        --> T1_GetNoFonts()

  Furthermore, I have removed and made static a few functions which
  accidentally had found their way into t1lib.h, but which had not been part 
  of the documented API.

  I'm sorry if this causes inconveniences ...


- The new version, 5.0.0, follows as consequence from the issues discussed 
  above. It is defined by the libtool quantities CURRENT, REVISION and AGE.


- Functions for drawing rectangles.


- Bug Fixes


- Please also have a look at the topic "Future" in README.t1lib-5.0.0.



February 2004: t1lib-5.0.1:
---------------------------


- Support for Flex was not adapted to the changes from 5.0.0. This led to
  rasterization errors in fonts that use the Flex functionality --> fixed.


- Bug Fixes



April 2004: t1lib-5.0.2:
------------------------


- Changes not updated for this version



Mai 2005: t1lib-5.1.0:
----------------------


- Check against MultipleMasterFonts somewhat more tolerant, so that
  Type 1 Fonts automatically created from Multiple Master Fonts (e.g.
  using Mmpfb) should now be acceptable.


- The configure-machinery had been somewhat out of date and has been 
  updated. The distributed configure script has been generated by
  AutoConf 2.59 and the redistributed libtool parts are taken from  
  GNU libtool 1.5.10.


- Top-Level TeX-file in the doc subdirectory adapted to recent TeX
  systems' requirements.


- Added IsoLatin9.enc to distribution.


- Subsetting extended so that it works for SEAC-constructed composites
  even if no AFM composite character information is available


- Somewhat more intelligent defaults for subsetting when composite
  characters are included in the subset.


- Reallocation had been broken by relocation of internal StandardEncoding
  vector. This problem turned out on systems where realloc() actually
  returned a different pointer. 


- Fix for outline code on 64bit systems. This involves a redefinition
  of the T1_PATHPOINT struct. This should be uncritical because for 32bit
  systems there is no difference, whereas on 64bit systems, this has never 
  worked correctly before.


- DESTDIR support in Makefile.in by Volker Zell


- Support for XLFD font database format (in which the fonts' names appear
  in the first place on a line).


- Further Bug Fixes



December 2006: t1lib-5.1.1:
---------------------------

- DESTDIR support was missing and has been addded in install-target for type1afm.

- A bug fix in Anti-Aliasing subsampling code, which could make t1lib crash
  under certain conditions.

- Small number of further fixes, in particular with respect to the build 
  mechanism.



December 2007: t1lib-5.1.2:
---------------------------

- Small number of fixes reported by users. The fixes pertain to a
  vulnerability issue, memory access issues.

- More decent handling if Encoding and / or FontBBox specification are missing
  (which is invalid with respect to the specification, but recoverablel).
PK+<$[O�Ax��doc/alt-t1lib/READMEnu�[���                  
  --------------------------------------------------------------------------
  --------------------------- t1lib-README ---------------------------------
  --------------------------------------------------------------------------

/*--------------------------------------------------------------------------
  ----- File:        REAMDE.t1lib-5.1.2
  ----- Author:      Rainer Menzner (Rainer.Menzner@web.de)
  ----- Date:        2007-12-23
  ----- Description: This is file README.t1lib of the t1lib-package. It
                     contains an overview and brief installation
                     instructions for the t1-library.
  ----- Copyright:   t1lib is copyrighted (c) Rainer Menzner, 1996-2007.
                     As of version 0.5, t1lib is distributed under the
		     GNU General Public Library License. The
		     conditions can be found in the files LICENSE and
		     LGPL, which should reside in the toplevel
		     directory of the distribution.  Please note that 
		     there are parts of t1lib that are subject to
		     other licenses:
		     The parseAFM-package is copyrighted by Adobe Systems
		     Inc.
		     The type1 rasterizer is copyrighted by IBM and the
		     X11-consortium.
  ----- Warranties:  Of course, there's NO WARRANTY OF ANY KIND :-)
  ----- Credits:     I want to thank IBM and the X11-consortium for making
                     their rasterizer freely available.
		     Also thanks to Piet Tutelaers for his ps2pk, from
		     which I took the rasterizer sources in a format
		     independent from X11.
                     Thanks to all people who make free software living!
--------------------------------------------------------------------------*/



About t1lib:
------------

t1lib is a library distributed under the GNU General Public Library
License for generating character- and string-glyphs from Adobe Type 1
fonts under UNIX. t1lib uses most of the code of the X11 rasterizer
donated by IBM to the X11-project. But some disadvantages of the
rasterizer being included in X11 have been eliminated. Here are some
of the features:

- t1lib is completely independent of X11 (although the program
  provided for testing the library needs X11)

- fonts are made known to library by means of a font database file at
  runtime 

- searchpaths for all types of input files are configured by means
  of a configuration file at runtime 

- characters are rastered as they are needed

- characters and complete strings may be rastered by a simple function
  call

- when rastering strings, pairwise kerning information from .afm-files
  may optionally be taken into account

- an interface to ligature-information of afm-files is provided

- a program to generate afm-files from Type 1 font files is included

- rotation and arbitrary transformations are supported

- there's support for extending and slanting fonts

- underlining, overlining and overstriking is supported

- new encoding vectors may be loaded at runtime and fonts may be
  reencoded using these encoding vectors 

- antialiasing is implemented 

- Right-To-Left typesetting is supported

- Font subsetting is easily possible

- support of composite character information

- stroking of character outlines with variable strokewidths 

- An interactive test program called "xglyph" is included in the
  distribution. This program allows to test all of the features of the
  library. It requires X11.



Changes and New Features:
-------------------------

- See the file Changes in the T1Lib top-directory for information on new
  features. 



Installation:
-------------

-----------------------------------------------------------------------------
Note: VMS-users should examine configure.com in the toplevel directory, which
      is a configure-script for VMS, kindly contributed by John Hasstedt
      and now maintained by Martin Zinser.
      This file contains notes on how to compile t1lib on VMS.
-----------------------------------------------------------------------------


After unpacking the archive (what you obviously did already), change
to subdirectory t1lib-..../  and type:

   ./configure

This will create the Makefiles. Then type

   make


In order to use the testprogram xglyph, X11 needs to be installed on your
system. 

If you have difficulties during configuring and building t1lib, cd to
directory t1lib-.../doc and execute

   $ latex t1lib_doc.tex
   $ makeindex t1lib_doc
   $ latex t1lib_doc.tex
   $ latex t1lib_doc.tex

This will generate the docs which contain a more detailed description 
of the build-process. LaTeX2e is required. Alternatively, you can scan the
preformatted pdf-documentation.


Before installing the libraries, you should test whether all things 
work correct:
     
1) Change to subdirectory xglyph

2) Start the program xglyph

3) Ensure that the output-window is not hidden behind another window.

4) Before doing anything other, click on button "String". The
   string "Test" should now be rastered and displayed in the
   output-window, using font BitstreamCharterBTRoman at 100bp without
   kerning. If that works, most probably all works for you.

5) Have a look at t1lib_doc.dvi in the doc-subdirectory of the package 
   and read the chapter on xglyph. However, most of this program is
   self-explaining, so that you might want to omit this step.

6) Play with the program and enjoy.

7) If you do not have X11, you can still check whether t1lib works for
   you. Copy one of the pfb-files from t1lib-.../Fonts/type1, say,
   bchr.pfb, to the type1afm-subdirectory, and run 

     type1afm bchr.pfb

   If the afm-file bchr.afm is generated, t1lib will most probably
   work on your system.



Documentation:
--------------

As mentioned above, documentation is provided in LaTeX2e-format
subdirectory T1Lib/doc. It should have been built during the build.
The section on runtime setup is really important,
because programs may fail due to an invalid or incomplete runtime
setup, although the programs itself may be correct!
A preformatted Version is also available in pdf.



How to get it:
--------------

t1lib is available at

ftp://sunsite.unc.edu/pub/Linux/libs/graphics/t1lib-x.y[.z].tar.gz

where x.y[.z] is the version identification.



Closing:
--------

You are allowed to send the author lots of money and dozents of gifts,
but you needn't :-) 
If you have any comments to this library, feedback is wanted. Send
eMail to: 

Rainer.Menzner@web.de



Future:
-------

Within the past years, my time has constantly and increasingly become spare so
that I hardly found time to further develop t1lib. And developing free
software is undoubtedly related to a certain amount of fun, which in turn only
can come up if you are relaxed with respect to time ...

Since t1lib now has reached a reasonably stable sPK+<$[O�Ax��doc/alt-t1lib/READMEnu�[���s at this point. Of course, bug
fixes etc. should be possible further.

If there is somebody out there willing to further develop t1lib, he or she is
welcome to contact me ...



Have fun,

  -Rainer

PK+<$[.���b�bdoc/alt-t1lib/LGPLnu�[���		  GNU LIBRARY GENERAL PUBLIC LICENSE
		       Version 2, June 1991

 Copyright (C) 1991 Free Software Foundation, Inc.
    		    59 Temple Place, Suite 330, Boston, MA  02111-1307  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 library GPL.  It is
 numbered 2 because it goes with version 2 of the ordinary GPL.]

			    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 Library General Public License, applies to some
specially designated Free Software Foundation software, and to any
other libraries whose authors decide to use it.  You can use it for
your libraries, 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 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 a program 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.

  Our method of protecting your rights has two steps: (1) copyright
the library, and (2) offer you this license which gives you legal
permission to copy, distribute and/or modify the library.

  Also, for each distributor's protection, we want to make certain
that everyone understands that there is no warranty for this free
library.  If the library is modified by someone else and passed on, we
want its recipients to know that what they have is not the original
version, 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 companies distributing free
software will individually obtain patent licenses, thus in effect
transforming the program into proprietary software.  To prevent this,
we have made it clear that any patent must be licensed for everyone's
free use or not licensed at all.

  Most GNU software, including some libraries, is covered by the ordinary
GNU General Public License, which was designed for utility programs.  This
license, the GNU Library General Public License, applies to certain
designated libraries.  This license is quite different from the ordinary
one; be sure to read it in full, and don't assume that anything in it is
the same as in the ordinary license.

  The reason we have a separate public license for some libraries is that
they blur the distinction we usually make between modifying or adding to a
program and simply using it.  Linking a program with a library, without
changing the library, is in some sense simply using the library, and is
analogous to running a utility program or application program.  However, in
a textual and legal sense, the linked executable is a combined work, a
derivative of the original library, and the ordinary General Public License
treats it as such.

  Because of this blurred distinction, using the ordinary General
Public License for libraries did not effectively promote software
sharing, because most developers did not use the libraries.  We
concluded that weaker conditions might promote sharing better.

  However, unrestricted linking of non-free programs would deprive the
users of those programs of all benefit from the free status of the
libraries themselves.  This Library General Public License is intended to
permit developers of non-free programs to use free libraries, while
preserving your freedom as a user of such programs to change the free
libraries that are incorporated in them.  (We have not seen how to achieve
this as regards changes in header files, but we have achieved it as regards
changes in the actual functions of the Library.)  The hope is that this
will lead to faster development of free libraries.

  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, while the latter only
works together with the library.

  Note that it is possible for a library to be covered by the ordinary
General Public License rather than by this special one.

		  GNU LIBRARY GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License Agreement applies to any software library which
contains a notice placed by the copyright holder or other authorized
party saying it may be distributed under the terms of this Library
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 scoPK+<$[.���b�bdoc/alt-t1lib/LGPLnu�[���ted, 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 compile 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) 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.

    c) 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.

    d) 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 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.

  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 to
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 Library 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 Library General Public
    License as published by the Free Software Foundation; either
    version 2 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
    Library General Public License for more details.

    You should have received a copy of the GNU Library General Public
    License along with this library; if not, write to the Free
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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�e$[�*��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�e$[�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 patPK�e$[�*��doc/alt-ruby25/README.mdnu�[���------------------------------------------
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 #165PK�e$[�O����doc/alt-ruby25/ChangeLognu�[���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$[�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:PK�e$[�Np�MBMBdoc/alt-ruby25/NEWSnu�[���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�e$[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` でスタックをマークしている
部分にアラインメントのバイト数だけずらしてマークするコードを追加するだけで済みます.`dPK�e$[e��$$doc/alt-ruby25/README.ja.mdnu�[���い.

レジスタウィンドウを持つ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�e$[�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�e$[D�.�doc/alt-ruby25/README.EXTnu�[���Moved to doc/extension.rdoc
PK�e$[�$�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 PK�e$[�C,@
@
doc/alt-ruby25/COPYING.janu�[���he 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@SIPPK�e$[D�.�doc/alt-ruby25/README.EXTnu�[���001 earthian@tama.or.jp, AllPK�e$[�$�zD�D�doc/alt-ruby25/LEGALnu�[���ou 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�e$[�\��++doc/alt-ruby25/README.EXT.janu�[���doc/extension.ja.rdocに移動しました
PK�e$[�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�e$[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�e$[��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 lPK�e$[�\��++doc/alt-ruby25/README.EXT.janu�[��� and conditions for copying, distribution aPK�e$[�qodoc/alt-ruby25/BSDLnu�[���ENSE
   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
cPK�e$[n,�	�	doc/alt-ruby25/COPYINGnu�[���s 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 onPK�e$[��FN�F�Fdoc/alt-ruby25/GPLnu�[���) 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.
PK�e$[?����man/man1/bundle-gem.1nu�[���.\" generated with Ronn-NG/v0.10.1
.\" http://github.com/apjanke/ronn-ng/tree/0.10.1
.TH "BUNDLE\-GEM" "1" "March 2025" ""
.SH "NAME"
\fBbundle\-gem\fR \- Generate a project skeleton for creating a rubygem
.SH "SYNOPSIS"
\fBbundle gem\fR \fIGEM_NAME\fR \fIOPTIONS\fR
.SH "DESCRIPTION"
Generates a directory named \fBGEM_NAME\fR with a \fBRakefile\fR, \fBGEM_NAME\.gemspec\fR, and other supporting files and directories that can be used to develop a rubygem with that name\.
.P
Run \fBrake \-T\fR in the resulting project for a list of Rake tasks that can be used to test and publish the gem to rubygems\.org\.
.P
The generated project skeleton can be customized with OPTIONS, as explained below\. Note that these options can also be specified via Bundler's global configuration file using the following names:
.IP "\(bu" 4
\fBgem\.coc\fR
.IP "\(bu" 4
\fBgem\.mit\fR
.IP "\(bu" 4
\fBgem\.test\fR
.IP "" 0
.SH "OPTIONS"
.IP "\(bu" 4
\fB\-\-exe\fR, \fB\-\-bin\fR, \fB\-b\fR: Specify that Bundler should create a binary executable (as \fBexe/GEM_NAME\fR) in the generated rubygem project\. This binary will also be added to the \fBGEM_NAME\.gemspec\fR manifest\. This behavior is disabled by default\.
.IP "\(bu" 4
\fB\-\-no\-exe\fR: Do not create a binary (overrides \fB\-\-exe\fR specified in the global config)\.
.IP "\(bu" 4
\fB\-\-coc\fR: Add a \fBCODE_OF_CONDUCT\.md\fR file to the root of the generated project\. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler's global config for future \fBbundle gem\fR use\.
.IP "\(bu" 4
\fB\-\-no\-coc\fR: Do not create a \fBCODE_OF_CONDUCT\.md\fR (overrides \fB\-\-coc\fR specified in the global config)\.
.IP "\(bu" 4
\fB\-\-changelog\fR Add a \fBCHANGELOG\.md\fR file to the root of the generated project\. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler's global config for future \fBbundle gem\fR use\.
.IP "\(bu" 4
\fB\-\-no\-changelog\fR: Do not create a \fBCHANGELOG\.md\fR (overrides \fB\-\-changelog\fR specified in the global config)\.
.IP "\(bu" 4
\fB\-\-ext=c\fR, \fB\-\-ext=rust\fR: Add boilerplate for C or Rust (currently magnus \fIhttps://docs\.rs/magnus\fR based) extension code to the generated project\. This behavior is disabled by default\.
.IP "\(bu" 4
\fB\-\-no\-ext\fR: Do not add extension code (overrides \fB\-\-ext\fR specified in the global config)\.
.IP "\(bu" 4
\fB\-\-git\fR: Initialize a git repo inside your library\.
.IP "\(bu" 4
\fB\-\-github\-username=GITHUB_USERNAME\fR: Fill in GitHub username on README so that you don't have to do it manually\. Set a default with \fBbundle config set \-\-global gem\.github_username <your_username>\fR\.
.IP "\(bu" 4
\fB\-\-mit\fR: Add an MIT license to a \fBLICENSE\.txt\fR file in the root of the generated project\. Your name from the global git config is used for the copyright statement\. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler's global config for future \fBbundle gem\fR use\.
.IP "\(bu" 4
\fB\-\-no\-mit\fR: Do not create a \fBLICENSE\.txt\fR (overrides \fB\-\-mit\fR specified in the global config)\.
.IP "\(bu" 4
\fB\-t\fR, \fB\-\-test=minitest\fR, \fB\-\-test=rspec\fR, \fB\-\-test=test\-unit\fR: Specify the test framework that Bundler should use when generating the project\. Acceptable values are \fBminitest\fR, \fBrspec\fR and \fBtest\-unit\fR\. The \fBGEM_NAME\.gemspec\fR will be configured and a skeleton test/spec directory will be created based on this option\. Given no option is specified:
.IP
When Bundler is configured to generate tests, this defaults to Bundler's global config setting \fBgem\.test\fR\.
.IP
When Bundler is configured to not generate tests, an interactive prompt will be displayed and the answer will be used for the current rubygem project\.
.IP
When Bundler is unconfigured, an interactive prompt will be displayed and the answer will be saved in Bundler's global config for future \fBbundle gem\fR use\.
.IP "\(bu" 4
\fB\-\-no\-test\fR: Do not use a test framework (overrides \fB\-\-test\fR specified in the global config)\.
.IP "\(bu" 4
\fB\-\-changelog\fR: Generate changelog file\. Set a default with \fBbundle config set \-\-global gem\.changelog true\fR\.
.IP "\(bu" 4
\fB\-\-ci\fR, \fB\-\-ci=circle\fR, \fB\-\-ci=github\fR, \fB\-\-ci=gitlab\fR: Specify the continuous integration service that Bundler should use when generating the project\. Acceptable values are \fBgithub\fR, \fBgitlab\fR and \fBcircle\fR\. A configuration file will be generated in the project directory\. Given no option is specified:
.IP
When Bundler is configured to generate CI files, this defaults to Bundler's global config setting \fBgem\.ci\fR\.
.IP
When Bundler is configured to not generate CI files, an interactive prompt will be displayed and the answer will be used for the current rubygem project\.
.IP
When Bundler is unconfigured, an interactive prompt will be displayed and the answer will be saved in Bundler's global config for future \fBbundle gem\fR use\.
.IP "\(bu" 4
\fB\-\-no\-ci\fR: Do not use a continuous integration service (overrides \fB\-\-ci\fR specified in the global config)\.
.IP "\(bu" 4
\fB\-\-linter\fR, \fB\-\-linter=rubocop\fR, \fB\-\-linter=standard\fR: Specify the linter and code formatter that Bundler should add to the project's development dependencies\. Acceptable values are \fBrubocop\fR and \fBstandard\fR\. A configuration file will be generated in the project directory\. Given no option is specified:
.IP
When Bundler is configured to add a linter, this defaults to Bundler's global config setting \fBgem\.linter\fR\.
.IP
When Bundler is configured not to add a linter, an interactive prompt will be displayed and the answer will be used for the current rubygem project\.
.IP
When Bundler is unconfigured, an interactive prompt will be displayed and the answer will be saved in Bundler's global config for future \fBbundle gem\fR use\.
.IP "\(bu" 4
\fB\-\-no\-linter\fR: Do not add a linter (overrides \fB\-\-linter\fR specified in the global config)\.
.IP "\(bu" 4
\fB\-\-rubocop\fR: Add rubocop to the generated Rakefile and gemspec\. Set a default with \fBbundle config set \-\-global gem\.rubocop true\fR\.
.IP "\(bu" 4
\fB\-\-edit=EDIT\fR, \fB\-e=EDIT\fR: Open the resulting GEM_NAME\.gemspec in EDIT, or the default editor if not specified\. The default is \fB$BUNDLER_EDITOR\fR, \fB$VISUAL\fR, or \fB$EDITOR\fR\.
.IP "" 0
.SH "SEE ALSO"
.IP "\(bu" 4
bundle config(1) \fIbundle\-config\.1\.html\fR
.IP "" 0

PK�e$[�Wj	RRman/man1/bundle-env.1nu�[���.\" generated with Ronn-NG/v0.10.1
.\" http://github.com/apjanke/ronn-ng/tree/0.10.1
.TH "BUNDLE\-ENV" "1" "March 2025" ""
.SH "NAME"
\fBbundle\-env\fRPK}$[.zman/man1/bundle-gem.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-GEM" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-gem\fR \- Generate a project skeleton for creating a rubygem
.
.SH "SYNOPSIS"
\fBbundle gem\fR \fIGEM_NAME\fR \fIOPTIONS\fR
.
.SH "DESCRIPTION"
Generates a directory named \fBGEM_NAME\fR with a \fBRakefile\fR, \fBGEM_NAME\.gemspec\fR, and other supporting files and directories that can be used to develop a rubygem with that name\.
.
.P
Run \fBrake \-T\fR in the resulting project for a list of Rake tasks that can be used to test and publish the gem to rubygems\.org\.
.
.P
The generated project skeleton can be customized with OPTIONS, as explained below\. Note that these options can also be specified via Bundler\'s global configuration file using the following names:
.
.IP "\(bu" 4
\fBgem\.coc\fR
.
.IP "\(bu" 4
\fBgem\.mit\fR
.
.IP "\(bu" 4
\fBgem\.test\fR
.
.IP "" 0
.
.SH "OPTIONS"
.
.TP
\fB\-\-exe\fR or \fB\-b\fR or \fB\-\-bin\fR
Specify that Bundler should create a binary executable (as \fBexe/GEM_NAME\fR) in the generated rubygem project\. This binary will also be added to the \fBGEM_NAME\.gemspec\fR manifest\. This behavior is disabled by default\.
.
.TP
\fB\-\-no\-exe\fR
Do not create a binary (overrides \fB\-\-exe\fR specified in the global config)\.
.
.TP
\fB\-\-coc\fR
Add a \fBCODE_OF_CONDUCT\.md\fR file to the root of the generated project\. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\.
.
.TP
\fB\-\-no\-coc\fR
Do not create a \fBCODE_OF_CONDUCT\.md\fR (overrides \fB\-\-coc\fR specified in the global config)\.
.
.TP
\fB\-\-ext\fR
Add boilerplate for C extension code to the generated project\. This behavior is disabled by default\.
.
.TP
\fB\-\-no\-ext\fR
Do not add C extension code (overrides \fB\-\-ext\fR specified in the global config)\.
.
.TP
\fB\-\-mit\fR
Add an MIT license to a \fBLICENSE\.txt\fR file in the root of the generated project\. Your name from the global git config is used for the copyright statement\. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\.
.
.TP
\fB\-\-no\-mit\fR
Do not create a \fBLICENSE\.txt\fR (overrides \fB\-\-mit\fR specified in the global config)\.
.
.TP
\fB\-t\fR, \fB\-\-test=minitest\fR, \fB\-\-test=rspec\fR, \fB\-\-test=test\-unit\fR
Specify the test framework that Bundler should use when generating the project\. Acceptable values are \fBminitest\fR, \fBrspec\fR and \fBtest\-unit\fR\. The \fBGEM_NAME\.gemspec\fR will be configured and a skeleton test/spec directory will be created based on this option\. Given no option is specified:
.
.IP
When Bundler is configured to generate tests, this defaults to Bundler\'s global config setting \fBgem\.test\fR\.
.
.IP
When Bundler is configured to not generate tests, an interactive prompt will be displayed and the answer will be used for the current rubygem project\.
.
.IP
When Bundler is unconfigured, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\.
.
.TP
\fB\-\-ci\fR, \fB\-\-ci=github\fR, \fB\-\-ci=travis\fR, \fB\-\-ci=gitlab\fR, \fB\-\-ci=circle\fR
Specify the continuous integration service that Bundler should use when generating the project\. Acceptable values are \fBgithub\fR, \fBtravis\fR, \fBgitlab\fR and \fBcircle\fR\. A configuration file will be generated in the project directory\. Given no option is specified:
.
.IP
When Bundler is configured to generate CI files, this defaults to Bundler\'s global config setting \fBgem\.ci\fR\.
.
.IP
When Bundler is configured to not generate CI files, an interactive prompt will be displayed and the answer will be used for the current rubygem project\.
.
.IP
When Bundler is unconfigured, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\.
.
.TP
\fB\-\-linter\fR, \fB\-\-linter=rubocop\fR, \fB\-\-linter=standard\fR
Specify the linter and code formatter that Bundler should add to the project\'s development dependencies\. Acceptable values are \fBrubocop\fR and \fBstandard\fR\. A configuration file will be generated in the project directory\. Given no option is specified:
.
.IP
When Bundler is configured to add a linter, this defaults to Bundler\'s global config setting \fBgem\.linter\fR\.
.
.IP
When Bundler is configured not to add a linter, an interactive prompt will be displayed and the answer will be used for the current rubygem project\.
.
.IP
When Bundler is unconfigured, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\.
.
.TP
\fB\-e\fR, \fB\-\-edit[=EDITOR]\fR
Open the resulting GEM_NAME\.gemspec in EDITOR, or the default editor if not specified\. The default is \fB$BUNDLER_EDITOR\fR, \fB$VISUAL\fR, or \fB$EDITOR\fR\.
.
.SH "SEE ALSO"
.
.IP "\(bu" 4
bundle config(1) \fIbundle\-config\.1\.html\fR
.
.IP "" 0

PK}$[�;���man/man1/bundle-list.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-LIST" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-list\fR \- List all the gems in the bundle
.
.SH "SYNOPSIS"
\fBbundle list\fR [\-\-name\-only] [\-\-paths] [\-\-without\-group=GROUP[ GROUP\.\.\.]] [\-\-only\-group=GROUP[ GROUP\.\.\.]]
.
.SH "DESCRIPTION"
Prints a list of all the gems in the bundle including their version\.
.
.P
Example:
.
.P
bundle list \-\-name\-only
.
.P
bundle list \-\-paths
.
.P
bundle list \-\-without\-group test
.
.P
bundle list \-\-only\-group dev
.
.P
bundle list \-\-only\-group dev test \-\-paths
.
.SH "OPTIONS"
.
.TP
\fB\-\-name\-only\fR
Print only the name of each gem\.
.
.TP
\fB\-\-paths\fR
Print the path to each gem in the bundle\.
.
.TP
\fB\-\-without\-group=<list>\fR
A space\-separated list of groups of gems to skip during printing\.
.
.TP
\fB\-\-only\-group=<list>\fR
A space\-separated list of groups of gems to print\.

PK}$["�7��man/man1/bundle-platform.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-PLATFORM" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-platform\fR \- Displays platform compatibility information
.
.SH "SYNOPSIS"
\fBbundle platform\fR [\-\-ruby]
.
.SH "DESCRIPTION"
\fBplatform\fR displays information from your Gemfile, Gemfile\.lock, and Ruby VM about your platform\.
.
.P
For instance, using this Gemfile(5):
.
.IP "" 4
.
.nf

source "https://rubygems\.org"

ruby "3\.1\.2"

gem "rack"
.
.fi
.
.IP "" 0
.
.P
If you run \fBbundle platform\fR on Ruby 3\.1\.2, it displays the following output:
.
.IP "" 4
.
.nf

Your platform is: x86_64\-linux

Your app has gems that work on these platforms:
* arm64\-darwin\-21
* ruby
* x64\-mingw\-ucrt
* x86_64\-linux

Your Gemfile specifies a Ruby version requirement:
* ruby 3\.1\.2

Your current platform satisfies the Ruby version requirement\.
.
.fi
.
.IP "" 0
.
.P
\fBplatform\fR lists all the platforms in your \fBGemfile\.lock\fR as well as the \fBruby\fR directive if applicable from your Gemfile(5)\. It also lets you know if the \fBruby\fR directive requirement has been met\. If \fBruby\fR directive doesn\'t match the running Ruby VM, it tells you what part does not\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-ruby\fR
It will display the ruby directive information, so you don\'t have to parse it from the Gemfile(5)\.
.
.SH "SEE ALSO"
.
.IP "\(bu" 4
bundle\-lock(1) \fIbundle\-lock\.1\.ronn\fR
.
.IP "" 0

PK}$[+3`-DDman/man1/bundle-open.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-OPEN" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-open\fR \- Opens the source directory for a gem in your bundle
.
.SH "SYNOPSIS"
\fBbundle open\fR [GEM]
.
.SH "DESCRIPTION"
Opens the source directory of the provided GEM in your editor\.
.
.P
For this to work the \fBEDITOR\fR or \fBBUNDLER_EDITOR\fR environment variable has to be set\.
.
.P
Example:
.
.IP "" 4
.
.nf

bundle open \'rack\'
.
.fi
.
.IP "" 0
.
.P
Will open the source directory for the \'rack\' gem in your bundle\.
PK}$[���MMman/man1/bundle-inject.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-INJECT" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-inject\fR \- Add named gem(s) with version requirements to Gemfile
.
.SH "SYNOPSIS"
\fBbundle inject\fR [GEM] [VERSION]
.
.SH "DESCRIPTION"
Adds the named gem(s) with their version requirements to the resolved [\fBGemfile(5)\fR][Gemfile(5)]\.
.
.P
This command will add the gem to both your [\fBGemfile(5)\fR][Gemfile(5)] and Gemfile\.lock if it isn\'t listed yet\.
.
.P
Example:
.
.IP "" 4
.
.nf

bundle install
bundle inject \'rack\' \'> 0\'
.
.fi
.
.IP "" 0
.
.P
This will inject the \'rack\' gem with a version greater than 0 in your [\fBGemfile(5)\fR][Gemfile(5)] and Gemfile\.lock\.
.
.P
The \fBbundle inject\fR command was deprecated in Bundler 2\.1 and will be removed in Bundler 3\.0\.
PK}$[��		man/man1/bundle-plugin.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-PLUGIN" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-plugin\fR \- Manage Bundler plugins
.
.SH "SYNOPSIS"
\fBbundle plugin\fR install PLUGINS [\-\-source=\fISOURCE\fR] [\-\-version=\fIversion\fR] [\-\-git|\-\-local_git=\fIgit\-url\fR] [\-\-branch=\fIbranch\fR|\-\-ref=\fIrev\fR]
.
.br
\fBbundle plugin\fR uninstall PLUGINS
.
.br
\fBbundle plugin\fR list
.
.br
\fBbundle plugin\fR help [COMMAND]
.
.SH "DESCRIPTION"
You can install, uninstall, and list plugin(s) with this command to extend functionalities of Bundler\.
.
.SH "SUB\-COMMANDS"
.
.SS "install"
Install the given plugin(s)\.
.
.IP "\(bu" 4
\fBbundle plugin install bundler\-graph\fR: Install bundler\-graph gem from RubyGems\.org\. The global source, specified in source in Gemfile is ignored\.
.
.IP "\(bu" 4
\fBbundle plugin install bundler\-graph \-\-source https://example\.com\fR: Install bundler\-graph gem from example\.com\. The global source, specified in source in Gemfile is not considered\.
.
.IP "\(bu" 4
\fBbundle plugin install bundler\-graph \-\-version 0\.2\.1\fR: You can specify the version of the gem via \fB\-\-version\fR\.
.
.IP "\(bu" 4
\fBbundle plugin install bundler\-graph \-\-git https://github\.com/rubygems/bundler\-graph\fR: Install bundler\-graph gem from Git repository\. \fB\-\-git\fR can be replaced with \fB\-\-local\-git\fR\. You cannot use both \fB\-\-git\fR and \fB\-\-local\-git\fR\. You can use standard Git URLs like:
.
.IP "\(bu" 4
\fBssh://[user@]host\.xz[:port]/path/to/repo\.git\fR
.
.IP "\(bu" 4
\fBhttp[s]://host\.xz[:port]/path/to/repo\.git\fR
.
.IP "\(bu" 4
\fB/path/to/repo\fR
.
.IP "\(bu" 4
\fBfile:///path/to/repo\fR
.
.IP "" 0
.
.IP
When you specify \fB\-\-git\fR/\fB\-\-local\-git\fR, you can use \fB\-\-branch\fR or \fB\-\-ref\fR to specify any branch, tag, or commit hash (revision) to use\. When you specify both, only the latter is used\.
.
.IP "" 0
.
.SS "uninstall"
Uninstall the plugin(s) specified in PLUGINS\.
.
.SS "list"
List the installed plugins and available commands\.
.
.P
No options\.
.
.SS "help"
Describe subcommands or one specific subcommand\.
.
.P
No options\.
.
.SH "SEE ALSO"
.
.IP "\(bu" 4
How to write a Bundler plugin \fIhttps://bundler\.io/guides/bundler_plugins\.html\fR
.
.IP "" 0

PK}$[�
���man/man1/bundle-pristine.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-PRISTINE" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-pristine\fR \- Restores installed gems to their pristine condition
.
.SH "SYNOPSIS"
\fBbundle pristine\fR
.
.SH "DESCRIPTION"
\fBpristine\fR restores the installed gems in the bundle to their pristine condition using the local gem cache from RubyGems\. For git gems, a forced checkout will be performed\.
.
.P
For further explanation, \fBbundle pristine\fR ignores unpacked files on disk\. In other words, this command utilizes the local \fB\.gem\fR cache or the gem\'s git repository as if one were installing from scratch\.
.
.P
Note: the Bundler gem cannot be restored to its original state with \fBpristine\fR\. One also cannot use \fBbundle pristine\fR on gems with a \'path\' option in the Gemfile, because bundler has no original copy it can restore from\.
.
.P
When is it practical to use \fBbundle pristine\fR?
.
.P
It comes in handy when a developer is debugging a gem\. \fBbundle pristine\fR is a great way to get rid of experimental changes to a gem that one may not want\.
.
.P
Why use \fBbundle pristine\fR over \fBgem pristine \-\-all\fR?
.
.P
Both commands are very similar\. For context: \fBbundle pristine\fR, without arguments, cleans all gems from the lockfile\. Meanwhile, \fBgem pristine \-\-all\fR cleans all installed gems for that Ruby version\.
.
.P
If a developer forgets which gems in their project they might have been debugging, the Rubygems \fBgem pristine [GEMNAME]\fR command may be inconvenient\. One can avoid waiting for \fBgem pristine \-\-all\fR, and instead run \fBbundle pristine\fR\.
PK}$[f�Qvvman/man1/bundle-lock.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-LOCK" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-lock\fR \- Creates / Updates a lockfile without installing
.
.SH "SYNOPSIS"
\fBbundle lock\fR [\-\-update] [\-\-local] [\-\-print] [\-\-lockfile=PATH] [\-\-full\-index] [\-\-add\-platform] [\-\-remove\-platform] [\-\-patch] [\-\-minor] [\-\-major] [\-\-strict] [\-\-conservative]
.
.SH "DESCRIPTION"
Lock the gems specified in Gemfile\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-update=<*gems>\fR
Ignores the existing lockfile\. Resolve then updates lockfile\. Taking a list of gems or updating all gems if no list is given\.
.
.TP
\fB\-\-local\fR
Do not attempt to connect to \fBrubygems\.org\fR\. Instead, Bundler will use the gems already present in Rubygems\' cache or in \fBvendor/cache\fR\. Note that if a appropriate platform\-specific gem exists on \fBrubygems\.org\fR it will not be found\.
.
.TP
\fB\-\-print\fR
Prints the lockfile to STDOUT instead of writing to the file system\.
.
.TP
\fB\-\-lockfile=<path>\fR
The path where the lockfile should be written to\.
.
.TP
\fB\-\-full\-index\fR
Fall back to using the single\-file index of all gems\.
.
.TP
\fB\-\-add\-platform\fR
Add a new platform to the lockfile, re\-resolving for the addition of that platform\.
.
.TP
\fB\-\-remove\-platform\fR
Remove a platform from the lockfile\.
.
.TP
\fB\-\-patch\fR
If updating, prefer updating only to next patch version\.
.
.TP
\fB\-\-minor\fR
If updating, prefer updating only to next minor version\.
.
.TP
\fB\-\-major\fR
If updating, prefer updating to next major version (default)\.
.
.TP
\fB\-\-strict\fR
If updating, do not allow any gem to be updated past latest \-\-patch | \-\-minor | \-\-major\.
.
.TP
\fB\-\-conservative\fR
If updating, use bundle install conservative update behavior and do not allow shared dependencies to be updated\.
.
.SH "UPDATING ALL GEMS"
If you run \fBbundle lock\fR with \fB\-\-update\fR option without list of gems, bundler will ignore any previously installed gems and resolve all dependencies again based on the latest versions of all gems available in the sources\.
.
.SH "UPDATING A LIST OF GEMS"
Sometimes, you want to update a single gem in the Gemfile(5), and leave the rest of the gems that you specified locked to the versions in the \fBGemfile\.lock\fR\.
.
.P
For instance, you only want to update \fBnokogiri\fR, run \fBbundle lock \-\-update nokogiri\fR\.
.
.P
Bundler will update \fBnokogiri\fR and any of its dependencies, but leave the rest of the gems that you specified locked to the versions in the \fBGemfile\.lock\fR\.
.
.SH "SUPPORTING OTHER PLATFORMS"
If you want your bundle to support platforms other than the one you\'re running locally, you can run \fBbundle lock \-\-add\-platform PLATFORM\fR to add PLATFORM to the lockfile, force bundler to re\-resolve and consider the new platform when picking gems, all without needing to have a machine that matches PLATFORM handy to install those platform\-specific gems on\.
.
.P
For a full explanation of gem platforms, see \fBgem help platform\fR\.
.
.SH "PATCH LEVEL OPTIONS"
See bundle update(1) \fIbundle\-update\.1\.html\fR for details\.
PK}$[�x��G�Gman/man1/bundle-install.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-INSTALL" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-install\fR \- Install the dependencies specified in your Gemfile
.
.SH "SYNOPSIS"
\fBbundle install\fR [\-\-binstubs[=DIRECTORY]] [\-\-clean] [\-\-deployment] [\-\-frozen] [\-\-full\-index] [\-\-gemfile=GEMFILE] [\-\-jobs=NUMBER] [\-\-local] [\-\-no\-cache] [\-\-no\-prune] [\-\-path PATH] [\-\-quiet] [\-\-redownload] [\-\-retry=NUMBER] [\-\-shebang] [\-\-standalone[=GROUP[ GROUP\.\.\.]]] [\-\-system] [\-\-trust\-policy=POLICY] [\-\-with=GROUP[ GROUP\.\.\.]] [\-\-without=GROUP[ GROUP\.\.\.]]
.
.SH "DESCRIPTION"
Install the gems specified in your Gemfile(5)\. If this is the first time you run bundle install (and a \fBGemfile\.lock\fR does not exist), Bundler will fetch all remote sources, resolve dependencies and install all needed gems\.
.
.P
If a \fBGemfile\.lock\fR does exist, and you have not updated your Gemfile(5), Bundler will fetch all remote sources, but use the dependencies specified in the \fBGemfile\.lock\fR instead of resolving dependencies\.
.
.P
If a \fBGemfile\.lock\fR does exist, and you have updated your Gemfile(5), Bundler will use the dependencies in the \fBGemfile\.lock\fR for all gems that you did not update, but will re\-resolve the dependencies of gems that you did update\. You can find more information about this update process below under \fICONSERVATIVE UPDATING\fR\.
.
.SH "OPTIONS"
The \fB\-\-clean\fR, \fB\-\-deployment\fR, \fB\-\-frozen\fR, \fB\-\-no\-prune\fR, \fB\-\-path\fR, \fB\-\-shebang\fR, \fB\-\-system\fR, \fB\-\-without\fR and \fB\-\-with\fR options are deprecated because they only make sense if they are applied to every subsequent \fBbundle install\fR run automatically and that requires \fBbundler\fR to silently remember them\. Since \fBbundler\fR will no longer remember CLI flags in future versions, \fBbundle config\fR (see bundle\-config(1)) should be used to apply them permanently\.
.
.TP
\fB\-\-binstubs[=<directory>]\fR
Binstubs are scripts that wrap around executables\. Bundler creates a small Ruby file (a binstub) that loads Bundler, runs the command, and puts it in \fBbin/\fR\. This lets you link the binstub inside of an application to the exact gem version the application needs\.
.
.IP
Creates a directory (defaults to \fB~/bin\fR) and places any executables from the gem there\. These executables run in Bundler\'s context\. If used, you might add this directory to your environment\'s \fBPATH\fR variable\. For instance, if the \fBrails\fR gem comes with a \fBrails\fR executable, this flag will create a \fBbin/rails\fR executable that ensures that all referred dependencies will be resolved using the bundled gems\.
.
.TP
\fB\-\-clean\fR
On finishing the installation Bundler is going to remove any gems not present in the current Gemfile(5)\. Don\'t worry, gems currently in use will not be removed\.
.
.IP
This option is deprecated in favor of the \fBclean\fR setting\.
.
.TP
\fB\-\-deployment\fR
In \fIdeployment mode\fR, Bundler will \'roll\-out\' the bundle for production or CI use\. Please check carefully if you want to have this option enabled in your development environment\.
.
.IP
This option is deprecated in favor of the \fBdeployment\fR setting\.
.
.TP
\fB\-\-redownload\fR
Force download every gem, even if the required versions are already available locally\.
.
.TP
\fB\-\-frozen\fR
Do not allow the Gemfile\.lock to be updated after this install\. Exits non\-zero if there are going to be changes to the Gemfile\.lock\.
.
.IP
This option is deprecated in favor of the \fBfrozen\fR setting\.
.
.TP
\fB\-\-full\-index\fR
Bundler will not call Rubygems\' API endpoint (default) but download and cache a (currently big) index file of all gems\. Performance can be improved for large bundles that seldom change by enabling this option\.
.
.TP
\fB\-\-gemfile=<gemfile>\fR
The location of the Gemfile(5) which Bundler should use\. This defaults to a Gemfile(5) in the current working directory\. In general, Bundler will assume that the location of the Gemfile(5) is also the project\'s root and will try to find \fBGemfile\.lock\fR and \fBvendor/cache\fR relative to this location\.
.
.TP
\fB\-\-jobs=[<number>]\fR, \fB\-j[<number>]\fR
The maximum number of parallel download and install jobs\. The default is the number of available processors\.
.
.TP
\fB\-\-local\fR
Do not attempt to connect to \fBrubygems\.org\fR\. Instead, Bundler will use the gems already present in Rubygems\' cache or in \fBvendor/cache\fR\. Note that if an appropriate platform\-specific gem exists on \fBrubygems\.org\fR it will not be found\.
.
.TP
\fB\-\-prefer\-local\fR
Force using locally installed gems, or gems already present in Rubygems\' cache or in \fBvendor/cache\fR, when resolving, even if newer versions are available remotely\. Only attempt to connect to \fBrubygems\.org\fR for gems that are not present locally\.
.
.TP
\fB\-\-no\-cache\fR
Do not update the cache in \fBvendor/cache\fR with the newly bundled gems\. This does not remove any gems in the cache but keeps the newly bundled gems from being cached during the install\.
.
.TP
\fB\-\-no\-prune\fR
Don\'t remove stale gems from the cache when the installation finishes\.
.
.IP
This option is deprecated in favor of the \fBno_prune\fR setting\.
.
.TP
\fB\-\-path=<path>\fR
The location to install the specified gems to\. This defaults to Rubygems\' setting\. Bundler shares this location with Rubygems, \fBgem install \.\.\.\fR will have gem installed there, too\. Therefore, gems installed without a \fB\-\-path \.\.\.\fR setting will show up by calling \fBgem list\fR\. Accordingly, gems installed to other locations will not get listed\.
.
.IP
This option is deprecated in favor of the \fBpath\fR setting\.
.
.TP
\fB\-\-quiet\fR
Do not print progress information to the standard output\. Instead, Bundler will exit using a status code (\fB$?\fR)\.
.
.TP
\fB\-\-retry=[<number>]\fR
Retry failed network or git requests for \fInumber\fR times\.
.
.TP
\fB\-\-shebang=<ruby\-executable>\fR
Uses the specified ruby executable (usually \fBruby\fR) to execute the scripts created with \fB\-\-binstubs\fR\. In addition, if you use \fB\-\-binstubs\fR together with \fB\-\-shebang jruby\fR these executables will be changed to execute \fBjruby\fR instead\.
.
.IP
This option is deprecated in favor of the \fBshebang\fR setting\.
.
.TP
\fB\-\-standalone[=<list>]\fR
Makes a bundle that can work without depending on Rubygems or Bundler at runtime\. A space separated list of groups to install has to be specified\. Bundler creates a directory named \fBbundle\fR and installs the bundle there\. It also generates a \fBbundle/bundler/setup\.rb\fR file to replace Bundler\'s own setup in the manner required\. Using this option implicitly sets \fBpath\fR, which is a [remembered option][REMEMBERED OPTIONS]\.
.
.TP
\fB\-\-system\fR
Installs the gems specified in the bundle to the system\'s Rubygems location\. This overrides any previous configuration of \fB\-\-path\fR\.
.
.IP
This option is deprecated in favor of the \fBsystem\fR setting\.
.
.TP
\fB\-\-trust\-policy=[<policy>]\fR
Apply the Rubygems security policy \fIpolicy\fR, where policy is one of \fBHighSecurity\fR, \fBMediumSecurity\fR, \fBLowSecurity\fR, \fBAlmostNoSecurity\fR, or \fBNoSecurity\fR\. For more details, please see the Rubygems signing documentation linked below in \fISEE ALSO\fR\.
.
.TP
\fB\-\-with=<list>\fR
A space\-separated list of groups referencing gems to install\. If an optional group is given it is installed\. If a group is given that is in the remembered list of groups given to \-\-without, it is removed from that list\.
.
.IP
This option is deprecated in favor of the \fBwith\fR setting\.
.
.TP
\fB\-\-without=<list>\fR
A space\-separated list of groups referencing gems to skip during installation\. If a group is given that is in the remembered list of groups given to \-\-with, it is removed from that list\.
.
.IP
This option is deprecated in favor of the \fBwithout\fR setting\.
.
.SH "DEPLOYMENT MODE"
Bundler\'s defaults are optimized for development\. To switch to defaults optimized for deployment and for CI, use the \fB\-\-deployment\fR flag\. Do not activate deployment mode on development machines, as it will cause an error when the Gemfile(5) is modified\.
.
.IP "1." 4
A \fBGemfile\.lock\fR is required\.
.
.IP
To ensure that the same versions of the gems you developed with and tested with are also used in deployments, a \fBGemfile\.lock\fR is required\.
.
.IP
This is mainly to ensure that you remember to check your \fBGemfile\.lock\fR into version control\.
.
.IP "2." 4
The \fBGemfile\.lock\fR must be up to date
.
.IP
In development, you can modify your Gemfile(5) and re\-run \fBbundle install\fR to \fIconservatively update\fR your \fBGemfile\.lock\fR snapshot\.
.
.IP
In deployment, your \fBGemfile\.lock\fR should be up\-to\-date with changes made in your Gemfile(5)\.
.
.IP "3." 4
Gems are installed to \fBvendor/bundle\fR not your default system location
.
.IP
In development, it\'s convenient to share the gems used in your application with other applications and other scripts that run on the system\.
.
.IP
In deployment, isolation is a more important default\. In addition, the user deploying the application may not have permission to install gems to the system, or the web server may not have permission to read them\.
.
.IP
As a result, \fBbundle install \-\-deployment\fR installs gems to the \fBvendor/bundle\fR directory in the application\. This may be overridden using the \fB\-\-path\fR option\.
.
.IP "" 0
.
.SH "SUDO USAGE"
By default, Bundler installs gems to the same location as \fBgem install\fR\.
.
.P
In some cases, that location may not be writable by your Unix user\. In that case, Bundler will stage everything in a temporary directory, then ask you for your \fBsudo\fR password in order to copy the gems into their system location\.
.
.P
From your perspective, this is identical to installing the gems directly into the system\.
.
.P
You should never use \fBsudo bundle install\fR\. This is because several other steps in \fBbundle install\fR must be performed as the current user:
.
.IP "\(bu" 4
Updating your \fBGemfile\.lock\fR
.
.IP "\(bu" 4
Updating your \fBvendor/cache\fR, if necessary
.
.IP "\(bu" 4
Checking out private git repositories using your user\'s SSH keys
.
.IP "" 0
.
.P
Of these three, the first two could theoretically be performed by \fBchown\fRing the resulting files to \fB$SUDO_USER\fR\. The third, however, can only be performed by invoking the \fBgit\fR command as the current user\. Therefore, git gems are downloaded and installed into \fB~/\.bundle\fR rather than $GEM_HOME or $BUNDLE_PATH\.
.
.P
As a result, you should run \fBbundle install\fR as the current user, and Bundler will ask for your password if it is needed to put the gems into their final location\.
.
.SH "INSTALLING GROUPS"
By default, \fBbundle install\fR will install all gems in all groups in your Gemfile(5), except those declared for a different platform\.
.
.P
However, you can explicitly tell Bundler to skip installing certain groups with the \fB\-\-without\fR option\. This option takes a space\-separated list of groups\.
.
.P
While the \fB\-\-without\fR option will skip \fIinstalling\fR the gems in the specified groups, it will still \fIdownload\fR those gems and use them to resolve the dependencies of every gem in your Gemfile(5)\.
.
.P
This is so that installing a different set of groups on another machine (such as a production server) will not change the gems and versions that you have already developed and tested against\.
.
.P
\fBBundler offers a rock\-solid guarantee that the third\-party code you are running in development and testing is also the third\-party code you are running in production\. You can choose to exclude some of that code in different environments, but you will never be caught flat\-footed by different versions of third\-party code being used in different environments\.\fR
.
.P
For a simple illustration, consider the following Gemfile(5):
.
.IP "" 4
.
.nf

source \'https://rubygems\.org\'

gem \'sinatra\'

group :production do
  gem \'rack\-perftools\-profiler\'
end
.
.fi
.
.IP "" 0
.
.P
In this case, \fBsinatra\fR depends on any version of Rack (\fB>= 1\.0\fR), while \fBrack\-perftools\-profiler\fR depends on 1\.x (\fB~> 1\.0\fR)\.
.
.P
When you run \fBbundle install \-\-without production\fR in development, we look at the dependencies of \fBrack\-perftools\-profiler\fR as well\. That way, you do not spend all your time developing against Rack 2\.0, using new APIs unavailable in Rack 1\.x, only to have Bundler switch to Rack 1\.2 when the \fBproduction\fR group \fIis\fR used\.
.
.P
This should not cause any problems in practice, because we do not attempt to \fBinstall\fR the gems in the excluded groups, and only evaluate as part of the dependency resolution process\.
.
.P
This also means that you cannot include different versions of the same gem in different groups, because doing so would result in different sets of dependencies used in development and production\. Because of the vagaries of the dependency resolution process, this usually affects more than the gems you list in your Gemfile(5), and can (surprisingly) radically change the gems you are using\.
.
.SH "THE GEMFILE\.LOCK"
When you run \fBbundle install\fR, Bundler will persist the full names and versions of all gems that you used (including dependencies of the gems specified in the Gemfile(5)) into a file called \fBGemfile\.lock\fR\.
.
.P
Bundler uses this file in all subsequent calls to \fBbundle install\fR, which guarantees that you always use the same exact code, even as your application moves across machines\.
.
.P
Because of the way dependency resolution works, even a seemingly small change (for instance, an update to a point\-release of a dependency of a gem in your Gemfile(5)) can result in radically different gems being needed to satisfy all dependencies\.
.
.P
As a result, you \fBSHOULD\fR check your \fBGemfile\.lock\fR into version control, in both applications and gems\. If you do not, every machine that checks out your repository (including your production server) will resolve all dependencies again, which will result in different versions of third\-party code being used if \fBany\fR of the gems in the Gemfile(5) or any of their dependencies have been updated\.
.
.P
When Bundler first shipped, the \fBGemfile\.lock\fR was included in the \fB\.gitignore\fR file included with generated gems\. Over time, however, it became clear that this practice forces the pain of broken dependencies onto new contributors, while leaving existing contributors potentially unaware of the problem\. Since \fBbundle install\fR is usually the first step towards a contribution, the pain of broken dependencies would discourage new contributors from contributing\. As a result, we have revised our guidance for gem authors to now recommend checking in the lock for gems\.
.
.SH "CONSERVATIVE UPDATING"
When you make a change to the Gemfile(5) and then run \fBbundle install\fR, Bundler will update only the gems that you modified\.
.
.P
In other words, if a gem that you \fBdid not modify\fR worked before you called \fBbundle install\fR, it will continue to use the exact same versions of all dependencies as it used before the update\.
.
.P
Let\'s take a look at an example\. Here\'s your original Gemfile(5):
.
.IP "" 4
.
.nf

source \'https://rubygems\.org\'

gem \'actionpack\', \'2\.3\.8\'
gem \'activemerchant\'
.
.fi
.
.IP "" 0
.
.P
In this case, both \fBactionpack\fR and \fBactivemerchant\fR depend on \fBactivesupport\fR\. The \fBactionpack\fR gem depends on \fBactivesupport 2\.3\.8\fR and \fBrack ~> 1\.1\.0\fR, while the \fBactivemerchant\fR gem depends on \fBactivesupport >= 2\.3\.2\fR, \fBbraintree >= 2\.0\.0\fR, and \fBbuilder >= 2\.0\.0\fR\.
.
.P
When the dependencies are first resolved, Bundler will select \fBactivesupport 2\.3\.8\fR, which satisfies the requirements of both gems in your Gemfile(5)\.
.
.P
Next, you modify your Gemfile(5) to:
.
.IP "" 4
.
.nf

source \'https://rubygems\.org\'

gem \'actionpack\', \'3\.0\.0\.rc\'
gem \'activemerchant\'
.
.fi
.
.IP "" 0
.
.P
The \fBactionpack 3\.0\.0\.rc\fR gem has a number of new dependencies, and updates the \fBactivesupport\fR dependency to \fB= 3\.0\.0\.rc\fR and the \fBrack\fR dependency to \fB~> 1\.2\.1\fR\.
.
.P
When you run \fBbundle install\fR, Bundler notices that you changed the \fBactionpack\fR gem, but not the \fBactivemerchant\fR gem\. It evaluates the gems currently being used to satisfy its requirements:
.
.TP
\fBactivesupport 2\.3\.8\fR
also used to satisfy a dependency in \fBactivemerchant\fR, which is not being updated
.
.TP
\fBrack ~> 1\.1\.0\fR
not currently being used to satisfy another dependency
.
.P
Because you did not explicitly ask to update \fBactivemerchant\fR, you would not expect it to suddenly stop working after updating \fBactionpack\fR\. However, satisfying the new \fBactivesupport 3\.0\.0\.rc\fR dependency of actionpack requires updating one of its dependencies\.
.
.P
Even though \fBactivemerchant\fR declares a very loose dependency that theoretically matches \fBactivesupport 3\.0\.0\.rc\fR, Bundler treats gems in your Gemfile(5) that have not changed as an atomic unit together with their dependencies\. In this case, the \fBactivemerchant\fR dependency is treated as \fBactivemerchant 1\.7\.1 + activesupport 2\.3\.8\fR, so \fBbundle install\fR will report that it cannot update \fBactionpack\fR\.
.
.P
To explicitly update \fBactionpack\fR, including its dependencies which other gems in the Gemfile(5) still depend on, run \fBbundle update actionpack\fR (see \fBbundle update(1)\fR)\.
.
.P
\fBSummary\fR: In general, after making a change to the Gemfile(5) , you should first try to run \fBbundle install\fR, which will guarantee that no other gem in the Gemfile(5) is impacted by the change\. If that does not work, run bundle update(1) \fIbundle\-update\.1\.html\fR\.
.
.SH "SEE ALSO"
.
.IP "\(bu" 4
Gem install docs \fIhttp://guides\.rubygems\.org/rubygems\-basics/#installing\-gems\fR
.
.IP "\(bu" 4
Rubygems signing docs \fIhttp://guides\.rubygems\.org/security/\fR
.
.IP "" 0

PK}$[;�H��man/man1/bundle-clean.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-CLEAN" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory
.
.SH "SYNOPSIS"
\fBbundle clean\fR [\-\-dry\-run] [\-\-force]
.
.SH "DESCRIPTION"
This command will remove all unused gems in your bundler directory\. This is useful when you have made many changes to your gem dependencies\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-dry\-run\fR
Print the changes, but do not clean the unused gems\.
.
.TP
\fB\-\-force\fR
Forces cleaning up unused gems even if Bundler is configured to use globally installed gems\. As a consequence, removes all system gems except for the ones in the current application\.

PK}$[b�Mp

man/man1/bundle-outdated.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-OUTDATED" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-outdated\fR \- List installed gems with newer versions available
.
.SH "SYNOPSIS"
\fBbundle outdated\fR [GEM] [\-\-local] [\-\-pre] [\-\-source] [\-\-strict] [\-\-parseable | \-\-porcelain] [\-\-group=GROUP] [\-\-groups] [\-\-patch|\-\-minor|\-\-major] [\-\-filter\-major] [\-\-filter\-minor] [\-\-filter\-patch] [\-\-only\-explicit]
.
.SH "DESCRIPTION"
Outdated lists the names and versions of gems that have a newer version available in the given source\. Calling outdated with [GEM [GEM]] will only check for newer versions of the given gems\. Prerelease gems are ignored by default\. If your gems are up to date, Bundler will exit with a status of 0\. Otherwise, it will exit 1\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-local\fR
Do not attempt to fetch gems remotely and use the gem cache instead\.
.
.TP
\fB\-\-pre\fR
Check for newer pre\-release gems\.
.
.TP
\fB\-\-source\fR
Check against a specific source\.
.
.TP
\fB\-\-strict\fR
Only list newer versions allowed by your Gemfile requirements, also respecting conservative update flags (\-\-patch, \-\-minor, \-\-major)\.
.
.TP
\fB\-\-parseable\fR, \fB\-\-porcelain\fR
Use minimal formatting for more parseable output\.
.
.TP
\fB\-\-group\fR
List gems from a specific group\.
.
.TP
\fB\-\-groups\fR
List gems organized by groups\.
.
.TP
\fB\-\-minor\fR
Prefer updating only to next minor version\.
.
.TP
\fB\-\-major\fR
Prefer updating to next major version (default)\.
.
.TP
\fB\-\-patch\fR
Prefer updating only to next patch version\.
.
.TP
\fB\-\-filter\-major\fR
Only list major newer versions\.
.
.TP
\fB\-\-filter\-minor\fR
Only list minor newer versions\.
.
.TP
\fB\-\-filter\-patch\fR
Only list patch newer versions\.
.
.TP
\fB\-\-only\-explicit\fR
Only list gems specified in your Gemfile, not their dependencies\.
.
.SH "PATCH LEVEL OPTIONS"
See bundle update(1) \fIbundle\-update\.1\.html\fR for details\.
.
.SH "FILTERING OUTPUT"
The 3 filtering options do not affect the resolution of versions, merely what versions are shown in the output\.
.
.P
If the regular output shows the following:
.
.IP "" 4
.
.nf

* faker (newest 1\.6\.6, installed 1\.6\.5, requested ~> 1\.4) in groups "development, test"
* hashie (newest 3\.4\.6, installed 1\.2\.0, requested = 1\.2\.0) in groups "default"
* headless (newest 2\.3\.1, installed 2\.2\.3) in groups "test"
.
.fi
.
.IP "" 0
.
.P
\fB\-\-filter\-major\fR would only show:
.
.IP "" 4
.
.nf

* hashie (newest 3\.4\.6, installed 1\.2\.0, requested = 1\.2\.0) in groups "default"
.
.fi
.
.IP "" 0
.
.P
\fB\-\-filter\-minor\fR would only show:
.
.IP "" 4
.
.nf

* headless (newest 2\.3\.1, installed 2\.2\.3) in groups "test"
.
.fi
.
.IP "" 0
.
.P
\fB\-\-filter\-patch\fR would only show:
.
.IP "" 4
.
.nf

* faker (newest 1\.6\.6, installed 1\.6\.5, requested ~> 1\.4) in groups "development, test"
.
.fi
.
.IP "" 0
.
.P
Filter options can be combined\. \fB\-\-filter\-minor\fR and \fB\-\-filter\-patch\fR would show:
.
.IP "" 4
.
.nf

* faker (newest 1\.6\.6, installed 1\.6\.5, requested ~> 1\.4) in groups "development, test"
* headless (newest 2\.3\.1, installed 2\.2\.3) in groups "test"
.
.fi
.
.IP "" 0
.
.P
Combining all three \fBfilter\fR options would be the same result as providing none of them\.
PK}$["�:11man/man1/bundle-add.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-ADD" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-add\fR \- Add gem to the Gemfile and run bundle install
.
.SH "SYNOPSIS"
\fBbundle add\fR \fIGEM_NAME\fR [\-\-group=GROUP] [\-\-version=VERSION] [\-\-source=SOURCE] [\-\-path=PATH] [\-\-git=GIT] [\-\-github=GITHUB] [\-\-branch=BRANCH] [\-\-ref=REF] [\-\-skip\-install] [\-\-strict] [\-\-optimistic]
.
.SH "DESCRIPTION"
Adds the named gem to the Gemfile and run \fBbundle install\fR\. \fBbundle install\fR can be avoided by using the flag \fB\-\-skip\-install\fR\.
.
.P
Example:
.
.P
bundle add rails
.
.P
bundle add rails \-\-version "< 3\.0, > 1\.1"
.
.P
bundle add rails \-\-version "~> 5\.0\.0" \-\-source "https://gems\.example\.com" \-\-group "development"
.
.P
bundle add rails \-\-skip\-install
.
.P
bundle add rails \-\-group "development, test"
.
.SH "OPTIONS"
.
.TP
\fB\-\-version\fR, \fB\-v\fR
Specify version requirements(s) for the added gem\.
.
.TP
\fB\-\-group\fR, \fB\-g\fR
Specify the group(s) for the added gem\. Multiple groups should be separated by commas\.
.
.TP
\fB\-\-source\fR, \fB\-s\fR
Specify the source for the added gem\.
.
.TP
\fB\-\-require\fR, \fB\-r\fR
Adds require path to gem\. Provide false, or a path as a string\.
.
.TP
\fB\-\-path\fR
Specify the file system path for the added gem\.
.
.TP
\fB\-\-git\fR
Specify the git source for the added gem\.
.
.TP
\fB\-\-github\fR
Specify the github source for the added gem\.
.
.TP
\fB\-\-branch\fR
Specify the git branch for the added gem\.
.
.TP
\fB\-\-ref\fR
Specify the git ref for the added gem\.
.
.TP
\fB\-\-skip\-install\fR
Adds the gem to the Gemfile but does not install it\.
.
.TP
\fB\-\-optimistic\fR
Adds optimistic declaration of version\.
.
.TP
\fB\-\-strict\fR
Adds strict declaration of version\.

PK}$[��]]man/man1/bundle-exec.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-EXEC" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-exec\fR \- Execute a command in the context of the bundle
.
.SH "SYNOPSIS"
\fBbundle exec\fR [\-\-keep\-file\-descriptors] \fIcommand\fR
.
.SH "DESCRIPTION"
This command executes the command, making all gems specified in the [\fBGemfile(5)\fR][Gemfile(5)] available to \fBrequire\fR in Ruby programs\.
.
.P
Essentially, if you would normally have run something like \fBrspec spec/my_spec\.rb\fR, and you want to use the gems specified in the [\fBGemfile(5)\fR][Gemfile(5)] and installed via bundle install(1) \fIbundle\-install\.1\.html\fR, you should run \fBbundle exec rspec spec/my_spec\.rb\fR\.
.
.P
Note that \fBbundle exec\fR does not require that an executable is available on your shell\'s \fB$PATH\fR\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-keep\-file\-descriptors\fR
Exec in Ruby 2\.0 began discarding non\-standard file descriptors\. When this flag is passed, exec will revert to the 1\.9 behaviour of passing all file descriptors to the new process\.
.
.SH "BUNDLE INSTALL \-\-BINSTUBS"
If you use the \fB\-\-binstubs\fR flag in bundle install(1) \fIbundle\-install\.1\.html\fR, Bundler will automatically create a directory (which defaults to \fBapp_root/bin\fR) containing all of the executables available from gems in the bundle\.
.
.P
After using \fB\-\-binstubs\fR, \fBbin/rspec spec/my_spec\.rb\fR is identical to \fBbundle exec rspec spec/my_spec\.rb\fR\.
.
.SH "ENVIRONMENT MODIFICATIONS"
\fBbundle exec\fR makes a number of changes to the shell environment, then executes the command you specify in full\.
.
.IP "\(bu" 4
make sure that it\'s still possible to shell out to \fBbundle\fR from inside a command invoked by \fBbundle exec\fR (using \fB$BUNDLE_BIN_PATH\fR)
.
.IP "\(bu" 4
put the directory containing executables (like \fBrails\fR, \fBrspec\fR, \fBrackup\fR) for your bundle on \fB$PATH\fR
.
.IP "\(bu" 4
make sure that if bundler is invoked in the subshell, it uses the same \fBGemfile\fR (by setting \fBBUNDLE_GEMFILE\fR)
.
.IP "\(bu" 4
add \fB\-rbundler/setup\fR to \fB$RUBYOPT\fR, which makes sure that Ruby programs invoked in the subshell can see the gems in the bundle
.
.IP "" 0
.
.P
It also modifies Rubygems:
.
.IP "\(bu" 4
disallow loading additional gems not in the bundle
.
.IP "\(bu" 4
modify the \fBgem\fR method to be a no\-op if a gem matching the requirements is in the bundle, and to raise a \fBGem::LoadError\fR if it\'s not
.
.IP "\(bu" 4
Define \fBGem\.refresh\fR to be a no\-op, since the source index is always frozen when using bundler, and to prevent gems from the system leaking into the environment
.
.IP "\(bu" 4
Override \fBGem\.bin_path\fR to use the gems in the bundle, making system executables work
.
.IP "\(bu" 4
Add all gems in the bundle into Gem\.loaded_specs
.
.IP "" 0
.
.P
Finally, \fBbundle exec\fR also implicitly modifies \fBGemfile\.lock\fR if the lockfile and the Gemfile do not match\. Bundler needs the Gemfile to determine things such as a gem\'s groups, \fBautorequire\fR, and platforms, etc\., and that information isn\'t stored in the lockfile\. The Gemfile and lockfile must be synced in order to \fBbundle exec\fR successfully, so \fBbundle exec\fR updates the lockfile beforehand\.
.
.SS "Loading"
By default, when attempting to \fBbundle exec\fR to a file with a ruby shebang, Bundler will \fBKernel\.load\fR that file instead of using \fBKernel\.exec\fR\. For the vast majority of cases, this is a performance improvement\. In a rare few cases, this could cause some subtle side\-effects (such as dependence on the exact contents of \fB$0\fR or \fB__FILE__\fR) and the optimization can be disabled by enabling the \fBdisable_exec_load\fR setting\.
.
.SS "Shelling out"
Any Ruby code that opens a subshell (like \fBsystem\fR, backticks, or \fB%x{}\fR) will automatically use the current Bundler environment\. If you need to shell out to a Ruby command that is not part of your current bundle, use the \fBwith_clean_env\fR method with a block\. Any subshells created inside the block will be given the environment present before Bundler was activated\. For example, Homebrew commands run Ruby, but don\'t work inside a bundle:
.
.IP "" 4
.
.nf

Bundler\.with_clean_env do
  `brew install wget`
end
.
.fi
.
.IP "" 0
.
.P
Using \fBwith_clean_env\fR is also necessary if you are shelling out to a different bundle\. Any Bundler commands run in a subshell will inherit the current Gemfile, so commands that need to run in the context of a different bundle also need to use \fBwith_clean_env\fR\.
.
.IP "" 4
.
.nf

Bundler\.with_clean_env do
  Dir\.chdir "/other/bundler/project" do
    `bundle exec \./script`
  end
end
.
.fi
.
.IP "" 0
.
.P
Bundler provides convenience helpers that wrap \fBsystem\fR and \fBexec\fR, and they can be used like this:
.
.IP "" 4
.
.nf

Bundler\.clean_system(\'brew install wget\')
Bundler\.clean_exec(\'brew install wget\')
.
.fi
.
.IP "" 0
.
.SH "RUBYGEMS PLUGINS"
At present, the Rubygems plugin system requires all files named \fBrubygems_plugin\.rb\fR on the load path of \fIany\fR installed gem when any Ruby code requires \fBrubygems\.rb\fR\. This includes executables installed into the system, like \fBrails\fR, \fBrackup\fR, and \fBrspec\fR\.
.
.P
Since Rubygems plugins can contain arbitrary Ruby code, they commonly end up activating themselves or their dependencies\.
.
.P
For instance, the \fBgemcutter 0\.5\fR gem depended on \fBjson_pure\fR\. If you had that version of gemcutter installed (even if you \fIalso\fR had a newer version without this problem), Rubygems would activate \fBgemcutter 0\.5\fR and \fBjson_pure <latest>\fR\.
.
.P
If your Gemfile(5) also contained \fBjson_pure\fR (or a gem with a dependency on \fBjson_pure\fR), the latest version on your system might conflict with the version in your Gemfile(5), or the snapshot version in your \fBGemfile\.lock\fR\.
.
.P
If this happens, bundler will say:
.
.IP "" 4
.
.nf

You have already activated json_pure 1\.4\.6 but your Gemfile
requires json_pure 1\.4\.3\. Consider using bundle exec\.
.
.fi
.
.IP "" 0
.
.P
In this situation, you almost certainly want to remove the underlying gem with the problematic gem plugin\. In general, the authors of these plugins (in this case, the \fBgemcutter\fR gem) have released newer versions that are more careful in their plugins\.
.
.P
You can find a list of all the gems containing gem plugins by running
.
.IP "" 4
.
.nf

ruby \-e "puts Gem\.find_files(\'rubygems_plugin\.rb\')"
.
.fi
.
.IP "" 0
.
.P
At the very least, you should remove all but the newest version of each gem plugin, and also remove all gem plugins that you aren\'t using (\fBgem uninstall gem_name\fR)\.
PK}$[B�:��man/man1/bundle-help.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-HELP" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-help\fR \- Displays detailed help for each subcommand
.
.SH "SYNOPSIS"
\fBbundle help\fR [COMMAND]
.
.SH "DESCRIPTION"
Displays detailed help for the given subcommand\. You can specify a single \fBCOMMAND\fR at the same time\. When \fBCOMMAND\fR is omitted, help for \fBhelp\fR command will be displayed\.
PK}$[�[�n��man/man1/bundle-check.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-CHECK" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-check\fR \- Verifies if dependencies are satisfied by installed gems
.
.SH "SYNOPSIS"
\fBbundle check\fR [\-\-dry\-run] [\-\-gemfile=FILE] [\-\-path=PATH]
.
.SH "DESCRIPTION"
\fBcheck\fR searches the local machine for each of the gems requested in the Gemfile\. If all gems are found, Bundler prints a success message and exits with a status of 0\.
.
.P
If not, the first missing gem is listed and Bundler exits status 1\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-dry\-run\fR
Locks the [\fBGemfile(5)\fR][Gemfile(5)] before running the command\.
.
.TP
\fB\-\-gemfile\fR
Use the specified gemfile instead of the [\fBGemfile(5)\fR][Gemfile(5)]\.
.
.TP
\fB\-\-path\fR
Specify a different path than the system default (\fB$BUNDLE_PATH\fR or \fB$GEM_HOME\fR)\. Bundler will remember this value for future installs on this machine\.

PK}$[Ժ�p��man/man1/bundle.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\fR \- Ruby Dependency Management
.
.SH "SYNOPSIS"
\fBbundle\fR COMMAND [\-\-no\-color] [\-\-verbose] [ARGS]
.
.SH "DESCRIPTION"
Bundler manages an \fBapplication\'s dependencies\fR through its entire life across many machines systematically and repeatably\.
.
.P
See the bundler website \fIhttps://bundler\.io\fR for information on getting started, and Gemfile(5) for more information on the \fBGemfile\fR format\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-no\-color\fR
Print all output without color
.
.TP
\fB\-\-retry\fR, \fB\-r\fR
Specify the number of times you wish to attempt network commands
.
.TP
\fB\-\-verbose\fR, \fB\-V\fR
Print out additional logging information
.
.SH "BUNDLE COMMANDS"
We divide \fBbundle\fR subcommands into primary commands and utilities:
.
.SH "PRIMARY COMMANDS"
.
.TP
\fBbundle install(1)\fR \fIbundle\-install\.1\.html\fR
Install the gems specified by the \fBGemfile\fR or \fBGemfile\.lock\fR
.
.TP
\fBbundle update(1)\fR \fIbundle\-update\.1\.html\fR
Update dependencies to their latest versions
.
.TP
\fBbundle cache(1)\fR \fIbundle\-cache\.1\.html\fR
Package the \.gem files required by your application into the \fBvendor/cache\fR directory (aliases: \fBbundle package\fR, \fBbundle pack\fR)
.
.TP
\fBbundle exec(1)\fR \fIbundle\-exec\.1\.html\fR
Execute a script in the current bundle
.
.TP
\fBbundle config(1)\fR \fIbundle\-config\.1\.html\fR
Specify and read configuration options for Bundler
.
.TP
\fBbundle help(1)\fR \fIbundle\-help\.1\.html\fR
Display detailed help for each subcommand
.
.SH "UTILITIES"
.
.TP
\fBbundle add(1)\fR \fIbundle\-add\.1\.html\fR
Add the named gem to the Gemfile and run \fBbundle install\fR
.
.TP
\fBbundle binstubs(1)\fR \fIbundle\-binstubs\.1\.html\fR
Generate binstubs for executables in a gem
.
.TP
\fBbundle check(1)\fR \fIbundle\-check\.1\.html\fR
Determine whether the requirements for your application are installed and available to Bundler
.
.TP
\fBbundle show(1)\fR \fIbundle\-show\.1\.html\fR
Show the source location of a particular gem in the bundle
.
.TP
\fBbundle outdated(1)\fR \fIbundle\-outdated\.1\.html\fR
Show all of the outdated gems in the current bundle
.
.TP
\fBbundle console(1)\fR (deprecated)
Start an IRB session in the current bundle
.
.TP
\fBbundle open(1)\fR \fIbundle\-open\.1\.html\fR
Open an installed gem in the editor
.
.TP
\fBbundle lock(1)\fR \fIbundle\-lock\.1\.html\fR
Generate a lockfile for your dependencies
.
.TP
\fBbundle viz(1)\fR \fIbundle\-viz\.1\.html\fR (deprecated)
Generate a visual representation of your dependencies
.
.TP
\fBbundle init(1)\fR \fIbundle\-init\.1\.html\fR
Generate a simple \fBGemfile\fR, placed in the current directory
.
.TP
\fBbundle gem(1)\fR \fIbundle\-gem\.1\.html\fR
Create a simple gem, suitable for development with Bundler
.
.TP
\fBbundle platform(1)\fR \fIbundle\-platform\.1\.html\fR
Display platform compatibility information
.
.TP
\fBbundle clean(1)\fR \fIbundle\-clean\.1\.html\fR
Clean up unused gems in your Bundler directory
.
.TP
\fBbundle doctor(1)\fR \fIbundle\-doctor\.1\.html\fR
Display warnings about common problems
.
.TP
\fBbundle remove(1)\fR \fIbundle\-remove\.1\.html\fR
Removes gems from the Gemfile
.
.TP
\fBbundle plugin(1)\fR \fIbundle\-plugin\.1\.html\fR
Manage Bundler plugins
.
.TP
\fBbundle version(1)\fR \fIbundle\-version\.1\.html\fR
Prints Bundler version information
.
.SH "PLUGINS"
When running a command that isn\'t listed in PRIMARY COMMANDS or UTILITIES, Bundler will try to find an executable on your path named \fBbundler\-<command>\fR and execute it, passing down any extra arguments to it\.
.
.SH "OBSOLETE"
These commands are obsolete and should no longer be used:
.
.IP "\(bu" 4
\fBbundle inject(1)\fR
.
.IP "" 0

PK}$[1��>��man/man1/bundle-console.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-CONSOLE" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-console\fR \- Deprecated way to open an IRB session with the bundle pre\-loaded
.
.SH "SYNOPSIS"
\fBbundle console\fR [GROUP]
.
.SH "DESCRIPTION"
Starts an interactive Ruby console session in the context of the current bundle\.
.
.P
If no \fBGROUP\fR is specified, all gems in the \fBdefault\fR group in the Gemfile(5) \fIhttps://bundler\.io/man/gemfile\.5\.html\fR are preliminarily loaded\.
.
.P
If \fBGROUP\fR is specified, all gems in the given group in the Gemfile in addition to the gems in \fBdefault\fR group are loaded\. Even if the given group does not exist in the Gemfile, IRB console starts without any warning or error\.
.
.P
The environment variable \fBBUNDLE_CONSOLE\fR or \fBbundle config set console\fR can be used to change the shell from the following:
.
.IP "\(bu" 4
\fBirb\fR (default)
.
.IP "\(bu" 4
\fBpry\fR (https://github\.com/pry/pry)
.
.IP "\(bu" 4
\fBripl\fR (https://github\.com/cldwalker/ripl)
.
.IP "" 0
.
.P
\fBbundle console\fR uses irb by default\. An alternative Pry or Ripl can be used with \fBbundle console\fR by adjusting the \fBconsole\fR Bundler setting\. Also make sure that \fBpry\fR or \fBripl\fR is in your Gemfile\.
.
.SH "EXAMPLE"
.
.nf

$ bundle config set console pry
$ bundle console
Resolving dependencies\.\.\.
[1] pry(main)>
.
.fi
.
.SH "NOTES"
This command was deprecated in Bundler 2\.1 and will be removed in 3\.0\. Use \fBbin/console\fR script, which can be generated by \fBbundle gem <NAME>\fR\.
.
.SH "SEE ALSO"
Gemfile(5) \fIhttps://bundler\.io/man/gemfile\.5\.html\fR
PK}$[M��66man/man1/bundle-init.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-INIT" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-init\fR \- Generates a Gemfile into the current working directory
.
.SH "SYNOPSIS"
\fBbundle init\fR [\-\-gemspec=FILE]
.
.SH "DESCRIPTION"
Init generates a default [\fBGemfile(5)\fR][Gemfile(5)] in the current working directory\. When adding a [\fBGemfile(5)\fR][Gemfile(5)] to a gem with a gemspec, the \fB\-\-gemspec\fR option will automatically add each dependency listed in the gemspec file to the newly created [\fBGemfile(5)\fR][Gemfile(5)]\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-gemspec\fR
Use the specified \.gemspec to create the [\fBGemfile(5)\fR][Gemfile(5)]
.
.SH "FILES"
Included in the default [\fBGemfile(5)\fR][Gemfile(5)] generated is the line \fB# frozen_string_literal: true\fR\. This is a magic comment supported for the first time in Ruby 2\.3\. The presence of this line results in all string literals in the file being implicitly frozen\.
.
.SH "SEE ALSO"
Gemfile(5) \fIhttps://bundler\.io/man/gemfile\.5\.html\fR
PK}$[�#K���man/man1/bundle-info.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-INFO" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-info\fR \- Show information for the given gem in your bundle
.
.SH "SYNOPSIS"
\fBbundle info\fR [GEM] [\-\-path]
.
.SH "DESCRIPTION"
Print the basic information about the provided GEM such as homepage, version, path and summary\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-path\fR
Print the path of the given gem

PK}$[�:�RPPman/man1/bundle-remove.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-REMOVE" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-remove\fR \- Removes gems from the Gemfile
.
.SH "SYNOPSIS"
\fBbundle remove [GEM [GEM \.\.\.]] [\-\-install]\fR
.
.SH "DESCRIPTION"
Removes the given gems from the Gemfile while ensuring that the resulting Gemfile is still valid\. If a gem cannot be removed, a warning is printed\. If a gem is already absent from the Gemfile, and error is raised\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-install\fR
Runs \fBbundle install\fR after the given gems have been removed from the Gemfile, which ensures that both the lockfile and the installed gems on disk are also updated to remove the given gem(s)\.
.
.P
Example:
.
.P
bundle remove rails
.
.P
bundle remove rails rack
.
.P
bundle remove rails rack \-\-install
PK}$[=��q��man/man1/bundle-show.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-SHOW" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem
.
.SH "SYNOPSIS"
\fBbundle show\fR [GEM] [\-\-paths]
.
.SH "DESCRIPTION"
Without the [GEM] option, \fBshow\fR will print a list of the names and versions of all gems that are required by your [\fBGemfile(5)\fR][Gemfile(5)], sorted by name\.
.
.P
Calling show with [GEM] will list the exact location of that gem on your machine\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-paths\fR
List the paths of all gems that are required by your [\fBGemfile(5)\fR][Gemfile(5)], sorted by gem name\.

PK}$[�I�OOman/man1/bundle-binstubs.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-BINSTUBS" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-binstubs\fR \- Install the binstubs of the listed gems
.
.SH "SYNOPSIS"
\fBbundle binstubs\fR \fIGEM_NAME\fR [\-\-force] [\-\-path PATH] [\-\-standalone]
.
.SH "DESCRIPTION"
Binstubs are scripts that wrap around executables\. Bundler creates a small Ruby file (a binstub) that loads Bundler, runs the command, and puts it into \fBbin/\fR\. Binstubs are a shortcut\-or alternative\- to always using \fBbundle exec\fR\. This gives you a file that can be run directly, and one that will always run the correct gem version used by the application\.
.
.P
For example, if you run \fBbundle binstubs rspec\-core\fR, Bundler will create the file \fBbin/rspec\fR\. That file will contain enough code to load Bundler, tell it to load the bundled gems, and then run rspec\.
.
.P
This command generates binstubs for executables in \fBGEM_NAME\fR\. Binstubs are put into \fBbin\fR, or the \fB\-\-path\fR directory if one has been set\. Calling binstubs with [GEM [GEM]] will create binstubs for all given gems\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-force\fR
Overwrite existing binstubs if they exist\.
.
.TP
\fB\-\-path\fR
The location to install the specified binstubs to\. This defaults to \fBbin\fR\.
.
.TP
\fB\-\-standalone\fR
Makes binstubs that can work without depending on Rubygems or Bundler at runtime\.
.
.TP
\fB\-\-shebang\fR
Specify a different shebang executable name than the default (default \'ruby\')
.
.TP
\fB\-\-all\fR
Create binstubs for all gems in the bundle\.

PK}$[^A�I��man/man1/bundle-viz.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-VIZ" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-viz\fR \- Generates a visual dependency graph for your Gemfile
.
.SH "SYNOPSIS"
\fBbundle viz\fR [\-\-file=FILE] [\-\-format=FORMAT] [\-\-requirements] [\-\-version] [\-\-without=GROUP GROUP]
.
.SH "DESCRIPTION"
\fBviz\fR generates a PNG file of the current \fBGemfile(5)\fR as a dependency graph\. \fBviz\fR requires the ruby\-graphviz gem (and its dependencies)\.
.
.P
The associated gems must also be installed via \fBbundle install(1)\fR \fIbundle\-install\.1\.html\fR\.
.
.P
\fBviz\fR command was deprecated in Bundler 2\.2\. Use bundler\-graph plugin \fIhttps://github\.com/rubygems/bundler\-graph\fR instead\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-file\fR, \fB\-f\fR
The name to use for the generated file\. See \fB\-\-format\fR option
.
.TP
\fB\-\-format\fR, \fB\-F\fR
This is output format option\. Supported format is png, jpg, svg, dot \.\.\.
.
.TP
\fB\-\-requirements\fR, \fB\-R\fR
Set to show the version of each required dependency\.
.
.TP
\fB\-\-version\fR, \fB\-v\fR
Set to show each gem version\.
.
.TP
\fB\-\-without\fR, \fB\-W\fR
Exclude gems that are part of the specified named group\.

PK}$[����man/man1/bundle-version.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-VERSION" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-version\fR \- Prints Bundler version information
.
.SH "SYNOPSIS"
\fBbundle version\fR
.
.SH "DESCRIPTION"
Prints Bundler version information\.
.
.SH "OPTIONS"
No options\.
.
.SH "EXAMPLE"
Print the version of Bundler with build date and commit hash of the in the Git source\.
.
.IP "" 4
.
.nf

bundle version
.
.fi
.
.IP "" 0
.
.P
shows \fBBundler version 2\.3\.21 (2022\-08\-24 commit d54be5fdd8)\fR for example\.
.
.P
cf\. \fBbundle \-\-version\fR shows \fBBundler version 2\.3\.21\fR\.
PK}$[$�q���man/man1/bundle-doctor.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-DOCTOR" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-doctor\fR \- Checks the bundle for common problems
.
.SH "SYNOPSIS"
\fBbundle doctor\fR [\-\-quiet] [\-\-gemfile=GEMFILE]
.
.SH "DESCRIPTION"
Checks your Gemfile and gem environment for common problems\. If issues are detected, Bundler prints them and exits status 1\. Otherwise, Bundler prints a success message and exits status 0\.
.
.P
Examples of common problems caught by bundle\-doctor include:
.
.IP "\(bu" 4
Invalid Bundler settings
.
.IP "\(bu" 4
Mismatched Ruby versions
.
.IP "\(bu" 4
Mismatched platforms
.
.IP "\(bu" 4
Uninstalled gems
.
.IP "\(bu" 4
Missing dependencies
.
.IP "" 0
.
.SH "OPTIONS"
.
.TP
\fB\-\-quiet\fR
Only output warnings and errors\.
.
.TP
\fB\-\-gemfile=<gemfile>\fR
The location of the Gemfile(5) which Bundler should use\. This defaults to a Gemfile(5) in the current working directory\. In general, Bundler will assume that the location of the Gemfile(5) is also the project\'s root and will try to find \fBGemfile\.lock\fR and \fBvendor/cache\fR relative to this location\.

PK}$[��O�U�Uman/man1/bundle-config.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-CONFIG" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-config\fR \- Set bundler configuration options
.
.SH "SYNOPSIS"
\fBbundle config\fR list
.
.br
\fBbundle config\fR [get] NAME
.
.br
\fBbundle config\fR [set] NAME VALUE
.
.br
\fBbundle config\fR unset NAME
.
.SH "DESCRIPTION"
This command allows you to interact with Bundler\'s configuration system\.
.
.P
Bundler loads configuration settings in this order:
.
.IP "1." 4
Local config (\fB<project_root>/\.bundle/config\fR or \fB$BUNDLE_APP_CONFIG/config\fR)
.
.IP "2." 4
Environmental variables (\fBENV\fR)
.
.IP "3." 4
Global config (\fB~/\.bundle/config\fR)
.
.IP "4." 4
Bundler default config
.
.IP "" 0
.
.P
Executing \fBbundle config list\fR with will print a list of all bundler configuration for the current bundle, and where that configuration was set\.
.
.P
Executing \fBbundle config get <name>\fR will print the value of that configuration setting, and where it was set\.
.
.P
Executing \fBbundle config set <name> <value>\fR defaults to setting \fBlocal\fR configuration if executing from within a local application, otherwise it will set \fBglobal\fR configuration\. See \fB\-\-local\fR and \fB\-\-global\fR options below\.
.
.P
Executing \fBbundle config set \-\-local <name> <value>\fR will set that configuration in the directory for the local application\. The configuration will be stored in \fB<project_root>/\.bundle/config\fR\. If \fBBUNDLE_APP_CONFIG\fR is set, the configuration will be stored in \fB$BUNDLE_APP_CONFIG/config\fR\.
.
.P
Executing \fBbundle config set \-\-global <name> <value>\fR will set that configuration to the value specified for all bundles executed as the current user\. The configuration will be stored in \fB~/\.bundle/config\fR\. If \fIname\fR already is set, \fIname\fR will be overridden and user will be warned\.
.
.P
Executing \fBbundle config unset <name>\fR will delete the configuration in both local and global sources\.
.
.P
Executing \fBbundle config unset \-\-global <name>\fR will delete the configuration only from the user configuration\.
.
.P
Executing \fBbundle config unset \-\-local <name>\fR will delete the configuration only from the local application\.
.
.P
Executing bundle with the \fBBUNDLE_IGNORE_CONFIG\fR environment variable set will cause it to ignore all configuration\.
.
.SH "REMEMBERING OPTIONS"
Flags passed to \fBbundle install\fR or the Bundler runtime, such as \fB\-\-path foo\fR or \fB\-\-without production\fR, are remembered between commands and saved to your local application\'s configuration (normally, \fB\./\.bundle/config\fR)\.
.
.P
However, this will be changed in bundler 3, so it\'s better not to rely on this behavior\. If these options must be remembered, it\'s better to set them using \fBbundle config\fR (e\.g\., \fBbundle config set \-\-local path foo\fR)\.
.
.P
The options that can be configured are:
.
.TP
\fBbin\fR
Creates a directory (defaults to \fB~/bin\fR) and place any executables from the gem there\. These executables run in Bundler\'s context\. If used, you might add this directory to your environment\'s \fBPATH\fR variable\. For instance, if the \fBrails\fR gem comes with a \fBrails\fR executable, this flag will create a \fBbin/rails\fR executable that ensures that all referred dependencies will be resolved using the bundled gems\.
.
.TP
\fBdeployment\fR
In deployment mode, Bundler will \'roll\-out\' the bundle for \fBproduction\fR use\. Please check carefully if you want to have this option enabled in \fBdevelopment\fR or \fBtest\fR environments\.
.
.TP
\fBonly\fR
A space\-separated list of groups to install only gems of the specified groups\.
.
.TP
\fBpath\fR
The location to install the specified gems to\. This defaults to Rubygems\' setting\. Bundler shares this location with Rubygems, \fBgem install \.\.\.\fR will have gem installed there, too\. Therefore, gems installed without a \fB\-\-path \.\.\.\fR setting will show up by calling \fBgem list\fR\. Accordingly, gems installed to other locations will not get listed\.
.
.TP
\fBwithout\fR
A space\-separated list of groups referencing gems to skip during installation\.
.
.TP
\fBwith\fR
A space\-separated list of \fBoptional\fR groups referencing gems to include during installation\.
.
.SH "BUILD OPTIONS"
You can use \fBbundle config\fR to give Bundler the flags to pass to the gem installer every time bundler tries to install a particular gem\.
.
.P
A very common example, the \fBmysql\fR gem, requires Snow Leopard users to pass configuration flags to \fBgem install\fR to specify where to find the \fBmysql_config\fR executable\.
.
.IP "" 4
.
.nf

gem install mysql \-\- \-\-with\-mysql\-config=/usr/local/mysql/bin/mysql_config
.
.fi
.
.IP "" 0
.
.P
Since the specific location of that executable can change from machine to machine, you can specify these flags on a per\-machine basis\.
.
.IP "" 4
.
.nf

bundle config set \-\-global build\.mysql \-\-with\-mysql\-config=/usr/local/mysql/bin/mysql_config
.
.fi
.
.IP "" 0
.
.P
After running this command, every time bundler needs to install the \fBmysql\fR gem, it will pass along the flags you specified\.
.
.SH "CONFIGURATION KEYS"
Configuration keys in bundler have two forms: the canonical form and the environment variable form\.
.
.P
For instance, passing the \fB\-\-without\fR flag to bundle install(1) \fIbundle\-install\.1\.html\fR prevents Bundler from installing certain groups specified in the Gemfile(5)\. Bundler persists this value in \fBapp/\.bundle/config\fR so that calls to \fBBundler\.setup\fR do not try to find gems from the \fBGemfile\fR that you didn\'t install\. Additionally, subsequent calls to bundle install(1) \fIbundle\-install\.1\.html\fR remember this setting and skip those groups\.
.
.P
The canonical form of this configuration is \fB"without"\fR\. To convert the canonical form to the environment variable form, capitalize it, and prepend \fBBUNDLE_\fR\. The environment variable form of \fB"without"\fR is \fBBUNDLE_WITHOUT\fR\.
.
.P
Any periods in the configuration keys must be replaced with two underscores when setting it via environment variables\. The configuration key \fBlocal\.rack\fR becomes the environment variable \fBBUNDLE_LOCAL__RACK\fR\.
.
.SH "LIST OF AVAILABLE KEYS"
The following is a list of all configuration keys and their purpose\. You can learn more about their operation in bundle install(1) \fIbundle\-install\.1\.html\fR\.
.
.IP "\(bu" 4
\fBallow_deployment_source_credential_changes\fR (\fBBUNDLE_ALLOW_DEPLOYMENT_SOURCE_CREDENTIAL_CHANGES\fR): When in deployment mode, allow changing the credentials to a gem\'s source\. Ex: \fBhttps://some\.host\.com/gems/path/\fR \-> \fBhttps://user_name:password@some\.host\.com/gems/path\fR
.
.IP "\(bu" 4
\fBallow_offline_install\fR (\fBBUNDLE_ALLOW_OFFLINE_INSTALL\fR): Allow Bundler to use cached data when installing without network access\.
.
.IP "\(bu" 4
\fBauto_clean_without_path\fR (\fBBUNDLE_AUTO_CLEAN_WITHOUT_PATH\fR): Automatically run \fBbundle clean\fR after installing when an explicit \fBpath\fR has not been set and Bundler is not installing into the system gems\.
.
.IP "\(bu" 4
\fBauto_install\fR (\fBBUNDLE_AUTO_INSTALL\fR): Automatically run \fBbundle install\fR when gems are missing\.
.
.IP "\(bu" 4
\fBbin\fR (\fBBUNDLE_BIN\fR): Install executables from gems in the bundle to the specified directory\. Defaults to \fBfalse\fR\.
.
.IP "\(bu" 4
\fBcache_all\fR (\fBBUNDLE_CACHE_ALL\fR): Cache all gems, including path and git gems\. This needs to be explicitly configured on bundler 1 and bundler 2, but will be the default on bundler 3\.
.
.IP "\(bu" 4
\fBcache_all_platforms\fR (\fBBUNDLE_CACHE_ALL_PLATFORMS\fR): Cache gems for all platforms\.
.
.IP "\(bu" 4
\fBcache_path\fR (\fBBUNDLE_CACHE_PATH\fR): The directory that bundler will place cached gems in when running \fBbundle package\fR, and that bundler will look in when installing gems\. Defaults to \fBvendor/cache\fR\.
.
.IP "\(bu" 4
\fBclean\fR (\fBBUNDLE_CLEAN\fR): Whether Bundler should run \fBbundle clean\fR automatically after \fBbundle install\fR\.
.
.IP "\(bu" 4
\fBconsole\fR (\fBBUNDLE_CONSOLE\fR): The console that \fBbundle console\fR starts\. Defaults to \fBirb\fR\.
.
.IP "\(bu" 4
\fBdefault_install_uses_path\fR (\fBBUNDLE_DEFAULT_INSTALL_USES_PATH\fR): Whether a \fBbundle install\fR without an explicit \fB\-\-path\fR argument defaults to installing gems in \fB\.bundle\fR\.
.
.IP "\(bu" 4
\fBdeployment\fR (\fBBUNDLE_DEPLOYMENT\fR): Disallow changes to the \fBGemfile\fR\. When the \fBGemfile\fR is changed and the lockfile has not been updated, running Bundler commands will be blocked\.
.
.IP "\(bu" 4
\fBdisable_checksum_validation\fR (\fBBUNDLE_DISABLE_CHECKSUM_VALIDATION\fR): Allow installing gems even if they do not match the checksum provided by RubyGems\.
.
.IP "\(bu" 4
\fBdisable_exec_load\fR (\fBBUNDLE_DISABLE_EXEC_LOAD\fR): Stop Bundler from using \fBload\fR to launch an executable in\-process in \fBbundle exec\fR\.
.
.IP "\(bu" 4
\fBdisable_local_branch_check\fR (\fBBUNDLE_DISABLE_LOCAL_BRANCH_CHECK\fR): Allow Bundler to use a local git override without a branch specified in the Gemfile\.
.
.IP "\(bu" 4
\fBdisable_local_revision_check\fR (\fBBUNDLE_DISABLE_LOCAL_REVISION_CHECK\fR): Allow Bundler to use a local git override without checking if the revision present in the lockfile is present in the repository\.
.
.IP "\(bu" 4
\fBdisable_shared_gems\fR (\fBBUNDLE_DISABLE_SHARED_GEMS\fR): Stop Bundler from accessing gems installed to RubyGems\' normal location\.
.
.IP "\(bu" 4
\fBdisable_version_check\fR (\fBBUNDLE_DISABLE_VERSION_CHECK\fR): Stop Bundler from checking if a newer Bundler version is available on rubygems\.org\.
.
.IP "\(bu" 4
\fBforce_ruby_platform\fR (\fBBUNDLE_FORCE_RUBY_PLATFORM\fR): Ignore the current machine\'s platform and install only \fBruby\fR platform gems\. As a result, gems with native extensions will be compiled from source\.
.
.IP "\(bu" 4
\fBfrozen\fR (\fBBUNDLE_FROZEN\fR): Disallow changes to the \fBGemfile\fR\. When the \fBGemfile\fR is changed and the lockfile has not been updated, running Bundler commands will be blocked\. Defaults to \fBtrue\fR when \fB\-\-deployment\fR is used\.
.
.IP "\(bu" 4
\fBgem\.github_username\fR (\fBBUNDLE_GEM__GITHUB_USERNAME\fR): Sets a GitHub username or organization to be used in \fBREADME\fR file when you create a new gem via \fBbundle gem\fR command\. It can be overridden by passing an explicit \fB\-\-github\-username\fR flag to \fBbundle gem\fR\.
.
.IP "\(bu" 4
\fBgem\.push_key\fR (\fBBUNDLE_GEM__PUSH_KEY\fR): Sets the \fB\-\-key\fR parameter for \fBgem push\fR when using the \fBrake release\fR command with a private gemstash server\.
.
.IP "\(bu" 4
\fBgemfile\fR (\fBBUNDLE_GEMFILE\fR): The name of the file that bundler should use as the \fBGemfile\fR\. This location of this file also sets the root of the project, which is used to resolve relative paths in the \fBGemfile\fR, among other things\. By default, bundler will search up from the current working directory until it finds a \fBGemfile\fR\.
.
.IP "\(bu" 4
\fBglobal_gem_cache\fR (\fBBUNDLE_GLOBAL_GEM_CACHE\fR): Whether Bundler should cache all gems globally, rather than locally to the installing Ruby installation\.
.
.IP "\(bu" 4
\fBignore_funding_requests\fR (\fBBUNDLE_IGNORE_FUNDING_REQUESTS\fR): When set, no funding requests will be printed\.
.
.IP "\(bu" 4
\fBignore_messages\fR (\fBBUNDLE_IGNORE_MESSAGES\fR): When set, no post install messages will be printed\. To silence a single gem, use dot notation like \fBignore_messages\.httparty true\fR\.
.
.IP "\(bu" 4
\fBinit_gems_rb\fR (\fBBUNDLE_INIT_GEMS_RB\fR): Generate a \fBgems\.rb\fR instead of a \fBGemfile\fR when running \fBbundle init\fR\.
.
.IP "\(bu" 4
\fBjobs\fR (\fBBUNDLE_JOBS\fR): The number of gems Bundler can install in parallel\. Defaults to the number of available processors\.
.
.IP "\(bu" 4
\fBno_install\fR (\fBBUNDLE_NO_INSTALL\fR): Whether \fBbundle package\fR should skip installing gems\.
.
.IP "\(bu" 4
\fBno_prune\fR (\fBBUNDLE_NO_PRUNE\fR): Whether Bundler should leave outdated gems unpruned when caching\.
.
.IP "\(bu" 4
\fBonly\fR (\fBBUNDLE_ONLY\fR): A space\-separated list of groups to install only gems of the specified groups\.
.
.IP "\(bu" 4
\fBpath\fR (\fBBUNDLE_PATH\fR): The location on disk where all gems in your bundle will be located regardless of \fB$GEM_HOME\fR or \fB$GEM_PATH\fR values\. Bundle gems not found in this location will be installed by \fBbundle install\fR\. Defaults to \fBGem\.dir\fR\. When \-\-deployment is used, defaults to vendor/bundle\.
.
.IP "\(bu" 4
\fBpath\.system\fR (\fBBUNDLE_PATH__SYSTEM\fR): Whether Bundler will install gems into the default system path (\fBGem\.dir\fR)\.
.
.IP "\(bu" 4
\fBpath_relative_to_cwd\fR (\fBBUNDLE_PATH_RELATIVE_TO_CWD\fR) Makes \fB\-\-path\fR relative to the CWD instead of the \fBGemfile\fR\.
.
.IP "\(bu" 4
\fBplugins\fR (\fBBUNDLE_PLUGINS\fR): Enable Bundler\'s experimental plugin system\.
.
.IP "\(bu" 4
\fBprefer_patch\fR (BUNDLE_PREFER_PATCH): Prefer updating only to next patch version during updates\. Makes \fBbundle update\fR calls equivalent to \fBbundler update \-\-patch\fR\.
.
.IP "\(bu" 4
\fBprint_only_version_number\fR (\fBBUNDLE_PRINT_ONLY_VERSION_NUMBER\fR): Print only version number from \fBbundler \-\-version\fR\.
.
.IP "\(bu" 4
\fBredirect\fR (\fBBUNDLE_REDIRECT\fR): The number of redirects allowed for network requests\. Defaults to \fB5\fR\.
.
.IP "\(bu" 4
\fBretry\fR (\fBBUNDLE_RETRY\fR): The number of times to retry failed network requests\. Defaults to \fB3\fR\.
.
.IP "\(bu" 4
\fBsetup_makes_kernel_gem_public\fR (\fBBUNDLE_SETUP_MAKES_KERNEL_GEM_PUBLIC\fR): Have \fBBundler\.setup\fR make the \fBKernel#gem\fR method public, even though RubyGems declares it as private\.
.
.IP "\(bu" 4
\fBshebang\fR (\fBBUNDLE_SHEBANG\fR): The program name that should be invoked for generated binstubs\. Defaults to the ruby install name used to generate the binstub\.
.
.IP "\(bu" 4
\fBsilence_deprecations\fR (\fBBUNDLE_SILENCE_DEPRECATIONS\fR): Whether Bundler should silence deprecation warnings for behavior that will be changed in the next major version\.
.
.IP "\(bu" 4
\fBsilence_root_warning\fR (\fBBUNDLE_SILENCE_ROOT_WARNING\fR): Silence the warning Bundler prints when installing gems as root\.
.
.IP "\(bu" 4
\fBssl_ca_cert\fR (\fBBUNDLE_SSL_CA_CERT\fR): Path to a designated CA certificate file or folder containing multiple certificates for trusted CAs in PEM format\.
.
.IP "\(bu" 4
\fBssl_client_cert\fR (\fBBUNDLE_SSL_CLIENT_CERT\fR): Path to a designated file containing a X\.509 client certificate and key in PEM format\.
.
.IP "\(bu" 4
\fBssl_verify_mode\fR (\fBBUNDLE_SSL_VERIFY_MODE\fR): The SSL verification mode Bundler uses when making HTTPS requests\. Defaults to verify peer\.
.
.IP "\(bu" 4
\fBsuppress_install_using_messages\fR (\fBBUNDLE_SUPPRESS_INSTALL_USING_MESSAGES\fR): Avoid printing \fBUsing \.\.\.\fR messages during installation when the version of a gem has not changed\.
.
.IP "\(bu" 4
\fBsystem_bindir\fR (\fBBUNDLE_SYSTEM_BINDIR\fR): The location where RubyGems installs binstubs\. Defaults to \fBGem\.bindir\fR\.
.
.IP "\(bu" 4
\fBtimeout\fR (\fBBUNDLE_TIMEOUT\fR): The seconds allowed before timing out for network requests\. Defaults to \fB10\fR\.
.
.IP "\(bu" 4
\fBupdate_requires_all_flag\fR (\fBBUNDLE_UPDATE_REQUIRES_ALL_FLAG\fR): Require passing \fB\-\-all\fR to \fBbundle update\fR when everything should be updated, and disallow passing no options to \fBbundle update\fR\.
.
.IP "\(bu" 4
\fBuser_agent\fR (\fBBUNDLE_USER_AGENT\fR): The custom user agent fragment Bundler includes in API requests\.
.
.IP "\(bu" 4
\fBwith\fR (\fBBUNDLE_WITH\fR): A \fB:\fR\-separated list of groups whose gems bundler should install\.
.
.IP "\(bu" 4
\fBwithout\fR (\fBBUNDLE_WITHOUT\fR): A \fB:\fR\-separated list of groups whose gems bundler should not install\.
.
.IP "" 0
.
.P
In general, you should set these settings per\-application by using the applicable flag to the bundle install(1) \fIbundle\-install\.1\.html\fR or bundle cache(1) \fIbundle\-cache\.1\.html\fR command\.
.
.P
You can set them globally either via environment variables or \fBbundle config\fR, whichever is preferable for your setup\. If you use both, environment variables will take preference over global settings\.
.
.SH "LOCAL GIT REPOS"
Bundler also allows you to work against a git repository locally instead of using the remote version\. This can be achieved by setting up a local override:
.
.IP "" 4
.
.nf

bundle config set \-\-local local\.GEM_NAME /path/to/local/git/repository
.
.fi
.
.IP "" 0
.
.P
For example, in order to use a local Rack repository, a developer could call:
.
.IP "" 4
.
.nf

bundle config set \-\-local local\.rack ~/Work/git/rack
.
.fi
.
.IP "" 0
.
.P
Now instead of checking out the remote git repository, the local override will be used\. Similar to a path source, every time the local git repository change, changes will be automatically picked up by Bundler\. This means a commit in the local git repo will update the revision in the \fBGemfile\.lock\fR to the local git repo revision\. This requires the same attention as git submodules\. Before pushing to the remote, you need to ensure the local override was pushed, otherwise you may point to a commit that only exists in your local machine\. You\'ll also need to CGI escape your usernames and passwords as well\.
.
.P
Bundler does many checks to ensure a developer won\'t work with invalid references\. Particularly, we force a developer to specify a branch in the \fBGemfile\fR in order to use this feature\. If the branch specified in the \fBGemfile\fR and the current branch in the local git repository do not match, Bundler will abort\. This ensures that a developer is always working against the correct branches, and prevents accidental locking to a different branch\.
.
.P
Finally, Bundler also ensures that the current revision in the \fBGemfile\.lock\fR exists in the local git repository\. By doing this, Bundler forces you to fetch the latest changes in the remotes\.
.
.SH "MIRRORS OF GEM SOURCES"
Bundler supports overriding gem sources with mirrors\. This allows you to configure rubygems\.org as the gem source in your Gemfile while still using your mirror to fetch gems\.
.
.IP "" 4
.
.nf

bundle config set \-\-global mirror\.SOURCE_URL MIRROR_URL
.
.fi
.
.IP "" 0
.
.P
For example, to use a mirror of https://rubygems\.org hosted at https://example\.org:
.
.IP "" 4
.
.nf

bundle config set \-\-global mirror\.https://rubygems\.org https://example\.org
.
.fi
.
.IP "" 0
.
.P
Each mirror also provides a fallback timeout setting\. If the mirror does not respond within the fallback timeout, Bundler will try to use the original server instead of the mirror\.
.
.IP "" 4
.
.nf

bundle config set \-\-global mirror\.SOURCE_URL\.fallback_timeout TIMEOUT
.
.fi
.
.IP "" 0
.
.P
For example, to fall back to rubygems\.org after 3 seconds:
.
.IP "" 4
.
.nf

bundle config set \-\-global mirror\.https://rubygems\.org\.fallback_timeout 3
.
.fi
.
.IP "" 0
.
.P
The default fallback timeout is 0\.1 seconds, but the setting can currently only accept whole seconds (for example, 1, 15, or 30)\.
.
.SH "CREDENTIALS FOR GEM SOURCES"
Bundler allows you to configure credentials for any gem source, which allows you to avoid putting secrets into your Gemfile\.
.
.IP "" 4
.
.nf

bundle config set \-\-global SOURCE_HOSTNAME USERNAME:PASSWORD
.
.fi
.
.IP "" 0
.
.P
For example, to save the credentials of user \fBclaudette\fR for the gem source at \fBgems\.longerous\.com\fR, you would run:
.
.IP "" 4
.
.nf

bundle config set \-\-global gems\.longerous\.com claudette:s00pers3krit
.
.fi
.
.IP "" 0
.
.P
Or you can set the credentials as an environment variable like this:
.
.IP "" 4
.
.nf

export BUNDLE_GEMS__LONGEROUS__COM="claudette:s00pers3krit"
.
.fi
.
.IP "" 0
.
.P
For gems with a git source with HTTP(S) URL you can specify credentials like so:
.
.IP "" 4
.
.nf

bundle config set \-\-global https://github\.com/rubygems/rubygems\.git username:password
.
.fi
.
.IP "" 0
.
.P
Or you can set the credentials as an environment variable like so:
.
.IP "" 4
.
.nf

export BUNDLE_GITHUB__COM=username:password
.
.fi
.
.IP "" 0
.
.P
This is especially useful for private repositories on hosts such as GitHub, where you can use personal OAuth tokens:
.
.IP "" 4
.
.nf

export BUNDLE_GITHUB__COM=abcd0123generatedtoken:x\-oauth\-basic
.
.fi
.
.IP "" 0
.
.P
Note that any configured credentials will be redacted by informative commands such as \fBbundle config list\fR or \fBbundle config get\fR, unless you use the \fB\-\-parseable\fR flag\. This is to avoid unintentionally leaking credentials when copy\-pasting bundler output\.
.
.P
Also note that to guarantee a sane mapping between valid environment variable names and valid host names, bundler makes the following transformations:
.
.IP "\(bu" 4
Any \fB\-\fR characters in a host name are mapped to a triple dash (\fB___\fR) in the corresponding environment variable\.
.
.IP "\(bu" 4
Any \fB\.\fR characters in a host name are mapped to a double dash (\fB__\fR) in the corresponding environment variable\.
.
.IP "" 0
.
.P
This means that if you have a gem server named \fBmy\.gem\-host\.com\fR, you\'ll need to use the \fBBUNDLE_MY__GEM___HOST__COM\fR variable to configure credentials for it through ENV\.
.
.SH "CONFIGURE BUNDLER DIRECTORIES"
Bundler\'s home, config, cache and plugin directories are able to be configured through environment variables\. The default location for Bundler\'s home directory is \fB~/\.bundle\fR, which all directories inherit from by default\. The following outlines the available environment variables and their default values
.
.IP "" 4
.
.nf

BUNDLE_USER_HOME : $HOME/\.bundle
BUNDLE_USER_CACHE : $BUNDLE_USER_HOME/cache
BUNDLE_USER_CONFIG : $BUNDLE_USER_HOME/config
BUNDLE_USER_PLUGIN : $BUNDLE_USER_HOME/plugin
.
.fi
.
.IP "" 0

PK}$[�;㊅
�
man/man1/bundle-cache.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-CACHE" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-cache\fR \- Package your needed \fB\.gem\fR files into your application
.
.SH "SYNOPSIS"
\fBbundle cache\fR
.
.P
alias: \fBpackage\fR, \fBpack\fR
.
.SH "DESCRIPTION"
Copy all of the \fB\.gem\fR files needed to run the application into the \fBvendor/cache\fR directory\. In the future, when running [bundle install(1)][bundle\-install], use the gems in the cache in preference to the ones on \fBrubygems\.org\fR\.
.
.SH "GIT AND PATH GEMS"
The \fBbundle cache\fR command can also package \fB:git\fR and \fB:path\fR dependencies besides \.gem files\. This needs to be explicitly enabled via the \fB\-\-all\fR option\. Once used, the \fB\-\-all\fR option will be remembered\.
.
.SH "SUPPORT FOR MULTIPLE PLATFORMS"
When using gems that have different packages for different platforms, Bundler supports caching of gems for other platforms where the Gemfile has been resolved (i\.e\. present in the lockfile) in \fBvendor/cache\fR\. This needs to be enabled via the \fB\-\-all\-platforms\fR option\. This setting will be remembered in your local bundler configuration\.
.
.SH "REMOTE FETCHING"
By default, if you run \fBbundle install(1)\fR](bundle\-install\.1\.html) after running bundle cache(1) \fIbundle\-cache\.1\.html\fR, bundler will still connect to \fBrubygems\.org\fR to check whether a platform\-specific gem exists for any of the gems in \fBvendor/cache\fR\.
.
.P
For instance, consider this Gemfile(5):
.
.IP "" 4
.
.nf

source "https://rubygems\.org"

gem "nokogiri"
.
.fi
.
.IP "" 0
.
.P
If you run \fBbundle cache\fR under C Ruby, bundler will retrieve the version of \fBnokogiri\fR for the \fB"ruby"\fR platform\. If you deploy to JRuby and run \fBbundle install\fR, bundler is forced to check to see whether a \fB"java"\fR platformed \fBnokogiri\fR exists\.
.
.P
Even though the \fBnokogiri\fR gem for the Ruby platform is \fItechnically\fR acceptable on JRuby, it has a C extension that does not run on JRuby\. As a result, bundler will, by default, still connect to \fBrubygems\.org\fR to check whether it has a version of one of your gems more specific to your platform\.
.
.P
This problem is also not limited to the \fB"java"\fR platform\. A similar (common) problem can happen when developing on Windows and deploying to Linux, or even when developing on OSX and deploying to Linux\.
.
.P
If you know for sure that the gems packaged in \fBvendor/cache\fR are appropriate for the platform you are on, you can run \fBbundle install \-\-local\fR to skip checking for more appropriate gems, and use the ones in \fBvendor/cache\fR\.
.
.P
One way to be sure that you have the right platformed versions of all your gems is to run \fBbundle cache\fR on an identical machine and check in the gems\. For instance, you can run \fBbundle cache\fR on an identical staging box during your staging process, and check in the \fBvendor/cache\fR before deploying to production\.
.
.P
By default, bundle cache(1) \fIbundle\-cache\.1\.html\fR fetches and also installs the gems to the default location\. To package the dependencies to \fBvendor/cache\fR without installing them to the local install location, you can run \fBbundle cache \-\-no\-install\fR\.
.
.SH "HISTORY"
In Bundler 2\.1, \fBcache\fR took in the functionalities of \fBpackage\fR and now \fBpackage\fR and \fBpack\fR are aliases of \fBcache\fR\.
PK}$[��C&U6U6man/man1/bundle-update.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-UPDATE" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-update\fR \- Update your gems to the latest available versions
.
.SH "SYNOPSIS"
\fBbundle update\fR \fI*gems\fR [\-\-all] [\-\-group=NAME] [\-\-source=NAME] [\-\-local] [\-\-ruby] [\-\-bundler[=VERSION]] [\-\-full\-index] [\-\-jobs=JOBS] [\-\-quiet] [\-\-patch|\-\-minor|\-\-major] [\-\-redownload] [\-\-strict] [\-\-conservative]
.
.SH "DESCRIPTION"
Update the gems specified (all gems, if \fB\-\-all\fR flag is used), ignoring the previously installed gems specified in the \fBGemfile\.lock\fR\. In general, you should use bundle install(1) \fIbundle\-install\.1\.html\fR to install the same exact gems and versions across machines\.
.
.P
You would use \fBbundle update\fR to explicitly update the version of a gem\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-all\fR
Update all gems specified in Gemfile\.
.
.TP
\fB\-\-group=<name>\fR, \fB\-g=[<name>]\fR
Only update the gems in the specified group\. For instance, you can update all gems in the development group with \fBbundle update \-\-group development\fR\. You can also call \fBbundle update rails \-\-group test\fR to update the rails gem and all gems in the test group, for example\.
.
.TP
\fB\-\-source=<name>\fR
The name of a \fB:git\fR or \fB:path\fR source used in the Gemfile(5)\. For instance, with a \fB:git\fR source of \fBhttp://github\.com/rails/rails\.git\fR, you would call \fBbundle update \-\-source rails\fR
.
.TP
\fB\-\-local\fR
Do not attempt to fetch gems remotely and use the gem cache instead\.
.
.TP
\fB\-\-ruby\fR
Update the locked version of Ruby to the current version of Ruby\.
.
.TP
\fB\-\-bundler\fR
Update the locked version of bundler to the invoked bundler version\.
.
.TP
\fB\-\-full\-index\fR
Fall back to using the single\-file index of all gems\.
.
.TP
\fB\-\-jobs=[<number>]\fR, \fB\-j[<number>]\fR
Specify the number of jobs to run in parallel\. The default is the number of available processors\.
.
.TP
\fB\-\-retry=[<number>]\fR
Retry failed network or git requests for \fInumber\fR times\.
.
.TP
\fB\-\-quiet\fR
Only output warnings and errors\.
.
.TP
\fB\-\-redownload\fR
Force downloading every gem\.
.
.TP
\fB\-\-patch\fR
Prefer updating only to next patch version\.
.
.TP
\fB\-\-minor\fR
Prefer updating only to next minor version\.
.
.TP
\fB\-\-major\fR
Prefer updating to next major version (default)\.
.
.TP
\fB\-\-strict\fR
Do not allow any gem to be updated past latest \fB\-\-patch\fR | \fB\-\-minor\fR | \fB\-\-major\fR\.
.
.TP
\fB\-\-conservative\fR
Use bundle install conservative update behavior and do not allow indirect dependencies to be updated\.
.
.SH "UPDATING ALL GEMS"
If you run \fBbundle update \-\-all\fR, bundler will ignore any previously installed gems and resolve all dependencies again based on the latest versions of all gems available in the sources\.
.
.P
Consider the following Gemfile(5):
.
.IP "" 4
.
.nf

source "https://rubygems\.org"

gem "rails", "3\.0\.0\.rc"
gem "nokogiri"
.
.fi
.
.IP "" 0
.
.P
When you run bundle install(1) \fIbundle\-install\.1\.html\fR the first time, bundler will resolve all of the dependencies, all the way down, and install what you need:
.
.IP "" 4
.
.nf

Fetching gem metadata from https://rubygems\.org/\.\.\.\.\.\.\.\.\.
Resolving dependencies\.\.\.
Installing builder 2\.1\.2
Installing abstract 1\.0\.0
Installing rack 1\.2\.8
Using bundler 1\.7\.6
Installing rake 10\.4\.0
Installing polyglot 0\.3\.5
Installing mime\-types 1\.25\.1
Installing i18n 0\.4\.2
Installing mini_portile 0\.6\.1
Installing tzinfo 0\.3\.42
Installing rack\-mount 0\.6\.14
Installing rack\-test 0\.5\.7
Installing treetop 1\.4\.15
Installing thor 0\.14\.6
Installing activesupport 3\.0\.0\.rc
Installing erubis 2\.6\.6
Installing activemodel 3\.0\.0\.rc
Installing arel 0\.4\.0
Installing mail 2\.2\.20
Installing activeresource 3\.0\.0\.rc
Installing actionpack 3\.0\.0\.rc
Installing activerecord 3\.0\.0\.rc
Installing actionmailer 3\.0\.0\.rc
Installing railties 3\.0\.0\.rc
Installing rails 3\.0\.0\.rc
Installing nokogiri 1\.6\.5

Bundle complete! 2 Gemfile dependencies, 26 gems total\.
Use `bundle show [gemname]` to see where a bundled gem is installed\.
.
.fi
.
.IP "" 0
.
.P
As you can see, even though you have two gems in the Gemfile(5), your application needs 26 different gems in order to run\. Bundler remembers the exact versions it installed in \fBGemfile\.lock\fR\. The next time you run bundle install(1) \fIbundle\-install\.1\.html\fR, bundler skips the dependency resolution and installs the same gems as it installed last time\.
.
.P
After checking in the \fBGemfile\.lock\fR into version control and cloning it on another machine, running bundle install(1) \fIbundle\-install\.1\.html\fR will \fIstill\fR install the gems that you installed last time\. You don\'t need to worry that a new release of \fBerubis\fR or \fBmail\fR changes the gems you use\.
.
.P
However, from time to time, you might want to update the gems you are using to the newest versions that still match the gems in your Gemfile(5)\.
.
.P
To do this, run \fBbundle update \-\-all\fR, which will ignore the \fBGemfile\.lock\fR, and resolve all the dependencies again\. Keep in mind that this process can result in a significantly different set of the 25 gems, based on the requirements of new gems that the gem authors released since the last time you ran \fBbundle update \-\-all\fR\.
.
.SH "UPDATING A LIST OF GEMS"
Sometimes, you want to update a single gem in the Gemfile(5), and leave the rest of the gems that you specified locked to the versions in the \fBGemfile\.lock\fR\.
.
.P
For instance, in the scenario above, imagine that \fBnokogiri\fR releases version \fB1\.4\.4\fR, and you want to update it \fIwithout\fR updating Rails and all of its dependencies\. To do this, run \fBbundle update nokogiri\fR\.
.
.P
Bundler will update \fBnokogiri\fR and any of its dependencies, but leave alone Rails and its dependencies\.
.
.SH "OVERLAPPING DEPENDENCIES"
Sometimes, multiple gems declared in your Gemfile(5) are satisfied by the same second\-level dependency\. For instance, consider the case of \fBthin\fR and \fBrack\-perftools\-profiler\fR\.
.
.IP "" 4
.
.nf

source "https://rubygems\.org"

gem "thin"
gem "rack\-perftools\-profiler"
.
.fi
.
.IP "" 0
.
.P
The \fBthin\fR gem depends on \fBrack >= 1\.0\fR, while \fBrack\-perftools\-profiler\fR depends on \fBrack ~> 1\.0\fR\. If you run bundle install, you get:
.
.IP "" 4
.
.nf

Fetching source index for https://rubygems\.org/
Installing daemons (1\.1\.0)
Installing eventmachine (0\.12\.10) with native extensions
Installing open4 (1\.0\.1)
Installing perftools\.rb (0\.4\.7) with native extensions
Installing rack (1\.2\.1)
Installing rack\-perftools_profiler (0\.0\.2)
Installing thin (1\.2\.7) with native extensions
Using bundler (1\.0\.0\.rc\.3)
.
.fi
.
.IP "" 0
.
.P
In this case, the two gems have their own set of dependencies, but they share \fBrack\fR in common\. If you run \fBbundle update thin\fR, bundler will update \fBdaemons\fR, \fBeventmachine\fR and \fBrack\fR, which are dependencies of \fBthin\fR, but not \fBopen4\fR or \fBperftools\.rb\fR, which are dependencies of \fBrack\-perftools_profiler\fR\. Note that \fBbundle update thin\fR will update \fBrack\fR even though it\'s \fIalso\fR a dependency of \fBrack\-perftools_profiler\fR\.
.
.P
In short, by default, when you update a gem using \fBbundle update\fR, bundler will update all dependencies of that gem, including those that are also dependencies of another gem\.
.
.P
To prevent updating indirect dependencies, prior to version 1\.14 the only option was the \fBCONSERVATIVE UPDATING\fR behavior in bundle install(1) \fIbundle\-install\.1\.html\fR:
.
.P
In this scenario, updating the \fBthin\fR version manually in the Gemfile(5), and then running bundle install(1) \fIbundle\-install\.1\.html\fR will only update \fBdaemons\fR and \fBeventmachine\fR, but not \fBrack\fR\. For more information, see the \fBCONSERVATIVE UPDATING\fR section of bundle install(1) \fIbundle\-install\.1\.html\fR\.
.
.P
Starting with 1\.14, specifying the \fB\-\-conservative\fR option will also prevent indirect dependencies from being updated\.
.
.SH "PATCH LEVEL OPTIONS"
Version 1\.14 introduced 4 patch\-level options that will influence how gem versions are resolved\. One of the following options can be used: \fB\-\-patch\fR, \fB\-\-minor\fR or \fB\-\-major\fR\. \fB\-\-strict\fR can be added to further influence resolution\.
.
.TP
\fB\-\-patch\fR
Prefer updating only to next patch version\.
.
.TP
\fB\-\-minor\fR
Prefer updating only to next minor version\.
.
.TP
\fB\-\-major\fR
Prefer updating to next major version (default)\.
.
.TP
\fB\-\-strict\fR
Do not allow any gem to be updated past latest \fB\-\-patch\fR | \fB\-\-minor\fR | \fB\-\-major\fR\.
.
.P
When Bundler is resolving what versions to use to satisfy declared requirements in the Gemfile or in parent gems, it looks up all available versions, filters out any versions that don\'t satisfy the requirement, and then, by default, sorts them from newest to oldest, considering them in that order\.
.
.P
Providing one of the patch level options (e\.g\. \fB\-\-patch\fR) changes the sort order of the satisfying versions, causing Bundler to consider the latest \fB\-\-patch\fR or \fB\-\-minor\fR version available before other versions\. Note that versions outside the stated patch level could still be resolved to if necessary to find a suitable dependency graph\.
.
.P
For example, if gem \'foo\' is locked at 1\.0\.2, with no gem requirement defined in the Gemfile, and versions 1\.0\.3, 1\.0\.4, 1\.1\.0, 1\.1\.1, 2\.0\.0 all exist, the default order of preference by default (\fB\-\-major\fR) will be "2\.0\.0, 1\.1\.1, 1\.1\.0, 1\.0\.4, 1\.0\.3, 1\.0\.2"\.
.
.P
If the \fB\-\-patch\fR option is used, the order of preference will change to "1\.0\.4, 1\.0\.3, 1\.0\.2, 1\.1\.1, 1\.1\.0, 2\.0\.0"\.
.
.P
If the \fB\-\-minor\fR option is used, the order of preference will change to "1\.1\.1, 1\.1\.0, 1\.0\.4, 1\.0\.3, 1\.0\.2, 2\.0\.0"\.
.
.P
Combining the \fB\-\-strict\fR option with any of the patch level options will remove any versions beyond the scope of the patch level option, to ensure that no gem is updated that far\.
.
.P
To continue the previous example, if both \fB\-\-patch\fR and \fB\-\-strict\fR options are used, the available versions for resolution would be "1\.0\.4, 1\.0\.3, 1\.0\.2"\. If \fB\-\-minor\fR and \fB\-\-strict\fR are used, it would be "1\.1\.1, 1\.1\.0, 1\.0\.4, 1\.0\.3, 1\.0\.2"\.
.
.P
Gem requirements as defined in the Gemfile will still be the first determining factor for what versions are available\. If the gem requirement for \fBfoo\fR in the Gemfile is \'~> 1\.0\', that will accomplish the same thing as providing the \fB\-\-minor\fR and \fB\-\-strict\fR options\.
.
.SH "PATCH LEVEL EXAMPLES"
Given the following gem specifications:
.
.IP "" 4
.
.nf

foo 1\.4\.3, requires: ~> bar 2\.0
foo 1\.4\.4, requires: ~> bar 2\.0
foo 1\.4\.5, requires: ~> bar 2\.1
foo 1\.5\.0, requires: ~> bar 2\.1
foo 1\.5\.1, requires: ~> bar 3\.0
bar with versions 2\.0\.3, 2\.0\.4, 2\.1\.0, 2\.1\.1, 3\.0\.0
.
.fi
.
.IP "" 0
.
.P
Gemfile:
.
.IP "" 4
.
.nf

gem \'foo\'
.
.fi
.
.IP "" 0
.
.P
Gemfile\.lock:
.
.IP "" 4
.
.nf

foo (1\.4\.3)
  bar (~> 2\.0)
bar (2\.0\.3)
.
.fi
.
.IP "" 0
.
.P
Cases:
.
.IP "" 4
.
.nf

#  Command Line                     Result
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
1  bundle update \-\-patch            \'foo 1\.4\.5\', \'bar 2\.1\.1\'
2  bundle update \-\-patch foo        \'foo 1\.4\.5\', \'bar 2\.1\.1\'
3  bundle update \-\-minor            \'foo 1\.5\.1\', \'bar 3\.0\.0\'
4  bundle update \-\-minor \-\-strict   \'foo 1\.5\.0\', \'bar 2\.1\.1\'
5  bundle update \-\-patch \-\-strict   \'foo 1\.4\.4\', \'bar 2\.0\.4\'
.
.fi
.
.IP "" 0
.
.P
In case 1, bar is upgraded to 2\.1\.1, a minor version increase, because the dependency from foo 1\.4\.5 required it\.
.
.P
In case 2, only foo is requested to be unlocked, but bar is also allowed to move because it\'s not a declared dependency in the Gemfile\.
.
.P
In case 3, bar goes up a whole major release, because a minor increase is preferred now for foo, and when it goes to 1\.5\.1, it requires 3\.0\.0 of bar\.
.
.P
In case 4, foo is preferred up to a minor version, but 1\.5\.1 won\'t work because the \-\-strict flag removes bar 3\.0\.0 from consideration since it\'s a major increment\.
.
.P
In case 5, both foo and bar have any minor or major increments removed from consideration because of the \-\-strict flag, so the most they can move is up to 1\.4\.4 and 2\.0\.4\.
.
.SH "RECOMMENDED WORKFLOW"
In general, when working with an application managed with bundler, you should use the following workflow:
.
.IP "\(bu" 4
After you create your Gemfile(5) for the first time, run
.
.IP
$ bundle install
.
.IP "\(bu" 4
Check the resulting \fBGemfile\.lock\fR into version control
.
.IP
$ git add Gemfile\.lock
.
.IP "\(bu" 4
When checking out this repository on another development machine, run
.
.IP
$ bundle install
.
.IP "\(bu" 4
When checking out this repository on a deployment machine, run
.
.IP
$ bundle install \-\-deployment
.
.IP "\(bu" 4
After changing the Gemfile(5) to reflect a new or update dependency, run
.
.IP
$ bundle install
.
.IP "\(bu" 4
Make sure to check the updated \fBGemfile\.lock\fR into version control
.
.IP
$ git add Gemfile\.lock
.
.IP "\(bu" 4
If bundle install(1) \fIbundle\-install\.1\.html\fR reports a conflict, manually update the specific gems that you changed in the Gemfile(5)
.
.IP
$ bundle update rails thin
.
.IP "\(bu" 4
If you want to update all the gems to the latest possible versions that still match the gems listed in the Gemfile(5), run
.
.IP
$ bundle update \-\-all
.
.IP "" 0

PK}$[s��kZZman/man5/gemfile.5nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "GEMFILE" "5" "October 2022" "" ""
.
.SH "NAME"
\fBGemfile\fR \- A format for describing gem dependencies for Ruby programs
.
.SH "SYNOPSIS"
A \fBGemfile\fR describes the gem dependencies required to execute associated Ruby code\.
.
.P
Place the \fBGemfile\fR in the root of the directory containing the associated code\. For instance, in a Rails application, place the \fBGemfile\fR in the same directory as the \fBRakefile\fR\.
.
.SH "SYNTAX"
A \fBGemfile\fR is evaluated as Ruby code, in a context which makes available a number of methods used to describe the gem requirements\.
.
.SH "GLOBAL SOURCE"
At the top of the \fBGemfile\fR, add a single line for the \fBRubyGems\fR source that contains the gems listed in the \fBGemfile\fR\.
.
.IP "" 4
.
.nf

source "https://rubygems\.org"
.
.fi
.
.IP "" 0
.
.P
You can add only one global source\. In Bundler 1\.13, adding multiple global sources was deprecated\. The \fBsource\fR \fBMUST\fR be a valid RubyGems repository\.
.
.P
To use more than one source of RubyGems, you should use \fI\fBsource\fR block\fR\.
.
.P
A source is checked for gems following the heuristics described in \fISOURCE PRIORITY\fR\.
.
.P
\fBNote about a behavior of the feature deprecated in Bundler 1\.13\fR: If a gem is found in more than one global source, Bundler will print a warning after installing the gem indicating which source was used, and listing the other sources where the gem is available\. A specific source can be selected for gems that need to use a non\-standard repository, suppressing this warning, by using the \fI\fB:source\fR option\fR or \fBsource\fR block\.
.
.SS "CREDENTIALS"
Some gem sources require a username and password\. Use bundle config(1) \fIbundle\-config\.1\.html\fR to set the username and password for any of the sources that need it\. The command must be run once on each computer that will install the Gemfile, but this keeps the credentials from being stored in plain text in version control\.
.
.IP "" 4
.
.nf

bundle config gems\.example\.com user:password
.
.fi
.
.IP "" 0
.
.P
For some sources, like a company Gemfury account, it may be easier to include the credentials in the Gemfile as part of the source URL\.
.
.IP "" 4
.
.nf

source "https://user:password@gems\.example\.com"
.
.fi
.
.IP "" 0
.
.P
Credentials in the source URL will take precedence over credentials set using \fBconfig\fR\.
.
.SH "RUBY"
If your application requires a specific Ruby version or engine, specify your requirements using the \fBruby\fR method, with the following arguments\. All parameters are \fBOPTIONAL\fR unless otherwise specified\.
.
.SS "VERSION (required)"
The version of Ruby that your application requires\. If your application requires an alternate Ruby engine, such as JRuby, TruffleRuby, etc\., this should be the Ruby version that the engine is compatible with\.
.
.IP "" 4
.
.nf

ruby "3\.1\.2"
.
.fi
.
.IP "" 0
.
.SS "ENGINE"
Each application \fImay\fR specify a Ruby engine\. If an engine is specified, an engine version \fImust\fR also be specified\.
.
.P
What exactly is an Engine? \- A Ruby engine is an implementation of the Ruby language\.
.
.IP "\(bu" 4
For background: the reference or original implementation of the Ruby programming language is called Matz\'s Ruby Interpreter \fIhttps://en\.wikipedia\.org/wiki/Ruby_MRI\fR, or MRI for short\. This is named after Ruby creator Yukihiro Matsumoto, also known as Matz\. MRI is also known as CRuby, because it is written in C\. MRI is the most widely used Ruby engine\.
.
.IP "\(bu" 4
Other implementations \fIhttps://www\.ruby\-lang\.org/en/about/\fR of Ruby exist\. Some of the more well\-known implementations include JRuby \fIhttp://jruby\.org/\fR and TruffleRuby \fIhttps://www\.graalvm\.org/ruby/\fR\. Rubinius is an alternative implementation of Ruby written in Ruby\. JRuby is an implementation of Ruby on the JVM, short for Java Virtual Machine\. TruffleRuby is a Ruby implementation on the GraalVM, a language toolkit built on the JVM\.
.
.IP "" 0
.
.SS "ENGINE VERSION"
Each application \fImay\fR specify a Ruby engine version\. If an engine version is specified, an engine \fImust\fR also be specified\. If the engine is "ruby" the engine version specified \fImust\fR match the Ruby version\.
.
.IP "" 4
.
.nf

ruby "2\.6\.8", engine: "jruby", engine_version: "9\.3\.8\.0"
.
.fi
.
.IP "" 0
.
.SS "PATCHLEVEL"
Each application \fImay\fR specify a Ruby patchlevel\. Specifying the patchlevel has been meaningless since Ruby 2\.1\.0 was released as the patchlevel is now uniquely determined by a combination of major, minor, and teeny version numbers\.
.
.P
This option was implemented in Bundler 1\.4\.0 for Ruby 2\.0 or earlier\.
.
.IP "" 4
.
.nf

ruby "3\.1\.2", patchlevel: "20"
.
.fi
.
.IP "" 0
.
.SH "GEMS"
Specify gem requirements using the \fBgem\fR method, with the following arguments\. All parameters are \fBOPTIONAL\fR unless otherwise specified\.
.
.SS "NAME (required)"
For each gem requirement, list a single \fIgem\fR line\.
.
.IP "" 4
.
.nf

gem "nokogiri"
.
.fi
.
.IP "" 0
.
.SS "VERSION"
Each \fIgem\fR \fBMAY\fR have one or more version specifiers\.
.
.IP "" 4
.
.nf

gem "nokogiri", ">= 1\.4\.2"
gem "RedCloth", ">= 4\.1\.0", "< 4\.2\.0"
.
.fi
.
.IP "" 0
.
.SS "REQUIRE AS"
Each \fIgem\fR \fBMAY\fR specify files that should be used when autorequiring via \fBBundler\.require\fR\. You may pass an array with multiple files or \fBtrue\fR if the file you want \fBrequired\fR has the same name as \fIgem\fR or \fBfalse\fR to prevent any file from being autorequired\.
.
.IP "" 4
.
.nf

gem "redis", require: ["redis/connection/hiredis", "redis"]
gem "webmock", require: false
gem "byebug", require: true
.
.fi
.
.IP "" 0
.
.P
The argument defaults to the name of the gem\. For example, these are identical:
.
.IP "" 4
.
.nf

gem "nokogiri"
gem "nokogiri", require: "nokogiri"
gem "nokogiri", require: true
.
.fi
.
.IP "" 0
.
.SS "GROUPS"
Each \fIgem\fR \fBMAY\fR specify membership in one or more groups\. Any \fIgem\fR that does not specify membership in any group is placed in the \fBdefault\fR group\.
.
.IP "" 4
.
.nf

gem "rspec", group: :test
gem "wirble", groups: [:development, :test]
.
.fi
.
.IP "" 0
.
.P
The Bundler runtime allows its two main methods, \fBBundler\.setup\fR and \fBBundler\.require\fR, to limit their impact to particular groups\.
.
.IP "" 4
.
.nf

# setup adds gems to Ruby\'s load path
Bundler\.setup                    # defaults to all groups
require "bundler/setup"          # same as Bundler\.setup
Bundler\.setup(:default)          # only set up the _default_ group
Bundler\.setup(:test)             # only set up the _test_ group (but `not` _default_)
Bundler\.setup(:default, :test)   # set up the _default_ and _test_ groups, but no others

# require requires all of the gems in the specified groups
Bundler\.require                  # defaults to the _default_ group
Bundler\.require(:default)        # identical
Bundler\.require(:default, :test) # requires the _default_ and _test_ groups
Bundler\.require(:test)           # requires the _test_ group
.
.fi
.
.IP "" 0
.
.P
The Bundler CLI allows you to specify a list of groups whose gems \fBbundle install\fR should not install with the \fBwithout\fR configuration\.
.
.P
To specify multiple groups to ignore, specify a list of groups separated by spaces\.
.
.IP "" 4
.
.nf

bundle config set \-\-local without test
bundle config set \-\-local without development test
.
.fi
.
.IP "" 0
.
.P
Also, calling \fBBundler\.setup\fR with no parameters, or calling \fBrequire "bundler/setup"\fR will setup all groups except for the ones you excluded via \fB\-\-without\fR (since they are not available)\.
.
.P
Note that on \fBbundle install\fR, bundler downloads and evaluates all gems, in order to create a single canonical list of all of the required gems and their dependencies\. This means that you cannot list different versions of the same gems in different groups\. For more details, see Understanding Bundler \fIhttps://bundler\.io/rationale\.html\fR\.
.
.SS "PLATFORMS"
If a gem should only be used in a particular platform or set of platforms, you can specify them\. Platforms are essentially identical to groups, except that you do not need to use the \fB\-\-without\fR install\-time flag to exclude groups of gems for other platforms\.
.
.P
There are a number of \fBGemfile\fR platforms:
.
.TP
\fBruby\fR
C Ruby (MRI), Rubinius, or TruffleRuby, but not Windows
.
.TP
\fBmri\fR
C Ruby (MRI) only, but not Windows
.
.TP
\fBwindows\fR
Windows C Ruby (MRI), including RubyInstaller 32\-bit and 64\-bit versions
.
.TP
\fBmswin\fR
Windows C Ruby (MRI), including RubyInstaller 32\-bit versions
.
.TP
\fBmswin64\fR
Windows C Ruby (MRI), including RubyInstaller 64\-bit versions
.
.TP
\fBrbx\fR
Rubinius
.
.TP
\fBjruby\fR
JRuby
.
.TP
\fBtruffleruby\fR
TruffleRuby
.
.P
On platforms \fBruby\fR, \fBmri\fR, \fBmswin\fR, \fBmswin64\fR, and \fBwindows\fR, you may additionally specify a version by appending the major and minor version numbers without a delimiter\. For example, to specify that a gem should only be used on platform \fBruby\fR version 3\.1, use:
.
.IP "" 4
.
.nf

ruby_31
.
.fi
.
.IP "" 0
.
.P
As with groups (above), you may specify one or more platforms:
.
.IP "" 4
.
.nf

gem "weakling",   platforms: :jruby
gem "ruby\-debug", platforms: :mri_31
gem "nokogiri",   platforms: [:windows_31, :jruby]
.
.fi
.
.IP "" 0
.
.P
All operations involving groups (\fBbundle install\fR \fIbundle\-install\.1\.html\fR, \fBBundler\.setup\fR, \fBBundler\.require\fR) behave exactly the same as if any groups not matching the current platform were explicitly excluded\.
.
.SS "FORCE_RUBY_PLATFORM"
If you always want the pure ruby variant of a gem to be chosen over platform specific variants, you can use the \fBforce_ruby_platform\fR option:
.
.IP "" 4
.
.nf

gem "ffi", force_ruby_platform: true
.
.fi
.
.IP "" 0
.
.P
This can be handy (assuming the pure ruby variant works fine) when:
.
.IP "\(bu" 4
You\'re having issues with the platform specific variant\.
.
.IP "\(bu" 4
The platform specific variant does not yet support a newer ruby (and thus has a \fBrequired_ruby_version\fR upper bound), but you still want your Gemfile{\.lock} files to resolve under that ruby\.
.
.IP "" 0
.
.SS "SOURCE"
You can select an alternate RubyGems repository for a gem using the \':source\' option\.
.
.IP "" 4
.
.nf

gem "some_internal_gem", source: "https://gems\.example\.com"
.
.fi
.
.IP "" 0
.
.P
This forces the gem to be loaded from this source and ignores the global source declared at the top level of the file\. If the gem does not exist in this source, it will not be installed\.
.
.P
Bundler will search for child dependencies of this gem by first looking in the source selected for the parent, but if they are not found there, it will fall back on the global source\.
.
.P
\fBNote about a behavior of the feature deprecated in Bundler 1\.13\fR: Selecting a specific source repository this way also suppresses the ambiguous gem warning described above in \fIGLOBAL SOURCE\fR\.
.
.P
Using the \fB:source\fR option for an individual gem will also make that source available as a possible global source for any other gems which do not specify explicit sources\. Thus, when adding gems with explicit sources, it is recommended that you also ensure all other gems in the Gemfile are using explicit sources\.
.
.SS "GIT"
If necessary, you can specify that a gem is located at a particular git repository using the \fB:git\fR parameter\. The repository can be accessed via several protocols:
.
.TP
\fBHTTP(S)\fR
gem "rails", git: "https://github\.com/rails/rails\.git"
.
.TP
\fBSSH\fR
gem "rails", git: "git@github\.com:rails/rails\.git"
.
.TP
\fBgit\fR
gem "rails", git: "git://github\.com/rails/rails\.git"
.
.P
If using SSH, the user that you use to run \fBbundle install\fR \fBMUST\fR have the appropriate keys available in their \fB$HOME/\.ssh\fR\.
.
.P
\fBNOTE\fR: \fBhttp://\fR and \fBgit://\fR URLs should be avoided if at all possible\. These protocols are unauthenticated, so a man\-in\-the\-middle attacker can deliver malicious code and compromise your system\. HTTPS and SSH are strongly preferred\.
.
.P
The \fBgroup\fR, \fBplatforms\fR, and \fBrequire\fR options are available and behave exactly the same as they would for a normal gem\.
.
.P
A git repository \fBSHOULD\fR have at least one file, at the root of the directory containing the gem, with the extension \fB\.gemspec\fR\. This file \fBMUST\fR contain a valid gem specification, as expected by the \fBgem build\fR command\.
.
.P
If a git repository does not have a \fB\.gemspec\fR, bundler will attempt to create one, but it will not contain any dependencies, executables, or C extension compilation instructions\. As a result, it may fail to properly integrate into your application\.
.
.P
If a git repository does have a \fB\.gemspec\fR for the gem you attached it to, a version specifier, if provided, means that the git repository is only valid if the \fB\.gemspec\fR specifies a version matching the version specifier\. If not, bundler will print a warning\.
.
.IP "" 4
.
.nf

gem "rails", "2\.3\.8", git: "https://github\.com/rails/rails\.git"
# bundle install will fail, because the \.gemspec in the rails
# repository\'s master branch specifies version 3\.0\.0
.
.fi
.
.IP "" 0
.
.P
If a git repository does \fBnot\fR have a \fB\.gemspec\fR for the gem you attached it to, a version specifier \fBMUST\fR be provided\. Bundler will use this version in the simple \fB\.gemspec\fR it creates\.
.
.P
Git repositories support a number of additional options\.
.
.TP
\fBbranch\fR, \fBtag\fR, and \fBref\fR
You \fBMUST\fR only specify at most one of these options\. The default is \fBbranch: "master"\fR\. For example:
.
.IP
gem "rails", git: "https://github\.com/rails/rails\.git", branch: "5\-0\-stable"
.
.IP
gem "rails", git: "https://github\.com/rails/rails\.git", tag: "v5\.0\.0"
.
.IP
gem "rails", git: "https://github\.com/rails/rails\.git", ref: "4aded"
.
.TP
\fBsubmodules\fR
For reference, a git submodule \fIhttps://git\-scm\.com/book/en/v2/Git\-Tools\-Submodules\fR lets you have another git repository within a subfolder of your repository\. Specify \fBsubmodules: true\fR to cause bundler to expand any submodules included in the git repository
.
.P
If a git repository contains multiple \fB\.gemspecs\fR, each \fB\.gemspec\fR represents a gem located at the same place in the file system as the \fB\.gemspec\fR\.
.
.IP "" 4
.
.nf

|~rails                   [git root]
| |\-rails\.gemspec         [rails gem located here]
|~actionpack
| |\-actionpack\.gemspec    [actionpack gem located here]
|~activesupport
| |\-activesupport\.gemspec [activesupport gem located here]
|\.\.\.
.
.fi
.
.IP "" 0
.
.P
To install a gem located in a git repository, bundler changes to the directory containing the gemspec, runs \fBgem build name\.gemspec\fR and then installs the resulting gem\. The \fBgem build\fR command, which comes standard with Rubygems, evaluates the \fB\.gemspec\fR in the context of the directory in which it is located\.
.
.SS "GIT SOURCE"
A custom git source can be defined via the \fBgit_source\fR method\. Provide the source\'s name as an argument, and a block which receives a single argument and interpolates it into a string to return the full repo address:
.
.IP "" 4
.
.nf

git_source(:stash){ |repo_name| "https://stash\.corp\.acme\.pl/#{repo_name}\.git" }
gem \'rails\', stash: \'forks/rails\'
.
.fi
.
.IP "" 0
.
.P
In addition, if you wish to choose a specific branch:
.
.IP "" 4
.
.nf

gem "rails", stash: "forks/rails", branch: "branch_name"
.
.fi
.
.IP "" 0
.
.SS "GITHUB"
\fBNOTE\fR: This shorthand should be avoided until Bundler 2\.0, since it currently expands to an insecure \fBgit://\fR URL\. This allows a man\-in\-the\-middle attacker to compromise your system\.
.
.P
If the git repository you want to use is hosted on GitHub and is public, you can use the :github shorthand to specify the github username and repository name (without the trailing "\.git"), separated by a slash\. If both the username and repository name are the same, you can omit one\.
.
.IP "" 4
.
.nf

gem "rails", github: "rails/rails"
gem "rails", github: "rails"
.
.fi
.
.IP "" 0
.
.P
Are both equivalent to
.
.IP "" 4
.
.nf

gem "rails", git: "https://github\.com/rails/rails\.git"
.
.fi
.
.IP "" 0
.
.P
Since the \fBgithub\fR method is a specialization of \fBgit_source\fR, it accepts a \fB:branch\fR named argument\.
.
.P
You can also directly pass a pull request URL:
.
.IP "" 4
.
.nf

gem "rails", github: "https://github\.com/rails/rails/pull/43753"
.
.fi
.
.IP "" 0
.
.P
Which is equivalent to:
.
.IP "" 4
.
.nf

gem "rails", github: "rails/rails", branch: "refs/pull/43753/head"
.
.fi
.
.IP "" 0
.
.SS "GIST"
If the git repository you want to use is hosted as a GitHub Gist and is public, you can use the :gist shorthand to specify the gist identifier (without the trailing "\.git")\.
.
.IP "" 4
.
.nf

gem "the_hatch", gist: "4815162342"
.
.fi
.
.IP "" 0
.
.P
Is equivalent to:
.
.IP "" 4
.
.nf

gem "the_hatch", git: "https://gist\.github\.com/4815162342\.git"
.
.fi
.
.IP "" 0
.
.P
Since the \fBgist\fR method is a specialization of \fBgit_source\fR, it accepts a \fB:branch\fR named argument\.
.
.SS "BITBUCKET"
If the git repository you want to use is hosted on Bitbucket and is public, you can use the :bitbucket shorthand to specify the bitbucket username and repository name (without the trailing "\.git"), separated by a slash\. If both the username and repository name are the same, you can omit one\.
.
.IP "" 4
.
.nf

gem "rails", bitbucket: "rails/rails"
gem "rails", bitbucket: "rails"
.
.fi
.
.IP "" 0
.
.P
Are both equivalent to
.
.IP "" 4
.
.nf

gem "rails", git: "https://rails@bitbucket\.org/rails/rails\.git"
.
.fi
.
.IP "" 0
.
.P
Since the \fBbitbucket\fR method is a specialization of \fBgit_source\fR, it accepts a \fB:branch\fR named argument\.
.
.SS "PATH"
You can specify that a gem is located in a particular location on the file system\. Relative paths are resolved relative to the directory containing the \fBGemfile\fR\.
.
.P
Similar to the semantics of the \fB:git\fR option, the \fB:path\fR option requires that the directory in question either contains a \fB\.gemspec\fR for the gem, or that you specify an explicit version that bundler should use\.
.
.P
Unlike \fB:git\fR, bundler does not compile C extensions for gems specified as paths\.
.
.IP "" 4
.
.nf

gem "rails", path: "vendor/rails"
.
.fi
.
.IP "" 0
.
.P
If you would like to use multiple local gems directly from the filesystem, you can set a global \fBpath\fR option to the path containing the gem\'s files\. This will automatically load gemspec files from subdirectories\.
.
.IP "" 4
.
.nf

path \'components\' do
  gem \'admin_ui\'
  gem \'public_ui\'
end
.
.fi
.
.IP "" 0
.
.SH "BLOCK FORM OF SOURCE, GIT, PATH, GROUP and PLATFORMS"
The \fB:source\fR, \fB:git\fR, \fB:path\fR, \fB:group\fR, and \fB:platforms\fR options may be applied to a group of gems by using block form\.
.
.IP "" 4
.
.nf

source "https://gems\.example\.com" do
  gem "some_internal_gem"
  gem "another_internal_gem"
end

git "https://github\.com/rails/rails\.git" do
  gem "activesupport"
  gem "actionpack"
end

platforms :ruby do
  gem "ruby\-debug"
  gem "sqlite3"
end

group :development, optional: true do
  gem "wirble"
  gem "faker"
end
.
.fi
.
.IP "" 0
.
.P
In the case of the group block form the :optional option can be given to prevent a group from being installed unless listed in the \fB\-\-with\fR option given to the \fBbundle install\fR command\.
.
.P
In the case of the \fBgit\fR block form, the \fB:ref\fR, \fB:branch\fR, \fB:tag\fR, and \fB:submodules\fR options may be passed to the \fBgit\fR method, and all gems in the block will inherit those options\.
.
.P
The presence of a \fBsource\fR block in a Gemfile also makes that source available as a possible global source for any other gems which do not specify explicit sources\. Thus, when defining source blocks, it is recommended that you also ensure all other gems in the Gemfile are using explicit sources, either via source blocks or \fB:source\fR directives on individual gems\.
.
.SH "INSTALL_IF"
The \fBinstall_if\fR method allows gems to be installed based on a proc or lambda\. This is especially useful for optional gems that can only be used if certain software is installed or some other conditions are met\.
.
.IP "" 4
.
.nf

install_if \-> { RUBY_PLATFORM =~ /darwin/ } do
  gem "pasteboard"
end
.
.fi
.
.IP "" 0
.
.SH "GEMSPEC"
The \fB\.gemspec\fR \fIhttp://guides\.rubygems\.org/specification\-reference/\fR file is where you provide metadata about your gem to Rubygems\. Some required Gemspec attributes include the name, description, and homepage of your gem\. This is also where you specify the dependencies your gem needs to run\.
.
.P
If you wish to use Bundler to help install dependencies for a gem while it is being developed, use the \fBgemspec\fR method to pull in the dependencies listed in the \fB\.gemspec\fR file\.
.
.P
The \fBgemspec\fR method adds any runtime dependencies as gem requirements in the default group\. It also adds development dependencies as gem requirements in the \fBdevelopment\fR group\. Finally, it adds a gem requirement on your project (\fBpath: \'\.\'\fR)\. In conjunction with \fBBundler\.setup\fR, this allows you to require project files in your test code as you would if the project were installed as a gem; you need not manipulate the load path manually or require project files via relative paths\.
.
.P
The \fBgemspec\fR method supports optional \fB:path\fR, \fB:glob\fR, \fB:name\fR, and \fB:development_group\fR options, which control where bundler looks for the \fB\.gemspec\fR, the glob it uses to look for the gemspec (defaults to: "{,\fI,\fR/*}\.gemspec"), what named \fB\.gemspec\fR it uses (if more than one is present), and which group development dependencies are included in\.
.
.P
When a \fBgemspec\fR dependency encounters version conflicts during resolution, the local version under development will always be selected \-\- even if there are remote versions that better match other requirements for the \fBgemspec\fR gem\.
.
.SH "SOURCE PRIORITY"
When attempting to locate a gem to satisfy a gem requirement, bundler uses the following priority order:
.
.IP "1." 4
The source explicitly attached to the gem (using \fB:source\fR, \fB:path\fR, or \fB:git\fR)
.
.IP "2." 4
For implicit gems (dependencies of explicit gems), any source, git, or path repository declared on the parent\. This results in bundler prioritizing the ActiveSupport gem from the Rails git repository over ones from \fBrubygems\.org\fR
.
.IP "3." 4
If neither of the above conditions are met, the global source will be used\. If multiple global sources are specified, they will be prioritized from last to first, but this is deprecated since Bundler 1\.13, so Bundler prints a warning and will abort with an error in the future\.
.
.IP "" 0

PK}$[�k��(gems/specifications/rdoc-6.4.1.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: rdoc 6.4.1.1 ruby lib

Gem::Specification.new do |s|
  s.name = "rdoc".freeze
  s.version = "6.4.1.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 2.2".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Eric Hodel".freeze, "Dave Thomas".freeze, "Phil Hagelberg".freeze, "Tony Strauss".freeze, "Zachary Scott".freeze, "Hiroshi SHIBATA".freeze, "ITOYANAGI Sakura".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "RDoc produces HTML and command-line documentation for Ruby projects.\nRDoc includes the +rdoc+ and +ri+ tools for generating and displaying documentation from the command-line.\n".freeze
  s.email = ["drbrain@segment7.net".freeze, "".freeze, "".freeze, "".freeze, "mail@zzak.io".freeze, "hsbt@ruby-lang.org".freeze, "aycabta@gmail.com".freeze]
  s.executables = ["rdoc".freeze, "ri".freeze]
  s.extra_rdoc_files = ["CVE-2013-0256.rdoc".freeze, "CONTRIBUTING.rdoc".freeze, "ExampleMarkdown.md".freeze, "ExampleRDoc.rdoc".freeze, "History.rdoc".freeze, "LEGAL.rdoc".freeze, "LICENSE.rdoc".freeze, "README.rdoc".freeze, "RI.rdoc".freeze, "TODO.rdoc".freeze]
  s.files = ["CONTRIBUTING.rdoc".freeze, "CVE-2013-0256.rdoc".freeze, "ExampleMarkdown.md".freeze, "ExampleRDoc.rdoc".freeze, "History.rdoc".freeze, "LEGAL.rdoc".freeze, "LICENSE.rdoc".freeze, "README.rdoc".freeze, "RI.rdoc".freeze, "TODO.rdoc".freeze, "exe/rdoc".freeze, "exe/ri".freeze, "lib/rdoc.rb".freeze, "lib/rdoc/alias.rb".freeze, "lib/rdoc/anon_class.rb".freeze, "lib/rdoc/any_method.rb".freeze, "lib/rdoc/attr.rb".freeze, "lib/rdoc/class_module.rb".freeze, "lib/rdoc/code_object.rb".freeze, "lib/rdoc/code_objects.rb".freeze, "lib/rdoc/comment.rb".freeze, "lib/rdoc/constant.rb".freeze, "lib/rdoc/context.rb".freeze, "lib/rdoc/context/section.rb".freeze, "lib/rdoc/cross_reference.rb".freeze, "lib/rdoc/encoding.rb".freeze, "lib/rdoc/erb_partial.rb".freeze, "lib/rdoc/erbio.rb".freeze, "lib/rdoc/extend.rb".freeze, "lib/rdoc/generator.rb".freeze, "lib/rdoc/generator/darkfish.rb".freeze, "lib/rdoc/generator/json_index.rb".freeze, "lib/rdoc/generator/markup.rb".freeze, "lib/rdoc/generator/pot.rb".freeze, "lib/rdoc/generator/pot/message_extractor.rb".freeze, "lib/rdoc/generator/pot/po.rb".freeze, "lib/rdoc/generator/pot/po_entry.rb".freeze, "lib/rdoc/generator/ri.rb".freeze, "lib/rdoc/ghost_method.rb".freeze, "lib/rdoc/i18n.rb".freeze, "lib/rdoc/i18n/locale.rb".freeze, "lib/rdoc/i18n/text.rb".freeze, "lib/rdoc/include.rb".freeze, "lib/rdoc/known_classes.rb".freeze, "lib/rdoc/markdown.rb".freeze, "lib/rdoc/markdown/entities.rb".freeze, "lib/rdoc/markdown/literals.rb".freeze, "lib/rdoc/markup.rb".freeze, "lib/rdoc/markup/attr_changer.rb".freeze, "lib/rdoc/markup/attr_span.rb".freeze, "lib/rdoc/markup/attribute_manager.rb".freeze, "lib/rdoc/markup/attributes.rb".freeze, "lib/rdoc/markup/blank_line.rb".freeze, "lib/rdoc/markup/block_quote.rb".freeze, "lib/rdoc/markup/document.rb".freeze, "lib/rdoc/markup/formatter.rb".freeze, "lib/rdoc/markup/hard_break.rb".freeze, "lib/rdoc/markup/heading.rb".freeze, "lib/rdoc/markup/include.rb".freeze, "lib/rdoc/markup/indented_paragraph.rb".freeze, "lib/rdoc/markup/list.rb".freeze, "lib/rdoc/markup/list_item.rb".freeze, "lib/rdoc/markup/paragraph.rb".freeze, "lib/rdoc/markup/parser.rb".freeze, "lib/rdoc/markup/pre_process.rb".freeze, "lib/rdoc/markup/raw.rb".freeze, "lib/rdoc/markup/regexp_handling.rb".freeze, "lib/rdoc/markup/rule.rb".freeze, "lib/rdoc/markup/table.rb".freeze, "lib/rdoc/markup/to_ansi.rb".freeze, "lib/rdoc/markup/to_bs.rb".freeze, "lib/rdoc/markup/to_html.rb".freeze, "lib/rdoc/markup/to_html_crossref.rb".freeze, "lib/rdoc/markup/to_html_snippet.rb".freeze, "lib/rdoc/markup/to_joined_paragraph.rb".freeze, "lib/rdoc/markup/to_label.rb".freeze, "lib/rdoc/markup/to_markdown.rb".freeze, "lib/rdoc/markup/to_rdoc.rb".freeze, "lib/rdoc/markup/to_table_of_contents.rb".freeze, "lib/rdoc/markup/to_test.rb".freeze, "lib/rdoc/markup/to_tt_only.rb".freeze, "lib/rdoc/markup/verbatim.rb".freeze, "lib/rdoc/meta_method.rb".freeze, "lib/rdoc/method_attr.rb".freeze, "lib/rdoc/mixin.rb".freeze, "lib/rdoc/normal_class.rb".freeze, "lib/rdoc/normal_module.rb".freeze, "lib/rdoc/options.rb".freeze, "lib/rdoc/parser.rb".freeze, "lib/rdoc/parser/c.rb".freeze, "lib/rdoc/parser/changelog.rb".freeze, "lib/rdoc/parser/markdown.rb".freeze, "lib/rdoc/parser/rd.rb".freeze, "lib/rdoc/parser/ripper_state_lex.rb".freeze, "lib/rdoc/parser/ruby.rb".freeze, "lib/rdoc/parser/ruby_tools.rb".freeze, "lib/rdoc/parser/simple.rb".freeze, "lib/rdoc/parser/text.rb".freeze, "lib/rdoc/rd.rb".freeze, "lib/rdoc/rd/block_parser.rb".freeze, "lib/rdoc/rd/inline.rb".freeze, "lib/rdoc/rd/inline_parser.rb".freeze, "lib/rdoc/rdoc.rb".freeze, "lib/rdoc/require.rb".freeze, "lib/rdoc/ri.rb".freeze, "lib/rdoc/ri/driver.rb".freeze, "lib/rdoc/ri/formatter.rb".freeze, "lib/rdoc/ri/paths.rb".freeze, "lib/rdoc/ri/store.rb".freeze, "lib/rdoc/ri/task.rb".freeze, "lib/rdoc/rubygems_hook.rb".freeze, "lib/rdoc/servlet.rb".freeze, "lib/rdoc/single_class.rb".freeze, "lib/rdoc/stats.rb".freeze, "lib/rdoc/stats/normal.rb".freeze, "lib/rdoc/stats/quiet.rb".freeze, "lib/rdoc/stats/verbose.rb".freeze, "lib/rdoc/store.rb".freeze, "lib/rdoc/task.rb".freeze, "lib/rdoc/text.rb".freeze, "lib/rdoc/token_stream.rb".freeze, "lib/rdoc/tom_doc.rb".freeze, "lib/rdoc/top_level.rb".freeze, "lib/rdoc/version.rb".freeze]
  s.homepage = "https://ruby.github.io/rdoc".freeze
  s.licenses = ["Ruby".freeze]
  s.rdoc_options = ["--main".freeze, "README.rdoc".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.5.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "RDoc produces HTML and command-line documentation for Ruby projects".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_runtime_dependency(%q<psych>.freeze, [">= 4.0.0"])
  else
    s.add_dependency(%q<psych>.freeze, [">= 4.0.0"])
  end
end
PK}$[\��B$.$.*gems/specifications/bundler-2.3.27.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: bundler 2.3.27 ruby lib

Gem::Specification.new do |s|
  s.name = "bundler".freeze
  s.version = "2.3.27"

  s.required_rubygems_version = Gem::Requirement.new(">= 2.5.2".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "bug_tracker_uri" => "https://github.com/rubygems/rubygems/issues?q=is%3Aopen+is%3Aissue+label%3ABundler", "changelog_uri" => "https://github.com/rubygems/rubygems/blob/master/bundler/CHANGELOG.md", "homepage_uri" => "https://bundler.io/", "source_code_uri" => "https://github.com/rubygems/rubygems/tree/master/bundler" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Andr\u00E9 Arko".freeze, "Samuel Giddins".freeze, "Colby Swandale".freeze, "Hiroshi Shibata".freeze, "David Rodr\u00EDguez".freeze, "Grey Baker".freeze, "Stephanie Morillo".freeze, "Chris Morris".freeze, "James Wen".freeze, "Tim Moore".freeze, "Andr\u00E9 Medeiros".freeze, "Jessica Lynn Suttles".freeze, "Terence Lee".freeze, "Carl Lerche".freeze, "Yehuda Katz".freeze]
  s.bindir = "libexec".freeze
  s.date = "2025-04-28"
  s.description = "Bundler manages an application's dependencies through its entire life, across many machines, systematically and repeatably".freeze
  s.email = ["team@bundler.io".freeze]
  s.executables = ["bundle".freeze, "bundler".freeze]
  s.files = ["lib/bundler.rb".freeze, "lib/bundler/build_metadata.rb".freeze, "lib/bundler/capistrano.rb".freeze, "lib/bundler/cli.rb".freeze, "lib/bundler/cli/add.rb".freeze, "lib/bundler/cli/binstubs.rb".freeze, "lib/bundler/cli/cache.rb".freeze, "lib/bundler/cli/check.rb".freeze, "lib/bundler/cli/clean.rb".freeze, "lib/bundler/cli/common.rb".freeze, "lib/bundler/cli/config.rb".freeze, "lib/bundler/cli/console.rb".freeze, "lib/bundler/cli/doctor.rb".freeze, "lib/bundler/cli/exec.rb".freeze, "lib/bundler/cli/fund.rb".freeze, "lib/bundler/cli/gem.rb".freeze, "lib/bundler/cli/info.rb".freeze, "lib/bundler/cli/init.rb".freeze, "lib/bundler/cli/inject.rb".freeze, "lib/bundler/cli/install.rb".freeze, "lib/bundler/cli/issue.rb".freeze, "lib/bundler/cli/list.rb".freeze, "lib/bundler/cli/lock.rb".freeze, "lib/bundler/cli/open.rb".freeze, "lib/bundler/cli/outdated.rb".freeze, "lib/bundler/cli/platform.rb".freeze, "lib/bundler/cli/plugin.rb".freeze, "lib/bundler/cli/pristine.rb".freeze, "lib/bundler/cli/remove.rb".freeze, "lib/bundler/cli/show.rb".freeze, "lib/bundler/cli/update.rb".freeze, "lib/bundler/cli/viz.rb".freeze, "lib/bundler/compact_index_client.rb".freeze, "lib/bundler/compact_index_client/cache.rb".freeze, "lib/bundler/compact_index_client/gem_parser.rb".freeze, "lib/bundler/compact_index_client/updater.rb".freeze, "lib/bundler/constants.rb".freeze, "lib/bundler/current_ruby.rb".freeze, "lib/bundler/definition.rb".freeze, "lib/bundler/dependency.rb".freeze, "lib/bundler/deployment.rb".freeze, "lib/bundler/deprecate.rb".freeze, "lib/bundler/digest.rb".freeze, "lib/bundler/dsl.rb".freeze, "lib/bundler/endpoint_specification.rb".freeze, "lib/bundler/env.rb".freeze, "lib/bundler/environment_preserver.rb".freeze, "lib/bundler/errors.rb".freeze, "lib/bundler/feature_flag.rb".freeze, "lib/bundler/fetcher.rb".freeze, "lib/bundler/fetcher/base.rb".freeze, "lib/bundler/fetcher/compact_index.rb".freeze, "lib/bundler/fetcher/dependency.rb".freeze, "lib/bundler/fetcher/downloader.rb".freeze, "lib/bundler/fetcher/index.rb".freeze, "lib/bundler/friendly_errors.rb".freeze, "lib/bundler/gem_helper.rb".freeze, "lib/bundler/gem_helpers.rb".freeze, "lib/bundler/gem_tasks.rb".freeze, "lib/bundler/gem_version_promoter.rb".freeze, "lib/bundler/graph.rb".freeze, "lib/bundler/index.rb".freeze, "lib/bundler/injector.rb".freeze, "lib/bundler/inline.rb".freeze, "lib/bundler/installer.rb".freeze, "lib/bundler/installer/gem_installer.rb".freeze, "lib/bundler/installer/parallel_installer.rb".freeze, "lib/bundler/installer/standalone.rb".freeze, "lib/bundler/lazy_specification.rb".freeze, "lib/bundler/lockfile_generator.rb".freeze, "lib/bundler/lockfile_parser.rb".freeze, "lib/bundler/match_metadata.rb".freeze, "lib/bundler/match_platform.rb".freeze, "lib/bundler/match_remote_metadata.rb".freeze, "lib/bundler/mirror.rb".freeze, "lib/bundler/plugin.rb".freeze, "lib/bundler/plugin/api.rb".freeze, "lib/bundler/plugin/api/source.rb".freeze, "lib/bundler/plugin/dsl.rb".freeze, "lib/bundler/plugin/events.rb".freeze, "lib/bundler/plugin/index.rb".freeze, "lib/bundler/plugin/installer.rb".freeze, "lib/bundler/plugin/installer/git.rb".freeze, "lib/bundler/plugin/installer/rubygems.rb".freeze, "lib/bundler/plugin/source_list.rb".freeze, "lib/bundler/process_lock.rb".freeze, "lib/bundler/remote_specification.rb".freeze, "lib/bundler/resolver.rb".freeze, "lib/bundler/resolver/base.rb".freeze, "lib/bundler/resolver/spec_group.rb".freeze, "lib/bundler/retry.rb".freeze, "lib/bundler/ruby_dsl.rb".freeze, "lib/bundler/ruby_version.rb".freeze, "lib/bundler/rubygems_ext.rb".freeze, "lib/bundler/rubygems_gem_installer.rb".freeze, "lib/bundler/rubygems_integration.rb".freeze, "lib/bundler/runtime.rb".freeze, "lib/bundler/self_manager.rb".freeze, "lib/bundler/settings.rb".freeze, "lib/bundler/settings/validator.rb".freeze, "lib/bundler/setup.rb".freeze, "lib/bundler/shared_helpers.rb".freeze, "lib/bundler/similarity_detector.rb".freeze, "lib/bundler/source.rb".freeze, "lib/bundler/source/gemspec.rb".freeze, "lib/bundler/source/git.rb".freeze, "lib/bundler/source/git/git_proxy.rb".freeze, "lib/bundler/source/metadata.rb".freeze, "lib/bundler/source/path.rb".freeze, "lib/bundler/source/path/installer.rb".freeze, "lib/bundler/source/rubygems.rb".freeze, "lib/bundler/source/rubygems/remote.rb".freeze, "lib/bundler/source/rubygems_aggregate.rb".freeze, "lib/bundler/source_list.rb".freeze, "lib/bundler/source_map.rb".freeze, "lib/bundler/spec_set.rb".freeze, "lib/bundler/stub_specification.rb".freeze, "lib/bundler/templates/gems.rb".freeze, "lib/bundler/ui.rb".freeze, "lib/bundler/ui/rg_proxy.rb".freeze, "lib/bundler/ui/shell.rb".freeze, "lib/bundler/ui/silent.rb".freeze, "lib/bundler/uri_credentials_filter.rb".freeze, "lib/bundler/vendor/connection_pool/lib/connection_pool.rb".freeze, "lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb".freeze, "lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb".freeze, "lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb".freeze, "lib/bundler/vendor/fileutils/lib/fileutils.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo/errors.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb".freeze, "lib/bundler/vendor/molinillo/lib/molinillo/state.rb".freeze, "lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb".freeze, "lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb".freeze, "lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb".freeze, "lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb".freeze, "lib/bundler/vendor/thor/lib/thor.rb".freeze, "lib/bundler/vendor/thor/lib/thor/actions.rb".freeze, "lib/bundler/vendor/thor/lib/thor/actions/create_file.rb".freeze, "lib/bundler/vendor/thor/lib/thor/actions/create_link.rb".freeze, "lib/bundler/vendor/thor/lib/thor/actions/directory.rb".freeze, "lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb".freeze, "lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb".freeze, "lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb".freeze, "lib/bundler/vendor/thor/lib/thor/base.rb".freeze, "lib/bundler/vendor/thor/lib/thor/command.rb".freeze, "lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb".freeze, "lib/bundler/vendor/thor/lib/thor/error.rb".freeze, "lib/bundler/vendor/thor/lib/thor/group.rb".freeze, "lib/bundler/vendor/thor/lib/thor/invocation.rb".freeze, "lib/bundler/vendor/thor/lib/thor/line_editor.rb".freeze, "lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb".freeze, "lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb".freeze, "lib/bundler/vendor/thor/lib/thor/nested_context.rb".freeze, "lib/bundler/vendor/thor/lib/thor/parser.rb".freeze, "lib/bundler/vendor/thor/lib/thor/parser/argument.rb".freeze, "lib/bundler/vendor/thor/lib/thor/parser/arguments.rb".freeze, "lib/bundler/vendor/thor/lib/thor/parser/option.rb".freeze, "lib/bundler/vendor/thor/lib/thor/parser/options.rb".freeze, "lib/bundler/vendor/thor/lib/thor/rake_compat.rb".freeze, "lib/bundler/vendor/thor/lib/thor/runner.rb".freeze, "lib/bundler/vendor/thor/lib/thor/shell.rb".freeze, "lib/bundler/vendor/thor/lib/thor/shell/basic.rb".freeze, "lib/bundler/vendor/thor/lib/thor/shell/color.rb".freeze, "lib/bundler/vendor/thor/lib/thor/shell/html.rb".freeze, "lib/bundler/vendor/thor/lib/thor/util.rb".freeze, "lib/bundler/vendor/thor/lib/thor/version.rb".freeze, "lib/bundler/vendor/tmpdir/lib/tmpdir.rb".freeze, "lib/bundler/vendor/tsort/lib/tsort.rb".freeze, "lib/bundler/vendor/uri/lib/uri.rb".freeze, "lib/bundler/vendor/uri/lib/uri/common.rb".freeze, "lib/bundler/vendor/uri/lib/uri/file.rb".freeze, "lib/bundler/vendor/uri/lib/uri/ftp.rb".freeze, "lib/bundler/vendor/uri/lib/uri/generic.rb".freeze, "lib/bundler/vendor/uri/lib/uri/http.rb".freeze, "lib/bundler/vendor/uri/lib/uri/https.rb".freeze, "lib/bundler/vendor/uri/lib/uri/ldap.rb".freeze, "lib/bundler/vendor/uri/lib/uri/ldaps.rb".freeze, "lib/bundler/vendor/uri/lib/uri/mailto.rb".freeze, "lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb".freeze, "lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb".freeze, "lib/bundler/vendor/uri/lib/uri/version.rb".freeze, "lib/bundler/vendor/uri/lib/uri/ws.rb".freeze, "lib/bundler/vendor/uri/lib/uri/wss.rb".freeze, "lib/bundler/vendored_fileutils.rb".freeze, "lib/bundler/vendored_molinillo.rb".freeze, "lib/bundler/vendored_persistent.rb".freeze, "lib/bundler/vendored_thor.rb".freeze, "lib/bundler/vendored_tmpdir.rb".freeze, "lib/bundler/vendored_tsort.rb".freeze, "lib/bundler/vendored_uri.rb".freeze, "lib/bundler/version.rb".freeze, "lib/bundler/version_ranges.rb".freeze, "lib/bundler/vlad.rb".freeze, "lib/bundler/worker.rb".freeze, "lib/bundler/yaml_serializer.rb".freeze, "libexec/bundle".freeze, "libexec/bundler".freeze]
  s.homepage = "https://bundler.io".freeze
  s.licenses = ["MIT".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "The best way to manage your application's dependencies".freeze
end
PK}$[㕸��*gems/specifications/ruby-lsapi-5.6.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: ruby-lsapi 5.6 ruby lib
# stub: ext/lsapi/extconf.rb

Gem::Specification.new do |s|
  s.name = "ruby-lsapi".freeze
  s.version = "5.6"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["LiteSpeed Technologies Inc.".freeze]
  s.date = "2024-01-22"
  s.description = "This is a ruby extension for fast communication with LiteSpeed Web Server.".freeze
  s.email = "info@litespeedtech.com".freeze
  s.extensions = ["ext/lsapi/extconf.rb".freeze]
  s.extra_rdoc_files = ["README".freeze]
  s.files = ["README".freeze, "ext/lsapi/extconf.rb".freeze]
  s.homepage = "http://www.litespeedtech.com/".freeze
  s.rubygems_version = "3.3.26".freeze
  s.summary = "A ruby extension for fast communication with LiteSpeed Web Server.".freeze

  s.installed_by_version = "3.3.26" if s.respond_to? :installed_by_version
end
PK}$[����||&gems/specifications/rack-3.0.8.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: rack 3.0.8 ruby lib

Gem::Specification.new do |s|
  s.name = "rack".freeze
  s.version = "3.0.8"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "bug_tracker_uri" => "https://github.com/rack/rack/issues", "changelog_uri" => "https://github.com/rack/rack/blob/main/CHANGELOG.md", "documentation_uri" => "https://rubydoc.info/github/rack/rack", "source_code_uri" => "https://github.com/rack/rack" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Leah Neukirchen".freeze]
  s.date = "2023-06-14"
  s.description = "Rack provides a minimal, modular and adaptable interface for developing\nweb applications in Ruby. By wrapping HTTP requests and responses in\nthe simplest way possible, it unifies and distills the API for web\nservers, web frameworks, and software in between (the so-called\nmiddleware) into a single method call.\n".freeze
  s.email = "leah@vuxu.org".freeze
  s.extra_rdoc_files = ["README.md".freeze, "CHANGELOG.md".freeze, "CONTRIBUTING.md".freeze]
  s.files = ["CHANGELOG.md".freeze, "CONTRIBUTING.md".freeze, "README.md".freeze]
  s.homepage = "https://github.com/rack/rack".freeze
  s.licenses = ["MIT".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.4.0".freeze)
  s.rubygems_version = "3.3.26".freeze
  s.summary = "A modular Ruby webserver interface.".freeze

  s.installed_by_version = "3.3.26" if s.respond_to? :installed_by_version

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_development_dependency(%q<minitest>.freeze, ["~> 5.0"])
    s.add_development_dependency(%q<minitest-global_expectations>.freeze, [">= 0"])
    s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
    s.add_development_dependency(%q<rake>.freeze, [">= 0"])
  else
    s.add_dependency(%q<minitest>.freeze, ["~> 5.0"])
    s.add_dependency(%q<minitest-global_expectations>.freeze, [">= 0"])
    s.add_dependency(%q<bundler>.freeze, [">= 0"])
    s.add_dependency(%q<rake>.freeze, [">= 0"])
  end
end
PK}$[t���QQ1gems/specifications/default/io-wait-0.2.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: io-wait 0.2.1 ruby lib
# stub: ext/io/wait/extconf.rb

Gem::Specification.new do |s|
  s.name = "io-wait".freeze
  s.version = "0.2.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/io-wait", "source_code_uri" => "https://github.com/ruby/io-wait" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Nobu Nakada".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Waits until IO is readable or writable without blocking.".freeze
  s.email = ["nobu@ruby-lang.org".freeze]
  s.extensions = ["ext/io/wait/extconf.rb".freeze]
  s.files = ["ext/io/wait/extconf.rb".freeze, "io/wait.so".freeze]
  s.homepage = "https://github.com/ruby/io-wait".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.6.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Waits until IO is readable or writable without blocking.".freeze
end
PK}$[�V��2gems/specifications/default/readline-0.0.3.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: readline 0.0.3 ruby lib

Gem::Specification.new do |s|
  s.name = "readline".freeze
  s.version = "0.0.3"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["aycabta".freeze]
  s.date = "2025-04-28"
  s.description = "This is just a loader for \"readline\". If Ruby has the \"readline-ext\" gem\nthat is a native extension, this gem will load it. If Ruby does not have\nthe \"readline-ext\" gem this gem will load \"reline\", a library that is\ncompatible with the \"readline-ext\" gem and implemented in pure Ruby.\n".freeze
  s.email = ["aycabta@gmail.com".freeze]
  s.files = ["readline.rb".freeze]
  s.homepage = "https://github.com/ruby/readline".freeze
  s.licenses = ["Ruby".freeze]
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Loader for \"readline\".".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_runtime_dependency(%q<reline>.freeze, [">= 0"])
  else
    s.add_dependency(%q<reline>.freeze, [">= 0"])
  end
end
PK}$[M`���.gems/specifications/default/find-0.1.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: find 0.1.1 ruby lib

Gem::Specification.new do |s|
  s.name = "find".freeze
  s.version = "0.1.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/find", "source_code_uri" => "https://github.com/ruby/find" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Kazuki Tsujimoto".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "This module supports top-down traversal of a set of file paths.".freeze
  s.email = ["kazuki@callcc.net".freeze]
  s.files = ["find.rb".freeze]
  s.homepage = "https://github.com/ruby/find".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "This module supports top-down traversal of a set of file paths.".freeze
end
PK}$[�����/gems/specifications/default/fcntl-1.0.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: fcntl 1.0.1 ruby lib
# stub: ext/fcntl/extconf.rb

Gem::Specification.new do |s|
  s.name = "fcntl".freeze
  s.version = "1.0.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yukihiro Matsumoto".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Loads constants defined in the OS fcntl.h C header file".freeze
  s.email = ["matz@ruby-lang.org".freeze]
  s.extensions = ["ext/fcntl/extconf.rb".freeze]
  s.files = ["ext/fcntl/extconf.rb".freeze, "fcntl.so".freeze]
  s.homepage = "https://github.com/ruby/fcntl".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Loads constants defined in the OS fcntl.h C header file".freeze
end
PK}$[G�@���3gems/specifications/default/benchmark-0.2.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: benchmark 0.2.0 ruby lib

Gem::Specification.new do |s|
  s.name = "benchmark".freeze
  s.version = "0.2.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/benchmark", "source_code_uri" => "https://github.com/ruby/benchmark" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yukihiro Matsumoto".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "a performance benchmarking library".freeze
  s.email = ["matz@ruby-lang.org".freeze]
  s.files = ["lib/benchmark.rb".freeze, "lib/benchmark/version.rb".freeze]
  s.homepage = "https://github.com/ruby/benchmark".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.rubygems_version = "3.3.27".freeze
  s.summary = "a performance benchmarking library".freeze
end
PK}$[�F�[��1gems/specifications/default/strscan-3.0.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: strscan 3.0.1 ruby lib
# stub: ext/strscan/extconf.rb

Gem::Specification.new do |s|
  s.name = "strscan".freeze
  s.version = "3.0.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Minero Aoki".freeze, "Sutou Kouhei".freeze]
  s.date = "2025-04-28"
  s.description = "Provides lexical scanning operations on a String.".freeze
  s.email = [nil, "kou@cozmixng.org".freeze]
  s.extensions = ["ext/strscan/extconf.rb".freeze]
  s.files = ["ext/strscan/extconf.rb".freeze, "strscan.so".freeze]
  s.homepage = "https://github.com/ruby/strscan".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.4.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Provides lexical scanning operations on a String.".freeze
end
PK}$[U�kp��0gems/specifications/default/pstore-0.1.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: pstore 0.1.1 ruby lib

Gem::Specification.new do |s|
  s.name = "pstore".freeze
  s.version = "0.1.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/pstore", "source_code_uri" => "https://github.com/ruby/pstore" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yukihiro Matsumoto".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Transactional File Storage for Ruby Objects".freeze
  s.email = ["matz@ruby-lang.org".freeze]
  s.files = ["lib/pstore.rb".freeze]
  s.homepage = "https://github.com/ruby/pstore".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Transactional File Storage for Ruby Objects".freeze
end
PK}$[2��-gems/specifications/default/drb-2.1.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: drb 2.1.0 ruby lib

Gem::Specification.new do |s|
  s.name = "drb".freeze
  s.version = "2.1.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/drb", "source_code_uri" => "https://github.com/ruby/drb" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Masatoshi SEKI".freeze]
  s.date = "2025-04-28"
  s.description = "Distributed object system for Ruby".freeze
  s.email = ["seki@ruby-lang.org".freeze]
  s.files = ["lib/drb.rb".freeze, "lib/drb/acl.rb".freeze, "lib/drb/drb.rb".freeze, "lib/drb/eq.rb".freeze, "lib/drb/extserv.rb".freeze, "lib/drb/extservm.rb".freeze, "lib/drb/gw.rb".freeze, "lib/drb/invokemethod.rb".freeze, "lib/drb/observer.rb".freeze, "lib/drb/ssl.rb".freeze, "lib/drb/timeridconv.rb".freeze, "lib/drb/unix.rb".freeze, "lib/drb/version.rb".freeze, "lib/drb/weakidconv.rb".freeze]
  s.homepage = "https://github.com/ruby/drb".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.7.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Distributed object system for Ruby".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_runtime_dependency(%q<ruby2_keywords>.freeze, [">= 0"])
  else
    s.add_dependency(%q<ruby2_keywords>.freeze, [">= 0"])
  end
end
PK}$[��ק�,gems/specifications/default/pp-0.3.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: pp 0.3.0 ruby lib

Gem::Specification.new do |s|
  s.name = "pp".freeze
  s.version = "0.3.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/pp", "source_code_uri" => "https://github.com/ruby/pp" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Tanaka Akira".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Provides a PrettyPrinter for Ruby objects".freeze
  s.email = ["akr@fsij.org".freeze]
  s.files = ["pp.rb".freeze]
  s.homepage = "https://github.com/ruby/pp".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.7.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Provides a PrettyPrinter for Ruby objects".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_runtime_dependency(%q<prettyprint>.freeze, [">= 0"])
  else
    s.add_dependency(%q<prettyprint>.freeze, [">= 0"])
  end
end
PK}$[ݐ�=��.gems/specifications/default/yaml-0.2.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: yaml 0.2.0 ruby lib

Gem::Specification.new do |s|
  s.name = "yaml".freeze
  s.version = "0.2.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/yaml", "source_code_uri" => "https://github.com/ruby/yaml" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Aaron Patterson".freeze, "SHIBATA Hiroshi".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "YAML Ain't Markup Language".freeze
  s.email = ["aaron@tenderlovemaking.com".freeze, "hsbt@ruby-lang.org".freeze]
  s.files = ["lib/yaml.rb".freeze, "lib/yaml/dbm.rb".freeze, "lib/yaml/store.rb".freeze]
  s.homepage = "https://github.com/ruby/yaml".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.rubygems_version = "3.3.27".freeze
  s.summary = "YAML Ain't Markup Language".freeze
end
PK}$[��d�SS5gems/specifications/default/io-nonblock-0.1.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: io-nonblock 0.1.0 ruby lib
# stub: ext/io/nonblock/extconf.rb

Gem::Specification.new do |s|
  s.name = "io-nonblock".freeze
  s.version = "0.1.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/io-nonblock", "source_code_uri" => "https://github.com/ruby/io-nonblock" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Nobu Nakada".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Enables non-blocking mode with IO class".freeze
  s.email = ["nobu@ruby-lang.org".freeze]
  s.extensions = ["ext/io/nonblock/extconf.rb".freeze]
  s.files = ["ext/io/nonblock/extconf.rb".freeze, "io/nonblock.so".freeze]
  s.homepage = "https://github.com/ruby/io-nonblock".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Enables non-blocking mode with IO class".freeze
end
PK}$[^k� ��0gems/specifications/default/fiddle-1.1.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: fiddle 1.1.0 ruby lib
# stub: ext/fiddle/extconf.rb

Gem::Specification.new do |s|
  s.name = "fiddle".freeze
  s.version = "1.1.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "msys2_mingw_dependencies" => "libffi" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Aaron Patterson".freeze, "SHIBATA Hiroshi".freeze]
  s.date = "2025-04-28"
  s.description = "A libffi wrapper for Ruby.".freeze
  s.email = ["aaron@tenderlovemaking.com".freeze, "hsbt@ruby-lang.org".freeze]
  s.extensions = ["ext/fiddle/extconf.rb".freeze]
  s.files = ["ext/fiddle/extconf.rb".freeze, "fiddle.rb".freeze, "fiddle.so".freeze, "fiddle/closure.rb".freeze, "fiddle/cparser.rb".freeze, "fiddle/function.rb".freeze, "fiddle/import.rb".freeze, "fiddle/pack.rb".freeze, "fiddle/struct.rb".freeze, "fiddle/types.rb".freeze, "fiddle/value.rb".freeze, "fiddle/version.rb".freeze]
  s.homepage = "https://github.com/ruby/fiddle".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.5.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "A libffi wrapper for Ruby.".freeze
end
PK}$[��tt0gems/specifications/default/ipaddr-1.2.4.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: ipaddr 1.2.4 ruby lib

Gem::Specification.new do |s|
  s.name = "ipaddr".freeze
  s.version = "1.2.4"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Akinori MUSHA".freeze, "Hajimu UMEMOTO".freeze]
  s.date = "2025-04-28"
  s.description = "IPAddr provides a set of methods to manipulate an IP address.\nBoth IPv4 and IPv6 are supported.\n".freeze
  s.email = ["knu@idaemons.org".freeze, "ume@mahoroba.org".freeze]
  s.files = ["ipaddr.rb".freeze]
  s.homepage = "https://github.com/ruby/ipaddr".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "A class to manipulate an IP address in ruby".freeze
end
PK}$[��Cd0gems/specifications/default/base64-0.1.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: base64 0.1.1 ruby lib

Gem::Specification.new do |s|
  s.name = "base64".freeze
  s.version = "0.1.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/base64", "source_code_uri" => "https://github.com/ruby/base64" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yusuke Endoh".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Support for encoding and decoding binary data using a Base64 representation.".freeze
  s.email = ["mame@ruby-lang.org".freeze]
  s.files = ["base64.rb".freeze]
  s.homepage = "https://github.com/ruby/base64".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Support for encoding and decoding binary data using a Base64 representation.".freeze
end
PK}$[�%b���1gems/specifications/default/ostruct-0.5.2.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: ostruct 0.5.2 ruby lib

Gem::Specification.new do |s|
  s.name = "ostruct".freeze
  s.version = "0.5.2"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Marc-Andre Lafortune".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Class to build custom data structures, similar to a Hash.".freeze
  s.email = ["ruby-core@marc-andre.ca".freeze]
  s.files = ["lib/ostruct.rb".freeze]
  s.homepage = "https://github.com/ruby/ostruct".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.5.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Class to build custom data structures, similar to a Hash.".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
    s.add_development_dependency(%q<rake>.freeze, [">= 0"])
  else
    s.add_dependency(%q<bundler>.freeze, [">= 0"])
    s.add_dependency(%q<rake>.freeze, [">= 0"])
  end
end
PK}$[� �*��-gems/specifications/default/cgi-0.3.7.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: cgi 0.3.7 ruby lib
# stub: ext/cgi/escape/extconf.rb

Gem::Specification.new do |s|
  s.name = "cgi".freeze
  s.version = "0.3.7"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/cgi", "source_code_uri" => "https://github.com/ruby/cgi" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yukihiro Matsumoto".freeze]
  s.date = "2025-04-28"
  s.description = "Support for the Common Gateway Interface protocol.".freeze
  s.email = ["matz@ruby-lang.org".freeze]
  s.extensions = ["ext/cgi/escape/extconf.rb".freeze]
  s.files = ["ext/cgi/escape/extconf.rb".freeze, "lib/cgi.rb".freeze, "lib/cgi/cookie.rb".freeze, "lib/cgi/core.rb".freeze, "lib/cgi/html.rb".freeze, "lib/cgi/session.rb".freeze, "lib/cgi/session/pstore.rb".freeze, "lib/cgi/util.rb".freeze]
  s.homepage = "https://github.com/ruby/cgi".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.5.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Support for the Common Gateway Interface protocol.".freeze
end
PK}$[���3gems/specifications/default/fileutils-1.6.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: fileutils 1.6.0 ruby lib

Gem::Specification.new do |s|
  s.name = "fileutils".freeze
  s.version = "1.6.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "source_code_uri" => "https://github.com/ruby/fileutils" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Minero Aoki".freeze]
  s.date = "2025-04-28"
  s.description = "Several file utility methods for copying, moving, removing, etc.".freeze
  s.email = [nil]
  s.files = ["fileutils.rb".freeze]
  s.homepage = "https://github.com/ruby/fileutils".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.5.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Several file utility methods for copying, moving, removing, etc.".freeze
end
PK}$[ף��]]0gems/specifications/default/syslog-0.1.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: syslog 0.1.0 ruby lib
# stub: ext/syslog/extconf.rb

Gem::Specification.new do |s|
  s.name = "syslog".freeze
  s.version = "0.1.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/syslog", "source_code_uri" => "https://github.com/ruby/syslog" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Akinori MUSHA".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Ruby interface for the POSIX system logging facility.".freeze
  s.email = ["knu@idaemons.org".freeze]
  s.extensions = ["ext/syslog/extconf.rb".freeze]
  s.files = ["ext/syslog/extconf.rb".freeze, "syslog.so".freeze, "syslog/logger.rb".freeze]
  s.homepage = "https://github.com/ruby/syslog".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Ruby interface for the POSIX system logging facility.".freeze
end
PK}$[�.�<XX1gems/specifications/default/openssl-3.0.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: openssl 3.0.1 ruby lib
# stub: ext/openssl/extconf.rb

Gem::Specification.new do |s|
  s.name = "openssl".freeze
  s.version = "3.0.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "msys2_mingw_dependencies" => "openssl" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Martin Bosslet".freeze, "SHIBATA Hiroshi".freeze, "Zachary Scott".freeze, "Kazuki Yamaguchi".freeze]
  s.date = "2025-04-28"
  s.description = "It wraps the OpenSSL library.".freeze
  s.email = ["ruby-core@ruby-lang.org".freeze]
  s.extensions = ["ext/openssl/extconf.rb".freeze]
  s.extra_rdoc_files = ["CONTRIBUTING.md".freeze, "NEWS.md".freeze, "README.ja.md".freeze, "README.md".freeze]
  s.files = ["CONTRIBUTING.md".freeze, "NEWS.md".freeze, "README.ja.md".freeze, "README.md".freeze, "ext/openssl/extconf.rb".freeze, "openssl.rb".freeze, "openssl.so".freeze, "openssl/bn.rb".freeze, "openssl/buffering.rb".freeze, "openssl/cipher.rb".freeze, "openssl/digest.rb".freeze, "openssl/hmac.rb".freeze, "openssl/marshal.rb".freeze, "openssl/pkcs5.rb".freeze, "openssl/pkey.rb".freeze, "openssl/ssl.rb".freeze, "openssl/version.rb".freeze, "openssl/x509.rb".freeze]
  s.homepage = "https://github.com/ruby/openssl".freeze
  s.licenses = ["Ruby".freeze]
  s.rdoc_options = ["--main".freeze, "README.md".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.6.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "OpenSSL provides SSL, TLS and general purpose cryptography.".freeze
end
PK}$[4�?bWW6gems/specifications/default/net-protocol-0.1.2.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: net-protocol 0.1.2 ruby lib

Gem::Specification.new do |s|
  s.name = "net-protocol".freeze
  s.version = "0.1.2"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/net-protocol", "source_code_uri" => "https://github.com/ruby/net-protocol" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yukihiro Matsumoto".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "The abstruct interface for net-* client.".freeze
  s.email = ["matz@ruby-lang.org".freeze]
  s.files = ["lib/net/protocol.rb".freeze]
  s.homepage = "https://github.com/ruby/net-protocol".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.6.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "The abstruct interface for net-* client.".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_runtime_dependency(%q<timeout>.freeze, [">= 0"])
    s.add_runtime_dependency(%q<io-wait>.freeze, [">= 0"])
  else
    s.add_dependency(%q<timeout>.freeze, [">= 0"])
    s.add_dependency(%q<io-wait>.freeze, [">= 0"])
  end
end
PK}$[�J���2gems/specifications/default/tempfile-0.1.2.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: tempfile 0.1.2 ruby lib

Gem::Specification.new do |s|
  s.name = "tempfile".freeze
  s.version = "0.1.2"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/tempfile", "source_code_uri" => "https://github.com/ruby/tempfile" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yukihiro Matsumoto".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "A utility class for managing temporary files.".freeze
  s.email = ["matz@ruby-lang.org".freeze]
  s.files = ["tempfile.rb".freeze]
  s.homepage = "https://github.com/ruby/tempfile".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.5.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "A utility class for managing temporary files.".freeze
end
PK}$[k>\���2gems/specifications/default/pathname-0.2.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: pathname 0.2.0 ruby lib
# stub: ext/pathname/extconf.rb

Gem::Specification.new do |s|
  s.name = "pathname".freeze
  s.version = "0.2.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/pathname", "source_code_uri" => "https://github.com/ruby/pathname" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Tanaka Akira".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Representation of the name of a file or directory on the filesystem".freeze
  s.email = ["akr@fsij.org".freeze]
  s.extensions = ["ext/pathname/extconf.rb".freeze]
  s.files = ["ext/pathname/extconf.rb".freeze, "pathname.rb".freeze, "pathname.so".freeze]
  s.homepage = "https://github.com/ruby/pathname".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Representation of the name of a file or directory on the filesystem".freeze
end
PK}$[�x_���6gems/specifications/default/securerandom-0.2.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: securerandom 0.2.0 ruby lib

Gem::Specification.new do |s|
  s.name = "securerandom".freeze
  s.version = "0.2.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/securerandom", "source_code_uri" => "https://github.com/ruby/securerandom" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Tanaka Akira".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Interface for secure random number generator.".freeze
  s.email = ["akr@fsij.org".freeze]
  s.files = ["securerandom.rb".freeze]
  s.homepage = "https://github.com/ruby/securerandom".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.6.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Interface for secure random number generator.".freeze
end
PK}$[|��//6gems/specifications/default/readline-ext-0.1.4.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: readline-ext 0.1.4 ruby lib
# stub: ext/readline/extconf.rb

Gem::Specification.new do |s|
  s.name = "readline-ext".freeze
  s.version = "0.1.4"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/readline-ext", "source_code_uri" => "https://github.com/ruby/readline-ext" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yukihiro Matsumoto".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Provides an interface for GNU Readline and Edit Line (libedit).".freeze
  s.email = ["matz@ruby-lang.org".freeze]
  s.extensions = ["ext/readline/extconf.rb".freeze]
  s.files = ["ext/readline/extconf.rb".freeze, "readline.so".freeze]
  s.homepage = "https://github.com/ruby/readline-ext".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Provides an interface for GNU Readline and Edit Line (libedit).".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
    s.add_development_dependency(%q<rake>.freeze, [">= 0"])
    s.add_development_dependency(%q<rake-compiler>.freeze, [">= 0"])
  else
    s.add_dependency(%q<bundler>.freeze, [">= 0"])
    s.add_dependency(%q<rake>.freeze, [">= 0"])
    s.add_dependency(%q<rake-compiler>.freeze, [">= 0"])
  end
end
PK}$[+�����-gems/specifications/default/nkf-0.1.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: nkf 0.1.1 ruby lib

Gem::Specification.new do |s|
  s.name = "nkf".freeze
  s.version = "0.1.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/nkf", "source_code_uri" => "https://github.com/ruby/nkf" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["NARUSE Yui".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Ruby extension for Network Kanji Filter".freeze
  s.email = ["naruse@airemix.jp".freeze]
  s.files = ["nkf.so".freeze]
  s.homepage = "https://github.com/ruby/nkf".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Ruby extension for Network Kanji Filter".freeze
end
PK}$[킥���/gems/specifications/default/open3-0.1.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: open3 0.1.1 ruby lib

Gem::Specification.new do |s|
  s.name = "open3".freeze
  s.version = "0.1.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/open3", "source_code_uri" => "https://github.com/ruby/open3" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yukihiro Matsumoto".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Popen, but with stderr, too".freeze
  s.email = ["matz@ruby-lang.org".freeze]
  s.files = ["lib/open3.rb".freeze, "lib/open3/version.rb".freeze]
  s.homepage = "https://github.com/ruby/open3".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.6.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Popen, but with stderr, too".freeze
end
PK}$[�Mv�0gems/specifications/default/digest-3.1.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: digest 3.1.0 ruby lib
# stub: ext/digest/bubblebabble/extconf.rbext/digest/extconf.rbext/digest/md5/extconf.rbext/digest/rmd160/extconf.rbext/digest/sha1/extconf.rbext/digest/sha2/extconf.rb

Gem::Specification.new do |s|
  s.name = "digest".freeze
  s.version = "3.1.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "msys2_mingw_dependencies" => "openssl" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Akinori MUSHA".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Provides a framework for message digest libraries.".freeze
  s.email = ["knu@idaemons.org".freeze]
  s.extensions = ["ext/digest/bubblebabble/extconf.rb".freeze, "ext/digest/extconf.rb".freeze, "ext/digest/md5/extconf.rb".freeze, "ext/digest/rmd160/extconf.rb".freeze, "ext/digest/sha1/extconf.rb".freeze, "ext/digest/sha2/extconf.rb".freeze]
  s.files = ["digest.rb".freeze, "digest.so".freeze, "digest/bubblebabble.so".freeze, "digest/loader.rb".freeze, "digest/md5.so".freeze, "digest/rmd160.so".freeze, "digest/sha1.so".freeze, "digest/sha2.rb".freeze, "digest/sha2.so".freeze, "digest/sha2/loader.rb".freeze, "digest/version.rb".freeze, "ext/digest/bubblebabble/extconf.rb".freeze, "ext/digest/extconf.rb".freeze, "ext/digest/md5/extconf.rb".freeze, "ext/digest/rmd160/extconf.rb".freeze, "ext/digest/sha1/extconf.rb".freeze, "ext/digest/sha2/extconf.rb".freeze]
  s.homepage = "https://github.com/ruby/digest".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.5.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Provides a framework for message digest libraries.".freeze
end
PK}$[B���55-gems/specifications/default/set-1.0.2.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: set 1.0.2 ruby lib

Gem::Specification.new do |s|
  s.name = "set".freeze
  s.version = "1.0.2"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "changelog_uri" => "https://github.com/ruby/set/blob/v1.0.2/CHANGELOG.md", "homepage_uri" => "https://github.com/ruby/set", "source_code_uri" => "https://github.com/ruby/set" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Akinori MUSHA".freeze]
  s.date = "2025-04-28"
  s.description = "Provides a class to deal with collections of unordered, unique values".freeze
  s.email = ["knu@idaemons.org".freeze]
  s.files = ["lib/set.rb".freeze, "lib/set/sorted_set.rb".freeze]
  s.homepage = "https://github.com/ruby/set".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Provides a class to deal with collections of unordered, unique values".freeze
end
PK}$[�	**-gems/specifications/default/csv-3.2.5.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: csv 3.2.5 ruby lib

Gem::Specification.new do |s|
  s.name = "csv".freeze
  s.version = "3.2.5"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["James Edward Gray II".freeze, "Kouhei Sutou".freeze]
  s.date = "2025-04-28"
  s.description = "The CSV library provides a complete interface to CSV files and data. It offers tools to enable you to read and write to and from Strings or IO objects, as needed.".freeze
  s.email = [nil, "kou@cozmixng.org".freeze]
  s.extra_rdoc_files = ["LICENSE.txt".freeze, "NEWS.md".freeze, "README.md".freeze]
  s.files = ["LICENSE.txt".freeze, "NEWS.md".freeze, "README.md".freeze, "lib/csv.rb".freeze, "lib/csv/core_ext/array.rb".freeze, "lib/csv/core_ext/string.rb".freeze, "lib/csv/delete_suffix.rb".freeze, "lib/csv/fields_converter.rb".freeze, "lib/csv/input_record_separator.rb".freeze, "lib/csv/match_p.rb".freeze, "lib/csv/parser.rb".freeze, "lib/csv/row.rb".freeze, "lib/csv/table.rb".freeze, "lib/csv/version.rb".freeze, "lib/csv/writer.rb".freeze]
  s.homepage = "https://github.com/ruby/csv".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.rdoc_options = ["--main".freeze, "README.md".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.5.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "CSV Reading and Writing".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
    s.add_development_dependency(%q<rake>.freeze, [">= 0"])
    s.add_development_dependency(%q<benchmark_driver>.freeze, [">= 0"])
    s.add_development_dependency(%q<test-unit>.freeze, [">= 3.4.8"])
  else
    s.add_dependency(%q<bundler>.freeze, [">= 0"])
    s.add_dependency(%q<rake>.freeze, [">= 0"])
    s.add_dependency(%q<benchmark_driver>.freeze, [">= 0"])
    s.add_dependency(%q<test-unit>.freeze, [">= 3.4.8"])
  end
end
PK}$[�c���1gems/specifications/default/english-0.7.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: english 0.7.1 ruby lib

Gem::Specification.new do |s|
  s.name = "english".freeze
  s.version = "0.7.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/English", "source_code_uri" => "https://github.com/ruby/English" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yukihiro Matsumoto".freeze]
  s.date = "2025-04-28"
  s.description = "Require 'English.rb' to reference global variables with less cryptic names.".freeze
  s.email = ["matz@ruby-lang.org".freeze]
  s.files = ["English.rb".freeze]
  s.homepage = "https://github.com/ruby/English".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Require 'English.rb' to reference global variables with less cryptic names.".freeze
end
PK}$[K-���3gems/specifications/default/singleton-0.1.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: singleton 0.1.1 ruby lib

Gem::Specification.new do |s|
  s.name = "singleton".freeze
  s.version = "0.1.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/singleton", "source_code_uri" => "https://github.com/ruby/singleton" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yukihiro Matsumoto".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "The Singleton module implements the Singleton pattern.".freeze
  s.email = ["matz@ruby-lang.org".freeze]
  s.files = ["lib/singleton.rb".freeze]
  s.homepage = "https://github.com/ruby/singleton".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.rubygems_version = "3.3.27".freeze
  s.summary = "The Singleton module implements the Singleton pattern.".freeze
end
PK}$[�:d88.gems/specifications/default/racc-1.6.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: racc 1.6.0 ruby lib
# stub: ext/racc/cparse/extconf.rb

Gem::Specification.new do |s|
  s.name = "racc".freeze
  s.version = "1.6.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Minero Aoki".freeze, "Aaron Patterson".freeze]
  s.date = "2025-04-28"
  s.description = "Racc is a LALR(1) parser generator.\n  It is written in Ruby itself, and generates Ruby program.\n\n  NOTE: Ruby 1.8.x comes with Racc runtime module.  You\n  can run your parsers generated by racc 1.4.x out of the\n  box.\n".freeze
  s.email = [nil, "aaron@tenderlovemaking.com".freeze]
  s.executables = ["racc".freeze]
  s.extensions = ["ext/racc/cparse/extconf.rb".freeze]
  s.extra_rdoc_files = ["README.ja.rdoc".freeze, "README.rdoc".freeze]
  s.files = ["README.ja.rdoc".freeze, "README.rdoc".freeze, "bin/racc".freeze, "ext/racc/cparse/extconf.rb".freeze, "lib/racc.rb".freeze, "lib/racc/compat.rb".freeze, "lib/racc/debugflags.rb".freeze, "lib/racc/exception.rb".freeze, "lib/racc/grammar.rb".freeze, "lib/racc/grammarfileparser.rb".freeze, "lib/racc/info.rb".freeze, "lib/racc/iset.rb".freeze, "lib/racc/logfilegenerator.rb".freeze, "lib/racc/parser-text.rb".freeze, "lib/racc/parser.rb".freeze, "lib/racc/parserfilegenerator.rb".freeze, "lib/racc/sourcetext.rb".freeze, "lib/racc/state.rb".freeze, "lib/racc/statetransitiontable.rb".freeze, "lib/racc/static.rb".freeze]
  s.homepage = "https://i.loveruby.net/en/projects/racc/".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.rdoc_options = ["--main".freeze, "README.rdoc".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.5".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Racc is a LALR(1) parser generator".freeze
end
PK}$[��#~��2gems/specifications/default/observer-0.1.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: observer 0.1.1 ruby lib

Gem::Specification.new do |s|
  s.name = "observer".freeze
  s.version = "0.1.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/observer", "source_code_uri" => "https://github.com/ruby/observer" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yukihiro Matsumoto".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Implementation of the Observer object-oriented design pattern.".freeze
  s.email = ["matz@ruby-lang.org".freeze]
  s.files = ["lib/observer.rb".freeze]
  s.homepage = "https://github.com/ruby/observer".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Implementation of the Observer object-oriented design pattern.".freeze
end
PK}$[�˕4gems/specifications/default/shellwords-0.1.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: shellwords 0.1.0 ruby lib

Gem::Specification.new do |s|
  s.name = "shellwords".freeze
  s.version = "0.1.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/shellwords", "source_code_uri" => "https://github.com/ruby/shellwords" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Akinori MUSHA".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Manipulates strings with word parsing rules of UNIX Bourne shell.".freeze
  s.email = ["knu@idaemons.org".freeze]
  s.files = ["shellwords.rb".freeze]
  s.homepage = "https://github.com/ruby/shellwords".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Manipulates strings with word parsing rules of UNIX Bourne shell.".freeze
end
PK}$[m"k�CC6gems/specifications/default/did_you_mean-1.6.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: did_you_mean 1.6.1 ruby lib

Gem::Specification.new do |s|
  s.name = "did_you_mean".freeze
  s.version = "1.6.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yuki Nishijima".freeze]
  s.date = "2025-04-28"
  s.description = "The gem that has been saving people from typos since 2014.".freeze
  s.email = ["mail@yukinishijima.net".freeze]
  s.files = ["lib/did_you_mean.rb".freeze, "lib/did_you_mean/core_ext/name_error.rb".freeze, "lib/did_you_mean/experimental.rb".freeze, "lib/did_you_mean/formatter.rb".freeze, "lib/did_you_mean/formatters/plain_formatter.rb".freeze, "lib/did_you_mean/formatters/verbose_formatter.rb".freeze, "lib/did_you_mean/jaro_winkler.rb".freeze, "lib/did_you_mean/levenshtein.rb".freeze, "lib/did_you_mean/spell_checker.rb".freeze, "lib/did_you_mean/spell_checkers/key_error_checker.rb".freeze, "lib/did_you_mean/spell_checkers/method_name_checker.rb".freeze, "lib/did_you_mean/spell_checkers/name_error_checkers.rb".freeze, "lib/did_you_mean/spell_checkers/name_error_checkers/class_name_checker.rb".freeze, "lib/did_you_mean/spell_checkers/name_error_checkers/variable_name_checker.rb".freeze, "lib/did_you_mean/spell_checkers/null_checker.rb".freeze, "lib/did_you_mean/spell_checkers/pattern_key_name_checker.rb".freeze, "lib/did_you_mean/spell_checkers/require_path_checker.rb".freeze, "lib/did_you_mean/tree_spell_checker.rb".freeze, "lib/did_you_mean/verbose.rb".freeze, "lib/did_you_mean/version.rb".freeze]
  s.homepage = "https://github.com/ruby/did_you_mean".freeze
  s.licenses = ["MIT".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.5.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "\"Did you mean?\" experience in Ruby".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_development_dependency(%q<rake>.freeze, [">= 0"])
  else
    s.add_dependency(%q<rake>.freeze, [">= 0"])
  end
end
PK}$[�^n�((4gems/specifications/default/net-http-0.3.0.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: net-http 0.3.0.1 ruby lib

Gem::Specification.new do |s|
  s.name = "net-http".freeze
  s.version = "0.3.0.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/net-http", "source_code_uri" => "https://github.com/ruby/net-http" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["NARUSE, Yui".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "HTTP client api for Ruby.".freeze
  s.email = ["naruse@airemix.jp".freeze]
  s.files = ["lib/net/http.rb".freeze, "lib/net/http/backward.rb".freeze, "lib/net/http/exceptions.rb".freeze, "lib/net/http/generic_request.rb".freeze, "lib/net/http/header.rb".freeze, "lib/net/http/proxy_delta.rb".freeze, "lib/net/http/request.rb".freeze, "lib/net/http/requests.rb".freeze, "lib/net/http/response.rb".freeze, "lib/net/http/responses.rb".freeze, "lib/net/http/status.rb".freeze, "lib/net/https.rb".freeze]
  s.homepage = "https://github.com/ruby/net-http".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.6.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "HTTP client api for Ruby.".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_runtime_dependency(%q<uri>.freeze, [">= 0"])
  else
    s.add_dependency(%q<uri>.freeze, [">= 0"])
  end
end
PK}$[��z���/gems/specifications/default/tsort-0.1.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: tsort 0.1.0 ruby lib

Gem::Specification.new do |s|
  s.name = "tsort".freeze
  s.version = "0.1.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/tsort", "source_code_uri" => "https://github.com/ruby/tsort" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Tanaka Akira".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Topological sorting using Tarjan's algorithm".freeze
  s.email = ["akr@fsij.org".freeze]
  s.files = ["tsort.rb".freeze]
  s.homepage = "https://github.com/ruby/tsort".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Topological sorting using Tarjan's algorithm".freeze
end
PK}$[�p���1gems/specifications/default/mutex_m-0.1.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: mutex_m 0.1.1 ruby lib

Gem::Specification.new do |s|
  s.name = "mutex_m".freeze
  s.version = "0.1.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Keiju ISHITSUKA".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Mixin to extend objects to be handled like a Mutex.".freeze
  s.email = ["keiju@ruby-lang.org".freeze]
  s.files = ["mutex_m.rb".freeze]
  s.homepage = "https://github.com/ruby/mutex_m".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Mixin to extend objects to be handled like a Mutex.".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
    s.add_development_dependency(%q<rake>.freeze, [">= 0"])
    s.add_development_dependency(%q<test-unit>.freeze, [">= 0"])
  else
    s.add_dependency(%q<bundler>.freeze, [">= 0"])
    s.add_dependency(%q<rake>.freeze, [">= 0"])
    s.add_dependency(%q<test-unit>.freeze, [">= 0"])
  end
end
PK}$[`�R��2gems/specifications/default/optparse-0.2.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: optparse 0.2.0 ruby lib

Gem::Specification.new do |s|
  s.name = "optparse".freeze
  s.version = "0.2.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/optparse", "source_code_uri" => "https://github.com/ruby/optparse" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Nobu Nakada".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "OptionParser is a class for command-line option analysis.".freeze
  s.email = ["nobu@ruby-lang.org".freeze]
  s.files = ["lib/optionparser.rb".freeze, "lib/optparse.rb".freeze, "lib/optparse/ac.rb".freeze, "lib/optparse/date.rb".freeze, "lib/optparse/kwargs.rb".freeze, "lib/optparse/shellwords.rb".freeze, "lib/optparse/time.rb".freeze, "lib/optparse/uri.rb".freeze, "lib/optparse/version.rb".freeze]
  s.homepage = "https://github.com/ruby/optparse".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.5.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "OptionParser is a class for command-line option analysis.".freeze
end
PK}$[\`S��.gems/specifications/default/date-3.2.2.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: date 3.2.2 ruby lib
# stub: ext/date/extconf.rb

Gem::Specification.new do |s|
  s.name = "date".freeze
  s.version = "3.2.2"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Tadayoshi Funaba".freeze]
  s.date = "2025-04-28"
  s.description = "A subclass of Object includes Comparable module for handling dates.".freeze
  s.email = [nil]
  s.extensions = ["ext/date/extconf.rb".freeze]
  s.files = ["date.rb".freeze, "ext/date/extconf.rb".freeze]
  s.homepage = "https://github.com/ruby/date".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.4.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "A subclass of Object includes Comparable module for handling dates.".freeze
end
PK}$[�Nf;tt.gems/specifications/default/uri-0.12.4.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: uri 0.12.4 ruby lib

Gem::Specification.new do |s|
  s.name = "uri".freeze
  s.version = "0.12.4"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/uri", "source_code_uri" => "https://github.com/ruby/uri" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Akira Yamada".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "URI is a module providing classes to handle Uniform Resource Identifiers".freeze
  s.email = ["akira@ruby-lang.org".freeze]
  s.files = ["lib/uri.rb".freeze, "lib/uri/common.rb".freeze, "lib/uri/file.rb".freeze, "lib/uri/ftp.rb".freeze, "lib/uri/generic.rb".freeze, "lib/uri/http.rb".freeze, "lib/uri/https.rb".freeze, "lib/uri/ldap.rb".freeze, "lib/uri/ldaps.rb".freeze, "lib/uri/mailto.rb".freeze, "lib/uri/rfc2396_parser.rb".freeze, "lib/uri/rfc3986_parser.rb".freeze, "lib/uri/version.rb".freeze, "lib/uri/ws.rb".freeze, "lib/uri/wss.rb".freeze]
  s.homepage = "https://github.com/ruby/uri".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.4".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "URI is a module providing classes to handle Uniform Resource Identifiers".freeze
end
PK}$[�B�
��1gems/specifications/default/timeout-0.2.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: timeout 0.2.0 ruby lib

Gem::Specification.new do |s|
  s.name = "timeout".freeze
  s.version = "0.2.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/timeout", "source_code_uri" => "https://github.com/ruby/timeout" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yukihiro Matsumoto".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Auto-terminate potentially long-running operations in Ruby.".freeze
  s.email = ["matz@ruby-lang.org".freeze]
  s.files = ["lib/timeout.rb".freeze]
  s.homepage = "https://github.com/ruby/timeout".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Auto-terminate potentially long-running operations in Ruby.".freeze
end
PK}$[����0gems/specifications/default/abbrev-0.1.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: abbrev 0.1.0 ruby lib

Gem::Specification.new do |s|
  s.name = "abbrev".freeze
  s.version = "0.1.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/abbrev", "source_code_uri" => "https://github.com/ruby/abbrev" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Akinori MUSHA".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Calculates a set of unique abbreviations for a given set of strings".freeze
  s.email = ["knu@idaemons.org".freeze]
  s.files = ["abbrev.rb".freeze]
  s.homepage = "https://github.com/ruby/abbrev".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Calculates a set of unique abbreviations for a given set of strings".freeze
end
PK}$[�����0gems/specifications/default/reline-0.3.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: reline 0.3.1 ruby lib

Gem::Specification.new do |s|
  s.name = "reline".freeze
  s.version = "0.3.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["aycabta".freeze]
  s.date = "2025-04-28"
  s.description = "Alternative GNU Readline or Editline implementation by pure Ruby.".freeze
  s.email = ["aycabta@gmail.com".freeze]
  s.files = ["lib/reline.rb".freeze, "lib/reline/ansi.rb".freeze, "lib/reline/config.rb".freeze, "lib/reline/general_io.rb".freeze, "lib/reline/history.rb".freeze, "lib/reline/key_actor.rb".freeze, "lib/reline/key_actor/base.rb".freeze, "lib/reline/key_actor/emacs.rb".freeze, "lib/reline/key_actor/vi_command.rb".freeze, "lib/reline/key_actor/vi_insert.rb".freeze, "lib/reline/key_stroke.rb".freeze, "lib/reline/kill_ring.rb".freeze, "lib/reline/line_editor.rb".freeze, "lib/reline/terminfo.rb".freeze, "lib/reline/unicode.rb".freeze, "lib/reline/unicode/east_asian_width.rb".freeze, "lib/reline/version.rb".freeze, "lib/reline/windows.rb".freeze]
  s.homepage = "https://github.com/ruby/reline".freeze
  s.licenses = ["Ruby".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.5".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Alternative GNU Readline or Editline implementation by pure Ruby.".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_runtime_dependency(%q<io-console>.freeze, ["~> 0.5"])
  else
    s.add_dependency(%q<io-console>.freeze, ["~> 0.5"])
  end
end
PK}$[,ı���5gems/specifications/default/forwardable-1.3.2.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: forwardable 1.3.2 ruby lib

Gem::Specification.new do |s|
  s.name = "forwardable".freeze
  s.version = "1.3.2"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Keiju ISHITSUKA".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Provides delegation of specified methods to a designated object.".freeze
  s.email = ["keiju@ruby-lang.org".freeze]
  s.files = ["lib/forwardable.rb".freeze, "lib/forwardable/impl.rb".freeze]
  s.homepage = "https://github.com/ruby/forwardable".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.4.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Provides delegation of specified methods to a designated object.".freeze
end
PK}$[0��{kk4gems/specifications/default/stringio-3.0.1.2.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: stringio 3.0.1.2 ruby lib
# stub: ext/stringio/extconf.rb

Gem::Specification.new do |s|
  s.name = "stringio".freeze
  s.version = "3.0.1.2"

  s.required_rubygems_version = Gem::Requirement.new(">= 2.6".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Nobu Nakada".freeze]
  s.date = "2025-04-28"
  s.description = "Pseudo `IO` class from/to `String`.".freeze
  s.email = "nobu@ruby-lang.org".freeze
  s.extensions = ["ext/stringio/extconf.rb".freeze]
  s.files = ["ext/stringio/extconf.rb".freeze, "stringio.so".freeze]
  s.homepage = "https://github.com/ruby/stringio".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.5".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Pseudo IO on String".freeze
end
PK}$[��2gems/specifications/default/open-uri-0.2.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: open-uri 0.2.0 ruby lib

Gem::Specification.new do |s|
  s.name = "open-uri".freeze
  s.version = "0.2.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/open-uri", "source_code_uri" => "https://github.com/ruby/open-uri" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Tanaka Akira".freeze]
  s.date = "2025-04-28"
  s.description = "An easy-to-use wrapper for Net::HTTP, Net::HTTPS and Net::FTP.".freeze
  s.email = ["akr@fsij.org".freeze]
  s.files = ["open-uri.rb".freeze]
  s.homepage = "https://github.com/ruby/open-uri".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "An easy-to-use wrapper for Net::HTTP, Net::HTTPS and Net::FTP.".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_runtime_dependency(%q<uri>.freeze, [">= 0"])
    s.add_runtime_dependency(%q<stringio>.freeze, [">= 0"])
    s.add_runtime_dependency(%q<time>.freeze, [">= 0"])
  else
    s.add_dependency(%q<uri>.freeze, [">= 0"])
    s.add_dependency(%q<stringio>.freeze, [">= 0"])
    s.add_dependency(%q<time>.freeze, [">= 0"])
  end
end
PK}$[��
f��,gems/specifications/default/un-0.2.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: un 0.2.0 ruby lib

Gem::Specification.new do |s|
  s.name = "un".freeze
  s.version = "0.2.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/un", "source_code_uri" => "https://github.com/ruby/un" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["WATANABE Hirofumi".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Utilities to replace common UNIX commands".freeze
  s.email = ["eban@ruby-lang.org".freeze]
  s.files = ["un.rb".freeze]
  s.homepage = "https://github.com/ruby/un".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Utilities to replace common UNIX commands".freeze
end
PK}$[��	Ʌ�0gems/specifications/default/logger-1.5.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: logger 1.5.0 ruby lib

Gem::Specification.new do |s|
  s.name = "logger".freeze
  s.version = "1.5.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Naotoshi Seo".freeze, "SHIBATA Hiroshi".freeze]
  s.date = "2025-04-28"
  s.description = "Provides a simple logging utility for outputting messages.".freeze
  s.email = ["sonots@gmail.com".freeze, "hsbt@ruby-lang.org".freeze]
  s.files = ["lib/logger.rb".freeze, "lib/logger/errors.rb".freeze, "lib/logger/formatter.rb".freeze, "lib/logger/log_device.rb".freeze, "lib/logger/period.rb".freeze, "lib/logger/severity.rb".freeze, "lib/logger/version.rb".freeze]
  s.homepage = "https://github.com/ruby/logger".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Provides a simple logging utility for outputting messages.".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
    s.add_development_dependency(%q<rake>.freeze, [">= 12.3.3"])
    s.add_development_dependency(%q<test-unit>.freeze, [">= 0"])
    s.add_development_dependency(%q<rdoc>.freeze, [">= 0"])
  else
    s.add_dependency(%q<bundler>.freeze, [">= 0"])
    s.add_dependency(%q<rake>.freeze, [">= 12.3.3"])
    s.add_dependency(%q<test-unit>.freeze, [">= 0"])
    s.add_dependency(%q<rdoc>.freeze, [">= 0"])
  end
end
PK}$[�����0gems/specifications/default/tmpdir-0.1.2.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: tmpdir 0.1.2 ruby lib

Gem::Specification.new do |s|
  s.name = "tmpdir".freeze
  s.version = "0.1.2"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/tmpdir", "source_code_uri" => "https://github.com/ruby/tmpdir" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yukihiro Matsumoto".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Extends the Dir class to manage the OS temporary file path.".freeze
  s.email = ["matz@ruby-lang.org".freeze]
  s.files = ["tmpdir.rb".freeze]
  s.homepage = "https://github.com/ruby/tmpdir".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Extends the Dir class to manage the OS temporary file path.".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_runtime_dependency(%q<fileutils>.freeze, [">= 0"])
  else
    s.add_dependency(%q<fileutils>.freeze, [">= 0"])
  end
end
PK}$[!zSS4gems/specifications/default/getoptlong-0.1.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: getoptlong 0.1.1 ruby lib

Gem::Specification.new do |s|
  s.name = "getoptlong".freeze
  s.version = "0.1.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/getoptlong", "source_code_uri" => "https://github.com/ruby/getoptlong" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yukihiro Matsumoto".freeze]
  s.date = "2025-04-28"
  s.description = "GetoptLong for Ruby".freeze
  s.email = ["matz@ruby-lang.org".freeze]
  s.files = ["lib/getoptlong.rb".freeze]
  s.homepage = "https://github.com/ruby/getoptlong".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.rubygems_version = "3.3.27".freeze
  s.summary = "GetoptLong for Ruby".freeze
end
PK}$[0�3��/gems/specifications/default/rinda-0.1.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: rinda 0.1.1 ruby lib

Gem::Specification.new do |s|
  s.name = "rinda".freeze
  s.version = "0.1.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/rinda", "source_code_uri" => "https://github.com/ruby/rinda" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Masatoshi SEKI".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "The Linda distributed computing paradigm in Ruby.".freeze
  s.email = ["seki@ruby-lang.org".freeze]
  s.files = ["lib/rinda/rinda.rb".freeze, "lib/rinda/ring.rb".freeze, "lib/rinda/tuplespace.rb".freeze]
  s.homepage = "https://github.com/ruby/rinda".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "The Linda distributed computing paradigm in Ruby.".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_runtime_dependency(%q<drb>.freeze, [">= 0"])
    s.add_runtime_dependency(%q<ipaddr>.freeze, [">= 0"])
    s.add_runtime_dependency(%q<forwardable>.freeze, [">= 0"])
  else
    s.add_dependency(%q<drb>.freeze, [">= 0"])
    s.add_dependency(%q<ipaddr>.freeze, [">= 0"])
    s.add_dependency(%q<forwardable>.freeze, [">= 0"])
  end
end
PK}$[�sz��8gems/specifications/default/resolv-replace-0.1.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: resolv-replace 0.1.0 ruby lib

Gem::Specification.new do |s|
  s.name = "resolv-replace".freeze
  s.version = "0.1.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/resolv-replace", "source_code_uri" => "https://github.com/ruby/resolv-replace" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Tanaka Akira".freeze]
  s.date = "2025-04-28"
  s.description = "Replace Socket DNS with Resolv.".freeze
  s.email = ["akr@fsij.org".freeze]
  s.files = ["resolv-replace.rb".freeze]
  s.homepage = "https://github.com/ruby/resolv-replace".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Replace Socket DNS with Resolv.".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_runtime_dependency(%q<resolv>.freeze, [">= 0"])
  else
    s.add_dependency(%q<resolv>.freeze, [">= 0"])
  end
end
PK}$[%fZ3��1gems/specifications/default/weakref-0.1.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: weakref 0.1.1 ruby lib

Gem::Specification.new do |s|
  s.name = "weakref".freeze
  s.version = "0.1.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/weakref", "source_code_uri" => "https://github.com/ruby/weakref" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yukihiro Matsumoto".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Allows a referenced object to be garbage-collected.".freeze
  s.email = ["matz@ruby-lang.org".freeze]
  s.files = ["lib/weakref.rb".freeze]
  s.homepage = "https://github.com/ruby/weakref".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Allows a referenced object to be garbage-collected.".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_runtime_dependency(%q<delegate>.freeze, [">= 0"])
  else
    s.add_dependency(%q<delegate>.freeze, [">= 0"])
  end
end
PK}$[���P��-gems/specifications/default/erb-2.2.3.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: erb 2.2.3 ruby lib

Gem::Specification.new do |s|
  s.name = "erb".freeze
  s.version = "2.2.3"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/erb", "source_code_uri" => "https://github.com/ruby/erb" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Masatoshi SEKI".freeze]
  s.bindir = "libexec".freeze
  s.date = "2025-04-28"
  s.description = "An easy to use but powerful templating system for Ruby.".freeze
  s.email = ["seki@ruby-lang.org".freeze]
  s.executables = ["erb".freeze]
  s.files = ["erb.rb".freeze, "libexec/erb".freeze]
  s.homepage = "https://github.com/ruby/erb".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.5.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "An easy to use but powerful templating system for Ruby.".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_runtime_dependency(%q<cgi>.freeze, [">= 0"])
  else
    s.add_dependency(%q<cgi>.freeze, [">= 0"])
  end
end
PK}$[�S4p%%-gems/specifications/default/etc-1.3.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: etc 1.3.0 ruby lib
# stub: ext/etc/extconf.rb

Gem::Specification.new do |s|
  s.name = "etc".freeze
  s.version = "1.3.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yukihiro Matsumoto".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Provides access to information typically stored in UNIX /etc directory.".freeze
  s.email = ["matz@ruby-lang.org".freeze]
  s.extensions = ["ext/etc/extconf.rb".freeze]
  s.files = ["etc.so".freeze, "ext/etc/extconf.rb".freeze]
  s.homepage = "https://github.com/ruby/etc".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Provides access to information typically stored in UNIX /etc directory.".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
    s.add_development_dependency(%q<rake>.freeze, [">= 0"])
    s.add_development_dependency(%q<rake-compiler>.freeze, [">= 0"])
    s.add_development_dependency(%q<test-unit>.freeze, [">= 0"])
  else
    s.add_dependency(%q<bundler>.freeze, [">= 0"])
    s.add_dependency(%q<rake>.freeze, [">= 0"])
    s.add_dependency(%q<rake-compiler>.freeze, [">= 0"])
    s.add_dependency(%q<test-unit>.freeze, [">= 0"])
  end
end
PK}$[��"8gems/specifications/default/ruby2_keywords-0.0.5.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: ruby2_keywords 0.0.5 ruby lib

Gem::Specification.new do |s|
  s.name = "ruby2_keywords".freeze
  s.version = "0.0.5"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Nobuyoshi Nakada".freeze]
  s.date = "2025-04-28"
  s.extra_rdoc_files = ["LICENSE".freeze, "README.md".freeze, "ChangeLog".freeze]
  s.files = ["ChangeLog".freeze, "LICENSE".freeze, "README.md".freeze, "ruby2_keywords.rb".freeze]
  s.homepage = "https://github.com/ruby/ruby2_keywords".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.rdoc_options = ["--main".freeze, "README.md".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.0.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Shim library for Module#ruby2_keywords".freeze
end
PK}$[ `?���.gems/specifications/default/zlib-2.1.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: zlib 2.1.1 ruby lib
# stub: ext/zlib/extconf.rb

Gem::Specification.new do |s|
  s.name = "zlib".freeze
  s.version = "2.1.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yukihiro Matsumoto".freeze, "UENO Katsuhiro".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Ruby interface for the zlib compression/decompression library".freeze
  s.email = ["matz@ruby-lang.org".freeze, nil]
  s.extensions = ["ext/zlib/extconf.rb".freeze]
  s.files = ["ext/zlib/extconf.rb".freeze, "zlib.so".freeze]
  s.homepage = "https://github.com/ruby/zlib".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Ruby interface for the zlib compression/decompression library".freeze
end
PK}$[5��59gems/specifications/default/error_highlight-0.3.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: error_highlight 0.3.0 ruby lib

Gem::Specification.new do |s|
  s.name = "error_highlight".freeze
  s.version = "0.3.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yusuke Endoh".freeze]
  s.date = "2025-04-28"
  s.description = "The gem enhances Exception#message by adding a short explanation where the exception is raised".freeze
  s.email = ["mame@ruby-lang.org".freeze]
  s.files = ["lib/error_highlight.rb".freeze, "lib/error_highlight/base.rb".freeze, "lib/error_highlight/core_ext.rb".freeze, "lib/error_highlight/formatter.rb".freeze, "lib/error_highlight/version.rb".freeze]
  s.homepage = "https://github.com/ruby/error_highlight".freeze
  s.licenses = ["MIT".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 3.1.0.dev".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Shows a one-line code snippet with an underline in the error backtrace".freeze
end
PK}$[��f���.gems/specifications/default/time-0.2.2.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: time 0.2.2 ruby lib

Gem::Specification.new do |s|
  s.name = "time".freeze
  s.version = "0.2.2"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/time", "source_code_uri" => "https://github.com/ruby/time" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Tanaka Akira".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Extends the Time class with methods for parsing and conversion.".freeze
  s.email = ["akr@fsij.org".freeze]
  s.files = ["time.rb".freeze]
  s.homepage = "https://github.com/ruby/time".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Extends the Time class with methods for parsing and conversion.".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_runtime_dependency(%q<date>.freeze, [">= 0"])
  else
    s.add_dependency(%q<date>.freeze, [">= 0"])
  end
end
PK}$[��dY��5gems/specifications/default/prettyprint-0.1.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: prettyprint 0.1.1 ruby lib

Gem::Specification.new do |s|
  s.name = "prettyprint".freeze
  s.version = "0.1.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/prettyprint", "source_code_uri" => "https://github.com/ruby/prettyprint" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Tanaka Akira".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Implements a pretty printing algorithm for readable structure.".freeze
  s.email = ["akr@fsij.org".freeze]
  s.files = ["prettyprint.rb".freeze]
  s.homepage = "https://github.com/ruby/prettyprint".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Implements a pretty printing algorithm for readable structure.".freeze
end
PK}$[oK��2gems/specifications/default/delegate-0.2.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: delegate 0.2.0 ruby lib

Gem::Specification.new do |s|
  s.name = "delegate".freeze
  s.version = "0.2.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/delegate", "source_code_uri" => "https://github.com/ruby/delegate" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Yukihiro Matsumoto".freeze]
  s.date = "2025-04-28"
  s.description = "Provides three abilities to delegate method calls to an object.".freeze
  s.email = ["matz@ruby-lang.org".freeze]
  s.files = ["lib/delegate.rb".freeze]
  s.homepage = "https://github.com/ruby/delegate".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.7".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Provides three abilities to delegate method calls to an object.".freeze
end
PK}$[5��i��0gems/specifications/default/resolv-0.2.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: resolv 0.2.1 ruby lib

Gem::Specification.new do |s|
  s.name = "resolv".freeze
  s.version = "0.2.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "homepage_uri" => "https://github.com/ruby/resolv", "source_code_uri" => "https://github.com/ruby/resolv" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Tanaka Akira".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Thread-aware DNS resolver library in Ruby.".freeze
  s.email = ["akr@fsij.org".freeze]
  s.files = ["resolv.rb".freeze]
  s.homepage = "https://github.com/ruby/resolv".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Thread-aware DNS resolver library in Ruby.".freeze
end
PK}$[����,gems/specifications/bigdecimal-3.1.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: bigdecimal 3.1.1 ruby lib
# stub: ext/bigdecimal/extconf.rb

Gem::Specification.new do |s|
  s.name = "bigdecimal".freeze
  s.version = "3.1.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Kenta Murata".freeze, "Zachary Scott".freeze, "Shigeo Kobayashi".freeze]
  s.date = "2025-04-28"
  s.description = "This library provides arbitrary-precision decimal floating-point number class.".freeze
  s.email = ["mrkn@mrkn.jp".freeze]
  s.extensions = ["ext/bigdecimal/extconf.rb".freeze]
  s.files = ["bigdecimal.rb".freeze, "bigdecimal.so".freeze, "bigdecimal/jacobian.rb".freeze, "bigdecimal/ludcmp.rb".freeze, "bigdecimal/math.rb".freeze, "bigdecimal/newton.rb".freeze, "bigdecimal/util.rb".freeze, "ext/bigdecimal/extconf.rb".freeze]
  s.homepage = "https://github.com/ruby/bigdecimal".freeze
  s.licenses = ["Ruby".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.5.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Arbitrary-precision decimal floating-point number library.".freeze
end
PK}$[�J��
�
'gems/specifications/psych-4.0.4.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: psych 4.0.4 ruby lib
# stub: ext/psych/extconf.rb

Gem::Specification.new do |s|
  s.name = "psych".freeze
  s.version = "4.0.4"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Aaron Patterson".freeze, "SHIBATA Hiroshi".freeze, "Charles Oliver Nutter".freeze]
  s.date = "2025-04-28"
  s.description = "Psych is a YAML parser and emitter. Psych leverages libyaml[https://pyyaml.org/wiki/LibYAML]\nfor its YAML parsing and emitting capabilities. In addition to wrapping libyaml,\nPsych also knows how to serialize and de-serialize most Ruby objects to and from the YAML format.\n".freeze
  s.email = ["aaron@tenderlovemaking.com".freeze, "hsbt@ruby-lang.org".freeze, "headius@headius.com".freeze]
  s.extensions = ["ext/psych/extconf.rb".freeze]
  s.extra_rdoc_files = ["README.md".freeze]
  s.files = ["README.md".freeze, "ext/psych/extconf.rb".freeze, "psych.rb".freeze, "psych.so".freeze, "psych/class_loader.rb".freeze, "psych/coder.rb".freeze, "psych/core_ext.rb".freeze, "psych/exception.rb".freeze, "psych/handler.rb".freeze, "psych/handlers/document_stream.rb".freeze, "psych/handlers/recorder.rb".freeze, "psych/json/ruby_events.rb".freeze, "psych/json/stream.rb".freeze, "psych/json/tree_builder.rb".freeze, "psych/json/yaml_events.rb".freeze, "psych/nodes.rb".freeze, "psych/nodes/alias.rb".freeze, "psych/nodes/document.rb".freeze, "psych/nodes/mapping.rb".freeze, "psych/nodes/node.rb".freeze, "psych/nodes/scalar.rb".freeze, "psych/nodes/sequence.rb".freeze, "psych/nodes/stream.rb".freeze, "psych/omap.rb".freeze, "psych/parser.rb".freeze, "psych/scalar_scanner.rb".freeze, "psych/set.rb".freeze, "psych/stream.rb".freeze, "psych/streaming.rb".freeze, "psych/syntax_error.rb".freeze, "psych/tree_builder.rb".freeze, "psych/versions.rb".freeze, "psych/visitors.rb".freeze, "psych/visitors/depth_first.rb".freeze, "psych/visitors/emitter.rb".freeze, "psych/visitors/json_tree.rb".freeze, "psych/visitors/to_ruby.rb".freeze, "psych/visitors/visitor.rb".freeze, "psych/visitors/yaml_tree.rb".freeze, "psych/y.rb".freeze]
  s.homepage = "https://github.com/ruby/psych".freeze
  s.licenses = ["MIT".freeze]
  s.rdoc_options = ["--main".freeze, "README.md".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.4.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Psych is a YAML parser and emitter".freeze

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_runtime_dependency(%q<stringio>.freeze, [">= 0"])
  else
    s.add_dependency(%q<stringio>.freeze, [">= 0"])
  end
end
PK}$[ƺ:WZZ'gems/specifications/rake-13.0.6.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: rake 13.0.6 ruby lib

Gem::Specification.new do |s|
  s.name = "rake".freeze
  s.version = "13.0.6"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "bug_tracker_uri" => "https://github.com/ruby/rake/issues", "changelog_uri" => "https://github.com/ruby/rake/blob/v13.0.6/History.rdoc", "documentation_uri" => "https://ruby.github.io/rake", "source_code_uri" => "https://github.com/ruby/rake/tree/v13.0.6" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Hiroshi SHIBATA".freeze, "Eric Hodel".freeze, "Jim Weirich".freeze]
  s.bindir = "exe".freeze
  s.date = "2025-04-28"
  s.description = "Rake is a Make-like program implemented in Ruby. Tasks and dependencies are\nspecified in standard Ruby syntax.\nRake has the following features:\n  * Rakefiles (rake's version of Makefiles) are completely defined in standard Ruby syntax.\n    No XML files to edit. No quirky Makefile syntax to worry about (is that a tab or a space?)\n  * Users can specify tasks with prerequisites.\n  * Rake supports rule patterns to synthesize implicit tasks.\n  * Flexible FileLists that act like arrays but know about manipulating file names and paths.\n  * Supports parallel execution of tasks.\n".freeze
  s.email = ["hsbt@ruby-lang.org".freeze, "drbrain@segment7.net".freeze, "".freeze]
  s.executables = ["rake".freeze]
  s.files = ["exe/rake".freeze]
  s.homepage = "https://github.com/ruby/rake".freeze
  s.licenses = ["MIT".freeze]
  s.rdoc_options = ["--main".freeze, "README.rdoc".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.2".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Rake is a Make-like program implemented in Ruby".freeze

  s.installed_by_version = "3.3.27" if s.respond_to? :installed_by_version
end
PK}$[U�v��&gems/specifications/json-2.6.1.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: json 2.6.1 ruby lib
# stub: ext/json/ext/generator/extconf.rbext/json/ext/parser/extconf.rbext/json/extconf.rb

Gem::Specification.new do |s|
  s.name = "json".freeze
  s.version = "2.6.1"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "bug_tracker_uri" => "https://github.com/flori/json/issues", "changelog_uri" => "https://github.com/flori/json/blob/master/CHANGES.md", "documentation_uri" => "http://flori.github.io/json/doc/index.html", "homepage_uri" => "http://flori.github.io/json/", "source_code_uri" => "https://github.com/flori/json", "wiki_uri" => "https://github.com/flori/json/wiki" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Florian Frank".freeze]
  s.date = "2025-04-28"
  s.description = "This is a JSON implementation as a Ruby extension in C.".freeze
  s.email = "flori@ping.de".freeze
  s.extensions = ["ext/json/ext/generator/extconf.rb".freeze, "ext/json/ext/parser/extconf.rb".freeze, "ext/json/extconf.rb".freeze]
  s.extra_rdoc_files = ["README.md".freeze]
  s.files = ["README.md".freeze, "ext/json/ext/generator/extconf.rb".freeze, "ext/json/ext/parser/extconf.rb".freeze, "ext/json/extconf.rb".freeze, "json.rb".freeze, "json/add/bigdecimal.rb".freeze, "json/add/complex.rb".freeze, "json/add/core.rb".freeze, "json/add/date.rb".freeze, "json/add/date_time.rb".freeze, "json/add/exception.rb".freeze, "json/add/ostruct.rb".freeze, "json/add/range.rb".freeze, "json/add/rational.rb".freeze, "json/add/regexp.rb".freeze, "json/add/set.rb".freeze, "json/add/struct.rb".freeze, "json/add/symbol.rb".freeze, "json/add/time.rb".freeze, "json/common.rb".freeze, "json/ext.rb".freeze, "json/ext/generator.so".freeze, "json/ext/parser.so".freeze, "json/generic_object.rb".freeze, "json/version.rb".freeze]
  s.homepage = "http://flori.github.com/json".freeze
  s.licenses = ["Ruby".freeze]
  s.rdoc_options = ["--title".freeze, "JSON implementation for Ruby".freeze, "--main".freeze, "README.md".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.3".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "JSON Implementation for Ruby".freeze
end
PK}$[hso���(gems/specifications/rackup-2.1.0.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: rackup 2.1.0 ruby lib

Gem::Specification.new do |s|
  s.name = "rackup".freeze
  s.version = "2.1.0"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.require_paths = ["lib".freeze]
  s.authors = ["Samuel Williams".freeze, "Jeremy Evans".freeze]
  s.date = "2023-01-27"
  s.executables = ["rackup".freeze]
  s.files = ["bin/rackup".freeze]
  s.homepage = "https://github.com/rack/rackup".freeze
  s.licenses = ["MIT".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.4.0".freeze)
  s.rubygems_version = "3.3.26".freeze
  s.summary = "A general server command for Rack applications.".freeze

  s.installed_by_version = "3.3.26" if s.respond_to? :installed_by_version

  if s.respond_to? :specification_version then
    s.specification_version = 4
  end

  if s.respond_to? :add_runtime_dependency then
    s.add_runtime_dependency(%q<rack>.freeze, [">= 3"])
    s.add_runtime_dependency(%q<webrick>.freeze, ["~> 1.8"])
    s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
    s.add_development_dependency(%q<minitest>.freeze, ["~> 5.0"])
    s.add_development_dependency(%q<minitest-global_expectations>.freeze, [">= 0"])
    s.add_development_dependency(%q<minitest-sprint>.freeze, [">= 0"])
    s.add_development_dependency(%q<rake>.freeze, [">= 0"])
  else
    s.add_dependency(%q<rack>.freeze, [">= 3"])
    s.add_dependency(%q<webrick>.freeze, ["~> 1.8"])
    s.add_dependency(%q<bundler>.freeze, [">= 0"])
    s.add_dependency(%q<minitest>.freeze, ["~> 5.0"])
    s.add_dependency(%q<minitest-global_expectations>.freeze, [">= 0"])
    s.add_dependency(%q<minitest-sprint>.freeze, [">= 0"])
    s.add_dependency(%q<rake>.freeze, [">= 0"])
  end
end
PK}$[O?�R-gems/specifications/io-console-0.5.11.gemspecnu�[���# -*- encoding: utf-8 -*-
# stub: io-console 0.5.11 ruby lib
# stub: ext/io/console/extconf.rb

Gem::Specification.new do |s|
  s.name = "io-console".freeze
  s.version = "0.5.11"

  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
  s.metadata = { "source_code_url" => "https://github.com/ruby/io-console" } if s.respond_to? :metadata=
  s.require_paths = ["lib".freeze]
  s.authors = ["Nobu Nakada".freeze]
  s.date = "2025-04-28"
  s.description = "add console capabilities to IO instances.".freeze
  s.email = "nobu@ruby-lang.org".freeze
  s.extensions = ["ext/io/console/extconf.rb".freeze]
  s.files = ["ext/io/console/extconf.rb".freeze, "io/console.so".freeze, "io/console/size.rb".freeze]
  s.homepage = "https://github.com/ruby/io-console".freeze
  s.licenses = ["Ruby".freeze, "BSD-2-Clause".freeze]
  s.required_ruby_version = Gem::Requirement.new(">= 2.6.0".freeze)
  s.rubygems_version = "3.3.27".freeze
  s.summary = "Console interface".freeze
end
PK}$[@��ϼ�+gems/gems/psych-4.0.4/lib/psych/versions.rbnu�[���# frozen_string_literal: true

module Psych
  # The version of Psych you are using
  VERSION = '4.0.4'

  if RUBY_ENGINE == 'jruby'
    DEFAULT_SNAKEYAML_VERSION = '1.28'.freeze
  end
end
PK}$[)��))0gems/gems/psych-4.0.4/lib/psych/nodes/mapping.rbnu�[���# frozen_string_literal: true
module Psych
  module Nodes
    ###
    # This class represents a {YAML Mapping}[http://yaml.org/spec/1.1/#mapping].
    #
    # A Psych::Nodes::Mapping node may have 0 or more children, but must have
    # an even number of children.  Here are the valid children a
    # Psych::Nodes::Mapping node may have:
    #
    # * Psych::Nodes::Sequence
    # * Psych::Nodes::Mapping
    # * Psych::Nodes::Scalar
    # * Psych::Nodes::Alias
    class Mapping < Psych::Nodes::Node
      # Any Map Style
      ANY   = 0

      # Block Map Style
      BLOCK = 1

      # Flow Map Style
      FLOW  = 2

      # The optional anchor for this mapping
      attr_accessor :anchor

      # The optional tag for this mapping
      attr_accessor :tag

      # Is this an implicit mapping?
      attr_accessor :implicit

      # The style of this mapping
      attr_accessor :style

      ###
      # Create a new Psych::Nodes::Mapping object.
      #
      # +anchor+ is the anchor associated with the map or +nil+.
      # +tag+ is the tag associated with the map or +nil+.
      # +implicit+ is a boolean indicating whether or not the map was implicitly
      # started.
      # +style+ is an integer indicating the mapping style.
      #
      # == See Also
      # See also Psych::Handler#start_mapping
      def initialize anchor = nil, tag = nil, implicit = true, style = BLOCK
        super()
        @anchor   = anchor
        @tag      = tag
        @implicit = implicit
        @style    = style
      end

      def mapping?; true; end
    end
  end
end
PK}$[Ϧ[/gems/gems/psych-4.0.4/lib/psych/nodes/stream.rbnu�[���# frozen_string_literal: true
module Psych
  module Nodes
    ###
    # Represents a YAML stream.  This is the root node for any YAML parse
    # tree.  This node must have one or more child nodes.  The only valid
    # child node for a Psych::Nodes::Stream node is Psych::Nodes::Document.
    class Stream < Psych::Nodes::Node

      # Encodings supported by Psych (and libyaml)

      # Any encoding
      ANY     = Psych::Parser::ANY

      # UTF-8 encoding
      UTF8    = Psych::Parser::UTF8

      # UTF-16LE encoding
      UTF16LE = Psych::Parser::UTF16LE

      # UTF-16BE encoding
      UTF16BE = Psych::Parser::UTF16BE

      # The encoding used for this stream
      attr_accessor :encoding

      ###
      # Create a new Psych::Nodes::Stream node with an +encoding+ that
      # defaults to Psych::Nodes::Stream::UTF8.
      #
      # See also Psych::Handler#start_stream
      def initialize encoding = UTF8
        super()
        @encoding = encoding
      end

      def stream?; true; end
    end
  end
end
PK}$[��AA1gems/gems/psych-4.0.4/lib/psych/nodes/document.rbnu�[���# frozen_string_literal: true
module Psych
  module Nodes
    ###
    # This represents a YAML Document.  This node must be a child of
    # Psych::Nodes::Stream.  A Psych::Nodes::Document must have one child,
    # and that child may be one of the following:
    #
    # * Psych::Nodes::Sequence
    # * Psych::Nodes::Mapping
    # * Psych::Nodes::Scalar
    class Document < Psych::Nodes::Node
      # The version of the YAML document
      attr_accessor :version

      # A list of tag directives for this document
      attr_accessor :tag_directives

      # Was this document implicitly created?
      attr_accessor :implicit

      # Is the end of the document implicit?
      attr_accessor :implicit_end

      ###
      # Create a new Psych::Nodes::Document object.
      #
      # +version+ is a list indicating the YAML version.
      # +tags_directives+ is a list of tag directive declarations
      # +implicit+ is a flag indicating whether the document will be implicitly
      # started.
      #
      # == Example:
      # This creates a YAML document object that represents a YAML 1.1 document
      # with one tag directive, and has an implicit start:
      #
      #   Psych::Nodes::Document.new(
      #     [1,1],
      #     [["!", "tag:tenderlovemaking.com,2009:"]],
      #     true
      #   )
      #
      # == See Also
      # See also Psych::Handler#start_document
      def initialize version = [], tag_directives = [], implicit = false
        super()
        @version        = version
        @tag_directives = tag_directives
        @implicit       = implicit
        @implicit_end   = true
      end

      ###
      # Returns the root node.  A Document may only have one root node:
      # http://yaml.org/spec/1.1/#id898031
      def root
        children.first
      end

      def document?; true; end
    end
  end
end
PK}$[�����/gems/gems/psych-4.0.4/lib/psych/nodes/scalar.rbnu�[���# frozen_string_literal: true
module Psych
  module Nodes
    ###
    # This class represents a {YAML Scalar}[http://yaml.org/spec/1.1/#id858081].
    #
    # This node type is a terminal node and should not have any children.
    class Scalar < Psych::Nodes::Node
      # Any style scalar, the emitter chooses
      ANY           = 0

      # Plain scalar style
      PLAIN         = 1

      # Single quoted style
      SINGLE_QUOTED = 2

      # Double quoted style
      DOUBLE_QUOTED = 3

      # Literal style
      LITERAL       = 4

      # Folded style
      FOLDED        = 5

      # The scalar value
      attr_accessor :value

      # The anchor value (if there is one)
      attr_accessor :anchor

      # The tag value (if there is one)
      attr_accessor :tag

      # Is this a plain scalar?
      attr_accessor :plain

      # Is this scalar quoted?
      attr_accessor :quoted

      # The style of this scalar
      attr_accessor :style

      ###
      # Create a new Psych::Nodes::Scalar object.
      #
      # +value+ is the string value of the scalar
      # +anchor+ is an associated anchor or nil
      # +tag+ is an associated tag or nil
      # +plain+ is a boolean value
      # +quoted+ is a boolean value
      # +style+ is an integer indicating the string style
      #
      # == See Also
      #
      # See also Psych::Handler#scalar
      def initialize value, anchor = nil, tag = nil, plain = true, quoted = false, style = ANY
        @value  = value
        @anchor = anchor
        @tag    = tag
        @plain  = plain
        @quoted = quoted
        @style  = style
      end

      def scalar?; true; end
    end
  end
end
PK}$[�ɉ.gems/gems/psych-4.0.4/lib/psych/nodes/alias.rbnu�[���# frozen_string_literal: true
module Psych
  module Nodes
    ###
    # This class represents a {YAML Alias}[http://yaml.org/spec/1.1/#alias].
    # It points to an +anchor+.
    #
    # A Psych::Nodes::Alias is a terminal node and may have no children.
    class Alias < Psych::Nodes::Node
      # The anchor this alias links to
      attr_accessor :anchor

      # Create a new Alias that points to an +anchor+
      def initialize anchor
        @anchor = anchor
      end

      def alias?; true; end
    end
  end
end
PK}$[�믍!!1gems/gems/psych-4.0.4/lib/psych/nodes/sequence.rbnu�[���# frozen_string_literal: true
module Psych
  module Nodes
    ###
    # This class represents a
    # {YAML sequence}[http://yaml.org/spec/1.1/#sequence/syntax].
    #
    # A YAML sequence is basically a list, and looks like this:
    #
    #   %YAML 1.1
    #   ---
    #   - I am
    #   - a Sequence
    #
    # A YAML sequence may have an anchor like this:
    #
    #   %YAML 1.1
    #   ---
    #   &A [
    #     "This sequence",
    #     "has an anchor"
    #   ]
    #
    # A YAML sequence may also have a tag like this:
    #
    #   %YAML 1.1
    #   ---
    #   !!seq [
    #     "This sequence",
    #     "has a tag"
    #   ]
    #
    # This class represents a sequence in a YAML document.  A
    # Psych::Nodes::Sequence node may have 0 or more children.  Valid children
    # for this node are:
    #
    # * Psych::Nodes::Sequence
    # * Psych::Nodes::Mapping
    # * Psych::Nodes::Scalar
    # * Psych::Nodes::Alias
    class Sequence < Psych::Nodes::Node
      # Any Styles, emitter chooses
      ANY   = 0

      # Block style sequence
      BLOCK = 1

      # Flow style sequence
      FLOW  = 2

      # The anchor for this sequence (if any)
      attr_accessor :anchor

      # The tag name for this sequence (if any)
      attr_accessor :tag

      # Is this sequence started implicitly?
      attr_accessor :implicit

      # The sequence style used
      attr_accessor :style

      ###
      # Create a new object representing a YAML sequence.
      #
      # +anchor+ is the anchor associated with the sequence or nil.
      # +tag+ is the tag associated with the sequence or nil.
      # +implicit+ a boolean indicating whether or not the sequence was
      # implicitly started.
      # +style+ is an integer indicating the list style.
      #
      # See Psych::Handler#start_sequence
      def initialize anchor = nil, tag = nil, implicit = true, style = BLOCK
        super()
        @anchor   = anchor
        @tag      = tag
        @implicit = implicit
        @style    = style
      end

      def sequence?; true; end
    end
  end
end
PK}$[0 ��-gems/gems/psych-4.0.4/lib/psych/nodes/node.rbnu�[���# frozen_string_literal: true
require 'stringio'
require_relative '../class_loader'
require_relative '../scalar_scanner'

module Psych
  module Nodes
    ###
    # The base class for any Node in a YAML parse tree.  This class should
    # never be instantiated.
    class Node
      include Enumerable

      # The children of this node
      attr_reader :children

      # An associated tag
      attr_reader :tag

      # The line number where this node start
      attr_accessor :start_line

      # The column number where this node start
      attr_accessor :start_column

      # The line number where this node ends
      attr_accessor :end_line

      # The column number where this node ends
      attr_accessor :end_column

      # Create a new Psych::Nodes::Node
      def initialize
        @children = []
      end

      ###
      # Iterate over each node in the tree. Yields each node to +block+ depth
      # first.
      def each &block
        return enum_for :each unless block_given?
        Visitors::DepthFirst.new(block).accept self
      end

      ###
      # Convert this node to Ruby.
      #
      # See also Psych::Visitors::ToRuby
      def to_ruby(symbolize_names: false, freeze: false, strict_integer: false)
        Visitors::ToRuby.create(symbolize_names: symbolize_names, freeze: freeze, strict_integer: strict_integer).accept(self)
      end
      alias :transform :to_ruby

      ###
      # Convert this node to YAML.
      #
      # See also Psych::Visitors::Emitter
      def yaml io = nil, options = {}
        real_io = io || StringIO.new(''.encode('utf-8'))

        Visitors::Emitter.new(real_io, options).accept self
        return real_io.string unless io
        io
      end
      alias :to_yaml :yaml

      def alias?;    false; end
      def document?; false; end
      def mapping?;  false; end
      def scalar?;   false; end
      def sequence?; false; end
      def stream?;   false; end
    end
  end
end
PK}$[��'K��$gems/gems/psych-4.0.4/lib/psych/y.rbnu�[���# frozen_string_literal: true
module Kernel
  ###
  # An alias for Psych.dump_stream meant to be used with IRB.
  def y *objects
    puts Psych.dump_stream(*objects)
  end
  private :y
end

PK}$[	M�,��/gems/gems/psych-4.0.4/lib/psych/class_loader.rbnu�[���# frozen_string_literal: true
require_relative 'omap'
require_relative 'set'

module Psych
  class ClassLoader # :nodoc:
    BIG_DECIMAL = 'BigDecimal'
    COMPLEX     = 'Complex'
    DATE        = 'Date'
    DATE_TIME   = 'DateTime'
    EXCEPTION   = 'Exception'
    OBJECT      = 'Object'
    PSYCH_OMAP  = 'Psych::Omap'
    PSYCH_SET   = 'Psych::Set'
    RANGE       = 'Range'
    RATIONAL    = 'Rational'
    REGEXP      = 'Regexp'
    STRUCT      = 'Struct'
    SYMBOL      = 'Symbol'

    def initialize
      @cache = CACHE.dup
    end

    def load klassname
      return nil if !klassname || klassname.empty?

      find klassname
    end

    def symbolize sym
      symbol
      sym.to_sym
    end

    constants.each do |const|
      konst = const_get const
      class_eval <<~RUBY
        def #{const.to_s.downcase}
          load #{konst.inspect}
        end
      RUBY
    end

    private

    def find klassname
      @cache[klassname] ||= resolve(klassname)
    end

    def resolve klassname
      name    = klassname
      retried = false

      begin
        path2class(name)
      rescue ArgumentError, NameError => ex
        unless retried
          name    = "Struct::#{name}"
          retried = ex
          retry
        end
        raise retried
      end
    end

    CACHE = Hash[constants.map { |const|
      val = const_get const
      begin
        [val, ::Object.const_get(val)]
      rescue
        nil
      end
    }.compact].freeze

    class Restricted < ClassLoader
      def initialize classes, symbols
        @classes = classes
        @symbols = symbols
        super()
      end

      def symbolize sym
        return super if @symbols.empty?

        if @symbols.include? sym
          super
        else
          raise DisallowedClass.new('load', 'Symbol')
        end
      end

      private

      def find klassname
        if @classes.include? klassname
          super
        else
          raise DisallowedClass.new('load', klassname)
        end
      end
    end
  end
end
PK}$[�2P,gems/gems/psych-4.0.4/lib/psych/exception.rbnu�[���# frozen_string_literal: true
module Psych
  class Exception < RuntimeError
  end

  class BadAlias < Exception
  end

  class DisallowedClass < Exception
    def initialize action, klass_name
      super "Tried to #{action} unspecified class: #{klass_name}"
    end
  end
end
PK}$[MA�+��3gems/gems/psych-4.0.4/lib/psych/visitors/visitor.rbnu�[���# frozen_string_literal: true
module Psych
  module Visitors
    class Visitor
      def accept target
        visit target
      end

      private

      # @api private
      def self.dispatch_cache
        Hash.new do |hash, klass|
          hash[klass] = :"visit_#{klass.name.gsub('::', '_')}"
        end.compare_by_identity
      end

      if defined?(Ractor)
        def dispatch
          @dispatch_cache ||= (Ractor.current[:Psych_Visitors_Visitor] ||= Visitor.dispatch_cache)
        end
      else
        DISPATCH = dispatch_cache
        def dispatch
          DISPATCH
        end
      end

      def visit target
        send dispatch[target.class], target
      end
    end
  end
end
PK}$[��{>QQ5gems/gems/psych-4.0.4/lib/psych/visitors/json_tree.rbnu�[���# frozen_string_literal: true
require_relative '../json/ruby_events'

module Psych
  module Visitors
    class JSONTree < YAMLTree
      include Psych::JSON::RubyEvents

      def self.create options = {}
        emitter = Psych::JSON::TreeBuilder.new
        class_loader = ClassLoader.new
        ss           = ScalarScanner.new class_loader
        new(emitter, ss, options)
      end

      def accept target
        if target.respond_to?(:encode_with)
          dump_coder target
        else
          send(@dispatch_cache[target.class], target)
        end
      end
    end
  end
end
PK}$[���Z��3gems/gems/psych-4.0.4/lib/psych/visitors/emitter.rbnu�[���# frozen_string_literal: true
module Psych
  module Visitors
    class Emitter < Psych::Visitors::Visitor
      def initialize io, options = {}
        opts = [:indentation, :canonical, :line_width].find_all { |opt|
          options.key?(opt)
        }

        if opts.empty?
          @handler = Psych::Emitter.new io
        else
          du = Handler::DumperOptions.new
          opts.each { |option| du.send :"#{option}=", options[option] }
          @handler = Psych::Emitter.new io, du
        end
      end

      def visit_Psych_Nodes_Stream o
        @handler.start_stream o.encoding
        o.children.each { |c| accept c }
        @handler.end_stream
      end

      def visit_Psych_Nodes_Document o
        @handler.start_document o.version, o.tag_directives, o.implicit
        o.children.each { |c| accept c }
        @handler.end_document o.implicit_end
      end

      def visit_Psych_Nodes_Scalar o
        @handler.scalar o.value, o.anchor, o.tag, o.plain, o.quoted, o.style
      end

      def visit_Psych_Nodes_Sequence o
        @handler.start_sequence o.anchor, o.tag, o.implicit, o.style
        o.children.each { |c| accept c }
        @handler.end_sequence
      end

      def visit_Psych_Nodes_Mapping o
        @handler.start_mapping o.anchor, o.tag, o.implicit, o.style
        o.children.each { |c| accept c }
        @handler.end_mapping
      end

      def visit_Psych_Nodes_Alias o
        @handler.alias o.anchor
      end
    end
  end
end
PK}$[R��(rr7gems/gems/psych-4.0.4/lib/psych/visitors/depth_first.rbnu�[���# frozen_string_literal: true
module Psych
  module Visitors
    class DepthFirst < Psych::Visitors::Visitor
      def initialize block
        @block = block
      end

      private

      def nary o
        o.children.each { |x| visit x }
        @block.call o
      end
      alias :visit_Psych_Nodes_Stream   :nary
      alias :visit_Psych_Nodes_Document :nary
      alias :visit_Psych_Nodes_Sequence :nary
      alias :visit_Psych_Nodes_Mapping  :nary

      def terminal o
        @block.call o
      end
      alias :visit_Psych_Nodes_Scalar :terminal
      alias :visit_Psych_Nodes_Alias  :terminal
    end
  end
end
PK}$[$�]cAcA5gems/gems/psych-4.0.4/lib/psych/visitors/yaml_tree.rbnu�[���# frozen_string_literal: true
require_relative '../tree_builder'
require_relative '../scalar_scanner'
require_relative '../class_loader'

module Psych
  module Visitors
    ###
    # YAMLTree builds a YAML ast given a Ruby object.  For example:
    #
    #   builder = Psych::Visitors::YAMLTree.new
    #   builder << { :foo => 'bar' }
    #   builder.tree # => #<Psych::Nodes::Stream .. }
    #
    class YAMLTree < Psych::Visitors::Visitor
      class Registrar # :nodoc:
        def initialize
          @obj_to_id   = {}
          @obj_to_node = {}
          @targets     = []
          @counter     = 0
        end

        def register target, node
          return unless target.respond_to? :object_id
          @targets << target
          @obj_to_node[target.object_id] = node
        end

        def key? target
          @obj_to_node.key? target.object_id
        rescue NoMethodError
          false
        end

        def id_for target
          @obj_to_id[target.object_id] ||= (@counter += 1)
        end

        def node_for target
          @obj_to_node[target.object_id]
        end
      end

      attr_reader :started, :finished
      alias :finished? :finished
      alias :started? :started

      def self.create options = {}, emitter = nil
        emitter      ||= TreeBuilder.new
        class_loader = ClassLoader.new
        ss           = ScalarScanner.new class_loader
        new(emitter, ss, options)
      end

      def initialize emitter, ss, options
        super()
        @started    = false
        @finished   = false
        @emitter    = emitter
        @st         = Registrar.new
        @ss         = ss
        @options    = options
        @line_width = options[:line_width]
        if @line_width && @line_width < 0
          if @line_width == -1
            # Treat -1 as unlimited line-width, same as libyaml does.
            @line_width = nil
          else
            fail(ArgumentError, "Invalid line_width #{@line_width}, must be non-negative or -1 for unlimited.")
          end
        end
        @coders     = []

        @dispatch_cache = Hash.new do |h,klass|
          method = "visit_#{(klass.name || '').split('::').join('_')}"

          method = respond_to?(method) ? method : h[klass.superclass]

          raise(TypeError, "Can't dump #{target.class}") unless method

          h[klass] = method
        end.compare_by_identity
      end

      def start encoding = Nodes::Stream::UTF8
        @emitter.start_stream(encoding).tap do
          @started = true
        end
      end

      def finish
        @emitter.end_stream.tap do
          @finished = true
        end
      end

      def tree
        finish unless finished?
        @emitter.root
      end

      def push object
        start unless started?
        version = []
        version = [1,1] if @options[:header]

        case @options[:version]
        when Array
          version = @options[:version]
        when String
          version = @options[:version].split('.').map { |x| x.to_i }
        else
          version = [1,1]
        end if @options.key? :version

        @emitter.start_document version, [], false
        accept object
        @emitter.end_document !@emitter.streaming?
      end
      alias :<< :push

      def accept target
        # return any aliases we find
        if @st.key? target
          oid         = @st.id_for target
          node        = @st.node_for target
          anchor      = oid.to_s
          node.anchor = anchor
          return @emitter.alias anchor
        end

        if target.respond_to?(:encode_with)
          dump_coder target
        else
          send(@dispatch_cache[target.class], target)
        end
      end

      def visit_Psych_Omap o
        seq = @emitter.start_sequence(nil, 'tag:yaml.org,2002:omap', false, Nodes::Sequence::BLOCK)
        register(o, seq)

        o.each { |k,v| visit_Hash k => v }
        @emitter.end_sequence
      end

      def visit_Encoding o
        tag = "!ruby/encoding"
        @emitter.scalar o.name, nil, tag, false, false, Nodes::Scalar::ANY
      end

      def visit_Object o
        tag = Psych.dump_tags[o.class]
        unless tag
          klass = o.class == Object ? nil : o.class.name
          tag   = ['!ruby/object', klass].compact.join(':')
        end

        map = @emitter.start_mapping(nil, tag, false, Nodes::Mapping::BLOCK)
        register(o, map)

        dump_ivars o
        @emitter.end_mapping
      end

      alias :visit_Delegator :visit_Object

      def visit_Struct o
        tag = ['!ruby/struct', o.class.name].compact.join(':')

        register o, @emitter.start_mapping(nil, tag, false, Nodes::Mapping::BLOCK)
        o.members.each do |member|
          @emitter.scalar member.to_s, nil, nil, true, false, Nodes::Scalar::ANY
          accept o[member]
        end

        dump_ivars o

        @emitter.end_mapping
      end

      def visit_Exception o
        dump_exception o, o.message.to_s
      end

      def visit_NameError o
        dump_exception o, o.message.to_s
      end

      def visit_Regexp o
        register o, @emitter.scalar(o.inspect, nil, '!ruby/regexp', false, false, Nodes::Scalar::ANY)
      end

      def visit_DateTime o
        formatted = if o.offset.zero?
                      o.strftime("%Y-%m-%d %H:%M:%S.%9N Z".freeze)
                    else
                      o.strftime("%Y-%m-%d %H:%M:%S.%9N %:z".freeze)
                    end
        tag = '!ruby/object:DateTime'
        register o, @emitter.scalar(formatted, nil, tag, false, false, Nodes::Scalar::ANY)
      end

      def visit_Time o
        formatted = format_time o
        register o, @emitter.scalar(formatted, nil, nil, true, false, Nodes::Scalar::ANY)
      end

      def visit_Rational o
        register o, @emitter.start_mapping(nil, '!ruby/object:Rational', false, Nodes::Mapping::BLOCK)

        [
          'denominator', o.denominator.to_s,
          'numerator', o.numerator.to_s
        ].each do |m|
          @emitter.scalar m, nil, nil, true, false, Nodes::Scalar::ANY
        end

        @emitter.end_mapping
      end

      def visit_Complex o
        register o, @emitter.start_mapping(nil, '!ruby/object:Complex', false, Nodes::Mapping::BLOCK)

        ['real', o.real.to_s, 'image', o.imag.to_s].each do |m|
          @emitter.scalar m, nil, nil, true, false, Nodes::Scalar::ANY
        end

        @emitter.end_mapping
      end

      def visit_Integer o
        @emitter.scalar o.to_s, nil, nil, true, false, Nodes::Scalar::ANY
      end
      alias :visit_TrueClass :visit_Integer
      alias :visit_FalseClass :visit_Integer
      alias :visit_Date :visit_Integer

      def visit_Float o
        if o.nan?
          @emitter.scalar '.nan', nil, nil, true, false, Nodes::Scalar::ANY
        elsif o.infinite?
          @emitter.scalar((o.infinite? > 0 ? '.inf' : '-.inf'),
            nil, nil, true, false, Nodes::Scalar::ANY)
        else
          @emitter.scalar o.to_s, nil, nil, true, false, Nodes::Scalar::ANY
        end
      end

      def visit_BigDecimal o
        @emitter.scalar o._dump, nil, '!ruby/object:BigDecimal', false, false, Nodes::Scalar::ANY
      end

      def visit_String o
        plain = true
        quote = true
        style = Nodes::Scalar::PLAIN
        tag   = nil

        if binary?(o)
          o     = [o].pack('m0')
          tag   = '!binary' # FIXME: change to below when syck is removed
          #tag   = 'tag:yaml.org,2002:binary'
          style = Nodes::Scalar::LITERAL
          plain = false
          quote = false
        elsif o =~ /\n(?!\Z)/  # match \n except blank line at the end of string
          style = Nodes::Scalar::LITERAL
        elsif o == '<<'
          style = Nodes::Scalar::SINGLE_QUOTED
          tag   = 'tag:yaml.org,2002:str'
          plain = false
          quote = false
        elsif o == 'y' || o == 'n'
          style = Nodes::Scalar::DOUBLE_QUOTED
        elsif @line_width && o.length > @line_width
          style = Nodes::Scalar::FOLDED
        elsif o =~ /^[^[:word:]][^"]*$/
          style = Nodes::Scalar::DOUBLE_QUOTED
        elsif not String === @ss.tokenize(o) or /\A0[0-7]*[89]/ =~ o
          style = Nodes::Scalar::SINGLE_QUOTED
        end

        is_primitive = o.class == ::String
        ivars = is_primitive ? [] : o.instance_variables

        if ivars.empty?
          unless is_primitive
            tag = "!ruby/string:#{o.class}"
            plain = false
            quote = false
          end
          @emitter.scalar o, nil, tag, plain, quote, style
        else
          maptag = '!ruby/string'.dup
          maptag << ":#{o.class}" unless o.class == ::String

          register o, @emitter.start_mapping(nil, maptag, false, Nodes::Mapping::BLOCK)
          @emitter.scalar 'str', nil, nil, true, false, Nodes::Scalar::ANY
          @emitter.scalar o, nil, tag, plain, quote, style

          dump_ivars o

          @emitter.end_mapping
        end
      end

      def visit_Module o
        raise TypeError, "can't dump anonymous module: #{o}" unless o.name
        register o, @emitter.scalar(o.name, nil, '!ruby/module', false, false, Nodes::Scalar::SINGLE_QUOTED)
      end

      def visit_Class o
        raise TypeError, "can't dump anonymous class: #{o}" unless o.name
        register o, @emitter.scalar(o.name, nil, '!ruby/class', false, false, Nodes::Scalar::SINGLE_QUOTED)
      end

      def visit_Range o
        register o, @emitter.start_mapping(nil, '!ruby/range', false, Nodes::Mapping::BLOCK)
        ['begin', o.begin, 'end', o.end, 'excl', o.exclude_end?].each do |m|
          accept m
        end
        @emitter.end_mapping
      end

      def visit_Hash o
        if o.class == ::Hash
          register(o, @emitter.start_mapping(nil, nil, true, Psych::Nodes::Mapping::BLOCK))
          o.each do |k,v|
            accept k
            accept v
          end
          @emitter.end_mapping
        else
          visit_hash_subclass o
        end
      end

      def visit_Psych_Set o
        register(o, @emitter.start_mapping(nil, '!set', false, Psych::Nodes::Mapping::BLOCK))

        o.each do |k,v|
          accept k
          accept v
        end

        @emitter.end_mapping
      end

      def visit_Array o
        if o.class == ::Array
          visit_Enumerator o
        else
          visit_array_subclass o
        end
      end

      def visit_Enumerator o
        register o, @emitter.start_sequence(nil, nil, true, Nodes::Sequence::BLOCK)
        o.each { |c| accept c }
        @emitter.end_sequence
      end

      def visit_NilClass o
        @emitter.scalar('', nil, 'tag:yaml.org,2002:null', true, false, Nodes::Scalar::ANY)
      end

      def visit_Symbol o
        if o.empty?
          @emitter.scalar "", nil, '!ruby/symbol', false, false, Nodes::Scalar::ANY
        else
          @emitter.scalar ":#{o}", nil, nil, true, false, Nodes::Scalar::ANY
        end
      end

      def visit_BasicObject o
        tag = Psych.dump_tags[o.class]
        tag ||= "!ruby/marshalable:#{o.class.name}"

        map = @emitter.start_mapping(nil, tag, false, Nodes::Mapping::BLOCK)
        register(o, map)

        o.marshal_dump.each(&method(:accept))

        @emitter.end_mapping
      end

      private

      def binary? string
        string.encoding == Encoding::ASCII_8BIT && !string.ascii_only?
      end

      def visit_array_subclass o
        tag = "!ruby/array:#{o.class}"
        ivars = o.instance_variables
        if ivars.empty?
          node = @emitter.start_sequence(nil, tag, false, Nodes::Sequence::BLOCK)
          register o, node
          o.each { |c| accept c }
          @emitter.end_sequence
        else
          node = @emitter.start_mapping(nil, tag, false, Nodes::Sequence::BLOCK)
          register o, node

          # Dump the internal list
          accept 'internal'
          @emitter.start_sequence(nil, nil, true, Nodes::Sequence::BLOCK)
          o.each { |c| accept c }
          @emitter.end_sequence

          # Dump the ivars
          accept 'ivars'
          @emitter.start_mapping(nil, nil, true, Nodes::Sequence::BLOCK)
          ivars.each do |ivar|
            accept ivar
            accept o.instance_variable_get ivar
          end
          @emitter.end_mapping

          @emitter.end_mapping
        end
      end

      def visit_hash_subclass o
        ivars = o.instance_variables
        if ivars.any?
          tag = "!ruby/hash-with-ivars:#{o.class}"
          node = @emitter.start_mapping(nil, tag, false, Psych::Nodes::Mapping::BLOCK)
          register(o, node)

          # Dump the ivars
          accept 'ivars'
          @emitter.start_mapping nil, nil, true, Nodes::Mapping::BLOCK
          o.instance_variables.each do |ivar|
            accept ivar
            accept o.instance_variable_get ivar
          end
          @emitter.end_mapping

          # Dump the elements
          accept 'elements'
          @emitter.start_mapping nil, nil, true, Nodes::Mapping::BLOCK
          o.each do |k,v|
            accept k
            accept v
          end
          @emitter.end_mapping

          @emitter.end_mapping
        else
          tag = "!ruby/hash:#{o.class}"
          node = @emitter.start_mapping(nil, tag, false, Psych::Nodes::Mapping::BLOCK)
          register(o, node)
          o.each do |k,v|
            accept k
            accept v
          end
          @emitter.end_mapping
        end
      end

      def dump_list o
      end

      def dump_exception o, msg
        tag = ['!ruby/exception', o.class.name].join ':'

        @emitter.start_mapping nil, tag, false, Nodes::Mapping::BLOCK

        if msg
          @emitter.scalar 'message', nil, nil, true, false, Nodes::Scalar::ANY
          accept msg
        end

        @emitter.scalar 'backtrace', nil, nil, true, false, Nodes::Scalar::ANY
        accept o.backtrace

        dump_ivars o

        @emitter.end_mapping
      end

      def format_time time
        if time.utc?
          time.strftime("%Y-%m-%d %H:%M:%S.%9N Z")
        else
          time.strftime("%Y-%m-%d %H:%M:%S.%9N %:z")
        end
      end

      def register target, yaml_obj
        @st.register target, yaml_obj
        yaml_obj
      end

      def dump_coder o
        @coders << o
        tag = Psych.dump_tags[o.class]
        unless tag
          klass = o.class == Object ? nil : o.class.name
          tag   = ['!ruby/object', klass].compact.join(':')
        end

        c = Psych::Coder.new(tag)
        o.encode_with(c)
        emit_coder c, o
      end

      def emit_coder c, o
        case c.type
        when :scalar
          @emitter.scalar c.scalar, nil, c.tag, c.tag.nil?, false, c.style
        when :seq
          @emitter.start_sequence nil, c.tag, c.tag.nil?, c.style
          c.seq.each do |thing|
            accept thing
          end
          @emitter.end_sequence
        when :map
          register o, @emitter.start_mapping(nil, c.tag, c.implicit, c.style)
          c.map.each do |k,v|
            accept k
            accept v
          end
          @emitter.end_mapping
        when :object
          accept c.object
        end
      end

      def dump_ivars target
        target.instance_variables.each do |iv|
          @emitter.scalar("#{iv.to_s.sub(/^@/, '')}", nil, nil, true, false, Nodes::Scalar::ANY)
          accept target.instance_variable_get(iv)
        end
      end
    end

    class RestrictedYAMLTree < YAMLTree
      DEFAULT_PERMITTED_CLASSES = {
        TrueClass => true,
        FalseClass => true,
        NilClass => true,
        Integer => true,
        Float => true,
        String => true,
        Array => true,
        Hash => true,
      }.compare_by_identity.freeze

      def initialize emitter, ss, options
        super
        @permitted_classes = DEFAULT_PERMITTED_CLASSES.dup
        Array(options[:permitted_classes]).each do |klass|
          @permitted_classes[klass] = true
        end
        @permitted_symbols = {}.compare_by_identity
        Array(options[:permitted_symbols]).each do |symbol|
          @permitted_symbols[symbol] = true
        end
        @aliases = options.fetch(:aliases, false)
      end

      def accept target
        if !@aliases && @st.key?(target)
          raise BadAlias, "Tried to dump an aliased object"
        end

        unless @permitted_classes[target.class]
          raise DisallowedClass.new('dump', target.class.name || target.class.inspect)
        end

        super
      end

      def visit_Symbol sym
        unless @permitted_symbols[sym]
          raise DisallowedClass.new('dump', "Symbol(#{sym.inspect})")
        end

        super
      end
    end
  end
end
PK}$[�,��H1H13gems/gems/psych-4.0.4/lib/psych/visitors/to_ruby.rbnu�[���# frozen_string_literal: true
require_relative '../scalar_scanner'
require_relative '../class_loader'
require_relative '../exception'

unless defined?(Regexp::NOENCODING)
  Regexp::NOENCODING = 32
end

module Psych
  module Visitors
    ###
    # This class walks a YAML AST, converting each node to Ruby
    class ToRuby < Psych::Visitors::Visitor
      def self.create(symbolize_names: false, freeze: false, strict_integer: false)
        class_loader = ClassLoader.new
        scanner      = ScalarScanner.new class_loader, strict_integer: strict_integer
        new(scanner, class_loader, symbolize_names: symbolize_names, freeze: freeze)
      end

      attr_reader :class_loader

      def initialize ss, class_loader, symbolize_names: false, freeze: false
        super()
        @st = {}
        @ss = ss
        @load_tags = Psych.load_tags
        @domain_types = Psych.domain_types
        @class_loader = class_loader
        @symbolize_names = symbolize_names
        @freeze = freeze
      end

      def accept target
        result = super

        unless @domain_types.empty? || !target.tag
          key = target.tag.sub(/^[!\/]*/, '').sub(/(,\d+)\//, '\1:')
          key = "tag:#{key}" unless key =~ /^(?:tag:|x-private)/

          if @domain_types.key? key
            value, block = @domain_types[key]
            result = block.call value, result
          end
        end

        result = deduplicate(result).freeze if @freeze
        result
      end

      def deserialize o
        if klass = resolve_class(@load_tags[o.tag])
          instance = klass.allocate

          if instance.respond_to?(:init_with)
            coder = Psych::Coder.new(o.tag)
            coder.scalar = o.value
            instance.init_with coder
          end

          return instance
        end

        return o.value if o.quoted
        return @ss.tokenize(o.value) unless o.tag

        case o.tag
        when '!binary', 'tag:yaml.org,2002:binary'
          o.value.unpack('m').first
        when /^!(?:str|ruby\/string)(?::(.*))?$/, 'tag:yaml.org,2002:str'
          klass = resolve_class($1)
          if klass
            klass.allocate.replace o.value
          else
            o.value
          end
        when '!ruby/object:BigDecimal'
          require 'bigdecimal' unless defined? BigDecimal
          class_loader.big_decimal._load o.value
        when "!ruby/object:DateTime"
          class_loader.date_time
          require 'date' unless defined? DateTime
          @ss.parse_time(o.value).to_datetime
        when '!ruby/encoding'
          ::Encoding.find o.value
        when "!ruby/object:Complex"
          class_loader.complex
          Complex(o.value)
        when "!ruby/object:Rational"
          class_loader.rational
          Rational(o.value)
        when "!ruby/class", "!ruby/module"
          resolve_class o.value
        when "tag:yaml.org,2002:float", "!float"
          Float(@ss.tokenize(o.value))
        when "!ruby/regexp"
          klass = class_loader.regexp
          o.value =~ /^\/(.*)\/([mixn]*)$/m
          source  = $1
          options = 0
          lang    = nil
          ($2 || '').split('').each do |option|
            case option
            when 'x' then options |= Regexp::EXTENDED
            when 'i' then options |= Regexp::IGNORECASE
            when 'm' then options |= Regexp::MULTILINE
            when 'n' then options |= Regexp::NOENCODING
            else lang = option
            end
          end
          klass.new(*[source, options, lang].compact)
        when "!ruby/range"
          klass = class_loader.range
          args = o.value.split(/([.]{2,3})/, 2).map { |s|
            accept Nodes::Scalar.new(s)
          }
          args.push(args.delete_at(1) == '...')
          klass.new(*args)
        when /^!ruby\/sym(bol)?:?(.*)?$/
          class_loader.symbolize o.value
        else
          @ss.tokenize o.value
        end
      end
      private :deserialize

      def visit_Psych_Nodes_Scalar o
        register o, deserialize(o)
      end

      def visit_Psych_Nodes_Sequence o
        if klass = resolve_class(@load_tags[o.tag])
          instance = klass.allocate

          if instance.respond_to?(:init_with)
            coder = Psych::Coder.new(o.tag)
            coder.seq = o.children.map { |c| accept c }
            instance.init_with coder
          end

          return instance
        end

        case o.tag
        when nil
          register_empty(o)
        when '!omap', 'tag:yaml.org,2002:omap'
          map = register(o, Psych::Omap.new)
          o.children.each { |a|
            map[accept(a.children.first)] = accept a.children.last
          }
          map
        when /^!(?:seq|ruby\/array):(.*)$/
          klass = resolve_class($1)
          list  = register(o, klass.allocate)
          o.children.each { |c| list.push accept c }
          list
        else
          register_empty(o)
        end
      end

      def visit_Psych_Nodes_Mapping o
        if @load_tags[o.tag]
          return revive(resolve_class(@load_tags[o.tag]), o)
        end
        return revive_hash(register(o, {}), o) unless o.tag

        case o.tag
        when /^!ruby\/struct:?(.*)?$/
          klass = resolve_class($1) if $1

          if klass
            s = register(o, klass.allocate)

            members = {}
            struct_members = s.members.map { |x| class_loader.symbolize x }
            o.children.each_slice(2) do |k,v|
              member = accept(k)
              value  = accept(v)
              if struct_members.include?(class_loader.symbolize(member))
                s.send("#{member}=", value)
              else
                members[member.to_s.sub(/^@/, '')] = value
              end
            end
            init_with(s, members, o)
          else
            klass = class_loader.struct
            members = o.children.map { |c| accept c }
            h = Hash[*members]
            s = klass.new(*h.map { |k,v|
              class_loader.symbolize k
            }).new(*h.map { |k,v| v })
            register(o, s)
            s
          end

        when /^!ruby\/object:?(.*)?$/
          name = $1 || 'Object'

          if name == 'Complex'
            class_loader.complex
            h = Hash[*o.children.map { |c| accept c }]
            register o, Complex(h['real'], h['image'])
          elsif name == 'Rational'
            class_loader.rational
            h = Hash[*o.children.map { |c| accept c }]
            register o, Rational(h['numerator'], h['denominator'])
          elsif name == 'Hash'
            revive_hash(register(o, {}), o)
          else
            obj = revive((resolve_class(name) || class_loader.object), o)
            obj
          end

        when /^!(?:str|ruby\/string)(?::(.*))?$/, 'tag:yaml.org,2002:str'
          klass   = resolve_class($1)
          members = {}
          string  = nil

          o.children.each_slice(2) do |k,v|
            key   = accept k
            value = accept v

            if key == 'str'
              if klass
                string = klass.allocate.replace value
              else
                string = value
              end
              register(o, string)
            else
              members[key] = value
            end
          end
          init_with(string, members.map { |k,v| [k.to_s.sub(/^@/, ''),v] }, o)
        when /^!ruby\/array:(.*)$/
          klass = resolve_class($1)
          list  = register(o, klass.allocate)

          members = Hash[o.children.map { |c| accept c }.each_slice(2).to_a]
          list.replace members['internal']

          members['ivars'].each do |ivar, v|
            list.instance_variable_set ivar, v
          end
          list

        when '!ruby/range'
          klass = class_loader.range
          h = Hash[*o.children.map { |c| accept c }]
          register o, klass.new(h['begin'], h['end'], h['excl'])

        when /^!ruby\/exception:?(.*)?$/
          h = Hash[*o.children.map { |c| accept c }]

          e = build_exception((resolve_class($1) || class_loader.exception),
                              h.delete('message'))

          e.set_backtrace h.delete('backtrace') if h.key? 'backtrace'
          init_with(e, h, o)

        when '!set', 'tag:yaml.org,2002:set'
          set = class_loader.psych_set.new
          @st[o.anchor] = set if o.anchor
          o.children.each_slice(2) do |k,v|
            set[accept(k)] = accept(v)
          end
          set

        when /^!ruby\/hash-with-ivars(?::(.*))?$/
          hash = $1 ? resolve_class($1).allocate : {}
          register o, hash
          o.children.each_slice(2) do |key, value|
            case key.value
            when 'elements'
              revive_hash hash, value
            when 'ivars'
              value.children.each_slice(2) do |k,v|
                hash.instance_variable_set accept(k), accept(v)
              end
            end
          end
          hash

        when /^!map:(.*)$/, /^!ruby\/hash:(.*)$/
          revive_hash register(o, resolve_class($1).allocate), o

        when '!omap', 'tag:yaml.org,2002:omap'
          map = register(o, class_loader.psych_omap.new)
          o.children.each_slice(2) do |l,r|
            map[accept(l)] = accept r
          end
          map

        when /^!ruby\/marshalable:(.*)$/
          name = $1
          klass = resolve_class(name)
          obj = register(o, klass.allocate)

          if obj.respond_to?(:init_with)
            init_with(obj, revive_hash({}, o), o)
          elsif obj.respond_to?(:marshal_load)
            marshal_data = o.children.map(&method(:accept))
            obj.marshal_load(marshal_data)
            obj
          else
            raise ArgumentError, "Cannot deserialize #{name}"
          end

        else
          revive_hash(register(o, {}), o)
        end
      end

      def visit_Psych_Nodes_Document o
        accept o.root
      end

      def visit_Psych_Nodes_Stream o
        o.children.map { |c| accept c }
      end

      def visit_Psych_Nodes_Alias o
        @st.fetch(o.anchor) { raise BadAlias, "Unknown alias: #{o.anchor}" }
      end

      private

      def register node, object
        @st[node.anchor] = object if node.anchor
        object
      end

      def register_empty object
        list = register(object, [])
        object.children.each { |c| list.push accept c }
        list
      end

      def revive_hash hash, o, tagged= false
        o.children.each_slice(2) { |k,v|
          key = accept(k)
          val = accept(v)

          if key == '<<' && k.tag != "tag:yaml.org,2002:str"
            case v
            when Nodes::Alias, Nodes::Mapping
              begin
                hash.merge! val
              rescue TypeError
                hash[key] = val
              end
            when Nodes::Sequence
              begin
                h = {}
                val.reverse_each do |value|
                  h.merge! value
                end
                hash.merge! h
              rescue TypeError
                hash[key] = val
              end
            else
              hash[key] = val
            end
          else
            if !tagged && @symbolize_names && key.is_a?(String)
              key = key.to_sym
            elsif !@freeze
              key = deduplicate(key)
            end

            hash[key] = val
          end

        }
        hash
      end

      if RUBY_VERSION < '2.7'
        def deduplicate key
          if key.is_a?(String)
            # It is important to untaint the string, otherwise it won't
            # be deduplicated into an fstring, but simply frozen.
            -(key.untaint)
          else
            key
          end
        end
      else
        def deduplicate key
          if key.is_a?(String)
            -key
          else
            key
          end
        end
      end

      def merge_key hash, key, val
      end

      def revive klass, node
        s = register(node, klass.allocate)
        init_with(s, revive_hash({}, node, true), node)
      end

      def init_with o, h, node
        c = Psych::Coder.new(node.tag)
        c.map = h

        if o.respond_to?(:init_with)
          o.init_with c
        else
          h.each { |k,v| o.instance_variable_set(:"@#{k}", v) }
        end
        o
      end

      # Convert +klassname+ to a Class
      def resolve_class klassname
        class_loader.load klassname
      end
    end

    class NoAliasRuby < ToRuby
      def visit_Psych_Nodes_Alias o
        raise BadAlias, "Unknown alias: #{o.anchor}"
      end
    end
  end
end
PK}$[r���)gems/gems/psych-4.0.4/lib/psych/stream.rbnu�[���# frozen_string_literal: true
module Psych
  ###
  # Psych::Stream is a streaming YAML emitter.  It will not buffer your YAML,
  # but send it straight to an IO.
  #
  # Here is an example use:
  #
  #   stream = Psych::Stream.new($stdout)
  #   stream.start
  #   stream.push({:foo => 'bar'})
  #   stream.finish
  #
  # YAML will be immediately emitted to $stdout with no buffering.
  #
  # Psych::Stream#start will take a block and ensure that Psych::Stream#finish
  # is called, so you can do this form:
  #
  #   stream = Psych::Stream.new($stdout)
  #   stream.start do |em|
  #     em.push(:foo => 'bar')
  #   end
  #
  class Stream < Psych::Visitors::YAMLTree
    class Emitter < Psych::Emitter # :nodoc:
      def end_document implicit_end = !streaming?
        super
      end

      def streaming?
        true
      end
    end

    include Psych::Streaming
    extend Psych::Streaming::ClassMethods
  end
end
PK}$[��,��*gems/gems/psych-4.0.4/lib/psych/handler.rbnu�[���# frozen_string_literal: true
module Psych
  ###
  # Psych::Handler is an abstract base class that defines the events used
  # when dealing with Psych::Parser.  Clients who want to use Psych::Parser
  # should implement a class that inherits from Psych::Handler and define
  # events that they can handle.
  #
  # Psych::Handler defines all events that Psych::Parser can possibly send to
  # event handlers.
  #
  # See Psych::Parser for more details
  class Handler
    ###
    # Configuration options for dumping YAML.
    class DumperOptions
      attr_accessor :line_width, :indentation, :canonical

      def initialize
        @line_width  = 0
        @indentation = 2
        @canonical   = false
      end
    end

    # Default dumping options
    OPTIONS = DumperOptions.new

    # Events that a Handler should respond to.
    EVENTS = [ :alias,
               :empty,
               :end_document,
               :end_mapping,
               :end_sequence,
               :end_stream,
               :scalar,
               :start_document,
               :start_mapping,
               :start_sequence,
               :start_stream ]

    ###
    # Called with +encoding+ when the YAML stream starts.  This method is
    # called once per stream.  A stream may contain multiple documents.
    #
    # See the constants in Psych::Parser for the possible values of +encoding+.
    def start_stream encoding
    end

    ###
    # Called when the document starts with the declared +version+,
    # +tag_directives+, if the document is +implicit+.
    #
    # +version+ will be an array of integers indicating the YAML version being
    # dealt with, +tag_directives+ is a list of tuples indicating the prefix
    # and suffix of each tag, and +implicit+ is a boolean indicating whether
    # the document is started implicitly.
    #
    # === Example
    #
    # Given the following YAML:
    #
    #   %YAML 1.1
    #   %TAG ! tag:tenderlovemaking.com,2009:
    #   --- !squee
    #
    # The parameters for start_document must be this:
    #
    #   version         # => [1, 1]
    #   tag_directives  # => [["!", "tag:tenderlovemaking.com,2009:"]]
    #   implicit        # => false
    def start_document version, tag_directives, implicit
    end

    ###
    # Called with the document ends.  +implicit+ is a boolean value indicating
    # whether or not the document has an implicit ending.
    #
    # === Example
    #
    # Given the following YAML:
    #
    #   ---
    #     hello world
    #
    # +implicit+ will be true.  Given this YAML:
    #
    #   ---
    #     hello world
    #   ...
    #
    # +implicit+ will be false.
    def end_document implicit
    end

    ###
    # Called when an alias is found to +anchor+.  +anchor+ will be the name
    # of the anchor found.
    #
    # === Example
    #
    # Here we have an example of an array that references itself in YAML:
    #
    #   --- &ponies
    #   - first element
    #   - *ponies
    #
    # &ponies is the anchor, *ponies is the alias.  In this case, alias is
    # called with "ponies".
    def alias anchor
    end

    ###
    # Called when a scalar +value+ is found.  The scalar may have an
    # +anchor+, a +tag+, be implicitly +plain+ or implicitly +quoted+
    #
    # +value+ is the string value of the scalar
    # +anchor+ is an associated anchor or nil
    # +tag+ is an associated tag or nil
    # +plain+ is a boolean value
    # +quoted+ is a boolean value
    # +style+ is an integer indicating the string style
    #
    # See the constants in Psych::Nodes::Scalar for the possible values of
    # +style+
    #
    # === Example
    #
    # Here is a YAML document that exercises most of the possible ways this
    # method can be called:
    #
    #   ---
    #   - !str "foo"
    #   - &anchor fun
    #   - many
    #     lines
    #   - |
    #     many
    #     newlines
    #
    # The above YAML document contains a list with four strings.  Here are
    # the parameters sent to this method in the same order:
    #
    #   # value               anchor    tag     plain   quoted  style
    #   ["foo",               nil,      "!str", false,  false,  3    ]
    #   ["fun",               "anchor", nil,    true,   false,  1    ]
    #   ["many lines",        nil,      nil,    true,   false,  1    ]
    #   ["many\nnewlines\n",  nil,      nil,    false,  true,   4    ]
    #
    def scalar value, anchor, tag, plain, quoted, style
    end

    ###
    # Called when a sequence is started.
    #
    # +anchor+ is the anchor associated with the sequence or nil.
    # +tag+ is the tag associated with the sequence or nil.
    # +implicit+ a boolean indicating whether or not the sequence was implicitly
    # started.
    # +style+ is an integer indicating the list style.
    #
    # See the constants in Psych::Nodes::Sequence for the possible values of
    # +style+.
    #
    # === Example
    #
    # Here is a YAML document that exercises most of the possible ways this
    # method can be called:
    #
    #   ---
    #   - !!seq [
    #     a
    #   ]
    #   - &pewpew
    #     - b
    #
    # The above YAML document consists of three lists, an outer list that
    # contains two inner lists.  Here is a matrix of the parameters sent
    # to represent these lists:
    #
    #   # anchor    tag                       implicit  style
    #   [nil,       nil,                      true,     1     ]
    #   [nil,       "tag:yaml.org,2002:seq",  false,    2     ]
    #   ["pewpew",  nil,                      true,     1     ]

    def start_sequence anchor, tag, implicit, style
    end

    ###
    # Called when a sequence ends.
    def end_sequence
    end

    ###
    # Called when a map starts.
    #
    # +anchor+ is the anchor associated with the map or +nil+.
    # +tag+ is the tag associated with the map or +nil+.
    # +implicit+ is a boolean indicating whether or not the map was implicitly
    # started.
    # +style+ is an integer indicating the mapping style.
    #
    # See the constants in Psych::Nodes::Mapping for the possible values of
    # +style+.
    #
    # === Example
    #
    # Here is a YAML document that exercises most of the possible ways this
    # method can be called:
    #
    #   ---
    #   k: !!map { hello: world }
    #   v: &pewpew
    #     hello: world
    #
    # The above YAML document consists of three maps, an outer map that contains
    # two inner maps.  Below is a matrix of the parameters sent in order to
    # represent these three maps:
    #
    #   # anchor    tag                       implicit  style
    #   [nil,       nil,                      true,     1     ]
    #   [nil,       "tag:yaml.org,2002:map",  false,    2     ]
    #   ["pewpew",  nil,                      true,     1     ]

    def start_mapping anchor, tag, implicit, style
    end

    ###
    # Called when a map ends
    def end_mapping
    end

    ###
    # Called when an empty event happens. (Which, as far as I can tell, is
    # never).
    def empty
    end

    ###
    # Called when the YAML stream ends
    def end_stream
    end

    ###
    # Called before each event with line/column information.
    def event_location(start_line, start_column, end_line, end_column)
    end

    ###
    # Is this handler a streaming handler?
    def streaming?
      false
    end
  end
end
PK}$[*JJ&gems/gems/psych-4.0.4/lib/psych/set.rbnu�[���# frozen_string_literal: true
module Psych
  class Set < ::Hash
  end
end
PK}$[:�;gems/gems/psych-4.0.4/lib/psych/handlers/document_stream.rbnu�[���# frozen_string_literal: true
require_relative '../tree_builder'

module Psych
  module Handlers
    class DocumentStream < Psych::TreeBuilder # :nodoc:
      def initialize &block
        super
        @block = block
      end

      def start_document version, tag_directives, implicit
        n = Nodes::Document.new version, tag_directives, implicit
        push n
      end

      def end_document implicit_end = !streaming?
        @last.implicit_end = implicit_end
        @block.call pop
      end
    end
  end
end
PK}$[.�^{{4gems/gems/psych-4.0.4/lib/psych/handlers/recorder.rbnu�[���# frozen_string_literal: true
require_relative '../handler'

module Psych
  module Handlers
    ###
    # This handler will capture an event and record the event.  Recorder events
    # are available vial Psych::Handlers::Recorder#events.
    #
    # For example:
    #
    #   recorder = Psych::Handlers::Recorder.new
    #   parser = Psych::Parser.new recorder
    #   parser.parse '--- foo'
    #
    #   recorder.events # => [list of events]
    #
    #   # Replay the events
    #
    #   emitter = Psych::Emitter.new $stdout
    #   recorder.events.each do |m, args|
    #     emitter.send m, *args
    #   end

    class Recorder < Psych::Handler
      attr_reader :events

      def initialize
        @events = []
        super
      end

      EVENTS.each do |event|
        define_method event do |*args|
          @events << [event, args]
        end
      end
    end
  end
end
PK}$[���KK'gems/gems/psych-4.0.4/lib/psych/omap.rbnu�[���# frozen_string_literal: true
module Psych
  class Omap < ::Hash
  end
end
PK}$[/��	�	(gems/gems/psych-4.0.4/lib/psych/nodes.rbnu�[���# frozen_string_literal: true
require_relative 'nodes/node'
require_relative 'nodes/stream'
require_relative 'nodes/document'
require_relative 'nodes/sequence'
require_relative 'nodes/scalar'
require_relative 'nodes/mapping'
require_relative 'nodes/alias'

module Psych
  ###
  # = Overview
  #
  # When using Psych.load to deserialize a YAML document, the document is
  # translated to an intermediary AST.  That intermediary AST is then
  # translated in to a Ruby object graph.
  #
  # In the opposite direction, when using Psych.dump, the Ruby object graph is
  # translated to an intermediary AST which is then converted to a YAML
  # document.
  #
  # Psych::Nodes contains all of the classes that make up the nodes of a YAML
  # AST.  You can manually build an AST and use one of the visitors (see
  # Psych::Visitors) to convert that AST to either a YAML document or to a
  # Ruby object graph.
  #
  # Here is an example of building an AST that represents a list with one
  # scalar:
  #
  #   # Create our nodes
  #   stream = Psych::Nodes::Stream.new
  #   doc    = Psych::Nodes::Document.new
  #   seq    = Psych::Nodes::Sequence.new
  #   scalar = Psych::Nodes::Scalar.new('foo')
  #
  #   # Build up our tree
  #   stream.children << doc
  #   doc.children    << seq
  #   seq.children    << scalar
  #
  # The stream is the root of the tree.  We can then convert the tree to YAML:
  #
  #   stream.to_yaml => "---\n- foo\n"
  #
  # Or convert it to Ruby:
  #
  #   stream.to_ruby => [["foo"]]
  #
  # == YAML AST Requirements
  #
  # A valid YAML AST *must* have one Psych::Nodes::Stream at the root.  A
  # Psych::Nodes::Stream node must have 1 or more Psych::Nodes::Document nodes
  # as children.
  #
  # Psych::Nodes::Document nodes must have one and *only* one child.  That child
  # may be one of:
  #
  # * Psych::Nodes::Sequence
  # * Psych::Nodes::Mapping
  # * Psych::Nodes::Scalar
  #
  # Psych::Nodes::Sequence and Psych::Nodes::Mapping nodes may have many
  # children, but Psych::Nodes::Mapping nodes should have an even number of
  # children.
  #
  # All of these are valid children for Psych::Nodes::Sequence and
  # Psych::Nodes::Mapping nodes:
  #
  # * Psych::Nodes::Sequence
  # * Psych::Nodes::Mapping
  # * Psych::Nodes::Scalar
  # * Psych::Nodes::Alias
  #
  # Psych::Nodes::Scalar and Psych::Nodes::Alias are both terminal nodes and
  # should not have any children.
  module Nodes
  end
end
PK}$[u�>22(gems/gems/psych-4.0.4/lib/psych/coder.rbnu�[���# frozen_string_literal: true
module Psych
  ###
  # If an object defines +encode_with+, then an instance of Psych::Coder will
  # be passed to the method when the object is being serialized.  The Coder
  # automatically assumes a Psych::Nodes::Mapping is being emitted.  Other
  # objects like Sequence and Scalar may be emitted if +seq=+ or +scalar=+ are
  # called, respectively.
  class Coder
    attr_accessor :tag, :style, :implicit, :object
    attr_reader   :type, :seq

    def initialize tag
      @map      = {}
      @seq      = []
      @implicit = false
      @type     = :map
      @tag      = tag
      @style    = Psych::Nodes::Mapping::BLOCK
      @scalar   = nil
      @object   = nil
    end

    def scalar *args
      if args.length > 0
        warn "#{caller[0]}: Coder#scalar(a,b,c) is deprecated" if $VERBOSE
        @tag, @scalar, _ = args
        @type = :scalar
      end
      @scalar
    end

    # Emit a map.  The coder will be yielded to the block.
    def map tag = @tag, style = @style
      @tag   = tag
      @style = style
      yield self if block_given?
      @map
    end

    # Emit a scalar with +value+ and +tag+
    def represent_scalar tag, value
      self.tag    = tag
      self.scalar = value
    end

    # Emit a sequence with +list+ and +tag+
    def represent_seq tag, list
      @tag = tag
      self.seq = list
    end

    # Emit a sequence with +map+ and +tag+
    def represent_map tag, map
      @tag = tag
      self.map = map
    end

    # Emit an arbitrary object +obj+ and +tag+
    def represent_object tag, obj
      @tag    = tag
      @type   = :object
      @object = obj
    end

    # Emit a scalar with +value+
    def scalar= value
      @type   = :scalar
      @scalar = value
    end

    # Emit a map with +value+
    def map= map
      @type = :map
      @map  = map
    end

    def []= k, v
      @type = :map
      @map[k] = v
    end
    alias :add :[]=

    def [] k
      @type = :map
      @map[k]
    end

    # Emit a sequence of +list+
    def seq= list
      @type = :seq
      @seq  = list
    end
  end
end
PK}$[�!����/gems/gems/psych-4.0.4/lib/psych/tree_builder.rbnu�[���# frozen_string_literal: true
require_relative 'handler'

module Psych
  ###
  # This class works in conjunction with Psych::Parser to build an in-memory
  # parse tree that represents a YAML document.
  #
  # == Example
  #
  #   parser = Psych::Parser.new Psych::TreeBuilder.new
  #   parser.parse('--- foo')
  #   tree = parser.handler.root
  #
  # See Psych::Handler for documentation on the event methods used in this
  # class.
  class TreeBuilder < Psych::Handler
    # Returns the root node for the built tree
    attr_reader :root

    # Create a new TreeBuilder instance
    def initialize
      @stack = []
      @last  = nil
      @root  = nil

      @start_line   = nil
      @start_column = nil
      @end_line     = nil
      @end_column   = nil
    end

    def event_location(start_line, start_column, end_line, end_column)
      @start_line   = start_line
      @start_column = start_column
      @end_line     = end_line
      @end_column   = end_column
    end

    %w{
      Sequence
      Mapping
    }.each do |node|
      class_eval %{
        def start_#{node.downcase}(anchor, tag, implicit, style)
          n = Nodes::#{node}.new(anchor, tag, implicit, style)
          set_start_location(n)
          @last.children << n
          push n
        end

        def end_#{node.downcase}
          n = pop
          set_end_location(n)
          n
        end
      }
    end

    ###
    # Handles start_document events with +version+, +tag_directives+,
    # and +implicit+ styling.
    #
    # See Psych::Handler#start_document
    def start_document version, tag_directives, implicit
      n = Nodes::Document.new version, tag_directives, implicit
      set_start_location(n)
      @last.children << n
      push n
    end

    ###
    # Handles end_document events with +version+, +tag_directives+,
    # and +implicit+ styling.
    #
    # See Psych::Handler#start_document
    def end_document implicit_end = !streaming?
      @last.implicit_end = implicit_end
      n = pop
      set_end_location(n)
      n
    end

    def start_stream encoding
      @root = Nodes::Stream.new(encoding)
      set_start_location(@root)
      push @root
    end

    def end_stream
      n = pop
      set_end_location(n)
      n
    end

    def scalar value, anchor, tag, plain, quoted, style
      s = Nodes::Scalar.new(value,anchor,tag,plain,quoted,style)
      set_location(s)
      @last.children << s
      s
    end

    def alias anchor
      a = Nodes::Alias.new(anchor)
      set_location(a)
      @last.children << a
      a
    end

    private
    def push value
      @stack.push value
      @last = value
    end

    def pop
      x = @stack.pop
      @last = @stack.last
      x
    end

    def set_location(node)
      set_start_location(node)
      set_end_location(node)
    end

    def set_start_location(node)
      node.start_line   = @start_line
      node.start_column = @start_column
    end

    def set_end_location(node)
      node.end_line   = @end_line
      node.end_column = @end_column
    end
  end
end
PK}$[g��jj+gems/gems/psych-4.0.4/lib/psych/core_ext.rbnu�[���# frozen_string_literal: true
class Object
  def self.yaml_tag url
    Psych.add_tag(url, self)
  end

  ###
  # call-seq: to_yaml(options = {})
  #
  # Convert an object to YAML.  See Psych.dump for more information on the
  # available +options+.
  def to_yaml options = {}
    Psych.dump self, options
  end
end

if defined?(::IRB)
  require_relative 'y'
end
PK}$[�y2K��,gems/gems/psych-4.0.4/lib/psych/streaming.rbnu�[���# frozen_string_literal: true
module Psych
  module Streaming
    module ClassMethods
      ###
      # Create a new streaming emitter.  Emitter will print to +io+.  See
      # Psych::Stream for an example.
      def new io
        emitter      = const_get(:Emitter).new(io)
        class_loader = ClassLoader.new
        ss           = ScalarScanner.new class_loader
        super(emitter, ss, {})
      end
    end

    ###
    # Start streaming using +encoding+
    def start encoding = Nodes::Stream::UTF8
      super.tap { yield self if block_given?  }
    ensure
      finish if block_given?
    end

    private
    def register target, obj
    end
  end
end
PK}$[H��LL/gems/gems/psych-4.0.4/lib/psych/syntax_error.rbnu�[���# frozen_string_literal: true
require_relative 'exception'

module Psych
  class SyntaxError < Psych::Exception
    attr_reader :file, :line, :column, :offset, :problem, :context

    def initialize file, line, col, offset, problem, context
      err      = [problem, context].compact.join ' '
      filename = file || '<unknown>'
      message  = "(%s): %s at line %d column %d" % [filename, err, line, col]

      @file    = file
      @line    = line
      @column  = col
      @offset  = offset
      @problem = problem
      @context = context
      super(message)
    end
  end
end
PK}$[��3gems/gems/psych-4.0.4/lib/psych/json/yaml_events.rbnu�[���# frozen_string_literal: true
module Psych
  module JSON
    module YAMLEvents # :nodoc:
      def start_document version, tag_directives, implicit
        super(version, tag_directives, !streaming?)
      end

      def end_document implicit_end = !streaming?
        super(implicit_end)
      end

      def start_mapping anchor, tag, implicit, style
        super(anchor, nil, true, Nodes::Mapping::FLOW)
      end

      def start_sequence anchor, tag, implicit, style
        super(anchor, nil, true, Nodes::Sequence::FLOW)
      end

      def scalar value, anchor, tag, plain, quoted, style
        if "tag:yaml.org,2002:null" == tag
          super('null', nil, nil, true, false, Nodes::Scalar::PLAIN)
        else
          super
        end
      end
    end
  end
end
PK}$[��:���.gems/gems/psych-4.0.4/lib/psych/json/stream.rbnu�[���# frozen_string_literal: true
require_relative 'ruby_events'
require_relative 'yaml_events'

module Psych
  module JSON
    class Stream < Psych::Visitors::JSONTree
      include Psych::JSON::RubyEvents
      include Psych::Streaming
      extend Psych::Streaming::ClassMethods

      class Emitter < Psych::Stream::Emitter # :nodoc:
        include Psych::JSON::YAMLEvents
      end
    end
  end
end
PK}$[�����3gems/gems/psych-4.0.4/lib/psych/json/ruby_events.rbnu�[���# frozen_string_literal: true
module Psych
  module JSON
    module RubyEvents # :nodoc:
      def visit_Time o
        formatted = format_time o
        @emitter.scalar formatted, nil, nil, false, true, Nodes::Scalar::DOUBLE_QUOTED
      end

      def visit_DateTime o
        visit_Time o.to_time
      end

      def visit_String o
        @emitter.scalar o.to_s, nil, nil, false, true, Nodes::Scalar::DOUBLE_QUOTED
      end
      alias :visit_Symbol :visit_String
    end
  end
end
PK}$[�Хcc4gems/gems/psych-4.0.4/lib/psych/json/tree_builder.rbnu�[���# frozen_string_literal: true
require_relative 'yaml_events'

module Psych
  module JSON
    ###
    # Psych::JSON::TreeBuilder is an event based AST builder.  Events are sent
    # to an instance of Psych::JSON::TreeBuilder and a JSON AST is constructed.
    class TreeBuilder < Psych::TreeBuilder
      include Psych::JSON::YAMLEvents
    end
  end
end
PK}$[��R:��+gems/gems/psych-4.0.4/lib/psych/visitors.rbnu�[���# frozen_string_literal: true
require_relative 'visitors/visitor'
require_relative 'visitors/to_ruby'
require_relative 'visitors/emitter'
require_relative 'visitors/yaml_tree'
require_relative 'visitors/json_tree'
require_relative 'visitors/depth_first'
PK}$["5x��1gems/gems/psych-4.0.4/lib/psych/scalar_scanner.rbnu�[���# frozen_string_literal: true

module Psych
  ###
  # Scan scalars for built in types
  class ScalarScanner
    # Taken from http://yaml.org/type/timestamp.html
    TIME = /^-?\d{4}-\d{1,2}-\d{1,2}(?:[Tt]|\s+)\d{1,2}:\d\d:\d\d(?:\.\d*)?(?:\s*(?:Z|[-+]\d{1,2}:?(?:\d\d)?))?$/

    # Taken from http://yaml.org/type/float.html
    # Base 60, [-+]inf and NaN are handled separately
    FLOAT = /^(?:[-+]?([0-9][0-9_,]*)?\.[0-9]*([eE][-+][0-9]+)?(?# base 10))$/x

    # Taken from http://yaml.org/type/int.html
    INTEGER_STRICT = /^(?:[-+]?0b[0-1_]+                  (?# base 2)
                         |[-+]?0[0-7_]+                   (?# base 8)
                         |[-+]?(0|[1-9][0-9_]*)           (?# base 10)
                         |[-+]?0x[0-9a-fA-F_]+            (?# base 16))$/x

    # Same as above, but allows commas.
    # Not to YML spec, but kept for backwards compatibility
    INTEGER_LEGACY = /^(?:[-+]?0b[0-1_,]+                        (?# base 2)
                         |[-+]?0[0-7_,]+                         (?# base 8)
                         |[-+]?(?:0|[1-9](?:[0-9]|,[0-9]|_[0-9])*) (?# base 10)
                         |[-+]?0x[0-9a-fA-F_,]+                  (?# base 16))$/x

    attr_reader :class_loader

    # Create a new scanner
    def initialize class_loader, strict_integer: false
      @symbol_cache = {}
      @class_loader = class_loader
      @strict_integer = strict_integer
    end

    # Tokenize +string+ returning the Ruby object
    def tokenize string
      return nil if string.empty?
      return @symbol_cache[string] if @symbol_cache.key?(string)
      integer_regex = @strict_integer ? INTEGER_STRICT : INTEGER_LEGACY
      # Check for a String type, being careful not to get caught by hash keys, hex values, and
      # special floats (e.g., -.inf).
      if string.match?(%r{^[^\d.:-]?[[:alpha:]_\s!@#$%\^&*(){}<>|/\\~;=]+}) || string.match?(/\n/)
        return string if string.length > 5

        if string.match?(/^[^ytonf~]/i)
          string
        elsif string == '~' || string.match?(/^null$/i)
          nil
        elsif string.match?(/^(yes|true|on)$/i)
          true
        elsif string.match?(/^(no|false|off)$/i)
          false
        else
          string
        end
      elsif string.match?(TIME)
        begin
          parse_time string
        rescue ArgumentError
          string
        end
      elsif string.match?(/^\d{4}-(?:1[012]|0\d|\d)-(?:[12]\d|3[01]|0\d|\d)$/)
        require 'date'
        begin
          class_loader.date.strptime(string, '%Y-%m-%d')
        rescue ArgumentError
          string
        end
      elsif string.match?(/^\+?\.inf$/i)
        Float::INFINITY
      elsif string.match?(/^-\.inf$/i)
        -Float::INFINITY
      elsif string.match?(/^\.nan$/i)
        Float::NAN
      elsif string.match?(/^:./)
        if string =~ /^:(["'])(.*)\1/
          @symbol_cache[string] = class_loader.symbolize($2.sub(/^:/, ''))
        else
          @symbol_cache[string] = class_loader.symbolize(string.sub(/^:/, ''))
        end
      elsif string.match?(/^[-+]?[0-9][0-9_]*(:[0-5]?[0-9]){1,2}$/)
        i = 0
        string.split(':').each_with_index do |n,e|
          i += (n.to_i * 60 ** (e - 2).abs)
        end
        i
      elsif string.match?(/^[-+]?[0-9][0-9_]*(:[0-5]?[0-9]){1,2}\.[0-9_]*$/)
        i = 0
        string.split(':').each_with_index do |n,e|
          i += (n.to_f * 60 ** (e - 2).abs)
        end
        i
      elsif string.match?(FLOAT)
        if string.match?(/\A[-+]?\.\Z/)
          string
        else
          Float(string.delete(',_').gsub(/\.([Ee]|$)/, '\1'))
        end
      elsif string.match?(integer_regex)
        parse_int string
      else
        string
      end
    end

    ###
    # Parse and return an int from +string+
    def parse_int string
      Integer(string.delete(',_'))
    end

    ###
    # Parse and return a Time from +string+
    def parse_time string
      klass = class_loader.load 'Time'

      date, time = *(string.split(/[ tT]/, 2))
      (yy, m, dd) = date.match(/^(-?\d{4})-(\d{1,2})-(\d{1,2})/).captures.map { |x| x.to_i }
      md = time.match(/(\d+:\d+:\d+)(?:\.(\d*))?\s*(Z|[-+]\d+(:\d\d)?)?/)

      (hh, mm, ss) = md[1].split(':').map { |x| x.to_i }
      us = (md[2] ? Rational("0.#{md[2]}") : 0) * 1000000

      time = klass.utc(yy, m, dd, hh, mm, ss, us)

      return time if 'Z' == md[3]
      return klass.at(time.to_i, us) unless md[3]

      tz = md[3].match(/^([+\-]?\d{1,2})\:?(\d{1,2})?$/)[1..-1].compact.map { |digit| Integer(digit, 10) }
      offset = tz.first * 3600

      if offset < 0
        offset -= ((tz[1] || 0) * 60)
      else
        offset += ((tz[1] || 0) * 60)
      end

      klass.new(yy, m, dd, hh, mm, ss+us/(1_000_000r), offset)
    end
  end
end
PK}$[��[��)gems/gems/psych-4.0.4/lib/psych/parser.rbnu�[���# frozen_string_literal: true
module Psych
  ###
  # YAML event parser class.  This class parses a YAML document and calls
  # events on the handler that is passed to the constructor.  The events can
  # be used for things such as constructing a YAML AST or deserializing YAML
  # documents.  It can even be fed back to Psych::Emitter to emit the same
  # document that was parsed.
  #
  # See Psych::Handler for documentation on the events that Psych::Parser emits.
  #
  # Here is an example that prints out ever scalar found in a YAML document:
  #
  #   # Handler for detecting scalar values
  #   class ScalarHandler < Psych::Handler
  #     def scalar value, anchor, tag, plain, quoted, style
  #       puts value
  #     end
  #   end
  #
  #   parser = Psych::Parser.new(ScalarHandler.new)
  #   parser.parse(yaml_document)
  #
  # Here is an example that feeds the parser back in to Psych::Emitter.  The
  # YAML document is read from STDIN and written back out to STDERR:
  #
  #   parser = Psych::Parser.new(Psych::Emitter.new($stderr))
  #   parser.parse($stdin)
  #
  # Psych uses Psych::Parser in combination with Psych::TreeBuilder to
  # construct an AST of the parsed YAML document.

  class Parser
    class Mark < Struct.new(:index, :line, :column)
    end

    # The handler on which events will be called
    attr_accessor :handler

    # Set the encoding for this parser to +encoding+
    attr_writer :external_encoding

    ###
    # Creates a new Psych::Parser instance with +handler+.  YAML events will
    # be called on +handler+.  See Psych::Parser for more details.

    def initialize handler = Handler.new
      @handler = handler
      @external_encoding = ANY
    end
  end
end
PK}$[���obob"gems/gems/psych-4.0.4/lib/psych.rbnu�[���# frozen_string_literal: true
require_relative 'psych/versions'
case RUBY_ENGINE
when 'jruby'
  require_relative 'psych_jars'
  if JRuby::Util.respond_to?(:load_ext)
    JRuby::Util.load_ext('org.jruby.ext.psych.PsychLibrary')
  else
    require 'java'; require 'jruby'
    org.jruby.ext.psych.PsychLibrary.new.load(JRuby.runtime, false)
  end
else
  require 'psych.so'
end
require_relative 'psych/nodes'
require_relative 'psych/streaming'
require_relative 'psych/visitors'
require_relative 'psych/handler'
require_relative 'psych/tree_builder'
require_relative 'psych/parser'
require_relative 'psych/omap'
require_relative 'psych/set'
require_relative 'psych/coder'
require_relative 'psych/core_ext'
require_relative 'psych/stream'
require_relative 'psych/json/tree_builder'
require_relative 'psych/json/stream'
require_relative 'psych/handlers/document_stream'
require_relative 'psych/class_loader'

###
# = Overview
#
# Psych is a YAML parser and emitter.
# Psych leverages libyaml [Home page: https://pyyaml.org/wiki/LibYAML]
# or [git repo: https://github.com/yaml/libyaml] for its YAML parsing
# and emitting capabilities. In addition to wrapping libyaml, Psych also
# knows how to serialize and de-serialize most Ruby objects to and from
# the YAML format.
#
# = I NEED TO PARSE OR EMIT YAML RIGHT NOW!
#
#   # Parse some YAML
#   Psych.load("--- foo") # => "foo"
#
#   # Emit some YAML
#   Psych.dump("foo")     # => "--- foo\n...\n"
#   { :a => 'b'}.to_yaml  # => "---\n:a: b\n"
#
# Got more time on your hands?  Keep on reading!
#
# == YAML Parsing
#
# Psych provides a range of interfaces for parsing a YAML document ranging from
# low level to high level, depending on your parsing needs.  At the lowest
# level, is an event based parser.  Mid level is access to the raw YAML AST,
# and at the highest level is the ability to unmarshal YAML to Ruby objects.
#
# == YAML Emitting
#
# Psych provides a range of interfaces ranging from low to high level for
# producing YAML documents.  Very similar to the YAML parsing interfaces, Psych
# provides at the lowest level, an event based system, mid-level is building
# a YAML AST, and the highest level is converting a Ruby object straight to
# a YAML document.
#
# == High-level API
#
# === Parsing
#
# The high level YAML parser provided by Psych simply takes YAML as input and
# returns a Ruby data structure.  For information on using the high level parser
# see Psych.load
#
# ==== Reading from a string
#
#   Psych.safe_load("--- a")             # => 'a'
#   Psych.safe_load("---\n - a\n - b")   # => ['a', 'b']
#   # From a trusted string:
#   Psych.load("--- !ruby/range\nbegin: 0\nend: 42\nexcl: false\n") # => 0..42
#
# ==== Reading from a file
#
#   Psych.safe_load_file("data.yml", permitted_classes: [Date])
#   Psych.load_file("trusted_database.yml")
#
# ==== Exception handling
#
#   begin
#     # The second argument changes only the exception contents
#     Psych.parse("--- `", "file.txt")
#   rescue Psych::SyntaxError => ex
#     ex.file    # => 'file.txt'
#     ex.message # => "(file.txt): found character that cannot start any token"
#   end
#
# === Emitting
#
# The high level emitter has the easiest interface.  Psych simply takes a Ruby
# data structure and converts it to a YAML document.  See Psych.dump for more
# information on dumping a Ruby data structure.
#
# ==== Writing to a string
#
#   # Dump an array, get back a YAML string
#   Psych.dump(['a', 'b'])  # => "---\n- a\n- b\n"
#
#   # Dump an array to an IO object
#   Psych.dump(['a', 'b'], StringIO.new)  # => #<StringIO:0x000001009d0890>
#
#   # Dump an array with indentation set
#   Psych.dump(['a', ['b']], :indentation => 3) # => "---\n- a\n-  - b\n"
#
#   # Dump an array to an IO with indentation set
#   Psych.dump(['a', ['b']], StringIO.new, :indentation => 3)
#
# ==== Writing to a file
#
# Currently there is no direct API for dumping Ruby structure to file:
#
#   File.open('database.yml', 'w') do |file|
#     file.write(Psych.dump(['a', 'b']))
#   end
#
# == Mid-level API
#
# === Parsing
#
# Psych provides access to an AST produced from parsing a YAML document.  This
# tree is built using the Psych::Parser and Psych::TreeBuilder.  The AST can
# be examined and manipulated freely.  Please see Psych::parse_stream,
# Psych::Nodes, and Psych::Nodes::Node for more information on dealing with
# YAML syntax trees.
#
# ==== Reading from a string
#
#   # Returns Psych::Nodes::Stream
#   Psych.parse_stream("---\n - a\n - b")
#
#   # Returns Psych::Nodes::Document
#   Psych.parse("---\n - a\n - b")
#
# ==== Reading from a file
#
#   # Returns Psych::Nodes::Stream
#   Psych.parse_stream(File.read('database.yml'))
#
#   # Returns Psych::Nodes::Document
#   Psych.parse_file('database.yml')
#
# ==== Exception handling
#
#   begin
#     # The second argument changes only the exception contents
#     Psych.parse("--- `", "file.txt")
#   rescue Psych::SyntaxError => ex
#     ex.file    # => 'file.txt'
#     ex.message # => "(file.txt): found character that cannot start any token"
#   end
#
# === Emitting
#
# At the mid level is building an AST.  This AST is exactly the same as the AST
# used when parsing a YAML document.  Users can build an AST by hand and the
# AST knows how to emit itself as a YAML document.  See Psych::Nodes,
# Psych::Nodes::Node, and Psych::TreeBuilder for more information on building
# a YAML AST.
#
# ==== Writing to a string
#
#   # We need Psych::Nodes::Stream (not Psych::Nodes::Document)
#   stream = Psych.parse_stream("---\n - a\n - b")
#
#   stream.to_yaml # => "---\n- a\n- b\n"
#
# ==== Writing to a file
#
#   # We need Psych::Nodes::Stream (not Psych::Nodes::Document)
#   stream = Psych.parse_stream(File.read('database.yml'))
#
#   File.open('database.yml', 'w') do |file|
#     file.write(stream.to_yaml)
#   end
#
# == Low-level API
#
# === Parsing
#
# The lowest level parser should be used when the YAML input is already known,
# and the developer does not want to pay the price of building an AST or
# automatic detection and conversion to Ruby objects.  See Psych::Parser for
# more information on using the event based parser.
#
# ==== Reading to Psych::Nodes::Stream structure
#
#   parser = Psych::Parser.new(TreeBuilder.new) # => #<Psych::Parser>
#   parser = Psych.parser                       # it's an alias for the above
#
#   parser.parse("---\n - a\n - b")             # => #<Psych::Parser>
#   parser.handler                              # => #<Psych::TreeBuilder>
#   parser.handler.root                         # => #<Psych::Nodes::Stream>
#
# ==== Receiving an events stream
#
#   recorder = Psych::Handlers::Recorder.new
#   parser = Psych::Parser.new(recorder)
#
#   parser.parse("---\n - a\n - b")
#   recorder.events # => [list of [event, args] lists]
#                   # event is one of: Psych::Handler::EVENTS
#                   # args are the arguments passed to the event
#
# === Emitting
#
# The lowest level emitter is an event based system.  Events are sent to a
# Psych::Emitter object.  That object knows how to convert the events to a YAML
# document.  This interface should be used when document format is known in
# advance or speed is a concern.  See Psych::Emitter for more information.
#
# ==== Writing to a Ruby structure
#
#   Psych.parser.parse("--- a")       # => #<Psych::Parser>
#
#   parser.handler.first              # => #<Psych::Nodes::Stream>
#   parser.handler.first.to_ruby      # => ["a"]
#
#   parser.handler.root.first         # => #<Psych::Nodes::Document>
#   parser.handler.root.first.to_ruby # => "a"
#
#   # You can instantiate an Emitter manually
#   Psych::Visitors::ToRuby.new.accept(parser.handler.root.first)
#   # => "a"

module Psych
  # The version of libyaml Psych is using
  LIBYAML_VERSION = Psych.libyaml_version.join('.').freeze

  ###
  # Load +yaml+ in to a Ruby data structure.  If multiple documents are
  # provided, the object contained in the first document will be returned.
  # +filename+ will be used in the exception message if any exception
  # is raised while parsing.  If +yaml+ is empty, it returns
  # the specified +fallback+ return value, which defaults to +false+.
  #
  # Raises a Psych::SyntaxError when a YAML syntax error is detected.
  #
  # Example:
  #
  #   Psych.unsafe_load("--- a")             # => 'a'
  #   Psych.unsafe_load("---\n - a\n - b")   # => ['a', 'b']
  #
  #   begin
  #     Psych.unsafe_load("--- `", filename: "file.txt")
  #   rescue Psych::SyntaxError => ex
  #     ex.file    # => 'file.txt'
  #     ex.message # => "(file.txt): found character that cannot start any token"
  #   end
  #
  # When the optional +symbolize_names+ keyword argument is set to a
  # true value, returns symbols for keys in Hash objects (default: strings).
  #
  #   Psych.unsafe_load("---\n foo: bar")                         # => {"foo"=>"bar"}
  #   Psych.unsafe_load("---\n foo: bar", symbolize_names: true)  # => {:foo=>"bar"}
  #
  # Raises a TypeError when `yaml` parameter is NilClass
  #
  # NOTE: This method *should not* be used to parse untrusted documents, such as
  # YAML documents that are supplied via user input.  Instead, please use the
  # load method or the safe_load method.
  #
  def self.unsafe_load yaml, filename: nil, fallback: false, symbolize_names: false, freeze: false, strict_integer: false
    result = parse(yaml, filename: filename)
    return fallback unless result
    result.to_ruby(symbolize_names: symbolize_names, freeze: freeze, strict_integer: strict_integer)
  end

  ###
  # Safely load the yaml string in +yaml+.  By default, only the following
  # classes are allowed to be deserialized:
  #
  # * TrueClass
  # * FalseClass
  # * NilClass
  # * Integer
  # * Float
  # * String
  # * Array
  # * Hash
  #
  # Recursive data structures are not allowed by default.  Arbitrary classes
  # can be allowed by adding those classes to the +permitted_classes+ keyword argument.  They are
  # additive.  For example, to allow Date deserialization:
  #
  #   Psych.safe_load(yaml, permitted_classes: [Date])
  #
  # Now the Date class can be loaded in addition to the classes listed above.
  #
  # Aliases can be explicitly allowed by changing the +aliases+ keyword argument.
  # For example:
  #
  #   x = []
  #   x << x
  #   yaml = Psych.dump x
  #   Psych.safe_load yaml               # => raises an exception
  #   Psych.safe_load yaml, aliases: true # => loads the aliases
  #
  # A Psych::DisallowedClass exception will be raised if the yaml contains a
  # class that isn't in the +permitted_classes+ list.
  #
  # A Psych::BadAlias exception will be raised if the yaml contains aliases
  # but the +aliases+ keyword argument is set to false.
  #
  # +filename+ will be used in the exception message if any exception is raised
  # while parsing.
  #
  # When the optional +symbolize_names+ keyword argument is set to a
  # true value, returns symbols for keys in Hash objects (default: strings).
  #
  #   Psych.safe_load("---\n foo: bar")                         # => {"foo"=>"bar"}
  #   Psych.safe_load("---\n foo: bar", symbolize_names: true)  # => {:foo=>"bar"}
  #
  def self.safe_load yaml, permitted_classes: [], permitted_symbols: [], aliases: false, filename: nil, fallback: nil, symbolize_names: false, freeze: false, strict_integer: false
    result = parse(yaml, filename: filename)
    return fallback unless result

    class_loader = ClassLoader::Restricted.new(permitted_classes.map(&:to_s),
                                               permitted_symbols.map(&:to_s))
    scanner      = ScalarScanner.new class_loader, strict_integer: strict_integer
    visitor = if aliases
                Visitors::ToRuby.new scanner, class_loader, symbolize_names: symbolize_names, freeze: freeze
              else
                Visitors::NoAliasRuby.new scanner, class_loader, symbolize_names: symbolize_names, freeze: freeze
              end
    result = visitor.accept result
    result
  end

  ###
  # Load +yaml+ in to a Ruby data structure.  If multiple documents are
  # provided, the object contained in the first document will be returned.
  # +filename+ will be used in the exception message if any exception
  # is raised while parsing.  If +yaml+ is empty, it returns
  # the specified +fallback+ return value, which defaults to +false+.
  #
  # Raises a Psych::SyntaxError when a YAML syntax error is detected.
  #
  # Example:
  #
  #   Psych.load("--- a")             # => 'a'
  #   Psych.load("---\n - a\n - b")   # => ['a', 'b']
  #
  #   begin
  #     Psych.load("--- `", filename: "file.txt")
  #   rescue Psych::SyntaxError => ex
  #     ex.file    # => 'file.txt'
  #     ex.message # => "(file.txt): found character that cannot start any token"
  #   end
  #
  # When the optional +symbolize_names+ keyword argument is set to a
  # true value, returns symbols for keys in Hash objects (default: strings).
  #
  #   Psych.load("---\n foo: bar")                         # => {"foo"=>"bar"}
  #   Psych.load("---\n foo: bar", symbolize_names: true)  # => {:foo=>"bar"}
  #
  # Raises a TypeError when `yaml` parameter is NilClass.  This method is
  # similar to `safe_load` except that `Symbol` objects are allowed by default.
  #
  def self.load yaml, permitted_classes: [Symbol], permitted_symbols: [], aliases: false, filename: nil, fallback: nil, symbolize_names: false, freeze: false, strict_integer: false
    safe_load yaml, permitted_classes: permitted_classes,
                    permitted_symbols: permitted_symbols,
                    aliases: aliases,
                    filename: filename,
                    fallback: fallback,
                    symbolize_names: symbolize_names,
                    freeze: freeze,
                    strict_integer: strict_integer
  end

  ###
  # Parse a YAML string in +yaml+.  Returns the Psych::Nodes::Document.
  # +filename+ is used in the exception message if a Psych::SyntaxError is
  # raised.
  #
  # Raises a Psych::SyntaxError when a YAML syntax error is detected.
  #
  # Example:
  #
  #   Psych.parse("---\n - a\n - b") # => #<Psych::Nodes::Document:0x00>
  #
  #   begin
  #     Psych.parse("--- `", filename: "file.txt")
  #   rescue Psych::SyntaxError => ex
  #     ex.file    # => 'file.txt'
  #     ex.message # => "(file.txt): found character that cannot start any token"
  #   end
  #
  # See Psych::Nodes for more information about YAML AST.
  def self.parse yaml, filename: nil
    parse_stream(yaml, filename: filename) do |node|
      return node
    end

    false
  end

  ###
  # Parse a file at +filename+. Returns the Psych::Nodes::Document.
  #
  # Raises a Psych::SyntaxError when a YAML syntax error is detected.
  def self.parse_file filename, fallback: false
    result = File.open filename, 'r:bom|utf-8' do |f|
      parse f, filename: filename
    end
    result || fallback
  end

  ###
  # Returns a default parser
  def self.parser
    Psych::Parser.new(TreeBuilder.new)
  end

  ###
  # Parse a YAML string in +yaml+.  Returns the Psych::Nodes::Stream.
  # This method can handle multiple YAML documents contained in +yaml+.
  # +filename+ is used in the exception message if a Psych::SyntaxError is
  # raised.
  #
  # If a block is given, a Psych::Nodes::Document node will be yielded to the
  # block as it's being parsed.
  #
  # Raises a Psych::SyntaxError when a YAML syntax error is detected.
  #
  # Example:
  #
  #   Psych.parse_stream("---\n - a\n - b") # => #<Psych::Nodes::Stream:0x00>
  #
  #   Psych.parse_stream("--- a\n--- b") do |node|
  #     node # => #<Psych::Nodes::Document:0x00>
  #   end
  #
  #   begin
  #     Psych.parse_stream("--- `", filename: "file.txt")
  #   rescue Psych::SyntaxError => ex
  #     ex.file    # => 'file.txt'
  #     ex.message # => "(file.txt): found character that cannot start any token"
  #   end
  #
  # Raises a TypeError when NilClass is passed.
  #
  # See Psych::Nodes for more information about YAML AST.
  def self.parse_stream yaml, filename: nil, &block
    if block_given?
      parser = Psych::Parser.new(Handlers::DocumentStream.new(&block))
      parser.parse yaml, filename
    else
      parser = self.parser
      parser.parse yaml, filename
      parser.handler.root
    end
  end

  ###
  # call-seq:
  #   Psych.dump(o)               -> string of yaml
  #   Psych.dump(o, options)      -> string of yaml
  #   Psych.dump(o, io)           -> io object passed in
  #   Psych.dump(o, io, options)  -> io object passed in
  #
  # Dump Ruby object +o+ to a YAML string.  Optional +options+ may be passed in
  # to control the output format.  If an IO object is passed in, the YAML will
  # be dumped to that IO object.
  #
  # Currently supported options are:
  #
  # [<tt>:indentation</tt>]   Number of space characters used to indent.
  #                           Acceptable value should be in <tt>0..9</tt> range,
  #                           otherwise option is ignored.
  #
  #                           Default: <tt>2</tt>.
  # [<tt>:line_width</tt>]    Max character to wrap line at.
  #
  #                           Default: <tt>0</tt> (meaning "wrap at 81").
  # [<tt>:canonical</tt>]     Write "canonical" YAML form (very verbose, yet
  #                           strictly formal).
  #
  #                           Default: <tt>false</tt>.
  # [<tt>:header</tt>]        Write <tt>%YAML [version]</tt> at the beginning of document.
  #
  #                           Default: <tt>false</tt>.
  #
  # Example:
  #
  #   # Dump an array, get back a YAML string
  #   Psych.dump(['a', 'b'])  # => "---\n- a\n- b\n"
  #
  #   # Dump an array to an IO object
  #   Psych.dump(['a', 'b'], StringIO.new)  # => #<StringIO:0x000001009d0890>
  #
  #   # Dump an array with indentation set
  #   Psych.dump(['a', ['b']], indentation: 3) # => "---\n- a\n-  - b\n"
  #
  #   # Dump an array to an IO with indentation set
  #   Psych.dump(['a', ['b']], StringIO.new, indentation: 3)
  def self.dump o, io = nil, options = {}
    if Hash === io
      options = io
      io      = nil
    end

    visitor = Psych::Visitors::YAMLTree.create options
    visitor << o
    visitor.tree.yaml io, options
  end

  ###
  # call-seq:
  #   Psych.safe_dump(o)               -> string of yaml
  #   Psych.safe_dump(o, options)      -> string of yaml
  #   Psych.safe_dump(o, io)           -> io object passed in
  #   Psych.safe_dump(o, io, options)  -> io object passed in
  #
  # Safely dump Ruby object +o+ to a YAML string. Optional +options+ may be passed in
  # to control the output format.  If an IO object is passed in, the YAML will
  # be dumped to that IO object. By default, only the following
  # classes are allowed to be serialized:
  #
  # * TrueClass
  # * FalseClass
  # * NilClass
  # * Integer
  # * Float
  # * String
  # * Array
  # * Hash
  #
  # Arbitrary classes can be allowed by adding those classes to the +permitted_classes+
  # keyword argument.  They are additive.  For example, to allow Date serialization:
  #
  #   Psych.safe_dump(yaml, permitted_classes: [Date])
  #
  # Now the Date class can be dumped in addition to the classes listed above.
  #
  # A Psych::DisallowedClass exception will be raised if the object contains a
  # class that isn't in the +permitted_classes+ list.
  #
  # Currently supported options are:
  #
  # [<tt>:indentation</tt>]   Number of space characters used to indent.
  #                           Acceptable value should be in <tt>0..9</tt> range,
  #                           otherwise option is ignored.
  #
  #                           Default: <tt>2</tt>.
  # [<tt>:line_width</tt>]    Max character to wrap line at.
  #
  #                           Default: <tt>0</tt> (meaning "wrap at 81").
  # [<tt>:canonical</tt>]     Write "canonical" YAML form (very verbose, yet
  #                           strictly formal).
  #
  #                           Default: <tt>false</tt>.
  # [<tt>:header</tt>]        Write <tt>%YAML [version]</tt> at the beginning of document.
  #
  #                           Default: <tt>false</tt>.
  #
  # Example:
  #
  #   # Dump an array, get back a YAML string
  #   Psych.safe_dump(['a', 'b'])  # => "---\n- a\n- b\n"
  #
  #   # Dump an array to an IO object
  #   Psych.safe_dump(['a', 'b'], StringIO.new)  # => #<StringIO:0x000001009d0890>
  #
  #   # Dump an array with indentation set
  #   Psych.safe_dump(['a', ['b']], indentation: 3) # => "---\n- a\n-  - b\n"
  #
  #   # Dump an array to an IO with indentation set
  #   Psych.safe_dump(['a', ['b']], StringIO.new, indentation: 3)
  def self.safe_dump o, io = nil, options = {}
    if Hash === io
      options = io
      io      = nil
    end

    visitor = Psych::Visitors::RestrictedYAMLTree.create options
    visitor << o
    visitor.tree.yaml io, options
  end

  ###
  # Dump a list of objects as separate documents to a document stream.
  #
  # Example:
  #
  #   Psych.dump_stream("foo\n  ", {}) # => "--- ! \"foo\\n  \"\n--- {}\n"
  def self.dump_stream *objects
    visitor = Psych::Visitors::YAMLTree.create({})
    objects.each do |o|
      visitor << o
    end
    visitor.tree.yaml
  end

  ###
  # Dump Ruby +object+ to a JSON string.
  def self.to_json object
    visitor = Psych::Visitors::JSONTree.create
    visitor << object
    visitor.tree.yaml
  end

  ###
  # Load multiple documents given in +yaml+.  Returns the parsed documents
  # as a list.  If a block is given, each document will be converted to Ruby
  # and passed to the block during parsing
  #
  # Example:
  #
  #   Psych.load_stream("--- foo\n...\n--- bar\n...") # => ['foo', 'bar']
  #
  #   list = []
  #   Psych.load_stream("--- foo\n...\n--- bar\n...") do |ruby|
  #     list << ruby
  #   end
  #   list # => ['foo', 'bar']
  #
  def self.load_stream yaml, filename: nil, fallback: [], **kwargs
    result = if block_given?
               parse_stream(yaml, filename: filename) do |node|
                 yield node.to_ruby(**kwargs)
               end
             else
               parse_stream(yaml, filename: filename).children.map { |node| node.to_ruby(**kwargs) }
             end

    return fallback if result.is_a?(Array) && result.empty?
    result
  end

  ###
  # Load the document contained in +filename+.  Returns the yaml contained in
  # +filename+ as a Ruby object, or if the file is empty, it returns
  # the specified +fallback+ return value, which defaults to +false+.
  #
  # NOTE: This method *should not* be used to parse untrusted documents, such as
  # YAML documents that are supplied via user input.  Instead, please use the
  # safe_load_file method.
  def self.unsafe_load_file filename, **kwargs
    File.open(filename, 'r:bom|utf-8') { |f|
      self.unsafe_load f, filename: filename, **kwargs
    }
  end

  ###
  # Safely loads the document contained in +filename+.  Returns the yaml contained in
  # +filename+ as a Ruby object, or if the file is empty, it returns
  # the specified +fallback+ return value, which defaults to +false+.
  # See safe_load for options.
  def self.safe_load_file filename, **kwargs
    File.open(filename, 'r:bom|utf-8') { |f|
      self.safe_load f, filename: filename, **kwargs
    }
  end

  ###
  # Loads the document contained in +filename+.  Returns the yaml contained in
  # +filename+ as a Ruby object, or if the file is empty, it returns
  # the specified +fallback+ return value, which defaults to +false+.
  # See load for options.
  def self.load_file filename, **kwargs
    File.open(filename, 'r:bom|utf-8') { |f|
      self.load f, filename: filename, **kwargs
    }
  end

  # :stopdoc:
  def self.add_domain_type domain, type_tag, &block
    key = ['tag', domain, type_tag].join ':'
    domain_types[key] = [key, block]
    domain_types["tag:#{type_tag}"] = [key, block]
  end

  def self.add_builtin_type type_tag, &block
    domain = 'yaml.org,2002'
    key = ['tag', domain, type_tag].join ':'
    domain_types[key] = [key, block]
  end

  def self.remove_type type_tag
    domain_types.delete type_tag
  end

  def self.add_tag tag, klass
    load_tags[tag] = klass.name
    dump_tags[klass] = tag
  end

  # Workaround for emulating `warn '...', uplevel: 1` in Ruby 2.4 or lower.
  def self.warn_with_uplevel(message, uplevel: 1)
    at = parse_caller(caller[uplevel]).join(':')
    warn "#{at}: #{message}"
  end

  def self.parse_caller(at)
    if /^(.+?):(\d+)(?::in `.*')?/ =~ at
      file = $1
      line = $2.to_i
      [file, line]
    end
  end
  private_class_method :warn_with_uplevel, :parse_caller

  class << self
    if defined?(Ractor)
      require 'forwardable'
      extend Forwardable

      class Config
        attr_accessor :load_tags, :dump_tags, :domain_types
        def initialize
          @load_tags = {}
          @dump_tags = {}
          @domain_types = {}
        end
      end

      def config
        Ractor.current[:PsychConfig] ||= Config.new
      end

      def_delegators :config, :load_tags, :dump_tags, :domain_types, :load_tags=, :dump_tags=, :domain_types=
    else
      attr_accessor :load_tags
      attr_accessor :dump_tags
      attr_accessor :domain_types
    end
  end
  self.load_tags = {}
  self.dump_tags = {}
  self.domain_types = {}
  # :startdoc:
end
PK}$[��"��gems/gems/erb-2.2.3/libexec/erbnuȯ��#!/opt/alt/ruby31/bin/ruby
# Tiny eRuby --- ERB2
# Copyright (c) 1999-2000,2002 Masatoshi SEKI
# You can redistribute it and/or modify it under the same terms as Ruby.

require 'erb'

class ERB
  module Main
    def ARGV.switch
      return nil if self.empty?
      arg = self.shift
      return nil if arg == '--'
      case arg
      when /\A-(.)(.*)/
        if $1 == '-'
          arg, @maybe_arg = arg.split(/=/, 2)
          return arg
        end
        raise 'unknown switch "-"' if $2[0] == ?- and $1 != 'T'
        if $2.size > 0
          self.unshift "-#{$2}"
          @maybe_arg = $2
        else
          @maybe_arg = nil
        end
        "-#{$1}"
      when /\A(\w+)=/
        arg
      else
        self.unshift arg
        nil
      end
    end

    def ARGV.req_arg
      (@maybe_arg || self.shift || raise('missing argument')).tap {
        @maybe_arg = nil
      }
    end

    def trim_mode_opt(trim_mode, disable_percent)
      return trim_mode if disable_percent
      case trim_mode
      when 0
        return '%'
      when 1
        return '%>'
      when 2
        return '%<>'
      when '-'
        return '%-'
      end
    end
    module_function :trim_mode_opt

    def run(factory=ERB)
      trim_mode = 0
      disable_percent = false
      variables = {}
      begin
        while switch = ARGV.switch
          case switch
          when '-x'                        # ruby source
            output = true
          when '-n'                        # line number
            number = true
          when '-v'                        # verbose
            $VERBOSE = true
          when '--version'                 # version
            STDERR.puts factory.version
            exit
          when '-d', '--debug'             # debug
            $DEBUG = true
          when '-r'                        # require
            require ARGV.req_arg
          when '-S'                        # security level
            warn 'warning: -S option of erb command is deprecated. Please do not use this.'
            arg = ARGV.req_arg
            raise "invalid safe_level #{arg.dump}" unless arg =~ /\A[0-1]\z/
            safe_level = arg.to_i
          when '-T'                        # trim mode
            arg = ARGV.req_arg
            if arg == '-'
              trim_mode = arg
              next
            end
            raise "invalid trim mode #{arg.dump}" unless arg =~ /\A[0-2]\z/
            trim_mode = arg.to_i
          when '-E', '--encoding'
            arg = ARGV.req_arg
            set_encoding(*arg.split(/:/, 2))
          when '-U'
            set_encoding(Encoding::UTF_8, Encoding::UTF_8)
          when '-P'
            disable_percent = true
          when '--help'
            raise "print this help"
          when /\A-/
            raise "unknown switch #{switch.dump}"
          else
            var, val = *switch.split('=', 2)
            (variables ||= {})[var] = val
          end
        end
      rescue                               # usage
        STDERR.puts $!.to_s
        STDERR.puts File.basename($0) +
          " [switches] [var=value...] [inputfile]"
        STDERR.puts <<EOU
  -x               print ruby script
  -n               print ruby script with line number
  -v               enable verbose mode
  -d               set $DEBUG to true
  -r library       load a library
  -E ex[:in]       set default external/internal encodings
  -U               set default encoding to UTF-8
  -T trim_mode     specify trim_mode (0..2, -)
  -P               disable ruby code evaluation for lines beginning with %
  var=value        set variable
EOU
        exit 1
      end

      $<.set_encoding(Encoding::UTF_8, nil)
      src = $<.read
      filename = $FILENAME
      exit 2 unless src
      trim = trim_mode_opt(trim_mode, disable_percent)
      if safe_level.nil?
        erb = factory.new(src, trim_mode: trim)
      else
        # [deprecated] This will be removed at Ruby 2.7.
        erb = factory.new(src, safe_level, trim_mode: trim)
      end
      erb.filename = filename
      if output
        if number
          erb.src.each_line.with_index do |line, l|
            puts "%3d %s"%[l+1, line]
          end
        else
          puts erb.src
        end
      else
        bind = TOPLEVEL_BINDING
        if variables
          enc = erb.encoding
          for var, val in variables do
            val = val.encode(enc) if val
            bind.local_variable_set(var, val)
          end
        end
        erb.run(bind)
      end
    end
    module_function :run

    def set_encoding(extern, intern = nil)
      verbose, $VERBOSE = $VERBOSE, nil
      Encoding.default_external = extern unless extern.nil? || extern == ""
      Encoding.default_internal = intern unless intern.nil? || intern == ""
      [$stdin, $stdout, $stderr].each do |io|
        io.set_encoding(extern, intern)
      end
    ensure
      $VERBOSE = verbose
    end
    module_function :set_encoding
    class << self; private :set_encoding; end
  end
end

ERB::Main.run
PK}$[ǻ��ii!gems/gems/rackup-2.1.0/bin/rackupnuȯ��#!/usr/bin/env ruby
# frozen_string_literal: true

require_relative "../lib/rackup"
Rackup::Server.start
PK}$[z����!gems/gems/rackup-2.1.0/license.mdnu�[���# MIT License

Copyright, 2007-2009, by Leah Neukirchen.  
Copyright, 2008, by Marc-André Cournoyer.  
Copyright, 2009, by Aaron Pfeifer.  
Copyright, 2009-2010, by Megan Batty.  
Copyright, 2009-2010, by Michael Fellinger.  
Copyright, 2009, by Genki Takiuchi.  
Copyright, 2009, by Joshua Peek.  
Copyright, 2009, by Yehuda Katz + Carl Lerche.  
Copyright, 2009, by Carl Lerche.  
Copyright, 2010, by Julik Tarkhanov.  
Copyright, 2010-2016, by James Tucker.  
Copyright, 2010, by Timur Batyrshin.  
Copyright, 2010, by Loren Segal.  
Copyright, 2010, by Andrew Bortz.  
Copyright, 2010, by John Barnette.  
Copyright, 2010, by John Sumsion.  
Copyright, 2011-2018, by Aaron Patterson.  
Copyright, 2011, by Konstantin Haase.  
Copyright, 2011, by Blake Mizerany.  
Copyright, 2011, by Tsutomu Kuroda.  
Copyright, 2012, by Jean Boussier.  
Copyright, 2012, by Trevor Wennblom.  
Copyright, 2012, by Anurag Priyam.  
Copyright, 2012, by Hrvoje Šimić.  
Copyright, 2013, by Uchio KONDO.  
Copyright, 2013, by Tim Moore.  
Copyright, 2013, by Postmodern.  
Copyright, 2013, by Bas Vodde.  
Copyright, 2013, by Joe Fiorini.  
Copyright, 2014, by Wyatt Pan.  
Copyright, 2014, by Lenny Marks.  
Copyright, 2014, by Igor Bochkariov.  
Copyright, 2014, by Max Cantor.  
Copyright, 2014, by David Celis.  
Copyright, 2014, by Rafael Mendonça França.  
Copyright, 2014, by Jeremy Kemper.  
Copyright, 2014, by Richard Schneeman.  
Copyright, 2015, by Peter Wilmott.  
Copyright, 2015, by Sean McGivern.  
Copyright, 2015, by Tadashi Saito.  
Copyright, 2015, by deepj.  
Copyright, 2015, by Zachary Scott.  
Copyright, 2016, by Sophie Deziel.  
Copyright, 2016, by Kazuya Hotta.  
Copyright, 2017, by Ryunosuke Sato.  
Copyright, 2017-2023, by Samuel Williams.  
Copyright, 2018, by Dillon Welch.  
Copyright, 2018, by Yoshiyuki Hirano.  
Copyright, 2018, by Nick LaMuro.  
Copyright, 2019, by Rafael França.  
Copyright, 2019, by Krzysztof Rybka.  
Copyright, 2019, by Misaki Shioi.  
Copyright, 2020-2022, by Jeremy Evans.  
Copyright, 2021, by Katsuhiko YOSHIDA.  
Copyright, 2021, by KS.  
Copyright, 2021, by Stephen Paul Weber.  
Copyright, 2022, by Akira Matsuda.  
Copyright, 2022, by Andrew Hoglund.  

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}$[<�d�� gems/gems/rackup-2.1.0/readme.mdnu�[���# Rackup

`rackup` provides a command line interface for running a Rack-compatible application.

[![Development Status](https://github.com/rack/rackup/workflows/Test/badge.svg)](https://github.com/rack/rackup/actions?workflow=Test)

## Installation

``` bash
$ gem install rackup
```

## Usage

In a directory with your `config.ru` simply run the command:

``` bash
$ rackup
```

Your application should now be available locally, typically `http://localhost:9292`.

## Contributing

We welcome contributions to this project.

1.  Fork it.
2.  Create your feature branch (`git checkout -b my-new-feature`).
3.  Commit your changes (`git commit -am 'Add some feature'`).
4.  Push to the branch (`git push origin my-new-feature`).
5.  Create new Pull Request.
PK}$[�cϛ��,gems/gems/rackup-2.1.0/lib/rackup/version.rbnu�[���# frozen_string_literal: true

# Released under the MIT License.
# Copyright, 2022-2023, by Samuel Williams.

module Rackup
  VERSION = "2.1.0"
end
PK}$[���HH0gems/gems/rackup-2.1.0/lib/rackup/handler/cgi.rbnu�[���# frozen_string_literal: true

# Released under the MIT License.
# Copyright, 2022-2023, by Samuel Williams.

module Rackup
  module Handler
    class CGI
      include Rack

      def self.run(app, **options)
        $stdin.binmode
        serve app
      end

      def self.serve(app)
        env = ENV.to_hash
        env.delete "HTTP_CONTENT_LENGTH"

        env[SCRIPT_NAME] = ""  if env[SCRIPT_NAME] == "/"

        env.update(
          RACK_INPUT        => $stdin,
          RACK_ERRORS       => $stderr,
          RACK_URL_SCHEME   => ["yes", "on", "1"].include?(ENV[HTTPS]) ? "https" : "http"
        )

        env[QUERY_STRING] ||= ""
        env[REQUEST_PATH] ||= "/"

        status, headers, body = app.call(env)
        begin
          send_headers status, headers
          send_body body
        ensure
          body.close  if body.respond_to? :close
        end
      end

      def self.send_headers(status, headers)
        $stdout.print "Status: #{status}\r\n"
        headers.each { |k, vs|
          vs.split("\n").each { |v|
            $stdout.print "#{k}: #{v}\r\n"
          }
        }
        $stdout.print "\r\n"
        $stdout.flush
      end

      def self.send_body(body)
        body.each { |part|
          $stdout.print part
          $stdout.flush
        }
      end
    end

    register :cgi, CGI
  end
end
PK}$[���|��4gems/gems/rackup-2.1.0/lib/rackup/handler/webrick.rbnu�[���# frozen_string_literal: true

# Released under the MIT License.
# Copyright, 2022-2023, by Samuel Williams.
# Copyright, 2022, by Jeremy Evans.

require 'webrick'
require 'stringio'

require 'rack/constants'
require_relative '../handler'
require_relative '../version'

require_relative '../stream'

module Rackup
  module Handler
    class WEBrick < ::WEBrick::HTTPServlet::AbstractServlet
      def self.run(app, **options)
        environment  = ENV['RACK_ENV'] || 'development'
        default_host = environment == 'development' ? 'localhost' : nil

        if !options[:BindAddress] || options[:Host]
          options[:BindAddress] = options.delete(:Host) || default_host
        end
        options[:Port] ||= 8080
        if options[:SSLEnable]
          require 'webrick/https'
        end

        @server = ::WEBrick::HTTPServer.new(options)
        @server.mount "/", Rackup::Handler::WEBrick, app
        yield @server if block_given?
        @server.start
      end

      def self.valid_options
        environment  = ENV['RACK_ENV'] || 'development'
        default_host = environment == 'development' ? 'localhost' : '0.0.0.0'

        {
          "Host=HOST" => "Hostname to listen on (default: #{default_host})",
          "Port=PORT" => "Port to listen on (default: 8080)",
        }
      end

      def self.shutdown
        if @server
          @server.shutdown
          @server = nil
        end
      end

      def initialize(server, app)
        super server
        @app = app
      end

      # This handles mapping the WEBrick request to a Rack input stream.
      class Input
        include Stream::Reader

        def initialize(request)
          @request = request

          @reader = Fiber.new do
            @request.body do |chunk|
              Fiber.yield(chunk)
            end

            Fiber.yield(nil)

            # End of stream:
            @reader = nil
          end
        end

        def close
          @request = nil
          @reader = nil
        end

        private

        # Read one chunk from the request body.
        def read_next
          @reader&.resume
        end
      end

      def service(req, res)
        env = req.meta_vars
        env.delete_if { |k, v| v.nil? }

        input = Input.new(req)

        env.update(
          ::Rack::RACK_INPUT => input,
          ::Rack::RACK_ERRORS => $stderr,
          ::Rack::RACK_URL_SCHEME => ["yes", "on", "1"].include?(env[::Rack::HTTPS]) ? "https" : "http",
          ::Rack::RACK_IS_HIJACK => true,
        )

        env[::Rack::QUERY_STRING] ||= ""
        unless env[::Rack::PATH_INFO] == ""
          path, n = req.request_uri.path, env[::Rack::SCRIPT_NAME].length
          env[::Rack::PATH_INFO] = path[n, path.length - n]
        end
        env[::Rack::REQUEST_PATH] ||= [env[::Rack::SCRIPT_NAME], env[::Rack::PATH_INFO]].join

        status, headers, body = @app.call(env)
        begin
          res.status = status

          if value = headers[::Rack::RACK_HIJACK]
            io_lambda = value
            body = nil
          elsif !body.respond_to?(:to_path) && !body.respond_to?(:each)
            io_lambda = body
            body = nil
          end

          if value = headers.delete('set-cookie')
            res.cookies.concat(Array(value))
          end

          headers.each do |key, value|
            # Skip keys starting with rack., per Rack SPEC
            next if key.start_with?('rack.')

            # Since WEBrick won't accept repeated headers,
            # merge the values per RFC 1945 section 4.2.
            value = value.join(", ") if Array === value
            res[key] = value
          end

          if io_lambda
            protocol = headers['rack.protocol'] || headers['upgrade']

            if protocol
              # Set all the headers correctly for an upgrade response:
              res.upgrade!(protocol)
            end
            res.body = io_lambda
          elsif body.respond_to?(:to_path)
            res.body = ::File.open(body.to_path, 'rb')
          else
            buffer = String.new
            body.each do |part|
              buffer << part
            end
            res.body = buffer
          end
        ensure
          body.close if body.respond_to?(:close)
        end
      end
    end

    register :webrick, WEBrick
  end
end
PK}$[lo|	��+gems/gems/rackup-2.1.0/lib/rackup/stream.rbnu�[���# frozen_string_literal: true

# Released under the MIT License.
# Copyright, 2019-2022, by Samuel Williams.

module Rackup
  # The input stream is an IO-like object which contains the raw HTTP POST data. When applicable, its external encoding must be “ASCII-8BIT” and it must be opened in binary mode, for Ruby 1.9 compatibility. The input stream must respond to gets, each, read and rewind.
  class Stream
    def initialize(input = nil, output = Buffered.new)
      @input = input
      @output = output

      raise ArgumentError, "Non-writable output!" unless output.respond_to?(:write)

      # Will hold remaining data in `#read`.
      @buffer = nil
      @closed = false
    end

    attr :input
    attr :output

    # This provides a read-only interface for data, which is surprisingly tricky to implement correctly.
    module Reader
      # rack.hijack_io must respond to:
      # read, write, read_nonblock, write_nonblock, flush, close, close_read, close_write, closed?

      # read behaves like IO#read. Its signature is read([length, [buffer]]). If given, length must be a non-negative Integer (>= 0) or nil, and buffer must be a String and may not be nil. If length is given and not nil, then this method reads at most length bytes from the input stream. If length is not given or nil, then this method reads all data until EOF. When EOF is reached, this method returns nil if length is given and not nil, or “” if length is not given or is nil. If buffer is given, then the read data will be placed into buffer instead of a newly created String object.
      # @param length [Integer] the amount of data to read
      # @param buffer [String] the buffer which will receive the data
      # @return a buffer containing the data
      def read(length = nil, buffer = nil)
        return '' if length == 0

        buffer ||= String.new.force_encoding(Encoding::BINARY)

        # Take any previously buffered data and replace it into the given buffer.
        if @buffer
          buffer.replace(@buffer)
          @buffer = nil
        else
          buffer.clear
        end

        if length
          while buffer.bytesize < length and chunk = read_next
            buffer << chunk
          end

          # This ensures the subsequent `slice!` works correctly.
          buffer.force_encoding(Encoding::BINARY)

          # This will be at least one copy:
          @buffer = buffer.byteslice(length, buffer.bytesize)

          # This should be zero-copy:
          buffer.slice!(length, buffer.bytesize)

          if buffer.empty?
            return nil
          else
            return buffer
          end
        else
          while chunk = read_next
            buffer << chunk
          end

          return buffer
        end
      end

      # Read at most `length` bytes from the stream. Will avoid reading from the underlying stream if possible.
      def read_partial(length = nil)
        if @buffer
          buffer = @buffer
          @buffer = nil
        else
          buffer = read_next
        end

        if buffer and length
          if buffer.bytesize > length
            # This ensures the subsequent `slice!` works correctly.
            buffer.force_encoding(Encoding::BINARY)

            @buffer = buffer.byteslice(length, buffer.bytesize)
            buffer.slice!(length, buffer.bytesize)
          end
        end

        return buffer
      end

      def gets
        read_partial
      end

      def each
        while chunk = read_partial
          yield chunk
        end
      end

      def read_nonblock(length, buffer = nil)
        @buffer ||= read_next
        chunk = nil

        unless @buffer
          buffer&.clear
          return
        end

        if @buffer.bytesize > length
          chunk = @buffer.byteslice(0, length)
          @buffer = @buffer.byteslice(length, @buffer.bytesize)
        else
          chunk = @buffer
          @buffer = nil
        end

        if buffer
          buffer.replace(chunk)
        else
          buffer = chunk
        end

        return buffer
      end
    end

    include Reader

    def write(buffer)
      if @output
        @output.write(buffer)
        return buffer.bytesize
      else
        raise IOError, "Stream is not writable, output has been closed!"
      end
    end

    def write_nonblock(buffer)
      write(buffer)
    end

    def <<(buffer)
      write(buffer)
    end

    def flush
    end

    def close_read
      @input&.close
      @input = nil
    end

    # close must never be called on the input stream. huh?
    def close_write
      if @output.respond_to?(:close)
        @output&.close
      end

      @output = nil
    end

    # Close the input and output bodies.
    def close(error = nil)
      self.close_read
      self.close_write

      return nil
    ensure
      @closed = true
    end

    # Whether the stream has been closed.
    def closed?
      @closed
    end

    # Whether there are any output chunks remaining?
    def empty?
      @output.empty?
    end

    private

    def read_next
      if @input
        return @input.read
      else
        @input = nil
        raise IOError, "Stream is not readable, input has been closed!"
      end
    end
  end
end
PK}$[�F��;;,gems/gems/rackup-2.1.0/lib/rackup/handler.rbnu�[���# frozen_string_literal: true

# Released under the MIT License.
# Copyright, 2022-2023, by Samuel Williams.

module Rackup
  # *Handlers* connect web servers with Rack.
  #
  # Rackup includes Handlers for WEBrick and CGI.
  #
  # Handlers usually are activated by calling <tt>MyHandler.run(myapp)</tt>.
  # A second optional hash can be passed to include server-specific
  # configuration.
  module Handler
    @handlers = {}

    # Register a named handler class.
    def self.register(name, klass)
      if klass.is_a?(String)
        warn "Calling Rackup::Handler.register with a string is deprecated, use the class/module itself.", uplevel: 1

        klass = self.const_get(klass, false)
      end

      name = name.to_sym

      @handlers[name] = klass
    end

    def self.[](name)
      name = name.to_sym

      begin
        @handlers[name] || self.const_get(name, false)
      rescue NameError
        # Ignore.
      end
    end

    def self.get(name)
      return nil unless name

      name = name.to_sym

      if server = self[name]
        return server
      end

      begin
        require_handler("rackup/handler", name)
      rescue LoadError
        require_handler("rack/handler", name)
      end

      return self[name]
    end

    RACK_HANDLER = 'RACK_HANDLER'
    RACKUP_HANDLER = 'RACKUP_HANDLER'

    SERVER_NAMES = %i(puma falcon webrick).freeze
    private_constant :SERVER_NAMES

    # Select first available Rack handler given an `Array` of server names.
    # Raises `LoadError` if no handler was found.
    #
    #   > pick ['puma', 'webrick']
    #   => Rackup::Handler::WEBrick
    def self.pick(server_names)
      server_names = Array(server_names)

      server_names.each do |server_name|
        begin
          server = self.get(server_name)
         return server if server
        rescue LoadError
          # Ignore.
        end
      end

      raise LoadError, "Couldn't find handler for: #{server_names.join(', ')}."
    end

    def self.default
      if rack_handler = ENV[RACKUP_HANDLER]
        self.get(rack_handler)
      elsif rack_handler = ENV[RACK_HANDLER]
        warn "RACK_HANDLER is deprecated, use RACKUP_HANDLER."
        self.get(rack_handler)
      else
        pick SERVER_NAMES
      end
    end

    # Transforms server-name constants to their canonical form as filenames,
    # then tries to require them but silences the LoadError if not found
    #
    # Naming convention:
    #
    #   Foo # => 'foo'
    #   FooBar # => 'foo_bar.rb'
    #   FooBAR # => 'foobar.rb'
    #   FOObar # => 'foobar.rb'
    #   FOOBAR # => 'foobar.rb'
    #   FooBarBaz # => 'foo_bar_baz.rb'
    def self.require_handler(prefix, const_name)
      file = const_name.to_s.gsub(/^[A-Z]+/) { |pre| pre.downcase }.
        gsub(/[A-Z]+[^A-Z]/, '_\&').downcase

      require(::File.join(prefix, file))
    end
  end
end
PK}$[/�:�4�4+gems/gems/rackup-2.1.0/lib/rackup/server.rbnu�[���# frozen_string_literal: true

# Released under the MIT License.
# Copyright, 2022-2023, by Samuel Williams.

require 'optparse'
require 'fileutils'

require 'rack/builder'
require 'rack/common_logger'
require 'rack/content_length'
require 'rack/show_exceptions'
require 'rack/lint'
require 'rack/tempfile_reaper'

require 'rack/version'

require_relative 'version'
require_relative 'handler'

module Rackup
  class Server
    class Options
      def parse!(args)
        options = {}
        opt_parser = OptionParser.new("", 24, '  ') do |opts|
          opts.banner = "Usage: rackup [ruby options] [rack options] [rackup config]"

          opts.separator ""
          opts.separator "Ruby options:"

          lineno = 1
          opts.on("-e", "--eval LINE", "evaluate a LINE of code") { |line|
            eval line, TOPLEVEL_BINDING, "-e", lineno
            lineno += 1
          }

          opts.on("-d", "--debug", "set debugging flags (set $DEBUG to true)") {
            options[:debug] = true
          }
          opts.on("-w", "--warn", "turn warnings on for your script") {
            options[:warn] = true
          }
          opts.on("-q", "--quiet", "turn off logging") {
            options[:quiet] = true
          }

          opts.on("-I", "--include PATH",
                  "specify $LOAD_PATH (may be used more than once)") { |path|
            (options[:include] ||= []).concat(path.split(":"))
          }

          opts.on("-r", "--require LIBRARY",
                  "require the library, before executing your script") { |library|
            (options[:require] ||= []) << library
          }

          opts.separator ""
          opts.separator "Rack options:"
          opts.on("-b", "--builder BUILDER_LINE", "evaluate a BUILDER_LINE of code as a builder script") { |line|
            options[:builder] = line
          }

          opts.on("-s", "--server SERVER", "serve using SERVER (thin/puma/webrick)") { |s|
            options[:server] = s
          }

          opts.on("-o", "--host HOST", "listen on HOST (default: localhost)") { |host|
            options[:Host] = host
          }

          opts.on("-p", "--port PORT", "use PORT (default: 9292)") { |port|
            options[:Port] = port
          }

          opts.on("-O", "--option NAME[=VALUE]", "pass VALUE to the server as option NAME. If no VALUE, sets it to true. Run '#{$0} -s SERVER -h' to get a list of options for SERVER") { |name|
            name, value = name.split('=', 2)
            value = true if value.nil?
            options[name.to_sym] = value
          }

          opts.on("-E", "--env ENVIRONMENT", "use ENVIRONMENT for defaults (default: development)") { |e|
            options[:environment] = e
          }

          opts.on("-D", "--daemonize", "run daemonized in the background") { |d|
            options[:daemonize] ||= true
          }

          opts.on("--daemonize-noclose", "run daemonized in the background without closing stdout/stderr") {
            options[:daemonize] = :noclose
          }

          opts.on("-P", "--pid FILE", "file to store PID") { |f|
            options[:pid] = ::File.expand_path(f)
          }

          opts.separator ""
          opts.separator "Profiling options:"

          opts.on("--heap HEAPFILE", "Build the application, then dump the heap to HEAPFILE") do |e|
            options[:heapfile] = e
          end

          opts.on("--profile PROFILE", "Dump CPU or Memory profile to PROFILE (defaults to a tempfile)") do |e|
            options[:profile_file] = e
          end

          opts.on("--profile-mode MODE", "Profile mode (cpu|wall|object)") do |e|
            unless %w[cpu wall object].include?(e)
              raise OptionParser::InvalidOption, "unknown profile mode: #{e}"
            end
            options[:profile_mode] = e.to_sym
          end

          opts.separator ""
          opts.separator "Common options:"

          opts.on_tail("-h", "-?", "--help", "Show this message") do
            puts opts
            puts handler_opts(options)

            exit
          end

          opts.on_tail("--version", "Show version") do
            puts "Rack #{Rack::RELEASE}"
            exit
          end
        end

        begin
          opt_parser.parse! args
        rescue OptionParser::InvalidOption => e
          warn e.message
          abort opt_parser.to_s
        end

        options[:config] = args.last if args.last && !args.last.empty?
        options
      end

      def handler_opts(options)
        info = []
        server = Rackup::Handler.get(options[:server]) || Rackup::Handler.default
        if server && server.respond_to?(:valid_options)
          info << ""
          info << "Server-specific options for #{server.name}:"

          has_options = false
          server.valid_options.each do |name, description|
            next if /^(Host|Port)[^a-zA-Z]/.match?(name.to_s) # ignore handler's host and port options, we do our own.
            info << sprintf("  -O %-21s %s", name, description)
            has_options = true
          end
          return "" if !has_options
        end
        info.join("\n")
      rescue NameError, LoadError
        return "Warning: Could not find handler specified (#{options[:server] || 'default'}) to determine handler-specific options"
      end
    end

    # Start a new rack server (like running rackup). This will parse ARGV and
    # provide standard ARGV rackup options, defaulting to load 'config.ru'.
    #
    # Providing an options hash will prevent ARGV parsing and will not include
    # any default options.
    #
    # This method can be used to very easily launch a CGI application, for
    # example:
    #
    #  Rack::Server.start(
    #    :app => lambda do |e|
    #      [200, {'content-type' => 'text/html'}, ['hello world']]
    #    end,
    #    :server => 'cgi'
    #  )
    #
    # Further options available here are documented on Rack::Server#initialize
    def self.start(options = nil)
      new(options).start
    end

    attr_writer :options

    # Options may include:
    # * :app
    #     a rack application to run (overrides :config and :builder)
    # * :builder
    #     a string to evaluate a Rack::Builder from
    # * :config
    #     a rackup configuration file path to load (.ru)
    # * :environment
    #     this selects the middleware that will be wrapped around
    #     your application. Default options available are:
    #       - development: CommonLogger, ShowExceptions, and Lint
    #       - deployment: CommonLogger
    #       - none: no extra middleware
    #     note: when the server is a cgi server, CommonLogger is not included.
    # * :server
    #     choose a specific Rackup::Handler, e.g. cgi, fcgi, webrick
    # * :daemonize
    #     if truthy, the server will daemonize itself (fork, detach, etc)
    #     if :noclose, the server will not close STDOUT/STDERR
    # * :pid
    #     path to write a pid file after daemonize
    # * :Host
    #     the host address to bind to (used by supporting Rackup::Handler)
    # * :Port
    #     the port to bind to (used by supporting Rackup::Handler)
    # * :AccessLog
    #     webrick access log options (or supporting Rackup::Handler)
    # * :debug
    #     turn on debug output ($DEBUG = true)
    # * :warn
    #     turn on warnings ($-w = true)
    # * :include
    #     add given paths to $LOAD_PATH
    # * :require
    #     require the given libraries
    #
    # Additional options for profiling app initialization include:
    # * :heapfile
    #     location for ObjectSpace.dump_all to write the output to
    # * :profile_file
    #     location for CPU/Memory (StackProf) profile output (defaults to a tempfile)
    # * :profile_mode
    #     StackProf profile mode (cpu|wall|object)
    def initialize(options = nil)
      @ignore_options = []

      if options
        @use_default_options = false
        @options = options
        @app = options[:app] if options[:app]
      else
        @use_default_options = true
        @options = parse_options(ARGV)
      end
    end

    def options
      merged_options = @use_default_options ? default_options.merge(@options) : @options
      merged_options.reject { |k, v| @ignore_options.include?(k) }
    end

    def default_options
      environment  = ENV['RACK_ENV'] || 'development'
      default_host = environment == 'development' ? 'localhost' : '0.0.0.0'

      {
        environment: environment,
        pid: nil,
        Port: 9292,
        Host: default_host,
        AccessLog: [],
        config: "config.ru"
      }
    end

    def app
      @app ||= options[:builder] ? build_app_from_string : build_app_and_options_from_config
    end

    class << self
      def logging_middleware
        lambda { |server|
          /CGI/.match?(server.server.name) || server.options[:quiet] ? nil : [Rack::CommonLogger, $stderr]
        }
      end

      def default_middleware_by_environment
        m = Hash.new {|h, k| h[k] = []}
        m["deployment"] = [
          [Rack::ContentLength],
          logging_middleware,
          [Rack::TempfileReaper]
        ]
        m["development"] = [
          [Rack::ContentLength],
          logging_middleware,
          [Rack::ShowExceptions],
          [Rack::Lint],
          [Rack::TempfileReaper]
        ]

        m
      end

      def middleware
        default_middleware_by_environment
      end
    end

    def middleware
      self.class.middleware
    end

    def start(&block)
      if options[:warn]
        $-w = true
      end

      if includes = options[:include]
        $LOAD_PATH.unshift(*includes)
      end

      Array(options[:require]).each do |library|
        require library
      end

      if options[:debug]
        $DEBUG = true
        require 'pp'
        p options[:server]
        pp wrapped_app
        pp app
      end

      check_pid! if options[:pid]

      # Touch the wrapped app, so that the config.ru is loaded before
      # daemonization (i.e. before chdir, etc).
      handle_profiling(options[:heapfile], options[:profile_mode], options[:profile_file]) do
        wrapped_app
      end

      daemonize_app if options[:daemonize]

      write_pid if options[:pid]

      trap(:INT) do
        if server.respond_to?(:shutdown)
          server.shutdown
        else
          exit
        end
      end

      server.run(wrapped_app, **options, &block)
    end

    def server
      @_server ||= Handler.get(options[:server]) || Handler.default
    end

    private
      def build_app_and_options_from_config
        if !::File.exist? options[:config]
          abort "configuration #{options[:config]} not found"
        end

        return Rack::Builder.parse_file(self.options[:config])
      end

      def handle_profiling(heapfile, profile_mode, filename)
        if heapfile
          require "objspace"
          ObjectSpace.trace_object_allocations_start
          yield
          GC.start
          ::File.open(heapfile, "w") { |f| ObjectSpace.dump_all(output: f) }
          exit
        end

        if profile_mode
          require "stackprof"
          require "tempfile"

          make_profile_name(filename) do |filename|
            ::File.open(filename, "w") do |f|
              StackProf.run(mode: profile_mode, out: f) do
                yield
              end
              puts "Profile written to: #{filename}"
            end
          end
          exit
        end

        yield
      end

      def make_profile_name(filename)
        if filename
          yield filename
        else
          ::Dir::Tmpname.create("profile.dump") do |tmpname, _, _|
            yield tmpname
          end
        end
      end

      def build_app_from_string
        Rack::Builder.new_from_string(self.options[:builder])
      end

      def parse_options(args)
        # Don't evaluate CGI ISINDEX parameters.
        args.clear if ENV.include?(Rack::REQUEST_METHOD)

        @options = opt_parser.parse!(args)
        @options[:config] = ::File.expand_path(options[:config])
        ENV["RACK_ENV"] = options[:environment]
        @options
      end

      def opt_parser
        Options.new
      end

      def build_app(app)
        middleware[options[:environment]].reverse_each do |middleware|
          middleware = middleware.call(self) if middleware.respond_to?(:call)
          next unless middleware
          klass, *args = middleware
          app = klass.new(app, *args)
        end
        app
      end

      def wrapped_app
        @wrapped_app ||= build_app app
      end

      def daemonize_app
        # Cannot be covered as it forks
        # :nocov:
        Process.daemon(true, options[:daemonize] == :noclose)
        # :nocov:
      end

      def write_pid
        ::File.open(options[:pid], ::File::CREAT | ::File::EXCL | ::File::WRONLY ){ |f| f.write("#{Process.pid}") }
        at_exit { ::FileUtils.rm_f(options[:pid]) }
      rescue Errno::EEXIST
        check_pid!
        retry
      end

      def check_pid!
        return unless ::File.exist?(options[:pid])

        pid = ::File.read(options[:pid]).to_i
        raise Errno::ESRCH if pid == 0

        Process.kill(0, pid)
        exit_with_pid(pid)
      rescue Errno::ESRCH
        ::File.delete(options[:pid])
      rescue Errno::EPERM
        exit_with_pid(pid)
      end

      def exit_with_pid(pid)
        $stderr.puts "A server is already running (pid: #{pid}, file: #{options[:pid]})."
        exit(1)
      end
  end

end
PK}$[�����,gems/gems/rackup-2.1.0/lib/rackup/lobster.rbnu�[���# frozen_string_literal: true

# Released under the MIT License.
# Copyright, 2022-2023, by Samuel Williams.

require 'zlib'

require 'rack/constants'
require 'rack/request'
require 'rack/response'

module Rackup
  # Paste has a Pony, Rack has a Lobster!
  class Lobster
    include Rack

    LobsterString = Zlib::Inflate.inflate("eJx9kEEOwyAMBO99xd7MAcytUhPlJyj2
    P6jy9i4k9EQyGAnBarEXeCBqSkntNXsi/ZCvC48zGQoZKikGrFMZvgS5ZHd+aGWVuWwhVF0
    t1drVmiR42HcWNz5w3QanT+2gIvTVCiE1lm1Y0eU4JGmIIbaKwextKn8rvW+p5PIwFl8ZWJ
    I8jyiTlhTcYXkekJAzTyYN6E08A+dk8voBkAVTJQ==".delete("\n ").unpack("m*")[0])

    LambdaLobster = lambda { |env|
      if env[QUERY_STRING].include?("flip")
        lobster = LobsterString.split("\n").
          map { |line| line.ljust(42).reverse }.
          join("\n")
        href = "?"
      else
        lobster = LobsterString
        href = "?flip"
      end

      content = ["<title>Lobstericious!</title>",
                 "<pre>", lobster, "</pre>",
                 "<a href='#{href}'>flip!</a>"]
      length = content.inject(0) { |a, e| a + e.size }.to_s
      [200, { CONTENT_TYPE => "text/html", CONTENT_LENGTH => length }, content]
    }

    def call(env)
      req = Request.new(env)
      if req.GET["flip"] == "left"
        lobster = LobsterString.split("\n").map do |line|
          line.ljust(42).reverse.
            gsub('\\', 'TEMP').
            gsub('/', '\\').
            gsub('TEMP', '/').
            gsub('{', '}').
            gsub('(', ')')
        end.join("\n")
        href = "?flip=right"
      elsif req.GET["flip"] == "crash"
        raise "Lobster crashed"
      else
        lobster = LobsterString
        href = "?flip=left"
      end

      res = Response.new
      res.write "<title>Lobstericious!</title>"
      res.write "<pre>"
      res.write lobster
      res.write "</pre>"
      res.write "<p><a href='#{href}'>flip!</a></p>"
      res.write "<p><a href='?flip=crash'>crash!</a></p>"
      res.finish
    end

  end
end

if $0 == __FILE__
  # :nocov:
  require_relative 'server'
  require_relative 'show_exceptions'
  require_relative 'lint'
  Rackup::Server.start(
    app: Rack::ShowExceptions.new(Rack::Lint.new(Rackup::Lobster.new)), Port: 9292
  )
  # :nocov:
end
PK}$[��9�$$$gems/gems/rackup-2.1.0/lib/rackup.rbnu�[���# frozen_string_literal: true

# Released under the MIT License.
# Copyright, 2022-2023, by Samuel Williams.

require_relative 'rackup/handler'
require_relative 'rackup/server'
require_relative 'rackup/version'

require_relative 'rackup/handler/webrick'
require_relative 'rackup/handler/cgi'
PK}$[e
�ee"gems/gems/rackup-2.1.0/security.mdnu�[���# Security Policy

Please see our main security policy: https://github.com/rack/rack/security/policy
PK}$[t2�����!gems/gems/rack-3.0.8/CHANGELOG.mdnu�[���# Changelog

All notable changes to this project will be documented in this file. For info on how to format all future additions to this file please reference [Keep A Changelog](https://keepachangelog.com/en/1.0.0/).

## [3.0.7] - 2023-03-16

- Make query parameters without `=` have `nil` values. ([#2059](https://github.com/rack/rack/pull/2059), [@jeremyevans])

## [3.0.6.1] - 2023-03-13

- [CVE-2023-27539] Avoid ReDoS in header parsing

## [3.0.6] - 2023-03-13

- Add `QueryParser#missing_value` for handling missing values + tests. ([#2052](https://github.com/rack/rack/pull/2052), [@ioquatix])

## [3.0.5] - 2023-03-13

- Split form/query parsing into two steps. ([#2038](https://github.com/rack/rack/pull/2038), [@matthewd](https://github.com/matthewd))

## [3.0.4.1] - 2023-03-02

- [CVE-2023-27530] Introduce multipart_total_part_limit to limit total parts

## [3.0.4.1] - 2023-01-17

- [CVE-2022-44571] Fix ReDoS vulnerability in multipart parser
- [CVE-2022-44570] Fix ReDoS in Rack::Utils.get_byte_ranges
- [CVE-2022-44572] Forbid control characters in attributes (also ReDoS)

## [3.0.4] - 2023-01-17

- `Rack::Request#POST` should consistently raise errors. Cache errors that occur when invoking `Rack::Request#POST` so they can be raised again later. ([#2010](https://github.com/rack/rack/pull/2010), [@ioquatix])
- Fix `Rack::Lint` error message for `HTTP_CONTENT_TYPE` and `HTTP_CONTENT_LENGTH`. ([#2007](https://github.com/rack/rack/pull/2007), [@byroot](https://github.com/byroot))
- Extend `Rack::MethodOverride` to handle `QueryParser::ParamsTooDeepError` error. ([#2006](https://github.com/rack/rack/pull/2006), [@byroot](https://github.com/byroot))

## [3.0.3] - 2022-12-27

### Fixed

- `Rack::URLMap` uses non-deprecated form of `Regexp.new`. ([#1998](https://github.com/rack/rack/pull/1998), [@weizheheng](https://github.com/weizheheng))

## [3.0.2] - 2022-12-05

### Fixed

- `Utils.build_nested_query` URL-encodes nested field names including the square brackets.
- Allow `Rack::Response` to pass through streaming bodies. ([#1993](https://github.com/rack/rack/pull/1993), [@ioquatix])

## [3.0.1] - 2022-11-18

### Fixed

- `MethodOverride` does not look for an override if a request does not include form/parseable data.
- `Rack::Lint::Wrapper` correctly handles `respond_to?` with `to_ary`, `each`, `call` and `to_path`, forwarding to the body. ([#1981](https://github.com/rack/rack/pull/1981), [@ioquatix])

## [3.0.0] - 2022-09-06

- No changes

## [3.0.0.rc1] - 2022-09-04

### SPEC Changes

- Stream argument must implement `<<` https://github.com/rack/rack/pull/1959
- `close` may be called on `rack.input` https://github.com/rack/rack/pull/1956
- `rack.response_finished` may be used for executing code after the response has been finished https://github.com/rack/rack/pull/1952

## [3.0.0.beta1] - 2022-08-08

### Security

- Do not use semicolon as GET parameter separator. ([#1733](https://github.com/rack/rack/pull/1733), [@jeremyevans])

### SPEC Changes

- Response array must now be non-frozen.
- Response `status` must now be an integer greater than or equal to 100.
- Response `headers` must now be an unfrozen hash.
- Response header keys can no longer include uppercase characters.
- Response header values can be an `Array` to handle multiple values (and no longer supports `\n` encoded headers).
- Response body can now respond to `#call` (streaming body) instead of `#each` (enumerable body), for the equivalent of response hijacking in previous versions.
- Middleware must no longer call `#each` on the body, but they can call `#to_ary` on the body if it responds to `#to_ary`.
- `rack.input` is no longer required to be rewindable.
- `rack.multithread`/`rack.multiprocess`/`rack.run_once`/`rack.version` are no longer required environment keys.
- `SERVER_PROTOCOL` is now a required environment key, matching the HTTP protocol used in the request.
- `rack.hijack?` (partial hijack) and `rack.hijack` (full hijack) are now independently optional.
- `rack.hijack_io` has been removed completely.
- `rack.response_finished` is an optional environment key which contains an array of callable objects that must accept `#call(env, status, headers, error)` and are invoked after the response is finished (either successfully or unsuccessfully).
- It is okay to call `#close` on `rack.input` to indicate that you no longer need or care about the input.
- The stream argument supplied to the streaming body and hijack must support `#<<` for writing output.

### Removed

- Remove `rack.multithread`/`rack.multiprocess`/`rack.run_once`. These variables generally come too late to be useful. ([#1720](https://github.com/rack/rack/pull/1720), [@ioquatix], [@jeremyevans]))
- Remove deprecated Rack::Request::SCHEME_WHITELIST. ([@jeremyevans])
- Remove internal cookie deletion using pattern matching, there are very few practical cases where it would be useful and browsers handle it correctly without us doing anything special. ([#1844](https://github.com/rack/rack/pull/1844), [@ioquatix])
- Remove `rack.version` as it comes too late to be useful. ([#1938](https://github.com/rack/rack/pull/1938), [@ioquatix])
- Extract `rackup` command, `Rack::Server`, `Rack::Handler` and related code into a separate gem. ([#1937](https://github.com/rack/rack/pull/1937), [@ioquatix])

### Added

- `Rack::Headers` added to support lower-case header keys. ([@jeremyevans])
- `Rack::Utils#set_cookie_header` now supports `escape_key: false` to avoid key escaping.  ([@jeremyevans])
- `Rack::RewindableInput` supports size. ([@ahorek](https://github.com/ahorek))
- `Rack::RewindableInput::Middleware` added for making `rack.input` rewindable. ([@jeremyevans])
- The RFC 7239 Forwarded header is now supported and considered by default when looking for information on forwarding, falling back to the X-Forwarded-* headers. `Rack::Request.forwarded_priority` accessor has been added for configuring the priority of which header to check.  ([#1423](https://github.com/rack/rack/issues/1423), [@jeremyevans])
- Allow response headers to contain array of values. ([#1598](https://github.com/rack/rack/issues/1598), [@ioquatix])
- Support callable body for explicit streaming support and clarify streaming response body behaviour. ([#1745](https://github.com/rack/rack/pull/1745), [@ioquatix], [#1748](https://github.com/rack/rack/pull/1748), [@wjordan])
- Allow `Rack::Builder#run` to take a block instead of an argument. ([#1942](https://github.com/rack/rack/pull/1942), [@ioquatix])
- Add `rack.response_finished` to `Rack::Lint`. ([#1802](https://github.com/rack/rack/pull/1802), [@BlakeWilliams], [#1952](https://github.com/rack/rack/pull/1952), [@ioquatix])
- The stream argument must implement `#<<`. ([#1959](https://github.com/rack/rack/pull/1959), [@ioquatix])

### Changed

- BREAKING CHANGE: Require `status` to be an Integer. ([#1662](https://github.com/rack/rack/pull/1662), [@olleolleolle](https://github.com/olleolleolle))
- BREAKING CHANGE: Query parsing now treats parameters without `=` as having the empty string value instead of nil value, to conform to the URL spec. ([#1696](https://github.com/rack/rack/issues/1696), [@jeremyevans])
- Relax validations around `Rack::Request#host` and `Rack::Request#hostname`. ([#1606](https://github.com/rack/rack/issues/1606), [@pvande](https://github.com/pvande))
- Removed antiquated handlers: FCGI, LSWS, SCGI, Thin. ([#1658](https://github.com/rack/rack/pull/1658), [@ioquatix])
- Removed options from `Rack::Builder.parse_file` and `Rack::Builder.load_file`. ([#1663](https://github.com/rack/rack/pull/1663), [@ioquatix])
- `Rack::HTTP_VERSION` has been removed and the `HTTP_VERSION` env setting is no longer set in the CGI and Webrick handlers. ([#970](https://github.com/rack/rack/issues/970), [@jeremyevans])
- `Rack::Request#[]` and `#[]=` now warn even in non-verbose mode. ([#1277](https://github.com/rack/rack/issues/1277), [@jeremyevans])
- Decrease default allowed parameter recursion level from 100 to 32. ([#1640](https://github.com/rack/rack/issues/1640), [@jeremyevans])
- Attempting to parse a multipart response with an empty body now raises Rack::Multipart::EmptyContentError. ([#1603](https://github.com/rack/rack/issues/1603), [@jeremyevans])
- `Rack::Utils.secure_compare` uses OpenSSL's faster implementation if available. ([#1711](https://github.com/rack/rack/pull/1711), [@bdewater](https://github.com/bdewater))
- `Rack::Request#POST` now caches an empty hash if input content type is not parseable. ([#749](https://github.com/rack/rack/pull/749), [@jeremyevans])
- BREAKING CHANGE: Updated `trusted_proxy?` to match full 127.0.0.0/8 network. ([#1781](https://github.com/rack/rack/pull/1781), [@snbloch](https://github.com/snbloch))
- Explicitly deprecate `Rack::File` which was an alias for `Rack::Files`. ([#1811](https://github.com/rack/rack/pull/1720), [@ioquatix]).
- Moved `Rack::Session` into [separate gem](https://github.com/rack/rack-session). ([#1805](https://github.com/rack/rack/pull/1805), [@ioquatix])
- `rackup -D` option to daemonizes no longer changes the working directory to the root. ([#1813](https://github.com/rack/rack/pull/1813), [@jeremyevans])
- The `x-forwarded-proto` header is now considered before the `x-forwarded-scheme` header for determining the forwarded protocol. `Rack::Request.x_forwarded_proto_priority` accessor has been added for configuring the priority of which header to check.  ([#1809](https://github.com/rack/rack/issues/1809), [@jeremyevans])
- `Rack::Request.forwarded_authority` (and methods that call it, such as `host`) now returns the last authority in the forwarded header, instead of the first, as earlier forwarded authorities can be forged by clients. This restores the Rack 2.1 behavior. ([#1829](https://github.com/rack/rack/issues/1809), [@jeremyevans])
- Use lower case cookie attributes when creating cookies, and fold cookie attributes to lower case when reading cookies (specifically impacting `secure` and `httponly` attributes). ([#1849](https://github.com/rack/rack/pull/1849), [@ioquatix])
- The response array must now be mutable (non-frozen) so middleware can modify it without allocating a new Array,therefore reducing object allocations. ([#1887](https://github.com/rack/rack/pull/1887), [#1927](https://github.com/rack/rack/pull/1927), [@amatsuda], [@ioquatix])
- `rack.hijack?` (partial hijack) and `rack.hijack` (full hijack) are now independently optional. `rack.hijack_io` is no longer required/specified. ([#1939](https://github.com/rack/rack/pull/1939), [@ioquatix])
- Allow calling close on `rack.input`. ([#1956](https://github.com/rack/rack/pull/1956), [@ioquatix])

### Fixed

- Make Rack::MockResponse handle non-hash headers. ([#1629](https://github.com/rack/rack/issues/1629), [@jeremyevans])
- TempfileReaper now deletes temp files if application raises an exception. ([#1679](https://github.com/rack/rack/issues/1679), [@jeremyevans])
- Handle cookies with values that end in '=' ([#1645](https://github.com/rack/rack/pull/1645), [@lukaso](https://github.com/lukaso))
- Make `Rack::NullLogger` respond to `#fatal!` [@jeremyevans])
- Fix multipart filename generation for filenames that contain spaces. Encode spaces as "%20" instead of "+" which will be decoded properly by the multipart parser. ([#1736](https://github.com/rack/rack/pull/1645), [@muirdm](https://github.com/muirdm))
- `Rack::Request#scheme` returns `ws` or `wss` when one of the `X-Forwarded-Scheme` / `X-Forwarded-Proto` headers is set to `ws` or `wss`, respectively. ([#1730](https://github.com/rack/rack/issues/1730), [@erwanst](https://github.com/erwanst))

## [2.2.4] - 2022-06-30

- Better support for lower case headers in `Rack::ETag` middleware. ([#1919](https://github.com/rack/rack/pull/1919), [@ioquatix](https://github.com/ioquatix))
- Use custom exception on params too deep error. ([#1838](https://github.com/rack/rack/pull/1838), [@simi](https://github.com/simi))

## [2.2.3.1] - 2022-05-27

- [CVE-2022-30123] Fix shell escaping issue in Common Logger
- [CVE-2022-30122] Restrict parsing of broken MIME attachments

## [2.2.3] - 2020-06-15

### Security

- [[CVE-2020-8184](https://nvd.nist.gov/vuln/detail/CVE-2020-8184)] Do not allow percent-encoded cookie name to override existing cookie names. BREAKING CHANGE: Accessing cookie names that require URL encoding with decoded name no longer works. ([@fletchto99](https://github.com/fletchto99))

## [2.2.2] - 2020-02-11

### Fixed

- Fix incorrect `Rack::Request#host` value. ([#1591](https://github.com/rack/rack/pull/1591), [@ioquatix])
- Revert `Rack::Handler::Thin` implementation. ([#1583](https://github.com/rack/rack/pull/1583), [@jeremyevans])
- Double assignment is still needed to prevent an "unused variable" warning. ([#1589](https://github.com/rack/rack/pull/1589), [@kamipo](https://github.com/kamipo))
- Fix to handle same_site option for session pool. ([#1587](https://github.com/rack/rack/pull/1587), [@kamipo](https://github.com/kamipo))

## [2.2.1] - 2020-02-09

### Fixed

- Rework `Rack::Request#ip` to handle empty `forwarded_for`. ([#1577](https://github.com/rack/rack/pull/1577), [@ioquatix])

## [2.2.0] - 2020-02-08

### SPEC Changes

- `rack.session` request environment entry must respond to `to_hash` and return unfrozen Hash. ([@jeremyevans])
- Request environment cannot be frozen. ([@jeremyevans])
- CGI values in the request environment with non-ASCII characters must use ASCII-8BIT encoding. ([@jeremyevans])
- Improve SPEC/lint relating to SERVER_NAME, SERVER_PORT and HTTP_HOST. ([#1561](https://github.com/rack/rack/pull/1561), [@ioquatix])

### Added

- `rackup` supports multiple `-r` options and will require all arguments. ([@jeremyevans])
- `Server` supports an array of paths to require for the `:require` option. ([@khotta](https://github.com/khotta))
- `Files` supports multipart range requests. ([@fatkodima](https://github.com/fatkodima))
- `Multipart::UploadedFile` supports an IO-like object instead of using the filesystem, using `:filename` and `:io` options. ([@jeremyevans])
- `Multipart::UploadedFile` supports keyword arguments `:path`, `:content_type`, and `:binary` in addition to positional arguments. ([@jeremyevans])
- `Static` supports a `:cascade` option for calling the app if there is no matching file. ([@jeremyevans])
- `Session::Abstract::SessionHash#dig`. ([@jeremyevans])
- `Response.[]` and `MockResponse.[]` for creating instances using status, headers, and body. ([@ioquatix])
- Convenient cache and content type methods for `Rack::Response`. ([#1555](https://github.com/rack/rack/pull/1555), [@ioquatix])

### Changed

- `Request#params` no longer rescues EOFError. ([@jeremyevans])
- `Directory` uses a streaming approach, significantly improving time to first byte for large directories. ([@jeremyevans])
- `Directory` no longer includes a Parent directory link in the root directory index. ([@jeremyevans])
- `QueryParser#parse_nested_query` uses original backtrace when reraising exception with new class. ([@jeremyevans])
- `ConditionalGet` follows RFC 7232 precedence if both If-None-Match and If-Modified-Since headers are provided. ([@jeremyevans])
- `.ru` files supports the `frozen-string-literal` magic comment. ([@eregon](https://github.com/eregon))
- Rely on autoload to load constants instead of requiring internal files, make sure to require 'rack' and not just 'rack/...'. ([@jeremyevans])
- BREAKING CHANGE: `Etag` will continue sending ETag even if the response should not be cached. Streaming no longer works without a workaround, see [#1619](https://github.com/rack/rack/issues/1619#issuecomment-848460528). ([@henm](https://github.com/henm))
- `Request#host_with_port` no longer includes a colon for a missing or empty port. ([@AlexWayfer](https://github.com/AlexWayfer))
- All handlers uses keywords arguments instead of an options hash argument. ([@ioquatix])
- `Files` handling of range requests no longer return a body that supports `to_path`, to ensure range requests are handled correctly. ([@jeremyevans])
- `Multipart::Generator` only includes `Content-Length` for files with paths, and `Content-Disposition` `filename` if the `UploadedFile` instance has one. ([@jeremyevans])
- `Request#ssl?` is true for the `wss` scheme (secure websockets). ([@jeremyevans])
- `Rack::HeaderHash` is memoized by default. ([#1549](https://github.com/rack/rack/pull/1549), [@ioquatix])
- `Rack::Directory` allow directory traversal inside root directory. ([#1417](https://github.com/rack/rack/pull/1417), [@ThomasSevestre](https://github.com/ThomasSevestre))
- Sort encodings by server preference. ([#1184](https://github.com/rack/rack/pull/1184), [@ioquatix], [@wjordan](https://github.com/wjordan))
- Rework host/hostname/authority implementation in `Rack::Request`. `#host` and `#host_with_port` have been changed to correctly return IPv6 addresses formatted with square brackets, as defined by [RFC3986](https://tools.ietf.org/html/rfc3986#section-3.2.2). ([#1561](https://github.com/rack/rack/pull/1561), [@ioquatix])
- `Rack::Builder` parsing options on first `#\` line is deprecated. ([#1574](https://github.com/rack/rack/pull/1574), [@ioquatix])

### Removed

- `Directory#path` as it was not used and always returned nil. ([@jeremyevans])
- `BodyProxy#each` as it was only needed to work around a bug in Ruby <1.9.3. ([@jeremyevans])
- `URLMap::INFINITY` and `URLMap::NEGATIVE_INFINITY`, in favor of `Float::INFINITY`. ([@ch1c0t](https://github.com/ch1c0t))
- Deprecation of `Rack::File`. It will be deprecated again in rack 2.2 or 3.0. ([@rafaelfranca](https://github.com/rafaelfranca))
- Support for Ruby 2.2 as it is well past EOL. ([@ioquatix])
- Remove `Rack::Files#response_body` as the implementation was broken. ([#1153](https://github.com/rack/rack/pull/1153), [@ioquatix])
- Remove `SERVER_ADDR` which was never part of the original SPEC. ([#1573](https://github.com/rack/rack/pull/1573), [@ioquatix])

### Fixed

- `Directory` correctly handles root paths containing glob metacharacters. ([@jeremyevans])
- `Cascade` uses a new response object for each call if initialized with no apps. ([@jeremyevans])
- `BodyProxy` correctly delegates keyword arguments to the body object on Ruby 2.7+. ([@jeremyevans])
- `BodyProxy#method` correctly handles methods delegated to the body object. ([@jeremyevans])
- `Request#host` and `Request#host_with_port` handle IPv6 addresses correctly. ([@AlexWayfer](https://github.com/AlexWayfer))
- `Lint` checks when response hijacking that `rack.hijack` is called with a valid object. ([@jeremyevans])
- `Response#write` correctly updates `Content-Length` if initialized with a body. ([@jeremyevans])
- `CommonLogger` includes `SCRIPT_NAME` when logging. ([@Erol](https://github.com/Erol))
- `Utils.parse_nested_query` correctly handles empty queries, using an empty instance of the params class instead of a hash. ([@jeremyevans])
- `Directory` correctly escapes paths in links. ([@yous](https://github.com/yous))
- `Request#delete_cookie` and related `Utils` methods handle `:domain` and `:path` options in same call. ([@jeremyevans])
- `Request#delete_cookie` and related `Utils` methods do an exact match on `:domain` and `:path` options. ([@jeremyevans])
- `Static` no longer adds headers when a gzipped file request has a 304 response. ([@chooh](https://github.com/chooh))
- `ContentLength` sets `Content-Length` response header even for bodies not responding to `to_ary`. ([@jeremyevans])
- Thin handler supports options passed directly to `Thin::Controllers::Controller`. ([@jeremyevans])
- WEBrick handler no longer ignores `:BindAddress` option. ([@jeremyevans])
- `ShowExceptions` handles invalid POST data. ([@jeremyevans])
- Basic authentication requires a password, even if the password is empty. ([@jeremyevans])
- `Lint` checks response is array with 3 elements, per SPEC. ([@jeremyevans])
- Support for using `:SSLEnable` option when using WEBrick handler. (Gregor Melhorn)
- Close response body after buffering it when buffering. ([@ioquatix])
- Only accept `;` as delimiter when parsing cookies. ([@mrageh](https://github.com/mrageh))
- `Utils::HeaderHash#clear` clears the name mapping as well. ([@raxoft](https://github.com/raxoft))
- Support for passing `nil` `Rack::Files.new`, which notably fixes Rails' current `ActiveStorage::FileServer` implementation. ([@ioquatix])

### Documentation

- CHANGELOG updates. ([@aupajo](https://github.com/aupajo))
- Added [CONTRIBUTING](CONTRIBUTING.md). ([@dblock](https://github.com/dblock))

## [2.0.9] - 2020-02-08

- Handle case where session id key is requested but missing ([@jeremyevans])
- Restore support for code relying on `SessionId#to_s`. ([@jeremyevans])
- Add support for `SameSite=None` cookie value. ([@hennikul](https://github.com/hennikul))

## [2.1.2] - 2020-01-27

- Fix multipart parser for some files to prevent denial of service ([@aiomaster](https://github.com/aiomaster))
- Fix `Rack::Builder#use` with keyword arguments ([@kamipo](https://github.com/kamipo))
- Skip deflating in Rack::Deflater if Content-Length is 0 ([@jeremyevans])
- Remove `SessionHash#transform_keys`, no longer needed ([@pavel](https://github.com/pavel))
- Add to_hash to wrap Hash and Session classes ([@oleh-demyanyuk](https://github.com/oleh-demyanyuk))
- Handle case where session id key is requested but missing ([@jeremyevans])

## [2.1.1] - 2020-01-12

- Remove `Rack::Chunked` from `Rack::Server` default middleware. ([#1475](https://github.com/rack/rack/pull/1475), [@ioquatix])
- Restore support for code relying on `SessionId#to_s`. ([@jeremyevans])

## [2.1.0] - 2020-01-10

### Added

- Add support for `SameSite=None` cookie value. ([@hennikul](https://github.com/hennikul))
- Add trailer headers. ([@eileencodes](https://github.com/eileencodes))
- Add MIME Types for video streaming. ([@styd](https://github.com/styd))
- Add MIME Type for WASM. ([@buildrtech](https://github.com/buildrtech))
- Add `Early Hints(103)` to status codes. ([@egtra](https://github.com/egtra))
- Add `Too Early(425)` to status codes. ([@y-yagi]((https://github.com/y-yagi)))
- Add `Bandwidth Limit Exceeded(509)` to status codes. ([@CJKinni](https://github.com/CJKinni))
- Add method for custom `ip_filter`. ([@svcastaneda](https://github.com/svcastaneda))
- Add boot-time profiling capabilities to `rackup`. ([@tenderlove](https://github.com/tenderlove))
- Add multi mapping support for `X-Accel-Mappings` header. ([@yoshuki](https://github.com/yoshuki))
- Add `sync: false` option to `Rack::Deflater`. (Eric Wong)
- Add `Builder#freeze_app` to freeze application and all middleware instances. ([@jeremyevans])
- Add API to extract cookies from `Rack::MockResponse`. ([@petercline](https://github.com/petercline))

### Changed

- Don't propagate nil values from middleware. ([@ioquatix])
- Lazily initialize the response body and only buffer it if required. ([@ioquatix])
- Fix deflater zlib buffer errors on empty body part. ([@felixbuenemann](https://github.com/felixbuenemann))
- Set `X-Accel-Redirect` to percent-encoded path. ([@diskkid](https://github.com/diskkid))
- Remove unnecessary buffer growing when parsing multipart. ([@tainoe](https://github.com/tainoe))
- Expand the root path in `Rack::Static` upon initialization. ([@rosenfeld](https://github.com/rosenfeld))
- Make `ShowExceptions` work with binary data. ([@axyjo](https://github.com/axyjo))
- Use buffer string when parsing multipart requests. ([@janko-m](https://github.com/janko-m))
- Support optional UTF-8 Byte Order Mark (BOM) in config.ru. ([@mikegee](https://github.com/mikegee))
- Handle `X-Forwarded-For` with optional port. ([@dpritchett](https://github.com/dpritchett))
- Use `Time#httpdate` format for Expires, as proposed by RFC 7231. ([@nanaya](https://github.com/nanaya))
- Make `Utils.status_code` raise an error when the status symbol is invalid instead of `500`. ([@adambutler](https://github.com/adambutler))
- Rename `Request::SCHEME_WHITELIST` to `Request::ALLOWED_SCHEMES`.
- Make `Multipart::Parser.get_filename` accept files with `+` in their name. ([@lucaskanashiro](https://github.com/lucaskanashiro))
- Add Falcon to the default handler fallbacks. ([@ioquatix])
- Update codebase to avoid string mutations in preparation for `frozen_string_literals`. ([@pat](https://github.com/pat))
- Change `MockRequest#env_for` to rely on the input optionally responding to `#size` instead of `#length`. ([@janko](https://github.com/janko))
- Rename `Rack::File` -> `Rack::Files` and add deprecation notice. ([@postmodern](https://github.com/postmodern))
- Prefer Base64 “strict encoding” for Base64 cookies. ([@ioquatix])

### Removed

- BREAKING CHANGE: Remove `to_ary` from Response ([@tenderlove](https://github.com/tenderlove))
- Deprecate `Rack::Session::Memcache` in favor of `Rack::Session::Dalli` from dalli gem ([@fatkodima](https://github.com/fatkodima))

### Fixed

- Eliminate warnings for Ruby 2.7. ([@osamtimizer](https://github.com/osamtimizer]))

### Documentation

- Update broken example in `Session::Abstract::ID` documentation. ([tonytonyjan](https://github.com/tonytonyjan))
- Add Padrino to the list of frameworks implementing Rack. ([@wikimatze](https://github.com/wikimatze))
- Remove Mongrel from the suggested server options in the help output. ([@tricknotes](https://github.com/tricknotes))
- Replace `HISTORY.md` and `NEWS.md` with `CHANGELOG.md`. ([@twitnithegirl](https://github.com/twitnithegirl))
- CHANGELOG updates. ([@drenmi](https://github.com/Drenmi), [@p8](https://github.com/p8))

## [2.0.8] - 2019-12-08

### Security

- [[CVE-2019-16782](https://nvd.nist.gov/vuln/detail/CVE-2019-16782)] Prevent timing attacks targeted at session ID lookup. BREAKING CHANGE: Session ID is now a SessionId instance instead of a String. ([@tenderlove](https://github.com/tenderlove), [@rafaelfranca](https://github.com/rafaelfranca))

## [1.6.12] - 2019-12-08

### Security

- [[CVE-2019-16782](https://nvd.nist.gov/vuln/detail/CVE-2019-16782)] Prevent timing attacks targeted at session ID lookup. BREAKING CHANGE: Session ID is now a SessionId instance instead of a String. ([@tenderlove](https://github.com/tenderlove), [@rafaelfranca](https://github.com/rafaelfranca))

## [2.0.7] - 2019-04-02

### Fixed

- Remove calls to `#eof?` on Rack input in `Multipart::Parser`, as this breaks the specification. ([@matthewd](https://github.com/matthewd))
- Preserve forwarded IP addresses for trusted proxy chains. ([@SamSaffron](https://github.com/SamSaffron))

## [2.0.6] - 2018-11-05

### Fixed

- [[CVE-2018-16470](https://nvd.nist.gov/vuln/detail/CVE-2018-16470)] Reduce buffer size of `Multipart::Parser` to avoid pathological parsing. ([@tenderlove](https://github.com/tenderlove))
- Fix a call to a non-existing method `#accepts_html` in the `ShowExceptions` middleware. ([@tomelm](https://github.com/tomelm))
- [[CVE-2018-16471](https://nvd.nist.gov/vuln/detail/CVE-2018-16471)] Whitelist HTTP and HTTPS schemes in `Request#scheme` to prevent a possible XSS attack. ([@PatrickTulskie](https://github.com/PatrickTulskie))

## [2.0.5] - 2018-04-23

### Fixed

- Record errors originating from invalid UTF8 in `MethodOverride` middleware instead of breaking. ([@mclark](https://github.com/mclark))

## [2.0.4] - 2018-01-31

### Changed

- Ensure the `Lock` middleware passes the original `env` object. ([@lugray](https://github.com/lugray))
- Improve performance of `Multipart::Parser` when uploading large files. ([@tompng](https://github.com/tompng))
- Increase buffer size in `Multipart::Parser` for better performance. ([@jkowens](https://github.com/jkowens))
- Reduce memory usage of `Multipart::Parser` when uploading large files. ([@tompng](https://github.com/tompng))
- Replace ConcurrentRuby dependency with native `Queue`. ([@devmchakan](https://github.com/devmchakan))

### Fixed

- Require the correct digest algorithm in the `ETag` middleware. ([@matthewd](https://github.com/matthewd))

### Documentation

- Update homepage links to use SSL. ([@hugoabonizio](https://github.com/hugoabonizio))

## [2.0.3] - 2017-05-15

### Changed

- Ensure `env` values are ASCII 8-bit encoded. ([@eileencodes](https://github.com/eileencodes))

### Fixed

- Prevent exceptions when a class with mixins inherits from `Session::Abstract::ID`. ([@jnraine](https://github.com/jnraine))

## [2.0.2] - 2017-05-08

### Added

- Allow `Session::Abstract::SessionHash#fetch` to accept a block with a default value. ([@yannvanhalewyn](https://github.com/yannvanhalewyn))
- Add `Builder#freeze_app` to freeze application and all middleware. ([@jeremyevans])

### Changed

- Freeze default session options to avoid accidental mutation. ([@kirs](https://github.com/kirs))
- Detect partial hijack without hash headers. ([@devmchakan](https://github.com/devmchakan))
- Update tests to use MiniTest 6 matchers. ([@tonytonyjan](https://github.com/tonytonyjan))
- Allow 205 Reset Content responses to set a Content-Length, as RFC 7231 proposes setting this to 0. ([@devmchakan](https://github.com/devmchakan))

### Fixed

- Handle `NULL` bytes in multipart filenames. ([@casperisfine](https://github.com/casperisfine))
- Remove warnings due to miscapitalized global. ([@ioquatix])
- Prevent exceptions caused by a race condition on multi-threaded servers. ([@sophiedeziel](https://github.com/sophiedeziel))
- Add RDoc as an explicit dependency for `doc` group. ([@tonytonyjan](https://github.com/tonytonyjan))
- Record errors originating from `Multipart::Parser` in the `MethodOverride` middleware instead of letting them bubble up. ([@carlzulauf](https://github.com/carlzulauf))
- Remove remaining use of removed `Utils#bytesize` method from the `File` middleware. ([@brauliomartinezlm](https://github.com/brauliomartinezlm))

### Removed

- Remove `deflate` encoding support to reduce caching overhead. ([@devmchakan](https://github.com/devmchakan))

### Documentation

- Update broken example in `Deflater` documentation. ([@mwpastore](https://github.com/mwpastore))

## [2.0.1] - 2016-06-30

### Changed

- Remove JSON as an explicit dependency. ([@mperham](https://github.com/mperham))


# History/News Archive
Items below this line are from the previously maintained HISTORY.md and NEWS.md files.

## [2.0.0.rc1] 2016-05-06
- Rack::Session::Abstract::ID is deprecated. Please change to use Rack::Session::Abstract::Persisted

## [2.0.0.alpha] 2015-12-04
- First-party "SameSite" cookies. Browsers omit SameSite cookies from third-party requests, closing the door on many CSRF attacks.
- Pass `same_site: true` (or `:strict`) to enable: response.set_cookie 'foo', value: 'bar', same_site: true or `same_site: :lax` to use Lax enforcement: response.set_cookie 'foo', value: 'bar', same_site: :lax
- Based on version 7 of the Same-site Cookies internet draft:
	https://tools.ietf.org/html/draft-west-first-party-cookies-07
- Thanks to Ben Toews (@mastahyeti) and Bob Long (@bobjflong) for updating to drafts 5 and 7.
- Add `Rack::Events` middleware for adding event based middleware: middleware that does not care about the response body, but only cares about doing work at particular points in the request / response lifecycle.
- Add `Rack::Request#authority` to calculate the authority under which the response is being made (this will be handy for h2 pushes).
- Add `Rack::Response::Helpers#cache_control` and `cache_control=`. Use this for setting cache control headers on your response objects.
- Add `Rack::Response::Helpers#etag` and `etag=`.  Use this for setting etag values on the response.
- Introduce `Rack::Response::Helpers#add_header` to add a value to a multi-valued response header. Implemented in terms of other `Response#*_header` methods, so it's available to any response-like class that includes the `Helpers` module.
- Add `Rack::Request#add_header` to match.
- `Rack::Session::Abstract::ID` IS DEPRECATED.  Please switch to `Rack::Session::Abstract::Persisted`. `Rack::Session::Abstract::Persisted` uses a request object rather than the `env` hash.
- Pull `ENV` access inside the request object in to a module.  This will help with legacy Request objects that are ENV based but don't want to inherit from Rack::Request
- Move most methods on the `Rack::Request` to a module `Rack::Request::Helpers` and use public API to get values from the request object.  This enables users to mix `Rack::Request::Helpers` in to their own objects so they can implement `(get|set|fetch|each)_header` as they see fit (for example a proxy object).
- Files and directories with + in the name are served correctly. Rather than unescaping paths like a form, we unescape with a URI parser using `Rack::Utils.unescape_path`. Fixes #265
- Tempfiles are automatically closed in the case that there were too
	many posted.
- Added methods for manipulating response headers that don't assume
	they're stored as a Hash. Response-like classes may include the
	Rack::Response::Helpers module if they define these methods:
    - Rack::Response#has_header?
	- Rack::Response#get_header
	- Rack::Response#set_header
	- Rack::Response#delete_header
- Introduce Util.get_byte_ranges that will parse the value of the HTTP_RANGE string passed to it without depending on the `env` hash. `byte_ranges` is deprecated in favor of this method.
- Change Session internals to use Request objects for looking up session information. This allows us to only allocate one request object when dealing with session objects (rather than doing it every time we need to manipulate cookies, etc).
- Add `Rack::Request#initialize_copy` so that the env is duped when the request gets duped.
- Added methods for manipulating request specific data.  This includes
	data set as CGI parameters, and just any arbitrary data the user wants
	to associate with a particular request.  New methods:
	 - Rack::Request#has_header?
	 - Rack::Request#get_header
	 - Rack::Request#fetch_header
	 - Rack::Request#each_header
	 - Rack::Request#set_header
	 - Rack::Request#delete_header
- lib/rack/utils.rb: add a method for constructing "delete" cookie
	headers.  This allows us to construct cookie headers without depending
	on the side effects of mutating a hash.
- Prevent extremely deep parameters from being parsed. CVE-2015-3225

## [1.6.1] 2015-05-06
  - Fix CVE-2014-9490, denial of service attack in OkJson
  - Use a monotonic time for Rack::Runtime, if available
  - RACK_MULTIPART_LIMIT changed to RACK_MULTIPART_PART_LIMIT (RACK_MULTIPART_LIMIT is deprecated and will be removed in 1.7.0)

## [1.5.3] 2015-05-06
  - Fix CVE-2014-9490, denial of service attack in OkJson
  - Backport bug fixes to 1.5 series

## [1.6.0] 2014-01-18
  - Response#unauthorized? helper
  - Deflater now accepts an options hash to control compression on a per-request level
  - Builder#warmup method for app preloading
  - Request#accept_language method to extract HTTP_ACCEPT_LANGUAGE
  - Add quiet mode of rack server, rackup --quiet
  - Update HTTP Status Codes to RFC 7231
  - Less strict header name validation according to RFC 2616
  - SPEC updated to specify headers conform to RFC7230 specification
  - Etag correctly marks etags as weak
  - Request#port supports multiple x-http-forwarded-proto values
  - Utils#multipart_part_limit configures the maximum number of parts a request can contain
  - Default host to localhost when in development mode
  - Various bugfixes and performance improvements

## [1.5.2] 2013-02-07
  - Fix CVE-2013-0263, timing attack against Rack::Session::Cookie
  - Fix CVE-2013-0262, symlink path traversal in Rack::File
  - Add various methods to Session for enhanced Rails compatibility
  - Request#trusted_proxy? now only matches whole strings
  - Add JSON cookie coder, to be default in Rack 1.6+ due to security concerns
  - URLMap host matching in environments that don't set the Host header fixed
  - Fix a race condition that could result in overwritten pidfiles
  - Various documentation additions

## [1.4.5] 2013-02-07
  - Fix CVE-2013-0263, timing attack against Rack::Session::Cookie
  - Fix CVE-2013-0262, symlink path traversal in Rack::File

## [1.1.6, 1.2.8, 1.3.10] 2013-02-07
  - Fix CVE-2013-0263, timing attack against Rack::Session::Cookie

## [1.5.1] 2013-01-28
  - Rack::Lint check_hijack now conforms to other parts of SPEC
  - Added hash-like methods to Abstract::ID::SessionHash for compatibility
  - Various documentation corrections

## [1.5.0] 2013-01-21
  - Introduced hijack SPEC, for before-response and after-response hijacking
  - SessionHash is no longer a Hash subclass
  - Rack::File cache_control parameter is removed, in place of headers options
  - Rack::Auth::AbstractRequest#scheme now yields strings, not symbols
  - Rack::Utils cookie functions now format expires in RFC 2822 format
  - Rack::File now has a default mime type
  - rackup -b 'run Rack::Files.new(".")', option provides command line configs
  - Rack::Deflater will no longer double encode bodies
  - Rack::Mime#match? provides convenience for Accept header matching
  - Rack::Utils#q_values provides splitting for Accept headers
  - Rack::Utils#best_q_match provides a helper for Accept headers
  - Rack::Handler.pick provides convenience for finding available servers
  - Puma added to the list of default servers (preferred over Webrick)
  - Various middleware now correctly close body when replacing it
  - Rack::Request#params is no longer persistent with only GET params
  - Rack::Request#update_param and #delete_param provide persistent operations
  - Rack::Request#trusted_proxy? now returns true for local unix sockets
  - Rack::Response no longer forces Content-Types
  - Rack::Sendfile provides local mapping configuration options
  - Rack::Utils#rfc2109 provides old netscape style time output
  - Updated HTTP status codes
  - Ruby 1.8.6 likely no longer passes tests, and is no longer fully supported

## [1.4.4, 1.3.9, 1.2.7, 1.1.5] 2013-01-13
  - [SEC] Rack::Auth::AbstractRequest no longer symbolizes arbitrary strings
  - Fixed erroneous test case in the 1.3.x series

## [1.4.3] 2013-01-07
  - Security: Prevent unbounded reads in large multipart boundaries

## [1.3.8] 2013-01-07
  - Security: Prevent unbounded reads in large multipart boundaries

## [1.4.2] 2013-01-06
  - Add warnings when users do not provide a session secret
  - Fix parsing performance for unquoted filenames
  - Updated URI backports
  - Fix URI backport version matching, and silence constant warnings
  - Correct parameter parsing with empty values
  - Correct rackup '-I' flag, to allow multiple uses
  - Correct rackup pidfile handling
  - Report rackup line numbers correctly
  - Fix request loops caused by non-stale nonces with time limits
  - Fix reloader on Windows
  - Prevent infinite recursions from Response#to_ary
  - Various middleware better conforms to the body close specification
  - Updated language for the body close specification
  - Additional notes regarding ECMA escape compatibility issues
  - Fix the parsing of multiple ranges in range headers
  - Prevent errors from empty parameter keys
  - Added PATCH verb to Rack::Request
  - Various documentation updates
  - Fix session merge semantics (fixes rack-test)
  - Rack::Static :index can now handle multiple directories
  - All tests now utilize Rack::Lint (special thanks to Lars Gierth)
  - Rack::File cache_control parameter is now deprecated, and removed by 1.5
  - Correct Rack::Directory script name escaping
  - Rack::Static supports header rules for sophisticated configurations
  - Multipart parsing now works without a Content-Length header
  - New logos courtesy of Zachary Scott!
  - Rack::BodyProxy now explicitly defines #each, useful for C extensions
  - Cookies that are not URI escaped no longer cause exceptions

## [1.3.7] 2013-01-06
  - Add warnings when users do not provide a session secret
  - Fix parsing performance for unquoted filenames
  - Updated URI backports
  - Fix URI backport version matching, and silence constant warnings
  - Correct parameter parsing with empty values
  - Correct rackup '-I' flag, to allow multiple uses
  - Correct rackup pidfile handling
  - Report rackup line numbers correctly
  - Fix request loops caused by non-stale nonces with time limits
  - Fix reloader on Windows
  - Prevent infinite recursions from Response#to_ary
  - Various middleware better conforms to the body close specification
  - Updated language for the body close specification
  - Additional notes regarding ECMA escape compatibility issues
  - Fix the parsing of multiple ranges in range headers

## [1.2.6] 2013-01-06
  - Add warnings when users do not provide a session secret
  - Fix parsing performance for unquoted filenames

## [1.1.4] 2013-01-06
  - Add warnings when users do not provide a session secret

## [1.4.1] 2012-01-22
  - Alter the keyspace limit calculations to reduce issues with nested params
  - Add a workaround for multipart parsing where files contain unescaped "%"
  - Added Rack::Response::Helpers#method_not_allowed? (code 405)
  - Rack::File now returns 404 for illegal directory traversals
  - Rack::File now returns 405 for illegal methods (non HEAD/GET)
  - Rack::Cascade now catches 405 by default, as well as 404
  - Cookies missing '--' no longer cause an exception to be raised
  - Various style changes and documentation spelling errors
  - Rack::BodyProxy always ensures to execute its block
  - Additional test coverage around cookies and secrets
  - Rack::Session::Cookie can now be supplied either secret or old_secret
  - Tests are no longer dependent on set order
  - Rack::Static no longer defaults to serving index files
  - Rack.release was fixed

## [1.4.0] 2011-12-28
  - Ruby 1.8.6 support has officially been dropped. Not all tests pass.
  - Raise sane error messages for broken config.ru
  - Allow combining run and map in a config.ru
  - Rack::ContentType will not set Content-Type for responses without a body
  - Status code 205 does not send a response body
  - Rack::Response::Helpers will not rely on instance variables
  - Rack::Utils.build_query no longer outputs '=' for nil query values
  - Various mime types added
  - Rack::MockRequest now supports HEAD
  - Rack::Directory now supports files that contain RFC3986 reserved chars
  - Rack::File now only supports GET and HEAD requests
  - Rack::Server#start now passes the block to Rack::Handler::<h>#run
  - Rack::Static now supports an index option
  - Added the Teapot status code
  - rackup now defaults to Thin instead of Mongrel (if installed)
  - Support added for HTTP_X_FORWARDED_SCHEME
  - Numerous bug fixes, including many fixes for new and alternate rubies

## [1.1.3] 2011-12-28
  - Security fix. http://www.ocert.org/advisories/ocert-2011-003.html
    Further information here: http://jruby.org/2011/12/27/jruby-1-6-5-1

## [1.3.5] 2011-10-17
  - Fix annoying warnings caused by the backport in 1.3.4

## [1.3.4] 2011-10-01
  - Backport security fix from 1.9.3, also fixes some roundtrip issues in URI
  - Small documentation update
  - Fix an issue where BodyProxy could cause an infinite recursion
  - Add some supporting files for travis-ci

## [1.2.4] 2011-09-16
  - Fix a bug with MRI regex engine to prevent XSS by malformed unicode

## [1.3.3] 2011-09-16
  - Fix bug with broken query parameters in Rack::ShowExceptions
  - Rack::Request#cookies no longer swallows exceptions on broken input
  - Prevents XSS attacks enabled by bug in Ruby 1.8's regexp engine
  - Rack::ConditionalGet handles broken If-Modified-Since helpers

## [1.3.2] 2011-07-16
  - Fix for Rails and rack-test, Rack::Utils#escape calls to_s

## [1.3.1] 2011-07-13
  - Fix 1.9.1 support
  - Fix JRuby support
  - Properly handle $KCODE in Rack::Utils.escape
  - Make method_missing/respond_to behavior consistent for Rack::Lock,
    Rack::Auth::Digest::Request and Rack::Multipart::UploadedFile
  - Reenable passing rack.session to session middleware
  - Rack::CommonLogger handles streaming responses correctly
  - Rack::MockResponse calls close on the body object
  - Fix a DOS vector from MRI stdlib backport

## [1.2.3] 2011-05-22
  - Pulled in relevant bug fixes from 1.3
  - Fixed 1.8.6 support

## [1.3.0] 2011-05-22
  - Various performance optimizations
  - Various multipart fixes
  - Various multipart refactors
  - Infinite loop fix for multipart
  - Test coverage for Rack::Server returns
  - Allow files with '..', but not path components that are '..'
  - rackup accepts handler-specific options on the command line
  - Request#params no longer merges POST into GET (but returns the same)
  - Use URI.encode_www_form_component instead. Use core methods for escaping.
  - Allow multi-line comments in the config file
  - Bug L#94 reported by Nikolai Lugovoi, query parameter unescaping.
  - Rack::Response now deletes Content-Length when appropriate
  - Rack::Deflater now supports streaming
  - Improved Rack::Handler loading and searching
  - Support for the PATCH verb
  - env['rack.session.options'] now contains session options
  - Cookies respect renew
  - Session middleware uses SecureRandom.hex

## [1.2.2, 1.1.2] 2011-03-13
  - Security fix in Rack::Auth::Digest::MD5: when authenticator
    returned nil, permission was granted on empty password.

## [1.2.1] 2010-06-15
  - Make CGI handler rewindable
  - Rename spec/ to test/ to not conflict with SPEC on lesser
    operating systems

## [1.2.0] 2010-06-13
  - Removed Camping adapter: Camping 2.0 supports Rack as-is
  - Removed parsing of quoted values
  - Add Request.trace? and Request.options?
  - Add mime-type for .webm and .htc
  - Fix HTTP_X_FORWARDED_FOR
  - Various multipart fixes
  - Switch test suite to bacon

## [1.1.0] 2010-01-03
  - Moved Auth::OpenID to rack-contrib.
  - SPEC change that relaxes Lint slightly to allow subclasses of the
    required types
  - SPEC change to document rack.input binary mode in greater detail
  - SPEC define optional rack.logger specification
  - File servers support X-Cascade header
  - Imported Config middleware
  - Imported ETag middleware
  - Imported Runtime middleware
  - Imported Sendfile middleware
  - New Logger and NullLogger middlewares
  - Added mime type for .ogv and .manifest.
  - Don't squeeze PATH_INFO slashes
  - Use Content-Type to determine POST params parsing
  - Update Rack::Utils::HTTP_STATUS_CODES hash
  - Add status code lookup utility
  - Response should call #to_i on the status
  - Add Request#user_agent
  - Request#host knows about forwarded host
  - Return an empty string for Request#host if HTTP_HOST and
    SERVER_NAME are both missing
  - Allow MockRequest to accept hash params
  - Optimizations to HeaderHash
  - Refactored rackup into Rack::Server
  - Added Utils.build_nested_query to complement Utils.parse_nested_query
  - Added Utils::Multipart.build_multipart to complement
    Utils::Multipart.parse_multipart
  - Extracted set and delete cookie helpers into Utils so they can be
    used outside Response
  - Extract parse_query and parse_multipart in Request so subclasses
    can change their behavior
  - Enforce binary encoding in RewindableInput
  - Set correct external_encoding for handlers that don't use RewindableInput

## [1.0.1] 2009-10-18
  - Bump remainder of rack.versions.
  - Support the pure Ruby FCGI implementation.
  - Fix for form names containing "=": split first then unescape components
  - Fixes the handling of the filename parameter with semicolons in names.
  - Add anchor to nested params parsing regexp to prevent stack overflows
  - Use more compatible gzip write api instead of "<<".
  - Make sure that Reloader doesn't break when executed via ruby -e
  - Make sure WEBrick respects the :Host option
  - Many Ruby 1.9 fixes.

## [1.0.0] 2009-04-25
  - SPEC change: Rack::VERSION has been pushed to [1,0].
  - SPEC change: header values must be Strings now, split on "\n".
  - SPEC change: Content-Length can be missing, in this case chunked transfer
    encoding is used.
  - SPEC change: rack.input must be rewindable and support reading into
    a buffer, wrap with Rack::RewindableInput if it isn't.
  - SPEC change: rack.session is now specified.
  - SPEC change: Bodies can now additionally respond to #to_path with
    a filename to be served.
  - NOTE: String bodies break in 1.9, use an Array consisting of a
    single String instead.
  - New middleware Rack::Lock.
  - New middleware Rack::ContentType.
  - Rack::Reloader has been rewritten.
  - Major update to Rack::Auth::OpenID.
  - Support for nested parameter parsing in Rack::Response.
  - Support for redirects in Rack::Response.
  - HttpOnly cookie support in Rack::Response.
  - The Rakefile has been rewritten.
  - Many bugfixes and small improvements.

## [0.9.1] 2009-01-09
  - Fix directory traversal exploits in Rack::File and Rack::Directory.

## [0.9] 2009-01-06
  - Rack is now managed by the Rack Core Team.
  - Rack::Lint is stricter and follows the HTTP RFCs more closely.
  - Added ConditionalGet middleware.
  - Added ContentLength middleware.
  - Added Deflater middleware.
  - Added Head middleware.
  - Added MethodOverride middleware.
  - Rack::Mime now provides popular MIME-types and their extension.
  - Mongrel Header now streams.
  - Added Thin handler.
  - Official support for swiftiplied Mongrel.
  - Secure cookies.
  - Made HeaderHash case-preserving.
  - Many bugfixes and small improvements.

## [0.4] 2008-08-21
  - New middleware, Rack::Deflater, by Christoffer Sawicki.
  - OpenID authentication now needs ruby-openid 2.
  - New Memcache sessions, by blink.
  - Explicit EventedMongrel handler, by Joshua Peek <josh@joshpeek.com>
  - Rack::Reloader is not loaded in rackup development mode.
  - rackup can daemonize with -D.
  - Many bugfixes, especially for pool sessions, URLMap, thread safety
    and tempfile handling.
  - Improved tests.
  - Rack moved to Git.

## [0.3] 2008-02-26
  - LiteSpeed handler, by Adrian Madrid.
  - SCGI handler, by Jeremy Evans.
  - Pool sessions, by blink.
  - OpenID authentication, by blink.
  - :Port and :File options for opening FastCGI sockets, by blink.
  - Last-Modified HTTP header for Rack::File, by blink.
  - Rack::Builder#use now accepts blocks, by Corey Jewett.
    (See example/protectedlobster.ru)
  - HTTP status 201 can contain a Content-Type and a body now.
  - Many bugfixes, especially related to Cookie handling.

## [0.2] 2007-05-16
  - HTTP Basic authentication.
  - Cookie Sessions.
  - Static file handler.
  - Improved Rack::Request.
  - Improved Rack::Response.
  - Added Rack::ShowStatus, for better default error messages.
  - Bug fixes in the Camping adapter.
  - Removed Rails adapter, was too alpha.

## [0.1] 2007-03-03

[@ioquatix]: https://github.com/ioquatix "Samuel Williams"
[@jeremyevans]: https://github.com/jeremyevans "Jeremy Evans"
[@amatsuda]: https://github.com/amatsuda "Akira Matsuda"
[@wjordan]: https://github.com/wjordan "Will Jordan"
[@BlakeWilliams]: https://github.com/BlakeWilliams "Blake Williams"
PK}$[�tz��,�,gems/gems/rack-3.0.8/README.mdnu�[���# ![Rack](contrib/logo.webp)

> **_NOTE:_** Rack v3.0.0 was recently released. Please check the [Upgrade
> Guide](UPGRADE-GUIDE.md) for more details about migrating your existing
> servers, middlewares and applications. For detailed information on specific
> changes, check the [Change Log](CHANGELOG.md).

Rack provides a minimal, modular, and adaptable interface for developing web
applications in Ruby. By wrapping HTTP requests and responses in the simplest
way possible, it unifies and distills the bridge between web servers, web
frameworks, and web application into a single method call.

The exact details of this are described in the [Rack Specification], which all
Rack applications should conform to.

## Installation

Add the rack gem to your application bundle, or follow the instructions provided
by a [supported web framework](#supported-web-frameworks):

```bash
# Install it generally:
$ gem install rack --pre

# or, add it to your current application gemfile:
$ bundle add rack --version 3.0.0
```

If you need features from `Rack::Session` or `bin/rackup` please add those gems separately.

```bash
$ gem install rack-session rackup
```

## Usage

Create a file called `config.ru` with the following contents:

```ruby
run do |env|
  [200, {}, ["Hello World"]]
end
```

Run this using the rackup gem or another [supported web
server](#supported-web-servers).

```bash
$ gem install rackup
$ rackup
$ curl http://localhost:9292
Hello World
```

## Supported web servers

Rack is supported by a wide range of servers, including:

* [Agoo](https://github.com/ohler55/agoo)
* [Falcon](https://github.com/socketry/falcon) **(Rack 3 Compatible)**
* [Iodine](https://github.com/boazsegev/iodine)
* [NGINX Unit](https://unit.nginx.org/)
* [Phusion Passenger](https://www.phusionpassenger.com/) (which is mod_rack for
  Apache and for nginx)
* [Puma](https://puma.io/)
* [Thin](https://github.com/macournoyer/thin)
* [Unicorn](https://yhbt.net/unicorn/)
* [uWSGI](https://uwsgi-docs.readthedocs.io/en/latest/)
* [Lamby](https://lamby.custominktech.com) (for AWS Lambda)

You will need to consult the server documentation to find out what features and
limitations they may have. In general, any valid Rack app will run the same on
all these servers, without changing anything.

### Rackup

Rack provides a separate gem, [rackup](https://github.com/rack/rackup) which is
a generic interface for running a Rack application on supported servers, which
include `WEBRick`, `Puma`, `Falcon` and others.

## Supported web frameworks

These frameworks and many others support the [Rack Specification]:

* [Camping](https://github.com/camping/camping)
* [Hanami](https://hanamirb.org/)
* [Padrino](https://padrinorb.com/)
* [Roda](https://github.com/jeremyevans/roda) **(Rack 3 Compatible)**
* [Ruby on Rails](https://rubyonrails.org/)
* [Sinatra](https://sinatrarb.com/)
* [Utopia](https://github.com/socketry/utopia) **(Rack 3 Compatible)**
* [WABuR](https://github.com/ohler55/wabur)

### Older (possibly unsupported) web frameworks

* [Ramaze](http://ramaze.net/)
* [Rum](https://github.com/leahneukirchen/rum)

## Available middleware shipped with Rack

Between the server and the framework, Rack can be customized to your
applications needs using middleware. Rack itself ships with the following
middleware:

* `Rack::CommonLogger` for creating Apache-style logfiles.
* `Rack::ConditionalGet` for returning [Not
  Modified](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/304)
  responses when the response has not changed.
* `Rack::Config` for modifying the environment before processing the request.
* `Rack::ContentLength` for setting a `content-length` header based on body
  size.
* `Rack::ContentType` for setting a default `content-type` header for responses.
* `Rack::Deflater` for compressing responses with gzip.
* `Rack::ETag` for setting `etag` header on bodies that can be buffered.
* `Rack::Events` for providing easy hooks when a request is received and when
  the response is sent.
* `Rack::Files` for serving static files.
* `Rack::Head` for returning an empty body for HEAD requests.
* `Rack::Lint` for checking conformance to the [Rack Specification].
* `Rack::Lock` for serializing requests using a mutex.
* `Rack::Logger` for setting a logger to handle logging errors.
* `Rack::MethodOverride` for modifying the request method based on a submitted
  parameter.
* `Rack::Recursive` for including data from other paths in the application, and
  for performing internal redirects.
* `Rack::Reloader` for reloading files if they have been modified.
* `Rack::Runtime` for including a response header with the time taken to process
  the request.
* `Rack::Sendfile` for working with web servers that can use optimized file
  serving for file system paths.
* `Rack::ShowException` for catching unhandled exceptions and presenting them in
  a nice and helpful way with clickable backtrace.
* `Rack::ShowStatus` for using nice error pages for empty client error
  responses.
* `Rack::Static` for more configurable serving of static files.
* `Rack::TempfileReaper` for removing temporary files creating during a request.

All these components use the same interface, which is described in detail in the
[Rack Specification]. These optional components can be used in any way you wish.

### Convenience interfaces

If you want to develop outside of existing frameworks, implement your own ones,
or develop middleware, Rack provides many helpers to create Rack applications
quickly and without doing the same web stuff all over:

* `Rack::Request` which also provides query string parsing and multipart
  handling.
* `Rack::Response` for convenient generation of HTTP replies and cookie
  handling.
* `Rack::MockRequest` and `Rack::MockResponse` for efficient and quick testing
  of Rack application without real HTTP round-trips.
* `Rack::Cascade` for trying additional Rack applications if an application
  returns a not found or method not supported response.
* `Rack::Directory` for serving files under a given directory, with directory
  indexes.
* `Rack::MediaType` for parsing content-type headers.
* `Rack::Mime` for determining content-type based on file extension.
* `Rack::RewindableInput` for making any IO object rewindable, using a temporary
  file buffer.
* `Rack::URLMap` to route to multiple applications inside the same process.

## Configuration

Rack exposes several configuration parameters to control various features of the
implementation.

### `param_depth_limit`

```ruby
Rack::Utils.param_depth_limit = 32 # default
```

The maximum amount of nesting allowed in parameters. For example, if set to 3,
this query string would be allowed:

```
?a[b][c]=d
```

but this query string would not be allowed:

```
?a[b][c][d]=e
```

Limiting the depth prevents a possible stack overflow when parsing parameters.

### `multipart_file_limit`

```ruby
Rack::Utils.multipart_file_limit = 128 # default
```

The maximum number of parts with a filename a request can contain. Accepting
too many parts can lead to the server running out of file handles.

The default is 128, which means that a single request can't upload more than 128
files at once. Set to 0 for no limit.

Can also be set via the `RACK_MULTIPART_FILE_LIMIT` environment variable.

(This is also aliased as `multipart_part_limit` and `RACK_MULTIPART_PART_LIMIT` for compatibility)


### `multipart_total_part_limit`

The maximum total number of parts a request can contain of any type, including
both file and non-file form fields.

The default is 4096, which means that a single request can't contain more than
4096 parts.

Set to 0 for no limit.

Can also be set via the `RACK_MULTIPART_TOTAL_PART_LIMIT` environment variable.


## Changelog

See [CHANGELOG.md](CHANGELOG.md).

## Contributing

See [CONTRIBUTING.md](CONTRIBUTING.md) for specific details about how to make a
contribution to Rack.

Please post bugs, suggestions and patches to [GitHub
Issues](https://github.com/rack/rack/issues).

Please check our [Security Policy](https://github.com/rack/rack/security/policy)
for responsible disclosure and security bug reporting process. Due to wide usage
of the library, it is strongly preferred that we manage timing in order to
provide viable patches at the time of disclosure. Your assistance in this matter
is greatly appreciated.

## See Also

### `rack-contrib`

The plethora of useful middleware created the need for a project that collects
fresh Rack middleware. `rack-contrib` includes a variety of add-on components
for Rack and it is easy to contribute new modules.

* https://github.com/rack/rack-contrib

### `rack-session`

Provides convenient session management for Rack.

* https://github.com/rack/rack-session

## Thanks

The Rack Core Team, consisting of

* Aaron Patterson [tenderlove](https://github.com/tenderlove)
* Samuel Williams [ioquatix](https://github.com/ioquatix)
* Jeremy Evans [jeremyevans](https://github.com/jeremyevans)
* Eileen Uchitelle [eileencodes](https://github.com/eileencodes)
* Matthew Draper [matthewd](https://github.com/matthewd)
* Rafael França [rafaelfranca](https://github.com/rafaelfranca)

and the Rack Alumni

* Ryan Tomayko [rtomayko](https://github.com/rtomayko)
* Scytrin dai Kinthra [scytrin](https://github.com/scytrin)
* Leah Neukirchen [leahneukirchen](https://github.com/leahneukirchen)
* James Tucker [raggi](https://github.com/raggi)
* Josh Peek [josh](https://github.com/josh)
* José Valim [josevalim](https://github.com/josevalim)
* Michael Fellinger [manveru](https://github.com/manveru)
* Santiago Pastorino [spastorino](https://github.com/spastorino)
* Konstantin Haase [rkh](https://github.com/rkh)

would like to thank:

* Adrian Madrid, for the LiteSpeed handler.
* Christoffer Sawicki, for the first Rails adapter and `Rack::Deflater`.
* Tim Fletcher, for the HTTP authentication code.
* Luc Heinrich for the Cookie sessions, the static file handler and bugfixes.
* Armin Ronacher, for the logo and racktools.
* Alex Beregszaszi, Alexander Kahn, Anil Wadghule, Aredridel, Ben Alpert, Dan
  Kubb, Daniel Roethlisberger, Matt Todd, Tom Robinson, Phil Hagelberg, S. Brent
  Faulkner, Bosko Milekic, Daniel Rodríguez Troitiño, Genki Takiuchi, Geoffrey
  Grosenbach, Julien Sanchez, Kamal Fariz Mahyuddin, Masayoshi Takahashi,
  Patrick Aljordm, Mig, Kazuhiro Nishiyama, Jon Bardin, Konstantin Haase, Larry
  Siden, Matias Korhonen, Sam Ruby, Simon Chiang, Tim Connor, Timur Batyrshin,
  and Zach Brock for bug fixing and other improvements.
* Eric Wong, Hongli Lai, Jeremy Kemper for their continuous support and API
  improvements.
* Yehuda Katz and Carl Lerche for refactoring rackup.
* Brian Candler, for `Rack::ContentType`.
* Graham Batty, for improved handler loading.
* Stephen Bannasch, for bug reports and documentation.
* Gary Wright, for proposing a better `Rack::Response` interface.
* Jonathan Buch, for improvements regarding `Rack::Response`.
* Armin Röhrl, for tracking down bugs in the Cookie generator.
* Alexander Kellett for testing the Gem and reviewing the announcement.
* Marcus Rückert, for help with configuring and debugging lighttpd.
* The WSGI team for the well-done and documented work they've done and Rack
  builds up on.
* All bug reporters and patch contributors not mentioned above.

## License

Rack is released under the [MIT License](MIT-LICENSE).

[Rack Specification]: SPEC.rdoc
PK}$[G�	TT gems/gems/rack-3.0.8/MIT-LICENSEnu�[���The MIT License (MIT)

Copyright (C) 2007-2021 Leah Neukirchen <http://leahneukirchen.org/infopage.html>

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 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}$[�um�	�	 gems/gems/rack-3.0.8/lib/rack.rbnu�[���# frozen_string_literal: true

# Copyright (C) 2007-2019 Leah Neukirchen <http://leahneukirchen.org/infopage.html>
#
# Rack is freely distributable under the terms of an MIT-style license.
# See MIT-LICENSE or https://opensource.org/licenses/MIT.

# The Rack main module, serving as a namespace for all core Rack
# modules and classes.
#
# All modules meant for use in your application are <tt>autoload</tt>ed here,
# so it should be enough just to <tt>require 'rack'</tt> in your code.

require_relative 'rack/version'
require_relative 'rack/constants'

module Rack
  autoload :Builder, "rack/builder"
  autoload :BodyProxy, "rack/body_proxy"
  autoload :Cascade, "rack/cascade"
  autoload :Chunked, "rack/chunked"
  autoload :CommonLogger, "rack/common_logger"
  autoload :ConditionalGet, "rack/conditional_get"
  autoload :Config, "rack/config"
  autoload :ContentLength, "rack/content_length"
  autoload :ContentType, "rack/content_type"
  autoload :ETag, "rack/etag"
  autoload :Events, "rack/events"
  autoload :File, "rack/file"
  autoload :Files, "rack/files"
  autoload :Deflater, "rack/deflater"
  autoload :Directory, "rack/directory"
  autoload :ForwardRequest, "rack/recursive"
  autoload :Handler, "rack/handler"
  autoload :Head, "rack/head"
  autoload :Headers, "rack/headers"
  autoload :Lint, "rack/lint"
  autoload :Lock, "rack/lock"
  autoload :Logger, "rack/logger"
  autoload :MediaType, "rack/media_type"
  autoload :MethodOverride, "rack/method_override"
  autoload :Mime, "rack/mime"
  autoload :NullLogger, "rack/null_logger"
  autoload :QueryParser, "rack/query_parser"
  autoload :Recursive, "rack/recursive"
  autoload :Reloader, "rack/reloader"
  autoload :RewindableInput, "rack/rewindable_input"
  autoload :Runtime, "rack/runtime"
  autoload :Sendfile, "rack/sendfile"
  autoload :Server, "rack/server"
  autoload :ShowExceptions, "rack/show_exceptions"
  autoload :ShowStatus, "rack/show_status"
  autoload :Static, "rack/static"
  autoload :TempfileReaper, "rack/tempfile_reaper"
  autoload :URLMap, "rack/urlmap"
  autoload :Utils, "rack/utils"
  autoload :Multipart, "rack/multipart"

  autoload :MockRequest, "rack/mock_request"
  autoload :MockResponse, "rack/mock_response"

  autoload :Request, "rack/request"
  autoload :Response, "rack/response"

  module Auth
    autoload :Basic, "rack/auth/basic"
    autoload :AbstractRequest, "rack/auth/abstract/request"
    autoload :AbstractHandler, "rack/auth/abstract/handler"
    autoload :Digest, "rack/auth/digest"
  end
end
PK}$[�|��&gems/gems/rack-3.0.8/lib/rack/files.rbnu�[���# frozen_string_literal: true

require 'time'

require_relative 'constants'
require_relative 'head'
require_relative 'utils'
require_relative 'request'
require_relative 'mime'

module Rack
  # Rack::Files serves files below the +root+ directory given, according to the
  # path info of the Rack request.
  # e.g. when Rack::Files.new("/etc") is used, you can access 'passwd' file
  # as http://localhost:9292/passwd
  #
  # Handlers can detect if bodies are a Rack::Files, and use mechanisms
  # like sendfile on the +path+.

  class Files
    ALLOWED_VERBS = %w[GET HEAD OPTIONS]
    ALLOW_HEADER = ALLOWED_VERBS.join(', ')
    MULTIPART_BOUNDARY = 'AaB03x'

    attr_reader :root

    def initialize(root, headers = {}, default_mime = 'text/plain')
      @root = (::File.expand_path(root) if root)
      @headers = headers
      @default_mime = default_mime
      @head = Rack::Head.new(lambda { |env| get env })
    end

    def call(env)
      # HEAD requests drop the response body, including 4xx error messages.
      @head.call env
    end

    def get(env)
      request = Rack::Request.new env
      unless ALLOWED_VERBS.include? request.request_method
        return fail(405, "Method Not Allowed", { 'allow' => ALLOW_HEADER })
      end

      path_info = Utils.unescape_path request.path_info
      return fail(400, "Bad Request") unless Utils.valid_path?(path_info)

      clean_path_info = Utils.clean_path_info(path_info)
      path = ::File.join(@root, clean_path_info)

      available = begin
        ::File.file?(path) && ::File.readable?(path)
      rescue SystemCallError
        # Not sure in what conditions this exception can occur, but this
        # is a safe way to handle such an error.
        # :nocov:
        false
        # :nocov:
      end

      if available
        serving(request, path)
      else
        fail(404, "File not found: #{path_info}")
      end
    end

    def serving(request, path)
      if request.options?
        return [200, { 'allow' => ALLOW_HEADER, CONTENT_LENGTH => '0' }, []]
      end
      last_modified = ::File.mtime(path).httpdate
      return [304, {}, []] if request.get_header('HTTP_IF_MODIFIED_SINCE') == last_modified

      headers = { "last-modified" => last_modified }
      mime_type = mime_type path, @default_mime
      headers[CONTENT_TYPE] = mime_type if mime_type

      # Set custom headers
      headers.merge!(@headers) if @headers

      status = 200
      size = filesize path

      ranges = Rack::Utils.get_byte_ranges(request.get_header('HTTP_RANGE'), size)
      if ranges.nil?
        # No ranges:
        ranges = [0..size - 1]
      elsif ranges.empty?
        # Unsatisfiable. Return error, and file size:
        response = fail(416, "Byte range unsatisfiable")
        response[1]["content-range"] = "bytes */#{size}"
        return response
      else
        # Partial content
        partial_content = true

        if ranges.size == 1
          range = ranges[0]
          headers["content-range"] = "bytes #{range.begin}-#{range.end}/#{size}"
        else
          headers[CONTENT_TYPE] = "multipart/byteranges; boundary=#{MULTIPART_BOUNDARY}"
        end

        status = 206
        body = BaseIterator.new(path, ranges, mime_type: mime_type, size: size)
        size = body.bytesize
      end

      headers[CONTENT_LENGTH] = size.to_s

      if request.head?
        body = []
      elsif !partial_content
        body = Iterator.new(path, ranges, mime_type: mime_type, size: size)
      end

      [status, headers, body]
    end

    class BaseIterator
      attr_reader :path, :ranges, :options

      def initialize(path, ranges, options)
        @path = path
        @ranges = ranges
        @options = options
      end

      def each
        ::File.open(path, "rb") do |file|
          ranges.each do |range|
            yield multipart_heading(range) if multipart?

            each_range_part(file, range) do |part|
              yield part
            end
          end

          yield "\r\n--#{MULTIPART_BOUNDARY}--\r\n" if multipart?
        end
      end

      def bytesize
        size = ranges.inject(0) do |sum, range|
          sum += multipart_heading(range).bytesize if multipart?
          sum += range.size
        end
        size += "\r\n--#{MULTIPART_BOUNDARY}--\r\n".bytesize if multipart?
        size
      end

      def close; end

      private

      def multipart?
        ranges.size > 1
      end

      def multipart_heading(range)
<<-EOF
\r
--#{MULTIPART_BOUNDARY}\r
content-type: #{options[:mime_type]}\r
content-range: bytes #{range.begin}-#{range.end}/#{options[:size]}\r
\r
EOF
      end

      def each_range_part(file, range)
        file.seek(range.begin)
        remaining_len = range.end - range.begin + 1
        while remaining_len > 0
          part = file.read([8192, remaining_len].min)
          break unless part
          remaining_len -= part.length

          yield part
        end
      end
    end

    class Iterator < BaseIterator
      alias :to_path :path
    end

    private

    def fail(status, body, headers = {})
      body += "\n"

      [
        status,
        {
          CONTENT_TYPE   => "text/plain",
          CONTENT_LENGTH => body.size.to_s,
          "x-cascade" => "pass"
        }.merge!(headers),
        [body]
      ]
    end

    # The MIME type for the contents of the file located at @path
    def mime_type(path, default_mime)
      Mime.mime_type(::File.extname(path), default_mime)
    end

    def filesize(path)
      #   We check via File::size? whether this file provides size info
      #   via stat (e.g. /proc files often don't), otherwise we have to
      #   figure it out by reading the whole file into memory.
      ::File.size?(path) || ::File.read(path).bytesize
    end
  end
end
PK}$[ɸHO��(gems/gems/rack-3.0.8/lib/rack/version.rbnu�[���# frozen_string_literal: true

# Copyright (C) 2007-2019 Leah Neukirchen <http://leahneukirchen.org/infopage.html>
#
# Rack is freely distributable under the terms of an MIT-style license.
# See MIT-LICENSE or https://opensource.org/licenses/MIT.

# The Rack main module, serving as a namespace for all core Rack
# modules and classes.
#
# All modules meant for use in your application are <tt>autoload</tt>ed here,
# so it should be enough just to <tt>require 'rack'</tt> in your code.

module Rack
  # The Rack protocol version number implemented.
  VERSION = [1, 3].freeze
  deprecate_constant :VERSION

  VERSION_STRING = "1.3".freeze
  deprecate_constant :VERSION_STRING

  # The Rack protocol version number implemented.
  def self.version
    warn "Rack.version is deprecated and will be removed in Rack 3.1!", uplevel: 1
    VERSION
  end

  RELEASE = "3.0.8"

  # Return the Rack release as a dotted string.
  def self.release
    RELEASE
  end
end
PK}$[��3���0gems/gems/rack-3.0.8/lib/rack/method_override.rbnu�[���# frozen_string_literal: true

require_relative 'constants'
require_relative 'request'
require_relative 'utils'

module Rack
  class MethodOverride
    HTTP_METHODS = %w[GET HEAD PUT POST DELETE OPTIONS PATCH LINK UNLINK]

    METHOD_OVERRIDE_PARAM_KEY = "_method"
    HTTP_METHOD_OVERRIDE_HEADER = "HTTP_X_HTTP_METHOD_OVERRIDE"
    ALLOWED_METHODS = %w[POST]

    def initialize(app)
      @app = app
    end

    def call(env)
      if allowed_methods.include?(env[REQUEST_METHOD])
        method = method_override(env)
        if HTTP_METHODS.include?(method)
          env[RACK_METHODOVERRIDE_ORIGINAL_METHOD] = env[REQUEST_METHOD]
          env[REQUEST_METHOD] = method
        end
      end

      @app.call(env)
    end

    def method_override(env)
      req = Request.new(env)
      method = method_override_param(req) ||
        env[HTTP_METHOD_OVERRIDE_HEADER]
      begin
        method.to_s.upcase
      rescue ArgumentError
        env[RACK_ERRORS].puts "Invalid string for method"
      end
    end

    private

    def allowed_methods
      ALLOWED_METHODS
    end

    def method_override_param(req)
      req.POST[METHOD_OVERRIDE_PARAM_KEY] if req.form_data? || req.parseable_data?
    rescue Utils::InvalidParameterError, Utils::ParameterTypeError, QueryParser::ParamsTooDeepError
      req.get_header(RACK_ERRORS).puts "Invalid or incomplete POST params"
    rescue EOFError
      req.get_header(RACK_ERRORS).puts "Bad request content body"
    end
  end
end
PK}$[���4
4
(gems/gems/rack-3.0.8/lib/rack/chunked.rbnu�[���# frozen_string_literal: true

require_relative 'constants'
require_relative 'utils'

module Rack
  warn "Rack::Chunked is deprecated and will be removed in Rack 3.1", uplevel: 1

  # Middleware that applies chunked transfer encoding to response bodies
  # when the response does not include a content-length header.
  #
  # This supports the trailer response header to allow the use of trailing
  # headers in the chunked encoding.  However, using this requires you manually
  # specify a response body that supports a +trailers+ method.  Example:
  #
  #   [200, { 'trailer' => 'expires'}, ["Hello", "World"]]
  #   # error raised
  #
  #   body = ["Hello", "World"]
  #   def body.trailers
  #     { 'expires' => Time.now.to_s }
  #   end
  #   [200, { 'trailer' => 'expires'}, body]
  #   # No exception raised
  class Chunked
    include Rack::Utils

    # A body wrapper that emits chunked responses.
    class Body
      TERM = "\r\n"
      TAIL = "0#{TERM}"

      # Store the response body to be chunked.
      def initialize(body)
        @body = body
      end

      # For each element yielded by the response body, yield
      # the element in chunked encoding.
      def each(&block)
        term = TERM
        @body.each do |chunk|
          size = chunk.bytesize
          next if size == 0

          yield [size.to_s(16), term, chunk.b, term].join
        end
        yield TAIL
        yield_trailers(&block)
        yield term
      end

      # Close the response body if the response body supports it.
      def close
        @body.close if @body.respond_to?(:close)
      end

      private

      # Do nothing as this class does not support trailer headers.
      def yield_trailers
      end
    end

    # A body wrapper that emits chunked responses and also supports
    # sending Trailer headers.  Note that the response body provided to
    # initialize must have a +trailers+ method that returns a hash
    # of trailer headers, and the rack response itself should have a
    # Trailer header listing the headers that the +trailers+ method
    # will return.
    class TrailerBody < Body
      private

      # Yield strings for each trailer header.
      def yield_trailers
        @body.trailers.each_pair do |k, v|
          yield "#{k}: #{v}\r\n"
        end
      end
    end

    def initialize(app)
      @app = app
    end

    # Whether the HTTP version supports chunked encoding (HTTP 1.1 does).
    def chunkable_version?(ver)
      case ver
      # pre-HTTP/1.0 (informally "HTTP/0.9") HTTP requests did not have
      # a version (nor response headers)
      when 'HTTP/1.0', nil, 'HTTP/0.9'
        false
      else
        true
      end
    end

    # If the rack app returns a response that should have a body,
    # but does not have content-length or transfer-encoding headers,
    # modify the response to use chunked transfer-encoding.
    def call(env)
      status, headers, body = response = @app.call(env)

      if chunkable_version?(env[SERVER_PROTOCOL]) &&
         !STATUS_WITH_NO_ENTITY_BODY.key?(status.to_i) &&
         !headers[CONTENT_LENGTH] &&
         !headers[TRANSFER_ENCODING]

        headers[TRANSFER_ENCODING] = 'chunked'
        if headers['trailer']
          response[2] = TrailerBody.new(body)
        else
          response[2] = Body.new(body)
        end
      end

      response
    end
  end
end
PK}$[��44'gems/gems/rack-3.0.8/lib/rack/events.rbnu�[���# frozen_string_literal: true

require_relative 'body_proxy'
require_relative 'request'
require_relative 'response'

module Rack
  ### This middleware provides hooks to certain places in the request /
  # response lifecycle.  This is so that middleware that don't need to filter
  # the response data can safely leave it alone and not have to send messages
  # down the traditional "rack stack".
  #
  # The events are:
  #
  # * on_start(request, response)
  #
  #   This event is sent at the start of the request, before the next
  #   middleware in the chain is called.  This method is called with a request
  #   object, and a response object.  Right now, the response object is always
  #   nil, but in the future it may actually be a real response object.
  #
  # * on_commit(request, response)
  #
  #   The response has been committed.  The application has returned, but the
  #   response has not been sent to the webserver yet.  This method is always
  #   called with a request object and the response object.  The response
  #   object is constructed from the rack triple that the application returned.
  #   Changes may still be made to the response object at this point.
  #
  # * on_send(request, response)
  #
  #   The webserver has started iterating over the response body and presumably
  #   has started sending data over the wire. This method is always called with
  #   a request object and the response object.  The response object is
  #   constructed from the rack triple that the application returned.  Changes
  #   SHOULD NOT be made to the response object as the webserver has already
  #   started sending data.  Any mutations will likely result in an exception.
  #
  # * on_finish(request, response)
  #
  #   The webserver has closed the response, and all data has been written to
  #   the response socket.  The request and response object should both be
  #   read-only at this point.  The body MAY NOT be available on the response
  #   object as it may have been flushed to the socket.
  #
  # * on_error(request, response, error)
  #
  #   An exception has occurred in the application or an `on_commit` event.
  #   This method will get the request, the response (if available) and the
  #   exception that was raised.
  #
  # ## Order
  #
  # `on_start` is called on the handlers in the order that they were passed to
  # the constructor.  `on_commit`, on_send`, `on_finish`, and `on_error` are
  # called in the reverse order.  `on_finish` handlers are called inside an
  # `ensure` block, so they are guaranteed to be called even if something
  # raises an exception.  If something raises an exception in a `on_finish`
  # method, then nothing is guaranteed.

  class Events
    module Abstract
      def on_start(req, res)
      end

      def on_commit(req, res)
      end

      def on_send(req, res)
      end

      def on_finish(req, res)
      end

      def on_error(req, res, e)
      end
    end

    class EventedBodyProxy < Rack::BodyProxy # :nodoc:
      attr_reader :request, :response

      def initialize(body, request, response, handlers, &block)
        super(body, &block)
        @request  = request
        @response = response
        @handlers = handlers
      end

      def each
        @handlers.reverse_each { |handler| handler.on_send request, response }
        super
      end
    end

    class BufferedResponse < Rack::Response::Raw # :nodoc:
      attr_reader :body

      def initialize(status, headers, body)
        super(status, headers)
        @body = body
      end

      def to_a; [status, headers, body]; end
    end

    def initialize(app, handlers)
      @app      = app
      @handlers = handlers
    end

    def call(env)
      request = make_request env
      on_start request, nil

      begin
        status, headers, body = @app.call request.env
        response = make_response status, headers, body
        on_commit request, response
      rescue StandardError => e
        on_error request, response, e
        on_finish request, response
        raise
      end

      body = EventedBodyProxy.new(body, request, response, @handlers) do
        on_finish request, response
      end
      [response.status, response.headers, body]
    end

    private

    def on_error(request, response, e)
      @handlers.reverse_each { |handler| handler.on_error request, response, e }
    end

    def on_commit(request, response)
      @handlers.reverse_each { |handler| handler.on_commit request, response }
    end

    def on_start(request, response)
      @handlers.each { |handler| handler.on_start request, nil }
    end

    def on_finish(request, response)
      @handlers.reverse_each { |handler| handler.on_finish request, response }
    end

    def make_request(env)
      Rack::Request.new env
    end

    def make_response(status, headers, body)
      BufferedResponse.new status, headers, body
    end
  end
end
PK}$[H��SGbGb(gems/gems/rack-3.0.8/lib/rack/request.rbnu�[���# frozen_string_literal: true

require_relative 'constants'
require_relative 'utils'
require_relative 'media_type'

module Rack
  # Rack::Request provides a convenient interface to a Rack
  # environment.  It is stateless, the environment +env+ passed to the
  # constructor will be directly modified.
  #
  #   req = Rack::Request.new(env)
  #   req.post?
  #   req.params["data"]

  class Request
    class << self
      attr_accessor :ip_filter

      # The priority when checking forwarded headers. The default
      # is <tt>[:forwarded, :x_forwarded]</tt>, which means, check the
      # +Forwarded+ header first, followed by the appropriate
      # <tt>X-Forwarded-*</tt> header.  You can revert the priority by
      # reversing the priority, or remove checking of either
      # or both headers by removing elements from the array.
      #
      # This should be set as appropriate in your environment
      # based on what reverse proxies are in use.  If you are not
      # using reverse proxies, you should probably use an empty
      # array.
      attr_accessor :forwarded_priority

      # The priority when checking either the <tt>X-Forwarded-Proto</tt>
      # or <tt>X-Forwarded-Scheme</tt> header for the forwarded protocol.
      # The default is <tt>[:proto, :scheme]</tt>, to try the
      # <tt>X-Forwarded-Proto</tt> header before the
      # <tt>X-Forwarded-Scheme</tt> header.  Rack 2 had behavior
      # similar to <tt>[:scheme, :proto]</tt>.  You can remove either or
      # both of the entries in array to ignore that respective header.
      attr_accessor :x_forwarded_proto_priority
    end

    @forwarded_priority = [:forwarded, :x_forwarded]
    @x_forwarded_proto_priority = [:proto, :scheme]

    valid_ipv4_octet = /\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])/

    trusted_proxies = Regexp.union(
      /\A127#{valid_ipv4_octet}{3}\z/,                          # localhost IPv4 range 127.x.x.x, per RFC-3330
      /\A::1\z/,                                                # localhost IPv6 ::1
      /\Af[cd][0-9a-f]{2}(?::[0-9a-f]{0,4}){0,7}\z/i,           # private IPv6 range fc00 .. fdff
      /\A10#{valid_ipv4_octet}{3}\z/,                           # private IPv4 range 10.x.x.x
      /\A172\.(1[6-9]|2[0-9]|3[01])#{valid_ipv4_octet}{2}\z/,   # private IPv4 range 172.16.0.0 .. 172.31.255.255
      /\A192\.168#{valid_ipv4_octet}{2}\z/,                     # private IPv4 range 192.168.x.x
      /\Alocalhost\z|\Aunix(\z|:)/i,                            # localhost hostname, and unix domain sockets
    )

    self.ip_filter = lambda { |ip| trusted_proxies.match?(ip) }

    ALLOWED_SCHEMES = %w(https http wss ws).freeze

    def initialize(env)
      @env = env
      @params = nil
    end

    def params
      @params ||= super
    end

    def update_param(k, v)
      super
      @params = nil
    end

    def delete_param(k)
      v = super
      @params = nil
      v
    end

    module Env
      # The environment of the request.
      attr_reader :env

      def initialize(env)
        @env = env
        # This module is included at least in `ActionDispatch::Request`
        # The call to `super()` allows additional mixed-in initializers are called
        super()
      end

      # Predicate method to test to see if `name` has been set as request
      # specific data
      def has_header?(name)
        @env.key? name
      end

      # Get a request specific value for `name`.
      def get_header(name)
        @env[name]
      end

      # If a block is given, it yields to the block if the value hasn't been set
      # on the request.
      def fetch_header(name, &block)
        @env.fetch(name, &block)
      end

      # Loops through each key / value pair in the request specific data.
      def each_header(&block)
        @env.each(&block)
      end

      # Set a request specific value for `name` to `v`
      def set_header(name, v)
        @env[name] = v
      end

      # Add a header that may have multiple values.
      #
      # Example:
      #   request.add_header 'Accept', 'image/png'
      #   request.add_header 'Accept', '*/*'
      #
      #   assert_equal 'image/png,*/*', request.get_header('Accept')
      #
      # http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2
      def add_header(key, v)
        if v.nil?
          get_header key
        elsif has_header? key
          set_header key, "#{get_header key},#{v}"
        else
          set_header key, v
        end
      end

      # Delete a request specific value for `name`.
      def delete_header(name)
        @env.delete name
      end

      def initialize_copy(other)
        @env = other.env.dup
      end
    end

    module Helpers
      # The set of form-data media-types. Requests that do not indicate
      # one of the media types present in this list will not be eligible
      # for form-data / param parsing.
      FORM_DATA_MEDIA_TYPES = [
        'application/x-www-form-urlencoded',
        'multipart/form-data'
      ]

      # The set of media-types. Requests that do not indicate
      # one of the media types present in this list will not be eligible
      # for param parsing like soap attachments or generic multiparts
      PARSEABLE_DATA_MEDIA_TYPES = [
        'multipart/related',
        'multipart/mixed'
      ]

      # Default ports depending on scheme. Used to decide whether or not
      # to include the port in a generated URI.
      DEFAULT_PORTS = { 'http' => 80, 'https' => 443, 'coffee' => 80 }

      # The address of the client which connected to the proxy.
      HTTP_X_FORWARDED_FOR = 'HTTP_X_FORWARDED_FOR'

      # The contents of the host/:authority header sent to the proxy.
      HTTP_X_FORWARDED_HOST = 'HTTP_X_FORWARDED_HOST'

      HTTP_FORWARDED          = 'HTTP_FORWARDED'

      # The value of the scheme sent to the proxy.
      HTTP_X_FORWARDED_SCHEME = 'HTTP_X_FORWARDED_SCHEME'

      # The protocol used to connect to the proxy.
      HTTP_X_FORWARDED_PROTO = 'HTTP_X_FORWARDED_PROTO'

      # The port used to connect to the proxy.
      HTTP_X_FORWARDED_PORT = 'HTTP_X_FORWARDED_PORT'

      # Another way for specifying https scheme was used.
      HTTP_X_FORWARDED_SSL = 'HTTP_X_FORWARDED_SSL'

      def body;            get_header(RACK_INPUT)                         end
      def script_name;     get_header(SCRIPT_NAME).to_s                   end
      def script_name=(s); set_header(SCRIPT_NAME, s.to_s)                end

      def path_info;       get_header(PATH_INFO).to_s                     end
      def path_info=(s);   set_header(PATH_INFO, s.to_s)                  end

      def request_method;  get_header(REQUEST_METHOD)                     end
      def query_string;    get_header(QUERY_STRING).to_s                  end
      def content_length;  get_header('CONTENT_LENGTH')                   end
      def logger;          get_header(RACK_LOGGER)                        end
      def user_agent;      get_header('HTTP_USER_AGENT')                  end

      # the referer of the client
      def referer;         get_header('HTTP_REFERER')                     end
      alias referrer referer

      def session
        fetch_header(RACK_SESSION) do |k|
          set_header RACK_SESSION, default_session
        end
      end

      def session_options
        fetch_header(RACK_SESSION_OPTIONS) do |k|
          set_header RACK_SESSION_OPTIONS, {}
        end
      end

      # Checks the HTTP request method (or verb) to see if it was of type DELETE
      def delete?;  request_method == DELETE  end

      # Checks the HTTP request method (or verb) to see if it was of type GET
      def get?;     request_method == GET     end

      # Checks the HTTP request method (or verb) to see if it was of type HEAD
      def head?;    request_method == HEAD    end

      # Checks the HTTP request method (or verb) to see if it was of type OPTIONS
      def options?; request_method == OPTIONS end

      # Checks the HTTP request method (or verb) to see if it was of type LINK
      def link?;    request_method == LINK    end

      # Checks the HTTP request method (or verb) to see if it was of type PATCH
      def patch?;   request_method == PATCH   end

      # Checks the HTTP request method (or verb) to see if it was of type POST
      def post?;    request_method == POST    end

      # Checks the HTTP request method (or verb) to see if it was of type PUT
      def put?;     request_method == PUT     end

      # Checks the HTTP request method (or verb) to see if it was of type TRACE
      def trace?;   request_method == TRACE   end

      # Checks the HTTP request method (or verb) to see if it was of type UNLINK
      def unlink?;  request_method == UNLINK  end

      def scheme
        if get_header(HTTPS) == 'on'
          'https'
        elsif get_header(HTTP_X_FORWARDED_SSL) == 'on'
          'https'
        elsif forwarded_scheme
          forwarded_scheme
        else
          get_header(RACK_URL_SCHEME)
        end
      end

      # The authority of the incoming request as defined by RFC3976.
      # https://tools.ietf.org/html/rfc3986#section-3.2
      #
      # In HTTP/1, this is the `host` header.
      # In HTTP/2, this is the `:authority` pseudo-header.
      def authority
        forwarded_authority || host_authority || server_authority
      end

      # The authority as defined by the `SERVER_NAME` and `SERVER_PORT`
      # variables.
      def server_authority
        host = self.server_name
        port = self.server_port

        if host
          if port
            "#{host}:#{port}"
          else
            host
          end
        end
      end

      def server_name
        get_header(SERVER_NAME)
      end

      def server_port
        get_header(SERVER_PORT)
      end

      def cookies
        hash = fetch_header(RACK_REQUEST_COOKIE_HASH) do |key|
          set_header(key, {})
        end

        string = get_header(HTTP_COOKIE)

        unless string == get_header(RACK_REQUEST_COOKIE_STRING)
          hash.replace Utils.parse_cookies_header(string)
          set_header(RACK_REQUEST_COOKIE_STRING, string)
        end

        hash
      end

      def content_type
        content_type = get_header('CONTENT_TYPE')
        content_type.nil? || content_type.empty? ? nil : content_type
      end

      def xhr?
        get_header("HTTP_X_REQUESTED_WITH") == "XMLHttpRequest"
      end

      # The `HTTP_HOST` header.
      def host_authority
        get_header(HTTP_HOST)
      end

      def host_with_port(authority = self.authority)
        host, _, port = split_authority(authority)

        if port == DEFAULT_PORTS[self.scheme]
          host
        else
          authority
        end
      end

      # Returns a formatted host, suitable for being used in a URI.
      def host
        split_authority(self.authority)[0]
      end

      # Returns an address suitable for being to resolve to an address.
      # In the case of a domain name or IPv4 address, the result is the same
      # as +host+. In the case of IPv6 or future address formats, the square
      # brackets are removed.
      def hostname
        split_authority(self.authority)[1]
      end

      def port
        if authority = self.authority
          _, _, port = split_authority(authority)
        end

        port || forwarded_port&.last || DEFAULT_PORTS[scheme] || server_port
      end

      def forwarded_for
        forwarded_priority.each do |type|
          case type
          when :forwarded
            if forwarded_for = get_http_forwarded(:for)
              return(forwarded_for.map! do |authority|
                split_authority(authority)[1]
              end)
            end
          when :x_forwarded
            if value = get_header(HTTP_X_FORWARDED_FOR)
              return(split_header(value).map do |authority|
                split_authority(wrap_ipv6(authority))[1]
              end)
            end
          end
        end

        nil
      end

      def forwarded_port
        forwarded_priority.each do |type|
          case type
          when :forwarded
            if forwarded = get_http_forwarded(:for)
              return(forwarded.map do |authority|
                split_authority(authority)[2]
              end.compact)
            end
          when :x_forwarded
            if value = get_header(HTTP_X_FORWARDED_PORT)
              return split_header(value).map(&:to_i)
            end
          end
        end

        nil
      end

      def forwarded_authority
        forwarded_priority.each do |type|
          case type
          when :forwarded
            if forwarded = get_http_forwarded(:host)
              return forwarded.last
            end
          when :x_forwarded
            if value = get_header(HTTP_X_FORWARDED_HOST)
              return wrap_ipv6(split_header(value).last)
            end
          end
        end

        nil
      end

      def ssl?
        scheme == 'https' || scheme == 'wss'
      end

      def ip
        remote_addresses = split_header(get_header('REMOTE_ADDR'))
        external_addresses = reject_trusted_ip_addresses(remote_addresses)

        unless external_addresses.empty?
          return external_addresses.last
        end

        if (forwarded_for = self.forwarded_for) && !forwarded_for.empty?
          # The forwarded for addresses are ordered: client, proxy1, proxy2.
          # So we reject all the trusted addresses (proxy*) and return the
          # last client. Or if we trust everyone, we just return the first
          # address.
          return reject_trusted_ip_addresses(forwarded_for).last || forwarded_for.first
        end

        # If all the addresses are trusted, and we aren't forwarded, just return
        # the first remote address, which represents the source of the request.
        remote_addresses.first
      end

      # The media type (type/subtype) portion of the CONTENT_TYPE header
      # without any media type parameters. e.g., when CONTENT_TYPE is
      # "text/plain;charset=utf-8", the media-type is "text/plain".
      #
      # For more information on the use of media types in HTTP, see:
      # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7
      def media_type
        MediaType.type(content_type)
      end

      # The media type parameters provided in CONTENT_TYPE as a Hash, or
      # an empty Hash if no CONTENT_TYPE or media-type parameters were
      # provided.  e.g., when the CONTENT_TYPE is "text/plain;charset=utf-8",
      # this method responds with the following Hash:
      #   { 'charset' => 'utf-8' }
      def media_type_params
        MediaType.params(content_type)
      end

      # The character set of the request body if a "charset" media type
      # parameter was given, or nil if no "charset" was specified. Note
      # that, per RFC2616, text/* media types that specify no explicit
      # charset are to be considered ISO-8859-1.
      def content_charset
        media_type_params['charset']
      end

      # Determine whether the request body contains form-data by checking
      # the request content-type for one of the media-types:
      # "application/x-www-form-urlencoded" or "multipart/form-data". The
      # list of form-data media types can be modified through the
      # +FORM_DATA_MEDIA_TYPES+ array.
      #
      # A request body is also assumed to contain form-data when no
      # content-type header is provided and the request_method is POST.
      def form_data?
        type = media_type
        meth = get_header(RACK_METHODOVERRIDE_ORIGINAL_METHOD) || get_header(REQUEST_METHOD)

        (meth == POST && type.nil?) || FORM_DATA_MEDIA_TYPES.include?(type)
      end

      # Determine whether the request body contains data by checking
      # the request media_type against registered parse-data media-types
      def parseable_data?
        PARSEABLE_DATA_MEDIA_TYPES.include?(media_type)
      end

      # Returns the data received in the query string.
      def GET
        if get_header(RACK_REQUEST_QUERY_STRING) == query_string
          get_header(RACK_REQUEST_QUERY_HASH)
        else
          query_hash = parse_query(query_string, '&')
          set_header(RACK_REQUEST_QUERY_STRING, query_string)
          set_header(RACK_REQUEST_QUERY_HASH, query_hash)
        end
      end

      # Returns the data received in the request body.
      #
      # This method support both application/x-www-form-urlencoded and
      # multipart/form-data.
      def POST
        if error = get_header(RACK_REQUEST_FORM_ERROR)
          raise error.class, error.message, cause: error.cause
        end

        begin
          rack_input = get_header(RACK_INPUT)

          # If the form hash was already memoized:
          if form_hash = get_header(RACK_REQUEST_FORM_HASH)
            # And it was memoized from the same input:
            if get_header(RACK_REQUEST_FORM_INPUT).equal?(rack_input)
              return form_hash
            end
          end

          # Otherwise, figure out how to parse the input:
          if rack_input.nil?
            set_header RACK_REQUEST_FORM_INPUT, nil
            set_header(RACK_REQUEST_FORM_HASH, {})
          elsif form_data? || parseable_data?
            unless set_header(RACK_REQUEST_FORM_HASH, parse_multipart)
              form_vars = get_header(RACK_INPUT).read

              # Fix for Safari Ajax postings that always append \0
              # form_vars.sub!(/\0\z/, '') # performance replacement:
              form_vars.slice!(-1) if form_vars.end_with?("\0")

              set_header RACK_REQUEST_FORM_VARS, form_vars
              set_header RACK_REQUEST_FORM_HASH, parse_query(form_vars, '&')
            end

            set_header RACK_REQUEST_FORM_INPUT, get_header(RACK_INPUT)
            get_header RACK_REQUEST_FORM_HASH
          else
            set_header RACK_REQUEST_FORM_INPUT, get_header(RACK_INPUT)
            set_header(RACK_REQUEST_FORM_HASH, {})
          end
        rescue => error
          set_header(RACK_REQUEST_FORM_ERROR, error)
          raise
        end
      end

      # The union of GET and POST data.
      #
      # Note that modifications will not be persisted in the env. Use update_param or delete_param if you want to destructively modify params.
      def params
        self.GET.merge(self.POST)
      end

      # Destructively update a parameter, whether it's in GET and/or POST. Returns nil.
      #
      # The parameter is updated wherever it was previous defined, so GET, POST, or both. If it wasn't previously defined, it's inserted into GET.
      #
      # <tt>env['rack.input']</tt> is not touched.
      def update_param(k, v)
        found = false
        if self.GET.has_key?(k)
          found = true
          self.GET[k] = v
        end
        if self.POST.has_key?(k)
          found = true
          self.POST[k] = v
        end
        unless found
          self.GET[k] = v
        end
      end

      # Destructively delete a parameter, whether it's in GET or POST. Returns the value of the deleted parameter.
      #
      # If the parameter is in both GET and POST, the POST value takes precedence since that's how #params works.
      #
      # <tt>env['rack.input']</tt> is not touched.
      def delete_param(k)
        post_value, get_value = self.POST.delete(k), self.GET.delete(k)
        post_value || get_value
      end

      def base_url
        "#{scheme}://#{host_with_port}"
      end

      # Tries to return a remake of the original request URL as a string.
      def url
        base_url + fullpath
      end

      def path
        script_name + path_info
      end

      def fullpath
        query_string.empty? ? path : "#{path}?#{query_string}"
      end

      def accept_encoding
        parse_http_accept_header(get_header("HTTP_ACCEPT_ENCODING"))
      end

      def accept_language
        parse_http_accept_header(get_header("HTTP_ACCEPT_LANGUAGE"))
      end

      def trusted_proxy?(ip)
        Rack::Request.ip_filter.call(ip)
      end

      # shortcut for <tt>request.params[key]</tt>
      def [](key)
        warn("Request#[] is deprecated and will be removed in a future version of Rack. Please use request.params[] instead", uplevel: 1)

        params[key.to_s]
      end

      # shortcut for <tt>request.params[key] = value</tt>
      #
      # Note that modifications will not be persisted in the env. Use update_param or delete_param if you want to destructively modify params.
      def []=(key, value)
        warn("Request#[]= is deprecated and will be removed in a future version of Rack. Please use request.params[]= instead", uplevel: 1)

        params[key.to_s] = value
      end

      # like Hash#values_at
      def values_at(*keys)
        keys.map { |key| params[key] }
      end

      private

      def default_session; {}; end

      # Assist with compatibility when processing `X-Forwarded-For`.
      def wrap_ipv6(host)
        # Even thought IPv6 addresses should be wrapped in square brackets,
        # sometimes this is not done in various legacy/underspecified headers.
        # So we try to fix this situation for compatibility reasons.

        # Try to detect IPv6 addresses which aren't escaped yet:
        if !host.start_with?('[') && host.count(':') > 1
          "[#{host}]"
        else
          host
        end
      end

      def parse_http_accept_header(header)
        header.to_s.split(",").each(&:strip!).map do |part|
          attribute, parameters = part.split(";", 2).each(&:strip!)
          quality = 1.0
          if parameters and /\Aq=([\d.]+)/ =~ parameters
            quality = $1.to_f
          end
          [attribute, quality]
        end
      end

      # Get an array of values set in the RFC 7239 `Forwarded` request header.
      def get_http_forwarded(token)
        Utils.forwarded_values(get_header(HTTP_FORWARDED))&.[](token)
      end

      def query_parser
        Utils.default_query_parser
      end

      def parse_query(qs, d = '&')
        query_parser.parse_nested_query(qs, d)
      end

      def parse_multipart
        Rack::Multipart.extract_multipart(self, query_parser)
      end

      def split_header(value)
        value ? value.strip.split(/[,\s]+/) : []
      end

      # ipv6 extracted from resolv stdlib, simplified
      # to remove numbered match group creation.
      ipv6 = Regexp.union(
        /(?:[0-9A-Fa-f]{1,4}:){7}
         [0-9A-Fa-f]{1,4}/x,
        /(?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)? ::
         (?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?/x,
        /(?:[0-9A-Fa-f]{1,4}:){6,6}
         \d+\.\d+\.\d+\.\d+/x,
        /(?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)? ::
         (?:[0-9A-Fa-f]{1,4}:)*
         \d+\.\d+\.\d+\.\d+/x,
        /[Ff][Ee]80
         (?::[0-9A-Fa-f]{1,4}){7}
         %[-0-9A-Za-z._~]+/x,
        /[Ff][Ee]80:
         (?:
           (?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)? ::
           (?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?
           |
           :(?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?
         )?
         :[0-9A-Fa-f]{1,4}%[-0-9A-Za-z._~]+/x)

      AUTHORITY = /
        \A
        (?<host>
          # Match IPv6 as a string of hex digits and colons in square brackets
          \[(?<address>#{ipv6})\]
          |
          # Match any other printable string (except square brackets) as a hostname
          (?<address>[[[:graph:]&&[^\[\]]]]*?)
        )
        (:(?<port>\d+))?
        \z
      /x

      private_constant :AUTHORITY

      def split_authority(authority)
        return [] if authority.nil?
        return [] unless match = AUTHORITY.match(authority)
        return match[:host], match[:address], match[:port]&.to_i
      end

      def reject_trusted_ip_addresses(ip_addresses)
        ip_addresses.reject { |ip| trusted_proxy?(ip) }
      end

      FORWARDED_SCHEME_HEADERS = {
        proto: HTTP_X_FORWARDED_PROTO,
        scheme: HTTP_X_FORWARDED_SCHEME
      }.freeze
      private_constant :FORWARDED_SCHEME_HEADERS
      def forwarded_scheme
        forwarded_priority.each do |type|
          case type
          when :forwarded
            if (forwarded_proto = get_http_forwarded(:proto)) &&
               (scheme = allowed_scheme(forwarded_proto.last))
              return scheme
            end
          when :x_forwarded
            x_forwarded_proto_priority.each do |x_type|
              if header = FORWARDED_SCHEME_HEADERS[x_type]
                split_header(get_header(header)).reverse_each do |scheme|
                  if allowed_scheme(scheme)
                    return scheme
                  end
                end
              end
            end
          end
        end

        nil
      end

      def allowed_scheme(header)
        header if ALLOWED_SCHEMES.include?(header)
      end

      def forwarded_priority
        Request.forwarded_priority
      end

      def x_forwarded_proto_priority
        Request.x_forwarded_proto_priority
      end
    end

    include Env
    include Helpers
  end
end

# :nocov:
require_relative 'multipart' unless defined?(Rack::Multipart)
# :nocov:
PK}$[[�J)gems/gems/rack-3.0.8/lib/rack/deflater.rbnu�[���# frozen_string_literal: true

require "zlib"
require "time"  # for Time.httpdate

require_relative 'constants'
require_relative 'utils'
require_relative 'request'
require_relative 'body_proxy'

module Rack
  # This middleware enables content encoding of http responses,
  # usually for purposes of compression.
  #
  # Currently supported encodings:
  #
  # * gzip
  # * identity (no transformation)
  #
  # This middleware automatically detects when encoding is supported
  # and allowed. For example no encoding is made when a cache
  # directive of 'no-transform' is present, when the response status
  # code is one that doesn't allow an entity body, or when the body
  # is empty.
  #
  # Note that despite the name, Deflater does not support the +deflate+
  # encoding.
  class Deflater
    # Creates Rack::Deflater middleware. Options:
    #
    # :if :: a lambda enabling / disabling deflation based on returned boolean value
    #        (e.g <tt>use Rack::Deflater, :if => lambda { |*, body| sum=0; body.each { |i| sum += i.length }; sum > 512 }</tt>).
    #        However, be aware that calling `body.each` inside the block will break cases where `body.each` is not idempotent,
    #        such as when it is an +IO+ instance.
    # :include :: a list of content types that should be compressed. By default, all content types are compressed.
    # :sync :: determines if the stream is going to be flushed after every chunk.  Flushing after every chunk reduces
    #          latency for time-sensitive streaming applications, but hurts compression and throughput.
    #          Defaults to +true+.
    def initialize(app, options = {})
      @app = app
      @condition = options[:if]
      @compressible_types = options[:include]
      @sync = options.fetch(:sync, true)
    end

    def call(env)
      status, headers, body = response = @app.call(env)

      unless should_deflate?(env, status, headers, body)
        return response
      end

      request = Request.new(env)

      encoding = Utils.select_best_encoding(%w(gzip identity),
                                            request.accept_encoding)

      # Set the Vary HTTP header.
      vary = headers["vary"].to_s.split(",").map(&:strip)
      unless vary.include?("*") || vary.any?{|v| v.downcase == 'accept-encoding'}
        headers["vary"] = vary.push("Accept-Encoding").join(",")
      end

      case encoding
      when "gzip"
        headers['content-encoding'] = "gzip"
        headers.delete(CONTENT_LENGTH)
        mtime = headers["last-modified"]
        mtime = Time.httpdate(mtime).to_i if mtime
        response[2] = GzipStream.new(body, mtime, @sync)
        response
      when "identity"
        response
      else # when nil
        # Only possible encoding values here are 'gzip', 'identity', and nil
        message = "An acceptable encoding for the requested resource #{request.fullpath} could not be found."
        bp = Rack::BodyProxy.new([message]) { body.close if body.respond_to?(:close) }
        [406, { CONTENT_TYPE => "text/plain", CONTENT_LENGTH => message.length.to_s }, bp]
      end
    end

    # Body class used for gzip encoded responses.
    class GzipStream

      BUFFER_LENGTH = 128 * 1_024

      # Initialize the gzip stream.  Arguments:
      # body :: Response body to compress with gzip
      # mtime :: The modification time of the body, used to set the
      #          modification time in the gzip header.
      # sync :: Whether to flush each gzip chunk as soon as it is ready.
      def initialize(body, mtime, sync)
        @body = body
        @mtime = mtime
        @sync = sync
      end

      # Yield gzip compressed strings to the given block.
      def each(&block)
        @writer = block
        gzip = ::Zlib::GzipWriter.new(self)
        gzip.mtime = @mtime if @mtime
        # @body.each is equivalent to @body.gets (slow)
        if @body.is_a? ::File # XXX: Should probably be ::IO
          while part = @body.read(BUFFER_LENGTH)
            gzip.write(part)
            gzip.flush if @sync
          end
        else
          @body.each { |part|
            # Skip empty strings, as they would result in no output,
            # and flushing empty parts would raise Zlib::BufError.
            next if part.empty?
            gzip.write(part)
            gzip.flush if @sync
          }
        end
      ensure
        gzip.finish
      end

      # Call the block passed to #each with the gzipped data.
      def write(data)
        @writer.call(data)
      end

      # Close the original body if possible.
      def close
        @body.close if @body.respond_to?(:close)
      end
    end

    private

    # Whether the body should be compressed.
    def should_deflate?(env, status, headers, body)
      # Skip compressing empty entity body responses and responses with
      # no-transform set.
      if Utils::STATUS_WITH_NO_ENTITY_BODY.key?(status.to_i) ||
          /\bno-transform\b/.match?(headers[CACHE_CONTROL].to_s) ||
          headers['content-encoding']&.!~(/\bidentity\b/)
        return false
      end

      # Skip if @compressible_types are given and does not include request's content type
      return false if @compressible_types && !(headers.has_key?(CONTENT_TYPE) && @compressible_types.include?(headers[CONTENT_TYPE][/[^;]*/]))

      # Skip if @condition lambda is given and evaluates to false
      return false if @condition && !@condition.call(env, status, headers, body)

      # No point in compressing empty body, also handles usage with
      # Rack::Sendfile.
      return false if headers[CONTENT_LENGTH] == '0'

      true
    end
  end
end
PK}$[;�`�ff(gems/gems/rack-3.0.8/lib/rack/runtime.rbnu�[���# frozen_string_literal: true

require_relative 'utils'

module Rack
  # Sets an "x-runtime" response header, indicating the response
  # time of the request, in seconds
  #
  # You can put it right before the application to see the processing
  # time, or before all the other middlewares to include time for them,
  # too.
  class Runtime
    FORMAT_STRING = "%0.6f" # :nodoc:
    HEADER_NAME = "x-runtime" # :nodoc:

    def initialize(app, name = nil)
      @app = app
      @header_name = HEADER_NAME
      @header_name += "-#{name.to_s.downcase}" if name
    end

    def call(env)
      start_time = Utils.clock_time
      _, headers, _ = response = @app.call(env)

      request_time = Utils.clock_time - start_time

      unless headers.key?(@header_name)
        headers[@header_name] = FORMAT_STRING % request_time
      end

      response
    end
  end
end
PK}$[_��l��,gems/gems/rack-3.0.8/lib/rack/null_logger.rbnu�[���# frozen_string_literal: true

require_relative 'constants'

module Rack
  class NullLogger
    def initialize(app)
      @app = app
    end

    def call(env)
      env[RACK_LOGGER] = self
      @app.call(env)
    end

    def info(progname = nil, &block); end
    def debug(progname = nil, &block); end
    def warn(progname = nil, &block); end
    def error(progname = nil, &block); end
    def fatal(progname = nil, &block); end
    def unknown(progname = nil, &block); end
    def info? ;  end
    def debug? ; end
    def warn? ;  end
    def error? ; end
    def fatal? ; end
    def debug! ; end
    def error! ; end
    def fatal! ; end
    def info! ; end
    def warn! ; end
    def level ; end
    def progname ; end
    def datetime_format ; end
    def formatter ; end
    def sev_threshold ; end
    def level=(level); end
    def progname=(progname); end
    def datetime_format=(datetime_format); end
    def formatter=(formatter); end
    def sev_threshold=(sev_threshold); end
    def close ; end
    def add(severity, message = nil, progname = nil, &block); end
    def log(severity, message = nil, progname = nil, &block); end
    def <<(msg); end
    def reopen(logdev = nil); end
  end
end
PK}$[d�NN,gems/gems/rack-3.0.8/lib/rack/show_status.rbnu�[���# frozen_string_literal: true

require 'erb'

require_relative 'constants'
require_relative 'utils'
require_relative 'request'
require_relative 'body_proxy'

module Rack
  # Rack::ShowStatus catches all empty responses and replaces them
  # with a site explaining the error.
  #
  # Additional details can be put into <tt>rack.showstatus.detail</tt>
  # and will be shown as HTML.  If such details exist, the error page
  # is always rendered, even if the reply was not empty.

  class ShowStatus
    def initialize(app)
      @app = app
      @template = ERB.new(TEMPLATE)
    end

    def call(env)
      status, headers, body = response = @app.call(env)
      empty = headers[CONTENT_LENGTH].to_i <= 0

      # client or server error, or explicit message
      if (status.to_i >= 400 && empty) || env[RACK_SHOWSTATUS_DETAIL]
        # This double assignment is to prevent an "unused variable" warning.
        # Yes, it is dumb, but I don't like Ruby yelling at me.
        req = req = Rack::Request.new(env)

        message = Rack::Utils::HTTP_STATUS_CODES[status.to_i] || status.to_s

        # This double assignment is to prevent an "unused variable" warning.
        # Yes, it is dumb, but I don't like Ruby yelling at me.
        detail = detail = env[RACK_SHOWSTATUS_DETAIL] || message

        html = @template.result(binding)
        size = html.bytesize

        response[2] = Rack::BodyProxy.new([html]) do
          body.close if body.respond_to?(:close)
        end

        headers[CONTENT_TYPE] = "text/html"
        headers[CONTENT_LENGTH] = size.to_s
      end

      response
    end

    def h(obj)                  # :nodoc:
      case obj
      when String
        Utils.escape_html(obj)
      else
        Utils.escape_html(obj.inspect)
      end
    end

    # :stopdoc:

# adapted from Django <www.djangoproject.com>
# Copyright (c) Django Software Foundation and individual contributors.
# Used under the modified BSD license:
# http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5
TEMPLATE = <<'HTML'
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  <title><%=h message %> at <%=h req.script_name + req.path_info %></title>
  <meta name="robots" content="NONE,NOARCHIVE" />
  <style type="text/css">
    html * { padding:0; margin:0; }
    body * { padding:10px 20px; }
    body * * { padding:0; }
    body { font:small sans-serif; background:#eee; }
    body>div { border-bottom:1px solid #ddd; }
    h1 { font-weight:normal; margin-bottom:.4em; }
    h1 span { font-size:60%; color:#666; font-weight:normal; }
    table { border:none; border-collapse: collapse; width:100%; }
    td, th { vertical-align:top; padding:2px 3px; }
    th { width:12em; text-align:right; color:#666; padding-right:.5em; }
    #info { background:#f6f6f6; }
    #info ol { margin: 0.5em 4em; }
    #info ol li { font-family: monospace; }
    #summary { background: #ffc; }
    #explanation { background:#eee; border-bottom: 0px none; }
  </style>
</head>
<body>
  <div id="summary">
    <h1><%=h message %> <span>(<%= status.to_i %>)</span></h1>
    <table class="meta">
      <tr>
        <th>Request Method:</th>
        <td><%=h req.request_method %></td>
      </tr>
      <tr>
        <th>Request URL:</th>
      <td><%=h req.url %></td>
      </tr>
    </table>
  </div>
  <div id="info">
    <p><%=h detail %></p>
  </div>

  <div id="explanation">
    <p>
    You're seeing this error because you use <code>Rack::ShowStatus</code>.
    </p>
  </div>
</body>
</html>
HTML

    # :startdoc:
  end
end
PK}$[�ӎ cTcT&gems/gems/rack-3.0.8/lib/rack/utils.rbnu�[���# -*- encoding: binary -*-
# frozen_string_literal: true

require 'uri'
require 'fileutils'
require 'set'
require 'tempfile'
require 'time'

require_relative 'query_parser'
require_relative 'mime'
require_relative 'headers'
require_relative 'constants'

module Rack
  # Rack::Utils contains a grab-bag of useful methods for writing web
  # applications adopted from all kinds of Ruby libraries.

  module Utils
    ParameterTypeError = QueryParser::ParameterTypeError
    InvalidParameterError = QueryParser::InvalidParameterError
    ParamsTooDeepError = QueryParser::ParamsTooDeepError
    DEFAULT_SEP = QueryParser::DEFAULT_SEP
    COMMON_SEP = QueryParser::COMMON_SEP
    KeySpaceConstrainedParams = QueryParser::Params

    class << self
      attr_accessor :default_query_parser
    end
    # The default amount of nesting to allowed by hash parameters.
    # This helps prevent a rogue client from triggering a possible stack overflow
    # when parsing parameters.
    self.default_query_parser = QueryParser.make_default(32)

    module_function

    # URI escapes. (CGI style space to +)
    def escape(s)
      URI.encode_www_form_component(s)
    end

    # Like URI escaping, but with %20 instead of +. Strictly speaking this is
    # true URI escaping.
    def escape_path(s)
      ::URI::DEFAULT_PARSER.escape s
    end

    # Unescapes the **path** component of a URI.  See Rack::Utils.unescape for
    # unescaping query parameters or form components.
    def unescape_path(s)
      ::URI::DEFAULT_PARSER.unescape s
    end

    # Unescapes a URI escaped string with +encoding+. +encoding+ will be the
    # target encoding of the string returned, and it defaults to UTF-8
    def unescape(s, encoding = Encoding::UTF_8)
      URI.decode_www_form_component(s, encoding)
    end

    class << self
      attr_accessor :multipart_total_part_limit

      attr_accessor :multipart_file_limit

      # multipart_part_limit is the original name of multipart_file_limit, but
      # the limit only counts parts with filenames.
      alias multipart_part_limit multipart_file_limit
      alias multipart_part_limit= multipart_file_limit=
    end

    # The maximum number of file parts a request can contain. Accepting too
    # many parts can lead to the server running out of file handles.
    # Set to `0` for no limit.
    self.multipart_file_limit = (ENV['RACK_MULTIPART_PART_LIMIT'] || ENV['RACK_MULTIPART_FILE_LIMIT'] || 128).to_i

    # The maximum total number of parts a request can contain. Accepting too
    # many can lead to excessive memory use and parsing time.
    self.multipart_total_part_limit = (ENV['RACK_MULTIPART_TOTAL_PART_LIMIT'] || 4096).to_i

    def self.param_depth_limit
      default_query_parser.param_depth_limit
    end

    def self.param_depth_limit=(v)
      self.default_query_parser = self.default_query_parser.new_depth_limit(v)
    end

    def self.key_space_limit
      warn("`Rack::Utils.key_space_limit` is deprecated as this value no longer has an effect. It will be removed in Rack 3.1", uplevel: 1)
      65536
    end

    def self.key_space_limit=(v)
      warn("`Rack::Utils.key_space_limit=` is deprecated and no longer has an effect. It will be removed in Rack 3.1", uplevel: 1)
    end

    if defined?(Process::CLOCK_MONOTONIC)
      def clock_time
        Process.clock_gettime(Process::CLOCK_MONOTONIC)
      end
    else
      # :nocov:
      def clock_time
        Time.now.to_f
      end
      # :nocov:
    end

    def parse_query(qs, d = nil, &unescaper)
      Rack::Utils.default_query_parser.parse_query(qs, d, &unescaper)
    end

    def parse_nested_query(qs, d = nil)
      Rack::Utils.default_query_parser.parse_nested_query(qs, d)
    end

    def build_query(params)
      params.map { |k, v|
        if v.class == Array
          build_query(v.map { |x| [k, x] })
        else
          v.nil? ? escape(k) : "#{escape(k)}=#{escape(v)}"
        end
      }.join("&")
    end

    def build_nested_query(value, prefix = nil)
      case value
      when Array
        value.map { |v|
          build_nested_query(v, "#{prefix}[]")
        }.join("&")
      when Hash
        value.map { |k, v|
          build_nested_query(v, prefix ? "#{prefix}[#{k}]" : k)
        }.delete_if(&:empty?).join('&')
      when nil
        escape(prefix)
      else
        raise ArgumentError, "value must be a Hash" if prefix.nil?
        "#{escape(prefix)}=#{escape(value)}"
      end
    end

    def q_values(q_value_header)
      q_value_header.to_s.split(/\s*,\s*/).map do |part|
        value, parameters = part.split(/\s*;\s*/, 2)
        quality = 1.0
        if parameters && (md = /\Aq=([\d.]+)/.match(parameters))
          quality = md[1].to_f
        end
        [value, quality]
      end
    end

    def forwarded_values(forwarded_header)
      return nil unless forwarded_header
      forwarded_header = forwarded_header.to_s.gsub("\n", ";")

      forwarded_header.split(/\s*;\s*/).each_with_object({}) do |field, values|
        field.split(/\s*,\s*/).each do |pair|
          return nil unless pair =~ /\A\s*(by|for|host|proto)\s*=\s*"?([^"]+)"?\s*\Z/i
          (values[$1.downcase.to_sym] ||= []) << $2
        end
      end
    end
    module_function :forwarded_values

    # Return best accept value to use, based on the algorithm
    # in RFC 2616 Section 14.  If there are multiple best
    # matches (same specificity and quality), the value returned
    # is arbitrary.
    def best_q_match(q_value_header, available_mimes)
      values = q_values(q_value_header)

      matches = values.map do |req_mime, quality|
        match = available_mimes.find { |am| Rack::Mime.match?(am, req_mime) }
        next unless match
        [match, quality]
      end.compact.sort_by do |match, quality|
        (match.split('/', 2).count('*') * -10) + quality
      end.last
      matches&.first
    end

    ESCAPE_HTML = {
      "&" => "&amp;",
      "<" => "&lt;",
      ">" => "&gt;",
      "'" => "&#x27;",
      '"' => "&quot;",
      "/" => "&#x2F;"
    }

    ESCAPE_HTML_PATTERN = Regexp.union(*ESCAPE_HTML.keys)

    # Escape ampersands, brackets and quotes to their HTML/XML entities.
    def escape_html(string)
      string.to_s.gsub(ESCAPE_HTML_PATTERN){|c| ESCAPE_HTML[c] }
    end

    def select_best_encoding(available_encodings, accept_encoding)
      # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

      expanded_accept_encoding = []

      accept_encoding.each do |m, q|
        preference = available_encodings.index(m) || available_encodings.size

        if m == "*"
          (available_encodings - accept_encoding.map(&:first)).each do |m2|
            expanded_accept_encoding << [m2, q, preference]
          end
        else
          expanded_accept_encoding << [m, q, preference]
        end
      end

      encoding_candidates = expanded_accept_encoding
        .sort_by { |_, q, p| [-q, p] }
        .map!(&:first)

      unless encoding_candidates.include?("identity")
        encoding_candidates.push("identity")
      end

      expanded_accept_encoding.each do |m, q|
        encoding_candidates.delete(m) if q == 0.0
      end

      (encoding_candidates & available_encodings)[0]
    end

    # :call-seq:
    #   parse_cookies_header(value) -> hash
    #
    # Parse cookies from the provided header +value+ according to RFC6265. The
    # syntax for cookie headers only supports semicolons. Returns a map of
    # cookie +key+ to cookie +value+.
    #
    #   parse_cookies_header('myname=myvalue; max-age=0')
    #   # => {"myname"=>"myvalue", "max-age"=>"0"}
    #
    def parse_cookies_header(value)
      return {} unless value

      value.split(/; */n).each_with_object({}) do |cookie, cookies|
        next if cookie.empty?
        key, value = cookie.split('=', 2)
        cookies[key] = (unescape(value) rescue value) unless cookies.key?(key)
      end
    end

    def add_cookie_to_header(header, key, value)
      warn("add_cookie_to_header is deprecated and will be removed in Rack 3.1", uplevel: 1)

      case header
      when nil, ''
        return set_cookie_header(key, value)
      when String
        [header, set_cookie_header(key, value)]
      when Array
        header + [set_cookie_header(key, value)]
      else
        raise ArgumentError, "Unrecognized cookie header value. Expected String, Array, or nil, got #{header.inspect}"
      end
    end

    # :call-seq:
    #   parse_cookies(env) -> hash
    #
    # Parse cookies from the provided request environment using
    # parse_cookies_header. Returns a map of cookie +key+ to cookie +value+.
    #
    #   parse_cookies({'HTTP_COOKIE' => 'myname=myvalue'})
    #   # => {'myname' => 'myvalue'}
    #
    def parse_cookies(env)
      parse_cookies_header env[HTTP_COOKIE]
    end

    # :call-seq:
    #   set_cookie_header(key, value) -> encoded string
    #
    # Generate an encoded string using the provided +key+ and +value+ suitable
    # for the +set-cookie+ header according to RFC6265. The +value+ may be an
    # instance of either +String+ or +Hash+.
    #
    # If the cookie +value+ is an instance of +Hash+, it considers the following
    # cookie attribute keys: +domain+, +max_age+, +expires+ (must be instance
    # of +Time+), +secure+, +http_only+, +same_site+ and +value+. For more
    # details about the interpretation of these fields, consult
    # [RFC6265 Section 5.2](https://datatracker.ietf.org/doc/html/rfc6265#section-5.2).
    #
    # An extra cookie attribute +escape_key+ can be provided to control whether
    # or not the cookie key is URL encoded. If explicitly set to +false+, the
    # cookie key name will not be url encoded (escaped). The default is +true+.
    #
    #   set_cookie_header("myname", "myvalue")
    #   # => "myname=myvalue"
    #
    #   set_cookie_header("myname", {value: "myvalue", max_age: 10})
    #   # => "myname=myvalue; max-age=10"
    #
    def set_cookie_header(key, value)
      case value
      when Hash
        key = escape(key) unless value[:escape_key] == false
        domain  = "; domain=#{value[:domain]}"   if value[:domain]
        path    = "; path=#{value[:path]}"       if value[:path]
        max_age = "; max-age=#{value[:max_age]}" if value[:max_age]
        expires = "; expires=#{value[:expires].httpdate}" if value[:expires]
        secure = "; secure"  if value[:secure]
        httponly = "; httponly" if (value.key?(:httponly) ? value[:httponly] : value[:http_only])
        same_site =
          case value[:same_site]
          when false, nil
            nil
          when :none, 'None', :None
            '; SameSite=None'
          when :lax, 'Lax', :Lax
            '; SameSite=Lax'
          when true, :strict, 'Strict', :Strict
            '; SameSite=Strict'
          else
            raise ArgumentError, "Invalid SameSite value: #{value[:same_site].inspect}"
          end
        value = value[:value]
      else
        key = escape(key)
      end

      value = [value] unless Array === value

      return "#{key}=#{value.map { |v| escape v }.join('&')}#{domain}" \
        "#{path}#{max_age}#{expires}#{secure}#{httponly}#{same_site}"
    end

    # :call-seq:
    #   set_cookie_header!(headers, key, value) -> header value
    #
    # Append a cookie in the specified headers with the given cookie +key+ and
    # +value+ using set_cookie_header.
    #
    # If the headers already contains a +set-cookie+ key, it will be converted
    # to an +Array+ if not already, and appended to.
    def set_cookie_header!(headers, key, value)
      if header = headers[SET_COOKIE]
        if header.is_a?(Array)
          header << set_cookie_header(key, value)
        else
          headers[SET_COOKIE] = [header, set_cookie_header(key, value)]
        end
      else
        headers[SET_COOKIE] = set_cookie_header(key, value)
      end
    end

    # :call-seq:
    #   delete_set_cookie_header(key, value = {}) -> encoded string
    #
    # Generate an encoded string based on the given +key+ and +value+ using
    # set_cookie_header for the purpose of causing the specified cookie to be
    # deleted. The +value+ may be an instance of +Hash+ and can include
    # attributes as outlined by set_cookie_header. The encoded cookie will have
    # a +max_age+ of 0 seconds, an +expires+ date in the past and an empty
    # +value+. When used with the +set-cookie+ header, it will cause the client
    # to *remove* any matching cookie.
    #
    #   delete_set_cookie_header("myname")
    #   # => "myname=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT"
    #
    def delete_set_cookie_header(key, value = {})
      set_cookie_header(key, value.merge(max_age: '0', expires: Time.at(0), value: ''))
    end

    def make_delete_cookie_header(header, key, value)
      warn("make_delete_cookie_header is deprecated and will be removed in Rack 3.1, use delete_set_cookie_header! instead", uplevel: 1)

      delete_set_cookie_header!(header, key, value)
    end

    def delete_cookie_header!(headers, key, value = {})
      headers[SET_COOKIE] = delete_set_cookie_header!(headers[SET_COOKIE], key, value)

      return nil
    end

    def add_remove_cookie_to_header(header, key, value = {})
      warn("add_remove_cookie_to_header is deprecated and will be removed in Rack 3.1, use delete_set_cookie_header! instead", uplevel: 1)

      delete_set_cookie_header!(header, key, value)
    end

    # :call-seq:
    #   delete_set_cookie_header!(header, key, value = {}) -> header value
    #
    # Set an expired cookie in the specified headers with the given cookie
    # +key+ and +value+ using delete_set_cookie_header. This causes
    # the client to immediately delete the specified cookie.
    #
    #   delete_set_cookie_header!(nil, "mycookie")
    #   # => "mycookie=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT"
    #
    # If the header is non-nil, it will be modified in place.
    #
    #   header = []
    #   delete_set_cookie_header!(header, "mycookie")
    #   # => ["mycookie=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT"]
    #   header
    #   # => ["mycookie=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT"]
    #
    def delete_set_cookie_header!(header, key, value = {})
      if header
        header = Array(header)
        header << delete_set_cookie_header(key, value)
      else
        header = delete_set_cookie_header(key, value)
      end

      return header
    end

    def rfc2822(time)
      time.rfc2822
    end

    # Parses the "Range:" header, if present, into an array of Range objects.
    # Returns nil if the header is missing or syntactically invalid.
    # Returns an empty array if none of the ranges are satisfiable.
    def byte_ranges(env, size)
      get_byte_ranges env['HTTP_RANGE'], size
    end

    def get_byte_ranges(http_range, size)
      # See <http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35>
      return nil unless http_range && http_range =~ /bytes=([^;]+)/
      ranges = []
      $1.split(/,\s*/).each do |range_spec|
        return nil unless range_spec.include?('-')
        range = range_spec.split('-')
        r0, r1 = range[0], range[1]
        if r0.nil? || r0.empty?
          return nil if r1.nil?
          # suffix-byte-range-spec, represents trailing suffix of file
          r0 = size - r1.to_i
          r0 = 0  if r0 < 0
          r1 = size - 1
        else
          r0 = r0.to_i
          if r1.nil?
            r1 = size - 1
          else
            r1 = r1.to_i
            return nil  if r1 < r0  # backwards range is syntactically invalid
            r1 = size - 1  if r1 >= size
          end
        end
        ranges << (r0..r1)  if r0 <= r1
      end
      ranges
    end

    # :nocov:
    if defined?(OpenSSL.fixed_length_secure_compare)
      # Constant time string comparison.
      #
      # NOTE: the values compared should be of fixed length, such as strings
      # that have already been processed by HMAC. This should not be used
      # on variable length plaintext strings because it could leak length info
      # via timing attacks.
      def secure_compare(a, b)
        return false unless a.bytesize == b.bytesize

        OpenSSL.fixed_length_secure_compare(a, b)
      end
    # :nocov:
    else
      def secure_compare(a, b)
        return false unless a.bytesize == b.bytesize

        l = a.unpack("C*")

        r, i = 0, -1
        b.each_byte { |v| r |= v ^ l[i += 1] }
        r == 0
      end
    end

    # Context allows the use of a compatible middleware at different points
    # in a request handling stack. A compatible middleware must define
    # #context which should take the arguments env and app. The first of which
    # would be the request environment. The second of which would be the rack
    # application that the request would be forwarded to.
    class Context
      attr_reader :for, :app

      def initialize(app_f, app_r)
        raise 'running context does not respond to #context' unless app_f.respond_to? :context
        @for, @app = app_f, app_r
      end

      def call(env)
        @for.context(env, @app)
      end

      def recontext(app)
        self.class.new(@for, app)
      end

      def context(env, app = @app)
        recontext(app).call(env)
      end
    end

    # A wrapper around Headers
    # header when set.
    #
    # @api private
    class HeaderHash < Hash # :nodoc:
      def self.[](headers)
        warn "Rack::Utils::HeaderHash is deprecated and will be removed in Rack 3.1, switch to Rack::Headers", uplevel: 1
        if headers.is_a?(Headers) && !headers.frozen?
          return headers
        end

        new_headers = Headers.new
        headers.each{|k,v| new_headers[k] = v}
        new_headers
      end

      def self.new(hash = {})
        warn "Rack::Utils::HeaderHash is deprecated and will be removed in Rack 3.1, switch to Rack::Headers", uplevel: 1
        headers = Headers.new
        hash.each{|k,v| headers[k] = v}
        headers
      end

      def self.allocate
        raise TypeError, "cannot allocate HeaderHash"
      end
    end

    # Every standard HTTP code mapped to the appropriate message.
    # Generated with:
    #   curl -s https://www.iana.org/assignments/http-status-codes/http-status-codes-1.csv | \
    #     ruby -ne 'm = /^(\d{3}),(?!Unassigned|\(Unused\))([^,]+)/.match($_) and \
    #               puts "#{m[1]} => \x27#{m[2].strip}\x27,"'
    HTTP_STATUS_CODES = {
      100 => 'Continue',
      101 => 'Switching Protocols',
      102 => 'Processing',
      103 => 'Early Hints',
      200 => 'OK',
      201 => 'Created',
      202 => 'Accepted',
      203 => 'Non-Authoritative Information',
      204 => 'No Content',
      205 => 'Reset Content',
      206 => 'Partial Content',
      207 => 'Multi-Status',
      208 => 'Already Reported',
      226 => 'IM Used',
      300 => 'Multiple Choices',
      301 => 'Moved Permanently',
      302 => 'Found',
      303 => 'See Other',
      304 => 'Not Modified',
      305 => 'Use Proxy',
      306 => '(Unused)',
      307 => 'Temporary Redirect',
      308 => 'Permanent Redirect',
      400 => 'Bad Request',
      401 => 'Unauthorized',
      402 => 'Payment Required',
      403 => 'Forbidden',
      404 => 'Not Found',
      405 => 'Method Not Allowed',
      406 => 'Not Acceptable',
      407 => 'Proxy Authentication Required',
      408 => 'Request Timeout',
      409 => 'Conflict',
      410 => 'Gone',
      411 => 'Length Required',
      412 => 'Precondition Failed',
      413 => 'Payload Too Large',
      414 => 'URI Too Long',
      415 => 'Unsupported Media Type',
      416 => 'Range Not Satisfiable',
      417 => 'Expectation Failed',
      421 => 'Misdirected Request',
      422 => 'Unprocessable Entity',
      423 => 'Locked',
      424 => 'Failed Dependency',
      425 => 'Too Early',
      426 => 'Upgrade Required',
      428 => 'Precondition Required',
      429 => 'Too Many Requests',
      431 => 'Request Header Fields Too Large',
      451 => 'Unavailable for Legal Reasons',
      500 => 'Internal Server Error',
      501 => 'Not Implemented',
      502 => 'Bad Gateway',
      503 => 'Service Unavailable',
      504 => 'Gateway Timeout',
      505 => 'HTTP Version Not Supported',
      506 => 'Variant Also Negotiates',
      507 => 'Insufficient Storage',
      508 => 'Loop Detected',
      509 => 'Bandwidth Limit Exceeded',
      510 => 'Not Extended',
      511 => 'Network Authentication Required'
    }

    # Responses with HTTP status codes that should not have an entity body
    STATUS_WITH_NO_ENTITY_BODY = Hash[((100..199).to_a << 204 << 304).product([true])]

    SYMBOL_TO_STATUS_CODE = Hash[*HTTP_STATUS_CODES.map { |code, message|
      [message.downcase.gsub(/\s|-|'/, '_').to_sym, code]
    }.flatten]

    def status_code(status)
      if status.is_a?(Symbol)
        SYMBOL_TO_STATUS_CODE.fetch(status) { raise ArgumentError, "Unrecognized status code #{status.inspect}" }
      else
        status.to_i
      end
    end

    PATH_SEPS = Regexp.union(*[::File::SEPARATOR, ::File::ALT_SEPARATOR].compact)

    def clean_path_info(path_info)
      parts = path_info.split PATH_SEPS

      clean = []

      parts.each do |part|
        next if part.empty? || part == '.'
        part == '..' ? clean.pop : clean << part
      end

      clean_path = clean.join(::File::SEPARATOR)
      clean_path.prepend("/") if parts.empty? || parts.first.empty?
      clean_path
    end

    NULL_BYTE = "\0"

    def valid_path?(path)
      path.valid_encoding? && !path.include?(NULL_BYTE)
    end

  end
end
PK}$[ѝo�%gems/gems/rack-3.0.8/lib/rack/head.rbnu�[���# frozen_string_literal: true

require_relative 'constants'
require_relative 'body_proxy'

module Rack
  # Rack::Head returns an empty body for all HEAD requests. It leaves
  # all other requests unchanged.
  class Head
    def initialize(app)
      @app = app
    end

    def call(env)
      _, _, body = response = @app.call(env)

      if env[REQUEST_METHOD] == HEAD
        response[2] = Rack::BodyProxy.new([]) do
          body.close if body.respond_to? :close
        end
      end

      response
    end
  end
end
PK}$[�/�{{-gems/gems/rack-3.0.8/lib/rack/mock_request.rbnu�[���# frozen_string_literal: true

require 'uri'
require 'stringio'

require_relative 'constants'
require_relative 'mock_response'

module Rack
  # Rack::MockRequest helps testing your Rack application without
  # actually using HTTP.
  #
  # After performing a request on a URL with get/post/put/patch/delete, it
  # returns a MockResponse with useful helper methods for effective
  # testing.
  #
  # You can pass a hash with additional configuration to the
  # get/post/put/patch/delete.
  # <tt>:input</tt>:: A String or IO-like to be used as rack.input.
  # <tt>:fatal</tt>:: Raise a FatalWarning if the app writes to rack.errors.
  # <tt>:lint</tt>:: If true, wrap the application in a Rack::Lint.

  class MockRequest
    class FatalWarning < RuntimeError
    end

    class FatalWarner
      def puts(warning)
        raise FatalWarning, warning
      end

      def write(warning)
        raise FatalWarning, warning
      end

      def flush
      end

      def string
        ""
      end
    end

    DEFAULT_ENV = {
      RACK_INPUT        => StringIO.new,
      RACK_ERRORS       => StringIO.new,
    }.freeze

    def initialize(app)
      @app = app
    end

    # Make a GET request and return a MockResponse. See #request.
    def get(uri, opts = {})     request(GET, uri, opts)     end
    # Make a POST request and return a MockResponse. See #request.
    def post(uri, opts = {})    request(POST, uri, opts)    end
    # Make a PUT request and return a MockResponse. See #request.
    def put(uri, opts = {})     request(PUT, uri, opts)     end
    # Make a PATCH request and return a MockResponse. See #request.
    def patch(uri, opts = {})   request(PATCH, uri, opts)   end
    # Make a DELETE request and return a MockResponse. See #request.
    def delete(uri, opts = {})  request(DELETE, uri, opts)  end
    # Make a HEAD request and return a MockResponse. See #request.
    def head(uri, opts = {})    request(HEAD, uri, opts)    end
    # Make an OPTIONS request and return a MockResponse. See #request.
    def options(uri, opts = {}) request(OPTIONS, uri, opts) end

    # Make a request using the given request method for the given
    # uri to the rack application and return a MockResponse.
    # Options given are passed to MockRequest.env_for.
    def request(method = GET, uri = "", opts = {})
      env = self.class.env_for(uri, opts.merge(method: method))

      if opts[:lint]
        app = Rack::Lint.new(@app)
      else
        app = @app
      end

      errors = env[RACK_ERRORS]
      status, headers, body = app.call(env)
      MockResponse.new(status, headers, body, errors)
    ensure
      body.close if body.respond_to?(:close)
    end

    # For historical reasons, we're pinning to RFC 2396.
    # URI::Parser = URI::RFC2396_Parser
    def self.parse_uri_rfc2396(uri)
      @parser ||= URI::Parser.new
      @parser.parse(uri)
    end

    # Return the Rack environment used for a request to +uri+.
    # All options that are strings are added to the returned environment.
    # Options:
    # :fatal :: Whether to raise an exception if request outputs to rack.errors
    # :input :: The rack.input to set
    # :http_version :: The SERVER_PROTOCOL to set
    # :method :: The HTTP request method to use
    # :params :: The params to use
    # :script_name :: The SCRIPT_NAME to set
    def self.env_for(uri = "", opts = {})
      uri = parse_uri_rfc2396(uri)
      uri.path = "/#{uri.path}" unless uri.path[0] == ?/

      env = DEFAULT_ENV.dup

      env[REQUEST_METHOD]  = (opts[:method] ? opts[:method].to_s.upcase : GET).b
      env[SERVER_NAME]     = (uri.host || "example.org").b
      env[SERVER_PORT]     = (uri.port ? uri.port.to_s : "80").b
      env[SERVER_PROTOCOL] = opts[:http_version] || 'HTTP/1.1'
      env[QUERY_STRING]    = (uri.query.to_s).b
      env[PATH_INFO]       = (uri.path).b
      env[RACK_URL_SCHEME] = (uri.scheme || "http").b
      env[HTTPS]           = (env[RACK_URL_SCHEME] == "https" ? "on" : "off").b

      env[SCRIPT_NAME] = opts[:script_name] || ""

      if opts[:fatal]
        env[RACK_ERRORS] = FatalWarner.new
      else
        env[RACK_ERRORS] = StringIO.new
      end

      if params = opts[:params]
        if env[REQUEST_METHOD] == GET
          params = Utils.parse_nested_query(params) if params.is_a?(String)
          params.update(Utils.parse_nested_query(env[QUERY_STRING]))
          env[QUERY_STRING] = Utils.build_nested_query(params)
        elsif !opts.has_key?(:input)
          opts["CONTENT_TYPE"] = "application/x-www-form-urlencoded"
          if params.is_a?(Hash)
            if data = Rack::Multipart.build_multipart(params)
              opts[:input] = data
              opts["CONTENT_LENGTH"] ||= data.length.to_s
              opts["CONTENT_TYPE"] = "multipart/form-data; boundary=#{Rack::Multipart::MULTIPART_BOUNDARY}"
            else
              opts[:input] = Utils.build_nested_query(params)
            end
          else
            opts[:input] = params
          end
        end
      end

      opts[:input] ||= String.new
      if String === opts[:input]
        rack_input = StringIO.new(opts[:input])
      else
        rack_input = opts[:input]
      end

      rack_input.set_encoding(Encoding::BINARY)
      env[RACK_INPUT] = rack_input

      env["CONTENT_LENGTH"] ||= env[RACK_INPUT].size.to_s if env[RACK_INPUT].respond_to?(:size)

      opts.each { |field, value|
        env[field] = value  if String === field
      }

      env
    end
  end
end
PK}$[��A�*gems/gems/rack-3.0.8/lib/rack/directory.rbnu�[���# frozen_string_literal: true

require 'time'

require_relative 'constants'
require_relative 'utils'
require_relative 'head'
require_relative 'mime'
require_relative 'files'

module Rack
  # Rack::Directory serves entries below the +root+ given, according to the
  # path info of the Rack request. If a directory is found, the file's contents
  # will be presented in an html based index. If a file is found, the env will
  # be passed to the specified +app+.
  #
  # If +app+ is not specified, a Rack::Files of the same +root+ will be used.

  class Directory
    DIR_FILE = "<tr><td class='name'><a href='%s'>%s</a></td><td class='size'>%s</td><td class='type'>%s</td><td class='mtime'>%s</td></tr>\n"
    DIR_PAGE_HEADER = <<-PAGE
<html><head>
  <title>%s</title>
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  <style type='text/css'>
table { width:100%%; }
.name { text-align:left; }
.size, .mtime { text-align:right; }
.type { width:11em; }
.mtime { width:15em; }
  </style>
</head><body>
<h1>%s</h1>
<hr />
<table>
  <tr>
    <th class='name'>Name</th>
    <th class='size'>Size</th>
    <th class='type'>Type</th>
    <th class='mtime'>Last Modified</th>
  </tr>
    PAGE
    DIR_PAGE_FOOTER = <<-PAGE
</table>
<hr />
</body></html>
    PAGE

    # Body class for directory entries, showing an index page with links
    # to each file.
    class DirectoryBody < Struct.new(:root, :path, :files)
      # Yield strings for each part of the directory entry
      def each
        show_path = Utils.escape_html(path.sub(/^#{root}/, ''))
        yield(DIR_PAGE_HEADER % [ show_path, show_path ])

        unless path.chomp('/') == root
          yield(DIR_FILE % DIR_FILE_escape(files.call('..')))
        end

        Dir.foreach(path) do |basename|
          next if basename.start_with?('.')
          next unless f = files.call(basename)
          yield(DIR_FILE % DIR_FILE_escape(f))
        end

        yield(DIR_PAGE_FOOTER)
      end

      private

      # Escape each element in the array of html strings.
      def DIR_FILE_escape(htmls)
        htmls.map { |e| Utils.escape_html(e) }
      end
    end

    # The root of the directory hierarchy.  Only requests for files and
    # directories inside of the root directory are supported.
    attr_reader :root

    # Set the root directory and application for serving files.
    def initialize(root, app = nil)
      @root = ::File.expand_path(root)
      @app = app || Files.new(@root)
      @head = Head.new(method(:get))
    end

    def call(env)
      # strip body if this is a HEAD call
      @head.call env
    end

    # Internals of request handling.  Similar to call but does
    # not remove body for HEAD requests.
    def get(env)
      script_name = env[SCRIPT_NAME]
      path_info = Utils.unescape_path(env[PATH_INFO])

      if client_error_response = check_bad_request(path_info) || check_forbidden(path_info)
        client_error_response
      else
        path = ::File.join(@root, path_info)
        list_path(env, path, path_info, script_name)
      end
    end

    # Rack response to use for requests with invalid paths, or nil if path is valid.
    def check_bad_request(path_info)
      return if Utils.valid_path?(path_info)

      body = "Bad Request\n"
      [400, { CONTENT_TYPE => "text/plain",
        CONTENT_LENGTH => body.bytesize.to_s,
        "x-cascade" => "pass" }, [body]]
    end

    # Rack response to use for requests with paths outside the root, or nil if path is inside the root.
    def check_forbidden(path_info)
      return unless path_info.include? ".."
      return if ::File.expand_path(::File.join(@root, path_info)).start_with?(@root)

      body = "Forbidden\n"
      [403, { CONTENT_TYPE => "text/plain",
        CONTENT_LENGTH => body.bytesize.to_s,
        "x-cascade" => "pass" }, [body]]
    end

    # Rack response to use for directories under the root.
    def list_directory(path_info, path, script_name)
      url_head = (script_name.split('/') + path_info.split('/')).map do |part|
        Utils.escape_path part
      end

      # Globbing not safe as path could contain glob metacharacters
      body = DirectoryBody.new(@root, path, ->(basename) do
        stat = stat(::File.join(path, basename))
        next unless stat

        url = ::File.join(*url_head + [Utils.escape_path(basename)])
        mtime = stat.mtime.httpdate
        if stat.directory?
          type = 'directory'
          size = '-'
          url << '/'
          if basename == '..'
            basename = 'Parent Directory'
          else
            basename << '/'
          end
        else
          type = Mime.mime_type(::File.extname(basename))
          size = filesize_format(stat.size)
        end

        [ url, basename, size, type, mtime ]
      end)

      [ 200, { CONTENT_TYPE => 'text/html; charset=utf-8' }, body ]
    end

    # File::Stat for the given path, but return nil for missing/bad entries.
    def stat(path)
      ::File.stat(path)
    rescue Errno::ENOENT, Errno::ELOOP
      return nil
    end

    # Rack response to use for files and directories under the root.
    # Unreadable and non-file, non-directory entries will get a 404 response.
    def list_path(env, path, path_info, script_name)
      if (stat = stat(path)) && stat.readable?
        return @app.call(env) if stat.file?
        return list_directory(path_info, path, script_name) if stat.directory?
      end

      entity_not_found(path_info)
    end

    # Rack response to use for unreadable and non-file, non-directory entries.
    def entity_not_found(path_info)
      body = "Entity not found: #{path_info}\n"
      [404, { CONTENT_TYPE => "text/plain",
        CONTENT_LENGTH => body.bytesize.to_s,
        "x-cascade" => "pass" }, [body]]
    end

    # Stolen from Ramaze
    FILESIZE_FORMAT = [
      ['%.1fT', 1 << 40],
      ['%.1fG', 1 << 30],
      ['%.1fM', 1 << 20],
      ['%.1fK', 1 << 10],
    ]

    # Provide human readable file sizes
    def filesize_format(int)
      FILESIZE_FORMAT.each do |format, size|
        return format % (int.to_f / size) if int >= size
      end

      "#{int}B"
    end
  end
end
PK}$[K�bx)gems/gems/rack-3.0.8/lib/rack/reloader.rbnu�[���# frozen_string_literal: true

# Copyright (C) 2009-2018 Michael Fellinger <m.fellinger@gmail.com>
# Rack::Reloader is subject to the terms of an MIT-style license.
# See MIT-LICENSE or https://opensource.org/licenses/MIT.

require 'pathname'

module Rack

  # High performant source reloader
  #
  # This class acts as Rack middleware.
  #
  # What makes it especially suited for use in a production environment is that
  # any file will only be checked once and there will only be made one system
  # call stat(2).
  #
  # Please note that this will not reload files in the background, it does so
  # only when actively called.
  #
  # It is performing a check/reload cycle at the start of every request, but
  # also respects a cool down time, during which nothing will be done.
  class Reloader
    def initialize(app, cooldown = 10, backend = Stat)
      @app = app
      @cooldown = cooldown
      @last = (Time.now - cooldown)
      @cache = {}
      @mtimes = {}
      @reload_mutex = Mutex.new

      extend backend
    end

    def call(env)
      if @cooldown and Time.now > @last + @cooldown
        if Thread.list.size > 1
          @reload_mutex.synchronize{ reload! }
        else
          reload!
        end

        @last = Time.now
      end

      @app.call(env)
    end

    def reload!(stderr = $stderr)
      rotation do |file, mtime|
        previous_mtime = @mtimes[file] ||= mtime
        safe_load(file, mtime, stderr) if mtime > previous_mtime
      end
    end

    # A safe Kernel::load, issuing the hooks depending on the results
    def safe_load(file, mtime, stderr = $stderr)
      load(file)
      stderr.puts "#{self.class}: reloaded `#{file}'"
      file
    rescue LoadError, SyntaxError => ex
      stderr.puts ex
    ensure
      @mtimes[file] = mtime
    end

    module Stat
      def rotation
        files = [$0, *$LOADED_FEATURES].uniq
        paths = ['./', *$LOAD_PATH].uniq

        files.map{|file|
          next if /\.(so|bundle)$/.match?(file) # cannot reload compiled files

          found, stat = figure_path(file, paths)
          next unless found && stat && mtime = stat.mtime

          @cache[file] = found

          yield(found, mtime)
        }.compact
      end

      # Takes a relative or absolute +file+ name, a couple possible +paths+ that
      # the +file+ might reside in. Returns the full path and File::Stat for the
      # path.
      def figure_path(file, paths)
        found = @cache[file]
        found = file if !found and Pathname.new(file).absolute?
        found, stat = safe_stat(found)
        return found, stat if found

        paths.find do |possible_path|
          path = ::File.join(possible_path, file)
          found, stat = safe_stat(path)
          return ::File.expand_path(found), stat if found
        end

        return false, false
      end

      def safe_stat(file)
        return unless file
        stat = ::File.stat(file)
        return file, stat if stat.file?
      rescue Errno::ENOENT, Errno::ENOTDIR, Errno::ESRCH
        @cache.delete(file) and false
      end
    end
  end
end
PK}$[VM�Vww%gems/gems/rack-3.0.8/lib/rack/etag.rbnu�[���# frozen_string_literal: true

require 'digest/sha2'

require_relative 'constants'
require_relative 'utils'

module Rack
  # Automatically sets the etag header on all String bodies.
  #
  # The etag header is skipped if etag or last-modified headers are sent or if
  # a sendfile body (body.responds_to :to_path) is given (since such cases
  # should be handled by apache/nginx).
  #
  # On initialization, you can pass two parameters: a cache-control directive
  # used when etag is absent and a directive when it is present. The first
  # defaults to nil, while the second defaults to "max-age=0, private, must-revalidate"
  class ETag
    ETAG_STRING = Rack::ETAG
    DEFAULT_CACHE_CONTROL = "max-age=0, private, must-revalidate"

    def initialize(app, no_cache_control = nil, cache_control = DEFAULT_CACHE_CONTROL)
      @app = app
      @cache_control = cache_control
      @no_cache_control = no_cache_control
    end

    def call(env)
      status, headers, body = response = @app.call(env)

      if etag_status?(status) && body.respond_to?(:to_ary) && !skip_caching?(headers)
        body = body.to_ary
        digest = digest_body(body)
        headers[ETAG_STRING] = %(W/"#{digest}") if digest
      end

      unless headers[CACHE_CONTROL]
        if digest
          headers[CACHE_CONTROL] = @cache_control if @cache_control
        else
          headers[CACHE_CONTROL] = @no_cache_control if @no_cache_control
        end
      end

      response
    end

    private

      def etag_status?(status)
        status == 200 || status == 201
      end

      def skip_caching?(headers)
        headers.key?(ETAG_STRING) || headers.key?('last-modified')
      end

      def digest_body(body)
        digest = nil

        body.each do |part|
          (digest ||= Digest::SHA256.new) << part unless part.empty?
        end

        digest && digest.hexdigest.byteslice(0,32)
      end
  end
end
PK}$[�ю	��'gems/gems/rack-3.0.8/lib/rack/static.rbnu�[���# frozen_string_literal: true

require_relative 'constants'
require_relative 'files'
require_relative 'mime'

module Rack

  # The Rack::Static middleware intercepts requests for static files
  # (javascript files, images, stylesheets, etc) based on the url prefixes or
  # route mappings passed in the options, and serves them using a Rack::Files
  # object. This allows a Rack stack to serve both static and dynamic content.
  #
  # Examples:
  #
  # Serve all requests beginning with /media from the "media" folder located
  # in the current directory (ie media/*):
  #
  #     use Rack::Static, :urls => ["/media"]
  #
  # Same as previous, but instead of returning 404 for missing files under
  # /media, call the next middleware:
  #
  #     use Rack::Static, :urls => ["/media"], :cascade => true
  #
  # Serve all requests beginning with /css or /images from the folder "public"
  # in the current directory (ie public/css/* and public/images/*):
  #
  #     use Rack::Static, :urls => ["/css", "/images"], :root => "public"
  #
  # Serve all requests to / with "index.html" from the folder "public" in the
  # current directory (ie public/index.html):
  #
  #     use Rack::Static, :urls => {"/" => 'index.html'}, :root => 'public'
  #
  # Serve all requests normally from the folder "public" in the current
  # directory but uses index.html as default route for "/"
  #
  #     use Rack::Static, :urls => [""], :root => 'public', :index =>
  #     'index.html'
  #
  # Set custom HTTP Headers for based on rules:
  #
  #     use Rack::Static, :root => 'public',
  #         :header_rules => [
  #           [rule, {header_field => content, header_field => content}],
  #           [rule, {header_field => content}]
  #         ]
  #
  #  Rules for selecting files:
  #
  #  1) All files
  #     Provide the :all symbol
  #     :all => Matches every file
  #
  #  2) Folders
  #     Provide the folder path as a string
  #     '/folder' or '/folder/subfolder' => Matches files in a certain folder
  #
  #  3) File Extensions
  #     Provide the file extensions as an array
  #     ['css', 'js'] or %w(css js) => Matches files ending in .css or .js
  #
  #  4) Regular Expressions / Regexp
  #     Provide a regular expression
  #     %r{\.(?:css|js)\z} => Matches files ending in .css or .js
  #     /\.(?:eot|ttf|otf|woff2|woff|svg)\z/ => Matches files ending in
  #       the most common web font formats (.eot, .ttf, .otf, .woff2, .woff, .svg)
  #       Note: This Regexp is available as a shortcut, using the :fonts rule
  #
  #  5) Font Shortcut
  #     Provide the :fonts symbol
  #     :fonts => Uses the Regexp rule stated right above to match all common web font endings
  #
  #  Rule Ordering:
  #    Rules are applied in the order that they are provided.
  #    List rather general rules above special ones.
  #
  #  Complete example use case including HTTP header rules:
  #
  #     use Rack::Static, :root => 'public',
  #         :header_rules => [
  #           # Cache all static files in public caches (e.g. Rack::Cache)
  #           #  as well as in the browser
  #           [:all, {'cache-control' => 'public, max-age=31536000'}],
  #
  #           # Provide web fonts with cross-origin access-control-headers
  #           #  Firefox requires this when serving assets using a Content Delivery Network
  #           [:fonts, {'access-control-allow-origin' => '*'}]
  #         ]
  #
  class Static
    def initialize(app, options = {})
      @app = app
      @urls = options[:urls] || ["/favicon.ico"]
      @index = options[:index]
      @gzip = options[:gzip]
      @cascade = options[:cascade]
      root = options[:root] || Dir.pwd

      # HTTP Headers
      @header_rules = options[:header_rules] || []
      # Allow for legacy :cache_control option while prioritizing global header_rules setting
      @header_rules.unshift([:all, { CACHE_CONTROL => options[:cache_control] }]) if options[:cache_control]

      @file_server = Rack::Files.new(root)
    end

    def add_index_root?(path)
      @index && route_file(path) && path.end_with?('/')
    end

    def overwrite_file_path(path)
      @urls.kind_of?(Hash) && @urls.key?(path) || add_index_root?(path)
    end

    def route_file(path)
      @urls.kind_of?(Array) && @urls.any? { |url| path.index(url) == 0 }
    end

    def can_serve(path)
      route_file(path) || overwrite_file_path(path)
    end

    def call(env)
      path = env[PATH_INFO]

      if can_serve(path)
        if overwrite_file_path(path)
          env[PATH_INFO] = (add_index_root?(path) ? path + @index : @urls[path])
        elsif @gzip && env['HTTP_ACCEPT_ENCODING'] && /\bgzip\b/.match?(env['HTTP_ACCEPT_ENCODING'])
          path = env[PATH_INFO]
          env[PATH_INFO] += '.gz'
          response = @file_server.call(env)
          env[PATH_INFO] = path

          if response[0] == 404
            response = nil
          elsif response[0] == 304
            # Do nothing, leave headers as is
          else
            response[1][CONTENT_TYPE] = Mime.mime_type(::File.extname(path), 'text/plain')
            response[1]['content-encoding'] = 'gzip'
          end
        end

        path = env[PATH_INFO]
        response ||= @file_server.call(env)

        if @cascade && response[0] == 404
          return @app.call(env)
        end

        headers = response[1]
        applicable_rules(path).each do |rule, new_headers|
          new_headers.each { |field, content| headers[field] = content }
        end

        response
      else
        @app.call(env)
      end
    end

    # Convert HTTP header rules to HTTP headers
    def applicable_rules(path)
      @header_rules.find_all do |rule, new_headers|
        case rule
        when :all
          true
        when :fonts
          /\.(?:ttf|otf|eot|woff2|woff|svg)\z/.match?(path)
        when String
          path = ::Rack::Utils.unescape(path)
          path.start_with?(rule) || path.start_with?('/' + rule)
        when Array
          /\.(#{rule.join('|')})\z/.match?(path)
        when Regexp
          rule.match?(path)
        else
          false
        end
      end
    end

  end
end
PK}$[��l�	�	4gems/gems/rack-3.0.8/lib/rack/multipart/generator.rbnu�[���# frozen_string_literal: true

require_relative 'uploaded_file'

module Rack
  module Multipart
    class Generator
      def initialize(params, first = true)
        @params, @first = params, first

        if @first && !@params.is_a?(Hash)
          raise ArgumentError, "value must be a Hash"
        end
      end

      def dump
        return nil if @first && !multipart?
        return flattened_params unless @first

        flattened_params.map do |name, file|
          if file.respond_to?(:original_filename)
            if file.path
              ::File.open(file.path, 'rb') do |f|
                f.set_encoding(Encoding::BINARY)
                content_for_tempfile(f, file, name)
              end
            else
              content_for_tempfile(file, file, name)
            end
          else
            content_for_other(file, name)
          end
        end.join << "--#{MULTIPART_BOUNDARY}--\r"
      end

      private
      def multipart?
        query = lambda { |value|
          case value
          when Array
            value.any?(&query)
          when Hash
            value.values.any?(&query)
          when Rack::Multipart::UploadedFile
            true
          end
        }

        @params.values.any?(&query)
      end

      def flattened_params
        @flattened_params ||= begin
          h = Hash.new
          @params.each do |key, value|
            k = @first ? key.to_s : "[#{key}]"

            case value
            when Array
              value.map { |v|
                Multipart.build_multipart(v, false).each { |subkey, subvalue|
                  h["#{k}[]#{subkey}"] = subvalue
                }
              }
            when Hash
              Multipart.build_multipart(value, false).each { |subkey, subvalue|
                h[k + subkey] = subvalue
              }
            else
              h[k] = value
            end
          end
          h
        end
      end

      def content_for_tempfile(io, file, name)
        length = ::File.stat(file.path).size if file.path
        filename = "; filename=\"#{Utils.escape_path(file.original_filename)}\""
<<-EOF
--#{MULTIPART_BOUNDARY}\r
content-disposition: form-data; name="#{name}"#{filename}\r
content-type: #{file.content_type}\r
#{"content-length: #{length}\r\n" if length}\r
#{io.read}\r
EOF
      end

      def content_for_other(file, name)
<<-EOF
--#{MULTIPART_BOUNDARY}\r
content-disposition: form-data; name="#{name}"\r
\r
#{file}\r
EOF
      end
    end
  end
end
PK}$[�N�$$8gems/gems/rack-3.0.8/lib/rack/multipart/uploaded_file.rbnu�[���# frozen_string_literal: true

require 'tempfile'
require 'fileutils'

module Rack
  module Multipart
    class UploadedFile

      # The filename, *not* including the path, of the "uploaded" file
      attr_reader :original_filename

      # The content type of the "uploaded" file
      attr_accessor :content_type

      def initialize(filepath = nil, ct = "text/plain", bin = false,
                     path: filepath, content_type: ct, binary: bin, filename: nil, io: nil)
        if io
          @tempfile = io
          @original_filename = filename
        else
          raise "#{path} file does not exist" unless ::File.exist?(path)
          @original_filename = filename || ::File.basename(path)
          @tempfile = Tempfile.new([@original_filename, ::File.extname(path)], encoding: Encoding::BINARY)
          @tempfile.binmode if binary
          FileUtils.copy_file(path, @tempfile.path)
        end
        @content_type = content_type
      end

      def path
        @tempfile.path if @tempfile.respond_to?(:path)
      end
      alias_method :local_path, :path

      def respond_to?(*args)
        super or @tempfile.respond_to?(*args)
      end

      def method_missing(method_name, *args, &block) #:nodoc:
        @tempfile.__send__(method_name, *args, &block)
      end
    end
  end
end
PK}$[��&�4�41gems/gems/rack-3.0.8/lib/rack/multipart/parser.rbnu�[���# frozen_string_literal: true

require 'strscan'

require_relative '../utils'

module Rack
  module Multipart
    class MultipartPartLimitError < Errno::EMFILE; end

    class MultipartTotalPartLimitError < StandardError; end

    # Use specific error class when parsing multipart request
    # that ends early.
    class EmptyContentError < ::EOFError; end

    # Base class for multipart exceptions that do not subclass from
    # other exception classes for backwards compatibility.
    class Error < StandardError; end

    EOL = "\r\n"
    MULTIPART = %r|\Amultipart/.*boundary=\"?([^\";,]+)\"?|ni
    TOKEN = /[^\s()<>,;:\\"\/\[\]?=]+/
    CONDISP = /Content-Disposition:\s*#{TOKEN}\s*/i
    VALUE = /"(?:\\"|[^"])*"|#{TOKEN}/
    BROKEN = /^#{CONDISP}.*;\s*filename=(#{VALUE})/i
    MULTIPART_CONTENT_TYPE = /Content-Type: (.*)#{EOL}/ni
    MULTIPART_CONTENT_DISPOSITION = /Content-Disposition:[^:]*;\s*name=(#{VALUE})/ni
    MULTIPART_CONTENT_ID = /Content-ID:\s*([^#{EOL}]*)/ni
    # Updated definitions from RFC 2231
    ATTRIBUTE_CHAR = %r{[^ \x00-\x1f\x7f)(><@,;:\\"/\[\]?='*%]}
    ATTRIBUTE = /#{ATTRIBUTE_CHAR}+/
    SECTION = /\*[0-9]+/
    REGULAR_PARAMETER_NAME = /#{ATTRIBUTE}#{SECTION}?/
    REGULAR_PARAMETER = /(#{REGULAR_PARAMETER_NAME})=(#{VALUE})/
    EXTENDED_OTHER_NAME = /#{ATTRIBUTE}\*[1-9][0-9]*\*/
    EXTENDED_OTHER_VALUE = /%[0-9a-fA-F]{2}|#{ATTRIBUTE_CHAR}/
    EXTENDED_OTHER_PARAMETER = /(#{EXTENDED_OTHER_NAME})=(#{EXTENDED_OTHER_VALUE}*)/
    EXTENDED_INITIAL_NAME = /#{ATTRIBUTE}(?:\*0)?\*/
    EXTENDED_INITIAL_VALUE = /[a-zA-Z0-9\-]*'[a-zA-Z0-9\-]*'#{EXTENDED_OTHER_VALUE}*/
    EXTENDED_INITIAL_PARAMETER = /(#{EXTENDED_INITIAL_NAME})=(#{EXTENDED_INITIAL_VALUE})/
    EXTENDED_PARAMETER = /#{EXTENDED_INITIAL_PARAMETER}|#{EXTENDED_OTHER_PARAMETER}/
    DISPPARM = /;\s*(?:#{REGULAR_PARAMETER}|#{EXTENDED_PARAMETER})\s*/
    RFC2183 = /^#{CONDISP}(#{DISPPARM})+$/i

    class Parser
      BUFSIZE = 1_048_576
      TEXT_PLAIN = "text/plain"
      TEMPFILE_FACTORY = lambda { |filename, content_type|
        Tempfile.new(["RackMultipart", ::File.extname(filename.gsub("\0", '%00'))])
      }

      class BoundedIO # :nodoc:
        def initialize(io, content_length)
          @io             = io
          @content_length = content_length
          @cursor = 0
        end

        def read(size, outbuf = nil)
          return if @cursor >= @content_length

          left = @content_length - @cursor

          str = if left < size
                  @io.read left, outbuf
                else
                  @io.read size, outbuf
                end

          if str
            @cursor += str.bytesize
          else
            # Raise an error for mismatching content-length and actual contents
            raise EOFError, "bad content body"
          end

          str
        end
      end

      MultipartInfo = Struct.new :params, :tmp_files
      EMPTY         = MultipartInfo.new(nil, [])

      def self.parse_boundary(content_type)
        return unless content_type
        data = content_type.match(MULTIPART)
        return unless data
        data[1]
      end

      def self.parse(io, content_length, content_type, tmpfile, bufsize, qp)
        return EMPTY if 0 == content_length

        boundary = parse_boundary content_type
        return EMPTY unless boundary

        if boundary.length > 70
          # RFC 1521 Section 7.2.1 imposes a 70 character maximum for the boundary.
          # Most clients use no more than 55 characters.
          raise Error, "multipart boundary size too large (#{boundary.length} characters)"
        end

        io = BoundedIO.new(io, content_length) if content_length

        parser = new(boundary, tmpfile, bufsize, qp)
        parser.parse(io)

        parser.result
      end

      class Collector
        class MimePart < Struct.new(:body, :head, :filename, :content_type, :name)
          def get_data
            data = body
            if filename == ""
              # filename is blank which means no file has been selected
              return
            elsif filename
              body.rewind if body.respond_to?(:rewind)

              # Take the basename of the upload's original filename.
              # This handles the full Windows paths given by Internet Explorer
              # (and perhaps other broken user agents) without affecting
              # those which give the lone filename.
              fn = filename.split(/[\/\\]/).last

              data = { filename: fn, type: content_type,
                      name: name, tempfile: body, head: head }
            end

            yield data
          end
        end

        class BufferPart < MimePart
          def file?; false; end
          def close; end
        end

        class TempfilePart < MimePart
          def file?; true; end
          def close; body.close; end
        end

        include Enumerable

        def initialize(tempfile)
          @tempfile = tempfile
          @mime_parts = []
          @open_files = 0
        end

        def each
          @mime_parts.each { |part| yield part }
        end

        def on_mime_head(mime_index, head, filename, content_type, name)
          if filename
            body = @tempfile.call(filename, content_type)
            body.binmode if body.respond_to?(:binmode)
            klass = TempfilePart
            @open_files += 1
          else
            body = String.new
            klass = BufferPart
          end

          @mime_parts[mime_index] = klass.new(body, head, filename, content_type, name)

          check_part_limits
        end

        def on_mime_body(mime_index, content)
          @mime_parts[mime_index].body << content
        end

        def on_mime_finish(mime_index)
        end

        private

        def check_part_limits
          file_limit = Utils.multipart_file_limit
          part_limit = Utils.multipart_total_part_limit

          if file_limit && file_limit > 0
            if @open_files >= file_limit
              @mime_parts.each(&:close)
              raise MultipartPartLimitError, 'Maximum file multiparts in content reached'
            end
          end

          if part_limit && part_limit > 0
            if @mime_parts.size >= part_limit
              @mime_parts.each(&:close)
              raise MultipartTotalPartLimitError, 'Maximum total multiparts in content reached'
            end
          end
        end
      end

      attr_reader :state

      def initialize(boundary, tempfile, bufsize, query_parser)
        @query_parser   = query_parser
        @params         = query_parser.make_params
        @bufsize        = bufsize

        @state = :FAST_FORWARD
        @mime_index = 0
        @collector = Collector.new tempfile

        @sbuf = StringScanner.new("".dup)
        @body_regex = /(?:#{EOL}|\A)--#{Regexp.quote(boundary)}(?:#{EOL}|--)/m
        @rx_max_size = boundary.bytesize + 6 # (\r\n-- at start, either \r\n or -- at finish)
        @head_regex = /(.*?#{EOL})#{EOL}/m
      end

      def parse(io)
        outbuf = String.new
        read_data(io, outbuf)

        loop do
          status =
            case @state
            when :FAST_FORWARD
              handle_fast_forward
            when :CONSUME_TOKEN
              handle_consume_token
            when :MIME_HEAD
              handle_mime_head
            when :MIME_BODY
              handle_mime_body
            else # when :DONE
              return
            end

          read_data(io, outbuf) if status == :want_read
        end
      end

      def result
        @collector.each do |part|
          part.get_data do |data|
            tag_multipart_encoding(part.filename, part.content_type, part.name, data)
            @query_parser.normalize_params(@params, part.name, data)
          end
        end
        MultipartInfo.new @params.to_params_hash, @collector.find_all(&:file?).map(&:body)
      end

      private

      def dequote(str) # From WEBrick::HTTPUtils
        ret = (/\A"(.*)"\Z/ =~ str) ? $1 : str.dup
        ret.gsub!(/\\(.)/, "\\1")
        ret
      end

      def read_data(io, outbuf)
        content = io.read(@bufsize, outbuf)
        handle_empty_content!(content)
        @sbuf.concat(content)
      end

      # This handles the initial parser state.  We read until we find the starting
      # boundary, then we can transition to the next state. If we find the ending
      # boundary, this is an invalid multipart upload, but keep scanning for opening
      # boundary in that case. If no boundary found, we need to keep reading data
      # and retry. It's highly unlikely the initial read will not consume the
      # boundary.  The client would have to deliberately craft a response
      # with the opening boundary beyond the buffer size for that to happen.
      def handle_fast_forward
        while true
          case consume_boundary
          when :BOUNDARY
            # found opening boundary, transition to next state
            @state = :MIME_HEAD
            return
          when :END_BOUNDARY
            # invalid multipart upload, but retry for opening boundary
          else
            # no boundary found, keep reading data
            return :want_read
          end
        end
      end

      def handle_consume_token
        tok = consume_boundary
        # break if we're at the end of a buffer, but not if it is the end of a field
        @state = if tok == :END_BOUNDARY || (@sbuf.eos? && tok != :BOUNDARY)
          :DONE
        else
          :MIME_HEAD
        end
      end

      def handle_mime_head
        if @sbuf.scan_until(@head_regex)
          head = @sbuf[1]
          content_type = head[MULTIPART_CONTENT_TYPE, 1]
          if name = head[MULTIPART_CONTENT_DISPOSITION, 1]
            name = dequote(name)
          else
            name = head[MULTIPART_CONTENT_ID, 1]
          end

          filename = get_filename(head)

          if name.nil? || name.empty?
            name = filename || "#{content_type || TEXT_PLAIN}[]".dup
          end

          @collector.on_mime_head @mime_index, head, filename, content_type, name
          @state = :MIME_BODY
        else
          :want_read
        end
      end

      def handle_mime_body
        if (body_with_boundary = @sbuf.check_until(@body_regex)) # check but do not advance the pointer yet
          body = body_with_boundary.sub(/#{@body_regex}\z/m, '') # remove the boundary from the string
          @collector.on_mime_body @mime_index, body
          @sbuf.pos += body.length + 2 # skip \r\n after the content
          @state = :CONSUME_TOKEN
          @mime_index += 1
        else
          # Save what we have so far
          if @rx_max_size < @sbuf.rest_size
            delta = @sbuf.rest_size - @rx_max_size
            @collector.on_mime_body @mime_index, @sbuf.peek(delta)
            @sbuf.pos += delta
            @sbuf.string = @sbuf.rest
          end
          :want_read
        end
      end

      # Scan until the we find the start or end of the boundary.
      # If we find it, return the appropriate symbol for the start or
      # end of the boundary.  If we don't find the start or end of the
      # boundary, clear the buffer and return nil.
      def consume_boundary
        if read_buffer = @sbuf.scan_until(@body_regex)
          read_buffer.end_with?(EOL) ? :BOUNDARY : :END_BOUNDARY
        else
          @sbuf.terminate
          nil
        end
      end

      def get_filename(head)
        filename = nil
        case head
        when RFC2183
          params = Hash[*head.scan(DISPPARM).flat_map(&:compact)]

          if filename = params['filename*']
            encoding, _, filename = filename.split("'", 3)
          elsif filename = params['filename']
            filename = $1 if filename =~ /^"(.*)"$/
          end
        when BROKEN
          filename = $1
          filename = $1 if filename =~ /^"(.*)"$/
        end

        return unless filename

        if filename.scan(/%.?.?/).all? { |s| /%[0-9a-fA-F]{2}/.match?(s) }
          filename = Utils.unescape_path(filename)
        end

        filename.scrub!

        if filename !~ /\\[^\\"]/
          filename = filename.gsub(/\\(.)/, '\1')
        end

        if encoding
          filename.force_encoding ::Encoding.find(encoding)
        end

        filename
      end

      CHARSET = "charset"
      deprecate_constant :CHARSET

      def tag_multipart_encoding(filename, content_type, name, body)
        name = name.to_s
        encoding = Encoding::UTF_8

        name.force_encoding(encoding)

        return if filename

        if content_type
          list         = content_type.split(';')
          type_subtype = list.first
          type_subtype.strip!
          if TEXT_PLAIN == type_subtype
            rest = list.drop 1
            rest.each do |param|
              k, v = param.split('=', 2)
              k.strip!
              v.strip!
              v = v[1..-2] if v.start_with?('"') && v.end_with?('"')
              if k == "charset"
                encoding = begin
                  Encoding.find v
                rescue ArgumentError
                  Encoding::BINARY
                end
              end
            end
          end
        end

        name.force_encoding(encoding)
        body.force_encoding(encoding)
      end

      def handle_empty_content!(content)
        if content.nil? || content.empty?
          raise EmptyContentError
        end
      end
    end
  end
end
PK}$[�R�

.gems/gems/rack-3.0.8/lib/rack/mock_response.rbnu�[���# frozen_string_literal: true

require 'cgi/cookie'
require 'time'

require_relative 'response'

module Rack
  # Rack::MockResponse provides useful helpers for testing your apps.
  # Usually, you don't create the MockResponse on your own, but use
  # MockRequest.

  class MockResponse < Rack::Response
    class << self
      alias [] new
    end

    # Headers
    attr_reader :original_headers, :cookies

    # Errors
    attr_accessor :errors

    def initialize(status, headers, body, errors = nil)
      @original_headers = headers

      if errors
        @errors = errors.string if errors.respond_to?(:string)
      else
        @errors = ""
      end

      super(body, status, headers)

      @cookies = parse_cookies_from_header
      buffered_body!
    end

    def =~(other)
      body =~ other
    end

    def match(other)
      body.match other
    end

    def body
      return @buffered_body if defined?(@buffered_body)

      # FIXME: apparently users of MockResponse expect the return value of
      # MockResponse#body to be a string.  However, the real response object
      # returns the body as a list.
      #
      # See spec_showstatus.rb:
      #
      #   should "not replace existing messages" do
      #     ...
      #     res.body.should == "foo!"
      #   end
      buffer = @buffered_body = String.new

      @body.each do |chunk|
        buffer << chunk
      end

      return buffer
    end

    def empty?
      [201, 204, 304].include? status
    end

    def cookie(name)
      cookies.fetch(name, nil)
    end

    private

    def parse_cookies_from_header
      cookies = Hash.new
      if headers.has_key? 'set-cookie'
        set_cookie_header = headers.fetch('set-cookie')
        Array(set_cookie_header).each do |header_value|
          header_value.split("\n").each do |cookie|
            cookie_name, cookie_filling = cookie.split('=', 2)
            cookie_attributes = identify_cookie_attributes cookie_filling
            parsed_cookie = CGI::Cookie.new(
              'name' => cookie_name.strip,
              'value' => cookie_attributes.fetch('value'),
              'path' => cookie_attributes.fetch('path', nil),
              'domain' => cookie_attributes.fetch('domain', nil),
              'expires' => cookie_attributes.fetch('expires', nil),
              'secure' => cookie_attributes.fetch('secure', false)
            )
            cookies.store(cookie_name, parsed_cookie)
          end
        end
      end
      cookies
    end

    def identify_cookie_attributes(cookie_filling)
      cookie_bits = cookie_filling.split(';')
      cookie_attributes = Hash.new
      cookie_attributes.store('value', cookie_bits[0].strip)
      cookie_bits.drop(1).each do |bit|
        if bit.include? '='
          cookie_attribute, attribute_value = bit.split('=', 2)
          cookie_attributes.store(cookie_attribute.strip.downcase, attribute_value.strip)
        end
        if bit.include? 'secure'
          cookie_attributes.store('secure', true)
        end
      end

      if cookie_attributes.key? 'max-age'
        cookie_attributes.store('expires', Time.now + cookie_attributes['max-age'].to_i)
      elsif cookie_attributes.key? 'expires'
        cookie_attributes.store('expires', Time.httpdate(cookie_attributes['expires']))
      end

      cookie_attributes
    end

  end
end
PK}$[��||��0gems/gems/rack-3.0.8/lib/rack/conditional_get.rbnu�[���# frozen_string_literal: true

require_relative 'constants'
require_relative 'utils'
require_relative 'body_proxy'

module Rack

  # Middleware that enables conditional GET using if-none-match and
  # if-modified-since. The application should set either or both of the
  # last-modified or etag response headers according to RFC 2616. When
  # either of the conditions is met, the response body is set to be zero
  # length and the response status is set to 304 Not Modified.
  #
  # Applications that defer response body generation until the body's each
  # message is received will avoid response body generation completely when
  # a conditional GET matches.
  #
  # Adapted from Michael Klishin's Merb implementation:
  # https://github.com/wycats/merb/blob/master/merb-core/lib/merb-core/rack/middleware/conditional_get.rb
  class ConditionalGet
    def initialize(app)
      @app = app
    end

    # Return empty 304 response if the response has not been
    # modified since the last request.
    def call(env)
      case env[REQUEST_METHOD]
      when "GET", "HEAD"
        status, headers, body = response = @app.call(env)

        if status == 200 && fresh?(env, headers)
          response[0] = 304
          headers.delete(CONTENT_TYPE)
          headers.delete(CONTENT_LENGTH)
          response[2] = Rack::BodyProxy.new([]) do
            body.close if body.respond_to?(:close)
          end
        end
        response
      else
        @app.call(env)
      end
    end

  private

    # Return whether the response has not been modified since the
    # last request.
    def fresh?(env, headers)
      # if-none-match has priority over if-modified-since per RFC 7232
      if none_match = env['HTTP_IF_NONE_MATCH']
        etag_matches?(none_match, headers)
      elsif (modified_since = env['HTTP_IF_MODIFIED_SINCE']) && (modified_since = to_rfc2822(modified_since))
        modified_since?(modified_since, headers)
      end
    end

    # Whether the etag response header matches the if-none-match request header.
    # If so, the request has not been modified.
    def etag_matches?(none_match, headers)
      headers[ETAG] == none_match
    end

    # Whether the last-modified response header matches the if-modified-since
    # request header.  If so, the request has not been modified.
    def modified_since?(modified_since, headers)
      last_modified = to_rfc2822(headers['last-modified']) and
        modified_since >= last_modified
    end

    # Return a Time object for the given string (which should be in RFC2822
    # format), or nil if the string cannot be parsed.
    def to_rfc2822(since)
      # shortest possible valid date is the obsolete: 1 Nov 97 09:55 A
      # anything shorter is invalid, this avoids exceptions for common cases
      # most common being the empty string
      if since && since.length >= 16
        # NOTE: there is no trivial way to write this in a non exception way
        #   _rfc2822 returns a hash but is not that usable
        Time.rfc2822(since) rescue nil
      end
    end
  end
end
PK}$[@�j�	�	*gems/gems/rack-3.0.8/lib/rack/constants.rbnu�[���# frozen_string_literal: true

module Rack
  # Request env keys
  HTTP_HOST         = 'HTTP_HOST'
  HTTP_PORT         = 'HTTP_PORT'
  HTTPS             = 'HTTPS'
  PATH_INFO         = 'PATH_INFO'
  REQUEST_METHOD    = 'REQUEST_METHOD'
  REQUEST_PATH      = 'REQUEST_PATH'
  SCRIPT_NAME       = 'SCRIPT_NAME'
  QUERY_STRING      = 'QUERY_STRING'
  SERVER_PROTOCOL   = 'SERVER_PROTOCOL'
  SERVER_NAME       = 'SERVER_NAME'
  SERVER_PORT       = 'SERVER_PORT'
  HTTP_COOKIE       = 'HTTP_COOKIE'

  # Response Header Keys
  CACHE_CONTROL     = 'cache-control'
  CONTENT_LENGTH    = 'content-length'
  CONTENT_TYPE      = 'content-type'
  ETAG              = 'etag'
  EXPIRES           = 'expires'
  SET_COOKIE        = 'set-cookie'
  TRANSFER_ENCODING = 'transfer-encoding'

  # HTTP method verbs
  GET     = 'GET'
  POST    = 'POST'
  PUT     = 'PUT'
  PATCH   = 'PATCH'
  DELETE  = 'DELETE'
  HEAD    = 'HEAD'
  OPTIONS = 'OPTIONS'
  LINK    = 'LINK'
  UNLINK  = 'UNLINK'
  TRACE   = 'TRACE'

  # Rack environment variables
  RACK_VERSION                        = 'rack.version'
  RACK_TEMPFILES                      = 'rack.tempfiles'
  RACK_ERRORS                         = 'rack.errors'
  RACK_LOGGER                         = 'rack.logger'
  RACK_INPUT                          = 'rack.input'
  RACK_SESSION                        = 'rack.session'
  RACK_SESSION_OPTIONS                = 'rack.session.options'
  RACK_SHOWSTATUS_DETAIL              = 'rack.showstatus.detail'
  RACK_URL_SCHEME                     = 'rack.url_scheme'
  RACK_HIJACK                         = 'rack.hijack'
  RACK_IS_HIJACK                      = 'rack.hijack?'
  RACK_RECURSIVE_INCLUDE              = 'rack.recursive.include'
  RACK_MULTIPART_BUFFER_SIZE          = 'rack.multipart.buffer_size'
  RACK_MULTIPART_TEMPFILE_FACTORY     = 'rack.multipart.tempfile_factory'
  RACK_RESPONSE_FINISHED              = 'rack.response_finished'
  RACK_REQUEST_FORM_INPUT             = 'rack.request.form_input'
  RACK_REQUEST_FORM_HASH              = 'rack.request.form_hash'
  RACK_REQUEST_FORM_VARS              = 'rack.request.form_vars'
  RACK_REQUEST_FORM_ERROR             = 'rack.request.form_error'
  RACK_REQUEST_COOKIE_HASH            = 'rack.request.cookie_hash'
  RACK_REQUEST_COOKIE_STRING          = 'rack.request.cookie_string'
  RACK_REQUEST_QUERY_HASH             = 'rack.request.query_hash'
  RACK_REQUEST_QUERY_STRING           = 'rack.request.query_string'
  RACK_METHODOVERRIDE_ORIGINAL_METHOD = 'rack.methodoverride.original_method'
end
PK}$[��Y		(gems/gems/rack-3.0.8/lib/rack/cascade.rbnu�[���# frozen_string_literal: true

require_relative 'constants'

module Rack
  # Rack::Cascade tries a request on several apps, and returns the
  # first response that is not 404 or 405 (or in a list of configured
  # status codes).  If all applications tried return one of the configured
  # status codes, return the last response.

  class Cascade
    # deprecated, no longer used
    NotFound = [404, { CONTENT_TYPE => "text/plain" }, []]

    # An array of applications to try in order.
    attr_reader :apps

    # Set the apps to send requests to, and what statuses result in
    # cascading.  Arguments:
    #
    # apps: An enumerable of rack applications.
    # cascade_for: The statuses to use cascading for.  If a response is received
    #              from an app, the next app is tried.
    def initialize(apps, cascade_for = [404, 405])
      @apps = []
      apps.each { |app| add app }

      @cascade_for = {}
      [*cascade_for].each { |status| @cascade_for[status] = true }
    end

    # Call each app in order.  If the responses uses a status that requires
    # cascading, try the next app.  If all responses require cascading,
    # return the response from the last app.
    def call(env)
      return [404, { CONTENT_TYPE => "text/plain" }, []] if @apps.empty?
      result = nil
      last_body = nil

      @apps.each do |app|
        # The SPEC says that the body must be closed after it has been iterated
        # by the server, or if it is replaced by a middleware action. Cascade
        # replaces the body each time a cascade happens. It is assumed that nil
        # does not respond to close, otherwise the previous application body
        # will be closed. The final application body will not be closed, as it
        # will be passed to the server as a result.
        last_body.close if last_body.respond_to? :close

        result = app.call(env)
        return result unless @cascade_for.include?(result[0].to_i)
        last_body = result[2]
      end

      result
    end

    # Append an app to the list of apps to cascade.  This app will
    # be tried last.
    def add(app)
      @apps << app
    end

    # Whether the given app is one of the apps to cascade to.
    def include?(app)
      @apps.include?(app)
    end

    alias_method :<<, :add
  end
end
PK}$[�ʆ��6�60gems/gems/rack-3.0.8/lib/rack/show_exceptions.rbnu�[���# frozen_string_literal: true

require 'ostruct'
require 'erb'

require_relative 'constants'
require_relative 'utils'
require_relative 'request'

module Rack
  # Rack::ShowExceptions catches all exceptions raised from the app it
  # wraps.  It shows a useful backtrace with the sourcefile and
  # clickable context, the whole Rack environment and the request
  # data.
  #
  # Be careful when you use this on public-facing sites as it could
  # reveal information helpful to attackers.

  class ShowExceptions
    CONTEXT = 7

    def initialize(app)
      @app = app
    end

    def call(env)
      @app.call(env)
    rescue StandardError, LoadError, SyntaxError => e
      exception_string = dump_exception(e)

      env[RACK_ERRORS].puts(exception_string)
      env[RACK_ERRORS].flush

      if accepts_html?(env)
        content_type = "text/html"
        body = pretty(env, e)
      else
        content_type = "text/plain"
        body = exception_string
      end

      [
        500,
        {
          CONTENT_TYPE => content_type,
          CONTENT_LENGTH => body.bytesize.to_s,
        },
        [body],
      ]
    end

    def prefers_plaintext?(env)
      !accepts_html?(env)
    end

    def accepts_html?(env)
      Rack::Utils.best_q_match(env["HTTP_ACCEPT"], %w[text/html])
    end
    private :accepts_html?

    def dump_exception(exception)
      if exception.respond_to?(:detailed_message)
        message = exception.detailed_message(highlight: false)
      else
        message = exception.message
      end
      string = "#{exception.class}: #{message}\n".dup
      string << exception.backtrace.map { |l| "\t#{l}" }.join("\n")
      string
    end

    def pretty(env, exception)
      req = Rack::Request.new(env)

      # This double assignment is to prevent an "unused variable" warning.
      # Yes, it is dumb, but I don't like Ruby yelling at me.
      path = path = (req.script_name + req.path_info).squeeze("/")

      # This double assignment is to prevent an "unused variable" warning.
      # Yes, it is dumb, but I don't like Ruby yelling at me.
      frames = frames = exception.backtrace.map { |line|
        frame = OpenStruct.new
        if line =~ /(.*?):(\d+)(:in `(.*)')?/
          frame.filename = $1
          frame.lineno = $2.to_i
          frame.function = $4

          begin
            lineno = frame.lineno - 1
            lines = ::File.readlines(frame.filename)
            frame.pre_context_lineno = [lineno - CONTEXT, 0].max
            frame.pre_context = lines[frame.pre_context_lineno...lineno]
            frame.context_line = lines[lineno].chomp
            frame.post_context_lineno = [lineno + CONTEXT, lines.size].min
            frame.post_context = lines[lineno + 1..frame.post_context_lineno]
          rescue
          end

          frame
        else
          nil
        end
      }.compact

      template.result(binding)
    end

    def template
      TEMPLATE
    end

    def h(obj)                  # :nodoc:
      case obj
      when String
        Utils.escape_html(obj)
      else
        Utils.escape_html(obj.inspect)
      end
    end

    # :stopdoc:

    # adapted from Django <www.djangoproject.com>
    # Copyright (c) Django Software Foundation and individual contributors.
    # Used under the modified BSD license:
    # http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5
    TEMPLATE = ERB.new(<<-'HTML'.gsub(/^      /, ''))
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
      <html lang="en">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        <meta name="robots" content="NONE,NOARCHIVE" />
        <title><%=h exception.class %> at <%=h path %></title>
        <style type="text/css">
          html * { padding:0; margin:0; }
          body * { padding:10px 20px; }
          body * * { padding:0; }
          body { font:small sans-serif; }
          body>div { border-bottom:1px solid #ddd; }
          h1 { font-weight:normal; }
          h2 { margin-bottom:.8em; }
          h2 span { font-size:80%; color:#666; font-weight:normal; }
          h3 { margin:1em 0 .5em 0; }
          h4 { margin:0 0 .5em 0; font-weight: normal; }
          table {
              border:1px solid #ccc; border-collapse: collapse; background:white; }
          tbody td, tbody th { vertical-align:top; padding:2px 3px; }
          thead th {
              padding:1px 6px 1px 3px; background:#fefefe; text-align:left;
              font-weight:normal; font-size:11px; border:1px solid #ddd; }
          tbody th { text-align:right; color:#666; padding-right:.5em; }
          table.vars { margin:5px 0 2px 40px; }
          table.vars td, table.req td { font-family:monospace; }
          table td.code { width:100%;}
          table td.code div { overflow:hidden; }
          table.source th { color:#666; }
          table.source td {
              font-family:monospace; white-space:pre; border-bottom:1px solid #eee; }
          ul.traceback { list-style-type:none; }
          ul.traceback li.frame { margin-bottom:1em; }
          div.context { margin: 10px 0; }
          div.context ol {
              padding-left:30px; margin:0 10px; list-style-position: inside; }
          div.context ol li {
              font-family:monospace; white-space:pre; color:#666; cursor:pointer; }
          div.context ol.context-line li { color:black; background-color:#ccc; }
          div.context ol.context-line li span { float: right; }
          div.commands { margin-left: 40px; }
          div.commands a { color:black; text-decoration:none; }
          #summary { background: #ffc; }
          #summary h2 { font-family: monospace; font-weight: normal; color: #666; white-space: pre-wrap; }
          #summary ul#quicklinks { list-style-type: none; margin-bottom: 2em; }
          #summary ul#quicklinks li { float: left; padding: 0 1em; }
          #summary ul#quicklinks>li+li { border-left: 1px #666 solid; }
          #explanation { background:#eee; }
          #template, #template-not-exist { background:#f6f6f6; }
          #template-not-exist ul { margin: 0 0 0 20px; }
          #traceback { background:#eee; }
          #requestinfo { background:#f6f6f6; padding-left:120px; }
          #summary table { border:none; background:transparent; }
          #requestinfo h2, #requestinfo h3 { position:relative; margin-left:-100px; }
          #requestinfo h3 { margin-bottom:-1em; }
          .error { background: #ffc; }
          .specific { color:#cc3300; font-weight:bold; }
        </style>
        <script type="text/javascript">
        //<!--
          function getElementsByClassName(oElm, strTagName, strClassName){
              // Written by Jonathan Snook, http://www.snook.ca/jon;
              // Add-ons by Robert Nyman, http://www.robertnyman.com
              var arrElements = (strTagName == "*" && document.all)? document.all :
              oElm.getElementsByTagName(strTagName);
              var arrReturnElements = new Array();
              strClassName = strClassName.replace(/\-/g, "\\-");
              var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$$)");
              var oElement;
              for(var i=0; i<arrElements.length; i++){
                  oElement = arrElements[i];
                  if(oRegExp.test(oElement.className)){
                      arrReturnElements.push(oElement);
                  }
              }
              return (arrReturnElements)
          }
          function hideAll(elems) {
            for (var e = 0; e < elems.length; e++) {
              elems[e].style.display = 'none';
            }
          }
          window.onload = function() {
            hideAll(getElementsByClassName(document, 'table', 'vars'));
            hideAll(getElementsByClassName(document, 'ol', 'pre-context'));
            hideAll(getElementsByClassName(document, 'ol', 'post-context'));
          }
          function toggle() {
            for (var i = 0; i < arguments.length; i++) {
              var e = document.getElementById(arguments[i]);
              if (e) {
                e.style.display = e.style.display == 'none' ? 'block' : 'none';
              }
            }
            return false;
          }
          function varToggle(link, id) {
            toggle('v' + id);
            var s = link.getElementsByTagName('span')[0];
            var uarr = String.fromCharCode(0x25b6);
            var darr = String.fromCharCode(0x25bc);
            s.innerHTML = s.innerHTML == uarr ? darr : uarr;
            return false;
          }
          //-->
        </script>
      </head>
      <body>

      <div id="summary">
        <h1><%=h exception.class %> at <%=h path %></h1>
      <% if exception.respond_to?(:detailed_message) %>
        <h2><%=h exception.detailed_message(highlight: false) %></h2>
      <% else %>
        <h2><%=h exception.message %></h2>
      <% end %>
        <table><tr>
          <th>Ruby</th>
          <td>
      <% if first = frames.first %>
            <code><%=h first.filename %></code>: in <code><%=h first.function %></code>, line <%=h frames.first.lineno %>
      <% else %>
            unknown location
      <% end %>
          </td>
        </tr><tr>
          <th>Web</th>
          <td><code><%=h req.request_method %> <%=h(req.host + path)%></code></td>
        </tr></table>

        <h3>Jump to:</h3>
        <ul id="quicklinks">
          <li><a href="#get-info">GET</a></li>
          <li><a href="#post-info">POST</a></li>
          <li><a href="#cookie-info">Cookies</a></li>
          <li><a href="#env-info">ENV</a></li>
        </ul>
      </div>

      <div id="traceback">
        <h2>Traceback <span>(innermost first)</span></h2>
        <ul class="traceback">
      <% frames.each { |frame| %>
            <li class="frame">
              <code><%=h frame.filename %></code>: in <code><%=h frame.function %></code>

                <% if frame.context_line %>
                <div class="context" id="c<%=h frame.object_id %>">
                    <% if frame.pre_context %>
                    <ol start="<%=h frame.pre_context_lineno+1 %>" class="pre-context" id="pre<%=h frame.object_id %>">
                      <% frame.pre_context.each { |line| %>
                      <li onclick="toggle('pre<%=h frame.object_id %>', 'post<%=h frame.object_id %>')"><%=h line %></li>
                      <% } %>
                    </ol>
                    <% end %>

                  <ol start="<%=h frame.lineno %>" class="context-line">
                    <li onclick="toggle('pre<%=h frame.object_id %>', 'post<%=h frame.object_id %>')"><%=h frame.context_line %><span>...</span></li></ol>

                    <% if frame.post_context %>
                    <ol start='<%=h frame.lineno+1 %>' class="post-context" id="post<%=h frame.object_id %>">
                      <% frame.post_context.each { |line| %>
                      <li onclick="toggle('pre<%=h frame.object_id %>', 'post<%=h frame.object_id %>')"><%=h line %></li>
                      <% } %>
                    </ol>
                    <% end %>
                </div>
                <% end %>
            </li>
      <% } %>
        </ul>
      </div>

      <div id="requestinfo">
        <h2>Request information</h2>

        <h3 id="get-info">GET</h3>
        <% if req.GET and not req.GET.empty? %>
          <table class="req">
            <thead>
              <tr>
                <th>Variable</th>
                <th>Value</th>
              </tr>
            </thead>
            <tbody>
                <% req.GET.sort_by { |k, v| k.to_s }.each { |key, val| %>
                <tr>
                  <td><%=h key %></td>
                  <td class="code"><div><%=h val.inspect %></div></td>
                </tr>
                <% } %>
            </tbody>
          </table>
        <% else %>
          <p>No GET data.</p>
        <% end %>

        <h3 id="post-info">POST</h3>
        <% if ((req.POST and not req.POST.empty?) rescue (no_post_data = "Invalid POST data"; nil)) %>
          <table class="req">
            <thead>
              <tr>
                <th>Variable</th>
                <th>Value</th>
              </tr>
            </thead>
            <tbody>
                <% req.POST.sort_by { |k, v| k.to_s }.each { |key, val| %>
                <tr>
                  <td><%=h key %></td>
                  <td class="code"><div><%=h val.inspect %></div></td>
                </tr>
                <% } %>
            </tbody>
          </table>
        <% else %>
          <p><%= no_post_data || "No POST data" %>.</p>
        <% end %>


        <h3 id="cookie-info">COOKIES</h3>
        <% unless req.cookies.empty? %>
          <table class="req">
            <thead>
              <tr>
                <th>Variable</th>
                <th>Value</th>
              </tr>
            </thead>
            <tbody>
              <% req.cookies.each { |key, val| %>
                <tr>
                  <td><%=h key %></td>
                  <td class="code"><div><%=h val.inspect %></div></td>
                </tr>
              <% } %>
            </tbody>
          </table>
        <% else %>
          <p>No cookie data.</p>
        <% end %>

        <h3 id="env-info">Rack ENV</h3>
          <table class="req">
            <thead>
              <tr>
                <th>Variable</th>
                <th>Value</th>
              </tr>
            </thead>
            <tbody>
                <% env.sort_by { |k, v| k.to_s }.each { |key, val| %>
                <tr>
                  <td><%=h key %></td>
                  <td class="code"><div><%=h val.inspect %></div></td>
                </tr>
                <% } %>
            </tbody>
          </table>

      </div>

      <div id="explanation">
        <p>
          You're seeing this error because you use <code>Rack::ShowExceptions</code>.
        </p>
      </div>

      </body>
      </html>
    HTML

    # :startdoc:
  end
end
PK}$[O�~�*gems/gems/rack-3.0.8/lib/rack/recursive.rbnu�[���# frozen_string_literal: true

require 'uri'

require_relative 'constants'

module Rack
  # Rack::ForwardRequest gets caught by Rack::Recursive and redirects
  # the current request to the app at +url+.
  #
  #   raise ForwardRequest.new("/not-found")
  #

  class ForwardRequest < Exception
    attr_reader :url, :env

    def initialize(url, env = {})
      @url = URI(url)
      @env = env

      @env[PATH_INFO]       = @url.path
      @env[QUERY_STRING]    = @url.query  if @url.query
      @env[HTTP_HOST]       = @url.host   if @url.host
      @env[HTTP_PORT]       = @url.port   if @url.port
      @env[RACK_URL_SCHEME] = @url.scheme if @url.scheme

      super "forwarding to #{url}"
    end
  end

  # Rack::Recursive allows applications called down the chain to
  # include data from other applications (by using
  # <tt>rack['rack.recursive.include'][...]</tt> or raise a
  # ForwardRequest to redirect internally.

  class Recursive
    def initialize(app)
      @app = app
    end

    def call(env)
      dup._call(env)
    end

    def _call(env)
      @script_name = env[SCRIPT_NAME]
      @app.call(env.merge(RACK_RECURSIVE_INCLUDE => method(:include)))
    rescue ForwardRequest => req
      call(env.merge(req.env))
    end

    def include(env, path)
      unless path.index(@script_name) == 0 && (path[@script_name.size] == ?/ ||
                                               path[@script_name.size].nil?)
        raise ArgumentError, "can only include below #{@script_name}, not #{path}"
      end

      env = env.merge(PATH_INFO => path,
                      SCRIPT_NAME => @script_name,
                      REQUEST_METHOD => GET,
                      "CONTENT_LENGTH" => "0", "CONTENT_TYPE" => "",
                      RACK_INPUT => StringIO.new(""))
      @app.call(env)
    end
  end
end
PK}$[YY�d

0gems/gems/rack-3.0.8/lib/rack/tempfile_reaper.rbnu�[���# frozen_string_literal: true

require_relative 'constants'
require_relative 'body_proxy'

module Rack

  # Middleware tracks and cleans Tempfiles created throughout a request (i.e. Rack::Multipart)
  # Ideas/strategy based on posts by Eric Wong and Charles Oliver Nutter
  # https://groups.google.com/forum/#!searchin/rack-devel/temp/rack-devel/brK8eh-MByw/sw61oJJCGRMJ
  class TempfileReaper
    def initialize(app)
      @app = app
    end

    def call(env)
      env[RACK_TEMPFILES] ||= []

      begin
        _, _, body = response = @app.call(env)
      rescue Exception
        env[RACK_TEMPFILES]&.each(&:close!)
        raise
      end

      response[2] = BodyProxy.new(body) do
        env[RACK_TEMPFILES]&.each(&:close!)
      end

      response
    end
  end
end
PK}$[��;�~~1gems/gems/rack-3.0.8/lib/rack/rewindable_input.rbnu�[���# -*- encoding: binary -*-
# frozen_string_literal: true

require 'tempfile'

require_relative 'constants'

module Rack
  # Class which can make any IO object rewindable, including non-rewindable ones. It does
  # this by buffering the data into a tempfile, which is rewindable.
  #
  # Don't forget to call #close when you're done. This frees up temporary resources that
  # RewindableInput uses, though it does *not* close the original IO object.
  class RewindableInput
    # Makes rack.input rewindable, for compatibility with applications and middleware
    # designed for earlier versions of Rack (where rack.input was required to be
    # rewindable).
    class Middleware
      def initialize(app)
        @app = app
      end

      def call(env)
        env[RACK_INPUT] = RewindableInput.new(env[RACK_INPUT])
        @app.call(env)
      end
    end

    def initialize(io)
      @io = io
      @rewindable_io = nil
      @unlinked = false
    end

    def gets
      make_rewindable unless @rewindable_io
      @rewindable_io.gets
    end

    def read(*args)
      make_rewindable unless @rewindable_io
      @rewindable_io.read(*args)
    end

    def each(&block)
      make_rewindable unless @rewindable_io
      @rewindable_io.each(&block)
    end

    def rewind
      make_rewindable unless @rewindable_io
      @rewindable_io.rewind
    end

    def size
      make_rewindable unless @rewindable_io
      @rewindable_io.size
    end

    # Closes this RewindableInput object without closing the originally
    # wrapped IO object. Cleans up any temporary resources that this RewindableInput
    # has created.
    #
    # This method may be called multiple times. It does nothing on subsequent calls.
    def close
      if @rewindable_io
        if @unlinked
          @rewindable_io.close
        else
          @rewindable_io.close!
        end
        @rewindable_io = nil
      end
    end

    private

    def make_rewindable
      # Buffer all data into a tempfile. Since this tempfile is private to this
      # RewindableInput object, we chmod it so that nobody else can read or write
      # it. On POSIX filesystems we also unlink the file so that it doesn't
      # even have a file entry on the filesystem anymore, though we can still
      # access it because we have the file handle open.
      @rewindable_io = Tempfile.new('RackRewindableInput')
      @rewindable_io.chmod(0000)
      @rewindable_io.set_encoding(Encoding::BINARY)
      @rewindable_io.binmode
      # :nocov:
      if filesystem_has_posix_semantics?
        raise 'Unlink failed. IO closed.' if @rewindable_io.closed?
        @unlinked = true
      end
      # :nocov:

      buffer = "".dup
      while @io.read(1024 * 4, buffer)
        entire_buffer_written_out = false
        while !entire_buffer_written_out
          written = @rewindable_io.write(buffer)
          entire_buffer_written_out = written == buffer.bytesize
          if !entire_buffer_written_out
            buffer.slice!(0 .. written - 1)
          end
        end
      end
      @rewindable_io.rewind
    end

    def filesystem_has_posix_semantics?
      RUBY_PLATFORM !~ /(mswin|mingw|cygwin|java)/
    end
  end
end
PK}$[Y4��88)gems/gems/rack-3.0.8/lib/rack/sendfile.rbnu�[���# frozen_string_literal: true

require_relative 'constants'
require_relative 'utils'
require_relative 'body_proxy'

module Rack

  # = Sendfile
  #
  # The Sendfile middleware intercepts responses whose body is being
  # served from a file and replaces it with a server specific x-sendfile
  # header. The web server is then responsible for writing the file contents
  # to the client. This can dramatically reduce the amount of work required
  # by the Ruby backend and takes advantage of the web server's optimized file
  # delivery code.
  #
  # In order to take advantage of this middleware, the response body must
  # respond to +to_path+ and the request must include an x-sendfile-type
  # header. Rack::Files and other components implement +to_path+ so there's
  # rarely anything you need to do in your application. The x-sendfile-type
  # header is typically set in your web servers configuration. The following
  # sections attempt to document
  #
  # === Nginx
  #
  # Nginx supports the x-accel-redirect header. This is similar to x-sendfile
  # but requires parts of the filesystem to be mapped into a private URL
  # hierarchy.
  #
  # The following example shows the Nginx configuration required to create
  # a private "/files/" area, enable x-accel-redirect, and pass the special
  # x-sendfile-type and x-accel-mapping headers to the backend:
  #
  #   location ~ /files/(.*) {
  #     internal;
  #     alias /var/www/$1;
  #   }
  #
  #   location / {
  #     proxy_redirect     off;
  #
  #     proxy_set_header   Host                $host;
  #     proxy_set_header   X-Real-IP           $remote_addr;
  #     proxy_set_header   X-Forwarded-For     $proxy_add_x_forwarded_for;
  #
  #     proxy_set_header   x-sendfile-type     x-accel-redirect;
  #     proxy_set_header   x-accel-mapping     /var/www/=/files/;
  #
  #     proxy_pass         http://127.0.0.1:8080/;
  #   }
  #
  # Note that the x-sendfile-type header must be set exactly as shown above.
  # The x-accel-mapping header should specify the location on the file system,
  # followed by an equals sign (=), followed name of the private URL pattern
  # that it maps to. The middleware performs a simple substitution on the
  # resulting path.
  #
  # See Also: https://www.nginx.com/resources/wiki/start/topics/examples/xsendfile
  #
  # === lighttpd
  #
  # Lighttpd has supported some variation of the x-sendfile header for some
  # time, although only recent version support x-sendfile in a reverse proxy
  # configuration.
  #
  #   $HTTP["host"] == "example.com" {
  #      proxy-core.protocol = "http"
  #      proxy-core.balancer = "round-robin"
  #      proxy-core.backends = (
  #        "127.0.0.1:8000",
  #        "127.0.0.1:8001",
  #        ...
  #      )
  #
  #      proxy-core.allow-x-sendfile = "enable"
  #      proxy-core.rewrite-request = (
  #        "x-sendfile-type" => (".*" => "x-sendfile")
  #      )
  #    }
  #
  # See Also: http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModProxyCore
  #
  # === Apache
  #
  # x-sendfile is supported under Apache 2.x using a separate module:
  #
  # https://tn123.org/mod_xsendfile/
  #
  # Once the module is compiled and installed, you can enable it using
  # XSendFile config directive:
  #
  #   RequestHeader Set x-sendfile-type x-sendfile
  #   ProxyPassReverse / http://localhost:8001/
  #   XSendFile on
  #
  # === Mapping parameter
  #
  # The third parameter allows for an overriding extension of the
  # x-accel-mapping header. Mappings should be provided in tuples of internal to
  # external. The internal values may contain regular expression syntax, they
  # will be matched with case indifference.

  class Sendfile
    def initialize(app, variation = nil, mappings = [])
      @app = app
      @variation = variation
      @mappings = mappings.map do |internal, external|
        [/^#{internal}/i, external]
      end
    end

    def call(env)
      _, headers, body = response = @app.call(env)

      if body.respond_to?(:to_path)
        case type = variation(env)
        when /x-accel-redirect/i
          path = ::File.expand_path(body.to_path)
          if url = map_accel_path(env, path)
            headers[CONTENT_LENGTH] = '0'
            # '?' must be percent-encoded because it is not query string but a part of path
            headers[type.downcase] = ::Rack::Utils.escape_path(url).gsub('?', '%3F')
            obody = body
            response[2] = Rack::BodyProxy.new([]) do
              obody.close if obody.respond_to?(:close)
            end
          else
            env[RACK_ERRORS].puts "x-accel-mapping header missing"
          end
        when /x-sendfile|x-lighttpd-send-file/i
          path = ::File.expand_path(body.to_path)
          headers[CONTENT_LENGTH] = '0'
          headers[type.downcase] = path
          obody = body
          response[2] = Rack::BodyProxy.new([]) do
            obody.close if obody.respond_to?(:close)
          end
        when '', nil
        else
          env[RACK_ERRORS].puts "Unknown x-sendfile variation: '#{type}'.\n"
        end
      end
      response
    end

    private
    def variation(env)
      @variation ||
        env['sendfile.type'] ||
        env['HTTP_X_SENDFILE_TYPE']
    end

    def map_accel_path(env, path)
      if mapping = @mappings.find { |internal, _| internal =~ path }
        path.sub(*mapping)
      elsif mapping = env['HTTP_X_ACCEL_MAPPING']
        mapping.split(',').map(&:strip).each do |m|
          internal, external = m.split('=', 2).map(&:strip)
          new_path = path.sub(/^#{internal}/i, external)
          return new_path unless path == new_path
        end
        path
      end
    end
  end
end
PK}$[M�}Y??%gems/gems/rack-3.0.8/lib/rack/mock.rbnu�[���# frozen_string_literal: true

require_relative 'mock_request'
PK}$[�d�P��'gems/gems/rack-3.0.8/lib/rack/logger.rbnu�[���# frozen_string_literal: true

require 'logger'

require_relative 'constants'

module Rack
  # Sets up rack.logger to write to rack.errors stream
  class Logger
    def initialize(app, level = ::Logger::INFO)
      @app, @level = app, level
    end

    def call(env)
      logger = ::Logger.new(env[RACK_ERRORS])
      logger.level = @level

      env[RACK_LOGGER] = logger
      @app.call(env)
    end
  end
end
PK}$[U``"��*gems/gems/rack-3.0.8/lib/rack/multipart.rbnu�[���# frozen_string_literal: true

require_relative 'constants'
require_relative 'utils'

require_relative 'multipart/parser'
require_relative 'multipart/generator'

module Rack
  # A multipart form data parser, adapted from IOWA.
  #
  # Usually, Rack::Request#POST takes care of calling this.
  module Multipart
    MULTIPART_BOUNDARY = "AaB03x"

    class << self
      def parse_multipart(env, params = Rack::Utils.default_query_parser)
        io = env[RACK_INPUT]

        if content_length = env['CONTENT_LENGTH']
          content_length = content_length.to_i
        end

        content_type = env['CONTENT_TYPE']

        tempfile = env[RACK_MULTIPART_TEMPFILE_FACTORY] || Parser::TEMPFILE_FACTORY
        bufsize = env[RACK_MULTIPART_BUFFER_SIZE] || Parser::BUFSIZE

        info = Parser.parse(io, content_length, content_type, tempfile, bufsize, params)
        env[RACK_TEMPFILES] = info.tmp_files

        return info.params
      end

      def extract_multipart(request, params = Rack::Utils.default_query_parser)
        parse_multipart(request.env)
      end

      def build_multipart(params, first = true)
        Generator.new(params, first).dump
      end
    end
  end
end
PK}$[�
C�xx.gems/gems/rack-3.0.8/lib/rack/common_logger.rbnu�[���# frozen_string_literal: true

require_relative 'constants'
require_relative 'utils'
require_relative 'body_proxy'
require_relative 'request'

module Rack
  # Rack::CommonLogger forwards every request to the given +app+, and
  # logs a line in the
  # {Apache common log format}[http://httpd.apache.org/docs/1.3/logs.html#common]
  # to the configured logger.
  class CommonLogger
    # Common Log Format: http://httpd.apache.org/docs/1.3/logs.html#common
    #
    #   lilith.local - - [07/Aug/2006 23:58:02 -0400] "GET / HTTP/1.1" 500 -
    #
    #   %{%s - %s [%s] "%s %s%s %s" %d %s\n} %
    #
    # The actual format is slightly different than the above due to the
    # separation of SCRIPT_NAME and PATH_INFO, and because the elapsed
    # time in seconds is included at the end.
    FORMAT = %{%s - %s [%s] "%s %s%s%s %s" %d %s %0.4f\n}

    # +logger+ can be any object that supports the +write+ or +<<+ methods,
    # which includes the standard library Logger.  These methods are called
    # with a single string argument, the log message.
    # If +logger+ is nil, CommonLogger will fall back <tt>env['rack.errors']</tt>.
    def initialize(app, logger = nil)
      @app = app
      @logger = logger
    end

    # Log all requests in common_log format after a response has been
    # returned.  Note that if the app raises an exception, the request
    # will not be logged, so if exception handling middleware are used,
    # they should be loaded after this middleware.  Additionally, because
    # the logging happens after the request body has been fully sent, any
    # exceptions raised during the sending of the response body will
    # cause the request not to be logged.
    def call(env)
      began_at = Utils.clock_time
      status, headers, body = response = @app.call(env)

      response[2] = BodyProxy.new(body) { log(env, status, headers, began_at) }
      response
    end

    private

    # Log the request to the configured logger.
    def log(env, status, response_headers, began_at)
      request = Rack::Request.new(env)
      length = extract_content_length(response_headers)

      msg = sprintf(FORMAT,
        request.ip || "-",
        request.get_header("REMOTE_USER") || "-",
        Time.now.strftime("%d/%b/%Y:%H:%M:%S %z"),
        request.request_method,
        request.script_name,
        request.path_info,
        request.query_string.empty? ? "" : "?#{request.query_string}",
        request.get_header(SERVER_PROTOCOL),
        status.to_s[0..3],
        length,
        Utils.clock_time - began_at)

      msg.gsub!(/[^[:print:]\n]/) { |c| sprintf("\\x%x", c.ord) }

      logger = @logger || request.get_header(RACK_ERRORS)
      # Standard library logger doesn't support write but it supports << which actually
      # calls to write on the log device without formatting
      if logger.respond_to?(:write)
        logger.write(msg)
      else
        logger << msg
      end
    end

    # Attempt to determine the content length for the response to
    # include it in the logged data.
    def extract_content_length(headers)
      value = headers[CONTENT_LENGTH]
      !value || value.to_s == '0' ? '-' : value
    end
  end
end
PK}$[>Sf?"?"(gems/gems/rack-3.0.8/lib/rack/builder.rbnu�[���# frozen_string_literal: true

require_relative 'urlmap'

module Rack
  # Rack::Builder provides a domain-specific language (DSL) to construct Rack
  # applications. It is primarily used to parse +config.ru+ files which
  # instantiate several middleware and a final application which are hosted
  # by a Rack-compatible web server.
  #
  # Example:
  #
  #   app = Rack::Builder.new do
  #     use Rack::CommonLogger
  #     map "/ok" do
  #       run lambda { |env| [200, {'content-type' => 'text/plain'}, ['OK']] }
  #     end
  #   end
  #
  #   run app
  #
  # Or
  #
  #   app = Rack::Builder.app do
  #     use Rack::CommonLogger
  #     run lambda { |env| [200, {'content-type' => 'text/plain'}, ['OK']] }
  #   end
  #
  #   run app
  #
  # +use+ adds middleware to the stack, +run+ dispatches to an application.
  # You can use +map+ to construct a Rack::URLMap in a convenient way.
  class Builder

    # https://stackoverflow.com/questions/2223882/whats-the-difference-between-utf-8-and-utf-8-without-bom
    UTF_8_BOM = '\xef\xbb\xbf'

    # Parse the given config file to get a Rack application.
    #
    # If the config file ends in +.ru+, it is treated as a
    # rackup file and the contents will be treated as if
    # specified inside a Rack::Builder block.
    #
    # If the config file does not end in +.ru+, it is
    # required and Rack will use the basename of the file
    # to guess which constant will be the Rack application to run.
    #
    # Examples:
    #
    #   Rack::Builder.parse_file('config.ru')
    #   # Rack application built using Rack::Builder.new
    #
    #   Rack::Builder.parse_file('app.rb')
    #   # requires app.rb, which can be anywhere in Ruby's
    #   # load path. After requiring, assumes App constant
    #   # contains Rack application
    #
    #   Rack::Builder.parse_file('./my_app.rb')
    #   # requires ./my_app.rb, which should be in the
    #   # process's current directory.  After requiring,
    #   # assumes MyApp constant contains Rack application
    def self.parse_file(path)
      if path.end_with?('.ru')
        return self.load_file(path)
      else
        require path
        return Object.const_get(::File.basename(path, '.rb').split('_').map(&:capitalize).join(''))
      end
    end

    # Load the given file as a rackup file, treating the
    # contents as if specified inside a Rack::Builder block.
    #
    # Ignores content in the file after +__END__+, so that
    # use of +__END__+ will not result in a syntax error.
    #
    # Example config.ru file:
    #
    #   $ cat config.ru
    #
    #   use Rack::ContentLength
    #   require './app.rb'
    #   run App
    def self.load_file(path)
      config = ::File.read(path)
      config.slice!(/\A#{UTF_8_BOM}/) if config.encoding == Encoding::UTF_8

      if config[/^#\\(.*)/]
        fail "Parsing options from the first comment line is no longer supported: #{path}"
      end

      config.sub!(/^__END__\n.*\Z/m, '')

      return new_from_string(config, path)
    end

    # Evaluate the given +builder_script+ string in the context of
    # a Rack::Builder block, returning a Rack application.
    def self.new_from_string(builder_script, file = "(rackup)")
      # We want to build a variant of TOPLEVEL_BINDING with self as a Rack::Builder instance.
      # We cannot use instance_eval(String) as that would resolve constants differently.
      binding, builder = TOPLEVEL_BINDING.eval('Rack::Builder.new.instance_eval { [binding, self] }')
      eval builder_script, binding, file

      return builder.to_app
    end

    # Initialize a new Rack::Builder instance.  +default_app+ specifies the
    # default application if +run+ is not called later.  If a block
    # is given, it is evaluated in the context of the instance.
    def initialize(default_app = nil, &block)
      @use = []
      @map = nil
      @run = default_app
      @warmup = nil
      @freeze_app = false

      instance_eval(&block) if block_given?
    end

    # Create a new Rack::Builder instance and return the Rack application
    # generated from it.
    def self.app(default_app = nil, &block)
      self.new(default_app, &block).to_app
    end

    # Specifies middleware to use in a stack.
    #
    #   class Middleware
    #     def initialize(app)
    #       @app = app
    #     end
    #
    #     def call(env)
    #       env["rack.some_header"] = "setting an example"
    #       @app.call(env)
    #     end
    #   end
    #
    #   use Middleware
    #   run lambda { |env| [200, { "content-type" => "text/plain" }, ["OK"]] }
    #
    # All requests through to this application will first be processed by the middleware class.
    # The +call+ method in this example sets an additional environment key which then can be
    # referenced in the application if required.
    def use(middleware, *args, &block)
      if @map
        mapping, @map = @map, nil
        @use << proc { |app| generate_map(app, mapping) }
      end
      @use << proc { |app| middleware.new(app, *args, &block) }
    end
    # :nocov:
    ruby2_keywords(:use) if respond_to?(:ruby2_keywords, true)
    # :nocov:

    # Takes a block or argument that is an object that responds to #call and
    # returns a Rack response.
    #
    # You can use a block:
    #
    #   run do |env|
    #     [200, { "content-type" => "text/plain" }, ["Hello World!"]]
    #   end
    #
    # You can also provide a lambda:
    #
    #   run lambda { |env| [200, { "content-type" => "text/plain" }, ["OK"]] }
    #
    # You can also provide a class instance:
    #
    #   class Heartbeat
    #     def call(env)
    #      [200, { "content-type" => "text/plain" }, ["OK"]]
    #     end
    #   end
    #
    #   run Heartbeat.new
    #
    def run(app = nil, &block)
      raise ArgumentError, "Both app and block given!" if app && block_given?

      @run = app || block
    end

    # Takes a lambda or block that is used to warm-up the application. This block is called
    # before the Rack application is returned by to_app.
    #
    #   warmup do |app|
    #     client = Rack::MockRequest.new(app)
    #     client.get('/')
    #   end
    #
    #   use SomeMiddleware
    #   run MyApp
    def warmup(prc = nil, &block)
      @warmup = prc || block
    end

    # Creates a route within the application.  Routes under the mapped path will be sent to
    # the Rack application specified by run inside the block.  Other requests will be sent to the
    # default application specified by run outside the block.
    #
    #   class App
    #     def call(env)
    #       [200, {'content-type' => 'text/plain'}, ["Hello World"]]
    #     end
    #   end
    #
    #   class Heartbeat
    #     def call(env)
    #       [200, { "content-type" => "text/plain" }, ["OK"]]
    #     end
    #   end
    #
    #   app = Rack::Builder.app do
    #     map '/heartbeat' do
    #       run Heartbeat.new
    #     end
    #     run App.new
    #   end
    #
    #   run app
    #
    # The +use+ method can also be used inside the block to specify middleware to run under a specific path:
    #
    #   app = Rack::Builder.app do
    #     map '/heartbeat' do
    #       use Middleware
    #       run Heartbeat.new
    #     end
    #     run App.new
    #   end
    #
    # This example includes a piece of middleware which will run before +/heartbeat+ requests hit +Heartbeat+.
    #
    # Note that providing a +path+ of +/+ will ignore any default application given in a +run+ statement
    # outside the block.
    def map(path, &block)
      @map ||= {}
      @map[path] = block
    end

    # Freeze the app (set using run) and all middleware instances when building the application
    # in to_app.
    def freeze_app
      @freeze_app = true
    end

    # Return the Rack application generated by this instance.
    def to_app
      app = @map ? generate_map(@run, @map) : @run
      fail "missing run or map statement" unless app
      app.freeze if @freeze_app
      app = @use.reverse.inject(app) { |a, e| e[a].tap { |x| x.freeze if @freeze_app } }
      @warmup.call(app) if @warmup
      app
    end

    # Call the Rack application generated by this builder instance. Note that
    # this rebuilds the Rack application and runs the warmup code (if any)
    # every time it is called, so it should not be used if performance is important.
    def call(env)
      to_app.call(env)
    end

    private

    # Generate a URLMap instance by generating new Rack applications for each
    # map block in this instance.
    def generate_map(default_app, mapping)
      mapped = default_app ? { '/' => default_app } : {}
      mapping.each { |r, b| mapped[r] = self.class.new(default_app, &b).to_app }
      URLMap.new(mapped)
    end
  end
end
PK}$[����0gems/gems/rack-3.0.8/lib/rack/auth/digest/md5.rbnu�[���require_relative '../digest'
PK}$[����4gems/gems/rack-3.0.8/lib/rack/auth/digest/request.rbnu�[���require_relative '../digest'
PK}$[����2gems/gems/rack-3.0.8/lib/rack/auth/digest/nonce.rbnu�[���require_relative '../digest'
PK}$[����3gems/gems/rack-3.0.8/lib/rack/auth/digest/params.rbnu�[���require_relative '../digest'
PK}$[���

,gems/gems/rack-3.0.8/lib/rack/auth/digest.rbnu�[���# frozen_string_literal: true

require_relative 'abstract/handler'
require_relative 'abstract/request'
require 'digest/md5'
require 'base64'

module Rack
  warn "Rack::Auth::Digest is deprecated and will be removed in Rack 3.1", uplevel: 1

  module Auth
    module Digest
      # Rack::Auth::Digest::Nonce is the default nonce generator for the
      # Rack::Auth::Digest::MD5 authentication handler.
      #
      # +private_key+ needs to set to a constant string.
      #
      # +time_limit+ can be optionally set to an integer (number of seconds),
      # to limit the validity of the generated nonces.

      class Nonce

        class << self
          attr_accessor :private_key, :time_limit
        end

        def self.parse(string)
          new(*Base64.decode64(string).split(' ', 2))
        end

        def initialize(timestamp = Time.now, given_digest = nil)
          @timestamp, @given_digest = timestamp.to_i, given_digest
        end

        def to_s
          Base64.encode64("#{@timestamp} #{digest}").strip
        end

        def digest
          ::Digest::MD5.hexdigest("#{@timestamp}:#{self.class.private_key}")
        end

        def valid?
          digest == @given_digest
        end

        def stale?
          !self.class.time_limit.nil? && (Time.now.to_i - @timestamp) > self.class.time_limit
        end

        def fresh?
          !stale?
        end

      end

      class Params < Hash

        def self.parse(str)
          Params[*split_header_value(str).map do |param|
            k, v = param.split('=', 2)
            [k, dequote(v)]
          end.flatten]
        end

        def self.dequote(str) # From WEBrick::HTTPUtils
          ret = (/\A"(.*)"\Z/ =~ str) ? $1 : str.dup
          ret.gsub!(/\\(.)/, "\\1")
          ret
        end

        def self.split_header_value(str)
          str.scan(/\w+\=(?:"[^\"]+"|[^,]+)/n)
        end

        def initialize
          super()

          yield self if block_given?
        end

        def [](k)
          super k.to_s
        end

        def []=(k, v)
          super k.to_s, v.to_s
        end

        UNQUOTED = ['nc', 'stale']

        def to_s
          map do |k, v|
            "#{k}=#{(UNQUOTED.include?(k) ? v.to_s : quote(v))}"
          end.join(', ')
        end

        def quote(str) # From WEBrick::HTTPUtils
          '"' + str.gsub(/[\\\"]/o, "\\\1") + '"'
        end

      end

      class Request < Auth::AbstractRequest
        def method
          @env[RACK_METHODOVERRIDE_ORIGINAL_METHOD] || @env[REQUEST_METHOD]
        end

        def digest?
          "digest" == scheme
        end

        def correct_uri?
          request.fullpath == uri
        end

        def nonce
          @nonce ||= Nonce.parse(params['nonce'])
        end

        def params
          @params ||= Params.parse(parts.last)
        end

        def respond_to?(sym, *)
          super or params.has_key? sym.to_s
        end

        def method_missing(sym, *args)
          return super unless params.has_key?(key = sym.to_s)
          return params[key] if args.size == 0
          raise ArgumentError, "wrong number of arguments (#{args.size} for 0)"
        end
      end

      # Rack::Auth::Digest::MD5 implements the MD5 algorithm version of
      # HTTP Digest Authentication, as per RFC 2617.
      #
      # Initialize with the [Rack] application that you want protecting,
      # and a block that looks up a plaintext password for a given username.
      #
      # +opaque+ needs to be set to a constant base64/hexadecimal string.
      #
      class MD5 < AbstractHandler

        attr_accessor :opaque

        attr_writer :passwords_hashed

        def initialize(app, realm = nil, opaque = nil, &authenticator)
          @passwords_hashed = nil
          if opaque.nil? and realm.respond_to? :values_at
            realm, opaque, @passwords_hashed = realm.values_at :realm, :opaque, :passwords_hashed
          end
          super(app, realm, &authenticator)
          @opaque = opaque
        end

        def passwords_hashed?
          !!@passwords_hashed
        end

        def call(env)
          auth = Request.new(env)

          unless auth.provided?
            return unauthorized
          end

          if !auth.digest? || !auth.correct_uri? || !valid_qop?(auth)
            return bad_request
          end

          if valid?(auth)
            if auth.nonce.stale?
              return unauthorized(challenge(stale: true))
            else
              env['REMOTE_USER'] = auth.username

              return @app.call(env)
            end
          end

          unauthorized
        end


        private

        QOP = 'auth'

        def params(hash = {})
          Params.new do |params|
            params['realm'] = realm
            params['nonce'] = Nonce.new.to_s
            params['opaque'] = H(opaque)
            params['qop'] = QOP

            hash.each { |k, v| params[k] = v }
          end
        end

        def challenge(hash = {})
          "Digest #{params(hash)}"
        end

        def valid?(auth)
          valid_opaque?(auth) && valid_nonce?(auth) && valid_digest?(auth)
        end

        def valid_qop?(auth)
          QOP == auth.qop
        end

        def valid_opaque?(auth)
          H(opaque) == auth.opaque
        end

        def valid_nonce?(auth)
          auth.nonce.valid?
        end

        def valid_digest?(auth)
          pw = @authenticator.call(auth.username)
          pw && Rack::Utils.secure_compare(digest(auth, pw), auth.response)
        end

        def md5(data)
          ::Digest::MD5.hexdigest(data)
        end

        alias :H :md5

        def KD(secret, data)
          H "#{secret}:#{data}"
        end

        def A1(auth, password)
          "#{auth.username}:#{auth.realm}:#{password}"
        end

        def A2(auth)
          "#{auth.method}:#{auth.uri}"
        end

        def digest(auth, password)
          password_hash = passwords_hashed? ? password : H(A1(auth, password))

          KD password_hash, "#{auth.nonce}:#{auth.nc}:#{auth.cnonce}:#{QOP}:#{H A2(auth)}"
        end

      end
    end
  end
end

PK}$[�����+gems/gems/rack-3.0.8/lib/rack/auth/basic.rbnu�[���# frozen_string_literal: true

require_relative 'abstract/handler'
require_relative 'abstract/request'
require 'base64'

module Rack
  module Auth
    # Rack::Auth::Basic implements HTTP Basic Authentication, as per RFC 2617.
    #
    # Initialize with the Rack application that you want protecting,
    # and a block that checks if a username and password pair are valid.

    class Basic < AbstractHandler

      def call(env)
        auth = Basic::Request.new(env)

        return unauthorized unless auth.provided?

        return bad_request unless auth.basic?

        if valid?(auth)
          env['REMOTE_USER'] = auth.username

          return @app.call(env)
        end

        unauthorized
      end


      private

      def challenge
        'Basic realm="%s"' % realm
      end

      def valid?(auth)
        @authenticator.call(*auth.credentials)
      end

      class Request < Auth::AbstractRequest
        def basic?
          "basic" == scheme && credentials.length == 2
        end

        def credentials
          @credentials ||= Base64.decode64(params).split(':', 2)
        end

        def username
          credentials.first
        end
      end

    end
  end
end
PK}$[,��UU6gems/gems/rack-3.0.8/lib/rack/auth/abstract/request.rbnu�[���# frozen_string_literal: true

require_relative '../../request'

module Rack
  module Auth
    class AbstractRequest

      def initialize(env)
        @env = env
      end

      def request
        @request ||= Request.new(@env)
      end

      def provided?
        !authorization_key.nil? && valid?
      end

      def valid?
        !@env[authorization_key].nil?
      end

      def parts
        @parts ||= @env[authorization_key].split(' ', 2)
      end

      def scheme
        @scheme ||= parts.first&.downcase
      end

      def params
        @params ||= parts.last
      end


      private

      AUTHORIZATION_KEYS = ['HTTP_AUTHORIZATION', 'X-HTTP_AUTHORIZATION', 'X_HTTP_AUTHORIZATION']

      def authorization_key
        @authorization_key ||= AUTHORIZATION_KEYS.detect { |key| @env.has_key?(key) }
      end

    end

  end
end
PK}$[l��GRR6gems/gems/rack-3.0.8/lib/rack/auth/abstract/handler.rbnu�[���# frozen_string_literal: true

require_relative '../../constants'

module Rack
  module Auth
    # Rack::Auth::AbstractHandler implements common authentication functionality.
    #
    # +realm+ should be set for all handlers.

    class AbstractHandler

      attr_accessor :realm

      def initialize(app, realm = nil, &authenticator)
        @app, @realm, @authenticator = app, realm, authenticator
      end


      private

      def unauthorized(www_authenticate = challenge)
        return [ 401,
          { CONTENT_TYPE => 'text/plain',
            CONTENT_LENGTH => '0',
            'www-authenticate' => www_authenticate.to_s },
          []
        ]
      end

      def bad_request
        return [ 400,
          { CONTENT_TYPE => 'text/plain',
            CONTENT_LENGTH => '0' },
          []
        ]
      end

    end
  end
end
PK}$[��՝[�[�%gems/gems/rack-3.0.8/lib/rack/lint.rbnuȯ��# frozen_string_literal: true

require 'forwardable'

require_relative 'constants'
require_relative 'utils'

module Rack
  # Rack::Lint validates your application and the requests and
  # responses according to the Rack spec.

  class Lint
    def initialize(app)
      @app = app
    end

    # :stopdoc:

    class LintError < RuntimeError; end
    # AUTHORS: n.b. The trailing whitespace between paragraphs is important and
    # should not be removed. The whitespace creates paragraphs in the RDoc
    # output.
    #
    ## This specification aims to formalize the Rack protocol. You
    ## can (and should) use Rack::Lint to enforce it.
    ##
    ## When you develop middleware, be sure to add a Lint before and
    ## after to catch all mistakes.
    ##
    ## = Rack applications
    ##
    ## A Rack application is a Ruby object (not a class) that
    ## responds to +call+.
    def call(env = nil)
      Wrapper.new(@app, env).response
    end

    class Wrapper
      def initialize(app, env)
        @app = app
        @env = env
        @response = nil
        @head_request = false

        @status = nil
        @headers = nil
        @body = nil
        @invoked = nil
        @content_length = nil
        @closed = false
        @size = 0
      end

      def response
        ## It takes exactly one argument, the *environment*
        raise LintError, "No env given" unless @env
        check_environment(@env)

        @env[RACK_INPUT] = InputWrapper.new(@env[RACK_INPUT])
        @env[RACK_ERRORS] = ErrorWrapper.new(@env[RACK_ERRORS])

        ## and returns a non-frozen Array of exactly three values:
        @response = @app.call(@env)
        raise LintError, "response is not an Array, but #{@response.class}" unless @response.kind_of? Array
        raise LintError, "response is frozen" if @response.frozen?
        raise LintError, "response array has #{@response.size} elements instead of 3" unless @response.size == 3

        @status, @headers, @body = @response
        ## The *status*,
        check_status(@status)

        ## the *headers*,
        check_headers(@headers)

        hijack_proc = check_hijack_response(@headers, @env)
        if hijack_proc
          @headers[RACK_HIJACK] = hijack_proc
        end

        ## and the *body*.
        check_content_type(@status, @headers)
        check_content_length(@status, @headers)
        @head_request = @env[REQUEST_METHOD] == HEAD

        @lint = (@env['rack.lint'] ||= []) << self

        if (@env['rack.lint.body_iteration'] ||= 0) > 0
          raise LintError, "Middleware must not call #each directly"
        end

        return [@status, @headers, self]
      end

      ##
      ## == The Environment
      ##
      def check_environment(env)
        ## The environment must be an unfrozen instance of Hash that includes
        ## CGI-like headers. The Rack application is free to modify the
        ## environment.
        raise LintError, "env #{env.inspect} is not a Hash, but #{env.class}" unless env.kind_of? Hash
        raise LintError, "env should not be frozen, but is" if env.frozen?

        ##
        ## The environment is required to include these variables
        ## (adopted from {PEP 333}[https://peps.python.org/pep-0333/]), except when they'd be empty, but see
        ## below.

        ## <tt>REQUEST_METHOD</tt>:: The HTTP request method, such as
        ##                           "GET" or "POST". This cannot ever
        ##                           be an empty string, and so is
        ##                           always required.

        ## <tt>SCRIPT_NAME</tt>:: The initial portion of the request
        ##                        URL's "path" that corresponds to the
        ##                        application object, so that the
        ##                        application knows its virtual
        ##                        "location". This may be an empty
        ##                        string, if the application corresponds
        ##                        to the "root" of the server.

        ## <tt>PATH_INFO</tt>:: The remainder of the request URL's
        ##                      "path", designating the virtual
        ##                      "location" of the request's target
        ##                      within the application. This may be an
        ##                      empty string, if the request URL targets
        ##                      the application root and does not have a
        ##                      trailing slash. This value may be
        ##                      percent-encoded when originating from
        ##                      a URL.

        ## <tt>QUERY_STRING</tt>:: The portion of the request URL that
        ##                         follows the <tt>?</tt>, if any. May be
        ##                         empty, but is always required!

        ## <tt>SERVER_NAME</tt>:: When combined with <tt>SCRIPT_NAME</tt> and
        ##                        <tt>PATH_INFO</tt>, these variables can be
        ##                        used to complete the URL. Note, however,
        ##                        that <tt>HTTP_HOST</tt>, if present,
        ##                        should be used in preference to
        ##                        <tt>SERVER_NAME</tt> for reconstructing
        ##                        the request URL.
        ##                        <tt>SERVER_NAME</tt> can never be an empty
        ##                        string, and so is always required.

        ## <tt>SERVER_PORT</tt>:: An optional +Integer+ which is the port the
        ##                        server is running on. Should be specified if
        ##                        the server is running on a non-standard port.

        ## <tt>SERVER_PROTOCOL</tt>:: A string representing the HTTP version used
        ##                            for the request.

        ## <tt>HTTP_</tt> Variables:: Variables corresponding to the
        ##                            client-supplied HTTP request
        ##                            headers (i.e., variables whose
        ##                            names begin with <tt>HTTP_</tt>). The
        ##                            presence or absence of these
        ##                            variables should correspond with
        ##                            the presence or absence of the
        ##                            appropriate HTTP header in the
        ##                            request. See
        ##                            {RFC3875 section 4.1.18}[https://tools.ietf.org/html/rfc3875#section-4.1.18]
        ##                            for specific behavior.

        ## In addition to this, the Rack environment must include these
        ## Rack-specific variables:

        ## <tt>rack.url_scheme</tt>:: +http+ or +https+, depending on the
        ##                            request URL.

        ## <tt>rack.input</tt>:: See below, the input stream.

        ## <tt>rack.errors</tt>:: See below, the error stream.

        ## <tt>rack.hijack?</tt>:: See below, if present and true, indicates
        ##                         that the server supports partial hijacking.

        ## <tt>rack.hijack</tt>:: See below, if present, an object responding
        ##                        to +call+ that is used to perform a full
        ##                        hijack.

        ## Additional environment specifications have approved to
        ## standardized middleware APIs. None of these are required to
        ## be implemented by the server.

        ## <tt>rack.session</tt>:: A hash-like interface for storing
        ##                         request session data.
        ##                         The store must implement:
        if session = env[RACK_SESSION]
          ##                         store(key, value)         (aliased as []=);
          unless session.respond_to?(:store) && session.respond_to?(:[]=)
            raise LintError, "session #{session.inspect} must respond to store and []="
          end

          ##                         fetch(key, default = nil) (aliased as []);
          unless session.respond_to?(:fetch) && session.respond_to?(:[])
            raise LintError, "session #{session.inspect} must respond to fetch and []"
          end

          ##                         delete(key);
          unless session.respond_to?(:delete)
            raise LintError, "session #{session.inspect} must respond to delete"
          end

          ##                         clear;
          unless session.respond_to?(:clear)
            raise LintError, "session #{session.inspect} must respond to clear"
          end

          ##                         to_hash (returning unfrozen Hash instance);
          unless session.respond_to?(:to_hash) && session.to_hash.kind_of?(Hash) && !session.to_hash.frozen?
            raise LintError, "session #{session.inspect} must respond to to_hash and return unfrozen Hash instance"
          end
        end

        ## <tt>rack.logger</tt>:: A common object interface for logging messages.
        ##                        The object must implement:
        if logger = env[RACK_LOGGER]
          ##                         info(message, &block)
          unless logger.respond_to?(:info)
            raise LintError, "logger #{logger.inspect} must respond to info"
          end

          ##                         debug(message, &block)
          unless logger.respond_to?(:debug)
            raise LintError, "logger #{logger.inspect} must respond to debug"
          end

          ##                         warn(message, &block)
          unless logger.respond_to?(:warn)
            raise LintError, "logger #{logger.inspect} must respond to warn"
          end

          ##                         error(message, &block)
          unless logger.respond_to?(:error)
            raise LintError, "logger #{logger.inspect} must respond to error"
          end

          ##                         fatal(message, &block)
          unless logger.respond_to?(:fatal)
            raise LintError, "logger #{logger.inspect} must respond to fatal"
          end
        end

        ## <tt>rack.multipart.buffer_size</tt>:: An Integer hint to the multipart parser as to what chunk size to use for reads and writes.
        if bufsize = env[RACK_MULTIPART_BUFFER_SIZE]
          unless bufsize.is_a?(Integer) && bufsize > 0
            raise LintError, "rack.multipart.buffer_size must be an Integer > 0 if specified"
          end
        end

        ## <tt>rack.multipart.tempfile_factory</tt>:: An object responding to #call with two arguments, the filename and content_type given for the multipart form field, and returning an IO-like object that responds to #<< and optionally #rewind. This factory will be used to instantiate the tempfile for each multipart form file upload field, rather than the default class of Tempfile.
        if tempfile_factory = env[RACK_MULTIPART_TEMPFILE_FACTORY]
          raise LintError, "rack.multipart.tempfile_factory must respond to #call" unless tempfile_factory.respond_to?(:call)
          env[RACK_MULTIPART_TEMPFILE_FACTORY] = lambda do |filename, content_type|
            io = tempfile_factory.call(filename, content_type)
            raise LintError, "rack.multipart.tempfile_factory return value must respond to #<<" unless io.respond_to?(:<<)
            io
          end
        end

        ## The server or the application can store their own data in the
        ## environment, too.  The keys must contain at least one dot,
        ## and should be prefixed uniquely.  The prefix <tt>rack.</tt>
        ## is reserved for use with the Rack core distribution and other
        ## accepted specifications and must not be used otherwise.
        ##

        %w[REQUEST_METHOD SERVER_NAME QUERY_STRING SERVER_PROTOCOL
           rack.input rack.errors].each { |header|
          raise LintError, "env missing required key #{header}" unless env.include? header
        }

        ## The <tt>SERVER_PORT</tt> must be an Integer if set.
        server_port = env["SERVER_PORT"]
        unless server_port.nil? || (Integer(server_port) rescue false)
          raise LintError, "env[SERVER_PORT] is not an Integer"
        end

        ## The <tt>SERVER_NAME</tt> must be a valid authority as defined by RFC7540.
        unless (URI.parse("http://#{env[SERVER_NAME]}/") rescue false)
          raise LintError, "#{env[SERVER_NAME]} must be a valid authority"
        end

        ## The <tt>HTTP_HOST</tt> must be a valid authority as defined by RFC7540.
        unless (URI.parse("http://#{env[HTTP_HOST]}/") rescue false)
          raise LintError, "#{env[HTTP_HOST]} must be a valid authority"
        end

        ## The <tt>SERVER_PROTOCOL</tt> must match the regexp <tt>HTTP/\d(\.\d)?</tt>.
        server_protocol = env['SERVER_PROTOCOL']
        unless %r{HTTP/\d(\.\d)?}.match?(server_protocol)
          raise LintError, "env[SERVER_PROTOCOL] does not match HTTP/\\d(\\.\\d)?"
        end

        ## If the <tt>HTTP_VERSION</tt> is present, it must equal the <tt>SERVER_PROTOCOL</tt>.
        if env['HTTP_VERSION'] && env['HTTP_VERSION'] != server_protocol
          raise LintError, "env[HTTP_VERSION] does not equal env[SERVER_PROTOCOL]"
        end

        ## The environment must not contain the keys
        ## <tt>HTTP_CONTENT_TYPE</tt> or <tt>HTTP_CONTENT_LENGTH</tt>
        ## (use the versions without <tt>HTTP_</tt>).
        %w[HTTP_CONTENT_TYPE HTTP_CONTENT_LENGTH].each { |header|
          if env.include? header
            raise LintError, "env contains #{header}, must use #{header[5..-1]}"
          end
        }

        ## The CGI keys (named without a period) must have String values.
        ## If the string values for CGI keys contain non-ASCII characters,
        ## they should use ASCII-8BIT encoding.
        env.each { |key, value|
          next  if key.include? "."   # Skip extensions
          unless value.kind_of? String
            raise LintError, "env variable #{key} has non-string value #{value.inspect}"
          end
          next if value.encoding == Encoding::ASCII_8BIT
          unless value.b !~ /[\x80-\xff]/n
            raise LintError, "env variable #{key} has value containing non-ASCII characters and has non-ASCII-8BIT encoding #{value.inspect} encoding: #{value.encoding}"
          end
        }

        ## There are the following restrictions:

        ## * <tt>rack.url_scheme</tt> must either be +http+ or +https+.
        unless %w[http https].include?(env[RACK_URL_SCHEME])
          raise LintError, "rack.url_scheme unknown: #{env[RACK_URL_SCHEME].inspect}"
        end

        ## * There must be a valid input stream in <tt>rack.input</tt>.
        check_input env[RACK_INPUT]
        ## * There must be a valid error stream in <tt>rack.errors</tt>.
        check_error env[RACK_ERRORS]
        ## * There may be a valid hijack callback in <tt>rack.hijack</tt>
        check_hijack env

        ## * The <tt>REQUEST_METHOD</tt> must be a valid token.
        unless env[REQUEST_METHOD] =~ /\A[0-9A-Za-z!\#$%&'*+.^_`|~-]+\z/
          raise LintError, "REQUEST_METHOD unknown: #{env[REQUEST_METHOD].dump}"
        end

        ## * The <tt>SCRIPT_NAME</tt>, if non-empty, must start with <tt>/</tt>
        if env.include?(SCRIPT_NAME) && env[SCRIPT_NAME] != "" && env[SCRIPT_NAME] !~ /\A\//
          raise LintError, "SCRIPT_NAME must start with /"
        end
        ## * The <tt>PATH_INFO</tt>, if non-empty, must start with <tt>/</tt>
        if env.include?(PATH_INFO) && env[PATH_INFO] != "" && env[PATH_INFO] !~ /\A\//
          raise LintError, "PATH_INFO must start with /"
        end
        ## * The <tt>CONTENT_LENGTH</tt>, if given, must consist of digits only.
        if env.include?("CONTENT_LENGTH") && env["CONTENT_LENGTH"] !~ /\A\d+\z/
          raise LintError, "Invalid CONTENT_LENGTH: #{env["CONTENT_LENGTH"]}"
        end

        ## * One of <tt>SCRIPT_NAME</tt> or <tt>PATH_INFO</tt> must be
        ##   set. <tt>PATH_INFO</tt> should be <tt>/</tt> if
        ##   <tt>SCRIPT_NAME</tt> is empty.
        unless env[SCRIPT_NAME] || env[PATH_INFO]
          raise LintError, "One of SCRIPT_NAME or PATH_INFO must be set (make PATH_INFO '/' if SCRIPT_NAME is empty)"
        end
        ##   <tt>SCRIPT_NAME</tt> never should be <tt>/</tt>, but instead be empty.
        unless env[SCRIPT_NAME] != "/"
          raise LintError, "SCRIPT_NAME cannot be '/', make it '' and PATH_INFO '/'"
        end

        ## <tt>rack.response_finished</tt>:: An array of callables run by the server after the response has been
        ## processed. This would typically be invoked after sending the response to the client, but it could also be
        ## invoked if an error occurs while generating the response or sending the response; in that case, the error
        ## argument will be a subclass of +Exception+.
        ## The callables are invoked with +env, status, headers, error+ arguments and should not raise any
        ## exceptions. They should be invoked in reverse order of registration.
        if callables = env[RACK_RESPONSE_FINISHED]
          raise LintError, "rack.response_finished must be an array of callable objects" unless callables.is_a?(Array)

          callables.each do |callable|
            raise LintError, "rack.response_finished values must respond to call(env, status, headers, error)" unless callable.respond_to?(:call)
          end
        end
      end

      ##
      ## === The Input Stream
      ##
      ## The input stream is an IO-like object which contains the raw HTTP
      ## POST data.
      def check_input(input)
        ## When applicable, its external encoding must be "ASCII-8BIT" and it
        ## must be opened in binary mode, for Ruby 1.9 compatibility.
        if input.respond_to?(:external_encoding) && input.external_encoding != Encoding::ASCII_8BIT
          raise LintError, "rack.input #{input} does not have ASCII-8BIT as its external encoding"
        end
        if input.respond_to?(:binmode?) && !input.binmode?
          raise LintError, "rack.input #{input} is not opened in binary mode"
        end

        ## The input stream must respond to +gets+, +each+, and +read+.
        [:gets, :each, :read].each { |method|
          unless input.respond_to? method
            raise LintError, "rack.input #{input} does not respond to ##{method}"
          end
        }
      end

      class InputWrapper
        def initialize(input)
          @input = input
        end

        ## * +gets+ must be called without arguments and return a string,
        ##   or +nil+ on EOF.
        def gets(*args)
          raise LintError, "rack.input#gets called with arguments" unless args.size == 0
          v = @input.gets
          unless v.nil? or v.kind_of? String
            raise LintError, "rack.input#gets didn't return a String"
          end
          v
        end

        ## * +read+ behaves like IO#read.
        ##   Its signature is <tt>read([length, [buffer]])</tt>.
        ##
        ##   If given, +length+ must be a non-negative Integer (>= 0) or +nil+,
        ##   and +buffer+ must be a String and may not be nil.
        ##
        ##   If +length+ is given and not nil, then this method reads at most
        ##   +length+ bytes from the input stream.
        ##
        ##   If +length+ is not given or nil, then this method reads
        ##   all data until EOF.
        ##
        ##   When EOF is reached, this method returns nil if +length+ is given
        ##   and not nil, or "" if +length+ is not given or is nil.
        ##
        ##   If +buffer+ is given, then the read data will be placed
        ##   into +buffer+ instead of a newly created String object.
        def read(*args)
          unless args.size <= 2
            raise LintError, "rack.input#read called with too many arguments"
          end
          if args.size >= 1
            unless args.first.kind_of?(Integer) || args.first.nil?
              raise LintError, "rack.input#read called with non-integer and non-nil length"
            end
            unless args.first.nil? || args.first >= 0
              raise LintError, "rack.input#read called with a negative length"
            end
          end
          if args.size >= 2
            unless args[1].kind_of?(String)
              raise LintError, "rack.input#read called with non-String buffer"
            end
          end

          v = @input.read(*args)

          unless v.nil? or v.kind_of? String
            raise LintError, "rack.input#read didn't return nil or a String"
          end
          if args[0].nil?
            unless !v.nil?
              raise LintError, "rack.input#read(nil) returned nil on EOF"
            end
          end

          v
        end

        ## * +each+ must be called without arguments and only yield Strings.
        def each(*args)
          raise LintError, "rack.input#each called with arguments" unless args.size == 0
          @input.each { |line|
            unless line.kind_of? String
              raise LintError, "rack.input#each didn't yield a String"
            end
            yield line
          }
        end

        ## * +close+ can be called on the input stream to indicate that the
        ## any remaining input is not needed.
        def close(*args)
          @input.close(*args)
        end
      end

      ##
      ## === The Error Stream
      ##
      def check_error(error)
        ## The error stream must respond to +puts+, +write+ and +flush+.
        [:puts, :write, :flush].each { |method|
          unless error.respond_to? method
            raise LintError, "rack.error #{error} does not respond to ##{method}"
          end
        }
      end

      class ErrorWrapper
        def initialize(error)
          @error = error
        end

        ## * +puts+ must be called with a single argument that responds to +to_s+.
        def puts(str)
          @error.puts str
        end

        ## * +write+ must be called with a single argument that is a String.
        def write(str)
          raise LintError, "rack.errors#write not called with a String" unless str.kind_of? String
          @error.write str
        end

        ## * +flush+ must be called without arguments and must be called
        ##   in order to make the error appear for sure.
        def flush
          @error.flush
        end

        ## * +close+ must never be called on the error stream.
        def close(*args)
          raise LintError, "rack.errors#close must not be called"
        end
      end

      ##
      ## === Hijacking
      ##
      ## The hijacking interfaces provides a means for an application to take
      ## control of the HTTP connection. There are two distinct hijack
      ## interfaces: full hijacking where the application takes over the raw
      ## connection, and partial hijacking where the application takes over
      ## just the response body stream. In both cases, the application is
      ## responsible for closing the hijacked stream.
      ##
      ## Full hijacking only works with HTTP/1. Partial hijacking is functionally
      ## equivalent to streaming bodies, and is still optionally supported for
      ## backwards compatibility with older Rack versions.
      ##
      ## ==== Full Hijack
      ##
      ## Full hijack is used to completely take over an HTTP/1 connection. It
      ## occurs before any headers are written and causes the request to
      ## ignores any response generated by the application.
      ##
      ## It is intended to be used when applications need access to raw HTTP/1
      ## connection.
      ##
      def check_hijack(env)
        ## If +rack.hijack+ is present in +env+, it must respond to +call+
        if original_hijack = env[RACK_HIJACK]
          raise LintError, "rack.hijack must respond to call" unless original_hijack.respond_to?(:call)

          env[RACK_HIJACK] = proc do
            io = original_hijack.call

            ## and return an +IO+ instance which can be used to read and write
            ## to the underlying connection using HTTP/1 semantics and
            ## formatting.
            raise LintError, "rack.hijack must return an IO instance" unless io.is_a?(IO)

            io
          end
        end
      end

      ##
      ## ==== Partial Hijack
      ##
      ## Partial hijack is used for bi-directional streaming of the request and
      ## response body. It occurs after the status and headers are written by
      ## the server and causes the server to ignore the Body of the response.
      ##
      ## It is intended to be used when applications need bi-directional
      ## streaming.
      ##
      def check_hijack_response(headers, env)
        ## If +rack.hijack?+ is present in +env+ and truthy,
        if env[RACK_IS_HIJACK]
          ## an application may set the special response header +rack.hijack+
          if original_hijack = headers[RACK_HIJACK]
            ## to an object that responds to +call+,
            unless original_hijack.respond_to?(:call)
              raise LintError, 'rack.hijack header must respond to #call'
            end
            ## accepting a +stream+ argument.
            return proc do |io|
              original_hijack.call StreamWrapper.new(io)
            end
          end
          ##
          ## After the response status and headers have been sent, this hijack
          ## callback will be invoked with a +stream+ argument which follows the
          ## same interface as outlined in "Streaming Body". Servers must
          ## ignore the +body+ part of the response tuple when the
          ## +rack.hijack+ response header is present. Using an empty +Array+
          ## instance is recommended.
        else
          ##
          ## The special response header +rack.hijack+ must only be set
          ## if the request +env+ has a truthy +rack.hijack?+.
          if headers.key?(RACK_HIJACK)
            raise LintError, 'rack.hijack header must not be present if server does not support hijacking'
          end
        end

        nil
      end

      ## == The Response
      ##
      ## === The Status
      ##
      def check_status(status)
        ## This is an HTTP status. It must be an Integer greater than or equal to
        ## 100.
        unless status.is_a?(Integer) && status >= 100
          raise LintError, "Status must be an Integer >=100"
        end
      end

      ##
      ## === The Headers
      ##
      def check_headers(headers)
        ## The headers must be a unfrozen Hash.
        unless headers.kind_of?(Hash)
          raise LintError, "headers object should be a hash, but isn't (got #{headers.class} as headers)"
        end

        if headers.frozen?
          raise LintError, "headers object should not be frozen, but is"
        end

        headers.each do |key, value|
          ## The header keys must be Strings.
          unless key.kind_of? String
            raise LintError, "header key must be a string, was #{key.class}"
          end

          ## Special headers starting "rack." are for communicating with the
          ## server, and must not be sent back to the client.
          next if key.start_with?("rack.")

          ## The header must not contain a +Status+ key.
          raise LintError, "header must not contain status" if key == "status"
          ## Header keys must conform to RFC7230 token specification, i.e. cannot
          ## contain non-printable ASCII, DQUOTE or "(),/:;<=>?@[\]{}".
          raise LintError, "invalid header name: #{key}" if key =~ /[\(\),\/:;<=>\?@\[\\\]{}[:cntrl:]]/
          ## Header keys must not contain uppercase ASCII characters (A-Z).
          raise LintError, "uppercase character in header name: #{key}" if key =~ /[A-Z]/

          ## Header values must be either a String instance,
          if value.kind_of?(String)
            check_header_value(key, value)
          elsif value.kind_of?(Array)
            ## or an Array of String instances,
            value.each{|value| check_header_value(key, value)}
          else
            raise LintError, "a header value must be a String or Array of Strings, but the value of '#{key}' is a #{value.class}"
          end
        end
      end

      def check_header_value(key, value)
        ## such that each String instance must not contain characters below 037.
        if value =~ /[\000-\037]/
          raise LintError, "invalid header value #{key}: #{value.inspect}"
        end
      end

      ##
      ## === The content-type
      ##
      def check_content_type(status, headers)
        headers.each { |key, value|
          ## There must not be a <tt>content-type</tt> header key when the +Status+ is 1xx,
          ## 204, or 304.
          if key == "content-type"
            if Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.key? status.to_i
              raise LintError, "content-type header found in #{status} response, not allowed"
            end
            return
          end
        }
      end

      ##
      ## === The content-length
      ##
      def check_content_length(status, headers)
        headers.each { |key, value|
          if key == 'content-length'
            ## There must not be a <tt>content-length</tt> header key when the
            ## +Status+ is 1xx, 204, or 304.
            if Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.key? status.to_i
              raise LintError, "content-length header found in #{status} response, not allowed"
            end
            @content_length = value
          end
        }
      end

      def verify_content_length(size)
        if @head_request
          unless size == 0
            raise LintError, "Response body was given for HEAD request, but should be empty"
          end
        elsif @content_length
          unless @content_length == size.to_s
            raise LintError, "content-length header was #{@content_length}, but should be #{size}"
          end
        end
      end

      ##
      ## === The Body
      ##
      ## The Body is typically an +Array+ of +String+ instances, an enumerable
      ## that yields +String+ instances, a +Proc+ instance, or a File-like
      ## object.
      ##
      ## The Body must respond to +each+ or +call+. It may optionally respond
      ## to +to_path+ or +to_ary+. A Body that responds to +each+ is considered
      ## to be an Enumerable Body. A Body that responds to +call+ is considered
      ## to be a Streaming Body.
      ##
      ## A Body that responds to both +each+ and +call+ must be treated as an
      ## Enumerable Body, not a Streaming Body. If it responds to +each+, you
      ## must call +each+ and not +call+. If the Body doesn't respond to
      ## +each+, then you can assume it responds to +call+.
      ##
      ## The Body must either be consumed or returned. The Body is consumed by
      ## optionally calling either +each+ or +call+.
      ## Then, if the Body responds to +close+, it must be called to release
      ## any resources associated with the generation of the body.
      ## In other words, +close+ must always be called at least once; typically
      ## after the web server has sent the response to the client, but also in
      ## cases where the Rack application makes internal/virtual requests and
      ## discards the response.
      ##
      def close
        ##
        ## After calling +close+, the Body is considered closed and should not
        ## be consumed again.
        @closed = true

        ## If the original Body is replaced by a new Body, the new Body must
        ## also consume the original Body by calling +close+ if possible.
        @body.close if @body.respond_to?(:close)

        index = @lint.index(self)
        unless @env['rack.lint'][0..index].all? {|lint| lint.instance_variable_get(:@closed)}
          raise LintError, "Body has not been closed"
        end
      end

      def verify_to_path
        ##
        ## If the Body responds to +to_path+, it must return a +String+
        ## path for the local file system whose contents are identical
        ## to that produced by calling +each+; this may be used by the
        ## server as an alternative, possibly more efficient way to
        ## transport the response. The +to_path+ method does not consume
        ## the body.
        if @body.respond_to?(:to_path)
          unless ::File.exist? @body.to_path
            raise LintError, "The file identified by body.to_path does not exist"
          end
        end
      end

      ##
      ## ==== Enumerable Body
      ##
      def each
        ## The Enumerable Body must respond to +each+.
        raise LintError, "Enumerable Body must respond to each" unless @body.respond_to?(:each)

        ## It must only be called once.
        raise LintError, "Response body must only be invoked once (#{@invoked})" unless @invoked.nil?

        ## It must not be called after being closed.
        raise LintError, "Response body is already closed" if @closed

        @invoked = :each

        @body.each do |chunk|
          ## and must only yield String values.
          unless chunk.kind_of? String
            raise LintError, "Body yielded non-string value #{chunk.inspect}"
          end

          ##
          ## The Body itself should not be an instance of String, as this will
          ## break in Ruby 1.9.
          ##
          ## Middleware must not call +each+ directly on the Body.
          ## Instead, middleware can return a new Body that calls +each+ on the
          ## original Body, yielding at least once per iteration.
          if @lint[0] == self
            @env['rack.lint.body_iteration'] += 1
          else
            if (@env['rack.lint.body_iteration'] -= 1) > 0
              raise LintError, "New body must yield at least once per iteration of old body"
            end
          end

          @size += chunk.bytesize
          yield chunk
        end

        verify_content_length(@size)

        verify_to_path
      end

      BODY_METHODS = {to_ary: true, each: true, call: true, to_path: true}

      def to_path
        @body.to_path
      end

      def respond_to?(name, *)
        if BODY_METHODS.key?(name)
          @body.respond_to?(name)
        else
          super
        end
      end

      ##
      ## If the Body responds to +to_ary+, it must return an +Array+ whose
      ## contents are identical to that produced by calling +each+.
      ## Middleware may call +to_ary+ directly on the Body and return a new
      ## Body in its place. In other words, middleware can only process the
      ## Body directly if it responds to +to_ary+. If the Body responds to both
      ## +to_ary+ and +close+, its implementation of +to_ary+ must call
      ## +close+.
      def to_ary
        @body.to_ary.tap do |content|
          unless content == @body.enum_for.to_a
            raise LintError, "#to_ary not identical to contents produced by calling #each"
          end
        end
      ensure
        close
      end

      ##
      ## ==== Streaming Body
      ##
      def call(stream)
        ## The Streaming Body must respond to +call+.
        raise LintError, "Streaming Body must respond to call" unless @body.respond_to?(:call)

        ## It must only be called once.
        raise LintError, "Response body must only be invoked once (#{@invoked})" unless @invoked.nil?

        ## It must not be called after being closed.
        raise LintError, "Response body is already closed" if @closed

        @invoked = :call

        ## It takes a +stream+ argument.
        ##
        ## The +stream+ argument must implement:
        ## <tt>read, write, <<, flush, close, close_read, close_write, closed?</tt>
        ##
        @body.call(StreamWrapper.new(stream))
      end

      class StreamWrapper
        extend Forwardable

        ## The semantics of these IO methods must be a best effort match to
        ## those of a normal Ruby IO or Socket object, using standard arguments
        ## and raising standard exceptions. Servers are encouraged to simply
        ## pass on real IO objects, although it is recognized that this approach
        ## is not directly compatible with HTTP/2.
        REQUIRED_METHODS = [
          :read, :write, :<<, :flush, :close,
          :close_read, :close_write, :closed?
        ]

        def_delegators :@stream, *REQUIRED_METHODS

        def initialize(stream)
          @stream = stream

          REQUIRED_METHODS.each do |method_name|
            raise LintError, "Stream must respond to #{method_name}" unless stream.respond_to?(method_name)
          end
        end
      end

      # :startdoc:
    end
  end
end

##
## == Thanks
## Some parts of this specification are adopted from {PEP 333 – Python Web Server Gateway Interface v1.0}[https://peps.python.org/pep-0333/]
## I'd like to thank everyone involved in that effort.
PK}$[�&�{!{!-gems/gems/rack-3.0.8/lib/rack/query_parser.rbnu�[���# frozen_string_literal: true

require 'uri'

module Rack
  class QueryParser
    DEFAULT_SEP = /[&] */n
    COMMON_SEP = { ";" => /[;] */n, ";," => /[;,] */n, "&" => /[&] */n }

    # ParameterTypeError is the error that is raised when incoming structural
    # parameters (parsed by parse_nested_query) contain conflicting types.
    class ParameterTypeError < TypeError; end

    # InvalidParameterError is the error that is raised when incoming structural
    # parameters (parsed by parse_nested_query) contain invalid format or byte
    # sequence.
    class InvalidParameterError < ArgumentError; end

    # ParamsTooDeepError is the error that is raised when params are recursively
    # nested over the specified limit.
    class ParamsTooDeepError < RangeError; end

    def self.make_default(_key_space_limit=(not_deprecated = true; nil), param_depth_limit)
      unless not_deprecated
        warn("`first argument `key_space limit` is deprecated and no longer has an effect. Please call with only one argument, which will be required in a future version of Rack", uplevel: 1)
      end

      new Params, param_depth_limit
    end

    attr_reader :param_depth_limit

    def initialize(params_class, _key_space_limit=(not_deprecated = true; nil), param_depth_limit)
      unless not_deprecated
        warn("`second argument `key_space limit` is deprecated and no longer has an effect. Please call with only two arguments, which will be required in a future version of Rack", uplevel: 1)
      end

      @params_class = params_class
      @param_depth_limit = param_depth_limit
    end

    # Stolen from Mongrel, with some small modifications:
    # Parses a query string by breaking it up at the '&'.  You can also use this
    # to parse cookies by changing the characters used in the second parameter
    # (which defaults to '&').
    def parse_query(qs, separator = nil, &unescaper)
      unescaper ||= method(:unescape)

      params = make_params

      (qs || '').split(separator ? (COMMON_SEP[separator] || /[#{separator}] */n) : DEFAULT_SEP).each do |p|
        next if p.empty?
        k, v = p.split('=', 2).map!(&unescaper)

        if cur = params[k]
          if cur.class == Array
            params[k] << v
          else
            params[k] = [cur, v]
          end
        else
          params[k] = v
        end
      end

      return params.to_h
    end

    # parse_nested_query expands a query string into structural types. Supported
    # types are Arrays, Hashes and basic value types. It is possible to supply
    # query strings with parameters of conflicting types, in this case a
    # ParameterTypeError is raised. Users are encouraged to return a 400 in this
    # case.
    def parse_nested_query(qs, separator = nil)
      params = make_params

      unless qs.nil? || qs.empty?
        (qs || '').split(separator ? (COMMON_SEP[separator] || /[#{separator}] */n) : DEFAULT_SEP).each do |p|
          k, v = p.split('=', 2).map! { |s| unescape(s) }

          _normalize_params(params, k, v, 0)
        end
      end

      return params.to_h
    rescue ArgumentError => e
      raise InvalidParameterError, e.message, e.backtrace
    end

    # normalize_params recursively expands parameters into structural types. If
    # the structural types represented by two different parameter names are in
    # conflict, a ParameterTypeError is raised.  The depth argument is deprecated
    # and should no longer be used, it is kept for backwards compatibility with
    # earlier versions of rack.
    def normalize_params(params, name, v, _depth=nil)
      _normalize_params(params, name, v, 0)
    end

    private def _normalize_params(params, name, v, depth)
      raise ParamsTooDeepError if depth >= param_depth_limit

      if !name
        # nil name, treat same as empty string (required by tests)
        k = after = ''
      elsif depth == 0
        # Start of parsing, don't treat [] or [ at start of string specially
        if start = name.index('[', 1)
          # Start of parameter nesting, use part before brackets as key
          k = name[0, start]
          after = name[start, name.length]
        else
          # Plain parameter with no nesting
          k = name
          after = ''
        end
      elsif name.start_with?('[]')
        # Array nesting
        k = '[]'
        after = name[2, name.length]
      elsif name.start_with?('[') && (start = name.index(']', 1))
        # Hash nesting, use the part inside brackets as the key
        k = name[1, start-1]
        after = name[start+1, name.length]
      else
        # Probably malformed input, nested but not starting with [
        # treat full name as key for backwards compatibility.
        k = name
        after = ''
      end

      return if k.empty?

      if after == ''
        if k == '[]' && depth != 0
          return [v]
        else
          params[k] = v
        end
      elsif after == "["
        params[name] = v
      elsif after == "[]"
        params[k] ||= []
        raise ParameterTypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
        params[k] << v
      elsif after.start_with?('[]')
        # Recognize x[][y] (hash inside array) parameters
        unless after[2] == '[' && after.end_with?(']') && (child_key = after[3, after.length-4]) && !child_key.empty? && !child_key.index('[') && !child_key.index(']')
          # Handle other nested array parameters
          child_key = after[2, after.length]
        end
        params[k] ||= []
        raise ParameterTypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
        if params_hash_type?(params[k].last) && !params_hash_has_key?(params[k].last, child_key)
          _normalize_params(params[k].last, child_key, v, depth + 1)
        else
          params[k] << _normalize_params(make_params, child_key, v, depth + 1)
        end
      else
        params[k] ||= make_params
        raise ParameterTypeError, "expected Hash (got #{params[k].class.name}) for param `#{k}'" unless params_hash_type?(params[k])
        params[k] = _normalize_params(params[k], after, v, depth + 1)
      end

      params
    end

    def make_params
      @params_class.new
    end

    def new_depth_limit(param_depth_limit)
      self.class.new @params_class, param_depth_limit
    end

    private

    def params_hash_type?(obj)
      obj.kind_of?(@params_class)
    end

    def params_hash_has_key?(hash, key)
      return false if /\[\]/.match?(key)

      key.split(/[\[\]]+/).inject(hash) do |h, part|
        next h if part == ''
        return false unless params_hash_type?(h) && h.key?(part)
        h[part]
      end

      true
    end

    def unescape(string, encoding = Encoding::UTF_8)
      URI.decode_www_form_component(string, encoding)
    end

    class Params
      def initialize
        @size   = 0
        @params = {}
      end

      def [](key)
        @params[key]
      end

      def []=(key, value)
        @params[key] = value
      end

      def key?(key)
        @params.key?(key)
      end

      # Recursively unwraps nested `Params` objects and constructs an object
      # of the same shape, but using the objects' internal representations
      # (Ruby hashes) in place of the objects. The result is a hash consisting
      # purely of Ruby primitives.
      #
      #   Mutation warning!
      #
      #   1. This method mutates the internal representation of the `Params`
      #      objects in order to save object allocations.
      #
      #   2. The value you get back is a reference to the internal hash
      #      representation, not a copy.
      #
      #   3. Because the `Params` object's internal representation is mutable
      #      through the `#[]=` method, it is not thread safe. The result of
      #      getting the hash representation while another thread is adding a
      #      key to it is non-deterministic.
      #
      def to_h
        @params.each do |key, value|
          case value
          when self
            # Handle circular references gracefully.
            @params[key] = @params
          when Params
            @params[key] = value.to_h
          when Array
            value.map! { |v| v.kind_of?(Params) ? v.to_h : v }
          else
            # Ignore anything that is not a `Params` object or
            # a collection that can contain one.
          end
        end
        @params
      end
      alias_method :to_params_hash, :to_h
    end
  end
end
PK}$[:�}=='gems/gems/rack-3.0.8/lib/rack/urlmap.rbnu�[���# frozen_string_literal: true

require 'set'

require_relative 'constants'

module Rack
  # Rack::URLMap takes a hash mapping urls or paths to apps, and
  # dispatches accordingly.  Support for HTTP/1.1 host names exists if
  # the URLs start with <tt>http://</tt> or <tt>https://</tt>.
  #
  # URLMap modifies the SCRIPT_NAME and PATH_INFO such that the part
  # relevant for dispatch is in the SCRIPT_NAME, and the rest in the
  # PATH_INFO.  This should be taken care of when you need to
  # reconstruct the URL in order to create links.
  #
  # URLMap dispatches in such a way that the longest paths are tried
  # first, since they are most specific.

  class URLMap
    def initialize(map = {})
      remap(map)
    end

    def remap(map)
      @known_hosts = Set[]
      @mapping = map.map { |location, app|
        if location =~ %r{\Ahttps?://(.*?)(/.*)}
          host, location = $1, $2
          @known_hosts << host
        else
          host = nil
        end

        unless location[0] == ?/
          raise ArgumentError, "paths need to start with /"
        end

        location = location.chomp('/')
        match = Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)", Regexp::NOENCODING)

        [host, location, match, app]
      }.sort_by do |(host, location, _, _)|
        [host ? -host.size : Float::INFINITY, -location.size]
      end
    end

    def call(env)
      path        = env[PATH_INFO]
      script_name = env[SCRIPT_NAME]
      http_host   = env[HTTP_HOST]
      server_name = env[SERVER_NAME]
      server_port = env[SERVER_PORT]

      is_same_server = casecmp?(http_host, server_name) ||
                       casecmp?(http_host, "#{server_name}:#{server_port}")

      is_host_known = @known_hosts.include? http_host

      @mapping.each do |host, location, match, app|
        unless casecmp?(http_host, host) \
            || casecmp?(server_name, host) \
            || (!host && is_same_server) \
            || (!host && !is_host_known) # If we don't have a matching host, default to the first without a specified host
          next
        end

        next unless m = match.match(path.to_s)

        rest = m[1]
        next unless !rest || rest.empty? || rest[0] == ?/

        env[SCRIPT_NAME] = (script_name + location)
        env[PATH_INFO] = rest

        return app.call(env)
      end

      [404, { CONTENT_TYPE => "text/plain", "x-cascade" => "pass" }, ["Not Found: #{path}"]]

    ensure
      env[PATH_INFO]   = path
      env[SCRIPT_NAME] = script_name
    end

    private
    def casecmp?(v1, v2)
      # if both nil, or they're the same string
      return true if v1 == v2

      # if either are nil... (but they're not the same)
      return false if v1.nil?
      return false if v2.nil?

      # otherwise check they're not case-insensitive the same
      v1.casecmp(v2).zero?
    end
  end
end
PK}$[O�i���(gems/gems/rack-3.0.8/lib/rack/headers.rbnu�[���module Rack
  # Rack::Headers is a Hash subclass that downcases all keys.  It's designed
  # to be used by rack applications that don't implement the Rack 3 SPEC
  # (by using non-lowercase response header keys), automatically handling
  # the downcasing of keys.
  class Headers < Hash
    def self.[](*items)
      if items.length % 2 != 0
        if items.length == 1 && items.first.is_a?(Hash)
          new.merge!(items.first)
        else
          raise ArgumentError, "odd number of arguments for Rack::Headers"
        end
      else
        hash = new
        loop do
          break if items.length == 0
          key = items.shift
          value = items.shift
          hash[key] = value
        end
        hash
      end
    end

    def [](key)
      super(downcase_key(key))
    end

    def []=(key, value)
      super(key.downcase.freeze, value)
    end
    alias store []=

    def assoc(key)
      super(downcase_key(key))
    end

    def compare_by_identity
      raise TypeError, "Rack::Headers cannot compare by identity, use regular Hash"
    end

    def delete(key)
      super(downcase_key(key))
    end

    def dig(key, *a)
      super(downcase_key(key), *a)
    end

    def fetch(key, *default, &block)
      key = downcase_key(key)
      super
    end

    def fetch_values(*a)
      super(*a.map!{|key| downcase_key(key)})
    end

    def has_key?(key)
      super(downcase_key(key))
    end
    alias include? has_key?
    alias key? has_key?
    alias member? has_key?

    def invert
      hash = self.class.new
      each{|key, value| hash[value] = key}
      hash
    end

    def merge(hash, &block)
      dup.merge!(hash, &block)
    end

    def reject(&block)
      hash = dup
      hash.reject!(&block)
      hash
    end

    def replace(hash)
      clear
      update(hash)
    end

    def select(&block)
      hash = dup
      hash.select!(&block)
      hash
    end

    def to_proc
      lambda{|x| self[x]}
    end

    def transform_values(&block)
      dup.transform_values!(&block)
    end

    def update(hash, &block)
      hash.each do |key, value|
        self[key] = if block_given? && include?(key)
          block.call(key, self[key], value)
        else
          value
        end
      end
      self
    end
    alias merge! update

    def values_at(*keys)
      keys.map{|key| self[key]}
    end

    # :nocov:
    if RUBY_VERSION >= '2.5'
    # :nocov:
      def slice(*a)
        h = self.class.new
        a.each{|k| h[k] = self[k] if has_key?(k)}
        h
      end

      def transform_keys(&block)
        dup.transform_keys!(&block)
      end

      def transform_keys!
        hash = self.class.new
        each do |k, v|
          hash[yield k] = v
        end
        replace(hash)
      end
    end

    # :nocov:
    if RUBY_VERSION >= '3.0'
    # :nocov:
      def except(*a)
        super(*a.map!{|key| downcase_key(key)})
      end
    end

    private

    def downcase_key(key)
      key.is_a?(String) ? key.downcase : key
    end
  end
end
PK}$[М}���%gems/gems/rack-3.0.8/lib/rack/file.rbnu�[���# frozen_string_literal: true

require_relative 'files'

module Rack
  warn "Rack::File is deprecated and will be removed in Rack 3.1", uplevel: 1

  File = Files
end
PK}$[N4q���-gems/gems/rack-3.0.8/lib/rack/content_type.rbnu�[���# frozen_string_literal: true

require_relative 'constants'
require_relative 'utils'

module Rack

  # Sets the content-type header on responses which don't have one.
  #
  # Builder Usage:
  #   use Rack::ContentType, "text/plain"
  #
  # When no content type argument is provided, "text/html" is the
  # default.
  class ContentType
    include Rack::Utils

    def initialize(app, content_type = "text/html")
      @app = app
      @content_type = content_type
    end

    def call(env)
      status, headers, _ = response = @app.call(env)

      unless STATUS_WITH_NO_ENTITY_BODY.key?(status.to_i)
        headers[CONTENT_TYPE] ||= @content_type
      end

      response
    end
  end
end
PK}$[K?��33+gems/gems/rack-3.0.8/lib/rack/body_proxy.rbnu�[���# frozen_string_literal: true

module Rack
  # Proxy for response bodies allowing calling a block when
  # the response body is closed (after the response has been fully
  # sent to the client).
  class BodyProxy
    # Set the response body to wrap, and the block to call when the
    # response has been fully sent.
    def initialize(body, &block)
      @body = body
      @block = block
      @closed = false
    end

    # Return whether the wrapped body responds to the method.
    def respond_to_missing?(method_name, include_all = false)
      super or @body.respond_to?(method_name, include_all)
    end

    # If not already closed, close the wrapped body and
    # then call the block the proxy was initialized with.
    def close
      return if @closed
      @closed = true
      begin
        @body.close if @body.respond_to?(:close)
      ensure
        @block.call
      end
    end

    # Whether the proxy is closed.  The proxy starts as not closed,
    # and becomes closed on the first call to close.
    def closed?
      @closed
    end

    # Delegate missing methods to the wrapped body.
    def method_missing(method_name, *args, &block)
      @body.__send__(method_name, *args, &block)
    end
    # :nocov:
    ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
    # :nocov:
  end
end
PK}$[�i\��'gems/gems/rack-3.0.8/lib/rack/config.rbnu�[���# frozen_string_literal: true

module Rack
  # Rack::Config modifies the environment using the block given during
  # initialization.
  #
  # Example:
  #     use Rack::Config do |env|
  #       env['my-key'] = 'some-value'
  #     end
  class Config
    def initialize(app, &block)
      @app = app
      @block = block
    end

    def call(env)
      @block.call(env)
      @app.call(env)
    end
  end
end
PK}$[�gG��+gems/gems/rack-3.0.8/lib/rack/media_type.rbnu�[���# frozen_string_literal: true

module Rack
  # Rack::MediaType parse media type and parameters out of content_type string

  class MediaType
    SPLIT_PATTERN = %r{\s*[;,]\s*}

    class << self
      # The media type (type/subtype) portion of the CONTENT_TYPE header
      # without any media type parameters. e.g., when CONTENT_TYPE is
      # "text/plain;charset=utf-8", the media-type is "text/plain".
      #
      # For more information on the use of media types in HTTP, see:
      # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7
      def type(content_type)
        return nil unless content_type
        content_type.split(SPLIT_PATTERN, 2).first.tap(&:downcase!)
      end

      # The media type parameters provided in CONTENT_TYPE as a Hash, or
      # an empty Hash if no CONTENT_TYPE or media-type parameters were
      # provided.  e.g., when the CONTENT_TYPE is "text/plain;charset=utf-8",
      # this method responds with the following Hash:
      #   { 'charset' => 'utf-8' }
      def params(content_type)
        return {} if content_type.nil?

        content_type.split(SPLIT_PATTERN)[1..-1].each_with_object({}) do |s, hsh|
          k, v = s.split('=', 2)

          hsh[k.tap(&:downcase!)] = strip_doublequotes(v)
        end
      end

      private

        def strip_doublequotes(str)
          (str.start_with?('"') && str.end_with?('"')) ? str[1..-2] : str
        end
    end
  end
end
PK}$[>�==%gems/gems/rack-3.0.8/lib/rack/lock.rbnu�[���# frozen_string_literal: true

require_relative 'body_proxy'

module Rack
  # Rack::Lock locks every request inside a mutex, so that every request
  # will effectively be executed synchronously.
  class Lock
    def initialize(app, mutex = Mutex.new)
      @app, @mutex = app, mutex
    end

    def call(env)
      @mutex.lock
      begin
        response = @app.call(env)
        returned = response << BodyProxy.new(response.pop) { unlock }
      ensure
        unlock unless returned
      end
    end

    private

    def unlock
      @mutex.unlock
    end
  end
end
PK}$[iZ�&&/gems/gems/rack-3.0.8/lib/rack/content_length.rbnu�[���# frozen_string_literal: true

require_relative 'constants'
require_relative 'utils'

module Rack

  # Sets the content-length header on responses that do not specify
  # a content-length or transfer-encoding header.  Note that this
  # does not fix responses that have an invalid content-length
  # header specified.
  class ContentLength
    include Rack::Utils

    def initialize(app)
      @app = app
    end

    def call(env)
      status, headers, body = response = @app.call(env)

      if !STATUS_WITH_NO_ENTITY_BODY.key?(status.to_i) &&
         !headers[CONTENT_LENGTH] &&
         !headers[TRANSFER_ENCODING] &&
         body.respond_to?(:to_ary)

        response[2] = body = body.to_ary
        headers[CONTENT_LENGTH] = body.sum(&:bytesize).to_s
      end

      response
    end
  end
end
PK}$[$����*�*)gems/gems/rack-3.0.8/lib/rack/response.rbnu�[���# frozen_string_literal: true

require 'time'

require_relative 'constants'
require_relative 'utils'
require_relative 'media_type'
require_relative 'headers'

module Rack
  # Rack::Response provides a convenient interface to create a Rack
  # response.
  #
  # It allows setting of headers and cookies, and provides useful
  # defaults (an OK response with empty headers and body).
  #
  # You can use Response#write to iteratively generate your response,
  # but note that this is buffered by Rack::Response until you call
  # +finish+.  +finish+ however can take a block inside which calls to
  # +write+ are synchronous with the Rack response.
  #
  # Your application's +call+ should end returning Response#finish.
  class Response
    def self.[](status, headers, body)
      self.new(body, status, headers)
    end

    CHUNKED = 'chunked'
    STATUS_WITH_NO_ENTITY_BODY = Utils::STATUS_WITH_NO_ENTITY_BODY

    attr_accessor :length, :status, :body
    attr_reader :headers

    # Deprecated, use headers instead.
    def header
      warn 'Rack::Response#header is deprecated and will be removed in Rack 3.1', uplevel: 1

      headers
    end

    # Initialize the response object with the specified +body+, +status+
    # and +headers+.
    #
    # If the +body+ is +nil+, construct an empty response object with internal
    # buffering.
    #
    # If the +body+ responds to +to_str+, assume it's a string-like object and
    # construct a buffered response object containing using that string as the
    # initial contents of the buffer.
    #
    # Otherwise it is expected +body+ conforms to the normal requirements of a
    # Rack response body, typically implementing one of +each+ (enumerable
    # body) or +call+ (streaming body).
    #
    # The +status+ defaults to +200+ which is the "OK" HTTP status code. You
    # can provide any other valid status code.
    #
    # The +headers+ must be a +Hash+ of key-value header pairs which conform to
    # the Rack specification for response headers. The key must be a +String+
    # instance and the value can be either a +String+ or +Array+ instance.
    def initialize(body = nil, status = 200, headers = {})
      @status = status.to_i

      unless headers.is_a?(Hash)
        warn "Providing non-hash headers to Rack::Response is deprecated and will be removed in Rack 3.1", uplevel: 1
      end

      @headers = Headers.new
      # Convert headers input to a plain hash with lowercase keys.
      headers.each do |k, v|
        @headers[k] = v
      end

      @writer = self.method(:append)

      @block = nil

      # Keep track of whether we have expanded the user supplied body.
      if body.nil?
        @body = []
        @buffered = true
        @length = 0
      elsif body.respond_to?(:to_str)
        @body = [body]
        @buffered = true
        @length = body.to_str.bytesize
      else
        @body = body
        @buffered = nil # undetermined as of yet.
        @length = 0
      end

      yield self if block_given?
    end

    def redirect(target, status = 302)
      self.status = status
      self.location = target
    end

    def chunked?
      CHUNKED == get_header(TRANSFER_ENCODING)
    end

    def no_entity_body?
      # The response body is an enumerable body and it is not allowed to have an entity body.
      @body.respond_to?(:each) && STATUS_WITH_NO_ENTITY_BODY[@status]
    end
    
    # Generate a response array consistent with the requirements of the SPEC.
    # @return [Array] a 3-tuple suitable of `[status, headers, body]`
    # which is suitable to be returned from the middleware `#call(env)` method.
    def finish(&block)
      if no_entity_body?
        delete_header CONTENT_TYPE
        delete_header CONTENT_LENGTH
        close
        return [@status, @headers, []]
      else
        if block_given?
          @block = block
          return [@status, @headers, self]
        else
          return [@status, @headers, @body]
        end
      end
    end

    alias to_a finish           # For *response

    def each(&callback)
      @body.each(&callback)
      @buffered = true

      if @block
        @writer = callback
        @block.call(self)
      end
    end

    # Append to body and update content-length.
    #
    # NOTE: Do not mix #write and direct #body access!
    #
    def write(chunk)
      buffered_body!

      @writer.call(chunk.to_s)
    end

    def close
      @body.close if @body.respond_to?(:close)
    end

    def empty?
      @block == nil && @body.empty?
    end

    def has_header?(key)
      raise ArgumentError unless key.is_a?(String)
      @headers.key?(key)
    end
    def get_header(key)
      raise ArgumentError unless key.is_a?(String)
      @headers[key]
    end
    def set_header(key, value)
      raise ArgumentError unless key.is_a?(String)
      @headers[key] = value
    end
    def delete_header(key)
      raise ArgumentError unless key.is_a?(String)
      @headers.delete key
    end

    alias :[] :get_header
    alias :[]= :set_header

    module Helpers
      def invalid?;             status < 100 || status >= 600;        end

      def informational?;       status >= 100 && status < 200;        end
      def successful?;          status >= 200 && status < 300;        end
      def redirection?;         status >= 300 && status < 400;        end
      def client_error?;        status >= 400 && status < 500;        end
      def server_error?;        status >= 500 && status < 600;        end

      def ok?;                  status == 200;                        end
      def created?;             status == 201;                        end
      def accepted?;            status == 202;                        end
      def no_content?;          status == 204;                        end
      def moved_permanently?;   status == 301;                        end
      def bad_request?;         status == 400;                        end
      def unauthorized?;        status == 401;                        end
      def forbidden?;           status == 403;                        end
      def not_found?;           status == 404;                        end
      def method_not_allowed?;  status == 405;                        end
      def not_acceptable?;      status == 406;                        end
      def request_timeout?;     status == 408;                        end
      def precondition_failed?; status == 412;                        end
      def unprocessable?;       status == 422;                        end

      def redirect?;            [301, 302, 303, 307, 308].include? status; end

      def include?(header)
        has_header?(header)
      end

      # Add a header that may have multiple values.
      #
      # Example:
      #   response.add_header 'vary', 'accept-encoding'
      #   response.add_header 'vary', 'cookie'
      #
      #   assert_equal 'accept-encoding,cookie', response.get_header('vary')
      #
      # http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2
      def add_header(key, value)
        raise ArgumentError unless key.is_a?(String)

        if value.nil?
          return get_header(key)
        end

        value = value.to_s

        if header = get_header(key)
          if header.is_a?(Array)
            header << value
          else
            set_header(key, [header, value])
          end
        else
          set_header(key, value)
        end
      end

      # Get the content type of the response.
      def content_type
        get_header CONTENT_TYPE
      end

      # Set the content type of the response.
      def content_type=(content_type)
        set_header CONTENT_TYPE, content_type
      end

      def media_type
        MediaType.type(content_type)
      end

      def media_type_params
        MediaType.params(content_type)
      end

      def content_length
        cl = get_header CONTENT_LENGTH
        cl ? cl.to_i : cl
      end

      def location
        get_header "location"
      end

      def location=(location)
        set_header "location", location
      end

      def set_cookie(key, value)
        add_header SET_COOKIE, Utils.set_cookie_header(key, value)
      end

      def delete_cookie(key, value = {})
        set_header(SET_COOKIE,
          Utils.delete_set_cookie_header!(
            get_header(SET_COOKIE), key, value
          )
        )
      end

      def set_cookie_header
        get_header SET_COOKIE
      end

      def set_cookie_header=(value)
        set_header SET_COOKIE, value
      end

      def cache_control
        get_header CACHE_CONTROL
      end

      def cache_control=(value)
        set_header CACHE_CONTROL, value
      end

      # Specifies that the content shouldn't be cached. Overrides `cache!` if already called.
      def do_not_cache!
        set_header CACHE_CONTROL, "no-cache, must-revalidate"
        set_header EXPIRES, Time.now.httpdate
      end

      # Specify that the content should be cached.
      # @param duration [Integer] The number of seconds until the cache expires.
      # @option directive [String] The cache control directive, one of "public", "private", "no-cache" or "no-store".
      def cache!(duration = 3600, directive: "public")
        unless headers[CACHE_CONTROL] =~ /no-cache/
          set_header CACHE_CONTROL, "#{directive}, max-age=#{duration}"
          set_header EXPIRES, (Time.now + duration).httpdate
        end
      end

      def etag
        get_header ETAG
      end

      def etag=(value)
        set_header ETAG, value
      end

    protected

      def buffered_body!
        if @buffered.nil?
          if @body.is_a?(Array)
            # The user supplied body was an array:
            @body = @body.compact
            @body.each do |part|
              @length += part.to_s.bytesize
            end
          elsif @body.respond_to?(:each)
            # Turn the user supplied body into a buffered array:
            body = @body
            @body = Array.new

            body.each do |part|
              @writer.call(part.to_s)
            end

            body.close if body.respond_to?(:close)

            @buffered = true
          else
            @buffered = false
          end
        end

        return @buffered
      end

      def append(chunk)
        @body << chunk

        unless chunked?
          @length += chunk.bytesize
          set_header(CONTENT_LENGTH, @length.to_s)
        end

        return chunk
      end
    end

    include Helpers

    class Raw
      include Helpers

      attr_reader :headers
      attr_accessor :status

      def initialize(status, headers)
        @status = status
        @headers = headers
      end

      def has_header?(key)
        headers.key?(key)
      end

      def get_header(key)
        headers[key]
      end

      def set_header(key, value)
        headers[key] = value
      end

      def delete_header(key)
        headers.delete(key)
      end
    end
  end
end
PK}$[?�6/����%gems/gems/rack-3.0.8/lib/rack/mime.rbnu�[���# frozen_string_literal: true

module Rack
  module Mime
    # Returns String with mime type if found, otherwise use +fallback+.
    # +ext+ should be filename extension in the '.ext' format that
    #       File.extname(file) returns.
    # +fallback+ may be any object
    #
    # Also see the documentation for MIME_TYPES
    #
    # Usage:
    #     Rack::Mime.mime_type('.foo')
    #
    # This is a shortcut for:
    #     Rack::Mime::MIME_TYPES.fetch('.foo', 'application/octet-stream')

    def mime_type(ext, fallback = 'application/octet-stream')
      MIME_TYPES.fetch(ext.to_s.downcase, fallback)
    end
    module_function :mime_type

    # Returns true if the given value is a mime match for the given mime match
    # specification, false otherwise.
    #
    #    Rack::Mime.match?('text/html', 'text/*') => true
    #    Rack::Mime.match?('text/plain', '*') => true
    #    Rack::Mime.match?('text/html', 'application/json') => false

    def match?(value, matcher)
      v1, v2 = value.split('/', 2)
      m1, m2 = matcher.split('/', 2)

      (m1 == '*' || v1 == m1) && (m2.nil? || m2 == '*' || m2 == v2)
    end
    module_function :match?

    # List of most common mime-types, selected various sources
    # according to their usefulness in a webserving scope for Ruby
    # users.
    #
    # To amend this list with your local mime.types list you can use:
    #
    #     require 'webrick/httputils'
    #     list = WEBrick::HTTPUtils.load_mime_types('/etc/mime.types')
    #     Rack::Mime::MIME_TYPES.merge!(list)
    #
    # N.B. On Ubuntu the mime.types file does not include the leading period, so
    # users may need to modify the data before merging into the hash.

    MIME_TYPES = {
      ".123"       => "application/vnd.lotus-1-2-3",
      ".3dml"      => "text/vnd.in3d.3dml",
      ".3g2"       => "video/3gpp2",
      ".3gp"       => "video/3gpp",
      ".a"         => "application/octet-stream",
      ".acc"       => "application/vnd.americandynamics.acc",
      ".ace"       => "application/x-ace-compressed",
      ".acu"       => "application/vnd.acucobol",
      ".aep"       => "application/vnd.audiograph",
      ".afp"       => "application/vnd.ibm.modcap",
      ".ai"        => "application/postscript",
      ".aif"       => "audio/x-aiff",
      ".aiff"      => "audio/x-aiff",
      ".ami"       => "application/vnd.amiga.ami",
      ".apng"      => "image/apng",
      ".appcache"  => "text/cache-manifest",
      ".apr"       => "application/vnd.lotus-approach",
      ".asc"       => "application/pgp-signature",
      ".asf"       => "video/x-ms-asf",
      ".asm"       => "text/x-asm",
      ".aso"       => "application/vnd.accpac.simply.aso",
      ".asx"       => "video/x-ms-asf",
      ".atc"       => "application/vnd.acucorp",
      ".atom"      => "application/atom+xml",
      ".atomcat"   => "application/atomcat+xml",
      ".atomsvc"   => "application/atomsvc+xml",
      ".atx"       => "application/vnd.antix.game-component",
      ".au"        => "audio/basic",
      ".avi"       => "video/x-msvideo",
      ".avif"      => "image/avif",
      ".bat"       => "application/x-msdownload",
      ".bcpio"     => "application/x-bcpio",
      ".bdm"       => "application/vnd.syncml.dm+wbxml",
      ".bh2"       => "application/vnd.fujitsu.oasysprs",
      ".bin"       => "application/octet-stream",
      ".bmi"       => "application/vnd.bmi",
      ".bmp"       => "image/bmp",
      ".box"       => "application/vnd.previewsystems.box",
      ".btif"      => "image/prs.btif",
      ".bz"        => "application/x-bzip",
      ".bz2"       => "application/x-bzip2",
      ".c"         => "text/x-c",
      ".c4g"       => "application/vnd.clonk.c4group",
      ".cab"       => "application/vnd.ms-cab-compressed",
      ".cc"        => "text/x-c",
      ".ccxml"     => "application/ccxml+xml",
      ".cdbcmsg"   => "application/vnd.contact.cmsg",
      ".cdkey"     => "application/vnd.mediastation.cdkey",
      ".cdx"       => "chemical/x-cdx",
      ".cdxml"     => "application/vnd.chemdraw+xml",
      ".cdy"       => "application/vnd.cinderella",
      ".cer"       => "application/pkix-cert",
      ".cgm"       => "image/cgm",
      ".chat"      => "application/x-chat",
      ".chm"       => "application/vnd.ms-htmlhelp",
      ".chrt"      => "application/vnd.kde.kchart",
      ".cif"       => "chemical/x-cif",
      ".cii"       => "application/vnd.anser-web-certificate-issue-initiation",
      ".cil"       => "application/vnd.ms-artgalry",
      ".cla"       => "application/vnd.claymore",
      ".class"     => "application/octet-stream",
      ".clkk"      => "application/vnd.crick.clicker.keyboard",
      ".clkp"      => "application/vnd.crick.clicker.palette",
      ".clkt"      => "application/vnd.crick.clicker.template",
      ".clkw"      => "application/vnd.crick.clicker.wordbank",
      ".clkx"      => "application/vnd.crick.clicker",
      ".clp"       => "application/x-msclip",
      ".cmc"       => "application/vnd.cosmocaller",
      ".cmdf"      => "chemical/x-cmdf",
      ".cml"       => "chemical/x-cml",
      ".cmp"       => "application/vnd.yellowriver-custom-menu",
      ".cmx"       => "image/x-cmx",
      ".com"       => "application/x-msdownload",
      ".conf"      => "text/plain",
      ".cpio"      => "application/x-cpio",
      ".cpp"       => "text/x-c",
      ".cpt"       => "application/mac-compactpro",
      ".crd"       => "application/x-mscardfile",
      ".crl"       => "application/pkix-crl",
      ".crt"       => "application/x-x509-ca-cert",
      ".csh"       => "application/x-csh",
      ".csml"      => "chemical/x-csml",
      ".csp"       => "application/vnd.commonspace",
      ".css"       => "text/css",
      ".csv"       => "text/csv",
      ".curl"      => "application/vnd.curl",
      ".cww"       => "application/prs.cww",
      ".cxx"       => "text/x-c",
      ".daf"       => "application/vnd.mobius.daf",
      ".davmount"  => "application/davmount+xml",
      ".dcr"       => "application/x-director",
      ".dd2"       => "application/vnd.oma.dd2+xml",
      ".ddd"       => "application/vnd.fujixerox.ddd",
      ".deb"       => "application/x-debian-package",
      ".der"       => "application/x-x509-ca-cert",
      ".dfac"      => "application/vnd.dreamfactory",
      ".diff"      => "text/x-diff",
      ".dis"       => "application/vnd.mobius.dis",
      ".djv"       => "image/vnd.djvu",
      ".djvu"      => "image/vnd.djvu",
      ".dll"       => "application/x-msdownload",
      ".dmg"       => "application/octet-stream",
      ".dna"       => "application/vnd.dna",
      ".doc"       => "application/msword",
      ".docm"      => "application/vnd.ms-word.document.macroEnabled.12",
      ".docx"      => "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
      ".dot"       => "application/msword",
      ".dotm"      => "application/vnd.ms-word.template.macroEnabled.12",
      ".dotx"      => "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
      ".dp"        => "application/vnd.osgi.dp",
      ".dpg"       => "application/vnd.dpgraph",
      ".dsc"       => "text/prs.lines.tag",
      ".dtd"       => "application/xml-dtd",
      ".dts"       => "audio/vnd.dts",
      ".dtshd"     => "audio/vnd.dts.hd",
      ".dv"        => "video/x-dv",
      ".dvi"       => "application/x-dvi",
      ".dwf"       => "model/vnd.dwf",
      ".dwg"       => "image/vnd.dwg",
      ".dxf"       => "image/vnd.dxf",
      ".dxp"       => "application/vnd.spotfire.dxp",
      ".ear"       => "application/java-archive",
      ".ecelp4800" => "audio/vnd.nuera.ecelp4800",
      ".ecelp7470" => "audio/vnd.nuera.ecelp7470",
      ".ecelp9600" => "audio/vnd.nuera.ecelp9600",
      ".ecma"      => "application/ecmascript",
      ".edm"       => "application/vnd.novadigm.edm",
      ".edx"       => "application/vnd.novadigm.edx",
      ".efif"      => "application/vnd.picsel",
      ".ei6"       => "application/vnd.pg.osasli",
      ".eml"       => "message/rfc822",
      ".eol"       => "audio/vnd.digital-winds",
      ".eot"       => "application/vnd.ms-fontobject",
      ".eps"       => "application/postscript",
      ".es3"       => "application/vnd.eszigno3+xml",
      ".esf"       => "application/vnd.epson.esf",
      ".etx"       => "text/x-setext",
      ".exe"       => "application/x-msdownload",
      ".ext"       => "application/vnd.novadigm.ext",
      ".ez"        => "application/andrew-inset",
      ".ez2"       => "application/vnd.ezpix-album",
      ".ez3"       => "application/vnd.ezpix-package",
      ".f"         => "text/x-fortran",
      ".f77"       => "text/x-fortran",
      ".f90"       => "text/x-fortran",
      ".fbs"       => "image/vnd.fastbidsheet",
      ".fdf"       => "application/vnd.fdf",
      ".fe_launch" => "application/vnd.denovo.fcselayout-link",
      ".fg5"       => "application/vnd.fujitsu.oasysgp",
      ".fli"       => "video/x-fli",
      ".flif"      => "image/flif",
      ".flo"       => "application/vnd.micrografx.flo",
      ".flv"       => "video/x-flv",
      ".flw"       => "application/vnd.kde.kivio",
      ".flx"       => "text/vnd.fmi.flexstor",
      ".fly"       => "text/vnd.fly",
      ".fm"        => "application/vnd.framemaker",
      ".fnc"       => "application/vnd.frogans.fnc",
      ".for"       => "text/x-fortran",
      ".fpx"       => "image/vnd.fpx",
      ".fsc"       => "application/vnd.fsc.weblaunch",
      ".fst"       => "image/vnd.fst",
      ".ftc"       => "application/vnd.fluxtime.clip",
      ".fti"       => "application/vnd.anser-web-funds-transfer-initiation",
      ".fvt"       => "video/vnd.fvt",
      ".fzs"       => "application/vnd.fuzzysheet",
      ".g3"        => "image/g3fax",
      ".gac"       => "application/vnd.groove-account",
      ".gdl"       => "model/vnd.gdl",
      ".gem"       => "application/octet-stream",
      ".gemspec"   => "text/x-script.ruby",
      ".ghf"       => "application/vnd.groove-help",
      ".gif"       => "image/gif",
      ".gim"       => "application/vnd.groove-identity-message",
      ".gmx"       => "application/vnd.gmx",
      ".gph"       => "application/vnd.flographit",
      ".gqf"       => "application/vnd.grafeq",
      ".gram"      => "application/srgs",
      ".grv"       => "application/vnd.groove-injector",
      ".grxml"     => "application/srgs+xml",
      ".gtar"      => "application/x-gtar",
      ".gtm"       => "application/vnd.groove-tool-message",
      ".gtw"       => "model/vnd.gtw",
      ".gv"        => "text/vnd.graphviz",
      ".gz"        => "application/x-gzip",
      ".h"         => "text/x-c",
      ".h261"      => "video/h261",
      ".h263"      => "video/h263",
      ".h264"      => "video/h264",
      ".hbci"      => "application/vnd.hbci",
      ".hdf"       => "application/x-hdf",
      ".heic"      => "image/heic",
      ".heics"     => "image/heic-sequence",
      ".heif"      => "image/heif",
      ".heifs"     => "image/heif-sequence",
      ".hh"        => "text/x-c",
      ".hlp"       => "application/winhlp",
      ".hpgl"      => "application/vnd.hp-hpgl",
      ".hpid"      => "application/vnd.hp-hpid",
      ".hps"       => "application/vnd.hp-hps",
      ".hqx"       => "application/mac-binhex40",
      ".htc"       => "text/x-component",
      ".htke"      => "application/vnd.kenameaapp",
      ".htm"       => "text/html",
      ".html"      => "text/html",
      ".hvd"       => "application/vnd.yamaha.hv-dic",
      ".hvp"       => "application/vnd.yamaha.hv-voice",
      ".hvs"       => "application/vnd.yamaha.hv-script",
      ".icc"       => "application/vnd.iccprofile",
      ".ice"       => "x-conference/x-cooltalk",
      ".ico"       => "image/vnd.microsoft.icon",
      ".ics"       => "text/calendar",
      ".ief"       => "image/ief",
      ".ifb"       => "text/calendar",
      ".ifm"       => "application/vnd.shana.informed.formdata",
      ".igl"       => "application/vnd.igloader",
      ".igs"       => "model/iges",
      ".igx"       => "application/vnd.micrografx.igx",
      ".iif"       => "application/vnd.shana.informed.interchange",
      ".imp"       => "application/vnd.accpac.simply.imp",
      ".ims"       => "application/vnd.ms-ims",
      ".ipk"       => "application/vnd.shana.informed.package",
      ".irm"       => "application/vnd.ibm.rights-management",
      ".irp"       => "application/vnd.irepository.package+xml",
      ".iso"       => "application/octet-stream",
      ".itp"       => "application/vnd.shana.informed.formtemplate",
      ".ivp"       => "application/vnd.immervision-ivp",
      ".ivu"       => "application/vnd.immervision-ivu",
      ".jad"       => "text/vnd.sun.j2me.app-descriptor",
      ".jam"       => "application/vnd.jam",
      ".jar"       => "application/java-archive",
      ".java"      => "text/x-java-source",
      ".jisp"      => "application/vnd.jisp",
      ".jlt"       => "application/vnd.hp-jlyt",
      ".jnlp"      => "application/x-java-jnlp-file",
      ".joda"      => "application/vnd.joost.joda-archive",
      ".jp2"       => "image/jp2",
      ".jpeg"      => "image/jpeg",
      ".jpg"       => "image/jpeg",
      ".jpgv"      => "video/jpeg",
      ".jpm"       => "video/jpm",
      ".js"        => "application/javascript",
      ".json"      => "application/json",
      ".karbon"    => "application/vnd.kde.karbon",
      ".kfo"       => "application/vnd.kde.kformula",
      ".kia"       => "application/vnd.kidspiration",
      ".kml"       => "application/vnd.google-earth.kml+xml",
      ".kmz"       => "application/vnd.google-earth.kmz",
      ".kne"       => "application/vnd.kinar",
      ".kon"       => "application/vnd.kde.kontour",
      ".kpr"       => "application/vnd.kde.kpresenter",
      ".ksp"       => "application/vnd.kde.kspread",
      ".ktz"       => "application/vnd.kahootz",
      ".kwd"       => "application/vnd.kde.kword",
      ".latex"     => "application/x-latex",
      ".lbd"       => "application/vnd.llamagraphics.life-balance.desktop",
      ".lbe"       => "application/vnd.llamagraphics.life-balance.exchange+xml",
      ".les"       => "application/vnd.hhe.lesson-player",
      ".link66"    => "application/vnd.route66.link66+xml",
      ".log"       => "text/plain",
      ".lostxml"   => "application/lost+xml",
      ".lrm"       => "application/vnd.ms-lrm",
      ".ltf"       => "application/vnd.frogans.ltf",
      ".lvp"       => "audio/vnd.lucent.voice",
      ".lwp"       => "application/vnd.lotus-wordpro",
      ".m3u"       => "audio/x-mpegurl",
      ".m3u8"      => "application/x-mpegurl",
      ".m4a"       => "audio/mp4a-latm",
      ".m4v"       => "video/mp4",
      ".ma"        => "application/mathematica",
      ".mag"       => "application/vnd.ecowin.chart",
      ".man"       => "text/troff",
      ".manifest"  => "text/cache-manifest",
      ".mathml"    => "application/mathml+xml",
      ".mbk"       => "application/vnd.mobius.mbk",
      ".mbox"      => "application/mbox",
      ".mc1"       => "application/vnd.medcalcdata",
      ".mcd"       => "application/vnd.mcd",
      ".mdb"       => "application/x-msaccess",
      ".mdi"       => "image/vnd.ms-modi",
      ".mdoc"      => "text/troff",
      ".me"        => "text/troff",
      ".mfm"       => "application/vnd.mfmp",
      ".mgz"       => "application/vnd.proteus.magazine",
      ".mid"       => "audio/midi",
      ".midi"      => "audio/midi",
      ".mif"       => "application/vnd.mif",
      ".mime"      => "message/rfc822",
      ".mj2"       => "video/mj2",
      ".mlp"       => "application/vnd.dolby.mlp",
      ".mmd"       => "application/vnd.chipnuts.karaoke-mmd",
      ".mmf"       => "application/vnd.smaf",
      ".mml"       => "application/mathml+xml",
      ".mmr"       => "image/vnd.fujixerox.edmics-mmr",
      ".mng"       => "video/x-mng",
      ".mny"       => "application/x-msmoney",
      ".mov"       => "video/quicktime",
      ".movie"     => "video/x-sgi-movie",
      ".mp3"       => "audio/mpeg",
      ".mp4"       => "video/mp4",
      ".mp4a"      => "audio/mp4",
      ".mp4s"      => "application/mp4",
      ".mp4v"      => "video/mp4",
      ".mpc"       => "application/vnd.mophun.certificate",
      ".mpd"       => "application/dash+xml",
      ".mpeg"      => "video/mpeg",
      ".mpg"       => "video/mpeg",
      ".mpga"      => "audio/mpeg",
      ".mpkg"      => "application/vnd.apple.installer+xml",
      ".mpm"       => "application/vnd.blueice.multipass",
      ".mpn"       => "application/vnd.mophun.application",
      ".mpp"       => "application/vnd.ms-project",
      ".mpy"       => "application/vnd.ibm.minipay",
      ".mqy"       => "application/vnd.mobius.mqy",
      ".mrc"       => "application/marc",
      ".ms"        => "text/troff",
      ".mscml"     => "application/mediaservercontrol+xml",
      ".mseq"      => "application/vnd.mseq",
      ".msf"       => "application/vnd.epson.msf",
      ".msh"       => "model/mesh",
      ".msi"       => "application/x-msdownload",
      ".msl"       => "application/vnd.mobius.msl",
      ".msty"      => "application/vnd.muvee.style",
      ".mts"       => "model/vnd.mts",
      ".mus"       => "application/vnd.musician",
      ".mvb"       => "application/x-msmediaview",
      ".mwf"       => "application/vnd.mfer",
      ".mxf"       => "application/mxf",
      ".mxl"       => "application/vnd.recordare.musicxml",
      ".mxml"      => "application/xv+xml",
      ".mxs"       => "application/vnd.triscape.mxs",
      ".mxu"       => "video/vnd.mpegurl",
      ".n"         => "application/vnd.nokia.n-gage.symbian.install",
      ".nc"        => "application/x-netcdf",
      ".ngdat"     => "application/vnd.nokia.n-gage.data",
      ".nlu"       => "application/vnd.neurolanguage.nlu",
      ".nml"       => "application/vnd.enliven",
      ".nnd"       => "application/vnd.noblenet-directory",
      ".nns"       => "application/vnd.noblenet-sealer",
      ".nnw"       => "application/vnd.noblenet-web",
      ".npx"       => "image/vnd.net-fpx",
      ".nsf"       => "application/vnd.lotus-notes",
      ".oa2"       => "application/vnd.fujitsu.oasys2",
      ".oa3"       => "application/vnd.fujitsu.oasys3",
      ".oas"       => "application/vnd.fujitsu.oasys",
      ".obd"       => "application/x-msbinder",
      ".oda"       => "application/oda",
      ".odc"       => "application/vnd.oasis.opendocument.chart",
      ".odf"       => "application/vnd.oasis.opendocument.formula",
      ".odg"       => "application/vnd.oasis.opendocument.graphics",
      ".odi"       => "application/vnd.oasis.opendocument.image",
      ".odp"       => "application/vnd.oasis.opendocument.presentation",
      ".ods"       => "application/vnd.oasis.opendocument.spreadsheet",
      ".odt"       => "application/vnd.oasis.opendocument.text",
      ".oga"       => "audio/ogg",
      ".ogg"       => "application/ogg",
      ".ogv"       => "video/ogg",
      ".ogx"       => "application/ogg",
      ".org"       => "application/vnd.lotus-organizer",
      ".otc"       => "application/vnd.oasis.opendocument.chart-template",
      ".otf"       => "application/vnd.oasis.opendocument.formula-template",
      ".otg"       => "application/vnd.oasis.opendocument.graphics-template",
      ".oth"       => "application/vnd.oasis.opendocument.text-web",
      ".oti"       => "application/vnd.oasis.opendocument.image-template",
      ".otm"       => "application/vnd.oasis.opendocument.text-master",
      ".ots"       => "application/vnd.oasis.opendocument.spreadsheet-template",
      ".ott"       => "application/vnd.oasis.opendocument.text-template",
      ".oxt"       => "application/vnd.openofficeorg.extension",
      ".p"         => "text/x-pascal",
      ".p10"       => "application/pkcs10",
      ".p12"       => "application/x-pkcs12",
      ".p7b"       => "application/x-pkcs7-certificates",
      ".p7m"       => "application/pkcs7-mime",
      ".p7r"       => "application/x-pkcs7-certreqresp",
      ".p7s"       => "application/pkcs7-signature",
      ".pas"       => "text/x-pascal",
      ".pbd"       => "application/vnd.powerbuilder6",
      ".pbm"       => "image/x-portable-bitmap",
      ".pcl"       => "application/vnd.hp-pcl",
      ".pclxl"     => "application/vnd.hp-pclxl",
      ".pcx"       => "image/x-pcx",
      ".pdb"       => "chemical/x-pdb",
      ".pdf"       => "application/pdf",
      ".pem"       => "application/x-x509-ca-cert",
      ".pfr"       => "application/font-tdpfr",
      ".pgm"       => "image/x-portable-graymap",
      ".pgn"       => "application/x-chess-pgn",
      ".pgp"       => "application/pgp-encrypted",
      ".pic"       => "image/x-pict",
      ".pict"      => "image/pict",
      ".pkg"       => "application/octet-stream",
      ".pki"       => "application/pkixcmp",
      ".pkipath"   => "application/pkix-pkipath",
      ".pl"        => "text/x-script.perl",
      ".plb"       => "application/vnd.3gpp.pic-bw-large",
      ".plc"       => "application/vnd.mobius.plc",
      ".plf"       => "application/vnd.pocketlearn",
      ".pls"       => "application/pls+xml",
      ".pm"        => "text/x-script.perl-module",
      ".pml"       => "application/vnd.ctc-posml",
      ".png"       => "image/png",
      ".pnm"       => "image/x-portable-anymap",
      ".pntg"      => "image/x-macpaint",
      ".portpkg"   => "application/vnd.macports.portpkg",
      ".pot"       => "application/vnd.ms-powerpoint",
      ".potm"      => "application/vnd.ms-powerpoint.template.macroEnabled.12",
      ".potx"      => "application/vnd.openxmlformats-officedocument.presentationml.template",
      ".ppa"       => "application/vnd.ms-powerpoint",
      ".ppam"      => "application/vnd.ms-powerpoint.addin.macroEnabled.12",
      ".ppd"       => "application/vnd.cups-ppd",
      ".ppm"       => "image/x-portable-pixmap",
      ".pps"       => "application/vnd.ms-powerpoint",
      ".ppsm"      => "application/vnd.ms-powerpoint.slideshow.macroEnabled.12",
      ".ppsx"      => "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
      ".ppt"       => "application/vnd.ms-powerpoint",
      ".pptm"      => "application/vnd.ms-powerpoint.presentation.macroEnabled.12",
      ".pptx"      => "application/vnd.openxmlformats-officedocument.presentationml.presentation",
      ".prc"       => "application/vnd.palm",
      ".pre"       => "application/vnd.lotus-freelance",
      ".prf"       => "application/pics-rules",
      ".ps"        => "application/postscript",
      ".psb"       => "application/vnd.3gpp.pic-bw-small",
      ".psd"       => "image/vnd.adobe.photoshop",
      ".ptid"      => "application/vnd.pvi.ptid1",
      ".pub"       => "application/x-mspublisher",
      ".pvb"       => "application/vnd.3gpp.pic-bw-var",
      ".pwn"       => "application/vnd.3m.post-it-notes",
      ".py"        => "text/x-script.python",
      ".pya"       => "audio/vnd.ms-playready.media.pya",
      ".pyv"       => "video/vnd.ms-playready.media.pyv",
      ".qam"       => "application/vnd.epson.quickanime",
      ".qbo"       => "application/vnd.intu.qbo",
      ".qfx"       => "application/vnd.intu.qfx",
      ".qps"       => "application/vnd.publishare-delta-tree",
      ".qt"        => "video/quicktime",
      ".qtif"      => "image/x-quicktime",
      ".qxd"       => "application/vnd.quark.quarkxpress",
      ".ra"        => "audio/x-pn-realaudio",
      ".rake"      => "text/x-script.ruby",
      ".ram"       => "audio/x-pn-realaudio",
      ".rar"       => "application/x-rar-compressed",
      ".ras"       => "image/x-cmu-raster",
      ".rb"        => "text/x-script.ruby",
      ".rcprofile" => "application/vnd.ipunplugged.rcprofile",
      ".rdf"       => "application/rdf+xml",
      ".rdz"       => "application/vnd.data-vision.rdz",
      ".rep"       => "application/vnd.businessobjects",
      ".rgb"       => "image/x-rgb",
      ".rif"       => "application/reginfo+xml",
      ".rl"        => "application/resource-lists+xml",
      ".rlc"       => "image/vnd.fujixerox.edmics-rlc",
      ".rld"       => "application/resource-lists-diff+xml",
      ".rm"        => "application/vnd.rn-realmedia",
      ".rmp"       => "audio/x-pn-realaudio-plugin",
      ".rms"       => "application/vnd.jcp.javame.midlet-rms",
      ".rnc"       => "application/relax-ng-compact-syntax",
      ".roff"      => "text/troff",
      ".rpm"       => "application/x-redhat-package-manager",
      ".rpss"      => "application/vnd.nokia.radio-presets",
      ".rpst"      => "application/vnd.nokia.radio-preset",
      ".rq"        => "application/sparql-query",
      ".rs"        => "application/rls-services+xml",
      ".rsd"       => "application/rsd+xml",
      ".rss"       => "application/rss+xml",
      ".rtf"       => "application/rtf",
      ".rtx"       => "text/richtext",
      ".ru"        => "text/x-script.ruby",
      ".s"         => "text/x-asm",
      ".saf"       => "application/vnd.yamaha.smaf-audio",
      ".sbml"      => "application/sbml+xml",
      ".sc"        => "application/vnd.ibm.secure-container",
      ".scd"       => "application/x-msschedule",
      ".scm"       => "application/vnd.lotus-screencam",
      ".scq"       => "application/scvp-cv-request",
      ".scs"       => "application/scvp-cv-response",
      ".sdkm"      => "application/vnd.solent.sdkm+xml",
      ".sdp"       => "application/sdp",
      ".see"       => "application/vnd.seemail",
      ".sema"      => "application/vnd.sema",
      ".semd"      => "application/vnd.semd",
      ".semf"      => "application/vnd.semf",
      ".setpay"    => "application/set-payment-initiation",
      ".setreg"    => "application/set-registration-initiation",
      ".sfd"       => "application/vnd.hydrostatix.sof-data",
      ".sfs"       => "application/vnd.spotfire.sfs",
      ".sgm"       => "text/sgml",
      ".sgml"      => "text/sgml",
      ".sh"        => "application/x-sh",
      ".shar"      => "application/x-shar",
      ".shf"       => "application/shf+xml",
      ".sig"       => "application/pgp-signature",
      ".sit"       => "application/x-stuffit",
      ".sitx"      => "application/x-stuffitx",
      ".skp"       => "application/vnd.koan",
      ".slt"       => "application/vnd.epson.salt",
      ".smi"       => "application/smil+xml",
      ".snd"       => "audio/basic",
      ".so"        => "application/octet-stream",
      ".spf"       => "application/vnd.yamaha.smaf-phrase",
      ".spl"       => "application/x-futuresplash",
      ".spot"      => "text/vnd.in3d.spot",
      ".spp"       => "application/scvp-vp-response",
      ".spq"       => "application/scvp-vp-request",
      ".src"       => "application/x-wais-source",
      ".srt"       => "text/srt",
      ".srx"       => "application/sparql-results+xml",
      ".sse"       => "application/vnd.kodak-descriptor",
      ".ssf"       => "application/vnd.epson.ssf",
      ".ssml"      => "application/ssml+xml",
      ".stf"       => "application/vnd.wt.stf",
      ".stk"       => "application/hyperstudio",
      ".str"       => "application/vnd.pg.format",
      ".sus"       => "application/vnd.sus-calendar",
      ".sv4cpio"   => "application/x-sv4cpio",
      ".sv4crc"    => "application/x-sv4crc",
      ".svd"       => "application/vnd.svd",
      ".svg"       => "image/svg+xml",
      ".svgz"      => "image/svg+xml",
      ".swf"       => "application/x-shockwave-flash",
      ".swi"       => "application/vnd.arastra.swi",
      ".t"         => "text/troff",
      ".tao"       => "application/vnd.tao.intent-module-archive",
      ".tar"       => "application/x-tar",
      ".tbz"       => "application/x-bzip-compressed-tar",
      ".tcap"      => "application/vnd.3gpp2.tcap",
      ".tcl"       => "application/x-tcl",
      ".tex"       => "application/x-tex",
      ".texi"      => "application/x-texinfo",
      ".texinfo"   => "application/x-texinfo",
      ".text"      => "text/plain",
      ".tif"       => "image/tiff",
      ".tiff"      => "image/tiff",
      ".tmo"       => "application/vnd.tmobile-livetv",
      ".torrent"   => "application/x-bittorrent",
      ".tpl"       => "application/vnd.groove-tool-template",
      ".tpt"       => "application/vnd.trid.tpt",
      ".tr"        => "text/troff",
      ".tra"       => "application/vnd.trueapp",
      ".trm"       => "application/x-msterminal",
      ".ts"        => "video/mp2t",
      ".tsv"       => "text/tab-separated-values",
      ".ttf"       => "application/octet-stream",
      ".twd"       => "application/vnd.simtech-mindmapper",
      ".txd"       => "application/vnd.genomatix.tuxedo",
      ".txf"       => "application/vnd.mobius.txf",
      ".txt"       => "text/plain",
      ".ufd"       => "application/vnd.ufdl",
      ".umj"       => "application/vnd.umajin",
      ".unityweb"  => "application/vnd.unity",
      ".uoml"      => "application/vnd.uoml+xml",
      ".uri"       => "text/uri-list",
      ".ustar"     => "application/x-ustar",
      ".utz"       => "application/vnd.uiq.theme",
      ".uu"        => "text/x-uuencode",
      ".vcd"       => "application/x-cdlink",
      ".vcf"       => "text/x-vcard",
      ".vcg"       => "application/vnd.groove-vcard",
      ".vcs"       => "text/x-vcalendar",
      ".vcx"       => "application/vnd.vcx",
      ".vis"       => "application/vnd.visionary",
      ".viv"       => "video/vnd.vivo",
      ".vrml"      => "model/vrml",
      ".vsd"       => "application/vnd.visio",
      ".vsf"       => "application/vnd.vsf",
      ".vtt"       => "text/vtt",
      ".vtu"       => "model/vnd.vtu",
      ".vxml"      => "application/voicexml+xml",
      ".war"       => "application/java-archive",
      ".wasm"      => "application/wasm",
      ".wav"       => "audio/x-wav",
      ".wax"       => "audio/x-ms-wax",
      ".wbmp"      => "image/vnd.wap.wbmp",
      ".wbs"       => "application/vnd.criticaltools.wbs+xml",
      ".wbxml"     => "application/vnd.wap.wbxml",
      ".webm"      => "video/webm",
      ".webp"      => "image/webp",
      ".wm"        => "video/x-ms-wm",
      ".wma"       => "audio/x-ms-wma",
      ".wmd"       => "application/x-ms-wmd",
      ".wmf"       => "application/x-msmetafile",
      ".wml"       => "text/vnd.wap.wml",
      ".wmlc"      => "application/vnd.wap.wmlc",
      ".wmls"      => "text/vnd.wap.wmlscript",
      ".wmlsc"     => "application/vnd.wap.wmlscriptc",
      ".wmv"       => "video/x-ms-wmv",
      ".wmx"       => "video/x-ms-wmx",
      ".wmz"       => "application/x-ms-wmz",
      ".woff"      => "application/font-woff",
      ".woff2"     => "application/font-woff2",
      ".wpd"       => "application/vnd.wordperfect",
      ".wpl"       => "application/vnd.ms-wpl",
      ".wps"       => "application/vnd.ms-works",
      ".wqd"       => "application/vnd.wqd",
      ".wri"       => "application/x-mswrite",
      ".wrl"       => "model/vrml",
      ".wsdl"      => "application/wsdl+xml",
      ".wspolicy"  => "application/wspolicy+xml",
      ".wtb"       => "application/vnd.webturbo",
      ".wvx"       => "video/x-ms-wvx",
      ".x3d"       => "application/vnd.hzn-3d-crossword",
      ".xar"       => "application/vnd.xara",
      ".xbd"       => "application/vnd.fujixerox.docuworks.binder",
      ".xbm"       => "image/x-xbitmap",
      ".xdm"       => "application/vnd.syncml.dm+xml",
      ".xdp"       => "application/vnd.adobe.xdp+xml",
      ".xdw"       => "application/vnd.fujixerox.docuworks",
      ".xenc"      => "application/xenc+xml",
      ".xer"       => "application/patch-ops-error+xml",
      ".xfdf"      => "application/vnd.adobe.xfdf",
      ".xfdl"      => "application/vnd.xfdl",
      ".xhtml"     => "application/xhtml+xml",
      ".xif"       => "image/vnd.xiff",
      ".xla"       => "application/vnd.ms-excel",
      ".xlam"      => "application/vnd.ms-excel.addin.macroEnabled.12",
      ".xls"       => "application/vnd.ms-excel",
      ".xlsb"      => "application/vnd.ms-excel.sheet.binary.macroEnabled.12",
      ".xlsx"      => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
      ".xlsm"      => "application/vnd.ms-excel.sheet.macroEnabled.12",
      ".xlt"       => "application/vnd.ms-excel",
      ".xltx"      => "application/vnd.openxmlformats-officedocument.spreadsheetml.template",
      ".xml"       => "application/xml",
      ".xo"        => "application/vnd.olpc-sugar",
      ".xop"       => "application/xop+xml",
      ".xpm"       => "image/x-xpixmap",
      ".xpr"       => "application/vnd.is-xpr",
      ".xps"       => "application/vnd.ms-xpsdocument",
      ".xpw"       => "application/vnd.intercon.formnet",
      ".xsl"       => "application/xml",
      ".xslt"      => "application/xslt+xml",
      ".xsm"       => "application/vnd.syncml+xml",
      ".xspf"      => "application/xspf+xml",
      ".xul"       => "application/vnd.mozilla.xul+xml",
      ".xwd"       => "image/x-xwindowdump",
      ".xyz"       => "chemical/x-xyz",
      ".yaml"      => "text/yaml",
      ".yml"       => "text/yaml",
      ".zaz"       => "application/vnd.zzazz.deck+xml",
      ".zip"       => "application/zip",
      ".zmm"       => "application/vnd.handheld-entertainment+xml",
    }
  end
end
PK}$[���==gems/gems/rack-3.0.8/SPEC.rdocnu�[���This specification aims to formalize the Rack protocol. You
can (and should) use Rack::Lint to enforce it.

When you develop middleware, be sure to add a Lint before and
after to catch all mistakes.

= Rack applications

A Rack application is a Ruby object (not a class) that
responds to +call+.
It takes exactly one argument, the *environment*
and returns a non-frozen Array of exactly three values:
The *status*,
the *headers*,
and the *body*.

== The Environment

The environment must be an unfrozen instance of Hash that includes
CGI-like headers. The Rack application is free to modify the
environment.

The environment is required to include these variables
(adopted from {PEP 333}[https://peps.python.org/pep-0333/]), except when they'd be empty, but see
below.
<tt>REQUEST_METHOD</tt>:: The HTTP request method, such as
                          "GET" or "POST". This cannot ever
                          be an empty string, and so is
                          always required.
<tt>SCRIPT_NAME</tt>:: The initial portion of the request
                       URL's "path" that corresponds to the
                       application object, so that the
                       application knows its virtual
                       "location". This may be an empty
                       string, if the application corresponds
                       to the "root" of the server.
<tt>PATH_INFO</tt>:: The remainder of the request URL's
                     "path", designating the virtual
                     "location" of the request's target
                     within the application. This may be an
                     empty string, if the request URL targets
                     the application root and does not have a
                     trailing slash. This value may be
                     percent-encoded when originating from
                     a URL.
<tt>QUERY_STRING</tt>:: The portion of the request URL that
                        follows the <tt>?</tt>, if any. May be
                        empty, but is always required!
<tt>SERVER_NAME</tt>:: When combined with <tt>SCRIPT_NAME</tt> and
                       <tt>PATH_INFO</tt>, these variables can be
                       used to complete the URL. Note, however,
                       that <tt>HTTP_HOST</tt>, if present,
                       should be used in preference to
                       <tt>SERVER_NAME</tt> for reconstructing
                       the request URL.
                       <tt>SERVER_NAME</tt> can never be an empty
                       string, and so is always required.
<tt>SERVER_PORT</tt>:: An optional +Integer+ which is the port the
                       server is running on. Should be specified if
                       the server is running on a non-standard port.
<tt>SERVER_PROTOCOL</tt>:: A string representing the HTTP version used
                           for the request.
<tt>HTTP_</tt> Variables:: Variables corresponding to the
                           client-supplied HTTP request
                           headers (i.e., variables whose
                           names begin with <tt>HTTP_</tt>). The
                           presence or absence of these
                           variables should correspond with
                           the presence or absence of the
                           appropriate HTTP header in the
                           request. See
                           {RFC3875 section 4.1.18}[https://tools.ietf.org/html/rfc3875#section-4.1.18]
                           for specific behavior.
In addition to this, the Rack environment must include these
Rack-specific variables:
<tt>rack.url_scheme</tt>:: +http+ or +https+, depending on the
                           request URL.
<tt>rack.input</tt>:: See below, the input stream.
<tt>rack.errors</tt>:: See below, the error stream.
<tt>rack.hijack?</tt>:: See below, if present and true, indicates
                        that the server supports partial hijacking.
<tt>rack.hijack</tt>:: See below, if present, an object responding
                       to +call+ that is used to perform a full
                       hijack.
Additional environment specifications have approved to
standardized middleware APIs. None of these are required to
be implemented by the server.
<tt>rack.session</tt>:: A hash-like interface for storing
                        request session data.
                        The store must implement:
                        store(key, value)         (aliased as []=);
                        fetch(key, default = nil) (aliased as []);
                        delete(key);
                        clear;
                        to_hash (returning unfrozen Hash instance);
<tt>rack.logger</tt>:: A common object interface for logging messages.
                       The object must implement:
                        info(message, &block)
                        debug(message, &block)
                        warn(message, &block)
                        error(message, &block)
                        fatal(message, &block)
<tt>rack.multipart.buffer_size</tt>:: An Integer hint to the multipart parser as to what chunk size to use for reads and writes.
<tt>rack.multipart.tempfile_factory</tt>:: An object responding to #call with two arguments, the filename and content_type given for the multipart form field, and returning an IO-like object that responds to #<< and optionally #rewind. This factory will be used to instantiate the tempfile for each multipart form file upload field, rather than the default class of Tempfile.
The server or the application can store their own data in the
environment, too.  The keys must contain at least one dot,
and should be prefixed uniquely.  The prefix <tt>rack.</tt>
is reserved for use with the Rack core distribution and other
accepted specifications and must not be used otherwise.

The <tt>SERVER_PORT</tt> must be an Integer if set.
The <tt>SERVER_NAME</tt> must be a valid authority as defined by RFC7540.
The <tt>HTTP_HOST</tt> must be a valid authority as defined by RFC7540.
The <tt>SERVER_PROTOCOL</tt> must match the regexp <tt>HTTP/\d(\.\d)?</tt>.
If the <tt>HTTP_VERSION</tt> is present, it must equal the <tt>SERVER_PROTOCOL</tt>.
The environment must not contain the keys
<tt>HTTP_CONTENT_TYPE</tt> or <tt>HTTP_CONTENT_LENGTH</tt>
(use the versions without <tt>HTTP_</tt>).
The CGI keys (named without a period) must have String values.
If the string values for CGI keys contain non-ASCII characters,
they should use ASCII-8BIT encoding.
There are the following restrictions:
* <tt>rack.url_scheme</tt> must either be +http+ or +https+.
* There must be a valid input stream in <tt>rack.input</tt>.
* There must be a valid error stream in <tt>rack.errors</tt>.
* There may be a valid hijack callback in <tt>rack.hijack</tt>
* The <tt>REQUEST_METHOD</tt> must be a valid token.
* The <tt>SCRIPT_NAME</tt>, if non-empty, must start with <tt>/</tt>
* The <tt>PATH_INFO</tt>, if non-empty, must start with <tt>/</tt>
* The <tt>CONTENT_LENGTH</tt>, if given, must consist of digits only.
* One of <tt>SCRIPT_NAME</tt> or <tt>PATH_INFO</tt> must be
  set. <tt>PATH_INFO</tt> should be <tt>/</tt> if
  <tt>SCRIPT_NAME</tt> is empty.
  <tt>SCRIPT_NAME</tt> never should be <tt>/</tt>, but instead be empty.
<tt>rack.response_finished</tt>:: An array of callables run by the server after the response has been
processed. This would typically be invoked after sending the response to the client, but it could also be
invoked if an error occurs while generating the response or sending the response; in that case, the error
argument will be a subclass of +Exception+.
The callables are invoked with +env, status, headers, error+ arguments and should not raise any
exceptions. They should be invoked in reverse order of registration.

=== The Input Stream

The input stream is an IO-like object which contains the raw HTTP
POST data.
When applicable, its external encoding must be "ASCII-8BIT" and it
must be opened in binary mode, for Ruby 1.9 compatibility.
The input stream must respond to +gets+, +each+, and +read+.
* +gets+ must be called without arguments and return a string,
  or +nil+ on EOF.
* +read+ behaves like IO#read.
  Its signature is <tt>read([length, [buffer]])</tt>.

  If given, +length+ must be a non-negative Integer (>= 0) or +nil+,
  and +buffer+ must be a String and may not be nil.

  If +length+ is given and not nil, then this method reads at most
  +length+ bytes from the input stream.

  If +length+ is not given or nil, then this method reads
  all data until EOF.

  When EOF is reached, this method returns nil if +length+ is given
  and not nil, or "" if +length+ is not given or is nil.

  If +buffer+ is given, then the read data will be placed
  into +buffer+ instead of a newly created String object.
* +each+ must be called without arguments and only yield Strings.
* +close+ can be called on the input stream to indicate that the
any remaining input is not needed.

=== The Error Stream

The error stream must respond to +puts+, +write+ and +flush+.
* +puts+ must be called with a single argument that responds to +to_s+.
* +write+ must be called with a single argument that is a String.
* +flush+ must be called without arguments and must be called
  in order to make the error appear for sure.
* +close+ must never be called on the error stream.

=== Hijacking

The hijacking interfaces provides a means for an application to take
control of the HTTP connection. There are two distinct hijack
interfaces: full hijacking where the application takes over the raw
connection, and partial hijacking where the application takes over
just the response body stream. In both cases, the application is
responsible for closing the hijacked stream.

Full hijacking only works with HTTP/1. Partial hijacking is functionally
equivalent to streaming bodies, and is still optionally supported for
backwards compatibility with older Rack versions.

==== Full Hijack

Full hijack is used to completely take over an HTTP/1 connection. It
occurs before any headers are written and causes the request to
ignores any response generated by the application.

It is intended to be used when applications need access to raw HTTP/1
connection.

If +rack.hijack+ is present in +env+, it must respond to +call+
and return an +IO+ instance which can be used to read and write
to the underlying connection using HTTP/1 semantics and
formatting.

==== Partial Hijack

Partial hijack is used for bi-directional streaming of the request and
response body. It occurs after the status and headers are written by
the server and causes the server to ignore the Body of the response.

It is intended to be used when applications need bi-directional
streaming.

If +rack.hijack?+ is present in +env+ and truthy,
an application may set the special response header +rack.hijack+
to an object that responds to +call+,
accepting a +stream+ argument.

After the response status and headers have been sent, this hijack
callback will be invoked with a +stream+ argument which follows the
same interface as outlined in "Streaming Body". Servers must
ignore the +body+ part of the response tuple when the
+rack.hijack+ response header is present. Using an empty +Array+
instance is recommended.

The special response header +rack.hijack+ must only be set
if the request +env+ has a truthy +rack.hijack?+.
== The Response

=== The Status

This is an HTTP status. It must be an Integer greater than or equal to
100.

=== The Headers

The headers must be a unfrozen Hash.
The header keys must be Strings.
Special headers starting "rack." are for communicating with the
server, and must not be sent back to the client.
The header must not contain a +Status+ key.
Header keys must conform to RFC7230 token specification, i.e. cannot
contain non-printable ASCII, DQUOTE or "(),/:;<=>?@[\]{}".
Header keys must not contain uppercase ASCII characters (A-Z).
Header values must be either a String instance,
or an Array of String instances,
such that each String instance must not contain characters below 037.

=== The content-type

There must not be a <tt>content-type</tt> header key when the +Status+ is 1xx,
204, or 304.

=== The content-length

There must not be a <tt>content-length</tt> header key when the
+Status+ is 1xx, 204, or 304.

=== The Body

The Body is typically an +Array+ of +String+ instances, an enumerable
that yields +String+ instances, a +Proc+ instance, or a File-like
object.

The Body must respond to +each+ or +call+. It may optionally respond
to +to_path+ or +to_ary+. A Body that responds to +each+ is considered
to be an Enumerable Body. A Body that responds to +call+ is considered
to be a Streaming Body.

A Body that responds to both +each+ and +call+ must be treated as an
Enumerable Body, not a Streaming Body. If it responds to +each+, you
must call +each+ and not +call+. If the Body doesn't respond to
+each+, then you can assume it responds to +call+.

The Body must either be consumed or returned. The Body is consumed by
optionally calling either +each+ or +call+.
Then, if the Body responds to +close+, it must be called to release
any resources associated with the generation of the body.
In other words, +close+ must always be called at least once; typically
after the web server has sent the response to the client, but also in
cases where the Rack application makes internal/virtual requests and
discards the response.


After calling +close+, the Body is considered closed and should not
be consumed again.
If the original Body is replaced by a new Body, the new Body must
also consume the original Body by calling +close+ if possible.

If the Body responds to +to_path+, it must return a +String+
path for the local file system whose contents are identical
to that produced by calling +each+; this may be used by the
server as an alternative, possibly more efficient way to
transport the response. The +to_path+ method does not consume
the body.

==== Enumerable Body

The Enumerable Body must respond to +each+.
It must only be called once.
It must not be called after being closed.
and must only yield String values.

The Body itself should not be an instance of String, as this will
break in Ruby 1.9.

Middleware must not call +each+ directly on the Body.
Instead, middleware can return a new Body that calls +each+ on the
original Body, yielding at least once per iteration.

If the Body responds to +to_ary+, it must return an +Array+ whose
contents are identical to that produced by calling +each+.
Middleware may call +to_ary+ directly on the Body and return a new
Body in its place. In other words, middleware can only process the
Body directly if it responds to +to_ary+. If the Body responds to both
+to_ary+ and +close+, its implementation of +to_ary+ must call
+close+.

==== Streaming Body

The Streaming Body must respond to +call+.
It must only be called once.
It must not be called after being closed.
It takes a +stream+ argument.

The +stream+ argument must implement:
<tt>read, write, <<, flush, close, close_read, close_write, closed?</tt>

The semantics of these IO methods must be a best effort match to
those of a normal Ruby IO or Socket object, using standard arguments
and raising standard exceptions. Servers are encouraged to simply
pass on real IO objects, although it is recognized that this approach
is not directly compatible with HTTP/2.

== Thanks
Some parts of this specification are adopted from {PEP 333 – Python Web Server Gateway Interface v1.0}[https://peps.python.org/pep-0333/]
I'd like to thank everyone involved in that effort.
PK}$[��_**$gems/gems/rack-3.0.8/CONTRIBUTING.mdnu�[���# Contributing to Rack

Rack is work of [hundreds of
contributors](https://github.com/rack/rack/graphs/contributors). You're
encouraged to submit [pull requests](https://github.com/rack/rack/pulls) and
[propose features and discuss issues](https://github.com/rack/rack/issues).

## Fork the Project

Fork the [project on GitHub](https://github.com/rack/rack) and check out your
copy.

```
git clone https://github.com/(your-github-username)/rack.git
cd rack
git remote add upstream https://github.com/rack/rack.git
```

## Create a Topic Branch

Make sure your fork is up-to-date and create a topic branch for your feature or
bug fix.

```
git checkout main
git pull upstream main
git checkout -b my-feature-branch
```

## Bundle Install and Quick Test

Ensure that you can build the project and run quick tests.

```
bundle install --without extra
bundle exec rake test
```

## Running All Tests

Install all dependencies.

```
bundle install
```

Run all tests.

```
rake test
```

## Write Tests

Try to write a test that reproduces the problem you're trying to fix or
describes a feature that you want to build.

We definitely appreciate pull requests that highlight or reproduce a problem,
even without a fix.

## Write Code

Implement your feature or bug fix.

Make sure that all tests pass:

```
bundle exec rake test
```

## Write Documentation

Document any external behavior in the [README](README.md).

## Update Changelog

Add a line to [CHANGELOG](CHANGELOG.md).

## Commit Changes

Make sure git knows your name and email address:

```
git config --global user.name "Your Name"
git config --global user.email "contributor@example.com"
```

Writing good commit logs is important. A commit log should describe what changed
and why.

```
git add ...
git commit
```

## Push

```
git push origin my-feature-branch
```

## Make a Pull Request

Go to your fork of rack on GitHub and select your feature branch. Click the
'Pull Request' button and fill out the form. Pull requests are usually
reviewed within a few days.

## Rebase

If you've been working on a change for a while, rebase with upstream/main.

```
git fetch upstream
git rebase upstream/main
git push origin my-feature-branch -f
```

## Make Required Changes

Amend your previous commit and force push the changes.

```
git commit --amend
git push origin my-feature-branch -f
```

## Check on Your Pull Request

Go back to your pull request after a few minutes and see whether it passed
tests with GitHub Actions. Everything should look green, otherwise fix issues and
amend your commit as described above.

## Be Patient

It's likely that your change will not be merged and that the nitpicky
maintainers will ask you to do more, or fix seemingly benign problems. Hang in
there!

## Thank You

Please do know that we really appreciate and value your time and work. We love
you, really.
PK}$[�,���1gems/gems/bigdecimal-3.1.1/lib/bigdecimal/math.rbnu�[���# frozen_string_literal: false
require 'bigdecimal'

#
#--
# Contents:
#   sqrt(x, prec)
#   sin (x, prec)
#   cos (x, prec)
#   atan(x, prec)  Note: |x|<1, x=0.9999 may not converge.
#   PI  (prec)
#   E   (prec) == exp(1.0,prec)
#
# where:
#   x    ... BigDecimal number to be computed.
#            |x| must be small enough to get convergence.
#   prec ... Number of digits to be obtained.
#++
#
# Provides mathematical functions.
#
# Example:
#
#   require "bigdecimal/math"
#
#   include BigMath
#
#   a = BigDecimal((PI(100)/2).to_s)
#   puts sin(a,100) # => 0.99999999999999999999......e0
#
module BigMath
  module_function

  # call-seq:
  #   sqrt(decimal, numeric) -> BigDecimal
  #
  # Computes the square root of +decimal+ to the specified number of digits of
  # precision, +numeric+.
  #
  #   BigMath.sqrt(BigDecimal('2'), 16).to_s
  #   #=> "0.1414213562373095048801688724e1"
  #
  def sqrt(x, prec)
    x.sqrt(prec)
  end

  # call-seq:
  #   sin(decimal, numeric) -> BigDecimal
  #
  # Computes the sine of +decimal+ to the specified number of digits of
  # precision, +numeric+.
  #
  # If +decimal+ is Infinity or NaN, returns NaN.
  #
  #   BigMath.sin(BigMath.PI(5)/4, 5).to_s
  #   #=> "0.70710678118654752440082036563292800375e0"
  #
  def sin(x, prec)
    raise ArgumentError, "Zero or negative precision for sin" if prec <= 0
    return BigDecimal("NaN") if x.infinite? || x.nan?
    n    = prec + BigDecimal.double_fig
    one  = BigDecimal("1")
    two  = BigDecimal("2")
    x = -x if neg = x < 0
    if x > (twopi = two * BigMath.PI(prec))
      if x > 30
        x %= twopi
      else
        x -= twopi while x > twopi
      end
    end
    x1   = x
    x2   = x.mult(x,n)
    sign = 1
    y    = x
    d    = y
    i    = one
    z    = one
    while d.nonzero? && ((m = n - (y.exponent - d.exponent).abs) > 0)
      m = BigDecimal.double_fig if m < BigDecimal.double_fig
      sign = -sign
      x1  = x2.mult(x1,n)
      i  += two
      z  *= (i-one) * i
      d   = sign * x1.div(z,m)
      y  += d
    end
    neg ? -y : y
  end

  # call-seq:
  #   cos(decimal, numeric) -> BigDecimal
  #
  # Computes the cosine of +decimal+ to the specified number of digits of
  # precision, +numeric+.
  #
  # If +decimal+ is Infinity or NaN, returns NaN.
  #
  #   BigMath.cos(BigMath.PI(4), 16).to_s
  #   #=> "-0.999999999999999999999999999999856613163740061349e0"
  #
  def cos(x, prec)
    raise ArgumentError, "Zero or negative precision for cos" if prec <= 0
    return BigDecimal("NaN") if x.infinite? || x.nan?
    n    = prec + BigDecimal.double_fig
    one  = BigDecimal("1")
    two  = BigDecimal("2")
    x = -x if x < 0
    if x > (twopi = two * BigMath.PI(prec))
      if x > 30
        x %= twopi
      else
        x -= twopi while x > twopi
      end
    end
    x1 = one
    x2 = x.mult(x,n)
    sign = 1
    y = one
    d = y
    i = BigDecimal("0")
    z = one
    while d.nonzero? && ((m = n - (y.exponent - d.exponent).abs) > 0)
      m = BigDecimal.double_fig if m < BigDecimal.double_fig
      sign = -sign
      x1  = x2.mult(x1,n)
      i  += two
      z  *= (i-one) * i
      d   = sign * x1.div(z,m)
      y  += d
    end
    y
  end

  # call-seq:
  #   atan(decimal, numeric) -> BigDecimal
  #
  # Computes the arctangent of +decimal+ to the specified number of digits of
  # precision, +numeric+.
  #
  # If +decimal+ is NaN, returns NaN.
  #
  #   BigMath.atan(BigDecimal('-1'), 16).to_s
  #   #=> "-0.785398163397448309615660845819878471907514682065e0"
  #
  def atan(x, prec)
    raise ArgumentError, "Zero or negative precision for atan" if prec <= 0
    return BigDecimal("NaN") if x.nan?
    pi = PI(prec)
    x = -x if neg = x < 0
    return pi.div(neg ? -2 : 2, prec) if x.infinite?
    return pi / (neg ? -4 : 4) if x.round(prec) == 1
    x = BigDecimal("1").div(x, prec) if inv = x > 1
    x = (-1 + sqrt(1 + x**2, prec))/x if dbl = x > 0.5
    n    = prec + BigDecimal.double_fig
    y = x
    d = y
    t = x
    r = BigDecimal("3")
    x2 = x.mult(x,n)
    while d.nonzero? && ((m = n - (y.exponent - d.exponent).abs) > 0)
      m = BigDecimal.double_fig if m < BigDecimal.double_fig
      t = -t.mult(x2,n)
      d = t.div(r,m)
      y += d
      r += 2
    end
    y *= 2 if dbl
    y = pi / 2 - y if inv
    y = -y if neg
    y
  end

  # call-seq:
  #   PI(numeric) -> BigDecimal
  #
  # Computes the value of pi to the specified number of digits of precision,
  # +numeric+.
  #
  #   BigMath.PI(10).to_s
  #   #=> "0.3141592653589793238462643388813853786957412e1"
  #
  def PI(prec)
    raise ArgumentError, "Zero or negative precision for PI" if prec <= 0
    n      = prec + BigDecimal.double_fig
    zero   = BigDecimal("0")
    one    = BigDecimal("1")
    two    = BigDecimal("2")

    m25    = BigDecimal("-0.04")
    m57121 = BigDecimal("-57121")

    pi     = zero

    d = one
    k = one
    t = BigDecimal("-80")
    while d.nonzero? && ((m = n - (pi.exponent - d.exponent).abs) > 0)
      m = BigDecimal.double_fig if m < BigDecimal.double_fig
      t   = t*m25
      d   = t.div(k,m)
      k   = k+two
      pi  = pi + d
    end

    d = one
    k = one
    t = BigDecimal("956")
    while d.nonzero? && ((m = n - (pi.exponent - d.exponent).abs) > 0)
      m = BigDecimal.double_fig if m < BigDecimal.double_fig
      t   = t.div(m57121,n)
      d   = t.div(k,m)
      pi  = pi + d
      k   = k+two
    end
    pi
  end

  # call-seq:
  #   E(numeric) -> BigDecimal
  #
  # Computes e (the base of natural logarithms) to the specified number of
  # digits of precision, +numeric+.
  #
  #   BigMath.E(10).to_s
  #   #=> "0.271828182845904523536028752390026306410273e1"
  #
  def E(prec)
    raise ArgumentError, "Zero or negative precision for E" if prec <= 0
    BigMath.exp(1, prec)
  end
end
PK}$[;<]]5gems/gems/bigdecimal-3.1.1/lib/bigdecimal/jacobian.rbnu�[���# frozen_string_literal: false

require 'bigdecimal'

# require 'bigdecimal/jacobian'
#
# Provides methods to compute the Jacobian matrix of a set of equations at a
# point x. In the methods below:
#
# f is an Object which is used to compute the Jacobian matrix of the equations.
# It must provide the following methods:
#
# f.values(x):: returns the values of all functions at x
#
# f.zero:: returns 0.0
# f.one:: returns 1.0
# f.two:: returns 2.0
# f.ten:: returns 10.0
#
# f.eps:: returns the convergence criterion (epsilon value) used to determine whether two values are considered equal. If |a-b| < epsilon, the two values are considered equal.
#
# x is the point at which to compute the Jacobian.
#
# fx is f.values(x).
#
module Jacobian
  module_function

  # Determines the equality of two numbers by comparing to zero, or using the epsilon value
  def isEqual(a,b,zero=0.0,e=1.0e-8)
    aa = a.abs
    bb = b.abs
    if aa == zero &&  bb == zero then
      true
    else
      if ((a-b)/(aa+bb)).abs < e then
        true
      else
        false
      end
    end
  end


  # Computes the derivative of f[i] at x[i].
  # fx is the value of f at x.
  def dfdxi(f,fx,x,i)
    nRetry = 0
    n = x.size
    xSave = x[i]
    ok = 0
    ratio = f.ten*f.ten*f.ten
    dx = x[i].abs/ratio
    dx = fx[i].abs/ratio if isEqual(dx,f.zero,f.zero,f.eps)
    dx = f.one/f.ten     if isEqual(dx,f.zero,f.zero,f.eps)
    until ok>0 do
      deriv = []
      nRetry += 1
      if nRetry > 100
        raise "Singular Jacobian matrix. No change at x[" + i.to_s + "]"
      end
      dx = dx*f.two
      x[i] += dx
      fxNew = f.values(x)
      for j in 0...n do
        if !isEqual(fxNew[j],fx[j],f.zero,f.eps) then
          ok += 1
          deriv <<= (fxNew[j]-fx[j])/dx
        else
          deriv <<= f.zero
        end
      end
      x[i] = xSave
    end
    deriv
  end

  # Computes the Jacobian of f at x. fx is the value of f at x.
  def jacobian(f,fx,x)
    n = x.size
    dfdx = Array.new(n*n)
    for i in 0...n do
      df = dfdxi(f,fx,x,i)
      for j in 0...n do
        dfdx[j*n+i] = df[j]
      end
    end
    dfdx
  end
end
PK}$[��_���1gems/gems/bigdecimal-3.1.1/lib/bigdecimal/util.rbnu�[���# frozen_string_literal: false
#
#--
# bigdecimal/util extends various native classes to provide the #to_d method,
# and provides BigDecimal#to_d and BigDecimal#to_digits.
#++

require 'bigdecimal'

class Integer < Numeric
  # call-seq:
  #     int.to_d  -> bigdecimal
  #
  # Returns the value of +int+ as a BigDecimal.
  #
  #     require 'bigdecimal'
  #     require 'bigdecimal/util'
  #
  #     42.to_d   # => 0.42e2
  #
  # See also BigDecimal::new.
  #
  def to_d
    BigDecimal(self)
  end
end


class Float < Numeric
  # call-seq:
  #     float.to_d             -> bigdecimal
  #     float.to_d(precision)  -> bigdecimal
  #
  # Returns the value of +float+ as a BigDecimal.
  # The +precision+ parameter is used to determine the number of
  # significant digits for the result (the default is Float::DIG).
  #
  #     require 'bigdecimal'
  #     require 'bigdecimal/util'
  #
  #     0.5.to_d         # => 0.5e0
  #     1.234.to_d(2)    # => 0.12e1
  #
  # See also BigDecimal::new.
  #
  def to_d(precision=0)
    BigDecimal(self, precision)
  end
end


class String
  # call-seq:
  #     str.to_d  -> bigdecimal
  #
  # Returns the result of interpreting leading characters in +str+
  # as a BigDecimal.
  #
  #     require 'bigdecimal'
  #     require 'bigdecimal/util'
  #
  #     "0.5".to_d             # => 0.5e0
  #     "123.45e1".to_d        # => 0.12345e4
  #     "45.67 degrees".to_d   # => 0.4567e2
  #
  # See also BigDecimal::new.
  #
  def to_d
    BigDecimal.interpret_loosely(self)
  end
end


class BigDecimal < Numeric
  # call-seq:
  #     a.to_digits -> string
  #
  # Converts a BigDecimal to a String of the form "nnnnnn.mmm".
  # This method is deprecated; use BigDecimal#to_s("F") instead.
  #
  #     require 'bigdecimal/util'
  #
  #     d = BigDecimal("3.14")
  #     d.to_digits                  # => "3.14"
  #
  def to_digits
    if self.nan? || self.infinite? || self.zero?
      self.to_s
    else
      i       = self.to_i.to_s
      _,f,_,z = self.frac.split
      i + "." + ("0"*(-z)) + f
    end
  end

  # call-seq:
  #     a.to_d -> bigdecimal
  #
  # Returns self.
  #
  #     require 'bigdecimal/util'
  #
  #     d = BigDecimal("3.14")
  #     d.to_d                       # => 0.314e1
  #
  def to_d
    self
  end
end


class Rational < Numeric
  # call-seq:
  #     rat.to_d(precision)  -> bigdecimal
  #
  # Returns the value as a BigDecimal.
  #
  # The required +precision+ parameter is used to determine the number of
  # significant digits for the result.
  #
  #     require 'bigdecimal'
  #     require 'bigdecimal/util'
  #
  #     Rational(22, 7).to_d(3)   # => 0.314e1
  #
  # See also BigDecimal::new.
  #
  def to_d(precision)
    BigDecimal(self, precision)
  end
end


class Complex < Numeric
  # call-seq:
  #     cmp.to_d             -> bigdecimal
  #     cmp.to_d(precision)  -> bigdecimal
  #
  # Returns the value as a BigDecimal.
  #
  # The +precision+ parameter is required for a rational complex number.
  # This parameter is used to determine the number of significant digits
  # for the result.
  #
  #     require 'bigdecimal'
  #     require 'bigdecimal/util'
  #
  #     Complex(0.1234567, 0).to_d(4)   # => 0.1235e0
  #     Complex(Rational(22, 7), 0).to_d(3)   # => 0.314e1
  #
  # See also BigDecimal::new.
  #
  def to_d(*args)
    BigDecimal(self) unless self.imag.zero? # to raise eerror

    if args.length == 0
      case self.real
      when Rational
        BigDecimal(self.real) # to raise error
      end
    end
    self.real.to_d(*args)
  end
end


class NilClass
  # call-seq:
  #     nil.to_d -> bigdecimal
  #
  # Returns nil represented as a BigDecimal.
  #
  #     require 'bigdecimal'
  #     require 'bigdecimal/util'
  #
  #     nil.to_d   # => 0.0
  #
  def to_d
    BigDecimal(0)
  end
end
PK}$[ь��3gems/gems/bigdecimal-3.1.1/lib/bigdecimal/ludcmp.rbnu�[���# frozen_string_literal: false
require 'bigdecimal'

#
# Solves a*x = b for x, using LU decomposition.
#
module LUSolve
  module_function

  # Performs LU decomposition of the n by n matrix a.
  def ludecomp(a,n,zero=0,one=1)
    prec = BigDecimal.limit(nil)
    ps     = []
    scales = []
    for i in 0...n do  # pick up largest(abs. val.) element in each row.
      ps <<= i
      nrmrow  = zero
      ixn = i*n
      for j in 0...n do
        biggst = a[ixn+j].abs
        nrmrow = biggst if biggst>nrmrow
      end
      if nrmrow>zero then
        scales <<= one.div(nrmrow,prec)
      else
        raise "Singular matrix"
      end
    end
    n1          = n - 1
    for k in 0...n1 do # Gaussian elimination with partial pivoting.
      biggst  = zero;
      for i in k...n do
        size = a[ps[i]*n+k].abs*scales[ps[i]]
        if size>biggst then
          biggst = size
          pividx  = i
        end
      end
      raise "Singular matrix" if biggst<=zero
      if pividx!=k then
        j = ps[k]
        ps[k] = ps[pividx]
        ps[pividx] = j
      end
      pivot   = a[ps[k]*n+k]
      for i in (k+1)...n do
        psin = ps[i]*n
        a[psin+k] = mult = a[psin+k].div(pivot,prec)
        if mult!=zero then
          pskn = ps[k]*n
          for j in (k+1)...n do
            a[psin+j] -= mult.mult(a[pskn+j],prec)
          end
        end
      end
    end
    raise "Singular matrix" if a[ps[n1]*n+n1] == zero
    ps
  end

  # Solves a*x = b for x, using LU decomposition.
  #
  # a is a matrix, b is a constant vector, x is the solution vector.
  #
  # ps is the pivot, a vector which indicates the permutation of rows performed
  # during LU decomposition.
  def lusolve(a,b,ps,zero=0.0)
    prec = BigDecimal.limit(nil)
    n = ps.size
    x = []
    for i in 0...n do
      dot = zero
      psin = ps[i]*n
      for j in 0...i do
        dot = a[psin+j].mult(x[j],prec) + dot
      end
      x <<= b[ps[i]] - dot
    end
    (n-1).downto(0) do |i|
      dot = zero
      psin = ps[i]*n
      for j in (i+1)...n do
        dot = a[psin+j].mult(x[j],prec) + dot
      end
      x[i]  = (x[i]-dot).div(a[psin+i],prec)
    end
    x
  end
end
PK}$[h"A�ZZ3gems/gems/bigdecimal-3.1.1/lib/bigdecimal/newton.rbnu�[���# frozen_string_literal: false
require "bigdecimal/ludcmp"
require "bigdecimal/jacobian"

#
# newton.rb
#
# Solves the nonlinear algebraic equation system f = 0 by Newton's method.
# This program is not dependent on BigDecimal.
#
# To call:
#    n = nlsolve(f,x)
#  where n is the number of iterations required,
#        x is the initial value vector
#        f is an Object which is used to compute the values of the equations to be solved.
# It must provide the following methods:
#
# f.values(x):: returns the values of all functions at x
#
# f.zero:: returns 0.0
# f.one:: returns 1.0
# f.two:: returns 2.0
# f.ten:: returns 10.0
#
# f.eps:: returns the convergence criterion (epsilon value) used to determine whether two values are considered equal. If |a-b| < epsilon, the two values are considered equal.
#
# On exit, x is the solution vector.
#
module Newton
  include LUSolve
  include Jacobian
  module_function

  def norm(fv,zero=0.0) # :nodoc:
    s = zero
    n = fv.size
    for i in 0...n do
      s += fv[i]*fv[i]
    end
    s
  end

  # See also Newton
  def nlsolve(f,x)
    nRetry = 0
    n = x.size

    f0 = f.values(x)
    zero = f.zero
    one  = f.one
    two  = f.two
    p5 = one/two
    d  = norm(f0,zero)
    minfact = f.ten*f.ten*f.ten
    minfact = one/minfact
    e = f.eps
    while d >= e do
      nRetry += 1
      # Not yet converged. => Compute Jacobian matrix
      dfdx = jacobian(f,f0,x)
      # Solve dfdx*dx = -f0 to estimate dx
      dx = lusolve(dfdx,f0,ludecomp(dfdx,n,zero,one),zero)
      fact = two
      xs = x.dup
      begin
        fact *= p5
        if fact < minfact then
          raise "Failed to reduce function values."
        end
        for i in 0...n do
          x[i] = xs[i] - dx[i]*fact
        end
        f0 = f.values(x)
        dn = norm(f0,zero)
      end while(dn>=d)
      d = dn
    end
    nRetry
  end
end
PK}$[�H�k��gems/gems/rake-13.0.6/exe/rakenuȯ��#!/opt/alt/ruby31/bin/ruby

#--
# Copyright (c) 2003, 2004, 2005, 2006, 2007  Jim Weirich
#
# 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.
#++

require "rake"

Rake.application.run
PK}$[�
i��"gems/gems/rake-13.0.6/History.rdocnu�[���=== 13.0.6

* Additional fix for #389
  Pull request #390 by hsbt

=== 13.0.5

* Fixed the regression of #388
  Pull request #389 by hsbt

=== 13.0.4

* Fix rake test loader swallowing useful error information.
  Pull request #367 by deivid-rodriguez
* Add -C/--directory option the same as GNU make.
  Pull request #376 by nobu

=== 13.0.3

* Fix breaking change of execution order on TestTask.
  Pull request #368 by ysakasin

=== 13.0.2

==== Enhancements

* Fix tests to work with current FileUtils
  Pull Request #358 by jeremyevans
* Simplify default rake test loader
  Pull Request #357 by deivid-rodriguez
* Update rdoc
  Pull Request #366 by bahasalien
* Update broken links to rake articles from Avdi in README
  Pull Request #360 by svl7

=== 13.0.1

==== Bug fixes

* Fixed bug: Reenabled task raises previous exception on second invokation 
  Pull Request #271 by thorsteneckel
* Fix an incorrectly resolved arg pattern
  Pull Request #327 by mjbellantoni

=== 13.0.0

==== Enhancements

* Follows recent changes on keyword arguments in ruby 2.7.
  Pull Request #326 by nobu
* Make `PackageTask` be able to omit parent directory while packing files 
  Pull Request #310 by tonytonyjan
* Add order only dependency
  Pull Request #269 by take-cheeze

==== Compatibility changes

* Drop old ruby versions(< 2.2)

=== 12.3.3

==== Bug fixes

* Use the application's name in error message if a task is not found.
  Pull Request #303 by tmatilai

==== Enhancements:

* Use File.open explicitly.

=== 12.3.2

==== Bug fixes

* Fixed test fails caused by 2.6 warnings.
  Pull Request #297 by hsbt

==== Enhancements:

* Rdoc improvements.
  Pull Request #293 by colby-swandale
* Improve multitask performance.
  Pull Request #273 by jsm
* Add alias `prereqs`.
  Pull Request #268 by take-cheeze

=== 12.3.1

==== Bug fixes

* Support did_you_mean >= v1.2.0 which has a breaking change on formatters.
  Pull request #262 by FUJI Goro.

==== Enhancements:

* Don't run task if it depends on already invoked but failed task.
  Pull request #252 by Gonzalo Rodriguez.
* Make space trimming consistent for all task arguments.
  Pull request #259 by Gonzalo Rodriguez.
* Removes duplicated inclusion of Rake::DSL in tests.
  Pull request #254 by Gonzalo Rodriguez.
* Re-raise a LoadError that didn't come from require in the test loader.
  Pull request #250 by Dylan Thacker-Smith.

=== 12.3.0

==== Compatibility Changes

* Bump `required_ruby_version` to Ruby 2.0.0. Rake has already
  removed support for Ruby 1.9.x.

==== Enhancements:

* Support `test-bundled-gems` task on ruby core.

=== 12.2.1

==== Bug fixes

* Fixed to break Capistrano::Application on capistrano3.

=== 12.2.0

==== Enhancements:

* Make rake easier to use as a library
  Pull request #211 by @drbrain
* Fix quadratic performance in FileTask#out_of_date?
  Pull request #224 by @doudou
* Clarify output when printing nested exception traces
  Pull request #232 by @urbanautomaton

==== Bug fixes

* Account for a file that match 2 or more patterns.
  Pull request #231 by @styd

=== 12.1.0

==== Enhancements:

* Added did_you_mean feature for invalid rake task.
  Pull request #221 by @xtina-starr
* Enabled to dependency chained by extensions. Pull request #39 by Petr Skocik.
* Make all of string literals to frozen objects on Ruby 2.4 or later.

==== Bug fixes

* Typo fixes in rakefile.rdoc. Pull request #180 by Yuta Kurotaki.
* Fix unexpected behavior of file task with dryrun option.
  Pull request #183 by @aycabta.
* Make LoadError from running tests more obvious. Pull request #195
  by Eric Hodel.
* Fix unexpected TypeError with hash style option. Pull request #202
  by Kuniaki IGARASHI.

=== 12.0.0

==== Compatibility Changes

* Removed arguments on clear #157 by Jesse Bowes
* Removed `rake/contrib` packages. These are extracted to `rake-contrib` gem.
* Removed deprecated method named `last\_comment`.

==== Enhancements:

* Re-use trace option on `cleanup` task. #164 by Brian Henderson
* Actions adore keyword arguments #174 by Josh Cheek
* Rake::TaskArguments#key? alias of #has_key? #175 by Paul Annesley

=== 11.3.0 / 2016-09-20

==== Enhancements:

* Remove to reference `Fixnum` constant. Pull request #160 by nobu

=== 11.2.2 / 2016-06-12

==== Bug fixes

* Fix unexpected behavior with multiple dependencies on Rake::TestTask

=== 11.2.1 / 2016-06-12

==== Bug fixes

* Fix regression of dependencies handling on Rake::TestTask. Report #139

=== 11.2.0 / 2016-06-11

==== Bug fixes

* Fix unexpected cut-out behavior on task description using triple dots
  and exclamation. Report #106 from Stephan Kämper and Pull request #134 by Lee
* Fix empty argument assignment with `with_defaults` option. Pull request #135
  by bakunyo
* Ignore to use `hwprefs` on Darwin platform. Use sysctl now. Report #128

==== Enhancements

* Spawn options for sh Pull equest #138 by Eric Hodel.
* Allow to specify dependencies(prerequisites) for Rake::TestTask
  Pull request #117 by Tim Maslyuchenko
* Use Bundler task instead of hoe for gem release.
* Remove explicitly load to rubygems for Ruby 1.8.
* Unify to declare `Rake::VERSION`.
* Support xz format for PackageTask.

=== 11.1.2 / 2016-03-28

==== Bug fixes

* Remove `-W` option when Rake::TestTask#verbose enabled. It's misunderstanding
  specification change with Rake 11. Partly revert #67

=== 11.1.1 / 2016-03-14

==== Bug fixes

* Use `-W` instead of `--verbose` when Rake::TestTask#verbose enabled.
  JRuby doesn't have `--verbose` option.

=== 11.1.0 / 2016-03-11

==== Compatibility Changes

* Revert to remove `last\_comment`. It will remove Rake 12.

=== 11.0.1 / 2016-03-09

==== Bug fixes

* Fixed packaging manifest.

=== 11.0.0 / 2016-03-09

==== Bug fixes

* Correctly handle bad encoding in exception messages. Pull request #113
  by Tomer Brisker
* Fix verbose option at TestTask. Pull request #67 by Mike Blumtritt

==== Enhancements

* Make FileList#exclude more analogous to FileList#include.
* Use IO.open instead of Open3.popen3 for CPU counter.
* Make Rake::Task#already_invoked publicly accessible.
  Pull request #93 by Joe Rafaniello
* Lookup prerequisites with same name outside of scope instead of
  matching self. Pull request #96 by Sandy Vanderbleek
* Make FileList#pathmap behave like String#pathmap.
  Pull request #61 by Daniel Tamai
* Add fetch method to task arguments.
  Pull request #12 by Chris Keathley
* Use ruby warnings by default. Pull request #97 by Harold Giménez

==== Compatibility Changes

* Removed to support Ruby 1.8.x
* Removed constant named `RAKEVERSION`
* Removed Rake::AltSystem
* Removed Rake::RubyForgePublisher
* Removed Rake::TaskManager#last\_comment. Use last\_description.
* Removed Rake::TaskLib#paste
* Removed Top-level SshDirPublisher, SshFreshDirPublisher, SshFilePublisher
  and CompositePublisher from lib/rake/contrib/publisher.rb
* Removed "rake/runtest.rb"

=== 10.5.0 / 2016-01-13

==== Enhancements

* Removed monkey patching for Ruby 1.8. Pull request #46 by Pablo Herrero.
* Inheritance class of Rake::FileList returns always self class.
  Pull request #74 by Thomas Scholz

=== 10.4.2 / 2014-12-02

==== Bug fixes

* Rake no longer edits ARGV.  This allows you to re-exec rake from a rake
  task.  Pull requset #9 by Matt Palmer.
* Documented how Rake::DSL#desc handles sentences in task descriptions.
  Issue #7 by Raza Sayed.
* Fixed test error on 1.9.3 with legacy RubyGems.  Issue #8 by Matt Palmer.
* Deleted duplicated History entry.  Pull request #10 by Yuji Yamamoto.

=== 10.4.1 / 2014-12-01

==== Bug fixes

* Reverted fix for #277 as it caused numerous issues for rake users.
  rails/spring issue #366 by Gustavo Dutra.

=== 10.4.0 / 2014-11-22

==== Enhancements

* Upgraded to minitest 5.  Pull request #292 by Teo Ljungberg.
* Added support for Pathname in rake tasks.  Pull request #271 by Randy
  Coulman.
* Rake now ignores falsy dependencies which allows for easier programmatic
  creation of tasks.  Pull request #273 by Manav.
* Rake no longer edits ARGV.  This allows you to re-exec rake from a rake
  task.  Issue #277 by Matt Palmer.
* Etc.nprocessors is used for counting the number of CPUs.

==== Bug fixes

* Updated rake manpage.  Issue #283 by Nathan Long, pull request #291 by
  skittleys.
* Add Rake::LATE to allow rebuilding of files that depend on deleted files.
  Bug #286, pull request #287 by David Grayson.
* Fix relinking of files when repackaging.  Bug #276 by Muenze.
* Fixed some typos.  Pull request #280 by Jed Northridge.
* Try counting CPUs via cpuinfo if host_os was not matched.  Pull request
  #282 by Edouard B.

=== 10.3.2 / 2014-05-15

==== Bug fixes

* Rake no longer infinitely loops when showing exception causes that refer to
  each other.  Bug #272 by Chris Bandy.
* Fixed documentation typos.  Bug #275 by Jake Worth.

=== 10.3.1 / 2014-04-17

==== Bug fixes

* Really stop reporting an error when cleaning already-deleted files.  Pull
  request #269 by Randy Coulman
* Fixed infinite loop when cleaning already-deleted files on windows.

=== 10.3 / 2014-04-15

==== Enhancements

* Added --build-all option to rake which treats all file prerequisites as
  out-of-date.  Pull request #254 by Andrew Gilbert.
* Added Rake::NameSpace#scope.  Issue #263 by Jon San Miguel.

==== Bug fixes

* Suppress org.jruby package files in rake error messages for JRuby users.
  Issue #213 by Charles Nutter.
* Fixed typo, removed extra "h".  Pull request #267 by Hsing-Hui Hsu.
* Rake no longer reports an error when cleaning already-deleted files.  Pull
  request #266 by Randy Coulman.
* Consume stderr while determining CPU count to avoid hang.  Issue #268 by
  Albert Sun.

=== 10.2.2 / 2014-03-27

==== Bug fixes

* Restored Ruby 1.8.7 compatibility

=== 10.2.1 / 2014-03-25

==== Bug fixes

* File tasks including a ':' are now top-level tasks again.  Issue #262 by
  Josh Holtrop.
* Use sysctl for CPU count for all BSDs.  Pull request #261 by Joshua Stein.
* Fixed CPU detection for unknown platforms.

=== 10.2.0 / 2014-03-24

==== Enhancements

* Rake now requires Ruby 1.9 or newer.  For me, this is a breaking change, but
  it seems that Jim planned to release it with Rake 10.2.  See also pull
  request #247 by Philip Arndt.
* Rake now allows you to declare tasks under a namespace like:

    task 'a:b' do ... end

  Pull request #232 by Judson Lester.
* Task#source defaults to the first prerequisite in non-rule tasks.  Pull
  request #215 by Avdi Grimm.
* Rake now automatically rebuilds and reloads imported files.  Pull request
  #209 by Randy Coulman.
* The rake task arguments can contain escaped commas.  Pull request #214 by
  Filip Hrbek.
* Rake now prints the exception class on errors.  Patch #251 by David Cornu.

==== Bug fixes

* Fixed typos.  Pull request #256 by Valera Rozuvan, #250 via Jake Worth, #260
  by Zachary Scott.
* Fixed documentation for calling tasks with arguments.  Pull request #235 by
  John Varghese.
* Clarified `rake -f` usage message.  Pull request #252 by Marco Pfatschbacher.
* Fixed a test failure on windows.  Pull request #231 by Hiroshi Shirosaki.
* Fixed corrupted rake.1.gz.  Pull request #225 by Michel Boaventura.
* Fixed bug in can\_detect\_signals? in test.  Patch from #243 by Alexey
  Borzenkov.

=== 10.1.1

* Use http://github.com/jimweirich/rake instead of http://rake.rubyforge.org for
  canonical project url.

=== 10.1.0

==== Changes

===== New Features

* Add support for variable length task argument lists. If more actual
  arguments are supplied than named arguments, then the extra
  arguments values will be in args.extras.

* Application name is not displayed in the help banner. (Previously
  "rake" was hardcoded, now rake-based applications can display their
  own names).

===== Bug Fixes

Bug fixes include:

* Fix backtrace suppression issues.

* Rules now explicit get task arguments passed to them.

* Rename FileList#exclude? to FileList#exclude\_from\_list? to avoid
  conflict with new Rails method.

* Clean / Clobber tasks now report failure to remove files.

* Plus heaps of internal code cleanup.

==== Thanks

As usual, it was input from users that drove a lot of these changes.
The following people contributed patches, made suggestions or made
otherwise helpful comments. Thanks to ...

* Michael Nikitochkin (general code cleanup)
* Vipul A M (general code cleanup)
* Dennis Bell (variable length task argument lists)
* Jacob Swanner (rules arguments)
* Rafael Rosa Fu (documentation typo)
* Stuart Nelson (install.rb fixes)
* Lee Hambley (application name in help banner)

-- Jim Weirich

=== 10.0.3

  "Jim, when will Rake reach version 1.0?"

Over the past several years I've been asked that question at
conferences, panels and over twitter. Due to historical reasons (or
maybe just plain laziness) Rake has (incorrectly) been treating the
second digit of the version as the major release number. So in my head
Rake was already at version 9.

Well, it's time to fix things. This next version of Rake drops old,
crufty, backwards compatibility hacks such as top level constants, DSL
methods defined in Object and numerous other features that are just no
longer desired. It's also time to drop the leading zero from the
version number as well and call this new version of rake what it
really is: Version 10.

So, welcome to Rake 10.0!

Rake 10 is actually feature identical to the latest version of Rake 9
(that would be the version spelled 0.9.3), *except* that Rake 10 drops
all the sundry deprecated features that have accumulated over the years.

If your Rakefile is up to date and current with all the new features
of Rake 10, you are ready to go. If your Rakefile still uses a few
deprecated feeatures, feel free to use Rake 9 (0.9.3) with the same
feature set. Just be aware that future features will be in Rake 10
family line.

==== Changes

As mentioned above, there are no new features in Rake 10. However,
there are a number of features missing:

* Classic namespaces are now gone. Rake is no longer able to reflect
  the options settings in the global variables ($rakefile, $show\_tasks,
  $show\_prereqs, $trace, $dryrun and $silent). The
  <tt>--classic-namespace</tt> option is no longer supported.

* Global constants are no longer supported. This includes
  <tt>Task</tt>, <tt>FileTask</tt>, <tt>FileCreationTask</tt> and
  <tt>RakeApp</tt>). The constant missing hook to warn about using
  global rake constants has been removed.

* The Rake DSL methods (task, file, directory, etc) are in their own
  module (Rake::DSL). The stub versions of these methods (that printed
  warnings) in Object have been removed. However, the DSL methods are
  added to the top-level <tt>main</tt> object. Since <tt>main</tt> is
  not in the inheritance tree, the presence of the DSL methods in main
  should be low impact on other libraries.

  If you want to use the Rake DSL commands from your own code, just
  include <tt>Rake::DSL</tt> into your own classes and modules.

* The deprecated syntax for task arguments (the one using
  <tt>:needs</tt>) has been removed.

* The <tt>--reduce-compat</tt> flag has been removed (it's not needed
  anymore).

* The deprecated <tt>rake/sys.rb</tt> library has been removed.

* The deprecated <tt>rake/rdoctask.rb</tt> library has been removed.
  RDoc supplies its own rake task now.

* The deprecated <tt>rake/gempackagetask.rb</tt> library has been
  removed. Gem supplies its own package task now.

There is one small behavioral change:

* Non-file tasks now always report the current time as their time
  stamp. This is different from the previous behavior where non-file
  tasks reported current time only if there were no prerequisites, and
  the max prerequisite timestamp otherwise. This lead to inconsistent
  and surprising behavior when adding prerequisites to tasks that in
  turn were prequisites to file tasks. The new behavior is more
  consistent and predictable.

==== Changes (from 0.9.3, 0.9.4, 0.9.5)

Since Rake 10 includes the changes from the last version of Rake 9,
we'll repeat the changes for versions 0.9.3 through 0.9.5 here.

===== New Features (in 0.9.3)

* Multitask tasks now use a thread pool. Use -j to limit the number of
  available threads.

* Use -m to turn regular tasks into multitasks (use at your own risk).

* You can now do "Rake.add_rakelib 'dir'" in your Rakefile to
  programatically add rake task libraries.

* You can specific backtrace suppression patterns (see
  --suppress-backtrace)

* Directory tasks can now take prerequisites and actions

* Use --backtrace to request a full backtrace without the task trace.

* You can say "--backtrace=stdout" and "--trace=stdout" to route trace
  output to standard output rather than standard error.

* Optional 'phony' target (enable with 'require 'rake/phony'") for
  special purpose builds.

* Task#clear now clears task comments as well as actions and
  prerequisites. Task#clear_comment will specifically target comments.

* The --all option will force -T and -D to consider all the tasks,
  with and without descriptions.

===== Bug Fixes (in 0.9.3)

* Semi-colons in windows rakefile paths now work.

* Improved Control-C support when invoking multiple test suites.

* egrep method now reads files in text mode (better support for
  Windows)

* Better deprecation line number reporting.

* The -W option now works with all tasks, whether they have a
  description or not.

* File globs in rake should not be sorted alphabetically, independent
  of file system and platform.

* Numerous internal improvements.

* Documentation typos and fixes.

===== Bug Fixes (in 0.9.4)

* Exit status with failing tests is not correctly set to non-zero.

* Simplified syntax for phony task (for older versions of RDoc).

* Stand alone FileList usage gets glob function (without loading in
  extra dependencies)

===== Bug Fixes (in 0.9.5)

* --trace and --backtrace no longer swallow following task names.

==== Thanks

As usual, it was input from users that drove a lot of these changes. The
following people contributed patches, made suggestions or made
otherwise helpful comments.  Thanks to ...

* Aaron Patterson
* Dylan Smith
* Jo Liss
* Jonas Pfenniger
* Kazuki Tsujimoto
* Michael Bishop
* Michael Elufimov
* NAKAMURA Usaku
* Ryan Davis
* Sam Grönblom
* Sam Phippen
* Sergio Wong
* Tay Ray Chuan
* grosser
* quix

Also, many thanks to Eric Hodel for assisting with getting this release
out the door.

-- Jim Weirich

=== 10.0.2

==== Changes

===== Bug Fixes

* --trace and --backtrace no longer swallow following task names.

==== Thanks

As usual, it was input from users that drove a lot of these changes. The
following people contributed patches, made suggestions or made
otherwise helpful comments.  Thanks to ...

* Aaron Patterson
* Dylan Smith
* Jo Liss
* Jonas Pfenniger
* Kazuki Tsujimoto
* Michael Bishop
* Michael Elufimov
* NAKAMURA Usaku
* Ryan Davis
* Sam Grönblom
* Sam Phippen
* Sergio Wong
* Tay Ray Chuan
* grosser
* quix

Also, many thanks to Eric Hodel for assisting with getting this release
out the door.

-- Jim Weirich

=== 10.0.1

==== Changes

===== Bug Fixes

* Exit status with failing tests is not correctly set to non-zero.

* Simplified syntax for phony task (for older versions of RDoc).

* Stand alone FileList usage gets glob function (without loading in
  extra dependencies)

==== Thanks

As usual, it was input from users that drove a lot of these changes. The
following people contributed patches, made suggestions or made
otherwise helpful comments.  Thanks to ...

* Aaron Patterson
* Dylan Smith
* Jo Liss
* Jonas Pfenniger
* Kazuki Tsujimoto
* Michael Bishop
* Michael Elufimov
* NAKAMURA Usaku
* Ryan Davis
* Sam Grönblom
* Sam Phippen
* Sergio Wong
* Tay Ray Chuan
* grosser
* quix

Also, many thanks to Eric Hodel for assisting with getting this release
out the door.

-- Jim Weirich

=== 10.0.0

  "Jim, when will Rake reach version 1.0?"

Over the past several years I've been asked that question at
conferences, panels and over twitter. Due to historical reasons (or
maybe just plain laziness) Rake has (incorrectly) been treating the
second digit of the version as the major release number. So in my head
Rake was already at version 9.

Well, it's time to fix things. This next version of Rake drops old,
crufty, backwards compatibility hacks such as top level constants, DSL
methods defined in Object and numerous other features that are just no
longer desired. It's also time to drop the leading zero from the
version number as well and call this new version of rake what it
really is: Version 10.

So, welcome to Rake 10.0!

Rake 10 is actually feature identical to the latest version of Rake 9
(that would be the version spelled 0.9.3), *except* that Rake 10 drops
all the sundry deprecated features that have accumulated over the years.

If your Rakefile is up to date and current with all the new features
of Rake 10, you are ready to go. If your Rakefile still uses a few
deprecated feeatures, feel free to use Rake 9 (0.9.3) with the same
feature set. Just be aware that future features will be in Rake 10
family line.

==== Changes in 10.0

As mentioned above, there are no new features in Rake 10. However,
there are a number of features missing:

* Classic namespaces are now gone. Rake is no longer able to reflect
  the options settings in the global variables ($rakefile, $show\_tasks,
  $show\_prereqs, $trace, $dryrun and $silent). The
  <tt>--classic-namespace</tt> option is no longer supported.

* Global constants are no longer supported. This includes
  <tt>Task</tt>, <tt>FileTask</tt>, <tt>FileCreationTask</tt> and
  <tt>RakeApp</tt>). The constant missing hook to warn about using
  global rake constants has been removed.

* The Rake DSL methods (task, file, directory, etc) are in their own
  module (Rake::DSL). The stub versions of these methods (that printed
  warnings) in Object have been removed. However, the DSL methods are
  added to the top-level <tt>main</tt> object. Since <tt>main</tt> is
  not in the inheritance tree, the presence of the DSL methods in main
  should be low impact on other libraries.

  If you want to use the Rake DSL commands from your own code, just
  include <tt>Rake::DSL</tt> into your own classes and modules.

* The deprecated syntax for task arguments (the one using
  <tt>:needs</tt>) has been removed.

* The <tt>--reduce-compat</tt> flag has been removed (it's not needed
  anymore).

* The deprecated <tt>rake/sys.rb</tt> library has been removed.

* The deprecated <tt>rake/rdoctask.rb</tt> library has been removed.
  RDoc supplies its own rake task now.

* The deprecated <tt>rake/gempackagetask.rb</tt> library has been
  removed. Gem supplies its own package task now.

There is one small behavioral change:

* Non-file tasks now always report the current time as their time
  stamp. This is different from the previous behavior where non-file
  tasks reported current time only if there were no prerequisites, and
  the max prerequisite timestamp otherwise. This lead to inconsistent
  and surprising behavior when adding prerequisites to tasks that in
  turn were prequisites to file tasks. The new behavior is more
  consistent and predictable.

==== Changes (from 0.9.3)

Since Rake 10 includes the changes from the last version of Rake 9,
we'll repeat the changes for version 0.9.3 here.

===== New Features

* Multitask tasks now use a thread pool. Use -j to limit the number of
  available threads.

* Use -m to turn regular tasks into multitasks (use at your own risk).

* You can now do "Rake.add_rakelib 'dir'" in your Rakefile to
  programatically add rake task libraries.

* You can specific backtrace suppression patterns (see
  --suppress-backtrace)

* Directory tasks can now take prerequisites and actions

* Use --backtrace to request a full backtrace without the task trace.

* You can say "--backtrace=stdout" and "--trace=stdout" to route trace
  output to standard output rather than standard error.

* Optional 'phony' target (enable with 'require 'rake/phony'") for
  special purpose builds.

* Task#clear now clears task comments as well as actions and
  prerequisites. Task#clear_comment will specifically target comments.

* The --all option will force -T and -D to consider all the tasks,
  with and without descriptions.

===== Bug Fixes

* Semi-colons in windows rakefile paths now work.

* Improved Control-C support when invoking multiple test suites.

* egrep method now reads files in text mode (better support for
  Windows)

* Better deprecation line number reporting.

* The -W option now works with all tasks, whether they have a
  description or not.

* File globs in rake should not be sorted alphabetically, independent
  of file system and platform.

* Numerous internal improvements.

* Documentation typos and fixes.


==== Thanks

As usual, it was input from users that drove a lot of these changes. The
following people contributed patches, made suggestions or made
otherwise helpful comments.  Thanks to ...

* Aaron Patterson
* Dylan Smith
* Jo Liss
* Jonas Pfenniger
* Kazuki Tsujimoto
* Michael Bishop
* Michael Elufimov
* NAKAMURA Usaku
* Ryan Davis
* Sam Grönblom
* Sam Phippen
* Sergio Wong
* Tay Ray Chuan
* grosser
* quix

Also, many thanks to Eric Hodel for assisting with getting this release
out the door.

-- Jim Weirich

=== 0.9.6

Rake version 0.9.6 contains a number of fixes mainly for merging
Rake into the Ruby source tree and fixing tests.

==== Changes

===== Bug Fixes (0.9.6)

* Better trace output when using a multi-threaded Rakefile.
* Arg parsing is now consistent for tasks and multitasks.
* Skip exit code test in versions of Ruby that don't support it well.

Changes for better integration with the Ruby source tree:

* Fix version literal for Ruby source tree build.
* Better loading of libraries for testing in Ruby build.
* Use the ruby version provided by Ruby's tests.

==== Thanks

As usual, it was input from users that drove a alot of these changes. The
following people either contributed patches, made suggestions or made
otherwise helpful comments.  Thanks to ...

* Aaron Patterson
* Dylan Smith
* Jo Liss
* Jonas Pfenniger
* Kazuki Tsujimoto
* Michael Bishop
* Michael Elufimov
* NAKAMURA Usaku
* Ryan Davis
* Sam Grönblom
* Sam Phippen
* Sergio Wong
* Tay Ray Chuan
* grosser
* quix

Also, many thanks to Eric Hodel for assisting with getting this release
out the door.

-- Jim Weirich

=== 0.9.5

Rake version 0.9.5 contains a number of bug fixes.

==== Changes

===== Bug Fixes (0.9.5)

* --trace and --backtrace no longer swallow following task names.

==== Thanks

As usual, it was input from users that drove a alot of these changes. The
following people either contributed patches, made suggestions or made
otherwise helpful comments.  Thanks to ...

* Aaron Patterson
* Dylan Smith
* Jo Liss
* Jonas Pfenniger
* Kazuki Tsujimoto
* Michael Bishop
* Michael Elufimov
* NAKAMURA Usaku
* Ryan Davis
* Sam Grönblom
* Sam Phippen
* Sergio Wong
* Tay Ray Chuan
* grosser
* quix

Also, many thanks to Eric Hodel for assisting with getting this release
out the door.

-- Jim Weirich

=== 0.9.4

Rake version 0.9.4 contains a number of bug fixes.

==== Changes

===== Bug Fixes (0.9.4)

* Exit status with failing tests is not correctly set to non-zero.

* Simplified syntax for phony task (for older versions of RDoc).

* Stand alone FileList usage gets glob function (without loading in
  extra dependencies)

==== Thanks

As usual, it was input from users that drove a alot of these changes. The
following people either contributed patches, made suggestions or made
otherwise helpful comments.  Thanks to ...

* Aaron Patterson
* Dylan Smith
* Jo Liss
* Jonas Pfenniger
* Kazuki Tsujimoto
* Michael Bishop
* Michael Elufimov
* NAKAMURA Usaku
* Ryan Davis
* Sam Grönblom
* Sam Phippen
* Sergio Wong
* Tay Ray Chuan
* grosser
* quix

Also, many thanks to Eric Hodel for assisting with getting this release
out the door.

-- Jim Weirich

=== 0.9.3

Rake version 0.9.3 contains some new, backwards compatible features and
a number of bug fixes.

==== Changes

===== New Features

* Multitask tasks now use a thread pool. Use -j to limit the number of
  available threads.

* Use -m to turn regular tasks into multitasks (use at your own risk).

* You can now do "Rake.add_rakelib 'dir'" in your Rakefile to
  programatically add rake task libraries.

* You can specific backtrace suppression patterns (see
  --suppress-backtrace)

* Directory tasks can now take prerequisites and actions

* Use --backtrace to request a full backtrace without the task trace.

* You can say "--backtrace=stdout" and "--trace=stdout" to route trace
  output to standard output rather than standard error.

* Optional 'phony' target (enable with 'require 'rake/phony'") for
  special purpose builds.

* Task#clear now clears task comments as well as actions and
  prerequisites. Task#clear_comment will specifically target comments.

* The --all option will force -T and -D to consider all the tasks,
  with and without descriptions.

===== Bug Fixes

* Semi-colons in windows rakefile paths now work.

* Improved Control-C support when invoking multiple test suites.

* egrep method now reads files in text mode (better support for
  Windows)

* Better deprecation line number reporting.

* The -W option now works with all tasks, whether they have a
  description or not.

* File globs in rake should not be sorted alphabetically, independent
  of file system and platform.

* Numerous internal improvements.

* Documentation typos and fixes.

==== Thanks

As usual, it was input from users that drove a alot of these changes. The
following people either contributed patches, made suggestions or made
otherwise helpful comments.  Thanks to ...

* Aaron Patterson
* Dylan Smith
* Jo Liss
* Jonas Pfenniger
* Kazuki Tsujimoto
* Michael Bishop
* Michael Elufimov
* NAKAMURA Usaku
* Ryan Davis
* Sam Grönblom
* Sam Phippen
* Sergio Wong
* Tay Ray Chuan
* grosser
* quix

Also, many thanks to Eric Hodel for assisting with getting this release
out the door.

-- Jim Weirich

=== Rake 0.9.2.2

Rake version 0.9.2.2 is mainly bug fixes.

==== Changes

* The rake test loader now removes arguments it has processed.  Issue #51
* Rake::TaskArguments now responds to #values\_at
* RakeFileUtils.verbose_flag = nil silences output the same as 0.8.7
* Rake tests are now directory-independent
* Rake tests are no longer require flexmock
* Commands constant is no longer polluting top level namespace.
* Show only the interesting portion of the backtrace by default (James M. Lawrence).
* Added --reduce-compat option to remove backward compatible DSL hacks (James M. Lawrence).

==== Thanks

As usual, it was input from users that drove a alot of these changes. The
following people either contributed patches, made suggestions or made
otherwise helpful comments.  Thanks to ...

* James M. Lawrence (quix)
* Roger Pack
* Cezary Baginski
* Sean Scot August Moon
* R.T. Lechow
* Alex Chaffee
* James Tucker
* Matthias Lüdtke
* Santiago Pastorino

Also, bit thanks to Eric Hodel for assisting with getting this release
out the door (where "assisting" includes, but is not by any means
limited to, "pushing" me to get it done).

-- Jim Weirich

=== 0.9.2

Rake version 0.9.2 has a few small fixes.  See below for details.

==== Changes

* Support for Ruby 1.8.6 was fixed.
* Global DSL warnings now honor --no-deprecate

==== Thanks

As usual, it was input from users that drove a alot of these changes. The
following people either contributed patches, made suggestions or made
otherwise helpful comments.  Thanks to ...

* James M. Lawrence (quix)
* Roger Pack
* Cezary Baginski
* Sean Scot August Moon
* R.T. Lechow
* Alex Chaffee
* James Tucker
* Matthias Lüdtke
* Santiago Pastorino

Also, bit thanks to Eric Hodel for assisting with getting this release
out the door (where "assisting" includes, but is not by any means
limited to, "pushing" me to get it done).

-- Jim Weirich

=== 0.9.1

Rake version 0.9.1 has a number of bug fixes and enhancments (see
below for more details).  Additionally, the internals have be slightly
restructured and improved.

==== Changes

Rake 0.9.1 adds back the global DSL methods, but with deprecation
messages.  This allows Rake 0.9.1 to be used with older rakefiles with
warning messages.

==== Thanks

As usual, it was input from users that drove a alot of these changes. The
following people either contributed patches, made suggestions or made
otherwise helpful comments.  Thanks to ...

* James M. Lawrence (quix)
* Roger Pack
* Cezary Baginski
* Sean Scot August Moon
* R.T. Lechow
* Alex Chaffee
* James Tucker
* Matthias Lüdtke
* Santiago Pastorino

Also, bit thanks to Eric Hodel for assisting with getting this release
out the door (where "assisting" includes, but is not by any means
limited to, "pushing" me to get it done).

-- Jim Weirich

=== 0.9.0

Rake version 0.9.0 has a number of bug fixes and enhancments (see
below for more details).  Additionally, the internals have be slightly
restructured and improved.

==== Changes

===== New Features / Enhancements / Bug Fixes in Version 0.9.0

* Rake now warns when the deprecated :needs syntax used (and suggests
  the proper syntax in the warning).

* Moved Rake DSL commands to top level ruby object 'main'.  Rake DSL
  commands are no longer private methods in Object. (Suggested by
  James M. Lawrence/quix)

* Rake now uses case-insensitive comparisons to find the Rakefile on Windows.
  Based on patch by Roger Pack.

* Rake now requires (instead of loads) files in the test task.  Patch by Cezary
  Baginski.

* Fixed typos.  Patches by Sean Scot August Moon and R.T. Lechow.

* Rake now prints the Rakefile directory only when it's different from the
  current directory.  Patch by Alex Chaffee.

* Improved rakefile_location discovery on Windows.  Patch by James Tucker.

* Rake now recognizes "Windows Server" as a windows system.  Patch by Matthias
  Lüdtke

* Rake::RDocTask is deprecated.  Use RDoc::Task from RDoc 2.4.2+ (require
  'rdoc/task')

* Rake::GemPackageTask is deprecated.  Use Gem::PackageTask (require
  'rubygems/package\_task')

* Rake now outputs various messages to $stderr instead of $stdout.

* Rake no longer emits warnings for Config.  Patch by Santiago Pastorino.

* Removed Rake's DSL methods from the top level scope.  If you need to
  call 'task :xzy' in your code, include Rake::DSL into your class, or
  put the code in a Rake::DSL.environment do ... end block.

* Split rake.rb into individual files.

* Support for the --where (-W) flag for showing where a task is defined.

* Fixed quoting in test task.
  (http://onestepback.org/redmine/issues/show/44,
  http://www.pivotaltracker.com/story/show/1223138)

* Fixed the silent option parsing problem.
  (http://onestepback.org/redmine/issues/show/47)

* Fixed :verbose=>false flag on sh and ruby commands.

* Rake command line options may be given by default in a RAKEOPT
  environment variable.

* Errors in Rake will now display the task invocation chain in effect
  at the time of the error.

* Accepted change by warnickr to not expand test patterns in shell
  (allowing more files in the test suite).

* Fixed that file tasks did not perform prereq lookups in scope
  (Redmine #57).

==== Thanks

As usual, it was input from users that drove a alot of these changes. The
following people either contributed patches, made suggestions or made
otherwise helpful comments.  Thanks to ...

* James M. Lawrence (quix)
* Roger Pack
* Cezary Baginski
* Sean Scot August Moon
* R.T. Lechow
* Alex Chaffee
* James Tucker
* Matthias Lüdtke
* Santiago Pastorino

Also, bit thanks to Eric Hodel for assisting with getting this release
out the door (where "assisting" includes, but is not by any means
limited to, "pushing" me to get it done).

-- Jim Weirich


=== 0.8.7

Rake version 0.8.5 introduced greatly improved support for executing
commands on Windows.  The "sh" command now has the same semantics on
Windows that it has on Unix based platforms.

Rake version 0.8.6 includes minor fixes the the RDoc generation.
Rake version 0.8.7 includes a minor fix for JRuby running on windows.

==== Changes

===== New Features / Enhancements in Version 0.8.5

* Improved implementation of the Rake system command for Windows.
  (patch from James M. Lawrence/quix)

* Support for Ruby 1.9's improved system command.  (patch from James
  M. Lawrence/quix)

* Rake now includes the configured extension when invoking an
  executable (Config::CONFIG['EXEEXT])

===== Bug Fixes in Version 0.8.5

* Environment variable keys are now correctly cased (it matters in
  some implementations).

==== Thanks

As usual, it was input from users that drove a alot of these changes. The
following people either contributed patches, made suggestions or made
otherwise helpful comments.  Thanks to ...

* Charles Nutter

-- Jim Weirich

=== 0.8.6

Rake version 0.8.5 introduced greatly improved support for executing
commands on Windows.  The "sh" command now has the same semantics on
Windows that it has on Unix based platforms.

Rake version 0.8.5 includes minor fixes the the RDoc generation.

==== Thanks

As usual, it was input from users that drove a alot of these changes. The
following people either contributed patches, made suggestions or made
otherwise helpful comments.  Thanks to ...

* James M. Lawrence/quix
* Luis Lavena

-- Jim Weirich

=== 0.8.5

Rake version 0.8.5 is a new release of Rake with greatly improved
support for executing commands on Windows.  The "sh" command now has
the same semantics on Windows that it has on Unix based platforms.

==== Changes

===== New Features / Enhancements in Version 0.8.5

* Improved implementation of the Rake system command for Windows.
  (patch from James M. Lawrence/quix)

* Support for Ruby 1.9's improved system command.  (patch from James
  M. Lawrence/quix)

* Rake now includes the configured extension when invoking an
  executable (Config::CONFIG['EXEEXT])

===== Bug Fixes in Version 0.8.5

* Environment variable keys are now correctly cased (it matters in
  some implementations).

==== Thanks

As usual, it was input from users that drove a alot of these changes. The
following people either contributed patches, made suggestions or made
otherwise helpful comments.  Thanks to ...

* James M. Lawrence/quix
* Luis Lavena

-- Jim Weirich

=== 0.8.4

Rake version 0.8.4 is a bug-fix release of rake.

NOTE: The version of Rake that comes with Ruby 1.9 has diverged
      slightly from the core Rake code base.  Rake 0.8.4 will work
      with Ruby 1.9, but is not a strict upgrade for the Rake that
      comes with Ruby 1.9.  A (near) future release of Rake will unify
      those two codebases.

==== Letter Writing Campaign

Thanks to Aaron Patterson (@tenderlove) and Eric Hodel (@drbrain) for
their encouraging support in organizing a letter writing campaign to
lobby for the "Warning Free" release of rake 0.8.4.  A special callout
goes to Jonathan D. Lord, Sr (Dr. Wingnut) whose postcard was the
first to actually reach me. (see
http://tenderlovemaking.com/2009/02/26/we-need-a-new-version-of-rake/
for details)

==== Changes

===== New Features / Enhancements in Version 0.8.4

* Case is preserved on rakefile names. (patch from James
  M. Lawrence/quix)

* Improved Rakefile case insensitivity testing (patch from Luis
  Lavena).

* Windows system dir search order is now: HOME, HOMEDRIVE + HOMEPATH,
  APPDATA, USERPROFILE (patch from Luis Lavena)

* MingGW is now recognized as a windows platform.  (patch from Luis
  Lavena)

===== Bug Fixes in Version 0.8.4

* Removed reference to manage_gem to fix the warning produced by the
  gem package task.

* Fixed stray ARGV option problem that was interfering with
  Test::Unit::Runner. (patch from Pivotal Labs)

===== Infrastructure Improvements in Version 0.8.4

* Numerous fixes to the windows test suite (patch from Luis Lavena).

* Improved Rakefile case insensitivity testing (patch from Luis
  Lavena).

* Better support for windows paths in the test task (patch from Simon
  Chiang/bahuvrihi)

==== Thanks

As usual, it was input from users that drove a alot of these changes. The
following people either contributed patches, made suggestions or made
otherwise helpful comments.  Thanks to ...

* James M. Lawrence/quix
* Luis Lavena
* Pivotal Labs
* Simon Chiang/bahuvrihi

-- Jim Weirich

=== 0.8.3

Rake version 0.8.3 is a bug-fix release of rake.

==== Changes

===== Bug Fixes in Version 0.8.3

* Enhanced the system directory detection in windows. We now check
  HOMEDRIVE/HOMEPATH and USERPROFILE if APPDATA isn't found. (Patch
  supplied by James Tucker). Rake no long aborts if it can't find the
  directory.

* Added fix to handle ruby installations in directories with spaces in
  their name.

==== Thanks

As usual, it was input from users that drove a alot of these changes. The
following people either contributed patches, made suggestions or made
otherwise helpful comments.  Thanks to ...

* Edwin Pratomo
* Gavin Stark
* Adam Q. Salter
* Adam Majer
* Emanuel Indermühle
* Ittay Dror
* Bheeshmar Redheendran (for spending an afternoon with me debugging
  windows issues)

-- Jim Weirich


=== 0.8.2

Rake version 0.8.2 is a new release of rake that includes a number of
new features and numerous bug fixes.

==== Changes

===== New Features in Version 0.8.2

* Switched from getoptlong to optparse (patches supplied by Edwin
  Pratomo).

* The -T option will now attempt to dynamically sense the size of the
  terminal. The -T output will only self-truncate if the output is a
  tty. However, if RAKE_COLUMNS is explicitly set, it will be honored
  in any case. (Patch provided by Gavin Stark).

* The following public methods have been added to rake task objects:

  * task.clear -- Clear both the prerequisites and actions of the
    target rake task.
  * task.clear_prerequisites -- Clear all the existing prerequisites
    from the target rake task.
  * task.clear_actions -- Clear all the existing actions from the
    target rake task.
  * task.reenable -- Re-enable a task, allowing its actions to be
    executed again if the task is invoked.

* Changed RDoc test task to have no default template. This makes it
  easier for the tempate to pick up the template from the environment.

* Default values for task arguments can easily be specified with the
  :with_defaults method. (Idea for default argument merging supplied
  by (Adam Q. Salter)

===== Bug Fixes in Version 0.8.2

* Fixed bug in package task so that it will include the subdir
  directory in the package for testing. (Bug found by Adam Majer)

* Fixed filename dependency order bug in test\_inspect\_pending and
  test\_to\_s\_pending. (Bug found by Adam Majer)

* Fixed check for file utils options to make them immune to the
  symbol/string differences. (Patch supplied by Edwin Pratomo)

* Fixed bug with rules involving multiple source, where only the first
  dependency of a rule has any effect (Patch supplied by Emanuel
  Indermühle)

* FileList#clone and FileList#dup have better sematics w.r.t. taint
  and freeze.

* Changed from using Mutex to Monitor. Evidently Mutex causes thread
  join errors when Ruby is compiled with -disable-pthreads. (Patch
  supplied by Ittay Dror)

* Fixed bug in makefile parser that had problems with extra spaces in
  file task names. (Patch supplied by Ittay Dror)

==== Other changes in Version 0.8.2

* Added ENV var to rake's own Rakefile to prevent OS X from including
  extended attribute junk in the rake package tar file. (Bug found by
  Adam Majer)

* Added a performance patch for reading large makefile dependency
  files. (Patch supplied by Ittay Dror)

==== Task Argument Examples

Prior to version 0.8.0, rake was only able to handle command line
arguments of the form NAME=VALUE that were passed into Rake via the
ENV hash.  Many folks had asked for some kind of simple command line
arguments, perhaps using "--" to separate regular task names from
argument values on the command line.  The problem is that there was no
easy way to associate positional arguments on the command line with
different tasks.  Suppose both tasks :a and :b expect a command line
argument: does the first value go with :a?  What if :b is run first?
Should it then get the first command line argument.

Rake 0.8.0 solves this problem by explicitly passing values directly
to the tasks that need them.  For example, if I had a release task
that required a version number, I could say:

   rake release[0.8.2]

And the string "0.8.2" will be passed to the :release task.  Multiple
arguments can be passed by separating them with a comma, for example:

   rake name[john,doe]

Just a few words of caution.  The rake task name and its arguments
need to be a single command line argument to rake.  This generally
means no spaces.  If spaces are needed, then the entire rake +
argument string should be quoted.  Something like this:

   rake "name[billy bob, smith]"

(Quoting rules vary between operating systems and shells, so make sure
you consult the proper docs for your OS/shell).

===== Tasks that Expect Parameters

Parameters are only given to tasks that are setup to expect them.  In
order to handle named parameters, the task declaration syntax for
tasks has been extended slightly.

For example, a task that needs a first name and last name might be
declared as:

   task :name, :first_name, :last_name

The first argument is still the name of the task (:name in this case).
The next to argumements are the names of the parameters expected by
:name (:first_name and :last_name in the example).

To access the values of the parameters, the block defining the task
behaviour can now accept a second parameter:

   task :name, :first_name, :last_name do |t, args|
     puts "First name is #{args.first_name}"
     puts "Last  name is #{args.last_name}"
   end

The first argument of the block "t" is always bound to the current
task object.  The second argument "args" is an open-struct like object
that allows access to the task arguments.  Extra command line
arguments to a task are ignored.  Missing command line arguments are
given the nil value.

==== Thanks

As usual, it was input from users that drove a alot of these changes. The
following people either contributed patches, made suggestions or made
otherwise helpful comments.  Thanks to ...

* Edwin Pratomo
* Gavin Stark
* Adam Q. Salter
* Adam Majer
* Emanuel Indermühle
* Ittay Dror
* Bheeshmar Redheendran (for spending an afternoon with me debugging
  windows issues)

-- Jim Weirich

=== 0.8.0/0.8.1

Rake version 0.8.0 is a new release of rake that includes serveral new
features.

==== Changes

===== New Features in Version 0.8.0

* Tasks can now receive command line parameters.  See the examples
  below for more details.

* Comments are limited to 80 columns on output, but full comments can
  be seen by using the -D parameter. (feature suggested by Jamis
  Buck).

* Explicit exit(n) calls will now set the exit status to n. (patch
  provided by Stephen Touset).

* Rake is now compatible with Ruby 1.9.

Version 0.8.1 is a minor update that includes additional Ruby 1.9
compatibility fixes.

==== Task Argument Examples

Prior to version 0.8.0, rake was only able to handle command line
arguments of the form NAME=VALUE that were passed into Rake via the
ENV hash.  Many folks had asked for some kind of simple command line
arguments, perhaps using "--" to separate regular task names from
argument values on the command line.  The problem is that there was no
easy way to associate positional arguments on the command line with
different tasks.  Suppose both tasks :a and :b expect a command line
argument: does the first value go with :a?  What if :b is run first?
Should it then get the first command line argument.

Rake 0.8.0 solves this problem by explicitly passing values directly
to the tasks that need them.  For example, if I had a release task
that required a version number, I could say:

   rake release[0.8.0]

And the string "0.8.0" will be passed to the :release task.  Multiple
arguments can be passed by separating them with a comma, for example:

   rake name[john,doe]

Just a few words of caution.  The rake task name and its arguments
need to be a single command line argument to rake.  This generally
means no spaces.  If spaces are needed, then the entire rake +
argument string should be quoted.  Something like this:

   rake "name[billy bob, smith]"

(Quoting rules vary between operating systems and shells, so make sure
you consult the proper docs for your OS/shell).

===== Tasks that Expect Parameters

Parameters are only given to tasks that are setup to expect them.  In
order to handle named parameters, the task declaration syntax for
tasks has been extended slightly.

For example, a task that needs a first name and last name might be
declared as:

   task :name, :first_name, :last_name

The first argument is still the name of the task (:name in this case).
The next to argumements are the names of the parameters expected by
:name (:first_name and :last_name in the example).

To access the values of the parameters, the block defining the task
behaviour can now accept a second parameter:

   task :name, :first_name, :last_name do |t, args|
     puts "First name is #{args.first_name}"
     puts "Last  name is #{args.last_name}"
   end

The first argument of the block "t" is always bound to the current
task object.  The second argument "args" is an open-struct like object
that allows access to the task arguments.  Extra command line
arguments to a task are ignored.  Missing command line arguments are
given the nil value.

==== Thanks

As usual, it was input from users that drove a alot of these changes. The
following people either contributed patches, made suggestions or made
otherwise helpful comments.  Thanks to ...

* Jamis Buck (for comment formatting suggestions)
* Stephen Touset (for exit status patch).

-- Jim Weirich


=== 0.7.3

Rake version 0.7.3 is a minor release that includes some refactoring to better
support custom Rake applications.

==== Changes

===== New Features in Version 0.7.3

* Added the +init+ and +top_level+ methods to make the creation of custom Rake applications a bit easier.  E.g.

    gem 'rake', ">= 0.7.3"
    require 'rake'

    Rake.application.init('myrake')

    task :default do
      something_interesting
    end

    Rake.application.top_level

==== Thanks

As usual, it was input from users that drove a alot of these changes. The
following people either contributed patches, made suggestions or made
otherwise helpful comments. Thanks to ...

-- Jim Weirich


=== 0.7.2


Version 0.7.2 supplies a bug fix and a few minor enhancements. In
particular, the new version fixes an incompatibility with the soon to
be released Ruby 1.8.6.  We strongly recommend upgrading to Rake 0.7.2
in order to be compatible with the new version of Ruby.

==== Changes

===== Bug Fixes in 0.7.2

There are quite a number of bug fixes in the new 0.7.2 version of
Rake:

* Removed dependency on internal fu_xxx functions from FileUtils.

* Error messages are now send to stderr rather than stdout (from
  Payton Quackenbush).

* Better error handling on invalid command line arguments (from Payton
  Quackenbush).

* Fixed some bugs where the application object was going to the global
  appliation instead of using its own data.

* Fixed the method name leak from FileUtils (bug found by Glenn
  Vanderburg).

* Added test for noop, bad_option and verbose flags to sh command.

* Added a description to the gem task in GemPackageTask.

* Fixed a bug when rules have multiple prerequisites (patch by Joel
  VanderWerf)

* Added the handful of RakeFileUtils to the private method as well.

===== New Features in 0.7.2

The following new features are available in Rake version 0.7.2:

* Added square and curly bracket patterns to FileList#include (Tilman
  Sauerbeck).

* FileLists can now pass a block to FileList#exclude to exclude files
  based on calculated values.

* Added plain filename support to rule dependents (suggested by Nobu
  Nakada).

* Added pathmap support to rule dependents.  In other words, if a
  pathmap format (beginning with a '%') is given as a Rake rule
  dependent, then the name of the depend will be the name of the
  target with the pathmap format applied.

* Added a 'tasks' method to a namespace to get a list of tasks
  associated with the namespace.

* Added tar_command and zip_command options to the Package task.

* The clean task will no longer delete 'core' if it is a directory.

===== Internal Rake Improvements

The following changes will are mainly internal improvements and
refactorings and have little effect on the end user.  But they may be
of interest to the general public.

* Added rcov task and updated unit testing for better code coverage.

* Added a 'shame' task to the Rakefile.

* Added rake_extension to handle detection of extension collisions.

* Added a protected 'require "rubygems"' to test/test_application to
  unbreak cruisecontrol.rb.

* Removed rake\_dup.  Now we just simply rescue a bad dup.

* Refactored the FileList reject logic to remove duplication.

* Removed if \_\_FILE\_\_ at the end of the rake.rb file.

==== Thanks

As usual, it was input from users that drove a alot of these changes.
The following people either contributed patches, made suggestions or
made otherwise helpful comments.  Thanks to ...

* Payton Quackenbush -- For several error handling improvements.

* Glenn Vanderburg -- For finding and fixing the method name leak from
  FileUtils.

* Joel VanderWerf -- for finding and fixing a bug in the handling of
  multiple prerequisites.

* Tilman Sauerbeck -- For some enhancing FileList to support more
  advanced file globbing.

* Nobu Nakada -- For suggesting plain file name support to rule dependents.

-- Jim Weirich

=== 0.7.1

Version 0.7.1 supplies a bug fix and a few minor enhancements.

==== Changes

===== Bug Fixes in 0.7.1

* Changes in the exception reported for the FileUtils.ln caused
  safe_ln to fail with a NotImplementedError.  Rake 0.7.1 will now
  catch that error or any StandardError and properly fall back to
  using +cp+.

===== New Features in 0.7.1

* You can filter the results of the --task option by supplying an
  optional regular expression.  This allows the user to easily find a
  particular task name in a long list of possible names.

* Transforming procs in a rule may now return a list of prerequisites.
  This allows more flexible rule formation.

* FileList and String now support a +pathmap+ melthod that makes the
  transforming paths a bit easier.  See the API docs for +pathmap+ for
  details.

* The -f option without a value will disable the search for a
  Rakefile.  This allows the Rakefile to be defined entirely in a
  library (and loaded with the -r option).  The current working
  directory is not changed when this is done.

==== Thanks

As usual, it was input from users that drove a alot of these changes.
The following people either contributed patches, made suggestions or
made otherwise helpful comments.  Thanks to ...

* James Britt and Assaph Mehr for reporting and helping to debug the
  safe_ln issue.

-- Jim Weirich


=== 0.7.0

These changes for Rake have been brewing for a long time.  Here they
are, I hope you enjoy them.

==== Changes

===== New Features

* Name space support for task names (see below).
* Prerequisites can be executed in parallel (see below).
* Added safe_ln support for openAFS (via Ludvig Omholt).
* RDoc defaults to internal (in-process) invocation.  The old behavior
  is still available by setting the +external+ flag to true.
* Rakefiles are now loaded with the expanded path to prevent
  accidental pollution from the Ruby load path.
* Task objects my now be used in prerequisite lists directly.
* Task objects (in addition to task names) may now be included in the
  prerequisite list of a task.
* Internals cleanup and refactoring.

===== Bug Fixes

* Compatibility fixes for Ruby 1.8.4 FileUtils changes.

===== Namespaces

Tasks can now be nested inside their own namespaces.  Tasks within one
namespace will not accidentally interfer with tasks named in a different
namespace.

For example:

  namespace "main" do
    task :build do
      # Build the main program
    end
  end

  namespace "samples" do
    task :build do
      # Build the sample programs
    end
  end

  task :build_all => ["main:build", "samples:build"]

Even though both tasks are named :build, they are separate tasks in
their own namespaces.  The :build_all task (defined in the toplevel
namespace) references both build tasks in its prerequisites.

You may invoke each of the individual build tasks with the following
commands:

  rake main:build
  rake samples:build

Or invoke both via the :build_all command:

  rake build_all

Namespaces may be nested arbitrarily.  Since the name of file tasks
correspond to the name of a file in the external file system,
FileTasks are not affected by the namespaces.

See the Rakefile format documentation (in the Rake API documents) for
more information.

===== Parallel Tasks

Sometimes you have several tasks that can be executed in parallel.  By
specifying these tasks as prerequisites to a +multitask+ task.

In the following example the tasks copy\_src, copy\_doc and copy\_bin
will all execute in parallel in their own thread.

  multitask :copy_files => [:copy_src, :copy_doc, :copy_bin] do
    puts "All Copies Complete"
  end

==== Thanks

As usual, it was input from users that drove a alot of these changes.
The following people either contributed patches, made suggestions or
made otherwise helpful comments.  Thanks to ...

* Doug Young (inspiration for the parallel task)
* David Heinemeier Hansson (for --trace message enhancement and for
  pushing for namespace support).
* Ludvig Omholt (for the openAFS fix)

-- Jim Weirich

=== 0.6.1

* Rebuilt 0.6.0 gem without signing.

=== 0.6.0

Its time for some long requested enhancements and lots of bug fixes
... And a whole new web page.

==== New Web Page

The primary documentation for rake has moved from the RubyForge based
wiki to its own Hieraki based web site.  Constant spam on the wiki
made it a difficult to keep clean.  The new site will be easier to
update and organize.

Check out the new documentation at: http://docs.rubyrake.org

We will be adding new documentation to the site as time goes on.

In addition to the new docs page, make sure you check out Martin
Fowlers article on rake at http://martinfowler.com/articles/rake.html

==== Changes

===== New Features

* Multiple prerequisites on Rake rules now allowed.  However, keep the
  following in mind:

  1. All the prerequisites of a rule must be available before a rule
     is triggered, where "enabled" means (a) an existing file, (b) a
     defined rule, or (c) another rule which also must be
     trigger-able.
  2. Rules are checked in order of definition, so it is important to
     order your rules properly.  If a file can be created by two
     different rules, put the more specific rule first (otherwise the
     more general rule will trigger first and the specific one will
     never be triggered).
  3. The <tt>source</tt> method now returns the name of the first
     prerequisite listed in the rule.  <tt>sources</tt> returns the
     names of all the rule prerequisites, ordered as they are defined
     in the rule.  If the task has other prerequisites not defined in
     the rule (but defined in an explicit task definition), then they
     will _not_ be included in the sources list.

* FileLists may now use the egrep command.  This popular enhancement
  is now a core part of the FileList object.  If you want to get a
  list of all your to-dos, fixmes and TBD comments, add the following
  to your Rakefile.

    desc "Look for TODO and FIXME tags in the code"
    task :todo do
      FileList['**/*.rb'].egrep /#.*(FIXME|TODO|TBD)/
    end

* The <tt>investigation</tt> method was added to task object to dump
  out some important values.  This makes it a bit easier to debug Rake
  tasks.

  For example, if you are having problems with a particular task, just
  print it out:

    task :huh do
      puts Rake::Task['huh'].investigation
    end

* The Rake::TestTask class now supports a "ruby\_opts" option to pass
  arbitrary ruby options to a test subprocess.

===== Some Incompatibilities

* When using the <tt>ruby</tt> command to start a Ruby subprocess, the
  Ruby interpreter that is currently running rake is used by default.
  This makes it easier to use rake in an environment with multiple
  ruby installation.  (Previously, the first ruby command found in the
  PATH was used).

  If you wish to chose a different Ruby interpreter, you can
  explicitly choose the interpreter via the <tt>sh</tt> command.

* The major rake classes (Task, FileTask, FileCreationTask, RakeApp)
  have been moved out of the toplevel scope and are now accessible as
  Rake::Task, Rake::FileTask, Rake::FileCreationTask and
  Rake::Application.  If your Rakefile
  directly references any one of these tasks, you may:

  1. Update your Rakefile to use the new classnames
  2. Use the --classic-namespace option on the rake command to get the
     old behavior,
  3. Add <code>require 'rake/classic_namespace'</code> to the
     Rakefile to get the old behavior.

  <tt>rake</tt> will print a rather annoying warning whenever a
  deprecated class name is referenced without enabling classic
  namespace.

===== Bug Fixes

* Several unit tests and functional tests were fixed to run better
  under windows.

* Directory tasks are now a specialized version of a File task.  A
  directory task will only be triggered if it doesn't exist.  It will
  not be triggered if it is out of date w.r.t. any of its
  prerequisites.

* Fixed a bug in the Rake::GemPackageTask class so that the gem now
  properly contains the platform name.

* Fixed a bug where a prerequisite on a <tt>file</tt> task would cause
  an exception if the prerequisite did not exist.

==== Thanks

As usual, it was input from users that drove a alot of these changes.
The following people either contributed patches, made suggestions or
made otherwise helpful comments.  Thanks to ...

* Greg Fast (better ruby_opt test options)
* Kelly Felkins (requested by better namespace support)
* Martin Fowler (suggested Task.investigation)
* Stuart Jansen (send initial patch for multiple prerequisites).
* Masao Mutch (better support for non-ruby Gem platforms)
* Philipp Neubeck (patch for file task exception fix)

-- Jim Weirich

=== 0.5.4

Time for some minor bug fixes and small enhancements

==== Changes

Here are the changes for version 0.5.4 ...

* Added double quotes to the test runner.  This allows the location of
  the tests (and runner) to be in a directory path that contains
  spaces (e.g. "C:/Program Files/ruby/bin").
* Added .svn to default ignore list.  Now subversion project metadata
  is automatically ignored by Rake's FileList.
* Updated FileList#include to support nested arrays and filelists.
  FileLists are flat lists of file names.  Using a FileList in an
  include will flatten out the nested file names.

== Thanks

As usual, it was input from users that drove a alot of these changes.
Thanks to ...

* Tilman Sauerbeck for the nested FileList suggestion.
* Josh Knowles for pointing out the spaces in directory name problem.

-- Jim Weirich

=== 0.5.3

Although it has only been two weeks since the last release, we have
enough updates to the Rake program to make it time for another
release.

==== Changes

Here are the changes for version 0.5.3 ...

* FileLists have been extensively changed so that they mimic the
  behavior of real arrays even more closely.  In particular,
  operations on FileLists that return a new collection (e.g. collect,
  reject) will now return a FileList rather than an array.  In
  addition, several places where FileLists were not properly expanded
  before use have been fixed.
* A method (+ext+) to simplify the handling of file extensions was
  added to String and to Array.
* The 'testrb' script in test/unit tends to silently swallow syntax
  errors in test suites.  Because of that, the default test loader is
  now a rake-provided script.  You can still use 'testrb' by setting
  the loader flag in the test task to :testrb.  (See the API documents
  for TestTask for all the loader flag values).
* FileUtil methods (e.g. cp, mv, install) are now declared to be
  private.  This will cut down on the interference with user defined
  methods of the same name.
* Fixed the verbose flag in the TestTask so that the test code is
  controlled by the flag.  Also shortened up some failure messages.
  (Thanks to Tobias Luetke for the suggestion).
* Rules will now properly detect a task that can generate a source
  file.  Previously rules would only consider source files that were
  already present.
* Added an +import+ command that allows Rake to dynamically import
  dependendencies into a running Rake session.  The +import+ command
  can run tasks to update the dependency file before loading them.
  Dependency files can be in rake or make format, allowing rake to
  work with tools designed to generate dependencies for make.

==== Thanks

As usual, it was input from users that drove a alot of these changes.
Thanks to ...

* Brian Gernhardt for the rules fix (especially for the patience to
  explain the problem to me until I got what he was talking about).
* Stefan Lang for pointing out problems in the dark corners of the
  FileList implementation.
* Alexey Verkhovsky pointing out the silently swallows syntax errors
  in tests.
* Tobias Luetke for beautifying the test task output.
* Sam Roberts for some of the ideas behind dependency loading.

-- Jim Weirich


=== 0.5.0

It has been a long time in coming, but we finally have a new version
of Rake available.

==== Changes

* Fixed documentation that was lacking the Rake module name (Tilman
  Sauerbeck).
* Added tar.gz and tar.bz2 support to package task (Tilman Sauerbeck).
* Recursive rules are now supported (Tilman Sauerbeck).
* Added warning option for the Test Task (requested by Eric Hodel).
* The jamis rdoc template is only used if it exists.
* Added fix for Ruby 1.8.2 test/unit and rails problem.
* Added contributed rake man file (Jani Monoses).
* Added Brian Candler's fix for problems in --trace and --dry-run
  mode.

==== Thanks

Lots of people provided input to this release.  Thanks to Tilman
Sauerbeck for numerous patches, documentation fixes and suggestions.
And for also pushing me to get this release out.  Also, thanks to
Brian Candler for the finding and fixing --trace/dry-run fix.  That
was an obscure bug.  Also to Eric Hodel for some good suggestions.

-- Jim Weirich

=== 0.4.15

==== Changes

Version 0.4.15 is a bug fix update for the Ruby 1.8.2 compatibility
changes.  This release includes:

* Fixed a bug that prevented the TESTOPTS flag from working with the
  revised for 1.8.2 test task.
* Updated the docs on --trace to indicate that it also enables a full
  backtrace on errors.
* Several fixes for new warnings generated.

==== Mini-Roadmap

I will continue to issue Rake updates in the 0.4.xx series as new
Ruby-1.8.2 issues become manifest.  Once the codebase stabilizes, I
will release a 0.5.0 version incorporating all the changes.  If you
are not using Ruby-1.8.2 and wish to avoid version churn, I recommend
staying with a release prior to Rake-0.4.14.

=== 0.4.14

Version 0.4.14 is a compatibility fix to allow Rake's test task to
work under Ruby 1.8.2.  A change in the Test::Unit autorun feature
prevented Rake from running any tests.  This release fixes the
problem.

Rake 0.4.14 is the recommended release for anyone using Ruby 1.8.2.

=== 0.4.13

* Fixed the dry-run flag so it is operating again.
* Multiple arguments to sh and ruby commands will not be interpreted
  by the shell (patch provided by Jonathan Paisley).

=== 0.4.12

* Added --silent (-s) to suppress the (in directory) rake message.

=== 0.4.11

* Changed the "don't know how to rake" message (finally)
* Changes references to a literal "Rakefile" to reference the global
  variable $rakefile (which contains the actual name of the rakefile).

=== 0.4.10

* Added block support to the "sh" command, allowing users to take
  special actions on the result of the system call.  E.g.

    sh "shell_command" do |ok, res|
      puts "Program returned #{res.exitstatus}" if ! ok
    end

=== 0.4.9

* Switched to Jamis Buck's RDoc template.
* Removed autorequire from Rake's gem spec.  This prevents the Rake
  libraries from loading while using rails.

=== 0.4.8

* Added support for .rb versions of Rakefile.
* Removed \\\n's from test task.
* Fixed Ruby 1.9 compatibility issue with FileList.

=== 0.4.7

* Fixed problem in FileList that caused Ruby 1.9 to go into infinite
  recursion.  Since to_a was removed from Object, it does not need to
  added back into the list of methods to rewrite in FileList.  (Thanks
  to Kent Sibilev for pointing this out).

=== 0.4.6
* Removed test version of ln in FileUtils that prevented safe_ln from
  using ln.

=== 0.4.5
* Upgraded comments in TestTask.
* FileList to_s and inspect now automatically resolve pending changes.
* FileList#exclude properly returns the FileList.

=== 0.4.4
* Fixed initialization problem with @comment.
* Now using multi -r technique in TestTask.  Switch Rakefile back to
  using the built-in test task macros because the rake runtime is no
  longer needed.
* Added 'TEST=filename' and 'TESTOPTS=options' to the Test Task
  macros.
* Allow a +test_files+ attribute in test tasks.  This allows more
  flexibility in specifying test files.

=== 0.4.3
* Fixed Comment leakage.

=== 0.4.2
* Added safe_ln that falls back to a copy if a file link is not supported.
* Package builder now uses safe\_ln.

=== 0.4.1
* Task comments are now additive, combined with "/".
* Works with (soon to be released) rubygems 0.6.2 (or 0.7.0)

=== 0.4.0
* FileList now uses deferred loading.  The file system is not searched
  until the first call that needs the file names.
* VAR=VALUE options are now accepted on the command line and are
  treated like environment variables.  The values may be tested in a
  Rakefile by referencing ENV['VAR'].
* File.mtime is now used (instead of File.new().mtime).

=== 0.3.2.x

* Removed some hidden dependencies on rubygems.  Tests now will test
  gems only if they are installed.
* Removed Sys from some example files.  I believe that is that last
  reference to Sys outside of the contrib area.
* Updated all copyright notices to include 2004.

=== 0.3.2

* GEM Installation now works with the application stub.

=== 0.3.1

* FileLists now automatically ignore CVS, .bak, !
* GEM Installation now works.

=== 0.3.0

Promoted 0.2.10.

=== 0.2.10
General

* Added title to Rake's rdocs
* Contrib packages are no longer included in the documentation.

RDoc Issues

* Removed default for the '--main' option
* Fixed rendering of the rdoc options
* Fixed clean/clobber confusion with rerdoc
* 'title' attribute added

Package Task Library Issues

* Version (or explicit :noversion) is required.
* +package_file+ attribute is now writable

FileList Issues

* Dropped bang version of exclude.  Now using ant-like include/exclude semantics.
* Enabled the "yield self" idiom in FileList#initialize.

=== 0.2.9

This version contains numerous changes as the RubyConf.new(2003)
presentation was being prepared.  The changes include:

* The monolithic rubyapp task library is in the process of being
  dropped in favor of lighter weight task libraries.

=== 0.2.7

* Added "desc" for task descriptions.
* -T will now display tasks with descriptions.
* -P will display tasks and prerequisites.
* Dropped the Sys module in favor of the 1.8.x FileUtils module.  Sys
  is still supported in the contrib area.

=== 0.2.6

* Moved to RubyForge

=== 0.2.5

* Switched to standard ruby app builder.
* Added no_match option to file matcher.

=== 0.2.4

* Fixed indir, which neglected to actually change directories.

=== 0.2.3

* Added rake module for a help target
* Added 'for\_files' to Sys
* Added a $rakefile constant
* Added test for selecting proper rule with multiple targets.
PK}$[�?qFF1gems/gems/rake-13.0.6/doc/command_line_usage.rdocnu�[���= Rake Command Line Usage

Rake is invoked from the command line using:

    % rake [options ...]  [VAR=VALUE ...]  [targets ...]

Options are:

[<tt><em>name</em>=<em>value</em></tt>]
    Set the environment variable <em>name</em> to <em>value</em>
    during the execution of the <b>rake</b> command.  You can access
    the value by using ENV['<em>name</em>'].

[<tt>--all</tt> (-A)]
    Used in combination with the -T and -D options, will force
    those options to show all the tasks, even the ones without comments.

[<tt>--backtrace</tt>{=_output_} (-n)]
    Enable a full backtrace (i.e. like --trace, but without the task
    tracing details). The _output_ parameter is optional, but if
    specified it controls where the backtrace output is sent. If
    _output_ is <tt>stdout</tt>, then backtrace output is directed to
    standard output. If _output_ is <tt>stderr</tt>, or if it is
    missing, then the backtrace output is sent to standard error.

[<tt>--comments</tt>]
    Used in combination with the -W options to force the output to
    contain commented options only. This is the reverse of
    <tt>--all</tt>.

[<tt>--describe</tt> _pattern_ (-D)]
    Describe the tasks (matching optional PATTERN), then exit.

[<tt>--dry-run</tt> (-n)]
    Do a dry run.  Print the tasks invoked and executed, but do not
    actually execute any of the actions.

[<tt>--execute</tt> _code_ (-e)]
    Execute some Ruby code and exit.

[<tt>--execute-print</tt> _code_ (-p)]
    Execute some Ruby code, print the result, and exit.

[<tt>--execute-continue</tt> _code_ (-E)]
    Execute some Ruby code, then continue with normal task processing.

[<tt>--help</tt>  (-H)]
    Display some help text and exit.

[<tt>--jobs</tt> _number_  (-j)]

    Specifies the maximum number of concurrent threads allowed. Rake
    will allocate threads as needed up to this maximum number.

    If omitted, Rake will attempt to estimate the number of CPUs on
    the system and add 4 to that number.

    The concurrent threads are used to execute the <tt>multitask</tt>
    prerequisites. Also see the <tt>-m</tt> option which turns all
    tasks into multitasks.

    Sample values:
       (no -j)   : Allow up to (# of CPUs + 4) number of threads
       --jobs    : Allow unlimited number of threads
       --jobs=1  : Allow only one thread (the main thread)
       --jobs=16 : Allow up to 16 concurrent threads

[<tt>--job-stats</tt> _level_]

    Display job statistics at the completion of the run. By default,
    this will display the requested number of active threads (from the
    -j options) and the maximum number of threads in play at any given
    time.

    If the optional _level_ is <tt>history</tt>, then a complete trace
    of task history will be displayed on standard output.

[<tt>--libdir</tt> _directory_  (-I)]
    Add _directory_ to the list of directories searched for require.

[<tt>--multitask</tt> (-m)]
    Treat all tasks as multitasks. ('make/drake' semantics)

[<tt>--nosearch</tt>  (-N)]
    Do not search for a Rakefile in parent directories.

[<tt>--prereqs</tt>  (-P)]
    Display a list of all tasks and their immediate prerequisites.

[<tt>--quiet</tt> (-q)]
    Do not echo commands from FileUtils.

[<tt>--rakefile</tt> _filename_ (-f)]
    Use _filename_ as the name of the rakefile. The default rakefile
    names are +rakefile+ and +Rakefile+ (with +rakefile+ taking
    precedence). If the rakefile is not found in the current
    directory, +rake+ will search parent directories for a match. The
    directory where the Rakefile is found will become the current
    directory for the actions executed in the Rakefile.

[<tt>--rakelibdir</tt> _rakelibdir_ (-R)]
    Auto-import any .rake files in RAKELIBDIR. (default is 'rakelib')

[<tt>--require</tt> _name_ (-r)]
    Require _name_ before executing the Rakefile.

[<tt>--rules</tt>]
    Trace the rules resolution.

[<tt>--silent (-s)</tt>]
    Like --quiet, but also suppresses the 'in directory' announcement.

[<tt>--suppress-backtrace _pattern_ </tt>]
    Line matching the regular expression _pattern_ will be removed
    from the backtrace output. Note that the --backtrace option is the
    full backtrace without these lines suppressed.

[<tt>--system</tt> (-g)]
    Use the system wide (global) rakefiles. The project Rakefile is
    ignored. By default, the system wide rakefiles are used only if no
    project Rakefile is found. On Unix-like system, the system wide
    rake files are located in $HOME/.rake. On a windows system they
    are stored in $APPDATA/Rake.

[<tt>--no-system</tt> (-G)]
    Use the project level Rakefile, ignoring the system-wide (global)
    rakefiles.

[<tt>--tasks</tt> <em>pattern</em> (-T)]
    Display a list of the major tasks and their comments.  Comments
    are defined using the "desc" command.  If a pattern is given, then
    only tasks matching the pattern are displayed.

[<tt>--trace</tt>{=_output_} (-t)]
    Turn on invoke/execute tracing. Also enable full backtrace on
    errors. The _output_ parameter is optional, but if specified it
    controls where the trace output is sent. If _output_ is
    <tt>stdout</tt>, then trace output is directed to standard output.
    If _output_ is <tt>stderr</tt>, or if it is missing, then trace
    output is sent to standard error.

[<tt>--verbose</tt> (-v)]
    Echo the Sys commands to standard output.

[<tt>--version</tt> (-V)]
    Display the program version and exit.

[<tt>--where</tt> <em>pattern</em> (-W)]
    Display tasks that match <em>pattern</em> and the file and line
    number where the task is defined. By default this option will
    display all tasks, not just the tasks that have descriptions.

[<tt>--no-deprecation-warnings</tt> (-X)]
    Do not display the deprecation warnings.

In addition, any command line option of the form
<em>VAR</em>=<em>VALUE</em> will be added to the environment hash
<tt>ENV</tt> and may be tested in the Rakefile.
PK}$[�'S{��'gems/gems/rake-13.0.6/doc/glossary.rdocnu�[���= Glossary

action ::
  Code to be executed in order to perform a task.  Actions in a Rakefile are
  specified in a code block. (Usually delimited by +do+/+end+ pairs.)

execute ::
  When a task is executed, all of its actions are performed in the order they
  were defined.  Note that, unlike <tt>invoke</tt>, <tt>execute</tt> always
  executes the actions (without invoking or executing the prerequisites).

file task (Rake::FileTask) ::
  A file task is a task whose purpose is to create a file (which has the same
  name as the task).  When invoked, a file task will only execute if one or
  more of the following conditions are true.

  1. The associated file does not exist.
  2. A prerequisite has a later time stamp than the existing file.

  Because normal Tasks always have the current time as timestamp, a FileTask
  that has a normal Task prerequisite will always execute.

invoke ::
  When a task is invoked, first we check to see if it has been invoked before.
  If it has been, then nothing else is done.  If this is the first time it has
  been invoked, then we invoke each of its prerequisites.  Finally, we check
  to see if we need to execute the actions of this task by calling
  Rake::Task#needed?.  If the task is needed, we execute its actions.

  NOTE: Prerequisites are still invoked even if the task is not needed.

prerequisites ::
  Every task has a (possibly empty) set of prerequisites.  A prerequisite P to
  Task T is itself a task that must be invoked before Task T.

rule ::
  A rule is a recipe for synthesizing a task when no task is explicitly
  defined.  Rules generally synthesize file tasks.

task (Rake::Task) ::
  The basic unit of work in a Rakefile.  A task has a name, a set of 
  prerequisites, and a list of actions to be performed.
PK}$[��@u,u,"gems/gems/rake-13.0.6/doc/jamis.rbnu�[���# frozen_string_literal: true
module RDoc
module Page

FONTS = "\"Bitstream Vera Sans\", Verdana, Arial, Helvetica, sans-serif"

STYLE = <<CSS
a {
  color: #00F;
  text-decoration: none;
}

a:hover {
  color: #77F;
  text-decoration: underline;
}

body, td, p {
  font-family: %fonts%;
  background: #FFF;
  color: #000;
  margin: 0px;
  font-size: small;
}

#content {
  margin: 2em;
}

#description p {
  margin-bottom: 0.5em;
}

.sectiontitle {
  margin-top: 1em;
  margin-bottom: 1em;
  padding: 0.5em;
  padding-left: 2em;
  background: #005;
  color: #FFF;
  font-weight: bold;
  border: 1px dotted black;
}

.attr-rw {
  padding-left: 1em;
  padding-right: 1em;
  text-align: center;
  color: #055;
}

.attr-name {
  font-weight: bold;
}

.attr-desc {
}

.attr-value {
  font-family: monospace;
}

.file-title-prefix {
  font-size: large;
}

.file-title {
  font-size: large;
  font-weight: bold;
  background: #005;
  color: #FFF;
}

.banner {
  background: #005;
  color: #FFF;
  border: 1px solid black;
  padding: 1em;
}

.banner td {
  background: transparent;
  color: #FFF;
}

h1 a, h2 a, .sectiontitle a, .banner a {
  color: #FF0;
}

h1 a:hover, h2 a:hover, .sectiontitle a:hover, .banner a:hover {
  color: #FF7;
}

.dyn-source {
  display: none;
  background: #FFE;
  color: #000;
  border: 1px dotted black;
  margin: 0.5em 2em 0.5em 2em;
  padding: 0.5em;
}

.dyn-source .cmt {
  color: #00F;
  font-style: italic;
}

.dyn-source .kw {
  color: #070;
  font-weight: bold;
}

.method {
  margin-left: 1em;
  margin-right: 1em;
  margin-bottom: 1em;
}

.description pre {
  padding: 0.5em;
  border: 1px dotted black;
  background: #FFE;
}

.method .title {
  font-family: monospace;
  font-size: large;
  border-bottom: 1px dashed black;
  margin-bottom: 0.3em;
  padding-bottom: 0.1em;
}

.method .description, .method .sourcecode {
  margin-left: 1em;
}

.description p, .sourcecode p {
  margin-bottom: 0.5em;
}

.method .sourcecode p.source-link {
  text-indent: 0em;
  margin-top: 0.5em;
}

.method .aka {
  margin-top: 0.3em;
  margin-left: 1em;
  font-style: italic;
  text-indent: 2em;
}

h1 {
  padding: 1em;
  border: 1px solid black;
  font-size: x-large;
  font-weight: bold;
  color: #FFF;
  background: #007;
}

h2 {
  padding: 0.5em 1em 0.5em 1em;
  border: 1px solid black;
  font-size: large;
  font-weight: bold;
  color: #FFF;
  background: #009;
}

h3, h4, h5, h6 {
  padding: 0.2em 1em 0.2em 1em;
  border: 1px dashed black;
  color: #000;
  background: #AAF;
}

.sourcecode > pre {
  padding: 0.5em;
  border: 1px dotted black;
  background: #FFE;
}

CSS

XHTML_PREAMBLE = %{<?xml version="1.0" encoding="%charset%"?>
<!DOCTYPE html
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
}

HEADER = XHTML_PREAMBLE + <<ENDHEADER
<html>
  <head>
    <title>%title%</title>
    <meta http-equiv="Content-Type" content="text/html; charset=%charset%" />
    <link rel="stylesheet" href="%style_url%" type="text/css" media="screen" />

    <script language="JavaScript" type="text/javascript">
    // <![CDATA[

        function toggleSource( id )
        {
          var elem
          var link

          if( document.getElementById )
          {
            elem = document.getElementById( id )
            link = document.getElementById( "l_" + id )
          }
          else if ( document.all )
          {
            elem = eval( "document.all." + id )
            link = eval( "document.all.l_" + id )
          }
          else
            return false;

          if( elem.style.display == "block" )
          {
            elem.style.display = "none"
            link.innerHTML = "show source"
          }
          else
          {
            elem.style.display = "block"
            link.innerHTML = "hide source"
          }
        }

        function openCode( url )
        {
          window.open( url, "SOURCE_CODE", "width=400,height=400,scrollbars=yes" )
        }
      // ]]>
    </script>
  </head>

  <body>
ENDHEADER

FILE_PAGE = <<HTML
<table border='0' cellpadding='0' cellspacing='0' width="100%" class='banner'>
  <tr><td>
    <table width="100%" border='0' cellpadding='0' cellspacing='0'><tr>
      <td class="file-title" colspan="2"><span class="file-title-prefix">File</span><br />%short_name%</td>
      <td align="right">
        <table border='0' cellspacing="0" cellpadding="2">
          <tr>
            <td>Path:</td>
            <td>%full_path%
IF:cvsurl
              &nbsp;(<a href="%cvsurl%">CVS</a>)
ENDIF:cvsurl
            </td>
          </tr>
          <tr>
            <td>Modified:</td>
            <td>%dtm_modified%</td>
          </tr>
        </table>
      </td></tr>
    </table>
  </td></tr>
</table><br>
HTML

###################################################################

CLASS_PAGE = <<HTML
<table width="100%" border='0' cellpadding='0' cellspacing='0' class='banner'><tr>
  <td class="file-title"><span class="file-title-prefix">%classmod%</span><br />%full_name%</td>
  <td align="right">
    <table cellspacing=0 cellpadding=2>
      <tr valign="top">
        <td>In:</td>
        <td>
START:infiles
HREF:full_path_url:full_path:
IF:cvsurl
&nbsp;(<a href="%cvsurl%">CVS</a>)
ENDIF:cvsurl
END:infiles
        </td>
      </tr>
IF:parent
    <tr>
      <td>Parent:</td>
      <td>
IF:par_url
        <a href="%par_url%">
ENDIF:par_url
%parent%
IF:par_url
         </a>
ENDIF:par_url
     </td>
   </tr>
ENDIF:parent
         </table>
        </td>
        </tr>
      </table>
HTML

###################################################################

METHOD_LIST = <<HTML
  <div id="content">
IF:diagram
  <table cellpadding='0' cellspacing='0' border='0' width="100%"><tr><td align="center">
    %diagram%
  </td></tr></table>
ENDIF:diagram

IF:description
  <div class="description">%description%</div>
ENDIF:description

IF:requires
  <div class="sectiontitle">Required Files</div>
  <ul>
START:requires
  <li>HREF:aref:name:</li>
END:requires
  </ul>
ENDIF:requires

IF:toc
  <div class="sectiontitle">Contents</div>
  <ul>
START:toc
  <li><a href="#%href%">%secname%</a></li>
END:toc
  </ul>
ENDIF:toc

IF:methods
  <div class="sectiontitle">Methods</div>
  <ul>
START:methods
  <li>HREF:aref:name:</li>
END:methods
  </ul>
ENDIF:methods

IF:includes
<div class="sectiontitle">Included Modules</div>
<ul>
START:includes
  <li>HREF:aref:name:</li>
END:includes
</ul>
ENDIF:includes

START:sections
IF:sectitle
<div class="sectiontitle"><a nem="%secsequence%">%sectitle%</a></div>
IF:seccomment
<div class="description">
%seccomment%
</div>
ENDIF:seccomment
ENDIF:sectitle

IF:classlist
  <div class="sectiontitle">Classes and Modules</div>
  %classlist%
ENDIF:classlist

IF:constants
  <div class="sectiontitle">Constants</div>
  <table border='0' cellpadding='5'>
START:constants
  <tr valign='top'>
    <td class="attr-name">%name%</td>
    <td>=</td>
    <td class="attr-value">%value%</td>
  </tr>
IF:desc
  <tr valign='top'>
    <td>&nbsp;</td>
    <td colspan="2" class="attr-desc">%desc%</td>
  </tr>
ENDIF:desc
END:constants
  </table>
ENDIF:constants

IF:attributes
  <div class="sectiontitle">Attributes</div>
  <table border='0' cellpadding='5'>
START:attributes
  <tr valign='top'>
    <td class='attr-rw'>
IF:rw
[%rw%]
ENDIF:rw
    </td>
    <td class='attr-name'>%name%</td>
    <td class='attr-desc'>%a_desc%</td>
  </tr>
END:attributes
  </table>
ENDIF:attributes

IF:method_list
START:method_list
IF:methods
<div class="sectiontitle">%type% %category% methods</div>
START:methods
<div class="method">
  <div class="title">
IF:callseq
    <a name="%aref%"></a><b>%callseq%</b>
ENDIF:callseq
IFNOT:callseq
    <a name="%aref%"></a><b>%name%</b>%params%
ENDIF:callseq
IF:codeurl
[ <a href="javascript:openCode('%codeurl%')">source</a> ]
ENDIF:codeurl
  </div>
IF:m_desc
  <div class="description">
  %m_desc%
  </div>
ENDIF:m_desc
IF:aka
<div class="aka">
  This method is also aliased as
START:aka
  <a href="%aref%">%name%</a>
END:aka
</div>
ENDIF:aka
IF:sourcecode
<div class="sourcecode">
  <p class="source-link">[ <a href="javascript:toggleSource('%aref%_source')" id="l_%aref%_source">show source</a> ]</p>
  <div id="%aref%_source" class="dyn-source">
<pre>
%sourcecode%
</pre>
  </div>
</div>
ENDIF:sourcecode
</div>
END:methods
ENDIF:methods
END:method_list
ENDIF:method_list
END:sections
</div>
HTML

FOOTER = <<ENDFOOTER
  </body>
</html>
ENDFOOTER

BODY = HEADER + <<ENDBODY
  !INCLUDE! <!-- banner header -->

  <div id="bodyContent">
    #{METHOD_LIST}
  </div>

  #{FOOTER}
ENDBODY

########################## Source code ##########################

SRC_PAGE = XHTML_PREAMBLE + <<HTML
<html>
<head><title>%title%</title>
<meta http-equiv="Content-Type" content="text/html; charset=%charset%">
<style>
.ruby-comment    { color: green; font-style: italic }
.ruby-constant   { color: #4433aa; font-weight: bold; }
.ruby-identifier { color: #222222;  }
.ruby-ivar       { color: #2233dd; }
.ruby-keyword    { color: #3333FF; font-weight: bold }
.ruby-node       { color: #777777; }
.ruby-operator   { color: #111111;  }
.ruby-regexp     { color: #662222; }
.ruby-value      { color: #662222; font-style: italic }
  .kw { color: #3333FF; font-weight: bold }
  .cmt { color: green; font-style: italic }
  .str { color: #662222; font-style: italic }
  .re  { color: #662222; }
</style>
</head>
<body bgcolor="white">
<pre>%code%</pre>
</body>
</html>
HTML

########################## Index ################################

FR_INDEX_BODY = <<HTML
!INCLUDE!
HTML

FILE_INDEX = XHTML_PREAMBLE + <<HTML
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=%charset%">
<style>
<!--
  body {
    background-color: #EEE;
    font-family: #{FONTS};
    color: #000;
    margin: 0px;
  }
  .banner {
    background: #005;
    color: #FFF;
    padding: 0.2em;
    font-size: small;
    font-weight: bold;
    text-align: center;
  }
  .entries {
    margin: 0.25em 1em 0 1em;
    font-size: x-small;
  }
  a {
    color: #00F;
    text-decoration: none;
    white-space: nowrap;
  }
  a:hover {
    color: #77F;
    text-decoration: underline;
  }
-->
</style>
<base target="docwin">
</head>
<body>
<div class="banner">%list_title%</div>
<div class="entries">
START:entries
<a href="%href%">%name%</a><br>
END:entries
</div>
</body></html>
HTML

CLASS_INDEX = FILE_INDEX
METHOD_INDEX = FILE_INDEX

INDEX = XHTML_PREAMBLE + <<HTML
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>%title%</title>
  <meta http-equiv="Content-Type" content="text/html; charset=%charset%">
</head>

<frameset cols="20%,*">
    <frameset rows="15%,35%,50%">
        <frame src="fr_file_index.html"   title="Files" name="Files" />
        <frame src="fr_class_index.html"  name="Classes" />
        <frame src="fr_method_index.html" name="Methods" />
    </frameset>
IF:inline_source
      <frame  src="%initial_page%" name="docwin">
ENDIF:inline_source
IFNOT:inline_source
    <frameset rows="80%,20%">
      <frame  src="%initial_page%" name="docwin">
      <frame  src="blank.html" name="source">
    </frameset>
ENDIF:inline_source
    <noframes>
          <body bgcolor="white">
            Click <a href="html/index.html">here</a> for a non-frames
            version of this page.
          </body>
    </noframes>
</frameset>

</html>
HTML

end
end


PK}$[��AA%gems/gems/rake-13.0.6/doc/example/b.cnu�[���#include <stdio.h>

void b()
{
    printf ("In function b\n");
}
PK}$[۸	���+gems/gems/rake-13.0.6/doc/example/Rakefile1nu�[���# Example Rakefile -*- ruby -*-

task :default => [:main]

file "a.o" => ["a.c"] do |t|
  src = t.name.sub(/\.o$/, '.c')
  sh "gcc #{src} -c -o #{t.name}"
end

file "b.o" => ["b.c"] do |t|
  src = t.name.sub(/\.o$/, '.c')
  sh "gcc #{src} -c -o #{t.name}"
end

file "main.o" => ["main.c"] do |t|
  src = t.name.sub(/\.o$/, '.c')
  sh "gcc #{src} -c -o #{t.name}"
end

OBJFILES = ["a.o", "b.o", "main.o"]
task :obj => OBJFILES

file "main" => OBJFILES do |t|
  sh "gcc -o #{t.name} main.o a.o b.o"
end

task :clean do
  rm_f FileList['*.o']
  Dir['*~'].each { |fn| rm_f fn }
end

task :clobber => [:clean] do
  rm_f "main"
end

task :run => ["main"] do
  sh "./main"
end
PK}$[�_�bgg(gems/gems/rake-13.0.6/doc/example/main.cnu�[���#include <stdio.h>

extern void a();
extern void b();

int main ()
{
    a();
    b();
    return 0;
}
PK}$["�;WW+gems/gems/rake-13.0.6/doc/example/Rakefile2nu�[���# Example Rakefile -*- ruby -*-
# Using the power of Ruby

task :default => [:main]

def ext(fn, newext)
  fn.sub(/\.[^.]+$/, newext)
end

SRCFILES = Dir['*.c']
OBJFILES = SRCFILES.collect { |fn| ext(fn,".o") }

OBJFILES.each do |objfile|
  srcfile = ext(objfile, ".c")
  file objfile => [srcfile] do |t|
    sh "gcc #{srcfile} -c -o #{t.name}"
  end
end

file "main" => OBJFILES do |t|
  sh "gcc -o #{t.name} main.o a.o b.o"
end

task :clean do
  rm_f FileList['*.o']
  Dir['*~'].each { |fn| rm_f fn }
end

task :clobber => [:clean] do
  rm_f "main"
end

task :run => ["main"] do
  sh "./main"
end
PK}$[Oq�AA%gems/gems/rake-13.0.6/doc/example/a.cnu�[���#include <stdio.h>

void a()
{
    printf ("In function a\n");
}
PK}$[�u���	�	)gems/gems/rake-13.0.6/doc/proto_rake.rdocnu�[���= Original Prototype Rake

This is the original 100 line prototype rake program.

---
 #!/opt/alt/ruby31/bin/ruby

 require 'ftools'

 class Task
   TASKS = Hash.new

   attr_reader :prerequisites

   def initialize(task_name)
     @name = task_name
     @prerequisites = []
     @actions = []
   end

   def enhance(deps=nil, &block)
     @prerequisites |= deps if deps
     @actions << block if block_given?
     self
   end

   def name
     @name.to_s
   end

   def invoke
     @prerequisites.each { |n| Task[n].invoke }
     execute if needed?
   end

   def execute
     return if @triggered
     @triggered = true
     @actions.collect { |act| result = act.call(self) }.last
   end

   def needed?
     true
   end

   def timestamp
     Time.now
   end

   class << self
     def [](task_name)
       TASKS[intern(task_name)] or fail "Don't know how to rake #{task_name}"
     end

     def define_task(args, &block)
       case args
       when Hash
 	fail "Too Many Target Names: #{args.keys.join(' ')}" if args.size > 1
 	fail "No Task Name Given" if args.size < 1
 	task_name = args.keys[0]
 	deps = args[task_name]
       else
 	task_name = args
 	deps = []
       end
       deps = deps.collect {|d| intern(d) }
       get(task_name).enhance(deps, &block)
     end

     def get(task_name)
       name = intern(task_name)
       TASKS[name] ||= self.new(name)
     end

     def intern(task_name)
       (Symbol === task_name) ? task_name : task_name.intern
     end
   end
 end

 class FileTask < Task
   def needed?
     return true unless File.exist?(name)
     latest_prereq = @prerequisites.collect{|n| Task[n].timestamp}.max
     return false if latest_prereq.nil?
     timestamp < latest_prereq
   end

   def timestamp
     File.new(name.to_s).mtime
   end
 end

 def task(args, &block)
   Task.define_task(args, &block)
 end

 def file(args, &block)
   FileTask.define_task(args, &block)
 end

 def sys(cmd)
   puts cmd
   system(cmd) or fail "Command Failed: [#{cmd}]"
 end

 def rake
   begin
     here = Dir.pwd
     while ! File.exist?("Rakefile")
       Dir.chdir("..")
       fail "No Rakefile found" if Dir.pwd == here
       here = Dir.pwd
     end
     puts "(in #{Dir.pwd})"
     load "./Rakefile"
     ARGV.push("default") if ARGV.size == 0
     ARGV.each { |task_name| Task[task_name].invoke }
   rescue Exception => ex
     puts "rake aborted ... #{ex.message}"
     puts ex.backtrace.find {|str| str =~ /Rakefile/ } || ""
   end
 end

 if __FILE__ == $0 then
   rake
 end
PK}$[v3�HH'gems/gems/rake-13.0.6/doc/rational.rdocnu�[���= Why rake?

Ok, let me state from the beginning that I never intended to write this
code.  I'm not convinced it is useful, and I'm not convinced anyone
would even be interested in it.  All I can say is that Why's onion truck
must by been passing through the Ohio valley.

What am I talking about? ... A Ruby version of Make.

See, I can sense you cringing already, and I agree.  The world certainly
doesn't need yet another reworking of the "make" program.  I mean, we
already have "ant".  Isn't that enough?

It started yesterday.  I was helping a coworker fix a problem in one of
the Makefiles we use in our project.  Not a particularly tough problem,
but during the course of the conversation I began lamenting some of the
shortcomings of make.  In particular, in one of my makefiles I wanted to
determine the name of a file dynamically and had to resort to some
simple scripting (in Ruby) to make it work.  "Wouldn't it be nice if you
could just use Ruby inside a Makefile" I said.

My coworker (a recent convert to Ruby) agreed, but wondered what it
would look like.  So I sketched the following on the whiteboard...

    "What if you could specify the make tasks in Ruby, like this ..."

      task "build" do
        java_compile(...args, etc ...)
      end

    "The task function would register "build" as a target to be made,
    and the block would be the action executed whenever the build
    system determined that it was time to do the build target."

We agreed that would be cool, but writing make from scratch would be WAY
too much work.  And that was the end of that!

... Except I couldn't get the thought out of my head.  What exactly
would be needed to make the about syntax work as a make file?  Hmmm, you
would need to register the tasks, you need some way of specifying
dependencies between tasks, and some way of kicking off the process.
Hey!  What if we did ... and fifteen minutes later I had a working
prototype of Ruby make, complete with dependencies and actions.

I showed the code to my coworker and we had a good laugh.  It was just
about a page worth of code that reproduced an amazing amount of the
functionality of make.  We were both truly stunned with the power of
Ruby.

But it didn't do everything make did.  In particular, it didn't have
timestamp based file dependencies (where a file is rebuilt if any of its
prerequisite files have a later timestamp).  Obviously THAT would be a
pain to add and so Ruby Make would remain an interesting experiment.

... Except as I walked back to my desk, I started thinking about what
file based dependencies would really need.  Rats!  I was hooked again,
and by adding a new class and two new methods, file/timestamp
dependencies were implemented.

Ok, now I was really hooked.  Last night (during CSI!) I massaged the
code and cleaned it up a bit.  The result is a bare-bones replacement
for make in exactly 100 lines of code.

For the curious, you can see it at ...
* doc/proto_rake.rdoc

Oh, about the name.  When I wrote the example Ruby Make task on my
whiteboard, my coworker exclaimed "Oh! I have the perfect name: Rake ...
Get it?  Ruby-Make. Rake!"  He said he envisioned the tasks as leaves
and Rake would clean them up  ... or something like that.  Anyways, the
name stuck.

Some quick examples ...

A simple task to delete backup files ...

   task :clean do
     Dir['*~'].each {|fn| rm fn rescue nil}
   end

Note that task names are symbols (they are slightly easier to type
than quoted strings ... but you may use quoted string if you would
rather). Rake makes the methods of the FileUtils module directly
available, so we take advantage of the <tt>rm</tt> command.  Also note
the use of "rescue nil" to trap and ignore errors in the <tt>rm</tt>
command.

To run it, just type "rake clean".  Rake will automatically find a
Rakefile in the current directory (or above!) and will invoke the
targets named on the command line.  If there are no targets explicitly
named, rake will invoke the task "default".

Here's another task with dependencies ...

   task :clobber => [:clean] do
     rm_r "tempdir"
   end

Task :clobber depends upon task :clean, so :clean will be run before
:clobber is executed.

Files are specified by using the "file" command.  It is similar to the
task command, except that the task name represents a file, and the task
will be run only if the file doesn't exist, or if its modification time
is earlier than any of its prerequisites.

Here is a file based dependency that will compile "hello.cc" to
"hello.o".

   file "hello.cc"
   file "hello.o" => ["hello.cc"] do |t|
     srcfile = t.name.sub(/\.o$/, ".cc")
     sh %{g++ #{srcfile} -c -o #{t.name}}
   end

I normally specify file tasks with string (rather than symbols).  Some
file names can't be represented by symbols.  Plus it makes the
distinction between them more clear to the casual reader.

Currently writing a task for each and every file in the project would be
tedious at best.  I envision a set of libraries to make this job
easier.  For instance, perhaps something like this ...

   require 'rake/ctools'
   Dir['*.c'].each do |fn|
     c_source_file(fn)
   end

where "c_source_file" will create all the tasks need to compile all the
C source files in a directory.  Any number of useful libraries could be
created for rake.

That's it.  There's no documentation (other than whats in this
message).  Does this sound interesting to anyone?  If so, I'll continue
to clean it up and write it up and publish it on RAA.  Otherwise, I'll
leave it as an interesting exercise and a tribute to the power of Ruby.

Why /might/ rake be interesting to Ruby programmers.  I don't know,
perhaps ...

* No weird make syntax (only weird Ruby syntax :-)
* No need to edit or read XML (a la ant)
* Platform independent build scripts.
* Will run anywhere Ruby exists, so no need to have "make" installed.
  If you stay away from the "sys" command and use things like
  'ftools', you can have a perfectly platform independent
  build script.  Also rake is only 100 lines of code, so it can
  easily be packaged along with the rest of your code.

So ... Sorry for the long rambling message.  Like I said, I never
intended to write this code at all.
PK}$[����P�P'gems/gems/rake-13.0.6/doc/rakefile.rdocnu�[���= Rakefile Format

First of all, there is no special format for a Rakefile.  A Rakefile
contains executable Ruby code.  Anything legal in a ruby script is
allowed in a Rakefile.

Now that we understand there is no special syntax in a Rakefile, there
are some conventions that are used in a Rakefile that are a little
unusual in a typical Ruby program.  Since a Rakefile is tailored to
specifying tasks and actions, the idioms used in a Rakefile are
designed to support that.

So, what goes into a Rakefile?

== Tasks

Tasks are the main unit of work in a Rakefile.  Tasks have a name
(usually given as a symbol or a string), a list of prerequisites (more
symbols or strings) and a list of actions (given as a block).

=== Simple Tasks

A task is declared by using the +task+ method.  +task+ takes a single
parameter that is the name of the task.

  task :name

=== Tasks with Prerequisites

Any prerequisites are given as a list (enclosed in square brackets)
following the name and an arrow (=>).

  task name: [:prereq1, :prereq2]

*NOTE:* Although this syntax looks a little funky, it is legal
Ruby.  We are constructing a hash where the key is :name and the value
for that key is the list of prerequisites.  It is equivalent to the
following ...

  hash = Hash.new
  hash[:name] = [:prereq1, :prereq2]
  task(hash)

You can also use strings for task names and prerequisites, rake doesn't care.
This is the same task definition:

  task 'name' => %w[prereq1 prereq2]

As is this:

  task name: %w[prereq1 prereq2]

We'll prefer this style for regular tasks with prerequisites throughout the
rest of the document.  Using an array of strings for the prerequisites means
you will need to make fewer changes if you need to move tasks into namespaces
or perform other refactorings.

=== Tasks with Actions

Actions are defined by passing a block to the +task+ method.  Any Ruby
code can be placed in the block.  The block may reference the task
object via the block parameter.

  task name: [:prereq1, :prereq2] do |t|
    # actions (may reference t)
  end

=== Multiple Definitions

A task may be specified more than once.  Each specification adds its
prerequisites and actions to the existing definition.  This allows one
part of a rakefile to specify the actions and a different rakefile
(perhaps separately generated) to specify the dependencies.

For example, the following is equivalent to the single task
specification given above.

  task :name
  task name: :prereq1
  task name: %w[prereq2]
  task :name do |t|
    # actions
  end

== File Tasks

Some tasks are designed to create a file from one or more other files.
Tasks that generate these files may be skipped if the file already
exists.  File tasks are used to specify file creation tasks.

File tasks are declared using the +file+ method (instead of the +task+
method).  In addition, file tasks are usually named with a string
rather than a symbol.

The following file task creates a executable program (named +prog+)
given two object files named +a.o+ and +b.o+.  The tasks
for creating +a.o+ and +b.o+ are not shown.

  file "prog" => ["a.o", "b.o"] do |t|
    sh "cc -o #{t.name} #{t.prerequisites.join(' ')}"
  end

== Directory Tasks

It is common to need to create directories upon demand.  The
+directory+ convenience method is a short-hand for creating a FileTask
that creates the directory.  For example, the following declaration
...

  directory "testdata/examples/doc"

is equivalent to ...

  file "testdata" do |t| mkdir t.name end
  file "testdata/examples" => ["testdata"] do |t| mkdir t.name end
  file "testdata/examples/doc" => ["testdata/examples"] do |t| mkdir t.name end

The +directory+ method does not accept prerequisites or actions, but
both prerequisites and actions can be added later.  For example ...

  directory "testdata"
  file "testdata" => ["otherdata"]
  file "testdata" do
    cp Dir["standard_data/*.data"], "testdata"
  end

== Tasks with Parallel Prerequisites

Rake allows parallel execution of prerequisites using the following syntax:

  multitask copy_files: %w[copy_src copy_doc copy_bin] do
    puts "All Copies Complete"
  end

In this example, +copy_files+ is a normal rake task.  Its actions are
executed whenever all of its prerequisites are done.  The big
difference is that the prerequisites (+copy_src+, +copy_bin+ and
+copy_doc+) are executed in parallel.  Each of the prerequisites are
run in their own Ruby thread, possibly allowing faster overall runtime.

=== Secondary Prerequisites

If any of the primary prerequisites of a multitask have common secondary
prerequisites, all of the primary/parallel prerequisites will wait
until the common prerequisites have been run.

For example, if the <tt>copy_<em>xxx</em></tt> tasks have the
following prerequisites:

  task copy_src: :prep_for_copy
  task copy_bin: :prep_for_copy
  task copy_doc: :prep_for_copy

Then the +prep_for_copy+ task is run before starting all the copies in
parallel.  Once +prep_for_copy+ is complete, +copy_src+, +copy_bin+,
and +copy_doc+ are all run in parallel.  Note that +prep_for_copy+ is
run only once, even though it is referenced in multiple threads.

=== Thread Safety

The Rake internal data structures are thread-safe with respect
to the multitask parallel execution, so there is no need for the user
to do extra synchronization for Rake's benefit.  However, if there are
user data structures shared between the parallel prerequisites, the
user must do whatever is necessary to prevent race conditions.

== Tasks with Arguments

Prior to version 0.8.0, rake was only able to handle command line
arguments of the form NAME=VALUE that were passed into Rake via the
ENV hash.  Many folks had asked for some kind of simple command line
arguments, perhaps using "--" to separate regular task names from
argument values on the command line.  The problem is that there was no
easy way to associate positional arguments on the command line with
different tasks.  Suppose both tasks :a and :b expect a command line
argument: does the first value go with :a?  What if :b is run first?
Should it then get the first command line argument.

Rake 0.8.0 solves this problem by explicitly passing values directly
to the tasks that need them.  For example, if I had a release task
that required a version number, I could say:

   rake release[0.8.2]

And the string "0.8.2" will be passed to the :release task.  Multiple
arguments can be passed by separating them with a comma, for example:

   rake name[john,doe]

Just a few words of caution.  The rake task name and its arguments
need to be a single command line argument to rake.  This generally
means no spaces.  If spaces are needed, then the entire name +
argument string should be quoted.  Something like this:

   rake "name[billy bob, smith]"

(Quoting rules vary between operating systems and shells, so make sure
you consult the proper docs for your OS/shell).

=== Tasks that Expect Parameters

Parameters are only given to tasks that are setup to expect them.  In
order to handle named parameters, the task declaration syntax for
tasks has been extended slightly.

For example, a task that needs a first name and last name might be
declared as:

   task :name, [:first_name, :last_name]

The first argument is still the name of the task (:name in this case).
The next two arguments are the names of the parameters expected by
:name in an array (:first_name and :last_name in the example).

To access the values of the parameters, the block defining the task
behaviour can now accept a second parameter:

   task :name, [:first_name, :last_name] do |t, args|
     puts "First name is #{args.first_name}"
     puts "Last  name is #{args.last_name}"
   end

The first argument of the block "t" is always bound to the current
task object.  The second argument "args" is an open-struct like object
that allows access to the task arguments.  Extra command line
arguments to a task are ignored.

If you wish to specify default values for the arguments, you can use
the with_defaults method in the task body.  Here is the above example
where we specify default values for the first and last names:

   task :name, [:first_name, :last_name] do |t, args|
     args.with_defaults(:first_name => "John", :last_name => "Dough")
     puts "First name is #{args.first_name}"
     puts "Last  name is #{args.last_name}"
   end

=== Tasks that Expect Parameters and Have Prerequisites

Tasks that use parameters have a slightly different format for
prerequisites.  Use the arrow notation to indicate the prerequisites
for tasks with arguments.  For example:

   task :name, [:first_name, :last_name] => [:pre_name] do |t, args|
     args.with_defaults(:first_name => "John", :last_name => "Dough")
     puts "First name is #{args.first_name}"
     puts "Last  name is #{args.last_name}"
   end

=== Tasks that take Variable-length Parameters

Tasks that need to handle a list of values as a parameter can use the
extras method of the args variable.  This allows for tasks that can
loop over a variable number of values, and its compatible with named
parameters as well:

   task :email, [:message] do |t, args|
     mail = Mail.new(args.message)
     recipients = args.extras
     recipients.each do |target|
       mail.send_to(target)
     end
   end

There is also the convenience method to_a that returns all parameters
in the sequential order they were given, including those associated
with named parameters.

=== Deprecated Task Parameters Format

There is an older format for declaring task parameters that omitted
the task argument array and used the :needs keyword to introduce the
dependencies.  That format is still supported for compatibility, but
is not recommended for use.  The older format may be dropped in future
versions of rake.

== Accessing Task Programmatically

Sometimes it is useful to manipulate tasks programmatically in a
Rakefile. To find a task object use Rake::Task.[].

=== Programmatic Task Example

For example, the following Rakefile defines two tasks.  The :doit task
simply prints a simple "DONE" message.  The :dont class will lookup
the doit class and remove (clear) all of its prerequisites and
actions.

   task :doit do
     puts "DONE"
   end

   task :dont do
     Rake::Task[:doit].clear
   end

Running this example:

  $ rake doit
  (in /Users/jim/working/git/rake/x)
  DONE
  $ rake dont doit
  (in /Users/jim/working/git/rake/x)
  $

The ability to programmatically manipulate tasks gives rake very
powerful meta-programming capabilities w.r.t. task execution, but
should be used with caution.

== Rules

When a file is named as a prerequisite, but does not have a file task
defined for it, Rake will attempt to synthesize a task by looking at a
list of rules supplied in the Rakefile.

Suppose we were trying to invoke task "mycode.o", but no task is
defined for it.  But the rakefile has a rule that look like this ...

  rule '.o' => ['.c'] do |t|
    sh "cc #{t.source} -c -o #{t.name}"
  end

This rule will synthesize any task that ends in ".o".  It has a
prerequisite a source file with an extension of ".c" must exist.  If
Rake is able to find a file named "mycode.c", it will automatically
create a task that builds "mycode.o" from "mycode.c".

If the file "mycode.c" does not exist, rake will attempt
to recursively synthesize a rule for it.

When a task is synthesized from a rule, the +source+ attribute of the
task is set to the matching source file.  This allows us to write
rules with actions that reference the source file.

=== Advanced Rules

Any regular expression may be used as the rule pattern.  Additionally,
a proc may be used to calculate the name of the source file.  This
allows for complex patterns and sources.

The following rule is equivalent to the example above.

  rule( /\.o$/ => [
    proc {|task_name| task_name.sub(/\.[^.]+$/, '.c') }
  ]) do |t|
    sh "cc #{t.source} -c -o #{t.name}"
  end

*NOTE:* Because of a _quirk_ in Ruby syntax, parenthesis are
required on *rule* when the first argument is a regular expression.

The following rule might be used for Java files ...

  rule '.class' => [
    proc { |tn| tn.sub(/\.class$/, '.java').sub(/^classes\//, 'src/') }
  ] do |t|
    java_compile(t.source, t.name)
  end

*NOTE:* +java_compile+ is a hypothetical method that invokes the
java compiler.

== Importing Dependencies

Any ruby file (including other rakefiles) can be included with a
standard Ruby +require+ command.  The rules and declarations in the
required file are just added to the definitions already accumulated.

Because the files are loaded _before_ the rake targets are evaluated,
the loaded files must be "ready to go" when the rake command is
invoked. This makes generated dependency files difficult to use. By
the time rake gets around to updating the dependencies file, it is too
late to load it.

The +import+ command addresses this by specifying a file to be loaded
_after_ the main rakefile is loaded, but _before_ any targets on the
command line are invoked. In addition, if the file name matches an
explicit task, that task is invoked before loading the file. This
allows dependency files to be generated and used in a single rake
command invocation.

Example:

  require 'rake/loaders/makefile'

  file ".depends.mf" => [SRC_LIST] do |t|
    sh "makedepend -f- -- #{CFLAGS} -- #{t.prerequisites} > #{t.name}"
  end

  import ".depends.mf"

If ".depends" does not exist, or is out of date w.r.t. the source
files, a new ".depends" file is generated using +makedepend+ before
loading.

== Comments

Standard Ruby comments (beginning with "#") can be used anywhere it is
legal in Ruby source code, including comments for tasks and rules.
However, if you wish a task to be described using the "-T" switch,
then you need to use the +desc+ command to describe the task.

Example:

  desc "Create a distribution package"
  task package: %w[ ... ] do ... end

The "-T" switch (or "--tasks" if you like to spell things out) will
display a list of tasks that have a description.  If you use +desc+ to
describe your major tasks, you have a semi-automatic way of generating
a summary of your Rake file.

  $ rake -T
  (in /home/.../rake)
  rake clean            # Remove any temporary products.
  rake clobber          # Remove any generated file.
  rake clobber_rdoc     # Remove rdoc products
  rake contrib_test     # Run tests for contrib_test
  rake default          # Default Task
  rake install          # Install the application
  rake lines            # Count lines in the main rake file
  rake rdoc             # Build the rdoc HTML Files
  rake rerdoc           # Force a rebuild of the RDOC files
  rake test             # Run tests
  rake testall          # Run all test targets

Only tasks with descriptions will be displayed with the "-T" switch.
Use "-P" (or "--prereqs") to get a list of all tasks and their
prerequisites.

== Namespaces

As projects grow (and along with it, the number of tasks), it is
common for task names to begin to clash.  For example, if you might
have a main program and a set of sample programs built by a single
Rakefile.  By placing the tasks related to the main program in one
namespace, and the tasks for building the sample programs in a
different namespace, the task names will not interfere with each other.

For example:

  namespace "main" do
    task :build do
      # Build the main program
    end
  end

  namespace "samples" do
    task :build do
      # Build the sample programs
    end
  end

  task build: %w[main:build samples:build]

Referencing a task in a separate namespace can be achieved by
prefixing the task name with the namespace and a colon
(e.g. "main:build" refers to the :build task in the +main+ namespace).
Nested namespaces are supported.

Note that the name given in the +task+ command is always the unadorned
task name without any namespace prefixes.  The +task+ command always
defines a task in the current namespace.

=== FileTasks

File task names are not scoped by the namespace command.  Since the
name of a file task is the name of an actual file in the file system,
it makes little sense to include file task names in name space.
Directory tasks (created by the +directory+ command) are a type of
file task and are also not affected by namespaces.

=== Name Resolution

When looking up a task name, rake will start with the current
namespace and attempt to find the name there.  If it fails to find a
name in the current namespace, it will search the parent namespaces
until a match is found (or an error occurs if there is no match).

The "rake" namespace is a special implicit namespace that refers to
the toplevel names.

If a task name begins with a "^" character, the name resolution will
start in the parent namespace.  Multiple "^" characters are allowed.

Here is an example file with multiple :run tasks and how various names
resolve in different locations.

  task :run

  namespace "one" do
    task :run

    namespace "two" do
      task :run

      # :run            => "one:two:run"
      # "two:run"       => "one:two:run"
      # "one:two:run"   => "one:two:run"
      # "one:run"       => "one:run"
      # "^run"          => "one:run"
      # "^^run"         => "rake:run" (the top level task)
      # "rake:run"      => "rake:run" (the top level task)
    end

    # :run       => "one:run"
    # "two:run"  => "one:two:run"
    # "^run"     => "rake:run"
  end

  # :run           => "rake:run"
  # "one:run"      => "one:run"
  # "one:two:run"  => "one:two:run"

== FileLists

FileLists are the way Rake manages lists of files.  You can treat a
FileList as an array of strings for the most part, but FileLists
support some additional operations.

=== Creating a FileList

Creating a file list is easy.  Just give it the list of file names:

   fl = FileList['file1.rb', file2.rb']

Or give it a glob pattern:

   fl = FileList['*.rb']

== Odds and Ends

=== do/end versus { }

Blocks may be specified with either a +do+/+end+ pair, or with curly
braces in Ruby.  We _strongly_ recommend using +do+/+end+ to specify the
actions for tasks and rules.  Because the rakefile idiom tends to
leave off parentheses on the task/file/rule methods, unusual
ambiguities can arise when using curly braces.

For example, suppose that the method +object_files+ returns a list of
object files in a project.  Now we use +object_files+ as the
prerequisites in a rule specified with actions in curly braces.

  # DON'T DO THIS!
  file "prog" => object_files {
    # Actions are expected here (but it doesn't work)!
  }

Because curly braces have a higher precedence than +do+/+end+, the
block is associated with the +object_files+ method rather than the
+file+ method.

This is the proper way to specify the task ...

  # THIS IS FINE
  file "prog" => object_files do
    # Actions go here
  end

== Rakefile Path

When issuing the +rake+ command in a terminal, Rake will look
for a Rakefile in the current directory. If a Rakefile  is not found,
it will search parent directories until one is found.

For example, if a Rakefile resides in the +project/+ directory,
moving deeper into the project's directory tree will not have an adverse
effect on rake tasks:

  $ pwd
  /home/user/project

  $ cd lib/foo/bar
  $ pwd
  /home/user/project/lib/foo/bar

  $ rake run_pwd
  /home/user/project

As far as rake is concerned, all tasks are run from the directory in
which the Rakefile resides.

=== Multiple Rake Files

Not all tasks need to be included in a single Rakefile. Additional
rake files (with the file extension "+.rake+") may be placed in
+rakelib+ directory located at the top level of a project (i.e.
the same directory that contains the main +Rakefile+).

Also, rails projects may include additional rake files in the
+lib/tasks+ directory.

=== Clean and Clobber Tasks

Through <tt>require 'rake/clean'</tt> Rake provides +clean+ and +clobber+
tasks:

+clean+ ::
  Clean up the project by deleting scratch files and backup files.  Add files
  to the +CLEAN+ FileList to have the +clean+ target handle them.

+clobber+ ::
  Clobber all generated and non-source files in a project.  The task depends
  on +clean+, so all the +CLEAN+ files will be deleted as well as files in the
  +CLOBBER+ FileList.  The intent of this task is to return a project to its
  pristine, just unpacked state.

You can add file names or glob patterns to both the +CLEAN+ and +CLOBBER+
lists.

=== Phony Task

The phony task can be used as a dependency to allow file-based tasks to use
non-file-based-tasks as prerequisites without forcing them to rebuild.  You
can <tt>require 'rake/phony'</tt> to add the +phony+ task.

----

== See

* README.rdoc -- Main documentation for Rake.
PK}$[t�S	]]!gems/gems/rake-13.0.6/README.rdocnu�[���= RAKE -- Ruby Make

home :: https://github.com/ruby/rake
bugs :: https://github.com/ruby/rake/issues
docs :: https://ruby.github.io/rake

== Description

Rake is a Make-like program implemented in Ruby. Tasks and dependencies are
specified in standard Ruby syntax.

Rake has the following features:

* Rakefiles (rake's version of Makefiles) are completely defined in
  standard Ruby syntax.  No XML files to edit.  No quirky Makefile
  syntax to worry about (is that a tab or a space?)

* Users can specify tasks with prerequisites.

* Rake supports rule patterns to synthesize implicit tasks.

* Flexible FileLists that act like arrays but know about manipulating
  file names and paths.

* A library of prepackaged tasks to make building rakefiles easier. For example,
  tasks for building tarballs. (Formerly
  tasks for building RDoc, Gems, and publishing to FTP were included in rake but they're now
  available in RDoc, RubyGems, and rake-contrib respectively.)

* Supports parallel execution of tasks.

== Installation

=== Gem Installation

Download and install rake with the following.

  gem install rake

== Usage

=== Simple Example

First, you must write a "Rakefile" file which contains the build rules. Here's
a simple example:

  task default: %w[test]

  task :test do
    ruby "test/unittest.rb"
  end

This Rakefile has two tasks:

* A task named "test", which -- upon invocation -- will run a unit test file
  in Ruby.
* A task named "default". This task does nothing by itself, but it has exactly
  one dependency, namely the "test" task. Invoking the "default" task will
  cause Rake to invoke the "test" task as well.

Running the "rake" command without any options will cause it to run the
"default" task in the Rakefile:

  % ls
  Rakefile     test/
  % rake
  (in /home/some_user/Projects/rake)
  ruby test/unittest.rb
  ....unit test output here...

Type "rake --help" for all available options.

== Resources

=== Rake Information

* {Rake command-line}[link:doc/command_line_usage.rdoc]
* {Writing Rakefiles}[link:doc/rakefile.rdoc]
* The original {Rake announcement}[link:doc/rational.rdoc]
* Rake {glossary}[link:doc/glossary.rdoc]

=== Presentations and Articles about Rake

* Avdi Grimm's rake series:
  1. {Rake Basics}[https://avdi.codes/rake-part-1-basics/]
  2. {Rake File Lists}[https://avdi.codes/rake-part-2-file-lists-2/]
  3. {Rake Rules}[https://avdi.codes/rake-part-3-rules/]
  4. {Rake Pathmap}[https://avdi.codes/rake-part-4-pathmap/]
  5. {File Operations}[https://avdi.codes/rake-part-5-file-operations/]
  6. {Clean and Clobber}[https://avdi.codes/rake-part-6-clean-and-clobber/]
  7. {MultiTask}[https://avdi.codes/rake-part-7-multitask/]
* {Jim Weirich's 2003 RubyConf presentation}[https://web.archive.org/web/20140221123354/http://onestepback.org/articles/buildingwithrake/]
* Martin Fowler's article on Rake: https://martinfowler.com/articles/rake.html

== Other Make Re-envisionings ...

Rake is a late entry in the make replacement field.  Here are links to
other projects with similar (and not so similar) goals.

* https://directory.fsf.org/wiki/Bras -- Bras, one of earliest
  implementations of "make in a scripting language".
* http://www.a-a-p.org -- Make in Python
* https://ant.apache.org -- The Ant project
* https://search.cpan.org/search?query=PerlBuildSystem -- The Perl Build System
* https://www.rubydoc.info/gems/rant/0.5.7/frames -- Rant, another Ruby make tool.

== Credits

[<b>Jim Weirich</b>] Who originally created Rake.

[<b>Ryan Dlugosz</b>] For the initial conversation that sparked Rake.

[<b>Nobuyoshi Nakada <nobu@ruby-lang.org></b>] For the initial patch for rule support.

[<b>Tilman Sauerbeck <tilman@code-monkey.de></b>] For the recursive rule patch.

[<b>Eric Hodel</b>] For aid in maintaining rake.

[<b>Hiroshi SHIBATA</b>] Maintainer of Rake 10.X and Rake 11.X

== License

Rake is available under an MIT-style license.

:include: MIT-LICENSE

---

= Other stuff

Author::   Jim Weirich <jim.weirich@gmail.com>
Requires:: Ruby 2.0.0 or later
License::  Copyright Jim Weirich.
           Released under an MIT-style license.  See the MIT-LICENSE
           file included in the distribution.

== Warranty

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.

== Historical

Rake was originally created by Jim Weirich, who unfortunately passed away in
February 2014. This repository was originally hosted at
{github.com/jimweirich/rake}[https://github.com/jimweirich/rake/], however
with his passing, has been moved to {ruby/rake}[https://github.com/ruby/rake].

You can view Jim's last commit here:
https://github.com/jimweirich/rake/tree/336559f28f55bce418e2ebcc0a57548dcbac4025

You can {read more about Jim}[https://en.wikipedia.org/wiki/Jim_Weirich] at Wikipedia.

Thank you for this great tool, Jim. We'll remember you.
PK}$[W��!gems/gems/rake-13.0.6/MIT-LICENSEnu�[���Copyright (c) Jim Weirich

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}$[Q��=rr!gems/gems/rake-13.0.6/lib/rake.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2003-2010 by Jim Weirich (jim.weirich@gmail.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.
#++

module Rake; end

require "rake/version"

require "rbconfig"
require "fileutils"
require "singleton"
require "monitor"
require "optparse"
require "ostruct"

require "rake/ext/string"

require "rake/win32"

require "rake/linked_list"
require "rake/cpu_counter"
require "rake/scope"
require "rake/task_argument_error"
require "rake/rule_recursion_overflow_error"
require "rake/rake_module"
require "rake/trace_output"
require "rake/pseudo_status"
require "rake/task_arguments"
require "rake/invocation_chain"
require "rake/task"
require "rake/file_task"
require "rake/file_creation_task"
require "rake/multi_task"
require "rake/dsl_definition"
require "rake/file_utils_ext"
require "rake/file_list"
require "rake/default_loader"
require "rake/early_time"
require "rake/late_time"
require "rake/name_space"
require "rake/task_manager"
require "rake/application"
require "rake/backtrace"

$trace = false

# :stopdoc:
#
# Some top level Constants.

FileList = Rake::FileList
RakeFileUtils = Rake::FileUtilsExt
PK}$[���^		)gems/gems/rake-13.0.6/lib/rake/promise.rbnu�[���# frozen_string_literal: true
module Rake

  # A Promise object represents a promise to do work (a chore) in the
  # future. The promise is created with a block and a list of
  # arguments for the block. Calling value will return the value of
  # the promised chore.
  #
  # Used by ThreadPool.
  #
  class Promise               # :nodoc: all
    NOT_SET = Object.new.freeze # :nodoc:

    attr_accessor :recorder

    # Create a promise to do the chore specified by the block.
    def initialize(args, &block)
      @mutex = Mutex.new
      @result = NOT_SET
      @error = NOT_SET
      @args = args
      @block = block
    end

    # Return the value of this promise.
    #
    # If the promised chore is not yet complete, then do the work
    # synchronously. We will wait.
    def value
      unless complete?
        stat :sleeping_on, item_id: object_id
        @mutex.synchronize do
          stat :has_lock_on, item_id: object_id
          chore
          stat :releasing_lock_on, item_id: object_id
        end
      end
      error? ? raise(@error) : @result
    end

    # If no one else is working this promise, go ahead and do the chore.
    def work
      stat :attempting_lock_on, item_id: object_id
      if @mutex.try_lock
        stat :has_lock_on, item_id: object_id
        chore
        stat :releasing_lock_on, item_id: object_id
        @mutex.unlock
      else
        stat :bailed_on, item_id: object_id
      end
    end

    private

    # Perform the chore promised
    def chore
      if complete?
        stat :found_completed, item_id: object_id
        return
      end
      stat :will_execute, item_id: object_id
      begin
        @result = @block.call(*@args)
      rescue Exception => e
        @error = e
      end
      stat :did_execute, item_id: object_id
      discard
    end

    # Do we have a result for the promise
    def result?
      !@result.equal?(NOT_SET)
    end

    # Did the promise throw an error
    def error?
      !@error.equal?(NOT_SET)
    end

    # Are we done with the promise
    def complete?
      result? || error?
    end

    # free up these items for the GC
    def discard
      @args = nil
      @block = nil
    end

    # Record execution statistics if there is a recorder
    def stat(*args)
      @recorder.call(*args) if @recorder
    end

  end

end
PK}$[zWBd��)gems/gems/rake-13.0.6/lib/rake/version.rbnu�[���# frozen_string_literal: true
module Rake
  VERSION = "13.0.6"

  module Version # :nodoc: all
    MAJOR, MINOR, BUILD, *OTHER = Rake::VERSION.split "."

    NUMBERS = [MAJOR, MINOR, BUILD, *OTHER]
  end
end
PK}$[0Z�R��0gems/gems/rake-13.0.6/lib/rake/private_reader.rbnu�[���# frozen_string_literal: true
module Rake

  # Include PrivateReader to use +private_reader+.
  module PrivateReader           # :nodoc: all

    def self.included(base)
      base.extend(ClassMethods)
    end

    module ClassMethods

      # Declare a list of private accessors
      def private_reader(*names)
        attr_reader(*names)
        private(*names)
      end
    end

  end
end
PK}$[����<gems/gems/rake-13.0.6/lib/rake/invocation_exception_mixin.rbnu�[���# frozen_string_literal: true
module Rake
  module InvocationExceptionMixin
    # Return the invocation chain (list of Rake tasks) that were in
    # effect when this exception was detected by rake.  May be null if
    # no tasks were active.
    def chain
      @rake_invocation_chain ||= nil
    end

    # Set the invocation chain in effect when this exception was
    # detected.
    def chain=(value)
      @rake_invocation_chain = value
    end
  end
end
PK}$[F-�
��0gems/gems/rake-13.0.6/lib/rake/dsl_definition.rbnu�[���# frozen_string_literal: true
# Rake DSL functions.
require "rake/file_utils_ext"

module Rake

  ##
  # DSL is a module that provides #task, #desc, #namespace, etc.  Use this
  # when you'd like to use rake outside the top level scope.
  #
  # For a Rakefile you run from the command line this module is automatically
  # included.

  module DSL

    #--
    # Include the FileUtils file manipulation functions in the top
    # level module, but mark them private so that they don't
    # unintentionally define methods on other objects.
    #++

    include FileUtilsExt
    private(*FileUtils.instance_methods(false))
    private(*FileUtilsExt.instance_methods(false))

    private

    # :call-seq:
    #   task(task_name)
    #   task(task_name: dependencies)
    #   task(task_name, arguments => dependencies)
    #
    # Declare a basic task.  The +task_name+ is always the first argument.  If
    # the task name contains a ":" it is defined in that namespace.
    #
    # The +dependencies+ may be a single task name or an Array of task names.
    # The +argument+ (a single name) or +arguments+ (an Array of names) define
    # the arguments provided to the task.
    #
    # The task, argument and dependency names may be either symbols or
    # strings.
    #
    # A task with a single dependency:
    #
    #   task clobber: %w[clean] do
    #     rm_rf "html"
    #   end
    #
    # A task with an argument and a dependency:
    #
    #   task :package, [:version] => :test do |t, args|
    #     # ...
    #   end
    #
    # To invoke this task from the command line:
    #
    #   $ rake package[1.2.3]
    #
    def task(*args, &block) # :doc:
      Rake::Task.define_task(*args, &block)
    end

    # Declare a file task.
    #
    # Example:
    #   file "config.cfg" => ["config.template"] do
    #     open("config.cfg", "w") do |outfile|
    #       open("config.template") do |infile|
    #         while line = infile.gets
    #           outfile.puts line
    #         end
    #       end
    #     end
    #  end
    #
    def file(*args, &block) # :doc:
      Rake::FileTask.define_task(*args, &block)
    end

    # Declare a file creation task.
    # (Mainly used for the directory command).
    def file_create(*args, &block)
      Rake::FileCreationTask.define_task(*args, &block)
    end

    # Declare a set of files tasks to create the given directories on
    # demand.
    #
    # Example:
    #   directory "testdata/doc"
    #
    def directory(*args, &block) # :doc:
      result = file_create(*args, &block)
      dir, _ = *Rake.application.resolve_args(args)
      dir = Rake.from_pathname(dir)
      Rake.each_dir_parent(dir) do |d|
        file_create d do |t|
          mkdir_p t.name unless File.exist?(t.name)
        end
      end
      result
    end

    # Declare a task that performs its prerequisites in
    # parallel. Multitasks does *not* guarantee that its prerequisites
    # will execute in any given order (which is obvious when you think
    # about it)
    #
    # Example:
    #   multitask deploy: %w[deploy_gem deploy_rdoc]
    #
    def multitask(*args, &block) # :doc:
      Rake::MultiTask.define_task(*args, &block)
    end

    # Create a new rake namespace and use it for evaluating the given
    # block.  Returns a NameSpace object that can be used to lookup
    # tasks defined in the namespace.
    #
    # Example:
    #
    #   ns = namespace "nested" do
    #     # the "nested:run" task
    #     task :run
    #   end
    #   task_run = ns[:run] # find :run in the given namespace.
    #
    # Tasks can also be defined in a namespace by using a ":" in the task
    # name:
    #
    #   task "nested:test" do
    #     # ...
    #   end
    #
    def namespace(name=nil, &block) # :doc:
      name = name.to_s if name.kind_of?(Symbol)
      name = name.to_str if name.respond_to?(:to_str)
      unless name.kind_of?(String) || name.nil?
        raise ArgumentError, "Expected a String or Symbol for a namespace name"
      end
      Rake.application.in_namespace(name, &block)
    end

    # Declare a rule for auto-tasks.
    #
    # Example:
    #  rule '.o' => '.c' do |t|
    #    sh 'cc', '-o', t.name, t.source
    #  end
    #
    def rule(*args, &block) # :doc:
      Rake::Task.create_rule(*args, &block)
    end

    # Describes the next rake task.  Duplicate descriptions are discarded.
    # Descriptions are shown with <code>rake -T</code> (up to the first
    # sentence) and <code>rake -D</code> (the entire description).
    #
    # Example:
    #   desc "Run the Unit Tests"
    #   task test: [:build]
    #     # ... run tests
    #   end
    #
    def desc(description) # :doc:
      Rake.application.last_description = description
    end

    # Import the partial Rakefiles +fn+.  Imported files are loaded
    # _after_ the current file is completely loaded.  This allows the
    # import statement to appear anywhere in the importing file, and yet
    # allowing the imported files to depend on objects defined in the
    # importing file.
    #
    # A common use of the import statement is to include files
    # containing dependency declarations.
    #
    # See also the --rakelibdir command line option.
    #
    # Example:
    #   import ".depend", "my_rules"
    #
    def import(*fns) # :doc:
      fns.each do |fn|
        Rake.application.add_import(fn)
      end
    end
  end
  extend FileUtilsExt
end

# Extend the main object with the DSL commands. This allows top-level
# calls to task, etc. to work from a Rakefile without polluting the
# object inheritance tree.
self.extend Rake::DSL
PK}$[���Q��-gems/gems/rake-13.0.6/lib/rake/rake_module.rbnu�[���# frozen_string_literal: true
require "rake/application"

module Rake

  class << self
    # Current Rake Application
    def application
      @application ||= Rake::Application.new
    end

    # Set the current Rake application object.
    def application=(app)
      @application = app
    end

    def suggested_thread_count # :nodoc:
      @cpu_count ||= Rake::CpuCounter.count
      @cpu_count + 4
    end

    # Return the original directory where the Rake application was started.
    def original_dir
      application.original_dir
    end

    # Load a rakefile.
    def load_rakefile(path)
      load(path)
    end

    # Add files to the rakelib list
    def add_rakelib(*files)
      application.options.rakelib ||= []
      application.options.rakelib.concat(files)
    end

    # Make +block_application+ the default rake application inside a block so
    # you can load rakefiles into a different application.
    #
    # This is useful when you want to run rake tasks inside a library without
    # running rake in a sub-shell.
    #
    # Example:
    #
    #   Dir.chdir 'other/directory'
    #
    #   other_rake = Rake.with_application do |rake|
    #     rake.load_rakefile
    #   end
    #
    #   puts other_rake.tasks

    def with_application(block_application = Rake::Application.new)
      orig_application = Rake.application

      Rake.application = block_application

      yield block_application

      block_application
    ensure
      Rake.application = orig_application
    end
  end

end
PK}$[E��.��)gems/gems/rake-13.0.6/lib/rake/tasklib.rbnu�[���# frozen_string_literal: true
require "rake"

module Rake

  # Base class for Task Libraries.
  class TaskLib
    include Cloneable
    include Rake::DSL
  end

end
PK}$[)lq(-gems/gems/rake-13.0.6/lib/rake/packagetask.rbnu�[���# frozen_string_literal: true
# Define a package task library to aid in the definition of
# redistributable package files.

require "rake"
require "rake/tasklib"

module Rake

  # Create a packaging task that will package the project into
  # distributable files (e.g zip archive or tar files).
  #
  # The PackageTask will create the following targets:
  #
  # +:package+ ::
  #   Create all the requested package files.
  #
  # +:clobber_package+ ::
  #   Delete all the package files.  This target is automatically
  #   added to the main clobber target.
  #
  # +:repackage+ ::
  #   Rebuild the package files from scratch, even if they are not out
  #   of date.
  #
  # <tt>"<em>package_dir</em>/<em>name</em>-<em>version</em>.tgz"</tt> ::
  #   Create a gzipped tar package (if <em>need_tar</em> is true).
  #
  # <tt>"<em>package_dir</em>/<em>name</em>-<em>version</em>.tar.gz"</tt> ::
  #   Create a gzipped tar package (if <em>need_tar_gz</em> is true).
  #
  # <tt>"<em>package_dir</em>/<em>name</em>-<em>version</em>.tar.bz2"</tt> ::
  #   Create a bzip2'd tar package (if <em>need_tar_bz2</em> is true).
  #
  # <tt>"<em>package_dir</em>/<em>name</em>-<em>version</em>.zip"</tt> ::
  #   Create a zip package archive (if <em>need_zip</em> is true).
  #
  # Example:
  #
  #   Rake::PackageTask.new("rake", "1.2.3") do |p|
  #     p.need_tar = true
  #     p.package_files.include("lib/**/*.rb")
  #   end
  #
  class PackageTask < TaskLib
    # Name of the package (from the GEM Spec).
    attr_accessor :name

    # Version of the package (e.g. '1.3.2').
    attr_accessor :version

    # Directory used to store the package files (default is 'pkg').
    attr_accessor :package_dir

    # True if a gzipped tar file (tgz) should be produced (default is
    # false).
    attr_accessor :need_tar

    # True if a gzipped tar file (tar.gz) should be produced (default
    # is false).
    attr_accessor :need_tar_gz

    # True if a bzip2'd tar file (tar.bz2) should be produced (default
    # is false).
    attr_accessor :need_tar_bz2

    # True if a xz'd tar file (tar.xz) should be produced (default is false)
    attr_accessor :need_tar_xz

    # True if a zip file should be produced (default is false)
    attr_accessor :need_zip

    # List of files to be included in the package.
    attr_accessor :package_files

    # Tar command for gzipped or bzip2ed archives.  The default is 'tar'.
    attr_accessor :tar_command

    # Zip command for zipped archives.  The default is 'zip'.
    attr_accessor :zip_command

    # True if parent directory should be omited (default is false)
    attr_accessor :without_parent_dir

    # Create a Package Task with the given name and version.  Use +:noversion+
    # as the version to build a package without a version or to provide a
    # fully-versioned package name.

    def initialize(name=nil, version=nil)
      init(name, version)
      yield self if block_given?
      define unless name.nil?
    end

    # Initialization that bypasses the "yield self" and "define" step.
    def init(name, version)
      @name = name
      @version = version
      @package_files = Rake::FileList.new
      @package_dir = "pkg"
      @need_tar = false
      @need_tar_gz = false
      @need_tar_bz2 = false
      @need_tar_xz = false
      @need_zip = false
      @tar_command = "tar"
      @zip_command = "zip"
      @without_parent_dir = false
    end

    # Create the tasks defined by this task library.
    def define
      fail "Version required (or :noversion)" if @version.nil?
      @version = nil if :noversion == @version

      desc "Build all the packages"
      task :package

      desc "Force a rebuild of the package files"
      task repackage: [:clobber_package, :package]

      desc "Remove package products"
      task :clobber_package do
        rm_r package_dir rescue nil
      end

      task clobber: [:clobber_package]

      [
        [need_tar, tgz_file, "z"],
        [need_tar_gz, tar_gz_file, "z"],
        [need_tar_bz2, tar_bz2_file, "j"],
        [need_tar_xz, tar_xz_file, "J"]
      ].each do |need, file, flag|
        if need
          task package: ["#{package_dir}/#{file}"]
          file "#{package_dir}/#{file}" =>
            [package_dir_path] + package_files do
            chdir(working_dir) { sh @tar_command, "#{flag}cvf", file, target_dir }
            mv "#{package_dir_path}/#{target_dir}", package_dir if without_parent_dir
          end
        end
      end

      if need_zip
        task package: ["#{package_dir}/#{zip_file}"]
        file "#{package_dir}/#{zip_file}" =>
          [package_dir_path] + package_files do
          chdir(working_dir) { sh @zip_command, "-r", zip_file, target_dir }
          mv "#{package_dir_path}/#{zip_file}", package_dir if without_parent_dir
        end
      end

      directory package_dir_path => @package_files do
        @package_files.each do |fn|
          f = File.join(package_dir_path, fn)
          fdir = File.dirname(f)
          mkdir_p(fdir) unless File.exist?(fdir)
          if File.directory?(fn)
            mkdir_p(f)
          else
            rm_f f
            safe_ln(fn, f)
          end
        end
      end
      self
    end

    # The name of this package

    def package_name
      @version ? "#{@name}-#{@version}" : @name
    end

    # The directory this package will be built in

    def package_dir_path
      "#{package_dir}/#{package_name}"
    end

    # The package name with .tgz added

    def tgz_file
      "#{package_name}.tgz"
    end

    # The package name with .tar.gz added

    def tar_gz_file
      "#{package_name}.tar.gz"
    end

    # The package name with .tar.bz2 added

    def tar_bz2_file
      "#{package_name}.tar.bz2"
    end

    # The package name with .tar.xz added

    def tar_xz_file
      "#{package_name}.tar.xz"
    end

    # The package name with .zip added

    def zip_file
      "#{package_name}.zip"
    end

    def working_dir
      without_parent_dir ? package_dir_path : package_dir
    end

    # target directory relative to working_dir
    def target_dir
      without_parent_dir ? "." : package_name
    end
  end

end
PK}$[��l��4gems/gems/rake-13.0.6/lib/rake/file_creation_task.rbnu�[���# frozen_string_literal: true
require "rake/file_task"
require "rake/early_time"

module Rake

  # A FileCreationTask is a file task that when used as a dependency will be
  # needed if and only if the file has not been created.  Once created, it is
  # not re-triggered if any of its dependencies are newer, nor does trigger
  # any rebuilds of tasks that depend on it whenever it is updated.
  #
  class FileCreationTask < FileTask
    # Is this file task needed?  Yes if it doesn't exist.
    def needed?
      !File.exist?(name)
    end

    # Time stamp for file creation task.  This time stamp is earlier
    # than any other time stamp.
    def timestamp
      Rake::EARLY
    end
  end

end
PK}$[��K\��2gems/gems/rake-13.0.6/lib/rake/invocation_chain.rbnu�[���# frozen_string_literal: true
module Rake

  # InvocationChain tracks the chain of task invocations to detect
  # circular dependencies.
  class InvocationChain < LinkedList

    # Is the invocation already in the chain?
    def member?(invocation)
      head == invocation || tail.member?(invocation)
    end

    # Append an invocation to the chain of invocations. It is an error
    # if the invocation already listed.
    def append(invocation)
      if member?(invocation)
        fail RuntimeError, "Circular dependency detected: #{to_s} => #{invocation}"
      end
      conj(invocation)
    end

    # Convert to string, ie: TOP => invocation => invocation
    def to_s
      "#{prefix}#{head}"
    end

    # Class level append.
    def self.append(invocation, chain)
      chain.append(invocation)
    end

    private

    def prefix
      "#{tail} => "
    end

    # Null object for an empty chain.
    class EmptyInvocationChain < LinkedList::EmptyLinkedList
      @parent = InvocationChain

      def member?(obj)
        false
      end

      def append(invocation)
        conj(invocation)
      end

      def to_s
        "TOP"
      end
    end

    EMPTY = EmptyInvocationChain.new
  end
end
PK}$[ƋK�b�b-gems/gems/rake-13.0.6/lib/rake/application.rbnu�[���# frozen_string_literal: true
require "optparse"

require "rake/task_manager"
require "rake/file_list"
require "rake/thread_pool"
require "rake/thread_history_display"
require "rake/trace_output"
require "rake/win32"

module Rake

  CommandLineOptionError = Class.new(StandardError)

  ##
  # Rake main application object.  When invoking +rake+ from the
  # command line, a Rake::Application object is created and run.

  class Application
    include TaskManager
    include TraceOutput

    # The name of the application (typically 'rake')
    attr_reader :name

    # The original directory where rake was invoked.
    attr_reader :original_dir

    # Name of the actual rakefile used.
    attr_reader :rakefile

    # Number of columns on the terminal
    attr_accessor :terminal_columns

    # List of the top level task names (task names from the command line).
    attr_reader :top_level_tasks

    # Override the detected TTY output state (mostly for testing)
    attr_writer :tty_output

    DEFAULT_RAKEFILES = [
      "rakefile",
      "Rakefile",
      "rakefile.rb",
      "Rakefile.rb"
    ].freeze

    # Initialize a Rake::Application object.
    def initialize
      super
      @name = "rake"
      @rakefiles = DEFAULT_RAKEFILES.dup
      @rakefile = nil
      @pending_imports = []
      @imported = []
      @loaders = {}
      @default_loader = Rake::DefaultLoader.new
      @original_dir = Dir.pwd
      @top_level_tasks = []
      add_loader("rb", DefaultLoader.new)
      add_loader("rf", DefaultLoader.new)
      add_loader("rake", DefaultLoader.new)
      @tty_output = STDOUT.tty?
      @terminal_columns = ENV["RAKE_COLUMNS"].to_i

      set_default_options
    end

    # Run the Rake application.  The run method performs the following
    # three steps:
    #
    # * Initialize the command line options (+init+).
    # * Define the tasks (+load_rakefile+).
    # * Run the top level tasks (+top_level+).
    #
    # If you wish to build a custom rake command, you should call
    # +init+ on your application.  Then define any tasks.  Finally,
    # call +top_level+ to run your top level tasks.
    def run(argv = ARGV)
      standard_exception_handling do
        init "rake", argv
        load_rakefile
        top_level
      end
    end

    # Initialize the command line parameters and app name.
    def init(app_name="rake", argv = ARGV)
      standard_exception_handling do
        @name = app_name
        begin
          args = handle_options argv
        rescue ArgumentError
          # Backward compatibility for capistrano
          args = handle_options
        end
        collect_command_line_tasks(args)
      end
    end

    # Find the rakefile and then load it and any pending imports.
    def load_rakefile
      standard_exception_handling do
        raw_load_rakefile
      end
    end

    # Run the top level tasks of a Rake application.
    def top_level
      run_with_threads do
        if options.show_tasks
          display_tasks_and_comments
        elsif options.show_prereqs
          display_prerequisites
        else
          top_level_tasks.each { |task_name| invoke_task(task_name) }
        end
      end
    end

    # Run the given block with the thread startup and shutdown.
    def run_with_threads
      thread_pool.gather_history if options.job_stats == :history

      yield

      thread_pool.join
      if options.job_stats
        stats = thread_pool.statistics
        puts "Maximum active threads: #{stats[:max_active_threads]} + main"
        puts "Total threads in play:  #{stats[:total_threads_in_play]} + main"
      end
      ThreadHistoryDisplay.new(thread_pool.history).show if
        options.job_stats == :history
    end

    # Add a loader to handle imported files ending in the extension
    # +ext+.
    def add_loader(ext, loader)
      ext = ".#{ext}" unless ext =~ /^\./
      @loaders[ext] = loader
    end

    # Application options from the command line
    def options
      @options ||= OpenStruct.new
    end

    # Return the thread pool used for multithreaded processing.
    def thread_pool             # :nodoc:
      @thread_pool ||= ThreadPool.new(options.thread_pool_size || Rake.suggested_thread_count-1)
    end

    # internal ----------------------------------------------------------------

    # Invokes a task with arguments that are extracted from +task_string+
    def invoke_task(task_string) # :nodoc:
      name, args = parse_task_string(task_string)
      t = self[name]
      t.invoke(*args)
    end

    def parse_task_string(string) # :nodoc:
      /^([^\[]+)(?:\[(.*)\])$/ =~ string.to_s

      name           = $1
      remaining_args = $2

      return string, [] unless name
      return name,   [] if     remaining_args.empty?

      args = []

      begin
        /\s*((?:[^\\,]|\\.)*?)\s*(?:,\s*(.*))?$/ =~ remaining_args

        remaining_args = $2
        args << $1.gsub(/\\(.)/, '\1')
      end while remaining_args

      return name, args
    end

    # Provide standard exception handling for the given block.
    def standard_exception_handling # :nodoc:
      yield
    rescue SystemExit
      # Exit silently with current status
      raise
    rescue OptionParser::InvalidOption => ex
      $stderr.puts ex.message
      exit(false)
    rescue Exception => ex
      # Exit with error message
      display_error_message(ex)
      exit_because_of_exception(ex)
    end

    # Exit the program because of an unhandled exception.
    # (may be overridden by subclasses)
    def exit_because_of_exception(ex) # :nodoc:
      exit(false)
    end

    # Display the error message that caused the exception.
    def display_error_message(ex) # :nodoc:
      trace "#{name} aborted!"
      display_exception_details(ex)
      trace "Tasks: #{ex.chain}" if has_chain?(ex)
      trace "(See full trace by running task with --trace)" unless
         options.backtrace
    end

    def display_exception_details(ex) # :nodoc:
      display_exception_details_seen << ex

      display_exception_message_details(ex)
      display_exception_backtrace(ex)
      display_cause_details(ex.cause) if has_cause?(ex)
    end

    def display_cause_details(ex) # :nodoc:
      return if display_exception_details_seen.include? ex

      trace "\nCaused by:"
      display_exception_details(ex)
    end

    def display_exception_details_seen # :nodoc:
      Thread.current[:rake_display_exception_details_seen] ||= []
    end

    def has_cause?(ex) # :nodoc:
      ex.respond_to?(:cause) && ex.cause
    end

    def display_exception_message_details(ex) # :nodoc:
      if ex.instance_of?(RuntimeError)
        trace ex.message
      else
        trace "#{ex.class.name}: #{ex.message}"
      end
    end

    def display_exception_backtrace(ex) # :nodoc:
      if options.backtrace
        trace ex.backtrace.join("\n")
      else
        trace Backtrace.collapse(ex.backtrace).join("\n")
      end
    end

    # Warn about deprecated usage.
    #
    # Example:
    #    Rake.application.deprecate("import", "Rake.import", caller.first)
    #
    def deprecate(old_usage, new_usage, call_site) # :nodoc:
      unless options.ignore_deprecate
        $stderr.puts "WARNING: '#{old_usage}' is deprecated.  " +
          "Please use '#{new_usage}' instead.\n" +
          "    at #{call_site}"
      end
    end

    # Does the exception have a task invocation chain?
    def has_chain?(exception) # :nodoc:
      exception.respond_to?(:chain) && exception.chain
    end
    private :has_chain?

    # True if one of the files in RAKEFILES is in the current directory.
    # If a match is found, it is copied into @rakefile.
    def have_rakefile # :nodoc:
      @rakefiles.each do |fn|
        if File.exist?(fn)
          others = FileList.glob(fn, File::FNM_CASEFOLD)
          return others.size == 1 ? others.first : fn
        elsif fn == ""
          return fn
        end
      end
      return nil
    end

    # True if we are outputting to TTY, false otherwise
    def tty_output? # :nodoc:
      @tty_output
    end

    # We will truncate output if we are outputting to a TTY or if we've been
    # given an explicit column width to honor
    def truncate_output? # :nodoc:
      tty_output? || @terminal_columns.nonzero?
    end

    # Display the tasks and comments.
    def display_tasks_and_comments # :nodoc:
      displayable_tasks = tasks.select { |t|
        (options.show_all_tasks || t.comment) &&
          t.name =~ options.show_task_pattern
      }
      case options.show_tasks
      when :tasks
        width = displayable_tasks.map { |t| t.name_with_args.length }.max || 10
        if truncate_output?
          max_column = terminal_width - name.size - width - 7
        else
          max_column = nil
        end

        displayable_tasks.each do |t|
          printf("#{name} %-#{width}s  # %s\n",
            t.name_with_args,
            max_column ? truncate(t.comment, max_column) : t.comment)
        end
      when :describe
        displayable_tasks.each do |t|
          puts "#{name} #{t.name_with_args}"
          comment = t.full_comment || ""
          comment.split("\n").each do |line|
            puts "    #{line}"
          end
          puts
        end
      when :lines
        displayable_tasks.each do |t|
          t.locations.each do |loc|
            printf "#{name} %-30s %s\n", t.name_with_args, loc
          end
        end
      else
        fail "Unknown show task mode: '#{options.show_tasks}'"
      end
    end

    def terminal_width # :nodoc:
      if @terminal_columns.nonzero?
        result = @terminal_columns
      else
        result = unix? ? dynamic_width : 80
      end
      (result < 10) ? 80 : result
    rescue
      80
    end

    # Calculate the dynamic width of the
    def dynamic_width # :nodoc:
      @dynamic_width ||= (dynamic_width_stty.nonzero? || dynamic_width_tput)
    end

    def dynamic_width_stty # :nodoc:
      %x{stty size 2>/dev/null}.split[1].to_i
    end

    def dynamic_width_tput # :nodoc:
      %x{tput cols 2>/dev/null}.to_i
    end

    def unix? # :nodoc:
      RbConfig::CONFIG["host_os"] =~
        /(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/i
    end

    def windows? # :nodoc:
      Win32.windows?
    end

    def truncate(string, width) # :nodoc:
      if string.nil?
        ""
      elsif string.length <= width
        string
      else
        (string[0, width - 3] || "") + "..."
      end
    end

    # Display the tasks and prerequisites
    def display_prerequisites # :nodoc:
      tasks.each do |t|
        puts "#{name} #{t.name}"
        t.prerequisites.each { |pre| puts "    #{pre}" }
      end
    end

    def trace(*strings) # :nodoc:
      options.trace_output ||= $stderr
      trace_on(options.trace_output, *strings)
    end

    def sort_options(options) # :nodoc:
      options.sort_by { |opt|
        opt.select { |o| o.is_a?(String) && o =~ /^-/ }.map(&:downcase).sort.reverse
      }
    end
    private :sort_options

    # A list of all the standard options used in rake, suitable for
    # passing to OptionParser.
    def standard_rake_options # :nodoc:
      sort_options(
        [
          ["--all", "-A",
            "Show all tasks, even uncommented ones (in combination with -T or -D)",
            lambda { |value|
              options.show_all_tasks = value
            }
          ],
          ["--backtrace=[OUT]",
            "Enable full backtrace.  OUT can be stderr (default) or stdout.",
            lambda { |value|
              options.backtrace = true
              select_trace_output(options, "backtrace", value)
            }
          ],
          ["--build-all", "-B",
           "Build all prerequisites, including those which are up-to-date.",
           lambda { |value|
             options.build_all = true
           }
          ],
          ["--comments",
            "Show commented tasks only",
            lambda { |value|
              options.show_all_tasks = !value
            }
          ],
          ["--describe", "-D [PATTERN]",
            "Describe the tasks (matching optional PATTERN), then exit.",
            lambda { |value|
              select_tasks_to_show(options, :describe, value)
            }
          ],
          ["--directory", "-C [DIRECTORY]",
            "Change to DIRECTORY before doing anything.",
            lambda { |value|
              Dir.chdir value
              @original_dir = Dir.pwd
            }
          ],
          ["--dry-run", "-n",
            "Do a dry run without executing actions.",
            lambda { |value|
              Rake.verbose(true)
              Rake.nowrite(true)
              options.dryrun = true
              options.trace = true
            }
          ],
          ["--execute", "-e CODE",
            "Execute some Ruby code and exit.",
            lambda { |value|
              eval(value)
              exit
            }
          ],
          ["--execute-print", "-p CODE",
            "Execute some Ruby code, print the result, then exit.",
            lambda { |value|
              puts eval(value)
              exit
            }
          ],
          ["--execute-continue",  "-E CODE",
            "Execute some Ruby code, " +
            "then continue with normal task processing.",
            lambda { |value| eval(value) }
          ],
          ["--jobs",  "-j [NUMBER]",
            "Specifies the maximum number of tasks to execute in parallel. " +
            "(default is number of CPU cores + 4)",
            lambda { |value|
              if value.nil? || value == ""
                value = Float::INFINITY
              elsif value =~ /^\d+$/
                value = value.to_i
              else
                value = Rake.suggested_thread_count
              end
              value = 1 if value < 1
              options.thread_pool_size = value - 1
            }
          ],
          ["--job-stats [LEVEL]",
            "Display job statistics. " +
            "LEVEL=history displays a complete job list",
            lambda { |value|
              if value =~ /^history/i
                options.job_stats = :history
              else
                options.job_stats = true
              end
            }
          ],
          ["--libdir", "-I LIBDIR",
            "Include LIBDIR in the search path for required modules.",
            lambda { |value| $:.push(value) }
          ],
          ["--multitask", "-m",
            "Treat all tasks as multitasks.",
            lambda { |value| options.always_multitask = true }
          ],
          ["--no-search", "--nosearch",
            "-N", "Do not search parent directories for the Rakefile.",
            lambda { |value| options.nosearch = true }
          ],
          ["--prereqs", "-P",
            "Display the tasks and dependencies, then exit.",
            lambda { |value| options.show_prereqs = true }
          ],
          ["--quiet", "-q",
            "Do not log messages to standard output.",
            lambda { |value| Rake.verbose(false) }
          ],
          ["--rakefile", "-f [FILENAME]",
            "Use FILENAME as the rakefile to search for.",
            lambda { |value|
              value ||= ""
              @rakefiles.clear
              @rakefiles << value
            }
          ],
          ["--rakelibdir", "--rakelib", "-R RAKELIBDIR",
            "Auto-import any .rake files in RAKELIBDIR. " +
            "(default is 'rakelib')",
            lambda { |value|
              options.rakelib = value.split(File::PATH_SEPARATOR)
            }
          ],
          ["--require", "-r MODULE",
            "Require MODULE before executing rakefile.",
            lambda { |value|
              begin
                require value
              rescue LoadError => ex
                begin
                  rake_require value
                rescue LoadError
                  raise ex
                end
              end
            }
          ],
          ["--rules",
            "Trace the rules resolution.",
            lambda { |value| options.trace_rules = true }
          ],
          ["--silent", "-s",
            "Like --quiet, but also suppresses the " +
            "'in directory' announcement.",
            lambda { |value|
              Rake.verbose(false)
              options.silent = true
            }
          ],
          ["--suppress-backtrace PATTERN",
            "Suppress backtrace lines matching regexp PATTERN. " +
            "Ignored if --trace is on.",
            lambda { |value|
              options.suppress_backtrace_pattern = Regexp.new(value)
            }
          ],
          ["--system",  "-g",
            "Using system wide (global) rakefiles " +
            "(usually '~/.rake/*.rake').",
            lambda { |value| options.load_system = true }
          ],
          ["--no-system", "--nosystem", "-G",
            "Use standard project Rakefile search paths, " +
            "ignore system wide rakefiles.",
            lambda { |value| options.ignore_system = true }
          ],
          ["--tasks", "-T [PATTERN]",
            "Display the tasks (matching optional PATTERN) " +
            "with descriptions, then exit. " +
            "-AT combination displays all of tasks contained no description.",
            lambda { |value|
              select_tasks_to_show(options, :tasks, value)
            }
          ],
          ["--trace=[OUT]", "-t",
            "Turn on invoke/execute tracing, enable full backtrace. " +
            "OUT can be stderr (default) or stdout.",
            lambda { |value|
              options.trace = true
              options.backtrace = true
              select_trace_output(options, "trace", value)
              Rake.verbose(true)
            }
          ],
          ["--verbose", "-v",
            "Log message to standard output.",
            lambda { |value| Rake.verbose(true) }
          ],
          ["--version", "-V",
            "Display the program version.",
            lambda { |value|
              puts "rake, version #{Rake::VERSION}"
              exit
            }
          ],
          ["--where", "-W [PATTERN]",
            "Describe the tasks (matching optional PATTERN), then exit.",
            lambda { |value|
              select_tasks_to_show(options, :lines, value)
              options.show_all_tasks = true
            }
          ],
          ["--no-deprecation-warnings", "-X",
            "Disable the deprecation warnings.",
            lambda { |value|
              options.ignore_deprecate = true
            }
          ],
        ])
    end

    def select_tasks_to_show(options, show_tasks, value) # :nodoc:
      options.show_tasks = show_tasks
      options.show_task_pattern = Regexp.new(value || "")
      Rake::TaskManager.record_task_metadata = true
    end
    private :select_tasks_to_show

    def select_trace_output(options, trace_option, value) # :nodoc:
      value = value.strip unless value.nil?
      case value
      when "stdout"
        options.trace_output = $stdout
      when "stderr", nil
        options.trace_output = $stderr
      else
        fail CommandLineOptionError,
          "Unrecognized --#{trace_option} option '#{value}'"
      end
    end
    private :select_trace_output

    # Read and handle the command line options.  Returns the command line
    # arguments that we didn't understand, which should (in theory) be just
    # task names and env vars.
    def handle_options(argv) # :nodoc:
      set_default_options

      OptionParser.new do |opts|
        opts.banner = "#{Rake.application.name} [-f rakefile] {options} targets..."
        opts.separator ""
        opts.separator "Options are ..."

        opts.on_tail("-h", "--help", "-H", "Display this help message.") do
          puts opts
          exit
        end

        standard_rake_options.each { |args| opts.on(*args) }
        opts.environment("RAKEOPT")
      end.parse(argv)
    end

    # Similar to the regular Ruby +require+ command, but will check
    # for *.rake files in addition to *.rb files.
    def rake_require(file_name, paths=$LOAD_PATH, loaded=$") # :nodoc:
      fn = file_name + ".rake"
      return false if loaded.include?(fn)
      paths.each do |path|
        full_path = File.join(path, fn)
        if File.exist?(full_path)
          Rake.load_rakefile(full_path)
          loaded << fn
          return true
        end
      end
      fail LoadError, "Can't find #{file_name}"
    end

    def find_rakefile_location # :nodoc:
      here = Dir.pwd
      until (fn = have_rakefile)
        Dir.chdir("..")
        return nil if Dir.pwd == here || options.nosearch
        here = Dir.pwd
      end
      [fn, here]
    ensure
      Dir.chdir(Rake.original_dir)
    end

    def print_rakefile_directory(location) # :nodoc:
      $stderr.puts "(in #{Dir.pwd})" unless
        options.silent or original_dir == location
    end

    def raw_load_rakefile # :nodoc:
      rakefile, location = find_rakefile_location
      if (!options.ignore_system) &&
          (options.load_system || rakefile.nil?) &&
          system_dir && File.directory?(system_dir)
        print_rakefile_directory(location)
        glob("#{system_dir}/*.rake") do |name|
          add_import name
        end
      else
        fail "No Rakefile found (looking for: #{@rakefiles.join(', ')})" if
          rakefile.nil?
        @rakefile = rakefile
        Dir.chdir(location)
        print_rakefile_directory(location)
        Rake.load_rakefile(File.expand_path(@rakefile)) if
          @rakefile && @rakefile != ""
        options.rakelib.each do |rlib|
          glob("#{rlib}/*.rake") do |name|
            add_import name
          end
        end
      end
      load_imports
    end

    def glob(path, &block) # :nodoc:
      FileList.glob(path.tr("\\", "/")).each(&block)
    end
    private :glob

    # The directory path containing the system wide rakefiles.
    def system_dir # :nodoc:
      @system_dir ||=
        begin
          if ENV["RAKE_SYSTEM"]
            ENV["RAKE_SYSTEM"]
          else
            standard_system_dir
          end
        end
    end

    # The standard directory containing system wide rake files.
    if Win32.windows?
      def standard_system_dir #:nodoc:
        Win32.win32_system_dir
      end
    else
      def standard_system_dir #:nodoc:
        File.join(File.expand_path("~"), ".rake")
      end
    end
    private :standard_system_dir

    # Collect the list of tasks on the command line.  If no tasks are
    # given, return a list containing only the default task.
    # Environmental assignments are processed at this time as well.
    #
    # `args` is the list of arguments to peruse to get the list of tasks.
    # It should be the command line that was given to rake, less any
    # recognised command-line options, which OptionParser.parse will
    # have taken care of already.
    def collect_command_line_tasks(args) # :nodoc:
      @top_level_tasks = []
      args.each do |arg|
        if arg =~ /^(\w+)=(.*)$/m
          ENV[$1] = $2
        else
          @top_level_tasks << arg unless arg =~ /^-/
        end
      end
      @top_level_tasks.push(default_task_name) if @top_level_tasks.empty?
    end

    # Default task name ("default").
    # (May be overridden by subclasses)
    def default_task_name # :nodoc:
      "default"
    end

    # Add a file to the list of files to be imported.
    def add_import(fn) # :nodoc:
      @pending_imports << fn
    end

    # Load the pending list of imported files.
    def load_imports # :nodoc:
      while fn = @pending_imports.shift
        next if @imported.member?(fn)
        fn_task = lookup(fn) and fn_task.invoke
        ext = File.extname(fn)
        loader = @loaders[ext] || @default_loader
        loader.load(fn)
        if fn_task = lookup(fn) and fn_task.needed?
          fn_task.reenable
          fn_task.invoke
          loader.load(fn)
        end
        @imported << fn
      end
    end

    def rakefile_location(backtrace=caller) # :nodoc:
      backtrace.map { |t| t[/([^:]+):/, 1] }

      re = /^#{@rakefile}$/
      re = /#{re.source}/i if windows?

      backtrace.find { |str| str =~ re } || ""
    end

    def set_default_options # :nodoc:
      options.always_multitask           = false
      options.backtrace                  = false
      options.build_all                  = false
      options.dryrun                     = false
      options.ignore_deprecate           = false
      options.ignore_system              = false
      options.job_stats                  = false
      options.load_system                = false
      options.nosearch                   = false
      options.rakelib                    = %w[rakelib]
      options.show_all_tasks             = false
      options.show_prereqs               = false
      options.show_task_pattern          = nil
      options.show_tasks                 = nil
      options.silent                     = false
      options.suppress_backtrace_pattern = nil
      options.thread_pool_size           = Rake.suggested_thread_count
      options.trace                      = false
      options.trace_output               = $stderr
      options.trace_rules                = false
    end

  end
end
PK}$[���YY,gems/gems/rake-13.0.6/lib/rake/multi_task.rbnu�[���# frozen_string_literal: true
module Rake

  # Same as a regular task, but the immediate prerequisites are done in
  # parallel using Ruby threads.
  #
  class MultiTask < Task
    private

    def invoke_prerequisites(task_args, invocation_chain) # :nodoc:
      invoke_prerequisites_concurrently(task_args, invocation_chain)
    end
  end
end
PK}$[yOu�rr,gems/gems/rake-13.0.6/lib/rake/ext/string.rbnu�[���# frozen_string_literal: true
require "rake/ext/core"

class String

  rake_extension("ext") do
    # Replace the file extension with +newext+.  If there is no extension on
    # the string, append the new extension to the end.  If the new extension
    # is not given, or is the empty string, remove any existing extension.
    #
    # +ext+ is a user added method for the String class.
    #
    # This String extension comes from Rake
    def ext(newext="")
      return self.dup if [".", ".."].include? self
      if newext != ""
        newext = "." + newext unless newext =~ /^\./
      end
      self.chomp(File.extname(self)) << newext
    end
  end

  rake_extension("pathmap") do
    # Explode a path into individual components.  Used by +pathmap+.
    #
    # This String extension comes from Rake
    def pathmap_explode
      head, tail = File.split(self)
      return [self] if head == self
      return [tail] if head == "." || tail == "/"
      return [head, tail] if head == "/"
      return head.pathmap_explode + [tail]
    end
    protected :pathmap_explode

    # Extract a partial path from the path.  Include +n+ directories from the
    # front end (left hand side) if +n+ is positive.  Include |+n+|
    # directories from the back end (right hand side) if +n+ is negative.
    #
    # This String extension comes from Rake
    def pathmap_partial(n)
      dirs = File.dirname(self).pathmap_explode
      partial_dirs =
        if n > 0
          dirs[0...n]
        elsif n < 0
          dirs.reverse[0...-n].reverse
        else
          "."
        end
      File.join(partial_dirs)
    end
    protected :pathmap_partial

    # Perform the pathmap replacement operations on the given path. The
    # patterns take the form 'pat1,rep1;pat2,rep2...'.
    #
    # This String extension comes from Rake
    def pathmap_replace(patterns, &block)
      result = self
      patterns.split(";").each do |pair|
        pattern, replacement = pair.split(",")
        pattern = Regexp.new(pattern)
        if replacement == "*" && block_given?
          result = result.sub(pattern, &block)
        elsif replacement
          result = result.sub(pattern, replacement)
        else
          result = result.sub(pattern, "")
        end
      end
      result
    end
    protected :pathmap_replace

    # Map the path according to the given specification.  The specification
    # controls the details of the mapping.  The following special patterns are
    # recognized:
    #
    # <tt>%p</tt> :: The complete path.
    # <tt>%f</tt> :: The base file name of the path, with its file extension,
    #                but without any directories.
    # <tt>%n</tt> :: The file name of the path without its file extension.
    # <tt>%d</tt> :: The directory list of the path.
    # <tt>%x</tt> :: The file extension of the path.  An empty string if there
    #                is no extension.
    # <tt>%X</tt> :: Everything *but* the file extension.
    # <tt>%s</tt> :: The alternate file separator if defined, otherwise use #
    #                the standard file separator.
    # <tt>%%</tt> :: A percent sign.
    #
    # The <tt>%d</tt> specifier can also have a numeric prefix (e.g. '%2d').
    # If the number is positive, only return (up to) +n+ directories in the
    # path, starting from the left hand side.  If +n+ is negative, return (up
    # to) +n+ directories from the right hand side of the path.
    #
    # Examples:
    #
    #   'a/b/c/d/file.txt'.pathmap("%2d")   => 'a/b'
    #   'a/b/c/d/file.txt'.pathmap("%-2d")  => 'c/d'
    #
    # Also the <tt>%d</tt>, <tt>%p</tt>, <tt>%f</tt>, <tt>%n</tt>,
    # <tt>%x</tt>, and <tt>%X</tt> operators can take a pattern/replacement
    # argument to perform simple string substitutions on a particular part of
    # the path.  The pattern and replacement are separated by a comma and are
    # enclosed by curly braces.  The replacement spec comes after the %
    # character but before the operator letter.  (e.g. "%{old,new}d").
    # Multiple replacement specs should be separated by semi-colons (e.g.
    # "%{old,new;src,bin}d").
    #
    # Regular expressions may be used for the pattern, and back refs may be
    # used in the replacement text.  Curly braces, commas and semi-colons are
    # excluded from both the pattern and replacement text (let's keep parsing
    # reasonable).
    #
    # For example:
    #
    #    "src/org/onestepback/proj/A.java".pathmap("%{^src,class}X.class")
    #
    # returns:
    #
    #    "class/org/onestepback/proj/A.class"
    #
    # If the replacement text is '*', then a block may be provided to perform
    # some arbitrary calculation for the replacement.
    #
    # For example:
    #
    #   "/path/to/file.TXT".pathmap("%X%{.*,*}x") { |ext|
    #      ext.downcase
    #   }
    #
    # Returns:
    #
    #  "/path/to/file.txt"
    #
    # This String extension comes from Rake
    def pathmap(spec=nil, &block)
      return self if spec.nil?
      result = "".dup
      spec.scan(/%\{[^}]*\}-?\d*[sdpfnxX%]|%-?\d+d|%.|[^%]+/) do |frag|
        case frag
        when "%f"
          result << File.basename(self)
        when "%n"
          result << File.basename(self).ext
        when "%d"
          result << File.dirname(self)
        when "%x"
          result << File.extname(self)
        when "%X"
          result << self.ext
        when "%p"
          result << self
        when "%s"
          result << (File::ALT_SEPARATOR || File::SEPARATOR)
        when "%-"
          # do nothing
        when "%%"
          result << "%"
        when /%(-?\d+)d/
          result << pathmap_partial($1.to_i)
        when /^%\{([^}]*)\}(\d*[dpfnxX])/
          patterns, operator = $1, $2
          result << pathmap("%" + operator).pathmap_replace(patterns, &block)
        when /^%/
          fail ArgumentError, "Unknown pathmap specifier #{frag} in '#{spec}'"
        else
          result << frag
        end
      end
      result
    end
  end

end
PK}$[u����*gems/gems/rake-13.0.6/lib/rake/ext/core.rbnu�[���# frozen_string_literal: true
class Module
  # Check for an existing method in the current class before extending.  If
  # the method already exists, then a warning is printed and the extension is
  # not added.  Otherwise the block is yielded and any definitions in the
  # block will take effect.
  #
  # Usage:
  #
  #   class String
  #     rake_extension("xyz") do
  #       def xyz
  #         ...
  #       end
  #     end
  #   end
  #
  def rake_extension(method) # :nodoc:
    if method_defined?(method)
      $stderr.puts "WARNING: Possible conflict with Rake extension: " +
        "#{self}##{method} already exists"
    else
      yield
    end
  end
end
PK}$[������-gems/gems/rake-13.0.6/lib/rake/thread_pool.rbnu�[���# frozen_string_literal: true

require "rake/promise"

module Rake

  class ThreadPool # :nodoc: all

    # Creates a ThreadPool object.  The +thread_count+ parameter is the size
    # of the pool.
    def initialize(thread_count)
      require "set"
      @max_active_threads = [thread_count, 0].max
      @threads = Set.new
      @threads_mon = Monitor.new
      @queue = Queue.new
      @join_cond = @threads_mon.new_cond

      @history_start_time = nil
      @history = []
      @history_mon = Monitor.new
      @total_threads_in_play = 0
    end

    # Creates a future executed by the +ThreadPool+.
    #
    # The args are passed to the block when executing (similarly to
    # Thread#new) The return value is an object representing
    # a future which has been created and added to the queue in the
    # pool. Sending #value to the object will sleep the
    # current thread until the future is finished and will return the
    # result (or raise an exception thrown from the future)
    def future(*args, &block)
      promise = Promise.new(args, &block)
      promise.recorder = lambda { |*stats| stat(*stats) }

      @queue.enq promise
      stat :queued, item_id: promise.object_id
      start_thread
      promise
    end

    # Waits until the queue of futures is empty and all threads have exited.
    def join
      @threads_mon.synchronize do
        begin
          stat :joining
          @join_cond.wait unless @threads.empty?
          stat :joined
        rescue Exception => e
          stat :joined
          $stderr.puts e
          $stderr.print "Queue contains #{@queue.size} items. " +
            "Thread pool contains #{@threads.count} threads\n"
          $stderr.print "Current Thread #{Thread.current} status = " +
            "#{Thread.current.status}\n"
          $stderr.puts e.backtrace.join("\n")
          @threads.each do |t|
            $stderr.print "Thread #{t} status = #{t.status}\n"
            $stderr.puts t.backtrace.join("\n")
          end
          raise e
        end
      end
    end

    # Enable the gathering of history events.
    def gather_history          #:nodoc:
      @history_start_time = Time.now if @history_start_time.nil?
    end

    # Return a array of history events for the thread pool.
    #
    # History gathering must be enabled to be able to see the events
    # (see #gather_history). Best to call this when the job is
    # complete (i.e. after ThreadPool#join is called).
    def history                 # :nodoc:
      @history_mon.synchronize { @history.dup }.
        sort_by { |i| i[:time] }.
        each { |i| i[:time] -= @history_start_time }
    end

    # Return a hash of always collected statistics for the thread pool.
    def statistics              #  :nodoc:
      {
        total_threads_in_play: @total_threads_in_play,
        max_active_threads: @max_active_threads,
      }
    end

    private

    # processes one item on the queue. Returns true if there was an
    # item to process, false if there was no item
    def process_queue_item      #:nodoc:
      return false if @queue.empty?

      # Even though we just asked if the queue was empty, it
      # still could have had an item which by this statement
      # is now gone. For this reason we pass true to Queue#deq
      # because we will sleep indefinitely if it is empty.
      promise = @queue.deq(true)
      stat :dequeued, item_id: promise.object_id
      promise.work
      return true

    rescue ThreadError # this means the queue is empty
      false
    end

    def safe_thread_count
      @threads_mon.synchronize do
        @threads.count
      end
    end

    def start_thread # :nodoc:
      @threads_mon.synchronize do
        next unless @threads.count < @max_active_threads

        t = Thread.new do
          begin
            while safe_thread_count <= @max_active_threads
              break unless process_queue_item
            end
          ensure
            @threads_mon.synchronize do
              @threads.delete Thread.current
              stat :ended, thread_count: @threads.count
              @join_cond.broadcast if @threads.empty?
            end
          end
        end

        @threads << t
        stat(
          :spawned,
          new_thread: t.object_id,
          thread_count: @threads.count)
        @total_threads_in_play = @threads.count if
          @threads.count > @total_threads_in_play
      end
    end

    def stat(event, data=nil) # :nodoc:
      return if @history_start_time.nil?
      info = {
        event: event,
        data: data,
        time: Time.now,
        thread: Thread.current.object_id,
      }
      @history_mon.synchronize { @history << info }
    end

    # for testing only

    def __queue__ # :nodoc:
      @queue
    end
  end

end
PK}$[|��^��*gems/gems/rake-13.0.6/lib/rake/testtask.rbnu�[���# frozen_string_literal: true
require "rake"
require "rake/tasklib"

module Rake

  # Create a task that runs a set of tests.
  #
  # Example:
  #   require "rake/testtask"
  #
  #   Rake::TestTask.new do |t|
  #     t.libs << "test"
  #     t.test_files = FileList['test/test*.rb']
  #     t.verbose = true
  #   end
  #
  # If rake is invoked with a "TEST=filename" command line option,
  # then the list of test files will be overridden to include only the
  # filename specified on the command line.  This provides an easy way
  # to run just one test.
  #
  # If rake is invoked with a "TESTOPTS=options" command line option,
  # then the given options are passed to the test process after a
  # '--'.  This allows Test::Unit options to be passed to the test
  # suite.
  #
  # Examples:
  #
  #   rake test                           # run tests normally
  #   rake test TEST=just_one_file.rb     # run just one test file.
  #   rake test TESTOPTS="-v"             # run in verbose mode
  #   rake test TESTOPTS="--runner=fox"   # use the fox test runner
  #
  class TestTask < TaskLib

    # Name of test task. (default is :test)
    attr_accessor :name

    # List of directories added to $LOAD_PATH before running the
    # tests. (default is 'lib')
    attr_accessor :libs

    # True if verbose test output desired. (default is false)
    attr_accessor :verbose

    # Test options passed to the test suite.  An explicit
    # TESTOPTS=opts on the command line will override this. (default
    # is NONE)
    attr_accessor :options

    # Request that the tests be run with the warning flag set.
    # E.g. warning=true implies "ruby -w" used to run the tests.
    # (default is true)
    attr_accessor :warning

    # Glob pattern to match test files. (default is 'test/test*.rb')
    attr_accessor :pattern

    # Style of test loader to use.  Options are:
    #
    # * :rake -- Rake provided test loading script (default).
    # * :testrb -- Ruby provided test loading script.
    # * :direct -- Load tests using command line loader.
    #
    attr_accessor :loader

    # Array of command line options to pass to ruby when running test loader.
    attr_accessor :ruby_opts

    # Description of the test task. (default is 'Run tests')
    attr_accessor :description

    # Task prerequisites.
    attr_accessor :deps

    # Explicitly define the list of test files to be included in a
    # test.  +list+ is expected to be an array of file names (a
    # FileList is acceptable).  If both +pattern+ and +test_files+ are
    # used, then the list of test files is the union of the two.
    def test_files=(list)
      @test_files = list
    end

    # Create a testing task.
    def initialize(name=:test)
      @name = name
      @libs = ["lib"]
      @pattern = nil
      @options = nil
      @test_files = nil
      @verbose = false
      @warning = true
      @loader = :rake
      @ruby_opts = []
      @description = "Run tests" + (@name == :test ? "" : " for #{@name}")
      @deps = []
      if @name.is_a?(Hash)
        @deps = @name.values.first
        @name = @name.keys.first
      end
      yield self if block_given?
      @pattern = "test/test*.rb" if @pattern.nil? && @test_files.nil?
      define
    end

    # Create the tasks defined by this task lib.
    def define
      desc @description
      task @name => Array(deps) do
        FileUtilsExt.verbose(@verbose) do
          puts "Use TESTOPTS=\"--verbose\" to pass --verbose" \
            ", etc. to runners." if ARGV.include? "--verbose"
          args =
            "#{ruby_opts_string} #{run_code} " +
            "#{file_list_string} #{option_list}"
          ruby args do |ok, status|
            if !ok && status.respond_to?(:signaled?) && status.signaled?
              raise SignalException.new(status.termsig)
            elsif !ok
              status  = "Command failed with status (#{status.exitstatus})"
              details = ": [ruby #{args}]"
              message =
                if Rake.application.options.trace or @verbose
                  status + details
                else
                  status
                end

              fail message
            end
          end
        end
      end
      self
    end

    def option_list # :nodoc:
      (ENV["TESTOPTS"] ||
        ENV["TESTOPT"] ||
        ENV["TEST_OPTS"] ||
        ENV["TEST_OPT"] ||
        @options ||
        "")
    end

    def ruby_opts_string # :nodoc:
      opts = @ruby_opts.dup
      opts.unshift("-I\"#{lib_path}\"") unless @libs.empty?
      opts.unshift("-w") if @warning
      opts.join(" ")
    end

    def lib_path # :nodoc:
      @libs.join(File::PATH_SEPARATOR)
    end

    def file_list_string # :nodoc:
      file_list.map { |fn| "\"#{fn}\"" }.join(" ")
    end

    def file_list # :nodoc:
      if ENV["TEST"]
        FileList[ENV["TEST"]]
      else
        result = []
        result += @test_files.to_a if @test_files
        result += FileList[@pattern].to_a if @pattern
        result
      end
    end

    def ruby_version # :nodoc:
      RUBY_VERSION
    end

    def run_code # :nodoc:
      case @loader
      when :direct
        "-e \"ARGV.each{|f| require f}\""
      when :testrb
        "-S testrb"
      when :rake
        "#{__dir__}/rake_test_loader.rb"
      end
    end

  end
end
PK}$[�l�??.gems/gems/rake-13.0.6/lib/rake/trace_output.rbnu�[���# frozen_string_literal: true
module Rake
  module TraceOutput # :nodoc: all

    # Write trace output to output stream +out+.
    #
    # The write is done as a single IO call (to print) to lessen the
    # chance that the trace output is interrupted by other tasks also
    # producing output.
    def trace_on(out, *strings)
      sep = $\ || "\n"
      if strings.empty?
        output = sep
      else
        output = strings.map { |s|
          next if s.nil?
          s.end_with?(sep) ? s : s + sep
        }.join
      end
      out.print(output)
    end
  end
end
PK}$[�R��2�2&gems/gems/rake-13.0.6/lib/rake/task.rbnu�[���# frozen_string_literal: true
require "rake/invocation_exception_mixin"

module Rake

  ##
  # A Task is the basic unit of work in a Rakefile.  Tasks have associated
  # actions (possibly more than one) and a list of prerequisites.  When
  # invoked, a task will first ensure that all of its prerequisites have an
  # opportunity to run and then it will execute its own actions.
  #
  # Tasks are not usually created directly using the new method, but rather
  # use the +file+ and +task+ convenience methods.
  #
  class Task
    # List of prerequisites for a task.
    attr_reader :prerequisites
    alias prereqs prerequisites

    # List of order only prerequisites for a task.
    attr_reader :order_only_prerequisites

    # List of actions attached to a task.
    attr_reader :actions

    # Application owning this task.
    attr_accessor :application

    # Array of nested namespaces names used for task lookup by this task.
    attr_reader :scope

    # File/Line locations of each of the task definitions for this
    # task (only valid if the task was defined with the detect
    # location option set).
    attr_reader :locations

    # Has this task already been invoked?  Already invoked tasks
    # will be skipped unless you reenable them.
    attr_reader :already_invoked

    # Return task name
    def to_s
      name
    end

    def inspect # :nodoc:
      "<#{self.class} #{name} => [#{prerequisites.join(', ')}]>"
    end

    # List of sources for task.
    attr_writer :sources
    def sources
      if defined?(@sources)
        @sources
      else
        prerequisites
      end
    end

    # List of prerequisite tasks
    def prerequisite_tasks
      (prerequisites + order_only_prerequisites).map { |pre| lookup_prerequisite(pre) }
    end

    def lookup_prerequisite(prerequisite_name) # :nodoc:
      scoped_prerequisite_task = application[prerequisite_name, @scope]
      if scoped_prerequisite_task == self
        unscoped_prerequisite_task = application[prerequisite_name]
      end
      unscoped_prerequisite_task || scoped_prerequisite_task
    end
    private :lookup_prerequisite

    # List of all unique prerequisite tasks including prerequisite tasks'
    # prerequisites.
    # Includes self when cyclic dependencies are found.
    def all_prerequisite_tasks
      seen = {}
      collect_prerequisites(seen)
      seen.values
    end

    def collect_prerequisites(seen) # :nodoc:
      prerequisite_tasks.each do |pre|
        next if seen[pre.name]
        seen[pre.name] = pre
        pre.collect_prerequisites(seen)
      end
    end
    protected :collect_prerequisites

    # First source from a rule (nil if no sources)
    def source
      sources.first
    end

    # Create a task named +task_name+ with no actions or prerequisites. Use
    # +enhance+ to add actions and prerequisites.
    def initialize(task_name, app)
      @name            = task_name.to_s
      @prerequisites   = []
      @actions         = []
      @already_invoked = false
      @comments        = []
      @lock            = Monitor.new
      @application     = app
      @scope           = app.current_scope
      @arg_names       = nil
      @locations       = []
      @invocation_exception = nil
      @order_only_prerequisites = []
    end

    # Enhance a task with prerequisites or actions.  Returns self.
    def enhance(deps=nil, &block)
      @prerequisites |= deps if deps
      @actions << block if block_given?
      self
    end

    # Name of the task, including any namespace qualifiers.
    def name
      @name.to_s
    end

    # Name of task with argument list description.
    def name_with_args # :nodoc:
      if arg_description
        "#{name}#{arg_description}"
      else
        name
      end
    end

    # Argument description (nil if none).
    def arg_description # :nodoc:
      @arg_names ? "[#{arg_names.join(',')}]" : nil
    end

    # Name of arguments for this task.
    def arg_names
      @arg_names || []
    end

    # Reenable the task, allowing its tasks to be executed if the task
    # is invoked again.
    def reenable
      @already_invoked = false
      @invocation_exception = nil
    end

    # Clear the existing prerequisites, actions, comments, and arguments of a rake task.
    def clear
      clear_prerequisites
      clear_actions
      clear_comments
      clear_args
      self
    end

    # Clear the existing prerequisites of a rake task.
    def clear_prerequisites
      prerequisites.clear
      self
    end

    # Clear the existing actions on a rake task.
    def clear_actions
      actions.clear
      self
    end

    # Clear the existing comments on a rake task.
    def clear_comments
      @comments = []
      self
    end

    # Clear the existing arguments on a rake task.
    def clear_args
      @arg_names = nil
      self
    end

    # Invoke the task if it is needed.  Prerequisites are invoked first.
    def invoke(*args)
      task_args = TaskArguments.new(arg_names, args)
      invoke_with_call_chain(task_args, InvocationChain::EMPTY)
    end

    # Same as invoke, but explicitly pass a call chain to detect
    # circular dependencies.
    #
    # If multiple tasks depend on this
    # one in parallel, they will all fail if the first execution of
    # this task fails.
    def invoke_with_call_chain(task_args, invocation_chain)
      new_chain = Rake::InvocationChain.append(self, invocation_chain)
      @lock.synchronize do
        begin
          if application.options.trace
            application.trace "** Invoke #{name} #{format_trace_flags}"
          end

          if @already_invoked
            if @invocation_exception
              if application.options.trace
                application.trace "** Previous invocation of #{name} failed #{format_trace_flags}"
              end
              raise @invocation_exception
            else
              return
            end
          end

          @already_invoked = true

          invoke_prerequisites(task_args, new_chain)
          execute(task_args) if needed?
        rescue Exception => ex
          add_chain_to(ex, new_chain)
          @invocation_exception = ex
          raise ex
        end
      end
    end
    protected :invoke_with_call_chain

    def add_chain_to(exception, new_chain) # :nodoc:
      exception.extend(InvocationExceptionMixin) unless
        exception.respond_to?(:chain)
      exception.chain = new_chain if exception.chain.nil?
    end
    private :add_chain_to

    # Invoke all the prerequisites of a task.
    def invoke_prerequisites(task_args, invocation_chain) # :nodoc:
      if application.options.always_multitask
        invoke_prerequisites_concurrently(task_args, invocation_chain)
      else
        prerequisite_tasks.each { |p|
          prereq_args = task_args.new_scope(p.arg_names)
          p.invoke_with_call_chain(prereq_args, invocation_chain)
        }
      end
    end

    # Invoke all the prerequisites of a task in parallel.
    def invoke_prerequisites_concurrently(task_args, invocation_chain)# :nodoc:
      futures = prerequisite_tasks.map do |p|
        prereq_args = task_args.new_scope(p.arg_names)
        application.thread_pool.future(p) do |r|
          r.invoke_with_call_chain(prereq_args, invocation_chain)
        end
      end
      # Iterate in reverse to improve performance related to thread waiting and switching
      futures.reverse_each(&:value)
    end

    # Format the trace flags for display.
    def format_trace_flags
      flags = []
      flags << "first_time" unless @already_invoked
      flags << "not_needed" unless needed?
      flags.empty? ? "" : "(" + flags.join(", ") + ")"
    end
    private :format_trace_flags

    # Execute the actions associated with this task.
    def execute(args=nil)
      args ||= EMPTY_TASK_ARGS
      if application.options.dryrun
        application.trace "** Execute (dry run) #{name}"
        return
      end
      application.trace "** Execute #{name}" if application.options.trace
      application.enhance_with_matching_rule(name) if @actions.empty?
      if opts = Hash.try_convert(args) and !opts.empty?
        @actions.each { |act| act.call(self, args, **opts)}
      else
        @actions.each { |act| act.call(self, args)}
      end
    end

    # Is this task needed?
    def needed?
      true
    end

    # Timestamp for this task.  Basic tasks return the current time for their
    # time stamp.  Other tasks can be more sophisticated.
    def timestamp
      Time.now
    end

    # Add a description to the task.  The description can consist of an option
    # argument list (enclosed brackets) and an optional comment.
    def add_description(description)
      return unless description
      comment = description.strip
      add_comment(comment) if comment && !comment.empty?
    end

    def comment=(comment) # :nodoc:
      add_comment(comment)
    end

    def add_comment(comment) # :nodoc:
      return if comment.nil?
      @comments << comment unless @comments.include?(comment)
    end
    private :add_comment

    # Full collection of comments. Multiple comments are separated by
    # newlines.
    def full_comment
      transform_comments("\n")
    end

    # First line (or sentence) of all comments. Multiple comments are
    # separated by a "/".
    def comment
      transform_comments(" / ") { |c| first_sentence(c) }
    end

    # Transform the list of comments as specified by the block and
    # join with the separator.
    def transform_comments(separator, &block)
      if @comments.empty?
        nil
      else
        block ||= lambda { |c| c }
        @comments.map(&block).join(separator)
      end
    end
    private :transform_comments

    # Get the first sentence in a string. The sentence is terminated
    # by the first period, exclamation mark, or the end of the line.
    # Decimal points do not count as periods.
    def first_sentence(string)
      string.split(/(?<=\w)(\.|!)[ \t]|(\.$|!)|\n/).first
    end
    private :first_sentence

    # Set the names of the arguments for this task. +args+ should be
    # an array of symbols, one for each argument name.
    def set_arg_names(args)
      @arg_names = args.map(&:to_sym)
    end

    # Return a string describing the internal state of a task.  Useful for
    # debugging.
    def investigation
      result = "------------------------------\n".dup
      result << "Investigating #{name}\n"
      result << "class: #{self.class}\n"
      result <<  "task needed: #{needed?}\n"
      result <<  "timestamp: #{timestamp}\n"
      result << "pre-requisites: \n"
      prereqs = prerequisite_tasks
      prereqs.sort! { |a, b| a.timestamp <=> b.timestamp }
      prereqs.each do |p|
        result << "--#{p.name} (#{p.timestamp})\n"
      end
      latest_prereq = prerequisite_tasks.map(&:timestamp).max
      result <<  "latest-prerequisite time: #{latest_prereq}\n"
      result << "................................\n\n"
      return result
    end

    # Format dependencies parameter to pass to task.
    def self.format_deps(deps)
      deps = [deps] unless deps.respond_to?(:to_ary)
      deps.map { |d| Rake.from_pathname(d).to_s }
    end

    # Add order only dependencies.
    def |(deps)
      @order_only_prerequisites |= Task.format_deps(deps) - @prerequisites
      self
    end

    # ----------------------------------------------------------------
    # Rake Module Methods
    #
    class << self

      # Clear the task list.  This cause rake to immediately forget all the
      # tasks that have been assigned.  (Normally used in the unit tests.)
      def clear
        Rake.application.clear
      end

      # List of all defined tasks.
      def tasks
        Rake.application.tasks
      end

      # Return a task with the given name.  If the task is not currently
      # known, try to synthesize one from the defined rules.  If no rules are
      # found, but an existing file matches the task name, assume it is a file
      # task with no dependencies or actions.
      def [](task_name)
        Rake.application[task_name]
      end

      # TRUE if the task name is already defined.
      def task_defined?(task_name)
        Rake.application.lookup(task_name) != nil
      end

      # Define a task given +args+ and an option block.  If a rule with the
      # given name already exists, the prerequisites and actions are added to
      # the existing task.  Returns the defined task.
      def define_task(*args, &block)
        Rake.application.define_task(self, *args, &block)
      end

      # Define a rule for synthesizing tasks.
      def create_rule(*args, &block)
        Rake.application.create_rule(*args, &block)
      end

      # Apply the scope to the task name according to the rules for
      # this kind of task.  Generic tasks will accept the scope as
      # part of the name.
      def scope_name(scope, task_name)
        scope.path_with_task_name(task_name)
      end

    end # class << Rake::Task
  end # class Rake::Task
end
PK}$[~�y�	�	0gems/gems/rake-13.0.6/lib/rake/task_arguments.rbnu�[���# frozen_string_literal: true
module Rake

  ##
  # TaskArguments manage the arguments passed to a task.
  #
  class TaskArguments
    include Enumerable

    # Argument names
    attr_reader :names

    # Create a TaskArgument object with a list of argument +names+ and a set
    # of associated +values+.  +parent+ is the parent argument object.
    def initialize(names, values, parent=nil)
      @names = names
      @parent = parent
      @hash = {}
      @values = values
      names.each_with_index { |name, i|
        next if values[i].nil? || values[i] == ""
        @hash[name.to_sym] = values[i]
      }
    end

    # Retrieve the complete array of sequential values
    def to_a
      @values.dup
    end

    # Retrieve the list of values not associated with named arguments
    def extras
      @values[@names.length..-1] || []
    end

    # Create a new argument scope using the prerequisite argument
    # names.
    def new_scope(names)
      values = names.map { |n| self[n] }
      self.class.new(names, values + extras, self)
    end

    # Find an argument value by name or index.
    def [](index)
      lookup(index.to_sym)
    end

    # Specify a hash of default values for task arguments. Use the
    # defaults only if there is no specific value for the given
    # argument.
    def with_defaults(defaults)
      @hash = defaults.merge(@hash)
    end

    # Enumerates the arguments and their values
    def each(&block)
      @hash.each(&block)
    end

    # Extracts the argument values at +keys+
    def values_at(*keys)
      keys.map { |k| lookup(k) }
    end

    # Returns the value of the given argument via method_missing
    def method_missing(sym, *args)
      lookup(sym.to_sym)
    end

    # Returns a Hash of arguments and their values
    def to_hash
      @hash.dup
    end

    def to_s # :nodoc:
      inspect
    end

    def inspect # :nodoc:
      inspection = @hash.map do |k,v|
        "#{k.to_s}: #{v.to_s}"
      end.join(", ")

      "#<#{self.class} #{inspection}>"
    end

    # Returns true if +key+ is one of the arguments
    def has_key?(key)
      @hash.has_key?(key)
    end
    alias key? has_key?

    def fetch(*args, &block)
      @hash.fetch(*args, &block)
    end

    protected

    def lookup(name) # :nodoc:
      if @hash.has_key?(name)
        @hash[name]
      elsif @parent
        @parent.lookup(name)
      end
    end
  end

  EMPTY_TASK_ARGS = TaskArguments.new([], []) # :nodoc:
end
PK}$[��i		0gems/gems/rake-13.0.6/lib/rake/default_loader.rbnu�[���# frozen_string_literal: true
module Rake

  # Default Rakefile loader used by +import+.
  class DefaultLoader

    ##
    # Loads a rakefile into the current application from +fn+

    def load(fn)
      Rake.load_rakefile(File.expand_path(fn))
    end
  end

end
PK}$[QG�'gems/gems/rake-13.0.6/lib/rake/clean.rbnu�[���# frozen_string_literal: true
# The 'rake/clean' file defines two file lists (CLEAN and CLOBBER) and
# two rake tasks (:clean and :clobber).
#
# [:clean] Clean up the project by deleting scratch files and backup
#          files.  Add files to the CLEAN file list to have the :clean
#          target handle them.
#
# [:clobber] Clobber all generated and non-source files in a project.
#            The task depends on :clean, so all the clean files will
#            be deleted as well as files in the CLOBBER file list.
#            The intent of this task is to return a project to its
#            pristine, just unpacked state.

require "rake"

# :stopdoc:

module Rake
  module Cleaner
    extend FileUtils

    module_function

    def cleanup_files(file_names)
      file_names.each do |file_name|
        cleanup(file_name)
      end
    end

    def cleanup(file_name, **opts)
      begin
        opts = { verbose: Rake.application.options.trace }.merge(opts)
        rm_r file_name, **opts
      rescue StandardError => ex
        puts "Failed to remove #{file_name}: #{ex}" unless file_already_gone?(file_name)
      end
    end

    def file_already_gone?(file_name)
      return false if File.exist?(file_name)

      path = file_name
      prev = nil

      while path = File.dirname(path)
        return false if cant_be_deleted?(path)
        break if [prev, "."].include?(path)
        prev = path
      end
      true
    end
    private_class_method :file_already_gone?

    def cant_be_deleted?(path_name)
      File.exist?(path_name) &&
        (!File.readable?(path_name) || !File.executable?(path_name))
    end
    private_class_method :cant_be_deleted?
  end
end

CLEAN = ::Rake::FileList["**/*~", "**/*.bak", "**/core"]
CLEAN.clear_exclude.exclude { |fn|
  fn.pathmap("%f").downcase == "core" && File.directory?(fn)
}

desc "Remove any temporary products."
task :clean do
  Rake::Cleaner.cleanup_files(CLEAN)
end

CLOBBER = ::Rake::FileList.new

desc "Remove any generated files."
task clobber: [:clean] do
  Rake::Cleaner.cleanup_files(CLOBBER)
end
PK}$[�d���1�1+gems/gems/rake-13.0.6/lib/rake/file_list.rbnu�[���# frozen_string_literal: true
require "rake/cloneable"
require "rake/file_utils_ext"
require "rake/ext/string"

module Rake

  ##
  # A FileList is essentially an array with a few helper methods defined to
  # make file manipulation a bit easier.
  #
  # FileLists are lazy.  When given a list of glob patterns for possible files
  # to be included in the file list, instead of searching the file structures
  # to find the files, a FileList holds the pattern for latter use.
  #
  # This allows us to define a number of FileList to match any number of
  # files, but only search out the actual files when then FileList itself is
  # actually used.  The key is that the first time an element of the
  # FileList/Array is requested, the pending patterns are resolved into a real
  # list of file names.
  #
  class FileList

    include Cloneable

    # == Method Delegation
    #
    # The lazy evaluation magic of FileLists happens by implementing all the
    # array specific methods to call +resolve+ before delegating the heavy
    # lifting to an embedded array object (@items).
    #
    # In addition, there are two kinds of delegation calls.  The regular kind
    # delegates to the @items array and returns the result directly.  Well,
    # almost directly.  It checks if the returned value is the @items object
    # itself, and if so will return the FileList object instead.
    #
    # The second kind of delegation call is used in methods that normally
    # return a new Array object.  We want to capture the return value of these
    # methods and wrap them in a new FileList object.  We enumerate these
    # methods in the +SPECIAL_RETURN+ list below.

    # List of array methods (that are not in +Object+) that need to be
    # delegated.
    ARRAY_METHODS = (Array.instance_methods - Object.instance_methods).map(&:to_s)

    # List of additional methods that must be delegated.
    MUST_DEFINE = %w[inspect <=>]

    # List of methods that should not be delegated here (we define special
    # versions of them explicitly below).
    MUST_NOT_DEFINE = %w[to_a to_ary partition * <<]

    # List of delegated methods that return new array values which need
    # wrapping.
    SPECIAL_RETURN = %w[
      map collect sort sort_by select find_all reject grep
      compact flatten uniq values_at
      + - & |
    ]

    DELEGATING_METHODS = (ARRAY_METHODS + MUST_DEFINE - MUST_NOT_DEFINE).map(&:to_s).sort.uniq

    # Now do the delegation.
    DELEGATING_METHODS.each do |sym|
      if SPECIAL_RETURN.include?(sym)
        ln = __LINE__ + 1
        class_eval %{
          def #{sym}(*args, &block)
            resolve
            result = @items.send(:#{sym}, *args, &block)
            self.class.new.import(result)
          end
        }, __FILE__, ln
      else
        ln = __LINE__ + 1
        class_eval %{
          def #{sym}(*args, &block)
            resolve
            result = @items.send(:#{sym}, *args, &block)
            result.object_id == @items.object_id ? self : result
          end
        }, __FILE__, ln
      end
    end

    GLOB_PATTERN = %r{[*?\[\{]}

    # Create a file list from the globbable patterns given.  If you wish to
    # perform multiple includes or excludes at object build time, use the
    # "yield self" pattern.
    #
    # Example:
    #   file_list = FileList.new('lib/**/*.rb', 'test/test*.rb')
    #
    #   pkg_files = FileList.new('lib/**/*') do |fl|
    #     fl.exclude(/\bCVS\b/)
    #   end
    #
    def initialize(*patterns)
      @pending_add = []
      @pending = false
      @exclude_patterns = DEFAULT_IGNORE_PATTERNS.dup
      @exclude_procs = DEFAULT_IGNORE_PROCS.dup
      @items = []
      patterns.each { |pattern| include(pattern) }
      yield self if block_given?
    end

    # Add file names defined by glob patterns to the file list.  If an array
    # is given, add each element of the array.
    #
    # Example:
    #   file_list.include("*.java", "*.cfg")
    #   file_list.include %w( math.c lib.h *.o )
    #
    def include(*filenames)
      # TODO: check for pending
      filenames.each do |fn|
        if fn.respond_to? :to_ary
          include(*fn.to_ary)
        else
          @pending_add << Rake.from_pathname(fn)
        end
      end
      @pending = true
      self
    end
    alias :add :include

    # Register a list of file name patterns that should be excluded from the
    # list.  Patterns may be regular expressions, glob patterns or regular
    # strings.  In addition, a block given to exclude will remove entries that
    # return true when given to the block.
    #
    # Note that glob patterns are expanded against the file system. If a file
    # is explicitly added to a file list, but does not exist in the file
    # system, then an glob pattern in the exclude list will not exclude the
    # file.
    #
    # Examples:
    #   FileList['a.c', 'b.c'].exclude("a.c") => ['b.c']
    #   FileList['a.c', 'b.c'].exclude(/^a/)  => ['b.c']
    #
    # If "a.c" is a file, then ...
    #   FileList['a.c', 'b.c'].exclude("a.*") => ['b.c']
    #
    # If "a.c" is not a file, then ...
    #   FileList['a.c', 'b.c'].exclude("a.*") => ['a.c', 'b.c']
    #
    def exclude(*patterns, &block)
      patterns.each do |pat|
        if pat.respond_to? :to_ary
          exclude(*pat.to_ary)
        else
          @exclude_patterns << Rake.from_pathname(pat)
        end
      end
      @exclude_procs << block if block_given?
      resolve_exclude unless @pending
      self
    end

    # Clear all the exclude patterns so that we exclude nothing.
    def clear_exclude
      @exclude_patterns = []
      @exclude_procs = []
      self
    end

    # A FileList is equal through array equality.
    def ==(array)
      to_ary == array
    end

    # Return the internal array object.
    def to_a
      resolve
      @items
    end

    # Return the internal array object.
    def to_ary
      to_a
    end

    # Lie about our class.
    def is_a?(klass)
      klass == Array || super(klass)
    end
    alias kind_of? is_a?

    # Redefine * to return either a string or a new file list.
    def *(other)
      result = @items * other
      case result
      when Array
        self.class.new.import(result)
      else
        result
      end
    end

    def <<(obj)
      resolve
      @items << Rake.from_pathname(obj)
      self
    end

    # Resolve all the pending adds now.
    def resolve
      if @pending
        @pending = false
        @pending_add.each do |fn| resolve_add(fn) end
        @pending_add = []
        resolve_exclude
      end
      self
    end

    def resolve_add(fn) # :nodoc:
      case fn
      when GLOB_PATTERN
        add_matching(fn)
      else
        self << fn
      end
    end
    private :resolve_add

    def resolve_exclude # :nodoc:
      reject! { |fn| excluded_from_list?(fn) }
      self
    end
    private :resolve_exclude

    # Return a new FileList with the results of running +sub+ against each
    # element of the original list.
    #
    # Example:
    #   FileList['a.c', 'b.c'].sub(/\.c$/, '.o')  => ['a.o', 'b.o']
    #
    def sub(pat, rep)
      inject(self.class.new) { |res, fn| res << fn.sub(pat, rep) }
    end

    # Return a new FileList with the results of running +gsub+ against each
    # element of the original list.
    #
    # Example:
    #   FileList['lib/test/file', 'x/y'].gsub(/\//, "\\")
    #      => ['lib\\test\\file', 'x\\y']
    #
    def gsub(pat, rep)
      inject(self.class.new) { |res, fn| res << fn.gsub(pat, rep) }
    end

    # Same as +sub+ except that the original file list is modified.
    def sub!(pat, rep)
      each_with_index { |fn, i| self[i] = fn.sub(pat, rep) }
      self
    end

    # Same as +gsub+ except that the original file list is modified.
    def gsub!(pat, rep)
      each_with_index { |fn, i| self[i] = fn.gsub(pat, rep) }
      self
    end

    # Apply the pathmap spec to each of the included file names, returning a
    # new file list with the modified paths.  (See String#pathmap for
    # details.)
    def pathmap(spec=nil, &block)
      collect { |fn| fn.pathmap(spec, &block) }
    end

    # Return a new FileList with <tt>String#ext</tt> method applied to
    # each member of the array.
    #
    # This method is a shortcut for:
    #
    #    array.collect { |item| item.ext(newext) }
    #
    # +ext+ is a user added method for the Array class.
    def ext(newext="")
      collect { |fn| fn.ext(newext) }
    end

    # Grep each of the files in the filelist using the given pattern. If a
    # block is given, call the block on each matching line, passing the file
    # name, line number, and the matching line of text.  If no block is given,
    # a standard emacs style file:linenumber:line message will be printed to
    # standard out.  Returns the number of matched items.
    def egrep(pattern, *options)
      matched = 0
      each do |fn|
        begin
          File.open(fn, "r", *options) do |inf|
            count = 0
            inf.each do |line|
              count += 1
              if pattern.match(line)
                matched += 1
                if block_given?
                  yield fn, count, line
                else
                  puts "#{fn}:#{count}:#{line}"
                end
              end
            end
          end
        rescue StandardError => ex
          $stderr.puts "Error while processing '#{fn}': #{ex}"
        end
      end
      matched
    end

    # Return a new file list that only contains file names from the current
    # file list that exist on the file system.
    def existing
      select { |fn| File.exist?(fn) }.uniq
    end

    # Modify the current file list so that it contains only file name that
    # exist on the file system.
    def existing!
      resolve
      @items = @items.select { |fn| File.exist?(fn) }.uniq
      self
    end

    # FileList version of partition.  Needed because the nested arrays should
    # be FileLists in this version.
    def partition(&block)       # :nodoc:
      resolve
      result = @items.partition(&block)
      [
        self.class.new.import(result[0]),
        self.class.new.import(result[1]),
      ]
    end

    # Convert a FileList to a string by joining all elements with a space.
    def to_s
      resolve
      self.join(" ")
    end

    # Add matching glob patterns.
    def add_matching(pattern)
      self.class.glob(pattern).each do |fn|
        self << fn unless excluded_from_list?(fn)
      end
    end
    private :add_matching

    # Should the given file name be excluded from the list?
    #
    # NOTE: This method was formerly named "exclude?", but Rails
    # introduced an exclude? method as an array method and setup a
    # conflict with file list. We renamed the method to avoid
    # confusion. If you were using "FileList#exclude?" in your user
    # code, you will need to update.
    def excluded_from_list?(fn)
      return true if @exclude_patterns.any? do |pat|
        case pat
        when Regexp
          fn =~ pat
        when GLOB_PATTERN
          flags = File::FNM_PATHNAME
          # Ruby <= 1.9.3 does not support File::FNM_EXTGLOB
          flags |= File::FNM_EXTGLOB if defined? File::FNM_EXTGLOB
          File.fnmatch?(pat, fn, flags)
        else
          fn == pat
        end
      end
      @exclude_procs.any? { |p| p.call(fn) }
    end

    DEFAULT_IGNORE_PATTERNS = [
      /(^|[\/\\])CVS([\/\\]|$)/,
      /(^|[\/\\])\.svn([\/\\]|$)/,
      /\.bak$/,
      /~$/
    ]
    DEFAULT_IGNORE_PROCS = [
      proc { |fn| fn =~ /(^|[\/\\])core$/ && !File.directory?(fn) }
    ]

    def import(array) # :nodoc:
      @items = array
      self
    end

    class << self
      # Create a new file list including the files listed. Similar to:
      #
      #   FileList.new(*args)
      def [](*args)
        new(*args)
      end

      # Get a sorted list of files matching the pattern. This method
      # should be preferred to Dir[pattern] and Dir.glob(pattern) because
      # the files returned are guaranteed to be sorted.
      def glob(pattern, *args)
        Dir.glob(pattern, *args).sort
      end
    end
  end
end

module Rake
  class << self

    # Yield each file or directory component.
    def each_dir_parent(dir)    # :nodoc:
      old_length = nil
      while dir != "." && dir.length != old_length
        yield(dir)
        old_length = dir.length
        dir = File.dirname(dir)
      end
    end

    # Convert Pathname and Pathname-like objects to strings;
    # leave everything else alone
    def from_pathname(path)    # :nodoc:
      path = path.to_path if path.respond_to?(:to_path)
      path = path.to_str if path.respond_to?(:to_str)
      path
    end
  end
end # module Rake
PK}$[��M	M	-gems/gems/rake-13.0.6/lib/rake/cpu_counter.rbnu�[���# frozen_string_literal: true
module Rake

  # Based on a script at:
  #   http://stackoverflow.com/questions/891537/ruby-detect-number-of-cpus-installed
  class CpuCounter # :nodoc: all
    def self.count
      new.count_with_default
    end

    def count_with_default(default=4)
      count || default
    rescue StandardError
      default
    end

    begin
      require "etc"
    rescue LoadError
    else
      if Etc.respond_to?(:nprocessors)
        def count
          return Etc.nprocessors
        end
      end
    end
  end
end

unless Rake::CpuCounter.method_defined?(:count)
  Rake::CpuCounter.class_eval <<-'end;', __FILE__, __LINE__+1
    require 'rbconfig'

    def count
      if RUBY_PLATFORM == 'java'
        count_via_java_runtime
      else
        case RbConfig::CONFIG['host_os']
        when /linux/
          count_via_cpuinfo
        when /darwin|bsd/
          count_via_sysctl
        when /mswin|mingw/
          count_via_win32
        else
          # Try everything
          count_via_win32 ||
          count_via_sysctl ||
          count_via_cpuinfo
        end
      end
    end

    def count_via_java_runtime
      Java::Java.lang.Runtime.getRuntime.availableProcessors
    rescue StandardError
      nil
    end

    def count_via_win32
      require 'win32ole'
      wmi = WIN32OLE.connect("winmgmts://")
      cpu = wmi.ExecQuery("select NumberOfCores from Win32_Processor") # TODO count hyper-threaded in this
      cpu.to_enum.first.NumberOfCores
    rescue StandardError, LoadError
      nil
    end

    def count_via_cpuinfo
      open('/proc/cpuinfo') { |f| f.readlines }.grep(/processor/).size
    rescue StandardError
      nil
    end

    def count_via_sysctl
      run 'sysctl', '-n', 'hw.ncpu'
    end

    def run(command, *args)
      cmd = resolve_command(command)
      if cmd
        IO.popen [cmd, *args] do |io|
          io.read.to_i
        end
      else
        nil
      end
    end

    def resolve_command(command)
      look_for_command("/usr/sbin", command) ||
        look_for_command("/sbin", command) ||
        in_path_command(command)
    end

    def look_for_command(dir, command)
      path = File.join(dir, command)
      File.exist?(path) ? path : nil
    end

    def in_path_command(command)
      IO.popen ['which', command] do |io|
        io.eof? ? nil : command
      end
    end
  end;
end
PK}$[<9��2gems/gems/rake-13.0.6/lib/rake/rake_test_loader.rbnu�[���# frozen_string_literal: true

require "rake/file_list"

# Load the test files from the command line.
argv = ARGV.select do |argument|
  case argument
  when /^-/ then
    argument
  when /\*/ then
    Rake::FileList[argument].to_a.each do |file|
      require File.expand_path file
    end

    false
  else
    path = File.expand_path argument

    abort "\nFile does not exist: #{path}\n\n" unless File.exist?(path)

    require path

    false
  end
end

ARGV.replace argv
PK}$[��s�ZZ0gems/gems/rake-13.0.6/lib/rake/file_utils_ext.rbnu�[���# frozen_string_literal: true
require "rake/file_utils"

module Rake
  #
  # FileUtilsExt provides a custom version of the FileUtils methods
  # that respond to the <tt>verbose</tt> and <tt>nowrite</tt>
  # commands.
  #
  module FileUtilsExt
    include FileUtils

    class << self
      attr_accessor :verbose_flag, :nowrite_flag
    end

    DEFAULT = Object.new

    FileUtilsExt.verbose_flag = DEFAULT
    FileUtilsExt.nowrite_flag = false

    FileUtils.commands.each do |name|
      opts = FileUtils.options_of name
      default_options = []
      if opts.include?("verbose")
        default_options << "verbose: FileUtilsExt.verbose_flag"
      end
      if opts.include?("noop")
        default_options << "noop: FileUtilsExt.nowrite_flag"
      end

      next if default_options.empty?
      module_eval(<<-EOS, __FILE__, __LINE__ + 1)
      def #{name}(*args, **options, &block)
        super(*args,
            #{default_options.join(', ')},
            **options, &block)
      end
      EOS
    end

    # Get/set the verbose flag controlling output from the FileUtils
    # utilities.  If verbose is true, then the utility method is
    # echoed to standard output.
    #
    # Examples:
    #    verbose              # return the current value of the
    #                         # verbose flag
    #    verbose(v)           # set the verbose flag to _v_.
    #    verbose(v) { code }  # Execute code with the verbose flag set
    #                         # temporarily to _v_.  Return to the
    #                         # original value when code is done.
    def verbose(value=nil)
      oldvalue = FileUtilsExt.verbose_flag
      FileUtilsExt.verbose_flag = value unless value.nil?
      if block_given?
        begin
          yield
        ensure
          FileUtilsExt.verbose_flag = oldvalue
        end
      end
      FileUtilsExt.verbose_flag
    end

    # Get/set the nowrite flag controlling output from the FileUtils
    # utilities.  If verbose is true, then the utility method is
    # echoed to standard output.
    #
    # Examples:
    #    nowrite              # return the current value of the
    #                         # nowrite flag
    #    nowrite(v)           # set the nowrite flag to _v_.
    #    nowrite(v) { code }  # Execute code with the nowrite flag set
    #                         # temporarily to _v_. Return to the
    #                         # original value when code is done.
    def nowrite(value=nil)
      oldvalue = FileUtilsExt.nowrite_flag
      FileUtilsExt.nowrite_flag = value unless value.nil?
      if block_given?
        begin
          yield
        ensure
          FileUtilsExt.nowrite_flag = oldvalue
        end
      end
      oldvalue
    end

    # Use this function to prevent potentially destructive ruby code
    # from running when the :nowrite flag is set.
    #
    # Example:
    #
    #   when_writing("Building Project") do
    #     project.build
    #   end
    #
    # The following code will build the project under normal
    # conditions. If the nowrite(true) flag is set, then the example
    # will print:
    #
    #      DRYRUN: Building Project
    #
    # instead of actually building the project.
    #
    def when_writing(msg=nil)
      if FileUtilsExt.nowrite_flag
        $stderr.puts "DRYRUN: #{msg}" if msg
      else
        yield
      end
    end

    # Send the message to the default rake output (which is $stderr).
    def rake_output_message(message)
      $stderr.puts(message)
    end

    # Check that the options do not contain options not listed in
    # +optdecl+.  An ArgumentError exception is thrown if non-declared
    # options are found.
    def rake_check_options(options, *optdecl)
      h = options.dup
      optdecl.each do |name|
        h.delete name
      end
      raise ArgumentError, "no such option: #{h.keys.join(' ')}" unless
        h.empty?
    end

    extend self
  end
end
PK}$[n�#��5gems/gems/rake-13.0.6/lib/rake/task_argument_error.rbnu�[���# frozen_string_literal: true
module Rake

  # Error indicating an ill-formed task declaration.
  class TaskArgumentError < ArgumentError
  end

end
PK}$[�I����+gems/gems/rake-13.0.6/lib/rake/file_task.rbnu�[���# frozen_string_literal: true
require "rake/task"
require "rake/early_time"

module Rake

  # A FileTask is a task that includes time based dependencies.  If any of a
  # FileTask's prerequisites have a timestamp that is later than the file
  # represented by this task, then the file must be rebuilt (using the
  # supplied actions).
  #
  class FileTask < Task

    # Is this file task needed?  Yes if it doesn't exist, or if its time stamp
    # is out of date.
    def needed?
      !File.exist?(name) || out_of_date?(timestamp) || @application.options.build_all
    end

    # Time stamp for file task.
    def timestamp
      if File.exist?(name)
        File.mtime(name.to_s)
      else
        Rake::LATE
      end
    end

    private

    # Are there any prerequisites with a later time than the given time stamp?
    def out_of_date?(stamp)
      all_prerequisite_tasks.any? { |prereq|
        prereq_task = application[prereq, @scope]
        if prereq_task.instance_of?(Rake::FileTask)
          prereq_task.timestamp > stamp || @application.options.build_all
        else
          prereq_task.timestamp > stamp
        end
      }
    end

    # ----------------------------------------------------------------
    # Task class methods.
    #
    class << self
      # Apply the scope to the task name according to the rules for this kind
      # of task.  File based tasks ignore the scope when creating the name.
      def scope_name(scope, task_name)
        Rake.from_pathname(task_name)
      end
    end
  end
end
PK	}$[Jሀ�+gems/gems/rake-13.0.6/lib/rake/backtrace.rbnu�[���# frozen_string_literal: true
module Rake
  module Backtrace # :nodoc: all
    SYS_KEYS  = RbConfig::CONFIG.keys.grep(/(?:[a-z]prefix|libdir)\z/)
    SYS_PATHS = RbConfig::CONFIG.values_at(*SYS_KEYS).uniq +
      [ File.join(File.dirname(__FILE__), "..") ]

    SUPPRESSED_PATHS = SYS_PATHS.
      map { |s| s.tr("\\", "/") }.
      map { |f| File.expand_path(f) }.
      reject { |s| s.nil? || s =~ /^ *$/ }
    SUPPRESSED_PATHS_RE = SUPPRESSED_PATHS.map { |f| Regexp.quote(f) }.join("|")
    SUPPRESSED_PATHS_RE << "|^org\\/jruby\\/\\w+\\.java" if
      Object.const_defined?(:RUBY_ENGINE) and RUBY_ENGINE == "jruby"

    SUPPRESS_PATTERN = %r!(\A(#{SUPPRESSED_PATHS_RE})|bin/rake:\d+)!i

    def self.collapse(backtrace)
      pattern = Rake.application.options.suppress_backtrace_pattern ||
                SUPPRESS_PATTERN
      backtrace.reject { |elem| elem =~ pattern }
    end
  end
end
PK	}$[���''+gems/gems/rake-13.0.6/lib/rake/late_time.rbnu�[���# frozen_string_literal: true
module Rake
  # LateTime is a fake timestamp that occurs _after_ any other time value.
  class LateTime
    include Comparable
    include Singleton

    def <=>(other)
      1
    end

    def to_s
      "<LATE TIME>"
    end
  end

  LATE = LateTime.instance
end
PK	}$[�2��bb2gems/gems/rake-13.0.6/lib/rake/loaders/makefile.rbnu�[���# frozen_string_literal: true
module Rake

  # Makefile loader to be used with the import file loader.  Use this to
  # import dependencies from make dependency tools:
  #
  #   require 'rake/loaders/makefile'
  #
  #   file ".depends.mf" => [SRC_LIST] do |t|
  #     sh "makedepend -f- -- #{CFLAGS} -- #{t.prerequisites} > #{t.name}"
  #   end
  #
  #   import ".depends.mf"
  #
  # See {Importing Dependencies}[link:doc/rakefile_rdoc.html#label-Importing+Dependencies]
  # for further details.

  class MakefileLoader
    include Rake::DSL

    SPACE_MARK = "\0" # :nodoc:

    # Load the makefile dependencies in +fn+.
    def load(fn) # :nodoc:
      lines = File.read fn
      lines.gsub!(/\\ /, SPACE_MARK)
      lines.gsub!(/#[^\n]*\n/m, "")
      lines.gsub!(/\\\n/, " ")
      lines.each_line do |line|
        process_line(line)
      end
    end

    private

    # Process one logical line of makefile data.
    def process_line(line) # :nodoc:
      file_tasks, args = line.split(":", 2)
      return if args.nil?
      dependents = args.split.map { |d| respace(d) }
      file_tasks.scan(/\S+/) do |file_task|
        file_task = respace(file_task)
        file file_task => dependents
      end
    end

    def respace(str) # :nodoc:
      str.tr SPACE_MARK, " "
    end
  end

  # Install the handler
  Rake.application.add_loader("mf", MakefileLoader.new)
end
PK	}$[�����+gems/gems/rake-13.0.6/lib/rake/cloneable.rbnu�[���# frozen_string_literal: true
module Rake
  ##
  # Mixin for creating easily cloned objects.

  module Cloneable # :nodoc:
    # The hook that is invoked by 'clone' and 'dup' methods.
    def initialize_copy(source)
      super
      source.instance_variables.each do |var|
        src_value  = source.instance_variable_get(var)
        value = src_value.clone rescue src_value
        instance_variable_set(var, value)
      end
    end
  end
end
PK	}$[?�{Hrr,gems/gems/rake-13.0.6/lib/rake/early_time.rbnu�[���# frozen_string_literal: true
module Rake

  # EarlyTime is a fake timestamp that occurs _before_ any other time value.
  class EarlyTime
    include Comparable
    include Singleton

    ##
    # The EarlyTime always comes before +other+!

    def <=>(other)
      -1
    end

    def to_s # :nodoc:
      "<EARLY TIME>"
    end
  end

  EARLY = EarlyTime.instance
end
PK	}$[�.*C}}'gems/gems/rake-13.0.6/lib/rake/phony.rbnu�[���# frozen_string_literal: true
# Defines a :phony task that you can use as a dependency. This allows
# file-based tasks to use non-file-based tasks as prerequisites
# without forcing them to rebuild.
#
# See FileTask#out_of_date? and Task#timestamp for more info.

require "rake"

task :phony

Rake::Task[:phony].tap do |task|
  def task.timestamp # :nodoc:
    Time.at 0
  end
end
PK	}$[�j��'gems/gems/rake-13.0.6/lib/rake/win32.rbnu�[���# frozen_string_literal: true
require "rbconfig"

module Rake
  # Win 32 interface methods for Rake. Windows specific functionality
  # will be placed here to collect that knowledge in one spot.
  module Win32 # :nodoc: all

    # Error indicating a problem in locating the home directory on a
    # Win32 system.
    class Win32HomeError < RuntimeError
    end

    class << self
      # True if running on a windows system.
      def windows?
        RbConfig::CONFIG["host_os"] =~ %r!(msdos|mswin|djgpp|mingw|[Ww]indows)!
      end

      # The standard directory containing system wide rake files on
      # Win 32 systems. Try the following environment variables (in
      # order):
      #
      # * HOME
      # * HOMEDRIVE + HOMEPATH
      # * APPDATA
      # * USERPROFILE
      #
      # If the above are not defined, the return nil.
      def win32_system_dir #:nodoc:
        win32_shared_path = ENV["HOME"]
        if win32_shared_path.nil? && ENV["HOMEDRIVE"] && ENV["HOMEPATH"]
          win32_shared_path = ENV["HOMEDRIVE"] + ENV["HOMEPATH"]
        end

        win32_shared_path ||= ENV["APPDATA"]
        win32_shared_path ||= ENV["USERPROFILE"]
        raise Win32HomeError,
          "Unable to determine home path environment variable." if
            win32_shared_path.nil? or win32_shared_path.empty?
        normalize(File.join(win32_shared_path, "Rake"))
      end

      # Normalize a win32 path so that the slashes are all forward slashes.
      def normalize(path)
        path.gsub(/\\/, "/")
      end

    end
  end
end
PK	}$[�R��-gems/gems/rake-13.0.6/lib/rake/linked_list.rbnu�[���# frozen_string_literal: true
module Rake

  # Polylithic linked list structure used to implement several data
  # structures in Rake.
  class LinkedList
    include Enumerable
    attr_reader :head, :tail

    # Polymorphically add a new element to the head of a list. The
    # type of head node will be the same list type as the tail.
    def conj(item)
      self.class.cons(item, self)
    end

    # Is the list empty?
    # .make guards against a list being empty making any instantiated LinkedList
    # object not empty by default
    # You should consider overriding this method if you implement your own .make method
    def empty?
      false
    end

    # Lists are structurally equivalent.
    def ==(other)
      current = self
      while !current.empty? && !other.empty?
        return false if current.head != other.head
        current = current.tail
        other = other.tail
      end
      current.empty? && other.empty?
    end

    # Convert to string: LL(item, item...)
    def to_s
      items = map(&:to_s).join(", ")
      "LL(#{items})"
    end

    # Same as +to_s+, but with inspected items.
    def inspect
      items = map(&:inspect).join(", ")
      "LL(#{items})"
    end

    # For each item in the list.
    def each
      current = self
      while !current.empty?
        yield(current.head)
        current = current.tail
      end
      self
    end

    # Make a list out of the given arguments. This method is
    # polymorphic
    def self.make(*args)
      # return an EmptyLinkedList if there are no arguments
      return empty if !args || args.empty?

      # build a LinkedList by starting at the tail and iterating
      # through each argument
      # inject takes an EmptyLinkedList to start
      args.reverse.inject(empty) do |list, item|
        list = cons(item, list)
        list # return the newly created list for each item in the block
      end
    end

    # Cons a new head onto the tail list.
    def self.cons(head, tail)
      new(head, tail)
    end

    # The standard empty list class for the given LinkedList class.
    def self.empty
      self::EMPTY
    end

    protected

    def initialize(head, tail=EMPTY)
      @head = head
      @tail = tail
    end

    # Represent an empty list, using the Null Object Pattern.
    #
    # When inheriting from the LinkedList class, you should implement
    # a type specific Empty class as well. Make sure you set the class
    # instance variable @parent to the associated list class (this
    # allows conj, cons and make to work polymorphically).
    class EmptyLinkedList < LinkedList
      @parent = LinkedList

      def initialize
      end

      def empty?
        true
      end

      def self.cons(head, tail)
        @parent.cons(head, tail)
      end
    end

    EMPTY = EmptyLinkedList.new
  end
end
PK	}$[��m��8gems/gems/rake-13.0.6/lib/rake/thread_history_display.rbnu�[���# frozen_string_literal: true
require "rake/private_reader"

module Rake

  class ThreadHistoryDisplay    # :nodoc: all
    include Rake::PrivateReader

    private_reader :stats, :items, :threads

    def initialize(stats)
      @stats   = stats
      @items   = { _seq_: 1  }
      @threads = { _seq_: "A" }
    end

    def show
      puts "Job History:"
      stats.each do |stat|
        stat[:data] ||= {}
        rename(stat, :thread, threads)
        rename(stat[:data], :item_id, items)
        rename(stat[:data], :new_thread, threads)
        rename(stat[:data], :deleted_thread, threads)
        printf("%8d %2s %-20s %s\n",
          (stat[:time] * 1_000_000).round,
          stat[:thread],
          stat[:event],
          stat[:data].map do |k, v| "#{k}:#{v}" end.join(" "))
      end
    end

    private

    def rename(hash, key, renames)
      if hash && hash[key]
        original = hash[key]
        value = renames[original]
        unless value
          value = renames[:_seq_]
          renames[:_seq_] = renames[:_seq_].succ
          renames[original] = value
        end
        hash[key] = value
      end
    end
  end

end
PK	}$[Ӭ�s~~?gems/gems/rake-13.0.6/lib/rake/rule_recursion_overflow_error.rbnu�[���# frozen_string_literal: true
module Rake

  # Error indicating a recursion overflow error in task selection.
  class RuleRecursionOverflowError < StandardError
    def initialize(*args)
      super
      @targets = []
    end

    def add_target(target)
      @targets << target
    end

    def message
      super + ": [" + @targets.reverse.join(" => ") + "]"
    end
  end

end
PK	}$[�����'gems/gems/rake-13.0.6/lib/rake/scope.rbnu�[���# frozen_string_literal: true
module Rake
  class Scope < LinkedList # :nodoc: all

    # Path for the scope.
    def path
      map(&:to_s).reverse.join(":")
    end

    # Path for the scope + the named path.
    def path_with_task_name(task_name)
      "#{path}:#{task_name}"
    end

    # Trim +n+ innermost scope levels from the scope. In no case will
    # this trim beyond the toplevel scope.
    def trim(n)
      result = self
      while n > 0 && !result.empty?
        result = result.tail
        n -= 1
      end
      result
    end

    # Scope lists always end with an EmptyScope object. See Null
    # Object Pattern)
    class EmptyScope < EmptyLinkedList
      @parent = Scope

      def path
        ""
      end

      def path_with_task_name(task_name)
        task_name
      end
    end

    # Singleton null object for an empty scope.
    EMPTY = EmptyScope.new
  end
end
PK	}$[�((.gems/gems/rake-13.0.6/lib/rake/task_manager.rbnu�[���# frozen_string_literal: true
module Rake

  # The TaskManager module is a mixin for managing tasks.
  module TaskManager
    # Track the last comment made in the Rakefile.
    attr_accessor :last_description

    def initialize # :nodoc:
      super
      @tasks = Hash.new
      @rules = Array.new
      @scope = Scope.make
      @last_description = nil
    end

    def create_rule(*args, &block) # :nodoc:
      pattern, args, deps, order_only = resolve_args(args)
      pattern = Regexp.new(Regexp.quote(pattern) + "$") if String === pattern
      @rules << [pattern, args, deps, order_only, block]
    end

    def define_task(task_class, *args, &block) # :nodoc:
      task_name, arg_names, deps, order_only = resolve_args(args)

      original_scope = @scope
      if String === task_name and
         not task_class.ancestors.include? Rake::FileTask
        task_name, *definition_scope = *(task_name.split(":").reverse)
        @scope = Scope.make(*(definition_scope + @scope.to_a))
      end

      task_name = task_class.scope_name(@scope, task_name)
      task = intern(task_class, task_name)
      task.set_arg_names(arg_names) unless arg_names.empty?
      if Rake::TaskManager.record_task_metadata
        add_location(task)
        task.add_description(get_description(task))
      end
      task.enhance(Task.format_deps(deps), &block)
      task | order_only unless order_only.nil?
      task
    ensure
      @scope = original_scope
    end

    # Lookup a task.  Return an existing task if found, otherwise
    # create a task of the current type.
    def intern(task_class, task_name)
      @tasks[task_name.to_s] ||= task_class.new(task_name, self)
    end

    # Find a matching task for +task_name+.
    def [](task_name, scopes=nil)
      task_name = task_name.to_s
      self.lookup(task_name, scopes) or
        enhance_with_matching_rule(task_name) or
        synthesize_file_task(task_name) or
        fail generate_message_for_undefined_task(task_name)
    end

    def generate_message_for_undefined_task(task_name)
      message = "Don't know how to build task '#{task_name}' "\
                "(See the list of available tasks with `#{Rake.application.name} --tasks`)"
      message + generate_did_you_mean_suggestions(task_name)
    end

    def generate_did_you_mean_suggestions(task_name)
      return "" unless defined?(::DidYouMean::SpellChecker)

      suggestions = ::DidYouMean::SpellChecker.new(dictionary: @tasks.keys).correct(task_name.to_s)
      if ::DidYouMean.respond_to?(:formatter)# did_you_mean v1.2.0 or later
        ::DidYouMean.formatter.message_for(suggestions)
      elsif defined?(::DidYouMean::Formatter) # before did_you_mean v1.2.0
        ::DidYouMean::Formatter.new(suggestions).to_s
      else
        ""
      end
    end

    def synthesize_file_task(task_name) # :nodoc:
      return nil unless File.exist?(task_name)
      define_task(Rake::FileTask, task_name)
    end

    # Resolve the arguments for a task/rule.  Returns a tuple of
    # [task_name, arg_name_list, prerequisites, order_only_prerequisites].
    def resolve_args(args)
      if args.last.is_a?(Hash)
        deps = args.pop
        resolve_args_with_dependencies(args, deps)
      else
        resolve_args_without_dependencies(args)
      end
    end

    # Resolve task arguments for a task or rule when there are no
    # dependencies declared.
    #
    # The patterns recognized by this argument resolving function are:
    #
    #   task :t
    #   task :t, [:a]
    #
    def resolve_args_without_dependencies(args)
      task_name = args.shift
      if args.size == 1 && args.first.respond_to?(:to_ary)
        arg_names = args.first.to_ary
      else
        arg_names = args
      end
      [task_name, arg_names, [], nil]
    end
    private :resolve_args_without_dependencies

    # Resolve task arguments for a task or rule when there are
    # dependencies declared.
    #
    # The patterns recognized by this argument resolving function are:
    #
    #   task :t, order_only: [:e]
    #   task :t => [:d]
    #   task :t => [:d], order_only: [:e]
    #   task :t, [a] => [:d]
    #   task :t, [a] => [:d], order_only: [:e]
    #
    def resolve_args_with_dependencies(args, hash) # :nodoc:
      fail "Task Argument Error" if
        hash.size != 1 &&
        (hash.size != 2 || !hash.key?(:order_only))
      order_only = hash.delete(:order_only)
      key, value = hash.map { |k, v| [k, v] }.first
      if args.empty?
        task_name = key
        arg_names = []
        deps = value || []
      else
        task_name = args.shift
        arg_names = key || args.shift|| []
        deps = value || []
      end
      deps = [deps] unless deps.respond_to?(:to_ary)
      [task_name, arg_names, deps, order_only]
    end
    private :resolve_args_with_dependencies

    # If a rule can be found that matches the task name, enhance the
    # task with the prerequisites and actions from the rule.  Set the
    # source attribute of the task appropriately for the rule.  Return
    # the enhanced task or nil of no rule was found.
    def enhance_with_matching_rule(task_name, level=0)
      fail Rake::RuleRecursionOverflowError,
        "Rule Recursion Too Deep" if level >= 16
      @rules.each do |pattern, args, extensions, order_only, block|
        if pattern && pattern.match(task_name)
          task = attempt_rule(task_name, pattern, args, extensions, block, level)
          task | order_only unless order_only.nil?
          return task if task
        end
      end
      nil
    rescue Rake::RuleRecursionOverflowError => ex
      ex.add_target(task_name)
      fail ex
    end

    # List of all defined tasks in this application.
    def tasks
      @tasks.values.sort_by { |t| t.name }
    end

    # List of all the tasks defined in the given scope (and its
    # sub-scopes).
    def tasks_in_scope(scope)
      prefix = scope.path
      tasks.select { |t|
        /^#{prefix}:/ =~ t.name
      }
    end

    # Clear all tasks in this application.
    def clear
      @tasks.clear
      @rules.clear
    end

    # Lookup a task, using scope and the scope hints in the task name.
    # This method performs straight lookups without trying to
    # synthesize file tasks or rules.  Special scope names (e.g. '^')
    # are recognized.  If no scope argument is supplied, use the
    # current scope.  Return nil if the task cannot be found.
    def lookup(task_name, initial_scope=nil)
      initial_scope ||= @scope
      task_name = task_name.to_s
      if task_name =~ /^rake:/
        scopes = Scope.make
        task_name = task_name.sub(/^rake:/, "")
      elsif task_name =~ /^(\^+)/
        scopes = initial_scope.trim($1.size)
        task_name = task_name.sub(/^(\^+)/, "")
      else
        scopes = initial_scope
      end
      lookup_in_scope(task_name, scopes)
    end

    # Lookup the task name
    def lookup_in_scope(name, scope)
      loop do
        tn = scope.path_with_task_name(name)
        task = @tasks[tn]
        return task if task
        break if scope.empty?
        scope = scope.tail
      end
      nil
    end
    private :lookup_in_scope

    # Return the list of scope names currently active in the task
    # manager.
    def current_scope
      @scope
    end

    # Evaluate the block in a nested namespace named +name+.  Create
    # an anonymous namespace if +name+ is nil.
    def in_namespace(name)
      name ||= generate_name
      @scope = Scope.new(name, @scope)
      ns = NameSpace.new(self, @scope)
      yield(ns)
      ns
    ensure
      @scope = @scope.tail
    end

    private

    # Add a location to the locations field of the given task.
    def add_location(task)
      loc = find_location
      task.locations << loc if loc
      task
    end

    # Find the location that called into the dsl layer.
    def find_location
      locations = caller
      i = 0
      while locations[i]
        return locations[i + 1] if locations[i] =~ /rake\/dsl_definition.rb/
        i += 1
      end
      nil
    end

    # Generate an anonymous namespace name.
    def generate_name
      @seed ||= 0
      @seed += 1
      "_anon_#{@seed}"
    end

    def trace_rule(level, message) # :nodoc:
      options.trace_output.puts "#{"    " * level}#{message}" if
        Rake.application.options.trace_rules
    end

    # Attempt to create a rule given the list of prerequisites.
    def attempt_rule(task_name, task_pattern, args, extensions, block, level)
      sources = make_sources(task_name, task_pattern, extensions)
      prereqs = sources.map { |source|
        trace_rule level, "Attempting Rule #{task_name} => #{source}"
        if File.exist?(source) || Rake::Task.task_defined?(source)
          trace_rule level, "(#{task_name} => #{source} ... EXIST)"
          source
        elsif parent = enhance_with_matching_rule(source, level + 1)
          trace_rule level, "(#{task_name} => #{source} ... ENHANCE)"
          parent.name
        else
          trace_rule level, "(#{task_name} => #{source} ... FAIL)"
          return nil
        end
      }
      task = FileTask.define_task(task_name, { args => prereqs }, &block)
      task.sources = prereqs
      task
    end

    # Make a list of sources from the list of file name extensions /
    # translation procs.
    def make_sources(task_name, task_pattern, extensions)
      result = extensions.map { |ext|
        case ext
        when /%/
          task_name.pathmap(ext)
        when %r{/}
          ext
        when /^\./
          source = task_name.sub(task_pattern, ext)
          source == ext ? task_name.ext(ext) : source
        when String, Symbol
          ext.to_s
        when Proc, Method
          if ext.arity == 1
            ext.call(task_name)
          else
            ext.call
          end
        else
          fail "Don't know how to handle rule dependent: #{ext.inspect}"
        end
      }
      result.flatten
    end

    # Return the current description, clearing it in the process.
    def get_description(task)
      desc = @last_description
      @last_description = nil
      desc
    end

    class << self
      attr_accessor :record_task_metadata # :nodoc:
      TaskManager.record_task_metadata = false
    end
  end

end
PK	}$[�lD��,gems/gems/rake-13.0.6/lib/rake/name_space.rbnu�[���# frozen_string_literal: true
##
# The NameSpace class will lookup task names in the scope defined by a
# +namespace+ command.

class Rake::NameSpace

  ##
  # Create a namespace lookup object using the given task manager
  # and the list of scopes.

  def initialize(task_manager, scope_list)
    @task_manager = task_manager
    @scope = scope_list.dup
  end

  ##
  # Lookup a task named +name+ in the namespace.

  def [](name)
    @task_manager.lookup(name, @scope)
  end

  ##
  # The scope of the namespace (a LinkedList)

  def scope
    @scope.dup
  end

  ##
  # Return the list of tasks defined in this and nested namespaces.

  def tasks
    @task_manager.tasks_in_scope(@scope)
  end

end
PK	}$[��K��/gems/gems/rake-13.0.6/lib/rake/pseudo_status.rbnu�[���# frozen_string_literal: true
module Rake

  ##
  # Exit status class for times the system just gives us a nil.
  class PseudoStatus # :nodoc: all
    attr_reader :exitstatus

    def initialize(code=0)
      @exitstatus = code
    end

    def to_i
      @exitstatus << 8
    end

    def >>(n)
      to_i >> n
    end

    def stopped?
      false
    end

    def exited?
      true
    end
  end

end
PK	}$[;Y�II,gems/gems/rake-13.0.6/lib/rake/file_utils.rbnu�[���# frozen_string_literal: true
require "rbconfig"
require "fileutils"

#--
# This a FileUtils extension that defines several additional commands to be
# added to the FileUtils utility functions.
module FileUtils
  # Path to the currently running Ruby program
  RUBY = ENV["RUBY"] || File.join(
    RbConfig::CONFIG["bindir"],
    RbConfig::CONFIG["ruby_install_name"] + RbConfig::CONFIG["EXEEXT"]).
    sub(/.*\s.*/m, '"\&"')

  # Run the system command +cmd+.  If multiple arguments are given the command
  # is run directly (without the shell, same semantics as Kernel::exec and
  # Kernel::system).
  #
  # It is recommended you use the multiple argument form over interpolating
  # user input for both usability and security reasons.  With the multiple
  # argument form you can easily process files with spaces or other shell
  # reserved characters in them.  With the multiple argument form your rake
  # tasks are not vulnerable to users providing an argument like
  # <code>; rm # -rf /</code>.
  #
  # If a block is given, upon command completion the block is called with an
  # OK flag (true on a zero exit status) and a Process::Status object.
  # Without a block a RuntimeError is raised when the command exits non-zero.
  #
  # Examples:
  #
  #   sh 'ls -ltr'
  #
  #   sh 'ls', 'file with spaces'
  #
  #   # check exit status after command runs
  #   sh %{grep pattern file} do |ok, res|
  #     if !ok
  #       puts "pattern not found (status = #{res.exitstatus})"
  #     end
  #   end
  #
  def sh(*cmd, &block)
    options = (Hash === cmd.last) ? cmd.pop : {}
    shell_runner = block_given? ? block : create_shell_runner(cmd)

    set_verbose_option(options)
    verbose = options.delete :verbose
    noop    = options.delete(:noop) || Rake::FileUtilsExt.nowrite_flag

    Rake.rake_output_message sh_show_command cmd if verbose

    unless noop
      res = (Hash === cmd.last) ? system(*cmd) : system(*cmd, options)
      status = $?
      status = Rake::PseudoStatus.new(1) if !res && status.nil?
      shell_runner.call(res, status)
    end
  end

  def create_shell_runner(cmd) # :nodoc:
    show_command = sh_show_command cmd
    show_command = show_command[0, 42] + "..." unless $trace

    lambda do |ok, status|
      ok or
        fail "Command failed with status (#{status.exitstatus}): " +
        "[#{show_command}]"
    end
  end
  private :create_shell_runner

  def sh_show_command(cmd) # :nodoc:
    cmd = cmd.dup

    if Hash === cmd.first
      env = cmd.first
      env = env.map { |name, value| "#{name}=#{value}" }.join " "
      cmd[0] = env
    end

    cmd.join " "
  end
  private :sh_show_command

  def set_verbose_option(options) # :nodoc:
    unless options.key? :verbose
      options[:verbose] =
        (Rake::FileUtilsExt.verbose_flag == Rake::FileUtilsExt::DEFAULT) ||
        Rake::FileUtilsExt.verbose_flag
    end
  end
  private :set_verbose_option

  # Run a Ruby interpreter with the given arguments.
  #
  # Example:
  #   ruby %{-pe '$_.upcase!' <README}
  #
  def ruby(*args, **options, &block)
    if args.length > 1
      sh(RUBY, *args, **options, &block)
    else
      sh("#{RUBY} #{args.first}", **options, &block)
    end
  end

  LN_SUPPORTED = [true]

  #  Attempt to do a normal file link, but fall back to a copy if the link
  #  fails.
  def safe_ln(*args, **options)
    if LN_SUPPORTED[0]
      begin
        return options.empty? ? ln(*args) : ln(*args, **options)
      rescue StandardError, NotImplementedError
        LN_SUPPORTED[0] = false
      end
    end
    options.empty? ? cp(*args) : cp(*args, **options)
  end

  # Split a file path into individual directory names.
  #
  # Example:
  #   split_all("a/b/c") =>  ['a', 'b', 'c']
  #
  def split_all(path)
    head, tail = File.split(path)
    return [tail] if head == "." || tail == "/"
    return [head, tail] if head == "/"
    return split_all(head) + [tail]
  end
end
PK	}$[�##B�B�!gems/gems/ruby-lsapi-5.6/setup.rbnu�[���#
# setup.rb
#
# Copyright (c) 2000-2005 Minero Aoki
#
# This program is free software.
# You can distribute/modify this program under the terms of
# the GNU LGPL, Lesser General Public License version 2.1.
#

unless Enumerable.method_defined?(:map)   # Ruby 1.4.6
  module Enumerable
    alias map collect
  end
end

unless File.respond_to?(:read)   # Ruby 1.6
  def File.read(fname)
    open(fname) {|f|
      return f.read
    }
  end
end

unless Errno.const_defined?(:ENOTEMPTY)   # Windows?
  module Errno
    class ENOTEMPTY
      # We do not raise this exception, implementation is not needed.
    end
  end
end

def File.binread(fname)
  open(fname, 'rb') {|f|
    return f.read
  }
end

# for corrupted Windows' stat(2)
def File.dir?(path)
  File.directory?((path[-1,1] == '/') ? path : path + '/')
end


class ConfigTable

  include Enumerable

  def initialize(rbconfig)
    @rbconfig = rbconfig
    @items = []
    @table = {}
    # options
    @install_prefix = nil
    @config_opt = nil
    @verbose = true
    @no_harm = false
  end

  attr_accessor :install_prefix
  attr_accessor :config_opt

  attr_writer :verbose

  def verbose?
    @verbose
  end

  attr_writer :no_harm

  def no_harm?
    @no_harm
  end

  def [](key)
    lookup(key).resolve(self)
  end

  def []=(key, val)
    lookup(key).set val
  end

  def names
    @items.map {|i| i.name }
  end

  def each(&block)
    @items.each(&block)
  end

  def key?(name)
    @table.key?(name)
  end

  def lookup(name)
    @table[name] or setup_rb_error "no such config item: #{name}"
  end

  def add(item)
    @items.push item
    @table[item.name] = item
  end

  def remove(name)
    item = lookup(name)
    @items.delete_if {|i| i.name == name }
    @table.delete_if {|name, i| i.name == name }
    item
  end

  def load_script(path, inst = nil)
    if File.file?(path)
      MetaConfigEnvironment.new(self, inst).instance_eval File.read(path), path
    end
  end

  def savefile
    '.config'
  end

  def load_savefile
    begin
      File.foreach(savefile()) do |line|
        k, v = *line.split(/=/, 2)
        self[k] = v.strip
      end
    rescue Errno::ENOENT
      setup_rb_error $!.message + "\n#{File.basename($0)} config first"
    end
  end

  def save
    @items.each {|i| i.value }
    File.open(savefile(), 'w') {|f|
      @items.each do |i|
        f.printf "%s=%s\n", i.name, i.value if i.value? and i.value
      end
    }
  end

  def load_standard_entries
    standard_entries(@rbconfig).each do |ent|
      add ent
    end
  end

  def standard_entries(rbconfig)
    c = rbconfig

    rubypath = File.join(c['bindir'], c['ruby_install_name'] + c['EXEEXT'])

    major = c['MAJOR'].to_i
    minor = c['MINOR'].to_i
    teeny = c['TEENY'].to_i
    version = "#{major}.#{minor}"

    # ruby ver. >= 1.4.4?
    newpath_p = ((major >= 2) or
                 ((major == 1) and
                  ((minor >= 5) or
                   ((minor == 4) and (teeny >= 4)))))

    if c['rubylibdir']
      # V > 1.6.3
      libruby         = "#{c['prefix']}/lib/ruby"
      librubyver      = c['rubylibdir']
      librubyverarch  = c['archdir']
      siteruby        = c['sitedir']
      siterubyver     = c['sitelibdir']
      siterubyverarch = c['sitearchdir']
    elsif newpath_p
      # 1.4.4 <= V <= 1.6.3
      libruby         = "#{c['prefix']}/lib/ruby"
      librubyver      = "#{c['prefix']}/lib/ruby/#{version}"
      librubyverarch  = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
      siteruby        = c['sitedir']
      siterubyver     = "$siteruby/#{version}"
      siterubyverarch = "$siterubyver/#{c['arch']}"
    else
      # V < 1.4.4
      libruby         = "#{c['prefix']}/lib/ruby"
      librubyver      = "#{c['prefix']}/lib/ruby/#{version}"
      librubyverarch  = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
      siteruby        = "#{c['prefix']}/lib/ruby/#{version}/site_ruby"
      siterubyver     = siteruby
      siterubyverarch = "$siterubyver/#{c['arch']}"
    end
    parameterize = lambda {|path|
      path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix')
    }

    if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
      makeprog = arg.sub(/'/, '').split(/=/, 2)[1]
    else
      makeprog = 'make'
    end

    [
      ExecItem.new('installdirs', 'std/site/home',
                   'std: install under libruby; site: install under site_ruby; home: install under $HOME')\
          {|val, table|
            case val
            when 'std'
              table['rbdir'] = '$librubyver'
              table['sodir'] = '$librubyverarch'
            when 'site'
              table['rbdir'] = '$siterubyver'
              table['sodir'] = '$siterubyverarch'
            when 'home'
              setup_rb_error '$HOME was not set' unless ENV['HOME']
              table['prefix'] = ENV['HOME']
              table['rbdir'] = '$libdir/ruby'
              table['sodir'] = '$libdir/ruby'
            end
          },
      PathItem.new('prefix', 'path', c['prefix'],
                   'path prefix of target environment'),
      PathItem.new('bindir', 'path', parameterize.call(c['bindir']),
                   'the directory for commands'),
      PathItem.new('libdir', 'path', parameterize.call(c['libdir']),
                   'the directory for libraries'),
      PathItem.new('datadir', 'path', parameterize.call(c['datadir']),
                   'the directory for shared data'),
      PathItem.new('mandir', 'path', parameterize.call(c['mandir']),
                   'the directory for man pages'),
      PathItem.new('sysconfdir', 'path', parameterize.call(c['sysconfdir']),
                   'the directory for system configuration files'),
      PathItem.new('localstatedir', 'path', parameterize.call(c['localstatedir']),
                   'the directory for local state data'),
      PathItem.new('libruby', 'path', libruby,
                   'the directory for ruby libraries'),
      PathItem.new('librubyver', 'path', librubyver,
                   'the directory for standard ruby libraries'),
      PathItem.new('librubyverarch', 'path', librubyverarch,
                   'the directory for standard ruby extensions'),
      PathItem.new('siteruby', 'path', siteruby,
          'the directory for version-independent aux ruby libraries'),
      PathItem.new('siterubyver', 'path', siterubyver,
                   'the directory for aux ruby libraries'),
      PathItem.new('siterubyverarch', 'path', siterubyverarch,
                   'the directory for aux ruby binaries'),
      PathItem.new('rbdir', 'path', '$siterubyver',
                   'the directory for ruby scripts'),
      PathItem.new('sodir', 'path', '$siterubyverarch',
                   'the directory for ruby extentions'),
      PathItem.new('rubypath', 'path', rubypath,
                   'the path to set to #! line'),
      ProgramItem.new('rubyprog', 'name', rubypath,
                      'the ruby program using for installation'),
      ProgramItem.new('makeprog', 'name', makeprog,
                      'the make program to compile ruby extentions'),
      SelectItem.new('shebang', 'all/ruby/never', 'ruby',
                     'shebang line (#!) editing mode'),
      BoolItem.new('without-ext', 'yes/no', 'no',
                   'does not compile/install ruby extentions')
    ]
  end
  private :standard_entries

  def load_multipackage_entries
    multipackage_entries().each do |ent|
      add ent
    end
  end

  def multipackage_entries
    [
      PackageSelectionItem.new('with', 'name,name...', '', 'ALL',
                               'package names that you want to install'),
      PackageSelectionItem.new('without', 'name,name...', '', 'NONE',
                               'package names that you do not want to install')
    ]
  end
  private :multipackage_entries

  ALIASES = {
    'std-ruby'         => 'librubyver',
    'stdruby'          => 'librubyver',
    'rubylibdir'       => 'librubyver',
    'archdir'          => 'librubyverarch',
    'site-ruby-common' => 'siteruby',     # For backward compatibility
    'site-ruby'        => 'siterubyver',  # For backward compatibility
    'bin-dir'          => 'bindir',
    'bin-dir'          => 'bindir',
    'rb-dir'           => 'rbdir',
    'so-dir'           => 'sodir',
    'data-dir'         => 'datadir',
    'ruby-path'        => 'rubypath',
    'ruby-prog'        => 'rubyprog',
    'ruby'             => 'rubyprog',
    'make-prog'        => 'makeprog',
    'make'             => 'makeprog'
  }

  def fixup
    ALIASES.each do |ali, name|
      @table[ali] = @table[name]
    end
    @items.freeze
    @table.freeze
    @options_re = /\A--(#{@table.keys.join('|')})(?:=(.*))?\z/
  end

  def parse_opt(opt)
    m = @options_re.match(opt) or setup_rb_error "config: unknown option #{opt}"
    m.to_a[1,2]
  end

  def dllext
    @rbconfig['DLEXT']
  end

  def value_config?(name)
    lookup(name).value?
  end

  class Item
    def initialize(name, template, default, desc)
      @name = name.freeze
      @template = template
      @value = default
      @default = default
      @description = desc
    end

    attr_reader :name
    attr_reader :description

    attr_accessor :default
    alias help_default default

    def help_opt
      "--#{@name}=#{@template}"
    end

    def value?
      true
    end

    def value
      @value
    end

    def resolve(table)
      @value.gsub(%r<\$([^/]+)>) { table[$1] }
    end

    def set(val)
      @value = check(val)
    end

    private

    def check(val)
      setup_rb_error "config: --#{name} requires argument" unless val
      val
    end
  end

  class BoolItem < Item
    def config_type
      'bool'
    end

    def help_opt
      "--#{@name}"
    end

    private

    def check(val)
      return 'yes' unless val
      case val
      when /\Ay(es)?\z/i, /\At(rue)?\z/i then 'yes'
      when /\An(o)?\z/i, /\Af(alse)\z/i  then 'no'
      else
        setup_rb_error "config: --#{@name} accepts only yes/no for argument"
      end
    end
  end

  class PathItem < Item
    def config_type
      'path'
    end

    private

    def check(path)
      setup_rb_error "config: --#{@name} requires argument"  unless path
      path[0,1] == '$' ? path : File.expand_path(path)
    end
  end

  class ProgramItem < Item
    def config_type
      'program'
    end
  end

  class SelectItem < Item
    def initialize(name, selection, default, desc)
      super
      @ok = selection.split('/')
    end

    def config_type
      'select'
    end

    private

    def check(val)
      unless @ok.include?(val.strip)
        setup_rb_error "config: use --#{@name}=#{@template} (#{val})"
      end
      val.strip
    end
  end

  class ExecItem < Item
    def initialize(name, selection, desc, &block)
      super name, selection, nil, desc
      @ok = selection.split('/')
      @action = block
    end

    def config_type
      'exec'
    end

    def value?
      false
    end

    def resolve(table)
      setup_rb_error "$#{name()} wrongly used as option value"
    end

    undef set

    def evaluate(val, table)
      v = val.strip.downcase
      unless @ok.include?(v)
        setup_rb_error "invalid option --#{@name}=#{val} (use #{@template})"
      end
      @action.call v, table
    end
  end

  class PackageSelectionItem < Item
    def initialize(name, template, default, help_default, desc)
      super name, template, default, desc
      @help_default = help_default
    end

    attr_reader :help_default

    def config_type
      'package'
    end

    private

    def check(val)
      unless File.dir?("packages/#{val}")
        setup_rb_error "config: no such package: #{val}"
      end
      val
    end
  end

  class MetaConfigEnvironment
    def initialize(config, installer)
      @config = config
      @installer = installer
    end

    def config_names
      @config.names
    end

    def config?(name)
      @config.key?(name)
    end

    def bool_config?(name)
      @config.lookup(name).config_type == 'bool'
    end

    def path_config?(name)
      @config.lookup(name).config_type == 'path'
    end

    def value_config?(name)
      @config.lookup(name).config_type != 'exec'
    end

    def add_config(item)
      @config.add item
    end

    def add_bool_config(name, default, desc)
      @config.add BoolItem.new(name, 'yes/no', default ? 'yes' : 'no', desc)
    end

    def add_path_config(name, default, desc)
      @config.add PathItem.new(name, 'path', default, desc)
    end

    def set_config_default(name, default)
      @config.lookup(name).default = default
    end

    def remove_config(name)
      @config.remove(name)
    end

    # For only multipackage
    def packages
      raise '[setup.rb fatal] multi-package metaconfig API packages() called for single-package; contact application package vendor' unless @installer
      @installer.packages
    end

    # For only multipackage
    def declare_packages(list)
      raise '[setup.rb fatal] multi-package metaconfig API declare_packages() called for single-package; contact application package vendor' unless @installer
      @installer.packages = list
    end
  end

end   # class ConfigTable


# This module requires: #verbose?, #no_harm?
module FileOperations

  def mkdir_p(dirname, prefix = nil)
    dirname = prefix + File.expand_path(dirname) if prefix
    $stderr.puts "mkdir -p #{dirname}" if verbose?
    return if no_harm?

    # Does not check '/', it's too abnormal.
    dirs = File.expand_path(dirname).split(%r<(?=/)>)
    if /\A[a-z]:\z/i =~ dirs[0]
      disk = dirs.shift
      dirs[0] = disk + dirs[0]
    end
    dirs.each_index do |idx|
      path = dirs[0..idx].join('')
      Dir.mkdir path unless File.dir?(path)
    end
  end

  def rm_f(path)
    $stderr.puts "rm -f #{path}" if verbose?
    return if no_harm?
    force_remove_file path
  end

  def rm_rf(path)
    $stderr.puts "rm -rf #{path}" if verbose?
    return if no_harm?
    remove_tree path
  end

  def remove_tree(path)
    if File.symlink?(path)
      remove_file path
    elsif File.dir?(path)
      remove_tree0 path
    else
      force_remove_file path
    end
  end

  def remove_tree0(path)
    Dir.foreach(path) do |ent|
      next if ent == '.'
      next if ent == '..'
      entpath = "#{path}/#{ent}"
      if File.symlink?(entpath)
        remove_file entpath
      elsif File.dir?(entpath)
        remove_tree0 entpath
      else
        force_remove_file entpath
      end
    end
    begin
      Dir.rmdir path
    rescue Errno::ENOTEMPTY
      # directory may not be empty
    end
  end

  def move_file(src, dest)
    force_remove_file dest
    begin
      File.rename src, dest
    rescue
      File.open(dest, 'wb') {|f|
        f.write File.binread(src)
      }
      File.chmod File.stat(src).mode, dest
      File.unlink src
    end
  end

  def force_remove_file(path)
    begin
      remove_file path
    rescue
    end
  end

  def remove_file(path)
    File.chmod 0777, path
    File.unlink path
  end

  def install(from, dest, mode, prefix = nil)
    $stderr.puts "install #{from} #{dest}" if verbose?
    return if no_harm?

    realdest = prefix ? prefix + File.expand_path(dest) : dest
    realdest = File.join(realdest, File.basename(from)) if File.dir?(realdest)
    str = File.binread(from)
    if diff?(str, realdest)
      verbose_off {
        rm_f realdest if File.exist?(realdest)
      }
      File.open(realdest, 'wb') {|f|
        f.write str
      }
      File.chmod mode, realdest

      File.open("#{objdir_root()}/InstalledFiles", 'a') {|f|
        if prefix
          f.puts realdest.sub(prefix, '')
        else
          f.puts realdest
        end
      }
    end
  end

  def diff?(new_content, path)
    return true unless File.exist?(path)
    new_content != File.binread(path)
  end

  def command(*args)
    $stderr.puts args.join(' ') if verbose?
    system(*args) or raise RuntimeError,
        "system(#{args.map{|a| a.inspect }.join(' ')}) failed"
  end

  def ruby(*args)
    command config('rubyprog'), *args
  end
  
  def make(task = nil)
    command(*[config('makeprog'), task].compact)
  end

  def extdir?(dir)
    File.exist?("#{dir}/MANIFEST") or File.exist?("#{dir}/extconf.rb")
  end

  def files_of(dir)
    Dir.open(dir) {|d|
      return d.select {|ent| File.file?("#{dir}/#{ent}") }
    }
  end

  DIR_REJECT = %w( . .. CVS SCCS RCS CVS.adm .svn )

  def directories_of(dir)
    Dir.open(dir) {|d|
      return d.select {|ent| File.dir?("#{dir}/#{ent}") } - DIR_REJECT
    }
  end

end


# This module requires: #srcdir_root, #objdir_root, #relpath
module HookScriptAPI

  def get_config(key)
    @config[key]
  end

  alias config get_config

  # obsolete: use metaconfig to change configuration
  def set_config(key, val)
    @config[key] = val
  end

  #
  # srcdir/objdir (works only in the package directory)
  #

  def curr_srcdir
    "#{srcdir_root()}/#{relpath()}"
  end

  def curr_objdir
    "#{objdir_root()}/#{relpath()}"
  end

  def srcfile(path)
    "#{curr_srcdir()}/#{path}"
  end

  def srcexist?(path)
    File.exist?(srcfile(path))
  end

  def srcdirectory?(path)
    File.dir?(srcfile(path))
  end
  
  def srcfile?(path)
    File.file?(srcfile(path))
  end

  def srcentries(path = '.')
    Dir.open("#{curr_srcdir()}/#{path}") {|d|
      return d.to_a - %w(. ..)
    }
  end

  def srcfiles(path = '.')
    srcentries(path).select {|fname|
      File.file?(File.join(curr_srcdir(), path, fname))
    }
  end

  def srcdirectories(path = '.')
    srcentries(path).select {|fname|
      File.dir?(File.join(curr_srcdir(), path, fname))
    }
  end

end


class ToplevelInstaller

  Version   = '3.4.1'
  Copyright = 'Copyright (c) 2000-2005 Minero Aoki'

  TASKS = [
    [ 'all',      'do config, setup, then install' ],
    [ 'config',   'saves your configurations' ],
    [ 'show',     'shows current configuration' ],
    [ 'setup',    'compiles ruby extentions and others' ],
    [ 'install',  'installs files' ],
    [ 'test',     'run all tests in test/' ],
    [ 'clean',    "does `make clean' for each extention" ],
    [ 'distclean',"does `make distclean' for each extention" ]
  ]

  def ToplevelInstaller.invoke
    config = ConfigTable.new(load_rbconfig())
    config.load_standard_entries
    config.load_multipackage_entries if multipackage?
    config.fixup
    klass = (multipackage?() ? ToplevelInstallerMulti : ToplevelInstaller)
    klass.new(File.dirname($0), config).invoke
  end

  def ToplevelInstaller.multipackage?
    File.dir?(File.dirname($0) + '/packages')
  end

  def ToplevelInstaller.load_rbconfig
    if arg = ARGV.detect {|arg| /\A--rbconfig=/ =~ arg }
      ARGV.delete(arg)
      load File.expand_path(arg.split(/=/, 2)[1])
      $".push 'rbconfig.rb'
    else
      require 'rbconfig'
    end
    ::Config::CONFIG
  end

  def initialize(ardir_root, config)
    @ardir = File.expand_path(ardir_root)
    @config = config
    # cache
    @valid_task_re = nil
  end

  def config(key)
    @config[key]
  end

  def inspect
    "#<#{self.class} #{__id__()}>"
  end

  def invoke
    run_metaconfigs
    case task = parsearg_global()
    when nil, 'all'
      parsearg_config
      init_installers
      exec_config
      exec_setup
      exec_install
    else
      case task
      when 'config', 'test'
        ;
      when 'clean', 'distclean'
        @config.load_savefile if File.exist?(@config.savefile)
      else
        @config.load_savefile
      end
      __send__ "parsearg_#{task}"
      init_installers
      __send__ "exec_#{task}"
    end
  end
  
  def run_metaconfigs
    @config.load_script "#{@ardir}/metaconfig"
  end

  def init_installers
    @installer = Installer.new(@config, @ardir, File.expand_path('.'))
  end

  #
  # Hook Script API bases
  #

  def srcdir_root
    @ardir
  end

  def objdir_root
    '.'
  end

  def relpath
    '.'
  end

  #
  # Option Parsing
  #

  def parsearg_global
    while arg = ARGV.shift
      case arg
      when /\A\w+\z/
        setup_rb_error "invalid task: #{arg}" unless valid_task?(arg)
        return arg
      when '-q', '--quiet'
        @config.verbose = false
      when '--verbose'
        @config.verbose = true
      when '--help'
        print_usage $stdout
        exit 0
      when '--version'
        puts "#{File.basename($0)} version #{Version}"
        exit 0
      when '--copyright'
        puts Copyright
        exit 0
      else
        setup_rb_error "unknown global option '#{arg}'"
      end
    end
    nil
  end

  def valid_task?(t)
    valid_task_re() =~ t
  end

  def valid_task_re
    @valid_task_re ||= /\A(?:#{TASKS.map {|task,desc| task }.join('|')})\z/
  end

  def parsearg_no_options
    unless ARGV.empty?
      task = caller(0).first.slice(%r<`parsearg_(\w+)'>, 1)
      setup_rb_error "#{task}: unknown options: #{ARGV.join(' ')}"
    end
  end

  alias parsearg_show       parsearg_no_options
  alias parsearg_setup      parsearg_no_options
  alias parsearg_test       parsearg_no_options
  alias parsearg_clean      parsearg_no_options
  alias parsearg_distclean  parsearg_no_options

  def parsearg_config
    evalopt = []
    set = []
    @config.config_opt = []
    while i = ARGV.shift
      if /\A--?\z/ =~ i
        @config.config_opt = ARGV.dup
        break
      end
      name, value = *@config.parse_opt(i)
      if @config.value_config?(name)
        @config[name] = value
      else
        evalopt.push [name, value]
      end
      set.push name
    end
    evalopt.each do |name, value|
      @config.lookup(name).evaluate value, @config
    end
    # Check if configuration is valid
    set.each do |n|
      @config[n] if @config.value_config?(n)
    end
  end

  def parsearg_install
    @config.no_harm = false
    @config.install_prefix = ''
    while a = ARGV.shift
      case a
      when '--no-harm'
        @config.no_harm = true
      when /\A--prefix=/
        path = a.split(/=/, 2)[1]
        path = File.expand_path(path) unless path[0,1] == '/'
        @config.install_prefix = path
      else
        setup_rb_error "install: unknown option #{a}"
      end
    end
  end

  def print_usage(out)
    out.puts 'Typical Installation Procedure:'
    out.puts "  $ ruby #{File.basename $0} config"
    out.puts "  $ ruby #{File.basename $0} setup"
    out.puts "  # ruby #{File.basename $0} install (may require root privilege)"
    out.puts
    out.puts 'Detailed Usage:'
    out.puts "  ruby #{File.basename $0} <global option>"
    out.puts "  ruby #{File.basename $0} [<global options>] <task> [<task options>]"

    fmt = "  %-24s %s\n"
    out.puts
    out.puts 'Global options:'
    out.printf fmt, '-q,--quiet',   'suppress message outputs'
    out.printf fmt, '   --verbose', 'output messages verbosely'
    out.printf fmt, '   --help',    'print this message'
    out.printf fmt, '   --version', 'print version and quit'
    out.printf fmt, '   --copyright',  'print copyright and quit'
    out.puts
    out.puts 'Tasks:'
    TASKS.each do |name, desc|
      out.printf fmt, name, desc
    end

    fmt = "  %-24s %s [%s]\n"
    out.puts
    out.puts 'Options for CONFIG or ALL:'
    @config.each do |item|
      out.printf fmt, item.help_opt, item.description, item.help_default
    end
    out.printf fmt, '--rbconfig=path', 'rbconfig.rb to load',"running ruby's"
    out.puts
    out.puts 'Options for INSTALL:'
    out.printf fmt, '--no-harm', 'only display what to do if given', 'off'
    out.printf fmt, '--prefix=path',  'install path prefix', ''
    out.puts
  end

  #
  # Task Handlers
  #

  def exec_config
    @installer.exec_config
    @config.save   # must be final
  end

  def exec_setup
    @installer.exec_setup
  end

  def exec_install
    @installer.exec_install
  end

  def exec_test
    @installer.exec_test
  end

  def exec_show
    @config.each do |i|
      printf "%-20s %s\n", i.name, i.value if i.value?
    end
  end

  def exec_clean
    @installer.exec_clean
  end

  def exec_distclean
    @installer.exec_distclean
  end

end   # class ToplevelInstaller


class ToplevelInstallerMulti < ToplevelInstaller

  include FileOperations

  def initialize(ardir_root, config)
    super
    @packages = directories_of("#{@ardir}/packages")
    raise 'no package exists' if @packages.empty?
    @root_installer = Installer.new(@config, @ardir, File.expand_path('.'))
  end

  def run_metaconfigs
    @config.load_script "#{@ardir}/metaconfig", self
    @packages.each do |name|
      @config.load_script "#{@ardir}/packages/#{name}/metaconfig"
    end
  end

  attr_reader :packages

  def packages=(list)
    raise 'package list is empty' if list.empty?
    list.each do |name|
      raise "directory packages/#{name} does not exist"\
              unless File.dir?("#{@ardir}/packages/#{name}")
    end
    @packages = list
  end

  def init_installers
    @installers = {}
    @packages.each do |pack|
      @installers[pack] = Installer.new(@config,
                                       "#{@ardir}/packages/#{pack}",
                                       "packages/#{pack}")
    end
    with    = extract_selection(config('with'))
    without = extract_selection(config('without'))
    @selected = @installers.keys.select {|name|
                  (with.empty? or with.include?(name)) \
                      and not without.include?(name)
                }
  end

  def extract_selection(list)
    a = list.split(/,/)
    a.each do |name|
      setup_rb_error "no such package: #{name}"  unless @installers.key?(name)
    end
    a
  end

  def print_usage(f)
    super
    f.puts 'Inluded packages:'
    f.puts '  ' + @packages.sort.join(' ')
    f.puts
  end

  #
  # Task Handlers
  #

  def exec_config
    run_hook 'pre-config'
    each_selected_installers {|inst| inst.exec_config }
    run_hook 'post-config'
    @config.save   # must be final
  end

  def exec_setup
    run_hook 'pre-setup'
    each_selected_installers {|inst| inst.exec_setup }
    run_hook 'post-setup'
  end

  def exec_install
    run_hook 'pre-install'
    each_selected_installers {|inst| inst.exec_install }
    run_hook 'post-install'
  end

  def exec_test
    run_hook 'pre-test'
    each_selected_installers {|inst| inst.exec_test }
    run_hook 'post-test'
  end

  def exec_clean
    rm_f @config.savefile
    run_hook 'pre-clean'
    each_selected_installers {|inst| inst.exec_clean }
    run_hook 'post-clean'
  end

  def exec_distclean
    rm_f @config.savefile
    run_hook 'pre-distclean'
    each_selected_installers {|inst| inst.exec_distclean }
    run_hook 'post-distclean'
  end

  #
  # lib
  #

  def each_selected_installers
    Dir.mkdir 'packages' unless File.dir?('packages')
    @selected.each do |pack|
      $stderr.puts "Processing the package `#{pack}' ..." if verbose?
      Dir.mkdir "packages/#{pack}" unless File.dir?("packages/#{pack}")
      Dir.chdir "packages/#{pack}"
      yield @installers[pack]
      Dir.chdir '../..'
    end
  end

  def run_hook(id)
    @root_installer.run_hook id
  end

  # module FileOperations requires this
  def verbose?
    @config.verbose?
  end

  # module FileOperations requires this
  def no_harm?
    @config.no_harm?
  end

end   # class ToplevelInstallerMulti


class Installer

  FILETYPES = %w( bin lib ext data conf man )

  include FileOperations
  include HookScriptAPI

  def initialize(config, srcroot, objroot)
    @config = config
    @srcdir = File.expand_path(srcroot)
    @objdir = File.expand_path(objroot)
    @currdir = '.'
  end

  def inspect
    "#<#{self.class} #{File.basename(@srcdir)}>"
  end

  def noop(rel)
  end

  #
  # Hook Script API base methods
  #

  def srcdir_root
    @srcdir
  end

  def objdir_root
    @objdir
  end

  def relpath
    @currdir
  end

  #
  # Config Access
  #

  # module FileOperations requires this
  def verbose?
    @config.verbose?
  end

  # module FileOperations requires this
  def no_harm?
    @config.no_harm?
  end

  def verbose_off
    begin
      save, @config.verbose = @config.verbose?, false
      yield
    ensure
      @config.verbose = save
    end
  end

  #
  # TASK config
  #

  def exec_config
    exec_task_traverse 'config'
  end

  alias config_dir_bin noop
  alias config_dir_lib noop

  def config_dir_ext(rel)
    extconf if extdir?(curr_srcdir())
  end

  alias config_dir_data noop
  alias config_dir_conf noop
  alias config_dir_man noop

  def extconf
    ruby "#{curr_srcdir()}/extconf.rb", *@config.config_opt
  end

  #
  # TASK setup
  #

  def exec_setup
    exec_task_traverse 'setup'
  end

  def setup_dir_bin(rel)
    files_of(curr_srcdir()).each do |fname|
      update_shebang_line "#{curr_srcdir()}/#{fname}"
    end
  end

  alias setup_dir_lib noop

  def setup_dir_ext(rel)
    make if extdir?(curr_srcdir())
  end

  alias setup_dir_data noop
  alias setup_dir_conf noop
  alias setup_dir_man noop

  def update_shebang_line(path)
    return if no_harm?
    return if config('shebang') == 'never'
    old = Shebang.load(path)
    if old
      $stderr.puts "warning: #{path}: Shebang line includes too many args.  It is not portable and your program may not work." if old.args.size > 1
      new = new_shebang(old)
      return if new.to_s == old.to_s
    else
      return unless config('shebang') == 'all'
      new = Shebang.new(config('rubypath'))
    end
    $stderr.puts "updating shebang: #{File.basename(path)}" if verbose?
    open_atomic_writer(path) {|output|
      File.open(path, 'rb') {|f|
        f.gets if old   # discard
        output.puts new.to_s
        output.print f.read
      }
    }
  end

  def new_shebang(old)
    if /\Aruby/ =~ File.basename(old.cmd)
      Shebang.new(config('rubypath'), old.args)
    elsif File.basename(old.cmd) == 'env' and old.args.first == 'ruby'
      Shebang.new(config('rubypath'), old.args[1..-1])
    else
      return old unless config('shebang') == 'all'
      Shebang.new(config('rubypath'))
    end
  end

  def open_atomic_writer(path, &block)
    tmpfile = File.basename(path) + '.tmp'
    begin
      File.open(tmpfile, 'wb', &block)
      File.rename tmpfile, File.basename(path)
    ensure
      File.unlink tmpfile if File.exist?(tmpfile)
    end
  end

  class Shebang
    def Shebang.load(path)
      line = nil
      File.open(path) {|f|
        line = f.gets
      }
      return nil unless /\A#!/ =~ line
      parse(line)
    end

    def Shebang.parse(line)
      cmd, *args = *line.strip.sub(/\A\#!/, '').split(' ')
      new(cmd, args)
    end

    def initialize(cmd, args = [])
      @cmd = cmd
      @args = args
    end

    attr_reader :cmd
    attr_reader :args

    def to_s
      "#! #{@cmd}" + (@args.empty? ? '' : " #{@args.join(' ')}")
    end
  end

  #
  # TASK install
  #

  def exec_install
    rm_f 'InstalledFiles'
    exec_task_traverse 'install'
  end

  def install_dir_bin(rel)
    install_files targetfiles(), "#{config('bindir')}/#{rel}", 0755
  end

  def install_dir_lib(rel)
    install_files libfiles(), "#{config('rbdir')}/#{rel}", 0644
  end

  def install_dir_ext(rel)
    return unless extdir?(curr_srcdir())
    install_files rubyextentions('.'),
                  "#{config('sodir')}/#{File.dirname(rel)}",
                  0555
  end

  def install_dir_data(rel)
    install_files targetfiles(), "#{config('datadir')}/#{rel}", 0644
  end

  def install_dir_conf(rel)
    # FIXME: should not remove current config files
    # (rename previous file to .old/.org)
    install_files targetfiles(), "#{config('sysconfdir')}/#{rel}", 0644
  end

  def install_dir_man(rel)
    install_files targetfiles(), "#{config('mandir')}/#{rel}", 0644
  end

  def install_files(list, dest, mode)
    mkdir_p dest, @config.install_prefix
    list.each do |fname|
      install fname, dest, mode, @config.install_prefix
    end
  end

  def libfiles
    glob_reject(%w(*.y *.output), targetfiles())
  end

  def rubyextentions(dir)
    ents = glob_select("*.#{@config.dllext}", targetfiles())
    if ents.empty?
      setup_rb_error "no ruby extention exists: 'ruby #{$0} setup' first"
    end
    ents
  end

  def targetfiles
    mapdir(existfiles() - hookfiles())
  end

  def mapdir(ents)
    ents.map {|ent|
      if File.exist?(ent)
      then ent                         # objdir
      else "#{curr_srcdir()}/#{ent}"   # srcdir
      end
    }
  end

  # picked up many entries from cvs-1.11.1/src/ignore.c
  JUNK_FILES = %w( 
    core RCSLOG tags TAGS .make.state
    .nse_depinfo #* .#* cvslog.* ,* .del-* *.olb
    *~ *.old *.bak *.BAK *.orig *.rej _$* *$

    *.org *.in .*
  )

  def existfiles
    glob_reject(JUNK_FILES, (files_of(curr_srcdir()) | files_of('.')))
  end

  def hookfiles
    %w( pre-%s post-%s pre-%s.rb post-%s.rb ).map {|fmt|
      %w( config setup install clean ).map {|t| sprintf(fmt, t) }
    }.flatten
  end

  def glob_select(pat, ents)
    re = globs2re([pat])
    ents.select {|ent| re =~ ent }
  end

  def glob_reject(pats, ents)
    re = globs2re(pats)
    ents.reject {|ent| re =~ ent }
  end

  GLOB2REGEX = {
    '.' => '\.',
    '$' => '\$',
    '#' => '\#',
    '*' => '.*'
  }

  def globs2re(pats)
    /\A(?:#{
      pats.map {|pat| pat.gsub(/[\.\$\#\*]/) {|ch| GLOB2REGEX[ch] } }.join('|')
    })\z/
  end

  #
  # TASK test
  #

  TESTDIR = 'test'

  def exec_test
    unless File.directory?('test')
      $stderr.puts 'no test in this package' if verbose?
      return
    end
    $stderr.puts 'Running tests...' if verbose?
    begin
      require 'test/unit'
    rescue LoadError
      setup_rb_error 'test/unit cannot loaded.  You need Ruby 1.8 or later to invoke this task.'
    end
    runner = Test::Unit::AutoRunner.new(true)
    runner.to_run << TESTDIR
    runner.run
  end

  #
  # TASK clean
  #

  def exec_clean
    exec_task_traverse 'clean'
    rm_f @config.savefile
    rm_f 'InstalledFiles'
  end

  alias clean_dir_bin noop
  alias clean_dir_lib noop
  alias clean_dir_data noop
  alias clean_dir_conf noop
  alias clean_dir_man noop

  def clean_dir_ext(rel)
    return unless extdir?(curr_srcdir())
    make 'clean' if File.file?('Makefile')
  end

  #
  # TASK distclean
  #

  def exec_distclean
    exec_task_traverse 'distclean'
    rm_f @config.savefile
    rm_f 'InstalledFiles'
  end

  alias distclean_dir_bin noop
  alias distclean_dir_lib noop

  def distclean_dir_ext(rel)
    return unless extdir?(curr_srcdir())
    make 'distclean' if File.file?('Makefile')
  end

  alias distclean_dir_data noop
  alias distclean_dir_conf noop
  alias distclean_dir_man noop

  #
  # Traversing
  #

  def exec_task_traverse(task)
    run_hook "pre-#{task}"
    FILETYPES.each do |type|
      if type == 'ext' and config('without-ext') == 'yes'
        $stderr.puts 'skipping ext/* by user option' if verbose?
        next
      end
      traverse task, type, "#{task}_dir_#{type}"
    end
    run_hook "post-#{task}"
  end

  def traverse(task, rel, mid)
    dive_into(rel) {
      run_hook "pre-#{task}"
      __send__ mid, rel.sub(%r[\A.*?(?:/|\z)], '')
      directories_of(curr_srcdir()).each do |d|
        traverse task, "#{rel}/#{d}", mid
      end
      run_hook "post-#{task}"
    }
  end

  def dive_into(rel)
    return unless File.dir?("#{@srcdir}/#{rel}")

    dir = File.basename(rel)
    Dir.mkdir dir unless File.dir?(dir)
    prevdir = Dir.pwd
    Dir.chdir dir
    $stderr.puts '---> ' + rel if verbose?
    @currdir = rel
    yield
    Dir.chdir prevdir
    $stderr.puts '<--- ' + rel if verbose?
    @currdir = File.dirname(rel)
  end

  def run_hook(id)
    path = [ "#{curr_srcdir()}/#{id}",
             "#{curr_srcdir()}/#{id}.rb" ].detect {|cand| File.file?(cand) }
    return unless path
    begin
      instance_eval File.read(path), path, 1
    rescue
      raise if $DEBUG
      setup_rb_error "hook #{path} failed:\n" + $!.message
    end
  end

end   # class Installer


class SetupError < StandardError; end

def setup_rb_error(msg)
  raise SetupError, msg
end

if $0 == __FILE__
  begin
    ToplevelInstaller.invoke
  rescue SetupError
    raise if $DEBUG
    $stderr.puts $!.message
    $stderr.puts "Try 'ruby #{$0} --help' for detailed usage."
    exit 1
  end
end
PK	}$[�'�MM1gems/gems/ruby-lsapi-5.6/scripts/lsruby_runner.rbnuȯ��#!/opt/alt/ruby31/bin/ruby

require 'lsapi'

class CodeCache
    def [](filename)
		mtime = File.mtime( filename )		
		
		entry = @cache[filename];
		if entry != nil 
			return entry
						
		end
		code = compile(filename)
		#entry = CodeEntry.new( filename, mtime, code )
		@cache[filename] = code
		return code
    end

    private

    def initialize
      @cache = {}
    end

    def compile(filename)
		open(filename) do |f|
			s = f.read
			s.untaint
			binding = eval_string_wrap("binding")
			return eval(format("Proc.new {\n%s\n}", s), binding, filename, 0)
		end
    end
end


$count = 0;

$cache = CodeCache.new


while true
	$req = LSAPI.accept 
	break if $req == nil 
	
	filename = ENV['SCRIPT_FILENAME']
	filename.untaint

	filename =~ %r{^(\/.*?)\/*([^\/]+)$}
	path   = $1
	Dir.chdir( path )
	#load( filename, true )	
    code = $cache[filename]
    code.call
	
end

class CodeEntry
	public :path, :name, :mtime, :opcode 
	
	def initizlize( filename, mtime, opcode )
		filename =~ %r{^(\/.*?)\/*([^\/]+)$}
		@path   = $1
		@name   = $2
		@mtime  = mtime
		@opcode = opcode
	end

end


PK	}$[��ԍ#�#+gems/gems/ruby-lsapi-5.6/ext/lsapi/Makefilenu�[���
SHELL = /bin/sh

# V=0 quiet, V=1 verbose.  other values don't work.
V = 1
V0 = $(V:0=)
Q1 = $(V:1=)
Q = $(Q1:0=@)
ECHO1 = $(V:1=@ :)
ECHO = $(ECHO1:0=@ echo)
NULLCMD = :

#### Start of system configuration section. ####

srcdir = .
topdir = /opt/alt/ruby31/include
hdrdir = $(topdir)
arch_hdrdir = /opt/alt/ruby31/include
PATH_SEPARATOR = :
VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby
prefix = $(DESTDIR)/opt/alt/ruby31
rubysitearchprefix = $(sitearchlibdir)/$(RUBY_BASE_NAME)
rubyarchprefix = $(DESTDIR)/opt/alt/ruby31/lib64/ruby
rubylibprefix = $(exec_prefix)/share/ruby
exec_prefix = $(DESTDIR)/opt/alt/ruby31
vendorarchhdrdir = $(vendorhdrdir)/$(arch)
sitearchhdrdir = $(sitehdrdir)/$(arch)
rubyarchhdrdir = $(DESTDIR)/opt/alt/ruby31/include
vendorhdrdir = $(rubyhdrdir)/vendor_ruby
sitehdrdir = $(rubyhdrdir)/site_ruby
rubyhdrdir = $(DESTDIR)/opt/alt/ruby31/include
rubygemsdir = $(DESTDIR)/opt/alt/ruby31/share/rubygems
vendorarchdir = $(DESTDIR)/opt/alt/ruby31/lib64/ruby/vendor_ruby
vendorlibdir = $(vendordir)
vendordir = $(DESTDIR)/opt/alt/ruby31/share/ruby/vendor_ruby
sitearchdir = $(DESTDIR)/opt/alt/ruby31/lib64/ruby/site_ruby
sitelibdir = $(sitedir)
sitedir = $(DESTDIR)/opt/alt/ruby31/share/ruby/site_ruby
rubyarchdir = $(rubyarchprefix)
rubylibdir = $(rubylibprefix)
sitearchincludedir = $(includedir)/$(sitearch)
archincludedir = $(includedir)/$(arch)
sitearchlibdir = $(libdir)/$(sitearch)
archlibdir = $(DESTDIR)/opt/alt/ruby31/lib64
ridir = $(datarootdir)/$(RI_BASE_NAME)
mandir = $(DESTDIR)/opt/alt/ruby31/share/man
localedir = $(datarootdir)/locale
libdir = $(exec_prefix)/lib64
psdir = $(docdir)
pdfdir = $(docdir)
dvidir = $(docdir)
htmldir = $(docdir)
infodir = $(DESTDIR)/opt/alt/ruby31/share/info
docdir = $(datarootdir)/doc/$(PACKAGE)
oldincludedir = $(DESTDIR)/usr/include
includedir = $(exec_prefix)/include
localstatedir = $(DESTDIR)/var
sharedstatedir = $(DESTDIR)/var/lib
sysconfdir = $(DESTDIR)/etc
datadir = $(DESTDIR)/opt/alt/ruby31/share
datarootdir = $(prefix)/share
libexecdir = $(DESTDIR)/opt/alt/ruby31/libexec
sbindir = $(DESTDIR)/opt/alt/ruby31/sbin
bindir = $(exec_prefix)/bin
archdir = $(rubyarchdir)


CC_WRAPPER = 
CC = gcc
CXX = g++
LIBRUBY = $(LIBRUBY_SO)
LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
LIBRUBYARG_SHARED = -Wl,-rpath,$(archlibdir) -L$(archlibdir) -l$(RUBY_SO_NAME)
LIBRUBYARG_STATIC = -Wl,-rpath,$(archlibdir) -L$(archlibdir) -l$(RUBY_SO_NAME)-static $(MAINLIBS)
empty =
OUTFLAG = -o $(empty)
COUTFLAG = -o $(empty)
CSRCFLAG = $(empty)

RUBY_EXTCONF_H = 
cflags   = $(optflags) $(debugflags) $(warnflags)
cxxflags = 
optflags = -O3 -fno-fast-math
debugflags = -ggdb3
warnflags = -Wall -Wextra -Wdeprecated-declarations -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -Wundef
cppflags = 
CCDLFLAGS = -fPIC
CFLAGS   = $(CCDLFLAGS) -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection $(ARCH_FLAG)
INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir)
DEFS     = 
CPPFLAGS =   $(DEFS) $(cppflags)
CXXFLAGS = $(CCDLFLAGS) -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection $(ARCH_FLAG)
ldflags  = -L. -Wl,-z,relro  -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,--no-as-needed
dldflags = -Wl,-z,relro  -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld 
ARCH_FLAG = -m64
DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG)
LDSHARED = $(CC) -shared
LDSHAREDXX = $(CXX) -shared
AR = gcc-ar
EXEEXT = 

RUBY_INSTALL_NAME = $(RUBY_BASE_NAME)
RUBY_SO_NAME = ruby
RUBYW_INSTALL_NAME = 
RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version_dir_name)
RUBYW_BASE_NAME = rubyw
RUBY_BASE_NAME = ruby

arch = x86_64-linux
sitearch = $(arch)
ruby_version = 3.1.0
ruby = $(bindir)/$(RUBY_BASE_NAME)
RUBY = $(ruby)
BUILTRUBY = $(bindir)/$(RUBY_BASE_NAME)
ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h

RM = rm -f
RM_RF = rm -fr
RMDIRS = rmdir --ignore-fail-on-non-empty -p
MAKEDIRS = /usr/bin/mkdir -p
INSTALL = /usr/bin/install -c
INSTALL_PROG = $(INSTALL) -m 0755
INSTALL_DATA = $(INSTALL) -m 644
COPY = cp
TOUCH = exit >

#### End of system configuration section. ####

preload = 
libpath = . $(archlibdir)
LIBPATH =  -L. -L$(archlibdir) -Wl,-rpath,$(archlibdir)
DEFFILE = 

CLEANFILES = mkmf.log
DISTCLEANFILES = 
DISTCLEANDIRS = 

extout = 
extout_prefix = 
target_prefix = 
LOCAL_LIBS = 
LIBS = $(LIBRUBYARG_SHARED)  -lm  -lc
ORIG_SRCS = lsapilib.c lsruby.c
SRCS = $(ORIG_SRCS) 
OBJS = lsapilib.o lsruby.o
HDRS = $(srcdir)/lsapidef.h $(srcdir)/lsapilib.h
LOCAL_HDRS = 
TARGET = lsapi
TARGET_NAME = lsapi
TARGET_ENTRY = Init_$(TARGET_NAME)
DLLIB = $(TARGET).so
EXTSTATIC = 
STATIC_LIB = 

TIMESTAMP_DIR = .
BINDIR        = $(bindir)
RUBYCOMMONDIR = $(sitedir)$(target_prefix)
RUBYLIBDIR    = $(sitelibdir)$(target_prefix)
RUBYARCHDIR   = $(sitearchdir)$(target_prefix)
HDRDIR        = $(sitehdrdir)$(target_prefix)
ARCHHDRDIR    = $(sitearchhdrdir)$(target_prefix)
TARGET_SO_DIR =
TARGET_SO     = $(TARGET_SO_DIR)$(DLLIB)
CLEANLIBS     = $(TARGET_SO) false
CLEANOBJS     = *.o  *.bak

all:    $(DLLIB)
static: $(STATIC_LIB)
.PHONY: all install static install-so install-rb
.PHONY: clean clean-so clean-static clean-rb

clean-static::
clean-rb-default::
clean-rb::
clean-so::
clean: clean-so clean-static clean-rb-default clean-rb
		-$(Q)$(RM_RF) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time

distclean-rb-default::
distclean-rb::
distclean-so::
distclean-static::
distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb
		-$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
		-$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
		-$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true

realclean: distclean
install: install-so install-rb

install-so: $(DLLIB) $(TIMESTAMP_DIR)/.sitearchdir.time
	$(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
clean-static::
	-$(Q)$(RM) $(STATIC_LIB)
install-rb: pre-install-rb do-install-rb install-rb-default
install-rb-default: pre-install-rb-default do-install-rb-default
pre-install-rb: Makefile
pre-install-rb-default: Makefile
do-install-rb:
do-install-rb-default:
pre-install-rb-default:
	@$(NULLCMD)
$(TIMESTAMP_DIR)/.sitearchdir.time:
	$(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR)
	$(Q) $(TOUCH) $@

site-install: site-install-so site-install-rb
site-install-so: install-so
site-install-rb: install-rb

.SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S

.cc.o:
	$(ECHO) compiling $(<)
	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<

.cc.S:
	$(ECHO) translating $(<)
	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$<

.mm.o:
	$(ECHO) compiling $(<)
	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<

.mm.S:
	$(ECHO) translating $(<)
	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$<

.cxx.o:
	$(ECHO) compiling $(<)
	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<

.cxx.S:
	$(ECHO) translating $(<)
	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$<

.cpp.o:
	$(ECHO) compiling $(<)
	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<

.cpp.S:
	$(ECHO) translating $(<)
	$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$<

.c.o:
	$(ECHO) compiling $(<)
	$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<

.c.S:
	$(ECHO) translating $(<)
	$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$<

.m.o:
	$(ECHO) compiling $(<)
	$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<

.m.S:
	$(ECHO) translating $(<)
	$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$<

$(TARGET_SO): $(OBJS) Makefile
	$(ECHO) linking shared-object $(DLLIB)
	-$(Q)$(RM) $(@)
	$(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)



$(OBJS): $(HDRS) $(ruby_headers)
PK	}$[�W	q,,-gems/gems/ruby-lsapi-5.6/ext/lsapi/lsapidef.hnu�[���/*
Copyright (c) 2002-2018, Lite Speed Technologies Inc.
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 Lite Speed Technologies Inc 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.
*/


#ifndef  _LSAPIDEF_H_
#define  _LSAPIDEF_H_

#include <inttypes.h>

#if defined (c_plusplus) || defined (__cplusplus)
extern "C" {
#endif

enum
{
    H_ACCEPT = 0,
    H_ACC_CHARSET,
    H_ACC_ENCODING,
    H_ACC_LANG,
    H_AUTHORIZATION,
    H_CONNECTION,
    H_CONTENT_TYPE,
    H_CONTENT_LENGTH,
    H_COOKIE,
    H_COOKIE2,
    H_HOST,
    H_PRAGMA,
    H_REFERER,
    H_USERAGENT,
    H_CACHE_CTRL,
    H_IF_MODIFIED_SINCE,
    H_IF_MATCH,
    H_IF_NO_MATCH,
    H_IF_RANGE,
    H_IF_UNMOD_SINCE,
    H_KEEP_ALIVE,
    H_RANGE,
    H_X_FORWARDED_FOR,
    H_VIA,
    H_TRANSFER_ENCODING

};
#define LSAPI_SOCK_FILENO           0

#define LSAPI_VERSION_B0            'L'
#define LSAPI_VERSION_B1            'S'

/* Values for m_flag in lsapi_packet_header */
#define LSAPI_ENDIAN_LITTLE         0
#define LSAPI_ENDIAN_BIG            1
#define LSAPI_ENDIAN_BIT            1

#if defined(__i386__)||defined( __x86_64 )||defined( __x86_64__ )
#define LSAPI_ENDIAN                LSAPI_ENDIAN_LITTLE
#else
#define LSAPI_ENDIAN                LSAPI_ENDIAN_BIG
#endif

/* Values for m_type in lsapi_packet_header */
#define LSAPI_BEGIN_REQUEST         1
#define LSAPI_ABORT_REQUEST         2
#define LSAPI_RESP_HEADER           3
#define LSAPI_RESP_STREAM           4
#define LSAPI_RESP_END              5
#define LSAPI_STDERR_STREAM         6
#define LSAPI_REQ_RECEIVED          7
#define LSAPI_CONN_CLOSE            8
#define LSAPI_INTERNAL_ERROR        9


#define LSAPI_MAX_HEADER_LEN        65535
#define LSAPI_MAX_DATA_PACKET_LEN   16384

#define LSAPI_RESP_HTTP_HEADER_MAX  32768
#define LSAPI_PACKET_HEADER_LEN     8


struct lsapi_packet_header
{
    char    m_versionB0;      /* LSAPI protocol version */
    char    m_versionB1;
    char    m_type;
    char    m_flag;
    union
    {
        int32_t m_iLen;       /* include this header */
        char    m_bytes[4];
    }m_packetLen;
};

/*
    LSAPI request header packet

    1. struct lsapi_req_header
    2. struct lsapi_http_header_index
    3. lsapi_header_offset * unknownHeaders
    4. org http request header
    5. request body if available
*/

struct lsapi_req_header
{
    struct lsapi_packet_header m_pktHeader;

    int32_t m_httpHeaderLen;
    int32_t m_reqBodyLen;
    int32_t m_scriptFileOff;   /* path to the script file. */
    int32_t m_scriptNameOff;   /* decrypted URI, without pathinfo, */
    int32_t m_queryStringOff;  /* Query string inside env */
    int32_t m_requestMethodOff;
    int32_t m_cntUnknownHeaders;
    int32_t m_cntEnv;
    int32_t m_cntSpecialEnv;
} ;


struct lsapi_http_header_index
{
    uint16_t m_headerLen[H_TRANSFER_ENCODING+1];
    int32_t m_headerOff[H_TRANSFER_ENCODING+1];
} ;

struct lsapi_header_offset
{
    int32_t nameOff;
    int32_t nameLen;
    int32_t valueOff;
    int32_t valueLen;
} ;

struct lsapi_resp_info
{
    int32_t m_cntHeaders;
    int32_t m_status;
};

struct lsapi_resp_header
{
    struct  lsapi_packet_header  m_pktHeader;
    struct  lsapi_resp_info      m_respInfo;
};

#if defined (c_plusplus) || defined (__cplusplus)
}
#endif


#endif

PK	}$[4gems/gems/ruby-lsapi-5.6/ext/lsapi/.sitearchdir.timenu�[���PK	}$[d�C�R[R[+gems/gems/ruby-lsapi-5.6/ext/lsapi/lsruby.cnu�[���
#include "ruby.h"

#if defined( RUBY_VERSION_CODE ) && RUBY_VERSION_CODE < 180
#include "util.h"
#else
#include <ruby/util.h>
#include <ruby/version.h>
#endif

#include "lsapilib.h"
#include <errno.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <signal.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>


#ifndef RUBY_API_VERSION_CODE
#define RUBY_API_VERSION_CODE (RUBY_API_VERSION_MAJOR*10000+RUBY_API_VERSION_MINOR*100+RUBY_API_VERSION_TEENY)
#endif

/* RUBY_EXTERN VALUE ruby_errinfo; */
RUBY_EXTERN VALUE rb_stdin;
RUBY_EXTERN VALUE rb_stdout;
#if defined( RUBY_VERSION_CODE ) && RUBY_VERSION_CODE < 180
RUBY_EXTERN VALUE rb_defout;
#endif

static VALUE orig_stdin;
static VALUE orig_stdout;
static VALUE orig_stderr;
#if defined( RUBY_VERSION_CODE ) && RUBY_VERSION_CODE < 180
static VALUE orig_defout;
#endif
static VALUE orig_env;

static VALUE env_copy;

static VALUE lsapi_env;

static int MAX_BODYBUF_LENGTH = (10 * 1024 * 1024);

#if RUBY_API_VERSION_CODE >= 20700
# if defined rb_tainted_str_new
#  undef rb_tainted_str_new
# endif
# define rb_tainted_str_new(p,l)  rb_str_new((p),(l))
#endif

/* static VALUE lsapi_objrefs; */

typedef struct lsapi_data
{
    LSAPI_Request * req;
    VALUE           env;
    ssize_t      (* fn_write)( LSAPI_Request *, const char * , size_t );
}lsapi_data;

static VALUE cLSAPI;

static VALUE s_req = Qnil;
static lsapi_data * s_req_data;

static VALUE s_req_stderr = Qnil;
static lsapi_data * s_stderr_data;
static pid_t s_pid = 0;

typedef struct lsapi_body
{
    char        *bodyBuf;  //we put small one into memory, otherwise, into a memory mapping file, and we still use the bodyBuf to access this mapping
    int	        bodyLen;	//expected length got form content-length
    int	        bodyCurrentLen;	//current length by read() readBodyToReqBuf
    int	        curPos;
}lsapi_body;

static lsapi_body	s_body;
static char sTempFile[1024] = {0};

/*
 * static void lsapi_ruby_setenv(const char *name, const char *value)
 * {
 *    if (!name) return;
 * 
 *    if (value && *value)
 *	    ruby_setenv(name, value);
 *    else
 *        ruby_unsetenv(name);
 } *        *
 */


static void lsapi_mark( lsapi_data * data )
{
    rb_gc_mark( data->env );
}
/*
 * static void lsapi_free_data( lsapi_data * data )
 * {
 *   free( data );
 } *        *
 */
static int add_env_rails( const char * pKey, int keyLen, const char * pValue, int valLen,
                          void * arg )
{
    char * p;
    int len;
    /* Fixup some environment variables for rails */
    switch( *pKey )
    {
        case 'Q':
            if ( strcmp( pKey, "QUERY_STRING" ) == 0 )
            {
                if ( !*pValue )
                    return 1;
            }
            break;
        case 'R':
            if (( *(pKey+8) == 'U' )&&( strcmp( pKey, "REQUEST_URI" ) == 0 ))
            {
                p = strchr( pValue, '?' );
                if ( p )
                {
                    len = valLen - ( p - pValue ) - 1;
                    /* 
                     *                valLen = p - pValue;
                     *p++ = 0;
                     */
                }
                else
                {
                    p = (char *)pValue + valLen;
                    len = 0;
                }
                rb_hash_aset( lsapi_env,rb_tainted_str_new("PATH_INFO", 9),
                              rb_tainted_str_new(pValue, p - pValue));
                rb_hash_aset( lsapi_env,rb_tainted_str_new("REQUEST_PATH", 12),
                              rb_tainted_str_new(pValue, p - pValue));
                if ( *p == '?' )
                    ++p;
                rb_hash_aset( lsapi_env,rb_tainted_str_new("QUERY_STRING", 12),
                rb_tainted_str_new(p, len));
            }
            break;
        case 'S':
            if ( strcmp( pKey, "SCRIPT_NAME" ) == 0 )
            {
                pValue = "/";
                valLen = 1;
            }
            break;
        case 'P':
            if ( strcmp( pKey, "PATH_INFO" ) == 0 )
                return 1;
        default:
            break;
    }
    
    /* lsapi_ruby_setenv(pKey, pValue ); */
    
    rb_hash_aset( lsapi_env,rb_tainted_str_new(pKey, keyLen),
                  rb_tainted_str_new(pValue, valLen));
    return 1;
}

static int add_env_no_fix( const char * pKey, int keyLen, const char * pValue, int valLen,
                           void * arg )
{
    rb_hash_aset( lsapi_env,rb_tainted_str_new(pKey, keyLen),
                  rb_tainted_str_new(pValue, valLen));
    return 1;
}

typedef int (*fn_add_env)( const char * pKey, int keyLen, const char * pValue, int valLen,
                           void * arg );

fn_add_env s_fn_add_env = add_env_no_fix;

static void clear_env()
{
    /* rb_funcall( lsapi_env, rb_intern( "clear" ), 0 ); */
    rb_funcall( lsapi_env, rb_intern( "replace" ), 1, env_copy );
}

static void setup_cgi_env( lsapi_data * data )
{
    clear_env();
    
    LSAPI_ForeachHeader_r( data->req, s_fn_add_env, data );
    LSAPI_ForeachEnv_r( data->req, s_fn_add_env, data );
}

static VALUE lsapi_s_accept( VALUE self )
{
    int pid;
    if ( LSAPI_Prefork_Accept_r( &g_req ) == -1 )
        return Qnil;
    else
    {
        if (s_body.bodyBuf != NULL)
            free (s_body.bodyBuf);
        
        s_body.bodyBuf = NULL;
        s_body.bodyLen = -1;
        s_body.bodyCurrentLen = 0;
        s_body.curPos = 0;    
        
        pid = getpid();
        if ( pid != s_pid )
        {
            s_pid = pid;
            rb_funcall( Qnil, rb_intern( "srand" ), 0 );
        }
        
        setup_cgi_env( s_req_data );
        return s_req;
    }
}


static VALUE lsapi_s_accept_new_conn(VALUE self)
{
    if (LSAPI_Accept_Before_Fork(&g_req) == -1 )
        return Qnil;
    else
        return s_req;
}


static VALUE lsapi_s_postfork_child(VALUE self)
{
    LSAPI_Postfork_Child(&g_req);
    return s_req;
}


static VALUE lsapi_s_postfork_parent(VALUE self)
{
    LSAPI_Postfork_Parent(&g_req);
    return s_req;
}


/*
 * static int chdir_file( const char * pFile )
 * {
 *    char * p = strrchr( pFile, '/' );
 *    int ret;
 *    if ( !p )
 *        return -1;
 *p = 0;
 ret = chdir( pFile );
 *p = '/';
 return ret;
 }
 */

static VALUE lsapi_eval_string_wrap(VALUE self, VALUE str)
{
#if RUBY_API_VERSION_CODE < 20700
    if (rb_safe_level() >= 4)
    {
        Check_Type(str, T_STRING);
    }
    else
#endif
    {
        SafeStringValue(str);
    }
    return rb_eval_string_wrap(StringValuePtr(str), NULL);
}

static VALUE lsapi_process( VALUE self )
{
/*    lsapi_data *data;
    const char * pScriptPath;
    Data_Get_Struct(self,lsapi_data, data);
    pScriptPath = LSAPI_GetScriptFileName_r( data->req );
*/
    /*
     *   if ( chdir_file( pScriptPath ) == -1 )
     *   {
     *       lsapi_send_error( 404 );
     *   }
     *   rb_load_file( pScriptPath );
     */
    return Qnil;
}


static VALUE lsapi_putc(VALUE self, VALUE c)
{
    char ch = NUM2CHR(c);
    lsapi_data *data;
    Data_Get_Struct(self,lsapi_data, data);
    if ( (*data->fn_write)( data->req, &ch, 1 ) == 1 )
        return c;
    else
        return INT2NUM( EOF );
}


static VALUE lsapi_write( VALUE self, VALUE str )
{
    lsapi_data *data;
    int len;
    Data_Get_Struct(self,lsapi_data, data);
    /*    len = LSAPI_Write_r( data->req, RSTRING_PTR(str), RSTRING_LEN(str) ); */
    if (TYPE(str) != T_STRING)
        str = rb_obj_as_string(str);
    len = (*data->fn_write)( data->req, RSTRING_PTR(str), RSTRING_LEN(str) );
    return INT2NUM( len );
}

static VALUE lsapi_print( int argc, VALUE *argv, VALUE out )
{
    int i;
    VALUE line;
    
    /* if no argument given, print `$_' */
    if (argc == 0)
    {
        argc = 1;
        line = rb_lastline_get();
        argv = &line;
    }
    for (i = 0; i<argc; i++)
    {
        if (!NIL_P(rb_output_fs) && i>0)
        {
            lsapi_write(out, rb_output_fs);
        }
        switch (TYPE(argv[i]))
        {
            case T_NIL:
                lsapi_write(out, rb_str_new2("nil"));
                break;
            default:
                lsapi_write(out, argv[i]);
                break;
        }
    }
    if (!NIL_P(rb_output_rs))
    {
        lsapi_write(out, rb_output_rs);
    }
    
    return Qnil;
}

static VALUE lsapi_printf(int argc, VALUE *argv, VALUE out)
{
    lsapi_write(out, rb_f_sprintf(argc, argv));
    return Qnil;
}

static VALUE lsapi_puts _((int, VALUE*, VALUE));

#if RUBY_API_VERSION_CODE >= 10900
static VALUE lsapi_puts_ary(VALUE ary, VALUE out, int recur )
{
    VALUE tmp;
    long i;
    
    if (recur)
    {
        tmp = rb_str_new2("[...]");
        rb_io_puts(1, &tmp, out);
        return Qnil;
    }
    for (i=0; i<RARRAY_LEN(ary); i++) 
    {
        tmp = RARRAY_PTR(ary)[i];
        rb_io_puts(1, &tmp, out);
    }
    return Qnil;
    
}
#else
static VALUE lsapi_puts_ary(VALUE ary, VALUE out)
{
    VALUE tmp;
    int i;
    
    for (i=0; i<RARRAY_LEN(ary); i++)
    {
        tmp = RARRAY_PTR(ary)[i];
        if (rb_inspecting_p(tmp))
        {
            tmp = rb_str_new2("[...]");
        }
        lsapi_puts(1, &tmp, out);
    }
    return Qnil;
}
#endif

static VALUE lsapi_puts(int argc, VALUE *argv, VALUE out)
{
    int i;
    VALUE line;
    
    /* if no argument given, print newline. */
    if (argc == 0)
    {
        lsapi_write(out, rb_default_rs);
        return Qnil;
    }
    for (i=0; i<argc; i++)
    {
        switch (TYPE(argv[i]))
        {
            case T_NIL:
                line = rb_str_new2("nil");
                break;
            case T_ARRAY:
#if RUBY_API_VERSION_CODE >= 10900
                rb_exec_recursive(lsapi_puts_ary, argv[i], out);
#else
                rb_protect_inspect(lsapi_puts_ary, argv[i], out);
#endif
                continue;
            default:
                line = argv[i];
                break;
        }
        line = rb_obj_as_string(line);
        lsapi_write(out, line);
        if (*( RSTRING_PTR(line) + RSTRING_LEN(line) - 1 ) != '\n')
        {
            lsapi_write(out, rb_default_rs);
        }
    }
    
    return Qnil;
}


static VALUE lsapi_addstr(VALUE out, VALUE str)
{
    lsapi_write(out, str);
    return out;
}

static VALUE lsapi_flush( VALUE self )
{
    /*
     *    lsapi_data *data;
     *    Data_Get_Struct(self,lsapi_data, data);
     */
    LSAPI_Flush_r( &g_req ); 
    return Qnil;
}

static VALUE lsapi_getc( VALUE self )
{
    int ch;
    /*
     *    lsapi_data *data;
     *    Data_Get_Struct(self,lsapi_data, data);
     */
#if RUBY_API_VERSION_CODE < 20700
    if (rb_safe_level() >= 4 && !OBJ_TAINTED(self))
    {
        rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
    }
#endif
    ch = LSAPI_ReqBodyGetChar_r( &g_req );
    if ( ch == EOF )
        return Qnil;
    return INT2NUM( ch );
}

static inline int isBodyWriteToFile()
{
    return ((s_body.bodyLen >= MAX_BODYBUF_LENGTH)? (1): (0));
}

//create a temp file and open it, if failed, fd = -1
static inline int createTempFile()
{
    int fd = -1;
    char *sfn = strdup(sTempFile);
    
    if ((fd = mkstemp(sfn)) == -1)
    {
        fprintf(stderr, "%s: %s\n", sfn, strerror(errno));
    }
    else
        unlink(sfn);
    
    free(sfn);
    return fd;
}

//return 1 if error occured!
//if already created, always OK (0)
static int createBodyBuf()
{
    int fd = -1;
    if (s_body.bodyLen == -1)
    {
        s_body.bodyLen = LSAPI_GetReqBodyLen_r(&g_req);
        //Error if get a zeor length, should not happen 
        if (s_body.bodyLen < 0)
        {
            //Wrong bode length will be treated as 0
            s_body.bodyLen = 0;
        }
        
        if (s_body.bodyLen > 0) 
        {
            if (isBodyWriteToFile())
            {
                //create file mapping
                fd = createTempFile();
                if (fd == -1)
                {
                    return 1;
                }
                if (ftruncate(fd, s_body.bodyLen) == 0)
                {
                    perror("ftruncate() failed. \n");
                    close(fd);
                    return 1;
                }
                s_body.bodyBuf = mmap(NULL, s_body.bodyLen, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
                if (s_body.bodyBuf == MAP_FAILED)
                {
                    perror("File mapping failed. \n");
                    close(fd);
                    return 1;
                }
                close(fd);  //close since needn't it anymore
            }
            else
            {
                s_body.bodyBuf = (char *)calloc(s_body.bodyLen, sizeof(char));
                if (s_body.bodyBuf == NULL)
                {
                    perror("Memory calloc error");
                    return 1;
                }
            }
        }
    }

    return 0;   
}

static inline int isAllBodyRead()
{
    return (s_body.bodyCurrentLen < s_body.bodyLen)? 0 : 1;
}

static inline int isEofBodyBuf()
{
    return (s_body.curPos < s_body.bodyLen) ? 0 : 1;
}
//try to read length as times pagesize (such as 8KB * N)
static int readBodyBuf(const int needRead)
{
    const int blockSize = 8192;
    char *buff = s_body.bodyBuf + s_body.bodyCurrentLen;
    int nRead;
    int readMore = (needRead + blockSize -1) / blockSize * blockSize;
    int remain = LSAPI_GetReqBodyRemain_r( &g_req );
    //Only when not enough left, needReadChange will be changed!!!
    if (remain < readMore) 
        readMore = remain;

    if ( readMore <= 0 )
        return 0;
    
    nRead = LSAPI_ReadReqBody_r(&g_req, buff, readMore);
    if ( nRead > 0 )
        s_body.bodyCurrentLen += nRead;

    return nRead;
}

static VALUE lsapi_gets( VALUE self )
{
    VALUE str;
    const int blkSize = 4096;
    int n;
    char *p = NULL;
    
#if RUBY_API_VERSION_CODE < 20700
    if (rb_safe_level() >= 4 && !OBJ_TAINTED(self))
    {
        rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
    }
#endif
    if (createBodyBuf() == 1)
    {
        return Qnil;
    }   
    
    //comment:
    while((p = memmem(s_body.bodyBuf + s_body.curPos, s_body.bodyCurrentLen - s_body.curPos, "\n", 1)) == NULL) 
    {
        if (isAllBodyRead() == 1)
            break;
        //read one page and check, then reply
        readBodyBuf(blkSize);
    }
    
    p = memmem(s_body.bodyBuf + s_body.curPos, s_body.bodyCurrentLen - s_body.curPos, "\n", 1);
    if (p != NULL)
        n = p - s_body.bodyBuf - s_body.curPos + 1;
    else
        n = s_body.bodyCurrentLen - s_body.curPos;
    
    str = rb_str_buf_new( n );
#if RUBY_API_VERSION_CODE < 20700
    OBJ_TAINT(str);
#endif
    
    if (n > 0)
    {
        rb_str_buf_cat( str, s_body.bodyBuf + s_body.curPos, n );
        s_body.curPos += n;
    }
    
    return str;
}

static VALUE lsapi_read(int argc, VALUE *argv, VALUE self)
{
    VALUE str;
    int n;
    int needRead;
    int nRead;
    
#if RUBY_API_VERSION_CODE < 20700
    if (rb_safe_level() >= 4 && !OBJ_TAINTED(self))
    {
        rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO");
    }
#endif
    if (createBodyBuf() == 1)
    {
        return Qnil;
    }
    
    //we need to consider these 4 cases:
    //1, need all data since argc == 0, we may have all data 2, or not
    //3, need a length of data (argv >= 1), we may have enough data already read, 4, or not
    if (argc == 0)
        n = s_body.bodyLen - s_body.curPos;
    else
    {
        n = NUM2INT(argv[0]); //request that length from currentpos
        if (n < 0)
            return Qnil;
        if (n > s_body.bodyLen - s_body.curPos)
            n = s_body.bodyLen - s_body.curPos;            
    }
    needRead = s_body.curPos + n - s_body.bodyCurrentLen;
    if (needRead < 0)
        needRead = 0;
    
    str = rb_str_buf_new( n );
#if RUBY_API_VERSION_CODE < 20700
    OBJ_TAINT(str);
#endif
    if (n == 0)
        return str;
    
    //copy already have part first
    if (n - needRead != 0)
    {
        rb_str_buf_cat( str, s_body.bodyBuf + s_body.curPos, n - needRead);
        s_body.curPos += (n - needRead);
    }
    
    if (needRead > 0)
    {
        //try to read needRead, but may be less (changed) when read the end of the data
        nRead = readBodyBuf(needRead);
        if (nRead > 0)
        {
            n = ((nRead < needRead) ? nRead : needRead);
            rb_str_buf_cat( str, s_body.bodyBuf + s_body.curPos, n );
            s_body.curPos += n;
        }
    }
    
    return str;
}

static VALUE lsapi_rewind(VALUE self)
{  
    s_body.curPos = 0;
    return self;
}

static VALUE lsapi_each(VALUE self)
{
    VALUE str;
    lsapi_rewind(self);
   
    while(isEofBodyBuf() != 1)
    {
        str = lsapi_gets(self);
        rb_yield(str);
    }
    return self;

}

static VALUE lsapi_eof(VALUE self)
{
    return (LSAPI_GetReqBodyRemain_r( &g_req ) <= 0) ? Qtrue : Qfalse;
}

static VALUE lsapi_binmode(VALUE self)
{
    return self;
}

static VALUE lsapi_isatty(VALUE self)
{
    return Qfalse;
}

static VALUE lsapi_sync(VALUE self)
{
    return Qfalse;
}

static VALUE lsapi_setsync(VALUE self,VALUE sync)
{
    return Qfalse;
}

static VALUE lsapi_close(VALUE self)
{
    LSAPI_Flush_r( &g_req );
    if (isBodyWriteToFile())
    {
        //msync(s_body.bodyBuf, s_body.bodyLen, MS_SYNC);
        //sleep(5);
        munmap(s_body.bodyBuf, s_body.bodyLen);
    }
    else
        free(s_body.bodyBuf);
    
    s_body.bodyBuf = NULL;
    s_body.bodyLen = -1;
    s_body.bodyCurrentLen = 0;
    s_body.curPos = 0;    
    //Should the temp be deleted here?!
        
    return Qnil;
}


static VALUE lsapi_reopen( int argc, VALUE *argv, VALUE self)
{
    VALUE orig_verbose;
    if ( self == s_req_stderr )
    {
        /* constant silence hack */
        orig_verbose = (VALUE)ruby_verbose;
        ruby_verbose = Qnil;
        
        rb_define_global_const("STDERR", orig_stderr);
        
        ruby_verbose = (VALUE)orig_verbose;
        
        return rb_funcall2( orig_stderr, rb_intern( "reopen" ), argc, argv );
        
    }
    return self;
}

static void readMaxBodyBufLength()
{
    int n;
    const char *p = getenv( "LSAPI_MAX_BODYBUF_LENGTH" );
    if ( p )
    {
        n = atoi( p );
        if (n > 0)
        {
            if (strstr(p, "M") || strstr(p, "m"))
                MAX_BODYBUF_LENGTH = n * 1024 * 1024;
            else if (strstr(p, "K") || strstr(p, "k"))
                MAX_BODYBUF_LENGTH = n * 1024;
            else
                MAX_BODYBUF_LENGTH = n;
        }
    }
}

static void readTempFileTemplate()
{
    const char *p = getenv( "LSAPI_TEMPFILE" );
    if (p == NULL || strlen(p) > 1024 - 7)
         p = "/tmp/lsapi.XXXXXX";
    
    strcpy(sTempFile, p);
    if (strlen(p) <= 6 || strcmp(p + (strlen(p) - 6), "XXXXXX") != 0)
        strcat(sTempFile, ".XXXXXX");
}

static void initBodyBuf()
{
    s_body.bodyBuf = NULL;
    s_body.bodyLen = -1;
    s_body.bodyCurrentLen = 0;
    s_body.curPos = 0;    
}
void Init_lsapi()
{
    VALUE orig_verbose; 
    char * p;
    int prefork = 0;
    LSAPI_Init();
    initBodyBuf();
    
    readMaxBodyBufLength();
    readTempFileTemplate();
    
    p = getenv("LSAPI_CHILDREN");
    if (p && atoi(p) > 1)
        prefork = 1;

#ifdef rb_thread_select
    LSAPI_Init_Env_Parameters( rb_thread_select );
#else
    LSAPI_Init_Env_Parameters( select );
#endif
    
    s_pid = getpid();
    
    p = getenv( "RACK_ROOT" );
    if ( p )
    {
        if ( chdir( p ) == -1 )
            perror( "chdir()" );
    }
    if ( p || getenv( "RACK_ENV" ) )
        s_fn_add_env = add_env_rails;
    
    orig_stdin = rb_stdin;
    orig_stdout = rb_stdout;
    orig_stderr = rb_stderr;
#if defined( RUBY_VERSION_CODE ) && RUBY_VERSION_CODE < 180
    orig_defout = rb_defout;
#endif
    orig_env = rb_const_get( rb_cObject, rb_intern("ENV") );
    env_copy = rb_funcall( orig_env, rb_intern( "to_hash" ), 0 );
    
    /* tell the garbage collector it is a global variable, do not recycle it. */
    rb_global_variable(&env_copy);
    
    rb_hash_aset( env_copy,rb_tainted_str_new("GATEWAY_Irewindable_input.rbNTERFACE", 17),
                                              rb_tainted_str_new("CGI/1.2", 7));
        
    rb_define_global_function("eval_string_wrap", lsapi_eval_string_wrap, 1);
    
    cLSAPI = rb_define_class("LSAPI", rb_cObject);
    rb_define_singleton_method(cLSAPI, "accept", lsapi_s_accept, 0);
    if (prefork)
    {
        rb_define_singleton_method(cLSAPI, "accept_new_connection", lsapi_s_accept_new_conn, 0);
        rb_define_singleton_method(cLSAPI, "postfork_child", lsapi_s_postfork_child, 0);
        rb_define_singleton_method(cLSAPI, "postfork_parent", lsapi_s_postfork_parent, 0);
    }

    rb_define_method(cLSAPI, "process", lsapi_process, 0 );
    /* rb_define_method(cLSAPI, "initialize", lsapi_initialize, 0); */
    rb_define_method(cLSAPI, "putc", lsapi_putc, 1);
    rb_define_method(cLSAPI, "write", lsapi_write, 1);
    rb_define_method(cLSAPI, "print", lsapi_print, -1);
    rb_define_method(cLSAPI, "printf", lsapi_printf, -1);
    rb_define_method(cLSAPI, "puts", lsapi_puts, -1);
    rb_define_method(cLSAPI, "<<", lsapi_addstr, 1);
    rb_define_method(cLSAPI, "flush", lsapi_flush, 0);
    rb_define_method(cLSAPI, "getc", lsapi_getc, 0);
    /* rb_define_method(cLSAPI, "ungetc", lsapi_ungetc, 1); */
    rb_define_method(cLSAPI, "gets", lsapi_gets, 0);
    
    //TEST: adding readline function to make irb happy?
    /*rb_define_method(cLSAPI, "readline", lsapi_gets, 0); */
    
    rb_define_method(cLSAPI, "read", lsapi_read, -1);
    rb_define_method(cLSAPI, "rewind", lsapi_rewind, 0);
    rb_define_method(cLSAPI, "each", lsapi_each, 0);
    
    rb_define_method(cLSAPI, "eof", lsapi_eof, 0);
    rb_define_method(cLSAPI, "eof?", lsapi_eof, 0);
    rb_define_method(cLSAPI, "close", lsapi_close, 0);
    /* rb_define_method(cLSAPI, "closed?", lsapi_closed, 0); */
    rb_define_method(cLSAPI, "binmode", lsapi_binmode, 0);
    rb_define_method(cLSAPI, "isatty", lsapi_isatty, 0);
    rb_define_method(cLSAPI, "tty?", lsapi_isatty, 0);
    rb_define_method(cLSAPI, "sync", lsapi_sync, 0);
    rb_define_method(cLSAPI, "sync=", lsapi_setsync, 1);
    rb_define_method(cLSAPI, "reopen", lsapi_reopen, -1 );
    
    
    s_req = Data_Make_Struct( cLSAPI, lsapi_data, lsapi_mark, free, s_req_data );
    s_req_data->req = &g_req;
    s_req_data->fn_write = LSAPI_Write_r;
    rb_stdin = rb_stdout = s_req;
    
#if defined( RUBY_VERSION_CODE ) && RUBY_VERSION_CODE < 180
    rb_defout = s_req;
#endif

    rb_global_variable(&s_req );
    
    s_req_stderr = Data_Make_Struct( cLSAPI, lsapi_data, lsapi_mark, free, s_stderr_data );
    s_stderr_data->req = &g_req;
    s_stderr_data->fn_write = LSAPI_Write_Stderr_r;
    rb_stderr = s_req_stderr;
    rb_global_variable(&s_req_stderr );
    
    /* constant silence hack */
    orig_verbose = (VALUE)ruby_verbose;
    ruby_verbose = Qnil;
    
    lsapi_env = rb_hash_new();
    clear_env();
    /* redefine ENV using a hash table, should be faster than char **environment */
    rb_define_global_const("ENV", lsapi_env);
    
    rb_define_global_const("STDERR", rb_stderr);
    
    ruby_verbose = (VALUE)orig_verbose;
    
    return;
}

PK	}$[�7Zw��-gems/gems/ruby-lsapi-5.6/ext/lsapi/extconf.rbnu�[���require 'mkmf'
dir_config( 'lsapi' )
if ( have_library( "socket" ))
    have_library( "nsl" )
end
if RUBY_VERSION =~ /1.9/ then
    $CPPFLAGS += " -DRUBY_19"
end 
if RUBY_VERSION =~ /2/ then
    $CPPFLAGS += " -DRUBY_2"
end 
create_makefile( "lsapi" )
PK	}$[���F����+gems/gems/ruby-lsapi-5.6/ext/lsapi/lsruby.onu�[���ELF>�@@;:

.01-2,3����fD���H���ff.���H�H���H+���H���HO��D��H������1��f���1��f���ATI��H��US��Hc��Hc�L��H���H�=H��H���[�]A\�ff.���H����H��H�=��H���f���H��H�=�Hc5;5H�=|6�H������H���H���fD���f����?��I�H�=���H���H+��9�M�1���~+H��Hc�Hc5H5���~H���f��ff.�@��H��H�=����tH�H��H�D��H���ff.���H��H�=�H�H�����H��H�=�H�H�����H��H�=�����tH�H��H�����SH��H�\$H�t$H���H���1�H���H��[�ff.�f���AWAVAUA��ATI��U��SH��H���<Q��~v<R��<Su"�H�=H���������@Mc�L��L���Hc�H��I���H�=L��H���H���[]A\A]A^A_�fD<Pu��
H�=H�������u��ƀULc�u��H�=H��������t����?H���I��H���H��A��L)�A)�Mc�H��L��H�L$��	H�=H�$�H�$H�=H���H�L$L��H����H�=H�$�H�$H�=H���1�A�??L����I�L����H�=I���H�=L��H������fD�
H�=H��������r����:�i������@A�L�%�Q���fDO�<4L��E1�����=�t1��@H�H����=����t�USH��;=��H�=�H��H����Ń����H���H���Hc��H�������E1�A���H��1��H�H��������1�H��[]�f.�Hc���H�H��u�H�=����@�1��H�=������fD��8�H�پH�I��H�H�81��H�����N���H�=������1���f���AU1�ATUH��S��H���V������������-��+Hc�D�%�I�Ņ�t"D)�A�DI�D9�uD��������H��L��[]A\A]ÐD)�Hc5H��H5Hc�����H��L��[]A\A]�@H�}@��u&���xU�-�)�9�O���T�����ؐD9�Hc5L��DN�H5Ic��D%�U���@H��A�[L��]A\A]�ff.��AWAVL�5AUATUSH���f�D9-~N��}���D�-M�&�H�Hc=D��)�I��L�Hc�H���H��t�L)�D)��XHc�H���I�ą�~Hc5H��H5H���H��L��[]A\A]A^A_�f���H��1��a�����tH���#����H���fD���SH������2f����H����9}1������uٿ��f�H��[�ff.���AUATUH��SH��dH�%(H�D$1�����H��E1�I���G@H����I9�}HH���H��uj�� tUH�CJ��H��L��I��H�$�H��� u�H�CI9�|�H�L$dH3%(�uVH��[]A\A]�@H�C �f.�H���H���H�=�H��H��H�$���@��1��f���USH��@��t��fDH�����t�H���H��u�H�t�H��H�_ H��@��uH��uNH���H�H�k�� t*H�pH�PH��tEH�;��H��H�[]H�D�f.�H��H�p����H�H��H�у�H��t��@H�=H�T$H�4$�H�T$H�4$����SH������H��[�ff.���SH���H��H������[Ð��UH��SH��H��dH�%(H�D$1���uH�����tH�H�ƒ�H��tsH�������D$@��uyH�����tpH�E��H��ucH�}t\H�E H�t$�H�8�PH��H�����HD�H�L$dH3%(u_H��[]Ð�� u+H�S���y�����D$@��t��H���f�H�{�R���H�SH��u������@SH��dH�%(H�D$1�H�H�$H�H��u%H�D�H���H�H��t�H�=H��H���H�D$dH3%(uH��[��ff.�f���USH��H�=�����tyH�=H��t�H������H���9uI1�H�����H�-H�;H��H�u�H�uH�;H���H�H��H��[]�D�H�H��u'H���H���H�H��t�1�1�H�ƿ��h���f���H9tH����ATUH��S���L� �H�5H�=H���L� H�H��u%L�%D�L���H�H��t�H�=H���H��[]A\����AWAVAUATUH��SH�����C���G�H��L�-L�d��tf�H�������H��ubfD�H��I��H���5���I��� ��M�~M����I�FA�|�
tH�H��H�0���H��L9�t[H�;@��t�H��u�fDH�=��H���f.�H�����u5H��H��H��H�=�����L9�u�H���[]A\A]A^A_�fD��t��.���fDM�~H�����H���L���I��� �0�����f.�H�H��H�0�.����ff.����AVAUATUH��SH��dH�%(H�D$1�������I��H�6A���L�5�H�H�������H��u4H�����A9�~NH�H�0H��tH�����I�t�H��@��t�H��u�@�L���H��H���h���A9��H�H�0H��u;H�L$dH3%(�uPH��[]A\A]A^ÐH���H��t��a����H�������fD�I��A�H��H�$�����f���AUATUSH��������H�=H�H���H��t8�
1�H��H���H��~�MH���H�������-H�=�H��H��tH���H��H=��`�Xfof�)H�=1��H��t1��
H��1����@��H�=��H�=��H����H��������H�H�W�H�H�H�H�H�H��u L�%�L���H�H��t�L�%H��I�<$�H�5H�H��u4L�-f.��L���H��H�H��t�H�1�1�H���H�=H���H�=��H�=I���H�=L��H����H�5�H�=�I�4$H�=�1�H�F���H�5H��H������H�=1�H�(�H�5�H�=�H�Y���H�5�H�=�H����H�5�H�=�����H����H�5�H�=�����H����H�5�H�=�����H����H�5�H�=�H�~���H�5�H�=1�H�B�H�5�H�=1�H�&�H�5�H�=1�H���H�5�H�=�����H���H�5�H�=1�H���H�5�H�=1�H���H�5�H�=1�H���H�5�H�=1�H���H�5�H�=1�H��H�5�H�=1�H���H�5�H�=1�H���H�5�H�=1�H���H�5�H�=1�H��H�5�H�=�H�`�H�5�H�=�����H�����H�5�L�%H�=�H�{�L���H�-H�
H�=H�P H�H�JH�*H�H�H�H�H��H�=L��H���H�
H�=H�P H�H�JH�*H���H�(�H��H�1��B���H�5H�=�H�3H�=��H�(H��[]A\A]�DH�P�H��H�=�H��wH�H�.XXXXXXH�(���H�t+��H�=�����u��b����H�=1�H���H�5�H�=1�H�l�H�5�H�=1�H�0�H�5�����H�=��R����H�=�H���6����B���fD�mH���H���^����KH���H��t��
�-�G����kH���H��u�-�*����GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign/QUERY_STRINGREQUEST_URIPATH_INFOREQUEST_PATHSCRIPT_NAME%s: %s
ftruncate() failed. 
File mapping failed. 
Memory calloc error
[...]RSTRING_PTRreplacesrandSTDERRreopennilLSAPI_MAX_BODYBUF_LENGTHLSAPI_TEMPFILEXXXXXXLSAPI_CHILDRENRACK_ROOTchdir()ENVto_hashCGI/1.2eval_string_wrapLSAPIacceptaccept_new_connectionpostfork_childpostfork_parentprocessputcwriteprintprintfputs<<flushgetcgetsreadrewindeacheofeof?closebinmodeisattytty?syncsync=RACK_ENVH�=��%GATEWAY_Irewindable_input.rbNTERFACE/tmp/lsapi.XXXXX�_a)b�)X%J'Q(�cint�)5�������������
)�1�3�6	�7	�8	�9	� :	�(;	�0<	�8=	�@@	�HA	�PB	�XD�`F�hH�pI�tJ�xMQ�NX�O��Q��Y
��[��\��]��^	<�_
>�`��b��
d+"�
��)�"�"���)���?�M��&�&�&�&��`GU`�`a���edw�7��7!�$�2�7�;�7��\)�L�����L����7� 4� 6	� 7	���!g)�fID!h),5TO4@"@x"M�"X�,5p3	

,5	�L,�	�b  @`�######## #@#� @� @g����x#@#,5��# � ,5��h
�A�A�H�	2len��Bptr�Baux�i	Bary*�.);�RA�A,@(�|I�OBas-.,5e�# �,5��;�
�/��/��H�		2len��2aux��2ptr�	�;�B	/��jary�R	�R	)B	@(��	I�O2as� 	l�	�	k�	+<@(|�	IO��	��	�< ��,5#R
�
�$

H
�o

��
�o
*
�
0*
<8*
+�@H(
��

��	
��	
��

��	
��
 J>�
+��
<�
)
l(
T.m
WO*
^�
*
g�*
j< $8�$9�$:�$;�$<�$=�$>�$?�$@�$A�$C�$E�$F�$G�$H�$I�$J�$K�$L�$M�$N�$O�$P�$Q�$R�$S�$T�$U�$V�$W�$X�$Y�$Z�$[�$\�$]�$^�$_�$`�$a�$b�$c�$d�$e�$m�$n�$o�$p�$q�$r�$s�$t�$u�$v�$w�$x�$y�$z�${�$|�$}�$~�$�$��$��$��$��$��$��$��$��$��$��$��$��$��$��$��$��$��$��$��$��%3�%>�%K�%T�%]�&)�_lGa',l��G}'2���)�(i�(q�(t�(��(��(��(��(��n5),�	

;)q�/)s�/)t�)k$)m
�)n
�)o
�)p
�)u�,)��)� �)�
�)�
�)�
�)�
�)�
�)�
�)�
� )�
�$)�
�(�)��)��)�
�4��)��))�>)�
�)�
�)�
�)�
�)�f)�
�)�
�)��)�"�)�">/�1�2�3�4�o	:�<�=�?�@�B�C� E�(F�0G�8I�@J�HK�PL!�XO`PhQpRxT'$�V'*�W'0�X'0�Y'��Z'��\'6�]'<�_��`��a��b��c��d��e��f�g�h��i��Ck'BCm'f(Cn'R8Co<	"�**<*>��$����R)pcQ)�q�sc�J��+�+�+�+�+<+-�+.�,Q-��-��-�
���)
�""%%/"::D"OOY.��.��.�O.�4.��dd�p.*.�*.O*.�*.�*.���"%"00:"EEO"ZZd"ooy"������*�?�T���� �5�J�_t�.�.O.!(.{�;.��/.�
�/.��/.����)��)��).��.�	[�.��.��J)�)@7/7/<"�<#�$�	(�	*�	,�	.�	9�2req;�2env<�=
cJ
+�+�+>�>�@�	B�	C^	E�	<F^G�	I�K�L�M�N�O�Q�	�Q)�R
	�{q�'	r4S�,'%6�3p7�%8	�=,_DZ*�	[G,Z*zGmG�G%�G�G	,\U|T3EZ%[�8[<'%[�EAD[�	[G[zGmG�G%�G�G	,\U}T7	8\Q0R0E�%�
�	D\THQ	R|E�%��	D\THQ	R|RH':
l'<z'�'
M
y)M	P\UsT0Q:\\�U	i\�UsTMi\�UsTmi\�UsTK	i\UsTk
R'= `'
�L(�	M�L	�\U	TsQvR
(�L*	��L�L\\�U		�\Us
M@S )M	P\T0Q:�\\\ U	�\�\\\� U	�\�\�\� U	�\!U	T7�\9!U	TA]Q!Q}~!U	T	Q1]�!U	�!T	Q	R0�!T	Q	R0$"T	Q	R1Q"T	Q	R1"T	Q	R	��"T	Q	R	��"T	Q	R	�#T	Q	R15#T	Q	R0b#T	Q	R0�#T	Q	R0�#T	Q	R	��#T	Q	R0$T	Q	R0D$T	Q	R0q$T	Q	R0�$T	Q	R0�$T	Q	R0�$T	Q	R0%%T	Q	R0R%T	Q	R0%T	Q	R1�%T	Q	R	��\�%U	�\�%U	]],].B8]>&U	8]]&U	]�&T	Q	R0�&T	Q	R0�&T	Q	R0E]'U		\\U	�<'sA','t-
S"
l'p$�S
�'n	�p����'� ��-
�9�8��TD	*�	$��g�s(� �K�-�	R]^]j]$����(>�"�U>�-�Tu���(�����(�!�$���')>�"�U$��+��)>��U�F�
&�F$��U��*��3str��(�*
�*�*R�-�
�,��*�, �,�, �,�,wP�*U�,s�-w]���*�!�$y�4��,y�y*
y6�3str{�3n|	�%}	�%~	�
lK�
�+}K�KVhL��+yL�]�]�-�]',Us $ &�,?,U|�]c,U}Qs $ &	�]U}Q| $ &J��,J �strL�8M�nN	�pO�$5�a��-5"�v7� %8�%9	�%:	�8;	�
�F;�-&�F�]L0�L+�W���-fd�	�W���-fd�	�sfn��L��$��2��.� �3ch�	�
PK��.aKX�K��K�K�K�K�K�K�]$���</�!�R]$����/4out�!�4str�,�	53UsT�T���/���*
out�6�i�	�8��l�I0aryl#�outl.�l7�tmpn�io
�$c���0c�c,
4outc8��]�0U�UT�T	53Us$?�7�53?�?,
4out?8�3iA	�DB��@
GT�1 G-G	�\U~T3
KQ�2K5�K�k2�K(�L%:2�LLL?&K�7K-CK53�2Uv53�2Uv533Uv533Uv�]�]w3���n83!�4str3-�%5^3len6	�
�G7�5�G"J:<J1JYGJ
RJ�	V5qJdJ}J
z�J�J
�K\5�K(L�4L�L%�L&K_7K-CK(�G�"�5�G	�]T<
K9	m6K5�K�6�KLL?&K�7K-CK
NI;;I7&`InI�&�I
�I�		7�I&�I�I	.J&JM�I �I�I�&�I�I
!I;)�7&3I@I
nI��7&�IM�I �I	�]U	
PK<X8aKX�K��K�K�K�K�K�K		^U�Tx'���>'�4c'+�ych)
��W%*^
I)�<I5RJK	P:qJdJ}Jz�J�J(�K\�9�K(L�9L�L%�L&K	_7K-	CK5lKN�:}K�KVhL��:yL�]�:Us�]5NIK)	<`InI��I
�I�	�;�I�I�I	.JJN�I �I�I��I-�Iz!IL3I@IZnI�n<�IN�I �I	�]U	
�G+z>�G"J:<J1JYGJ
RJ�	*>qJdJ}J	z�J�J
�K\�=�K
L�=L�L%�L&K_7K-CK(�G�"^>�G	�]UvT<�>T�WQ1�]$�
��>>#�U$�3�e?+�4str7�^9?Us#^Q?Us	0^T09�� ��?'�,�<^9�� ��?'�+�I^9��-�1@'�,�V^9����B'�$�[pid�	�=I�AF�
�<�
<'F�
�=3nA�
�	?[G3�
zGmG�G%�G�G	,\UsT5	8\U8Q0R05B�	�A!B.Bc^�AQs	o^Qs{^j]�\{�
.B.�)^|�
��jC=S\CF���zC�`F��=1BC��	?[G1�zGmG�G%�G�G	,\UsT7	8\Q1Rw�]�zC)jC9��B�dD'�)�'�3�'�H�'�T�\arg�#<�^+DU�QT	�R $ &�^ODU|Ts $ &	]Qv9k���F'k(�'k2�'kG�'kS�\argl"<[pn�}leno	��^'EU|T~�^KEUsTv $ &]cEQ|�^�EU|T?�^�EU|T���\�EU	T9]�EQw�^�EU|T���\"FU	T<];FQw�^YFUT}�\}FU	T<	]Q}~a

��F'a&^�^:��F.�?�:�G.�<�
s�;Gstr
s!�len
u
�
d�[Gstr
d�"��Gptr"�Gstr"*����Gstr�len>!
�Gobj
�8<�Gobj8�'
(Hary'�tmp+��	FHa��o	dHao$�!Y�HaryY�*��Ha*�!��Hary�f�k�Ixl�n�p	�:I�!I)xI�!��NIstr��ptr��!��nIstr��!�R�Istr��T8�R!���Istr��f��!	,�Iobj	,�	, �!	��"Jobj	��	�!���RJv��t�*x��!w}Jobjw�tw+x!E�JobjE!�tE;x!2�Jobj2�!�Jobj�!Kobj�:�x&K)obj��0�xPK)obj��6ret��:��lK)v��:���K)x��6ret�
�0o��K)io�6ju06kv06lw�6mx�6ny�!Lobj�0� L)obj��0�>L)obj��0�hL)obj��<��0��L)obj��0��L)obj��0��L)obj��O���L.��.��O\�M.\�.\��i�7Mi�Od�cM.d,.d<��1�*��M]�*U1�(��M]�(U1�-��wP��-(�F��M&GK�-
�-�DP�-
�-pO�-�-
7M�	�NTMHM	�^T1Q	Rs�^�NU	�^OUs�^(OUsj]@OUs�^�^	j]Us�^�OUvTs_�OU0TsQ3R1XvY0_�OUvE]�OU	_PUvE].PU		_Uv_[PT1	E]U	1�,��lQ�, �,�,�,�,K�-_
�,QU
*_9QU|"TvQ	R1�]QQUv	�]U|Qv1�,*��Q�, �,��, �,��,�-^wPU�,�U1�/��V	00#0_00�@=0
�HwS�H(�H/�R�H-�H�I.	�I�I�I	.JJ
�GyU
HH(�H+�S�H�H�H	o_Us(H,:H
dH�	fTvH�I	^�I�I�I	.JJ
FH��TXH�Is	�I�I�I	.JJ	|_Us
�/l�U	0#00_00�@ =0
Gs�U G-G	�\U	T5	�_U1TwQv�_VU1TwQv�]1�'���W�'�'�' �'�'��'�'�'�'��'1QW[G1	*zGmG�G%�G�G	,\U|T6]]8]�WU	]^8\Q�UR�T1�/t�,\�/�/�/ �/ �/Z�/�\&�/&�/&�/�/�/
!I�9Y3I@I
nI�#Y�I
�I�	Y�I�I�I	.JJM�I �I	�]U}
K�:ZK5�K��Y�K(�L%�Y�LLL?&K�7K-CK
NI�$V[`InI��I
�I
�	�Z�I�I�I	.JJN�I �I�I��I-�I
G
��[ G-G	�\U	T3	^53�[UvT~53�[Uv	�_U	Qv	53Uve0v��
w`1P�/tmp/lsapi.XXXXXX`1P
�.XXXXXX
2�{
n
t
�
3�4'

�5�6C
7�5k
8


�9L
3
:�FU

$

j�	�;+<��
7�
�

G
F
Q0[
�

}��
^
?2�=�Z'�
�
9+%

2�
�99
a

2qP6�4/opt/alt/ruby31/include/ruby/internal/core/rarray.h
$

%y
>���B1�B
:;9I84:;9I?<(��1I41�B	��1
1R�BUXYW��1:;9I
.?<n:;9&I7I��.?<n:;9:;9IUI1R�BXYW1R�BUXYW(!I/4:;9I:;9.:;9'I $>4:;9I:;9I:;9I�B 41!.:;9'I 4"<#($.:;9'I@�B%4:;9I�B&1':;9I�B(1R�BXYW):;9I*
:;9I8+I,>I:;9-.:;9I/
:;9I0.:;9'I 41.1@�B2
:;9I834:;9I�B4:;9I�B51R�BUXYW64:;9I74:;9I?<84:;9I9.:;9'I@�B:.:;9'I ;:;9<4:;9I=>:;9I?1R�BXYW@�:;9A
:;9IB
:;9I8C
:;9I8D4:;9IEUF4:;9IG!H:;9I
:;9I�8J'IK1R�BXYWL.:;9I M1UN1O.?:;9'I 4P6Q!I/R1R�BUXYWS.:;9 TU��1�BV1R�BXYWW.:;9I X1R�BUXYWY
1Z1UXYW[4:;9I�B\:;9I�B]1^���B1_41`.?<n:;a%Ubc$>d:;9e&f:;9Ig(
h:;9i:;9j
:;9Ik'l�:;9m
:;9I�8n>I:;9o:;9p:;9q4:;9I?r.?:;9@�Bs!I/
t.:;9 u.:;9'Iv4:;9Iw.:;9'I@�Bx.:;9'IU@�By4:;9Iz1UXYW{.:;9' |.:;9@�B}4:;9I~.:;9'@�B���B1�.:;9' 4�
:;9�.?:;9'I ��41
�41�41�1�.?<nVpPPP0�V0�V0�
�
�
�3�0�0�0�0�
�
�
�7�PPPPSSPSPS�SS�S
�
��
�PU�U�USPUUSPSS
�
�0�0�US�U�S�U�S�U�S�U�TV�T�V�T�V�T�V�T�Q�Q�P]P]P]SSP\v|�v| $0 $+(�v $0 $+(�v $0 $+(�v $0 $+(�PPUUPPUUu�@��U�� $ &"�� $ &"�PQQU�U�PPP	p $ &�P	p $ &�PPPPPU�U�USPT�T�U�U�T�T�QS�Q�UU1�T]T�T�WQV�Q�VQV0�SS0�
�3�
s $ &3$}"
s $ &3$}"
s $ &3$}"
s $ &3$}"
s $ &3$}"
s $ &3$}"
s $ &3$}"
s $ &3$}"tO�U�U�U�U�U�U�T�T�T�T�TPSSPU�U�U<�U�U�U<�<�UU
<�<�
UUUUUUUuO�UPTTPTPTqO�

 �

 �Q
TTTw
P
	p $ &�
	p $ &�

p $ &1$#�	
p $ &1$#�P

p $ &1$#�P
p $ &1$#�PUV�U�UVUVUUVTS�T�SSPTSSSSS5�TS5�TSTSTSSpO�SSPPSSSSS

 �
S

 �
S	S	PpO>$�p>%O�SSSQQQSVV<�<�VV<�<�VV		<�<�		VVVVVVVVvO�VU�U�TU�U�U�U�U�U�U�U�PP	
�
�
�5�S
�
�
�7�U\�U�TS�T�Q�Q�R�R�X�X�USSSSTV�T�TVTVTVQ\Q\Q\R]R]R]^R]^X�X�X�X�X�X�P_P_U�U�VV	��V	��PVVPVPSS
�pUP\PSPP��,�U�U�US�U�SU�U�TV�T�VTVQ�Q�Q�Q�]}�]]SSSPpH<$�p?%3�s?%3�
 �S
 �SSSSS��
+�
+�SSSS	@E$�	S@E$�SSS	
 �	S	
 �	SU�U�Q�Q�TV
�5�USQ�U�TVR�T�Q�Q�Q�Q�VR�T�SQ�U�\
�
�
�6�U�U�U�U�T�T�T�T�QV�Q�VQV0�UP^P^^^^__^^
 �^
 �^UUUUUUUUuO�^^^^^^

 �
 �
^^	
 �
 �	^^^PpO>$�P
�3�<��l�
/opt/alt/ruby31/include/ruby/internal/arithmetic/usr/include/bits/opt/alt/ruby31/include/ruby/internal/opt/alt/ruby31/include/ruby/internal/core/opt/alt/ruby31/include/ruby/internal/intern/usr/include/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include/sys/opt/alt/ruby31/include/ruby/usr/include/netinetlsruby.clsapilib.hint.hlong.hstdio2.hspecial_consts.hrarray.hrgengc.hfl_type.hstring.hrdata.hvalue_type.hrtypeddata.hrstring.hchar.hsymbol.hstdlib.hstring_fortified.hstddef.htypes.hstruct_FILE.hFILE.hstdio.hsys_errlist.htypes.h	stdint-intn.hstdint-uintn.hunistd.hgetopt_core.hmath.htime.htime.h	value.hrbasic.hrobject.hglobals.hio.hruby.hutil.h
version.h
lsapidef.hstruct_iovec.herrno.hsockaddr.hsocket.hin.hsignal.heval.h<built-in>string.hvariable.hgc.hhash.hmodule.herror.hvariable.hmman.h	iterator.hsprintf.hparse.hgc.hthread.h	�
J��K�?�K�|	#t>��iK>�K�K�{�KY;./<X� ���KJ��O
OtY��KKtY�}�t	jp	2]��T�	w��~�.��}<t	�g�}	�#�}.�-Ms

J)u<t
tY	Kit��Kt
JtYZ�~	�~.��}JY�HZ�~.KKtYv�KKtYt�K	Kt�	[u �		Jw		XwX		X<Z ���~.K
�<
%XXt<.X�<h�I�
,JX�.X
^f)�X�.%X��=�(3<(J3<f88g;g
c9X�.X� "fp K;<�f/�/	RX�}	�t	�	�
0Yfq�\�:>X.	���t��" �u�t/u* �uZ�
^�	�%gf�u	Z�3	X
�|t	���|<
tXX����u��Kt	.t.	�X�	�f.	f*8u�t�		X	�	��	o.@5<	t-<	t�i
J�J	[X
�|J

o	j[	�	L( ff	�|X<
�9=
t;
K1
t��QJ/f J�	�L2	�
�=t<U�MtUX&<<
�`	0<f@�	L5	t-<	t�j�<T�Kt	Jt X��K
b y<�
�~
���	
U�~
�	��	tZ��J�}���	?��gJ<�	Z��~
���~K	�M<�x]	�M�~	YJ	K#�
L	K"U�	�M<�~	\"J�_Jf	y��	�]	
�qXtX	�w
�	KY.	��K�E	K
�n> Rff�X�}� ��
��~
�ff
�
��	y�<J�"nJ f� �X	4<X=�Jb	�MM	Y�~J�JT	�O	N)X�~Y�	�~��~J.� �~ X�	��V!J_J>	T	�O	RX	"X	�}R=<�ff	�f�X�.K =YJ��K =X�fA.���~�	K
�n <�. ��
��~=
�ff	�}�
p
;	�X
�K
�E	K
�n �f ��
��~
�tf
�
��	y�Jq��J �.b	�MM	]V	%�|J���|<
�K
�E	K
�n f��	%�|	��J)	�}[.�X	�X���tsX	�o�s\�g(K
ht�	\t
Y	Z��	�	Y	�d	.
btZY�	v
y�
g�tsX�	o�s\
���K�p��	X	=Z�	vZX	>*�|tsX�	o�s\��  *X	�}K
�	��f�} ��
_
�	�	Y;	=��T	�M<M	�J)�	WJe
�j J	Z�~<"n f
b
��
�q<�x	�~�Rf	�_\sX�	g�1�X		K"`b	�M	RVJ>	X-�`b	�M<MJ	O�<Y��.���	>�~�
�X�v ��
_
X�t�	Z�~�"�
h�	��"n f
b
��
�q��ww�X
�~��k�	��R	�f j�Y:g<	KX��K�Y
sbXt�v
�
SY�|X	���|X<	�
L��/�$
e�X�<
��z
<�
�zt�	yt5Y�|X���|.X�z�
	Zrh	Y	��	�*�{tsX	to�s\��{.�tu�{sX	o�s���qwZ7v�-uY�����������������������
"u{
wtJvI
;t��Z�vpJuI==[X=XvXuv0�X>f�~��z
t�	g�z
��t�	���
d(v�#G< ���Y(�%�[$		�t[�|
rb_mWaitWritable_sys_errlistm_pScriptFileRUBY_Qnilrb_eNoMemError_unused2wrap_struct_name_filenorb_cMethodrb_obj_wb_unprotectrb_eSyntaxErrorm_cntUnknownHeadersH_AUTHORIZATIONsockaddr_isoblockSizem_pIovecEndstrcpym_pRespBufPosRUBY_FL_EXIVAR__uint8_tdmark_BoolRUBY_DATA_FUNCm_pktHeaderrb_eIOErrorm_bytesRARRAY_EMBED_LENm_pHeaderRSTRING_LENrb_data_object_get_shortbufsockaddr_inrb_cFilerb_eSignalunlinklsapi_dataRUBY_T_ARRAYrb_eKeyErroradd_env_rails__environlsapi_addstrrbimpl_rtypeddata_pruby_robject_constssa_datauint16_tm_totalLensin_zeroRUBY_FL_UNTRUSTEDrb_eZeroDivErrorin_port_t_flagslsapi_getscallocm_respPktHeader__off_tcreateTempFiledfreeRUBY_T_IMEMOrb_global_variable_lockROBJECT_EMBED_LEN_MAXRUBY_T_UNDEFrb_cStringrb_eEOFErroratoim_pHttpHeaderLSAPI_GetReqBodyRemain_rm_pScriptNamerb_mKernelm_pEnvListrb_output_fsint32_t__fmtsa_familym_specialEnvListSizemaskrb_cModulesockaddr_ns__u6_addr8RUBY_T_FALSErb_cIntegerRUBY_T_FILE_IO_write_endm_iLensockaddrrb_cTrueClasss_addrRUBY_FL_USER0RUBY_FL_USER1RUBY_FL_USER2RUBY_FL_USER3RUBY_FL_USER4RUBY_FL_USER5RUBY_FL_USER6RUBY_FL_USER7RUBY_FL_USER8RUBY_FL_USER9nameLenLSAPI_Postfork_Childfreerb_fsm_requestMethodOffRUBY_T_COMPLEX__tznamedata_struct_objrb_eEncCompatErrorruby_special_constsrb_intern_constvalLenRSTRING_EMBED_LEN_SHIFT__stack_chk_failruby_rarray_flagsruby_descriptionsin_familyRStringm_fdListenMAX_BODYBUF_LENGTHrb_data_type_tm_statusm_reqBodyLenrb_eNameErroroptargneedReadrb_eRegexpErrorrb_cBasicObjectRUBY_T_STRUCTrb_cRationalrb_cFloattyperb_cStatsys_errlistRSTRING_EMBED_LENin_addr_tbasicRUBY_QtruedaylightLSAPI_ReqBodyGetChar_rpKey__uint16_tsin_portRUBY_T_STRINGrb_cFalseClassm_flagRARRAY_EMBED_LEN_SHIFTreadMaxBodyBufLengthCheck_Typeembedm_pQueryString_chainRUBY_T_MODULErb_eArgErrorrb_eInterruptrecurrb_funcallvrbimpl_intern_constRUBY_FL_SINGLETONsockaddr_ununsigned charcapanReadm_cntSpecialEnv_IO_lock_tRUBY_T_ZOMBIEfloatLSAPI_key_value_pairLSAPI_ForeachHeader_rrb_stderrlsapi_eachm_cntHeadersrb_str_catbodyBufRARRAY_EMBED_LEN_MAXRB_TESTRUBY_T_FIXNUMrb_eSecurityErrorisEofBodyBuflsapi_processlsapi_flushRARRAY_EMBED_FLAGoff_tchild_statusRUBY_SYMBOL_FLAGrb_mComparableH_X_FORWARDED_FOR__fprintf_chkm_queryStringOffH_TRANSFER_ENCODINGRUBY_FLONUM_FLAGrb_stdoutruby_rstring_flagsH_CONTENT_LENGTHrb_cTimeruby_engine_IO_write_ptrrb_output_rsrb_eNoMatchingPatternKeyErrorlsapi_packet_headerLSAPI_ReadReqBody_rrb_eFatallsapi_http_header_indexrb_funcall_argcsTempFilerb_funcall_argsstrcatclosesharedlsapi_printfRUBY_T_OBJECTFILEH_COOKIEs_fn_add_envmunmapRSTRING_EMBED_LEN_MAXbodyCurrentLenLSAPI_Accept_Before_Forkrb_cNumerics_req_stderrrb_cHashsize_trb_array_const_ptrH_CONNECTIONgetdate_errrb_rsuint8_tH_CONTENT_TYPERArraylsapi_markm_headerLenRUBY_ELTS_SHAREDrb_data_type_structperrorlsapi_envruby_release_daterb_cDirrb_unexpected_typesetup_cgi_env_IO_save_baseioveclsapi_eofrb_array_const_ptr_transientenvironlsapi_child_statusreadTempFileTemplaterb_str_newsockaddr_x25rb_eLoadErrorsin6_flowinfom_pIovecToWriteorig_stderrm_respHeaderLen_wide_dataH_IF_MATCHRUBY_FL_PROMOTED0RUBY_FL_PROMOTED1__in6_uH_ACC_CHARSETruby_versionorig_stdout__streamsigngamruby_copyrightm_reqBufSizerb_eExceptionrb_yieldadd_env_no_fixRUBY_T_FLOATRUBY_T_CLASSftruncateruby_fl_typelsapi_requeststrerrorrb_cComplexfprintfRUBY_T_HASHsyncRUBY_T_NODEchdirreserved__ssize_t__srcrb_mErrnolsapi_closeH_IF_RANGEnameOffruby_api_versionRB_TYPE_Psa_family_tm_packetLenreadMoreruby_hexdigitsRUBY_FL_WB_PROTECTEDin6_addrisBodyWriteToFileRB_FLOAT_TYPE_P__timezonelinesin6_addrRB_SYMBOL_Prb_mWaitReadablelsapi_setsyncm_respPktHeaderEndruby_fl_ushiftRUBY_FL_TAINTLSAPI_Postfork_Parentfn_add_envlsapi_bodyrb_int2num_inlinelsapi_printrb_eSystemCallErrorRB_STATIC_SYM_Pdcompactrb_intern2stderrm_pHeaderIndexRB_FL_TEST_RAWprogram_invocation_short_nameRARRAY_PTRrb_cUnboundMethodrb_f_sprintfRB_FL_ANY_RAW_IO_save_endrb_const_get__nptrLSAPI_InitLSAPI_Requestrb_eScriptErrorfn_writelsapi_syncm_bufProcessedstdoutreadBodyBufoptoptlsapi_reopenRB_DYNAMIC_SYM_Prb_mGCrb_eIndexErrorm_httpHeaderLencurPosH_IF_NO_MATCHlsapi_s_acceptpreforkRUBY_T_DATAbuffssizetypekeyLen__builtin_strchrunexpected_typeLSAPI_Flush_rshort unsigned intsigned char/builddir/build/BUILD/opt/alt/ruby31/share/gems/gems/ruby-lsapi-5.6/ext/lsapiGNU C17 8.5.0 20210514 (Red Hat 8.5.0-20) -mtune=generic -m64 -march=x86-64 -g -O2 -fPIC -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fplugin=annobinfilenamelsruby.clsapi_header_offsetRARRAY_TRANSIENT_P__off64_tsockaddr_eon_IO_read_base_offsetm_pIovecrb_string_value_ptrrb_eFloatDomainError_IO_buf_endm_respInfoopterrlsapi_puts_ary_modeblkSizerbimpl_RB_TYPE_P_fastpath_IO_write_basevalueLenfunctionInit_lsapirb_eStandardErrortz_dsttimerb_debug_rstring_null_ptrrb_argv0ruby_digit36_to_number_tableH_CACHE_CTRLH_COOKIE2__destrb_cMatchrb_cEncodinglsapi_isattyH_USERAGENTRARRAY_EMBED_LEN_MASKLSAPI_ForeachEnv_rlong intRUBY_T_NONErb_mProcessrb_mFileTestremain_IO_markerrb_cEnumeratorm_pRespBufEndRB_BUILTIN_TYPE__builtin___memcpy_chkrb_io_putslsapi_s_postfork_childrb_define_global_constrb_obj_as_stringm_bufReadin_addruint32_tsockaddr_in6__pid_t_IO_codecvtrb_funcall_nargsH_RANGERDatastrtolg_reqlong doublerb_cRangeRB_SPECIAL_CONST_Piov_lenlsapi_resp_inforb_cObjectlong unsigned intlsapi_req_headerrb_cSymbolrb_gc_markinitBodyBufruby_strdupm_headerOffrb_eNotImpErrorrbimpl_idRSTRING_PTR__errno_locationlsapi_s_postfork_parentrbimpl_strlencharRB_INT2FIXsockaddr_inarpm_pSpecialEnvListsin6_scope_idrb_cIOstdinsin_addrRUBY_FL_SHAREABLERUBY_T_BIGNUM_IO_buf_baseRSTRING_NOEMBEDRUBY_T_RATIONALRB_FLONUM_PRUBY_FL_PROMOTEDs_bodyrb_eTypeErrorRBasicrb_eNoMethodError_IO_read_endRUBY_T_ICLASSrb_num2intcLSAPIRUBY_SPECIAL_SHIFT_IO_FILEH_IF_UNMOD_SINCEm_fdRUBY_T_SYMBOLH_HOSTrb_num2char_inline_IO_wide_dataruby_rstring_constsstrlentzname__u6_addr16s_pidselfrb_eSystemExitisAllBodyReadm_respHeaderrb_cThreadRUBY_FL_SEEN_OBJ_IDm_envListSizem_pAppDataRB_NIL_Pruby_platformsockaddr_ax25RSTRING_FSTRrb_eThreadError__pad5rb_str_new_staticshared_root__u6_addr32rb_cNilClassm_type_markersrb_stdinrb_eStopIterationm_scriptFileOffRUBY_FL_USHIFTklassrb_define_classH_VIA_codecvtm_pRespHeaderBufEndH_PRAGMARTypedDataRUBY_FL_FINALIZErb_cRandomdoublemkstemplsapi_putcargcssize_tRB_IMMEDIATE_Plsapi_writelsapi_putsorig_stdinRUBY_FIXNUM_FLAGargvrb_eRuntimeErrorm_pRespHeaderBufrb_cClass__int32_trb_cProc__uint32_tRUBY_IMMEDIATE_MASKrb_hash_asetdata__daylightH_REFERERrb_cStructLSAPI_Prefork_Accept_rRB_FIXNUM_Pheap_sys_siglistRARRAY_TRANSIENT_FLAGm_pUnknownHeaderrb_typem_reqStateRUBY_T_NILRUBY_T_MOVEDrb_eSysStackErrorrbimpl_rstring_getmemm_pRespBufrb_num2int_inlineprogram_invocation_namerb_cArrayrb_eEncodingErrorrb_ruby_verbose_ptrrb_cBindingdsizeH_IF_MODIFIED_SINCErb_ary_detransientRUBY_FL_USER10RUBY_FL_USER11RUBY_FL_USER12RUBY_FL_USER13RUBY_FL_USER14RUBY_FL_USER15RUBY_FL_USER16RUBY_FL_USER17RUBY_FL_USER18RUBY_FL_USER19_freeres_bufRUBY_T_MATCHlong long unsigned intparentpid_t_cur_columnlsapi_rewinds_reqrb_eRangeErrorm_pRespHeaderBufPoss_stderr_datarb_eval_string_wrapgetpidtyped_flagm_cntEnvruby_rarray_constsRUBY_T_MASKrb_lastline_get_IO_backup_baseH_KEEP_ALIVE__memcpy_chk_IO_read_ptrrb_cRefinementrb_eMathDomainErrorrb_fix2intLSAPI_GetReqBodyLen_rrb_gc_writebarrier_unprotectrb_exec_recursivegetenv_freeres_listrb_eLocalJumpError_sys_nerrlsapi_readtimezonerb_array_lenpReqlsapi_getcrb_hash_newclear_envrb_cRegexplsapi_binmode_old_offsetstrchrm_pReqBufrb_cNameErrorMesgretvalvalueOffoptindH_ACC_LANGlong long intin6addr_loopback_flags2VALUErb_mMathRUBY_T_TRUEmemmemsin6_familysockaddr_atruby_value_typem_scriptNameOffH_ACCEPTm_lLastActiverb_eNoMatchingPatternErrorlsapi_resp_headersys_nerrin6addr_anym_pRequestMethods_req_dataiov_basem_lReqBegincreateBodyBufm_versionB0m_versionB1rb_str_buf_newRUBY_FLONUM_MASKruby_patchlevelRUBY_T_REGEXPm_pIovecCurLSAPI_Init_Env_Parametersorig_envm_reqBodyReadRUBY_Qundeflsapi_s_accept_new_connrb_eFrozenErrorsockaddr_dlRSTRING_EMBED_LEN_MASKRUBY_FL_FREEZEunsigned intbodyLensockaddr_ipxrb_default_rsshort intrb_string_value_vtable_offsetpValueenv_copymmaporig_verboserbimpl_str_new_cstrrb_data_object_zallocrb_mEnumerableRUBY_Qfalseflagstz_minuteswestsys_siglistH_ACC_ENCODINGsin6_portlsapi_eval_string_wrapGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-20)GNU�zRx�
0D+Xl�(�BF�G�A �kFB�
�HU�gHQ
Gayd 2HW
II@ HWX HWp-Hd�3E�D hAH�F�B�B �E(�D0�C8�GPm
8F0A(B BBBG4��o�A�D �
AAKp��P ��\,4F�D�A �D(�F0`
(D ABBBj
(D ABBEl(G DBBD��B�B�I �B(�A0�A8�D@�8D0A(B BBB�*HP
HI�UK�I8�F�B�A �D(�D@�
(A ABBEL(`�E�A�D0r
CAP�E�L�E�Y(�E�D�G0�
AABzRx�0��   �A�D w
AA(D�E�A�D �
DAF,p�Z�A�D �r�A�B�H�tF�B�B �B(�A0�D8�D@�
8F0A(B BBBG@�7F�B�B �A(�D0�D@�
0A(A BBBB80SF�B�A �A(�D0�
(A ABBF
�	
/)
?0Yt1��2��3�
5
C
_"y�	@�"�[�0+�[�h�`
h)wCpPwm���������B�	p����
&�AZ�f�w�g��w����a��"+�26"]P�0 ��P�p�P p(�Mp-e�����3�������)�D�R	@\�v���4�����������*(�B	Z�Ue	�
� 	��
�'
� 
�'
0
�+G"an"�O�0�O�\�P�	\	�0	`�:		xC		S	�q	�
�	���		X�		`�		�	�
�	��	�
�

	�
	)
�C
[
�tf
�
G�
7�
G�
��
	 �
	�
	�	h!"$&(*012345/62
%!&s+F0>5\:�@�F�L�R�X�^�d�j�p�v|���������0�6�r�z���������������������������$�*�0�6=<SBbHN�T`p��+,-.��������

.
D
Y
r
�
�
�
�
�
�
�
�
�
��
�
�
/#2=HSZc��������(/<Rey������PS����&,6ANaq������� �  .annobin_lsruby.c.annobin_lsruby.c_end.annobin_lsruby.c.hot.annobin_lsruby.c_end.hot.annobin_lsruby.c.unlikely.annobin_lsruby.c_end.unlikely.annobin_lsruby.c.startup.annobin_lsruby.c_end.startup.annobin_lsruby.c.exit.annobin_lsruby.c_end.exit.annobin_lsapi_process.start.annobin_lsapi_process.endlsapi_process.annobin_lsapi_rewind.start.annobin_lsapi_rewind.endlsapi_rewinds_body.annobin_lsapi_eof.start.annobin_lsapi_eof.endlsapi_eof.annobin_lsapi_binmode.start.annobin_lsapi_binmode.endlsapi_binmode.annobin_lsapi_isatty.start.annobin_lsapi_isatty.endlsapi_isatty.annobin_lsapi_setsync.start.annobin_lsapi_setsync.endlsapi_setsync.annobin_add_env_no_fix.start.annobin_add_env_no_fix.endadd_env_no_fixlsapi_env.annobin_lsapi_mark.start.annobin_lsapi_mark.endlsapi_mark.annobin_lsapi_flush.start.annobin_lsapi_flush.endlsapi_flush.annobin_lsapi_close.start.annobin_lsapi_close.endlsapi_closeMAX_BODYBUF_LENGTH.annobin_readBodyBuf.start.annobin_readBodyBuf.endreadBodyBuf.annobin_lsapi_getc.start.annobin_lsapi_getc.endlsapi_getc.annobin_lsapi_s_postfork_parent.start.annobin_lsapi_s_postfork_parent.endlsapi_s_postfork_parents_req.annobin_lsapi_s_postfork_child.start.annobin_lsapi_s_postfork_child.endlsapi_s_postfork_child.annobin_lsapi_s_accept_new_conn.start.annobin_lsapi_s_accept_new_conn.endlsapi_s_accept_new_conn.annobin_lsapi_eval_string_wrap.start.annobin_lsapi_eval_string_wrap.endlsapi_eval_string_wrap.annobin_add_env_rails.start.annobin_add_env_rails.endadd_env_rails.annobin_createBodyBuf.start.annobin_createBodyBuf.endcreateBodyBufsTempFile.annobin_lsapi_read.start.annobin_lsapi_read.endlsapi_read.annobin_lsapi_gets.part.1.start.annobin_lsapi_gets.part.1.endlsapi_gets.part.1.annobin_lsapi_gets.start.annobin_lsapi_gets.endlsapi_gets.annobin_lsapi_each.start.annobin_lsapi_each.endlsapi_each.annobin_lsapi_puts_ary.start.annobin_lsapi_puts_ary.endlsapi_puts_ary.annobin_lsapi_sync.start.annobin_lsapi_sync.endlsapi_sync.annobin_lsapi_write.start.annobin_lsapi_write.endlsapi_write.annobin_lsapi_addstr.start.annobin_lsapi_addstr.endlsapi_addstr.annobin_lsapi_printf.start.annobin_lsapi_printf.endlsapi_printf.annobin_lsapi_putc.start.annobin_lsapi_putc.endlsapi_putclsapi_putc.cold.8.annobin_clear_env.start.annobin_clear_env.endclear_envenv_copyrbimpl_id.16010.annobin_lsapi_s_accept.start.annobin_lsapi_s_accept.endlsapi_s_accepts_pids_req_datarbimpl_id.16023.annobin_lsapi_reopen.start.annobin_lsapi_reopen.endlsapi_reopens_req_stderrorig_stderrrbimpl_id.16187.annobin_lsapi_puts.start.annobin_lsapi_puts.endlsapi_puts.annobin_lsapi_print.start.annobin_lsapi_print.endlsapi_print.annobin_Init_lsapi.start.annobin_Init_lsapi.endrbimpl_id.16203rbimpl_id.16208orig_envcLSAPI.LC5.LC3.LC2.LC4.LC1.LC0.LC9.LC7.LC6.LC8.LC10.LC11.LC12.LC14.LC15.LC16.LC17.LC18.LC19.LC20.LC57.LC22.LC23.LC25.LC26.LC27.LC28.LC29.LC30.LC31.LC35.LC36.LC37.LC38.LC39.LC40.LC41.LC42.LC43.LC44.LC45.LC46.LC47.LC48.LC49.LC50.LC51.LC52.LC53.LC54.LC55.LC21.LC32.LC33.LC34.LC24.LC56.text.group.text.hot.group.text.unlikely.group.text.startup.group.text.exit.group_GLOBAL_OFFSET_TABLE_g_reqrb_str_newrb_hash_asetrb_gc_markLSAPI_Flush_rmunmapfreeLSAPI_ReadReqBody_rLSAPI_ReqBodyGetChar_rLSAPI_Postfork_ParentLSAPI_Postfork_ChildLSAPI_Accept_Before_Forkrb_string_valuerb_string_value_ptrrb_eval_string_wrapstrchrrb_str_new_staticruby_strdupmkstempunlinkftruncatemmapcallocperror__errno_locationstrerror__fprintf_chkrb_str_buf_newrb_str_catrb_num2intrb_fix2intmemmemrb_yieldrb_gc_writebarrier_unprotectrb_io_putsrb_ary_detransient__stack_chk_failrb_unexpected_typerb_obj_as_stringrb_debug_rstring_null_ptrrb_f_sprintfrb_intern2rb_funcallvLSAPI_Prefork_Accept_rgetpids_fn_add_envLSAPI_ForeachHeader_rLSAPI_ForeachEnv_rrb_ruby_verbose_ptrrb_define_global_constrb_default_rsrb_exec_recursiverb_output_fsrb_output_rsrb_lastline_getInit_lsapiLSAPI_InitgetenvstrtolstrlenselectLSAPI_Init_Env_Parameterschdirrb_stderrrb_cObjectrb_const_getrb_global_variablerb_define_classrb_data_object_zallocLSAPI_Write_rrb_stdoutrb_stdinLSAPI_Write_Stderr_rrb_hash_new__memcpy_chkrb_define_methodrb_define_global_functionrb_define_singleton_methodH7*������������������������������l�����������*������������������*��������� ���������'D-4<;���������B8RD]Hq����������*����������H�<�����������H�*������������������;*���������@���������G[*���������`���������g{*�����������������������������������������������������������B���������P���������Wlb�������������������������������������������������������������������l$���������4���������@���������I���������Tl\���������s�����������������������������l������������������������������C*��������� D6C<H���������S���������f���������n���������uD�������������������<�������������������<�������������������@�������������������������1��������8��������G���������Q*��������[��������c���������t���������y������������������D�L�H���������L <(	��������.LS
��������]LcDy���������L�<�	���������L�<�DH���������L2��������K��������YLc<k	��������qL�D�H�
���������D�Lh	���������	���������	���������	����������	���������
��������
��������F
���������
���������
����������
��������9�����������������*��������Q
��������X��������xt��������������������������������������l�������������������*���������
��������
<
���������$
84
D:
HC
��������I
TT
\`
*��������o
��������~
���������
�
T�
�
����������
���������
�
���������
������������������������!�(���������4��������9��������CO���������a��������ht��������������������#*��������S���������]���������� ������������������*��������R����������*!�������������������*"��������)#��������C��������_%��������k���������r8}D�H�&���������'������������������������������&���������(�����������������L<���������&��������3'��������A*)��������F*��������K��������R���������XT]&��������n+��������~*���������*,��������������������������������*-���������.����������|����������	��������|+��������2t9t>/��������J���������O���������[���������c���������jtu��������������������9�������������������0�������������������d�:���������d�����������8���������d�����������8��������d���������8��������%d8���������=8��������DdW���������\8��������cdv���������{8���������d�����������8���������d�����������8���������d�����������8���������d�����������8���������d���������
8��������d$���������)8��������0d@���������E8��������Ld\���������a8��������hdx���������}8���������d�����������8���������d�����������8���������d�����������8���������d�����������8���������d���������	8��������d#���������(8��������/dB���������G8��������N*���������Udi1��������p*���������w*2��������~��\�*3���������*4���������/���������d�1���������*5���������������������������/�������������������������6��������l!l(���������-��������7���������<��������A��������g<l7��������y<�����������d�����������:���������d�����������:���������d���������:����������������� ��������3���������8&��������Y���������o���������}���������������������E������������������ ���
 (
L
T"�
�"�"�[�"�[[h@[Hhlhtw�h�w�w��w�,�4�`�h������������ �(LTw��w�w���w���"@�H"l"tP�"�P�P�pPp,p4�`ph������������� �(�L�T�������������	�	�@	�H	�l	�t	��	��	��	��		
�
	,
	4

`
	h

�

�
'
�

�
'
�
'
�
 '
(LT"��"�"�O�"�OO\@OH\l\t��\������

�
�
,
�
4
�`
�
h
��
��
�
��
�
�
G (GLGT��G�� � � � �������������������
�
��
��
��
��%
�,
�&8
��!?
�M
��T
�o[
��e
�s
��!x
���
���
���
���
���
���
���
��
�
��
�

�u%
�'2
��?
�L
��Y
��	f
��s
�U�
�O�
���
���
�'�
���
�G�
�_�
���
�9�
�O
��!
��
��)
�6
��C
��P
��]
�j
�?w
�|�
�E�
��
�
���
���
���
�T
��
�O
�&2
��>
��J
�O f
�er
��~
��
�I�
�y�
�+�
���
���
�<�
�+�
���
���
�
�
�x
�f&
��4
��;
�0@
�
]
��i
�u
���
�}�
���
���
�*�
���
�b"�
���
��
�'
�P"
��
�,%
�6!+
��1
��7
�� =
�Q	C
��I
��P
��^
�\"k
��y
���
���
�s
�
�v
�
�N�
�i
�
���
�� �
���
��
�
�2�
�G�
���
��
��
���
�r�
���
���
���
�,
��	
��
��
��

��!
��'
��-
��4
�
F
��M
��
_
�ue
��k
��q
��w
�}
��
�5�
�H�
���
���
��!�
�%�
�3�
�A�
�O�
�]�
�k�
�y�
���
���
���
�{
��
��
��
��&
��/
��8
��A
��J
�T
�q[
��c
�l	u
�b|
�v!�
�"�
�b�
�R�
��
�
���
�_
8
�QE
�2S
��a
��}
�{�
���
�{�
�c�
���
���
�c�
���
�X*	
�QX	
�Sf	
���	
��	
���	
���	
��	
���	
�	�	
��	
�

��

��

��+

�N8

��E

�BS

�	a

�\"y

��

���

�N�

���

��
�

�	�

��
�W
�� 
�	/
�V;
��G
�A"S
�_
��k
��w
���
���
���
��
�"�
��
�B�
���
���
�U�
���
��
��
��

�M+
��
7
�C
��O
�K[
�gg
��s
�4
�V�
�p�
��
�
���
�%�
���
�@�
� �
�\�
��
�#

�I

��

��	'

�3

��?

�C
K

��W

��c

�io

��{

�
�

�\�

��

���

���

���

�n�

�2�

���

�Z!�

���

�t
�/
��#
�Z/
��;
�6G
��S
�:_
��k
��w
��
��
��
�" �
��	�
�a�
���
���
�e�
�C�
���
�b	
�.
�
��&
�l2
�6>
��!J
��	V
�r
��
�f�
�*�
���
���
��
�� �
���
�'

��	
� #
��)
�}"/
�5
��;
�A
�DG
�	M
��
S
�:Y
�:_
�e
�k
�oq
�-w
�T}
���
���
��
��
�
�
���
�	�
���
�=	�
��
�>�
��	�
�� �
�� �
�}

��
�Q%
�82
�&?
��L
��Y
��f
��s
�,	�
���
���
���
���
�
�
�e�
�w�
��

�"
��$
�o1
��?
�L
�CY
��g
�= t
�&�
�[�
��
���
��!�
�9�
�K�
��
�
���
�'�
� 
�� 
�L 
�6
-
��:
��G
��T
��a
��n
�}{
���
��
���
�� �
���
���
�W�
�a�
���
���
��

��
�y$
�1
�H>
�8K
�!X
�d e
�4r
��
���
�(!�
���
�r�
���
���
���
���
�%�
��
�� 
�d
�Sp
���
���
���
�E�
��
���
�#
��&
�;
�j!P
��e
��r
��
���
�,�
�?�
���
���
��"�
�s�
���
�
��1
��!F
��[
��p
���
�X)
��5
�|B
�P
�ke
��q
��}
�d�
���
���
�X �
��
�V$
�q"1
�}=
�

I
��V�_
�!l�u
��!�x�
���p�
����
���
�q
��
��*h3
�h@I
�u V`e
��
r{
���
���X�
�K�
�[�
��!�
��
�
���
�K�
���@
�8
@(
�@4
��
AJ
��RPi
�
"u
�y
��
�A�
�;�
��
���
�����
��� �����
��
�
�6	
�4�
�P(
�d,
�b1
�P:
��>
��C�`
��i
�(
u
��y
��~
�B
�
���
���
���
���
������
���
�0�
�.�
�^�
�\��
��

��
��
��
�� 
��%
B/[
�d
�p
��t
��ym���
�P�
��
��
������c�
���
�@
�@
�*"
�(+
�S/
�M8�A
��R
��V
��[�z��N����]�s���
��)
��2
��6
��?�H
��Y
�X]
�Tf
��j
��op�@�v�v�
���
���
��
�	���N��� &! 
� 2 
�96 
�7; 7T ca !v N�� J� O� a� N�� r� �� B� x� S!N!g+!�:!yR!�c!Np!�!��!N0�!��!N6�!��!��!Nr�!�!	"Nz"P%""6"NC"0
R"Ac"N�p"�"`�"N��"0�"�"N��"��"��"N��"	#�#N�'#�6#�G#N�T#�c#�t#N��#��#�#N��#��#-�#N��#�#I�#N�	$�$e)$N�6$0E$�V$N�c$0r$��$N��$�$��$N��$`�$��$N��$p�$�
%N�%p&%
7%N�D% 
S%,d%N�q%��%K�%N��%�
�%��%�%��%�%��%&& &15&N?&@T&N�^&Ek&�|&N=�&p�&��&NS�&P�&�&Nb�&0�&$'N'<"'N�D'
�/I'
�_S'
�8m'
��'
���'
�J�'
���'
���'
�
"�'
���'�'
��'(
��!(
�`%(
�\.($7($L($Y(?f(ut(
���(��(
���(
��
�(
�z�(
���(
�b�(
���(
�+)`)
��()
��4)0K)
��^)4g)4�)
�8�)��)
���)
���)
���)
���)
���)��)��)
��)
�
*�*
�@*�'*
�p8*
�`<*
�\A*
�pO*
��S*
��a*
��e*
��j*��*	�*��*
�[�*
���*
���*��*
�J�*
�$�*
��*
��+
��	+
��+
��+
��+
��/+
�
	3+
�	B+
��	F+
��	K+
�	W+
��	[+
��	`+
��l+
��
p+
��
y+L�+
��+
��
�+
��
�+
��+
�4�+
�0�+L�+L�+
�l�+
�j�+W�+}�+�
,�(,�@,,d,��,
�|�,
���,
���,
���,��,
�	-
��-
��
-
��-
�*(-
��,-
��1-
��=-
�XA-
�VF-
�]R-
�V-
�{[-
��l-�u-
��-��-
���-
���-
�� �-
���-
��.
��.�..
��:.
��>.
��N.
��R.
��[.	d.
�@u.
�.
y.
�,
�.	�.
�P�.
�U
�.
�Q
�.
�P�.
��
�.
��
�.
��
�.
��
�.
��
�.
��
�.
�!�.
��.
�F�.
�D�.�.
��/�/
��&/
�m*/
�i//=/
��I/l/
��p/
���/
���/
���/�/
�r�/
�J�/
���/
���/
�m$0
�wJ0
�f
V00m0
�Jy0
�6}0
�2�0
���0
�s�0
�o�0
���0
���0=�0H�0
�h�01
�J1
�1
��1
��%1
�X)1
�N:1
��>1
��M1
�cQ1
�[V1
��j1�s1
�`�1
���1
���1
�`�1
���1
���1��1��1
���1
��1
��1��1
���1
��2
��2`2`12
��52
��?2�H2�a2
�
e2
�p2y2�2
�>�2
�<�2�2
�o�2
�m�2z�2��2�3 3-(3G63
�fB30
Y3
��e3
��i3
��z3
�:~3
�.�3
�	�3
���3
���3
���3
���34
�3
���3
�'�3
�!�34
�3
� �3
�u�3
�s�3
���3
��4
� 
4@
44
#4
�`44
��84
��A4
�+E4
�'N44
W4
�pd4
�eh4
�aq4
��u4
��~44
�4
���4
���4
���44
�44
�4
��4
��4P
�4P
�4
�8�4
�6
5Y
5Y
,5
�]05
�[55Y
J5
��N5
��[5e
d5e
�5
���5
���5J
�5s
�5
���5
���5
���5s
�5
�0�5
�"�5
��5s
�5s
6
�Z6
�X#6�
,6�
D6
�H6
�}M6�
b6
��f6
��r6�
{6
�`�6�
�6
�p�6�
�6
���6
���6
���6�
�6�
�6
���6
��7
��7�
%7
� 37
�P<7
�@7
�N7�
W7
��i7
��r7
�Hv7
�@7�
�7
��7
���7�
�7N��7�
�7
���7
���7
���7�
�7
��8
��8
��8
��8
��8
��&8
�&*8
�$38
�Y78
�U@8
��D8
��M8
��Q8
��Y8�
o8
�?{8
� �8
���8
�;�8
�'�8
��8
��8
�	�8
���8
���8p�8
�P�8
���8
���8p9
��9
�=9
�;#9
�e'9
�a09p99pR9
��V9
��_9
��c9
��l9pu9p�9
���9
���9p�9p�9
�7�9
�5�9u�9u�9
�\�9
�Z:~
:~&:
��*:
�/:~D:
��H:
��U:�^:
�	n:
��r:
��w:
�	�:
��:
��:��:��:
�C�:
�A�:��:U�:�:
�0	;
�j;
�f
;;
�@	#;
��';
��0;9;
��	J;
��N;
��W;
� [;
� d;m;�;
�) �;
�' �;
�Q �;
�O �;�;�;�;
�v �;
�t �;�;
�� <
�� <
��	<
�� <
�� #<
��	,<
�I!0<
�C!9<
�
J<
��!N<
��!W<o<��<N��<��<
�0
�<
��!�<
��!�<��<
��
�<
��!�<
��!�<
�1"�<
�-"�<
��
�<!�<�=
��
=
�k"=
�g"!=
��"%=
��".=�7=
� D=
��"H=
��"Q=
�#U=
�#^=�g=
�Px=
�W#|=
�S#�=��=
���=
��#�=
��#�=��=��=
��#�=
��#�=��=�>
��#>
��#	>�>
�$">
�$/>�8>�U>
�=$Y>
�;$_>.{>��>\�>
���>�>
���>
��"�>��>
��?
�d$?
�`$?
��$?
��$"?�:?�R?�f?
��q?0�?
���?
��$�?
��$�?D�?
�3�?P�?
���?
�%�?
��$�?d�?
�B!�?p@
��@
�@%@
�<%$@�2@
�=@�T@
��_@
�}%c@
�y%s@
��%w@
��%|@�
�@
�(
�@
�B
�@
���@�
�@
���@�@�
�@�
A
�&A
�
&A
�=&A
�;&!A�
*A
�7A
�k&;A
�i&@A
�IA
��&MA
��&RA�
oA�
�AX
�A
���A
��&�A
��&�A]
�As
�A�
�A
�A!
BG
B
��"B
�	/B
�6B`MBubB
�(
oB
�B
~B
���B��B
���B�B��B��B
��&�B
��&�B
�'�B
�'�B��B
��C
�@'C
�>'C
��C
�n'!C
�l'&C�CC�]C��C
�Z
�C��C
���C
��'�C
��'�C
�9�C
��'�C
��'�C
��!�C
�:(�C
�6(�C
�K�C
�w(�C
�s(�C
��(D
��(D�,D�PD�eD
��pD��D
���D
��(�D
��(�D
�9�D
�x)�D
�f)�D
��!�D
�B*�D
�6*�D
�K�D
��*�D
��*�D
��+�D
��+�D
�E,�D
�=,
EF(ETLEfdE��E�E�EN�E(�E8�EMFN%#F`<FwZF�oFN~F��F
�Z�F��F
�	�F
��,�F
��,�F��F
�/�F
���F
�bG
��G
�"<G
��\G
���G
�;�G
���G
�m�G
��)H
�
GH
�eH
���H
���H
�F�H
�r�H
���H
��I
�A"I
��OI
�aoI
���I
�h�I
�q�I
��I
�\"�I
��J
�\"$J
�'IJ
�QSJ
�;~J
���J
���J
���J
��	K
��'K
�QK
�VmK
���K
���K
��L
�W!L
��?L
��\L
��iL
�E�L
���L
�x�L
�R
�L
�D�L
��
�L
���L
�D
M
��
M
�*M
�A8M
��
IM
�
UM
��hM�Mp�M�M�M�M.N.N@'N
��4N
��=N
��,AN
��,JN@SN
��`N
��iN
�P-mN
�D-vN
��-zN
��-�NN�N
���N
�%.�N
�#.�N
�U.�N
�Q.�N_�NN>�NL�N@�NWOj)OrAO5NO<[OgqO��O��O��O�ONF�O#P}%PN\/P�EP�\P�mPNs|P��P
��.�P
��.�P
��.�P
��.�P
�/�P
�/�P
�</�P
�:/�P��P��PQ6+QN�:QORQoqQ��Q
�h/�Q
�d/�Q��Q��Q 	�Q
��/�Q
��/�Q
�A0R
�50R
��0R
��0!R
�81%R
�01.R�	7R
��HR
��1LR
��1URX	^RX	{R
��1R
��1�RX	�R
��1�R
��1�R�	�R
���R
�n2�R
�l2�R
��2�R
��2�R�	�R�	�R
��2�R
��2S
��2S
��2Sd	 S
�1S
�
35S
�3:S
�CS
�D3GS
�@3PSd	YSd	vS
�~3zS
�z3�S
��3�S
��3�S
�4�S
��3�Sl	�Sl	�S
�p�S
�'4�S
�#4�Sl	�S
���S
�_4�S
�]4�Sl	T
��T
��4T
��4T
��4#T
��4,Tl	5Tl	NT
��4RT
��4[T
��4_T
��4kTv	tT
��T
� 5�T
�5�Tv	�T
�P�T
�X5�T
�V5�T
��5�T
�~5�Tv	�Tv	�T
��5�T
��5�T
��5�T
��5�T�	U�	!U
��2U
��56U
��5?U
�16CU
�-6LU
�n6PU
�j6UU
��kU�	tU
���U
��6�U
��6�U
���U
��6�U
��6�U
�UN��U
�U�	V
V�
3V
�77V
��6@V
�g7DV
�_7MV
��7QV
��7_VhV
�@uV
�8yV
�8�V
�F8�V
�@8�V
��8�V
��8�V
�@�V
��8�V
��8�V@�V@�V@�V
�9�V
�	9�V
�99�V
�79WX
W
�pW
�g9W
�e9#W
�p,W
��90W
��95WeRW_WlW8�WN��W=�W��W��W
��9�W
��9�W
�+:�W
�#:�W
��:�W
��:X
��#X
��,X
� ;0X
�;9X
�N;=X
�D;FX�OX
�@
`X
��;dX
��;iX
�@
rX
�<vX
�<X��X
��
�X
�J<�X
�F<�X��X
��X
��<�X
��<�X
��<�X
��<�X��X��X
��<Y
��<	Y
��<
Y
��<Y
�0$Y�>Y>GY
�`XY
� =\Y
�=eY>nY
��~Y
�m=�Y
�i=�Y��Y��Y
��=�Y
��=�Y>�Y>�Y
��=�Y
��=�Yp�YpZ
��=Z
��=Zp/Z
�>3Z
�>?Z�HZ
��YZ
�B>]Z
�<>fZ�oZ
�P|Z
��>�Z
��>�Z��Z
���Z
��>�Z
��>�Z
�?�Z
�?�Z��Z
��Z
�X?�Z
�T?�Z
��?�Z
��?�Z�	[�[�+[
��?/[
��?4[�I[
��?M[
��?[[Pd[
�0u[
�J@y[
�H@~[
�0�[
�x@�[
�v@�[a�[N��[��[��[2�[�\ 	\-\
��1\
��9\
�}=\
�}E\
�+"I\
�+"Q\
��U\
��]\
��a\
��j\
�En\
�@�\
��\
��\
�v�\
�v�\
�H�\
�H�\
�!�\
�!�\
���\
���\
��
�\
��
�\
�4�\
�4�\
���\
���\
�F�\
�F]
��]
��]
��]
�� ]
�.$]
�.-]
�
1]
�
9]
�J=]
�JF]
��J]
��S]
�aW]
�a_]
��
c]
��
k]
��o]
��x]
�Q
|]
�Q
�]
���]
���]
�W�]
�W�]
�� �]
�� �]
�P�]
�P�]
��	�]
��	�]
���]
���]
��]
��]
���]
���]
�j�]
�j�]
���]
���]
��^
��
^
�a^
�a^
��!^
��!$^
�&(^
�&1^
��5^
��=^
�*A^
�*J^
��N^
��W^
��
[^
��
d^
�h^
�p^
��t^
��|^
�.�^
�.�^
�M�^
�M�^
�E�^
�E�^
�T�^
�T�^
�	�^
�	�^
�k�^
�k�^
�7�^
�7�^
���^
���^
���^
���^
��
�^
��
�^
��
�^
��
_
�"	_
�"_
�Y
_
�Y
_
��"_
��+_
��/_
��p_
�xt_
�x}_
�h�_
�h�_
�(�_
�(�_
���_
���NNSA!I6Ta\qg)o;�T�>�>�t�S�����J�J����N6�>�I d�l�wN�������S������S
�0�8#CN^�f#q���N���m���
�*�2�S�[�f�n�yJ�������������������
�t\S&�1�9�X�`k
�t\pSxp����@�S�p�@�v���
��\v�@9&A6`hs{w�������	�	�	������&�.	9	A	`�h�s�{	�������	�������	$�,�7�?�J�RD`Dhgsg{u�u�����������������#�+D9DAaLaTubuju}�����������������
	�	� 	�(	3	;	+F	+N	CY	Ca	Dl	t	��	��	��	�	�	W�	u�	��	��	�
�
�
�=
�E
b
j
?�
�
��
��
�
�
��
LV
u|4W<WG}OlLtL�����������������L@��*L;@X�`���������������"��	

.
	6
U
	]
p
x
�
	�
�
�
�
�
�
!)FNm�u��������!�!�"�"60><I<QOs0{<�<�O�0�<�<�N�N�OJ""*"2BX`GkGsJ~"�,�,�=�=�B��J�J������"%"-,8,@Gc;kXwz������=�B�����N�����X#r:�B�Y�a��X�m�����X�X
��>�F�o�w��0
�I
�I
�J
�J
��
��
��
��
��
�
:0
BE
ME
UJ
cJ
k�
v�
~�
��
��
��
��
�s
��
��
���
�
'4
/I
:I
BJ
PJ
Xs
u4
}l
�4
�I
�I
�J
�J
�l
�4
�@
J
e
+4
3@
>J
Fe
e4
m@
yJ
�e
�4
�@
�J
�e
�4
�@
�J
�Y
4
4
8J
@J
]Y
eY
�Y
�Y
�e
�e
�s
�w
�w
��
��
�
"s
*w
5w
=�
Zs
bs
�
��
��
��
��
��
��
��
�
%�
H�
P�
[�
c�
n�
v�
��
���
��
��
��
��
�
&�
.�
Y�
a�
x�
��
��
��
��
��
��
��
�
�
;PC�N�V�a�i�w���.�.�I�I�\�\�\��������Ps)s1�<�D�R�Z\e�m������p�s�s������.�W\
\� �=pE�epmsxs���p���p�s�s���pss~7p?p\udu�~�����������I�U��U&UC�K�j�r}.�.����.�.���� � �) �1 �Q �Y �v ~ � � � � � � � ;!I
!\!\ !�(!�I!?Q!I\!\d!\o!�w!��!;�!?�!��!��!�!.�!��!�	"".1"�9"�D"L".k"�s"�"�"!�"��"��"�"!�"��"��"�"!#�%#�0#8#!W#�_#�j#r#!�#��#��#�#�#��#��#��#�$�$�=$�E$�d$�l$�w$�$��$��$��$0�$?�$?�$P%P%_%_%p@%pH%S%[%�}%��%
�%
�%�
�%G
�%O
�%�
�%�
�%�
�%�
�%X&�
&�
"&N�=&�
E&�
P&k&�
s&�
~&N��&�
�&�
�&X
�&�
�&��&��&N�'�'�%'@'�H'�S'N�n'�v'��'��'��'��'��'��'��'��'��'�(�(�(�:(�B(�M(�U(�w(�(��(��(��(��(��(��(��(��("
)")')z%)�0)�8)�C)�K)�x)��)%�)%�)q�)q�)z�)z�)��)��)��)��)��)��)�*�*�*�*�B*�J*;U*;]*Oh*zp*�{*��*��*��*��*��*��*��*�*�*;�*z+�+�+�$+�,+�7+�?+�J+�R+�]+�e+�p+�x+��+��+��+��+;�+;�+z�+z�+��+��+�,�,�,�,�E,�M,�X,�`,�k,�s,�~,��,��,��,��,��,��,r�,��,
-*-g-q!-q)-�P-@X-Ye-Ym-ix-i�-��-
�-*�-*�-4�-4�-��-R�-V�-V�-y.*.q%.N-.q8.N>U.U].Zi.Zq.^�.R�.n�.n�.��.��.��.D�.}/�//6/></�D/�h/�p/�{/��/��/ 	�/T	�/T	�/�	�/�	�/�	�/�	�/�	�/�	0�	0�	0
A0 	I0T	T0T	\0�	g0�	o0�	}0�	�0�	�0�	�0�	�0�	�0
�0 	�0T	�0T	�0�	�0�	�0

1
1
81T	@1�	K1�	S1�	`1�	h1�	s1�	{1�	�1T	�1_	�1�	�1�	�1T	�1_	�1T	2T	2T	2T	)2T	12\	B2\	J2_	n2�	v2�	�2�	�2�	�2�	�2�	�2�	�2�	
3d	3	3�	%3�	D3l	L3�	W3�	_3�	~3d	�3�	�3
�7_�3�	�3�	�3
�7_�3d	�3�	�3�	�3�	4d	4l	'4l	/4	:4�	B4�	_4l	g4o	�4l	�4o	�4l	�4o	�4l	�4o	�4l	5o	 5v	(5	35�	;5�	X5v	`5v	�5v	�5v	�5v	�5v	�5v	�5v	�5�	�5�	6�	6
16�	96
D6
L6
n6�	v6�	�6�	�6
�6�	�6
�6N��6�	�6
7�
777�&7�.7�97�A7�g7�
o7z7�7��7��7��7��7��7�
�7�7�7�888"8�F8N8�Y8�a8�l8�t8��8�8��8��8��8��8��8�8S9@9q9N�99@A9qL9g9So9ez9N��9S�9e�9��9��9��9��9��9��9�:+:�3:�>:�F:�T:�\:�g:�o:�:��:��:��:��:��:��:��:��:��:�:; ;�(;�N;�V;�a;�i;�t;�|;;�;d�;f�;��;��;��;�;��;��;��;�<<;#<�+<�J<�R<]<�e<��<��<��<��<��<��<��<��<� =�(=�3=>;=JF=fN=vm=�u=��=>�=D�=��=��=>�=>�=f�=v>f>vB>J>U>�]>�h>�p>��>�>�>��>��>��>��>��>��>��>�?�&?�1?�9?�X?�`?�n?�v?��?��?��?��?��?��?��?�@�@�@�%@�-@�J@JR@d]@N�x@J�@f
� ����� �(�@	H	P	X`h�@������@�r�0�g�<�K�N�_LW x(�@�H�P�X�p�x����	�X	�_	��	��	��	��	��	��	��	��	d	l	 l	(l	0l	8v	@v	H	P�	X�	pl	xl	�l	�l	�l	�v	�v	�	��	��	�l	�l	�l	�l	�l	�o	v	v	 v	(	0�	8�	Pv	Xv	`v	hv	��	��	��	�
��	��	��	�
�4
�4
�4
�4
:
s
 4
(4
04
84
@:
Hl
`4
h4
p4
x4
�:
�@
�P
�e
�4
�4
�:
�@
�P
�Y
�s
�}
}
�
�
�
0s
8}
@}
H�
`�
h�
p�
x�
��
��
��
��
��
��
��
��
��
��
��
��
�
�
 �
(�
0�
8�
P�
X�
`�
h�
��
��
��
��
��
��
��
��
��
��
��
��
��
��
��
��
�
 �
(�
0�
8�
@�
H�
P�
X�
`�
h�
p�
x�
��
��
��
��
��
��
��
��
��
��
��
��
�
�
 P(\0�8�PpXp`ph�px�����0�W�����p�p�p��	�	�	P	W0	8	@	H	P	X	`	0h	0�	�	�	�	�	�		�	�	�	;�	P�	��	�

	
;
?0
�8
�@
�H
�P
X
`
h
0�
��
��
��
��
�
�
�
0�
��
��
��
��
�
! �(�08!P�X�`h!���������������O
�Q
�X
��
�
�
 �
(�
@H�P�X�pLxX�X�e�������P�P��������������
�
�
�
� 
�(
�@
�H
�P
�X
�`
�h
p
�x
��
��
��
��
��
��
��
��
�
��
��
��
�����0�8�@�H�`�h�p>xP�p�v�����>�D�������������� �(�0�8�PX`�h�p�x�����������������������������0P8P@PHd`Oh`p�x������`�r�������`�m����ch o(�@hHoP�X�`Ph�������������X�������Xp &(00287P�X�`�h��������/�������#�����Km �(�0�8�P�X�`�h��������{�`���� 4H0\`pp����������$�D0\Ptp�����0������� 	P 
d0
��0�P�$`H�t�
���4P.symtab.strtab.shstrtab.rela.text.data.bss.rela.gnu.build.attributes.text.hot.rela.gnu.build.attributes.hot.rela.gnu.build.attributes.unlikely.text.startup.rela.gnu.build.attributes.startup.text.exit.rela.gnu.build.attributes.exit.rodata.str1.1.rela.text.unlikely.rodata.str1.8.rela.data.rel.local.rodata.cst16.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.rela.debug_ranges.rela.debug_line.debug_str.comment.text.hot.zzz.text.unlikely.zzz.text.startup.zzz.text.exit.zzz.note.GNU-stack.note.gnu.property.rela.eh_frame.group9@8�9T8�9l8�9�8�9�8� ��@a�"8&h,�� 6��1@���8
L([(�V@��08
	�)z�)�u@�08��+��+��@�08��-��-��@@�08�2P/�	B1@p�082X1%,�1'@��8<�1O�1�_J@����8[D�An���@i@XEPj8"~!�@y@��H8$�a���@�@,8&����@0�`8(�0
�"�0�,.��,��,L�, �,��,��,��,��,�,�, /-h*@��H86h2�9�	�O��@PK	}$[z�YhH.H.+gems/gems/ruby-lsapi-5.6/ext/lsapi/lsapi.sonuȯ��ELF>T@'@8	@H�H� ��!�!� ��!�!888$$(�(�(�  S�td(�(�(�  P�td��������Q�tdR�td��!�!0
0
GNU���,��2jj�d�8���/۰C�	H�‚3@(�L�`���q�CS�l����P*�f�R�������������������������������������������������n�}�'3qѮl>�&��Sɶ��
���ܮʼnSO��`��[is�|&߱R����D�/y7ř����k���Պ e�Y����&09=��By:%/�=��ejO�z�J�6�'��l#mNU�L�C�B�1�{�!�\�$�O#W��2�3S=ap��b�U�0��6�������aD7�jp#�7����ĴDI���Ί=\���4y�ݾCE���к�Q��u���o��	��r�SѮ����Io���|q%h6	󝵛���'
���=��qX�[�u�	� 	f�� #	�	��@
�y��sOT	�����
0
����[�����e	�^k�	�&����'!{

2�	RT�	s��
�? +(��>�n��	���-�
LH�	�
".���
"�
"$7x�
WK
�X
�6
�A	���A�.	9&��4�, �2���F"���	��E9
��
k
r��G����|F�PqD`��%
��S�@��
5Pui~����z@!	b��.p��	�!��]��Z\ f��n@�v �1�@q
Y��`pp�@@��`���rl�zj�U��|����-�pr]�0�	��n�`qY�n�0�5Ѓ�o�w$�p~l!@tUU
E�u�rS� n7�`nT��(����P�� ��0|F��qJ�`�p0�!�p}�I���@���p�!b��g���Џ@C�"!�l���6�n�������7�!__gmon_start___ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalizecompareValueLocationset_skip_writesigactionsigemptyset__stack_chk_failreallocfcntlacceptsetsockoptmmapmemsetsetsidread__errno_locationclosewritevkillgetppid__ctype_b_locstrncpystrchrstrcasecmpstrtolgetaddrinfomemcpyfreeaddrinfoinet_addrLSAPI_Log__vfprintf_chk__snprintf_chkgetuid__fprintf_chkgettimeofdaylocaltime_rwaitpidforksystemexitlsapi_perrorstrerrorLSAPI_is_suEXEC_DaemonLSAPI_StopLSAPI_IsRunningLSAPI_Register_Pgrp_Timer_CallbackLSAPI_InitRequestmallocgetpeernamedup2LSAPI_Initgeteuidsignalg_reqdlopendlsymLSAPI_Is_Listen_rLSAPI_Is_ListenLSAPI_Reset_rLSAPI_Release_rfreeLSAPI_GetHeader_rLSAPI_ReqBodyGetChar_rLSAPI_ReqBodyGetLine_rmemchrmemmoveLSAPI_ReadReqBody_rFlush_RespBuf_rLSAPI_GetEnv_rstrcmp__ctype_toupper_locLSAPI_ForeachOrgHeader_rqsortLSAPI_ForeachHeader_rLSAPI_ForeachEnv_rLSAPI_ForeachSpecialEnv_rLSAPI_FinalizeRespHeaders_rLSAPI_Flush_rLSAPI_Write_Stderr_rgetpidgetcwdmemccpy__realpath_chkLSAPI_Finish_rLSAPI_End_Response_rLSAPI_Write_rLSAPI_sendfile_rsendfileLSAPI_AppendRespHeader2_rstrlenLSAPI_AppendRespHeader_rLSAPI_CreateListenSock2socketbindlistenunlinkLSAPI_ParseSockAddrLSAPI_CreateListenSockLSAPI_Init_Prefork_ServercallocsetpgidsysconfLSAPI_Set_Server_fdLSAPI_reset_server_stateis_enough_free_memLSAPI_Postfork_ChildLSAPI_Postfork_ParenttimeLSAPI_Accept_Before_Fork__fdelt_chkusleepsched_yieldLSAPI_Set_Max_ReqsLSAPI_Set_Max_IdleLSAPI_Set_Max_ChildrenLSAPI_Set_Extra_ChildrenLSAPI_Set_Max_Process_TimeLSAPI_Set_Max_Idle_ChildrenLSAPI_Set_Server_Max_Idle_SecsLSAPI_Set_Slow_Req_MsecsLSAPI_Get_Slow_Req_MsecsLSAPI_No_Check_ppidLSAPI_Get_ppidLSAPI_Init_Env_Parametersgetenvgetpwnamdlerrorsetrlimit__fxstatsetreuidLSAPI_ErrResponse_rlsapi_MD5Initlsapi_MD5Updatelsapi_MD5FinalgetpwuidsetgidsetgroupssetuidstrtollprctlinitgroupsLSAPI_Accept_rLSAPI_Prefork_Accept_rsigaddsetsigprocmaskLSAPI_Set_Restored_Parent_PidLSAPI_Inc_Req_Processedselectrb_str_newrb_hash_asetrb_gc_markmunmaprb_string_valuerb_string_value_ptrrb_eval_string_wraprb_str_new_staticruby_strdupmkstempftruncaterb_str_buf_newrb_str_catrb_num2intrb_fix2intmemmemrb_yieldrb_gc_writebarrier_unprotectrb_io_putsrb_ary_detransientrb_unexpected_typerb_obj_as_stringrb_debug_rstring_null_ptrrb_f_sprintfrb_intern2rb_funcallvs_fn_add_envrb_ruby_verbose_ptrrb_define_global_constrb_default_rsrb_exec_recursiverb_output_fsrb_output_rsrb_lastline_getInit_lsapichdirrb_stderrrb_cObjectrb_const_getrb_global_variablerb_define_classrb_data_object_zallocrb_stdoutrb_stdinrb_hash_new__memcpy_chkrb_define_methodrb_define_global_functionrb_define_singleton_methodlibruby.so.3.1libm.so.6libc.so.6__environ_edata__bss_start_endGLIBC_2.14GLIBC_2.15GLIBC_2.4GLIBC_2.3.4GLIBC_2.2.5GLIBC_2.3/opt/alt/ruby31/lib64���H���Sii
^ti	hui	tii
��!�T�!�T�!�!!��!Q�!��!W� !^�(!c�0!i�8!n�@!t�H!{�P!��X!��`!��h!��p!��x!���!���!���!���!���!���!��!
��!��!-��!6��!D��!M��!a��!G��!l��!|�!�� !��(!��0!��8!��@!��H!��P!��X!�`!�h!'�p!4�x!>��!J��!W��!g��!z��!���!���!���!���!���!���!���!	��!��!��!��!)��!9��!X!�!�!�!�X!`!h!p!�x!��!��!!�!3�!��!=�!I�!K�!R�!V�!V�!W�!��!��!m�!|�!��!�
!
!� 
!(
!0
!�8
!@
!H
!P
!X
!�`
!h
!	p
!
x
!�
!�
!
�
!�
!��
!�
!�
!�
!��
!��
!�
!�
!�
!�
!�
!�
!!�!!!� !�(!�0!8!@!�H!P! X!"`!#h!�p!$x!%�!&�!��!'�!(�!��!)�!��!��!��!*�!+�!,�!-�!.�!��!�!�!�!/!0 !1(!�0!28!�@!�H!4P!5X!6`!7h!8p!9x!:�!<�!>�!?�!@�!A�!��!B�!C�!D�!E�!F�!G�!��!H�!��!J
!L
!M
!N
!O 
!�(
!P0
!Q8
!�@
!SH
!�P
!TX
!U`
!Xh
!Yp
!Zx
![�
!\�
!]�
!^�
!��
!_�
!`�
!��
!a�
!b�
!c�
!d�
!e�
!f�
!g�
!h�
!i!�!j!k!l !�(!�0!n8!o@!pH!qP!rX!s`!�h!tp!ux!v�!x�!y�!z�!{�!}�!��!~�!�!��!��!��!��!��!��!��!�!�!�!�!� !�(!�0!�8!�@!�H!�P!���H��H��� H��t��H����5*� �%+� ��h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h	��Q������h
��A������h��1������h��!������h
��������h��������h������h�������h��������h�������h�������h�������h�������h�������h��q������h��a������h��Q������h��A������h��1������h��!������h��������h��������h������h �������h!��������h"�������h#�������h$�������h%�������h&�������h'��q������h(��a������h)��Q������h*��A������h+��1������h,��!������h-��������h.��������h/������h0�������h1��������h2�������h3�������h4�������h5�������h6�������h7��q������h8��a������h9��Q������h:��A������h;��1������h<��!������h=��������h>��������h?������h@�������hA��������hB�������hC�������hD�������hE�������hF�������hG��q������hH��a������hI��Q������hJ��A������hK��1������hL��!������hM��������hN��������hO������hP�������hQ��������hR�������hS�������hT�������hU�������hV�������hW��q������hX��a������hY��Q������hZ��A������h[��1������h\��!������h]��������h^��������h_������h`�������ha��������hb�������hc�������hd�������he�������hf�������hg��q������hh��a������hi��Q������hj��A������hk��1������hl��!������hm��������hn��������ho������hp�������hq��������hr�������hs�������ht�������hu�������hv�������hw��q������hx��a������hy��Q������hz��A������h{��1������h|��!������h}��������h~��������h������h��������h���������h��������h��������h��������h��������h��������h���q������h���a������h���Q������h���A������h���1������h���!������h���������h���������h�������h��������h���������h��������h��������h��������h��������h��������h���q������h���a������h���Q������h���A������h���1������h���!������h���������h���������h�������h��������h���������h��������h��������h��������h��������h��������h���q������h���a�������%�� D���%�� D���%�� D���%}� D���%u� D���%m� D���%e� D���%]� D���%U� D���%M� D���%E� D���%=� D���%5� D���%-� D���%%� D���%� D���%� D���%
� D���%� D���%�� D���%�� D���%� D���%� D���%ݿ D���%տ D���%Ϳ D���%ſ D���%�� D���%�� D���%�� D���%�� D���%�� D���%�� D���%�� D���%�� D���%}� D���%u� D���%m� D���%e� D���%]� D���%U� D���%M� D���%E� D���%=� D���%5� D���%-� D���%%� D���%� D���%� D���%
� D���%� D���%�� D���%�� D���%� D���%� D���%ݾ D���%վ D���%; D���%ž D���%�� D���%�� D���%�� D���%�� D���%�� D���%�� D���%�� D���%�� D���%}� D���%u� D���%m� D���%e� D���%]� D���%U� D���%M� D���%E� D���%=� D���%5� D���%-� D���%%� D���%� D���%� D���%
� D���%� D���%�� D���%�� D���%� D���%� D���%ݽ D���%ս D���%ͽ D���%Ž D���%�� D���%�� D���%�� D���%�� D���%�� D���%�� D���%�� D���%�� D���%}� D���%u� D���%m� D���%e� D���%]� D���%U� D���%M� D���%E� D���%=� D���%5� D���%-� D���%%� D���%� D���%� D���%
� D���%� D���%�� D���%�� D���%� D���%� D���%ݼ D���%ռ D���%ͼ D���%ż D���%�� D���%�� D���%�� D���%�� D���%�� D���%�� D���%�� D���%�� D���%}� D���%u� D���%m� D���%e� D���%]� D���%U� D���%M� D���%E� D���%=� D���%5� D���%-� D���%%� D���%� D���%� D���%
� D���%� D���%�� D���%�� D���%� D���%� D���%ݻ D���%ջ D���%ͻ D���%Ż D���%�� D���%�� D���%�� D���%�� D���%�� D���%�� D���%�� D���%�� D���%}� D���%u� D���%m� D���%e� D���%]� D���%U� DH�= ������%f.�H�=�� H��� H9�tH�&� H��t	�����H�=�� H�5�� H)�H��H��H��?H�H�tH�m� H��t��fD�����=E� u+UH�=J� H��tH�=.� �y����d����� ]������w�������ff.����n� Ð��H�GH+F�Hc�AVI��H�@AUATL�$�USH��tQH��H��tIH��I��L9�r�0H��I9�v'�KH�SM��sH�;�Յ��[]A\A]A^��[D��]A\A]A^ø������ff.�f����=~� �D���� Ð��OAWD�D�_AVAUATUSD�6�^�nA��x�j׋G3GD!�3G��V���\$�ЋW�^$��D�D1��\$�!�3WA��ʋN��F���p $E��‰L$�A1�A1�D��D�^!�D1�G��;�ν�D�\$�D�E��D�V���D�T$�A!�A1�E�E���|���A��
1�A�D!�E��1�D�D��*ƇG���D1�D�!�A��1�A1�D�D�N���D�L$�E��	F0�D��!�D�nA1�D1�D�G���F�E��D�f ���D�d$�D�^(A!�A1�E�E��ؘ�i��A��
1�A�D!�1�D�D����D��ʋ^0��D1�D�!�A��1�D�E���[��D����1��!�D1�D�D�N,��A1��D�L$�G����\�E��A!�D�f8A1�E�D��"�k��A��
1�A�D!�1�D�D�N4��E���q����D�D1�!�1�D�E���Cy�D����1��!�D1�D�D�V<���1��G��!�I!�1�D�D�D$��
�E��b%���1�!�1�D�D�D$��E��@�@���1�!�1�D�D�D$���	�E��QZ^&��1�!�1�D�E��6�Ƕ����1�!�1�D�D��]/։���1�!�1�D�E��SD���1�!�1�D�E��
��؉���	�1�!�1�D�D�D$��E��0����1�!�1�D�D�D$���E�����!��1�!�1�D�E���7É��1�!�1�D�D�D$��	�E���
��1�!�1�D�D�D$��A��0�ZEA��A1�A!�A1�A�A���㩉�A��A�D1�!�1��t$�D������D��1�!�A��
�ogD1����	�1�D!�F���L*�1�D�D$�Ή���1�A��A!���B9��A1�DD$�A��A�D1���D$�����q���D�D1�1�‹D$�����0"a�mD���1�G��8�1�Ɖ��1��1�D�D�D$��	E��D꾤���1�1�D�D�D$�A�����KA���A1�A��5`K��A1�AЉ�A��p���A��1�A�D1����D1�D�1��A��	�~�(D����	1�G���'���1�����1��1�D�D�D$�A���0��A���A1�A1�AЋT$�A����2���A�1�D1�֋T$��	��
9��ى�D�D1����1��D�����1�1��C���|�A��A1��A1�A��D$�A����0eV�ĉ�A�1�D1��A��D")��D�t$��	��D�	�D1��A��
��*CD������G���#���	�1����
���	�1�D�D��9��������Ή��	��1�D�D���Y[e��\$���	�1�D�E�������D�t$�����	щ�1���D�E��3}���D�\$�
���	�1�D�D�D$���E���]����	�1�D�E��O~�oA���A���D��	�1�D�E��
��,���D�T$�����	�A��1�A��D�E��6C���D�t$���
��A���N�	�1�A���~S�A��D�E��A����A	�A1�A��5�:�A�D��A��A�D	�1�Љ�3���*�\$���D�	�D1��D��F���ӆ�[��
��]A\�A]A^	�1������։�	�1�DƉ�A�4A_���OW�G�O�W��ATI��1�U��SH��dH�%(H��$�1�H��H����H�<$t)H��$�dH3%(u<H�Ġ[]A\�f.�H�{��1�H�މ�DŽ$�L�$$�l���u�DH�
y� H�A(H�Q8H9�s;8u�fD98tH��0H9�w�1�Å�tH�P0H;Q0v�H�Q0�Df�H�@$@@�@,�������DUHc�SH��H��H��H�@���H��t#H�SPH�H+S@H�C@H�H�SPH�CH1�H��[]ø������f�U1҉�1�S���H������t��t/H��1�[]�fD��t��H���‰߾[1�]�r�f�����ff.�SH��dH�%(H��$�1�H�T$H�t$�D$�D$��&�Ã��tf�|$t'H��$�dH3%(��u0H�Ġ[�f�H�L$A���Ǿ������ff.�f��� ��Hc�H�vL��H�L9���H��H)�H����S�Nf.�E��������L�I؃�H��L�G�L�E�C�H�D�G��w�I9�thH��H)�H��~SH�pH�2H�pD�H�2H�pD�XH�2�pA��E�L�@��L�Ic�A���pD�Hc�L�M�L9��i��������[�f��0��u�H��[H�1�ø����Ë��u�H��H�1��f�AVAUE1�ATUH�-�� SH�}(t[D��]A\A]A^��EEA������!Lc�@���D��
 DI�E1�1�A���Mc�L���b�H��H���t]L��1�H���|�K�vH�](H��H�]0H�H�]8H�CH��� H��� H�CH��H�|� H�}� ���[D��]A\A]A^�H�=�pA�����1����H���H���H+��Hcp�G )�H����H��xsH9�AVHN�AUATUI��SHwH��D�wH���L��H��D���z�I��H���u!�|��8u
��� ��u�D��[]A\A]A^ÐH��~���[]A\A]A^ø�����fDUSH������tMH���������u���8u
�0� ��u�H�i� �E����H��t�(H��� H��t�@��H��[]�ff.�@AWAVAUATUSH�������ж ��t8A��A��I����A��f�I�7D����#��Å�-���tx��� ��u�D��D)�H����[]A\A]A^A_��A)�E��~ڋn� ��t�I��f�H��)�I���~�H�PHc�H9�v�HI�H)H�x���������t���s����E)�E��AO��r���1��k���S�e� ��t-�=W� ��t+1��D����u��[�8������1�[�@��9�[����ÐAVAUATUH��SH��H��PdH�%(H��$H1���H��
fDH��H��DB u�L�d$@��H��L���T��D$@Ƅ$?</tc<[����:L��f�E�5�H������|$@*H�X�zH�5�mL����A�ƅ��;�EM�����H�}�lf�uL�����1�H��$HdH3%(�QH��P[]A\A]A^�D�
M�l$�]f�ML����H�����|$A*H�XA���1��;:�
��1�H�H����H�Í@�=����E��uf��1�f�]�Y���D�Ef�1�H�T$)D$H�L$L��D$H�)D$ )D$0H�D$�*���upL�d$H��A�T$I�t$��L�����L��E1�M��������EA���<�����EE1�M���"����::A�D$M��fA�$�
����������������AUI��ATU��SH��(H��$�H��$�L��$�L��$���t@)�$�)�$�)�$�)�$�)�$�)�$�)�$)�$dH�%(H��$h1����t�=ݶ ���ML�d$`L��@��@��u��������L9���H��� H�;H�L$HL��H��$P�D$HH�D$PH��$p�D$L0H�D$X��H��$hdH3%(��H��([]A\A]�H��� H��L�kH�����L�¾d1���C�H�HÁ��K����-0� ��H��H�ߺUA��L��j�dH�����1���H�H�XZL9�����H��H�� M��1�L)�H��j�H�;�w����f�H��1�L�d$`H�����H�t$H������uI��������D$�L��L�j�P�D$PD�L$(1��^�Y^Hc�L��L����H�D$L��p�L���P�D$P�D$$P�D$0P�D$<P�D$H��P�D$TD��l1���H��0Hc�L�����/�ff.�@��AWAVAUATUSH��(dH�%(H�D$1�H�=� �.�D$�H�l$L�5UiL�-RiL�%p@�H������v�A�Dž����T$�Ѓ���<~$��M��L������D��ME�1����D;=(� t�D;=�� tUD�����H��H��t�H�H1����@�1@�Ɖ�@����H�ҳ H��t�(H�2� ��h�K����V� �����9����H�5	� H�N0H�V(H9�s*D�A�H�A�E��t�DH��0�8��u.H��H9�r�H�F0H�D$dH3%(uH��([]A\A]A^A_�H�N0�����D$�@�1�D$�X���H�� H���D����C���ff.��AWAVAUATUH��SH��H��(�=�� dH�%(H��$1���t1������thH�C(I��I��D�3L+cI)�H�C D�{H)��=��D$��H��E��E��AT��H�5on�AU1�U�L$,�,�H�� ���u� ��t)H��$dH3%(ulH��([]A\A]A^A_�@D�H�\$H���H�߹�AQL�yn�$��XH��Z�����t
1���fDH�=�f�����5�DAWAVAUATUSH��L�+� I�Z(M�j0L9��H�|$E1�E1�E1�@��B��ve�CA�l$����A�BD)�A;B�E9r�
��� ��~ H�SH�L$��H�H)�H9���fD�CA��f��A��H��0I9�w�A�R��D)���1�)ȃ��H��[]A\A]A^A_�fDH�C H�t$H)�IcBH9����C��i�gf��f����)���f9�u�ΰ �����Cf��~pH�5im�1��M��;�	�����tp�CA��L�ݯ A��f�C�5���fD�C��f�C�����A�������H�51m�1�����;��1����u�����8u��L�e� ����H��E��E��D��[H�5m]�A\1�A]A^A_��fDH�t$H����������@E1�E1�E1��z���f.���UH����S��H����H����H��I��[H�5Qd�1�]��f����� 1���u1��=� ������ު Ð���Ҫ �D��H�=ͮ �@��ATUSH��dH�%(H��$�1�H���}H�H��H�1�HLJ	H�ى�H��H)����	���H�H�{`���I��H���0H�CxH�S`L�c`� L�H)�H�CxH�CpL�H)�H�CpI��$H�Ch��H�C8H�C(H����H I���H��H�C0H��(L�cxL�cpH����l��������twH�T$H�t$���D$������t
�}���8kt0�����1��kH��$�dH3%(uiH�Ġ[]A\�fD�+����C�����C�1����1������H�=tb��1���1����#���_���fD���������ff.����S�e� ��t	1ۉ�[����H�5L��
�� �Ƭ �e�H�5>��
�T�����������H�=� 1��8����tI�� �T��H�=�a�ά ���H���c���H�5�aH����H��� ��[É��D�����1��?������H�=u� �0����H�W(H�w`HLJ�H��HLJ0H���H�W�H�VH�W�H�W�H�W�H�W�H��)���81����H�����SH��H�H��t�
��H���H��t���H���H��t����H�{@H��t����1�[�fD��H��tG��wBL���Hc�A�T�4��t/Hc�A�pH���H�H€:t
�H���H���1��ff.�f���H��tP��tJSHc��H��;��}H�S�HH������[������~	Hc���и����[Ã����AWAVAUATUSH�Z�H�H��H�D$H���:�G�����H���%H����I��H���I�����I��I��L��fDA���)�Hc�H����L9�Hc�IO�IvI���
H��L�����H��tML)�H��L��H�XH��H�����A��I��A�$��D)��EH��[]A\A]A^A_��L��H��H��H����A���L�|$I���I)�A���M���?����D���L���L�Hc�H��~�A����-���H��1��|���������v���@��AVAUATUSH������I����H��H����H��H����H���H+��E1�H����H9�Hc��HO؋��)�H�H��~)H9�H�wH��HN�H�H��I�����E��L�L)�H��t6�E�u@H��H��D���J��H���u4�O���8u
�`� ��u�M��t-M��[L��]A\A]A^��H��~�I�H�H)�u���I�������D��H�O(H�W8H��LJLS���H)ʍB����H�GpH�0H�pH�@H�wp��~Hc�H�HH�� H�P�H�O8H�Gp����AWAVAUATUSH��H���H�T$H����H��H�<$�I��H�=�\�������HcB$H���H�@H�,�H9�r�Zf.�H��H9�vGH�3L���L����u�H�CH��[]A\A]A^A_�H�D$L9��I��M9���f.�1�H��[]A\A]A^A_��H�$1�L�={� L���@A�l�4��tI�4�L����������H��H��u�H�D$HcP 1���~�H�$H��L���M�tM9�s�H���H�$I�D$H�D$@IcMIcmH,$L�|
L9��)���A�\$���)����K��H�8H�D$�'���-t	��_����H��H��I9�t�����H�U:�t������8����IcUIcEH$H€:����������H�$Hc�Hc�A�VH��H€:�������@��AVAUATUSL��$���H��H�$L9�u�H��dH�%(H��$@1�H����H��H����H���H����H��E1�L�
� L�kh�f�H���Hc�HcT�4��t7�qH��M���
H��Ic�A��H��L�E��H�TD�T�tH��H��u�H���HcP ����H���H��L�L9���Ic�I��H��L��f�H��H�� I9���HcHHc0A��H���LcPI��HcHH��B�D�BH�J�HH�2�JA��u��H�
�� � L������$DI��H�
f� Ic� L���n��E��taE1��@A��I�� E9�~CA�MI�UI��A�uI�}�Ӆ��H��$@dH3%(u6H��@[]A\A]A^��D����1���@Ic��U������������ff.����AWAVAUATUSH��XH�t$ H�T$dH�%(H��$H1�H����I��H����1�E1�L�-�fH��L�%�� H��H���Hc�HcT�4��t/�HH��A��A�t�I�<�H���L�D$A�ׅ��4H��H��u�H���D�t$<HcB ���L���H��L�H�D$0I9���H�\$(L�t$@fDH�D$(A�l$Ic$A�HTTPH������A�F_L�<H�D$��O�Hcʼnl$8I�H�D$I9���M�nI��I�o�I���_@��-t���H���A�E�L9�u�H�D$I�D�t$8L�D$�L��IcD$IcT$HT$���H�D$ A�L$�Ѕ�~"I��L9d$0�-���H�l$(H����B D$<H��$HdH3<%(u'H��X[]A\A]A^A_�DI�F�v��������������ff.���H��t7H��t2H���D�@$1�E����H���H��H��D�����������f.���H��t7H��t2H���D�@(1�E����H���H��H��D���S��������f.���H����H�O`H��tz����Ѓ�tr��L�G@������H�WPL9�vH�wpL)��L�H��H�V�H�wpHc�0H�T�H�Q�����,H��(LJ(LSH�1�H�Oxø�����f.���H����H�GpH+GxH�������G�����SH�������H�C(H9C8tH�����H�SpH+Sx1�H����~J�
� �����u$�{H�sx����9��~H�{�������ǃ�H�S`H�SxH�Sp[�f�H�G(H9G8�c���1�������l���LJ�H�W(H�W8H�W`H�WxH�Wpø�����f���AWAVAUATUSH��XH�t$dH�%(H�D$H1�H���.H�=�� ���GI�������;��H�G(H9G8t
H�$���H�$H�D$L�|$L�d$H�$H�l$ I��H��L)�H����H��@�@L�|$0HO�L�d$ �D$LS�BL�jH�T$8I׋z� �D$D��H�D$(H�l$��uA�~H�4$D����H�I9�~�I�~��H��L)�H���L��H+D$��H�t$����H�L$HdH3%(uH��X[]A\A]A^A_�H��������4��@AWAVAUATUSH��H�$H��dH�%(H��$1�H��I��I���5��H��8����H��I��H��aHD����A������AW�H��SA���1�AVL�{R�AU�c���H�� H��=O�Hc�M��t7L���?��1�H��$dH3%(u&H��[]A\A]A^A_����f�����?��ff.�@AT�~f�A��UH��SH��dH�%(H��$1�H�|$H��)$H���H�H��� ��xH��$dH3%(u?H��[]A\É�I��D��H�5�Y1��
��1�H�5�QH���i������������ff.�f�ATUSH��H�$H��H�$H��dH�%(H��$ 1���� �����?/H��H�����H������H���bH�ߋH����������!�%����t�¹�����D�H�WHD���@�H��H)��</��)�Hc�Hc�H�1�H���>��H���JL��$�H��L���}��H�����H�=�PL������������AH��1��2���Ń������uRH�=ۚ H9�t
H��t���H��1�����H��� H��$ dH34%(����H�� []A\�fD����T����������>���@�������4�����
�+����H��H�5X1�������r����r���DH�߹����������S���fD����������H��H�5�W1����������C����H��tv�����t]S��H��tC�uWH�C(H9C8tH������H�CpH�� H��H�H��H�@����H�Cp�P��H�����1�[�@���s��뢸�����ff.���H��������u��u1��f�S��H��tR�ubH�C(H9C8tH���0��H�CpH�e� H��H�H��H�@����H�Cp���H�{�:����������1�[��1�H�O@H9OPv����닸��������AWAVAUATUSH��H����H���|���I�֨�,���aH��H�t$H����>��L�{8I��H�C0L)�H9��>L�t$L+{(L��A�@L��L�f�I��M)�M����K�H��@���σ��LSL�Cp�N���I�H�D���I�0H��I�@H�KpM��~H�C(M�xI�H E1�I�@H�C8H���L�1H��M�L�I�H��H�KpH9��e���H���=�����thI��L��M)�M���U���I9�t
H��������tDL+t$H��L��[]A\A]A^A_�DM��@�@M)��(������������I�������H�t$H��L�����Hk8�f.���H�������������AVL��AUI��ATI��U��S���H���u\��H�߉���K��A�D$�{L��ǃLS�������H��u0�{L��[L���]A\A]A^�x����;������[H�����]A\A]A^�H���ff.���AWAVAUATUSH��H����H�������H����������D$����0��xI��H��I��H������Lc��\�CHc��T���
t��
u(��H�DLc���L�H����
t�
t�L�������~6Hc�A�T���
t��
u#��H�@��~A�L�H����
t�
t�E�<A�G=���I�|$PH�H�TI9T$Hs7H��I+t$@L������2%�)�)���������I�|$PL��H��Hc�A���o��Mt$PH��L��I�FI�D$PA�:I�|$P�M��M�D$PI�I�@I�D$PA�Ic�$0fE��T8H�Ѓ�A��$0�D$H��[]A\A]A^A_��D$������ff.����H���
H����B�=����������0���AUATUSHc�H��f��D�A��<
t<
uH���؅�u�H��[]A\A]�I��H�PH��H�DI9D$Hs3H��I+t$@L������2%�)�)��������tQI�|$PH��H��A��� ��I\$PH�CI�D$P�Ic�$0fE��T8H�Ѓ�A��$0H��1�[]A\A]ø�����S������D��AUATA��UH��SH���?dH�%(H�D$1��D$f����f��
t1�����f����H�L$dH3%(����H��[]A\A]ÐA�1Ҿ����Ã��tʼnǺ�1��Կ��H�L$A��ߺ�訿����u#D��H��������uD����������o���輾���߻����D� H���:��D�e�O����A��k���DH�}A�n葾���}�N����3�����H��t����������ff.����U��SH��dH�%(H��$�1�H��H�������u/��H���U��H��$�dH3%(uH�Ę[]���������褿��@��1�H�=�� t������AUATA�'USH����� ��'DN�uD�������� H���@�A�����H��H�>� H����H��tH�-�� �T���ڐ �9����ƉljÐ �*���U����D�k H�-� D�cE��u<�����D�����SuG�CH�,H�C���1�H��[]A\A]�@A�|$�C�{�˸�����ك�ÉS�ff.�@��H�u� H��t�8�ff.�f���H�U� �BH�B(H�R8H9�s��H��0H9�w�H��� H��t	���H��� H��t	����fD��H�}� H�H;� �wH��H�H;� �����ff.�@��ATUSH��H�� dH�%(H�D$1�H��� D�`豼��H�SX�;� ���H�kXH�-?� �b���H�g� ������ �� H�� H��� H��tH��� 1�1���H�-� �E��H��� H��t��{1��F���H� ��uH��� H��tA�D9 ~�&� �$� ��ut�;���u]H�LS�[H��H�$��O�D$�ʻ���H��߉D$觻����� 1�H�L$dH3%(u)H�� []A\�D�+��������������t���@�����H�E� SH���@H�Xt1����H�SXH�BH�B�{�۽���C����1�[���AWAVAUATUSH��HH�� H�|$H��$�L�edH�%(H��$81����H����L��DŽ$(H��$�艾��H��� H���u������cH����L��DŽ$(H��$��K���H�ċ H���7������H�h� H����������H��� H��
�������H�Њ H���������H�D$1�E1�L�d$ �ڋ L�|$ǀ��D$H�� H��t	H�=�� ��1�����I��L9�t71���������L���P���C��t�S�����D$fD�V�F���H�� �L��H�1���H�Hc;�ƺ���;M��L��H�D$H�D$�����������?)ѺH��1�H	T� 1��� �Ń�������������8��1�H�5�� �譸��1ҿH�5� 蚸��1ҿH�5l� 臸��1ҿH�5�� �t���1ҿ
H�5� �a���H��$8dH3%(���kH��H[]A\A]A^A_�fDH�ъ H��udD�C�S�K�
D9���H��� A�����H��tD��H�5�H1��V�������|����� M��� �������fDD�0D�CE��~�E��~����E���D軺��A��u���D$�t$9��/������������D�;�)��A��H�D$D�pA���uc袶���0���k������b���H�=Z?D�������j���f.�H�=*?�����������H�=�G�����������1�1����H�\$H�CX�������������=�{ �f����=�{ �D��H�ň H��t�x�ff.����H��� H��t��x�x����H��� H��t��~�x����H�e� H��t��~�x����H�E� H��t�x�ff.�����=ֈ �D���ƈ �D����� Ð����� �D��AUATUH��H�=�=SH��8dH�%(H��$(1��=���H��tH��� �H�=(� ��H�=�=����H���E1��
H��螹������H�=�=���H��t�
1�H���v������ H�=�=�ij��H��H��t�
1�H���M���I��A�ą��WE1�H�=�=萳��H��t�
1�H��������� H�=p=�j���H��tH�Ǻ
1�������_���H�=^=�C���H������ H�=U=�$���H��tH�Ǻ
1�谸�����)����Ķ������H�=0=��H����1��
H���x������OH�==�ò��H��tH�Ǻ
1��O������ش��H�==蜲��H��tH�Ǻ
1��(���������H�=�<�u���H��tH�Ǻ
1��������ʺ��H�=�<�N���H��tH�Ǻ
1��ڷ����蓲��H�=�<�'���H��t�=���H�=�<����H��t�
1�H��蝷����� ���_H�=�<���H��t�
1�H���o������ D��� ��� �r� E����H�=�<�ٶ��H�����=R� ��u	�P�E� �5;� ����H�=�<�c���H�����
1�H������� �…�t�� �����H�9w H�H����H�H����D�ք L��<L�
<L��<�C�
H��L���������t@H�ֹL����€���D	�t%H��tAH�H��t9�H��L���������u�H��fDH�JH��H�J�H��u�H�H��u�1ۉ�H��$(dH3%(��H��8[]A\A]�fD�� H��膲���D����<G�~A��<MED�A������s���D��H�H�� �_�����豲�����@H�= :�ܯ��H���������fDH�=|9輯��H����������fDA���f��@�[� �#���f�諳�����fD1�E��H������n���H��u �8������H�={:路��H��H�� H����H�5h:H���Ŷ��H��H� ����H�����-ǂ ������H�5D:H��萶��H�5G:H��I��H�|� �w���H�5::H���h���H�55:H��H�O� �R�����~H�5$:H���>���H�'� H�=H� H���~A�ԅ��L���H�=�A���H�=!� 褮��H�� �$���@H��H�$H�D$�b������DH��H��$���$��̯�����t
议��1҃8k�‰� ����H�=�8�ܭ��H��t1��
H���h�����~��� H�=�8貭��H��t1��
H���>�����~�X� H�=�8舭��H��H���iH�Ǻ�1�1�諵���Ã����H�T$�ƿ���������D$(?���H�5� ���ȱ��H�������W���H��� H��t�xc�@d�x��@�D�
�� E���9���D��� E���)����Z���f�H�=�7贬���n� H���K����]����
b� ��u
�T� '�J� �������8� '������� �)���f��Յ�tbH�� H���-�������DH��H�5V?�1�������S�����������A��Hc��~���L�%� H��H�� �a����s����Å�t��=� �������r ��u
�| �5� ������`���H��H�5�>�u���H��H�59>�1��U����������H��H�5A>�F���ff.����AVI��AUE��ATI��UH��SH��t��4H��u!�(fDH��H���t���H��L����G���H�]H��u�M��tE��L�����[1�]A\A]A^ÐIc�L��L���������H�#Eg����H�GH�H��ܺ�vT2H�G����AWAVA���AUI��ATUH�oSH��1�H���G�O�@�ƉWD���������W��?t;A�ĉ�D��H��H�|�@D)�A9�rhA��G�t4�L��L�����H��L���9���A��?vWE�f�A��I��I��I�H�޺@H��H��@�ܱ��H��L������L9�u�A��?D��L��H��H��[]A\A]A^A_鬱��I�������ATL�fUH��S�FH�����?��L�H�z���?)ƒ�w=��t1������9�r�L��H������f�CAD$AD$ I�D$0��71�)�����H�CH��L��H�CP�?����oH�{1�H��MH�H�CPH)��KX���H�[]A\�ff.�f�AWAVAUATUSH��dH�%(H��$�1�H��t^� �I���A�����f�Mcg I�oA�_@L��H����#���H���uM�(����8u
�=9x ��uٽ����H��$�dH3%(����
H�Ĩ[]A\A]A^A_�f���~�A��A������u���I���ALJ�f�8LS�|�x�r�@t�P�Hf�@�H�P�X���N������	M�g���A;G �ZA���9�~u���E�o)�H�Hc�I��H��L��D������H���u$�����8������5$w ��u�����������A��M�gA���9��I�D$,H�D$Hc�I�I���D�hA�����h(A9��}A�� �/Hc�I���H�4@H���5���H���A���I���I����h$A9��}A�� ��Hc�I���H�4@H�����H����A���I���I���H�l$�p(I���L��H�����������I���I���L��p$�������hM���Ic@���o9��gIcP���[9��SIcp���G9��?IcH���39��+I�H�H�H�H�I���H�T$I���Ic@ H)�I���H��H��I���H��H�H���I���H�I���IcHI���H�H��H�D$I9���E����1�D�L�4��t9�d�<B�9�ZH��H��u�IcP ���kI���H��H�H9�r*�RP9�!�P9�P9�H��H9��-�9�~�H�51�1�荮��H�5�0�1����w����>���f�H�� ��H��� ���I�GA�G  I�������P�Hf�@	f�@
�H�H�P�P�H�H�P�P�H�H�P�P�H�H�P�P�H�H�P�Pf�@f�@f�@�H�H#�P�P �H �H'�P#�P$�H$�H+�P'�P(f�@f�@!f�@%�H(�P+f�@)I������1��
fDI���HcȋL�4��t#f�BI���H�T�4�
�rf�B@�2�JH��H��u�M���IcP ����I���H��H�H9������pH��@�p��p�H��H�@�p��p��H��H�@�p��p��H��H�@�p��p��H��H�@�p��p��H��H�@�p��p��H��H�@�p��p��H��H�@�p��H�H9�w�M���A�pI����b���Ic@I���H����0�Zv ALJ���t`�v 
�u A�������u 1������L��Hc�蟩��I��H������I�GA�o I����u���I���D�%�u D�-�u �B(A��A���1Ic�H�4II���L��I�
�9�H�qH�=�-����������I�J�D�B(�9�xH�qH�=�-���������XI�J���B(��$�A�D$I���KA�zH�L$�;M�bfo/u L�t$ L���AoL$AT$M�l$)�$�蘪��� L��L������H�L$�L��H����L��L�����H��$�I�D$H��$�I3L$H1�H	���D�$$D�l$E����D��D�l$�â��H�=dt I��H��������I��D���%t ���M���H�=t t"L��D��L������Ń����������P�|$�W��������E��t$A9u��H�t$��~��������D�������Ń�����5�s ���$A�?D�5�s ���t� ���A�����H�5e)L���
���H��tH�����H��s f�)�s �#���A��H�5f 1�����H��@�������H�5
+�1��9�������L�����H��������
1�H���o���I������H�5�2�1���H�53�1��ݨ��D�%�r ��r D��D$����H�=�r I��H��tZE���W����7����E1�1�1�1���ͤ����������H�=%3������H�5P*�1��`�������E��|$菦�������M���2����;�����|$�g��������E������1�H�5_*L���u������I�}臧���Ń������1�H�5!*L���K�����fD�=�q ������-�q ��q E���D$A�����I���F������H�5f)�1�膧��������H���H)���H�5(1�H��1��a�������1�H�5�)L�����������
����ܟ��1�H�5�1L�������A�#��L��H�
#3H�m �w������1�H�5^)L���a����ff.����AVAUATUSH��dH�%(H��$�1��D$H���H���ѡ������	�;1�L�l$L�d$L�t$H�k�l����rl �����{�ul�;�����L��L���D$�����C�����H��p H��t�@��H�dp H��t��{1�����f�|$���=�o u|H���4��tH��舴��H���0�����k ���d���1�H��$�dH3%(u}H�Ġ[]A\A]A^�D胜�����������������������{�H�5)b �,���H���f����ы{L���A�����;����۝��ff.���AWAVAUATUSH���D�=do dH�%(H��$�1�E���xH��� ���H�-�n H�����}����$o ;^a �DH�-5o H��t1��1���H�ED��j E���H��$L�|$PD�cA����:E1�A�f�D�
ej E����D��n E��tH��n H��t
�@f����L��H��1���H�Ic��W���D��H�D$PH�D$X����A���?)ѺH��H	��D9#��1�1�A�|$M��H��j D9#������H�5n H��t
�@D9#��5` A��D9���1�葳��������f������H��$�dH34%(���'	H���[]A\A]A^A_��K���L��$�H�����DŽ$hM�l$H��$�L��謞��H��$L��H��H�D$@菚�����AH����L��DŽ$hH��$��e���H��$�L��H��H�D$0�H������PH��$�L��H��H�D$8�#������+H��$`L��
H��H�D$(������H��$ L��H��H�D$H�ٙ��A�Dž���H�D$PE1�L�l$`H�D$H��$�H�D$H��$`H�D$f�D�%�k E����H�l H��t	H�=�g ��1��d���I��L9�t<1��ձ������L���5����E���D�uE���M��E1���V�&���H��g �L��H�1���H�Hc}襚���}L�D$L��H�D$PH�D$X�����������?)ѺH��1�H	T�`1�vg ���������������8�����H�t$(1ҿ
荘��������x������=�����������_����5k ��tH�6k H��t
�@f���,���D9#�
D������C�����H�k H��t�@��H��j H��t�D�c1�D���N����
Pf �����=j �����{�H�5�\ ���H����������H�Qj H��t�*H��j H�������B���(���@H�aj H��t�@��H�j H����������@蛖���8�B����-���DA��D9�����M�����=�e ������荟����������=fe �����H��i �
H��t��D��H��i H��t�
�A9����������H�ai H��tD��҉T$$D�E~:E��~5���7����T$$A��諙��A�����蜙��A��u������D�E�U�M�
D9�vH�i A�����H��tD�H�5'�1�覞������̞�������D$�g����0������������H�=� �G����T$���fD�}蠩���C�����1��m���H�|$I�����H�|$���H�T$H�t$1��`������6�����������1�EM��tA�M�gM�g�{E1��C����C����H�t$1ҿ�����������H�=$)�'������f��;�	���������>���fD�D$$�_����0���d������T$$�W���H�=�T$�7����T$����fDD�#A�����������fD�~g ���R���D�c E���B���H�Kg H���2����9�b �����{�H�5�Y 蠔��H�{�w������H�=�'�F������蜓��H�=�'�0莖��M������A����H������…��
H�{����H���Ƙ���lb ���������H�=��Ԛ��������������H�t$1ҿ脒������H��e �����f ���L�=�f �hf H�Ef �Gf H��e H��tH��W 1�1���L�=Gf A�G��H�f H��t��{1�蝦��D�-�a E��uH��e H��t!�E�9~�za �xe �����;���t�ؕ�������H�t$@1ҿL��$��ْ��H�t$01ҿ�Ȓ��H�t$H1ҿ跒��H�t$81ҿ覒��H�t$(1ҿ
蕒���kH�LSH��$���&��$�讒���L��$�舒���yd �e ���H�=�"�*���������%���諚���������,���H�=�%�����Q���H��d H��t*f�C1��C�D$�C���C�Ӗ���T$H�C(H�C ��d ����֒��fD���=�d ��d �ff.�@��H�E` ������f.�f�����fD����h H���ff.���H�V H���H+���H���HO��D��H������1��f���1��f���ATI��H��US��Hc��H���Hc�L��H���:���H�=3h H��H���ؔ��[�]A\�ff.���H�飕����H��H�=QU ����H���f���H��H�=1U �܏��Hc5�g ;5_ H�=�g |6�a���H�vg �����H�rg ��kg H���fD�����f����?��I�H�=�T ���H���H+��9�M�1���~+H��Hc�Hc5	g H5�f �ѐ����~�f H���f��ff.�@��H��H�=QT �̏�����tH�H��H�D��H���ff.���H��H�=T 茕��H��] H�����H��H�=�S 蜏��H��] H�����H��H�=�S ��������tH��] H��H�����SH��H�\$H�t$H���E���H���]���1�H���#���H��[�ff.�f���AWAVAUA��ATI��U��SH��H���<Q��~v<R��<Su"�H�=2%H���������@Mc�L��L��誕��Hc�H��I��蜕��H�=�e L��H���:���H���[]A\A]A^A_�fD<Pu��
H�=�$H�������u��ƀULc�u��H�=|$H��������t����?H���,���I��H���H��A��L)�A)�Mc�H��L��H�L$���	H�=1$H�$�K���H�$H�=�d H���x���H�L$L��H��踔���H�=$H�$����H�$H�=�d H���@���1�A�??L����I�L���y����H�=�#I���Ս��H�=^d L��H���������fD�
H�=p#H��������r����:�i������@A�L�%��Q���fDO�<4L��E1�����=�c �t1��@H�9Q H����=�c ����t�USH��;=[ ��H�=y_ �4���H��H��虑���Ń����H���v���H�����HcOc ��H���ݍ������E1�A���H��1�����H�c H�������裎��1�H��[]�f.�Hc������H��b H��u�H�=�"�{������@��b 1��H�=I"�T������=�����fD蛊���8�4���H�پH�!I��H�#P H�81�衒��H�������N���H�=�!�����܍����1���f���AU1�ATUH��S��H���V������������-b ��+b Hc�D�%�a �(���I�Ņ�t"D)�A�DI�D9�uD��������H��L��[]A\A]ÐD)�Hc5�a H��H5�a Hc��D����a ���H��L��[]A\A]�@H�}@��u&�����xU�-oa �aa )�9�O���T���賒���ؐD9�Hc5Fa L��DN�H5(a Ic��Ћ��D%)a �U���@H��A�[L��]A\A]�ff.��AWAVL�5�` AUATUSH���f�D9-�` ~N��}���D�-�` M�&�H�[ Hc=�` D��)�I��L�Hc�H��蚍��H��t�L)�D)��XHc�H��豍��I�ą�~Hc5s` H��H5Y` H������[` H��L��[]A\A]A^A_�f���H��1��a�����tH���#����H���fD����_ SH����_ ���2f����H������_ 9�_ }1������uٿ��f�H��[�ff.���AUATUH��SH��dH�%(H�D$1�����H��E1�I���G@H����I9�}HH������H��uj�� tUH�CJ��H��L��I��H�$�u���H��� u�H�CI9�|�H�L$dH3%(�uVH��[]A\A]�@H�C �f.�H���Ȏ��H���H�=��_���H��H��H�$�����t���@��1��f���USH��@��t����fDH�����t�H���H��u�H�t�H��H�_ H��@��uH��uNH���f���H�H�k�� t*H�pH�PH��tEH�;��H��H�[]H�D�f.�H��H�p����H�H��H�у�H��t��@H�=�H�T$H�4$裈��H�T$H�4$����SH������H��[�ff.���SH���s���H��H������[Ð��UH��SH��H��dH�%(H�D$1���uH�����tH�H�ƒ�H��tsH�����蒎���D$@��uyH�����tpH�E��H��ucH�}t\H�E H�t$�H�8�PH��H�����HD�H�L$dH3%(u_H��[]Ð�� u+H�S���y�����D$@��t��H������f�H�{�R���H�SH��u��7���������4���@SH��dH�%(H�D$1�H�|\ H�$H��W H��u%H� D�H���;���H��W H��t�H�=8\ H��H���(���H�D$dH3%(uH��[�譅��ff.�f���USH��H�=OI �*�������tyH�=�[ H��t�?���H��[ �����H��[ ��[ �y���9�[ uI1�H��[ ����H�-�H H�;H��H�u譋��H�uH�;H���~���H��R H��H��[]�D�:[ H��V H��u'H�
��H������H��V H��t�1�1�H�ƿ�����h���f���H9ER tH����ATUH��S���
���L� ����H�5�Z H�=�H�������L� H�IV H��u%L�%uD�L���{���H�$V H��t�H�=�Z H���H��[]A\�g������AWAVAUATUH��SH�����C���G�H��L�-�L�d��tf�H�������H��ubfD����H��I��H���5���I��� ��M�~M����I�FA�|�
tH��F H��H�0���H��L9�t[H�;@��t�H��u�fDH�=x����H���f.�H�����u5H��H��H��H�=��������L9�u�H���[]A\A]A^A_�fD��t��.���fDM�~H�����H���L���ȃ��I��� �0�����f.�H�F H��H�0�.����ff.����AVAUATUH��SH��dH�%(H�D$1�������I��H�6A���L�5y�H�H�������H��u4H�����A9�~NH��E H�0H��tH�����I�t�H��@��t�H��u�@�L��裁��H��H���h���A9��H�LE H�0H��u;H�L$dH3%(�uPH��[]A\A]A^ÐH���H��t��a����H�������fD�c���I��A�H��H�$�����I���f���AUATUSH��轂�������H�=dH�FW H�GW �EW �~��H��t8�
1�H��H������H�Ņ�~�MH���E���H�������-�N H�=�G~��H��H��tH��臀��H��H=��`�Xfof��R )�R H�=E1��}��H��t1��
H��1�艃����@��H�=�C 趄���q��H�=��|V �}��H����H�����������H�vC H�W�H�H��C H�H�kV H��Q H��u L�%C�L���#���H��Q H��t�L�%C H��I�<$�Ԅ��H�5�Q H�V H��u4L�-f.��L���ӆ��H��H��Q H��t�H��U 1�1�H�����H�=�U H��U 螄���H�=��
���H�=�I���~��H�=�U L��H���'����H�5�H�=��/���I�4$H�=��φ��1�H�F���H�5�H��H�-U 考������H�=U 1�H�(�H�5��<���H�=�T �H�Y���H�5�����H�=�T �H����H�5g���H�=�T �����H����H�5N�߂��H�=�T �����H����H�55���H�=�T �����H����H�5衂��H�=bT �H�~���H�5肂��H�=CT 1�H�B�H�5��f���H�='T 1�H�&�H�5��J���H�=T 1�H���H�5��.���H�=�S �����H���H�5�����H�=�S 1�H���H�5���H�=�S 1�H���H�5w�ׁ��H�=�S 1�H���H�5`軁��H�=|S 1�H���H�5H蟁��H�=`S 1�H��H�51胁��H�=DS 1�H���H�5�g���H�=(S 1�H���H�5�K���H�=S 1�H���H�5��/���H�=�R 1�H��H�5�����H�=�R �H�`�H�5���H�=�R �����H�����H�5��Հ��L�%�? H�=�R �H�{�L���c~��H�-�? H�
�? H�=�I H�P H��I H�JH�*H�ER H��? H�H�\? H��,���H�=-R L��H���~��H�
B? H�=cI H�P H�XI H�JH�*H�����$z��H�(�z��H��P���H��Q 1��B���H�5�Q H�=��}��H�3H�=���}����y��H�(H��[]A\A]�DH�P�H��H�=UM �~��H��wH�CM H�.XXXXXXH�(���H�t+��H�=Z�����u��b����H�=)Q 1�H���H�5s�l��H�=
Q 1�H�l�H�5m�P��H�=�P 1�H�0�H�5`�4������H�=��L����R����H�=���w��H���6����B���fD�mH���z��H���^����KH���z��H��t��
�-�G �G����kH���mz��H��u�-�G �*�����H��H���Anonymous mmap() failedlocalhost%02d:%02d:%02d [%s] [UID:%d][%d] %.*syesnosystem()%s, errno: %d (%s)
/dev/nulllibpthread.sopthread_atforkHTTP_[UID:%d][%d] %s:%s: %s
LSAPI: jail() failure./etc/Can't set signalsaccept() failedLSAPI_STDERR_LOGPHP_LSAPI_MAX_REQUESTSLSAPI_MAX_REQSLSAPI_KEEP_LISTENLSAPI_AVOID_FORKLSAPI_ACCEPT_NOTIFYLSAPI_SLOW_REQ_MSECSLSAPI_ALLOW_CORE_DUMPLSAPI_MAX_IDLEPHP_LSAPI_CHILDRENLSAPI_EXTRA_CHILDRENLSAPI_MAX_IDLE_CHILDRENLSAPI_PGRP_MAX_IDLELSAPI_MAX_PROCESS_TIMELSAPI_PPID_NO_CHECKLSAPI_MAX_BUSY_WORKERLSAPI_DUMP_DEBUG_INFOnobodyLSAPI_DEFAULT_UIDLSAPI_DEFAULT_GIDLSAPI_SECRETLSAPI_LVE_ENABLEliblve.so.0lve_is_availablelve_instance_initlve_destroylve_enterlve_leavejailPHP_LSAPI_PHPRC=packetLen < 0
packetLen > %d
Bad request header - ERROR#1
ParseRequest error
SUEXEC_AUTHSUEXEC_UGIDLSAPI: setgid()LSAPI: initgroups()LSAPI: setgroups()LSAPI: setuid()Bad request header - ERROR#2
lsapi_accept() errorPragma: no-cacheRetry-After: 60Content-Type: text/htmlDEBUGNOTICEWARNERRORCRITFATALAcceptAccept-CharsetAccept-EncodingAccept-LanguageAuthorizationConnectionContent-TypeContent-LengthCookieCookie2HostPragmaRefererUser-AgentCache-ControlIf-Modified-SinceIf-MatchIf-None-MatchIf-RangeIf-Unmodified-SinceKeep-AliveX-Forwarded-ForViaTransfer-EncodingHTTP_ACCEPTHTTP_ACCEPT_CHARSETHTTP_ACCEPT_ENCODINGHTTP_ACCEPT_LANGUAGEHTTP_AUTHORIZATIONHTTP_CONNECTIONCONTENT_TYPECONTENT_LENGTHHTTP_COOKIEHTTP_COOKIE2HTTP_HOSTHTTP_PRAGMAHTTP_REFERERHTTP_USER_AGENTHTTP_CACHE_CONTROLHTTP_IF_MODIFIED_SINCEHTTP_IF_MATCHHTTP_IF_NONE_MATCHHTTP_IF_RANGEHTTP_IF_UNMODIFIED_SINCEHTTP_KEEP_ALIVEHTTP_RANGEHTTP_X_FORWARDED_FORHTTP_VIAHTTP_TRANSFER_ENCODING%04d-%02d-%02d %02d:%02d:%02d.%06d Child process with pid: %d was killed by signal: %d, core dumped: %s
Possible runaway process, UID: %d, PPID: %d, PID: %d, reqCount: %d, process time: %ld, checkpoint time: %ld, start time: %ld
gdb --batch -ex "attach %d" -ex "set height 0" -ex "bt" >&2;PATH=$PATH:/usr/sbin lsof -p %d >&2Force killing runaway process PID: %d with SIGKILL
Killing runaway process PID: %d with SIGTERM
Children tracking is wrong: Cur Children: %d, count: %d, idle: %d, dying: %d
LSAPI: LVE jail(%d) result: %d, error: %s !
Invalid custom stderr log pathFailed to open custom stderr logCan't set signal handler for SIGCHILDReached max children process limit: %d, extra: %d, current: %d, busy: %d, please increase LSAPI_CHILDREN.
LSAPI: failed to open secret file: %s!
LSAPI: failed to check state of file: %s!
LSAPI: file permission check failure: %s
LSAPI: failed to read secret from secret file: %s
LSAPI: Unable to initialize LVERequest header does match total size, total: %d, real: %ld
LSAPI: missing SUEXEC_UGID env, use default user!
LSAPI: SUEXEC_AUTH authentication failed, use default user!
LSAPI: lve_enter() failure, reached resource limit.prctl: Failed to set dumpable, core dump may not be available!sigprocmask(SIG_BLOCK) to block SIGCHLDsigprocmask( SIG_SETMASK ) to restore SIGMASK in childfork() failed, please increase process limitsigprocmask( SIG_SETMASK ) to restore SIGMASKCache-Control: private, no-cache, no-store, must-revalidate, max-age=0PID<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>508 Resource Limit Is Reached</TITLE>
</HEAD><BODY>
<H1>Resource Limit Is Reached</H1>
The website is temporarily unable to service your request as it exceeded resource limit.
Please try again later.
<HR>
</BODY></HTML>






	


QUERY_STRINGREQUEST_URIPATH_INFOREQUEST_PATHSCRIPT_NAMEftruncate() failed. 
File mapping failed. 
Memory calloc error[...]RSTRING_PTRreplacesrandSTDERRreopennilLSAPI_MAX_BODYBUF_LENGTHLSAPI_TEMPFILEXXXXXXRACK_ROOTchdir()to_hashCGI/1.2eval_string_wrapLSAPIacceptaccept_new_connectionpostfork_childpostfork_parentprocessputcwriteprintprintfputs<<flushgetcgetsreadrewindeacheofeof?closebinmodeisattytty?syncsync=RACK_ENVGATEWAY_Irewindable_input.rbNTERFACE/tmp/lsapi.XXXXX;�| [���e��0Pp��0q��H@q��\Pq��p`q����q����q���r���`y��@�y��t`z����z���{����{���|��4�}���`~����~�����L���tp����@���4����0����p���X	�����	Њ���	���	��	����	����
����,
����@
����T
���h
`����
�����
 ����
��������H���\0����`�������`��t ��������������0���
0���x
���
 ����
����`���80����������(����0����P����������L���`p���t����� ����`��������(����<����P����d��x���� ����@����P����`����p������������D����@����0����������\�������������� ���4��H0��\@��pP���`���������������P�����$��D ��\@��tp�����������`��0����`�������������P�d����� ��0�$��H��t`����� �4zRx�$W���
FJw�?:*3$"D�a���
\�l��p�l����l��
L��l��sE�I�B �E(�A0�z
(A BBBIA
(D BBBA�m���m��@�l��YG�J�B �B(�A0�A8��0F(B DBb0Tt���B�F�C �G�
 AABK�tt��k(��t��GA�D�J n
AAA4��t��UA�G�K R
CAGL
JCG u���A�G�]
AJ $�u��t��
CKF�LH�v���B�B�E �A(�H0�H
(D BBBD�
(D BBBAP�$w���v�F�B �A(�D0�D
(A BBBBL(A BBBA�����$��w��aA�A�D XAAH�w���B�B�B �B(�A0�A8�D@N
8C0A(B BBBH$`lx��OA�f
QC
EH@��x��YB�B�B �A(�D0�J��
0A(A BBBFx��z���F�E�A �C(�G�
 
(A ABBDM�
I�
c�
A�
��
E�
M�
A�
k�
E�
E�
E�
E�
H�V�
HH}���F�B�B �B(�A0�A8�D``
8A0A(B BBBDl�x~��+B�B�B �B(�A0�D8�J�Y�H�P�C�	M�i
8A0A(B BBBEL�T�M�D�d8��6B�B�B �B(�A0�A8�DP�
8A0A(B BBBG
8J0H(G DBBK$l���7E�F�F IIO�(����4����0����,���4�(����F�A�A �G�>
 AABG �����E�O
D�
A@\���
TX���hT���Y|����JE�D�ԃ��S � ���]P�h
HXA�H�\���lF�B�B �B(�A0�A8�LP�
8A0A(B BBBH<����F�B�B �A(�A0��
(D BBBI\P���i`p����F�B�B �B(�A0�A8�DP~
8A0A(B BBBAk
8A0A(B BBBHL�h���$F�B�B �A(�A0�H��Q
D���
0A(A BBBHL$H���F�B�B �B(�A0�A8�G��
8A0A(B BBBFt���F�T���F������$�����n�C�X�J�L��lF�B�B �B(�A0�A8�D�A
8A0A(B BBBA`(	����B�B�B �B(�A0�A8�G� I� K� I� L� N� N� w
8A0A(B BBBI0�	�����B�M�D �G�L
 AABA<�	,���=B�A�A �G� L�@I�@U
 AABG$
,����T�WE�H�G� (
�����a�g
HS�HL
 ����F�B�B �B(�A0�A8�DPS
8D0A(B BBBFT�
�����b�I�E �D(�C0�P
�(F� B�B�B�MQ(H BBBA�����H�
����F�B�B �B(�A0�A8�DP�
8A0A(B BBBAT<����C�B�A �A(�G0`
(A ABBD�
(C ABBAJ����8�x���-F�B�D �D(�D@T
(A ABBB�l���(�x���lE�C�G�F
AAIL����!c�B�G �A(�D0�
(A ABBEX����D0����`����t����Z��10� ���pF�A�A �G@7
 AABF�\���@L�sL�����F�B�B �B(�A0�A8�G��
8A0A(B BBBG<
P���P
L���d
H���x
T����
`����
l����
x����
�����
�����
|���x���<t���	F�B�A �K(�G�
(A ABBG<XD����F�E�E �D(�D0�M
(C BBBB�����(H������F�B�H �E(�A0�E8�I@�
8A0A(B BBBE(�D����F�E�D ��ABH$���B�B�B �B(�A0�A8�G��
8A0A(B BBBJDp|����F�B�B �A(�A0�G�
0A(A BBBFL����
F�B�B �B(�A0�A8�G��
8A0A(B BBBA��������4����
H����\����+p�����������(�����BF�G�A �kFB���
���HU��gHQ
G <��ayd8���2HW
IIX��� HWp��� HW����-Hd����3E�D hAH����F�B�B �E(�D0�C8�GPm
8F0A(B BBBG4����o�A�D �
AAKp��P ��\D(��4F�D�A �D(�F0`
(D ABBBj
(D ABBEl(G DBBD����B�B�I �B(�A0�A8�D@�8D0A(B BBB����*HP
HI���UK�I8(����F�B�A �D(�D@�
(A ABBEd���(x����E�A�D0r
CAP�H��E�L�L��E�Y(�P��E�D�G0�
AABzRx�0�� 8X�� 8���A�D w
AA(\p���E�A�D �
DAF,�D���Z�A�D �r�A�B�H����tF�B�B �B(�A0�D8�D@�
8F0A(B BBBG@���7F�B�B �A(�D0�D@�
0A(A BBBB8H���SF�B�A �A(�D0�
(A ABBFGNU��T�T�!��Q���W�^�c�i�n�t�{������������������������
��-�6�D�M�a�G�l�|�������������������'�4�>�J�W�g�z���������������	����>
$��!�!���o`��
��	!��.h&p	���o���o�%���o�oP$���oD�!�>�>?? ?0?@?P?`?p?�?�?�?�?�?�?�?�?@@ @0@@@P@`@p@�@�@�@�@�@�@�@�@AA A0A@APA`ApA�A�A�A�A�A�A�A�ABB B0B@BPB`BpB�B�B�B�B�B�B�B�BCC C0C@CPC`CpC�C�C�C�C�C�C�C�CDD D0D@DPD`DpD�D�D�D�D�D�D�D�DEE E0E@EPE`EpE�E�E�E�E�E�E�E�EFF F0F@FPF`FpF�F�F�F�F�F�F�F�FGG G0G@GPG`GpG�G�G�G�G�G�G�G�GHH H0H@HPH`HpH�H�H�H�H�H�H�H�HII I0I@IPI`I,����LSLSLSLS������������������)�9�X!�!��GA$3a1�>1�GA$3p1113Tt�GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realignGA$3p1113��#�GA*GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA$running gcc 8.5.0 20210514GA*GA*GA!
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GOW*�GA*cf_protectionGA+omit_frame_pointerGA+stack_clashGA!stack_realign
GA*FORTIFY�Tt�GA+GLIBCXX_ASSERTIONS
GA*FORTIFY����GA+GLIBCXX_ASSERTIONSlsapi.so-5.6-1.el8.x86_64.debugG)�E�7zXZ�ִF!t/��?3]?�E�h=��ڊ�2N�uI�=�'�n��_Cj�7��
E�kc�xUK�^I#A��!߱�Z�L}ހ��H�@�?�T���?�%��ٛ430�kUP|����m�$�1Mz�I�~F�/h��]s��'���Q�w���r͔p�ه��#�D�*��$Gu�%h5���a�ÿ�����w��(�7�]��_ ̎wz��%�#�p���t�tڨJ3�3�d-�XW=��}��O�^6� �AF�X
{��`�z�Et3E�7,=�ע��L���樵��*��{�K���҆��Ԛ�"��r;Z�|,���u9�� /��$48��;�Qv�^D^H��_�ȧ0G!�#���U�N+��%��(#�t�n.��6)[�+�����z�n�VYNg�/�"I8�2<}��㭌i���U��f�|�m�]����^	\�ט�r�^M@�b��ۙ\��@�iPؙѼ�^RG����l�O��&��ޤ�뚔,�K�fyv0���vW�sPv�5\���A?-j��J�O)�e%P/L�r�Y��D�_E�ڄ��/��<��,�G��L�^�9�¨Aп�����3�+��;���Ɖ��w}��l2�&W�"�Ԡ�Q��u�A��Ȅ�V��?�$H���8�f��u�iݖ���c*U�{{�N�,������Qe]��M-���ha��@���3p���#�ɠ^]�|+`�c��
���:k��n�kU���3S��	"�F�K*��(Qө�������{h[Fl���W�6�ϣ��L�.�A��������h�%��m�x�\fT@����5C�Ia�P]I0;%x��-K�J{��l\E��E���I'�񊻈��T��u��KX`��,��.���g逼b��\ɺ8*�� i̜P�ށL��ϕ^��R�*���Bco90��Is-��y�&j�ㅕ���۰�(���;������gn�����j������=et�C�߾f������.� �A)]�]E�RЌ�c,�'Ҵ�U6A`	�V��
l^�A��<�[e�aM<�j��g�Gئ�}�~M��	?C�������`�8B'����81��\���ds�A�ϰ][����sa�&_Q`�3�*�8q��q����o�m�,��I�`-E����yōta��|�3�LT��N^�2Na��܏_ �@i3I�w@;�mK<�R��~aU��x#������%e�����8M5���Jp�<a�\�?������i���UP��8:΁��������$<�m�:�+t��ok��E�YR{�<��cԁҷ�q�W�}���_�6/%iZ���rWa����9,N�ABE��R����U��9��m�m�,�'(�JY���&��hU�M��rI���=�C�
C��C2��In۴��b���~S[;���=+`���j`��͛�6/��j��$���H.�����3a��(�[����
'u�.���&T������H���v�/�f���e4�<�t��W�*�E`�QZ)ا��'��-���uGm6�r�o`x?Օ�ՓY���f0ǎ��ڽ��<�K����Dj���{L��p%�J��N��.�c�փpM�l*�XY��9�9��r��ж��§��L���H�Z�ֈ���թ�s���S4]@�U��ḧ�)LK0�]���Bǭ_p�%��I
��?	�a�
jZ���x��yc�j��S�y��Ӈ�O܈�ϽIl�:�^7	
�lǪ�x��Y�)�t�\����A
�ً�XsoNc	AO���Z_Չ������^���
u�Xz�D�OUïX����</4�DZ�g�YZ.shstrtab.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.plt.sec.text.fini.rodata.eh_frame_hdr.eh_frame.note.gnu.property.init_array.fini_array.data.rel.ro.dynamic.got.data.bss.gnu.build.attributes.gnu_debuglink.gnu_debugdata88$���o``p(���0���8���oP$P$�E���o�%�%pTh&h&p^B�.�.�h�>�>c�>�>�
npIpI�
wTT#~}$�$�
�@�@�p �������������(�(� ��!���!���!� ��!���	!�	�!�	 ��!�� ��"a�d
D$ht�%(PK	}$[
3O8a�a�-gems/gems/ruby-lsapi-5.6/ext/lsapi/lsapilib.cnu�[���//#define LSAPI_DEBUG
/*
Copyright (c) 2002-2018, Lite Speed Technologies Inc.
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 Lite Speed Technologies Inc 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.
*/


#include <ctype.h>
#include <dlfcn.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/stat.h>
#include <sched.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/resource.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/uio.h>
#include <sys/wait.h>
#include <grp.h>
#include <pwd.h>
#include <time.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <sys/un.h>

#include "lsapilib.h"

#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__)
#include <sys/prctl.h>
#endif

#if defined(__FreeBSD__ ) || defined(__NetBSD__) || defined(__OpenBSD__) \
    || defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)
#include <sys/sysctl.h>
#endif

#include <inttypes.h>
#ifndef uint32
#define uint32 uint32_t
#endif

struct lsapi_MD5Context {
    uint32 buf[4];
    uint32 bits[2];
    unsigned char in[64];
};

void lsapi_MD5Init(struct lsapi_MD5Context *context);
void lsapi_MD5Update(struct lsapi_MD5Context *context, unsigned char const *buf,
           unsigned len);
void lsapi_MD5Final(unsigned char digest[16], struct lsapi_MD5Context *context);

/*
 * This is needed to make RSAREF happy on some MS-DOS compilers.
 */
typedef struct lsapi_MD5Context lsapi_MD5_CTX;


#define LSAPI_ST_REQ_HEADER     1
#define LSAPI_ST_REQ_BODY       2
#define LSAPI_ST_RESP_HEADER    4
#define LSAPI_ST_RESP_BODY      8
#define LSAPI_ST_BACKGROUND     16

#define LSAPI_RESP_BUF_SIZE     8192
#define LSAPI_INIT_RESP_HEADER_LEN 4096

enum
{
    LSAPI_STATE_IDLE,
    LSAPI_STATE_CONNECTED,
    LSAPI_STATE_ACCEPTING,
};

typedef struct lsapi_child_status
{
    int     m_pid;
    long    m_tmStart;

    volatile short   m_iKillSent;
    volatile char    m_inProcess;
    volatile char    m_state;
    volatile int     m_iReqCounter;

    volatile long    m_tmWaitBegin;
    volatile long    m_tmReqBegin;
    volatile long    m_tmLastCheckPoint;
}
lsapi_child_status;

static lsapi_child_status * s_worker_status = NULL;

static int g_inited = 0;
static int g_running = 1;
static int s_ppid;
static int s_restored_ppid = 0;
static int s_pid = 0;
static int s_slow_req_msecs = 0;
static int s_keep_listener = 1;
static int s_dump_debug_info = 0;
static int s_pid_dump_debug_info = 0;
static int s_req_processed = 0;
static int s_skip_write = 0;
static int (*pthread_atfork_func)(void (*prepare)(void), void (*parent)(void),
                                  void (*child)(void)) = NULL;

static int *s_busy_workers = NULL;
static int *s_accepting_workers = NULL;
static int *s_global_counter = &s_req_processed;
static int s_max_busy_workers = -1;
static char *s_stderr_log_path = NULL;
static int s_stderr_is_pipe = 0;
static int s_ignore_pid = -1;
static size_t s_total_pages = 1;
static size_t s_min_avail_pages = 256 * 1024;
static size_t *s_avail_pages = &s_total_pages;

LSAPI_Request g_req =
{ .m_fdListen = -1, .m_fd = -1 };

static char         s_secret[24];

static LSAPI_On_Timer_pf s_proc_group_timer_cb = NULL;

void Flush_RespBuf_r( LSAPI_Request * pReq );
static int lsapi_reopen_stderr(const char *p);

static const char *CGI_HEADERS[H_TRANSFER_ENCODING+1] =
{
    "HTTP_ACCEPT", "HTTP_ACCEPT_CHARSET",
    "HTTP_ACCEPT_ENCODING",
    "HTTP_ACCEPT_LANGUAGE", "HTTP_AUTHORIZATION",
    "HTTP_CONNECTION", "CONTENT_TYPE",
    "CONTENT_LENGTH", "HTTP_COOKIE", "HTTP_COOKIE2",
    "HTTP_HOST", "HTTP_PRAGMA",
    "HTTP_REFERER", "HTTP_USER_AGENT",
    "HTTP_CACHE_CONTROL",
    "HTTP_IF_MODIFIED_SINCE", "HTTP_IF_MATCH",
    "HTTP_IF_NONE_MATCH",
    "HTTP_IF_RANGE",
    "HTTP_IF_UNMODIFIED_SINCE",
    "HTTP_KEEP_ALIVE",
    "HTTP_RANGE",
    "HTTP_X_FORWARDED_FOR",
    "HTTP_VIA",
    "HTTP_TRANSFER_ENCODING"
};

static int CGI_HEADER_LEN[H_TRANSFER_ENCODING+1] =
{    11, 19, 20, 20, 18, 15, 12, 14, 11, 12, 9, 11, 12, 15, 18,
     22, 13, 18, 13, 24, 15, 10, 20, 8, 22 };


static const char *HTTP_HEADERS[H_TRANSFER_ENCODING+1] =
{
    "Accept", "Accept-Charset",
    "Accept-Encoding",
    "Accept-Language", "Authorization",
    "Connection", "Content-Type",
    "Content-Length", "Cookie", "Cookie2",
    "Host", "Pragma",
    "Referer", "User-Agent",
    "Cache-Control",
    "If-Modified-Since", "If-Match",
    "If-None-Match",
    "If-Range",
    "If-Unmodified-Since",
    "Keep-Alive",
    "Range",
    "X-Forwarded-For",
    "Via",
    "Transfer-Encoding"
};

static int HTTP_HEADER_LEN[H_TRANSFER_ENCODING+1] =
{   6, 14, 15, 15, 13, 10, 12, 14, 6, 7, 4, 6, 7, 10, //user-agent
    13,17, 8, 13, 8, 19, 10, 5, 15, 3, 17
};


static const char *s_log_level_names[8] =
{
    "", "DEBUG","INFO", "NOTICE", "WARN", "ERROR", "CRIT", "FATAL"
};


void LSAPI_Log(int flag, const char * fmt, ...)
{
    char buf[1024];
    char *p = buf;
    if ((flag & LSAPI_LOG_TIMESTAMP_BITS)
        && !(s_stderr_is_pipe))
    {
        struct timeval  tv;
        struct tm       tm;
        gettimeofday(&tv, NULL);
        localtime_r(&tv.tv_sec, &tm);
        if (flag & LSAPI_LOG_TIMESTAMP_FULL)
        {
            p += snprintf(p, 1024, "%04d-%02d-%02d %02d:%02d:%02d.%06d ",
                tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
                tm.tm_hour, tm.tm_min, tm.tm_sec, (int)tv.tv_usec);
        }
        else if (flag & LSAPI_LOG_TIMESTAMP_HMS)
        {
            p += snprintf(p, 1024, "%02d:%02d:%02d ",
                tm.tm_hour, tm.tm_min, tm.tm_sec);
        }
    }

    int level = flag & LSAPI_LOG_LEVEL_BITS;
    if (level && level <= LSAPI_LOG_FLAG_FATAL)
    {
        p += snprintf(p, 100, "[%s] ", s_log_level_names[level]);
    }

    if (flag & LSAPI_LOG_PID)
    {
        p += snprintf(p, 100, "[UID:%d][%d] ", getuid(), s_pid);
    }

    if (p > buf)
        fprintf(stderr, "%.*s", (int)(p - buf), buf);
    va_list ap;
    va_start(ap, fmt);
    vfprintf(stderr, fmt, ap);
    va_end(ap);
}

#ifdef LSAPI_DEBUG

#define DBGLOG_FLAG (LSAPI_LOG_TIMESTAMP_FULL|LSAPI_LOG_FLAG_DEBUG|LSAPI_LOG_PID)
#define lsapi_dbg(...)   LSAPI_Log(DBGLOG_FLAG, __VA_ARGS__)

#else

#define lsapi_dbg(...)

#endif

#define lsapi_log(...)  LSAPI_Log(LSAPI_LOG_TIMESTAMP_FULL|LSAPI_LOG_PID, __VA_ARGS__)


void lsapi_perror(const char * pMessage, int err_no)
{
    lsapi_log("%s, errno: %d (%s)\n", pMessage, err_no, strerror(err_no));
}


static int lsapi_parent_dead()
{
    // Return non-zero if the parent is dead.  0 if still alive.
    if (!s_ppid) {
        // not checking, so not dead
        return(0);
    }
    if (s_restored_ppid) {
        if (kill(s_restored_ppid,0) == -1) {
            if (errno == EPERM) {
                return(0); // no permission, but it's still there.
            }
            return(1); // Dead
        }
        return(0); // it worked, so it's not dead
    }
    return(s_ppid != getppid());
}


static void lsapi_sigpipe( int sig )
{
}


static void lsapi_siguser1( int sig )
{
    g_running = 0;
}

#ifndef sighandler_t
typedef void (*sighandler_t)(int);
#endif

static void lsapi_signal(int signo, sighandler_t handler)
{
    struct sigaction sa;

    sigaction(signo, NULL, &sa);

    if (sa.sa_handler == SIG_DFL)
    {
        sigemptyset(&sa.sa_mask);
        sa.sa_flags = 0;
        sa.sa_handler = handler;
        sigaction(signo, &sa, NULL);
    }
}


static int s_enable_core_dump = 0;
static void lsapi_enable_core_dump(void)
{
#if defined(__FreeBSD__ ) || defined(__NetBSD__) || defined(__OpenBSD__) \
    || defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)
    int  mib[2];
    size_t len;

#if !defined(__OpenBSD__)
    len = 2;
    if ( sysctlnametomib("kern.sugid_coredump", mib, &len) == 0 )
    {
        len = sizeof(s_enable_core_dump);
        if (sysctl(mib, 2, NULL, 0, &s_enable_core_dump, len) == -1)
            perror( "sysctl: Failed to set 'kern.sugid_coredump', "
                    "core dump may not be available!");
    }
#else
    int set = 3;
    len = sizeof(set);
    mib[0] = CTL_KERN;
    mib[1] = KERN_NOSUIDCOREDUMP;
    if (sysctl(mib, 2, NULL, 0, &set, len) == 0) {
        s_enable_core_dump = 1;
    }
#endif


#endif

#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__)
    if (prctl(PR_SET_DUMPABLE, s_enable_core_dump,0,0,0) == -1)
        perror( "prctl: Failed to set dumpable, "
                    "core dump may not be available!");
#endif
}


static inline void lsapi_buildPacketHeader( struct lsapi_packet_header * pHeader,
                                char type, int len )
{
    pHeader->m_versionB0 = LSAPI_VERSION_B0;  /* LSAPI protocol version */
    pHeader->m_versionB1 = LSAPI_VERSION_B1;
    pHeader->m_type      = type;
    pHeader->m_flag      = LSAPI_ENDIAN;
    pHeader->m_packetLen.m_iLen = len;
}


static  int lsapi_set_nblock( int fd, int nonblock )
{
    int val = fcntl( fd, F_GETFL, 0 );
    if ( nonblock )
    {
        if (!( val & O_NONBLOCK ))
        {
            return fcntl( fd, F_SETFL, val | O_NONBLOCK );
        }
    }
    else
    {
        if ( val & O_NONBLOCK )
        {
            return fcntl( fd, F_SETFL, val &(~O_NONBLOCK) );
        }
    }
    return 0;
}


static int lsapi_close( int fd )
{
    int ret;
    while( 1 )
    {
        ret = close( fd );
        if (( ret == -1 )&&( errno == EINTR )&&(g_running))
            continue;
        return ret;
    }
}


static void lsapi_close_connection(LSAPI_Request *pReq)
{
    if (pReq->m_fd == -1)
        return;
    lsapi_close(pReq->m_fd);
    pReq->m_fd = -1;
    if (s_busy_workers)
        __atomic_fetch_sub(s_busy_workers, 1, __ATOMIC_SEQ_CST);
    if (s_worker_status)
        __atomic_store_n(&s_worker_status->m_state, LSAPI_STATE_IDLE,
                         __ATOMIC_SEQ_CST);
}


static inline ssize_t lsapi_read( int fd, void * pBuf, size_t len )
{
    ssize_t ret;
    while( 1 )
    {
        ret = read( fd, (char *)pBuf, len );
        if (( ret == -1 )&&( errno == EINTR )&&(g_running))
            continue;
        return ret;
    }
}


/*
static int lsapi_write( int fd, const void * pBuf, int len )
{
   int ret;
   const char * pCur;
   const char * pEnd;
   if ( len == 0 )
       return 0;
   pCur = (const char *)pBuf;
   pEnd = pCur + len;
   while( g_running && (pCur < pEnd) )
   {
       ret = write( fd, pCur, pEnd - pCur );
       if ( ret >= 0)
           pCur += ret;
       else if (( ret == -1 )&&( errno != EINTR ))
           return ret;
   }
   return pCur - (const char *)pBuf;
}
*/


static int lsapi_writev( int fd, struct iovec ** pVec, int count, int totalLen )
{
    int ret;
    int left = totalLen;
    int n = count;

    if (s_skip_write)
        return totalLen;

    while(( left > 0 )&&g_running )
    {
        ret = writev( fd, *pVec, n );
        if ( ret > 0 )
        {
            left -= ret;
            if (( left <= 0)||( !g_running ))
                return totalLen - left;
            while( ret > 0 )
            {
                if ( (*pVec)->iov_len <= (unsigned int )ret )
                {
                    ret -= (*pVec)->iov_len;
                    ++(*pVec);
                }
                else
                {
                    (*pVec)->iov_base = (char *)(*pVec)->iov_base + ret;
                    (*pVec)->iov_len -= ret;
                    break;
                }
            }
        }
        else if ( ret == -1 )
        {
            if ( errno == EAGAIN )
            {
                if ( totalLen - left > 0 )
                    return totalLen - left;
                else
                    return -1;
            }
            else if ( errno != EINTR )
                return ret;
        }
    }
    return totalLen - left;
}


/*
static int getTotalLen( struct iovec * pVec, int count )
{
   struct iovec * pEnd = pVec + count;
   int total = 0;
   while( pVec < pEnd )
   {
       total += pVec->iov_len;
       ++pVec;
   }
   return total;
}
*/


static inline int allocateBuf( LSAPI_Request * pReq, int size )
{
    char * pBuf = (char *)realloc( pReq->m_pReqBuf, size );
    if ( pBuf )
    {
        pReq->m_pReqBuf = pBuf;
        pReq->m_reqBufSize = size;
        pReq->m_pHeader = (struct lsapi_req_header *)pReq->m_pReqBuf;
        return 0;
    }
    return -1;
}


static int allocateIovec( LSAPI_Request * pReq, int n )
{
    struct iovec * p = (struct iovec *)realloc(
                pReq->m_pIovec, sizeof(struct iovec) * n );
    if ( !p )
        return -1;
    pReq->m_pIovecToWrite = p + ( pReq->m_pIovecToWrite - pReq->m_pIovec );
    pReq->m_pIovecCur = p + ( pReq->m_pIovecCur - pReq->m_pIovec );
    pReq->m_pIovec = p;
    pReq->m_pIovecEnd = p + n;
    return 0;
}


static int allocateRespHeaderBuf( LSAPI_Request * pReq, int size )
{
    char * p = (char *)realloc( pReq->m_pRespHeaderBuf, size );
    if ( !p )
        return -1;
    pReq->m_pRespHeaderBufPos   = p + ( pReq->m_pRespHeaderBufPos - pReq->m_pRespHeaderBuf );
    pReq->m_pRespHeaderBuf      = p;
    pReq->m_pRespHeaderBufEnd   = p + size;
    return 0;
}


static inline int verifyHeader( struct lsapi_packet_header * pHeader, char pktType )
{
    if (( LSAPI_VERSION_B0 != pHeader->m_versionB0 )||
        ( LSAPI_VERSION_B1 != pHeader->m_versionB1 )||
        ( pktType != pHeader->m_type ))
        return -1;
    if ( LSAPI_ENDIAN != (pHeader->m_flag & LSAPI_ENDIAN_BIT ))
    {
        register char b;
        b = pHeader->m_packetLen.m_bytes[0];
        pHeader->m_packetLen.m_bytes[0] = pHeader->m_packetLen.m_bytes[3];
        pHeader->m_packetLen.m_bytes[3] = b;
        b = pHeader->m_packetLen.m_bytes[1];
        pHeader->m_packetLen.m_bytes[1] = pHeader->m_packetLen.m_bytes[2];
        pHeader->m_packetLen.m_bytes[2] = b;
    }
    return pHeader->m_packetLen.m_iLen;
}


static int allocateEnvList( struct LSAPI_key_value_pair ** pEnvList,
                        int *curSize, int newSize )
{
    struct LSAPI_key_value_pair * pBuf;
    if ( *curSize >= newSize )
        return 0;
    if ( newSize > 8192 )
        return -1;
    pBuf = (struct LSAPI_key_value_pair *)realloc( *pEnvList, newSize *
                    sizeof(struct LSAPI_key_value_pair) );
    if ( pBuf )
    {
        *pEnvList = pBuf;
        *curSize  = newSize;
        return 0;
    }
    else
        return -1;

}


static inline int isPipe( int fd )
{
    char        achPeer[128];
    socklen_t   len = 128;
    if (( getpeername( fd, (struct sockaddr *)achPeer, &len ) != 0 )&&
        ( errno == ENOTCONN ))
        return 0;
    else
        return 1;
}


static int parseEnv( struct LSAPI_key_value_pair * pEnvList, int count,
            char **pBegin, char * pEnd )
{
    struct LSAPI_key_value_pair * pEnvEnd;
        int keyLen = 0, valLen = 0;
    if ( count > 8192 )
        return -1;
    pEnvEnd = pEnvList + count;
    while( pEnvList != pEnvEnd )
    {
        if ( pEnd - *pBegin < 4 )
            return -1;
        keyLen = *((unsigned char *)((*pBegin)++));
        keyLen = (keyLen << 8) + *((unsigned char *)((*pBegin)++));
        valLen = *((unsigned char *)((*pBegin)++));
        valLen = (valLen << 8) + *((unsigned char *)((*pBegin)++));
        if ( *pBegin + keyLen + valLen > pEnd )
            return -1;
        if (( !keyLen )||( !valLen ))
            return -1;

        pEnvList->pKey = *pBegin;
        *pBegin += keyLen;
        pEnvList->pValue = *pBegin;
        *pBegin += valLen;

        pEnvList->keyLen = keyLen - 1;
        pEnvList->valLen = valLen - 1;
        ++pEnvList;
    }
    if ( memcmp( *pBegin, "\0\0\0\0", 4 ) != 0 )
        return -1;
    *pBegin += 4;
    return 0;
}


static inline void swapIntEndian( int * pInteger )
{
    char * p = (char *)pInteger;
    register char b;
    b = p[0];
    p[0] = p[3];
    p[3] = b;
    b = p[1];
    p[1] = p[2];
    p[2] = b;

}


static inline void fixEndian( LSAPI_Request * pReq )
{
    struct lsapi_req_header *p= pReq->m_pHeader;
    swapIntEndian( &p->m_httpHeaderLen );
    swapIntEndian( &p->m_reqBodyLen );
    swapIntEndian( &p->m_scriptFileOff );
    swapIntEndian( &p->m_scriptNameOff );
    swapIntEndian( &p->m_queryStringOff );
    swapIntEndian( &p->m_requestMethodOff );
    swapIntEndian( &p->m_cntUnknownHeaders );
    swapIntEndian( &p->m_cntEnv );
    swapIntEndian( &p->m_cntSpecialEnv );
}


static void fixHeaderIndexEndian( LSAPI_Request * pReq )
{
    int i;
    for( i = 0; i < H_TRANSFER_ENCODING; ++i )
    {
        if ( pReq->m_pHeaderIndex->m_headerOff[i] )
        {
            register char b;
            char * p = (char *)(&pReq->m_pHeaderIndex->m_headerLen[i]);
            b = p[0];
            p[0] = p[1];
            p[1] = b;
            swapIntEndian( &pReq->m_pHeaderIndex->m_headerOff[i] );
        }
    }
    if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 )
    {
        struct lsapi_header_offset * pCur, *pEnd;
        pCur = pReq->m_pUnknownHeader;
        pEnd = pCur + pReq->m_pHeader->m_cntUnknownHeaders;
        while( pCur < pEnd )
        {
            swapIntEndian( &pCur->nameOff );
            swapIntEndian( &pCur->nameLen );
            swapIntEndian( &pCur->valueOff );
            swapIntEndian( &pCur->valueLen );
            ++pCur;
        }
    }
}


static int validateHeaders( LSAPI_Request * pReq )
{
    int totalLen = pReq->m_pHeader->m_httpHeaderLen;
    int i;
    for(i = 0; i < H_TRANSFER_ENCODING; ++i)
    {
        if ( pReq->m_pHeaderIndex->m_headerOff[i] )
        {
            if (pReq->m_pHeaderIndex->m_headerOff[i] > totalLen
                || pReq->m_pHeaderIndex->m_headerLen[i]
                    + pReq->m_pHeaderIndex->m_headerOff[i] > totalLen)
                return -1;
        }
    }
    if (pReq->m_pHeader->m_cntUnknownHeaders > 0)
    {
        struct lsapi_header_offset * pCur, *pEnd;
        pCur = pReq->m_pUnknownHeader;
        pEnd = pCur + pReq->m_pHeader->m_cntUnknownHeaders;
        while( pCur < pEnd )
        {
            if (pCur->nameOff > totalLen
                || pCur->nameOff + pCur->nameLen > totalLen
                || pCur->valueOff > totalLen
                || pCur->valueOff + pCur->valueLen > totalLen)
                return -1;
            ++pCur;
        }
    }
    return 0;
}


static uid_t s_uid = 0;
static uid_t s_defaultUid;  //web server need set this
static gid_t s_defaultGid;

#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__)

#define LSAPI_LVE_DISABLED  0
#define LSAPI_LVE_ENABLED   1
#define LSAPI_CAGEFS_ENABLED 2
#define LSAPI_CAGEFS_NO_SUEXEC 3
struct liblve;
static int s_enable_lve = LSAPI_LVE_DISABLED;
static struct liblve * s_lve = NULL;

static void *s_liblve;
static int (*fp_lve_is_available)(void) = NULL;
static int (*fp_lve_instance_init)(struct liblve *) = NULL;
static int (*fp_lve_destroy)(struct liblve *) = NULL;
static int (*fp_lve_enter)(struct liblve *, uint32_t, int32_t, int32_t, uint32_t *) = NULL;
static int (*fp_lve_leave)(struct liblve *, uint32_t *) = NULL;
static int (*fp_lve_jail)( struct passwd *, char *) = NULL;
static int lsapi_load_lve_lib(void)
{
    s_liblve = dlopen("liblve.so.0", RTLD_NOW | RTLD_GLOBAL);
    if (s_liblve)
    {
        fp_lve_is_available = dlsym(s_liblve, "lve_is_available");
        if (dlerror() == NULL)
        {
            if ( !(*fp_lve_is_available)() )
            {
                int uid = getuid();
                if ( uid )
                {
                    if (setreuid( s_uid, uid )) {};
                    if ( !(*fp_lve_is_available)() )
                        s_enable_lve = 0;
                    if (setreuid( uid, s_uid )) {};
                }
            }
        }
    }
    else
    {
        s_enable_lve = LSAPI_LVE_DISABLED;
    }
    return (s_liblve)? 0 : -1;
}


static int init_lve_ex(void)
{
    int rc;
    if ( !s_liblve )
        return -1;
    fp_lve_instance_init = dlsym(s_liblve, "lve_instance_init");
    fp_lve_destroy = dlsym(s_liblve, "lve_destroy");
    fp_lve_enter = dlsym(s_liblve, "lve_enter");
    fp_lve_leave = dlsym(s_liblve, "lve_leave");
    if ( s_enable_lve >= LSAPI_CAGEFS_ENABLED )
        fp_lve_jail = dlsym(s_liblve, "jail" );

    if ( s_lve == NULL )
    {
        rc = (*fp_lve_instance_init)(NULL);
        s_lve = malloc(rc);
    }
    rc = (*fp_lve_instance_init)(s_lve);
    if (rc != 0)
    {
        perror( "LSAPI: Unable to initialize LVE" );
        free( s_lve );
        s_lve = NULL;
        return -1;
    }
    return 0;

}

#endif



static int readSecret( const char * pSecretFile )
{
    struct stat st;
    int fd = open( pSecretFile, O_RDONLY , 0600 );
    if ( fd == -1 )
    {
        lsapi_log("LSAPI: failed to open secret file: %s!\n", pSecretFile );
        return -1;
    }
    if ( fstat( fd, &st ) == -1 )
    {
        lsapi_log("LSAPI: failed to check state of file: %s!\n", pSecretFile );
        close( fd );
        return -1;
    }
/*
    if ( st.st_uid != s_uid )
    {
        lsapi_log("LSAPI: file owner check failure: %s!\n", pSecretFile );
        close( fd );
        return -1;
    }
*/
    if ( st.st_mode & 0077 )
    {
        lsapi_log("LSAPI: file permission check failure: %s\n", pSecretFile );
        close( fd );
        return -1;
    }
    if ( read( fd, s_secret, 16 ) < 16 )
    {
        lsapi_log("LSAPI: failed to read secret from secret file: %s\n", pSecretFile );
        close( fd );
        return -1;
    }
    close( fd );
    return 0;
}


int LSAPI_is_suEXEC_Daemon(void)
{
    if (( !s_uid )&&( s_secret[0] ))
        return 1;
    else
        return 0;
}


static int LSAPI_perror_r( LSAPI_Request * pReq, const char * pErr1, const char *pErr2 )
{
    char achError[4096];
    int n = snprintf(achError, sizeof(achError), "[UID:%d][%d] %s:%s: %s\n",
                     getuid(), getpid(),
                     pErr1, (pErr2)?pErr2:"", strerror(errno));
    if (n > (int)sizeof(achError))
        n = sizeof(achError);
    if ( pReq )
        LSAPI_Write_Stderr_r( pReq, achError, n );
    else
        if (write( STDERR_FILENO, achError, n )) {};
    return 0;
}


#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__)
static int lsapi_lve_error( LSAPI_Request * pReq )
{
    static const char * headers[] =
    {
        "Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0",
        "Pragma: no-cache",
        "Retry-After: 60",
        "Content-Type: text/html",
        NULL
    };
    static const char achBody[] =
        "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"
        "<HTML><HEAD>\n<TITLE>508 Resource Limit Is Reached</TITLE>\n"
        "</HEAD><BODY>\n" "<H1>Resource Limit Is Reached</H1>\n"
        "The website is temporarily unable to service your request as it exceeded resource limit.\n"
        "Please try again later.\n"
        "<HR>\n"
        "</BODY></HTML>\n";

    LSAPI_ErrResponse_r( pReq, 508, headers, achBody, sizeof( achBody ) - 1 );
    return 0;
}

static int lsapi_enterLVE( LSAPI_Request * pReq, uid_t uid )
{
    if ( s_lve && uid ) //root user should not do that
    {
        uint32_t cookie;
        int ret = -1;
        ret = (*fp_lve_enter)(s_lve, uid, -1, -1, &cookie);
        if ( ret < 0 )
        {
            //lsapi_log("enter LVE (%d) : result: %d !\n", uid, ret );
            LSAPI_perror_r(pReq, "LSAPI: lve_enter() failure, reached resource limit.", NULL );
            lsapi_lve_error( pReq );
            return -1;
        }
    }

    return 0;
}

static int lsapi_jailLVE( LSAPI_Request * pReq, uid_t uid, struct passwd * pw )
{
    int ret = 0;
    char  error_msg[1024] = "";
    ret = (*fp_lve_jail)( pw, error_msg );
    if ( ret < 0 )
    {
        lsapi_log("LSAPI: LVE jail(%d) result: %d, error: %s !\n",
                  uid, ret, error_msg );
        LSAPI_perror_r( pReq, "LSAPI: jail() failure.", NULL );
        return -1;
    }
    return ret;
}


static int lsapi_initLVE(void)
{
    const char * pEnv;
    if ( (pEnv = getenv( "LSAPI_LVE_ENABLE" ))!= NULL )
    {
        s_enable_lve = atol( pEnv );
        pEnv = NULL;
    }
    else if ( (pEnv = getenv( "LVE_ENABLE" ))!= NULL )
    {
        s_enable_lve = atol( pEnv );
        pEnv = NULL;
    }
    if ( s_enable_lve && !s_uid )
    {
        lsapi_load_lve_lib();
        if ( s_enable_lve )
        {
            return init_lve_ex();
        }

    }
    return 0;
}
#endif


static int setUID_LVE(LSAPI_Request * pReq, uid_t uid, gid_t gid, const char * pChroot)
{
    int rv;
    struct passwd * pw;
    pw = getpwuid( uid );
#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__)
    if ( s_lve )
    {
        if( lsapi_enterLVE( pReq, uid ) == -1 )
            return -1;
        if ( pw && fp_lve_jail)
        {
            rv = lsapi_jailLVE( pReq, uid, pw );
            if ( rv == -1 )
                return -1;
            if (( rv == 1 )&&(s_enable_lve == LSAPI_CAGEFS_NO_SUEXEC ))    //this mode only use cageFS, does not use suEXEC
            {
                uid = s_defaultUid;
                gid = s_defaultGid;
                pw = getpwuid( uid );
            }
        }
    }
#endif
    //if ( !uid || !gid )  //do not allow root
    //{
    //    return -1;
    //}

#if defined(__FreeBSD__ ) || defined(__NetBSD__) || defined(__OpenBSD__) \
    || defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)
    if ( s_enable_core_dump )
        lsapi_enable_core_dump();
#endif

    rv = setgid(gid);
    if (rv == -1)
    {
        LSAPI_perror_r(pReq, "LSAPI: setgid()", NULL);
        return -1;
    }
    if ( pw && (pw->pw_gid == gid ))
    {
        rv = initgroups( pw->pw_name, gid );
        if (rv == -1)
        {
            LSAPI_perror_r(pReq, "LSAPI: initgroups()", NULL);
            return -1;
        }
    }
    else
    {
        rv = setgroups(1, &gid);
        if (rv == -1)
        {
            LSAPI_perror_r(pReq, "LSAPI: setgroups()", NULL);
        }
    }
    if ( pChroot )
    {
        rv = chroot( pChroot );
        if ( rv == -1 )
        {
            LSAPI_perror_r(pReq, "LSAPI: chroot()", NULL);
            return -1;
        }
    }
    rv = setuid(uid);
    if (rv == -1)
    {
        LSAPI_perror_r(pReq, "LSAPI: setuid()", NULL);
        return -1;
    }
#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__)
    if ( s_enable_core_dump )
        lsapi_enable_core_dump();
#endif
    return 0;
}

static int lsapi_suexec_auth( LSAPI_Request *pReq,
            char * pAuth, int len, char * pUgid, int ugidLen )
{
    lsapi_MD5_CTX md5ctx;
    unsigned char achMD5[16];
    if ( len < 32 )
        return -1;
    memmove( achMD5, pAuth + 16, 16 );
    memmove( pAuth + 16, s_secret, 16 );
    lsapi_MD5Init( &md5ctx );
    lsapi_MD5Update( &md5ctx, (unsigned char *)pAuth, 32 );
    lsapi_MD5Update( &md5ctx, (unsigned char *)pUgid, 8 );
    lsapi_MD5Final( (unsigned char *)pAuth + 16, &md5ctx);
    if ( memcmp( achMD5, pAuth + 16, 16 ) == 0 )
        return 0;
    return 1;
}


static int lsapi_changeUGid( LSAPI_Request * pReq )
{
    int uid = s_defaultUid;
    int gid = s_defaultGid;
    const char *pStderrLog;
    const char *pChroot = NULL;
    struct LSAPI_key_value_pair * pEnv;
    struct LSAPI_key_value_pair * pAuth;
    int i;
    if ( s_uid )
        return 0;
    //with special ID  0x00
    //authenticate the suEXEC request;
    //first one should be MD5( nonce + lscgid secret )
    //remember to clear the secret after verification
    //it should be set at the end of special env
    i = pReq->m_pHeader->m_cntSpecialEnv - 1;
    if ( i >= 0 )
    {
        pEnv = pReq->m_pSpecialEnvList + i;
        if (( *pEnv->pKey == '\000' )&&
            ( strcmp( pEnv->pKey+1, "SUEXEC_AUTH" ) == 0 ))
        {
            --pReq->m_pHeader->m_cntSpecialEnv;
            pAuth = pEnv--;
            if (( *pEnv->pKey == '\000' )&&
                ( strcmp( pEnv->pKey+1, "SUEXEC_UGID" ) == 0 ))
            {
                --pReq->m_pHeader->m_cntSpecialEnv;
                uid = *(uint32_t *)pEnv->pValue;
                gid = *(((uint32_t *)pEnv->pValue) + 1 );
                //lsapi_log("LSAPI: SUEXEC_UGID set UID: %d, GID: %d\n", uid, gid );
            }
            else
            {
                lsapi_log("LSAPI: missing SUEXEC_UGID env, use default user!\n" );
                pEnv = NULL;
            }
            if ( pEnv&& lsapi_suexec_auth( pReq, pAuth->pValue, pAuth->valLen, pEnv->pValue, pEnv->valLen ) == 0 )
            {
                //read UID, GID from specialEnv

            }
            else
            {
                //authentication error
                lsapi_log("LSAPI: SUEXEC_AUTH authentication failed, use default user!\n" );
                uid = 0;
            }
        }
        else
        {
            //lsapi_log("LSAPI: no SUEXEC_AUTH env, use default user!\n" );
        }
    }


    if ( !uid )
    {
        uid = s_defaultUid;
        gid = s_defaultGid;
    }

    //change uid
    if ( setUID_LVE( pReq, uid, gid, pChroot ) == -1 )
    {
        return -1;
    }

    s_uid = uid;

    if ( pReq->m_fdListen != -1 )
    {
        close( pReq->m_fdListen );
        pReq->m_fdListen = -1;
    }

    pStderrLog = LSAPI_GetEnv_r( pReq, "LSAPI_STDERR_LOG");
    if (pStderrLog)
        lsapi_reopen_stderr(pStderrLog);

    return 0;

}


static int parseContentLenFromHeader(LSAPI_Request * pReq)
{
    const char * pContentLen = LSAPI_GetHeader_r( pReq, H_CONTENT_LENGTH );
    if ( pContentLen )
        pReq->m_reqBodyLen = strtoll( pContentLen, NULL, 10 );
    return 0;
}


static int parseRequest( LSAPI_Request * pReq, int totalLen )
{
    int shouldFixEndian;
    char * pBegin = pReq->m_pReqBuf + sizeof( struct lsapi_req_header );
    char * pEnd = pReq->m_pReqBuf + totalLen;
    shouldFixEndian = ( LSAPI_ENDIAN != (
                pReq->m_pHeader->m_pktHeader.m_flag & LSAPI_ENDIAN_BIT ) );
    if ( shouldFixEndian )
    {
        fixEndian( pReq );
    }
    if ( (pReq->m_specialEnvListSize < pReq->m_pHeader->m_cntSpecialEnv )&&
            allocateEnvList( &pReq->m_pSpecialEnvList,
                &pReq->m_specialEnvListSize,
                pReq->m_pHeader->m_cntSpecialEnv ) == -1 )
        return -1;
    if ( (pReq->m_envListSize < pReq->m_pHeader->m_cntEnv )&&
            allocateEnvList( &pReq->m_pEnvList, &pReq->m_envListSize,
                pReq->m_pHeader->m_cntEnv ) == -1 )
        return -1;

    if ( parseEnv( pReq->m_pSpecialEnvList,
                pReq->m_pHeader->m_cntSpecialEnv,
                &pBegin, pEnd ) == -1 )
        return -1;
    if ( parseEnv( pReq->m_pEnvList, pReq->m_pHeader->m_cntEnv,
                &pBegin, pEnd ) == -1 )
        return -1;
    if (pReq->m_pHeader->m_scriptFileOff < 0
        || pReq->m_pHeader->m_scriptFileOff >= totalLen
        || pReq->m_pHeader->m_scriptNameOff < 0
        || pReq->m_pHeader->m_scriptNameOff >= totalLen
        || pReq->m_pHeader->m_queryStringOff < 0
        || pReq->m_pHeader->m_queryStringOff >= totalLen
        || pReq->m_pHeader->m_requestMethodOff < 0
        || pReq->m_pHeader->m_requestMethodOff >= totalLen)
    {
        lsapi_log("Bad request header - ERROR#1\n");
        return -1;
    }
    pReq->m_pScriptFile     = pReq->m_pReqBuf + pReq->m_pHeader->m_scriptFileOff;
    pReq->m_pScriptName     = pReq->m_pReqBuf + pReq->m_pHeader->m_scriptNameOff;
    pReq->m_pQueryString    = pReq->m_pReqBuf + pReq->m_pHeader->m_queryStringOff;
    pReq->m_pRequestMethod  = pReq->m_pReqBuf + pReq->m_pHeader->m_requestMethodOff;

    pBegin = pReq->m_pReqBuf + (( pBegin - pReq->m_pReqBuf + 7 ) & (~0x7));
    pReq->m_pHeaderIndex = ( struct lsapi_http_header_index * )pBegin;
    pBegin += sizeof( struct lsapi_http_header_index );

    pReq->m_pUnknownHeader = (struct lsapi_header_offset *)pBegin;
    pBegin += sizeof( struct lsapi_header_offset) *
                    pReq->m_pHeader->m_cntUnknownHeaders;

    pReq->m_pHttpHeader = pBegin;
    pBegin += pReq->m_pHeader->m_httpHeaderLen;
    if ( pBegin != pEnd )
    {
        lsapi_log("Request header does match total size, total: %d, "
                 "real: %ld\n", totalLen, pBegin - pReq->m_pReqBuf );
        return -1;
    }
    if ( shouldFixEndian )
    {
        fixHeaderIndexEndian( pReq );
    }

    if (validateHeaders(pReq) == -1)
    {
        lsapi_log("Bad request header - ERROR#2\n");
        return -1;
    }

    pReq->m_reqBodyLen = pReq->m_pHeader->m_reqBodyLen;
    if ( pReq->m_reqBodyLen == -2 )
    {
        parseContentLenFromHeader(pReq);
    }

    return 0;
}


//OPTIMIZATION
static char s_accept_notify = 0;
static char s_schedule_notify = 0;
static char s_notify_scheduled = 0;
static char s_notified_pid = 0;

static struct lsapi_packet_header s_ack = {'L', 'S',
                LSAPI_REQ_RECEIVED, LSAPI_ENDIAN, {LSAPI_PACKET_HEADER_LEN} };
static struct lsapi_packet_header s_conn_close_pkt = {'L', 'S',
                LSAPI_CONN_CLOSE, LSAPI_ENDIAN, {LSAPI_PACKET_HEADER_LEN} };


static inline int send_notification_pkt( int fd, struct lsapi_packet_header *pkt )
{
    if ( write( fd, pkt, LSAPI_PACKET_HEADER_LEN ) < LSAPI_PACKET_HEADER_LEN )
        return -1;
    return 0;
}


static inline int send_req_received_notification( int fd )
{
    return send_notification_pkt(fd, &s_ack);
}


static inline int send_conn_close_notification( int fd )
{
    return send_notification_pkt(fd, &s_conn_close_pkt);
}


//static void lsapi_sigalarm( int sig )
//{
//    if ( s_notify_scheduled )
//    {
//        s_notify_scheduled = 0;
//        if ( g_req.m_fd != -1 )
//            write_req_received_notification( g_req.m_fd );
//    }
//}


static inline int lsapi_schedule_notify(void)
{
    if ( !s_notify_scheduled )
    {
        alarm( 2 );
        s_notify_scheduled = 1;
    }
    return 0;
}


static inline int notify_req_received( int fd )
{
    if ( s_schedule_notify )
        return lsapi_schedule_notify();
    return send_req_received_notification( fd );

}


static inline int lsapi_notify_pid( int fd )
{
    char achBuf[16];
    lsapi_buildPacketHeader( (struct lsapi_packet_header *)achBuf, LSAPI_STDERR_STREAM,
                        8 + LSAPI_PACKET_HEADER_LEN );
    memmove( &achBuf[8], "\0PID", 4 );
    *((int *)&achBuf[12]) = getpid();

    if ( write( fd, achBuf, 16 ) < 16 )
        return -1;
    return 0;
}

static int readReq( LSAPI_Request * pReq )
{
    int len;
    int packetLen;
    if ( !pReq )
        return -1;
    if ( pReq->m_reqBufSize < 8192 )
    {
        if ( allocateBuf( pReq, 8192 ) == -1 )
            return -1;
    }

    while ( pReq->m_bufRead < LSAPI_PACKET_HEADER_LEN )
    {
        len = lsapi_read( pReq->m_fd, pReq->m_pReqBuf, pReq->m_reqBufSize );
        if ( len <= 0 )
            return -1;
        pReq->m_bufRead += len;
    }
    pReq->m_reqState = LSAPI_ST_REQ_HEADER;

    packetLen = verifyHeader( &pReq->m_pHeader->m_pktHeader, LSAPI_BEGIN_REQUEST );
    if ( packetLen < 0 )
    {
        lsapi_log("packetLen < 0\n");
        return -1;
    }
    if ( packetLen > LSAPI_MAX_HEADER_LEN )
    {
        lsapi_log("packetLen > %d\n", LSAPI_MAX_HEADER_LEN );
        return -1;
    }

    if ( packetLen + 1024 > pReq->m_reqBufSize )
    {
        if ( allocateBuf( pReq, packetLen + 1024 ) == -1 )
            return -1;
    }
    while( packetLen > pReq->m_bufRead )
    {
        len = lsapi_read( pReq->m_fd, pReq->m_pReqBuf + pReq->m_bufRead, packetLen - pReq->m_bufRead );
        if ( len <= 0 )
            return -1;
        pReq->m_bufRead += len;
    }
    if ( parseRequest( pReq, packetLen ) < 0 )
    {
        lsapi_log("ParseRequest error\n");
        return -1;
    }

    pReq->m_reqState = LSAPI_ST_REQ_BODY | LSAPI_ST_RESP_HEADER;

    if ( !s_uid )
    {
        if ( lsapi_changeUGid( pReq ) )
            return -1;
        memset(s_secret, 0, sizeof(s_secret));
    }
    pReq->m_bufProcessed = packetLen;

    //OPTIMIZATION
    if ( !s_accept_notify && !s_notified_pid )
        return notify_req_received( pReq->m_fd );
    else
    {
        s_notified_pid = 0;
        return 0;
    }
}


int LSAPI_Init(void)
{
    if ( !g_inited )
    {
        s_uid = geteuid();
        s_secret[0] = 0;
        lsapi_signal(SIGPIPE, lsapi_sigpipe);
        lsapi_signal(SIGUSR1, lsapi_siguser1);

#if defined(SIGXFSZ) && defined(SIG_IGN)
        signal(SIGXFSZ, SIG_IGN);
#endif
        /* let STDOUT function as STDERR,
           just in case writing to STDOUT directly */
        dup2( 2, 1 );
        if ( LSAPI_InitRequest( &g_req, LSAPI_SOCK_FILENO ) == -1 )
            return -1;
        g_inited = 1;
        s_ppid = getppid();
        void *pthread_lib = dlopen("libpthread.so", RTLD_LAZY);
        if (pthread_lib)
            pthread_atfork_func = dlsym(pthread_lib, "pthread_atfork");

    }
    return 0;
}


void LSAPI_Stop(void)
{
    g_running = 0;
}


int LSAPI_IsRunning(void)
{
    return g_running;
}


void LSAPI_Register_Pgrp_Timer_Callback(LSAPI_On_Timer_pf cb)
{
    s_proc_group_timer_cb = cb;
}


int LSAPI_InitRequest( LSAPI_Request * pReq, int fd )
{
    int newfd;
    if ( !pReq )
        return -1;
    memset( pReq, 0, sizeof( LSAPI_Request ) );
    if ( allocateIovec( pReq, 16 ) == -1 )
        return -1;
    pReq->m_pRespBuf = pReq->m_pRespBufPos = (char *)malloc( LSAPI_RESP_BUF_SIZE );
    if ( !pReq->m_pRespBuf )
        return -1;
    pReq->m_pRespBufEnd = pReq->m_pRespBuf + LSAPI_RESP_BUF_SIZE;
    pReq->m_pIovecCur = pReq->m_pIovecToWrite = pReq->m_pIovec + 1;
    pReq->m_respPktHeaderEnd = &pReq->m_respPktHeader[5];
    if ( allocateRespHeaderBuf( pReq, LSAPI_INIT_RESP_HEADER_LEN ) == -1 )
        return -1;

    if ( fd == STDIN_FILENO )
    {
        fd = dup( fd );
        newfd = open( "/dev/null", O_RDWR );
        dup2( newfd, STDIN_FILENO );
    }

    if ( isPipe( fd ) )
    {
        pReq->m_fdListen = -1;
        pReq->m_fd = fd;
    }
    else
    {
        pReq->m_fdListen = fd;
        pReq->m_fd = -1;
        lsapi_set_nblock( fd, 1 );
    }
    return 0;
}


int LSAPI_Is_Listen( void )
{
    return LSAPI_Is_Listen_r( &g_req );
}


int LSAPI_Is_Listen_r( LSAPI_Request * pReq)
{
    return pReq->m_fdListen != -1;
}


int LSAPI_Accept_r( LSAPI_Request * pReq )
{
    char        achPeer[128];
    socklen_t   len;
    int         nodelay = 1;

    if ( !pReq )
        return -1;
    if ( LSAPI_Finish_r( pReq ) == -1 )
        return -1;
    lsapi_set_nblock( pReq->m_fdListen , 0 );
    while( g_running )
    {
        if ( pReq->m_fd == -1 )
        {
            if ( pReq->m_fdListen != -1)
            {
                len = sizeof( achPeer );
                pReq->m_fd = accept( pReq->m_fdListen,
                            (struct sockaddr *)&achPeer, &len );
                if ( pReq->m_fd == -1 )
                {
                    if (( errno == EINTR )||( errno == EAGAIN))
                        continue;
                    else
                        return -1;
                }
                else
                {
                    if (s_worker_status)
                        __atomic_store_n(&s_worker_status->m_state,
                                       LSAPI_STATE_CONNECTED, __ATOMIC_SEQ_CST);
                    if (s_busy_workers)
                        __atomic_fetch_add(s_busy_workers, 1, __ATOMIC_SEQ_CST);
                    lsapi_set_nblock( pReq->m_fd , 0 );
                    if (((struct sockaddr *)&achPeer)->sa_family == AF_INET )
                    {
                        setsockopt(pReq->m_fd, IPPROTO_TCP, TCP_NODELAY,
                                   (char *)&nodelay, sizeof(nodelay));
                    }
                    //init_conn_key( pReq->m_fd );
                    //OPTIMIZATION
                    if ( s_accept_notify )
                        if ( notify_req_received( pReq->m_fd ) == -1 )
                                return -1;
                }
            }
            else
                return -1;
        }
        if ( !readReq( pReq ) )
            break;
        //abort();
        lsapi_close_connection(pReq);
        LSAPI_Reset_r( pReq );
    }
    return 0;
}


static struct lsapi_packet_header   finish_close[2] =
{
    {'L', 'S', LSAPI_RESP_END, LSAPI_ENDIAN, {LSAPI_PACKET_HEADER_LEN} },
    {'L', 'S', LSAPI_CONN_CLOSE, LSAPI_ENDIAN, {LSAPI_PACKET_HEADER_LEN} }
};


int LSAPI_Finish_r( LSAPI_Request * pReq )
{
    /* finish req body */
    if ( !pReq )
        return -1;
    if (pReq->m_reqState)
    {
        if ( pReq->m_fd != -1 )
        {
            if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER )
            {
                LSAPI_FinalizeRespHeaders_r( pReq );
            }
            if ( pReq->m_pRespBufPos != pReq->m_pRespBuf )
            {
                Flush_RespBuf_r( pReq );
            }

            pReq->m_pIovecCur->iov_base = (void *)finish_close;
            pReq->m_pIovecCur->iov_len  = LSAPI_PACKET_HEADER_LEN;
            pReq->m_totalLen += LSAPI_PACKET_HEADER_LEN;
            ++pReq->m_pIovecCur;
            LSAPI_Flush_r( pReq );
        }
        LSAPI_Reset_r( pReq );
    }
    return 0;
}


int LSAPI_End_Response_r(LSAPI_Request * pReq)
{
    if (!pReq)
        return -1;
    if (pReq->m_reqState & LSAPI_ST_BACKGROUND)
        return 0;
    if (pReq->m_reqState)
    {
        if ( pReq->m_fd != -1 )
        {
            if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER )
            {
                if ( pReq->m_pRespHeaderBufPos <= pReq->m_pRespHeaderBuf )
                    return 0;

                LSAPI_FinalizeRespHeaders_r( pReq );
            }
            if ( pReq->m_pRespBufPos != pReq->m_pRespBuf )
            {
                Flush_RespBuf_r( pReq );
            }

            pReq->m_pIovecCur->iov_base = (void *)finish_close;
            pReq->m_pIovecCur->iov_len  = LSAPI_PACKET_HEADER_LEN << 1;
            pReq->m_totalLen += LSAPI_PACKET_HEADER_LEN << 1;
            ++pReq->m_pIovecCur;
            LSAPI_Flush_r( pReq );
            lsapi_close_connection(pReq);
        }
        pReq->m_reqState |= LSAPI_ST_BACKGROUND;
    }
    return 0;
}


void LSAPI_Reset_r( LSAPI_Request * pReq )
{
    pReq->m_pRespBufPos         = pReq->m_pRespBuf;
    pReq->m_pIovecCur           = pReq->m_pIovecToWrite = pReq->m_pIovec + 1;
    pReq->m_pRespHeaderBufPos   = pReq->m_pRespHeaderBuf;

    memset( &pReq->m_pHeaderIndex, 0,
            (char *)(pReq->m_respHeaderLen) - (char *)&pReq->m_pHeaderIndex );
}


int LSAPI_Release_r( LSAPI_Request * pReq )
{
    if ( pReq->m_pReqBuf )
        free( pReq->m_pReqBuf );
    if ( pReq->m_pSpecialEnvList )
        free( pReq->m_pSpecialEnvList );
    if ( pReq->m_pEnvList )
        free( pReq->m_pEnvList );
    if ( pReq->m_pRespHeaderBuf )
        free( pReq->m_pRespHeaderBuf );
    return 0;
}


char * LSAPI_GetHeader_r( LSAPI_Request * pReq, int headerIndex )
{
    int off;
    if ( !pReq || ((unsigned int)headerIndex > H_TRANSFER_ENCODING) )
        return NULL;
    off = pReq->m_pHeaderIndex->m_headerOff[ headerIndex ];
    if ( !off )
        return NULL;
    if ( *(pReq->m_pHttpHeader + off
        + pReq->m_pHeaderIndex->m_headerLen[ headerIndex ]) )
    {
        *( pReq->m_pHttpHeader + off
            + pReq->m_pHeaderIndex->m_headerLen[ headerIndex ]) = 0;
    }
    return pReq->m_pHttpHeader + off;
}


static int readBodyToReqBuf( LSAPI_Request * pReq )
{
    off_t bodyLeft;
    ssize_t len = pReq->m_bufRead - pReq->m_bufProcessed;
    if ( len > 0 )
        return len;
    pReq->m_bufRead = pReq->m_bufProcessed = pReq->m_pHeader->m_pktHeader.m_packetLen.m_iLen;

    bodyLeft = pReq->m_reqBodyLen - pReq->m_reqBodyRead;
    len = pReq->m_reqBufSize - pReq->m_bufRead;
    if ( len < 0 )
        return -1;
    if ( len > bodyLeft )
        len = bodyLeft;

    len = lsapi_read( pReq->m_fd, pReq->m_pReqBuf + pReq->m_bufRead, len );
    if ( len > 0 )
        pReq->m_bufRead += len;
    return len;
}


int LSAPI_ReqBodyGetChar_r( LSAPI_Request * pReq )
{
    if (!pReq || (pReq->m_fd ==-1) )
        return EOF;
    if ( pReq->m_bufProcessed >= pReq->m_bufRead )
    {
        if ( readBodyToReqBuf( pReq ) <= 0 )
            return EOF;
    }
    ++pReq->m_reqBodyRead;
    return (unsigned char)*(pReq->m_pReqBuf + pReq->m_bufProcessed++);
}


int LSAPI_ReqBodyGetLine_r( LSAPI_Request * pReq, char * pBuf, size_t bufLen, int *getLF )
{
    ssize_t len;
    ssize_t left;
    char * pBufEnd = pBuf + bufLen - 1;
    char * pBufCur = pBuf;
    char * pCur;
    char * p;
    if (!pReq || pReq->m_fd == -1 || !pBuf || !getLF)
        return -1;
    *getLF = 0;
    while( (left = pBufEnd - pBufCur ) > 0 )
    {

        len = pReq->m_bufRead - pReq->m_bufProcessed;
        if ( len <= 0 )
        {
            if ( (len = readBodyToReqBuf( pReq )) <= 0 )
            {
                *getLF = 1;
                break;
            }
        }
        if ( len > left )
            len = left;
        pCur = pReq->m_pReqBuf + pReq->m_bufProcessed;
        p = memchr( pCur, '\n', len );
        if ( p )
            len = p - pCur + 1;
        memmove( pBufCur, pCur, len );
        pBufCur += len;
        pReq->m_bufProcessed += len;

        pReq->m_reqBodyRead += len;

        if ( p )
        {
            *getLF = 1;
            break;
        }
    }
    *pBufCur = 0;

    return pBufCur - pBuf;
}


ssize_t LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, size_t bufLen )
{
    ssize_t len;
    off_t total;
    /* char *pOldBuf = pBuf; */
    if (!pReq || pReq->m_fd == -1 || !pBuf || (ssize_t)bufLen < 0)
        return -1;

    total = pReq->m_reqBodyLen - pReq->m_reqBodyRead;

    if ( total <= 0 )
        return 0;
    if ( total < (ssize_t)bufLen )
        bufLen = total;

    total = 0;
    len = pReq->m_bufRead - pReq->m_bufProcessed;
    if ( len > 0 )
    {
        if ( len > (ssize_t)bufLen )
            len = bufLen;
        memmove( pBuf, pReq->m_pReqBuf + pReq->m_bufProcessed, len );
        pReq->m_bufProcessed += len;
        total += len;
        pBuf += len;
        bufLen -= len;
    }
    while( bufLen > 0 )
    {
        len = lsapi_read( pReq->m_fd, pBuf, bufLen );
        if ( len > 0 )
        {
            total += len;
            pBuf += len;
            bufLen -= len;
        }
        else if ( len <= 0 )
        {
            if ( !total)
                return -1;
            break;
        }
    }
    pReq->m_reqBodyRead += total;
    return total;

}


ssize_t LSAPI_Write_r( LSAPI_Request * pReq, const char * pBuf, size_t len )
{
    struct lsapi_packet_header * pHeader;
    const char * pEnd;
    const char * p;
    ssize_t bufLen;
    ssize_t toWrite;
    ssize_t packetLen;
    int skip = 0;

    if (!pReq || !pBuf)
        return -1;
    if (pReq->m_reqState & LSAPI_ST_BACKGROUND)
        return len;
    if (pReq->m_fd == -1)
        return -1;
    if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER )
    {
        LSAPI_FinalizeRespHeaders_r( pReq );
/*
        if ( *pBuf == '\r' )
        {
            ++skip;
        }
        if ( *pBuf == '\n' )
        {
            ++skip;
        }
*/
    }
    pReq->m_reqState |= LSAPI_ST_RESP_BODY;

    if ( ((ssize_t)len - skip) < pReq->m_pRespBufEnd - pReq->m_pRespBufPos )
    {
        memmove( pReq->m_pRespBufPos, pBuf + skip, len - skip );
        pReq->m_pRespBufPos += len - skip;
        return len;
    }


    pHeader = pReq->m_respPktHeader;
    p       = pBuf + skip;
    pEnd    = pBuf + len;
    bufLen  = pReq->m_pRespBufPos - pReq->m_pRespBuf;

    while( ( toWrite = pEnd - p ) > 0 )
    {
        packetLen = toWrite + bufLen;
        if ( LSAPI_MAX_DATA_PACKET_LEN < packetLen)
        {
            packetLen = LSAPI_MAX_DATA_PACKET_LEN;
            toWrite = packetLen - bufLen;
        }

        lsapi_buildPacketHeader( pHeader, LSAPI_RESP_STREAM,
                            packetLen + LSAPI_PACKET_HEADER_LEN );
        pReq->m_totalLen += packetLen + LSAPI_PACKET_HEADER_LEN;

        pReq->m_pIovecCur->iov_base = (void *)pHeader;
        pReq->m_pIovecCur->iov_len  = LSAPI_PACKET_HEADER_LEN;
        ++pReq->m_pIovecCur;
        ++pHeader;
        if ( bufLen > 0 )
        {
            pReq->m_pIovecCur->iov_base = (void *)pReq->m_pRespBuf;
            pReq->m_pIovecCur->iov_len  = bufLen;
            pReq->m_pRespBufPos = pReq->m_pRespBuf;
            ++pReq->m_pIovecCur;
            bufLen = 0;
        }

        pReq->m_pIovecCur->iov_base = (void *)p;
        pReq->m_pIovecCur->iov_len  = toWrite;
        ++pReq->m_pIovecCur;
        p += toWrite;

        if ( pHeader >= pReq->m_respPktHeaderEnd - 1)
        {
            if ( LSAPI_Flush_r( pReq ) == -1 )
                return -1;
            pHeader = pReq->m_respPktHeader;
        }
    }
    if ( pHeader != pReq->m_respPktHeader )
        if ( LSAPI_Flush_r( pReq ) == -1 )
            return -1;
    return p - pBuf;
}


#if defined(__FreeBSD__ )
ssize_t gsendfile( int fdOut, int fdIn, off_t* off, size_t size )
{
    ssize_t ret;
    off_t written;
    ret = sendfile( fdIn, fdOut, *off, size, NULL, &written, 0 );
    if ( written > 0 )
    {
        ret = written;
        *off += ret;
    }
    return ret;
}
#endif

#if defined(__OpenBSD__) || defined(__NetBSD__)
ssize_t gsendfile( int fdOut, int fdIn, off_t* off, size_t size )
{
    ssize_t ret;
    off_t written = 0;
    const size_t bufsiz = 16384;
    unsigned char in[bufsiz] = {0};

    if (lseek(fdIn, *off, SEEK_SET) == -1) {
        return -1;
    }

    while (size > 0) {
        size_t tor = size > sizeof(in) ? sizeof(in) : size;
        ssize_t c = read(fdIn, in, tor);
        if (c <= 0) {
            goto end;
        }

        ssize_t w = write(fdOut, in, c);
        if (w > 0)
            written += w;

        if (w != c) {
            goto end;
        }
        size -= c;
    }

end:
    *off += written;
    return 0;
}
#endif


#if defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)
ssize_t gsendfile( int fdOut, int fdIn, off_t* off, size_t size )
{
    ssize_t ret;
    off_t len = size;
    ret = sendfile( fdIn, fdOut, *off, &len, NULL, 0 );
    if (( ret == 0 )&&( len > 0 ))
    {
        ret = len;
        *off += len;
    }
    return ret;
}
#endif


#if defined(sun) || defined(__sun)
#include <sys/sendfile.h>
ssize_t gsendfile( int fdOut, int fdIn, off_t *off, size_t size )
{
    int n = 0 ;
    sendfilevec_t vec[1];

    vec[n].sfv_fd   = fdIn;
    vec[n].sfv_flag = 0;
    vec[n].sfv_off  = *off;
    vec[n].sfv_len  = size;
    ++n;

    size_t written;
    ssize_t ret = sendfilev( fdOut, vec, n, &written );
    if (( !ret )||( errno == EAGAIN ))
        ret = written;
    if ( ret > 0 )
        *off += ret;
    return ret;
}
#endif


#if defined(linux) || defined(__linux) || defined(__linux__) || \
    defined(__gnu_linux__)
#include <sys/sendfile.h>
#define gsendfile sendfile
#endif


#if defined(HPUX)
ssize_t gsendfile( int fdOut, int fdIn, off_t * off, size_t size )
{
    return sendfile( fdOut, fdIn, off, size, NULL, 0 );
}
#endif


ssize_t LSAPI_sendfile_r( LSAPI_Request * pReq, int fdIn, off_t* off, size_t size )
{
    struct lsapi_packet_header * pHeader = pReq->m_respPktHeader;
    if ( !pReq || (pReq->m_fd == -1) || fdIn == -1 )
        return -1;
    if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER )
    {
        LSAPI_FinalizeRespHeaders_r( pReq );
    }
    pReq->m_reqState |= LSAPI_ST_RESP_BODY;

    LSAPI_Flush_r(pReq);

    lsapi_buildPacketHeader( pHeader, LSAPI_RESP_STREAM,
                            size + LSAPI_PACKET_HEADER_LEN );


    if (write(pReq->m_fd,  (const char *) pHeader, LSAPI_PACKET_HEADER_LEN ) != LSAPI_PACKET_HEADER_LEN)
        return -1;

    return gsendfile( pReq->m_fd, fdIn, off, size );
}


void Flush_RespBuf_r( LSAPI_Request * pReq )
{
    struct lsapi_packet_header * pHeader = pReq->m_respPktHeader;
    int bufLen = pReq->m_pRespBufPos - pReq->m_pRespBuf;
    pReq->m_reqState |= LSAPI_ST_RESP_BODY;
    lsapi_buildPacketHeader( pHeader, LSAPI_RESP_STREAM,
                        bufLen + LSAPI_PACKET_HEADER_LEN );
    pReq->m_totalLen += bufLen + LSAPI_PACKET_HEADER_LEN;

    pReq->m_pIovecCur->iov_base = (void *)pHeader;
    pReq->m_pIovecCur->iov_len  = LSAPI_PACKET_HEADER_LEN;
    ++pReq->m_pIovecCur;
    ++pHeader;
    if ( bufLen > 0 )
    {
        pReq->m_pIovecCur->iov_base = (void *)pReq->m_pRespBuf;
        pReq->m_pIovecCur->iov_len  = bufLen;
        pReq->m_pRespBufPos = pReq->m_pRespBuf;
        ++pReq->m_pIovecCur;
        bufLen = 0;
    }
}


int LSAPI_Flush_r( LSAPI_Request * pReq )
{
    int ret = 0;
    int n;
    if ( !pReq )
        return -1;
    n = pReq->m_pIovecCur - pReq->m_pIovecToWrite;
    if (( 0 == n )&&( pReq->m_pRespBufPos == pReq->m_pRespBuf ))
        return 0;
    if ( pReq->m_fd == -1 )
    {
        pReq->m_pRespBufPos = pReq->m_pRespBuf;
        pReq->m_totalLen = 0;
        pReq->m_pIovecCur = pReq->m_pIovecToWrite = pReq->m_pIovec;
        return -1;
    }
    if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER )
    {
        LSAPI_FinalizeRespHeaders_r( pReq );
    }
    if ( pReq->m_pRespBufPos != pReq->m_pRespBuf )
    {
        Flush_RespBuf_r( pReq );
    }

    n = pReq->m_pIovecCur - pReq->m_pIovecToWrite;
    if ( n > 0 )
    {

        ret = lsapi_writev( pReq->m_fd, &pReq->m_pIovecToWrite,
                  n, pReq->m_totalLen );
        if ( ret < pReq->m_totalLen )
        {
            lsapi_close_connection(pReq);
            ret = -1;
        }
        pReq->m_totalLen = 0;
        pReq->m_pIovecCur = pReq->m_pIovecToWrite = pReq->m_pIovec;
    }
    return ret;
}


ssize_t LSAPI_Write_Stderr_r( LSAPI_Request * pReq, const char * pBuf, size_t len )
{
    struct lsapi_packet_header header;
    const char * pEnd;
    const char * p;
    ssize_t packetLen;
    ssize_t totalLen;
    int ret;
    struct iovec iov[2];
    struct iovec *pIov;

    if ( !pReq )
        return -1;
    if (s_stderr_log_path || pReq->m_fd == -1 || pReq->m_fd == pReq->m_fdListen)
        return write( 2, pBuf, len );
    if ( pReq->m_pRespBufPos != pReq->m_pRespBuf )
    {
        LSAPI_Flush_r( pReq );
    }

    p       = pBuf;
    pEnd    = pBuf + len;

    while( ( packetLen = pEnd - p ) > 0 )
    {
        if ( LSAPI_MAX_DATA_PACKET_LEN < packetLen)
        {
            packetLen = LSAPI_MAX_DATA_PACKET_LEN;
        }

        lsapi_buildPacketHeader( &header, LSAPI_STDERR_STREAM,
                            packetLen + LSAPI_PACKET_HEADER_LEN );
        totalLen = packetLen + LSAPI_PACKET_HEADER_LEN;

        iov[0].iov_base = (void *)&header;
        iov[0].iov_len  = LSAPI_PACKET_HEADER_LEN;

        iov[1].iov_base = (void *)p;
        iov[1].iov_len  = packetLen;
        p += packetLen;
        pIov = iov;
        ret = lsapi_writev( pReq->m_fd, &pIov,
                  2, totalLen );
        if ( ret < totalLen )
        {
            lsapi_close_connection(pReq);
            ret = -1;
        }
    }
    return p - pBuf;
}


static char * GetHeaderVar( LSAPI_Request * pReq, const char * name )
{
    int i;
    char * pValue;
    for( i = 0; i < H_TRANSFER_ENCODING; ++i )
    {
        if ( pReq->m_pHeaderIndex->m_headerOff[i] )
        {
            if ( strcmp( name, CGI_HEADERS[i] ) == 0 )
            {
                pValue = pReq->m_pHttpHeader
                         + pReq->m_pHeaderIndex->m_headerOff[i];
                if ( *(pValue + pReq->m_pHeaderIndex->m_headerLen[i]) != '\0')
                {
                    *(pValue + pReq->m_pHeaderIndex->m_headerLen[i]) = '\0';
                }
                return pValue;
            }
        }
    }
    if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 )
    {
        const char *p;
        char *pKey;
        char *pKeyEnd;
        int  keyLen;
        struct lsapi_header_offset * pCur, *pEnd;
        pCur = pReq->m_pUnknownHeader;
        pEnd = pCur + pReq->m_pHeader->m_cntUnknownHeaders;
        while( pCur < pEnd )
        {
            pKey = pReq->m_pHttpHeader + pCur->nameOff;
            keyLen = pCur->nameLen;
            pKeyEnd = pKey + keyLen;
            p = &name[5];

            while(( pKey < pKeyEnd )&&( *p ))
            {
                char ch = toupper( *pKey );
                if ((ch != *p )||(( *p == '_' )&&( ch != '-')))
                    break;
                ++p; ++pKey;
            }
            if (( pKey == pKeyEnd )&& (!*p ))
            {
                pValue = pReq->m_pHttpHeader + pCur->valueOff;

                if ( *(pValue + pCur->valueLen) != '\0')
                {
                    *(pValue + pCur->valueLen) = '\0';
                }
                return pValue;
            }
            ++pCur;
        }
    }
    return NULL;
}


char * LSAPI_GetEnv_r( LSAPI_Request * pReq, const char * name )
{
    struct LSAPI_key_value_pair * pBegin = pReq->m_pEnvList;
    struct LSAPI_key_value_pair * pEnd = pBegin + pReq->m_pHeader->m_cntEnv;
    if ( !pReq || !name )
        return NULL;
    if ( strncmp( name, "HTTP_", 5 ) == 0 )
    {
        return GetHeaderVar( pReq, name );
    }
    while( pBegin < pEnd )
    {
        if ( strcmp( name, pBegin->pKey ) == 0 )
            return pBegin->pValue;
        ++pBegin;
    }
    return NULL;
}


struct _headerInfo
{
    const char * _name;
    int          _nameLen;
    const char * _value;
    int          _valueLen;
};


int compareValueLocation(const void * v1, const void *v2 )
{
    return ((const struct _headerInfo *)v1)->_value -
           ((const struct _headerInfo *)v2)->_value;
}


int LSAPI_ForeachOrgHeader_r( LSAPI_Request * pReq,
            LSAPI_CB_EnvHandler fn, void * arg )
{
    int i;
    int len = 0;
    char * pValue;
    int ret;
    int count = 0;
    struct _headerInfo headers[512];

    if ( !pReq || !fn )
        return -1;

    if ( !pReq->m_pHeaderIndex )
        return 0;

    for( i = 0; i < H_TRANSFER_ENCODING; ++i )
    {
        if ( pReq->m_pHeaderIndex->m_headerOff[i] )
        {
            len = pReq->m_pHeaderIndex->m_headerLen[i];
            pValue = pReq->m_pHttpHeader + pReq->m_pHeaderIndex->m_headerOff[i];
            *(pValue + len ) = 0;
            headers[count]._name = HTTP_HEADERS[i];
            headers[count]._nameLen = HTTP_HEADER_LEN[i];
            headers[count]._value = pValue;
            headers[count]._valueLen = len;
            ++count;

            //ret = (*fn)( HTTP_HEADERS[i], HTTP_HEADER_LEN[i],
            //            pValue, len, arg );
            //if ( ret <= 0 )
            //    return ret;
        }
    }
    if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 )
    {
        char *pKey;
        int  keyLen;
        struct lsapi_header_offset * pCur, *pEnd;
        pCur = pReq->m_pUnknownHeader;
        pEnd = pCur + pReq->m_pHeader->m_cntUnknownHeaders;
        while( pCur < pEnd )
        {
            pKey = pReq->m_pHttpHeader + pCur->nameOff;
            keyLen = pCur->nameLen;
            *(pKey + keyLen ) = 0;

            pValue = pReq->m_pHttpHeader + pCur->valueOff;
            *(pValue + pCur->valueLen ) = 0;
            headers[count]._name = pKey;
            headers[count]._nameLen = keyLen;
            headers[count]._value = pValue;
            headers[count]._valueLen = pCur->valueLen;
            ++count;
            if ( count == 512 )
                break;
            //ret = (*fn)( pKey, keyLen,
            //            pValue, pCur->valueLen, arg );
            //if ( ret <= 0 )
            //    return ret;
            ++pCur;
        }
    }
    qsort( headers, count, sizeof( struct _headerInfo ), compareValueLocation );
    for( i = 0; i < count; ++i )
    {
        ret = (*fn)( headers[i]._name, headers[i]._nameLen,
                    headers[i]._value, headers[i]._valueLen, arg );
        if ( ret <= 0 )
            return ret;
    }
    return count;
}


int LSAPI_ForeachHeader_r( LSAPI_Request * pReq,
            LSAPI_CB_EnvHandler fn, void * arg )
{
    int i;
    int len = 0;
    char * pValue;
    int ret;
    int count = 0;
    if ( !pReq || !fn )
        return -1;
    for( i = 0; i < H_TRANSFER_ENCODING; ++i )
    {
        if ( pReq->m_pHeaderIndex->m_headerOff[i] )
        {
            len = pReq->m_pHeaderIndex->m_headerLen[i];
            pValue = pReq->m_pHttpHeader + pReq->m_pHeaderIndex->m_headerOff[i];
            *(pValue + len ) = 0;
            ret = (*fn)( CGI_HEADERS[i], CGI_HEADER_LEN[i],
                        pValue, len, arg );
            ++count;
            if ( ret <= 0 )
                return ret;
        }
    }
    if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 )
    {
        char achHeaderName[256];
        char *p;
        char *pKey;
        char *pKeyEnd ;
        int  keyLen;
        struct lsapi_header_offset * pCur, *pEnd;
        pCur = pReq->m_pUnknownHeader;
        pEnd = pCur + pReq->m_pHeader->m_cntUnknownHeaders;
        while( pCur < pEnd )
        {
            pKey = pReq->m_pHttpHeader + pCur->nameOff;
            keyLen = pCur->nameLen;
            if ( keyLen > 250 )
                keyLen = 250;
            pKeyEnd = pKey + keyLen;
            memcpy( achHeaderName, "HTTP_", 5 );
            p = &achHeaderName[5];

            while( pKey < pKeyEnd )
            {
                char ch = *pKey++;
                if ( ch == '-' )
                    *p++ = '_';
                else
                    *p++ = toupper( ch );
            }
            *p = 0;
            keyLen += 5;

            pValue = pReq->m_pHttpHeader + pCur->valueOff;
            *(pValue + pCur->valueLen ) = 0;
            ret = (*fn)( achHeaderName, keyLen,
                        pValue, pCur->valueLen, arg );
            if ( ret <= 0 )
                return ret;
            ++pCur;
        }
    }
    return count + pReq->m_pHeader->m_cntUnknownHeaders;
}


static int EnvForeach( struct LSAPI_key_value_pair * pEnv,
            int n, LSAPI_CB_EnvHandler fn, void * arg )
{
    struct LSAPI_key_value_pair * pEnd = pEnv + n;
    int ret;
    if ( !pEnv || !fn )
        return -1;
    while( pEnv < pEnd )
    {
        ret = (*fn)( pEnv->pKey, pEnv->keyLen,
                    pEnv->pValue, pEnv->valLen, arg );
        if ( ret <= 0 )
            return ret;
        ++pEnv;
    }
    return n;
}


int LSAPI_ForeachEnv_r( LSAPI_Request * pReq,
            LSAPI_CB_EnvHandler fn, void * arg )
{
    if ( !pReq || !fn )
        return -1;
    if ( pReq->m_pHeader->m_cntEnv > 0 )
    {
        return EnvForeach( pReq->m_pEnvList, pReq->m_pHeader->m_cntEnv,
                    fn, arg );
    }
    return 0;
}


int LSAPI_ForeachSpecialEnv_r( LSAPI_Request * pReq,
            LSAPI_CB_EnvHandler fn, void * arg )
{
    if ( !pReq || !fn )
        return -1;
    if ( pReq->m_pHeader->m_cntSpecialEnv > 0 )
    {
        return EnvForeach( pReq->m_pSpecialEnvList,
                pReq->m_pHeader->m_cntSpecialEnv,
                    fn, arg );
    }
    return 0;

}


int LSAPI_FinalizeRespHeaders_r( LSAPI_Request * pReq )
{
    if ( !pReq || !pReq->m_pIovec )
        return -1;
    if ( !( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) )
        return 0;
    pReq->m_reqState &= ~LSAPI_ST_RESP_HEADER;
    if ( pReq->m_pRespHeaderBufPos > pReq->m_pRespHeaderBuf )
    {
        pReq->m_pIovecCur->iov_base = (void *)pReq->m_pRespHeaderBuf;
        pReq->m_pIovecCur->iov_len  = pReq->m_pRespHeaderBufPos - pReq->m_pRespHeaderBuf;
        pReq->m_totalLen += pReq->m_pIovecCur->iov_len;
        ++pReq->m_pIovecCur;
    }

    pReq->m_pIovec->iov_len  = sizeof( struct lsapi_resp_header)
            + pReq->m_respHeader.m_respInfo.m_cntHeaders * sizeof( short );
    pReq->m_totalLen += pReq->m_pIovec->iov_len;

    lsapi_buildPacketHeader( &pReq->m_respHeader.m_pktHeader,
                    LSAPI_RESP_HEADER, pReq->m_totalLen  );
    pReq->m_pIovec->iov_base = (void *)&pReq->m_respHeader;
    pReq->m_pIovecToWrite = pReq->m_pIovec;
    return 0;
}


int LSAPI_AppendRespHeader2_r( LSAPI_Request * pReq, const char * pHeaderName,
                              const char * pHeaderValue )
{
    int nameLen, valLen, len;
    if ( !pReq || !pHeaderName || !pHeaderValue )
        return -1;
    if ( pReq->m_reqState & LSAPI_ST_RESP_BODY )
        return -1;
    if ( pReq->m_respHeader.m_respInfo.m_cntHeaders >= LSAPI_MAX_RESP_HEADERS )
        return -1;
    nameLen = strlen( pHeaderName );
    valLen = strlen( pHeaderValue );
    if ( nameLen == 0 )
        return -1;
    while( nameLen > 0 )
    {
        char ch = *(pHeaderName + nameLen - 1 );
        if (( ch == '\n' )||( ch == '\r' ))
            --nameLen;
        else
            break;
    }
    if ( nameLen <= 0 )
        return 0;
    while( valLen > 0 )
    {
        char ch = *(pHeaderValue + valLen - 1 );
        if (( ch == '\n' )||( ch == '\r' ))
            --valLen;
        else
            break;
    }
    len = nameLen + valLen + 1;
    if ( len > LSAPI_RESP_HTTP_HEADER_MAX )
        return -1;

    if ( pReq->m_pRespHeaderBufPos + len + 1 > pReq->m_pRespHeaderBufEnd )
    {
        int newlen = pReq->m_pRespHeaderBufPos + len + 4096 - pReq->m_pRespHeaderBuf;
        newlen -= newlen % 4096;
        if ( allocateRespHeaderBuf( pReq, newlen ) == -1 )
            return -1;
    }
    memmove( pReq->m_pRespHeaderBufPos, pHeaderName, nameLen );
    pReq->m_pRespHeaderBufPos += nameLen;
    *pReq->m_pRespHeaderBufPos++ = ':';
    memmove( pReq->m_pRespHeaderBufPos, pHeaderValue, valLen );
    pReq->m_pRespHeaderBufPos += valLen;
    *pReq->m_pRespHeaderBufPos++ = 0;
    ++len;  /* add one byte padding for \0 */
    pReq->m_respHeaderLen[pReq->m_respHeader.m_respInfo.m_cntHeaders] = len;
    ++pReq->m_respHeader.m_respInfo.m_cntHeaders;
    return 0;
}


int LSAPI_AppendRespHeader_r( LSAPI_Request * pReq, const char * pBuf, int len )
{
    if ( !pReq || !pBuf || len <= 0 || len > LSAPI_RESP_HTTP_HEADER_MAX )
        return -1;
    if ( pReq->m_reqState & LSAPI_ST_RESP_BODY )
        return -1;
    if ( pReq->m_respHeader.m_respInfo.m_cntHeaders >= LSAPI_MAX_RESP_HEADERS )
        return -1;
    while( len > 0 )
    {
        char ch = *(pBuf + len - 1 );
        if (( ch == '\n' )||( ch == '\r' ))
            --len;
        else
            break;
    }
    if ( len <= 0 )
        return 0;
    if ( pReq->m_pRespHeaderBufPos + len + 1 > pReq->m_pRespHeaderBufEnd )
    {
        int newlen = pReq->m_pRespHeaderBufPos + len + 4096 - pReq->m_pRespHeaderBuf;
        newlen -= newlen % 4096;
        if ( allocateRespHeaderBuf( pReq, newlen ) == -1 )
            return -1;
    }
    memmove( pReq->m_pRespHeaderBufPos, pBuf, len );
    pReq->m_pRespHeaderBufPos += len;
    *pReq->m_pRespHeaderBufPos++ = 0;
    ++len;  /* add one byte padding for \0 */
    pReq->m_respHeaderLen[pReq->m_respHeader.m_respInfo.m_cntHeaders] = len;
    ++pReq->m_respHeader.m_respInfo.m_cntHeaders;
    return 0;
}


int LSAPI_CreateListenSock2( const struct sockaddr * pServerAddr, int backlog )
{
    int ret;
    int fd;
    int flag = 1;
    int addr_len;

    switch( pServerAddr->sa_family )
    {
    case AF_INET:
        addr_len = 16;
        break;
    case AF_INET6:
        addr_len = sizeof( struct sockaddr_in6 );
        break;
    case AF_UNIX:
        addr_len = sizeof( struct sockaddr_un );
        unlink( ((struct sockaddr_un *)pServerAddr)->sun_path );
        break;
    default:
        return -1;
    }

    fd = socket( pServerAddr->sa_family, SOCK_STREAM, 0 );
    if ( fd == -1 )
        return -1;

    fcntl( fd, F_SETFD, FD_CLOEXEC );

    if(setsockopt( fd, SOL_SOCKET, SO_REUSEADDR,
                (char *)( &flag ), sizeof(flag)) == 0)
    {
        ret = bind( fd, pServerAddr, addr_len );
        if ( !ret )
        {
            ret = listen( fd, backlog );
            if ( !ret )
                return fd;
        }
    }

    ret = errno;
    close(fd);
    errno = ret;
    return -1;
}


int LSAPI_ParseSockAddr( const char * pBind, struct sockaddr * pAddr )
{
    char achAddr[256];
    char * p = achAddr;
    char * pEnd;
    struct addrinfo *res, hints;
    int  doAddrInfo = 0;
    int port;

    if ( !pBind )
        return -1;

    while( isspace( *pBind ) )
        ++pBind;

    strncpy(achAddr, pBind, 255);
    achAddr[255] = 0;

    switch( *p )
    {
    case '/':
        pAddr->sa_family = AF_UNIX;
        strncpy( ((struct sockaddr_un *)pAddr)->sun_path, p,
                sizeof(((struct sockaddr_un *)pAddr)->sun_path) );
        return 0;

    case '[':
        pAddr->sa_family = AF_INET6;
        ++p;
        pEnd = strchr( p, ']' );
        if ( !pEnd )
            return -1;
        *pEnd++ = 0;

        if ( *p == '*' )
        {
            strcpy( achAddr, "::" );
            p = achAddr;
        }
        doAddrInfo = 1;
        break;

    default:
        pAddr->sa_family = AF_INET;
        pEnd = strchr( p, ':' );
        if ( !pEnd )
            return -1;
        *pEnd++ = 0;

        doAddrInfo = 0;
        if ( *p == '*' )
        {
            ((struct sockaddr_in *)pAddr)->sin_addr.s_addr = htonl(INADDR_ANY);
        }
        else if (!strcasecmp( p, "localhost" ) )
            ((struct sockaddr_in *)pAddr)->sin_addr.s_addr = htonl( INADDR_LOOPBACK );
        else
        {
#ifdef HAVE_INET_PTON
            if (!inet_pton(AF_INET, p, &((struct sockaddr_in *)pAddr)->sin_addr))
#else
            ((struct sockaddr_in *)pAddr)->sin_addr.s_addr = inet_addr( p );
            if ( ((struct sockaddr_in *)pAddr)->sin_addr.s_addr == INADDR_BROADCAST)
#endif
            {
                doAddrInfo = 1;
            }
        }
        break;
    }
    if ( *pEnd == ':' )
        ++pEnd;

    port = atoi( pEnd );
    if (( port <= 0 )||( port > 65535 ))
        return -1;
    if ( doAddrInfo )
    {

        memset(&hints, 0, sizeof(hints));

        hints.ai_family   = pAddr->sa_family;
        hints.ai_socktype = SOCK_STREAM;
        hints.ai_protocol = IPPROTO_TCP;

        if ( getaddrinfo(p, NULL, &hints, &res) )
        {
            return -1;
        }

        memcpy(pAddr, res->ai_addr, res->ai_addrlen);
        freeaddrinfo(res);
    }

    if ( pAddr->sa_family == AF_INET )
        ((struct sockaddr_in *)pAddr)->sin_port = htons( port );
    else
        ((struct sockaddr_in6 *)pAddr)->sin6_port = htons( port );
    return 0;

}


int LSAPI_CreateListenSock( const char * pBind, int backlog )
{
    char serverAddr[128];
    int ret;
    int fd = -1;
    ret = LSAPI_ParseSockAddr( pBind, (struct sockaddr *)serverAddr );
    if ( !ret )
    {
        fd = LSAPI_CreateListenSock2( (struct sockaddr *)serverAddr, backlog );
    }
    return fd;
}


static fn_select_t g_fnSelect = select;
typedef struct _lsapi_prefork_server
{
    int m_fd;
    int m_iMaxChildren;
    int m_iExtraChildren;
    int m_iCurChildren;
    int m_iMaxIdleChildren;
    int m_iServerMaxIdle;
    int m_iChildrenMaxIdleTime;
    int m_iMaxReqProcessTime;
    int m_iAvoidFork;

    lsapi_child_status * m_pChildrenStatus;
    lsapi_child_status * m_pChildrenStatusCur;
    lsapi_child_status * m_pChildrenStatusEnd;

}lsapi_prefork_server;
static lsapi_prefork_server * g_prefork_server = NULL;


int LSAPI_Init_Prefork_Server( int max_children, fn_select_t fp, int avoidFork )
{
    if ( g_prefork_server )
        return 0;
    if ( max_children <= 1 )
        return -1;
    if ( max_children >= 10000)
        max_children = 10000;

    if (s_max_busy_workers == 0)
        s_max_busy_workers = max_children / 2 + 1;

    g_prefork_server = (lsapi_prefork_server *)malloc( sizeof( lsapi_prefork_server ) );
    if ( !g_prefork_server )
        return -1;
    memset( g_prefork_server, 0, sizeof( lsapi_prefork_server ) );

    if ( fp != NULL )
        g_fnSelect = fp;

    s_ppid = getppid();
    s_pid = getpid();
    setpgid( s_pid, s_pid );
#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__)
    s_total_pages = sysconf(_SC_PHYS_PAGES);
#endif
    g_prefork_server->m_iAvoidFork = avoidFork;
    g_prefork_server->m_iMaxChildren = max_children;

    g_prefork_server->m_iExtraChildren = ( avoidFork ) ? 0 : (max_children / 3) ;
    g_prefork_server->m_iMaxIdleChildren = ( avoidFork ) ? (max_children + 1) : (max_children / 3);
    if ( g_prefork_server->m_iMaxIdleChildren == 0 )
        g_prefork_server->m_iMaxIdleChildren = 1;
    g_prefork_server->m_iChildrenMaxIdleTime = 300;
    g_prefork_server->m_iMaxReqProcessTime = 3600;

    setsid();

    return 0;
}


void LSAPI_Set_Server_fd( int fd )
{
    if( g_prefork_server )
        g_prefork_server->m_fd = fd;
}


static int lsapi_accept( int fdListen )
{
    int         fd;
    int         nodelay = 1;
    socklen_t   len;
    char        achPeer[128];

    len = sizeof( achPeer );
    fd = accept( fdListen, (struct sockaddr *)&achPeer, &len );
    if ( fd != -1 )
    {
        if (((struct sockaddr *)&achPeer)->sa_family == AF_INET )
        {
            setsockopt( fd, IPPROTO_TCP, TCP_NODELAY,
                    (char *)&nodelay, sizeof(nodelay));
        }

        //OPTIMIZATION
        //if ( s_accept_notify )
        //    notify_req_received( fd );
    }
    return fd;

}


static unsigned int s_max_reqs = UINT_MAX;
static int s_max_idle_secs = 300;
static int s_stop;

static void lsapi_cleanup(int signal)
{
    s_stop = signal;
}


static lsapi_child_status * find_child_status( int pid )
{
    lsapi_child_status * pStatus = g_prefork_server->m_pChildrenStatus;
    lsapi_child_status * pEnd = g_prefork_server->m_pChildrenStatusEnd;
    while( pStatus < pEnd )
    {
        if ( pStatus->m_pid == pid )
        {
            if (pid == 0)
            {
                memset(pStatus, 0, sizeof( *pStatus ) );
                pStatus->m_pid = -1;
            }
            if ( pStatus + 1 > g_prefork_server->m_pChildrenStatusCur )
                g_prefork_server->m_pChildrenStatusCur = pStatus + 1;
            return pStatus;
        }
        ++pStatus;
    }
    return NULL;
}


void LSAPI_reset_server_state( void )
{
    /*
       Reset child status
    */
    g_prefork_server->m_iCurChildren = 0;
    lsapi_child_status * pStatus = g_prefork_server->m_pChildrenStatus;
    lsapi_child_status * pEnd = g_prefork_server->m_pChildrenStatusEnd;
    while( pStatus < pEnd )
    {
        pStatus->m_pid = 0;
        ++pStatus;
    }
    if (s_busy_workers)
        __atomic_store_n(s_busy_workers, 0, __ATOMIC_SEQ_CST);
    if (s_accepting_workers)
        __atomic_store_n(s_accepting_workers, 0, __ATOMIC_SEQ_CST);

}


static void lsapi_sigchild( int signal )
{
    int status, pid;
    char expect_connected = LSAPI_STATE_CONNECTED;
    char expect_accepting = LSAPI_STATE_ACCEPTING;
    lsapi_child_status * child_status;
    if (g_prefork_server == NULL)
        return;
    while( 1 )
    {
        pid = waitpid( -1, &status, WNOHANG|WUNTRACED );
        if ( pid <= 0 )
        {
            break;
        }
        if ( WIFSIGNALED( status ))
        {
            int sig_num = WTERMSIG( status );
#ifdef WCOREDUMP
            const char * dump = WCOREDUMP( status ) ? "yes" : "no";
#else
            const char * dump = "unknown";
#endif
            lsapi_log("Child process with pid: %d was killed by signal: "
                     "%d, core dumped: %s\n", pid, sig_num, dump );
        }
        if ( pid == s_pid_dump_debug_info )
        {
            pid = 0;
            continue;
        }
        if ( pid == s_ignore_pid )
        {
            pid = 0;
            s_ignore_pid = -1;
            continue;
        }
        child_status = find_child_status( pid );
        if ( child_status )
        {
            if (__atomic_compare_exchange_n(&child_status->m_state,
                                            &expect_connected,
                                            LSAPI_STATE_IDLE, 1,
                                            __ATOMIC_SEQ_CST,
                                            __ATOMIC_SEQ_CST))
            {
                if (s_busy_workers)
                    __atomic_fetch_sub(s_busy_workers, 1, __ATOMIC_SEQ_CST);
            }
            else if (__atomic_compare_exchange_n(&child_status->m_state,
                                                 &expect_accepting,
                                                 LSAPI_STATE_IDLE, 1,
                                                 __ATOMIC_SEQ_CST,
                                                 __ATOMIC_SEQ_CST))
            {
                if (s_accepting_workers)
                    __atomic_fetch_sub(s_accepting_workers, 1, __ATOMIC_SEQ_CST);
            }
            child_status->m_pid = 0;
            --g_prefork_server->m_iCurChildren;
        }
    }
    while(( g_prefork_server->m_pChildrenStatusCur > g_prefork_server->m_pChildrenStatus )
            &&( g_prefork_server->m_pChildrenStatusCur[-1].m_pid == 0 ))
        --g_prefork_server->m_pChildrenStatusCur;

}


static int lsapi_init_children_status(void)
{
    char * pBuf;
    int size = 4096;
    int max_children;
    if (g_prefork_server->m_pChildrenStatus)
        return 0;
    max_children = g_prefork_server->m_iMaxChildren
                        + g_prefork_server->m_iExtraChildren;

    size = max_children * sizeof( lsapi_child_status ) * 2 + 3 * sizeof(int);
    size = (size + 4095) / 4096 * 4096;
    pBuf =( char*) mmap( NULL, size, PROT_READ | PROT_WRITE,
        MAP_ANON | MAP_SHARED, -1, 0 );
    if ( pBuf == MAP_FAILED )
    {
        perror( "Anonymous mmap() failed" );
        return -1;
    }
    memset( pBuf, 0, size );
    g_prefork_server->m_pChildrenStatus = (lsapi_child_status *)pBuf;
    g_prefork_server->m_pChildrenStatusCur = (lsapi_child_status *)pBuf;
    g_prefork_server->m_pChildrenStatusEnd = (lsapi_child_status *)pBuf + max_children;
    s_busy_workers = (int *)g_prefork_server->m_pChildrenStatusEnd;
    s_accepting_workers = s_busy_workers + 1;
    s_global_counter = s_accepting_workers + 1;
    s_avail_pages = (size_t *)(s_global_counter + 1);

    setsid();
    return 0;
}


static void dump_debug_info( lsapi_child_status * pStatus, long tmCur )
{
    char achCmd[1024];
    if ( s_pid_dump_debug_info )
    {
        if ( kill( s_pid_dump_debug_info, 0 ) == 0 )
            return;
    }

    lsapi_log("Possible runaway process, UID: %d, PPID: %d, PID: %d, "
             "reqCount: %d, process time: %ld, checkpoint time: %ld, start "
             "time: %ld\n", getuid(), getppid(), pStatus->m_pid,
             pStatus->m_iReqCounter, tmCur - pStatus->m_tmReqBegin,
             tmCur - pStatus->m_tmLastCheckPoint, tmCur - pStatus->m_tmStart );

    s_pid_dump_debug_info = fork();
    if (s_pid_dump_debug_info == 0)
    {
        snprintf( achCmd, 1024, "gdb --batch -ex \"attach %d\" -ex \"set height 0\" "
                "-ex \"bt\" >&2;PATH=$PATH:/usr/sbin lsof -p %d >&2",
                pStatus->m_pid, pStatus->m_pid );
        if ( system( achCmd ) == -1 )
            perror( "system()" );
        exit( 0 );
    }
}


static void lsapi_check_child_status( long tmCur )
{
    int idle = 0;
    int tobekilled;
    int dying = 0;
    int count = 0;
    lsapi_child_status * pStatus = g_prefork_server->m_pChildrenStatus;
    lsapi_child_status * pEnd = g_prefork_server->m_pChildrenStatusCur;
    while( pStatus < pEnd )
    {
        tobekilled = 0;
        if ( pStatus->m_pid != 0 && pStatus->m_pid != -1)
        {
            ++count;
            if ( !pStatus->m_inProcess )
            {
                if (g_prefork_server->m_iCurChildren - dying
                        > g_prefork_server->m_iMaxChildren
                    || idle > g_prefork_server->m_iMaxIdleChildren)
                {
                    ++pStatus->m_iKillSent;
                    //tobekilled = SIGUSR1;
                }
                else
                {
                    if (s_max_idle_secs> 0
                        && tmCur - pStatus->m_tmWaitBegin > s_max_idle_secs + 5)
                    {
                        ++pStatus->m_iKillSent;
                        //tobekilled = SIGUSR1;
                    }
                }
                if (!pStatus->m_iKillSent)
                    ++idle;
            }
            else
            {
                if (tmCur - pStatus->m_tmReqBegin >
                        g_prefork_server->m_iMaxReqProcessTime)
                {
                    if ((pStatus->m_iKillSent % 5) == 0 && s_dump_debug_info)
                        dump_debug_info( pStatus, tmCur );
                    if ( pStatus->m_iKillSent > 5 )
                    {
                        tobekilled = SIGKILL;
                        lsapi_log("Force killing runaway process PID: %d"
                                 " with SIGKILL\n", pStatus->m_pid );
                    }
                    else
                    {
                        tobekilled = SIGTERM;
                        lsapi_log("Killing runaway process PID: %d with "
                                 "SIGTERM\n", pStatus->m_pid );
                    }
                }
            }
            if ( tobekilled )
            {
                if (( kill( pStatus->m_pid, tobekilled ) == -1 ) &&
                    ( errno == ESRCH ))
                {
                    pStatus->m_pid = 0;
                    --count;
                }
                else
                {
                    ++pStatus->m_iKillSent;
                    ++dying;
                }
            }
        }
        ++pStatus;
    }
    if ( abs( g_prefork_server->m_iCurChildren - count ) > 1 )
    {
        lsapi_log("Children tracking is wrong: Cur Children: %d,"
                  " count: %d, idle: %d, dying: %d\n",
                  g_prefork_server->m_iCurChildren, count, idle, dying );
    }
}


//static int lsapi_all_children_must_die(void)
//{
//    int maxWait;
//    int sec =0;
//    g_prefork_server->m_iMaxReqProcessTime = 10;
//    g_prefork_server->m_iMaxIdleChildren = -1;
//    maxWait = 15;
//
//    while( g_prefork_server->m_iCurChildren && (sec < maxWait) )
//    {
//        lsapi_check_child_status(time(NULL));
//        sleep( 1 );
//        sec++;
//    }
//    if ( g_prefork_server->m_iCurChildren != 0 )
//        kill( -getpgrp(), SIGKILL );
//    return 0;
//}


void set_skip_write(void)
{   s_skip_write = 1;   }


int is_enough_free_mem(void)
{
#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__)
    //minimum 1GB or 10% available free memory
    return (*s_avail_pages > s_min_avail_pages
            || (*s_avail_pages * 10) / s_total_pages > 0);
#endif
    return 1;
}


static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer,
                                        LSAPI_Request * pReq )
{
    struct sigaction act, old_term, old_quit, old_int,
                    old_usr1, old_child;
    lsapi_child_status * child_status;
    int             wait_secs = 0;
    int             ret = 0;
    int             pid;
    time_t          lastTime = 0;
    time_t          curTime = 0;
    fd_set          readfds;
    struct timeval  timeout;

    sigset_t mask;
    sigset_t orig_mask;

    lsapi_init_children_status();

    act.sa_flags = 0;
    act.sa_handler = lsapi_sigchild;
    sigemptyset(&(act.sa_mask));
    if( sigaction( SIGCHLD, &act, &old_child ) )
    {
        perror( "Can't set signal handler for SIGCHILD" );
        return -1;
    }

    /* Set up handler to kill children upon exit */
    act.sa_flags = 0;
    act.sa_handler = lsapi_cleanup;
    sigemptyset(&(act.sa_mask));
    if( sigaction( SIGTERM, &act, &old_term ) ||
        sigaction( SIGINT,  &act, &old_int  ) ||
        sigaction( SIGUSR1, &act, &old_usr1 ) ||
        sigaction( SIGQUIT, &act, &old_quit ))
    {
        perror( "Can't set signals" );
        return -1;
    }

    while( !s_stop )
    {
        if (s_proc_group_timer_cb != NULL) {
            s_proc_group_timer_cb(&s_ignore_pid);
        }

        curTime = time( NULL );
        if (curTime != lastTime )
        {
            lastTime = curTime;
            if (lsapi_parent_dead())
                break;
            lsapi_check_child_status(curTime );
            if (pServer->m_iServerMaxIdle)
            {
                if ( pServer->m_iCurChildren <= 0 )
                {
                    ++wait_secs;
                    if ( wait_secs > pServer->m_iServerMaxIdle )
                        return -1;
                }
                else
                    wait_secs = 0;
            }
        }

#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__)
        *s_avail_pages = sysconf(_SC_AVPHYS_PAGES);
//        lsapi_log("Memory total: %zd, free: %zd, free %%%zd\n",
//                  s_total_pages, *s_avail_pages, *s_avail_pages * 100 / s_total_pages);

#endif
        FD_ZERO( &readfds );
        FD_SET( pServer->m_fd, &readfds );
        timeout.tv_sec = 1;
        timeout.tv_usec = 0;
        ret = (*g_fnSelect)(pServer->m_fd+1, &readfds, NULL, NULL, &timeout);
        if (ret == 1 )
        {
            int accepting = 0;
            if (s_accepting_workers)
                accepting = __atomic_load_n(s_accepting_workers, __ATOMIC_SEQ_CST);

            if (pServer->m_iCurChildren > 0
                && accepting > 0)
            {
                usleep(400);
                while(accepting-- > 0)
                    sched_yield();
                continue;
            }
        }
        else if ( ret == -1 )
        {
            if ( errno == EINTR )
                continue;
            /* perror( "select()" ); */
            break;
        }
        else
        {
            continue;
        }

        if (pServer->m_iCurChildren >=
            pServer->m_iMaxChildren + pServer->m_iExtraChildren)
        {
            lsapi_log("Reached max children process limit: %d, extra: %d,"
                     " current: %d, busy: %d, please increase LSAPI_CHILDREN.\n",
                     pServer->m_iMaxChildren, pServer->m_iExtraChildren,
                     pServer->m_iCurChildren,
                     s_busy_workers ? *s_busy_workers : -1 );
            usleep( 100000 );
            continue;
        }

        pReq->m_fd = lsapi_accept( pServer->m_fd );
        if ( pReq->m_fd != -1 )
        {
            wait_secs = 0;
            child_status = find_child_status( 0 );

            sigemptyset( &mask );
            sigaddset( &mask, SIGCHLD );

            if ( sigprocmask(SIG_BLOCK, &mask, &orig_mask) < 0 )
            {
                perror( "sigprocmask(SIG_BLOCK) to block SIGCHLD" );
            }

            pid = fork();

            if ( !pid )
            {
                setsid();
                if (sigprocmask(SIG_SETMASK, &orig_mask, NULL) < 0)
                    perror( "sigprocmask( SIG_SETMASK ) to restore SIGMASK in child" );
                g_prefork_server = NULL;
                s_ppid = getppid();
                s_pid = getpid();
                s_req_processed = 0;
                s_proc_group_timer_cb = NULL;
                s_worker_status = child_status;

                if (pthread_atfork_func)
                    (*pthread_atfork_func)(NULL, NULL, set_skip_write);

                __atomic_store_n(&s_worker_status->m_state,
                                 LSAPI_STATE_CONNECTED, __ATOMIC_SEQ_CST);
                if (s_busy_workers)
                    __atomic_add_fetch(s_busy_workers, 1, __ATOMIC_SEQ_CST);
                lsapi_set_nblock( pReq->m_fd, 0 );
                //keep it open if busy_count is used.
                if (!s_keep_listener && s_busy_workers
                    && *s_busy_workers > (pServer->m_iMaxChildren >> 1))
                    s_keep_listener = 1;
                if ((s_uid == 0 || !s_keep_listener || !is_enough_free_mem())
                    && pReq->m_fdListen != -1 )
                {
                    close( pReq->m_fdListen );
                    pReq->m_fdListen = -1;
                }
                /* don't catch our signals */
                sigaction( SIGCHLD, &old_child, 0 );
                sigaction( SIGTERM, &old_term, 0 );
                sigaction( SIGQUIT, &old_quit, 0 );
                sigaction( SIGINT,  &old_int,  0 );
                sigaction( SIGUSR1, &old_usr1, 0 );
                //init_conn_key( pReq->m_fd );
                lsapi_notify_pid( pReq->m_fd );
                s_notified_pid = 1;
                //if ( s_accept_notify )
                //    return notify_req_received( pReq->m_fd );
                return 0;
            }
            else if ( pid == -1 )
            {
                lsapi_perror("fork() failed, please increase process limit", errno);
                if (child_status)
                    child_status->m_pid = 0;
            }
            else
            {
                ++pServer->m_iCurChildren;
                if ( child_status )
                {
                    child_status->m_pid = pid;
                    child_status->m_tmWaitBegin = curTime;
                    child_status->m_tmStart = curTime;
                }
            }
            close( pReq->m_fd );
            pReq->m_fd = -1;

            if (sigprocmask(SIG_SETMASK, &orig_mask, NULL) < 0)
                perror( "sigprocmask( SIG_SETMASK ) to restore SIGMASK" );

        }
        else
        {
            if (( errno == EINTR )||( errno == EAGAIN))
                continue;
            lsapi_perror("accept() failed", errno);
            return -1;
        }
    }
    sigaction( SIGUSR1, &old_usr1, 0 );
    //kill( -getpgrp(), SIGUSR1 );
    //lsapi_all_children_must_die();  /* Sorry, children ;-) */
    return -1;

}


static struct sigaction old_term, old_quit, old_int,
                    old_usr1, old_child;


int LSAPI_Postfork_Child(LSAPI_Request * pReq)
{
    int max_children = g_prefork_server->m_iMaxChildren;
    s_pid = getpid();
    __atomic_store_n(&pReq->child_status->m_pid, s_pid, __ATOMIC_SEQ_CST);
    s_worker_status = pReq->child_status;

    setsid();
    g_prefork_server = NULL;
    s_ppid = getppid();
    s_req_processed = 0;
    s_proc_group_timer_cb = NULL;

    if (pthread_atfork_func)
        (*pthread_atfork_func)(NULL, NULL, set_skip_write);

    __atomic_store_n(&s_worker_status->m_state,
                     LSAPI_STATE_CONNECTED, __ATOMIC_SEQ_CST);
    if (s_busy_workers)
        __atomic_add_fetch(s_busy_workers, 1, __ATOMIC_SEQ_CST);
    lsapi_set_nblock( pReq->m_fd, 0 );
    //keep it open if busy_count is used.
    if (!s_keep_listener && s_busy_workers
        && *s_busy_workers > (max_children >> 1))
        s_keep_listener = 1;
    if ((s_uid == 0 || !s_keep_listener || !is_enough_free_mem())
        && pReq->m_fdListen != -1 )
    {
        close(pReq->m_fdListen);
        pReq->m_fdListen = -1;
    }

    //init_conn_key( pReq->m_fd );
    lsapi_notify_pid(pReq->m_fd);
    s_notified_pid = 1;
    //if ( s_accept_notify )
    //    return notify_req_received( pReq->m_fd );
    return 0;
}


int LSAPI_Postfork_Parent(LSAPI_Request * pReq)
{
    ++g_prefork_server->m_iCurChildren;
    if (pReq->child_status)
    {
        time_t curTime = time( NULL );
        pReq->child_status->m_tmWaitBegin = curTime;
        pReq->child_status->m_tmStart = curTime;
    }
    close(pReq->m_fd);
    pReq->m_fd = -1;
    return 0;
}


int LSAPI_Accept_Before_Fork(LSAPI_Request * pReq)
{
    time_t          lastTime = 0;
    time_t          curTime = 0;
    fd_set          readfds;
    struct timeval  timeout;
    int             wait_secs = 0;
    int             ret = 0;

    lsapi_prefork_server * pServer = g_prefork_server;

    struct sigaction act;

    lsapi_init_children_status();

    act.sa_flags = 0;
    act.sa_handler = lsapi_sigchild;
    sigemptyset(&(act.sa_mask));
    if (sigaction(SIGCHLD, &act, &old_child))
    {
        perror( "Can't set signal handler for SIGCHILD" );
        return -1;
    }

    /* Set up handler to kill children upon exit */
    act.sa_flags = 0;
    act.sa_handler = lsapi_cleanup;
    sigemptyset(&(act.sa_mask));
    if (sigaction(SIGTERM, &act, &old_term) ||
        sigaction(SIGINT,  &act, &old_int ) ||
        sigaction(SIGUSR1, &act, &old_usr1) ||
        sigaction(SIGQUIT, &act, &old_quit))
    {
        perror( "Can't set signals" );
        return -1;
    }
    s_stop = 0;
    pReq->m_reqState = 0;

    while(!s_stop)
    {
        if (s_proc_group_timer_cb != NULL) {
            s_proc_group_timer_cb(&s_ignore_pid);
        }

        curTime = time(NULL);
        if (curTime != lastTime)
        {
            lastTime = curTime;
            if (lsapi_parent_dead())
                break;
            lsapi_check_child_status(curTime);
            if (pServer->m_iServerMaxIdle)
            {
                if (pServer->m_iCurChildren <= 0)
                {
                    ++wait_secs;
                    if ( wait_secs > pServer->m_iServerMaxIdle )
                        return -1;
                }
                else
                    wait_secs = 0;
            }
        }

#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__)
        *s_avail_pages = sysconf(_SC_AVPHYS_PAGES);
//        lsapi_log("Memory total: %zd, free: %zd, free %%%zd\n",
//                  s_total_pages, *s_avail_pages, *s_avail_pages * 100 / s_total_pages);

#endif
        FD_ZERO(&readfds);
        FD_SET(pServer->m_fd, &readfds);
        timeout.tv_sec = 1;
        timeout.tv_usec = 0;
        ret = (*g_fnSelect)(pServer->m_fd+1, &readfds, NULL, NULL, &timeout);
        if (ret == 1 )
        {
            int accepting = 0;
            if (s_accepting_workers)
                accepting = __atomic_load_n(s_accepting_workers, __ATOMIC_SEQ_CST);

            if (pServer->m_iCurChildren > 0
                && accepting > 0)
            {
                usleep( 400);
                while(accepting-- > 0)
                    sched_yield();
                continue;
            }
        }
        else if (ret == -1)
        {
            if (errno == EINTR)
                continue;
            /* perror( "select()" ); */
            break;
        }
        else
        {
            continue;
        }

        if (pServer->m_iCurChildren >=
            pServer->m_iMaxChildren + pServer->m_iExtraChildren)
        {
            lsapi_log("Reached max children process limit: %d, extra: %d,"
                     " current: %d, busy: %d, please increase LSAPI_CHILDREN.\n",
                     pServer->m_iMaxChildren, pServer->m_iExtraChildren,
                     pServer->m_iCurChildren,
                     s_busy_workers ? *s_busy_workers : -1);
            usleep(100000);
            continue;
        }

        pReq->m_fd = lsapi_accept(pServer->m_fd);
        if (pReq->m_fd != -1)
        {
            wait_secs = 0;
            pReq->child_status = find_child_status(0);

            ret = 0;
            break;
        }
        else
        {
            if ((errno == EINTR) || (errno == EAGAIN))
                continue;
            lsapi_perror("accept() failed", errno);
            ret = -1;
            break;
        }
    }

    sigaction(SIGCHLD, &old_child, 0);
    sigaction(SIGTERM, &old_term, 0);
    sigaction(SIGQUIT, &old_quit, 0);
    sigaction(SIGINT,  &old_int,  0);
    sigaction(SIGUSR1, &old_usr1, 0);

    return ret;
}


int LSAPI_Prefork_Accept_r( LSAPI_Request * pReq )
{
    int             fd;
    int             ret;
    int             wait_secs;
    fd_set          readfds;
    struct timeval  timeout;

    if (s_skip_write)
        return -1;

    LSAPI_Finish_r( pReq );

    if ( g_prefork_server )
    {
        if ( g_prefork_server->m_fd != -1 )
            if ( lsapi_prefork_server_accept( g_prefork_server, pReq ) == -1 )
                return -1;
    }
    else if (s_req_processed > 0 && s_max_busy_workers > 0 && s_busy_workers)
    {
        ret = __atomic_load_n(s_busy_workers, __ATOMIC_SEQ_CST);
        if (ret >= s_max_busy_workers)
        {
            send_conn_close_notification(pReq->m_fd);
            lsapi_close_connection(pReq);
        }
    }

    if ( (unsigned int)s_req_processed > s_max_reqs )
        return -1;

    if ( s_worker_status )
    {
        s_worker_status->m_tmWaitBegin = time( NULL );
    }


    while( g_running )
    {
        if ( pReq->m_fd != -1 )
        {
            fd = pReq->m_fd;
        }
        else if ( pReq->m_fdListen != -1 )
            fd = pReq->m_fdListen;
        else
        {
            break;
        }
        wait_secs = 0;
        while( 1 )
        {
            if ( !g_running )
                return -1;
            if (s_req_processed && s_worker_status
                && s_worker_status->m_iKillSent)
                return -1;
            FD_ZERO( &readfds );
            FD_SET( fd, &readfds );
            timeout.tv_sec = 1;
            timeout.tv_usec = 0;
            if (fd == pReq->m_fdListen)
            {
                if (s_worker_status)
                    __atomic_store_n(&s_worker_status->m_state,
                                     LSAPI_STATE_ACCEPTING, __ATOMIC_SEQ_CST);
                if (s_accepting_workers)
                    __atomic_fetch_add(s_accepting_workers, 1, __ATOMIC_SEQ_CST);
            }
            ret = (*g_fnSelect)(fd+1, &readfds, NULL, NULL, &timeout);
            if (fd == pReq->m_fdListen)
            {
                if (s_accepting_workers)
                    __atomic_fetch_sub(s_accepting_workers, 1, __ATOMIC_SEQ_CST);
                if (s_worker_status)
                    __atomic_store_n(&s_worker_status->m_state,
                                     LSAPI_STATE_IDLE, __ATOMIC_SEQ_CST);
            }

            if ( ret == 0 )
            {
                if ( s_worker_status )
                {
                    s_worker_status->m_inProcess = 0;
                    if (fd == pReq->m_fdListen)
                    {
                        if (s_keep_listener == 0 || !is_enough_free_mem())
                            return -1;
                        if (s_keep_listener == 1)
                        {
                            int wait_time = 10;
                            if (s_busy_workers)
                                wait_time += *s_busy_workers * 10;
                            if (s_accepting_workers)
                                wait_time >>= (*s_accepting_workers);
                            if (wait_secs >= wait_time)
                                return -1;
                        }
                    }
                }
                ++wait_secs;
                if (( s_max_idle_secs > 0 )&&(wait_secs >= s_max_idle_secs ))
                    return -1;
                if ( lsapi_parent_dead() )
                    return -1;
            }
            else if ( ret == -1 )
            {
                if ( errno == EINTR )
                    continue;
                else
                    return -1;
            }
            else if ( ret >= 1 )
            {
                if (s_req_processed && s_worker_status
                    && s_worker_status->m_iKillSent)
                    return -1;
                if ( fd == pReq->m_fdListen )
                {
                    pReq->m_fd = lsapi_accept( pReq->m_fdListen );
                    if ( pReq->m_fd != -1 )
                    {
                        if (s_worker_status)
                            __atomic_store_n(&s_worker_status->m_state,
                                             LSAPI_STATE_CONNECTED,
                                             __ATOMIC_SEQ_CST);
                        if (s_busy_workers)
                            __atomic_fetch_add(s_busy_workers, 1, __ATOMIC_SEQ_CST);

                        fd = pReq->m_fd;

                        lsapi_set_nblock( fd, 0 );
                        //init_conn_key( pReq->m_fd );
                        if (!s_keep_listener)
                        {
                            close( pReq->m_fdListen );
                            pReq->m_fdListen = -1;
                        }
                        if ( s_accept_notify )
                            if ( notify_req_received( pReq->m_fd ) == -1 )
                                return -1;
                    }
                    else
                    {
                        if (( errno == EINTR )||( errno == EAGAIN))
                            continue;
                        lsapi_perror( "lsapi_accept() error", errno );
                        return -1;
                    }
                }
                else
                    break;
            }
        }

        if ( !readReq( pReq ) )
        {
            if ( s_worker_status )
            {
                s_worker_status->m_iKillSent = 0;
                s_worker_status->m_inProcess = 1;
                ++s_worker_status->m_iReqCounter;
                s_worker_status->m_tmReqBegin =
                s_worker_status->m_tmLastCheckPoint = time(NULL);
            }
            ++s_req_processed;
            return 0;
        }
        lsapi_close_connection(pReq);
        LSAPI_Reset_r( pReq );
    }
    return -1;

}


void LSAPI_Set_Max_Reqs( int reqs )
{   s_max_reqs = reqs - 1;      }

void LSAPI_Set_Max_Idle( int secs )
{   s_max_idle_secs = secs;     }


void LSAPI_Set_Max_Children( int maxChildren )
{
    if ( g_prefork_server )
        g_prefork_server->m_iMaxChildren = maxChildren;
}


void LSAPI_Set_Extra_Children( int extraChildren )
{
    if (( g_prefork_server )&&( extraChildren >= 0 ))
        g_prefork_server->m_iExtraChildren = extraChildren;
}


void LSAPI_Set_Max_Process_Time( int secs )
{
    if (( g_prefork_server )&&( secs > 0 ))
        g_prefork_server->m_iMaxReqProcessTime = secs;
}


void LSAPI_Set_Max_Idle_Children( int maxIdleChld )
{
    if (( g_prefork_server )&&( maxIdleChld > 0 ))
        g_prefork_server->m_iMaxIdleChildren = maxIdleChld;
}


void LSAPI_Set_Server_Max_Idle_Secs( int serverMaxIdle )
{
    if ( g_prefork_server )
        g_prefork_server->m_iServerMaxIdle = serverMaxIdle;
}


void LSAPI_Set_Slow_Req_Msecs( int msecs )
{
    s_slow_req_msecs = msecs;
}


int  LSAPI_Get_Slow_Req_Msecs(void)
{
    return s_slow_req_msecs;
}


void LSAPI_No_Check_ppid(void)
{
    s_ppid = 0;
}


int LSAPI_Get_ppid(void)
{
    return(s_ppid);
}


#if defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)
#include <crt_externs.h>
#else
extern char ** environ;
#endif
static void unset_lsapi_envs(void)
{
    char **env;
#if defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__)
    env = *_NSGetEnviron();
#else
    env = environ;
#endif
    while( env != NULL && *env != NULL )
    {
        if (!strncmp(*env, "LSAPI_", 6) || !strncmp( *env, "PHP_LSAPI_", 10 )
            || (!strncmp( *env, "PHPRC=", 6 )&&(!s_uid)))
        {
            char ** del = env;
            do
                *del = del[1];
            while( *del++ );
        }
        else
            ++env;
    }
}


static int lsapi_initSuEXEC(void)
{
    int i;
    struct passwd * pw;
    s_defaultUid = 0;
    s_defaultGid = 0;
    if ( s_uid == 0 )
    {
        const char * p = getenv( "LSAPI_DEFAULT_UID" );
        if ( p )
        {
            i = atoi( p );
            if ( i > 0 )
                s_defaultUid = i;
        }
        p = getenv( "LSAPI_DEFAULT_GID" );
        if ( p )
        {
            i = atoi( p );
            if ( i > 0 )
                s_defaultGid = i;
        }
        p = getenv( "LSAPI_SECRET" );
        if (( !p )||( readSecret(p) == -1 ))
                return -1;
        if ( g_prefork_server )
        {
            if ( g_prefork_server->m_iMaxChildren < 100 )
                g_prefork_server->m_iMaxChildren = 100;
            if ( g_prefork_server->m_iExtraChildren < 1000 )
                g_prefork_server->m_iExtraChildren = 1000;
        }
    }
    if ( !s_defaultUid || !s_defaultGid )
    {
        pw = getpwnam( "nobody" );
        if ( pw )
        {
            if ( !s_defaultUid )
                s_defaultUid = pw->pw_uid;
            if ( !s_defaultGid )
                s_defaultGid = pw->pw_gid;
        }
        else
        {
            if ( !s_defaultUid )
                s_defaultUid = 10000;
            if ( !s_defaultGid )
                s_defaultGid = 10000;
        }
    }
    return 0;
}


static int lsapi_check_path(const char *p, char *final, int max_len)
{
    char resolved_path[PATH_MAX+1];
    int len = 0;
    char *end;
    if (*p != '/')
    {
        if (getcwd(final, max_len) == NULL)
            return -1;
        len = strlen(final);
        *(final + len) = '/';
        ++len;
    }
    end = memccpy(&final[len], p, '\0', PATH_MAX - len);
    if (!end)
    {
        errno = EINVAL;
        return -1;
    }
    p = final;
    if (realpath(p, resolved_path) == NULL
        && errno != ENOENT && errno != EACCES)
        return -1;
    if (strncmp(resolved_path, "/etc/", 5) == 0)
    {
        errno = EPERM;
        return -1;
    }
    return 0;
}


static int lsapi_reopen_stderr2(const char *full_path)
{
    int newfd = open(full_path, O_WRONLY | O_CREAT | O_APPEND, 0644);
    if (newfd == -1)
    {
        LSAPI_perror_r(NULL, "Failed to open custom stderr log", full_path);
        return -1;
    }
    if (newfd != 2)
    {
        dup2(newfd, 2);
        close(newfd);
        dup2(2, 1);
    }
    if (s_stderr_log_path && full_path != s_stderr_log_path)
    {
        free(s_stderr_log_path);
        s_stderr_log_path = NULL;
    }
    s_stderr_log_path = strdup(full_path);
    return 0;
}


static int lsapi_reopen_stderr(const char *p)
{
    char full_path[PATH_MAX];
    if (s_uid == 0)
        return -1;
    if (lsapi_check_path(p, full_path, PATH_MAX) == -1)
    {
        LSAPI_perror_r(NULL, "Invalid custom stderr log path", p);
        return -1;
    }
    return lsapi_reopen_stderr2(full_path);
}


int LSAPI_Init_Env_Parameters( fn_select_t fp )
{
    const char *p;
    char ch;
    int n;
    int avoidFork = 0;

    p = getenv("LSAPI_STDERR_LOG");
    if (p)
    {
        lsapi_reopen_stderr(p);
    }
    if (!s_stderr_log_path)
        s_stderr_is_pipe = isPipe(STDERR_FILENO);

    p = getenv( "PHP_LSAPI_MAX_REQUESTS" );
    if ( !p )
        p = getenv( "LSAPI_MAX_REQS" );
    if ( p )
    {
        n = atoi( p );
        if ( n > 0 )
            LSAPI_Set_Max_Reqs( n );
    }

    p = getenv( "LSAPI_KEEP_LISTEN" );
    if ( p )
    {
        n = atoi( p );
        s_keep_listener = n;
    }

    p = getenv( "LSAPI_AVOID_FORK" );
    if ( p )
    {
        avoidFork = atoi( p );
        if (avoidFork)
        {
            s_keep_listener = 2;
            ch = *(p + strlen(p) - 1);
            if (  ch == 'G' || ch == 'g' )
                avoidFork *= 1024 * 1024 * 1024;
            else if (  ch == 'M' || ch == 'm' )
                avoidFork *= 1024 * 1024;
            if (avoidFork >= 1024 * 10240)
                s_min_avail_pages = avoidFork / 4096;
        }
    }

    p = getenv( "LSAPI_ACCEPT_NOTIFY" );
    if ( p )
    {
        s_accept_notify = atoi( p );
    }

    p = getenv( "LSAPI_SLOW_REQ_MSECS" );
    if ( p )
    {
        n = atoi( p );
        LSAPI_Set_Slow_Req_Msecs( n );
    }

#if defined( RLIMIT_CORE )
    p = getenv( "LSAPI_ALLOW_CORE_DUMP" );
    if ( !p )
    {
        struct rlimit limit = { 0, 0 };
        setrlimit( RLIMIT_CORE, &limit );
    }
    else
        s_enable_core_dump = 1;

#endif

    p = getenv( "LSAPI_MAX_IDLE" );
    if ( p )
    {
        n = atoi( p );
        LSAPI_Set_Max_Idle( n );
    }

    if ( LSAPI_Is_Listen() )
    {
        n = 0;
        p = getenv( "PHP_LSAPI_CHILDREN" );
        if ( !p )
            p = getenv( "LSAPI_CHILDREN" );
        if ( p )
            n = atoi( p );
        if ( n > 1 )
        {
            LSAPI_Init_Prefork_Server( n, fp, avoidFork != 0 );
            LSAPI_Set_Server_fd( g_req.m_fdListen );
        }

        p = getenv( "LSAPI_EXTRA_CHILDREN" );
        if ( p )
            LSAPI_Set_Extra_Children( atoi( p ) );

        p = getenv( "LSAPI_MAX_IDLE_CHILDREN" );
        if ( p )
            LSAPI_Set_Max_Idle_Children( atoi( p ) );

        p = getenv( "LSAPI_PGRP_MAX_IDLE" );
        if ( p )
        {
            LSAPI_Set_Server_Max_Idle_Secs( atoi( p ) );
        }

        p = getenv( "LSAPI_MAX_PROCESS_TIME" );
        if ( p )
            LSAPI_Set_Max_Process_Time( atoi( p ) );

        if ( getenv( "LSAPI_PPID_NO_CHECK" ) )
        {
            LSAPI_No_Check_ppid();
        }

        p = getenv("LSAPI_MAX_BUSY_WORKER");
        if (p)
        {
            n = atoi(p);
            s_max_busy_workers = n;
            if (n >= 0)
                LSAPI_No_Check_ppid();
        }


        p = getenv( "LSAPI_DUMP_DEBUG_INFO" );
        if ( p )
            s_dump_debug_info = atoi( p );

        if ( lsapi_initSuEXEC() == -1 )
            return -1;
#if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__)
        lsapi_initLVE();
#endif
    }
    unset_lsapi_envs();
    return 0;
}


int LSAPI_ErrResponse_r( LSAPI_Request * pReq, int code, const char ** pRespHeaders,
                         const char * pBody, int bodyLen )
{
    LSAPI_SetRespStatus_r( pReq, code );
    if ( pRespHeaders )
    {
        while( *pRespHeaders )
        {
            LSAPI_AppendRespHeader_r( pReq, *pRespHeaders, strlen( *pRespHeaders ) );
            ++pRespHeaders;
        }
    }
    if ( pBody &&( bodyLen > 0 ))
    {
        LSAPI_Write_r( pReq, pBody, bodyLen );
    }
    LSAPI_Finish_r( pReq );
    return 0;
}


static void lsapi_MD5Transform(uint32 buf[4], uint32 const in[16]);

/*
 * Note: this code is harmless on little-endian machines.
 */
static void byteReverse(unsigned char *buf, unsigned longs)
{
    uint32 t;
    do {
        t = (uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 |
            ((unsigned) buf[1] << 8 | buf[0]);
        *(uint32 *) buf = t;
        buf += 4;
    } while (--longs);
}


/*
 * Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious
 * initialization constants.
 */
void lsapi_MD5Init(struct lsapi_MD5Context *ctx)
{
    ctx->buf[0] = 0x67452301;
    ctx->buf[1] = 0xefcdab89;
    ctx->buf[2] = 0x98badcfe;
    ctx->buf[3] = 0x10325476;

    ctx->bits[0] = 0;
    ctx->bits[1] = 0;
}

/*
 * Update context to reflect the concatenation of another buffer full
 * of bytes.
 */
void lsapi_MD5Update(struct lsapi_MD5Context *ctx, unsigned char const *buf, unsigned len)
{
    register uint32 t;

    /* Update bitcount */

    t = ctx->bits[0];
    if ((ctx->bits[0] = t + ((uint32) len << 3)) < t)
        ctx->bits[1]++;                /* Carry from low to high */
    ctx->bits[1] += len >> 29;

    t = (t >> 3) & 0x3f;        /* Bytes already in shsInfo->data */

    /* Handle any leading odd-sized chunks */

    if (t) {
        unsigned char *p = (unsigned char *) ctx->in + t;

        t = 64 - t;
        if (len < t) {
            memmove(p, buf, len);
            return;
        }
        memmove(p, buf, t);
        byteReverse(ctx->in, 16);
        lsapi_MD5Transform(ctx->buf, (uint32 *) ctx->in);
        buf += t;
        len -= t;
    }
    /* Process data in 64-byte chunks */

    while (len >= 64) {
        memmove(ctx->in, buf, 64);
        byteReverse(ctx->in, 16);
        lsapi_MD5Transform(ctx->buf, (uint32 *) ctx->in);
        buf += 64;
        len -= 64;
    }

    /* Handle any remaining bytes of data. */

    memmove(ctx->in, buf, len);
}


/*
 * Final wrap-up - pad to 64-byte boundary with the bit pattern
 * 1 0* (64-bit count of bits processed, MSB-first)
 */
void lsapi_MD5Final(unsigned char digest[16], struct lsapi_MD5Context *ctx)
{
    unsigned int count;
    unsigned char *p;

    /* Compute number of bytes mod 64 */
    count = (ctx->bits[0] >> 3) & 0x3F;

    /* Set the first char of padding to 0x80.  This is safe since there is
       always at least one byte free */
    p = ctx->in + count;
    *p++ = 0x80;

    /* Bytes of padding needed to make 64 bytes */
    count = 64 - 1 - count;

    /* Pad out to 56 mod 64 */
    if (count < 8) {
        /* Two lots of padding:  Pad the first block to 64 bytes */
        memset(p, 0, count);
        byteReverse(ctx->in, 16);
        lsapi_MD5Transform(ctx->buf, (uint32 *) ctx->in);

        /* Now fill the next block with 56 bytes */
        memset(ctx->in, 0, 56);
    } else {
        /* Pad block to 56 bytes */
        memset(p, 0, count - 8);
    }
    byteReverse(ctx->in, 14);

    /* Append length in bits and transform */
    ((uint32 *) ctx->in)[14] = ctx->bits[0];
    ((uint32 *) ctx->in)[15] = ctx->bits[1];

    lsapi_MD5Transform(ctx->buf, (uint32 *) ctx->in);
    byteReverse((unsigned char *) ctx->buf, 4);
    memmove(digest, ctx->buf, 16);
    memset(ctx, 0, sizeof(*ctx));        /* In case it's sensitive */
}


/* The four core functions - F1 is optimized somewhat */

/* #define F1(x, y, z) (x & y | ~x & z) */
#define F1(x, y, z) (z ^ (x & (y ^ z)))
#define F2(x, y, z) F1(z, x, y)
#define F3(x, y, z) (x ^ y ^ z)
#define F4(x, y, z) (y ^ (x | ~z))

/* This is the central step in the MD5 algorithm. */
#define MD5STEP(f, w, x, y, z, data, s) \
        ( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )

/*
 * The core of the MD5 algorithm, this alters an existing MD5 hash to
 * reflect the addition of 16 longwords of new data.  MD5Update blocks
 * the data and converts bytes into longwords for this routine.
 */
static void lsapi_MD5Transform(uint32 buf[4], uint32 const in[16])
{
    register uint32 a, b, c, d;

    a = buf[0];
    b = buf[1];
    c = buf[2];
    d = buf[3];

    MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
    MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
    MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
    MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
    MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
    MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
    MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
    MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
    MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
    MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
    MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
    MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
    MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
    MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
    MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
    MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);

    MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
    MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
    MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
    MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
    MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
    MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
    MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
    MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
    MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
    MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
    MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
    MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
    MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
    MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
    MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
    MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);

    MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
    MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
    MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
    MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
    MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
    MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
    MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
    MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
    MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
    MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
    MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
    MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
    MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
    MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
    MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
    MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);

    MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
    MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
    MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
    MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
    MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
    MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
    MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
    MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
    MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
    MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
    MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
    MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
    MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
    MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
    MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
    MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);

    buf[0] += a;
    buf[1] += b;
    buf[2] += c;
    buf[3] += d;
}


int LSAPI_Set_Restored_Parent_Pid(int pid)
{
    int old_ppid = s_ppid;
    s_restored_ppid = pid;
    return old_ppid;
}


int LSAPI_Inc_Req_Processed(int cnt)
{
    return __atomic_add_fetch(s_global_counter, cnt, __ATOMIC_SEQ_CST);
}


PK	}$[��Y�/�/-gems/gems/ruby-lsapi-5.6/ext/lsapi/lsapilib.hnu�[���/*
Copyright (c) 2002-2018, Lite Speed Technologies Inc.
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 Lite Speed Technologies Inc 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.
*/


#ifndef  _LSAPILIB_H_
#define  _LSAPILIB_H_

#if defined (c_plusplus) || defined (__cplusplus)
extern "C" {
#endif

#include "lsapidef.h"

#include <stddef.h>
#include <sys/time.h>
#include <sys/types.h>

struct LSAPI_key_value_pair
{
    char * pKey;
    char * pValue;
    int    keyLen;
    int    valLen;
};

struct lsapi_child_status;
#define LSAPI_MAX_RESP_HEADERS  1000

typedef struct lsapi_request
{
    int               m_fdListen;
    int               m_fd;

    long              m_lLastActive;
    long              m_lReqBegin;

    char            * m_pReqBuf;
    int               m_reqBufSize;

    char            * m_pRespBuf;
    char            * m_pRespBufEnd;
    char            * m_pRespBufPos;

    char            * m_pRespHeaderBuf;
    char            * m_pRespHeaderBufEnd;
    char            * m_pRespHeaderBufPos;
    struct lsapi_child_status * child_status;


    struct iovec    * m_pIovec;
    struct iovec    * m_pIovecEnd;
    struct iovec    * m_pIovecCur;
    struct iovec    * m_pIovecToWrite;

    struct lsapi_packet_header      * m_respPktHeaderEnd;

    struct lsapi_req_header         * m_pHeader;
    struct LSAPI_key_value_pair     * m_pEnvList;
    struct LSAPI_key_value_pair     * m_pSpecialEnvList;
    int                               m_envListSize;
    int                               m_specialEnvListSize;

    struct lsapi_http_header_index  * m_pHeaderIndex;
    struct lsapi_header_offset      * m_pUnknownHeader;

    char            * m_pScriptFile;
    char            * m_pScriptName;
    char            * m_pQueryString;
    char            * m_pHttpHeader;
    char            * m_pRequestMethod;
    int               m_totalLen;
    int               m_reqState;
    off_t             m_reqBodyLen;
    off_t             m_reqBodyRead;
    int               m_bufProcessed;
    int               m_bufRead;

    struct lsapi_packet_header        m_respPktHeader[5];

    struct lsapi_resp_header          m_respHeader;
    short                             m_respHeaderLen[LSAPI_MAX_RESP_HEADERS];
    void            * m_pAppData;

}LSAPI_Request;

extern LSAPI_Request g_req;


/* return: >0 continue, ==0 stop, -1 failed  */
typedef int (*LSAPI_CB_EnvHandler )( const char * pKey, int keyLen,
                const char * pValue, int valLen, void * arg );


int LSAPI_Init(void);

void LSAPI_Stop(void);

int LSAPI_Is_Listen_r( LSAPI_Request * pReq);

int LSAPI_InitRequest( LSAPI_Request * pReq, int fd );

int LSAPI_Accept_r( LSAPI_Request * pReq );

void LSAPI_Reset_r( LSAPI_Request * pReq );

int LSAPI_Finish_r( LSAPI_Request * pReq );

int LSAPI_Release_r( LSAPI_Request * pReq );

char * LSAPI_GetHeader_r( LSAPI_Request * pReq, int headerIndex );

int LSAPI_ForeachHeader_r( LSAPI_Request * pReq,
            LSAPI_CB_EnvHandler fn, void * arg );

int LSAPI_ForeachOrgHeader_r( LSAPI_Request * pReq,
            LSAPI_CB_EnvHandler fn, void * arg );

int LSAPI_ForeachEnv_r( LSAPI_Request * pReq,
            LSAPI_CB_EnvHandler fn, void * arg );

int LSAPI_ForeachSpecialEnv_r( LSAPI_Request * pReq,
            LSAPI_CB_EnvHandler fn, void * arg );

char * LSAPI_GetEnv_r( LSAPI_Request * pReq, const char * name );

ssize_t LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, size_t len );

int LSAPI_ReqBodyGetChar_r( LSAPI_Request * pReq );

int LSAPI_ReqBodyGetLine_r( LSAPI_Request * pReq, char * pBuf, size_t bufLen, int *getLF );


int LSAPI_FinalizeRespHeaders_r( LSAPI_Request * pReq );

ssize_t LSAPI_Write_r( LSAPI_Request * pReq, const char * pBuf, size_t len );

ssize_t LSAPI_sendfile_r( LSAPI_Request * pReq, int fdIn, off_t* off, size_t size );

ssize_t LSAPI_Write_Stderr_r( LSAPI_Request * pReq, const char * pBuf, size_t len );

int LSAPI_Flush_r( LSAPI_Request * pReq );

int LSAPI_AppendRespHeader_r( LSAPI_Request * pReq, const char * pBuf, int len );

int LSAPI_AppendRespHeader2_r( LSAPI_Request * pReq, const char * pHeaderName,
                              const char * pHeaderValue );

int LSAPI_ErrResponse_r( LSAPI_Request * pReq, int code, const char ** pRespHeaders,
                         const char * pBody, int bodyLen );

static inline int LSAPI_SetRespStatus_r( LSAPI_Request * pReq, int code )
{
    if ( !pReq )
        return -1;
    pReq->m_respHeader.m_respInfo.m_status = code;
    return 0;
}

static inline int LSAPI_SetAppData_r( LSAPI_Request * pReq, void * data )
{
    if ( !pReq )
        return -1;
    pReq->m_pAppData = data;
    return 0;
}

static inline void * LSAPI_GetAppData_r( LSAPI_Request * pReq )
{
    if ( !pReq )
        return NULL;
    return pReq->m_pAppData;
}

static inline char * LSAPI_GetQueryString_r( LSAPI_Request * pReq )
{
    if ( pReq )
        return pReq->m_pQueryString;
    return NULL;
}


static inline char * LSAPI_GetScriptFileName_r( LSAPI_Request * pReq )
{
    if ( pReq )
        return pReq->m_pScriptFile;
    return NULL;
}


static inline char * LSAPI_GetScriptName_r( LSAPI_Request * pReq )
{
    if ( pReq )
        return pReq->m_pScriptName;
    return NULL;
}


static inline char * LSAPI_GetRequestMethod_r( LSAPI_Request * pReq)
{
    if ( pReq )
        return pReq->m_pRequestMethod;
    return NULL;
}



static inline off_t LSAPI_GetReqBodyLen_r( LSAPI_Request * pReq )
{
    if ( pReq )
        return pReq->m_reqBodyLen;
    return -1;
}

static inline off_t LSAPI_GetReqBodyRemain_r( LSAPI_Request * pReq )
{
    if ( pReq )
        return pReq->m_reqBodyLen - pReq->m_reqBodyRead;
    return -1;
}


int LSAPI_End_Response_r(LSAPI_Request * pReq);



int LSAPI_Is_Listen(void);

static inline int LSAPI_Accept( void )
{   return LSAPI_Accept_r( &g_req );                        }

static inline int LSAPI_Finish(void)
{   return LSAPI_Finish_r( &g_req );                        }

static inline char * LSAPI_GetHeader( int headerIndex )
{   return LSAPI_GetHeader_r( &g_req, headerIndex );        }

static inline int LSAPI_ForeachHeader( LSAPI_CB_EnvHandler fn, void * arg )
{   return LSAPI_ForeachHeader_r( &g_req, fn, arg );        }

static inline int LSAPI_ForeachOrgHeader(
            LSAPI_CB_EnvHandler fn, void * arg )
{   return LSAPI_ForeachOrgHeader_r( &g_req, fn, arg );     }

static inline int LSAPI_ForeachEnv( LSAPI_CB_EnvHandler fn, void * arg )
{   return LSAPI_ForeachEnv_r( &g_req, fn, arg );           }

static inline int LSAPI_ForeachSpecialEnv( LSAPI_CB_EnvHandler fn, void * arg )
{   return LSAPI_ForeachSpecialEnv_r( &g_req, fn, arg );    }

static inline char * LSAPI_GetEnv( const char * name )
{   return LSAPI_GetEnv_r( &g_req, name );                  }

static inline char * LSAPI_GetQueryString(void)
{   return LSAPI_GetQueryString_r( &g_req );                }

static inline char * LSAPI_GetScriptFileName(void)
{   return LSAPI_GetScriptFileName_r( &g_req );             }

static inline char * LSAPI_GetScriptName(void)
{    return LSAPI_GetScriptName_r( &g_req );                }

static inline char * LSAPI_GetRequestMethod(void)
{   return LSAPI_GetRequestMethod_r( &g_req );              }

static inline off_t LSAPI_GetReqBodyLen(void)
{   return LSAPI_GetReqBodyLen_r( &g_req );                 }

static inline off_t LSAPI_GetReqBodyRemain(void)
{   return LSAPI_GetReqBodyRemain_r( &g_req );                 }

static inline ssize_t LSAPI_ReadReqBody( char * pBuf, size_t len )
{   return LSAPI_ReadReqBody_r( &g_req, pBuf, len );        }

static inline int LSAPI_ReqBodyGetChar(void)
{   return LSAPI_ReqBodyGetChar_r( &g_req );        }

static inline int LSAPI_ReqBodyGetLine( char * pBuf, int len, int *getLF )
{   return LSAPI_ReqBodyGetLine_r( &g_req, pBuf, len, getLF );        }



static inline int LSAPI_FinalizeRespHeaders(void)
{   return LSAPI_FinalizeRespHeaders_r( &g_req );           }

static inline ssize_t LSAPI_Write( const char * pBuf, ssize_t len )
{   return LSAPI_Write_r( &g_req, pBuf, len );              }

static inline ssize_t LSAPI_sendfile( int fdIn, off_t* off, size_t size )
{
    return LSAPI_sendfile_r(&g_req, fdIn, off, size );
}

static inline ssize_t LSAPI_Write_Stderr( const char * pBuf, ssize_t len )
{   return LSAPI_Write_Stderr_r( &g_req, pBuf, len );       }

static inline int LSAPI_Flush(void)
{   return LSAPI_Flush_r( &g_req );                         }

static inline int LSAPI_AppendRespHeader( char * pBuf, int len )
{   return LSAPI_AppendRespHeader_r( &g_req, pBuf, len );   }

static inline int LSAPI_SetRespStatus( int code )
{   return LSAPI_SetRespStatus_r( &g_req, code );           }

static inline int LSAPI_ErrResponse( int code, const char ** pRespHeaders, const char * pBody, int bodyLen )
{   return LSAPI_ErrResponse_r( &g_req, code, pRespHeaders, pBody, bodyLen );   }

static inline int LSAPI_End_Response(void)
{   return LSAPI_End_Response_r( &g_req );                         }

int LSAPI_IsRunning(void);

int LSAPI_CreateListenSock( const char * pBind, int backlog );

typedef int (*fn_select_t)( int, fd_set *, fd_set *, fd_set *, struct timeval * );

int LSAPI_Init_Prefork_Server( int max_children, fn_select_t fp, int avoidFork );

void LSAPI_Set_Server_fd( int fd );

int LSAPI_Prefork_Accept_r( LSAPI_Request * pReq );

void LSAPI_No_Check_ppid(void);

void LSAPI_Set_Max_Reqs( int reqs );

void LSAPI_Set_Max_Idle( int secs );

void LSAPI_Set_Max_Children( int maxChildren );

void LSAPI_Set_Max_Idle_Children( int maxIdleChld );

void LSAPI_Set_Server_Max_Idle_Secs( int serverMaxIdle );

void LSAPI_Set_Max_Process_Time( int secs );

int LSAPI_Init_Env_Parameters( fn_select_t fp );

void LSAPI_Set_Slow_Req_Msecs( int msecs );

int  LSAPI_Get_Slow_Req_Msecs(void);

int LSAPI_is_suEXEC_Daemon(void);

int LSAPI_Set_Restored_Parent_Pid(int pid);

typedef void (*LSAPI_On_Timer_pf)(int *forked_child_pid);
void LSAPI_Register_Pgrp_Timer_Callback(LSAPI_On_Timer_pf);

int LSAPI_Inc_Req_Processed(int cnt);

int LSAPI_Accept_Before_Fork(LSAPI_Request * pReq);

int LSAPI_Postfork_Child(LSAPI_Request * pReq);

int LSAPI_Postfork_Parent(LSAPI_Request * pReq);

#define LSAPI_LOG_LEVEL_BITS    0xff
#define LSAPI_LOG_FLAG_NONE     0
#define LSAPI_LOG_FLAG_DEBUG    1
#define LSAPI_LOG_FLAG_INFO     2
#define LSAPI_LOG_FLAG_NOTICE   3
#define LSAPI_LOG_FLAG_WARN     4
#define LSAPI_LOG_FLAG_ERROR    5
#define LSAPI_LOG_FLAG_CRIT     6
#define LSAPI_LOG_FLAG_FATAL    7

#define LSAPI_LOG_TIMESTAMP_BITS (0xff00)
#define LSAPI_LOG_TIMESTAMP_FULL (0x100)
#define LSAPI_LOG_TIMESTAMP_HMS  (0x200)
#define LSAPI_LOG_TIMESTAMP_STDERR  (0x400)

#define LSAPI_LOG_PID            (0x10000)

void LSAPI_Log(int flag, const char * fmt, ...)
#if __GNUC__
        __attribute__((format(printf, 2, 3)))
#endif
;


#if defined (c_plusplus) || defined (__cplusplus)
}
#endif


#endif







PK	}$[L���(�(-gems/gems/ruby-lsapi-5.6/ext/lsapi/lsapilib.onu�[���ELF>�@@=<

02/3.4-5���ff.����Ð��H�GH+F�Hc�AVI��H�@AUATL�$�USH��tQH��H��tIH��I��L9�r�0H��I9�v'�KH�SM��sH�;�Յ��[]A\A]A^��[D��]A\A]A^ø������ff.�f����=�D���Ð��OAWD�D�_AVAUATUSD�6�^�nA��x�j׋G3GD!�3G��V���\$�ЋW�^$��D�D1��\$�!�3WA��ʋN��F���p $E��‰L$�A1�A1�D��D�^!�D1�G��;�ν�D�\$�D�E��D�V���D�T$�A!�A1�E�E���|���A��
1�A�D!�E��1�D�D��*ƇG���D1�D�!�A��1�A1�D�D�N���D�L$�E��	F0�D��!�D�nA1�D1�D�G���F�E��D�f ���D�d$�D�^(A!�A1�E�E��ؘ�i��A��
1�A�D!�1�D�D����D��ʋ^0��D1�D�!�A��1�D�E���[��D����1��!�D1�D�D�N,��A1��D�L$�G����\�E��A!�D�f8A1�E�D��"�k��A��
1�A�D!�1�D�D�N4��E���q����D�D1�!�1�D�E���Cy�D����1��!�D1�D�D�V<���1��G��!�I!�1�D�D�D$��
�E��b%���1�!�1�D�D�D$��E��@�@���1�!�1�D�D�D$���	�E��QZ^&��1�!�1�D�E��6�Ƕ����1�!�1�D�D��]/։���1�!�1�D�E��SD���1�!�1�D�E��
��؉���	�1�!�1�D�D�D$��E��0����1�!�1�D�D�D$���E�����!��1�!�1�D�E���7É��1�!�1�D�D�D$��	�E���
��1�!�1�D�D�D$��A��0�ZEA��A1�A!�A1�A�A���㩉�A��A�D1�!�1��t$�D������D��1�!�A��
�ogD1����	�1�D!�F���L*�1�D�D$�Ή���1�A��A!���B9��A1�DD$�A��A�D1���D$�����q���D�D1�1�‹D$�����0"a�mD���1�G��8�1�Ɖ��1��1�D�D�D$��	E��D꾤���1�1�D�D�D$�A�����KA���A1�A��5`K��A1�AЉ�A��p���A��1�A�D1����D1�D�1��A��	�~�(D����	1�G���'���1�����1��1�D�D�D$�A���0��A���A1�A1�AЋT$�A����2���A�1�D1�֋T$��	��
9��ى�D�D1����1��D�����1�1��C���|�A��A1��A1�A��D$�A����0eV�ĉ�A�1�D1��A��D")��D�t$��	��D�	�D1��A��
��*CD������G���#���	�1����
���	�1�D�D��9��������Ή��	��1�D�D���Y[e��\$���	�1�D�E�������D�t$�����	щ�1���D�E��3}���D�\$�
���	�1�D�D�D$���E���]����	�1�D�E��O~�oA���A���D��	�1�D�E��
��,���D�T$�����	�A��1�A��D�E��6C���D�t$���
��A���N�	�1�A���~S�A��D�E��A����A	�A1�A��5�:�A�D��A��A�D	�1�Љ�3���*�\$���D�	�D1��D��F���ӆ�[��
��]A\�A]A^	�1������։�	�1�DƉ�A�4A_���OW�G�O�W��ATI��1�U��SH��dH�%(H��$�1�H��H���H�<$t)H��$�dH3%(u<H�Ġ[]A\�f.�H�{�1�H�މ�DŽ$�L�$$���DH�
H�A(H�Q8H9�s;8u�fD98tH��0H9�w�1�Å�tH�P0H;Q0v�H�Q0�Df�H�@$@@�@,�������DUHc�SH��H��H��H�@�H��t#H�SPH�H+S@H�C@H�H�SPH�CH1�H��[]ø������f�U1҉�1�S���H�����t��t/H��1�[]�fD��t��H���‰߾[1�]�f�����ff.�SH��dH�%(H��$�1�H�T$H�t$�D$�D$���Ã��tf�|$t'H��$�dH3%(��u0H�Ġ[�f�H�L$A���Ǿ���ff.�f��� ��Hc�H�vL��H�L9���H��H)�H����S�Nf.�E��������L�I؃�H��L�G�L�E�C�H�D�G��w�I9�thH��H)�H��~SH�pH�2H�pD�H�2H�pD�XH�2�pA��E�L�@��L�Ic�A���pD�Hc�L�M�L9��i��������[�f��0��u�H��[H�1�ø����Ë��u�H��H�1��f�AVAUE1�ATUH�-SH�}(t[D��]A\A]A^��EEA������!Lc�@���D��
 DI�E1�1�A���Mc�L���H��H���t]L��1�H���K�vH�](H��H�]0H�H�]8H�CH�H�H�CH��H�H��[D��]A\A]A^�H�=A����1����H���H���H+��Hcp�G )�H����H��xsH9�AVHN�AUATUI��SHwH��D�wH���L��H��D���I��H���u!��8u
���u�D��[]A\A]A^ÐH��~���[]A\A]A^ø�����fDUSH������tMH��������u��8u
���u�H��E����H��t�(H�H��t�@��H��[]�ff.�@AWAVAUATUSH���������t8A��A��I����A��f�I�7D�����Å�-���tx���u�D��D)�H����[]A\A]A^A_��A)�E��~ڋ��t�I��f�H��)�I���~�H�PHc�H9�v�HI�H)H�x��������t���s����E)�E��AO��r���1��k���S���t-�=��t+1�����u�[�8������1�[�@�9�[����ÐAVAUATUH��SH��H��PdH�%(H��$H1��H��
fDH��H��DB u�L�d$@��H��L����D$@Ƅ$?</tc<[����:L��f�E�H������|$@*H�X�zH�5L���A�ƅ��;�EM�����H�}�lf�uL���1�H��$HdH3%(�QH��P[]A\A]A^�D�
M�l$�]f�ML���H�����|$A*H�XA���1��;:�
��1�H�H���H�Í@�=����E��uf��1�f�]�Y���D�Ef�1�H�T$)D$H�L$L��D$H�)D$ )D$0H�D$���upL�d$H��A�T$I�t$�L����L��E1�M�������EA���<�����EE1�M���"����::A�D$M��fA�$�
���������������AUI��ATU��SH��(H��$�H��$�L��$�L��$���t@)�$�)�$�)�$�)�$�)�$�)�$�)�$)�$dH�%(H��$h1����t�=���ML�d$`L��@��@��u��������L9���H�H�;H�L$HL��H��$P�D$HH�D$PH��$p�D$L0H�D$X�H��$hdH3%(��H��([]A\A]�H�H��L�H�����L�¾d1���H�HÁ��K����-�H��H�ߺUA��L��dH�����1��H�H�XZL9�����H��H�M��1�L)�H��H�;����f�H��1�L�d$`H���H�t$H�����uI��������D$�L��L��P�D$PD�L$(1��Y^Hc�L��L����H�D$L��L���P�D$P�D$$P�D$0P�D$<P�D$H��P�D$TD��l1��H��0Hc�L�����ff.�@��AWAVAUATUSH��(dH�%(H�D$1�H�=�.�D$�H�l$L�5L�-L�%@�H������A�Dž����T$�Ѓ���<~$��M��L������D��ME�1��D;=t�D;=tUD�����H��H��t�H�H1����@�1@�Ɖ�@����H�H��t�(H���h�K���������9����H�5H�N0H�V(H9�s*D�A�H�A�E��t�DH��0�8��u.H��H9�r�H�F0H�D$dH3%(uH��([]A\A]A^A_�H�N0����D$�@�1�D$�X���H�H���D����C���ff.��AWAVAUATUH��SH��H��(�=dH�%(H��$1���t1����thH�C(I��I��D�3L+cI)�H�C D�{H)���D$�H��E��E��AT��H�5�AU1�U�L$,�H�� ����t)H��$dH3%(ulH��([]A\A]A^A_�@D�H�\$H���H�߹�AQL��XH��Z����t
1��fDH�=����DAWAVAUATUSH��L�I�Z(M�j0L9��H�|$E1�E1�E1�@��B��ve�CA�l$����A�BD)�A;B�E9r�
���~ H�SH�L$��H�H)�H9���fD�CA��f��A��H��0I9�w�A�R��D)���1�)ȃ��H��[]A\A]A^A_�fDH�C H�t$H)�IcBH9����C��i�gf��f����)���f9�u������Cf��~pH�5�1���;�	����tp�CA��L�A��f�C�5���fD�C��f�C�����A�������H�5�1���;�����u���8u��L�����H��E��E��D��[H�5]�A\1�A]A^A_�fDH�t$H����������@E1�E1�E1��z���f.���UH����S��H���H����H��I��[H�5�1�]�f����1���u1��=������Ð����D��H�=�@��ATUSH��dH�%(H��$�1�H���}H�H��H�1�HLJ	H�ى�H��H)����	���H�H�{`�I��H���0H�CxH�S`L�c`� L�H)�H�CxH�CpL�H)�H�CpI��$H�Ch�H�C8H�C(H����H I���H��H�C0H��(L�cxL�cpH����l��������twH�T$H�t$���D$����t
��8kt0�����1��kH��$�dH3%(uiH�Ġ[]A\�fD�+����C�����C�1����1���H�=��1��1�����_���fD�������ff.����S���t	1ۉ�[��H�5L��
���e�H�5>��
�T�������H�=1�����tI���H�=��H���c���H�5H���H���[É��D�����1��?������H�=���H�W(H�w`HLJ�H��HLJ0H���H�W�H�VH�W�H�W�H�W�H�W�H��)���81����H�����SH��H�H��t�H���H��t�H���H��t�H�{@H��t�1�[�fD��H��tG��wBL���Hc�A�T�4��t/Hc�A�pH���H�H€:t
�H���H���1��ff.�f���H��tP��tJSHc��H��;��}H�S�HH������[������~	Hc���и����[Ã����AWAVAUATUSH�Z�H�H��H�D$H���:�G�����H���%H����I��H���I�����I��I��L��fDA���)�Hc�H����L9�Hc�IO�IvI���
H��L���H��tML)�H��L��H�XH��H��A��I��A�$��D)��EH��[]A\A]A^A_��L��H��H��H��A���L�|$I���I)�A���M���?����D���L���L�Hc�H��~�A����-���H��1��|���������v���@��AVAUATUSH������I����H��H����H��H����H���H+��E1�H����H9�Hc��HO؋��)�H�H��~)H9�H�wH��HN�H�H��I���E��L�L)�H��t6�E�u@H��H��D���H���u4��8u
���u�M��t-M��[L��]A\A]A^��H��~�I�H�H)�u���I�������D��H�O(H�W8H��LJLS���H)ʍB����H�GpH�0H�pH�@H�wp��~Hc�H�HH�� H�P�H�O8H�Gp����AWAVAUATUSH��H���H�T$H����H��H�<$�I��H�=�������HcB$H���H�@H�,�H9�r�Zf.�H��H9�vGH�3L�����u�H�CH��[]A\A]A^A_�H�D$L9��I��M9���f.�1�H��[]A\A]A^A_��H�$1�L�=L���@A�l�4��tI�4�L�������H��H��u�H�D$HcP 1���~�H�$H��L���M�tM9�s�H���H�$I�D$H�D$@IcMIcmH,$L�|
L9��)���A�\$���)����H�8H�D$�'���-t	��_����H��H��I9�t�����H�U:�t������8����IcUIcEH$H€:����������H�$Hc�Hc�A�VH��H€:�������@��AVAUATUSL��$���H��H�$L9�u�H��dH�%(H��$@1�H����H��H����H���H����H��E1�L�
L��f�H���Hc�HcT�4��t7�qH��M���
H��Ic�A��H��L�E��H�TD�T�tH��H��u�H���HcP ����H���H��L�L9���Ic�I��H��L��f�H��H�� I9���HcHHc0A��H���LcPI��HcHH��B�D�BH�J�HH�2�JA��u��H�
� L����$DI��H�
Ic� L���E��taE1��@A��I�� E9�~CA�MI�UI��A�uI�}�Ӆ��H��$@dH3%(u6H��@[]A\A]A^��D����1���@Ic��U����������ff.����AWAVAUATUSH��XH�t$ H�T$dH�%(H��$H1�H����I��H����1�E1�L�-H��L�%H��H���Hc�HcT�4��t/�HH��A��A�t�I�<�H���L�D$A�ׅ��4H��H��u�H���D�t$<HcB ���L���H��L�H�D$0I9���H�\$(L�t$@fDH�D$(A�l$Ic$A�HTTPH������A�F_L�<H�D$��O�Hcʼnl$8I�H�D$I9���M�nI��I�o�I���_@��-t�H���A�E�L9�u�H�D$I�D�t$8L�D$�L��IcD$IcT$HT$���H�D$ A�L$�Ѕ�~"I��L9d$0�-���H�l$(H����B D$<H��$HdH3<%(u'H��X[]A\A]A^A_�DI�F�v�����������ff.���H��t7H��t2H���D�@$1�E����H���H��H��D�����������f.���H��t7H��t2H���D�@(1�E����H���H��H��D���S��������f.���H����H�O`H��tz����Ѓ�tr��L�G@������H�WPL9�vH�wpL)��L�H��H�V�H�wpHc�0H�T�H�Q�����,H��(LJ(LSH�1�H�Oxø�����f.���H����H�GpH+GxH�������G�����SH�������H�C(H9C8tH���H�SpH+Sx1�H����~J�
�����u$�{H�sx����9��~H�{�������ǃ�H�S`H�SxH�Sp[�f�H�G(H9G8�c���1�����l���LJ�H�W(H�W8H�W`H�WxH�Wpø�����f���AWAVAUATUSH��XH�t$dH�%(H�D$H1�H���.H�=���GI�������;��H�G(H9G8t
H�$�H�$H�D$L�|$L�d$H�$H�l$ I��H��L)�H����H��@�@L�|$0HO�L�d$ �D$LS�BL�jH�T$8I׋�D$D��H�D$(H�l$��uA�~H�4$D����H�I9�~�I�~��H��L)�H���L��H+D$��H�t$��H�L$HdH3%(uH��X[]A\A]A^A_�H��������@AWAVAUATUSH��H�$H��dH�%(H��$1�H��I��I���H��8�H��I��H�HD��A���AW�H��SA���1�AVL��AU��H�� H��=O�Hc�M��t7L���1�H��$dH3%(u&H��[]A\A]A^A_�������ff.�@AT�~f�A��UH��SH��dH�%(H��$1�H�|$H��)$H���H�H����xH��$dH3%(u?H��[]A\É�I��D��H�51��1�H�5H���i����������ff.�f�ATUSH��H�$H��H�$H��dH�%(H��$ 1�������?/H��H�����H���H���bH�ߋH����������!�%����t�¹�����D�H�WHD���@�H��H)��</��)�Hc�Hc�H�1�H���H���JL��$�H��L���H�����H�=L������������AH��1���Ń������uRH�=H9�t
H��t�H��1��H�H��$ dH34%(����H�� []A\�fD�����������@�����4�����
�+����H��H�51�������r����r���DH�߹����������S���fD������H��H�51������������H��tv�����t]S��H��tC�uWH�C(H9C8tH���H�CpH�H��H�H��H�@����H�Cp�H���1�[�@���뢸�����ff.���H��������u��u1��f�S��H��tR�ubH�C(H9C8tH���H�CpH�H��H�H��H�@����H�Cp�H�{�:����������1�[��1�H�O@H9OPv��닸��������AWAVAUATUSH��H����H���|���I�֨�,���aH��H�t$H����>��L�{8I��H�C0L)�H9��>L�t$L+{(L��A�@L��L�f�I��M)�M����K�H��@���σ��LSL�Cp�N���I�H�D���I�0H��I�@H�KpM��~H�C(M�xI�H E1�I�@H�C8H���L�1H��M�L�I�H��H�KpH9��e���H������thI��L��M)�M���U���I9�t
H������tDL+t$H��L��[]A\A]A^A_�DM��@�@M)��(����������I�������H�t$H��L���Hk8�f.���H�������������AVL��AUI��ATI��U��S���H���u\��H�߉���A�D$�{L��ǃLS����H��u0�{L��[L���]A\A]A^�������[H�����]A\A]A^�H���ff.���AWAVAUATUSH��H����H�������H����������D$����0��xI��H��I��H���Lc��\�CHc��T���
t��
u(��H�DLc���L�H����
t�
t�L�����~6Hc�A�T���
t��
u#��H�@��~A�L�H����
t�
t�E�<A�G=���I�|$PH�H�TI9T$Hs7H��I+t$@L������2%�)�)���������I�|$PL��H��Hc�A���Mt$PH��L��I�FI�D$PA�:I�|$P�M�D$PI�I�@I�D$PA�Ic�$0fE��T8H�Ѓ�A��$0�D$H��[]A\A]A^A_��D$������ff.����H���
H����B�=����������0���AUATUSHc�H��f��D�A��<
t<
uH���؅�u�H��[]A\A]�I��H�PH��H�DI9D$Hs3H��I+t$@L������2%�)�)��������tQI�|$PH��H��A���I\$PH�CI�D$P�Ic�$0fE��T8H�Ѓ�A��$0H��1�[]A\A]ø�����S������D��AUATA��UH��SH���?dH�%(H�D$1��D$f����f��
t1�����f����H�L$dH3%(����H��[]A\A]ÐA�1Ҿ��Ã��tʼnǺ�1��H�L$A��ߺ����u#D��H������uD�������o�����߻����D� H���D�e�O����A��k���DH�}A�n��}�N������H��t����������ff.����U��SH��dH�%(H��$�1�H��H�����u/��H���H��$�dH3%(uH�Ę[]����������@��1�H�=t������AUATA�'USH�����'DN�uD������H���@�A���H��H�H����H��tH�-����Ɖlj��U�D�k H�D�cE��u<�����D�����SuG�CH�,H�C�1�H��[]A\A]�@A�|$�C�{�˸�����ك�ÉS�ff.�@��H�H��t�8�ff.�f���H��BH�B(H�R8H9�s��H��0H9�w�H�H��t	���H�H��t	����fD��H�H�H;�wH��H�H;�����ff.�@��ATUSH��H�� dH�%(H�D$1�H�D�`�H�SX����H�kXH�-�H����H�H�H��tH�1�1���H�-�E��H�H��t��{1��F�����uH�H��tA�D9 ~����ut�;���u]H�LS�[H��H�$��D$��H��߉D$��1�H�L$dH3%(u)H�� []A\�D����������t�����H�SH���@H�Xt1��H�SXH�BH�B�{��C����1�[���AWAVAUATUSH��HH�H�|$H��$�L�edH�%(H��$81����H����L��DŽ$(H��$��H�H������cH����L��DŽ$(H��$��H�H������H�H�������H�H��
�����H�H�������H�D$1�E1�L�d$ �L�|$ǀ��D$H�H��t	H�=��1��I��L9�t71���������L���P���C��t�S�����D$fD�V�H��L��H�1���H�Hc;��;M��L��H�D$H�D$�����������?)ѺH��1�H	T� 1��Ń����������8��1�H�5��1ҿH�5�1ҿH�5�1ҿH�5�1ҿ
H�5�H��$8dH3%(���kH��H[]A\A]A^A_�fDH�H��udD�C�S�K�
D9���H�A�����H��tD��H�51�������M��� �������fDD�0D�CE��~�E��~����D�A��u���D$�t$9��/������������D�;�)��A��H�D$D�pA���uc��0���k������b���H�=D����j���f.�H�=���������H�=���������1�1����H�\$H�CX�����������=�f����=�D��H�H��t�x�ff.����H�H��t��x�x����H�H��t��~�x����H�H��t��~�x����H�H��t�x�ff.�����=�D����D�������D��AUATUH��H�=SH��8dH�%(H��$(1��H��tH��� �H�=��H�=�H���E1��
H�������H�=�H��t�
1�H����H�=�H��H��t�
1�H���I��A��WE1�H�=�H��t�
1�H����H�=�H��tH�Ǻ
1�����H�=�H�����H�=�H��tH�Ǻ
1����������H�=�H����1��
H������OH�=�H��tH�Ǻ
1�����H�=�H��tH�Ǻ
1�����H�=�H��tH�Ǻ
1�����H�=�H��tH�Ǻ
1�����H�=�H��t�H�=�H��t�
1�H�������_H�=�H��t�
1�H����D���E����H�=�H�����=��u	�P��5����H�=�H�����
1�H�����…�t������H�H�H����H�H����D�L�L�
L��C�
H��L���������t@H�ֹL����€���D	�t%H��tAH�H��t9�H��L���������u�H��fDH�JH��H�J�H��u�H�H��u�1ۉ�H��$(dH3%(��H��8[]A\A]�fD�H����D����<G�~A��<MED�A������s���D��H�H��_���������@H�=�H���������fDH�=�H����������fDA���f��@��#���f�����fD1�E��H������H��8�����H�=�H��H�H����H�5H���H��H��H�����-������H�5H���H�5H��I��H��H�5H���H�5H��H����~H�5H���H�H�=H���~A�ԅ��L���H�=�H�=�H��$���@H��H�$H�D$����DH��H��$���$�����t
�1҃8k�‰����H�=�H��t1��
H�����~�H�=�H��t1��
H�����~�H�=�H��H���iH�Ǻ�1�1���Ã����H�T$�ƿ�������D$(?���H�5���H�������H�H��t�xc�@d�x��@�D�
E���9���D�E���)����Z���f�H�=��H���K����]����
��u
�'��������'�������)���f��Յ�tbH�H���-�������DH��H�5�1�������������A��Hc��L�%H��H��a�����Å�t��=������u
��5����`���H��H�5�u���H��H�5�1�������H��H�5�F���ff.����AVI��AUE��ATI��UH��SH��t��4H��u!�(fDH��H���H��L����H�]H��u�M��tE��L���[1�]A\A]A^ÐIc�L��L�������H�#Eg����H�GH�H��ܺ�vT2H�G����AWAVA���AUI��ATUH�oSH��1�H���G�O�@�ƉWD���������W��?t;A�ĉ�D��H��H�|�@D)�A9�rhA��G�t4�L��L��H��L���9���A��?vWE�f�A��I��I��I�H�޺@H��H��@�H��L������L9�u�A��?D��L��H��H��[]A\A]A^A_�I�������ATL�fUH��S�FH�����?��L�H�z���?)ƒ�w=��t1������9�r�L��H������f�CAD$AD$ I�D$0��71�)��H�CH��L��H�CP�?����oH�{1�H��MH�H�CPH)��KX���H�[]A\�ff.�f�AWAVAUATUSH��dH�%(H��$�1�H��t^� �I���A�����f�Mcg I�oA�_@L��H����H���uM��8u
�=��uٽ����H��$�dH3%(����
H�Ĩ[]A\A]A^A_�f���~�A��A������u���I���ALJ�f�8LS�|�x�r�@t�P�Hf�@�H�P�X���N������	M�g���A;G �ZA���9�~u���E�o)�H�Hc�I��H��L��D���H���u$��8������5��u�����������A��M�gA���9��I�D$,H�D$Hc�I�I���D�hA�����h(A9��}A�� �/Hc�I���H�4@H���H���A���I���I����h$A9��}A�� ��Hc�I���H�4@H���H����A���I���I���H�l$�p(I���L��H�����������I���I���L��p$�������hM���Ic@���o9��gIcP���[9��SIcp���G9��?IcH���39��+I�H�H�H�H�I���H�T$I���Ic@ H)�I���H��H��I���H��H�H���I���H�I���IcHI���H�H��H�D$I9���E����1�D�L�4��t9�d�<B�9�ZH��H��u�IcP ���kI���H��H�H9�r*�RP9�!�P9�P9�H��H9��-�9�~�H�5�1��H�5�1�����>���f�H�� �H��� ���I�GA�G  I�������P�Hf�@	f�@
�H�H�P�P�H�H�P�P�H�H�P�P�H�H�P�P�H�H�P�Pf�@f�@f�@�H�H#�P�P �H �H'�P#�P$�H$�H+�P'�P(f�@f�@!f�@%�H(�P+f�@)I������1��
fDI���HcȋL�4��t#f�BI���H�T�4�
�rf�B@�2�JH��H��u�M���IcP ����I���H��H�H9������pH��@�p��p�H��H�@�p��p��H��H�@�p��p��H��H�@�p��p��H��H�@�p��p��H��H�@�p��p��H��H�@�p��p��H��H�@�p��H�H9�w�M���A�pI����b���Ic@I���H����0�ALJ���t`�
A������1������L��Hc��I��H������I�GA�o I����u���I���D�%D�-�B(A��A���1Ic�H�4II���L��I�
�9�H�qH�=����������I�J�D�B(�9�xH�qH�=���������XI�J���B(��$�A�D$I���KA�zH�L$�;M�bfoL�t$ L���AoL$AT$M�l$)�$��� L��L���H�L$�L��H���L��L���H��$�I�D$H��$�I3L$H1�H	���D�$$D�l$E����D��D�l$�H�=I��H��������I��D������M���H�=t"L��D��L����������������P�|$������E��t$A9u��H�t$�������D���������5���$A�?D�5���t�A�����H�5L���H��tH�����H�f�)�#���A��H�51��H��@�������H�5�1������L���H��������
1�H���I������H�5�1��H�5�1��D�%�D��D$�H�=I��H��tZE���W����7����E1�1�1�1�����������H�=����H�5�1������E��|$������M���2����;�����|$������E������1�H�5L���u������I�}��������1�H�5L���K�����fD�=������-�E���D$A���I���F������H�5�1��������H���H)���H�5�H��1������1�H�5L�����������
����1�H�5L�������A�#��L��H�
H�����1�H�5L���a����ff.����AVAUATUSH��dH�%(H��$�1��D$H���H�������	�;1�L�l$L�d$L�t$H�k�l���������{�ul�;�����L��L���D$���C�����H�H��t�@��H�H��t��{1�����f�|$���=u|H���4��tH��舴��H�������d���1�H��$�dH3%(u}H�Ġ[]A\A]A^�D����������������������{�H�5�H���f����ы{L���A���;����ff.���AWAVAUATUSH���D�=dH�%(H��$�1�E���xH���H�-H�����}����;�DH�-H��t1��H�ED�E���H��$L�|$PD�cA����:E1�A�f�D�
E����D�E��tH�H��t
�@f����L��H��1���H�Ic��D��H�D$PH�D$X����A���?)ѺH��H	��D9#��1�1�A�|$M��H��D9#������H�H��t
�@D9#��A��D9���1�葳��������f������H��$�dH34%(���'	H���[]A\A]A^A_��K���L��$�H�����DŽ$hM�l$H��$�L���H��$L��H��H�D$@����AH����L��DŽ$hH��$��H��$�L��H��H�D$0����PH��$�L��H��H�D$8����+H��$`L��
H��H�D$(����H��$ L��H��H�D$H�A�Dž���H�D$PE1�L�l$`H�D$H��$�H�D$H��$`H�D$f�D�%E����H�H��t	H�=��1��I��L9�t<1��ձ������L���5����E���D�uE���M��E1���V�H��L��H�1���H�Hc}��}L�D$L��H�D$PH�D$X�����������?)ѺH��1�H	T�`1��������������8�����H�t$(1ҿ
�������x������=�����������_����5��tH�H��t
�@f���,���D9#�
D������C�����H�H��t�@��H�H��t�D�c1�D���N����
�����=�����{�H�5�H����������H�H��t�*H�H�������B���(���@H�H��t�@��H�H����������@��8�B����-���DA��D9�����M�����=���������������=�����H��
H��t��D��H�H��t�
�A9����������H�H��tD��҉T$$D�E~:E��~5����T$$A���A������A��u������D�E�U�M�
D9�vH�A�����H��tD�H�5�1�����������D$��0������������H�=��T$���fD�}蠩���C�����1��m���H�|$I���H�|$��H�T$H�t$1�����6���������1�EM��tA�M�gM�g�{E1���C����H�t$1ҿ��������H�=����f��;�������>���fD�D$$��0���d������T$$�W���H�=�T$��T$����fDD�#A�����������fD����R���D�E���B���H�H���2����9�����{�H�5�H�{�w������H�=�����H�=�0�M������A����H������…��
H�{����H�������������H�=�����������H�t$1ҿ�����H����L�=�H��H�H��tH�1�1���L�=A�G��H�H��t��{1�蝦��D�-E��uH�H��t!�E�9~�������;���t������H�t$@1ҿL��$��H�t$01ҿ�H�t$H1ҿ�H�t$81ҿ�H�t$(1ҿ
��kH�LSH��$����$���L��$�������H�=�������%�����������,���H�=��Q���H�H��t*f�C1��C�D$�C���C��T$H�C(H�C �����fD���=��ff.�@��H�������,����LSLSLSLS����������������GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONS
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: annobinGA*GOW*�GA*GA+stack_clashGA*cf_protection
GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignAnonymous mmap() failedlocalhost%02d:%02d:%02d [%s] [UID:%d][%d] %.*syesnosystem()%s, errno: %d (%s)
/dev/nulllibpthread.sopthread_atforkHTTP_[UID:%d][%d] %s:%s: %s
LSAPI: jail() failure./etc/Can't set signalsaccept() failedLSAPI_STDERR_LOGPHP_LSAPI_MAX_REQUESTSLSAPI_MAX_REQSLSAPI_KEEP_LISTENLSAPI_AVOID_FORKLSAPI_ACCEPT_NOTIFYLSAPI_SLOW_REQ_MSECSLSAPI_ALLOW_CORE_DUMPLSAPI_MAX_IDLEPHP_LSAPI_CHILDRENLSAPI_CHILDRENLSAPI_EXTRA_CHILDRENLSAPI_MAX_IDLE_CHILDRENLSAPI_PGRP_MAX_IDLELSAPI_MAX_PROCESS_TIMELSAPI_PPID_NO_CHECKLSAPI_MAX_BUSY_WORKERLSAPI_DUMP_DEBUG_INFOnobodyLSAPI_DEFAULT_UIDLSAPI_DEFAULT_GIDLSAPI_SECRETLSAPI_LVE_ENABLELVE_ENABLEliblve.so.0lve_is_availablelve_instance_initlve_destroylve_enterlve_leavejailLSAPI_PHP_LSAPI_PHPRC=packetLen < 0
packetLen > %d
Bad request header - ERROR#1
ParseRequest error
SUEXEC_AUTHSUEXEC_UGIDLSAPI: setgid()LSAPI: initgroups()LSAPI: setgroups()LSAPI: setuid()Bad request header - ERROR#2
lsapi_accept() errorPragma: no-cacheRetry-After: 60Content-Type: text/htmlDEBUGINFONOTICEWARNERRORCRITFATALAcceptAccept-CharsetAccept-EncodingAccept-LanguageAuthorizationConnectionContent-TypeContent-LengthCookieCookie2HostPragmaRefererUser-AgentCache-ControlIf-Modified-SinceIf-MatchIf-None-MatchIf-RangeIf-Unmodified-SinceKeep-AliveRangeX-Forwarded-ForViaTransfer-EncodingHTTP_ACCEPTHTTP_ACCEPT_CHARSETHTTP_ACCEPT_ENCODINGHTTP_ACCEPT_LANGUAGEHTTP_AUTHORIZATIONHTTP_CONNECTIONCONTENT_TYPECONTENT_LENGTHHTTP_COOKIEHTTP_COOKIE2HTTP_HOSTHTTP_PRAGMAHTTP_REFERERHTTP_USER_AGENTHTTP_CACHE_CONTROLHTTP_IF_MODIFIED_SINCEHTTP_IF_MATCHHTTP_IF_NONE_MATCHHTTP_IF_RANGEHTTP_IF_UNMODIFIED_SINCEHTTP_KEEP_ALIVEHTTP_RANGEHTTP_X_FORWARDED_FORHTTP_VIAHTTP_TRANSFER_ENCODING%04d-%02d-%02d %02d:%02d:%02d.%06d Child process with pid: %d was killed by signal: %d, core dumped: %s
Possible runaway process, UID: %d, PPID: %d, PID: %d, reqCount: %d, process time: %ld, checkpoint time: %ld, start time: %ld
gdb --batch -ex "attach %d" -ex "set height 0" -ex "bt" >&2;PATH=$PATH:/usr/sbin lsof -p %d >&2Force killing runaway process PID: %d with SIGKILL
Killing runaway process PID: %d with SIGTERM
Children tracking is wrong: Cur Children: %d, count: %d, idle: %d, dying: %d
LSAPI: LVE jail(%d) result: %d, error: %s !
Invalid custom stderr log pathFailed to open custom stderr logCan't set signal handler for SIGCHILDReached max children process limit: %d, extra: %d, current: %d, busy: %d, please increase LSAPI_CHILDREN.
LSAPI: failed to open secret file: %s!
LSAPI: failed to check state of file: %s!
LSAPI: file permission check failure: %s
LSAPI: failed to read secret from secret file: %s
LSAPI: Unable to initialize LVERequest header does match total size, total: %d, real: %ld
LSAPI: missing SUEXEC_UGID env, use default user!
LSAPI: SUEXEC_AUTH authentication failed, use default user!
LSAPI: lve_enter() failure, reached resource limit.prctl: Failed to set dumpable, core dump may not be available!sigprocmask(SIG_BLOCK) to block SIGCHLDsigprocmask( SIG_SETMASK ) to restore SIGMASK in childfork() failed, please increase process limitsigprocmask( SIG_SETMASK ) to restore SIGMASKCache-Control: private, no-cache, no-store, must-revalidate, max-age=0PID<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>508 Resource Limit Is Reached</TITLE>
</HEAD><BODY>
<H1>Resource Limit Is Reached</H1>
The website is temporarily unable to service your request as it exceeded resource limit.
Please try again later.
<HR>
</BODY></HTML>






	


�^�d/4-////%-/Ga'9(�_intG�)@/G��G�@�@�G�@�G���������G����`<E�������!��<|/4�G��@B@+/000000 0@0��4<�G
8�"	S-p"�.$0
�5
�=�>�@
�A
� C	�$E
�(J
�0NL8PX@[+H\+X]+hj$xp4G-	-�	N�1�	ooGGXa�&�&	E�18�:	;�1?A
�B
�C�1GOI	J�K�1 O�Q	R�S
�TU1a�c
Ed
EC^�&e�&g�1 Y[E]ah
�1l5n�o
�1tfvEw
�x@Cp3�&5�&<�&D�b_rtL&VO&i�&p&y5��G1�$	+&	�(	�*	�0	�{	f|�HCIRT �Cv&"7&$	�R� � � E+v"��&T.1	��4��c�	�G@4�H�H�//�-Gldy"m
-91�1�;	�C�m�GFy�<�d(�e���GfI@I@IEIE"�1�	3�6	|7	|8	|9	| :	|(;	|0<	|8=	|@@	|HA	|PB	|XD�	`F�	hH�pI�tJ�xM9�NN�O�	�Q�	�Y
��[�	�\�	�]�	�^	E�_
�`��b�	�g+J�	��	G�	J�	J�	�
G4�'�
�	<
'�
'�
' �	T
h4I
' T
X@!�
	

!�!"!�!��
!��
""F"E"#!�X@$�
i0%9"#��#��#�
�4���G
"&4&6	�&7	��<|"0'1�'3	|'4	|'6�'7�'8	|'9	| ':	|(jtm8(,
(	�(
�(�(�(
�(�(�(�(� (�((0|<
G')�,
')��')��')�,
')��')��H*!B@,H�	

 !"#$%&'()*+,-./0123456789:;<<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������'-$|'-2�'-7�'-;�.U.m.�4�/�"/*/!B@/)�!)./23\^bgl�����00/{�C/�&/�
&/�-&/�=�-G�=G�MG"/�h/�	�4M'/�h'/�h"/��/��/��/�/��-�GK/,/�/�/�/M/�K005�07�08�09�0:�0;
F0<�0=	| 0>�(�,"n1�1�1 
���GkB@2,�	

C2q�&2s9&2t"2k2m
�2n
�2o
�2p
�2u�",2��2� �2�
92�
92�
92�
92�
92�
92�
9 2�
9$2�
9("�2��2��2�
�4��G9�G"2�2�
92�
92�
92�
9"2�G2�
92�
9"2�o2�"�2�"/"
/�
1|
2|
3�
4�k	
:�
<�
=�
?�
@�
B|
C� 
E|(
F|0
G|8
I|@
J|H
K|P
L!VX
O�`
P�h
Q�p
R�x
T'\�
V'b�
W'h�
X'h�
Y'��
Z'��
\'n�
]'t�
_|�
`|�
a|�
b|�
c|�
d��
e��
f�
g�
h��
i��L
k'zL
m'G(L
n'�8L
oE	"0pVr
�s
�uhv�w�x�z�{� |�(��v����Ga�=G�
q�'
s�
w��9��  �  � EM
X��9� �    $�EM
x7=RH H�"XO�YbufP=Q�YinR���G-�G?]!NB@j�~���	���	��	��	��	��	��	��	��	��	��	��	9� � � ��	��
H	�
H	�
H	��	�|	��	��	�	�	��	l��	�"G�	�*	^G�N	��G�t	�N	�t	�G��	M>CQ�	�L	�L	�@	�	J� 	l E	m�� 	� 9��  � � 	� 	� 9�#! �  � 9 9 #!�	@!	!9�Z! �  #!	
g!F!9��! �! |'�!	m!�
�		�
�	�
��
�	�#�	�#�	�*"G&%"	K ��"�������
�	K@�
V#�
	��
	��
	��
	��
	��
	��
	��
	��
	� �
�(�
�0�
�8M�
�"�
z#	V#
@	�	�	
�	
#�	
-�	
�	
�	H�!���x$2cnt�!�U����$2pid�'�U�	�:�
Y�O%2buf�'#!U#in�<O%a��b��c��d���(d��y'd#y'#ctxdH'f@pgy'`�w	&��}�q�`�|	d&��}�q�
`�	�&��}�q��T0
����&������
`��@'��}�q��$^'UuT|�$UuT|-N(3���)#ctx3/'#buf3I�)#len3W@t5�;�(pCy'S��G
?($��$��$��
��J	�(��������U|����v"T�TQ�$U}Tv
��S	*)��������UvTs@Q@
��\z)������n���$UuTv4($(��)2ctx$-'U7
�)!buf(y'
6@t�����5+�*5+�4��H;+�'�2�
v���*������*Us�[�*U|Tszq+U|�jU|T~Q} $ &�ok�	��9#fpk,�pmchn
�no	�p	�5,��
��}�U4Tw��
T,��T0Q:
���
�,��T0Q:����,��UsT0Q:���5-��T0Q:���
�-��T0Q:���
�-��T0Q:���.��T0Q:���
i.��T0Q:���
�.��T0Q:���
/��T0Q:���
P/��T0Q:����/��T0Q:���!�/��T0Q:
�:�B3�:�:N�:%3�:����0��T0Q:���0��T0Q:
#�25B��}NH�M}1e�Y�'�UvT0Q
��S
�14�'�3�U1TsQ��}ʊg
T2��ۊ@�UsT	Q@L�l2Us���2UL��2Us��UT	QvY��2U	Y�	3U	Y�U	f�U	
�{�	�5�{Ռ��3��T0Q:
z�	�4>�>74�r��"4Ts�Us��]4U	T
���4UsT	��
[��5m���4UsT	��5UsT	��,5UsT	��Q5UsT	��v5UsT	���5U	��ʳY��5U	Y�U	;��W6%�;O";#;Y�2x�6k�%2w���~����}׳�6U2T��~Qw�Y�7U	�9Y�,7U	Y�K7U	Y�j7U	Y��7U	Y��7U	�;Y��7U	Y��7U	�<ytY�,8U	Y�K8U	G<Y�w8U	�;Y��8U	�;Y��8U	<Y��8U	Q;Y�'9U	Y�F9U	�^9Us�<Y��9U	Y��9U	Q;{X�9TvQ
| $0.�MX�]�":!p],	_
":�3:=G�E�`:
E-	G	�%��:!p%)
%2|
%=�	'
�:len(	�end)|��:=G��;i�	�pw��!)p�7�
2;env�!)del�!D���T��D���(���;*�$�U(���;*�*�U(��<*�'�U(��G<*�&�U(��v<*�$�U(���<*�"�U(���<*��U(��	=���
��
��H�
-5+fd�
�ret�
��
��
���~�
E��t;�=	
�	
�5
>__d
���U| $ &585>8!�
�O�
�E�O�O�O�O��wP��yP��z%P��{2P��|?P��~LPYPfPsP�P�P�P��t�P��t�P��u�P��vN�P<?�P�P>�P	p?�P��>QT�?Q��?U
���
y��@y!y��
��9C@��������7�@�����*�UvT|Q@�T7��@U}C�
AUAT|Q��t7�"AU}C�GAU?T|Q��tC�lAU2T|Q��tC��AU:T|Q��tC��AU3T|Q��t3�AU	O��AU0��KQ
BU|[�%BUV3KBT}Q0R0X��t�C�|BU:T��tQ0���BUT	��BU��[W�V�BUu7��BU��th�CU��tTAt�DCU0T��tQ��t��L�t��CU2T��tQ���CU	���CU	���CU	��DU	��8DU	��t�iDU2T��tQ0���3�DU0T0Q	���DT0L�C��DUAT��tQ0C�EU?T��tQ0C�8EU3T��tQ0C�\EU2T��tQ0C��EU:T��tQ0���EU	Q��U	
?yj"�FQy-?y+Qy+�y	#/�y+�y#�y�y*�T	Q8ly�

9G~y+�y�y�y*�T	Q8zqQGUsO�hGU03�GU|TvQ0R0X��[W�GU|���GU|T0�Q��HU	L���GHUs?Ãs�x_HUs��HUs?Ãsqp�HUsO��HU0�M
���MM
.5+O
4P
4Q
���}R
E��}S
�retT
�V
z#EactX
���~;�I	�
	�	�
	�5�I__d�
	���;1J�
��#JU
���T7�VJU|C��JUATvQ	7��JU|C��JU?TvQ	C��JU2TvQ	C�KU:TvQ	C�@KU3TvQ	3[KU	O�rKU0��KQ�KU}[��KUV3�KT|Q0R0X�C�	LUAT	Q0C�2LU?T	Q0C�[LU3T	Q0C��LU2T	Q0C��LU:T	Q0���LUT	��LU��[W��)MU	��HMU	��gMU	�VMUu�>
�@�N>
+5+5NC
4O�U0L�
�p��O
*5+
	�
y6
GOy!y�@
��7�N����
��9O�������*�UsTwQ@�����3�OU0T0Q	���OT0L�Q�:�Q
:@z#
;95+act=�	=�	=%�	=/�	>�	>�	?�	@�retA�pidB�	C4	D4	E�	FE	H�	I�F�P	�	�	�	�FQ__d�	�)	��D/�1�T+�:�
6��R�,��	��	��	��	�������%RUT	��<RT9��dRUT	��{RT?�Z���RUT	�RUsT��:�
+��T�3��A��
�T��wi�)�	�S����z���UsT
Q1R
X	���ST0��r���TUT	R��w�X~Y����=TUs˴TTU0��sTU	���T=G�6�����U�|�	��	�`�
�cU��}�q��UsT}Q|ش�UU}T|Q3R!X	�Y}����U	7C
:V
C!�	E	�pidE�	F
�	G
�	H�)	T�	V(.Z��V4�5�6�k�,W2pid4�U��+`�!��}�q�:
�[W*�U6�
���=X�
�fd�
��
���~Elen�
F��~�
=X��~�XU�UT��~Q��~�/XUsT6Q1R��~X4��MXG(�
�{X2fd�
�U8�
��X
�
$�!fp�
>�
�
F��
�l�Y�
*�
5��

=X��~ret�
	�pfd�
	�YSYU�UTsZqYUsTv�88
�Z
8
'
8
@�	:

Zp;
|	<
|res=
�	=
,	>

�	?
	��ZG�
�-��[
6�[
G�ret

	�fd
	�
	��D
	����ZT1Q0��ZUsT2Q1�[UsT1Q2R�DX4�?[UsTvQ} �][UsT|�L�,��[Uv��8�	��[
�	/5+
�	B!len�	L�F�[ch�	�)	�	
��	���^�	05+�	C�	,�		��	�len�	�;�\ch�	�;�\ch�	�57]�	
��U|
���	x]��������T�TQ~
���	�]��������T}Qv��]Uv�U}�	���t^*�	25+U-���	�����	�F��^�	05+#fn�	!�#arg�	,E@p_Q�TR�Qt	�F�p_t	)5+#fnu	!�#argu	,E@p_Q�TR�Q6a	�s�`a	6h#nb	�#fnb	(�#argb	3Ed	#hrete		�qX}	���b	,5+#fn	!�#arg	,Ei 		�len!		�"	|ret#		�$		�;Zb7	Z��}p8	|9	|:	|;	�<	&t<	-t5(�achK	�%O	�F�a__cO	�9�
̋F	
1b���݋r��}U~T��}�#X��|3�bUv3$|"T	v2$}"�X��|���$�_d�/5+#fn�!�#arg�,Ei�	�len�	��|ret�	��	��_d���~5��c�|���&t�-tE�dUwQ R	E�=dUwT| $ &Q R	3QdXv�A"pd=G���
��d2v1�'�U2v2�7�T�|�'f�(5+�;�#h	�#h['f�f$Ff$9fSf^fNkf�elfwf�f�f�f�fU�f�fU�f�f9�R�U|Ts3$"R�U|q|�f
q-5+
q@is	�	t|)p�	�|	�|	��	�&t	�-t)ch��)	��)__c��8<	-�g
</5+
<B!len<O	> �	?p@	A
-	B
-retC	�iovD�g	E��gG����h$5+ret	�n	�
��.ph6�$)���C�P�]�q�Ts��h�hUs���hUs?Ãs^(�i�Ni*�'5+U�"\�	�-���Ä�����	-���j�+5+�5�#off�B�j�N�"\
���j�����g5jUs*�RjT~Q8Z^�yjT�TQ�QR�R^8	- k
(5+
;!lenH	"\	 p!	"
-	#
-	$
-	%	��	-��l�.5+�;|�Hlen�
-�
��	l��$������UvQ|-o�	��������ʊ��l��ۊ@�U~TvQs���l��n�-5+�:|�G�THlen�
-�
-�|�|�|p�|
���	>n��������#nTQs��TQsmo��no%�o�o��U~j�UT:Qs��]�mo�-5++mo�o%�o�o��Us���o
�.5+	�len�
-�|S�p*�+5+U�5�off�	�y�J�qpy&5+��������(nY��pn%5+-`�t��}�$q�K���zqK*5+�h-qUs�gEqUs��eqUs?Ãs^Us-���r-%5+�h�qUs�g�qUsqp�qUs^����Ft�%5+�=X��~Elen�F��~����~
?yPsQy-?y+Qy+�y /�y+�y	 �y�y*�T	Q8zqhsUs��sT0��sT|Q}���sT0�x�sUs���sUv?ÃsqptUs��8tT6Q1R~X4���
�yt*�(5+U����t@FtU	����%w�(5+#fd�2��	�
`��Tu��}�$q�
���
�u������v�T
Y�'�
>vk�%'w���~����~׳/vUvT��~Q��~�
H���ve�Y�'�U	T2ʳ�vU
 ��vUsT
���vUvT1��wU0��wT0�(��Sw2cb�;*UD���T�������x�E��ۄ�wU=T	ۄxU:T	��;xUIT1��WxU2T1�t{xU	T0�����xU	T1��T	A�y
A%5+lenC	�	D	�4�/y!fd4)�	6
/y�?yG+�^y!fd+,�s ���y!fd5�	��y!fd	7���y!fd.�!pktN\��*z
�*5+
�4�	�	�	�|	�|��Wz
�65+	�D��z
D.5+uidF	�gidG	�	H	I	J#h	K#hiL	�1�>{
1.5+
2|!len2�
2+|
26�	4�	5>{-N{G���{
�'5+!uid�3L!gid�>@
�Prv�	�pw��!���{	�6�����|�+5+#uid�7L#pw�L�!ret�	���T��w3o|U�QTs���|UT	Q|Xs�}�|UvT	Q0���$}
�,5+!uid�8L)	��ret�
���r}
�-5+�r}	��}	�}G��}=G#4�}6{���{,5+{?{R}
":��_n~	�
i�~
�~����$z���UvT
Q1R
X	����r��f�~U|Tv*��~U2�Dr��J�[
J%stLSfdM	�)�zrc+	���)uid����
�-5+	�	�i�	�)	�&t	�-t7�
O�
�35+i�	�F2�b��p�|)	�&t	�-t7�v�
�/5+p�b7���
�)Hp�|b��6t��Y�t4htB�*u!Qu#|w#hx
�x�h���!fdh�	j=XlenkFR�ف
R<ف
SH
S+�	U#hh>��
>>\
>L�)bF�62�G���235+2=�p4|v�Tv$�Ă
$+5+!n$5�p&����
05+
:�	|��i�!fd��
�2i�
�<�
�G�ret�	�	�	�n�	���-��!fd�'�
�2E!len�?ret�
-7�
у
�35+����!fd��ret�	�6�
�U���#fd�#��+�val�	����UsT3Q0@�U�UT47wф
wJ\
x&�!lenx0�tR
:A
����A�A2�EsaC���~C�W�UvT0Qs7�o�UsC���UvTsQ0�:8
�υ2sig8!�U:3
���2sig3 �Uu�(7��� .���m�Us@��UT	Q�UR�Tv���v�w��xfmt�'PVbuf�
�T��vyp�|z�	�Eap

��u5���Vtv�E��uVtm����u{i��և����z���U|T
Q1R
X	\i�/�X�����z���U|T
Q1R
X	õu�UsT0ϵUsT��u
��+���۵T1Q}R��u\i�-�������z���UsTdQ1R	�X	Yv�3$"
i�������z���UsTdQ1R	�X	
>�	[�[�O��T1Q	X|r��W
����
�:5+
�D�.�|ʊ�|�."-�"�"E"%.k|6�k�kk.\|`�\�\.>E��>E>�>.'E̋'E'�'.E�G�.��8�� 
��18��.d�i�d 
d<P.A���]__sA�]__nAAP.%|Ռ%%�|sz'
8n���
n8i��
i8	��B�
	��
	�B�S.)�s�))�PW1���1�W"m��"m,mo����o�o�o-o����������ʊ�����ۊ@�U~TvQ|�,��a�q�$ÃSу �G�$�% �L�8�Us�+���
$Ã,�������)�6�C�P�]����UvQ|�,��O�t�
��O����f�T0��,YY����Y�Y�Y��}�Y�Y�Y��}�Y��}�Y�Y�G
g�)�����U|TsQ�
�N
	ʑ)�����UvT|Ql
���
���UsT0Q:
`��
	T���}�q�
̋�
	�����݋
�Uv
6�\

�S�G��)��U|T:5�1�U|T	)�O�U}T]A�z�U}T0Q��}R��}N���U|[���U}�,�U����U�U�UQ�UQVV[�UC
ה$�U�U���U�UVVNV��V+V��UT|Qg���U	�TvQ3�VUu�,�fl�E��fggg,g9gDgQg^gkgxg�f�<	�gg�f%�g��,g9gDgQg^gkg��xg��
��e��6�)���C�P�]�q�TwQ2R}
��Z	�Ä�����g��U~��U~?Ã~*�7�U2T��~�,�9=���	::�п
`:b	���:}:r:�:��_�:�:
��,
2�����s�UwT
��9	������%Ɍ�UsT|Q
��јTvQ0���
3:g6�E:R:H�G��e�Y�'�UsT
AQ
�������Us��ڙUvT2L��Uv���U2T1�}U0T	Qs�9 ]��	:% :�}U0T	Q�U�,�j�����j�j�j�j�j�j�j�jkQk
�j	���j�j�j�j�j�j�j�jkk
��S	�$Ä������?	c���������UT��Qv�g{�Us�gUs^,�[��[�[�[}�[�	�[$�[$�[>�[,��[>�[3g��[�U|-���	��������TvQs,Y�8��Y�Y�Y�Y�Y�Y�YQ�Y�Y@t�U�UT�T,{X!�#��X�X�X-{X�
�X�X�X��՞U@T1�����[��UU��,�x����x�x�x
o�O/���������ʊ
� ���ۊ@�UsTvQ|�
�xAh��x�x�x߁1V۠���O��o�@iš������%8��ʊ�����ۊ@�U}T|Qv�
�yn
���y�yzz��~z��A�
�������%Aˁ+��5R������%5ˁv�Tv $ &33$��A�
��������%Aˁ+��5R������%5ˁv�Tv $ &33$
��	w����O�D��O���	X�]�%�j�
v���������
v��[�������
v����������
v���������
v��6�������
v���������
v��Ȧ������
v���������-v��������S��	K�$�%�>�#)��&�+v��
��%����O2��3�@�
v��
��������
v��
ڨ$������
v��
�$������-v��
$������*z1�	ԩ<z%1Iz�o��UT7��T0Q:���QqR|��
�R|��2�UT	��Z�UT	��UT	QsĂ+d��ւ%+�v�U|Tv $ &
Wzx��izvz�z�z�z�z�z�z
�zj¬�z{	{�z�z#{��~0{��
��9E��������)]�U~�'��U~T|Q �'��U~T��~Q8U%U}T~
N{�
2��{z{m{`{�{�{
�|�
M�$�|�|U}}��~}$}!�
��6}%!�)UT
�Q	R	X
#3%�T|Q	�R	�Xv�}UT	Q0ф-,	��Ƕ��U4Q0R0X0��U	ӶήU|�{�UT|Q}߶��U1T��~��5�U|ӶM�U|߶߶�}��UT	Q0��}ȯUT	Q0Ӷ�Uv�}
�UT	Q0�}UT	Q0L��dd�UT	�9����UT	��UT	`�z	���}�q�
?y��Qy-?y	+Qy+�y&/�y+�y
&�y�y*�T	Q8���UT	��;�UT	��UT	Q
��Ă/I޲�ւ%/�v�T
 �AA3�4E�	�*aw't*�*�585@5R

3
6�7%
~8*�9D*t*n��)K*k��*�*�*wpA
f
:96�6�6f
�6p6�*9+S;
3�;!3[%dupdup***�X3�&D)�]Z<4AA��::+O#3�=t0�0�
>"?o�363�A*��@'n*�A�*�A����B1�B(��1
:;9I841�B��1��1	4:;9I
1R�BUXYW:;9I�B4:;9I�B
:;9II:;9I4:;9I1R�BXYW.?<n:;94:;9I4:;9I�BI41U.:;9'I :;9I!I/.?:;9'I@�B4:;9I41
:;9I8.?<n:;9 I!:;9I":;9#:;9I�B$1%&
:;9I'4:;9I?<(.?:;9'@�B)*:;9I+1R�BXYW,.1@�B-1R�BUXYW..?:;9'I 4/$>0(1:;92:;9I3��4&I56.:;9'I@�B7.:;9' 8.?:;9'I 9'I:.:;9'@�B;U<7I=!I/>1?��1�B@���B1A.?<n:;B>I:;9C:;9D.?:;9'I@�BE4:;9IFG5IH4:;9I?<I
:;I8J<K:;9L
:;9I8M:;9IN1UO1PQ41R'S1XYWT.?:;9'@�BU1UV4:;9IW.:;9'I X>I:;9Y
:;9I8Z���B1[1UXYW\1R�BXYW]:;9I^%_$>`a:;9b
:;9Ic'd&eIf:;g:;9h!i(j:;9k:;9l4G:;9m'In���B1o.?:;9'I@�Bp4:;9I
q��r���Bs.:;9'I t.:;9' u.:;9I v.?:;9'@�Bw:;9I�Bx:;9I�By4:;9I�Bz4:;9I�B{1R�BUXYW|4:;9I}1UXYW~.?<n.?<n:;9�6ddqd	��T�)�T���u��P�P�P(�P�PsP��P�KP[�P�"R+�R��R�JQ^�Q�5Q5<v �<�Q��{ ���P�Tt ���_��X
~X��X�[Ti�T�2TA�X��X[P[aQx�T�4T@�P�P{P{t ���X��R��r �t;# $��������%!r"�p;# $��������%!r"���u�?[g�R�SRb�R�HRQ�R�R {R��TKTi�Q�X%vXvzr ���TiT��T��Q��q ��R��u.�Q�2QH�Q�+Q4�Q��QoQ��Q�;QQ�X��PiR~�R��v ��FRFW{ �_�R��z ��QK$KU$K�KV�K�K�U�KIKTIK�KS�K�K|h��K�K�T�K.KP.KPKQpKuKQuK}K?p� K$KQ$KLKUpK}KU3KFK	q�����3KFK0�3KFKUQKpK8�QKpK0�QKpK\pKyK7p�����yK}KQpK~K0�pK}KU�K�K@��K�KU�K�KS�K�KV�K�KX��K�K0��K�KS�K�K|h�JlJUlJ�J]�J�JU�J�J]�J�J�U��J�JUJ0JT0J�JS�J�JT�J�J�T��J�JS�J�JT�J�Js@��J�JS�J�JSJJQJ�J^�J�JQ�J�J�Q��J�J^�J�J^7JTJPWJZJp?�ZJaJPaJtJ\tJ�JP�J�J_lJ�JU�J�J|����v"�|J�J_|J�JS�J�JT�J�J�T�|J�JU�J�J|����v"��J�J@��J�JS�J�JT�J�Js@��J�J}��J�J	~������J�JQ�J�J\�J�Ju�`I�IU�I�I\�I�I�U��I�I\`I�IT�I�I�T�`I�IQ�I�IV�I�Ivx��I�IV�I�IV`I�IR�I�I^�I�I�R��I�I^`I�IX�I�I]�I�I�X��I�I]dI�ITdI�IUP@c@Uc@CVCrD�U�rDEVE.E�U�.EeEVeElF�U�lF;GV;GTI�U��@�@P�@�@P�@�@P�@APA0AS0ACAPVAiAP}A�AP�A�AP�A�AP�ABP$B7BPKB^BPrB�BP�B�BP�B�BPrD�DS�D�DP�DEPEEPEESlF�FP�D�Dsp"1�D�DP�@�@P�@�@PjApAP�A�AP�A�A0��A�AP�B�BP�D�DP�D�D0�.E4EP:EQEP~@A0�A!AP$A�C\rD�DP�D�D\�D�D0��D�D\�DE0�E�E\lF�F\�F�F0��F�H\�H@I\EITI\�@�@P�@�@PAAPAAS5ACAP[AiAP�A�AP�A�APBBP)B7BPPB^BPwB�BP�B�BP�B�BP�FGP"G,GP'CQCPE#EP HQHP�F�FPG!GP;GPGPPGTGUTG�GV�H�HV�H�HQ�H�HVI;IVEITIV�F�FPG!GPDGPGPPGTGUTG�GV�H�HV�H�HQ�H�HVI;IVEITIVWGpGPpG�GS�H�HSI%IS%I6IP6I@ISEITISDGWG0�DGPGPPGTGUTGWGV`GeG��}�eGpGQpGqG��}�`GpGPpGqGS�G�G@��G�G
��G�GS]CtCP{C}C0��GHPH HPfCtCP�H�HP�HIS<FOFP�H�HP�CDPDDp�DKDP0D8DQ8D<Dqx�<DDDQ�F�F2�P?W?UW?^?u�`Y�YU�Y[S[@[�U�@[dSdZd�U� Z[\�]�^\�^__\�_2`\�`a\�a-b\dUd\�Z�ZP�]�]Pp^�^P�^�^P�a�aP Z[^�]�^^�^__^�_2`^�`a^�a-b^dUd^aZdZ	| $ &�dZhZUhZ[	| $ &��](^	| $ &�p^�^	| $ &��^__	| $ &��_2`	| $ &��a-b	| $ &�dUd	| $ &�(_A_:�A___P@[�]S�^�^S__�_S2`�`SaBaS�a�aS-bdS@[�]V�^�^V__�_V2`�`Va9aV�a�aV-b<bVFb�cV�c�cV�cdV[`_`P_`�`_�a�a_Fb�b_dd_@[~\0�~\�]_�^�^___�__2`L`_L`�`0�a9a_�a�a0�-b<b0�Fb�c0��c�c0��cd0�@[~\0�b]x]P__g_P-bFb0��c�c0��`�`P�a�aPFbJbP@[~\0�~\�\^�\�\P�\�\\�\�]^�^�^\__�_^2`�`^a9a^�a�a^-b<b0�Fb�c^�c�c0��cd^	@[~\0��\�\P�\�]\�^�^\__�_\�_�_\2`�`\a9a\�a�a\-b<b0�FbBc\�c�c0��cd\]]v� $ &�]]U__p_0�p_�_Q�_�_��t�_�_��t�1��_�_|��_�_|~��_�_|��_�_|~��_�_|��_�_0��c�cV�c�c4��c�c
��c�c����c�c@��c�c6��c�c\M^`^sM^`^sM^`^sM^p^
�M^`^s�a�as�a�a
��a�as0;t;Ut;H?��}p;u<0�u<�<^�<�<P�<�=]�=�>]�>,?0�,?C?]p;u<0��<�<P�<�=]�=�>]�>,?0�,?C?]p;u<0�u<`=��}�=�>��}�>�>T�>�>��}�>,?0�,?,?��},?C?0�p;u<0�u<@=V@=V=PV=�=V�=�=P�=�>V�>�>V�>,?0�,?0?V>?C?0�p;`=S�=:?S�<�<s� $ &��<�<U�=>0�Z>c>0�c>{>^{>�>~��>�>~~��>�>~��:;U;/;S/;0;�U�;;P�9�9U�9�:S�:�:�U��:�:S�:�:�U��9S:\�:�:S�:�:@��:�:6��:�:W�:�:4��:�:
��:�:�H�4U4������U������
�U�
$��$6U40�4�^��^
$^$60�4�0��00�0T9�r�0���?�
$0�40�4�_�\_\m�m�_
$_$60�40�4K\K�V��\��V��\
$V$60��S��S
6S�]�]
6]��U��S���U���S���U���S�T.V.��T���
���
�����w���SP'S'Wv(drPrxS��
���
���p`#���p`#� 
<$��c~`#� 
<$�dx~`#� 
<$���
v�v�"���P�c^dx^\0�PS�89P�8:9Q��P�+	P��Q��Q	+	Q	#	0�	#	0�	#	P�	
U
s
�U�
)
P)
>
S>
k
Pk
n
Sn
r
Pr
s
S 7L7UL7�7�U� 7H7TH7w7Vw7x7�T�x7�7VM7Z7Px7�7P�5�5U�56V6?6�U�?6�6V�6�6�U��6�6V�6�6�U��56T6?6�T�?6F6TF6�6\�6�6�T��6�6T�6�6\�6�6�T��6�6P�6�6P�6�6\T6g6Pg6�6S�6�6UF6�6]�6�6n��2(3U(3�4\�4�4�U��223T23(4V(404T04�4�T��223Q23�4]�4�4�Q�63Y3PY3c3p�c3t3Pt3~3^�3�3p��3�3P�3�3S�34P4,4�,4h4�L3p3Qp3~3R�3�3Q�3�3R�3
4T
44tp�44T414^4(4V(404T0414�T�404|�I4R4QR4S4VI4R4TR4S4]I4R4|�_(l(Pl(v(u�_(v(3�_(l(u��l(v(P�'�'U�'�'�U��'�'U�'�'T�'�'Q�'�'�T��'�'T�'�'Q�'�'R�'�'�Q��'�'QP''U'�'�U��'�'UP'�'T�'�'Q�'�'�T��'�'TP'�'Q�'�'R�'�'�Q��'�'Q0`U`S��S��U0`T`�^���T���T0`Q`V��Q���V���Q���Q0`R`]��R���]���R���RD�\��~1$~"3$�U"����T $ &33$�U"���\��~1$~"3$�U"����T $ &33$�U"���\`iP{P0%�%U�%&S&�&��}�&+'�U�+'9'��}9'@'U@'E'�U�0%�%T�%&_&9'��}9'@'T@'E'��}0%�%Q�%9'��|9'@'Q@'E'��|�%�%V�%�%v�b%�%0��%�%p
���9'@'0��%�%Q�&�&Q�%�%P�&�&Pb%�%0��%�%^�%�%~��%&^&'��}+'9'��}9'@'0�c&u&��}�u&�&]�&�&}��&�&}��&�&]+'9'��}�K&�&_+'9'_c&�&S+'9'SK&X&V_&u&Vu&�&��}�&�&t��&�&T�&�&��}�#�+'9'V�%'\+'9'\&&P&'��}+'9'��}�&�&V�&�&v8$8&2$p"�&�&
v8$8&2$p"c&c&5�c&c&
�c&c&^#|$U|$�$�U��$�$U�$%�U�%%U%$%�U�#w#Tw#�$S�$�$�T��$%S%%T%$%�T�#w#Qw#�$V�$�$�Q��$%V%%�Q�%%V%%Q%$%�Q��#�#P�#�#p��$�$0��$�$0��$�$^�$%^<#w#0��#�#r
����#�#t
���%%0��#�#Q$$q$!$qpI$Y$RY$m$q%%qp�$�$P�$�$P�$%P<#w#0�w#�#\�#�#|��#,$\,$_$|�_$�$\�$%\%%\%%0�$!$T3$m$T%%T%%q`$!$X>$B$RB$�$X%%X�#�$P%%P�#�$Y%%Y� !U!7!S7!p!wp!{!��{!�!�U��!�!S�!*"w*"�"�U��"�"w� !T� � u�F!q!S�!�!S�!�!s��"�"S�"�"P�"�"P{!�!|�I"o"|�o"�"P{!�!VD"�"V�"�"v��"�"V{!�!_I"�"_{!�!}D"d"}{!�!]"�"]{!�!^"�"^o"�"q2$u"�"�"q2$u"o"�"v�8$8&2$u"�"�"v�8$8&2$u"�"�"v�8$8&2$u"�(�(U�(=)S=)>)�U�>)Q)UQ)b)Sb)�)U�()0�) )P!)&)	��&)<)P>)�)0��(�(u�u�@��()Q>)Q)u�u�@�b)|)u�u�@��()P�(	)s��	))T))s���()s�()Pt � u��� � T� � p� � p#�� � p`#�� � tp#�� � Q� � P� � 4�� � T2D2UD2�2S�2�2~�~��2�2�U��2�2S�2�2~�~��2�2�U��2�2U2D2TD2�2V�2�2T�2�2�T��2�2T�2�2V�2�2�T��2�2T2D2QD2�2]�2�2Q�2�2�Q��2�2Q�2�2]�2�2�Q��2�2Q2D2RD2�2\�2�2R�2�2�R��2�2R�2�2\�2�2�R��2�2R2)2u��)2�2^�2�2�U#���2�2^�2�2�U#���2�2u��U2Z2|�Z2u2PU2u24�U2u2^`�U�< ]< H �U�H b ]b k �U�`�T�< VH b V`�Q�5 SH [ S[ ^ sp�^ b S��P��}��q $ &���}��}�� $ &���P��\H b P��P��0��< \H b \��P��\��V 0 SH H S 0 VH H V 0 ^H H ^   PH b P  S  V  ^�ZUZ�^���U��H^H\U�QTQ�]���T��H]H\T�ZQZH�Q�H\Q�ZRZ�\���R��H\H\Rl�S�HS?ZSZ�_H_HRSP\��QTQZ]Z�V��U��V��V��U�HVH\T��T��_�_��P��P��S��S��_��_��U��V��U(4^(3	p $ &�37	s $ &���U��S���U���S���U���U��S��s��s�� $ &�0yTy��T�MYQYn	t2$x"#4nyR��U�)S)*�U���U��P���U�������0��/�/U�/0S0	0�U�	0#0S#0)0U�./U/[/S[/\/�U�\/a/Ua/o/So/u/U�W�WU�W�XS�X�X�U��XYSYY�U�YPYSPYUY�U�Y#YsY#YsY#YsY0Y
�Y#Ys�	U	S"�U�"rSr��U��'T'V"]V]_P_rVr�T�dlP3
	�30�3}@�3}S?LPL}\��V]d2�]d
�3JP,2,U2,h,Vh,k,�U�k,�,V,<,T<,j,\j,k,�T�k,�,\,G,QG,�,�Q�-,H,0�H,L,Pk,�,P�,�,R+:+U:+�+\�+�+�U��+�+\+:+T:+�+^�+�+�T��+�+^+:+Q:+V+SV+�+�Q��+�+P�+�+p $
 $-(�q+�+
�q+�+
��
�
U�
�
uh��
�U�
�
T�
��T��
qRqw�R�wyRy��R��
qZw�Z�
�
0��
[p���*X-q[q�0��
�
0��
�
T�
�
t��
u|�#�-4T47p���DWT^bt�bqu|�#�q�0�0	C	UC	n	Sn	p	�U�p	w	S0	G	TG	o	Vo	w	�T�H	_	P_	i	s�p	u	P�	�	U�	�	S�	�	�U��	�	S�	�	U�	�	�U��	�	S�	�	T�	�	V�	�	�T��	�	V�	�	�T��	�	V�	�	P�	�	P�	�	P0_U_�V���U���V07T7�\���T���\@JUJrVrvQvw�U�@UTUcScvRvw�T�@�U�V}�U�}�V�.�U�.�V��U�@�T�|]|}�T�}.].5T5]����v���\�S}
S
R.:��v�:�\��S��\��S�	P}�P��v����
���
���\c�
�c�
�c�\SWRWX��u�SWQWX]SWs}�
�}�d�}�S��
���d���U��S.
�
(s��U�
S

�U�

S
$
�U�$
*
U��Q$
*
Q��P
)
P)
*
u �t $ &���P�
\

\��T�
V

V�
^

^��P�
]
$
P��\��V��^G
P
P�
�
U�
�
V�
	�U�	�V��U�
�
T�
�
_�
	�T�	�_��T�
�
Q�
�
\�
	�Q�	�\��Q�
�
R�
�
^�
	�R�	z^z��R���R�
�
P�
�
S	%P%XSXdPd�S�
�
R�
�
]	�]��R�U�S��S�(S�T�V���T��9V4��}�4�]��}�*\k�P��S(P(QS�*S��0�4�^�0�QTPThSs�S'<��'<S',��}�,<\��l���\��U��v�FQSs�0�s�0�s���}���Q��|��������Q��|��V�\dUd��U�}�P��_�U_/0�/LPLn_��_��Ud�S��P�nS��S��P��Sd��n������������P������P�Q��Q��R��X�)�)U�)�*^�*�*U�*�*�U��*�*U�*�*�U��)�)T�)�*��~�*�*T�*�*��~�*�*T�*�*��~�)�)Q�)�)w�)�*�Q��*�*Q�*�*�Q��*�*Q�*�*�Q��)�)Q�)�)w�)�*�Q��)�)T�)�*��~�)�)U�)�*^*�*S�)*��~*`*_`*v*��v*�*_&*f*Qf*�*���*�*}x��*�*Qj*�*]�*�*P{*�*P�*�*]{*�*2�{*�*w{*�*~{*�*P�*�*]{*�*2�D*T*q�T*j*PD*j*6�D*j*\�,-U-�-V�-T.�U�T.�.V�.�.Q�.�.�U��.�.U�.�.V�.�.U�.�.V�.�.�U��,�-
�T.q.
��.�.
��.�.
��.�.
��,-W-�-ST.q.S�.�.S�.�.S�.�.S�,-U-{-V{-�-ST.q.S�.�.U�.�.V�.�.S�.�.V�,V-0�V-h-U�.�.0�r-�-P�.�.P-
-
�-
-W{-�-��_��-�-\{-�-S{-�-
��-.S*.T.S�.�.S�-�-P�-�-V*.;.P;.T.V�.�.P�.�.V�-�-
A��-�-Sq.�.V�.�.Q�.�.�U�00�0U�0�1S�1�1�U��1�1S�1�1�U��1�1S00�0T�0�1���1�1�T��1�1���1�1T�1�1���1�1�T��1�1��00�0Q�0�0V�0�1�Q��1�1Q�1�1V�1�1�Q��1�1V�0�0V�0�1�Q��1�1�Q��1�1V�0�1���1�1���1�1���0�1S�1�1S�1�1S�0�0]�0
1T
11x1b1Tn1�1T�1�1T�0�1V�1�1V�0�0���0F1^F1R1rpR1�1^�1�1^�0-1_-151x51�1_�1�1_�0b1Yq1�1Y�1�1Y�1�1Y�0�0R�1�1R�1�1
@��0�04��0�0T�1�1V�1�1���1�1_�45U5%5�U�%5/5U/5�5\�5�5�U��5�5\�5�5U�45T5%5�T�%5F5TF5�5V�5�5�T��5�5V�5�5T�45Q5%5�Q�%5P5QP5�5�Q��5�5Q55S55s�55}�%5�5S�5�5}��5�5S55P55st"%575P75F5st"1F5f5vs"1K5`5T`5b5tp�b5f5Tq5�5Sq5�5Vq55|�7
7U
77�U�77U7
7T
77�T�77T�7�7U�7�8�U��8�8U�8�8�U��7�7T�7�8V�8�8�T��8�8V�8�8T�8�8V�7�7Q�7�8]�8�8�Q��8�8]�8�8Q�8�8]�7�7Q�7�8]�8�8�Q��8�8]�8�8]�7�7T�7�8V�8�8�T��8�8V�8�8V�7�7U�7^8\�8�8\�K	LU	LWL_WL�L�U��LP_P$PU$POW_OWTW�U�TW�W_�L�LP,LWL\�L�L\,LWLV�L�LV,LWLS�L�LS=LGLP�L�LP,L=L\,L=LV,L=LS�LP_OPOW_TW�W_qM�MP�LPSOPDUS\UOWSTW�WS�L�L1��L�LP�L�LQ8MqMV8MqM\.MqM]NMXMPqM�MP8MNMV8MNM\8MNM]�MPSOP,RS\U�USV0VSW/WS�MP_OP,R_\U�U_V0V_W/W_�M�M
p�1��OPQ
p�1���MP\OP,R\\U�U\V0V\W/W\�MNV�MN���MN���MNV�MN���MN���MNPNONVNON��NON��!NONV!NON��!NON��8NONPyO�O_RiR_�RDU_\UV_5V�V_4WOW_TW�W_yO�O�#R,R�#\UhU�#yO{O0�{O�OP�O�Op��O�OP�O�OROPQ_OPQPOPkPp�OPQp�SPkPQkPyPp�kPQp�oPyPQyP�Pp�yPQp�}P�PQ�P�Pp�P�Pp��PQp�	�P�Pp�P�Pp��PQp�	�P�Pp�P�Pp��PQp��P�PQ�P�Pp�P�Pp ��PQp �	�P�Pp!�P�Pp$��PQp$�	�P�Pp%�P�Pp(��PQp(��P�PQ�P�Pp)QEQPEQIQp�"Q'Qp1$q""Q.Qp1$q"�3QEQQ3QEQQ6QEQRiQ�QP�Q�Qpp��QRPpQRQ�Q�QP�Q�Qpp��Q�QP�QRpp��Q�QR�Q�QR�Q�QR�Q�QR\U�U_iU�UPvR�RVvR�R_�R�RP�RU_�UV_5V�V_4WOW_TW�W_�RDS\DSGSPGS�Sw�ST\�U�U\�U�U0��U�U\�RKS]KS�SP�S�S��~�ST]�U�U]�TUP�RU0��UV0�5V�V0�4WOW0�TW�W0��RSZS�Szh��U�Uzh��U�U0�S�SZ�U�UZ�R�Rp��R�SX�U�UX_S�S__S�Sz|_S�SR�S�S��~_S�Sz_S�Sz�S�S\�S�S}p��S�S@��S�S
��S�S]T�T0��UV0�5V�V0��V�V0�4WJW0�TW�W0��W�W0�TT��~�U�UP8VXV\�V�VVT�T_�UV_5V�V_�V�V_4WJW_TW�W_�W�W_^TpTPyT�TP�T�TP�T�TP�U�UP�UVVAVXVPiV�VP�V�VP�V�VP�V�VV�V�VP4WIWP�W�WP�W�WVT2TP2T�T]�U�UP5V@VP@VXV]XVzV0��V�V]�V�V]�V�VPTW�W] T�T_�U�U_XVzV_�V�V_TW�W_ T3T	��3T;TPTWgWPhW�W_UUH�UU0�UU
�U4UU4UU4UUDU
�U4UPJP
 �P$PU$PJP_.PJPP,�d�


�


��������9>ACFQxx|��������� *)SX����
05:������@n��Oh���"'3"'3TY}O[]d�RV]���������������������� 0 P P  0 P P � � � � � � {!�!�!""�"{!�!"�"`"h"p"�"�"�"`"h"�"�"�%'0'9'.&5&B&G&c&c&_(e(l(v(�(�(�()	))�)***`*f*{*�*D*D*I*Q*;+>+c+n+q+�+�,�,�,�-X.x.�.�.�.�.�,�,-
-�-.0.X.�.�.�0�1�1�1�1�1�0�0�0�0U2U2`2j2D3c3k3~3�3�3�3�34%4,41464<4I4S455+5�5�5�5q5w5{5�5�7�7�788�8�8�8�8�8s:}:�:�:s:}:�:�:�:�:�:�:�:�:O<T<�<�<�<�<�=>`>�>�@�@�@�@�BQC E0E�FH HXH�H�HI;IEITI�F�G�H�HI;IEITIDG�G�H�HI;IEITIQC�ChEpFH HXH�H�HIhE�EXH�H�HI�EpF�H�HdIdIxI�I_J�J�J�J|J|J�J�J�J�J�J�J�J�J�J�J�J�J�J�JpKpKuKwKyK~K�K�K�K�K�K�K�K�K,LWL�L�L0LWL�L�LWL\L�L POPiSiSUUUUOWTW�W�MPOP,R\U�UV5VW4WyOyO�O�OOP\PaPdPhPkP\PaPdPhPkPrPvPyPrPvPyP�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�PQ�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�RiSiSU�UV5V�V4W@WEWOWTW`WcW�WUSeSiSiSiS�S�S�SUS_S_SeSiSiSiS�S�S�SiSqS�S�S�S�ST�T�UV8V�V4W@WEWOWTW`WcW�WTTT�T�U�U�UV8V�V4W@WEWOWTW`WcW�W T;T�U�UTW`WcW�W T;TTW`WcW�WUUUUUDUYYYYY0Y�Y�YZ ZUZaZZZ@[�]�^_`_`8`�`aHa�a�a0b<bFb�c�cdZ\_\]	]]]:cBc�c�c:cBc�c�cM^M^M^M^M^p^
R��
/usr/include/bits/usr/include/usr/include/sys/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include/netinet/usr/include/arpalsapilib.cstring_fortified.hunistd.hbyteswap.hstdlib.hstdio2.hfcntl2.hstdlib.hstat.hlsapilib.htypes.hstddef.hfcntl.hstruct_timespec.hstat.htime_t.h__sigset_t.hsigset_t.h__sigval_t.hsiginfo_t.hsignal.hsigaction.htypes.hstdint-intn.hstruct_timeval.hselect.hstdarg.h<built-in>struct_FILE.hFILE.hstdio.hsys_errlist.hresource.hstruct_iovec.hsocket.hsocket_type.hsockaddr.htime.hpwd.hstruct_tm.htime.hunistd.hctype.hconfname.hgetopt_core.hstdint-uintn.hin.hnetdb.hun.hlsapidef.hstring.hresource.hdlfcn.hsocket.herrno.hselect2.hsched.hmman.hsendfile.huio.hstrings.hinet.hwait.hprctl.hgrp.h	�K�K��.K5��J/�I#KK1
0	z
zJ	Z	"OJJ�= ...v �<Kg�fJ��.T2KxJ.n=@�<YDw<<=�:/;<�;/u;=IK=H</փ-K-=>:X�-=;=0:/;=I</�/sf�=H</[G��-K-=��18=;=0:X�;=-/�I=;/�?Gf�-K-=�I<�-=��;=-/�e=-/�t�0���/���/���-</��-</��-</��-</��/���/���-</��/���/��-J=�t=��Y-</ȑ-</�J>Xtu-=ttu;/�K-=-/X��-/t��;/�g�K-=Y-=;=J�;=�/K-=-/X��;/��u-=ttu-=�K;</f�;=;/f�u-=t�.V>,>t�;=�/.K-=-/t�-=-//-/-X�.I</t�.W=-/0,0,<�.W=-/t�/�t�;=;/<t�.W=-/0:0:<�.W=�/.�:==:</�=;J=u�I=-=.Y�x =5 x./yJ.K0+=0+/.Z1Mz.?/=:===�`�[+�/�{�.	��r	�	KZ.��4tKK
	Z	�	J
sJX/
t 
OJg8��j
�� �n�!;K;KJYZC%t!K%K:K%K/X X�~�!-/-!WgY	L
Xf  	zt
Z@F�2
yt<���/
��	�
X/	Z�J
v �0X	�n	�<
JK
	�<<x�	��	�	=	=#	=E	K#>H	>#	K#	=
l	Z<<	h	u$I$K="IY<IJ	=$J$<=;"<J	=�v�XF.L
L
=/d f.L
u/��O7@p$ti�k<�=<><V=�
Wu�k�i
��I)HKI,IKI,<K*Iu*u,1K,�uY�	r u	;Y�v�VvV�M,U	i+h]q<.qJXq<3 q3J�v<v	�|
	�fX.X��	< X	�vJ�		Yh x�`
�ut
h.s�		uXX.X	�
	su	Y
yJ	t	Yt'X
	w
	��	�
�	/J
iX�<%<
`t
=X��I/7L*J<_C=&<K
�X._�<t
eX$.�~�	"fN	f	K
txX
	`x �t�.eX/g�.J.X	�
I
Jw�l
X��
V�	�Y�	K	Y	�?U	Lj 
��k<�Lt	�
�lX��	K�l
�	��.�	��Z�	K	�	�>V	La$f	�mX	�X�m<	�.>�m��<�XN1+	p��k"�
�kJ�J
�k.X�X"~K
�k��	�	[X	O(�kX
	�<
�kX�	�
b�>=E<>:<Y<;
=
v�k<�qR<
!��l
�
�
�l<�����l�z/	�f�X<	Kf�fk�v
�~��*�~
X�$	rJ�~
#��.?f	h
�~����~<
��.<1	��~)�	<
�~t)�X
�~<<t	�
�~XX	����
��~
/�.<<
zf�~�
�~X�.
�~t.�J<<X�< �
�W=�
ڬq		K	�ff
L
4z�
>=
jtt		�	�	�
Z-JJXf�t
X
L!s
gf�
�
fF�
J
Y�	Y
:�"foXXXJlt0�
hd/	L.XN�6�g	J�	y��i<
X$	��	Z
���
4�tKK
	�;:|".<
Z
IY�6t��(f+K"JMX"X<�
mJ<	&�
AJ�X0J
X��XXV�$J)�I�!4f<9X�!Jh
.$r.XX`KJ
Jt5<uY�"J
q<%�
3$x.`XYBW[$g	
�	F�	x	\	*2.	F^�	\t;:�j KK-uYI��X	�Ki+J��JK�2K�Ku\�/
�u���
 �u
(�tX
�|��
�x(��9?JL6�J9�xX<u1tu��6,XJK�,@g
L,K /sJK u
X�Q�y��XKEW	\�	gx.	<	%
	/s	uZ	p��tt��	/�t.X	��o� t�K
!fJ/	kt	Z�s	gY���	Z	�Y�	g	Y
�#!�xwJ��K�xJK��K!JK
�sJ��
�s< !�KJ9J!JK!��s
f���K =J	YYt	YYt	YYJ	YY<xK�	t<YL	,<W	ue	[A<v v�.�KXe#��!CJ;�CgK	EdX�` x DNK$�JGMY�<,�"g
< 	�
�	=	�&>	t	u
X	�
Y
�r<�
f	K�r
�
<
�r<X	�
	v	v

�[L	qX�r
�
�
�r<X	�
ltXrl.<	v
h
�K�1<
z�'�K��,�M�;�!?qL	�/	Z(>
�rJ<J(�

�r<<<	�
�r
X	�
	u	=
>	h�uJL	�|
�	�fX.X��

]u	�u<�

Z
=
=
y<kJ��K,&J"I�rt�
�&s=�r<�
!�rff�
	"yJD!I�K	L%;	K%H	K	KK��K.7���
�.XB#I1u#J
Q	
F	Z�
KNJ U�
	X

�hJ.$.�Xhr	�/X
L�*~Jf-�S.	LKI	u	YZ�
�.HJ
K
Y)�%f�X80��JJ
)X%<�XX�$�%4HJL<�0�YBL=;B=Vv<��)/Mt	z�0<6u 	zt/�
L4K"vI4H
="
@"F
�%#K%W
Yz
Q*uJf�	�	uJ	K
�mJJ
�.I

<vJ
uMF
=0J
u)
Y%#K,K"9
=&
=�X	�YsJY	FX:�JJ	Z	LN*<xX�<JX>tJ�	e
<	7/t�
L4K
xH4�
=
K
�*v�Jf�J	�	uJ	�
�Y.W
�mJ�t
�m��X
K�
t
K�m
�\�x JYKWiX<JJz
�NS
=;0WX
Y)?
K
�
LeJf<Ki*�_8t�K��)^	~tf<_�K��z.`	z�tf<	X�K�JZfv*=�gJ	Z
AK=%,	=%H	KM,
tY,Lh�o!(�f�ot��(=-Kl X�|�K���<x� <�	��o�.K	M�s�f�sf�tJt	
��	Z	�93JJM _<� .	j�y��	�93JJ	Kw '� K�"�f/�	s�	�XM
X
X�
mXL
�
f	��	y��r�
�rX�'�
=PY�r<f'�	Kz<	�	Y�r�	�
.
Z
j�
fX��	]XX$XZ�&��v��/8�
�yX
�<t
�y�
���y<
��	��;	Y3�4J�J	�
�/<0��/Y;K;=�R�.	z XZw� �/J�8fC
�b�<	h�b
�X�	�<	=	K<Xh���a
����	X�+^�aX��^	t	�Y=-Xu	g+�uJit�#	Y�E<�7	]�X	gv.X	g.X�m�LZ
fF&	t
0
N�
�)J
x)8
=)H
�
uK	Z�/ Xp�ytK�
h�/a<'	t
0
Q�
�)J
x)8
=)H
�
uKY	��/ l�m.�tt��Kw	�"
g;�L	p�<>J:h6t�
YGu	
uf>=
.
f	�	K�	^�tj
�!�tJ<	�	jF	�%	=%H	�K
Z7)K
LK)8
K!
K	2%o	=K%:	K2	GK
��_X#<
]<
<&�	Y�ZX
[f<Ȃ	_Xy�	��q
�	�	K��K&�,���N>:hZ�s"�	[�sf�	�"Ui	XigY ..-	s�X� �... ��K� fh00<
�=
�	h+<	Y�
u<
	�	YJ�z�

.	L+<	g
/.
	L	gJ�	JK�*X.X	v6=�	Y;�	u/X��l
�f?
�lJX�Y
�l�f"�K�l
���"�K8G��8=�P.4XK% ���	�	�
�
J.J�p<J*<X	v6=�	Y;.	�/X��l
�f
�lJX�Y"�=8G��8=�I/..c<�<jBz<�	�
�sX&�`"
f
�[�Z�	M	�
L
��Y0	U==YK^f	�4I	gY��K��$�/fY	L��	y�^/�K-%�]��
��	K+/X�>0XX�<u��j�	YvXg
YIgZ$�Hv&L<X�(.=	/.u.�Z.fJOwX(WuO=.ft"<*w 
<K	t	Y /?�N&tuKK
	h	g
G]	t	Y�	t	Y��tM
� �
t�����	�
YIgYJvY�Y�g	r�	Y
>v	t	YK��,�	<Y��	._�h���o<�x
�}�<J��u
��

Z�L
X�w	v�Y-�)X
f\Ks =K	v.	Y
+J	K'J�u<$RxtXp�/Zu:��Y	<�u:��Y	<	�-;	�-;	�-;�bX)	�<]X�&ZX�
_	#�#t
Y	�	�
Z.X
��<L�	��	y}	Af<X1d�	��	9�	+Y	��
�X)�////0
A1t
[J	.<%<;
� <3�
�l
z<�)�
>K��YWJtbXK �X	9��	�

ft
"u
;	�<u	WY	rXu	WY
�X"0", XX
LX��J<f?JfjK
t	Y*=�K	t	�,=�K	t	�0=�K	t	�.=�K
t	Y,=�KgjK�K�2K��	�zt�/	Y	Z��	�	��c�	��	�	Z�c�	�
�cf�	�	Z�c�
<<	�	a�,<	�	Z�c��i	�	Z�c�	�x	�	��	�	Z�c�	�w
X	�
	�
��c�	�	�
	�
Y�c�
�	v
	�
Y�c�
�	v
	�
Z�c�
�	w
	�
Y�c�
�	v�
Z	[
	�
Z�c�
� 
g	�
	�
Y�b
�	�f�}r��	�	�
��
��	��g�	��{
��	g1J��
�}	�
�<1�-�u-�).K.X
UJ.<	Z.)J
�KIK
Xx<X�/
�-
�
�X<�
��/
ift��	�	�<
�<J�J<��X
_�!	�hX�~<u	� 	u
X	��f
��~��<uY��uY	Y�vt�=	���	����	XJ��e�u\TKEW��	�~�	�
Z�d�
�K	h
	�
Z�d�
�K	h
	��h��y�X.��	�}
X�����y
.��t	�t
Zg2
u�4w��
�i�
f���
��X	�h�
o�.Jt.	���u�	�f�	=���^uL2�3fK&� 	�m�Y�X	�fX��K
�a�
�a<Z,g�
�<
=<I
X�J^��J...	*�Kz�}>��K
+zz< O=�>;g<0:><	Y6
2
�_<� <	Z	�	\�_<
� 
�_X<
� 
�_<X	� K	
	0�f	/�_

� �
�_JX	� B	
	9�
X
J�_� 
�_<f� XX
�_JX� �K
		.wJ]7A<@.=
J?w	Z�_
.	� �	
	�<<[�_
�	� �_	� 
�_X	� .
�_.X�	
�McMY�	
��_
!JJ_fJ� �_
 �� ..�i�/Z�l	h+JJ�xJL	�|
�	�fX.X�	�,X	�x4�	Ltot�$r��y5��	h	K)MU	=)	= <���Jf
�
t	�T.TJ=..7<�x<�	�|
�	�fX.�	Z�	�t
�Q�~%�#<=u�7<�{�z�+h	�s	u�t0<�{�z�+h	�s	u�t
��
��
t	K�	K�	K�	K�#/K;?;;*x/Su$	*zJ/:<v3O/xJuBJ=su;uIu<<Y���{�	�{t/J
L5KK-)EJ
fJ	�	uJ	K"�<K<#K<
LyJ
�.J	�/��	;YtX�yJ�	�	K	�	uX��{oK
M�=
K=	nK
=
K=
mK
=
K=

Ku:
Ku:
NXl
X
k
Xj
=
K=

Ku:
Ku:
NXi
Xh
Xg
=
=
XtX��	�{t/<
�
ZtWX=
MU=
=*JftJ	�	uJ	=
�M=

2J
NJK
H=K
K
N<
+LK
K
H=K
K
N<
,KK
K
H=K
K
N<
-JK
K
H=K
K
<
.z���)Ju��d�P�w	j	u	`��yf�	�	K	K	uX��}
	rtu	u=t	h(t	�<!�J&;
�
HK%�J*;�(IgY<
RL��
4fNJ�w
��
�w�f���w�Y�K�
#&K	]X:�
�~�
Zr>	@�	/�	��
�
�
��
��
J	�	��	
��
f��:v	ZYw�	Y���u
�	�
�Zv
�
.X�	��t� �	��tXI/
/		
	u
�~ft
Zr>	Z�J	�
�z	��	��X�/X
��<
��zX
�
	tX�	/
�`��ggWK>�X	�u	�~��X�~��	�}XYX�
�|X��
�|<Y^	�
X	��./��
X�R�	XUJ
Y	�
h.�e�X>	�tYvtYK��	��	M�
U�-�/](tq $��~Zv
<�����Qyt/�Z
t	���
t	Z*(t
N
��	bXJ�|�
�<�	y

�!�#�J
��<X=�
��
�
K
	��tZ2K�'eK,�t��X
�~+�|Z�s�W��	��u:��Y	�	�/�	�/�	�/�+��X	�<\
.X�
��	�#t
Y	�	�
Z.X
��<��	��	y}	AfJX?��	��	9�	+Y	��
�X���
?����%�t'YJ��" �=�tYwtYLL����mZv
<��tYKt�t�tYvt�)�X�|.K���6�2X��!s Y!Y+�! t!Y+K �f
�|tY1+
IKv�vWJgWJ
~J	.<%<;
[(���Jt"� 	�|��	=
�
vV
>Y�
�
Z+��KZ)=1K-
M�<
�<Y
v�.�u.
�}Jt
Z�Y��<
gJ
f"�<�	�	/
��np
<
��}�2NX��)�	��	
��
�~�	�|X���}�Y�"�Xg![qg!p�'�Y>�tYK�&�C�XK%��.ZY&i
�f���Y�p<�x ��u
��

Z�v
X� w	�~���9�}�5Xl�
�t.Z7j.+�"<g7/W5K/I
Mu_��Kg\K�_SC_THREAD_SPORADIC_SERVERpthread_atfork_functotalLSAPI_Set_Max_Process_Timelsapi_parent_dead__fxstatparseContentLenFromHeaderugidLen_SC_2_SW_DEVm_pScriptFileLSAPI_Stopsi_addr_lsb_unused2_SC_TIMERSm_iReqCounter_fileno_SC_SHELL_SC_MEMORY_PROTECTION_SC_SCHAR_MAX__pathtm_secH_AUTHORIZATION_SC_THREAD_SAFE_FUNCTIONS_SC_UCHAR_MAXmax_lenfreeaddrinfogid_tverifyHeader_SC_C_LANG_SUPPORTm_pIovecEndstrcpy__uint8_tIPPROTO_TPpw_uidwaitpidHTTP_HEADER_LEN_SC_TTY_NAME_MAX_SC_PASS_MAXLSAPI_ErrResponse_rsi_uidm_bytes_SC_2_PBS_TRACKfp_lve_destroym_pHeader_IO_buf_end__RLIM_NLIMITS_SC_SELECT_shortbufrlimitsockaddr_insa_family_tSOCK_DCCP_SC_BC_STRING_MAX_ISpunctis_enough_free_meminet_addr_SC_TRACE_INHERITinit_lve_exnewSizem_tmStartliblvesetgroups_SC_SEMAPHORES_SC_EQUIV_CLASS_MAXread__environ_sigpollsa_datauint16_t__builtin_memmoveai_protocol_valuem_pChildrenStatusCurIPPROTO_UDPoverflow_arg_areatime_tsin_zero_SC_DEVICE_SPECIFICin_port_t_flagsachMD5_SC_THREAD_THREADS_MAXerror_msg_SC_LEVEL3_CACHE_SIZE_SC_TRACEreg_save_areacalloc_archm_respPktHeaderg_running__off_t_addr_bndlsapi_cleanupachHeaderNamest_size_SC_THREAD_PROCESS_SHAREDallocateBuf_SC_JOB_CONTROLgetppidtm_isdstswapIntEndianlsapi_check_child_statussignal_locks_max_idle_secslsapi_set_nblockenvirons_schedule_notifysetUID_LVE_SC_NL_NMAX__RLIMIT_NPROCRLIMIT_DATApServeratoluint32_tinitgroups_SC_POLLm_pHttpHeader_SC_V6_ILP32_OFF32_SC_TRACE_SYS_MAXm_pScriptName__builtin_va_listst_blksizeRLIMIT_NOFILEm_pEnvList_SC_BASE_sigchldLSAPI_Set_Max_Idle_Childrenint32_t_SC_LONG_BITfixEndianLSAPI_GetEnv_r_upper__fmtsa_familym_specialEnvListSizepw_passwd_SC_CLOCK_SELECTIONmasklsapi_resp_infosigaction__RLIMIT_RTTIME_SC_V7_LPBIG_OFFBIGbodyLeftfcntllastTimeold_ppid_SC_AIO_LISTIO_MAXLSAPI_Init_Prefork_ServerpErr1pErr2st_gidm_cntHeaderss_notify_scheduledm_envListSizeacceptinggettimeofdaypBufai_addrm_iAvoidForks_secret_timerlsapi_MD5Context__syscall_slong_t__builtin_memset_SC_FILE_SYSTEMsa_restorerm_pChildrenStatusEnd_IO_write_endtype_SC_SCHAR_MIN_SC_LINE_MAXLSAPI_SetRespStatus_rlsapi_MD5_CTX__resst_nlinks_addr_SC_TZNAME_MAX__va_list_tag_syscallst_ctimnameLen__builtin___snprintf_chkLSAPI_Postfork_Child_SC_2_VERSIONfree_SC_2_PBS_CHECKPOINTIPPROTO_MPLS__sigset_tm_requestMethodOffm_tmWaitBeginreadSecretreadReq__tznameatoig_initedgetaddrinfovalLens_acklsapi_jailLVE__d0_SC_LEVEL4_CACHE_ASSOClsapi_MD5Final_SC_NL_LANGMAXdoAddrInfo__stack_chk_failmemcpy_killcurSizeRLIMIT_STACKIPPROTO_IPIPdlopenbacklogsin_family_SC_LEVEL1_ICACHE_ASSOCpIovrlim_maxm_iKillSentm_fdListen_SC_AIO_PRIO_DELTA_MAXvalidateHeadersst_atimm_statusm_reqBodyLensig_numoptargSOCK_RAWsnprintfold_int_SC_2_C_BINDs_enable_lve__clock_tparseRequestIPPROTO_RAWstrdupbufLen_SC_PRIORITY_SCHEDULING_SC_SS_REPL_MAXsys_errlistsival_ptrpStderrLogsetpgid__uid_tdaylightsi_stimeoptoptLSAPI_ReqBodyGetChar_rpKeysun_family__uint16_t_SC_FSYNCsin_portgetpeernameLSAPI_is_suEXEC_DaemonLSAPI_Is_Listen_rLSAPI_End_Response_r_SC_FILE_ATTRIBUTESsetreuidserverAddr_SC_NZEROm_pQueryString__gnuc_va_list_SC_2_C_DEV_chainpContentLen_call_addrEnvForeachnewfdm_iServerMaxIdleSOCK_NONBLOCKusleepSOCK_RDM_SC_SYMLOOP_MAXsockaddr_un_ISblankunsigned charIPPROTO_MAX_SC_MQ_OPEN_MAXSOCK_DGRAMm_tmReqBegin__fd_mask__blkcnt_tlsapi_enterLVE__builtin_calloc_IO_lock_tLSAPI_Is_ListenIPPROTO_COMPLSAPI_key_value_pairlsapi_check_pathLSAPI_ForeachHeader_rpHeaderName_SC_SEM_NSEMS_MAX_SC_USHRT_MAXLSAPI_FinalizeRespHeaders_r__read_alias__fdelt_chkshouldFixEndianpBody_SC_STREAM_MAX_SC_ASYNCHRONOUS_IOserverMaxIdle__open_alias_SC_READER_WRITER_LOCKS_SC_CPUTIME__getcwd_alias_SC_2_PBS_LOCATE_SC_DEVICE_IOsa_flagspVecgeteuid_SC_SIGNALS__ctype_b_loc_SC_V7_ILP32_OFFBIGstatusoff_tchild_statuss_notified_pids_max_reqsH_X_FORWARDED_FORs_pid_dump_debug_info_ISalpha__fprintf_chktm_zone__mode_tm_queryStringOff_SC_V7_LP64_OFF64_SC_NPROCESSORS_CONF__RLIMIT_SIGPENDINGfdInlsapi_changeUGidtv_usec_SC_XOPEN_XCU_VERSIONold_childold_termLSAPI_sendfile_rlsapi_lve_erroraccept_SC_MEMLOCKallocateRespHeaderBuf_ISprintsched_yieldpMessages_liblvepValueH_CONTENT_LENGTHm_tmLastCheckPoint__vfprintf_chk_ISalnum_SC_SEM_VALUE_MAXs_req_processedstrtollopen_SC_XOPEN_XPG2_SC_XOPEN_XPG3_SC_XOPEN_XPG4LSAPI_STATE_CONNECTED_IO_write_ptr_SC_REALTIME_SIGNALSsystemlsapi_packet_headerIPPROTO_ENCAP_ISspacelsapi_suexec_authgetLFg_prefork_serverva_list__suseconds_treqsexitLSAPI_CreateListenSock2__rlim_ts_ignore_pid__RLIMIT_MEMLOCKpCurpHeaderValue__sizesizes_slow_req_msecslsapi_init_children_statusgetuidFILEH_COOKIELSAPI_ParseSockAddrdlsympthread_lib_SC_PII_INTERNET_DGRAM_SC_SINGLE_PROCESSbyteReversedump_debug_infoLSAPI_Accept_Before_Fork_SC_SHRT_MAX_ISxdigit_SC_RAW_SOCKETSfp_lve_enterLSAPI_AppendRespHeader_rsize_tH_CONNECTIONLSAPI_GetHeader_r_SC_MULTI_PROCESSs_stderr_log_pathm_statefp_lve_instance_init_SC_BC_BASE_MAXH_CONTENT_TYPELSAPI_STATE_ACCEPTING_SC_RTSIG_MAX_SC_NETWORKINGachCmdH_ACCEPT_SC_GETGR_R_SIZE_MAXperrorcompareValueLocation_SC_THREAD_ATTR_STACKADDR_SC_LEVEL2_CACHE_ASSOC_SC_IOV_MAX_SC_TRACE_EVENT_NAME_MAX_SC_PII_INTERNETIPPROTO_IGMPpServerAddrlsapi_acceptlsapi_initLVE_IO_save_baseLSAPI_Release_riovecold_usr1maxIdleChldsocklen_tm_iMaxChildren_SC_2_UPEai_canonnameIPPROTO_IPV6_SC_DELAYTIMER_MAXpw_dirsa_mask__sigval_tLSAPI_Set_Extra_Childrens_restored_ppidsin6_flowinfototalLenm_pid_SC_SYSTEM_DATABASElsapi_prefork_server_acceptm_pIovecToWritecodem_respHeaderLen_wide_dataH_IF_MATCHai_family__nlink_tsi_addrst_inost_modeLSAPI_IsRunning_SC_T_IOV_MAXCGI_HEADER_LENIPPROTO_DCCP__in6_uGetHeaderVarH_ACC_CHARSET__stream_SC_XOPEN_STREAMSm_iMaxIdleChildrensendfile_IScntrlm_reqBufSizelsapi_child_statusprctlallocateEnvList_ISupperpStatuserr_nosival_intsi_codem_pReqBufwait_timestrcasecmpH_IF_UNMOD_SINCEpw_name_SC_TRACE_USER_EVENT_MAX__socklen_tsend_notification_pktlsapi_requestpKeyEndcurTimefprintflsapi_writev__ssize_t__srclsapi_closepChrootH_IF_RANGEtimespecnameOff__u6_addr8strerror__RLIMIT_RSSavoidForkm_packetLenLSAPI_ReadReqBody_rIPPROTO_MPTCP_SC_2_FORT_RUNbindfp_lve_leave__valin6_addr_SC_ADVISORY_INFOpacketLen__timezone__ctype_toupper_locsin6_addr_SC_TIMER_MAXpBufCur_SC_THREADSunset_lsapi_envs__sighandler_t_SC_USER_GROUPS_RLSAPI_Set_Server_fdLSAPI_CreateListenSock__RLIMIT_LOCKSm_respPktHeaderEndLSAPI_On_Timer_pfLSAPI_Set_Max_Reqs_SC_UINT_MAXst_uids_conn_close_pktLSAPI_Postfork_ParentpEndpktTypelsapilib.cset_skip_write_SC_TRACE_NAME_MAX_lowers_busy_workers_SC_THREAD_DESTRUCTOR_ITERATIONSm_flagmemsetlevelstderrm_pHeaderIndexnameidle_SC_CHILD_MAXlsapi_reopen_stderr2_IO_save_endtm_min__nptrLSAPI_InitLSAPI_Request_SC_V6_LP64_OFF64flag_SC_NGROUPS_MAXm_bufProcessedfixHeaderIndexEndianstdoutfp_offsetlsapi_MD5TransformLSAPI_Write_Stderr_r__time_t_SC_THREAD_ROBUST_PRIO_INHERITgp_offset_padLSAPI_ForeachOrgHeader_rsigaddsetLSAPI_Inc_Req_Processedm_httpHeaderLendyingrealpathtm_yday_SC_SSIZE_MAX_SC_PII_OSI_CLTS_SC_SYSTEM_DATABASE_RmsecspAuth_SC_LEVEL1_DCACHE_SIZEkeyLenextraChildrenLSAPI_Flush_rshort unsigned intrlim_cursigned charLSAPI_Reset_rs_lve/builddir/build/BUILD/opt/alt/ruby31/share/gems/gems/ruby-lsapi-5.6/ext/lsapiLSAPI_CB_EnvHandler_valueLen__blksize_t_SC_STREAMSSOCK_STREAMdigestpBufEndGNU C17 8.5.0 20210514 (Red Hat 8.5.0-20) -mtune=generic -m64 -march=x86-64 -g -O2 -fPIC -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fplugin=annobin_SC_PAGESIZE_SC_THREAD_PRIORITY_SCHEDULINGcountsi_pidIPPROTO_MTPs_stop_SC_CHARCLASS_NAME_MAXlsapi_header_offsetstrchrvfprintfsetgid_boundstm_wday__off64_t__fd__lenachBuf_sigsys_IO_read_base_SC_XBS5_ILP32_OFFBIGsend_req_received_notification_offsetIPPROTO_EGPLSAPI_reset_server_statesockaddrsigset_ts_defaultGids_keep_listenersecsm_cntUnknownHeadersreadfdsai_addrlenlongsopterr_SC_DEVICE_SPECIFIC_RLSAPI_Set_Restored_Parent_Pidpw_gecos_modem_iExtraChildrenLSAPI_No_Check_ppid_SC_PIPE_IO_write_base_SC_XOPEN_CRYPTvalueLenm_respInfotz_dsttime_SC_PHYS_PAGESlsapi_enable_core_dumpH_CACHE_CTRLH_COOKIE2_SC_ATEXIT_MAX__desttm_monclose_SC_SHRT_MIN_SC_FIFObitstimeH_USERAGENTs_min_avail_pages_SC_USER_GROUPSm_lLastActiveLSAPI_ForeachEnv_rlong intSOCK_PACKETsa_sigactionnotify_req_received_SC_XBS5_ILP32_OFF32dumps_worker_status_IO_marker__builtin_strncpys_ppidtm_yearlimitmax_children_SC_2_PBS_MESSAGEm_pRespBufEndtimevalorig_masktmCur_SC_XOPEN_REALTIME_THREADSfp_lve_is_availablepAddrs_defaultUidm_pChildrenStatus__fds_bits_SC_SPIN_LOCKSLSAPI_Set_Server_Max_Idle_Secswritem_bufRead_SC_SPORADIC_SERVERlsapi_close_connectionuint8_t_SC_LEVEL1_DCACHE_LINESIZE__sigaction_handlerlsapi_signal_SC_PRIORITIZED_IOin_addrSOCK_SEQPACKET__pid_t_IO_codecvt_SC_GETPW_R_SIZE_MAXpUgidheadershints_SC_XOPEN_VERSIONH_RANGE_SC_BC_SCALE_MAX_SC_2_C_VERSIONdup2strtolg_reqlong doubleparseEnvai_socktype_SC_THREAD_KEYS_MAXiov_len_SC_LEVEL4_CACHE_LINESIZEfd_setlsapi_MD5Init_SC_NL_TEXTMAXnonblocklong unsigned intlsapi_req_header_SC_LOGIN_NAME_MAXfind_child_statusIPPROTO_PIM_SC_XBS5_LP64_OFF64_SC_SPAWNmaxChildrennewlensi_statussigemptyset_pkeym_headerOff__RLIMIT_OFILEHTTP_HEADERS_SC_2_PBSs_proc_group_timer_cbpw_gid__errno_location_SC_XBS5_LPBIG_OFFBIG_SC_WORD_BITchar_SC_2_PBS_ACCOUNTINGm_pSpecialEnvListsin6_scope_idstdin_SC_AIO_MAX__oflag_SC_2_CHAR_TERMresolved_path_SC_LEVEL1_ICACHE_LINESIZE_IO_buf_baseai_flagsrealloc_SC_XOPEN_SHM__dev_t_SC_XOPEN_ENH_I18Nold_quitRLIMIT_CPU__glibc_reserved_IO_read_end_SC_ULONG_MAX_SC_TYPED_MEMORY_OBJECTS_SC_TIMEOUTS_SC_LEVEL2_CACHE_SIZEfinal_SC_XOPEN_UNIXm_pRespBufPos_IO_FILEin_addr_tm_fdH_HOST_IO_wide_datacookiestrlentzname_sifields_SC_LEVEL2_CACHE_LINESIZE__u6_addr16s_pidIPPROTO_AHLSAPI_ReqBodyGetLine_rtm_hoursetsidFlush_RespBuf_r_SC_THREAD_STACK_MINisPipe_SC_PII_OSI_Mm_respHeaders_global_counterRLIMIT_AS_SC_NL_MSGMAXsi_signom_pAppData__RLIMIT_MSGQUEUEachAddrm_inProcess_SC_THREAD_ROBUST_PRIO_PROTECT_ISgraph_lsapi_prefork_servertm_mdaypIntegerlsapi_siguser1__pad0_SC_BC_DIM_MAX__pad5_SC_LEVEL1_DCACHE_ASSOCmallocs_dump_debug_infos_avail_pages__u6_addr32_headerInfom_typesi_errnofinish_closelistensigno_SC_XOPEN_REALTIME_markersLSAPI_InitRequest_SC_SAVED_IDSpBindm_scriptFileOff_SC_INT_MAXsi_bands_log_level_namess_skip_writeH_VIAmemccpy_codecvtforkIPPROTO_ESPm_pRespHeaderBufEnd_SC_TRACE_LOGgetpwnamtimeout_SC_THREAD_PRIO_PROTECTg_fnSelectRLIMIT_FSIZE__builtin_memcpyst_rdevlsapi_http_header_indexpEnv_SC_OPEN_MAXst_devssize_tdlerrorheaderIndex_SC_UIO_MAXIOVLSAPI_Logm_pRespHeaderBuf__int32_tH_PRAGMA__uint32_tqsortpSecretFile__RLIMIT_NLIMITS__daylightIPPROTO_RSVPstrncpyH_REFERERIPPROTO_UDPLITESOCK_CLOEXECLSAPI_Set_Slow_Req_MsecsLSAPI_Prefork_Accept_r_sys_siglisthandler_SC_CHAR_MAXLSAPI_Get_ppid_ISlowerpEnvEndsigprocmaskm_pUnknownHeadergetpwuidm_reqState_SC_PII_XTIpRespHeadersleftkillsysconfm_pRespBufm_iCurChildrensocketLSAPI_Write_r_SC_PII_OSI_COTSm_totalLenpasswdm_pIovecs_stderr_is_pipefstat__snprintf_chk_SC_PII_SOCKET__gid_tlsapi_sigpipe_SC_V6_LPBIG_OFFBIG_SC_MQ_PRIO_MAXgetcwdH_TRANSFER_ENCODINGH_IF_MODIFIED_SINCE__bsxai_nexts_enable_core_dump_SC_TRACE_EVENT_FILTERnodelaysin6_family__resolved_freeres_buf_sigfaultm_iChildrenMaxIdleTime_SC_THREAD_CPUTIMEsi_utimetv_sec_SC_VERSIONm_cntSpecialEnv_SC_C_LANG_SUPPORT_Rlong long unsigned intmemmovesa_handlersin_addr_cur_columnlsapi_load_lve_libtoWriteuid_t_SC_PIIsi_fd_SC_MAPPED_FILES_SC_LEVEL4_CACHE_SIZEIPPROTO_BEETPHfp_lve_jail_SC_2_FORT_DEVIPPROTO_IPm_pRespHeaderBufPosst_blockslsapi_initSuEXEC__bswap_16getpid__buf_SC_2_LOCALEDEFm_cntEnvlocaltime_r_SC_LEVEL1_ICACHE_SIZEreadBodyToReqBuftm_gmtoffIPPROTO_PUP_namesigval_IO_backup_baseH_KEEP_ALIVE_IO_read_ptr_SC_CHAR_BITLSAPI_Register_Pgrp_Timer_Callbackmd5ctx__socket_type__nbytes_nameLengetenv_freeres_list__aps_max_busy_workersIPPROTO_ETHERNETH_IF_NO_MATCHpEnvListrlim_tlsapi_readsun_pathtimezoneCGI_HEADERSsi_overrun__bswap_32pReq_SC_INT_MINlsapi_MD5Update_SC_RE_DUP_MAX_SC_PII_INTERNET_STREAMachBodyachPeerheader_SC_THREAD_ATTR_STACKSIZEfull_path_old_offset_SC_SIGQUEUE_MAXsiginfo_t_SC_FD_MGMTexpect_connected_SC_SYNCHRONIZED_IOLSAPI_STATE_IDLEvalueOffsighandler_t_SC_V7_ILP32_OFF32skipunlinksend_conn_close_notificationoptinds_accept_notifywritevH_ACC_LANG_SC_EXPR_NEST_MAX_SC_LEVEL3_CACHE_LINESIZElong long intm_pktHeaderin6addr_loopbackports_accepting_workersIPPROTO_IDP_flags2lsapi_prefork_serverallocateIovec_SC_MESSAGE_PASSING__ch_SC_REGEX_VERSIONm_iLenLSAPI_Set_Max_Children__d1setuidtv_nsecm_scriptNameOfflsapi_perror_SC_FILE_LOCKING_SC_AVPHYS_PAGES_SC_MB_LEN_MAXpHeader_ISdigitsockaddr_in6IPPROTO_SCTP_SC_PII_OSI_SC_ARG_MAX__ino_tsetsockopt_SC_MEMLOCK_RANGELSAPI_Finish_r_SC_SHARED_MEMORY_OBJECTSlsapi_resp_headersys_nerrin6addr_anym_pRequestMethodachError_SC_CHAR_MIN__realpath_chkiov_basem_lReqBegins_uids_total_pagespw_shell__namem_versionB0m_versionB1IPPROTO_GRE_SC_XOPEN_LEGACY_SC_NL_ARGMAXRLIMIT_COREsi_tidtobekilled_SC_THREAD_PRIO_INHERIT_SC_LEVEL3_CACHE_ASSOC_SC_NPROCESSORS_ONLNm_headerLenexpect_acceptingm_pIovecCurfdListenLSAPI_Init_Env_Parametersaddr_len_SC_HOST_NAME_MAXIPPROTO_TCPLSAPI_AppendRespHeader2_r_SC_COLL_WEIGHTS_MAX_SC_MONOTONIC_CLOCK__rlimit_resourcem_reqBodyReadLSAPI_Set_Max_Idle_SC_CLK_TCKLSAPI_ForeachSpecialEnv_rlsapi_buildPacketHeaderLSAPI_perror_r_SC_NL_SETMAXunsigned int_SC_BARRIERSbodyLenpBeginLSAPI_Accept_rwait_secslsapi_reopen_stderrstrcmpst_mtim__statbuf__RLIMIT_NICEfn_select_tshort intlsapi_notify_pidsi_sigvalsetrlimit_vtable_offsetaddrinfo_SC_IPV6mmapIPPROTO_ICMPlsapi_sigchild_SC_REGEXPlsapi_schedule_notifyLSAPI_Get_Slow_Req_Msecs_SC_V6_ILP32_OFFBIGstatmemchrtz_minuteswestsys_siglistH_ACC_ENCODINGsin6_portm_iMaxReqProcessTime__RLIMIT_RTPRIOGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-20)GNU�zRx�0D
LXsE�I�B �E(�A0�z
(A BBBIA
(D BBBA��@�YG�J�B �B(�A0�A8��0F(B DBb0�B�F�C �G�
 AABKHk(\GA�D�J n
AAA4�UA�G�K R
CAGL
JCG ��A�G�]
AJ �t��
CKF�L�B�B�E �A(�H0�H
(D BBBD�
(D BBBAPX�v�F�B �A(�D0�D
(A BBBBL(A BBBA�����$�aA�A�D XAAH��B�B�B �B(�A0�A8�D@N
8C0A(B BBBH$ OA�f
QC
EH@HYB�B�B �A(�D0�J��
0A(A BBBFx��F�E�A �C(�G�
 
(A ABBDM�
I�
c�
A�
��
E�
M�
A�
k�
E�
E�
E�
E�
H�V�
H�F�B�B �B(�A0�A8�D``
8A0A(B BBBDlT+B�B�B �B(�A0�D8�J�Y�H�P�C�	M�i
8A0A(B BBBEL�T�M�D�d�6B�B�B �B(�A0�A8�DP�
8A0A(B BBBG
8J0H(G DBBK$,7E�F�F IIOTh|�4��F�A�A �G�>
 AABG ��E�O
D�
A
(Y<JE�DXS l]P�h
HXA�H�lF�B�B �B(�A0�A8�LP�
8A0A(B BBBH<�F�B�B �A(�A0��
(D BBBIi`0F�B�B �B(�A0�A8�DP~
8A0A(B BBBAk
8A0A(B BBBHL�$F�B�B �A(�A0�H��Q
D���
0A(A BBBHL�F�B�B �B(�A0�A8�G��
8A0A(B BBBF4FHF\�$p�n�C�X�J�L�lF�B�B �B(�A0�A8�D�A
8A0A(B BBBA`��B�B�B �B(�A0�A8�G� I� K� I� L� N� N� w
8A0A(B BBBI0L	�B�M�D �G�L
 AABA<�	=B�A�A �G� L�@I�@U
 AABG$�	�T�WE�H�G� �	�a�g
HS�H
�F�B�B �B(�A0�A8�DPS
8D0A(B BBBFTX
�b�I�E �D(�C0�P
�(F� B�B�B�MQ(H BBBA�����H�
�F�B�B �B(�A0�A8�DP�
8A0A(B BBBAT�
C�B�A �A(�G0`
(A ABBD�
(C ABBAJ����8T-F�B�D �D(�D@T
(A ABBB�(�lE�C�G�F
AAIL�!c�B�G �A(�D0�
(A ABBEX����D0���� 4ZH10\pF�A�A �G@7
 AABF�@L�sL�F�B�B �B(�A0�A8�G��
8A0A(B BBBG�
$
8
L
`
t
�
�
�
�
<�
	F�B�A �K(�G�
(A ABBG<�F�E�E �D(�D0�M
(C BBBBX(Hl�F�B�H �E(�A0�E8�I@�
8A0A(B BBBE(��F�E�D ��ABH��B�B�B �B(�A0�A8�G��
8A0A(B BBBJD0�F�B�B �A(�A0�G�
0A(A BBBFLx�
F�B�B �B(�A0�A8�G��
8A0A(B BBBA��
�	
1-
E2a~3��4��5.IWu��l	��-�-
�"0s-�J�e�s	z����	����)�Y)2�L0�Y�z+	��k�	 �+	�w	0	Gw	:�	X�	Ui�	�s
��	��s
����
��
x5��P	�_	�s(�0�x�*
����*
#�
N0
al	�|�
����
������O&	�-	�=�h9��Y�9��	��@	�$�@�O	�e`	r���U�+���6�6	%		�7	6S	wm	w�	��		l�		��	��	��	�
�4
�f
��
	x�
��
��
�]	�'	�;]\m{m��������*+*L�k������\�\"
k C
k b
� 
� �
�"�
 ��
�"�
$%@� `d0$%UE'x�d�E'��'��'��'�'D�(m�(��)��)��*�	���*�+7+�F�+c�,~,��	0��,��.��,=��.u/*7u/[)0})0��1��1��2��2�4C�4k�5��5��6��67!7G�7k�7��8�d	��X	��8
�8+�8S:9y:9�q9�P	�q9��:	�#h	3	(B�:g0;�0;�H?�	��	���	@��	���	��H?'^?GR^?tk?�k?��?��?�?,�?V�?~�?��?��?@,@T@z	��@�+@�+@�?@?@;K@WK@�TI�	)�	p�	h�	d�	`�	P�	H	@#	80	X6TIY�Iz�I�J�J��J��J�K(�K?�WT�K�\(b $o(|�W�UY�UY�Zd Zd>qdiqd��d!#$&()+23456718���2�8�F�"��K�O�(�p���R�P���[oy�#�)�/�5;�A�G8MXS�Y�_�e�k�qw+}=�N�b�w��������������*�@�V���������������
����%]+o1�7�=�CpIO@U�[Tahgtms8yp��6�����&�������������(���P���,-./0) 
>�Mcmy�������� ��1�������   " / 9 @��C R a h v � � � � �� @7� � �� �� �� �!�� !'!	#S!3!8!��C!RK!@	Q!X!^!`
p!p�!�Y�!�J�!�!0S�!�]�!�l�!�!�!`"p i"� %","@"#$Y"_"0%u"P'F�"�'F�"�'��"�(��"�)l��"�"�"�"#
#�.�#�/�1#00�?#2�P#Y#�2�s#z#�4�#�5-�#�#�#�#�#7�# 7l�#�7!
$$$!$�85$�8ZN$@91a$�9pv$�:@�$�$0;�$�$�$�$P?�$`?�$p?%�?%�?:%�?V%�?u%@�% @�%0@�%@@�%P@	�%�%�%�%&&& &`I�4&�I(B&J�R&K�a&j&q&{&�&�&�&�&�W��&`Y�
�&�&�&`d�&�d
'.annobin_lsapilib.c.annobin_lsapilib.c_end.annobin_lsapilib.c.hot.annobin_lsapilib.c_end.hot.annobin_lsapilib.c.unlikely.annobin_lsapilib.c_end.unlikely.annobin_lsapilib.c.startup.annobin_lsapilib.c_end.startup.annobin_lsapilib.c.exit.annobin_lsapilib.c_end.exit.annobin_lsapi_sigpipe.start.annobin_lsapi_sigpipe.endlsapi_sigpipe.annobin_lsapi_siguser1.start.annobin_lsapi_siguser1.endlsapi_siguser1g_running.annobin_compareValueLocation.start.annobin_compareValueLocation.end.annobin_EnvForeach.start.annobin_EnvForeach.endEnvForeach.annobin_lsapi_cleanup.start.annobin_lsapi_cleanup.endlsapi_cleanups_stop.annobin_set_skip_write.start.annobin_set_skip_write.ends_skip_write.annobin_lsapi_MD5Transform.start.annobin_lsapi_MD5Transform.endlsapi_MD5Transform.annobin_lsapi_signal.start.annobin_lsapi_signal.endlsapi_signal.annobin_find_child_status.start.annobin_find_child_status.endfind_child_statusg_prefork_server.annobin_allocateRespHeaderBuf.start.annobin_allocateRespHeaderBuf.endallocateRespHeaderBuf.annobin_lsapi_set_nblock.start.annobin_lsapi_set_nblock.endlsapi_set_nblock.annobin_lsapi_accept.start.annobin_lsapi_accept.endlsapi_accept.annobin_parseEnv.start.annobin_parseEnv.endparseEnv.annobin_lsapi_init_children_status.start.annobin_lsapi_init_children_status.endlsapi_init_children_statuss_busy_workerss_accepting_workerss_avail_pagess_global_counter.annobin_readBodyToReqBuf.part.2.start.annobin_readBodyToReqBuf.part.2.endreadBodyToReqBuf.part.2.annobin_lsapi_close_connection.isra.4.start.annobin_lsapi_close_connection.isra.4.endlsapi_close_connection.isra.4s_worker_status.annobin_lsapi_writev.part.6.start.annobin_lsapi_writev.part.6.endlsapi_writev.part.6.annobin_lsapi_parent_dead.start.annobin_lsapi_parent_dead.endlsapi_parent_deads_ppids_restored_ppid.annobin_LSAPI_ParseSockAddr.part.13.start.annobin_LSAPI_ParseSockAddr.part.13.endLSAPI_ParseSockAddr.part.13.annobin_LSAPI_Log.start.annobin_LSAPI_Log.ends_stderr_is_pipes_log_level_namess_pid.annobin_lsapi_sigchild.start.annobin_lsapi_sigchild.endlsapi_sigchilds_pid_dump_debug_infos_ignore_pid.annobin_dump_debug_info.start.annobin_dump_debug_info.end.annobin_lsapi_check_child_status.start.annobin_lsapi_check_child_status.endlsapi_check_child_statuss_max_idle_secss_dump_debug_info.annobin_lsapi_perror.start.annobin_lsapi_perror.end.annobin_LSAPI_is_suEXEC_Daemon.start.annobin_LSAPI_is_suEXEC_Daemon.ends_uids_secret.annobin_LSAPI_Stop.start.annobin_LSAPI_Stop.end.annobin_LSAPI_IsRunning.start.annobin_LSAPI_IsRunning.end.annobin_LSAPI_Register_Pgrp_Timer_Callback.start.annobin_LSAPI_Register_Pgrp_Timer_Callback.ends_proc_group_timer_cb.annobin_LSAPI_InitRequest.start.annobin_LSAPI_InitRequest.end.annobin_LSAPI_Init.start.annobin_LSAPI_Init.endg_initedpthread_atfork_func.annobin_LSAPI_Is_Listen_r.start.annobin_LSAPI_Is_Listen_r.end.annobin_LSAPI_Is_Listen.start.annobin_LSAPI_Is_Listen.end.annobin_LSAPI_Reset_r.start.annobin_LSAPI_Reset_r.end.annobin_LSAPI_Release_r.start.annobin_LSAPI_Release_r.end.annobin_LSAPI_GetHeader_r.start.annobin_LSAPI_GetHeader_r.end.annobin_LSAPI_ReqBodyGetChar_r.start.annobin_LSAPI_ReqBodyGetChar_r.end.annobin_LSAPI_ReqBodyGetLine_r.start.annobin_LSAPI_ReqBodyGetLine_r.end.annobin_LSAPI_ReadReqBody_r.start.annobin_LSAPI_ReadReqBody_r.end.annobin_Flush_RespBuf_r.start.annobin_Flush_RespBuf_r.end.annobin_LSAPI_GetEnv_r.start.annobin_LSAPI_GetEnv_r.endCGI_HEADERS.annobin_LSAPI_ForeachOrgHeader_r.start.annobin_LSAPI_ForeachOrgHeader_r.endHTTP_HEADERSHTTP_HEADER_LEN.annobin_LSAPI_ForeachHeader_r.start.annobin_LSAPI_ForeachHeader_r.endCGI_HEADER_LEN.annobin_LSAPI_ForeachEnv_r.start.annobin_LSAPI_ForeachEnv_r.end.annobin_LSAPI_ForeachSpecialEnv_r.start.annobin_LSAPI_ForeachSpecialEnv_r.end.annobin_LSAPI_FinalizeRespHeaders_r.start.annobin_LSAPI_FinalizeRespHeaders_r.end.annobin_LSAPI_Flush_r.start.annobin_LSAPI_Flush_r.end.annobin_LSAPI_Write_Stderr_r.start.annobin_LSAPI_Write_Stderr_r.ends_stderr_log_path.annobin_LSAPI_perror_r.start.annobin_LSAPI_perror_r.endLSAPI_perror_r.annobin_lsapi_jailLVE.start.annobin_lsapi_jailLVE.endlsapi_jailLVEfp_lve_jail.annobin_lsapi_reopen_stderr.start.annobin_lsapi_reopen_stderr.endlsapi_reopen_stderr.annobin_LSAPI_Finish_r.start.annobin_LSAPI_Finish_r.endfinish_close.annobin_LSAPI_End_Response_r.start.annobin_LSAPI_End_Response_r.end.annobin_LSAPI_Write_r.start.annobin_LSAPI_Write_r.end.annobin_LSAPI_sendfile_r.start.annobin_LSAPI_sendfile_r.end.annobin_LSAPI_AppendRespHeader2_r.start.annobin_LSAPI_AppendRespHeader2_r.end.annobin_LSAPI_AppendRespHeader_r.start.annobin_LSAPI_AppendRespHeader_r.end.annobin_LSAPI_CreateListenSock2.start.annobin_LSAPI_CreateListenSock2.end.annobin_LSAPI_ParseSockAddr.start.annobin_LSAPI_ParseSockAddr.end.annobin_LSAPI_CreateListenSock.start.annobin_LSAPI_CreateListenSock.end.annobin_LSAPI_Init_Prefork_Server.start.annobin_LSAPI_Init_Prefork_Server.ends_max_busy_workersg_fnSelects_total_pages.annobin_LSAPI_Set_Server_fd.start.annobin_LSAPI_Set_Server_fd.end.annobin_LSAPI_reset_server_state.start.annobin_LSAPI_reset_server_state.end.annobin_is_enough_free_mem.start.annobin_is_enough_free_mem.ends_min_avail_pages.annobin_LSAPI_Postfork_Child.start.annobin_LSAPI_Postfork_Child.ends_req_processeds_keep_listeners_notified_pid.annobin_LSAPI_Postfork_Parent.start.annobin_LSAPI_Postfork_Parent.end.annobin_LSAPI_Accept_Before_Fork.start.annobin_LSAPI_Accept_Before_Fork.endold_childold_termold_intold_usr1old_quit.annobin_LSAPI_Set_Max_Reqs.start.annobin_LSAPI_Set_Max_Reqs.ends_max_reqs.annobin_LSAPI_Set_Max_Idle.start.annobin_LSAPI_Set_Max_Idle.end.annobin_LSAPI_Set_Max_Children.start.annobin_LSAPI_Set_Max_Children.end.annobin_LSAPI_Set_Extra_Children.start.annobin_LSAPI_Set_Extra_Children.end.annobin_LSAPI_Set_Max_Process_Time.start.annobin_LSAPI_Set_Max_Process_Time.end.annobin_LSAPI_Set_Max_Idle_Children.start.annobin_LSAPI_Set_Max_Idle_Children.end.annobin_LSAPI_Set_Server_Max_Idle_Secs.start.annobin_LSAPI_Set_Server_Max_Idle_Secs.end.annobin_LSAPI_Set_Slow_Req_Msecs.start.annobin_LSAPI_Set_Slow_Req_Msecs.ends_slow_req_msecs.annobin_LSAPI_Get_Slow_Req_Msecs.start.annobin_LSAPI_Get_Slow_Req_Msecs.end.annobin_LSAPI_No_Check_ppid.start.annobin_LSAPI_No_Check_ppid.end.annobin_LSAPI_Get_ppid.start.annobin_LSAPI_Get_ppid.end.annobin_LSAPI_Init_Env_Parameters.start.annobin_LSAPI_Init_Env_Parameters.ends_accept_notifys_enable_core_dumps_defaultUids_defaultGids_enable_lves_liblvefp_lve_is_availablefp_lve_instance_initfp_lve_enters_lve.annobin_LSAPI_ErrResponse_r.start.annobin_LSAPI_ErrResponse_r.end.annobin_lsapi_MD5Init.start.annobin_lsapi_MD5Init.end.annobin_lsapi_MD5Update.start.annobin_lsapi_MD5Update.end.annobin_lsapi_MD5Final.start.annobin_lsapi_MD5Final.end.annobin_readReq.start.annobin_readReq.endreadReqs_ackachBody.7025headers.7024.annobin_LSAPI_Accept_r.start.annobin_LSAPI_Accept_r.end.annobin_LSAPI_Prefork_Accept_r.start.annobin_LSAPI_Prefork_Accept_r.ends_conn_close_pkt.annobin_LSAPI_Set_Restored_Parent_Pid.start.annobin_LSAPI_Set_Restored_Parent_Pid.end.annobin_LSAPI_Inc_Req_Processed.start.annobin_LSAPI_Inc_Req_Processed.end.LC0.LC1.LC4.LC5.LC6.LC3.LC2.LC7.LC8.LC9.LC10.LC11.LC12.LC13.LC14.LC15.LC16.LC17.LC18.LC19.LC20.LC21.LC22.LC23.LC24.LC25.LC26.LC27.LC31.LC32.LC30.LC29.LC33.LC34.LC36.LC37.LC38.LC39.LC40.LC41.LC42.LC44.LC45.LC46.LC47.LC48.LC49.LC50.LC51.LC59.LC69.LC70.LC71.LC43.LC35.LC61.LC62.LC63.LC64.LC65.LC66.LC67.LC68.LC52.LC53.LC54.LC60.LC58.LC57.LC55.LC56.LC87.LC76.LC77.LC78.LC72.LC79.LC80.LC86.LC74.LC84.LC83.LC73.LC75.LC82.LC81.LC85.LC92.LC91.LC88.LC90.LC89.text.group.text.hot.group.text.unlikely.group.text.startup.group.text.exit.groupcompareValueLocationset_skip_write_GLOBAL_OFFSET_TABLE_sigactionsigemptyset__stack_chk_failreallocfcntlsetsockoptmmapmemsetsetsidread__errno_locationwritevkillgetppid__ctype_b_locstrncpystrchrstrcasecmpstrtolgetaddrinfomemcpyfreeaddrinfoinet_addrLSAPI_Log__vfprintf_chk__snprintf_chkgetuid__fprintf_chkgettimeofdaylocaltime_rwaitpidforksystemlsapi_perrorstrerrorLSAPI_is_suEXEC_DaemonLSAPI_StopLSAPI_IsRunningLSAPI_Register_Pgrp_Timer_CallbackLSAPI_InitRequestmallocgetpeernamedup2LSAPI_Initgeteuidg_reqdlopendlsymLSAPI_Is_Listen_rLSAPI_Is_ListenLSAPI_Reset_rLSAPI_Release_rfreeLSAPI_GetHeader_rLSAPI_ReqBodyGetChar_rLSAPI_ReqBodyGetLine_rmemchrmemmoveLSAPI_ReadReqBody_rFlush_RespBuf_rLSAPI_GetEnv_rstrcmp__ctype_toupper_locLSAPI_ForeachOrgHeader_rqsortLSAPI_ForeachHeader_rLSAPI_ForeachEnv_rLSAPI_ForeachSpecialEnv_rLSAPI_FinalizeRespHeaders_rLSAPI_Flush_rLSAPI_Write_Stderr_rgetpidgetcwdmemccpy__realpath_chkstrdupLSAPI_Finish_rLSAPI_End_Response_rLSAPI_Write_rLSAPI_sendfile_rsendfileLSAPI_AppendRespHeader2_rstrlenLSAPI_AppendRespHeader_rLSAPI_CreateListenSock2socketbindlistenunlinkLSAPI_ParseSockAddrLSAPI_CreateListenSockLSAPI_Init_Prefork_ServercallocsetpgidsysconfLSAPI_Set_Server_fdLSAPI_reset_server_stateis_enough_free_memLSAPI_Postfork_ChildLSAPI_Postfork_ParenttimeLSAPI_Accept_Before_Fork__fdelt_chkusleepsched_yieldLSAPI_Set_Max_ReqsLSAPI_Set_Max_IdleLSAPI_Set_Max_ChildrenLSAPI_Set_Extra_ChildrenLSAPI_Set_Max_Process_TimeLSAPI_Set_Max_Idle_ChildrenLSAPI_Set_Server_Max_Idle_SecsLSAPI_Set_Slow_Req_MsecsLSAPI_Get_Slow_Req_MsecsLSAPI_No_Check_ppidLSAPI_Get_ppidLSAPI_Init_Env_Parametersgetenvgetpwnamenvirondlerrorsetrlimit__fxstatsetreuidLSAPI_ErrResponse_rlsapi_MD5Initlsapi_MD5Updatelsapi_MD5FinalgetpwuidsetgidsetgroupssetuidstrtollprctlinitgroupsLSAPI_Accept_rLSAPI_Prefork_Accept_rsigaddsetsigprocmaskLSAPI_Set_Restored_Parent_PidLSAPI_Inc_Req_Processedselectd	���\����������������������������������������D	����������	���������
���������h
���������o
�����������������������������2�9�H$O,T���������g-��������o������������������������������h	C
���������M
���������X
h	c
�z
��
h	�
����������
h	h	a�������������������������������������������	���������8���������g����������.�������������������������������������J�������������������������������������������������5�����������*���������T�������������������/�������������������������������0������������������	*���������1��������%���������>���������K���������w2�������������������3����������������������������5R4��������Y5��������`6��������v����������������������\	��
"X	3�����������������������/���������8���������M7��������`���������i���������o��8���������������������������������������9����������������������������p���������3:��������?���������K���������_�;����������������������������������������<��������R���������f=���������h�{�d	�h	�t8���������~�����������������������������K���������W>��������`���������i��������������������������������{�h���������������������*����������������������������$?��������*�/���������?@��������G���������N�w*�������������������������������������"������������������������������������������������� ��������� ���������( h	!A��������`!����������!�!���������a"���������j#<q#�\p$*���������}$����������$*����������$��������� %���������%���%�&���������A'����������(����������(�Y)����������)��)���������b*��*����������*���������7+���������A+���������N+B��������W+���������_+���������}+C���������+����������+����������+����������+���������D,,{,D���������,����������,E���������,����������,h	-���������n-����������-����������-F���������-����������-��-����������-���������.�8.���������?.���������N.���������Y.���������~.G���������.����������.����������.H���������.���������/���������*/L/���������T/���������i/����������/����������/�/���������0���������_1����������1����������1����������1���������Q2���������v2����������2���������/3����������3���������-4���������O4���������|5���������N6���������h6����������6����������6����������6����������6����������6����������6����������6���������I7���������W7����������7����������7�7`	�7`	�7���������78��������8���������8�#8���������-8�28��������<8��������G8T	{8����������8�89�'9�G9$Q9L	f9T	�9�9����������9��9��9����������9�9����������9��9��9��9p:*���������:�#:�<:d	G:�Z:`	d:h�:����������:����������:����������:#�:����������:���������:����������:
;��������!;���������H;�;����������;���������;����������;����������;|�;����������;<<���������<�<���������,<�9<���������V<x<t�<\	�<���������<���������<$�<
��������:=��������S=���������e=��������o=���������}=|�=����������=��=����������=<�=����������=��=����������=�>�/>I��������6>���������@>��������F>w>���������>���������>����������>J���������>���������?K��������
?���������?L��������#?���������D?���������Y?f?��������w?�?�?�?�?@�&@�6@�F@�_@M��������@���������@��@N���������@���������@����������@O���������@���������@����������@d	�@P���������@��������A���������'AQ��������,A��������@A���������FA%MAR��������RA��������fA���������mA��������tAS��������yA���������Ah�AT���������A���������A����������A���������A����������AU���������A���������A����������AV���������A��������
B���������B��������BW�������� B��������4B���������;B��������BBX��������GB��������[B���������bB��������iBY��������nB���������B����������B���������BZ���������B���������B���������B[���������B���������B����������B`	�B\���������B���������B����������B��BhC`
C\C]��������#C��������2Cd?CdEC`TC^��������YC��������qC���������wC\�Ch�C*���������Ch�C_���������C`���������Ca��������zD`	�D����������DL	�D
���������Db���������D���������Dc��������E��������%E`1E��������NE���������UE*���������\E��������pEd��������uE���������EL�Ee���������E����������ED�E���������E\�Ef���������E����������Eg���������E<�E����������Eh���������E����������Ei��������F4
F���������Fj��������F���������%F,,FTGFk��������LF���������SFTXF���������_FP�F���������F����������F����������F��Fl���������F���������F����������FdGm��������
G��������G���������(G`/Gn��������4G��������QG���������mG���������G|�G����������G����������G�Gd�G`Ho��������H��������H\"Hd,H`6H`DH\ZHXyHL�Hp���������H����������H����������H����������H<�HT�H����������Hh�H���������HD�HXIh
I��������Iq��������+Ir��������7I���������AI���������KIs���������I����������I����������I����������I����������J����������J���������zK���������9L���������DL���������OLh	JM���������UM���������dMh	�M���������4N����������Ot���������O���������Pu��������P���������*P���������.RhDR%JR$]R#}R����������Rd�R`�Rv��������Sw��������mS|�S!���������S"���������S"���������S#��������	T$��������TT/T4GT+uT%���������T&���������T'���������Tl�Th�T����������TM���������T���������U�U|*U$1U���������GUx��������SU���������eU���������}U(���������Uy���������U����������Uz���������U����������Ud�U`�U$���������UT�U)��������V{��������V��������� V|��������,V���������=V%��������eV%��������V}���������V*���������V~���������V[�Vd�V`�V$���������V��������W���������W���������+W���������9W���������PW���������YW���������yW��W���������W ���������W����������W���������Xh	BX���������UX�hX��X$�X����������Xh	�X���������Y$ Y���������GY���������QY���������xY��Y����������Y�Y��Y�Y��Y���������Yh	#Zh	3Z�?Z�eZ
���������Z���������Z��Z��������p[����������[����������[����������[����������[���������\���������C\����������\�\t�\\	�\���������\���������\$]
��������^]��������u]����������]����������]��]�^�^�4^d	B^$X^$]^���������s^��^��^��^��^���������_d	_��������_c	+_�D_�c_��_���������_���������_���������_��_I���������_����������_��������`��������� `���������%`���������\`���������k`-��������|`.���������`����������`����������`.���������`����������`����������`���������
a���������,aJ��������5a���������ba�qa`	�a��a`	�a�a����������a����������a����������a����������a����������a���������b���������bh	3bK��������8b���������Gb���������Xb.��������gbpb���������vb�{b����������b��b��b��b��bp�b*����������b��b��bd	�b�c`	ch$c���������Cc���������Tc���������ec���������vc����������c����������c����������c����������c����������c#�c��cL���������c����������c��������d���������
d���������d�9d��������Kd�Vd���������fd�ld��d,�	������������������s���������|����������2����������J��������� +�� (LT����-��--�@-H�l�t�����������,�4)`�h)�)���)�����+	 �(+	L+	Tw	�+	�w	�w	��	�w	��	�	s
@�	Hs
ls
t��s
�����x�x,x4*
`xh*
�*
��
�*
��
��
�� �
(�L�T��������9���9	9	@	9H	l	t	��	�	��	��	�
�
�,
�4
6`
�h
6�
6�
w�
6�
w�
w�
� w(�L�T���������������@�H�l�t��������]
�
],
]4
m`
]h
m�
m�
��
m�
��
��
� �(�L�T*���*�*���*����@�H�l�t\���\�\�k \k ,k 4� `k h� �� ��"�� ��"��"�$% �"($%L$%TE'�$%�E'�E'��'�E'��'�'�'@�'H�'l�'t�(��'��(��(��)�(�),�)4�*`�)h�*��*��+��*��+��+��, �+(�,L�,T�.��,��.��.�u/��.�u/u/)0@u/H)0l)0t�1�)0��1��1��2�1�2,�24�4`�2h�4��4��5��4��5��5��6 �5(�6L�6T7��6�7�7��7�7��7�7�8@�7H�8l�8t�8��8��8��8�:9�8:9,:94q9`:9hq9�q9��:�q9��:��:�0; �:(0;L0;TH?�0;�H?�H?�^?�H?�^?^?k?@^?Hk?lk?t�?�k?��?��?��?�?�?,�?4�?`�?h�?��?��?��?��?��?�@ �?(@L@T@�@�@�@�+@�@�+@+@?@@+@H?@l?@tK@�?@�K@�K@�TIK@TI,TI4�I`TIh�I��I�J��I�J�J��J  J( �JL �JT �K� �J� �K� �K� �W� �K� �W!�W!UY@!�WH!UYl!UYt!Zd�!UY�!Zd�!Zd�!qd"Zd"qd,"qd4"�d`"qdh"�d % & ' (]�C�CC(X	0�1C�C3C9C> CE(CJ0CP8CU@C[HCbPCqXC�`C�hC�pC�xC��C��C��C��C��C��C��C��C�C�C�C+�C4�CH�CS�CY�CiCm C(C�0C�8C�@C�HC�PC�XC�`ChCpC!xC+�C7�CD�CT�Cg�C~�C��C��C��C��C��C��C��C�

$�
$�
$H)
#0
$A
<
$C
$	7J
$�$Q
$(V
$�d
$�7n
$�z
${+�
$�+�
$�!�
$�&�
$��
$a-�
$<4�
$��
$��
$q�
$`

$�#
$0"
$Z.
$�:
$*M
$�Y
$�
e
$iq
$��
$&�
$�
$��
$d,�
$��
$4�
$r�
$��
$��
$�(�
$8
�
$Z�
$��
$)
$� 
$n,
$�9
$k.F
$�3T
$Q8a
$.+n
$�{
$��
$��
$J�
$s�
$=)�
$�*�
$��
$�
$�/�
$�
�
$f7

$�
$'5
$�A
$rM
$�.b
$#�
$O	�
$��
$0�
$��
$��
$��
$��
$�
$o5
$*1
$�7(
$�5
$B
$�7Y
$�f
$s
$z%�
$b.�
$��
$��
$��
$y�
$�%�
$��
$�
$P
$9*(
$/?
$�L
$�Y
$Qp
$*|
$)
�
$��
$9�
$..�
$M�
$|�
$�(�
$�)
$�
$=)
$�',
$�18
$�^
$�.j
$�!�
$��
$�#�
$��
$#�
$-�
$3,
$l8
$�2
$�..
$5+:
$^F
$�"S
$k.`
$Mn
$�
�
$#�
$�$�
$��
$��
$��
$ �
$�
$�
$<
$�'(
$�5
$A0B
$'O
$�\
$� i
$�v
$N�
$�&�
$I�
$G�
$$0�
$@�
$�)�
$��
$��
$#3�
$�1	
$�.	
$�7	
$o,	
$9	
$�F	
$n*S	
$�`	
$�0m	
$!.z	
$S)�	
$� �	
$��	
$��	
$�
�	
$:"�	
$�#�	
$�'

$"

$S&&

$�2

$�>

$�4Z

$�f

${6x

$�&~

$�*�

$��

$7
�

$c5�

$��

$�

$�%�

$�(�

$t�

$p�

$��

$#�

$�(�

$x7�

$�8�

$��

$�+�

$U�

$�0�

$y
$
$�

$e,
$�49
$�$G
$�S
$�0e
$�k
$k
q
$�
w
$
}
$�#�
$��
$�!�
$�+�
$��
$��
$��
$��
$V�
$1�
$]8	
$!(
$-5
$�B
$�O
$�\
$�%i
$� v
$��
$5�
$�
$M�
$&(�
$)�
$^!�
$^"�
$X�
$�

$�

$0

$�=

$�	I

$�+U

$Na

$�'m

$�y

$1�

$C�

$04�

$�

$�6�

$��

$!+�

$��

$��

$��

$	*�

$��

$a�

$��

$��

$�#�

$2�

$
$/
$�
$O4
$�
$N3
$$
$p4*
$:0
$Y&6
$�
<
$�B
$[
H
$�-N
$r.T
$�Z
$N`
$(f
$2l
$�1r
$wx
$~
$D)�
$>$�
$��
$R6�
$*�
$�2�
$o�
$a1�
$�
$	�
$�
$��
$S/�
$�
$��
$�/�
$/�
$�,�
$R-�
$�
$$4�
$�
$d
$Q+
$�
$p1
$ 
$-&
$�,
$a(2
$�8
$�>
$5D
${J
$�#P
$%V
$�\
$�b
$�$h
$E(n
$�t
$�z
$�1�
$��
$�5�
$�*�
$��
$�
$�5�
$!�
$�3�
$H!�
$��
$$$�
$U�
$o'�
$� �
$�&�
$�&�
$m&�
$O$�
$��
$a�
$p�
$
$N0

$H,
$�4
$-*
$E1"
$f(
$&.
$�34
$�:
$�@
$	F
$aL
$eR
$k!X
$O^
$=d
$'j
$:p
$U5v
$�	|
$�(�
$h�
$�6�
$�$�
$"�
$��
$I%�
$�%�
$D5�
$�)�
$�"�
$2�
$7�
$0�
$��
$�.�
$��
$��
$O.�
$�
$��
$\ 
$�1
$x!
$� 
$b
$�3
$$
$g6*
$�0
$6
$\<
$�B
$#H
$8N
$g3T
$�Z
$9`
$]%f
$N#l
$r
$0x
$�~
$F'�
$-'�
$�!�
$��
$�%�
$&�
$�
$y"�
$ �
$
�
$��
$-	�
$��
$=8�
$t�
$w-�
$6�
$2�
$�-�
$��
$�*�
$�/
$k

$�&
$�
$Z)
$�# 
$S'&
$�,
$�'2
$8
$�5>
$�2D
$"/J
$�	P
$�$V
$�7\
$|b
$B2h
$Sn
$�t
$z
$y�
$��
$��
$��
$��
$,�
$�
$�(�
$�
�
$~2�
$U �
$��
$y#�
$^�
$�
$�'
$�#
$�9
$b/?
$�7E
$K
$D
Q
$,6W
$�]
$0c
$�i
$3o
$�u
$�{
$��
$�+�
$85�
$|*�
$(�
$��
$8/�
$��
$=%�
$�
�
$4�
$�+�
$B	�
$�0�
$G�
$��
$O
�
$��
$�
$�'
$�)N
$)[
$n
$�4z
$�2�
$��
$`
�
$�
$�.�
$��
$
4�
$
.�
$�8
$
$m
$E&-
$�7;
$�&I
$�W
$�$e
$ys
$D �
$��
$��
$�-�
$,
�
$��
$1�
$r
$

$x8
$�2
$%
$�"
$)(
$�.
$�4
$>!:
$�'@
$�+F
$�+L
$�!R
$1!X
$�-^
$�d
$�0j
$�p
$�v
$40|
$6$�
$��
$`*�
$�-�
$y3�
$�
$��
$ 5�
$,5�
$�)�
$��
$�
$%
$�2 
$j-
$�
:
$*G
$�3T
$�a
$Z	n
$( {
$�/�
$~.�
$+�
$�5�
$�%�
$%�
$��
$�
$,2
$�  
$�-
$z:
$�
H
$�4U
$�2b
$� r
$q$w
$�
�
$��
$��
$��
$�	�
$6�
$�
�
$�'�
$�!�
$�4�
$�
$c
$�,"
$�"/
$~'<
$j+I
$�*V
$m/c
$tp
$#-}
$��
$�5�
$`�
$�
$?�
$%�
$3&�
$��
$��
$�
$�,
$�
$�&
$�3
$�@
$�4M
$-Z
$�,g
$�
t
$�6�
$��
$D#�
$W�
$o(�
$u�
$�(�
$p�
$*�
$�
$�

$�(
$�"
$�/
$m	<
$v
I
$�
$f�
$k$�
$��
$�7+
$O
$�i
$�!�
$��
$2�
$��
$8�
$p�
$*"���
$�	�
$gl	$
$W"1�:
$G�P
$�']�f
$�s�|
$ �h	�
$y)���
$����
$D���
$S*��
$�
$�,�5
$3B�K
$|(X0a
$�0nd	w
$����
$,-���
$c�`	�
$5�X	�
$�!�P	�
$�)�(
�#
$�0�9
$�%Fx_
$1l �
$�����
$�%�@�
$���`�
$A*��
$52�
$�- p 
$�4 l( 
$�"6 h? 
$ M dV 
$#d `m 
$
r 
$B� X� 
$�� P� 
$�"� H� 
$� @� 
$0*!
$�8!8[!
$�!
$G/�!0�!
$�2�!)�!
$K�!
$��!
$��!(�!
$�	�!("
$Q" +"
$�)9"B"
$�)P"
$0^"
$�0l"
$�z"
$��"
$�*�"�"
$)�"
$�'�"
$��"
$� �"
$�,�"
$>�"
$�#
$8.#
$�8#
$�,#
$�":#
$�H#
$9W#
$+3d#
$r# �#
$��#�#
$"�#�#
$�#�#
$u�#��#
$�&�#��#
$$@$
$k$�"$
$k0$9$
$CF$
$RR$�dy$
$r �$`d�$
$1�$
 �$
 �$
$��$��$
 1�$
 -
%
 �%
 j %
 ~$%
 R3%
 �7%
 pF%
 hJ%
 @V%
$�	^%Ku%
$��%
 �%
 ��%
 X�%
 P�%
$��%
 ��%
 ��%
 (	�%
 "	�%3K�%3K�%
 s	�%
 q	�%
 �	&
 �	&
 �	&
 �	&QK$&QKA&
 �	E&
 �	N&
 
R&
 
[&
 8
_&
 6
i&pKs&
" �&
 _
�&
 [
�&
 �
�&
 �
�&
 �
�&
 �
�&~K�&�K�&
"`�&
 �
�&
 �
�&
 �&
 �&
 M�&
 K'�K'
"�'
 r!'
 p*'
 �.'
 �7'
 �;'
 �A'QK_'�K�'
$Q1�'J�'
 �'
 ��'
 ��'
 ��'
 h
�'
 \
�'
 �
�'
 �
�'
"@
(
 �(
 �(dJD(|JN(
"p_(
 �c(
 �l(
 �p(
 �y(
 @}(
 <�(�J�(�J�(�J�(
"��(
 ��(
 ��(
 ��(
 �)
 �)
 �
)�J/)�J9)
"�J)
 $N)
  W)
 d[)
 bd)
 �h)
 �m)�J{)�J�)
$�$�)�I�)
$0�)
$O �)
$�*`I"*
$@1.*
 �2*
 �7*
$pC*
 G*
 L*
$�,X*
 \\*
 Ra*
$�m*
 �q*
 �v*
$#7�*
 <�*
 4�*dI�*
"�*
 ��*
 ��*
 ��*
 ��*�I�*�I�*�I+�IB+
$�5N+P@p+
 �t+
 ��+
 ��+
 ��+
 ��+
 ��+
 ��+
 ��+
$��+
 ��+
 ��+pF�+
$f"�+�F,�@,�@3,
 7,
 <,�@Y,�@c,
"�t,
 6x,
 4},�@�,A�,A�,
 ]�,
 Y�,A�,5A�,5A-
 �-
 �-DA:-[AD-[Aa-
 �e-
 �j-jA�-�A�-�A�-
 ��-
 ��-�A�-�A�-�A�-
 �-
 .�A!.B+.BH.
 )L.
 'Q.Bn.)Bx.)B�.
 N�.
 L�.8B�.PB�.PB�.
 s�.
 q�._B/wB/wB//
 �3/
 �8/�BU/�B_/�B|/
 ��/
 ��/�B�/�B�/�B�/
 ��/
 ��/�B�/�B�/
" 0
" 0
 	0
 0
 E 0
 ?)0
"�60
 �:0
 �C0�FM0�Fj0
 rn0
 ps0�F�0G�0G�0
 ��0
 ��0"G�0DG�0
"��0
 ��0
 �1
"�1
 �1
 r 1DG*1DGG1
 K1
 T1
 AX1
 ;]1UG�1`G�1`G�1
 ��1
 ��1
 ��1
 ��1qG�1�G�1�G2
 2
 2
 A2
 ?%2
 o)2
 m.2�GE2�U2�Gm2�H�2�H�2;I�2]�2�F�2C]�2G3Co
38G3C�&3'C73CVG3QCQ3
"@
^3
"@
g3
 �k3
 �t3fC~3fC�3
 ��3
 ��3uC�3hE�3
"�
�3�H�3
  �3
 �3�H4�H#4I84yEM4C�^4�Ey4C��4�E�4�E�4
"�
�4
"�
�4
 Z�4
 V�4�E�4C��4�E�4C�5�E#5C�-5FH5C�R5"Fm5C�w5PF�5]��5\F�5�H�5]C�5C��5H�5C��5�C�5�C6�C*6
 �.6
 �760DL6
 �P6
 �\6�Ff6�F�6
 4 �6
 2 �6�F�6�F�6�F�6�@�6C�7�@7�@#7C-7�@B7C+L7�@a7C=k70A�7CN�7VA�7Cb�7qA�7}A�7Cw�7�A�7C��7�A8�A8�A#8C�-8�AB8C�L8BY8$Bn8C�x8?B�8KB�8C��8fB�8rB�8C��8�B�8�B�8C�8�B	9�B9C*(9�B=9C@G9�D_9�Dl9�D�9C��9E�9C�95E�9RE�9`E�9EI�9
$K7:
$�14:
$+F:
$�1S:
$�a:
$�
~:
$i'�:
$]�:
$}&�:
$�/;
$�3;
$U,?;@@R;
$� Z;0@m;
$$8y; @�;
$,�;@�;
$��;
$#�;�?�;
$��;
$B�;�?	<
$t<
$5!<�?8<
$# H<
$�P<�?g<
$�w<
$�3<p?�<
$g%�<
$�6�<`?�<
$# �<
$*�<P?�<
$8=
 \ =
 X 
=
$,=`Y-=
$@19=
 � ==
 � M=
 !!Q=
 !b=
 �!f=
 �!k=
$A7w=
 ="{=
 /"�=
$< �=
$�*�=
"��=
$�	�=
$�3�=aZ�=
 �"�=
 �"�=iZ>(_ >
$�,>
 �#0>
 �#:>@[D>
"�U>
 ($Y>
 $b>
 ($f>
 $o>
 �$s>
 �$x>
"��>
 �%�>
 �%�>
 0&�>
 &�>
 5'�>
 +'�>
 �'�>
 �'�>
 (�>
 �'�>
 I)�>
 /))?
"�A?]Z?
 W*^?
 S*c?]u?`_�?
 �*�?
 �*�?�_�?�_�?�_�?�c�?
"��?
 �+�?
 �+�?
"�@�c@
"� @
 �+$@
 �+-@
 �+1@
 �+:@
 	,>@
 ,H@�cR@�co@
 1,s@
 /,|@
 W,�@
 U,�@
 },�@
 {,�@�c�@�c�@E[�@t[�@�[A�[#A�[HA�[mA"\�AG\�A�\�A`	�A�\�A�\�A�\B�\&Bb]LBy]YB�]}B�_�B]��B�_�B@`�BS`�B``�Bo`C�`EC�`RC�`_C�`�C�`�C]��Ca�C9a�CC��C�a�C](�C�a�C�aD]�D<b/DC�9DKbFD\bjDtbwDb�D�b�D��D�b�D(c�DGc�DXcEic9Ezc]E�c�E�c�E]��E�c�Ed�E]P�EM^�E
" �E
 �,�E
 �,�EM^F
"0
F
 �,F
 �,FM^$FM^=F
 �,AF
 �,JFM^TFM^mF
 -qF
 -zF
 B-~F
 @-�Fa^�F(�F�a�F�a�F
 h-�F
 f-�F�a�F�aG
 �-G
 �-G
 �-G
 �-G�a)G :G�YRG�YiG�Z�G�Z�G�]�G2^�G�^�G_�G	`�G)`HC�H�`(H�aHH�a`Hb�Hb�H=d�HZd�H
$L�H0;�H
$@1�H
 �-�H
 �-�H
$(I
 *.I
 .
I
$LI
 �.I
 �.I
$< 0I
$�*AI
$A7MI
 a/QI
 Q/bI
 (0fI
 0kI
$�wI
 �0{I
 �0�I
"��I
$�	�I
$�3�I�<�I
 71�I
 31�I�<�I
"��I
$�J
 �1J
 w1J{>$J�>2Ju;?J�;WJ�;wJ�J�;�J�;�J��J<�J@�J!<
K�K=<7K�AK�<RK`	\K�<sK�<�K�<�K�<�K>=�KW=�Ks=�K
L�=$L�3L�=ML�\L�=vL@�L�=�L��L:>�L]��LD>�L�>�L�>M�> MC�*M??MC�IM'?^M]�hM5?�MH?�M
$b�M�:�M
$@1�M
 2�M
 
2�M
;�M
$L�M
 a2�M
 _2�M;N%;N
$	N�95N
$@1AN
 �2EN
 �2JN
$l"VN
 3ZN
 3cN�:mN
"�
~N
 *3�N
 (3�N
"�
�N�:�N
"�N
 O3�N
 M3�N
 u3�N
 s3�N
 �3�N
 �3�N�:�N
"P�N
 �3�N
 �3O
 �3O
 �3O
 4O
 4O�:'O�:HO�9UO�9bO�9oO:�O��O::�O�:�O�:�O�:�O
$D�O
$��O
$@1P
$uP
$�&&P
$3P
$k@P
$kMP
$tZP
$A7�P
$(�P
$L�P
$< �P
$�*�P
$��P
$�"�P
$�	�P
$�3Q
$�Q
$�Q@91Q
$�9Q�LQ
$�TQkQ
$�"wQ
 G4{Q
 94�Q
$�Q
 �4�Q
 �4�Q
$v5�Q
 o5�Q
 c5�Q
$z�Q
 6�Q
 �5�Q
$��Q
 �6�Q
 �6�Q
$��Q
 ^7�Q
 X7�Q
$x�Q
 �7�Q
 �7�QCR]P&RO=R�[R]�eR�|R��R
�R]��R�R
$<�R��R
$��R
 8�R
 �7S
$�"S
 �8S
 �8S
$k,S�6S�SS
 �8WS
 �8`S
 9dS
 
9mS
 69qS
 29vS��S]��S�S3�S<�Sd�S]pTm&T�>T�UT�jTCRtT��T
$��T��T
$��T
 y9�T
 o9�T
$��T
 �9�T
 �9�T
$l"�T
 �:�T
 �:�TU U
 ;$U
 ;-U
 B;1U
 @;:U
 j;>U
 f;CUdU��UX�Us�UC�U
$�7�U
$�U
$g�U
$�1V
$�5V
$tV
$�
,V
$%";V
$�CV�8ZV
$�fV
 �;jV
 �;oV
$x{V
 �;V
 �;�V
$+%�V��V
$��V
 �;�V
 �;�V
$x�V
 *<�V
 $<�V	�V	W
 u<W
 s<W
 �<W
 �<"W
 �<&W
 �<-W
$�5W�LW
$\W
$,hW�	W
$�5�W
 �<�W
 �<�W
 .=�W
 "=�W
$.�W
$�1�W
Xl
0Xs
NX
$�VX�8|X
$M�X
$l"�X
$��X
$��X 7�X
$*�X
 �=�X
 �=�X
$X
�X
 �=�X
 �=Y
$Y
 X>#Y
 T>5YM7TY[7rY�7�Y
$��Y
$*�Y
$�"�Y
$�(�Y
$x�Y
$$�Y
$
�Y
$�2Z
$B"Z�59Z
$ EZ
 �>IZ
 �>NZ
$X
ZZ
 J?^Z
 :?oZ
 @sZ
 �?�Z
 P@�Z
 J@�Z
$��Z
$6�Z
 �@�Z
 �@�ZR6�Zl6�Z�6[�6@[�6^[�6k[�6x[�6�[�6�[
$��[
$@1�[
$��[
$s%�[
$86\�2"\
$@1.\
 �@2\
 �@7\
$C\
 /AG\
 'AL\
$�X\
 �A\\
 �Aa\
$�m\
 �Aq\
 �Av\
$�	�\
 LB�\
 FB�\
 �B�\
 �B�\
"P	�\
 �B�\
 �B�\
"�	�\
 (C�\
 $C�\�3�\
$s%�\
 dC]
 ^C]4]4)]
"�	:]
 �C>]
 �CG]
 �CK]
 �CT]
 +DX]
 )D]]14}]I4�]
"�	�]
 TD�]
 PD�]
 �D�]
 �D�]
 �D�]
 �D�]S4�]33�]�3^
$H^�'&^
$@19^_(C^
"�P^
 �DT^
 �D]^
 )Ea^
 'Ej^
 QEn^
 MEu^
$�6�^�'�^
$@1�^
 �E�^
 �E�^
 �E�^
 �E�^
 KF�^
 CF�^�'�^
$�!�^P'_
$@1"_
 �F&_
 �F6_
 G:_
 �FK_
 kGO_
 cGT_�'q_
$�}_0�_
$+�_
 �G�_
 �G�_
 6H�_
 .H�_
 �H�_
 �H�_
 5I�_
 )I�_
$x�_
 �I�_
 �I`
 �J
`
 �J`{ `
$,`0%C`
$@1O`
 �JS`
 �Jc`
 �Kg`
 �Kx`
 L|`
 L�`
 lL�`
 hL�`
 �L�`
 �L�`
$��`
 �L�`
 �L�`
 9M�`
 5M�`
$��`
 }M�`
 oM�`
"@�`
$�a
 &Na
 Na
$�!a
 �N%a
 �N*a
$D6a
 �N:a
 �N?a
$�Ka
 4OOa
 &OTa
$�`a
 �Oda
 �Oia
$xua
 Pya
 P~ax&�a
 cP�a
 aP�a�&�a
$��a
 �P�a
 �P�a�&�ac&�a
"pb
 �Pb
 �Pb
 Qb
 �P(b
 /Q,b
 -Q2b�&[b�%�bE'�b
$/�b#�b
$@1�b
 ^Q�b
 RQ�b
 �Q�b
 �Q�b
 �R�b
 }Rc
 JSc
 >Sc
 �Sc
 �S!c
$�-c
 NT1c
 BTBc
 �TFc
 �TKc
$�Wc
 5U[c
 #U`c
$$rc�#�c
$��c
 �U�c
 �U�c
$��c
 cV�c
 [V�c
$��c
 �V�c
 �V�c
$x�c
 �V�c
 �V�c�$�c�d�$4d�>d�$Rd$%qd
$�}d �d
$}�d� �d
$@1�d
 EW�d
 3W�d
$�d
 
X�d
 X�d
$+7
e
 4Xe
 0Xe
$x$e
"`;e
"`De
 rXHe
 lXQe
 �XUe
 �X^e
"�ke
 �Xoe
 �Xxe
 RY|e
 JY�e
 �Y�e
 �Y�e
 �Y�e
 �Y�e
 *Z�e
 &Z�e
 dZ�e
 `Z�e
"��e
 �Z�e
 �Z�e
"�e
 �Z�e
 �Z�ee"�e�!fd!(f
$:f
$@1Gf
$_f
$�xf
$��f
$D�f
$��f
$��f
$x�f
$��f
$��f
$@1g
$� g
$�1-g
$xEg
$DRg
$!yg
$�
�g
$��g�(�g
$@1�g
 e[�g
 Y[�g
 �[�g
 �[�g
 o\�g
 g\�g�(h
"�h
 �\h
 �\(h
 ],h
 ]5h
 h]9h
 f]>h
"�Lh
 �]Ph
 �]Zh)qh�(�h!)�h])�h
$5(�hp �h
$@1�h
$�3�h
 �]�h
 �]�h
$Zi
 T^
i
 R^i� i
" *i
 y^.i
 w^7i
 �^;i
 �^Di
 �^Hi
 �^Oi
$~[i2ri
$@1~i
 �^�i
 �^�i
$7�i
 �_�i
 �_�i
 y`�i
 i`�i
$��i
 7a�i
 'a�i
$�3�i
 �a�i
 �a�iU2�i
" 	�i
 �b�i
 �bj
 �bj
 �bj
 �bj
 �bjU26jz2Sj�2zj�2�j
$�,�j
$@1�j
$��j
$�3�j
$x�j
$Z�j
$�.k
$Dk
$U2!k
$�-k`Dk
$@1Pk
 cTk
 cYk
$�ek
 �cik
 �cnk
$Zzk
 �c~k
 �c�k
 dd�k
 Xd�k
$/�k
 
e�k
 e�k��k
"��k
 ne�k
 je�k
 �e�k
 �e�k�l l
"�l
 �e!l
 �e*l
 f.l
 f7l
 Af;l
 =f@l
"�Il
 {fMl
 wfVl `l }l
 �f�l
 �f�l
 �f�l
 �f�l
 �f�l
 �f�l �l! �l
$(�l��l
$@1m
 *gm
  g	m
$�m
 �gm
 �gm
$Z*m
 h.m
 h3m
$?m
 thCm
 jhTm
 �hXm
 �h]m
$�,im
 (imm
  irm
$�~m
 �i�m
 �i�m
$��m
 �i�m
 �i�m
$��m
 �j�m
 �j�m
 �j�m
 �j�m��m
" �m
 k�m
 k�m
 Tk�m
 Pk�m
 �kn
 �kn�$n�Cn(Mn(jn
 �knn
 �ksn(�n
 l�n
 �k�n4�n��n
$��n��n
$@1�n
 Tl�n
 Hlo�o�+o
 �l/o
 �l4o�No
 mRo
 mWo�no
$�/�o
$@1�o
$�o
$��o0�o
$@1�o
$E+�o
 ;m�o
 7m�o
 zm�o
 tmp
$Up�(p
$@14p
 �m8p
 �m=p�JpWpdp&rp
$4zp��p
$@1�p
 #n�p
 n�p��p
"��p
 qn�p
 on�p
 �n�p
 �n�p
$M�p�/q
$@1
q
 �nq
 �nq�/.q�/Fq�/fq!0{q
$a4�q�.�q
$@1�q
 Do�q
 8o�q#/�qP/�qX/�qm/	r
$27r�W,r
$@18r
 �o<r
 �oAr
$�1cr
$.xrY�r
"P�r
 wp�r
 up�rY�r
"`�r
 �p�r
 �p�rY�rY�r
 �p�r
 �p�rY�rYs
 �ps
 �p$s
 q(s
 q-s$Y>s(Qs�WisX�sFX�sX�s�X�s�X�s�Xt�XtKY9tUYGt
$;St`jt
$@1zt
$�
�tp�t��t��t
$�)�t��t
$@1�t
 Eq�t
 ;q�t
 �qu
 �qu
$�u
 Mru
 Kru(u
"9u
 rr=u
 prFu
 �rJu
 �rYu3cu
"@tu
 �rxu
 �r�u
 �r�u
 �r�u
"@�u
 
s�u
 	s�u<�u��u��u
 Es�u
 Cs�u�
v�0v�Cv]Mv
"�^v
 jsbv
 hskv
 �sov
 �stvd�vCo�v��v��v=�vOwmw�&w
$[0.w�Tw
$�`w�sw
$�{w��w
$[�w��w
"��w
$��w
 �s�w
 �s�w��w��w�w�x x�<x�Xxmx�|x�x3�xCy�xK�xC��x
$�	�x
$@1�x
$Dy
$�7"y
$u@y
$�!_y
$8my
$a2�y
$��y
$ �y
$:�y
$@1�y
$!z
$}z
$+7z
$x+z
$k=z
$@1Jz
$�Xz
$<jz
$@1�z
$��z
$��z
$+�z
$��z
$��z
$@1�z
$�
{
$${
$�${
$~01{
$�O{
$]a{
$@1�{
$��{
$9�{
$+�{
$�	�{,�{
$@1�{
 �s|
 �s|
 Pt|
 Ht&|
 �t*|
 �t;|
 �t?|
 �tD|
$U|H,p|�,�|]�|�,�|C��|�,�|
$�
�|
$@1	}
$�'%}
$�7}
$@1D}
$$R}[}
$�1i}� �}
$�6�}+�}
$@1�}
 Yu�}
 Qu�}
$g�}
 �u�}
 �u�}
$m�}
 %v�}
 v�}
$�4~
 uv~
 qv#~q+-~
"�>~
 �vB~
 �vK~
 �vO~
 �vY~�+�~C��~;+�~E+�~[+�~c+�~�+�~�+�~�+
$$�$
${	6
$�+\
$�{
$�.�
$�
�
$@1�
$!�
$��
$x�
$��
$@14�
$�A�
$xP�
$s^�
$@1w�
$���
$%)��
$}$���
̀
$�0؀
 w܀
 w�
$��
 jw�
 fw��
$+7�
$x�
 �w�
 �w�
$m,&�
 x*�
 
x/�
$�;�
 Sx?�
 GxD�
$�	P�
 �xT�
 �xZ�
$Z(x�
$�1��
$���
$�0��
$/
��
$�́
$��
$x�
$�3��
$}�
$�&�0	=�
$@1I�
 �yM�
 �yR�
$�^�
 Fzb�
 @zq�
 �zu�
 �zz�H	��
$@3��
$@1ł
$�ׂ
$@1�
$��
$���
$\�
$,*�
$�7�
$!Q�
$�,p�
$1��
$���
$b#ă
$@1҃
$y��
$2
��	,�
 �z0�
 �z5�
$�$A�
 �{E�
 �{V�
 &|Z�
  |_��	���	��
$�6��
$�3��
$\҄
$!܄
$�#�0��
$�)�
 w|�
 o|�
$@,�
 �| �
 �|5�`X��p�������
$.)��Ѕ
$i-؅��
$P
�
$�3�@,�
$�8�
 E}<�
 =}A�
$�M�
 �}Q�
 �}V�Vn�w��C[��
$`+��@��
$�ʆ
 ~Ά
 ~ކ
 �~�
 �~�
 \�
 H
�
$��
 6��
 0�.�0e��o�
"P�
 ����
 ����
 ����
 ����
 ܀��
 ڀ���̇]ۇc�c�
 ��
 ���
 /��
 -��
 W��
 U�$��N�C"Y�Bv�O��S��
"���
 ~���
 z���
 ��ˆ
 ��ˈ
 �ψ
 �ԈX������
 �#�
 �,�
 G�0�
 E�9�
 n�=�
 l�B��j�C2~������
"���
 ����
 ����
 ����
 ��ĉ
 �ȉ
 �͉���C8��
"�
 "�#�
  �,�
 P�0�
 N�5�)K�CF\��i�w�
$|��
$@1��
$p��
$�-��
$�/��
$�ˊ
$>܊
$j�
$�/�
$�0�
$�+�
$W!�
$s*�
$o7�
$�H�
$W!T�
$sa�
$�r�
$W!~�
$b3��
$o��
$�.��
$W!��
$s��
$o͋
$"
ދ
$W!�
$s��
$o�
$@�
$# �
$�,�
$�0?�
$TP�
$#\�
$�j�
$��
$���
$���
$5��
$.֌
$��
$T��
$�	�
$T�
$=-(�
$j5�
$n7I�
$\Z�
$f�
$e&t�
$51��
$�-��
$�/��
$�-���ύ
 ��Ӎ
 t�܍
 ��
 ��
 H��
 B�����
"
�
 ���
 ���
 ��
 �'�
 @�+�
 <�0�
"09�
 |�=�
 v�F��P��m�
 Džq�
 Ņz�
 �~�
 ���
 ���
 �������Ŏ0
�@
�@
�
 6��
 4�!�G
9�Q
L�w
V�w
v��
��
 c���
 Y���
 ߆��
 Ն��
 [���
 Q���
 ه��
 ͇ŏ
 m�ɏ
 a�ҏ
 ��֏
 ���
��e��+��5�
"`B��P��g��y����
 [���
 S���
 ����
 ����
 &���
 �Đ
 ��Ȑ
 ���
 ��
 ��
 X��
 R���'�'$�
 ��(�
 ��1�
 ʋ5�
 ȋ>�
 �B�
 �G�<l��v�
"���
 ,���
 *���
 S���
 Q���
 z���
 v����ϑFّ
"��
 ���
 ���N�x �
"1�
 ٌ5�
 ׌>�
 �B�
 ��K�
 (�O�
 $�Y��c�
"Pt�
 e�x�
 a���
 ����
 ����
 ͍��
 ˍ�������
"�˒
 �ϒ
 �ؒ
 �ܒ
 ��
�k
��(�C2�P��{�������9��ؓ
 C�ܓ
 ?��
"��
"�$�
 ��(�
 |�1�
 V�5�
 J�>�
 �B�
 ؏K�
 v�O�
 p�X�
"�e�
 ��i�
 ��r�
 �v�
 �{����z”�ؔ���)�
 �	�
 	��
 ���
 ���
 ?�#�
 1�T��)^��){�
 ��
 ޒ��
 5���
 1���
 q���
 m����)��
 ����
 ��ɕ
 ԓ͕
 ̓֕
 <�ڕ
 4��
 ���
 ���
 Ô�
 ���{*�
" *�
 �.�
 �7�
 "�;�
  �D�
 H�H�
 F�Q�
 n�U�
 l�Z�
" h�
 ��l�
 ��u�
 Εy�
 ̕~��*��D*��
"p��
 ��Ö
 �̖
 0�Ж
 .�ٖ
 V�ݖ
 T���)���*��*8��*J��,e�
 ��i�
 y�|��,��
"���
 ����
 y���
 
���
 ���
 ����
 ����
"�̗
 M�З
 G�ٗ
 ��ݗ
 ���-�
"@�
 ԙ�
 ҙ�
 ���
 ���
-7�{-A�{-^�
 #�b�
 �k�
 ^�o�
 \�t�{-��
 ����
 �����-��r-Ҙ].ߘ�.��.���-	�
"p�
 ���
 ��#�
"p,�
 �0�
 ��9��-C��-`�
 ��d�
 ��m�
 ��q�
 ��v��-���-���-��<.ۙC.�R.��.%�]X;�x.E�x.b�
 ٛf�
 ӛk�x.���.��]8���.��00ך
 1�ۚ
 %��
 ɜ�
 ���
 ����
 �"��0,�
"�=�
 0�A�
 (�J�
 ��N�
 ��W�
 �[�
 �`�
"�i�
 B�m�
 6�v�
 ɟz�
 ş��
 	���
 ����
 ����
 {���
 ���
 ���
 J���
 D����0ƛ
"�ܛ
 ���
 ���
 ���
 �����1��1�
 �"�
 �+�
 �/�
 �8�
 /�<�
 -�A��1d�c1|��1���1���4��
 `�Ü
 R�̜
 	�М
 ��ٜ
 ��ݜ
 ���
"
�
 /���
 #�
�5#�
 ��'�
 ��1�>5J�
 F�N�
 @�S�g5l�q5v�
"P
��
 ����
 ����
 ����
 ����
 ���
 ޥ���5ǝ7�
 ��
 ��
 ]��
 W��7=��7X�
 ��\�
 ��e�
 �i�
 �r�
 ��v�
 ����7��
"�
��
 ?���
 5���
 ����
 ����
 3���
 -����7֞8�'8�68��@8�8(��KC�
 ��G�
 |�P�
 <�T�
 :�b�,Ll�
"�}�
 c���
 _���
 ����
 ����
 ת��
 Ӫ��
"���
 ���
 
���0L��0Lݟ
 I��
 G��
 n��
 l���
 ����
 ���=L!�HL4��L>�
" O�
 ��S�
 ��X�
" a�
 �e�
 �n�
 2�r�
 *�{��L���L��
 ����
 ����
 ����
 �����LѠ
 ۬ՠ
 ٬�8M�8M�
 ��
 ���
 %��
 #�!�
 J�%�
 H�*�@M?�
 q�C�
 m�L�@MV�@Ms�
 ��w�
 ����
 ��
 ̭��
 ���
 ���NM��YMʡ�Mԡ
"��
  ��
 ��
 ����
 ����
"��
 ��
 ��
 ^��
 T�'��M1��MN�
 ϯR�
 ͯ[�
 �_�
 �h�
 �l�
 �q��M���M���M��
 D���
 B���
 i���
 g�Ȣ
 ��̢
 ��Ѣ�M�
 ���
 ����M�N�N<�
 ް@�
 ܰI�
 �M�
 �V�
 +�Z�
 )�_�Ny�!N��!N��
 S���
 Q���
 x���
 v���
 ����
 ����!Nԣ
 ȱأ
 Ʊݣ8N�yO
�
"�
 ��"�
 �'�
"0�
 ��4�
 ��=�
 �A�
 �J��O_�
 @�c�
 >�l�
 e�p�
 c�|�OP��OP��
 ����
 ����OP��
 ��Ť
 ��ΤOPؤ
"0�
 Գ�
 ҳ�
"0��
 ����
 ���
 "��
  ��kP!�
"p2�
 G�6�
 E�;�
"pD�
 n�H�
 l�Q�
 ��U�
 ��`�yPj�
"�{�
 ���
 ����
"���
 ���
 ߴ��
 
���
 ����P��
"ĥ
 C�ȥ
 A�ͥ
"֥
 j�ڥ
 h��
 ���
 ����P��
"`
�
 ���
 ���
"`�
 ޵#�
 ܵ,�
 �0�
 �;��PE�
"�V�
 +�Z�
 )�_�
"�h�
 R�l�
 P�u�
 {�y�
 w����P��
"��
 ����
 ����
"��
 ۶��
 ٶ��
 �¦
 �ͦ�Pצ
"`�
 (��
 &��
"`��
 O���
 M��
 v��
 t���P �
"�-�
 ��1�
 ��6�
"�?�
 ÷C�
 ��L�
 �P�
 �]�Q{�Q��
 '���
 #���"Q��
 a���
 _�ç
 ��ǧ
 ��Ч3Qڧ3Q�
 ����
 ����3Q�
 ݸ�
 ۸�
 �"�
 �.�bQC�
 +�G�
 %�P�
 x�T�
 v�]��Qg�
"�x�
 ��|�
 ����
"���
 ۹��
 ׹��
 ���
 ����Q��
"0¨
"0Ш
 :�Ԩ
 8�ߨ�Q�
"p��
"p	�
 _�
�
 ]���Q"�
"�0�
"�>�
 ��B�
 ��P�\UZ�\Uw�
 ��{�
 ����\U��
 �
 ̺��iU���UթpN��N�P)�C�3�0VQ�C6[�/Wu�]���vR��vR��
 ���
 ���
 �ê
 �ȪvRݪ
 =��
 ;���R��R�
"�'�
 j�+�
 `�0�
"�9�
 �=�
 ٻF�
 ��J�
 ~�S�
 ��W�
 ��`�
 (�d�
 �m�
 ��q�
 ��z�
 	�~�
 ���
 E���
 ?���_S��
"p��
 ����
 ����
 ����
 ��ɫ
 ߾ͫ
 ۾֫
 �ګ
 ��
 C��
 =��
"���S�
" "�
 ��&�
 ��/�
 ��3�
 ��<�
 �@�
 �F��S^��S���S���SǬTѬ
"`�
 ��
 ��
 ���
 ����
 ��
 �	�
 6�
�
 (��
"��
 ��
 �(�
 *�,�
 �5��U?�
"�U�
 �Y�
 ��b�
"�t�
 x�x�
 r���hW��hW��
 ����
 ����hW­�W��� �3T&�hW=�]�R��U\��Uu�V��V��]���
TϮ\T�yT��T��T6��UN�AV[�iVh��V��C����V���V��C�ɯ�V�JW��C���W"�C�3��T@��T[�C�e�Ur��U��]8���U��]pİUΰU�
 ���
 ����
 ���
 ��
 6�	�
 4��U�
".�
 d�2�
 b�;�UE�
" R�
 ��V�
 ��_�Ui�U��
 ����
 ����U��U��
 ����
 ����
 �ñ
 �ȱ5Uٱ(�P
�CT�WU2�C<�
WV�C&m� Pw� P��
 *���
 (���
 T���
 P��� P��
 ��ò
 ��Ȳ.P߲TW�
$��
$��
$�.��
$g�
$�'�
$�'�
$�7�
$�7�
$d$ �
$d$(�
$\,�
$�4�
$b8�
$bA�
$>E�
$dM�
$e!Q�
$e!Z�
$�0^�
$�0g�
$�*k�
$�*s�
$�w�
$���
$v��
$v��
$Q
��
$Q
��
$���
$���
$=+��
$=+��
$���
$���
$(	³
$(	˳
$r)ϳ
$r)س
$ܳ
$�
$�%�
$�%�
$
�
$
��
$q��
$q�
$
	�
$
�
$��
$��
$�/"�
$�/+�
$>#/�
$>#8�
$�%<�
$�%D�
$�H�
$�P�
$�!T�
$�!\�
$�,`�
$�,i�
$Hm�
$Hu�
$u,y�
$u,��
$w*��
$w*��
$.(��
$.(��
$���
$���
$�,��
$�,��
$C-��
$���
$�ô
$�̴
$=д
$=ٴ
$�7ݴ
$�7�
$��
$��
$D4��
$D4��
$�,�
$�,	�
$"
�
$"�
$�
$!�
$�)%�
$�)-�
$Z21�
$Z2:�
$Y>�
$YF�
$�+J�
$�+S�
$_7W�
$_7_�
$Qc�
$Qk�
$V8o�
$V8w�
$�&{�
$�&��
$_$��
$_$��
$1��
$1��
$��
$��
$���
$�ĵ
$�ȵ
$�е
$�/Ե
$�/ܵ
$�
$�
$��
$��
$�2��
$�2�
$�+�
$E"�
$"
�
$�*�
$E"�
$E*�
$9.�
$96�
$�:�
$�B�
$�	F�
$�	O�
$eS�
$e\�
$�`�
$�h�
$�l�
$�t�
$�-x�
$���
$�4��
$�4��
$f*��
$f*��
$S��
$S��
$J��
$�
��
$���
$���
$T��
$Tȶ
$�̶
$�Զ
$�,ض
$�,�
$I�
$I�
$�
$��
$�3��
$�3�
$�
�
$��T��+�'-(�- �3��8]�QC��p(�sCo�vC���]�C",�C2��C85�CF�
�ʿ�I����(
��
�� 4H \0������0L�`0	��	��	��
�\��0
��
$�L��@X��0@X�l���������`p,�@�\0p����` p 4� �#�0%8P'L�'`�'t�(��)�+P	,�	�,�	�.�	�/
00\
2�
�2�4X�5�7� 7��7$�88�8L@9`�9��:�0;
P?
`?(
p?<
�?P
�?d
�?x
�?�
@�
 @�
0@�
@@�
P@`I\�IpJ�K��K4�W|`Y�`d��d.symtab.strtab.shstrtab.rela.text.data.bss.rela.gnu.build.attributes.text.hot.rela.gnu.build.attributes.hot.text.unlikely.rela.gnu.build.attributes.unlikely.text.startup.rela.gnu.build.attributes.startup.text.exit.rela.gnu.build.attributes.exit.rodata.str1.1.rodata.str1.8.rodata.rela.data.rel.local.rela.data.rel.rela.data.rel.ro.local.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.debug_ranges.rela.debug_line.debug_str.comment.text.hot.zzz.text.unlikely.zzz.text.startup.zzz.text.exit.zzz.note.GNU-stack.note.gnu.property.rela.eh_frame.groupP@:�PT:�Pl:�P�:�P�:� ��d@ A@G:&`ep	 ,�n� 6�np"1@`�� :
LP�[P��V@0�0:
u �� ���@`�0:������@��0:��������@��0:2��2��/"�D /@�8 *@��:Dx�?@��:S��� N@��p:kh��f@��\:!wza��
i���@��:$��/0�@�0:&��/`�LJR�@�H:)�0]��8�0�.�A��A�uA�LA� A��A��A��A�A�A�.H� Fh��A@(:8X��4;�	'0WPK	}$[�}AC��-gems/gems/ruby-lsapi-5.6/rails/dispatch.lsapinuȯ��#!/opt/alt/ruby31/bin/ruby

if GC.respond_to?(:copy_on_write_friendly=)
    GC.copy_on_write_friendly = true
end

require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)

# If you're using RubyGems and mod_ruby, this require should be changed to an absolute path one, like:
# "/usr/local/lib/ruby/gems/1.8/gems/rails-0.8.0/lib/dispatcher" -- otherwise performance is severely impaired
require "dispatcher"
require "lsapi"

while LSAPI.accept != nil
	Dispatcher.dispatch
end
PK
}$[lV5���3gems/gems/ruby-lsapi-5.6/examples/lsapi_with_cgi.rbnuȯ��#!/opt/alt/ruby31/bin/ruby

require 'lsapi'
require 'cgi'


while LSAPI.accept != nil
    cgi = CGI.new
    name = cgi['name']
    puts cgi.header
    puts "Hello #{name}! <br> " if name
    puts "You are from #{cgi.remote_addr}<br>"

end
PK
}$[��.�.gems/gems/ruby-lsapi-5.6/examples/testlsapi.rbnuȯ��#!/opt/alt/ruby31/bin/ruby

require 'lsapi'

$count = 0;

while LSAPI.accept != nil
	print "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\nHello World! \##{$count}<br>\r\n"
	ENV.each_pair {|key, value| print "#{key} is #{value}<br>\r\n" }
	$count = $count + 1
end
PK
}$[whf:��&gems/gems/ruby-lsapi-5.6/lsapi.gemspecnu�[���Gem::Specification.new do |s|
  s.name = %q{ruby-lsapi}
  s.version = "5.6"
  s.date = %q{2024-01-22}
  s.description = "This is a ruby extension for fast communication with LiteSpeed Web Server."
  s.summary = %q{A ruby extension for fast communication with LiteSpeed Web Server.}
  s.has_rdoc = false
  s.authors = ["LiteSpeed Technologies Inc."]
  s.email = "info@litespeedtech.com"
  s.homepage = "http://www.litespeedtech.com/"
  s.rubyforge_project = "ruby-lsapi"
  s.files = ["lsapi.gemspec", "README", "examples", "examples/testlsapi.rb", "examples/lsapi_with_cgi.rb", "ext", "ext/lsapi", "ext/lsapi/extconf.rb", "ext/lsapi/lsapidef.h", "ext/lsapi/lsapilib.c", "ext/lsapi/lsapilib.h", "ext/lsapi/lsruby.c", "rails", "rails/dispatch.lsapi", "scripts", "scripts/lsruby_runner.rb", "setup.rb"]
  s.extra_rdoc_files = ["README"]
  s.extensions << "ext/lsapi/extconf.rb"
  s.require_paths << "lib"
end
PK
}$[�^wͱ�gems/gems/ruby-lsapi-5.6/READMEnu�[���
lsapi - LSAPI extension for Ruby
================================

INSTALL
-------

  $ ruby setup.rb config
  $ ruby setup.rb setup
  # ruby setup.rb install

USAGE
-----

General CGI scripts
^^^^^^^^^^^^^^^^^^^
The most efficient way to use LSAPI interface is to modify your CGI scripts. 
You need to add the following code to your CGI scripts:

  require 'lsapi'
  
  while LSAPI.accept != nil

     <your CGI script>
     ...

  end

There is no need to change the way that how CGI environment variables 
are being accessed in your scripts.

You can find some examples under examples/ folder.


Ruby Script Runner
^^^^^^^^^^^^^^^^^^
If you don't want to change your existing Ruby CGI code, you can use our 
Ruby script runner under scripts/ folder. You need to configure 
lsruby_runner.rb as a LSAPI application, then add a script handler 
for "rb" suffix.



Rails dispatcher
^^^^^^^^^^^^^^^^

With Ruby LSAPI, we proudly provide a optimum platform for Rails application
deployment. Ruby LSAPI has the following advantages over other solutions.

  * Easy configuration, deploy a Rails application only take a few clicks
    with our Rails easy configuration
  * Fast startup, the expensive Rails framework initialization only takes
    place once when multiple processes need to be started
  * Resource efficience, ruby processes can be started on demand, idle
    process will be stop.
    
To use LSAPI with Ruby on Rails, please check out our toturial
http://www.litespeedtech.com/support/wiki/doku.php

There are a few environment variables that can be tweaked to tune ruby 
LSAPI process.

* LSAPI_CHILDREN                (default: 0)

LSAPI_CHILDREN controls the maximum number of children processes can be
started by the first ruby process started by web server. When set to <=1,
the first ruby process will handle request by itself, without starting any
child process. When LSAPI_CHILDREN is >1, the LSAPI application is stared in
"Self Managed Mode", which will start children processes based on demand.
With Rails easy configuration, LSAPI_CHILDREN is set to the value of
"Max Connections" by web server, no need to set it explicitly.

Usually, there is no need to set value of LSAPI_CHILDREN over 100 in most
server environment.


* LSAPI_AVOID_FORK              (default: 0)

LSAPI_AVOID_FORK specifies the policy of the internal process manager in
"Self Managed Mode". When set to 0, the internal process manager will stop
and start children process on demand to save system resource. This is
preferred in a shared hosting environment. When set to 1, the internal
process manager will try to avoid freqently stopping and starting children
process. This might be preferred in a dedicate hosting environment.


* LSAPI_EXTRA_CHILDREN          (default: 1/3 of LSAPI_CHILDREN or 0)

LSAPI_EXTRA_CHILDREN controls the maximum number of extra children processes
can be started when some or all existing children processes are in
malfunctioning state. Total number of children processes will be reduced to
LSAPI_CHILDREN level as soon as service is back to normal.
When LSAPI_AVOID_FORK is set to 0, the default value is 1/3 of
LSAPI_CHIDLREN, When LSAPI_AVOID_FORK is set to 1, the default value is 0.


* LSAPI_MAX_REQS                (default value: 10000)

LSAPI_MAX_REQS specifies the maximum number of requests each child
process will handle before it exits automatically. This parameter can
help reducing memory usage when there are memory leaks in the application. 


* LSAPI_MAX_IDLE                (default value: 300 seconds)

In Self Managed Mode, LSAPI_MAX_IDLE controls how long a idle child  
process will wait for a new request before exit. This option help 
releasing system resources taken by idle processes.


* LSAPI_MAX_IDLE_CHILDREN
    (default value: 1/3 of LSAPI_CHILDREN or LSAPI_CHILDREN)

In Self Managed Mode, LSAI_MAX_IDLE_CHILDREN controls how many idle 
children processes are allowed. Excessive idle children processes
will be killed by the parent process.
When LSAPI_AVOID_FORK is set to 0, the default value is 1/3 of
LSAPI_CHIDLREN, When LSAPI_AVOID_FORK is set to 1, the default value
is LSAPI_CHILDREN.


* LSAPI_MAX_PROCESS_TIME        (default value: 300 seconds)

In Self Managed Mode, LSAPI_MAX_PROCESS_TIME controls the maximum 
processing time allowed when processing a request. If a child process
can not finish processing of a request in the given time period, it 
will be killed by the parent process. This option can help getting rid 
of dead or runaway child process.


* LSAPI_PGRP_MAX_IDLE           (default value: FOREVER )

In Self Managed Mode, LSAPI_PGRP_MAX_IDLE controls how long the parent
process will wait before exiting when there is no child process.
This option help releasing system resources taken by an idle parent 
process.


* LSAPI_PPID_NO_CHECK

By default a LSAPI application check the existence of its parent process
and exits automatically if the parent process died. This is to reduce 
orphan process when web server is restarted. However, it is desireable 
to disable this feature, such as when a LSAPI process was started 
manually from command line. LSAPI_PPID_NO_CHECK should be set when 
you want to disable the checking of existence of parent process.


License
-------

LSAPI library code is under BSD license

LSAPI ruby extension code is under Ruby license

* ((<URL:http://www.ruby-lang.org/ja/LICENSE.txt>)) (Japanese)
* ((<URL:http://www.ruby-lang.org/en/LICENSE.txt>)) (English)


Copyright
---------

Copyright (C) 2006 Lite Speed Technologies Inc.


PK
}$[EK�<-M-M gems/gems/json-2.6.1/lib/json.rbnu�[���#frozen_string_literal: false
require 'json/common'

##
# = JavaScript \Object Notation (\JSON)
#
# \JSON is a lightweight data-interchange format.
#
# A \JSON value is one of the following:
# - Double-quoted text:  <tt>"foo"</tt>.
# - Number:  +1+, +1.0+, +2.0e2+.
# - Boolean:  +true+, +false+.
# - Null: +null+.
# - \Array: an ordered list of values, enclosed by square brackets:
#     ["foo", 1, 1.0, 2.0e2, true, false, null]
#
# - \Object: a collection of name/value pairs, enclosed by curly braces;
#   each name is double-quoted text;
#   the values may be any \JSON values:
#     {"a": "foo", "b": 1, "c": 1.0, "d": 2.0e2, "e": true, "f": false, "g": null}
#
# A \JSON array or object may contain nested arrays, objects, and scalars
# to any depth:
#   {"foo": {"bar": 1, "baz": 2}, "bat": [0, 1, 2]}
#   [{"foo": 0, "bar": 1}, ["baz", 2]]
#
# == Using \Module \JSON
#
# To make module \JSON available in your code, begin with:
#   require 'json'
#
# All examples here assume that this has been done.
#
# === Parsing \JSON
#
# You can parse a \String containing \JSON data using
# either of two methods:
# - <tt>JSON.parse(source, opts)</tt>
# - <tt>JSON.parse!(source, opts)</tt>
#
# where
# - +source+ is a Ruby object.
# - +opts+ is a \Hash object containing options
#   that control both input allowed and output formatting.
#
# The difference between the two methods
# is that JSON.parse! omits some checks
# and may not be safe for some +source+ data;
# use it only for data from trusted sources.
# Use the safer method JSON.parse for less trusted sources.
#
# ==== Parsing \JSON Arrays
#
# When +source+ is a \JSON array, JSON.parse by default returns a Ruby \Array:
#   json = '["foo", 1, 1.0, 2.0e2, true, false, null]'
#   ruby = JSON.parse(json)
#   ruby # => ["foo", 1, 1.0, 200.0, true, false, nil]
#   ruby.class # => Array
#
# The \JSON array may contain nested arrays, objects, and scalars
# to any depth:
#   json = '[{"foo": 0, "bar": 1}, ["baz", 2]]'
#   JSON.parse(json) # => [{"foo"=>0, "bar"=>1}, ["baz", 2]]
#
# ==== Parsing \JSON \Objects
#
# When the source is a \JSON object, JSON.parse by default returns a Ruby \Hash:
#   json = '{"a": "foo", "b": 1, "c": 1.0, "d": 2.0e2, "e": true, "f": false, "g": null}'
#   ruby = JSON.parse(json)
#   ruby # => {"a"=>"foo", "b"=>1, "c"=>1.0, "d"=>200.0, "e"=>true, "f"=>false, "g"=>nil}
#   ruby.class # => Hash
#
# The \JSON object may contain nested arrays, objects, and scalars
# to any depth:
#   json = '{"foo": {"bar": 1, "baz": 2}, "bat": [0, 1, 2]}'
#   JSON.parse(json) # => {"foo"=>{"bar"=>1, "baz"=>2}, "bat"=>[0, 1, 2]}
#
# ==== Parsing \JSON Scalars
#
# When the source is a \JSON scalar (not an array or object),
# JSON.parse returns a Ruby scalar.
#
# \String:
#   ruby = JSON.parse('"foo"')
#   ruby # => 'foo'
#   ruby.class # => String
# \Integer:
#   ruby = JSON.parse('1')
#   ruby # => 1
#   ruby.class # => Integer
# \Float:
#   ruby = JSON.parse('1.0')
#   ruby # => 1.0
#   ruby.class # => Float
#   ruby = JSON.parse('2.0e2')
#   ruby # => 200
#   ruby.class # => Float
# Boolean:
#   ruby = JSON.parse('true')
#   ruby # => true
#   ruby.class # => TrueClass
#   ruby = JSON.parse('false')
#   ruby # => false
#   ruby.class # => FalseClass
# Null:
#   ruby = JSON.parse('null')
#   ruby # => nil
#   ruby.class # => NilClass
#
# ==== Parsing Options
#
# ====== Input Options
#
# Option +max_nesting+ (\Integer) specifies the maximum nesting depth allowed;
# defaults to +100+; specify +false+ to disable depth checking.
#
# With the default, +false+:
#   source = '[0, [1, [2, [3]]]]'
#   ruby = JSON.parse(source)
#   ruby # => [0, [1, [2, [3]]]]
# Too deep:
#   # Raises JSON::NestingError (nesting of 2 is too deep):
#   JSON.parse(source, {max_nesting: 1})
# Bad value:
#   # Raises TypeError (wrong argument type Symbol (expected Fixnum)):
#   JSON.parse(source, {max_nesting: :foo})
#
# ---
#
# Option +allow_nan+ (boolean) specifies whether to allow
# NaN, Infinity, and MinusInfinity in +source+;
# defaults to +false+.
#
# With the default, +false+:
#   # Raises JSON::ParserError (225: unexpected token at '[NaN]'):
#   JSON.parse('[NaN]')
#   # Raises JSON::ParserError (232: unexpected token at '[Infinity]'):
#   JSON.parse('[Infinity]')
#   # Raises JSON::ParserError (248: unexpected token at '[-Infinity]'):
#   JSON.parse('[-Infinity]')
# Allow:
#   source = '[NaN, Infinity, -Infinity]'
#   ruby = JSON.parse(source, {allow_nan: true})
#   ruby # => [NaN, Infinity, -Infinity]
#
# ====== Output Options
#
# Option +symbolize_names+ (boolean) specifies whether returned \Hash keys
# should be Symbols;
# defaults to +false+ (use Strings).
#
# With the default, +false+:
#   source = '{"a": "foo", "b": 1.0, "c": true, "d": false, "e": null}'
#   ruby = JSON.parse(source)
#   ruby # => {"a"=>"foo", "b"=>1.0, "c"=>true, "d"=>false, "e"=>nil}
# Use Symbols:
#   ruby = JSON.parse(source, {symbolize_names: true})
#   ruby # => {:a=>"foo", :b=>1.0, :c=>true, :d=>false, :e=>nil}
#
# ---
#
# Option +object_class+ (\Class) specifies the Ruby class to be used
# for each \JSON object;
# defaults to \Hash.
#
# With the default, \Hash:
#   source = '{"a": "foo", "b": 1.0, "c": true, "d": false, "e": null}'
#   ruby = JSON.parse(source)
#   ruby.class # => Hash
# Use class \OpenStruct:
#   ruby = JSON.parse(source, {object_class: OpenStruct})
#   ruby # => #<OpenStruct a="foo", b=1.0, c=true, d=false, e=nil>
#
# ---
#
# Option +array_class+ (\Class) specifies the Ruby class to be used
# for each \JSON array;
# defaults to \Array.
#
# With the default, \Array:
#   source = '["foo", 1.0, true, false, null]'
#   ruby = JSON.parse(source)
#   ruby.class # => Array
# Use class \Set:
#   ruby = JSON.parse(source, {array_class: Set})
#   ruby # => #<Set: {"foo", 1.0, true, false, nil}>
#
# ---
#
# Option +create_additions+ (boolean) specifies whether to use \JSON additions in parsing.
# See {\JSON Additions}[#module-JSON-label-JSON+Additions].
#
# === Generating \JSON
#
# To generate a Ruby \String containing \JSON data,
# use method <tt>JSON.generate(source, opts)</tt>, where
# - +source+ is a Ruby object.
# - +opts+ is a \Hash object containing options
#   that control both input allowed and output formatting.
#
# ==== Generating \JSON from Arrays
#
# When the source is a Ruby \Array, JSON.generate returns
# a \String containing a \JSON array:
#   ruby = [0, 's', :foo]
#   json = JSON.generate(ruby)
#   json # => '[0,"s","foo"]'
#
# The Ruby \Array array may contain nested arrays, hashes, and scalars
# to any depth:
#   ruby = [0, [1, 2], {foo: 3, bar: 4}]
#   json = JSON.generate(ruby)
#   json # => '[0,[1,2],{"foo":3,"bar":4}]'
#
# ==== Generating \JSON from Hashes
#
# When the source is a Ruby \Hash, JSON.generate returns
# a \String containing a \JSON object:
#   ruby = {foo: 0, bar: 's', baz: :bat}
#   json = JSON.generate(ruby)
#   json # => '{"foo":0,"bar":"s","baz":"bat"}'
#
# The Ruby \Hash array may contain nested arrays, hashes, and scalars
# to any depth:
#   ruby = {foo: [0, 1], bar: {baz: 2, bat: 3}, bam: :bad}
#   json = JSON.generate(ruby)
#   json # => '{"foo":[0,1],"bar":{"baz":2,"bat":3},"bam":"bad"}'
#
# ==== Generating \JSON from Other Objects
#
# When the source is neither an \Array nor a \Hash,
# the generated \JSON data depends on the class of the source.
#
# When the source is a Ruby \Integer or \Float, JSON.generate returns
# a \String containing a \JSON number:
#   JSON.generate(42) # => '42'
#   JSON.generate(0.42) # => '0.42'
#
# When the source is a Ruby \String, JSON.generate returns
# a \String containing a \JSON string (with double-quotes):
#   JSON.generate('A string') # => '"A string"'
#
# When the source is +true+, +false+ or +nil+, JSON.generate returns
# a \String containing the corresponding \JSON token:
#   JSON.generate(true) # => 'true'
#   JSON.generate(false) # => 'false'
#   JSON.generate(nil) # => 'null'
#
# When the source is none of the above, JSON.generate returns
# a \String containing a \JSON string representation of the source:
#   JSON.generate(:foo) # => '"foo"'
#   JSON.generate(Complex(0, 0)) # => '"0+0i"'
#   JSON.generate(Dir.new('.')) # => '"#<Dir>"'
#
# ==== Generating Options
#
# ====== Input Options
#
# Option +allow_nan+ (boolean) specifies whether
# +NaN+, +Infinity+, and <tt>-Infinity</tt> may be generated;
# defaults to +false+.
#
# With the default, +false+:
#   # Raises JSON::GeneratorError (920: NaN not allowed in JSON):
#   JSON.generate(JSON::NaN)
#   # Raises JSON::GeneratorError (917: Infinity not allowed in JSON):
#   JSON.generate(JSON::Infinity)
#   # Raises JSON::GeneratorError (917: -Infinity not allowed in JSON):
#   JSON.generate(JSON::MinusInfinity)
#
# Allow:
#   ruby = [Float::NaN, Float::Infinity, Float::MinusInfinity]
#   JSON.generate(ruby, allow_nan: true) # => '[NaN,Infinity,-Infinity]'
#
# ---
#
# Option +max_nesting+ (\Integer) specifies the maximum nesting depth
# in +obj+; defaults to +100+.
#
# With the default, +100+:
#   obj = [[[[[[0]]]]]]
#   JSON.generate(obj) # => '[[[[[[0]]]]]]'
#
# Too deep:
#   # Raises JSON::NestingError (nesting of 2 is too deep):
#   JSON.generate(obj, max_nesting: 2)
#
# ====== Output Options
#
# The default formatting options generate the most compact
# \JSON data, all on one line and with no whitespace.
#
# You can use these formatting options to generate
# \JSON data in a more open format, using whitespace.
# See also JSON.pretty_generate.
#
# - Option +array_nl+ (\String) specifies a string (usually a newline)
#   to be inserted after each \JSON array; defaults to the empty \String, <tt>''</tt>.
# - Option +object_nl+ (\String) specifies a string (usually a newline)
#   to be inserted after each \JSON object; defaults to the empty \String, <tt>''</tt>.
# - Option +indent+ (\String) specifies the string (usually spaces) to be
#   used for indentation; defaults to the empty \String, <tt>''</tt>;
#   defaults to the empty \String, <tt>''</tt>;
#   has no effect unless options +array_nl+ or +object_nl+ specify newlines.
# - Option +space+ (\String) specifies a string (usually a space) to be
#   inserted after the colon in each \JSON object's pair;
#   defaults to the empty \String, <tt>''</tt>.
# - Option +space_before+ (\String) specifies a string (usually a space) to be
#   inserted before the colon in each \JSON object's pair;
#   defaults to the empty \String, <tt>''</tt>.
#
# In this example, +obj+ is used first to generate the shortest
# \JSON data (no whitespace), then again with all formatting options
# specified:
#
#   obj = {foo: [:bar, :baz], bat: {bam: 0, bad: 1}}
#   json = JSON.generate(obj)
#   puts 'Compact:', json
#   opts = {
#     array_nl: "\n",
#     object_nl: "\n",
#     indent: '  ',
#     space_before: ' ',
#     space: ' '
#   }
#   puts 'Open:', JSON.generate(obj, opts)
#
# Output:
#   Compact:
#   {"foo":["bar","baz"],"bat":{"bam":0,"bad":1}}
#   Open:
#   {
#     "foo" : [
#       "bar",
#       "baz"
#   ],
#     "bat" : {
#       "bam" : 0,
#       "bad" : 1
#     }
#   }
#
# == \JSON Additions
#
# When you "round trip" a non-\String object from Ruby to \JSON and back,
# you have a new \String, instead of the object you began with:
#   ruby0 = Range.new(0, 2)
#   json = JSON.generate(ruby0)
#   json # => '0..2"'
#   ruby1 = JSON.parse(json)
#   ruby1 # => '0..2'
#   ruby1.class # => String
#
# You can use \JSON _additions_ to preserve the original object.
# The addition is an extension of a ruby class, so that:
# - \JSON.generate stores more information in the \JSON string.
# - \JSON.parse, called with option +create_additions+,
#   uses that information to create a proper Ruby object.
#
# This example shows a \Range being generated into \JSON
# and parsed back into Ruby, both without and with
# the addition for \Range:
#   ruby = Range.new(0, 2)
#   # This passage does not use the addition for Range.
#   json0 = JSON.generate(ruby)
#   ruby0 = JSON.parse(json0)
#   # This passage uses the addition for Range.
#   require 'json/add/range'
#   json1 = JSON.generate(ruby)
#   ruby1 = JSON.parse(json1, create_additions: true)
#   # Make a nice display.
#   display = <<EOT
#   Generated JSON:
#     Without addition:  #{json0} (#{json0.class})
#     With addition:     #{json1} (#{json1.class})
#   Parsed JSON:
#     Without addition:  #{ruby0.inspect} (#{ruby0.class})
#     With addition:     #{ruby1.inspect} (#{ruby1.class})
#   EOT
#   puts display
#
# This output shows the different results:
#   Generated JSON:
#     Without addition:  "0..2" (String)
#     With addition:     {"json_class":"Range","a":[0,2,false]} (String)
#   Parsed JSON:
#     Without addition:  "0..2" (String)
#     With addition:     0..2 (Range)
#
# The \JSON module includes additions for certain classes.
# You can also craft custom additions.
# See {Custom \JSON Additions}[#module-JSON-label-Custom+JSON+Additions].
#
# === Built-in Additions
#
# The \JSON module includes additions for certain classes.
# To use an addition, +require+ its source:
# - BigDecimal: <tt>require 'json/add/bigdecimal'</tt>
# - Complex: <tt>require 'json/add/complex'</tt>
# - Date: <tt>require 'json/add/date'</tt>
# - DateTime: <tt>require 'json/add/date_time'</tt>
# - Exception: <tt>require 'json/add/exception'</tt>
# - OpenStruct: <tt>require 'json/add/ostruct'</tt>
# - Range: <tt>require 'json/add/range'</tt>
# - Rational: <tt>require 'json/add/rational'</tt>
# - Regexp: <tt>require 'json/add/regexp'</tt>
# - Set: <tt>require 'json/add/set'</tt>
# - Struct: <tt>require 'json/add/struct'</tt>
# - Symbol: <tt>require 'json/add/symbol'</tt>
# - Time: <tt>require 'json/add/time'</tt>
#
# To reduce punctuation clutter, the examples below
# show the generated \JSON via +puts+, rather than the usual +inspect+,
#
# \BigDecimal:
#   require 'json/add/bigdecimal'
#   ruby0 = BigDecimal(0) # 0.0
#   json = JSON.generate(ruby0) # {"json_class":"BigDecimal","b":"27:0.0"}
#   ruby1 = JSON.parse(json, create_additions: true) # 0.0
#   ruby1.class # => BigDecimal
#
# \Complex:
#   require 'json/add/complex'
#   ruby0 = Complex(1+0i) # 1+0i
#   json = JSON.generate(ruby0) # {"json_class":"Complex","r":1,"i":0}
#   ruby1 = JSON.parse(json, create_additions: true) # 1+0i
#   ruby1.class # Complex
#
# \Date:
#   require 'json/add/date'
#   ruby0 = Date.today # 2020-05-02
#   json = JSON.generate(ruby0) # {"json_class":"Date","y":2020,"m":5,"d":2,"sg":2299161.0}
#   ruby1 = JSON.parse(json, create_additions: true) # 2020-05-02
#   ruby1.class # Date
#
# \DateTime:
#   require 'json/add/date_time'
#   ruby0 = DateTime.now # 2020-05-02T10:38:13-05:00
#   json = JSON.generate(ruby0) # {"json_class":"DateTime","y":2020,"m":5,"d":2,"H":10,"M":38,"S":13,"of":"-5/24","sg":2299161.0}
#   ruby1 = JSON.parse(json, create_additions: true) # 2020-05-02T10:38:13-05:00
#   ruby1.class # DateTime
#
# \Exception (and its subclasses including \RuntimeError):
#   require 'json/add/exception'
#   ruby0 = Exception.new('A message') # A message
#   json = JSON.generate(ruby0) # {"json_class":"Exception","m":"A message","b":null}
#   ruby1 = JSON.parse(json, create_additions: true) # A message
#   ruby1.class # Exception
#   ruby0 = RuntimeError.new('Another message') # Another message
#   json = JSON.generate(ruby0) # {"json_class":"RuntimeError","m":"Another message","b":null}
#   ruby1 = JSON.parse(json, create_additions: true) # Another message
#   ruby1.class # RuntimeError
#
# \OpenStruct:
#   require 'json/add/ostruct'
#   ruby0 = OpenStruct.new(name: 'Matz', language: 'Ruby') # #<OpenStruct name="Matz", language="Ruby">
#   json = JSON.generate(ruby0) # {"json_class":"OpenStruct","t":{"name":"Matz","language":"Ruby"}}
#   ruby1 = JSON.parse(json, create_additions: true) # #<OpenStruct name="Matz", language="Ruby">
#   ruby1.class # OpenStruct
#
# \Range:
#   require 'json/add/range'
#   ruby0 = Range.new(0, 2) # 0..2
#   json = JSON.generate(ruby0) # {"json_class":"Range","a":[0,2,false]}
#   ruby1 = JSON.parse(json, create_additions: true) # 0..2
#   ruby1.class # Range
#
# \Rational:
#   require 'json/add/rational'
#   ruby0 = Rational(1, 3) # 1/3
#   json = JSON.generate(ruby0) # {"json_class":"Rational","n":1,"d":3}
#   ruby1 = JSON.parse(json, create_additions: true) # 1/3
#   ruby1.class # Rational
#
# \Regexp:
#   require 'json/add/regexp'
#   ruby0 = Regexp.new('foo') # (?-mix:foo)
#   json = JSON.generate(ruby0) # {"json_class":"Regexp","o":0,"s":"foo"}
#   ruby1 = JSON.parse(json, create_additions: true) # (?-mix:foo)
#   ruby1.class # Regexp
#
# \Set:
#   require 'json/add/set'
#   ruby0 = Set.new([0, 1, 2]) # #<Set: {0, 1, 2}>
#   json = JSON.generate(ruby0) # {"json_class":"Set","a":[0,1,2]}
#   ruby1 = JSON.parse(json, create_additions: true) # #<Set: {0, 1, 2}>
#   ruby1.class # Set
#
# \Struct:
#   require 'json/add/struct'
#   Customer = Struct.new(:name, :address) # Customer
#   ruby0 = Customer.new("Dave", "123 Main") # #<struct Customer name="Dave", address="123 Main">
#   json = JSON.generate(ruby0) # {"json_class":"Customer","v":["Dave","123 Main"]}
#   ruby1 = JSON.parse(json, create_additions: true) # #<struct Customer name="Dave", address="123 Main">
#   ruby1.class # Customer
#
# \Symbol:
#   require 'json/add/symbol'
#   ruby0 = :foo # foo
#   json = JSON.generate(ruby0) # {"json_class":"Symbol","s":"foo"}
#   ruby1 = JSON.parse(json, create_additions: true) # foo
#   ruby1.class # Symbol
#
# \Time:
#   require 'json/add/time'
#   ruby0 = Time.now # 2020-05-02 11:28:26 -0500
#   json = JSON.generate(ruby0) # {"json_class":"Time","s":1588436906,"n":840560000}
#   ruby1 = JSON.parse(json, create_additions: true) # 2020-05-02 11:28:26 -0500
#   ruby1.class # Time
#
#
# === Custom \JSON Additions
#
# In addition to the \JSON additions provided,
# you can craft \JSON additions of your own,
# either for Ruby built-in classes or for user-defined classes.
#
# Here's a user-defined class +Foo+:
#   class Foo
#     attr_accessor :bar, :baz
#     def initialize(bar, baz)
#       self.bar = bar
#       self.baz = baz
#     end
#   end
#
# Here's the \JSON addition for it:
#   # Extend class Foo with JSON addition.
#   class Foo
#     # Serialize Foo object with its class name and arguments
#     def to_json(*args)
#       {
#         JSON.create_id  => self.class.name,
#         'a'             => [ bar, baz ]
#       }.to_json(*args)
#     end
#     # Deserialize JSON string by constructing new Foo object with arguments.
#     def self.json_create(object)
#       new(*object['a'])
#     end
#   end
#
# Demonstration:
#   require 'json'
#   # This Foo object has no custom addition.
#   foo0 = Foo.new(0, 1)
#   json0 = JSON.generate(foo0)
#   obj0 = JSON.parse(json0)
#   # Lood the custom addition.
#   require_relative 'foo_addition'
#   # This foo has the custom addition.
#   foo1 = Foo.new(0, 1)
#   json1 = JSON.generate(foo1)
#   obj1 = JSON.parse(json1, create_additions: true)
#   #   Make a nice display.
#   display = <<EOT
#   Generated JSON:
#     Without custom addition:  #{json0} (#{json0.class})
#     With custom addition:     #{json1} (#{json1.class})
#   Parsed JSON:
#     Without custom addition:  #{obj0.inspect} (#{obj0.class})
#     With custom addition:     #{obj1.inspect} (#{obj1.class})
#   EOT
#   puts display
#
# Output:
#
#   Generated JSON:
#     Without custom addition:  "#<Foo:0x0000000006534e80>" (String)
#     With custom addition:     {"json_class":"Foo","a":[0,1]} (String)
#   Parsed JSON:
#     Without custom addition:  "#<Foo:0x0000000006534e80>" (String)
#     With custom addition:     #<Foo:0x0000000006473bb8 @bar=0, @baz=1> (Foo)
#
module JSON
  require 'json/version'

  begin
    require 'json/ext'
  rescue LoadError
    require 'json/pure'
  end
end
PK
}$[��..(gems/gems/json-2.6.1/lib/json/version.rbnu�[���# frozen_string_literal: false
module JSON
  # JSON version
  VERSION         = '2.6.1'
  VERSION_ARRAY   = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
  VERSION_MAJOR   = VERSION_ARRAY[0] # :nodoc:
  VERSION_MINOR   = VERSION_ARRAY[1] # :nodoc:
  VERSION_BUILD   = VERSION_ARRAY[2] # :nodoc:
end
PK
}$[1z���$gems/gems/json-2.6.1/lib/json/ext.rbnu�[���require 'json/common'

module JSON
  # This module holds all the modules/classes that implement JSON's
  # functionality as C extensions.
  module Ext
    require 'json/ext/parser'
    require 'json/ext/generator'
    $DEBUG and warn "Using Ext extension for JSON."
    JSON.parser = Parser
    JSON.generator = Generator
  end

  JSON_LOADED = true unless defined?(::JSON::JSON_LOADED)
end
PK
}$[E��”�/gems/gems/json-2.6.1/lib/json/generic_object.rbnu�[���#frozen_string_literal: false
require 'ostruct'

module JSON
  class GenericObject < OpenStruct
    class << self
      alias [] new

      def json_creatable?
        @json_creatable
      end

      attr_writer :json_creatable

      def json_create(data)
        data = data.dup
        data.delete JSON.create_id
        self[data]
      end

      def from_hash(object)
        case
        when object.respond_to?(:to_hash)
          result = new
          object.to_hash.each do |key, value|
            result[key] = from_hash(value)
          end
          result
        when object.respond_to?(:to_ary)
          object.to_ary.map { |a| from_hash(a) }
        else
          object
        end
      end

      def load(source, proc = nil, opts = {})
        result = ::JSON.load(source, proc, opts.merge(:object_class => self))
        result.nil? ? new : result
      end

      def dump(obj, *args)
        ::JSON.dump(obj, *args)
      end
    end
    self.json_creatable = false

    def to_hash
      table
    end

    def [](name)
      __send__(name)
    end unless method_defined?(:[])

    def []=(name, value)
      __send__("#{name}=", value)
    end unless method_defined?(:[]=)

    def |(other)
      self.class[other.to_hash.merge(to_hash)]
    end

    def as_json(*)
      { JSON.create_id => self.class.name }.merge to_hash
    end

    def to_json(*a)
      as_json.to_json(*a)
    end
  end
end
PK
}$[ҍ��iSiS'gems/gems/json-2.6.1/lib/json/common.rbnu�[���#frozen_string_literal: false
require 'json/version'
require 'json/generic_object'

module JSON
  class << self
    # :call-seq:
    #   JSON[object] -> new_array or new_string
    #
    # If +object+ is a \String,
    # calls JSON.parse with +object+ and +opts+ (see method #parse):
    #   json = '[0, 1, null]'
    #   JSON[json]# => [0, 1, nil]
    #
    # Otherwise, calls JSON.generate with +object+ and +opts+ (see method #generate):
    #   ruby = [0, 1, nil]
    #   JSON[ruby] # => '[0,1,null]'
    def [](object, opts = {})
      if object.respond_to? :to_str
        JSON.parse(object.to_str, opts)
      else
        JSON.generate(object, opts)
      end
    end

    # Returns the JSON parser class that is used by JSON. This is either
    # JSON::Ext::Parser or JSON::Pure::Parser:
    #   JSON.parser # => JSON::Ext::Parser
    attr_reader :parser

    # Set the JSON parser class _parser_ to be used by JSON.
    def parser=(parser) # :nodoc:
      @parser = parser
      remove_const :Parser if const_defined?(:Parser, false)
      const_set :Parser, parser
    end

    # Return the constant located at _path_. The format of _path_ has to be
    # either ::A::B::C or A::B::C. In any case, A has to be located at the top
    # level (absolute namespace path?). If there doesn't exist a constant at
    # the given path, an ArgumentError is raised.
    def deep_const_get(path) # :nodoc:
      path.to_s.split(/::/).inject(Object) do |p, c|
        case
        when c.empty?                  then p
        when p.const_defined?(c, true) then p.const_get(c)
        else
          begin
            p.const_missing(c)
          rescue NameError => e
            raise ArgumentError, "can't get const #{path}: #{e}"
          end
        end
      end
    end

    # Set the module _generator_ to be used by JSON.
    def generator=(generator) # :nodoc:
      old, $VERBOSE = $VERBOSE, nil
      @generator = generator
      generator_methods = generator::GeneratorMethods
      for const in generator_methods.constants
        klass = deep_const_get(const)
        modul = generator_methods.const_get(const)
        klass.class_eval do
          instance_methods(false).each do |m|
            m.to_s == 'to_json' and remove_method m
          end
          include modul
        end
      end
      self.state = generator::State
      const_set :State, self.state
      const_set :SAFE_STATE_PROTOTYPE, State.new # for JRuby
      const_set :FAST_STATE_PROTOTYPE, create_fast_state
      const_set :PRETTY_STATE_PROTOTYPE, create_pretty_state
    ensure
      $VERBOSE = old
    end

    def create_fast_state
      State.new(
        :indent         => '',
        :space          => '',
        :object_nl      => "",
        :array_nl       => "",
        :max_nesting    => false
      )
    end

    def create_pretty_state
      State.new(
        :indent         => '  ',
        :space          => ' ',
        :object_nl      => "\n",
        :array_nl       => "\n"
      )
    end

    # Returns the JSON generator module that is used by JSON. This is
    # either JSON::Ext::Generator or JSON::Pure::Generator:
    #   JSON.generator # => JSON::Ext::Generator
    attr_reader :generator

    # Sets or Returns the JSON generator state class that is used by JSON. This is
    # either JSON::Ext::Generator::State or JSON::Pure::Generator::State:
    #   JSON.state # => JSON::Ext::Generator::State
    attr_accessor :state
  end

  DEFAULT_CREATE_ID = 'json_class'.freeze
  private_constant :DEFAULT_CREATE_ID

  CREATE_ID_TLS_KEY = "JSON.create_id".freeze
  private_constant :CREATE_ID_TLS_KEY

  # Sets create identifier, which is used to decide if the _json_create_
  # hook of a class should be called; initial value is +json_class+:
  #   JSON.create_id # => 'json_class'
  def self.create_id=(new_value)
    Thread.current[CREATE_ID_TLS_KEY] = new_value.dup.freeze
  end

  # Returns the current create identifier.
  # See also JSON.create_id=.
  def self.create_id
    Thread.current[CREATE_ID_TLS_KEY] || DEFAULT_CREATE_ID
  end

  NaN           = 0.0/0

  Infinity      = 1.0/0

  MinusInfinity = -Infinity

  # The base exception for JSON errors.
  class JSONError < StandardError
    def self.wrap(exception)
      obj = new("Wrapped(#{exception.class}): #{exception.message.inspect}")
      obj.set_backtrace exception.backtrace
      obj
    end
  end

  # This exception is raised if a parser error occurs.
  class ParserError < JSONError; end

  # This exception is raised if the nesting of parsed data structures is too
  # deep.
  class NestingError < ParserError; end

  # :stopdoc:
  class CircularDatastructure < NestingError; end
  # :startdoc:

  # This exception is raised if a generator or unparser error occurs.
  class GeneratorError < JSONError; end
  # For backwards compatibility
  UnparserError = GeneratorError # :nodoc:

  # This exception is raised if the required unicode support is missing on the
  # system. Usually this means that the iconv library is not installed.
  class MissingUnicodeSupport < JSONError; end

  module_function

  # :call-seq:
  #   JSON.parse(source, opts) -> object
  #
  # Returns the Ruby objects created by parsing the given +source+.
  #
  # Argument +source+ contains the \String to be parsed.
  #
  # Argument +opts+, if given, contains a \Hash of options for the parsing.
  # See {Parsing Options}[#module-JSON-label-Parsing+Options].
  #
  # ---
  #
  # When +source+ is a \JSON array, returns a Ruby \Array:
  #   source = '["foo", 1.0, true, false, null]'
  #   ruby = JSON.parse(source)
  #   ruby # => ["foo", 1.0, true, false, nil]
  #   ruby.class # => Array
  #
  # When +source+ is a \JSON object, returns a Ruby \Hash:
  #   source = '{"a": "foo", "b": 1.0, "c": true, "d": false, "e": null}'
  #   ruby = JSON.parse(source)
  #   ruby # => {"a"=>"foo", "b"=>1.0, "c"=>true, "d"=>false, "e"=>nil}
  #   ruby.class # => Hash
  #
  # For examples of parsing for all \JSON data types, see
  # {Parsing \JSON}[#module-JSON-label-Parsing+JSON].
  #
  # Parses nested JSON objects:
  #   source = <<-EOT
  #   {
  #   "name": "Dave",
  #     "age" :40,
  #     "hats": [
  #       "Cattleman's",
  #       "Panama",
  #       "Tophat"
  #     ]
  #   }
  #   EOT
  #   ruby = JSON.parse(source)
  #   ruby # => {"name"=>"Dave", "age"=>40, "hats"=>["Cattleman's", "Panama", "Tophat"]}
  #
  # ---
  #
  # Raises an exception if +source+ is not valid JSON:
  #   # Raises JSON::ParserError (783: unexpected token at ''):
  #   JSON.parse('')
  #
  def parse(source, opts = {})
    Parser.new(source, **(opts||{})).parse
  end

  # :call-seq:
  #   JSON.parse!(source, opts) -> object
  #
  # Calls
  #   parse(source, opts)
  # with +source+ and possibly modified +opts+.
  #
  # Differences from JSON.parse:
  # - Option +max_nesting+, if not provided, defaults to +false+,
  #   which disables checking for nesting depth.
  # - Option +allow_nan+, if not provided, defaults to +true+.
  def parse!(source, opts = {})
    opts = {
      :max_nesting  => false,
      :allow_nan    => true
    }.merge(opts)
    Parser.new(source, **(opts||{})).parse
  end

  # :call-seq:
  #   JSON.load_file(path, opts={}) -> object
  #
  # Calls:
  #   parse(File.read(path), opts)
  #
  # See method #parse.
  def load_file(filespec, opts = {})
    parse(File.read(filespec), opts)
  end

  # :call-seq:
  #   JSON.load_file!(path, opts = {})
  #
  # Calls:
  #   JSON.parse!(File.read(path, opts))
  #
  # See method #parse!
  def load_file!(filespec, opts = {})
    parse!(File.read(filespec), opts)
  end

  # :call-seq:
  #   JSON.generate(obj, opts = nil) -> new_string
  #
  # Returns a \String containing the generated \JSON data.
  #
  # See also JSON.fast_generate, JSON.pretty_generate.
  #
  # Argument +obj+ is the Ruby object to be converted to \JSON.
  #
  # Argument +opts+, if given, contains a \Hash of options for the generation.
  # See {Generating Options}[#module-JSON-label-Generating+Options].
  #
  # ---
  #
  # When +obj+ is an \Array, returns a \String containing a \JSON array:
  #   obj = ["foo", 1.0, true, false, nil]
  #   json = JSON.generate(obj)
  #   json # => '["foo",1.0,true,false,null]'
  #
  # When +obj+ is a \Hash, returns a \String containing a \JSON object:
  #   obj = {foo: 0, bar: 's', baz: :bat}
  #   json = JSON.generate(obj)
  #   json # => '{"foo":0,"bar":"s","baz":"bat"}'
  #
  # For examples of generating from other Ruby objects, see
  # {Generating \JSON from Other Objects}[#module-JSON-label-Generating+JSON+from+Other+Objects].
  #
  # ---
  #
  # Raises an exception if any formatting option is not a \String.
  #
  # Raises an exception if +obj+ contains circular references:
  #   a = []; b = []; a.push(b); b.push(a)
  #   # Raises JSON::NestingError (nesting of 100 is too deep):
  #   JSON.generate(a)
  #
  def generate(obj, opts = nil)
    if State === opts
      state, opts = opts, nil
    else
      state = State.new
    end
    if opts
      if opts.respond_to? :to_hash
        opts = opts.to_hash
      elsif opts.respond_to? :to_h
        opts = opts.to_h
      else
        raise TypeError, "can't convert #{opts.class} into Hash"
      end
      state = state.configure(opts)
    end
    state.generate(obj)
  end

  # :stopdoc:
  # I want to deprecate these later, so I'll first be silent about them, and
  # later delete them.
  alias unparse generate
  module_function :unparse
  # :startdoc:

  # :call-seq:
  #   JSON.fast_generate(obj, opts) -> new_string
  #
  # Arguments +obj+ and +opts+ here are the same as
  # arguments +obj+ and +opts+ in JSON.generate.
  #
  # By default, generates \JSON data without checking
  # for circular references in +obj+ (option +max_nesting+ set to +false+, disabled).
  #
  # Raises an exception if +obj+ contains circular references:
  #   a = []; b = []; a.push(b); b.push(a)
  #   # Raises SystemStackError (stack level too deep):
  #   JSON.fast_generate(a)
  def fast_generate(obj, opts = nil)
    if State === opts
      state, opts = opts, nil
    else
      state = JSON.create_fast_state
    end
    if opts
      if opts.respond_to? :to_hash
        opts = opts.to_hash
      elsif opts.respond_to? :to_h
        opts = opts.to_h
      else
        raise TypeError, "can't convert #{opts.class} into Hash"
      end
      state.configure(opts)
    end
    state.generate(obj)
  end

  # :stopdoc:
  # I want to deprecate these later, so I'll first be silent about them, and later delete them.
  alias fast_unparse fast_generate
  module_function :fast_unparse
  # :startdoc:

  # :call-seq:
  #   JSON.pretty_generate(obj, opts = nil) -> new_string
  #
  # Arguments +obj+ and +opts+ here are the same as
  # arguments +obj+ and +opts+ in JSON.generate.
  #
  # Default options are:
  #   {
  #     indent: '  ',   # Two spaces
  #     space: ' ',     # One space
  #     array_nl: "\n", # Newline
  #     object_nl: "\n" # Newline
  #   }
  #
  # Example:
  #   obj = {foo: [:bar, :baz], bat: {bam: 0, bad: 1}}
  #   json = JSON.pretty_generate(obj)
  #   puts json
  # Output:
  #   {
  #     "foo": [
  #       "bar",
  #       "baz"
  #     ],
  #     "bat": {
  #       "bam": 0,
  #       "bad": 1
  #     }
  #   }
  #
  def pretty_generate(obj, opts = nil)
    if State === opts
      state, opts = opts, nil
    else
      state = JSON.create_pretty_state
    end
    if opts
      if opts.respond_to? :to_hash
        opts = opts.to_hash
      elsif opts.respond_to? :to_h
        opts = opts.to_h
      else
        raise TypeError, "can't convert #{opts.class} into Hash"
      end
      state.configure(opts)
    end
    state.generate(obj)
  end

  # :stopdoc:
  # I want to deprecate these later, so I'll first be silent about them, and later delete them.
  alias pretty_unparse pretty_generate
  module_function :pretty_unparse
  # :startdoc:

  class << self
    # Sets or returns default options for the JSON.load method.
    # Initially:
    #   opts = JSON.load_default_options
    #   opts # => {:max_nesting=>false, :allow_nan=>true, :allow_blank=>true, :create_additions=>true}
    attr_accessor :load_default_options
  end
  self.load_default_options = {
    :max_nesting      => false,
    :allow_nan        => true,
    :allow_blank       => true,
    :create_additions => true,
  }

  # :call-seq:
  #   JSON.load(source, proc = nil, options = {}) -> object
  #
  # Returns the Ruby objects created by parsing the given +source+.
  #
  # - Argument +source+ must be, or be convertible to, a \String:
  #   - If +source+ responds to instance method +to_str+,
  #     <tt>source.to_str</tt> becomes the source.
  #   - If +source+ responds to instance method +to_io+,
  #     <tt>source.to_io.read</tt> becomes the source.
  #   - If +source+ responds to instance method +read+,
  #     <tt>source.read</tt> becomes the source.
  #   - If both of the following are true, source becomes the \String <tt>'null'</tt>:
  #     - Option +allow_blank+ specifies a truthy value.
  #     - The source, as defined above, is +nil+ or the empty \String <tt>''</tt>.
  #   - Otherwise, +source+ remains the source.
  # - Argument +proc+, if given, must be a \Proc that accepts one argument.
  #   It will be called recursively with each result (depth-first order).
  #   See details below.
  #   BEWARE: This method is meant to serialise data from trusted user input,
  #   like from your own database server or clients under your control, it could
  #   be dangerous to allow untrusted users to pass JSON sources into it.
  # - Argument +opts+, if given, contains a \Hash of options for the parsing.
  #   See {Parsing Options}[#module-JSON-label-Parsing+Options].
  #   The default options can be changed via method JSON.load_default_options=.
  #
  # ---
  #
  # When no +proc+ is given, modifies +source+ as above and returns the result of
  # <tt>parse(source, opts)</tt>;  see #parse.
  #
  # Source for following examples:
  #   source = <<-EOT
  #   {
  #   "name": "Dave",
  #     "age" :40,
  #     "hats": [
  #       "Cattleman's",
  #       "Panama",
  #       "Tophat"
  #     ]
  #   }
  #   EOT
  #
  # Load a \String:
  #   ruby = JSON.load(source)
  #   ruby # => {"name"=>"Dave", "age"=>40, "hats"=>["Cattleman's", "Panama", "Tophat"]}
  #
  # Load an \IO object:
  #   require 'stringio'
  #   object = JSON.load(StringIO.new(source))
  #   object # => {"name"=>"Dave", "age"=>40, "hats"=>["Cattleman's", "Panama", "Tophat"]}
  #
  # Load a \File object:
  #   path = 't.json'
  #   File.write(path, source)
  #   File.open(path) do |file|
  #     JSON.load(file)
  #   end # => {"name"=>"Dave", "age"=>40, "hats"=>["Cattleman's", "Panama", "Tophat"]}
  #
  # ---
  #
  # When +proc+ is given:
  # - Modifies +source+ as above.
  # - Gets the +result+ from calling <tt>parse(source, opts)</tt>.
  # - Recursively calls <tt>proc(result)</tt>.
  # - Returns the final result.
  #
  # Example:
  #   require 'json'
  #
  #   # Some classes for the example.
  #   class Base
  #     def initialize(attributes)
  #       @attributes = attributes
  #     end
  #   end
  #   class User    < Base; end
  #   class Account < Base; end
  #   class Admin   < Base; end
  #   # The JSON source.
  #   json = <<-EOF
  #   {
  #     "users": [
  #         {"type": "User", "username": "jane", "email": "jane@example.com"},
  #         {"type": "User", "username": "john", "email": "john@example.com"}
  #     ],
  #     "accounts": [
  #         {"account": {"type": "Account", "paid": true, "account_id": "1234"}},
  #         {"account": {"type": "Account", "paid": false, "account_id": "1235"}}
  #     ],
  #     "admins": {"type": "Admin", "password": "0wn3d"}
  #   }
  #   EOF
  #   # Deserializer method.
  #   def deserialize_obj(obj, safe_types = %w(User Account Admin))
  #     type = obj.is_a?(Hash) && obj["type"]
  #     safe_types.include?(type) ? Object.const_get(type).new(obj) : obj
  #   end
  #   # Call to JSON.load
  #   ruby = JSON.load(json, proc {|obj|
  #     case obj
  #     when Hash
  #       obj.each {|k, v| obj[k] = deserialize_obj v }
  #     when Array
  #       obj.map! {|v| deserialize_obj v }
  #     end
  #   })
  #   pp ruby
  # Output:
  #   {"users"=>
  #      [#<User:0x00000000064c4c98
  #        @attributes=
  #          {"type"=>"User", "username"=>"jane", "email"=>"jane@example.com"}>,
  #        #<User:0x00000000064c4bd0
  #        @attributes=
  #          {"type"=>"User", "username"=>"john", "email"=>"john@example.com"}>],
  #    "accounts"=>
  #      [{"account"=>
  #          #<Account:0x00000000064c4928
  #          @attributes={"type"=>"Account", "paid"=>true, "account_id"=>"1234"}>},
  #       {"account"=>
  #          #<Account:0x00000000064c4680
  #          @attributes={"type"=>"Account", "paid"=>false, "account_id"=>"1235"}>}],
  #    "admins"=>
  #      #<Admin:0x00000000064c41f8
  #      @attributes={"type"=>"Admin", "password"=>"0wn3d"}>}
  #
  def load(source, proc = nil, options = {})
    opts = load_default_options.merge options
    if source.respond_to? :to_str
      source = source.to_str
    elsif source.respond_to? :to_io
      source = source.to_io.read
    elsif source.respond_to?(:read)
      source = source.read
    end
    if opts[:allow_blank] && (source.nil? || source.empty?)
      source = 'null'
    end
    result = parse(source, opts)
    recurse_proc(result, &proc) if proc
    result
  end

  # Recursively calls passed _Proc_ if the parsed data structure is an _Array_ or _Hash_
  def recurse_proc(result, &proc) # :nodoc:
    case result
    when Array
      result.each { |x| recurse_proc x, &proc }
      proc.call result
    when Hash
      result.each { |x, y| recurse_proc x, &proc; recurse_proc y, &proc }
      proc.call result
    else
      proc.call result
    end
  end

  alias restore load
  module_function :restore

  class << self
    # Sets or returns the default options for the JSON.dump method.
    # Initially:
    #   opts = JSON.dump_default_options
    #   opts # => {:max_nesting=>false, :allow_nan=>true, :escape_slash=>false}
    attr_accessor :dump_default_options
  end
  self.dump_default_options = {
    :max_nesting => false,
    :allow_nan   => true,
    :escape_slash => false,
  }

  # :call-seq:
  #   JSON.dump(obj, io = nil, limit = nil)
  #
  # Dumps +obj+ as a \JSON string, i.e. calls generate on the object and returns the result.
  #
  # The default options can be changed via method JSON.dump_default_options.
  #
  # - Argument +io+, if given, should respond to method +write+;
  #   the \JSON \String is written to +io+, and +io+ is returned.
  #   If +io+ is not given, the \JSON \String is returned.
  # - Argument +limit+, if given, is passed to JSON.generate as option +max_nesting+.
  #
  # ---
  #
  # When argument +io+ is not given, returns the \JSON \String generated from +obj+:
  #   obj = {foo: [0, 1], bar: {baz: 2, bat: 3}, bam: :bad}
  #   json = JSON.dump(obj)
  #   json # => "{\"foo\":[0,1],\"bar\":{\"baz\":2,\"bat\":3},\"bam\":\"bad\"}"
  #
  # When argument +io+ is given, writes the \JSON \String to +io+ and returns +io+:
  #   path = 't.json'
  #   File.open(path, 'w') do |file|
  #     JSON.dump(obj, file)
  #   end # => #<File:t.json (closed)>
  #   puts File.read(path)
  # Output:
  #   {"foo":[0,1],"bar":{"baz":2,"bat":3},"bam":"bad"}
  def dump(obj, anIO = nil, limit = nil)
    if anIO and limit.nil?
      anIO = anIO.to_io if anIO.respond_to?(:to_io)
      unless anIO.respond_to?(:write)
        limit = anIO
        anIO = nil
      end
    end
    opts = JSON.dump_default_options
    opts = opts.merge(:max_nesting => limit) if limit
    result = generate(obj, opts)
    if anIO
      anIO.write result
      anIO
    else
      result
    end
  rescue JSON::NestingError
    raise ArgumentError, "exceed depth limit"
  end

  # Encodes string using String.encode.
  def self.iconv(to, from, string)
    string.encode(to, from)
  end
end

module ::Kernel
  private

  # Outputs _objs_ to STDOUT as JSON strings in the shortest form, that is in
  # one line.
  def j(*objs)
    objs.each do |obj|
      puts JSON::generate(obj, :allow_nan => true, :max_nesting => false)
    end
    nil
  end

  # Outputs _objs_ to STDOUT as JSON strings in a pretty format, with
  # indentation and over many lines.
  def jj(*objs)
    objs.each do |obj|
      puts JSON::pretty_generate(obj, :allow_nan => true, :max_nesting => false)
    end
    nil
  end

  # If _object_ is string-like, parse the string and return the parsed result as
  # a Ruby data structure. Otherwise, generate a JSON text from the Ruby data
  # structure object and return it.
  #
  # The _opts_ argument is passed through to generate/parse respectively. See
  # generate and parse for their documentation.
  def JSON(object, *args)
    if object.respond_to? :to_str
      JSON.parse(object.to_str, args.first)
    else
      JSON.generate(object, args.first)
    end
  end
end

# Extends any Class to include _json_creatable?_ method.
class ::Class
  # Returns true if this class can be used to create an instance
  # from a serialised JSON string. The class has to implement a class
  # method _json_create_ that expects a hash as first parameter. The hash
  # should include the required data.
  def json_creatable?
    respond_to?(:json_create)
  end
end
PK
}$[Px���-gems/gems/json-2.6.1/lib/json/add/rational.rbnu�[���#frozen_string_literal: false
unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
  require 'json'
end

class Rational
  # Deserializes JSON string by converting numerator value <tt>n</tt>,
  # denominator value <tt>d</tt>, to a Rational object.
  def self.json_create(object)
    Rational(object['n'], object['d'])
  end

  # Returns a hash, that will be turned into a JSON object and represent this
  # object.
  def as_json(*)
    {
      JSON.create_id => self.class.name,
      'n'            => numerator,
      'd'            => denominator,
    }
  end

  # Stores class name (Rational) along with numerator value <tt>n</tt> and denominator value <tt>d</tt> as JSON string
  def to_json(*args)
    as_json.to_json(*args)
  end
end
PK
}$[�k�.gems/gems/json-2.6.1/lib/json/add/exception.rbnu�[���#frozen_string_literal: false
unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
  require 'json'
end

class Exception

  # Deserializes JSON string by constructing new Exception object with message
  # <tt>m</tt> and backtrace <tt>b</tt> serialized with <tt>to_json</tt>
  def self.json_create(object)
    result = new(object['m'])
    result.set_backtrace object['b']
    result
  end

  # Returns a hash, that will be turned into a JSON object and represent this
  # object.
  def as_json(*)
    {
      JSON.create_id => self.class.name,
      'm'            => message,
      'b'            => backtrace,
    }
  end

  # Stores class name (Exception) with message <tt>m</tt> and backtrace array
  # <tt>b</tt> as JSON string
  def to_json(*args)
    as_json.to_json(*args)
  end
end
PK
}$[���!!(gems/gems/json-2.6.1/lib/json/add/set.rbnu�[���unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
  require 'json'
end
defined?(::Set) or require 'set'

class Set
  # Import a JSON Marshalled object.
  #
  # method used for JSON marshalling support.
  def self.json_create(object)
    new object['a']
  end

  # Marshal the object to JSON.
  #
  # method used for JSON marshalling support.
  def as_json(*)
    {
      JSON.create_id => self.class.name,
      'a'            => to_a,
    }
  end

  # return the JSON value
  def to_json(*args)
    as_json.to_json(*args)
  end
end

PK
}$[��ff+gems/gems/json-2.6.1/lib/json/add/symbol.rbnu�[���#frozen_string_literal: false
unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
  require 'json'
end

class Symbol
  # Returns a hash, that will be turned into a JSON object and represent this
  # object.
  def as_json(*)
    {
      JSON.create_id => self.class.name,
      's'            => to_s,
    }
  end

  # Stores class name (Symbol) with String representation of Symbol as a JSON string.
  def to_json(*a)
    as_json.to_json(*a)
  end

  # Deserializes JSON string by converting the <tt>string</tt> value stored in the object to a Symbol
  def self.json_create(o)
    o['s'].to_sym
  end
end
PK
}$[ȅ����,gems/gems/json-2.6.1/lib/json/add/complex.rbnu�[���#frozen_string_literal: false
unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
  require 'json'
end

class Complex

  # Deserializes JSON string by converting Real value <tt>r</tt>, imaginary
  # value <tt>i</tt>, to a Complex object.
  def self.json_create(object)
    Complex(object['r'], object['i'])
  end

  # Returns a hash, that will be turned into a JSON object and represent this
  # object.
  def as_json(*)
    {
      JSON.create_id => self.class.name,
      'r'            => real,
      'i'            => imag,
    }
  end

  # Stores class name (Complex) along with real value <tt>r</tt> and imaginary value <tt>i</tt> as JSON string
  def to_json(*args)
    as_json.to_json(*args)
  end
end
PK
}$[�m��qq)gems/gems/json-2.6.1/lib/json/add/date.rbnu�[���#frozen_string_literal: false
unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
  require 'json'
end
require 'date'

class Date

  # Deserializes JSON string by converting Julian year <tt>y</tt>, month
  # <tt>m</tt>, day <tt>d</tt> and Day of Calendar Reform <tt>sg</tt> to Date.
  def self.json_create(object)
    civil(*object.values_at('y', 'm', 'd', 'sg'))
  end

  alias start sg unless method_defined?(:start)

  # Returns a hash, that will be turned into a JSON object and represent this
  # object.
  def as_json(*)
    {
      JSON.create_id => self.class.name,
      'y' => year,
      'm' => month,
      'd' => day,
      'sg' => start,
    }
  end

  # Stores class name (Date) with Julian year <tt>y</tt>, month <tt>m</tt>, day
  # <tt>d</tt> and Day of Calendar Reform <tt>sg</tt> as JSON string
  def to_json(*args)
    as_json.to_json(*args)
  end
end
PK
}$[J��)gems/gems/json-2.6.1/lib/json/add/time.rbnu�[���#frozen_string_literal: false
unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
  require 'json'
end

class Time

  # Deserializes JSON string by converting time since epoch to Time
  def self.json_create(object)
    if usec = object.delete('u') # used to be tv_usec -> tv_nsec
      object['n'] = usec * 1000
    end
    if method_defined?(:tv_nsec)
      at(object['s'], Rational(object['n'], 1000))
    else
      at(object['s'], object['n'] / 1000)
    end
  end

  # Returns a hash, that will be turned into a JSON object and represent this
  # object.
  def as_json(*)
    nanoseconds = [ tv_usec * 1000 ]
    respond_to?(:tv_nsec) and nanoseconds << tv_nsec
    nanoseconds = nanoseconds.max
    {
      JSON.create_id => self.class.name,
      's'            => tv_sec,
      'n'            => nanoseconds,
    }
  end

  # Stores class name (Time) with number of seconds since epoch and number of
  # microseconds for Time as JSON string
  def to_json(*args)
    as_json.to_json(*args)
  end
end
PK
}$[@9%+gems/gems/json-2.6.1/lib/json/add/regexp.rbnu�[���#frozen_string_literal: false
unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
  require 'json'
end

class Regexp

  # Deserializes JSON string by constructing new Regexp object with source
  # <tt>s</tt> (Regexp or String) and options <tt>o</tt> serialized by
  # <tt>to_json</tt>
  def self.json_create(object)
    new(object['s'], object['o'])
  end

  # Returns a hash, that will be turned into a JSON object and represent this
  # object.
  def as_json(*)
    {
      JSON.create_id => self.class.name,
      'o'            => options,
      's'            => source,
    }
  end

  # Stores class name (Regexp) with options <tt>o</tt> and source <tt>s</tt>
  # (Regexp or String) as JSON string
  def to_json(*args)
    as_json.to_json(*args)
  end
end
PK
}$[o���aa/gems/gems/json-2.6.1/lib/json/add/bigdecimal.rbnu�[���#frozen_string_literal: false
unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
  require 'json'
end
defined?(::BigDecimal) or require 'bigdecimal'

class BigDecimal
  # Import a JSON Marshalled object.
  #
  # method used for JSON marshalling support.
  def self.json_create(object)
    BigDecimal._load object['b']
  end

  # Marshal the object to JSON.
  #
  # method used for JSON marshalling support.
  def as_json(*)
    {
      JSON.create_id => self.class.name,
      'b'            => _dump,
    }
  end

  # return the JSON value
  def to_json(*args)
    as_json.to_json(*args)
  end
end
PK
}$[1+Ǔ00.gems/gems/json-2.6.1/lib/json/add/date_time.rbnu�[���#frozen_string_literal: false
unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
  require 'json'
end
require 'date'

class DateTime

  # Deserializes JSON string by converting year <tt>y</tt>, month <tt>m</tt>,
  # day <tt>d</tt>, hour <tt>H</tt>, minute <tt>M</tt>, second <tt>S</tt>,
  # offset <tt>of</tt> and Day of Calendar Reform <tt>sg</tt> to DateTime.
  def self.json_create(object)
    args = object.values_at('y', 'm', 'd', 'H', 'M', 'S')
    of_a, of_b = object['of'].split('/')
    if of_b and of_b != '0'
      args << Rational(of_a.to_i, of_b.to_i)
    else
      args << of_a
    end
    args << object['sg']
    civil(*args)
  end

  alias start sg unless method_defined?(:start)

  # Returns a hash, that will be turned into a JSON object and represent this
  # object.
  def as_json(*)
    {
      JSON.create_id => self.class.name,
      'y' => year,
      'm' => month,
      'd' => day,
      'H' => hour,
      'M' => min,
      'S' => sec,
      'of' => offset.to_s,
      'sg' => start,
    }
  end

  # Stores class name (DateTime) with Julian year <tt>y</tt>, month <tt>m</tt>,
  # day <tt>d</tt>, hour <tt>H</tt>, minute <tt>M</tt>, second <tt>S</tt>,
  # offset <tt>of</tt> and Day of Calendar Reform <tt>sg</tt> as JSON string
  def to_json(*args)
    as_json.to_json(*args)
  end
end


PK
}$[�%��+gems/gems/json-2.6.1/lib/json/add/struct.rbnu�[���#frozen_string_literal: false
unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
  require 'json'
end

class Struct

  # Deserializes JSON string by constructing new Struct object with values
  # <tt>v</tt> serialized by <tt>to_json</tt>.
  def self.json_create(object)
    new(*object['v'])
  end

  # Returns a hash, that will be turned into a JSON object and represent this
  # object.
  def as_json(*)
    klass = self.class.name
    klass.to_s.empty? and raise JSON::JSONError, "Only named structs are supported!"
    {
      JSON.create_id => klass,
      'v'            => values,
    }
  end

  # Stores class name (Struct) with Struct values <tt>v</tt> as a JSON string.
  # Only named structs are supported.
  def to_json(*args)
    as_json.to_json(*args)
  end
end
PK
}$[��a*gems/gems/json-2.6.1/lib/json/add/range.rbnu�[���#frozen_string_literal: false
unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
  require 'json'
end

class Range

  # Deserializes JSON string by constructing new Range object with arguments
  # <tt>a</tt> serialized by <tt>to_json</tt>.
  def self.json_create(object)
    new(*object['a'])
  end

  # Returns a hash, that will be turned into a JSON object and represent this
  # object.
  def as_json(*)
    {
      JSON.create_id  => self.class.name,
      'a'             => [ first, last, exclude_end? ]
    }
  end

  # Stores class name (Range) with JSON array of arguments <tt>a</tt> which
  # include <tt>first</tt> (integer), <tt>last</tt> (integer), and
  # <tt>exclude_end?</tt> (boolean) as JSON string.
  def to_json(*args)
    as_json.to_json(*args)
  end
end
PK
}$[��&a\\)gems/gems/json-2.6.1/lib/json/add/core.rbnu�[���#frozen_string_literal: false
# This file requires the implementations of ruby core's custom objects for
# serialisation/deserialisation.

require 'json/add/date'
require 'json/add/date_time'
require 'json/add/exception'
require 'json/add/range'
require 'json/add/regexp'
require 'json/add/struct'
require 'json/add/symbol'
require 'json/add/time'
PK
}$[��m�,gems/gems/json-2.6.1/lib/json/add/ostruct.rbnu�[���#frozen_string_literal: false
unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
  require 'json'
end
require 'ostruct'

class OpenStruct

  # Deserializes JSON string by constructing new Struct object with values
  # <tt>t</tt> serialized by <tt>to_json</tt>.
  def self.json_create(object)
    new(object['t'] || object[:t])
  end

  # Returns a hash, that will be turned into a JSON object and represent this
  # object.
  def as_json(*)
    klass = self.class.name
    klass.to_s.empty? and raise JSON::JSONError, "Only named structs are supported!"
    {
      JSON.create_id => klass,
      't'            => table,
    }
  end

  # Stores class name (OpenStruct) with this struct's values <tt>t</tt> as a
  # JSON string.
  def to_json(*args)
    as_json.to_json(*args)
  end
end
PK
}$[�C�6cc(gems/gems/bundler-2.3.27/libexec/bundlernuȯ��#!/opt/alt/ruby31/bin/ruby
# frozen_string_literal: true

load File.expand_path("bundle", __dir__)
PK
}$[�w��~~'gems/gems/bundler-2.3.27/libexec/bundlenuȯ��#!/opt/alt/ruby31/bin/ruby
# frozen_string_literal: true

# Exit cleanly from an early interrupt
Signal.trap("INT") do
  Bundler.ui.debug("\n#{caller.join("\n")}") if defined?(Bundler)
  exit 1
end

base_path = File.expand_path("../lib", __dir__)

if File.exist?(base_path)
  require_relative "../lib/bundler"
else
  require "bundler"
end

# Workaround for non-activated bundler spec due to missing https://github.com/rubygems/rubygems/commit/4e306d7bcdee924b8d80ca9db6125aa59ee4e5a3
gem "bundler", Bundler::VERSION if Gem.rubygems_version < Gem::Version.new("2.6.2")

if Gem.rubygems_version < Gem::Version.new("3.2.3") && Gem.ruby_version < Gem::Version.new("2.6.a") && !ENV["BUNDLER_NO_OLD_RUBYGEMS_WARNING"]
  Bundler.ui.warn \
    "Your RubyGems version (#{Gem::VERSION}) has a bug that prevents " \
    "`required_ruby_version` from working for Bundler. Any scripts that use " \
    "`gem install bundler` will break as soon as Bundler drops support for " \
    "your Ruby version. Please upgrade RubyGems to avoid future breakage " \
    "and silence this warning by running `gem update --system 3.2.3`"
end

if File.exist?(base_path)
  require_relative "../lib/bundler/friendly_errors"
else
  require "bundler/friendly_errors"
end

Bundler.with_friendly_errors do
  if File.exist?(base_path)
    require_relative "../lib/bundler/cli"
  else
    require "bundler/cli"
  end

  # Allow any command to use --help flag to show help for that command
  help_flags = %w[--help -h]
  help_flag_used = ARGV.any? {|a| help_flags.include? a }
  args = help_flag_used ? Bundler::CLI.reformatted_help_args(ARGV) : ARGV

  Bundler::CLI.start(args, :debug => true)
end
PK
}$[���=gems/gems/bundler-2.3.27/lib/bundler/environment_preserver.rbnu�[���# frozen_string_literal: true

module Bundler
  class EnvironmentPreserver
    INTENTIONALLY_NIL = "BUNDLER_ENVIRONMENT_PRESERVER_INTENTIONALLY_NIL".freeze
    BUNDLER_KEYS = %w[
      BUNDLE_BIN_PATH
      BUNDLE_GEMFILE
      BUNDLER_VERSION
      GEM_HOME
      GEM_PATH
      MANPATH
      PATH
      RB_USER_INSTALL
      RUBYLIB
      RUBYOPT
    ].map(&:freeze).freeze
    BUNDLER_PREFIX = "BUNDLER_ORIG_".freeze

    def self.from_env
      new(env_to_hash(ENV), BUNDLER_KEYS)
    end

    def self.env_to_hash(env)
      to_hash = env.to_hash
      return to_hash unless Gem.win_platform?

      to_hash.each_with_object({}) {|(k,v), a| a[k.upcase] = v }
    end

    # @param env [Hash]
    # @param keys [Array<String>]
    def initialize(env, keys)
      @original = env
      @keys = keys
      @prefix = BUNDLER_PREFIX
    end

    # Replaces `ENV` with the bundler environment variables backed up
    def replace_with_backup
      unless Gem.win_platform?
        ENV.replace(backup)
        return
      end

      # Fallback logic for Windows below to workaround
      # https://bugs.ruby-lang.org/issues/16798. Can be dropped once all
      # supported rubies include the fix for that.

      ENV.clear

      backup.each {|k, v| ENV[k] = v }
    end

    # @return [Hash]
    def backup
      env = @original.clone
      @keys.each do |key|
        value = env[key]
        if !value.nil? && !value.empty?
          env[@prefix + key] ||= value
        elsif value.nil?
          env[@prefix + key] ||= INTENTIONALLY_NIL
        end
      end
      env
    end

    # @return [Hash]
    def restore
      env = @original.clone
      @keys.each do |key|
        value_original = env[@prefix + key]
        next if value_original.nil? || value_original.empty?
        if value_original == INTENTIONALLY_NIL
          env.delete(key)
        else
          env[key] = value_original
        end
        env.delete(@prefix + key)
      end
      env
    end
  end
end
PK
}$[.z5gems/gems/bundler-2.3.27/lib/bundler/man/bundle-gem.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-GEM" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-gem\fR \- Generate a project skeleton for creating a rubygem
.
.SH "SYNOPSIS"
\fBbundle gem\fR \fIGEM_NAME\fR \fIOPTIONS\fR
.
.SH "DESCRIPTION"
Generates a directory named \fBGEM_NAME\fR with a \fBRakefile\fR, \fBGEM_NAME\.gemspec\fR, and other supporting files and directories that can be used to develop a rubygem with that name\.
.
.P
Run \fBrake \-T\fR in the resulting project for a list of Rake tasks that can be used to test and publish the gem to rubygems\.org\.
.
.P
The generated project skeleton can be customized with OPTIONS, as explained below\. Note that these options can also be specified via Bundler\'s global configuration file using the following names:
.
.IP "\(bu" 4
\fBgem\.coc\fR
.
.IP "\(bu" 4
\fBgem\.mit\fR
.
.IP "\(bu" 4
\fBgem\.test\fR
.
.IP "" 0
.
.SH "OPTIONS"
.
.TP
\fB\-\-exe\fR or \fB\-b\fR or \fB\-\-bin\fR
Specify that Bundler should create a binary executable (as \fBexe/GEM_NAME\fR) in the generated rubygem project\. This binary will also be added to the \fBGEM_NAME\.gemspec\fR manifest\. This behavior is disabled by default\.
.
.TP
\fB\-\-no\-exe\fR
Do not create a binary (overrides \fB\-\-exe\fR specified in the global config)\.
.
.TP
\fB\-\-coc\fR
Add a \fBCODE_OF_CONDUCT\.md\fR file to the root of the generated project\. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\.
.
.TP
\fB\-\-no\-coc\fR
Do not create a \fBCODE_OF_CONDUCT\.md\fR (overrides \fB\-\-coc\fR specified in the global config)\.
.
.TP
\fB\-\-ext\fR
Add boilerplate for C extension code to the generated project\. This behavior is disabled by default\.
.
.TP
\fB\-\-no\-ext\fR
Do not add C extension code (overrides \fB\-\-ext\fR specified in the global config)\.
.
.TP
\fB\-\-mit\fR
Add an MIT license to a \fBLICENSE\.txt\fR file in the root of the generated project\. Your name from the global git config is used for the copyright statement\. If this option is unspecified, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\.
.
.TP
\fB\-\-no\-mit\fR
Do not create a \fBLICENSE\.txt\fR (overrides \fB\-\-mit\fR specified in the global config)\.
.
.TP
\fB\-t\fR, \fB\-\-test=minitest\fR, \fB\-\-test=rspec\fR, \fB\-\-test=test\-unit\fR
Specify the test framework that Bundler should use when generating the project\. Acceptable values are \fBminitest\fR, \fBrspec\fR and \fBtest\-unit\fR\. The \fBGEM_NAME\.gemspec\fR will be configured and a skeleton test/spec directory will be created based on this option\. Given no option is specified:
.
.IP
When Bundler is configured to generate tests, this defaults to Bundler\'s global config setting \fBgem\.test\fR\.
.
.IP
When Bundler is configured to not generate tests, an interactive prompt will be displayed and the answer will be used for the current rubygem project\.
.
.IP
When Bundler is unconfigured, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\.
.
.TP
\fB\-\-ci\fR, \fB\-\-ci=github\fR, \fB\-\-ci=travis\fR, \fB\-\-ci=gitlab\fR, \fB\-\-ci=circle\fR
Specify the continuous integration service that Bundler should use when generating the project\. Acceptable values are \fBgithub\fR, \fBtravis\fR, \fBgitlab\fR and \fBcircle\fR\. A configuration file will be generated in the project directory\. Given no option is specified:
.
.IP
When Bundler is configured to generate CI files, this defaults to Bundler\'s global config setting \fBgem\.ci\fR\.
.
.IP
When Bundler is configured to not generate CI files, an interactive prompt will be displayed and the answer will be used for the current rubygem project\.
.
.IP
When Bundler is unconfigured, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\.
.
.TP
\fB\-\-linter\fR, \fB\-\-linter=rubocop\fR, \fB\-\-linter=standard\fR
Specify the linter and code formatter that Bundler should add to the project\'s development dependencies\. Acceptable values are \fBrubocop\fR and \fBstandard\fR\. A configuration file will be generated in the project directory\. Given no option is specified:
.
.IP
When Bundler is configured to add a linter, this defaults to Bundler\'s global config setting \fBgem\.linter\fR\.
.
.IP
When Bundler is configured not to add a linter, an interactive prompt will be displayed and the answer will be used for the current rubygem project\.
.
.IP
When Bundler is unconfigured, an interactive prompt will be displayed and the answer will be saved in Bundler\'s global config for future \fBbundle gem\fR use\.
.
.TP
\fB\-e\fR, \fB\-\-edit[=EDITOR]\fR
Open the resulting GEM_NAME\.gemspec in EDITOR, or the default editor if not specified\. The default is \fB$BUNDLER_EDITOR\fR, \fB$VISUAL\fR, or \fB$EDITOR\fR\.
.
.SH "SEE ALSO"
.
.IP "\(bu" 4
bundle config(1) \fIbundle\-config\.1\.html\fR
.
.IP "" 0

PK
}$[\'i�TT;gems/gems/bundler-2.3.27/lib/bundler/man/bundle-show.1.ronnnu�[���bundle-show(1) -- Shows all the gems in your bundle, or the path to a gem
=========================================================================

## SYNOPSIS

`bundle show` [GEM]
              [--paths]

## DESCRIPTION

Without the [GEM] option, `show` will print a list of the names and versions of
all gems that are required by your [`Gemfile(5)`][Gemfile(5)], sorted by name.

Calling show with [GEM] will list the exact location of that gem on your
machine.

## OPTIONS

* `--paths`:
  List the paths of all gems that are required by your [`Gemfile(5)`][Gemfile(5)],
  sorted by gem name.
PK
}$[�;���6gems/gems/bundler-2.3.27/lib/bundler/man/bundle-list.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-LIST" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-list\fR \- List all the gems in the bundle
.
.SH "SYNOPSIS"
\fBbundle list\fR [\-\-name\-only] [\-\-paths] [\-\-without\-group=GROUP[ GROUP\.\.\.]] [\-\-only\-group=GROUP[ GROUP\.\.\.]]
.
.SH "DESCRIPTION"
Prints a list of all the gems in the bundle including their version\.
.
.P
Example:
.
.P
bundle list \-\-name\-only
.
.P
bundle list \-\-paths
.
.P
bundle list \-\-without\-group test
.
.P
bundle list \-\-only\-group dev
.
.P
bundle list \-\-only\-group dev test \-\-paths
.
.SH "OPTIONS"
.
.TP
\fB\-\-name\-only\fR
Print only the name of each gem\.
.
.TP
\fB\-\-paths\fR
Print the path to each gem in the bundle\.
.
.TP
\fB\-\-without\-group=<list>\fR
A space\-separated list of groups of gems to skip during printing\.
.
.TP
\fB\-\-only\-group=<list>\fR
A space\-separated list of groups of gems to print\.

PK
}$[�lr]];gems/gems/bundler-2.3.27/lib/bundler/man/bundle-help.1.ronnnu�[���bundle-help(1) -- Displays detailed help for each subcommand
============================================================

## SYNOPSIS

`bundle help` [COMMAND]

## DESCRIPTION

Displays detailed help for the given subcommand.
You can specify a single `COMMAND` at the same time.
When `COMMAND` is omitted, help for `help` command will be displayed.
PK
}$[1�~��?gems/gems/bundler-2.3.27/lib/bundler/man/bundle-binstubs.1.ronnnu�[���bundle-binstubs(1) -- Install the binstubs of the listed gems
=============================================================

## SYNOPSIS

`bundle binstubs` <GEM_NAME> [--force] [--path PATH] [--standalone]

## DESCRIPTION

Binstubs are scripts that wrap around executables. Bundler creates a
small Ruby file (a binstub) that loads Bundler, runs the command,
and puts it into `bin/`. Binstubs are a shortcut-or alternative-
to always using `bundle exec`. This gives you a file that can be run
directly, and one that will always run the correct gem version
used by the application.

For example, if you run `bundle binstubs rspec-core`, Bundler will create
the file `bin/rspec`. That file will contain enough code to load Bundler,
tell it to load the bundled gems, and then run rspec.

This command generates binstubs for executables in `GEM_NAME`.
Binstubs are put into `bin`, or the `--path` directory if one has been set.
Calling binstubs with [GEM [GEM]] will create binstubs for all given gems.

## OPTIONS

* `--force`:
  Overwrite existing binstubs if they exist.

* `--path`:
  The location to install the specified binstubs to. This defaults to `bin`.

* `--standalone`:
  Makes binstubs that can work without depending on Rubygems or Bundler at
  runtime.

* `--shebang`:
  Specify a different shebang executable name than the default (default 'ruby')

* `--all`:
  Create binstubs for all gems in the bundle.
PK
}$[�8:gems/gems/bundler-2.3.27/lib/bundler/man/bundle-gem.1.ronnnu�[���bundle-gem(1) -- Generate a project skeleton for creating a rubygem
====================================================================

## SYNOPSIS

`bundle gem` <GEM_NAME> [OPTIONS]

## DESCRIPTION

Generates a directory named `GEM_NAME` with a `Rakefile`, `GEM_NAME.gemspec`,
and other supporting files and directories that can be used to develop a
rubygem with that name.

Run `rake -T` in the resulting project for a list of Rake tasks that can be used
to test and publish the gem to rubygems.org.

The generated project skeleton can be customized with OPTIONS, as explained
below. Note that these options can also be specified via Bundler's global
configuration file using the following names:

* `gem.coc`
* `gem.mit`
* `gem.test`

## OPTIONS

* `--exe` or `-b` or `--bin`:
  Specify that Bundler should create a binary executable (as `exe/GEM_NAME`)
  in the generated rubygem project. This binary will also be added to the
  `GEM_NAME.gemspec` manifest. This behavior is disabled by default.

* `--no-exe`:
  Do not create a binary (overrides `--exe` specified in the global config).

* `--coc`:
  Add a `CODE_OF_CONDUCT.md` file to the root of the generated project. If
  this option is unspecified, an interactive prompt will be displayed and the
  answer will be saved in Bundler's global config for future `bundle gem` use.

* `--no-coc`:
  Do not create a `CODE_OF_CONDUCT.md` (overrides `--coc` specified in the
  global config).

* `--ext`:
  Add boilerplate for C extension code to the generated project. This behavior
  is disabled by default.

* `--no-ext`:
  Do not add C extension code (overrides `--ext` specified in the global
  config).

* `--mit`:
  Add an MIT license to a `LICENSE.txt` file in the root of the generated
  project. Your name from the global git config is used for the copyright
  statement. If this option is unspecified, an interactive prompt will be
  displayed and the answer will be saved in Bundler's global config for future
  `bundle gem` use.

* `--no-mit`:
  Do not create a `LICENSE.txt` (overrides `--mit` specified in the global
  config).

* `-t`, `--test=minitest`, `--test=rspec`, `--test=test-unit`:
  Specify the test framework that Bundler should use when generating the
  project. Acceptable values are `minitest`, `rspec` and `test-unit`. The
  `GEM_NAME.gemspec` will be configured and a skeleton test/spec directory will
  be created based on this option. Given no option is specified:

  When Bundler is configured to generate tests, this defaults to Bundler's
  global config setting `gem.test`.

  When Bundler is configured to not generate tests, an interactive prompt will
  be displayed and the answer will be used for the current rubygem project.

  When Bundler is unconfigured, an interactive prompt will be displayed and
  the answer will be saved in Bundler's global config for future `bundle gem`
  use.

* `--ci`, `--ci=github`, `--ci=travis`, `--ci=gitlab`, `--ci=circle`:
  Specify the continuous integration service that Bundler should use when
  generating the project. Acceptable values are `github`, `travis`, `gitlab`
  and `circle`. A configuration file will be generated in the project directory.
  Given no option is specified:

  When Bundler is configured to generate CI files, this defaults to Bundler's
  global config setting `gem.ci`.

  When Bundler is configured to not generate CI files, an interactive prompt
  will be displayed and the answer will be used for the current rubygem project.

  When Bundler is unconfigured, an interactive prompt will be displayed and
  the answer will be saved in Bundler's global config for future `bundle gem`
  use.

* `--linter`, `--linter=rubocop`, `--linter=standard`:
  Specify the linter and code formatter that Bundler should add to the
  project's development dependencies. Acceptable values are `rubocop` and
  `standard`. A configuration file will be generated in the project directory.
  Given no option is specified:

  When Bundler is configured to add a linter, this defaults to Bundler's
  global config setting `gem.linter`.

  When Bundler is configured not to add a linter, an interactive prompt
  will be displayed and the answer will be used for the current rubygem project.

  When Bundler is unconfigured, an interactive prompt will be displayed and
  the answer will be saved in Bundler's global config for future `bundle gem`
  use.

* `-e`, `--edit[=EDITOR]`:
  Open the resulting GEM_NAME.gemspec in EDITOR, or the default editor if not
  specified. The default is `$BUNDLER_EDITOR`, `$VISUAL`, or `$EDITOR`.

## SEE ALSO

* [bundle config(1)](bundle-config.1.html)
PK
}$[s��kZZ2gems/gems/bundler-2.3.27/lib/bundler/man/gemfile.5nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "GEMFILE" "5" "October 2022" "" ""
.
.SH "NAME"
\fBGemfile\fR \- A format for describing gem dependencies for Ruby programs
.
.SH "SYNOPSIS"
A \fBGemfile\fR describes the gem dependencies required to execute associated Ruby code\.
.
.P
Place the \fBGemfile\fR in the root of the directory containing the associated code\. For instance, in a Rails application, place the \fBGemfile\fR in the same directory as the \fBRakefile\fR\.
.
.SH "SYNTAX"
A \fBGemfile\fR is evaluated as Ruby code, in a context which makes available a number of methods used to describe the gem requirements\.
.
.SH "GLOBAL SOURCE"
At the top of the \fBGemfile\fR, add a single line for the \fBRubyGems\fR source that contains the gems listed in the \fBGemfile\fR\.
.
.IP "" 4
.
.nf

source "https://rubygems\.org"
.
.fi
.
.IP "" 0
.
.P
You can add only one global source\. In Bundler 1\.13, adding multiple global sources was deprecated\. The \fBsource\fR \fBMUST\fR be a valid RubyGems repository\.
.
.P
To use more than one source of RubyGems, you should use \fI\fBsource\fR block\fR\.
.
.P
A source is checked for gems following the heuristics described in \fISOURCE PRIORITY\fR\.
.
.P
\fBNote about a behavior of the feature deprecated in Bundler 1\.13\fR: If a gem is found in more than one global source, Bundler will print a warning after installing the gem indicating which source was used, and listing the other sources where the gem is available\. A specific source can be selected for gems that need to use a non\-standard repository, suppressing this warning, by using the \fI\fB:source\fR option\fR or \fBsource\fR block\.
.
.SS "CREDENTIALS"
Some gem sources require a username and password\. Use bundle config(1) \fIbundle\-config\.1\.html\fR to set the username and password for any of the sources that need it\. The command must be run once on each computer that will install the Gemfile, but this keeps the credentials from being stored in plain text in version control\.
.
.IP "" 4
.
.nf

bundle config gems\.example\.com user:password
.
.fi
.
.IP "" 0
.
.P
For some sources, like a company Gemfury account, it may be easier to include the credentials in the Gemfile as part of the source URL\.
.
.IP "" 4
.
.nf

source "https://user:password@gems\.example\.com"
.
.fi
.
.IP "" 0
.
.P
Credentials in the source URL will take precedence over credentials set using \fBconfig\fR\.
.
.SH "RUBY"
If your application requires a specific Ruby version or engine, specify your requirements using the \fBruby\fR method, with the following arguments\. All parameters are \fBOPTIONAL\fR unless otherwise specified\.
.
.SS "VERSION (required)"
The version of Ruby that your application requires\. If your application requires an alternate Ruby engine, such as JRuby, TruffleRuby, etc\., this should be the Ruby version that the engine is compatible with\.
.
.IP "" 4
.
.nf

ruby "3\.1\.2"
.
.fi
.
.IP "" 0
.
.SS "ENGINE"
Each application \fImay\fR specify a Ruby engine\. If an engine is specified, an engine version \fImust\fR also be specified\.
.
.P
What exactly is an Engine? \- A Ruby engine is an implementation of the Ruby language\.
.
.IP "\(bu" 4
For background: the reference or original implementation of the Ruby programming language is called Matz\'s Ruby Interpreter \fIhttps://en\.wikipedia\.org/wiki/Ruby_MRI\fR, or MRI for short\. This is named after Ruby creator Yukihiro Matsumoto, also known as Matz\. MRI is also known as CRuby, because it is written in C\. MRI is the most widely used Ruby engine\.
.
.IP "\(bu" 4
Other implementations \fIhttps://www\.ruby\-lang\.org/en/about/\fR of Ruby exist\. Some of the more well\-known implementations include JRuby \fIhttp://jruby\.org/\fR and TruffleRuby \fIhttps://www\.graalvm\.org/ruby/\fR\. Rubinius is an alternative implementation of Ruby written in Ruby\. JRuby is an implementation of Ruby on the JVM, short for Java Virtual Machine\. TruffleRuby is a Ruby implementation on the GraalVM, a language toolkit built on the JVM\.
.
.IP "" 0
.
.SS "ENGINE VERSION"
Each application \fImay\fR specify a Ruby engine version\. If an engine version is specified, an engine \fImust\fR also be specified\. If the engine is "ruby" the engine version specified \fImust\fR match the Ruby version\.
.
.IP "" 4
.
.nf

ruby "2\.6\.8", engine: "jruby", engine_version: "9\.3\.8\.0"
.
.fi
.
.IP "" 0
.
.SS "PATCHLEVEL"
Each application \fImay\fR specify a Ruby patchlevel\. Specifying the patchlevel has been meaningless since Ruby 2\.1\.0 was released as the patchlevel is now uniquely determined by a combination of major, minor, and teeny version numbers\.
.
.P
This option was implemented in Bundler 1\.4\.0 for Ruby 2\.0 or earlier\.
.
.IP "" 4
.
.nf

ruby "3\.1\.2", patchlevel: "20"
.
.fi
.
.IP "" 0
.
.SH "GEMS"
Specify gem requirements using the \fBgem\fR method, with the following arguments\. All parameters are \fBOPTIONAL\fR unless otherwise specified\.
.
.SS "NAME (required)"
For each gem requirement, list a single \fIgem\fR line\.
.
.IP "" 4
.
.nf

gem "nokogiri"
.
.fi
.
.IP "" 0
.
.SS "VERSION"
Each \fIgem\fR \fBMAY\fR have one or more version specifiers\.
.
.IP "" 4
.
.nf

gem "nokogiri", ">= 1\.4\.2"
gem "RedCloth", ">= 4\.1\.0", "< 4\.2\.0"
.
.fi
.
.IP "" 0
.
.SS "REQUIRE AS"
Each \fIgem\fR \fBMAY\fR specify files that should be used when autorequiring via \fBBundler\.require\fR\. You may pass an array with multiple files or \fBtrue\fR if the file you want \fBrequired\fR has the same name as \fIgem\fR or \fBfalse\fR to prevent any file from being autorequired\.
.
.IP "" 4
.
.nf

gem "redis", require: ["redis/connection/hiredis", "redis"]
gem "webmock", require: false
gem "byebug", require: true
.
.fi
.
.IP "" 0
.
.P
The argument defaults to the name of the gem\. For example, these are identical:
.
.IP "" 4
.
.nf

gem "nokogiri"
gem "nokogiri", require: "nokogiri"
gem "nokogiri", require: true
.
.fi
.
.IP "" 0
.
.SS "GROUPS"
Each \fIgem\fR \fBMAY\fR specify membership in one or more groups\. Any \fIgem\fR that does not specify membership in any group is placed in the \fBdefault\fR group\.
.
.IP "" 4
.
.nf

gem "rspec", group: :test
gem "wirble", groups: [:development, :test]
.
.fi
.
.IP "" 0
.
.P
The Bundler runtime allows its two main methods, \fBBundler\.setup\fR and \fBBundler\.require\fR, to limit their impact to particular groups\.
.
.IP "" 4
.
.nf

# setup adds gems to Ruby\'s load path
Bundler\.setup                    # defaults to all groups
require "bundler/setup"          # same as Bundler\.setup
Bundler\.setup(:default)          # only set up the _default_ group
Bundler\.setup(:test)             # only set up the _test_ group (but `not` _default_)
Bundler\.setup(:default, :test)   # set up the _default_ and _test_ groups, but no others

# require requires all of the gems in the specified groups
Bundler\.require                  # defaults to the _default_ group
Bundler\.require(:default)        # identical
Bundler\.require(:default, :test) # requires the _default_ and _test_ groups
Bundler\.require(:test)           # requires the _test_ group
.
.fi
.
.IP "" 0
.
.P
The Bundler CLI allows you to specify a list of groups whose gems \fBbundle install\fR should not install with the \fBwithout\fR configuration\.
.
.P
To specify multiple groups to ignore, specify a list of groups separated by spaces\.
.
.IP "" 4
.
.nf

bundle config set \-\-local without test
bundle config set \-\-local without development test
.
.fi
.
.IP "" 0
.
.P
Also, calling \fBBundler\.setup\fR with no parameters, or calling \fBrequire "bundler/setup"\fR will setup all groups except for the ones you excluded via \fB\-\-without\fR (since they are not available)\.
.
.P
Note that on \fBbundle install\fR, bundler downloads and evaluates all gems, in order to create a single canonical list of all of the required gems and their dependencies\. This means that you cannot list different versions of the same gems in different groups\. For more details, see Understanding Bundler \fIhttps://bundler\.io/rationale\.html\fR\.
.
.SS "PLATFORMS"
If a gem should only be used in a particular platform or set of platforms, you can specify them\. Platforms are essentially identical to groups, except that you do not need to use the \fB\-\-without\fR install\-time flag to exclude groups of gems for other platforms\.
.
.P
There are a number of \fBGemfile\fR platforms:
.
.TP
\fBruby\fR
C Ruby (MRI), Rubinius, or TruffleRuby, but not Windows
.
.TP
\fBmri\fR
C Ruby (MRI) only, but not Windows
.
.TP
\fBwindows\fR
Windows C Ruby (MRI), including RubyInstaller 32\-bit and 64\-bit versions
.
.TP
\fBmswin\fR
Windows C Ruby (MRI), including RubyInstaller 32\-bit versions
.
.TP
\fBmswin64\fR
Windows C Ruby (MRI), including RubyInstaller 64\-bit versions
.
.TP
\fBrbx\fR
Rubinius
.
.TP
\fBjruby\fR
JRuby
.
.TP
\fBtruffleruby\fR
TruffleRuby
.
.P
On platforms \fBruby\fR, \fBmri\fR, \fBmswin\fR, \fBmswin64\fR, and \fBwindows\fR, you may additionally specify a version by appending the major and minor version numbers without a delimiter\. For example, to specify that a gem should only be used on platform \fBruby\fR version 3\.1, use:
.
.IP "" 4
.
.nf

ruby_31
.
.fi
.
.IP "" 0
.
.P
As with groups (above), you may specify one or more platforms:
.
.IP "" 4
.
.nf

gem "weakling",   platforms: :jruby
gem "ruby\-debug", platforms: :mri_31
gem "nokogiri",   platforms: [:windows_31, :jruby]
.
.fi
.
.IP "" 0
.
.P
All operations involving groups (\fBbundle install\fR \fIbundle\-install\.1\.html\fR, \fBBundler\.setup\fR, \fBBundler\.require\fR) behave exactly the same as if any groups not matching the current platform were explicitly excluded\.
.
.SS "FORCE_RUBY_PLATFORM"
If you always want the pure ruby variant of a gem to be chosen over platform specific variants, you can use the \fBforce_ruby_platform\fR option:
.
.IP "" 4
.
.nf

gem "ffi", force_ruby_platform: true
.
.fi
.
.IP "" 0
.
.P
This can be handy (assuming the pure ruby variant works fine) when:
.
.IP "\(bu" 4
You\'re having issues with the platform specific variant\.
.
.IP "\(bu" 4
The platform specific variant does not yet support a newer ruby (and thus has a \fBrequired_ruby_version\fR upper bound), but you still want your Gemfile{\.lock} files to resolve under that ruby\.
.
.IP "" 0
.
.SS "SOURCE"
You can select an alternate RubyGems repository for a gem using the \':source\' option\.
.
.IP "" 4
.
.nf

gem "some_internal_gem", source: "https://gems\.example\.com"
.
.fi
.
.IP "" 0
.
.P
This forces the gem to be loaded from this source and ignores the global source declared at the top level of the file\. If the gem does not exist in this source, it will not be installed\.
.
.P
Bundler will search for child dependencies of this gem by first looking in the source selected for the parent, but if they are not found there, it will fall back on the global source\.
.
.P
\fBNote about a behavior of the feature deprecated in Bundler 1\.13\fR: Selecting a specific source repository this way also suppresses the ambiguous gem warning described above in \fIGLOBAL SOURCE\fR\.
.
.P
Using the \fB:source\fR option for an individual gem will also make that source available as a possible global source for any other gems which do not specify explicit sources\. Thus, when adding gems with explicit sources, it is recommended that you also ensure all other gems in the Gemfile are using explicit sources\.
.
.SS "GIT"
If necessary, you can specify that a gem is located at a particular git repository using the \fB:git\fR parameter\. The repository can be accessed via several protocols:
.
.TP
\fBHTTP(S)\fR
gem "rails", git: "https://github\.com/rails/rails\.git"
.
.TP
\fBSSH\fR
gem "rails", git: "git@github\.com:rails/rails\.git"
.
.TP
\fBgit\fR
gem "rails", git: "git://github\.com/rails/rails\.git"
.
.P
If using SSH, the user that you use to run \fBbundle install\fR \fBMUST\fR have the appropriate keys available in their \fB$HOME/\.ssh\fR\.
.
.P
\fBNOTE\fR: \fBhttp://\fR and \fBgit://\fR URLs should be avoided if at all possible\. These protocols are unauthenticated, so a man\-in\-the\-middle attacker can deliver malicious code and compromise your system\. HTTPS and SSH are strongly preferred\.
.
.P
The \fBgroup\fR, \fBplatforms\fR, and \fBrequire\fR options are available and behave exactly the same as they would for a normal gem\.
.
.P
A git repository \fBSHOULD\fR have at least one file, at the root of the directory containing the gem, with the extension \fB\.gemspec\fR\. This file \fBMUST\fR contain a valid gem specification, as expected by the \fBgem build\fR command\.
.
.P
If a git repository does not have a \fB\.gemspec\fR, bundler will attempt to create one, but it will not contain any dependencies, executables, or C extension compilation instructions\. As a result, it may fail to properly integrate into your application\.
.
.P
If a git repository does have a \fB\.gemspec\fR for the gem you attached it to, a version specifier, if provided, means that the git repository is only valid if the \fB\.gemspec\fR specifies a version matching the version specifier\. If not, bundler will print a warning\.
.
.IP "" 4
.
.nf

gem "rails", "2\.3\.8", git: "https://github\.com/rails/rails\.git"
# bundle install will fail, because the \.gemspec in the rails
# repository\'s master branch specifies version 3\.0\.0
.
.fi
.
.IP "" 0
.
.P
If a git repository does \fBnot\fR have a \fB\.gemspec\fR for the gem you attached it to, a version specifier \fBMUST\fR be provided\. Bundler will use this version in the simple \fB\.gemspec\fR it creates\.
.
.P
Git repositories support a number of additional options\.
.
.TP
\fBbranch\fR, \fBtag\fR, and \fBref\fR
You \fBMUST\fR only specify at most one of these options\. The default is \fBbranch: "master"\fR\. For example:
.
.IP
gem "rails", git: "https://github\.com/rails/rails\.git", branch: "5\-0\-stable"
.
.IP
gem "rails", git: "https://github\.com/rails/rails\.git", tag: "v5\.0\.0"
.
.IP
gem "rails", git: "https://github\.com/rails/rails\.git", ref: "4aded"
.
.TP
\fBsubmodules\fR
For reference, a git submodule \fIhttps://git\-scm\.com/book/en/v2/Git\-Tools\-Submodules\fR lets you have another git repository within a subfolder of your repository\. Specify \fBsubmodules: true\fR to cause bundler to expand any submodules included in the git repository
.
.P
If a git repository contains multiple \fB\.gemspecs\fR, each \fB\.gemspec\fR represents a gem located at the same place in the file system as the \fB\.gemspec\fR\.
.
.IP "" 4
.
.nf

|~rails                   [git root]
| |\-rails\.gemspec         [rails gem located here]
|~actionpack
| |\-actionpack\.gemspec    [actionpack gem located here]
|~activesupport
| |\-activesupport\.gemspec [activesupport gem located here]
|\.\.\.
.
.fi
.
.IP "" 0
.
.P
To install a gem located in a git repository, bundler changes to the directory containing the gemspec, runs \fBgem build name\.gemspec\fR and then installs the resulting gem\. The \fBgem build\fR command, which comes standard with Rubygems, evaluates the \fB\.gemspec\fR in the context of the directory in which it is located\.
.
.SS "GIT SOURCE"
A custom git source can be defined via the \fBgit_source\fR method\. Provide the source\'s name as an argument, and a block which receives a single argument and interpolates it into a string to return the full repo address:
.
.IP "" 4
.
.nf

git_source(:stash){ |repo_name| "https://stash\.corp\.acme\.pl/#{repo_name}\.git" }
gem \'rails\', stash: \'forks/rails\'
.
.fi
.
.IP "" 0
.
.P
In addition, if you wish to choose a specific branch:
.
.IP "" 4
.
.nf

gem "rails", stash: "forks/rails", branch: "branch_name"
.
.fi
.
.IP "" 0
.
.SS "GITHUB"
\fBNOTE\fR: This shorthand should be avoided until Bundler 2\.0, since it currently expands to an insecure \fBgit://\fR URL\. This allows a man\-in\-the\-middle attacker to compromise your system\.
.
.P
If the git repository you want to use is hosted on GitHub and is public, you can use the :github shorthand to specify the github username and repository name (without the trailing "\.git"), separated by a slash\. If both the username and repository name are the same, you can omit one\.
.
.IP "" 4
.
.nf

gem "rails", github: "rails/rails"
gem "rails", github: "rails"
.
.fi
.
.IP "" 0
.
.P
Are both equivalent to
.
.IP "" 4
.
.nf

gem "rails", git: "https://github\.com/rails/rails\.git"
.
.fi
.
.IP "" 0
.
.P
Since the \fBgithub\fR method is a specialization of \fBgit_source\fR, it accepts a \fB:branch\fR named argument\.
.
.P
You can also directly pass a pull request URL:
.
.IP "" 4
.
.nf

gem "rails", github: "https://github\.com/rails/rails/pull/43753"
.
.fi
.
.IP "" 0
.
.P
Which is equivalent to:
.
.IP "" 4
.
.nf

gem "rails", github: "rails/rails", branch: "refs/pull/43753/head"
.
.fi
.
.IP "" 0
.
.SS "GIST"
If the git repository you want to use is hosted as a GitHub Gist and is public, you can use the :gist shorthand to specify the gist identifier (without the trailing "\.git")\.
.
.IP "" 4
.
.nf

gem "the_hatch", gist: "4815162342"
.
.fi
.
.IP "" 0
.
.P
Is equivalent to:
.
.IP "" 4
.
.nf

gem "the_hatch", git: "https://gist\.github\.com/4815162342\.git"
.
.fi
.
.IP "" 0
.
.P
Since the \fBgist\fR method is a specialization of \fBgit_source\fR, it accepts a \fB:branch\fR named argument\.
.
.SS "BITBUCKET"
If the git repository you want to use is hosted on Bitbucket and is public, you can use the :bitbucket shorthand to specify the bitbucket username and repository name (without the trailing "\.git"), separated by a slash\. If both the username and repository name are the same, you can omit one\.
.
.IP "" 4
.
.nf

gem "rails", bitbucket: "rails/rails"
gem "rails", bitbucket: "rails"
.
.fi
.
.IP "" 0
.
.P
Are both equivalent to
.
.IP "" 4
.
.nf

gem "rails", git: "https://rails@bitbucket\.org/rails/rails\.git"
.
.fi
.
.IP "" 0
.
.P
Since the \fBbitbucket\fR method is a specialization of \fBgit_source\fR, it accepts a \fB:branch\fR named argument\.
.
.SS "PATH"
You can specify that a gem is located in a particular location on the file system\. Relative paths are resolved relative to the directory containing the \fBGemfile\fR\.
.
.P
Similar to the semantics of the \fB:git\fR option, the \fB:path\fR option requires that the directory in question either contains a \fB\.gemspec\fR for the gem, or that you specify an explicit version that bundler should use\.
.
.P
Unlike \fB:git\fR, bundler does not compile C extensions for gems specified as paths\.
.
.IP "" 4
.
.nf

gem "rails", path: "vendor/rails"
.
.fi
.
.IP "" 0
.
.P
If you would like to use multiple local gems directly from the filesystem, you can set a global \fBpath\fR option to the path containing the gem\'s files\. This will automatically load gemspec files from subdirectories\.
.
.IP "" 4
.
.nf

path \'components\' do
  gem \'admin_ui\'
  gem \'public_ui\'
end
.
.fi
.
.IP "" 0
.
.SH "BLOCK FORM OF SOURCE, GIT, PATH, GROUP and PLATFORMS"
The \fB:source\fR, \fB:git\fR, \fB:path\fR, \fB:group\fR, and \fB:platforms\fR options may be applied to a group of gems by using block form\.
.
.IP "" 4
.
.nf

source "https://gems\.example\.com" do
  gem "some_internal_gem"
  gem "another_internal_gem"
end

git "https://github\.com/rails/rails\.git" do
  gem "activesupport"
  gem "actionpack"
end

platforms :ruby do
  gem "ruby\-debug"
  gem "sqlite3"
end

group :development, optional: true do
  gem "wirble"
  gem "faker"
end
.
.fi
.
.IP "" 0
.
.P
In the case of the group block form the :optional option can be given to prevent a group from being installed unless listed in the \fB\-\-with\fR option given to the \fBbundle install\fR command\.
.
.P
In the case of the \fBgit\fR block form, the \fB:ref\fR, \fB:branch\fR, \fB:tag\fR, and \fB:submodules\fR options may be passed to the \fBgit\fR method, and all gems in the block will inherit those options\.
.
.P
The presence of a \fBsource\fR block in a Gemfile also makes that source available as a possible global source for any other gems which do not specify explicit sources\. Thus, when defining source blocks, it is recommended that you also ensure all other gems in the Gemfile are using explicit sources, either via source blocks or \fB:source\fR directives on individual gems\.
.
.SH "INSTALL_IF"
The \fBinstall_if\fR method allows gems to be installed based on a proc or lambda\. This is especially useful for optional gems that can only be used if certain software is installed or some other conditions are met\.
.
.IP "" 4
.
.nf

install_if \-> { RUBY_PLATFORM =~ /darwin/ } do
  gem "pasteboard"
end
.
.fi
.
.IP "" 0
.
.SH "GEMSPEC"
The \fB\.gemspec\fR \fIhttp://guides\.rubygems\.org/specification\-reference/\fR file is where you provide metadata about your gem to Rubygems\. Some required Gemspec attributes include the name, description, and homepage of your gem\. This is also where you specify the dependencies your gem needs to run\.
.
.P
If you wish to use Bundler to help install dependencies for a gem while it is being developed, use the \fBgemspec\fR method to pull in the dependencies listed in the \fB\.gemspec\fR file\.
.
.P
The \fBgemspec\fR method adds any runtime dependencies as gem requirements in the default group\. It also adds development dependencies as gem requirements in the \fBdevelopment\fR group\. Finally, it adds a gem requirement on your project (\fBpath: \'\.\'\fR)\. In conjunction with \fBBundler\.setup\fR, this allows you to require project files in your test code as you would if the project were installed as a gem; you need not manipulate the load path manually or require project files via relative paths\.
.
.P
The \fBgemspec\fR method supports optional \fB:path\fR, \fB:glob\fR, \fB:name\fR, and \fB:development_group\fR options, which control where bundler looks for the \fB\.gemspec\fR, the glob it uses to look for the gemspec (defaults to: "{,\fI,\fR/*}\.gemspec"), what named \fB\.gemspec\fR it uses (if more than one is present), and which group development dependencies are included in\.
.
.P
When a \fBgemspec\fR dependency encounters version conflicts during resolution, the local version under development will always be selected \-\- even if there are remote versions that better match other requirements for the \fBgemspec\fR gem\.
.
.SH "SOURCE PRIORITY"
When attempting to locate a gem to satisfy a gem requirement, bundler uses the following priority order:
.
.IP "1." 4
The source explicitly attached to the gem (using \fB:source\fR, \fB:path\fR, or \fB:git\fR)
.
.IP "2." 4
For implicit gems (dependencies of explicit gems), any source, git, or path repository declared on the parent\. This results in bundler prioritizing the ActiveSupport gem from the Rails git repository over ones from \fBrubygems\.org\fR
.
.IP "3." 4
If neither of the above conditions are met, the global source will be used\. If multiple global sources are specified, they will be prioritized from last to first, but this is deprecated since Bundler 1\.13, so Bundler prints a warning and will abort with an error in the future\.
.
.IP "" 0

PK
}$[A��<gems/gems/bundler-2.3.27/lib/bundler/man/bundle-cache.1.ronnnu�[���bundle-cache(1) -- Package your needed `.gem` files into your application
===========================================================================

## SYNOPSIS

`bundle cache`

alias: `package`, `pack`

## DESCRIPTION

Copy all of the `.gem` files needed to run the application into the
`vendor/cache` directory. In the future, when running [bundle install(1)][bundle-install],
use the gems in the cache in preference to the ones on `rubygems.org`.

## GIT AND PATH GEMS

The `bundle cache` command can also package `:git` and `:path` dependencies
besides .gem files. This needs to be explicitly enabled via the `--all` option.
Once used, the `--all` option will be remembered.

## SUPPORT FOR MULTIPLE PLATFORMS

When using gems that have different packages for different platforms, Bundler
supports caching of gems for other platforms where the Gemfile has been resolved
(i.e. present in the lockfile) in `vendor/cache`.  This needs to be enabled via
the `--all-platforms` option. This setting will be remembered in your local
bundler configuration.

## REMOTE FETCHING

By default, if you run `bundle install(1)`](bundle-install.1.html) after running
[bundle cache(1)](bundle-cache.1.html), bundler will still connect to `rubygems.org`
to check whether a platform-specific gem exists for any of the gems
in `vendor/cache`.

For instance, consider this Gemfile(5):

    source "https://rubygems.org"

    gem "nokogiri"

If you run `bundle cache` under C Ruby, bundler will retrieve
the version of `nokogiri` for the `"ruby"` platform. If you deploy
to JRuby and run `bundle install`, bundler is forced to check to
see whether a `"java"` platformed `nokogiri` exists.

Even though the `nokogiri` gem for the Ruby platform is
_technically_ acceptable on JRuby, it has a C extension
that does not run on JRuby. As a result, bundler will, by default,
still connect to `rubygems.org` to check whether it has a version
of one of your gems more specific to your platform.

This problem is also not limited to the `"java"` platform.
A similar (common) problem can happen when developing on Windows
and deploying to Linux, or even when developing on OSX and
deploying to Linux.

If you know for sure that the gems packaged in `vendor/cache`
are appropriate for the platform you are on, you can run
`bundle install --local` to skip checking for more appropriate
gems, and use the ones in `vendor/cache`.

One way to be sure that you have the right platformed versions
of all your gems is to run `bundle cache` on an identical
machine and check in the gems. For instance, you can run
`bundle cache` on an identical staging box during your
staging process, and check in the `vendor/cache` before
deploying to production.

By default, [bundle cache(1)](bundle-cache.1.html) fetches and also
installs the gems to the default location. To package the
dependencies to `vendor/cache` without installing them to the
local install location, you can run `bundle cache --no-install`.

## HISTORY

In Bundler 2.1, `cache` took in the functionalities of `package` and now
`package` and `pack` are aliases of `cache`.
PK
}$[�)&LYY<gems/gems/bundler-2.3.27/lib/bundler/man/bundle-check.1.ronnnu�[���bundle-check(1) -- Verifies if dependencies are satisfied by installed gems
===========================================================================

## SYNOPSIS

`bundle check` [--dry-run]
               [--gemfile=FILE]
               [--path=PATH]

## DESCRIPTION

`check` searches the local machine for each of the gems requested in the
Gemfile. If all gems are found, Bundler prints a success message and exits with
a status of 0.

If not, the first missing gem is listed and Bundler exits status 1.

## OPTIONS

* `--dry-run`:
  Locks the [`Gemfile(5)`][Gemfile(5)] before running the command.
* `--gemfile`:
  Use the specified gemfile instead of the [`Gemfile(5)`][Gemfile(5)].
* `--path`:
  Specify a different path than the system default (`$BUNDLE_PATH` or `$GEM_HOME`).
  Bundler will remember this value for future installs on this machine.
PK
}$["�7��:gems/gems/bundler-2.3.27/lib/bundler/man/bundle-platform.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-PLATFORM" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-platform\fR \- Displays platform compatibility information
.
.SH "SYNOPSIS"
\fBbundle platform\fR [\-\-ruby]
.
.SH "DESCRIPTION"
\fBplatform\fR displays information from your Gemfile, Gemfile\.lock, and Ruby VM about your platform\.
.
.P
For instance, using this Gemfile(5):
.
.IP "" 4
.
.nf

source "https://rubygems\.org"

ruby "3\.1\.2"

gem "rack"
.
.fi
.
.IP "" 0
.
.P
If you run \fBbundle platform\fR on Ruby 3\.1\.2, it displays the following output:
.
.IP "" 4
.
.nf

Your platform is: x86_64\-linux

Your app has gems that work on these platforms:
* arm64\-darwin\-21
* ruby
* x64\-mingw\-ucrt
* x86_64\-linux

Your Gemfile specifies a Ruby version requirement:
* ruby 3\.1\.2

Your current platform satisfies the Ruby version requirement\.
.
.fi
.
.IP "" 0
.
.P
\fBplatform\fR lists all the platforms in your \fBGemfile\.lock\fR as well as the \fBruby\fR directive if applicable from your Gemfile(5)\. It also lets you know if the \fBruby\fR directive requirement has been met\. If \fBruby\fR directive doesn\'t match the running Ruby VM, it tells you what part does not\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-ruby\fR
It will display the ruby directive information, so you don\'t have to parse it from the Gemfile(5)\.
.
.SH "SEE ALSO"
.
.IP "\(bu" 4
bundle\-lock(1) \fIbundle\-lock\.1\.ronn\fR
.
.IP "" 0

PK
}$[+3`-DD6gems/gems/bundler-2.3.27/lib/bundler/man/bundle-open.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-OPEN" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-open\fR \- Opens the source directory for a gem in your bundle
.
.SH "SYNOPSIS"
\fBbundle open\fR [GEM]
.
.SH "DESCRIPTION"
Opens the source directory of the provided GEM in your editor\.
.
.P
For this to work the \fBEDITOR\fR or \fBBUNDLER_EDITOR\fR environment variable has to be set\.
.
.P
Example:
.
.IP "" 4
.
.nf

bundle open \'rack\'
.
.fi
.
.IP "" 0
.
.P
Will open the source directory for the \'rack\' gem in your bundle\.
PK
}$[3����>gems/gems/bundler-2.3.27/lib/bundler/man/bundle-console.1.ronnnu�[���bundle-console(1) -- Deprecated way to open an IRB session with the bundle pre-loaded
=====================================================================================

## SYNOPSIS

`bundle console` [GROUP]

## DESCRIPTION

Starts an interactive Ruby console session in the context of the current bundle.

If no `GROUP` is specified, all gems in the `default` group in the [Gemfile(5)](https://bundler.io/man/gemfile.5.html) are
preliminarily loaded.

If `GROUP` is specified, all gems in the given group in the Gemfile in addition
to the gems in `default` group are loaded. Even if the given group does not
exist in the Gemfile, IRB console starts without any warning or error.

The environment variable `BUNDLE_CONSOLE` or `bundle config set console` can be used to change
the shell from the following:

* `irb` (default)
* `pry` (https://github.com/pry/pry)
* `ripl` (https://github.com/cldwalker/ripl)

`bundle console` uses irb by default. An alternative Pry or Ripl can be used with
`bundle console` by adjusting the `console` Bundler setting. Also make sure that
`pry` or `ripl` is in your Gemfile.

## EXAMPLE

    $ bundle config set console pry
    $ bundle console
    Resolving dependencies...
    [1] pry(main)>

## NOTES

This command was deprecated in Bundler 2.1 and will be removed in 3.0.
Use `bin/console` script, which can be generated by `bundle gem <NAME>`.

## SEE ALSO

[Gemfile(5)](https://bundler.io/man/gemfile.5.html)
PK
}$[���MM8gems/gems/bundler-2.3.27/lib/bundler/man/bundle-inject.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-INJECT" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-inject\fR \- Add named gem(s) with version requirements to Gemfile
.
.SH "SYNOPSIS"
\fBbundle inject\fR [GEM] [VERSION]
.
.SH "DESCRIPTION"
Adds the named gem(s) with their version requirements to the resolved [\fBGemfile(5)\fR][Gemfile(5)]\.
.
.P
This command will add the gem to both your [\fBGemfile(5)\fR][Gemfile(5)] and Gemfile\.lock if it isn\'t listed yet\.
.
.P
Example:
.
.IP "" 4
.
.nf

bundle install
bundle inject \'rack\' \'> 0\'
.
.fi
.
.IP "" 0
.
.P
This will inject the \'rack\' gem with a version greater than 0 in your [\fBGemfile(5)\fR][Gemfile(5)] and Gemfile\.lock\.
.
.P
The \fBbundle inject\fR command was deprecated in Bundler 2\.1 and will be removed in Bundler 3\.0\.
PK
}$[R�,a\C\C>gems/gems/bundler-2.3.27/lib/bundler/man/bundle-install.1.ronnnu�[���bundle-install(1) -- Install the dependencies specified in your Gemfile
=======================================================================

## SYNOPSIS

`bundle install` [--binstubs[=DIRECTORY]]
                 [--clean]
                 [--deployment]
                 [--frozen]
                 [--full-index]
                 [--gemfile=GEMFILE]
                 [--jobs=NUMBER]
                 [--local]
                 [--no-cache]
                 [--no-prune]
                 [--path PATH]
                 [--quiet]
                 [--redownload]
                 [--retry=NUMBER]
                 [--shebang]
                 [--standalone[=GROUP[ GROUP...]]]
                 [--system]
                 [--trust-policy=POLICY]
                 [--with=GROUP[ GROUP...]]
                 [--without=GROUP[ GROUP...]]

## DESCRIPTION

Install the gems specified in your Gemfile(5). If this is the first
time you run bundle install (and a `Gemfile.lock` does not exist),
Bundler will fetch all remote sources, resolve dependencies and
install all needed gems.

If a `Gemfile.lock` does exist, and you have not updated your Gemfile(5),
Bundler will fetch all remote sources, but use the dependencies
specified in the `Gemfile.lock` instead of resolving dependencies.

If a `Gemfile.lock` does exist, and you have updated your Gemfile(5),
Bundler will use the dependencies in the `Gemfile.lock` for all gems
that you did not update, but will re-resolve the dependencies of
gems that you did update. You can find more information about this
update process below under [CONSERVATIVE UPDATING][].

## OPTIONS

The `--clean`, `--deployment`, `--frozen`, `--no-prune`, `--path`, `--shebang`,
`--system`, `--without` and `--with` options are deprecated because they only
make sense if they are applied to every subsequent `bundle install` run
automatically and that requires `bundler` to silently remember them. Since
`bundler` will no longer remember CLI flags in future versions, `bundle config`
(see bundle-config(1)) should be used to apply them permanently.

* `--binstubs[=<directory>]`:
  Binstubs are scripts that wrap around executables. Bundler creates a small Ruby
  file (a binstub) that loads Bundler, runs the command, and puts it in `bin/`.
  This lets you link the binstub inside of an application to the exact gem
  version the application needs.

  Creates a directory (defaults to `~/bin`) and places any executables from the
  gem there. These executables run in Bundler's context. If used, you might add
  this directory to your environment's `PATH` variable. For instance, if the
  `rails` gem comes with a `rails` executable, this flag will create a
  `bin/rails` executable that ensures that all referred dependencies will be
  resolved using the bundled gems.

* `--clean`:
  On finishing the installation Bundler is going to remove any gems not present
  in the current Gemfile(5). Don't worry, gems currently in use will not be
  removed.

  This option is deprecated in favor of the `clean` setting.

* `--deployment`:
  In [deployment mode][DEPLOYMENT MODE], Bundler will 'roll-out' the bundle for
  production or CI use. Please check carefully if you want to have this option
  enabled in your development environment.

  This option is deprecated in favor of the `deployment` setting.

* `--redownload`:
  Force download every gem, even if the required versions are already available
  locally.

* `--frozen`:
  Do not allow the Gemfile.lock to be updated after this install. Exits
  non-zero if there are going to be changes to the Gemfile.lock.

  This option is deprecated in favor of the `frozen` setting.

* `--full-index`:
  Bundler will not call Rubygems' API endpoint (default) but download and cache
  a (currently big) index file of all gems. Performance can be improved for
  large bundles that seldom change by enabling this option.

* `--gemfile=<gemfile>`:
  The location of the Gemfile(5) which Bundler should use. This defaults
  to a Gemfile(5) in the current working directory. In general, Bundler
  will assume that the location of the Gemfile(5) is also the project's
  root and will try to find `Gemfile.lock` and `vendor/cache` relative
  to this location.

* `--jobs=[<number>]`, `-j[<number>]`:
  The maximum number of parallel download and install jobs. The default is the
  number of available processors.

* `--local`:
  Do not attempt to connect to `rubygems.org`. Instead, Bundler will use the
  gems already present in Rubygems' cache or in `vendor/cache`. Note that if an
  appropriate platform-specific gem exists on `rubygems.org` it will not be
  found.

* `--prefer-local`:
  Force using locally installed gems, or gems already present in Rubygems' cache
  or in `vendor/cache`, when resolving, even if newer versions are available
  remotely. Only attempt to connect to `rubygems.org` for gems that are not
  present locally.

* `--no-cache`:
  Do not update the cache in `vendor/cache` with the newly bundled gems. This
  does not remove any gems in the cache but keeps the newly bundled gems from
  being cached during the install.

* `--no-prune`:
  Don't remove stale gems from the cache when the installation finishes.

  This option is deprecated in favor of the `no_prune` setting.

* `--path=<path>`:
  The location to install the specified gems to. This defaults to Rubygems'
  setting. Bundler shares this location with Rubygems, `gem install ...` will
  have gem installed there, too. Therefore, gems installed without a
  `--path ...` setting will show up by calling `gem list`. Accordingly, gems
  installed to other locations will not get listed.

  This option is deprecated in favor of the `path` setting.

* `--quiet`:
  Do not print progress information to the standard output. Instead, Bundler
  will exit using a status code (`$?`).

* `--retry=[<number>]`:
  Retry failed network or git requests for <number> times.

* `--shebang=<ruby-executable>`:
  Uses the specified ruby executable (usually `ruby`) to execute the scripts
  created with `--binstubs`. In addition, if you use `--binstubs` together with
  `--shebang jruby` these executables will be changed to execute `jruby`
  instead.

  This option is deprecated in favor of the `shebang` setting.

* `--standalone[=<list>]`:
  Makes a bundle that can work without depending on Rubygems or Bundler at
  runtime. A space separated list of groups to install has to be specified.
  Bundler creates a directory named `bundle` and installs the bundle there. It
  also generates a `bundle/bundler/setup.rb` file to replace Bundler's own setup
  in the manner required. Using this option implicitly sets `path`, which is a
  [remembered option][REMEMBERED OPTIONS].

* `--system`:
  Installs the gems specified in the bundle to the system's Rubygems location.
  This overrides any previous configuration of `--path`.

  This option is deprecated in favor of the `system` setting.

* `--trust-policy=[<policy>]`:
  Apply the Rubygems security policy <policy>, where policy is one of
  `HighSecurity`, `MediumSecurity`, `LowSecurity`, `AlmostNoSecurity`, or
  `NoSecurity`. For more details, please see the Rubygems signing documentation
  linked below in [SEE ALSO][].

* `--with=<list>`:
  A space-separated list of groups referencing gems to install. If an
  optional group is given it is installed. If a group is given that is
  in the remembered list of groups given to --without, it is removed
  from that list.

  This option is deprecated in favor of the `with` setting.

* `--without=<list>`:
  A space-separated list of groups referencing gems to skip during installation.
  If a group is given that is in the remembered list of groups given
  to --with, it is removed from that list.

  This option is deprecated in favor of the `without` setting.

## DEPLOYMENT MODE

Bundler's defaults are optimized for development. To switch to
defaults optimized for deployment and for CI, use the `--deployment`
flag. Do not activate deployment mode on development machines, as it
will cause an error when the Gemfile(5) is modified.

1. A `Gemfile.lock` is required.

   To ensure that the same versions of the gems you developed with
   and tested with are also used in deployments, a `Gemfile.lock`
   is required.

   This is mainly to ensure that you remember to check your
   `Gemfile.lock` into version control.

2. The `Gemfile.lock` must be up to date

   In development, you can modify your Gemfile(5) and re-run
   `bundle install` to [conservatively update][CONSERVATIVE UPDATING]
   your `Gemfile.lock` snapshot.

   In deployment, your `Gemfile.lock` should be up-to-date with
   changes made in your Gemfile(5).

3. Gems are installed to `vendor/bundle` not your default system location

   In development, it's convenient to share the gems used in your
   application with other applications and other scripts that run on
   the system.

   In deployment, isolation is a more important default. In addition,
   the user deploying the application may not have permission to install
   gems to the system, or the web server may not have permission to
   read them.

   As a result, `bundle install --deployment` installs gems to
   the `vendor/bundle` directory in the application. This may be
   overridden using the `--path` option.

## SUDO USAGE

By default, Bundler installs gems to the same location as `gem install`.

In some cases, that location may not be writable by your Unix user. In
that case, Bundler will stage everything in a temporary directory,
then ask you for your `sudo` password in order to copy the gems into
their system location.

From your perspective, this is identical to installing the gems
directly into the system.

You should never use `sudo bundle install`. This is because several
other steps in `bundle install` must be performed as the current user:

* Updating your `Gemfile.lock`
* Updating your `vendor/cache`, if necessary
* Checking out private git repositories using your user's SSH keys

Of these three, the first two could theoretically be performed by
`chown`ing the resulting files to `$SUDO_USER`. The third, however,
can only be performed by invoking the `git` command as
the current user. Therefore, git gems are downloaded and installed
into `~/.bundle` rather than $GEM_HOME or $BUNDLE_PATH.

As a result, you should run `bundle install` as the current user,
and Bundler will ask for your password if it is needed to put the
gems into their final location.

## INSTALLING GROUPS

By default, `bundle install` will install all gems in all groups
in your Gemfile(5), except those declared for a different platform.

However, you can explicitly tell Bundler to skip installing
certain groups with the `--without` option. This option takes
a space-separated list of groups.

While the `--without` option will skip _installing_ the gems in the
specified groups, it will still _download_ those gems and use them to
resolve the dependencies of every gem in your Gemfile(5).

This is so that installing a different set of groups on another
 machine (such as a production server) will not change the
gems and versions that you have already developed and tested against.

`Bundler offers a rock-solid guarantee that the third-party
code you are running in development and testing is also the
third-party code you are running in production. You can choose
to exclude some of that code in different environments, but you
will never be caught flat-footed by different versions of
third-party code being used in different environments.`

For a simple illustration, consider the following Gemfile(5):

    source 'https://rubygems.org'

    gem 'sinatra'

    group :production do
      gem 'rack-perftools-profiler'
    end

In this case, `sinatra` depends on any version of Rack (`>= 1.0`), while
`rack-perftools-profiler` depends on 1.x (`~> 1.0`).

When you run `bundle install --without production` in development, we
look at the dependencies of `rack-perftools-profiler` as well. That way,
you do not spend all your time developing against Rack 2.0, using new
APIs unavailable in Rack 1.x, only to have Bundler switch to Rack 1.2
when the `production` group _is_ used.

This should not cause any problems in practice, because we do not
attempt to `install` the gems in the excluded groups, and only evaluate
as part of the dependency resolution process.

This also means that you cannot include different versions of the same
gem in different groups, because doing so would result in different
sets of dependencies used in development and production. Because of
the vagaries of the dependency resolution process, this usually
affects more than the gems you list in your Gemfile(5), and can
(surprisingly) radically change the gems you are using.

## THE GEMFILE.LOCK

When you run `bundle install`, Bundler will persist the full names
and versions of all gems that you used (including dependencies of
the gems specified in the Gemfile(5)) into a file called `Gemfile.lock`.

Bundler uses this file in all subsequent calls to `bundle install`,
which guarantees that you always use the same exact code, even
as your application moves across machines.

Because of the way dependency resolution works, even a
seemingly small change (for instance, an update to a point-release
of a dependency of a gem in your Gemfile(5)) can result in radically
different gems being needed to satisfy all dependencies.

As a result, you `SHOULD` check your `Gemfile.lock` into version
control, in both applications and gems. If you do not, every machine that
checks out your repository (including your production server) will resolve all
dependencies again, which will result in different versions of
third-party code being used if `any` of the gems in the Gemfile(5)
or any of their dependencies have been updated.

When Bundler first shipped, the `Gemfile.lock` was included in the `.gitignore`
file included with generated gems.  Over time, however, it became clear that
this practice forces the pain of broken dependencies onto new contributors,
while leaving existing contributors potentially unaware of the problem. Since
`bundle install` is usually the first step towards a contribution, the pain of
broken dependencies would discourage new contributors from contributing. As a
result, we have revised our guidance for gem authors to now recommend checking
in the lock for gems.

## CONSERVATIVE UPDATING

When you make a change to the Gemfile(5) and then run `bundle install`,
Bundler will update only the gems that you modified.

In other words, if a gem that you `did not modify` worked before
you called `bundle install`, it will continue to use the exact
same versions of all dependencies as it used before the update.

Let's take a look at an example. Here's your original Gemfile(5):

    source 'https://rubygems.org'

    gem 'actionpack', '2.3.8'
    gem 'activemerchant'

In this case, both `actionpack` and `activemerchant` depend on
`activesupport`. The `actionpack` gem depends on `activesupport 2.3.8`
and `rack ~> 1.1.0`, while the `activemerchant` gem depends on
`activesupport >= 2.3.2`, `braintree >= 2.0.0`, and `builder >= 2.0.0`.

When the dependencies are first resolved, Bundler will select
`activesupport 2.3.8`, which satisfies the requirements of both
gems in your Gemfile(5).

Next, you modify your Gemfile(5) to:

    source 'https://rubygems.org'

    gem 'actionpack', '3.0.0.rc'
    gem 'activemerchant'

The `actionpack 3.0.0.rc` gem has a number of new dependencies,
and updates the `activesupport` dependency to `= 3.0.0.rc` and
the `rack` dependency to `~> 1.2.1`.

When you run `bundle install`, Bundler notices that you changed
the `actionpack` gem, but not the `activemerchant` gem. It
evaluates the gems currently being used to satisfy its requirements:

  * `activesupport 2.3.8`:
    also used to satisfy a dependency in `activemerchant`,
    which is not being updated
  * `rack ~> 1.1.0`:
    not currently being used to satisfy another dependency

Because you did not explicitly ask to update `activemerchant`,
you would not expect it to suddenly stop working after updating
`actionpack`. However, satisfying the new `activesupport 3.0.0.rc`
dependency of actionpack requires updating one of its dependencies.

Even though `activemerchant` declares a very loose dependency
that theoretically matches `activesupport 3.0.0.rc`, Bundler treats
gems in your Gemfile(5) that have not changed as an atomic unit
together with their dependencies. In this case, the `activemerchant`
dependency is treated as `activemerchant 1.7.1 + activesupport 2.3.8`,
so `bundle install` will report that it cannot update `actionpack`.

To explicitly update `actionpack`, including its dependencies
which other gems in the Gemfile(5) still depend on, run
`bundle update actionpack` (see `bundle update(1)`).

`Summary`: In general, after making a change to the Gemfile(5) , you
should first try to run `bundle install`, which will guarantee that no
other gem in the Gemfile(5) is impacted by the change. If that
does not work, run [bundle update(1)](bundle-update.1.html).

## SEE ALSO

* [Gem install docs](http://guides.rubygems.org/rubygems-basics/#installing-gems)
* [Rubygems signing docs](http://guides.rubygems.org/security/)
PK
}$[|�Koo=gems/gems/bundler-2.3.27/lib/bundler/man/bundle-plugin.1.ronnnu�[���bundle-plugin(1) -- Manage Bundler plugins
==========================================

## SYNOPSIS

`bundle plugin` install PLUGINS [--source=<SOURCE>] [--version=<version>]
                              [--git|--local_git=<git-url>] [--branch=<branch>|--ref=<rev>]<br>
`bundle plugin` uninstall PLUGINS<br>
`bundle plugin` list<br>
`bundle plugin` help [COMMAND]

## DESCRIPTION

You can install, uninstall, and list plugin(s) with this command to extend functionalities of Bundler.

## SUB-COMMANDS

### install

Install the given plugin(s).

* `bundle plugin install bundler-graph`:
  Install bundler-graph gem from RubyGems.org. The global source, specified in source in Gemfile is ignored.

* `bundle plugin install bundler-graph --source https://example.com`:
  Install bundler-graph gem from example.com. The global source, specified in source in Gemfile is not considered.

* `bundle plugin install bundler-graph --version 0.2.1`:
  You can specify the version of the gem via `--version`.

* `bundle plugin install bundler-graph --git https://github.com/rubygems/bundler-graph`:
  Install bundler-graph gem from Git repository. `--git` can be replaced with `--local-git`. You cannot use both `--git` and `--local-git`. You can use standard Git URLs like:

  * `ssh://[user@]host.xz[:port]/path/to/repo.git`
  * `http[s]://host.xz[:port]/path/to/repo.git`
  * `/path/to/repo`
  * `file:///path/to/repo`

  When you specify `--git`/`--local-git`, you can use `--branch` or `--ref` to specify any branch, tag, or commit hash (revision) to use. When you specify both, only the latter is used.

### uninstall

Uninstall the plugin(s) specified in PLUGINS.

### list

List the installed plugins and available commands.

No options.

### help

Describe subcommands or one specific subcommand.

No options.

## SEE ALSO

* [How to write a Bundler plugin](https://bundler.io/guides/bundler_plugins.html)
PK
}$[��		8gems/gems/bundler-2.3.27/lib/bundler/man/bundle-plugin.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-PLUGIN" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-plugin\fR \- Manage Bundler plugins
.
.SH "SYNOPSIS"
\fBbundle plugin\fR install PLUGINS [\-\-source=\fISOURCE\fR] [\-\-version=\fIversion\fR] [\-\-git|\-\-local_git=\fIgit\-url\fR] [\-\-branch=\fIbranch\fR|\-\-ref=\fIrev\fR]
.
.br
\fBbundle plugin\fR uninstall PLUGINS
.
.br
\fBbundle plugin\fR list
.
.br
\fBbundle plugin\fR help [COMMAND]
.
.SH "DESCRIPTION"
You can install, uninstall, and list plugin(s) with this command to extend functionalities of Bundler\.
.
.SH "SUB\-COMMANDS"
.
.SS "install"
Install the given plugin(s)\.
.
.IP "\(bu" 4
\fBbundle plugin install bundler\-graph\fR: Install bundler\-graph gem from RubyGems\.org\. The global source, specified in source in Gemfile is ignored\.
.
.IP "\(bu" 4
\fBbundle plugin install bundler\-graph \-\-source https://example\.com\fR: Install bundler\-graph gem from example\.com\. The global source, specified in source in Gemfile is not considered\.
.
.IP "\(bu" 4
\fBbundle plugin install bundler\-graph \-\-version 0\.2\.1\fR: You can specify the version of the gem via \fB\-\-version\fR\.
.
.IP "\(bu" 4
\fBbundle plugin install bundler\-graph \-\-git https://github\.com/rubygems/bundler\-graph\fR: Install bundler\-graph gem from Git repository\. \fB\-\-git\fR can be replaced with \fB\-\-local\-git\fR\. You cannot use both \fB\-\-git\fR and \fB\-\-local\-git\fR\. You can use standard Git URLs like:
.
.IP "\(bu" 4
\fBssh://[user@]host\.xz[:port]/path/to/repo\.git\fR
.
.IP "\(bu" 4
\fBhttp[s]://host\.xz[:port]/path/to/repo\.git\fR
.
.IP "\(bu" 4
\fB/path/to/repo\fR
.
.IP "\(bu" 4
\fBfile:///path/to/repo\fR
.
.IP "" 0
.
.IP
When you specify \fB\-\-git\fR/\fB\-\-local\-git\fR, you can use \fB\-\-branch\fR or \fB\-\-ref\fR to specify any branch, tag, or commit hash (revision) to use\. When you specify both, only the latter is used\.
.
.IP "" 0
.
.SS "uninstall"
Uninstall the plugin(s) specified in PLUGINS\.
.
.SS "list"
List the installed plugins and available commands\.
.
.P
No options\.
.
.SS "help"
Describe subcommands or one specific subcommand\.
.
.P
No options\.
.
.SH "SEE ALSO"
.
.IP "\(bu" 4
How to write a Bundler plugin \fIhttps://bundler\.io/guides/bundler_plugins\.html\fR
.
.IP "" 0

PK
}$[�
���:gems/gems/bundler-2.3.27/lib/bundler/man/bundle-pristine.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-PRISTINE" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-pristine\fR \- Restores installed gems to their pristine condition
.
.SH "SYNOPSIS"
\fBbundle pristine\fR
.
.SH "DESCRIPTION"
\fBpristine\fR restores the installed gems in the bundle to their pristine condition using the local gem cache from RubyGems\. For git gems, a forced checkout will be performed\.
.
.P
For further explanation, \fBbundle pristine\fR ignores unpacked files on disk\. In other words, this command utilizes the local \fB\.gem\fR cache or the gem\'s git repository as if one were installing from scratch\.
.
.P
Note: the Bundler gem cannot be restored to its original state with \fBpristine\fR\. One also cannot use \fBbundle pristine\fR on gems with a \'path\' option in the Gemfile, because bundler has no original copy it can restore from\.
.
.P
When is it practical to use \fBbundle pristine\fR?
.
.P
It comes in handy when a developer is debugging a gem\. \fBbundle pristine\fR is a great way to get rid of experimental changes to a gem that one may not want\.
.
.P
Why use \fBbundle pristine\fR over \fBgem pristine \-\-all\fR?
.
.P
Both commands are very similar\. For context: \fBbundle pristine\fR, without arguments, cleans all gems from the lockfile\. Meanwhile, \fBgem pristine \-\-all\fR cleans all installed gems for that Ruby version\.
.
.P
If a developer forgets which gems in their project they might have been debugging, the Rubygems \fBgem pristine [GEMNAME]\fR command may be inconvenient\. One can avoid waiting for \fBgem pristine \-\-all\fR, and instead run \fBbundle pristine\fR\.
PK
}$[f�Qvv6gems/gems/bundler-2.3.27/lib/bundler/man/bundle-lock.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-LOCK" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-lock\fR \- Creates / Updates a lockfile without installing
.
.SH "SYNOPSIS"
\fBbundle lock\fR [\-\-update] [\-\-local] [\-\-print] [\-\-lockfile=PATH] [\-\-full\-index] [\-\-add\-platform] [\-\-remove\-platform] [\-\-patch] [\-\-minor] [\-\-major] [\-\-strict] [\-\-conservative]
.
.SH "DESCRIPTION"
Lock the gems specified in Gemfile\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-update=<*gems>\fR
Ignores the existing lockfile\. Resolve then updates lockfile\. Taking a list of gems or updating all gems if no list is given\.
.
.TP
\fB\-\-local\fR
Do not attempt to connect to \fBrubygems\.org\fR\. Instead, Bundler will use the gems already present in Rubygems\' cache or in \fBvendor/cache\fR\. Note that if a appropriate platform\-specific gem exists on \fBrubygems\.org\fR it will not be found\.
.
.TP
\fB\-\-print\fR
Prints the lockfile to STDOUT instead of writing to the file system\.
.
.TP
\fB\-\-lockfile=<path>\fR
The path where the lockfile should be written to\.
.
.TP
\fB\-\-full\-index\fR
Fall back to using the single\-file index of all gems\.
.
.TP
\fB\-\-add\-platform\fR
Add a new platform to the lockfile, re\-resolving for the addition of that platform\.
.
.TP
\fB\-\-remove\-platform\fR
Remove a platform from the lockfile\.
.
.TP
\fB\-\-patch\fR
If updating, prefer updating only to next patch version\.
.
.TP
\fB\-\-minor\fR
If updating, prefer updating only to next minor version\.
.
.TP
\fB\-\-major\fR
If updating, prefer updating to next major version (default)\.
.
.TP
\fB\-\-strict\fR
If updating, do not allow any gem to be updated past latest \-\-patch | \-\-minor | \-\-major\.
.
.TP
\fB\-\-conservative\fR
If updating, use bundle install conservative update behavior and do not allow shared dependencies to be updated\.
.
.SH "UPDATING ALL GEMS"
If you run \fBbundle lock\fR with \fB\-\-update\fR option without list of gems, bundler will ignore any previously installed gems and resolve all dependencies again based on the latest versions of all gems available in the sources\.
.
.SH "UPDATING A LIST OF GEMS"
Sometimes, you want to update a single gem in the Gemfile(5), and leave the rest of the gems that you specified locked to the versions in the \fBGemfile\.lock\fR\.
.
.P
For instance, you only want to update \fBnokogiri\fR, run \fBbundle lock \-\-update nokogiri\fR\.
.
.P
Bundler will update \fBnokogiri\fR and any of its dependencies, but leave the rest of the gems that you specified locked to the versions in the \fBGemfile\.lock\fR\.
.
.SH "SUPPORTING OTHER PLATFORMS"
If you want your bundle to support platforms other than the one you\'re running locally, you can run \fBbundle lock \-\-add\-platform PLATFORM\fR to add PLATFORM to the lockfile, force bundler to re\-resolve and consider the new platform when picking gems, all without needing to have a machine that matches PLATFORM handy to install those platform\-specific gems on\.
.
.P
For a full explanation of gem platforms, see \fBgem help platform\fR\.
.
.SH "PATCH LEVEL OPTIONS"
See bundle update(1) \fIbundle\-update\.1\.html\fR for details\.
PK
}$[#]E22=gems/gems/bundler-2.3.27/lib/bundler/man/bundle-update.1.ronnnu�[���bundle-update(1) -- Update your gems to the latest available versions
=====================================================================

## SYNOPSIS

`bundle update` <*gems> [--all]
                        [--group=NAME]
                        [--source=NAME]
                        [--local]
                        [--ruby]
                        [--bundler[=VERSION]]
                        [--full-index]
                        [--jobs=JOBS]
                        [--quiet]
                        [--patch|--minor|--major]
                        [--redownload]
                        [--strict]
                        [--conservative]

## DESCRIPTION

Update the gems specified (all gems, if `--all` flag is used), ignoring
the previously installed gems specified in the `Gemfile.lock`. In
general, you should use [bundle install(1)](bundle-install.1.html) to install the same exact
gems and versions across machines.

You would use `bundle update` to explicitly update the version of a
gem.

## OPTIONS

* `--all`:
  Update all gems specified in Gemfile.

* `--group=<name>`, `-g=[<name>]`:
  Only update the gems in the specified group. For instance, you can update all gems
  in the development group with `bundle update --group development`. You can also
  call `bundle update rails --group test` to update the rails gem and all gems in
  the test group, for example.

* `--source=<name>`:
  The name of a `:git` or `:path` source used in the Gemfile(5). For
  instance, with a `:git` source of `http://github.com/rails/rails.git`,
  you would call `bundle update --source rails`

* `--local`:
  Do not attempt to fetch gems remotely and use the gem cache instead.

* `--ruby`:
  Update the locked version of Ruby to the current version of Ruby.

* `--bundler`:
  Update the locked version of bundler to the invoked bundler version.

* `--full-index`:
  Fall back to using the single-file index of all gems.

* `--jobs=[<number>]`, `-j[<number>]`:
  Specify the number of jobs to run in parallel. The default is the number of
  available processors.

* `--retry=[<number>]`:
  Retry failed network or git requests for <number> times.

* `--quiet`:
  Only output warnings and errors.

* `--redownload`:
  Force downloading every gem.

* `--patch`:
  Prefer updating only to next patch version.

* `--minor`:
  Prefer updating only to next minor version.

* `--major`:
  Prefer updating to next major version (default).

* `--strict`:
  Do not allow any gem to be updated past latest `--patch` | `--minor` | `--major`.

* `--conservative`:
  Use bundle install conservative update behavior and do not allow indirect dependencies to be updated.

## UPDATING ALL GEMS

If you run `bundle update --all`, bundler will ignore
any previously installed gems and resolve all dependencies again
based on the latest versions of all gems available in the sources.

Consider the following Gemfile(5):

    source "https://rubygems.org"

    gem "rails", "3.0.0.rc"
    gem "nokogiri"

When you run [bundle install(1)](bundle-install.1.html) the first time, bundler will resolve
all of the dependencies, all the way down, and install what you need:

    Fetching gem metadata from https://rubygems.org/.........
    Resolving dependencies...
    Installing builder 2.1.2
    Installing abstract 1.0.0
    Installing rack 1.2.8
    Using bundler 1.7.6
    Installing rake 10.4.0
    Installing polyglot 0.3.5
    Installing mime-types 1.25.1
    Installing i18n 0.4.2
    Installing mini_portile 0.6.1
    Installing tzinfo 0.3.42
    Installing rack-mount 0.6.14
    Installing rack-test 0.5.7
    Installing treetop 1.4.15
    Installing thor 0.14.6
    Installing activesupport 3.0.0.rc
    Installing erubis 2.6.6
    Installing activemodel 3.0.0.rc
    Installing arel 0.4.0
    Installing mail 2.2.20
    Installing activeresource 3.0.0.rc
    Installing actionpack 3.0.0.rc
    Installing activerecord 3.0.0.rc
    Installing actionmailer 3.0.0.rc
    Installing railties 3.0.0.rc
    Installing rails 3.0.0.rc
    Installing nokogiri 1.6.5

    Bundle complete! 2 Gemfile dependencies, 26 gems total.
    Use `bundle show [gemname]` to see where a bundled gem is installed.

As you can see, even though you have two gems in the Gemfile(5), your application
needs 26 different gems in order to run. Bundler remembers the exact versions
it installed in `Gemfile.lock`. The next time you run [bundle install(1)](bundle-install.1.html), bundler skips
the dependency resolution and installs the same gems as it installed last time.

After checking in the `Gemfile.lock` into version control and cloning it on another
machine, running [bundle install(1)](bundle-install.1.html) will _still_ install the gems that you installed
last time. You don't need to worry that a new release of `erubis` or `mail` changes
the gems you use.

However, from time to time, you might want to update the gems you are using to the
newest versions that still match the gems in your Gemfile(5).

To do this, run `bundle update --all`, which will ignore the `Gemfile.lock`, and resolve
all the dependencies again. Keep in mind that this process can result in a significantly
different set of the 25 gems, based on the requirements of new gems that the gem
authors released since the last time you ran `bundle update --all`.

## UPDATING A LIST OF GEMS

Sometimes, you want to update a single gem in the Gemfile(5), and leave the rest of the
gems that you specified locked to the versions in the `Gemfile.lock`.

For instance, in the scenario above, imagine that `nokogiri` releases version `1.4.4`, and
you want to update it _without_ updating Rails and all of its dependencies. To do this,
run `bundle update nokogiri`.

Bundler will update `nokogiri` and any of its dependencies, but leave alone Rails and
its dependencies.

## OVERLAPPING DEPENDENCIES

Sometimes, multiple gems declared in your Gemfile(5) are satisfied by the same
second-level dependency. For instance, consider the case of `thin` and
`rack-perftools-profiler`.

    source "https://rubygems.org"

    gem "thin"
    gem "rack-perftools-profiler"

The `thin` gem depends on `rack >= 1.0`, while `rack-perftools-profiler` depends
on `rack ~> 1.0`. If you run bundle install, you get:

    Fetching source index for https://rubygems.org/
    Installing daemons (1.1.0)
    Installing eventmachine (0.12.10) with native extensions
    Installing open4 (1.0.1)
    Installing perftools.rb (0.4.7) with native extensions
    Installing rack (1.2.1)
    Installing rack-perftools_profiler (0.0.2)
    Installing thin (1.2.7) with native extensions
    Using bundler (1.0.0.rc.3)

In this case, the two gems have their own set of dependencies, but they share
`rack` in common. If you run `bundle update thin`, bundler will update `daemons`,
`eventmachine` and `rack`, which are dependencies of `thin`, but not `open4` or
`perftools.rb`, which are dependencies of `rack-perftools_profiler`. Note that
`bundle update thin` will update `rack` even though it's _also_ a dependency of
`rack-perftools_profiler`.

In short, by default, when you update a gem using `bundle update`, bundler will
update all dependencies of that gem, including those that are also dependencies
of another gem.

To prevent updating indirect dependencies, prior to version 1.14 the only option
was the `CONSERVATIVE UPDATING` behavior in [bundle install(1)](bundle-install.1.html):

In this scenario, updating the `thin` version manually in the Gemfile(5),
and then running [bundle install(1)](bundle-install.1.html) will only update `daemons` and `eventmachine`,
but not `rack`. For more information, see the `CONSERVATIVE UPDATING` section
of [bundle install(1)](bundle-install.1.html).

Starting with 1.14, specifying the `--conservative` option will also prevent indirect
dependencies from being updated.

## PATCH LEVEL OPTIONS

Version 1.14 introduced 4 patch-level options that will influence how gem
versions are resolved. One of the following options can be used: `--patch`,
`--minor` or `--major`. `--strict` can be added to further influence resolution.

* `--patch`:
  Prefer updating only to next patch version.

* `--minor`:
  Prefer updating only to next minor version.

* `--major`:
  Prefer updating to next major version (default).

* `--strict`:
  Do not allow any gem to be updated past latest `--patch` | `--minor` | `--major`.

When Bundler is resolving what versions to use to satisfy declared
requirements in the Gemfile or in parent gems, it looks up all
available versions, filters out any versions that don't satisfy
the requirement, and then, by default, sorts them from newest to
oldest, considering them in that order.

Providing one of the patch level options (e.g. `--patch`) changes the
sort order of the satisfying versions, causing Bundler to consider the
latest `--patch` or `--minor` version available before other versions.
Note that versions outside the stated patch level could still be
resolved to if necessary to find a suitable dependency graph.

For example, if gem 'foo' is locked at 1.0.2, with no gem requirement
defined in the Gemfile, and versions 1.0.3, 1.0.4, 1.1.0, 1.1.1, 2.0.0
all exist, the default order of preference by default (`--major`) will
be "2.0.0, 1.1.1, 1.1.0, 1.0.4, 1.0.3, 1.0.2".

If the `--patch` option is used, the order of preference will change to
"1.0.4, 1.0.3, 1.0.2, 1.1.1, 1.1.0, 2.0.0".

If the `--minor` option is used, the order of preference will change to
"1.1.1, 1.1.0, 1.0.4, 1.0.3, 1.0.2, 2.0.0".

Combining the `--strict` option with any of the patch level options
will remove any versions beyond the scope of the patch level option,
to ensure that no gem is updated that far.

To continue the previous example, if both `--patch` and `--strict`
options are used, the available versions for resolution would be
"1.0.4, 1.0.3, 1.0.2". If `--minor` and `--strict` are used, it would
be "1.1.1, 1.1.0, 1.0.4, 1.0.3, 1.0.2".

Gem requirements as defined in the Gemfile will still be the first
determining factor for what versions are available. If the gem
requirement for `foo` in the Gemfile is '~> 1.0', that will accomplish
the same thing as providing the `--minor` and `--strict` options.

## PATCH LEVEL EXAMPLES

Given the following gem specifications:

    foo 1.4.3, requires: ~> bar 2.0
    foo 1.4.4, requires: ~> bar 2.0
    foo 1.4.5, requires: ~> bar 2.1
    foo 1.5.0, requires: ~> bar 2.1
    foo 1.5.1, requires: ~> bar 3.0
    bar with versions 2.0.3, 2.0.4, 2.1.0, 2.1.1, 3.0.0

Gemfile:

    gem 'foo'

Gemfile.lock:

    foo (1.4.3)
      bar (~> 2.0)
    bar (2.0.3)

Cases:

    #  Command Line                     Result
    ------------------------------------------------------------
    1  bundle update --patch            'foo 1.4.5', 'bar 2.1.1'
    2  bundle update --patch foo        'foo 1.4.5', 'bar 2.1.1'
    3  bundle update --minor            'foo 1.5.1', 'bar 3.0.0'
    4  bundle update --minor --strict   'foo 1.5.0', 'bar 2.1.1'
    5  bundle update --patch --strict   'foo 1.4.4', 'bar 2.0.4'

In case 1, bar is upgraded to 2.1.1, a minor version increase, because
the dependency from foo 1.4.5 required it.

In case 2, only foo is requested to be unlocked, but bar is also
allowed to move because it's not a declared dependency in the Gemfile.

In case 3, bar goes up a whole major release, because a minor increase
is preferred now for foo, and when it goes to 1.5.1, it requires 3.0.0
of bar.

In case 4, foo is preferred up to a minor version, but 1.5.1 won't work
because the --strict flag removes bar 3.0.0 from consideration since
it's a major increment.

In case 5, both foo and bar have any minor or major increments removed
from consideration because of the --strict flag, so the most they can
move is up to 1.4.4 and 2.0.4.

## RECOMMENDED WORKFLOW

In general, when working with an application managed with bundler, you should
use the following workflow:

* After you create your Gemfile(5) for the first time, run

    $ bundle install

* Check the resulting `Gemfile.lock` into version control

    $ git add Gemfile.lock

* When checking out this repository on another development machine, run

    $ bundle install

* When checking out this repository on a deployment machine, run

    $ bundle install --deployment

* After changing the Gemfile(5) to reflect a new or update dependency, run

    $ bundle install

* Make sure to check the updated `Gemfile.lock` into version control

    $ git add Gemfile.lock

* If [bundle install(1)](bundle-install.1.html) reports a conflict, manually update the specific
  gems that you changed in the Gemfile(5)

    $ bundle update rails thin

* If you want to update all the gems to the latest possible versions that
  still match the gems listed in the Gemfile(5), run

    $ bundle update --all
PK
}$[�x��G�G9gems/gems/bundler-2.3.27/lib/bundler/man/bundle-install.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-INSTALL" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-install\fR \- Install the dependencies specified in your Gemfile
.
.SH "SYNOPSIS"
\fBbundle install\fR [\-\-binstubs[=DIRECTORY]] [\-\-clean] [\-\-deployment] [\-\-frozen] [\-\-full\-index] [\-\-gemfile=GEMFILE] [\-\-jobs=NUMBER] [\-\-local] [\-\-no\-cache] [\-\-no\-prune] [\-\-path PATH] [\-\-quiet] [\-\-redownload] [\-\-retry=NUMBER] [\-\-shebang] [\-\-standalone[=GROUP[ GROUP\.\.\.]]] [\-\-system] [\-\-trust\-policy=POLICY] [\-\-with=GROUP[ GROUP\.\.\.]] [\-\-without=GROUP[ GROUP\.\.\.]]
.
.SH "DESCRIPTION"
Install the gems specified in your Gemfile(5)\. If this is the first time you run bundle install (and a \fBGemfile\.lock\fR does not exist), Bundler will fetch all remote sources, resolve dependencies and install all needed gems\.
.
.P
If a \fBGemfile\.lock\fR does exist, and you have not updated your Gemfile(5), Bundler will fetch all remote sources, but use the dependencies specified in the \fBGemfile\.lock\fR instead of resolving dependencies\.
.
.P
If a \fBGemfile\.lock\fR does exist, and you have updated your Gemfile(5), Bundler will use the dependencies in the \fBGemfile\.lock\fR for all gems that you did not update, but will re\-resolve the dependencies of gems that you did update\. You can find more information about this update process below under \fICONSERVATIVE UPDATING\fR\.
.
.SH "OPTIONS"
The \fB\-\-clean\fR, \fB\-\-deployment\fR, \fB\-\-frozen\fR, \fB\-\-no\-prune\fR, \fB\-\-path\fR, \fB\-\-shebang\fR, \fB\-\-system\fR, \fB\-\-without\fR and \fB\-\-with\fR options are deprecated because they only make sense if they are applied to every subsequent \fBbundle install\fR run automatically and that requires \fBbundler\fR to silently remember them\. Since \fBbundler\fR will no longer remember CLI flags in future versions, \fBbundle config\fR (see bundle\-config(1)) should be used to apply them permanently\.
.
.TP
\fB\-\-binstubs[=<directory>]\fR
Binstubs are scripts that wrap around executables\. Bundler creates a small Ruby file (a binstub) that loads Bundler, runs the command, and puts it in \fBbin/\fR\. This lets you link the binstub inside of an application to the exact gem version the application needs\.
.
.IP
Creates a directory (defaults to \fB~/bin\fR) and places any executables from the gem there\. These executables run in Bundler\'s context\. If used, you might add this directory to your environment\'s \fBPATH\fR variable\. For instance, if the \fBrails\fR gem comes with a \fBrails\fR executable, this flag will create a \fBbin/rails\fR executable that ensures that all referred dependencies will be resolved using the bundled gems\.
.
.TP
\fB\-\-clean\fR
On finishing the installation Bundler is going to remove any gems not present in the current Gemfile(5)\. Don\'t worry, gems currently in use will not be removed\.
.
.IP
This option is deprecated in favor of the \fBclean\fR setting\.
.
.TP
\fB\-\-deployment\fR
In \fIdeployment mode\fR, Bundler will \'roll\-out\' the bundle for production or CI use\. Please check carefully if you want to have this option enabled in your development environment\.
.
.IP
This option is deprecated in favor of the \fBdeployment\fR setting\.
.
.TP
\fB\-\-redownload\fR
Force download every gem, even if the required versions are already available locally\.
.
.TP
\fB\-\-frozen\fR
Do not allow the Gemfile\.lock to be updated after this install\. Exits non\-zero if there are going to be changes to the Gemfile\.lock\.
.
.IP
This option is deprecated in favor of the \fBfrozen\fR setting\.
.
.TP
\fB\-\-full\-index\fR
Bundler will not call Rubygems\' API endpoint (default) but download and cache a (currently big) index file of all gems\. Performance can be improved for large bundles that seldom change by enabling this option\.
.
.TP
\fB\-\-gemfile=<gemfile>\fR
The location of the Gemfile(5) which Bundler should use\. This defaults to a Gemfile(5) in the current working directory\. In general, Bundler will assume that the location of the Gemfile(5) is also the project\'s root and will try to find \fBGemfile\.lock\fR and \fBvendor/cache\fR relative to this location\.
.
.TP
\fB\-\-jobs=[<number>]\fR, \fB\-j[<number>]\fR
The maximum number of parallel download and install jobs\. The default is the number of available processors\.
.
.TP
\fB\-\-local\fR
Do not attempt to connect to \fBrubygems\.org\fR\. Instead, Bundler will use the gems already present in Rubygems\' cache or in \fBvendor/cache\fR\. Note that if an appropriate platform\-specific gem exists on \fBrubygems\.org\fR it will not be found\.
.
.TP
\fB\-\-prefer\-local\fR
Force using locally installed gems, or gems already present in Rubygems\' cache or in \fBvendor/cache\fR, when resolving, even if newer versions are available remotely\. Only attempt to connect to \fBrubygems\.org\fR for gems that are not present locally\.
.
.TP
\fB\-\-no\-cache\fR
Do not update the cache in \fBvendor/cache\fR with the newly bundled gems\. This does not remove any gems in the cache but keeps the newly bundled gems from being cached during the install\.
.
.TP
\fB\-\-no\-prune\fR
Don\'t remove stale gems from the cache when the installation finishes\.
.
.IP
This option is deprecated in favor of the \fBno_prune\fR setting\.
.
.TP
\fB\-\-path=<path>\fR
The location to install the specified gems to\. This defaults to Rubygems\' setting\. Bundler shares this location with Rubygems, \fBgem install \.\.\.\fR will have gem installed there, too\. Therefore, gems installed without a \fB\-\-path \.\.\.\fR setting will show up by calling \fBgem list\fR\. Accordingly, gems installed to other locations will not get listed\.
.
.IP
This option is deprecated in favor of the \fBpath\fR setting\.
.
.TP
\fB\-\-quiet\fR
Do not print progress information to the standard output\. Instead, Bundler will exit using a status code (\fB$?\fR)\.
.
.TP
\fB\-\-retry=[<number>]\fR
Retry failed network or git requests for \fInumber\fR times\.
.
.TP
\fB\-\-shebang=<ruby\-executable>\fR
Uses the specified ruby executable (usually \fBruby\fR) to execute the scripts created with \fB\-\-binstubs\fR\. In addition, if you use \fB\-\-binstubs\fR together with \fB\-\-shebang jruby\fR these executables will be changed to execute \fBjruby\fR instead\.
.
.IP
This option is deprecated in favor of the \fBshebang\fR setting\.
.
.TP
\fB\-\-standalone[=<list>]\fR
Makes a bundle that can work without depending on Rubygems or Bundler at runtime\. A space separated list of groups to install has to be specified\. Bundler creates a directory named \fBbundle\fR and installs the bundle there\. It also generates a \fBbundle/bundler/setup\.rb\fR file to replace Bundler\'s own setup in the manner required\. Using this option implicitly sets \fBpath\fR, which is a [remembered option][REMEMBERED OPTIONS]\.
.
.TP
\fB\-\-system\fR
Installs the gems specified in the bundle to the system\'s Rubygems location\. This overrides any previous configuration of \fB\-\-path\fR\.
.
.IP
This option is deprecated in favor of the \fBsystem\fR setting\.
.
.TP
\fB\-\-trust\-policy=[<policy>]\fR
Apply the Rubygems security policy \fIpolicy\fR, where policy is one of \fBHighSecurity\fR, \fBMediumSecurity\fR, \fBLowSecurity\fR, \fBAlmostNoSecurity\fR, or \fBNoSecurity\fR\. For more details, please see the Rubygems signing documentation linked below in \fISEE ALSO\fR\.
.
.TP
\fB\-\-with=<list>\fR
A space\-separated list of groups referencing gems to install\. If an optional group is given it is installed\. If a group is given that is in the remembered list of groups given to \-\-without, it is removed from that list\.
.
.IP
This option is deprecated in favor of the \fBwith\fR setting\.
.
.TP
\fB\-\-without=<list>\fR
A space\-separated list of groups referencing gems to skip during installation\. If a group is given that is in the remembered list of groups given to \-\-with, it is removed from that list\.
.
.IP
This option is deprecated in favor of the \fBwithout\fR setting\.
.
.SH "DEPLOYMENT MODE"
Bundler\'s defaults are optimized for development\. To switch to defaults optimized for deployment and for CI, use the \fB\-\-deployment\fR flag\. Do not activate deployment mode on development machines, as it will cause an error when the Gemfile(5) is modified\.
.
.IP "1." 4
A \fBGemfile\.lock\fR is required\.
.
.IP
To ensure that the same versions of the gems you developed with and tested with are also used in deployments, a \fBGemfile\.lock\fR is required\.
.
.IP
This is mainly to ensure that you remember to check your \fBGemfile\.lock\fR into version control\.
.
.IP "2." 4
The \fBGemfile\.lock\fR must be up to date
.
.IP
In development, you can modify your Gemfile(5) and re\-run \fBbundle install\fR to \fIconservatively update\fR your \fBGemfile\.lock\fR snapshot\.
.
.IP
In deployment, your \fBGemfile\.lock\fR should be up\-to\-date with changes made in your Gemfile(5)\.
.
.IP "3." 4
Gems are installed to \fBvendor/bundle\fR not your default system location
.
.IP
In development, it\'s convenient to share the gems used in your application with other applications and other scripts that run on the system\.
.
.IP
In deployment, isolation is a more important default\. In addition, the user deploying the application may not have permission to install gems to the system, or the web server may not have permission to read them\.
.
.IP
As a result, \fBbundle install \-\-deployment\fR installs gems to the \fBvendor/bundle\fR directory in the application\. This may be overridden using the \fB\-\-path\fR option\.
.
.IP "" 0
.
.SH "SUDO USAGE"
By default, Bundler installs gems to the same location as \fBgem install\fR\.
.
.P
In some cases, that location may not be writable by your Unix user\. In that case, Bundler will stage everything in a temporary directory, then ask you for your \fBsudo\fR password in order to copy the gems into their system location\.
.
.P
From your perspective, this is identical to installing the gems directly into the system\.
.
.P
You should never use \fBsudo bundle install\fR\. This is because several other steps in \fBbundle install\fR must be performed as the current user:
.
.IP "\(bu" 4
Updating your \fBGemfile\.lock\fR
.
.IP "\(bu" 4
Updating your \fBvendor/cache\fR, if necessary
.
.IP "\(bu" 4
Checking out private git repositories using your user\'s SSH keys
.
.IP "" 0
.
.P
Of these three, the first two could theoretically be performed by \fBchown\fRing the resulting files to \fB$SUDO_USER\fR\. The third, however, can only be performed by invoking the \fBgit\fR command as the current user\. Therefore, git gems are downloaded and installed into \fB~/\.bundle\fR rather than $GEM_HOME or $BUNDLE_PATH\.
.
.P
As a result, you should run \fBbundle install\fR as the current user, and Bundler will ask for your password if it is needed to put the gems into their final location\.
.
.SH "INSTALLING GROUPS"
By default, \fBbundle install\fR will install all gems in all groups in your Gemfile(5), except those declared for a different platform\.
.
.P
However, you can explicitly tell Bundler to skip installing certain groups with the \fB\-\-without\fR option\. This option takes a space\-separated list of groups\.
.
.P
While the \fB\-\-without\fR option will skip \fIinstalling\fR the gems in the specified groups, it will still \fIdownload\fR those gems and use them to resolve the dependencies of every gem in your Gemfile(5)\.
.
.P
This is so that installing a different set of groups on another machine (such as a production server) will not change the gems and versions that you have already developed and tested against\.
.
.P
\fBBundler offers a rock\-solid guarantee that the third\-party code you are running in development and testing is also the third\-party code you are running in production\. You can choose to exclude some of that code in different environments, but you will never be caught flat\-footed by different versions of third\-party code being used in different environments\.\fR
.
.P
For a simple illustration, consider the following Gemfile(5):
.
.IP "" 4
.
.nf

source \'https://rubygems\.org\'

gem \'sinatra\'

group :production do
  gem \'rack\-perftools\-profiler\'
end
.
.fi
.
.IP "" 0
.
.P
In this case, \fBsinatra\fR depends on any version of Rack (\fB>= 1\.0\fR), while \fBrack\-perftools\-profiler\fR depends on 1\.x (\fB~> 1\.0\fR)\.
.
.P
When you run \fBbundle install \-\-without production\fR in development, we look at the dependencies of \fBrack\-perftools\-profiler\fR as well\. That way, you do not spend all your time developing against Rack 2\.0, using new APIs unavailable in Rack 1\.x, only to have Bundler switch to Rack 1\.2 when the \fBproduction\fR group \fIis\fR used\.
.
.P
This should not cause any problems in practice, because we do not attempt to \fBinstall\fR the gems in the excluded groups, and only evaluate as part of the dependency resolution process\.
.
.P
This also means that you cannot include different versions of the same gem in different groups, because doing so would result in different sets of dependencies used in development and production\. Because of the vagaries of the dependency resolution process, this usually affects more than the gems you list in your Gemfile(5), and can (surprisingly) radically change the gems you are using\.
.
.SH "THE GEMFILE\.LOCK"
When you run \fBbundle install\fR, Bundler will persist the full names and versions of all gems that you used (including dependencies of the gems specified in the Gemfile(5)) into a file called \fBGemfile\.lock\fR\.
.
.P
Bundler uses this file in all subsequent calls to \fBbundle install\fR, which guarantees that you always use the same exact code, even as your application moves across machines\.
.
.P
Because of the way dependency resolution works, even a seemingly small change (for instance, an update to a point\-release of a dependency of a gem in your Gemfile(5)) can result in radically different gems being needed to satisfy all dependencies\.
.
.P
As a result, you \fBSHOULD\fR check your \fBGemfile\.lock\fR into version control, in both applications and gems\. If you do not, every machine that checks out your repository (including your production server) will resolve all dependencies again, which will result in different versions of third\-party code being used if \fBany\fR of the gems in the Gemfile(5) or any of their dependencies have been updated\.
.
.P
When Bundler first shipped, the \fBGemfile\.lock\fR was included in the \fB\.gitignore\fR file included with generated gems\. Over time, however, it became clear that this practice forces the pain of broken dependencies onto new contributors, while leaving existing contributors potentially unaware of the problem\. Since \fBbundle install\fR is usually the first step towards a contribution, the pain of broken dependencies would discourage new contributors from contributing\. As a result, we have revised our guidance for gem authors to now recommend checking in the lock for gems\.
.
.SH "CONSERVATIVE UPDATING"
When you make a change to the Gemfile(5) and then run \fBbundle install\fR, Bundler will update only the gems that you modified\.
.
.P
In other words, if a gem that you \fBdid not modify\fR worked before you called \fBbundle install\fR, it will continue to use the exact same versions of all dependencies as it used before the update\.
.
.P
Let\'s take a look at an example\. Here\'s your original Gemfile(5):
.
.IP "" 4
.
.nf

source \'https://rubygems\.org\'

gem \'actionpack\', \'2\.3\.8\'
gem \'activemerchant\'
.
.fi
.
.IP "" 0
.
.P
In this case, both \fBactionpack\fR and \fBactivemerchant\fR depend on \fBactivesupport\fR\. The \fBactionpack\fR gem depends on \fBactivesupport 2\.3\.8\fR and \fBrack ~> 1\.1\.0\fR, while the \fBactivemerchant\fR gem depends on \fBactivesupport >= 2\.3\.2\fR, \fBbraintree >= 2\.0\.0\fR, and \fBbuilder >= 2\.0\.0\fR\.
.
.P
When the dependencies are first resolved, Bundler will select \fBactivesupport 2\.3\.8\fR, which satisfies the requirements of both gems in your Gemfile(5)\.
.
.P
Next, you modify your Gemfile(5) to:
.
.IP "" 4
.
.nf

source \'https://rubygems\.org\'

gem \'actionpack\', \'3\.0\.0\.rc\'
gem \'activemerchant\'
.
.fi
.
.IP "" 0
.
.P
The \fBactionpack 3\.0\.0\.rc\fR gem has a number of new dependencies, and updates the \fBactivesupport\fR dependency to \fB= 3\.0\.0\.rc\fR and the \fBrack\fR dependency to \fB~> 1\.2\.1\fR\.
.
.P
When you run \fBbundle install\fR, Bundler notices that you changed the \fBactionpack\fR gem, but not the \fBactivemerchant\fR gem\. It evaluates the gems currently being used to satisfy its requirements:
.
.TP
\fBactivesupport 2\.3\.8\fR
also used to satisfy a dependency in \fBactivemerchant\fR, which is not being updated
.
.TP
\fBrack ~> 1\.1\.0\fR
not currently being used to satisfy another dependency
.
.P
Because you did not explicitly ask to update \fBactivemerchant\fR, you would not expect it to suddenly stop working after updating \fBactionpack\fR\. However, satisfying the new \fBactivesupport 3\.0\.0\.rc\fR dependency of actionpack requires updating one of its dependencies\.
.
.P
Even though \fBactivemerchant\fR declares a very loose dependency that theoretically matches \fBactivesupport 3\.0\.0\.rc\fR, Bundler treats gems in your Gemfile(5) that have not changed as an atomic unit together with their dependencies\. In this case, the \fBactivemerchant\fR dependency is treated as \fBactivemerchant 1\.7\.1 + activesupport 2\.3\.8\fR, so \fBbundle install\fR will report that it cannot update \fBactionpack\fR\.
.
.P
To explicitly update \fBactionpack\fR, including its dependencies which other gems in the Gemfile(5) still depend on, run \fBbundle update actionpack\fR (see \fBbundle update(1)\fR)\.
.
.P
\fBSummary\fR: In general, after making a change to the Gemfile(5) , you should first try to run \fBbundle install\fR, which will guarantee that no other gem in the Gemfile(5) is impacted by the change\. If that does not work, run bundle update(1) \fIbundle\-update\.1\.html\fR\.
.
.SH "SEE ALSO"
.
.IP "\(bu" 4
Gem install docs \fIhttp://guides\.rubygems\.org/rubygems\-basics/#installing\-gems\fR
.
.IP "\(bu" 4
Rubygems signing docs \fIhttp://guides\.rubygems\.org/security/\fR
.
.IP "" 0

PK
}$[;�H��7gems/gems/bundler-2.3.27/lib/bundler/man/bundle-clean.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-CLEAN" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-clean\fR \- Cleans up unused gems in your bundler directory
.
.SH "SYNOPSIS"
\fBbundle clean\fR [\-\-dry\-run] [\-\-force]
.
.SH "DESCRIPTION"
This command will remove all unused gems in your bundler directory\. This is useful when you have made many changes to your gem dependencies\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-dry\-run\fR
Print the changes, but do not clean the unused gems\.
.
.TP
\fB\-\-force\fR
Forces cleaning up unused gems even if Bundler is configured to use globally installed gems\. As a consequence, removes all system gems except for the ones in the current application\.

PK
}$[b�Mp

:gems/gems/bundler-2.3.27/lib/bundler/man/bundle-outdated.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-OUTDATED" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-outdated\fR \- List installed gems with newer versions available
.
.SH "SYNOPSIS"
\fBbundle outdated\fR [GEM] [\-\-local] [\-\-pre] [\-\-source] [\-\-strict] [\-\-parseable | \-\-porcelain] [\-\-group=GROUP] [\-\-groups] [\-\-patch|\-\-minor|\-\-major] [\-\-filter\-major] [\-\-filter\-minor] [\-\-filter\-patch] [\-\-only\-explicit]
.
.SH "DESCRIPTION"
Outdated lists the names and versions of gems that have a newer version available in the given source\. Calling outdated with [GEM [GEM]] will only check for newer versions of the given gems\. Prerelease gems are ignored by default\. If your gems are up to date, Bundler will exit with a status of 0\. Otherwise, it will exit 1\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-local\fR
Do not attempt to fetch gems remotely and use the gem cache instead\.
.
.TP
\fB\-\-pre\fR
Check for newer pre\-release gems\.
.
.TP
\fB\-\-source\fR
Check against a specific source\.
.
.TP
\fB\-\-strict\fR
Only list newer versions allowed by your Gemfile requirements, also respecting conservative update flags (\-\-patch, \-\-minor, \-\-major)\.
.
.TP
\fB\-\-parseable\fR, \fB\-\-porcelain\fR
Use minimal formatting for more parseable output\.
.
.TP
\fB\-\-group\fR
List gems from a specific group\.
.
.TP
\fB\-\-groups\fR
List gems organized by groups\.
.
.TP
\fB\-\-minor\fR
Prefer updating only to next minor version\.
.
.TP
\fB\-\-major\fR
Prefer updating to next major version (default)\.
.
.TP
\fB\-\-patch\fR
Prefer updating only to next patch version\.
.
.TP
\fB\-\-filter\-major\fR
Only list major newer versions\.
.
.TP
\fB\-\-filter\-minor\fR
Only list minor newer versions\.
.
.TP
\fB\-\-filter\-patch\fR
Only list patch newer versions\.
.
.TP
\fB\-\-only\-explicit\fR
Only list gems specified in your Gemfile, not their dependencies\.
.
.SH "PATCH LEVEL OPTIONS"
See bundle update(1) \fIbundle\-update\.1\.html\fR for details\.
.
.SH "FILTERING OUTPUT"
The 3 filtering options do not affect the resolution of versions, merely what versions are shown in the output\.
.
.P
If the regular output shows the following:
.
.IP "" 4
.
.nf

* faker (newest 1\.6\.6, installed 1\.6\.5, requested ~> 1\.4) in groups "development, test"
* hashie (newest 3\.4\.6, installed 1\.2\.0, requested = 1\.2\.0) in groups "default"
* headless (newest 2\.3\.1, installed 2\.2\.3) in groups "test"
.
.fi
.
.IP "" 0
.
.P
\fB\-\-filter\-major\fR would only show:
.
.IP "" 4
.
.nf

* hashie (newest 3\.4\.6, installed 1\.2\.0, requested = 1\.2\.0) in groups "default"
.
.fi
.
.IP "" 0
.
.P
\fB\-\-filter\-minor\fR would only show:
.
.IP "" 4
.
.nf

* headless (newest 2\.3\.1, installed 2\.2\.3) in groups "test"
.
.fi
.
.IP "" 0
.
.P
\fB\-\-filter\-patch\fR would only show:
.
.IP "" 4
.
.nf

* faker (newest 1\.6\.6, installed 1\.6\.5, requested ~> 1\.4) in groups "development, test"
.
.fi
.
.IP "" 0
.
.P
Filter options can be combined\. \fB\-\-filter\-minor\fR and \fB\-\-filter\-patch\fR would show:
.
.IP "" 4
.
.nf

* faker (newest 1\.6\.6, installed 1\.6\.5, requested ~> 1\.4) in groups "development, test"
* headless (newest 2\.3\.1, installed 2\.2\.3) in groups "test"
.
.fi
.
.IP "" 0
.
.P
Combining all three \fBfilter\fR options would be the same result as providing none of them\.
PK
}$[�n��77?gems/gems/bundler-2.3.27/lib/bundler/man/bundle-outdated.1.ronnnu�[���bundle-outdated(1) -- List installed gems with newer versions available
=======================================================================

## SYNOPSIS

`bundle outdated` [GEM] [--local]
                        [--pre]
                        [--source]
                        [--strict]
                        [--parseable | --porcelain]
                        [--group=GROUP]
                        [--groups]
                        [--patch|--minor|--major]
                        [--filter-major]
                        [--filter-minor]
                        [--filter-patch]
                        [--only-explicit]

## DESCRIPTION

Outdated lists the names and versions of gems that have a newer version available
in the given source. Calling outdated with [GEM [GEM]] will only check for newer
versions of the given gems. Prerelease gems are ignored by default. If your gems
are up to date, Bundler will exit with a status of 0. Otherwise, it will exit 1.

## OPTIONS

* `--local`:
  Do not attempt to fetch gems remotely and use the gem cache instead.

* `--pre`:
  Check for newer pre-release gems.

* `--source`:
  Check against a specific source.

* `--strict`:
  Only list newer versions allowed by your Gemfile requirements, also respecting conservative update flags (--patch, --minor, --major).

* `--parseable`, `--porcelain`:
   Use minimal formatting for more parseable output.

* `--group`:
  List gems from a specific group.

* `--groups`:
  List gems organized by groups.

* `--minor`:
  Prefer updating only to next minor version.

* `--major`:
  Prefer updating to next major version (default).

* `--patch`:
  Prefer updating only to next patch version.

* `--filter-major`:
  Only list major newer versions.

* `--filter-minor`:
  Only list minor newer versions.

* `--filter-patch`:
  Only list patch newer versions.

* `--only-explicit`:
  Only list gems specified in your Gemfile, not their dependencies.

## PATCH LEVEL OPTIONS

See [bundle update(1)](bundle-update.1.html) for details.

## FILTERING OUTPUT

The 3 filtering options do not affect the resolution of versions, merely what versions are shown
in the output.

If the regular output shows the following:

    * faker (newest 1.6.6, installed 1.6.5, requested ~> 1.4) in groups "development, test"
    * hashie (newest 3.4.6, installed 1.2.0, requested = 1.2.0) in groups "default"
    * headless (newest 2.3.1, installed 2.2.3) in groups "test"

`--filter-major` would only show:

    * hashie (newest 3.4.6, installed 1.2.0, requested = 1.2.0) in groups "default"

`--filter-minor` would only show:

    * headless (newest 2.3.1, installed 2.2.3) in groups "test"

`--filter-patch` would only show:

    * faker (newest 1.6.6, installed 1.6.5, requested ~> 1.4) in groups "development, test"

Filter options can be combined. `--filter-minor` and `--filter-patch` would show:

    * faker (newest 1.6.6, installed 1.6.5, requested ~> 1.4) in groups "development, test"
    * headless (newest 2.3.1, installed 2.2.3) in groups "test"

Combining all three `filter` options would be the same result as providing none of them.
PK
}$["�:115gems/gems/bundler-2.3.27/lib/bundler/man/bundle-add.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-ADD" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-add\fR \- Add gem to the Gemfile and run bundle install
.
.SH "SYNOPSIS"
\fBbundle add\fR \fIGEM_NAME\fR [\-\-group=GROUP] [\-\-version=VERSION] [\-\-source=SOURCE] [\-\-path=PATH] [\-\-git=GIT] [\-\-github=GITHUB] [\-\-branch=BRANCH] [\-\-ref=REF] [\-\-skip\-install] [\-\-strict] [\-\-optimistic]
.
.SH "DESCRIPTION"
Adds the named gem to the Gemfile and run \fBbundle install\fR\. \fBbundle install\fR can be avoided by using the flag \fB\-\-skip\-install\fR\.
.
.P
Example:
.
.P
bundle add rails
.
.P
bundle add rails \-\-version "< 3\.0, > 1\.1"
.
.P
bundle add rails \-\-version "~> 5\.0\.0" \-\-source "https://gems\.example\.com" \-\-group "development"
.
.P
bundle add rails \-\-skip\-install
.
.P
bundle add rails \-\-group "development, test"
.
.SH "OPTIONS"
.
.TP
\fB\-\-version\fR, \fB\-v\fR
Specify version requirements(s) for the added gem\.
.
.TP
\fB\-\-group\fR, \fB\-g\fR
Specify the group(s) for the added gem\. Multiple groups should be separated by commas\.
.
.TP
\fB\-\-source\fR, \fB\-s\fR
Specify the source for the added gem\.
.
.TP
\fB\-\-require\fR, \fB\-r\fR
Adds require path to gem\. Provide false, or a path as a string\.
.
.TP
\fB\-\-path\fR
Specify the file system path for the added gem\.
.
.TP
\fB\-\-git\fR
Specify the git source for the added gem\.
.
.TP
\fB\-\-github\fR
Specify the github source for the added gem\.
.
.TP
\fB\-\-branch\fR
Specify the git branch for the added gem\.
.
.TP
\fB\-\-ref\fR
Specify the git ref for the added gem\.
.
.TP
\fB\-\-skip\-install\fR
Adds the gem to the Gemfile but does not install it\.
.
.TP
\fB\-\-optimistic\fR
Adds optimistic declaration of version\.
.
.TP
\fB\-\-strict\fR
Adds strict declaration of version\.

PK
}$[��]]6gems/gems/bundler-2.3.27/lib/bundler/man/bundle-exec.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-EXEC" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-exec\fR \- Execute a command in the context of the bundle
.
.SH "SYNOPSIS"
\fBbundle exec\fR [\-\-keep\-file\-descriptors] \fIcommand\fR
.
.SH "DESCRIPTION"
This command executes the command, making all gems specified in the [\fBGemfile(5)\fR][Gemfile(5)] available to \fBrequire\fR in Ruby programs\.
.
.P
Essentially, if you would normally have run something like \fBrspec spec/my_spec\.rb\fR, and you want to use the gems specified in the [\fBGemfile(5)\fR][Gemfile(5)] and installed via bundle install(1) \fIbundle\-install\.1\.html\fR, you should run \fBbundle exec rspec spec/my_spec\.rb\fR\.
.
.P
Note that \fBbundle exec\fR does not require that an executable is available on your shell\'s \fB$PATH\fR\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-keep\-file\-descriptors\fR
Exec in Ruby 2\.0 began discarding non\-standard file descriptors\. When this flag is passed, exec will revert to the 1\.9 behaviour of passing all file descriptors to the new process\.
.
.SH "BUNDLE INSTALL \-\-BINSTUBS"
If you use the \fB\-\-binstubs\fR flag in bundle install(1) \fIbundle\-install\.1\.html\fR, Bundler will automatically create a directory (which defaults to \fBapp_root/bin\fR) containing all of the executables available from gems in the bundle\.
.
.P
After using \fB\-\-binstubs\fR, \fBbin/rspec spec/my_spec\.rb\fR is identical to \fBbundle exec rspec spec/my_spec\.rb\fR\.
.
.SH "ENVIRONMENT MODIFICATIONS"
\fBbundle exec\fR makes a number of changes to the shell environment, then executes the command you specify in full\.
.
.IP "\(bu" 4
make sure that it\'s still possible to shell out to \fBbundle\fR from inside a command invoked by \fBbundle exec\fR (using \fB$BUNDLE_BIN_PATH\fR)
.
.IP "\(bu" 4
put the directory containing executables (like \fBrails\fR, \fBrspec\fR, \fBrackup\fR) for your bundle on \fB$PATH\fR
.
.IP "\(bu" 4
make sure that if bundler is invoked in the subshell, it uses the same \fBGemfile\fR (by setting \fBBUNDLE_GEMFILE\fR)
.
.IP "\(bu" 4
add \fB\-rbundler/setup\fR to \fB$RUBYOPT\fR, which makes sure that Ruby programs invoked in the subshell can see the gems in the bundle
.
.IP "" 0
.
.P
It also modifies Rubygems:
.
.IP "\(bu" 4
disallow loading additional gems not in the bundle
.
.IP "\(bu" 4
modify the \fBgem\fR method to be a no\-op if a gem matching the requirements is in the bundle, and to raise a \fBGem::LoadError\fR if it\'s not
.
.IP "\(bu" 4
Define \fBGem\.refresh\fR to be a no\-op, since the source index is always frozen when using bundler, and to prevent gems from the system leaking into the environment
.
.IP "\(bu" 4
Override \fBGem\.bin_path\fR to use the gems in the bundle, making system executables work
.
.IP "\(bu" 4
Add all gems in the bundle into Gem\.loaded_specs
.
.IP "" 0
.
.P
Finally, \fBbundle exec\fR also implicitly modifies \fBGemfile\.lock\fR if the lockfile and the Gemfile do not match\. Bundler needs the Gemfile to determine things such as a gem\'s groups, \fBautorequire\fR, and platforms, etc\., and that information isn\'t stored in the lockfile\. The Gemfile and lockfile must be synced in order to \fBbundle exec\fR successfully, so \fBbundle exec\fR updates the lockfile beforehand\.
.
.SS "Loading"
By default, when attempting to \fBbundle exec\fR to a file with a ruby shebang, Bundler will \fBKernel\.load\fR that file instead of using \fBKernel\.exec\fR\. For the vast majority of cases, this is a performance improvement\. In a rare few cases, this could cause some subtle side\-effects (such as dependence on the exact contents of \fB$0\fR or \fB__FILE__\fR) and the optimization can be disabled by enabling the \fBdisable_exec_load\fR setting\.
.
.SS "Shelling out"
Any Ruby code that opens a subshell (like \fBsystem\fR, backticks, or \fB%x{}\fR) will automatically use the current Bundler environment\. If you need to shell out to a Ruby command that is not part of your current bundle, use the \fBwith_clean_env\fR method with a block\. Any subshells created inside the block will be given the environment present before Bundler was activated\. For example, Homebrew commands run Ruby, but don\'t work inside a bundle:
.
.IP "" 4
.
.nf

Bundler\.with_clean_env do
  `brew install wget`
end
.
.fi
.
.IP "" 0
.
.P
Using \fBwith_clean_env\fR is also necessary if you are shelling out to a different bundle\. Any Bundler commands run in a subshell will inherit the current Gemfile, so commands that need to run in the context of a different bundle also need to use \fBwith_clean_env\fR\.
.
.IP "" 4
.
.nf

Bundler\.with_clean_env do
  Dir\.chdir "/other/bundler/project" do
    `bundle exec \./script`
  end
end
.
.fi
.
.IP "" 0
.
.P
Bundler provides convenience helpers that wrap \fBsystem\fR and \fBexec\fR, and they can be used like this:
.
.IP "" 4
.
.nf

Bundler\.clean_system(\'brew install wget\')
Bundler\.clean_exec(\'brew install wget\')
.
.fi
.
.IP "" 0
.
.SH "RUBYGEMS PLUGINS"
At present, the Rubygems plugin system requires all files named \fBrubygems_plugin\.rb\fR on the load path of \fIany\fR installed gem when any Ruby code requires \fBrubygems\.rb\fR\. This includes executables installed into the system, like \fBrails\fR, \fBrackup\fR, and \fBrspec\fR\.
.
.P
Since Rubygems plugins can contain arbitrary Ruby code, they commonly end up activating themselves or their dependencies\.
.
.P
For instance, the \fBgemcutter 0\.5\fR gem depended on \fBjson_pure\fR\. If you had that version of gemcutter installed (even if you \fIalso\fR had a newer version without this problem), Rubygems would activate \fBgemcutter 0\.5\fR and \fBjson_pure <latest>\fR\.
.
.P
If your Gemfile(5) also contained \fBjson_pure\fR (or a gem with a dependency on \fBjson_pure\fR), the latest version on your system might conflict with the version in your Gemfile(5), or the snapshot version in your \fBGemfile\.lock\fR\.
.
.P
If this happens, bundler will say:
.
.IP "" 4
.
.nf

You have already activated json_pure 1\.4\.6 but your Gemfile
requires json_pure 1\.4\.3\. Consider using bundle exec\.
.
.fi
.
.IP "" 0
.
.P
In this situation, you almost certainly want to remove the underlying gem with the problematic gem plugin\. In general, the authors of these plugins (in this case, the \fBgemcutter\fR gem) have released newer versions that are more careful in their plugins\.
.
.P
You can find a list of all the gems containing gem plugins by running
.
.IP "" 4
.
.nf

ruby \-e "puts Gem\.find_files(\'rubygems_plugin\.rb\')"
.
.fi
.
.IP "" 0
.
.P
At the very least, you should remove all but the newest version of each gem plugin, and also remove all gem plugins that you aren\'t using (\fBgem uninstall gem_name\fR)\.
PK
}$[���o��>gems/gems/bundler-2.3.27/lib/bundler/man/bundle-version.1.ronnnu�[���bundle-version(1) -- Prints Bundler version information
=======================================================

## SYNOPSIS

`bundle version`

## DESCRIPTION

Prints Bundler version information.

## OPTIONS

No options.

## EXAMPLE

Print the version of Bundler with build date and commit hash of the in the Git source.

    bundle version

shows `Bundler version 2.3.21 (2022-08-24 commit d54be5fdd8)` for example.

cf. `bundle --version` shows `Bundler version 2.3.21`.
PK
}$[B�:��6gems/gems/bundler-2.3.27/lib/bundler/man/bundle-help.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-HELP" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-help\fR \- Displays detailed help for each subcommand
.
.SH "SYNOPSIS"
\fBbundle help\fR [COMMAND]
.
.SH "DESCRIPTION"
Displays detailed help for the given subcommand\. You can specify a single \fBCOMMAND\fR at the same time\. When \fBCOMMAND\fR is omitted, help for \fBhelp\fR command will be displayed\.
PK
}$[�[�n��7gems/gems/bundler-2.3.27/lib/bundler/man/bundle-check.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-CHECK" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-check\fR \- Verifies if dependencies are satisfied by installed gems
.
.SH "SYNOPSIS"
\fBbundle check\fR [\-\-dry\-run] [\-\-gemfile=FILE] [\-\-path=PATH]
.
.SH "DESCRIPTION"
\fBcheck\fR searches the local machine for each of the gems requested in the Gemfile\. If all gems are found, Bundler prints a success message and exits with a status of 0\.
.
.P
If not, the first missing gem is listed and Bundler exits status 1\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-dry\-run\fR
Locks the [\fBGemfile(5)\fR][Gemfile(5)] before running the command\.
.
.TP
\fB\-\-gemfile\fR
Use the specified gemfile instead of the [\fBGemfile(5)\fR][Gemfile(5)]\.
.
.TP
\fB\-\-path\fR
Specify a different path than the system default (\fB$BUNDLE_PATH\fR or \fB$GEM_HOME\fR)\. Bundler will remember this value for future installs on this machine\.

PK
}$[O�tu��=gems/gems/bundler-2.3.27/lib/bundler/man/bundle-inject.1.ronnnu�[���bundle-inject(1) -- Add named gem(s) with version requirements to Gemfile
=========================================================================

## SYNOPSIS

`bundle inject` [GEM] [VERSION]

## DESCRIPTION

Adds the named gem(s) with their version requirements to the resolved
[`Gemfile(5)`][Gemfile(5)].

This command will add the gem to both your [`Gemfile(5)`][Gemfile(5)] and Gemfile.lock if it
isn't listed yet.

Example:

    bundle install
    bundle inject 'rack' '> 0'

This will inject the 'rack' gem with a version greater than 0 in your
[`Gemfile(5)`][Gemfile(5)] and Gemfile.lock.

The `bundle inject` command was deprecated in Bundler 2.1 and will be removed in Bundler 3.0.
PK
}$[Ժ�p��1gems/gems/bundler-2.3.27/lib/bundler/man/bundle.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\fR \- Ruby Dependency Management
.
.SH "SYNOPSIS"
\fBbundle\fR COMMAND [\-\-no\-color] [\-\-verbose] [ARGS]
.
.SH "DESCRIPTION"
Bundler manages an \fBapplication\'s dependencies\fR through its entire life across many machines systematically and repeatably\.
.
.P
See the bundler website \fIhttps://bundler\.io\fR for information on getting started, and Gemfile(5) for more information on the \fBGemfile\fR format\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-no\-color\fR
Print all output without color
.
.TP
\fB\-\-retry\fR, \fB\-r\fR
Specify the number of times you wish to attempt network commands
.
.TP
\fB\-\-verbose\fR, \fB\-V\fR
Print out additional logging information
.
.SH "BUNDLE COMMANDS"
We divide \fBbundle\fR subcommands into primary commands and utilities:
.
.SH "PRIMARY COMMANDS"
.
.TP
\fBbundle install(1)\fR \fIbundle\-install\.1\.html\fR
Install the gems specified by the \fBGemfile\fR or \fBGemfile\.lock\fR
.
.TP
\fBbundle update(1)\fR \fIbundle\-update\.1\.html\fR
Update dependencies to their latest versions
.
.TP
\fBbundle cache(1)\fR \fIbundle\-cache\.1\.html\fR
Package the \.gem files required by your application into the \fBvendor/cache\fR directory (aliases: \fBbundle package\fR, \fBbundle pack\fR)
.
.TP
\fBbundle exec(1)\fR \fIbundle\-exec\.1\.html\fR
Execute a script in the current bundle
.
.TP
\fBbundle config(1)\fR \fIbundle\-config\.1\.html\fR
Specify and read configuration options for Bundler
.
.TP
\fBbundle help(1)\fR \fIbundle\-help\.1\.html\fR
Display detailed help for each subcommand
.
.SH "UTILITIES"
.
.TP
\fBbundle add(1)\fR \fIbundle\-add\.1\.html\fR
Add the named gem to the Gemfile and run \fBbundle install\fR
.
.TP
\fBbundle binstubs(1)\fR \fIbundle\-binstubs\.1\.html\fR
Generate binstubs for executables in a gem
.
.TP
\fBbundle check(1)\fR \fIbundle\-check\.1\.html\fR
Determine whether the requirements for your application are installed and available to Bundler
.
.TP
\fBbundle show(1)\fR \fIbundle\-show\.1\.html\fR
Show the source location of a particular gem in the bundle
.
.TP
\fBbundle outdated(1)\fR \fIbundle\-outdated\.1\.html\fR
Show all of the outdated gems in the current bundle
.
.TP
\fBbundle console(1)\fR (deprecated)
Start an IRB session in the current bundle
.
.TP
\fBbundle open(1)\fR \fIbundle\-open\.1\.html\fR
Open an installed gem in the editor
.
.TP
\fBbundle lock(1)\fR \fIbundle\-lock\.1\.html\fR
Generate a lockfile for your dependencies
.
.TP
\fBbundle viz(1)\fR \fIbundle\-viz\.1\.html\fR (deprecated)
Generate a visual representation of your dependencies
.
.TP
\fBbundle init(1)\fR \fIbundle\-init\.1\.html\fR
Generate a simple \fBGemfile\fR, placed in the current directory
.
.TP
\fBbundle gem(1)\fR \fIbundle\-gem\.1\.html\fR
Create a simple gem, suitable for development with Bundler
.
.TP
\fBbundle platform(1)\fR \fIbundle\-platform\.1\.html\fR
Display platform compatibility information
.
.TP
\fBbundle clean(1)\fR \fIbundle\-clean\.1\.html\fR
Clean up unused gems in your Bundler directory
.
.TP
\fBbundle doctor(1)\fR \fIbundle\-doctor\.1\.html\fR
Display warnings about common problems
.
.TP
\fBbundle remove(1)\fR \fIbundle\-remove\.1\.html\fR
Removes gems from the Gemfile
.
.TP
\fBbundle plugin(1)\fR \fIbundle\-plugin\.1\.html\fR
Manage Bundler plugins
.
.TP
\fBbundle version(1)\fR \fIbundle\-version\.1\.html\fR
Prints Bundler version information
.
.SH "PLUGINS"
When running a command that isn\'t listed in PRIMARY COMMANDS or UTILITIES, Bundler will try to find an executable on your path named \fBbundler\-<command>\fR and execute it, passing down any extra arguments to it\.
.
.SH "OBSOLETE"
These commands are obsolete and should no longer be used:
.
.IP "\(bu" 4
\fBbundle inject(1)\fR
.
.IP "" 0

PK
}$[��h���;gems/gems/bundler-2.3.27/lib/bundler/man/bundle-init.1.ronnnu�[���bundle-init(1) -- Generates a Gemfile into the current working directory
========================================================================

## SYNOPSIS

`bundle init` [--gemspec=FILE]

## DESCRIPTION

Init generates a default [`Gemfile(5)`][Gemfile(5)] in the current working directory. When
adding a [`Gemfile(5)`][Gemfile(5)] to a gem with a gemspec, the `--gemspec` option will
automatically add each dependency listed in the gemspec file to the newly
created [`Gemfile(5)`][Gemfile(5)].

## OPTIONS

* `--gemspec`:
  Use the specified .gemspec to create the [`Gemfile(5)`][Gemfile(5)]

## FILES

Included in the default [`Gemfile(5)`][Gemfile(5)]
generated is the line `# frozen_string_literal: true`. This is a magic comment
supported for the first time in Ruby 2.3. The presence of this line
results in all string literals in the file being implicitly frozen.

## SEE ALSO

[Gemfile(5)](https://bundler.io/man/gemfile.5.html)
PK
}$[�V�#;gems/gems/bundler-2.3.27/lib/bundler/man/bundle-list.1.ronnnu�[���bundle-list(1) -- List all the gems in the bundle
=========================================================================

## SYNOPSIS

`bundle list` [--name-only] [--paths] [--without-group=GROUP[ GROUP...]] [--only-group=GROUP[ GROUP...]]

## DESCRIPTION

Prints a list of all the gems in the bundle including their version.

Example:

bundle list --name-only

bundle list --paths

bundle list --without-group test

bundle list --only-group dev

bundle list --only-group dev test --paths

## OPTIONS

* `--name-only`:
  Print only the name of each gem.
* `--paths`:
  Print the path to each gem in the bundle.
* `--without-group=<list>`:
  A space-separated list of groups of gems to skip during printing.
* `--only-group=<list>`:
  A space-separated list of groups of gems to print.
PK
}$[�'�+
+
6gems/gems/bundler-2.3.27/lib/bundler/man/bundle.1.ronnnu�[���bundle(1) -- Ruby Dependency Management
=======================================

## SYNOPSIS

`bundle` COMMAND [--no-color] [--verbose] [ARGS]

## DESCRIPTION

Bundler manages an `application's dependencies` through its entire life
across many machines systematically and repeatably.

See [the bundler website](https://bundler.io) for information on getting
started, and Gemfile(5) for more information on the `Gemfile` format.

## OPTIONS

* `--no-color`:
  Print all output without color

* `--retry`, `-r`:
  Specify the number of times you wish to attempt network commands

* `--verbose`, `-V`:
  Print out additional logging information

## BUNDLE COMMANDS

We divide `bundle` subcommands into primary commands and utilities:

## PRIMARY COMMANDS

* [`bundle install(1)`](bundle-install.1.html):
  Install the gems specified by the `Gemfile` or `Gemfile.lock`

* [`bundle update(1)`](bundle-update.1.html):
  Update dependencies to their latest versions

* [`bundle cache(1)`](bundle-cache.1.html):
  Package the .gem files required by your application into the
  `vendor/cache` directory (aliases: `bundle package`, `bundle pack`)

* [`bundle exec(1)`](bundle-exec.1.html):
  Execute a script in the current bundle

* [`bundle config(1)`](bundle-config.1.html):
  Specify and read configuration options for Bundler

* [`bundle help(1)`](bundle-help.1.html):
  Display detailed help for each subcommand

## UTILITIES

* [`bundle add(1)`](bundle-add.1.html):
  Add the named gem to the Gemfile and run `bundle install`

* [`bundle binstubs(1)`](bundle-binstubs.1.html):
  Generate binstubs for executables in a gem

* [`bundle check(1)`](bundle-check.1.html):
  Determine whether the requirements for your application are installed
  and available to Bundler

* [`bundle show(1)`](bundle-show.1.html):
  Show the source location of a particular gem in the bundle

* [`bundle outdated(1)`](bundle-outdated.1.html):
  Show all of the outdated gems in the current bundle

* `bundle console(1)` (deprecated):
  Start an IRB session in the current bundle

* [`bundle open(1)`](bundle-open.1.html):
  Open an installed gem in the editor

* [`bundle lock(1)`](bundle-lock.1.html):
  Generate a lockfile for your dependencies

* [`bundle viz(1)`](bundle-viz.1.html) (deprecated):
  Generate a visual representation of your dependencies

* [`bundle init(1)`](bundle-init.1.html):
  Generate a simple `Gemfile`, placed in the current directory

* [`bundle gem(1)`](bundle-gem.1.html):
  Create a simple gem, suitable for development with Bundler

* [`bundle platform(1)`](bundle-platform.1.html):
  Display platform compatibility information

* [`bundle clean(1)`](bundle-clean.1.html):
  Clean up unused gems in your Bundler directory

* [`bundle doctor(1)`](bundle-doctor.1.html):
  Display warnings about common problems

* [`bundle remove(1)`](bundle-remove.1.html):
  Removes gems from the Gemfile

* [`bundle plugin(1)`](bundle-plugin.1.html):
  Manage Bundler plugins

* [`bundle version(1)`](bundle-version.1.html):
  Prints Bundler version information

## PLUGINS

When running a command that isn't listed in PRIMARY COMMANDS or UTILITIES,
Bundler will try to find an executable on your path named `bundler-<command>`
and execute it, passing down any extra arguments to it.

## OBSOLETE

These commands are obsolete and should no longer be used:

* `bundle inject(1)`
PK
}$[��#s��?gems/gems/bundler-2.3.27/lib/bundler/man/bundle-pristine.1.ronnnu�[���bundle-pristine(1) -- Restores installed gems to their pristine condition
===========================================================================

## SYNOPSIS

`bundle pristine`

## DESCRIPTION

`pristine` restores the installed gems in the bundle to their pristine condition
using the local gem cache from RubyGems. For git gems, a forced checkout will be performed.

For further explanation, `bundle pristine` ignores unpacked files on disk. In other
words, this command utilizes the local `.gem` cache or the gem's git repository
as if one were installing from scratch.

Note: the Bundler gem cannot be restored to its original state with `pristine`.
One also cannot use `bundle pristine` on gems with a 'path' option in the Gemfile,
because bundler has no original copy it can restore from.

When is it practical to use `bundle pristine`?

It comes in handy when a developer is debugging a gem. `bundle pristine` is a
great way to get rid of experimental changes to a gem that one may not want.

Why use `bundle pristine` over `gem pristine --all`?

Both commands are very similar.
For context: `bundle pristine`, without arguments, cleans all gems from the lockfile.
Meanwhile, `gem pristine --all` cleans all installed gems for that Ruby version.

If a developer forgets which gems in their project they might
have been debugging, the Rubygems `gem pristine [GEMNAME]` command may be inconvenient.
One can avoid waiting for `gem pristine --all`, and instead run `bundle pristine`.
PK
}$[1��>��9gems/gems/bundler-2.3.27/lib/bundler/man/bundle-console.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-CONSOLE" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-console\fR \- Deprecated way to open an IRB session with the bundle pre\-loaded
.
.SH "SYNOPSIS"
\fBbundle console\fR [GROUP]
.
.SH "DESCRIPTION"
Starts an interactive Ruby console session in the context of the current bundle\.
.
.P
If no \fBGROUP\fR is specified, all gems in the \fBdefault\fR group in the Gemfile(5) \fIhttps://bundler\.io/man/gemfile\.5\.html\fR are preliminarily loaded\.
.
.P
If \fBGROUP\fR is specified, all gems in the given group in the Gemfile in addition to the gems in \fBdefault\fR group are loaded\. Even if the given group does not exist in the Gemfile, IRB console starts without any warning or error\.
.
.P
The environment variable \fBBUNDLE_CONSOLE\fR or \fBbundle config set console\fR can be used to change the shell from the following:
.
.IP "\(bu" 4
\fBirb\fR (default)
.
.IP "\(bu" 4
\fBpry\fR (https://github\.com/pry/pry)
.
.IP "\(bu" 4
\fBripl\fR (https://github\.com/cldwalker/ripl)
.
.IP "" 0
.
.P
\fBbundle console\fR uses irb by default\. An alternative Pry or Ripl can be used with \fBbundle console\fR by adjusting the \fBconsole\fR Bundler setting\. Also make sure that \fBpry\fR or \fBripl\fR is in your Gemfile\.
.
.SH "EXAMPLE"
.
.nf

$ bundle config set console pry
$ bundle console
Resolving dependencies\.\.\.
[1] pry(main)>
.
.fi
.
.SH "NOTES"
This command was deprecated in Bundler 2\.1 and will be removed in 3\.0\. Use \fBbin/console\fR script, which can be generated by \fBbundle gem <NAME>\fR\.
.
.SH "SEE ALSO"
Gemfile(5) \fIhttps://bundler\.io/man/gemfile\.5\.html\fR
PK
}$[���qq;gems/gems/bundler-2.3.27/lib/bundler/man/bundle-exec.1.ronnnu�[���bundle-exec(1) -- Execute a command in the context of the bundle
================================================================

## SYNOPSIS

`bundle exec` [--keep-file-descriptors] <command>

## DESCRIPTION

This command executes the command, making all gems specified in the
[`Gemfile(5)`][Gemfile(5)] available to `require` in Ruby programs.

Essentially, if you would normally have run something like
`rspec spec/my_spec.rb`, and you want to use the gems specified
in the [`Gemfile(5)`][Gemfile(5)] and installed via [bundle install(1)](bundle-install.1.html), you
should run `bundle exec rspec spec/my_spec.rb`.

Note that `bundle exec` does not require that an executable is
available on your shell's `$PATH`.

## OPTIONS

* `--keep-file-descriptors`:
  Exec in Ruby 2.0 began discarding non-standard file descriptors. When this
  flag is passed, exec will revert to the 1.9 behaviour of passing all file
  descriptors to the new process.

## BUNDLE INSTALL --BINSTUBS

If you use the `--binstubs` flag in [bundle install(1)](bundle-install.1.html), Bundler will
automatically create a directory (which defaults to `app_root/bin`)
containing all of the executables available from gems in the bundle.

After using `--binstubs`, `bin/rspec spec/my_spec.rb` is identical
to `bundle exec rspec spec/my_spec.rb`.

## ENVIRONMENT MODIFICATIONS

`bundle exec` makes a number of changes to the shell environment,
then executes the command you specify in full.

* make sure that it's still possible to shell out to `bundle`
  from inside a command invoked by `bundle exec` (using
  `$BUNDLE_BIN_PATH`)
* put the directory containing executables (like `rails`, `rspec`,
  `rackup`) for your bundle on `$PATH`
* make sure that if bundler is invoked in the subshell, it uses
  the same `Gemfile` (by setting `BUNDLE_GEMFILE`)
* add `-rbundler/setup` to `$RUBYOPT`, which makes sure that
  Ruby programs invoked in the subshell can see the gems in
  the bundle

It also modifies Rubygems:

* disallow loading additional gems not in the bundle
* modify the `gem` method to be a no-op if a gem matching
  the requirements is in the bundle, and to raise a
  `Gem::LoadError` if it's not
* Define `Gem.refresh` to be a no-op, since the source
  index is always frozen when using bundler, and to
  prevent gems from the system leaking into the environment
* Override `Gem.bin_path` to use the gems in the bundle,
  making system executables work
* Add all gems in the bundle into Gem.loaded_specs

Finally, `bundle exec` also implicitly modifies `Gemfile.lock` if the lockfile
and the Gemfile do not match. Bundler needs the Gemfile to determine things
such as a gem's groups, `autorequire`, and platforms, etc., and that
information isn't stored in the lockfile. The Gemfile and lockfile must be
synced in order to `bundle exec` successfully, so `bundle exec`
updates the lockfile beforehand.

### Loading

By default, when attempting to `bundle exec` to a file with a ruby shebang,
Bundler will `Kernel.load` that file instead of using `Kernel.exec`. For the
vast majority of cases, this is a performance improvement. In a rare few cases,
this could cause some subtle side-effects (such as dependence on the exact
contents of `$0` or `__FILE__`) and the optimization can be disabled by enabling
the `disable_exec_load` setting.

### Shelling out

Any Ruby code that opens a subshell (like `system`, backticks, or `%x{}`) will
automatically use the current Bundler environment. If you need to shell out to
a Ruby command that is not part of your current bundle, use the
`with_clean_env` method with a block. Any subshells created inside the block
will be given the environment present before Bundler was activated. For
example, Homebrew commands run Ruby, but don't work inside a bundle:

    Bundler.with_clean_env do
      `brew install wget`
    end

Using `with_clean_env` is also necessary if you are shelling out to a different
bundle. Any Bundler commands run in a subshell will inherit the current
Gemfile, so commands that need to run in the context of a different bundle also
need to use `with_clean_env`.

    Bundler.with_clean_env do
      Dir.chdir "/other/bundler/project" do
        `bundle exec ./script`
      end
    end

Bundler provides convenience helpers that wrap `system` and `exec`, and they
can be used like this:

    Bundler.clean_system('brew install wget')
    Bundler.clean_exec('brew install wget')


## RUBYGEMS PLUGINS

At present, the Rubygems plugin system requires all files
named `rubygems_plugin.rb` on the load path of _any_ installed
gem when any Ruby code requires `rubygems.rb`. This includes
executables installed into the system, like `rails`, `rackup`,
and `rspec`.

Since Rubygems plugins can contain arbitrary Ruby code, they
commonly end up activating themselves or their dependencies.

For instance, the `gemcutter 0.5` gem depended on `json_pure`.
If you had that version of gemcutter installed (even if
you _also_ had a newer version without this problem), Rubygems
would activate `gemcutter 0.5` and `json_pure <latest>`.

If your Gemfile(5) also contained `json_pure` (or a gem
with a dependency on `json_pure`), the latest version on
your system might conflict with the version in your
Gemfile(5), or the snapshot version in your `Gemfile.lock`.

If this happens, bundler will say:

    You have already activated json_pure 1.4.6 but your Gemfile
    requires json_pure 1.4.3. Consider using bundle exec.

In this situation, you almost certainly want to remove the
underlying gem with the problematic gem plugin. In general,
the authors of these plugins (in this case, the `gemcutter`
gem) have released newer versions that are more careful in
their plugins.

You can find a list of all the gems containing gem plugins
by running

    ruby -e "puts Gem.find_files('rubygems_plugin.rb')"

At the very least, you should remove all but the newest
version of each gem plugin, and also remove all gem plugins
that you aren't using (`gem uninstall gem_name`).
PK
}$[M��666gems/gems/bundler-2.3.27/lib/bundler/man/bundle-init.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-INIT" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-init\fR \- Generates a Gemfile into the current working directory
.
.SH "SYNOPSIS"
\fBbundle init\fR [\-\-gemspec=FILE]
.
.SH "DESCRIPTION"
Init generates a default [\fBGemfile(5)\fR][Gemfile(5)] in the current working directory\. When adding a [\fBGemfile(5)\fR][Gemfile(5)] to a gem with a gemspec, the \fB\-\-gemspec\fR option will automatically add each dependency listed in the gemspec file to the newly created [\fBGemfile(5)\fR][Gemfile(5)]\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-gemspec\fR
Use the specified \.gemspec to create the [\fBGemfile(5)\fR][Gemfile(5)]
.
.SH "FILES"
Included in the default [\fBGemfile(5)\fR][Gemfile(5)] generated is the line \fB# frozen_string_literal: true\fR\. This is a magic comment supported for the first time in Ruby 2\.3\. The presence of this line results in all string literals in the file being implicitly frozen\.
.
.SH "SEE ALSO"
Gemfile(5) \fIhttps://bundler\.io/man/gemfile\.5\.html\fR
PK}$[��:gems/gems/bundler-2.3.27/lib/bundler/man/bundle-add.1.ronnnu�[���bundle-add(1) -- Add gem to the Gemfile and run bundle install
================================================================

## SYNOPSIS

`bundle add` <GEM_NAME> [--group=GROUP] [--version=VERSION] [--source=SOURCE] [--path=PATH] [--git=GIT] [--github=GITHUB] [--branch=BRANCH] [--ref=REF] [--skip-install] [--strict] [--optimistic]

## DESCRIPTION
Adds the named gem to the Gemfile and run `bundle install`. `bundle install` can be avoided by using the flag `--skip-install`.

Example:

bundle add rails

bundle add rails --version "< 3.0, > 1.1"

bundle add rails --version "~> 5.0.0" --source "https://gems.example.com" --group "development"

bundle add rails --skip-install

bundle add rails --group "development, test"

## OPTIONS
* `--version`, `-v`:
  Specify version requirements(s) for the added gem.

* `--group`, `-g`:
  Specify the group(s) for the added gem. Multiple groups should be separated by commas.

* `--source`, `-s`:
  Specify the source for the added gem.

* `--require`, `-r`:
  Adds require path to gem. Provide false, or a path as a string.

* `--path`:
  Specify the file system path for the added gem.

* `--git`:
  Specify the git source for the added gem.

* `--github`:
  Specify the github source for the added gem.

* `--branch`:
  Specify the git branch for the added gem.

* `--ref`:
  Specify the git ref for the added gem.

* `--skip-install`:
  Adds the gem to the Gemfile but does not install it.

* `--optimistic`:
  Adds optimistic declaration of version.

* `--strict`:
  Adds strict declaration of version.
PK}$[6�H��=gems/gems/bundler-2.3.27/lib/bundler/man/bundle-doctor.1.ronnnu�[���bundle-doctor(1) -- Checks the bundle for common problems
=========================================================

## SYNOPSIS

`bundle doctor` [--quiet]
                [--gemfile=GEMFILE]

## DESCRIPTION

Checks your Gemfile and gem environment for common problems. If issues
are detected, Bundler prints them and exits status 1. Otherwise,
Bundler prints a success message and exits status 0.

Examples of common problems caught by bundle-doctor include:

* Invalid Bundler settings
* Mismatched Ruby versions
* Mismatched platforms
* Uninstalled gems
* Missing dependencies

## OPTIONS

* `--quiet`:
  Only output warnings and errors.

* `--gemfile=<gemfile>`:
  The location of the Gemfile(5) which Bundler should use. This defaults
  to a Gemfile(5) in the current working directory. In general, Bundler
  will assume that the location of the Gemfile(5) is also the project's
  root and will try to find `Gemfile.lock` and `vendor/cache` relative
  to this location.
PK}$[�TI;;:gems/gems/bundler-2.3.27/lib/bundler/man/bundle-viz.1.ronnnu�[���bundle-viz(1) -- Generates a visual dependency graph for your Gemfile
=====================================================================

## SYNOPSIS

`bundle viz` [--file=FILE]
             [--format=FORMAT]
             [--requirements]
             [--version]
             [--without=GROUP GROUP]

## DESCRIPTION

`viz` generates a PNG file of the current `Gemfile(5)` as a dependency graph.
`viz` requires the ruby-graphviz gem (and its dependencies).

The associated gems must also be installed via [`bundle install(1)`](bundle-install.1.html).

`viz` command was deprecated in Bundler 2.2. Use [bundler-graph plugin](https://github.com/rubygems/bundler-graph) instead.

## OPTIONS

* `--file`, `-f`:
  The name to use for the generated file. See `--format` option
* `--format`, `-F`:
  This is output format option. Supported format is png, jpg, svg, dot ...
* `--requirements`, `-R`:
  Set to show the version of each required dependency.
* `--version`, `-v`:
  Set to show each gem version.
* `--without`, `-W`:
  Exclude gems that are part of the specified named group.
PK}$[˱[y��=gems/gems/bundler-2.3.27/lib/bundler/man/bundle-remove.1.ronnnu�[���bundle-remove(1) -- Removes gems from the Gemfile
===========================================================================

## SYNOPSIS

`bundle remove [GEM [GEM ...]] [--install]`

## DESCRIPTION

Removes the given gems from the Gemfile while ensuring that the resulting Gemfile is still valid. If a gem cannot be removed, a warning is printed. If a gem is already absent from the Gemfile, and error is raised.

## OPTIONS

* `--install`:
  Runs `bundle install` after the given gems have been removed from the Gemfile, which ensures that both the lockfile and the installed gems on disk are also updated to remove the given gem(s).

Example:

bundle remove rails

bundle remove rails rack

bundle remove rails rack --install
PK}$[ZۖX3R3R7gems/gems/bundler-2.3.27/lib/bundler/man/gemfile.5.ronnnu�[���Gemfile(5) -- A format for describing gem dependencies for Ruby programs
========================================================================

## SYNOPSIS

A `Gemfile` describes the gem dependencies required to execute associated
Ruby code.

Place the `Gemfile` in the root of the directory containing the associated
code. For instance, in a Rails application, place the `Gemfile` in the same
directory as the `Rakefile`.

## SYNTAX

A `Gemfile` is evaluated as Ruby code, in a context which makes available
a number of methods used to describe the gem requirements.

## GLOBAL SOURCE

At the top of the `Gemfile`, add a single line for the `RubyGems` source that
contains the gems listed in the `Gemfile`.

    source "https://rubygems.org"

You can add only one global source. In Bundler 1.13, adding multiple global
sources was deprecated. The `source` `MUST` be a valid RubyGems repository.

To use more than one source of RubyGems, you should use [`source` block
](#BLOCK-FORM-OF-SOURCE-GIT-PATH-GROUP-and-PLATFORMS).

A source is checked for gems following the heuristics described in
[SOURCE PRIORITY][].

**Note about a behavior of the feature deprecated in Bundler 1.13**:
If a gem is found in more than one global source, Bundler
will print a warning after installing the gem indicating which source was used,
and listing the other sources where the gem is available. A specific source can
be selected for gems that need to use a non-standard repository, suppressing
this warning, by using the [`:source` option](#SOURCE) or `source` block.

### CREDENTIALS

Some gem sources require a username and password. Use [bundle config(1)](bundle-config.1.html) to set
the username and password for any of the sources that need it. The command must
be run once on each computer that will install the Gemfile, but this keeps the
credentials from being stored in plain text in version control.

    bundle config gems.example.com user:password

For some sources, like a company Gemfury account, it may be easier to
include the credentials in the Gemfile as part of the source URL.

    source "https://user:password@gems.example.com"

Credentials in the source URL will take precedence over credentials set using
`config`.

## RUBY

If your application requires a specific Ruby version or engine, specify your
requirements using the `ruby` method, with the following arguments.
All parameters are `OPTIONAL` unless otherwise specified.

### VERSION (required)

The version of Ruby that your application requires. If your application
requires an alternate Ruby engine, such as JRuby, TruffleRuby, etc., this
should be the Ruby version that the engine is compatible with.

    ruby "3.1.2"

### ENGINE

Each application _may_ specify a Ruby engine. If an engine is specified, an
engine version _must_ also be specified.

What exactly is an Engine?
  - A Ruby engine is an implementation of the Ruby language.

  - For background: the reference or original implementation of the Ruby
    programming language is called
    [Matz's Ruby Interpreter](https://en.wikipedia.org/wiki/Ruby_MRI), or  MRI
    for short. This is named after Ruby creator Yukihiro Matsumoto,
    also known as Matz. MRI is also known as CRuby, because it is written in C.
    MRI is the most widely used Ruby engine.

  - [Other implementations](https://www.ruby-lang.org/en/about/) of Ruby exist.
    Some of the more well-known implementations include
    [JRuby](http://jruby.org/) and [TruffleRuby](https://www.graalvm.org/ruby/).
    Rubinius is an alternative implementation of Ruby written in Ruby.
    JRuby is an implementation of Ruby on the JVM, short for Java Virtual Machine.
    TruffleRuby is a Ruby implementation on the GraalVM, a language toolkit built on the JVM.

### ENGINE VERSION

Each application _may_ specify a Ruby engine version. If an engine version is
specified, an engine _must_ also be specified. If the engine is "ruby" the
engine version specified _must_ match the Ruby version.

    ruby "2.6.8", engine: "jruby", engine_version: "9.3.8.0"

### PATCHLEVEL

Each application _may_ specify a Ruby patchlevel. Specifying the patchlevel has
been meaningless since Ruby 2.1.0 was released as the patchlevel is now
uniquely determined by a combination of major, minor, and teeny version numbers.

This option was implemented in Bundler 1.4.0 for Ruby 2.0 or earlier.

    ruby "3.1.2", patchlevel: "20"

## GEMS

Specify gem requirements using the `gem` method, with the following arguments.
All parameters are `OPTIONAL` unless otherwise specified.

### NAME (required)

For each gem requirement, list a single _gem_ line.

    gem "nokogiri"

### VERSION

Each _gem_ `MAY` have one or more version specifiers.

    gem "nokogiri", ">= 1.4.2"
    gem "RedCloth", ">= 4.1.0", "< 4.2.0"

### REQUIRE AS

Each _gem_ `MAY` specify files that should be used when autorequiring via
`Bundler.require`. You may pass an array with multiple files or `true` if the file
you want `required` has the same name as _gem_ or `false` to
prevent any file from being autorequired.

    gem "redis", require: ["redis/connection/hiredis", "redis"]
    gem "webmock", require: false
    gem "byebug", require: true

The argument defaults to the name of the gem. For example, these are identical:

    gem "nokogiri"
    gem "nokogiri", require: "nokogiri"
    gem "nokogiri", require: true

### GROUPS

Each _gem_ `MAY` specify membership in one or more groups. Any _gem_ that does
not specify membership in any group is placed in the `default` group.

    gem "rspec", group: :test
    gem "wirble", groups: [:development, :test]

The Bundler runtime allows its two main methods, `Bundler.setup` and
`Bundler.require`, to limit their impact to particular groups.

    # setup adds gems to Ruby's load path
    Bundler.setup                    # defaults to all groups
    require "bundler/setup"          # same as Bundler.setup
    Bundler.setup(:default)          # only set up the _default_ group
    Bundler.setup(:test)             # only set up the _test_ group (but `not` _default_)
    Bundler.setup(:default, :test)   # set up the _default_ and _test_ groups, but no others

    # require requires all of the gems in the specified groups
    Bundler.require                  # defaults to the _default_ group
    Bundler.require(:default)        # identical
    Bundler.require(:default, :test) # requires the _default_ and _test_ groups
    Bundler.require(:test)           # requires the _test_ group

The Bundler CLI allows you to specify a list of groups whose gems `bundle install` should
not install with the `without` configuration.

To specify multiple groups to ignore, specify a list of groups separated by spaces.

    bundle config set --local without test
    bundle config set --local without development test

Also, calling `Bundler.setup` with no parameters, or calling `require "bundler/setup"`
will setup all groups except for the ones you excluded via `--without` (since they
are not available).

Note that on `bundle install`, bundler downloads and evaluates all gems, in order to
create a single canonical list of all of the required gems and their dependencies.
This means that you cannot list different versions of the same gems in different
groups. For more details, see [Understanding Bundler](https://bundler.io/rationale.html).

### PLATFORMS

If a gem should only be used in a particular platform or set of platforms, you can
specify them. Platforms are essentially identical to groups, except that you do not
need to use the `--without` install-time flag to exclude groups of gems for other
platforms.

There are a number of `Gemfile` platforms:

  * `ruby`:
    C Ruby (MRI), Rubinius, or TruffleRuby, but not Windows
  * `mri`:
    C Ruby (MRI) only, but not Windows
  * `windows`:
    Windows C Ruby (MRI), including RubyInstaller 32-bit and 64-bit versions
  * `mswin`:
    Windows C Ruby (MRI), including RubyInstaller 32-bit versions
  * `mswin64`:
    Windows C Ruby (MRI), including RubyInstaller 64-bit versions
  * `rbx`:
    Rubinius
  * `jruby`:
    JRuby
  * `truffleruby`:
    TruffleRuby

On platforms `ruby`, `mri`, `mswin`, `mswin64`, and `windows`, you may
additionally specify a version by appending the major and minor version numbers
without a delimiter. For example, to specify that a gem should only be used on
platform `ruby` version 3.1, use:

    ruby_31

As with groups (above), you may specify one or more platforms:

    gem "weakling",   platforms: :jruby
    gem "ruby-debug", platforms: :mri_31
    gem "nokogiri",   platforms: [:windows_31, :jruby]

All operations involving groups ([`bundle install`](bundle-install.1.html), `Bundler.setup`,
`Bundler.require`) behave exactly the same as if any groups not
matching the current platform were explicitly excluded.

### FORCE_RUBY_PLATFORM

If you always want the pure ruby variant of a gem to be chosen over platform
specific variants, you can use the `force_ruby_platform` option:

    gem "ffi", force_ruby_platform: true

This can be handy (assuming the pure ruby variant works fine) when:

* You're having issues with the platform specific variant.
* The platform specific variant does not yet support a newer ruby (and thus has
  a `required_ruby_version` upper bound), but you still want your Gemfile{.lock}
  files to resolve under that ruby.

### SOURCE

You can select an alternate RubyGems repository for a gem using the ':source'
option.

    gem "some_internal_gem", source: "https://gems.example.com"

This forces the gem to be loaded from this source and ignores the global source
declared at the top level of the file. If the gem does not exist in this source,
it will not be installed.

Bundler will search for child dependencies of this gem by first looking in the
source selected for the parent, but if they are not found there, it will fall
back on the global source.

**Note about a behavior of the feature deprecated in Bundler 1.13**:
Selecting a specific source repository this way also suppresses the ambiguous
gem warning described above in [GLOBAL SOURCE](#GLOBAL-SOURCE).

Using the `:source` option for an individual gem will also make that source
available as a possible global source for any other gems which do not specify
explicit sources. Thus, when adding gems with explicit sources, it is
recommended that you also ensure all other gems in the Gemfile are using
explicit sources.

### GIT

If necessary, you can specify that a gem is located at a particular
git repository using the `:git` parameter. The repository can be accessed via
several protocols:

  * `HTTP(S)`:
    gem "rails", git: "https://github.com/rails/rails.git"
  * `SSH`:
    gem "rails", git: "git@github.com:rails/rails.git"
  * `git`:
    gem "rails", git: "git://github.com/rails/rails.git"

If using SSH, the user that you use to run `bundle install` `MUST` have the
appropriate keys available in their `$HOME/.ssh`.

`NOTE`: `http://` and `git://` URLs should be avoided if at all possible. These
protocols are unauthenticated, so a man-in-the-middle attacker can deliver
malicious code and compromise your system. HTTPS and SSH are strongly
preferred.

The `group`, `platforms`, and `require` options are available and behave
exactly the same as they would for a normal gem.

A git repository `SHOULD` have at least one file, at the root of the
directory containing the gem, with the extension `.gemspec`. This file
`MUST` contain a valid gem specification, as expected by the `gem build`
command.

If a git repository does not have a `.gemspec`, bundler will attempt to
create one, but it will not contain any dependencies, executables, or
C extension compilation instructions. As a result, it may fail to properly
integrate into your application.

If a git repository does have a `.gemspec` for the gem you attached it
to, a version specifier, if provided, means that the git repository is
only valid if the `.gemspec` specifies a version matching the version
specifier. If not, bundler will print a warning.

    gem "rails", "2.3.8", git: "https://github.com/rails/rails.git"
    # bundle install will fail, because the .gemspec in the rails
    # repository's master branch specifies version 3.0.0

If a git repository does `not` have a `.gemspec` for the gem you attached
it to, a version specifier `MUST` be provided. Bundler will use this
version in the simple `.gemspec` it creates.

Git repositories support a number of additional options.

  * `branch`, `tag`, and `ref`:
    You `MUST` only specify at most one of these options. The default
    is `branch: "master"`.  For example:

      gem "rails", git: "https://github.com/rails/rails.git", branch: "5-0-stable"

      gem "rails", git: "https://github.com/rails/rails.git", tag: "v5.0.0"

      gem "rails", git: "https://github.com/rails/rails.git", ref: "4aded"

  * `submodules`:
    For reference, a [git submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules)
    lets you have another git repository within a subfolder of your repository.
    Specify `submodules: true` to cause bundler to expand any
    submodules included in the git repository

If a git repository contains multiple `.gemspecs`, each `.gemspec`
represents a gem located at the same place in the file system as
the `.gemspec`.

    |~rails                   [git root]
    | |-rails.gemspec         [rails gem located here]
    |~actionpack
    | |-actionpack.gemspec    [actionpack gem located here]
    |~activesupport
    | |-activesupport.gemspec [activesupport gem located here]
    |...

To install a gem located in a git repository, bundler changes to
the directory containing the gemspec, runs `gem build name.gemspec`
and then installs the resulting gem. The `gem build` command,
which comes standard with Rubygems, evaluates the `.gemspec` in
the context of the directory in which it is located.

### GIT SOURCE

A custom git source can be defined via the `git_source` method. Provide the source's name
as an argument, and a block which receives a single argument and interpolates it into a
string to return the full repo address:

    git_source(:stash){ |repo_name| "https://stash.corp.acme.pl/#{repo_name}.git" }
    gem 'rails', stash: 'forks/rails'

In addition, if you wish to choose a specific branch:

    gem "rails", stash: "forks/rails", branch: "branch_name"

### GITHUB

`NOTE`: This shorthand should be avoided until Bundler 2.0, since it
currently expands to an insecure `git://` URL. This allows a
man-in-the-middle attacker to compromise your system.

If the git repository you want to use is hosted on GitHub and is public, you can use the
:github shorthand to specify the github username and repository name (without the
trailing ".git"), separated by a slash. If both the username and repository name are the
same, you can omit one.

    gem "rails", github: "rails/rails"
    gem "rails", github: "rails"

Are both equivalent to

    gem "rails", git: "https://github.com/rails/rails.git"

Since the `github` method is a specialization of `git_source`, it accepts a `:branch` named argument.

You can also directly pass a pull request URL:

    gem "rails", github: "https://github.com/rails/rails/pull/43753"

Which is equivalent to:

    gem "rails", github: "rails/rails", branch: "refs/pull/43753/head"

### GIST

If the git repository you want to use is hosted as a GitHub Gist and is public, you can use
the :gist shorthand to specify the gist identifier (without the trailing ".git").

    gem "the_hatch", gist: "4815162342"

Is equivalent to:

    gem "the_hatch", git: "https://gist.github.com/4815162342.git"

Since the `gist` method is a specialization of `git_source`, it accepts a `:branch` named argument.

### BITBUCKET

If the git repository you want to use is hosted on Bitbucket and is public, you can use the
:bitbucket shorthand to specify the bitbucket username and repository name (without the
trailing ".git"), separated by a slash. If both the username and repository name are the
same, you can omit one.

    gem "rails", bitbucket: "rails/rails"
    gem "rails", bitbucket: "rails"

Are both equivalent to

    gem "rails", git: "https://rails@bitbucket.org/rails/rails.git"

Since the `bitbucket` method is a specialization of `git_source`, it accepts a `:branch` named argument.

### PATH

You can specify that a gem is located in a particular location
on the file system. Relative paths are resolved relative to the
directory containing the `Gemfile`.

Similar to the semantics of the `:git` option, the `:path`
option requires that the directory in question either contains
a `.gemspec` for the gem, or that you specify an explicit
version that bundler should use.

Unlike `:git`, bundler does not compile C extensions for
gems specified as paths.

    gem "rails", path: "vendor/rails"

If you would like to use multiple local gems directly from the filesystem, you can set a global `path` option to the path containing the gem's files. This will automatically load gemspec files from subdirectories.

    path 'components' do
      gem 'admin_ui'
      gem 'public_ui'
    end

## BLOCK FORM OF SOURCE, GIT, PATH, GROUP and PLATFORMS

The `:source`, `:git`, `:path`, `:group`, and `:platforms` options may be
applied to a group of gems by using block form.

    source "https://gems.example.com" do
      gem "some_internal_gem"
      gem "another_internal_gem"
    end

    git "https://github.com/rails/rails.git" do
      gem "activesupport"
      gem "actionpack"
    end

    platforms :ruby do
      gem "ruby-debug"
      gem "sqlite3"
    end

    group :development, optional: true do
      gem "wirble"
      gem "faker"
    end

In the case of the group block form the :optional option can be given
to prevent a group from being installed unless listed in the `--with`
option given to the `bundle install` command.

In the case of the `git` block form, the `:ref`, `:branch`, `:tag`,
and `:submodules` options may be passed to the `git` method, and
all gems in the block will inherit those options.

The presence of a `source` block in a Gemfile also makes that source
available as a possible global source for any other gems which do not specify
explicit sources. Thus, when defining source blocks, it is
recommended that you also ensure all other gems in the Gemfile are using
explicit sources, either via source blocks or `:source` directives on
individual gems.

## INSTALL_IF

The `install_if` method allows gems to be installed based on a proc or lambda.
This is especially useful for optional gems that can only be used if certain
software is installed or some other conditions are met.

    install_if -> { RUBY_PLATFORM =~ /darwin/ } do
      gem "pasteboard"
    end

## GEMSPEC

The [`.gemspec`](http://guides.rubygems.org/specification-reference/) file is where
 you provide metadata about your gem to Rubygems. Some required Gemspec
 attributes include the name, description, and homepage of your gem. This is
 also where you specify the dependencies your gem needs to run.

If you wish to use Bundler to help install dependencies for a gem while it is
being developed, use the `gemspec` method to pull in the dependencies listed in
the `.gemspec` file.

The `gemspec` method adds any runtime dependencies as gem requirements in the
default group. It also adds development dependencies as gem requirements in the
`development` group. Finally, it adds a gem requirement on your project (`path:
'.'`). In conjunction with `Bundler.setup`, this allows you to require project
files in your test code as you would if the project were installed as a gem; you
need not manipulate the load path manually or require project files via relative
paths.

The `gemspec` method supports optional `:path`, `:glob`, `:name`, and `:development_group`
options, which control where bundler looks for the `.gemspec`, the glob it uses to look
for the gemspec (defaults to: "{,*,*/*}.gemspec"), what named `.gemspec` it uses
(if more than one is present), and which group development dependencies are included in.

When a `gemspec` dependency encounters version conflicts during resolution, the
local version under development will always be selected -- even if there are
remote versions that better match other requirements for the `gemspec` gem.

## SOURCE PRIORITY

When attempting to locate a gem to satisfy a gem requirement,
bundler uses the following priority order:

  1. The source explicitly attached to the gem (using `:source`, `:path`, or
     `:git`)
  2. For implicit gems (dependencies of explicit gems), any source, git, or path
     repository declared on the parent. This results in bundler prioritizing the
     ActiveSupport gem from the Rails git repository over ones from
     `rubygems.org`
  3. If neither of the above conditions are met, the global source will be used.
     If multiple global sources are specified, they will be prioritized from
     last to first, but this is deprecated since Bundler 1.13, so Bundler prints
     a warning and will abort with an error in the future.
PK}$[�#K���6gems/gems/bundler-2.3.27/lib/bundler/man/bundle-info.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-INFO" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-info\fR \- Show information for the given gem in your bundle
.
.SH "SYNOPSIS"
\fBbundle info\fR [GEM] [\-\-path]
.
.SH "DESCRIPTION"
Print the basic information about the provided GEM such as homepage, version, path and summary\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-path\fR
Print the path of the given gem

PK}$[�5���;gems/gems/bundler-2.3.27/lib/bundler/man/bundle-open.1.ronnnu�[���bundle-open(1) -- Opens the source directory for a gem in your bundle
=====================================================================

## SYNOPSIS

`bundle open` [GEM]

## DESCRIPTION

Opens the source directory of the provided GEM in your editor.

For this to work the `EDITOR` or `BUNDLER_EDITOR` environment variable has to
be set.

Example:

    bundle open 'rack'

Will open the source directory for the 'rack' gem in your bundle.
PK}$[�:�RPP8gems/gems/bundler-2.3.27/lib/bundler/man/bundle-remove.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-REMOVE" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-remove\fR \- Removes gems from the Gemfile
.
.SH "SYNOPSIS"
\fBbundle remove [GEM [GEM \.\.\.]] [\-\-install]\fR
.
.SH "DESCRIPTION"
Removes the given gems from the Gemfile while ensuring that the resulting Gemfile is still valid\. If a gem cannot be removed, a warning is printed\. If a gem is already absent from the Gemfile, and error is raised\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-install\fR
Runs \fBbundle install\fR after the given gems have been removed from the Gemfile, which ensures that both the lockfile and the installed gems on disk are also updated to remove the given gem(s)\.
.
.P
Example:
.
.P
bundle remove rails
.
.P
bundle remove rails rack
.
.P
bundle remove rails rack \-\-install
PK}$[=��q��6gems/gems/bundler-2.3.27/lib/bundler/man/bundle-show.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-SHOW" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-show\fR \- Shows all the gems in your bundle, or the path to a gem
.
.SH "SYNOPSIS"
\fBbundle show\fR [GEM] [\-\-paths]
.
.SH "DESCRIPTION"
Without the [GEM] option, \fBshow\fR will print a list of the names and versions of all gems that are required by your [\fBGemfile(5)\fR][Gemfile(5)], sorted by name\.
.
.P
Calling show with [GEM] will list the exact location of that gem on your machine\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-paths\fR
List the paths of all gems that are required by your [\fBGemfile(5)\fR][Gemfile(5)], sorted by gem name\.

PK}$[�I�OO:gems/gems/bundler-2.3.27/lib/bundler/man/bundle-binstubs.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-BINSTUBS" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-binstubs\fR \- Install the binstubs of the listed gems
.
.SH "SYNOPSIS"
\fBbundle binstubs\fR \fIGEM_NAME\fR [\-\-force] [\-\-path PATH] [\-\-standalone]
.
.SH "DESCRIPTION"
Binstubs are scripts that wrap around executables\. Bundler creates a small Ruby file (a binstub) that loads Bundler, runs the command, and puts it into \fBbin/\fR\. Binstubs are a shortcut\-or alternative\- to always using \fBbundle exec\fR\. This gives you a file that can be run directly, and one that will always run the correct gem version used by the application\.
.
.P
For example, if you run \fBbundle binstubs rspec\-core\fR, Bundler will create the file \fBbin/rspec\fR\. That file will contain enough code to load Bundler, tell it to load the bundled gems, and then run rspec\.
.
.P
This command generates binstubs for executables in \fBGEM_NAME\fR\. Binstubs are put into \fBbin\fR, or the \fB\-\-path\fR directory if one has been set\. Calling binstubs with [GEM [GEM]] will create binstubs for all given gems\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-force\fR
Overwrite existing binstubs if they exist\.
.
.TP
\fB\-\-path\fR
The location to install the specified binstubs to\. This defaults to \fBbin\fR\.
.
.TP
\fB\-\-standalone\fR
Makes binstubs that can work without depending on Rubygems or Bundler at runtime\.
.
.TP
\fB\-\-shebang\fR
Specify a different shebang executable name than the default (default \'ruby\')
.
.TP
\fB\-\-all\fR
Create binstubs for all gems in the bundle\.

PK}$[9IG���;gems/gems/bundler-2.3.27/lib/bundler/man/bundle-lock.1.ronnnu�[���bundle-lock(1) -- Creates / Updates a lockfile without installing
=================================================================

## SYNOPSIS

`bundle lock` [--update]
              [--local]
              [--print]
              [--lockfile=PATH]
              [--full-index]
              [--add-platform]
              [--remove-platform]
              [--patch]
              [--minor]
              [--major]
              [--strict]
              [--conservative]

## DESCRIPTION

Lock the gems specified in Gemfile.

## OPTIONS

* `--update=<*gems>`:
  Ignores the existing lockfile. Resolve then updates lockfile. Taking a list
  of gems or updating all gems if no list is given.

* `--local`:
  Do not attempt to connect to `rubygems.org`. Instead, Bundler will use the
  gems already present in Rubygems' cache or in `vendor/cache`. Note that if a
  appropriate platform-specific gem exists on `rubygems.org` it will not be
  found.

* `--print`:
  Prints the lockfile to STDOUT instead of writing to the file system.

* `--lockfile=<path>`:
  The path where the lockfile should be written to.

* `--full-index`:
  Fall back to using the single-file index of all gems.

* `--add-platform`:
  Add a new platform to the lockfile, re-resolving for the addition of that
  platform.

* `--remove-platform`:
  Remove a platform from the lockfile.

* `--patch`:
  If updating, prefer updating only to next patch version.

* `--minor`:
  If updating, prefer updating only to next minor version.

* `--major`:
  If updating, prefer updating to next major version (default).

* `--strict`:
  If updating, do not allow any gem to be updated past latest --patch | --minor | --major.

* `--conservative`:
  If updating, use bundle install conservative update behavior and do not allow shared dependencies to be updated.

## UPDATING ALL GEMS

If you run `bundle lock` with `--update` option without list of gems, bundler will
ignore any previously installed gems and resolve all dependencies again based
on the latest versions of all gems available in the sources.

## UPDATING A LIST OF GEMS

Sometimes, you want to update a single gem in the Gemfile(5), and leave the rest of
the gems that you specified locked to the versions in the `Gemfile.lock`.

For instance, you only want to update `nokogiri`, run `bundle lock --update nokogiri`.

Bundler will update `nokogiri` and any of its dependencies, but leave the rest of the
gems that you specified locked to the versions in the `Gemfile.lock`.

## SUPPORTING OTHER PLATFORMS

If you want your bundle to support platforms other than the one you're running
locally, you can run `bundle lock --add-platform PLATFORM` to add PLATFORM to
the lockfile, force bundler to re-resolve and consider the new platform when
picking gems, all without needing to have a machine that matches PLATFORM handy
to install those platform-specific gems on.

For a full explanation of gem platforms, see `gem help platform`.

## PATCH LEVEL OPTIONS

See [bundle update(1)](bundle-update.1.html) for details.
PK}$[�3�pp<gems/gems/bundler-2.3.27/lib/bundler/man/bundle-clean.1.ronnnu�[���bundle-clean(1) -- Cleans up unused gems in your bundler directory
==================================================================

## SYNOPSIS

`bundle clean` [--dry-run] [--force]

## DESCRIPTION

This command will remove all unused gems in your bundler directory. This is
useful when you have made many changes to your gem dependencies.

## OPTIONS

* `--dry-run`:
  Print the changes, but do not clean the unused gems.
* `--force`:
  Forces cleaning up unused gems even if Bundler is configured to use globally installed gems. As a consequence, removes all system gems except for the ones in the current application.
PK}$[l����?gems/gems/bundler-2.3.27/lib/bundler/man/bundle-platform.1.ronnnu�[���bundle-platform(1) -- Displays platform compatibility information
=================================================================

## SYNOPSIS

`bundle platform` [--ruby]

## DESCRIPTION

`platform` displays information from your Gemfile, Gemfile.lock, and Ruby
VM about your platform.

For instance, using this Gemfile(5):

    source "https://rubygems.org"

    ruby "3.1.2"

    gem "rack"

If you run `bundle platform` on Ruby 3.1.2, it displays the following output:

    Your platform is: x86_64-linux

    Your app has gems that work on these platforms:
    * arm64-darwin-21
    * ruby
    * x64-mingw-ucrt
    * x86_64-linux

    Your Gemfile specifies a Ruby version requirement:
    * ruby 3.1.2

    Your current platform satisfies the Ruby version requirement.

`platform` lists all the platforms in your `Gemfile.lock` as well as the
`ruby` directive if applicable from your Gemfile(5). It also lets you know
if the `ruby` directive requirement has been met. If `ruby` directive doesn't
match the running Ruby VM, it tells you what part does not.

## OPTIONS

* `--ruby`:
  It will display the ruby directive information, so you don't have to
  parse it from the Gemfile(5).

## SEE ALSO

* [bundle-lock(1)](bundle-lock.1.ronn)
PK}$[^A�I��5gems/gems/bundler-2.3.27/lib/bundler/man/bundle-viz.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-VIZ" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-viz\fR \- Generates a visual dependency graph for your Gemfile
.
.SH "SYNOPSIS"
\fBbundle viz\fR [\-\-file=FILE] [\-\-format=FORMAT] [\-\-requirements] [\-\-version] [\-\-without=GROUP GROUP]
.
.SH "DESCRIPTION"
\fBviz\fR generates a PNG file of the current \fBGemfile(5)\fR as a dependency graph\. \fBviz\fR requires the ruby\-graphviz gem (and its dependencies)\.
.
.P
The associated gems must also be installed via \fBbundle install(1)\fR \fIbundle\-install\.1\.html\fR\.
.
.P
\fBviz\fR command was deprecated in Bundler 2\.2\. Use bundler\-graph plugin \fIhttps://github\.com/rubygems/bundler\-graph\fR instead\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-file\fR, \fB\-f\fR
The name to use for the generated file\. See \fB\-\-format\fR option
.
.TP
\fB\-\-format\fR, \fB\-F\fR
This is output format option\. Supported format is png, jpg, svg, dot \.\.\.
.
.TP
\fB\-\-requirements\fR, \fB\-R\fR
Set to show the version of each required dependency\.
.
.TP
\fB\-\-version\fR, \fB\-v\fR
Set to show each gem version\.
.
.TP
\fB\-\-without\fR, \fB\-W\fR
Exclude gems that are part of the specified named group\.

PK}$[����9gems/gems/bundler-2.3.27/lib/bundler/man/bundle-version.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-VERSION" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-version\fR \- Prints Bundler version information
.
.SH "SYNOPSIS"
\fBbundle version\fR
.
.SH "DESCRIPTION"
Prints Bundler version information\.
.
.SH "OPTIONS"
No options\.
.
.SH "EXAMPLE"
Print the version of Bundler with build date and commit hash of the in the Git source\.
.
.IP "" 4
.
.nf

bundle version
.
.fi
.
.IP "" 0
.
.P
shows \fBBundler version 2\.3\.21 (2022\-08\-24 commit d54be5fdd8)\fR for example\.
.
.P
cf\. \fBbundle \-\-version\fR shows \fBBundler version 2\.3\.21\fR\.
PK}$[$�q���8gems/gems/bundler-2.3.27/lib/bundler/man/bundle-doctor.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-DOCTOR" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-doctor\fR \- Checks the bundle for common problems
.
.SH "SYNOPSIS"
\fBbundle doctor\fR [\-\-quiet] [\-\-gemfile=GEMFILE]
.
.SH "DESCRIPTION"
Checks your Gemfile and gem environment for common problems\. If issues are detected, Bundler prints them and exits status 1\. Otherwise, Bundler prints a success message and exits status 0\.
.
.P
Examples of common problems caught by bundle\-doctor include:
.
.IP "\(bu" 4
Invalid Bundler settings
.
.IP "\(bu" 4
Mismatched Ruby versions
.
.IP "\(bu" 4
Mismatched platforms
.
.IP "\(bu" 4
Uninstalled gems
.
.IP "\(bu" 4
Missing dependencies
.
.IP "" 0
.
.SH "OPTIONS"
.
.TP
\fB\-\-quiet\fR
Only output warnings and errors\.
.
.TP
\fB\-\-gemfile=<gemfile>\fR
The location of the Gemfile(5) which Bundler should use\. This defaults to a Gemfile(5) in the current working directory\. In general, Bundler will assume that the location of the Gemfile(5) is also the project\'s root and will try to find \fBGemfile\.lock\fR and \fBvendor/cache\fR relative to this location\.

PK}$[��O�U�U8gems/gems/bundler-2.3.27/lib/bundler/man/bundle-config.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-CONFIG" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-config\fR \- Set bundler configuration options
.
.SH "SYNOPSIS"
\fBbundle config\fR list
.
.br
\fBbundle config\fR [get] NAME
.
.br
\fBbundle config\fR [set] NAME VALUE
.
.br
\fBbundle config\fR unset NAME
.
.SH "DESCRIPTION"
This command allows you to interact with Bundler\'s configuration system\.
.
.P
Bundler loads configuration settings in this order:
.
.IP "1." 4
Local config (\fB<project_root>/\.bundle/config\fR or \fB$BUNDLE_APP_CONFIG/config\fR)
.
.IP "2." 4
Environmental variables (\fBENV\fR)
.
.IP "3." 4
Global config (\fB~/\.bundle/config\fR)
.
.IP "4." 4
Bundler default config
.
.IP "" 0
.
.P
Executing \fBbundle config list\fR with will print a list of all bundler configuration for the current bundle, and where that configuration was set\.
.
.P
Executing \fBbundle config get <name>\fR will print the value of that configuration setting, and where it was set\.
.
.P
Executing \fBbundle config set <name> <value>\fR defaults to setting \fBlocal\fR configuration if executing from within a local application, otherwise it will set \fBglobal\fR configuration\. See \fB\-\-local\fR and \fB\-\-global\fR options below\.
.
.P
Executing \fBbundle config set \-\-local <name> <value>\fR will set that configuration in the directory for the local application\. The configuration will be stored in \fB<project_root>/\.bundle/config\fR\. If \fBBUNDLE_APP_CONFIG\fR is set, the configuration will be stored in \fB$BUNDLE_APP_CONFIG/config\fR\.
.
.P
Executing \fBbundle config set \-\-global <name> <value>\fR will set that configuration to the value specified for all bundles executed as the current user\. The configuration will be stored in \fB~/\.bundle/config\fR\. If \fIname\fR already is set, \fIname\fR will be overridden and user will be warned\.
.
.P
Executing \fBbundle config unset <name>\fR will delete the configuration in both local and global sources\.
.
.P
Executing \fBbundle config unset \-\-global <name>\fR will delete the configuration only from the user configuration\.
.
.P
Executing \fBbundle config unset \-\-local <name>\fR will delete the configuration only from the local application\.
.
.P
Executing bundle with the \fBBUNDLE_IGNORE_CONFIG\fR environment variable set will cause it to ignore all configuration\.
.
.SH "REMEMBERING OPTIONS"
Flags passed to \fBbundle install\fR or the Bundler runtime, such as \fB\-\-path foo\fR or \fB\-\-without production\fR, are remembered between commands and saved to your local application\'s configuration (normally, \fB\./\.bundle/config\fR)\.
.
.P
However, this will be changed in bundler 3, so it\'s better not to rely on this behavior\. If these options must be remembered, it\'s better to set them using \fBbundle config\fR (e\.g\., \fBbundle config set \-\-local path foo\fR)\.
.
.P
The options that can be configured are:
.
.TP
\fBbin\fR
Creates a directory (defaults to \fB~/bin\fR) and place any executables from the gem there\. These executables run in Bundler\'s context\. If used, you might add this directory to your environment\'s \fBPATH\fR variable\. For instance, if the \fBrails\fR gem comes with a \fBrails\fR executable, this flag will create a \fBbin/rails\fR executable that ensures that all referred dependencies will be resolved using the bundled gems\.
.
.TP
\fBdeployment\fR
In deployment mode, Bundler will \'roll\-out\' the bundle for \fBproduction\fR use\. Please check carefully if you want to have this option enabled in \fBdevelopment\fR or \fBtest\fR environments\.
.
.TP
\fBonly\fR
A space\-separated list of groups to install only gems of the specified groups\.
.
.TP
\fBpath\fR
The location to install the specified gems to\. This defaults to Rubygems\' setting\. Bundler shares this location with Rubygems, \fBgem install \.\.\.\fR will have gem installed there, too\. Therefore, gems installed without a \fB\-\-path \.\.\.\fR setting will show up by calling \fBgem list\fR\. Accordingly, gems installed to other locations will not get listed\.
.
.TP
\fBwithout\fR
A space\-separated list of groups referencing gems to skip during installation\.
.
.TP
\fBwith\fR
A space\-separated list of \fBoptional\fR groups referencing gems to include during installation\.
.
.SH "BUILD OPTIONS"
You can use \fBbundle config\fR to give Bundler the flags to pass to the gem installer every time bundler tries to install a particular gem\.
.
.P
A very common example, the \fBmysql\fR gem, requires Snow Leopard users to pass configuration flags to \fBgem install\fR to specify where to find the \fBmysql_config\fR executable\.
.
.IP "" 4
.
.nf

gem install mysql \-\- \-\-with\-mysql\-config=/usr/local/mysql/bin/mysql_config
.
.fi
.
.IP "" 0
.
.P
Since the specific location of that executable can change from machine to machine, you can specify these flags on a per\-machine basis\.
.
.IP "" 4
.
.nf

bundle config set \-\-global build\.mysql \-\-with\-mysql\-config=/usr/local/mysql/bin/mysql_config
.
.fi
.
.IP "" 0
.
.P
After running this command, every time bundler needs to install the \fBmysql\fR gem, it will pass along the flags you specified\.
.
.SH "CONFIGURATION KEYS"
Configuration keys in bundler have two forms: the canonical form and the environment variable form\.
.
.P
For instance, passing the \fB\-\-without\fR flag to bundle install(1) \fIbundle\-install\.1\.html\fR prevents Bundler from installing certain groups specified in the Gemfile(5)\. Bundler persists this value in \fBapp/\.bundle/config\fR so that calls to \fBBundler\.setup\fR do not try to find gems from the \fBGemfile\fR that you didn\'t install\. Additionally, subsequent calls to bundle install(1) \fIbundle\-install\.1\.html\fR remember this setting and skip those groups\.
.
.P
The canonical form of this configuration is \fB"without"\fR\. To convert the canonical form to the environment variable form, capitalize it, and prepend \fBBUNDLE_\fR\. The environment variable form of \fB"without"\fR is \fBBUNDLE_WITHOUT\fR\.
.
.P
Any periods in the configuration keys must be replaced with two underscores when setting it via environment variables\. The configuration key \fBlocal\.rack\fR becomes the environment variable \fBBUNDLE_LOCAL__RACK\fR\.
.
.SH "LIST OF AVAILABLE KEYS"
The following is a list of all configuration keys and their purpose\. You can learn more about their operation in bundle install(1) \fIbundle\-install\.1\.html\fR\.
.
.IP "\(bu" 4
\fBallow_deployment_source_credential_changes\fR (\fBBUNDLE_ALLOW_DEPLOYMENT_SOURCE_CREDENTIAL_CHANGES\fR): When in deployment mode, allow changing the credentials to a gem\'s source\. Ex: \fBhttps://some\.host\.com/gems/path/\fR \-> \fBhttps://user_name:password@some\.host\.com/gems/path\fR
.
.IP "\(bu" 4
\fBallow_offline_install\fR (\fBBUNDLE_ALLOW_OFFLINE_INSTALL\fR): Allow Bundler to use cached data when installing without network access\.
.
.IP "\(bu" 4
\fBauto_clean_without_path\fR (\fBBUNDLE_AUTO_CLEAN_WITHOUT_PATH\fR): Automatically run \fBbundle clean\fR after installing when an explicit \fBpath\fR has not been set and Bundler is not installing into the system gems\.
.
.IP "\(bu" 4
\fBauto_install\fR (\fBBUNDLE_AUTO_INSTALL\fR): Automatically run \fBbundle install\fR when gems are missing\.
.
.IP "\(bu" 4
\fBbin\fR (\fBBUNDLE_BIN\fR): Install executables from gems in the bundle to the specified directory\. Defaults to \fBfalse\fR\.
.
.IP "\(bu" 4
\fBcache_all\fR (\fBBUNDLE_CACHE_ALL\fR): Cache all gems, including path and git gems\. This needs to be explicitly configured on bundler 1 and bundler 2, but will be the default on bundler 3\.
.
.IP "\(bu" 4
\fBcache_all_platforms\fR (\fBBUNDLE_CACHE_ALL_PLATFORMS\fR): Cache gems for all platforms\.
.
.IP "\(bu" 4
\fBcache_path\fR (\fBBUNDLE_CACHE_PATH\fR): The directory that bundler will place cached gems in when running \fBbundle package\fR, and that bundler will look in when installing gems\. Defaults to \fBvendor/cache\fR\.
.
.IP "\(bu" 4
\fBclean\fR (\fBBUNDLE_CLEAN\fR): Whether Bundler should run \fBbundle clean\fR automatically after \fBbundle install\fR\.
.
.IP "\(bu" 4
\fBconsole\fR (\fBBUNDLE_CONSOLE\fR): The console that \fBbundle console\fR starts\. Defaults to \fBirb\fR\.
.
.IP "\(bu" 4
\fBdefault_install_uses_path\fR (\fBBUNDLE_DEFAULT_INSTALL_USES_PATH\fR): Whether a \fBbundle install\fR without an explicit \fB\-\-path\fR argument defaults to installing gems in \fB\.bundle\fR\.
.
.IP "\(bu" 4
\fBdeployment\fR (\fBBUNDLE_DEPLOYMENT\fR): Disallow changes to the \fBGemfile\fR\. When the \fBGemfile\fR is changed and the lockfile has not been updated, running Bundler commands will be blocked\.
.
.IP "\(bu" 4
\fBdisable_checksum_validation\fR (\fBBUNDLE_DISABLE_CHECKSUM_VALIDATION\fR): Allow installing gems even if they do not match the checksum provided by RubyGems\.
.
.IP "\(bu" 4
\fBdisable_exec_load\fR (\fBBUNDLE_DISABLE_EXEC_LOAD\fR): Stop Bundler from using \fBload\fR to launch an executable in\-process in \fBbundle exec\fR\.
.
.IP "\(bu" 4
\fBdisable_local_branch_check\fR (\fBBUNDLE_DISABLE_LOCAL_BRANCH_CHECK\fR): Allow Bundler to use a local git override without a branch specified in the Gemfile\.
.
.IP "\(bu" 4
\fBdisable_local_revision_check\fR (\fBBUNDLE_DISABLE_LOCAL_REVISION_CHECK\fR): Allow Bundler to use a local git override without checking if the revision present in the lockfile is present in the repository\.
.
.IP "\(bu" 4
\fBdisable_shared_gems\fR (\fBBUNDLE_DISABLE_SHARED_GEMS\fR): Stop Bundler from accessing gems installed to RubyGems\' normal location\.
.
.IP "\(bu" 4
\fBdisable_version_check\fR (\fBBUNDLE_DISABLE_VERSION_CHECK\fR): Stop Bundler from checking if a newer Bundler version is available on rubygems\.org\.
.
.IP "\(bu" 4
\fBforce_ruby_platform\fR (\fBBUNDLE_FORCE_RUBY_PLATFORM\fR): Ignore the current machine\'s platform and install only \fBruby\fR platform gems\. As a result, gems with native extensions will be compiled from source\.
.
.IP "\(bu" 4
\fBfrozen\fR (\fBBUNDLE_FROZEN\fR): Disallow changes to the \fBGemfile\fR\. When the \fBGemfile\fR is changed and the lockfile has not been updated, running Bundler commands will be blocked\. Defaults to \fBtrue\fR when \fB\-\-deployment\fR is used\.
.
.IP "\(bu" 4
\fBgem\.github_username\fR (\fBBUNDLE_GEM__GITHUB_USERNAME\fR): Sets a GitHub username or organization to be used in \fBREADME\fR file when you create a new gem via \fBbundle gem\fR command\. It can be overridden by passing an explicit \fB\-\-github\-username\fR flag to \fBbundle gem\fR\.
.
.IP "\(bu" 4
\fBgem\.push_key\fR (\fBBUNDLE_GEM__PUSH_KEY\fR): Sets the \fB\-\-key\fR parameter for \fBgem push\fR when using the \fBrake release\fR command with a private gemstash server\.
.
.IP "\(bu" 4
\fBgemfile\fR (\fBBUNDLE_GEMFILE\fR): The name of the file that bundler should use as the \fBGemfile\fR\. This location of this file also sets the root of the project, which is used to resolve relative paths in the \fBGemfile\fR, among other things\. By default, bundler will search up from the current working directory until it finds a \fBGemfile\fR\.
.
.IP "\(bu" 4
\fBglobal_gem_cache\fR (\fBBUNDLE_GLOBAL_GEM_CACHE\fR): Whether Bundler should cache all gems globally, rather than locally to the installing Ruby installation\.
.
.IP "\(bu" 4
\fBignore_funding_requests\fR (\fBBUNDLE_IGNORE_FUNDING_REQUESTS\fR): When set, no funding requests will be printed\.
.
.IP "\(bu" 4
\fBignore_messages\fR (\fBBUNDLE_IGNORE_MESSAGES\fR): When set, no post install messages will be printed\. To silence a single gem, use dot notation like \fBignore_messages\.httparty true\fR\.
.
.IP "\(bu" 4
\fBinit_gems_rb\fR (\fBBUNDLE_INIT_GEMS_RB\fR): Generate a \fBgems\.rb\fR instead of a \fBGemfile\fR when running \fBbundle init\fR\.
.
.IP "\(bu" 4
\fBjobs\fR (\fBBUNDLE_JOBS\fR): The number of gems Bundler can install in parallel\. Defaults to the number of available processors\.
.
.IP "\(bu" 4
\fBno_install\fR (\fBBUNDLE_NO_INSTALL\fR): Whether \fBbundle package\fR should skip installing gems\.
.
.IP "\(bu" 4
\fBno_prune\fR (\fBBUNDLE_NO_PRUNE\fR): Whether Bundler should leave outdated gems unpruned when caching\.
.
.IP "\(bu" 4
\fBonly\fR (\fBBUNDLE_ONLY\fR): A space\-separated list of groups to install only gems of the specified groups\.
.
.IP "\(bu" 4
\fBpath\fR (\fBBUNDLE_PATH\fR): The location on disk where all gems in your bundle will be located regardless of \fB$GEM_HOME\fR or \fB$GEM_PATH\fR values\. Bundle gems not found in this location will be installed by \fBbundle install\fR\. Defaults to \fBGem\.dir\fR\. When \-\-deployment is used, defaults to vendor/bundle\.
.
.IP "\(bu" 4
\fBpath\.system\fR (\fBBUNDLE_PATH__SYSTEM\fR): Whether Bundler will install gems into the default system path (\fBGem\.dir\fR)\.
.
.IP "\(bu" 4
\fBpath_relative_to_cwd\fR (\fBBUNDLE_PATH_RELATIVE_TO_CWD\fR) Makes \fB\-\-path\fR relative to the CWD instead of the \fBGemfile\fR\.
.
.IP "\(bu" 4
\fBplugins\fR (\fBBUNDLE_PLUGINS\fR): Enable Bundler\'s experimental plugin system\.
.
.IP "\(bu" 4
\fBprefer_patch\fR (BUNDLE_PREFER_PATCH): Prefer updating only to next patch version during updates\. Makes \fBbundle update\fR calls equivalent to \fBbundler update \-\-patch\fR\.
.
.IP "\(bu" 4
\fBprint_only_version_number\fR (\fBBUNDLE_PRINT_ONLY_VERSION_NUMBER\fR): Print only version number from \fBbundler \-\-version\fR\.
.
.IP "\(bu" 4
\fBredirect\fR (\fBBUNDLE_REDIRECT\fR): The number of redirects allowed for network requests\. Defaults to \fB5\fR\.
.
.IP "\(bu" 4
\fBretry\fR (\fBBUNDLE_RETRY\fR): The number of times to retry failed network requests\. Defaults to \fB3\fR\.
.
.IP "\(bu" 4
\fBsetup_makes_kernel_gem_public\fR (\fBBUNDLE_SETUP_MAKES_KERNEL_GEM_PUBLIC\fR): Have \fBBundler\.setup\fR make the \fBKernel#gem\fR method public, even though RubyGems declares it as private\.
.
.IP "\(bu" 4
\fBshebang\fR (\fBBUNDLE_SHEBANG\fR): The program name that should be invoked for generated binstubs\. Defaults to the ruby install name used to generate the binstub\.
.
.IP "\(bu" 4
\fBsilence_deprecations\fR (\fBBUNDLE_SILENCE_DEPRECATIONS\fR): Whether Bundler should silence deprecation warnings for behavior that will be changed in the next major version\.
.
.IP "\(bu" 4
\fBsilence_root_warning\fR (\fBBUNDLE_SILENCE_ROOT_WARNING\fR): Silence the warning Bundler prints when installing gems as root\.
.
.IP "\(bu" 4
\fBssl_ca_cert\fR (\fBBUNDLE_SSL_CA_CERT\fR): Path to a designated CA certificate file or folder containing multiple certificates for trusted CAs in PEM format\.
.
.IP "\(bu" 4
\fBssl_client_cert\fR (\fBBUNDLE_SSL_CLIENT_CERT\fR): Path to a designated file containing a X\.509 client certificate and key in PEM format\.
.
.IP "\(bu" 4
\fBssl_verify_mode\fR (\fBBUNDLE_SSL_VERIFY_MODE\fR): The SSL verification mode Bundler uses when making HTTPS requests\. Defaults to verify peer\.
.
.IP "\(bu" 4
\fBsuppress_install_using_messages\fR (\fBBUNDLE_SUPPRESS_INSTALL_USING_MESSAGES\fR): Avoid printing \fBUsing \.\.\.\fR messages during installation when the version of a gem has not changed\.
.
.IP "\(bu" 4
\fBsystem_bindir\fR (\fBBUNDLE_SYSTEM_BINDIR\fR): The location where RubyGems installs binstubs\. Defaults to \fBGem\.bindir\fR\.
.
.IP "\(bu" 4
\fBtimeout\fR (\fBBUNDLE_TIMEOUT\fR): The seconds allowed before timing out for network requests\. Defaults to \fB10\fR\.
.
.IP "\(bu" 4
\fBupdate_requires_all_flag\fR (\fBBUNDLE_UPDATE_REQUIRES_ALL_FLAG\fR): Require passing \fB\-\-all\fR to \fBbundle update\fR when everything should be updated, and disallow passing no options to \fBbundle update\fR\.
.
.IP "\(bu" 4
\fBuser_agent\fR (\fBBUNDLE_USER_AGENT\fR): The custom user agent fragment Bundler includes in API requests\.
.
.IP "\(bu" 4
\fBwith\fR (\fBBUNDLE_WITH\fR): A \fB:\fR\-separated list of groups whose gems bundler should install\.
.
.IP "\(bu" 4
\fBwithout\fR (\fBBUNDLE_WITHOUT\fR): A \fB:\fR\-separated list of groups whose gems bundler should not install\.
.
.IP "" 0
.
.P
In general, you should set these settings per\-application by using the applicable flag to the bundle install(1) \fIbundle\-install\.1\.html\fR or bundle cache(1) \fIbundle\-cache\.1\.html\fR command\.
.
.P
You can set them globally either via environment variables or \fBbundle config\fR, whichever is preferable for your setup\. If you use both, environment variables will take preference over global settings\.
.
.SH "LOCAL GIT REPOS"
Bundler also allows you to work against a git repository locally instead of using the remote version\. This can be achieved by setting up a local override:
.
.IP "" 4
.
.nf

bundle config set \-\-local local\.GEM_NAME /path/to/local/git/repository
.
.fi
.
.IP "" 0
.
.P
For example, in order to use a local Rack repository, a developer could call:
.
.IP "" 4
.
.nf

bundle config set \-\-local local\.rack ~/Work/git/rack
.
.fi
.
.IP "" 0
.
.P
Now instead of checking out the remote git repository, the local override will be used\. Similar to a path source, every time the local git repository change, changes will be automatically picked up by Bundler\. This means a commit in the local git repo will update the revision in the \fBGemfile\.lock\fR to the local git repo revision\. This requires the same attention as git submodules\. Before pushing to the remote, you need to ensure the local override was pushed, otherwise you may point to a commit that only exists in your local machine\. You\'ll also need to CGI escape your usernames and passwords as well\.
.
.P
Bundler does many checks to ensure a developer won\'t work with invalid references\. Particularly, we force a developer to specify a branch in the \fBGemfile\fR in order to use this feature\. If the branch specified in the \fBGemfile\fR and the current branch in the local git repository do not match, Bundler will abort\. This ensures that a developer is always working against the correct branches, and prevents accidental locking to a different branch\.
.
.P
Finally, Bundler also ensures that the current revision in the \fBGemfile\.lock\fR exists in the local git repository\. By doing this, Bundler forces you to fetch the latest changes in the remotes\.
.
.SH "MIRRORS OF GEM SOURCES"
Bundler supports overriding gem sources with mirrors\. This allows you to configure rubygems\.org as the gem source in your Gemfile while still using your mirror to fetch gems\.
.
.IP "" 4
.
.nf

bundle config set \-\-global mirror\.SOURCE_URL MIRROR_URL
.
.fi
.
.IP "" 0
.
.P
For example, to use a mirror of https://rubygems\.org hosted at https://example\.org:
.
.IP "" 4
.
.nf

bundle config set \-\-global mirror\.https://rubygems\.org https://example\.org
.
.fi
.
.IP "" 0
.
.P
Each mirror also provides a fallback timeout setting\. If the mirror does not respond within the fallback timeout, Bundler will try to use the original server instead of the mirror\.
.
.IP "" 4
.
.nf

bundle config set \-\-global mirror\.SOURCE_URL\.fallback_timeout TIMEOUT
.
.fi
.
.IP "" 0
.
.P
For example, to fall back to rubygems\.org after 3 seconds:
.
.IP "" 4
.
.nf

bundle config set \-\-global mirror\.https://rubygems\.org\.fallback_timeout 3
.
.fi
.
.IP "" 0
.
.P
The default fallback timeout is 0\.1 seconds, but the setting can currently only accept whole seconds (for example, 1, 15, or 30)\.
.
.SH "CREDENTIALS FOR GEM SOURCES"
Bundler allows you to configure credentials for any gem source, which allows you to avoid putting secrets into your Gemfile\.
.
.IP "" 4
.
.nf

bundle config set \-\-global SOURCE_HOSTNAME USERNAME:PASSWORD
.
.fi
.
.IP "" 0
.
.P
For example, to save the credentials of user \fBclaudette\fR for the gem source at \fBgems\.longerous\.com\fR, you would run:
.
.IP "" 4
.
.nf

bundle config set \-\-global gems\.longerous\.com claudette:s00pers3krit
.
.fi
.
.IP "" 0
.
.P
Or you can set the credentials as an environment variable like this:
.
.IP "" 4
.
.nf

export BUNDLE_GEMS__LONGEROUS__COM="claudette:s00pers3krit"
.
.fi
.
.IP "" 0
.
.P
For gems with a git source with HTTP(S) URL you can specify credentials like so:
.
.IP "" 4
.
.nf

bundle config set \-\-global https://github\.com/rubygems/rubygems\.git username:password
.
.fi
.
.IP "" 0
.
.P
Or you can set the credentials as an environment variable like so:
.
.IP "" 4
.
.nf

export BUNDLE_GITHUB__COM=username:password
.
.fi
.
.IP "" 0
.
.P
This is especially useful for private repositories on hosts such as GitHub, where you can use personal OAuth tokens:
.
.IP "" 4
.
.nf

export BUNDLE_GITHUB__COM=abcd0123generatedtoken:x\-oauth\-basic
.
.fi
.
.IP "" 0
.
.P
Note that any configured credentials will be redacted by informative commands such as \fBbundle config list\fR or \fBbundle config get\fR, unless you use the \fB\-\-parseable\fR flag\. This is to avoid unintentionally leaking credentials when copy\-pasting bundler output\.
.
.P
Also note that to guarantee a sane mapping between valid environment variable names and valid host names, bundler makes the following transformations:
.
.IP "\(bu" 4
Any \fB\-\fR characters in a host name are mapped to a triple dash (\fB___\fR) in the corresponding environment variable\.
.
.IP "\(bu" 4
Any \fB\.\fR characters in a host name are mapped to a double dash (\fB__\fR) in the corresponding environment variable\.
.
.IP "" 0
.
.P
This means that if you have a gem server named \fBmy\.gem\-host\.com\fR, you\'ll need to use the \fBBUNDLE_MY__GEM___HOST__COM\fR variable to configure credentials for it through ENV\.
.
.SH "CONFIGURE BUNDLER DIRECTORIES"
Bundler\'s home, config, cache and plugin directories are able to be configured through environment variables\. The default location for Bundler\'s home directory is \fB~/\.bundle\fR, which all directories inherit from by default\. The following outlines the available environment variables and their default values
.
.IP "" 4
.
.nf

BUNDLE_USER_HOME : $HOME/\.bundle
BUNDLE_USER_CACHE : $BUNDLE_USER_HOME/cache
BUNDLE_USER_CONFIG : $BUNDLE_USER_HOME/config
BUNDLE_USER_PLUGIN : $BUNDLE_USER_HOME/plugin
.
.fi
.
.IP "" 0

PK}$[�;㊅
�
7gems/gems/bundler-2.3.27/lib/bundler/man/bundle-cache.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-CACHE" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-cache\fR \- Package your needed \fB\.gem\fR files into your application
.
.SH "SYNOPSIS"
\fBbundle cache\fR
.
.P
alias: \fBpackage\fR, \fBpack\fR
.
.SH "DESCRIPTION"
Copy all of the \fB\.gem\fR files needed to run the application into the \fBvendor/cache\fR directory\. In the future, when running [bundle install(1)][bundle\-install], use the gems in the cache in preference to the ones on \fBrubygems\.org\fR\.
.
.SH "GIT AND PATH GEMS"
The \fBbundle cache\fR command can also package \fB:git\fR and \fB:path\fR dependencies besides \.gem files\. This needs to be explicitly enabled via the \fB\-\-all\fR option\. Once used, the \fB\-\-all\fR option will be remembered\.
.
.SH "SUPPORT FOR MULTIPLE PLATFORMS"
When using gems that have different packages for different platforms, Bundler supports caching of gems for other platforms where the Gemfile has been resolved (i\.e\. present in the lockfile) in \fBvendor/cache\fR\. This needs to be enabled via the \fB\-\-all\-platforms\fR option\. This setting will be remembered in your local bundler configuration\.
.
.SH "REMOTE FETCHING"
By default, if you run \fBbundle install(1)\fR](bundle\-install\.1\.html) after running bundle cache(1) \fIbundle\-cache\.1\.html\fR, bundler will still connect to \fBrubygems\.org\fR to check whether a platform\-specific gem exists for any of the gems in \fBvendor/cache\fR\.
.
.P
For instance, consider this Gemfile(5):
.
.IP "" 4
.
.nf

source "https://rubygems\.org"

gem "nokogiri"
.
.fi
.
.IP "" 0
.
.P
If you run \fBbundle cache\fR under C Ruby, bundler will retrieve the version of \fBnokogiri\fR for the \fB"ruby"\fR platform\. If you deploy to JRuby and run \fBbundle install\fR, bundler is forced to check to see whether a \fB"java"\fR platformed \fBnokogiri\fR exists\.
.
.P
Even though the \fBnokogiri\fR gem for the Ruby platform is \fItechnically\fR acceptable on JRuby, it has a C extension that does not run on JRuby\. As a result, bundler will, by default, still connect to \fBrubygems\.org\fR to check whether it has a version of one of your gems more specific to your platform\.
.
.P
This problem is also not limited to the \fB"java"\fR platform\. A similar (common) problem can happen when developing on Windows and deploying to Linux, or even when developing on OSX and deploying to Linux\.
.
.P
If you know for sure that the gems packaged in \fBvendor/cache\fR are appropriate for the platform you are on, you can run \fBbundle install \-\-local\fR to skip checking for more appropriate gems, and use the ones in \fBvendor/cache\fR\.
.
.P
One way to be sure that you have the right platformed versions of all your gems is to run \fBbundle cache\fR on an identical machine and check in the gems\. For instance, you can run \fBbundle cache\fR on an identical staging box during your staging process, and check in the \fBvendor/cache\fR before deploying to production\.
.
.P
By default, bundle cache(1) \fIbundle\-cache\.1\.html\fR fetches and also installs the gems to the default location\. To package the dependencies to \fBvendor/cache\fR without installing them to the local install location, you can run \fBbundle cache \-\-no\-install\fR\.
.
.SH "HISTORY"
In Bundler 2\.1, \fBcache\fR took in the functionalities of \fBpackage\fR and now \fBpackage\fR and \fBpack\fR are aliases of \fBcache\fR\.
PK}$[�S�LL=gems/gems/bundler-2.3.27/lib/bundler/man/bundle-config.1.ronnnu�[���bundle-config(1) -- Set bundler configuration options
=====================================================

## SYNOPSIS

`bundle config` list<br>
`bundle config` [get] NAME<br>
`bundle config` [set] NAME VALUE<br>
`bundle config` unset NAME

## DESCRIPTION

This command allows you to interact with Bundler's configuration system.

Bundler loads configuration settings in this order:

1. Local config (`<project_root>/.bundle/config` or `$BUNDLE_APP_CONFIG/config`)
2. Environmental variables (`ENV`)
3. Global config (`~/.bundle/config`)
4. Bundler default config

Executing `bundle config list` with will print a list of all bundler
configuration for the current bundle, and where that configuration
was set.

Executing `bundle config get <name>` will print the value of that configuration
setting, and where it was set.

Executing `bundle config set <name> <value>` defaults to setting `local`
configuration if executing from within a local application, otherwise it will
set `global` configuration. See `--local` and `--global` options below.

Executing `bundle config set --local <name> <value>` will set that configuration
in the directory for the local application. The configuration will be stored in
`<project_root>/.bundle/config`. If `BUNDLE_APP_CONFIG` is set, the configuration
will be stored in `$BUNDLE_APP_CONFIG/config`.

Executing `bundle config set --global <name> <value>` will set that
configuration to the value specified for all bundles executed as the current
user. The configuration will be stored in `~/.bundle/config`. If <name> already
is set, <name> will be overridden and user will be warned.

Executing `bundle config unset <name>` will delete the configuration in both
local and global sources.

Executing `bundle config unset --global <name>` will delete the configuration
only from the user configuration.

Executing `bundle config unset --local <name>` will delete the configuration
only from the local application.

Executing bundle with the `BUNDLE_IGNORE_CONFIG` environment variable set will
cause it to ignore all configuration.

## REMEMBERING OPTIONS

Flags passed to `bundle install` or the Bundler runtime, such as `--path foo` or
`--without production`, are remembered between commands and saved to your local
application's configuration (normally, `./.bundle/config`).

However, this will be changed in bundler 3, so it's better not to rely on this
behavior. If these options must be remembered, it's better to set them using
`bundle config` (e.g., `bundle config set --local path foo`).

The options that can be configured are:

* `bin`:
   Creates a directory (defaults to `~/bin`) and place any executables from the
   gem there. These executables run in Bundler's context. If used, you might add
   this directory to your environment's `PATH` variable. For instance, if the
   `rails` gem comes with a `rails` executable, this flag will create a
   `bin/rails` executable that ensures that all referred dependencies will be
   resolved using the bundled gems.

* `deployment`:
   In deployment mode, Bundler will 'roll-out' the bundle for
   `production` use. Please check carefully if you want to have this option
   enabled in `development` or `test` environments.

* `only`:
   A space-separated list of groups to install only gems of the specified groups.

* `path`:
   The location to install the specified gems to. This defaults to Rubygems'
   setting. Bundler shares this location with Rubygems, `gem install ...` will
   have gem installed there, too. Therefore, gems installed without a
   `--path ...` setting will show up by calling `gem list`. Accordingly, gems
   installed to other locations will not get listed.

* `without`:
   A space-separated list of groups referencing gems to skip during installation.

* `with`:
  A space-separated list of **optional** groups referencing gems to include during installation.

## BUILD OPTIONS

You can use `bundle config` to give Bundler the flags to pass to the gem
installer every time bundler tries to install a particular gem.

A very common example, the `mysql` gem, requires Snow Leopard users to
pass configuration flags to `gem install` to specify where to find the
`mysql_config` executable.

    gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config

Since the specific location of that executable can change from machine
to machine, you can specify these flags on a per-machine basis.

    bundle config set --global build.mysql --with-mysql-config=/usr/local/mysql/bin/mysql_config

After running this command, every time bundler needs to install the
`mysql` gem, it will pass along the flags you specified.

## CONFIGURATION KEYS

Configuration keys in bundler have two forms: the canonical form and the
environment variable form.

For instance, passing the `--without` flag to [bundle install(1)](bundle-install.1.html)
prevents Bundler from installing certain groups specified in the Gemfile(5). Bundler
persists this value in `app/.bundle/config` so that calls to `Bundler.setup`
do not try to find gems from the `Gemfile` that you didn't install. Additionally,
subsequent calls to [bundle install(1)](bundle-install.1.html) remember this setting
and skip those groups.

The canonical form of this configuration is `"without"`. To convert the canonical
form to the environment variable form, capitalize it, and prepend `BUNDLE_`. The
environment variable form of `"without"` is `BUNDLE_WITHOUT`.

Any periods in the configuration keys must be replaced with two underscores when
setting it via environment variables. The configuration key `local.rack` becomes
the environment variable `BUNDLE_LOCAL__RACK`.

## LIST OF AVAILABLE KEYS

The following is a list of all configuration keys and their purpose. You can
learn more about their operation in [bundle install(1)](bundle-install.1.html).

* `allow_deployment_source_credential_changes` (`BUNDLE_ALLOW_DEPLOYMENT_SOURCE_CREDENTIAL_CHANGES`):
   When in deployment mode, allow changing the credentials to a gem's source.
   Ex: `https://some.host.com/gems/path/` -> `https://user_name:password@some.host.com/gems/path`
* `allow_offline_install` (`BUNDLE_ALLOW_OFFLINE_INSTALL`):
   Allow Bundler to use cached data when installing without network access.
* `auto_clean_without_path` (`BUNDLE_AUTO_CLEAN_WITHOUT_PATH`):
   Automatically run `bundle clean` after installing when an explicit `path`
   has not been set and Bundler is not installing into the system gems.
* `auto_install` (`BUNDLE_AUTO_INSTALL`):
   Automatically run `bundle install` when gems are missing.
* `bin` (`BUNDLE_BIN`):
   Install executables from gems in the bundle to the specified directory.
   Defaults to `false`.
* `cache_all` (`BUNDLE_CACHE_ALL`):
   Cache all gems, including path and git gems. This needs to be explicitly
   configured on bundler 1 and bundler 2, but will be the default on bundler 3.
* `cache_all_platforms` (`BUNDLE_CACHE_ALL_PLATFORMS`):
   Cache gems for all platforms.
* `cache_path` (`BUNDLE_CACHE_PATH`):
   The directory that bundler will place cached gems in when running
   <code>bundle package</code>, and that bundler will look in when installing gems.
   Defaults to `vendor/cache`.
* `clean` (`BUNDLE_CLEAN`):
   Whether Bundler should run `bundle clean` automatically after
   `bundle install`.
* `console` (`BUNDLE_CONSOLE`):
   The console that `bundle console` starts. Defaults to `irb`.
* `default_install_uses_path` (`BUNDLE_DEFAULT_INSTALL_USES_PATH`):
   Whether a `bundle install` without an explicit `--path` argument defaults
   to installing gems in `.bundle`.
* `deployment` (`BUNDLE_DEPLOYMENT`):
   Disallow changes to the `Gemfile`. When the `Gemfile` is changed and the
   lockfile has not been updated, running Bundler commands will be blocked.
* `disable_checksum_validation` (`BUNDLE_DISABLE_CHECKSUM_VALIDATION`):
   Allow installing gems even if they do not match the checksum provided by
   RubyGems.
* `disable_exec_load` (`BUNDLE_DISABLE_EXEC_LOAD`):
   Stop Bundler from using `load` to launch an executable in-process in
   `bundle exec`.
* `disable_local_branch_check` (`BUNDLE_DISABLE_LOCAL_BRANCH_CHECK`):
   Allow Bundler to use a local git override without a branch specified in the
   Gemfile.
* `disable_local_revision_check` (`BUNDLE_DISABLE_LOCAL_REVISION_CHECK`):
   Allow Bundler to use a local git override without checking if the revision
   present in the lockfile is present in the repository.
* `disable_shared_gems` (`BUNDLE_DISABLE_SHARED_GEMS`):
   Stop Bundler from accessing gems installed to RubyGems' normal location.
* `disable_version_check` (`BUNDLE_DISABLE_VERSION_CHECK`):
   Stop Bundler from checking if a newer Bundler version is available on
   rubygems.org.
* `force_ruby_platform` (`BUNDLE_FORCE_RUBY_PLATFORM`):
   Ignore the current machine's platform and install only `ruby` platform gems.
   As a result, gems with native extensions will be compiled from source.
* `frozen` (`BUNDLE_FROZEN`):
   Disallow changes to the `Gemfile`. When the `Gemfile` is changed and the
   lockfile has not been updated, running Bundler commands will be blocked.
   Defaults to `true` when `--deployment` is used.
* `gem.github_username` (`BUNDLE_GEM__GITHUB_USERNAME`):
   Sets a GitHub username or organization to be used in `README` file when you
   create a new gem via `bundle gem` command. It can be overridden by passing an
   explicit `--github-username` flag to `bundle gem`.
* `gem.push_key` (`BUNDLE_GEM__PUSH_KEY`):
   Sets the `--key` parameter for `gem push` when using the `rake release`
   command with a private gemstash server.
* `gemfile` (`BUNDLE_GEMFILE`):
   The name of the file that bundler should use as the `Gemfile`. This location
   of this file also sets the root of the project, which is used to resolve
   relative paths in the `Gemfile`, among other things. By default, bundler
   will search up from the current working directory until it finds a
   `Gemfile`.
* `global_gem_cache` (`BUNDLE_GLOBAL_GEM_CACHE`):
   Whether Bundler should cache all gems globally, rather than locally to the
   installing Ruby installation.
* `ignore_funding_requests` (`BUNDLE_IGNORE_FUNDING_REQUESTS`):
   When set, no funding requests will be printed.
* `ignore_messages` (`BUNDLE_IGNORE_MESSAGES`):
   When set, no post install messages will be printed. To silence a single gem,
   use dot notation like `ignore_messages.httparty true`.
* `init_gems_rb` (`BUNDLE_INIT_GEMS_RB`):
   Generate a `gems.rb` instead of a `Gemfile` when running `bundle init`.
* `jobs` (`BUNDLE_JOBS`):
   The number of gems Bundler can install in parallel. Defaults to the number of
   available processors.
* `no_install` (`BUNDLE_NO_INSTALL`):
   Whether `bundle package` should skip installing gems.
* `no_prune` (`BUNDLE_NO_PRUNE`):
   Whether Bundler should leave outdated gems unpruned when caching.
* `only` (`BUNDLE_ONLY`):
   A space-separated list of groups to install only gems of the specified groups.
* `path` (`BUNDLE_PATH`):
   The location on disk where all gems in your bundle will be located regardless
   of `$GEM_HOME` or `$GEM_PATH` values. Bundle gems not found in this location
   will be installed by `bundle install`. Defaults to `Gem.dir`. When --deployment
   is used, defaults to vendor/bundle.
* `path.system` (`BUNDLE_PATH__SYSTEM`):
   Whether Bundler will install gems into the default system path (`Gem.dir`).
* `path_relative_to_cwd` (`BUNDLE_PATH_RELATIVE_TO_CWD`)
   Makes `--path` relative to the CWD instead of the `Gemfile`.
* `plugins` (`BUNDLE_PLUGINS`):
   Enable Bundler's experimental plugin system.
* `prefer_patch` (BUNDLE_PREFER_PATCH):
   Prefer updating only to next patch version during updates. Makes `bundle update` calls equivalent to `bundler update --patch`.
* `print_only_version_number` (`BUNDLE_PRINT_ONLY_VERSION_NUMBER`):
   Print only version number from `bundler --version`.
* `redirect` (`BUNDLE_REDIRECT`):
   The number of redirects allowed for network requests. Defaults to `5`.
* `retry` (`BUNDLE_RETRY`):
   The number of times to retry failed network requests. Defaults to `3`.
* `setup_makes_kernel_gem_public` (`BUNDLE_SETUP_MAKES_KERNEL_GEM_PUBLIC`):
   Have `Bundler.setup` make the `Kernel#gem` method public, even though
   RubyGems declares it as private.
* `shebang` (`BUNDLE_SHEBANG`):
   The program name that should be invoked for generated binstubs. Defaults to
   the ruby install name used to generate the binstub.
* `silence_deprecations` (`BUNDLE_SILENCE_DEPRECATIONS`):
   Whether Bundler should silence deprecation warnings for behavior that will
   be changed in the next major version.
* `silence_root_warning` (`BUNDLE_SILENCE_ROOT_WARNING`):
   Silence the warning Bundler prints when installing gems as root.
* `ssl_ca_cert` (`BUNDLE_SSL_CA_CERT`):
   Path to a designated CA certificate file or folder containing multiple
   certificates for trusted CAs in PEM format.
* `ssl_client_cert` (`BUNDLE_SSL_CLIENT_CERT`):
   Path to a designated file containing a X.509 client certificate
   and key in PEM format.
* `ssl_verify_mode` (`BUNDLE_SSL_VERIFY_MODE`):
   The SSL verification mode Bundler uses when making HTTPS requests.
   Defaults to verify peer.
* `suppress_install_using_messages` (`BUNDLE_SUPPRESS_INSTALL_USING_MESSAGES`):
   Avoid printing `Using ...` messages during installation when the version of
   a gem has not changed.
* `system_bindir` (`BUNDLE_SYSTEM_BINDIR`):
   The location where RubyGems installs binstubs. Defaults to `Gem.bindir`.
* `timeout` (`BUNDLE_TIMEOUT`):
   The seconds allowed before timing out for network requests. Defaults to `10`.
* `update_requires_all_flag` (`BUNDLE_UPDATE_REQUIRES_ALL_FLAG`):
   Require passing `--all` to `bundle update` when everything should be updated,
   and disallow passing no options to `bundle update`.
* `user_agent` (`BUNDLE_USER_AGENT`):
   The custom user agent fragment Bundler includes in API requests.
* `with` (`BUNDLE_WITH`):
   A `:`-separated list of groups whose gems bundler should install.
* `without` (`BUNDLE_WITHOUT`):
   A `:`-separated list of groups whose gems bundler should not install.

In general, you should set these settings per-application by using the applicable
flag to the [bundle install(1)](bundle-install.1.html) or [bundle cache(1)](bundle-cache.1.html) command.

You can set them globally either via environment variables or `bundle config`,
whichever is preferable for your setup. If you use both, environment variables
will take preference over global settings.

## LOCAL GIT REPOS

Bundler also allows you to work against a git repository locally
instead of using the remote version. This can be achieved by setting
up a local override:

    bundle config set --local local.GEM_NAME /path/to/local/git/repository

For example, in order to use a local Rack repository, a developer could call:

    bundle config set --local local.rack ~/Work/git/rack

Now instead of checking out the remote git repository, the local
override will be used. Similar to a path source, every time the local
git repository change, changes will be automatically picked up by
Bundler. This means a commit in the local git repo will update the
revision in the `Gemfile.lock` to the local git repo revision. This
requires the same attention as git submodules. Before pushing to
the remote, you need to ensure the local override was pushed, otherwise
you may point to a commit that only exists in your local machine.
You'll also need to CGI escape your usernames and passwords as well.

Bundler does many checks to ensure a developer won't work with
invalid references. Particularly, we force a developer to specify
a branch in the `Gemfile` in order to use this feature. If the branch
specified in the `Gemfile` and the current branch in the local git
repository do not match, Bundler will abort. This ensures that
a developer is always working against the correct branches, and prevents
accidental locking to a different branch.

Finally, Bundler also ensures that the current revision in the
`Gemfile.lock` exists in the local git repository. By doing this, Bundler
forces you to fetch the latest changes in the remotes.

## MIRRORS OF GEM SOURCES

Bundler supports overriding gem sources with mirrors. This allows you to
configure rubygems.org as the gem source in your Gemfile while still using your
mirror to fetch gems.

    bundle config set --global mirror.SOURCE_URL MIRROR_URL

For example, to use a mirror of https://rubygems.org hosted at https://example.org:

    bundle config set --global mirror.https://rubygems.org https://example.org

Each mirror also provides a fallback timeout setting. If the mirror does not
respond within the fallback timeout, Bundler will try to use the original
server instead of the mirror.

    bundle config set --global mirror.SOURCE_URL.fallback_timeout TIMEOUT

For example, to fall back to rubygems.org after 3 seconds:

    bundle config set --global mirror.https://rubygems.org.fallback_timeout 3

The default fallback timeout is 0.1 seconds, but the setting can currently
only accept whole seconds (for example, 1, 15, or 30).

## CREDENTIALS FOR GEM SOURCES

Bundler allows you to configure credentials for any gem source, which allows
you to avoid putting secrets into your Gemfile.

    bundle config set --global SOURCE_HOSTNAME USERNAME:PASSWORD

For example, to save the credentials of user `claudette` for the gem source at
`gems.longerous.com`, you would run:

    bundle config set --global gems.longerous.com claudette:s00pers3krit

Or you can set the credentials as an environment variable like this:

    export BUNDLE_GEMS__LONGEROUS__COM="claudette:s00pers3krit"

For gems with a git source with HTTP(S) URL you can specify credentials like so:

    bundle config set --global https://github.com/rubygems/rubygems.git username:password

Or you can set the credentials as an environment variable like so:

    export BUNDLE_GITHUB__COM=username:password

This is especially useful for private repositories on hosts such as GitHub,
where you can use personal OAuth tokens:

    export BUNDLE_GITHUB__COM=abcd0123generatedtoken:x-oauth-basic

Note that any configured credentials will be redacted by informative commands
such as `bundle config list` or `bundle config get`, unless you use the
`--parseable` flag. This is to avoid unintentionally leaking credentials when
copy-pasting bundler output.

Also note that to guarantee a sane mapping between valid environment variable
names and valid host names, bundler makes the following transformations:

* Any `-` characters in a host name are mapped to a triple dash (`___`) in the
  corresponding environment variable.

* Any `.` characters in a host name are mapped to a double dash (`__`) in the
  corresponding environment variable.

This means that if you have a gem server named `my.gem-host.com`, you'll need to
use the `BUNDLE_MY__GEM___HOST__COM` variable to configure credentials for it
through ENV.

## CONFIGURE BUNDLER DIRECTORIES

Bundler's home, config, cache and plugin directories are able to be configured
through environment variables. The default location for Bundler's home directory is
`~/.bundle`, which all directories inherit from by default. The following
outlines the available environment variables and their default values

    BUNDLE_USER_HOME : $HOME/.bundle
    BUNDLE_USER_CACHE : $BUNDLE_USER_HOME/cache
    BUNDLE_USER_CONFIG : $BUNDLE_USER_HOME/config
    BUNDLE_USER_PLUGIN : $BUNDLE_USER_HOME/plugin
PK}$[���qq;gems/gems/bundler-2.3.27/lib/bundler/man/bundle-info.1.ronnnu�[���bundle-info(1) -- Show information for the given gem in your bundle
=========================================================================

## SYNOPSIS

`bundle info` [GEM]
              [--path]

## DESCRIPTION

Print the basic information about the provided GEM such as homepage, version,
path and summary.

## OPTIONS

* `--path`:
Print the path of the given gem
PK}$[��C&U6U68gems/gems/bundler-2.3.27/lib/bundler/man/bundle-update.1nu�[���.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "BUNDLE\-UPDATE" "1" "October 2022" "" ""
.
.SH "NAME"
\fBbundle\-update\fR \- Update your gems to the latest available versions
.
.SH "SYNOPSIS"
\fBbundle update\fR \fI*gems\fR [\-\-all] [\-\-group=NAME] [\-\-source=NAME] [\-\-local] [\-\-ruby] [\-\-bundler[=VERSION]] [\-\-full\-index] [\-\-jobs=JOBS] [\-\-quiet] [\-\-patch|\-\-minor|\-\-major] [\-\-redownload] [\-\-strict] [\-\-conservative]
.
.SH "DESCRIPTION"
Update the gems specified (all gems, if \fB\-\-all\fR flag is used), ignoring the previously installed gems specified in the \fBGemfile\.lock\fR\. In general, you should use bundle install(1) \fIbundle\-install\.1\.html\fR to install the same exact gems and versions across machines\.
.
.P
You would use \fBbundle update\fR to explicitly update the version of a gem\.
.
.SH "OPTIONS"
.
.TP
\fB\-\-all\fR
Update all gems specified in Gemfile\.
.
.TP
\fB\-\-group=<name>\fR, \fB\-g=[<name>]\fR
Only update the gems in the specified group\. For instance, you can update all gems in the development group with \fBbundle update \-\-group development\fR\. You can also call \fBbundle update rails \-\-group test\fR to update the rails gem and all gems in the test group, for example\.
.
.TP
\fB\-\-source=<name>\fR
The name of a \fB:git\fR or \fB:path\fR source used in the Gemfile(5)\. For instance, with a \fB:git\fR source of \fBhttp://github\.com/rails/rails\.git\fR, you would call \fBbundle update \-\-source rails\fR
.
.TP
\fB\-\-local\fR
Do not attempt to fetch gems remotely and use the gem cache instead\.
.
.TP
\fB\-\-ruby\fR
Update the locked version of Ruby to the current version of Ruby\.
.
.TP
\fB\-\-bundler\fR
Update the locked version of bundler to the invoked bundler version\.
.
.TP
\fB\-\-full\-index\fR
Fall back to using the single\-file index of all gems\.
.
.TP
\fB\-\-jobs=[<number>]\fR, \fB\-j[<number>]\fR
Specify the number of jobs to run in parallel\. The default is the number of available processors\.
.
.TP
\fB\-\-retry=[<number>]\fR
Retry failed network or git requests for \fInumber\fR times\.
.
.TP
\fB\-\-quiet\fR
Only output warnings and errors\.
.
.TP
\fB\-\-redownload\fR
Force downloading every gem\.
.
.TP
\fB\-\-patch\fR
Prefer updating only to next patch version\.
.
.TP
\fB\-\-minor\fR
Prefer updating only to next minor version\.
.
.TP
\fB\-\-major\fR
Prefer updating to next major version (default)\.
.
.TP
\fB\-\-strict\fR
Do not allow any gem to be updated past latest \fB\-\-patch\fR | \fB\-\-minor\fR | \fB\-\-major\fR\.
.
.TP
\fB\-\-conservative\fR
Use bundle install conservative update behavior and do not allow indirect dependencies to be updated\.
.
.SH "UPDATING ALL GEMS"
If you run \fBbundle update \-\-all\fR, bundler will ignore any previously installed gems and resolve all dependencies again based on the latest versions of all gems available in the sources\.
.
.P
Consider the following Gemfile(5):
.
.IP "" 4
.
.nf

source "https://rubygems\.org"

gem "rails", "3\.0\.0\.rc"
gem "nokogiri"
.
.fi
.
.IP "" 0
.
.P
When you run bundle install(1) \fIbundle\-install\.1\.html\fR the first time, bundler will resolve all of the dependencies, all the way down, and install what you need:
.
.IP "" 4
.
.nf

Fetching gem metadata from https://rubygems\.org/\.\.\.\.\.\.\.\.\.
Resolving dependencies\.\.\.
Installing builder 2\.1\.2
Installing abstract 1\.0\.0
Installing rack 1\.2\.8
Using bundler 1\.7\.6
Installing rake 10\.4\.0
Installing polyglot 0\.3\.5
Installing mime\-types 1\.25\.1
Installing i18n 0\.4\.2
Installing mini_portile 0\.6\.1
Installing tzinfo 0\.3\.42
Installing rack\-mount 0\.6\.14
Installing rack\-test 0\.5\.7
Installing treetop 1\.4\.15
Installing thor 0\.14\.6
Installing activesupport 3\.0\.0\.rc
Installing erubis 2\.6\.6
Installing activemodel 3\.0\.0\.rc
Installing arel 0\.4\.0
Installing mail 2\.2\.20
Installing activeresource 3\.0\.0\.rc
Installing actionpack 3\.0\.0\.rc
Installing activerecord 3\.0\.0\.rc
Installing actionmailer 3\.0\.0\.rc
Installing railties 3\.0\.0\.rc
Installing rails 3\.0\.0\.rc
Installing nokogiri 1\.6\.5

Bundle complete! 2 Gemfile dependencies, 26 gems total\.
Use `bundle show [gemname]` to see where a bundled gem is installed\.
.
.fi
.
.IP "" 0
.
.P
As you can see, even though you have two gems in the Gemfile(5), your application needs 26 different gems in order to run\. Bundler remembers the exact versions it installed in \fBGemfile\.lock\fR\. The next time you run bundle install(1) \fIbundle\-install\.1\.html\fR, bundler skips the dependency resolution and installs the same gems as it installed last time\.
.
.P
After checking in the \fBGemfile\.lock\fR into version control and cloning it on another machine, running bundle install(1) \fIbundle\-install\.1\.html\fR will \fIstill\fR install the gems that you installed last time\. You don\'t need to worry that a new release of \fBerubis\fR or \fBmail\fR changes the gems you use\.
.
.P
However, from time to time, you might want to update the gems you are using to the newest versions that still match the gems in your Gemfile(5)\.
.
.P
To do this, run \fBbundle update \-\-all\fR, which will ignore the \fBGemfile\.lock\fR, and resolve all the dependencies again\. Keep in mind that this process can result in a significantly different set of the 25 gems, based on the requirements of new gems that the gem authors released since the last time you ran \fBbundle update \-\-all\fR\.
.
.SH "UPDATING A LIST OF GEMS"
Sometimes, you want to update a single gem in the Gemfile(5), and leave the rest of the gems that you specified locked to the versions in the \fBGemfile\.lock\fR\.
.
.P
For instance, in the scenario above, imagine that \fBnokogiri\fR releases version \fB1\.4\.4\fR, and you want to update it \fIwithout\fR updating Rails and all of its dependencies\. To do this, run \fBbundle update nokogiri\fR\.
.
.P
Bundler will update \fBnokogiri\fR and any of its dependencies, but leave alone Rails and its dependencies\.
.
.SH "OVERLAPPING DEPENDENCIES"
Sometimes, multiple gems declared in your Gemfile(5) are satisfied by the same second\-level dependency\. For instance, consider the case of \fBthin\fR and \fBrack\-perftools\-profiler\fR\.
.
.IP "" 4
.
.nf

source "https://rubygems\.org"

gem "thin"
gem "rack\-perftools\-profiler"
.
.fi
.
.IP "" 0
.
.P
The \fBthin\fR gem depends on \fBrack >= 1\.0\fR, while \fBrack\-perftools\-profiler\fR depends on \fBrack ~> 1\.0\fR\. If you run bundle install, you get:
.
.IP "" 4
.
.nf

Fetching source index for https://rubygems\.org/
Installing daemons (1\.1\.0)
Installing eventmachine (0\.12\.10) with native extensions
Installing open4 (1\.0\.1)
Installing perftools\.rb (0\.4\.7) with native extensions
Installing rack (1\.2\.1)
Installing rack\-perftools_profiler (0\.0\.2)
Installing thin (1\.2\.7) with native extensions
Using bundler (1\.0\.0\.rc\.3)
.
.fi
.
.IP "" 0
.
.P
In this case, the two gems have their own set of dependencies, but they share \fBrack\fR in common\. If you run \fBbundle update thin\fR, bundler will update \fBdaemons\fR, \fBeventmachine\fR and \fBrack\fR, which are dependencies of \fBthin\fR, but not \fBopen4\fR or \fBperftools\.rb\fR, which are dependencies of \fBrack\-perftools_profiler\fR\. Note that \fBbundle update thin\fR will update \fBrack\fR even though it\'s \fIalso\fR a dependency of \fBrack\-perftools_profiler\fR\.
.
.P
In short, by default, when you update a gem using \fBbundle update\fR, bundler will update all dependencies of that gem, including those that are also dependencies of another gem\.
.
.P
To prevent updating indirect dependencies, prior to version 1\.14 the only option was the \fBCONSERVATIVE UPDATING\fR behavior in bundle install(1) \fIbundle\-install\.1\.html\fR:
.
.P
In this scenario, updating the \fBthin\fR version manually in the Gemfile(5), and then running bundle install(1) \fIbundle\-install\.1\.html\fR will only update \fBdaemons\fR and \fBeventmachine\fR, but not \fBrack\fR\. For more information, see the \fBCONSERVATIVE UPDATING\fR section of bundle install(1) \fIbundle\-install\.1\.html\fR\.
.
.P
Starting with 1\.14, specifying the \fB\-\-conservative\fR option will also prevent indirect dependencies from being updated\.
.
.SH "PATCH LEVEL OPTIONS"
Version 1\.14 introduced 4 patch\-level options that will influence how gem versions are resolved\. One of the following options can be used: \fB\-\-patch\fR, \fB\-\-minor\fR or \fB\-\-major\fR\. \fB\-\-strict\fR can be added to further influence resolution\.
.
.TP
\fB\-\-patch\fR
Prefer updating only to next patch version\.
.
.TP
\fB\-\-minor\fR
Prefer updating only to next minor version\.
.
.TP
\fB\-\-major\fR
Prefer updating to next major version (default)\.
.
.TP
\fB\-\-strict\fR
Do not allow any gem to be updated past latest \fB\-\-patch\fR | \fB\-\-minor\fR | \fB\-\-major\fR\.
.
.P
When Bundler is resolving what versions to use to satisfy declared requirements in the Gemfile or in parent gems, it looks up all available versions, filters out any versions that don\'t satisfy the requirement, and then, by default, sorts them from newest to oldest, considering them in that order\.
.
.P
Providing one of the patch level options (e\.g\. \fB\-\-patch\fR) changes the sort order of the satisfying versions, causing Bundler to consider the latest \fB\-\-patch\fR or \fB\-\-minor\fR version available before other versions\. Note that versions outside the stated patch level could still be resolved to if necessary to find a suitable dependency graph\.
.
.P
For example, if gem \'foo\' is locked at 1\.0\.2, with no gem requirement defined in the Gemfile, and versions 1\.0\.3, 1\.0\.4, 1\.1\.0, 1\.1\.1, 2\.0\.0 all exist, the default order of preference by default (\fB\-\-major\fR) will be "2\.0\.0, 1\.1\.1, 1\.1\.0, 1\.0\.4, 1\.0\.3, 1\.0\.2"\.
.
.P
If the \fB\-\-patch\fR option is used, the order of preference will change to "1\.0\.4, 1\.0\.3, 1\.0\.2, 1\.1\.1, 1\.1\.0, 2\.0\.0"\.
.
.P
If the \fB\-\-minor\fR option is used, the order of preference will change to "1\.1\.1, 1\.1\.0, 1\.0\.4, 1\.0\.3, 1\.0\.2, 2\.0\.0"\.
.
.P
Combining the \fB\-\-strict\fR option with any of the patch level options will remove any versions beyond the scope of the patch level option, to ensure that no gem is updated that far\.
.
.P
To continue the previous example, if both \fB\-\-patch\fR and \fB\-\-strict\fR options are used, the available versions for resolution would be "1\.0\.4, 1\.0\.3, 1\.0\.2"\. If \fB\-\-minor\fR and \fB\-\-strict\fR are used, it would be "1\.1\.1, 1\.1\.0, 1\.0\.4, 1\.0\.3, 1\.0\.2"\.
.
.P
Gem requirements as defined in the Gemfile will still be the first determining factor for what versions are available\. If the gem requirement for \fBfoo\fR in the Gemfile is \'~> 1\.0\', that will accomplish the same thing as providing the \fB\-\-minor\fR and \fB\-\-strict\fR options\.
.
.SH "PATCH LEVEL EXAMPLES"
Given the following gem specifications:
.
.IP "" 4
.
.nf

foo 1\.4\.3, requires: ~> bar 2\.0
foo 1\.4\.4, requires: ~> bar 2\.0
foo 1\.4\.5, requires: ~> bar 2\.1
foo 1\.5\.0, requires: ~> bar 2\.1
foo 1\.5\.1, requires: ~> bar 3\.0
bar with versions 2\.0\.3, 2\.0\.4, 2\.1\.0, 2\.1\.1, 3\.0\.0
.
.fi
.
.IP "" 0
.
.P
Gemfile:
.
.IP "" 4
.
.nf

gem \'foo\'
.
.fi
.
.IP "" 0
.
.P
Gemfile\.lock:
.
.IP "" 4
.
.nf

foo (1\.4\.3)
  bar (~> 2\.0)
bar (2\.0\.3)
.
.fi
.
.IP "" 0
.
.P
Cases:
.
.IP "" 4
.
.nf

#  Command Line                     Result
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
1  bundle update \-\-patch            \'foo 1\.4\.5\', \'bar 2\.1\.1\'
2  bundle update \-\-patch foo        \'foo 1\.4\.5\', \'bar 2\.1\.1\'
3  bundle update \-\-minor            \'foo 1\.5\.1\', \'bar 3\.0\.0\'
4  bundle update \-\-minor \-\-strict   \'foo 1\.5\.0\', \'bar 2\.1\.1\'
5  bundle update \-\-patch \-\-strict   \'foo 1\.4\.4\', \'bar 2\.0\.4\'
.
.fi
.
.IP "" 0
.
.P
In case 1, bar is upgraded to 2\.1\.1, a minor version increase, because the dependency from foo 1\.4\.5 required it\.
.
.P
In case 2, only foo is requested to be unlocked, but bar is also allowed to move because it\'s not a declared dependency in the Gemfile\.
.
.P
In case 3, bar goes up a whole major release, because a minor increase is preferred now for foo, and when it goes to 1\.5\.1, it requires 3\.0\.0 of bar\.
.
.P
In case 4, foo is preferred up to a minor version, but 1\.5\.1 won\'t work because the \-\-strict flag removes bar 3\.0\.0 from consideration since it\'s a major increment\.
.
.P
In case 5, both foo and bar have any minor or major increments removed from consideration because of the \-\-strict flag, so the most they can move is up to 1\.4\.4 and 2\.0\.4\.
.
.SH "RECOMMENDED WORKFLOW"
In general, when working with an application managed with bundler, you should use the following workflow:
.
.IP "\(bu" 4
After you create your Gemfile(5) for the first time, run
.
.IP
$ bundle install
.
.IP "\(bu" 4
Check the resulting \fBGemfile\.lock\fR into version control
.
.IP
$ git add Gemfile\.lock
.
.IP "\(bu" 4
When checking out this repository on another development machine, run
.
.IP
$ bundle install
.
.IP "\(bu" 4
When checking out this repository on a deployment machine, run
.
.IP
$ bundle install \-\-deployment
.
.IP "\(bu" 4
After changing the Gemfile(5) to reflect a new or update dependency, run
.
.IP
$ bundle install
.
.IP "\(bu" 4
Make sure to check the updated \fBGemfile\.lock\fR into version control
.
.IP
$ git add Gemfile\.lock
.
.IP "\(bu" 4
If bundle install(1) \fIbundle\-install\.1\.html\fR reports a conflict, manually update the specific gems that you changed in the Gemfile(5)
.
.IP
$ bundle update rails thin
.
.IP "\(bu" 4
If you want to update all the gems to the latest possible versions that still match the gems listed in the Gemfile(5), run
.
.IP
$ bundle update \-\-all
.
.IP "" 0

PK}$[����/gems/gems/bundler-2.3.27/lib/bundler/version.rbnu�[���# frozen_string_literal: false

module Bundler
  VERSION = "2.3.27".freeze

  def self.bundler_major_version
    @bundler_major_version ||= VERSION.split(".").first.to_i
  end
end
PK}$[W�|��*gems/gems/bundler-2.3.27/lib/bundler/ui.rbnu�[���# frozen_string_literal: true

module Bundler
  module UI
    autoload :RGProxy, File.expand_path("ui/rg_proxy", __dir__)
    autoload :Shell,   File.expand_path("ui/shell", __dir__)
    autoload :Silent,  File.expand_path("ui/silent", __dir__)
  end
end
PK}$[��3�

0gems/gems/bundler-2.3.27/lib/bundler/cli/init.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Init
    attr_reader :options
    def initialize(options)
      @options = options
    end

    def run
      if File.exist?(gemfile)
        Bundler.ui.error "#{gemfile} already exists at #{File.expand_path(gemfile)}"
        exit 1
      end

      unless File.writable?(Dir.pwd)
        Bundler.ui.error "Can not create #{gemfile} as the current directory is not writable."
        exit 1
      end

      if options[:gemspec]
        gemspec = File.expand_path(options[:gemspec])
        unless File.exist?(gemspec)
          Bundler.ui.error "Gem specification #{gemspec} doesn't exist"
          exit 1
        end

        spec = Bundler.load_gemspec_uncached(gemspec)

        File.open(gemfile, "wb") do |file|
          file << "# Generated from #{gemspec}\n"
          file << spec.to_gemfile
        end
      else
        File.open(File.expand_path("../templates/#{gemfile}", __dir__), "r") do |template|
          File.open(gemfile, "wb") do |destination|
            IO.copy_stream(template, destination)
          end
        end
      end

      puts "Writing new #{gemfile} to #{SharedHelpers.pwd}/#{gemfile}"
    end

    private

    def gemfile
      @gemfile ||= Bundler.preferred_gemfile_name
    end
  end
end
PK}$[5H
��4gems/gems/bundler-2.3.27/lib/bundler/cli/platform.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Platform
    attr_reader :options
    def initialize(options)
      @options = options
    end

    def run
      platforms, ruby_version = Bundler.ui.silence do
        locked_ruby_version = Bundler.locked_gems && Bundler.locked_gems.ruby_version&.gsub(/p\d+\Z/, "")
        gemfile_ruby_version = Bundler.definition.ruby_version && Bundler.definition.ruby_version.single_version_string
        [Bundler.definition.platforms.map {|p| "* #{p}" },
         locked_ruby_version || gemfile_ruby_version]
      end
      output = []

      if options[:ruby]
        if ruby_version
          output << ruby_version
        else
          output << "No ruby version specified"
        end
      else
        output << "Your platform is: #{Gem::Platform.local}"
        output << "Your app has gems that work on these platforms:\n#{platforms.join("\n")}"

        if ruby_version
          output << "Your Gemfile specifies a Ruby version requirement:\n* #{ruby_version}"

          begin
            Bundler.definition.validate_runtime!
            output << "Your current platform satisfies the Ruby version requirement."
          rescue RubyVersionMismatch => e
            output << e.message
          end
        else
          output << "Your Gemfile does not specify a Ruby version requirement."
        end
      end

      Bundler.ui.info output.join("\n\n")
    end
  end
end
PK}$[V�9��0gems/gems/bundler-2.3.27/lib/bundler/cli/fund.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Fund
    attr_reader :options

    def initialize(options)
      @options = options
    end

    def run
      Bundler.definition.validate_runtime!

      groups = Array(options[:group]).map(&:to_sym)

      deps = if groups.any?
        Bundler.definition.dependencies_for(groups)
      else
        Bundler.definition.current_dependencies
      end

      fund_info = deps.each_with_object([]) do |dep, arr|
        spec = Bundler.definition.specs[dep.name].first
        if spec.metadata.key?("funding_uri")
          arr << "* #{spec.name} (#{spec.version})\n  Funding: #{spec.metadata["funding_uri"]}"
        end
      end

      if fund_info.empty?
        Bundler.ui.info "None of the installed gems you directly depend on are looking for funding."
      else
        Bundler.ui.info fund_info.join("\n")
      end
    end
  end
end
PK}$[�^f0gems/gems/bundler-2.3.27/lib/bundler/cli/list.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::List
    def initialize(options)
      @options = options
      @without_group = options["without-group"].map(&:to_sym)
      @only_group = options["only-group"].map(&:to_sym)
    end

    def run
      raise InvalidOption, "The `--only-group` and `--without-group` options cannot be used together" if @only_group.any? && @without_group.any?

      raise InvalidOption, "The `--name-only` and `--paths` options cannot be used together" if @options["name-only"] && @options[:paths]

      specs = if @only_group.any? || @without_group.any?
        filtered_specs_by_groups
      else
        begin
          Bundler.load.specs
        rescue GemNotFound => e
          Bundler.ui.error e.message
          Bundler.ui.warn "Install missing gems with `bundle install`."
          exit 1
        end
      end.reject {|s| s.name == "bundler" }.sort_by(&:name)

      return Bundler.ui.info "No gems in the Gemfile" if specs.empty?

      return specs.each {|s| Bundler.ui.info s.name } if @options["name-only"]
      return specs.each {|s| Bundler.ui.info s.full_gem_path } if @options["paths"]

      Bundler.ui.info "Gems included by the bundle:"

      specs.each {|s| Bundler.ui.info "  * #{s.name} (#{s.version}#{s.git_version})" }

      Bundler.ui.info "Use `bundle info` to print more detailed information about a gem"
    end

    private

    def verify_group_exists(groups)
      (@without_group + @only_group).each do |group|
        raise InvalidOption, "`#{group}` group could not be found." unless groups.include?(group)
      end
    end

    def filtered_specs_by_groups
      definition = Bundler.definition
      groups = definition.groups

      verify_group_exists(groups)

      show_groups =
        if @without_group.any?
          groups.reject {|g| @without_group.include?(g) }
        elsif @only_group.any?
          groups.select {|g| @only_group.include?(g) }
        else
          groups
        end.map(&:to_sym)

      definition.specs_for(show_groups)
    end
  end
end
PK}$[a����$�$4gems/gems/bundler-2.3.27/lib/bundler/cli/outdated.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Outdated
    attr_reader :options, :gems, :options_include_groups, :filter_options_patch, :sources, :strict
    attr_accessor :outdated_gems

    def initialize(options, gems)
      @options = options
      @gems = gems
      @sources = Array(options[:source])

      @filter_options_patch = options.keys & %w[filter-major filter-minor filter-patch]

      @outdated_gems = []

      @options_include_groups = [:group, :groups].any? do |v|
        options.keys.include?(v.to_s)
      end

      # the patch level options imply strict is also true. It wouldn't make
      # sense otherwise.
      @strict = options["filter-strict"] || Bundler::CLI::Common.patch_level_options(options).any?
    end

    def run
      check_for_deployment_mode!

      gems.each do |gem_name|
        Bundler::CLI::Common.select_spec(gem_name)
      end

      Bundler.definition.validate_runtime!
      current_specs = Bundler.ui.silence { Bundler.definition.resolve }

      current_dependencies = Bundler.ui.silence do
        Bundler.load.dependencies.map {|dep| [dep.name, dep] }.to_h
      end

      definition = if gems.empty? && sources.empty?
        # We're doing a full update
        Bundler.definition(true)
      else
        Bundler.definition(:gems => gems, :sources => sources)
      end

      Bundler::CLI::Common.configure_gem_version_promoter(
        Bundler.definition,
        options.merge(:strict => @strict)
      )

      definition_resolution = proc do
        options[:local] ? definition.resolve_with_cache! : definition.resolve_remotely!
      end

      if options[:parseable]
        Bundler.ui.silence(&definition_resolution)
      else
        definition_resolution.call
      end

      Bundler.ui.info ""

      # Loop through the current specs
      gemfile_specs, dependency_specs = current_specs.partition do |spec|
        current_dependencies.key? spec.name
      end

      specs = if options["only-explicit"]
        gemfile_specs
      else
        gemfile_specs + dependency_specs
      end

      specs.sort_by(&:name).uniq(&:name).each do |current_spec|
        next unless gems.empty? || gems.include?(current_spec.name)

        active_spec = retrieve_active_spec(definition, current_spec)
        next unless active_spec

        next unless filter_options_patch.empty? || update_present_via_semver_portions(current_spec, active_spec, options)

        gem_outdated = Gem::Version.new(active_spec.version) > Gem::Version.new(current_spec.version)
        next unless gem_outdated || (current_spec.git_version != active_spec.git_version)

        dependency = current_dependencies[current_spec.name]
        groups = ""
        if dependency && !options[:parseable]
          groups = dependency.groups.join(", ")
        end

        outdated_gems << {
          :active_spec => active_spec,
          :current_spec => current_spec,
          :dependency => dependency,
          :groups => groups,
        }
      end

      if outdated_gems.empty?
        unless options[:parseable]
          Bundler.ui.info(nothing_outdated_message)
        end
      else
        if options_include_groups
          relevant_outdated_gems = outdated_gems.group_by {|g| g[:groups] }.sort.flat_map do |groups, gems|
            contains_group = groups.split(", ").include?(options[:group])
            next unless options[:groups] || contains_group

            gems
          end.compact

          if options[:parseable]
            relevant_outdated_gems.each do |gems|
              print_gems(gems)
            end
          else
            print_gems_table(relevant_outdated_gems)
          end
        elsif options[:parseable]
          print_gems(outdated_gems)
        else
          print_gems_table(outdated_gems)
        end

        exit 1
      end
    end

    private

    def loaded_from_for(spec)
      return unless spec.respond_to?(:loaded_from)

      spec.loaded_from
    end

    def groups_text(group_text, groups)
      "#{group_text}#{groups.split(",").size > 1 ? "s" : ""} \"#{groups}\""
    end

    def nothing_outdated_message
      if filter_options_patch.any?
        display = filter_options_patch.map do |o|
          o.sub("filter-", "")
        end.join(" or ")

        "No #{display} updates to display.\n"
      else
        "Bundle up to date!\n"
      end
    end

    def retrieve_active_spec(definition, current_spec)
      active_spec = definition.resolve.find_by_name_and_platform(current_spec.name, current_spec.platform)
      return unless active_spec

      return active_spec if strict

      active_specs = active_spec.source.specs.search(current_spec.name).select {|spec| spec.match_platform(current_spec.platform) }.sort_by(&:version)
      if !current_spec.version.prerelease? && !options[:pre] && active_specs.size > 1
        active_specs.delete_if {|b| b.respond_to?(:version) && b.version.prerelease? }
      end
      active_specs.last
    end

    def print_gems(gems_list)
      gems_list.each do |gem|
        print_gem(
          gem[:current_spec],
          gem[:active_spec],
          gem[:dependency],
          gem[:groups],
        )
      end
    end

    def print_gems_table(gems_list)
      data = gems_list.map do |gem|
        gem_column_for(
          gem[:current_spec],
          gem[:active_spec],
          gem[:dependency],
          gem[:groups],
        )
      end

      print_indented([table_header] + data)
    end

    def print_gem(current_spec, active_spec, dependency, groups)
      spec_version = "#{active_spec.version}#{active_spec.git_version}"
      if Bundler.ui.debug?
        loaded_from = loaded_from_for(active_spec)
        spec_version += " (from #{loaded_from})" if loaded_from
      end
      current_version = "#{current_spec.version}#{current_spec.git_version}"

      if dependency && dependency.specific?
        dependency_version = %(, requested #{dependency.requirement})
      end

      spec_outdated_info = "#{active_spec.name} (newest #{spec_version}, " \
        "installed #{current_version}#{dependency_version})"

      output_message = if options[:parseable]
        spec_outdated_info.to_s
      elsif options_include_groups || groups.empty?
        "  * #{spec_outdated_info}"
      else
        "  * #{spec_outdated_info} in #{groups_text("group", groups)}"
      end

      Bundler.ui.info output_message.rstrip
    end

    def gem_column_for(current_spec, active_spec, dependency, groups)
      current_version = "#{current_spec.version}#{current_spec.git_version}"
      spec_version = "#{active_spec.version}#{active_spec.git_version}"
      dependency = dependency.requirement if dependency

      ret_val = [active_spec.name, current_version, spec_version, dependency.to_s, groups.to_s]
      ret_val << loaded_from_for(active_spec).to_s if Bundler.ui.debug?
      ret_val
    end

    def check_for_deployment_mode!
      return unless Bundler.frozen_bundle?
      suggested_command = if Bundler.settings.locations("frozen").keys.&([:global, :local]).any?
        "bundle config unset frozen"
      elsif Bundler.settings.locations("deployment").keys.&([:global, :local]).any?
        "bundle config unset deployment"
      end
      raise ProductionError, "You are trying to check outdated gems in " \
        "deployment mode. Run `bundle outdated` elsewhere.\n" \
        "\nIf this is a development machine, remove the " \
        "#{Bundler.default_gemfile} freeze" \
        "\nby running `#{suggested_command}`."
    end

    def update_present_via_semver_portions(current_spec, active_spec, options)
      current_major = current_spec.version.segments.first
      active_major = active_spec.version.segments.first

      update_present = false
      update_present = active_major > current_major if options["filter-major"]

      if !update_present && (options["filter-minor"] || options["filter-patch"]) && current_major == active_major
        current_minor = get_version_semver_portion_value(current_spec, 1)
        active_minor = get_version_semver_portion_value(active_spec, 1)

        update_present = active_minor > current_minor if options["filter-minor"]

        if !update_present && options["filter-patch"] && current_minor == active_minor
          current_patch = get_version_semver_portion_value(current_spec, 2)
          active_patch = get_version_semver_portion_value(active_spec, 2)

          update_present = active_patch > current_patch
        end
      end

      update_present
    end

    def get_version_semver_portion_value(spec, version_portion_index)
      version_section = spec.version.segments[version_portion_index, 1]
      version_section.to_a[0].to_i
    end

    def print_indented(matrix)
      header = matrix[0]
      data = matrix[1..-1]

      column_sizes = Array.new(header.size) do |index|
        matrix.max_by {|row| row[index].length }[index].length
      end

      Bundler.ui.info justify(header, column_sizes)

      data.sort_by! {|row| row[0] }

      data.each do |row|
        Bundler.ui.info justify(row, column_sizes)
      end
    end

    def table_header
      header = ["Gem", "Current", "Latest", "Requested", "Groups"]
      header << "Path" if Bundler.ui.debug?
      header
    end

    def justify(row, sizes)
      row.each_with_index.map do |element, index|
        element.ljust(sizes[index])
      end.join("  ").strip + "\n"
    end
  end
end
PK}$[�st��0gems/gems/bundler-2.3.27/lib/bundler/cli/show.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Show
    attr_reader :options, :gem_name, :latest_specs
    def initialize(options, gem_name)
      @options = options
      @gem_name = gem_name
      @verbose = options[:verbose] || options[:outdated]
      @latest_specs = fetch_latest_specs if @verbose
    end

    def run
      Bundler.ui.silence do
        Bundler.definition.validate_runtime!
        Bundler.load.lock
      end

      if gem_name
        if gem_name == "bundler"
          path = File.expand_path("../../..", __dir__)
        else
          spec = Bundler::CLI::Common.select_spec(gem_name, :regex_match)
          return unless spec
          path = spec.full_gem_path
          unless File.directory?(path)
            return Bundler.ui.warn "The gem #{gem_name} has been deleted. It was installed at: #{path}"
          end
        end
        return Bundler.ui.info(path)
      end

      if options[:paths]
        Bundler.load.specs.sort_by(&:name).map do |s|
          Bundler.ui.info s.full_gem_path
        end
      else
        Bundler.ui.info "Gems included by the bundle:"
        Bundler.load.specs.sort_by(&:name).each do |s|
          desc = "  * #{s.name} (#{s.version}#{s.git_version})"
          if @verbose
            latest = latest_specs.find {|l| l.name == s.name }
            Bundler.ui.info <<-END.gsub(/^ +/, "")
              #{desc}
              \tSummary:  #{s.summary || "No description available."}
              \tHomepage: #{s.homepage || "No website available."}
              \tStatus:   #{outdated?(s, latest) ? "Outdated - #{s.version} < #{latest.version}" : "Up to date"}
            END
          else
            Bundler.ui.info desc
          end
        end
      end
    end

    private

    def fetch_latest_specs
      definition = Bundler.definition(true)
      if options[:outdated]
        Bundler.ui.info "Fetching remote specs for outdated check...\n\n"
        Bundler.ui.silence { definition.resolve_remotely! }
      else
        definition.resolve_with_cache!
      end
      Bundler.reset!
      definition.specs
    end

    def outdated?(current, latest)
      return false unless latest
      Gem::Version.new(current.version) < Gem::Version.new(latest.version)
    end
  end
end
PK}$[�im�$>$>/gems/gems/bundler-2.3.27/lib/bundler/cli/gem.rbnu�[���# frozen_string_literal: true

require "pathname"

module Bundler
  class CLI
    Bundler.require_thor_actions
    include Thor::Actions
  end

  class CLI::Gem
    TEST_FRAMEWORK_VERSIONS = {
      "rspec" => "3.0",
      "minitest" => "5.0",
      "test-unit" => "3.0",
    }.freeze

    attr_reader :options, :gem_name, :thor, :name, :target

    def initialize(options, gem_name, thor)
      @options = options
      @gem_name = resolve_name(gem_name)

      @thor = thor
      thor.behavior = :invoke
      thor.destination_root = nil

      @name = @gem_name
      @target = SharedHelpers.pwd.join(gem_name)

      validate_ext_name if options[:ext]
    end

    def run
      Bundler.ui.confirm "Creating gem '#{name}'..."

      underscored_name = name.tr("-", "_")
      namespaced_path = name.tr("-", "/")
      constant_name = name.gsub(/-[_-]*(?![_-]|$)/) { "::" }.gsub(/([_-]+|(::)|^)(.|$)/) { $2.to_s + $3.upcase }
      constant_array = constant_name.split("::")
      minitest_constant_name = constant_array.clone.tap {|a| a[-1] = "Test#{a[-1]}" }.join("::") # Foo::Bar => Foo::TestBar

      use_git = Bundler.git_present? && options[:git]

      git_author_name = use_git ? `git config user.name`.chomp : ""
      git_username = use_git ? `git config github.user`.chomp : ""
      git_user_email = use_git ? `git config user.email`.chomp : ""

      github_username = if options[:github_username].nil?
        git_username
      elsif options[:github_username] == false
        ""
      else
        options[:github_username]
      end

      config = {
        :name             => name,
        :underscored_name => underscored_name,
        :namespaced_path  => namespaced_path,
        :makefile_path    => "#{underscored_name}/#{underscored_name}",
        :constant_name    => constant_name,
        :constant_array   => constant_array,
        :author           => git_author_name.empty? ? "TODO: Write your name" : git_author_name,
        :email            => git_user_email.empty? ? "TODO: Write your email address" : git_user_email,
        :test             => options[:test],
        :ext              => options[:ext],
        :exe              => options[:exe],
        :bundler_version  => bundler_dependency_version,
        :git              => use_git,
        :github_username  => github_username.empty? ? "[USERNAME]" : github_username,
        :required_ruby_version => required_ruby_version,
        :minitest_constant_name => minitest_constant_name,
      }
      ensure_safe_gem_name(name, constant_array)

      templates = {
        "#{Bundler.preferred_gemfile_name}.tt" => Bundler.preferred_gemfile_name,
        "lib/newgem.rb.tt" => "lib/#{namespaced_path}.rb",
        "lib/newgem/version.rb.tt" => "lib/#{namespaced_path}/version.rb",
        "sig/newgem.rbs.tt" => "sig/#{namespaced_path}.rbs",
        "newgem.gemspec.tt" => "#{name}.gemspec",
        "Rakefile.tt" => "Rakefile",
        "README.md.tt" => "README.md",
        "bin/console.tt" => "bin/console",
        "bin/setup.tt" => "bin/setup",
      }

      executables = %w[
        bin/console
        bin/setup
      ]

      templates.merge!("gitignore.tt" => ".gitignore") if use_git

      if test_framework = ask_and_set_test_framework
        config[:test] = test_framework
        config[:test_framework_version] = TEST_FRAMEWORK_VERSIONS[test_framework]

        case test_framework
        when "rspec"
          templates.merge!(
            "rspec.tt" => ".rspec",
            "spec/spec_helper.rb.tt" => "spec/spec_helper.rb",
            "spec/newgem_spec.rb.tt" => "spec/#{namespaced_path}_spec.rb"
          )
          config[:test_task] = :spec
        when "minitest"
          # Generate path for minitest target file (FileList["test/**/test_*.rb"])
          #   foo     => test/test_foo.rb
          #   foo-bar => test/foo/test_bar.rb
          #   foo_bar => test/test_foo_bar.rb
          paths = namespaced_path.rpartition("/")
          paths[2] = "test_#{paths[2]}"
          minitest_namespaced_path = paths.join("")

          templates.merge!(
            "test/minitest/test_helper.rb.tt" => "test/test_helper.rb",
            "test/minitest/test_newgem.rb.tt" => "test/#{minitest_namespaced_path}.rb"
          )
          config[:test_task] = :test
        when "test-unit"
          templates.merge!(
            "test/test-unit/test_helper.rb.tt" => "test/test_helper.rb",
            "test/test-unit/newgem_test.rb.tt" => "test/#{namespaced_path}_test.rb"
          )
          config[:test_task] = :test
        end
      end

      config[:ci] = ask_and_set_ci
      case config[:ci]
      when "github"
        templates.merge!("github/workflows/main.yml.tt" => ".github/workflows/main.yml")
      when "travis"
        templates.merge!("travis.yml.tt" => ".travis.yml")
      when "gitlab"
        templates.merge!("gitlab-ci.yml.tt" => ".gitlab-ci.yml")
      when "circle"
        templates.merge!("circleci/config.yml.tt" => ".circleci/config.yml")
      end

      if ask_and_set(:mit, "Do you want to license your code permissively under the MIT license?",
        "This means that any other developer or company will be legally allowed to use your code " \
        "for free as long as they admit you created it. You can read more about the MIT license " \
        "at https://choosealicense.com/licenses/mit.")
        config[:mit] = true
        Bundler.ui.info "MIT License enabled in config"
        templates.merge!("LICENSE.txt.tt" => "LICENSE.txt")
      end

      if ask_and_set(:coc, "Do you want to include a code of conduct in gems you generate?",
        "Codes of conduct can increase contributions to your project by contributors who " \
        "prefer collaborative, safe spaces. You can read more about the code of conduct at " \
        "contributor-covenant.org. Having a code of conduct means agreeing to the responsibility " \
        "of enforcing it, so be sure that you are prepared to do that. Be sure that your email " \
        "address is specified as a contact in the generated code of conduct so that people know " \
        "who to contact in case of a violation. For suggestions about " \
        "how to enforce codes of conduct, see https://bit.ly/coc-enforcement.")
        config[:coc] = true
        Bundler.ui.info "Code of conduct enabled in config"
        templates.merge!("CODE_OF_CONDUCT.md.tt" => "CODE_OF_CONDUCT.md")
      end

      if ask_and_set(:changelog, "Do you want to include a changelog?",
        "A changelog is a file which contains a curated, chronologically ordered list of notable " \
        "changes for each version of a project. To make it easier for users and contributors to" \
        " see precisely what notable changes have been made between each release (or version) of" \
        " the project. Whether consumers or developers, the end users of software are" \
        " human beings who care about what's in the software. When the software changes, people " \
        "want to know why and how. see https://keepachangelog.com")
        config[:changelog] = true
        Bundler.ui.info "Changelog enabled in config"
        templates.merge!("CHANGELOG.md.tt" => "CHANGELOG.md")
      end

      config[:linter] = ask_and_set_linter
      case config[:linter]
      when "rubocop"
        config[:linter_version] = rubocop_version
        Bundler.ui.info "RuboCop enabled in config"
        templates.merge!("rubocop.yml.tt" => ".rubocop.yml")
      when "standard"
        config[:linter_version] = standard_version
        Bundler.ui.info "Standard enabled in config"
        templates.merge!("standard.yml.tt" => ".standard.yml")
      end

      templates.merge!("exe/newgem.tt" => "exe/#{name}") if config[:exe]

      if options[:ext]
        templates.merge!(
          "ext/newgem/extconf.rb.tt" => "ext/#{name}/extconf.rb",
          "ext/newgem/newgem.h.tt" => "ext/#{name}/#{underscored_name}.h",
          "ext/newgem/newgem.c.tt" => "ext/#{name}/#{underscored_name}.c"
        )
      end

      if target.exist? && !target.directory?
        Bundler.ui.error "Couldn't create a new gem named `#{gem_name}` because there's an existing file named `#{gem_name}`."
        exit Bundler::BundlerError.all_errors[Bundler::GenericSystemCallError]
      end

      if use_git
        Bundler.ui.info "Initializing git repo in #{target}"
        require "shellwords"
        `git init #{target.to_s.shellescape}`

        config[:git_default_branch] = File.read("#{target}/.git/HEAD").split("/").last.chomp
      end

      templates.each do |src, dst|
        destination = target.join(dst)
        thor.template("newgem/#{src}", destination, config)
      end

      executables.each do |file|
        path = target.join(file)
        executable = (path.stat.mode | 0o111)
        path.chmod(executable)
      end

      if use_git
        Dir.chdir(target) do
          `git add .`
        end
      end

      # Open gemspec in editor
      open_editor(options["edit"], target.join("#{name}.gemspec")) if options[:edit]

      Bundler.ui.info "Gem '#{name}' was successfully created. " \
        "For more information on making a RubyGem visit https://bundler.io/guides/creating_gem.html"
    end

    private

    def resolve_name(name)
      SharedHelpers.pwd.join(name).basename.to_s
    end

    def ask_and_set(key, header, message)
      choice = options[key]
      choice = Bundler.settings["gem.#{key}"] if choice.nil?

      if choice.nil?
        Bundler.ui.confirm header
        choice = Bundler.ui.yes? "#{message} y/(n):"
        Bundler.settings.set_global("gem.#{key}", choice)
      end

      choice
    end

    def validate_ext_name
      return unless gem_name.index("-")

      Bundler.ui.error "You have specified a gem name which does not conform to the \n" \
                       "naming guidelines for C extensions. For more information, \n" \
                       "see the 'Extension Naming' section at the following URL:\n" \
                       "https://guides.rubygems.org/gems-with-extensions/\n"
      exit 1
    end

    def ask_and_set_test_framework
      test_framework = options[:test] || Bundler.settings["gem.test"]

      if test_framework.to_s.empty?
        Bundler.ui.confirm "Do you want to generate tests with your gem?"
        Bundler.ui.info hint_text("test")

        result = Bundler.ui.ask "Enter a test framework. rspec/minitest/test-unit/(none):"
        if result =~ /rspec|minitest|test-unit/
          test_framework = result
        else
          test_framework = false
        end
      end

      if Bundler.settings["gem.test"].nil?
        Bundler.settings.set_global("gem.test", test_framework)
      end

      if options[:test] == Bundler.settings["gem.test"]
        Bundler.ui.info "#{options[:test]} is already configured, ignoring --test flag."
      end

      test_framework
    end

    def hint_text(setting)
      if Bundler.settings["gem.#{setting}"] == false
        "Your choice will only be applied to this gem."
      else
        "Future `bundle gem` calls will use your choice. " \
        "This setting can be changed anytime with `bundle config gem.#{setting}`."
      end
    end

    def ask_and_set_ci
      ci_template = options[:ci] || Bundler.settings["gem.ci"]

      if ci_template.to_s.empty?
        Bundler.ui.confirm "Do you want to set up continuous integration for your gem? " \
          "Supported services:\n" \
          "* CircleCI:       https://circleci.com/\n" \
          "* GitHub Actions: https://github.com/features/actions\n" \
          "* GitLab CI:      https://docs.gitlab.com/ee/ci/\n" \
          "* Travis CI:      https://travis-ci.org/\n" \
          "\n"
        Bundler.ui.info hint_text("ci")

        result = Bundler.ui.ask "Enter a CI service. github/travis/gitlab/circle/(none):"
        if result =~ /github|travis|gitlab|circle/
          ci_template = result
        else
          ci_template = false
        end
      end

      if Bundler.settings["gem.ci"].nil?
        Bundler.settings.set_global("gem.ci", ci_template)
      end

      if options[:ci] == Bundler.settings["gem.ci"]
        Bundler.ui.info "#{options[:ci]} is already configured, ignoring --ci flag."
      end

      ci_template
    end

    def ask_and_set_linter
      linter_template = options[:linter] || Bundler.settings["gem.linter"]
      linter_template = deprecated_rubocop_option if linter_template.nil?

      if linter_template.to_s.empty?
        Bundler.ui.confirm "Do you want to add a code linter and formatter to your gem? " \
          "Supported Linters:\n" \
          "* RuboCop:       https://rubocop.org\n" \
          "* Standard:      https://github.com/testdouble/standard\n" \
          "\n"
        Bundler.ui.info hint_text("linter")

        result = Bundler.ui.ask "Enter a linter. rubocop/standard/(none):"
        if result =~ /rubocop|standard/
          linter_template = result
        else
          linter_template = false
        end
      end

      if Bundler.settings["gem.linter"].nil?
        Bundler.settings.set_global("gem.linter", linter_template)
      end

      # Once gem.linter safely set, unset the deprecated gem.rubocop
      unless Bundler.settings["gem.rubocop"].nil?
        Bundler.settings.set_global("gem.rubocop", nil)
      end

      if options[:linter] == Bundler.settings["gem.linter"]
        Bundler.ui.info "#{options[:linter]} is already configured, ignoring --linter flag."
      end

      linter_template
    end

    def deprecated_rubocop_option
      if !options[:rubocop].nil?
        if options[:rubocop]
          Bundler::SharedHelpers.major_deprecation 2, "--rubocop is deprecated, use --linter=rubocop"
          "rubocop"
        else
          Bundler::SharedHelpers.major_deprecation 2, "--no-rubocop is deprecated, use --linter"
          false
        end
      elsif !Bundler.settings["gem.rubocop"].nil?
        Bundler::SharedHelpers.major_deprecation 2,
          "config gem.rubocop is deprecated; we've updated your config to use gem.linter instead"
        Bundler.settings["gem.rubocop"] ? "rubocop" : false
      end
    end

    def bundler_dependency_version
      v = Gem::Version.new(Bundler::VERSION)
      req = v.segments[0..1]
      req << "a" if v.prerelease?
      req.join(".")
    end

    def ensure_safe_gem_name(name, constant_array)
      if name =~ /^\d/
        Bundler.ui.error "Invalid gem name #{name} Please give a name which does not start with numbers."
        exit 1
      end

      constant_name = constant_array.join("::")

      existing_constant = constant_array.inject(Object) do |c, s|
        defined = begin
          c.const_defined?(s)
        rescue NameError
          Bundler.ui.error "Invalid gem name #{name} -- `#{constant_name}` is an invalid constant name"
          exit 1
        end
        (defined && c.const_get(s)) || break
      end

      return unless existing_constant
      Bundler.ui.error "Invalid gem name #{name} constant #{constant_name} is already in use. Please choose another gem name."
      exit 1
    end

    def open_editor(editor, file)
      thor.run(%(#{editor} "#{file}"))
    end

    def required_ruby_version
      if Gem.ruby_version < Gem::Version.new("2.4.a") then "2.3.0"
      elsif Gem.ruby_version < Gem::Version.new("2.5.a") then "2.4.0"
      elsif Gem.ruby_version < Gem::Version.new("2.6.a") then "2.5.0"
      else
        "2.6.0"
      end
    end

    def rubocop_version
      if Gem.ruby_version < Gem::Version.new("2.4.a") then "0.81.0"
      elsif Gem.ruby_version < Gem::Version.new("2.5.a") then "1.12"
      else
        "1.21"
      end
    end

    def standard_version
      if Gem.ruby_version < Gem::Version.new("2.4.a") then "0.2.5"
      elsif Gem.ruby_version < Gem::Version.new("2.5.a") then "1.0"
      else
        "1.3"
      end
    end
  end
end
PK}$[�p�u��2gems/gems/bundler-2.3.27/lib/bundler/cli/doctor.rbnu�[���# frozen_string_literal: true

require "rbconfig"
require "shellwords"
require "fiddle"

module Bundler
  class CLI::Doctor
    DARWIN_REGEX = /\s+(.+) \(compatibility /.freeze
    LDD_REGEX = /\t\S+ => (\S+) \(\S+\)/.freeze

    attr_reader :options

    def initialize(options)
      @options = options
    end

    def otool_available?
      Bundler.which("otool")
    end

    def ldd_available?
      Bundler.which("ldd")
    end

    def dylibs_darwin(path)
      output = `/usr/bin/otool -L #{path.shellescape}`.chomp
      dylibs = output.split("\n")[1..-1].map {|l| l.match(DARWIN_REGEX).captures[0] }.uniq
      # ignore @rpath and friends
      dylibs.reject {|dylib| dylib.start_with? "@" }
    end

    def dylibs_ldd(path)
      output = `/usr/bin/ldd #{path.shellescape}`.chomp
      output.split("\n").map do |l|
        match = l.match(LDD_REGEX)
        next if match.nil?
        match.captures[0]
      end.compact
    end

    def dylibs(path)
      case RbConfig::CONFIG["host_os"]
      when /darwin/
        return [] unless otool_available?
        dylibs_darwin(path)
      when /(linux|solaris|bsd)/
        return [] unless ldd_available?
        dylibs_ldd(path)
      else # Windows, etc.
        Bundler.ui.warn("Dynamic library check not supported on this platform.")
        []
      end
    end

    def bundles_for_gem(spec)
      Dir.glob("#{spec.full_gem_path}/**/*.bundle")
    end

    def check!
      require_relative "check"
      Bundler::CLI::Check.new({}).run
    end

    def run
      Bundler.ui.level = "warn" if options[:quiet]
      Bundler.settings.validate!
      check!

      definition = Bundler.definition
      broken_links = {}

      definition.specs.each do |spec|
        bundles_for_gem(spec).each do |bundle|
          bad_paths = dylibs(bundle).select do |f|
            begin
              Fiddle.dlopen(f)
              false
            rescue Fiddle::DLError
              true
            end
          end
          if bad_paths.any?
            broken_links[spec] ||= []
            broken_links[spec].concat(bad_paths)
          end
        end
      end

      permissions_valid = check_home_permissions

      if broken_links.any?
        message = "The following gems are missing OS dependencies:"
        broken_links.map do |spec, paths|
          paths.uniq.map do |path|
            "\n * #{spec.name}: #{path}"
          end
        end.flatten.sort.each {|m| message += m }
        raise ProductionError, message
      elsif !permissions_valid
        Bundler.ui.info "No issues found with the installed bundle"
      end
    end

    private

    def check_home_permissions
      require "find"
      files_not_readable_or_writable = []
      files_not_rw_and_owned_by_different_user = []
      files_not_owned_by_current_user_but_still_rw = []
      broken_symlinks = []
      Find.find(Bundler.bundle_path.to_s).each do |f|
        if !File.exist?(f)
          broken_symlinks << f
        elsif !File.writable?(f) || !File.readable?(f)
          if File.stat(f).uid != Process.uid
            files_not_rw_and_owned_by_different_user << f
          else
            files_not_readable_or_writable << f
          end
        elsif File.stat(f).uid != Process.uid
          files_not_owned_by_current_user_but_still_rw << f
        end
      end

      ok = true

      if broken_symlinks.any?
        Bundler.ui.warn "Broken links exist in the Bundler home. Please report them to the offending gem's upstream repo. These files are:\n - #{broken_symlinks.join("\n - ")}"

        ok = false
      end

      if files_not_owned_by_current_user_but_still_rw.any?
        Bundler.ui.warn "Files exist in the Bundler home that are owned by another " \
          "user, but are still readable/writable. These files are:\n - #{files_not_owned_by_current_user_but_still_rw.join("\n - ")}"

        ok = false
      end

      if files_not_rw_and_owned_by_different_user.any?
        Bundler.ui.warn "Files exist in the Bundler home that are owned by another " \
          "user, and are not readable/writable. These files are:\n - #{files_not_rw_and_owned_by_different_user.join("\n - ")}"

        ok = false
      end

      if files_not_readable_or_writable.any?
        Bundler.ui.warn "Files exist in the Bundler home that are not " \
          "readable/writable by the current user. These files are:\n - #{files_not_readable_or_writable.join("\n - ")}"

        ok = false
      end

      ok
    end
  end
end
PK}$[���1gems/gems/bundler-2.3.27/lib/bundler/cli/check.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Check
    attr_reader :options

    def initialize(options)
      @options = options
    end

    def run
      Bundler.settings.set_command_option_if_given :path, options[:path]

      definition = Bundler.definition
      definition.validate_runtime!

      begin
        definition.resolve_only_locally!
        not_installed = definition.missing_specs
      rescue GemNotFound, VersionConflict
        Bundler.ui.error "Bundler can't satisfy your Gemfile's dependencies."
        Bundler.ui.warn "Install missing gems with `bundle install`."
        exit 1
      end

      if not_installed.any?
        Bundler.ui.error "The following gems are missing"
        not_installed.each {|s| Bundler.ui.error " * #{s.name} (#{s.version})" }
        Bundler.ui.warn "Install missing gems with `bundle install`"
        exit 1
      elsif !Bundler.default_lockfile.file? && Bundler.frozen_bundle?
        Bundler.ui.error "This bundle has been frozen, but there is no #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} present"
        exit 1
      else
        Bundler.load.lock(:preserve_unknown_sections => true) unless options[:"dry-run"]
        Bundler.ui.info "The Gemfile's dependencies are satisfied"
      end
    end
  end
end
PK}$["�G���4gems/gems/bundler-2.3.27/lib/bundler/cli/binstubs.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Binstubs
    attr_reader :options, :gems
    def initialize(options, gems)
      @options = options
      @gems = gems
    end

    def run
      Bundler.definition.validate_runtime!
      path_option = options["path"]
      path_option = nil if path_option && path_option.empty?
      Bundler.settings.set_command_option :bin, path_option if options["path"]
      Bundler.settings.set_command_option_if_given :shebang, options["shebang"]
      installer = Installer.new(Bundler.root, Bundler.definition)

      installer_opts = {
        :force => options[:force],
        :binstubs_cmd => true,
        :all_platforms => options["all-platforms"],
      }

      if options[:all]
        raise InvalidOption, "Cannot specify --all with specific gems" unless gems.empty?
        @gems = Bundler.definition.specs.map(&:name)
        installer_opts.delete(:binstubs_cmd)
      elsif gems.empty?
        Bundler.ui.error "`bundle binstubs` needs at least one gem to run."
        exit 1
      end

      gems.each do |gem_name|
        spec = Bundler.definition.specs.find {|s| s.name == gem_name }
        unless spec
          raise GemNotFound, Bundler::CLI::Common.gem_not_found_message(
            gem_name, Bundler.definition.specs
          )
        end

        if options[:standalone]
          next Bundler.ui.warn("Sorry, Bundler can only be run via RubyGems.") if gem_name == "bundler"
          Bundler.settings.temporary(:path => (Bundler.settings[:path] || Bundler.root)) do
            installer.generate_standalone_bundler_executable_stubs(spec, installer_opts)
          end
        else
          installer.generate_bundler_executable_stubs(spec, installer_opts)
        end
      end
    end
  end
end
PK}$[�c|��
�
0gems/gems/bundler-2.3.27/lib/bundler/cli/info.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Info
    attr_reader :gem_name, :options
    def initialize(options, gem_name)
      @options = options
      @gem_name = gem_name
    end

    def run
      Bundler.ui.silence do
        Bundler.definition.validate_runtime!
        Bundler.load.lock
      end

      spec = spec_for_gem(gem_name)

      if spec
        return print_gem_path(spec) if @options[:path]
        return print_gem_version(spec) if @options[:version]
        print_gem_info(spec)
      end
    end

    private

    def spec_for_gem(gem_name)
      spec = Bundler.definition.specs.find {|s| s.name == gem_name }
      spec || default_gem_spec(gem_name) || Bundler::CLI::Common.select_spec(gem_name, :regex_match)
    end

    def default_gem_spec(gem_name)
      return unless Gem::Specification.respond_to?(:find_all_by_name)
      gem_spec = Gem::Specification.find_all_by_name(gem_name).last
      return gem_spec if gem_spec && gem_spec.respond_to?(:default_gem?) && gem_spec.default_gem?
    end

    def spec_not_found(gem_name)
      raise GemNotFound, Bundler::CLI::Common.gem_not_found_message(gem_name, Bundler.definition.dependencies)
    end

    def print_gem_version(spec)
      Bundler.ui.info spec.version.to_s
    end

    def print_gem_path(spec)
      name = spec.name
      if name == "bundler"
        path = File.expand_path("../../..", __dir__)
      else
        path = spec.full_gem_path
        if spec.deleted_gem?
          return Bundler.ui.warn "The gem #{name} has been deleted. It was installed at: #{path}"
        end
      end

      Bundler.ui.info path
    end

    def print_gem_info(spec)
      metadata = spec.metadata
      name = spec.name
      gem_info = String.new
      gem_info << "  * #{name} (#{spec.version}#{spec.git_version})\n"
      gem_info << "\tSummary: #{spec.summary}\n" if spec.summary
      gem_info << "\tHomepage: #{spec.homepage}\n" if spec.homepage
      gem_info << "\tDocumentation: #{metadata["documentation_uri"]}\n" if metadata.key?("documentation_uri")
      gem_info << "\tSource Code: #{metadata["source_code_uri"]}\n" if metadata.key?("source_code_uri")
      gem_info << "\tFunding: #{metadata["funding_uri"]}\n" if metadata.key?("funding_uri")
      gem_info << "\tWiki: #{metadata["wiki_uri"]}\n" if metadata.key?("wiki_uri")
      gem_info << "\tChangelog: #{metadata["changelog_uri"]}\n" if metadata.key?("changelog_uri")
      gem_info << "\tBug Tracker: #{metadata["bug_tracker_uri"]}\n" if metadata.key?("bug_tracker_uri")
      gem_info << "\tMailing List: #{metadata["mailing_list_uri"]}\n" if metadata.key?("mailing_list_uri")
      gem_info << "\tPath: #{spec.full_gem_path}\n"
      gem_info << "\tDefault Gem: yes\n" if spec.respond_to?(:default_gem?) && spec.default_gem?
      gem_info << "\tReverse Dependencies: \n\t\t#{gem_dependencies.join("\n\t\t")}" if gem_dependencies.any?

      if name != "bundler" && spec.deleted_gem?
        return Bundler.ui.warn "The gem #{name} has been deleted. Gemspec information is still available though:\n#{gem_info}"
      end

      Bundler.ui.info gem_info
    end

    def gem_dependencies
      @gem_dependencies ||= Bundler.definition.specs.map do |spec|
        dependency = spec.dependencies.find {|dep| dep.name == gem_name }
        next unless dependency
        "#{spec.name} (#{spec.version}) depends on #{gem_name} (#{dependency.requirements_list.join(", ")})"
      end.compact.sort
    end
  end
end
PK}$[�LLb	b	0gems/gems/bundler-2.3.27/lib/bundler/cli/exec.rbnu�[���# frozen_string_literal: true

require_relative "../current_ruby"

module Bundler
  class CLI::Exec
    attr_reader :options, :args, :cmd

    TRAPPED_SIGNALS = %w[INT].freeze

    def initialize(options, args)
      @options = options
      @cmd = args.shift
      @args = args
      @args << { :close_others => !options.keep_file_descriptors? } unless Bundler.current_ruby.jruby?
    end

    def run
      validate_cmd!
      SharedHelpers.set_bundle_environment
      if bin_path = Bundler.which(cmd)
        if !Bundler.settings[:disable_exec_load] && ruby_shebang?(bin_path)
          return kernel_load(bin_path, *args)
        end
        kernel_exec(bin_path, *args)
      else
        # exec using the given command
        kernel_exec(cmd, *args)
      end
    end

    private

    def validate_cmd!
      return unless cmd.nil?
      Bundler.ui.error "bundler: exec needs a command to run"
      exit 128
    end

    def kernel_exec(*args)
      Kernel.exec(*args)
    rescue Errno::EACCES, Errno::ENOEXEC
      Bundler.ui.error "bundler: not executable: #{cmd}"
      exit 126
    rescue Errno::ENOENT
      Bundler.ui.error "bundler: command not found: #{cmd}"
      Bundler.ui.warn "Install missing gem executables with `bundle install`"
      exit 127
    end

    def kernel_load(file, *args)
      args.pop if args.last.is_a?(Hash)
      ARGV.replace(args)
      $0 = file
      Process.setproctitle(process_title(file, args)) if Process.respond_to?(:setproctitle)
      require_relative "../setup"
      TRAPPED_SIGNALS.each {|s| trap(s, "DEFAULT") }
      Kernel.load(file)
    rescue SystemExit, SignalException
      raise
    rescue Exception # rubocop:disable Lint/RescueException
      Bundler.ui.error "bundler: failed to load command: #{cmd} (#{file})"
      Bundler::FriendlyErrors.disable!
      raise
    end

    def process_title(file, args)
      "#{file} #{args.join(" ")}".strip
    end

    def ruby_shebang?(file)
      possibilities = [
        "#!/opt/alt/ruby31/bin/ruby\n",
        "#!/usr/bin/env jruby\n",
        "#!/usr/bin/env truffleruby\n",
        "#!#{Gem.ruby}\n",
      ]

      if File.zero?(file)
        Bundler.ui.warn "#{file} is empty"
        return false
      end

      first_line = File.open(file, "rb") {|f| f.read(possibilities.map(&:size).max) }
      possibilities.any? {|shebang| first_line.start_with?(shebang) }
    end
  end
end
PK}$[��883gems/gems/bundler-2.3.27/lib/bundler/cli/console.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Console
    attr_reader :options, :group
    def initialize(options, group)
      @options = options
      @group = group
    end

    def run
      Bundler::SharedHelpers.major_deprecation 2, "bundle console will be replaced " \
                           "by `bin/console` generated by `bundle gem <name>`"

      group ? Bundler.require(:default, *group.split(" ").map!(&:to_sym)) : Bundler.require
      ARGV.clear

      console = get_console(Bundler.settings[:console] || "irb")
      console.start
    end

    def get_console(name)
      require name
      get_constant(name)
    rescue LoadError
      Bundler.ui.error "Couldn't load console #{name}, falling back to irb"
      require "irb"
      get_constant("irb")
    end

    def get_constant(name)
      const_name = {
        "pry"  => :Pry,
        "ripl" => :Ripl,
        "irb"  => :IRB,
      }[name]
      Object.const_get(const_name)
    rescue NameError
      Bundler.ui.error "Could not find constant #{const_name}"
      exit 1
    end
  end
end
PK}$[��)``1gems/gems/bundler-2.3.27/lib/bundler/cli/clean.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Clean
    attr_reader :options

    def initialize(options)
      @options = options
    end

    def run
      require_path_or_force unless options[:"dry-run"]
      Bundler.load.clean(options[:"dry-run"])
    end

    protected

    def require_path_or_force
      return unless Bundler.use_system_gems? && !options[:force]
      raise InvalidOption, "Cleaning all the gems on your system is dangerous! " \
        "If you're sure you want to remove every system gem not in this " \
        "bundle, run `bundle clean --force`."
    end
  end
end
PK}$[Ak���2gems/gems/bundler-2.3.27/lib/bundler/cli/plugin.rbnu�[���# frozen_string_literal: true

require_relative "../vendored_thor"
module Bundler
  class CLI::Plugin < Thor
    desc "install PLUGINS", "Install the plugin from the source"
    long_desc <<-D
      Install plugins either from the rubygems source provided (with --source option) or from a git source provided with --git (for remote repos) or --local_git (for local repos). If no sources are provided, it uses Gem.sources
   D
    method_option "source", :type => :string, :default => nil, :banner =>
      "URL of the RubyGems source to fetch the plugin from"
    method_option "version", :type => :string, :default => nil, :banner =>
      "The version of the plugin to fetch"
    method_option "git", :type => :string, :default => nil, :banner =>
      "URL of the git repo to fetch from"
    method_option "local_git", :type => :string, :default => nil, :banner =>
      "Path of the local git repo to fetch from"
    method_option "branch", :type => :string, :default => nil, :banner =>
      "The git branch to checkout"
    method_option "ref", :type => :string, :default => nil, :banner =>
      "The git revision to check out"
    def install(*plugins)
      Bundler::Plugin.install(plugins, options)
    end

    desc "uninstall PLUGINS", "Uninstall the plugins"
    long_desc <<-D
      Uninstall given list of plugins. To uninstall all the plugins, use -all option.
    D
    method_option "all", :type => :boolean, :default => nil, :banner =>
      "Uninstall all the installed plugins. If no plugin is installed, then it does nothing."
    def uninstall(*plugins)
      Bundler::Plugin.uninstall(plugins, options)
    end

    desc "list", "List the installed plugins and available commands"
    def list
      Bundler::Plugin.list
    end
  end
end
PK}$[�;�.>>/gems/gems/bundler-2.3.27/lib/bundler/cli/viz.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Viz
    attr_reader :options, :gem_name
    def initialize(options)
      @options = options
    end

    def run
      # make sure we get the right `graphviz`. There is also a `graphviz`
      # gem we're not built to support
      gem "ruby-graphviz"
      require "graphviz"

      options[:without] = options[:without].join(":").tr(" ", ":").split(":")
      output_file = File.expand_path(options[:file])

      graph = Graph.new(Bundler.load, output_file, options[:version], options[:requirements], options[:format], options[:without])
      graph.viz
    rescue LoadError => e
      Bundler.ui.error e.inspect
      Bundler.ui.warn "Make sure you have the graphviz ruby gem. You can install it with:"
      Bundler.ui.warn "`gem install ruby-graphviz`"
    rescue StandardError => e
      raise unless e.message =~ /GraphViz not installed or dot not in PATH/
      Bundler.ui.error e.message
      Bundler.ui.warn "Please install GraphViz. On a Mac with Homebrew, you can run `brew install graphviz`."
    end
  end
end
PK}$[mV����0gems/gems/bundler-2.3.27/lib/bundler/cli/open.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Open
    attr_reader :options, :name
    def initialize(options, name)
      @options = options
      @name = name
    end

    def run
      editor = [ENV["BUNDLER_EDITOR"], ENV["VISUAL"], ENV["EDITOR"]].find {|e| !e.nil? && !e.empty? }
      return Bundler.ui.info("To open a bundled gem, set $EDITOR or $BUNDLER_EDITOR") unless editor
      return unless spec = Bundler::CLI::Common.select_spec(name, :regex_match)
      if spec.default_gem?
        Bundler.ui.info "Unable to open #{name} because it's a default gem, so the directory it would normally be installed to does not exist."
      else
        path = spec.full_gem_path
        Dir.chdir(path) do
          require "shellwords"
          command = Shellwords.split(editor) + [path]
          Bundler.with_original_env do
            system(*command)
          end || Bundler.ui.info("Could not run '#{command.join(" ")}'")
        end
      end
    end
  end
end
PK}$[g�ӽFF1gems/gems/bundler-2.3.27/lib/bundler/cli/issue.rbnu�[���# frozen_string_literal: true

require "rbconfig"

module Bundler
  class CLI::Issue
    def run
      Bundler.ui.info <<-EOS.gsub(/^ {8}/, "")
        Did you find an issue with Bundler? Before filing a new issue,
        be sure to check out these resources:

        1. Check out our troubleshooting guide for quick fixes to common issues:
        https://github.com/rubygems/rubygems/blob/master/bundler/doc/TROUBLESHOOTING.md

        2. Instructions for common Bundler uses can be found on the documentation
        site: https://bundler.io/

        3. Information about each Bundler command can be found in the Bundler
        man pages: https://bundler.io/man/bundle.1.html

        Hopefully the troubleshooting steps above resolved your problem!  If things
        still aren't working the way you expect them to, please let us know so
        that we can diagnose and help fix the problem you're having, by filling
        in the new issue form located at
        https://github.com/rubygems/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md,
        and copy and pasting the information below.

      EOS

      Bundler.ui.info Bundler::Env.report

      Bundler.ui.info "\n## Bundle Doctor"
      doctor
    end

    def doctor
      require_relative "doctor"
      Bundler::CLI::Doctor.new({}).run
    end
  end
end
PK}$[⮬�772gems/gems/bundler-2.3.27/lib/bundler/cli/common.rbnu�[���# frozen_string_literal: true

module Bundler
  module CLI::Common
    def self.output_post_install_messages(messages)
      return if Bundler.settings["ignore_messages"]
      messages.to_a.each do |name, msg|
        print_post_install_message(name, msg) unless Bundler.settings["ignore_messages.#{name}"]
      end
    end

    def self.print_post_install_message(name, msg)
      Bundler.ui.confirm "Post-install message from #{name}:"
      Bundler.ui.info msg
    end

    def self.output_fund_metadata_summary
      return if Bundler.settings["ignore_funding_requests"]
      definition = Bundler.definition
      current_dependencies = definition.requested_dependencies
      current_specs = definition.specs

      count = current_dependencies.count {|dep| current_specs[dep.name].first.metadata.key?("funding_uri") }

      return if count.zero?

      intro = count > 1 ? "#{count} installed gems you directly depend on are" : "#{count} installed gem you directly depend on is"
      message = "#{intro} looking for funding.\n  Run `bundle fund` for details"
      Bundler.ui.info message
    end

    def self.output_without_groups_message(command)
      return if Bundler.settings[:without].empty?
      Bundler.ui.confirm without_groups_message(command)
    end

    def self.without_groups_message(command)
      command_in_past_tense = command == :install ? "installed" : "updated"
      groups = Bundler.settings[:without]
      "Gems in the #{verbalize_groups(groups)} were not #{command_in_past_tense}."
    end

    def self.verbalize_groups(groups)
      groups.map! {|g| "'#{g}'" }
      group_list = [groups[0...-1].join(", "), groups[-1..-1]].
        reject {|s| s.to_s.empty? }.join(" and ")
      group_str = groups.size == 1 ? "group" : "groups"
      "#{group_str} #{group_list}"
    end

    def self.select_spec(name, regex_match = nil)
      specs = []
      regexp = Regexp.new(name) if regex_match

      Bundler.definition.specs.each do |spec|
        return spec if spec.name == name
        specs << spec if regexp && spec.name =~ regexp
      end

      case specs.count
      when 0
        dep_in_other_group = Bundler.definition.current_dependencies.find {|dep|dep.name == name }

        if dep_in_other_group
          raise GemNotFound, "Could not find gem '#{name}', because it's in the #{verbalize_groups(dep_in_other_group.groups)}, configured to be ignored."
        else
          raise GemNotFound, gem_not_found_message(name, Bundler.definition.dependencies)
        end
      when 1
        specs.first
      else
        ask_for_spec_from(specs)
      end
    rescue RegexpError
      raise GemNotFound, gem_not_found_message(name, Bundler.definition.dependencies)
    end

    def self.ask_for_spec_from(specs)
      specs.each_with_index do |spec, index|
        Bundler.ui.info "#{index.succ} : #{spec.name}", true
      end
      Bundler.ui.info "0 : - exit -", true

      num = Bundler.ui.ask("> ").to_i
      num > 0 ? specs[num - 1] : nil
    end

    def self.gem_not_found_message(missing_gem_name, alternatives)
      require_relative "../similarity_detector"
      message = "Could not find gem '#{missing_gem_name}'."
      alternate_names = alternatives.map {|a| a.respond_to?(:name) ? a.name : a }
      suggestions = SimilarityDetector.new(alternate_names).similar_word_list(missing_gem_name)
      message += "\nDid you mean #{suggestions}?" if suggestions
      message
    end

    def self.ensure_all_gems_in_lockfile!(names, locked_gems = Bundler.locked_gems)
      return unless locked_gems

      locked_names = locked_gems.specs.map(&:name).uniq
      names.-(locked_names).each do |g|
        raise GemNotFound, gem_not_found_message(g, locked_names)
      end
    end

    def self.configure_gem_version_promoter(definition, options)
      patch_level = patch_level_options(options)
      patch_level << :patch if patch_level.empty? && Bundler.settings[:prefer_patch]
      raise InvalidOption, "Provide only one of the following options: #{patch_level.join(", ")}" unless patch_level.length <= 1

      definition.gem_version_promoter.tap do |gvp|
        gvp.level = patch_level.first || :major
        gvp.strict = options[:strict] || options["filter-strict"]
      end
    end

    def self.patch_level_options(options)
      [:major, :minor, :patch].select {|v| options.keys.include?(v.to_s) }
    end

    def self.clean_after_install?
      clean = Bundler.settings[:clean]
      return clean unless clean.nil?
      clean ||= Bundler.feature_flag.auto_clean_without_path? && Bundler.settings[:path].nil?
      clean &&= !Bundler.use_system_gems?
      clean
    end
  end
end
PK}$[/Ԗ __2gems/gems/bundler-2.3.27/lib/bundler/cli/remove.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Remove
    def initialize(gems, options)
      @gems = gems
      @options = options
    end

    def run
      raise InvalidOption, "Please specify gems to remove." if @gems.empty?

      Injector.remove(@gems, {})
      Installer.install(Bundler.root, Bundler.definition)
    end
  end
end
PK}$[3�LT��4gems/gems/bundler-2.3.27/lib/bundler/cli/pristine.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Pristine
    def initialize(gems)
      @gems = gems
    end

    def run
      CLI::Common.ensure_all_gems_in_lockfile!(@gems)
      definition = Bundler.definition
      definition.validate_runtime!
      installer = Bundler::Installer.new(Bundler.root, definition)

      Bundler.load.specs.each do |spec|
        next if spec.name == "bundler" # Source::Rubygems doesn't install bundler
        next if !@gems.empty? && !@gems.include?(spec.name)

        gem_name = "#{spec.name} (#{spec.version}#{spec.git_version})"
        gem_name += " (#{spec.platform})" if !spec.platform.nil? && spec.platform != Gem::Platform::RUBY

        case source = spec.source
        when Source::Rubygems
          cached_gem = spec.cache_file
          unless File.exist?(cached_gem)
            Bundler.ui.error("Failed to pristine #{gem_name}. Cached gem #{cached_gem} does not exist.")
            next
          end

          FileUtils.rm_rf spec.full_gem_path
        when Source::Git
          if source.local?
            Bundler.ui.warn("Cannot pristine #{gem_name}. Gem is locally overridden.")
            next
          end

          source.remote!
          if extension_cache_path = source.extension_cache_path(spec)
            FileUtils.rm_rf extension_cache_path
          end
          FileUtils.rm_rf spec.extension_dir
          FileUtils.rm_rf spec.full_gem_path
        else
          Bundler.ui.warn("Cannot pristine #{gem_name}. Gem is sourced from local path.")
          next
        end

        Bundler::GemInstaller.new(spec, installer, false, 0, true).install_from_spec
      end
    end
  end
end
PK}$[U<�{{2gems/gems/bundler-2.3.27/lib/bundler/cli/update.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Update
    attr_reader :options, :gems
    def initialize(options, gems)
      @options = options
      @gems = gems
    end

    def run
      Bundler.ui.level = "warn" if options[:quiet]

      update_bundler = options[:bundler]

      Bundler.self_manager.update_bundler_and_restart_with_it_if_needed(update_bundler) if update_bundler

      Plugin.gemfile_install(Bundler.default_gemfile) if Bundler.feature_flag.plugins?

      sources = Array(options[:source])
      groups  = Array(options[:group]).map(&:to_sym)

      full_update = gems.empty? && sources.empty? && groups.empty? && !options[:ruby] && !update_bundler

      if full_update && !options[:all]
        if Bundler.feature_flag.update_requires_all_flag?
          raise InvalidOption, "To update everything, pass the `--all` flag."
        end
        SharedHelpers.major_deprecation 3, "Pass --all to `bundle update` to update everything"
      elsif !full_update && options[:all]
        raise InvalidOption, "Cannot specify --all along with specific options."
      end

      conservative = options[:conservative]

      if full_update
        if conservative
          Bundler.definition(:conservative => conservative)
        else
          Bundler.definition(true)
        end
      else
        unless Bundler.default_lockfile.exist?
          raise GemfileLockNotFound, "This Bundle hasn't been installed yet. " \
            "Run `bundle install` to update and install the bundled gems."
        end
        Bundler::CLI::Common.ensure_all_gems_in_lockfile!(gems)

        if groups.any?
          deps = Bundler.definition.dependencies.select {|d| (d.groups & groups).any? }
          gems.concat(deps.map(&:name))
        end

        Bundler.definition(:gems => gems, :sources => sources, :ruby => options[:ruby],
                           :conservative => conservative,
                           :bundler => update_bundler)
      end

      Bundler::CLI::Common.configure_gem_version_promoter(Bundler.definition, options)

      Bundler::Fetcher.disable_endpoint = options["full-index"]

      opts = options.dup
      opts["update"] = true
      opts["local"] = options[:local]

      Bundler.settings.set_command_option_if_given :jobs, opts["jobs"]

      Bundler.definition.validate_runtime!

      if locked_gems = Bundler.definition.locked_gems
        previous_locked_info = locked_gems.specs.reduce({}) do |h, s|
          h[s.name] = { :spec => s, :version => s.version, :source => s.source.identifier }
          h
        end
      end

      installer = Installer.install Bundler.root, Bundler.definition, opts
      Bundler.load.cache if Bundler.app_cache.exist?

      if CLI::Common.clean_after_install?
        require_relative "clean"
        Bundler::CLI::Clean.new(options).run
      end

      if locked_gems
        gems.each do |name|
          locked_info = previous_locked_info[name]
          next unless locked_info

          locked_spec = locked_info[:spec]
          new_spec = Bundler.definition.specs[name].first
          unless new_spec
            unless locked_spec.match_platform(Bundler.local_platform)
              Bundler.ui.warn "Bundler attempted to update #{name} but it was not considered because it is for a different platform from the current one"
            end

            next
          end

          locked_source = locked_info[:source]
          new_source = new_spec.source.identifier
          next if locked_source != new_source

          new_version = new_spec.version
          locked_version = locked_info[:version]
          if new_version < locked_version
            Bundler.ui.warn "Note: #{name} version regressed from #{locked_version} to #{new_version}"
          elsif new_version == locked_version
            Bundler.ui.warn "Bundler attempted to update #{name} but its version stayed the same"
          end
        end
      end

      Bundler.ui.confirm "Bundle updated!"
      Bundler::CLI::Common.output_without_groups_message(:update)
      Bundler::CLI::Common.output_post_install_messages installer.post_install_messages

      Bundler::CLI::Common.output_fund_metadata_summary
    end
  end
end
PK}$[ ��ii1gems/gems/bundler-2.3.27/lib/bundler/cli/cache.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Cache
    attr_reader :options

    def initialize(options)
      @options = options
    end

    def run
      Bundler.ui.level = "warn" if options[:quiet]
      Bundler.settings.set_command_option_if_given :path, options[:path]
      Bundler.settings.set_command_option_if_given :cache_path, options["cache-path"]

      setup_cache_all
      install

      # TODO: move cache contents here now that all bundles are locked
      custom_path = Bundler.settings[:path] if options[:path]

      Bundler.settings.temporary(:cache_all_platforms => options["all-platforms"]) do
        Bundler.load.cache(custom_path)
      end
    end

    private

    def install
      require_relative "install"
      options = self.options.dup
      options["local"] = false if Bundler.settings[:cache_all_platforms]
      options["no-cache"] = true
      Bundler::CLI::Install.new(options).run
    end

    def setup_cache_all
      all = options.fetch(:all, Bundler.feature_flag.cache_all? || nil)

      Bundler.settings.set_command_option_if_given :cache_all, all
    end
  end
end
PK}$[a���2gems/gems/bundler-2.3.27/lib/bundler/cli/config.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Config < Thor
    class_option :parseable, :type => :boolean, :banner => "Use minimal formatting for more parseable output"

    def self.scope_options
      method_option :global, :type => :boolean, :banner => "Only change the global config"
      method_option :local, :type => :boolean, :banner => "Only change the local config"
    end
    private_class_method :scope_options

    desc "base NAME [VALUE]", "The Bundler 1 config interface", :hide => true
    scope_options
    method_option :delete, :type => :boolean, :banner => "delete"
    def base(name = nil, *value)
      new_args =
        if ARGV.size == 1
          ["config", "list"]
        elsif ARGV.include?("--delete")
          ARGV.map {|arg| arg == "--delete" ? "unset" : arg }
        elsif ARGV.include?("--global") || ARGV.include?("--local") || ARGV.size == 3
          ["config", "set", *ARGV[1..-1]]
        else
          ["config", "get", ARGV[1]]
        end

      SharedHelpers.major_deprecation 3,
        "Using the `config` command without a subcommand [list, get, set, unset] is deprecated and will be removed in the future. Use `bundle #{new_args.join(" ")}` instead."

      Base.new(options, name, value, self).run
    end

    desc "list", "List out all configured settings"
    def list
      Base.new(options, nil, nil, self).run
    end

    desc "get NAME", "Returns the value for the given key"
    def get(name)
      Base.new(options, name, nil, self).run
    end

    desc "set NAME VALUE", "Sets the given value for the given key"
    scope_options
    def set(name, value, *value_)
      Base.new(options, name, value_.unshift(value), self).run
    end

    desc "unset NAME", "Unsets the value for the given key"
    scope_options
    def unset(name)
      options[:delete] = true
      Base.new(options, name, nil, self).run
    end

    default_task :base

    class Base
      attr_reader :name, :value, :options, :scope, :thor

      def initialize(options, name, value, thor)
        @options = options
        @name = name
        value = Array(value)
        @value = value.empty? ? nil : value.join(" ")
        @thor = thor
        validate_scope!
      end

      def run
        unless name
          warn_unused_scope "Ignoring --#{scope}"
          confirm_all
          return
        end

        if options[:delete]
          if !explicit_scope? || scope != "global"
            Bundler.settings.set_local(name, nil)
          end
          if !explicit_scope? || scope != "local"
            Bundler.settings.set_global(name, nil)
          end
          return
        end

        if value.nil?
          warn_unused_scope "Ignoring --#{scope} since no value to set was given"

          if options[:parseable]
            if value = Bundler.settings[name]
              Bundler.ui.info("#{name}=#{value}")
            end
            return
          end

          confirm(name)
          return
        end

        Bundler.ui.info(message) if message
        Bundler.settings.send("set_#{scope}", name, new_value)
      end

      def confirm_all
        if @options[:parseable]
          thor.with_padding do
            Bundler.settings.all.each do |setting|
              val = Bundler.settings[setting]
              Bundler.ui.info "#{setting}=#{val}"
            end
          end
        else
          Bundler.ui.confirm "Settings are listed in order of priority. The top value will be used.\n"
          Bundler.settings.all.each do |setting|
            Bundler.ui.confirm setting
            show_pretty_values_for(setting)
            Bundler.ui.confirm ""
          end
        end
      end

      def confirm(name)
        Bundler.ui.confirm "Settings for `#{name}` in order of priority. The top value will be used"
        show_pretty_values_for(name)
      end

      def new_value
        pathname = Pathname.new(value)
        if name.start_with?("local.") && pathname.directory?
          pathname.expand_path.to_s
        else
          value
        end
      end

      def message
        locations = Bundler.settings.locations(name)
        if @options[:parseable]
          "#{name}=#{new_value}" if new_value
        elsif scope == "global"
          if !locations[:local].nil?
            "Your application has set #{name} to #{locations[:local].inspect}. " \
              "This will override the global value you are currently setting"
          elsif locations[:env]
            "You have a bundler environment variable for #{name} set to " \
              "#{locations[:env].inspect}. This will take precedence over the global value you are setting"
          elsif !locations[:global].nil? && locations[:global] != value
            "You are replacing the current global value of #{name}, which is currently " \
              "#{locations[:global].inspect}"
          end
        elsif scope == "local" && !locations[:local].nil? && locations[:local] != value
          "You are replacing the current local value of #{name}, which is currently " \
            "#{locations[:local].inspect}"
        end
      end

      def show_pretty_values_for(setting)
        thor.with_padding do
          Bundler.settings.pretty_values_for(setting).each do |line|
            Bundler.ui.info line
          end
        end
      end

      def explicit_scope?
        @explicit_scope
      end

      def warn_unused_scope(msg)
        return unless explicit_scope?
        return if options[:parseable]

        Bundler.ui.warn(msg)
      end

      def validate_scope!
        @explicit_scope = true
        scopes = %w[global local].select {|s| options[s] }
        case scopes.size
        when 0
          @scope = inside_app? ? "local" : "global"
          @explicit_scope = false
        when 1
          @scope = scopes.first
        else
          raise InvalidOption,
            "The options #{scopes.join " and "} were specified. Please only use one of the switches at a time."
        end
      end

      private

      def inside_app?
        Bundler.root
        true
      rescue GemfileNotFound
        false
      end
    end
  end
end
PK}$[lqOww2gems/gems/bundler-2.3.27/lib/bundler/cli/inject.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Inject
    attr_reader :options, :name, :version, :group, :source, :gems
    def initialize(options, name, version)
      @options = options
      @name = name
      @version = version || last_version_number
      @group = options[:group].split(",") unless options[:group].nil?
      @source = options[:source]
      @gems = []
    end

    def run
      # The required arguments allow Thor to give useful feedback when the arguments
      # are incorrect. This adds those first two arguments onto the list as a whole.
      gems.unshift(source).unshift(group).unshift(version).unshift(name)

      # Build an array of Dependency objects out of the arguments
      deps = []
      # when `inject` support addition of more than one gem, then this loop will
      # help. Currently this loop is running once.
      gems.each_slice(4) do |gem_name, gem_version, gem_group, gem_source|
        ops = Gem::Requirement::OPS.map {|key, _val| key }
        has_op = ops.any? {|op| gem_version.start_with? op }
        gem_version = "~> #{gem_version}" unless has_op
        deps << Bundler::Dependency.new(gem_name, gem_version, "group" => gem_group, "source" => gem_source)
      end

      added = Injector.inject(deps, options)

      if added.any?
        Bundler.ui.confirm "Added to Gemfile:"
        Bundler.ui.confirm(added.map do |d|
          name = "'#{d.name}'"
          requirement = ", '#{d.requirement}'"
          group = ", :group => #{d.groups.inspect}" if d.groups != Array(:default)
          source = ", :source => '#{d.source}'" unless d.source.nil?
          %(gem #{name}#{requirement}#{group}#{source})
        end.join("\n"))
      else
        Bundler.ui.confirm "All gems were already present in the Gemfile"
      end
    end

    private

    def last_version_number
      definition = Bundler.definition(true)
      definition.resolve_remotely!
      specs = definition.index[name].sort_by(&:version)
      unless options[:pre]
        specs.delete_if {|b| b.respond_to?(:version) && b.version.prerelease? }
      end
      spec = specs.last
      spec.version.to_s
    end
  end
end
PK}$[�`K��0gems/gems/bundler-2.3.27/lib/bundler/cli/lock.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Lock
    attr_reader :options

    def initialize(options)
      @options = options
    end

    def run
      unless Bundler.default_gemfile
        Bundler.ui.error "Unable to find a Gemfile to lock"
        exit 1
      end

      print = options[:print]
      ui = Bundler.ui
      Bundler.ui = UI::Silent.new if print

      Bundler::Fetcher.disable_endpoint = options["full-index"]

      update = options[:update]
      conservative = options[:conservative]

      if update.is_a?(Array) # unlocking specific gems
        Bundler::CLI::Common.ensure_all_gems_in_lockfile!(update)
        update = { :gems => update, :conservative => conservative }
      elsif update
        update = { :conservative => conservative } if conservative
      end
      definition = Bundler.definition(update)

      Bundler::CLI::Common.configure_gem_version_promoter(Bundler.definition, options) if options[:update]

      options["remove-platform"].each do |platform|
        definition.remove_platform(platform)
      end

      options["add-platform"].each do |platform_string|
        platform = Gem::Platform.new(platform_string)
        if platform.to_s == "unknown"
          Bundler.ui.warn "The platform `#{platform_string}` is unknown to RubyGems " \
            "and adding it will likely lead to resolution errors"
        end
        definition.add_platform(platform)
      end

      if definition.platforms.empty?
        raise InvalidOption, "Removing all platforms from the bundle is not allowed"
      end

      definition.resolve_remotely! unless options[:local]

      if print
        puts definition.to_lock
      else
        file = options[:lockfile]
        file = file ? File.expand_path(file) : Bundler.default_lockfile
        puts "Writing lockfile to #{file}"
        definition.lock(file)
      end

      Bundler.ui = ui
    end
  end
end
PK}$[R�L��/gems/gems/bundler-2.3.27/lib/bundler/cli/add.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Add
    attr_reader :gems, :options, :version

    def initialize(options, gems)
      @gems = gems
      @options = options
      @options[:group] = options[:group].split(",").map(&:strip) unless options[:group].nil?
      @version = options[:version].split(",").map(&:strip) unless options[:version].nil?
    end

    def run
      validate_options!
      inject_dependencies
      perform_bundle_install unless options["skip-install"]
    end

    private

    def perform_bundle_install
      Installer.install(Bundler.root, Bundler.definition)
      Bundler.load.cache if Bundler.app_cache.exist?
    end

    def inject_dependencies
      dependencies = gems.map {|g| Bundler::Dependency.new(g, version, options) }

      Injector.inject(dependencies,
        :conservative_versioning => options[:version].nil?, # Perform conservative versioning only when version is not specified
        :optimistic => options[:optimistic],
        :strict => options[:strict])
    end

    def validate_options!
      raise InvalidOption, "You can not specify `--strict` and `--optimistic` at the same time." if options[:strict] && options[:optimistic]

      # raise error when no gems are specified
      raise InvalidOption, "Please specify gems to add." if gems.empty?

      version.to_a.each do |v|
        raise InvalidOption, "Invalid gem requirement pattern '#{v}'" unless Gem::Requirement::PATTERN =~ v.to_s
      end
    end
  end
end
PK}$[|���3gems/gems/bundler-2.3.27/lib/bundler/cli/install.rbnu�[���# frozen_string_literal: true

module Bundler
  class CLI::Install
    attr_reader :options
    def initialize(options)
      @options = options
    end

    def run
      Bundler.ui.level = "warn" if options[:quiet]

      warn_if_root

      Bundler.self_manager.install_locked_bundler_and_restart_with_it_if_needed

      Bundler::SharedHelpers.set_env "RB_USER_INSTALL", "1" if Bundler::FREEBSD

      # Disable color in deployment mode
      Bundler.ui.shell = Thor::Shell::Basic.new if options[:deployment]

      check_for_options_conflicts

      check_trust_policy

      if options[:deployment] || options[:frozen] || Bundler.frozen_bundle?
        unless Bundler.default_lockfile.exist?
          flag   = "--deployment flag" if options[:deployment]
          flag ||= "--frozen flag"     if options[:frozen]
          flag ||= "deployment setting"
          raise ProductionError, "The #{flag} requires a #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}. Please make " \
                                 "sure you have checked your #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} into version control " \
                                 "before deploying."
        end

        options[:local] = true if Bundler.app_cache.exist?

        Bundler.settings.set_command_option :deployment, true if options[:deployment]
        Bundler.settings.set_command_option :frozen, true if options[:frozen]
      end

      # When install is called with --no-deployment, disable deployment mode
      if options[:deployment] == false
        Bundler.settings.set_command_option :frozen, nil
        options[:system] = true
      end

      normalize_settings

      Bundler::Fetcher.disable_endpoint = options["full-index"]

      if options["binstubs"]
        Bundler::SharedHelpers.major_deprecation 2,
          "The --binstubs option will be removed in favor of `bundle binstubs --all`"
      end

      Plugin.gemfile_install(Bundler.default_gemfile) if Bundler.feature_flag.plugins?

      definition = Bundler.definition
      definition.validate_runtime!

      installer = Installer.install(Bundler.root, definition, options)

      Bundler.settings.temporary(:cache_all_platforms => options[:local] ? false : Bundler.settings[:cache_all_platforms]) do
        Bundler.load.cache(nil, options[:local]) if Bundler.app_cache.exist? && !options["no-cache"] && !Bundler.frozen_bundle?
      end

      Bundler.ui.confirm "Bundle complete! #{dependencies_count_for(definition)}, #{gems_installed_for(definition)}."
      Bundler::CLI::Common.output_without_groups_message(:install)

      if Bundler.use_system_gems?
        Bundler.ui.confirm "Use `bundle info [gemname]` to see where a bundled gem is installed."
      else
        relative_path = Bundler.configured_bundle_path.base_path_relative_to_pwd
        Bundler.ui.confirm "Bundled gems are installed into `#{relative_path}`"
      end

      Bundler::CLI::Common.output_post_install_messages installer.post_install_messages

      warn_ambiguous_gems

      if CLI::Common.clean_after_install?
        require_relative "clean"
        Bundler::CLI::Clean.new(options).run
      end

      Bundler::CLI::Common.output_fund_metadata_summary
    rescue Gem::InvalidSpecificationException
      Bundler.ui.warn "You have one or more invalid gemspecs that need to be fixed."
      raise
    end

    private

    def warn_if_root
      return if Bundler.settings[:silence_root_warning] || Gem.win_platform? || !Process.uid.zero?
      Bundler.ui.warn "Don't run Bundler as root. Bundler can ask for sudo " \
        "if it is needed, and installing your bundle as root will break this " \
        "application for all non-root users on this machine.", :wrap => true
    end

    def dependencies_count_for(definition)
      count = definition.dependencies.count
      "#{count} Gemfile #{count == 1 ? "dependency" : "dependencies"}"
    end

    def gems_installed_for(definition)
      count = definition.specs.count
      "#{count} #{count == 1 ? "gem" : "gems"} now installed"
    end

    def check_for_group_conflicts_in_cli_options
      conflicting_groups = Array(options[:without]) & Array(options[:with])
      return if conflicting_groups.empty?
      raise InvalidOption, "You can't list a group in both with and without." \
        " The offending groups are: #{conflicting_groups.join(", ")}."
    end

    def check_for_options_conflicts
      if (options[:path] || options[:deployment]) && options[:system]
        error_message = String.new
        error_message << "You have specified both --path as well as --system. Please choose only one option.\n" if options[:path]
        error_message << "You have specified both --deployment as well as --system. Please choose only one option.\n" if options[:deployment]
        raise InvalidOption.new(error_message)
      end
    end

    def check_trust_policy
      trust_policy = options["trust-policy"]
      unless Bundler.rubygems.security_policies.keys.unshift(nil).include?(trust_policy)
        raise InvalidOption, "RubyGems doesn't know about trust policy '#{trust_policy}'. " \
          "The known policies are: #{Bundler.rubygems.security_policies.keys.join(", ")}."
      end
      Bundler.settings.set_command_option_if_given :"trust-policy", trust_policy
    end

    def normalize_groups
      check_for_group_conflicts_in_cli_options

      # need to nil them out first to get around validation for backwards compatibility
      Bundler.settings.set_command_option :without, nil
      Bundler.settings.set_command_option :with,    nil
      Bundler.settings.set_command_option :without, options[:without]
      Bundler.settings.set_command_option :with,    options[:with]
    end

    def normalize_settings
      Bundler.settings.set_command_option :path, nil if options[:system]
      Bundler.settings.set_command_option_if_given :path, options[:path]

      if options["standalone"] && Bundler.settings[:path].nil? && !options["local"]
        Bundler.settings.temporary(:path_relative_to_cwd => false) do
          Bundler.settings.set_command_option :path, "bundle"
        end
      end

      bin_option = options["binstubs"]
      bin_option = nil if bin_option && bin_option.empty?
      Bundler.settings.set_command_option :bin, bin_option if options["binstubs"]

      Bundler.settings.set_command_option_if_given :shebang, options["shebang"]

      Bundler.settings.set_command_option_if_given :jobs, options["jobs"]

      Bundler.settings.set_command_option_if_given :no_prune, options["no-prune"]

      Bundler.settings.set_command_option_if_given :no_install, options["no-install"]

      Bundler.settings.set_command_option_if_given :clean, options["clean"]

      normalize_groups if options[:without] || options[:with]

      options[:force] = options[:redownload]
    end

    def warn_ambiguous_gems
      # TODO: remove this when we drop Bundler 1.x support
      Installer.ambiguous_gems.to_a.each do |name, installed_from_uri, *also_found_in_uris|
        Bundler.ui.warn "Warning: the gem '#{name}' was found in multiple sources."
        Bundler.ui.warn "Installed from: #{installed_from_uri}"
        Bundler.ui.warn "Also found in:"
        also_found_in_uris.each {|uri| Bundler.ui.warn "  * #{uri}" }
        Bundler.ui.warn "You should add a source requirement to restrict this gem to your preferred source."
        Bundler.ui.warn "For example:"
        Bundler.ui.warn "    gem '#{name}', :source => '#{installed_from_uri}'"
        Bundler.ui.warn "Then uninstall the gem '#{name}' (or delete all bundled gems) and then install again."
      end
    end
  end
end
PK}$[Ӄ�nDD5gems/gems/bundler-2.3.27/lib/bundler/plugin/events.rbnu�[���# frozen_string_literal: true

module Bundler
  module Plugin
    module Events
      def self.define(const, event)
        const = const.to_sym.freeze
        if const_defined?(const) && const_get(const) != event
          raise ArgumentError, "Attempting to reassign #{const} to a different value"
        end
        const_set(const, event) unless const_defined?(const)
        @events ||= {}
        @events[event] = const
      end
      private_class_method :define

      def self.reset
        @events.each_value do |const|
          remove_const(const)
        end
        @events = nil
      end
      private_class_method :reset

      # Check if an event has been defined
      # @param event [String] An event to check
      # @return [Boolean] A boolean indicating if the event has been defined
      def self.defined_event?(event)
        @events ||= {}
        @events.key?(event)
      end

      # @!parse
      #   A hook called before each individual gem is installed
      #   Includes a Bundler::ParallelInstaller::SpecInstallation.
      #   No state, error, post_install_message will be present as nothing has installed yet
      #   GEM_BEFORE_INSTALL = "before-install"
      define :GEM_BEFORE_INSTALL, "before-install"

      # @!parse
      #   A hook called after each individual gem is installed
      #   Includes a Bundler::ParallelInstaller::SpecInstallation.
      #     - If state is failed, an error will be present.
      #     - If state is success, a post_install_message may be present.
      #   GEM_AFTER_INSTALL = "after-install"
      define :GEM_AFTER_INSTALL,  "after-install"

      # @!parse
      #   A hook called before any gems install
      #   Includes an Array of Bundler::Dependency objects
      #   GEM_BEFORE_INSTALL_ALL = "before-install-all"
      define :GEM_BEFORE_INSTALL_ALL, "before-install-all"

      # @!parse
      #   A hook called after any gems install
      #   Includes an Array of Bundler::Dependency objects
      #   GEM_AFTER_INSTALL_ALL = "after-install-all"
      define :GEM_AFTER_INSTALL_ALL,  "after-install-all"
    end
  end
end
PK}$["�x��2gems/gems/bundler-2.3.27/lib/bundler/plugin/dsl.rbnu�[���# frozen_string_literal: true

module Bundler
  module Plugin
    # Dsl to parse the Gemfile looking for plugins to install
    class DSL < Bundler::Dsl
      class PluginGemfileError < PluginError; end
      alias_method :_gem, :gem # To use for plugin installation as gem

      # So that we don't have to override all there methods to dummy ones
      # explicitly.
      # They will be handled by method_missing
      [:gemspec, :gem, :install_if, :platforms, :env].each {|m| undef_method m }

      # This lists the plugins that was added automatically and not specified by
      # the user.
      #
      # When we encounter :type attribute with a source block, we add a plugin
      # by name bundler-source-<type> to list of plugins to be installed.
      #
      # These plugins are optional and are not installed when there is conflict
      # with any other plugin.
      attr_reader :inferred_plugins

      def initialize
        super
        @sources = Plugin::SourceList.new
        @inferred_plugins = [] # The source plugins inferred from :type
      end

      def plugin(name, *args)
        _gem(name, *args)
      end

      def method_missing(name, *args)
        raise PluginGemfileError, "Undefined local variable or method `#{name}' for Gemfile" unless Bundler::Dsl.method_defined? name
      end

      def source(source, *args, &blk)
        options = args.last.is_a?(Hash) ? args.pop.dup : {}
        options = normalize_hash(options)
        return super unless options.key?("type")

        plugin_name = "bundler-source-#{options["type"]}"

        return if @dependencies.any? {|d| d.name == plugin_name }

        plugin(plugin_name)
        @inferred_plugins << plugin_name
      end
    end
  end
end
PK}$[��AA:gems/gems/bundler-2.3.27/lib/bundler/plugin/source_list.rbnu�[���# frozen_string_literal: true

module Bundler
  # SourceList object to be used while parsing the Gemfile, setting the
  # approptiate options to be used with Source classes for plugin installation
  module Plugin
    class SourceList < Bundler::SourceList
      def add_git_source(options = {})
        add_source_to_list Plugin::Installer::Git.new(options), git_sources
      end

      def add_rubygems_source(options = {})
        add_source_to_list Plugin::Installer::Rubygems.new(options), @rubygems_sources
      end

      def all_sources
        path_sources + git_sources + rubygems_sources + [metadata_source]
      end

      def default_source
        git_sources.first || global_rubygems_source
      end

      private

      def rubygems_aggregate_class
        Plugin::Installer::Rubygems
      end
    end
  end
end
PK}$[UK<�
�
8gems/gems/bundler-2.3.27/lib/bundler/plugin/installer.rbnu�[���# frozen_string_literal: true

module Bundler
  # Handles the installation of plugin in appropriate directories.
  #
  # This class is supposed to be wrapper over the existing gem installation infra
  # but currently it itself handles everything as the Source's subclasses (e.g. Source::RubyGems)
  # are heavily dependent on the Gemfile.
  module Plugin
    class Installer
      autoload :Rubygems, File.expand_path("installer/rubygems", __dir__)
      autoload :Git,      File.expand_path("installer/git", __dir__)

      def install(names, options)
        check_sources_consistency!(options)

        version = options[:version] || [">= 0"]

        if options[:git]
          install_git(names, version, options)
        elsif options[:local_git]
          install_local_git(names, version, options)
        else
          sources = options[:source] || Gem.sources
          install_rubygems(names, version, sources)
        end
      end

      # Installs the plugin from Definition object created by limited parsing of
      # Gemfile searching for plugins to be installed
      #
      # @param [Definition] definition object
      # @return [Hash] map of names to their specs they are installed with
      def install_definition(definition)
        def definition.lock(*); end
        definition.resolve_remotely!
        specs = definition.specs

        install_from_specs specs
      end

      private

      def check_sources_consistency!(options)
        if options.key?(:git) && options.key?(:local_git)
          raise InvalidOption, "Remote and local plugin git sources can't be both specified"
        end
      end

      def install_git(names, version, options)
        uri = options.delete(:git)
        options["uri"] = uri

        install_all_sources(names, version, options, options[:source])
      end

      def install_local_git(names, version, options)
        uri = options.delete(:local_git)
        options["uri"] = uri

        install_all_sources(names, version, options, options[:source])
      end

      # Installs the plugin from rubygems source and returns the path where the
      # plugin was installed
      #
      # @param [String] name of the plugin gem to search in the source
      # @param [Array] version of the gem to install
      # @param [String, Array<String>] source(s) to resolve the gem
      #
      # @return [Hash] map of names to the specs of plugins installed
      def install_rubygems(names, version, sources)
        install_all_sources(names, version, nil, sources)
      end

      def install_all_sources(names, version, git_source_options, rubygems_source)
        source_list = SourceList.new

        source_list.add_git_source(git_source_options) if git_source_options
        Array(rubygems_source).each {|remote| source_list.add_global_rubygems_remote(remote) } if rubygems_source

        deps = names.map {|name| Dependency.new name, version }

        Bundler.configure_gem_home_and_path(Plugin.root)

        definition = Definition.new(nil, deps, source_list, true)
        install_definition(definition)
      end

      # Installs the plugins and deps from the provided specs and returns map of
      # gems to their paths
      #
      # @param specs to install
      #
      # @return [Hash] map of names to the specs
      def install_from_specs(specs)
        paths = {}

        specs.each do |spec|
          spec.source.install spec

          paths[spec.name] = spec
        end

        paths
      end
    end
  end
end
PK}$[}[?n		<gems/gems/bundler-2.3.27/lib/bundler/plugin/installer/git.rbnu�[���# frozen_string_literal: true

module Bundler
  module Plugin
    class Installer
      class Git < Bundler::Source::Git
        def cache_path
          @cache_path ||= begin
            git_scope = "#{base_name}-#{uri_hash}"

            Plugin.cache.join("bundler", "git", git_scope)
          end
        end

        def install_path
          @install_path ||= begin
            git_scope = "#{base_name}-#{shortref_for_path(revision)}"

            Plugin.root.join("bundler", "gems", git_scope)
          end
        end

        def root
          Plugin.root
        end

        def generate_bin(spec, disable_extensions = false)
          # Need to find a way without code duplication
          # For now, we can ignore this
        end
      end
    end
  end
end
PK}$[zm��Agems/gems/bundler-2.3.27/lib/bundler/plugin/installer/rubygems.rbnu�[���# frozen_string_literal: true

module Bundler
  module Plugin
    class Installer
      class Rubygems < Bundler::Source::Rubygems
        private

        def requires_sudo?
          false # Will change on implementation of project level plugins
        end

        def rubygems_dir
          Plugin.root
        end

        def cache_path
          Plugin.cache
        end
      end
    end
  end
end
PK}$[.���4gems/gems/bundler-2.3.27/lib/bundler/plugin/index.rbnu�[���# frozen_string_literal: true

module Bundler
  # Manages which plugins are installed and their sources. This also is supposed to map
  # which plugin does what (currently the features are not implemented so this class is
  # now a stub class).
  module Plugin
    class Index
      class CommandConflict < PluginError
        def initialize(plugin, commands)
          msg = "Command(s) `#{commands.join("`, `")}` declared by #{plugin} are already registered."
          super msg
        end
      end

      class SourceConflict < PluginError
        def initialize(plugin, sources)
          msg = "Source(s) `#{sources.join("`, `")}` declared by #{plugin} are already registered."
          super msg
        end
      end

      attr_reader :commands

      def initialize
        @plugin_paths = {}
        @commands = {}
        @sources = {}
        @hooks = {}
        @load_paths = {}

        begin
          load_index(global_index_file, true)
        rescue GenericSystemCallError
          # no need to fail when on a read-only FS, for example
          nil
        end
        load_index(local_index_file) if SharedHelpers.in_bundle?
      end

      # This function is to be called when a new plugin is installed. This
      # function shall add the functions of the plugin to existing maps and also
      # the name to source location.
      #
      # @param [String] name of the plugin to be registered
      # @param [String] path where the plugin is installed
      # @param [Array<String>] load_paths for the plugin
      # @param [Array<String>] commands that are handled by the plugin
      # @param [Array<String>] sources that are handled by the plugin
      def register_plugin(name, path, load_paths, commands, sources, hooks)
        old_commands = @commands.dup

        common = commands & @commands.keys
        raise CommandConflict.new(name, common) unless common.empty?
        commands.each {|c| @commands[c] = name }

        common = sources & @sources.keys
        raise SourceConflict.new(name, common) unless common.empty?
        sources.each {|k| @sources[k] = name }

        hooks.each do |event|
          event_hooks = (@hooks[event] ||= []) << name
          event_hooks.uniq!
        end

        @plugin_paths[name] = path
        @load_paths[name] = load_paths
        save_index
      rescue StandardError
        @commands = old_commands
        raise
      end

      def unregister_plugin(name)
        @commands.delete_if {|_, v| v == name }
        @sources.delete_if {|_, v| v == name }
        @hooks.each do |hook, names|
          names.delete(name)
          @hooks.delete(hook) if names.empty?
        end
        @plugin_paths.delete(name)
        @load_paths.delete(name)
        save_index
      end

      # Path of default index file
      def index_file
        Plugin.root.join("index")
      end

      # Path where the global index file is stored
      def global_index_file
        Plugin.global_root.join("index")
      end

      # Path where the local index file is stored
      def local_index_file
        Plugin.local_root.join("index")
      end

      def plugin_path(name)
        Pathname.new @plugin_paths[name]
      end

      def load_paths(name)
        @load_paths[name]
      end

      # Fetch the name of plugin handling the command
      def command_plugin(command)
        @commands[command]
      end

      def installed?(name)
        @plugin_paths[name]
      end

      def installed_plugins
        @plugin_paths.keys
      end

      def plugin_commands(plugin)
        @commands.find_all {|_, n| n == plugin }.map(&:first)
      end

      def source?(source)
        @sources.key? source
      end

      def source_plugin(name)
        @sources[name]
      end

      # Returns the list of plugin names handling the passed event
      def hook_plugins(event)
        @hooks[event] || []
      end

      private

      # Reads the index file from the directory and initializes the instance
      # variables.
      #
      # It skips the sources if the second param is true
      # @param [Pathname] index file path
      # @param [Boolean] is the index file global index
      def load_index(index_file, global = false)
        SharedHelpers.filesystem_access(index_file, :read) do |index_f|
          valid_file = index_f && index_f.exist? && !index_f.size.zero?
          break unless valid_file

          data = index_f.read

          require_relative "../yaml_serializer"
          index = YAMLSerializer.load(data)

          @commands.merge!(index["commands"])
          @hooks.merge!(index["hooks"])
          @load_paths.merge!(index["load_paths"])
          @plugin_paths.merge!(index["plugin_paths"])
          @sources.merge!(index["sources"]) unless global
        end
      end

      # Should be called when any of the instance variables change. Stores the
      # instance variables in YAML format. (The instance variables are supposed
      # to be only String key value pairs)
      def save_index
        index = {
          "commands"     => @commands,
          "hooks"        => @hooks,
          "load_paths"   => @load_paths,
          "plugin_paths" => @plugin_paths,
          "sources"      => @sources,
        }

        require_relative "../yaml_serializer"
        SharedHelpers.filesystem_access(index_file) do |index_f|
          FileUtils.mkdir_p(index_f.dirname)
          File.open(index_f, "w") {|f| f.puts YAMLSerializer.dump(index) }
        end
      end
    end
  end
end
PK}$[�6�PP2gems/gems/bundler-2.3.27/lib/bundler/plugin/api.rbnu�[���# frozen_string_literal: true

module Bundler
  # This is the interfacing class represents the API that we intend to provide
  # the plugins to use.
  #
  # For plugins to be independent of the Bundler internals they shall limit their
  # interactions to methods of this class only. This will save them from breaking
  # when some internal change.
  #
  # Currently we are delegating the methods defined in Bundler class to
  # itself. So, this class acts as a buffer.
  #
  # If there is some change in the Bundler class that is incompatible to its
  # previous behavior or if otherwise desired, we can reimplement(or implement)
  # the method to preserve compatibility.
  #
  # To use this, either the class can inherit this class or use it directly.
  # For example of both types of use, refer the file `spec/plugins/command.rb`
  #
  # To use it without inheriting, you will have to create an object of this
  # to use the functions (except for declaration functions like command, source,
  # and hooks).
  module Plugin
    class API
      autoload :Source, File.expand_path("api/source", __dir__)

      # The plugins should declare that they handle a command through this helper.
      #
      # @param [String] command being handled by them
      # @param [Class] (optional) class that handles the command. If not
      #                 provided, the `self` class will be used.
      def self.command(command, cls = self)
        Plugin.add_command command, cls
      end

      # The plugins should declare that they provide a installation source
      # through this helper.
      #
      # @param [String] the source type they provide
      # @param [Class] (optional) class that handles the source. If not
      #                 provided, the `self` class will be used.
      def self.source(source, cls = self)
        cls.send :include, Bundler::Plugin::API::Source
        Plugin.add_source source, cls
      end

      def self.hook(event, &block)
        Plugin.add_hook(event, &block)
      end

      # The cache dir to be used by the plugins for storage
      #
      # @return [Pathname] path of the cache dir
      def cache_dir
        Plugin.cache.join("plugins")
      end

      # A tmp dir to be used by plugins
      # Accepts names that get concatenated as suffix
      #
      # @return [Pathname] object for the new directory created
      def tmp(*names)
        Bundler.tmp(["plugin", *names].join("-"))
      end

      def method_missing(name, *args, &blk)
        return Bundler.send(name, *args, &blk) if Bundler.respond_to?(name)

        return SharedHelpers.send(name, *args, &blk) if SharedHelpers.respond_to?(name)

        super
      end

      def respond_to_missing?(name, include_private = false)
        SharedHelpers.respond_to?(name, include_private) ||
          Bundler.respond_to?(name, include_private) || super
      end
    end
  end
end
PK}$[����.�.9gems/gems/bundler-2.3.27/lib/bundler/plugin/api/source.rbnu�[���# frozen_string_literal: true

module Bundler
  module Plugin
    class API
      # This class provides the base to build source plugins
      # All the method here are required to build a source plugin (except
      # `uri_hash`, `gem_install_dir`; they are helpers).
      #
      # Defaults for methods, where ever possible are provided which is
      # expected to work. But, all source plugins have to override
      # `fetch_gemspec_files` and `install`. Defaults are also not provided for
      # `remote!`, `cache!` and `unlock!`.
      #
      # The defaults shall work for most situations but nevertheless they can
      # be (preferably should be) overridden as per the plugins' needs safely
      # (as long as they behave as expected).
      # On overriding `initialize` you should call super first.
      #
      # If required plugin should override `hash`, `==` and `eql?` methods to be
      # able to match objects representing same sources, but may be created in
      # different situation (like form gemfile and lockfile). The default ones
      # checks only for class and uri, but elaborate source plugins may need
      # more comparisons (e.g. git checking on branch or tag).
      #
      # @!attribute [r] uri
      #   @return [String] the remote specified with `source` block in Gemfile
      #
      # @!attribute [r] options
      #   @return [String] options passed during initialization (either from
      #     lockfile or Gemfile)
      #
      # @!attribute [r] name
      #   @return [String] name that can be used to uniquely identify a source
      #
      # @!attribute [rw] dependency_names
      #   @return [Array<String>] Names of dependencies that the source should
      #     try to resolve. It is not necessary to use this list internally. This
      #     is present to be compatible with `Definition` and is used by
      #     rubygems source.
      module Source
        attr_reader :uri, :options, :name
        attr_accessor :dependency_names

        def initialize(opts)
          @options = opts
          @dependency_names = []
          @uri = opts["uri"]
          @type = opts["type"]
          @name = opts["name"] || "#{@type} at #{@uri}"
        end

        # This is used by the default `spec` method to constructs the
        # Specification objects for the gems and versions that can be installed
        # by this source plugin.
        #
        # Note: If the spec method is overridden, this function is not necessary
        #
        # @return [Array<String>] paths of the gemspec files for gems that can
        #                         be installed
        def fetch_gemspec_files
          []
        end

        # Options to be saved in the lockfile so that the source plugin is able
        # to check out same version of gem later.
        #
        # There options are passed when the source plugin is created from the
        # lock file.
        #
        # @return [Hash]
        def options_to_lock
          {}
        end

        # Install the gem specified by the spec at appropriate path.
        # `install_path` provides a sufficient default, if the source can only
        # satisfy one gem,  but is not binding.
        #
        # @return [String] post installation message (if any)
        def install(spec, opts)
          raise MalformattedPlugin, "Source plugins need to override the install method."
        end

        # It builds extensions, generates bins and installs them for the spec
        # provided.
        #
        # It depends on `spec.loaded_from` to get full_gem_path. The source
        # plugins should set that.
        #
        # It should be called in `install` after the plugin is done placing the
        # gem at correct install location.
        #
        # It also runs Gem hooks `pre_install`, `post_build` and `post_install`
        #
        # Note: Do not override if you don't know what you are doing.
        def post_install(spec, disable_exts = false)
          opts = { :env_shebang => false, :disable_extensions => disable_exts }
          installer = Bundler::Source::Path::Installer.new(spec, opts)
          installer.post_install
        end

        # A default installation path to install a single gem. If the source
        # servers multiple gems, it's not of much use and the source should one
        # of its own.
        def install_path
          @install_path ||=
            begin
              base_name = File.basename(Bundler::URI.parse(uri).normalize.path)

              gem_install_dir.join("#{base_name}-#{uri_hash[0..11]}")
            end
        end

        # Parses the gemspec files to find the specs for the gems that can be
        # satisfied by the source.
        #
        # Few important points to keep in mind:
        #   - If the gems are not installed then it shall return specs for all
        #   the gems it can satisfy
        #   - If gem is installed (that is to be detected by the plugin itself)
        #   then it shall return at least the specs that are installed.
        #   - The `loaded_from` for each of the specs shall be correct (it is
        #   used to find the load path)
        #
        # @return [Bundler::Index] index containing the specs
        def specs
          files = fetch_gemspec_files

          Bundler::Index.build do |index|
            files.each do |file|
              next unless spec = Bundler.load_gemspec(file)
              Bundler.rubygems.set_installed_by_version(spec)

              spec.source = self
              Bundler.rubygems.validate(spec)

              index << spec
            end
          end
        end

        # Set internal representation to fetch the gems/specs locally.
        #
        # When this is called, the source should try to fetch the specs and
        # install from the local system.
        def local!
        end

        # Set internal representation to fetch the gems/specs from remote.
        #
        # When this is called, the source should try to fetch the specs and
        # install from remote path.
        def remote!
        end

        # Set internal representation to fetch the gems/specs from app cache.
        #
        # When this is called, the source should try to fetch the specs and
        # install from the path provided by `app_cache_path`.
        def cached!
        end

        # This is called to update the spec and installation.
        #
        # If the source plugin is loaded from lockfile or otherwise, it shall
        # refresh the cache/specs (e.g. git sources can make a fresh clone).
        def unlock!
        end

        # Name of directory where plugin the is expected to cache the gems when
        # #cache is called.
        #
        # Also this name is matched against the directories in cache for pruning
        #
        # This is used by `app_cache_path`
        def app_cache_dirname
          base_name = File.basename(Bundler::URI.parse(uri).normalize.path)
          "#{base_name}-#{uri_hash}"
        end

        # This method is called while caching to save copy of the gems that the
        # source can resolve to path provided by `app_cache_app`so that they can
        # be reinstalled from the cache without querying the remote (i.e. an
        # alternative to remote)
        #
        # This is stored with the app and source plugins should try to provide
        # specs and install only from this cache when `cached!` is called.
        #
        # This cache is different from the internal caching that can be done
        # at sub paths of `cache_path` (from API). This can be though as caching
        # by bundler.
        def cache(spec, custom_path = nil)
          new_cache_path = app_cache_path(custom_path)

          FileUtils.rm_rf(new_cache_path)
          FileUtils.cp_r(install_path, new_cache_path)
          FileUtils.touch(app_cache_path.join(".bundlecache"))
        end

        # This shall check if two source object represent the same source.
        #
        # The comparison shall take place only on the attribute that can be
        # inferred from the options passed from Gemfile and not on attributes
        # that are used to pin down the gem to specific version (e.g. Git
        # sources should compare on branch and tag but not on commit hash)
        #
        # The sources objects are constructed from Gemfile as well as from
        # lockfile. To converge the sources, it is necessary that they match.
        #
        # The same applies for `eql?` and `hash`
        def ==(other)
          other.is_a?(self.class) && uri == other.uri
        end

        # When overriding `eql?` please preserve the behaviour as mentioned in
        # docstring for `==` method.
        alias_method :eql?, :==

        # When overriding `hash` please preserve the behaviour as mentioned in
        # docstring for `==` method, i.e. two methods equal by above comparison
        # should have same hash.
        def hash
          [self.class, uri].hash
        end

        # A helper method, not necessary if not used internally.
        def installed?
          File.directory?(install_path)
        end

        # The full path where the plugin should cache the gem so that it can be
        # installed latter.
        #
        # Note: Do not override if you don't know what you are doing.
        def app_cache_path(custom_path = nil)
          @app_cache_path ||= Bundler.app_cache(custom_path).join(app_cache_dirname)
        end

        # Used by definition.
        #
        # Note: Do not override if you don't know what you are doing.
        def unmet_deps
          specs.unmet_dependency_names
        end

        # Used by definition.
        #
        # Note: Do not override if you don't know what you are doing.
        def spec_names
          specs.spec_names
        end

        # Used by definition.
        #
        # Note: Do not override if you don't know what you are doing.
        def add_dependency_names(names)
          @dependencies |= Array(names)
        end

        # NOTE: Do not override if you don't know what you are doing.
        def can_lock?(spec)
          spec.source == self
        end

        # Generates the content to be entered into the lockfile.
        # Saves type and remote and also calls to `options_to_lock`.
        #
        # Plugin should use `options_to_lock` to save information in lockfile
        # and not override this.
        #
        # Note: Do not override if you don't know what you are doing.
        def to_lock
          out = String.new("#{LockfileParser::PLUGIN}\n")
          out << "  remote: #{@uri}\n"
          out << "  type: #{@type}\n"
          options_to_lock.each do |opt, value|
            out << "  #{opt}: #{value}\n"
          end
          out << "  specs:\n"
        end

        def to_s
          "plugin source for #{@type} with uri #{@uri}"
        end
        alias_method :identifier, :to_s

        # NOTE: Do not override if you don't know what you are doing.
        def include?(other)
          other == self
        end

        def uri_hash
          SharedHelpers.digest(:SHA1).hexdigest(uri)
        end

        # NOTE: Do not override if you don't know what you are doing.
        def gem_install_dir
          Bundler.install_path
        end

        # It is used to obtain the full_gem_path.
        #
        # spec's loaded_from path is expanded against this to get full_gem_path
        #
        # Note: Do not override if you don't know what you are doing.
        def root
          Bundler.root
        end

        # @private
        # This API on source might not be stable, and for now we expect plugins
        # to download all specs in `#specs`, so we implement the method for
        # compatibility purposes and leave it undocumented (and don't support)
        # overriding it)
        def double_check_for(*); end
      end
    end
  end
end
PK}$[<��,,:gems/gems/bundler-2.3.27/lib/bundler/settings/validator.rbnu�[���# frozen_string_literal: true

module Bundler
  class Settings
    class Validator
      class Rule
        attr_reader :description

        def initialize(keys, description, &validate)
          @keys = keys
          @description = description
          @validate = validate
        end

        def validate!(key, value, settings)
          instance_exec(key, value, settings, &@validate)
        end

        def fail!(key, value, *reasons)
          reasons.unshift @description
          raise InvalidOption, "Setting `#{key}` to #{value.inspect} failed:\n#{reasons.map {|r| " - #{r}" }.join("\n")}"
        end

        def set(settings, key, value, *reasons)
          hash_key = k(key)
          return if settings[hash_key] == value
          reasons.unshift @description
          Bundler.ui.info "Setting `#{key}` to #{value.inspect}, since #{reasons.join(", ")}"
          if value.nil?
            settings.delete(hash_key)
          else
            settings[hash_key] = value
          end
        end

        def k(key)
          Bundler.settings.key_for(key)
        end
      end

      def self.rules
        @rules ||= Hash.new {|h, k| h[k] = [] }
      end
      private_class_method :rules

      def self.rule(keys, description, &blk)
        rule = Rule.new(keys, description, &blk)
        keys.each {|k| rules[k] << rule }
      end
      private_class_method :rule

      def self.validate!(key, value, settings)
        rules_to_validate = rules[key]
        rules_to_validate.each {|rule| rule.validate!(key, value, settings) }
      end

      rule %w[path path.system], "path and path.system are mutually exclusive" do |key, value, settings|
        if key == "path" && value
          set(settings, "path.system", nil)
        elsif key == "path.system" && value
          set(settings, :path, nil)
        end
      end

      rule %w[with without], "a group cannot be in both `with` & `without` simultaneously" do |key, value, settings|
        with = settings.fetch(k(:with), "").split(":").map(&:to_sym)
        without = settings.fetch(k(:without), "").split(":").map(&:to_sym)

        other_key = key == "with" ? :without : :with
        other_setting = key == "with" ? without : with

        conflicting = with & without
        if conflicting.any?
          fail!(key, value, "`#{other_key}` is current set to #{other_setting.inspect}", "the `#{conflicting.join("`, `")}` groups conflict")
        end
      end

      rule %w[path], "relative paths are expanded relative to the current working directory" do |key, value, settings|
        next if value.nil?

        path = Pathname.new(value)
        next if !path.relative? || !Bundler.feature_flag.path_relative_to_cwd?

        path = path.expand_path

        root = begin
                 Bundler.root
               rescue GemfileNotFound
                 Pathname.pwd.expand_path
               end

        path = begin
                 path.relative_path_from(root)
               rescue ArgumentError
                 path
               end

        set(settings, key, path.to_s)
      end
    end
  end
end
PK}$[��{�+gems/gems/bundler-2.3.27/lib/bundler/env.rbnu�[���# frozen_string_literal: true

require_relative "rubygems_integration"
require_relative "source/git/git_proxy"

module Bundler
  class Env
    def self.write(io)
      io.write report
    end

    def self.report(options = {})
      print_gemfile = options.delete(:print_gemfile) { true }
      print_gemspecs = options.delete(:print_gemspecs) { true }

      out = String.new
      append_formatted_table("Environment", environment, out)
      append_formatted_table("Bundler Build Metadata", BuildMetadata.to_h, out)

      unless Bundler.settings.all.empty?
        out << "\n## Bundler settings\n\n```\n"
        Bundler.settings.all.each do |setting|
          out << setting << "\n"
          Bundler.settings.pretty_values_for(setting).each do |line|
            out << "  " << line << "\n"
          end
        end
        out << "```\n"
      end

      return out unless SharedHelpers.in_bundle?

      if print_gemfile
        gemfiles = [Bundler.default_gemfile]
        begin
          gemfiles = Bundler.definition.gemfiles
        rescue GemfileNotFound
          nil
        end

        out << "\n## Gemfile\n"
        gemfiles.each do |gemfile|
          out << "\n### #{Pathname.new(gemfile).relative_path_from(SharedHelpers.pwd)}\n\n"
          out << "```ruby\n" << read_file(gemfile).chomp << "\n```\n"
        end

        out << "\n### #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}\n\n"
        out << "```\n" << read_file(Bundler.default_lockfile).chomp << "\n```\n"
      end

      if print_gemspecs
        dsl = Dsl.new.tap {|d| d.eval_gemfile(Bundler.default_gemfile) }
        out << "\n## Gemspecs\n" unless dsl.gemspecs.empty?
        dsl.gemspecs.each do |gs|
          out << "\n### #{File.basename(gs.loaded_from)}"
          out << "\n\n```ruby\n" << read_file(gs.loaded_from).chomp << "\n```\n"
        end
      end

      out
    end

    def self.read_file(filename)
      Bundler.read_file(filename.to_s).strip
    rescue Errno::ENOENT
      "<No #{filename} found>"
    rescue RuntimeError => e
      "#{e.class}: #{e.message}"
    end

    def self.ruby_version
      str = String.new(RUBY_VERSION)
      str << "p#{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
      str << " (#{RUBY_RELEASE_DATE} revision #{RUBY_REVISION}) [#{Gem::Platform.local}]"
    end

    def self.git_version
      Bundler::Source::Git::GitProxy.new(nil, nil, nil).full_version
    rescue Bundler::Source::Git::GitNotInstalledError
      "not installed"
    end

    def self.version_of(script)
      return "not installed" unless Bundler.which(script)
      `#{script} --version`.chomp
    end

    def self.chruby_version
      return "not installed" unless Bundler.which("chruby-exec")
      `chruby-exec -- chruby --version`.
        sub(/.*^chruby: (#{Gem::Version::VERSION_PATTERN}).*/m, '\1')
    end

    def self.environment
      out = []

      out << ["Bundler", Bundler::VERSION]
      out << ["  Platforms", Gem.platforms.join(", ")]
      out << ["Ruby", ruby_version]
      out << ["  Full Path", Gem.ruby]
      out << ["  Config Dir", Pathname.new(Gem::ConfigFile::SYSTEM_WIDE_CONFIG_FILE).dirname]
      out << ["RubyGems", Gem::VERSION]
      out << ["  Gem Home", Gem.dir]
      out << ["  Gem Path", Gem.path.join(File::PATH_SEPARATOR)]
      out << ["  User Home", Gem.user_home]
      out << ["  User Path", Gem.user_dir]
      out << ["  Bin Dir", Gem.bindir]
      if defined?(OpenSSL::SSL)
        out << ["OpenSSL"]
        out << ["  Compiled", OpenSSL::OPENSSL_VERSION] if defined?(OpenSSL::OPENSSL_VERSION)
        out << ["  Loaded", OpenSSL::OPENSSL_LIBRARY_VERSION] if defined?(OpenSSL::OPENSSL_LIBRARY_VERSION)
        out << ["  Cert File", OpenSSL::X509::DEFAULT_CERT_FILE] if defined?(OpenSSL::X509::DEFAULT_CERT_FILE)
        out << ["  Cert Dir", OpenSSL::X509::DEFAULT_CERT_DIR] if defined?(OpenSSL::X509::DEFAULT_CERT_DIR)
      end
      out << ["Tools"]
      out << ["  Git", git_version]
      out << ["  RVM", ENV.fetch("rvm_version") { version_of("rvm") }]
      out << ["  rbenv", version_of("rbenv")]
      out << ["  chruby", chruby_version]

      %w[rubygems-bundler open_gem].each do |name|
        specs = Bundler.rubygems.find_name(name)
        out << ["  #{name}", "(#{specs.map(&:version).join(",")})"] unless specs.empty?
      end
      if (exe = caller.last.split(":").first) && exe =~ %r{(exe|bin)/bundler?\z}
        shebang = File.read(exe).lines.first
        shebang.sub!(/^#!\s*/, "")
        unless shebang.start_with?(Gem.ruby, "/usr/bin/env ruby")
          out << ["Gem.ruby", Gem.ruby]
          out << ["bundle #!", shebang]
        end
      end

      out
    end

    def self.append_formatted_table(title, pairs, out)
      return if pairs.empty?
      out << "\n" unless out.empty?
      out << "## #{title}\n\n```\n"
      ljust = pairs.map {|k, _v| k.to_s.length }.max
      pairs.each do |k, v|
        out << "#{k.to_s.ljust(ljust)}  #{v}\n"
      end
      out << "```\n"
    end

    private_class_method :read_file, :ruby_version, :git_version, :append_formatted_table, :version_of, :chruby_version
  end
end
PK}$[�W	�?�?<gems/gems/bundler-2.3.27/lib/bundler/rubygems_integration.rbnu�[���# frozen_string_literal: true

require "rubygems" unless defined?(Gem)

module Bundler
  class RubygemsIntegration
    if defined?(Gem::Ext::Builder::CHDIR_MONITOR)
      EXT_LOCK = Gem::Ext::Builder::CHDIR_MONITOR
    else
      require "monitor"

      EXT_LOCK = Monitor.new
    end

    def initialize
      @replaced_methods = {}
      backport_ext_builder_monitor
    end

    def version
      @version ||= Gem.rubygems_version
    end

    def provides?(req_str)
      Gem::Requirement.new(req_str).satisfied_by?(version)
    end

    def supports_bundler_trampolining?
      provides?(">= 3.3.0.a")
    end

    def build_args
      require "rubygems/command"
      Gem::Command.build_args
    end

    def build_args=(args)
      require "rubygems/command"
      Gem::Command.build_args = args
    end

    def loaded_specs(name)
      Gem.loaded_specs[name]
    end

    def add_to_load_path(paths)
      return Gem.add_to_load_path(*paths) if Gem.respond_to?(:add_to_load_path)

      if insert_index = Gem.load_path_insert_index
        # Gem directories must come after -I and ENV['RUBYLIB']
        $LOAD_PATH.insert(insert_index, *paths)
      else
        # We are probably testing in core, -I and RUBYLIB don't apply
        $LOAD_PATH.unshift(*paths)
      end
    end

    def mark_loaded(spec)
      if spec.respond_to?(:activated=)
        current = Gem.loaded_specs[spec.name]
        current.activated = false if current
        spec.activated = true
      end
      Gem.loaded_specs[spec.name] = spec
    end

    def validate(spec)
      Bundler.ui.silence { spec.validate(false) }
    rescue Gem::InvalidSpecificationException => e
      error_message = "The gemspec at #{spec.loaded_from} is not valid. Please fix this gemspec.\n" \
        "The validation error was '#{e.message}'\n"
      raise Gem::InvalidSpecificationException.new(error_message)
    rescue Errno::ENOENT
      nil
    end

    def set_installed_by_version(spec, installed_by_version = Gem::VERSION)
      return unless spec.respond_to?(:installed_by_version=)
      spec.installed_by_version = Gem::Version.create(installed_by_version)
    end

    def spec_missing_extensions?(spec, default = true)
      return spec.missing_extensions? if spec.respond_to?(:missing_extensions?)

      return false if spec.default_gem?
      return false if spec.extensions.empty?

      default
    end

    def spec_matches_for_glob(spec, glob)
      return spec.matches_for_glob(glob) if spec.respond_to?(:matches_for_glob)

      spec.load_paths.map do |lp|
        Dir["#{lp}/#{glob}#{suffix_pattern}"]
      end.flatten(1)
    end

    def stub_set_spec(stub, spec)
      stub.instance_variable_set(:@spec, spec)
    end

    def path(obj)
      obj.to_s
    end

    def ruby_engine
      Gem.ruby_engine
    end

    def read_binary(path)
      Gem.read_binary(path)
    end

    def inflate(obj)
      Gem::Util.inflate(obj)
    end

    def correct_for_windows_path(path)
      if Gem::Util.respond_to?(:correct_for_windows_path)
        Gem::Util.correct_for_windows_path(path)
      elsif path[0].chr == "/" && path[1].chr =~ /[a-z]/i && path[2].chr == ":"
        path[1..-1]
      else
        path
      end
    end

    def gem_dir
      Gem.dir
    end

    def gem_bindir
      Gem.bindir
    end

    def user_home
      Gem.user_home
    end

    def gem_path
      Gem.path
    end

    def reset
      Gem::Specification.reset
    end

    def post_reset_hooks
      Gem.post_reset_hooks
    end

    def suffix_pattern
      Gem.suffix_pattern
    end

    def gem_cache
      gem_path.map {|p| File.expand_path("cache", p) }
    end

    def spec_cache_dirs
      @spec_cache_dirs ||= begin
        dirs = gem_path.map {|dir| File.join(dir, "specifications") }
        dirs << Gem.spec_cache_dir if Gem.respond_to?(:spec_cache_dir) # Not in RubyGems 2.0.3 or earlier
        dirs.uniq.select {|dir| File.directory? dir }
      end
    end

    def marshal_spec_dir
      Gem::MARSHAL_SPEC_DIR
    end

    def clear_paths
      Gem.clear_paths
    end

    def bin_path(gem, bin, ver)
      Gem.bin_path(gem, bin, ver)
    end

    def loaded_gem_paths
      loaded_gem_paths = Gem.loaded_specs.map {|_, s| s.full_require_paths }
      loaded_gem_paths.flatten
    end

    def load_plugins
      Gem.load_plugins if Gem.respond_to?(:load_plugins)
    end

    def load_plugin_files(files)
      Gem.load_plugin_files(files) if Gem.respond_to?(:load_plugin_files)
    end

    def load_env_plugins
      Gem.load_env_plugins if Gem.respond_to?(:load_env_plugins)
    end

    def ui=(obj)
      Gem::DefaultUserInteraction.ui = obj
    end

    def ext_lock
      EXT_LOCK
    end

    def spec_from_gem(path)
      require "rubygems/package"
      Gem::Package.new(path).spec
    end

    def build_gem(gem_dir, spec)
      build(spec)
    end

    def security_policy_keys
      %w[High Medium Low AlmostNo No].map {|level| "#{level}Security" }
    end

    def security_policies
      @security_policies ||= begin
        require "rubygems/security"
        Gem::Security::Policies
      rescue LoadError, NameError
        {}
      end
    end

    def reverse_rubygems_kernel_mixin
      # Disable rubygems' gem activation system
      kernel = (class << ::Kernel; self; end)
      [kernel, ::Kernel].each do |k|
        if k.private_method_defined?(:gem_original_require)
          redefine_method(k, :require, k.instance_method(:gem_original_require))
        end
      end
    end

    def replace_gem(specs, specs_by_name)
      reverse_rubygems_kernel_mixin

      executables = nil

      kernel = (class << ::Kernel; self; end)
      [kernel, ::Kernel].each do |kernel_class|
        redefine_method(kernel_class, :gem) do |dep, *reqs|
          if executables && executables.include?(File.basename(caller.first.split(":").first))
            break
          end

          reqs.pop if reqs.last.is_a?(Hash)

          unless dep.respond_to?(:name) && dep.respond_to?(:requirement)
            dep = Gem::Dependency.new(dep, reqs)
          end

          if spec = specs_by_name[dep.name]
            return true if dep.matches_spec?(spec)
          end

          message = if spec.nil?
            target_file = begin
                            Bundler.default_gemfile.basename
                          rescue GemfileNotFound
                            "inline Gemfile"
                          end
            "#{dep.name} is not part of the bundle." \
            " Add it to your #{target_file}."
          else
            "can't activate #{dep}, already activated #{spec.full_name}. " \
            "Make sure all dependencies are added to Gemfile."
          end

          e = Gem::LoadError.new(message)
          e.name = dep.name
          if e.respond_to?(:requirement=)
            e.requirement = dep.requirement
          elsif e.respond_to?(:version_requirement=)
            e.version_requirement = dep.requirement
          end
          raise e
        end

        # backwards compatibility shim, see https://github.com/rubygems/bundler/issues/5102
        kernel_class.send(:public, :gem) if Bundler.feature_flag.setup_makes_kernel_gem_public?
      end
    end

    # Used to make bin stubs that are not created by bundler work
    # under bundler. The new Gem.bin_path only considers gems in
    # +specs+
    def replace_bin_path(specs_by_name)
      gem_class = (class << Gem; self; end)

      redefine_method(gem_class, :find_spec_for_exe) do |gem_name, *args|
        exec_name = args.first
        raise ArgumentError, "you must supply exec_name" unless exec_name

        spec_with_name = specs_by_name[gem_name]
        matching_specs_by_exec_name = specs_by_name.values.select {|s| s.executables.include?(exec_name) }
        spec = matching_specs_by_exec_name.delete(spec_with_name)

        unless spec || !matching_specs_by_exec_name.empty?
          message = "can't find executable #{exec_name} for gem #{gem_name}"
          if spec_with_name.nil?
            message += ". #{gem_name} is not currently included in the bundle, " \
                       "perhaps you meant to add it to your #{Bundler.default_gemfile.basename}?"
          end
          raise Gem::Exception, message
        end

        unless spec
          spec = matching_specs_by_exec_name.shift
          warn \
            "Bundler is using a binstub that was created for a different gem (#{spec.name}).\n" \
            "You should run `bundle binstub #{gem_name}` " \
            "to work around a system/bundle conflict."
        end

        unless matching_specs_by_exec_name.empty?
          conflicting_names = matching_specs_by_exec_name.map(&:name).join(", ")
          warn \
            "The `#{exec_name}` executable in the `#{spec.name}` gem is being loaded, but it's also present in other gems (#{conflicting_names}).\n" \
            "If you meant to run the executable for another gem, make sure you use a project specific binstub (`bundle binstub <gem_name>`).\n" \
            "If you plan to use multiple conflicting executables, generate binstubs for them and disambiguate their names."
        end

        spec
      end

      redefine_method(gem_class, :activate_bin_path) do |name, *args|
        exec_name = args.first
        return ENV["BUNDLE_BIN_PATH"] if exec_name == "bundle"

        # Copy of Rubygems activate_bin_path impl
        requirement = args.last
        spec = find_spec_for_exe name, exec_name, [requirement]

        gem_bin = File.join(spec.full_gem_path, spec.bindir, exec_name)
        gem_from_path_bin = File.join(File.dirname(spec.loaded_from), spec.bindir, exec_name)
        File.exist?(gem_bin) ? gem_bin : gem_from_path_bin
      end

      redefine_method(gem_class, :bin_path) do |name, *args|
        exec_name = args.first
        return ENV["BUNDLE_BIN_PATH"] if exec_name == "bundle"

        spec = find_spec_for_exe(name, *args)
        exec_name ||= spec.default_executable

        gem_bin = File.join(spec.full_gem_path, spec.bindir, exec_name)
        gem_from_path_bin = File.join(File.dirname(spec.loaded_from), spec.bindir, exec_name)
        File.exist?(gem_bin) ? gem_bin : gem_from_path_bin
      end
    end

    # Replace or hook into RubyGems to provide a bundlerized view
    # of the world.
    def replace_entrypoints(specs)
      specs_by_name = add_default_gems_to(specs)

      replace_gem(specs, specs_by_name)
      stub_rubygems(specs)
      replace_bin_path(specs_by_name)

      Gem.clear_paths
    end

    # Add default gems not already present in specs, and return them as a hash.
    def add_default_gems_to(specs)
      specs_by_name = specs.reduce({}) do |h, s|
        h[s.name] = s
        h
      end

      Bundler.rubygems.default_stubs.each do |stub|
        default_spec = stub.to_spec
        default_spec_name = default_spec.name
        next if specs_by_name.key?(default_spec_name)

        specs << default_spec
        specs_by_name[default_spec_name] = default_spec
      end

      specs_by_name
    end

    def undo_replacements
      @replaced_methods.each do |(sym, klass), method|
        redefine_method(klass, sym, method)
      end
      if Binding.public_method_defined?(:source_location)
        post_reset_hooks.reject! {|proc| proc.binding.source_location[0] == __FILE__ }
      else
        post_reset_hooks.reject! {|proc| proc.binding.eval("__FILE__") == __FILE__ }
      end
      @replaced_methods.clear
    end

    def redefine_method(klass, method, unbound_method = nil, &block)
      visibility = method_visibility(klass, method)
      begin
        if (instance_method = klass.instance_method(method)) && method != :initialize
          # doing this to ensure we also get private methods
          klass.send(:remove_method, method)
        end
      rescue NameError
        # method isn't defined
        nil
      end
      @replaced_methods[[method, klass]] = instance_method
      if unbound_method
        klass.send(:define_method, method, unbound_method)
        klass.send(visibility, method)
      elsif block
        klass.send(:define_method, method, &block)
        klass.send(visibility, method)
      end
    end

    def method_visibility(klass, method)
      if klass.private_method_defined?(method)
        :private
      elsif klass.protected_method_defined?(method)
        :protected
      else
        :public
      end
    end

    def stub_rubygems(specs)
      Gem::Specification.all = specs

      Gem.post_reset do
        Gem::Specification.all = specs
      end

      redefine_method((class << Gem; self; end), :finish_resolve) do |*|
        []
      end
    end

    def plain_specs
      Gem::Specification._all
    end

    def plain_specs=(specs)
      Gem::Specification.all = specs
    end

    def fetch_specs(remote, name)
      require "rubygems/remote_fetcher"
      path = remote.uri.to_s + "#{name}.#{Gem.marshal_version}.gz"
      fetcher = gem_remote_fetcher
      fetcher.headers = { "X-Gemfile-Source" => remote.original_uri.to_s } if remote.original_uri
      string = fetcher.fetch_path(path)
      Bundler.load_marshal(string)
    rescue Gem::RemoteFetcher::FetchError
      # it's okay for prerelease to fail
      raise unless name == "prerelease_specs"
    end

    def fetch_all_remote_specs(remote)
      specs = fetch_specs(remote, "specs")
      pres = fetch_specs(remote, "prerelease_specs") || []

      specs.concat(pres)
    end

    def download_gem(spec, uri, cache_dir)
      require "rubygems/remote_fetcher"
      uri = Bundler.settings.mirror_for(uri)
      fetcher = gem_remote_fetcher
      fetcher.headers = { "X-Gemfile-Source" => spec.remote.original_uri.to_s } if spec.remote.original_uri
      Bundler::Retry.new("download gem from #{uri}").attempts do
        gem_file_name = spec.file_name
        local_gem_path = File.join cache_dir, gem_file_name
        return if File.exist? local_gem_path

        begin
          remote_gem_path = uri + "gems/#{gem_file_name}"
          remote_gem_path = remote_gem_path.to_s if provides?("< 3.2.0.rc.1")

          SharedHelpers.filesystem_access(local_gem_path) do
            fetcher.cache_update_path remote_gem_path, local_gem_path
          end
        rescue Gem::RemoteFetcher::FetchError
          raise if spec.original_platform == spec.platform

          original_gem_file_name = "#{spec.original_name}.gem"
          raise if gem_file_name == original_gem_file_name

          gem_file_name = original_gem_file_name
          retry
        end
      end
    rescue Gem::RemoteFetcher::FetchError => e
      raise Bundler::HTTPError, "Could not download gem from #{uri} due to underlying error <#{e.message}>"
    end

    def gem_remote_fetcher
      require "rubygems/remote_fetcher"
      proxy = Gem.configuration[:http_proxy]
      Gem::RemoteFetcher.new(proxy)
    end

    def build(spec, skip_validation = false)
      require "rubygems/package"
      Gem::Package.build(spec, skip_validation)
    end

    def repository_subdirectories
      Gem::REPOSITORY_SUBDIRECTORIES
    end

    def path_separator
      Gem.path_separator
    end

    def all_specs
      Gem::Specification.stubs.map do |stub|
        StubSpecification.from_stub(stub)
      end
    end

    def backport_ext_builder_monitor
      # So we can avoid requiring "rubygems/ext" in its entirety
      Gem.module_eval <<-RUBY, __FILE__, __LINE__ + 1
        module Ext
        end
      RUBY

      require "rubygems/ext/builder"

      Gem::Ext::Builder.class_eval do
        unless const_defined?(:CHDIR_MONITOR)
          const_set(:CHDIR_MONITOR, EXT_LOCK)
        end

        remove_const(:CHDIR_MUTEX) if const_defined?(:CHDIR_MUTEX)
        const_set(:CHDIR_MUTEX, const_get(:CHDIR_MONITOR))
      end
    end

    def find_bundler(version)
      find_name("bundler").find {|s| s.version.to_s == version }
    end

    def find_name(name)
      Gem::Specification.stubs_for(name).map(&:to_spec)
    end

    if Gem::Specification.respond_to?(:default_stubs)
      def default_stubs
        Gem::Specification.default_stubs("*.gemspec")
      end
    else
      def default_stubs
        Gem::Specification.send(:default_stubs, "*.gemspec")
      end
    end
  end

  def self.rubygems
    @rubygems ||= RubygemsIntegration.new
  end
end
PK}$[\�����,gems/gems/bundler-2.3.27/lib/bundler/vlad.rbnu�[���# frozen_string_literal: true

require_relative "shared_helpers"
Bundler::SharedHelpers.major_deprecation 2,
  "The Bundler task for Vlad"

# Vlad task for Bundler.
#
# Add "require 'bundler/vlad'" in your Vlad deploy.rb, and
# include the vlad:bundle:install task in your vlad:deploy task.
require_relative "deployment"

include Rake::DSL if defined? Rake::DSL

namespace :vlad do
  Bundler::Deployment.define_task(Rake::RemoteTask, :remote_task, :roles => :app)
end
PK}$[�u:����+gems/gems/bundler-2.3.27/lib/bundler/cli.rbnu�[���# frozen_string_literal: true

require_relative "vendored_thor"

module Bundler
  class CLI < Thor
    require_relative "cli/common"

    package_name "Bundler"

    AUTO_INSTALL_CMDS = %w[show binstubs outdated exec open console licenses clean].freeze
    PARSEABLE_COMMANDS = %w[check config help exec platform show version].freeze

    COMMAND_ALIASES = {
      "check" => "c",
      "install" => "i",
      "plugin" => "",
      "list" => "ls",
      "exec" => ["e", "ex", "exe"],
      "cache" => ["package", "pack"],
      "version" => ["-v", "--version"],
    }.freeze

    def self.start(*)
      super
    ensure
      Bundler::SharedHelpers.print_major_deprecations!
    end

    def self.dispatch(*)
      super do |i|
        i.send(:print_command)
        i.send(:warn_on_outdated_bundler)
      end
    end

    def self.all_aliases
      @all_aliases ||= begin
                         command_aliases = {}

                         COMMAND_ALIASES.each do |name, aliases|
                           Array(aliases).each do |one_alias|
                             command_aliases[one_alias] = name
                           end
                         end

                         command_aliases
                       end
    end

    def self.aliases_for(command_name)
      COMMAND_ALIASES.select {|k, _| k == command_name }.invert
    end

    def initialize(*args)
      super

      custom_gemfile = options[:gemfile] || Bundler.settings[:gemfile]
      if custom_gemfile && !custom_gemfile.empty?
        Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", File.expand_path(custom_gemfile)
        Bundler.reset_settings_and_root!
      end

      Bundler.self_manager.restart_with_locked_bundler_if_needed

      Bundler.settings.set_command_option_if_given :retry, options[:retry]

      current_cmd = args.last[:current_command].name
      auto_install if AUTO_INSTALL_CMDS.include?(current_cmd)
    rescue UnknownArgumentError => e
      raise InvalidOption, e.message
    ensure
      self.options ||= {}
      unprinted_warnings = Bundler.ui.unprinted_warnings
      Bundler.ui = UI::Shell.new(options)
      Bundler.ui.level = "debug" if options["verbose"]
      unprinted_warnings.each {|w| Bundler.ui.warn(w) }
    end

    check_unknown_options!(:except => [:config, :exec])
    stop_on_unknown_option! :exec

    desc "cli_help", "Prints a summary of bundler commands", :hide => true
    def cli_help
      version
      Bundler.ui.info "\n"

      primary_commands = ["install", "update", "cache", "exec", "config", "help"]

      list = self.class.printable_commands(true)
      by_name = list.group_by {|name, _message| name.match(/^bundle (\w+)/)[1] }
      utilities = by_name.keys.sort - primary_commands
      primary_commands.map! {|name| (by_name[name] || raise("no primary command #{name}")).first }
      utilities.map! {|name| by_name[name].first }

      shell.say "Bundler commands:\n\n"

      shell.say "  Primary commands:\n"
      shell.print_table(primary_commands, :indent => 4, :truncate => true)
      shell.say
      shell.say "  Utilities:\n"
      shell.print_table(utilities, :indent => 4, :truncate => true)
      shell.say
      self.class.send(:class_options_help, shell)
    end
    default_task(Bundler.feature_flag.default_cli_command)

    class_option "no-color", :type => :boolean, :desc => "Disable colorization in output"
    class_option "retry",    :type => :numeric, :aliases => "-r", :banner => "NUM",
                             :desc => "Specify the number of times you wish to attempt network commands"
    class_option "verbose", :type => :boolean, :desc => "Enable verbose output mode", :aliases => "-V"

    def help(cli = nil)
      case cli
      when "gemfile" then command = "gemfile"
      when nil       then command = "bundle"
      else command = "bundle-#{cli}"
      end

      man_path = File.expand_path("man", __dir__)
      man_pages = Hash[Dir.glob(File.join(man_path, "**", "*")).grep(/.*\.\d*\Z/).collect do |f|
        [File.basename(f, ".*"), f]
      end]

      if man_pages.include?(command)
        man_page = man_pages[command]
        if Bundler.which("man") && man_path !~ %r{^file:/.+!/META-INF/jruby.home/.+}
          Kernel.exec "man #{man_page}"
        else
          puts File.read("#{man_path}/#{File.basename(man_page)}.ronn")
        end
      elsif command_path = Bundler.which("bundler-#{cli}")
        Kernel.exec(command_path, "--help")
      else
        super
      end
    end

    def self.handle_no_command_error(command, has_namespace = $thor_runner)
      if Bundler.feature_flag.plugins? && Bundler::Plugin.command?(command)
        return Bundler::Plugin.exec_command(command, ARGV[1..-1])
      end

      return super unless command_path = Bundler.which("bundler-#{command}")

      Kernel.exec(command_path, *ARGV[1..-1])
    end

    desc "init [OPTIONS]", "Generates a Gemfile into the current working directory"
    long_desc <<-D
      Init generates a default Gemfile in the current working directory. When adding a
      Gemfile to a gem with a gemspec, the --gemspec option will automatically add each
      dependency listed in the gemspec file to the newly created Gemfile.
    D
    method_option "gemspec", :type => :string, :banner => "Use the specified .gemspec to create the Gemfile"
    def init
      require_relative "cli/init"
      Init.new(options.dup).run
    end

    desc "check [OPTIONS]", "Checks if the dependencies listed in Gemfile are satisfied by currently installed gems"
    long_desc <<-D
      Check searches the local machine for each of the gems requested in the Gemfile. If
      all gems are found, Bundler prints a success message and exits with a status of 0.
      If not, the first missing gem is listed and Bundler exits status 1.
    D
    method_option "dry-run", :type => :boolean, :default => false, :banner =>
      "Lock the Gemfile"
    method_option "gemfile", :type => :string, :banner =>
      "Use the specified gemfile instead of Gemfile"
    method_option "path", :type => :string, :banner =>
      "Specify a different path than the system default ($BUNDLE_PATH or $GEM_HOME).#{" Bundler will remember this value for future installs on this machine" unless Bundler.feature_flag.forget_cli_options?}"
    def check
      remembered_flag_deprecation("path")

      require_relative "cli/check"
      Check.new(options).run
    end

    map aliases_for("check")

    desc "remove [GEM [GEM ...]]", "Removes gems from the Gemfile"
    long_desc <<-D
      Removes the given gems from the Gemfile while ensuring that the resulting Gemfile is still valid. If the gem is not found, Bundler prints a error message and if gem could not be removed due to any reason Bundler will display a warning.
    D
    method_option "install", :type => :boolean, :banner =>
      "Runs 'bundle install' after removing the gems from the Gemfile"
    def remove(*gems)
      SharedHelpers.major_deprecation(2, "The `--install` flag has been deprecated. `bundle install` is triggered by default.") if ARGV.include?("--install")
      require_relative "cli/remove"
      Remove.new(gems, options).run
    end

    desc "install [OPTIONS]", "Install the current environment to the system"
    long_desc <<-D
      Install will install all of the gems in the current bundle, making them available
      for use. In a freshly checked out repository, this command will give you the same
      gem versions as the last person who updated the Gemfile and ran `bundle update`.

      Passing [DIR] to install (e.g. vendor) will cause the unpacked gems to be installed
      into the [DIR] directory rather than into system gems.

      If the bundle has already been installed, bundler will tell you so and then exit.
    D
    method_option "binstubs", :type => :string, :lazy_default => "bin", :banner =>
      "Generate bin stubs for bundled gems to ./bin"
    method_option "clean", :type => :boolean, :banner =>
      "Run bundle clean automatically after install"
    method_option "deployment", :type => :boolean, :banner =>
      "Install using defaults tuned for deployment environments"
    method_option "frozen", :type => :boolean, :banner =>
      "Do not allow the Gemfile.lock to be updated after this install"
    method_option "full-index", :type => :boolean, :banner =>
      "Fall back to using the single-file index of all gems"
    method_option "gemfile", :type => :string, :banner =>
      "Use the specified gemfile instead of Gemfile"
    method_option "jobs", :aliases => "-j", :type => :numeric, :banner =>
      "Specify the number of jobs to run in parallel"
    method_option "local", :type => :boolean, :banner =>
      "Do not attempt to fetch gems remotely and use the gem cache instead"
    method_option "prefer-local", :type => :boolean, :banner =>
      "Only attempt to fetch gems remotely if not present locally, even if newer versions are available remotely"
    method_option "no-cache", :type => :boolean, :banner =>
      "Don't update the existing gem cache."
    method_option "redownload", :type => :boolean, :aliases => "--force", :banner =>
      "Force downloading every gem."
    method_option "no-prune", :type => :boolean, :banner =>
      "Don't remove stale gems from the cache."
    method_option "path", :type => :string, :banner =>
      "Specify a different path than the system default ($BUNDLE_PATH or $GEM_HOME).#{" Bundler will remember this value for future installs on this machine" unless Bundler.feature_flag.forget_cli_options?}"
    method_option "quiet", :type => :boolean, :banner =>
      "Only output warnings and errors."
    method_option "shebang", :type => :string, :banner =>
      "Specify a different shebang executable name than the default (usually 'ruby')"
    method_option "standalone", :type => :array, :lazy_default => [], :banner =>
      "Make a bundle that can work without the Bundler runtime"
    method_option "system", :type => :boolean, :banner =>
      "Install to the system location ($BUNDLE_PATH or $GEM_HOME) even if the bundle was previously installed somewhere else for this application"
    method_option "trust-policy", :alias => "P", :type => :string, :banner =>
      "Gem trust policy (like gem install -P). Must be one of " +
      Bundler.rubygems.security_policy_keys.join("|")
    method_option "without", :type => :array, :banner =>
      "Exclude gems that are part of the specified named group."
    method_option "with", :type => :array, :banner =>
      "Include gems that are part of the specified named group."
    def install
      SharedHelpers.major_deprecation(2, "The `--force` option has been renamed to `--redownload`") if ARGV.include?("--force")

      %w[clean deployment frozen no-prune path shebang system without with].each do |option|
        remembered_flag_deprecation(option)
      end

      remembered_negative_flag_deprecation("no-deployment")

      require_relative "cli/install"
      Bundler.settings.temporary(:no_install => false) do
        Install.new(options.dup).run
      end
    end

    map aliases_for("install")

    desc "update [OPTIONS]", "Update the current environment"
    long_desc <<-D
      Update will install the newest versions of the gems listed in the Gemfile. Use
      update when you have changed the Gemfile, or if you want to get the newest
      possible versions of the gems in the bundle.
    D
    method_option "full-index", :type => :boolean, :banner =>
      "Fall back to using the single-file index of all gems"
    method_option "gemfile", :type => :string, :banner =>
      "Use the specified gemfile instead of Gemfile"
    method_option "group", :aliases => "-g", :type => :array, :banner =>
      "Update a specific group"
    method_option "jobs", :aliases => "-j", :type => :numeric, :banner =>
      "Specify the number of jobs to run in parallel"
    method_option "local", :type => :boolean, :banner =>
      "Do not attempt to fetch gems remotely and use the gem cache instead"
    method_option "quiet", :type => :boolean, :banner =>
      "Only output warnings and errors."
    method_option "source", :type => :array, :banner =>
      "Update a specific source (and all gems associated with it)"
    method_option "redownload", :type => :boolean, :aliases => "--force", :banner =>
      "Force downloading every gem."
    method_option "ruby", :type => :boolean, :banner =>
      "Update ruby specified in Gemfile.lock"
    method_option "bundler", :type => :string, :lazy_default => "> 0.a", :banner =>
      "Update the locked version of bundler"
    method_option "patch", :type => :boolean, :banner =>
      "Prefer updating only to next patch version"
    method_option "minor", :type => :boolean, :banner =>
      "Prefer updating only to next minor version"
    method_option "major", :type => :boolean, :banner =>
      "Prefer updating to next major version (default)"
    method_option "strict", :type => :boolean, :banner =>
      "Do not allow any gem to be updated past latest --patch | --minor | --major"
    method_option "conservative", :type => :boolean, :banner =>
      "Use bundle install conservative update behavior and do not allow shared dependencies to be updated."
    method_option "all", :type => :boolean, :banner =>
      "Update everything."
    def update(*gems)
      SharedHelpers.major_deprecation(2, "The `--force` option has been renamed to `--redownload`") if ARGV.include?("--force")
      require_relative "cli/update"
      Bundler.settings.temporary(:no_install => false) do
        Update.new(options, gems).run
      end
    end

    desc "show GEM [OPTIONS]", "Shows all gems that are part of the bundle, or the path to a given gem"
    long_desc <<-D
      Show lists the names and versions of all gems that are required by your Gemfile.
      Calling show with [GEM] will list the exact location of that gem on your machine.
    D
    method_option "paths", :type => :boolean,
                           :banner => "List the paths of all gems that are required by your Gemfile."
    method_option "outdated", :type => :boolean,
                              :banner => "Show verbose output including whether gems are outdated."
    def show(gem_name = nil)
      SharedHelpers.major_deprecation(2, "the `--outdated` flag to `bundle show` was undocumented and will be removed without replacement") if ARGV.include?("--outdated")
      require_relative "cli/show"
      Show.new(options, gem_name).run
    end

    desc "list", "List all gems in the bundle"
    method_option "name-only", :type => :boolean, :banner => "print only the gem names"
    method_option "only-group", :type => :array, :default => [], :banner => "print gems from a given set of groups"
    method_option "without-group", :type => :array, :default => [], :banner => "print all gems except from a given set of groups"
    method_option "paths", :type => :boolean, :banner => "print the path to each gem in the bundle"
    def list
      require_relative "cli/list"
      List.new(options).run
    end

    map aliases_for("list")

    desc "info GEM [OPTIONS]", "Show information for the given gem"
    method_option "path", :type => :boolean, :banner => "Print full path to gem"
    method_option "version", :type => :boolean, :banner => "Print gem version"
    def info(gem_name)
      require_relative "cli/info"
      Info.new(options, gem_name).run
    end

    desc "binstubs GEM [OPTIONS]", "Install the binstubs of the listed gem"
    long_desc <<-D
      Generate binstubs for executables in [GEM]. Binstubs are put into bin,
      or the --binstubs directory if one has been set. Calling binstubs with [GEM [GEM]]
      will create binstubs for all given gems.
    D
    method_option "force", :type => :boolean, :default => false, :banner =>
      "Overwrite existing binstubs if they exist"
    method_option "path", :type => :string, :lazy_default => "bin", :banner =>
      "Binstub destination directory (default bin)"
    method_option "shebang", :type => :string, :banner =>
      "Specify a different shebang executable name than the default (usually 'ruby')"
    method_option "standalone", :type => :boolean, :banner =>
      "Make binstubs that can work without the Bundler runtime"
    method_option "all", :type => :boolean, :banner =>
      "Install binstubs for all gems"
    method_option "all-platforms", :type => :boolean, :default => false, :banner =>
      "Install binstubs for all platforms"
    def binstubs(*gems)
      require_relative "cli/binstubs"
      Binstubs.new(options, gems).run
    end

    desc "add GEM VERSION", "Add gem to Gemfile and run bundle install"
    long_desc <<-D
      Adds the specified gem to Gemfile (if valid) and run 'bundle install' in one step.
    D
    method_option "version", :aliases => "-v", :type => :string
    method_option "group", :aliases => "-g", :type => :string
    method_option "source", :aliases => "-s", :type => :string
    method_option "require", :aliases => "-r", :type => :string, :banner => "Adds require path to gem. Provide false, or a path as a string."
    method_option "path", :type => :string
    method_option "git", :type => :string
    method_option "github", :type => :string
    method_option "branch", :type => :string
    method_option "ref", :type => :string
    method_option "skip-install", :type => :boolean, :banner =>
      "Adds gem to the Gemfile but does not install it"
    method_option "optimistic", :type => :boolean, :banner => "Adds optimistic declaration of version to gem"
    method_option "strict", :type => :boolean, :banner => "Adds strict declaration of version to gem"
    def add(*gems)
      require_relative "cli/add"
      Add.new(options.dup, gems).run
    end

    desc "outdated GEM [OPTIONS]", "List installed gems with newer versions available"
    long_desc <<-D
      Outdated lists the names and versions of gems that have a newer version available
      in the given source. Calling outdated with [GEM [GEM]] will only check for newer
      versions of the given gems. Prerelease gems are ignored by default. If your gems
      are up to date, Bundler will exit with a status of 0. Otherwise, it will exit 1.

      For more information on patch level options (--major, --minor, --patch,
      --strict) see documentation on the same options on the update command.
    D
    method_option "group", :type => :string, :banner => "List gems from a specific group"
    method_option "groups", :type => :boolean, :banner => "List gems organized by groups"
    method_option "local", :type => :boolean, :banner =>
      "Do not attempt to fetch gems remotely and use the gem cache instead"
    method_option "pre", :type => :boolean, :banner => "Check for newer pre-release gems"
    method_option "source", :type => :array, :banner => "Check against a specific source"
    method_option "filter-strict", :type => :boolean, :aliases => "--strict", :banner =>
      "Only list newer versions allowed by your Gemfile requirements"
    method_option "update-strict", :type => :boolean, :banner =>
      "Strict conservative resolution, do not allow any gem to be updated past latest --patch | --minor | --major"
    method_option "minor", :type => :boolean, :banner => "Prefer updating only to next minor version"
    method_option "major", :type => :boolean, :banner => "Prefer updating to next major version (default)"
    method_option "patch", :type => :boolean, :banner => "Prefer updating only to next patch version"
    method_option "filter-major", :type => :boolean, :banner => "Only list major newer versions"
    method_option "filter-minor", :type => :boolean, :banner => "Only list minor newer versions"
    method_option "filter-patch", :type => :boolean, :banner => "Only list patch newer versions"
    method_option "parseable", :aliases => "--porcelain", :type => :boolean, :banner =>
      "Use minimal formatting for more parseable output"
    method_option "only-explicit", :type => :boolean, :banner =>
      "Only list gems specified in your Gemfile, not their dependencies"
    def outdated(*gems)
      require_relative "cli/outdated"
      Outdated.new(options, gems).run
    end

    desc "fund [OPTIONS]", "Lists information about gems seeking funding assistance"
    method_option "group", :aliases => "-g", :type => :array, :banner =>
      "Fetch funding information for a specific group"
    def fund
      require_relative "cli/fund"
      Fund.new(options).run
    end

    desc "cache [OPTIONS]", "Locks and then caches all of the gems into vendor/cache"
    method_option "all",  :type => :boolean,
                          :default => Bundler.feature_flag.cache_all?,
                          :banner => "Include all sources (including path and git)."
    method_option "all-platforms", :type => :boolean, :banner => "Include gems for all platforms present in the lockfile, not only the current one"
    method_option "cache-path", :type => :string, :banner =>
      "Specify a different cache path than the default (vendor/cache)."
    method_option "gemfile", :type => :string, :banner => "Use the specified gemfile instead of Gemfile"
    method_option "no-install", :type => :boolean, :banner => "Don't install the gems, only update the cache."
    method_option "no-prune", :type => :boolean, :banner => "Don't remove stale gems from the cache."
    method_option "path", :type => :string, :banner =>
      "Specify a different path than the system default ($BUNDLE_PATH or $GEM_HOME).#{" Bundler will remember this value for future installs on this machine" unless Bundler.feature_flag.forget_cli_options?}"
    method_option "quiet", :type => :boolean, :banner => "Only output warnings and errors."
    method_option "frozen", :type => :boolean, :banner =>
      "Do not allow the Gemfile.lock to be updated after this bundle cache operation's install"
    long_desc <<-D
      The cache command will copy the .gem files for every gem in the bundle into the
      directory ./vendor/cache. If you then check that directory into your source
      control repository, others who check out your source will be able to install the
      bundle without having to download any additional gems.
    D
    def cache
      SharedHelpers.major_deprecation 2,
        "The `--all` flag is deprecated because it relies on being " \
        "remembered across bundler invocations, which bundler will no longer " \
        "do in future versions. Instead please use `bundle config set cache_all true`, " \
        "and stop using this flag" if ARGV.include?("--all")

      SharedHelpers.major_deprecation 2,
        "The `--path` flag is deprecated because its semantics are unclear. " \
        "Use `bundle config cache_path` to configure the path of your cache of gems, " \
        "and `bundle config path` to configure the path where your gems are installed, " \
        "and stop using this flag" if ARGV.include?("--path")

      require_relative "cli/cache"
      Cache.new(options).run
    end

    map aliases_for("cache")

    desc "exec [OPTIONS]", "Run the command in context of the bundle"
    method_option :keep_file_descriptors, :type => :boolean, :default => true
    method_option :gemfile, :type => :string, :required => false
    long_desc <<-D
      Exec runs a command, providing it access to the gems in the bundle. While using
      bundle exec you can require and call the bundled gems as if they were installed
      into the system wide RubyGems repository.
    D
    def exec(*args)
      if ARGV.include?("--no-keep-file-descriptors")
        SharedHelpers.major_deprecation(2, "The `--no-keep-file-descriptors` has been deprecated. `bundle exec` no longer mess with your file descriptors. Close them in the exec'd script if you need to")
      end

      require_relative "cli/exec"
      Exec.new(options, args).run
    end

    map aliases_for("exec")

    desc "config NAME [VALUE]", "Retrieve or set a configuration value"
    long_desc <<-D
      Retrieves or sets a configuration value. If only one parameter is provided, retrieve the value. If two parameters are provided, replace the
      existing value with the newly provided one.

      By default, setting a configuration value sets it for all projects
      on the machine.

      If a global setting is superseded by local configuration, this command
      will show the current value, as well as any superseded values and
      where they were specified.
    D
    require_relative "cli/config"
    subcommand "config", Config

    desc "open GEM", "Opens the source directory of the given bundled gem"
    def open(name)
      require_relative "cli/open"
      Open.new(options, name).run
    end

    unless Bundler.feature_flag.bundler_3_mode?
      desc "console [GROUP]", "Opens an IRB session with the bundle pre-loaded"
      def console(group = nil)
        require_relative "cli/console"
        Console.new(options, group).run
      end
    end

    desc "version", "Prints Bundler version information"
    def version
      cli_help = current_command.name == "cli_help"
      if cli_help || ARGV.include?("version")
        build_info = " (#{BuildMetadata.built_at} commit #{BuildMetadata.git_commit_sha})"
      end

      if !cli_help && Bundler.feature_flag.print_only_version_number?
        Bundler.ui.info "#{Bundler::VERSION}#{build_info}"
      else
        Bundler.ui.info "Bundler version #{Bundler::VERSION}#{build_info}"
      end
    end

    map aliases_for("version")

    desc "licenses", "Prints the license of all gems in the bundle"
    def licenses
      Bundler.load.specs.sort_by {|s| s.license.to_s }.reverse_each do |s|
        gem_name = s.name
        license  = s.license || s.licenses

        if license.empty?
          Bundler.ui.warn "#{gem_name}: Unknown"
        else
          Bundler.ui.info "#{gem_name}: #{license}"
        end
      end
    end

    unless Bundler.feature_flag.bundler_3_mode?
      desc "viz [OPTIONS]", "Generates a visual dependency graph", :hide => true
      long_desc <<-D
        Viz generates a PNG file of the current Gemfile as a dependency graph.
        Viz requires the ruby-graphviz gem (and its dependencies).
        The associated gems must also be installed via 'bundle install'.
      D
      method_option :file, :type => :string, :default => "gem_graph", :aliases => "-f", :desc => "The name to use for the generated file. see format option"
      method_option :format, :type => :string, :default => "png", :aliases => "-F", :desc => "This is output format option. Supported format is png, jpg, svg, dot ..."
      method_option :requirements, :type => :boolean, :default => false, :aliases => "-R", :desc => "Set to show the version of each required dependency."
      method_option :version, :type => :boolean, :default => false, :aliases => "-v", :desc => "Set to show each gem version."
      method_option :without, :type => :array, :default => [], :aliases => "-W", :banner => "GROUP[ GROUP...]", :desc => "Exclude gems that are part of the specified named group."
      def viz
        SharedHelpers.major_deprecation 2, "The `viz` command has been renamed to `graph` and moved to a plugin. See https://github.com/rubygems/bundler-graph"
        require_relative "cli/viz"
        Viz.new(options.dup).run
      end
    end

    old_gem = instance_method(:gem)

    desc "gem NAME [OPTIONS]", "Creates a skeleton for creating a rubygem"
    method_option :exe, :type => :boolean, :default => false, :aliases => ["--bin", "-b"], :desc => "Generate a binary executable for your library."
    method_option :coc, :type => :boolean, :desc => "Generate a code of conduct file. Set a default with `bundle config set --global gem.coc true`."
    method_option :edit, :type => :string, :aliases => "-e", :required => false, :banner => "EDITOR",
                         :lazy_default => [ENV["BUNDLER_EDITOR"], ENV["VISUAL"], ENV["EDITOR"]].find {|e| !e.nil? && !e.empty? },
                         :desc => "Open generated gemspec in the specified editor (defaults to $EDITOR or $BUNDLER_EDITOR)"
    method_option :ext, :type => :boolean, :default => false, :desc => "Generate the boilerplate for C extension code"
    method_option :git, :type => :boolean, :default => true, :desc => "Initialize a git repo inside your library."
    method_option :mit, :type => :boolean, :desc => "Generate an MIT license file. Set a default with `bundle config set --global gem.mit true`."
    method_option :rubocop, :type => :boolean, :desc => "Add rubocop to the generated Rakefile and gemspec. Set a default with `bundle config set --global gem.rubocop true`."
    method_option :changelog, :type => :boolean, :desc => "Generate changelog file. Set a default with `bundle config set --global gem.changelog true`."
    method_option :test, :type => :string, :lazy_default => Bundler.settings["gem.test"] || "", :aliases => "-t", :banner => "Use the specified test framework for your library",
                         :desc => "Generate a test directory for your library, either rspec, minitest or test-unit. Set a default with `bundle config set --global gem.test (rspec|minitest|test-unit)`."
    method_option :ci, :type => :string, :lazy_default => Bundler.settings["gem.ci"] || "",
                       :desc => "Generate CI configuration, either GitHub Actions, Travis CI, GitLab CI or CircleCI. Set a default with `bundle config set --global gem.ci (github|travis|gitlab|circle)`"
    method_option :linter, :type => :string, :lazy_default => Bundler.settings["gem.linter"] || "",
                           :desc => "Add a linter and code formatter, either RuboCop or Standard. Set a default with `bundle config set --global gem.linter (rubocop|standard)`"
    method_option :github_username, :type => :string, :default => Bundler.settings["gem.github_username"], :banner => "Set your username on GitHub", :desc => "Fill in GitHub username on README so that you don't have to do it manually. Set a default with `bundle config set --global gem.github_username <your_username>`."

    def gem(name)
    end

    commands["gem"].tap do |gem_command|
      def gem_command.run(instance, args = [])
        arity = 1 # name

        require_relative "cli/gem"
        cmd_args = args + [instance]
        cmd_args.unshift(instance.options)

        cmd = begin
          Gem.new(*cmd_args)
        rescue ArgumentError => e
          instance.class.handle_argument_error(self, e, args, arity)
        end

        cmd.run
      end
    end

    undef_method(:gem)
    define_method(:gem, old_gem)
    private :gem

    def self.source_root
      File.expand_path("templates", __dir__)
    end

    desc "clean [OPTIONS]", "Cleans up unused gems in your bundler directory", :hide => true
    method_option "dry-run", :type => :boolean, :default => false, :banner =>
      "Only print out changes, do not clean gems"
    method_option "force", :type => :boolean, :default => false, :banner =>
      "Forces cleaning up unused gems even if Bundler is configured to use globally installed gems. As a consequence, removes all system gems except for the ones in the current application."
    def clean
      require_relative "cli/clean"
      Clean.new(options.dup).run
    end

    desc "platform [OPTIONS]", "Displays platform compatibility information"
    method_option "ruby", :type => :boolean, :default => false, :banner =>
      "only display ruby related platform information"
    def platform
      require_relative "cli/platform"
      Platform.new(options).run
    end

    desc "inject GEM VERSION", "Add the named gem, with version requirements, to the resolved Gemfile", :hide => true
    method_option "source", :type => :string, :banner =>
     "Install gem from the given source"
    method_option "group", :type => :string, :banner =>
     "Install gem into a bundler group"
    def inject(name, version)
      SharedHelpers.major_deprecation 2, "The `inject` command has been replaced by the `add` command"
      require_relative "cli/inject"
      Inject.new(options.dup, name, version).run
    end

    desc "lock", "Creates a lockfile without installing"
    method_option "update", :type => :array, :lazy_default => true, :banner =>
      "ignore the existing lockfile, update all gems by default, or update list of given gems"
    method_option "local", :type => :boolean, :default => false, :banner =>
      "do not attempt to fetch remote gemspecs and use the local gem cache only"
    method_option "print", :type => :boolean, :default => false, :banner =>
      "print the lockfile to STDOUT instead of writing to the file system"
    method_option "gemfile", :type => :string, :banner =>
      "Use the specified gemfile instead of Gemfile"
    method_option "lockfile", :type => :string, :default => nil, :banner =>
      "the path the lockfile should be written to"
    method_option "full-index", :type => :boolean, :default => false, :banner =>
      "Fall back to using the single-file index of all gems"
    method_option "add-platform", :type => :array, :default => [], :banner =>
      "Add a new platform to the lockfile"
    method_option "remove-platform", :type => :array, :default => [], :banner =>
      "Remove a platform from the lockfile"
    method_option "patch", :type => :boolean, :banner =>
      "If updating, prefer updating only to next patch version"
    method_option "minor", :type => :boolean, :banner =>
      "If updating, prefer updating only to next minor version"
    method_option "major", :type => :boolean, :banner =>
      "If updating, prefer updating to next major version (default)"
    method_option "strict", :type => :boolean, :banner =>
      "If updating, do not allow any gem to be updated past latest --patch | --minor | --major"
    method_option "conservative", :type => :boolean, :banner =>
      "If updating, use bundle install conservative update behavior and do not allow shared dependencies to be updated"
    def lock
      require_relative "cli/lock"
      Lock.new(options).run
    end

    desc "env", "Print information about the environment Bundler is running under"
    def env
      Env.write($stdout)
    end

    desc "doctor [OPTIONS]", "Checks the bundle for common problems"
    long_desc <<-D
      Doctor scans the OS dependencies of each of the gems requested in the Gemfile. If
      missing dependencies are detected, Bundler prints them and exits status 1.
      Otherwise, Bundler prints a success message and exits with a status of 0.
    D
    method_option "gemfile", :type => :string, :banner =>
      "Use the specified gemfile instead of Gemfile"
    method_option "quiet", :type => :boolean, :banner =>
        "Only output warnings and errors."
    def doctor
      require_relative "cli/doctor"
      Doctor.new(options).run
    end

    desc "issue", "Learn how to report an issue in Bundler"
    def issue
      require_relative "cli/issue"
      Issue.new.run
    end

    desc "pristine [GEMS...]", "Restores installed gems to pristine condition"
    long_desc <<-D
      Restores installed gems to pristine condition from files located in the
      gem cache. Gems installed from a git repository will be issued `git
      checkout --force`.
    D
    def pristine(*gems)
      require_relative "cli/pristine"
      Pristine.new(gems).run
    end

    if Bundler.feature_flag.plugins?
      require_relative "cli/plugin"
      desc "plugin", "Manage the bundler plugins"
      subcommand "plugin", Plugin
    end

    # Reformat the arguments passed to bundle that include a --help flag
    # into the corresponding `bundle help #{command}` call
    def self.reformatted_help_args(args)
      bundler_commands = (COMMAND_ALIASES.keys + COMMAND_ALIASES.values).flatten

      help_flags = %w[--help -h]
      exec_commands = ["exec"] + COMMAND_ALIASES["exec"]

      help_used = args.index {|a| help_flags.include? a }
      exec_used = args.index {|a| exec_commands.include? a }

      command = args.find {|a| bundler_commands.include? a }
      command = all_aliases[command] if all_aliases[command]

      if exec_used && help_used
        if exec_used + help_used == 1
          %w[help exec]
        else
          args
        end
      elsif help_used
        args = args.dup
        args.delete_at(help_used)
        ["help", command || args].flatten.compact
      else
        args
      end
    end

    private

    # Automatically invoke `bundle install` and resume if
    # Bundler.settings[:auto_install] exists. This is set through config cmd
    # `bundle config set --global auto_install 1`.
    #
    # Note that this method `nil`s out the global Definition object, so it
    # should be called first, before you instantiate anything like an
    # `Installer` that'll keep a reference to the old one instead.
    def auto_install
      return unless Bundler.settings[:auto_install]

      begin
        Bundler.definition.specs
      rescue GemNotFound
        Bundler.ui.info "Automatically installing missing gems."
        Bundler.reset!
        invoke :install, []
        Bundler.reset!
      end
    end

    def current_command
      _, _, config = @_initializer
      config[:current_command]
    end

    def print_command
      return unless Bundler.ui.debug?
      cmd = current_command
      command_name = cmd.name
      return if PARSEABLE_COMMANDS.include?(command_name)
      command = ["bundle", command_name] + args
      options_to_print = options.dup
      options_to_print.delete_if do |k, v|
        next unless o = cmd.options[k]
        o.default == v
      end
      command << Thor::Options.to_switches(options_to_print.sort_by(&:first)).strip
      command.reject!(&:empty?)
      Bundler.ui.info "Running `#{command * " "}` with bundler #{Bundler::VERSION}"
    end

    def warn_on_outdated_bundler
      return if Bundler.settings[:disable_version_check]

      command_name = current_command.name
      return if PARSEABLE_COMMANDS.include?(command_name)

      return unless SharedHelpers.md5_available?

      latest = Fetcher::CompactIndex.
               new(nil, Source::Rubygems::Remote.new(Bundler::URI("https://rubygems.org")), nil).
               send(:compact_index_client).
               instance_variable_get(:@cache).
               dependencies("bundler").
               map {|d| Gem::Version.new(d.first) }.
               max
      return unless latest

      current = Gem::Version.new(VERSION)
      return if current >= latest

      Bundler.ui.warn \
        "The latest bundler is #{latest}, but you are currently running #{current}.\n" \
        "To update to the most recent version, run `bundle update --bundler`"
    rescue RuntimeError
      nil
    end

    def remembered_negative_flag_deprecation(name)
      positive_name = name.gsub(/\Ano-/, "")
      option = current_command.options[positive_name]
      flag_name = "--no-" + option.switch_name.gsub(/\A--/, "")

      flag_deprecation(positive_name, flag_name, option)
    end

    def remembered_flag_deprecation(name)
      option = current_command.options[name]
      flag_name = option.switch_name

      flag_deprecation(name, flag_name, option)
    end

    def flag_deprecation(name, flag_name, option)
      name_index = ARGV.find {|arg| flag_name == arg.split("=")[0] }
      return unless name_index

      value = options[name]
      value = value.join(" ").to_s if option.type == :array

      Bundler::SharedHelpers.major_deprecation 2,
        "The `#{flag_name}` flag is deprecated because it relies on being " \
        "remembered across bundler invocations, which bundler will no longer " \
        "do in future versions. Instead please use `bundle config set --local #{name.tr("-", "_")} " \
        "'#{value}'`, and stop using this flag"
    end
  end
end
PK}$[E�d��>gems/gems/bundler-2.3.27/lib/bundler/endpoint_specification.rbnu�[���# frozen_string_literal: true

module Bundler
  # used for Creating Specifications from the Gemcutter Endpoint
  class EndpointSpecification < Gem::Specification
    include MatchRemoteMetadata

    attr_reader :name, :version, :platform, :checksum
    attr_accessor :source, :remote, :dependencies

    def initialize(name, version, platform, spec_fetcher, dependencies, metadata = nil)
      super()
      @name         = name
      @version      = Gem::Version.create version
      @platform     = Gem::Platform.new(platform)
      @spec_fetcher = spec_fetcher
      @dependencies = dependencies.map {|dep, reqs| build_dependency(dep, reqs) }

      @loaded_from          = nil
      @remote_specification = nil

      parse_metadata(metadata)
    end

    def fetch_platform
      @platform
    end

    def identifier
      @__identifier ||= [name, version, platform.to_s]
    end

    # needed for standalone, load required_paths from local gemspec
    # after the gem is installed
    def require_paths
      if @remote_specification
        @remote_specification.require_paths
      elsif _local_specification
        _local_specification.require_paths
      else
        super
      end
    end

    # needed for inline
    def load_paths
      # remote specs aren't installed, and can't have load_paths
      if _local_specification
        _local_specification.load_paths
      else
        super
      end
    end

    # needed for binstubs
    def executables
      if @remote_specification
        @remote_specification.executables
      elsif _local_specification
        _local_specification.executables
      else
        super
      end
    end

    # needed for bundle clean
    def bindir
      if @remote_specification
        @remote_specification.bindir
      elsif _local_specification
        _local_specification.bindir
      else
        super
      end
    end

    # needed for post_install_messages during install
    def post_install_message
      if @remote_specification
        @remote_specification.post_install_message
      elsif _local_specification
        _local_specification.post_install_message
      else
        super
      end
    end

    # needed for "with native extensions" during install
    def extensions
      if @remote_specification
        @remote_specification.extensions
      elsif _local_specification
        _local_specification.extensions
      else
        super
      end
    end

    def _local_specification
      return unless @loaded_from && File.exist?(local_specification_path)
      eval(File.read(local_specification_path)).tap do |spec|
        spec.loaded_from = @loaded_from
      end
    end

    def __swap__(spec)
      SharedHelpers.ensure_same_dependencies(self, dependencies, spec.dependencies)
      @remote_specification = spec
    end

    private

    def _remote_specification
      @_remote_specification ||= @spec_fetcher.fetch_spec([@name, @version, @platform])
    end

    def local_specification_path
      "#{base_dir}/specifications/#{full_name}.gemspec"
    end

    def parse_metadata(data)
      unless data
        @required_ruby_version = nil
        @required_rubygems_version = nil
        return
      end

      data.each do |k, v|
        next unless v
        case k.to_s
        when "checksum"
          @checksum = v.last
        when "rubygems"
          @required_rubygems_version = Gem::Requirement.new(v)
        when "ruby"
          @required_ruby_version = Gem::Requirement.new(v)
        end
      end
    rescue StandardError => e
      raise GemspecError, "There was an error parsing the metadata for the gem #{name} (#{version}): #{e.class}\n#{e}\nThe metadata was #{data.inspect}"
    end

    def build_dependency(name, requirements)
      Gem::Dependency.new(name, requirements)
    end
  end
end
PK}$[��Ǵ�5gems/gems/bundler-2.3.27/lib/bundler/vendored_thor.rbnu�[���# frozen_string_literal: true

module Bundler
  def self.require_thor_actions
    require_relative "vendor/thor/lib/thor/actions"
  end
end
require_relative "vendor/thor/lib/thor"
PK}$[�:H�OO<gems/gems/bundler-2.3.27/lib/bundler/remote_specification.rbnu�[���# frozen_string_literal: true

module Bundler
  # Represents a lazily loaded gem specification, where the full specification
  # is on the source server in rubygems' "quick" index. The proxy object is to
  # be seeded with what we're given from the source's abbreviated index - the
  # full specification will only be fetched when necessary.
  class RemoteSpecification
    include MatchRemoteMetadata
    include MatchPlatform
    include Comparable

    attr_reader :name, :version, :platform
    attr_writer :dependencies
    attr_accessor :source, :remote

    def initialize(name, version, platform, spec_fetcher)
      @name         = name
      @version      = Gem::Version.create version
      @original_platform = platform || Gem::Platform::RUBY
      @platform     = Gem::Platform.new(platform)
      @spec_fetcher = spec_fetcher
      @dependencies = nil
    end

    # Needed before installs, since the arch matters then and quick
    # specs don't bother to include the arch in the platform string
    def fetch_platform
      @platform = _remote_specification.platform
    end

    def identifier
      @__identifier ||= [name, version, @platform.to_s]
    end

    def full_name
      if @platform == Gem::Platform::RUBY
        "#{@name}-#{@version}"
      else
        "#{@name}-#{@version}-#{@platform}"
      end
    end

    # Compare this specification against another object. Using sort_obj
    # is compatible with Gem::Specification and other Bundler or RubyGems
    # objects. Otherwise, use the default Object comparison.
    def <=>(other)
      if other.respond_to?(:sort_obj)
        sort_obj <=> other.sort_obj
      else
        super
      end
    end

    # Because Rubyforge cannot be trusted to provide valid specifications
    # once the remote gem is downloaded, the backend specification will
    # be swapped out.
    def __swap__(spec)
      raise APIResponseInvalidDependenciesError unless spec.dependencies.all? {|d| d.is_a?(Gem::Dependency) }

      SharedHelpers.ensure_same_dependencies(self, dependencies, spec.dependencies)
      @_remote_specification = spec
    end

    # Create a delegate used for sorting. This strategy is copied from
    # RubyGems 2.23 and ensures that Bundler's specifications can be
    # compared and sorted with RubyGems' own specifications.
    #
    # @see #<=>
    # @see Gem::Specification#sort_obj
    #
    # @return [Array] an object you can use to compare and sort this
    #   specification against other specifications
    def sort_obj
      [@name, @version, @platform == Gem::Platform::RUBY ? -1 : 1]
    end

    def to_s
      "#<#{self.class} name=#{name} version=#{version} platform=#{platform}>"
    end

    def dependencies
      @dependencies ||= begin
        deps = method_missing(:dependencies)

        # allow us to handle when the specs dependencies are an array of array of string
        # in order to delay the crash to `#__swap__` where it results in a friendlier error
        # see https://github.com/rubygems/bundler/issues/5797
        deps = deps.map {|d| d.is_a?(Gem::Dependency) ? d : Gem::Dependency.new(*d) }

        deps
      end
    end

    def git_version
      return unless loaded_from && source.is_a?(Bundler::Source::Git)
      " #{source.revision[0..6]}"
    end

    private

    def to_ary
      nil
    end

    def _remote_specification
      @_remote_specification ||= @spec_fetcher.fetch_spec([@name, @version, @original_platform])
      @_remote_specification || raise(GemspecError, "Gemspec data for #{full_name} was" \
        " missing from the server! Try installing with `--full-index` as a workaround.")
    end

    def method_missing(method, *args, &blk)
      _remote_specification.send(method, *args, &blk)
    end

    def respond_to?(method, include_all = false)
      super || _remote_specification.respond_to?(method, include_all)
    end
    public :respond_to?
  end
end
PK}$[|L�0��4gems/gems/bundler-2.3.27/lib/bundler/ruby_version.rbnu�[���# frozen_string_literal: true

module Bundler
  class RubyVersion
    attr_reader :versions,
      :patchlevel,
      :engine,
      :engine_versions,
      :gem_version,
      :engine_gem_version

    def initialize(versions, patchlevel, engine, engine_version)
      # The parameters to this method must satisfy the
      # following constraints, which are verified in
      # the DSL:
      #
      # * If an engine is specified, an engine version
      #   must also be specified
      # * If an engine version is specified, an engine
      #   must also be specified
      # * If the engine is "ruby", the engine version
      #   must not be specified, or the engine version
      #   specified must match the version.

      @versions = Array(versions).map do |v|
        op, v = Gem::Requirement.parse(v)
        op == "=" ? v.to_s : "#{op} #{v}"
      end

      @gem_version        = Gem::Requirement.create(@versions.first).requirements.first.last
      @input_engine       = engine && engine.to_s
      @engine             = engine && engine.to_s || "ruby"
      @engine_versions    = (engine_version && Array(engine_version)) || @versions
      @engine_gem_version = Gem::Requirement.create(@engine_versions.first).requirements.first.last
      @patchlevel         = patchlevel || (@gem_version.prerelease? ? "-1" : nil)
    end

    def to_s(versions = self.versions)
      output = String.new("ruby #{versions_string(versions)}")
      output << "p#{patchlevel}" if patchlevel && patchlevel != "-1"
      output << " (#{engine} #{versions_string(engine_versions)})" unless engine == "ruby"

      output
    end

    # @private
    PATTERN = /
      ruby\s
      (\d+\.\d+\.\d+(?:\.\S+)?) # ruby version
      (?:p(-?\d+))? # optional patchlevel
      (?:\s\((\S+)\s(.+)\))? # optional engine info
    /xo.freeze

    # Returns a RubyVersion from the given string.
    # @param [String] the version string to match.
    # @return [RubyVersion,Nil] The version if the string is a valid RubyVersion
    #         description, and nil otherwise.
    def self.from_string(string)
      new($1, $2, $3, $4) if string =~ PATTERN
    end

    def single_version_string
      to_s(gem_version)
    end

    def ==(other)
      versions == other.versions &&
        engine == other.engine &&
        engine_versions == other.engine_versions &&
        patchlevel == other.patchlevel
    end

    def host
      @host ||= [
        RbConfig::CONFIG["host_cpu"],
        RbConfig::CONFIG["host_vendor"],
        RbConfig::CONFIG["host_os"],
      ].join("-")
    end

    # Returns a tuple of these things:
    #   [diff, this, other]
    #   The priority of attributes are
    #   1. engine
    #   2. ruby_version
    #   3. engine_version
    def diff(other)
      raise ArgumentError, "Can only diff with a RubyVersion, not a #{other.class}" unless other.is_a?(RubyVersion)
      if engine != other.engine && @input_engine
        [:engine, engine, other.engine]
      elsif versions.empty? || !matches?(versions, other.gem_version)
        [:version, versions_string(versions), versions_string(other.versions)]
      elsif @input_engine && !matches?(engine_versions, other.engine_gem_version)
        [:engine_version, versions_string(engine_versions), versions_string(other.engine_versions)]
      elsif patchlevel && (!patchlevel.is_a?(String) || !other.patchlevel.is_a?(String) || !matches?(patchlevel, other.patchlevel))
        [:patchlevel, patchlevel, other.patchlevel]
      end
    end

    def versions_string(versions)
      Array(versions).join(", ")
    end

    def self.system
      ruby_engine = RUBY_ENGINE.dup
      ruby_version = Gem.ruby_version.to_s
      ruby_engine_version = RUBY_ENGINE == "ruby" ? ruby_version : RUBY_ENGINE_VERSION.dup
      patchlevel = RUBY_PATCHLEVEL.to_s

      @ruby_version ||= RubyVersion.new(ruby_version, patchlevel, ruby_engine, ruby_engine_version)
    end

    private

    def matches?(requirements, version)
      # Handles RUBY_PATCHLEVEL of -1 for instances like ruby-head
      return requirements == version if requirements.to_s == "-1" || version.to_s == "-1"

      Array(requirements).all? do |requirement|
        Gem::Requirement.create(requirement).satisfied_by?(Gem::Version.create(version))
      end
    end
  end
end
PK}$[�OP#oo.gems/gems/bundler-2.3.27/lib/bundler/errors.rbnu�[���# frozen_string_literal: true

module Bundler
  class BundlerError < StandardError
    def self.status_code(code)
      define_method(:status_code) { code }
      if match = BundlerError.all_errors.find {|_k, v| v == code }
        error, _ = match
        raise ArgumentError,
          "Trying to register #{self} for status code #{code} but #{error} is already registered"
      end
      BundlerError.all_errors[self] = code
    end

    def self.all_errors
      @all_errors ||= {}
    end
  end

  class GemfileError < BundlerError; status_code(4); end
  class InstallError < BundlerError; status_code(5); end

  # Internal error, should be rescued
  class VersionConflict < BundlerError
    attr_reader :conflicts

    def initialize(conflicts, msg = nil)
      super(msg)
      @conflicts = conflicts
    end

    status_code(6)
  end

  class GemNotFound < BundlerError; status_code(7); end
  class InstallHookError < BundlerError; status_code(8); end
  class GemfileNotFound < BundlerError; status_code(10); end
  class GitError < BundlerError; status_code(11); end
  class DeprecatedError < BundlerError; status_code(12); end
  class PathError < BundlerError; status_code(13); end
  class GemspecError < BundlerError; status_code(14); end
  class InvalidOption < BundlerError; status_code(15); end
  class ProductionError < BundlerError; status_code(16); end

  class HTTPError < BundlerError
    status_code(17)
    def filter_uri(uri)
      URICredentialsFilter.credential_filtered_uri(uri)
    end
  end

  class RubyVersionMismatch < BundlerError; status_code(18); end
  class SecurityError < BundlerError; status_code(19); end
  class LockfileError < BundlerError; status_code(20); end
  class CyclicDependencyError < BundlerError; status_code(21); end
  class GemfileLockNotFound < BundlerError; status_code(22); end
  class PluginError < BundlerError; status_code(29); end
  class SudoNotPermittedError < BundlerError; status_code(30); end
  class ThreadCreationError < BundlerError; status_code(33); end
  class APIResponseMismatchError < BundlerError; status_code(34); end
  class APIResponseInvalidDependenciesError < BundlerError; status_code(35); end
  class GemfileEvalError < GemfileError; end
  class MarshalError < StandardError; end

  class PermissionError < BundlerError
    def initialize(path, permission_type = :write)
      @path = path
      @permission_type = permission_type
    end

    def action
      case @permission_type
      when :read then "read from"
      when :write then "write to"
      when :executable, :exec then "execute"
      else @permission_type.to_s
      end
    end

    def permission_type
      case @permission_type
      when :create
        "executable permissions for all parent directories and write permissions for `#{parent_folder}`"
      else
        "#{@permission_type} permissions for that path"
      end
    end

    def parent_folder
      File.dirname(@path)
    end

    def message
      "There was an error while trying to #{action} `#{@path}`. " \
      "It is likely that you need to grant #{permission_type}."
    end

    status_code(23)
  end

  class GemRequireError < BundlerError
    attr_reader :orig_exception

    def initialize(orig_exception, msg)
      full_message = msg + "\nGem Load Error is: #{orig_exception.message}\n"\
                      "Backtrace for gem load error is:\n"\
                      "#{orig_exception.backtrace.join("\n")}\n"\
                      "Bundler Error Backtrace:\n"
      super(full_message)
      @orig_exception = orig_exception
    end

    status_code(24)
  end

  class YamlSyntaxError < BundlerError
    attr_reader :orig_exception

    def initialize(orig_exception, msg)
      super(msg)
      @orig_exception = orig_exception
    end

    status_code(25)
  end

  class TemporaryResourceError < PermissionError
    def message
      "There was an error while trying to #{action} `#{@path}`. " \
      "Some resource was temporarily unavailable. It's suggested that you try" \
      "the operation again."
    end

    status_code(26)
  end

  class VirtualProtocolError < BundlerError
    def message
      "There was an error relating to virtualization and file access. " \
      "It is likely that you need to grant access to or mount some file system correctly."
    end

    status_code(27)
  end

  class OperationNotSupportedError < PermissionError
    def message
      "Attempting to #{action} `#{@path}` is unsupported by your OS."
    end

    status_code(28)
  end

  class NoSpaceOnDeviceError < PermissionError
    def message
      "There was an error while trying to #{action} `#{@path}`. " \
      "There was insufficient space remaining on the device."
    end

    status_code(31)
  end

  class GenericSystemCallError < BundlerError
    attr_reader :underlying_error

    def initialize(underlying_error, message)
      @underlying_error = underlying_error
      super("#{message}\nThe underlying system error is #{@underlying_error.class}: #{@underlying_error}")
    end

    status_code(32)
  end

  class DirectoryRemovalError < BundlerError
    def initialize(orig_exception, msg)
      full_message = "#{msg}.\n" \
                     "The underlying error was #{orig_exception.class}: #{orig_exception.message}, with backtrace:\n" \
                     "  #{orig_exception.backtrace.join("\n  ")}\n\n" \
                     "Bundler Error Backtrace:"
      super(full_message)
    end

    status_code(36)
  end
end
PK}$[�?��4gems/gems/bundler-2.3.27/lib/bundler/self_manager.rbnu�[���# frozen_string_literal: true

module Bundler
  #
  # This class handles installing and switching to the version of bundler needed
  # by an application.
  #
  class SelfManager
    def restart_with_locked_bundler_if_needed
      return unless needs_switching? && installed?

      restart_with(lockfile_version)
    end

    def install_locked_bundler_and_restart_with_it_if_needed
      return unless needs_switching?

      Bundler.ui.info \
        "Bundler #{current_version} is running, but your lockfile was generated with #{lockfile_version}. " \
        "Installing Bundler #{lockfile_version} and restarting using that version."

      install_and_restart_with(lockfile_version)
    end

    def update_bundler_and_restart_with_it_if_needed(target)
      return unless autoswitching_applies?

      spec = resolve_update_version_from(target)
      return unless spec

      version = spec.version

      Bundler.ui.info "Updating bundler to #{version}."

      install(spec)

      restart_with(version)
    end

    private

    def install_and_restart_with(version)
      requirement = Gem::Requirement.new(version)
      spec = find_latest_matching_spec(requirement)

      if spec.nil?
        Bundler.ui.warn "Your lockfile is locked to a version of bundler (#{lockfile_version}) that doesn't exist at https://rubygems.org/. Going on using #{current_version}"
        return
      end

      install(spec)
    rescue StandardError => e
      Bundler.ui.trace e
      Bundler.ui.warn "There was an error installing the locked bundler version (#{lockfile_version}), rerun with the `--verbose` flag for more details. Going on using bundler #{current_version}."
    else
      restart_with(version)
    end

    def install(spec)
      spec.source.install(spec)
    end

    def restart_with(version)
      configured_gem_home = ENV["GEM_HOME"]
      configured_gem_path = ENV["GEM_PATH"]

      cmd = [$PROGRAM_NAME, *ARGV]
      cmd.unshift(Gem.ruby) unless File.executable?($PROGRAM_NAME)

      Bundler.with_original_env do
        Kernel.exec(
          { "GEM_HOME" => configured_gem_home, "GEM_PATH" => configured_gem_path, "BUNDLER_VERSION" => version.to_s },
          *cmd
        )
      end
    end

    def needs_switching?
      autoswitching_applies? &&
        released?(lockfile_version) &&
        !running?(lockfile_version) &&
        !updating?
    end

    def autoswitching_applies?
      ENV["BUNDLER_VERSION"].nil? &&
        Bundler.rubygems.supports_bundler_trampolining? &&
        SharedHelpers.in_bundle? &&
        lockfile_version
    end

    def resolve_update_version_from(target)
      requirement = Gem::Requirement.new(target)
      update_candidate = find_latest_matching_spec(requirement)

      if update_candidate.nil?
        raise InvalidOption, "The `bundle update --bundler` target version (#{target}) does not exist"
      end

      resolved_version = update_candidate.version
      needs_update = requirement.specific? ? !running?(resolved_version) : running_older_than?(resolved_version)

      return unless needs_update

      update_candidate
    end

    def local_specs
      @local_specs ||= Bundler::Source::Rubygems.new("allow_local" => true).specs.select {|spec| spec.name == "bundler" }
    end

    def remote_specs
      @remote_specs ||= begin
        source = Bundler::Source::Rubygems.new("remotes" => "https://rubygems.org")
        source.remote!
        source.add_dependency_names("bundler")
        source.specs
      end
    end

    def find_latest_matching_spec(requirement)
      local_result = find_latest_matching_spec_from_collection(local_specs, requirement)
      return local_result if local_result && requirement.specific?

      remote_result = find_latest_matching_spec_from_collection(remote_specs, requirement)
      return remote_result if local_result.nil?

      [local_result, remote_result].max
    end

    def find_latest_matching_spec_from_collection(specs, requirement)
      specs.sort.reverse_each.find {|spec| requirement.satisfied_by?(spec.version) }
    end

    def running?(version)
      version == current_version
    end

    def running_older_than?(version)
      current_version < version
    end

    def released?(version)
      !version.to_s.end_with?(".dev")
    end

    def updating?
      "update".start_with?(ARGV.first || " ") && ARGV[1..-1].any? {|a| a.start_with?("--bundler") }
    end

    def installed?
      Bundler.configure

      Bundler.rubygems.find_bundler(lockfile_version.to_s)
    end

    def current_version
      @current_version ||= Gem::Version.new(Bundler::VERSION)
    end

    def lockfile_version
      return @lockfile_version if defined?(@lockfile_version)

      parsed_version = Bundler::LockfileParser.bundled_with
      @lockfile_version = parsed_version ? Gem::Version.new(parsed_version) : nil
    end
  end
end
PK}$[s�{ss4gems/gems/bundler-2.3.27/lib/bundler/feature_flag.rbnu�[���# frozen_string_literal: true

module Bundler
  class FeatureFlag
    def self.settings_flag(flag, &default)
      unless Bundler::Settings::BOOL_KEYS.include?(flag.to_s)
        raise "Cannot use `#{flag}` as a settings feature flag since it isn't a bool key"
      end

      settings_method("#{flag}?", flag, &default)
    end
    private_class_method :settings_flag

    def self.settings_option(key, &default)
      settings_method(key, key, &default)
    end
    private_class_method :settings_option

    def self.settings_method(name, key, &default)
      define_method(name) do
        value = Bundler.settings[key]
        value = instance_eval(&default) if value.nil?
        value
      end
    end
    private_class_method :settings_method

    (1..10).each {|v| define_method("bundler_#{v}_mode?") { major_version >= v } }

    settings_flag(:allow_offline_install) { bundler_3_mode? }
    settings_flag(:auto_clean_without_path) { bundler_3_mode? }
    settings_flag(:cache_all) { bundler_3_mode? }
    settings_flag(:default_install_uses_path) { bundler_3_mode? }
    settings_flag(:forget_cli_options) { bundler_3_mode? }
    settings_flag(:global_gem_cache) { bundler_3_mode? }
    settings_flag(:path_relative_to_cwd) { bundler_3_mode? }
    settings_flag(:plugins) { @bundler_version >= Gem::Version.new("1.14") }
    settings_flag(:print_only_version_number) { bundler_3_mode? }
    settings_flag(:setup_makes_kernel_gem_public) { !bundler_3_mode? }
    settings_flag(:suppress_install_using_messages) { bundler_3_mode? }
    settings_flag(:update_requires_all_flag) { bundler_4_mode? }

    settings_option(:default_cli_command) { bundler_3_mode? ? :cli_help : :install }

    def initialize(bundler_version)
      @bundler_version = Gem::Version.create(bundler_version)
    end

    def major_version
      @bundler_version.segments.first
    end
    private :major_version
  end
end
PK}$[�a-gems/gems/bundler-2.3.27/lib/bundler/setup.rbnu�[���# frozen_string_literal: true

require_relative "shared_helpers"

if Bundler::SharedHelpers.in_bundle?
  require_relative "../bundler"

  if STDOUT.tty? || ENV["BUNDLER_FORCE_TTY"]
    begin
      Bundler.ui.silence { Bundler.setup }
    rescue Bundler::BundlerError => e
      Bundler.ui.error e.message
      Bundler.ui.warn e.backtrace.join("\n") if ENV["DEBUG"]
      if e.is_a?(Bundler::GemNotFound)
        Bundler.ui.warn "Run `bundle install` to install missing gems."
      end
      exit e.status_code
    end
  else
    Bundler.ui.silence { Bundler.setup }
  end

  # We might be in the middle of shelling out to rubygems
  # (RUBYOPT=-rbundler/setup), so we need to give rubygems the opportunity of
  # not being silent.
  Gem::DefaultUserInteraction.ui = nil
end
PK}$[�T�ee:gems/gems/bundler-2.3.27/lib/bundler/vendored_molinillo.rbnu�[���# frozen_string_literal: true

module Bundler; end
require_relative "vendor/molinillo/lib/molinillo"
PK
}$[��Z7)7)/gems/gems/bundler-2.3.27/lib/bundler/runtime.rbnu�[���# frozen_string_literal: true

module Bundler
  class Runtime
    include SharedHelpers

    def initialize(root, definition)
      @root = root
      @definition = definition
    end

    def setup(*groups)
      @definition.ensure_equivalent_gemfile_and_lockfile if Bundler.frozen_bundle?

      # Has to happen first
      clean_load_path

      specs = @definition.specs_for(groups)

      SharedHelpers.set_bundle_environment
      Bundler.rubygems.replace_entrypoints(specs)

      # Activate the specs
      load_paths = specs.map do |spec|
        check_for_activated_spec!(spec)

        Bundler.rubygems.mark_loaded(spec)
        spec.load_paths.reject {|path| $LOAD_PATH.include?(path) }
      end.reverse.flatten

      Bundler.rubygems.add_to_load_path(load_paths)

      setup_manpath

      lock(:preserve_unknown_sections => true)

      self
    end

    def require(*groups)
      groups.map!(&:to_sym)
      groups = [:default] if groups.empty?

      @definition.dependencies.each do |dep|
        # Skip the dependency if it is not in any of the requested groups, or
        # not for the current platform, or doesn't match the gem constraints.
        next unless (dep.groups & groups).any? && dep.should_include?

        required_file = nil

        begin
          # Loop through all the specified autorequires for the
          # dependency. If there are none, use the dependency's name
          # as the autorequire.
          Array(dep.autorequire || dep.name).each do |file|
            # Allow `require: true` as an alias for `require: <name>`
            file = dep.name if file == true
            required_file = file
            begin
              Kernel.require file
            rescue RuntimeError => e
              raise e if e.is_a?(LoadError) # we handle this a little later
              raise Bundler::GemRequireError.new e,
                "There was an error while trying to load the gem '#{file}'."
            end
          end
        rescue LoadError => e
          raise if dep.autorequire || e.path != required_file

          if dep.autorequire.nil? && dep.name.include?("-")
            begin
              namespaced_file = dep.name.tr("-", "/")
              Kernel.require namespaced_file
            rescue LoadError => e
              raise if e.path != namespaced_file
            end
          end
        end
      end
    end

    def self.definition_method(meth)
      define_method(meth) do
        raise ArgumentError, "no definition when calling Runtime##{meth}" unless @definition
        @definition.send(meth)
      end
    end
    private_class_method :definition_method

    definition_method :requested_specs
    definition_method :specs
    definition_method :dependencies
    definition_method :current_dependencies
    definition_method :requires

    def lock(opts = {})
      return if @definition.nothing_changed? && !@definition.unlocking?
      @definition.lock(Bundler.default_lockfile, opts[:preserve_unknown_sections])
    end

    alias_method :gems, :specs

    def cache(custom_path = nil, local = false)
      cache_path = Bundler.app_cache(custom_path)
      SharedHelpers.filesystem_access(cache_path) do |p|
        FileUtils.mkdir_p(p)
      end unless File.exist?(cache_path)

      Bundler.ui.info "Updating files in #{Bundler.settings.app_cache_path}"

      specs_to_cache = if Bundler.settings[:cache_all_platforms]
        @definition.resolve.materialized_for_all_platforms
      else
        begin
          specs
        rescue GemNotFound
          if local
            Bundler.ui.warn "Some gems seem to be missing from your #{Bundler.settings.app_cache_path} directory."
          end

          raise
        end
      end

      specs_to_cache.each do |spec|
        next if spec.name == "bundler"
        next if spec.source.is_a?(Source::Gemspec)
        spec.source.cache(spec, custom_path) if spec.source.respond_to?(:cache)
      end

      Dir[cache_path.join("*/.git")].each do |git_dir|
        FileUtils.rm_rf(git_dir)
        FileUtils.touch(File.expand_path("../.bundlecache", git_dir))
      end

      prune_cache(cache_path) unless Bundler.settings[:no_prune]
    end

    def prune_cache(cache_path)
      SharedHelpers.filesystem_access(cache_path) do |p|
        FileUtils.mkdir_p(p)
      end unless File.exist?(cache_path)
      resolve = @definition.resolve
      prune_gem_cache(resolve, cache_path)
      prune_git_and_path_cache(resolve, cache_path)
    end

    def clean(dry_run = false)
      gem_bins             = Dir["#{Gem.dir}/bin/*"]
      git_dirs             = Dir["#{Gem.dir}/bundler/gems/*"]
      git_cache_dirs       = Dir["#{Gem.dir}/cache/bundler/git/*"]
      gem_dirs             = Dir["#{Gem.dir}/gems/*"]
      gem_files            = Dir["#{Gem.dir}/cache/*.gem"]
      gemspec_files        = Dir["#{Gem.dir}/specifications/*.gemspec"]
      extension_dirs       = Dir["#{Gem.dir}/extensions/*/*/*"] + Dir["#{Gem.dir}/bundler/gems/extensions/*/*/*"]
      spec_gem_paths       = []
      # need to keep git sources around
      spec_git_paths       = @definition.spec_git_paths
      spec_git_cache_dirs  = []
      spec_gem_executables = []
      spec_cache_paths     = []
      spec_gemspec_paths   = []
      spec_extension_paths = []
      Bundler.rubygems.add_default_gems_to(specs).values.each do |spec|
        spec_gem_paths << spec.full_gem_path
        # need to check here in case gems are nested like for the rails git repo
        md = %r{(.+bundler/gems/.+-[a-f0-9]{7,12})}.match(spec.full_gem_path)
        spec_git_paths << md[1] if md
        spec_gem_executables << spec.executables.collect do |executable|
          e = "#{Bundler.rubygems.gem_bindir}/#{executable}"
          [e, "#{e}.bat"]
        end
        spec_cache_paths << spec.cache_file
        spec_gemspec_paths << spec.spec_file
        spec_extension_paths << spec.extension_dir if spec.respond_to?(:extension_dir)
        spec_git_cache_dirs << spec.source.cache_path.to_s if spec.source.is_a?(Bundler::Source::Git)
      end
      spec_gem_paths.uniq!
      spec_gem_executables.flatten!

      stale_gem_bins       = gem_bins - spec_gem_executables
      stale_git_dirs       = git_dirs - spec_git_paths - ["#{Gem.dir}/bundler/gems/extensions"]
      stale_git_cache_dirs = git_cache_dirs - spec_git_cache_dirs
      stale_gem_dirs       = gem_dirs - spec_gem_paths
      stale_gem_files      = gem_files - spec_cache_paths
      stale_gemspec_files  = gemspec_files - spec_gemspec_paths
      stale_extension_dirs = extension_dirs - spec_extension_paths

      removed_stale_gem_dirs = stale_gem_dirs.collect {|dir| remove_dir(dir, dry_run) }
      removed_stale_git_dirs = stale_git_dirs.collect {|dir| remove_dir(dir, dry_run) }
      output = removed_stale_gem_dirs + removed_stale_git_dirs

      unless dry_run
        stale_files = stale_gem_bins + stale_gem_files + stale_gemspec_files
        stale_files.each do |file|
          SharedHelpers.filesystem_access(File.dirname(file)) do |_p|
            FileUtils.rm(file) if File.exist?(file)
          end
        end

        stale_dirs = stale_git_cache_dirs + stale_extension_dirs
        stale_dirs.each do |stale_dir|
          SharedHelpers.filesystem_access(stale_dir) do |dir|
            FileUtils.rm_rf(dir) if File.exist?(dir)
          end
        end
      end

      output
    end

    private

    def prune_gem_cache(resolve, cache_path)
      cached = Dir["#{cache_path}/*.gem"]

      cached = cached.delete_if do |path|
        spec = Bundler.rubygems.spec_from_gem path

        resolve.any? do |s|
          s.name == spec.name && s.version == spec.version && !s.source.is_a?(Bundler::Source::Git)
        end
      end

      if cached.any?
        Bundler.ui.info "Removing outdated .gem files from #{Bundler.settings.app_cache_path}"

        cached.each do |path|
          Bundler.ui.info "  * #{File.basename(path)}"
          File.delete(path)
        end
      end
    end

    def prune_git_and_path_cache(resolve, cache_path)
      cached = Dir["#{cache_path}/*/.bundlecache"]

      cached = cached.delete_if do |path|
        name = File.basename(File.dirname(path))

        resolve.any? do |s|
          source = s.source
          source.respond_to?(:app_cache_dirname) && source.app_cache_dirname == name
        end
      end

      if cached.any?
        Bundler.ui.info "Removing outdated git and path gems from #{Bundler.settings.app_cache_path}"

        cached.each do |path|
          path = File.dirname(path)
          Bundler.ui.info "  * #{File.basename(path)}"
          FileUtils.rm_rf(path)
        end
      end
    end

    def setup_manpath
      # Add man/ subdirectories from activated bundles to MANPATH for man(1)
      manuals = $LOAD_PATH.map do |path|
        man_subdir = path.sub(/lib$/, "man")
        man_subdir unless Dir[man_subdir + "/man?/"].empty?
      end.compact

      return if manuals.empty?
      Bundler::SharedHelpers.set_env "MANPATH", manuals.concat(
        ENV["MANPATH"] ? ENV["MANPATH"].to_s.split(File::PATH_SEPARATOR) : [""]
      ).uniq.join(File::PATH_SEPARATOR)
    end

    def remove_dir(dir, dry_run)
      full_name = Pathname.new(dir).basename.to_s

      parts    = full_name.split("-")
      name     = parts[0..-2].join("-")
      version  = parts.last
      output   = "#{name} (#{version})"

      if dry_run
        Bundler.ui.info "Would have removed #{output}"
      else
        Bundler.ui.info "Removing #{output}"
        FileUtils.rm_rf(dir)
      end

      output
    end

    def check_for_activated_spec!(spec)
      return unless activated_spec = Bundler.rubygems.loaded_specs(spec.name)
      return if activated_spec.version == spec.version

      suggestion = if activated_spec.default_gem?
        "Since #{spec.name} is a default gem, you can either remove your dependency on it" \
        " or try updating to a newer version of bundler that supports #{spec.name} as a default gem."
      else
        "Prepending `bundle exec` to your command may solve this."
      end

      e = Gem::LoadError.new "You have already activated #{activated_spec.name} #{activated_spec.version}, " \
                             "but your Gemfile requires #{spec.name} #{spec.version}. #{suggestion}"
      e.name = spec.name
      if e.respond_to?(:requirement=)
        e.requirement = Gem::Requirement.new(spec.version.to_s)
      else
        e.version_requirement = Gem::Requirement.new(spec.version.to_s)
      end
      raise e
    end
  end
end
PK
}$[�0<[�O�O+gems/gems/bundler-2.3.27/lib/bundler/dsl.rbnu�[���# frozen_string_literal: true

require_relative "dependency"
require_relative "ruby_dsl"

module Bundler
  class Dsl
    include RubyDsl

    def self.evaluate(gemfile, lockfile, unlock)
      builder = new
      builder.eval_gemfile(gemfile)
      builder.to_definition(lockfile, unlock)
    end

    VALID_PLATFORMS = Bundler::Dependency::PLATFORM_MAP.keys.freeze

    VALID_KEYS = %w[group groups git path glob name branch ref tag require submodules
                    platform platforms type source install_if gemfile force_ruby_platform].freeze

    GITHUB_PULL_REQUEST_URL = %r{\Ahttps://github\.com/([A-Za-z0-9_\-\.]+/[A-Za-z0-9_\-\.]+)/pull/(\d+)\z}.freeze

    attr_reader :gemspecs
    attr_accessor :dependencies

    def initialize
      @source               = nil
      @sources              = SourceList.new
      @git_sources          = {}
      @dependencies         = []
      @groups               = []
      @install_conditionals = []
      @optional_groups      = []
      @platforms            = []
      @env                  = nil
      @ruby_version         = nil
      @gemspecs             = []
      @gemfile              = nil
      @gemfiles             = []
      add_git_sources
    end

    def eval_gemfile(gemfile, contents = nil)
      expanded_gemfile_path = Pathname.new(gemfile).expand_path(@gemfile && @gemfile.parent)
      original_gemfile = @gemfile
      @gemfile = expanded_gemfile_path
      @gemfiles << expanded_gemfile_path
      contents ||= Bundler.read_file(@gemfile.to_s)
      instance_eval(contents.dup.tap {|x| x.untaint if RUBY_VERSION < "2.7" }, gemfile.to_s, 1)
    rescue Exception => e # rubocop:disable Lint/RescueException
      message = "There was an error " \
        "#{e.is_a?(GemfileEvalError) ? "evaluating" : "parsing"} " \
        "`#{File.basename gemfile.to_s}`: #{e.message}"

      raise DSLError.new(message, gemfile, e.backtrace, contents)
    ensure
      @gemfile = original_gemfile
    end

    def gemspec(opts = nil)
      opts ||= {}
      path              = opts[:path] || "."
      glob              = opts[:glob]
      name              = opts[:name]
      development_group = opts[:development_group] || :development
      expanded_path     = gemfile_root.join(path)

      gemspecs = Gem::Util.glob_files_in_dir("{,*}.gemspec", expanded_path).map {|g| Bundler.load_gemspec(g) }.compact
      gemspecs.reject! {|s| s.name != name } if name
      specs_by_name_and_version = gemspecs.group_by {|s| [s.name, s.version] }

      case specs_by_name_and_version.size
      when 1
        specs = specs_by_name_and_version.values.first
        spec = specs.find {|s| s.match_platform(Bundler.local_platform) } || specs.first

        @gemspecs << spec

        gem spec.name, :name => spec.name, :path => path, :glob => glob

        group(development_group) do
          spec.development_dependencies.each do |dep|
            gem dep.name, *(dep.requirement.as_list + [:type => :development])
          end
        end
      when 0
        raise InvalidOption, "There are no gemspecs at #{expanded_path}"
      else
        raise InvalidOption, "There are multiple gemspecs at #{expanded_path}. " \
          "Please use the :name option to specify which one should be used"
      end
    end

    def gem(name, *args)
      options = args.last.is_a?(Hash) ? args.pop.dup : {}
      options["gemfile"] = @gemfile
      version = args || [">= 0"]

      normalize_options(name, version, options)

      dep = Dependency.new(name, version, options)

      # if there's already a dependency with this name we try to prefer one
      if current = @dependencies.find {|d| d.name == dep.name }
        deleted_dep = @dependencies.delete(current) if current.type == :development

        unless deleted_dep
          if current.requirement != dep.requirement
            return if dep.type == :development

            update_prompt = ""

            if File.basename(@gemfile) == Injector::INJECTED_GEMS
              if dep.requirements_list.include?(">= 0") && !current.requirements_list.include?(">= 0")
                update_prompt = ". Gem already added"
              else
                update_prompt = ". If you want to update the gem version, run `bundle update #{current.name}`"

                update_prompt += ". You may also need to change the version requirement specified in the Gemfile if it's too restrictive." unless current.requirements_list.include?(">= 0")
              end
            end

            raise GemfileError, "You cannot specify the same gem twice with different version requirements.\n" \
                            "You specified: #{current.name} (#{current.requirement}) and #{dep.name} (#{dep.requirement})" \
                             "#{update_prompt}"
          elsif current.source != dep.source
            return if dep.type == :development
            raise GemfileError, "You cannot specify the same gem twice coming from different sources.\n" \
                            "You specified that #{dep.name} (#{dep.requirement}) should come from " \
                            "#{current.source || "an unspecified source"} and #{dep.source}\n"
          else
            Bundler.ui.warn "Your Gemfile lists the gem #{current.name} (#{current.requirement}) more than once.\n" \
                            "You should probably keep only one of them.\n" \
                            "Remove any duplicate entries and specify the gem only once.\n" \
                            "While it's not a problem now, it could cause errors if you change the version of one of them later."
          end
        end
      end

      @dependencies << dep
    end

    def source(source, *args, &blk)
      options = args.last.is_a?(Hash) ? args.pop.dup : {}
      options = normalize_hash(options)
      source = normalize_source(source)

      if options.key?("type")
        options["type"] = options["type"].to_s
        unless Plugin.source?(options["type"])
          raise InvalidOption, "No plugin sources available for #{options["type"]}"
        end

        unless block_given?
          raise InvalidOption, "You need to pass a block to #source with :type option"
        end

        source_opts = options.merge("uri" => source)
        with_source(@sources.add_plugin_source(options["type"], source_opts), &blk)
      elsif block_given?
        with_source(@sources.add_rubygems_source("remotes" => source), &blk)
      else
        @sources.add_global_rubygems_remote(source)
      end
    end

    def git_source(name, &block)
      unless block_given?
        raise InvalidOption, "You need to pass a block to #git_source"
      end

      if valid_keys.include?(name.to_s)
        raise InvalidOption, "You cannot use #{name} as a git source. It " \
          "is a reserved key. Reserved keys are: #{valid_keys.join(", ")}"
      end

      @git_sources[name.to_s] = block
    end

    def path(path, options = {}, &blk)
      source_options = normalize_hash(options).merge(
        "path" => Pathname.new(path),
        "root_path" => gemfile_root,
        "gemspec" => gemspecs.find {|g| g.name == options["name"] }
      )

      source_options["global"] = true unless block_given?

      source = @sources.add_path_source(source_options)
      with_source(source, &blk)
    end

    def git(uri, options = {}, &blk)
      unless block_given?
        msg = "You can no longer specify a git source by itself. Instead, \n" \
              "either use the :git option on a gem, or specify the gems that \n" \
              "bundler should find in the git source by passing a block to \n" \
              "the git method, like: \n\n" \
              "  git 'git://github.com/rails/rails.git' do\n" \
              "    gem 'rails'\n" \
              "  end"
        raise DeprecatedError, msg
      end

      with_source(@sources.add_git_source(normalize_hash(options).merge("uri" => uri)), &blk)
    end

    def github(repo, options = {})
      raise ArgumentError, "GitHub sources require a block" unless block_given?
      github_uri  = @git_sources["github"].call(repo)
      git_options = normalize_hash(options).merge("uri" => github_uri)
      git_source  = @sources.add_git_source(git_options)
      with_source(git_source) { yield }
    end

    def to_definition(lockfile, unlock)
      check_primary_source_safety
      Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version, @optional_groups, @gemfiles)
    end

    def group(*args, &blk)
      options = args.last.is_a?(Hash) ? args.pop.dup : {}
      normalize_group_options(options, args)

      @groups.concat args

      if options["optional"]
        optional_groups = args - @optional_groups
        @optional_groups.concat optional_groups
      end

      yield
    ensure
      args.each { @groups.pop }
    end

    def install_if(*args)
      @install_conditionals.concat args
      yield
    ensure
      args.each { @install_conditionals.pop }
    end

    def platforms(*platforms)
      @platforms.concat platforms
      yield
    ensure
      platforms.each { @platforms.pop }
    end
    alias_method :platform, :platforms

    def env(name)
      old = @env
      @env = name
      yield
    ensure
      @env = old
    end

    def plugin(*args)
      # Pass on
    end

    def method_missing(name, *args)
      raise GemfileError, "Undefined local variable or method `#{name}' for Gemfile"
    end

    def check_primary_source_safety
      check_path_source_safety
      check_rubygems_source_safety
    end

    private

    def add_git_sources
      git_source(:github) do |repo_name|
        if repo_name =~ GITHUB_PULL_REQUEST_URL
          {
            "git" => "https://github.com/#{$1}.git",
            "branch" => "refs/pull/#{$2}/head",
            "ref" => nil,
            "tag" => nil,
          }
        else
          repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
          "https://github.com/#{repo_name}.git"
        end
      end

      git_source(:gist) do |repo_name|
        "https://gist.github.com/#{repo_name}.git"
      end

      git_source(:bitbucket) do |repo_name|
        user_name, repo_name = repo_name.split("/")
        repo_name ||= user_name
        "https://#{user_name}@bitbucket.org/#{user_name}/#{repo_name}.git"
      end
    end

    def with_source(source)
      old_source = @source
      if block_given?
        @source = source
        yield
      end
      source
    ensure
      @source = old_source
    end

    def normalize_hash(opts)
      opts.keys.each do |k|
        opts[k.to_s] = opts.delete(k) unless k.is_a?(String)
      end
      opts
    end

    def valid_keys
      @valid_keys ||= VALID_KEYS
    end

    def normalize_options(name, version, opts)
      if name.is_a?(Symbol)
        raise GemfileError, %(You need to specify gem names as Strings. Use 'gem "#{name}"' instead)
      end
      if name =~ /\s/
        raise GemfileError, %('#{name}' is not a valid gem name because it contains whitespace)
      end
      raise GemfileError, %(an empty gem name is not valid) if name.empty?

      normalize_hash(opts)

      git_names = @git_sources.keys.map(&:to_s)
      validate_keys("gem '#{name}'", opts, valid_keys + git_names)

      groups = @groups.dup
      opts["group"] = opts.delete("groups") || opts["group"]
      groups.concat Array(opts.delete("group"))
      groups = [:default] if groups.empty?

      install_if = @install_conditionals.dup
      install_if.concat Array(opts.delete("install_if"))
      install_if = install_if.reduce(true) do |memo, val|
        memo && (val.respond_to?(:call) ? val.call : val)
      end

      platforms = @platforms.dup
      opts["platforms"] = opts["platform"] || opts["platforms"]
      platforms.concat Array(opts.delete("platforms"))
      platforms.map!(&:to_sym)
      platforms.each do |p|
        next if VALID_PLATFORMS.include?(p)
        raise GemfileError, "`#{p}` is not a valid platform. The available options are: #{VALID_PLATFORMS.inspect}"
      end

      # Save sources passed in a key
      if opts.key?("source")
        source = normalize_source(opts["source"])
        opts["source"] = @sources.add_rubygems_source("remotes" => source)
      end

      git_name = (git_names & opts.keys).last
      if @git_sources[git_name]
        git_opts = @git_sources[git_name].call(opts[git_name])
        git_opts = { "git" => git_opts } if git_opts.is_a?(String)
        opts.merge!(git_opts) do |key, _gemfile_value, _git_source_value|
          raise GemfileError, %(The :#{key} option can't be used with `#{git_name}: #{opts[git_name].inspect}`)
        end
      end

      %w[git path].each do |type|
        next unless param = opts[type]
        if version.first && version.first =~ /^\s*=?\s*(\d[^\s]*)\s*$/
          options = opts.merge("name" => name, "version" => $1)
        else
          options = opts.dup
        end
        source = send(type, param, options) {}
        opts["source"] = source
      end

      opts["source"]         ||= @source
      opts["env"]            ||= @env
      opts["platforms"]      = platforms.dup
      opts["group"]          = groups
      opts["should_include"] = install_if
    end

    def normalize_group_options(opts, groups)
      normalize_hash(opts)

      groups = groups.map {|group| ":#{group}" }.join(", ")
      validate_keys("group #{groups}", opts, %w[optional])

      opts["optional"] ||= false
    end

    def validate_keys(command, opts, valid_keys)
      invalid_keys = opts.keys - valid_keys

      git_source = opts.keys & @git_sources.keys.map(&:to_s)
      if opts["branch"] && !(opts["git"] || opts["github"] || git_source.any?)
        raise GemfileError, %(The `branch` option for `#{command}` is not allowed. Only gems with a git source can specify a branch)
      end

      return true unless invalid_keys.any?

      message = String.new
      message << "You passed #{invalid_keys.map {|k| ":" + k }.join(", ")} "
      message << if invalid_keys.size > 1
        "as options for #{command}, but they are invalid."
      else
        "as an option for #{command}, but it is invalid."
      end

      message << " Valid options are: #{valid_keys.join(", ")}."
      message << " You may be able to resolve this by upgrading Bundler to the newest version."
      raise InvalidOption, message
    end

    def normalize_source(source)
      case source
      when :gemcutter, :rubygems, :rubyforge
        Bundler::SharedHelpers.major_deprecation 2, "The source :#{source} is deprecated because HTTP " \
          "requests are insecure.\nPlease change your source to 'https://" \
          "rubygems.org' if possible, or 'http://rubygems.org' if not."
        "http://rubygems.org"
      when String
        source
      else
        raise GemfileError, "Unknown source '#{source}'"
      end
    end

    def check_path_source_safety
      return if @sources.global_path_source.nil?

      msg = "You can no longer specify a path source by itself. Instead, \n" \
              "either use the :path option on a gem, or specify the gems that \n" \
              "bundler should find in the path source by passing a block to \n" \
              "the path method, like: \n\n" \
              "    path 'dir/containing/rails' do\n" \
              "      gem 'rails'\n" \
              "    end\n\n"

      SharedHelpers.major_deprecation(2, msg.strip)
    end

    def check_rubygems_source_safety
      if @sources.implicit_global_source?
        implicit_global_source_warning
      elsif @sources.aggregate_global_source?
        multiple_global_source_warning
      end
    end

    def implicit_global_source_warning
      Bundler::SharedHelpers.major_deprecation 2, "This Gemfile does not include an explicit global source. " \
        "Not using an explicit global source may result in a different lockfile being generated depending on " \
        "the gems you have installed locally before bundler is run. " \
        "Instead, define a global source in your Gemfile like this: source \"https://rubygems.org\"."
    end

    def multiple_global_source_warning
      if Bundler.feature_flag.bundler_3_mode?
        msg = "This Gemfile contains multiple global sources. " \
          "Each source after the first must include a block to indicate which gems " \
          "should come from that source"
        raise GemfileEvalError, msg
      else
        Bundler::SharedHelpers.major_deprecation 2, "Your Gemfile contains multiple global sources. " \
          "Using `source` more than once without a block is a security risk, and " \
          "may result in installing unexpected gems. To resolve this warning, use " \
          "a block to indicate which gems should come from the secondary source."
      end
    end

    class DSLError < GemfileError
      # @return [String] the description that should be presented to the user.
      #
      attr_reader :description

      # @return [String] the path of the dsl file that raised the exception.
      #
      attr_reader :dsl_path

      # @return [Exception] the backtrace of the exception raised by the
      #         evaluation of the dsl file.
      #
      attr_reader :backtrace

      # @param [Exception] backtrace @see backtrace
      # @param [String]    dsl_path  @see dsl_path
      #
      def initialize(description, dsl_path, backtrace, contents = nil)
        @status_code = $!.respond_to?(:status_code) && $!.status_code

        @description = description
        @dsl_path    = dsl_path
        @backtrace   = backtrace
        @contents    = contents
      end

      def status_code
        @status_code || super
      end

      # @return [String] the contents of the DSL that cause the exception to
      #         be raised.
      #
      def contents
        @contents ||= dsl_path && File.exist?(dsl_path) && File.read(dsl_path)
      end

      # The message of the exception reports the content of podspec for the
      # line that generated the original exception.
      #
      # @example Output
      #
      #   Invalid podspec at `RestKit.podspec` - undefined method
      #   `exclude_header_search_paths=' for #<Pod::Specification for
      #   `RestKit/Network (0.9.3)`>
      #
      #       from spec-repos/master/RestKit/0.9.3/RestKit.podspec:36
      #       -------------------------------------------
      #           # because it would break: #import <CoreData/CoreData.h>
      #    >      ns.exclude_header_search_paths = 'Code/RestKit.h'
      #         end
      #       -------------------------------------------
      #
      # @return [String] the message of the exception.
      #
      def to_s
        @to_s ||= begin
          trace_line, description = parse_line_number_from_description

          m = String.new("\n[!] ")
          m << description
          m << ". Bundler cannot continue.\n"

          return m unless backtrace && dsl_path && contents

          trace_line = backtrace.find {|l| l.include?(dsl_path.to_s) } || trace_line
          return m unless trace_line
          line_numer = trace_line.split(":")[1].to_i - 1
          return m unless line_numer

          lines      = contents.lines.to_a
          indent     = " #  "
          indicator  = indent.tr("#", ">")
          first_line = line_numer.zero?
          last_line  = (line_numer == (lines.count - 1))

          m << "\n"
          m << "#{indent}from #{trace_line.gsub(/:in.*$/, "")}\n"
          m << "#{indent}-------------------------------------------\n"
          m << "#{indent}#{lines[line_numer - 1]}" unless first_line
          m << "#{indicator}#{lines[line_numer]}"
          m << "#{indent}#{lines[line_numer + 1]}" unless last_line
          m << "\n" unless m.end_with?("\n")
          m << "#{indent}-------------------------------------------\n"
        end
      end

      private

      def parse_line_number_from_description
        description = self.description
        if dsl_path && description =~ /((#{Regexp.quote File.expand_path(dsl_path)}|#{Regexp.quote dsl_path.to_s}):\d+)/
          trace_line = Regexp.last_match[1]
          description = description.sub(/\n.*\n(\.\.\.)? *\^~+$/, "").sub(/#{Regexp.quote trace_line}:\s*/, "").sub("\n", " - ")
        end
        [trace_line, description]
      end
    end

    def gemfile_root
      @gemfile ||= Bundler.default_gemfile
      @gemfile.dirname
    end
  end
end
PK
}$[6�e$ll1gems/gems/bundler-2.3.27/lib/bundler/deprecate.rbnu�[���# frozen_string_literal: true

begin
  require "rubygems/deprecate"
rescue LoadError
  # it's fine if it doesn't exist on the current RubyGems...
  nil
end

module Bundler
  # If Bundler::Deprecate is an autoload constant, we need to define it
  if defined?(Bundler::Deprecate) && !autoload?(:Deprecate)
    # nothing to do!
  elsif defined? ::Deprecate
    Deprecate = ::Deprecate
  elsif defined? Gem::Deprecate
    Deprecate = Gem::Deprecate
  else
    class Deprecate
    end
  end

  unless Deprecate.respond_to?(:skip_during)
    def Deprecate.skip_during
      original = skip
      self.skip = true
      yield
    ensure
      self.skip = original
    end
  end

  unless Deprecate.respond_to?(:skip)
    def Deprecate.skip
      @skip ||= false
    end
  end

  unless Deprecate.respond_to?(:skip=)
    def Deprecate.skip=(skip)
      @skip = skip
    end
  end
end
PK
}$[7�1�GG6gems/gems/bundler-2.3.27/lib/bundler/match_platform.rbnu�[���# frozen_string_literal: true

require_relative "gem_helpers"

module Bundler
  module MatchPlatform
    include GemHelpers

    def match_platform(p)
      MatchPlatform.platforms_match?(platform, p)
    end

    def self.platforms_match?(gemspec_platform, local_platform)
      return true if gemspec_platform.nil?
      return true if Gem::Platform::RUBY == gemspec_platform
      return true if local_platform == gemspec_platform
      gemspec_platform = Gem::Platform.new(gemspec_platform)
      return true if gemspec_platform === local_platform

      false
    end
  end
end
PK
}$[/k��*�*6gems/gems/bundler-2.3.27/lib/bundler/shared_helpers.rbnu�[���# frozen_string_literal: true

require "pathname"
require "rbconfig"

require_relative "version"
require_relative "constants"
require_relative "rubygems_integration"
require_relative "current_ruby"

module Bundler
  module SharedHelpers
    def root
      gemfile = find_gemfile
      raise GemfileNotFound, "Could not locate Gemfile" unless gemfile
      Pathname.new(gemfile).tap {|x| x.untaint if RUBY_VERSION < "2.7" }.expand_path.parent
    end

    def default_gemfile
      gemfile = find_gemfile
      raise GemfileNotFound, "Could not locate Gemfile" unless gemfile
      Pathname.new(gemfile).tap {|x| x.untaint if RUBY_VERSION < "2.7" }.expand_path
    end

    def default_lockfile
      gemfile = default_gemfile

      case gemfile.basename.to_s
      when "gems.rb" then Pathname.new(gemfile.sub(/.rb$/, ".locked"))
      else Pathname.new("#{gemfile}.lock")
      end.tap {|x| x.untaint if RUBY_VERSION < "2.7" }
    end

    def default_bundle_dir
      bundle_dir = find_directory(".bundle")
      return nil unless bundle_dir

      bundle_dir = Pathname.new(bundle_dir)

      global_bundle_dir = Bundler.user_home.join(".bundle")
      return nil if bundle_dir == global_bundle_dir

      bundle_dir
    end

    def in_bundle?
      find_gemfile
    end

    def chdir(dir, &blk)
      Bundler.rubygems.ext_lock.synchronize do
        Dir.chdir dir, &blk
      end
    end

    def pwd
      Bundler.rubygems.ext_lock.synchronize do
        Pathname.pwd
      end
    end

    def with_clean_git_env(&block)
      keys    = %w[GIT_DIR GIT_WORK_TREE]
      old_env = keys.inject({}) do |h, k|
        h.update(k => ENV[k])
      end

      keys.each {|key| ENV.delete(key) }

      block.call
    ensure
      keys.each {|key| ENV[key] = old_env[key] }
    end

    def set_bundle_environment
      set_bundle_variables
      set_path
      set_rubyopt
      set_rubylib
    end

    # Rescues permissions errors raised by file system operations
    # (ie. Errno:EACCESS, Errno::EAGAIN) and raises more friendly errors instead.
    #
    # @param path [String] the path that the action will be attempted to
    # @param action [Symbol, #to_s] the type of operation that will be
    #   performed. For example: :write, :read, :exec
    #
    # @yield path
    #
    # @raise [Bundler::PermissionError] if Errno:EACCES is raised in the
    #   given block
    # @raise [Bundler::TemporaryResourceError] if Errno:EAGAIN is raised in the
    #   given block
    #
    # @example
    #   filesystem_access("vendor/cache", :write) do
    #     FileUtils.mkdir_p("vendor/cache")
    #   end
    #
    # @see {Bundler::PermissionError}
    def filesystem_access(path, action = :write, &block)
      yield(path.dup.tap {|x| x.untaint if RUBY_VERSION < "2.7" })
    rescue Errno::EACCES
      raise PermissionError.new(path, action)
    rescue Errno::EAGAIN
      raise TemporaryResourceError.new(path, action)
    rescue Errno::EPROTO
      raise VirtualProtocolError.new
    rescue Errno::ENOSPC
      raise NoSpaceOnDeviceError.new(path, action)
    rescue Errno::ENOTSUP
      raise OperationNotSupportedError.new(path, action)
    rescue Errno::EEXIST, Errno::ENOENT
      raise
    rescue SystemCallError => e
      raise GenericSystemCallError.new(e, "There was an error accessing `#{path}`.")
    end

    def major_deprecation(major_version, message, print_caller_location: false)
      if print_caller_location
        caller_location = caller_locations(2, 2).first
        message = "#{message} (called at #{caller_location.path}:#{caller_location.lineno})"
      end

      bundler_major_version = Bundler.bundler_major_version
      if bundler_major_version > major_version
        require_relative "errors"
        raise DeprecatedError, "[REMOVED] #{message}"
      end

      return unless bundler_major_version >= major_version && prints_major_deprecations?
      Bundler.ui.warn("[DEPRECATED] #{message}")
    end

    def print_major_deprecations!
      multiple_gemfiles = search_up(".") do |dir|
        gemfiles = gemfile_names.select {|gf| File.file? File.expand_path(gf, dir) }
        next if gemfiles.empty?
        break gemfiles.size != 1
      end
      return unless multiple_gemfiles
      message = "Multiple gemfiles (gems.rb and Gemfile) detected. " \
                "Make sure you remove Gemfile and Gemfile.lock since bundler is ignoring them in favor of gems.rb and gems.locked."
      Bundler.ui.warn message
    end

    def ensure_same_dependencies(spec, old_deps, new_deps)
      new_deps = new_deps.reject {|d| d.type == :development }
      old_deps = old_deps.reject {|d| d.type == :development }

      without_type = proc {|d| Gem::Dependency.new(d.name, d.requirements_list.sort) }
      new_deps.map!(&without_type)
      old_deps.map!(&without_type)

      extra_deps = new_deps - old_deps
      return if extra_deps.empty?

      Bundler.ui.debug "#{spec.full_name} from #{spec.remote} has either corrupted API or lockfile dependencies" \
        " (was expecting #{old_deps.map(&:to_s)}, but the real spec has #{new_deps.map(&:to_s)})"
      raise APIResponseMismatchError,
        "Downloading #{spec.full_name} revealed dependencies not in the API or the lockfile (#{extra_deps.join(", ")})." \
        "\nEither installing with `--full-index` or running `bundle update #{spec.name}` should fix the problem."
    end

    def pretty_dependency(dep)
      msg = String.new(dep.name)
      msg << " (#{dep.requirement})" unless dep.requirement == Gem::Requirement.default

      if dep.is_a?(Bundler::Dependency)
        platform_string = dep.platforms.join(", ")
        msg << " " << platform_string if !platform_string.empty? && platform_string != Gem::Platform::RUBY
      end

      msg
    end

    def md5_available?
      return @md5_available if defined?(@md5_available)
      @md5_available = begin
        require "openssl"
        ::OpenSSL::Digest.digest("MD5", "")
        true
      rescue LoadError
        true
      rescue ::OpenSSL::Digest::DigestError
        false
      end
    end

    def digest(name)
      require "digest"
      Digest(name)
    end

    def write_to_gemfile(gemfile_path, contents)
      filesystem_access(gemfile_path) {|g| File.open(g, "w") {|file| file.puts contents } }
    end

    private

    def validate_bundle_path
      path_separator = Bundler.rubygems.path_separator
      return unless Bundler.bundle_path.to_s.split(path_separator).size > 1
      message = "Your bundle path contains text matching #{path_separator.inspect}, " \
                "which is the path separator for your system. Bundler cannot " \
                "function correctly when the Bundle path contains the " \
                "system's PATH separator. Please change your " \
                "bundle path to not match #{path_separator.inspect}." \
                "\nYour current bundle path is '#{Bundler.bundle_path}'."
      raise Bundler::PathError, message
    end

    def find_gemfile
      given = ENV["BUNDLE_GEMFILE"]
      return given if given && !given.empty?
      find_file(*gemfile_names)
    end

    def gemfile_names
      ["gems.rb", "Gemfile"]
    end

    def find_file(*names)
      search_up(*names) do |filename|
        return filename if File.file?(filename)
      end
    end

    def find_directory(*names)
      search_up(*names) do |dirname|
        return dirname if File.directory?(dirname)
      end
    end

    def search_up(*names)
      previous = nil
      current  = File.expand_path(SharedHelpers.pwd).tap {|x| x.untaint if RUBY_VERSION < "2.7" }

      until !File.directory?(current) || current == previous
        if ENV["BUNDLER_SPEC_RUN"]
          # avoid stepping above the tmp directory when testing
          gemspec = if ENV["GEM_COMMAND"]
            # for Ruby Core
            "lib/bundler/bundler.gemspec"
          else
            "bundler.gemspec"
          end

          # avoid stepping above the tmp directory when testing
          return nil if File.file?(File.join(current, gemspec))
        end

        names.each do |name|
          filename = File.join(current, name)
          yield filename
        end
        previous = current
        current = File.expand_path("..", current)
      end
    end

    def set_env(key, value)
      raise ArgumentError, "new key #{key}" unless EnvironmentPreserver::BUNDLER_KEYS.include?(key)
      orig_key = "#{EnvironmentPreserver::BUNDLER_PREFIX}#{key}"
      orig = ENV[key]
      orig ||= EnvironmentPreserver::INTENTIONALLY_NIL
      ENV[orig_key] ||= orig

      ENV[key] = value
    end
    public :set_env

    def set_bundle_variables
      # bundler exe & lib folders have same root folder, typical gem installation
      exe_file = File.expand_path("../../exe/bundle", __dir__)

      # for Ruby core repository testing
      exe_file = File.expand_path("../../libexec/bundle", __dir__) unless File.exist?(exe_file)

      # bundler is a default gem, exe path is separate
      exe_file = Bundler.rubygems.bin_path("bundler", "bundle", VERSION) unless File.exist?(exe_file)

      Bundler::SharedHelpers.set_env "BUNDLE_BIN_PATH", exe_file
      Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", find_gemfile.to_s
      Bundler::SharedHelpers.set_env "BUNDLER_VERSION", Bundler::VERSION
    end

    def set_path
      validate_bundle_path
      paths = (ENV["PATH"] || "").split(File::PATH_SEPARATOR)
      paths.unshift "#{Bundler.bundle_path}/bin"
      Bundler::SharedHelpers.set_env "PATH", paths.uniq.join(File::PATH_SEPARATOR)
    end

    def set_rubyopt
      rubyopt = [ENV["RUBYOPT"]].compact
      setup_require = "-r#{File.expand_path("setup", __dir__)}"
      return if !rubyopt.empty? && rubyopt.first =~ /#{setup_require}/
      rubyopt.unshift setup_require
      Bundler::SharedHelpers.set_env "RUBYOPT", rubyopt.join(" ")
    end

    def set_rubylib
      rubylib = (ENV["RUBYLIB"] || "").split(File::PATH_SEPARATOR)
      rubylib.unshift bundler_ruby_lib unless RbConfig::CONFIG["rubylibdir"] == bundler_ruby_lib
      Bundler::SharedHelpers.set_env "RUBYLIB", rubylib.uniq.join(File::PATH_SEPARATOR)
    end

    def bundler_ruby_lib
      File.expand_path("..", __dir__)
    end

    def clean_load_path
      loaded_gem_paths = Bundler.rubygems.loaded_gem_paths

      $LOAD_PATH.reject! do |p|
        resolved_path = resolve_path(p)
        next if $LOADED_FEATURES.any? {|lf| lf.start_with?(resolved_path) }
        loaded_gem_paths.delete(p)
      end
      $LOAD_PATH.uniq!
    end

    def resolve_path(path)
      expanded = File.expand_path(path)
      return expanded unless File.exist?(expanded)

      File.realpath(expanded)
    end

    def prints_major_deprecations?
      require_relative "../bundler"
      return false if Bundler.settings[:silence_deprecations]
      require_relative "deprecate"
      return false if Bundler::Deprecate.skip
      true
    end

    extend self
  end
end
PK
}$[�����0gems/gems/bundler-2.3.27/lib/bundler/ruby_dsl.rbnu�[���# frozen_string_literal: true

module Bundler
  module RubyDsl
    def ruby(*ruby_version)
      options = ruby_version.last.is_a?(Hash) ? ruby_version.pop : {}
      ruby_version.flatten!
      raise GemfileError, "Please define :engine_version" if options[:engine] && options[:engine_version].nil?
      raise GemfileError, "Please define :engine" if options[:engine_version] && options[:engine].nil?

      if options[:engine] == "ruby" && options[:engine_version] &&
         ruby_version != Array(options[:engine_version])
        raise GemfileEvalError, "ruby_version must match the :engine_version for MRI"
      end
      @ruby_version = RubyVersion.new(ruby_version, options[:patchlevel], options[:engine], options[:engine_version])
    end
  end
end
PK
}$[��-
-
;gems/gems/bundler-2.3.27/lib/bundler/resolver/spec_group.rbnu�[���# frozen_string_literal: true

module Bundler
  class Resolver
    class SpecGroup
      attr_accessor :name, :version, :source
      attr_accessor :activated_platforms, :force_ruby_platform

      def initialize(specs, relevant_platforms)
        @exemplary_spec = specs.first
        @name = @exemplary_spec.name
        @version = @exemplary_spec.version
        @source = @exemplary_spec.source

        @activated_platforms = relevant_platforms
        @specs = specs
      end

      def to_specs
        @specs.map do |s|
          lazy_spec = LazySpecification.new(name, version, s.platform, source)
          lazy_spec.force_ruby_platform = force_ruby_platform
          lazy_spec.dependencies.replace s.dependencies
          lazy_spec
        end
      end

      def to_s
        activated_platforms_string = sorted_activated_platforms.join(", ")
        "#{name} (#{version}) (#{activated_platforms_string})"
      end

      def dependencies_for_activated_platforms
        @dependencies_for_activated_platforms ||= @specs.map do |spec|
          __dependencies(spec) + metadata_dependencies(spec)
        end.flatten.uniq
      end

      def ==(other)
        return unless other.is_a?(SpecGroup)
        name == other.name &&
          version == other.version &&
          sorted_activated_platforms == other.sorted_activated_platforms &&
          source == other.source
      end

      def eql?(other)
        return unless other.is_a?(SpecGroup)
        name.eql?(other.name) &&
          version.eql?(other.version) &&
          sorted_activated_platforms.eql?(other.sorted_activated_platforms) &&
          source.eql?(other.source)
      end

      def hash
        name.hash ^ version.hash ^ sorted_activated_platforms.hash ^ source.hash
      end

      protected

      def sorted_activated_platforms
        activated_platforms.sort_by(&:to_s)
      end

      private

      def __dependencies(spec)
        dependencies = []
        spec.dependencies.each do |dep|
          next if dep.type == :development
          dependencies << Dependency.new(dep.name, dep.requirement)
        end
        dependencies
      end

      def metadata_dependencies(spec)
        return [] if spec.is_a?(LazySpecification)

        [
          metadata_dependency("Ruby", spec.required_ruby_version),
          metadata_dependency("RubyGems", spec.required_rubygems_version),
        ].compact
      end

      def metadata_dependency(name, requirement)
        return if requirement.nil? || requirement.none?

        Dependency.new("#{name}\0", requirement)
      end
    end
  end
end
PK
}$[>��T��5gems/gems/bundler-2.3.27/lib/bundler/resolver/base.rbnu�[���# frozen_string_literal: true

module Bundler
  class Resolver
    class Base
      def initialize(base, additional_base_requirements)
        @base = base
        @additional_base_requirements = additional_base_requirements
      end

      def [](name)
        @base[name]
      end

      def delete(spec)
        @base.delete(spec)
      end

      def base_requirements
        @base_requirements ||= build_base_requirements
      end

      def unlock_deps(deps)
        exact, lower_bound = deps.partition(&:specific?)

        exact.each do |exact_dep|
          @base.delete_by_name_and_version(exact_dep.name, exact_dep.requirement.requirements.first.last)
        end

        lower_bound.each do |lower_bound_dep|
          @additional_base_requirements.delete(lower_bound_dep)
        end

        @base_requirements = nil
      end

      private

      def build_base_requirements
        base_requirements = {}
        @base.each do |ls|
          dep = Dependency.new(ls.name, ls.version)
          base_requirements[ls.name] = dep
        end
        @additional_base_requirements.each {|d| base_requirements[d.name] = d }
        base_requirements
      end
    end
  end
end
PK
}$[����5�50gems/gems/bundler-2.3.27/lib/bundler/settings.rbnu�[���# frozen_string_literal: true

module Bundler
  class Settings
    autoload :Mirror,  File.expand_path("mirror", __dir__)
    autoload :Mirrors, File.expand_path("mirror", __dir__)
    autoload :Validator, File.expand_path("settings/validator", __dir__)

    BOOL_KEYS = %w[
      allow_deployment_source_credential_changes
      allow_offline_install
      auto_clean_without_path
      auto_install
      cache_all
      cache_all_platforms
      clean
      default_install_uses_path
      deployment
      disable_checksum_validation
      disable_exec_load
      disable_local_branch_check
      disable_local_revision_check
      disable_shared_gems
      disable_version_check
      force_ruby_platform
      forget_cli_options
      frozen
      gem.changelog
      gem.coc
      gem.mit
      git.allow_insecure
      global_gem_cache
      ignore_messages
      init_gems_rb
      inline
      no_install
      no_prune
      path_relative_to_cwd
      path.system
      plugins
      prefer_patch
      print_only_version_number
      setup_makes_kernel_gem_public
      silence_deprecations
      silence_root_warning
      suppress_install_using_messages
      update_requires_all_flag
    ].freeze

    NUMBER_KEYS = %w[
      jobs
      redirect
      retry
      ssl_verify_mode
      timeout
    ].freeze

    ARRAY_KEYS = %w[
      only
      with
      without
    ].freeze

    STRING_KEYS = %w[
      bin
      cache_path
      console
      gem.ci
      gem.github_username
      gem.linter
      gem.rubocop
      gem.test
      gemfile
      path
      shebang
      system_bindir
      trust-policy
    ].freeze

    DEFAULT_CONFIG = {
      "BUNDLE_SILENCE_DEPRECATIONS" => false,
      "BUNDLE_DISABLE_VERSION_CHECK" => true,
      "BUNDLE_PREFER_PATCH" => false,
      "BUNDLE_REDIRECT" => 5,
      "BUNDLE_RETRY" => 3,
      "BUNDLE_TIMEOUT" => 10,
    }.freeze

    def initialize(root = nil)
      @root            = root
      @local_config    = load_config(local_config_file)
      @env_config      = ENV.to_h.select {|key, _value| key =~ /\ABUNDLE_.+/ }
      @global_config   = load_config(global_config_file)
      @temporary       = {}
    end

    def [](name)
      key = key_for(name)
      value = configs.values.map {|config| config[key] }.compact.first

      converted_value(value, name)
    end

    def set_command_option(key, value)
      if Bundler.feature_flag.forget_cli_options?
        temporary(key => value)
        value
      else
        set_local(key, value)
      end
    end

    def set_command_option_if_given(key, value)
      return if value.nil?
      set_command_option(key, value)
    end

    def set_local(key, value)
      local_config_file || raise(GemfileNotFound, "Could not locate Gemfile")

      set_key(key, value, @local_config, local_config_file)
    end

    def temporary(update)
      existing = Hash[update.map {|k, _| [k, @temporary[key_for(k)]] }]
      update.each do |k, v|
        set_key(k, v, @temporary, nil)
      end
      return unless block_given?
      begin
        yield
      ensure
        existing.each {|k, v| set_key(k, v, @temporary, nil) }
      end
    end

    def set_global(key, value)
      set_key(key, value, @global_config, global_config_file)
    end

    def all
      keys = @temporary.keys | @global_config.keys | @local_config.keys | @env_config.keys

      keys.map do |key|
        key.sub(/^BUNDLE_/, "").gsub(/___/, "-").gsub(/__/, ".").downcase
      end.sort
    end

    def local_overrides
      repos = {}
      all.each do |k|
        repos[$'] = self[k] if k =~ /^local\./
      end
      repos
    end

    def mirror_for(uri)
      if uri.is_a?(String)
        require_relative "vendored_uri"
        uri = Bundler::URI(uri)
      end

      gem_mirrors.for(uri.to_s).uri
    end

    def credentials_for(uri)
      self[uri.to_s] || self[uri.host]
    end

    def gem_mirrors
      all.inject(Mirrors.new) do |mirrors, k|
        mirrors.parse(k, self[k]) if k.start_with?("mirror.")
        mirrors
      end
    end

    def locations(key)
      key = key_for(key)
      configs.keys.inject({}) do |partial_locations, level|
        value_on_level = configs[level][key]
        partial_locations[level] = value_on_level unless value_on_level.nil?
        partial_locations
      end
    end

    def pretty_values_for(exposed_key)
      key = key_for(exposed_key)

      locations = []

      if value = @temporary[key]
        locations << "Set for the current command: #{printable_value(value, exposed_key).inspect}"
      end

      if value = @local_config[key]
        locations << "Set for your local app (#{local_config_file}): #{printable_value(value, exposed_key).inspect}"
      end

      if value = @env_config[key]
        locations << "Set via #{key}: #{printable_value(value, exposed_key).inspect}"
      end

      if value = @global_config[key]
        locations << "Set for the current user (#{global_config_file}): #{printable_value(value, exposed_key).inspect}"
      end

      return ["You have not configured a value for `#{exposed_key}`"] if locations.empty?
      locations
    end

    def processor_count
      require "etc"
      Etc.nprocessors
    rescue StandardError
      1
    end

    # for legacy reasons, in Bundler 2, we do not respect :disable_shared_gems
    def path
      configs.each do |_level, settings|
        path = value_for("path", settings)
        path = "vendor/bundle" if value_for("deployment", settings) && path.nil?
        path_system = value_for("path.system", settings)
        disabled_shared_gems = value_for("disable_shared_gems", settings)
        next if path.nil? && path_system.nil? && disabled_shared_gems.nil?
        system_path = path_system || (disabled_shared_gems == false)
        return Path.new(path, system_path)
      end

      Path.new(nil, false)
    end

    Path = Struct.new(:explicit_path, :system_path) do
      def path
        path = base_path
        path = File.join(path, Bundler.ruby_scope) unless use_system_gems?
        path
      end

      def use_system_gems?
        return true if system_path
        return false if explicit_path
        !Bundler.feature_flag.default_install_uses_path?
      end

      def base_path
        path = explicit_path
        path ||= ".bundle" unless use_system_gems?
        path ||= Bundler.rubygems.gem_dir
        path
      end

      def base_path_relative_to_pwd
        base_path = Pathname.new(self.base_path)
        expanded_base_path = base_path.expand_path(Bundler.root)
        relative_path = expanded_base_path.relative_path_from(Pathname.pwd)
        if relative_path.to_s.start_with?("..")
          relative_path = base_path if base_path.absolute?
        else
          relative_path = Pathname.new(File.join(".", relative_path))
        end
        relative_path
      rescue ArgumentError
        expanded_base_path
      end

      def validate!
        return unless explicit_path && system_path
        path = Bundler.settings.pretty_values_for(:path)
        path.unshift(nil, "path:") unless path.empty?
        system_path = Bundler.settings.pretty_values_for("path.system")
        system_path.unshift(nil, "path.system:") unless system_path.empty?
        disable_shared_gems = Bundler.settings.pretty_values_for(:disable_shared_gems)
        disable_shared_gems.unshift(nil, "disable_shared_gems:") unless disable_shared_gems.empty?
        raise InvalidOption,
          "Using a custom path while using system gems is unsupported.\n#{path.join("\n")}\n#{system_path.join("\n")}\n#{disable_shared_gems.join("\n")}"
      end
    end

    def allow_sudo?
      key = key_for(:path)
      path_configured = @temporary.key?(key) || @local_config.key?(key)
      !path_configured
    end

    def ignore_config?
      ENV["BUNDLE_IGNORE_CONFIG"]
    end

    def app_cache_path
      @app_cache_path ||= self[:cache_path] || "vendor/cache"
    end

    def validate!
      all.each do |raw_key|
        [@local_config, @env_config, @global_config].each do |settings|
          value = value_for(raw_key, settings)
          Validator.validate!(raw_key, value, settings.dup)
        end
      end
    end

    def key_for(key)
      self.class.key_for(key)
    end

    private

    def configs
      {
        :temporary => @temporary,
        :local => @local_config,
        :env => @env_config,
        :global => @global_config,
        :default => DEFAULT_CONFIG,
      }
    end

    def value_for(name, config)
      converted_value(config[key_for(name)], name)
    end

    def parent_setting_for(name)
      split_specific_setting_for(name)[0]
    end

    def specific_gem_for(name)
      split_specific_setting_for(name)[1]
    end

    def split_specific_setting_for(name)
      name.split(".")
    end

    def is_bool(name)
      BOOL_KEYS.include?(name.to_s) || BOOL_KEYS.include?(parent_setting_for(name.to_s))
    end

    def is_string(name)
      STRING_KEYS.include?(name.to_s) || name.to_s.start_with?("local.") || name.to_s.start_with?("mirror.") || name.to_s.start_with?("build.")
    end

    def to_bool(value)
      case value
      when nil, /\A(false|f|no|n|0|)\z/i, false
        false
      else
        true
      end
    end

    def is_num(key)
      NUMBER_KEYS.include?(key.to_s)
    end

    def is_array(key)
      ARRAY_KEYS.include?(key.to_s)
    end

    def is_credential(key)
      key == "gem.push_key"
    end

    def is_userinfo(value)
      value.include?(":")
    end

    def to_array(value)
      return [] unless value
      value.tr(" ", ":").split(":").map(&:to_sym)
    end

    def array_to_s(array)
      array = Array(array)
      return nil if array.empty?
      array.join(":").tr(" ", ":")
    end

    def set_key(raw_key, value, hash, file)
      raw_key = raw_key.to_s
      value = array_to_s(value) if is_array(raw_key)

      key = key_for(raw_key)

      return if hash[key] == value

      hash[key] = value
      hash.delete(key) if value.nil?

      Validator.validate!(raw_key, converted_value(value, raw_key), hash)

      return unless file
      SharedHelpers.filesystem_access(file) do |p|
        FileUtils.mkdir_p(p.dirname)
        require_relative "yaml_serializer"
        p.open("w") {|f| f.write(YAMLSerializer.dump(hash)) }
      end
    end

    def converted_value(value, key)
      if is_array(key)
        to_array(value)
      elsif value.nil?
        nil
      elsif is_bool(key) || value == "false"
        to_bool(value)
      elsif is_num(key)
        value.to_i
      else
        value.to_s
      end
    end

    def printable_value(value, key)
      converted = converted_value(value, key)
      return converted unless converted.is_a?(String)

      if is_string(key)
        converted
      elsif is_credential(key)
        "[REDACTED]"
      elsif is_userinfo(converted)
        username, pass = converted.split(":", 2)

        if pass == "x-oauth-basic"
          username = "[REDACTED]"
        else
          pass = "[REDACTED]"
        end

        [username, pass].join(":")
      else
        converted
      end
    end

    def global_config_file
      if ENV["BUNDLE_CONFIG"] && !ENV["BUNDLE_CONFIG"].empty?
        Pathname.new(ENV["BUNDLE_CONFIG"])
      elsif ENV["BUNDLE_USER_CONFIG"] && !ENV["BUNDLE_USER_CONFIG"].empty?
        Pathname.new(ENV["BUNDLE_USER_CONFIG"])
      elsif ENV["BUNDLE_USER_HOME"] && !ENV["BUNDLE_USER_HOME"].empty?
        Pathname.new(ENV["BUNDLE_USER_HOME"]).join("config")
      elsif Bundler.rubygems.user_home && !Bundler.rubygems.user_home.empty?
        Pathname.new(Bundler.rubygems.user_home).join(".bundle/config")
      end
    end

    def local_config_file
      Pathname.new(@root).join("config") if @root
    end

    def load_config(config_file)
      return {} if !config_file || ignore_config?
      SharedHelpers.filesystem_access(config_file, :read) do |file|
        valid_file = file.exist? && !file.size.zero?
        return {} unless valid_file
        require_relative "yaml_serializer"
        YAMLSerializer.load(file.read).inject({}) do |config, (k, v)|
          new_k = k

          if k.include?("-")
            Bundler.ui.warn "Your #{file} config includes `#{k}`, which contains the dash character (`-`).\n" \
              "This is deprecated, because configuration through `ENV` should be possible, but `ENV` keys cannot include dashes.\n" \
              "Please edit #{file} and replace any dashes in configuration keys with a triple underscore (`___`)."

            new_k = k.gsub("-", "___")
          end

          config[new_k] = v
          config
        end
      end
    end

    PER_URI_OPTIONS = %w[
      fallback_timeout
    ].freeze

    NORMALIZE_URI_OPTIONS_PATTERN =
      /
        \A
        (\w+\.)? # optional prefix key
        (https?.*?) # URI
        (\.#{Regexp.union(PER_URI_OPTIONS)})? # optional suffix key
        \z
      /ix.freeze

    def self.key_for(key)
      key = normalize_uri(key).to_s if key.is_a?(String) && key.start_with?("http", "mirror.http")
      key = key.to_s.gsub(".", "__").gsub("-", "___").upcase
      "BUNDLE_#{key}"
    end

    # TODO: duplicates Rubygems#normalize_uri
    # TODO: is this the correct place to validate mirror URIs?
    def self.normalize_uri(uri)
      uri = uri.to_s
      if uri =~ NORMALIZE_URI_OPTIONS_PATTERN
        prefix = $1
        uri = $2
        suffix = $3
      end
      uri = "#{uri}/" unless uri.end_with?("/")
      require_relative "vendored_uri"
      uri = Bundler::URI(uri)
      unless uri.absolute?
        raise ArgumentError, format("Gem sources must be absolute. You provided '%s'.", uri)
      end
      "#{prefix}#{uri}#{suffix}"
    end
  end
end
PK
}$[��K663gems/gems/bundler-2.3.27/lib/bundler/ui/rg_proxy.rbnu�[���# frozen_string_literal: true

require_relative "../ui"
require "rubygems/user_interaction"

module Bundler
  module UI
    class RGProxy < ::Gem::SilentUI
      def initialize(ui)
        @ui = ui
        super()
      end

      def say(message)
        @ui && @ui.debug(message)
      end
    end
  end
end
PK
}$[�N�s
s
0gems/gems/bundler-2.3.27/lib/bundler/ui/shell.rbnu�[���# frozen_string_literal: true

require_relative "../vendored_thor"

module Bundler
  module UI
    class Shell
      LEVELS = %w[silent error warn confirm info debug].freeze

      attr_writer :shell

      def initialize(options = {})
        Thor::Base.shell = options["no-color"] ? Thor::Shell::Basic : nil
        @shell = Thor::Base.shell.new
        @level = ENV["DEBUG"] ? "debug" : "info"
        @warning_history = []
      end

      def add_color(string, *color)
        @shell.set_color(string, *color)
      end

      def info(msg, newline = nil)
        tell_me(msg, nil, newline) if level("info")
      end

      def confirm(msg, newline = nil)
        tell_me(msg, :green, newline) if level("confirm")
      end

      def warn(msg, newline = nil, color = :yellow)
        return unless level("warn")
        return if @warning_history.include? msg
        @warning_history << msg

        tell_err(msg, color, newline)
      end

      def error(msg, newline = nil, color = :red)
        return unless level("error")
        tell_err(msg, color, newline)
      end

      def debug(msg, newline = nil)
        tell_me(msg, nil, newline) if debug?
      end

      def debug?
        level("debug")
      end

      def quiet?
        level("quiet")
      end

      def ask(msg)
        @shell.ask(msg)
      end

      def yes?(msg)
        @shell.yes?(msg)
      end

      def no?
        @shell.no?(msg)
      end

      def level=(level)
        raise ArgumentError unless LEVELS.include?(level.to_s)
        @level = level.to_s
      end

      def level(name = nil)
        return @level unless name
        unless index = LEVELS.index(name)
          raise "#{name.inspect} is not a valid level"
        end
        index <= LEVELS.index(@level)
      end

      def trace(e, newline = nil, force = false)
        return unless debug? || force
        msg = "#{e.class}: #{e.message}\n#{e.backtrace.join("\n  ")}"
        tell_err(msg, nil, newline)
      end

      def silence(&blk)
        with_level("silent", &blk)
      end

      def unprinted_warnings
        []
      end

      private

      # valimism
      def tell_me(msg, color = nil, newline = nil)
        msg = word_wrap(msg) if newline.is_a?(Hash) && newline[:wrap]
        if newline.nil?
          @shell.say(msg, color)
        else
          @shell.say(msg, color, newline)
        end
      end

      def tell_err(message, color = nil, newline = nil)
        return if @shell.send(:stderr).closed?

        newline ||= message.to_s !~ /( |\t)\Z/
        message = word_wrap(message) if newline.is_a?(Hash) && newline[:wrap]

        color = nil if color && !$stderr.tty?

        buffer = @shell.send(:prepare_message, message, *color)
        buffer << "\n" if newline && !message.to_s.end_with?("\n")

        @shell.send(:stderr).print(buffer)
        @shell.send(:stderr).flush
      end

      def strip_leading_spaces(text)
        spaces = text[/\A\s+/, 0]
        spaces ? text.gsub(/#{spaces}/, "") : text
      end

      def word_wrap(text, line_width = @shell.terminal_width)
        strip_leading_spaces(text).split("\n").collect do |line|
          line.length > line_width ? line.gsub(/(.{1,#{line_width}})(\s+|$)/, "\\1\n").strip : line
        end * "\n"
      end

      def with_level(level)
        original = @level
        @level = level
        yield
      ensure
        @level = original
      end
    end
  end
end
PK
}$[��[

1gems/gems/bundler-2.3.27/lib/bundler/ui/silent.rbnu�[���# frozen_string_literal: true

module Bundler
  module UI
    class Silent
      attr_writer :shell

      def initialize
        @warnings = []
      end

      def add_color(string, color)
        string
      end

      def info(message, newline = nil)
      end

      def confirm(message, newline = nil)
      end

      def warn(message, newline = nil)
        @warnings |= [message]
      end

      def error(message, newline = nil)
      end

      def debug(message, newline = nil)
      end

      def debug?
        false
      end

      def quiet?
        false
      end

      def ask(message)
      end

      def yes?(msg)
        raise "Cannot ask yes? with a silent shell"
      end

      def no?
        raise "Cannot ask no? with a silent shell"
      end

      def level=(name)
      end

      def level(name = nil)
      end

      def trace(message, newline = nil, force = false)
      end

      def silence
        yield
      end

      def unprinted_warnings
        @warnings
      end
    end
  end
end
PK
}$[3��,��-gems/gems/bundler-2.3.27/lib/bundler/graph.rbnu�[���# frozen_string_literal: true

require "set"
module Bundler
  class Graph
    GRAPH_NAME = :Gemfile

    def initialize(env, output_file, show_version = false, show_requirements = false, output_format = "png", without = [])
      @env               = env
      @output_file       = output_file
      @show_version      = show_version
      @show_requirements = show_requirements
      @output_format     = output_format
      @without_groups    = without.map(&:to_sym)

      @groups            = []
      @relations         = Hash.new {|h, k| h[k] = Set.new }
      @node_options      = {}
      @edge_options      = {}

      _populate_relations
    end

    attr_reader :groups, :relations, :node_options, :edge_options, :output_file, :output_format

    def viz
      GraphVizClient.new(self).run
    end

    private

    def _populate_relations
      parent_dependencies = _groups.values.to_set.flatten
      loop do
        break if parent_dependencies.empty?

        tmp = Set.new
        parent_dependencies.each do |dependency|
          child_dependencies = spec_for_dependency(dependency).runtime_dependencies.to_set
          @relations[dependency.name] += child_dependencies.map(&:name).to_set
          tmp += child_dependencies

          @node_options[dependency.name] = _make_label(dependency, :node)
          child_dependencies.each do |c_dependency|
            @edge_options["#{dependency.name}_#{c_dependency.name}"] = _make_label(c_dependency, :edge)
          end
        end
        parent_dependencies = tmp
      end
    end

    def _groups
      relations = Hash.new {|h, k| h[k] = Set.new }
      @env.current_dependencies.each do |dependency|
        dependency.groups.each do |group|
          next if @without_groups.include?(group)

          relations[group.to_s].add(dependency)
          @relations[group.to_s].add(dependency.name)

          @node_options[group.to_s] ||= _make_label(group, :node)
          @edge_options["#{group}_#{dependency.name}"] = _make_label(dependency, :edge)
        end
      end
      @groups = relations.keys
      relations
    end

    def _make_label(symbol_or_string_or_dependency, element_type)
      case element_type.to_sym
      when :node
        if symbol_or_string_or_dependency.is_a?(Gem::Dependency)
          label = symbol_or_string_or_dependency.name.dup
          label << "\n#{spec_for_dependency(symbol_or_string_or_dependency).version}" if @show_version
        else
          label = symbol_or_string_or_dependency.to_s
        end
      when :edge
        label = nil
        if symbol_or_string_or_dependency.respond_to?(:requirements_list) && @show_requirements
          tmp = symbol_or_string_or_dependency.requirements_list.join(", ")
          label = tmp if tmp != ">= 0"
        end
      else
        raise ArgumentError, "2nd argument is invalid"
      end
      label.nil? ? {} : { :label => label }
    end

    def spec_for_dependency(dependency)
      @env.requested_specs.find {|s| s.name == dependency.name }
    end

    class GraphVizClient
      def initialize(graph_instance)
        @graph_name    = graph_instance.class::GRAPH_NAME
        @groups        = graph_instance.groups
        @relations     = graph_instance.relations
        @node_options  = graph_instance.node_options
        @edge_options  = graph_instance.edge_options
        @output_file   = graph_instance.output_file
        @output_format = graph_instance.output_format
      end

      def g
        @g ||= ::GraphViz.digraph(@graph_name, :concentrate => true, :normalize => true, :nodesep => 0.55) do |g|
          g.edge[:weight]   = 2
          g.edge[:fontname] = g.node[:fontname] = "Arial, Helvetica, SansSerif"
          g.edge[:fontsize] = 12
        end
      end

      def run
        @groups.each do |group|
          g.add_nodes(
            group, {
              :style     => "filled",
              :fillcolor => "#B9B9D5",
              :shape     => "box3d",
              :fontsize  => 16,
            }.merge(@node_options[group])
          )
        end

        @relations.each do |parent, children|
          children.each do |child|
            if @groups.include?(parent)
              g.add_nodes(child, { :style => "filled", :fillcolor => "#B9B9D5" }.merge(@node_options[child]))
              g.add_edges(parent, child, { :constraint => false }.merge(@edge_options["#{parent}_#{child}"]))
            else
              g.add_nodes(child, @node_options[child])
              g.add_edges(parent, child, @edge_options["#{parent}_#{child}"])
            end
          end
        end

        if @output_format.to_s == "debug"
          $stdout.puts g.output :none => String
          Bundler.ui.info "debugging bundle viz..."
        else
          begin
            g.output @output_format.to_sym => "#{@output_file}.#{@output_format}"
            Bundler.ui.info "#{@output_file}.#{@output_format}"
          rescue ArgumentError => e
            warn "Unsupported output format. See Ruby-Graphviz/lib/graphviz/constants.rb"
            raise e
          end
        end
      end
    end
  end
end
PK
}$[f)q
q
<gems/gems/bundler-2.3.27/lib/bundler/compact_index_client.rbnu�[���# frozen_string_literal: true

require "pathname"
require "set"

module Bundler
  class CompactIndexClient
    DEBUG_MUTEX = Thread::Mutex.new
    def self.debug
      return unless ENV["DEBUG_COMPACT_INDEX"]
      DEBUG_MUTEX.synchronize { warn("[#{self}] #{yield}") }
    end

    class Error < StandardError; end

    require_relative "compact_index_client/cache"
    require_relative "compact_index_client/updater"

    attr_reader :directory

    def initialize(directory, fetcher)
      @directory = Pathname.new(directory)
      @updater = Updater.new(fetcher)
      @cache = Cache.new(@directory)
      @endpoints = Set.new
      @info_checksums_by_name = {}
      @parsed_checksums = false
      @mutex = Thread::Mutex.new
    end

    def execution_mode=(block)
      Bundler::CompactIndexClient.debug { "execution_mode=" }
      @endpoints = Set.new

      @execution_mode = block
    end

    # @return [Lambda] A lambda that takes an array of inputs and a block, and
    #         maps the inputs with the block in parallel.
    #
    def execution_mode
      @execution_mode || sequentially
    end

    def sequential_execution_mode!
      self.execution_mode = sequentially
    end

    def sequentially
      @sequentially ||= lambda do |inputs, &blk|
        inputs.map(&blk)
      end
    end

    def names
      Bundler::CompactIndexClient.debug { "/names" }
      update(@cache.names_path, "names")
      @cache.names
    end

    def versions
      Bundler::CompactIndexClient.debug { "/versions" }
      update(@cache.versions_path, "versions")
      versions, @info_checksums_by_name = @cache.versions
      versions
    end

    def dependencies(names)
      Bundler::CompactIndexClient.debug { "dependencies(#{names})" }
      execution_mode.call(names) do |name|
        update_info(name)
        @cache.dependencies(name).map {|d| d.unshift(name) }
      end.flatten(1)
    end

    def update_and_parse_checksums!
      Bundler::CompactIndexClient.debug { "update_and_parse_checksums!" }
      return @info_checksums_by_name if @parsed_checksums
      update(@cache.versions_path, "versions")
      @info_checksums_by_name = @cache.checksums
      @parsed_checksums = true
    end

    private

    def update(local_path, remote_path)
      Bundler::CompactIndexClient.debug { "update(#{local_path}, #{remote_path})" }
      unless synchronize { @endpoints.add?(remote_path) }
        Bundler::CompactIndexClient.debug { "already fetched #{remote_path}" }
        return
      end
      @updater.update(local_path, url(remote_path))
    end

    def update_info(name)
      Bundler::CompactIndexClient.debug { "update_info(#{name})" }
      path = @cache.info_path(name)
      checksum = @updater.checksum_for_file(path)
      unless existing = @info_checksums_by_name[name]
        Bundler::CompactIndexClient.debug { "skipping updating info for #{name} since it is missing from versions" }
        return
      end
      if checksum == existing
        Bundler::CompactIndexClient.debug { "skipping updating info for #{name} since the versions checksum matches the local checksum" }
        return
      end
      Bundler::CompactIndexClient.debug { "updating info for #{name} since the versions checksum #{existing} != the local checksum #{checksum}" }
      update(path, "info/#{name}")
    end

    def url(path)
      path
    end

    def synchronize
      @mutex.synchronize { yield }
    end
  end
end
PK
}$[�]�YY:gems/gems/bundler-2.3.27/lib/bundler/fetcher/downloader.rbnu�[���# frozen_string_literal: true

module Bundler
  class Fetcher
    class Downloader
      attr_reader :connection
      attr_reader :redirect_limit

      def initialize(connection, redirect_limit)
        @connection = connection
        @redirect_limit = redirect_limit
      end

      def fetch(uri, headers = {}, counter = 0)
        raise HTTPError, "Too many redirects" if counter >= redirect_limit

        filtered_uri = URICredentialsFilter.credential_filtered_uri(uri)

        response = request(uri, headers)
        Bundler.ui.debug("HTTP #{response.code} #{response.message} #{filtered_uri}")

        case response
        when Net::HTTPSuccess, Net::HTTPNotModified
          response
        when Net::HTTPRedirection
          new_uri = Bundler::URI.parse(response["location"])
          if new_uri.host == uri.host
            new_uri.user = uri.user
            new_uri.password = uri.password
          end
          fetch(new_uri, headers, counter + 1)
        when Net::HTTPRequestedRangeNotSatisfiable
          new_headers = headers.dup
          new_headers.delete("Range")
          new_headers["Accept-Encoding"] = "gzip"
          fetch(uri, new_headers)
        when Net::HTTPRequestEntityTooLarge
          raise FallbackError, response.body
        when Net::HTTPTooManyRequests
          raise TooManyRequestsError, response.body
        when Net::HTTPUnauthorized
          raise BadAuthenticationError, uri.host if uri.userinfo
          raise AuthenticationRequiredError, uri.host
        when Net::HTTPNotFound
          raise FallbackError, "Net::HTTPNotFound: #{filtered_uri}"
        else
          raise HTTPError, "#{response.class}#{": #{response.body}" unless response.body.empty?}"
        end
      end

      def request(uri, headers)
        validate_uri_scheme!(uri)

        filtered_uri = URICredentialsFilter.credential_filtered_uri(uri)

        Bundler.ui.debug "HTTP GET #{filtered_uri}"
        req = Net::HTTP::Get.new uri.request_uri, headers
        if uri.user
          user = CGI.unescape(uri.user)
          password = uri.password ? CGI.unescape(uri.password) : nil
          req.basic_auth(user, password)
        end
        connection.request(uri, req)
      rescue NoMethodError => e
        raise unless ["undefined method", "use_ssl="].all? {|snippet| e.message.include? snippet }
        raise LoadError.new("cannot load such file -- openssl")
      rescue OpenSSL::SSL::SSLError
        raise CertificateFailureError.new(uri)
      rescue *HTTP_ERRORS => e
        Bundler.ui.trace e
        if e.is_a?(SocketError) || e.message =~ /host down:/
          raise NetworkDownError, "Could not reach host #{uri.host}. Check your network " \
            "connection and try again."
        else
          raise HTTPError, "Network error while fetching #{filtered_uri}" \
            " (#{e})"
        end
      end

      private

      def validate_uri_scheme!(uri)
        return if uri.scheme =~ /\Ahttps?\z/
        raise InvalidOption,
          "The request uri `#{uri}` has an invalid scheme (`#{uri.scheme}`). " \
          "Did you mean `http` or `https`?"
      end
    end
  end
end
PK
}$[��
N��4gems/gems/bundler-2.3.27/lib/bundler/fetcher/base.rbnu�[���# frozen_string_literal: true

module Bundler
  class Fetcher
    class Base
      attr_reader :downloader
      attr_reader :display_uri
      attr_reader :remote

      def initialize(downloader, remote, display_uri)
        raise "Abstract class" if self.class == Base
        @downloader = downloader
        @remote = remote
        @display_uri = display_uri
      end

      def remote_uri
        @remote.uri
      end

      def fetch_uri
        @fetch_uri ||= if remote_uri.host == "rubygems.org"
          uri = remote_uri.dup
          uri.host = "index.rubygems.org"
          uri
        else
          remote_uri
        end
      end

      def available?
        true
      end

      def api_fetcher?
        false
      end

      private

      def log_specs(debug_msg)
        if Bundler.ui.debug?
          Bundler.ui.debug debug_msg
        else
          Bundler.ui.info ".", false
        end
      end
    end
  end
end
PK}$[�q=gems/gems/bundler-2.3.27/lib/bundler/fetcher/compact_index.rbnu�[���# frozen_string_literal: true

require_relative "base"
require_relative "../worker"

module Bundler
  autoload :CompactIndexClient, File.expand_path("../compact_index_client", __dir__)

  class Fetcher
    class CompactIndex < Base
      def self.compact_index_request(method_name)
        method = instance_method(method_name)
        undef_method(method_name)
        define_method(method_name) do |*args, &blk|
          begin
            method.bind(self).call(*args, &blk)
          rescue NetworkDownError, CompactIndexClient::Updater::MisMatchedChecksumError => e
            raise HTTPError, e.message
          rescue AuthenticationRequiredError
            # Fail since we got a 401 from the server.
            raise
          rescue HTTPError => e
            Bundler.ui.trace(e)
            nil
          end
        end
      end

      def specs(gem_names)
        specs_for_names(gem_names)
      end
      compact_index_request :specs

      def specs_for_names(gem_names)
        gem_info = []
        complete_gems = []
        remaining_gems = gem_names.dup

        until remaining_gems.empty?
          log_specs "Looking up gems #{remaining_gems.inspect}"

          deps = begin
                   parallel_compact_index_client.dependencies(remaining_gems)
                 rescue TooManyRequestsError
                   @bundle_worker.stop if @bundle_worker
                   @bundle_worker = nil # reset it.  Not sure if necessary
                   serial_compact_index_client.dependencies(remaining_gems)
                 end
          next_gems = deps.map {|d| d[3].map(&:first).flatten(1) }.flatten(1).uniq
          deps.each {|dep| gem_info << dep }
          complete_gems.concat(deps.map(&:first)).uniq!
          remaining_gems = next_gems - complete_gems
        end
        @bundle_worker.stop if @bundle_worker
        @bundle_worker = nil # reset it.  Not sure if necessary

        gem_info
      end

      def available?
        unless SharedHelpers.md5_available?
          Bundler.ui.debug("FIPS mode is enabled, bundler can't use the CompactIndex API")
          return nil
        end
        if fetch_uri.scheme == "file"
          Bundler.ui.debug("Using a local server, bundler won't use the CompactIndex API")
          return false
        end
        # Read info file checksums out of /versions, so we can know if gems are up to date
        compact_index_client.update_and_parse_checksums!
      rescue CompactIndexClient::Updater::MisMatchedChecksumError => e
        Bundler.ui.debug(e.message)
        nil
      end
      compact_index_request :available?

      def api_fetcher?
        true
      end

      private

      def compact_index_client
        @compact_index_client ||=
          SharedHelpers.filesystem_access(cache_path) do
            CompactIndexClient.new(cache_path, client_fetcher)
          end
      end

      def parallel_compact_index_client
        compact_index_client.execution_mode = lambda do |inputs, &blk|
          func = lambda {|object, _index| blk.call(object) }
          worker = bundle_worker(func)
          inputs.each {|input| worker.enq(input) }
          inputs.map { worker.deq }
        end

        compact_index_client
      end

      def serial_compact_index_client
        compact_index_client.sequential_execution_mode!
        compact_index_client
      end

      def bundle_worker(func = nil)
        @bundle_worker ||= begin
          worker_name = "Compact Index (#{display_uri.host})"
          Bundler::Worker.new(Bundler.settings.processor_count, worker_name, func)
        end
        @bundle_worker.tap do |worker|
          worker.instance_variable_set(:@func, func) if func
        end
      end

      def cache_path
        Bundler.user_cache.join("compact_index", remote.cache_slug)
      end

      def client_fetcher
        ClientFetcher.new(self, Bundler.ui)
      end

      ClientFetcher = Struct.new(:fetcher, :ui) do
        def call(path, headers)
          fetcher.downloader.fetch(fetcher.fetch_uri + path, headers)
        rescue NetworkDownError => e
          raise unless Bundler.feature_flag.allow_offline_install? && headers["If-None-Match"]
          ui.warn "Using the cached data for the new index because of a network error: #{e}"
          Net::HTTPNotModified.new(nil, nil, nil)
        end
      end
    end
  end
end
PK}$[��is995gems/gems/bundler-2.3.27/lib/bundler/fetcher/index.rbnu�[���# frozen_string_literal: true

require_relative "base"

module Bundler
  class Fetcher
    class Index < Base
      def specs(_gem_names)
        Bundler.rubygems.fetch_all_remote_specs(remote)
      rescue Gem::RemoteFetcher::FetchError => e
        case e.message
        when /certificate verify failed/
          raise CertificateFailureError.new(display_uri)
        when /401/
          raise BadAuthenticationError, remote_uri if remote_uri.userinfo
          raise AuthenticationRequiredError, remote_uri
        when /403/
          raise BadAuthenticationError, remote_uri if remote_uri.userinfo
          raise AuthenticationRequiredError, remote_uri
        else
          raise HTTPError, "Could not fetch specs from #{display_uri} due to underlying error <#{e.message}>"
        end
      end
    end
  end
end
PK}$[L�;8�
�
:gems/gems/bundler-2.3.27/lib/bundler/fetcher/dependency.rbnu�[���# frozen_string_literal: true

require_relative "base"
require "cgi"

module Bundler
  class Fetcher
    class Dependency < Base
      def available?
        @available ||= fetch_uri.scheme != "file" && downloader.fetch(dependency_api_uri)
      rescue NetworkDownError => e
        raise HTTPError, e.message
      rescue AuthenticationRequiredError
        # Fail since we got a 401 from the server.
        raise
      rescue HTTPError
        false
      end

      def api_fetcher?
        true
      end

      def specs(gem_names, full_dependency_list = [], last_spec_list = [])
        query_list = gem_names.uniq - full_dependency_list

        log_specs "Query List: #{query_list.inspect}"

        return last_spec_list if query_list.empty?

        spec_list, deps_list = Bundler::Retry.new("dependency api", FAIL_ERRORS).attempts do
          dependency_specs(query_list)
        end

        returned_gems = spec_list.map(&:first).uniq
        specs(deps_list, full_dependency_list + returned_gems, spec_list + last_spec_list)
      rescue MarshalError
        Bundler.ui.info "" unless Bundler.ui.debug? # new line now that the dots are over
        Bundler.ui.debug "could not fetch from the dependency API, trying the full index"
        nil
      rescue HTTPError, GemspecError
        Bundler.ui.info "" unless Bundler.ui.debug? # new line now that the dots are over
        Bundler.ui.debug "could not fetch from the dependency API\nit's suggested to retry using the full index via `bundle install --full-index`"
        nil
      end

      def dependency_specs(gem_names)
        Bundler.ui.debug "Query Gemcutter Dependency Endpoint API: #{gem_names.join(",")}"

        gem_list = unmarshalled_dep_gems(gem_names)
        get_formatted_specs_and_deps(gem_list)
      end

      def unmarshalled_dep_gems(gem_names)
        gem_list = []
        gem_names.each_slice(Source::Rubygems::API_REQUEST_SIZE) do |names|
          marshalled_deps = downloader.fetch(dependency_api_uri(names)).body
          gem_list.concat(Bundler.load_marshal(marshalled_deps))
        end
        gem_list
      end

      def get_formatted_specs_and_deps(gem_list)
        deps_list = []
        spec_list = []

        gem_list.each do |s|
          deps_list.concat(s[:dependencies].map(&:first))
          deps = s[:dependencies].map {|n, d| [n, d.split(", ")] }
          spec_list.push([s[:name], s[:number], s[:platform], deps])
        end
        [spec_list, deps_list]
      end

      def dependency_api_uri(gem_names = [])
        uri = fetch_uri + "api/v1/dependencies"
        uri.query = "gems=#{CGI.escape(gem_names.sort.join(","))}" if gem_names.any?
        uri
      end
    end
  end
end
PK}$[
�>��:gems/gems/bundler-2.3.27/lib/bundler/lockfile_generator.rbnu�[���# frozen_string_literal: true

module Bundler
  class LockfileGenerator
    attr_reader :definition
    attr_reader :out

    # @private
    def initialize(definition)
      @definition = definition
      @out = String.new
    end

    def self.generate(definition)
      new(definition).generate!
    end

    def generate!
      add_sources
      add_platforms
      add_dependencies
      add_locked_ruby_version
      add_bundled_with

      out
    end

    private

    def add_sources
      definition.send(:sources).lock_sources.each_with_index do |source, idx|
        out << "\n" unless idx.zero?

        # Add the source header
        out << source.to_lock

        # Find all specs for this source
        specs = definition.resolve.select {|s| source.can_lock?(s) }
        add_specs(specs)
      end
    end

    def add_specs(specs)
      # This needs to be sorted by full name so that
      # gems with the same name, but different platform
      # are ordered consistently
      specs.sort_by(&:full_name).each do |spec|
        next if spec.name == "bundler".freeze
        out << spec.to_lock
      end
    end

    def add_platforms
      add_section("PLATFORMS", definition.platforms)
    end

    def add_dependencies
      out << "\nDEPENDENCIES\n"

      handled = []
      definition.dependencies.sort_by(&:to_s).each do |dep|
        next if handled.include?(dep.name)
        out << dep.to_lock << "\n"
        handled << dep.name
      end
    end

    def add_locked_ruby_version
      return unless locked_ruby_version = definition.locked_ruby_version
      add_section("RUBY VERSION", locked_ruby_version.to_s)
    end

    def add_bundled_with
      add_section("BUNDLED WITH", Bundler::VERSION)
    end

    def add_section(name, value)
      out << "\n#{name}\n"
      case value
      when Array
        value.map(&:to_s).sort.each do |val|
          out << "  #{val}\n"
        end
      when Hash
        value.to_a.sort_by {|k, _| k.to_s }.each do |key, val|
          out << "  #{key}: #{val}\n"
        end
      when String
        out << "   #{value}\n"
      else
        raise ArgumentError, "#{value.inspect} can't be serialized in a lockfile"
      end
    end
  end
end
PK}$[�H��.gems/gems/bundler-2.3.27/lib/bundler/digest.rbnu�[���# frozen_string_literal: true

# This code was extracted from https://github.com/Solistra/ruby-digest which is under public domain
module Bundler
  module Digest
    # The initial constant values for the 32-bit constant words A, B, C, D, and
    # E, respectively.
    SHA1_WORDS = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0].freeze

    # The 8-bit field used for bitwise `AND` masking. Defaults to `0xFFFFFFFF`.
    SHA1_MASK = 0xFFFFFFFF

    class << self
      def sha1(string)
        unless string.is_a?(String)
          raise TypeError, "can't convert #{string.class.inspect} into String"
        end

        buffer = string.b

        words = SHA1_WORDS.dup
        generate_split_buffer(buffer) do |chunk|
          w = []
          chunk.each_slice(4) do |a, b, c, d|
            w << (((a << 8 | b) << 8 | c) << 8 | d)
          end
          a, b, c, d, e = *words
          (16..79).each do |i|
            w[i] = SHA1_MASK & rotate((w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16]), 1)
          end
          0.upto(79) do |i|
            case i
            when  0..19
              f = ((b & c) | (~b & d))
              k = 0x5A827999
            when 20..39
              f = (b ^ c ^ d)
              k = 0x6ED9EBA1
            when 40..59
              f = ((b & c) | (b & d) | (c & d))
              k = 0x8F1BBCDC
            when 60..79
              f = (b ^ c ^ d)
              k = 0xCA62C1D6
            end
            t = SHA1_MASK & (SHA1_MASK & rotate(a, 5) + f + e + k + w[i])
            a, b, c, d, e = t, a, SHA1_MASK & rotate(b, 30), c, d # rubocop:disable Style/ParallelAssignment
          end
          mutated = [a, b, c, d, e]
          words.map!.with_index {|word, index| SHA1_MASK & (word + mutated[index]) }
        end

        words.pack("N*").unpack("H*").first
      end

      private

      def generate_split_buffer(string, &block)
        size   = string.bytesize * 8
        buffer = string.bytes << 128
        buffer << 0 while buffer.size % 64 != 56
        buffer.concat([size].pack("Q>").bytes)
        buffer.each_slice(64, &block)
      end

      def rotate(value, spaces)
        value << spaces | value >> (32 - spaces)
      end
    end
  end
end
PK}$[�CW(W(0gems/gems/bundler-2.3.27/lib/bundler/injector.rbnu�[���# frozen_string_literal: true

module Bundler
  class Injector
    INJECTED_GEMS = "injected gems".freeze

    def self.inject(new_deps, options = {})
      injector = new(new_deps, options)
      injector.inject(Bundler.default_gemfile, Bundler.default_lockfile)
    end

    def self.remove(gems, options = {})
      injector = new(gems, options)
      injector.remove(Bundler.default_gemfile, Bundler.default_lockfile)
    end

    def initialize(deps, options = {})
      @deps = deps
      @options = options
    end

    # @param [Pathname] gemfile_path The Gemfile in which to inject the new dependency.
    # @param [Pathname] lockfile_path The lockfile in which to inject the new dependency.
    # @return [Array]
    def inject(gemfile_path, lockfile_path)
      if Bundler.frozen_bundle?
        # ensure the lock and Gemfile are synced
        Bundler.definition.ensure_equivalent_gemfile_and_lockfile(true)
      end

      # temporarily unfreeze
      Bundler.settings.temporary(:deployment => false, :frozen => false) do
        # evaluate the Gemfile we have now
        builder = Dsl.new
        builder.eval_gemfile(gemfile_path)

        # don't inject any gems that are already in the Gemfile
        @deps -= builder.dependencies

        # add new deps to the end of the in-memory Gemfile
        # Set conservative versioning to false because
        # we want to let the resolver resolve the version first
        builder.eval_gemfile(INJECTED_GEMS, build_gem_lines(false)) if @deps.any?

        # resolve to see if the new deps broke anything
        @definition = builder.to_definition(lockfile_path, {})
        @definition.resolve_remotely!

        # since nothing broke, we can add those gems to the gemfile
        append_to(gemfile_path, build_gem_lines(@options[:conservative_versioning])) if @deps.any?

        # since we resolved successfully, write out the lockfile
        @definition.lock(Bundler.default_lockfile)

        # invalidate the cached Bundler.definition
        Bundler.reset_paths!

        # return an array of the deps that we added
        @deps
      end
    end

    # @param [Pathname] gemfile_path The Gemfile from which to remove dependencies.
    # @param [Pathname] lockfile_path The lockfile from which to remove dependencies.
    # @return [Array]
    def remove(gemfile_path, lockfile_path)
      # remove gems from each gemfiles we have
      Bundler.definition.gemfiles.each do |path|
        deps = remove_deps(path)

        show_warning("No gems were removed from the gemfile.") if deps.empty?

        deps.each {|dep| Bundler.ui.confirm "#{SharedHelpers.pretty_dependency(dep)} was removed." }
      end

      # Invalidate the cached Bundler.definition.
      # This prevents e.g. `bundle remove ...` from using outdated information.
      Bundler.reset_paths!
    end

    private

    def conservative_version(spec)
      version = spec.version
      return ">= 0" if version.nil?
      segments = version.segments
      seg_end_index = version >= Gem::Version.new("1.0") ? 1 : 2

      prerelease_suffix = version.to_s.gsub(version.release.to_s, "") if version.prerelease?
      "#{version_prefix}#{segments[0..seg_end_index].join(".")}#{prerelease_suffix}"
    end

    def version_prefix
      if @options[:strict]
        "= "
      elsif @options[:optimistic]
        ">= "
      else
        "~> "
      end
    end

    def build_gem_lines(conservative_versioning)
      @deps.map do |d|
        name = d.name.dump

        requirement = if conservative_versioning
          ", \"#{conservative_version(@definition.specs[d.name][0])}\""
        else
          ", #{d.requirement.as_list.map(&:dump).join(", ")}"
        end

        if d.groups != Array(:default)
          group = d.groups.size == 1 ? ", :group => #{d.groups.first.inspect}" : ", :groups => #{d.groups.inspect}"
        end

        source = ", :source => \"#{d.source}\"" unless d.source.nil?
        path = ", :path => \"#{d.path}\"" unless d.path.nil?
        git = ", :git => \"#{d.git}\"" unless d.git.nil?
        github = ", :github => \"#{d.github}\"" unless d.github.nil?
        branch = ", :branch => \"#{d.branch}\"" unless d.branch.nil?
        ref = ", :ref => \"#{d.ref}\"" unless d.ref.nil?
        require_path = ", :require => #{convert_autorequire(d.autorequire)}" unless d.autorequire.nil?

        %(gem #{name}#{requirement}#{group}#{source}#{path}#{git}#{github}#{branch}#{ref}#{require_path})
      end.join("\n")
    end

    def append_to(gemfile_path, new_gem_lines)
      gemfile_path.open("a") do |f|
        f.puts
        f.puts new_gem_lines
      end
    end

    # evaluates a gemfile to remove the specified gem
    # from it.
    def remove_deps(gemfile_path)
      initial_gemfile = File.readlines(gemfile_path)

      Bundler.ui.info "Removing gems from #{gemfile_path}"

      # evaluate the Gemfile we have
      builder = Dsl.new
      builder.eval_gemfile(gemfile_path)

      removed_deps = remove_gems_from_dependencies(builder, @deps, gemfile_path)

      # abort the operation if no gems were removed
      # no need to operate on gemfile further
      return [] if removed_deps.empty?

      cleaned_gemfile = remove_gems_from_gemfile(@deps, gemfile_path)

      SharedHelpers.write_to_gemfile(gemfile_path, cleaned_gemfile)

      # check for errors
      # including extra gems being removed
      # or some gems not being removed
      # and return the actual removed deps
      cross_check_for_errors(gemfile_path, builder.dependencies, removed_deps, initial_gemfile)
    end

    # @param [Dsl]      builder Dsl object of current Gemfile.
    # @param [Array]    gems Array of names of gems to be removed.
    # @param [Pathname] gemfile_path Path of the Gemfile.
    # @return [Array]   Array of removed dependencies.
    def remove_gems_from_dependencies(builder, gems, gemfile_path)
      removed_deps = []

      gems.each do |gem_name|
        deleted_dep = builder.dependencies.find {|d| d.name == gem_name }

        if deleted_dep.nil?
          raise GemfileError, "`#{gem_name}` is not specified in #{gemfile_path} so it could not be removed."
        end

        builder.dependencies.delete(deleted_dep)

        removed_deps << deleted_dep
      end

      removed_deps
    end

    # @param [Array] gems            Array of names of gems to be removed.
    # @param [Pathname] gemfile_path The Gemfile from which to remove dependencies.
    def remove_gems_from_gemfile(gems, gemfile_path)
      patterns = /gem\s+(['"])#{Regexp.union(gems)}\1|gem\s*\((['"])#{Regexp.union(gems)}\2\)/
      new_gemfile = []
      multiline_removal = false
      File.readlines(gemfile_path).each do |line|
        match_data = line.match(patterns)
        if match_data && is_not_within_comment?(line, match_data)
          multiline_removal = line.rstrip.end_with?(",")
          # skip lines which match the regex
          next
        end

        # skip followup lines until line does not end with ','
        new_gemfile << line unless multiline_removal
        multiline_removal = line.rstrip.end_with?(",") if multiline_removal
      end

      # remove line \n and append them with other strings
      new_gemfile.each_with_index do |_line, index|
        if new_gemfile[index + 1] == "\n"
          new_gemfile[index] += new_gemfile[index + 1]
          new_gemfile.delete_at(index + 1)
        end
      end

      %w[group source env install_if].each {|block| remove_nested_blocks(new_gemfile, block) }

      new_gemfile.join.chomp
    end

    # @param [String] line          Individual line of gemfile content.
    # @param [MatchData] match_data Data about Regex match.
    def is_not_within_comment?(line, match_data)
      match_start_index = match_data.offset(0).first
      !line[0..match_start_index].include?("#")
    end

    # @param [Array] gemfile       Array of gemfile contents.
    # @param [String] block_name   Name of block name to look for.
    def remove_nested_blocks(gemfile, block_name)
      nested_blocks = 0

      # count number of nested blocks
      gemfile.each_with_index {|line, index| nested_blocks += 1 if !gemfile[index + 1].nil? && gemfile[index + 1].include?(block_name) && line.include?(block_name) }

      while nested_blocks >= 0
        nested_blocks -= 1

        gemfile.each_with_index do |line, index|
          next unless !line.nil? && line.strip.start_with?(block_name)
          if gemfile[index + 1] =~ /^\s*end\s*$/
            gemfile[index] = nil
            gemfile[index + 1] = nil
          end
        end

        gemfile.compact!
      end
    end

    # @param [Pathname] gemfile_path   The Gemfile from which to remove dependencies.
    # @param [Array] original_deps     Array of original dependencies.
    # @param [Array] removed_deps      Array of removed dependencies.
    # @param [Array] initial_gemfile   Contents of original Gemfile before any operation.
    def cross_check_for_errors(gemfile_path, original_deps, removed_deps, initial_gemfile)
      # evaluate the new gemfile to look for any failure cases
      builder = Dsl.new
      builder.eval_gemfile(gemfile_path)

      # record gems which were removed but not requested
      extra_removed_gems = original_deps - builder.dependencies

      # if some extra gems were removed then raise error
      # and revert Gemfile to original
      unless extra_removed_gems.empty?
        SharedHelpers.write_to_gemfile(gemfile_path, initial_gemfile.join)

        raise InvalidOption, "Gems could not be removed. #{extra_removed_gems.join(", ")} would also have been removed. Bundler cannot continue."
      end

      # record gems which could not be removed due to some reasons
      errored_deps = builder.dependencies.select {|d| d.gemfile == gemfile_path } & removed_deps.select {|d| d.gemfile == gemfile_path }

      show_warning "#{errored_deps.map(&:name).join(", ")} could not be removed." unless errored_deps.empty?

      # return actual removed dependencies
      removed_deps - errored_deps
    end

    def show_warning(message)
      Bundler.ui.info Bundler.ui.add_color(message, :yellow)
    end

    def convert_autorequire(autorequire)
      autorequire = autorequire.first
      return autorequire if autorequire == "false"
      autorequire.inspect
    end
  end
end
PK}$[���2gems/gems/bundler-2.3.27/lib/bundler/source_map.rbnu�[���# frozen_string_literal: true

module Bundler
  class SourceMap
    attr_reader :sources, :dependencies, :locked_specs

    def initialize(sources, dependencies, locked_specs)
      @sources = sources
      @dependencies = dependencies
      @locked_specs = locked_specs
    end

    def pinned_spec_names(skip = nil)
      direct_requirements.reject {|_, source| source == skip }.keys
    end

    def all_requirements
      requirements = direct_requirements.dup

      unmet_deps = sources.non_default_explicit_sources.map do |source|
        (source.spec_names - pinned_spec_names).each do |indirect_dependency_name|
          previous_source = requirements[indirect_dependency_name]
          if previous_source.nil?
            requirements[indirect_dependency_name] = source
          else
            no_ambiguous_sources = Bundler.feature_flag.bundler_3_mode?

            msg = ["The gem '#{indirect_dependency_name}' was found in multiple relevant sources."]
            msg.concat [previous_source, source].map {|s| "  * #{s}" }.sort
            msg << "You #{no_ambiguous_sources ? :must : :should} add this gem to the source block for the source you wish it to be installed from."
            msg = msg.join("\n")

            raise SecurityError, msg if no_ambiguous_sources
            Bundler.ui.warn "Warning: #{msg}"
          end
        end

        source.unmet_deps
      end

      sources.default_source.add_dependency_names(unmet_deps.flatten - requirements.keys)

      requirements
    end

    def direct_requirements
      @direct_requirements ||= begin
        requirements = {}
        default = sources.default_source
        dependencies.each do |dep|
          dep_source = dep.source || default
          dep_source.add_dependency_names(dep.name)
          requirements[dep.name] = dep_source
        end
        requirements
      end
    end

    def locked_requirements
      @locked_requirements ||= begin
        requirements = {}
        locked_specs.each do |locked_spec|
          source = locked_spec.source
          source.add_dependency_names(locked_spec.name)
          requirements[locked_spec.name] = source
        end
        requirements
      end
    end
  end
end
PK}$[�x)��2gems/gems/bundler-2.3.27/lib/bundler/gem_helper.rbnu�[���# frozen_string_literal: true

require_relative "../bundler"
require "shellwords"

module Bundler
  class GemHelper
    include Rake::DSL if defined? Rake::DSL

    class << self
      # set when install'd.
      attr_accessor :instance

      def install_tasks(opts = {})
        new(opts[:dir], opts[:name]).install
      end

      def tag_prefix=(prefix)
        instance.tag_prefix = prefix
      end

      def gemspec(&block)
        gemspec = instance.gemspec
        block.call(gemspec) if block
        gemspec
      end
    end

    attr_reader :spec_path, :base, :gemspec

    attr_writer :tag_prefix

    def initialize(base = nil, name = nil)
      @base = File.expand_path(base || SharedHelpers.pwd)
      gemspecs = name ? [File.join(@base, "#{name}.gemspec")] : Gem::Util.glob_files_in_dir("{,*}.gemspec", @base)
      raise "Unable to determine name from existing gemspec. Use :name => 'gemname' in #install_tasks to manually set it." unless gemspecs.size == 1
      @spec_path = gemspecs.first
      @gemspec = Bundler.load_gemspec(@spec_path)
      @tag_prefix = ""
    end

    def install
      built_gem_path = nil

      desc "Build #{name}-#{version}.gem into the pkg directory."
      task "build" do
        built_gem_path = build_gem
      end

      desc "Generate SHA512 checksum if #{name}-#{version}.gem into the checksums directory."
      task "build:checksum" => "build" do
        build_checksum(built_gem_path)
      end

      desc "Build and install #{name}-#{version}.gem into system gems."
      task "install" => "build" do
        install_gem(built_gem_path)
      end

      desc "Build and install #{name}-#{version}.gem into system gems without network access."
      task "install:local" => "build" do
        install_gem(built_gem_path, :local)
      end

      desc "Create tag #{version_tag} and build and push #{name}-#{version}.gem to #{gem_push_host}\n" \
           "To prevent publishing in RubyGems use `gem_push=no rake release`"
      task "release", [:remote] => ["build", "release:guard_clean",
                                    "release:source_control_push", "release:rubygem_push"] do
      end

      task "release:guard_clean" do
        guard_clean
      end

      task "release:source_control_push", [:remote] do |_, args|
        tag_version { git_push(args[:remote]) } unless already_tagged?
      end

      task "release:rubygem_push" => "build" do
        rubygem_push(built_gem_path) if gem_push?
      end

      GemHelper.instance = self
    end

    def build_gem
      file_name = nil
      sh([*gem_command, "build", "-V", spec_path]) do
        file_name = File.basename(built_gem_path)
        SharedHelpers.filesystem_access(File.join(base, "pkg")) {|p| FileUtils.mkdir_p(p) }
        FileUtils.mv(built_gem_path, "pkg")
        Bundler.ui.confirm "#{name} #{version} built to pkg/#{file_name}."
      end
      File.join(base, "pkg", file_name)
    end

    def install_gem(built_gem_path = nil, local = false)
      built_gem_path ||= build_gem
      cmd = [*gem_command, "install", built_gem_path.to_s]
      cmd << "--local" if local
      sh(cmd)
      Bundler.ui.confirm "#{name} (#{version}) installed."
    end

    def build_checksum(built_gem_path = nil)
      built_gem_path ||= build_gem
      SharedHelpers.filesystem_access(File.join(base, "checksums")) {|p| FileUtils.mkdir_p(p) }
      file_name = "#{File.basename(built_gem_path)}.sha512"
      require "digest/sha2"
      checksum = ::Digest::SHA512.file(built_gem_path).hexdigest
      target = File.join(base, "checksums", file_name)
      File.write(target, checksum + "\n")
      Bundler.ui.confirm "#{name} #{version} checksum written to checksums/#{file_name}."
    end

    protected

    def rubygem_push(path)
      cmd = [*gem_command, "push", path]
      cmd << "--key" << gem_key if gem_key
      cmd << "--host" << allowed_push_host if allowed_push_host
      sh_with_input(cmd)
      Bundler.ui.confirm "Pushed #{name} #{version} to #{gem_push_host}"
    end

    def built_gem_path
      Gem::Util.glob_files_in_dir("#{name}-*.gem", base).sort_by {|f| File.mtime(f) }.last
    end

    def git_push(remote = nil)
      remote ||= default_remote
      sh("git push #{remote} refs/heads/#{current_branch}".shellsplit)
      sh("git push #{remote} refs/tags/#{version_tag}".shellsplit)
      Bundler.ui.confirm "Pushed git commits and release tag."
    end

    def default_remote
      remote_for_branch, status = sh_with_status(%W[git config --get branch.#{current_branch}.remote])
      return "origin" unless status.success?

      remote_for_branch.strip
    end

    def current_branch
      # We can replace this with `git branch --show-current` once we drop support for git < 2.22.0
      sh(%w[git rev-parse --abbrev-ref HEAD]).gsub(%r{\Aheads/}, "").strip
    end

    def allowed_push_host
      @gemspec.metadata["allowed_push_host"] if @gemspec.respond_to?(:metadata)
    end

    def gem_push_host
      env_rubygems_host = ENV["RUBYGEMS_HOST"]
      env_rubygems_host = nil if
        env_rubygems_host && env_rubygems_host.empty?

      allowed_push_host || env_rubygems_host || "rubygems.org"
    end

    def already_tagged?
      return false unless sh(%w[git tag]).split(/\n/).include?(version_tag)
      Bundler.ui.confirm "Tag #{version_tag} has already been created."
      true
    end

    def guard_clean
      clean? && committed? || raise("There are files that need to be committed first.")
    end

    def clean?
      sh_with_status(%w[git diff --exit-code])[1].success?
    end

    def committed?
      sh_with_status(%w[git diff-index --quiet --cached HEAD])[1].success?
    end

    def tag_version
      sh %W[git tag -m Version\ #{version} #{version_tag}]
      Bundler.ui.confirm "Tagged #{version_tag}."
      yield if block_given?
    rescue RuntimeError
      Bundler.ui.error "Untagging #{version_tag} due to error."
      sh_with_status %W[git tag -d #{version_tag}]
      raise
    end

    def version
      gemspec.version
    end

    def version_tag
      "#{@tag_prefix}v#{version}"
    end

    def name
      gemspec.name
    end

    def sh_with_input(cmd)
      Bundler.ui.debug(cmd)
      SharedHelpers.chdir(base) do
        abort unless Kernel.system(*cmd)
      end
    end

    def sh(cmd, &block)
      out, status = sh_with_status(cmd, &block)
      unless status.success?
        raise("Running `#{cmd.shelljoin}` failed with the following output:\n\n#{out}\n")
      end
      out
    end

    def sh_with_status(cmd, &block)
      Bundler.ui.debug(cmd)
      SharedHelpers.chdir(base) do
        outbuf = IO.popen(cmd, :err => [:child, :out], &:read)
        status = $?
        block.call(outbuf) if status.success? && block
        [outbuf, status]
      end
    end

    def gem_key
      Bundler.settings["gem.push_key"].to_s.downcase if Bundler.settings["gem.push_key"]
    end

    def gem_push?
      !%w[n no nil false off 0].include?(ENV["gem_push"].to_s.downcase)
    end

    def gem_command
      ENV["GEM_COMMAND"]&.shellsplit || ["gem"]
    end
  end
end
PK}$[�9l5,5,/gems/gems/bundler-2.3.27/lib/bundler/fetcher.rbnu�[���# frozen_string_literal: true

require_relative "vendored_persistent"
require "cgi"
require "securerandom"
require "zlib"
require "rubygems/request"

module Bundler
  # Handles all the fetching with the rubygems server
  class Fetcher
    autoload :CompactIndex, File.expand_path("fetcher/compact_index", __dir__)
    autoload :Downloader, File.expand_path("fetcher/downloader", __dir__)
    autoload :Dependency, File.expand_path("fetcher/dependency", __dir__)
    autoload :Index, File.expand_path("fetcher/index", __dir__)

    # This error is raised when it looks like the network is down
    class NetworkDownError < HTTPError; end
    # This error is raised if we should rate limit our requests to the API
    class TooManyRequestsError < HTTPError; end
    # This error is raised if the API returns a 413 (only printed in verbose)
    class FallbackError < HTTPError; end

    # This is the error raised if OpenSSL fails the cert verification
    class CertificateFailureError < HTTPError
      def initialize(remote_uri)
        remote_uri = filter_uri(remote_uri)
        super "Could not verify the SSL certificate for #{remote_uri}.\nThere" \
          " is a chance you are experiencing a man-in-the-middle attack, but" \
          " most likely your system doesn't have the CA certificates needed" \
          " for verification. For information about OpenSSL certificates, see" \
          " https://railsapps.github.io/openssl-certificate-verify-failed.html." \
          " To connect without using SSL, edit your Gemfile" \
          " sources and change 'https' to 'http'."
      end
    end

    # This is the error raised when a source is HTTPS and OpenSSL didn't load
    class SSLError < HTTPError
      def initialize(msg = nil)
        super msg || "Could not load OpenSSL.\n" \
            "You must recompile Ruby with OpenSSL support or change the sources in your " \
            "Gemfile from 'https' to 'http'. Instructions for compiling with OpenSSL " \
            "using RVM are available at rvm.io/packages/openssl."
      end
    end

    # This error is raised if HTTP authentication is required, but not provided.
    class AuthenticationRequiredError < HTTPError
      def initialize(remote_uri)
        remote_uri = filter_uri(remote_uri)
        super "Authentication is required for #{remote_uri}.\n" \
          "Please supply credentials for this source. You can do this by running:\n" \
          "`bundle config set --global #{remote_uri} username:password`\n" \
          "or by storing the credentials in the `#{Settings.key_for(remote_uri)}` environment variable"
      end
    end

    # This error is raised if HTTP authentication is provided, but incorrect.
    class BadAuthenticationError < HTTPError
      def initialize(remote_uri)
        remote_uri = filter_uri(remote_uri)
        super "Bad username or password for #{remote_uri}.\n" \
          "Please double-check your credentials and correct them."
      end
    end

    # Exceptions classes that should bypass retry attempts. If your password didn't work the
    # first time, it's not going to the third time.
    NET_ERRORS = [:HTTPBadGateway, :HTTPBadRequest, :HTTPFailedDependency,
                  :HTTPForbidden, :HTTPInsufficientStorage, :HTTPMethodNotAllowed,
                  :HTTPMovedPermanently, :HTTPNoContent, :HTTPNotFound,
                  :HTTPNotImplemented, :HTTPPreconditionFailed, :HTTPRequestEntityTooLarge,
                  :HTTPRequestURITooLong, :HTTPUnauthorized, :HTTPUnprocessableEntity,
                  :HTTPUnsupportedMediaType, :HTTPVersionNotSupported].freeze
    FAIL_ERRORS = begin
      fail_errors = [AuthenticationRequiredError, BadAuthenticationError, FallbackError]
      fail_errors << Gem::Requirement::BadRequirementError
      fail_errors.concat(NET_ERRORS.map {|e| Net.const_get(e) })
    end.freeze

    class << self
      attr_accessor :disable_endpoint, :api_timeout, :redirect_limit, :max_retries
    end

    self.redirect_limit = Bundler.settings[:redirect] # How many redirects to allow in one request
    self.api_timeout    = Bundler.settings[:timeout] # How long to wait for each API call
    self.max_retries    = Bundler.settings[:retry] # How many retries for the API call

    def initialize(remote)
      @remote = remote

      Socket.do_not_reverse_lookup = true
      connection # create persistent connection
    end

    def uri
      @remote.anonymized_uri
    end

    # fetch a gem specification
    def fetch_spec(spec)
      spec -= [nil, "ruby", ""]
      spec_file_name = "#{spec.join "-"}.gemspec"

      uri = Bundler::URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz")
      if uri.scheme == "file"
        path = Bundler.rubygems.correct_for_windows_path(uri.path)
        Bundler.load_marshal Bundler.rubygems.inflate(Gem.read_binary(path))
      elsif cached_spec_path = gemspec_cached_path(spec_file_name)
        Bundler.load_gemspec(cached_spec_path)
      else
        Bundler.load_marshal Bundler.rubygems.inflate(downloader.fetch(uri).body)
      end
    rescue MarshalError
      raise HTTPError, "Gemspec #{spec} contained invalid data.\n" \
        "Your network or your gem server is probably having issues right now."
    end

    # return the specs in the bundler format as an index with retries
    def specs_with_retry(gem_names, source)
      Bundler::Retry.new("fetcher", FAIL_ERRORS).attempts do
        specs(gem_names, source)
      end
    end

    # return the specs in the bundler format as an index
    def specs(gem_names, source)
      index = Bundler::Index.new

      if Bundler::Fetcher.disable_endpoint
        @use_api = false
        specs = fetchers.last.specs(gem_names)
      else
        specs = []
        @fetchers = fetchers.drop_while do |f|
          !f.available? || (f.api_fetcher? && !gem_names) || !specs = f.specs(gem_names)
        end
        @use_api = false if fetchers.none?(&:api_fetcher?)
      end

      specs.each do |name, version, platform, dependencies, metadata|
        spec = if dependencies
          EndpointSpecification.new(name, version, platform, self, dependencies, metadata)
        else
          RemoteSpecification.new(name, version, platform, self)
        end
        spec.source = source
        spec.remote = @remote
        index << spec
      end

      index
    rescue CertificateFailureError
      Bundler.ui.info "" if gem_names && use_api # newline after dots
      raise
    end

    def use_api
      return @use_api if defined?(@use_api)

      fetchers.shift until fetchers.first.available?

      @use_api = if remote_uri.scheme == "file" || Bundler::Fetcher.disable_endpoint
        false
      else
        fetchers.first.api_fetcher?
      end
    end

    def user_agent
      @user_agent ||= begin
        ruby = Bundler::RubyVersion.system

        agent = String.new("bundler/#{Bundler::VERSION}")
        agent << " rubygems/#{Gem::VERSION}"
        agent << " ruby/#{ruby.versions_string(ruby.versions)}"
        agent << " (#{ruby.host})"
        agent << " command/#{ARGV.first}"

        if ruby.engine != "ruby"
          # engine_version raises on unknown engines
          engine_version = begin
                             ruby.engine_versions
                           rescue RuntimeError
                             "???"
                           end
          agent << " #{ruby.engine}/#{ruby.versions_string(engine_version)}"
        end

        agent << " options/#{Bundler.settings.all.join(",")}"

        agent << " ci/#{cis.join(",")}" if cis.any?

        # add a random ID so we can consolidate runs server-side
        agent << " " << SecureRandom.hex(8)

        # add any user agent strings set in the config
        extra_ua = Bundler.settings[:user_agent]
        agent << " " << extra_ua if extra_ua

        agent
      end
    end

    def fetchers
      @fetchers ||= FETCHERS.map {|f| f.new(downloader, @remote, uri) }
    end

    def http_proxy
      return unless uri = connection.proxy_uri
      uri.to_s
    end

    def inspect
      "#<#{self.class}:0x#{object_id} uri=#{uri}>"
    end

    private

    FETCHERS = [CompactIndex, Dependency, Index].freeze

    def cis
      env_cis = {
        "TRAVIS" => "travis",
        "CIRCLECI" => "circle",
        "SEMAPHORE" => "semaphore",
        "JENKINS_URL" => "jenkins",
        "BUILDBOX" => "buildbox",
        "GO_SERVER_URL" => "go",
        "SNAP_CI" => "snap",
        "GITLAB_CI" => "gitlab",
        "GITHUB_ACTIONS" => "github",
        "CI_NAME" => ENV["CI_NAME"],
        "CI" => "ci",
      }
      env_cis.find_all {|env, _| ENV[env] }.map {|_, ci| ci }
    end

    def connection
      @connection ||= begin
        needs_ssl = remote_uri.scheme == "https" ||
                    Bundler.settings[:ssl_verify_mode] ||
                    Bundler.settings[:ssl_client_cert]
        raise SSLError if needs_ssl && !defined?(OpenSSL::SSL)

        con = PersistentHTTP.new :name => "bundler", :proxy => :ENV
        if gem_proxy = Gem.configuration[:http_proxy]
          con.proxy = Bundler::URI.parse(gem_proxy) if gem_proxy != :no_proxy
        end

        if remote_uri.scheme == "https"
          con.verify_mode = (Bundler.settings[:ssl_verify_mode] ||
            OpenSSL::SSL::VERIFY_PEER)
          con.cert_store = bundler_cert_store
        end

        ssl_client_cert = Bundler.settings[:ssl_client_cert] ||
                          (Gem.configuration.ssl_client_cert if
                            Gem.configuration.respond_to?(:ssl_client_cert))
        if ssl_client_cert
          pem = File.read(ssl_client_cert)
          con.cert = OpenSSL::X509::Certificate.new(pem)
          con.key  = OpenSSL::PKey::RSA.new(pem)
        end

        con.read_timeout = Fetcher.api_timeout
        con.open_timeout = Fetcher.api_timeout
        con.override_headers["User-Agent"] = user_agent
        con.override_headers["X-Gemfile-Source"] = @remote.original_uri.to_s if @remote.original_uri
        con
      end
    end

    # cached gem specification path, if one exists
    def gemspec_cached_path(spec_file_name)
      paths = Bundler.rubygems.spec_cache_dirs.map {|dir| File.join(dir, spec_file_name) }
      paths.find {|path| File.file? path }
    end

    HTTP_ERRORS = [
      Timeout::Error, EOFError, SocketError, Errno::ENETDOWN, Errno::ENETUNREACH,
      Errno::EINVAL, Errno::ECONNRESET, Errno::ETIMEDOUT, Errno::EAGAIN,
      Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError,
      PersistentHTTP::Error, Zlib::BufError, Errno::EHOSTUNREACH
    ].freeze

    def bundler_cert_store
      store = OpenSSL::X509::Store.new
      ssl_ca_cert = Bundler.settings[:ssl_ca_cert] ||
                    (Gem.configuration.ssl_ca_cert if
                      Gem.configuration.respond_to?(:ssl_ca_cert))
      if ssl_ca_cert
        if File.directory? ssl_ca_cert
          store.add_path ssl_ca_cert
        else
          store.add_file ssl_ca_cert
        end
      else
        store.set_default_paths
        Gem::Request.get_cert_files.each {|c| store.add_file c }
      end
      store
    end

    def remote_uri
      @remote.uri
    end

    def downloader
      @downloader ||= Downloader.new(connection, self.class.redirect_limit)
    end
  end
end
PK}$[p2Ǥ��1gems/gems/bundler-2.3.27/lib/bundler/constants.rbnu�[���# frozen_string_literal: true

module Bundler
  WINDOWS = RbConfig::CONFIG["host_os"] =~ /(msdos|mswin|djgpp|mingw)/
  FREEBSD = RbConfig::CONFIG["host_os"] =~ /bsd/
  NULL    = WINDOWS ? "NUL" : "/dev/null"
end
PK}$[K�,�""6gems/gems/bundler-2.3.27/lib/bundler/match_metadata.rbnu�[���# frozen_string_literal: true

module Bundler
  module MatchMetadata
    def matches_current_ruby?
      @required_ruby_version.satisfied_by?(Gem.ruby_version)
    end

    def matches_current_rubygems?
      @required_rubygems_version.satisfied_by?(Gem.rubygems_version)
    end
  end
end
PK}$[��>--.gems/gems/bundler-2.3.27/lib/bundler/plugin.rbnu�[���# frozen_string_literal: true

require_relative "plugin/api"

module Bundler
  module Plugin
    autoload :DSL,        File.expand_path("plugin/dsl", __dir__)
    autoload :Events,     File.expand_path("plugin/events", __dir__)
    autoload :Index,      File.expand_path("plugin/index", __dir__)
    autoload :Installer,  File.expand_path("plugin/installer", __dir__)
    autoload :SourceList, File.expand_path("plugin/source_list", __dir__)

    class MalformattedPlugin < PluginError; end
    class UndefinedCommandError < PluginError; end
    class UnknownSourceError < PluginError; end
    class PluginInstallError < PluginError; end

    PLUGIN_FILE_NAME = "plugins.rb".freeze

    module_function

    def reset!
      instance_variables.each {|i| remove_instance_variable(i) }

      @sources = {}
      @commands = {}
      @hooks_by_event = Hash.new {|h, k| h[k] = [] }
      @loaded_plugin_names = []
    end

    reset!

    # Installs a new plugin by the given name
    #
    # @param [Array<String>] names the name of plugin to be installed
    # @param [Hash] options various parameters as described in description.
    #               Refer to cli/plugin for available options
    def install(names, options)
      raise InvalidOption, "You cannot specify `--branch` and `--ref` at the same time." if options["branch"] && options["ref"]

      specs = Installer.new.install(names, options)

      save_plugins names, specs
    rescue PluginError
      specs_to_delete = specs.select {|k, _v| names.include?(k) && !index.commands.values.include?(k) }
      specs_to_delete.each_value {|spec| Bundler.rm_rf(spec.full_gem_path) }

      raise
    end

    # Uninstalls plugins by the given names
    #
    # @param [Array<String>] names the names of plugins to be uninstalled
    def uninstall(names, options)
      if names.empty? && !options[:all]
        Bundler.ui.error "No plugins to uninstall. Specify at least 1 plugin to uninstall.\n"\
          "Use --all option to uninstall all the installed plugins."
        return
      end

      names = index.installed_plugins if options[:all]
      if names.any?
        names.each do |name|
          if index.installed?(name)
            Bundler.rm_rf(index.plugin_path(name))
            index.unregister_plugin(name)
            Bundler.ui.info "Uninstalled plugin #{name}"
          else
            Bundler.ui.error "Plugin #{name} is not installed \n"
          end
        end
      else
        Bundler.ui.info "No plugins installed"
      end
    end

    # List installed plugins and commands
    #
    def list
      installed_plugins = index.installed_plugins
      if installed_plugins.any?
        output = String.new
        installed_plugins.each do |plugin|
          output << "#{plugin}\n"
          output << "-----\n"
          index.plugin_commands(plugin).each do |command|
            output << "  #{command}\n"
          end
          output << "\n"
        end
      else
        output = "No plugins installed"
      end
      Bundler.ui.info output
    end

    # Evaluates the Gemfile with a limited DSL and installs the plugins
    # specified by plugin method
    #
    # @param [Pathname] gemfile path
    # @param [Proc] block that can be evaluated for (inline) Gemfile
    def gemfile_install(gemfile = nil, &inline)
      Bundler.settings.temporary(:frozen => false, :deployment => false) do
        builder = DSL.new
        if block_given?
          builder.instance_eval(&inline)
        else
          builder.eval_gemfile(gemfile)
        end
        builder.check_primary_source_safety
        definition = builder.to_definition(nil, true)

        return if definition.dependencies.empty?

        plugins = definition.dependencies.map(&:name).reject {|p| index.installed? p }
        installed_specs = Installer.new.install_definition(definition)

        save_plugins plugins, installed_specs, builder.inferred_plugins
      end
    rescue RuntimeError => e
      unless e.is_a?(GemfileError)
        Bundler.ui.error "Failed to install plugin: #{e.message}\n  #{e.backtrace[0]}"
      end
      raise
    end

    # The index object used to store the details about the plugin
    def index
      @index ||= Index.new
    end

    # The directory root for all plugin related data
    #
    # If run in an app, points to local root, in app_config_path
    # Otherwise, points to global root, in Bundler.user_bundle_path("plugin")
    def root
      @root ||= if SharedHelpers.in_bundle?
        local_root
      else
        global_root
      end
    end

    def local_root
      Bundler.app_config_path.join("plugin")
    end

    # The global directory root for all plugin related data
    def global_root
      Bundler.user_bundle_path("plugin")
    end

    # The cache directory for plugin stuffs
    def cache
      @cache ||= root.join("cache")
    end

    # To be called via the API to register to handle a command
    def add_command(command, cls)
      @commands[command] = cls
    end

    # Checks if any plugin handles the command
    def command?(command)
      !index.command_plugin(command).nil?
    end

    # To be called from Cli class to pass the command and argument to
    # appropriate plugin class
    def exec_command(command, args)
      raise UndefinedCommandError, "Command `#{command}` not found" unless command? command

      load_plugin index.command_plugin(command) unless @commands.key? command

      @commands[command].new.exec(command, args)
    end

    # To be called via the API to register to handle a source plugin
    def add_source(source, cls)
      @sources[source] = cls
    end

    # Checks if any plugin declares the source
    def source?(name)
      !index.source_plugin(name.to_s).nil?
    end

    # @return [Class] that handles the source. The class includes API::Source
    def source(name)
      raise UnknownSourceError, "Source #{name} not found" unless source? name

      load_plugin(index.source_plugin(name)) unless @sources.key? name

      @sources[name]
    end

    # @param [Hash] The options that are present in the lock file
    # @return [API::Source] the instance of the class that handles the source
    #                       type passed in locked_opts
    def source_from_lock(locked_opts)
      src = source(locked_opts["type"])

      src.new(locked_opts.merge("uri" => locked_opts["remote"]))
    end

    # To be called via the API to register a hooks and corresponding block that
    # will be called to handle the hook
    def add_hook(event, &block)
      unless Events.defined_event?(event)
        raise ArgumentError, "Event '#{event}' not defined in Bundler::Plugin::Events"
      end
      @hooks_by_event[event.to_s] << block
    end

    # Runs all the hooks that are registered for the passed event
    #
    # It passes the passed arguments and block to the block registered with
    # the api.
    #
    # @param [String] event
    def hook(event, *args, &arg_blk)
      return unless Bundler.feature_flag.plugins?
      unless Events.defined_event?(event)
        raise ArgumentError, "Event '#{event}' not defined in Bundler::Plugin::Events"
      end

      plugins = index.hook_plugins(event)
      return unless plugins.any?

      (plugins - @loaded_plugin_names).each {|name| load_plugin(name) }

      @hooks_by_event[event].each {|blk| blk.call(*args, &arg_blk) }
    end

    # currently only intended for specs
    #
    # @return [String, nil] installed path
    def installed?(plugin)
      Index.new.installed?(plugin)
    end

    # Post installation processing and registering with index
    #
    # @param [Array<String>] plugins list to be installed
    # @param [Hash] specs of plugins mapped to installation path (currently they
    #               contain all the installed specs, including plugins)
    # @param [Array<String>] names of inferred source plugins that can be ignored
    def save_plugins(plugins, specs, optional_plugins = [])
      plugins.each do |name|
        next if index.installed?(name)

        spec = specs[name]

        save_plugin(name, spec, optional_plugins.include?(name))
      end
    end

    # Checks if the gem is good to be a plugin
    #
    # At present it only checks whether it contains plugins.rb file
    #
    # @param [Pathname] plugin_path the path plugin is installed at
    # @raise [MalformattedPlugin] if plugins.rb file is not found
    def validate_plugin!(plugin_path)
      plugin_file = plugin_path.join(PLUGIN_FILE_NAME)
      raise MalformattedPlugin, "#{PLUGIN_FILE_NAME} was not found in the plugin." unless plugin_file.file?
    end

    # Validates and registers a plugin.
    #
    # @param [String] name the name of the plugin
    # @param [Specification] spec of installed plugin
    # @param [Boolean] optional_plugin, removed if there is conflict with any
    #                     other plugin (used for default source plugins)
    #
    # @raise [PluginInstallError] if validation or registration raises any error
    def save_plugin(name, spec, optional_plugin = false)
      validate_plugin! Pathname.new(spec.full_gem_path)
      installed = register_plugin(name, spec, optional_plugin)
      Bundler.ui.info "Installed plugin #{name}" if installed
    rescue PluginError => e
      raise PluginInstallError, "Failed to install plugin `#{spec.name}`, due to #{e.class} (#{e.message})"
    end

    # Runs the plugins.rb file in an isolated namespace, records the plugin
    # actions it registers for and then passes the data to index to be stored.
    #
    # @param [String] name the name of the plugin
    # @param [Specification] spec of installed plugin
    # @param [Boolean] optional_plugin, removed if there is conflict with any
    #                     other plugin (used for default source plugins)
    #
    # @raise [MalformattedPlugin] if plugins.rb raises any error
    def register_plugin(name, spec, optional_plugin = false)
      commands = @commands
      sources = @sources
      hooks = @hooks_by_event

      @commands = {}
      @sources = {}
      @hooks_by_event = Hash.new {|h, k| h[k] = [] }

      load_paths = spec.load_paths
      Bundler.rubygems.add_to_load_path(load_paths)
      path = Pathname.new spec.full_gem_path

      begin
        load path.join(PLUGIN_FILE_NAME), true
      rescue StandardError => e
        raise MalformattedPlugin, "#{e.class}: #{e.message}"
      end

      if optional_plugin && @sources.keys.any? {|s| source? s }
        Bundler.rm_rf(path)
        false
      else
        index.register_plugin(name, path.to_s, load_paths, @commands.keys,
          @sources.keys, @hooks_by_event.keys)
        true
      end
    ensure
      @commands = commands
      @sources = sources
      @hooks_by_event = hooks
    end

    # Executes the plugins.rb file
    #
    # @param [String] name of the plugin
    def load_plugin(name)
      return unless name && !name.empty?

      # Need to ensure before this that plugin root where the rest of gems
      # are installed to be on load path to support plugin deps. Currently not
      # done to avoid conflicts
      path = index.plugin_path(name)

      Bundler.rubygems.add_to_load_path(index.load_paths(name))

      load path.join(PLUGIN_FILE_NAME)

      @loaded_plugin_names << name
    rescue RuntimeError => e
      Bundler.ui.error "Failed loading plugin #{name}: #{e.message}"
      raise
    end

    class << self
      private :load_plugin, :register_plugin, :save_plugins, :validate_plugin!
    end
  end
end
PK}$[{�*!''.gems/gems/bundler-2.3.27/lib/bundler/source.rbnu�[���# frozen_string_literal: true

module Bundler
  class Source
    autoload :Gemspec,  File.expand_path("source/gemspec", __dir__)
    autoload :Git,      File.expand_path("source/git", __dir__)
    autoload :Metadata, File.expand_path("source/metadata", __dir__)
    autoload :Path,     File.expand_path("source/path", __dir__)
    autoload :Rubygems, File.expand_path("source/rubygems", __dir__)
    autoload :RubygemsAggregate, File.expand_path("source/rubygems_aggregate", __dir__)

    attr_accessor :dependency_names

    def unmet_deps
      specs.unmet_dependency_names
    end

    def version_message(spec, locked_spec = nil)
      message = "#{spec.name} #{spec.version}"
      message += " (#{spec.platform})" if spec.platform != Gem::Platform::RUBY && !spec.platform.nil?

      if locked_spec
        locked_spec_version = locked_spec.version
        if locked_spec_version && spec.version != locked_spec_version
          message += Bundler.ui.add_color(" (was #{locked_spec_version})", version_color(spec.version, locked_spec_version))
        end
      end

      message
    end

    def can_lock?(spec)
      spec.source == self
    end

    def local!; end

    def local_only!; end

    def cached!; end

    def remote!; end

    def add_dependency_names(names)
      @dependency_names = Array(dependency_names) | Array(names)
    end

    # it's possible that gems from one source depend on gems from some
    # other source, so now we download gemspecs and iterate over those
    # dependencies, looking for gems we don't have info on yet.
    def double_check_for(*); end

    def dependency_names_to_double_check
      specs.dependency_names
    end

    def spec_names
      specs.spec_names
    end

    def include?(other)
      other == self
    end

    def inspect
      "#<#{self.class}:0x#{object_id} #{self}>"
    end

    def identifier
      to_s
    end

    def path?
      instance_of?(Bundler::Source::Path)
    end

    def extension_cache_path(spec)
      return unless Bundler.feature_flag.global_gem_cache?
      return unless source_slug = extension_cache_slug(spec)
      Bundler.user_cache.join(
        "extensions", Gem::Platform.local.to_s, Bundler.ruby_scope,
        source_slug, spec.full_name
      )
    end

    private

    def version_color(spec_version, locked_spec_version)
      if Gem::Version.correct?(spec_version) && Gem::Version.correct?(locked_spec_version)
        # display yellow if there appears to be a regression
        earlier_version?(spec_version, locked_spec_version) ? :yellow : :green
      else
        # default to green if the versions cannot be directly compared
        :green
      end
    end

    def earlier_version?(spec_version, locked_spec_version)
      Gem::Version.new(spec_version) < Gem::Version.new(locked_spec_version)
    end

    def print_using_message(message)
      if !message.include?("(was ") && Bundler.feature_flag.suppress_install_using_messages?
        Bundler.ui.debug message
      else
        Bundler.ui.info message
      end
    end

    def extension_cache_slug(_)
      nil
    end
  end
end
PK}$[���''3gems/gems/bundler-2.3.27/lib/bundler/source_list.rbnu�[���# frozen_string_literal: true

module Bundler
  class SourceList
    attr_reader :path_sources,
      :git_sources,
      :plugin_sources,
      :global_path_source,
      :metadata_source

    def global_rubygems_source
      @global_rubygems_source ||= rubygems_aggregate_class.new("allow_local" => true)
    end

    def initialize
      @path_sources           = []
      @git_sources            = []
      @plugin_sources         = []
      @global_rubygems_source = nil
      @global_path_source     = nil
      @rubygems_sources       = []
      @metadata_source        = Source::Metadata.new

      @merged_gem_lockfile_sections = false
    end

    def merged_gem_lockfile_sections?
      @merged_gem_lockfile_sections
    end

    def merged_gem_lockfile_sections!(replacement_source)
      @merged_gem_lockfile_sections = true
      @global_rubygems_source = replacement_source
    end

    def aggregate_global_source?
      global_rubygems_source.multiple_remotes?
    end

    def implicit_global_source?
      global_rubygems_source.no_remotes?
    end

    def add_path_source(options = {})
      if options["gemspec"]
        add_source_to_list Source::Gemspec.new(options), path_sources
      else
        path_source = add_source_to_list Source::Path.new(options), path_sources
        @global_path_source ||= path_source if options["global"]
        path_source
      end
    end

    def add_git_source(options = {})
      add_source_to_list(Source::Git.new(options), git_sources).tap do |source|
        warn_on_git_protocol(source)
      end
    end

    def add_rubygems_source(options = {})
      new_source = Source::Rubygems.new(options)
      return @global_rubygems_source if @global_rubygems_source == new_source

      add_source_to_list new_source, @rubygems_sources
    end

    def add_plugin_source(source, options = {})
      add_source_to_list Plugin.source(source).new(options), @plugin_sources
    end

    def add_global_rubygems_remote(uri)
      global_rubygems_source.add_remote(uri)
      global_rubygems_source
    end

    def default_source
      global_path_source || global_rubygems_source
    end

    def rubygems_sources
      non_global_rubygems_sources + [global_rubygems_source]
    end

    def non_global_rubygems_sources
      @rubygems_sources
    end

    def rubygems_remotes
      rubygems_sources.map(&:remotes).flatten.uniq
    end

    def all_sources
      path_sources + git_sources + plugin_sources + rubygems_sources + [metadata_source]
    end

    def non_default_explicit_sources
      all_sources - [default_source, metadata_source]
    end

    def get(source)
      source_list_for(source).find {|s| equivalent_source?(source, s) }
    end

    def get_with_fallback(source)
      get(source) || default_source
    end

    def lock_sources
      lock_other_sources + lock_rubygems_sources
    end

    def lock_other_sources
      (path_sources + git_sources + plugin_sources).sort_by(&:identifier)
    end

    def lock_rubygems_sources
      if merged_gem_lockfile_sections?
        [combine_rubygems_sources]
      else
        rubygems_sources.sort_by(&:identifier)
      end
    end

    # Returns true if there are changes
    def replace_sources!(replacement_sources)
      return false if replacement_sources.empty?

      @rubygems_sources, @path_sources, @git_sources, @plugin_sources = map_sources(replacement_sources)
      @global_rubygems_source = global_replacement_source(replacement_sources)

      different_sources?(lock_sources, replacement_sources)
    end

    # Returns true if there are changes
    def expired_sources?(replacement_sources)
      return false if replacement_sources.empty?

      lock_sources = dup_with_replaced_sources(replacement_sources).lock_sources

      different_sources?(lock_sources, replacement_sources)
    end

    def local_only!
      all_sources.each(&:local_only!)
    end

    def cached!
      all_sources.each(&:cached!)
    end

    def remote!
      all_sources.each(&:remote!)
    end

    private

    def dup_with_replaced_sources(replacement_sources)
      new_source_list = dup
      new_source_list.replace_sources!(replacement_sources)
      new_source_list
    end

    def map_sources(replacement_sources)
      [@rubygems_sources, @path_sources, @git_sources, @plugin_sources].map do |sources|
        sources.map do |source|
          replacement_sources.find {|s| s == source } || source
        end
      end
    end

    def global_replacement_source(replacement_sources)
      replacement_source = replacement_sources.find {|s| s == global_rubygems_source }
      return global_rubygems_source unless replacement_source

      replacement_source.local!
      replacement_source
    end

    def different_sources?(lock_sources, replacement_sources)
      !equivalent_sources?(lock_sources, replacement_sources)
    end

    def rubygems_aggregate_class
      Source::Rubygems
    end

    def add_source_to_list(source, list)
      list.unshift(source).uniq!
      source
    end

    def source_list_for(source)
      case source
      when Source::Git          then git_sources
      when Source::Path         then path_sources
      when Source::Rubygems     then rubygems_sources
      when Plugin::API::Source  then plugin_sources
      else raise ArgumentError, "Invalid source: #{source.inspect}"
      end
    end

    def combine_rubygems_sources
      Source::Rubygems.new("remotes" => rubygems_remotes)
    end

    def warn_on_git_protocol(source)
      return if Bundler.settings["git.allow_insecure"]

      if source.uri =~ /^git\:/
        Bundler.ui.warn "The git source `#{source.uri}` uses the `git` protocol, " \
          "which transmits data without encryption. Disable this warning with " \
          "`bundle config set --local git.allow_insecure true`, or switch to the `https` " \
          "protocol to keep your data secure."
      end
    end

    def equivalent_sources?(lock_sources, replacement_sources)
      lock_sources.sort_by(&:identifier) == replacement_sources.sort_by(&:identifier)
    end

    def equivalent_source?(source, other_source)
      source == other_source
    end
  end
end
PK}$[�[F�U5U50gems/gems/bundler-2.3.27/lib/bundler/resolver.rbnu�[���# frozen_string_literal: true

module Bundler
  class Resolver
    require_relative "vendored_molinillo"
    require_relative "resolver/base"
    require_relative "resolver/spec_group"

    include GemHelpers

    def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
      @source_requirements = source_requirements
      @base = Resolver::Base.new(base, additional_base_requirements)
      @resolver = Molinillo::Resolver.new(self, self)
      @results_for = {}
      @search_for = {}
      @platforms = platforms
      @resolving_only_for_ruby = platforms == [Gem::Platform::RUBY]
      @gem_version_promoter = gem_version_promoter
    end

    def start(requirements, exclude_specs: [])
      @metadata_requirements, regular_requirements = requirements.partition {|dep| dep.name.end_with?("\0") }

      exclude_specs.each do |spec|
        remove_from_candidates(spec)
      end

      requirements.each {|dep| prerelease_specified[dep.name] ||= dep.prerelease? }

      verify_gemfile_dependencies_are_found!(requirements)
      result = @resolver.resolve(requirements).
        map(&:payload).
        reject {|sg| sg.name.end_with?("\0") }.
        map(&:to_specs).
        flatten

      SpecSet.new(SpecSet.new(result).for(regular_requirements, false, @platforms))
    rescue Molinillo::VersionConflict => e
      conflicts = e.conflicts

      deps_to_unlock = conflicts.values.inject([]) do |deps, conflict|
        deps |= conflict.requirement_trees.flatten.map {|req| base_requirements[req.name] }.compact
      end

      if deps_to_unlock.any?
        @base.unlock_deps(deps_to_unlock)
        reset_spec_cache
        retry
      end

      message = version_conflict_message(e)
      raise VersionConflict.new(conflicts.keys.uniq, message)
    rescue Molinillo::CircularDependencyError => e
      names = e.dependencies.sort_by(&:name).map {|d| "gem '#{d.name}'" }
      raise CyclicDependencyError, "Your bundle requires gems that depend" \
        " on each other, creating an infinite loop. Please remove" \
        " #{names.count > 1 ? "either " : ""}#{names.join(" or ")}" \
        " and try again."
    end

    include Molinillo::UI

    # Conveys debug information to the user.
    #
    # @param [Integer] depth the current depth of the resolution process.
    # @return [void]
    def debug(depth = 0)
      return unless debug?
      debug_info = yield
      debug_info = debug_info.inspect unless debug_info.is_a?(String)
      puts debug_info.split("\n").map {|s| depth == 0 ? "BUNDLER: #{s}" : "BUNDLER(#{depth}): #{s}" }
    end

    def debug?
      return @debug_mode if defined?(@debug_mode)
      @debug_mode =
        ENV["BUNDLER_DEBUG_RESOLVER"] ||
        ENV["BUNDLER_DEBUG_RESOLVER_TREE"] ||
        ENV["DEBUG_RESOLVER"] ||
        ENV["DEBUG_RESOLVER_TREE"] ||
        false
    end

    def before_resolution
      Bundler.ui.info "Resolving dependencies...", debug?
    end

    def after_resolution
      Bundler.ui.info ""
    end

    def indicate_progress
      Bundler.ui.info ".", false unless debug?
    end

    include Molinillo::SpecificationProvider

    def dependencies_for(specification)
      specification.dependencies_for_activated_platforms
    end

    def search_for(dependency)
      @search_for[dependency] ||= begin
        name = dependency.name
        locked_results = @base[name].select {|spec| requirement_satisfied_by?(dependency, nil, spec) }
        locked_requirement = base_requirements[name]
        results = results_for(dependency) + locked_results
        results = results.select {|spec| requirement_satisfied_by?(locked_requirement, nil, spec) } if locked_requirement
        dep_platforms = dependency.gem_platforms(@platforms)

        @gem_version_promoter.sort_versions(dependency, results).group_by(&:version).reduce([]) do |groups, (_, specs)|
          relevant_platforms = dep_platforms.select {|platform| specs.any? {|spec| spec.match_platform(platform) } }
          next groups unless relevant_platforms.any?

          ruby_specs = select_best_platform_match(specs, Gem::Platform::RUBY)
          if ruby_specs.any?
            spec_group_ruby = SpecGroup.new(ruby_specs, [Gem::Platform::RUBY])
            spec_group_ruby.force_ruby_platform = dependency.force_ruby_platform
            groups << spec_group_ruby
          end

          next groups if @resolving_only_for_ruby || dependency.force_ruby_platform

          platform_specs = relevant_platforms.flat_map {|platform| select_best_platform_match(specs, platform) }
          next groups if platform_specs == ruby_specs

          spec_group = SpecGroup.new(platform_specs, relevant_platforms)
          groups << spec_group

          groups
        end
      end
    end

    def index_for(dependency)
      source_for(dependency.name).specs
    end

    def source_for(name)
      @source_requirements[name] || @source_requirements[:default]
    end

    def results_for(dependency)
      @results_for[dependency] ||= index_for(dependency).search(dependency)
    end

    def name_for(dependency)
      dependency.name
    end

    def name_for_explicit_dependency_source
      Bundler.default_gemfile.basename.to_s
    rescue StandardError
      "Gemfile"
    end

    def requirement_satisfied_by?(requirement, activated, spec)
      requirement.matches_spec?(spec) || spec.source.is_a?(Source::Gemspec)
    end

    def sort_dependencies(dependencies, activated, conflicts)
      dependencies.sort_by do |dependency|
        name = name_for(dependency)
        vertex = activated.vertex_named(name)
        [
          @base[name].any? ? 0 : 1,
          vertex.payload ? 0 : 1,
          vertex.root? ? 0 : 1,
          amount_constrained(dependency),
          conflicts[name] ? 0 : 1,
          vertex.payload ? 0 : search_for(dependency).count,
        ]
      end
    end

    private

    def base_requirements
      @base.base_requirements
    end

    def prerelease_specified
      @gem_version_promoter.prerelease_specified
    end

    def remove_from_candidates(spec)
      @base.delete(spec)

      @results_for.keys.each do |dep|
        next unless dep.name == spec.name

        @results_for[dep].reject {|s| s.name == spec.name && s.version == spec.version }
      end

      reset_spec_cache
    end

    def reset_spec_cache
      @search_for = {}
      @gem_version_promoter.reset
    end

    # returns an integer \in (-\infty, 0]
    # a number closer to 0 means the dependency is less constraining
    #
    # dependencies w/ 0 or 1 possibilities (ignoring version requirements)
    # are given very negative values, so they _always_ sort first,
    # before dependencies that are unconstrained
    def amount_constrained(dependency)
      @amount_constrained ||= {}
      @amount_constrained[dependency.name] ||= if (base = @base[dependency.name]) && !base.empty?
        dependency.requirement.satisfied_by?(base.first.version) ? 0 : 1
      else
        all = index_for(dependency).search(dependency.name).size

        if all <= 1
          all - 1_000_000
        else
          search = search_for(dependency)
          search = prerelease_specified[dependency.name] ? search.count : search.count {|s| !s.version.prerelease? }
          search - all
        end
      end
    end

    def verify_gemfile_dependencies_are_found!(requirements)
      requirements.map! do |requirement|
        name = requirement.name
        next requirement if name == "bundler"
        next if requirement.gem_platforms(@platforms).empty?
        next requirement unless search_for(requirement).empty?
        next unless requirement.current_platform?

        raise GemNotFound, gem_not_found_message(name, requirement, source_for(name))
      end.compact!
    end

    def gem_not_found_message(name, requirement, source, extra_message = "")
      specs = source.specs.search(name).sort_by {|s| [s.version, s.platform.to_s] }
      matching_part = name
      requirement_label = SharedHelpers.pretty_dependency(requirement)
      cache_message = begin
                          " or in gems cached in #{Bundler.settings.app_cache_path}" if Bundler.app_cache.exist?
                        rescue GemfileNotFound
                          nil
                        end
      specs_matching_requirement = specs.select {| spec| requirement.matches_spec?(spec) }

      if specs_matching_requirement.any?
        specs = specs_matching_requirement
        matching_part = requirement_label
        platforms = requirement.gem_platforms(@platforms)
        platform_label = platforms.size == 1 ? "platform '#{platforms.first}" : "platforms '#{platforms.join("', '")}"
        requirement_label = "#{requirement_label}' with #{platform_label}"
      end

      message = String.new("Could not find gem '#{requirement_label}'#{extra_message} in #{source}#{cache_message}.\n")

      if specs.any?
        message << "\nThe source contains the following gems matching '#{matching_part}':\n"
        message << specs.map {|s| "  * #{s.full_name}" }.join("\n")
      end

      message
    end

    def version_conflict_message(e)
      # only show essential conflicts, if possible
      conflicts = e.conflicts.dup

      if conflicts["bundler"]
        conflicts.replace("bundler" => conflicts["bundler"])
      else
        conflicts.delete_if do |_name, conflict|
          deps = conflict.requirement_trees.map(&:last).flatten(1)
          !Bundler::VersionRanges.empty?(*Bundler::VersionRanges.for_many(deps.map(&:requirement)))
        end
      end

      e = Molinillo::VersionConflict.new(conflicts, e.specification_provider) unless conflicts.empty?

      e.message_with_trees(
        :full_message_for_conflict => lambda do |name, conflict|
          trees = conflict.requirement_trees

          # called first, because we want to reduce the amount of work required to find maximal empty sets
          trees = trees.uniq {|t| t.flatten.map {|dep| [dep.name, dep.requirement] } }

          # bail out if tree size is too big for Array#combination to make any sense
          if trees.size <= 15
            maximal = 1.upto(trees.size).map do |size|
              trees.map(&:last).flatten(1).combination(size).to_a
            end.flatten(1).select do |deps|
              Bundler::VersionRanges.empty?(*Bundler::VersionRanges.for_many(deps.map(&:requirement)))
            end.min_by(&:size)

            trees.reject! {|t| !maximal.include?(t.last) } if maximal

            trees.sort_by! {|t| t.reverse.map(&:name) }
          end

          if trees.size > 1 || name == "bundler"
            o = if name.end_with?("\0")
              String.new("Bundler found conflicting requirements for the #{name} version:")
            else
              String.new("Bundler could not find compatible versions for gem \"#{name}\":")
            end
            o << %(\n)
            o << %(  In #{name_for_explicit_dependency_source}:\n)
            o << trees.map do |tree|
              t = "".dup
              depth = 2

              base_tree = tree.first
              base_tree_name = base_tree.name

              if base_tree_name.end_with?("\0")
                t = nil
              else
                tree.each do |req|
                  t << "  " * depth << SharedHelpers.pretty_dependency(req)
                  unless tree.last == req
                    if spec = conflict.activated_by_name[req.name]
                      t << %( was resolved to #{spec.version}, which)
                    end
                    t << %( depends on)
                  end
                  t << %(\n)
                  depth += 1
                end
              end
              t
            end.compact.join("\n")
          else
            o = String.new
          end

          if name == "bundler"
            o << %(\n  Current Bundler version:\n    bundler (#{Bundler::VERSION}))

            conflict_dependency = conflict.requirement
            conflict_requirement = conflict_dependency.requirement
            other_bundler_required = !conflict_requirement.satisfied_by?(Gem::Version.new(Bundler::VERSION))

            if other_bundler_required
              o << "\n\n"

              candidate_specs = source_for(:default_bundler).specs.search(conflict_dependency)
              if candidate_specs.any?
                target_version = candidate_specs.last.version
                new_command = [File.basename($PROGRAM_NAME), "_#{target_version}_", *ARGV].join(" ")
                o << "Your bundle requires a different version of Bundler than the one you're running.\n"
                o << "Install the necessary version with `gem install bundler:#{target_version}` and rerun bundler using `#{new_command}`\n"
              else
                o << "Your bundle requires a different version of Bundler than the one you're running, and that version could not be found.\n"
              end
            end
          elsif name.end_with?("\0")
            o << %(\n  Current #{name} version:\n    #{SharedHelpers.pretty_dependency(@metadata_requirements.find {|req| req.name == name })}\n\n)
          elsif !conflict.existing
            o << "\n"

            relevant_source = conflict.requirement.source || source_for(name)

            extra_message = if trees.first.size > 1
              ", which is required by gem '#{SharedHelpers.pretty_dependency(trees.first[-2])}',"
            else
              ""
            end

            o << gem_not_found_message(name, conflict.requirement, relevant_source, extra_message)
          end

          o
        end
      )
    end
  end
end
PK}$[���\\Agems/gems/bundler-2.3.27/lib/bundler/source/rubygems_aggregate.rbnu�[���# frozen_string_literal: true

module Bundler
  class Source
    class RubygemsAggregate
      attr_reader :source_map, :sources

      def initialize(sources, source_map)
        @sources = sources
        @source_map = source_map

        @index = build_index
      end

      def specs
        @index
      end

      def identifier
        to_s
      end

      def to_s
        "any of the sources"
      end

      private

      def build_index
        Index.build do |idx|
          dependency_names = source_map.pinned_spec_names

          sources.all_sources.each do |source|
            source.dependency_names = dependency_names - source_map.pinned_spec_names(source)
            idx.add_source source.specs
            dependency_names.concat(source.unmet_deps).uniq!
          end

          double_check_for_index(idx, dependency_names)
        end
      end

      # Suppose the gem Foo depends on the gem Bar.  Foo exists in Source A.  Bar has some versions that exist in both
      # sources A and B.  At this point, the API request will have found all the versions of Bar in source A,
      # but will not have found any versions of Bar from source B, which is a problem if the requested version
      # of Foo specifically depends on a version of Bar that is only found in source B. This ensures that for
      # each spec we found, we add all possible versions from all sources to the index.
      def double_check_for_index(idx, dependency_names)
        pinned_names = source_map.pinned_spec_names

        names = :names # do this so we only have to traverse to get dependency_names from the index once
        unmet_dependency_names = lambda do
          return names unless names == :names
          new_names = sources.all_sources.map(&:dependency_names_to_double_check)
          return names = nil if new_names.compact!
          names = new_names.flatten(1).concat(dependency_names)
          names.uniq!
          names -= pinned_names
          names
        end

        sources.all_sources.each do |source|
          source.double_check_for(unmet_dependency_names)
        end
      end
    end
  end
end
PK}$[�ƨ'6gems/gems/bundler-2.3.27/lib/bundler/source/gemspec.rbnu�[���# frozen_string_literal: true

module Bundler
  class Source
    class Gemspec < Path
      attr_reader :gemspec

      def initialize(options)
        super
        @gemspec = options["gemspec"]
      end

      def as_path_source
        Path.new(options)
      end
    end
  end
end
PK}$[6]m�<<3gems/gems/bundler-2.3.27/lib/bundler/source/path.rbnu�[���# frozen_string_literal: true

module Bundler
  class Source
    class Path < Source
      autoload :Installer, File.expand_path("path/installer", __dir__)

      attr_reader :path, :options, :root_path, :original_path
      attr_writer :name
      attr_accessor :version

      protected :original_path

      DEFAULT_GLOB = "{,*,*/*}.gemspec".freeze

      def initialize(options)
        @options = options.dup
        @glob = options["glob"] || DEFAULT_GLOB

        @allow_cached = false
        @allow_remote = false

        @root_path = options["root_path"] || root

        if options["path"]
          @path = Pathname.new(options["path"])
          expanded_path = expand(@path)
          @path = if @path.relative?
            expanded_path.relative_path_from(root_path.expand_path)
          else
            expanded_path
          end
        end

        @name    = options["name"]
        @version = options["version"]

        # Stores the original path. If at any point we move to the
        # cached directory, we still have the original path to copy from.
        @original_path = @path
      end

      def remote!
        @local_specs = nil
        @allow_remote = true
      end

      def cached!
        @local_specs = nil
        @allow_cached = true
      end

      def self.from_lock(options)
        new(options.merge("path" => options.delete("remote")))
      end

      def to_lock
        out = String.new("PATH\n")
        out << "  remote: #{lockfile_path}\n"
        out << "  glob: #{@glob}\n" unless @glob == DEFAULT_GLOB
        out << "  specs:\n"
      end

      def to_s
        "source at `#{@path}`"
      end

      def hash
        [self.class, expanded_path, version].hash
      end

      def eql?(other)
        return unless other.class == self.class
        expanded_original_path == other.expanded_original_path &&
          version == other.version
      end

      alias_method :==, :eql?

      def name
        File.basename(expanded_path.to_s)
      end

      def install(spec, options = {})
        using_message = "Using #{version_message(spec, options[:previous_spec])} from #{self}"
        using_message += " and installing its executables" unless spec.executables.empty?
        print_using_message using_message
        generate_bin(spec, :disable_extensions => true)
        nil # no post-install message
      end

      def cache(spec, custom_path = nil)
        app_cache_path = app_cache_path(custom_path)
        return unless Bundler.feature_flag.cache_all?
        return if expand(@original_path).to_s.index(root_path.to_s + "/") == 0

        unless @original_path.exist?
          raise GemNotFound, "Can't cache gem #{version_message(spec)} because #{self} is missing!"
        end

        FileUtils.rm_rf(app_cache_path)
        FileUtils.cp_r("#{@original_path}/.", app_cache_path)
        FileUtils.touch(app_cache_path.join(".bundlecache"))
      end

      def local_specs(*)
        @local_specs ||= load_spec_files
      end

      def specs
        if has_app_cache?
          @path = app_cache_path
          @expanded_path = nil # Invalidate
        end
        local_specs
      end

      def app_cache_dirname
        name
      end

      def root
        Bundler.root
      end

      def expanded_original_path
        @expanded_original_path ||= expand(original_path)
      end

      private

      def expanded_path
        @expanded_path ||= expand(path)
      end

      def expand(somepath)
        if Bundler.current_ruby.jruby? # TODO: Unify when https://github.com/rubygems/bundler/issues/7598 fixed upstream and all supported jrubies include the fix
          somepath.expand_path(root_path).expand_path
        else
          somepath.expand_path(root_path)
        end
      rescue ArgumentError => e
        Bundler.ui.debug(e)
        raise PathError, "There was an error while trying to use the path " \
          "`#{somepath}`.\nThe error message was: #{e.message}."
      end

      def lockfile_path
        return relative_path(original_path) if original_path.absolute?
        expand(original_path).relative_path_from(root)
      end

      def app_cache_path(custom_path = nil)
        @app_cache_path ||= Bundler.app_cache(custom_path).join(app_cache_dirname)
      end

      def has_app_cache?
        SharedHelpers.in_bundle? && app_cache_path.exist?
      end

      def load_gemspec(file)
        return unless spec = Bundler.load_gemspec(file)
        Bundler.rubygems.set_installed_by_version(spec)
        spec
      end

      def validate_spec(spec)
        Bundler.rubygems.validate(spec)
      end

      def load_spec_files
        index = Index.new

        if File.directory?(expanded_path)
          # We sort depth-first since `<<` will override the earlier-found specs
          Gem::Util.glob_files_in_dir(@glob, expanded_path).sort_by {|p| -p.split(File::SEPARATOR).size }.each do |file|
            next unless spec = load_gemspec(file)
            spec.source = self

            # Validation causes extension_dir to be calculated, which depends
            # on #source, so we validate here instead of load_gemspec
            validate_spec(spec)
            index << spec
          end

          if index.empty? && @name && @version
            index << Gem::Specification.new do |s|
              s.name     = @name
              s.source   = self
              s.version  = Gem::Version.new(@version)
              s.platform = Gem::Platform::RUBY
              s.summary  = "Fake gemspec for #{@name}"
              s.relative_loaded_from = "#{@name}.gemspec"
              s.authors = ["no one"]
              if expanded_path.join("bin").exist?
                executables = expanded_path.join("bin").children
                executables.reject! {|p| File.directory?(p) }
                s.executables = executables.map {|c| c.basename.to_s }
              end
            end
          end
        else
          message = String.new("The path `#{expanded_path}` ")
          message << if File.exist?(expanded_path)
            "is not a directory."
          else
            "does not exist."
          end
          raise PathError, message
        end

        index
      end

      def relative_path(path = self.path)
        if path.to_s.start_with?(root_path.to_s)
          return path.relative_path_from(root_path)
        end
        path
      end

      def generate_bin(spec, options = {})
        gem_dir = Pathname.new(spec.full_gem_path)

        # Some gem authors put absolute paths in their gemspec
        # and we have to save them from themselves
        spec.files = spec.files.map do |p|
          next p unless p =~ /\A#{Pathname::SEPARATOR_PAT}/
          next if File.directory?(p)
          begin
            Pathname.new(p).relative_path_from(gem_dir).to_s
          rescue ArgumentError
            p
          end
        end.compact

        installer = Path::Installer.new(
          spec,
          :env_shebang => false,
          :disable_extensions => options[:disable_extensions],
          :build_args => options[:build_args],
          :bundler_extension_cache_path => extension_cache_path(spec)
        )
        installer.post_install
      rescue Gem::InvalidSpecificationException => e
        Bundler.ui.warn "\n#{spec.name} at #{spec.full_gem_path} did not have a valid gemspec.\n" \
                        "This prevents bundler from installing bins or native extensions, but " \
                        "that may not affect its functionality."

        if !spec.extensions.empty? && !spec.email.empty?
          Bundler.ui.warn "If you need to use this package without installing it from a gem " \
                          "repository, please contact #{spec.email} and ask them " \
                          "to modify their .gemspec so it can work with `gem build`."
        end

        Bundler.ui.warn "The validation message from RubyGems was:\n  #{e.message}"
      end
    end
  end
end
PK}$[E3��$$<gems/gems/bundler-2.3.27/lib/bundler/source/git/git_proxy.rbnu�[���# frozen_string_literal: true

module Bundler
  class Source
    class Git
      class GitNotInstalledError < GitError
        def initialize
          msg = String.new
          msg << "You need to install git to be able to use gems from git repositories. "
          msg << "For help installing git, please refer to GitHub's tutorial at https://help.github.com/articles/set-up-git"
          super msg
        end
      end

      class GitNotAllowedError < GitError
        def initialize(command)
          msg = String.new
          msg << "Bundler is trying to run `#{command}` at runtime. You probably need to run `bundle install`. However, "
          msg << "this error message could probably be more useful. Please submit a ticket at https://github.com/rubygems/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md "
          msg << "with steps to reproduce as well as the following\n\nCALLER: #{caller.join("\n")}"
          super msg
        end
      end

      class GitCommandError < GitError
        attr_reader :command

        def initialize(command, path, extra_info = nil)
          @command = command

          msg = String.new
          msg << "Git error: command `#{command}` in directory #{path} has failed."
          msg << "\n#{extra_info}" if extra_info
          msg << "\nIf this error persists you could try removing the cache directory '#{path}'" if path.exist?
          super msg
        end
      end

      class MissingGitRevisionError < GitCommandError
        def initialize(command, destination_path, ref, repo)
          msg = "Revision #{ref} does not exist in the repository #{repo}. Maybe you misspelled it?"
          super command, destination_path, msg
        end
      end

      # The GitProxy is responsible to interact with git repositories.
      # All actions required by the Git source is encapsulated in this
      # object.
      class GitProxy
        attr_accessor :path, :uri, :ref
        attr_writer :revision

        def initialize(path, uri, ref, revision = nil, git = nil)
          @path     = path
          @uri      = uri
          @ref      = ref
          @revision = revision
          @git      = git
        end

        def revision
          @revision ||= find_local_revision
        end

        def branch
          @branch ||= allowed_with_path do
            git("rev-parse", "--abbrev-ref", "HEAD", :dir => path).strip
          end
        end

        def contains?(commit)
          allowed_with_path do
            result, status = git_null("branch", "--contains", commit, :dir => path)
            status.success? && result =~ /^\* (.*)$/
          end
        end

        def version
          git("--version").match(/(git version\s*)?((\.?\d+)+).*/)[2]
        end

        def full_version
          git("--version").sub("git version", "").strip
        end

        def checkout
          return if path.exist? && has_revision_cached?
          extra_ref = "#{ref}:#{ref}" if ref && ref.start_with?("refs/")

          Bundler.ui.info "Fetching #{URICredentialsFilter.credential_filtered_uri(uri)}"

          configured_uri = configured_uri_for(uri).to_s

          unless path.exist?
            SharedHelpers.filesystem_access(path.dirname) do |p|
              FileUtils.mkdir_p(p)
            end
            git_retry "clone", "--bare", "--no-hardlinks", "--quiet", "--", configured_uri, path.to_s
            return unless extra_ref
          end

          with_path do
            git_retry(*["fetch", "--force", "--quiet", "--tags", "--", configured_uri, "refs/heads/*:refs/heads/*", extra_ref].compact, :dir => path)
          end
        end

        def copy_to(destination, submodules = false)
          # method 1
          unless File.exist?(destination.join(".git"))
            begin
              SharedHelpers.filesystem_access(destination.dirname) do |p|
                FileUtils.mkdir_p(p)
              end
              SharedHelpers.filesystem_access(destination) do |p|
                FileUtils.rm_rf(p)
              end
              git_retry "clone", "--no-checkout", "--quiet", path.to_s, destination.to_s
              File.chmod(((File.stat(destination).mode | 0o777) & ~File.umask), destination)
            rescue Errno::EEXIST => e
              file_path = e.message[%r{.*?((?:[a-zA-Z]:)?/.*)}, 1]
              raise GitError, "Bundler could not install a gem because it needs to " \
                "create a directory, but a file exists - #{file_path}. Please delete " \
                "this file and try again."
            end
          end
          # method 2
          git_retry "fetch", "--force", "--quiet", "--tags", path.to_s, :dir => destination

          begin
            git "reset", "--hard", @revision, :dir => destination
          rescue GitCommandError => e
            raise MissingGitRevisionError.new(e.command, destination, @revision, URICredentialsFilter.credential_filtered_uri(uri))
          end

          if submodules
            git_retry "submodule", "update", "--init", "--recursive", :dir => destination
          elsif Gem::Version.create(version) >= Gem::Version.create("2.9.0")
            inner_command = "git -C $toplevel submodule deinit --force $sm_path"
            git_retry "submodule", "foreach", "--quiet", inner_command, :dir => destination
          end
        end

        private

        def git_null(*command, dir: nil)
          check_allowed(command)

          out, status = SharedHelpers.with_clean_git_env do
            capture_and_ignore_stderr(*capture3_args_for(command, dir))
          end

          [URICredentialsFilter.credential_filtered_string(out, uri), status]
        end

        def git_retry(*command, dir: nil)
          command_with_no_credentials = check_allowed(command)

          Bundler::Retry.new("`#{command_with_no_credentials}` at #{dir || SharedHelpers.pwd}").attempts do
            git(*command, :dir => dir)
          end
        end

        def git(*command, dir: nil)
          command_with_no_credentials = check_allowed(command)

          out, status = SharedHelpers.with_clean_git_env do
            capture_and_filter_stderr(*capture3_args_for(command, dir))
          end

          filtered_out = URICredentialsFilter.credential_filtered_string(out, uri)

          raise GitCommandError.new(command_with_no_credentials, dir || SharedHelpers.pwd, filtered_out) unless status.success?

          filtered_out
        end

        def has_revision_cached?
          return unless @revision
          with_path { git("cat-file", "-e", @revision, :dir => path) }
          true
        rescue GitError
          false
        end

        def remove_cache
          FileUtils.rm_rf(path)
        end

        def find_local_revision
          allowed_with_path do
            git("rev-parse", "--verify", ref || "HEAD", :dir => path).strip
          end
        rescue GitCommandError => e
          raise MissingGitRevisionError.new(e.command, path, ref, URICredentialsFilter.credential_filtered_uri(uri))
        end

        # Adds credentials to the URI as Fetcher#configured_uri_for does
        def configured_uri_for(uri)
          if /https?:/ =~ uri
            remote = Bundler::URI(uri)
            config_auth = Bundler.settings[remote.to_s] || Bundler.settings[remote.host]
            remote.userinfo ||= config_auth
            remote.to_s
          else
            uri
          end
        end

        def allow?
          allowed = @git ? @git.allow_git_ops? : true

          raise GitNotInstalledError.new if allowed && !Bundler.git_present?

          allowed
        end

        def with_path(&blk)
          checkout unless path.exist?
          blk.call
        end

        def allowed_with_path
          return with_path { yield } if allow?
          raise GitError, "The git source #{uri} is not yet checked out. Please run `bundle install` before trying to start your application"
        end

        def check_allowed(command)
          require "shellwords"
          command_with_no_credentials = URICredentialsFilter.credential_filtered_string("git #{command.shelljoin}", uri)
          raise GitNotAllowedError.new(command_with_no_credentials) unless allow?
          command_with_no_credentials
        end

        def capture_and_filter_stderr(*cmd)
          require "open3"
          return_value, captured_err, status = Open3.capture3(*cmd)
          Bundler.ui.warn URICredentialsFilter.credential_filtered_string(captured_err, uri) unless captured_err.empty?
          [return_value, status]
        end

        def capture_and_ignore_stderr(*cmd)
          require "open3"
          return_value, _, status = Open3.capture3(*cmd)
          [return_value, status]
        end

        def capture3_args_for(cmd, dir)
          return ["git", *cmd] unless dir

          if Bundler.feature_flag.bundler_3_mode? || supports_minus_c?
            ["git", "-C", dir.to_s, *cmd]
          else
            ["git", *cmd, { :chdir => dir.to_s }]
          end
        end

        def supports_minus_c?
          @supports_minus_c ||= Gem::Version.new(version) >= Gem::Version.new("1.8.5")
        end
      end
    end
  end
end
PK}$[�k�P*P*2gems/gems/bundler-2.3.27/lib/bundler/source/git.rbnu�[���# frozen_string_literal: true

require_relative "../vendored_fileutils"

module Bundler
  class Source
    class Git < Path
      autoload :GitProxy, File.expand_path("git/git_proxy", __dir__)

      attr_reader :uri, :ref, :branch, :options, :glob, :submodules

      def initialize(options)
        @options = options
        @glob = options["glob"] || DEFAULT_GLOB

        @allow_cached = false
        @allow_remote = false

        # Stringify options that could be set as symbols
        %w[ref branch tag revision].each {|k| options[k] = options[k].to_s if options[k] }

        @uri        = options["uri"] || ""
        @safe_uri   = URICredentialsFilter.credential_filtered_uri(@uri)
        @branch     = options["branch"]
        @ref        = options["ref"] || options["branch"] || options["tag"]
        @submodules = options["submodules"]
        @name       = options["name"]
        @version    = options["version"].to_s.strip.gsub("-", ".pre.")

        @copied     = false
        @local      = false
      end

      def self.from_lock(options)
        new(options.merge("uri" => options.delete("remote")))
      end

      def to_lock
        out = String.new("GIT\n")
        out << "  remote: #{@uri}\n"
        out << "  revision: #{revision}\n"
        %w[ref branch tag submodules].each do |opt|
          out << "  #{opt}: #{options[opt]}\n" if options[opt]
        end
        out << "  glob: #{@glob}\n" unless default_glob?
        out << "  specs:\n"
      end

      def hash
        [self.class, uri, ref, branch, name, version, glob, submodules].hash
      end

      def eql?(other)
        other.is_a?(Git) && uri == other.uri && ref == other.ref &&
          branch == other.branch && name == other.name &&
          version == other.version && glob == other.glob &&
          submodules == other.submodules
      end

      alias_method :==, :eql?

      def to_s
        begin
          at = if local?
            path
          elsif user_ref = options["ref"]
            if ref =~ /\A[a-z0-9]{4,}\z/i
              shortref_for_display(user_ref)
            else
              user_ref
            end
          elsif ref
            ref
          else
            git_proxy.branch
          end

          rev = "at #{at}@#{shortref_for_display(revision)}"
        rescue GitError
          ""
        end

        specifiers = [rev, glob_for_display].compact
        suffix =
          if specifiers.any?
            " (#{specifiers.join(", ")})"
          else
            ""
          end

        "#{@safe_uri}#{suffix}"
      end

      def name
        File.basename(@uri, ".git")
      end

      # This is the path which is going to contain a specific
      # checkout of the git repository. When using local git
      # repos, this is set to the local repo.
      def install_path
        @install_path ||= begin
          git_scope = "#{base_name}-#{shortref_for_path(revision)}"

          path = Bundler.install_path.join(git_scope)

          if !path.exist? && Bundler.requires_sudo?
            Bundler.user_bundle_path.join(Bundler.ruby_scope).join(git_scope)
          else
            path
          end
        end
      end

      alias_method :path, :install_path

      def extension_dir_name
        "#{base_name}-#{shortref_for_path(revision)}"
      end

      def unlock!
        git_proxy.revision = nil
        options["revision"] = nil

        @unlocked = true
      end

      def local_override!(path)
        return false if local?

        original_path = path
        path = Pathname.new(path)
        path = path.expand_path(Bundler.root) unless path.relative?

        unless options["branch"] || Bundler.settings[:disable_local_branch_check]
          raise GitError, "Cannot use local override for #{name} at #{path} because " \
            ":branch is not specified in Gemfile. Specify a branch or run " \
            "`bundle config unset local.#{override_for(original_path)}` to remove the local override"
        end

        unless path.exist?
          raise GitError, "Cannot use local override for #{name} because #{path} " \
            "does not exist. Run `bundle config unset local.#{override_for(original_path)}` to remove the local override"
        end

        set_local!(path)

        # Create a new git proxy without the cached revision
        # so the Gemfile.lock always picks up the new revision.
        @git_proxy = GitProxy.new(path, uri, ref)

        if git_proxy.branch != options["branch"] && !Bundler.settings[:disable_local_branch_check]
          raise GitError, "Local override for #{name} at #{path} is using branch " \
            "#{git_proxy.branch} but Gemfile specifies #{options["branch"]}"
        end

        changed = cached_revision && cached_revision != git_proxy.revision

        if !Bundler.settings[:disable_local_revision_check] && changed && !@unlocked && !git_proxy.contains?(cached_revision)
          raise GitError, "The Gemfile lock is pointing to revision #{shortref_for_display(cached_revision)} " \
            "but the current branch in your local override for #{name} does not contain such commit. " \
            "Please make sure your branch is up to date."
        end

        changed
      end

      def specs(*)
        set_local!(app_cache_path) if has_app_cache? && !local?

        if requires_checkout? && !@copied
          fetch
          git_proxy.copy_to(install_path, submodules)
          serialize_gemspecs_in(install_path)
          @copied = true
        end

        local_specs
      end

      def install(spec, options = {})
        force = options[:force]

        print_using_message "Using #{version_message(spec, options[:previous_spec])} from #{self}"

        if (requires_checkout? && !@copied) || force
          Bundler.ui.debug "  * Checking out revision: #{ref}"
          git_proxy.copy_to(install_path, submodules)
          serialize_gemspecs_in(install_path)
          @copied = true
        end

        generate_bin_options = { :disable_extensions => !Bundler.rubygems.spec_missing_extensions?(spec), :build_args => options[:build_args] }
        generate_bin(spec, generate_bin_options)

        requires_checkout? ? spec.post_install_message : nil
      end

      def cache(spec, custom_path = nil)
        app_cache_path = app_cache_path(custom_path)
        return unless Bundler.feature_flag.cache_all?
        return if path == app_cache_path
        cached!
        FileUtils.rm_rf(app_cache_path)
        git_proxy.checkout if requires_checkout?
        git_proxy.copy_to(app_cache_path, @submodules)
        serialize_gemspecs_in(app_cache_path)
      end

      def load_spec_files
        super
      rescue PathError => e
        Bundler.ui.trace e
        raise GitError, "#{self} is not yet checked out. Run `bundle install` first."
      end

      # This is the path which is going to contain a cache
      # of the git repository. When using the same git repository
      # across different projects, this cache will be shared.
      # When using local git repos, this is set to the local repo.
      def cache_path
        @cache_path ||= if Bundler.requires_sudo? || Bundler.feature_flag.global_gem_cache?
          Bundler.user_cache
        else
          Bundler.bundle_path.join("cache", "bundler")
        end.join("git", git_scope)
      end

      def app_cache_dirname
        "#{base_name}-#{shortref_for_path(cached_revision || revision)}"
      end

      def revision
        git_proxy.revision
      end

      def allow_git_ops?
        @allow_remote || @allow_cached
      end

      def local?
        @local
      end

      private

      def serialize_gemspecs_in(destination)
        destination = destination.expand_path(Bundler.root) if destination.relative?
        Dir["#{destination}/#{@glob}"].each do |spec_path|
          # Evaluate gemspecs and cache the result. Gemspecs
          # in git might require git or other dependencies.
          # The gemspecs we cache should already be evaluated.
          spec = Bundler.load_gemspec(spec_path)
          next unless spec
          Bundler.rubygems.set_installed_by_version(spec)
          Bundler.rubygems.validate(spec)
          File.open(spec_path, "wb") {|file| file.write(spec.to_ruby) }
        end
      end

      def set_local!(path)
        @local       = true
        @local_specs = @git_proxy = nil
        @cache_path  = @install_path = path
      end

      def has_app_cache?
        cached_revision && super
      end

      def requires_checkout?
        allow_git_ops? && !local? && !cached_revision_checked_out?
      end

      def cached_revision_checked_out?
        cached_revision && cached_revision == revision && install_path.exist?
      end

      def base_name
        File.basename(uri.sub(%r{^(\w+://)?([^/:]+:)?(//\w*/)?(\w*/)*}, ""), ".git")
      end

      def shortref_for_display(ref)
        ref[0..6]
      end

      def shortref_for_path(ref)
        ref[0..11]
      end

      def glob_for_display
        default_glob? ? nil : "glob: #{@glob}"
      end

      def default_glob?
        @glob == DEFAULT_GLOB
      end

      def uri_hash
        if uri =~ %r{^\w+://(\w+@)?}
          # Downcase the domain component of the URI
          # and strip off a trailing slash, if one is present
          input = Bundler::URI.parse(uri).normalize.to_s.sub(%r{/$}, "")
        else
          # If there is no URI scheme, assume it is an ssh/git URI
          input = uri
        end
        # We use SHA1 here for historical reason and to preserve backward compatibility.
        # But a transition to a simpler mangling algorithm would be welcome.
        Bundler::Digest.sha1(input)
      end

      def cached_revision
        options["revision"]
      end

      def cached?
        cache_path.exist?
      end

      def git_proxy
        @git_proxy ||= GitProxy.new(cache_path, uri, ref, cached_revision, self)
      end

      def fetch
        git_proxy.checkout
      rescue GitError => e
        raise unless Bundler.feature_flag.allow_offline_install?
        Bundler.ui.warn "Using cached git data because of network errors:\n#{e}"
      end

      # no-op, since we validate when re-serializing the gemspec
      def validate_spec(_spec); end

      def load_gemspec(file)
        stub = Gem::StubSpecification.gemspec_stub(file, install_path.parent, install_path.parent)
        stub.full_gem_path = Pathname.new(file).dirname.expand_path(root).to_s.tap {|x| x.untaint if RUBY_VERSION < "2.7" }
        StubSpecification.from_stub(stub)
      end

      def git_scope
        "#{base_name}-#{uri_hash}"
      end

      def extension_cache_slug(_)
        extension_dir_name
      end

      def override_for(path)
        Bundler.settings.local_overrides.key(path)
      end
    end
  end
end
PK}$[�i�EE7gems/gems/bundler-2.3.27/lib/bundler/source/rubygems.rbnu�[���# frozen_string_literal: true

require "rubygems/user_interaction"

module Bundler
  class Source
    class Rubygems < Source
      autoload :Remote, File.expand_path("rubygems/remote", __dir__)

      # Use the API when installing less than X gems
      API_REQUEST_LIMIT = 500
      # Ask for X gems per API request
      API_REQUEST_SIZE = 50

      attr_reader :remotes, :caches

      def initialize(options = {})
        @options = options
        @remotes = []
        @dependency_names = []
        @allow_remote = false
        @allow_cached = false
        @allow_local = options["allow_local"] || false
        @caches = [cache_path, *Bundler.rubygems.gem_cache]

        Array(options["remotes"]).reverse_each {|r| add_remote(r) }
      end

      def local_only!
        @specs = nil
        @allow_local = true
        @allow_cached = false
        @allow_remote = false
      end

      def local!
        return if @allow_local

        @specs = nil
        @allow_local = true
      end

      def remote!
        return if @allow_remote

        @specs = nil
        @allow_remote = true
      end

      def cached!
        return if @allow_cached

        @specs = nil
        @allow_local = true
        @allow_cached = true
      end

      def hash
        @remotes.hash
      end

      def eql?(other)
        other.is_a?(Rubygems) && other.credless_remotes == credless_remotes
      end

      alias_method :==, :eql?

      def include?(o)
        o.is_a?(Rubygems) && (o.credless_remotes - credless_remotes).empty?
      end

      def multiple_remotes?
        @remotes.size > 1
      end

      def no_remotes?
        @remotes.size == 0
      end

      def can_lock?(spec)
        return super unless multiple_remotes?
        include?(spec.source)
      end

      def options
        { "remotes" => @remotes.map(&:to_s) }
      end

      def self.from_lock(options)
        new(options)
      end

      def to_lock
        out = String.new("GEM\n")
        remotes.reverse_each do |remote|
          out << "  remote: #{suppress_configured_credentials remote}\n"
        end
        out << "  specs:\n"
      end

      def to_s
        if remotes.empty?
          "locally installed gems"
        elsif @allow_remote && @allow_cached && @allow_local
          "rubygems repository #{remote_names}, cached gems or installed locally"
        elsif @allow_remote && @allow_local
          "rubygems repository #{remote_names} or installed locally"
        elsif @allow_remote
          "rubygems repository #{remote_names}"
        elsif @allow_cached && @allow_local
          "cached gems or installed locally"
        else
          "locally installed gems"
        end
      end

      def identifier
        if remotes.empty?
          "locally installed gems"
        else
          "rubygems repository #{remote_names}"
        end
      end
      alias_method :name, :identifier

      def specs
        @specs ||= begin
          # remote_specs usually generates a way larger Index than the other
          # sources, and large_idx.use small_idx is way faster than
          # small_idx.use large_idx.
          idx = @allow_remote ? remote_specs.dup : Index.new
          idx.use(cached_specs, :override_dupes) if @allow_cached || @allow_remote
          idx.use(installed_specs, :override_dupes) if @allow_local
          idx
        end
      end

      def install(spec, options = {})
        force = options[:force]
        ensure_builtin_gems_cached = options[:ensure_builtin_gems_cached]

        if ensure_builtin_gems_cached && spec.default_gem? && !cached_path(spec)
          cached_built_in_gem(spec) unless spec.remote
          force = true
        end

        if installed?(spec) && !force
          print_using_message "Using #{version_message(spec)}"
          return nil # no post-install message
        end

        if spec.remote
          # Check for this spec from other sources
          uris = [spec.remote, *remotes_for_spec(spec)].map(&:anonymized_uri).uniq
          Installer.ambiguous_gems << [spec.name, *uris] if uris.length > 1
        end

        path = fetch_gem_if_possible(spec, options[:previous_spec])
        raise GemNotFound, "Could not find #{spec.file_name} for installation" unless path

        return if Bundler.settings[:no_install]

        if requires_sudo?
          install_path = Bundler.tmp(spec.full_name)
          bin_path     = install_path.join("bin")
        else
          install_path = rubygems_dir
          bin_path     = Bundler.system_bindir
        end

        Bundler.mkdir_p bin_path, :no_sudo => true unless spec.executables.empty? || Bundler.rubygems.provides?(">= 2.7.5")

        require_relative "../rubygems_gem_installer"

        installer = Bundler::RubyGemsGemInstaller.at(
          path,
          :security_policy     => Bundler.rubygems.security_policies[Bundler.settings["trust-policy"]],
          :install_dir         => install_path.to_s,
          :bin_dir             => bin_path.to_s,
          :ignore_dependencies => true,
          :wrappers            => true,
          :env_shebang         => true,
          :build_args          => options[:build_args],
          :bundler_expected_checksum => spec.respond_to?(:checksum) && spec.checksum,
          :bundler_extension_cache_path => extension_cache_path(spec)
        )

        if spec.remote
          s = begin
            installer.spec
          rescue Gem::Package::FormatError
            Bundler.rm_rf(path)
            raise
          rescue Gem::Security::Exception => e
            raise SecurityError,
             "The gem #{File.basename(path, ".gem")} can't be installed because " \
             "the security policy didn't allow it, with the message: #{e.message}"
          end

          spec.__swap__(s)
        end

        message = "Installing #{version_message(spec, options[:previous_spec])}"
        message += " with native extensions" if spec.extensions.any?
        Bundler.ui.confirm message

        installed_spec = installer.install

        spec.full_gem_path = installed_spec.full_gem_path
        spec.loaded_from = installed_spec.loaded_from

        # SUDO HAX
        if requires_sudo?
          Bundler.rubygems.repository_subdirectories.each do |name|
            src = File.join(install_path, name, "*")
            dst = File.join(rubygems_dir, name)
            if name == "extensions" && Dir.glob(src).any?
              src = File.join(src, "*/*")
              ext_src = Dir.glob(src).first
              ext_src.gsub!(src[0..-6], "")
              dst = File.dirname(File.join(dst, ext_src))
            end
            SharedHelpers.filesystem_access(dst) do |p|
              Bundler.mkdir_p(p)
            end
            Bundler.sudo "cp -R #{src} #{dst}" if Dir[src].any?
          end

          spec.executables.each do |exe|
            SharedHelpers.filesystem_access(Bundler.system_bindir) do |p|
              Bundler.mkdir_p(p)
            end
            Bundler.sudo "cp -R #{install_path}/bin/#{exe} #{Bundler.system_bindir}/"
          end
        end

        spec.post_install_message
      ensure
        Bundler.rm_rf(install_path) if requires_sudo?
      end

      def cache(spec, custom_path = nil)
        cached_path = Bundler.settings[:cache_all_platforms] ? fetch_gem_if_possible(spec) : cached_gem(spec)
        raise GemNotFound, "Missing gem file '#{spec.file_name}'." unless cached_path
        return if File.dirname(cached_path) == Bundler.app_cache.to_s
        Bundler.ui.info "  * #{File.basename(cached_path)}"
        FileUtils.cp(cached_path, Bundler.app_cache(custom_path))
      rescue Errno::EACCES => e
        Bundler.ui.debug(e)
        raise InstallError, e.message
      end

      def cached_built_in_gem(spec)
        cached_path = cached_path(spec)
        if cached_path.nil?
          remote_spec = remote_specs.search(spec).first
          if remote_spec
            cached_path = fetch_gem(remote_spec)
          else
            Bundler.ui.warn "#{spec.full_name} is built in to Ruby, and can't be cached because your Gemfile doesn't have any sources that contain it."
          end
        end
        cached_path
      end

      def add_remote(source)
        uri = normalize_uri(source)
        @remotes.unshift(uri) unless @remotes.include?(uri)
      end

      def spec_names
        if @allow_remote && dependency_api_available?
          remote_specs.spec_names
        else
          []
        end
      end

      def unmet_deps
        if @allow_remote && dependency_api_available?
          remote_specs.unmet_dependency_names
        else
          []
        end
      end

      def fetchers
        @fetchers ||= remotes.map do |uri|
          remote = Source::Rubygems::Remote.new(uri)
          Bundler::Fetcher.new(remote)
        end
      end

      def double_check_for(unmet_dependency_names)
        return unless @allow_remote
        return unless dependency_api_available?

        unmet_dependency_names = unmet_dependency_names.call
        unless unmet_dependency_names.nil?
          if api_fetchers.size <= 1
            # can't do this when there are multiple fetchers because then we might not fetch from _all_
            # of them
            unmet_dependency_names -= remote_specs.spec_names # avoid re-fetching things we've already gotten
          end
          return if unmet_dependency_names.empty?
        end

        Bundler.ui.debug "Double checking for #{unmet_dependency_names || "all specs (due to the size of the request)"} in #{self}"

        fetch_names(api_fetchers, unmet_dependency_names, specs, false)
      end

      def dependency_names_to_double_check
        names = []
        remote_specs.each do |spec|
          case spec
          when EndpointSpecification, Gem::Specification, StubSpecification, LazySpecification
            names.concat(spec.runtime_dependencies.map(&:name))
          when RemoteSpecification # from the full index
            return nil
          else
            raise "unhandled spec type (#{spec.inspect})"
          end
        end
        names
      end

      def dependency_api_available?
        api_fetchers.any?
      end

      protected

      def remote_names
        remotes.map(&:to_s).join(", ")
      end

      def credless_remotes
        if Bundler.settings[:allow_deployment_source_credential_changes]
          remotes.map(&method(:remove_auth))
        else
          remotes.map(&method(:suppress_configured_credentials))
        end
      end

      def remotes_for_spec(spec)
        specs.search_all(spec.name).inject([]) do |uris, s|
          uris << s.remote if s.remote
          uris
        end
      end

      def cached_gem(spec)
        if spec.default_gem?
          cached_built_in_gem(spec)
        else
          cached_path(spec)
        end
      end

      def cached_path(spec)
        global_cache_path = download_cache_path(spec)
        @caches << global_cache_path if global_cache_path

        possibilities = @caches.map {|p| package_path(p, spec) }
        possibilities.find {|p| File.exist?(p) }
      end

      def package_path(cache_path, spec)
        "#{cache_path}/#{spec.file_name}"
      end

      def normalize_uri(uri)
        uri = uri.to_s
        uri = "#{uri}/" unless uri =~ %r{/$}
        require_relative "../vendored_uri"
        uri = Bundler::URI(uri)
        raise ArgumentError, "The source must be an absolute URI. For example:\n" \
          "source 'https://rubygems.org'" if !uri.absolute? || (uri.is_a?(Bundler::URI::HTTP) && uri.host.nil?)
        uri
      end

      def suppress_configured_credentials(remote)
        remote_nouser = remove_auth(remote)
        if remote.userinfo && remote.userinfo == Bundler.settings[remote_nouser]
          remote_nouser
        else
          remote
        end
      end

      def remove_auth(remote)
        if remote.user || remote.password
          remote.dup.tap {|uri| uri.user = uri.password = nil }.to_s
        else
          remote.to_s
        end
      end

      def installed_specs
        @installed_specs ||= Index.build do |idx|
          Bundler.rubygems.all_specs.reverse_each do |spec|
            spec.source = self
            if Bundler.rubygems.spec_missing_extensions?(spec, false)
              Bundler.ui.debug "Source #{self} is ignoring #{spec} because it is missing extensions"
              next
            end
            idx << spec
          end
        end
      end

      def cached_specs
        @cached_specs ||= begin
          idx = @allow_local ? installed_specs.dup : Index.new

          Dir["#{cache_path}/*.gem"].each do |gemfile|
            next if gemfile =~ /^bundler\-[\d\.]+?\.gem/
            s ||= Bundler.rubygems.spec_from_gem(gemfile)
            s.source = self
            idx << s
          end

          idx
        end
      end

      def api_fetchers
        fetchers.select {|f| f.use_api && f.fetchers.first.api_fetcher? }
      end

      def remote_specs
        @remote_specs ||= Index.build do |idx|
          index_fetchers = fetchers - api_fetchers

          # gather lists from non-api sites
          fetch_names(index_fetchers, nil, idx, false)

          # because ensuring we have all the gems we need involves downloading
          # the gemspecs of those gems, if the non-api sites contain more than
          # about 500 gems, we treat all sites as non-api for speed.
          allow_api = idx.size < API_REQUEST_LIMIT && dependency_names.size < API_REQUEST_LIMIT
          Bundler.ui.debug "Need to query more than #{API_REQUEST_LIMIT} gems." \
            " Downloading full index instead..." unless allow_api

          fetch_names(api_fetchers, allow_api && dependency_names, idx, false)
        end
      end

      def fetch_names(fetchers, dependency_names, index, override_dupes)
        fetchers.each do |f|
          if dependency_names
            Bundler.ui.info "Fetching gem metadata from #{URICredentialsFilter.credential_filtered_uri(f.uri)}", Bundler.ui.debug?
            index.use f.specs_with_retry(dependency_names, self), override_dupes
            Bundler.ui.info "" unless Bundler.ui.debug? # new line now that the dots are over
          else
            Bundler.ui.info "Fetching source index from #{URICredentialsFilter.credential_filtered_uri(f.uri)}"
            index.use f.specs_with_retry(nil, self), override_dupes
          end
        end
      end

      def fetch_gem_if_possible(spec, previous_spec = nil)
        if spec.remote
          fetch_gem(spec, previous_spec)
        else
          cached_gem(spec)
        end
      end

      def fetch_gem(spec, previous_spec = nil)
        spec.fetch_platform

        cache_path = download_cache_path(spec) || default_cache_path_for(rubygems_dir)
        gem_path = package_path(cache_path, spec)
        return gem_path if File.exist?(gem_path)

        if requires_sudo?
          download_path = Bundler.tmp(spec.full_name)
          download_cache_path = default_cache_path_for(download_path)
        else
          download_cache_path = cache_path
        end

        SharedHelpers.filesystem_access(download_cache_path) do |p|
          FileUtils.mkdir_p(p)
        end
        download_gem(spec, download_cache_path, previous_spec)

        if requires_sudo?
          SharedHelpers.filesystem_access(cache_path) do |p|
            Bundler.mkdir_p(p)
          end
          Bundler.sudo "mv #{package_path(download_cache_path, spec)} #{gem_path}"
        end

        gem_path
      ensure
        Bundler.rm_rf(download_path) if requires_sudo?
      end

      def installed?(spec)
        installed_specs[spec].any? && !spec.deleted_gem?
      end

      def requires_sudo?
        Bundler.requires_sudo?
      end

      def rubygems_dir
        Bundler.bundle_path
      end

      def default_cache_path_for(dir)
        "#{dir}/cache"
      end

      def cache_path
        Bundler.app_cache
      end

      private

      # Checks if the requested spec exists in the global cache. If it does,
      # we copy it to the download path, and if it does not, we download it.
      #
      # @param  [Specification] spec
      #         the spec we want to download or retrieve from the cache.
      #
      # @param  [String] download_cache_path
      #         the local directory the .gem will end up in.
      #
      # @param  [Specification] previous_spec
      #         the spec previously locked
      #
      def download_gem(spec, download_cache_path, previous_spec = nil)
        uri = spec.remote.uri
        Bundler.ui.confirm("Fetching #{version_message(spec, previous_spec)}")
        Bundler.rubygems.download_gem(spec, uri, download_cache_path)
      end

      # Returns the global cache path of the calling Rubygems::Source object.
      #
      # Note that the Source determines the path's subdirectory. We use this
      # subdirectory in the global cache path so that gems with the same name
      # -- and possibly different versions -- from different sources are saved
      # to their respective subdirectories and do not override one another.
      #
      # @param  [Gem::Specification] specification
      #
      # @return [Pathname] The global cache path.
      #
      def download_cache_path(spec)
        return unless Bundler.feature_flag.global_gem_cache?
        return unless remote = spec.remote
        return unless cache_slug = remote.cache_slug

        Bundler.user_cache.join("gems", cache_slug)
      end

      def extension_cache_slug(spec)
        return unless remote = spec.remote
        remote.cache_slug
      end
    end
  end
end
PK}$[�:U''>gems/gems/bundler-2.3.27/lib/bundler/source/rubygems/remote.rbnu�[���# frozen_string_literal: true

module Bundler
  class Source
    class Rubygems
      class Remote
        attr_reader :uri, :anonymized_uri, :original_uri

        def initialize(uri)
          orig_uri = uri
          uri = Bundler.settings.mirror_for(uri)
          @original_uri = orig_uri if orig_uri != uri
          fallback_auth = Bundler.settings.credentials_for(uri)

          @uri = apply_auth(uri, fallback_auth).freeze
          @anonymized_uri = remove_auth(@uri).freeze
        end

        # @return [String] A slug suitable for use as a cache key for this
        #         remote.
        #
        def cache_slug
          @cache_slug ||= begin
            return nil unless SharedHelpers.md5_available?

            cache_uri = original_uri || uri

            host = cache_uri.to_s.start_with?("file://") ? nil : cache_uri.host

            uri_parts = [host, cache_uri.user, cache_uri.port, cache_uri.path]
            uri_digest = SharedHelpers.digest(:MD5).hexdigest(uri_parts.compact.join("."))

            uri_parts[-1] = uri_digest
            uri_parts.compact.join(".")
          end
        end

        def to_s
          "rubygems remote at #{anonymized_uri}"
        end

        private

        def apply_auth(uri, auth)
          if auth && uri.userinfo.nil?
            uri = uri.dup
            uri.userinfo = auth
          end

          uri
        rescue Bundler::URI::InvalidComponentError
          error_message = "Please CGI escape your usernames and passwords before " \
                          "setting them for authentication."
          raise HTTPError.new(error_message)
        end

        def remove_auth(uri)
          if uri.userinfo
            uri = uri.dup
            uri.user = uri.password = nil
          end

          uri
        end
      end
    end
  end
end
PK}$[M9��MM7gems/gems/bundler-2.3.27/lib/bundler/source/metadata.rbnu�[���# frozen_string_literal: true

module Bundler
  class Source
    class Metadata < Source
      def specs
        @specs ||= Index.build do |idx|
          idx << Gem::Specification.new("Ruby\0", Gem.ruby_version)
          idx << Gem::Specification.new("RubyGems\0", Gem::VERSION) do |s|
            s.required_rubygems_version = Gem::Requirement.default
          end

          idx << Gem::Specification.new do |s|
            s.name     = "bundler"
            s.version  = VERSION
            s.license  = "MIT"
            s.platform = Gem::Platform::RUBY
            s.source   = self
            s.authors  = ["bundler team"]
            s.bindir   = "exe"
            s.homepage = "https://bundler.io"
            s.summary  = "The best way to manage your application's dependencies"
            s.executables = %w[bundle]
            # can't point to the actual gemspec or else the require paths will be wrong
            s.loaded_from = __dir__
          end

          if local_spec = Bundler.rubygems.find_bundler(VERSION)
            idx << local_spec
          end

          idx.each {|s| s.source = self }
        end
      end

      def options
        {}
      end

      def install(spec, _opts = {})
        print_using_message "Using #{version_message(spec)}"
        nil
      end

      def to_s
        "the local ruby installation"
      end

      def ==(other)
        self.class == other.class
      end
      alias_method :eql?, :==

      def hash
        self.class.hash
      end

      def version_message(spec)
        "#{spec.name} #{spec.version}"
      end
    end
  end
end
PK}$[u�R!xx=gems/gems/bundler-2.3.27/lib/bundler/source/path/installer.rbnu�[���# frozen_string_literal: true

require_relative "../../rubygems_gem_installer"

module Bundler
  class Source
    class Path
      class Installer < Bundler::RubyGemsGemInstaller
        attr_reader :spec

        def initialize(spec, options = {})
          @options            = options
          @spec               = spec
          @gem_dir            = Bundler.rubygems.path(spec.full_gem_path)
          @wrappers           = true
          @env_shebang        = true
          @format_executable  = options[:format_executable] || false
          @build_args         = options[:build_args] || Bundler.rubygems.build_args
          @gem_bin_dir        = "#{Bundler.rubygems.gem_dir}/bin"
          @disable_extensions = options[:disable_extensions]

          if Bundler.requires_sudo?
            @tmp_dir = Bundler.tmp(spec.full_name).to_s
            @bin_dir = "#{@tmp_dir}/bin"
          else
            @bin_dir = @gem_bin_dir
          end
        end

        def post_install
          run_hooks(:pre_install)

          unless @disable_extensions
            build_extensions
            run_hooks(:post_build)
          end

          generate_bin unless spec.executables.empty?

          run_hooks(:post_install)
        ensure
          Bundler.rm_rf(@tmp_dir) if Bundler.requires_sudo?
        end

        private

        def generate_bin
          super

          if Bundler.requires_sudo?
            SharedHelpers.filesystem_access(@gem_bin_dir) do |p|
              Bundler.mkdir_p(p)
            end
            spec.executables.each do |exe|
              Bundler.sudo "cp -R #{@bin_dir}/#{exe} #{@gem_bin_dir}"
            end
          end
        end

        def run_hooks(type)
          hooks_meth = "#{type}_hooks"
          return unless Gem.respond_to?(hooks_meth)
          Gem.send(hooks_meth).each do |hook|
            result = hook.call(self)
            next unless result == false
            location = " at #{$1}" if hook.inspect =~ /@(.*:\d+)/
            message = "#{type} hook#{location} failed for #{spec.full_name}"
            raise InstallHookError, message
          end
        end
      end
    end
  end
end
PK}$[un�uu-gems/gems/bundler-2.3.27/lib/bundler/retry.rbnu�[���# frozen_string_literal: true

module Bundler
  # General purpose class for retrying code that may fail
  class Retry
    attr_accessor :name, :total_runs, :current_run

    class << self
      def default_attempts
        default_retries + 1
      end
      alias_method :attempts, :default_attempts

      def default_retries
        Bundler.settings[:retry]
      end
    end

    def initialize(name, exceptions = nil, retries = self.class.default_retries)
      @name = name
      @retries = retries
      @exceptions = Array(exceptions) || []
      @total_runs = @retries + 1 # will run once, then upto attempts.times
    end

    def attempt(&block)
      @current_run = 0
      @failed      = false
      @error       = nil
      run(&block) while keep_trying?
      @result
    end
    alias_method :attempts, :attempt

    private

    def run(&block)
      @failed = false
      @current_run += 1
      @result = block.call
    rescue StandardError => e
      fail_attempt(e)
    end

    def fail_attempt(e)
      @failed = true
      if last_attempt? || @exceptions.any? {|k| e.is_a?(k) }
        Bundler.ui.info "" unless Bundler.ui.debug?
        raise e
      end
      return true unless name
      Bundler.ui.info "" unless Bundler.ui.debug? # Add new line in case dots preceded this
      Bundler.ui.warn "Retrying #{name} due to error (#{current_run.next}/#{total_runs}): #{e.class} #{e.message}", Bundler.ui.debug?
    end

    def keep_trying?
      return true  if current_run.zero?
      return false if last_attempt?
      return true  if @failed
    end

    def last_attempt?
      current_run >= total_runs
    end
  end
end
PK}$[�_���4gems/gems/bundler-2.3.27/lib/bundler/process_lock.rbnu�[���# frozen_string_literal: true

module Bundler
  class ProcessLock
    def self.lock(bundle_path = Bundler.bundle_path)
      lock_file_path = File.join(bundle_path, "bundler.lock")
      has_lock = false

      File.open(lock_file_path, "w") do |f|
        f.flock(File::LOCK_EX)
        has_lock = true
        yield
        f.flock(File::LOCK_UN)
      end
    rescue Errno::EACCES, Errno::ENOLCK, Errno::ENOTSUP, Errno::EPERM, Errno::EROFS
      # In the case the user does not have access to
      # create the lock file or is using NFS where
      # locks are not available we skip locking.
      yield
    ensure
      FileUtils.rm_f(lock_file_path) if has_lock
    end
  end
end
PK}$[��>gems/gems/bundler-2.3.27/lib/bundler/rubygems_gem_installer.rbnu�[���# frozen_string_literal: true

require "rubygems/installer"

module Bundler
  class RubyGemsGemInstaller < Gem::Installer
    def check_executable_overwrite(filename)
      # Bundler needs to install gems regardless of binstub overwriting
    end

    def install
      pre_install_checks

      run_pre_install_hooks

      spec.loaded_from = spec_file

      # Completely remove any previous gem files
      strict_rm_rf gem_dir
      strict_rm_rf spec.extension_dir

      SharedHelpers.filesystem_access(gem_dir, :create) do
        FileUtils.mkdir_p gem_dir, :mode => 0o755
      end

      extract_files

      build_extensions if spec.extensions.any?
      write_build_info_file
      run_post_build_hooks

      generate_bin
      generate_plugins

      write_spec

      SharedHelpers.filesystem_access("#{gem_home}/cache", :write) do
        write_cache_file
      end

      say spec.post_install_message unless spec.post_install_message.nil?

      run_post_install_hooks

      spec
    end

    def generate_plugins
      return unless Gem::Installer.instance_methods(false).include?(:generate_plugins)

      latest = Gem::Specification.stubs_for(spec.name).first
      return if latest && latest.version > spec.version

      ensure_writable_dir @plugins_dir

      if spec.plugins.empty?
        remove_plugins_for(spec, @plugins_dir)
      else
        regenerate_plugins_for(spec, @plugins_dir)
      end
    end

    def pre_install_checks
      super && validate_bundler_checksum(options[:bundler_expected_checksum])
    end

    def build_extensions
      extension_cache_path = options[:bundler_extension_cache_path]
      extension_dir = spec.extension_dir
      unless extension_cache_path && extension_dir
        prepare_extension_build(extension_dir)
        return super
      end

      build_complete = SharedHelpers.filesystem_access(extension_cache_path.join("gem.build_complete"), :read, &:file?)
      if build_complete && !options[:force]
        SharedHelpers.filesystem_access(File.dirname(extension_dir)) do |p|
          FileUtils.mkpath p
        end
        SharedHelpers.filesystem_access(extension_cache_path) do
          FileUtils.cp_r extension_cache_path, extension_dir
        end
      else
        prepare_extension_build(extension_dir)
        super
        SharedHelpers.filesystem_access(extension_cache_path.parent, &:mkpath)
        SharedHelpers.filesystem_access(extension_cache_path) do
          FileUtils.cp_r extension_dir, extension_cache_path
        end
      end
    end

    def spec
      if Bundler.rubygems.provides?("< 3.3.12") # RubyGems implementation rescues and re-raises errors before 3.3.12 and we don't want that
        @package.spec
      else
        super
      end
    end

    private

    def prepare_extension_build(extension_dir)
      SharedHelpers.filesystem_access(extension_dir, :create) do
        FileUtils.mkdir_p extension_dir
      end
      require "shellwords" unless Bundler.rubygems.provides?(">= 3.2.25")
    end

    def strict_rm_rf(dir)
      Bundler.rm_rf dir
    rescue Errno::ENOTEMPTY => e
      raise DirectoryRemovalError.new(e.cause, "Could not delete previous installation of `#{dir}`")
    end

    def validate_bundler_checksum(checksum)
      return true if Bundler.settings[:disable_checksum_validation]
      return true unless checksum
      return true unless source = @package.instance_variable_get(:@gem)
      return true unless source.respond_to?(:with_read_io)
      digest = source.with_read_io do |io|
        digest = SharedHelpers.digest(:SHA256).new
        digest << io.read(16_384) until io.eof?
        io.rewind
        send(checksum_type(checksum), digest)
      end
      unless digest == checksum
        raise SecurityError, <<-MESSAGE
          Bundler cannot continue installing #{spec.name} (#{spec.version}).
          The checksum for the downloaded `#{spec.full_name}.gem` does not match \
          the checksum given by the server. This means the contents of the downloaded \
          gem is different from what was uploaded to the server, and could be a potential security issue.

          To resolve this issue:
          1. delete the downloaded gem located at: `#{spec.gem_dir}/#{spec.full_name}.gem`
          2. run `bundle install`

          If you wish to continue installing the downloaded gem, and are certain it does not pose a \
          security issue despite the mismatching checksum, do the following:
          1. run `bundle config set --local disable_checksum_validation true` to turn off checksum verification
          2. run `bundle install`

          (More info: The expected SHA256 checksum was #{checksum.inspect}, but the \
          checksum for the downloaded gem was #{digest.inspect}.)
          MESSAGE
      end
      true
    end

    def checksum_type(checksum)
      case checksum.length
      when 64 then :hexdigest!
      when 44 then :base64digest!
      else raise InstallError, "The given checksum for #{spec.full_name} (#{checksum.inspect}) is not a valid SHA256 hexdigest nor base64digest"
      end
    end

    def hexdigest!(digest)
      digest.hexdigest!
    end

    def base64digest!(digest)
      if digest.respond_to?(:base64digest!)
        digest.base64digest!
      else
        [digest.digest!].pack("m0")
      end
    end
  end
end
PK}$[�eA�ss2gems/gems/bundler-2.3.27/lib/bundler/capistrano.rbnu�[���# frozen_string_literal: true

require_relative "shared_helpers"
Bundler::SharedHelpers.major_deprecation 2,
  "The Bundler task for Capistrano. Please use https://github.com/capistrano/bundler"

# Capistrano task for Bundler.
#
# Add "require 'bundler/capistrano'" in your Capistrano deploy.rb, and
# Bundler will be activated after each new deployment.
require_relative "deployment"
require "capistrano/version"

if defined?(Capistrano::Version) && Gem::Version.new(Capistrano::Version).release >= Gem::Version.new("3.0")
  raise "For Capistrano 3.x integration, please use https://github.com/capistrano/bundler"
end

Capistrano::Configuration.instance(:must_exist).load do
  before "deploy:finalize_update", "bundle:install"
  Bundler::Deployment.define_task(self, :task, :except => { :no_release => true })
  set :rake, lambda { "#{fetch(:bundle_cmd, "bundle")} exec rake" }
end
PK}$[��IVV3gems/gems/bundler-2.3.27/lib/bundler/gem_helpers.rbnu�[���# frozen_string_literal: true

module Bundler
  module GemHelpers
    GENERIC_CACHE = { Gem::Platform::RUBY => Gem::Platform::RUBY } # rubocop:disable Style/MutableConstant
    GENERICS = [
      [Gem::Platform.new("java"), Gem::Platform.new("java")],
      [Gem::Platform.new("mswin32"), Gem::Platform.new("mswin32")],
      [Gem::Platform.new("mswin64"), Gem::Platform.new("mswin64")],
      [Gem::Platform.new("universal-mingw32"), Gem::Platform.new("universal-mingw32")],
      [Gem::Platform.new("x64-mingw32"), Gem::Platform.new("x64-mingw32")],
      [Gem::Platform.new("x86_64-mingw32"), Gem::Platform.new("x64-mingw32")],
      [Gem::Platform.new("x64-mingw-ucrt"), Gem::Platform.new("x64-mingw-ucrt")],
      [Gem::Platform.new("mingw32"), Gem::Platform.new("x86-mingw32")],
    ].freeze

    def generic(p)
      GENERIC_CACHE[p] ||= begin
        _, found = GENERICS.find do |match, _generic|
          p.os == match.os && (!match.cpu || p.cpu == match.cpu)
        end
        found || Gem::Platform::RUBY
      end
    end
    module_function :generic

    def generic_local_platform
      generic(local_platform)
    end
    module_function :generic_local_platform

    def local_platform
      Bundler.local_platform
    end
    module_function :local_platform

    def platform_specificity_match(spec_platform, user_platform)
      spec_platform = Gem::Platform.new(spec_platform)

      PlatformMatch.specificity_score(spec_platform, user_platform)
    end
    module_function :platform_specificity_match

    def select_best_platform_match(specs, platform)
      matching = specs.select {|spec| spec.match_platform(platform) }

      sort_best_platform_match(matching, platform)
    end
    module_function :select_best_platform_match

    def sort_best_platform_match(matching, platform)
      exact = matching.select {|spec| spec.platform == platform }
      return exact if exact.any?

      sorted_matching = matching.sort_by {|spec| platform_specificity_match(spec.platform, platform) }
      exemplary_spec = sorted_matching.first

      sorted_matching.take_while {|spec| same_specificity(platform, spec, exemplary_spec) && same_deps(spec, exemplary_spec) }
    end
    module_function :sort_best_platform_match

    class PlatformMatch
      def self.specificity_score(spec_platform, user_platform)
        return -1 if spec_platform == user_platform
        return 1_000_000 if spec_platform.nil? || spec_platform == Gem::Platform::RUBY || user_platform == Gem::Platform::RUBY

        os_match(spec_platform, user_platform) +
          cpu_match(spec_platform, user_platform) * 10 +
          platform_version_match(spec_platform, user_platform) * 100
      end

      def self.os_match(spec_platform, user_platform)
        if spec_platform.os == user_platform.os
          0
        else
          1
        end
      end

      def self.cpu_match(spec_platform, user_platform)
        if spec_platform.cpu == user_platform.cpu
          0
        elsif spec_platform.cpu == "arm" && user_platform.cpu.to_s.start_with?("arm")
          0
        elsif spec_platform.cpu.nil? || spec_platform.cpu == "universal"
          1
        else
          2
        end
      end

      def self.platform_version_match(spec_platform, user_platform)
        if spec_platform.version == user_platform.version
          0
        elsif spec_platform.version.nil?
          1
        else
          2
        end
      end
    end

    def same_specificity(platform, spec, exemplary_spec)
      platform_specificity_match(spec.platform, platform) == platform_specificity_match(exemplary_spec.platform, platform)
    end
    module_function :same_specificity

    def same_deps(spec, exemplary_spec)
      same_runtime_deps = spec.dependencies.sort == exemplary_spec.dependencies.sort
      return same_runtime_deps unless spec.is_a?(Gem::Specification) && exemplary_spec.is_a?(Gem::Specification)

      same_metadata_deps = spec.required_ruby_version == exemplary_spec.required_ruby_version && spec.required_rubygems_version == exemplary_spec.required_rubygems_version
      same_runtime_deps && same_metadata_deps
    end
    module_function :same_deps
  end
end
PK}$[��[5��;gems/gems/bundler-2.3.27/lib/bundler/vendored_persistent.rbnu�[���# frozen_string_literal: true

module Bundler
  module Persistent
    module Net
      module HTTP
      end
    end
  end
end
require_relative "vendor/net-http-persistent/lib/net/http/persistent"

module Bundler
  class PersistentHTTP < Persistent::Net::HTTP::Persistent
    def connection_for(uri)
      super(uri) do |connection|
        result = yield connection
        warn_old_tls_version_rubygems_connection(uri, connection)
        result
      end
    end

    def warn_old_tls_version_rubygems_connection(uri, connection)
      return unless connection.http.use_ssl?
      return unless (uri.host || "").end_with?("rubygems.org")

      socket = connection.instance_variable_get(:@socket)
      return unless socket
      socket_io = socket.io
      return unless socket_io.respond_to?(:ssl_version)
      ssl_version = socket_io.ssl_version

      case ssl_version
      when /TLSv([\d\.]+)/
        version = Gem::Version.new($1)
        if version < Gem::Version.new("1.2")
          Bundler.ui.warn \
            "Warning: Your Ruby version is compiled against a copy of OpenSSL that is very old. " \
            "Starting in January 2018, RubyGems.org will refuse connection requests from these " \
            "very old versions of OpenSSL. If you will need to continue installing gems after " \
            "January 2018, please follow this guide to upgrade: http://ruby.to/tls-outdated.",
            :wrap => true
        end
      end
    end
  end
end
PK}$[Htd]]6gems/gems/bundler-2.3.27/lib/bundler/vendored_tsort.rbnu�[���# frozen_string_literal: true

module Bundler; end
require_relative "vendor/tsort/lib/tsort"
PK}$[�_����6gems/gems/bundler-2.3.27/lib/bundler/build_metadata.rbnu�[���# frozen_string_literal: true

module Bundler
  # Represents metadata from when the Bundler gem was built.
  module BuildMetadata
    # begin ivars
    @release = false
    # end ivars

    # A hash representation of the build metadata.
    def self.to_h
      {
        "Built At" => built_at,
        "Git SHA" => git_commit_sha,
        "Released Version" => release?,
      }
    end

    # A string representing the date the bundler gem was built.
    def self.built_at
      @built_at ||= Time.now.utc.strftime("%Y-%m-%d").freeze
    end

    # The SHA for the git commit the bundler gem was built from.
    def self.git_commit_sha
      return @git_commit_sha if instance_variable_defined? :@git_commit_sha

      # If Bundler has been installed without its .git directory and without a
      # commit instance variable then we can't determine its commits SHA.
      git_dir = File.expand_path("../../../.git", __dir__)
      if File.directory?(git_dir)
        return @git_commit_sha = Dir.chdir(git_dir) { `git rev-parse --short HEAD`.strip.freeze }
      end

      @git_commit_sha ||= "unknown"
    end

    # Whether this is an official release build of Bundler.
    def self.release?
      @release
    end
  end
end
PK}$[}X���1gems/gems/bundler-2.3.27/lib/bundler/gem_tasks.rbnu�[���# frozen_string_literal: true

require "rake/clean"
CLOBBER.include "pkg"

require_relative "gem_helper"
Bundler::GemHelper.install_tasks
PK}$[�`��	�	4gems/gems/bundler-2.3.27/lib/bundler/current_ruby.rbnu�[���# frozen_string_literal: true

module Bundler
  # Returns current version of Ruby
  #
  # @return [CurrentRuby] Current version of Ruby
  def self.current_ruby
    @current_ruby ||= CurrentRuby.new
  end

  class CurrentRuby
    KNOWN_MINOR_VERSIONS = %w[
      1.8
      1.9
      2.0
      2.1
      2.2
      2.3
      2.4
      2.5
      2.6
      2.7
      3.0
      3.1
    ].freeze

    KNOWN_MAJOR_VERSIONS = KNOWN_MINOR_VERSIONS.map {|v| v.split(".", 2).first }.uniq.freeze

    KNOWN_PLATFORMS = %w[
      jruby
      maglev
      mingw
      mri
      mswin
      mswin64
      rbx
      ruby
      truffleruby
      windows
      x64_mingw
    ].freeze

    def ruby?
      return true if Bundler::GemHelpers.generic_local_platform == Gem::Platform::RUBY

      !windows? && (RUBY_ENGINE == "ruby" || RUBY_ENGINE == "rbx" || RUBY_ENGINE == "maglev" || RUBY_ENGINE == "truffleruby")
    end

    def mri?
      !windows? && RUBY_ENGINE == "ruby"
    end

    def rbx?
      ruby? && RUBY_ENGINE == "rbx"
    end

    def jruby?
      RUBY_ENGINE == "jruby"
    end

    def maglev?
      RUBY_ENGINE == "maglev"
    end

    def truffleruby?
      RUBY_ENGINE == "truffleruby"
    end

    def windows?
      Gem.win_platform?
    end

    def mswin?
      # For backwards compatibility
      windows?

      # TODO: This should correctly be:
      # windows? && Bundler.local_platform != Gem::Platform::RUBY && Bundler.local_platform.os == "mswin32" && Bundler.local_platform.cpu == "x86"
    end

    def mswin64?
      windows? && Bundler.local_platform != Gem::Platform::RUBY && Bundler.local_platform.os == "mswin64" && Bundler.local_platform.cpu == "x64"
    end

    def mingw?
      windows? && Bundler.local_platform != Gem::Platform::RUBY && Bundler.local_platform.os == "mingw32" && Bundler.local_platform.cpu != "x64"
    end

    def x64_mingw?
      Gem.win_platform? && Bundler.local_platform != Gem::Platform::RUBY && Bundler.local_platform.os.start_with?("mingw") && Bundler.local_platform.cpu == "x64"
    end

    (KNOWN_MINOR_VERSIONS + KNOWN_MAJOR_VERSIONS).each do |version|
      trimmed_version = version.tr(".", "")
      define_method(:"on_#{trimmed_version}?") do
        RUBY_VERSION.start_with?("#{version}.")
      end

      KNOWN_PLATFORMS.each do |platform|
        define_method(:"#{platform}_#{trimmed_version}?") do
          send(:"#{platform}?") && send(:"on_#{trimmed_version}?")
        end
      end
    end
  end
end
PK}$[B$h�HH.gems/gems/bundler-2.3.27/lib/bundler/mirror.rbnu�[���# frozen_string_literal: true

require "socket"

module Bundler
  class Settings
    # Class used to build the mirror set and then find a mirror for a given URI
    #
    # @param prober [Prober object, nil] by default a TCPSocketProbe, this object
    #   will be used to probe the mirror address to validate that the mirror replies.
    class Mirrors
      def initialize(prober = nil)
        @all = Mirror.new
        @prober = prober || TCPSocketProbe.new
        @mirrors = {}
      end

      # Returns a mirror for the given uri.
      #
      # Depending on the uri having a valid mirror or not, it may be a
      #   mirror that points to the provided uri
      def for(uri)
        if @all.validate!(@prober).valid?
          @all
        else
          fetch_valid_mirror_for(Settings.normalize_uri(uri))
        end
      end

      def each
        @mirrors.each do |k, v|
          yield k, v.uri.to_s
        end
      end

      def parse(key, value)
        config = MirrorConfig.new(key, value)
        mirror = if config.all?
          @all
        else
          @mirrors[config.uri] ||= Mirror.new
        end
        config.update_mirror(mirror)
      end

      private

      def fetch_valid_mirror_for(uri)
        downcased = uri.to_s.downcase
        mirror = @mirrors[downcased] || @mirrors[Bundler::URI(downcased).host] || Mirror.new(uri)
        mirror.validate!(@prober)
        mirror = Mirror.new(uri) unless mirror.valid?
        mirror
      end
    end

    # A mirror
    #
    # Contains both the uri that should be used as a mirror and the
    #   fallback timeout which will be used for probing if the mirror
    #   replies on time or not.
    class Mirror
      DEFAULT_FALLBACK_TIMEOUT = 0.1

      attr_reader :uri, :fallback_timeout

      def initialize(uri = nil, fallback_timeout = 0)
        self.uri = uri
        self.fallback_timeout = fallback_timeout
        @valid = nil
      end

      def uri=(uri)
        @uri = if uri.nil?
          nil
        else
          Bundler::URI(uri.to_s)
        end
        @valid = nil
      end

      def fallback_timeout=(timeout)
        case timeout
        when true, "true"
          @fallback_timeout = DEFAULT_FALLBACK_TIMEOUT
        when false, "false"
          @fallback_timeout = 0
        else
          @fallback_timeout = timeout.to_i
        end
        @valid = nil
      end

      def ==(other)
        !other.nil? && uri == other.uri && fallback_timeout == other.fallback_timeout
      end

      def valid?
        return false if @uri.nil?
        return @valid unless @valid.nil?
        false
      end

      def validate!(probe = nil)
        @valid = false if uri.nil?
        if @valid.nil?
          @valid = fallback_timeout == 0 || (probe || TCPSocketProbe.new).replies?(self)
        end
        self
      end
    end

    # Class used to parse one configuration line
    #
    # Gets the configuration line and the value.
    #   This object provides a `update_mirror` method
    #   used to setup the given mirror value.
    class MirrorConfig
      attr_accessor :uri, :value

      def initialize(config_line, value)
        uri, fallback =
          config_line.match(%r{\Amirror\.(all|.+?)(\.fallback_timeout)?\/?\z}).captures
        @fallback = !fallback.nil?
        @all = false
        if uri == "all"
          @all = true
        else
          @uri = Bundler::URI(uri).absolute? ? Settings.normalize_uri(uri) : uri
        end
        @value = value
      end

      def all?
        @all
      end

      def update_mirror(mirror)
        if @fallback
          mirror.fallback_timeout = @value
        else
          mirror.uri = Settings.normalize_uri(@value)
        end
      end
    end

    # Class used for probing TCP availability for a given mirror.
    class TCPSocketProbe
      def replies?(mirror)
        MirrorSockets.new(mirror).any? do |socket, address, timeout|
          begin
            socket.connect_nonblock(address)
          rescue Errno::EINPROGRESS
            wait_for_writtable_socket(socket, address, timeout)
          rescue RuntimeError # Connection failed somehow, again
            false
          end
        end
      end

      private

      def wait_for_writtable_socket(socket, address, timeout)
        if IO.select(nil, [socket], nil, timeout)
          probe_writtable_socket(socket, address)
        else # TCP Handshake timed out, or there is something dropping packets
          false
        end
      end

      def probe_writtable_socket(socket, address)
        socket.connect_nonblock(address)
      rescue Errno::EISCONN
        true
      rescue StandardError # Connection failed
        false
      end
    end
  end

  # Class used to build the list of sockets that correspond to
  #   a given mirror.
  #
  # One mirror may correspond to many different addresses, both
  #   because of it having many dns entries or because
  #   the network interface is both ipv4 and ipv5
  class MirrorSockets
    def initialize(mirror)
      @timeout = mirror.fallback_timeout
      @addresses = Socket.getaddrinfo(mirror.uri.host, mirror.uri.port).map do |address|
        SocketAddress.new(address[0], address[3], address[1])
      end
    end

    def any?
      @addresses.any? do |address|
        socket = Socket.new(Socket.const_get(address.type), Socket::SOCK_STREAM, 0)
        socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
        value = yield socket, address.to_socket_address, @timeout
        socket.close unless socket.closed?
        value
      end
    end
  end

  # Socket address builder.
  #
  # Given a socket type, a host and a port,
  #   provides a method to build sockaddr string
  class SocketAddress
    attr_reader :type, :host, :port

    def initialize(type, host, port)
      @type = type
      @host = host
      @port = port
    end

    def to_socket_address
      Socket.pack_sockaddr_in(@port, @host)
    end
  end
end
PK}$[��!6n	n	7gems/gems/bundler-2.3.27/lib/bundler/yaml_serializer.rbnu�[���# frozen_string_literal: true

module Bundler
  # A stub yaml serializer that can handle only hashes and strings (as of now).
  module YAMLSerializer
    module_function

    def dump(hash)
      yaml = String.new("---")
      yaml << dump_hash(hash)
    end

    def dump_hash(hash)
      yaml = String.new("\n")
      hash.each do |k, v|
        yaml << k << ":"
        if v.is_a?(Hash)
          yaml << dump_hash(v).gsub(/^(?!$)/, "  ") # indent all non-empty lines
        elsif v.is_a?(Array) # Expected to be array of strings
          yaml << "\n- " << v.map {|s| s.to_s.gsub(/\s+/, " ").inspect }.join("\n- ") << "\n"
        else
          yaml << " " << v.to_s.gsub(/\s+/, " ").inspect << "\n"
        end
      end
      yaml
    end

    ARRAY_REGEX = /
      ^
      (?:[ ]*-[ ]) # '- ' before array items
      (['"]?) # optional opening quote
      (.*) # value
      \1 # matching closing quote
      $
    /xo.freeze

    HASH_REGEX = /
      ^
      ([ ]*) # indentations
      (.+) # key
      (?::(?=(?:\s|$))) # :  (without the lookahead the #key includes this when : is present in value)
      [ ]?
      (['"]?) # optional opening quote
      (.*) # value
      \3 # matching closing quote
      $
    /xo.freeze

    def load(str)
      res = {}
      stack = [res]
      last_hash = nil
      last_empty_key = nil
      str.split(/\r?\n/).each do |line|
        if match = HASH_REGEX.match(line)
          indent, key, quote, val = match.captures
          key = convert_to_backward_compatible_key(key)
          depth = indent.scan(/  /).length
          if quote.empty? && val.empty?
            new_hash = {}
            stack[depth][key] = new_hash
            stack[depth + 1] = new_hash
            last_empty_key = key
            last_hash = stack[depth]
          else
            stack[depth][key] = val
          end
        elsif match = ARRAY_REGEX.match(line)
          _, val = match.captures
          last_hash[last_empty_key] = [] unless last_hash[last_empty_key].is_a?(Array)

          last_hash[last_empty_key].push(val)
        end
      end
      res
    end

    # for settings' keys
    def convert_to_backward_compatible_key(key)
      key = "#{key}/" if key =~ /https?:/i && key !~ %r{/\Z}
      key = key.gsub(".", "__") if key.include?(".")
      key
    end

    class << self
      private :dump_hash, :convert_to_backward_compatible_key
    end
  end
end
PK}$[�.pE2
2
.gems/gems/bundler-2.3.27/lib/bundler/inline.rbnu�[���# frozen_string_literal: true

# Allows for declaring a Gemfile inline in a ruby script, optionally installing
# any gems that aren't already installed on the user's system.
#
# @note Every gem that is specified in this 'Gemfile' will be `require`d, as if
#       the user had manually called `Bundler.require`. To avoid a requested gem
#       being automatically required, add the `:require => false` option to the
#       `gem` dependency declaration.
#
# @param install [Boolean] whether gems that aren't already installed on the
#                          user's system should be installed.
#                          Defaults to `false`.
#
# @param gemfile [Proc]    a block that is evaluated as a `Gemfile`.
#
# @example Using an inline Gemfile
#
#          #!/opt/alt/ruby31/bin/ruby
#
#          require 'bundler/inline'
#
#          gemfile do
#            source 'https://rubygems.org'
#            gem 'json', require: false
#            gem 'nap', require: 'rest'
#            gem 'cocoapods', '~> 0.34.1'
#          end
#
#          puts Pod::VERSION # => "0.34.4"
#
def gemfile(install = false, options = {}, &gemfile)
  require_relative "../bundler"

  opts = options.dup
  ui = opts.delete(:ui) { Bundler::UI::Shell.new }
  ui.level = "silent" if opts.delete(:quiet)
  raise ArgumentError, "Unknown options: #{opts.keys.join(", ")}" unless opts.empty?

  begin
    Bundler.instance_variable_set(:@bundle_path, Pathname.new(Gem.dir))
    old_gemfile = ENV["BUNDLE_GEMFILE"]
    Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", "Gemfile"

    Bundler::Plugin.gemfile_install(&gemfile) if Bundler.feature_flag.plugins?
    builder = Bundler::Dsl.new
    builder.instance_eval(&gemfile)
    builder.check_primary_source_safety

    Bundler.settings.temporary(:deployment => false, :frozen => false) do
      definition = builder.to_definition(nil, true)
      def definition.lock(*); end
      definition.validate_runtime!

      Bundler.ui = install ? ui : Bundler::UI::Silent.new
      if install || definition.missing_specs?
        Bundler.settings.temporary(:inline => true, :no_install => false) do
          installer = Bundler::Installer.install(Bundler.root, definition, :system => true)
          installer.post_install_messages.each do |name, message|
            Bundler.ui.info "Post-install message from #{name}:\n#{message}"
          end
        end
      end

      runtime = Bundler::Runtime.new(nil, definition)
      runtime.setup.require
    end
  ensure
    if old_gemfile
      ENV["BUNDLE_GEMFILE"] = old_gemfile
    else
      ENV["BUNDLE_GEMFILE"] = ""
    end
  end
end
PK}$[CX�j��Ggems/gems/bundler-2.3.27/lib/bundler/compact_index_client/gem_parser.rbnu�[���# frozen_string_literal: true

module Bundler
  class CompactIndexClient
    if defined?(Gem::Resolver::APISet::GemParser)
      GemParser = Gem::Resolver::APISet::GemParser
    else
      class GemParser
        def parse(line)
          version_and_platform, rest = line.split(" ", 2)
          version, platform = version_and_platform.split("-", 2)
          dependencies, requirements = rest.split("|", 2).map {|s| s.split(",") } if rest
          dependencies = dependencies ? dependencies.map {|d| parse_dependency(d) } : []
          requirements = requirements ? requirements.map {|d| parse_dependency(d) } : []
          [version, platform, dependencies, requirements]
        end

        private

        def parse_dependency(string)
          dependency = string.split(":")
          dependency[-1] = dependency[-1].split("&") if dependency.size > 1
          dependency
        end
      end
    end
  end
end
PK}$[n�5�	�	Bgems/gems/bundler-2.3.27/lib/bundler/compact_index_client/cache.rbnu�[���# frozen_string_literal: true

require_relative "gem_parser"

module Bundler
  class CompactIndexClient
    class Cache
      attr_reader :directory

      def initialize(directory)
        @directory = Pathname.new(directory).expand_path
        info_roots.each do |dir|
          SharedHelpers.filesystem_access(dir) do
            FileUtils.mkdir_p(dir)
          end
        end
      end

      def names
        lines(names_path)
      end

      def names_path
        directory.join("names")
      end

      def versions
        versions_by_name = Hash.new {|hash, key| hash[key] = [] }
        info_checksums_by_name = {}

        lines(versions_path).each do |line|
          name, versions_string, info_checksum = line.split(" ", 3)
          info_checksums_by_name[name] = info_checksum || ""
          versions_string.split(",").each do |version|
            if version.start_with?("-")
              version = version[1..-1].split("-", 2).unshift(name)
              versions_by_name[name].delete(version)
            else
              version = version.split("-", 2).unshift(name)
              versions_by_name[name] << version
            end
          end
        end

        [versions_by_name, info_checksums_by_name]
      end

      def versions_path
        directory.join("versions")
      end

      def checksums
        checksums = {}

        lines(versions_path).each do |line|
          name, _, checksum = line.split(" ", 3)
          checksums[name] = checksum
        end

        checksums
      end

      def dependencies(name)
        lines(info_path(name)).map do |line|
          parse_gem(line)
        end
      end

      def info_path(name)
        name = name.to_s
        if name =~ /[^a-z0-9_-]/
          name += "-#{SharedHelpers.digest(:MD5).hexdigest(name).downcase}"
          info_roots.last.join(name)
        else
          info_roots.first.join(name)
        end
      end

      private

      def lines(path)
        return [] unless path.file?
        lines = SharedHelpers.filesystem_access(path, :read, &:read).split("\n")
        header = lines.index("---")
        header ? lines[header + 1..-1] : lines
      end

      def parse_gem(line)
        @dependency_parser ||= GemParser.new
        @dependency_parser.parse(line)
      end

      def info_roots
        [
          directory.join("info"),
          directory.join("info-special-characters"),
        ]
      end
    end
  end
end
PK}$[@��ymmDgems/gems/bundler-2.3.27/lib/bundler/compact_index_client/updater.rbnu�[���# frozen_string_literal: true

require_relative "../vendored_fileutils"

module Bundler
  class CompactIndexClient
    class Updater
      class MisMatchedChecksumError < Error
        def initialize(path, server_checksum, local_checksum)
          @path = path
          @server_checksum = server_checksum
          @local_checksum = local_checksum
        end

        def message
          "The checksum of /#{@path} does not match the checksum provided by the server! Something is wrong " \
            "(local checksum is #{@local_checksum.inspect}, was expecting #{@server_checksum.inspect})."
        end
      end

      def initialize(fetcher)
        @fetcher = fetcher
        require_relative "../vendored_tmpdir"
      end

      def update(local_path, remote_path, retrying = nil)
        headers = {}

        Bundler::Dir.mktmpdir("bundler-compact-index-") do |local_temp_dir|
          local_temp_path = Pathname.new(local_temp_dir).join(local_path.basename)

          # first try to fetch any new bytes on the existing file
          if retrying.nil? && local_path.file?
            copy_file local_path, local_temp_path

            headers["If-None-Match"] = etag_for(local_temp_path)
            headers["Range"] =
              if local_temp_path.size.nonzero?
                # Subtract a byte to ensure the range won't be empty.
                # Avoids 416 (Range Not Satisfiable) responses.
                "bytes=#{local_temp_path.size - 1}-"
              else
                "bytes=#{local_temp_path.size}-"
              end
          end

          response = @fetcher.call(remote_path, headers)
          return nil if response.is_a?(Net::HTTPNotModified)

          content = response.body

          etag = (response["ETag"] || "").gsub(%r{\AW/}, "")
          correct_response = SharedHelpers.filesystem_access(local_temp_path) do
            if response.is_a?(Net::HTTPPartialContent) && local_temp_path.size.nonzero?
              local_temp_path.open("a") {|f| f << slice_body(content, 1..-1) }

              etag_for(local_temp_path) == etag
            else
              local_temp_path.open("wb") {|f| f << content }

              etag.length.zero? || etag_for(local_temp_path) == etag
            end
          end

          if correct_response
            SharedHelpers.filesystem_access(local_path) do
              FileUtils.mv(local_temp_path, local_path)
            end
            return nil
          end

          if retrying
            raise MisMatchedChecksumError.new(remote_path, etag, etag_for(local_temp_path))
          end

          update(local_path, remote_path, :retrying)
        end
      rescue Zlib::GzipFile::Error
        raise Bundler::HTTPError
      end

      def etag_for(path)
        sum = checksum_for_file(path)
        sum ? %("#{sum}") : nil
      end

      def slice_body(body, range)
        body.byteslice(range)
      end

      def checksum_for_file(path)
        return nil unless path.file?
        # This must use File.read instead of Digest.file().hexdigest
        # because we need to preserve \n line endings on windows when calculating
        # the checksum
        SharedHelpers.filesystem_access(path, :read) do
          SharedHelpers.digest(:MD5).hexdigest(File.read(path))
        end
      end

      private

      def copy_file(source, dest)
        SharedHelpers.filesystem_access(source, :read) do
          File.open(source, "r") do |s|
            SharedHelpers.filesystem_access(dest, :write) do
              File.open(dest, "wb", s.stat.mode) do |f|
                IO.copy_stream(s, f)
              end
            end
          end
        end
      end
    end
  end
end
PK}$[_l�__7gems/gems/bundler-2.3.27/lib/bundler/vendored_tmpdir.rbnu�[���# frozen_string_literal: true

module Bundler; end
require_relative "vendor/tmpdir/lib/tmpdir"
PK}$[0�ee:gems/gems/bundler-2.3.27/lib/bundler/vendored_fileutils.rbnu�[���# frozen_string_literal: true

module Bundler; end
require_relative "vendor/fileutils/lib/fileutils"
PK}$[��x>gems/gems/bundler-2.3.27/lib/bundler/uri_credentials_filter.rbnu�[���# frozen_string_literal: true

module Bundler
  module URICredentialsFilter
    module_function

    def credential_filtered_uri(uri_to_anonymize)
      return uri_to_anonymize if uri_to_anonymize.nil?
      uri = uri_to_anonymize.dup
      if uri.is_a?(String)
        return uri if File.exist?(uri)

        require_relative "vendored_uri"
        uri = Bundler::URI(uri)
      end

      if uri.userinfo
        # oauth authentication
        if uri.password == "x-oauth-basic" || uri.password == "x"
          # URI as string does not display with password if no user is set
          oauth_designation = uri.password
          uri.user = oauth_designation
        end
        uri.password = nil
      end
      return uri.to_s if uri_to_anonymize.is_a?(String)
      uri
    rescue Bundler::URI::InvalidURIError # uri is not canonical uri scheme
      uri
    end

    def credential_filtered_string(str_to_filter, uri)
      return str_to_filter if uri.nil? || str_to_filter.nil?
      str_with_no_credentials = str_to_filter.dup
      anonymous_uri_str = credential_filtered_uri(uri).to_s
      uri_str = uri.to_s
      if anonymous_uri_str != uri_str
        str_with_no_credentials = str_with_no_credentials.gsub(uri_str, anonymous_uri_str)
      end
      str_with_no_credentials
    end
  end
end
PK}$[��lՕ*�*1gems/gems/bundler-2.3.27/lib/bundler/installer.rbnu�[���# frozen_string_literal: true

require_relative "worker"
require_relative "installer/parallel_installer"
require_relative "installer/standalone"
require_relative "installer/gem_installer"

module Bundler
  class Installer
    class << self
      attr_accessor :ambiguous_gems

      Installer.ambiguous_gems = []
    end

    attr_reader :post_install_messages, :definition

    # Begins the installation process for Bundler.
    # For more information see the #run method on this class.
    def self.install(root, definition, options = {})
      installer = new(root, definition)
      Plugin.hook(Plugin::Events::GEM_BEFORE_INSTALL_ALL, definition.dependencies)
      installer.run(options)
      Plugin.hook(Plugin::Events::GEM_AFTER_INSTALL_ALL, definition.dependencies)
      installer
    end

    def initialize(root, definition)
      @root = root
      @definition = definition
      @post_install_messages = {}
    end

    # Runs the install procedures for a specific Gemfile.
    #
    # Firstly, this method will check to see if `Bundler.bundle_path` exists
    # and if not then Bundler will create the directory. This is usually the same
    # location as RubyGems which typically is the `~/.gem` directory
    # unless other specified.
    #
    # Secondly, it checks if Bundler has been configured to be "frozen".
    # Frozen ensures that the Gemfile and the Gemfile.lock file are matching.
    # This stops a situation where a developer may update the Gemfile but may not run
    # `bundle install`, which leads to the Gemfile.lock file not being correctly updated.
    # If this file is not correctly updated then any other developer running
    # `bundle install` will potentially not install the correct gems.
    #
    # Thirdly, Bundler checks if there are any dependencies specified in the Gemfile.
    # If there are no dependencies specified then Bundler returns a warning message stating
    # so and this method returns.
    #
    # Fourthly, Bundler checks if the Gemfile.lock exists, and if so
    # then proceeds to set up a definition based on the Gemfile and the Gemfile.lock.
    # During this step Bundler will also download information about any new gems
    # that are not in the Gemfile.lock and resolve any dependencies if needed.
    #
    # Fifthly, Bundler resolves the dependencies either through a cache of gems or by remote.
    # This then leads into the gems being installed, along with stubs for their executables,
    # but only if the --binstubs option has been passed or Bundler.options[:bin] has been set
    # earlier.
    #
    # Sixthly, a new Gemfile.lock is created from the installed gems to ensure that the next time
    # that a user runs `bundle install` they will receive any updates from this process.
    #
    # Finally, if the user has specified the standalone flag, Bundler will generate the needed
    # require paths and save them in a `setup.rb` file. See `bundle standalone --help` for more
    # information.
    def run(options)
      Bundler.create_bundle_path

      ProcessLock.lock do
        if Bundler.frozen_bundle?
          @definition.ensure_equivalent_gemfile_and_lockfile(options[:deployment])
        end

        if @definition.dependencies.empty?
          Bundler.ui.warn "The Gemfile specifies no dependencies"
          lock
          return
        end

        if resolve_if_needed(options)
          ensure_specs_are_compatible!
          load_plugins
          options.delete(:jobs)
        else
          options[:jobs] = 1 # to avoid the overhead of Bundler::Worker
        end
        install(options)

        Gem::Specification.reset # invalidate gem specification cache so that installed gems are immediately available

        lock unless Bundler.frozen_bundle?
        Standalone.new(options[:standalone], @definition).generate if options[:standalone]
      end
    end

    def generate_bundler_executable_stubs(spec, options = {})
      if options[:binstubs_cmd] && spec.executables.empty?
        options = {}
        spec.runtime_dependencies.each do |dep|
          bins = @definition.specs[dep].first.executables
          options[dep.name] = bins unless bins.empty?
        end
        if options.any?
          Bundler.ui.warn "#{spec.name} has no executables, but you may want " \
            "one from a gem it depends on."
          options.each {|name, bins| Bundler.ui.warn "  #{name} has: #{bins.join(", ")}" }
        else
          Bundler.ui.warn "There are no executables for the gem #{spec.name}."
        end
        return
      end

      # double-assignment to avoid warnings about variables that will be used by ERB
      bin_path = Bundler.bin_path
      bin_path = bin_path
      relative_gemfile_path = Bundler.default_gemfile.relative_path_from(bin_path)
      relative_gemfile_path = relative_gemfile_path
      ruby_command = Thor::Util.ruby_command
      ruby_command = ruby_command
      template_path = File.expand_path("templates/Executable", __dir__)
      if spec.name == "bundler"
        template_path += ".bundler"
        spec.executables = %(bundle)
      end
      template = File.read(template_path)

      exists = []
      spec.executables.each do |executable|
        binstub_path = "#{bin_path}/#{executable}"
        if File.exist?(binstub_path) && !options[:force]
          exists << executable
          next
        end

        mode = Gem.win_platform? ? "wb:UTF-8" : "w"
        require "erb"
        content = if RUBY_VERSION >= "2.6"
          ERB.new(template, :trim_mode => "-").result(binding)
        else
          ERB.new(template, nil, "-").result(binding)
        end

        File.write(binstub_path, content, :mode => mode, :perm => 0o777 & ~File.umask)
        if Gem.win_platform? || options[:all_platforms]
          prefix = "@ruby -x \"%~f0\" %*\n@exit /b %ERRORLEVEL%\n\n"
          File.write("#{binstub_path}.cmd", prefix + content, :mode => mode)
        end
      end

      if options[:binstubs_cmd] && exists.any?
        case exists.size
        when 1
          Bundler.ui.warn "Skipped #{exists[0]} since it already exists."
        when 2
          Bundler.ui.warn "Skipped #{exists.join(" and ")} since they already exist."
        else
          items = exists[0...-1].empty? ? nil : exists[0...-1].join(", ")
          skipped = [items, exists[-1]].compact.join(" and ")
          Bundler.ui.warn "Skipped #{skipped} since they already exist."
        end
        Bundler.ui.warn "If you want to overwrite skipped stubs, use --force."
      end
    end

    def generate_standalone_bundler_executable_stubs(spec, options = {})
      # double-assignment to avoid warnings about variables that will be used by ERB
      bin_path = Bundler.bin_path
      unless path = Bundler.settings[:path]
        raise "Can't standalone without an explicit path set"
      end
      standalone_path = Bundler.root.join(path).relative_path_from(bin_path)
      standalone_path = standalone_path
      template = File.read(File.expand_path("templates/Executable.standalone", __dir__))
      ruby_command = Thor::Util.ruby_command
      ruby_command = ruby_command

      spec.executables.each do |executable|
        next if executable == "bundle"
        executable_path = Pathname(spec.full_gem_path).join(spec.bindir, executable).relative_path_from(bin_path)
        executable_path = executable_path

        mode = Gem.win_platform? ? "wb:UTF-8" : "w"
        require "erb"
        content = if RUBY_VERSION >= "2.6"
          ERB.new(template, :trim_mode => "-").result(binding)
        else
          ERB.new(template, nil, "-").result(binding)
        end

        File.write("#{bin_path}/#{executable}", content, :mode => mode, :perm => 0o755)
        if Gem.win_platform? || options[:all_platforms]
          prefix = "@ruby -x \"%~f0\" %*\n@exit /b %ERRORLEVEL%\n\n"
          File.write("#{bin_path}/#{executable}.cmd", prefix + content, :mode => mode)
        end
      end
    end

    private

    # the order that the resolver provides is significant, since
    # dependencies might affect the installation of a gem.
    # that said, it's a rare situation (other than rake), and parallel
    # installation is SO MUCH FASTER. so we let people opt in.
    def install(options)
      force = options["force"]
      jobs = installation_parallelization(options)
      install_in_parallel jobs, options[:standalone], force
    end

    def installation_parallelization(options)
      if jobs = options.delete(:jobs)
        return jobs
      end

      if jobs = Bundler.settings[:jobs]
        return jobs
      end

      Bundler.settings.processor_count
    end

    def load_plugins
      Bundler.rubygems.load_plugins

      requested_path_gems = @definition.requested_specs.select {|s| s.source.is_a?(Source::Path) }
      path_plugin_files = requested_path_gems.map do |spec|
        begin
          Bundler.rubygems.spec_matches_for_glob(spec, "rubygems_plugin#{Bundler.rubygems.suffix_pattern}")
        rescue TypeError
          error_message = "#{spec.name} #{spec.version} has an invalid gemspec"
          raise Gem::InvalidSpecificationException, error_message
        end
      end.flatten
      Bundler.rubygems.load_plugin_files(path_plugin_files)
      Bundler.rubygems.load_env_plugins
    end

    def ensure_specs_are_compatible!
      @definition.specs.each do |spec|
        unless spec.matches_current_ruby?
          raise InstallError, "#{spec.full_name} requires ruby version #{spec.required_ruby_version}, " \
            "which is incompatible with the current version, #{Gem.ruby_version}"
        end
        unless spec.matches_current_rubygems?
          raise InstallError, "#{spec.full_name} requires rubygems version #{spec.required_rubygems_version}, " \
            "which is incompatible with the current version, #{Gem.rubygems_version}"
        end
      end
    end

    def install_in_parallel(size, standalone, force = false)
      spec_installations = ParallelInstaller.call(self, @definition.specs, size, standalone, force)
      spec_installations.each do |installation|
        post_install_messages[installation.name] = installation.post_install_message if installation.has_post_install_message?
      end
    end

    # returns whether or not a re-resolve was needed
    def resolve_if_needed(options)
      if !@definition.unlocking? && !options["force"] && !Bundler.settings[:inline] && Bundler.default_lockfile.file?
        return false if @definition.nothing_changed? && !@definition.missing_specs?
      end

      if options["local"]
        @definition.resolve_with_cache!
      elsif options["prefer-local"]
        @definition.resolve_prefering_local!
      else
        @definition.resolve_remotely!
      end

      true
    end

    def lock(opts = {})
      @definition.lock(Bundler.default_lockfile, opts[:preserve_unknown_sections])
    end
  end
end
PK}$[�-L006gems/gems/bundler-2.3.27/lib/bundler/version_ranges.rbnu�[���# frozen_string_literal: true

module Bundler
  module VersionRanges
    NEq = Struct.new(:version)
    ReqR = Struct.new(:left, :right)
    class ReqR
      Endpoint = Struct.new(:version, :inclusive) do
        def <=>(other)
          if version.equal?(INFINITY)
            return 0 if other.version.equal?(INFINITY)
            return 1
          elsif other.version.equal?(INFINITY)
            return -1
          end

          comp = version <=> other.version
          return comp unless comp.zero?

          if inclusive && !other.inclusive
            1
          elsif !inclusive && other.inclusive
            -1
          else
            0
          end
        end
      end

      def to_s
        "#{left.inclusive ? "[" : "("}#{left.version}, #{right.version}#{right.inclusive ? "]" : ")"}"
      end
      INFINITY = begin
        inf = Object.new
        def inf.to_s
          "∞"
        end
        def inf.<=>(other)
          return 0 if other.equal?(self)
          1
        end
        inf.freeze
      end
      ZERO = Gem::Version.new("0.a")

      def cover?(v)
        return false if left.inclusive && left.version > v
        return false if !left.inclusive && left.version >= v

        if right.version != INFINITY
          return false if right.inclusive && right.version < v
          return false if !right.inclusive && right.version <= v
        end

        true
      end

      def empty?
        left.version == right.version && !(left.inclusive && right.inclusive)
      end

      def single?
        left.version == right.version
      end

      def <=>(other)
        return -1 if other.equal?(INFINITY)

        comp = left <=> other.left
        return comp unless comp.zero?

        right <=> other.right
      end

      UNIVERSAL = ReqR.new(ReqR::Endpoint.new(Gem::Version.new("0.a"), true), ReqR::Endpoint.new(ReqR::INFINITY, false)).freeze
    end

    def self.for_many(requirements)
      requirements = requirements.map(&:requirements).flatten(1).map {|r| r.join(" ") }
      requirements << ">= 0.a" if requirements.empty?
      requirement = Gem::Requirement.new(requirements)
      self.for(requirement)
    end

    def self.for(requirement)
      ranges = requirement.requirements.map do |op, v|
        case op
        when "=" then ReqR.new(ReqR::Endpoint.new(v, true), ReqR::Endpoint.new(v, true))
        when "!=" then NEq.new(v)
        when ">=" then ReqR.new(ReqR::Endpoint.new(v, true), ReqR::Endpoint.new(ReqR::INFINITY, false))
        when ">" then ReqR.new(ReqR::Endpoint.new(v, false), ReqR::Endpoint.new(ReqR::INFINITY, false))
        when "<" then ReqR.new(ReqR::Endpoint.new(ReqR::ZERO, true), ReqR::Endpoint.new(v, false))
        when "<=" then ReqR.new(ReqR::Endpoint.new(ReqR::ZERO, true), ReqR::Endpoint.new(v, true))
        when "~>" then ReqR.new(ReqR::Endpoint.new(v, true), ReqR::Endpoint.new(v.bump, false))
        else raise "unknown version op #{op} in requirement #{requirement}"
        end
      end.uniq
      ranges, neqs = ranges.partition {|r| !r.is_a?(NEq) }

      [ranges.sort, neqs.map(&:version)]
    end

    def self.empty?(ranges, neqs)
      !ranges.reduce(ReqR::UNIVERSAL) do |last_range, curr_range|
        next false unless last_range
        next false if curr_range.single? && neqs.include?(curr_range.left.version)
        next curr_range if last_range.right.version == ReqR::INFINITY
        case last_range.right.version <=> curr_range.left.version
        # higher
        when 1 then next ReqR.new(curr_range.left, last_range.right)
        # equal
        when 0
          if last_range.right.inclusive && curr_range.left.inclusive && !neqs.include?(curr_range.left.version)
            ReqR.new(curr_range.left, [curr_range.right, last_range.right].max)
          end
        # lower
        when -1 then next false
        end
      end
    end
  end
end
PK}$[�SJLL6gems/gems/bundler-2.3.27/lib/bundler/templates/Gemfilenu�[���# frozen_string_literal: true

source "https://rubygems.org"

# gem "rails"
PK}$[���J��Dgems/gems/bundler-2.3.27/lib/bundler/templates/Executable.standalonenu�[���#!/usr/bin/env <%= Bundler.settings[:shebang] || RbConfig::CONFIG["ruby_install_name"] %>
#
# This file was generated by Bundler.
#
# The application '<%= executable %>' is installed as part of a gem, and
# this file is here to facilitate running it.
#

$:.unshift File.expand_path "<%= standalone_path %>", __dir__

require "bundler/setup"
load File.expand_path "<%= executable_path %>", __dir__
PK}$[�X'j]]9gems/gems/bundler-2.3.27/lib/bundler/templates/Executablenu�[���#!/usr/bin/env <%= Bundler.settings[:shebang] || RbConfig::CONFIG["ruby_install_name"] %>
# frozen_string_literal: true

#
# This file was generated by Bundler.
#
# The application '<%= executable %>' is installed as part of a gem, and
# this file is here to facilitate running it.
#

ENV["BUNDLE_GEMFILE"] ||= File.expand_path("<%= relative_gemfile_path %>", __dir__)

bundle_binstub = File.expand_path("bundle", __dir__)

if File.file?(bundle_binstub)
  if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
    load(bundle_binstub)
  else
    abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
  end
end

require "rubygems"
require "bundler/setup"

load Gem.bin_path("<%= spec.name %>", "<%= executable %>")
PK}$[�SJLL6gems/gems/bundler-2.3.27/lib/bundler/templates/gems.rbnu�[���# frozen_string_literal: true

source "https://rubygems.org"

# gem "rails"
PK}$[^6)g&&Lgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/circleci/config.yml.ttnu�[���version: 2.1
jobs:
  build:
    docker:
      - image: ruby:<%= RUBY_VERSION %>
    steps:
      - checkout
      - run:
          name: Run the default task
          command: |
            gem install bundler -v <%= Bundler::VERSION %>
            bundle install
            bundle exec rake
PK}$[�5B��Dgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/bin/console.ttnu�[���#!/opt/alt/ruby31/bin/ruby
# frozen_string_literal: true

require "bundler/setup"
require "<%= config[:namespaced_path] %>"

# You can add fixtures and/or initialization code here to make experimenting
# with your gem easier. You can also use a different console, if you like.

# (If you use this, don't forget to add pry to your Gemfile!)
# require "pry"
# Pry.start

require "irb"
IRB.start(__FILE__)
PK}$[����Bgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/bin/setup.ttnu�[���#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
set -vx

bundle install

# Do any other automated setup that you need to do here
PK}$[���QQDgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/LICENSE.txt.ttnu�[���The MIT License (MIT)

Copyright (c) <%= Time.now.year %> <%= config[:author] %>

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}$[z���FFCgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/exe/newgem.ttnu�[���#!/opt/alt/ruby31/bin/ruby

require "<%= config[:namespaced_path] %>"
PK}$[��M��Lgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/ext/newgem/newgem.c.ttnu�[���#include "<%= config[:underscored_name] %>.h"

VALUE rb_m<%= config[:constant_array].join %>;

void
Init_<%= config[:underscored_name] %>(void)
{
  rb_m<%= config[:constant_array].join %> = rb_define_module(<%= config[:constant_name].inspect %>);
}
PK}$[9��5ffNgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/ext/newgem/extconf.rb.ttnu�[���# frozen_string_literal: true

require "mkmf"

create_makefile(<%= config[:makefile_path].inspect %>)
PK}$[�?����Lgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/ext/newgem/newgem.h.ttnu�[���#ifndef <%= config[:underscored_name].upcase %>_H
#define <%= config[:underscored_name].upcase %>_H 1

#include "ruby.h"

#endif /* <%= config[:underscored_name].upcase %>_H */
PK}$[/���++Dgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/rubocop.yml.ttnu�[���AllCops:
  TargetRubyVersion: <%= ::Gem::Version.new(config[:required_ruby_version]).segments[0..1].join(".") %>

Style/StringLiterals:
  Enabled: true
  EnforcedStyle: double_quotes

Style/StringLiteralsInInterpolation:
  Enabled: true
  EnforcedStyle: double_quotes

Layout/LineLength:
  Max: 120
PK}$[Ӟ�G��Egems/gems/bundler-2.3.27/lib/bundler/templates/newgem/standard.yml.ttnu�[���# For available configuration options, see:
#   https://github.com/testdouble/standard
ruby_version: <%= ::Gem::Version.new(config[:required_ruby_version]).segments[0..1].join(".") %>
PK}$[�]���Rgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/github/workflows/main.yml.ttnu�[���name: Ruby

on:
  push:
    branches:
      - <%= config[:git_default_branch] %>

  pull_request:

jobs:
  build:
    runs-on: ubuntu-latest
    name: Ruby ${{ matrix.ruby }}
    strategy:
      matrix:
        ruby:
          - '<%= RUBY_VERSION %>'

    steps:
    - uses: actions/checkout@v3
    - name: Set up Ruby
      uses: ruby/setup-ruby@v1
      with:
        ruby-version: ${{ matrix.ruby }}
        bundler-cache: true
    - name: Run the default task
      run: bundle exec rake
PK}$[
z�^�	�	Bgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/README.md.ttnu�[���# <%= config[:constant_name] %>

Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/<%= config[:namespaced_path] %>`. To experiment with that code, run `bin/console` for an interactive prompt.

TODO: Delete this and the text above, and describe your gem

## Installation

Install the gem and add to the application's Gemfile by executing:

    $ bundle add <%= config[:name] %>

If bundler is not being used to manage dependencies, install the gem by executing:

    $ gem install <%= config[:name] %>

## Usage

TODO: Write usage instructions here

## Development

After checking out the repo, run `bin/setup` to install dependencies.<% if config[:test] %> Then, run `rake <%= config[:test].sub('mini', '').sub('rspec', 'spec') %>` to run the tests.<% end %> You can also run `bin/console` for an interactive prompt that will allow you to experiment.<% if config[:bin] %> Run `bundle exec <%= config[:name] %>` to use the gem in this directory, ignoring other installed copies of this gem.<% end %>

To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
<% if config[:git] -%>

## Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/<%= config[:github_username] %>/<%= config[:name] %>.<% if config[:coc] %> This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/<%= config[:github_username] %>/<%= config[:name] %>/blob/<%= config[:git_default_branch] %>/CODE_OF_CONDUCT.md).<% end %>
<% end -%>
<% if config[:mit] -%>

## License

The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
<% end -%>
<% if config[:git] && config[:coc] -%>

## Code of Conduct

Everyone interacting in the <%= config[:constant_name] %> project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/<%= config[:github_username] %>/<%= config[:name] %>/blob/<%= config[:git_default_branch] %>/CODE_OF_CONDUCT.md).
<% end -%>
PK}$[�lq55>gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/rspec.ttnu�[���--format documentation
--color
--require spec_helper
PK}$[؊s�@gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/Gemfile.ttnu�[���# frozen_string_literal: true

source "https://rubygems.org"

# Specify your gem's dependencies in <%= config[:name] %>.gemspec
gemspec

gem "rake", "~> 13.0"
<%- if config[:ext] -%>

gem "rake-compiler"
<%- end -%>
<%- if config[:test] -%>

gem "<%= config[:test] %>", "~> <%= config[:test_framework_version] %>"
<%- end -%>
<%- if config[:linter] == "rubocop" -%>

gem "rubocop", "~> <%= config[:linter_version] %>"
<%- elsif config[:linter] == "standard" -%>

gem "standard", "~> <%= config[:linter_version] %>"
<%- end -%>
PK}$[,��
Ugems/gems/bundler-2.3.27/lib/bundler/templates/newgem/test/minitest/test_newgem.rb.ttnu�[���# frozen_string_literal: true

require "test_helper"

class <%= config[:minitest_constant_name] %> < Minitest::Test
  def test_that_it_has_a_version_number
    refute_nil ::<%= config[:constant_name] %>::VERSION
  end

  def test_it_does_something_useful
    assert false
  end
end
PK}$[�M-n��Ugems/gems/bundler-2.3.27/lib/bundler/templates/newgem/test/minitest/test_helper.rb.ttnu�[���# frozen_string_literal: true

$LOAD_PATH.unshift File.expand_path("../lib", __dir__)
require "<%= config[:namespaced_path] %>"

require "minitest/autorun"
PK}$[q��{33Vgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.ttnu�[���# frozen_string_literal: true

require "test_helper"

class <%= config[:constant_name] %>Test < Test::Unit::TestCase
  test "VERSION" do
    assert do
      ::<%= config[:constant_name] %>.const_defined?(:VERSION)
    end
  end

  test "something useful" do
    assert_equal("expected", "actual")
  end
end
PK}$[G�>J��Vgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.ttnu�[���# frozen_string_literal: true

$LOAD_PATH.unshift File.expand_path("../lib", __dir__)
require "<%= config[:namespaced_path] %>"

require "test-unit"
PK}$[���_ccKgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.ttnu�[���# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our community include:

* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
* Focusing on what is best not just for us as individuals, but for the overall community

Examples of unacceptable behavior include:

* The use of sexualized language or imagery, and sexual attention or
  advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
  address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at <%= config[:email] %>. All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

## Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

### 1. Correction

**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

### 2. Warning

**Community Impact**: A violation through a single incident or series of actions.

**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

### 3. Temporary Ban

**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.

**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

### 4. Permanent Ban

**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior,  harassment of an individual, or aggression toward or disparagement of classes of individuals.

**Consequence**: A permanent ban from any sort of public interaction within the community.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0,
available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity).

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.
PK}$[��~~Cgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/travis.yml.ttnu�[���---
language: ruby
cache: bundler
rvm:
  - <%= RUBY_VERSION %>
before_install: gem install bundler -v <%= Bundler::VERSION %>
PK}$[!5��PPEgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/CHANGELOG.md.ttnu�[���## [Unreleased]

## [0.1.0] - <%= Time.now.strftime('%F') %>

- Initial release
PK}$[Ҧ+���Lgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/spec/spec_helper.rb.ttnu�[���# frozen_string_literal: true

require "<%= config[:namespaced_path] %>"

RSpec.configure do |config|
  # Enable flags like --only-failures and --next-failure
  config.example_status_persistence_file_path = ".rspec_status"

  # Disable RSpec exposing methods globally on `Module` and `main`
  config.disable_monkey_patching!

  config.expect_with :rspec do |c|
    c.syntax = :expect
  end
end
PK}$[32
���Lgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/spec/newgem_spec.rb.ttnu�[���# frozen_string_literal: true

RSpec.describe <%= config[:constant_name] %> do
  it "has a version number" do
    expect(<%= config[:constant_name] %>::VERSION).not_to be nil
  end

  it "does something useful" do
    expect(false).to eq(true)
  end
end
PK}$[A�ܶ�Fgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/gitlab-ci.yml.ttnu�[���default:
  image: ruby:<%= RUBY_VERSION %>

  before_script:
    - gem install bundler -v <%= Bundler::VERSION %>
    - bundle install

example_job:
  script:
    - bundle exec rake
PK}$[z�y��Agems/gems/bundler-2.3.27/lib/bundler/templates/newgem/Rakefile.ttnu�[���# frozen_string_literal: true

require "bundler/gem_tasks"
<% default_task_names = [config[:test_task]].compact -%>
<% case config[:test] -%>
<% when "minitest" -%>
require "rake/testtask"

Rake::TestTask.new(:test) do |t|
  t.libs << "test"
  t.libs << "lib"
  t.test_files = FileList["test/**/test_*.rb"]
end

<% when "test-unit" -%>
require "rake/testtask"

Rake::TestTask.new(:test) do |t|
  t.libs << "test"
  t.libs << "lib"
  t.test_files = FileList["test/**/*_test.rb"]
end

<% when "rspec" -%>
require "rspec/core/rake_task"

RSpec::Core::RakeTask.new(:spec)

<% end -%>
<% if config[:linter] == "rubocop" -%>
<% default_task_names << :rubocop -%>
require "rubocop/rake_task"

RuboCop::RakeTask.new

<% elsif config[:linter] == "standard" -%>
<% default_task_names << :standard -%>
require "standard/rake"

<% end -%>
<% if config[:ext] -%>
<% default_task_names.unshift(:clobber, :compile) -%>
require "rake/extensiontask"

task build: :compile

Rake::ExtensionTask.new("<%= config[:underscored_name] %>") do |ext|
  ext.lib_dir = "lib/<%= config[:namespaced_path] %>"
end

<% end -%>
<% if default_task_names.size == 1 -%>
task default: <%= default_task_names.first.inspect %>
<% else -%>
task default: %i[<%= default_task_names.join(" ") %>]
<% end -%>
PK}$[��Br==Fgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/lib/newgem.rb.ttnu�[���# frozen_string_literal: true

require_relative "<%= File.basename(config[:namespaced_path]) %>/version"
<%- if config[:ext] -%>
require_relative "<%= File.basename(config[:namespaced_path]) %>/<%= config[:underscored_name] %>"
<%- end -%>

<%- config[:constant_array].each_with_index do |c, i| -%>
<%= "  " * i %>module <%= c %>
<%- end -%>
<%= "  " * config[:constant_array].size %>class Error < StandardError; end
<%= "  " * config[:constant_array].size %># Your code goes here...
<%- (config[:constant_array].size-1).downto(0) do |i| -%>
<%= "  " * i %>end
<%- end -%>
PK}$[��Ngems/gems/bundler-2.3.27/lib/bundler/templates/newgem/lib/newgem/version.rb.ttnu�[���# frozen_string_literal: true

<%- config[:constant_array].each_with_index do |c, i| -%>
<%= "  " * i %>module <%= c %>
<%- end -%>
<%= "  " * config[:constant_array].size %>VERSION = "0.1.0"
<%- (config[:constant_array].size-1).downto(0) do |i| -%>
<%= "  " * i %>end
<%- end -%>
PK}$[!�b--Ggems/gems/bundler-2.3.27/lib/bundler/templates/newgem/newgem.gemspec.ttnu�[���# frozen_string_literal: true

require_relative "lib/<%=config[:namespaced_path]%>/version"

Gem::Specification.new do |spec|
  spec.name = <%= config[:name].inspect %>
  spec.version = <%= config[:constant_name] %>::VERSION
  spec.authors = [<%= config[:author].inspect %>]
  spec.email = [<%= config[:email].inspect %>]

  spec.summary = "TODO: Write a short summary, because RubyGems requires one."
  spec.description = "TODO: Write a longer description or delete this line."
  spec.homepage = "TODO: Put your gem's website or public repo URL here."
<%- if config[:mit] -%>
  spec.license = "MIT"
<%- end -%>
  spec.required_ruby_version = ">= <%= config[:required_ruby_version] %>"

  spec.metadata["allowed_push_host"] = "TODO: Set to your gem server 'https://example.com'"

  spec.metadata["homepage_uri"] = spec.homepage
  spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
  spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."

  # Specify which files should be added to the gem when it is released.
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
  spec.files = Dir.chdir(__dir__) do
    `git ls-files -z`.split("\x0").reject do |f|
      (f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
    end
  end
  spec.bindir = "exe"
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
  spec.require_paths = ["lib"]
<%- if config[:ext] -%>
  spec.extensions = ["ext/<%= config[:underscored_name] %>/extconf.rb"]
<%- end -%>

  # Uncomment to register a new dependency of your gem
  # spec.add_dependency "example-gem", "~> 1.0"

  # For more information and examples about making a new gem, check out our
  # guide at: https://bundler.io/guides/creating_gem.html
end
PK}$[N��meeGgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/sig/newgem.rbs.ttnu�[���<%- config[:constant_array].each_with_index do |c, i| -%>
<%= "  " * i %>module <%= c %>
<%- end -%>
<%= "  " * config[:constant_array].size %>VERSION: String
<%= "  " * config[:constant_array].size %># See the writing guide of rbs: https://github.com/ruby/rbs#guides
<%- (config[:constant_array].size-1).downto(0) do |i| -%>
<%= "  " * i %>end
<%- end -%>
PK}$[g2����Bgems/gems/bundler-2.3.27/lib/bundler/templates/newgem/gitignore.ttnu�[���/.bundle/
/.yardoc
/_yardoc/
/coverage/
/doc/
/pkg/
/spec/reports/
/tmp/
<%- if config[:ext] -%>
*.bundle
*.so
*.o
*.a
mkmf.log
<%- end -%>
<%- if config[:test] == "rspec" -%>

# rspec failure tracking
.rspec_status
<%- end -%>
PK}$[]�yAgems/gems/bundler-2.3.27/lib/bundler/templates/Executable.bundlernu�[���#!/usr/bin/env <%= Bundler.settings[:shebang] || RbConfig::CONFIG["ruby_install_name"] %>
# frozen_string_literal: true

#
# This file was generated by Bundler.
#
# The application '<%= executable %>' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require "rubygems"

m = Module.new do
  module_function

  def invoked_as_script?
    File.expand_path($0) == File.expand_path(__FILE__)
  end

  def env_var_version
    ENV["BUNDLER_VERSION"]
  end

  def cli_arg_version
    return unless invoked_as_script? # don't want to hijack other binstubs
    return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update`
    bundler_version = nil
    update_index = nil
    ARGV.each_with_index do |a, i|
      if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN
        bundler_version = a
      end
      next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/
      bundler_version = $1
      update_index = i
    end
    bundler_version
  end

  def gemfile
    gemfile = ENV["BUNDLE_GEMFILE"]
    return gemfile if gemfile && !gemfile.empty?

    File.expand_path("<%= relative_gemfile_path %>", __dir__)
  end

  def lockfile
    lockfile =
      case File.basename(gemfile)
      when "gems.rb" then gemfile.sub(/\.rb$/, gemfile)
      else "#{gemfile}.lock"
      end
    File.expand_path(lockfile)
  end

  def lockfile_version
    return unless File.file?(lockfile)
    lockfile_contents = File.read(lockfile)
    return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/
    Regexp.last_match(1)
  end

  def bundler_requirement
    @bundler_requirement ||=
      env_var_version || cli_arg_version ||
        bundler_requirement_for(lockfile_version)
  end

  def bundler_requirement_for(version)
    return "#{Gem::Requirement.default}.a" unless version

    bundler_gem_version = Gem::Version.new(version)

    requirement = bundler_gem_version.approximate_recommendation

    return requirement unless Gem.rubygems_version < Gem::Version.new("2.7.0")

    requirement += ".a" if bundler_gem_version.prerelease?

    requirement
  end

  def load_bundler!
    ENV["BUNDLE_GEMFILE"] ||= gemfile

    activate_bundler
  end

  def activate_bundler
    gem_error = activation_error_handling do
      gem "bundler", bundler_requirement
    end
    return if gem_error.nil?
    require_error = activation_error_handling do
      require "bundler/version"
    end
    return if require_error.nil? && Gem::Requirement.new(bundler_requirement).satisfied_by?(Gem::Version.new(Bundler::VERSION))
    warn "Activating bundler (#{bundler_requirement}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_requirement}'`"
    exit 42
  end

  def activation_error_handling
    yield
    nil
  rescue StandardError, LoadError => e
    e
  end
end

m.load_bundler!

if m.invoked_as_script?
  load Gem.bin_path("<%= spec.name %>", "<%= executable %>")
end
PK}$[�!
!
?gems/gems/bundler-2.3.27/lib/bundler/installer/gem_installer.rbnu�[���# frozen_string_literal: true

module Bundler
  class GemInstaller
    attr_reader :spec, :standalone, :worker, :force, :installer

    def initialize(spec, installer, standalone = false, worker = 0, force = false)
      @spec = spec
      @installer = installer
      @standalone = standalone
      @worker = worker
      @force = force
    end

    def install_from_spec
      post_install_message = install
      Bundler.ui.debug "#{worker}:  #{spec.name} (#{spec.version}) from #{spec.loaded_from}"
      generate_executable_stubs
      return true, post_install_message
    rescue Bundler::InstallHookError, Bundler::SecurityError, Bundler::APIResponseMismatchError
      raise
    rescue Errno::ENOSPC
      return false, out_of_space_message
    rescue Bundler::BundlerError, Gem::InstallError, Bundler::APIResponseInvalidDependenciesError => e
      return false, specific_failure_message(e)
    end

    private

    def specific_failure_message(e)
      message = "#{e.class}: #{e.message}\n"
      message += "  " + e.backtrace.join("\n  ") + "\n\n"
      message = message.lines.first + Bundler.ui.add_color(message.lines.drop(1).join, :clear)
      message + Bundler.ui.add_color(failure_message, :red)
    end

    def failure_message
      install_error_message
    end

    def install_error_message
      "An error occurred while installing #{spec.name} (#{spec.version}), and Bundler cannot continue."
    end

    def spec_settings
      # Fetch the build settings, if there are any
      if settings = Bundler.settings["build.#{spec.name}"]
        require "shellwords"
        Shellwords.shellsplit(settings)
      end
    end

    def install
      spec.source.install(
        spec,
        :force => force,
        :ensure_builtin_gems_cached => standalone,
        :build_args => Array(spec_settings),
        :previous_spec => previous_spec,
      )
    end

    def previous_spec
      locked_gems = installer.definition.locked_gems
      return unless locked_gems

      locked_gems.specs.find {|s| s.name == spec.name }
    end

    def out_of_space_message
      "#{install_error_message}\nYour disk is out of space. Free some space to be able to install your bundle."
    end

    def generate_executable_stubs
      return if Bundler.feature_flag.forget_cli_options?
      return if Bundler.settings[:inline]
      if Bundler.settings[:bin] && standalone
        installer.generate_standalone_bundler_executable_stubs(spec)
      elsif Bundler.settings[:bin]
        installer.generate_bundler_executable_stubs(spec, :force => true)
      end
    end
  end
end
PK}$[��y��Dgems/gems/bundler-2.3.27/lib/bundler/installer/parallel_installer.rbnu�[���# frozen_string_literal: true

require_relative "../worker"
require_relative "gem_installer"

module Bundler
  class ParallelInstaller
    class SpecInstallation
      attr_accessor :spec, :name, :full_name, :post_install_message, :state, :error
      def initialize(spec)
        @spec = spec
        @name = spec.name
        @full_name = spec.full_name
        @state = :none
        @post_install_message = ""
        @error = nil
      end

      def installed?
        state == :installed
      end

      def enqueued?
        state == :enqueued
      end

      def failed?
        state == :failed
      end

      def ready_to_enqueue?
        state == :none
      end

      def has_post_install_message?
        !post_install_message.empty?
      end

      def ignorable_dependency?(dep)
        dep.type == :development || dep.name == @name
      end

      # Checks installed dependencies against spec's dependencies to make
      # sure needed dependencies have been installed.
      def dependencies_installed?(all_specs)
        installed_specs = all_specs.select(&:installed?).map(&:name)
        dependencies.all? {|d| installed_specs.include? d.name }
      end

      # Represents only the non-development dependencies, the ones that are
      # itself and are in the total list.
      def dependencies
        @dependencies ||= all_dependencies.reject {|dep| ignorable_dependency? dep }
      end

      def missing_lockfile_dependencies(all_spec_names)
        dependencies.reject {|dep| all_spec_names.include? dep.name }
      end

      # Represents all dependencies
      def all_dependencies
        @spec.dependencies
      end

      def to_s
        "#<#{self.class} #{full_name} (#{state})>"
      end
    end

    def self.call(*args)
      new(*args).call
    end

    attr_reader :size

    def initialize(installer, all_specs, size, standalone, force)
      @installer = installer
      @size = size
      @standalone = standalone
      @force = force
      @specs = all_specs.map {|s| SpecInstallation.new(s) }
      @spec_set = all_specs
      @rake = @specs.find {|s| s.name == "rake" }
    end

    def call
      check_for_corrupt_lockfile

      if @rake
        do_install(@rake, 0)
        Gem::Specification.reset
      end

      if @size > 1
        install_with_worker
      else
        install_serially
      end

      check_for_unmet_dependencies

      handle_error if failed_specs.any?
      @specs
    ensure
      worker_pool && worker_pool.stop
    end

    def check_for_unmet_dependencies
      unmet_dependencies = @specs.map do |s|
        [
          s,
          s.dependencies.reject {|dep| @specs.any? {|spec| dep.matches_spec?(spec.spec) } },
        ]
      end.reject {|a| a.last.empty? }
      return if unmet_dependencies.empty?

      warning = []
      warning << "Your lockfile doesn't include a valid resolution."
      warning << "You can fix this by regenerating your lockfile or trying to manually editing the bad locked gems to a version that satisfies all dependencies."
      warning << "The unmet dependencies are:"

      unmet_dependencies.each do |spec, unmet_spec_dependencies|
        unmet_spec_dependencies.each do |unmet_spec_dependency|
          warning << "* #{unmet_spec_dependency}, depended upon #{spec.full_name}, unsatisfied by #{@specs.find {|s| s.name == unmet_spec_dependency.name && !unmet_spec_dependency.matches_spec?(s.spec) }.full_name}"
        end
      end

      Bundler.ui.warn(warning.join("\n"))
    end

    def check_for_corrupt_lockfile
      missing_dependencies = @specs.map do |s|
        [
          s,
          s.missing_lockfile_dependencies(@specs.map(&:name)),
        ]
      end.reject {|a| a.last.empty? }
      return if missing_dependencies.empty?

      warning = []
      warning << "Your lockfile was created by an old Bundler that left some things out."
      if @size != 1
        warning << "Because of the missing DEPENDENCIES, we can only install gems one at a time, instead of installing #{@size} at a time."
        @size = 1
      end
      warning << "You can fix this by adding the missing gems to your Gemfile, running bundle install, and then removing the gems from your Gemfile."
      warning << "The missing gems are:"

      missing_dependencies.each do |spec, missing|
        warning << "* #{missing.map(&:name).join(", ")} depended upon by #{spec.name}"
      end

      Bundler.ui.warn(warning.join("\n"))
    end

    private

    def failed_specs
      @specs.select(&:failed?)
    end

    def install_with_worker
      enqueue_specs
      process_specs until finished_installing?
    end

    def install_serially
      until finished_installing?
        raise "failed to find a spec to enqueue while installing serially" unless spec_install = @specs.find(&:ready_to_enqueue?)
        spec_install.state = :enqueued
        do_install(spec_install, 0)
      end
    end

    def worker_pool
      @worker_pool ||= Bundler::Worker.new @size, "Parallel Installer", lambda {|spec_install, worker_num|
        do_install(spec_install, worker_num)
      }
    end

    def do_install(spec_install, worker_num)
      Plugin.hook(Plugin::Events::GEM_BEFORE_INSTALL, spec_install)
      gem_installer = Bundler::GemInstaller.new(
        spec_install.spec, @installer, @standalone, worker_num, @force
      )
      success, message = gem_installer.install_from_spec
      if success
        spec_install.state = :installed
        spec_install.post_install_message = message unless message.nil?
      else
        spec_install.error = "#{message}\n\n#{require_tree_for_spec(spec_install.spec)}"
        spec_install.state = :failed
      end
      Plugin.hook(Plugin::Events::GEM_AFTER_INSTALL, spec_install)
      spec_install
    end

    # Dequeue a spec and save its post-install message and then enqueue the
    # remaining specs.
    # Some specs might've had to wait til this spec was installed to be
    # processed so the call to `enqueue_specs` is important after every
    # dequeue.
    def process_specs
      worker_pool.deq
      enqueue_specs
    end

    def finished_installing?
      @specs.all? do |spec|
        return true if spec.failed?
        spec.installed?
      end
    end

    def handle_error
      errors = failed_specs.map(&:error)
      if exception = errors.find {|e| e.is_a?(Bundler::BundlerError) }
        raise exception
      end
      raise Bundler::InstallError, errors.join("\n\n")
    end

    def require_tree_for_spec(spec)
      tree = @spec_set.what_required(spec)
      t = String.new("In #{File.basename(SharedHelpers.default_gemfile)}:\n")
      tree.each_with_index do |s, depth|
        t << "  " * depth.succ << s.name
        unless tree.last == s
          t << %( was resolved to #{s.version}, which depends on)
        end
        t << %(\n)
      end
      t
    end

    # Keys in the remains hash represent uninstalled gems specs.
    # We enqueue all gem specs that do not have any dependencies.
    # Later we call this lambda again to install specs that depended on
    # previously installed specifications. We continue until all specs
    # are installed.
    def enqueue_specs
      @specs.select(&:ready_to_enqueue?).each do |spec|
        if spec.dependencies_installed? @specs
          spec.state = :enqueued
          worker_pool.enq spec
        end
      end
    end
  end
end
PK}$[�aboXX<gems/gems/bundler-2.3.27/lib/bundler/installer/standalone.rbnu�[���# frozen_string_literal: true

module Bundler
  class Standalone
    def initialize(groups, definition)
      @specs = definition.specs_for(groups)
    end

    def generate
      SharedHelpers.filesystem_access(bundler_path) do |p|
        FileUtils.mkdir_p(p)
      end
      File.open File.join(bundler_path, "setup.rb"), "w" do |file|
        file.puts "require 'rbconfig'"
        file.puts define_path_helpers
        file.puts reverse_rubygems_kernel_mixin
        paths.each do |path|
          if Pathname.new(path).absolute?
            file.puts %($:.unshift "#{path}")
          else
            file.puts %($:.unshift File.expand_path("\#{__dir__}/#{path}"))
          end
        end
      end
    end

    private

    def paths
      @specs.map do |spec|
        next if spec.name == "bundler"
        Array(spec.require_paths).map do |path|
          gem_path(path, spec).
            sub(version_dir, '#{RUBY_ENGINE}/#{Gem.ruby_api_version}').
            sub(extensions_dir, 'extensions/\k<platform>/#{Gem.extension_api_version}')
          # This is a static string intentionally. It's interpolated at a later time.
        end
      end.flatten.compact
    end

    def version_dir
      "#{RUBY_ENGINE}/#{Gem.ruby_api_version}"
    end

    def extensions_dir
      %r{extensions/(?<platform>[^/]+)/#{Regexp.escape(Gem.extension_api_version)}}
    end

    def bundler_path
      Bundler.root.join(Bundler.settings[:path].to_s, "bundler")
    end

    def gem_path(path, spec)
      full_path = Pathname.new(path).absolute? ? path : File.join(spec.full_gem_path, path)
      if spec.source.instance_of?(Source::Path)
        full_path
      else
        Pathname.new(full_path).relative_path_from(Bundler.root.join(bundler_path)).to_s
      end
    rescue TypeError
      error_message = "#{spec.name} #{spec.version} has an invalid gemspec"
      raise Gem::InvalidSpecificationException.new(error_message)
    end

    def define_path_helpers
      <<~'END'
        unless defined?(Gem)
          module Gem
            def self.ruby_api_version
              RbConfig::CONFIG["ruby_version"]
            end

            def self.extension_api_version
              if 'no' == RbConfig::CONFIG['ENABLE_SHARED']
                "#{ruby_api_version}-static"
              else
                ruby_api_version
              end
            end
          end
        end
      END
    end

    def reverse_rubygems_kernel_mixin
      <<~END
      kernel = (class << ::Kernel; self; end)
      [kernel, ::Kernel].each do |k|
        if k.private_method_defined?(:gem_original_require)
          private_require = k.private_method_defined?(:require)
          k.send(:remove_method, :require)
          k.send(:define_method, :require, k.instance_method(:gem_original_require))
          k.send(:private, :require) if private_require
        end
      end
      END
    end
  end
end
PK}$[|��YY4gems/gems/bundler-2.3.27/lib/bundler/vendored_uri.rbnu�[���# frozen_string_literal: true

module Bundler; end
require_relative "vendor/uri/lib/uri"
PK}$[)PY�\\;gems/gems/bundler-2.3.27/lib/bundler/similarity_detector.rbnu�[���# frozen_string_literal: true

module Bundler
  class SimilarityDetector
    SimilarityScore = Struct.new(:string, :distance)

    # initialize with an array of words to be matched against
    def initialize(corpus)
      @corpus = corpus
    end

    # return an array of words similar to 'word' from the corpus
    def similar_words(word, limit = 3)
      words_by_similarity = @corpus.map {|w| SimilarityScore.new(w, levenshtein_distance(word, w)) }
      words_by_similarity.select {|s| s.distance <= limit }.sort_by(&:distance).map(&:string)
    end

    # return the result of 'similar_words', concatenated into a list
    # (eg "a, b, or c")
    def similar_word_list(word, limit = 3)
      words = similar_words(word, limit)
      if words.length == 1
        words[0]
      elsif words.length > 1
        [words[0..-2].join(", "), words[-1]].join(" or ")
      end
    end

    protected

    # https://www.informit.com/articles/article.aspx?p=683059&seqNum=36
    def levenshtein_distance(this, that, ins = 2, del = 2, sub = 1)
      # ins, del, sub are weighted costs
      return nil if this.nil?
      return nil if that.nil?
      dm = [] # distance matrix

      # Initialize first row values
      dm[0] = (0..this.length).collect {|i| i * ins }
      fill = [0] * (this.length - 1)

      # Initialize first column values
      (1..that.length).each do |i|
        dm[i] = [i * del, fill.flatten]
      end

      # populate matrix
      (1..that.length).each do |i|
        (1..this.length).each do |j|
          # critical comparison
          dm[i][j] = [
            dm[i - 1][j - 1] + (this[j - 1] == that[i - 1] ? 0 : sub),
            dm[i][j - 1] + ins,
            dm[i - 1][j] + del,
          ].min
        end
      end

      # The last value in matrix is the Levenshtein distance between the strings
      dm[that.length][this.length]
    end
  end
end
PK}$[�� �<gems/gems/bundler-2.3.27/lib/bundler/gem_version_promoter.rbnu�[���# frozen_string_literal: true

module Bundler
  # This class contains all of the logic for determining the next version of a
  # Gem to update to based on the requested level (patch, minor, major).
  # Primarily designed to work with Resolver which will provide it the list of
  # available dependency versions as found in its index, before returning it to
  # to the resolution engine to select the best version.
  class GemVersionPromoter
    DEBUG = ENV["BUNDLER_DEBUG_RESOLVER"] || ENV["DEBUG_RESOLVER"]

    attr_reader :level, :locked_specs, :unlock_gems

    # By default, strict is false, meaning every available version of a gem
    # is returned from sort_versions. The order gives preference to the
    # requested level (:patch, :minor, :major) but in complicated requirement
    # cases some gems will by necessity by promoted past the requested level,
    # or even reverted to older versions.
    #
    # If strict is set to true, the results from sort_versions will be
    # truncated, eliminating any version outside the current level scope.
    # This can lead to unexpected outcomes or even VersionConflict exceptions
    # that report a version of a gem not existing for versions that indeed do
    # existing in the referenced source.
    attr_accessor :strict

    attr_accessor :prerelease_specified

    # Given a list of locked_specs and a list of gems to unlock creates a
    # GemVersionPromoter instance.
    #
    # @param locked_specs [SpecSet] All current locked specs. Unlike Definition
    #   where this list is empty if all gems are being updated, this should
    #   always be populated for all gems so this class can properly function.
    # @param unlock_gems [String] List of gem names being unlocked. If empty,
    #   all gems will be considered unlocked.
    # @return [GemVersionPromoter]
    def initialize(locked_specs = SpecSet.new([]), unlock_gems = [])
      @level = :major
      @strict = false
      @locked_specs = locked_specs
      @unlock_gems = unlock_gems
      @sort_versions = {}
      @prerelease_specified = {}
    end

    # @param value [Symbol] One of three Symbols: :major, :minor or :patch.
    def level=(value)
      v = case value
          when String, Symbol
            value.to_sym
      end

      raise ArgumentError, "Unexpected level #{v}. Must be :major, :minor or :patch" unless [:major, :minor, :patch].include?(v)
      @level = v
    end

    # Given a Dependency and an Array of Specifications of available versions for a
    # gem, this method will return the Array of Specifications sorted (and possibly
    # truncated if strict is true) in an order to give preference to the current
    # level (:major, :minor or :patch) when resolution is deciding what versions
    # best resolve all dependencies in the bundle.
    # @param dep [Dependency] The Dependency of the gem.
    # @param spec_groups [Specification] An array of Specifications for the same gem
    #    named in the @dep param.
    # @return [Specification] A new instance of the Specification Array sorted and
    #    possibly filtered.
    def sort_versions(dep, spec_groups)
      @sort_versions[dep] ||= begin
        gem_name = dep.name

        # An Array per version returned, different entries for different platforms.
        # We only need the version here so it's ok to hard code this to the first instance.
        locked_spec = locked_specs[gem_name].first

        if strict
          filter_dep_specs(spec_groups, locked_spec)
        else
          sort_dep_specs(spec_groups, locked_spec)
        end
      end
    end

    def reset
      @sort_versions = {}
    end

    # @return [bool] Convenience method for testing value of level variable.
    def major?
      level == :major
    end

    # @return [bool] Convenience method for testing value of level variable.
    def minor?
      level == :minor
    end

    private

    def filter_dep_specs(spec_groups, locked_spec)
      res = spec_groups.select do |spec_group|
        if locked_spec && !major?
          gsv = spec_group.version
          lsv = locked_spec.version

          must_match = minor? ? [0] : [0, 1]

          matches = must_match.map {|idx| gsv.segments[idx] == lsv.segments[idx] }
          matches.uniq == [true] ? (gsv >= lsv) : false
        else
          true
        end
      end

      sort_dep_specs(res, locked_spec)
    end

    def sort_dep_specs(spec_groups, locked_spec)
      @locked_version = locked_spec&.version
      @gem_name = locked_spec&.name

      result = spec_groups.sort do |a, b|
        @a_ver = a.version
        @b_ver = b.version

        unless @gem_name && @prerelease_specified[@gem_name]
          a_pre = @a_ver.prerelease?
          b_pre = @b_ver.prerelease?

          next -1 if a_pre && !b_pre
          next  1 if b_pre && !a_pre
        end

        if major?
          @a_ver <=> @b_ver
        elsif either_version_older_than_locked
          @a_ver <=> @b_ver
        elsif segments_do_not_match(:major)
          @b_ver <=> @a_ver
        elsif !minor? && segments_do_not_match(:minor)
          @b_ver <=> @a_ver
        else
          @a_ver <=> @b_ver
        end
      end
      post_sort(result)
    end

    def either_version_older_than_locked
      @locked_version && (@a_ver < @locked_version || @b_ver < @locked_version)
    end

    def segments_do_not_match(level)
      index = [:major, :minor].index(level)
      @a_ver.segments[index] != @b_ver.segments[index]
    end

    def unlocking_gem?
      unlock_gems.empty? || (@gem_name && unlock_gems.include?(@gem_name))
    end

    # Specific version moves can't always reliably be done during sorting
    # as not all elements are compared against each other.
    def post_sort(result)
      # default :major behavior in Bundler does not do this
      return result if major?
      if unlocking_gem? || @locked_version.nil?
        result
      else
        move_version_to_end(result, @locked_version)
      end
    end

    def move_version_to_end(result, version)
      move, keep = result.partition {|s| s.version.to_s == version.to_s }
      keep.concat(move)
    end
  end
end
PK}$[jIUKxx0gems/gems/bundler-2.3.27/lib/bundler/spec_set.rbnu�[���# frozen_string_literal: true

require_relative "vendored_tsort"

module Bundler
  class SpecSet
    include Enumerable
    include TSort

    attr_reader :incomplete_specs

    def initialize(specs, incomplete_specs = [])
      @specs = specs
      @incomplete_specs = incomplete_specs
    end

    def for(dependencies, check = false, platforms = [nil])
      handled = ["bundler"].product(platforms).map {|k| [k, true] }.to_h
      deps = dependencies.product(platforms)
      specs = []

      loop do
        break unless dep = deps.shift

        name = dep[0].name
        platform = dep[1]

        key = [name, platform]
        next if handled.key?(key)

        handled[key] = true

        specs_for_dep = specs_for_dependency(*dep)
        if specs_for_dep.any?
          specs.concat(specs_for_dep)

          specs_for_dep.first.dependencies.each do |d|
            next if d.type == :development
            deps << [d, dep[1]]
          end
        elsif check
          @incomplete_specs += lookup[name]
        end
      end

      specs
    end

    def [](key)
      key = key.name if key.respond_to?(:name)
      lookup[key].reverse
    end

    def []=(key, value)
      @specs << value
      @lookup = nil
      @sorted = nil
    end

    def delete(spec)
      @specs.delete(spec)
      @lookup = nil
      @sorted = nil
    end

    def sort!
      self
    end

    def to_a
      sorted.dup
    end

    def to_hash
      lookup.dup
    end

    def materialize(deps)
      materialized = self.for(deps, true)

      SpecSet.new(materialized, incomplete_specs)
    end

    # Materialize for all the specs in the spec set, regardless of what platform they're for
    # This is in contrast to how for does platform filtering (and specifically different from how `materialize` calls `for` only for the current platform)
    # @return [Array<Gem::Specification>]
    def materialized_for_all_platforms
      @specs.map do |s|
        next s unless s.is_a?(LazySpecification)
        s.source.remote!
        spec = s.materialize_for_installation
        raise GemNotFound, "Could not find #{s.full_name} in any of the sources" unless spec
        spec
      end
    end

    def incomplete_ruby_specs?(deps)
      self.for(deps, true, [Gem::Platform::RUBY])

      @incomplete_specs.any?
    end

    def missing_specs
      @specs.select {|s| s.is_a?(LazySpecification) }
    end

    def merge(set)
      arr = sorted.dup
      set.each do |set_spec|
        full_name = set_spec.full_name
        next if arr.any? {|spec| spec.full_name == full_name }
        arr << set_spec
      end
      SpecSet.new(arr)
    end

    def -(other)
      SpecSet.new(to_a - other.to_a)
    end

    def find_by_name_and_platform(name, platform)
      @specs.detect {|spec| spec.name == name && spec.match_platform(platform) }
    end

    def delete_by_name_and_version(name, version)
      @specs.reject! {|spec| spec.name == name && spec.version == version }
      @lookup = nil
      @sorted = nil
    end

    def what_required(spec)
      unless req = find {|s| s.dependencies.any? {|d| d.type == :runtime && d.name == spec.name } }
        return [spec]
      end
      what_required(req) << spec
    end

    def <<(spec)
      @specs << spec
    end

    def length
      @specs.length
    end

    def size
      @specs.size
    end

    def empty?
      @specs.empty?
    end

    def each(&b)
      sorted.each(&b)
    end

    private

    def sorted
      rake = @specs.find {|s| s.name == "rake" }
      begin
        @sorted ||= ([rake] + tsort).compact.uniq
      rescue TSort::Cyclic => error
        cgems = extract_circular_gems(error)
        raise CyclicDependencyError, "Your bundle requires gems that depend" \
          " on each other, creating an infinite loop. Please remove either" \
          " gem '#{cgems[1]}' or gem '#{cgems[0]}' and try again."
      end
    end

    def extract_circular_gems(error)
      error.message.scan(/@name="(.*?)"/).flatten
    end

    def lookup
      @lookup ||= begin
        lookup = Hash.new {|h, k| h[k] = [] }
        @specs.each do |s|
          lookup[s.name] << s
        end
        lookup
      end
    end

    def tsort_each_node
      # MUST sort by name for backwards compatibility
      @specs.sort_by(&:name).each {|s| yield s }
    end

    def specs_for_dependency(dep, platform)
      specs_for_name = lookup[dep.name]
      if platform.nil?
        matching_specs = specs_for_name.map {|s| s.materialize_for_installation if Gem::Platform.match_spec?(s) }.compact
        GemHelpers.sort_best_platform_match(matching_specs, Bundler.local_platform)
      else
        GemHelpers.select_best_platform_match(specs_for_name, dep.force_ruby_platform ? Gem::Platform::RUBY : platform)
      end
    end

    def tsort_each_child(s)
      s.dependencies.sort_by(&:name).each do |d|
        next if d.type == :development
        lookup[d.name].each {|s2| yield s2 }
      end
    end
  end
end
PK}$[a�#Y-gems/gems/bundler-2.3.27/lib/bundler/index.rbnu�[���# frozen_string_literal: true

module Bundler
  class Index
    include Enumerable

    def self.build
      i = new
      yield i
      i
    end

    attr_reader :specs, :all_specs, :sources
    protected :specs, :all_specs

    RUBY = "ruby".freeze
    NULL = "\0".freeze

    def initialize
      @sources = []
      @cache = {}
      @specs = Hash.new {|h, k| h[k] = {} }
      @all_specs = Hash.new {|h, k| h[k] = EMPTY_SEARCH }
    end

    def initialize_copy(o)
      @sources = o.sources.dup
      @cache = {}
      @specs = Hash.new {|h, k| h[k] = {} }
      @all_specs = Hash.new {|h, k| h[k] = EMPTY_SEARCH }

      o.specs.each do |name, hash|
        @specs[name] = hash.dup
      end
      o.all_specs.each do |name, array|
        @all_specs[name] = array.dup
      end
    end

    def inspect
      "#<#{self.class}:0x#{object_id} sources=#{sources.map(&:inspect)} specs.size=#{specs.size}>"
    end

    def empty?
      each { return false }
      true
    end

    def search_all(name)
      all_matches = local_search(name) + @all_specs[name]
      @sources.each do |source|
        all_matches.concat(source.search_all(name))
      end
      all_matches
    end

    # Search this index's specs, and any source indexes that this index knows
    # about, returning all of the results.
    def search(query)
      results = local_search(query)
      return results unless @sources.any?

      @sources.each do |source|
        results.concat(source.search(query))
      end
      results.uniq(&:full_name)
    end

    def local_search(query)
      case query
      when Gem::Specification, RemoteSpecification, LazySpecification, EndpointSpecification then search_by_spec(query)
      when String then specs_by_name(query)
      when Gem::Dependency then search_by_dependency(query)
      when Array then search_by_name_and_version(*query)
      else
        raise "You can't search for a #{query.inspect}."
      end
    end

    alias_method :[], :search

    def <<(spec)
      @specs[spec.name][spec.full_name] = spec
      spec
    end

    def each(&blk)
      return enum_for(:each) unless blk
      specs.values.each do |spec_sets|
        spec_sets.values.each(&blk)
      end
      sources.each {|s| s.each(&blk) }
      self
    end

    def spec_names
      names = specs.keys + sources.map(&:spec_names)
      names.uniq!
      names
    end

    def unmet_dependency_names
      dependency_names.select do |name|
        search(name).empty?
      end
    end

    def dependency_names
      names = []
      each do |spec|
        spec.dependencies.each do |dep|
          next if dep.type == :development
          names << dep.name
        end
      end
      names.uniq
    end

    def use(other, override_dupes = false)
      return unless other
      other.each do |s|
        if (dupes = search_by_spec(s)) && !dupes.empty?
          # safe to << since it's a new array when it has contents
          @all_specs[s.name] = dupes << s
          next unless override_dupes
        end
        self << s
      end
      self
    end

    def size
      @sources.inject(@specs.size) do |size, source|
        size += source.size
      end
    end

    # Whether all the specs in self are in other
    # TODO: rename to #include?
    def ==(other)
      all? do |spec|
        other_spec = other[spec].first
        other_spec && dependencies_eql?(spec, other_spec) && spec.source == other_spec.source
      end
    end

    def dependencies_eql?(spec, other_spec)
      deps       = spec.dependencies.select {|d| d.type != :development }
      other_deps = other_spec.dependencies.select {|d| d.type != :development }
      deps.sort == other_deps.sort
    end

    def add_source(index)
      raise ArgumentError, "Source must be an index, not #{index.class}" unless index.is_a?(Index)
      @sources << index
      @sources.uniq! # need to use uniq! here instead of checking for the item before adding
    end

    private

    def specs_by_name(name)
      @specs[name].values
    end

    def search_by_dependency(dependency)
      @cache[dependency] ||= begin
        specs = specs_by_name(dependency.name)
        found = specs.select do |spec|
          next true if spec.source.is_a?(Source::Gemspec)
          dependency.matches_spec?(spec)
        end

        found
      end
    end

    def search_by_name_and_version(name, version)
      specs_by_name(name).select {|spec| spec.version == version }
    end

    EMPTY_SEARCH = [].freeze

    def search_by_spec(spec)
      spec = @specs[spec.name][spec.full_name]
      spec ? [spec] : EMPTY_SEARCH
    end
  end
end
PK}$[x�7��.gems/gems/bundler-2.3.27/lib/bundler/worker.rbnu�[���# frozen_string_literal: true

module Bundler
  class Worker
    POISON = Object.new

    class WrappedException < StandardError
      attr_reader :exception
      def initialize(exn)
        @exception = exn
      end
    end

    # @return [String] the name of the worker
    attr_reader :name

    # Creates a worker pool of specified size
    #
    # @param size [Integer] Size of pool
    # @param name [String] name the name of the worker
    # @param func [Proc] job to run in inside the worker pool
    def initialize(size, name, func)
      @name = name
      @request_queue = Thread::Queue.new
      @response_queue = Thread::Queue.new
      @func = func
      @size = size
      @threads = nil
      @previous_interrupt_handler = nil
    end

    # Enqueue a request to be executed in the worker pool
    #
    # @param obj [String] mostly it is name of spec that should be downloaded
    def enq(obj)
      create_threads unless @threads
      @request_queue.enq obj
    end

    # Retrieves results of job function being executed in worker pool
    def deq
      result = @response_queue.deq
      raise result.exception if result.is_a?(WrappedException)
      result
    end

    def stop
      stop_threads
    end

    private

    def process_queue(i)
      loop do
        obj = @request_queue.deq
        break if obj.equal? POISON
        @response_queue.enq apply_func(obj, i)
      end
    end

    def apply_func(obj, i)
      @func.call(obj, i)
    rescue Exception => e # rubocop:disable Lint/RescueException
      WrappedException.new(e)
    end

    # Stop the worker threads by sending a poison object down the request queue
    # so as worker threads after retrieving it, shut themselves down
    def stop_threads
      return unless @threads

      @threads.each { @request_queue.enq POISON }
      @threads.each(&:join)

      remove_interrupt_handler

      @threads = nil
    end

    def abort_threads
      Bundler.ui.debug("\n#{caller.join("\n")}")
      @threads.each(&:exit)
      exit 1
    end

    def create_threads
      creation_errors = []

      @threads = Array.new(@size) do |i|
        begin
          Thread.start { process_queue(i) }.tap do |thread|
            thread.name = "#{name} Worker ##{i}" if thread.respond_to?(:name=)
          end
        rescue ThreadError => e
          creation_errors << e
          nil
        end
      end.compact

      add_interrupt_handler unless @threads.empty?

      return if creation_errors.empty?

      message = "Failed to create threads for the #{name} worker: #{creation_errors.map(&:to_s).uniq.join(", ")}"
      raise ThreadCreationError, message if @threads.empty?
      Bundler.ui.info message
    end

    def add_interrupt_handler
      @previous_interrupt_handler = trap("INT") { abort_threads }
    end

    def remove_interrupt_handler
      return unless @previous_interrupt_handler

      trap "INT", @previous_interrupt_handler
    end
  end
end
PK}$[h����2gems/gems/bundler-2.3.27/lib/bundler/deployment.rbnu�[���# frozen_string_literal: true

require_relative "shared_helpers"
Bundler::SharedHelpers.major_deprecation 2, "Bundler no longer integrates with " \
  "Capistrano, but Capistrano provides its own integration with " \
  "Bundler via the capistrano-bundler gem. Use it instead."

module Bundler
  class Deployment
    def self.define_task(context, task_method = :task, opts = {})
      if defined?(Capistrano) && context.is_a?(Capistrano::Configuration)
        context_name = "capistrano"
        role_default = "{:except => {:no_release => true}}"
        error_type = ::Capistrano::CommandError
      else
        context_name = "vlad"
        role_default = "[:app]"
        error_type = ::Rake::CommandFailedError
      end

      roles = context.fetch(:bundle_roles, false)
      opts[:roles] = roles if roles

      context.send :namespace, :bundle do
        send :desc, <<-DESC
          Install the current Bundler environment. By default, gems will be \
          installed to the shared/bundle path. Gems in the development and \
          test group will not be installed. The install command is executed \
          with the --deployment and --quiet flags. If the bundle cmd cannot \
          be found then you can override the bundle_cmd variable to specify \
          which one it should use. The base path to the app is fetched from \
          the :latest_release variable. Set it for custom deploy layouts.

          You can override any of these defaults by setting the variables shown below.

          N.B. bundle_roles must be defined before you require 'bundler/#{context_name}' \
          in your deploy.rb file.

            set :bundle_gemfile,  "Gemfile"
            set :bundle_dir,      File.join(fetch(:shared_path), 'bundle')
            set :bundle_flags,    "--deployment --quiet"
            set :bundle_without,  [:development, :test]
            set :bundle_with,     [:mysql]
            set :bundle_cmd,      "bundle" # e.g. "/opt/ruby/bin/bundle"
            set :bundle_roles,    #{role_default} # e.g. [:app, :batch]
        DESC
        send task_method, :install, opts do
          bundle_cmd     = context.fetch(:bundle_cmd, "bundle")
          bundle_flags   = context.fetch(:bundle_flags, "--deployment --quiet")
          bundle_dir     = context.fetch(:bundle_dir, File.join(context.fetch(:shared_path), "bundle"))
          bundle_gemfile = context.fetch(:bundle_gemfile, "Gemfile")
          bundle_without = [*context.fetch(:bundle_without, [:development, :test])].compact
          bundle_with    = [*context.fetch(:bundle_with, [])].compact
          app_path = context.fetch(:latest_release)
          if app_path.to_s.empty?
            raise error_type.new("Cannot detect current release path - make sure you have deployed at least once.")
          end
          args = ["--gemfile #{File.join(app_path, bundle_gemfile)}"]
          args << "--path #{bundle_dir}" unless bundle_dir.to_s.empty?
          args << bundle_flags.to_s
          args << "--without #{bundle_without.join(" ")}" unless bundle_without.empty?
          args << "--with #{bundle_with.join(" ")}" unless bundle_with.empty?

          run "cd #{app_path} && #{bundle_cmd} install #{args.join(" ")}"
        end
      end
    end
  end
end
PK}$[��288:gems/gems/bundler-2.3.27/lib/bundler/lazy_specification.rbnu�[���# frozen_string_literal: true

module Bundler
  class LazySpecification
    include MatchPlatform

    attr_reader :name, :version, :dependencies, :platform
    attr_accessor :source, :remote, :force_ruby_platform

    def initialize(name, version, platform, source = nil)
      @name          = name
      @version       = version
      @dependencies  = []
      @platform      = platform || Gem::Platform::RUBY
      @source        = source
    end

    def full_name
      if platform == Gem::Platform::RUBY
        "#{@name}-#{@version}"
      else
        "#{@name}-#{@version}-#{platform}"
      end
    end

    def ==(other)
      identifier == other.identifier
    end

    def eql?(other)
      identifier.eql?(other.identifier)
    end

    def hash
      identifier.hash
    end

    ##
    # Does this locked specification satisfy +dependency+?
    #
    # NOTE: Rubygems default requirement is ">= 0", which doesn't match
    # prereleases of 0 versions, like "0.0.0.dev" or "0.0.0.SNAPSHOT". However,
    # bundler users expect those to work. We need to make sure that Gemfile
    # dependencies without explicit requirements (which use ">= 0" under the
    # hood by default) are still valid for locked specs using this kind of
    # versions. The method implements an ad-hoc fix for that. A better solution
    # might be to change default rubygems requirement of dependencies to be ">=
    # 0.A" but that's a major refactoring likely to break things. Hopefully we
    # can attempt it in the future.
    #

    def satisfies?(dependency)
      effective_requirement = dependency.requirement == Gem::Requirement.default ? Gem::Requirement.new(">= 0.A") : dependency.requirement

      @name == dependency.name && effective_requirement.satisfied_by?(Gem::Version.new(@version))
    end

    def to_lock
      out = String.new

      if platform == Gem::Platform::RUBY
        out << "    #{name} (#{version})\n"
      else
        out << "    #{name} (#{version}-#{platform})\n"
      end

      dependencies.sort_by(&:to_s).uniq.each do |dep|
        next if dep.type == :development
        out << "    #{dep.to_lock}\n"
      end

      out
    end

    def materialize_for_installation
      source.local!

      matching_specs = source.specs.search(use_exact_resolved_specifications? ? self : [name, version])
      return self if matching_specs.empty?

      candidates = if use_exact_resolved_specifications?
        matching_specs
      else
        target_platform = ruby_platform_materializes_to_ruby_platform? ? platform : local_platform

        installable_candidates = GemHelpers.select_best_platform_match(matching_specs, target_platform)

        specification = __materialize__(installable_candidates, :fallback_to_non_installable => false)
        return specification unless specification.nil?

        if target_platform != platform
          installable_candidates = GemHelpers.select_best_platform_match(matching_specs, platform)
        end

        installable_candidates
      end

      __materialize__(candidates)
    end

    # If in frozen mode, we fallback to a non-installable candidate because by
    # doing this we avoid re-resolving and potentially end up changing the
    # lock file, which is not allowed. In that case, we will give a proper error
    # about the mismatch higher up the stack, right before trying to install the
    # bad gem.
    def __materialize__(candidates, fallback_to_non_installable: Bundler.frozen_bundle?)
      search = candidates.reverse.find do |spec|
        spec.is_a?(StubSpecification) ||
          (spec.matches_current_ruby? &&
           spec.matches_current_rubygems?)
      end
      if search.nil? && fallback_to_non_installable
        search = candidates.last
      else
        search.dependencies = dependencies if search && search.full_name == full_name && (search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification))
      end
      search
    end

    def to_s
      @__to_s ||= if platform == Gem::Platform::RUBY
        "#{name} (#{version})"
      else
        "#{name} (#{version}-#{platform})"
      end
    end

    def identifier
      @__identifier ||= [name, version, platform.to_s]
    end

    def git_version
      return unless source.is_a?(Bundler::Source::Git)
      " #{source.revision[0..6]}"
    end

    private

    def use_exact_resolved_specifications?
      @use_exact_resolved_specifications ||= !source.is_a?(Source::Path) && ruby_platform_materializes_to_ruby_platform?
    end

    #
    # For backwards compatibility with existing lockfiles, if the most specific
    # locked platform is not a specific platform like x86_64-linux or
    # universal-java-11, then we keep the previous behaviour of resolving the
    # best platform variant at materiliazation time. For previous bundler
    # versions (before 2.2.0) this was always the case (except when the lockfile
    # only included non-ruby platforms), but we're also keeping this behaviour
    # on newer bundlers unless users generate the lockfile from scratch or
    # explicitly add a more specific platform.
    #
    def ruby_platform_materializes_to_ruby_platform?
      generic_platform = generic_local_platform == Gem::Platform::JAVA ? Gem::Platform::JAVA : Gem::Platform::RUBY

      !Bundler.most_specific_locked_platform?(generic_platform) || force_ruby_platform || Bundler.settings[:force_ruby_platform]
    end
  end
end
PK}$[�Q���)�)4gems/gems/bundler-2.3.27/lib/bundler/rubygems_ext.rbnu�[���# frozen_string_literal: true

require "pathname"

require "rubygems/specification"

# We can't let `Gem::Source` be autoloaded in the `Gem::Specification#source`
# redefinition below, so we need to load it upfront. The reason is that if
# Bundler monkeypatches are loaded before RubyGems activates an executable (for
# example, through `ruby -rbundler -S irb`), gem activation might end up calling
# the redefined `Gem::Specification#source` and triggering the `Gem::Source`
# autoload. That would result in requiring "rubygems/source" inside another
# require, which would trigger a monitor error and cause the `autoload` to
# eventually fail. A better solution is probably to completely avoid autoloading
# `Gem::Source` from the redefined `Gem::Specification#source`.
require "rubygems/source"

require_relative "match_metadata"
require_relative "match_platform"

# Cherry-pick fixes to `Gem.ruby_version` to be useful for modern Bundler
# versions and ignore patchlevels
# (https://github.com/rubygems/rubygems/pull/5472,
# https://github.com/rubygems/rubygems/pull/5486). May be removed once RubyGems
# 3.3.12 support is dropped.
unless Gem.ruby_version.to_s == RUBY_VERSION || RUBY_PATCHLEVEL == -1
  Gem.instance_variable_set(:@ruby_version, Gem::Version.new(RUBY_VERSION))
end

module Gem
  class Specification
    include ::Bundler::MatchMetadata
    include ::Bundler::MatchPlatform

    attr_accessor :remote, :location, :relative_loaded_from

    remove_method :source
    attr_writer :source
    def source
      (defined?(@source) && @source) || Gem::Source::Installed.new
    end

    alias_method :rg_full_gem_path, :full_gem_path
    alias_method :rg_loaded_from,   :loaded_from

    def full_gem_path
      if source.respond_to?(:root)
        Pathname.new(loaded_from).dirname.expand_path(source.root).to_s.tap {|x| x.untaint if RUBY_VERSION < "2.7" }
      else
        rg_full_gem_path
      end
    end

    def loaded_from
      if relative_loaded_from
        source.path.join(relative_loaded_from).to_s
      else
        rg_loaded_from
      end
    end

    def load_paths
      full_require_paths
    end

    alias_method :rg_extension_dir, :extension_dir
    def extension_dir
      @bundler_extension_dir ||= if source.respond_to?(:extension_dir_name)
        unique_extension_dir = [source.extension_dir_name, File.basename(full_gem_path)].uniq.join("-")
        File.expand_path(File.join(extensions_dir, unique_extension_dir))
      else
        rg_extension_dir
      end
    end

    remove_method :gem_dir if instance_methods(false).include?(:gem_dir)
    def gem_dir
      full_gem_path
    end

    unless const_defined?(:LATEST_RUBY_WITHOUT_PATCH_VERSIONS)
      LATEST_RUBY_WITHOUT_PATCH_VERSIONS = Gem::Version.new("2.1")

      alias_method :rg_required_ruby_version=, :required_ruby_version=
      def required_ruby_version=(req)
        self.rg_required_ruby_version = req

        @required_ruby_version.requirements.map! do |op, v|
          if v >= LATEST_RUBY_WITHOUT_PATCH_VERSIONS && v.release.segments.size == 4
            [op == "~>" ? "=" : op, Gem::Version.new(v.segments.tap {|s| s.delete_at(3) }.join("."))]
          else
            [op, v]
          end
        end
      end
    end

    def groups
      @groups ||= []
    end

    def git_version
      return unless loaded_from && source.is_a?(Bundler::Source::Git)
      " #{source.revision[0..6]}"
    end

    def to_gemfile(path = nil)
      gemfile = String.new("source 'https://rubygems.org'\n")
      gemfile << dependencies_to_gemfile(nondevelopment_dependencies)
      unless development_dependencies.empty?
        gemfile << "\n"
        gemfile << dependencies_to_gemfile(development_dependencies, :development)
      end
      gemfile
    end

    # Backfill missing YAML require when not defined. Fixed since 3.1.0.pre1.
    module YamlBackfiller
      def to_yaml(opts = {})
        Gem.load_yaml unless defined?(::YAML)

        super(opts)
      end
    end

    prepend YamlBackfiller

    def nondevelopment_dependencies
      dependencies - development_dependencies
    end

    def deleted_gem?
      !default_gem? && !File.directory?(full_gem_path)
    end

    private

    def dependencies_to_gemfile(dependencies, group = nil)
      gemfile = String.new
      if dependencies.any?
        gemfile << "group :#{group} do\n" if group
        dependencies.each do |dependency|
          gemfile << "  " if group
          gemfile << %(gem "#{dependency.name}")
          req = dependency.requirements_list.first
          gemfile << %(, "#{req}") if req
          gemfile << "\n"
        end
        gemfile << "end\n" if group
      end
      gemfile
    end
  end

  class Dependency
    attr_accessor :source, :groups

    alias_method :eql?, :==

    def force_ruby_platform
      false
    end

    def encode_with(coder)
      to_yaml_properties.each do |ivar|
        coder[ivar.to_s.sub(/^@/, "")] = instance_variable_get(ivar)
      end
    end

    def to_yaml_properties
      instance_variables.reject {|p| ["@source", "@groups"].include?(p.to_s) }
    end

    def to_lock
      out = String.new("  #{name}")
      unless requirement.none?
        reqs = requirement.requirements.map {|o, v| "#{o} #{v}" }.sort.reverse
        out << " (#{reqs.join(", ")})"
      end
      out
    end
  end

  # comparison is done order independently since rubygems 3.2.0.rc.2
  unless Gem::Requirement.new("> 1", "< 2") == Gem::Requirement.new("< 2", "> 1")
    class Requirement
      module OrderIndependentComparison
        def ==(other)
          return unless Gem::Requirement === other

          if _requirements_sorted? && other._requirements_sorted?
            super
          else
            _with_sorted_requirements == other._with_sorted_requirements
          end
        end

        protected

        def _requirements_sorted?
          return @_are_requirements_sorted if defined?(@_are_requirements_sorted)
          strings = as_list
          @_are_requirements_sorted = strings == strings.sort
        end

        def _with_sorted_requirements
          @_with_sorted_requirements ||= _requirements_sorted? ? self : self.class.new(as_list.sort)
        end
      end

      prepend OrderIndependentComparison
    end
  end

  if Gem::Requirement.new("~> 2.0").hash == Gem::Requirement.new("~> 2.0.0").hash
    class Requirement
      module CorrectHashForLambdaOperator
        def hash
          if requirements.any? {|r| r.first == "~>" }
            requirements.map {|r| r.first == "~>" ? [r[0], r[1].to_s] : r }.sort.hash
          else
            super
          end
        end
      end

      prepend CorrectHashForLambdaOperator
    end
  end

  require "rubygems/platform"

  class Platform
    JAVA  = Gem::Platform.new("java")
    MSWIN = Gem::Platform.new("mswin32")
    MSWIN64 = Gem::Platform.new("mswin64")
    MINGW = Gem::Platform.new("x86-mingw32")
    X64_MINGW = [Gem::Platform.new("x64-mingw32"),
                 Gem::Platform.new("x64-mingw-ucrt")].freeze
    WINDOWS = [MSWIN, MSWIN64, MINGW, X64_MINGW].flatten.freeze
    X64_LINUX = Gem::Platform.new("x86_64-linux")
    X64_LINUX_MUSL = Gem::Platform.new("x86_64-linux-musl")

    if X64_LINUX === X64_LINUX_MUSL
      remove_method :===

      def ===(other)
        return nil unless Gem::Platform === other

        # universal-mingw32 matches x64-mingw-ucrt
        return true if (@cpu == "universal" || other.cpu == "universal") &&
                       @os.start_with?("mingw") && other.os.start_with?("mingw")

        # cpu
        ([nil,"universal"].include?(@cpu) || [nil, "universal"].include?(other.cpu) || @cpu == other.cpu ||
        (@cpu == "arm" && other.cpu.start_with?("arm"))) &&

          # os
          @os == other.os &&

          # version
          (
            (@os != "linux" && (@version.nil? || other.version.nil?)) ||
            (@os == "linux" && (normalized_linux_version_ext == other.normalized_linux_version_ext || ["musl#{@version}", "musleabi#{@version}", "musleabihf#{@version}"].include?(other.version))) ||
            @version == other.version
          )
      end

      # This is a copy of RubyGems 3.3.23 or higher `normalized_linux_method`.
      # Once only 3.3.23 is supported, we can use the method in RubyGems.
      def normalized_linux_version_ext
        return nil unless @version

        without_gnu_nor_abi_modifiers = @version.sub(/\Agnu/, "").sub(/eabi(hf)?\Z/, "")
        return nil if without_gnu_nor_abi_modifiers.empty?

        without_gnu_nor_abi_modifiers
      end
    end
  end

  Platform.singleton_class.module_eval do
    unless Platform.singleton_methods.include?(:match_spec?)
      def match_spec?(spec)
        match_gem?(spec.platform, spec.name)
      end

      def match_gem?(platform, gem_name)
        match_platforms?(platform, Gem.platforms)
      end
    end

    match_platforms_defined = Gem::Platform.respond_to?(:match_platforms?, true)

    if !match_platforms_defined || Gem::Platform.send(:match_platforms?, Gem::Platform::X64_LINUX_MUSL, [Gem::Platform::X64_LINUX])

      private

      remove_method :match_platforms? if match_platforms_defined

      def match_platforms?(platform, platforms)
        platforms.any? do |local_platform|
          platform.nil? ||
            local_platform == platform ||
            (local_platform != Gem::Platform::RUBY && platform =~ local_platform)
        end
      end
    end
  end

  # On universal Rubies, resolve the "universal" arch to the real CPU arch, without changing the extension directory.
  class Specification
    if /^universal\.(?<arch>.*?)-/ =~ (CROSS_COMPILING || RUBY_PLATFORM)
      local_platform = Platform.local
      if local_platform.cpu == "universal"
        ORIGINAL_LOCAL_PLATFORM = local_platform.to_s.freeze

        local_platform.cpu = if arch == "arm64e" # arm64e is only permitted for Apple system binaries
          "arm64"
        else
          arch
        end

        def extensions_dir
          Gem.default_ext_dir_for(base_dir) ||
            File.join(base_dir, "extensions", ORIGINAL_LOCAL_PLATFORM,
                      Gem.extension_api_version)
        end
      end
    end
  end

  require "rubygems/util"

  Util.singleton_class.module_eval do
    if Util.singleton_methods.include?(:glob_files_in_dir) # since 3.0.0.beta.2
      remove_method :glob_files_in_dir
    end

    def glob_files_in_dir(glob, base_path)
      if RUBY_VERSION >= "2.5"
        Dir.glob(glob, :base => base_path).map! {|f| File.expand_path(f, base_path) }
      else
        Dir.glob(File.join(base_path.to_s.gsub(/[\[\]]/, '\\\\\\&'), glob)).map! {|f| File.expand_path(f) }
      end
    end
  end
end
PK}$[ZP��((:gems/gems/bundler-2.3.27/lib/bundler/stub_specification.rbnu�[���# frozen_string_literal: true

module Bundler
  class StubSpecification < RemoteSpecification
    def self.from_stub(stub)
      return stub if stub.is_a?(Bundler::StubSpecification)
      spec = new(stub.name, stub.version, stub.platform, nil)
      spec.stub = stub
      spec
    end

    attr_accessor :stub, :ignored

    def source=(source)
      super
      # Stub has no concept of source, which means that extension_dir may be wrong
      # This is the case for git-based gems. So, instead manually assign the extension dir
      return unless source.respond_to?(:extension_dir_name)
      path = File.join(stub.extensions_dir, source.extension_dir_name)
      stub.extension_dir = File.expand_path(path)
    end

    def to_yaml
      _remote_specification.to_yaml
    end

    # @!group Stub Delegates

    def manually_installed?
      # This is for manually installed gems which are gems that were fixed in place after a
      # failed installation. Once the issue was resolved, the user then manually created
      # the gem specification using the instructions provided by `gem help install`
      installed_by_version == Gem::Version.new(0)
    end

    # This is defined directly to avoid having to loading the full spec
    def missing_extensions?
      return false if default_gem?
      return false if extensions.empty?
      return false if File.exist? gem_build_complete_path
      return false if manually_installed?

      true
    end

    def activated
      stub.activated
    end

    def activated=(activated)
      stub.instance_variable_set(:@activated, activated)
    end

    def extensions
      stub.extensions
    end

    def gem_build_complete_path
      File.join(extension_dir, "gem.build_complete")
    end

    def default_gem?
      stub.default_gem?
    end

    def full_gem_path
      stub.full_gem_path
    end

    def full_gem_path=(path)
      stub.full_gem_path = path
    end

    def full_require_paths
      stub.full_require_paths
    end

    def load_paths
      full_require_paths
    end

    def loaded_from
      stub.loaded_from
    end

    def matches_for_glob(glob)
      stub.matches_for_glob(glob)
    end

    def raw_require_paths
      stub.raw_require_paths
    end

    private

    def _remote_specification
      @_remote_specification ||= begin
        rs = stub.to_spec
        if rs.equal?(self) # happens when to_spec gets the spec from Gem.loaded_specs
          rs = Gem::Specification.load(loaded_from)
          Bundler.rubygems.stub_set_spec(stub, rs)
        end

        unless rs
          raise GemspecError, "The gemspec for #{full_name} at #{loaded_from}" \
            " was missing or broken. Try running `gem pristine #{name} -v #{version}`" \
            " to fix the cached spec."
        end

        rs.source = source

        rs
      end
    end
  end
end
PK}$[���__=gems/gems/bundler-2.3.27/lib/bundler/match_remote_metadata.rbnu�[���# frozen_string_literal: true

module Bundler
  module FetchMetadata
    # A fallback is included because the original version of the specification
    # API didn't include that field, so some marshalled specs in the index have it
    # set to +nil+.
    def matches_current_ruby?
      @required_ruby_version ||= _remote_specification.required_ruby_version || Gem::Requirement.default

      super
    end

    def matches_current_rubygems?
      # A fallback is included because the original version of the specification
      # API didn't include that field, so some marshalled specs in the index have it
      # set to +nil+.
      @required_rubygems_version ||= _remote_specification.required_rubygems_version || Gem::Requirement.default

      super
    end
  end

  module MatchRemoteMetadata
    include MatchMetadata

    prepend FetchMetadata
  end
end
PK}$[���t/�/�Fgems/gems/bundler-2.3.27/lib/bundler/vendor/fileutils/lib/fileutils.rbnu�[���# frozen_string_literal: true

begin
  require 'rbconfig'
rescue LoadError
  # for make mjit-headers
end

#
# = fileutils.rb
#
# Copyright (c) 2000-2007 Minero Aoki
#
# This program is free software.
# You can distribute/modify this program under the same terms of ruby.
#
# == module Bundler::FileUtils
#
# Namespace for several file utility methods for copying, moving, removing, etc.
#
# === Module Functions
#
#   require 'bundler/vendor/fileutils/lib/fileutils'
#
#   Bundler::FileUtils.cd(dir, **options)
#   Bundler::FileUtils.cd(dir, **options) {|dir| block }
#   Bundler::FileUtils.pwd()
#   Bundler::FileUtils.mkdir(dir, **options)
#   Bundler::FileUtils.mkdir(list, **options)
#   Bundler::FileUtils.mkdir_p(dir, **options)
#   Bundler::FileUtils.mkdir_p(list, **options)
#   Bundler::FileUtils.rmdir(dir, **options)
#   Bundler::FileUtils.rmdir(list, **options)
#   Bundler::FileUtils.ln(target, link, **options)
#   Bundler::FileUtils.ln(targets, dir, **options)
#   Bundler::FileUtils.ln_s(target, link, **options)
#   Bundler::FileUtils.ln_s(targets, dir, **options)
#   Bundler::FileUtils.ln_sf(target, link, **options)
#   Bundler::FileUtils.cp(src, dest, **options)
#   Bundler::FileUtils.cp(list, dir, **options)
#   Bundler::FileUtils.cp_r(src, dest, **options)
#   Bundler::FileUtils.cp_r(list, dir, **options)
#   Bundler::FileUtils.mv(src, dest, **options)
#   Bundler::FileUtils.mv(list, dir, **options)
#   Bundler::FileUtils.rm(list, **options)
#   Bundler::FileUtils.rm_r(list, **options)
#   Bundler::FileUtils.rm_rf(list, **options)
#   Bundler::FileUtils.install(src, dest, **options)
#   Bundler::FileUtils.chmod(mode, list, **options)
#   Bundler::FileUtils.chmod_R(mode, list, **options)
#   Bundler::FileUtils.chown(user, group, list, **options)
#   Bundler::FileUtils.chown_R(user, group, list, **options)
#   Bundler::FileUtils.touch(list, **options)
#
# Possible <tt>options</tt> are:
#
# <tt>:force</tt> :: forced operation (rewrite files if exist, remove
#                    directories if not empty, etc.);
# <tt>:verbose</tt> :: print command to be run, in bash syntax, before
#                      performing it;
# <tt>:preserve</tt> :: preserve object's group, user and modification
#                       time on copying;
# <tt>:noop</tt> :: no changes are made (usable in combination with
#                   <tt>:verbose</tt> which will print the command to run)
#
# Each method documents the options that it honours. See also ::commands,
# ::options and ::options_of methods to introspect which command have which
# options.
#
# All methods that have the concept of a "source" file or directory can take
# either one file or a list of files in that argument.  See the method
# documentation for examples.
#
# There are some `low level' methods, which do not accept keyword arguments:
#
#   Bundler::FileUtils.copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false)
#   Bundler::FileUtils.copy_file(src, dest, preserve = false, dereference = true)
#   Bundler::FileUtils.copy_stream(srcstream, deststream)
#   Bundler::FileUtils.remove_entry(path, force = false)
#   Bundler::FileUtils.remove_entry_secure(path, force = false)
#   Bundler::FileUtils.remove_file(path, force = false)
#   Bundler::FileUtils.compare_file(path_a, path_b)
#   Bundler::FileUtils.compare_stream(stream_a, stream_b)
#   Bundler::FileUtils.uptodate?(file, cmp_list)
#
# == module Bundler::FileUtils::Verbose
#
# This module has all methods of Bundler::FileUtils module, but it outputs messages
# before acting.  This equates to passing the <tt>:verbose</tt> flag to methods
# in Bundler::FileUtils.
#
# == module Bundler::FileUtils::NoWrite
#
# This module has all methods of Bundler::FileUtils module, but never changes
# files/directories.  This equates to passing the <tt>:noop</tt> flag to methods
# in Bundler::FileUtils.
#
# == module Bundler::FileUtils::DryRun
#
# This module has all methods of Bundler::FileUtils module, but never changes
# files/directories.  This equates to passing the <tt>:noop</tt> and
# <tt>:verbose</tt> flags to methods in Bundler::FileUtils.
#
module Bundler::FileUtils
  VERSION = "1.4.1"

  def self.private_module_function(name)   #:nodoc:
    module_function name
    private_class_method name
  end

  #
  # Returns the name of the current directory.
  #
  def pwd
    Dir.pwd
  end
  module_function :pwd

  alias getwd pwd
  module_function :getwd

  #
  # Changes the current directory to the directory +dir+.
  #
  # If this method is called with block, resumes to the previous
  # working directory after the block execution has finished.
  #
  #   Bundler::FileUtils.cd('/')  # change directory
  #
  #   Bundler::FileUtils.cd('/', verbose: true)   # change directory and report it
  #
  #   Bundler::FileUtils.cd('/') do  # change directory
  #     # ...               # do something
  #   end                   # return to original directory
  #
  def cd(dir, verbose: nil, &block) # :yield: dir
    fu_output_message "cd #{dir}" if verbose
    result = Dir.chdir(dir, &block)
    fu_output_message 'cd -' if verbose and block
    result
  end
  module_function :cd

  alias chdir cd
  module_function :chdir

  #
  # Returns true if +new+ is newer than all +old_list+.
  # Non-existent files are older than any file.
  #
  #   Bundler::FileUtils.uptodate?('hello.o', %w(hello.c hello.h)) or \
  #       system 'make hello.o'
  #
  def uptodate?(new, old_list)
    return false unless File.exist?(new)
    new_time = File.mtime(new)
    old_list.each do |old|
      if File.exist?(old)
        return false unless new_time > File.mtime(old)
      end
    end
    true
  end
  module_function :uptodate?

  def remove_trailing_slash(dir)   #:nodoc:
    dir == '/' ? dir : dir.chomp(?/)
  end
  private_module_function :remove_trailing_slash

  #
  # Creates one or more directories.
  #
  #   Bundler::FileUtils.mkdir 'test'
  #   Bundler::FileUtils.mkdir %w(tmp data)
  #   Bundler::FileUtils.mkdir 'notexist', noop: true  # Does not really create.
  #   Bundler::FileUtils.mkdir 'tmp', mode: 0700
  #
  def mkdir(list, mode: nil, noop: nil, verbose: nil)
    list = fu_list(list)
    fu_output_message "mkdir #{mode ? ('-m %03o ' % mode) : ''}#{list.join ' '}" if verbose
    return if noop

    list.each do |dir|
      fu_mkdir dir, mode
    end
  end
  module_function :mkdir

  #
  # Creates a directory and all its parent directories.
  # For example,
  #
  #   Bundler::FileUtils.mkdir_p '/usr/local/lib/ruby'
  #
  # causes to make following directories, if they do not exist.
  #
  # * /usr
  # * /usr/local
  # * /usr/local/lib
  # * /usr/local/lib/ruby
  #
  # You can pass several directories at a time in a list.
  #
  def mkdir_p(list, mode: nil, noop: nil, verbose: nil)
    list = fu_list(list)
    fu_output_message "mkdir -p #{mode ? ('-m %03o ' % mode) : ''}#{list.join ' '}" if verbose
    return *list if noop

    list.map {|path| remove_trailing_slash(path)}.each do |path|
      # optimize for the most common case
      begin
        fu_mkdir path, mode
        next
      rescue SystemCallError
        next if File.directory?(path)
      end

      stack = []
      until path == stack.last   # dirname("/")=="/", dirname("C:/")=="C:/"
        stack.push path
        path = File.dirname(path)
      end
      stack.pop                 # root directory should exist
      stack.reverse_each do |dir|
        begin
          fu_mkdir dir, mode
        rescue SystemCallError
          raise unless File.directory?(dir)
        end
      end
    end

    return *list
  end
  module_function :mkdir_p

  alias mkpath    mkdir_p
  alias makedirs  mkdir_p
  module_function :mkpath
  module_function :makedirs

  def fu_mkdir(path, mode)   #:nodoc:
    path = remove_trailing_slash(path)
    if mode
      Dir.mkdir path, mode
      File.chmod mode, path
    else
      Dir.mkdir path
    end
  end
  private_module_function :fu_mkdir

  #
  # Removes one or more directories.
  #
  #   Bundler::FileUtils.rmdir 'somedir'
  #   Bundler::FileUtils.rmdir %w(somedir anydir otherdir)
  #   # Does not really remove directory; outputs message.
  #   Bundler::FileUtils.rmdir 'somedir', verbose: true, noop: true
  #
  def rmdir(list, parents: nil, noop: nil, verbose: nil)
    list = fu_list(list)
    fu_output_message "rmdir #{parents ? '-p ' : ''}#{list.join ' '}" if verbose
    return if noop
    list.each do |dir|
      Dir.rmdir(dir = remove_trailing_slash(dir))
      if parents
        begin
          until (parent = File.dirname(dir)) == '.' or parent == dir
            dir = parent
            Dir.rmdir(dir)
          end
        rescue Errno::ENOTEMPTY, Errno::EEXIST, Errno::ENOENT
        end
      end
    end
  end
  module_function :rmdir

  #
  # :call-seq:
  #   Bundler::FileUtils.ln(target, link, force: nil, noop: nil, verbose: nil)
  #   Bundler::FileUtils.ln(target,  dir, force: nil, noop: nil, verbose: nil)
  #   Bundler::FileUtils.ln(targets, dir, force: nil, noop: nil, verbose: nil)
  #
  # In the first form, creates a hard link +link+ which points to +target+.
  # If +link+ already exists, raises Errno::EEXIST.
  # But if the +force+ option is set, overwrites +link+.
  #
  #   Bundler::FileUtils.ln 'gcc', 'cc', verbose: true
  #   Bundler::FileUtils.ln '/usr/bin/emacs21', '/usr/bin/emacs'
  #
  # In the second form, creates a link +dir/target+ pointing to +target+.
  # In the third form, creates several hard links in the directory +dir+,
  # pointing to each item in +targets+.
  # If +dir+ is not a directory, raises Errno::ENOTDIR.
  #
  #   Bundler::FileUtils.cd '/sbin'
  #   Bundler::FileUtils.ln %w(cp mv mkdir), '/bin'   # Now /sbin/cp and /bin/cp are linked.
  #
  def ln(src, dest, force: nil, noop: nil, verbose: nil)
    fu_output_message "ln#{force ? ' -f' : ''} #{[src,dest].flatten.join ' '}" if verbose
    return if noop
    fu_each_src_dest0(src, dest) do |s,d|
      remove_file d, true if force
      File.link s, d
    end
  end
  module_function :ln

  alias link ln
  module_function :link

  #
  # Hard link +src+ to +dest+. If +src+ is a directory, this method links
  # all its contents recursively. If +dest+ is a directory, links
  # +src+ to +dest/src+.
  #
  # +src+ can be a list of files.
  #
  # If +dereference_root+ is true, this method dereference tree root.
  #
  # If +remove_destination+ is true, this method removes each destination file before copy.
  #
  #   Bundler::FileUtils.rm_r site_ruby + '/mylib', force: true
  #   Bundler::FileUtils.cp_lr 'lib/', site_ruby + '/mylib'
  #
  #   # Examples of linking several files to target directory.
  #   Bundler::FileUtils.cp_lr %w(mail.rb field.rb debug/), site_ruby + '/tmail'
  #   Bundler::FileUtils.cp_lr Dir.glob('*.rb'), '/home/aamine/lib/ruby', noop: true, verbose: true
  #
  #   # If you want to link all contents of a directory instead of the
  #   # directory itself, c.f. src/x -> dest/x, src/y -> dest/y,
  #   # use the following code.
  #   Bundler::FileUtils.cp_lr 'src/.', 'dest'  # cp_lr('src', 'dest') makes dest/src, but this doesn't.
  #
  def cp_lr(src, dest, noop: nil, verbose: nil,
            dereference_root: true, remove_destination: false)
    fu_output_message "cp -lr#{remove_destination ? ' --remove-destination' : ''} #{[src,dest].flatten.join ' '}" if verbose
    return if noop
    fu_each_src_dest(src, dest) do |s, d|
      link_entry s, d, dereference_root, remove_destination
    end
  end
  module_function :cp_lr

  #
  # :call-seq:
  #   Bundler::FileUtils.ln_s(target, link, force: nil, noop: nil, verbose: nil)
  #   Bundler::FileUtils.ln_s(target,  dir, force: nil, noop: nil, verbose: nil)
  #   Bundler::FileUtils.ln_s(targets, dir, force: nil, noop: nil, verbose: nil)
  #
  # In the first form, creates a symbolic link +link+ which points to +target+.
  # If +link+ already exists, raises Errno::EEXIST.
  # But if the <tt>force</tt> option is set, overwrites +link+.
  #
  #   Bundler::FileUtils.ln_s '/usr/bin/ruby', '/usr/local/bin/ruby'
  #   Bundler::FileUtils.ln_s 'verylongsourcefilename.c', 'c', force: true
  #
  # In the second form, creates a link +dir/target+ pointing to +target+.
  # In the third form, creates several symbolic links in the directory +dir+,
  # pointing to each item in +targets+.
  # If +dir+ is not a directory, raises Errno::ENOTDIR.
  #
  #   Bundler::FileUtils.ln_s Dir.glob('/bin/*.rb'), '/home/foo/bin'
  #
  def ln_s(src, dest, force: nil, noop: nil, verbose: nil)
    fu_output_message "ln -s#{force ? 'f' : ''} #{[src,dest].flatten.join ' '}" if verbose
    return if noop
    fu_each_src_dest0(src, dest) do |s,d|
      remove_file d, true if force
      File.symlink s, d
    end
  end
  module_function :ln_s

  alias symlink ln_s
  module_function :symlink

  #
  # :call-seq:
  #   Bundler::FileUtils.ln_sf(*args)
  #
  # Same as
  #
  #   Bundler::FileUtils.ln_s(*args, force: true)
  #
  def ln_sf(src, dest, noop: nil, verbose: nil)
    ln_s src, dest, force: true, noop: noop, verbose: verbose
  end
  module_function :ln_sf

  #
  # Hard links a file system entry +src+ to +dest+.
  # If +src+ is a directory, this method links its contents recursively.
  #
  # Both of +src+ and +dest+ must be a path name.
  # +src+ must exist, +dest+ must not exist.
  #
  # If +dereference_root+ is true, this method dereferences the tree root.
  #
  # If +remove_destination+ is true, this method removes each destination file before copy.
  #
  def link_entry(src, dest, dereference_root = false, remove_destination = false)
    Entry_.new(src, nil, dereference_root).traverse do |ent|
      destent = Entry_.new(dest, ent.rel, false)
      File.unlink destent.path if remove_destination && File.file?(destent.path)
      ent.link destent.path
    end
  end
  module_function :link_entry

  #
  # Copies a file content +src+ to +dest+.  If +dest+ is a directory,
  # copies +src+ to +dest/src+.
  #
  # If +src+ is a list of files, then +dest+ must be a directory.
  #
  #   Bundler::FileUtils.cp 'eval.c', 'eval.c.org'
  #   Bundler::FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'
  #   Bundler::FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6', verbose: true
  #   Bundler::FileUtils.cp 'symlink', 'dest'   # copy content, "dest" is not a symlink
  #
  def cp(src, dest, preserve: nil, noop: nil, verbose: nil)
    fu_output_message "cp#{preserve ? ' -p' : ''} #{[src,dest].flatten.join ' '}" if verbose
    return if noop
    fu_each_src_dest(src, dest) do |s, d|
      copy_file s, d, preserve
    end
  end
  module_function :cp

  alias copy cp
  module_function :copy

  #
  # Copies +src+ to +dest+. If +src+ is a directory, this method copies
  # all its contents recursively. If +dest+ is a directory, copies
  # +src+ to +dest/src+.
  #
  # +src+ can be a list of files.
  #
  # If +dereference_root+ is true, this method dereference tree root.
  #
  # If +remove_destination+ is true, this method removes each destination file before copy.
  #
  #   # Installing Ruby library "mylib" under the site_ruby
  #   Bundler::FileUtils.rm_r site_ruby + '/mylib', force: true
  #   Bundler::FileUtils.cp_r 'lib/', site_ruby + '/mylib'
  #
  #   # Examples of copying several files to target directory.
  #   Bundler::FileUtils.cp_r %w(mail.rb field.rb debug/), site_ruby + '/tmail'
  #   Bundler::FileUtils.cp_r Dir.glob('*.rb'), '/home/foo/lib/ruby', noop: true, verbose: true
  #
  #   # If you want to copy all contents of a directory instead of the
  #   # directory itself, c.f. src/x -> dest/x, src/y -> dest/y,
  #   # use following code.
  #   Bundler::FileUtils.cp_r 'src/.', 'dest'     # cp_r('src', 'dest') makes dest/src,
  #                                      # but this doesn't.
  #
  def cp_r(src, dest, preserve: nil, noop: nil, verbose: nil,
           dereference_root: true, remove_destination: nil)
    fu_output_message "cp -r#{preserve ? 'p' : ''}#{remove_destination ? ' --remove-destination' : ''} #{[src,dest].flatten.join ' '}" if verbose
    return if noop
    fu_each_src_dest(src, dest) do |s, d|
      copy_entry s, d, preserve, dereference_root, remove_destination
    end
  end
  module_function :cp_r

  #
  # Copies a file system entry +src+ to +dest+.
  # If +src+ is a directory, this method copies its contents recursively.
  # This method preserves file types, c.f. symlink, directory...
  # (FIFO, device files and etc. are not supported yet)
  #
  # Both of +src+ and +dest+ must be a path name.
  # +src+ must exist, +dest+ must not exist.
  #
  # If +preserve+ is true, this method preserves owner, group, and
  # modified time.  Permissions are copied regardless +preserve+.
  #
  # If +dereference_root+ is true, this method dereference tree root.
  #
  # If +remove_destination+ is true, this method removes each destination file before copy.
  #
  def copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false)
    if dereference_root
      src = File.realpath(src)
    end

    Entry_.new(src, nil, false).wrap_traverse(proc do |ent|
      destent = Entry_.new(dest, ent.rel, false)
      File.unlink destent.path if remove_destination && (File.file?(destent.path) || File.symlink?(destent.path))
      ent.copy destent.path
    end, proc do |ent|
      destent = Entry_.new(dest, ent.rel, false)
      ent.copy_metadata destent.path if preserve
    end)
  end
  module_function :copy_entry

  #
  # Copies file contents of +src+ to +dest+.
  # Both of +src+ and +dest+ must be a path name.
  #
  def copy_file(src, dest, preserve = false, dereference = true)
    ent = Entry_.new(src, nil, dereference)
    ent.copy_file dest
    ent.copy_metadata dest if preserve
  end
  module_function :copy_file

  #
  # Copies stream +src+ to +dest+.
  # +src+ must respond to #read(n) and
  # +dest+ must respond to #write(str).
  #
  def copy_stream(src, dest)
    IO.copy_stream(src, dest)
  end
  module_function :copy_stream

  #
  # Moves file(s) +src+ to +dest+.  If +file+ and +dest+ exist on the different
  # disk partition, the file is copied then the original file is removed.
  #
  #   Bundler::FileUtils.mv 'badname.rb', 'goodname.rb'
  #   Bundler::FileUtils.mv 'stuff.rb', '/notexist/lib/ruby', force: true  # no error
  #
  #   Bundler::FileUtils.mv %w(junk.txt dust.txt), '/home/foo/.trash/'
  #   Bundler::FileUtils.mv Dir.glob('test*.rb'), 'test', noop: true, verbose: true
  #
  def mv(src, dest, force: nil, noop: nil, verbose: nil, secure: nil)
    fu_output_message "mv#{force ? ' -f' : ''} #{[src,dest].flatten.join ' '}" if verbose
    return if noop
    fu_each_src_dest(src, dest) do |s, d|
      destent = Entry_.new(d, nil, true)
      begin
        if destent.exist?
          if destent.directory?
            raise Errno::EEXIST, d
          end
        end
        begin
          File.rename s, d
        rescue Errno::EXDEV,
               Errno::EPERM # move from unencrypted to encrypted dir (ext4)
          copy_entry s, d, true
          if secure
            remove_entry_secure s, force
          else
            remove_entry s, force
          end
        end
      rescue SystemCallError
        raise unless force
      end
    end
  end
  module_function :mv

  alias move mv
  module_function :move

  #
  # Remove file(s) specified in +list+.  This method cannot remove directories.
  # All StandardErrors are ignored when the :force option is set.
  #
  #   Bundler::FileUtils.rm %w( junk.txt dust.txt )
  #   Bundler::FileUtils.rm Dir.glob('*.so')
  #   Bundler::FileUtils.rm 'NotExistFile', force: true   # never raises exception
  #
  def rm(list, force: nil, noop: nil, verbose: nil)
    list = fu_list(list)
    fu_output_message "rm#{force ? ' -f' : ''} #{list.join ' '}" if verbose
    return if noop

    list.each do |path|
      remove_file path, force
    end
  end
  module_function :rm

  alias remove rm
  module_function :remove

  #
  # Equivalent to
  #
  #   Bundler::FileUtils.rm(list, force: true)
  #
  def rm_f(list, noop: nil, verbose: nil)
    rm list, force: true, noop: noop, verbose: verbose
  end
  module_function :rm_f

  alias safe_unlink rm_f
  module_function :safe_unlink

  #
  # remove files +list+[0] +list+[1]... If +list+[n] is a directory,
  # removes its all contents recursively. This method ignores
  # StandardError when :force option is set.
  #
  #   Bundler::FileUtils.rm_r Dir.glob('/tmp/*')
  #   Bundler::FileUtils.rm_r 'some_dir', force: true
  #
  # WARNING: This method causes local vulnerability
  # if one of parent directories or removing directory tree are world
  # writable (including /tmp, whose permission is 1777), and the current
  # process has strong privilege such as Unix super user (root), and the
  # system has symbolic link.  For secure removing, read the documentation
  # of remove_entry_secure carefully, and set :secure option to true.
  # Default is <tt>secure: false</tt>.
  #
  # NOTE: This method calls remove_entry_secure if :secure option is set.
  # See also remove_entry_secure.
  #
  def rm_r(list, force: nil, noop: nil, verbose: nil, secure: nil)
    list = fu_list(list)
    fu_output_message "rm -r#{force ? 'f' : ''} #{list.join ' '}" if verbose
    return if noop
    list.each do |path|
      if secure
        remove_entry_secure path, force
      else
        remove_entry path, force
      end
    end
  end
  module_function :rm_r

  #
  # Equivalent to
  #
  #   Bundler::FileUtils.rm_r(list, force: true)
  #
  # WARNING: This method causes local vulnerability.
  # Read the documentation of rm_r first.
  #
  def rm_rf(list, noop: nil, verbose: nil, secure: nil)
    rm_r list, force: true, noop: noop, verbose: verbose, secure: secure
  end
  module_function :rm_rf

  alias rmtree rm_rf
  module_function :rmtree

  #
  # This method removes a file system entry +path+.  +path+ shall be a
  # regular file, a directory, or something.  If +path+ is a directory,
  # remove it recursively.  This method is required to avoid TOCTTOU
  # (time-of-check-to-time-of-use) local security vulnerability of rm_r.
  # #rm_r causes security hole when:
  #
  # * Parent directory is world writable (including /tmp).
  # * Removing directory tree includes world writable directory.
  # * The system has symbolic link.
  #
  # To avoid this security hole, this method applies special preprocess.
  # If +path+ is a directory, this method chown(2) and chmod(2) all
  # removing directories.  This requires the current process is the
  # owner of the removing whole directory tree, or is the super user (root).
  #
  # WARNING: You must ensure that *ALL* parent directories cannot be
  # moved by other untrusted users.  For example, parent directories
  # should not be owned by untrusted users, and should not be world
  # writable except when the sticky bit set.
  #
  # WARNING: Only the owner of the removing directory tree, or Unix super
  # user (root) should invoke this method.  Otherwise this method does not
  # work.
  #
  # For details of this security vulnerability, see Perl's case:
  #
  # * https://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2005-0448
  # * https://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2004-0452
  #
  # For fileutils.rb, this vulnerability is reported in [ruby-dev:26100].
  #
  def remove_entry_secure(path, force = false)
    unless fu_have_symlink?
      remove_entry path, force
      return
    end
    fullpath = File.expand_path(path)
    st = File.lstat(fullpath)
    unless st.directory?
      File.unlink fullpath
      return
    end
    # is a directory.
    parent_st = File.stat(File.dirname(fullpath))
    unless parent_st.world_writable?
      remove_entry path, force
      return
    end
    unless parent_st.sticky?
      raise ArgumentError, "parent directory is world writable, Bundler::FileUtils#remove_entry_secure does not work; abort: #{path.inspect} (parent directory mode #{'%o' % parent_st.mode})"
    end

    # freeze tree root
    euid = Process.euid
    dot_file = fullpath + "/."
    begin
      File.open(dot_file) {|f|
        unless fu_stat_identical_entry?(st, f.stat)
          # symlink (TOC-to-TOU attack?)
          File.unlink fullpath
          return
        end
        f.chown euid, -1
        f.chmod 0700
      }
    rescue Errno::EISDIR # JRuby in non-native mode can't open files as dirs
      File.lstat(dot_file).tap {|fstat|
        unless fu_stat_identical_entry?(st, fstat)
          # symlink (TOC-to-TOU attack?)
          File.unlink fullpath
          return
        end
        File.chown euid, -1, dot_file
        File.chmod 0700, dot_file
      }
    end

    unless fu_stat_identical_entry?(st, File.lstat(fullpath))
      # TOC-to-TOU attack?
      File.unlink fullpath
      return
    end

    # ---- tree root is frozen ----
    root = Entry_.new(path)
    root.preorder_traverse do |ent|
      if ent.directory?
        ent.chown euid, -1
        ent.chmod 0700
      end
    end
    root.postorder_traverse do |ent|
      begin
        ent.remove
      rescue
        raise unless force
      end
    end
  rescue
    raise unless force
  end
  module_function :remove_entry_secure

  def fu_have_symlink?   #:nodoc:
    File.symlink nil, nil
  rescue NotImplementedError
    return false
  rescue TypeError
    return true
  end
  private_module_function :fu_have_symlink?

  def fu_stat_identical_entry?(a, b)   #:nodoc:
    a.dev == b.dev and a.ino == b.ino
  end
  private_module_function :fu_stat_identical_entry?

  #
  # This method removes a file system entry +path+.
  # +path+ might be a regular file, a directory, or something.
  # If +path+ is a directory, remove it recursively.
  #
  # See also remove_entry_secure.
  #
  def remove_entry(path, force = false)
    Entry_.new(path).postorder_traverse do |ent|
      begin
        ent.remove
      rescue
        raise unless force
      end
    end
  rescue
    raise unless force
  end
  module_function :remove_entry

  #
  # Removes a file +path+.
  # This method ignores StandardError if +force+ is true.
  #
  def remove_file(path, force = false)
    Entry_.new(path).remove_file
  rescue
    raise unless force
  end
  module_function :remove_file

  #
  # Removes a directory +dir+ and its contents recursively.
  # This method ignores StandardError if +force+ is true.
  #
  def remove_dir(path, force = false)
    remove_entry path, force   # FIXME?? check if it is a directory
  end
  module_function :remove_dir

  #
  # Returns true if the contents of a file +a+ and a file +b+ are identical.
  #
  #   Bundler::FileUtils.compare_file('somefile', 'somefile')       #=> true
  #   Bundler::FileUtils.compare_file('/dev/null', '/dev/urandom')  #=> false
  #
  def compare_file(a, b)
    return false unless File.size(a) == File.size(b)
    File.open(a, 'rb') {|fa|
      File.open(b, 'rb') {|fb|
        return compare_stream(fa, fb)
      }
    }
  end
  module_function :compare_file

  alias identical? compare_file
  alias cmp compare_file
  module_function :identical?
  module_function :cmp

  #
  # Returns true if the contents of a stream +a+ and +b+ are identical.
  #
  def compare_stream(a, b)
    bsize = fu_stream_blksize(a, b)

    if RUBY_VERSION > "2.4"
      sa = String.new(capacity: bsize)
      sb = String.new(capacity: bsize)
    else
      sa = String.new
      sb = String.new
    end

    begin
      a.read(bsize, sa)
      b.read(bsize, sb)
      return true if sa.empty? && sb.empty?
    end while sa == sb
    false
  end
  module_function :compare_stream

  #
  # If +src+ is not same as +dest+, copies it and changes the permission
  # mode to +mode+.  If +dest+ is a directory, destination is +dest+/+src+.
  # This method removes destination before copy.
  #
  #   Bundler::FileUtils.install 'ruby', '/usr/local/bin/ruby', mode: 0755, verbose: true
  #   Bundler::FileUtils.install 'lib.rb', '/usr/local/lib/ruby/site_ruby', verbose: true
  #
  def install(src, dest, mode: nil, owner: nil, group: nil, preserve: nil,
              noop: nil, verbose: nil)
    if verbose
      msg = +"install -c"
      msg << ' -p' if preserve
      msg << ' -m ' << mode_to_s(mode) if mode
      msg << " -o #{owner}" if owner
      msg << " -g #{group}" if group
      msg << ' ' << [src,dest].flatten.join(' ')
      fu_output_message msg
    end
    return if noop
    uid = fu_get_uid(owner)
    gid = fu_get_gid(group)
    fu_each_src_dest(src, dest) do |s, d|
      st = File.stat(s)
      unless File.exist?(d) and compare_file(s, d)
        remove_file d, true
        copy_file s, d
        File.utime st.atime, st.mtime, d if preserve
        File.chmod fu_mode(mode, st), d if mode
        File.chown uid, gid, d if uid or gid
      end
    end
  end
  module_function :install

  def user_mask(target)  #:nodoc:
    target.each_char.inject(0) do |mask, chr|
      case chr
      when "u"
        mask | 04700
      when "g"
        mask | 02070
      when "o"
        mask | 01007
      when "a"
        mask | 07777
      else
        raise ArgumentError, "invalid `who' symbol in file mode: #{chr}"
      end
    end
  end
  private_module_function :user_mask

  def apply_mask(mode, user_mask, op, mode_mask)   #:nodoc:
    case op
    when '='
      (mode & ~user_mask) | (user_mask & mode_mask)
    when '+'
      mode | (user_mask & mode_mask)
    when '-'
      mode & ~(user_mask & mode_mask)
    end
  end
  private_module_function :apply_mask

  def symbolic_modes_to_i(mode_sym, path)  #:nodoc:
    mode = if File::Stat === path
             path.mode
           else
             File.stat(path).mode
           end
    mode_sym.split(/,/).inject(mode & 07777) do |current_mode, clause|
      target, *actions = clause.split(/([=+-])/)
      raise ArgumentError, "invalid file mode: #{mode_sym}" if actions.empty?
      target = 'a' if target.empty?
      user_mask = user_mask(target)
      actions.each_slice(2) do |op, perm|
        need_apply = op == '='
        mode_mask = (perm || '').each_char.inject(0) do |mask, chr|
          case chr
          when "r"
            mask | 0444
          when "w"
            mask | 0222
          when "x"
            mask | 0111
          when "X"
            if FileTest.directory? path
              mask | 0111
            else
              mask
            end
          when "s"
            mask | 06000
          when "t"
            mask | 01000
          when "u", "g", "o"
            if mask.nonzero?
              current_mode = apply_mask(current_mode, user_mask, op, mask)
            end
            need_apply = false
            copy_mask = user_mask(chr)
            (current_mode & copy_mask) / (copy_mask & 0111) * (user_mask & 0111)
          else
            raise ArgumentError, "invalid `perm' symbol in file mode: #{chr}"
          end
        end

        if mode_mask.nonzero? || need_apply
          current_mode = apply_mask(current_mode, user_mask, op, mode_mask)
        end
      end
      current_mode
    end
  end
  private_module_function :symbolic_modes_to_i

  def fu_mode(mode, path)  #:nodoc:
    mode.is_a?(String) ? symbolic_modes_to_i(mode, path) : mode
  end
  private_module_function :fu_mode

  def mode_to_s(mode)  #:nodoc:
    mode.is_a?(String) ? mode : "%o" % mode
  end
  private_module_function :mode_to_s

  #
  # Changes permission bits on the named files (in +list+) to the bit pattern
  # represented by +mode+.
  #
  # +mode+ is the symbolic and absolute mode can be used.
  #
  # Absolute mode is
  #   Bundler::FileUtils.chmod 0755, 'somecommand'
  #   Bundler::FileUtils.chmod 0644, %w(my.rb your.rb his.rb her.rb)
  #   Bundler::FileUtils.chmod 0755, '/usr/bin/ruby', verbose: true
  #
  # Symbolic mode is
  #   Bundler::FileUtils.chmod "u=wrx,go=rx", 'somecommand'
  #   Bundler::FileUtils.chmod "u=wr,go=rr", %w(my.rb your.rb his.rb her.rb)
  #   Bundler::FileUtils.chmod "u=wrx,go=rx", '/usr/bin/ruby', verbose: true
  #
  # "a" :: is user, group, other mask.
  # "u" :: is user's mask.
  # "g" :: is group's mask.
  # "o" :: is other's mask.
  # "w" :: is write permission.
  # "r" :: is read permission.
  # "x" :: is execute permission.
  # "X" ::
  #   is execute permission for directories only, must be used in conjunction with "+"
  # "s" :: is uid, gid.
  # "t" :: is sticky bit.
  # "+" :: is added to a class given the specified mode.
  # "-" :: Is removed from a given class given mode.
  # "=" :: Is the exact nature of the class will be given a specified mode.

  def chmod(mode, list, noop: nil, verbose: nil)
    list = fu_list(list)
    fu_output_message sprintf('chmod %s %s', mode_to_s(mode), list.join(' ')) if verbose
    return if noop
    list.each do |path|
      Entry_.new(path).chmod(fu_mode(mode, path))
    end
  end
  module_function :chmod

  #
  # Changes permission bits on the named files (in +list+)
  # to the bit pattern represented by +mode+.
  #
  #   Bundler::FileUtils.chmod_R 0700, "/tmp/app.#{$$}"
  #   Bundler::FileUtils.chmod_R "u=wrx", "/tmp/app.#{$$}"
  #
  def chmod_R(mode, list, noop: nil, verbose: nil, force: nil)
    list = fu_list(list)
    fu_output_message sprintf('chmod -R%s %s %s',
                              (force ? 'f' : ''),
                              mode_to_s(mode), list.join(' ')) if verbose
    return if noop
    list.each do |root|
      Entry_.new(root).traverse do |ent|
        begin
          ent.chmod(fu_mode(mode, ent.path))
        rescue
          raise unless force
        end
      end
    end
  end
  module_function :chmod_R

  #
  # Changes owner and group on the named files (in +list+)
  # to the user +user+ and the group +group+.  +user+ and +group+
  # may be an ID (Integer/String) or a name (String).
  # If +user+ or +group+ is nil, this method does not change
  # the attribute.
  #
  #   Bundler::FileUtils.chown 'root', 'staff', '/usr/local/bin/ruby'
  #   Bundler::FileUtils.chown nil, 'bin', Dir.glob('/usr/bin/*'), verbose: true
  #
  def chown(user, group, list, noop: nil, verbose: nil)
    list = fu_list(list)
    fu_output_message sprintf('chown %s %s',
                              (group ? "#{user}:#{group}" : user || ':'),
                              list.join(' ')) if verbose
    return if noop
    uid = fu_get_uid(user)
    gid = fu_get_gid(group)
    list.each do |path|
      Entry_.new(path).chown uid, gid
    end
  end
  module_function :chown

  #
  # Changes owner and group on the named files (in +list+)
  # to the user +user+ and the group +group+ recursively.
  # +user+ and +group+ may be an ID (Integer/String) or
  # a name (String).  If +user+ or +group+ is nil, this
  # method does not change the attribute.
  #
  #   Bundler::FileUtils.chown_R 'www', 'www', '/var/www/htdocs'
  #   Bundler::FileUtils.chown_R 'cvs', 'cvs', '/var/cvs', verbose: true
  #
  def chown_R(user, group, list, noop: nil, verbose: nil, force: nil)
    list = fu_list(list)
    fu_output_message sprintf('chown -R%s %s %s',
                              (force ? 'f' : ''),
                              (group ? "#{user}:#{group}" : user || ':'),
                              list.join(' ')) if verbose
    return if noop
    uid = fu_get_uid(user)
    gid = fu_get_gid(group)
    list.each do |root|
      Entry_.new(root).traverse do |ent|
        begin
          ent.chown uid, gid
        rescue
          raise unless force
        end
      end
    end
  end
  module_function :chown_R

  def fu_get_uid(user)   #:nodoc:
    return nil unless user
    case user
    when Integer
      user
    when /\A\d+\z/
      user.to_i
    else
      require 'etc'
      Etc.getpwnam(user) ? Etc.getpwnam(user).uid : nil
    end
  end
  private_module_function :fu_get_uid

  def fu_get_gid(group)   #:nodoc:
    return nil unless group
    case group
    when Integer
      group
    when /\A\d+\z/
      group.to_i
    else
      require 'etc'
      Etc.getgrnam(group) ? Etc.getgrnam(group).gid : nil
    end
  end
  private_module_function :fu_get_gid

  #
  # Updates modification time (mtime) and access time (atime) of file(s) in
  # +list+.  Files are created if they don't exist.
  #
  #   Bundler::FileUtils.touch 'timestamp'
  #   Bundler::FileUtils.touch Dir.glob('*.c');  system 'make'
  #
  def touch(list, noop: nil, verbose: nil, mtime: nil, nocreate: nil)
    list = fu_list(list)
    t = mtime
    if verbose
      fu_output_message "touch #{nocreate ? '-c ' : ''}#{t ? t.strftime('-t %Y%m%d%H%M.%S ') : ''}#{list.join ' '}"
    end
    return if noop
    list.each do |path|
      created = nocreate
      begin
        File.utime(t, t, path)
      rescue Errno::ENOENT
        raise if created
        File.open(path, 'a') {
          ;
        }
        created = true
        retry if t
      end
    end
  end
  module_function :touch

  private

  module StreamUtils_
    private

    case (defined?(::RbConfig) ? ::RbConfig::CONFIG['host_os'] : ::RUBY_PLATFORM)
    when /mswin|mingw/
      def fu_windows?; true end
    else
      def fu_windows?; false end
    end

    def fu_copy_stream0(src, dest, blksize = nil)   #:nodoc:
      IO.copy_stream(src, dest)
    end

    def fu_stream_blksize(*streams)
      streams.each do |s|
        next unless s.respond_to?(:stat)
        size = fu_blksize(s.stat)
        return size if size
      end
      fu_default_blksize()
    end

    def fu_blksize(st)
      s = st.blksize
      return nil unless s
      return nil if s == 0
      s
    end

    def fu_default_blksize
      1024
    end
  end

  include StreamUtils_
  extend StreamUtils_

  class Entry_   #:nodoc: internal use only
    include StreamUtils_

    def initialize(a, b = nil, deref = false)
      @prefix = @rel = @path = nil
      if b
        @prefix = a
        @rel = b
      else
        @path = a
      end
      @deref = deref
      @stat = nil
      @lstat = nil
    end

    def inspect
      "\#<#{self.class} #{path()}>"
    end

    def path
      if @path
        File.path(@path)
      else
        join(@prefix, @rel)
      end
    end

    def prefix
      @prefix || @path
    end

    def rel
      @rel
    end

    def dereference?
      @deref
    end

    def exist?
      begin
        lstat
        true
      rescue Errno::ENOENT
        false
      end
    end

    def file?
      s = lstat!
      s and s.file?
    end

    def directory?
      s = lstat!
      s and s.directory?
    end

    def symlink?
      s = lstat!
      s and s.symlink?
    end

    def chardev?
      s = lstat!
      s and s.chardev?
    end

    def blockdev?
      s = lstat!
      s and s.blockdev?
    end

    def socket?
      s = lstat!
      s and s.socket?
    end

    def pipe?
      s = lstat!
      s and s.pipe?
    end

    S_IF_DOOR = 0xD000

    def door?
      s = lstat!
      s and (s.mode & 0xF000 == S_IF_DOOR)
    end

    def entries
      opts = {}
      opts[:encoding] = ::Encoding::UTF_8 if fu_windows?

      files = if Dir.respond_to?(:children)
        Dir.children(path, **opts)
      else
        Dir.entries(path(), **opts)
           .reject {|n| n == '.' or n == '..' }
      end

      untaint = RUBY_VERSION < '2.7'
      files.map {|n| Entry_.new(prefix(), join(rel(), untaint ? n.untaint : n)) }
    end

    def stat
      return @stat if @stat
      if lstat() and lstat().symlink?
        @stat = File.stat(path())
      else
        @stat = lstat()
      end
      @stat
    end

    def stat!
      return @stat if @stat
      if lstat! and lstat!.symlink?
        @stat = File.stat(path())
      else
        @stat = lstat!
      end
      @stat
    rescue SystemCallError
      nil
    end

    def lstat
      if dereference?
        @lstat ||= File.stat(path())
      else
        @lstat ||= File.lstat(path())
      end
    end

    def lstat!
      lstat()
    rescue SystemCallError
      nil
    end

    def chmod(mode)
      if symlink?
        File.lchmod mode, path() if have_lchmod?
      else
        File.chmod mode, path()
      end
    end

    def chown(uid, gid)
      if symlink?
        File.lchown uid, gid, path() if have_lchown?
      else
        File.chown uid, gid, path()
      end
    end

    def link(dest)
      case
      when directory?
        if !File.exist?(dest) and descendant_directory?(dest, path)
          raise ArgumentError, "cannot link directory %s to itself %s" % [path, dest]
        end
        begin
          Dir.mkdir dest
        rescue
          raise unless File.directory?(dest)
        end
      else
        File.link path(), dest
      end
    end

    def copy(dest)
      lstat
      case
      when file?
        copy_file dest
      when directory?
        if !File.exist?(dest) and descendant_directory?(dest, path)
          raise ArgumentError, "cannot copy directory %s to itself %s" % [path, dest]
        end
        begin
          Dir.mkdir dest
        rescue
          raise unless File.directory?(dest)
        end
      when symlink?
        File.symlink File.readlink(path()), dest
      when chardev?, blockdev?
        raise "cannot handle device file"
      when socket?
        begin
          require 'socket'
        rescue LoadError
          raise "cannot handle socket"
        else
          raise "cannot handle socket" unless defined?(UNIXServer)
        end
        UNIXServer.new(dest).close
        File.chmod lstat().mode, dest
      when pipe?
        raise "cannot handle FIFO" unless File.respond_to?(:mkfifo)
        File.mkfifo dest, lstat().mode
      when door?
        raise "cannot handle door: #{path()}"
      else
        raise "unknown file type: #{path()}"
      end
    end

    def copy_file(dest)
      File.open(path()) do |s|
        File.open(dest, 'wb', s.stat.mode) do |f|
          IO.copy_stream(s, f)
        end
      end
    end

    def copy_metadata(path)
      st = lstat()
      if !st.symlink?
        File.utime st.atime, st.mtime, path
      end
      mode = st.mode
      begin
        if st.symlink?
          begin
            File.lchown st.uid, st.gid, path
          rescue NotImplementedError
          end
        else
          File.chown st.uid, st.gid, path
        end
      rescue Errno::EPERM, Errno::EACCES
        # clear setuid/setgid
        mode &= 01777
      end
      if st.symlink?
        begin
          File.lchmod mode, path
        rescue NotImplementedError
        end
      else
        File.chmod mode, path
      end
    end

    def remove
      if directory?
        remove_dir1
      else
        remove_file
      end
    end

    def remove_dir1
      platform_support {
        Dir.rmdir path().chomp(?/)
      }
    end

    def remove_file
      platform_support {
        File.unlink path
      }
    end

    def platform_support
      return yield unless fu_windows?
      first_time_p = true
      begin
        yield
      rescue Errno::ENOENT
        raise
      rescue => err
        if first_time_p
          first_time_p = false
          begin
            File.chmod 0700, path()   # Windows does not have symlink
            retry
          rescue SystemCallError
          end
        end
        raise err
      end
    end

    def preorder_traverse
      stack = [self]
      while ent = stack.pop
        yield ent
        stack.concat ent.entries.reverse if ent.directory?
      end
    end

    alias traverse preorder_traverse

    def postorder_traverse
      if directory?
        entries().each do |ent|
          ent.postorder_traverse do |e|
            yield e
          end
        end
      end
    ensure
      yield self
    end

    def wrap_traverse(pre, post)
      pre.call self
      if directory?
        entries.each do |ent|
          ent.wrap_traverse pre, post
        end
      end
      post.call self
    end

    private

    @@fileutils_rb_have_lchmod = nil

    def have_lchmod?
      # This is not MT-safe, but it does not matter.
      if @@fileutils_rb_have_lchmod == nil
        @@fileutils_rb_have_lchmod = check_have_lchmod?
      end
      @@fileutils_rb_have_lchmod
    end

    def check_have_lchmod?
      return false unless File.respond_to?(:lchmod)
      File.lchmod 0
      return true
    rescue NotImplementedError
      return false
    end

    @@fileutils_rb_have_lchown = nil

    def have_lchown?
      # This is not MT-safe, but it does not matter.
      if @@fileutils_rb_have_lchown == nil
        @@fileutils_rb_have_lchown = check_have_lchown?
      end
      @@fileutils_rb_have_lchown
    end

    def check_have_lchown?
      return false unless File.respond_to?(:lchown)
      File.lchown nil, nil
      return true
    rescue NotImplementedError
      return false
    end

    def join(dir, base)
      return File.path(dir) if not base or base == '.'
      return File.path(base) if not dir or dir == '.'
      File.join(dir, base)
    end

    if File::ALT_SEPARATOR
      DIRECTORY_TERM = "(?=[/#{Regexp.quote(File::ALT_SEPARATOR)}]|\\z)"
    else
      DIRECTORY_TERM = "(?=/|\\z)"
    end

    def descendant_directory?(descendant, ascendant)
      if File::FNM_SYSCASE.nonzero?
        File.expand_path(File.dirname(descendant)).casecmp(File.expand_path(ascendant)) == 0
      else
        File.expand_path(File.dirname(descendant)) == File.expand_path(ascendant)
      end
    end
  end   # class Entry_

  def fu_list(arg)   #:nodoc:
    [arg].flatten.map {|path| File.path(path) }
  end
  private_module_function :fu_list

  def fu_each_src_dest(src, dest)   #:nodoc:
    fu_each_src_dest0(src, dest) do |s, d|
      raise ArgumentError, "same file: #{s} and #{d}" if fu_same?(s, d)
      yield s, d
    end
  end
  private_module_function :fu_each_src_dest

  def fu_each_src_dest0(src, dest)   #:nodoc:
    if tmp = Array.try_convert(src)
      tmp.each do |s|
        s = File.path(s)
        yield s, File.join(dest, File.basename(s))
      end
    else
      src = File.path(src)
      if File.directory?(dest)
        yield src, File.join(dest, File.basename(src))
      else
        yield src, File.path(dest)
      end
    end
  end
  private_module_function :fu_each_src_dest0

  def fu_same?(a, b)   #:nodoc:
    File.identical?(a, b)
  end
  private_module_function :fu_same?

  def fu_output_message(msg)   #:nodoc:
    output = @fileutils_output if defined?(@fileutils_output)
    output ||= $stderr
    if defined?(@fileutils_label)
      msg = @fileutils_label + msg
    end
    output.puts msg
  end
  private_module_function :fu_output_message

  # This hash table holds command options.
  OPT_TABLE = {}    #:nodoc: internal use only
  (private_instance_methods & methods(false)).inject(OPT_TABLE) {|tbl, name|
    (tbl[name.to_s] = instance_method(name).parameters).map! {|t, n| n if t == :key}.compact!
    tbl
  }

  public

  #
  # Returns an Array of names of high-level methods that accept any keyword
  # arguments.
  #
  #   p Bundler::FileUtils.commands  #=> ["chmod", "cp", "cp_r", "install", ...]
  #
  def self.commands
    OPT_TABLE.keys
  end

  #
  # Returns an Array of option names.
  #
  #   p Bundler::FileUtils.options  #=> ["noop", "force", "verbose", "preserve", "mode"]
  #
  def self.options
    OPT_TABLE.values.flatten.uniq.map {|sym| sym.to_s }
  end

  #
  # Returns true if the method +mid+ have an option +opt+.
  #
  #   p Bundler::FileUtils.have_option?(:cp, :noop)     #=> true
  #   p Bundler::FileUtils.have_option?(:rm, :force)    #=> true
  #   p Bundler::FileUtils.have_option?(:rm, :preserve) #=> false
  #
  def self.have_option?(mid, opt)
    li = OPT_TABLE[mid.to_s] or raise ArgumentError, "no such method: #{mid}"
    li.include?(opt)
  end

  #
  # Returns an Array of option names of the method +mid+.
  #
  #   p Bundler::FileUtils.options_of(:rm)  #=> ["noop", "verbose", "force"]
  #
  def self.options_of(mid)
    OPT_TABLE[mid.to_s].map {|sym| sym.to_s }
  end

  #
  # Returns an Array of methods names which have the option +opt+.
  #
  #   p Bundler::FileUtils.collect_method(:preserve) #=> ["cp", "cp_r", "copy", "install"]
  #
  def self.collect_method(opt)
    OPT_TABLE.keys.select {|m| OPT_TABLE[m].include?(opt) }
  end

  private

  LOW_METHODS = singleton_methods(false) - collect_method(:noop).map(&:intern) # :nodoc:
  module LowMethods # :nodoc: internal use only
    private
    def _do_nothing(*)end
    ::Bundler::FileUtils::LOW_METHODS.map {|name| alias_method name, :_do_nothing}
  end

  METHODS = singleton_methods() - [:private_module_function,                  # :nodoc:
      :commands, :options, :have_option?, :options_of, :collect_method]

  #
  # This module has all methods of Bundler::FileUtils module, but it outputs messages
  # before acting.  This equates to passing the <tt>:verbose</tt> flag to
  # methods in Bundler::FileUtils.
  #
  module Verbose
    include Bundler::FileUtils
    names = ::Bundler::FileUtils.collect_method(:verbose)
    names.each do |name|
      module_eval(<<-EOS, __FILE__, __LINE__ + 1)
        def #{name}(*args, **options)
          super(*args, **options, verbose: true)
        end
      EOS
    end
    private(*names)
    extend self
    class << self
      public(*::Bundler::FileUtils::METHODS)
    end
  end

  #
  # This module has all methods of Bundler::FileUtils module, but never changes
  # files/directories.  This equates to passing the <tt>:noop</tt> flag
  # to methods in Bundler::FileUtils.
  #
  module NoWrite
    include Bundler::FileUtils
    include LowMethods
    names = ::Bundler::FileUtils.collect_method(:noop)
    names.each do |name|
      module_eval(<<-EOS, __FILE__, __LINE__ + 1)
        def #{name}(*args, **options)
          super(*args, **options, noop: true)
        end
      EOS
    end
    private(*names)
    extend self
    class << self
      public(*::Bundler::FileUtils::METHODS)
    end
  end

  #
  # This module has all methods of Bundler::FileUtils module, but never changes
  # files/directories, with printing message before acting.
  # This equates to passing the <tt>:noop</tt> and <tt>:verbose</tt> flag
  # to methods in Bundler::FileUtils.
  #
  module DryRun
    include Bundler::FileUtils
    include LowMethods
    names = ::Bundler::FileUtils.collect_method(:noop)
    names.each do |name|
      module_eval(<<-EOS, __FILE__, __LINE__ + 1)
        def #{name}(*args, **options)
          super(*args, **options, noop: true, verbose: true)
        end
      EOS
    end
    private(*names)
    extend self
    class << self
      public(*::Bundler::FileUtils::METHODS)
    end
  end

end
PK}$[l��HYYFgems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo.rbnu�[���# frozen_string_literal: true

require_relative 'molinillo/gem_metadata'
require_relative 'molinillo/errors'
require_relative 'molinillo/resolver'
require_relative 'molinillo/modules/ui'
require_relative 'molinillo/modules/specification_provider'

# Bundler::Molinillo is a generic dependency resolution algorithm.
module Bundler::Molinillo
end
PK}$[��Sgems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rbnu�[���# frozen_string_literal: true

module Bundler::Molinillo
  # The version of Bundler::Molinillo.
  VERSION = '0.8.0'.freeze
end
PK}$[��޳ttMgems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/errors.rbnu�[���# frozen_string_literal: true

module Bundler::Molinillo
  # An error that occurred during the resolution process
  class ResolverError < StandardError; end

  # An error caused by searching for a dependency that is completely unknown,
  # i.e. has no versions available whatsoever.
  class NoSuchDependencyError < ResolverError
    # @return [Object] the dependency that could not be found
    attr_accessor :dependency

    # @return [Array<Object>] the specifications that depended upon {#dependency}
    attr_accessor :required_by

    # Initializes a new error with the given missing dependency.
    # @param [Object] dependency @see {#dependency}
    # @param [Array<Object>] required_by @see {#required_by}
    def initialize(dependency, required_by = [])
      @dependency = dependency
      @required_by = required_by.uniq
      super()
    end

    # The error message for the missing dependency, including the specifications
    # that had this dependency.
    def message
      sources = required_by.map { |r| "`#{r}`" }.join(' and ')
      message = "Unable to find a specification for `#{dependency}`"
      message += " depended upon by #{sources}" unless sources.empty?
      message
    end
  end

  # An error caused by attempting to fulfil a dependency that was circular
  #
  # @note This exception will be thrown if and only if a {Vertex} is added to a
  #   {DependencyGraph} that has a {DependencyGraph::Vertex#path_to?} an
  #   existing {DependencyGraph::Vertex}
  class CircularDependencyError < ResolverError
    # [Set<Object>] the dependencies responsible for causing the error
    attr_reader :dependencies

    # Initializes a new error with the given circular vertices.
    # @param [Array<DependencyGraph::Vertex>] vertices the vertices in the dependency
    #   that caused the error
    def initialize(vertices)
      super "There is a circular dependency between #{vertices.map(&:name).join(' and ')}"
      @dependencies = vertices.map { |vertex| vertex.payload.possibilities.last }.to_set
    end
  end

  # An error caused by conflicts in version
  class VersionConflict < ResolverError
    # @return [{String => Resolution::Conflict}] the conflicts that caused
    #   resolution to fail
    attr_reader :conflicts

    # @return [SpecificationProvider] the specification provider used during
    #   resolution
    attr_reader :specification_provider

    # Initializes a new error with the given version conflicts.
    # @param [{String => Resolution::Conflict}] conflicts see {#conflicts}
    # @param [SpecificationProvider] specification_provider see {#specification_provider}
    def initialize(conflicts, specification_provider)
      pairs = []
      conflicts.values.flat_map(&:requirements).each do |conflicting|
        conflicting.each do |source, conflict_requirements|
          conflict_requirements.each do |c|
            pairs << [c, source]
          end
        end
      end

      super "Unable to satisfy the following requirements:\n\n" \
        "#{pairs.map { |r, d| "- `#{r}` required by `#{d}`" }.join("\n")}"

      @conflicts = conflicts
      @specification_provider = specification_provider
    end

    require_relative 'delegates/specification_provider'
    include Delegates::SpecificationProvider

    # @return [String] An error message that includes requirement trees,
    #   which is much more detailed & customizable than the default message
    # @param [Hash] opts the options to create a message with.
    # @option opts [String] :solver_name The user-facing name of the solver
    # @option opts [String] :possibility_type The generic name of a possibility
    # @option opts [Proc] :reduce_trees A proc that reduced the list of requirement trees
    # @option opts [Proc] :printable_requirement A proc that pretty-prints requirements
    # @option opts [Proc] :additional_message_for_conflict A proc that appends additional
    #   messages for each conflict
    # @option opts [Proc] :version_for_spec A proc that returns the version number for a
    #   possibility
    def message_with_trees(opts = {})
      solver_name = opts.delete(:solver_name) { self.class.name.split('::').first }
      possibility_type = opts.delete(:possibility_type) { 'possibility named' }
      reduce_trees = opts.delete(:reduce_trees) { proc { |trees| trees.uniq.sort_by(&:to_s) } }
      printable_requirement = opts.delete(:printable_requirement) { proc { |req| req.to_s } }
      additional_message_for_conflict = opts.delete(:additional_message_for_conflict) { proc {} }
      version_for_spec = opts.delete(:version_for_spec) { proc(&:to_s) }
      incompatible_version_message_for_conflict = opts.delete(:incompatible_version_message_for_conflict) do
        proc do |name, _conflict|
          %(#{solver_name} could not find compatible versions for #{possibility_type} "#{name}":)
        end
      end

      full_message_for_conflict = opts.delete(:full_message_for_conflict) do
        proc do |name, conflict|
          o = "\n".dup << incompatible_version_message_for_conflict.call(name, conflict) << "\n"
          if conflict.locked_requirement
            o << %(  In snapshot (#{name_for_locking_dependency_source}):\n)
            o << %(    #{printable_requirement.call(conflict.locked_requirement)}\n)
            o << %(\n)
          end
          o << %(  In #{name_for_explicit_dependency_source}:\n)
          trees = reduce_trees.call(conflict.requirement_trees)

          o << trees.map do |tree|
            t = ''.dup
            depth = 2
            tree.each do |req|
              t << '  ' * depth << printable_requirement.call(req)
              unless tree.last == req
                if spec = conflict.activated_by_name[name_for(req)]
                  t << %( was resolved to #{version_for_spec.call(spec)}, which)
                end
                t << %( depends on)
              end
              t << %(\n)
              depth += 1
            end
            t
          end.join("\n")

          additional_message_for_conflict.call(o, name, conflict)

          o
        end
      end

      conflicts.sort.reduce(''.dup) do |o, (name, conflict)|
        o << full_message_for_conflict.call(name, conflict)
      end.strip
    end
  end
end
PK}$[�.mV��[gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rbnu�[���# frozen_string_literal: true

require_relative 'action'
module Bundler::Molinillo
  class DependencyGraph
    # @!visibility private
    # @see DependencyGraph#tag
    class Tag < Action
      # @!group Action

      # (see Action.action_name)
      def self.action_name
        :tag
      end

      # (see Action#up)
      def up(graph)
      end

      # (see Action#down)
      def down(graph)
      end

      # @!group Tag

      # @return [Object] An opaque tag
      attr_reader :tag

      # Initialize an action to tag a state of a dependency graph
      # @param [Object] tag an opaque tag
      def initialize(tag)
        @tag = tag
      end
    end
  end
end
PK}$[Ի�HH^gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rbnu�[���# frozen_string_literal: true

module Bundler::Molinillo
  class DependencyGraph
    # A vertex in a {DependencyGraph} that encapsulates a {#name} and a
    # {#payload}
    class Vertex
      # @return [String] the name of the vertex
      attr_accessor :name

      # @return [Object] the payload the vertex holds
      attr_accessor :payload

      # @return [Array<Object>] the explicit requirements that required
      #   this vertex
      attr_reader :explicit_requirements

      # @return [Boolean] whether the vertex is considered a root vertex
      attr_accessor :root
      alias root? root

      # Initializes a vertex with the given name and payload.
      # @param [String] name see {#name}
      # @param [Object] payload see {#payload}
      def initialize(name, payload)
        @name = name.frozen? ? name : name.dup.freeze
        @payload = payload
        @explicit_requirements = []
        @outgoing_edges = []
        @incoming_edges = []
      end

      # @return [Array<Object>] all of the requirements that required
      #   this vertex
      def requirements
        (incoming_edges.map(&:requirement) + explicit_requirements).uniq
      end

      # @return [Array<Edge>] the edges of {#graph} that have `self` as their
      #   {Edge#origin}
      attr_accessor :outgoing_edges

      # @return [Array<Edge>] the edges of {#graph} that have `self` as their
      #   {Edge#destination}
      attr_accessor :incoming_edges

      # @return [Array<Vertex>] the vertices of {#graph} that have an edge with
      #   `self` as their {Edge#destination}
      def predecessors
        incoming_edges.map(&:origin)
      end

      # @return [Set<Vertex>] the vertices of {#graph} where `self` is a
      #   {#descendent?}
      def recursive_predecessors
        _recursive_predecessors
      end

      # @param [Set<Vertex>] vertices the set to add the predecessors to
      # @return [Set<Vertex>] the vertices of {#graph} where `self` is a
      #   {#descendent?}
      def _recursive_predecessors(vertices = new_vertex_set)
        incoming_edges.each do |edge|
          vertex = edge.origin
          next unless vertices.add?(vertex)
          vertex._recursive_predecessors(vertices)
        end

        vertices
      end
      protected :_recursive_predecessors

      # @return [Array<Vertex>] the vertices of {#graph} that have an edge with
      #   `self` as their {Edge#origin}
      def successors
        outgoing_edges.map(&:destination)
      end

      # @return [Set<Vertex>] the vertices of {#graph} where `self` is an
      #   {#ancestor?}
      def recursive_successors
        _recursive_successors
      end

      # @param [Set<Vertex>] vertices the set to add the successors to
      # @return [Set<Vertex>] the vertices of {#graph} where `self` is an
      #   {#ancestor?}
      def _recursive_successors(vertices = new_vertex_set)
        outgoing_edges.each do |edge|
          vertex = edge.destination
          next unless vertices.add?(vertex)
          vertex._recursive_successors(vertices)
        end

        vertices
      end
      protected :_recursive_successors

      # @return [String] a string suitable for debugging
      def inspect
        "#{self.class}:#{name}(#{payload.inspect})"
      end

      # @return [Boolean] whether the two vertices are equal, determined
      #   by a recursive traversal of each {Vertex#successors}
      def ==(other)
        return true if equal?(other)
        shallow_eql?(other) &&
          successors.to_set == other.successors.to_set
      end

      # @param  [Vertex] other the other vertex to compare to
      # @return [Boolean] whether the two vertices are equal, determined
      #   solely by {#name} and {#payload} equality
      def shallow_eql?(other)
        return true if equal?(other)
        other &&
          name == other.name &&
          payload == other.payload
      end

      alias eql? ==

      # @return [Fixnum] a hash for the vertex based upon its {#name}
      def hash
        name.hash
      end

      # Is there a path from `self` to `other` following edges in the
      # dependency graph?
      # @return whether there is a path following edges within this {#graph}
      def path_to?(other)
        _path_to?(other)
      end

      alias descendent? path_to?

      # @param [Vertex] other the vertex to check if there's a path to
      # @param [Set<Vertex>] visited the vertices of {#graph} that have been visited
      # @return [Boolean] whether there is a path to `other` from `self`
      def _path_to?(other, visited = new_vertex_set)
        return false unless visited.add?(self)
        return true if equal?(other)
        successors.any? { |v| v._path_to?(other, visited) }
      end
      protected :_path_to?

      # Is there a path from `other` to `self` following edges in the
      # dependency graph?
      # @return whether there is a path following edges within this {#graph}
      def ancestor?(other)
        other.path_to?(self)
      end

      alias is_reachable_from? ancestor?

      def new_vertex_set
        require 'set'
        Set.new
      end
      private :new_vertex_set
    end
  end
end
PK}$[�X�Accbgems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rbnu�[���# frozen_string_literal: true

require_relative 'action'
module Bundler::Molinillo
  class DependencyGraph
    # @!visibility private
    # (see DependencyGraph#add_vertex)
    class AddVertex < Action # :nodoc:
      # @!group Action

      # (see Action.action_name)
      def self.action_name
        :add_vertex
      end

      # (see Action#up)
      def up(graph)
        if existing = graph.vertices[name]
          @existing_payload = existing.payload
          @existing_root = existing.root
        end
        vertex = existing || Vertex.new(name, payload)
        graph.vertices[vertex.name] = vertex
        vertex.payload ||= payload
        vertex.root ||= root
        vertex
      end

      # (see Action#down)
      def down(graph)
        if defined?(@existing_payload)
          vertex = graph.vertices[name]
          vertex.payload = @existing_payload
          vertex.root = @existing_root
        else
          graph.vertices.delete(name)
        end
      end

      # @!group AddVertex

      # @return [String] the name of the vertex
      attr_reader :name

      # @return [Object] the payload for the vertex
      attr_reader :payload

      # @return [Boolean] whether the vertex is root or not
      attr_reader :root

      # Initialize an action to add a vertex to a dependency graph
      # @param [String] name the name of the vertex
      # @param [Object] payload the payload for the vertex
      # @param [Boolean] root whether the vertex is root or not
      def initialize(name, payload, root)
        @name = name
        @payload = payload
        @root = root
      end
    end
  end
end
PK}$[@G�{��^gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rbnu�[���# frozen_string_literal: true

module Bundler::Molinillo
  class DependencyGraph
    # An action that modifies a {DependencyGraph} that is reversible.
    # @abstract
    class Action
      # rubocop:disable Lint/UnusedMethodArgument

      # @return [Symbol] The name of the action.
      def self.action_name
        raise 'Abstract'
      end

      # Performs the action on the given graph.
      # @param  [DependencyGraph] graph the graph to perform the action on.
      # @return [Void]
      def up(graph)
        raise 'Abstract'
      end

      # Reverses the action on the given graph.
      # @param  [DependencyGraph] graph the graph to reverse the action on.
      # @return [Void]
      def down(graph)
        raise 'Abstract'
      end

      # @return [Action,Nil] The previous action
      attr_accessor :previous

      # @return [Action,Nil] The next action
      attr_accessor :next
    end
  end
end
PK}$[:ʘ!��kgems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rbnu�[���# frozen_string_literal: true

require_relative 'action'
module Bundler::Molinillo
  class DependencyGraph
    # @!visibility private
    # @see DependencyGraph#detach_vertex_named
    class DetachVertexNamed < Action
      # @!group Action

      # (see Action#name)
      def self.action_name
        :add_vertex
      end

      # (see Action#up)
      def up(graph)
        return [] unless @vertex = graph.vertices.delete(name)

        removed_vertices = [@vertex]
        @vertex.outgoing_edges.each do |e|
          v = e.destination
          v.incoming_edges.delete(e)
          if !v.root? && v.incoming_edges.empty?
            removed_vertices.concat graph.detach_vertex_named(v.name)
          end
        end

        @vertex.incoming_edges.each do |e|
          v = e.origin
          v.outgoing_edges.delete(e)
        end

        removed_vertices
      end

      # (see Action#down)
      def down(graph)
        return unless @vertex
        graph.vertices[@vertex.name] = @vertex
        @vertex.outgoing_edges.each do |e|
          e.destination.incoming_edges << e
        end
        @vertex.incoming_edges.each do |e|
          e.origin.outgoing_edges << e
        end
      end

      # @!group DetachVertexNamed

      # @return [String] the name of the vertex to detach
      attr_reader :name

      # Initialize an action to detach a vertex from a dependency graph
      # @param [String] name the name of the vertex to detach
      def initialize(name)
        @name = name
      end
    end
  end
end
PK}$[���D""cgems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rbnu�[���# frozen_string_literal: true

require_relative 'action'
module Bundler::Molinillo
  class DependencyGraph
    # @!visibility private
    # (see DependencyGraph#delete_edge)
    class DeleteEdge < Action
      # @!group Action

      # (see Action.action_name)
      def self.action_name
        :delete_edge
      end

      # (see Action#up)
      def up(graph)
        edge = make_edge(graph)
        edge.origin.outgoing_edges.delete(edge)
        edge.destination.incoming_edges.delete(edge)
      end

      # (see Action#down)
      def down(graph)
        edge = make_edge(graph)
        edge.origin.outgoing_edges << edge
        edge.destination.incoming_edges << edge
        edge
      end

      # @!group DeleteEdge

      # @return [String] the name of the origin of the edge
      attr_reader :origin_name

      # @return [String] the name of the destination of the edge
      attr_reader :destination_name

      # @return [Object] the requirement that the edge represents
      attr_reader :requirement

      # @param  [DependencyGraph] graph the graph to find vertices from
      # @return [Edge] The edge this action adds
      def make_edge(graph)
        Edge.new(
          graph.vertex_named(origin_name),
          graph.vertex_named(destination_name),
          requirement
        )
      end

      # Initialize an action to add an edge to a dependency graph
      # @param [String] origin_name the name of the origin of the edge
      # @param [String] destination_name the name of the destination of the edge
      # @param [Object] requirement the requirement that the edge represents
      def initialize(origin_name, destination_name, requirement)
        @origin_name = origin_name
        @destination_name = destination_name
        @requirement = requirement
      end
    end
  end
end
PK}$[D�Njoolgems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rbnu�[���# frozen_string_literal: true

require_relative 'action'
module Bundler::Molinillo
  class DependencyGraph
    # @!visibility private
    # (see DependencyGraph#add_edge_no_circular)
    class AddEdgeNoCircular < Action
      # @!group Action

      # (see Action.action_name)
      def self.action_name
        :add_vertex
      end

      # (see Action#up)
      def up(graph)
        edge = make_edge(graph)
        edge.origin.outgoing_edges << edge
        edge.destination.incoming_edges << edge
        edge
      end

      # (see Action#down)
      def down(graph)
        edge = make_edge(graph)
        delete_first(edge.origin.outgoing_edges, edge)
        delete_first(edge.destination.incoming_edges, edge)
      end

      # @!group AddEdgeNoCircular

      # @return [String] the name of the origin of the edge
      attr_reader :origin

      # @return [String] the name of the destination of the edge
      attr_reader :destination

      # @return [Object] the requirement that the edge represents
      attr_reader :requirement

      # @param  [DependencyGraph] graph the graph to find vertices from
      # @return [Edge] The edge this action adds
      def make_edge(graph)
        Edge.new(graph.vertex_named(origin), graph.vertex_named(destination), requirement)
      end

      # Initialize an action to add an edge to a dependency graph
      # @param [String] origin the name of the origin of the edge
      # @param [String] destination the name of the destination of the edge
      # @param [Object] requirement the requirement that the edge represents
      def initialize(origin, destination, requirement)
        @origin = origin
        @destination = destination
        @requirement = requirement
      end

      private

      def delete_first(array, item)
        return unless index = array.index(item)
        array.delete_at(index)
      end
    end
  end
end
PK}$[5	�[gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rbnu�[���# frozen_string_literal: true

require_relative 'add_edge_no_circular'
require_relative 'add_vertex'
require_relative 'delete_edge'
require_relative 'detach_vertex_named'
require_relative 'set_payload'
require_relative 'tag'

module Bundler::Molinillo
  class DependencyGraph
    # A log for dependency graph actions
    class Log
      # Initializes an empty log
      def initialize
        @current_action = @first_action = nil
      end

      # @!macro [new] action
      #   {include:DependencyGraph#$0}
      #   @param [Graph] graph the graph to perform the action on
      #   @param (see DependencyGraph#$0)
      #   @return (see DependencyGraph#$0)

      # @macro action
      def tag(graph, tag)
        push_action(graph, Tag.new(tag))
      end

      # @macro action
      def add_vertex(graph, name, payload, root)
        push_action(graph, AddVertex.new(name, payload, root))
      end

      # @macro action
      def detach_vertex_named(graph, name)
        push_action(graph, DetachVertexNamed.new(name))
      end

      # @macro action
      def add_edge_no_circular(graph, origin, destination, requirement)
        push_action(graph, AddEdgeNoCircular.new(origin, destination, requirement))
      end

      # {include:DependencyGraph#delete_edge}
      # @param [Graph] graph the graph to perform the action on
      # @param [String] origin_name
      # @param [String] destination_name
      # @param [Object] requirement
      # @return (see DependencyGraph#delete_edge)
      def delete_edge(graph, origin_name, destination_name, requirement)
        push_action(graph, DeleteEdge.new(origin_name, destination_name, requirement))
      end

      # @macro action
      def set_payload(graph, name, payload)
        push_action(graph, SetPayload.new(name, payload))
      end

      # Pops the most recent action from the log and undoes the action
      # @param [DependencyGraph] graph
      # @return [Action] the action that was popped off the log
      def pop!(graph)
        return unless action = @current_action
        unless @current_action = action.previous
          @first_action = nil
        end
        action.down(graph)
        action
      end

      extend Enumerable

      # @!visibility private
      # Enumerates each action in the log
      # @yield [Action]
      def each
        return enum_for unless block_given?
        action = @first_action
        loop do
          break unless action
          yield action
          action = action.next
        end
        self
      end

      # @!visibility private
      # Enumerates each action in the log in reverse order
      # @yield [Action]
      def reverse_each
        return enum_for(:reverse_each) unless block_given?
        action = @current_action
        loop do
          break unless action
          yield action
          action = action.previous
        end
        self
      end

      # @macro action
      def rewind_to(graph, tag)
        loop do
          action = pop!(graph)
          raise "No tag #{tag.inspect} found" unless action
          break if action.class.action_name == :tag && action.tag == tag
        end
      end

      private

      # Adds the given action to the log, running the action
      # @param [DependencyGraph] graph
      # @param [Action] action
      # @return The value returned by `action.up`
      def push_action(graph, action)
        action.previous = @current_action
        @current_action.next = action if @current_action
        @current_action = action
        @first_action ||= action
        action.up(graph)
      end
    end
  end
end
PK}$[�	?=WWcgems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rbnu�[���# frozen_string_literal: true

require_relative 'action'
module Bundler::Molinillo
  class DependencyGraph
    # @!visibility private
    # @see DependencyGraph#set_payload
    class SetPayload < Action # :nodoc:
      # @!group Action

      # (see Action.action_name)
      def self.action_name
        :set_payload
      end

      # (see Action#up)
      def up(graph)
        vertex = graph.vertex_named(name)
        @old_payload = vertex.payload
        vertex.payload = payload
      end

      # (see Action#down)
      def down(graph)
        graph.vertex_named(name).payload = @old_payload
      end

      # @!group SetPayload

      # @return [String] the name of the vertex
      attr_reader :name

      # @return [Object] the payload for the vertex
      attr_reader :payload

      # Initialize an action to add set the payload for a vertex in a dependency
      # graph
      # @param [String] name the name of the vertex
      # @param [Object] payload the payload for the vertex
      def initialize(name, payload)
        @name = name
        @payload = payload
      end
    end
  end
end
PK}$[�ۦ���ggems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rbnu�[���# frozen_string_literal: true

module Bundler::Molinillo
  module Delegates
    # Delegates all {Bundler::Molinillo::SpecificationProvider} methods to a
    # `#specification_provider` property.
    module SpecificationProvider
      # (see Bundler::Molinillo::SpecificationProvider#search_for)
      def search_for(dependency)
        with_no_such_dependency_error_handling do
          specification_provider.search_for(dependency)
        end
      end

      # (see Bundler::Molinillo::SpecificationProvider#dependencies_for)
      def dependencies_for(specification)
        with_no_such_dependency_error_handling do
          specification_provider.dependencies_for(specification)
        end
      end

      # (see Bundler::Molinillo::SpecificationProvider#requirement_satisfied_by?)
      def requirement_satisfied_by?(requirement, activated, spec)
        with_no_such_dependency_error_handling do
          specification_provider.requirement_satisfied_by?(requirement, activated, spec)
        end
      end

      # (see Bundler::Molinillo::SpecificationProvider#dependencies_equal?)
      def dependencies_equal?(dependencies, other_dependencies)
        with_no_such_dependency_error_handling do
          specification_provider.dependencies_equal?(dependencies, other_dependencies)
        end
      end

      # (see Bundler::Molinillo::SpecificationProvider#name_for)
      def name_for(dependency)
        with_no_such_dependency_error_handling do
          specification_provider.name_for(dependency)
        end
      end

      # (see Bundler::Molinillo::SpecificationProvider#name_for_explicit_dependency_source)
      def name_for_explicit_dependency_source
        with_no_such_dependency_error_handling do
          specification_provider.name_for_explicit_dependency_source
        end
      end

      # (see Bundler::Molinillo::SpecificationProvider#name_for_locking_dependency_source)
      def name_for_locking_dependency_source
        with_no_such_dependency_error_handling do
          specification_provider.name_for_locking_dependency_source
        end
      end

      # (see Bundler::Molinillo::SpecificationProvider#sort_dependencies)
      def sort_dependencies(dependencies, activated, conflicts)
        with_no_such_dependency_error_handling do
          specification_provider.sort_dependencies(dependencies, activated, conflicts)
        end
      end

      # (see Bundler::Molinillo::SpecificationProvider#allow_missing?)
      def allow_missing?(dependency)
        with_no_such_dependency_error_handling do
          specification_provider.allow_missing?(dependency)
        end
      end

      private

      # Ensures any raised {NoSuchDependencyError} has its
      # {NoSuchDependencyError#required_by} set.
      # @yield
      def with_no_such_dependency_error_handling
        yield
      rescue NoSuchDependencyError => error
        if state
          vertex = activated.vertex_named(name_for(error.dependency))
          error.required_by += vertex.incoming_edges.map { |e| e.origin.name }
          error.required_by << name_for_explicit_dependency_source unless vertex.explicit_requirements.empty?
        end
        raise
      end
    end
  end
end
PK}$[9DD�??agems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rbnu�[���# frozen_string_literal: true

module Bundler::Molinillo
  # @!visibility private
  module Delegates
    # Delegates all {Bundler::Molinillo::ResolutionState} methods to a `#state` property.
    module ResolutionState
      # (see Bundler::Molinillo::ResolutionState#name)
      def name
        current_state = state || Bundler::Molinillo::ResolutionState.empty
        current_state.name
      end

      # (see Bundler::Molinillo::ResolutionState#requirements)
      def requirements
        current_state = state || Bundler::Molinillo::ResolutionState.empty
        current_state.requirements
      end

      # (see Bundler::Molinillo::ResolutionState#activated)
      def activated
        current_state = state || Bundler::Molinillo::ResolutionState.empty
        current_state.activated
      end

      # (see Bundler::Molinillo::ResolutionState#requirement)
      def requirement
        current_state = state || Bundler::Molinillo::ResolutionState.empty
        current_state.requirement
      end

      # (see Bundler::Molinillo::ResolutionState#possibilities)
      def possibilities
        current_state = state || Bundler::Molinillo::ResolutionState.empty
        current_state.possibilities
      end

      # (see Bundler::Molinillo::ResolutionState#depth)
      def depth
        current_state = state || Bundler::Molinillo::ResolutionState.empty
        current_state.depth
      end

      # (see Bundler::Molinillo::ResolutionState#conflicts)
      def conflicts
        current_state = state || Bundler::Molinillo::ResolutionState.empty
        current_state.conflicts
      end

      # (see Bundler::Molinillo::ResolutionState#unused_unwind_options)
      def unused_unwind_options
        current_state = state || Bundler::Molinillo::ResolutionState.empty
        current_state.unused_unwind_options
      end
    end
  end
end
PK}$[~��Ogems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rbnu�[���# frozen_string_literal: true

require_relative 'dependency_graph'

module Bundler::Molinillo
  # This class encapsulates a dependency resolver.
  # The resolver is responsible for determining which set of dependencies to
  # activate, with feedback from the {#specification_provider}
  #
  #
  class Resolver
    require_relative 'resolution'

    # @return [SpecificationProvider] the specification provider used
    #   in the resolution process
    attr_reader :specification_provider

    # @return [UI] the UI module used to communicate back to the user
    #   during the resolution process
    attr_reader :resolver_ui

    # Initializes a new resolver.
    # @param  [SpecificationProvider] specification_provider
    #   see {#specification_provider}
    # @param  [UI] resolver_ui
    #   see {#resolver_ui}
    def initialize(specification_provider, resolver_ui)
      @specification_provider = specification_provider
      @resolver_ui = resolver_ui
    end

    # Resolves the requested dependencies into a {DependencyGraph},
    # locking to the base dependency graph (if specified)
    # @param [Array] requested an array of 'requested' dependencies that the
    #   {#specification_provider} can understand
    # @param [DependencyGraph,nil] base the base dependency graph to which
    #   dependencies should be 'locked'
    def resolve(requested, base = DependencyGraph.new)
      Resolution.new(specification_provider,
                     resolver_ui,
                     requested,
                     base).
        resolve
    end
  end
end
PK}$[+��4��Qgems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rbnu�[���# frozen_string_literal: true

module Bundler::Molinillo
  # Conveys information about the resolution process to a user.
  module UI
    # The {IO} object that should be used to print output. `STDOUT`, by default.
    #
    # @return [IO]
    def output
      STDOUT
    end

    # Called roughly every {#progress_rate}, this method should convey progress
    # to the user.
    #
    # @return [void]
    def indicate_progress
      output.print '.' unless debug?
    end

    # How often progress should be conveyed to the user via
    # {#indicate_progress}, in seconds. A third of a second, by default.
    #
    # @return [Float]
    def progress_rate
      0.33
    end

    # Called before resolution begins.
    #
    # @return [void]
    def before_resolution
      output.print 'Resolving dependencies...'
    end

    # Called after resolution ends (either successfully or with an error).
    # By default, prints a newline.
    #
    # @return [void]
    def after_resolution
      output.puts
    end

    # Conveys debug information to the user.
    #
    # @param [Integer] depth the current depth of the resolution process.
    # @return [void]
    def debug(depth = 0)
      if debug?
        debug_info = yield
        debug_info = debug_info.inspect unless debug_info.is_a?(String)
        debug_info = debug_info.split("\n").map { |s| ":#{depth.to_s.rjust 4}: #{s}" }
        output.puts debug_info
      end
    end

    # Whether or not debug messages should be printed.
    # By default, whether or not the `MOLINILLO_DEBUG` environment variable is
    # set.
    #
    # @return [Boolean]
    def debug?
      return @debug_mode if defined?(@debug_mode)
      @debug_mode = ENV['MOLINILLO_DEBUG']
    end
  end
end
PK}$[!gpt[[egems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rbnu�[���# frozen_string_literal: true

module Bundler::Molinillo
  # Provides information about specifications and dependencies to the resolver,
  # allowing the {Resolver} class to remain generic while still providing power
  # and flexibility.
  #
  # This module contains the methods that users of Bundler::Molinillo must to implement,
  # using knowledge of their own model classes.
  module SpecificationProvider
    # Search for the specifications that match the given dependency.
    # The specifications in the returned array will be considered in reverse
    # order, so the latest version ought to be last.
    # @note This method should be 'pure', i.e. the return value should depend
    #   only on the `dependency` parameter.
    #
    # @param [Object] dependency
    # @return [Array<Object>] the specifications that satisfy the given
    #   `dependency`.
    def search_for(dependency)
      []
    end

    # Returns the dependencies of `specification`.
    # @note This method should be 'pure', i.e. the return value should depend
    #   only on the `specification` parameter.
    #
    # @param [Object] specification
    # @return [Array<Object>] the dependencies that are required by the given
    #   `specification`.
    def dependencies_for(specification)
      []
    end

    # Determines whether the given `requirement` is satisfied by the given
    # `spec`, in the context of the current `activated` dependency graph.
    #
    # @param [Object] requirement
    # @param [DependencyGraph] activated the current dependency graph in the
    #   resolution process.
    # @param [Object] spec
    # @return [Boolean] whether `requirement` is satisfied by `spec` in the
    #   context of the current `activated` dependency graph.
    def requirement_satisfied_by?(requirement, activated, spec)
      true
    end

    # Determines whether two arrays of dependencies are equal, and thus can be
    # grouped.
    #
    # @param [Array<Object>] dependencies
    # @param [Array<Object>] other_dependencies
    # @return [Boolean] whether `dependencies` and `other_dependencies` should
    #   be considered equal.
    def dependencies_equal?(dependencies, other_dependencies)
      dependencies == other_dependencies
    end

    # Returns the name for the given `dependency`.
    # @note This method should be 'pure', i.e. the return value should depend
    #   only on the `dependency` parameter.
    #
    # @param [Object] dependency
    # @return [String] the name for the given `dependency`.
    def name_for(dependency)
      dependency.to_s
    end

    # @return [String] the name of the source of explicit dependencies, i.e.
    #   those passed to {Resolver#resolve} directly.
    def name_for_explicit_dependency_source
      'user-specified dependency'
    end

    # @return [String] the name of the source of 'locked' dependencies, i.e.
    #   those passed to {Resolver#resolve} directly as the `base`
    def name_for_locking_dependency_source
      'Lockfile'
    end

    # Sort dependencies so that the ones that are easiest to resolve are first.
    # Easiest to resolve is (usually) defined by:
    #   1) Is this dependency already activated?
    #   2) How relaxed are the requirements?
    #   3) Are there any conflicts for this dependency?
    #   4) How many possibilities are there to satisfy this dependency?
    #
    # @param [Array<Object>] dependencies
    # @param [DependencyGraph] activated the current dependency graph in the
    #   resolution process.
    # @param [{String => Array<Conflict>}] conflicts
    # @return [Array<Object>] a sorted copy of `dependencies`.
    def sort_dependencies(dependencies, activated, conflicts)
      dependencies.sort_by do |dependency|
        name = name_for(dependency)
        [
          activated.vertex_named(name).payload ? 0 : 1,
          conflicts[name] ? 0 : 1,
        ]
      end
    end

    # Returns whether this dependency, which has no possible matching
    # specifications, can safely be ignored.
    #
    # @param [Object] dependency
    # @return [Boolean] whether this dependency can safely be skipped.
    def allow_missing?(dependency)
      false
    end
  end
end
PK}$[��=����Qgems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rbnu�[���# frozen_string_literal: true

module Bundler::Molinillo
  class Resolver
    # A specific resolution from a given {Resolver}
    class Resolution
      # A conflict that the resolution process encountered
      # @attr [Object] requirement the requirement that immediately led to the conflict
      # @attr [{String,Nil=>[Object]}] requirements the requirements that caused the conflict
      # @attr [Object, nil] existing the existing spec that was in conflict with
      #   the {#possibility}
      # @attr [Object] possibility_set the set of specs that was unable to be
      #   activated due to a conflict.
      # @attr [Object] locked_requirement the relevant locking requirement.
      # @attr [Array<Array<Object>>] requirement_trees the different requirement
      #   trees that led to every requirement for the conflicting name.
      # @attr [{String=>Object}] activated_by_name the already-activated specs.
      # @attr [Object] underlying_error an error that has occurred during resolution, and
      #    will be raised at the end of it if no resolution is found.
      Conflict = Struct.new(
        :requirement,
        :requirements,
        :existing,
        :possibility_set,
        :locked_requirement,
        :requirement_trees,
        :activated_by_name,
        :underlying_error
      )

      class Conflict
        # @return [Object] a spec that was unable to be activated due to a conflict
        def possibility
          possibility_set && possibility_set.latest_version
        end
      end

      # A collection of possibility states that share the same dependencies
      # @attr [Array] dependencies the dependencies for this set of possibilities
      # @attr [Array] possibilities the possibilities
      PossibilitySet = Struct.new(:dependencies, :possibilities)

      class PossibilitySet
        # String representation of the possibility set, for debugging
        def to_s
          "[#{possibilities.join(', ')}]"
        end

        # @return [Object] most up-to-date dependency in the possibility set
        def latest_version
          possibilities.last
        end
      end

      # Details of the state to unwind to when a conflict occurs, and the cause of the unwind
      # @attr [Integer] state_index the index of the state to unwind to
      # @attr [Object] state_requirement the requirement of the state we're unwinding to
      # @attr [Array] requirement_tree for the requirement we're relaxing
      # @attr [Array] conflicting_requirements the requirements that combined to cause the conflict
      # @attr [Array] requirement_trees for the conflict
      # @attr [Array] requirements_unwound_to_instead array of unwind requirements that were chosen over this unwind
      UnwindDetails = Struct.new(
        :state_index,
        :state_requirement,
        :requirement_tree,
        :conflicting_requirements,
        :requirement_trees,
        :requirements_unwound_to_instead
      )

      class UnwindDetails
        include Comparable

        # We compare UnwindDetails when choosing which state to unwind to. If
        # two options have the same state_index we prefer the one most
        # removed from a requirement that caused the conflict. Both options
        # would unwind to the same state, but a `grandparent` option will
        # filter out fewer of its possibilities after doing so - where a state
        # is both a `parent` and a `grandparent` to requirements that have
        # caused a conflict this is the correct behaviour.
        # @param [UnwindDetail] other UnwindDetail to be compared
        # @return [Integer] integer specifying ordering
        def <=>(other)
          if state_index > other.state_index
            1
          elsif state_index == other.state_index
            reversed_requirement_tree_index <=> other.reversed_requirement_tree_index
          else
            -1
          end
        end

        # @return [Integer] index of state requirement in reversed requirement tree
        #    (the conflicting requirement itself will be at position 0)
        def reversed_requirement_tree_index
          @reversed_requirement_tree_index ||=
            if state_requirement
              requirement_tree.reverse.index(state_requirement)
            else
              999_999
            end
        end

        # @return [Boolean] where the requirement of the state we're unwinding
        #    to directly caused the conflict. Note: in this case, it is
        #    impossible for the state we're unwinding to to be a parent of
        #    any of the other conflicting requirements (or we would have
        #    circularity)
        def unwinding_to_primary_requirement?
          requirement_tree.last == state_requirement
        end

        # @return [Array] array of sub-dependencies to avoid when choosing a
        #    new possibility for the state we've unwound to. Only relevant for
        #    non-primary unwinds
        def sub_dependencies_to_avoid
          @requirements_to_avoid ||=
            requirement_trees.map do |tree|
              index = tree.index(state_requirement)
              tree[index + 1] if index
            end.compact
        end

        # @return [Array] array of all the requirements that led to the need for
        #    this unwind
        def all_requirements
          @all_requirements ||= requirement_trees.flatten(1)
        end
      end

      # @return [SpecificationProvider] the provider that knows about
      #   dependencies, requirements, specifications, versions, etc.
      attr_reader :specification_provider

      # @return [UI] the UI that knows how to communicate feedback about the
      #   resolution process back to the user
      attr_reader :resolver_ui

      # @return [DependencyGraph] the base dependency graph to which
      #   dependencies should be 'locked'
      attr_reader :base

      # @return [Array] the dependencies that were explicitly required
      attr_reader :original_requested

      # Initializes a new resolution.
      # @param [SpecificationProvider] specification_provider
      #   see {#specification_provider}
      # @param [UI] resolver_ui see {#resolver_ui}
      # @param [Array] requested see {#original_requested}
      # @param [DependencyGraph] base see {#base}
      def initialize(specification_provider, resolver_ui, requested, base)
        @specification_provider = specification_provider
        @resolver_ui = resolver_ui
        @original_requested = requested
        @base = base
        @states = []
        @iteration_counter = 0
        @parents_of = Hash.new { |h, k| h[k] = [] }
      end

      # Resolves the {#original_requested} dependencies into a full dependency
      #   graph
      # @raise [ResolverError] if successful resolution is impossible
      # @return [DependencyGraph] the dependency graph of successfully resolved
      #   dependencies
      def resolve
        start_resolution

        while state
          break if !state.requirement && state.requirements.empty?
          indicate_progress
          if state.respond_to?(:pop_possibility_state) # DependencyState
            debug(depth) { "Creating possibility state for #{requirement} (#{possibilities.count} remaining)" }
            state.pop_possibility_state.tap do |s|
              if s
                states.push(s)
                activated.tag(s)
              end
            end
          end
          process_topmost_state
        end

        resolve_activated_specs
      ensure
        end_resolution
      end

      # @return [Integer] the number of resolver iterations in between calls to
      #   {#resolver_ui}'s {UI#indicate_progress} method
      attr_accessor :iteration_rate
      private :iteration_rate

      # @return [Time] the time at which resolution began
      attr_accessor :started_at
      private :started_at

      # @return [Array<ResolutionState>] the stack of states for the resolution
      attr_accessor :states
      private :states

      private

      # Sets up the resolution process
      # @return [void]
      def start_resolution
        @started_at = Time.now

        push_initial_state

        debug { "Starting resolution (#{@started_at})\nUser-requested dependencies: #{original_requested}" }
        resolver_ui.before_resolution
      end

      def resolve_activated_specs
        activated.vertices.each do |_, vertex|
          next unless vertex.payload

          latest_version = vertex.payload.possibilities.reverse_each.find do |possibility|
            vertex.requirements.all? { |req| requirement_satisfied_by?(req, activated, possibility) }
          end

          activated.set_payload(vertex.name, latest_version)
        end
        activated.freeze
      end

      # Ends the resolution process
      # @return [void]
      def end_resolution
        resolver_ui.after_resolution
        debug do
          "Finished resolution (#{@iteration_counter} steps) " \
          "(Took #{(ended_at = Time.now) - @started_at} seconds) (#{ended_at})"
        end
        debug { 'Unactivated: ' + Hash[activated.vertices.reject { |_n, v| v.payload }].keys.join(', ') } if state
        debug { 'Activated: ' + Hash[activated.vertices.select { |_n, v| v.payload }].keys.join(', ') } if state
      end

      require_relative 'state'
      require_relative 'modules/specification_provider'

      require_relative 'delegates/resolution_state'
      require_relative 'delegates/specification_provider'

      include Bundler::Molinillo::Delegates::ResolutionState
      include Bundler::Molinillo::Delegates::SpecificationProvider

      # Processes the topmost available {RequirementState} on the stack
      # @return [void]
      def process_topmost_state
        if possibility
          attempt_to_activate
        else
          create_conflict
          unwind_for_conflict
        end
      rescue CircularDependencyError => underlying_error
        create_conflict(underlying_error)
        unwind_for_conflict
      end

      # @return [Object] the current possibility that the resolution is trying
      #   to activate
      def possibility
        possibilities.last
      end

      # @return [RequirementState] the current state the resolution is
      #   operating upon
      def state
        states.last
      end

      # Creates and pushes the initial state for the resolution, based upon the
      # {#requested} dependencies
      # @return [void]
      def push_initial_state
        graph = DependencyGraph.new.tap do |dg|
          original_requested.each do |requested|
            vertex = dg.add_vertex(name_for(requested), nil, true)
            vertex.explicit_requirements << requested
          end
          dg.tag(:initial_state)
        end

        push_state_for_requirements(original_requested, true, graph)
      end

      # Unwinds the states stack because a conflict has been encountered
      # @return [void]
      def unwind_for_conflict
        details_for_unwind = build_details_for_unwind
        unwind_options = unused_unwind_options
        debug(depth) { "Unwinding for conflict: #{requirement} to #{details_for_unwind.state_index / 2}" }
        conflicts.tap do |c|
          sliced_states = states.slice!((details_for_unwind.state_index + 1)..-1)
          raise_error_unless_state(c)
          activated.rewind_to(sliced_states.first || :initial_state) if sliced_states
          state.conflicts = c
          state.unused_unwind_options = unwind_options
          filter_possibilities_after_unwind(details_for_unwind)
          index = states.size - 1
          @parents_of.each { |_, a| a.reject! { |i| i >= index } }
          state.unused_unwind_options.reject! { |uw| uw.state_index >= index }
        end
      end

      # Raises a VersionConflict error, or any underlying error, if there is no
      # current state
      # @return [void]
      def raise_error_unless_state(conflicts)
        return if state

        error = conflicts.values.map(&:underlying_error).compact.first
        raise error || VersionConflict.new(conflicts, specification_provider)
      end

      # @return [UnwindDetails] Details of the nearest index to which we could unwind
      def build_details_for_unwind
        # Get the possible unwinds for the current conflict
        current_conflict = conflicts[name]
        binding_requirements = binding_requirements_for_conflict(current_conflict)
        unwind_details = unwind_options_for_requirements(binding_requirements)

        last_detail_for_current_unwind = unwind_details.sort.last
        current_detail = last_detail_for_current_unwind

        # Look for past conflicts that could be unwound to affect the
        # requirement tree for the current conflict
        all_reqs = last_detail_for_current_unwind.all_requirements
        all_reqs_size = all_reqs.size
        relevant_unused_unwinds = unused_unwind_options.select do |alternative|
          diff_reqs = all_reqs - alternative.requirements_unwound_to_instead
          next if diff_reqs.size == all_reqs_size
          # Find the highest index unwind whilst looping through
          current_detail = alternative if alternative > current_detail
          alternative
        end

        # Add the current unwind options to the `unused_unwind_options` array.
        # The "used" option will be filtered out during `unwind_for_conflict`.
        state.unused_unwind_options += unwind_details.reject { |detail| detail.state_index == -1 }

        # Update the requirements_unwound_to_instead on any relevant unused unwinds
        relevant_unused_unwinds.each do |d|
          (d.requirements_unwound_to_instead << current_detail.state_requirement).uniq!
        end
        unwind_details.each do |d|
          (d.requirements_unwound_to_instead << current_detail.state_requirement).uniq!
        end

        current_detail
      end

      # @param [Array<Object>] binding_requirements array of requirements that combine to create a conflict
      # @return [Array<UnwindDetails>] array of UnwindDetails that have a chance
      #    of resolving the passed requirements
      def unwind_options_for_requirements(binding_requirements)
        unwind_details = []

        trees = []
        binding_requirements.reverse_each do |r|
          partial_tree = [r]
          trees << partial_tree
          unwind_details << UnwindDetails.new(-1, nil, partial_tree, binding_requirements, trees, [])

          # If this requirement has alternative possibilities, check if any would
          # satisfy the other requirements that created this conflict
          requirement_state = find_state_for(r)
          if conflict_fixing_possibilities?(requirement_state, binding_requirements)
            unwind_details << UnwindDetails.new(
              states.index(requirement_state),
              r,
              partial_tree,
              binding_requirements,
              trees,
              []
            )
          end

          # Next, look at the parent of this requirement, and check if the requirement
          # could have been avoided if an alternative PossibilitySet had been chosen
          parent_r = parent_of(r)
          next if parent_r.nil?
          partial_tree.unshift(parent_r)
          requirement_state = find_state_for(parent_r)
          if requirement_state.possibilities.any? { |set| !set.dependencies.include?(r) }
            unwind_details << UnwindDetails.new(
              states.index(requirement_state),
              parent_r,
              partial_tree,
              binding_requirements,
              trees,
              []
            )
          end

          # Finally, look at the grandparent and up of this requirement, looking
          # for any possibilities that wouldn't create their parent requirement
          grandparent_r = parent_of(parent_r)
          until grandparent_r.nil?
            partial_tree.unshift(grandparent_r)
            requirement_state = find_state_for(grandparent_r)
            if requirement_state.possibilities.any? { |set| !set.dependencies.include?(parent_r) }
              unwind_details << UnwindDetails.new(
                states.index(requirement_state),
                grandparent_r,
                partial_tree,
                binding_requirements,
                trees,
                []
              )
            end
            parent_r = grandparent_r
            grandparent_r = parent_of(parent_r)
          end
        end

        unwind_details
      end

      # @param [DependencyState] state
      # @param [Array] binding_requirements array of requirements
      # @return [Boolean] whether or not the given state has any possibilities
      #    that could satisfy the given requirements
      def conflict_fixing_possibilities?(state, binding_requirements)
        return false unless state

        state.possibilities.any? do |possibility_set|
          possibility_set.possibilities.any? do |poss|
            possibility_satisfies_requirements?(poss, binding_requirements)
          end
        end
      end

      # Filter's a state's possibilities to remove any that would not fix the
      # conflict we've just rewound from
      # @param [UnwindDetails] unwind_details details of the conflict just
      #   unwound from
      # @return [void]
      def filter_possibilities_after_unwind(unwind_details)
        return unless state && !state.possibilities.empty?

        if unwind_details.unwinding_to_primary_requirement?
          filter_possibilities_for_primary_unwind(unwind_details)
        else
          filter_possibilities_for_parent_unwind(unwind_details)
        end
      end

      # Filter's a state's possibilities to remove any that would not satisfy
      # the requirements in the conflict we've just rewound from
      # @param [UnwindDetails] unwind_details details of the conflict just unwound from
      # @return [void]
      def filter_possibilities_for_primary_unwind(unwind_details)
        unwinds_to_state = unused_unwind_options.select { |uw| uw.state_index == unwind_details.state_index }
        unwinds_to_state << unwind_details
        unwind_requirement_sets = unwinds_to_state.map(&:conflicting_requirements)

        state.possibilities.reject! do |possibility_set|
          possibility_set.possibilities.none? do |poss|
            unwind_requirement_sets.any? do |requirements|
              possibility_satisfies_requirements?(poss, requirements)
            end
          end
        end
      end

      # @param [Object] possibility a single possibility
      # @param [Array] requirements an array of requirements
      # @return [Boolean] whether the possibility satisfies all of the
      #    given requirements
      def possibility_satisfies_requirements?(possibility, requirements)
        name = name_for(possibility)

        activated.tag(:swap)
        activated.set_payload(name, possibility) if activated.vertex_named(name)
        satisfied = requirements.all? { |r| requirement_satisfied_by?(r, activated, possibility) }
        activated.rewind_to(:swap)

        satisfied
      end

      # Filter's a state's possibilities to remove any that would (eventually)
      # create a requirement in the conflict we've just rewound from
      # @param [UnwindDetails] unwind_details details of the conflict just unwound from
      # @return [void]
      def filter_possibilities_for_parent_unwind(unwind_details)
        unwinds_to_state = unused_unwind_options.select { |uw| uw.state_index == unwind_details.state_index }
        unwinds_to_state << unwind_details

        primary_unwinds = unwinds_to_state.select(&:unwinding_to_primary_requirement?).uniq
        parent_unwinds = unwinds_to_state.uniq - primary_unwinds

        allowed_possibility_sets = primary_unwinds.flat_map do |unwind|
          states[unwind.state_index].possibilities.select do |possibility_set|
            possibility_set.possibilities.any? do |poss|
              possibility_satisfies_requirements?(poss, unwind.conflicting_requirements)
            end
          end
        end

        requirements_to_avoid = parent_unwinds.flat_map(&:sub_dependencies_to_avoid)

        state.possibilities.reject! do |possibility_set|
          !allowed_possibility_sets.include?(possibility_set) &&
            (requirements_to_avoid - possibility_set.dependencies).empty?
        end
      end

      # @param [Conflict] conflict
      # @return [Array] minimal array of requirements that would cause the passed
      #    conflict to occur.
      def binding_requirements_for_conflict(conflict)
        return [conflict.requirement] if conflict.possibility.nil?

        possible_binding_requirements = conflict.requirements.values.flatten(1).uniq

        # When there's a `CircularDependency` error the conflicting requirement
        # (the one causing the circular) won't be `conflict.requirement`
        # (which won't be for the right state, because we won't have created it,
        # because it's circular).
        # We need to make sure we have that requirement in the conflict's list,
        # otherwise we won't be able to unwind properly, so we just return all
        # the requirements for the conflict.
        return possible_binding_requirements if conflict.underlying_error

        possibilities = search_for(conflict.requirement)

        # If all the requirements together don't filter out all possibilities,
        # then the only two requirements we need to consider are the initial one
        # (where the dependency's version was first chosen) and the last
        if binding_requirement_in_set?(nil, possible_binding_requirements, possibilities)
          return [conflict.requirement, requirement_for_existing_name(name_for(conflict.requirement))].compact
        end

        # Loop through the possible binding requirements, removing each one
        # that doesn't bind. Use a `reverse_each` as we want the earliest set of
        # binding requirements, and don't use `reject!` as we wish to refine the
        # array *on each iteration*.
        binding_requirements = possible_binding_requirements.dup
        possible_binding_requirements.reverse_each do |req|
          next if req == conflict.requirement
          unless binding_requirement_in_set?(req, binding_requirements, possibilities)
            binding_requirements -= [req]
          end
        end

        binding_requirements
      end

      # @param [Object] requirement we wish to check
      # @param [Array] possible_binding_requirements array of requirements
      # @param [Array] possibilities array of possibilities the requirements will be used to filter
      # @return [Boolean] whether or not the given requirement is required to filter
      #    out all elements of the array of possibilities.
      def binding_requirement_in_set?(requirement, possible_binding_requirements, possibilities)
        possibilities.any? do |poss|
          possibility_satisfies_requirements?(poss, possible_binding_requirements - [requirement])
        end
      end

      # @param [Object] requirement
      # @return [Object] the requirement that led to `requirement` being added
      #   to the list of requirements.
      def parent_of(requirement)
        return unless requirement
        return unless index = @parents_of[requirement].last
        return unless parent_state = @states[index]
        parent_state.requirement
      end

      # @param [String] name
      # @return [Object] the requirement that led to a version of a possibility
      #   with the given name being activated.
      def requirement_for_existing_name(name)
        return nil unless vertex = activated.vertex_named(name)
        return nil unless vertex.payload
        states.find { |s| s.name == name }.requirement
      end

      # @param [Object] requirement
      # @return [ResolutionState] the state whose `requirement` is the given
      #   `requirement`.
      def find_state_for(requirement)
        return nil unless requirement
        states.find { |i| requirement == i.requirement }
      end

      # @param [Object] underlying_error
      # @return [Conflict] a {Conflict} that reflects the failure to activate
      #   the {#possibility} in conjunction with the current {#state}
      def create_conflict(underlying_error = nil)
        vertex = activated.vertex_named(name)
        locked_requirement = locked_requirement_named(name)

        requirements = {}
        unless vertex.explicit_requirements.empty?
          requirements[name_for_explicit_dependency_source] = vertex.explicit_requirements
        end
        requirements[name_for_locking_dependency_source] = [locked_requirement] if locked_requirement
        vertex.incoming_edges.each do |edge|
          (requirements[edge.origin.payload.latest_version] ||= []).unshift(edge.requirement)
        end

        activated_by_name = {}
        activated.each { |v| activated_by_name[v.name] = v.payload.latest_version if v.payload }
        conflicts[name] = Conflict.new(
          requirement,
          requirements,
          vertex.payload && vertex.payload.latest_version,
          possibility,
          locked_requirement,
          requirement_trees,
          activated_by_name,
          underlying_error
        )
      end

      # @return [Array<Array<Object>>] The different requirement
      #   trees that led to every requirement for the current spec.
      def requirement_trees
        vertex = activated.vertex_named(name)
        vertex.requirements.map { |r| requirement_tree_for(r) }
      end

      # @param [Object] requirement
      # @return [Array<Object>] the list of requirements that led to
      #   `requirement` being required.
      def requirement_tree_for(requirement)
        tree = []
        while requirement
          tree.unshift(requirement)
          requirement = parent_of(requirement)
        end
        tree
      end

      # Indicates progress roughly once every second
      # @return [void]
      def indicate_progress
        @iteration_counter += 1
        @progress_rate ||= resolver_ui.progress_rate
        if iteration_rate.nil?
          if Time.now - started_at >= @progress_rate
            self.iteration_rate = @iteration_counter
          end
        end

        if iteration_rate && (@iteration_counter % iteration_rate) == 0
          resolver_ui.indicate_progress
        end
      end

      # Calls the {#resolver_ui}'s {UI#debug} method
      # @param [Integer] depth the depth of the {#states} stack
      # @param [Proc] block a block that yields a {#to_s}
      # @return [void]
      def debug(depth = 0, &block)
        resolver_ui.debug(depth, &block)
      end

      # Attempts to activate the current {#possibility}
      # @return [void]
      def attempt_to_activate
        debug(depth) { 'Attempting to activate ' + possibility.to_s }
        existing_vertex = activated.vertex_named(name)
        if existing_vertex.payload
          debug(depth) { "Found existing spec (#{existing_vertex.payload})" }
          attempt_to_filter_existing_spec(existing_vertex)
        else
          latest = possibility.latest_version
          possibility.possibilities.select! do |possibility|
            requirement_satisfied_by?(requirement, activated, possibility)
          end
          if possibility.latest_version.nil?
            # ensure there's a possibility for better error messages
            possibility.possibilities << latest if latest
            create_conflict
            unwind_for_conflict
          else
            activate_new_spec
          end
        end
      end

      # Attempts to update the existing vertex's `PossibilitySet` with a filtered version
      # @return [void]
      def attempt_to_filter_existing_spec(vertex)
        filtered_set = filtered_possibility_set(vertex)
        if !filtered_set.possibilities.empty?
          activated.set_payload(name, filtered_set)
          new_requirements = requirements.dup
          push_state_for_requirements(new_requirements, false)
        else
          create_conflict
          debug(depth) { "Unsatisfied by existing spec (#{vertex.payload})" }
          unwind_for_conflict
        end
      end

      # Generates a filtered version of the existing vertex's `PossibilitySet` using the
      # current state's `requirement`
      # @param [Object] vertex existing vertex
      # @return [PossibilitySet] filtered possibility set
      def filtered_possibility_set(vertex)
        PossibilitySet.new(vertex.payload.dependencies, vertex.payload.possibilities & possibility.possibilities)
      end

      # @param [String] requirement_name the spec name to search for
      # @return [Object] the locked spec named `requirement_name`, if one
      #   is found on {#base}
      def locked_requirement_named(requirement_name)
        vertex = base.vertex_named(requirement_name)
        vertex && vertex.payload
      end

      # Add the current {#possibility} to the dependency graph of the current
      # {#state}
      # @return [void]
      def activate_new_spec
        conflicts.delete(name)
        debug(depth) { "Activated #{name} at #{possibility}" }
        activated.set_payload(name, possibility)
        require_nested_dependencies_for(possibility)
      end

      # Requires the dependencies that the recently activated spec has
      # @param [Object] possibility_set the PossibilitySet that has just been
      #   activated
      # @return [void]
      def require_nested_dependencies_for(possibility_set)
        nested_dependencies = dependencies_for(possibility_set.latest_version)
        debug(depth) { "Requiring nested dependencies (#{nested_dependencies.join(', ')})" }
        nested_dependencies.each do |d|
          activated.add_child_vertex(name_for(d), nil, [name_for(possibility_set.latest_version)], d)
          parent_index = states.size - 1
          parents = @parents_of[d]
          parents << parent_index if parents.empty?
        end

        push_state_for_requirements(requirements + nested_dependencies, !nested_dependencies.empty?)
      end

      # Pushes a new {DependencyState} that encapsulates both existing and new
      # requirements
      # @param [Array] new_requirements
      # @param [Boolean] requires_sort
      # @param [Object] new_activated
      # @return [void]
      def push_state_for_requirements(new_requirements, requires_sort = true, new_activated = activated)
        new_requirements = sort_dependencies(new_requirements.uniq, new_activated, conflicts) if requires_sort
        new_requirement = nil
        loop do
          new_requirement = new_requirements.shift
          break if new_requirement.nil? || states.none? { |s| s.requirement == new_requirement }
        end
        new_name = new_requirement ? name_for(new_requirement) : ''.freeze
        possibilities = possibilities_for_requirement(new_requirement)
        handle_missing_or_push_dependency_state DependencyState.new(
          new_name, new_requirements, new_activated,
          new_requirement, possibilities, depth, conflicts.dup, unused_unwind_options.dup
        )
      end

      # Checks a proposed requirement with any existing locked requirement
      # before generating an array of possibilities for it.
      # @param [Object] requirement the proposed requirement
      # @param [Object] activated
      # @return [Array] possibilities
      def possibilities_for_requirement(requirement, activated = self.activated)
        return [] unless requirement
        if locked_requirement_named(name_for(requirement))
          return locked_requirement_possibility_set(requirement, activated)
        end

        group_possibilities(search_for(requirement))
      end

      # @param [Object] requirement the proposed requirement
      # @param [Object] activated
      # @return [Array] possibility set containing only the locked requirement, if any
      def locked_requirement_possibility_set(requirement, activated = self.activated)
        all_possibilities = search_for(requirement)
        locked_requirement = locked_requirement_named(name_for(requirement))

        # Longwinded way to build a possibilities array with either the locked
        # requirement or nothing in it. Required, since the API for
        # locked_requirement isn't guaranteed.
        locked_possibilities = all_possibilities.select do |possibility|
          requirement_satisfied_by?(locked_requirement, activated, possibility)
        end

        group_possibilities(locked_possibilities)
      end

      # Build an array of PossibilitySets, with each element representing a group of
      # dependency versions that all have the same sub-dependency version constraints
      # and are contiguous.
      # @param [Array] possibilities an array of possibilities
      # @return [Array<PossibilitySet>] an array of possibility sets
      def group_possibilities(possibilities)
        possibility_sets = []
        current_possibility_set = nil

        possibilities.reverse_each do |possibility|
          dependencies = dependencies_for(possibility)
          if current_possibility_set && dependencies_equal?(current_possibility_set.dependencies, dependencies)
            current_possibility_set.possibilities.unshift(possibility)
          else
            possibility_sets.unshift(PossibilitySet.new(dependencies, [possibility]))
            current_possibility_set = possibility_sets.first
          end
        end

        possibility_sets
      end

      # Pushes a new {DependencyState}.
      # If the {#specification_provider} says to
      # {SpecificationProvider#allow_missing?} that particular requirement, and
      # there are no possibilities for that requirement, then `state` is not
      # pushed, and the vertex in {#activated} is removed, and we continue
      # resolving the remaining requirements.
      # @param [DependencyState] state
      # @return [void]
      def handle_missing_or_push_dependency_state(state)
        if state.requirement && state.possibilities.empty? && allow_missing?(state.requirement)
          state.activated.detach_vertex_named(state.name)
          push_state_for_requirements(state.requirements.dup, false, state.activated)
        else
          states.push(state).tap { activated.tag(state) }
        end
      end
    end
  end
end
PK}$[c�Ou((Lgems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/state.rbnu�[���# frozen_string_literal: true

module Bundler::Molinillo
  # A state that a {Resolution} can be in
  # @attr [String] name the name of the current requirement
  # @attr [Array<Object>] requirements currently unsatisfied requirements
  # @attr [DependencyGraph] activated the graph of activated dependencies
  # @attr [Object] requirement the current requirement
  # @attr [Object] possibilities the possibilities to satisfy the current requirement
  # @attr [Integer] depth the depth of the resolution
  # @attr [Hash] conflicts unresolved conflicts, indexed by dependency name
  # @attr [Array<UnwindDetails>] unused_unwind_options unwinds for previous conflicts that weren't explored
  ResolutionState = Struct.new(
    :name,
    :requirements,
    :activated,
    :requirement,
    :possibilities,
    :depth,
    :conflicts,
    :unused_unwind_options
  )

  class ResolutionState
    # Returns an empty resolution state
    # @return [ResolutionState] an empty state
    def self.empty
      new(nil, [], DependencyGraph.new, nil, nil, 0, {}, [])
    end
  end

  # A state that encapsulates a set of {#requirements} with an {Array} of
  # possibilities
  class DependencyState < ResolutionState
    # Removes a possibility from `self`
    # @return [PossibilityState] a state with a single possibility,
    #  the possibility that was removed from `self`
    def pop_possibility_state
      PossibilityState.new(
        name,
        requirements.dup,
        activated,
        requirement,
        [possibilities.pop],
        depth + 1,
        conflicts.dup,
        unused_unwind_options.dup
      ).tap do |state|
        state.activated.tag(state)
      end
    end
  end

  # A state that encapsulates a single possibility to fulfill the given
  # {#requirement}
  class PossibilityState < ResolutionState
  end
end
PK}$[��/:� � Wgems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rbnu�[���# frozen_string_literal: true

require_relative '../../../../vendored_tsort'

require_relative 'dependency_graph/log'
require_relative 'dependency_graph/vertex'

module Bundler::Molinillo
  # A directed acyclic graph that is tuned to hold named dependencies
  class DependencyGraph
    include Enumerable

    # Enumerates through the vertices of the graph.
    # @return [Array<Vertex>] The graph's vertices.
    def each
      return vertices.values.each unless block_given?
      vertices.values.each { |v| yield v }
    end

    include Bundler::TSort

    # @!visibility private
    alias tsort_each_node each

    # @!visibility private
    def tsort_each_child(vertex, &block)
      vertex.successors.each(&block)
    end

    # Topologically sorts the given vertices.
    # @param [Enumerable<Vertex>] vertices the vertices to be sorted, which must
    #   all belong to the same graph.
    # @return [Array<Vertex>] The sorted vertices.
    def self.tsort(vertices)
      Bundler::TSort.tsort(
        lambda { |b| vertices.each(&b) },
        lambda { |v, &b| (v.successors & vertices).each(&b) }
      )
    end

    # A directed edge of a {DependencyGraph}
    # @attr [Vertex] origin The origin of the directed edge
    # @attr [Vertex] destination The destination of the directed edge
    # @attr [Object] requirement The requirement the directed edge represents
    Edge = Struct.new(:origin, :destination, :requirement)

    # @return [{String => Vertex}] the vertices of the dependency graph, keyed
    #   by {Vertex#name}
    attr_reader :vertices

    # @return [Log] the op log for this graph
    attr_reader :log

    # Initializes an empty dependency graph
    def initialize
      @vertices = {}
      @log = Log.new
    end

    # Tags the current state of the dependency as the given tag
    # @param  [Object] tag an opaque tag for the current state of the graph
    # @return [Void]
    def tag(tag)
      log.tag(self, tag)
    end

    # Rewinds the graph to the state tagged as `tag`
    # @param  [Object] tag the tag to rewind to
    # @return [Void]
    def rewind_to(tag)
      log.rewind_to(self, tag)
    end

    # Initializes a copy of a {DependencyGraph}, ensuring that all {#vertices}
    # are properly copied.
    # @param [DependencyGraph] other the graph to copy.
    def initialize_copy(other)
      super
      @vertices = {}
      @log = other.log.dup
      traverse = lambda do |new_v, old_v|
        return if new_v.outgoing_edges.size == old_v.outgoing_edges.size
        old_v.outgoing_edges.each do |edge|
          destination = add_vertex(edge.destination.name, edge.destination.payload)
          add_edge_no_circular(new_v, destination, edge.requirement)
          traverse.call(destination, edge.destination)
        end
      end
      other.vertices.each do |name, vertex|
        new_vertex = add_vertex(name, vertex.payload, vertex.root?)
        new_vertex.explicit_requirements.replace(vertex.explicit_requirements)
        traverse.call(new_vertex, vertex)
      end
    end

    # @return [String] a string suitable for debugging
    def inspect
      "#{self.class}:#{vertices.values.inspect}"
    end

    # @param [Hash] options options for dot output.
    # @return [String] Returns a dot format representation of the graph
    def to_dot(options = {})
      edge_label = options.delete(:edge_label)
      raise ArgumentError, "Unknown options: #{options.keys}" unless options.empty?

      dot_vertices = []
      dot_edges = []
      vertices.each do |n, v|
        dot_vertices << "  #{n} [label=\"{#{n}|#{v.payload}}\"]"
        v.outgoing_edges.each do |e|
          label = edge_label ? edge_label.call(e) : e.requirement
          dot_edges << "  #{e.origin.name} -> #{e.destination.name} [label=#{label.to_s.dump}]"
        end
      end

      dot_vertices.uniq!
      dot_vertices.sort!
      dot_edges.uniq!
      dot_edges.sort!

      dot = dot_vertices.unshift('digraph G {').push('') + dot_edges.push('}')
      dot.join("\n")
    end

    # @param [DependencyGraph] other
    # @return [Boolean] whether the two dependency graphs are equal, determined
    #   by a recursive traversal of each {#root_vertices} and its
    #   {Vertex#successors}
    def ==(other)
      return false unless other
      return true if equal?(other)
      vertices.each do |name, vertex|
        other_vertex = other.vertex_named(name)
        return false unless other_vertex
        return false unless vertex.payload == other_vertex.payload
        return false unless other_vertex.successors.to_set == vertex.successors.to_set
      end
    end

    # @param [String] name
    # @param [Object] payload
    # @param [Array<String>] parent_names
    # @param [Object] requirement the requirement that is requiring the child
    # @return [void]
    def add_child_vertex(name, payload, parent_names, requirement)
      root = !parent_names.delete(nil) { true }
      vertex = add_vertex(name, payload, root)
      vertex.explicit_requirements << requirement if root
      parent_names.each do |parent_name|
        parent_vertex = vertex_named(parent_name)
        add_edge(parent_vertex, vertex, requirement)
      end
      vertex
    end

    # Adds a vertex with the given name, or updates the existing one.
    # @param [String] name
    # @param [Object] payload
    # @return [Vertex] the vertex that was added to `self`
    def add_vertex(name, payload, root = false)
      log.add_vertex(self, name, payload, root)
    end

    # Detaches the {#vertex_named} `name` {Vertex} from the graph, recursively
    # removing any non-root vertices that were orphaned in the process
    # @param [String] name
    # @return [Array<Vertex>] the vertices which have been detached
    def detach_vertex_named(name)
      log.detach_vertex_named(self, name)
    end

    # @param [String] name
    # @return [Vertex,nil] the vertex with the given name
    def vertex_named(name)
      vertices[name]
    end

    # @param [String] name
    # @return [Vertex,nil] the root vertex with the given name
    def root_vertex_named(name)
      vertex = vertex_named(name)
      vertex if vertex && vertex.root?
    end

    # Adds a new {Edge} to the dependency graph
    # @param [Vertex] origin
    # @param [Vertex] destination
    # @param [Object] requirement the requirement that this edge represents
    # @return [Edge] the added edge
    def add_edge(origin, destination, requirement)
      if destination.path_to?(origin)
        raise CircularDependencyError.new(path(destination, origin))
      end
      add_edge_no_circular(origin, destination, requirement)
    end

    # Deletes an {Edge} from the dependency graph
    # @param [Edge] edge
    # @return [Void]
    def delete_edge(edge)
      log.delete_edge(self, edge.origin.name, edge.destination.name, edge.requirement)
    end

    # Sets the payload of the vertex with the given name
    # @param [String] name the name of the vertex
    # @param [Object] payload the payload
    # @return [Void]
    def set_payload(name, payload)
      log.set_payload(self, name, payload)
    end

    private

    # Adds a new {Edge} to the dependency graph without checking for
    # circularity.
    # @param (see #add_edge)
    # @return (see #add_edge)
    def add_edge_no_circular(origin, destination, requirement)
      log.add_edge_no_circular(self, origin.name, destination.name, requirement)
    end

    # Returns the path between two vertices
    # @raise [ArgumentError] if there is no path between the vertices
    # @param [Vertex] from
    # @param [Vertex] to
    # @return [Array<Vertex>] the shortest path from `from` to `to`
    def path(from, to)
      distances = Hash.new(vertices.size + 1)
      distances[from.name] = 0
      predecessors = {}
      each do |vertex|
        vertex.successors.each do |successor|
          if distances[successor.name] > distances[vertex.name] + 1
            distances[successor.name] = distances[vertex.name] + 1
            predecessors[successor] = vertex
          end
        end
      end

      path = [to]
      while before = predecessors[to]
        path << before
        to = before
        break if to == from
      end

      unless path.last.equal?(from)
        raise ArgumentError, "There is no path from #{from.name} to #{to.name}"
      end

      path.reverse
    end
  end
end
PK}$[`�<�
�
Rgems/gems/bundler-2.3.27/lib/bundler/vendor/connection_pool/lib/connection_pool.rbnu�[���require "timeout"
require_relative "connection_pool/version"

class Bundler::ConnectionPool
  class Error < ::RuntimeError; end
  class PoolShuttingDownError < ::Bundler::ConnectionPool::Error; end
  class TimeoutError < ::Timeout::Error; end
end

# Generic connection pool class for sharing a limited number of objects or network connections
# among many threads.  Note: pool elements are lazily created.
#
# Example usage with block (faster):
#
#    @pool = Bundler::ConnectionPool.new { Redis.new }
#    @pool.with do |redis|
#      redis.lpop('my-list') if redis.llen('my-list') > 0
#    end
#
# Using optional timeout override (for that single invocation)
#
#    @pool.with(timeout: 2.0) do |redis|
#      redis.lpop('my-list') if redis.llen('my-list') > 0
#    end
#
# Example usage replacing an existing connection (slower):
#
#    $redis = Bundler::ConnectionPool.wrap { Redis.new }
#
#    def do_work
#      $redis.lpop('my-list') if $redis.llen('my-list') > 0
#    end
#
# Accepts the following options:
# - :size - number of connections to pool, defaults to 5
# - :timeout - amount of time to wait for a connection if none currently available, defaults to 5 seconds
#
class Bundler::ConnectionPool
  DEFAULTS = {size: 5, timeout: 5}

  def self.wrap(options, &block)
    Wrapper.new(options, &block)
  end

  def initialize(options = {}, &block)
    raise ArgumentError, "Connection pool requires a block" unless block

    options = DEFAULTS.merge(options)

    @size = Integer(options.fetch(:size))
    @timeout = options.fetch(:timeout)

    @available = TimedStack.new(@size, &block)
    @key = :"pool-#{@available.object_id}"
    @key_count = :"pool-#{@available.object_id}-count"
  end

  def with(options = {})
    Thread.handle_interrupt(Exception => :never) do
      conn = checkout(options)
      begin
        Thread.handle_interrupt(Exception => :immediate) do
          yield conn
        end
      ensure
        checkin
      end
    end
  end
  alias then with

  def checkout(options = {})
    if ::Thread.current[@key]
      ::Thread.current[@key_count] += 1
      ::Thread.current[@key]
    else
      ::Thread.current[@key_count] = 1
      ::Thread.current[@key] = @available.pop(options[:timeout] || @timeout)
    end
  end

  def checkin
    if ::Thread.current[@key]
      if ::Thread.current[@key_count] == 1
        @available.push(::Thread.current[@key])
        ::Thread.current[@key] = nil
        ::Thread.current[@key_count] = nil
      else
        ::Thread.current[@key_count] -= 1
      end
    else
      raise Bundler::ConnectionPool::Error, "no connections are checked out"
    end

    nil
  end

  ##
  # Shuts down the Bundler::ConnectionPool by passing each connection to +block+ and
  # then removing it from the pool. Attempting to checkout a connection after
  # shutdown will raise +Bundler::ConnectionPool::PoolShuttingDownError+.

  def shutdown(&block)
    @available.shutdown(&block)
  end

  ##
  # Reloads the Bundler::ConnectionPool by passing each connection to +block+ and then
  # removing it the pool. Subsequent checkouts will create new connections as
  # needed.

  def reload(&block)
    @available.shutdown(reload: true, &block)
  end

  # Size of this connection pool
  attr_reader :size

  # Number of pool entries available for checkout at this instant.
  def available
    @available.length
  end
end

require_relative "connection_pool/timed_stack"
require_relative "connection_pool/wrapper"
PK}$[�Y�r66Zgems/gems/bundler-2.3.27/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rbnu�[���class Bundler::ConnectionPool
  VERSION = "2.3.0"
end
PK}$[���ffZgems/gems/bundler-2.3.27/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rbnu�[���class Bundler::ConnectionPool
  class Wrapper < ::BasicObject
    METHODS = [:with, :pool_shutdown, :wrapped_pool]

    def initialize(options = {}, &block)
      @pool = options.fetch(:pool) { ::Bundler::ConnectionPool.new(options, &block) }
    end

    def wrapped_pool
      @pool
    end

    def with(&block)
      @pool.with(&block)
    end

    def pool_shutdown(&block)
      @pool.shutdown(&block)
    end

    def pool_size
      @pool.size
    end

    def pool_available
      @pool.available
    end

    def respond_to?(id, *args)
      METHODS.include?(id) || with { |c| c.respond_to?(id, *args) }
    end

    # rubocop:disable Style/MethodMissingSuper
    # rubocop:disable Style/MissingRespondToMissing
    if ::RUBY_VERSION >= "3.0.0"
      def method_missing(name, *args, **kwargs, &block)
        with do |connection|
          connection.send(name, *args, **kwargs, &block)
        end
      end
    elsif ::RUBY_VERSION >= "2.7.0"
      ruby2_keywords def method_missing(name, *args, &block)
        with do |connection|
          connection.send(name, *args, &block)
        end
      end
    else
      def method_missing(name, *args, &block)
        with do |connection|
          connection.send(name, *args, &block)
        end
      end
    end
    # rubocop:enable Style/MethodMissingSuper
    # rubocop:enable Style/MissingRespondToMissing
  end
end
PK}$[r���[[^gems/gems/bundler-2.3.27/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rbnu�[���##
# The TimedStack manages a pool of homogeneous connections (or any resource
# you wish to manage).  Connections are created lazily up to a given maximum
# number.

# Examples:
#
#    ts = TimedStack.new(1) { MyConnection.new }
#
#    # fetch a connection
#    conn = ts.pop
#
#    # return a connection
#    ts.push conn
#
#    conn = ts.pop
#    ts.pop timeout: 5
#    #=> raises Bundler::ConnectionPool::TimeoutError after 5 seconds

class Bundler::ConnectionPool::TimedStack
  attr_reader :max

  ##
  # Creates a new pool with +size+ connections that are created from the given
  # +block+.

  def initialize(size = 0, &block)
    @create_block = block
    @created = 0
    @que = []
    @max = size
    @mutex = Thread::Mutex.new
    @resource = Thread::ConditionVariable.new
    @shutdown_block = nil
  end

  ##
  # Returns +obj+ to the stack.  +options+ is ignored in TimedStack but may be
  # used by subclasses that extend TimedStack.

  def push(obj, options = {})
    @mutex.synchronize do
      if @shutdown_block
        @shutdown_block.call(obj)
      else
        store_connection obj, options
      end

      @resource.broadcast
    end
  end
  alias << push

  ##
  # Retrieves a connection from the stack.  If a connection is available it is
  # immediately returned.  If no connection is available within the given
  # timeout a Bundler::ConnectionPool::TimeoutError is raised.
  #
  # +:timeout+ is the only checked entry in +options+ and is preferred over
  # the +timeout+ argument (which will be removed in a future release).  Other
  # options may be used by subclasses that extend TimedStack.

  def pop(timeout = 0.5, options = {})
    options, timeout = timeout, 0.5 if Hash === timeout
    timeout = options.fetch :timeout, timeout

    deadline = current_time + timeout
    @mutex.synchronize do
      loop do
        raise Bundler::ConnectionPool::PoolShuttingDownError if @shutdown_block
        return fetch_connection(options) if connection_stored?(options)

        connection = try_create(options)
        return connection if connection

        to_wait = deadline - current_time
        raise Bundler::ConnectionPool::TimeoutError, "Waited #{timeout} sec" if to_wait <= 0
        @resource.wait(@mutex, to_wait)
      end
    end
  end

  ##
  # Shuts down the TimedStack by passing each connection to +block+ and then
  # removing it from the pool. Attempting to checkout a connection after
  # shutdown will raise +Bundler::ConnectionPool::PoolShuttingDownError+ unless
  # +:reload+ is +true+.

  def shutdown(reload: false, &block)
    raise ArgumentError, "shutdown must receive a block" unless block_given?

    @mutex.synchronize do
      @shutdown_block = block
      @resource.broadcast

      shutdown_connections
      @shutdown_block = nil if reload
    end
  end

  ##
  # Returns +true+ if there are no available connections.

  def empty?
    (@created - @que.length) >= @max
  end

  ##
  # The number of connections available on the stack.

  def length
    @max - @created + @que.length
  end

  private

  def current_time
    Process.clock_gettime(Process::CLOCK_MONOTONIC)
  end

  ##
  # This is an extension point for TimedStack and is called with a mutex.
  #
  # This method must returns true if a connection is available on the stack.

  def connection_stored?(options = nil)
    !@que.empty?
  end

  ##
  # This is an extension point for TimedStack and is called with a mutex.
  #
  # This method must return a connection from the stack.

  def fetch_connection(options = nil)
    @que.pop
  end

  ##
  # This is an extension point for TimedStack and is called with a mutex.
  #
  # This method must shut down all connections on the stack.

  def shutdown_connections(options = nil)
    while connection_stored?(options)
      conn = fetch_connection(options)
      @shutdown_block.call(conn)
    end
    @created = 0
  end

  ##
  # This is an extension point for TimedStack and is called with a mutex.
  #
  # This method must return +obj+ to the stack.

  def store_connection(obj, options = nil)
    @que.push obj
  end

  ##
  # This is an extension point for TimedStack and is called with a mutex.
  #
  # This method must create a connection if and only if the total number of
  # connections allowed has not been met.

  def try_create(options = nil)
    unless @created == @max
      object = @create_block.call
      @created += 1
      object
    end
  end
end
PK}$[�c��
�
:gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri.rbnu�[���# frozen_string_literal: false
# Bundler::URI is a module providing classes to handle Uniform Resource Identifiers
# (RFC2396[http://tools.ietf.org/html/rfc2396]).
#
# == Features
#
# * Uniform way of handling URIs.
# * Flexibility to introduce custom Bundler::URI schemes.
# * Flexibility to have an alternate Bundler::URI::Parser (or just different patterns
#   and regexp's).
#
# == Basic example
#
#   require 'bundler/vendor/uri/lib/uri'
#
#   uri = Bundler::URI("http://foo.com/posts?id=30&limit=5#time=1305298413")
#   #=> #<Bundler::URI::HTTP http://foo.com/posts?id=30&limit=5#time=1305298413>
#
#   uri.scheme    #=> "http"
#   uri.host      #=> "foo.com"
#   uri.path      #=> "/posts"
#   uri.query     #=> "id=30&limit=5"
#   uri.fragment  #=> "time=1305298413"
#
#   uri.to_s      #=> "http://foo.com/posts?id=30&limit=5#time=1305298413"
#
# == Adding custom URIs
#
#   module Bundler::URI
#     class RSYNC < Generic
#       DEFAULT_PORT = 873
#     end
#     @@schemes['RSYNC'] = RSYNC
#   end
#   #=> Bundler::URI::RSYNC
#
#   Bundler::URI.scheme_list
#   #=> {"FILE"=>Bundler::URI::File, "FTP"=>Bundler::URI::FTP, "HTTP"=>Bundler::URI::HTTP,
#   #    "HTTPS"=>Bundler::URI::HTTPS, "LDAP"=>Bundler::URI::LDAP, "LDAPS"=>Bundler::URI::LDAPS,
#   #    "MAILTO"=>Bundler::URI::MailTo, "RSYNC"=>Bundler::URI::RSYNC}
#
#   uri = Bundler::URI("rsync://rsync.foo.com")
#   #=> #<Bundler::URI::RSYNC rsync://rsync.foo.com>
#
# == RFC References
#
# A good place to view an RFC spec is http://www.ietf.org/rfc.html.
#
# Here is a list of all related RFC's:
# - RFC822[http://tools.ietf.org/html/rfc822]
# - RFC1738[http://tools.ietf.org/html/rfc1738]
# - RFC2255[http://tools.ietf.org/html/rfc2255]
# - RFC2368[http://tools.ietf.org/html/rfc2368]
# - RFC2373[http://tools.ietf.org/html/rfc2373]
# - RFC2396[http://tools.ietf.org/html/rfc2396]
# - RFC2732[http://tools.ietf.org/html/rfc2732]
# - RFC3986[http://tools.ietf.org/html/rfc3986]
#
# == Class tree
#
# - Bundler::URI::Generic (in uri/generic.rb)
#   - Bundler::URI::File - (in uri/file.rb)
#   - Bundler::URI::FTP - (in uri/ftp.rb)
#   - Bundler::URI::HTTP - (in uri/http.rb)
#     - Bundler::URI::HTTPS - (in uri/https.rb)
#   - Bundler::URI::LDAP - (in uri/ldap.rb)
#     - Bundler::URI::LDAPS - (in uri/ldaps.rb)
#   - Bundler::URI::MailTo - (in uri/mailto.rb)
# - Bundler::URI::Parser - (in uri/common.rb)
# - Bundler::URI::REGEXP - (in uri/common.rb)
#   - Bundler::URI::REGEXP::PATTERN - (in uri/common.rb)
# - Bundler::URI::Util - (in uri/common.rb)
# - Bundler::URI::Escape - (in uri/common.rb)
# - Bundler::URI::Error - (in uri/common.rb)
#   - Bundler::URI::InvalidURIError - (in uri/common.rb)
#   - Bundler::URI::InvalidComponentError - (in uri/common.rb)
#   - Bundler::URI::BadURIError - (in uri/common.rb)
#
# == Copyright Info
#
# Author:: Akira Yamada <akira@ruby-lang.org>
# Documentation::
#   Akira Yamada <akira@ruby-lang.org>
#   Dmitry V. Sabanin <sdmitry@lrn.ru>
#   Vincent Batts <vbatts@hashbangbash.com>
# License::
#  Copyright (c) 2001 akira yamada <akira@ruby-lang.org>
#  You can redistribute it and/or modify it under the same term as Ruby.
#

module Bundler::URI
end

require_relative 'uri/version'
require_relative 'uri/common'
require_relative 'uri/generic'
require_relative 'uri/file'
require_relative 'uri/ftp'
require_relative 'uri/http'
require_relative 'uri/https'
require_relative 'uri/ldap'
require_relative 'uri/ldaps'
require_relative 'uri/mailto'
PK}$[�M/���Bgems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/version.rbnu�[���module Bundler::URI
  # :stopdoc:
  VERSION_CODE = '001001'.freeze
  VERSION = VERSION_CODE.scan(/../).collect{|n| n.to_i}.join('.').freeze
  # :startdoc:
end
PK}$[c`7MM@gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/https.rbnu�[���# frozen_string_literal: false
# = uri/https.rb
#
# Author:: Akira Yamada <akira@ruby-lang.org>
# License:: You can redistribute it and/or modify it under the same term as Ruby.
#
# See Bundler::URI for general documentation
#

require_relative 'http'

module Bundler::URI

  # The default port for HTTPS URIs is 443, and the scheme is 'https:' rather
  # than 'http:'. Other than that, HTTPS URIs are identical to HTTP URIs;
  # see Bundler::URI::HTTP.
  class HTTPS < HTTP
    # A Default port of 443 for Bundler::URI::HTTPS
    DEFAULT_PORT = 443
  end
  @@schemes['HTTPS'] = HTTPS
end
PK}$[墣.E.EIgems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rbnu�[���# frozen_string_literal: false
#--
# = uri/common.rb
#
# Author:: Akira Yamada <akira@ruby-lang.org>
# License::
#   You can redistribute it and/or modify it under the same term as Ruby.
#
# See Bundler::URI for general documentation
#

module Bundler::URI
  #
  # Includes Bundler::URI::REGEXP::PATTERN
  #
  module RFC2396_REGEXP
    #
    # Patterns used to parse Bundler::URI's
    #
    module PATTERN
      # :stopdoc:

      # RFC 2396 (Bundler::URI Generic Syntax)
      # RFC 2732 (IPv6 Literal Addresses in URL's)
      # RFC 2373 (IPv6 Addressing Architecture)

      # alpha         = lowalpha | upalpha
      ALPHA = "a-zA-Z"
      # alphanum      = alpha | digit
      ALNUM = "#{ALPHA}\\d"

      # hex           = digit | "A" | "B" | "C" | "D" | "E" | "F" |
      #                         "a" | "b" | "c" | "d" | "e" | "f"
      HEX     = "a-fA-F\\d"
      # escaped       = "%" hex hex
      ESCAPED = "%[#{HEX}]{2}"
      # mark          = "-" | "_" | "." | "!" | "~" | "*" | "'" |
      #                 "(" | ")"
      # unreserved    = alphanum | mark
      UNRESERVED = "\\-_.!~*'()#{ALNUM}"
      # reserved      = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
      #                 "$" | ","
      # reserved      = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
      #                 "$" | "," | "[" | "]" (RFC 2732)
      RESERVED = ";/?:@&=+$,\\[\\]"

      # domainlabel   = alphanum | alphanum *( alphanum | "-" ) alphanum
      DOMLABEL = "(?:[#{ALNUM}](?:[-#{ALNUM}]*[#{ALNUM}])?)"
      # toplabel      = alpha | alpha *( alphanum | "-" ) alphanum
      TOPLABEL = "(?:[#{ALPHA}](?:[-#{ALNUM}]*[#{ALNUM}])?)"
      # hostname      = *( domainlabel "." ) toplabel [ "." ]
      HOSTNAME = "(?:#{DOMLABEL}\\.)*#{TOPLABEL}\\.?"

      # :startdoc:
    end # PATTERN

    # :startdoc:
  end # REGEXP

  # Class that parses String's into Bundler::URI's.
  #
  # It contains a Hash set of patterns and Regexp's that match and validate.
  #
  class RFC2396_Parser
    include RFC2396_REGEXP

    #
    # == Synopsis
    #
    #   Bundler::URI::Parser.new([opts])
    #
    # == Args
    #
    # The constructor accepts a hash as options for parser.
    # Keys of options are pattern names of Bundler::URI components
    # and values of options are pattern strings.
    # The constructor generates set of regexps for parsing URIs.
    #
    # You can use the following keys:
    #
    #   * :ESCAPED (Bundler::URI::PATTERN::ESCAPED in default)
    #   * :UNRESERVED (Bundler::URI::PATTERN::UNRESERVED in default)
    #   * :DOMLABEL (Bundler::URI::PATTERN::DOMLABEL in default)
    #   * :TOPLABEL (Bundler::URI::PATTERN::TOPLABEL in default)
    #   * :HOSTNAME (Bundler::URI::PATTERN::HOSTNAME in default)
    #
    # == Examples
    #
    #   p = Bundler::URI::Parser.new(:ESCAPED => "(?:%[a-fA-F0-9]{2}|%u[a-fA-F0-9]{4})")
    #   u = p.parse("http://example.jp/%uABCD") #=> #<Bundler::URI::HTTP http://example.jp/%uABCD>
    #   Bundler::URI.parse(u.to_s) #=> raises Bundler::URI::InvalidURIError
    #
    #   s = "http://example.com/ABCD"
    #   u1 = p.parse(s) #=> #<Bundler::URI::HTTP http://example.com/ABCD>
    #   u2 = Bundler::URI.parse(s) #=> #<Bundler::URI::HTTP http://example.com/ABCD>
    #   u1 == u2 #=> true
    #   u1.eql?(u2) #=> false
    #
    def initialize(opts = {})
      @pattern = initialize_pattern(opts)
      @pattern.each_value(&:freeze)
      @pattern.freeze

      @regexp = initialize_regexp(@pattern)
      @regexp.each_value(&:freeze)
      @regexp.freeze
    end

    # The Hash of patterns.
    #
    # See also Bundler::URI::Parser.initialize_pattern.
    attr_reader :pattern

    # The Hash of Regexp.
    #
    # See also Bundler::URI::Parser.initialize_regexp.
    attr_reader :regexp

    # Returns a split Bundler::URI against regexp[:ABS_URI].
    def split(uri)
      case uri
      when ''
        # null uri

      when @regexp[:ABS_URI]
        scheme, opaque, userinfo, host, port,
          registry, path, query, fragment = $~[1..-1]

        # Bundler::URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]

        # absoluteURI   = scheme ":" ( hier_part | opaque_part )
        # hier_part     = ( net_path | abs_path ) [ "?" query ]
        # opaque_part   = uric_no_slash *uric

        # abs_path      = "/"  path_segments
        # net_path      = "//" authority [ abs_path ]

        # authority     = server | reg_name
        # server        = [ [ userinfo "@" ] hostport ]

        if !scheme
          raise InvalidURIError,
            "bad Bundler::URI(absolute but no scheme): #{uri}"
        end
        if !opaque && (!path && (!host && !registry))
          raise InvalidURIError,
            "bad Bundler::URI(absolute but no path): #{uri}"
        end

      when @regexp[:REL_URI]
        scheme = nil
        opaque = nil

        userinfo, host, port, registry,
          rel_segment, abs_path, query, fragment = $~[1..-1]
        if rel_segment && abs_path
          path = rel_segment + abs_path
        elsif rel_segment
          path = rel_segment
        elsif abs_path
          path = abs_path
        end

        # Bundler::URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]

        # relativeURI   = ( net_path | abs_path | rel_path ) [ "?" query ]

        # net_path      = "//" authority [ abs_path ]
        # abs_path      = "/"  path_segments
        # rel_path      = rel_segment [ abs_path ]

        # authority     = server | reg_name
        # server        = [ [ userinfo "@" ] hostport ]

      else
        raise InvalidURIError, "bad Bundler::URI(is not Bundler::URI?): #{uri}"
      end

      path = '' if !path && !opaque # (see RFC2396 Section 5.2)
      ret = [
        scheme,
        userinfo, host, port,         # X
        registry,                     # X
        path,                         # Y
        opaque,                       # Y
        query,
        fragment
      ]
      return ret
    end

    #
    # == Args
    #
    # +uri+::
    #    String
    #
    # == Description
    #
    # Parses +uri+ and constructs either matching Bundler::URI scheme object
    # (File, FTP, HTTP, HTTPS, LDAP, LDAPS, or MailTo) or Bundler::URI::Generic.
    #
    # == Usage
    #
    #   p = Bundler::URI::Parser.new
    #   p.parse("ldap://ldap.example.com/dc=example?user=john")
    #   #=> #<Bundler::URI::LDAP ldap://ldap.example.com/dc=example?user=john>
    #
    def parse(uri)
      Bundler::URI.for(*self.split(uri), self)
    end

    #
    # == Args
    #
    # +uris+::
    #    an Array of Strings
    #
    # == Description
    #
    # Attempts to parse and merge a set of URIs.
    #
    def join(*uris)
      uris[0] = convert_to_uri(uris[0])
      uris.inject :merge
    end

    #
    # :call-seq:
    #   extract( str )
    #   extract( str, schemes )
    #   extract( str, schemes ) {|item| block }
    #
    # == Args
    #
    # +str+::
    #    String to search
    # +schemes+::
    #    Patterns to apply to +str+
    #
    # == Description
    #
    # Attempts to parse and merge a set of URIs.
    # If no +block+ given, then returns the result,
    # else it calls +block+ for each element in result.
    #
    # See also Bundler::URI::Parser.make_regexp.
    #
    def extract(str, schemes = nil)
      if block_given?
        str.scan(make_regexp(schemes)) { yield $& }
        nil
      else
        result = []
        str.scan(make_regexp(schemes)) { result.push $& }
        result
      end
    end

    # Returns Regexp that is default self.regexp[:ABS_URI_REF],
    # unless +schemes+ is provided. Then it is a Regexp.union with self.pattern[:X_ABS_URI].
    def make_regexp(schemes = nil)
      unless schemes
        @regexp[:ABS_URI_REF]
      else
        /(?=#{Regexp.union(*schemes)}:)#{@pattern[:X_ABS_URI]}/x
      end
    end

    #
    # :call-seq:
    #   escape( str )
    #   escape( str, unsafe )
    #
    # == Args
    #
    # +str+::
    #    String to make safe
    # +unsafe+::
    #    Regexp to apply. Defaults to self.regexp[:UNSAFE]
    #
    # == Description
    #
    # Constructs a safe String from +str+, removing unsafe characters,
    # replacing them with codes.
    #
    def escape(str, unsafe = @regexp[:UNSAFE])
      unless unsafe.kind_of?(Regexp)
        # perhaps unsafe is String object
        unsafe = Regexp.new("[#{Regexp.quote(unsafe)}]", false)
      end
      str.gsub(unsafe) do
        us = $&
        tmp = ''
        us.each_byte do |uc|
          tmp << sprintf('%%%02X', uc)
        end
        tmp
      end.force_encoding(Encoding::US_ASCII)
    end

    #
    # :call-seq:
    #   unescape( str )
    #   unescape( str, escaped )
    #
    # == Args
    #
    # +str+::
    #    String to remove escapes from
    # +escaped+::
    #    Regexp to apply. Defaults to self.regexp[:ESCAPED]
    #
    # == Description
    #
    # Removes escapes from +str+.
    #
    def unescape(str, escaped = @regexp[:ESCAPED])
      enc = str.encoding
      enc = Encoding::UTF_8 if enc == Encoding::US_ASCII
      str.gsub(escaped) { [$&[1, 2]].pack('H2').force_encoding(enc) }
    end

    @@to_s = Kernel.instance_method(:to_s)
    def inspect
      @@to_s.bind_call(self)
    end

    private

    # Constructs the default Hash of patterns.
    def initialize_pattern(opts = {})
      ret = {}
      ret[:ESCAPED] = escaped = (opts.delete(:ESCAPED) || PATTERN::ESCAPED)
      ret[:UNRESERVED] = unreserved = opts.delete(:UNRESERVED) || PATTERN::UNRESERVED
      ret[:RESERVED] = reserved = opts.delete(:RESERVED) || PATTERN::RESERVED
      ret[:DOMLABEL] = opts.delete(:DOMLABEL) || PATTERN::DOMLABEL
      ret[:TOPLABEL] = opts.delete(:TOPLABEL) || PATTERN::TOPLABEL
      ret[:HOSTNAME] = hostname = opts.delete(:HOSTNAME)

      # RFC 2396 (Bundler::URI Generic Syntax)
      # RFC 2732 (IPv6 Literal Addresses in URL's)
      # RFC 2373 (IPv6 Addressing Architecture)

      # uric          = reserved | unreserved | escaped
      ret[:URIC] = uric = "(?:[#{unreserved}#{reserved}]|#{escaped})"
      # uric_no_slash = unreserved | escaped | ";" | "?" | ":" | "@" |
      #                 "&" | "=" | "+" | "$" | ","
      ret[:URIC_NO_SLASH] = uric_no_slash = "(?:[#{unreserved};?:@&=+$,]|#{escaped})"
      # query         = *uric
      ret[:QUERY] = query = "#{uric}*"
      # fragment      = *uric
      ret[:FRAGMENT] = fragment = "#{uric}*"

      # hostname      = *( domainlabel "." ) toplabel [ "." ]
      # reg-name      = *( unreserved / pct-encoded / sub-delims ) # RFC3986
      unless hostname
        ret[:HOSTNAME] = hostname = "(?:[a-zA-Z0-9\\-.]|%\\h\\h)+"
      end

      # RFC 2373, APPENDIX B:
      # IPv6address = hexpart [ ":" IPv4address ]
      # IPv4address   = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT
      # hexpart = hexseq | hexseq "::" [ hexseq ] | "::" [ hexseq ]
      # hexseq  = hex4 *( ":" hex4)
      # hex4    = 1*4HEXDIG
      #
      # XXX: This definition has a flaw. "::" + IPv4address must be
      # allowed too.  Here is a replacement.
      #
      # IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT
      ret[:IPV4ADDR] = ipv4addr = "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"
      # hex4     = 1*4HEXDIG
      hex4 = "[#{PATTERN::HEX}]{1,4}"
      # lastpart = hex4 | IPv4address
      lastpart = "(?:#{hex4}|#{ipv4addr})"
      # hexseq1  = *( hex4 ":" ) hex4
      hexseq1 = "(?:#{hex4}:)*#{hex4}"
      # hexseq2  = *( hex4 ":" ) lastpart
      hexseq2 = "(?:#{hex4}:)*#{lastpart}"
      # IPv6address = hexseq2 | [ hexseq1 ] "::" [ hexseq2 ]
      ret[:IPV6ADDR] = ipv6addr = "(?:#{hexseq2}|(?:#{hexseq1})?::(?:#{hexseq2})?)"

      # IPv6prefix  = ( hexseq1 | [ hexseq1 ] "::" [ hexseq1 ] ) "/" 1*2DIGIT
      # unused

      # ipv6reference = "[" IPv6address "]" (RFC 2732)
      ret[:IPV6REF] = ipv6ref = "\\[#{ipv6addr}\\]"

      # host          = hostname | IPv4address
      # host          = hostname | IPv4address | IPv6reference (RFC 2732)
      ret[:HOST] = host = "(?:#{hostname}|#{ipv4addr}|#{ipv6ref})"
      # port          = *digit
      ret[:PORT] = port = '\d*'
      # hostport      = host [ ":" port ]
      ret[:HOSTPORT] = hostport = "#{host}(?::#{port})?"

      # userinfo      = *( unreserved | escaped |
      #                    ";" | ":" | "&" | "=" | "+" | "$" | "," )
      ret[:USERINFO] = userinfo = "(?:[#{unreserved};:&=+$,]|#{escaped})*"

      # pchar         = unreserved | escaped |
      #                 ":" | "@" | "&" | "=" | "+" | "$" | ","
      pchar = "(?:[#{unreserved}:@&=+$,]|#{escaped})"
      # param         = *pchar
      param = "#{pchar}*"
      # segment       = *pchar *( ";" param )
      segment = "#{pchar}*(?:;#{param})*"
      # path_segments = segment *( "/" segment )
      ret[:PATH_SEGMENTS] = path_segments = "#{segment}(?:/#{segment})*"

      # server        = [ [ userinfo "@" ] hostport ]
      server = "(?:#{userinfo}@)?#{hostport}"
      # reg_name      = 1*( unreserved | escaped | "$" | "," |
      #                     ";" | ":" | "@" | "&" | "=" | "+" )
      ret[:REG_NAME] = reg_name = "(?:[#{unreserved}$,;:@&=+]|#{escaped})+"
      # authority     = server | reg_name
      authority = "(?:#{server}|#{reg_name})"

      # rel_segment   = 1*( unreserved | escaped |
      #                     ";" | "@" | "&" | "=" | "+" | "$" | "," )
      ret[:REL_SEGMENT] = rel_segment = "(?:[#{unreserved};@&=+$,]|#{escaped})+"

      # scheme        = alpha *( alpha | digit | "+" | "-" | "." )
      ret[:SCHEME] = scheme = "[#{PATTERN::ALPHA}][\\-+.#{PATTERN::ALPHA}\\d]*"

      # abs_path      = "/"  path_segments
      ret[:ABS_PATH] = abs_path = "/#{path_segments}"
      # rel_path      = rel_segment [ abs_path ]
      ret[:REL_PATH] = rel_path = "#{rel_segment}(?:#{abs_path})?"
      # net_path      = "//" authority [ abs_path ]
      ret[:NET_PATH] = net_path = "//#{authority}(?:#{abs_path})?"

      # hier_part     = ( net_path | abs_path ) [ "?" query ]
      ret[:HIER_PART] = hier_part = "(?:#{net_path}|#{abs_path})(?:\\?(?:#{query}))?"
      # opaque_part   = uric_no_slash *uric
      ret[:OPAQUE_PART] = opaque_part = "#{uric_no_slash}#{uric}*"

      # absoluteURI   = scheme ":" ( hier_part | opaque_part )
      ret[:ABS_URI] = abs_uri = "#{scheme}:(?:#{hier_part}|#{opaque_part})"
      # relativeURI   = ( net_path | abs_path | rel_path ) [ "?" query ]
      ret[:REL_URI] = rel_uri = "(?:#{net_path}|#{abs_path}|#{rel_path})(?:\\?#{query})?"

      # Bundler::URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]
      ret[:URI_REF] = "(?:#{abs_uri}|#{rel_uri})?(?:##{fragment})?"

      ret[:X_ABS_URI] = "
        (#{scheme}):                           (?# 1: scheme)
        (?:
           (#{opaque_part})                    (?# 2: opaque)
        |
           (?:(?:
             //(?:
                 (?:(?:(#{userinfo})@)?        (?# 3: userinfo)
                   (?:(#{host})(?::(\\d*))?))? (?# 4: host, 5: port)
               |
                 (#{reg_name})                 (?# 6: registry)
               )
             |
             (?!//))                           (?# XXX: '//' is the mark for hostport)
             (#{abs_path})?                    (?# 7: path)
           )(?:\\?(#{query}))?                 (?# 8: query)
        )
        (?:\\#(#{fragment}))?                  (?# 9: fragment)
      "

      ret[:X_REL_URI] = "
        (?:
          (?:
            //
            (?:
              (?:(#{userinfo})@)?       (?# 1: userinfo)
                (#{host})?(?::(\\d*))?  (?# 2: host, 3: port)
            |
              (#{reg_name})             (?# 4: registry)
            )
          )
        |
          (#{rel_segment})              (?# 5: rel_segment)
        )?
        (#{abs_path})?                  (?# 6: abs_path)
        (?:\\?(#{query}))?              (?# 7: query)
        (?:\\#(#{fragment}))?           (?# 8: fragment)
      "

      ret
    end

    # Constructs the default Hash of Regexp's.
    def initialize_regexp(pattern)
      ret = {}

      # for Bundler::URI::split
      ret[:ABS_URI] = Regexp.new('\A\s*' + pattern[:X_ABS_URI] + '\s*\z', Regexp::EXTENDED)
      ret[:REL_URI] = Regexp.new('\A\s*' + pattern[:X_REL_URI] + '\s*\z', Regexp::EXTENDED)

      # for Bundler::URI::extract
      ret[:URI_REF]     = Regexp.new(pattern[:URI_REF])
      ret[:ABS_URI_REF] = Regexp.new(pattern[:X_ABS_URI], Regexp::EXTENDED)
      ret[:REL_URI_REF] = Regexp.new(pattern[:X_REL_URI], Regexp::EXTENDED)

      # for Bundler::URI::escape/unescape
      ret[:ESCAPED] = Regexp.new(pattern[:ESCAPED])
      ret[:UNSAFE]  = Regexp.new("[^#{pattern[:UNRESERVED]}#{pattern[:RESERVED]}]")

      # for Generic#initialize
      ret[:SCHEME]   = Regexp.new("\\A#{pattern[:SCHEME]}\\z")
      ret[:USERINFO] = Regexp.new("\\A#{pattern[:USERINFO]}\\z")
      ret[:HOST]     = Regexp.new("\\A#{pattern[:HOST]}\\z")
      ret[:PORT]     = Regexp.new("\\A#{pattern[:PORT]}\\z")
      ret[:OPAQUE]   = Regexp.new("\\A#{pattern[:OPAQUE_PART]}\\z")
      ret[:REGISTRY] = Regexp.new("\\A#{pattern[:REG_NAME]}\\z")
      ret[:ABS_PATH] = Regexp.new("\\A#{pattern[:ABS_PATH]}\\z")
      ret[:REL_PATH] = Regexp.new("\\A#{pattern[:REL_PATH]}\\z")
      ret[:QUERY]    = Regexp.new("\\A#{pattern[:QUERY]}\\z")
      ret[:FRAGMENT] = Regexp.new("\\A#{pattern[:FRAGMENT]}\\z")

      ret
    end

    def convert_to_uri(uri)
      if uri.is_a?(Bundler::URI::Generic)
        uri
      elsif uri = String.try_convert(uri)
        parse(uri)
      else
        raise ArgumentError,
          "bad argument (expected Bundler::URI object or Bundler::URI string)"
      end
    end

  end # class Parser
end # module Bundler::URI
PK}$[��I@gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/ldaps.rbnu�[���# frozen_string_literal: false
# = uri/ldap.rb
#
# License:: You can redistribute it and/or modify it under the same term as Ruby.
#
# See Bundler::URI for general documentation
#

require_relative 'ldap'

module Bundler::URI

  # The default port for LDAPS URIs is 636, and the scheme is 'ldaps:' rather
  # than 'ldap:'. Other than that, LDAPS URIs are identical to LDAP URIs;
  # see Bundler::URI::LDAP.
  class LDAPS < LDAP
    # A Default port of 636 for Bundler::URI::LDAPS
    DEFAULT_PORT = 636
  end
  @@schemes['LDAPS'] = LDAPS
end
PK}$[q��lrrIgems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rbnu�[���# frozen_string_literal: false
module Bundler::URI
  class RFC3986_Parser # :nodoc:
    # Bundler::URI defined in RFC3986
    # this regexp is modified not to host is not empty string
    RFC3986_URI = /\A(?<Bundler::URI>(?<scheme>[A-Za-z][+\-.0-9A-Za-z]*):(?<hier-part>\/\/(?<authority>(?:(?<userinfo>(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*)@)?(?<host>(?<IP-literal>\[(?:(?<IPv6address>(?:\h{1,4}:){6}(?<ls32>\h{1,4}:\h{1,4}|(?<IPv4address>(?<dec-octet>[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g<dec-octet>\.\g<dec-octet>\.\g<dec-octet>))|::(?:\h{1,4}:){5}\g<ls32>|\h{1,4}?::(?:\h{1,4}:){4}\g<ls32>|(?:(?:\h{1,4}:)?\h{1,4})?::(?:\h{1,4}:){3}\g<ls32>|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g<ls32>|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g<ls32>|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g<ls32>|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?<IPvFuture>v\h+\.[!$&-.0-;=A-Z_a-z~]+))\])|\g<IPv4address>|(?<reg-name>(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])+))?(?::(?<port>\d*))?)(?<path-abempty>(?:\/(?<segment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*))*)|(?<path-absolute>\/(?:(?<segment-nz>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])+)(?:\/\g<segment>)*)?)|(?<path-rootless>\g<segment-nz>(?:\/\g<segment>)*)|(?<path-empty>))(?:\?(?<query>[^#]*))?(?:\#(?<fragment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*))?)\z/
    RFC3986_relative_ref = /\A(?<relative-ref>(?<relative-part>\/\/(?<authority>(?:(?<userinfo>(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*)@)?(?<host>(?<IP-literal>\[(?<IPv6address>(?:\h{1,4}:){6}(?<ls32>\h{1,4}:\h{1,4}|(?<IPv4address>(?<dec-octet>[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g<dec-octet>\.\g<dec-octet>\.\g<dec-octet>))|::(?:\h{1,4}:){5}\g<ls32>|\h{1,4}?::(?:\h{1,4}:){4}\g<ls32>|(?:(?:\h{1,4}:){,1}\h{1,4})?::(?:\h{1,4}:){3}\g<ls32>|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g<ls32>|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g<ls32>|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g<ls32>|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?<IPvFuture>v\h+\.[!$&-.0-;=A-Z_a-z~]+)\])|\g<IPv4address>|(?<reg-name>(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])+))?(?::(?<port>\d*))?)(?<path-abempty>(?:\/(?<segment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*))*)|(?<path-absolute>\/(?:(?<segment-nz>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])+)(?:\/\g<segment>)*)?)|(?<path-noscheme>(?<segment-nz-nc>(?:%\h\h|[!$&-.0-9;=@-Z_a-z~])+)(?:\/\g<segment>)*)|(?<path-empty>))(?:\?(?<query>[^#]*))?(?:\#(?<fragment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*))?)\z/
    attr_reader :regexp

    def initialize
      @regexp = default_regexp.each_value(&:freeze).freeze
    end

    def split(uri) #:nodoc:
      begin
        uri = uri.to_str
      rescue NoMethodError
        raise InvalidURIError, "bad Bundler::URI(is not Bundler::URI?): #{uri.inspect}"
      end
      uri.ascii_only? or
        raise InvalidURIError, "Bundler::URI must be ascii only #{uri.dump}"
      if m = RFC3986_URI.match(uri)
        query = m["query".freeze]
        scheme = m["scheme".freeze]
        opaque = m["path-rootless".freeze]
        if opaque
          opaque << "?#{query}" if query
          [ scheme,
            nil, # userinfo
            nil, # host
            nil, # port
            nil, # registry
            nil, # path
            opaque,
            nil, # query
            m["fragment".freeze]
          ]
        else # normal
          [ scheme,
            m["userinfo".freeze],
            m["host".freeze],
            m["port".freeze],
            nil, # registry
            (m["path-abempty".freeze] ||
             m["path-absolute".freeze] ||
             m["path-empty".freeze]),
            nil, # opaque
            query,
            m["fragment".freeze]
          ]
        end
      elsif m = RFC3986_relative_ref.match(uri)
        [ nil, # scheme
          m["userinfo".freeze],
          m["host".freeze],
          m["port".freeze],
          nil, # registry,
          (m["path-abempty".freeze] ||
           m["path-absolute".freeze] ||
           m["path-noscheme".freeze] ||
           m["path-empty".freeze]),
          nil, # opaque
          m["query".freeze],
          m["fragment".freeze]
        ]
      else
        raise InvalidURIError, "bad Bundler::URI(is not Bundler::URI?): #{uri.inspect}"
      end
    end

    def parse(uri) # :nodoc:
      Bundler::URI.for(*self.split(uri), self)
    end


    def join(*uris) # :nodoc:
      uris[0] = convert_to_uri(uris[0])
      uris.inject :merge
    end

    @@to_s = Kernel.instance_method(:to_s)
    def inspect
      @@to_s.bind_call(self)
    end

    private

    def default_regexp # :nodoc:
      {
        SCHEME: /\A[A-Za-z][A-Za-z0-9+\-.]*\z/,
        USERINFO: /\A(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*\z/,
        HOST: /\A(?:(?<IP-literal>\[(?:(?<IPv6address>(?:\h{1,4}:){6}(?<ls32>\h{1,4}:\h{1,4}|(?<IPv4address>(?<dec-octet>[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g<dec-octet>\.\g<dec-octet>\.\g<dec-octet>))|::(?:\h{1,4}:){5}\g<ls32>|\h{,4}::(?:\h{1,4}:){4}\g<ls32>|(?:(?:\h{1,4}:)?\h{1,4})?::(?:\h{1,4}:){3}\g<ls32>|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g<ls32>|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g<ls32>|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g<ls32>|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?<IPvFuture>v\h+\.[!$&-.0-;=A-Z_a-z~]+))\])|\g<IPv4address>|(?<reg-name>(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])*))\z/,
        ABS_PATH: /\A\/(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*(?:\/(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*)*\z/,
        REL_PATH: /\A(?:%\h\h|[!$&-.0-;=@-Z_a-z~])+(?:\/(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*)*\z/,
        QUERY: /\A(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*\z/,
        FRAGMENT: /\A(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*\z/,
        OPAQUE: /\A(?:[^\/].*)?\z/,
        PORT: /\A[\x09\x0a\x0c\x0d ]*\d*[\x09\x0a\x0c\x0d ]*\z/,
      }
    end

    def convert_to_uri(uri)
      if uri.is_a?(Bundler::URI::Generic)
        uri
      elsif uri = String.try_convert(uri)
        parse(uri)
      else
        raise ArgumentError,
          "bad argument (expected Bundler::URI object or Bundler::URI string)"
      end
    end

  end # class Parser
end # module Bundler::URI
PK}$[�"%i  Agems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/mailto.rbnu�[���# frozen_string_literal: false
# = uri/mailto.rb
#
# Author:: Akira Yamada <akira@ruby-lang.org>
# License:: You can redistribute it and/or modify it under the same term as Ruby.
#
# See Bundler::URI for general documentation
#

require_relative 'generic'

module Bundler::URI

  #
  # RFC6068, the mailto URL scheme.
  #
  class MailTo < Generic
    include REGEXP

    # A Default port of nil for Bundler::URI::MailTo.
    DEFAULT_PORT = nil

    # An Array of the available components for Bundler::URI::MailTo.
    COMPONENT = [ :scheme, :to, :headers ].freeze

    # :stopdoc:
    #  "hname" and "hvalue" are encodings of an RFC 822 header name and
    #  value, respectively. As with "to", all URL reserved characters must
    #  be encoded.
    #
    #  "#mailbox" is as specified in RFC 822 [RFC822]. This means that it
    #  consists of zero or more comma-separated mail addresses, possibly
    #  including "phrase" and "comment" components. Note that all URL
    #  reserved characters in "to" must be encoded: in particular,
    #  parentheses, commas, and the percent sign ("%"), which commonly occur
    #  in the "mailbox" syntax.
    #
    #  Within mailto URLs, the characters "?", "=", "&" are reserved.

    # ; RFC 6068
    # hfields      = "?" hfield *( "&" hfield )
    # hfield       = hfname "=" hfvalue
    # hfname       = *qchar
    # hfvalue      = *qchar
    # qchar        = unreserved / pct-encoded / some-delims
    # some-delims  = "!" / "$" / "'" / "(" / ")" / "*"
    #              / "+" / "," / ";" / ":" / "@"
    #
    # ; RFC3986
    # unreserved   = ALPHA / DIGIT / "-" / "." / "_" / "~"
    # pct-encoded  = "%" HEXDIG HEXDIG
    HEADER_REGEXP  = /\A(?<hfield>(?:%\h\h|[!$'-.0-;@-Z_a-z~])*=(?:%\h\h|[!$'-.0-;@-Z_a-z~])*)(?:&\g<hfield>)*\z/
    # practical regexp for email address
    # https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address
    EMAIL_REGEXP = /\A[a-zA-Z0-9.!\#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\z/
    # :startdoc:

    #
    # == Description
    #
    # Creates a new Bundler::URI::MailTo object from components, with syntax checking.
    #
    # Components can be provided as an Array or Hash. If an Array is used,
    # the components must be supplied as <code>[to, headers]</code>.
    #
    # If a Hash is used, the keys are the component names preceded by colons.
    #
    # The headers can be supplied as a pre-encoded string, such as
    # <code>"subject=subscribe&cc=address"</code>, or as an Array of Arrays
    # like <code>[['subject', 'subscribe'], ['cc', 'address']]</code>.
    #
    # Examples:
    #
    #    require 'bundler/vendor/uri/lib/uri'
    #
    #    m1 = Bundler::URI::MailTo.build(['joe@example.com', 'subject=Ruby'])
    #    m1.to_s  # => "mailto:joe@example.com?subject=Ruby"
    #
    #    m2 = Bundler::URI::MailTo.build(['john@example.com', [['Subject', 'Ruby'], ['Cc', 'jack@example.com']]])
    #    m2.to_s  # => "mailto:john@example.com?Subject=Ruby&Cc=jack@example.com"
    #
    #    m3 = Bundler::URI::MailTo.build({:to => 'listman@example.com', :headers => [['subject', 'subscribe']]})
    #    m3.to_s  # => "mailto:listman@example.com?subject=subscribe"
    #
    def self.build(args)
      tmp = Util.make_components_hash(self, args)

      case tmp[:to]
      when Array
        tmp[:opaque] = tmp[:to].join(',')
      when String
        tmp[:opaque] = tmp[:to].dup
      else
        tmp[:opaque] = ''
      end

      if tmp[:headers]
        query =
          case tmp[:headers]
          when Array
            tmp[:headers].collect { |x|
              if x.kind_of?(Array)
                x[0] + '=' + x[1..-1].join
              else
                x.to_s
              end
            }.join('&')
          when Hash
            tmp[:headers].collect { |h,v|
              h + '=' + v
            }.join('&')
          else
            tmp[:headers].to_s
          end
        unless query.empty?
          tmp[:opaque] << '?' << query
        end
      end

      super(tmp)
    end

    #
    # == Description
    #
    # Creates a new Bundler::URI::MailTo object from generic URL components with
    # no syntax checking.
    #
    # This method is usually called from Bundler::URI::parse, which checks
    # the validity of each component.
    #
    def initialize(*arg)
      super(*arg)

      @to = nil
      @headers = []

      # The RFC3986 parser does not normally populate opaque
      @opaque = "?#{@query}" if @query && !@opaque

      unless @opaque
        raise InvalidComponentError,
          "missing opaque part for mailto URL"
      end
      to, header = @opaque.split('?', 2)
      # allow semicolon as a addr-spec separator
      # http://support.microsoft.com/kb/820868
      unless /\A(?:[^@,;]+@[^@,;]+(?:\z|[,;]))*\z/ =~ to
        raise InvalidComponentError,
          "unrecognised opaque part for mailtoURL: #{@opaque}"
      end

      if arg[10] # arg_check
        self.to = to
        self.headers = header
      else
        set_to(to)
        set_headers(header)
      end
    end

    # The primary e-mail address of the URL, as a String.
    attr_reader :to

    # E-mail headers set by the URL, as an Array of Arrays.
    attr_reader :headers

    # Checks the to +v+ component.
    def check_to(v)
      return true unless v
      return true if v.size == 0

      v.split(/[,;]/).each do |addr|
        # check url safety as path-rootless
        if /\A(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*\z/ !~ addr
          raise InvalidComponentError,
            "an address in 'to' is invalid as Bundler::URI #{addr.dump}"
        end

        # check addr-spec
        # don't s/\+/ /g
        addr.gsub!(/%\h\h/, Bundler::URI::TBLDECWWWCOMP_)
        if EMAIL_REGEXP !~ addr
          raise InvalidComponentError,
            "an address in 'to' is invalid as uri-escaped addr-spec #{addr.dump}"
        end
      end

      true
    end
    private :check_to

    # Private setter for to +v+.
    def set_to(v)
      @to = v
    end
    protected :set_to

    # Setter for to +v+.
    def to=(v)
      check_to(v)
      set_to(v)
      v
    end

    # Checks the headers +v+ component against either
    # * HEADER_REGEXP
    def check_headers(v)
      return true unless v
      return true if v.size == 0
      if HEADER_REGEXP !~ v
        raise InvalidComponentError,
          "bad component(expected opaque component): #{v}"
      end

      true
    end
    private :check_headers

    # Private setter for headers +v+.
    def set_headers(v)
      @headers = []
      if v
        v.split('&').each do |x|
          @headers << x.split(/=/, 2)
        end
      end
    end
    protected :set_headers

    # Setter for headers +v+.
    def headers=(v)
      check_headers(v)
      set_headers(v)
      v
    end

    # Constructs String from Bundler::URI.
    def to_s
      @scheme + ':' +
        if @to
          @to
        else
          ''
        end +
        if @headers.size > 0
          '?' + @headers.collect{|x| x.join('=')}.join('&')
        else
          ''
        end +
        if @fragment
          '#' + @fragment
        else
          ''
        end
    end

    # Returns the RFC822 e-mail text equivalent of the URL, as a String.
    #
    # Example:
    #
    #   require 'bundler/vendor/uri/lib/uri'
    #
    #   uri = Bundler::URI.parse("mailto:ruby-list@ruby-lang.org?Subject=subscribe&cc=myaddr")
    #   uri.to_mailtext
    #   # => "To: ruby-list@ruby-lang.org\nSubject: subscribe\nCc: myaddr\n\n\n"
    #
    def to_mailtext
      to = Bundler::URI.decode_www_form_component(@to)
      head = ''
      body = ''
      @headers.each do |x|
        case x[0]
        when 'body'
          body = Bundler::URI.decode_www_form_component(x[1])
        when 'to'
          to << ', ' + Bundler::URI.decode_www_form_component(x[1])
        else
          head << Bundler::URI.decode_www_form_component(x[0]).capitalize + ': ' +
            Bundler::URI.decode_www_form_component(x[1])  + "\n"
        end
      end

      "To: #{to}
#{head}
#{body}
"
    end
    alias to_rfc822text to_mailtext
  end

  @@schemes['MAILTO'] = MailTo
end
PK}$[��qv�	�	?gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/http.rbnu�[���# frozen_string_literal: false
# = uri/http.rb
#
# Author:: Akira Yamada <akira@ruby-lang.org>
# License:: You can redistribute it and/or modify it under the same term as Ruby.
#
# See Bundler::URI for general documentation
#

require_relative 'generic'

module Bundler::URI

  #
  # The syntax of HTTP URIs is defined in RFC1738 section 3.3.
  #
  # Note that the Ruby Bundler::URI library allows HTTP URLs containing usernames and
  # passwords. This is not legal as per the RFC, but used to be
  # supported in Internet Explorer 5 and 6, before the MS04-004 security
  # update. See <URL:http://support.microsoft.com/kb/834489>.
  #
  class HTTP < Generic
    # A Default port of 80 for Bundler::URI::HTTP.
    DEFAULT_PORT = 80

    # An Array of the available components for Bundler::URI::HTTP.
    COMPONENT = %i[
      scheme
      userinfo host port
      path
      query
      fragment
    ].freeze

    #
    # == Description
    #
    # Creates a new Bundler::URI::HTTP object from components, with syntax checking.
    #
    # The components accepted are userinfo, host, port, path, query, and
    # fragment.
    #
    # The components should be provided either as an Array, or as a Hash
    # with keys formed by preceding the component names with a colon.
    #
    # If an Array is used, the components must be passed in the
    # order <code>[userinfo, host, port, path, query, fragment]</code>.
    #
    # Example:
    #
    #     uri = Bundler::URI::HTTP.build(host: 'www.example.com', path: '/foo/bar')
    #
    #     uri = Bundler::URI::HTTP.build([nil, "www.example.com", nil, "/path",
    #       "query", 'fragment'])
    #
    # Currently, if passed userinfo components this method generates
    # invalid HTTP URIs as per RFC 1738.
    #
    def self.build(args)
      tmp = Util.make_components_hash(self, args)
      super(tmp)
    end

    #
    # == Description
    #
    # Returns the full path for an HTTP request, as required by Net::HTTP::Get.
    #
    # If the Bundler::URI contains a query, the full path is Bundler::URI#path + '?' + Bundler::URI#query.
    # Otherwise, the path is simply Bundler::URI#path.
    #
    # Example:
    #
    #     uri = Bundler::URI::HTTP.build(path: '/foo/bar', query: 'test=true')
    #     uri.request_uri #  => "/foo/bar?test=true"
    #
    def request_uri
      return unless @path

      url = @query ? "#@path?#@query" : @path.dup
      url.start_with?(?/.freeze) ? url : ?/ + url
    end
  end

  @@schemes['HTTP'] = HTTP

end
PK}$[�i/>gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/ftp.rbnu�[���# frozen_string_literal: false
# = uri/ftp.rb
#
# Author:: Akira Yamada <akira@ruby-lang.org>
# License:: You can redistribute it and/or modify it under the same term as Ruby.
#
# See Bundler::URI for general documentation
#

require_relative 'generic'

module Bundler::URI

  #
  # FTP Bundler::URI syntax is defined by RFC1738 section 3.2.
  #
  # This class will be redesigned because of difference of implementations;
  # the structure of its path. draft-hoffman-ftp-uri-04 is a draft but it
  # is a good summary about the de facto spec.
  # http://tools.ietf.org/html/draft-hoffman-ftp-uri-04
  #
  class FTP < Generic
    # A Default port of 21 for Bundler::URI::FTP.
    DEFAULT_PORT = 21

    #
    # An Array of the available components for Bundler::URI::FTP.
    #
    COMPONENT = [
      :scheme,
      :userinfo, :host, :port,
      :path, :typecode
    ].freeze

    #
    # Typecode is "a", "i", or "d".
    #
    # * "a" indicates a text file (the FTP command was ASCII)
    # * "i" indicates a binary file (FTP command IMAGE)
    # * "d" indicates the contents of a directory should be displayed
    #
    TYPECODE = ['a', 'i', 'd'].freeze

    # Typecode prefix ";type=".
    TYPECODE_PREFIX = ';type='.freeze

    def self.new2(user, password, host, port, path,
                  typecode = nil, arg_check = true) # :nodoc:
      # Do not use this method!  Not tested.  [Bug #7301]
      # This methods remains just for compatibility,
      # Keep it undocumented until the active maintainer is assigned.
      typecode = nil if typecode.size == 0
      if typecode && !TYPECODE.include?(typecode)
        raise ArgumentError,
          "bad typecode is specified: #{typecode}"
      end

      # do escape

      self.new('ftp',
               [user, password],
               host, port, nil,
               typecode ? path + TYPECODE_PREFIX + typecode : path,
               nil, nil, nil, arg_check)
    end

    #
    # == Description
    #
    # Creates a new Bundler::URI::FTP object from components, with syntax checking.
    #
    # The components accepted are +userinfo+, +host+, +port+, +path+, and
    # +typecode+.
    #
    # The components should be provided either as an Array, or as a Hash
    # with keys formed by preceding the component names with a colon.
    #
    # If an Array is used, the components must be passed in the
    # order <code>[userinfo, host, port, path, typecode]</code>.
    #
    # If the path supplied is absolute, it will be escaped in order to
    # make it absolute in the Bundler::URI.
    #
    # Examples:
    #
    #     require 'bundler/vendor/uri/lib/uri'
    #
    #     uri1 = Bundler::URI::FTP.build(['user:password', 'ftp.example.com', nil,
    #       '/path/file.zip', 'i'])
    #     uri1.to_s  # => "ftp://user:password@ftp.example.com/%2Fpath/file.zip;type=i"
    #
    #     uri2 = Bundler::URI::FTP.build({:host => 'ftp.example.com',
    #       :path => 'ruby/src'})
    #     uri2.to_s  # => "ftp://ftp.example.com/ruby/src"
    #
    def self.build(args)

      # Fix the incoming path to be generic URL syntax
      # FTP path  ->  URL path
      # foo/bar       /foo/bar
      # /foo/bar      /%2Ffoo/bar
      #
      if args.kind_of?(Array)
        args[3] = '/' + args[3].sub(/^\//, '%2F')
      else
        args[:path] = '/' + args[:path].sub(/^\//, '%2F')
      end

      tmp = Util::make_components_hash(self, args)

      if tmp[:typecode]
        if tmp[:typecode].size == 1
          tmp[:typecode] = TYPECODE_PREFIX + tmp[:typecode]
        end
        tmp[:path] << tmp[:typecode]
      end

      return super(tmp)
    end

    #
    # == Description
    #
    # Creates a new Bundler::URI::FTP object from generic URL components with no
    # syntax checking.
    #
    # Unlike build(), this method does not escape the path component as
    # required by RFC1738; instead it is treated as per RFC2396.
    #
    # Arguments are +scheme+, +userinfo+, +host+, +port+, +registry+, +path+,
    # +opaque+, +query+, and +fragment+, in that order.
    #
    def initialize(scheme,
                   userinfo, host, port, registry,
                   path, opaque,
                   query,
                   fragment,
                   parser = nil,
                   arg_check = false)
      raise InvalidURIError unless path
      path = path.sub(/^\//,'')
      path.sub!(/^%2F/,'/')
      super(scheme, userinfo, host, port, registry, path, opaque,
            query, fragment, parser, arg_check)
      @typecode = nil
      if tmp = @path.index(TYPECODE_PREFIX)
        typecode = @path[tmp + TYPECODE_PREFIX.size..-1]
        @path = @path[0..tmp - 1]

        if arg_check
          self.typecode = typecode
        else
          self.set_typecode(typecode)
        end
      end
    end

    # typecode accessor.
    #
    # See Bundler::URI::FTP::COMPONENT.
    attr_reader :typecode

    # Validates typecode +v+,
    # returns +true+ or +false+.
    #
    def check_typecode(v)
      if TYPECODE.include?(v)
        return true
      else
        raise InvalidComponentError,
          "bad typecode(expected #{TYPECODE.join(', ')}): #{v}"
      end
    end
    private :check_typecode

    # Private setter for the typecode +v+.
    #
    # See also Bundler::URI::FTP.typecode=.
    #
    def set_typecode(v)
      @typecode = v
    end
    protected :set_typecode

    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the typecode +v+
    # (with validation).
    #
    # See also Bundler::URI::FTP.check_typecode.
    #
    # == Usage
    #
    #   require 'bundler/vendor/uri/lib/uri'
    #
    #   uri = Bundler::URI.parse("ftp://john@ftp.example.com/my_file.img")
    #   #=> #<Bundler::URI::FTP ftp://john@ftp.example.com/my_file.img>
    #   uri.typecode = "i"
    #   uri
    #   #=> #<Bundler::URI::FTP ftp://john@ftp.example.com/my_file.img;type=i>
    #
    def typecode=(typecode)
      check_typecode(typecode)
      set_typecode(typecode)
      typecode
    end

    def merge(oth) # :nodoc:
      tmp = super(oth)
      if self != tmp
        tmp.set_typecode(oth.typecode)
      end

      return tmp
    end

    # Returns the path from an FTP Bundler::URI.
    #
    # RFC 1738 specifically states that the path for an FTP Bundler::URI does not
    # include the / which separates the Bundler::URI path from the Bundler::URI host. Example:
    #
    # <code>ftp://ftp.example.com/pub/ruby</code>
    #
    # The above Bundler::URI indicates that the client should connect to
    # ftp.example.com then cd to pub/ruby from the initial login directory.
    #
    # If you want to cd to an absolute directory, you must include an
    # escaped / (%2F) in the path. Example:
    #
    # <code>ftp://ftp.example.com/%2Fpub/ruby</code>
    #
    # This method will then return "/pub/ruby".
    #
    def path
      return @path.sub(/^\//,'').sub(/^%2F/,'/')
    end

    # Private setter for the path of the Bundler::URI::FTP.
    def set_path(v)
      super("/" + v.sub(/^\//, "%2F"))
    end
    protected :set_path

    # Returns a String representation of the Bundler::URI::FTP.
    def to_s
      save_path = nil
      if @typecode
        save_path = @path
        @path = @path + TYPECODE_PREFIX + @typecode
      end
      str = super
      if @typecode
        @path = save_path
      end

      return str
    end
  end
  @@schemes['FTP'] = FTP
end
PK}$[�6��p	p	=gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/ws.rbnu�[���# frozen_string_literal: false
# = uri/ws.rb
#
# Author:: Matt Muller <mamuller@amazon.com>
# License:: You can redistribute it and/or modify it under the same term as Ruby.
#
# See Bundler::URI for general documentation
#

require_relative 'generic'

module Bundler::URI

  #
  # The syntax of WS URIs is defined in RFC6455 section 3.
  #
  # Note that the Ruby Bundler::URI library allows WS URLs containing usernames and
  # passwords. This is not legal as per the RFC, but used to be
  # supported in Internet Explorer 5 and 6, before the MS04-004 security
  # update. See <URL:http://support.microsoft.com/kb/834489>.
  #
  class WS < Generic
    # A Default port of 80 for Bundler::URI::WS.
    DEFAULT_PORT = 80

    # An Array of the available components for Bundler::URI::WS.
    COMPONENT = %i[
      scheme
      userinfo host port
      path
      query
    ].freeze

    #
    # == Description
    #
    # Creates a new Bundler::URI::WS object from components, with syntax checking.
    #
    # The components accepted are userinfo, host, port, path, and query.
    #
    # The components should be provided either as an Array, or as a Hash
    # with keys formed by preceding the component names with a colon.
    #
    # If an Array is used, the components must be passed in the
    # order <code>[userinfo, host, port, path, query]</code>.
    #
    # Example:
    #
    #     uri = Bundler::URI::WS.build(host: 'www.example.com', path: '/foo/bar')
    #
    #     uri = Bundler::URI::WS.build([nil, "www.example.com", nil, "/path", "query"])
    #
    # Currently, if passed userinfo components this method generates
    # invalid WS URIs as per RFC 1738.
    #
    def self.build(args)
      tmp = Util.make_components_hash(self, args)
      super(tmp)
    end

    #
    # == Description
    #
    # Returns the full path for a WS Bundler::URI, as required by Net::HTTP::Get.
    #
    # If the Bundler::URI contains a query, the full path is Bundler::URI#path + '?' + Bundler::URI#query.
    # Otherwise, the path is simply Bundler::URI#path.
    #
    # Example:
    #
    #     uri = Bundler::URI::WS.build(path: '/foo/bar', query: 'test=true')
    #     uri.request_uri #  => "/foo/bar?test=true"
    #
    def request_uri
      return unless @path

      url = @query ? "#@path?#@query" : @path.dup
      url.start_with?(?/.freeze) ? url : ?/ + url
    end
  end

  @@schemes['WS'] = WS

end
PK}$[�*?��J�JAgems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/common.rbnu�[���# frozen_string_literal: true
#--
# = uri/common.rb
#
# Author:: Akira Yamada <akira@ruby-lang.org>
# License::
#   You can redistribute it and/or modify it under the same term as Ruby.
#
# See Bundler::URI for general documentation
#

require_relative "rfc2396_parser"
require_relative "rfc3986_parser"

module Bundler::URI
  REGEXP = RFC2396_REGEXP
  Parser = RFC2396_Parser
  RFC3986_PARSER = RFC3986_Parser.new

  # Bundler::URI::Parser.new
  DEFAULT_PARSER = Parser.new
  DEFAULT_PARSER.pattern.each_pair do |sym, str|
    unless REGEXP::PATTERN.const_defined?(sym)
      REGEXP::PATTERN.const_set(sym, str)
    end
  end
  DEFAULT_PARSER.regexp.each_pair do |sym, str|
    const_set(sym, str)
  end

  module Util # :nodoc:
    def make_components_hash(klass, array_hash)
      tmp = {}
      if array_hash.kind_of?(Array) &&
          array_hash.size == klass.component.size - 1
        klass.component[1..-1].each_index do |i|
          begin
            tmp[klass.component[i + 1]] = array_hash[i].clone
          rescue TypeError
            tmp[klass.component[i + 1]] = array_hash[i]
          end
        end

      elsif array_hash.kind_of?(Hash)
        array_hash.each do |key, value|
          begin
            tmp[key] = value.clone
          rescue TypeError
            tmp[key] = value
          end
        end
      else
        raise ArgumentError,
          "expected Array of or Hash of components of #{klass} (#{klass.component[1..-1].join(', ')})"
      end
      tmp[:scheme] = klass.to_s.sub(/\A.*::/, '').downcase

      return tmp
    end
    module_function :make_components_hash
  end

  include REGEXP

  @@schemes = {}
  # Returns a Hash of the defined schemes.
  def self.scheme_list
    @@schemes
  end

  #
  # Construct a Bundler::URI instance, using the scheme to detect the appropriate class
  # from +Bundler::URI.scheme_list+.
  #
  def self.for(scheme, *arguments, default: Generic)
    if scheme
      uri_class = @@schemes[scheme.upcase] || default
    else
      uri_class = default
    end

    return uri_class.new(scheme, *arguments)
  end

  #
  # Base class for all Bundler::URI exceptions.
  #
  class Error < StandardError; end
  #
  # Not a Bundler::URI.
  #
  class InvalidURIError < Error; end
  #
  # Not a Bundler::URI component.
  #
  class InvalidComponentError < Error; end
  #
  # Bundler::URI is valid, bad usage is not.
  #
  class BadURIError < Error; end

  #
  # == Synopsis
  #
  #   Bundler::URI::split(uri)
  #
  # == Args
  #
  # +uri+::
  #   String with Bundler::URI.
  #
  # == Description
  #
  # Splits the string on following parts and returns array with result:
  #
  # * Scheme
  # * Userinfo
  # * Host
  # * Port
  # * Registry
  # * Path
  # * Opaque
  # * Query
  # * Fragment
  #
  # == Usage
  #
  #   require 'bundler/vendor/uri/lib/uri'
  #
  #   Bundler::URI.split("http://www.ruby-lang.org/")
  #   # => ["http", nil, "www.ruby-lang.org", nil, nil, "/", nil, nil, nil]
  #
  def self.split(uri)
    RFC3986_PARSER.split(uri)
  end

  #
  # == Synopsis
  #
  #   Bundler::URI::parse(uri_str)
  #
  # == Args
  #
  # +uri_str+::
  #   String with Bundler::URI.
  #
  # == Description
  #
  # Creates one of the Bundler::URI's subclasses instance from the string.
  #
  # == Raises
  #
  # Bundler::URI::InvalidURIError::
  #   Raised if Bundler::URI given is not a correct one.
  #
  # == Usage
  #
  #   require 'bundler/vendor/uri/lib/uri'
  #
  #   uri = Bundler::URI.parse("http://www.ruby-lang.org/")
  #   # => #<Bundler::URI::HTTP http://www.ruby-lang.org/>
  #   uri.scheme
  #   # => "http"
  #   uri.host
  #   # => "www.ruby-lang.org"
  #
  # It's recommended to first ::escape the provided +uri_str+ if there are any
  # invalid Bundler::URI characters.
  #
  def self.parse(uri)
    RFC3986_PARSER.parse(uri)
  end

  #
  # == Synopsis
  #
  #   Bundler::URI::join(str[, str, ...])
  #
  # == Args
  #
  # +str+::
  #   String(s) to work with, will be converted to RFC3986 URIs before merging.
  #
  # == Description
  #
  # Joins URIs.
  #
  # == Usage
  #
  #   require 'bundler/vendor/uri/lib/uri'
  #
  #   Bundler::URI.join("http://example.com/","main.rbx")
  #   # => #<Bundler::URI::HTTP http://example.com/main.rbx>
  #
  #   Bundler::URI.join('http://example.com', 'foo')
  #   # => #<Bundler::URI::HTTP http://example.com/foo>
  #
  #   Bundler::URI.join('http://example.com', '/foo', '/bar')
  #   # => #<Bundler::URI::HTTP http://example.com/bar>
  #
  #   Bundler::URI.join('http://example.com', '/foo', 'bar')
  #   # => #<Bundler::URI::HTTP http://example.com/bar>
  #
  #   Bundler::URI.join('http://example.com', '/foo/', 'bar')
  #   # => #<Bundler::URI::HTTP http://example.com/foo/bar>
  #
  def self.join(*str)
    RFC3986_PARSER.join(*str)
  end

  #
  # == Synopsis
  #
  #   Bundler::URI::extract(str[, schemes][,&blk])
  #
  # == Args
  #
  # +str+::
  #   String to extract URIs from.
  # +schemes+::
  #   Limit Bundler::URI matching to specific schemes.
  #
  # == Description
  #
  # Extracts URIs from a string. If block given, iterates through all matched URIs.
  # Returns nil if block given or array with matches.
  #
  # == Usage
  #
  #   require "bundler/vendor/uri/lib/uri"
  #
  #   Bundler::URI.extract("text here http://foo.example.org/bla and here mailto:test@example.com and here also.")
  #   # => ["http://foo.example.com/bla", "mailto:test@example.com"]
  #
  def self.extract(str, schemes = nil, &block)
    warn "Bundler::URI.extract is obsolete", uplevel: 1 if $VERBOSE
    DEFAULT_PARSER.extract(str, schemes, &block)
  end

  #
  # == Synopsis
  #
  #   Bundler::URI::regexp([match_schemes])
  #
  # == Args
  #
  # +match_schemes+::
  #   Array of schemes. If given, resulting regexp matches to URIs
  #   whose scheme is one of the match_schemes.
  #
  # == Description
  #
  # Returns a Regexp object which matches to Bundler::URI-like strings.
  # The Regexp object returned by this method includes arbitrary
  # number of capture group (parentheses).  Never rely on its number.
  #
  # == Usage
  #
  #   require 'bundler/vendor/uri/lib/uri'
  #
  #   # extract first Bundler::URI from html_string
  #   html_string.slice(Bundler::URI.regexp)
  #
  #   # remove ftp URIs
  #   html_string.sub(Bundler::URI.regexp(['ftp']), '')
  #
  #   # You should not rely on the number of parentheses
  #   html_string.scan(Bundler::URI.regexp) do |*matches|
  #     p $&
  #   end
  #
  def self.regexp(schemes = nil)
    warn "Bundler::URI.regexp is obsolete", uplevel: 1 if $VERBOSE
    DEFAULT_PARSER.make_regexp(schemes)
  end

  TBLENCWWWCOMP_ = {} # :nodoc:
  256.times do |i|
    TBLENCWWWCOMP_[-i.chr] = -('%%%02X' % i)
  end
  TBLENCWWWCOMP_[' '] = '+'
  TBLENCWWWCOMP_.freeze
  TBLDECWWWCOMP_ = {} # :nodoc:
  256.times do |i|
    h, l = i>>4, i&15
    TBLDECWWWCOMP_[-('%%%X%X' % [h, l])] = -i.chr
    TBLDECWWWCOMP_[-('%%%x%X' % [h, l])] = -i.chr
    TBLDECWWWCOMP_[-('%%%X%x' % [h, l])] = -i.chr
    TBLDECWWWCOMP_[-('%%%x%x' % [h, l])] = -i.chr
  end
  TBLDECWWWCOMP_['+'] = ' '
  TBLDECWWWCOMP_.freeze

  # Encodes given +str+ to URL-encoded form data.
  #
  # This method doesn't convert *, -, ., 0-9, A-Z, _, a-z, but does convert SP
  # (ASCII space) to + and converts others to %XX.
  #
  # If +enc+ is given, convert +str+ to the encoding before percent encoding.
  #
  # This is an implementation of
  # https://www.w3.org/TR/2013/CR-html5-20130806/forms.html#url-encoded-form-data.
  #
  # See Bundler::URI.decode_www_form_component, Bundler::URI.encode_www_form.
  def self.encode_www_form_component(str, enc=nil)
    str = str.to_s.dup
    if str.encoding != Encoding::ASCII_8BIT
      if enc && enc != Encoding::ASCII_8BIT
        str.encode!(Encoding::UTF_8, invalid: :replace, undef: :replace)
        str.encode!(enc, fallback: ->(x){"&##{x.ord};"})
      end
      str.force_encoding(Encoding::ASCII_8BIT)
    end
    str.gsub!(/[^*\-.0-9A-Z_a-z]/, TBLENCWWWCOMP_)
    str.force_encoding(Encoding::US_ASCII)
  end

  # Decodes given +str+ of URL-encoded form data.
  #
  # This decodes + to SP.
  #
  # See Bundler::URI.encode_www_form_component, Bundler::URI.decode_www_form.
  def self.decode_www_form_component(str, enc=Encoding::UTF_8)
    raise ArgumentError, "invalid %-encoding (#{str})" if /%(?!\h\h)/ =~ str
    str.b.gsub(/\+|%\h\h/, TBLDECWWWCOMP_).force_encoding(enc)
  end

  # Generates URL-encoded form data from given +enum+.
  #
  # This generates application/x-www-form-urlencoded data defined in HTML5
  # from given an Enumerable object.
  #
  # This internally uses Bundler::URI.encode_www_form_component(str).
  #
  # This method doesn't convert the encoding of given items, so convert them
  # before calling this method if you want to send data as other than original
  # encoding or mixed encoding data. (Strings which are encoded in an HTML5
  # ASCII incompatible encoding are converted to UTF-8.)
  #
  # This method doesn't handle files.  When you send a file, use
  # multipart/form-data.
  #
  # This refers https://url.spec.whatwg.org/#concept-urlencoded-serializer
  #
  #    Bundler::URI.encode_www_form([["q", "ruby"], ["lang", "en"]])
  #    #=> "q=ruby&lang=en"
  #    Bundler::URI.encode_www_form("q" => "ruby", "lang" => "en")
  #    #=> "q=ruby&lang=en"
  #    Bundler::URI.encode_www_form("q" => ["ruby", "perl"], "lang" => "en")
  #    #=> "q=ruby&q=perl&lang=en"
  #    Bundler::URI.encode_www_form([["q", "ruby"], ["q", "perl"], ["lang", "en"]])
  #    #=> "q=ruby&q=perl&lang=en"
  #
  # See Bundler::URI.encode_www_form_component, Bundler::URI.decode_www_form.
  def self.encode_www_form(enum, enc=nil)
    enum.map do |k,v|
      if v.nil?
        encode_www_form_component(k, enc)
      elsif v.respond_to?(:to_ary)
        v.to_ary.map do |w|
          str = encode_www_form_component(k, enc)
          unless w.nil?
            str << '='
            str << encode_www_form_component(w, enc)
          end
        end.join('&')
      else
        str = encode_www_form_component(k, enc)
        str << '='
        str << encode_www_form_component(v, enc)
      end
    end.join('&')
  end

  # Decodes URL-encoded form data from given +str+.
  #
  # This decodes application/x-www-form-urlencoded data
  # and returns an array of key-value arrays.
  #
  # This refers http://url.spec.whatwg.org/#concept-urlencoded-parser,
  # so this supports only &-separator, and doesn't support ;-separator.
  #
  #    ary = Bundler::URI.decode_www_form("a=1&a=2&b=3")
  #    ary                   #=> [['a', '1'], ['a', '2'], ['b', '3']]
  #    ary.assoc('a').last   #=> '1'
  #    ary.assoc('b').last   #=> '3'
  #    ary.rassoc('a').last  #=> '2'
  #    Hash[ary]             #=> {"a"=>"2", "b"=>"3"}
  #
  # See Bundler::URI.decode_www_form_component, Bundler::URI.encode_www_form.
  def self.decode_www_form(str, enc=Encoding::UTF_8, separator: '&', use__charset_: false, isindex: false)
    raise ArgumentError, "the input of #{self.name}.#{__method__} must be ASCII only string" unless str.ascii_only?
    ary = []
    return ary if str.empty?
    enc = Encoding.find(enc)
    str.b.each_line(separator) do |string|
      string.chomp!(separator)
      key, sep, val = string.partition('=')
      if isindex
        if sep.empty?
          val = key
          key = +''
        end
        isindex = false
      end

      if use__charset_ and key == '_charset_' and e = get_encoding(val)
        enc = e
        use__charset_ = false
      end

      key.gsub!(/\+|%\h\h/, TBLDECWWWCOMP_)
      if val
        val.gsub!(/\+|%\h\h/, TBLDECWWWCOMP_)
      else
        val = +''
      end

      ary << [key, val]
    end
    ary.each do |k, v|
      k.force_encoding(enc)
      k.scrub!
      v.force_encoding(enc)
      v.scrub!
    end
    ary
  end

  private
=begin command for WEB_ENCODINGS_
  curl https://encoding.spec.whatwg.org/encodings.json|
  ruby -rjson -e 'H={}
  h={
    "shift_jis"=>"Windows-31J",
    "euc-jp"=>"cp51932",
    "iso-2022-jp"=>"cp50221",
    "x-mac-cyrillic"=>"macCyrillic",
  }
  JSON($<.read).map{|x|x["encodings"]}.flatten.each{|x|
    Encoding.find(n=h.fetch(n=x["name"].downcase,n))rescue next
    x["labels"].each{|y|H[y]=n}
  }
  puts "{"
  H.each{|k,v|puts %[  #{k.dump}=>#{v.dump},]}
  puts "}"
'
=end
  WEB_ENCODINGS_ = {
    "unicode-1-1-utf-8"=>"utf-8",
    "utf-8"=>"utf-8",
    "utf8"=>"utf-8",
    "866"=>"ibm866",
    "cp866"=>"ibm866",
    "csibm866"=>"ibm866",
    "ibm866"=>"ibm866",
    "csisolatin2"=>"iso-8859-2",
    "iso-8859-2"=>"iso-8859-2",
    "iso-ir-101"=>"iso-8859-2",
    "iso8859-2"=>"iso-8859-2",
    "iso88592"=>"iso-8859-2",
    "iso_8859-2"=>"iso-8859-2",
    "iso_8859-2:1987"=>"iso-8859-2",
    "l2"=>"iso-8859-2",
    "latin2"=>"iso-8859-2",
    "csisolatin3"=>"iso-8859-3",
    "iso-8859-3"=>"iso-8859-3",
    "iso-ir-109"=>"iso-8859-3",
    "iso8859-3"=>"iso-8859-3",
    "iso88593"=>"iso-8859-3",
    "iso_8859-3"=>"iso-8859-3",
    "iso_8859-3:1988"=>"iso-8859-3",
    "l3"=>"iso-8859-3",
    "latin3"=>"iso-8859-3",
    "csisolatin4"=>"iso-8859-4",
    "iso-8859-4"=>"iso-8859-4",
    "iso-ir-110"=>"iso-8859-4",
    "iso8859-4"=>"iso-8859-4",
    "iso88594"=>"iso-8859-4",
    "iso_8859-4"=>"iso-8859-4",
    "iso_8859-4:1988"=>"iso-8859-4",
    "l4"=>"iso-8859-4",
    "latin4"=>"iso-8859-4",
    "csisolatincyrillic"=>"iso-8859-5",
    "cyrillic"=>"iso-8859-5",
    "iso-8859-5"=>"iso-8859-5",
    "iso-ir-144"=>"iso-8859-5",
    "iso8859-5"=>"iso-8859-5",
    "iso88595"=>"iso-8859-5",
    "iso_8859-5"=>"iso-8859-5",
    "iso_8859-5:1988"=>"iso-8859-5",
    "arabic"=>"iso-8859-6",
    "asmo-708"=>"iso-8859-6",
    "csiso88596e"=>"iso-8859-6",
    "csiso88596i"=>"iso-8859-6",
    "csisolatinarabic"=>"iso-8859-6",
    "ecma-114"=>"iso-8859-6",
    "iso-8859-6"=>"iso-8859-6",
    "iso-8859-6-e"=>"iso-8859-6",
    "iso-8859-6-i"=>"iso-8859-6",
    "iso-ir-127"=>"iso-8859-6",
    "iso8859-6"=>"iso-8859-6",
    "iso88596"=>"iso-8859-6",
    "iso_8859-6"=>"iso-8859-6",
    "iso_8859-6:1987"=>"iso-8859-6",
    "csisolatingreek"=>"iso-8859-7",
    "ecma-118"=>"iso-8859-7",
    "elot_928"=>"iso-8859-7",
    "greek"=>"iso-8859-7",
    "greek8"=>"iso-8859-7",
    "iso-8859-7"=>"iso-8859-7",
    "iso-ir-126"=>"iso-8859-7",
    "iso8859-7"=>"iso-8859-7",
    "iso88597"=>"iso-8859-7",
    "iso_8859-7"=>"iso-8859-7",
    "iso_8859-7:1987"=>"iso-8859-7",
    "sun_eu_greek"=>"iso-8859-7",
    "csiso88598e"=>"iso-8859-8",
    "csisolatinhebrew"=>"iso-8859-8",
    "hebrew"=>"iso-8859-8",
    "iso-8859-8"=>"iso-8859-8",
    "iso-8859-8-e"=>"iso-8859-8",
    "iso-ir-138"=>"iso-8859-8",
    "iso8859-8"=>"iso-8859-8",
    "iso88598"=>"iso-8859-8",
    "iso_8859-8"=>"iso-8859-8",
    "iso_8859-8:1988"=>"iso-8859-8",
    "visual"=>"iso-8859-8",
    "csisolatin6"=>"iso-8859-10",
    "iso-8859-10"=>"iso-8859-10",
    "iso-ir-157"=>"iso-8859-10",
    "iso8859-10"=>"iso-8859-10",
    "iso885910"=>"iso-8859-10",
    "l6"=>"iso-8859-10",
    "latin6"=>"iso-8859-10",
    "iso-8859-13"=>"iso-8859-13",
    "iso8859-13"=>"iso-8859-13",
    "iso885913"=>"iso-8859-13",
    "iso-8859-14"=>"iso-8859-14",
    "iso8859-14"=>"iso-8859-14",
    "iso885914"=>"iso-8859-14",
    "csisolatin9"=>"iso-8859-15",
    "iso-8859-15"=>"iso-8859-15",
    "iso8859-15"=>"iso-8859-15",
    "iso885915"=>"iso-8859-15",
    "iso_8859-15"=>"iso-8859-15",
    "l9"=>"iso-8859-15",
    "iso-8859-16"=>"iso-8859-16",
    "cskoi8r"=>"koi8-r",
    "koi"=>"koi8-r",
    "koi8"=>"koi8-r",
    "koi8-r"=>"koi8-r",
    "koi8_r"=>"koi8-r",
    "koi8-ru"=>"koi8-u",
    "koi8-u"=>"koi8-u",
    "dos-874"=>"windows-874",
    "iso-8859-11"=>"windows-874",
    "iso8859-11"=>"windows-874",
    "iso885911"=>"windows-874",
    "tis-620"=>"windows-874",
    "windows-874"=>"windows-874",
    "cp1250"=>"windows-1250",
    "windows-1250"=>"windows-1250",
    "x-cp1250"=>"windows-1250",
    "cp1251"=>"windows-1251",
    "windows-1251"=>"windows-1251",
    "x-cp1251"=>"windows-1251",
    "ansi_x3.4-1968"=>"windows-1252",
    "ascii"=>"windows-1252",
    "cp1252"=>"windows-1252",
    "cp819"=>"windows-1252",
    "csisolatin1"=>"windows-1252",
    "ibm819"=>"windows-1252",
    "iso-8859-1"=>"windows-1252",
    "iso-ir-100"=>"windows-1252",
    "iso8859-1"=>"windows-1252",
    "iso88591"=>"windows-1252",
    "iso_8859-1"=>"windows-1252",
    "iso_8859-1:1987"=>"windows-1252",
    "l1"=>"windows-1252",
    "latin1"=>"windows-1252",
    "us-ascii"=>"windows-1252",
    "windows-1252"=>"windows-1252",
    "x-cp1252"=>"windows-1252",
    "cp1253"=>"windows-1253",
    "windows-1253"=>"windows-1253",
    "x-cp1253"=>"windows-1253",
    "cp1254"=>"windows-1254",
    "csisolatin5"=>"windows-1254",
    "iso-8859-9"=>"windows-1254",
    "iso-ir-148"=>"windows-1254",
    "iso8859-9"=>"windows-1254",
    "iso88599"=>"windows-1254",
    "iso_8859-9"=>"windows-1254",
    "iso_8859-9:1989"=>"windows-1254",
    "l5"=>"windows-1254",
    "latin5"=>"windows-1254",
    "windows-1254"=>"windows-1254",
    "x-cp1254"=>"windows-1254",
    "cp1255"=>"windows-1255",
    "windows-1255"=>"windows-1255",
    "x-cp1255"=>"windows-1255",
    "cp1256"=>"windows-1256",
    "windows-1256"=>"windows-1256",
    "x-cp1256"=>"windows-1256",
    "cp1257"=>"windows-1257",
    "windows-1257"=>"windows-1257",
    "x-cp1257"=>"windows-1257",
    "cp1258"=>"windows-1258",
    "windows-1258"=>"windows-1258",
    "x-cp1258"=>"windows-1258",
    "x-mac-cyrillic"=>"macCyrillic",
    "x-mac-ukrainian"=>"macCyrillic",
    "chinese"=>"gbk",
    "csgb2312"=>"gbk",
    "csiso58gb231280"=>"gbk",
    "gb2312"=>"gbk",
    "gb_2312"=>"gbk",
    "gb_2312-80"=>"gbk",
    "gbk"=>"gbk",
    "iso-ir-58"=>"gbk",
    "x-gbk"=>"gbk",
    "gb18030"=>"gb18030",
    "big5"=>"big5",
    "big5-hkscs"=>"big5",
    "cn-big5"=>"big5",
    "csbig5"=>"big5",
    "x-x-big5"=>"big5",
    "cseucpkdfmtjapanese"=>"cp51932",
    "euc-jp"=>"cp51932",
    "x-euc-jp"=>"cp51932",
    "csiso2022jp"=>"cp50221",
    "iso-2022-jp"=>"cp50221",
    "csshiftjis"=>"Windows-31J",
    "ms932"=>"Windows-31J",
    "ms_kanji"=>"Windows-31J",
    "shift-jis"=>"Windows-31J",
    "shift_jis"=>"Windows-31J",
    "sjis"=>"Windows-31J",
    "windows-31j"=>"Windows-31J",
    "x-sjis"=>"Windows-31J",
    "cseuckr"=>"euc-kr",
    "csksc56011987"=>"euc-kr",
    "euc-kr"=>"euc-kr",
    "iso-ir-149"=>"euc-kr",
    "korean"=>"euc-kr",
    "ks_c_5601-1987"=>"euc-kr",
    "ks_c_5601-1989"=>"euc-kr",
    "ksc5601"=>"euc-kr",
    "ksc_5601"=>"euc-kr",
    "windows-949"=>"euc-kr",
    "utf-16be"=>"utf-16be",
    "utf-16"=>"utf-16le",
    "utf-16le"=>"utf-16le",
  } # :nodoc:

  # :nodoc:
  # return encoding or nil
  # http://encoding.spec.whatwg.org/#concept-encoding-get
  def self.get_encoding(label)
    Encoding.find(WEB_ENCODINGS_[label.to_str.strip.downcase]) rescue nil
  end
end # module Bundler::URI

module Bundler

  #
  # Returns +uri+ converted to an Bundler::URI object.
  #
  def URI(uri)
    if uri.is_a?(Bundler::URI::Generic)
      uri
    elsif uri = String.try_convert(uri)
      Bundler::URI.parse(uri)
    else
      raise ArgumentError,
        "bad argument (expected Bundler::URI object or Bundler::URI string)"
    end
  end
  module_function :URI
end
PK}$[N��22>gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/wss.rbnu�[���# frozen_string_literal: false
# = uri/wss.rb
#
# Author:: Matt Muller <mamuller@amazon.com>
# License:: You can redistribute it and/or modify it under the same term as Ruby.
#
# See Bundler::URI for general documentation
#

require_relative 'ws'

module Bundler::URI

  # The default port for WSS URIs is 443, and the scheme is 'wss:' rather
  # than 'ws:'. Other than that, WSS URIs are identical to WS URIs;
  # see Bundler::URI::WS.
  class WSS < WS
    # A Default port of 443 for Bundler::URI::WSS
    DEFAULT_PORT = 443
  end
  @@schemes['WSS'] = WSS
end
PK}$[M}����?gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/file.rbnu�[���# frozen_string_literal: true

require_relative 'generic'

module Bundler::URI

  #
  # The "file" Bundler::URI is defined by RFC8089.
  #
  class File < Generic
    # A Default port of nil for Bundler::URI::File.
    DEFAULT_PORT = nil

    #
    # An Array of the available components for Bundler::URI::File.
    #
    COMPONENT = [
      :scheme,
      :host,
      :path
    ].freeze

    #
    # == Description
    #
    # Creates a new Bundler::URI::File object from components, with syntax checking.
    #
    # The components accepted are +host+ and +path+.
    #
    # The components should be provided either as an Array, or as a Hash
    # with keys formed by preceding the component names with a colon.
    #
    # If an Array is used, the components must be passed in the
    # order <code>[host, path]</code>.
    #
    # Examples:
    #
    #     require 'bundler/vendor/uri/lib/uri'
    #
    #     uri1 = Bundler::URI::File.build(['host.example.com', '/path/file.zip'])
    #     uri1.to_s  # => "file://host.example.com/path/file.zip"
    #
    #     uri2 = Bundler::URI::File.build({:host => 'host.example.com',
    #       :path => '/ruby/src'})
    #     uri2.to_s  # => "file://host.example.com/ruby/src"
    #
    def self.build(args)
      tmp = Util::make_components_hash(self, args)
      super(tmp)
    end

    # Protected setter for the host component +v+.
    #
    # See also Bundler::URI::Generic.host=.
    #
    def set_host(v)
      v = "" if v.nil? || v == "localhost"
      @host = v
    end

    # do nothing
    def set_port(v)
    end

    # raise InvalidURIError
    def check_userinfo(user)
      raise Bundler::URI::InvalidURIError, "can not set userinfo for file Bundler::URI"
    end

    # raise InvalidURIError
    def check_user(user)
      raise Bundler::URI::InvalidURIError, "can not set user for file Bundler::URI"
    end

    # raise InvalidURIError
    def check_password(user)
      raise Bundler::URI::InvalidURIError, "can not set password for file Bundler::URI"
    end

    # do nothing
    def set_userinfo(v)
    end

    # do nothing
    def set_user(v)
    end

    # do nothing
    def set_password(v)
    end
  end

  @@schemes['FILE'] = File
end
PK}$[0C?E��?gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/ldap.rbnu�[���# frozen_string_literal: false
# = uri/ldap.rb
#
# Author::
#  Takaaki Tateishi <ttate@jaist.ac.jp>
#  Akira Yamada <akira@ruby-lang.org>
# License::
#   Bundler::URI::LDAP is copyrighted free software by Takaaki Tateishi and Akira Yamada.
#   You can redistribute it and/or modify it under the same term as Ruby.
#
# See Bundler::URI for general documentation
#

require_relative 'generic'

module Bundler::URI

  #
  # LDAP Bundler::URI SCHEMA (described in RFC2255).
  #--
  # ldap://<host>/<dn>[?<attrs>[?<scope>[?<filter>[?<extensions>]]]]
  #++
  class LDAP < Generic

    # A Default port of 389 for Bundler::URI::LDAP.
    DEFAULT_PORT = 389

    # An Array of the available components for Bundler::URI::LDAP.
    COMPONENT = [
      :scheme,
      :host, :port,
      :dn,
      :attributes,
      :scope,
      :filter,
      :extensions,
    ].freeze

    # Scopes available for the starting point.
    #
    # * SCOPE_BASE - the Base DN
    # * SCOPE_ONE  - one level under the Base DN, not including the base DN and
    #   not including any entries under this
    # * SCOPE_SUB  - subtrees, all entries at all levels
    #
    SCOPE = [
      SCOPE_ONE = 'one',
      SCOPE_SUB = 'sub',
      SCOPE_BASE = 'base',
    ].freeze

    #
    # == Description
    #
    # Creates a new Bundler::URI::LDAP object from components, with syntax checking.
    #
    # The components accepted are host, port, dn, attributes,
    # scope, filter, and extensions.
    #
    # The components should be provided either as an Array, or as a Hash
    # with keys formed by preceding the component names with a colon.
    #
    # If an Array is used, the components must be passed in the
    # order <code>[host, port, dn, attributes, scope, filter, extensions]</code>.
    #
    # Example:
    #
    #     uri = Bundler::URI::LDAP.build({:host => 'ldap.example.com',
    #       :dn => '/dc=example'})
    #
    #     uri = Bundler::URI::LDAP.build(["ldap.example.com", nil,
    #       "/dc=example;dc=com", "query", nil, nil, nil])
    #
    def self.build(args)
      tmp = Util::make_components_hash(self, args)

      if tmp[:dn]
        tmp[:path] = tmp[:dn]
      end

      query = []
      [:extensions, :filter, :scope, :attributes].collect do |x|
        next if !tmp[x] && query.size == 0
        query.unshift(tmp[x])
      end

      tmp[:query] = query.join('?')

      return super(tmp)
    end

    #
    # == Description
    #
    # Creates a new Bundler::URI::LDAP object from generic Bundler::URI components as per
    # RFC 2396. No LDAP-specific syntax checking is performed.
    #
    # Arguments are +scheme+, +userinfo+, +host+, +port+, +registry+, +path+,
    # +opaque+, +query+, and +fragment+, in that order.
    #
    # Example:
    #
    #     uri = Bundler::URI::LDAP.new("ldap", nil, "ldap.example.com", nil, nil,
    #       "/dc=example;dc=com", nil, "query", nil)
    #
    # See also Bundler::URI::Generic.new.
    #
    def initialize(*arg)
      super(*arg)

      if @fragment
        raise InvalidURIError, 'bad LDAP URL'
      end

      parse_dn
      parse_query
    end

    # Private method to cleanup +dn+ from using the +path+ component attribute.
    def parse_dn
      raise InvalidURIError, 'bad LDAP URL' unless @path
      @dn = @path[1..-1]
    end
    private :parse_dn

    # Private method to cleanup +attributes+, +scope+, +filter+, and +extensions+
    # from using the +query+ component attribute.
    def parse_query
      @attributes = nil
      @scope      = nil
      @filter     = nil
      @extensions = nil

      if @query
        attrs, scope, filter, extensions = @query.split('?')

        @attributes = attrs if attrs && attrs.size > 0
        @scope      = scope if scope && scope.size > 0
        @filter     = filter if filter && filter.size > 0
        @extensions = extensions if extensions && extensions.size > 0
      end
    end
    private :parse_query

    # Private method to assemble +query+ from +attributes+, +scope+, +filter+, and +extensions+.
    def build_path_query
      @path = '/' + @dn

      query = []
      [@extensions, @filter, @scope, @attributes].each do |x|
        next if !x && query.size == 0
        query.unshift(x)
      end
      @query = query.join('?')
    end
    private :build_path_query

    # Returns dn.
    def dn
      @dn
    end

    # Private setter for dn +val+.
    def set_dn(val)
      @dn = val
      build_path_query
      @dn
    end
    protected :set_dn

    # Setter for dn +val+.
    def dn=(val)
      set_dn(val)
      val
    end

    # Returns attributes.
    def attributes
      @attributes
    end

    # Private setter for attributes +val+.
    def set_attributes(val)
      @attributes = val
      build_path_query
      @attributes
    end
    protected :set_attributes

    # Setter for attributes +val+.
    def attributes=(val)
      set_attributes(val)
      val
    end

    # Returns scope.
    def scope
      @scope
    end

    # Private setter for scope +val+.
    def set_scope(val)
      @scope = val
      build_path_query
      @scope
    end
    protected :set_scope

    # Setter for scope +val+.
    def scope=(val)
      set_scope(val)
      val
    end

    # Returns filter.
    def filter
      @filter
    end

    # Private setter for filter +val+.
    def set_filter(val)
      @filter = val
      build_path_query
      @filter
    end
    protected :set_filter

    # Setter for filter +val+.
    def filter=(val)
      set_filter(val)
      val
    end

    # Returns extensions.
    def extensions
      @extensions
    end

    # Private setter for extensions +val+.
    def set_extensions(val)
      @extensions = val
      build_path_query
      @extensions
    end
    protected :set_extensions

    # Setter for extensions +val+.
    def extensions=(val)
      set_extensions(val)
      val
    end

    # Checks if Bundler::URI has a path.
    # For Bundler::URI::LDAP this will return +false+.
    def hierarchical?
      false
    end
  end

  @@schemes['LDAP'] = LDAP
end
PK}$[6��ؖؖBgems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/generic.rbnu�[���# frozen_string_literal: true

# = uri/generic.rb
#
# Author:: Akira Yamada <akira@ruby-lang.org>
# License:: You can redistribute it and/or modify it under the same term as Ruby.
#
# See Bundler::URI for general documentation
#

require_relative 'common'
autoload :IPSocket, 'socket'
autoload :IPAddr, 'ipaddr'

module Bundler::URI

  #
  # Base class for all Bundler::URI classes.
  # Implements generic Bundler::URI syntax as per RFC 2396.
  #
  class Generic
    include Bundler::URI

    #
    # A Default port of nil for Bundler::URI::Generic.
    #
    DEFAULT_PORT = nil

    #
    # Returns default port.
    #
    def self.default_port
      self::DEFAULT_PORT
    end

    #
    # Returns default port.
    #
    def default_port
      self.class.default_port
    end

    #
    # An Array of the available components for Bundler::URI::Generic.
    #
    COMPONENT = [
      :scheme,
      :userinfo, :host, :port, :registry,
      :path, :opaque,
      :query,
      :fragment
    ].freeze

    #
    # Components of the Bundler::URI in the order.
    #
    def self.component
      self::COMPONENT
    end

    USE_REGISTRY = false # :nodoc:

    def self.use_registry # :nodoc:
      self::USE_REGISTRY
    end

    #
    # == Synopsis
    #
    # See ::new.
    #
    # == Description
    #
    # At first, tries to create a new Bundler::URI::Generic instance using
    # Bundler::URI::Generic::build. But, if exception Bundler::URI::InvalidComponentError is raised,
    # then it does Bundler::URI::Escape.escape all Bundler::URI components and tries again.
    #
    def self.build2(args)
      begin
        return self.build(args)
      rescue InvalidComponentError
        if args.kind_of?(Array)
          return self.build(args.collect{|x|
            if x.is_a?(String)
              DEFAULT_PARSER.escape(x)
            else
              x
            end
          })
        elsif args.kind_of?(Hash)
          tmp = {}
          args.each do |key, value|
            tmp[key] = if value
                DEFAULT_PARSER.escape(value)
              else
                value
              end
          end
          return self.build(tmp)
        end
      end
    end

    #
    # == Synopsis
    #
    # See ::new.
    #
    # == Description
    #
    # Creates a new Bundler::URI::Generic instance from components of Bundler::URI::Generic
    # with check.  Components are: scheme, userinfo, host, port, registry, path,
    # opaque, query, and fragment. You can provide arguments either by an Array or a Hash.
    # See ::new for hash keys to use or for order of array items.
    #
    def self.build(args)
      if args.kind_of?(Array) &&
          args.size == ::Bundler::URI::Generic::COMPONENT.size
        tmp = args.dup
      elsif args.kind_of?(Hash)
        tmp = ::Bundler::URI::Generic::COMPONENT.collect do |c|
          if args.include?(c)
            args[c]
          else
            nil
          end
        end
      else
        component = self.class.component rescue ::Bundler::URI::Generic::COMPONENT
        raise ArgumentError,
        "expected Array of or Hash of components of #{self.class} (#{component.join(', ')})"
      end

      tmp << nil
      tmp << true
      return self.new(*tmp)
    end

    #
    # == Args
    #
    # +scheme+::
    #   Protocol scheme, i.e. 'http','ftp','mailto' and so on.
    # +userinfo+::
    #   User name and password, i.e. 'sdmitry:bla'.
    # +host+::
    #   Server host name.
    # +port+::
    #   Server port.
    # +registry+::
    #   Registry of naming authorities.
    # +path+::
    #   Path on server.
    # +opaque+::
    #   Opaque part.
    # +query+::
    #   Query data.
    # +fragment+::
    #   Part of the Bundler::URI after '#' character.
    # +parser+::
    #   Parser for internal use [Bundler::URI::DEFAULT_PARSER by default].
    # +arg_check+::
    #   Check arguments [false by default].
    #
    # == Description
    #
    # Creates a new Bundler::URI::Generic instance from ``generic'' components without check.
    #
    def initialize(scheme,
                   userinfo, host, port, registry,
                   path, opaque,
                   query,
                   fragment,
                   parser = DEFAULT_PARSER,
                   arg_check = false)
      @scheme = nil
      @user = nil
      @password = nil
      @host = nil
      @port = nil
      @path = nil
      @query = nil
      @opaque = nil
      @fragment = nil
      @parser = parser == DEFAULT_PARSER ? nil : parser

      if arg_check
        self.scheme = scheme
        self.userinfo = userinfo
        self.hostname = host
        self.port = port
        self.path = path
        self.query = query
        self.opaque = opaque
        self.fragment = fragment
      else
        self.set_scheme(scheme)
        self.set_userinfo(userinfo)
        self.set_host(host)
        self.set_port(port)
        self.set_path(path)
        self.query = query
        self.set_opaque(opaque)
        self.fragment=(fragment)
      end
      if registry
        raise InvalidURIError,
          "the scheme #{@scheme} does not accept registry part: #{registry} (or bad hostname?)"
      end

      @scheme&.freeze
      self.set_path('') if !@path && !@opaque # (see RFC2396 Section 5.2)
      self.set_port(self.default_port) if self.default_port && !@port
    end

    #
    # Returns the scheme component of the Bundler::URI.
    #
    #   Bundler::URI("http://foo/bar/baz").scheme #=> "http"
    #
    attr_reader :scheme

    # Returns the host component of the Bundler::URI.
    #
    #   Bundler::URI("http://foo/bar/baz").host #=> "foo"
    #
    # It returns nil if no host component exists.
    #
    #   Bundler::URI("mailto:foo@example.org").host #=> nil
    #
    # The component does not contain the port number.
    #
    #   Bundler::URI("http://foo:8080/bar/baz").host #=> "foo"
    #
    # Since IPv6 addresses are wrapped with brackets in URIs,
    # this method returns IPv6 addresses wrapped with brackets.
    # This form is not appropriate to pass to socket methods such as TCPSocket.open.
    # If unwrapped host names are required, use the #hostname method.
    #
    #   Bundler::URI("http://[::1]/bar/baz").host     #=> "[::1]"
    #   Bundler::URI("http://[::1]/bar/baz").hostname #=> "::1"
    #
    attr_reader :host

    # Returns the port component of the Bundler::URI.
    #
    #   Bundler::URI("http://foo/bar/baz").port      #=> 80
    #   Bundler::URI("http://foo:8080/bar/baz").port #=> 8080
    #
    attr_reader :port

    def registry # :nodoc:
      nil
    end

    # Returns the path component of the Bundler::URI.
    #
    #   Bundler::URI("http://foo/bar/baz").path #=> "/bar/baz"
    #
    attr_reader :path

    # Returns the query component of the Bundler::URI.
    #
    #   Bundler::URI("http://foo/bar/baz?search=FooBar").query #=> "search=FooBar"
    #
    attr_reader :query

    # Returns the opaque part of the Bundler::URI.
    #
    #   Bundler::URI("mailto:foo@example.org").opaque #=> "foo@example.org"
    #   Bundler::URI("http://foo/bar/baz").opaque     #=> nil
    #
    # The portion of the path that does not make use of the slash '/'.
    # The path typically refers to an absolute path or an opaque part.
    # (See RFC2396 Section 3 and 5.2.)
    #
    attr_reader :opaque

    # Returns the fragment component of the Bundler::URI.
    #
    #   Bundler::URI("http://foo/bar/baz?search=FooBar#ponies").fragment #=> "ponies"
    #
    attr_reader :fragment

    # Returns the parser to be used.
    #
    # Unless a Bundler::URI::Parser is defined, DEFAULT_PARSER is used.
    #
    def parser
      if !defined?(@parser) || !@parser
        DEFAULT_PARSER
      else
        @parser || DEFAULT_PARSER
      end
    end

    # Replaces self by other Bundler::URI object.
    #
    def replace!(oth)
      if self.class != oth.class
        raise ArgumentError, "expected #{self.class} object"
      end

      component.each do |c|
        self.__send__("#{c}=", oth.__send__(c))
      end
    end
    private :replace!

    #
    # Components of the Bundler::URI in the order.
    #
    def component
      self.class.component
    end

    #
    # Checks the scheme +v+ component against the Bundler::URI::Parser Regexp for :SCHEME.
    #
    def check_scheme(v)
      if v && parser.regexp[:SCHEME] !~ v
        raise InvalidComponentError,
          "bad component(expected scheme component): #{v}"
      end

      return true
    end
    private :check_scheme

    # Protected setter for the scheme component +v+.
    #
    # See also Bundler::URI::Generic.scheme=.
    #
    def set_scheme(v)
      @scheme = v&.downcase
    end
    protected :set_scheme

    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the scheme component +v+
    # (with validation).
    #
    # See also Bundler::URI::Generic.check_scheme.
    #
    # == Usage
    #
    #   require 'bundler/vendor/uri/lib/uri'
    #
    #   uri = Bundler::URI.parse("http://my.example.com")
    #   uri.scheme = "https"
    #   uri.to_s  #=> "https://my.example.com"
    #
    def scheme=(v)
      check_scheme(v)
      set_scheme(v)
      v
    end

    #
    # Checks the +user+ and +password+.
    #
    # If +password+ is not provided, then +user+ is
    # split, using Bundler::URI::Generic.split_userinfo, to
    # pull +user+ and +password.
    #
    # See also Bundler::URI::Generic.check_user, Bundler::URI::Generic.check_password.
    #
    def check_userinfo(user, password = nil)
      if !password
        user, password = split_userinfo(user)
      end
      check_user(user)
      check_password(password, user)

      return true
    end
    private :check_userinfo

    #
    # Checks the user +v+ component for RFC2396 compliance
    # and against the Bundler::URI::Parser Regexp for :USERINFO.
    #
    # Can not have a registry or opaque component defined,
    # with a user component defined.
    #
    def check_user(v)
      if @opaque
        raise InvalidURIError,
          "can not set user with opaque"
      end

      return v unless v

      if parser.regexp[:USERINFO] !~ v
        raise InvalidComponentError,
          "bad component(expected userinfo component or user component): #{v}"
      end

      return true
    end
    private :check_user

    #
    # Checks the password +v+ component for RFC2396 compliance
    # and against the Bundler::URI::Parser Regexp for :USERINFO.
    #
    # Can not have a registry or opaque component defined,
    # with a user component defined.
    #
    def check_password(v, user = @user)
      if @opaque
        raise InvalidURIError,
          "can not set password with opaque"
      end
      return v unless v

      if !user
        raise InvalidURIError,
          "password component depends user component"
      end

      if parser.regexp[:USERINFO] !~ v
        raise InvalidComponentError,
          "bad password component"
      end

      return true
    end
    private :check_password

    #
    # Sets userinfo, argument is string like 'name:pass'.
    #
    def userinfo=(userinfo)
      if userinfo.nil?
        return nil
      end
      check_userinfo(*userinfo)
      set_userinfo(*userinfo)
      # returns userinfo
    end

    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the +user+ component
    # (with validation).
    #
    # See also Bundler::URI::Generic.check_user.
    #
    # == Usage
    #
    #   require 'bundler/vendor/uri/lib/uri'
    #
    #   uri = Bundler::URI.parse("http://john:S3nsit1ve@my.example.com")
    #   uri.user = "sam"
    #   uri.to_s  #=> "http://sam:V3ry_S3nsit1ve@my.example.com"
    #
    def user=(user)
      check_user(user)
      set_user(user)
      # returns user
    end

    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the +password+ component
    # (with validation).
    #
    # See also Bundler::URI::Generic.check_password.
    #
    # == Usage
    #
    #   require 'bundler/vendor/uri/lib/uri'
    #
    #   uri = Bundler::URI.parse("http://john:S3nsit1ve@my.example.com")
    #   uri.password = "V3ry_S3nsit1ve"
    #   uri.to_s  #=> "http://john:V3ry_S3nsit1ve@my.example.com"
    #
    def password=(password)
      check_password(password)
      set_password(password)
      # returns password
    end

    # Protected setter for the +user+ component, and +password+ if available
    # (with validation).
    #
    # See also Bundler::URI::Generic.userinfo=.
    #
    def set_userinfo(user, password = nil)
      unless password
        user, password = split_userinfo(user)
      end
      @user     = user
      @password = password if password

      [@user, @password]
    end
    protected :set_userinfo

    # Protected setter for the user component +v+.
    #
    # See also Bundler::URI::Generic.user=.
    #
    def set_user(v)
      set_userinfo(v, @password)
      v
    end
    protected :set_user

    # Protected setter for the password component +v+.
    #
    # See also Bundler::URI::Generic.password=.
    #
    def set_password(v)
      @password = v
      # returns v
    end
    protected :set_password

    # Returns the userinfo +ui+ as <code>[user, password]</code>
    # if properly formatted as 'user:password'.
    def split_userinfo(ui)
      return nil, nil unless ui
      user, password = ui.split(':', 2)

      return user, password
    end
    private :split_userinfo

    # Escapes 'user:password' +v+ based on RFC 1738 section 3.1.
    def escape_userpass(v)
      parser.escape(v, /[@:\/]/o) # RFC 1738 section 3.1 #/
    end
    private :escape_userpass

    # Returns the userinfo, either as 'user' or 'user:password'.
    def userinfo
      if @user.nil?
        nil
      elsif @password.nil?
        @user
      else
        @user + ':' + @password
      end
    end

    # Returns the user component.
    def user
      @user
    end

    # Returns the password component.
    def password
      @password
    end

    #
    # Checks the host +v+ component for RFC2396 compliance
    # and against the Bundler::URI::Parser Regexp for :HOST.
    #
    # Can not have a registry or opaque component defined,
    # with a host component defined.
    #
    def check_host(v)
      return v unless v

      if @opaque
        raise InvalidURIError,
          "can not set host with registry or opaque"
      elsif parser.regexp[:HOST] !~ v
        raise InvalidComponentError,
          "bad component(expected host component): #{v}"
      end

      return true
    end
    private :check_host

    # Protected setter for the host component +v+.
    #
    # See also Bundler::URI::Generic.host=.
    #
    def set_host(v)
      @host = v
    end
    protected :set_host

    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the host component +v+
    # (with validation).
    #
    # See also Bundler::URI::Generic.check_host.
    #
    # == Usage
    #
    #   require 'bundler/vendor/uri/lib/uri'
    #
    #   uri = Bundler::URI.parse("http://my.example.com")
    #   uri.host = "foo.com"
    #   uri.to_s  #=> "http://foo.com"
    #
    def host=(v)
      check_host(v)
      set_host(v)
      v
    end

    # Extract the host part of the Bundler::URI and unwrap brackets for IPv6 addresses.
    #
    # This method is the same as Bundler::URI::Generic#host except
    # brackets for IPv6 (and future IP) addresses are removed.
    #
    #   uri = Bundler::URI("http://[::1]/bar")
    #   uri.hostname      #=> "::1"
    #   uri.host          #=> "[::1]"
    #
    def hostname
      v = self.host
      /\A\[(.*)\]\z/ =~ v ? $1 : v
    end

    # Sets the host part of the Bundler::URI as the argument with brackets for IPv6 addresses.
    #
    # This method is the same as Bundler::URI::Generic#host= except
    # the argument can be a bare IPv6 address.
    #
    #   uri = Bundler::URI("http://foo/bar")
    #   uri.hostname = "::1"
    #   uri.to_s  #=> "http://[::1]/bar"
    #
    # If the argument seems to be an IPv6 address,
    # it is wrapped with brackets.
    #
    def hostname=(v)
      v = "[#{v}]" if /\A\[.*\]\z/ !~ v && /:/ =~ v
      self.host = v
    end

    #
    # Checks the port +v+ component for RFC2396 compliance
    # and against the Bundler::URI::Parser Regexp for :PORT.
    #
    # Can not have a registry or opaque component defined,
    # with a port component defined.
    #
    def check_port(v)
      return v unless v

      if @opaque
        raise InvalidURIError,
          "can not set port with registry or opaque"
      elsif !v.kind_of?(Integer) && parser.regexp[:PORT] !~ v
        raise InvalidComponentError,
          "bad component(expected port component): #{v.inspect}"
      end

      return true
    end
    private :check_port

    # Protected setter for the port component +v+.
    #
    # See also Bundler::URI::Generic.port=.
    #
    def set_port(v)
      v = v.empty? ? nil : v.to_i unless !v || v.kind_of?(Integer)
      @port = v
    end
    protected :set_port

    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the port component +v+
    # (with validation).
    #
    # See also Bundler::URI::Generic.check_port.
    #
    # == Usage
    #
    #   require 'bundler/vendor/uri/lib/uri'
    #
    #   uri = Bundler::URI.parse("http://my.example.com")
    #   uri.port = 8080
    #   uri.to_s  #=> "http://my.example.com:8080"
    #
    def port=(v)
      check_port(v)
      set_port(v)
      port
    end

    def check_registry(v) # :nodoc:
      raise InvalidURIError, "can not set registry"
    end
    private :check_registry

    def set_registry(v) #:nodoc:
      raise InvalidURIError, "can not set registry"
    end
    protected :set_registry

    def registry=(v)
      raise InvalidURIError, "can not set registry"
    end

    #
    # Checks the path +v+ component for RFC2396 compliance
    # and against the Bundler::URI::Parser Regexp
    # for :ABS_PATH and :REL_PATH.
    #
    # Can not have a opaque component defined,
    # with a path component defined.
    #
    def check_path(v)
      # raise if both hier and opaque are not nil, because:
      # absoluteURI   = scheme ":" ( hier_part | opaque_part )
      # hier_part     = ( net_path | abs_path ) [ "?" query ]
      if v && @opaque
        raise InvalidURIError,
          "path conflicts with opaque"
      end

      # If scheme is ftp, path may be relative.
      # See RFC 1738 section 3.2.2, and RFC 2396.
      if @scheme && @scheme != "ftp"
        if v && v != '' && parser.regexp[:ABS_PATH] !~ v
          raise InvalidComponentError,
            "bad component(expected absolute path component): #{v}"
        end
      else
        if v && v != '' && parser.regexp[:ABS_PATH] !~ v &&
           parser.regexp[:REL_PATH] !~ v
          raise InvalidComponentError,
            "bad component(expected relative path component): #{v}"
        end
      end

      return true
    end
    private :check_path

    # Protected setter for the path component +v+.
    #
    # See also Bundler::URI::Generic.path=.
    #
    def set_path(v)
      @path = v
    end
    protected :set_path

    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the path component +v+
    # (with validation).
    #
    # See also Bundler::URI::Generic.check_path.
    #
    # == Usage
    #
    #   require 'bundler/vendor/uri/lib/uri'
    #
    #   uri = Bundler::URI.parse("http://my.example.com/pub/files")
    #   uri.path = "/faq/"
    #   uri.to_s  #=> "http://my.example.com/faq/"
    #
    def path=(v)
      check_path(v)
      set_path(v)
      v
    end

    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the query component +v+.
    #
    # == Usage
    #
    #   require 'bundler/vendor/uri/lib/uri'
    #
    #   uri = Bundler::URI.parse("http://my.example.com/?id=25")
    #   uri.query = "id=1"
    #   uri.to_s  #=> "http://my.example.com/?id=1"
    #
    def query=(v)
      return @query = nil unless v
      raise InvalidURIError, "query conflicts with opaque" if @opaque

      x = v.to_str
      v = x.dup if x.equal? v
      v.encode!(Encoding::UTF_8) rescue nil
      v.delete!("\t\r\n")
      v.force_encoding(Encoding::ASCII_8BIT)
      raise InvalidURIError, "invalid percent escape: #{$1}" if /(%\H\H)/n.match(v)
      v.gsub!(/(?!%\h\h|[!$-&(-;=?-_a-~])./n.freeze){'%%%02X' % $&.ord}
      v.force_encoding(Encoding::US_ASCII)
      @query = v
    end

    #
    # Checks the opaque +v+ component for RFC2396 compliance and
    # against the Bundler::URI::Parser Regexp for :OPAQUE.
    #
    # Can not have a host, port, user, or path component defined,
    # with an opaque component defined.
    #
    def check_opaque(v)
      return v unless v

      # raise if both hier and opaque are not nil, because:
      # absoluteURI   = scheme ":" ( hier_part | opaque_part )
      # hier_part     = ( net_path | abs_path ) [ "?" query ]
      if @host || @port || @user || @path  # userinfo = @user + ':' + @password
        raise InvalidURIError,
          "can not set opaque with host, port, userinfo or path"
      elsif v && parser.regexp[:OPAQUE] !~ v
        raise InvalidComponentError,
          "bad component(expected opaque component): #{v}"
      end

      return true
    end
    private :check_opaque

    # Protected setter for the opaque component +v+.
    #
    # See also Bundler::URI::Generic.opaque=.
    #
    def set_opaque(v)
      @opaque = v
    end
    protected :set_opaque

    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the opaque component +v+
    # (with validation).
    #
    # See also Bundler::URI::Generic.check_opaque.
    #
    def opaque=(v)
      check_opaque(v)
      set_opaque(v)
      v
    end

    #
    # Checks the fragment +v+ component against the Bundler::URI::Parser Regexp for :FRAGMENT.
    #
    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the fragment component +v+
    # (with validation).
    #
    # == Usage
    #
    #   require 'bundler/vendor/uri/lib/uri'
    #
    #   uri = Bundler::URI.parse("http://my.example.com/?id=25#time=1305212049")
    #   uri.fragment = "time=1305212086"
    #   uri.to_s  #=> "http://my.example.com/?id=25#time=1305212086"
    #
    def fragment=(v)
      return @fragment = nil unless v

      x = v.to_str
      v = x.dup if x.equal? v
      v.encode!(Encoding::UTF_8) rescue nil
      v.delete!("\t\r\n")
      v.force_encoding(Encoding::ASCII_8BIT)
      v.gsub!(/(?!%\h\h|[!-~])./n){'%%%02X' % $&.ord}
      v.force_encoding(Encoding::US_ASCII)
      @fragment = v
    end

    #
    # Returns true if Bundler::URI is hierarchical.
    #
    # == Description
    #
    # Bundler::URI has components listed in order of decreasing significance from left to right,
    # see RFC3986 https://tools.ietf.org/html/rfc3986 1.2.3.
    #
    # == Usage
    #
    #   require 'bundler/vendor/uri/lib/uri'
    #
    #   uri = Bundler::URI.parse("http://my.example.com/")
    #   uri.hierarchical?
    #   #=> true
    #   uri = Bundler::URI.parse("mailto:joe@example.com")
    #   uri.hierarchical?
    #   #=> false
    #
    def hierarchical?
      if @path
        true
      else
        false
      end
    end

    #
    # Returns true if Bundler::URI has a scheme (e.g. http:// or https://) specified.
    #
    def absolute?
      if @scheme
        true
      else
        false
      end
    end
    alias absolute absolute?

    #
    # Returns true if Bundler::URI does not have a scheme (e.g. http:// or https://) specified.
    #
    def relative?
      !absolute?
    end

    #
    # Returns an Array of the path split on '/'.
    #
    def split_path(path)
      path.split("/", -1)
    end
    private :split_path

    #
    # Merges a base path +base+, with relative path +rel+,
    # returns a modified base path.
    #
    def merge_path(base, rel)

      # RFC2396, Section 5.2, 5)
      # RFC2396, Section 5.2, 6)
      base_path = split_path(base)
      rel_path  = split_path(rel)

      # RFC2396, Section 5.2, 6), a)
      base_path << '' if base_path.last == '..'
      while i = base_path.index('..')
        base_path.slice!(i - 1, 2)
      end

      if (first = rel_path.first) and first.empty?
        base_path.clear
        rel_path.shift
      end

      # RFC2396, Section 5.2, 6), c)
      # RFC2396, Section 5.2, 6), d)
      rel_path.push('') if rel_path.last == '.' || rel_path.last == '..'
      rel_path.delete('.')

      # RFC2396, Section 5.2, 6), e)
      tmp = []
      rel_path.each do |x|
        if x == '..' &&
            !(tmp.empty? || tmp.last == '..')
          tmp.pop
        else
          tmp << x
        end
      end

      add_trailer_slash = !tmp.empty?
      if base_path.empty?
        base_path = [''] # keep '/' for root directory
      elsif add_trailer_slash
        base_path.pop
      end
      while x = tmp.shift
        if x == '..'
          # RFC2396, Section 4
          # a .. or . in an absolute path has no special meaning
          base_path.pop if base_path.size > 1
        else
          # if x == '..'
          #   valid absolute (but abnormal) path "/../..."
          # else
          #   valid absolute path
          # end
          base_path << x
          tmp.each {|t| base_path << t}
          add_trailer_slash = false
          break
        end
      end
      base_path.push('') if add_trailer_slash

      return base_path.join('/')
    end
    private :merge_path

    #
    # == Args
    #
    # +oth+::
    #    Bundler::URI or String
    #
    # == Description
    #
    # Destructive form of #merge.
    #
    # == Usage
    #
    #   require 'bundler/vendor/uri/lib/uri'
    #
    #   uri = Bundler::URI.parse("http://my.example.com")
    #   uri.merge!("/main.rbx?page=1")
    #   uri.to_s  # => "http://my.example.com/main.rbx?page=1"
    #
    def merge!(oth)
      t = merge(oth)
      if self == t
        nil
      else
        replace!(t)
        self
      end
    end

    #
    # == Args
    #
    # +oth+::
    #    Bundler::URI or String
    #
    # == Description
    #
    # Merges two URIs.
    #
    # == Usage
    #
    #   require 'bundler/vendor/uri/lib/uri'
    #
    #   uri = Bundler::URI.parse("http://my.example.com")
    #   uri.merge("/main.rbx?page=1")
    #   # => "http://my.example.com/main.rbx?page=1"
    #
    def merge(oth)
      rel = parser.__send__(:convert_to_uri, oth)

      if rel.absolute?
        #raise BadURIError, "both Bundler::URI are absolute" if absolute?
        # hmm... should return oth for usability?
        return rel
      end

      unless self.absolute?
        raise BadURIError, "both Bundler::URI are relative"
      end

      base = self.dup

      authority = rel.userinfo || rel.host || rel.port

      # RFC2396, Section 5.2, 2)
      if (rel.path.nil? || rel.path.empty?) && !authority && !rel.query
        base.fragment=(rel.fragment) if rel.fragment
        return base
      end

      base.query = nil
      base.fragment=(nil)

      # RFC2396, Section 5.2, 4)
      if !authority
        base.set_path(merge_path(base.path, rel.path)) if base.path && rel.path
      else
        # RFC2396, Section 5.2, 4)
        base.set_path(rel.path) if rel.path
      end

      # RFC2396, Section 5.2, 7)
      base.set_userinfo(rel.userinfo) if rel.userinfo
      base.set_host(rel.host)         if rel.host
      base.set_port(rel.port)         if rel.port
      base.query = rel.query       if rel.query
      base.fragment=(rel.fragment) if rel.fragment

      return base
    end # merge
    alias + merge

    # :stopdoc:
    def route_from_path(src, dst)
      case dst
      when src
        # RFC2396, Section 4.2
        return ''
      when %r{(?:\A|/)\.\.?(?:/|\z)}
        # dst has abnormal absolute path,
        # like "/./", "/../", "/x/../", ...
        return dst.dup
      end

      src_path = src.scan(%r{[^/]*/})
      dst_path = dst.scan(%r{[^/]*/?})

      # discard same parts
      while !dst_path.empty? && dst_path.first == src_path.first
        src_path.shift
        dst_path.shift
      end

      tmp = dst_path.join

      # calculate
      if src_path.empty?
        if tmp.empty?
          return './'
        elsif dst_path.first.include?(':') # (see RFC2396 Section 5)
          return './' + tmp
        else
          return tmp
        end
      end

      return '../' * src_path.size + tmp
    end
    private :route_from_path
    # :startdoc:

    # :stopdoc:
    def route_from0(oth)
      oth = parser.__send__(:convert_to_uri, oth)
      if self.relative?
        raise BadURIError,
          "relative Bundler::URI: #{self}"
      end
      if oth.relative?
        raise BadURIError,
          "relative Bundler::URI: #{oth}"
      end

      if self.scheme != oth.scheme
        return self, self.dup
      end
      rel = Bundler::URI::Generic.new(nil, # it is relative Bundler::URI
                             self.userinfo, self.host, self.port,
                             nil, self.path, self.opaque,
                             self.query, self.fragment, parser)

      if rel.userinfo != oth.userinfo ||
          rel.host.to_s.downcase != oth.host.to_s.downcase ||
          rel.port != oth.port

        if self.userinfo.nil? && self.host.nil?
          return self, self.dup
        end

        rel.set_port(nil) if rel.port == oth.default_port
        return rel, rel
      end
      rel.set_userinfo(nil)
      rel.set_host(nil)
      rel.set_port(nil)

      if rel.path && rel.path == oth.path
        rel.set_path('')
        rel.query = nil if rel.query == oth.query
        return rel, rel
      elsif rel.opaque && rel.opaque == oth.opaque
        rel.set_opaque('')
        rel.query = nil if rel.query == oth.query
        return rel, rel
      end

      # you can modify `rel', but can not `oth'.
      return oth, rel
    end
    private :route_from0
    # :startdoc:

    #
    # == Args
    #
    # +oth+::
    #    Bundler::URI or String
    #
    # == Description
    #
    # Calculates relative path from oth to self.
    #
    # == Usage
    #
    #   require 'bundler/vendor/uri/lib/uri'
    #
    #   uri = Bundler::URI.parse('http://my.example.com/main.rbx?page=1')
    #   uri.route_from('http://my.example.com')
    #   #=> #<Bundler::URI::Generic /main.rbx?page=1>
    #
    def route_from(oth)
      # you can modify `rel', but can not `oth'.
      begin
        oth, rel = route_from0(oth)
      rescue
        raise $!.class, $!.message
      end
      if oth == rel
        return rel
      end

      rel.set_path(route_from_path(oth.path, self.path))
      if rel.path == './' && self.query
        # "./?foo" -> "?foo"
        rel.set_path('')
      end

      return rel
    end

    alias - route_from

    #
    # == Args
    #
    # +oth+::
    #    Bundler::URI or String
    #
    # == Description
    #
    # Calculates relative path to oth from self.
    #
    # == Usage
    #
    #   require 'bundler/vendor/uri/lib/uri'
    #
    #   uri = Bundler::URI.parse('http://my.example.com')
    #   uri.route_to('http://my.example.com/main.rbx?page=1')
    #   #=> #<Bundler::URI::Generic /main.rbx?page=1>
    #
    def route_to(oth)
      parser.__send__(:convert_to_uri, oth).route_from(self)
    end

    #
    # Returns normalized Bundler::URI.
    #
    #   require 'bundler/vendor/uri/lib/uri'
    #
    #   Bundler::URI("HTTP://my.EXAMPLE.com").normalize
    #   #=> #<Bundler::URI::HTTP http://my.example.com/>
    #
    # Normalization here means:
    #
    # * scheme and host are converted to lowercase,
    # * an empty path component is set to "/".
    #
    def normalize
      uri = dup
      uri.normalize!
      uri
    end

    #
    # Destructive version of #normalize.
    #
    def normalize!
      if path&.empty?
        set_path('/')
      end
      if scheme && scheme != scheme.downcase
        set_scheme(self.scheme.downcase)
      end
      if host && host != host.downcase
        set_host(self.host.downcase)
      end
    end

    #
    # Constructs String from Bundler::URI.
    #
    def to_s
      str = ''.dup
      if @scheme
        str << @scheme
        str << ':'
      end

      if @opaque
        str << @opaque
      else
        if @host || %w[file postgres].include?(@scheme)
          str << '//'
        end
        if self.userinfo
          str << self.userinfo
          str << '@'
        end
        if @host
          str << @host
        end
        if @port && @port != self.default_port
          str << ':'
          str << @port.to_s
        end
        str << @path
        if @query
          str << '?'
          str << @query
        end
      end
      if @fragment
        str << '#'
        str << @fragment
      end
      str
    end

    #
    # Compares two URIs.
    #
    def ==(oth)
      if self.class == oth.class
        self.normalize.component_ary == oth.normalize.component_ary
      else
        false
      end
    end

    def hash
      self.component_ary.hash
    end

    def eql?(oth)
      self.class == oth.class &&
      parser == oth.parser &&
      self.component_ary.eql?(oth.component_ary)
    end

=begin

--- Bundler::URI::Generic#===(oth)

=end
#    def ===(oth)
#      raise NotImplementedError
#    end

=begin
=end


    # Returns an Array of the components defined from the COMPONENT Array.
    def component_ary
      component.collect do |x|
        self.__send__(x)
      end
    end
    protected :component_ary

    # == Args
    #
    # +components+::
    #    Multiple Symbol arguments defined in Bundler::URI::HTTP.
    #
    # == Description
    #
    # Selects specified components from Bundler::URI.
    #
    # == Usage
    #
    #   require 'bundler/vendor/uri/lib/uri'
    #
    #   uri = Bundler::URI.parse('http://myuser:mypass@my.example.com/test.rbx')
    #   uri.select(:userinfo, :host, :path)
    #   # => ["myuser:mypass", "my.example.com", "/test.rbx"]
    #
    def select(*components)
      components.collect do |c|
        if component.include?(c)
          self.__send__(c)
        else
          raise ArgumentError,
            "expected of components of #{self.class} (#{self.class.component.join(', ')})"
        end
      end
    end

    def inspect
      "#<#{self.class} #{self}>"
    end

    #
    # == Args
    #
    # +v+::
    #    Bundler::URI or String
    #
    # == Description
    #
    # Attempts to parse other Bundler::URI +oth+,
    # returns [parsed_oth, self].
    #
    # == Usage
    #
    #   require 'bundler/vendor/uri/lib/uri'
    #
    #   uri = Bundler::URI.parse("http://my.example.com")
    #   uri.coerce("http://foo.com")
    #   #=> [#<Bundler::URI::HTTP http://foo.com>, #<Bundler::URI::HTTP http://my.example.com>]
    #
    def coerce(oth)
      case oth
      when String
        oth = parser.parse(oth)
      else
        super
      end

      return oth, self
    end

    # Returns a proxy Bundler::URI.
    # The proxy Bundler::URI is obtained from environment variables such as http_proxy,
    # ftp_proxy, no_proxy, etc.
    # If there is no proper proxy, nil is returned.
    #
    # If the optional parameter +env+ is specified, it is used instead of ENV.
    #
    # Note that capitalized variables (HTTP_PROXY, FTP_PROXY, NO_PROXY, etc.)
    # are examined, too.
    #
    # But http_proxy and HTTP_PROXY is treated specially under CGI environment.
    # It's because HTTP_PROXY may be set by Proxy: header.
    # So HTTP_PROXY is not used.
    # http_proxy is not used too if the variable is case insensitive.
    # CGI_HTTP_PROXY can be used instead.
    def find_proxy(env=ENV)
      raise BadURIError, "relative Bundler::URI: #{self}" if self.relative?
      name = self.scheme.downcase + '_proxy'
      proxy_uri = nil
      if name == 'http_proxy' && env.include?('REQUEST_METHOD') # CGI?
        # HTTP_PROXY conflicts with *_proxy for proxy settings and
        # HTTP_* for header information in CGI.
        # So it should be careful to use it.
        pairs = env.reject {|k, v| /\Ahttp_proxy\z/i !~ k }
        case pairs.length
        when 0 # no proxy setting anyway.
          proxy_uri = nil
        when 1
          k, _ = pairs.shift
          if k == 'http_proxy' && env[k.upcase] == nil
            # http_proxy is safe to use because ENV is case sensitive.
            proxy_uri = env[name]
          else
            proxy_uri = nil
          end
        else # http_proxy is safe to use because ENV is case sensitive.
          proxy_uri = env.to_hash[name]
        end
        if !proxy_uri
          # Use CGI_HTTP_PROXY.  cf. libwww-perl.
          proxy_uri = env["CGI_#{name.upcase}"]
        end
      elsif name == 'http_proxy'
        unless proxy_uri = env[name]
          if proxy_uri = env[name.upcase]
            warn 'The environment variable HTTP_PROXY is discouraged.  Use http_proxy.', uplevel: 1
          end
        end
      else
        proxy_uri = env[name] || env[name.upcase]
      end

      if proxy_uri.nil? || proxy_uri.empty?
        return nil
      end

      if self.hostname
        begin
          addr = IPSocket.getaddress(self.hostname)
          return nil if /\A127\.|\A::1\z/ =~ addr
        rescue SocketError
        end
      end

      name = 'no_proxy'
      if no_proxy = env[name] || env[name.upcase]
        return nil unless Bundler::URI::Generic.use_proxy?(self.hostname, addr, self.port, no_proxy)
      end
      Bundler::URI.parse(proxy_uri)
    end

    def self.use_proxy?(hostname, addr, port, no_proxy) # :nodoc:
      hostname = hostname.downcase
      dothostname = ".#{hostname}"
      no_proxy.scan(/([^:,\s]+)(?::(\d+))?/) {|p_host, p_port|
        if !p_port || port == p_port.to_i
          if p_host.start_with?('.')
            return false if hostname.end_with?(p_host.downcase)
          else
            return false if dothostname.end_with?(".#{p_host.downcase}")
          end
          if addr
            begin
              return false if IPAddr.new(p_host).include?(addr)
            rescue IPAddr::InvalidAddressError
              next
            end
          end
        end
      }
      true
    end
  end
end
PK}$[(@Y�:�:>gems/gems/bundler-2.3.27/lib/bundler/vendor/tsort/lib/tsort.rbnu�[���# frozen_string_literal: true

#--
# tsort.rb - provides a module for topological sorting and strongly connected components.
#++
#

#
# Bundler::TSort implements topological sorting using Tarjan's algorithm for
# strongly connected components.
#
# Bundler::TSort is designed to be able to be used with any object which can be
# interpreted as a directed graph.
#
# Bundler::TSort requires two methods to interpret an object as a graph,
# tsort_each_node and tsort_each_child.
#
# * tsort_each_node is used to iterate for all nodes over a graph.
# * tsort_each_child is used to iterate for child nodes of a given node.
#
# The equality of nodes are defined by eql? and hash since
# Bundler::TSort uses Hash internally.
#
# == A Simple Example
#
# The following example demonstrates how to mix the Bundler::TSort module into an
# existing class (in this case, Hash). Here, we're treating each key in
# the hash as a node in the graph, and so we simply alias the required
# #tsort_each_node method to Hash's #each_key method. For each key in the
# hash, the associated value is an array of the node's child nodes. This
# choice in turn leads to our implementation of the required #tsort_each_child
# method, which fetches the array of child nodes and then iterates over that
# array using the user-supplied block.
#
#   require 'bundler/vendor/tsort/lib/tsort'
#
#   class Hash
#     include Bundler::TSort
#     alias tsort_each_node each_key
#     def tsort_each_child(node, &block)
#       fetch(node).each(&block)
#     end
#   end
#
#   {1=>[2, 3], 2=>[3], 3=>[], 4=>[]}.tsort
#   #=> [3, 2, 1, 4]
#
#   {1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}.strongly_connected_components
#   #=> [[4], [2, 3], [1]]
#
# == A More Realistic Example
#
# A very simple `make' like tool can be implemented as follows:
#
#   require 'bundler/vendor/tsort/lib/tsort'
#
#   class Make
#     def initialize
#       @dep = {}
#       @dep.default = []
#     end
#
#     def rule(outputs, inputs=[], &block)
#       triple = [outputs, inputs, block]
#       outputs.each {|f| @dep[f] = [triple]}
#       @dep[triple] = inputs
#     end
#
#     def build(target)
#       each_strongly_connected_component_from(target) {|ns|
#         if ns.length != 1
#           fs = ns.delete_if {|n| Array === n}
#           raise Bundler::TSort::Cyclic.new("cyclic dependencies: #{fs.join ', '}")
#         end
#         n = ns.first
#         if Array === n
#           outputs, inputs, block = n
#           inputs_time = inputs.map {|f| File.mtime f}.max
#           begin
#             outputs_time = outputs.map {|f| File.mtime f}.min
#           rescue Errno::ENOENT
#             outputs_time = nil
#           end
#           if outputs_time == nil ||
#              inputs_time != nil && outputs_time <= inputs_time
#             sleep 1 if inputs_time != nil && inputs_time.to_i == Time.now.to_i
#             block.call
#           end
#         end
#       }
#     end
#
#     def tsort_each_child(node, &block)
#       @dep[node].each(&block)
#     end
#     include Bundler::TSort
#   end
#
#   def command(arg)
#     print arg, "\n"
#     system arg
#   end
#
#   m = Make.new
#   m.rule(%w[t1]) { command 'date > t1' }
#   m.rule(%w[t2]) { command 'date > t2' }
#   m.rule(%w[t3]) { command 'date > t3' }
#   m.rule(%w[t4], %w[t1 t3]) { command 'cat t1 t3 > t4' }
#   m.rule(%w[t5], %w[t4 t2]) { command 'cat t4 t2 > t5' }
#   m.build('t5')
#
# == Bugs
#
# * 'tsort.rb' is wrong name because this library uses
#   Tarjan's algorithm for strongly connected components.
#   Although 'strongly_connected_components.rb' is correct but too long.
#
# == References
#
# R. E. Tarjan, "Depth First Search and Linear Graph Algorithms",
# <em>SIAM Journal on Computing</em>, Vol. 1, No. 2, pp. 146-160, June 1972.
#

module Bundler::TSort
  class Cyclic < StandardError
  end

  # Returns a topologically sorted array of nodes.
  # The array is sorted from children to parents, i.e.
  # the first element has no child and the last node has no parent.
  #
  # If there is a cycle, Bundler::TSort::Cyclic is raised.
  #
  #   class G
  #     include Bundler::TSort
  #     def initialize(g)
  #       @g = g
  #     end
  #     def tsort_each_child(n, &b) @g[n].each(&b) end
  #     def tsort_each_node(&b) @g.each_key(&b) end
  #   end
  #
  #   graph = G.new({1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]})
  #   p graph.tsort #=> [4, 2, 3, 1]
  #
  #   graph = G.new({1=>[2], 2=>[3, 4], 3=>[2], 4=>[]})
  #   p graph.tsort # raises Bundler::TSort::Cyclic
  #
  def tsort
    each_node = method(:tsort_each_node)
    each_child = method(:tsort_each_child)
    Bundler::TSort.tsort(each_node, each_child)
  end

  # Returns a topologically sorted array of nodes.
  # The array is sorted from children to parents, i.e.
  # the first element has no child and the last node has no parent.
  #
  # The graph is represented by _each_node_ and _each_child_.
  # _each_node_ should have +call+ method which yields for each node in the graph.
  # _each_child_ should have +call+ method which takes a node argument and yields for each child node.
  #
  # If there is a cycle, Bundler::TSort::Cyclic is raised.
  #
  #   g = {1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]}
  #   each_node = lambda {|&b| g.each_key(&b) }
  #   each_child = lambda {|n, &b| g[n].each(&b) }
  #   p Bundler::TSort.tsort(each_node, each_child) #=> [4, 2, 3, 1]
  #
  #   g = {1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}
  #   each_node = lambda {|&b| g.each_key(&b) }
  #   each_child = lambda {|n, &b| g[n].each(&b) }
  #   p Bundler::TSort.tsort(each_node, each_child) # raises Bundler::TSort::Cyclic
  #
  def self.tsort(each_node, each_child)
    tsort_each(each_node, each_child).to_a
  end

  # The iterator version of the #tsort method.
  # <tt><em>obj</em>.tsort_each</tt> is similar to <tt><em>obj</em>.tsort.each</tt>, but
  # modification of _obj_ during the iteration may lead to unexpected results.
  #
  # #tsort_each returns +nil+.
  # If there is a cycle, Bundler::TSort::Cyclic is raised.
  #
  #   class G
  #     include Bundler::TSort
  #     def initialize(g)
  #       @g = g
  #     end
  #     def tsort_each_child(n, &b) @g[n].each(&b) end
  #     def tsort_each_node(&b) @g.each_key(&b) end
  #   end
  #
  #   graph = G.new({1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]})
  #   graph.tsort_each {|n| p n }
  #   #=> 4
  #   #   2
  #   #   3
  #   #   1
  #
  def tsort_each(&block) # :yields: node
    each_node = method(:tsort_each_node)
    each_child = method(:tsort_each_child)
    Bundler::TSort.tsort_each(each_node, each_child, &block)
  end

  # The iterator version of the Bundler::TSort.tsort method.
  #
  # The graph is represented by _each_node_ and _each_child_.
  # _each_node_ should have +call+ method which yields for each node in the graph.
  # _each_child_ should have +call+ method which takes a node argument and yields for each child node.
  #
  #   g = {1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]}
  #   each_node = lambda {|&b| g.each_key(&b) }
  #   each_child = lambda {|n, &b| g[n].each(&b) }
  #   Bundler::TSort.tsort_each(each_node, each_child) {|n| p n }
  #   #=> 4
  #   #   2
  #   #   3
  #   #   1
  #
  def self.tsort_each(each_node, each_child) # :yields: node
    return to_enum(__method__, each_node, each_child) unless block_given?

    each_strongly_connected_component(each_node, each_child) {|component|
      if component.size == 1
        yield component.first
      else
        raise Cyclic.new("topological sort failed: #{component.inspect}")
      end
    }
  end

  # Returns strongly connected components as an array of arrays of nodes.
  # The array is sorted from children to parents.
  # Each elements of the array represents a strongly connected component.
  #
  #   class G
  #     include Bundler::TSort
  #     def initialize(g)
  #       @g = g
  #     end
  #     def tsort_each_child(n, &b) @g[n].each(&b) end
  #     def tsort_each_node(&b) @g.each_key(&b) end
  #   end
  #
  #   graph = G.new({1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]})
  #   p graph.strongly_connected_components #=> [[4], [2], [3], [1]]
  #
  #   graph = G.new({1=>[2], 2=>[3, 4], 3=>[2], 4=>[]})
  #   p graph.strongly_connected_components #=> [[4], [2, 3], [1]]
  #
  def strongly_connected_components
    each_node = method(:tsort_each_node)
    each_child = method(:tsort_each_child)
    Bundler::TSort.strongly_connected_components(each_node, each_child)
  end

  # Returns strongly connected components as an array of arrays of nodes.
  # The array is sorted from children to parents.
  # Each elements of the array represents a strongly connected component.
  #
  # The graph is represented by _each_node_ and _each_child_.
  # _each_node_ should have +call+ method which yields for each node in the graph.
  # _each_child_ should have +call+ method which takes a node argument and yields for each child node.
  #
  #   g = {1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]}
  #   each_node = lambda {|&b| g.each_key(&b) }
  #   each_child = lambda {|n, &b| g[n].each(&b) }
  #   p Bundler::TSort.strongly_connected_components(each_node, each_child)
  #   #=> [[4], [2], [3], [1]]
  #
  #   g = {1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}
  #   each_node = lambda {|&b| g.each_key(&b) }
  #   each_child = lambda {|n, &b| g[n].each(&b) }
  #   p Bundler::TSort.strongly_connected_components(each_node, each_child)
  #   #=> [[4], [2, 3], [1]]
  #
  def self.strongly_connected_components(each_node, each_child)
    each_strongly_connected_component(each_node, each_child).to_a
  end

  # The iterator version of the #strongly_connected_components method.
  # <tt><em>obj</em>.each_strongly_connected_component</tt> is similar to
  # <tt><em>obj</em>.strongly_connected_components.each</tt>, but
  # modification of _obj_ during the iteration may lead to unexpected results.
  #
  # #each_strongly_connected_component returns +nil+.
  #
  #   class G
  #     include Bundler::TSort
  #     def initialize(g)
  #       @g = g
  #     end
  #     def tsort_each_child(n, &b) @g[n].each(&b) end
  #     def tsort_each_node(&b) @g.each_key(&b) end
  #   end
  #
  #   graph = G.new({1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]})
  #   graph.each_strongly_connected_component {|scc| p scc }
  #   #=> [4]
  #   #   [2]
  #   #   [3]
  #   #   [1]
  #
  #   graph = G.new({1=>[2], 2=>[3, 4], 3=>[2], 4=>[]})
  #   graph.each_strongly_connected_component {|scc| p scc }
  #   #=> [4]
  #   #   [2, 3]
  #   #   [1]
  #
  def each_strongly_connected_component(&block) # :yields: nodes
    each_node = method(:tsort_each_node)
    each_child = method(:tsort_each_child)
    Bundler::TSort.each_strongly_connected_component(each_node, each_child, &block)
  end

  # The iterator version of the Bundler::TSort.strongly_connected_components method.
  #
  # The graph is represented by _each_node_ and _each_child_.
  # _each_node_ should have +call+ method which yields for each node in the graph.
  # _each_child_ should have +call+ method which takes a node argument and yields for each child node.
  #
  #   g = {1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]}
  #   each_node = lambda {|&b| g.each_key(&b) }
  #   each_child = lambda {|n, &b| g[n].each(&b) }
  #   Bundler::TSort.each_strongly_connected_component(each_node, each_child) {|scc| p scc }
  #   #=> [4]
  #   #   [2]
  #   #   [3]
  #   #   [1]
  #
  #   g = {1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}
  #   each_node = lambda {|&b| g.each_key(&b) }
  #   each_child = lambda {|n, &b| g[n].each(&b) }
  #   Bundler::TSort.each_strongly_connected_component(each_node, each_child) {|scc| p scc }
  #   #=> [4]
  #   #   [2, 3]
  #   #   [1]
  #
  def self.each_strongly_connected_component(each_node, each_child) # :yields: nodes
    return to_enum(__method__, each_node, each_child) unless block_given?

    id_map = {}
    stack = []
    each_node.call {|node|
      unless id_map.include? node
        each_strongly_connected_component_from(node, each_child, id_map, stack) {|c|
          yield c
        }
      end
    }
    nil
  end

  # Iterates over strongly connected component in the subgraph reachable from
  # _node_.
  #
  # Return value is unspecified.
  #
  # #each_strongly_connected_component_from doesn't call #tsort_each_node.
  #
  #   class G
  #     include Bundler::TSort
  #     def initialize(g)
  #       @g = g
  #     end
  #     def tsort_each_child(n, &b) @g[n].each(&b) end
  #     def tsort_each_node(&b) @g.each_key(&b) end
  #   end
  #
  #   graph = G.new({1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]})
  #   graph.each_strongly_connected_component_from(2) {|scc| p scc }
  #   #=> [4]
  #   #   [2]
  #
  #   graph = G.new({1=>[2], 2=>[3, 4], 3=>[2], 4=>[]})
  #   graph.each_strongly_connected_component_from(2) {|scc| p scc }
  #   #=> [4]
  #   #   [2, 3]
  #
  def each_strongly_connected_component_from(node, id_map={}, stack=[], &block) # :yields: nodes
    Bundler::TSort.each_strongly_connected_component_from(node, method(:tsort_each_child), id_map, stack, &block)
  end

  # Iterates over strongly connected components in a graph.
  # The graph is represented by _node_ and _each_child_.
  #
  # _node_ is the first node.
  # _each_child_ should have +call+ method which takes a node argument
  # and yields for each child node.
  #
  # Return value is unspecified.
  #
  # #Bundler::TSort.each_strongly_connected_component_from is a class method and
  # it doesn't need a class to represent a graph which includes Bundler::TSort.
  #
  #   graph = {1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}
  #   each_child = lambda {|n, &b| graph[n].each(&b) }
  #   Bundler::TSort.each_strongly_connected_component_from(1, each_child) {|scc|
  #     p scc
  #   }
  #   #=> [4]
  #   #   [2, 3]
  #   #   [1]
  #
  def self.each_strongly_connected_component_from(node, each_child, id_map={}, stack=[]) # :yields: nodes
    return to_enum(__method__, node, each_child, id_map, stack) unless block_given?

    minimum_id = node_id = id_map[node] = id_map.size
    stack_length = stack.length
    stack << node

    each_child.call(node) {|child|
      if id_map.include? child
        child_id = id_map[child]
        minimum_id = child_id if child_id && child_id < minimum_id
      else
        sub_minimum_id =
          each_strongly_connected_component_from(child, each_child, id_map, stack) {|c|
            yield c
          }
        minimum_id = sub_minimum_id if sub_minimum_id < minimum_id
      end
    }

    if node_id == minimum_id
      component = stack.slice!(stack_length .. -1)
      component.each {|n| id_map[n] = nil}
      yield component
    end

    minimum_id
  end

  # Should be implemented by a extended class.
  #
  # #tsort_each_node is used to iterate for all nodes over a graph.
  #
  def tsort_each_node # :yields: node
    raise NotImplementedError.new
  end

  # Should be implemented by a extended class.
  #
  # #tsort_each_child is used to iterate for child nodes of _node_.
  #
  def tsort_each_child(node) # :yields: child
    raise NotImplementedError.new
  end
end
PK}$[C�}�m�mZgems/gems/bundler-2.3.27/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rbnu�[���require 'net/http'
require_relative '../../../../uri/lib/uri'
require 'cgi' # for escaping
require_relative '../../../../connection_pool/lib/connection_pool'

autoload :OpenSSL, 'openssl'

##
# Persistent connections for Net::HTTP
#
# Bundler::Persistent::Net::HTTP::Persistent maintains persistent connections across all the
# servers you wish to talk to.  For each host:port you communicate with a
# single persistent connection is created.
#
# Connections will be shared across threads through a connection pool to
# increase reuse of connections.
#
# You can shut down any remaining HTTP connections when done by calling
# #shutdown.
#
# Example:
#
#   require 'bundler/vendor/net-http-persistent/lib/net/http/persistent'
#
#   uri = Bundler::URI 'http://example.com/awesome/web/service'
#
#   http = Bundler::Persistent::Net::HTTP::Persistent.new
#
#   # perform a GET
#   response = http.request uri
#
#   # or
#
#   get = Net::HTTP::Get.new uri.request_uri
#   response = http.request get
#
#   # create a POST
#   post_uri = uri + 'create'
#   post = Net::HTTP::Post.new post_uri.path
#   post.set_form_data 'some' => 'cool data'
#
#   # perform the POST, the Bundler::URI is always required
#   response http.request post_uri, post
#
# Note that for GET, HEAD and other requests that do not have a body you want
# to use Bundler::URI#request_uri not Bundler::URI#path.  The request_uri contains the query
# params which are sent in the body for other requests.
#
# == TLS/SSL
#
# TLS connections are automatically created depending upon the scheme of the
# Bundler::URI.  TLS connections are automatically verified against the default
# certificate store for your computer.  You can override this by changing
# verify_mode or by specifying an alternate cert_store.
#
# Here are the TLS settings, see the individual methods for documentation:
#
# #certificate        :: This client's certificate
# #ca_file            :: The certificate-authorities
# #ca_path            :: Directory with certificate-authorities
# #cert_store         :: An SSL certificate store
# #ciphers            :: List of SSl ciphers allowed
# #private_key        :: The client's SSL private key
# #reuse_ssl_sessions :: Reuse a previously opened SSL session for a new
#                        connection
# #ssl_timeout        :: Session lifetime
# #ssl_version        :: Which specific SSL version to use
# #verify_callback    :: For server certificate verification
# #verify_depth       :: Depth of certificate verification
# #verify_mode        :: How connections should be verified
#
# == Proxies
#
# A proxy can be set through #proxy= or at initialization time by providing a
# second argument to ::new.  The proxy may be the Bundler::URI of the proxy server or
# <code>:ENV</code> which will consult environment variables.
#
# See #proxy= and #proxy_from_env for details.
#
# == Headers
#
# Headers may be specified for use in every request.  #headers are appended to
# any headers on the request.  #override_headers replace existing headers on
# the request.
#
# The difference between the two can be seen in setting the User-Agent.  Using
# <code>http.headers['User-Agent'] = 'MyUserAgent'</code> will send "Ruby,
# MyUserAgent" while <code>http.override_headers['User-Agent'] =
# 'MyUserAgent'</code> will send "MyUserAgent".
#
# == Tuning
#
# === Segregation
#
# Each Bundler::Persistent::Net::HTTP::Persistent instance has its own pool of connections.  There
# is no sharing with other instances (as was true in earlier versions).
#
# === Idle Timeout
#
# If a connection hasn't been used for this number of seconds it will
# automatically be reset upon the next use to avoid attempting to send to a
# closed connection.  The default value is 5 seconds. nil means no timeout.
# Set through #idle_timeout.
#
# Reducing this value may help avoid the "too many connection resets" error
# when sending non-idempotent requests while increasing this value will cause
# fewer round-trips.
#
# === Read Timeout
#
# The amount of time allowed between reading two chunks from the socket.  Set
# through #read_timeout
#
# === Max Requests
#
# The number of requests that should be made before opening a new connection.
# Typically many keep-alive capable servers tune this to 100 or less, so the
# 101st request will fail with ECONNRESET. If unset (default), this value has
# no effect, if set, connections will be reset on the request after
# max_requests.
#
# === Open Timeout
#
# The amount of time to wait for a connection to be opened.  Set through
# #open_timeout.
#
# === Socket Options
#
# Socket options may be set on newly-created connections.  See #socket_options
# for details.
#
# === Connection Termination
#
# If you are done using the Bundler::Persistent::Net::HTTP::Persistent instance you may shut down
# all the connections in the current thread with #shutdown.  This is not
# recommended for normal use, it should only be used when it will be several
# minutes before you make another HTTP request.
#
# If you are using multiple threads, call #shutdown in each thread when the
# thread is done making requests.  If you don't call shutdown, that's OK.
# Ruby will automatically garbage collect and shutdown your HTTP connections
# when the thread terminates.

class Bundler::Persistent::Net::HTTP::Persistent

  ##
  # The beginning of Time

  EPOCH = Time.at 0 # :nodoc:

  ##
  # Is OpenSSL available?  This test works with autoload

  HAVE_OPENSSL = defined? OpenSSL::SSL # :nodoc:

  ##
  # The default connection pool size is 1/4 the allowed open files
  # (<code>ulimit -n</code>) or 256 if your OS does not support file handle
  # limits (typically windows).

  if Process.const_defined? :RLIMIT_NOFILE
    open_file_limits = Process.getrlimit(Process::RLIMIT_NOFILE)

    # Under JRuby on Windows Process responds to `getrlimit` but returns something that does not match docs
    if open_file_limits.respond_to?(:first)
      DEFAULT_POOL_SIZE = open_file_limits.first / 4
    else
      DEFAULT_POOL_SIZE = 256
    end
  else
    DEFAULT_POOL_SIZE = 256
  end

  ##
  # The version of Bundler::Persistent::Net::HTTP::Persistent you are using

  VERSION = '4.0.0'

  ##
  # Error class for errors raised by Bundler::Persistent::Net::HTTP::Persistent.  Various
  # SystemCallErrors are re-raised with a human-readable message under this
  # class.

  class Error < StandardError; end

  ##
  # Use this method to detect the idle timeout of the host at +uri+.  The
  # value returned can be used to configure #idle_timeout.  +max+ controls the
  # maximum idle timeout to detect.
  #
  # After
  #
  # Idle timeout detection is performed by creating a connection then
  # performing a HEAD request in a loop until the connection terminates
  # waiting one additional second per loop.
  #
  # NOTE:  This may not work on ruby > 1.9.

  def self.detect_idle_timeout uri, max = 10
    uri = Bundler::URI uri unless Bundler::URI::Generic === uri
    uri += '/'

    req = Net::HTTP::Head.new uri.request_uri

    http = new 'net-http-persistent detect_idle_timeout'

    http.connection_for uri do |connection|
      sleep_time = 0

      http = connection.http

      loop do
        response = http.request req

        $stderr.puts "HEAD #{uri} => #{response.code}" if $DEBUG

        unless Net::HTTPOK === response then
          raise Error, "bad response code #{response.code} detecting idle timeout"
        end

        break if sleep_time >= max

        sleep_time += 1

        $stderr.puts "sleeping #{sleep_time}" if $DEBUG
        sleep sleep_time
      end
    end
  rescue
    # ignore StandardErrors, we've probably found the idle timeout.
  ensure
    return sleep_time unless $!
  end

  ##
  # This client's OpenSSL::X509::Certificate

  attr_reader :certificate

  ##
  # For Net::HTTP parity

  alias cert certificate

  ##
  # An SSL certificate authority.  Setting this will set verify_mode to
  # VERIFY_PEER.

  attr_reader :ca_file

  ##
  # A directory of SSL certificates to be used as certificate authorities.
  # Setting this will set verify_mode to VERIFY_PEER.

  attr_reader :ca_path

  ##
  # An SSL certificate store.  Setting this will override the default
  # certificate store.  See verify_mode for more information.

  attr_reader :cert_store

  ##
  # The ciphers allowed for SSL connections

  attr_reader :ciphers

  ##
  # Sends debug_output to this IO via Net::HTTP#set_debug_output.
  #
  # Never use this method in production code, it causes a serious security
  # hole.

  attr_accessor :debug_output

  ##
  # Current connection generation

  attr_reader :generation # :nodoc:

  ##
  # Headers that are added to every request using Net::HTTP#add_field

  attr_reader :headers

  ##
  # Maps host:port to an HTTP version.  This allows us to enable version
  # specific features.

  attr_reader :http_versions

  ##
  # Maximum time an unused connection can remain idle before being
  # automatically closed.

  attr_accessor :idle_timeout

  ##
  # Maximum number of requests on a connection before it is considered expired
  # and automatically closed.

  attr_accessor :max_requests

  ##
  # Number of retries to perform if a request fails.
  #
  # See also #max_retries=, Net::HTTP#max_retries=.

  attr_reader :max_retries

  ##
  # The value sent in the Keep-Alive header.  Defaults to 30.  Not needed for
  # HTTP/1.1 servers.
  #
  # This may not work correctly for HTTP/1.0 servers
  #
  # This method may be removed in a future version as RFC 2616 does not
  # require this header.

  attr_accessor :keep_alive

  ##
  # The name for this collection of persistent connections.

  attr_reader :name

  ##
  # Seconds to wait until a connection is opened.  See Net::HTTP#open_timeout

  attr_accessor :open_timeout

  ##
  # Headers that are added to every request using Net::HTTP#[]=

  attr_reader :override_headers

  ##
  # This client's SSL private key

  attr_reader :private_key

  ##
  # For Net::HTTP parity

  alias key private_key

  ##
  # The URL through which requests will be proxied

  attr_reader :proxy_uri

  ##
  # List of host suffixes which will not be proxied

  attr_reader :no_proxy

  ##
  # Test-only accessor for the connection pool

  attr_reader :pool # :nodoc:

  ##
  # Seconds to wait until reading one block.  See Net::HTTP#read_timeout

  attr_accessor :read_timeout

  ##
  # Seconds to wait until writing one block.  See Net::HTTP#write_timeout

  attr_accessor :write_timeout

  ##
  # By default SSL sessions are reused to avoid extra SSL handshakes.  Set
  # this to false if you have problems communicating with an HTTPS server
  # like:
  #
  #   SSL_connect [...] read finished A: unexpected message (OpenSSL::SSL::SSLError)

  attr_accessor :reuse_ssl_sessions

  ##
  # An array of options for Socket#setsockopt.
  #
  # By default the TCP_NODELAY option is set on sockets.
  #
  # To set additional options append them to this array:
  #
  #   http.socket_options << [Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, 1]

  attr_reader :socket_options

  ##
  # Current SSL connection generation

  attr_reader :ssl_generation # :nodoc:

  ##
  # SSL session lifetime

  attr_reader :ssl_timeout

  ##
  # SSL version to use.
  #
  # By default, the version will be negotiated automatically between client
  # and server.  Ruby 1.9 and newer only. Deprecated since Ruby 2.5.

  attr_reader :ssl_version

  ##
  # Minimum SSL version to use, e.g. :TLS1_1
  #
  # By default, the version will be negotiated automatically between client
  # and server.  Ruby 2.5 and newer only.

  attr_reader :min_version

  ##
  # Maximum SSL version to use, e.g. :TLS1_2
  #
  # By default, the version will be negotiated automatically between client
  # and server.  Ruby 2.5 and newer only.

  attr_reader :max_version

  ##
  # Where this instance's last-use times live in the thread local variables

  attr_reader :timeout_key # :nodoc:

  ##
  # SSL verification callback.  Used when ca_file or ca_path is set.

  attr_reader :verify_callback

  ##
  # Sets the depth of SSL certificate verification

  attr_reader :verify_depth

  ##
  # HTTPS verify mode.  Defaults to OpenSSL::SSL::VERIFY_PEER which verifies
  # the server certificate.
  #
  # If no ca_file, ca_path or cert_store is set the default system certificate
  # store is used.
  #
  # You can use +verify_mode+ to override any default values.

  attr_reader :verify_mode

  ##
  # Creates a new Bundler::Persistent::Net::HTTP::Persistent.
  #
  # Set a +name+ for fun.  Your library name should be good enough, but this
  # otherwise has no purpose.
  #
  # +proxy+ may be set to a Bundler::URI::HTTP or :ENV to pick up proxy options from
  # the environment.  See proxy_from_env for details.
  #
  # In order to use a Bundler::URI for the proxy you may need to do some extra work
  # beyond Bundler::URI parsing if the proxy requires a password:
  #
  #   proxy = Bundler::URI 'http://proxy.example'
  #   proxy.user     = 'AzureDiamond'
  #   proxy.password = 'hunter2'
  #
  # Set +pool_size+ to limit the maximum number of connections allowed.
  # Defaults to 1/4 the number of allowed file handles or 256 if your OS does
  # not support a limit on allowed file handles.  You can have no more than
  # this many threads with active HTTP transactions.

  def initialize name: nil, proxy: nil, pool_size: DEFAULT_POOL_SIZE
    @name = name

    @debug_output     = nil
    @proxy_uri        = nil
    @no_proxy         = []
    @headers          = {}
    @override_headers = {}
    @http_versions    = {}
    @keep_alive       = 30
    @open_timeout     = nil
    @read_timeout     = nil
    @write_timeout    = nil
    @idle_timeout     = 5
    @max_requests     = nil
    @max_retries      = 1
    @socket_options   = []
    @ssl_generation   = 0 # incremented when SSL session variables change

    @socket_options << [Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1] if
      Socket.const_defined? :TCP_NODELAY

    @pool = Bundler::Persistent::Net::HTTP::Persistent::Pool.new size: pool_size do |http_args|
      Bundler::Persistent::Net::HTTP::Persistent::Connection.new Net::HTTP, http_args, @ssl_generation
    end

    @certificate        = nil
    @ca_file            = nil
    @ca_path            = nil
    @ciphers            = nil
    @private_key        = nil
    @ssl_timeout        = nil
    @ssl_version        = nil
    @min_version        = nil
    @max_version        = nil
    @verify_callback    = nil
    @verify_depth       = nil
    @verify_mode        = nil
    @cert_store         = nil

    @generation         = 0 # incremented when proxy Bundler::URI changes

    if HAVE_OPENSSL then
      @verify_mode        = OpenSSL::SSL::VERIFY_PEER
      @reuse_ssl_sessions = OpenSSL::SSL.const_defined? :Session
    end

    self.proxy = proxy if proxy
  end

  ##
  # Sets this client's OpenSSL::X509::Certificate

  def certificate= certificate
    @certificate = certificate

    reconnect_ssl
  end

  # For Net::HTTP parity
  alias cert= certificate=

  ##
  # Sets the SSL certificate authority file.

  def ca_file= file
    @ca_file = file

    reconnect_ssl
  end

  ##
  # Sets the SSL certificate authority path.

  def ca_path= path
    @ca_path = path

    reconnect_ssl
  end

  ##
  # Overrides the default SSL certificate store used for verifying
  # connections.

  def cert_store= store
    @cert_store = store

    reconnect_ssl
  end

  ##
  # The ciphers allowed for SSL connections

  def ciphers= ciphers
    @ciphers = ciphers

    reconnect_ssl
  end

  ##
  # Creates a new connection for +uri+

  def connection_for uri
    use_ssl = uri.scheme.downcase == 'https'

    net_http_args = [uri.hostname, uri.port]

    # I'm unsure if uri.host or uri.hostname should be checked against
    # the proxy bypass list.
    if @proxy_uri and not proxy_bypass? uri.host, uri.port then
      net_http_args.concat @proxy_args
    else
      net_http_args.concat [nil, nil, nil, nil]
    end

    connection = @pool.checkout net_http_args

    http = connection.http

    connection.ressl @ssl_generation if
      connection.ssl_generation != @ssl_generation

    if not http.started? then
      ssl   http if use_ssl
      start http
    elsif expired? connection then
      reset connection
    end

    http.keep_alive_timeout = @idle_timeout  if @idle_timeout
    http.max_retries        = @max_retries   if http.respond_to?(:max_retries=)
    http.read_timeout       = @read_timeout  if @read_timeout
    http.write_timeout      = @write_timeout if
      @write_timeout && http.respond_to?(:write_timeout=)

    return yield connection
  rescue Errno::ECONNREFUSED
    address = http.proxy_address || http.address
    port    = http.proxy_port    || http.port

    raise Error, "connection refused: #{address}:#{port}"
  rescue Errno::EHOSTDOWN
    address = http.proxy_address || http.address
    port    = http.proxy_port    || http.port

    raise Error, "host down: #{address}:#{port}"
  ensure
    @pool.checkin net_http_args
  end

  ##
  # CGI::escape wrapper

  def escape str
    CGI.escape str if str
  end

  ##
  # CGI::unescape wrapper

  def unescape str
    CGI.unescape str if str
  end


  ##
  # Returns true if the connection should be reset due to an idle timeout, or
  # maximum request count, false otherwise.

  def expired? connection
    return true  if     @max_requests && connection.requests >= @max_requests
    return false unless @idle_timeout
    return true  if     @idle_timeout.zero?

    Time.now - connection.last_use > @idle_timeout
  end

  ##
  # Starts the Net::HTTP +connection+

  def start http
    http.set_debug_output @debug_output if @debug_output
    http.open_timeout = @open_timeout if @open_timeout

    http.start

    socket = http.instance_variable_get :@socket

    if socket then # for fakeweb
      @socket_options.each do |option|
        socket.io.setsockopt(*option)
      end
    end
  end

  ##
  # Finishes the Net::HTTP +connection+

  def finish connection
    connection.finish

    connection.http.instance_variable_set :@last_communicated, nil
    connection.http.instance_variable_set :@ssl_session, nil unless
      @reuse_ssl_sessions
  end

  ##
  # Returns the HTTP protocol version for +uri+

  def http_version uri
    @http_versions["#{uri.hostname}:#{uri.port}"]
  end

  ##
  # Adds "http://" to the String +uri+ if it is missing.

  def normalize_uri uri
    (uri =~ /^https?:/) ? uri : "http://#{uri}"
  end

  ##
  # Set the maximum number of retries for a request.
  #
  # Defaults to one retry.
  #
  # Set this to 0 to disable retries.

  def max_retries= retries
    retries = retries.to_int

    raise ArgumentError, "max_retries must be positive" if retries < 0

    @max_retries = retries

    reconnect
  end

  ##
  # Sets this client's SSL private key

  def private_key= key
    @private_key = key

    reconnect_ssl
  end

  # For Net::HTTP parity
  alias key= private_key=

  ##
  # Sets the proxy server.  The +proxy+ may be the Bundler::URI of the proxy server,
  # the symbol +:ENV+ which will read the proxy from the environment or nil to
  # disable use of a proxy.  See #proxy_from_env for details on setting the
  # proxy from the environment.
  #
  # If the proxy Bundler::URI is set after requests have been made, the next request
  # will shut-down and re-open all connections.
  #
  # The +no_proxy+ query parameter can be used to specify hosts which shouldn't
  # be reached via proxy; if set it should be a comma separated list of
  # hostname suffixes, optionally with +:port+ appended, for example
  # <tt>example.com,some.host:8080</tt>.

  def proxy= proxy
    @proxy_uri = case proxy
                 when :ENV      then proxy_from_env
                 when Bundler::URI::HTTP then proxy
                 when nil       then # ignore
                 else raise ArgumentError, 'proxy must be :ENV or a Bundler::URI::HTTP'
                 end

    @no_proxy.clear

    if @proxy_uri then
      @proxy_args = [
        @proxy_uri.hostname,
        @proxy_uri.port,
        unescape(@proxy_uri.user),
        unescape(@proxy_uri.password),
      ]

      @proxy_connection_id = [nil, *@proxy_args].join ':'

      if @proxy_uri.query then
        @no_proxy = CGI.parse(@proxy_uri.query)['no_proxy'].join(',').downcase.split(',').map { |x| x.strip }.reject { |x| x.empty? }
      end
    end

    reconnect
    reconnect_ssl
  end

  ##
  # Creates a Bundler::URI for an HTTP proxy server from ENV variables.
  #
  # If +HTTP_PROXY+ is set a proxy will be returned.
  #
  # If +HTTP_PROXY_USER+ or +HTTP_PROXY_PASS+ are set the Bundler::URI is given the
  # indicated user and password unless HTTP_PROXY contains either of these in
  # the Bundler::URI.
  #
  # The +NO_PROXY+ ENV variable can be used to specify hosts which shouldn't
  # be reached via proxy; if set it should be a comma separated list of
  # hostname suffixes, optionally with +:port+ appended, for example
  # <tt>example.com,some.host:8080</tt>. When set to <tt>*</tt> no proxy will
  # be returned.
  #
  # For Windows users, lowercase ENV variables are preferred over uppercase ENV
  # variables.

  def proxy_from_env
    env_proxy = ENV['http_proxy'] || ENV['HTTP_PROXY']

    return nil if env_proxy.nil? or env_proxy.empty?

    uri = Bundler::URI normalize_uri env_proxy

    env_no_proxy = ENV['no_proxy'] || ENV['NO_PROXY']

    # '*' is special case for always bypass
    return nil if env_no_proxy == '*'

    if env_no_proxy then
      uri.query = "no_proxy=#{escape(env_no_proxy)}"
    end

    unless uri.user or uri.password then
      uri.user     = escape ENV['http_proxy_user'] || ENV['HTTP_PROXY_USER']
      uri.password = escape ENV['http_proxy_pass'] || ENV['HTTP_PROXY_PASS']
    end

    uri
  end

  ##
  # Returns true when proxy should by bypassed for host.

  def proxy_bypass? host, port
    host = host.downcase
    host_port = [host, port].join ':'

    @no_proxy.each do |name|
      return true if host[-name.length, name.length] == name or
         host_port[-name.length, name.length] == name
    end

    false
  end

  ##
  # Forces reconnection of all HTTP connections, including TLS/SSL
  # connections.

  def reconnect
    @generation += 1
  end

  ##
  # Forces reconnection of only TLS/SSL connections.

  def reconnect_ssl
    @ssl_generation += 1
  end

  ##
  # Finishes then restarts the Net::HTTP +connection+

  def reset connection
    http = connection.http

    finish connection

    start http
  rescue Errno::ECONNREFUSED
    e = Error.new "connection refused: #{http.address}:#{http.port}"
    e.set_backtrace $@
    raise e
  rescue Errno::EHOSTDOWN
    e = Error.new "host down: #{http.address}:#{http.port}"
    e.set_backtrace $@
    raise e
  end

  ##
  # Makes a request on +uri+.  If +req+ is nil a Net::HTTP::Get is performed
  # against +uri+.
  #
  # If a block is passed #request behaves like Net::HTTP#request (the body of
  # the response will not have been read).
  #
  # +req+ must be a Net::HTTPGenericRequest subclass (see Net::HTTP for a list).

  def request uri, req = nil, &block
    uri      = Bundler::URI uri
    req      = request_setup req || uri
    response = nil

    connection_for uri do |connection|
      http = connection.http

      begin
        connection.requests += 1

        response = http.request req, &block

        if req.connection_close? or
          (response.http_version <= '1.0' and
            not response.connection_keep_alive?) or
            response.connection_close? then
          finish connection
        end
      rescue Exception # make sure to close the connection when it was interrupted
        finish connection

        raise
      ensure
        connection.last_use = Time.now
      end
    end

    @http_versions["#{uri.hostname}:#{uri.port}"] ||= response.http_version

    response
  end

  ##
  # Creates a GET request if +req_or_uri+ is a Bundler::URI and adds headers to the
  # request.
  #
  # Returns the request.

  def request_setup req_or_uri # :nodoc:
    req = if req_or_uri.respond_to? 'request_uri' then
            Net::HTTP::Get.new req_or_uri.request_uri
          else
            req_or_uri
          end

    @headers.each do |pair|
      req.add_field(*pair)
    end

    @override_headers.each do |name, value|
      req[name] = value
    end

    unless req['Connection'] then
      req.add_field 'Connection', 'keep-alive'
      req.add_field 'Keep-Alive', @keep_alive
    end

    req
  end

  ##
  # Shuts down all connections
  #
  # *NOTE*: Calling shutdown for can be dangerous!
  #
  # If any thread is still using a connection it may cause an error!  Call
  # #shutdown when you are completely done making requests!

  def shutdown
    @pool.shutdown { |http| http.finish }
  end

  ##
  # Enables SSL on +connection+

  def ssl connection
    connection.use_ssl = true

    connection.ciphers     = @ciphers     if @ciphers
    connection.ssl_timeout = @ssl_timeout if @ssl_timeout
    connection.ssl_version = @ssl_version if @ssl_version
    connection.min_version = @min_version if @min_version
    connection.max_version = @max_version if @max_version

    connection.verify_depth = @verify_depth
    connection.verify_mode  = @verify_mode

    if OpenSSL::SSL::VERIFY_PEER == OpenSSL::SSL::VERIFY_NONE and
       not Object.const_defined?(:I_KNOW_THAT_OPENSSL_VERIFY_PEER_EQUALS_VERIFY_NONE_IS_WRONG) then
      warn <<-WARNING
                             !!!SECURITY WARNING!!!

The SSL HTTP connection to:

  #{connection.address}:#{connection.port}

                           !!!MAY NOT BE VERIFIED!!!

On your platform your OpenSSL implementation is broken.

There is no difference between the values of VERIFY_NONE and VERIFY_PEER.

This means that attempting to verify the security of SSL connections may not
work.  This exposes you to man-in-the-middle exploits, snooping on the
contents of your connection and other dangers to the security of your data.

To disable this warning define the following constant at top-level in your
application:

  I_KNOW_THAT_OPENSSL_VERIFY_PEER_EQUALS_VERIFY_NONE_IS_WRONG = nil

      WARNING
    end

    connection.ca_file = @ca_file if @ca_file
    connection.ca_path = @ca_path if @ca_path

    if @ca_file or @ca_path then
      connection.verify_mode = OpenSSL::SSL::VERIFY_PEER
      connection.verify_callback = @verify_callback if @verify_callback
    end

    if @certificate and @private_key then
      connection.cert = @certificate
      connection.key  = @private_key
    end

    connection.cert_store = if @cert_store then
                              @cert_store
                            else
                              store = OpenSSL::X509::Store.new
                              store.set_default_paths
                              store
                            end
  end

  ##
  # SSL session lifetime

  def ssl_timeout= ssl_timeout
    @ssl_timeout = ssl_timeout

    reconnect_ssl
  end

  ##
  # SSL version to use

  def ssl_version= ssl_version
    @ssl_version = ssl_version

    reconnect_ssl
  end

  ##
  # Minimum SSL version to use

  def min_version= min_version
    @min_version = min_version

    reconnect_ssl
  end

  ##
  # maximum SSL version to use

  def max_version= max_version
    @max_version = max_version

    reconnect_ssl
  end

  ##
  # Sets the depth of SSL certificate verification

  def verify_depth= verify_depth
    @verify_depth = verify_depth

    reconnect_ssl
  end

  ##
  # Sets the HTTPS verify mode.  Defaults to OpenSSL::SSL::VERIFY_PEER.
  #
  # Setting this to VERIFY_NONE is a VERY BAD IDEA and should NEVER be used.
  # Securely transfer the correct certificate and update the default
  # certificate store or set the ca file instead.

  def verify_mode= verify_mode
    @verify_mode = verify_mode

    reconnect_ssl
  end

  ##
  # SSL verification callback.

  def verify_callback= callback
    @verify_callback = callback

    reconnect_ssl
  end
end

require_relative 'persistent/connection'
require_relative 'persistent/pool'

PK}$[�(ц��egems/gems/bundler-2.3.27/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rbnu�[���##
# A Net::HTTP connection wrapper that holds extra information for managing the
# connection's lifetime.

class Bundler::Persistent::Net::HTTP::Persistent::Connection # :nodoc:

  attr_accessor :http

  attr_accessor :last_use

  attr_accessor :requests

  attr_accessor :ssl_generation

  def initialize http_class, http_args, ssl_generation
    @http           = http_class.new(*http_args)
    @ssl_generation = ssl_generation

    reset
  end

  def finish
    @http.finish
  rescue IOError
  ensure
    reset
  end

  def reset
    @last_use = Bundler::Persistent::Net::HTTP::Persistent::EPOCH
    @requests = 0
  end

  def ressl ssl_generation
    @ssl_generation = ssl_generation

    finish
  end

end
PK}$[hO8��_gems/gems/bundler-2.3.27/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rbnu�[���class Bundler::Persistent::Net::HTTP::Persistent::Pool < Bundler::ConnectionPool # :nodoc:

  attr_reader :available # :nodoc:
  attr_reader :key # :nodoc:

  def initialize(options = {}, &block)
    super

    @available = Bundler::Persistent::Net::HTTP::Persistent::TimedStackMulti.new(@size, &block)
    @key = "current-#{@available.object_id}"
  end

  def checkin net_http_args
    stack = Thread.current[@key][net_http_args] ||= []

    raise Bundler::ConnectionPool::Error, 'no connections are checked out' if
      stack.empty?

    conn = stack.pop

    if stack.empty?
      @available.push conn, connection_args: net_http_args

      Thread.current[@key].delete(net_http_args)
      Thread.current[@key] = nil if Thread.current[@key].empty?
    end

    nil
  end

  def checkout net_http_args
    stacks = Thread.current[@key] ||= {}
    stack  = stacks[net_http_args] ||= []

    if stack.empty? then
      conn = @available.pop connection_args: net_http_args
    else
      conn = stack.last
    end

    stack.push conn

    conn
  end

  def shutdown
    Thread.current[@key] = nil
    super
  end
end

require_relative 'timed_stack_multi'

PK}$[6�lfflgems/gems/bundler-2.3.27/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rbnu�[���class Bundler::Persistent::Net::HTTP::Persistent::TimedStackMulti < Bundler::ConnectionPool::TimedStack # :nodoc:

  ##
  # Returns a new hash that has arrays for keys
  #
  # Using a class method to limit the bindings referenced by the hash's
  # default_proc

  def self.hash_of_arrays # :nodoc:
    Hash.new { |h,k| h[k] = [] }
  end

  def initialize(size = 0, &block)
    super

    @enqueued = 0
    @ques = self.class.hash_of_arrays
    @lru = {}
    @key = :"connection_args-#{object_id}"
  end

  def empty?
    (@created - @enqueued) >= @max
  end

  def length
    @max - @created + @enqueued
  end

  private

  def connection_stored? options = {} # :nodoc:
    !@ques[options[:connection_args]].empty?
  end

  def fetch_connection options = {} # :nodoc:
    connection_args = options[:connection_args]

    @enqueued -= 1
    lru_update connection_args
    @ques[connection_args].pop
  end

  def lru_update connection_args # :nodoc:
    @lru.delete connection_args
    @lru[connection_args] = true
  end

  def shutdown_connections # :nodoc:
    @ques.each_key do |key|
      super connection_args: key
    end
  end

  def store_connection obj, options = {} # :nodoc:
    @ques[options[:connection_args]].push obj
    @enqueued += 1
  end

  def try_create options = {} # :nodoc:
    connection_args = options[:connection_args]

    if @created >= @max && @enqueued >= 1
      oldest, = @lru.first
      @lru.delete oldest
      @ques[oldest].pop

      @created -= 1
    end

    if @created < @max
      @created += 1
      lru_update connection_args
      return @create_block.call(connection_args)
    end
  end

end

PK}$[���q@q@<gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor.rbnu�[���require_relative "thor/base"

class Bundler::Thor
  $thor_runner ||= false
  class << self
    # Allows for custom "Command" package naming.
    #
    # === Parameters
    # name<String>
    # options<Hash>
    #
    def package_name(name, _ = {})
      @package_name = name.nil? || name == "" ? nil : name
    end

    # Sets the default command when thor is executed without an explicit command to be called.
    #
    # ==== Parameters
    # meth<Symbol>:: name of the default command
    #
    def default_command(meth = nil)
      if meth
        @default_command = meth == :none ? "help" : meth.to_s
      else
        @default_command ||= from_superclass(:default_command, "help")
      end
    end
    alias_method :default_task, :default_command

    # Registers another Bundler::Thor subclass as a command.
    #
    # ==== Parameters
    # klass<Class>:: Bundler::Thor subclass to register
    # command<String>:: Subcommand name to use
    # usage<String>:: Short usage for the subcommand
    # description<String>:: Description for the subcommand
    def register(klass, subcommand_name, usage, description, options = {})
      if klass <= Bundler::Thor::Group
        desc usage, description, options
        define_method(subcommand_name) { |*args| invoke(klass, args) }
      else
        desc usage, description, options
        subcommand subcommand_name, klass
      end
    end

    # Defines the usage and the description of the next command.
    #
    # ==== Parameters
    # usage<String>
    # description<String>
    # options<String>
    #
    def desc(usage, description, options = {})
      if options[:for]
        command = find_and_refresh_command(options[:for])
        command.usage = usage             if usage
        command.description = description if description
      else
        @usage = usage
        @desc = description
        @hide = options[:hide] || false
      end
    end

    # Defines the long description of the next command.
    #
    # ==== Parameters
    # long description<String>
    #
    def long_desc(long_description, options = {})
      if options[:for]
        command = find_and_refresh_command(options[:for])
        command.long_description = long_description if long_description
      else
        @long_desc = long_description
      end
    end

    # Maps an input to a command. If you define:
    #
    #   map "-T" => "list"
    #
    # Running:
    #
    #   thor -T
    #
    # Will invoke the list command.
    #
    # ==== Parameters
    # Hash[String|Array => Symbol]:: Maps the string or the strings in the array to the given command.
    #
    def map(mappings = nil, **kw)
      @map ||= from_superclass(:map, {})

      if mappings && !kw.empty?
        mappings = kw.merge!(mappings)
      else
        mappings ||= kw
      end
      if mappings
        mappings.each do |key, value|
          if key.respond_to?(:each)
            key.each { |subkey| @map[subkey] = value }
          else
            @map[key] = value
          end
        end
      end

      @map
    end

    # Declares the options for the next command to be declared.
    #
    # ==== Parameters
    # Hash[Symbol => Object]:: The hash key is the name of the option and the value
    # is the type of the option. Can be :string, :array, :hash, :boolean, :numeric
    # or :required (string). If you give a value, the type of the value is used.
    #
    def method_options(options = nil)
      @method_options ||= {}
      build_options(options, @method_options) if options
      @method_options
    end

    alias_method :options, :method_options

    # Adds an option to the set of method options. If :for is given as option,
    # it allows you to change the options from a previous defined command.
    #
    #   def previous_command
    #     # magic
    #   end
    #
    #   method_option :foo => :bar, :for => :previous_command
    #
    #   def next_command
    #     # magic
    #   end
    #
    # ==== Parameters
    # name<Symbol>:: The name of the argument.
    # options<Hash>:: Described below.
    #
    # ==== Options
    # :desc     - Description for the argument.
    # :required - If the argument is required or not.
    # :default  - Default value for this argument. It cannot be required and have default values.
    # :aliases  - Aliases for this option.
    # :type     - The type of the argument, can be :string, :hash, :array, :numeric or :boolean.
    # :banner   - String to show on usage notes.
    # :hide     - If you want to hide this option from the help.
    #
    def method_option(name, options = {})
      scope = if options[:for]
        find_and_refresh_command(options[:for]).options
      else
        method_options
      end

      build_option(name, options, scope)
    end
    alias_method :option, :method_option

    # Prints help information for the given command.
    #
    # ==== Parameters
    # shell<Bundler::Thor::Shell>
    # command_name<String>
    #
    def command_help(shell, command_name)
      meth = normalize_command_name(command_name)
      command = all_commands[meth]
      handle_no_command_error(meth) unless command

      shell.say "Usage:"
      shell.say "  #{banner(command).split("\n").join("\n  ")}"
      shell.say
      class_options_help(shell, nil => command.options.values)
      if command.long_description
        shell.say "Description:"
        shell.print_wrapped(command.long_description, :indent => 2)
      else
        shell.say command.description
      end
    end
    alias_method :task_help, :command_help

    # Prints help information for this class.
    #
    # ==== Parameters
    # shell<Bundler::Thor::Shell>
    #
    def help(shell, subcommand = false)
      list = printable_commands(true, subcommand)
      Bundler::Thor::Util.thor_classes_in(self).each do |klass|
        list += klass.printable_commands(false)
      end
      list.sort! { |a, b| a[0] <=> b[0] }

      if defined?(@package_name) && @package_name
        shell.say "#{@package_name} commands:"
      else
        shell.say "Commands:"
      end

      shell.print_table(list, :indent => 2, :truncate => true)
      shell.say
      class_options_help(shell)
    end

    # Returns commands ready to be printed.
    def printable_commands(all = true, subcommand = false)
      (all ? all_commands : commands).map do |_, command|
        next if command.hidden?
        item = []
        item << banner(command, false, subcommand)
        item << (command.description ? "# #{command.description.gsub(/\s+/m, ' ')}" : "")
        item
      end.compact
    end
    alias_method :printable_tasks, :printable_commands

    def subcommands
      @subcommands ||= from_superclass(:subcommands, [])
    end
    alias_method :subtasks, :subcommands

    def subcommand_classes
      @subcommand_classes ||= {}
    end

    def subcommand(subcommand, subcommand_class)
      subcommands << subcommand.to_s
      subcommand_class.subcommand_help subcommand
      subcommand_classes[subcommand.to_s] = subcommand_class

      define_method(subcommand) do |*args|
        args, opts = Bundler::Thor::Arguments.split(args)
        invoke_args = [args, opts, {:invoked_via_subcommand => true, :class_options => options}]
        invoke_args.unshift "help" if opts.delete("--help") || opts.delete("-h")
        invoke subcommand_class, *invoke_args
      end
      subcommand_class.commands.each do |_meth, command|
        command.ancestor_name = subcommand
      end
    end
    alias_method :subtask, :subcommand

    # Extend check unknown options to accept a hash of conditions.
    #
    # === Parameters
    # options<Hash>: A hash containing :only and/or :except keys
    def check_unknown_options!(options = {})
      @check_unknown_options ||= {}
      options.each do |key, value|
        if value
          @check_unknown_options[key] = Array(value)
        else
          @check_unknown_options.delete(key)
        end
      end
      @check_unknown_options
    end

    # Overwrite check_unknown_options? to take subcommands and options into account.
    def check_unknown_options?(config) #:nodoc:
      options = check_unknown_options
      return false unless options

      command = config[:current_command]
      return true unless command

      name = command.name

      if subcommands.include?(name)
        false
      elsif options[:except]
        !options[:except].include?(name.to_sym)
      elsif options[:only]
        options[:only].include?(name.to_sym)
      else
        true
      end
    end

    # Stop parsing of options as soon as an unknown option or a regular
    # argument is encountered.  All remaining arguments are passed to the command.
    # This is useful if you have a command that can receive arbitrary additional
    # options, and where those additional options should not be handled by
    # Bundler::Thor.
    #
    # ==== Example
    #
    # To better understand how this is useful, let's consider a command that calls
    # an external command.  A user may want to pass arbitrary options and
    # arguments to that command.  The command itself also accepts some options,
    # which should be handled by Bundler::Thor.
    #
    #   class_option "verbose",  :type => :boolean
    #   stop_on_unknown_option! :exec
    #   check_unknown_options!  :except => :exec
    #
    #   desc "exec", "Run a shell command"
    #   def exec(*args)
    #     puts "diagnostic output" if options[:verbose]
    #     Kernel.exec(*args)
    #   end
    #
    # Here +exec+ can be called with +--verbose+ to get diagnostic output,
    # e.g.:
    #
    #   $ thor exec --verbose echo foo
    #   diagnostic output
    #   foo
    #
    # But if +--verbose+ is given after +echo+, it is passed to +echo+ instead:
    #
    #   $ thor exec echo --verbose foo
    #   --verbose foo
    #
    # ==== Parameters
    # Symbol ...:: A list of commands that should be affected.
    def stop_on_unknown_option!(*command_names)
      @stop_on_unknown_option = stop_on_unknown_option | command_names
    end

    def stop_on_unknown_option?(command) #:nodoc:
      command && stop_on_unknown_option.include?(command.name.to_sym)
    end

    # Disable the check for required options for the given commands.
    # This is useful if you have a command that does not need the required options
    # to work, like help.
    #
    # ==== Parameters
    # Symbol ...:: A list of commands that should be affected.
    def disable_required_check!(*command_names)
      @disable_required_check = disable_required_check | command_names
    end

    def disable_required_check?(command) #:nodoc:
      command && disable_required_check.include?(command.name.to_sym)
    end

  protected

    def stop_on_unknown_option #:nodoc:
      @stop_on_unknown_option ||= []
    end

    # help command has the required check disabled by default.
    def disable_required_check #:nodoc:
      @disable_required_check ||= [:help]
    end

    # The method responsible for dispatching given the args.
    def dispatch(meth, given_args, given_opts, config) #:nodoc: # rubocop:disable MethodLength
      meth ||= retrieve_command_name(given_args)
      command = all_commands[normalize_command_name(meth)]

      if !command && config[:invoked_via_subcommand]
        # We're a subcommand and our first argument didn't match any of our
        # commands. So we put it back and call our default command.
        given_args.unshift(meth)
        command = all_commands[normalize_command_name(default_command)]
      end

      if command
        args, opts = Bundler::Thor::Options.split(given_args)
        if stop_on_unknown_option?(command) && !args.empty?
          # given_args starts with a non-option, so we treat everything as
          # ordinary arguments
          args.concat opts
          opts.clear
        end
      else
        args = given_args
        opts = nil
        command = dynamic_command_class.new(meth)
      end

      opts = given_opts || opts || []
      config[:current_command] = command
      config[:command_options] = command.options

      instance = new(args, opts, config)
      yield instance if block_given?
      args = instance.args
      trailing = args[Range.new(arguments.size, -1)]
      instance.invoke_command(command, trailing || [])
    end

    # The banner for this class. You can customize it if you are invoking the
    # thor class by another ways which is not the Bundler::Thor::Runner. It receives
    # the command that is going to be invoked and a boolean which indicates if
    # the namespace should be displayed as arguments.
    #
    def banner(command, namespace = nil, subcommand = false)
      command.formatted_usage(self, $thor_runner, subcommand).split("\n").map do |formatted_usage|
        "#{basename} #{formatted_usage}"
      end.join("\n")
    end

    def baseclass #:nodoc:
      Bundler::Thor
    end

    def dynamic_command_class #:nodoc:
      Bundler::Thor::DynamicCommand
    end

    def create_command(meth) #:nodoc:
      @usage ||= nil
      @desc ||= nil
      @long_desc ||= nil
      @hide ||= nil

      if @usage && @desc
        base_class = @hide ? Bundler::Thor::HiddenCommand : Bundler::Thor::Command
        commands[meth] = base_class.new(meth, @desc, @long_desc, @usage, method_options)
        @usage, @desc, @long_desc, @method_options, @hide = nil
        true
      elsif all_commands[meth] || meth == "method_missing"
        true
      else
        puts "[WARNING] Attempted to create command #{meth.inspect} without usage or description. " \
             "Call desc if you want this method to be available as command or declare it inside a " \
             "no_commands{} block. Invoked from #{caller[1].inspect}."
        false
      end
    end
    alias_method :create_task, :create_command

    def initialize_added #:nodoc:
      class_options.merge!(method_options)
      @method_options = nil
    end

    # Retrieve the command name from given args.
    def retrieve_command_name(args) #:nodoc:
      meth = args.first.to_s unless args.empty?
      args.shift if meth && (map[meth] || meth !~ /^\-/)
    end
    alias_method :retrieve_task_name, :retrieve_command_name

    # receives a (possibly nil) command name and returns a name that is in
    # the commands hash. In addition to normalizing aliases, this logic
    # will determine if a shortened command is an unambiguous substring of
    # a command or alias.
    #
    # +normalize_command_name+ also converts names like +animal-prison+
    # into +animal_prison+.
    def normalize_command_name(meth) #:nodoc:
      return default_command.to_s.tr("-", "_") unless meth

      possibilities = find_command_possibilities(meth)
      raise AmbiguousTaskError, "Ambiguous command #{meth} matches [#{possibilities.join(', ')}]" if possibilities.size > 1

      if possibilities.empty?
        meth ||= default_command
      elsif map[meth]
        meth = map[meth]
      else
        meth = possibilities.first
      end

      meth.to_s.tr("-", "_") # treat foo-bar as foo_bar
    end
    alias_method :normalize_task_name, :normalize_command_name

    # this is the logic that takes the command name passed in by the user
    # and determines whether it is an unambiguous substrings of a command or
    # alias name.
    def find_command_possibilities(meth)
      len = meth.to_s.length
      possibilities = all_commands.merge(map).keys.select { |n| meth == n[0, len] }.sort
      unique_possibilities = possibilities.map { |k| map[k] || k }.uniq

      if possibilities.include?(meth)
        [meth]
      elsif unique_possibilities.size == 1
        unique_possibilities
      else
        possibilities
      end
    end
    alias_method :find_task_possibilities, :find_command_possibilities

    def subcommand_help(cmd)
      desc "help [COMMAND]", "Describe subcommands or one specific subcommand"
      class_eval "
        def help(command = nil, subcommand = true); super; end
"
    end
    alias_method :subtask_help, :subcommand_help
  end

  include Bundler::Thor::Base

  map HELP_MAPPINGS => :help

  desc "help [COMMAND]", "Describe available commands or one specific command"
  def help(command = nil, subcommand = false)
    if command
      if self.class.subcommands.include? command
        self.class.subcommand_classes[command].help(shell, true)
      else
        self.class.command_help(shell, command)
      end
    else
      self.class.help(shell, subcommand)
    end
  end
end
PK}$[D�x�,,Dgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/version.rbnu�[���class Bundler::Thor
  VERSION = "1.2.1"
end
PK}$[U7gR * *Dgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/actions.rbnu�[���require_relative "actions/create_file"
require_relative "actions/create_link"
require_relative "actions/directory"
require_relative "actions/empty_directory"
require_relative "actions/file_manipulation"
require_relative "actions/inject_into_file"

class Bundler::Thor
  module Actions
    attr_accessor :behavior

    def self.included(base) #:nodoc:
      super(base)
      base.extend ClassMethods
    end

    module ClassMethods
      # Hold source paths for one Bundler::Thor instance. source_paths_for_search is the
      # method responsible to gather source_paths from this current class,
      # inherited paths and the source root.
      #
      def source_paths
        @_source_paths ||= []
      end

      # Stores and return the source root for this class
      def source_root(path = nil)
        @_source_root = path if path
        @_source_root ||= nil
      end

      # Returns the source paths in the following order:
      #
      #   1) This class source paths
      #   2) Source root
      #   3) Parents source paths
      #
      def source_paths_for_search
        paths = []
        paths += source_paths
        paths << source_root if source_root
        paths += from_superclass(:source_paths, [])
        paths
      end

      # Add runtime options that help actions execution.
      #
      def add_runtime_options!
        class_option :force, :type => :boolean, :aliases => "-f", :group => :runtime,
                             :desc => "Overwrite files that already exist"

        class_option :pretend, :type => :boolean, :aliases => "-p", :group => :runtime,
                               :desc => "Run but do not make any changes"

        class_option :quiet, :type => :boolean, :aliases => "-q", :group => :runtime,
                             :desc => "Suppress status output"

        class_option :skip, :type => :boolean, :aliases => "-s", :group => :runtime,
                            :desc => "Skip files that already exist"
      end
    end

    # Extends initializer to add more configuration options.
    #
    # ==== Configuration
    # behavior<Symbol>:: The actions default behavior. Can be :invoke or :revoke.
    #                    It also accepts :force, :skip and :pretend to set the behavior
    #                    and the respective option.
    #
    # destination_root<String>:: The root directory needed for some actions.
    #
    def initialize(args = [], options = {}, config = {})
      self.behavior = case config[:behavior].to_s
      when "force", "skip"
        _cleanup_options_and_set(options, config[:behavior])
        :invoke
      when "revoke"
        :revoke
      else
        :invoke
      end

      super
      self.destination_root = config[:destination_root]
    end

    # Wraps an action object and call it accordingly to the thor class behavior.
    #
    def action(instance) #:nodoc:
      if behavior == :revoke
        instance.revoke!
      else
        instance.invoke!
      end
    end

    # Returns the root for this thor class (also aliased as destination root).
    #
    def destination_root
      @destination_stack.last
    end

    # Sets the root for this thor class. Relatives path are added to the
    # directory where the script was invoked and expanded.
    #
    def destination_root=(root)
      @destination_stack ||= []
      @destination_stack[0] = File.expand_path(root || "")
    end

    # Returns the given path relative to the absolute root (ie, root where
    # the script started).
    #
    def relative_to_original_destination_root(path, remove_dot = true)
      root = @destination_stack[0]
      if path.start_with?(root) && [File::SEPARATOR, File::ALT_SEPARATOR, nil, ''].include?(path[root.size..root.size])
        path = path.dup
        path[0...root.size] = '.'
        remove_dot ? (path[2..-1] || "") : path
      else
        path
      end
    end

    # Holds source paths in instance so they can be manipulated.
    #
    def source_paths
      @source_paths ||= self.class.source_paths_for_search
    end

    # Receives a file or directory and search for it in the source paths.
    #
    def find_in_source_paths(file)
      possible_files = [file, file + TEMPLATE_EXTNAME]
      relative_root = relative_to_original_destination_root(destination_root, false)

      source_paths.each do |source|
        possible_files.each do |f|
          source_file = File.expand_path(f, File.join(source, relative_root))
          return source_file if File.exist?(source_file)
        end
      end

      message = "Could not find #{file.inspect} in any of your source paths. ".dup

      unless self.class.source_root
        message << "Please invoke #{self.class.name}.source_root(PATH) with the PATH containing your templates. "
      end

      message << if source_paths.empty?
                   "Currently you have no source paths."
                 else
                   "Your current source paths are: \n#{source_paths.join("\n")}"
                 end

      raise Error, message
    end

    # Do something in the root or on a provided subfolder. If a relative path
    # is given it's referenced from the current root. The full path is yielded
    # to the block you provide. The path is set back to the previous path when
    # the method exits.
    #
    # Returns the value yielded by the block.
    #
    # ==== Parameters
    # dir<String>:: the directory to move to.
    # config<Hash>:: give :verbose => true to log and use padding.
    #
    def inside(dir = "", config = {}, &block)
      verbose = config.fetch(:verbose, false)
      pretend = options[:pretend]

      say_status :inside, dir, verbose
      shell.padding += 1 if verbose
      @destination_stack.push File.expand_path(dir, destination_root)

      # If the directory doesnt exist and we're not pretending
      if !File.exist?(destination_root) && !pretend
        require "fileutils"
        FileUtils.mkdir_p(destination_root)
      end

      result = nil
      if pretend
        # In pretend mode, just yield down to the block
        result = block.arity == 1 ? yield(destination_root) : yield
      else
        require "fileutils"
        FileUtils.cd(destination_root) { result = block.arity == 1 ? yield(destination_root) : yield }
      end

      @destination_stack.pop
      shell.padding -= 1 if verbose
      result
    end

    # Goes to the root and execute the given block.
    #
    def in_root
      inside(@destination_stack.first) { yield }
    end

    # Loads an external file and execute it in the instance binding.
    #
    # ==== Parameters
    # path<String>:: The path to the file to execute. Can be a web address or
    #                a relative path from the source root.
    #
    # ==== Examples
    #
    #   apply "http://gist.github.com/103208"
    #
    #   apply "recipes/jquery.rb"
    #
    def apply(path, config = {})
      verbose = config.fetch(:verbose, true)
      is_uri  = path =~ %r{^https?\://}
      path    = find_in_source_paths(path) unless is_uri

      say_status :apply, path, verbose
      shell.padding += 1 if verbose

      contents = if is_uri
        require "open-uri"
        URI.open(path, "Accept" => "application/x-thor-template", &:read)
      else
        open(path, &:read)
      end

      instance_eval(contents, path)
      shell.padding -= 1 if verbose
    end

    # Executes a command returning the contents of the command.
    #
    # ==== Parameters
    # command<String>:: the command to be executed.
    # config<Hash>:: give :verbose => false to not log the status, :capture => true to hide to output. Specify :with
    #                to append an executable to command execution.
    #
    # ==== Example
    #
    #   inside('vendor') do
    #     run('ln -s ~/edge rails')
    #   end
    #
    def run(command, config = {})
      return unless behavior == :invoke

      destination = relative_to_original_destination_root(destination_root, false)
      desc = "#{command} from #{destination.inspect}"

      if config[:with]
        desc = "#{File.basename(config[:with].to_s)} #{desc}"
        command = "#{config[:with]} #{command}"
      end

      say_status :run, desc, config.fetch(:verbose, true)

      return if options[:pretend]

      env_splat = [config[:env]] if config[:env]

      if config[:capture]
        require "open3"
        result, status = Open3.capture2e(*env_splat, command.to_s)
        success = status.success?
      else
        result = system(*env_splat, command.to_s)
        success = result
      end

      abort if !success && config.fetch(:abort_on_failure, self.class.exit_on_failure?)

      result
    end

    # Executes a ruby script (taking into account WIN32 platform quirks).
    #
    # ==== Parameters
    # command<String>:: the command to be executed.
    # config<Hash>:: give :verbose => false to not log the status.
    #
    def run_ruby_script(command, config = {})
      return unless behavior == :invoke
      run command, config.merge(:with => Bundler::Thor::Util.ruby_command)
    end

    # Run a thor command. A hash of options can be given and it's converted to
    # switches.
    #
    # ==== Parameters
    # command<String>:: the command to be invoked
    # args<Array>:: arguments to the command
    # config<Hash>:: give :verbose => false to not log the status, :capture => true to hide to output.
    #                Other options are given as parameter to Bundler::Thor.
    #
    #
    # ==== Examples
    #
    #   thor :install, "http://gist.github.com/103208"
    #   #=> thor install http://gist.github.com/103208
    #
    #   thor :list, :all => true, :substring => 'rails'
    #   #=> thor list --all --substring=rails
    #
    def thor(command, *args)
      config  = args.last.is_a?(Hash) ? args.pop : {}
      verbose = config.key?(:verbose) ? config.delete(:verbose) : true
      pretend = config.key?(:pretend) ? config.delete(:pretend) : false
      capture = config.key?(:capture) ? config.delete(:capture) : false

      args.unshift(command)
      args.push Bundler::Thor::Options.to_switches(config)
      command = args.join(" ").strip

      run command, :with => :thor, :verbose => verbose, :pretend => pretend, :capture => capture
    end

  protected

    # Allow current root to be shared between invocations.
    #
    def _shared_configuration #:nodoc:
      super.merge!(:destination_root => destination_root)
    end

    def _cleanup_options_and_set(options, key) #:nodoc:
      case options
      when Array
        %w(--force -f --skip -s).each { |i| options.delete(i) }
        options << "--#{key}"
      when Hash
        [:force, :skip, "force", "skip"].each { |i| options.delete(i) }
        options.merge!(key => true)
      end
    end
  end
end
PK}$[~��3�3Vgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rbnu�[���require "erb"

class Bundler::Thor
  module Actions
    # Copies the file from the relative source to the relative destination. If
    # the destination is not given it's assumed to be equal to the source.
    #
    # ==== Parameters
    # source<String>:: the relative path to the source root.
    # destination<String>:: the relative path to the destination root.
    # config<Hash>:: give :verbose => false to not log the status, and
    #                :mode => :preserve, to preserve the file mode from the source.

    #
    # ==== Examples
    #
    #   copy_file "README", "doc/README"
    #
    #   copy_file "doc/README"
    #
    def copy_file(source, *args, &block)
      config = args.last.is_a?(Hash) ? args.pop : {}
      destination = args.first || source
      source = File.expand_path(find_in_source_paths(source.to_s))

      resulting_destination = create_file destination, nil, config do
        content = File.binread(source)
        content = yield(content) if block
        content
      end
      if config[:mode] == :preserve
        mode = File.stat(source).mode
        chmod(resulting_destination, mode, config)
      end
    end

    # Links the file from the relative source to the relative destination. If
    # the destination is not given it's assumed to be equal to the source.
    #
    # ==== Parameters
    # source<String>:: the relative path to the source root.
    # destination<String>:: the relative path to the destination root.
    # config<Hash>:: give :verbose => false to not log the status.
    #
    # ==== Examples
    #
    #   link_file "README", "doc/README"
    #
    #   link_file "doc/README"
    #
    def link_file(source, *args)
      config = args.last.is_a?(Hash) ? args.pop : {}
      destination = args.first || source
      source = File.expand_path(find_in_source_paths(source.to_s))

      create_link destination, source, config
    end

    # Gets the content at the given address and places it at the given relative
    # destination. If a block is given instead of destination, the content of
    # the url is yielded and used as location.
    #
    # +get+ relies on open-uri, so passing application user input would provide
    # a command injection attack vector.
    #
    # ==== Parameters
    # source<String>:: the address of the given content.
    # destination<String>:: the relative path to the destination root.
    # config<Hash>:: give :verbose => false to not log the status.
    #
    # ==== Examples
    #
    #   get "http://gist.github.com/103208", "doc/README"
    #
    #   get "http://gist.github.com/103208" do |content|
    #     content.split("\n").first
    #   end
    #
    def get(source, *args, &block)
      config = args.last.is_a?(Hash) ? args.pop : {}
      destination = args.first

      render = if source =~ %r{^https?\://}
        require "open-uri"
        URI.send(:open, source) { |input| input.binmode.read }
      else
        source = File.expand_path(find_in_source_paths(source.to_s))
        open(source) { |input| input.binmode.read }
      end

      destination ||= if block_given?
        block.arity == 1 ? yield(render) : yield
      else
        File.basename(source)
      end

      create_file destination, render, config
    end

    # Gets an ERB template at the relative source, executes it and makes a copy
    # at the relative destination. If the destination is not given it's assumed
    # to be equal to the source removing .tt from the filename.
    #
    # ==== Parameters
    # source<String>:: the relative path to the source root.
    # destination<String>:: the relative path to the destination root.
    # config<Hash>:: give :verbose => false to not log the status.
    #
    # ==== Examples
    #
    #   template "README", "doc/README"
    #
    #   template "doc/README"
    #
    def template(source, *args, &block)
      config = args.last.is_a?(Hash) ? args.pop : {}
      destination = args.first || source.sub(/#{TEMPLATE_EXTNAME}$/, "")

      source  = File.expand_path(find_in_source_paths(source.to_s))
      context = config.delete(:context) || instance_eval("binding")

      create_file destination, nil, config do
        match = ERB.version.match(/(\d+\.\d+\.\d+)/)
        capturable_erb = if match && match[1] >= "2.2.0" # Ruby 2.6+
          CapturableERB.new(::File.binread(source), :trim_mode => "-", :eoutvar => "@output_buffer")
        else
          CapturableERB.new(::File.binread(source), nil, "-", "@output_buffer")
        end
        content = capturable_erb.tap do |erb|
          erb.filename = source
        end.result(context)
        content = yield(content) if block
        content
      end
    end

    # Changes the mode of the given file or directory.
    #
    # ==== Parameters
    # mode<Integer>:: the file mode
    # path<String>:: the name of the file to change mode
    # config<Hash>:: give :verbose => false to not log the status.
    #
    # ==== Example
    #
    #   chmod "script/server", 0755
    #
    def chmod(path, mode, config = {})
      return unless behavior == :invoke
      path = File.expand_path(path, destination_root)
      say_status :chmod, relative_to_original_destination_root(path), config.fetch(:verbose, true)
      unless options[:pretend]
        require "fileutils"
        FileUtils.chmod_R(mode, path)
      end
    end

    # Prepend text to a file. Since it depends on insert_into_file, it's reversible.
    #
    # ==== Parameters
    # path<String>:: path of the file to be changed
    # data<String>:: the data to prepend to the file, can be also given as a block.
    # config<Hash>:: give :verbose => false to not log the status.
    #
    # ==== Example
    #
    #   prepend_to_file 'config/environments/test.rb', 'config.gem "rspec"'
    #
    #   prepend_to_file 'config/environments/test.rb' do
    #     'config.gem "rspec"'
    #   end
    #
    def prepend_to_file(path, *args, &block)
      config = args.last.is_a?(Hash) ? args.pop : {}
      config[:after] = /\A/
      insert_into_file(path, *(args << config), &block)
    end
    alias_method :prepend_file, :prepend_to_file

    # Append text to a file. Since it depends on insert_into_file, it's reversible.
    #
    # ==== Parameters
    # path<String>:: path of the file to be changed
    # data<String>:: the data to append to the file, can be also given as a block.
    # config<Hash>:: give :verbose => false to not log the status.
    #
    # ==== Example
    #
    #   append_to_file 'config/environments/test.rb', 'config.gem "rspec"'
    #
    #   append_to_file 'config/environments/test.rb' do
    #     'config.gem "rspec"'
    #   end
    #
    def append_to_file(path, *args, &block)
      config = args.last.is_a?(Hash) ? args.pop : {}
      config[:before] = /\z/
      insert_into_file(path, *(args << config), &block)
    end
    alias_method :append_file, :append_to_file

    # Injects text right after the class definition. Since it depends on
    # insert_into_file, it's reversible.
    #
    # ==== Parameters
    # path<String>:: path of the file to be changed
    # klass<String|Class>:: the class to be manipulated
    # data<String>:: the data to append to the class, can be also given as a block.
    # config<Hash>:: give :verbose => false to not log the status.
    #
    # ==== Examples
    #
    #   inject_into_class "app/controllers/application_controller.rb", "ApplicationController", "  filter_parameter :password\n"
    #
    #   inject_into_class "app/controllers/application_controller.rb", "ApplicationController" do
    #     "  filter_parameter :password\n"
    #   end
    #
    def inject_into_class(path, klass, *args, &block)
      config = args.last.is_a?(Hash) ? args.pop : {}
      config[:after] = /class #{klass}\n|class #{klass} .*\n/
      insert_into_file(path, *(args << config), &block)
    end

    # Injects text right after the module definition. Since it depends on
    # insert_into_file, it's reversible.
    #
    # ==== Parameters
    # path<String>:: path of the file to be changed
    # module_name<String|Class>:: the module to be manipulated
    # data<String>:: the data to append to the class, can be also given as a block.
    # config<Hash>:: give :verbose => false to not log the status.
    #
    # ==== Examples
    #
    #   inject_into_module "app/helpers/application_helper.rb", "ApplicationHelper", "  def help; 'help'; end\n"
    #
    #   inject_into_module "app/helpers/application_helper.rb", "ApplicationHelper" do
    #     "  def help; 'help'; end\n"
    #   end
    #
    def inject_into_module(path, module_name, *args, &block)
      config = args.last.is_a?(Hash) ? args.pop : {}
      config[:after] = /module #{module_name}\n|module #{module_name} .*\n/
      insert_into_file(path, *(args << config), &block)
    end

    # Run a regular expression replacement on a file.
    #
    # ==== Parameters
    # path<String>:: path of the file to be changed
    # flag<Regexp|String>:: the regexp or string to be replaced
    # replacement<String>:: the replacement, can be also given as a block
    # config<Hash>:: give :verbose => false to not log the status, and
    #                :force => true, to force the replacement regardles of runner behavior.
    #
    # ==== Example
    #
    #   gsub_file 'app/controllers/application_controller.rb', /#\s*(filter_parameter_logging :password)/, '\1'
    #
    #   gsub_file 'README', /rake/, :green do |match|
    #     match << " no more. Use thor!"
    #   end
    #
    def gsub_file(path, flag, *args, &block)
      config = args.last.is_a?(Hash) ? args.pop : {}

      return unless behavior == :invoke || config.fetch(:force, false)

      path = File.expand_path(path, destination_root)
      say_status :gsub, relative_to_original_destination_root(path), config.fetch(:verbose, true)

      unless options[:pretend]
        content = File.binread(path)
        content.gsub!(flag, *args, &block)
        File.open(path, "wb") { |file| file.write(content) }
      end
    end

    # Uncomment all lines matching a given regex.  It will leave the space
    # which existed before the comment hash in tact but will remove any spacing
    # between the comment hash and the beginning of the line.
    #
    # ==== Parameters
    # path<String>:: path of the file to be changed
    # flag<Regexp|String>:: the regexp or string used to decide which lines to uncomment
    # config<Hash>:: give :verbose => false to not log the status.
    #
    # ==== Example
    #
    #   uncomment_lines 'config/initializers/session_store.rb', /active_record/
    #
    def uncomment_lines(path, flag, *args)
      flag = flag.respond_to?(:source) ? flag.source : flag

      gsub_file(path, /^(\s*)#[[:blank:]]*(.*#{flag})/, '\1\2', *args)
    end

    # Comment all lines matching a given regex.  It will leave the space
    # which existed before the beginning of the line in tact and will insert
    # a single space after the comment hash.
    #
    # ==== Parameters
    # path<String>:: path of the file to be changed
    # flag<Regexp|String>:: the regexp or string used to decide which lines to comment
    # config<Hash>:: give :verbose => false to not log the status.
    #
    # ==== Example
    #
    #   comment_lines 'config/initializers/session_store.rb', /cookie_store/
    #
    def comment_lines(path, flag, *args)
      flag = flag.respond_to?(:source) ? flag.source : flag

      gsub_file(path, /^(\s*)([^#\n]*#{flag})/, '\1# \2', *args)
    end

    # Removes a file at the given location.
    #
    # ==== Parameters
    # path<String>:: path of the file to be changed
    # config<Hash>:: give :verbose => false to not log the status.
    #
    # ==== Example
    #
    #   remove_file 'README'
    #   remove_file 'app/controllers/application_controller.rb'
    #
    def remove_file(path, config = {})
      return unless behavior == :invoke
      path = File.expand_path(path, destination_root)

      say_status :remove, relative_to_original_destination_root(path), config.fetch(:verbose, true)
      if !options[:pretend] && (File.exist?(path) || File.symlink?(path))
        require "fileutils"
        ::FileUtils.rm_rf(path)
      end
    end
    alias_method :remove_dir, :remove_file

    attr_accessor :output_buffer
    private :output_buffer, :output_buffer=

  private

    def concat(string)
      @output_buffer.concat(string)
    end

    def capture(*args)
      with_output_buffer { yield(*args) }
    end

    def with_output_buffer(buf = "".dup) #:nodoc:
      raise ArgumentError, "Buffer can not be a frozen object" if buf.frozen?
      old_buffer = output_buffer
      self.output_buffer = buf
      yield
      output_buffer
    ensure
      self.output_buffer = old_buffer
    end

    # Bundler::Thor::Actions#capture depends on what kind of buffer is used in ERB.
    # Thus CapturableERB fixes ERB to use String buffer.
    class CapturableERB < ERB
      def set_eoutvar(compiler, eoutvar = "_erbout")
        compiler.put_cmd = "#{eoutvar}.concat"
        compiler.insert_cmd = "#{eoutvar}.concat"
        compiler.pre_cmd = ["#{eoutvar} = ''.dup"]
        compiler.post_cmd = [eoutvar]
      end
    end
  end
end
PK}$[mX���
�
Ugems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rbnu�[���require_relative "empty_directory"

class Bundler::Thor
  module Actions
    # Injects the given content into a file. Different from gsub_file, this
    # method is reversible.
    #
    # ==== Parameters
    # destination<String>:: Relative path to the destination root
    # data<String>:: Data to add to the file. Can be given as a block.
    # config<Hash>:: give :verbose => false to not log the status and the flag
    #                for injection (:after or :before) or :force => true for
    #                insert two or more times the same content.
    #
    # ==== Examples
    #
    #   insert_into_file "config/environment.rb", "config.gem :thor", :after => "Rails::Initializer.run do |config|\n"
    #
    #   insert_into_file "config/environment.rb", :after => "Rails::Initializer.run do |config|\n" do
    #     gems = ask "Which gems would you like to add?"
    #     gems.split(" ").map{ |gem| "  config.gem :#{gem}" }.join("\n")
    #   end
    #
    WARNINGS = { unchanged_no_flag: 'File unchanged! The supplied flag value not found!' }

    def insert_into_file(destination, *args, &block)
      data = block_given? ? block : args.shift

      config = args.shift || {}
      config[:after] = /\z/ unless config.key?(:before) || config.key?(:after)

      action InjectIntoFile.new(self, destination, data, config)
    end
    alias_method :inject_into_file, :insert_into_file

    class InjectIntoFile < EmptyDirectory #:nodoc:
      attr_reader :replacement, :flag, :behavior

      def initialize(base, destination, data, config)
        super(base, destination, {:verbose => true}.merge(config))

        @behavior, @flag = if @config.key?(:after)
          [:after, @config.delete(:after)]
        else
          [:before, @config.delete(:before)]
        end

        @replacement = data.is_a?(Proc) ? data.call : data
        @flag = Regexp.escape(@flag) unless @flag.is_a?(Regexp)
      end

      def invoke!
        content = if @behavior == :after
          '\0' + replacement
        else
          replacement + '\0'
        end

        if exists?
          if replace!(/#{flag}/, content, config[:force])
            say_status(:invoke)
          else
            say_status(:unchanged, warning: WARNINGS[:unchanged_no_flag], color: :red)
          end
        else
          unless pretend?
            raise Bundler::Thor::Error, "The file #{ destination } does not appear to exist"
          end
        end
      end

      def revoke!
        say_status :revoke

        regexp = if @behavior == :after
          content = '\1\2'
          /(#{flag})(.*)(#{Regexp.escape(replacement)})/m
        else
          content = '\2\3'
          /(#{Regexp.escape(replacement)})(.*)(#{flag})/m
        end

        replace!(regexp, content, true)
      end

    protected

      def say_status(behavior, warning: nil, color: nil)
        status = if behavior == :invoke
          if flag == /\A/
            :prepend
          elsif flag == /\z/
            :append
          else
            :insert
          end
        elsif warning
          warning
        else
          :subtract
        end

        super(status, (color || config[:verbose]))
      end

      # Adds the content to the file.
      #
      def replace!(regexp, string, force)
        content = File.read(destination)
        if force || !content.include?(replacement)
          success = content.gsub!(regexp, string)

          File.open(destination, "wb") { |file| file.write(content) } unless pretend?
          success
        end
      end
    end
  end
end
PK}$[te�))Pgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/actions/create_file.rbnu�[���require_relative "empty_directory"

class Bundler::Thor
  module Actions
    # Create a new file relative to the destination root with the given data,
    # which is the return value of a block or a data string.
    #
    # ==== Parameters
    # destination<String>:: the relative path to the destination root.
    # data<String|NilClass>:: the data to append to the file.
    # config<Hash>:: give :verbose => false to not log the status.
    #
    # ==== Examples
    #
    #   create_file "lib/fun_party.rb" do
    #     hostname = ask("What is the virtual hostname I should use?")
    #     "vhost.name = #{hostname}"
    #   end
    #
    #   create_file "config/apache.conf", "your apache config"
    #
    def create_file(destination, *args, &block)
      config = args.last.is_a?(Hash) ? args.pop : {}
      data = args.first
      action CreateFile.new(self, destination, block || data.to_s, config)
    end
    alias_method :add_file, :create_file

    # CreateFile is a subset of Template, which instead of rendering a file with
    # ERB, it gets the content from the user.
    #
    class CreateFile < EmptyDirectory #:nodoc:
      attr_reader :data

      def initialize(base, destination, data, config = {})
        @data = data
        super(base, destination, config)
      end

      # Checks if the content of the file at the destination is identical to the rendered result.
      #
      # ==== Returns
      # Boolean:: true if it is identical, false otherwise.
      #
      def identical?
        exists? && File.binread(destination) == render
      end

      # Holds the content to be added to the file.
      #
      def render
        @render ||= if data.is_a?(Proc)
          data.call
        else
          data
        end
      end

      def invoke!
        invoke_with_conflict_check do
          require "fileutils"
          FileUtils.mkdir_p(File.dirname(destination))
          File.open(destination, "wb") { |f| f.write render }
        end
        given_destination
      end

    protected

      # Now on conflict we check if the file is identical or not.
      #
      def on_conflict_behavior(&block)
        if identical?
          say_status :identical, :blue
        else
          options = base.options.merge(config)
          force_or_skip_or_conflict(options[:force], options[:skip], &block)
        end
      end

      # If force is true, run the action, otherwise check if it's not being
      # skipped. If both are false, show the file_collision menu, if the menu
      # returns true, force it, otherwise skip.
      #
      def force_or_skip_or_conflict(force, skip, &block)
        if force
          say_status :force, :yellow
          yield unless pretend?
        elsif skip
          say_status :skip, :yellow
        else
          say_status :conflict, :red
          force_or_skip_or_conflict(force_on_collision?, true, &block)
        end
      end

      # Shows the file collision menu to the user and gets the result.
      #
      def force_on_collision?
        base.shell.file_collision(destination) { render }
      end
    end
  end
end
PK}$[,;��		Ngems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/actions/directory.rbnu�[���require_relative "empty_directory"

class Bundler::Thor
  module Actions
    # Copies recursively the files from source directory to root directory.
    # If any of the files finishes with .tt, it's considered to be a template
    # and is placed in the destination without the extension .tt. If any
    # empty directory is found, it's copied and all .empty_directory files are
    # ignored. If any file name is wrapped within % signs, the text within
    # the % signs will be executed as a method and replaced with the returned
    # value. Let's suppose a doc directory with the following files:
    #
    #   doc/
    #     components/.empty_directory
    #     README
    #     rdoc.rb.tt
    #     %app_name%.rb
    #
    # When invoked as:
    #
    #   directory "doc"
    #
    # It will create a doc directory in the destination with the following
    # files (assuming that the `app_name` method returns the value "blog"):
    #
    #   doc/
    #     components/
    #     README
    #     rdoc.rb
    #     blog.rb
    #
    # <b>Encoded path note:</b> Since Bundler::Thor internals use Object#respond_to? to check if it can
    # expand %something%, this `something` should be a public method in the class calling
    # #directory. If a method is private, Bundler::Thor stack raises PrivateMethodEncodedError.
    #
    # ==== Parameters
    # source<String>:: the relative path to the source root.
    # destination<String>:: the relative path to the destination root.
    # config<Hash>:: give :verbose => false to not log the status.
    #                If :recursive => false, does not look for paths recursively.
    #                If :mode => :preserve, preserve the file mode from the source.
    #                If :exclude_pattern => /regexp/, prevents copying files that match that regexp.
    #
    # ==== Examples
    #
    #   directory "doc"
    #   directory "doc", "docs", :recursive => false
    #
    def directory(source, *args, &block)
      config = args.last.is_a?(Hash) ? args.pop : {}
      destination = args.first || source
      action Directory.new(self, source, destination || source, config, &block)
    end

    class Directory < EmptyDirectory #:nodoc:
      attr_reader :source

      def initialize(base, source, destination = nil, config = {}, &block)
        @source = File.expand_path(Dir[Util.escape_globs(base.find_in_source_paths(source.to_s))].first)
        @block  = block
        super(base, destination, {:recursive => true}.merge(config))
      end

      def invoke!
        base.empty_directory given_destination, config
        execute!
      end

      def revoke!
        execute!
      end

    protected

      def execute!
        lookup = Util.escape_globs(source)
        lookup = config[:recursive] ? File.join(lookup, "**") : lookup
        lookup = file_level_lookup(lookup)

        files(lookup).sort.each do |file_source|
          next if File.directory?(file_source)
          next if config[:exclude_pattern] && file_source.match(config[:exclude_pattern])
          file_destination = File.join(given_destination, file_source.gsub(source, "."))
          file_destination.gsub!("/./", "/")

          case file_source
          when /\.empty_directory$/
            dirname = File.dirname(file_destination).gsub(%r{/\.$}, "")
            next if dirname == given_destination
            base.empty_directory(dirname, config)
          when /#{TEMPLATE_EXTNAME}$/
            base.template(file_source, file_destination[0..-4], config, &@block)
          else
            base.copy_file(file_source, file_destination, config, &@block)
          end
        end
      end

      def file_level_lookup(previous_lookup)
        File.join(previous_lookup, "*")
      end

      def files(lookup)
        Dir.glob(lookup, File::FNM_DOTMATCH)
      end
    end
  end
end
PK}$[O�&��Tgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rbnu�[���class Bundler::Thor
  module Actions
    # Creates an empty directory.
    #
    # ==== Parameters
    # destination<String>:: the relative path to the destination root.
    # config<Hash>:: give :verbose => false to not log the status.
    #
    # ==== Examples
    #
    #   empty_directory "doc"
    #
    def empty_directory(destination, config = {})
      action EmptyDirectory.new(self, destination, config)
    end

    # Class which holds create directory logic. This is the base class for
    # other actions like create_file and directory.
    #
    # This implementation is based in Templater actions, created by Jonas Nicklas
    # and Michael S. Klishin under MIT LICENSE.
    #
    class EmptyDirectory #:nodoc:
      attr_reader :base, :destination, :given_destination, :relative_destination, :config

      # Initializes given the source and destination.
      #
      # ==== Parameters
      # base<Bundler::Thor::Base>:: A Bundler::Thor::Base instance
      # source<String>:: Relative path to the source of this file
      # destination<String>:: Relative path to the destination of this file
      # config<Hash>:: give :verbose => false to not log the status.
      #
      def initialize(base, destination, config = {})
        @base = base
        @config = {:verbose => true}.merge(config)
        self.destination = destination
      end

      # Checks if the destination file already exists.
      #
      # ==== Returns
      # Boolean:: true if the file exists, false otherwise.
      #
      def exists?
        ::File.exist?(destination)
      end

      def invoke!
        invoke_with_conflict_check do
          require "fileutils"
          ::FileUtils.mkdir_p(destination)
        end
      end

      def revoke!
        say_status :remove, :red
        require "fileutils"
        ::FileUtils.rm_rf(destination) if !pretend? && exists?
        given_destination
      end

    protected

      # Shortcut for pretend.
      #
      def pretend?
        base.options[:pretend]
      end

      # Sets the absolute destination value from a relative destination value.
      # It also stores the given and relative destination. Let's suppose our
      # script is being executed on "dest", it sets the destination root to
      # "dest". The destination, given_destination and relative_destination
      # are related in the following way:
      #
      #   inside "bar" do
      #     empty_directory "baz"
      #   end
      #
      #   destination          #=> dest/bar/baz
      #   relative_destination #=> bar/baz
      #   given_destination    #=> baz
      #
      def destination=(destination)
        return unless destination
        @given_destination = convert_encoded_instructions(destination.to_s)
        @destination = ::File.expand_path(@given_destination, base.destination_root)
        @relative_destination = base.relative_to_original_destination_root(@destination)
      end

      # Filenames in the encoded form are converted. If you have a file:
      #
      #   %file_name%.rb
      #
      # It calls #file_name from the base and replaces %-string with the
      # return value (should be String) of #file_name:
      #
      #   user.rb
      #
      # The method referenced can be either public or private.
      #
      def convert_encoded_instructions(filename)
        filename.gsub(/%(.*?)%/) do |initial_string|
          method = $1.strip
          base.respond_to?(method, true) ? base.send(method) : initial_string
        end
      end

      # Receives a hash of options and just execute the block if some
      # conditions are met.
      #
      def invoke_with_conflict_check(&block)
        if exists?
          on_conflict_behavior(&block)
        else
          yield unless pretend?
          say_status :create, :green
        end

        destination
      rescue Errno::EISDIR, Errno::EEXIST
        on_file_clash_behavior
      end

      def on_file_clash_behavior
        say_status :file_clash, :red
      end

      # What to do when the destination file already exists.
      #
      def on_conflict_behavior
        say_status :exist, :blue
      end

      # Shortcut to say_status shell method.
      #
      def say_status(status, color)
        base.shell.say_status status, relative_destination, color if config[:verbose]
      end
    end
  end
end
PK}$[s	��mmPgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/actions/create_link.rbnu�[���require_relative "create_file"

class Bundler::Thor
  module Actions
    # Create a new file relative to the destination root from the given source.
    #
    # ==== Parameters
    # destination<String>:: the relative path to the destination root.
    # source<String|NilClass>:: the relative path to the source root.
    # config<Hash>:: give :verbose => false to not log the status.
    #   :: give :symbolic => false for hard link.
    #
    # ==== Examples
    #
    #   create_link "config/apache.conf", "/etc/apache.conf"
    #
    def create_link(destination, *args)
      config = args.last.is_a?(Hash) ? args.pop : {}
      source = args.first
      action CreateLink.new(self, destination, source, config)
    end
    alias_method :add_link, :create_link

    # CreateLink is a subset of CreateFile, which instead of taking a block of
    # data, just takes a source string from the user.
    #
    class CreateLink < CreateFile #:nodoc:
      attr_reader :data

      # Checks if the content of the file at the destination is identical to the rendered result.
      #
      # ==== Returns
      # Boolean:: true if it is identical, false otherwise.
      #
      def identical?
        source = File.expand_path(render, File.dirname(destination))
        exists? && File.identical?(source, destination)
      end

      def invoke!
        invoke_with_conflict_check do
          require "fileutils"
          FileUtils.mkdir_p(File.dirname(destination))
          # Create a symlink by default
          config[:symbolic] = true if config[:symbolic].nil?
          File.unlink(destination) if exists?
          if config[:symbolic]
            File.symlink(render, destination)
          else
            File.link(render, destination)
          end
        end
        given_destination
      end

      def exists?
        super || File.symlink?(destination)
      end
    end
  end
end
PK}$[��}e�
�
Bgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/error.rbnu�[���class Bundler::Thor
  Correctable = if defined?(DidYouMean::SpellChecker) && defined?(DidYouMean::Correctable) # rubocop:disable Naming/ConstantName
                  # In order to support versions of Ruby that don't have keyword
                  # arguments, we need our own spell checker class that doesn't take key
                  # words. Even though this code wouldn't be hit because of the check
                  # above, it's still necessary because the interpreter would otherwise be
                  # unable to parse the file.
                  class NoKwargSpellChecker < DidYouMean::SpellChecker # :nodoc:
                    def initialize(dictionary)
                      @dictionary = dictionary
                    end
                  end

                  DidYouMean::Correctable
                end

  # Bundler::Thor::Error is raised when it's caused by wrong usage of thor classes. Those
  # errors have their backtrace suppressed and are nicely shown to the user.
  #
  # Errors that are caused by the developer, like declaring a method which
  # overwrites a thor keyword, SHOULD NOT raise a Bundler::Thor::Error. This way, we
  # ensure that developer errors are shown with full backtrace.
  class Error < StandardError
  end

  # Raised when a command was not found.
  class UndefinedCommandError < Error
    class SpellChecker
      attr_reader :error

      def initialize(error)
        @error = error
      end

      def corrections
        @corrections ||= spell_checker.correct(error.command).map(&:inspect)
      end

      def spell_checker
        NoKwargSpellChecker.new(error.all_commands)
      end
    end

    attr_reader :command, :all_commands

    def initialize(command, all_commands, namespace)
      @command = command
      @all_commands = all_commands

      message = "Could not find command #{command.inspect}"
      message = namespace ? "#{message} in #{namespace.inspect} namespace." : "#{message}."

      super(message)
    end

    prepend Correctable if Correctable
  end
  UndefinedTaskError = UndefinedCommandError

  class AmbiguousCommandError < Error
  end
  AmbiguousTaskError = AmbiguousCommandError

  # Raised when a command was found, but not invoked properly.
  class InvocationError < Error
  end

  class UnknownArgumentError < Error
    class SpellChecker
      attr_reader :error

      def initialize(error)
        @error = error
      end

      def corrections
        @corrections ||=
          error.unknown.flat_map { |unknown| spell_checker.correct(unknown) }.uniq.map(&:inspect)
      end

      def spell_checker
        @spell_checker ||= NoKwargSpellChecker.new(error.switches)
      end
    end

    attr_reader :switches, :unknown

    def initialize(switches, unknown)
      @switches = switches
      @unknown = unknown

      super("Unknown switches #{unknown.map(&:inspect).join(', ')}")
    end

    prepend Correctable if Correctable
  end

  class RequiredArgumentMissingError < InvocationError
  end

  class MalformattedArgumentError < InvocationError
  end

  if Correctable
    if DidYouMean.respond_to?(:correct_error)
      DidYouMean.correct_error(Bundler::Thor::UndefinedCommandError, UndefinedCommandError::SpellChecker)
      DidYouMean.correct_error(Bundler::Thor::UnknownArgumentError, UnknownArgumentError::SpellChecker)
    else
      DidYouMean::SPELL_CHECKERS.merge!(
        'Bundler::Thor::UndefinedCommandError' => UndefinedCommandError::SpellChecker,
        'Bundler::Thor::UnknownArgumentError' => UnknownArgumentError::SpellChecker
      )
    end
  end
end
PK}$[Y�t}}Ngems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rbnu�[���class Bundler::Thor
  module LineEditor
    class Basic
      attr_reader :prompt, :options

      def self.available?
        true
      end

      def initialize(prompt, options)
        @prompt = prompt
        @options = options
      end

      def readline
        $stdout.print(prompt)
        get_input
      end

    private

      def get_input
        if echo?
          $stdin.gets
        else
          # Lazy-load io/console since it is gem-ified as of 2.3
          require "io/console"
          $stdin.noecho(&:gets)
        end
      end

      def echo?
        options.fetch(:echo, true)
      end
    end
  end
end
PK}$[�dq=77Qgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rbnu�[���class Bundler::Thor
  module LineEditor
    class Readline < Basic
      def self.available?
        begin
          require "readline"
        rescue LoadError
        end

        Object.const_defined?(:Readline)
      end

      def readline
        if echo?
          ::Readline.completion_append_character = nil
          # rb-readline does not allow Readline.completion_proc= to receive nil.
          if complete = completion_proc
            ::Readline.completion_proc = complete
          end
          ::Readline.readline(prompt, add_to_history?)
        else
          super
        end
      end

    private

      def add_to_history?
        options.fetch(:add_to_history, true)
      end

      def completion_proc
        if use_path_completion?
          proc { |text| PathCompletion.new(text).matches }
        elsif completion_options.any?
          proc do |text|
            completion_options.select { |option| option.start_with?(text) }
          end
        end
      end

      def completion_options
        options.fetch(:limited_to, [])
      end

      def use_path_completion?
        options.fetch(:path, false)
      end

      class PathCompletion
        attr_reader :text
        private :text

        def initialize(text)
          @text = text
        end

        def matches
          relative_matches
        end

      private

        def relative_matches
          absolute_matches.map { |path| path.sub(base_path, "") }
        end

        def absolute_matches
          Dir[glob_pattern].map do |path|
            if File.directory?(path)
              "#{path}/"
            else
              path
            end
          end
        end

        def glob_pattern
          "#{base_path}#{text}*"
        end

        def base_path
          "#{Dir.pwd}/"
        end
      end
    end
  end
end
PK}$[�LWX#X#Agems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/util.rbnu�[���require "rbconfig"

class Bundler::Thor
  module Sandbox #:nodoc:
  end

  # This module holds several utilities:
  #
  # 1) Methods to convert thor namespaces to constants and vice-versa.
  #
  #   Bundler::Thor::Util.namespace_from_thor_class(Foo::Bar::Baz) #=> "foo:bar:baz"
  #
  # 2) Loading thor files and sandboxing:
  #
  #   Bundler::Thor::Util.load_thorfile("~/.thor/foo")
  #
  module Util
    class << self
      # Receives a namespace and search for it in the Bundler::Thor::Base subclasses.
      #
      # ==== Parameters
      # namespace<String>:: The namespace to search for.
      #
      def find_by_namespace(namespace)
        namespace = "default#{namespace}" if namespace.empty? || namespace =~ /^:/
        Bundler::Thor::Base.subclasses.detect { |klass| klass.namespace == namespace }
      end

      # Receives a constant and converts it to a Bundler::Thor namespace. Since Bundler::Thor
      # commands can be added to a sandbox, this method is also responsible for
      # removing the sandbox namespace.
      #
      # This method should not be used in general because it's used to deal with
      # older versions of Bundler::Thor. On current versions, if you need to get the
      # namespace from a class, just call namespace on it.
      #
      # ==== Parameters
      # constant<Object>:: The constant to be converted to the thor path.
      #
      # ==== Returns
      # String:: If we receive Foo::Bar::Baz it returns "foo:bar:baz"
      #
      def namespace_from_thor_class(constant)
        constant = constant.to_s.gsub(/^Bundler::Thor::Sandbox::/, "")
        constant = snake_case(constant).squeeze(":")
        constant
      end

      # Given the contents, evaluate it inside the sandbox and returns the
      # namespaces defined in the sandbox.
      #
      # ==== Parameters
      # contents<String>
      #
      # ==== Returns
      # Array[Object]
      #
      def namespaces_in_content(contents, file = __FILE__)
        old_constants = Bundler::Thor::Base.subclasses.dup
        Bundler::Thor::Base.subclasses.clear

        load_thorfile(file, contents)

        new_constants = Bundler::Thor::Base.subclasses.dup
        Bundler::Thor::Base.subclasses.replace(old_constants)

        new_constants.map!(&:namespace)
        new_constants.compact!
        new_constants
      end

      # Returns the thor classes declared inside the given class.
      #
      def thor_classes_in(klass)
        stringfied_constants = klass.constants.map(&:to_s)
        Bundler::Thor::Base.subclasses.select do |subclass|
          next unless subclass.name
          stringfied_constants.include?(subclass.name.gsub("#{klass.name}::", ""))
        end
      end

      # Receives a string and convert it to snake case. SnakeCase returns snake_case.
      #
      # ==== Parameters
      # String
      #
      # ==== Returns
      # String
      #
      def snake_case(str)
        return str.downcase if str =~ /^[A-Z_]+$/
        str.gsub(/\B[A-Z]/, '_\&').squeeze("_") =~ /_*(.*)/
        $+.downcase
      end

      # Receives a string and convert it to camel case. camel_case returns CamelCase.
      #
      # ==== Parameters
      # String
      #
      # ==== Returns
      # String
      #
      def camel_case(str)
        return str if str !~ /_/ && str =~ /[A-Z]+.*/
        str.split("_").map(&:capitalize).join
      end

      # Receives a namespace and tries to retrieve a Bundler::Thor or Bundler::Thor::Group class
      # from it. It first searches for a class using the all the given namespace,
      # if it's not found, removes the highest entry and searches for the class
      # again. If found, returns the highest entry as the class name.
      #
      # ==== Examples
      #
      #   class Foo::Bar < Bundler::Thor
      #     def baz
      #     end
      #   end
      #
      #   class Baz::Foo < Bundler::Thor::Group
      #   end
      #
      #   Bundler::Thor::Util.namespace_to_thor_class("foo:bar")     #=> Foo::Bar, nil # will invoke default command
      #   Bundler::Thor::Util.namespace_to_thor_class("baz:foo")     #=> Baz::Foo, nil
      #   Bundler::Thor::Util.namespace_to_thor_class("foo:bar:baz") #=> Foo::Bar, "baz"
      #
      # ==== Parameters
      # namespace<String>
      #
      def find_class_and_command_by_namespace(namespace, fallback = true)
        if namespace.include?(":") # look for a namespaced command
          pieces  = namespace.split(":")
          command = pieces.pop
          klass   = Bundler::Thor::Util.find_by_namespace(pieces.join(":"))
        end
        unless klass # look for a Bundler::Thor::Group with the right name
          klass = Bundler::Thor::Util.find_by_namespace(namespace)
          command = nil
        end
        if !klass && fallback # try a command in the default namespace
          command = namespace
          klass   = Bundler::Thor::Util.find_by_namespace("")
        end
        [klass, command]
      end
      alias_method :find_class_and_task_by_namespace, :find_class_and_command_by_namespace

      # Receives a path and load the thor file in the path. The file is evaluated
      # inside the sandbox to avoid namespacing conflicts.
      #
      def load_thorfile(path, content = nil, debug = false)
        content ||= File.binread(path)

        begin
          Bundler::Thor::Sandbox.class_eval(content, path)
        rescue StandardError => e
          $stderr.puts("WARNING: unable to load thorfile #{path.inspect}: #{e.message}")
          if debug
            $stderr.puts(*e.backtrace)
          else
            $stderr.puts(e.backtrace.first)
          end
        end
      end

      def user_home
        @@user_home ||= if ENV["HOME"]
          ENV["HOME"]
        elsif ENV["USERPROFILE"]
          ENV["USERPROFILE"]
        elsif ENV["HOMEDRIVE"] && ENV["HOMEPATH"]
          File.join(ENV["HOMEDRIVE"], ENV["HOMEPATH"])
        elsif ENV["APPDATA"]
          ENV["APPDATA"]
        else
          begin
            File.expand_path("~")
          rescue
            if File::ALT_SEPARATOR
              "C:/"
            else
              "/"
            end
          end
        end
      end

      # Returns the root where thor files are located, depending on the OS.
      #
      def thor_root
        File.join(user_home, ".thor").tr('\\', "/")
      end

      # Returns the files in the thor root. On Windows thor_root will be something
      # like this:
      #
      #   C:\Documents and Settings\james\.thor
      #
      # If we don't #gsub the \ character, Dir.glob will fail.
      #
      def thor_root_glob
        files = Dir["#{escape_globs(thor_root)}/*"]

        files.map! do |file|
          File.directory?(file) ? File.join(file, "main.thor") : file
        end
      end

      # Where to look for Bundler::Thor files.
      #
      def globs_for(path)
        path = escape_globs(path)
        ["#{path}/Thorfile", "#{path}/*.thor", "#{path}/tasks/*.thor", "#{path}/lib/tasks/**/*.thor"]
      end

      # Return the path to the ruby interpreter taking into account multiple
      # installations and windows extensions.
      #
      def ruby_command
        @ruby_command ||= begin
          ruby_name = RbConfig::CONFIG["ruby_install_name"]
          ruby = File.join(RbConfig::CONFIG["bindir"], ruby_name)
          ruby << RbConfig::CONFIG["EXEEXT"]

          # avoid using different name than ruby (on platforms supporting links)
          if ruby_name != "ruby" && File.respond_to?(:readlink)
            begin
              alternate_ruby = File.join(RbConfig::CONFIG["bindir"], "ruby")
              alternate_ruby << RbConfig::CONFIG["EXEEXT"]

              # ruby is a symlink
              if File.symlink? alternate_ruby
                linked_ruby = File.readlink alternate_ruby

                # symlink points to 'ruby_install_name'
                ruby = alternate_ruby if linked_ruby == ruby_name || linked_ruby == ruby
              end
            rescue NotImplementedError # rubocop:disable HandleExceptions
              # just ignore on windows
            end
          end

          # escape string in case path to ruby executable contain spaces.
          ruby.sub!(/.*\s.*/m, '"\&"')
          ruby
        end
      end

      # Returns a string that has had any glob characters escaped.
      # The glob characters are `* ? { } [ ]`.
      #
      # ==== Examples
      #
      #   Bundler::Thor::Util.escape_globs('[apps]')   # => '\[apps\]'
      #
      # ==== Parameters
      # String
      #
      # ==== Returns
      # String
      #
      def escape_globs(path)
        path.to_s.gsub(/[*?{}\[\]]/, '\\\\\\&')
      end

      # Returns a string that has had any HTML characters escaped.
      #
      # ==== Examples
      #
      #   Bundler::Thor::Util.escape_html('<div>')   # => "&lt;div&gt;"
      #
      # ==== Parameters
      # String
      #
      # ==== Returns
      # String
      #
      def escape_html(string)
        CGI.escapeHTML(string)
      end
    end
  end
end
PK}$[����`�`Agems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/base.rbnu�[���require_relative "command"
require_relative "core_ext/hash_with_indifferent_access"
require_relative "error"
require_relative "invocation"
require_relative "nested_context"
require_relative "parser"
require_relative "shell"
require_relative "line_editor"
require_relative "util"

class Bundler::Thor
  autoload :Actions,    File.expand_path("actions", __dir__)
  autoload :RakeCompat, File.expand_path("rake_compat", __dir__)
  autoload :Group,      File.expand_path("group", __dir__)

  # Shortcuts for help.
  HELP_MAPPINGS       = %w(-h -? --help -D)

  # Bundler::Thor methods that should not be overwritten by the user.
  THOR_RESERVED_WORDS = %w(invoke shell options behavior root destination_root relative_root
                           action add_file create_file in_root inside run run_ruby_script)

  TEMPLATE_EXTNAME = ".tt"

  class << self
    def deprecation_warning(message) #:nodoc:
      unless ENV['THOR_SILENCE_DEPRECATION']
        warn "Deprecation warning: #{message}\n" +
          'You can silence deprecations warning by setting the environment variable THOR_SILENCE_DEPRECATION.'
      end
    end
  end

  module Base
    attr_accessor :options, :parent_options, :args

    # It receives arguments in an Array and two hashes, one for options and
    # other for configuration.
    #
    # Notice that it does not check if all required arguments were supplied.
    # It should be done by the parser.
    #
    # ==== Parameters
    # args<Array[Object]>:: An array of objects. The objects are applied to their
    #                       respective accessors declared with <tt>argument</tt>.
    #
    # options<Hash>:: An options hash that will be available as self.options.
    #                 The hash given is converted to a hash with indifferent
    #                 access, magic predicates (options.skip?) and then frozen.
    #
    # config<Hash>:: Configuration for this Bundler::Thor class.
    #
    def initialize(args = [], local_options = {}, config = {})
      parse_options = self.class.class_options

      # The start method splits inbound arguments at the first argument
      # that looks like an option (starts with - or --). It then calls
      # new, passing in the two halves of the arguments Array as the
      # first two parameters.

      command_options = config.delete(:command_options) # hook for start
      parse_options = parse_options.merge(command_options) if command_options
      if local_options.is_a?(Array)
        array_options = local_options
        hash_options = {}
      else
        # Handle the case where the class was explicitly instantiated
        # with pre-parsed options.
        array_options = []
        hash_options = local_options
      end

      # Let Bundler::Thor::Options parse the options first, so it can remove
      # declared options from the array. This will leave us with
      # a list of arguments that weren't declared.
      stop_on_unknown = self.class.stop_on_unknown_option? config[:current_command]
      disable_required_check = self.class.disable_required_check? config[:current_command]
      opts = Bundler::Thor::Options.new(parse_options, hash_options, stop_on_unknown, disable_required_check)
      self.options = opts.parse(array_options)
      self.options = config[:class_options].merge(options) if config[:class_options]

      # If unknown options are disallowed, make sure that none of the
      # remaining arguments looks like an option.
      opts.check_unknown! if self.class.check_unknown_options?(config)

      # Add the remaining arguments from the options parser to the
      # arguments passed in to initialize. Then remove any positional
      # arguments declared using #argument (this is primarily used
      # by Bundler::Thor::Group). Tis will leave us with the remaining
      # positional arguments.
      to_parse  = args
      to_parse += opts.remaining unless self.class.strict_args_position?(config)

      thor_args = Bundler::Thor::Arguments.new(self.class.arguments)
      thor_args.parse(to_parse).each { |k, v| __send__("#{k}=", v) }
      @args = thor_args.remaining
    end

    class << self
      def included(base) #:nodoc:
        super(base)
        base.extend ClassMethods
        base.send :include, Invocation
        base.send :include, Shell
      end

      # Returns the classes that inherits from Bundler::Thor or Bundler::Thor::Group.
      #
      # ==== Returns
      # Array[Class]
      #
      def subclasses
        @subclasses ||= []
      end

      # Returns the files where the subclasses are kept.
      #
      # ==== Returns
      # Hash[path<String> => Class]
      #
      def subclass_files
        @subclass_files ||= Hash.new { |h, k| h[k] = [] }
      end

      # Whenever a class inherits from Bundler::Thor or Bundler::Thor::Group, we should track the
      # class and the file on Bundler::Thor::Base. This is the method responsible for it.
      #
      def register_klass_file(klass) #:nodoc:
        file = caller[1].match(/(.*):\d+/)[1]
        Bundler::Thor::Base.subclasses << klass unless Bundler::Thor::Base.subclasses.include?(klass)

        file_subclasses = Bundler::Thor::Base.subclass_files[File.expand_path(file)]
        file_subclasses << klass unless file_subclasses.include?(klass)
      end
    end

    module ClassMethods
      def attr_reader(*) #:nodoc:
        no_commands { super }
      end

      def attr_writer(*) #:nodoc:
        no_commands { super }
      end

      def attr_accessor(*) #:nodoc:
        no_commands { super }
      end

      # If you want to raise an error for unknown options, call check_unknown_options!
      # This is disabled by default to allow dynamic invocations.
      def check_unknown_options!
        @check_unknown_options = true
      end

      def check_unknown_options #:nodoc:
        @check_unknown_options ||= from_superclass(:check_unknown_options, false)
      end

      def check_unknown_options?(config) #:nodoc:
        !!check_unknown_options
      end

      # If you want to raise an error when the default value of an option does not match
      # the type call check_default_type!
      # This will be the default; for compatibility a deprecation warning is issued if necessary.
      def check_default_type!
        @check_default_type = true
      end

      # If you want to use defaults that don't match the type of an option,
      # either specify `check_default_type: false` or call `allow_incompatible_default_type!`
      def allow_incompatible_default_type!
        @check_default_type = false
      end

      def check_default_type #:nodoc:
        @check_default_type = from_superclass(:check_default_type, nil) unless defined?(@check_default_type)
        @check_default_type
      end

      # If true, option parsing is suspended as soon as an unknown option or a
      # regular argument is encountered.  All remaining arguments are passed to
      # the command as regular arguments.
      def stop_on_unknown_option?(command_name) #:nodoc:
        false
      end

      # If true, option set will not suspend the execution of the command when
      # a required option is not provided.
      def disable_required_check?(command_name) #:nodoc:
        false
      end

      # If you want only strict string args (useful when cascading thor classes),
      # call strict_args_position! This is disabled by default to allow dynamic
      # invocations.
      def strict_args_position!
        @strict_args_position = true
      end

      def strict_args_position #:nodoc:
        @strict_args_position ||= from_superclass(:strict_args_position, false)
      end

      def strict_args_position?(config) #:nodoc:
        !!strict_args_position
      end

      # Adds an argument to the class and creates an attr_accessor for it.
      #
      # Arguments are different from options in several aspects. The first one
      # is how they are parsed from the command line, arguments are retrieved
      # from position:
      #
      #   thor command NAME
      #
      # Instead of:
      #
      #   thor command --name=NAME
      #
      # Besides, arguments are used inside your code as an accessor (self.argument),
      # while options are all kept in a hash (self.options).
      #
      # Finally, arguments cannot have type :default or :boolean but can be
      # optional (supplying :optional => :true or :required => false), although
      # you cannot have a required argument after a non-required argument. If you
      # try it, an error is raised.
      #
      # ==== Parameters
      # name<Symbol>:: The name of the argument.
      # options<Hash>:: Described below.
      #
      # ==== Options
      # :desc     - Description for the argument.
      # :required - If the argument is required or not.
      # :optional - If the argument is optional or not.
      # :type     - The type of the argument, can be :string, :hash, :array, :numeric.
      # :default  - Default value for this argument. It cannot be required and have default values.
      # :banner   - String to show on usage notes.
      #
      # ==== Errors
      # ArgumentError:: Raised if you supply a required argument after a non required one.
      #
      def argument(name, options = {})
        is_thor_reserved_word?(name, :argument)
        no_commands { attr_accessor name }

        required = if options.key?(:optional)
          !options[:optional]
        elsif options.key?(:required)
          options[:required]
        else
          options[:default].nil?
        end

        remove_argument name

        if required
          arguments.each do |argument|
            next if argument.required?
            raise ArgumentError, "You cannot have #{name.to_s.inspect} as required argument after " \
                                "the non-required argument #{argument.human_name.inspect}."
          end
        end

        options[:required] = required

        arguments << Bundler::Thor::Argument.new(name, options)
      end

      # Returns this class arguments, looking up in the ancestors chain.
      #
      # ==== Returns
      # Array[Bundler::Thor::Argument]
      #
      def arguments
        @arguments ||= from_superclass(:arguments, [])
      end

      # Adds a bunch of options to the set of class options.
      #
      #   class_options :foo => false, :bar => :required, :baz => :string
      #
      # If you prefer more detailed declaration, check class_option.
      #
      # ==== Parameters
      # Hash[Symbol => Object]
      #
      def class_options(options = nil)
        @class_options ||= from_superclass(:class_options, {})
        build_options(options, @class_options) if options
        @class_options
      end

      # Adds an option to the set of class options
      #
      # ==== Parameters
      # name<Symbol>:: The name of the argument.
      # options<Hash>:: Described below.
      #
      # ==== Options
      # :desc::     -- Description for the argument.
      # :required:: -- If the argument is required or not.
      # :default::  -- Default value for this argument.
      # :group::    -- The group for this options. Use by class options to output options in different levels.
      # :aliases::  -- Aliases for this option. <b>Note:</b> Bundler::Thor follows a convention of one-dash-one-letter options. Thus aliases like "-something" wouldn't be parsed; use either "\--something" or "-s" instead.
      # :type::     -- The type of the argument, can be :string, :hash, :array, :numeric or :boolean.
      # :banner::   -- String to show on usage notes.
      # :hide::     -- If you want to hide this option from the help.
      #
      def class_option(name, options = {})
        build_option(name, options, class_options)
      end

      # Removes a previous defined argument. If :undefine is given, undefine
      # accessors as well.
      #
      # ==== Parameters
      # names<Array>:: Arguments to be removed
      #
      # ==== Examples
      #
      #   remove_argument :foo
      #   remove_argument :foo, :bar, :baz, :undefine => true
      #
      def remove_argument(*names)
        options = names.last.is_a?(Hash) ? names.pop : {}

        names.each do |name|
          arguments.delete_if { |a| a.name == name.to_s }
          undef_method name, "#{name}=" if options[:undefine]
        end
      end

      # Removes a previous defined class option.
      #
      # ==== Parameters
      # names<Array>:: Class options to be removed
      #
      # ==== Examples
      #
      #   remove_class_option :foo
      #   remove_class_option :foo, :bar, :baz
      #
      def remove_class_option(*names)
        names.each do |name|
          class_options.delete(name)
        end
      end

      # Defines the group. This is used when thor list is invoked so you can specify
      # that only commands from a pre-defined group will be shown. Defaults to standard.
      #
      # ==== Parameters
      # name<String|Symbol>
      #
      def group(name = nil)
        if name
          @group = name.to_s
        else
          @group ||= from_superclass(:group, "standard")
        end
      end

      # Returns the commands for this Bundler::Thor class.
      #
      # ==== Returns
      # Hash:: An ordered hash with commands names as keys and Bundler::Thor::Command
      #        objects as values.
      #
      def commands
        @commands ||= Hash.new
      end
      alias_method :tasks, :commands

      # Returns the commands for this Bundler::Thor class and all subclasses.
      #
      # ==== Returns
      # Hash:: An ordered hash with commands names as keys and Bundler::Thor::Command
      #        objects as values.
      #
      def all_commands
        @all_commands ||= from_superclass(:all_commands, Hash.new)
        @all_commands.merge!(commands)
      end
      alias_method :all_tasks, :all_commands

      # Removes a given command from this Bundler::Thor class. This is usually done if you
      # are inheriting from another class and don't want it to be available
      # anymore.
      #
      # By default it only remove the mapping to the command. But you can supply
      # :undefine => true to undefine the method from the class as well.
      #
      # ==== Parameters
      # name<Symbol|String>:: The name of the command to be removed
      # options<Hash>:: You can give :undefine => true if you want commands the method
      #                 to be undefined from the class as well.
      #
      def remove_command(*names)
        options = names.last.is_a?(Hash) ? names.pop : {}

        names.each do |name|
          commands.delete(name.to_s)
          all_commands.delete(name.to_s)
          undef_method name if options[:undefine]
        end
      end
      alias_method :remove_task, :remove_command

      # All methods defined inside the given block are not added as commands.
      #
      # So you can do:
      #
      #   class MyScript < Bundler::Thor
      #     no_commands do
      #       def this_is_not_a_command
      #       end
      #     end
      #   end
      #
      # You can also add the method and remove it from the command list:
      #
      #   class MyScript < Bundler::Thor
      #     def this_is_not_a_command
      #     end
      #     remove_command :this_is_not_a_command
      #   end
      #
      def no_commands(&block)
        no_commands_context.enter(&block)
      end

      alias_method :no_tasks, :no_commands

      def no_commands_context
        @no_commands_context ||= NestedContext.new
      end

      def no_commands?
        no_commands_context.entered?
      end

      # Sets the namespace for the Bundler::Thor or Bundler::Thor::Group class. By default the
      # namespace is retrieved from the class name. If your Bundler::Thor class is named
      # Scripts::MyScript, the help method, for example, will be called as:
      #
      #   thor scripts:my_script -h
      #
      # If you change the namespace:
      #
      #   namespace :my_scripts
      #
      # You change how your commands are invoked:
      #
      #   thor my_scripts -h
      #
      # Finally, if you change your namespace to default:
      #
      #   namespace :default
      #
      # Your commands can be invoked with a shortcut. Instead of:
      #
      #   thor :my_command
      #
      def namespace(name = nil)
        if name
          @namespace = name.to_s
        else
          @namespace ||= Bundler::Thor::Util.namespace_from_thor_class(self)
        end
      end

      # Parses the command and options from the given args, instantiate the class
      # and invoke the command. This method is used when the arguments must be parsed
      # from an array. If you are inside Ruby and want to use a Bundler::Thor class, you
      # can simply initialize it:
      #
      #   script = MyScript.new(args, options, config)
      #   script.invoke(:command, first_arg, second_arg, third_arg)
      #
      def start(given_args = ARGV, config = {})
        config[:shell] ||= Bundler::Thor::Base.shell.new
        dispatch(nil, given_args.dup, nil, config)
      rescue Bundler::Thor::Error => e
        config[:debug] || ENV["THOR_DEBUG"] == "1" ? (raise e) : config[:shell].error(e.message)
        exit(false) if exit_on_failure?
      rescue Errno::EPIPE
        # This happens if a thor command is piped to something like `head`,
        # which closes the pipe when it's done reading. This will also
        # mean that if the pipe is closed, further unnecessary
        # computation will not occur.
        exit(true)
      end

      # Allows to use private methods from parent in child classes as commands.
      #
      # ==== Parameters
      #   names<Array>:: Method names to be used as commands
      #
      # ==== Examples
      #
      #   public_command :foo
      #   public_command :foo, :bar, :baz
      #
      def public_command(*names)
        names.each do |name|
          class_eval "def #{name}(*); super end"
        end
      end
      alias_method :public_task, :public_command

      def handle_no_command_error(command, has_namespace = $thor_runner) #:nodoc:
        raise UndefinedCommandError.new(command, all_commands.keys, (namespace if has_namespace))
      end
      alias_method :handle_no_task_error, :handle_no_command_error

      def handle_argument_error(command, error, args, arity) #:nodoc:
        name = [command.ancestor_name, command.name].compact.join(" ")
        msg = "ERROR: \"#{basename} #{name}\" was called with ".dup
        msg << "no arguments"               if     args.empty?
        msg << "arguments " << args.inspect unless args.empty?
        msg << "\nUsage: \"#{banner(command).split("\n").join("\"\n       \"")}\""
        raise InvocationError, msg
      end

      # A flag that makes the process exit with status 1 if any error happens.
      def exit_on_failure?
        Bundler::Thor.deprecation_warning "Bundler::Thor exit with status 0 on errors. To keep this behavior, you must define `exit_on_failure?` in `#{self.name}`"
        false
      end

    protected

      # Prints the class options per group. If an option does not belong to
      # any group, it's printed as Class option.
      #
      def class_options_help(shell, groups = {}) #:nodoc:
        # Group options by group
        class_options.each do |_, value|
          groups[value.group] ||= []
          groups[value.group] << value
        end

        # Deal with default group
        global_options = groups.delete(nil) || []
        print_options(shell, global_options)

        # Print all others
        groups.each do |group_name, options|
          print_options(shell, options, group_name)
        end
      end

      # Receives a set of options and print them.
      def print_options(shell, options, group_name = nil)
        return if options.empty?

        list = []
        padding = options.map { |o| o.aliases.size }.max.to_i * 4

        options.each do |option|
          next if option.hide
          item = [option.usage(padding)]
          item.push(option.description ? "# #{option.description}" : "")

          list << item
          list << ["", "# Default: #{option.default}"] if option.show_default?
          list << ["", "# Possible values: #{option.enum.join(', ')}"] if option.enum
        end

        shell.say(group_name ? "#{group_name} options:" : "Options:")
        shell.print_table(list, :indent => 2)
        shell.say ""
      end

      # Raises an error if the word given is a Bundler::Thor reserved word.
      def is_thor_reserved_word?(word, type) #:nodoc:
        return false unless THOR_RESERVED_WORDS.include?(word.to_s)
        raise "#{word.inspect} is a Bundler::Thor reserved word and cannot be defined as #{type}"
      end

      # Build an option and adds it to the given scope.
      #
      # ==== Parameters
      # name<Symbol>:: The name of the argument.
      # options<Hash>:: Described in both class_option and method_option.
      # scope<Hash>:: Options hash that is being built up
      def build_option(name, options, scope) #:nodoc:
        scope[name] = Bundler::Thor::Option.new(name, {:check_default_type => check_default_type}.merge!(options))
      end

      # Receives a hash of options, parse them and add to the scope. This is a
      # fast way to set a bunch of options:
      #
      #   build_options :foo => true, :bar => :required, :baz => :string
      #
      # ==== Parameters
      # Hash[Symbol => Object]
      def build_options(options, scope) #:nodoc:
        options.each do |key, value|
          scope[key] = Bundler::Thor::Option.parse(key, value)
        end
      end

      # Finds a command with the given name. If the command belongs to the current
      # class, just return it, otherwise dup it and add the fresh copy to the
      # current command hash.
      def find_and_refresh_command(name) #:nodoc:
        if commands[name.to_s]
          commands[name.to_s]
        elsif command = all_commands[name.to_s] # rubocop:disable AssignmentInCondition
          commands[name.to_s] = command.clone
        else
          raise ArgumentError, "You supplied :for => #{name.inspect}, but the command #{name.inspect} could not be found."
        end
      end
      alias_method :find_and_refresh_task, :find_and_refresh_command

      # Everytime someone inherits from a Bundler::Thor class, register the klass
      # and file into baseclass.
      def inherited(klass)
        super(klass)
        Bundler::Thor::Base.register_klass_file(klass)
        klass.instance_variable_set(:@no_commands, 0)
      end

      # Fire this callback whenever a method is added. Added methods are
      # tracked as commands by invoking the create_command method.
      def method_added(meth)
        super(meth)
        meth = meth.to_s

        if meth == "initialize"
          initialize_added
          return
        end

        # Return if it's not a public instance method
        return unless public_method_defined?(meth.to_sym)

        return if no_commands? || !create_command(meth)

        is_thor_reserved_word?(meth, :command)
        Bundler::Thor::Base.register_klass_file(self)
      end

      # Retrieves a value from superclass. If it reaches the baseclass,
      # returns default.
      def from_superclass(method, default = nil)
        if self == baseclass || !superclass.respond_to?(method, true)
          default
        else
          value = superclass.send(method)

          # Ruby implements `dup` on Object, but raises a `TypeError`
          # if the method is called on immediates. As a result, we
          # don't have a good way to check whether dup will succeed
          # without calling it and rescuing the TypeError.
          begin
            value.dup
          rescue TypeError
            value
          end

        end
      end

      #
      # The basename of the program invoking the thor class.
      #
      def basename
        File.basename($PROGRAM_NAME).split(" ").first
      end

      # SIGNATURE: Sets the baseclass. This is where the superclass lookup
      # finishes.
      def baseclass #:nodoc:
      end

      # SIGNATURE: Creates a new command if valid_command? is true. This method is
      # called when a new method is added to the class.
      def create_command(meth) #:nodoc:
      end
      alias_method :create_task, :create_command

      # SIGNATURE: Defines behavior when the initialize method is added to the
      # class.
      def initialize_added #:nodoc:
      end

      # SIGNATURE: The hook invoked by start.
      def dispatch(command, given_args, given_opts, config) #:nodoc:
        raise NotImplementedError
      end
    end
  end
end
PK}$[��LuvvHgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/rake_compat.rbnu�[���require "rake"
require "rake/dsl_definition"

class Bundler::Thor
  # Adds a compatibility layer to your Bundler::Thor classes which allows you to use
  # rake package tasks. For example, to use rspec rake tasks, one can do:
  #
  #   require 'bundler/vendor/thor/lib/thor/rake_compat'
  #   require 'rspec/core/rake_task'
  #
  #   class Default < Bundler::Thor
  #     include Bundler::Thor::RakeCompat
  #
  #     RSpec::Core::RakeTask.new(:spec) do |t|
  #       t.spec_opts = ['--options', './.rspec']
  #       t.spec_files = FileList['spec/**/*_spec.rb']
  #     end
  #   end
  #
  module RakeCompat
    include Rake::DSL if defined?(Rake::DSL)

    def self.rake_classes
      @rake_classes ||= []
    end

    def self.included(base)
      super(base)
      # Hack. Make rakefile point to invoker, so rdoc task is generated properly.
      rakefile = File.basename(caller[0].match(/(.*):\d+/)[1])
      Rake.application.instance_variable_set(:@rakefile, rakefile)
      rake_classes << base
    end
  end
end

# override task on (main), for compatibility with Rake 0.9
instance_eval do
  alias rake_namespace namespace

  def task(*)
    task = super

    if klass = Bundler::Thor::RakeCompat.rake_classes.last # rubocop:disable AssignmentInCondition
      non_namespaced_name = task.name.split(":").last

      description = non_namespaced_name
      description << task.arg_names.map { |n| n.to_s.upcase }.join(" ")
      description.strip!

      klass.desc description, Rake.application.last_description || non_namespaced_name
      Rake.application.last_description = nil
      klass.send :define_method, non_namespaced_name do |*args|
        Rake::Task[task.name.to_sym].invoke(*args)
      end
    end

    task
  end

  def namespace(name)
    if klass = Bundler::Thor::RakeCompat.rake_classes.last # rubocop:disable AssignmentInCondition
      const_name = Bundler::Thor::Util.camel_case(name.to_s).to_sym
      klass.const_set(const_name, Class.new(Bundler::Thor))
      new_klass = klass.const_get(const_name)
      Bundler::Thor::RakeCompat.rake_classes << new_klass
    end

    super
    Bundler::Thor::RakeCompat.rake_classes.pop
  end
end
PK}$[u���		bgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rbnu�[���class Bundler::Thor
  module CoreExt #:nodoc:
    # A hash with indifferent access and magic predicates.
    #
    #   hash = Bundler::Thor::CoreExt::HashWithIndifferentAccess.new 'foo' => 'bar', 'baz' => 'bee', 'force' => true
    #
    #   hash[:foo]  #=> 'bar'
    #   hash['foo'] #=> 'bar'
    #   hash.foo?   #=> true
    #
    class HashWithIndifferentAccess < ::Hash #:nodoc:
      def initialize(hash = {})
        super()
        hash.each do |key, value|
          self[convert_key(key)] = value
        end
      end

      def [](key)
        super(convert_key(key))
      end

      def []=(key, value)
        super(convert_key(key), value)
      end

      def delete(key)
        super(convert_key(key))
      end

      def except(*keys)
        dup.tap do |hash|
          keys.each { |key| hash.delete(convert_key(key)) }
        end
      end

      def fetch(key, *args)
        super(convert_key(key), *args)
      end

      def key?(key)
        super(convert_key(key))
      end

      def values_at(*indices)
        indices.map { |key| self[convert_key(key)] }
      end

      def merge(other)
        dup.merge!(other)
      end

      def merge!(other)
        other.each do |key, value|
          self[convert_key(key)] = value
        end
        self
      end

      def reverse_merge(other)
        self.class.new(other).merge(self)
      end

      def reverse_merge!(other_hash)
        replace(reverse_merge(other_hash))
      end

      def replace(other_hash)
        super(other_hash)
      end

      # Convert to a Hash with String keys.
      def to_hash
        Hash.new(default).merge!(self)
      end

    protected

      def convert_key(key)
        key.is_a?(Symbol) ? key.to_s : key
      end

      # Magic predicates. For instance:
      #
      #   options.force?                  # => !!options['force']
      #   options.shebang                 # => "/usr/lib/local/ruby"
      #   options.test_framework?(:rspec) # => options[:test_framework] == :rspec
      #
      def method_missing(method, *args)
        method = method.to_s
        if method =~ /^(\w+)\?$/
          if args.empty?
            !!self[$1]
          else
            self[$1] == args.first
          end
        else
          self[method]
        end
      end
    end
  end
end
PK}$[(��_b'b'Cgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/runner.rbnu�[���require_relative "../thor"
require_relative "group"

require "yaml"
require "digest/md5"
require "pathname"

class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLength
  autoload :OpenURI, "open-uri"

  map "-T" => :list, "-i" => :install, "-u" => :update, "-v" => :version

  def self.banner(command, all = false, subcommand = false)
    "thor " + command.formatted_usage(self, all, subcommand)
  end

  def self.exit_on_failure?
    true
  end

  # Override Bundler::Thor#help so it can give information about any class and any method.
  #
  def help(meth = nil)
    if meth && !respond_to?(meth)
      initialize_thorfiles(meth)
      klass, command = Bundler::Thor::Util.find_class_and_command_by_namespace(meth)
      self.class.handle_no_command_error(command, false) if klass.nil?
      klass.start(["-h", command].compact, :shell => shell)
    else
      super
    end
  end

  # If a command is not found on Bundler::Thor::Runner, method missing is invoked and
  # Bundler::Thor::Runner is then responsible for finding the command in all classes.
  #
  def method_missing(meth, *args)
    meth = meth.to_s
    initialize_thorfiles(meth)
    klass, command = Bundler::Thor::Util.find_class_and_command_by_namespace(meth)
    self.class.handle_no_command_error(command, false) if klass.nil?
    args.unshift(command) if command
    klass.start(args, :shell => shell)
  end

  desc "install NAME", "Install an optionally named Bundler::Thor file into your system commands"
  method_options :as => :string, :relative => :boolean, :force => :boolean
  def install(name) # rubocop:disable MethodLength
    initialize_thorfiles

    # If a directory name is provided as the argument, look for a 'main.thor'
    # command in said directory.
    begin
      if File.directory?(File.expand_path(name))
        base = File.join(name, "main.thor")
        package = :directory
        contents = open(base, &:read)
      else
        base = name
        package = :file
        contents = open(name, &:read)
      end
    rescue OpenURI::HTTPError
      raise Error, "Error opening URI '#{name}'"
    rescue Errno::ENOENT
      raise Error, "Error opening file '#{name}'"
    end

    say "Your Thorfile contains:"
    say contents

    unless options["force"]
      return false if no?("Do you wish to continue [y/N]?")
    end

    as = options["as"] || begin
      first_line = contents.split("\n")[0]
      (match = first_line.match(/\s*#\s*module:\s*([^\n]*)/)) ? match[1].strip : nil
    end

    unless as
      basename = File.basename(name)
      as = ask("Please specify a name for #{name} in the system repository [#{basename}]:")
      as = basename if as.empty?
    end

    location = if options[:relative] || name =~ %r{^https?://}
      name
    else
      File.expand_path(name)
    end

    thor_yaml[as] = {
      :filename   => Digest::MD5.hexdigest(name + as),
      :location   => location,
      :namespaces => Bundler::Thor::Util.namespaces_in_content(contents, base)
    }

    save_yaml(thor_yaml)
    say "Storing thor file in your system repository"
    destination = File.join(thor_root, thor_yaml[as][:filename])

    if package == :file
      File.open(destination, "w") { |f| f.puts contents }
    else
      require "fileutils"
      FileUtils.cp_r(name, destination)
    end

    thor_yaml[as][:filename] # Indicate success
  end

  desc "version", "Show Bundler::Thor version"
  def version
    require_relative "version"
    say "Bundler::Thor #{Bundler::Thor::VERSION}"
  end

  desc "uninstall NAME", "Uninstall a named Bundler::Thor module"
  def uninstall(name)
    raise Error, "Can't find module '#{name}'" unless thor_yaml[name]
    say "Uninstalling #{name}."
    require "fileutils"
    FileUtils.rm_rf(File.join(thor_root, (thor_yaml[name][:filename]).to_s))

    thor_yaml.delete(name)
    save_yaml(thor_yaml)

    puts "Done."
  end

  desc "update NAME", "Update a Bundler::Thor file from its original location"
  def update(name)
    raise Error, "Can't find module '#{name}'" if !thor_yaml[name] || !thor_yaml[name][:location]

    say "Updating '#{name}' from #{thor_yaml[name][:location]}"

    old_filename = thor_yaml[name][:filename]
    self.options = options.merge("as" => name)

    if File.directory? File.expand_path(name)
      require "fileutils"
      FileUtils.rm_rf(File.join(thor_root, old_filename))

      thor_yaml.delete(old_filename)
      save_yaml(thor_yaml)

      filename = install(name)
    else
      filename = install(thor_yaml[name][:location])
    end

    File.delete(File.join(thor_root, old_filename)) unless filename == old_filename
  end

  desc "installed", "List the installed Bundler::Thor modules and commands"
  method_options :internal => :boolean
  def installed
    initialize_thorfiles(nil, true)
    display_klasses(true, options["internal"])
  end

  desc "list [SEARCH]", "List the available thor commands (--substring means .*SEARCH)"
  method_options :substring => :boolean, :group => :string, :all => :boolean, :debug => :boolean
  def list(search = "")
    initialize_thorfiles

    search = ".*#{search}" if options["substring"]
    search = /^#{search}.*/i
    group  = options[:group] || "standard"

    klasses = Bundler::Thor::Base.subclasses.select do |k|
      (options[:all] || k.group == group) && k.namespace =~ search
    end

    display_klasses(false, false, klasses)
  end

private

  def thor_root
    Bundler::Thor::Util.thor_root
  end

  def thor_yaml
    @thor_yaml ||= begin
      yaml_file = File.join(thor_root, "thor.yml")
      yaml = YAML.load_file(yaml_file) if File.exist?(yaml_file)
      yaml || {}
    end
  end

  # Save the yaml file. If none exists in thor root, creates one.
  #
  def save_yaml(yaml)
    yaml_file = File.join(thor_root, "thor.yml")

    unless File.exist?(yaml_file)
      require "fileutils"
      FileUtils.mkdir_p(thor_root)
      yaml_file = File.join(thor_root, "thor.yml")
      FileUtils.touch(yaml_file)
    end

    File.open(yaml_file, "w") { |f| f.puts yaml.to_yaml }
  end

  # Load the Thorfiles. If relevant_to is supplied, looks for specific files
  # in the thor_root instead of loading them all.
  #
  # By default, it also traverses the current path until find Bundler::Thor files, as
  # described in thorfiles. This look up can be skipped by supplying
  # skip_lookup true.
  #
  def initialize_thorfiles(relevant_to = nil, skip_lookup = false)
    thorfiles(relevant_to, skip_lookup).each do |f|
      Bundler::Thor::Util.load_thorfile(f, nil, options[:debug]) unless Bundler::Thor::Base.subclass_files.keys.include?(File.expand_path(f))
    end
  end

  # Finds Thorfiles by traversing from your current directory down to the root
  # directory of your system. If at any time we find a Bundler::Thor file, we stop.
  #
  # We also ensure that system-wide Thorfiles are loaded first, so local
  # Thorfiles can override them.
  #
  # ==== Example
  #
  # If we start at /Users/wycats/dev/thor ...
  #
  # 1. /Users/wycats/dev/thor
  # 2. /Users/wycats/dev
  # 3. /Users/wycats <-- we find a Thorfile here, so we stop
  #
  # Suppose we start at c:\Documents and Settings\james\dev\thor ...
  #
  # 1. c:\Documents and Settings\james\dev\thor
  # 2. c:\Documents and Settings\james\dev
  # 3. c:\Documents and Settings\james
  # 4. c:\Documents and Settings
  # 5. c:\ <-- no Thorfiles found!
  #
  def thorfiles(relevant_to = nil, skip_lookup = false)
    thorfiles = []

    unless skip_lookup
      Pathname.pwd.ascend do |path|
        thorfiles = Bundler::Thor::Util.globs_for(path).map { |g| Dir[g] }.flatten
        break unless thorfiles.empty?
      end
    end

    files  = (relevant_to ? thorfiles_relevant_to(relevant_to) : Bundler::Thor::Util.thor_root_glob)
    files += thorfiles
    files -= ["#{thor_root}/thor.yml"]

    files.map! do |file|
      File.directory?(file) ? File.join(file, "main.thor") : file
    end
  end

  # Load Thorfiles relevant to the given method. If you provide "foo:bar" it
  # will load all thor files in the thor.yaml that has "foo" e "foo:bar"
  # namespaces registered.
  #
  def thorfiles_relevant_to(meth)
    lookup = [meth, meth.split(":")[0...-1].join(":")]

    files = thor_yaml.select do |_, v|
      v[:namespaces] && !(v[:namespaces] & lookup).empty?
    end

    files.map { |_, v| File.join(thor_root, (v[:filename]).to_s) }
  end

  # Display information about the given klasses. If with_module is given,
  # it shows a table with information extracted from the yaml file.
  #
  def display_klasses(with_modules = false, show_internal = false, klasses = Bundler::Thor::Base.subclasses)
    klasses -= [Bundler::Thor, Bundler::Thor::Runner, Bundler::Thor::Group] unless show_internal

    raise Error, "No Bundler::Thor commands available" if klasses.empty?
    show_modules if with_modules && !thor_yaml.empty?

    list = Hash.new { |h, k| h[k] = [] }
    groups = klasses.select { |k| k.ancestors.include?(Bundler::Thor::Group) }

    # Get classes which inherit from Bundler::Thor
    (klasses - groups).each { |k| list[k.namespace.split(":").first] += k.printable_commands(false) }

    # Get classes which inherit from Bundler::Thor::Base
    groups.map! { |k| k.printable_commands(false).first }
    list["root"] = groups

    # Order namespaces with default coming first
    list = list.sort { |a, b| a[0].sub(/^default/, "") <=> b[0].sub(/^default/, "") }
    list.each { |n, commands| display_commands(n, commands) unless commands.empty? }
  end

  def display_commands(namespace, list) #:nodoc:
    list.sort! { |a, b| a[0] <=> b[0] }

    say shell.set_color(namespace, :blue, true)
    say "-" * namespace.size

    print_table(list, :truncate => true)
    say
  end
  alias_method :display_tasks, :display_commands

  def show_modules #:nodoc:
    info = []
    labels = %w(Modules Namespaces)

    info << labels
    info << ["-" * labels[0].size, "-" * labels[1].size]

    thor_yaml.each do |name, hash|
      info << [name, hash[:namespaces].join(", ")]
    end

    print_table info
    say ""
  end
end
PK}$[��홇�Hgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/line_editor.rbnu�[���require_relative "line_editor/basic"
require_relative "line_editor/readline"

class Bundler::Thor
  module LineEditor
    def self.readline(prompt, options = {})
      best_available.new(prompt, options).readline
    end

    def self.best_available
      [
        Bundler::Thor::LineEditor::Readline,
        Bundler::Thor::LineEditor::Basic
      ].detect(&:available?)
    end
  end
end
PK}$[_-[�IIGgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/invocation.rbnu�[���class Bundler::Thor
  module Invocation
    def self.included(base) #:nodoc:
      super(base)
      base.extend ClassMethods
    end

    module ClassMethods
      # This method is responsible for receiving a name and find the proper
      # class and command for it. The key is an optional parameter which is
      # available only in class methods invocations (i.e. in Bundler::Thor::Group).
      def prepare_for_invocation(key, name) #:nodoc:
        case name
        when Symbol, String
          Bundler::Thor::Util.find_class_and_command_by_namespace(name.to_s, !key)
        else
          name
        end
      end
    end

    # Make initializer aware of invocations and the initialization args.
    def initialize(args = [], options = {}, config = {}, &block) #:nodoc:
      @_invocations = config[:invocations] || Hash.new { |h, k| h[k] = [] }
      @_initializer = [args, options, config]
      super
    end

    # Make the current command chain accessible with in a Bundler::Thor-(sub)command
    def current_command_chain
      @_invocations.values.flatten.map(&:to_sym)
    end

    # Receives a name and invokes it. The name can be a string (either "command" or
    # "namespace:command"), a Bundler::Thor::Command, a Class or a Bundler::Thor instance. If the
    # command cannot be guessed by name, it can also be supplied as second argument.
    #
    # You can also supply the arguments, options and configuration values for
    # the command to be invoked, if none is given, the same values used to
    # initialize the invoker are used to initialize the invoked.
    #
    # When no name is given, it will invoke the default command of the current class.
    #
    # ==== Examples
    #
    #   class A < Bundler::Thor
    #     def foo
    #       invoke :bar
    #       invoke "b:hello", ["Erik"]
    #     end
    #
    #     def bar
    #       invoke "b:hello", ["Erik"]
    #     end
    #   end
    #
    #   class B < Bundler::Thor
    #     def hello(name)
    #       puts "hello #{name}"
    #     end
    #   end
    #
    # You can notice that the method "foo" above invokes two commands: "bar",
    # which belongs to the same class and "hello" which belongs to the class B.
    #
    # By using an invocation system you ensure that a command is invoked only once.
    # In the example above, invoking "foo" will invoke "b:hello" just once, even
    # if it's invoked later by "bar" method.
    #
    # When class A invokes class B, all arguments used on A initialization are
    # supplied to B. This allows lazy parse of options. Let's suppose you have
    # some rspec commands:
    #
    #   class Rspec < Bundler::Thor::Group
    #     class_option :mock_framework, :type => :string, :default => :rr
    #
    #     def invoke_mock_framework
    #       invoke "rspec:#{options[:mock_framework]}"
    #     end
    #   end
    #
    # As you noticed, it invokes the given mock framework, which might have its
    # own options:
    #
    #   class Rspec::RR < Bundler::Thor::Group
    #     class_option :style, :type => :string, :default => :mock
    #   end
    #
    # Since it's not rspec concern to parse mock framework options, when RR
    # is invoked all options are parsed again, so RR can extract only the options
    # that it's going to use.
    #
    # If you want Rspec::RR to be initialized with its own set of options, you
    # have to do that explicitly:
    #
    #   invoke "rspec:rr", [], :style => :foo
    #
    # Besides giving an instance, you can also give a class to invoke:
    #
    #   invoke Rspec::RR, [], :style => :foo
    #
    def invoke(name = nil, *args)
      if name.nil?
        warn "[Bundler::Thor] Calling invoke() without argument is deprecated. Please use invoke_all instead.\n#{caller.join("\n")}"
        return invoke_all
      end

      args.unshift(nil) if args.first.is_a?(Array) || args.first.nil?
      command, args, opts, config = args

      klass, command = _retrieve_class_and_command(name, command)
      raise "Missing Bundler::Thor class for invoke #{name}" unless klass
      raise "Expected Bundler::Thor class, got #{klass}" unless klass <= Bundler::Thor::Base

      args, opts, config = _parse_initialization_options(args, opts, config)
      klass.send(:dispatch, command, args, opts, config) do |instance|
        instance.parent_options = options
      end
    end

    # Invoke the given command if the given args.
    def invoke_command(command, *args) #:nodoc:
      current = @_invocations[self.class]

      unless current.include?(command.name)
        current << command.name
        command.run(self, *args)
      end
    end
    alias_method :invoke_task, :invoke_command

    # Invoke all commands for the current instance.
    def invoke_all #:nodoc:
      self.class.all_commands.map { |_, command| invoke_command(command) }
    end

    # Invokes using shell padding.
    def invoke_with_padding(*args)
      with_padding { invoke(*args) }
    end

  protected

    # Configuration values that are shared between invocations.
    def _shared_configuration #:nodoc:
      {:invocations => @_invocations}
    end

    # This method simply retrieves the class and command to be invoked.
    # If the name is nil or the given name is a command in the current class,
    # use the given name and return self as class. Otherwise, call
    # prepare_for_invocation in the current class.
    def _retrieve_class_and_command(name, sent_command = nil) #:nodoc:
      if name.nil?
        [self.class, nil]
      elsif self.class.all_commands[name.to_s]
        [self.class, name.to_s]
      else
        klass, command = self.class.prepare_for_invocation(nil, name)
        [klass, command || sent_command]
      end
    end
    alias_method :_retrieve_class_and_task, :_retrieve_class_and_command

    # Initialize klass using values stored in the @_initializer.
    def _parse_initialization_options(args, opts, config) #:nodoc:
      stored_args, stored_opts, stored_config = @_initializer

      args ||= stored_args.dup
      opts ||= stored_opts.dup

      config ||= {}
      config = stored_config.merge(_shared_configuration).merge!(config)

      [args, opts, config]
    end
  end
end
PK}$[�Le1	1	Bgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/shell.rbnu�[���require "rbconfig"

class Bundler::Thor
  module Base
    class << self
      attr_writer :shell

      # Returns the shell used in all Bundler::Thor classes. If you are in a Unix platform
      # it will use a colored log, otherwise it will use a basic one without color.
      #
      def shell
        @shell ||= if ENV["THOR_SHELL"] && !ENV["THOR_SHELL"].empty?
          Bundler::Thor::Shell.const_get(ENV["THOR_SHELL"])
        elsif RbConfig::CONFIG["host_os"] =~ /mswin|mingw/ && !ENV["ANSICON"]
          Bundler::Thor::Shell::Basic
        else
          Bundler::Thor::Shell::Color
        end
      end
    end
  end

  module Shell
    SHELL_DELEGATED_METHODS = [:ask, :error, :set_color, :yes?, :no?, :say, :say_error, :say_status, :print_in_columns, :print_table, :print_wrapped, :file_collision, :terminal_width]
    attr_writer :shell

    autoload :Basic, File.expand_path("shell/basic", __dir__)
    autoload :Color, File.expand_path("shell/color", __dir__)
    autoload :HTML,  File.expand_path("shell/html", __dir__)

    # Add shell to initialize config values.
    #
    # ==== Configuration
    # shell<Object>:: An instance of the shell to be used.
    #
    # ==== Examples
    #
    #   class MyScript < Bundler::Thor
    #     argument :first, :type => :numeric
    #   end
    #
    #   MyScript.new [1.0], { :foo => :bar }, :shell => Bundler::Thor::Shell::Basic.new
    #
    def initialize(args = [], options = {}, config = {})
      super
      self.shell = config[:shell]
      shell.base ||= self if shell.respond_to?(:base)
    end

    # Holds the shell for the given Bundler::Thor instance. If no shell is given,
    # it gets a default shell from Bundler::Thor::Base.shell.
    def shell
      @shell ||= Bundler::Thor::Base.shell.new
    end

    # Common methods that are delegated to the shell.
    SHELL_DELEGATED_METHODS.each do |method|
      module_eval <<-METHOD, __FILE__, __LINE__ + 1
        def #{method}(*args,&block)
          shell.#{method}(*args,&block)
        end
      METHOD
    end

    # Yields the given block with padding.
    def with_padding
      shell.padding += 1
      yield
    ensure
      shell.padding -= 1
    end

  protected

    # Allow shell to be shared between invocations.
    #
    def _shared_configuration #:nodoc:
      super.merge!(:shell => shell)
    end
  end
end
PK}$[.����Ggems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/shell/html.rbnu�[���require_relative "basic"

class Bundler::Thor
  module Shell
    # Inherit from Bundler::Thor::Shell::Basic and add set_color behavior. Check
    # Bundler::Thor::Shell::Basic to see all available methods.
    #
    class HTML < Basic
      # The start of an HTML bold sequence.
      BOLD       = "font-weight: bold"

      # Set the terminal's foreground HTML color to black.
      BLACK      = "color: black"
      # Set the terminal's foreground HTML color to red.
      RED        = "color: red"
      # Set the terminal's foreground HTML color to green.
      GREEN      = "color: green"
      # Set the terminal's foreground HTML color to yellow.
      YELLOW     = "color: yellow"
      # Set the terminal's foreground HTML color to blue.
      BLUE       = "color: blue"
      # Set the terminal's foreground HTML color to magenta.
      MAGENTA    = "color: magenta"
      # Set the terminal's foreground HTML color to cyan.
      CYAN       = "color: cyan"
      # Set the terminal's foreground HTML color to white.
      WHITE      = "color: white"

      # Set the terminal's background HTML color to black.
      ON_BLACK   = "background-color: black"
      # Set the terminal's background HTML color to red.
      ON_RED     = "background-color: red"
      # Set the terminal's background HTML color to green.
      ON_GREEN   = "background-color: green"
      # Set the terminal's background HTML color to yellow.
      ON_YELLOW  = "background-color: yellow"
      # Set the terminal's background HTML color to blue.
      ON_BLUE    = "background-color: blue"
      # Set the terminal's background HTML color to magenta.
      ON_MAGENTA = "background-color: magenta"
      # Set the terminal's background HTML color to cyan.
      ON_CYAN    = "background-color: cyan"
      # Set the terminal's background HTML color to white.
      ON_WHITE   = "background-color: white"

      # Set color by using a string or one of the defined constants. If a third
      # option is set to true, it also adds bold to the string. This is based
      # on Highline implementation and it automatically appends CLEAR to the end
      # of the returned String.
      #
      def set_color(string, *colors)
        if colors.all? { |color| color.is_a?(Symbol) || color.is_a?(String) }
          html_colors = colors.map { |color| lookup_color(color) }
          "<span style=\"#{html_colors.join('; ')};\">#{Bundler::Thor::Util.escape_html(string)}</span>"
        else
          color, bold = colors
          html_color = self.class.const_get(color.to_s.upcase) if color.is_a?(Symbol)
          styles = [html_color]
          styles << BOLD if bold
          "<span style=\"#{styles.join('; ')};\">#{Bundler::Thor::Util.escape_html(string)}</span>"
        end
      end

      # Ask something to the user and receives a response.
      #
      # ==== Example
      # ask("What is your name?")
      #
      # TODO: Implement #ask for Bundler::Thor::Shell::HTML
      def ask(statement, color = nil)
        raise NotImplementedError, "Implement #ask for Bundler::Thor::Shell::HTML"
      end

    protected

      def can_display_colors?
        true
      end

      # Overwrite show_diff to show diff with colors if Diff::LCS is
      # available.
      #
      def show_diff(destination, content) #:nodoc:
        if diff_lcs_loaded? && ENV["THOR_DIFF"].nil? && ENV["RAILS_DIFF"].nil?
          actual  = File.binread(destination).to_s.split("\n")
          content = content.to_s.split("\n")

          Diff::LCS.sdiff(actual, content).each do |diff|
            output_diff_line(diff)
          end
        else
          super
        end
      end

      def output_diff_line(diff) #:nodoc:
        case diff.action
        when "-"
          say "- #{diff.old_element.chomp}", :red, true
        when "+"
          say "+ #{diff.new_element.chomp}", :green, true
        when "!"
          say "- #{diff.old_element.chomp}", :red, true
          say "+ #{diff.new_element.chomp}", :green, true
        else
          say "  #{diff.old_element.chomp}", nil, true
        end
      end

      # Check if Diff::LCS is loaded. If it is, use it to create pretty output
      # for diff.
      #
      def diff_lcs_loaded? #:nodoc:
        return true if defined?(Diff::LCS)
        return @diff_lcs_loaded unless @diff_lcs_loaded.nil?

        @diff_lcs_loaded = begin
          require "diff/lcs"
          true
        rescue LoadError
          false
        end
      end
    end
  end
end
PK}$[1�UyXXHgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/shell/color.rbnu�[���require_relative "basic"

class Bundler::Thor
  module Shell
    # Inherit from Bundler::Thor::Shell::Basic and add set_color behavior. Check
    # Bundler::Thor::Shell::Basic to see all available methods.
    #
    class Color < Basic
      # Embed in a String to clear all previous ANSI sequences.
      CLEAR      = "\e[0m"
      # The start of an ANSI bold sequence.
      BOLD       = "\e[1m"

      # Set the terminal's foreground ANSI color to black.
      BLACK      = "\e[30m"
      # Set the terminal's foreground ANSI color to red.
      RED        = "\e[31m"
      # Set the terminal's foreground ANSI color to green.
      GREEN      = "\e[32m"
      # Set the terminal's foreground ANSI color to yellow.
      YELLOW     = "\e[33m"
      # Set the terminal's foreground ANSI color to blue.
      BLUE       = "\e[34m"
      # Set the terminal's foreground ANSI color to magenta.
      MAGENTA    = "\e[35m"
      # Set the terminal's foreground ANSI color to cyan.
      CYAN       = "\e[36m"
      # Set the terminal's foreground ANSI color to white.
      WHITE      = "\e[37m"

      # Set the terminal's background ANSI color to black.
      ON_BLACK   = "\e[40m"
      # Set the terminal's background ANSI color to red.
      ON_RED     = "\e[41m"
      # Set the terminal's background ANSI color to green.
      ON_GREEN   = "\e[42m"
      # Set the terminal's background ANSI color to yellow.
      ON_YELLOW  = "\e[43m"
      # Set the terminal's background ANSI color to blue.
      ON_BLUE    = "\e[44m"
      # Set the terminal's background ANSI color to magenta.
      ON_MAGENTA = "\e[45m"
      # Set the terminal's background ANSI color to cyan.
      ON_CYAN    = "\e[46m"
      # Set the terminal's background ANSI color to white.
      ON_WHITE   = "\e[47m"

      # Set color by using a string or one of the defined constants. If a third
      # option is set to true, it also adds bold to the string. This is based
      # on Highline implementation and it automatically appends CLEAR to the end
      # of the returned String.
      #
      # Pass foreground, background and bold options to this method as
      # symbols.
      #
      # Example:
      #
      #   set_color "Hi!", :red, :on_white, :bold
      #
      # The available colors are:
      #
      #   :bold
      #   :black
      #   :red
      #   :green
      #   :yellow
      #   :blue
      #   :magenta
      #   :cyan
      #   :white
      #   :on_black
      #   :on_red
      #   :on_green
      #   :on_yellow
      #   :on_blue
      #   :on_magenta
      #   :on_cyan
      #   :on_white
      def set_color(string, *colors)
        if colors.compact.empty? || !can_display_colors?
          string
        elsif colors.all? { |color| color.is_a?(Symbol) || color.is_a?(String) }
          ansi_colors = colors.map { |color| lookup_color(color) }
          "#{ansi_colors.join}#{string}#{CLEAR}"
        else
          # The old API was `set_color(color, bold=boolean)`. We
          # continue to support the old API because you should never
          # break old APIs unnecessarily :P
          foreground, bold = colors
          foreground = self.class.const_get(foreground.to_s.upcase) if foreground.is_a?(Symbol)

          bold       = bold ? BOLD : ""
          "#{bold}#{foreground}#{string}#{CLEAR}"
        end
      end

    protected

      def can_display_colors?
        are_colors_supported? && !are_colors_disabled?
      end

      def are_colors_supported?
        stdout.tty? && ENV["TERM"] != "dumb"
      end

      def are_colors_disabled?
        !ENV['NO_COLOR'].nil?
      end

      # Overwrite show_diff to show diff with colors if Diff::LCS is
      # available.
      #
      def show_diff(destination, content) #:nodoc:
        if diff_lcs_loaded? && ENV["THOR_DIFF"].nil? && ENV["RAILS_DIFF"].nil?
          actual  = File.binread(destination).to_s.split("\n")
          content = content.to_s.split("\n")

          Diff::LCS.sdiff(actual, content).each do |diff|
            output_diff_line(diff)
          end
        else
          super
        end
      end

      def output_diff_line(diff) #:nodoc:
        case diff.action
        when "-"
          say "- #{diff.old_element.chomp}", :red, true
        when "+"
          say "+ #{diff.new_element.chomp}", :green, true
        when "!"
          say "- #{diff.old_element.chomp}", :red, true
          say "+ #{diff.new_element.chomp}", :green, true
        else
          say "  #{diff.old_element.chomp}", nil, true
        end
      end

      # Check if Diff::LCS is loaded. If it is, use it to create pretty output
      # for diff.
      #
      def diff_lcs_loaded? #:nodoc:
        return true if defined?(Diff::LCS)
        return @diff_lcs_loaded unless @diff_lcs_loaded.nil?

        @diff_lcs_loaded = begin
          require "diff/lcs"
          true
        rescue LoadError
          false
        end
      end
    end
  end
end
PK}$[��W|Y<Y<Hgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/shell/basic.rbnu�[���class Bundler::Thor
  module Shell
    class Basic
      DEFAULT_TERMINAL_WIDTH = 80

      attr_accessor :base
      attr_reader   :padding

      # Initialize base, mute and padding to nil.
      #
      def initialize #:nodoc:
        @base = nil
        @mute = false
        @padding = 0
        @always_force = false
      end

      # Mute everything that's inside given block
      #
      def mute
        @mute = true
        yield
      ensure
        @mute = false
      end

      # Check if base is muted
      #
      def mute?
        @mute
      end

      # Sets the output padding, not allowing less than zero values.
      #
      def padding=(value)
        @padding = [0, value].max
      end

      # Sets the output padding while executing a block and resets it.
      #
      def indent(count = 1)
        orig_padding = padding
        self.padding = padding + count
        yield
        self.padding = orig_padding
      end

      # Asks something to the user and receives a response.
      #
      # If a default value is specified it will be presented to the user
      # and allows them to select that value with an empty response. This
      # option is ignored when limited answers are supplied.
      #
      # If asked to limit the correct responses, you can pass in an
      # array of acceptable answers.  If one of those is not supplied,
      # they will be shown a message stating that one of those answers
      # must be given and re-asked the question.
      #
      # If asking for sensitive information, the :echo option can be set
      # to false to mask user input from $stdin.
      #
      # If the required input is a path, then set the path option to
      # true. This will enable tab completion for file paths relative
      # to the current working directory on systems that support
      # Readline.
      #
      # ==== Example
      # ask("What is your name?")
      #
      # ask("What is the planet furthest from the sun?", :default => "Pluto")
      #
      # ask("What is your favorite Neopolitan flavor?", :limited_to => ["strawberry", "chocolate", "vanilla"])
      #
      # ask("What is your password?", :echo => false)
      #
      # ask("Where should the file be saved?", :path => true)
      #
      def ask(statement, *args)
        options = args.last.is_a?(Hash) ? args.pop : {}
        color = args.first

        if options[:limited_to]
          ask_filtered(statement, color, options)
        else
          ask_simply(statement, color, options)
        end
      end

      # Say (print) something to the user. If the sentence ends with a whitespace
      # or tab character, a new line is not appended (print + flush). Otherwise
      # are passed straight to puts (behavior got from Highline).
      #
      # ==== Example
      # say("I know you knew that.")
      #
      def say(message = "", color = nil, force_new_line = (message.to_s !~ /( |\t)\Z/))
        return if quiet?

        buffer = prepare_message(message, *color)
        buffer << "\n" if force_new_line && !message.to_s.end_with?("\n")

        stdout.print(buffer)
        stdout.flush
      end

      # Say (print) an error to the user. If the sentence ends with a whitespace
      # or tab character, a new line is not appended (print + flush). Otherwise
      # are passed straight to puts (behavior got from Highline).
      #
      # ==== Example
      # say_error("error: something went wrong")
      #
      def say_error(message = "", color = nil, force_new_line = (message.to_s !~ /( |\t)\Z/))
        return if quiet?

        buffer = prepare_message(message, *color)
        buffer << "\n" if force_new_line && !message.to_s.end_with?("\n")

        stderr.print(buffer)
        stderr.flush
      end

      # Say a status with the given color and appends the message. Since this
      # method is used frequently by actions, it allows nil or false to be given
      # in log_status, avoiding the message from being shown. If a Symbol is
      # given in log_status, it's used as the color.
      #
      def say_status(status, message, log_status = true)
        return if quiet? || log_status == false
        spaces = "  " * (padding + 1)
        status = status.to_s.rjust(12)
        margin = " " * status.length + spaces

        color  = log_status.is_a?(Symbol) ? log_status : :green
        status = set_color status, color, true if color

        message = message.to_s.chomp.gsub(/(?<!\A)^/, margin)
        buffer = "#{status}#{spaces}#{message}\n"

        stdout.print(buffer)
        stdout.flush
      end

      # Make a question the to user and returns true if the user replies "y" or
      # "yes".
      #
      def yes?(statement, color = nil)
        !!(ask(statement, color, :add_to_history => false) =~ is?(:yes))
      end

      # Make a question the to user and returns true if the user replies "n" or
      # "no".
      #
      def no?(statement, color = nil)
        !!(ask(statement, color, :add_to_history => false) =~ is?(:no))
      end

      # Prints values in columns
      #
      # ==== Parameters
      # Array[String, String, ...]
      #
      def print_in_columns(array)
        return if array.empty?
        colwidth = (array.map { |el| el.to_s.size }.max || 0) + 2
        array.each_with_index do |value, index|
          # Don't output trailing spaces when printing the last column
          if ((((index + 1) % (terminal_width / colwidth))).zero? && !index.zero?) || index + 1 == array.length
            stdout.puts value
          else
            stdout.printf("%-#{colwidth}s", value)
          end
        end
      end

      # Prints a table.
      #
      # ==== Parameters
      # Array[Array[String, String, ...]]
      #
      # ==== Options
      # indent<Integer>:: Indent the first column by indent value.
      # colwidth<Integer>:: Force the first column to colwidth spaces wide.
      #
      def print_table(array, options = {}) # rubocop:disable MethodLength
        return if array.empty?

        formats = []
        indent = options[:indent].to_i
        colwidth = options[:colwidth]
        options[:truncate] = terminal_width if options[:truncate] == true

        formats << "%-#{colwidth + 2}s".dup if colwidth
        start = colwidth ? 1 : 0

        colcount = array.max { |a, b| a.size <=> b.size }.size

        maximas = []

        start.upto(colcount - 1) do |index|
          maxima = array.map { |row| row[index] ? row[index].to_s.size : 0 }.max
          maximas << maxima
          formats << if index == colcount - 1
                       # Don't output 2 trailing spaces when printing the last column
                       "%-s".dup
                     else
                       "%-#{maxima + 2}s".dup
                     end
        end

        formats[0] = formats[0].insert(0, " " * indent)
        formats << "%s"

        array.each do |row|
          sentence = "".dup

          row.each_with_index do |column, index|
            maxima = maximas[index]

            f = if column.is_a?(Numeric)
              if index == row.size - 1
                # Don't output 2 trailing spaces when printing the last column
                "%#{maxima}s"
              else
                "%#{maxima}s  "
              end
            else
              formats[index]
            end
            sentence << f % column.to_s
          end

          sentence = truncate(sentence, options[:truncate]) if options[:truncate]
          stdout.puts sentence
        end
      end

      # Prints a long string, word-wrapping the text to the current width of the
      # terminal display. Ideal for printing heredocs.
      #
      # ==== Parameters
      # String
      #
      # ==== Options
      # indent<Integer>:: Indent each line of the printed paragraph by indent value.
      #
      def print_wrapped(message, options = {})
        indent = options[:indent] || 0
        width = terminal_width - indent
        paras = message.split("\n\n")

        paras.map! do |unwrapped|
          words = unwrapped.split(" ")
          counter = words.first.length
          words.inject do |memo, word|
            word = word.gsub(/\n\005/, "\n").gsub(/\005/, "\n")
            counter = 0 if word.include? "\n"
            if (counter + word.length + 1) < width
              memo = "#{memo} #{word}"
              counter += (word.length + 1)
            else
              memo = "#{memo}\n#{word}"
              counter = word.length
            end
            memo
          end
        end.compact!

        paras.each do |para|
          para.split("\n").each do |line|
            stdout.puts line.insert(0, " " * indent)
          end
          stdout.puts unless para == paras.last
        end
      end

      # Deals with file collision and returns true if the file should be
      # overwritten and false otherwise. If a block is given, it uses the block
      # response as the content for the diff.
      #
      # ==== Parameters
      # destination<String>:: the destination file to solve conflicts
      # block<Proc>:: an optional block that returns the value to be used in diff and merge
      #
      def file_collision(destination)
        return true if @always_force
        options = block_given? ? "[Ynaqdhm]" : "[Ynaqh]"

        loop do
          answer = ask(
            %[Overwrite #{destination}? (enter "h" for help) #{options}],
            :add_to_history => false
          )

          case answer
          when nil
            say ""
            return true
          when is?(:yes), is?(:force), ""
            return true
          when is?(:no), is?(:skip)
            return false
          when is?(:always)
            return @always_force = true
          when is?(:quit)
            say "Aborting..."
            raise SystemExit
          when is?(:diff)
            show_diff(destination, yield) if block_given?
            say "Retrying..."
          when is?(:merge)
            if block_given? && !merge_tool.empty?
              merge(destination, yield)
              return nil
            end

            say "Please specify merge tool to `THOR_MERGE` env."
          else
            say file_collision_help
          end
        end
      end

      # This code was copied from Rake, available under MIT-LICENSE
      # Copyright (c) 2003, 2004 Jim Weirich
      def terminal_width
        result = if ENV["THOR_COLUMNS"]
          ENV["THOR_COLUMNS"].to_i
        else
          unix? ? dynamic_width : DEFAULT_TERMINAL_WIDTH
        end
        result < 10 ? DEFAULT_TERMINAL_WIDTH : result
      rescue
        DEFAULT_TERMINAL_WIDTH
      end

      # Called if something goes wrong during the execution. This is used by Bundler::Thor
      # internally and should not be used inside your scripts. If something went
      # wrong, you can always raise an exception. If you raise a Bundler::Thor::Error, it
      # will be rescued and wrapped in the method below.
      #
      def error(statement)
        stderr.puts statement
      end

      # Apply color to the given string with optional bold. Disabled in the
      # Bundler::Thor::Shell::Basic class.
      #
      def set_color(string, *) #:nodoc:
        string
      end

    protected

      def prepare_message(message, *color)
        spaces = "  " * padding
        spaces + set_color(message.to_s, *color)
      end

      def can_display_colors?
        false
      end

      def lookup_color(color)
        return color unless color.is_a?(Symbol)
        self.class.const_get(color.to_s.upcase)
      end

      def stdout
        $stdout
      end

      def stderr
        $stderr
      end

      def is?(value) #:nodoc:
        value = value.to_s

        if value.size == 1
          /\A#{value}\z/i
        else
          /\A(#{value}|#{value[0, 1]})\z/i
        end
      end

      def file_collision_help #:nodoc:
        <<-HELP
        Y - yes, overwrite
        n - no, do not overwrite
        a - all, overwrite this and all others
        q - quit, abort
        d - diff, show the differences between the old and the new
        h - help, show this help
        m - merge, run merge tool
        HELP
      end

      def show_diff(destination, content) #:nodoc:
        diff_cmd = ENV["THOR_DIFF"] || ENV["RAILS_DIFF"] || "diff -u"

        require "tempfile"
        Tempfile.open(File.basename(destination), File.dirname(destination)) do |temp|
          temp.write content
          temp.rewind
          system %(#{diff_cmd} "#{destination}" "#{temp.path}")
        end
      end

      def quiet? #:nodoc:
        mute? || (base && base.options[:quiet])
      end

      # Calculate the dynamic width of the terminal
      def dynamic_width
        @dynamic_width ||= (dynamic_width_stty.nonzero? || dynamic_width_tput)
      end

      def dynamic_width_stty
        `stty size 2>/dev/null`.split[1].to_i
      end

      def dynamic_width_tput
        `tput cols 2>/dev/null`.to_i
      end

      def unix?
        RUBY_PLATFORM =~ /(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/i
      end

      def truncate(string, width)
        as_unicode do
          chars = string.chars.to_a
          if chars.length <= width
            chars.join
          else
            chars[0, width - 3].join + "..."
          end
        end
      end

      if "".respond_to?(:encode)
        def as_unicode
          yield
        end
      else
        def as_unicode
          old = $KCODE
          $KCODE = "U"
          yield
        ensure
          $KCODE = old
        end
      end

      def ask_simply(statement, color, options)
        default = options[:default]
        message = [statement, ("(#{default})" if default), nil].uniq.join(" ")
        message = prepare_message(message, *color)
        result = Bundler::Thor::LineEditor.readline(message, options)

        return unless result

        result = result.strip

        if default && result == ""
          default
        else
          result
        end
      end

      def ask_filtered(statement, color, options)
        answer_set = options[:limited_to]
        case_insensitive = options.fetch(:case_insensitive, false)
        correct_answer = nil
        until correct_answer
          answers = answer_set.join(", ")
          answer = ask_simply("#{statement} [#{answers}]", color, options)
          correct_answer = answer_match(answer_set, answer, case_insensitive)
          say("Your response must be one of: [#{answers}]. Please try again.") unless correct_answer
        end
        correct_answer
      end

      def answer_match(possibilities, answer, case_insensitive)
        if case_insensitive
          possibilities.detect{ |possibility| possibility.downcase == answer.downcase }
        else
          possibilities.detect{ |possibility| possibility == answer }
        end
      end

      def merge(destination, content) #:nodoc:
        require "tempfile"
        Tempfile.open([File.basename(destination), File.extname(destination)], File.dirname(destination)) do |temp|
          temp.write content
          temp.rewind
          system %(#{merge_tool} "#{temp.path}" "#{destination}")
        end
      end

      def merge_tool #:nodoc:
        @merge_tool ||= ENV["THOR_MERGE"] || git_merge_tool
      end

      def git_merge_tool #:nodoc:
        `git config merge.tool`.rstrip rescue ""
      end
    end
  end
end
PK}$[#I`i#i#Bgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/group.rbnu�[���require_relative "base"

# Bundler::Thor has a special class called Bundler::Thor::Group. The main difference to Bundler::Thor class
# is that it invokes all commands at once. It also include some methods that allows
# invocations to be done at the class method, which are not available to Bundler::Thor
# commands.
class Bundler::Thor::Group
  class << self
    # The description for this Bundler::Thor::Group. If none is provided, but a source root
    # exists, tries to find the USAGE one folder above it, otherwise searches
    # in the superclass.
    #
    # ==== Parameters
    # description<String>:: The description for this Bundler::Thor::Group.
    #
    def desc(description = nil)
      if description
        @desc = description
      else
        @desc ||= from_superclass(:desc, nil)
      end
    end

    # Prints help information.
    #
    # ==== Options
    # short:: When true, shows only usage.
    #
    def help(shell)
      shell.say "Usage:"
      shell.say "  #{banner}\n"
      shell.say
      class_options_help(shell)
      shell.say desc if desc
    end

    # Stores invocations for this class merging with superclass values.
    #
    def invocations #:nodoc:
      @invocations ||= from_superclass(:invocations, {})
    end

    # Stores invocation blocks used on invoke_from_option.
    #
    def invocation_blocks #:nodoc:
      @invocation_blocks ||= from_superclass(:invocation_blocks, {})
    end

    # Invoke the given namespace or class given. It adds an instance
    # method that will invoke the klass and command. You can give a block to
    # configure how it will be invoked.
    #
    # The namespace/class given will have its options showed on the help
    # usage. Check invoke_from_option for more information.
    #
    def invoke(*names, &block)
      options = names.last.is_a?(Hash) ? names.pop : {}
      verbose = options.fetch(:verbose, true)

      names.each do |name|
        invocations[name] = false
        invocation_blocks[name] = block if block_given?

        class_eval <<-METHOD, __FILE__, __LINE__ + 1
          def _invoke_#{name.to_s.gsub(/\W/, '_')}
            klass, command = self.class.prepare_for_invocation(nil, #{name.inspect})

            if klass
              say_status :invoke, #{name.inspect}, #{verbose.inspect}
              block = self.class.invocation_blocks[#{name.inspect}]
              _invoke_for_class_method klass, command, &block
            else
              say_status :error, %(#{name.inspect} [not found]), :red
            end
          end
        METHOD
      end
    end

    # Invoke a thor class based on the value supplied by the user to the
    # given option named "name". A class option must be created before this
    # method is invoked for each name given.
    #
    # ==== Examples
    #
    #   class GemGenerator < Bundler::Thor::Group
    #     class_option :test_framework, :type => :string
    #     invoke_from_option :test_framework
    #   end
    #
    # ==== Boolean options
    #
    # In some cases, you want to invoke a thor class if some option is true or
    # false. This is automatically handled by invoke_from_option. Then the
    # option name is used to invoke the generator.
    #
    # ==== Preparing for invocation
    #
    # In some cases you want to customize how a specified hook is going to be
    # invoked. You can do that by overwriting the class method
    # prepare_for_invocation. The class method must necessarily return a klass
    # and an optional command.
    #
    # ==== Custom invocations
    #
    # You can also supply a block to customize how the option is going to be
    # invoked. The block receives two parameters, an instance of the current
    # class and the klass to be invoked.
    #
    def invoke_from_option(*names, &block)
      options = names.last.is_a?(Hash) ? names.pop : {}
      verbose = options.fetch(:verbose, :white)

      names.each do |name|
        unless class_options.key?(name)
          raise ArgumentError, "You have to define the option #{name.inspect} " \
                              "before setting invoke_from_option."
        end

        invocations[name] = true
        invocation_blocks[name] = block if block_given?

        class_eval <<-METHOD, __FILE__, __LINE__ + 1
          def _invoke_from_option_#{name.to_s.gsub(/\W/, '_')}
            return unless options[#{name.inspect}]

            value = options[#{name.inspect}]
            value = #{name.inspect} if TrueClass === value
            klass, command = self.class.prepare_for_invocation(#{name.inspect}, value)

            if klass
              say_status :invoke, value, #{verbose.inspect}
              block = self.class.invocation_blocks[#{name.inspect}]
              _invoke_for_class_method klass, command, &block
            else
              say_status :error, %(\#{value} [not found]), :red
            end
          end
        METHOD
      end
    end

    # Remove a previously added invocation.
    #
    # ==== Examples
    #
    #   remove_invocation :test_framework
    #
    def remove_invocation(*names)
      names.each do |name|
        remove_command(name)
        remove_class_option(name)
        invocations.delete(name)
        invocation_blocks.delete(name)
      end
    end

    # Overwrite class options help to allow invoked generators options to be
    # shown recursively when invoking a generator.
    #
    def class_options_help(shell, groups = {}) #:nodoc:
      get_options_from_invocations(groups, class_options) do |klass|
        klass.send(:get_options_from_invocations, groups, class_options)
      end
      super(shell, groups)
    end

    # Get invocations array and merge options from invocations. Those
    # options are added to group_options hash. Options that already exists
    # in base_options are not added twice.
    #
    def get_options_from_invocations(group_options, base_options) #:nodoc: # rubocop:disable MethodLength
      invocations.each do |name, from_option|
        value = if from_option
          option = class_options[name]
          option.type == :boolean ? name : option.default
        else
          name
        end
        next unless value

        klass, _ = prepare_for_invocation(name, value)
        next unless klass && klass.respond_to?(:class_options)

        value = value.to_s
        human_name = value.respond_to?(:classify) ? value.classify : value

        group_options[human_name] ||= []
        group_options[human_name] += klass.class_options.values.select do |class_option|
          base_options[class_option.name.to_sym].nil? && class_option.group.nil? &&
            !group_options.values.flatten.any? { |i| i.name == class_option.name }
        end

        yield klass if block_given?
      end
    end

    # Returns commands ready to be printed.
    def printable_commands(*)
      item = []
      item << banner
      item << (desc ? "# #{desc.gsub(/\s+/m, ' ')}" : "")
      [item]
    end
    alias_method :printable_tasks, :printable_commands

    def handle_argument_error(command, error, _args, arity) #:nodoc:
      msg = "#{basename} #{command.name} takes #{arity} argument".dup
      msg << "s" if arity > 1
      msg << ", but it should not."
      raise error, msg
    end

  protected

    # The method responsible for dispatching given the args.
    def dispatch(command, given_args, given_opts, config) #:nodoc:
      if Bundler::Thor::HELP_MAPPINGS.include?(given_args.first)
        help(config[:shell])
        return
      end

      args, opts = Bundler::Thor::Options.split(given_args)
      opts = given_opts || opts

      instance = new(args, opts, config)
      yield instance if block_given?

      if command
        instance.invoke_command(all_commands[command])
      else
        instance.invoke_all
      end
    end

    # The banner for this class. You can customize it if you are invoking the
    # thor class by another ways which is not the Bundler::Thor::Runner.
    def banner
      "#{basename} #{self_command.formatted_usage(self, false)}"
    end

    # Represents the whole class as a command.
    def self_command #:nodoc:
      Bundler::Thor::DynamicCommand.new(namespace, class_options)
    end
    alias_method :self_task, :self_command

    def baseclass #:nodoc:
      Bundler::Thor::Group
    end

    def create_command(meth) #:nodoc:
      commands[meth.to_s] = Bundler::Thor::Command.new(meth, nil, nil, nil, nil)
      true
    end
    alias_method :create_task, :create_command
  end

  include Bundler::Thor::Base

protected

  # Shortcut to invoke with padding and block handling. Use internally by
  # invoke and invoke_from_option class methods.
  def _invoke_for_class_method(klass, command = nil, *args, &block) #:nodoc:
    with_padding do
      if block
        case block.arity
        when 3
          yield(self, klass, command)
        when 2
          yield(self, klass)
        when 1
          instance_exec(klass, &block)
        end
      else
        invoke klass, command, *args
      end
    end
  end
end
PK}$[ˤ��

Kgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/parser/options.rbnu�[���class Bundler::Thor
  class Options < Arguments #:nodoc: # rubocop:disable ClassLength
    LONG_RE     = /^(--\w+(?:-\w+)*)$/
    SHORT_RE    = /^(-[a-z])$/i
    EQ_RE       = /^(--\w+(?:-\w+)*|-[a-z])=(.*)$/i
    SHORT_SQ_RE = /^-([a-z]{2,})$/i # Allow either -x -v or -xv style for single char args
    SHORT_NUM   = /^(-[a-z])#{NUMERIC}$/i
    OPTS_END    = "--".freeze

    # Receives a hash and makes it switches.
    def self.to_switches(options)
      options.map do |key, value|
        case value
        when true
          "--#{key}"
        when Array
          "--#{key} #{value.map(&:inspect).join(' ')}"
        when Hash
          "--#{key} #{value.map { |k, v| "#{k}:#{v}" }.join(' ')}"
        when nil, false
          nil
        else
          "--#{key} #{value.inspect}"
        end
      end.compact.join(" ")
    end

    # Takes a hash of Bundler::Thor::Option and a hash with defaults.
    #
    # If +stop_on_unknown+ is true, #parse will stop as soon as it encounters
    # an unknown option or a regular argument.
    def initialize(hash_options = {}, defaults = {}, stop_on_unknown = false, disable_required_check = false)
      @stop_on_unknown = stop_on_unknown
      @disable_required_check = disable_required_check
      options = hash_options.values
      super(options)

      # Add defaults
      defaults.each do |key, value|
        @assigns[key.to_s] = value
        @non_assigned_required.delete(hash_options[key])
      end

      @shorts = {}
      @switches = {}
      @extra = []
      @stopped_parsing_after_extra_index = nil
      @is_treated_as_value = false

      options.each do |option|
        @switches[option.switch_name] = option

        option.aliases.each do |short|
          name = short.to_s.sub(/^(?!\-)/, "-")
          @shorts[name] ||= option.switch_name
        end
      end
    end

    def remaining
      @extra
    end

    def peek
      return super unless @parsing_options

      result = super
      if result == OPTS_END
        shift
        @parsing_options = false
        @stopped_parsing_after_extra_index ||= @extra.size
        super
      else
        result
      end
    end

    def shift
      @is_treated_as_value = false
      super
    end

    def unshift(arg, is_value: false)
      @is_treated_as_value = is_value
      super(arg)
    end

    def parse(args) # rubocop:disable MethodLength
      @pile = args.dup
      @is_treated_as_value = false
      @parsing_options = true

      while peek
        if parsing_options?
          match, is_switch = current_is_switch?
          shifted = shift

          if is_switch
            case shifted
            when SHORT_SQ_RE
              unshift($1.split("").map { |f| "-#{f}" })
              next
            when EQ_RE
              unshift($2, is_value: true)
              switch = $1
            when SHORT_NUM
              unshift($2)
              switch = $1
            when LONG_RE, SHORT_RE
              switch = $1
            end

            switch = normalize_switch(switch)
            option = switch_option(switch)
            result = parse_peek(switch, option)
            assign_result!(option, result)
          elsif @stop_on_unknown
            @parsing_options = false
            @extra << shifted
            @stopped_parsing_after_extra_index ||= @extra.size
            @extra << shift while peek
            break
          elsif match
            @extra << shifted
            @extra << shift while peek && peek !~ /^-/
          else
            @extra << shifted
          end
        else
          @extra << shift
        end
      end

      check_requirement! unless @disable_required_check

      assigns = Bundler::Thor::CoreExt::HashWithIndifferentAccess.new(@assigns)
      assigns.freeze
      assigns
    end

    def check_unknown!
      to_check = @stopped_parsing_after_extra_index ? @extra[0...@stopped_parsing_after_extra_index] : @extra

      # an unknown option starts with - or -- and has no more --'s afterward.
      unknown = to_check.select { |str| str =~ /^--?(?:(?!--).)*$/ }
      raise UnknownArgumentError.new(@switches.keys, unknown) unless unknown.empty?
    end

  protected

    def assign_result!(option, result)
      if option.repeatable && option.type == :hash
        (@assigns[option.human_name] ||= {}).merge!(result)
      elsif option.repeatable
        (@assigns[option.human_name] ||= []) << result
      else
        @assigns[option.human_name] = result
      end
    end

    # Check if the current value in peek is a registered switch.
    #
    # Two booleans are returned.  The first is true if the current value
    # starts with a hyphen; the second is true if it is a registered switch.
    def current_is_switch?
      return [false, false] if @is_treated_as_value
      case peek
      when LONG_RE, SHORT_RE, EQ_RE, SHORT_NUM
        [true, switch?($1)]
      when SHORT_SQ_RE
        [true, $1.split("").any? { |f| switch?("-#{f}") }]
      else
        [false, false]
      end
    end

    def current_is_switch_formatted?
      return false if @is_treated_as_value
      case peek
      when LONG_RE, SHORT_RE, EQ_RE, SHORT_NUM, SHORT_SQ_RE
        true
      else
        false
      end
    end

    def current_is_value?
      return true if @is_treated_as_value
      peek && (!parsing_options? || super)
    end

    def switch?(arg)
      !switch_option(normalize_switch(arg)).nil?
    end

    def switch_option(arg)
      if match = no_or_skip?(arg) # rubocop:disable AssignmentInCondition
        @switches[arg] || @switches["--#{match}"]
      else
        @switches[arg]
      end
    end

    # Check if the given argument is actually a shortcut.
    #
    def normalize_switch(arg)
      (@shorts[arg] || arg).tr("_", "-")
    end

    def parsing_options?
      peek
      @parsing_options
    end

    # Parse boolean values which can be given as --foo=true, --foo or --no-foo.
    #
    def parse_boolean(switch)
      if current_is_value?
        if ["true", "TRUE", "t", "T", true].include?(peek)
          shift
          true
        elsif ["false", "FALSE", "f", "F", false].include?(peek)
          shift
          false
        else
          @switches.key?(switch) || !no_or_skip?(switch)
        end
      else
        @switches.key?(switch) || !no_or_skip?(switch)
      end
    end

    # Parse the value at the peek analyzing if it requires an input or not.
    #
    def parse_peek(switch, option)
      if parsing_options? && (current_is_switch_formatted? || last?)
        if option.boolean?
          # No problem for boolean types
        elsif no_or_skip?(switch)
          return nil # User set value to nil
        elsif option.string? && !option.required?
          # Return the default if there is one, else the human name
          return option.lazy_default || option.default || option.human_name
        elsif option.lazy_default
          return option.lazy_default
        else
          raise MalformattedArgumentError, "No value provided for option '#{switch}'"
        end
      end

      @non_assigned_required.delete(option)
      send(:"parse_#{option.type}", switch)
    end
  end
end
PK}$[i�Lgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/parser/argument.rbnu�[���class Bundler::Thor
  class Argument #:nodoc:
    VALID_TYPES = [:numeric, :hash, :array, :string]

    attr_reader :name, :description, :enum, :required, :type, :default, :banner
    alias_method :human_name, :name

    def initialize(name, options = {})
      class_name = self.class.name.split("::").last

      type = options[:type]

      raise ArgumentError, "#{class_name} name can't be nil."                         if name.nil?
      raise ArgumentError, "Type :#{type} is not valid for #{class_name.downcase}s."  if type && !valid_type?(type)

      @name        = name.to_s
      @description = options[:desc]
      @required    = options.key?(:required) ? options[:required] : true
      @type        = (type || :string).to_sym
      @default     = options[:default]
      @banner      = options[:banner] || default_banner
      @enum        = options[:enum]

      validate! # Trigger specific validations
    end

    def usage
      required? ? banner : "[#{banner}]"
    end

    def required?
      required
    end

    def show_default?
      case default
      when Array, String, Hash
        !default.empty?
      else
        default
      end
    end

  protected

    def validate!
      raise ArgumentError, "An argument cannot be required and have default value." if required? && !default.nil?
      raise ArgumentError, "An argument cannot have an enum other than an array." if @enum && !@enum.is_a?(Array)
    end

    def valid_type?(type)
      self.class::VALID_TYPES.include?(type.to_sym)
    end

    def default_banner
      case type
      when :boolean
        nil
      when :string, :default
        human_name.upcase
      when :numeric
        "N"
      when :hash
        "key:value"
      when :array
        "one two three"
      end
    end
  end
end
PK}$[��llMgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/parser/arguments.rbnu�[���class Bundler::Thor
  class Arguments #:nodoc: # rubocop:disable ClassLength
    NUMERIC = /[-+]?(\d*\.\d+|\d+)/

    # Receives an array of args and returns two arrays, one with arguments
    # and one with switches.
    #
    def self.split(args)
      arguments = []

      args.each do |item|
        break if item.is_a?(String) && item =~ /^-/
        arguments << item
      end

      [arguments, args[Range.new(arguments.size, -1)]]
    end

    def self.parse(*args)
      to_parse = args.pop
      new(*args).parse(to_parse)
    end

    # Takes an array of Bundler::Thor::Argument objects.
    #
    def initialize(arguments = [])
      @assigns = {}
      @non_assigned_required = []
      @switches = arguments

      arguments.each do |argument|
        if !argument.default.nil?
          begin
            @assigns[argument.human_name] = argument.default.dup
          rescue TypeError  # Compatibility shim for un-dup-able Fixnum in Ruby < 2.4
            @assigns[argument.human_name] = argument.default
          end
        elsif argument.required?
          @non_assigned_required << argument
        end
      end
    end

    def parse(args)
      @pile = args.dup

      @switches.each do |argument|
        break unless peek
        @non_assigned_required.delete(argument)
        @assigns[argument.human_name] = send(:"parse_#{argument.type}", argument.human_name)
      end

      check_requirement!
      @assigns
    end

    def remaining
      @pile
    end

  private

    def no_or_skip?(arg)
      arg =~ /^--(no|skip)-([-\w]+)$/
      $2
    end

    def last?
      @pile.empty?
    end

    def peek
      @pile.first
    end

    def shift
      @pile.shift
    end

    def unshift(arg)
      if arg.is_a?(Array)
        @pile = arg + @pile
      else
        @pile.unshift(arg)
      end
    end

    def current_is_value?
      peek && peek.to_s !~ /^-{1,2}\S+/
    end

    # Runs through the argument array getting strings that contains ":" and
    # mark it as a hash:
    #
    #   [ "name:string", "age:integer" ]
    #
    # Becomes:
    #
    #   { "name" => "string", "age" => "integer" }
    #
    def parse_hash(name)
      return shift if peek.is_a?(Hash)
      hash = {}

      while current_is_value? && peek.include?(":")
        key, value = shift.split(":", 2)
        raise MalformattedArgumentError, "You can't specify '#{key}' more than once in option '#{name}'; got #{key}:#{hash[key]} and #{key}:#{value}" if hash.include? key
        hash[key] = value
      end
      hash
    end

    # Runs through the argument array getting all strings until no string is
    # found or a switch is found.
    #
    #   ["a", "b", "c"]
    #
    # And returns it as an array:
    #
    #   ["a", "b", "c"]
    #
    def parse_array(name)
      return shift if peek.is_a?(Array)
      array = []
      array << shift while current_is_value?
      array
    end

    # Check if the peek is numeric format and return a Float or Integer.
    # Check if the peek is included in enum if enum is provided.
    # Otherwise raises an error.
    #
    def parse_numeric(name)
      return shift if peek.is_a?(Numeric)

      unless peek =~ NUMERIC && $& == peek
        raise MalformattedArgumentError, "Expected numeric value for '#{name}'; got #{peek.inspect}"
      end

      value = $&.index(".") ? shift.to_f : shift.to_i
      if @switches.is_a?(Hash) && switch = @switches[name]
        if switch.enum && !switch.enum.include?(value)
          raise MalformattedArgumentError, "Expected '#{name}' to be one of #{switch.enum.join(', ')}; got #{value}"
        end
      end
      value
    end

    # Parse string:
    # for --string-arg, just return the current value in the pile
    # for --no-string-arg, nil
    # Check if the peek is included in enum if enum is provided. Otherwise raises an error.
    #
    def parse_string(name)
      if no_or_skip?(name)
        nil
      else
        value = shift
        if @switches.is_a?(Hash) && switch = @switches[name]
          if switch.enum && !switch.enum.include?(value)
            raise MalformattedArgumentError, "Expected '#{name}' to be one of #{switch.enum.join(', ')}; got #{value}"
          end
        end
        value
      end
    end

    # Raises an error if @non_assigned_required array is not empty.
    #
    def check_requirement!
      return if @non_assigned_required.empty?
      names = @non_assigned_required.map do |o|
        o.respond_to?(:switch_name) ? o.switch_name : o.human_name
      end.join("', '")
      class_name = self.class.name.split("::").last.downcase
      raise RequiredArgumentMissingError, "No value provided for required #{class_name} '#{names}'"
    end
  end
end
PK}$[�aq���Jgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/parser/option.rbnu�[���class Bundler::Thor
  class Option < Argument #:nodoc:
    attr_reader :aliases, :group, :lazy_default, :hide, :repeatable

    VALID_TYPES = [:boolean, :numeric, :hash, :array, :string]

    def initialize(name, options = {})
      @check_default_type = options[:check_default_type]
      options[:required] = false unless options.key?(:required)
      @repeatable     = options.fetch(:repeatable, false)
      super
      @lazy_default   = options[:lazy_default]
      @group          = options[:group].to_s.capitalize if options[:group]
      @aliases        = Array(options[:aliases])
      @hide           = options[:hide]
    end

    # This parse quick options given as method_options. It makes several
    # assumptions, but you can be more specific using the option method.
    #
    #   parse :foo => "bar"
    #   #=> Option foo with default value bar
    #
    #   parse [:foo, :baz] => "bar"
    #   #=> Option foo with default value bar and alias :baz
    #
    #   parse :foo => :required
    #   #=> Required option foo without default value
    #
    #   parse :foo => 2
    #   #=> Option foo with default value 2 and type numeric
    #
    #   parse :foo => :numeric
    #   #=> Option foo without default value and type numeric
    #
    #   parse :foo => true
    #   #=> Option foo with default value true and type boolean
    #
    # The valid types are :boolean, :numeric, :hash, :array and :string. If none
    # is given a default type is assumed. This default type accepts arguments as
    # string (--foo=value) or booleans (just --foo).
    #
    # By default all options are optional, unless :required is given.
    #
    def self.parse(key, value)
      if key.is_a?(Array)
        name, *aliases = key
      else
        name = key
        aliases = []
      end

      name    = name.to_s
      default = value

      type = case value
      when Symbol
        default = nil
        if VALID_TYPES.include?(value)
          value
        elsif required = (value == :required) # rubocop:disable AssignmentInCondition
          :string
        end
      when TrueClass, FalseClass
        :boolean
      when Numeric
        :numeric
      when Hash, Array, String
        value.class.name.downcase.to_sym
      end

      new(name.to_s, :required => required, :type => type, :default => default, :aliases => aliases)
    end

    def switch_name
      @switch_name ||= dasherized? ? name : dasherize(name)
    end

    def human_name
      @human_name ||= dasherized? ? undasherize(name) : name
    end

    def usage(padding = 0)
      sample = if banner && !banner.to_s.empty?
        "#{switch_name}=#{banner}".dup
      else
        switch_name
      end

      sample = "[#{sample}]".dup unless required?

      if boolean?
        sample << ", [#{dasherize('no-' + human_name)}]" unless (name == "force") || name.start_with?("no-")
      end

      if aliases.empty?
        (" " * padding) << sample
      else
        "#{aliases.join(', ')}, #{sample}"
      end
    end

    VALID_TYPES.each do |type|
      class_eval <<-RUBY, __FILE__, __LINE__ + 1
        def #{type}?
          self.type == #{type.inspect}
        end
      RUBY
    end

  protected

    def validate!
      raise ArgumentError, "An option cannot be boolean and required." if boolean? && required?
      validate_default_type!
    end

    def validate_default_type!
      default_type = case @default
      when nil
        return
      when TrueClass, FalseClass
        required? ? :string : :boolean
      when Numeric
        :numeric
      when Symbol
        :string
      when Hash, Array, String
        @default.class.name.downcase.to_sym
      end

      expected_type = (@repeatable && @type != :hash) ? :array : @type

      if default_type != expected_type
        err = "Expected #{expected_type} default value for '#{switch_name}'; got #{@default.inspect} (#{default_type})"

        if @check_default_type
          raise ArgumentError, err
        elsif @check_default_type == nil
          Bundler::Thor.deprecation_warning "#{err}.\n" +
            'This will be rejected in the future unless you explicitly pass the options `check_default_type: false`' +
            ' or call `allow_incompatible_default_type!` in your code'
        end
      end
    end

    def dasherized?
      name.index("-") == 0
    end

    def undasherize(str)
      str.sub(/^-{1,2}/, "")
    end

    def dasherize(str)
      (str.length > 1 ? "--" : "-") + str.tr("_", "-")
    end
  end
end
PK}$[�;��Dgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/command.rbnu�[���class Bundler::Thor
  class Command < Struct.new(:name, :description, :long_description, :usage, :options, :ancestor_name)
    FILE_REGEXP = /^#{Regexp.escape(File.dirname(__FILE__))}/

    def initialize(name, description, long_description, usage, options = nil)
      super(name.to_s, description, long_description, usage, options || {})
    end

    def initialize_copy(other) #:nodoc:
      super(other)
      self.options = other.options.dup if other.options
    end

    def hidden?
      false
    end

    # By default, a command invokes a method in the thor class. You can change this
    # implementation to create custom commands.
    def run(instance, args = [])
      arity = nil

      if private_method?(instance)
        instance.class.handle_no_command_error(name)
      elsif public_method?(instance)
        arity = instance.method(name).arity
        instance.__send__(name, *args)
      elsif local_method?(instance, :method_missing)
        instance.__send__(:method_missing, name.to_sym, *args)
      else
        instance.class.handle_no_command_error(name)
      end
    rescue ArgumentError => e
      handle_argument_error?(instance, e, caller) ? instance.class.handle_argument_error(self, e, args, arity) : (raise e)
    rescue NoMethodError => e
      handle_no_method_error?(instance, e, caller) ? instance.class.handle_no_command_error(name) : (raise e)
    end

    # Returns the formatted usage by injecting given required arguments
    # and required options into the given usage.
    def formatted_usage(klass, namespace = true, subcommand = false)
      if ancestor_name
        formatted = "#{ancestor_name} ".dup # add space
      elsif namespace
        namespace = klass.namespace
        formatted = "#{namespace.gsub(/^(default)/, '')}:".dup
      end
      formatted ||= "#{klass.namespace.split(':').last} ".dup if subcommand

      formatted ||= "".dup

      Array(usage).map do |specific_usage|
        formatted_specific_usage = formatted

        formatted_specific_usage += required_arguments_for(klass, specific_usage)

        # Add required options
        formatted_specific_usage += " #{required_options}"

        # Strip and go!
        formatted_specific_usage.strip
      end.join("\n")
    end

  protected

    # Add usage with required arguments
    def required_arguments_for(klass, usage)
      if klass && !klass.arguments.empty?
        usage.to_s.gsub(/^#{name}/) do |match|
          match << " " << klass.arguments.map(&:usage).compact.join(" ")
        end
      else
        usage.to_s
      end
    end

    def not_debugging?(instance)
      !(instance.class.respond_to?(:debugging) && instance.class.debugging)
    end

    def required_options
      @required_options ||= options.map { |_, o| o.usage if o.required? }.compact.sort.join(" ")
    end

    # Given a target, checks if this class name is a public method.
    def public_method?(instance) #:nodoc:
      !(instance.public_methods & [name.to_s, name.to_sym]).empty?
    end

    def private_method?(instance)
      !(instance.private_methods & [name.to_s, name.to_sym]).empty?
    end

    def local_method?(instance, name)
      methods = instance.public_methods(false) + instance.private_methods(false) + instance.protected_methods(false)
      !(methods & [name.to_s, name.to_sym]).empty?
    end

    def sans_backtrace(backtrace, caller) #:nodoc:
      saned = backtrace.reject { |frame| frame =~ FILE_REGEXP || (frame =~ /\.java:/ && RUBY_PLATFORM =~ /java/) || (frame =~ %r{^kernel/} && RUBY_ENGINE =~ /rbx/) }
      saned - caller
    end

    def handle_argument_error?(instance, error, caller)
      not_debugging?(instance) && (error.message =~ /wrong number of arguments/ || error.message =~ /given \d*, expected \d*/) && begin
        saned = sans_backtrace(error.backtrace, caller)
        saned.empty? || saned.size == 1
      end
    end

    def handle_no_method_error?(instance, error, caller)
      not_debugging?(instance) &&
        error.message =~ /^undefined method `#{name}' for #{Regexp.escape(instance.to_s)}$/
    end
  end
  Task = Command

  # A command that is hidden in help messages but still invocable.
  class HiddenCommand < Command
    def hidden?
      true
    end
  end
  HiddenTask = HiddenCommand

  # A dynamic command that handles method missing scenarios.
  class DynamicCommand < Command
    def initialize(name, options = nil)
      super(name.to_s, "A dynamically-generated command", name.to_s, name.to_s, options)
    end

    def run(instance, args = [])
      if (instance.methods & [name.to_s, name.to_sym]).empty?
        super
      else
        instance.class.handle_no_command_error(name)
      end
    end
  end
  DynamicTask = DynamicCommand
end
PK}$[�ᡇ++Kgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/nested_context.rbnu�[���class Bundler::Thor
  class NestedContext
    def initialize
      @depth = 0
    end

    def enter
      push

      yield
    ensure
      pop
    end

    def entered?
      @depth > 0
    end

    private

    def push
      @depth += 1
    end

    def pop
      @depth -= 1
    end
  end
end
PK}$[����Cgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/parser.rbnu�[���require_relative "parser/argument"
require_relative "parser/arguments"
require_relative "parser/option"
require_relative "parser/options"
PK}$[�	II@gems/gems/bundler-2.3.27/lib/bundler/vendor/tmpdir/lib/tmpdir.rbnu�[���# frozen_string_literal: true
#
# tmpdir - retrieve temporary directory path
#
# $Id$
#

require_relative '../../fileutils/lib/fileutils'
begin
  require 'etc.so'
rescue LoadError # rescue LoadError for miniruby
end

class Bundler::Dir < Dir

  @systmpdir ||= defined?(Etc.systmpdir) ? Etc.systmpdir : '/tmp'

  ##
  # Returns the operating system's temporary file path.

  def self.tmpdir
    tmp = nil
    ['TMPDIR', 'TMP', 'TEMP', ['system temporary path', @systmpdir], ['/tmp']*2, ['.']*2].each do |name, dir = ENV[name]|
      next if !dir
      dir = File.expand_path(dir)
      stat = File.stat(dir) rescue next
      case
      when !stat.directory?
        warn "#{name} is not a directory: #{dir}"
      when !stat.writable?
        warn "#{name} is not writable: #{dir}"
      when stat.world_writable? && !stat.sticky?
        warn "#{name} is world-writable: #{dir}"
      else
        tmp = dir
        break
      end
    end
    raise ArgumentError, "could not find a temporary directory" unless tmp
    tmp
  end

  # Bundler::Dir.mktmpdir creates a temporary directory.
  #
  # The directory is created with 0700 permission.
  # Application should not change the permission to make the temporary directory accessible from other users.
  #
  # The prefix and suffix of the name of the directory is specified by
  # the optional first argument, <i>prefix_suffix</i>.
  # - If it is not specified or nil, "d" is used as the prefix and no suffix is used.
  # - If it is a string, it is used as the prefix and no suffix is used.
  # - If it is an array, first element is used as the prefix and second element is used as a suffix.
  #
  #  Bundler::Dir.mktmpdir {|dir| dir is ".../d..." }
  #  Bundler::Dir.mktmpdir("foo") {|dir| dir is ".../foo..." }
  #  Bundler::Dir.mktmpdir(["foo", "bar"]) {|dir| dir is ".../foo...bar" }
  #
  # The directory is created under Bundler::Dir.tmpdir or
  # the optional second argument <i>tmpdir</i> if non-nil value is given.
  #
  #  Bundler::Dir.mktmpdir {|dir| dir is "#{Bundler::Dir.tmpdir}/d..." }
  #  Bundler::Dir.mktmpdir(nil, "/var/tmp") {|dir| dir is "/var/tmp/d..." }
  #
  # If a block is given,
  # it is yielded with the path of the directory.
  # The directory and its contents are removed
  # using Bundler::FileUtils.remove_entry before Bundler::Dir.mktmpdir returns.
  # The value of the block is returned.
  #
  #  Bundler::Dir.mktmpdir {|dir|
  #    # use the directory...
  #    open("#{dir}/foo", "w") { ... }
  #  }
  #
  # If a block is not given,
  # The path of the directory is returned.
  # In this case, Bundler::Dir.mktmpdir doesn't remove the directory.
  #
  #  dir = Bundler::Dir.mktmpdir
  #  begin
  #    # use the directory...
  #    open("#{dir}/foo", "w") { ... }
  #  ensure
  #    # remove the directory.
  #    Bundler::FileUtils.remove_entry dir
  #  end
  #
  def self.mktmpdir(prefix_suffix=nil, *rest, **options)
    base = nil
    path = Tmpname.create(prefix_suffix || "d", *rest, **options) {|p, _, _, d|
      base = d
      mkdir(p, 0700)
    }
    if block_given?
      begin
        yield path.dup
      ensure
        unless base
          stat = File.stat(File.dirname(path))
          if stat.world_writable? and !stat.sticky?
            raise ArgumentError, "parent directory is world writable but not sticky"
          end
        end
        Bundler::FileUtils.remove_entry path
      end
    else
      path
    end
  end

  module Tmpname # :nodoc:
    module_function

    def tmpdir
      Bundler::Dir.tmpdir
    end

    UNUSABLE_CHARS = "^,-.0-9A-Z_a-z~"

    class << (RANDOM = Random.new)
      MAX = 36**6 # < 0x100000000
      def next
        rand(MAX).to_s(36)
      end
    end
    private_constant :RANDOM

    def create(basename, tmpdir=nil, max_try: nil, **opts)
      origdir = tmpdir
      tmpdir ||= tmpdir()
      n = nil
      prefix, suffix = basename
      prefix = (String.try_convert(prefix) or
                raise ArgumentError, "unexpected prefix: #{prefix.inspect}")
      prefix = prefix.delete(UNUSABLE_CHARS)
      suffix &&= (String.try_convert(suffix) or
                  raise ArgumentError, "unexpected suffix: #{suffix.inspect}")
      suffix &&= suffix.delete(UNUSABLE_CHARS)
      begin
        t = Time.now.strftime("%Y%m%d")
        path = "#{prefix}#{t}-#{$$}-#{RANDOM.next}"\
               "#{n ? %[-#{n}] : ''}#{suffix||''}"
        path = File.join(tmpdir, path)
        yield(path, n, opts, origdir)
      rescue Errno::EEXIST
        n ||= 0
        n += 1
        retry if !max_try or n < max_try
        raise "cannot generate temporary name using `#{basename}' under `#{tmpdir}'"
      end
      path
    end
  end
end
PK}$[���__2gems/gems/bundler-2.3.27/lib/bundler/dependency.rbnu�[���# frozen_string_literal: true

require "rubygems/dependency"
require_relative "shared_helpers"
require_relative "rubygems_ext"

module Bundler
  class Dependency < Gem::Dependency
    attr_reader :autorequire
    attr_reader :groups, :platforms, :gemfile, :path, :git, :github, :branch, :ref, :force_ruby_platform

    ALL_RUBY_VERSIONS = ((18..27).to_a + (30..31).to_a).freeze
    PLATFORM_MAP = {
      :ruby        => [Gem::Platform::RUBY, ALL_RUBY_VERSIONS],
      :mri         => [Gem::Platform::RUBY, ALL_RUBY_VERSIONS],
      :rbx         => [Gem::Platform::RUBY],
      :truffleruby => [Gem::Platform::RUBY],
      :jruby       => [Gem::Platform::JAVA, [18, 19]],
      :windows     => [Gem::Platform::WINDOWS, ALL_RUBY_VERSIONS],
      :mswin       => [Gem::Platform::MSWIN,     ALL_RUBY_VERSIONS],
      :mswin64     => [Gem::Platform::MSWIN64,   ALL_RUBY_VERSIONS - [18]],
      :mingw       => [Gem::Platform::MINGW,     ALL_RUBY_VERSIONS],
      :x64_mingw   => [Gem::Platform::X64_MINGW, ALL_RUBY_VERSIONS - [18, 19]],
    }.each_with_object({}) do |(platform, spec), hash|
      hash[platform] = spec[0]
      spec[1]&.each {|version| hash[:"#{platform}_#{version}"] = spec[0] }
    end.freeze

    def initialize(name, version, options = {}, &blk)
      type = options["type"] || :runtime
      super(name, version, type)

      @autorequire    = nil
      @groups         = Array(options["group"] || :default).map(&:to_sym)
      @source         = options["source"]
      @path           = options["path"]
      @git            = options["git"]
      @github         = options["github"]
      @branch         = options["branch"]
      @ref            = options["ref"]
      @platforms      = Array(options["platforms"])
      @env            = options["env"]
      @should_include = options.fetch("should_include", true)
      @gemfile        = options["gemfile"]
      @force_ruby_platform = options["force_ruby_platform"]

      @autorequire = Array(options["require"] || []) if options.key?("require")
    end

    # Returns the platforms this dependency is valid for, in the same order as
    # passed in the `valid_platforms` parameter
    def gem_platforms(valid_platforms)
      return valid_platforms if @platforms.empty?

      valid_platforms.select {|p| expanded_platforms.include?(GemHelpers.generic(p)) }
    end

    def expanded_platforms
      @expanded_platforms ||= @platforms.map {|pl| PLATFORM_MAP[pl] }.compact.flatten.uniq
    end

    def should_include?
      @should_include && current_env? && current_platform?
    end

    def current_env?
      return true unless @env
      if @env.is_a?(Hash)
        @env.all? do |key, val|
          ENV[key.to_s] && (val.is_a?(String) ? ENV[key.to_s] == val : ENV[key.to_s] =~ val)
        end
      else
        ENV[@env.to_s]
      end
    end

    def current_platform?
      return true if @platforms.empty?
      @platforms.any? do |p|
        Bundler.current_ruby.send("#{p}?")
      end
    end

    def to_lock
      out = super
      out << "!" if source
      out
    end

    def specific?
      super
    rescue NoMethodError
      requirement != ">= 0"
    end
  end
end
PK}$[_��mwmw2gems/gems/bundler-2.3.27/lib/bundler/definition.rbnu�[���# frozen_string_literal: true

require_relative "lockfile_parser"

module Bundler
  class Definition
    include GemHelpers

    class << self
      # Do not create or modify a lockfile (Makes #lock a noop)
      attr_accessor :no_lock
    end

    attr_reader(
      :dependencies,
      :locked_deps,
      :locked_gems,
      :platforms,
      :requires,
      :ruby_version,
      :lockfile,
      :gemfiles
    )

    # Given a gemfile and lockfile creates a Bundler definition
    #
    # @param gemfile [Pathname] Path to Gemfile
    # @param lockfile [Pathname,nil] Path to Gemfile.lock
    # @param unlock [Hash, Boolean, nil] Gems that have been requested
    #   to be updated or true if all gems should be updated
    # @return [Bundler::Definition]
    def self.build(gemfile, lockfile, unlock)
      unlock ||= {}
      gemfile = Pathname.new(gemfile).expand_path

      raise GemfileNotFound, "#{gemfile} not found" unless gemfile.file?

      Dsl.evaluate(gemfile, lockfile, unlock)
    end

    #
    # How does the new system work?
    #
    # * Load information from Gemfile and Lockfile
    # * Invalidate stale locked specs
    #  * All specs from stale source are stale
    #  * All specs that are reachable only through a stale
    #    dependency are stale.
    # * If all fresh dependencies are satisfied by the locked
    #  specs, then we can try to resolve locally.
    #
    # @param lockfile [Pathname] Path to Gemfile.lock
    # @param dependencies [Array(Bundler::Dependency)] array of dependencies from Gemfile
    # @param sources [Bundler::SourceList]
    # @param unlock [Hash, Boolean, nil] Gems that have been requested
    #   to be updated or true if all gems should be updated
    # @param ruby_version [Bundler::RubyVersion, nil] Requested Ruby Version
    # @param optional_groups [Array(String)] A list of optional groups
    def initialize(lockfile, dependencies, sources, unlock, ruby_version = nil, optional_groups = [], gemfiles = [])
      if [true, false].include?(unlock)
        @unlocking_bundler = false
        @unlocking = unlock
      else
        @unlocking_bundler = unlock.delete(:bundler)
        @unlocking = unlock.any? {|_k, v| !Array(v).empty? }
      end

      @dependencies    = dependencies
      @sources         = sources
      @unlock          = unlock
      @optional_groups = optional_groups
      @remote          = false
      @prefer_local    = false
      @specs           = nil
      @ruby_version    = ruby_version
      @gemfiles        = gemfiles

      @lockfile               = lockfile
      @lockfile_contents      = String.new
      @locked_bundler_version = nil
      @locked_ruby_version    = nil
      @new_platform = nil

      if lockfile && File.exist?(lockfile)
        @lockfile_contents = Bundler.read_file(lockfile)
        @locked_gems = LockfileParser.new(@lockfile_contents)
        @locked_platforms = @locked_gems.platforms
        @platforms = @locked_platforms.dup
        @locked_bundler_version = @locked_gems.bundler_version
        @locked_ruby_version = @locked_gems.ruby_version
        @originally_locked_specs = SpecSet.new(@locked_gems.specs)

        if unlock != true
          @locked_deps    = @locked_gems.dependencies
          @locked_specs   = @originally_locked_specs
          @locked_sources = @locked_gems.sources
        else
          @unlock         = {}
          @locked_deps    = {}
          @locked_specs   = SpecSet.new([])
          @locked_sources = []
        end
      else
        @unlock         = {}
        @platforms      = []
        @locked_gems    = nil
        @locked_deps    = {}
        @locked_specs   = SpecSet.new([])
        @originally_locked_specs = @locked_specs
        @locked_sources = []
        @locked_platforms = []
      end

      locked_gem_sources = @locked_sources.select {|s| s.is_a?(Source::Rubygems) }
      @multisource_allowed = locked_gem_sources.size == 1 && locked_gem_sources.first.multiple_remotes? && Bundler.frozen_bundle?

      if @multisource_allowed
        unless sources.aggregate_global_source?
          msg = "Your lockfile contains a single rubygems source section with multiple remotes, which is insecure. Make sure you run `bundle install` in non frozen mode and commit the result to make your lockfile secure."

          Bundler::SharedHelpers.major_deprecation 2, msg
        end

        @sources.merged_gem_lockfile_sections!(locked_gem_sources.first)
      end

      @unlock[:sources] ||= []
      @unlock[:ruby] ||= if @ruby_version && locked_ruby_version_object
        @ruby_version.diff(locked_ruby_version_object)
      end
      @unlocking ||= @unlock[:ruby] ||= (!@locked_ruby_version ^ !@ruby_version)

      add_current_platform unless current_ruby_platform_locked? || Bundler.frozen_bundle?

      converge_path_sources_to_gemspec_sources
      @path_changes = converge_paths
      @source_changes = converge_sources

      if @unlock[:conservative]
        @unlock[:gems] ||= @dependencies.map(&:name)
      else
        eager_unlock = (@unlock[:gems] || []).map {|name| Dependency.new(name, ">= 0") }
        @unlock[:gems] = @locked_specs.for(eager_unlock, false, platforms).map(&:name).uniq
      end

      @dependency_changes = converge_dependencies
      @local_changes = converge_locals

      @requires = compute_requires
    end

    def gem_version_promoter
      @gem_version_promoter ||= GemVersionPromoter.new(@originally_locked_specs, @unlock[:gems])
    end

    def resolve_only_locally!
      @remote = false
      sources.local_only!
      resolve
    end

    def resolve_prefering_local!
      @prefer_local = true
      @remote = true
      sources.remote!
      resolve
    end

    def resolve_with_cache!
      sources.cached!
      resolve
    end

    def resolve_remotely!
      @remote = true
      sources.remote!
      resolve
    end

    # For given dependency list returns a SpecSet with Gemspec of all the required
    # dependencies.
    #  1. The method first resolves the dependencies specified in Gemfile
    #  2. After that it tries and fetches gemspec of resolved dependencies
    #
    # @return [Bundler::SpecSet]
    def specs
      @specs ||= materialize(requested_dependencies)
    end

    def new_specs
      specs - @locked_specs
    end

    def removed_specs
      @locked_specs - specs
    end

    def missing_specs
      resolve.materialize(requested_dependencies).missing_specs
    end

    def missing_specs?
      missing = missing_specs
      return false if missing.empty?
      Bundler.ui.debug "The definition is missing #{missing.map(&:full_name)}"
      true
    rescue BundlerError => e
      @resolve = nil
      @resolver = nil
      @specs = nil
      @gem_version_promoter = nil

      Bundler.ui.debug "The definition is missing dependencies, failed to resolve & materialize locally (#{e})"
      true
    end

    def requested_specs
      specs_for(requested_groups)
    end

    def requested_dependencies
      dependencies_for(requested_groups)
    end

    def current_dependencies
      dependencies.select do |d|
        d.should_include? && !d.gem_platforms([generic_local_platform]).empty?
      end
    end

    def locked_dependencies
      @locked_deps.values
    end

    def new_deps
      @new_deps ||= @dependencies - locked_dependencies
    end

    def deleted_deps
      @deleted_deps ||= locked_dependencies - @dependencies
    end

    def specs_for(groups)
      return specs if groups.empty?
      deps = dependencies_for(groups)
      materialize(deps)
    end

    def dependencies_for(groups)
      groups.map!(&:to_sym)
      current_dependencies.reject do |d|
        (d.groups & groups).empty?
      end
    end

    # Resolve all the dependencies specified in Gemfile. It ensures that
    # dependencies that have been already resolved via locked file and are fresh
    # are reused when resolving dependencies
    #
    # @return [SpecSet] resolved dependencies
    def resolve
      @resolve ||= if Bundler.frozen_bundle?
        Bundler.ui.debug "Frozen, using resolution from the lockfile"
        @locked_specs
      elsif !unlocking? && nothing_changed?
        if deleted_deps.any?
          Bundler.ui.debug("Some dependencies were deleted, using a subset of the resolution from the lockfile")
          SpecSet.new(filter_specs(@locked_specs, @dependencies - deleted_deps))
        else
          Bundler.ui.debug("Found no changes, using resolution from the lockfile")
          if @locked_gems.may_include_redundant_platform_specific_gems?
            SpecSet.new(filter_specs(@locked_specs, @dependencies))
          else
            @locked_specs
          end
        end
      else
        Bundler.ui.debug("Found changes from the lockfile, re-resolving dependencies because #{change_reason}")
        resolver.start(expanded_dependencies)
      end
    end

    def spec_git_paths
      sources.git_sources.map {|s| File.realpath(s.path) if File.exist?(s.path) }.compact
    end

    def groups
      dependencies.map(&:groups).flatten.uniq
    end

    def lock(file, preserve_unknown_sections = false)
      return if Definition.no_lock

      contents = to_lock

      # Convert to \r\n if the existing lock has them
      # i.e., Windows with `git config core.autocrlf=true`
      contents.gsub!(/\n/, "\r\n") if @lockfile_contents.match("\r\n")

      if @locked_bundler_version
        locked_major = @locked_bundler_version.segments.first
        current_major = Gem::Version.create(Bundler::VERSION).segments.first

        updating_major = locked_major < current_major
      end

      preserve_unknown_sections ||= !updating_major && (Bundler.frozen_bundle? || !(unlocking? || @unlocking_bundler))

      return if file && File.exist?(file) && lockfiles_equal?(@lockfile_contents, contents, preserve_unknown_sections)

      if Bundler.frozen_bundle?
        Bundler.ui.error "Cannot write a changed lockfile while frozen."
        return
      end

      SharedHelpers.filesystem_access(file) do |p|
        File.open(p, "wb") {|f| f.puts(contents) }
      end
    end

    def locked_ruby_version
      return unless ruby_version
      if @unlock[:ruby] || !@locked_ruby_version
        Bundler::RubyVersion.system
      else
        @locked_ruby_version
      end
    end

    def locked_ruby_version_object
      return unless @locked_ruby_version
      @locked_ruby_version_object ||= begin
        unless version = RubyVersion.from_string(@locked_ruby_version)
          raise LockfileError, "The Ruby version #{@locked_ruby_version} from " \
            "#{@lockfile} could not be parsed. " \
            "Try running bundle update --ruby to resolve this."
        end
        version
      end
    end

    def to_lock
      require_relative "lockfile_generator"
      LockfileGenerator.generate(self)
    end

    def ensure_equivalent_gemfile_and_lockfile(explicit_flag = false)
      msg = String.new
      msg << "You are trying to install in deployment mode after changing\n" \
             "your Gemfile. Run `bundle install` elsewhere and add the\n" \
             "updated #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} to version control."

      unless explicit_flag
        suggested_command = if Bundler.settings.locations("frozen").keys.&([:global, :local]).any?
          "bundle config unset frozen"
        elsif Bundler.settings.locations("deployment").keys.&([:global, :local]).any?
          "bundle config unset deployment"
        end
        msg << "\n\nIf this is a development machine, remove the #{Bundler.default_gemfile} " \
               "freeze \nby running `#{suggested_command}`." if suggested_command
      end

      added =   []
      deleted = []
      changed = []

      new_platforms = @platforms - @locked_platforms
      deleted_platforms = @locked_platforms - @platforms
      added.concat new_platforms.map {|p| "* platform: #{p}" }
      deleted.concat deleted_platforms.map {|p| "* platform: #{p}" }

      added.concat new_deps.map {|d| "* #{pretty_dep(d)}" } if new_deps.any?
      deleted.concat deleted_deps.map {|d| "* #{pretty_dep(d)}" } if deleted_deps.any?

      both_sources = Hash.new {|h, k| h[k] = [] }
      @dependencies.each {|d| both_sources[d.name][0] = d }

      locked_dependencies.each do |d|
        next if !Bundler.feature_flag.bundler_3_mode? && @locked_specs[d.name].empty?

        both_sources[d.name][1] = d
      end

      both_sources.each do |name, (dep, lock_dep)|
        next if dep.nil? || lock_dep.nil?

        gemfile_source = dep.source || sources.default_source
        lock_source = lock_dep.source || sources.default_source
        next if lock_source.include?(gemfile_source)

        gemfile_source_name = dep.source ? gemfile_source.identifier : "no specified source"
        lockfile_source_name = lock_dep.source ? lock_source.identifier : "no specified source"
        changed << "* #{name} from `#{lockfile_source_name}` to `#{gemfile_source_name}`"
      end

      reason = change_reason
      msg << "\n\n#{reason.split(", ").map(&:capitalize).join("\n")}" unless reason.strip.empty?
      msg << "\n\nYou have added to the Gemfile:\n" << added.join("\n") if added.any?
      msg << "\n\nYou have deleted from the Gemfile:\n" << deleted.join("\n") if deleted.any?
      msg << "\n\nYou have changed in the Gemfile:\n" << changed.join("\n") if changed.any?
      msg << "\n"

      raise ProductionError, msg if added.any? || deleted.any? || changed.any? || !nothing_changed?
    end

    def validate_runtime!
      validate_ruby!
      validate_platforms!
    end

    def validate_ruby!
      return unless ruby_version

      if diff = ruby_version.diff(Bundler::RubyVersion.system)
        problem, expected, actual = diff

        msg = case problem
              when :engine
                "Your Ruby engine is #{actual}, but your Gemfile specified #{expected}"
              when :version
                "Your Ruby version is #{actual}, but your Gemfile specified #{expected}"
              when :engine_version
                "Your #{Bundler::RubyVersion.system.engine} version is #{actual}, but your Gemfile specified #{ruby_version.engine} #{expected}"
              when :patchlevel
                if !expected.is_a?(String)
                  "The Ruby patchlevel in your Gemfile must be a string"
                else
                  "Your Ruby patchlevel is #{actual}, but your Gemfile specified #{expected}"
                end
        end

        raise RubyVersionMismatch, msg
      end
    end

    def validate_platforms!
      return if current_platform_locked?

      raise ProductionError, "Your bundle only supports platforms #{@platforms.map(&:to_s)} " \
        "but your local platform is #{Bundler.local_platform}. " \
        "Add the current platform to the lockfile with\n`bundle lock --add-platform #{Bundler.local_platform}` and try again."
    end

    def add_platform(platform)
      @new_platform ||= !@platforms.include?(platform)
      @platforms |= [platform]
    end

    def remove_platform(platform)
      return if @platforms.delete(Gem::Platform.new(platform))
      raise InvalidOption, "Unable to remove the platform `#{platform}` since the only platforms are #{@platforms.join ", "}"
    end

    def most_specific_locked_platform
      @platforms.min_by do |bundle_platform|
        platform_specificity_match(bundle_platform, local_platform)
      end
    end

    attr_reader :sources
    private :sources

    def nothing_changed?
      !@source_changes && !@dependency_changes && !@new_platform && !@path_changes && !@local_changes
    end

    def unlocking?
      @unlocking
    end

    private

    def resolver
      @resolver ||= begin
        last_resolve = converge_locked_specs
        remove_ruby_from_platforms_if_necessary!(current_dependencies)
        Resolver.new(source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve(last_resolve), platforms)
      end
    end

    def expanded_dependencies
      @expanded_dependencies ||= dependencies + metadata_dependencies
    end

    def filter_specs(specs, deps)
      SpecSet.new(specs).for(deps, false, platforms)
    end

    def materialize(dependencies)
      specs = resolve.materialize(dependencies)
      missing_specs = specs.missing_specs

      if missing_specs.any?
        missing_specs.each do |s|
          locked_gem = @locked_specs[s.name].last
          next if locked_gem.nil? || locked_gem.version != s.version || !@remote
          raise GemNotFound, "Your bundle is locked to #{locked_gem} from #{locked_gem.source}, but that version can " \
                             "no longer be found in that source. That means the author of #{locked_gem} has removed it. " \
                             "You'll need to update your bundle to a version other than #{locked_gem} that hasn't been " \
                             "removed in order to install."
        end

        missing_specs_list = missing_specs.group_by(&:source).map do |source, missing_specs_for_source|
          "#{missing_specs_for_source.map(&:full_name).join(", ")} in #{source}"
        end

        raise GemNotFound, "Could not find #{missing_specs_list.join(" nor ")}"
      end

      loop do
        incomplete_specs = specs.incomplete_specs
        break if incomplete_specs.empty?

        Bundler.ui.debug("The lockfile does not have all gems needed for the current platform though, Bundler will still re-resolve dependencies")
        @resolve = resolver.start(expanded_dependencies, :exclude_specs => incomplete_specs)
        specs = resolve.materialize(dependencies)
      end

      bundler = sources.metadata_source.specs.search(Gem::Dependency.new("bundler", VERSION)).last
      specs["bundler"] = bundler

      specs
    end

    def precompute_source_requirements_for_indirect_dependencies?
      @remote && sources.non_global_rubygems_sources.all?(&:dependency_api_available?) && !sources.aggregate_global_source?
    end

    def pin_locally_available_names(source_requirements)
      source_requirements.each_with_object({}) do |(name, original_source), new_source_requirements|
        local_source = original_source.dup
        local_source.local_only!

        new_source_requirements[name] = if local_source.specs.search(name).any?
          local_source
        else
          original_source
        end
      end
    end

    def current_ruby_platform_locked?
      return false unless generic_local_platform == Gem::Platform::RUBY
      return false if Bundler.settings[:force_ruby_platform] && !@platforms.include?(Gem::Platform::RUBY)

      current_platform_locked?
    end

    def current_platform_locked?
      @platforms.any? do |bundle_platform|
        MatchPlatform.platforms_match?(bundle_platform, Bundler.local_platform)
      end
    end

    def add_current_platform
      add_platform(local_platform)
    end

    def change_reason
      if unlocking?
        unlock_reason = @unlock.reject {|_k, v| Array(v).empty? }.map do |k, v|
          if v == true
            k.to_s
          else
            v = Array(v)
            "#{k}: (#{v.join(", ")})"
          end
        end.join(", ")
        return "bundler is unlocking #{unlock_reason}"
      end
      [
        [@source_changes, "the list of sources changed"],
        [@dependency_changes, "the dependencies in your gemfile changed"],
        [@new_platform, "you added a new platform to your gemfile"],
        [@path_changes, "the gemspecs for path gems changed"],
        [@local_changes, "the gemspecs for git local gems changed"],
      ].select(&:first).map(&:last).join(", ")
    end

    def pretty_dep(dep)
      SharedHelpers.pretty_dependency(dep)
    end

    # Check if the specs of the given source changed
    # according to the locked source.
    def specs_changed?(source)
      locked = @locked_sources.find {|s| s == source }

      !locked || dependencies_for_source_changed?(source, locked) || specs_for_source_changed?(source)
    end

    def dependencies_for_source_changed?(source, locked_source = source)
      deps_for_source = @dependencies.select {|s| s.source == source }
      locked_deps_for_source = locked_dependencies.select {|dep| dep.source == locked_source }

      deps_for_source.uniq.sort != locked_deps_for_source.sort
    end

    def specs_for_source_changed?(source)
      locked_index = Index.new
      locked_index.use(@locked_specs.select {|s| source.can_lock?(s) })

      # order here matters, since Index#== is checking source.specs.include?(locked_index)
      locked_index != source.specs
    rescue PathError, GitError => e
      Bundler.ui.debug "Assuming that #{source} has not changed since fetching its specs errored (#{e})"
      false
    end

    # Get all locals and override their matching sources.
    # Return true if any of the locals changed (for example,
    # they point to a new revision) or depend on new specs.
    def converge_locals
      locals = []

      Bundler.settings.local_overrides.map do |k, v|
        spec   = @dependencies.find {|s| s.name == k }
        source = spec && spec.source
        if source && source.respond_to?(:local_override!)
          source.unlock! if @unlock[:gems].include?(spec.name)
          locals << [source, source.local_override!(v)]
        end
      end

      sources_with_changes = locals.select do |source, changed|
        changed || specs_changed?(source)
      end.map(&:first)
      !sources_with_changes.each {|source| @unlock[:sources] << source.name }.empty?
    end

    def converge_paths
      sources.path_sources.any? do |source|
        specs_changed?(source)
      end
    end

    def converge_path_source_to_gemspec_source(source)
      return source unless source.instance_of?(Source::Path)
      gemspec_source = sources.path_sources.find {|s| s.is_a?(Source::Gemspec) && s.as_path_source == source }
      gemspec_source || source
    end

    def converge_path_sources_to_gemspec_sources
      @locked_sources.map! do |source|
        converge_path_source_to_gemspec_source(source)
      end
      @locked_specs.each do |spec|
        spec.source &&= converge_path_source_to_gemspec_source(spec.source)
      end
      @locked_deps.each do |_, dep|
        dep.source &&= converge_path_source_to_gemspec_source(dep.source)
      end
    end

    def converge_sources
      # Replace the sources from the Gemfile with the sources from the Gemfile.lock,
      # if they exist in the Gemfile.lock and are `==`. If you can't find an equivalent
      # source in the Gemfile.lock, use the one from the Gemfile.
      changes = sources.replace_sources!(@locked_sources)

      sources.all_sources.each do |source|
        # If the source is unlockable and the current command allows an unlock of
        # the source (for example, you are doing a `bundle update <foo>` of a git-pinned
        # gem), unlock it. For git sources, this means to unlock the revision, which
        # will cause the `ref` used to be the most recent for the branch (or master) if
        # an explicit `ref` is not used.
        if source.respond_to?(:unlock!) && @unlock[:sources].include?(source.name)
          source.unlock!
          changes = true
        end
      end

      changes
    end

    def converge_dependencies
      changes = false

      @dependencies.each do |dep|
        if dep.source
          dep.source = sources.get(dep.source)
        end

        unless locked_dep = @locked_deps[dep.name]
          changes = true
          next
        end

        # Gem::Dependency#== matches Gem::Dependency#type. As the lockfile
        # doesn't carry a notion of the dependency type, if you use
        # add_development_dependency in a gemspec that's loaded with the gemspec
        # directive, the lockfile dependencies and resolved dependencies end up
        # with a mismatch on #type. Work around that by setting the type on the
        # dep from the lockfile.
        locked_dep.instance_variable_set(:@type, dep.type)

        # We already know the name matches from the hash lookup
        # so we only need to check the requirement now
        changes ||= dep.requirement != locked_dep.requirement
      end

      changes
    end

    # Remove elements from the locked specs that are expired. This will most
    # commonly happen if the Gemfile has changed since the lockfile was last
    # generated
    def converge_locked_specs
      converged = converge_specs(@locked_specs)

      resolve = SpecSet.new(converged.reject {|s| @unlock[:gems].include?(s.name) })

      diff = nil

      # Now, we unlock any sources that do not have anymore gems pinned to it
      sources.all_sources.each do |source|
        next unless source.respond_to?(:unlock!)

        unless resolve.any? {|s| s.source == source }
          diff ||= @locked_specs.to_a - resolve.to_a
          source.unlock! if diff.any? {|s| s.source == source }
        end
      end

      resolve
    end

    def converge_specs(specs)
      converged = []

      deps = @dependencies.select do |dep|
        specs[dep].any? {|s| s.satisfies?(dep) && (!dep.source || s.source.include?(dep.source)) }
      end

      @specs_that_changed_sources = []

      specs.each do |s|
        dep = @dependencies.find {|d| s.satisfies?(d) }

        # Replace the locked dependency's source with the equivalent source from the Gemfile
        s.source = if dep && dep.source
          gemfile_source = dep.source
          lockfile_source = s.source

          @specs_that_changed_sources << s if gemfile_source != lockfile_source

          gemfile_source
        else
          sources.get_with_fallback(s.source)
        end

        next if @unlock[:sources].include?(s.source.name)

        # Path sources have special logic
        if s.source.instance_of?(Source::Path) || s.source.instance_of?(Source::Gemspec)
          new_specs = begin
            s.source.specs
          rescue PathError, GitError
            # if we won't need the source (according to the lockfile),
            # don't error if the path/git source isn't available
            next if specs.
                    for(requested_dependencies, false).
                    none? {|locked_spec| locked_spec.source == s.source }

            raise
          end

          new_spec = new_specs[s].first

          # If the spec is no longer in the path source, unlock it. This
          # commonly happens if the version changed in the gemspec
          next unless new_spec

          s.dependencies.replace(new_spec.dependencies)
        end

        if dep.nil? && requested_dependencies.find {|d| s.name == d.name }
          @unlock[:gems] << s.name
        else
          converged << s
        end
      end

      filter_specs(converged, deps)
    end

    def metadata_dependencies
      @metadata_dependencies ||= [
        Dependency.new("Ruby\0", Gem.ruby_version),
        Dependency.new("RubyGems\0", Gem::VERSION),
      ]
    end

    def source_requirements
      # Record the specs available in each gem's source, so that those
      # specs will be available later when the resolver knows where to
      # look for that gemspec (or its dependencies)
      source_requirements = if precompute_source_requirements_for_indirect_dependencies?
        all_requirements = source_map.all_requirements
        all_requirements = pin_locally_available_names(all_requirements) if @prefer_local
        { :default => sources.default_source }.merge(all_requirements)
      else
        { :default => Source::RubygemsAggregate.new(sources, source_map) }.merge(source_map.direct_requirements)
      end
      source_requirements.merge!(source_map.locked_requirements) unless @remote
      metadata_dependencies.each do |dep|
        source_requirements[dep.name] = sources.metadata_source
      end
      source_requirements[:default_bundler] = source_requirements["bundler"] || sources.default_source
      source_requirements["bundler"] = sources.metadata_source # needs to come last to override
      verify_changed_sources!
      source_requirements
    end

    def verify_changed_sources!
      @specs_that_changed_sources.each do |s|
        if s.source.specs.search(s.name).empty?
          raise GemNotFound, "Could not find gem '#{s.name}' in #{s.source}"
        end
      end
    end

    def requested_groups
      values = groups - Bundler.settings[:without] - @optional_groups + Bundler.settings[:with]
      values &= Bundler.settings[:only] unless Bundler.settings[:only].empty?
      values
    end

    def lockfiles_equal?(current, proposed, preserve_unknown_sections)
      if preserve_unknown_sections
        sections_to_ignore = LockfileParser.sections_to_ignore(@locked_bundler_version)
        sections_to_ignore += LockfileParser.unknown_sections_in_lockfile(current)
        sections_to_ignore += LockfileParser::ENVIRONMENT_VERSION_SECTIONS
        pattern = /#{Regexp.union(sections_to_ignore)}\n(\s{2,}.*\n)+/
        whitespace_cleanup = /\n{2,}/
        current = current.gsub(pattern, "\n").gsub(whitespace_cleanup, "\n\n").strip
        proposed = proposed.gsub(pattern, "\n").gsub(whitespace_cleanup, "\n\n").strip
      end
      current == proposed
    end

    def compute_requires
      dependencies.reduce({}) do |requires, dep|
        next requires unless dep.should_include?
        requires[dep.name] = Array(dep.autorequire || dep.name).map do |file|
          # Allow `require: true` as an alias for `require: <name>`
          file == true ? dep.name : file
        end
        requires
      end
    end

    def additional_base_requirements_for_resolve(last_resolve)
      return [] unless @locked_gems && unlocking? && !sources.expired_sources?(@locked_gems.sources)
      converge_specs(@originally_locked_specs - last_resolve).map do |locked_spec|
        Dependency.new(locked_spec.name, ">= #{locked_spec.version}")
      end.uniq
    end

    def remove_ruby_from_platforms_if_necessary!(dependencies)
      return if Bundler.frozen_bundle? ||
                Bundler.local_platform == Gem::Platform::RUBY ||
                !platforms.include?(Gem::Platform::RUBY) ||
                (@new_platform && platforms.last == Gem::Platform::RUBY) ||
                !@originally_locked_specs.incomplete_ruby_specs?(dependencies)

      remove_platform(Gem::Platform::RUBY)
      add_current_platform
    end

    def source_map
      @source_map ||= SourceMap.new(sources, dependencies, @locked_specs)
    end
  end
end
PK}$[�j�{��7gems/gems/bundler-2.3.27/lib/bundler/friendly_errors.rbnu�[���# frozen_string_literal: true

require_relative "vendored_thor"

module Bundler
  module FriendlyErrors
    module_function

    def enable!
      @disabled = false
    end

    def disabled?
      @disabled
    end

    def disable!
      @disabled = true
    end

    def log_error(error)
      case error
      when YamlSyntaxError
        Bundler.ui.error error.message
        Bundler.ui.trace error.orig_exception
      when Dsl::DSLError, GemspecError
        Bundler.ui.error error.message
      when GemRequireError
        Bundler.ui.error error.message
        Bundler.ui.trace error.orig_exception
      when BundlerError
        if Bundler.ui.debug?
          Bundler.ui.trace error
        else
          Bundler.ui.error error.message, :wrap => true
        end
      when Thor::Error
        Bundler.ui.error error.message
      when LoadError
        raise error unless error.message =~ /cannot load such file -- openssl|openssl.so|libcrypto.so/
        Bundler.ui.error "\nCould not load OpenSSL. #{error.class}: #{error}\n#{error.backtrace.join("\n  ")}"
      when Interrupt
        Bundler.ui.error "\nQuitting..."
        Bundler.ui.trace error
      when Gem::InvalidSpecificationException
        Bundler.ui.error error.message, :wrap => true
      when SystemExit
      when *[defined?(Java::JavaLang::OutOfMemoryError) && Java::JavaLang::OutOfMemoryError].compact
        Bundler.ui.error "\nYour JVM has run out of memory, and Bundler cannot continue. " \
          "You can decrease the amount of memory Bundler needs by removing gems from your Gemfile, " \
          "especially large gems. (Gems can be as large as hundreds of megabytes, and Bundler has to read those files!). " \
          "Alternatively, you can increase the amount of memory the JVM is able to use by running Bundler with jruby -J-Xmx1024m -S bundle (JRuby defaults to 500MB)."
      else request_issue_report_for(error)
      end
    end

    def exit_status(error)
      case error
      when BundlerError then error.status_code
      when Thor::Error then 15
      when SystemExit then error.status
      else 1
      end
    end

    def request_issue_report_for(e)
      Bundler.ui.error <<-EOS.gsub(/^ {8}/, ""), nil, nil
        --- ERROR REPORT TEMPLATE -------------------------------------------------------

        ```
        #{exception_message(e)}
        ```

        #{Bundler::Env.report}
        --- TEMPLATE END ----------------------------------------------------------------

      EOS

      Bundler.ui.error "Unfortunately, an unexpected error occurred, and Bundler cannot continue."

      Bundler.ui.error <<-EOS.gsub(/^ {8}/, ""), nil, :yellow

        First, try this link to see if there are any existing issue reports for this error:
        #{issues_url(e)}

        If there aren't any reports for this error yet, please fill in the new issue form located at #{new_issue_url}, and copy and paste the report template above in there.
      EOS
    end

    def exception_message(error)
      message = serialized_exception_for(error)
      cause = error.cause
      return message unless cause

      message + serialized_exception_for(cause)
    end

    def serialized_exception_for(e)
      <<-EOS.gsub(/^ {8}/, "")
        #{e.class}: #{e.message}
          #{e.backtrace && e.backtrace.join("\n          ").chomp}
      EOS
    end

    def issues_url(exception)
      message = exception.message.lines.first.tr(":", " ").chomp
      message = message.split("-").first if exception.is_a?(Errno)
      require "cgi"
      "https://github.com/rubygems/rubygems/search?q=" \
        "#{CGI.escape(message)}&type=Issues"
    end

    def new_issue_url
      "https://github.com/rubygems/rubygems/issues/new?labels=Bundler&template=bundler-related-issue.md"
    end
  end

  def self.with_friendly_errors
    FriendlyErrors.enable!
    yield
  rescue SignalException
    raise
  rescue Exception => e # rubocop:disable Lint/RescueException
    raise if FriendlyErrors.disabled?

    FriendlyErrors.log_error(e)
    exit FriendlyErrors.exit_status(e)
  end
end
PK}$[���7gems/gems/bundler-2.3.27/lib/bundler/lockfile_parser.rbnu�[���# frozen_string_literal: true

module Bundler
  class LockfileParser
    attr_reader :sources, :dependencies, :specs, :platforms, :bundler_version, :ruby_version

    BUNDLED      = "BUNDLED WITH".freeze
    DEPENDENCIES = "DEPENDENCIES".freeze
    PLATFORMS    = "PLATFORMS".freeze
    RUBY         = "RUBY VERSION".freeze
    GIT          = "GIT".freeze
    GEM          = "GEM".freeze
    PATH         = "PATH".freeze
    PLUGIN       = "PLUGIN SOURCE".freeze
    SPECS        = "  specs:".freeze
    OPTIONS      = /^  ([a-z]+): (.*)$/i.freeze
    SOURCE       = [GIT, GEM, PATH, PLUGIN].freeze

    SECTIONS_BY_VERSION_INTRODUCED = {
      Gem::Version.create("1.0") => [DEPENDENCIES, PLATFORMS, GIT, GEM, PATH].freeze,
      Gem::Version.create("1.10") => [BUNDLED].freeze,
      Gem::Version.create("1.12") => [RUBY].freeze,
      Gem::Version.create("1.13") => [PLUGIN].freeze,
    }.freeze

    KNOWN_SECTIONS = SECTIONS_BY_VERSION_INTRODUCED.values.flatten.freeze

    ENVIRONMENT_VERSION_SECTIONS = [BUNDLED, RUBY].freeze

    def self.sections_in_lockfile(lockfile_contents)
      lockfile_contents.scan(/^\w[\w ]*$/).uniq
    end

    def self.unknown_sections_in_lockfile(lockfile_contents)
      sections_in_lockfile(lockfile_contents) - KNOWN_SECTIONS
    end

    def self.sections_to_ignore(base_version = nil)
      base_version &&= base_version.release
      base_version ||= Gem::Version.create("1.0".dup)
      attributes = []
      SECTIONS_BY_VERSION_INTRODUCED.each do |version, introduced|
        next if version <= base_version
        attributes += introduced
      end
      attributes
    end

    def self.bundled_with
      lockfile = Bundler.default_lockfile
      return unless lockfile.file?

      lockfile_contents = Bundler.read_file(lockfile)
      return unless lockfile_contents.include?(BUNDLED)

      lockfile_contents.split(BUNDLED).last.strip
    end

    def initialize(lockfile)
      @platforms    = []
      @sources      = []
      @dependencies = {}
      @state        = nil
      @specs        = {}

      if lockfile.match(/<<<<<<<|=======|>>>>>>>|\|\|\|\|\|\|\|/)
        raise LockfileError, "Your #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} contains merge conflicts.\n" \
          "Run `git checkout HEAD -- #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}` first to get a clean lock."
      end

      lockfile.split(/(?:\r?\n)+/).each do |line|
        if SOURCE.include?(line)
          @state = :source
          parse_source(line)
        elsif line == DEPENDENCIES
          @state = :dependency
        elsif line == PLATFORMS
          @state = :platform
        elsif line == RUBY
          @state = :ruby
        elsif line == BUNDLED
          @state = :bundled_with
        elsif line =~ /^[^\s]/
          @state = nil
        elsif @state
          send("parse_#{@state}", line)
        end
      end
      @specs = @specs.values.sort_by(&:identifier)
    rescue ArgumentError => e
      Bundler.ui.debug(e)
      raise LockfileError, "Your lockfile is unreadable. Run `rm #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}` " \
        "and then `bundle install` to generate a new lockfile."
    end

    def may_include_redundant_platform_specific_gems?
      bundler_version.nil? || bundler_version < Gem::Version.new("1.16.2")
    end

    private

    TYPES = {
      GIT    => Bundler::Source::Git,
      GEM    => Bundler::Source::Rubygems,
      PATH   => Bundler::Source::Path,
      PLUGIN => Bundler::Plugin,
    }.freeze

    def parse_source(line)
      case line
      when SPECS
        case @type
        when PATH
          @current_source = TYPES[@type].from_lock(@opts)
          @sources << @current_source
        when GIT
          @current_source = TYPES[@type].from_lock(@opts)
          @sources << @current_source
        when GEM
          @opts["remotes"] = Array(@opts.delete("remote")).reverse
          @current_source = TYPES[@type].from_lock(@opts)
          @sources << @current_source
        when PLUGIN
          @current_source = Plugin.source_from_lock(@opts)
          @sources << @current_source
        end
      when OPTIONS
        value = $2
        value = true if value == "true"
        value = false if value == "false"

        key = $1

        if @opts[key]
          @opts[key] = Array(@opts[key])
          @opts[key] << value
        else
          @opts[key] = value
        end
      when *SOURCE
        @current_source = nil
        @opts = {}
        @type = line
      else
        parse_spec(line)
      end
    end

    space = / /
    NAME_VERSION = /
      ^(#{space}{2}|#{space}{4}|#{space}{6})(?!#{space}) # Exactly 2, 4, or 6 spaces at the start of the line
      (.*?)                                              # Name
      (?:#{space}\(([^-]*)                               # Space, followed by version
      (?:-(.*))?\))?                                     # Optional platform
      (!)?                                               # Optional pinned marker
      $                                                  # Line end
    /xo.freeze

    def parse_dependency(line)
      return unless line =~ NAME_VERSION
      spaces = $1
      return unless spaces.size == 2
      name = $2
      version = $3
      pinned = $5

      version = version.split(",").map(&:strip) if version

      dep = Bundler::Dependency.new(name, version)

      if pinned && dep.name != "bundler"
        spec = @specs.find {|_, v| v.name == dep.name }
        dep.source = spec.last.source if spec

        # Path sources need to know what the default name / version
        # to use in the case that there are no gemspecs present. A fake
        # gemspec is created based on the version set on the dependency
        # TODO: Use the version from the spec instead of from the dependency
        if version && version.size == 1 && version.first =~ /^\s*= (.+)\s*$/ && dep.source.is_a?(Bundler::Source::Path)
          dep.source.name    = name
          dep.source.version = $1
        end
      end

      @dependencies[dep.name] = dep
    end

    def parse_spec(line)
      return unless line =~ NAME_VERSION
      spaces = $1
      name = $2
      version = $3
      platform = $4

      if spaces.size == 4
        version = Gem::Version.new(version)
        platform = platform ? Gem::Platform.new(platform) : Gem::Platform::RUBY
        @current_spec = LazySpecification.new(name, version, platform)
        @current_spec.source = @current_source
        @current_source.add_dependency_names(name)

        @specs[@current_spec.identifier] = @current_spec
      elsif spaces.size == 6
        version = version.split(",").map(&:strip) if version
        dep = Gem::Dependency.new(name, version)
        @current_spec.dependencies << dep
      end
    end

    def parse_platform(line)
      @platforms << Gem::Platform.new($1) if line =~ /^  (.*)$/
    end

    def parse_bundled_with(line)
      line = line.strip
      return unless Gem::Version.correct?(line)
      @bundler_version = Gem::Version.create(line)
    end

    def parse_ruby(line)
      @ruby_version = line.strip
    end
  end
end
PK}$[�8�9%_%_'gems/gems/bundler-2.3.27/lib/bundler.rbnu�[���# frozen_string_literal: true

require_relative "bundler/vendored_fileutils"
require "pathname"
require "rbconfig"

require_relative "bundler/errors"
require_relative "bundler/environment_preserver"
require_relative "bundler/plugin"
require_relative "bundler/rubygems_ext"
require_relative "bundler/rubygems_integration"
require_relative "bundler/version"
require_relative "bundler/constants"
require_relative "bundler/current_ruby"
require_relative "bundler/build_metadata"

# Bundler provides a consistent environment for Ruby projects by
# tracking and installing the exact gems and versions that are needed.
#
# Since Ruby 2.6, Bundler is a part of Ruby's standard library.
#
# Bundler is used by creating _gemfiles_ listing all the project dependencies
# and (optionally) their versions and then using
#
#   require 'bundler/setup'
#
# or Bundler.setup to setup environment where only specified gems and their
# specified versions could be used.
#
# See {Bundler website}[https://bundler.io/docs.html] for extensive documentation
# on gemfiles creation and Bundler usage.
#
# As a standard library inside project, Bundler could be used for introspection
# of loaded and required modules.
#
module Bundler
  environment_preserver = EnvironmentPreserver.from_env
  ORIGINAL_ENV = environment_preserver.restore
  environment_preserver.replace_with_backup
  SUDO_MUTEX = Thread::Mutex.new

  autoload :Definition,             File.expand_path("bundler/definition", __dir__)
  autoload :Dependency,             File.expand_path("bundler/dependency", __dir__)
  autoload :Deprecate,              File.expand_path("bundler/deprecate", __dir__)
  autoload :Digest,                 File.expand_path("bundler/digest", __dir__)
  autoload :Dsl,                    File.expand_path("bundler/dsl", __dir__)
  autoload :EndpointSpecification,  File.expand_path("bundler/endpoint_specification", __dir__)
  autoload :Env,                    File.expand_path("bundler/env", __dir__)
  autoload :Fetcher,                File.expand_path("bundler/fetcher", __dir__)
  autoload :FeatureFlag,            File.expand_path("bundler/feature_flag", __dir__)
  autoload :GemHelper,              File.expand_path("bundler/gem_helper", __dir__)
  autoload :GemHelpers,             File.expand_path("bundler/gem_helpers", __dir__)
  autoload :GemVersionPromoter,     File.expand_path("bundler/gem_version_promoter", __dir__)
  autoload :Graph,                  File.expand_path("bundler/graph", __dir__)
  autoload :Index,                  File.expand_path("bundler/index", __dir__)
  autoload :Injector,               File.expand_path("bundler/injector", __dir__)
  autoload :Installer,              File.expand_path("bundler/installer", __dir__)
  autoload :LazySpecification,      File.expand_path("bundler/lazy_specification", __dir__)
  autoload :LockfileParser,         File.expand_path("bundler/lockfile_parser", __dir__)
  autoload :MatchRemoteMetadata,    File.expand_path("bundler/match_remote_metadata", __dir__)
  autoload :ProcessLock,            File.expand_path("bundler/process_lock", __dir__)
  autoload :RemoteSpecification,    File.expand_path("bundler/remote_specification", __dir__)
  autoload :Resolver,               File.expand_path("bundler/resolver", __dir__)
  autoload :Retry,                  File.expand_path("bundler/retry", __dir__)
  autoload :RubyDsl,                File.expand_path("bundler/ruby_dsl", __dir__)
  autoload :RubyVersion,            File.expand_path("bundler/ruby_version", __dir__)
  autoload :Runtime,                File.expand_path("bundler/runtime", __dir__)
  autoload :SelfManager,            File.expand_path("bundler/self_manager", __dir__)
  autoload :Settings,               File.expand_path("bundler/settings", __dir__)
  autoload :SharedHelpers,          File.expand_path("bundler/shared_helpers", __dir__)
  autoload :Source,                 File.expand_path("bundler/source", __dir__)
  autoload :SourceList,             File.expand_path("bundler/source_list", __dir__)
  autoload :SourceMap,              File.expand_path("bundler/source_map", __dir__)
  autoload :SpecSet,                File.expand_path("bundler/spec_set", __dir__)
  autoload :StubSpecification,      File.expand_path("bundler/stub_specification", __dir__)
  autoload :UI,                     File.expand_path("bundler/ui", __dir__)
  autoload :URICredentialsFilter,   File.expand_path("bundler/uri_credentials_filter", __dir__)
  autoload :VersionRanges,          File.expand_path("bundler/version_ranges", __dir__)

  class << self
    def configure
      @configured ||= configure_gem_home_and_path
    end

    def ui
      (defined?(@ui) && @ui) || (self.ui = UI::Shell.new)
    end

    def ui=(ui)
      Bundler.rubygems.ui = UI::RGProxy.new(ui)
      @ui = ui
    end

    # Returns absolute path of where gems are installed on the filesystem.
    def bundle_path
      @bundle_path ||= Pathname.new(configured_bundle_path.path).expand_path(root)
    end

    def create_bundle_path
      SharedHelpers.filesystem_access(bundle_path.to_s) do |p|
        mkdir_p(p)
      end unless bundle_path.exist?

      @bundle_path = bundle_path.realpath
    rescue Errno::EEXIST
      raise PathError, "Could not install to path `#{bundle_path}` " \
        "because a file already exists at that path. Either remove or rename the file so the directory can be created."
    end

    def configured_bundle_path
      @configured_bundle_path ||= settings.path.tap(&:validate!)
    end

    # Returns absolute location of where binstubs are installed to.
    def bin_path
      @bin_path ||= begin
        path = settings[:bin] || "bin"
        path = Pathname.new(path).expand_path(root).expand_path
        SharedHelpers.filesystem_access(path) {|p| FileUtils.mkdir_p(p) }
        path
      end
    end

    # Turns on the Bundler runtime. After +Bundler.setup+ call, all +load+ or
    # +require+ of the gems would be allowed only if they are part of
    # the Gemfile or Ruby's standard library. If the versions specified
    # in Gemfile, only those versions would be loaded.
    #
    # Assuming Gemfile
    #
    #    gem 'first_gem', '= 1.0'
    #    group :test do
    #      gem 'second_gem', '= 1.0'
    #    end
    #
    # The code using Bundler.setup works as follows:
    #
    #    require 'third_gem' # allowed, required from global gems
    #    require 'first_gem' # allowed, loads the last installed version
    #    Bundler.setup
    #    require 'fourth_gem' # fails with LoadError
    #    require 'second_gem' # loads exactly version 1.0
    #
    # +Bundler.setup+ can be called only once, all subsequent calls are no-op.
    #
    # If _groups_ list is provided, only gems from specified groups would
    # be allowed (gems specified outside groups belong to special +:default+ group).
    #
    # To require all gems from Gemfile (or only some groups), see Bundler.require.
    #
    def setup(*groups)
      # Return if all groups are already loaded
      return @setup if defined?(@setup) && @setup

      definition.validate_runtime!

      SharedHelpers.print_major_deprecations!

      if groups.empty?
        # Load all groups, but only once
        @setup = load.setup
      else
        load.setup(*groups)
      end
    end

    # Setups Bundler environment (see Bundler.setup) if it is not already set,
    # and loads all gems from groups specified. Unlike ::setup, can be called
    # multiple times with different groups (if they were allowed by setup).
    #
    # Assuming Gemfile
    #
    #    gem 'first_gem', '= 1.0'
    #    group :test do
    #      gem 'second_gem', '= 1.0'
    #    end
    #
    # The code will work as follows:
    #
    #    Bundler.setup # allow all groups
    #    Bundler.require(:default) # requires only first_gem
    #    # ...later
    #    Bundler.require(:test)   # requires second_gem
    #
    def require(*groups)
      setup(*groups).require(*groups)
    end

    def load
      @load ||= Runtime.new(root, definition)
    end

    def environment
      SharedHelpers.major_deprecation 2, "Bundler.environment has been removed in favor of Bundler.load", :print_caller_location => true
      load
    end

    # Returns an instance of Bundler::Definition for given Gemfile and lockfile
    #
    # @param unlock [Hash, Boolean, nil] Gems that have been requested
    #   to be updated or true if all gems should be updated
    # @return [Bundler::Definition]
    def definition(unlock = nil)
      @definition = nil if unlock
      @definition ||= begin
        configure
        Definition.build(default_gemfile, default_lockfile, unlock)
      end
    end

    def frozen_bundle?
      frozen = settings[:deployment]
      frozen ||= settings[:frozen]
      frozen
    end

    def locked_gems
      @locked_gems ||=
        if defined?(@definition) && @definition
          definition.locked_gems
        elsif Bundler.default_lockfile.file?
          lock = Bundler.read_file(Bundler.default_lockfile)
          LockfileParser.new(lock)
        end
    end

    def most_specific_locked_platform?(platform)
      return false unless defined?(@definition) && @definition

      definition.most_specific_locked_platform == platform
    end

    def ruby_scope
      "#{Bundler.rubygems.ruby_engine}/#{RbConfig::CONFIG["ruby_version"]}"
    end

    def user_home
      @user_home ||= begin
        home = Bundler.rubygems.user_home
        bundle_home = home ? File.join(home, ".bundle") : nil

        warning = if home.nil?
          "Your home directory is not set."
        elsif !File.directory?(home)
          "`#{home}` is not a directory."
        elsif !File.writable?(home) && (!File.directory?(bundle_home) || !File.writable?(bundle_home))
          "`#{home}` is not writable."
        end

        if warning
          Bundler.ui.warn "#{warning}\n"
          user_home = tmp_home_path
          Bundler.ui.warn "Bundler will use `#{user_home}' as your home directory temporarily.\n"
          user_home
        else
          Pathname.new(home)
        end
      end
    end

    def user_bundle_path(dir = "home")
      env_var, fallback = case dir
                          when "home"
                            ["BUNDLE_USER_HOME", proc { Pathname.new(user_home).join(".bundle") }]
                          when "cache"
                            ["BUNDLE_USER_CACHE", proc { user_bundle_path.join("cache") }]
                          when "config"
                            ["BUNDLE_USER_CONFIG", proc { user_bundle_path.join("config") }]
                          when "plugin"
                            ["BUNDLE_USER_PLUGIN", proc { user_bundle_path.join("plugin") }]
                          else
                            raise BundlerError, "Unknown user path requested: #{dir}"
      end
      # `fallback` will already be a Pathname, but Pathname.new() is
      # idempotent so it's OK
      Pathname.new(ENV.fetch(env_var, &fallback))
    end

    def user_cache
      user_bundle_path("cache")
    end

    def home
      bundle_path.join("bundler")
    end

    def install_path
      home.join("gems")
    end

    def specs_path
      bundle_path.join("specifications")
    end

    def root
      @root ||= begin
                  SharedHelpers.root
                rescue GemfileNotFound
                  bundle_dir = default_bundle_dir
                  raise GemfileNotFound, "Could not locate Gemfile or .bundle/ directory" unless bundle_dir
                  Pathname.new(File.expand_path("..", bundle_dir))
                end
    end

    def app_config_path
      if app_config = ENV["BUNDLE_APP_CONFIG"]
        app_config_pathname = Pathname.new(app_config)

        if app_config_pathname.absolute?
          app_config_pathname
        else
          app_config_pathname.expand_path(root)
        end
      else
        root.join(".bundle")
      end
    end

    def app_cache(custom_path = nil)
      path = custom_path || root
      Pathname.new(path).join(settings.app_cache_path)
    end

    def tmp(name = Process.pid.to_s)
      Kernel.send(:require, "tmpdir")
      Pathname.new(Dir.mktmpdir(["bundler", name]))
    end

    def rm_rf(path)
      FileUtils.remove_entry_secure(path) if path && File.exist?(path)
    rescue ArgumentError
      message = <<EOF
It is a security vulnerability to allow your home directory to be world-writable, and bundler cannot continue.
You should probably consider fixing this issue by running `chmod o-w ~` on *nix.
Please refer to https://ruby-doc.org/stdlib-3.1.2/libdoc/fileutils/rdoc/FileUtils.html#method-c-remove_entry_secure for details.
EOF
      File.world_writable?(path) ? Bundler.ui.warn(message) : raise
      raise PathError, "Please fix the world-writable issue with your #{path} directory"
    end

    def settings
      @settings ||= Settings.new(app_config_path)
    rescue GemfileNotFound
      @settings = Settings.new(Pathname.new(".bundle").expand_path)
    end

    # @return [Hash] Environment present before Bundler was activated
    def original_env
      ORIGINAL_ENV.clone
    end

    # @deprecated Use `unbundled_env` instead
    def clean_env
      Bundler::SharedHelpers.major_deprecation(
        2,
        "`Bundler.clean_env` has been deprecated in favor of `Bundler.unbundled_env`. " \
        "If you instead want the environment before bundler was originally loaded, use `Bundler.original_env`",
        :print_caller_location => true
      )

      unbundled_env
    end

    # @return [Hash] Environment with all bundler-related variables removed
    def unbundled_env
      env = original_env

      if env.key?("BUNDLER_ORIG_MANPATH")
        env["MANPATH"] = env["BUNDLER_ORIG_MANPATH"]
      end

      env.delete_if {|k, _| k[0, 7] == "BUNDLE_" }

      if env.key?("RUBYOPT")
        rubyopt = env["RUBYOPT"].split(" ")
        rubyopt.delete("-r#{File.expand_path("bundler/setup", __dir__)}")
        rubyopt.delete("-rbundler/setup")
        env["RUBYOPT"] = rubyopt.join(" ")
      end

      if env.key?("RUBYLIB")
        rubylib = env["RUBYLIB"].split(File::PATH_SEPARATOR)
        rubylib.delete(__dir__)
        env["RUBYLIB"] = rubylib.join(File::PATH_SEPARATOR)
      end

      env
    end

    # Run block with environment present before Bundler was activated
    def with_original_env
      with_env(original_env) { yield }
    end

    # @deprecated Use `with_unbundled_env` instead
    def with_clean_env
      Bundler::SharedHelpers.major_deprecation(
        2,
        "`Bundler.with_clean_env` has been deprecated in favor of `Bundler.with_unbundled_env`. " \
        "If you instead want the environment before bundler was originally loaded, use `Bundler.with_original_env`",
        :print_caller_location => true
      )

      with_env(unbundled_env) { yield }
    end

    # Run block with all bundler-related variables removed
    def with_unbundled_env
      with_env(unbundled_env) { yield }
    end

    # Run subcommand with the environment present before Bundler was activated
    def original_system(*args)
      with_original_env { Kernel.system(*args) }
    end

    # @deprecated Use `unbundled_system` instead
    def clean_system(*args)
      Bundler::SharedHelpers.major_deprecation(
        2,
        "`Bundler.clean_system` has been deprecated in favor of `Bundler.unbundled_system`. " \
        "If you instead want to run the command in the environment before bundler was originally loaded, use `Bundler.original_system`",
        :print_caller_location => true
      )

      with_env(unbundled_env) { Kernel.system(*args) }
    end

    # Run subcommand in an environment with all bundler related variables removed
    def unbundled_system(*args)
      with_unbundled_env { Kernel.system(*args) }
    end

    # Run a `Kernel.exec` to a subcommand with the environment present before Bundler was activated
    def original_exec(*args)
      with_original_env { Kernel.exec(*args) }
    end

    # @deprecated Use `unbundled_exec` instead
    def clean_exec(*args)
      Bundler::SharedHelpers.major_deprecation(
        2,
        "`Bundler.clean_exec` has been deprecated in favor of `Bundler.unbundled_exec`. " \
        "If you instead want to exec to a command in the environment before bundler was originally loaded, use `Bundler.original_exec`",
        :print_caller_location => true
      )

      with_env(unbundled_env) { Kernel.exec(*args) }
    end

    # Run a `Kernel.exec` to a subcommand in an environment with all bundler related variables removed
    def unbundled_exec(*args)
      with_env(unbundled_env) { Kernel.exec(*args) }
    end

    def local_platform
      return Gem::Platform::RUBY if settings[:force_ruby_platform] || Gem.platforms == [Gem::Platform::RUBY]
      Gem::Platform.local
    end

    def default_gemfile
      SharedHelpers.default_gemfile
    end

    def default_lockfile
      SharedHelpers.default_lockfile
    end

    def default_bundle_dir
      SharedHelpers.default_bundle_dir
    end

    def system_bindir
      # Gem.bindir doesn't always return the location that RubyGems will install
      # system binaries. If you put '-n foo' in your .gemrc, RubyGems will
      # install binstubs there instead. Unfortunately, RubyGems doesn't expose
      # that directory at all, so rather than parse .gemrc ourselves, we allow
      # the directory to be set as well, via `bundle config set --local bindir foo`.
      Bundler.settings[:system_bindir] || Bundler.rubygems.gem_bindir
    end

    def preferred_gemfile_name
      Bundler.settings[:init_gems_rb] ? "gems.rb" : "Gemfile"
    end

    def use_system_gems?
      configured_bundle_path.use_system_gems?
    end

    def requires_sudo?
      return @requires_sudo if defined?(@requires_sudo_ran)

      sudo_present = which "sudo" if settings.allow_sudo?

      if sudo_present
        # the bundle path and subdirectories need to be writable for RubyGems
        # to be able to unpack and install gems without exploding
        path = bundle_path
        path = path.parent until path.exist?

        # bins are written to a different location on OS X
        bin_dir = Pathname.new(Bundler.system_bindir)
        bin_dir = bin_dir.parent until bin_dir.exist?

        # if any directory is not writable, we need sudo
        files = [path, bin_dir] | Dir[bundle_path.join("build_info/*").to_s] | Dir[bundle_path.join("*").to_s]
        unwritable_files = files.reject {|f| File.writable?(f) }
        sudo_needed = !unwritable_files.empty?
        if sudo_needed
          Bundler.ui.warn "Following files may not be writable, so sudo is needed:\n  #{unwritable_files.map(&:to_s).sort.join("\n  ")}"
        end
      end

      @requires_sudo_ran = true
      @requires_sudo = settings.allow_sudo? && sudo_present && sudo_needed
    end

    def mkdir_p(path, options = {})
      if requires_sudo? && !options[:no_sudo]
        sudo "mkdir -p '#{path}'" unless File.exist?(path)
      else
        SharedHelpers.filesystem_access(path, :write) do |p|
          FileUtils.mkdir_p(p)
        end
      end
    end

    def which(executable)
      if File.file?(executable) && File.executable?(executable)
        executable
      elsif paths = ENV["PATH"]
        quote = '"'.freeze
        paths.split(File::PATH_SEPARATOR).find do |path|
          path = path[1..-2] if path.start_with?(quote) && path.end_with?(quote)
          executable_path = File.expand_path(executable, path)
          return executable_path if File.file?(executable_path) && File.executable?(executable_path)
        end
      end
    end

    def sudo(str)
      SUDO_MUTEX.synchronize do
        prompt = "\n\n" + <<-PROMPT.gsub(/^ {6}/, "").strip + " "
        Your user account isn't allowed to install to the system RubyGems.
        You can cancel this installation and run:

            bundle config set --local path 'vendor/bundle'
            bundle install

        to install the gems into ./vendor/bundle/, or you can enter your password
        and install the bundled gems to RubyGems using sudo.

        Password:
        PROMPT

        unless @prompted_for_sudo ||= system(%(sudo -k -p "#{prompt}" true))
          raise SudoNotPermittedError,
            "Bundler requires sudo access to install at the moment. " \
            "Try installing again, granting Bundler sudo access when prompted, or installing into a different path."
        end

        `sudo -p "#{prompt}" #{str}`
      end
    end

    def read_file(file)
      SharedHelpers.filesystem_access(file, :read) do
        File.open(file, "r:UTF-8", &:read)
      end
    end

    def load_marshal(data)
      Marshal.load(data)
    rescue TypeError => e
      raise MarshalError, "#{e.class}: #{e.message}"
    end

    def load_gemspec(file, validate = false)
      @gemspec_cache ||= {}
      key = File.expand_path(file)
      @gemspec_cache[key] ||= load_gemspec_uncached(file, validate)
      # Protect against caching side-effected gemspecs by returning a
      # new instance each time.
      @gemspec_cache[key].dup if @gemspec_cache[key]
    end

    def load_gemspec_uncached(file, validate = false)
      path = Pathname.new(file)
      contents = read_file(file)
      spec = if contents.start_with?("---") # YAML header
        eval_yaml_gemspec(path, contents)
      else
        # Eval the gemspec from its parent directory, because some gemspecs
        # depend on "./" relative paths.
        SharedHelpers.chdir(path.dirname.to_s) do
          eval_gemspec(path, contents)
        end
      end
      return unless spec
      spec.loaded_from = path.expand_path.to_s
      Bundler.rubygems.validate(spec) if validate
      spec
    end

    def clear_gemspec_cache
      @gemspec_cache = {}
    end

    def git_present?
      return @git_present if defined?(@git_present)
      @git_present = Bundler.which("git") || Bundler.which("git.exe")
    end

    def feature_flag
      @feature_flag ||= FeatureFlag.new(VERSION)
    end

    def reset!
      reset_paths!
      Plugin.reset!
      reset_rubygems!
    end

    def reset_settings_and_root!
      @settings = nil
      @root = nil
    end

    def reset_paths!
      @bin_path = nil
      @bundler_major_version = nil
      @bundle_path = nil
      @configured = nil
      @configured_bundle_path = nil
      @definition = nil
      @load = nil
      @locked_gems = nil
      @root = nil
      @settings = nil
      @setup = nil
      @user_home = nil
    end

    def reset_rubygems!
      return unless defined?(@rubygems) && @rubygems
      rubygems.undo_replacements
      rubygems.reset
      @rubygems = nil
    end

    def configure_gem_home_and_path(path = bundle_path)
      configure_gem_path
      configure_gem_home(path)
      Bundler.rubygems.clear_paths
    end

    def self_manager
      @self_manager ||= begin
                          require_relative "bundler/self_manager"
                          Bundler::SelfManager.new
                        end
    end

    private

    def eval_yaml_gemspec(path, contents)
      Kernel.require "psych"

      Gem::Specification.from_yaml(contents)
    rescue ::Psych::SyntaxError, ArgumentError, Gem::EndOfYAMLException, Gem::Exception
      eval_gemspec(path, contents)
    end

    def eval_gemspec(path, contents)
      eval(contents, TOPLEVEL_BINDING.dup, path.expand_path.to_s)
    rescue ScriptError, StandardError => e
      msg = "There was an error while loading `#{path.basename}`: #{e.message}"

      raise GemspecError, Dsl::DSLError.new(msg, path, e.backtrace, contents)
    end

    def configure_gem_path
      unless use_system_gems?
        # this needs to be empty string to cause
        # PathSupport.split_gem_path to only load up the
        # Bundler --path setting as the GEM_PATH.
        Bundler::SharedHelpers.set_env "GEM_PATH", ""
      end
    end

    def configure_gem_home(path)
      Bundler::SharedHelpers.set_env "GEM_HOME", path.to_s
    end

    def tmp_home_path
      Kernel.send(:require, "tmpdir")
      SharedHelpers.filesystem_access(Dir.tmpdir) do
        path = Bundler.tmp
        at_exit { Bundler.rm_rf(path) }
        path
      end
    end

    # @param env [Hash]
    def with_env(env)
      backup = ENV.to_hash
      ENV.replace(env)
      yield
    ensure
      ENV.replace(backup)
    end
  end
end
PK}$[
i	��gems/gems/rdoc-6.4.1.1/exe/rdocnuȯ��#!/opt/alt/ruby31/bin/ruby
#
#  RDoc: Documentation tool for source code
#        (see lib/rdoc/rdoc.rb for more information)
#
#  Copyright (c) 2003 Dave Thomas
#  Released under the same terms as Ruby

begin
  gem 'rdoc'
rescue NameError => e # --disable-gems
  raise unless e.name == :gem
rescue Gem::LoadError
end

require 'rdoc/rdoc'

begin
  r = RDoc::RDoc.new
  r.document ARGV
rescue Errno::ENOSPC
  $stderr.puts 'Ran out of space creating documentation'
  $stderr.puts
  $stderr.puts 'Please free up some space and try again'
rescue SystemExit
  raise
rescue Exception => e
  if $DEBUG_RDOC then
    $stderr.puts e.message
    $stderr.puts "#{e.backtrace.join "\n\t"}"
    $stderr.puts
  elsif Interrupt === e then
    $stderr.puts
    $stderr.puts 'Interrupted'
  else
    $stderr.puts "uh-oh! RDoc had a problem:"
    $stderr.puts e.message
    $stderr.puts
    $stderr.puts "run with --debug for full backtrace"
  end

  exit 1
end

PK}$[�7r��gems/gems/rdoc-6.4.1.1/exe/rinuȯ��#!/opt/alt/ruby31/bin/ruby

begin
  gem 'rdoc'
rescue NameError => e # --disable-gems
  raise unless e.name == :gem
rescue Gem::LoadError
end

require 'rdoc/ri/driver'

RDoc::RI::Driver.run ARGV
PK}$[�X��MM*gems/gems/rdoc-6.4.1.1/lib/rdoc/version.rbnu�[���module RDoc

  ##
  # RDoc version you are using

  VERSION = '6.4.1.1'

end
PK}$[��p��1gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/heading.rbnu�[���# frozen_string_literal: true
##
# A heading with a level (1-6) and text

RDoc::Markup::Heading =
  Struct.new :level, :text do

  @to_html = nil
  @to_label = nil

  ##
  # A singleton RDoc::Markup::ToLabel formatter for headings.

  def self.to_label
    @to_label ||= RDoc::Markup::ToLabel.new
  end

  ##
  # A singleton plain HTML formatter for headings.  Used for creating labels
  # for the Table of Contents

  def self.to_html
    return @to_html if @to_html

    markup = RDoc::Markup.new
    markup.add_regexp_handling RDoc::CrossReference::CROSSREF_REGEXP, :CROSSREF

    @to_html = RDoc::Markup::ToHtml.new nil

    def @to_html.handle_regexp_CROSSREF target
      target.text.sub(/^\\/, '')
    end

    @to_html
  end

  ##
  # Calls #accept_heading on +visitor+

  def accept visitor
    visitor.accept_heading self
  end

  ##
  # An HTML-safe anchor reference for this header.

  def aref
    "label-#{self.class.to_label.convert text.dup}"
  end

  ##
  # Creates a fully-qualified label which will include the label from
  # +context+.  This helps keep ids unique in HTML.

  def label context = nil
    label = aref

    label = [context.aref, label].compact.join '-' if
      context and context.respond_to? :aref

    label
  end

  ##
  # HTML markup of the text of this label without the surrounding header
  # element.

  def plain_html
    self.class.to_html.to_html(text.dup)
  end

  def pretty_print q # :nodoc:
    q.group 2, "[head: #{level} ", ']' do
      q.pp text
    end
  end

end

PK}$[�ھ��4gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/attributes.rbnu�[���# frozen_string_literal: true
##
# We manage a set of attributes.  Each attribute has a symbol name and a bit
# value.

class RDoc::Markup::Attributes

  ##
  # The regexp handling attribute type. See RDoc::Markup#add_regexp_handling

  attr_reader :regexp_handling

  ##
  # Creates a new attributes set.

  def initialize
    @regexp_handling = 1

    @name_to_bitmap = [
      [:_REGEXP_HANDLING_, @regexp_handling],
    ]

    @next_bitmap = @regexp_handling << 1
  end

  ##
  # Returns a unique bit for +name+

  def bitmap_for name
    bitmap = @name_to_bitmap.assoc name

    unless bitmap then
      bitmap = @next_bitmap
      @next_bitmap <<= 1
      @name_to_bitmap << [name, bitmap]
    else
      bitmap = bitmap.last
    end

    bitmap
  end

  ##
  # Returns a string representation of +bitmap+

  def as_string bitmap
    return 'none' if bitmap.zero?
    res = []

    @name_to_bitmap.each do |name, bit|
      res << name if (bitmap & bit) != 0
    end

    res.join ','
  end

  ##
  # yields each attribute name in +bitmap+

  def each_name_of bitmap
    return enum_for __method__, bitmap unless block_given?

    @name_to_bitmap.each do |name, bit|
      next if bit == @regexp_handling

      yield name.to_s if (bitmap & bit) != 0
    end
  end

end

PK}$[��ԄEE.gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/list.rbnu�[���# frozen_string_literal: true
##
# A List is a homogeneous set of ListItems.
#
# The supported list types include:
#
# :BULLET::
#   An unordered list
# :LABEL::
#   An unordered definition list, but using an alternate RDoc::Markup syntax
# :LALPHA::
#   An ordered list using increasing lowercase English letters
# :NOTE::
#   An unordered definition list
# :NUMBER::
#   An ordered list using increasing Arabic numerals
# :UALPHA::
#   An ordered list using increasing uppercase English letters
#
# Definition lists behave like HTML definition lists.  Each list item can
# describe multiple terms.  See RDoc::Markup::ListItem for how labels and
# definition are stored as list items.

class RDoc::Markup::List

  ##
  # The list's type

  attr_accessor :type

  ##
  # Items in the list

  attr_reader :items

  ##
  # Creates a new list of +type+ with +items+.  Valid list types are:
  # +:BULLET+, +:LABEL+, +:LALPHA+, +:NOTE+, +:NUMBER+, +:UALPHA+

  def initialize type = nil, *items
    @type = type
    @items = []
    @items.concat items
  end

  ##
  # Appends +item+ to the list

  def << item
    @items << item
  end

  def == other # :nodoc:
    self.class == other.class and
      @type == other.type and
      @items == other.items
  end

  ##
  # Runs this list and all its #items through +visitor+

  def accept visitor
    visitor.accept_list_start self

    @items.each do |item|
      item.accept visitor
    end

    visitor.accept_list_end self
  end

  ##
  # Is the list empty?

  def empty?
    @items.empty?
  end

  ##
  # Returns the last item in the list

  def last
    @items.last
  end

  def pretty_print q # :nodoc:
    q.group 2, "[list: #{@type} ", ']' do
      q.seplist @items do |item|
        q.pp item
      end
    end
  end

  ##
  # Appends +items+ to the list

  def push *items
    @items.concat items
  end

end

PK}$[hP)1��=gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_joined_paragraph.rbnu�[���# frozen_string_literal: true
##
# Joins the parts of an RDoc::Markup::Paragraph into a single String.
#
# This allows for easier maintenance and testing of Markdown support.
#
# This formatter only works on Paragraph instances.  Attempting to process
# other markup syntax items will not work.

class RDoc::Markup::ToJoinedParagraph < RDoc::Markup::Formatter

  def initialize # :nodoc:
    super nil
  end

  def start_accepting # :nodoc:
  end

  def end_accepting # :nodoc:
  end

  ##
  # Converts the parts of +paragraph+ to a single entry.

  def accept_paragraph paragraph
    parts = paragraph.parts.chunk do |part|
      String === part
    end.map do |string, chunk|
      string ? chunk.join.rstrip : chunk
    end.flatten

    paragraph.parts.replace parts
  end

  alias accept_block_quote     ignore
  alias accept_heading         ignore
  alias accept_list_end        ignore
  alias accept_list_item_end   ignore
  alias accept_list_item_start ignore
  alias accept_list_start      ignore
  alias accept_raw             ignore
  alias accept_rule            ignore
  alias accept_verbatim        ignore
  alias accept_table           ignore

end

PK}$[ �'n�&�&1gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_html.rbnu�[���# frozen_string_literal: true
require 'cgi'

##
# Outputs RDoc markup as HTML.

class RDoc::Markup::ToHtml < RDoc::Markup::Formatter

  include RDoc::Text

  # :section: Utilities

  ##
  # Maps RDoc::Markup::Parser::LIST_TOKENS types to HTML tags

  LIST_TYPE_TO_HTML = {
    :BULLET => ['<ul>',                                      '</ul>'],
    :LABEL  => ['<dl class="rdoc-list label-list">',         '</dl>'],
    :LALPHA => ['<ol style="list-style-type: lower-alpha">', '</ol>'],
    :NOTE   => ['<dl class="rdoc-list note-list">',          '</dl>'],
    :NUMBER => ['<ol>',                                      '</ol>'],
    :UALPHA => ['<ol style="list-style-type: upper-alpha">', '</ol>'],
  }

  attr_reader :res # :nodoc:
  attr_reader :in_list_entry # :nodoc:
  attr_reader :list # :nodoc:

  ##
  # The RDoc::CodeObject HTML is being generated for.  This is used to
  # generate namespaced URI fragments

  attr_accessor :code_object

  ##
  # Path to this document for relative links

  attr_accessor :from_path

  # :section:

  ##
  # Creates a new formatter that will output HTML

  def initialize options, markup = nil
    super

    @code_object = nil
    @from_path = ''
    @in_list_entry = nil
    @list = nil
    @th = nil
    @hard_break = "<br>\n"

    init_regexp_handlings

    init_tags
  end

  # :section: Regexp Handling
  #
  # These methods are used by regexp handling markup added by RDoc::Markup#add_regexp_handling.

  ##
  # Adds regexp handlings.

  def init_regexp_handlings
    # external links
    @markup.add_regexp_handling(/(?:link:|https?:|mailto:|ftp:|irc:|www\.)\S+\w/,
                                :HYPERLINK)
    init_link_notation_regexp_handlings
  end

  ##
  # Adds regexp handlings about link notations.

  def init_link_notation_regexp_handlings
    add_regexp_handling_RDOCLINK
    add_regexp_handling_TIDYLINK
  end

  def handle_RDOCLINK url # :nodoc:
    case url
    when /^rdoc-ref:/
      $'
    when /^rdoc-label:/
      text = $'

      text = case text
             when /\Alabel-/    then $'
             when /\Afootmark-/ then $'
             when /\Afoottext-/ then $'
             else                    text
             end

      gen_url url, text
    when /^rdoc-image:/
      "<img src=\"#{$'}\">"
    else
      url =~ /\Ardoc-[a-z]+:/

      $'
    end
  end

  ##
  # +target+ is a <code><br></code>

  def handle_regexp_HARD_BREAK target
    '<br>'
  end

  ##
  # +target+ is a potential link.  The following schemes are handled:
  #
  # <tt>mailto:</tt>::
  #   Inserted as-is.
  # <tt>http:</tt>::
  #   Links are checked to see if they reference an image. If so, that image
  #   gets inserted using an <tt><img></tt> tag. Otherwise a conventional
  #   <tt><a href></tt> is used.
  # <tt>link:</tt>::
  #   Reference to a local file relative to the output directory.

  def handle_regexp_HYPERLINK(target)
    url = target.text

    gen_url url, url
  end

  ##
  # +target+ is an rdoc-schemed link that will be converted into a hyperlink.
  #
  # For the +rdoc-ref+ scheme the named reference will be returned without
  # creating a link.
  #
  # For the +rdoc-label+ scheme the footnote and label prefixes are stripped
  # when creating a link.  All other contents will be linked verbatim.

  def handle_regexp_RDOCLINK target
    handle_RDOCLINK target.text
  end

  ##
  # This +target+ is a link where the label is different from the URL
  # <tt>label[url]</tt> or <tt>{long label}[url]</tt>

  def handle_regexp_TIDYLINK(target)
    text = target.text

    return text unless
      text =~ /^\{(.*)\}\[(.*?)\]$/ or text =~ /^(\S+)\[(.*?)\]$/

    label = $1
    url   = $2

    label = handle_RDOCLINK label if /^rdoc-image:/ =~ label

    gen_url url, label
  end

  # :section: Visitor
  #
  # These methods implement the HTML visitor.

  ##
  # Prepares the visitor for HTML generation

  def start_accepting
    @res = []
    @in_list_entry = []
    @list = []
  end

  ##
  # Returns the generated output

  def end_accepting
    @res.join
  end

  ##
  # Adds +block_quote+ to the output

  def accept_block_quote block_quote
    @res << "\n<blockquote>"

    block_quote.parts.each do |part|
      part.accept self
    end

    @res << "</blockquote>\n"
  end

  ##
  # Adds +paragraph+ to the output

  def accept_paragraph paragraph
    @res << "\n<p>"
    text = paragraph.text @hard_break
    text = text.gsub(/\r?\n/, ' ')
    @res << to_html(text)
    @res << "</p>\n"
  end

  ##
  # Adds +verbatim+ to the output

  def accept_verbatim verbatim
    text = verbatim.text.rstrip

    klass = nil

    content = if verbatim.ruby? or parseable? text then
                begin
                  tokens = RDoc::Parser::RipperStateLex.parse text
                  klass  = ' class="ruby"'

                  result = RDoc::TokenStream.to_html tokens
                  result = result + "\n" unless "\n" == result[-1]
                  result
                rescue
                  CGI.escapeHTML text
                end
              else
                CGI.escapeHTML text
              end

    if @options.pipe then
      @res << "\n<pre><code>#{CGI.escapeHTML text}\n</code></pre>\n"
    else
      @res << "\n<pre#{klass}>#{content}</pre>\n"
    end
  end

  ##
  # Adds +rule+ to the output

  def accept_rule rule
    @res << "<hr>\n"
  end

  ##
  # Prepares the visitor for consuming +list+

  def accept_list_start(list)
    @list << list.type
    @res << html_list_name(list.type, true)
    @in_list_entry.push false
  end

  ##
  # Finishes consumption of +list+

  def accept_list_end(list)
    @list.pop
    if tag = @in_list_entry.pop
      @res << tag
    end
    @res << html_list_name(list.type, false) << "\n"
  end

  ##
  # Prepares the visitor for consuming +list_item+

  def accept_list_item_start(list_item)
    if tag = @in_list_entry.last
      @res << tag
    end

    @res << list_item_start(list_item, @list.last)
  end

  ##
  # Finishes consumption of +list_item+

  def accept_list_item_end(list_item)
    @in_list_entry[-1] = list_end_for(@list.last)
  end

  ##
  # Adds +blank_line+ to the output

  def accept_blank_line(blank_line)
    # @res << annotate("<p />") << "\n"
  end

  ##
  # Adds +heading+ to the output.  The headings greater than 6 are trimmed to
  # level 6.

  def accept_heading heading
    level = [6, heading.level].min

    label = heading.label @code_object

    @res << if @options.output_decoration
              "\n<h#{level} id=\"#{label}\">"
            else
              "\n<h#{level}>"
            end
    @res << to_html(heading.text)
    unless @options.pipe then
      @res << "<span><a href=\"##{label}\">&para;</a>"
      @res << " <a href=\"#top\">&uarr;</a></span>"
    end
    @res << "</h#{level}>\n"
  end

  ##
  # Adds +raw+ to the output

  def accept_raw raw
    @res << raw.parts.join("\n")
  end

  ##
  # Adds +table+ to the output

  def accept_table header, body, aligns
    @res << "\n<table role=\"table\">\n<thead>\n<tr>\n"
    header.zip(aligns) do |text, align|
      @res << '<th'
      @res << ' align="' << align << '"' if align
      @res << '>' << CGI.escapeHTML(text) << "</th>\n"
    end
    @res << "</tr>\n</thead>\n<tbody>\n"
    body.each do |row|
      @res << "<tr>\n"
      row.zip(aligns) do |text, align|
        @res << '<td'
        @res << ' align="' << align << '"' if align
        @res << '>' << CGI.escapeHTML(text) << "</td>\n"
      end
      @res << "</tr>\n"
    end
    @res << "</tbody>\n</table>\n"
  end

  # :section: Utilities

  ##
  # CGI-escapes +text+

  def convert_string(text)
    CGI.escapeHTML text
  end

  ##
  # Generate a link to +url+ with content +text+.  Handles the special cases
  # for img: and link: described under handle_regexp_HYPERLINK

  def gen_url url, text
    scheme, url, id = parse_url url

    if %w[http https link].include?(scheme) and
       url =~ /\.(gif|png|jpg|jpeg|bmp)$/ then
      "<img src=\"#{url}\" />"
    else
      if scheme != 'link' and %r%\A((?!https?:)(?:[^/#]*/)*+)([^/#]+)\.(rb|rdoc|md)(?=\z|#)%i =~ url
        url = "#$1#{$2.tr('.', '_')}_#$3.html#$'"
      end

      text = text.sub %r%^#{scheme}:/*%i, ''
      text = text.sub %r%^[*\^](\d+)$%,   '\1'

      link = "<a#{id} href=\"#{url}\">#{text}</a>"

      link = "<sup>#{link}</sup>" if /"foot/ =~ id

      link
    end
  end

  ##
  # Determines the HTML list element for +list_type+ and +open_tag+

  def html_list_name(list_type, open_tag)
    tags = LIST_TYPE_TO_HTML[list_type]
    raise RDoc::Error, "Invalid list type: #{list_type.inspect}" unless tags
    tags[open_tag ? 0 : 1]
  end

  ##
  # Maps attributes to HTML tags

  def init_tags
    add_tag :BOLD, "<strong>", "</strong>"
    add_tag :TT,   "<code>",   "</code>"
    add_tag :EM,   "<em>",     "</em>"
  end

  ##
  # Returns the HTML tag for +list_type+, possible using a label from
  # +list_item+

  def list_item_start(list_item, list_type)
    case list_type
    when :BULLET, :LALPHA, :NUMBER, :UALPHA then
      "<li>"
    when :LABEL, :NOTE then
      Array(list_item.label).map do |label|
        "<dt>#{to_html label}\n"
      end.join << "<dd>"
    else
      raise RDoc::Error, "Invalid list type: #{list_type.inspect}"
    end
  end

  ##
  # Returns the HTML end-tag for +list_type+

  def list_end_for(list_type)
    case list_type
    when :BULLET, :LALPHA, :NUMBER, :UALPHA then
      "</li>"
    when :LABEL, :NOTE then
      "</dd>"
    else
      raise RDoc::Error, "Invalid list type: #{list_type.inspect}"
    end
  end

  ##
  # Returns true if text is valid ruby syntax

  def parseable? text
    verbose, $VERBOSE = $VERBOSE, nil
    eval("BEGIN {return true}\n#{text}")
  rescue SyntaxError
    false
  ensure
    $VERBOSE = verbose
  end

  ##
  # Converts +item+ to HTML using RDoc::Text#to_html

  def to_html item
    super convert_flow @am.flow item
  end

end

PK}$[u�a1��/gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_bs.rbnu�[���# frozen_string_literal: true
##
# Outputs RDoc markup with hot backspace action!  You will probably need a
# pager to use this output format.
#
# This formatter won't work on 1.8.6 because it lacks String#chars.

class RDoc::Markup::ToBs < RDoc::Markup::ToRdoc

  ##
  # Returns a new ToBs that is ready for hot backspace action!

  def initialize markup = nil
    super

    @in_b  = false
    @in_em = false
  end

  ##
  # Sets a flag that is picked up by #annotate to do the right thing in
  # #convert_string

  def init_tags
    add_tag :BOLD, '+b', '-b'
    add_tag :EM,   '+_', '-_'
    add_tag :TT,   ''  , ''   # we need in_tt information maintained
  end

  ##
  # Makes heading text bold.

  def accept_heading heading
    use_prefix or @res << ' ' * @indent
    @res << @headings[heading.level][0]
    @in_b = true
    @res << attributes(heading.text)
    @in_b = false
    @res << @headings[heading.level][1]
    @res << "\n"
  end

  ##
  # Turns on or off regexp handling for +convert_string+

  def annotate tag
    case tag
    when '+b' then @in_b = true
    when '-b' then @in_b = false
    when '+_' then @in_em = true
    when '-_' then @in_em = false
    end
    ''
  end

  ##
  # Calls convert_string on the result of convert_regexp_handling

  def convert_regexp_handling target
    convert_string super
  end

  ##
  # Adds bold or underline mixed with backspaces

  def convert_string string
    return string unless @in_b or @in_em
    chars = if @in_b then
              string.chars.map do |char| "#{char}\b#{char}" end
            elsif @in_em then
              string.chars.map do |char| "_\b#{char}" end
            end

    chars.join
  end

end
PK}$[V���1gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_test.rbnu�[���# frozen_string_literal: true
##
# This Markup outputter is used for testing purposes.

class RDoc::Markup::ToTest < RDoc::Markup::Formatter

  # :stopdoc:

  ##
  # :section: Visitor

  def start_accepting
    @res = []
    @list = []
  end

  def end_accepting
    @res
  end

  def accept_paragraph(paragraph)
    @res << convert_flow(@am.flow(paragraph.text))
  end

  def accept_raw raw
    @res << raw.parts.join
  end

  def accept_verbatim(verbatim)
    @res << verbatim.text.gsub(/^(\S)/, '  \1')
  end

  def accept_list_start(list)
    @list << case list.type
             when :BULLET then
               '*'
             when :NUMBER then
               '1'
             else
               list.type
             end
  end

  def accept_list_end(list)
    @list.pop
  end

  def accept_list_item_start(list_item)
    @res << "#{' ' * (@list.size - 1)}#{@list.last}: "
  end

  def accept_list_item_end(list_item)
  end

  def accept_blank_line(blank_line)
    @res << "\n"
  end

  def accept_heading(heading)
    @res << "#{'=' * heading.level} #{heading.text}"
  end

  def accept_rule(rule)
    @res << '-' * rule.weight
  end

  # :startdoc:

end

PK}$[�����/gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/table.rbnu�[���# frozen_string_literal: true
##
# A section of table

class RDoc::Markup::Table
  attr_accessor :header, :align, :body

  def initialize header, align, body
    @header, @align, @body = header, align, body
  end

  def == other
    self.class == other.class and
      @header == other.header and
      @align == other.align and
      @body == other.body
  end

  def accept visitor
    visitor.accept_table @header, @body, @align
  end

  def pretty_print q # :nodoc:
    q.group 2, '[Table: ', ']' do
      q.group 2, '[Head: ', ']' do
        q.seplist @header.zip(@align) do |text, align|
          q.pp text
          if align
            q.text ":"
            q.breakable
            q.text align.to_s
          end
        end
      end
      q.breakable
      q.group 2, '[Body: ', ']' do
        q.seplist @body do |body|
          q.group 2, '[', ']' do
            q.seplist body do |text|
              q.pp text
            end
          end
        end
      end
    end
  end
end
PK}$[�e�M��9gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_html_snippet.rbnu�[���# frozen_string_literal: true
##
# Outputs RDoc markup as paragraphs with inline markup only.

class RDoc::Markup::ToHtmlSnippet < RDoc::Markup::ToHtml

  ##
  # After this many characters the input will be cut off.

  attr_reader :character_limit

  ##
  # The number of characters seen so far.

  attr_reader :characters # :nodoc:

  ##
  # The attribute bitmask

  attr_reader :mask

  ##
  # After this many paragraphs the input will be cut off.

  attr_reader :paragraph_limit

  ##
  # Count of paragraphs found

  attr_reader :paragraphs

  ##
  # Creates a new ToHtmlSnippet formatter that will cut off the input on the
  # next word boundary after the given number of +characters+ or +paragraphs+
  # of text have been encountered.

  def initialize options, characters = 100, paragraphs = 3, markup = nil
    super options, markup

    @character_limit = characters
    @paragraph_limit = paragraphs

    @characters = 0
    @mask       = 0
    @paragraphs = 0

    @markup.add_regexp_handling RDoc::CrossReference::CROSSREF_REGEXP, :CROSSREF
  end

  ##
  # Adds +heading+ to the output as a paragraph

  def accept_heading heading
    @res << "<p>#{to_html heading.text}\n"

    add_paragraph
  end

  ##
  # Raw sections are untrusted and ignored

  alias accept_raw ignore

  ##
  # Rules are ignored

  alias accept_rule ignore

  def accept_paragraph paragraph
    para = @in_list_entry.last || "<p>"

    text = paragraph.text @hard_break

    @res << "#{para}#{to_html text}\n"

    add_paragraph
  end

  ##
  # Finishes consumption of +list_item+

  def accept_list_item_end list_item
  end

  ##
  # Prepares the visitor for consuming +list_item+

  def accept_list_item_start list_item
    @res << list_item_start(list_item, @list.last)
  end

  ##
  # Prepares the visitor for consuming +list+

  def accept_list_start list
    @list << list.type
    @res << html_list_name(list.type, true)
    @in_list_entry.push ''
  end

  ##
  # Adds +verbatim+ to the output

  def accept_verbatim verbatim
    throw :done if @characters >= @character_limit
    input = verbatim.text.rstrip

    text = truncate input
    text << ' ...' unless text == input

    super RDoc::Markup::Verbatim.new text

    add_paragraph
  end

  ##
  # Prepares the visitor for HTML snippet generation

  def start_accepting
    super

    @characters = 0
  end

  ##
  # Removes escaping from the cross-references in +target+

  def handle_regexp_CROSSREF target
    target.text.sub(/\A\\/, '')
  end

  ##
  # +target+ is a <code><br></code>

  def handle_regexp_HARD_BREAK target
    @characters -= 4
    '<br>'
  end

  ##
  # Lists are paragraphs, but notes and labels have a separator

  def list_item_start list_item, list_type
    throw :done if @characters >= @character_limit

    case list_type
    when :BULLET, :LALPHA, :NUMBER, :UALPHA then
      "<p>"
    when :LABEL, :NOTE then
      labels = Array(list_item.label).map do |label|
        to_html label
      end.join ', '

      labels << " &mdash; " unless labels.empty?

      start = "<p>#{labels}"
      @characters += 1 # try to include the label
      start
    else
      raise RDoc::Error, "Invalid list type: #{list_type.inspect}"
    end
  end

  ##
  # Returns just the text of +link+, +url+ is only used to determine the link
  # type.

  def gen_url url, text
    if url =~ /^rdoc-label:([^:]*)(?::(.*))?/ then
      type = "link"
    elsif url =~ /([A-Za-z]+):(.*)/ then
      type = $1
    else
      type = "http"
    end

    if (type == "http" or type == "https" or type == "link") and
       url =~ /\.(gif|png|jpg|jpeg|bmp)$/ then
      ''
    else
      text.sub(%r%^#{type}:/*%, '')
    end
  end

  ##
  # In snippets, there are no lists

  def html_list_name list_type, open_tag
    ''
  end

  ##
  # Throws +:done+ when paragraph_limit paragraphs have been encountered

  def add_paragraph
    @paragraphs += 1

    throw :done if @paragraphs >= @paragraph_limit
  end

  ##
  # Marks up +content+

  def convert content
    catch :done do
      return super
    end

    end_accepting
  end

  ##
  # Converts flow items +flow+

  def convert_flow flow
    throw :done if @characters >= @character_limit

    res = []
    @mask = 0

    flow.each do |item|
      case item
      when RDoc::Markup::AttrChanger then
        off_tags res, item
        on_tags  res, item
      when String then
        text = convert_string item
        res << truncate(text)
      when RDoc::Markup::RegexpHandling then
        text = convert_regexp_handling item
        res << truncate(text)
      else
        raise "Unknown flow element: #{item.inspect}"
      end

      if @characters >= @character_limit then
        off_tags res, RDoc::Markup::AttrChanger.new(0, @mask)
        break
      end
    end

    res << ' ...' if @characters >= @character_limit

    res.join
  end

  ##
  # Maintains a bitmask to allow HTML elements to be closed properly.  See
  # RDoc::Markup::Formatter.

  def on_tags res, item
    @mask ^= item.turn_on

    super
  end

  ##
  # Maintains a bitmask to allow HTML elements to be closed properly.  See
  # RDoc::Markup::Formatter.

  def off_tags res, item
    @mask ^= item.turn_off

    super
  end

  ##
  # Truncates +text+ at the end of the first word after the character_limit.

  def truncate text
    length = text.length
    characters = @characters
    @characters += length

    return text if @characters < @character_limit

    remaining = @character_limit - characters

    text =~ /\A(.{#{remaining},}?)(\s|$)/m # TODO word-break instead of \s?

    $1
  end

end

PK}$[����<gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/indented_paragraph.rbnu�[���# frozen_string_literal: true
##
# An Indented Paragraph of text

class RDoc::Markup::IndentedParagraph < RDoc::Markup::Raw

  ##
  # The indent in number of spaces

  attr_reader :indent

  ##
  # Creates a new IndentedParagraph containing +parts+ indented with +indent+
  # spaces

  def initialize indent, *parts
    @indent = indent

    super(*parts)
  end

  def == other # :nodoc:
    super and indent == other.indent
  end

  ##
  # Calls #accept_indented_paragraph on +visitor+

  def accept visitor
    visitor.accept_indented_paragraph self
  end

  ##
  # Joins the raw paragraph text and converts inline HardBreaks to the
  # +hard_break+ text followed by the indent.

  def text hard_break = nil
    @parts.map do |part|
      if RDoc::Markup::HardBreak === part then
        '%1$s%3$*2$s' % [hard_break, @indent, ' '] if hard_break
      else
        part
      end
    end.join
  end

end

PK}$[� t{ll5gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_markdown.rbnu�[���# frozen_string_literal: true
# :markup: markdown

##
# Outputs parsed markup as Markdown

class RDoc::Markup::ToMarkdown < RDoc::Markup::ToRdoc

  ##
  # Creates a new formatter that will output Markdown format text

  def initialize markup = nil
    super

    @headings[1] = ['# ',      '']
    @headings[2] = ['## ',     '']
    @headings[3] = ['### ',    '']
    @headings[4] = ['#### ',   '']
    @headings[5] = ['##### ',  '']
    @headings[6] = ['###### ', '']

    add_regexp_handling_RDOCLINK
    add_regexp_handling_TIDYLINK

    @hard_break = "  \n"
  end

  ##
  # Maps attributes to HTML sequences

  def init_tags
    add_tag :BOLD, '**', '**'
    add_tag :EM,   '*',  '*'
    add_tag :TT,   '`',  '`'
  end

  ##
  # Adds a newline to the output

  def handle_regexp_HARD_BREAK target
    "  \n"
  end

  ##
  # Finishes consumption of `list`

  def accept_list_end list
    @res << "\n"

    super
  end

  ##
  # Finishes consumption of `list_item`

  def accept_list_item_end list_item
    width = case @list_type.last
            when :BULLET then
              4
            when :NOTE, :LABEL then
              use_prefix

              4
            else
              @list_index[-1] = @list_index.last.succ
              4
            end

    @indent -= width
  end

  ##
  # Prepares the visitor for consuming `list_item`

  def accept_list_item_start list_item
    type = @list_type.last

    case type
    when :NOTE, :LABEL then
      bullets = Array(list_item.label).map do |label|
        attributes(label).strip
      end.join "\n"

      bullets << "\n:"

      @prefix = ' ' * @indent
      @indent += 4
      @prefix << bullets + (' ' * (@indent - 1))
    else
      bullet = type == :BULLET ? '*' : @list_index.last.to_s + '.'
      @prefix = (' ' * @indent) + bullet.ljust(4)

      @indent += 4
    end
  end

  ##
  # Prepares the visitor for consuming `list`

  def accept_list_start list
    case list.type
    when :BULLET, :LABEL, :NOTE then
      @list_index << nil
    when :LALPHA, :NUMBER, :UALPHA then
      @list_index << 1
    else
      raise RDoc::Error, "invalid list type #{list.type}"
    end

    @list_width << 4
    @list_type << list.type
  end

  ##
  # Adds `rule` to the output

  def accept_rule rule
    use_prefix or @res << ' ' * @indent
    @res << '-' * 3
    @res << "\n"
  end

  ##
  # Outputs `verbatim` indented 4 columns

  def accept_verbatim verbatim
    indent = ' ' * (@indent + 4)

    verbatim.parts.each do |part|
      @res << indent unless part == "\n"
      @res << part
    end

    @res << "\n"
  end

  ##
  # Creates a Markdown-style URL from +url+ with +text+.

  def gen_url url, text
    scheme, url, = parse_url url

    "[#{text.sub(%r{^#{scheme}:/*}i, '')}](#{url})"
  end

  ##
  # Handles <tt>rdoc-</tt> type links for footnotes.

  def handle_rdoc_link url
    case url
    when /^rdoc-ref:/ then
      $'
    when /^rdoc-label:footmark-(\d+)/ then
      "[^#{$1}]:"
    when /^rdoc-label:foottext-(\d+)/ then
      "[^#{$1}]"
    when /^rdoc-label:label-/ then
      gen_url url, $'
    when /^rdoc-image:/ then
      "![](#{$'})"
    when /^rdoc-[a-z]+:/ then
      $'
    end
  end

  ##
  # Converts the RDoc markup tidylink into a Markdown.style link.

  def handle_regexp_TIDYLINK target
    text = target.text

    return text unless text =~ /\{(.*?)\}\[(.*?)\]/ or text =~ /(\S+)\[(.*?)\]/

    label = $1
    url   = $2

    if url =~ /^rdoc-label:foot/ then
      handle_rdoc_link url
    else
      gen_url url, label
    end
  end

  ##
  # Converts the rdoc-...: links into a Markdown.style links.

  def handle_regexp_RDOCLINK target
    handle_rdoc_link target.text
  end

end

PK}$[f�Q`661gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_ansi.rbnu�[���# frozen_string_literal: true
##
# Outputs RDoc markup with vibrant ANSI color!

class RDoc::Markup::ToAnsi < RDoc::Markup::ToRdoc

  ##
  # Creates a new ToAnsi visitor that is ready to output vibrant ANSI color!

  def initialize markup = nil
    super

    @headings.clear
    @headings[1] = ["\e[1;32m", "\e[m"] # bold
    @headings[2] = ["\e[4;32m", "\e[m"] # underline
    @headings[3] = ["\e[32m",   "\e[m"] # just green
  end

  ##
  # Maps attributes to ANSI sequences

  def init_tags
    add_tag :BOLD, "\e[1m", "\e[m"
    add_tag :TT,   "\e[7m", "\e[m"
    add_tag :EM,   "\e[4m", "\e[m"
  end

  ##
  # Overrides indent width to ensure output lines up correctly.

  def accept_list_item_end list_item
    width = case @list_type.last
            when :BULLET then
              2
            when :NOTE, :LABEL then
              if @prefix then
                @res << @prefix.strip
                @prefix = nil
              end

              @res << "\n" unless res.length == 1
              2
            else
              bullet = @list_index.last.to_s
              @list_index[-1] = @list_index.last.succ
              bullet.length + 2
            end

    @indent -= width
  end

  ##
  # Adds coloring to note and label list items

  def accept_list_item_start list_item
    bullet = case @list_type.last
             when :BULLET then
               '*'
             when :NOTE, :LABEL then
               labels = Array(list_item.label).map do |label|
                 attributes(label).strip
               end.join "\n"

               labels << ":\n" unless labels.empty?

               labels
             else
               @list_index.last.to_s + '.'
             end

    case @list_type.last
    when :NOTE, :LABEL then
      @indent += 2
      @prefix = bullet + (' ' * @indent)
    else
      @prefix = (' ' * @indent) + bullet.ljust(bullet.length + 1)

      width = bullet.gsub(/\e\[[\d;]*m/, '').length + 1

      @indent += width
    end
  end

  ##
  # Starts accepting with a reset screen

  def start_accepting
    super

    @res = ["\e[0m"]
  end

end

PK}$[�F�VV2gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_label.rbnu�[���# frozen_string_literal: true
require 'cgi'

##
# Creates HTML-safe labels suitable for use in id attributes.  Tidylinks are
# converted to their link part and cross-reference links have the suppression
# marks removed (\\SomeClass is converted to SomeClass).

class RDoc::Markup::ToLabel < RDoc::Markup::Formatter

  attr_reader :res # :nodoc:

  ##
  # Creates a new formatter that will output HTML-safe labels

  def initialize markup = nil
    super nil, markup

    @markup.add_regexp_handling RDoc::CrossReference::CROSSREF_REGEXP, :CROSSREF
    @markup.add_regexp_handling(/(((\{.*?\})|\b\S+?)\[\S+?\])/, :TIDYLINK)

    add_tag :BOLD, '', ''
    add_tag :TT,   '', ''
    add_tag :EM,   '', ''

    @res = []
  end

  ##
  # Converts +text+ to an HTML-safe label

  def convert text
    label = convert_flow @am.flow text

    CGI.escape(label).gsub('%', '-').sub(/^-/, '')
  end

  ##
  # Converts the CROSSREF +target+ to plain text, removing the suppression
  # marker, if any

  def handle_regexp_CROSSREF target
    text = target.text

    text.sub(/^\\/, '')
  end

  ##
  # Converts the TIDYLINK +target+ to just the text part

  def handle_regexp_TIDYLINK target
    text = target.text

    return text unless text =~ /\{(.*?)\}\[(.*?)\]/ or text =~ /(\S+)\[(.*?)\]/

    $1
  end

  alias accept_blank_line         ignore
  alias accept_block_quote        ignore
  alias accept_heading            ignore
  alias accept_list_end           ignore
  alias accept_list_item_end      ignore
  alias accept_list_item_start    ignore
  alias accept_list_start         ignore
  alias accept_paragraph          ignore
  alias accept_raw                ignore
  alias accept_rule               ignore
  alias accept_verbatim           ignore
  alias end_accepting             ignore
  alias handle_regexp_HARD_BREAK  ignore
  alias start_accepting           ignore

end

PK}$[�C�"==1gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/include.rbnu�[���# frozen_string_literal: true
##
# A file included at generation time.  Objects of this class are created by
# RDoc::RD for an extension-less include.
#
# This implementation in incomplete.

class RDoc::Markup::Include

  ##
  # The filename to be included, without extension

  attr_reader :file

  ##
  # Directories to search for #file

  attr_reader :include_path

  ##
  # Creates a new include that will import +file+ from +include_path+

  def initialize file, include_path
    @file = file
    @include_path = include_path
  end

  def == other # :nodoc:
    self.class === other and
      @file == other.file and @include_path == other.include_path
  end

  def pretty_print q # :nodoc:
    q.group 2, '[incl ', ']' do
      q.text file
      q.breakable
      q.text 'from '
      q.pp include_path
    end
  end

end

PK}$[WY���2gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/document.rbnu�[���# frozen_string_literal: true
##
# A Document containing lists, headings, paragraphs, etc.

class RDoc::Markup::Document

  include Enumerable

  ##
  # The file this document was created from.  See also
  # RDoc::ClassModule#add_comment

  attr_reader :file

  ##
  # If a heading is below the given level it will be omitted from the
  # table_of_contents

  attr_accessor :omit_headings_below

  ##
  # The parts of the Document

  attr_reader :parts

  ##
  # Creates a new Document with +parts+

  def initialize *parts
    @parts = []
    @parts.concat parts

    @file = nil
    @omit_headings_from_table_of_contents_below = nil
  end

  ##
  # Appends +part+ to the document

  def << part
    case part
    when RDoc::Markup::Document then
      unless part.empty? then
        parts.concat part.parts
        parts << RDoc::Markup::BlankLine.new
      end
    when String then
      raise ArgumentError,
            "expected RDoc::Markup::Document and friends, got String" unless
        part.empty?
    else
      parts << part
    end
  end

  def == other # :nodoc:
    self.class == other.class and
      @file == other.file and
      @parts == other.parts
  end

  ##
  # Runs this document and all its #items through +visitor+

  def accept visitor
    visitor.start_accepting

    visitor.accept_document self

    visitor.end_accepting
  end

  ##
  # Concatenates the given +parts+ onto the document

  def concat parts
    self.parts.concat parts
  end

  ##
  # Enumerator for the parts of this document

  def each &block
    @parts.each(&block)
  end

  ##
  # Does this document have no parts?

  def empty?
    @parts.empty? or (@parts.length == 1 and merged? and @parts.first.empty?)
  end

  ##
  # The file this Document was created from.

  def file= location
    @file = case location
            when RDoc::TopLevel then
              location.relative_name
            else
              location
            end
  end

  ##
  # When this is a collection of documents (#file is not set and this document
  # contains only other documents as its direct children) #merge replaces
  # documents in this class with documents from +other+ when the file matches
  # and adds documents from +other+ when the files do not.
  #
  # The information in +other+ is preferred over the receiver

  def merge other
    if empty? then
      @parts = other.parts
      return self
    end

    other.parts.each do |other_part|
      self.parts.delete_if do |self_part|
        self_part.file and self_part.file == other_part.file
      end

      self.parts << other_part
    end

    self
  end

  ##
  # Does this Document contain other Documents?

  def merged?
    RDoc::Markup::Document === @parts.first
  end

  def pretty_print q # :nodoc:
    start = @file ? "[doc (#{@file}): " : '[doc: '

    q.group 2, start, ']' do
      q.seplist @parts do |part|
        q.pp part
      end
    end
  end

  ##
  # Appends +parts+ to the document

  def push *parts
    self.parts.concat parts
  end

  ##
  # Returns an Array of headings in the document.
  #
  # Require 'rdoc/markup/formatter' before calling this method.

  def table_of_contents
    accept RDoc::Markup::ToTableOfContents.to_toc
  end

end

PK}$[�fcr��3gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/list_item.rbnu�[���# frozen_string_literal: true
##
# An item within a List that contains paragraphs, headings, etc.
#
# For BULLET, NUMBER, LALPHA and UALPHA lists, the label will always be nil.
# For NOTE and LABEL lists, the list label may contain:
#
# * a single String for a single label
# * an Array of Strings for a list item with multiple terms
# * nil for an extra description attached to a previously labeled list item

class RDoc::Markup::ListItem

  ##
  # The label for the ListItem

  attr_accessor :label

  ##
  # Parts of the ListItem

  attr_reader :parts

  ##
  # Creates a new ListItem with an optional +label+ containing +parts+

  def initialize label = nil, *parts
    @label = label
    @parts = []
    @parts.concat parts
  end

  ##
  # Appends +part+ to the ListItem

  def << part
    @parts << part
  end

  def == other # :nodoc:
    self.class == other.class and
      @label == other.label and
      @parts == other.parts
  end

  ##
  # Runs this list item and all its #parts through +visitor+

  def accept visitor
    visitor.accept_list_item_start self

    @parts.each do |part|
      part.accept visitor
    end

    visitor.accept_list_item_end self
  end

  ##
  # Is the ListItem empty?

  def empty?
    @parts.empty?
  end

  ##
  # Length of parts in the ListItem

  def length
    @parts.length
  end

  def pretty_print q # :nodoc:
    q.group 2, '[item: ', ']' do
      case @label
      when Array then
        q.pp @label
        q.text ';'
        q.breakable
      when String then
        q.pp @label
        q.text ';'
        q.breakable
      end

      q.seplist @parts do |part|
        q.pp part
      end
    end
  end

  ##
  # Adds +parts+ to the ListItem

  def push *parts
    @parts.concat parts
  end

end

PK}$[���;;.gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/rule.rbnu�[���# frozen_string_literal: true
##
# A horizontal rule with a weight

class RDoc::Markup::Rule < Struct.new :weight

  ##
  # Calls #accept_rule on +visitor+

  def accept visitor
    visitor.accept_rule self
  end

  def pretty_print q # :nodoc:
    q.group 2, '[rule:', ']' do
      q.pp weight
    end
  end

end

PK}$[ߦo��6gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/attr_changer.rbnu�[���# frozen_string_literal: true
class RDoc::Markup

  AttrChanger = Struct.new :turn_on, :turn_off # :nodoc:

end

##
# An AttrChanger records a change in attributes. It contains a bitmap of the
# attributes to turn on, and a bitmap of those to turn off.

class RDoc::Markup::AttrChanger

  def to_s # :nodoc:
    "Attr: +#{turn_on}/-#{turn_off}"
  end

  def inspect # :nodoc:
    '+%d/-%d' % [turn_on, turn_off]
  end

end

PK}$[%�F��3gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/formatter.rbnu�[���# frozen_string_literal: true
##
# Base class for RDoc markup formatters
#
# Formatters are a visitor that converts an RDoc::Markup tree (from a comment)
# into some kind of output.  RDoc ships with formatters for converting back to
# rdoc, ANSI text, HTML, a Table of Contents and other formats.
#
# If you'd like to write your own Formatter use
# RDoc::Markup::FormatterTestCase.  If you're writing a text-output formatter
# use RDoc::Markup::TextFormatterTestCase which provides extra test cases.

class RDoc::Markup::Formatter

  ##
  # Tag for inline markup containing a +bit+ for the bitmask and the +on+ and
  # +off+ triggers.

  InlineTag = Struct.new(:bit, :on, :off)

  ##
  # Converts a target url to one that is relative to a given path

  def self.gen_relative_url path, target
    from        = File.dirname path
    to, to_file = File.split target

    from = from.split "/"
    to   = to.split "/"

    from.delete '.'
    to.delete '.'

    while from.size > 0 and to.size > 0 and from[0] == to[0] do
      from.shift
      to.shift
    end

    from.fill ".."
    from.concat to
    from << to_file
    File.join(*from)
  end

  ##
  # Creates a new Formatter

  def initialize options, markup = nil
    @options = options

    @markup = markup || RDoc::Markup.new
    @am     = @markup.attribute_manager
    @am.add_regexp_handling(/<br>/, :HARD_BREAK)

    @attributes = @am.attributes

    @attr_tags = []

    @in_tt = 0
    @tt_bit = @attributes.bitmap_for :TT

    @hard_break = ''
    @from_path = '.'
  end

  ##
  # Adds +document+ to the output

  def accept_document document
    document.parts.each do |item|
      case item
      when RDoc::Markup::Document then # HACK
        accept_document item
      else
        item.accept self
      end
    end
  end

  ##
  # Adds a regexp handling for links of the form rdoc-...:

  def add_regexp_handling_RDOCLINK
    @markup.add_regexp_handling(/rdoc-[a-z]+:[^\s\]]+/, :RDOCLINK)
  end

  ##
  # Adds a regexp handling for links of the form {<text>}[<url>] and
  # <word>[<url>]

  def add_regexp_handling_TIDYLINK
    @markup.add_regexp_handling(/(?:
                                  \{.*?\} |    # multi-word label
                                  \b[^\s{}]+? # single-word label
                                 )

                                 \[\S+?\]     # link target
                                /x, :TIDYLINK)
  end

  ##
  # Add a new set of tags for an attribute. We allow separate start and end
  # tags for flexibility

  def add_tag(name, start, stop)
    attr = @attributes.bitmap_for name
    @attr_tags << InlineTag.new(attr, start, stop)
  end

  ##
  # Allows +tag+ to be decorated with additional information.

  def annotate(tag)
    tag
  end

  ##
  # Marks up +content+

  def convert content
    @markup.convert content, self
  end

  ##
  # Converts flow items +flow+

  def convert_flow(flow)
    res = []

    flow.each do |item|
      case item
      when String then
        res << convert_string(item)
      when RDoc::Markup::AttrChanger then
        off_tags res, item
        on_tags res, item
      when RDoc::Markup::RegexpHandling then
        res << convert_regexp_handling(item)
      else
        raise "Unknown flow element: #{item.inspect}"
      end
    end

    res.join
  end

  ##
  # Converts added regexp handlings. See RDoc::Markup#add_regexp_handling

  def convert_regexp_handling target
    return target.text if in_tt?

    handled = false

    @attributes.each_name_of target.type do |name|
      method_name = "handle_regexp_#{name}"

      if respond_to? method_name then
        target.text = public_send method_name, target
        handled = true
      end
    end

    unless handled then
      target_name = @attributes.as_string target.type

      raise RDoc::Error, "Unhandled regexp handling #{target_name}: #{target}"
    end

    target.text
  end

  ##
  # Converts a string to be fancier if desired

  def convert_string string
    string
  end

  ##
  # Use ignore in your subclass to ignore the content of a node.
  #
  #   ##
  #   # We don't support raw nodes in ToNoRaw
  #
  #   alias accept_raw ignore

  def ignore *node
  end

  ##
  # Are we currently inside tt tags?

  def in_tt?
    @in_tt > 0
  end

  ##
  # Turns on tags for +item+ on +res+

  def on_tags res, item
    attr_mask = item.turn_on
    return if attr_mask.zero?

    @attr_tags.each do |tag|
      if attr_mask & tag.bit != 0 then
        res << annotate(tag.on)
        @in_tt += 1 if tt? tag
      end
    end
  end

  ##
  # Turns off tags for +item+ on +res+

  def off_tags res, item
    attr_mask = item.turn_off
    return if attr_mask.zero?

    @attr_tags.reverse_each do |tag|
      if attr_mask & tag.bit != 0 then
        @in_tt -= 1 if tt? tag
        res << annotate(tag.off)
      end
    end
  end

  ##
  # Extracts and a scheme, url and an anchor id from +url+ and returns them.

  def parse_url url
    case url
    when /^rdoc-label:([^:]*)(?::(.*))?/ then
      scheme = 'link'
      path   = "##{$1}"
      id     = " id=\"#{$2}\"" if $2
    when /([A-Za-z]+):(.*)/ then
      scheme = $1.downcase
      path   = $2
    when /^#/ then
    else
      scheme = 'http'
      path   = url
      url    = url
    end

    if scheme == 'link' then
      url = if path[0, 1] == '#' then # is this meaningful?
              path
            else
              self.class.gen_relative_url @from_path, path
            end
    end

    [scheme, url, id]
  end

  ##
  # Is +tag+ a tt tag?

  def tt? tag
    tag.bit == @tt_bit
  end

end

PK}$[.�����1gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_rdoc.rbnu�[���# frozen_string_literal: true
##
# Outputs RDoc markup as RDoc markup! (mostly)

class RDoc::Markup::ToRdoc < RDoc::Markup::Formatter

  ##
  # Current indent amount for output in characters

  attr_accessor :indent

  ##
  # Output width in characters

  attr_accessor :width

  ##
  # Stack of current list indexes for alphabetic and numeric lists

  attr_reader :list_index

  ##
  # Stack of list types

  attr_reader :list_type

  ##
  # Stack of list widths for indentation

  attr_reader :list_width

  ##
  # Prefix for the next list item.  See #use_prefix

  attr_reader :prefix

  ##
  # Output accumulator

  attr_reader :res

  ##
  # Creates a new formatter that will output (mostly) \RDoc markup

  def initialize markup = nil
    super nil, markup

    @markup.add_regexp_handling(/\\\S/, :SUPPRESSED_CROSSREF)
    @width = 78
    init_tags

    @headings = {}
    @headings.default = []

    @headings[1] = ['= ',      '']
    @headings[2] = ['== ',     '']
    @headings[3] = ['=== ',    '']
    @headings[4] = ['==== ',   '']
    @headings[5] = ['===== ',  '']
    @headings[6] = ['====== ', '']

    @hard_break = "\n"
  end

  ##
  # Maps attributes to HTML sequences

  def init_tags
    add_tag :BOLD, "<b>", "</b>"
    add_tag :TT,   "<tt>", "</tt>"
    add_tag :EM,   "<em>", "</em>"
  end

  ##
  # Adds +blank_line+ to the output

  def accept_blank_line blank_line
    @res << "\n"
  end

  ##
  # Adds +paragraph+ to the output

  def accept_block_quote block_quote
    @indent += 2

    block_quote.parts.each do |part|
      @prefix = '> '

      part.accept self
    end

    @indent -= 2
  end

  ##
  # Adds +heading+ to the output

  def accept_heading heading
    use_prefix or @res << ' ' * @indent
    @res << @headings[heading.level][0]
    @res << attributes(heading.text)
    @res << @headings[heading.level][1]
    @res << "\n"
  end

  ##
  # Finishes consumption of +list+

  def accept_list_end list
    @list_index.pop
    @list_type.pop
    @list_width.pop
  end

  ##
  # Finishes consumption of +list_item+

  def accept_list_item_end list_item
    width = case @list_type.last
            when :BULLET then
              2
            when :NOTE, :LABEL then
              if @prefix then
                @res << @prefix.strip
                @prefix = nil
              end

              @res << "\n"
              2
            else
              bullet = @list_index.last.to_s
              @list_index[-1] = @list_index.last.succ
              bullet.length + 2
            end

    @indent -= width
  end

  ##
  # Prepares the visitor for consuming +list_item+

  def accept_list_item_start list_item
    type = @list_type.last

    case type
    when :NOTE, :LABEL then
      bullets = Array(list_item.label).map do |label|
        attributes(label).strip
      end.join "\n"

      bullets << ":\n" unless bullets.empty?

      @prefix = ' ' * @indent
      @indent += 2
      @prefix << bullets + (' ' * @indent)
    else
      bullet = type == :BULLET ? '*' :  @list_index.last.to_s + '.'
      @prefix = (' ' * @indent) + bullet.ljust(bullet.length + 1)
      width = bullet.length + 1
      @indent += width
    end
  end

  ##
  # Prepares the visitor for consuming +list+

  def accept_list_start list
    case list.type
    when :BULLET then
      @list_index << nil
      @list_width << 1
    when :LABEL, :NOTE then
      @list_index << nil
      @list_width << 2
    when :LALPHA then
      @list_index << 'a'
      @list_width << list.items.length.to_s.length
    when :NUMBER then
      @list_index << 1
      @list_width << list.items.length.to_s.length
    when :UALPHA then
      @list_index << 'A'
      @list_width << list.items.length.to_s.length
    else
      raise RDoc::Error, "invalid list type #{list.type}"
    end

    @list_type << list.type
  end

  ##
  # Adds +paragraph+ to the output

  def accept_paragraph paragraph
    text = paragraph.text @hard_break
    wrap attributes text
  end

  ##
  # Adds +paragraph+ to the output

  def accept_indented_paragraph paragraph
    @indent += paragraph.indent
    text = paragraph.text @hard_break
    wrap attributes text
    @indent -= paragraph.indent
  end

  ##
  # Adds +raw+ to the output

  def accept_raw raw
    @res << raw.parts.join("\n")
  end

  ##
  # Adds +rule+ to the output

  def accept_rule rule
    use_prefix or @res << ' ' * @indent
    @res << '-' * (@width - @indent)
    @res << "\n"
  end

  ##
  # Outputs +verbatim+ indented 2 columns

  def accept_verbatim verbatim
    indent = ' ' * (@indent + 2)

    verbatim.parts.each do |part|
      @res << indent unless part == "\n"
      @res << part
    end

    @res << "\n"
  end

  ##
  # Adds +table+ to the output

  def accept_table header, body, aligns
    widths = header.zip(body) do |h, b|
      [h.size, b.size].max
    end
    aligns = aligns.map do |a|
      case a
      when nil
        :center
      when :left
        :ljust
      when :right
        :rjust
      end
    end
    @res << header.zip(widths, aligns) do |h, w, a|
      h.__send__(a, w)
    end.join("|").rstrip << "\n"
    @res << widths.map {|w| "-" * w }.join("|") << "\n"
    body.each do |row|
      @res << row.zip(widths, aligns) do |t, w, a|
        t.__send__(a, w)
      end.join("|").rstrip << "\n"
    end
  end

  ##
  # Applies attribute-specific markup to +text+ using RDoc::AttributeManager

  def attributes text
    flow = @am.flow text.dup
    convert_flow flow
  end

  ##
  # Returns the generated output

  def end_accepting
    @res.join
  end

  ##
  # Removes preceding \\ from the suppressed crossref +target+

  def handle_regexp_SUPPRESSED_CROSSREF target
    text = target.text
    text = text.sub('\\', '') unless in_tt?
    text
  end

  ##
  # Adds a newline to the output

  def handle_regexp_HARD_BREAK target
    "\n"
  end

  ##
  # Prepares the visitor for text generation

  def start_accepting
    @res = [""]
    @indent = 0
    @prefix = nil

    @list_index = []
    @list_type  = []
    @list_width = []
  end

  ##
  # Adds the stored #prefix to the output and clears it.  Lists generate a
  # prefix for later consumption.

  def use_prefix
    prefix, @prefix = @prefix, nil
    @res << prefix if prefix

    prefix
  end

  ##
  # Wraps +text+ to #width

  def wrap text
    return unless text && !text.empty?

    text_len = @width - @indent

    text_len = 20 if text_len < 20

    re = /^(.{0,#{text_len}})[ \n]/
    next_prefix = ' ' * @indent

    prefix = @prefix || next_prefix
    @prefix = nil

    @res << prefix

    while text.length > text_len
      if text =~ re then
        @res << $1
        text.slice!(0, $&.length)
      else
        @res << text.slice!(0, text_len)
      end

      @res << "\n" << next_prefix
    end

    if text.empty? then
      @res.pop
      @res.pop
    else
      @res << text
      @res << "\n"
    end
  end

end

PK}$[ʘw�		4gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_tt_only.rbnu�[���# frozen_string_literal: true
##
# Extracts sections of text enclosed in plus, tt or code.  Used to discover
# undocumented parameters.

class RDoc::Markup::ToTtOnly < RDoc::Markup::Formatter

  ##
  # Stack of list types

  attr_reader :list_type

  ##
  # Output accumulator

  attr_reader :res

  ##
  # Creates a new tt-only formatter.

  def initialize markup = nil
    super nil, markup

    add_tag :TT, nil, nil
  end

  ##
  # Adds tts from +block_quote+ to the output

  def accept_block_quote block_quote
    tt_sections block_quote.text
  end

  ##
  # Pops the list type for +list+ from #list_type

  def accept_list_end list
    @list_type.pop
  end

  ##
  # Pushes the list type for +list+ onto #list_type

  def accept_list_start list
    @list_type << list.type
  end

  ##
  # Prepares the visitor for consuming +list_item+

  def accept_list_item_start list_item
    case @list_type.last
    when :NOTE, :LABEL then
      Array(list_item.label).map do |label|
        tt_sections label
      end.flatten
    end
  end

  ##
  # Adds +paragraph+ to the output

  def accept_paragraph paragraph
    tt_sections(paragraph.text)
  end

  ##
  # Does nothing to +markup_item+ because it doesn't have any user-built
  # content

  def do_nothing markup_item
  end

  alias accept_blank_line    do_nothing # :nodoc:
  alias accept_heading       do_nothing # :nodoc:
  alias accept_list_item_end do_nothing # :nodoc:
  alias accept_raw           do_nothing # :nodoc:
  alias accept_rule          do_nothing # :nodoc:
  alias accept_verbatim      do_nothing # :nodoc:

  ##
  # Extracts tt sections from +text+

  def tt_sections text
    flow = @am.flow text.dup

    flow.each do |item|
      case item
      when String then
        @res << item if in_tt?
      when RDoc::Markup::AttrChanger then
        off_tags res, item
        on_tags res, item
      when RDoc::Markup::RegexpHandling then
        @res << convert_regexp_handling(item) if in_tt? # TODO can this happen?
      else
        raise "Unknown flow element: #{item.inspect}"
      end
    end

    res
  end

  ##
  # Returns an Array of items that were wrapped in plus, tt or code.

  def end_accepting
    @res.compact
  end

  ##
  # Prepares the visitor for gathering tt sections

  def start_accepting
    @res = []

    @list_type = []
  end

end

PK}$[�M����-gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/raw.rbnu�[���# frozen_string_literal: true
##
# A section of text that is added to the output document as-is

class RDoc::Markup::Raw

  ##
  # The component parts of the list

  attr_reader :parts

  ##
  # Creates a new Raw containing +parts+

  def initialize *parts
    @parts = []
    @parts.concat parts
  end

  ##
  # Appends +text+

  def << text
    @parts << text
  end

  def == other # :nodoc:
    self.class == other.class and @parts == other.parts
  end

  ##
  # Calls #accept_raw+ on +visitor+

  def accept visitor
    visitor.accept_raw self
  end

  ##
  # Appends +other+'s parts

  def merge other
    @parts.concat other.parts
  end

  def pretty_print q # :nodoc:
    self.class.name =~ /.*::(\w{1,4})/i

    q.group 2, "[#{$1.downcase}: ", ']' do
      q.seplist @parts do |part|
        q.pp part
      end
    end
  end

  ##
  # Appends +texts+ onto this Paragraph

  def push *texts
    self.parts.concat texts
  end

  ##
  # The raw text

  def text
    @parts.join ' '
  end

end

PK}$[��սd(d(;gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/attribute_manager.rbnu�[���# frozen_string_literal: true
##
# Manages changes of attributes in a block of text

class RDoc::Markup::AttributeManager

  ##
  # The NUL character

  NULL = "\000".freeze

  #--
  # We work by substituting non-printing characters in to the text. For now
  # I'm assuming that I can substitute a character in the range 0..8 for a 7
  # bit character without damaging the encoded string, but this might be
  # optimistic
  #++

  A_PROTECT = 004 # :nodoc:

  ##
  # Special mask character to prevent inline markup handling

  PROTECT_ATTR = A_PROTECT.chr # :nodoc:

  ##
  # The attributes enabled for this markup object.

  attr_reader :attributes

  ##
  # This maps delimiters that occur around words (such as *bold* or +tt+)
  # where the start and end delimiters and the same. This lets us optimize
  # the regexp

  attr_reader :matching_word_pairs

  ##
  # And this is used when the delimiters aren't the same. In this case the
  # hash maps a pattern to the attribute character

  attr_reader :word_pair_map

  ##
  # This maps HTML tags to the corresponding attribute char

  attr_reader :html_tags

  ##
  # A \ in front of a character that would normally be processed turns off
  # processing. We do this by turning \< into <#{PROTECT}

  attr_reader :protectable

  ##
  # And this maps _regexp handling_ sequences to a name. A regexp handling
  # sequence is something like a WikiWord

  attr_reader :regexp_handlings

  ##
  # A bits of exclusive maps
  attr_reader :exclusive_bitmap

  ##
  # Creates a new attribute manager that understands bold, emphasized and
  # teletype text.

  def initialize
    @html_tags = {}
    @matching_word_pairs = {}
    @protectable = %w[<]
    @regexp_handlings = []
    @word_pair_map = {}
    @exclusive_bitmap = 0
    @attributes = RDoc::Markup::Attributes.new

    add_word_pair "*", "*", :BOLD, true
    add_word_pair "_", "_", :EM, true
    add_word_pair "+", "+", :TT, true

    add_html "em", :EM, true
    add_html "i",  :EM, true
    add_html "b",  :BOLD, true
    add_html "tt",   :TT, true
    add_html "code", :TT, true
  end

  ##
  # Return an attribute object with the given turn_on and turn_off bits set

  def attribute(turn_on, turn_off)
    RDoc::Markup::AttrChanger.new turn_on, turn_off
  end

  ##
  # Changes the current attribute from +current+ to +new+

  def change_attribute current, new
    diff = current ^ new
    attribute(new & diff, current & diff)
  end

  ##
  # Used by the tests to change attributes by name from +current_set+ to
  # +new_set+

  def changed_attribute_by_name current_set, new_set
    current = new = 0
    current_set.each do |name|
      current |= @attributes.bitmap_for(name)
    end

    new_set.each do |name|
      new |= @attributes.bitmap_for(name)
    end

    change_attribute(current, new)
  end

  ##
  # Copies +start_pos+ to +end_pos+ from the current string

  def copy_string(start_pos, end_pos)
    res = @str[start_pos...end_pos]
    res.gsub!(/\000/, '')
    res
  end

  def exclusive?(attr)
    (attr & @exclusive_bitmap) != 0
  end

  NON_PRINTING_START = "\1" # :nodoc:
  NON_PRINTING_END = "\2" # :nodoc:

  ##
  # Map attributes like <b>text</b>to the sequence
  # \001\002<char>\001\003<char>, where <char> is a per-attribute specific
  # character

  def convert_attrs(str, attrs, exclusive = false)
    convert_attrs_matching_word_pairs(str, attrs, exclusive)
    convert_attrs_word_pair_map(str, attrs, exclusive)
  end

  def convert_attrs_matching_word_pairs(str, attrs, exclusive)
    # first do matching ones
    tags = @matching_word_pairs.select { |start, bitmap|
      if exclusive && exclusive?(bitmap)
        true
      elsif !exclusive && !exclusive?(bitmap)
        true
      else
        false
      end
    }.keys
    return if tags.empty?
    all_tags = @matching_word_pairs.keys

    re = /(^|\W|[#{all_tags.join("")}])([#{tags.join("")}])(\2*[#\\]?[\w:.\/\[\]-]+?\S?)\2(?!\2)([#{all_tags.join("")}]|\W|$)/

    1 while str.gsub!(re) { |orig|
      attr = @matching_word_pairs[$2]
      attr_updated = attrs.set_attrs($`.length + $1.length + $2.length, $3.length, attr)
      if attr_updated
        $1 + NULL * $2.length + $3 + NULL * $2.length + $4
      else
        $1 + NON_PRINTING_START + $2 + NON_PRINTING_END + $3 + NON_PRINTING_START + $2 + NON_PRINTING_END + $4
      end
    }
    str.delete!(NON_PRINTING_START + NON_PRINTING_END)
  end

  def convert_attrs_word_pair_map(str, attrs, exclusive)
    # then non-matching
    unless @word_pair_map.empty? then
      @word_pair_map.each do |regexp, attr|
        if !exclusive
          next if exclusive?(attr)
        else
          next if !exclusive?(attr)
        end
        1 while str.gsub!(regexp) { |orig|
          updated = attrs.set_attrs($`.length + $1.length, $2.length, attr)
          if updated
            NULL * $1.length + $2 + NULL * $3.length
          else
            orig
          end
        }
      end
    end
  end

  ##
  # Converts HTML tags to RDoc attributes

  def convert_html(str, attrs, exclusive = false)
    tags = @html_tags.select { |start, bitmap|
      if exclusive && exclusive?(bitmap)
        true
      elsif !exclusive && !exclusive?(bitmap)
        true
      else
        false
      end
    }.keys.join '|'

    1 while str.gsub!(/<(#{tags})>(.*?)<\/\1>/i) { |orig|
      attr = @html_tags[$1.downcase]
      html_length = $1.length + 2
      seq = NULL * html_length
      attrs.set_attrs($`.length + html_length, $2.length, attr)
      seq + $2 + seq + NULL
    }
  end

  ##
  # Converts regexp handling sequences to RDoc attributes

  def convert_regexp_handlings str, attrs, exclusive = false
    @regexp_handlings.each do |regexp, attribute|
      if exclusive
        next if !exclusive?(attribute)
      else
        next if exclusive?(attribute)
      end
      str.scan(regexp) do
        capture = $~.size == 1 ? 0 : 1

        s, e = $~.offset capture

        attrs.set_attrs s, e - s, attribute | @attributes.regexp_handling
      end
    end
  end

  ##
  # Escapes regexp handling sequences of text to prevent conversion to RDoc

  def mask_protected_sequences
    # protect __send__, __FILE__, etc.
    @str.gsub!(/__([a-z]+)__/i,
      "_#{PROTECT_ATTR}_#{PROTECT_ATTR}\\1_#{PROTECT_ATTR}_#{PROTECT_ATTR}")
    @str.gsub!(/(\A|[^\\])\\([#{Regexp.escape @protectable.join}])/m,
               "\\1\\2#{PROTECT_ATTR}")
    @str.gsub!(/\\(\\[#{Regexp.escape @protectable.join}])/m, "\\1")
  end

  ##
  # Unescapes regexp handling sequences of text

  def unmask_protected_sequences
    @str.gsub!(/(.)#{PROTECT_ATTR}/, "\\1\000")
  end

  ##
  # Adds a markup class with +name+ for words wrapped in the +start+ and
  # +stop+ character.  To make words wrapped with "*" bold:
  #
  #   am.add_word_pair '*', '*', :BOLD

  def add_word_pair(start, stop, name, exclusive = false)
    raise ArgumentError, "Word flags may not start with '<'" if
      start[0,1] == '<'

    bitmap = @attributes.bitmap_for name

    if start == stop then
      @matching_word_pairs[start] = bitmap
    else
      pattern = /(#{Regexp.escape start})(\S+)(#{Regexp.escape stop})/
      @word_pair_map[pattern] = bitmap
    end

    @protectable << start[0,1]
    @protectable.uniq!

    @exclusive_bitmap |= bitmap if exclusive
  end

  ##
  # Adds a markup class with +name+ for words surrounded by HTML tag +tag+.
  # To process emphasis tags:
  #
  #   am.add_html 'em', :EM

  def add_html(tag, name, exclusive = false)
    bitmap = @attributes.bitmap_for name
    @html_tags[tag.downcase] = bitmap
    @exclusive_bitmap |= bitmap if exclusive
  end

  ##
  # Adds a regexp handling for +pattern+ with +name+.  A simple URL handler
  # would be:
  #
  #   @am.add_regexp_handling(/((https?:)\S+\w)/, :HYPERLINK)

  def add_regexp_handling pattern, name, exclusive = false
    bitmap = @attributes.bitmap_for(name)
    @regexp_handlings << [pattern, bitmap]
    @exclusive_bitmap |= bitmap if exclusive
  end

  ##
  # Processes +str+ converting attributes, HTML and regexp handlings

  def flow str
    @str = str.dup

    mask_protected_sequences

    @attrs = RDoc::Markup::AttrSpan.new @str.length, @exclusive_bitmap

    convert_attrs            @str, @attrs, true
    convert_html             @str, @attrs, true
    convert_regexp_handlings @str, @attrs, true
    convert_attrs            @str, @attrs
    convert_html             @str, @attrs
    convert_regexp_handlings @str, @attrs

    unmask_protected_sequences

    split_into_flow
  end

  ##
  # Debug method that prints a string along with its attributes

  def display_attributes
    puts
    puts @str.tr(NULL, "!")
    bit = 1
    16.times do |bno|
      line = ""
      @str.length.times do |i|
        if (@attrs[i] & bit) == 0
          line << " "
        else
          if bno.zero?
            line << "S"
          else
            line << ("%d" % (bno+1))
          end
        end
      end
      puts(line) unless line =~ /^ *$/
      bit <<= 1
    end
  end

  ##
  # Splits the string into chunks by attribute change

  def split_into_flow
    res = []
    current_attr = 0

    str_len = @str.length

    # skip leading invisible text
    i = 0
    i += 1 while i < str_len and @str[i].chr == "\0"
    start_pos = i

    # then scan the string, chunking it on attribute changes
    while i < str_len
      new_attr = @attrs[i]
      if new_attr != current_attr
        if i > start_pos
          res << copy_string(start_pos, i)
          start_pos = i
        end

        res << change_attribute(current_attr, new_attr)
        current_attr = new_attr

        if (current_attr & @attributes.regexp_handling) != 0 then
          i += 1 while
            i < str_len and (@attrs[i] & @attributes.regexp_handling) != 0

          res << RDoc::Markup::RegexpHandling.new(current_attr,
                                                  copy_string(start_pos, i))
          start_pos = i
          next
        end
      end

      # move on, skipping any invisible characters
      begin
        i += 1
      end while i < str_len and @str[i].chr == "\0"
    end

    # tidy up trailing text
    if start_pos < str_len
      res << copy_string(start_pos, str_len)
    end

    # and reset to all attributes off
    res << change_attribute(current_attr, 0) if current_attr != 0

    res
  end

end

PK}$[�y ��4gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/hard_break.rbnu�[���# frozen_string_literal: true
##
# A hard-break in the middle of a paragraph.

class RDoc::Markup::HardBreak

  @instance = new

  ##
  # RDoc::Markup::HardBreak is a singleton

  def self.new
    @instance
  end

  ##
  # Calls #accept_hard_break on +visitor+

  def accept visitor
    visitor.accept_hard_break self
  end

  def == other # :nodoc:
    self.class === other
  end

  def pretty_print q # :nodoc:
    q.text "[break]"
  end

end

PK}$[�t�ԇ�4gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/blank_line.rbnu�[���# frozen_string_literal: true
##
# An empty line.  This class is a singleton.

class RDoc::Markup::BlankLine

  @instance = new

  ##
  # RDoc::Markup::BlankLine is a singleton

  def self.new
    @instance
  end

  ##
  # Calls #accept_blank_line on +visitor+

  def accept visitor
    visitor.accept_blank_line self
  end

  def pretty_print q # :nodoc:
    q.text 'blankline'
  end

end

PK}$[N�_���5gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/block_quote.rbnu�[���# frozen_string_literal: true
##
# A quoted section which contains markup items.

class RDoc::Markup::BlockQuote < RDoc::Markup::Raw

  ##
  # Calls #accept_block_quote on +visitor+

  def accept visitor
    visitor.accept_block_quote self
  end

end

PK}$[TZL���>gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_table_of_contents.rbnu�[���# frozen_string_literal: true
##
# Extracts just the RDoc::Markup::Heading elements from a
# RDoc::Markup::Document to help build a table of contents

class RDoc::Markup::ToTableOfContents < RDoc::Markup::Formatter

  @to_toc = nil

  ##
  # Singleton for table-of-contents generation

  def self.to_toc
    @to_toc ||= new
  end

  ##
  # Output accumulator

  attr_reader :res

  ##
  # Omits headings with a level less than the given level.

  attr_accessor :omit_headings_below

  def initialize # :nodoc:
    super nil

    @omit_headings_below = nil
  end

  ##
  # Adds +document+ to the output, using its heading cutoff if present

  def accept_document document
    @omit_headings_below = document.omit_headings_below

    super
  end

  ##
  # Adds +heading+ to the table of contents

  def accept_heading heading
    @res << heading unless suppressed? heading
  end

  ##
  # Returns the table of contents

  def end_accepting
    @res
  end

  ##
  # Prepares the visitor for text generation

  def start_accepting
    @omit_headings_below = nil
    @res = []
  end

  ##
  # Returns true if +heading+ is below the display threshold

  def suppressed? heading
    return false unless @omit_headings_below

    heading.level > @omit_headings_below
  end

  # :stopdoc:
  alias accept_block_quote     ignore
  alias accept_raw             ignore
  alias accept_rule            ignore
  alias accept_blank_line      ignore
  alias accept_paragraph       ignore
  alias accept_verbatim        ignore
  alias accept_list_end        ignore
  alias accept_list_item_start ignore
  alias accept_list_item_end   ignore
  alias accept_list_end_bullet ignore
  alias accept_list_start      ignore
  alias accept_table           ignore
  # :startdoc:

end

PK}$[���a{{:gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_html_crossref.rbnu�[���# frozen_string_literal: true
##
# Subclass of the RDoc::Markup::ToHtml class that supports looking up method
# names, classes, etc to create links.  RDoc::CrossReference is used to
# generate those links based on the current context.

class RDoc::Markup::ToHtmlCrossref < RDoc::Markup::ToHtml

  # :stopdoc:
  ALL_CROSSREF_REGEXP = RDoc::CrossReference::ALL_CROSSREF_REGEXP
  CLASS_REGEXP_STR    = RDoc::CrossReference::CLASS_REGEXP_STR
  CROSSREF_REGEXP     = RDoc::CrossReference::CROSSREF_REGEXP
  METHOD_REGEXP_STR   = RDoc::CrossReference::METHOD_REGEXP_STR
  # :startdoc:

  ##
  # RDoc::CodeObject for generating references

  attr_accessor :context

  ##
  # Should we show '#' characters on method references?

  attr_accessor :show_hash

  ##
  # Creates a new crossref resolver that generates links relative to +context+
  # which lives at +from_path+ in the generated files.  '#' characters on
  # references are removed unless +show_hash+ is true.  Only method names
  # preceded by '#' or '::' are linked, unless +hyperlink_all+ is true.

  def initialize(options, from_path, context, markup = nil)
    raise ArgumentError, 'from_path cannot be nil' if from_path.nil?

    super options, markup

    @context       = context
    @from_path     = from_path
    @hyperlink_all = @options.hyperlink_all
    @show_hash     = @options.show_hash

    @cross_reference = RDoc::CrossReference.new @context
  end

  def init_link_notation_regexp_handlings
    add_regexp_handling_RDOCLINK

    # The crossref must be linked before tidylink because Klass.method[:sym]
    # will be processed as a tidylink first and will be broken.
    crossref_re = @options.hyperlink_all ? ALL_CROSSREF_REGEXP : CROSSREF_REGEXP
    @markup.add_regexp_handling crossref_re, :CROSSREF

    add_regexp_handling_TIDYLINK
  end

  ##
  # Creates a link to the reference +name+ if the name exists.  If +text+ is
  # given it is used as the link text, otherwise +name+ is used.

  def cross_reference name, text = nil, code = true
    lookup = name

    name = name[1..-1] unless @show_hash if name[0, 1] == '#'

    if !(name.end_with?('+@', '-@')) and name =~ /(.*[^#:])@/
      text ||= "#{CGI.unescape $'} at <code>#{$1}</code>"
      code = false
    else
      text ||= name
    end

    link lookup, text, code
  end

  ##
  # We're invoked when any text matches the CROSSREF pattern.  If we find the
  # corresponding reference, generate a link.  If the name we're looking for
  # contains no punctuation, we look for it up the module/class chain.  For
  # example, ToHtml is found, even without the <tt>RDoc::Markup::</tt> prefix,
  # because we look for it in module Markup first.

  def handle_regexp_CROSSREF(target)
    name = target.text

    return name if name =~ /@[\w-]+\.[\w-]/ # labels that look like emails

    unless @hyperlink_all then
      # This ensures that words entirely consisting of lowercase letters will
      # not have cross-references generated (to suppress lots of erroneous
      # cross-references to "new" in text, for instance)
      return name if name =~ /\A[a-z]*\z/
    end

    cross_reference name
  end

  ##
  # Handles <tt>rdoc-ref:</tt> scheme links and allows RDoc::Markup::ToHtml to
  # handle other schemes.

  def handle_regexp_HYPERLINK target
    return cross_reference $' if target.text =~ /\Ardoc-ref:/

    super
  end

  ##
  # +target+ is an rdoc-schemed link that will be converted into a hyperlink.
  # For the rdoc-ref scheme the cross-reference will be looked up and the
  # given name will be used.
  #
  # All other contents are handled by
  # {the superclass}[rdoc-ref:RDoc::Markup::ToHtml#handle_regexp_RDOCLINK]

  def handle_regexp_RDOCLINK target
    url = target.text

    case url
    when /\Ardoc-ref:/ then
      cross_reference $'
    else
      super
    end
  end

  ##
  # Generates links for <tt>rdoc-ref:</tt> scheme URLs and allows
  # RDoc::Markup::ToHtml to handle other schemes.

  def gen_url url, text
    return super unless url =~ /\Ardoc-ref:/

    name = $'
    cross_reference name, text, name == text
  end

  ##
  # Creates an HTML link to +name+ with the given +text+.

  def link name, text, code = true
    if !(name.end_with?('+@', '-@')) and name =~ /(.*[^#:])@/
      name = $1
      label = $'
    end

    ref = @cross_reference.resolve name, text

    case ref
    when String then
      ref
    else
      path = ref.as_href @from_path

      if code and RDoc::CodeObject === ref and !(RDoc::TopLevel === ref)
        text = "<code>#{CGI.escapeHTML text}</code>"
      end

      if path =~ /#/ then
        path << "-label-#{label}"
      elsif ref.sections and
            ref.sections.any? { |section| label == section.title } then
        path << "##{label}"
      else
        if ref.respond_to?(:aref)
          path << "##{ref.aref}-label-#{label}"
        else
          path << "#label-#{label}"
        end
      end if label

      "<a href=\"#{path}\">#{text}</a>"
    end
  end

end

PK}$[[n�A##2gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/verbatim.rbnu�[���# frozen_string_literal: true
##
# A section of verbatim text

class RDoc::Markup::Verbatim < RDoc::Markup::Raw

  ##
  # Format of this verbatim section

  attr_accessor :format

  def initialize *parts # :nodoc:
    super

    @format = nil
  end

  def == other # :nodoc:
    super and @format == other.format
  end

  ##
  # Calls #accept_verbatim on +visitor+

  def accept visitor
    visitor.accept_verbatim self
  end

  ##
  # Collapses 3+ newlines into two newlines

  def normalize
    parts = []

    newlines = 0

    @parts.each do |part|
      case part
      when /^\s*\n/ then
        newlines += 1
        parts << part if newlines == 1
      else
        newlines = 0
        parts << part
      end
    end

    parts.pop if parts.last =~ /\A\r?\n\z/

    @parts = parts
  end

  def pretty_print q # :nodoc:
    self.class.name =~ /.*::(\w{1,4})/i

    q.group 2, "[#{$1.downcase}: ", ']' do
      if @format then
        q.text "format: #{@format}"
        q.breakable
      end

      q.seplist @parts do |part|
        q.pp part
      end
    end
  end

  ##
  # Is this verbatim section Ruby code?

  def ruby?
    @format ||= nil # TODO for older ri data, switch the tree to marshal_dump
    @format == :ruby
  end

  ##
  # The text of the section

  def text
    @parts.join
  end

end

PK}$[|����9gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/regexp_handling.rbnu�[���# frozen_string_literal: true
##
# Hold details of a regexp handling sequence

class RDoc::Markup::RegexpHandling

  ##
  # Regexp handling type

  attr_reader   :type

  ##
  # Regexp handling text

  attr_accessor :text

  ##
  # Creates a new regexp handling sequence of +type+ with +text+

  def initialize(type, text)
    @type, @text = type, text
  end

  ##
  # Regexp handlings are equal when the have the same text and type

  def ==(o)
    self.text == o.text && self.type == o.type
  end

  def inspect # :nodoc:
    "#<RDoc::Markup::RegexpHandling:0x%x @type=%p, @text=%p>" % [
      object_id, @type, text.dump]
  end

  def to_s # :nodoc:
    "RegexpHandling: type=#{type} text=#{text.dump}"
  end

end

PK}$[d����3gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/paragraph.rbnu�[���# frozen_string_literal: true
##
# A Paragraph of text

class RDoc::Markup::Paragraph < RDoc::Markup::Raw

  ##
  # Calls #accept_paragraph on +visitor+

  def accept visitor
    visitor.accept_paragraph self
  end

  ##
  # Joins the raw paragraph text and converts inline HardBreaks to the
  # +hard_break+ text.

  def text hard_break = ''
    @parts.map do |part|
      if RDoc::Markup::HardBreak === part then
        hard_break
      else
        part
      end
    end.join
  end

end

PK}$[v���!�!5gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/pre_process.rbnu�[���# frozen_string_literal: true
##
# Handle common directives that can occur in a block of text:
#
#   \:include: filename
#
# Directives can be escaped by preceding them with a backslash.
#
# RDoc plugin authors can register additional directives to be handled by
# using RDoc::Markup::PreProcess::register.
#
# Any directive that is not built-in to RDoc (including those registered via
# plugins) will be stored in the metadata hash on the CodeObject the comment
# is attached to.  See RDoc::Markup@Directives for the list of built-in
# directives.

class RDoc::Markup::PreProcess

  ##
  # An RDoc::Options instance that will be filled in with overrides from
  # directives

  attr_accessor :options

  ##
  # Adds a post-process handler for directives.  The handler will be called
  # with the result RDoc::Comment (or text String) and the code object for the
  # comment (if any).

  def self.post_process &block
    @post_processors << block
  end

  ##
  # Registered post-processors

  def self.post_processors
    @post_processors
  end

  ##
  # Registers +directive+ as one handled by RDoc.  If a block is given the
  # directive will be replaced by the result of the block, otherwise the
  # directive will be removed from the processed text.
  #
  # The block will be called with the directive name and the directive
  # parameter:
  #
  #   RDoc::Markup::PreProcess.register 'my-directive' do |directive, param|
  #     # replace text, etc.
  #   end

  def self.register directive, &block
    @registered[directive] = block
  end

  ##
  # Registered directives

  def self.registered
    @registered
  end

  ##
  # Clears all registered directives and post-processors

  def self.reset
    @post_processors = []
    @registered = {}
  end

  reset

  ##
  # Creates a new pre-processor for +input_file_name+ that will look for
  # included files in +include_path+

  def initialize(input_file_name, include_path)
    @input_file_name = input_file_name
    @include_path = include_path
    @options = nil
  end

  ##
  # Look for directives in the given +text+.
  #
  # Options that we don't handle are yielded.  If the block returns false the
  # directive is restored to the text.  If the block returns nil or no block
  # was given the directive is handled according to the registered directives.
  # If a String was returned the directive is replaced with the string.
  #
  # If no matching directive was registered the directive is restored to the
  # text.
  #
  # If +code_object+ is given and the directive is unknown then the
  # directive's parameter is set as metadata on the +code_object+.  See
  # RDoc::CodeObject#metadata for details.

  def handle text, code_object = nil, &block
    if RDoc::Comment === text then
      comment = text
      text = text.text
    end

    # regexp helper (square brackets for optional)
    # $1      $2  $3        $4      $5
    # [prefix][\]:directive:[spaces][param]newline
    text = text.gsub(/^([ \t]*(?:#|\/?\*)?[ \t]*)(\\?):(\w+):([ \t]*)(.+)?(\r?\n|$)/) do
      # skip something like ':toto::'
      next $& if $4.empty? and $5 and $5[0, 1] == ':'

      # skip if escaped
      next "#$1:#$3:#$4#$5\n" unless $2.empty?

      # This is not in handle_directive because I didn't want to pass another
      # argument into it
      if comment and $3 == 'markup' then
        next "#{$1.strip}\n" unless $5
        comment.format = $5.downcase
        next "#{$1.strip}\n"
      end

      handle_directive $1, $3, $5, code_object, text.encoding, &block
    end

    if comment then
      comment.text = text
    else
      comment = text
    end

    self.class.post_processors.each do |handler|
      handler.call comment, code_object
    end

    text
  end

  ##
  # Performs the actions described by +directive+ and its parameter +param+.
  #
  # +code_object+ is used for directives that operate on a class or module.
  # +prefix+ is used to ensure the replacement for handled directives is
  # correct.  +encoding+ is used for the <tt>include</tt> directive.
  #
  # For a list of directives in RDoc see RDoc::Markup.
  #--
  # When 1.8.7 support is ditched prefix can be defaulted to ''

  def handle_directive prefix, directive, param, code_object = nil,
                       encoding = nil
    blankline = "#{prefix.strip}\n"
    directive = directive.downcase

    case directive
    when 'arg', 'args' then
      return "#{prefix}:#{directive}: #{param}\n" unless code_object && code_object.kind_of?(RDoc::AnyMethod)

      code_object.params = param

      blankline
    when 'category' then
      if RDoc::Context === code_object then
        section = code_object.add_section param
        code_object.temporary_section = section
      elsif RDoc::AnyMethod === code_object then
        code_object.section_title = param
      end

      blankline # ignore category if we're not on an RDoc::Context
    when 'doc' then
      return blankline unless code_object
      code_object.document_self = true
      code_object.force_documentation = true

      blankline
    when 'enddoc' then
      return blankline unless code_object
      code_object.done_documenting = true

      blankline
    when 'include' then
      filename = param.split(' ', 2).first
      include_file filename, prefix, encoding
    when 'main' then
      @options.main_page = param if @options.respond_to? :main_page

      blankline
    when 'nodoc' then
      return blankline unless code_object
      code_object.document_self = nil # notify nodoc
      code_object.document_children = param !~ /all/i

      blankline
    when 'notnew', 'not_new', 'not-new' then
      return blankline unless RDoc::AnyMethod === code_object

      code_object.dont_rename_initialize = true

      blankline
    when 'startdoc' then
      return blankline unless code_object

      code_object.start_doc
      code_object.force_documentation = true

      blankline
    when 'stopdoc' then
      return blankline unless code_object

      code_object.stop_doc

      blankline
    when 'title' then
      @options.default_title = param if @options.respond_to? :default_title=

      blankline
    when 'yield', 'yields' then
      return blankline unless code_object
      # remove parameter &block
      code_object.params = code_object.params.sub(/,?\s*&\w+/, '') if code_object.params

      code_object.block_params = param

      blankline
    else
      result = yield directive, param if block_given?

      case result
      when nil then
        code_object.metadata[directive] = param if code_object

        if RDoc::Markup::PreProcess.registered.include? directive then
          handler = RDoc::Markup::PreProcess.registered[directive]
          result = handler.call directive, param if handler
        else
          result = "#{prefix}:#{directive}: #{param}\n"
        end
      when false then
        result = "#{prefix}:#{directive}: #{param}\n"
      end

      result
    end
  end

  ##
  # Handles the <tt>:include: _filename_</tt> directive.
  #
  # If the first line of the included file starts with '#', and contains
  # an encoding information in the form 'coding:' or 'coding=', it is
  # removed.
  #
  # If all lines in the included file start with a '#', this leading '#'
  # is removed before inclusion. The included content is indented like
  # the <tt>:include:</tt> directive.
  #--
  # so all content will be verbatim because of the likely space after '#'?
  # TODO shift left the whole file content in that case
  # TODO comment stop/start #-- and #++ in included file must be processed here

  def include_file name, indent, encoding
    full_name = find_include_file name

    unless full_name then
      warn "Couldn't find file to include '#{name}' from #{@input_file_name}"
      return ''
    end

    content = RDoc::Encoding.read_file full_name, encoding, true
    content = RDoc::Encoding.remove_magic_comment content

    # strip magic comment
    content = content.sub(/\A# .*coding[=:].*$/, '').lstrip

    # strip leading '#'s, but only if all lines start with them
    if content =~ /^[^#]/ then
      content.gsub(/^/, indent)
    else
      content.gsub(/^#?/, indent)
    end
  end

  ##
  # Look for the given file in the directory containing the current file,
  # and then in each of the directories specified in the RDOC_INCLUDE path

  def find_include_file(name)
    to_search = [File.dirname(@input_file_name)].concat @include_path
    to_search.each do |dir|
      full_name = File.join(dir, name)
      stat = File.stat(full_name) rescue next
      return full_name if stat.readable?
    end
    nil
  end

end
PK}$[�W��3gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/attr_span.rbnu�[���# frozen_string_literal: true
##
# An array of attributes which parallels the characters in a string.

class RDoc::Markup::AttrSpan

  ##
  # Creates a new AttrSpan for +length+ characters

  def initialize(length, exclusive)
    @attrs = Array.new(length, 0)
    @exclusive = exclusive
  end

  ##
  # Toggles +bits+ from +start+ to +length+
  def set_attrs(start, length, bits)
    updated = false
    for i in start ... (start+length)
      if (@exclusive & @attrs[i]) == 0 || (@exclusive & bits) != 0
        @attrs[i] |= bits
        updated = true
      end
    end
    updated
  end

  ##
  # Accesses flags for character +n+

  def [](n)
    @attrs[n]
  end

end

PK}$[��<��8�80gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/parser.rbnu�[���# frozen_string_literal: true
require 'strscan'

##
# A recursive-descent parser for RDoc markup.
#
# The parser tokenizes an input string then parses the tokens into a Document.
# Documents can be converted into output formats by writing a visitor like
# RDoc::Markup::ToHTML.
#
# The parser only handles the block-level constructs Paragraph, List,
# ListItem, Heading, Verbatim, BlankLine, Rule and BlockQuote.
# Inline markup such as <tt>\+blah\+</tt> is handled separately by
# RDoc::Markup::AttributeManager.
#
# To see what markup the Parser implements read RDoc.  To see how to use
# RDoc markup to format text in your program read RDoc::Markup.

class RDoc::Markup::Parser

  include RDoc::Text

  ##
  # List token types

  LIST_TOKENS = [
    :BULLET,
    :LABEL,
    :LALPHA,
    :NOTE,
    :NUMBER,
    :UALPHA,
  ]

  ##
  # Parser error subclass

  class Error < RuntimeError; end

  ##
  # Raised when the parser is unable to handle the given markup

  class ParseError < Error; end

  ##
  # Enables display of debugging information

  attr_accessor :debug

  ##
  # Token accessor

  attr_reader :tokens

  ##
  # Parses +str+ into a Document.
  #
  # Use RDoc::Markup#parse instead of this method.

  def self.parse str
    parser = new
    parser.tokenize str
    doc = RDoc::Markup::Document.new
    parser.parse doc
  end

  ##
  # Returns a token stream for +str+, for testing

  def self.tokenize str
    parser = new
    parser.tokenize str
    parser.tokens
  end

  ##
  # Creates a new Parser.  See also ::parse

  def initialize
    @binary_input   = nil
    @current_token  = nil
    @debug          = false
    @s              = nil
    @tokens         = []
  end

  ##
  # Builds a Heading of +level+

  def build_heading level
    type, text, = get

    text = case type
           when :TEXT then
             skip :NEWLINE
             text
           else
             unget
             ''
           end

    RDoc::Markup::Heading.new level, text
  end

  ##
  # Builds a List flush to +margin+

  def build_list margin
    p :list_start => margin if @debug

    list = RDoc::Markup::List.new
    label = nil

    until @tokens.empty? do
      type, data, column, = get

      case type
      when *LIST_TOKENS then
        if column < margin || (list.type && list.type != type) then
          unget
          break
        end

        list.type = type
        peek_type, _, column, = peek_token

        case type
        when :NOTE, :LABEL then
          label = [] unless label

          if peek_type == :NEWLINE then
            # description not on the same line as LABEL/NOTE
            # skip the trailing newline & any blank lines below
            while peek_type == :NEWLINE
              get
              peek_type, _, column, = peek_token
            end

            # we may be:
            #   - at end of stream
            #   - at a column < margin:
            #         [text]
            #       blah blah blah
            #   - at the same column, but with a different type of list item
            #       [text]
            #       * blah blah
            #   - at the same column, with the same type of list item
            #       [one]
            #       [two]
            # In all cases, we have an empty description.
            # In the last case only, we continue.
            if peek_type.nil? || column < margin then
              empty = true
            elsif column == margin then
              case peek_type
              when type
                empty = :continue
              when *LIST_TOKENS
                empty = true
              else
                empty = false
              end
            else
              empty = false
            end

            if empty then
              label << data
              next if empty == :continue
              break
            end
          end
        else
          data = nil
        end

        if label then
          data = label << data
          label = nil
        end

        list_item = RDoc::Markup::ListItem.new data
        parse list_item, column
        list << list_item

      else
        unget
        break
      end
    end

    p :list_end => margin if @debug

    if list.empty? then
      return nil unless label
      return nil unless [:LABEL, :NOTE].include? list.type

      list_item = RDoc::Markup::ListItem.new label, RDoc::Markup::BlankLine.new
      list << list_item
    end

    list
  end

  ##
  # Builds a Paragraph that is flush to +margin+

  def build_paragraph margin
    p :paragraph_start => margin if @debug

    paragraph = RDoc::Markup::Paragraph.new

    until @tokens.empty? do
      type, data, column, = get

      if type == :TEXT and column == margin then
        paragraph << data

        break if peek_token.first == :BREAK

        data << ' ' if skip :NEWLINE
      else
        unget
        break
      end
    end

    paragraph.parts.last.sub!(/ \z/, '') # cleanup

    p :paragraph_end => margin if @debug

    paragraph
  end

  ##
  # Builds a Verbatim that is indented from +margin+.
  #
  # The verbatim block is shifted left (the least indented lines start in
  # column 0).  Each part of the verbatim is one line of text, always
  # terminated by a newline.  Blank lines always consist of a single newline
  # character, and there is never a single newline at the end of the verbatim.

  def build_verbatim margin
    p :verbatim_begin => margin if @debug
    verbatim = RDoc::Markup::Verbatim.new

    min_indent = nil
    generate_leading_spaces = true
    line = ''.dup

    until @tokens.empty? do
      type, data, column, = get

      if type == :NEWLINE then
        line << data
        verbatim << line
        line = ''.dup
        generate_leading_spaces = true
        next
      end

      if column <= margin
        unget
        break
      end

      if generate_leading_spaces then
        indent = column - margin
        line << ' ' * indent
        min_indent = indent if min_indent.nil? || indent < min_indent
        generate_leading_spaces = false
      end

      case type
      when :HEADER then
        line << '=' * data
        _, _, peek_column, = peek_token
        peek_column ||= column + data
        indent = peek_column - column - data
        line << ' ' * indent
      when :RULE then
        width = 2 + data
        line << '-' * width
        _, _, peek_column, = peek_token
        peek_column ||= column + width
        indent = peek_column - column - width
        line << ' ' * indent
      when :BREAK, :TEXT then
        line << data
      else # *LIST_TOKENS
        list_marker = case type
                      when :BULLET then data
                      when :LABEL  then "[#{data}]"
                      when :NOTE   then "#{data}::"
                      else # :LALPHA, :NUMBER, :UALPHA
                        "#{data}."
                      end
        line << list_marker
        peek_type, _, peek_column = peek_token
        unless peek_type == :NEWLINE then
          peek_column ||= column + list_marker.length
          indent = peek_column - column - list_marker.length
          line << ' ' * indent
        end
      end

    end

    verbatim << line << "\n" unless line.empty?
    verbatim.parts.each { |p| p.slice!(0, min_indent) unless p == "\n" } if min_indent > 0
    verbatim.normalize

    p :verbatim_end => margin if @debug

    verbatim
  end

  ##
  # Pulls the next token from the stream.

  def get
    @current_token = @tokens.shift
    p :get => @current_token if @debug
    @current_token
  end

  ##
  # Parses the tokens into an array of RDoc::Markup::XXX objects,
  # and appends them to the passed +parent+ RDoc::Markup::YYY object.
  #
  # Exits at the end of the token stream, or when it encounters a token
  # in a column less than +indent+ (unless it is a NEWLINE).
  #
  # Returns +parent+.

  def parse parent, indent = 0
    p :parse_start => indent if @debug

    until @tokens.empty? do
      type, data, column, = get

      case type
      when :BREAK then
        parent << RDoc::Markup::BlankLine.new
        skip :NEWLINE, false
        next
      when :NEWLINE then
        # trailing newlines are skipped below, so this is a blank line
        parent << RDoc::Markup::BlankLine.new
        skip :NEWLINE, false
        next
      end

      # indentation change: break or verbatim
      if column < indent then
        unget
        break
      elsif column > indent then
        unget
        parent << build_verbatim(indent)
        next
      end

      # indentation is the same
      case type
      when :HEADER then
        parent << build_heading(data)
      when :RULE then
        parent << RDoc::Markup::Rule.new(data)
        skip :NEWLINE
      when :TEXT then
        unget
        parse_text parent, indent
      when :BLOCKQUOTE then
        type, _, column = get
        if type == :NEWLINE
          type, _, column = get
        end
        unget if type
        bq = RDoc::Markup::BlockQuote.new
        p :blockquote_start => [data, column] if @debug
        parse bq, column
        p :blockquote_end => indent if @debug
        parent << bq
      when *LIST_TOKENS then
        unget
        parent << build_list(indent)
      else
        type, data, column, line = @current_token
        raise ParseError, "Unhandled token #{type} (#{data.inspect}) at #{line}:#{column}"
      end
    end

    p :parse_end => indent if @debug

    parent

  end

  ##
  # Small hook that is overridden by RDoc::TomDoc

  def parse_text parent, indent # :nodoc:
    parent << build_paragraph(indent)
  end

  ##
  # Returns the next token on the stream without modifying the stream

  def peek_token
    token = @tokens.first || []
    p :peek => token if @debug
    token
  end

  ##
  # A simple wrapper of StringScanner that is aware of the current column and lineno

  class MyStringScanner
    def initialize(input)
      @line = @column = 0
      @s = StringScanner.new input
    end

    def scan(re)
      ret = @s.scan(re)
      @column += ret.length if ret
      ret
    end

    def unscan(s)
      @s.pos -= s.bytesize
      @column -= s.length
    end

    def pos
      [@column, @line]
    end

    def newline!
      @column = 0
      @line += 1
    end

    def eos?
      @s.eos?
    end

    def matched
      @s.matched
    end

    def [](i)
      @s[i]
    end
  end

  ##
  # Creates the StringScanner

  def setup_scanner input
    @s = MyStringScanner.new input
  end

  ##
  # Skips the next token if its type is +token_type+.
  #
  # Optionally raises an error if the next token is not of the expected type.

  def skip token_type, error = true
    type, = get
    return unless type # end of stream
    return @current_token if token_type == type
    unget
    raise ParseError, "expected #{token_type} got #{@current_token.inspect}" if error
  end

  ##
  # Turns text +input+ into a stream of tokens

  def tokenize input
    setup_scanner input

    until @s.eos? do
      pos = @s.pos

      # leading spaces will be reflected by the column of the next token
      # the only thing we loose are trailing spaces at the end of the file
      next if @s.scan(/ +/)

      # note: after BULLET, LABEL, etc.,
      # indent will be the column of the next non-newline token

      @tokens << case
                 # [CR]LF => :NEWLINE
                 when @s.scan(/\r?\n/) then
                   token = [:NEWLINE, @s.matched, *pos]
                   @s.newline!
                   token
                 # === text => :HEADER then :TEXT
                 when @s.scan(/(=+)(\s*)/) then
                   level = @s[1].length
                   header = [:HEADER, level, *pos]

                   if @s[2] =~ /^\r?\n/ then
                     @s.unscan(@s[2])
                     header
                   else
                     pos = @s.pos
                     @s.scan(/.*/)
                     @tokens << header
                     [:TEXT, @s.matched.sub(/\r$/, ''), *pos]
                   end
                 # --- (at least 3) and nothing else on the line => :RULE
                 when @s.scan(/(-{3,}) *\r?$/) then
                   [:RULE, @s[1].length - 2, *pos]
                 # * or - followed by white space and text => :BULLET
                 when @s.scan(/([*-]) +(\S)/) then
                   @s.unscan(@s[2])
                   [:BULLET, @s[1], *pos]
                 # A. text, a. text, 12. text => :UALPHA, :LALPHA, :NUMBER
                 when @s.scan(/([a-z]|\d+)\. +(\S)/i) then
                   # FIXME if tab(s), the column will be wrong
                   # either support tabs everywhere by first expanding them to
                   # spaces, or assume that they will have been replaced
                   # before (and provide a check for that at least in debug
                   # mode)
                   list_label = @s[1]
                   @s.unscan(@s[2])
                   list_type =
                     case list_label
                     when /[a-z]/ then :LALPHA
                     when /[A-Z]/ then :UALPHA
                     when /\d/    then :NUMBER
                     else
                       raise ParseError, "BUG token #{list_label}"
                     end
                   [list_type, list_label, *pos]
                 # [text] followed by spaces or end of line => :LABEL
                 when @s.scan(/\[(.*?)\]( +|\r?$)/) then
                   [:LABEL, @s[1], *pos]
                 # text:: followed by spaces or end of line => :NOTE
                 when @s.scan(/(.*?)::( +|\r?$)/) then
                   [:NOTE, @s[1], *pos]
                 # >>> followed by end of line => :BLOCKQUOTE
                 when @s.scan(/>>> *(\w+)?$/) then
                   [:BLOCKQUOTE, @s[1], *pos]
                 # anything else: :TEXT
                 else
                   @s.scan(/(.*?)(  )?\r?$/)
                   token = [:TEXT, @s[1], *pos]

                   if @s[2] then
                     @tokens << token
                     [:BREAK, @s[2], pos[0] + @s[1].length, pos[1]]
                   else
                     token
                   end
                 end
    end

    self
  end

  ##
  # Returns the current token to the token stream

  def unget
    token = @current_token
    p :unget => token if @debug
    raise Error, 'too many #ungets' if token == @tokens.first
    @tokens.unshift token if token
  end

end
PK}$[
!�V(gems/gems/rdoc-6.4.1.1/lib/rdoc/erbio.rbnu�[���# frozen_string_literal: true
require 'erb'

##
# A subclass of ERB that writes directly to an IO.  Credit to Aaron Patterson
# and Masatoshi SEKI.
#
# To use:
#
#   erbio = RDoc::ERBIO.new '<%= "hello world" %>', nil, nil
#
#   File.open 'hello.txt', 'w' do |io|
#     erbio.result binding
#   end
#
# Note that binding must enclose the io you wish to output on.

class RDoc::ERBIO < ERB

  ##
  # Defaults +eoutvar+ to 'io', otherwise is identical to ERB's initialize

  def initialize str, safe_level = nil, legacy_trim_mode = nil, legacy_eoutvar = 'io', trim_mode: nil, eoutvar: 'io'
    if RUBY_VERSION >= '2.6'
      super(str, trim_mode: trim_mode, eoutvar: eoutvar)
    else
      super(str, safe_level, legacy_trim_mode, legacy_eoutvar)
    end
  end

  ##
  # Instructs +compiler+ how to write to +io_variable+

  def set_eoutvar compiler, io_variable
    compiler.put_cmd    = "#{io_variable}.write"
    compiler.insert_cmd = "#{io_variable}.write"
    compiler.pre_cmd    = []
    compiler.post_cmd   = []
  end

end

PK}$[F�v�EE%gems/gems/rdoc-6.4.1.1/lib/rdoc/rd.rbnu�[���# frozen_string_literal: true
##
# RDoc::RD implements the RD format from the rdtool gem.
#
# To choose RD as your only default format see
# RDoc::Options@Saved+Options for instructions on setting up a
# <code>.doc_options</code> file to store your project default.
#
# == LICENSE
#
# The grammar that produces RDoc::RD::BlockParser and RDoc::RD::InlineParser
# is included in RDoc under the Ruby License.
#
# You can find the original source for rdtool at
# https://github.com/uwabami/rdtool/
#
# You can use, re-distribute or change these files under Ruby's License or GPL.
#
# 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.

class RDoc::RD

  ##
  # Parses +rd+ source and returns an RDoc::Markup::Document.  If the
  # <tt>=begin</tt> or <tt>=end</tt> lines are missing they will be added.

  def self.parse rd
    rd = rd.lines.to_a

    if rd.find { |i| /\S/ === i } and !rd.find{|i| /^=begin\b/ === i } then
      rd.unshift("=begin\n").push("=end\n")
    end

    parser = RDoc::RD::BlockParser.new
    document = parser.parse rd

    # isn't this always true?
    document.parts.shift if RDoc::Markup::BlankLine === document.parts.first
    document.parts.pop   if RDoc::Markup::BlankLine === document.parts.last

    document
  end

  autoload :BlockParser,  'rdoc/rd/block_parser'
  autoload :InlineParser, 'rdoc/rd/inline_parser'
  autoload :Inline,       'rdoc/rd/inline'

end

PK}$[T��߆�'gems/gems/rdoc-6.4.1.1/lib/rdoc/text.rbnu�[���# frozen_string_literal: true

##
# For RDoc::Text#to_html

require 'strscan'

##
# Methods for manipulating comment text

module RDoc::Text

  attr_accessor :language

  ##
  # Maps markup formats to classes that can parse them.  If the format is
  # unknown, "rdoc" format is used.

  MARKUP_FORMAT = {
    'markdown' => RDoc::Markdown,
    'rdoc'     => RDoc::Markup,
    'rd'       => RDoc::RD,
    'tomdoc'   => RDoc::TomDoc,
  }

  MARKUP_FORMAT.default = RDoc::Markup

  ##
  # Maps an encoding to a Hash of characters properly transcoded for that
  # encoding.
  #
  # See also encode_fallback.

  TO_HTML_CHARACTERS = Hash.new do |h, encoding|
    h[encoding] = {
      :close_dquote => encode_fallback('”', encoding, '"'),
      :close_squote => encode_fallback('’', encoding, '\''),
      :copyright    => encode_fallback('©', encoding, '(c)'),
      :ellipsis     => encode_fallback('…', encoding, '...'),
      :em_dash      => encode_fallback('—', encoding, '---'),
      :en_dash      => encode_fallback('–', encoding, '--'),
      :open_dquote  => encode_fallback('“', encoding, '"'),
      :open_squote  => encode_fallback('‘', encoding, '\''),
      :trademark    => encode_fallback('®', encoding, '(r)'),
    }
  end

  ##
  # Transcodes +character+ to +encoding+ with a +fallback+ character.

  def self.encode_fallback character, encoding, fallback
    character.encode(encoding, :fallback => { character => fallback },
                     :undef => :replace, :replace => fallback)
  end

  ##
  # Expands tab characters in +text+ to eight spaces

  def expand_tabs text
    expanded = []

    text.each_line do |line|
      nil while line.gsub!(/(?:\G|\r)((?:.{8})*?)([^\t\r\n]{0,7})\t/) do
        r = "#{$1}#{$2}#{' ' * (8 - $2.size)}"
        r = RDoc::Encoding.change_encoding r, text.encoding
        r
      end

      expanded << line
    end

    expanded.join
  end

  ##
  # Flush +text+ left based on the shortest line

  def flush_left text
    indent = 9999

    text.each_line do |line|
      line_indent = line =~ /\S/ || 9999
      indent = line_indent if indent > line_indent
    end

    empty = ''
    empty = RDoc::Encoding.change_encoding empty, text.encoding

    text.gsub(/^ {0,#{indent}}/, empty)
  end

  ##
  # Convert a string in markup format into HTML.
  #
  # Requires the including class to implement #formatter

  def markup text
    if @store.rdoc.options
      locale = @store.rdoc.options.locale
    else
      locale = nil
    end
    if locale
      i18n_text = RDoc::I18n::Text.new(text)
      text = i18n_text.translate(locale)
    end
    parse(text).accept formatter
  end

  ##
  # Strips hashes, expands tabs then flushes +text+ to the left

  def normalize_comment text
    return text if text.empty?

    case language
    when :ruby
      text = strip_hashes text
    when :c
      text = strip_stars text
    end
    text = expand_tabs    text
    text = flush_left     text
    text = strip_newlines text
    text
  end

  ##
  # Normalizes +text+ then builds a RDoc::Markup::Document from it

  def parse text, format = 'rdoc'
    return text if RDoc::Markup::Document === text
    return text.parse if RDoc::Comment === text

    text = normalize_comment text # TODO remove, should not be necessary

    return RDoc::Markup::Document.new if text =~ /\A\n*\z/

    MARKUP_FORMAT[format].parse text
  end

  ##
  # The first +limit+ characters of +text+ as HTML

  def snippet text, limit = 100
    document = parse text

    RDoc::Markup::ToHtmlSnippet.new(options, limit).convert document
  end

  ##
  # Strips leading # characters from +text+

  def strip_hashes text
    return text if text =~ /^(?>\s*)[^\#]/

    empty = ''
    empty = RDoc::Encoding.change_encoding empty, text.encoding

    text.gsub(/^\s*(#+)/) { $1.tr '#', ' ' }.gsub(/^\s+$/, empty)
  end

  ##
  # Strips leading and trailing \n characters from +text+

  def strip_newlines text
    text.gsub(/\A\n*(.*?)\n*\z/m) do $1 end # block preserves String encoding
  end

  ##
  # Strips /* */ style comments

  def strip_stars text
    return text unless text =~ %r%/\*.*\*/%m

    encoding = text.encoding

    text = text.gsub %r%Document-method:\s+[\w:.#=!?|^&<>~+\-/*\%@`\[\]]+%, ''

    space = ' '
    space = RDoc::Encoding.change_encoding space, encoding if encoding

    text.sub!  %r%/\*+%       do space * $&.length end
    text.sub!  %r%\*+/%       do space * $&.length end
    text.gsub! %r%^[ \t]*\*%m do space * $&.length end

    empty = ''
    empty = RDoc::Encoding.change_encoding empty, encoding if encoding
    text.gsub(/^\s+$/, empty)
  end

  ##
  # Converts ampersand, dashes, ellipsis, quotes, copyright and registered
  # trademark symbols in +text+ to properly encoded characters.

  def to_html text
    html = (''.encode text.encoding).dup

    encoded = RDoc::Text::TO_HTML_CHARACTERS[text.encoding]

    s = StringScanner.new text
    insquotes = false
    indquotes = false
    after_word = nil

    until s.eos? do
      case
      when s.scan(/<(tt|code)>.*?<\/\1>/) then # skip contents of tt
        html << s.matched.gsub('\\\\', '\\')
      when s.scan(/<(tt|code)>.*?/) then
        warn "mismatched <#{s[1]}> tag" # TODO signal file/line
        html << s.matched
      when s.scan(/<[^>]+\/?s*>/) then # skip HTML tags
        html << s.matched
      when s.scan(/\\(\S)/) then # unhandled suppressed crossref
        html << s[1]
        after_word = nil
      when s.scan(/\.\.\.(\.?)/) then
        html << s[1] << encoded[:ellipsis]
        after_word = nil
      when s.scan(/\(c\)/i) then
        html << encoded[:copyright]
        after_word = nil
      when s.scan(/\(r\)/i) then
        html << encoded[:trademark]
        after_word = nil
      when s.scan(/---/) then
        html << encoded[:em_dash]
        after_word = nil
      when s.scan(/--/) then
        html << encoded[:en_dash]
        after_word = nil
      when s.scan(/&quot;|"/) then
        html << encoded[indquotes ? :close_dquote : :open_dquote]
        indquotes = !indquotes
        after_word = nil
      when s.scan(/``/) then # backtick double quote
        html << encoded[:open_dquote]
        after_word = nil
      when s.scan(/(?:&#39;|'){2}/) then # tick double quote
        html << encoded[:close_dquote]
        after_word = nil
      when s.scan(/`/) then # backtick
        if insquotes or after_word
          html << '`'
          after_word = false
        else
          html << encoded[:open_squote]
          insquotes = true
        end
      when s.scan(/&#39;|'/) then # single quote
        if insquotes
          html << encoded[:close_squote]
          insquotes = false
        elsif after_word
          # Mary's dog, my parents' house: do not start paired quotes
          html << encoded[:close_squote]
        else
          html << encoded[:open_squote]
          insquotes = true
        end

        after_word = nil
      else # advance to the next potentially significant character
        match = s.scan(/.+?(?=[<\\.("'`&-])/) #"

        if match then
          html << match
          after_word = match =~ /\w$/
        else
          html << s.rest
          break
        end
      end
    end

    html
  end

  ##
  # Wraps +txt+ to +line_len+

  def wrap(txt, line_len = 76)
    res = []
    sp = 0
    ep = txt.length

    while sp < ep
      # scan back for a space
      p = sp + line_len - 1
      if p >= ep
        p = ep
      else
        while p > sp and txt[p] != ?\s
          p -= 1
        end
        if p <= sp
          p = sp + line_len
          while p < ep and txt[p] != ?\s
            p += 1
          end
        end
      end
      res << txt[sp...p] << "\n"
      sp = p
      sp += 1 while sp < ep and txt[sp] == ?\s
    end

    res.join.strip
  end

end
PK}$[Ȅ���-gems/gems/rdoc-6.4.1.1/lib/rdoc/anon_class.rbnu�[���# frozen_string_literal: true
##
# An anonymous class like:
#
#   c = Class.new do end
#
# AnonClass is currently not used.

class RDoc::AnonClass < RDoc::ClassModule
end

PK}$[}{�})�)�*gems/gems/rdoc-6.4.1.1/lib/rdoc/options.rbnu�[���# frozen_string_literal: true
require 'optparse'
require 'pathname'

##
# RDoc::Options handles the parsing and storage of options
#
# == Saved Options
#
# You can save some options like the markup format in the
# <tt>.rdoc_options</tt> file in your gem.  The easiest way to do this is:
#
#   rdoc --markup tomdoc --write-options
#
# Which will automatically create the file and fill it with the options you
# specified.
#
# The following options will not be saved since they interfere with the user's
# preferences or with the normal operation of RDoc:
#
# * +--coverage-report+
# * +--dry-run+
# * +--encoding+
# * +--force-update+
# * +--format+
# * +--pipe+
# * +--quiet+
# * +--template+
# * +--verbose+
#
# == Custom Options
#
# Generators can hook into RDoc::Options to add generator-specific command
# line options.
#
# When <tt>--format</tt> is encountered in ARGV, RDoc calls ::setup_options on
# the generator class to add extra options to the option parser.  Options for
# custom generators must occur after <tt>--format</tt>.  <tt>rdoc --help</tt>
# will list options for all installed generators.
#
# Example:
#
#   class RDoc::Generator::Spellcheck
#     RDoc::RDoc.add_generator self
#
#     def self.setup_options rdoc_options
#       op = rdoc_options.option_parser
#
#       op.on('--spell-dictionary DICTIONARY',
#             RDoc::Options::Path) do |dictionary|
#         rdoc_options.spell_dictionary = dictionary
#       end
#     end
#   end
#
# Of course, RDoc::Options does not respond to +spell_dictionary+ by default
# so you will need to add it:
#
#   class RDoc::Options
#
#     ##
#     # The spell dictionary used by the spell-checking plugin.
#
#     attr_accessor :spell_dictionary
#
#   end
#
# == Option Validators
#
# OptionParser validators will validate and cast user input values.  In
# addition to the validators that ship with OptionParser (String, Integer,
# Float, TrueClass, FalseClass, Array, Regexp, Date, Time, URI, etc.),
# RDoc::Options adds Path, PathArray and Template.

class RDoc::Options

  ##
  # The deprecated options.

  DEPRECATED = {
    '--accessor'      => 'support discontinued',
    '--diagram'       => 'support discontinued',
    '--help-output'   => 'support discontinued',
    '--image-format'  => 'was an option for --diagram',
    '--inline-source' => 'source code is now always inlined',
    '--merge'         => 'ri now always merges class information',
    '--one-file'      => 'support discontinued',
    '--op-name'       => 'support discontinued',
    '--opname'        => 'support discontinued',
    '--promiscuous'   => 'files always only document their content',
    '--ri-system'     => 'Ruby installers use other techniques',
  }

  ##
  # RDoc options ignored (or handled specially) by --write-options

  SPECIAL = %w[
    coverage_report
    dry_run
    encoding
    files
    force_output
    force_update
    generator
    generator_name
    generator_options
    generators
    op_dir
    option_parser
    pipe
    rdoc_include
    root
    static_path
    stylesheet_url
    template
    template_dir
    update_output_dir
    verbosity
    write_options
  ]

  ##
  # Option validator for OptionParser that matches a directory that exists on
  # the filesystem.

  Directory = Object.new

  ##
  # Option validator for OptionParser that matches a file or directory that
  # exists on the filesystem.

  Path = Object.new

  ##
  # Option validator for OptionParser that matches a comma-separated list of
  # files or directories that exist on the filesystem.

  PathArray = Object.new

  ##
  # Option validator for OptionParser that matches a template directory for an
  # installed generator that lives in
  # <tt>"rdoc/generator/template/#{template_name}"</tt>

  Template = Object.new

  ##
  # Character-set for HTML output.  #encoding is preferred over #charset

  attr_accessor :charset

  ##
  # If true, RDoc will not write any files.

  attr_accessor :dry_run

  ##
  # The output encoding.  All input files will be transcoded to this encoding.
  #
  # The default encoding is UTF-8.  This is set via --encoding.

  attr_accessor :encoding

  ##
  # Files matching this pattern will be excluded

  attr_writer :exclude

  ##
  # The list of files to be processed

  attr_accessor :files

  ##
  # Create the output even if the output directory does not look
  # like an rdoc output directory

  attr_accessor :force_output

  ##
  # Scan newer sources than the flag file if true.

  attr_accessor :force_update

  ##
  # Formatter to mark up text with

  attr_accessor :formatter

  ##
  # Description of the output generator (set with the <tt>--format</tt> option)

  attr_accessor :generator

  ##
  # For #==

  attr_reader :generator_name # :nodoc:

  ##
  # Loaded generator options.  Used to prevent --help from loading the same
  # options multiple times.

  attr_accessor :generator_options

  ##
  # Old rdoc behavior: hyperlink all words that match a method name,
  # even if not preceded by '#' or '::'

  attr_accessor :hyperlink_all

  ##
  # Include line numbers in the source code

  attr_accessor :line_numbers

  ##
  # The output locale.

  attr_accessor :locale

  ##
  # The directory where locale data live.

  attr_accessor :locale_dir

  ##
  # Name of the file, class or module to display in the initial index page (if
  # not specified the first file we encounter is used)

  attr_accessor :main_page

  ##
  # The default markup format.  The default is 'rdoc'.  'markdown', 'tomdoc'
  # and 'rd' are also built-in.

  attr_accessor :markup

  ##
  # If true, only report on undocumented files

  attr_accessor :coverage_report

  ##
  # The name of the output directory

  attr_accessor :op_dir

  ##
  # The OptionParser for this instance

  attr_accessor :option_parser

  ##
  # Output heading decorations?
  attr_accessor :output_decoration

  ##
  # Directory where guides, FAQ, and other pages not associated with a class
  # live.  You may leave this unset if these are at the root of your project.

  attr_accessor :page_dir

  ##
  # Is RDoc in pipe mode?

  attr_accessor :pipe

  ##
  # Array of directories to search for files to satisfy an :include:

  attr_accessor :rdoc_include

  ##
  # Root of the source documentation will be generated for.  Set this when
  # building documentation outside the source directory.  Defaults to the
  # current directory.

  attr_accessor :root

  ##
  # Include the '#' at the front of hyperlinked instance method names

  attr_accessor :show_hash

  ##
  # Directory to copy static files from

  attr_accessor :static_path

  ##
  # The number of columns in a tab

  attr_accessor :tab_width

  ##
  # Template to be used when generating output

  attr_accessor :template

  ##
  # Directory the template lives in

  attr_accessor :template_dir

  ##
  # Additional template stylesheets

  attr_accessor :template_stylesheets

  ##
  # Documentation title

  attr_accessor :title

  ##
  # Should RDoc update the timestamps in the output dir?

  attr_accessor :update_output_dir

  ##
  # Verbosity, zero means quiet

  attr_accessor :verbosity

  ##
  # URL of web cvs frontend

  attr_accessor :webcvs

  ##
  # Minimum visibility of a documented method. One of +:public+, +:protected+,
  # +:private+ or +:nodoc+.
  #
  # The +:nodoc+ visibility ignores all directives related to visibility.  The
  # other visibilities may be overridden on a per-method basis with the :doc:
  # directive.

  attr_reader :visibility

  def initialize loaded_options = nil # :nodoc:
    init_ivars
    override loaded_options if loaded_options
  end

  def init_ivars # :nodoc:
    @dry_run = false
    @exclude = %w[
      ~\z \.orig\z \.rej\z \.bak\z
      \.gemspec\z
    ]
    @files = nil
    @force_output = false
    @force_update = true
    @generator = nil
    @generator_name = nil
    @generator_options = []
    @generators = RDoc::RDoc::GENERATORS
    @hyperlink_all = false
    @line_numbers = false
    @locale = nil
    @locale_name = nil
    @locale_dir = 'locale'
    @main_page = nil
    @markup = 'rdoc'
    @coverage_report = false
    @op_dir = nil
    @page_dir = nil
    @pipe = false
    @output_decoration = true
    @rdoc_include = []
    @root = Pathname(Dir.pwd)
    @show_hash = false
    @static_path = []
    @stylesheet_url = nil # TODO remove in RDoc 4
    @tab_width = 8
    @template = nil
    @template_dir = nil
    @template_stylesheets = []
    @title = nil
    @update_output_dir = true
    @verbosity = 1
    @visibility = :protected
    @webcvs = nil
    @write_options = false
    @encoding = Encoding::UTF_8
    @charset = @encoding.name
  end

  def init_with map # :nodoc:
    init_ivars

    encoding = map['encoding']
    @encoding = encoding ? Encoding.find(encoding) : encoding

    @charset        = map['charset']
    @exclude        = map['exclude']
    @generator_name = map['generator_name']
    @hyperlink_all  = map['hyperlink_all']
    @line_numbers   = map['line_numbers']
    @locale_name    = map['locale_name']
    @locale_dir     = map['locale_dir']
    @main_page      = map['main_page']
    @markup         = map['markup']
    @op_dir         = map['op_dir']
    @show_hash      = map['show_hash']
    @tab_width      = map['tab_width']
    @template_dir   = map['template_dir']
    @title          = map['title']
    @visibility     = map['visibility']
    @webcvs         = map['webcvs']

    @rdoc_include = sanitize_path map['rdoc_include']
    @static_path  = sanitize_path map['static_path']
  end

  def yaml_initialize tag, map # :nodoc:
    init_with map
  end

  def override map # :nodoc:
    if map.has_key?('encoding')
      encoding = map['encoding']
      @encoding = encoding ? Encoding.find(encoding) : encoding
    end

    @charset        = map['charset']        if map.has_key?('charset')
    @exclude        = map['exclude']        if map.has_key?('exclude')
    @generator_name = map['generator_name'] if map.has_key?('generator_name')
    @hyperlink_all  = map['hyperlink_all']  if map.has_key?('hyperlink_all')
    @line_numbers   = map['line_numbers']   if map.has_key?('line_numbers')
    @locale_name    = map['locale_name']    if map.has_key?('locale_name')
    @locale_dir     = map['locale_dir']     if map.has_key?('locale_dir')
    @main_page      = map['main_page']      if map.has_key?('main_page')
    @markup         = map['markup']         if map.has_key?('markup')
    @op_dir         = map['op_dir']         if map.has_key?('op_dir')
    @show_hash      = map['show_hash']      if map.has_key?('show_hash')
    @tab_width      = map['tab_width']      if map.has_key?('tab_width')
    @template_dir   = map['template_dir']   if map.has_key?('template_dir')
    @title          = map['title']          if map.has_key?('title')
    @visibility     = map['visibility']     if map.has_key?('visibility')
    @webcvs         = map['webcvs']         if map.has_key?('webcvs')

    if map.has_key?('rdoc_include')
      @rdoc_include = sanitize_path map['rdoc_include']
    end
    if map.has_key?('static_path')
      @static_path  = sanitize_path map['static_path']
    end
  end

  def == other # :nodoc:
    self.class === other and
      @encoding       == other.encoding       and
      @generator_name == other.generator_name and
      @hyperlink_all  == other.hyperlink_all  and
      @line_numbers   == other.line_numbers   and
      @locale         == other.locale         and
      @locale_dir     == other.locale_dir and
      @main_page      == other.main_page      and
      @markup         == other.markup         and
      @op_dir         == other.op_dir         and
      @rdoc_include   == other.rdoc_include   and
      @show_hash      == other.show_hash      and
      @static_path    == other.static_path    and
      @tab_width      == other.tab_width      and
      @template       == other.template       and
      @title          == other.title          and
      @visibility     == other.visibility     and
      @webcvs         == other.webcvs
  end

  ##
  # Check that the files on the command line exist

  def check_files
    @files.delete_if do |file|
      if File.exist? file then
        if File.readable? file then
          false
        else
          warn "file '#{file}' not readable"

          true
        end
      else
        warn "file '#{file}' not found"

        true
      end
    end
  end

  ##
  # Ensure only one generator is loaded

  def check_generator
    if @generator then
      raise OptionParser::InvalidOption,
        "generator already set to #{@generator_name}"
    end
  end

  ##
  # Set the title, but only if not already set. Used to set the title
  # from a source file, so that a title set from the command line
  # will have the priority.

  def default_title=(string)
    @title ||= string
  end

  ##
  # For dumping YAML

  def encode_with coder # :nodoc:
    encoding = @encoding ? @encoding.name : nil

    coder.add 'encoding', encoding
    coder.add 'static_path',  sanitize_path(@static_path)
    coder.add 'rdoc_include', sanitize_path(@rdoc_include)

    ivars = instance_variables.map { |ivar| ivar.to_s[1..-1] }
    ivars -= SPECIAL

    ivars.sort.each do |ivar|
      coder.add ivar, instance_variable_get("@#{ivar}")
    end
  end

  ##
  # Create a regexp for #exclude

  def exclude
    if @exclude.nil? or Regexp === @exclude then
      # done, #finish is being re-run
      @exclude
    elsif @exclude.empty? then
      nil
    else
      Regexp.new(@exclude.join("|"))
    end
  end

  ##
  # Completes any unfinished option setup business such as filtering for
  # existent files, creating a regexp for #exclude and setting a default
  # #template.

  def finish
    @op_dir ||= 'doc'

    @rdoc_include << "." if @rdoc_include.empty?
    root = @root.to_s
    @rdoc_include << root unless @rdoc_include.include?(root)

    @exclude = self.exclude

    finish_page_dir

    check_files

    # If no template was specified, use the default template for the output
    # formatter

    unless @template then
      @template     = @generator_name
      @template_dir = template_dir_for @template
    end

    if @locale_name
      @locale = RDoc::I18n::Locale[@locale_name]
      @locale.load(@locale_dir)
    else
      @locale = nil
    end

    self
  end

  ##
  # Fixes the page_dir to be relative to the root_dir and adds the page_dir to
  # the files list.

  def finish_page_dir
    return unless @page_dir

    @files << @page_dir.to_s

    page_dir = nil
    begin
      page_dir = @page_dir.expand_path.relative_path_from @root
    rescue ArgumentError
      # On Windows, sometimes crosses different drive letters.
      page_dir = @page_dir.expand_path
    end

    @page_dir = page_dir
  end

  ##
  # Returns a properly-space list of generators and their descriptions.

  def generator_descriptions
    lengths = []

    generators = RDoc::RDoc::GENERATORS.map do |name, generator|
      lengths << name.length

      description = generator::DESCRIPTION if
        generator.const_defined? :DESCRIPTION

      [name, description]
    end

    longest = lengths.max

    generators.sort.map do |name, description|
      if description then
        "  %-*s - %s" % [longest, name, description]
      else
        "  #{name}"
      end
    end.join "\n"
  end

  ##
  # Parses command line options.

  def parse argv
    ignore_invalid = true

    argv.insert(0, *ENV['RDOCOPT'].split) if ENV['RDOCOPT']

    opts = OptionParser.new do |opt|
      @option_parser = opt
      opt.program_name = File.basename $0
      opt.version = RDoc::VERSION
      opt.release = nil
      opt.summary_indent = ' ' * 4
      opt.banner = <<-EOF
Usage: #{opt.program_name} [options] [names...]

  Files are parsed, and the information they contain collected, before any
  output is produced. This allows cross references between all files to be
  resolved. If a name is a directory, it is traversed. If no names are
  specified, all Ruby files in the current directory (and subdirectories) are
  processed.

  How RDoc generates output depends on the output formatter being used, and on
  the options you give.

  Options can be specified via the RDOCOPT environment variable, which
  functions similar to the RUBYOPT environment variable for ruby.

    $ export RDOCOPT="--show-hash"

  will make rdoc show hashes in method links by default.  Command-line options
  always will override those in RDOCOPT.

  Available formatters:

#{generator_descriptions}

  RDoc understands the following file formats:

      EOF

      parsers = Hash.new { |h,parser| h[parser] = [] }

      RDoc::Parser.parsers.each do |regexp, parser|
        parsers[parser.name.sub('RDoc::Parser::', '')] << regexp.source
      end

      parsers.sort.each do |parser, regexp|
        opt.banner += "  - #{parser}: #{regexp.join ', '}\n"
      end
      opt.banner += "  - TomDoc:  Only in ruby files\n"

      opt.banner += "\n  The following options are deprecated:\n\n"

      name_length = DEPRECATED.keys.sort_by { |k| k.length }.last.length

      DEPRECATED.sort_by { |k,| k }.each do |name, reason|
        opt.banner += "    %*1$2$s  %3$s\n" % [-name_length, name, reason]
      end

      opt.accept Template do |template|
        template_dir = template_dir_for template

        unless template_dir then
          $stderr.puts "could not find template #{template}"
          nil
        else
          [template, template_dir]
        end
      end

      opt.accept Directory do |directory|
        directory = File.expand_path directory

        raise OptionParser::InvalidArgument unless File.directory? directory

        directory
      end

      opt.accept Path do |path|
        path = File.expand_path path

        raise OptionParser::InvalidArgument unless File.exist? path

        path
      end

      opt.accept PathArray do |paths,|
        paths = if paths then
                  paths.split(',').map { |d| d unless d.empty? }
                end

        paths.map do |path|
          path = File.expand_path path

          raise OptionParser::InvalidArgument unless File.exist? path

          path
        end
      end

      opt.separator nil
      opt.separator "Parsing options:"
      opt.separator nil

      opt.on("--encoding=ENCODING", "-e", Encoding.list.map { |e| e.name },
             "Specifies the output encoding.  All files",
             "read will be converted to this encoding.",
             "The default encoding is UTF-8.",
             "--encoding is preferred over --charset") do |value|
               @encoding = Encoding.find value
               @charset = @encoding.name # may not be valid value
             end

      opt.separator nil

      opt.on("--locale=NAME",
             "Specifies the output locale.") do |value|
        @locale_name = value
      end

      opt.on("--locale-data-dir=DIR",
             "Specifies the directory where locale data live.") do |value|
        @locale_dir = value
      end

      opt.separator nil

      opt.on("--all", "-a",
             "Synonym for --visibility=private.") do |value|
        @visibility = :private
      end

      opt.separator nil

      opt.on("--exclude=PATTERN", "-x", Regexp,
             "Do not process files or directories",
             "matching PATTERN.") do |value|
        @exclude << value
      end

      opt.separator nil

      opt.on("--extension=NEW=OLD", "-E",
             "Treat files ending with .new as if they",
             "ended with .old. Using '-E cgi=rb' will",
             "cause xxx.cgi to be parsed as a Ruby file.") do |value|
        new, old = value.split(/=/, 2)

        unless new and old then
          raise OptionParser::InvalidArgument, "Invalid parameter to '-E'"
        end

        unless RDoc::Parser.alias_extension old, new then
          raise OptionParser::InvalidArgument, "Unknown extension .#{old} to -E"
        end
      end

      opt.separator nil

      opt.on("--[no-]force-update", "-U",
             "Forces rdoc to scan all sources even if",
             "no files are newer than the flag file.") do |value|
        @force_update = value
      end

      opt.separator nil

      opt.on("--pipe", "-p",
             "Convert RDoc on stdin to HTML") do
        @pipe = true
      end

      opt.separator nil

      opt.on("--tab-width=WIDTH", "-w", Integer,
             "Set the width of tab characters.") do |value|
        raise OptionParser::InvalidArgument,
              "#{value} is an invalid tab width" if value <= 0
        @tab_width = value
      end

      opt.separator nil

      opt.on("--visibility=VISIBILITY", "-V", RDoc::VISIBILITIES + [:nodoc],
             "Minimum visibility to document a method.",
             "One of 'public', 'protected' (the default),",
             "'private' or 'nodoc' (show everything)") do |value|
        @visibility = value
      end

      opt.separator nil

      markup_formats = RDoc::Text::MARKUP_FORMAT.keys.sort

      opt.on("--markup=MARKUP", markup_formats,
             "The markup format for the named files.",
             "The default is rdoc.  Valid values are:",
             markup_formats.join(', ')) do |value|
        @markup = value
      end

      opt.separator nil

      opt.on("--root=ROOT", Directory,
             "Root of the source tree documentation",
             "will be generated for.  Set this when",
             "building documentation outside the",
             "source directory.  Default is the",
             "current directory.") do |root|
        @root = Pathname(root)
      end

      opt.separator nil

      opt.on("--page-dir=DIR", Directory,
             "Directory where guides, your FAQ or",
             "other pages not associated with a class",
             "live.  Set this when you don't store",
             "such files at your project root.",
             "NOTE: Do not use the same file name in",
             "the page dir and the root of your project") do |page_dir|
        @page_dir = Pathname(page_dir)
      end

      opt.separator nil
      opt.separator "Common generator options:"
      opt.separator nil

      opt.on("--force-output", "-O",
             "Forces rdoc to write the output files,",
             "even if the output directory exists",
             "and does not seem to have been created",
             "by rdoc.") do |value|
        @force_output = value
      end

      opt.separator nil

      generator_text = @generators.keys.map { |name| "  #{name}" }.sort

      opt.on("-f", "--fmt=FORMAT", "--format=FORMAT", @generators.keys,
             "Set the output formatter.  One of:", *generator_text) do |value|
        check_generator

        @generator_name = value.downcase
        setup_generator
      end

      opt.separator nil

      opt.on("--include=DIRECTORIES", "-i", PathArray,
             "Set (or add to) the list of directories to",
             "be searched when satisfying :include:",
             "requests. Can be used more than once.") do |value|
        @rdoc_include.concat value.map { |dir| dir.strip }
      end

      opt.separator nil

      opt.on("--[no-]coverage-report=[LEVEL]", "--[no-]dcov", "-C", Integer,
             "Prints a report on undocumented items.",
             "Does not generate files.") do |value|
        value = 0 if value.nil? # Integer converts -C to nil

        @coverage_report = value
        @force_update = true if value
      end

      opt.separator nil

      opt.on("--output=DIR", "--op", "-o",
             "Set the output directory.") do |value|
        @op_dir = value
      end

      opt.separator nil

      opt.on("-d",
             "Deprecated --diagram option.",
             "Prevents firing debug mode",
             "with legacy invocation.") do |value|
      end

      opt.separator nil
      opt.separator 'HTML generator options:'
      opt.separator nil

      opt.on("--charset=CHARSET", "-c",
             "Specifies the output HTML character-set.",
             "Use --encoding instead of --charset if",
             "available.") do |value|
        @charset = value
      end

      opt.separator nil

      opt.on("--hyperlink-all", "-A",
             "Generate hyperlinks for all words that",
             "correspond to known methods, even if they",
             "do not start with '#' or '::' (legacy",
             "behavior).") do |value|
        @hyperlink_all = value
      end

      opt.separator nil

      opt.on("--main=NAME", "-m",
             "NAME will be the initial page displayed.") do |value|
        @main_page = value
      end

      opt.separator nil

      opt.on("--[no-]line-numbers", "-N",
             "Include line numbers in the source code.",
             "By default, only the number of the first",
             "line is displayed, in a leading comment.") do |value|
        @line_numbers = value
      end

      opt.separator nil

      opt.on("--show-hash", "-H",
             "A name of the form #name in a comment is a",
             "possible hyperlink to an instance method",
             "name. When displayed, the '#' is removed",
             "unless this option is specified.") do |value|
        @show_hash = value
      end

      opt.separator nil

      opt.on("--template=NAME", "-T", Template,
             "Set the template used when generating",
             "output. The default depends on the",
             "formatter used.") do |(template, template_dir)|
        @template     = template
        @template_dir = template_dir
      end

      opt.separator nil

      opt.on("--template-stylesheets=FILES", PathArray,
             "Set (or add to) the list of files to",
             "include with the html template.") do |value|
        @template_stylesheets.concat value
      end

      opt.separator nil

      opt.on("--title=TITLE", "-t",
             "Set TITLE as the title for HTML output.") do |value|
        @title = value
      end

      opt.separator nil

      opt.on("--copy-files=PATH", Path,
             "Specify a file or directory to copy static",
             "files from.",
             "If a file is given it will be copied into",
             "the output dir.  If a directory is given the",
             "entire directory will be copied.",
             "You can use this multiple times") do |value|
        @static_path << value
      end

      opt.separator nil

      opt.on("--webcvs=URL", "-W",
             "Specify a URL for linking to a web frontend",
             "to CVS. If the URL contains a '\%s', the",
             "name of the current file will be",
             "substituted; if the URL doesn't contain a",
             "'\%s', the filename will be appended to it.") do |value|
        @webcvs = value
      end

      opt.separator nil
      opt.separator "ri generator options:"
      opt.separator nil

      opt.on("--ri", "-r",
             "Generate output for use by `ri`. The files",
             "are stored in the '.rdoc' directory under",
             "your home directory unless overridden by a",
             "subsequent --op parameter, so no special",
             "privileges are needed.") do |value|
        check_generator

        @generator_name = "ri"
        @op_dir ||= RDoc::RI::Paths::HOMEDIR
        setup_generator
      end

      opt.separator nil

      opt.on("--ri-site", "-R",
             "Generate output for use by `ri`. The files",
             "are stored in a site-wide directory,",
             "making them accessible to others, so",
             "special privileges are needed.") do |value|
        check_generator

        @generator_name = "ri"
        @op_dir = RDoc::RI::Paths.site_dir
        setup_generator
      end

      opt.separator nil
      opt.separator "Generic options:"
      opt.separator nil

      opt.on("--write-options",
             "Write .rdoc_options to the current",
             "directory with the given options.  Not all",
             "options will be used.  See RDoc::Options",
             "for details.") do |value|
        @write_options = true
      end

      opt.separator nil

      opt.on("--[no-]dry-run",
             "Don't write any files") do |value|
        @dry_run = value
      end

      opt.separator nil

      opt.on("-D", "--[no-]debug",
             "Displays lots on internal stuff.") do |value|
        $DEBUG_RDOC = value
      end

      opt.separator nil

      opt.on("--[no-]ignore-invalid",
             "Ignore invalid options and continue",
             "(default true).") do |value|
        ignore_invalid = value
      end

      opt.separator nil

      opt.on("--quiet", "-q",
             "Don't show progress as we parse.") do |value|
        @verbosity = 0
      end

      opt.separator nil

      opt.on("--verbose", "-V",
             "Display extra progress as RDoc parses") do |value|
        @verbosity = 2
      end

      opt.separator nil

      opt.on("--version", "-v", "print the version") do
        puts opt.version
        exit
      end

      opt.separator nil

      opt.on("--help", "-h", "Display this help") do
        RDoc::RDoc::GENERATORS.each_key do |generator|
          setup_generator generator
        end

        puts opt.help
        exit
      end

      opt.separator nil
    end

    setup_generator 'darkfish' if
      argv.grep(/\A(-f|--fmt|--format|-r|-R|--ri|--ri-site)\b/).empty?

    deprecated = []
    invalid = []

    begin
      opts.parse! argv
    rescue OptionParser::ParseError => e
      if DEPRECATED[e.args.first] then
        deprecated << e.args.first
      elsif %w[--format --ri -r --ri-site -R].include? e.args.first then
        raise
      else
        invalid << e.args.join(' ')
      end

      retry
    end

    unless @generator then
      @generator = RDoc::Generator::Darkfish
      @generator_name = 'darkfish'
    end

    if @pipe and not argv.empty? then
      @pipe = false
      invalid << '-p (with files)'
    end

    unless quiet then
      deprecated.each do |opt|
        $stderr.puts 'option ' + opt + ' is deprecated: ' + DEPRECATED[opt]
      end
    end

    unless invalid.empty? then
      invalid = "invalid options: #{invalid.join ', '}"

      if ignore_invalid then
        unless quiet then
          $stderr.puts invalid
          $stderr.puts '(invalid options are ignored)'
        end
      else
        unless quiet then
          $stderr.puts opts
        end
        $stderr.puts invalid
        exit 1
      end
    end

    @files = argv.dup

    finish

    if @write_options then
      write_options
      exit
    end

    self
  end

  ##
  # Don't display progress as we process the files

  def quiet
    @verbosity.zero?
  end

  ##
  # Set quietness to +bool+

  def quiet= bool
    @verbosity = bool ? 0 : 1
  end

  ##
  # Removes directories from +path+ that are outside the current directory

  def sanitize_path path
    require 'pathname'
    dot = Pathname.new('.').expand_path

    path.reject do |item|
      path = Pathname.new(item).expand_path
      is_reject = nil
      relative = nil
      begin
        relative = path.relative_path_from(dot).to_s
      rescue ArgumentError
        # On Windows, sometimes crosses different drive letters.
        is_reject = true
      else
        is_reject = relative.start_with? '..'
      end
      is_reject
    end
  end

  ##
  # Set up an output generator for the named +generator_name+.
  #
  # If the found generator responds to :setup_options it will be called with
  # the options instance.  This allows generators to add custom options or set
  # default options.

  def setup_generator generator_name = @generator_name
    @generator = @generators[generator_name]

    unless @generator then
      raise OptionParser::InvalidArgument,
            "Invalid output formatter #{generator_name}"
    end

    return if @generator_options.include? @generator

    @generator_name = generator_name
    @generator_options << @generator

    if @generator.respond_to? :setup_options then
      @option_parser ||= OptionParser.new
      @generator.setup_options self
    end
  end

  ##
  # Finds the template dir for +template+

  def template_dir_for template
    template_path = File.join 'rdoc', 'generator', 'template', template

    $LOAD_PATH.map do |path|
      File.join File.expand_path(path), template_path
    end.find do |dir|
      File.directory? dir
    end
  end

  # Sets the minimum visibility of a documented method.
  #
  # Accepts +:public+, +:protected+, +:private+, +:nodoc+, or +:all+.
  #
  # When +:all+ is passed, visibility is set to +:private+, similarly to
  # RDOCOPT="--all", see #visibility for more information.

  def visibility= visibility
    case visibility
    when :all
      @visibility = :private
    else
      @visibility = visibility
    end
  end

  ##
  # Displays a warning using Kernel#warn if we're being verbose

  def warn message
    super message if @verbosity > 1
  end

  ##
  # Writes the YAML file .rdoc_options to the current directory containing the
  # parsed options.

  def write_options
    RDoc.load_yaml

    File.open '.rdoc_options', 'w' do |io|
      io.set_encoding Encoding::UTF_8

      YAML.dump self, io
    end
  end

  ##
  # Loads options from .rdoc_options if the file exists, otherwise creates a
  # new RDoc::Options instance.

  def self.load_options
    options_file = File.expand_path '.rdoc_options'
    return RDoc::Options.new unless File.exist? options_file

    RDoc.load_yaml

    begin
      options = YAML.safe_load File.read('.rdoc_options'), permitted_classes: [RDoc::Options, Symbol]
    rescue Psych::SyntaxError
      raise RDoc::Error, "#{options_file} is not a valid rdoc options file"
    end

    return RDoc::Options.new unless options # Allow empty file.

    raise RDoc::Error, "#{options_file} is not a valid rdoc options file" unless
      RDoc::Options === options or Hash === options

    if Hash === options
      # Override the default values with the contents of YAML file.
      options = RDoc::Options.new options
    end

    options
  end

end
PK}$[�at��)�)(gems/gems/rdoc-6.4.1.1/lib/rdoc/stats.rbnu�[���# frozen_string_literal: true
##
# RDoc statistics collector which prints a summary and report of a project's
# documentation totals.

class RDoc::Stats

  include RDoc::Text

  ##
  # Output level for the coverage report

  attr_reader :coverage_level

  ##
  # Count of files parsed during parsing

  attr_reader :files_so_far

  ##
  # Total number of files found

  attr_reader :num_files

  ##
  # Creates a new Stats that will have +num_files+.  +verbosity+ defaults to 1
  # which will create an RDoc::Stats::Normal outputter.

  def initialize store, num_files, verbosity = 1
    @num_files = num_files
    @store     = store

    @coverage_level   = 0
    @doc_items        = nil
    @files_so_far     = 0
    @fully_documented = false
    @num_params       = 0
    @percent_doc      = nil
    @start            = Time.now
    @undoc_params     = 0

    @display = case verbosity
               when 0 then Quiet.new   num_files
               when 1 then Normal.new  num_files
               else        Verbose.new num_files
               end
  end

  ##
  # Records the parsing of an alias +as+.

  def add_alias as
    @display.print_alias as
  end

  ##
  # Records the parsing of an attribute +attribute+

  def add_attribute attribute
    @display.print_attribute attribute
  end

  ##
  # Records the parsing of a class +klass+

  def add_class klass
    @display.print_class klass
  end

  ##
  # Records the parsing of +constant+

  def add_constant constant
    @display.print_constant constant
  end

  ##
  # Records the parsing of +file+

  def add_file(file)
    @files_so_far += 1
    @display.print_file @files_so_far, file
  end

  ##
  # Records the parsing of +method+

  def add_method(method)
    @display.print_method method
  end

  ##
  # Records the parsing of a module +mod+

  def add_module(mod)
    @display.print_module mod
  end

  ##
  # Call this to mark the beginning of parsing for display purposes

  def begin_adding
    @display.begin_adding
  end

  ##
  # Calculates documentation totals and percentages for classes, modules,
  # constants, attributes and methods.

  def calculate
    return if @doc_items

    ucm = @store.unique_classes_and_modules

    classes = @store.unique_classes.reject { |cm| cm.full_name == 'Object' }

    constants = []
    ucm.each { |cm| constants.concat cm.constants }

    methods = []
    ucm.each { |cm| methods.concat cm.method_list }

    attributes = []
    ucm.each { |cm| attributes.concat cm.attributes }

    @num_attributes, @undoc_attributes = doc_stats attributes
    @num_classes,    @undoc_classes    = doc_stats classes
    @num_constants,  @undoc_constants  = doc_stats constants
    @num_methods,    @undoc_methods    = doc_stats methods
    @num_modules,    @undoc_modules    = doc_stats @store.unique_modules

    @num_items =
      @num_attributes +
      @num_classes +
      @num_constants +
      @num_methods +
      @num_modules +
      @num_params

    @undoc_items =
      @undoc_attributes +
      @undoc_classes +
      @undoc_constants +
      @undoc_methods +
      @undoc_modules +
      @undoc_params

    @doc_items = @num_items - @undoc_items
  end

  ##
  # Sets coverage report level.  Accepted values are:
  #
  # false or nil:: No report
  # 0:: Classes, modules, constants, attributes, methods
  # 1:: Level 0 + method parameters

  def coverage_level= level
    level = -1 unless level

    @coverage_level = level
  end

  ##
  # Returns the length and number of undocumented items in +collection+.

  def doc_stats collection
    visible = collection.select { |item| item.display? }
    [visible.length, visible.count { |item| not item.documented? }]
  end

  ##
  # Call this to mark the end of parsing for display purposes

  def done_adding
    @display.done_adding
  end

  ##
  # The documentation status of this project.  +true+ when 100%, +false+ when
  # less than 100% and +nil+ when unknown.
  #
  # Set by calling #calculate

  def fully_documented?
    @fully_documented
  end

  ##
  # A report that says you did a great job!

  def great_job
    report = RDoc::Markup::Document.new

    report << RDoc::Markup::Paragraph.new('100% documentation!')
    report << RDoc::Markup::Paragraph.new('Great Job!')

    report
  end

  ##
  # Calculates the percentage of items documented.

  def percent_doc
    return @percent_doc if @percent_doc

    @fully_documented = (@num_items - @doc_items) == 0

    @percent_doc = @doc_items.to_f / @num_items * 100 if @num_items.nonzero?
    @percent_doc ||= 0

    @percent_doc
  end

  ##
  # Returns a report on which items are not documented

  def report
    if @coverage_level > 0 then
      extend RDoc::Text
    end

    if @coverage_level.zero? then
      calculate

      return great_job if @num_items == @doc_items
    end

    ucm = @store.unique_classes_and_modules

    report = RDoc::Markup::Document.new
    report << RDoc::Markup::Paragraph.new('The following items are not documented:')
    report << RDoc::Markup::BlankLine.new

    ucm.sort.each do |cm|
      body = report_class_module(cm) {
        [
          report_constants(cm),
          report_attributes(cm),
          report_methods(cm),
        ].compact
      }

      report << body if body
    end

    if @coverage_level > 0 then
      calculate

      return great_job if @num_items == @doc_items
    end

    report
  end

  ##
  # Returns a report on undocumented attributes in ClassModule +cm+

  def report_attributes cm
    return if cm.attributes.empty?

    report = []

    cm.each_attribute do |attr|
      next if attr.documented?
      line = attr.line ? ":#{attr.line}" : nil
      report << "  #{attr.definition} :#{attr.name} # in file #{attr.file.full_name}#{line}\n"
      report << "\n"
    end

    report
  end

  ##
  # Returns a report on undocumented items in ClassModule +cm+

  def report_class_module cm
    return if cm.fully_documented? and @coverage_level.zero?
    return unless cm.display?

    report = RDoc::Markup::Document.new

    if cm.in_files.empty? then
      report << RDoc::Markup::Paragraph.new("#{cm.definition} is referenced but empty.")
      report << RDoc::Markup::Paragraph.new("It probably came from another project.  I'm sorry I'm holding it against you.")

      return report
    elsif cm.documented? then
      documented = true
      klass = RDoc::Markup::Verbatim.new("#{cm.definition} # is documented\n")
    else
      report << RDoc::Markup::Paragraph.new('In files:')

      list = RDoc::Markup::List.new :BULLET

      cm.in_files.each do |file|
        para = RDoc::Markup::Paragraph.new file.full_name
        list << RDoc::Markup::ListItem.new(nil, para)
      end

      report << list
      report << RDoc::Markup::BlankLine.new

      klass = RDoc::Markup::Verbatim.new("#{cm.definition}\n")
    end

    klass << "\n"

    body = yield.flatten # HACK remove #flatten

    if body.empty? then
      return if documented

      klass.parts.pop
    else
      klass.parts.concat body
    end

    klass << "end\n"

    report << klass

    report
  end

  ##
  # Returns a report on undocumented constants in ClassModule +cm+

  def report_constants cm
    return if cm.constants.empty?

    report = []

    cm.each_constant do |constant|
      # TODO constant aliases are listed in the summary but not reported
      # figure out what to do here
      next if constant.documented? || constant.is_alias_for

      line = constant.line ? ":#{constant.line}" : line
      report << "  # in file #{constant.file.full_name}#{line}\n"
      report << "  #{constant.name} = nil\n"
      report << "\n"
    end

    report
  end

  ##
  # Returns a report on undocumented methods in ClassModule +cm+

  def report_methods cm
    return if cm.method_list.empty?

    report = []

    cm.each_method do |method|
      next if method.documented? and @coverage_level.zero?

      if @coverage_level > 0 then
        params, undoc = undoc_params method

        @num_params += params

        unless undoc.empty? then
          @undoc_params += undoc.length

          undoc = undoc.map do |param| "+#{param}+" end
          param_report = "  # #{undoc.join ', '} is not documented\n"
        end
      end

      next if method.documented? and not param_report

      line = method.line ? ":#{method.line}" : nil
      scope = method.singleton ? 'self.' : nil

      report << "  # in file #{method.file.full_name}#{line}\n"
      report << param_report if param_report
      report << "  def #{scope}#{method.name}#{method.params}; end\n"
      report << "\n"
    end

    report
  end

  ##
  # Returns a summary of the collected statistics.

  def summary
    calculate

    num_width = [@num_files, @num_items].max.to_s.length
    undoc_width = [
      @undoc_attributes,
      @undoc_classes,
      @undoc_constants,
      @undoc_items,
      @undoc_methods,
      @undoc_modules,
      @undoc_params,
    ].max.to_s.length

    report = RDoc::Markup::Verbatim.new

    report << "Files:      %*d\n" % [num_width, @num_files]

    report << "\n"

    report << "Classes:    %*d (%*d undocumented)\n" % [
      num_width, @num_classes, undoc_width, @undoc_classes]
    report << "Modules:    %*d (%*d undocumented)\n" % [
      num_width, @num_modules, undoc_width, @undoc_modules]
    report << "Constants:  %*d (%*d undocumented)\n" % [
      num_width, @num_constants, undoc_width, @undoc_constants]
    report << "Attributes: %*d (%*d undocumented)\n" % [
      num_width, @num_attributes, undoc_width, @undoc_attributes]
    report << "Methods:    %*d (%*d undocumented)\n" % [
      num_width, @num_methods, undoc_width, @undoc_methods]
    report << "Parameters: %*d (%*d undocumented)\n" % [
      num_width, @num_params, undoc_width, @undoc_params] if
        @coverage_level > 0

    report << "\n"

    report << "Total:      %*d (%*d undocumented)\n" % [
      num_width, @num_items, undoc_width, @undoc_items]

    report << "%6.2f%% documented\n" % percent_doc
    report << "\n"
    report << "Elapsed: %0.1fs\n" % (Time.now - @start)

    RDoc::Markup::Document.new report
  end

  ##
  # Determines which parameters in +method+ were not documented.  Returns a
  # total parameter count and an Array of undocumented methods.

  def undoc_params method
    @formatter ||= RDoc::Markup::ToTtOnly.new

    params = method.param_list

    params = params.map { |param| param.gsub(/^\*\*?/, '') }

    return 0, [] if params.empty?

    document = parse method.comment

    tts = document.accept @formatter

    undoc = params - tts

    [params.length, undoc]
  end

  autoload :Quiet,   'rdoc/stats/quiet'
  autoload :Normal,  'rdoc/stats/normal'
  autoload :Verbose, 'rdoc/stats/verbose'

end

PK}$[4[@D��'gems/gems/rdoc-6.4.1.1/lib/rdoc/i18n.rbnu�[���# frozen_string_literal: true
##
# This module provides i18n related features.

module RDoc::I18n

  autoload :Locale, 'rdoc/i18n/locale'
  require_relative 'i18n/text'

end
PK}$[�&“��*gems/gems/rdoc-6.4.1.1/lib/rdoc/require.rbnu�[���# frozen_string_literal: true
##
# A file loaded by \#require

class RDoc::Require < RDoc::CodeObject

  ##
  # Name of the required file

  attr_accessor :name

  ##
  # Creates a new Require that loads +name+ with +comment+

  def initialize(name, comment)
    super()
    @name = name.gsub(/'|"/, "") #'
    @top_level = nil
    self.comment = comment
  end

  def inspect # :nodoc:
    "#<%s:0x%x require '%s' in %s>" % [
      self.class,
      object_id,
      @name,
      parent_file_name,
    ]
  end

  def to_s # :nodoc:
    "require #{name} in: #{parent}"
  end

  ##
  # The RDoc::TopLevel corresponding to this require, or +nil+ if not found.

  def top_level
    @top_level ||= begin
      tl = RDoc::TopLevel.all_files_hash[name + '.rb']

      if tl.nil? and RDoc::TopLevel.all_files.first.full_name =~ %r(^lib/) then
        # second chance
        tl = RDoc::TopLevel.all_files_hash['lib/' + name + '.rb']
      end

      tl
    end
  end

end

PK}$[����(gems/gems/rdoc-6.4.1.1/lib/rdoc/mixin.rbnu�[���# frozen_string_literal: true
##
# A Mixin adds features from a module into another context.  RDoc::Include and
# RDoc::Extend are both mixins.

class RDoc::Mixin < RDoc::CodeObject

  ##
  # Name of included module

  attr_accessor :name

  ##
  # Creates a new Mixin for +name+ with +comment+

  def initialize(name, comment)
    super()
    @name = name
    self.comment = comment
    @module = nil # cache for module if found
  end

  ##
  # Mixins are sorted by name

  def <=> other
    return unless self.class === other

    name <=> other.name
  end

  def == other # :nodoc:
    self.class === other and @name == other.name
  end

  alias eql? == # :nodoc:

  ##
  # Full name based on #module

  def full_name
    m = self.module
    RDoc::ClassModule === m ? m.full_name : @name
  end

  def hash # :nodoc:
    [@name, self.module].hash
  end

  def inspect # :nodoc:
    "#<%s:0x%x %s.%s %s>" % [
      self.class,
      object_id,
      parent_name, self.class.name.downcase, @name,
    ]
  end

  ##
  # Attempts to locate the included module object.  Returns the name if not
  # known.
  #
  # The scoping rules of Ruby to resolve the name of an included module are:
  # - first look into the children of the current context;
  # - if not found, look into the children of included modules,
  #   in reverse inclusion order;
  # - if still not found, go up the hierarchy of names.
  #
  # This method has <code>O(n!)</code> behavior when the module calling
  # include is referencing nonexistent modules.  Avoid calling #module until
  # after all the files are parsed.  This behavior is due to ruby's constant
  # lookup behavior.
  #
  # As of the beginning of October, 2011, no gem includes nonexistent modules.

  def module
    return @module if @module

    # search the current context
    return @name unless parent
    full_name = parent.child_name(@name)
    @module = @store.modules_hash[full_name]
    return @module if @module
    return @name if @name =~ /^::/

    # search the includes before this one, in reverse order
    searched = parent.includes.take_while { |i| i != self }.reverse
    searched.each do |i|
      inc = i.module
      next if String === inc
      full_name = inc.child_name(@name)
      @module = @store.modules_hash[full_name]
      return @module if @module
    end

    # go up the hierarchy of names
    up = parent.parent
    while up
      full_name = up.child_name(@name)
      @module = @store.modules_hash[full_name]
      return @module if @module
      up = up.parent
    end

    @name
  end

  ##
  # Sets the store for this class or module and its contained code objects.

  def store= store
    super

    @file = @store.add_file @file.full_name if @file
  end

  def to_s # :nodoc:
    "#{self.class.name.downcase} #@name in: #{parent}"
  end

end

PK}$[�$�yy*gems/gems/rdoc-6.4.1.1/lib/rdoc/context.rbnu�[���# frozen_string_literal: true
require 'cgi'

##
# A Context is something that can hold modules, classes, methods, attributes,
# aliases, requires, and includes. Classes, modules, and files are all
# Contexts.

class RDoc::Context < RDoc::CodeObject

  include Comparable

  ##
  # Types of methods

  TYPES = %w[class instance]

  ##
  # If a context has these titles it will be sorted in this order.

  TOMDOC_TITLES = [nil, 'Public', 'Internal', 'Deprecated'] # :nodoc:
  TOMDOC_TITLES_SORT = TOMDOC_TITLES.sort_by { |title| title.to_s } # :nodoc:

  ##
  # Class/module aliases

  attr_reader :aliases

  ##
  # All attr* methods

  attr_reader :attributes

  ##
  # Block params to be used in the next MethodAttr parsed under this context

  attr_accessor :block_params

  ##
  # Constants defined

  attr_reader :constants

  ##
  # Sets the current documentation section of documentation

  attr_writer :current_section

  ##
  # Files this context is found in

  attr_reader :in_files

  ##
  # Modules this context includes

  attr_reader :includes

  ##
  # Modules this context is extended with

  attr_reader :extends

  ##
  # Methods defined in this context

  attr_reader :method_list

  ##
  # Name of this class excluding namespace.  See also full_name

  attr_reader :name

  ##
  # Files this context requires

  attr_reader :requires

  ##
  # Use this section for the next method, attribute or constant added.

  attr_accessor :temporary_section

  ##
  # Hash <tt>old_name => [aliases]</tt>, for aliases
  # that haven't (yet) been resolved to a method/attribute.
  # (Not to be confused with the aliases of the context.)

  attr_accessor :unmatched_alias_lists

  ##
  # Aliases that could not be resolved.

  attr_reader :external_aliases

  ##
  # Current visibility of this context

  attr_accessor :visibility

  ##
  # Current visibility of this line

  attr_writer :current_line_visibility

  ##
  # Hash of registered methods. Attributes are also registered here,
  # twice if they are RW.

  attr_reader :methods_hash

  ##
  # Params to be used in the next MethodAttr parsed under this context

  attr_accessor :params

  ##
  # Hash of registered constants.

  attr_reader :constants_hash

  ##
  # Creates an unnamed empty context with public current visibility

  def initialize
    super

    @in_files = []

    @name    ||= "unknown"
    @parent  = nil
    @visibility = :public

    @current_section = Section.new self, nil, nil
    @sections = { nil => @current_section }
    @temporary_section = nil

    @classes = {}
    @modules = {}

    initialize_methods_etc
  end

  ##
  # Sets the defaults for methods and so-forth

  def initialize_methods_etc
    @method_list = []
    @attributes  = []
    @aliases     = []
    @requires    = []
    @includes    = []
    @extends     = []
    @constants   = []
    @external_aliases = []
    @current_line_visibility = nil

    # This Hash maps a method name to a list of unmatched aliases (aliases of
    # a method not yet encountered).
    @unmatched_alias_lists = {}

    @methods_hash   = {}
    @constants_hash = {}

    @params = nil

    @store ||= nil
  end

  ##
  # Contexts are sorted by full_name

  def <=>(other)
    return nil unless RDoc::CodeObject === other

    full_name <=> other.full_name
  end

  ##
  # Adds an item of type +klass+ with the given +name+ and +comment+ to the
  # context.
  #
  # Currently only RDoc::Extend and RDoc::Include are supported.

  def add klass, name, comment
    if RDoc::Extend == klass then
      ext = RDoc::Extend.new name, comment
      add_extend ext
    elsif RDoc::Include == klass then
      incl = RDoc::Include.new name, comment
      add_include incl
    else
      raise NotImplementedError, "adding a #{klass} is not implemented"
    end
  end

  ##
  # Adds +an_alias+ that is automatically resolved

  def add_alias an_alias
    return an_alias unless @document_self

    method_attr = find_method(an_alias.old_name, an_alias.singleton) ||
                  find_attribute(an_alias.old_name, an_alias.singleton)

    if method_attr then
      method_attr.add_alias an_alias, self
    else
      add_to @external_aliases, an_alias
      unmatched_alias_list =
        @unmatched_alias_lists[an_alias.pretty_old_name] ||= []
      unmatched_alias_list.push an_alias
    end

    an_alias
  end

  ##
  # Adds +attribute+ if not already there. If it is (as method(s) or attribute),
  # updates the comment if it was empty.
  #
  # The attribute is registered only if it defines a new method.
  # For instance, <tt>attr_reader :foo</tt> will not be registered
  # if method +foo+ exists, but <tt>attr_accessor :foo</tt> will be registered
  # if method +foo+ exists, but <tt>foo=</tt> does not.

  def add_attribute attribute
    return attribute unless @document_self

    # mainly to check for redefinition of an attribute as a method
    # TODO find a policy for 'attr_reader :foo' + 'def foo=()'
    register = false

    key = nil

    if attribute.rw.index 'R' then
      key = attribute.pretty_name
      known = @methods_hash[key]

      if known then
        known.comment = attribute.comment if known.comment.empty?
      elsif registered = @methods_hash[attribute.pretty_name + '='] and
            RDoc::Attr === registered then
        registered.rw = 'RW'
      else
        @methods_hash[key] = attribute
        register = true
      end
    end

    if attribute.rw.index 'W' then
      key = attribute.pretty_name + '='
      known = @methods_hash[key]

      if known then
        known.comment = attribute.comment if known.comment.empty?
      elsif registered = @methods_hash[attribute.pretty_name] and
            RDoc::Attr === registered then
        registered.rw = 'RW'
      else
        @methods_hash[key] = attribute
        register = true
      end
    end

    if register then
      attribute.visibility = @visibility
      add_to @attributes, attribute
      resolve_aliases attribute
    end

    attribute
  end

  ##
  # Adds a class named +given_name+ with +superclass+.
  #
  # Both +given_name+ and +superclass+ may contain '::', and are
  # interpreted relative to the +self+ context. This allows handling correctly
  # examples like these:
  #   class RDoc::Gauntlet < Gauntlet
  #   module Mod
  #     class Object   # implies < ::Object
  #     class SubObject < Object  # this is _not_ ::Object
  #
  # Given <tt>class Container::Item</tt> RDoc assumes +Container+ is a module
  # unless it later sees <tt>class Container</tt>.  +add_class+ automatically
  # upgrades +given_name+ to a class in this case.

  def add_class class_type, given_name, superclass = '::Object'
    # superclass +nil+ is passed by the C parser in the following cases:
    # - registering Object in 1.8 (correct)
    # - registering BasicObject in 1.9 (correct)
    # - registering RubyVM in 1.9 in iseq.c (incorrect: < Object in vm.c)
    #
    # If we later find a superclass for a registered class with a nil
    # superclass, we must honor it.

    # find the name & enclosing context
    if given_name =~ /^:+(\w+)$/ then
      full_name = $1
      enclosing = top_level
      name = full_name.split(/:+/).last
    else
      full_name = child_name given_name

      if full_name =~ /^(.+)::(\w+)$/ then
        name = $2
        ename = $1
        enclosing = @store.classes_hash[ename] || @store.modules_hash[ename]
        # HACK: crashes in actionpack/lib/action_view/helpers/form_helper.rb (metaprogramming)
        unless enclosing then
          # try the given name at top level (will work for the above example)
          enclosing = @store.classes_hash[given_name] ||
                      @store.modules_hash[given_name]
          return enclosing if enclosing
          # not found: create the parent(s)
          names = ename.split('::')
          enclosing = self
          names.each do |n|
            enclosing = enclosing.classes_hash[n] ||
                        enclosing.modules_hash[n] ||
                        enclosing.add_module(RDoc::NormalModule, n)
          end
        end
      else
        name = full_name
        enclosing = self
      end
    end

    # fix up superclass
    if full_name == 'BasicObject' then
      superclass = nil
    elsif full_name == 'Object' then
      superclass = '::BasicObject'
    end

    # find the superclass full name
    if superclass then
      if superclass =~ /^:+/ then
        superclass = $' #'
      else
        if superclass =~ /^(\w+):+(.+)$/ then
          suffix = $2
          mod = find_module_named($1)
          superclass = mod.full_name + '::' + suffix if mod
        else
          mod = find_module_named(superclass)
          superclass = mod.full_name if mod
        end
      end

      # did we believe it was a module?
      mod = @store.modules_hash.delete superclass

      upgrade_to_class mod, RDoc::NormalClass, mod.parent if mod

      # e.g., Object < Object
      superclass = nil if superclass == full_name
    end

    klass = @store.classes_hash[full_name]

    if klass then
      # if TopLevel, it may not be registered in the classes:
      enclosing.classes_hash[name] = klass

      # update the superclass if needed
      if superclass then
        existing = klass.superclass
        existing = existing.full_name unless existing.is_a?(String) if existing
        if existing.nil? ||
           (existing == 'Object' && superclass != 'Object') then
          klass.superclass = superclass
        end
      end
    else
      # this is a new class
      mod = @store.modules_hash.delete full_name

      if mod then
        klass = upgrade_to_class mod, RDoc::NormalClass, enclosing

        klass.superclass = superclass unless superclass.nil?
      else
        klass = class_type.new name, superclass

        enclosing.add_class_or_module(klass, enclosing.classes_hash,
                                      @store.classes_hash)
      end
    end

    klass.parent = self

    klass
  end

  ##
  # Adds the class or module +mod+ to the modules or
  # classes Hash +self_hash+, and to +all_hash+ (either
  # <tt>TopLevel::modules_hash</tt> or <tt>TopLevel::classes_hash</tt>),
  # unless #done_documenting is +true+. Sets the #parent of +mod+
  # to +self+, and its #section to #current_section. Returns +mod+.

  def add_class_or_module mod, self_hash, all_hash
    mod.section = current_section # TODO declaring context? something is
                                  # wrong here...
    mod.parent = self
    mod.full_name = nil
    mod.store = @store

    unless @done_documenting then
      self_hash[mod.name] = mod
      # this must be done AFTER adding mod to its parent, so that the full
      # name is correct:
      all_hash[mod.full_name] = mod
      if @store.unmatched_constant_alias[mod.full_name] then
        to, file = @store.unmatched_constant_alias[mod.full_name]
        add_module_alias mod, mod.name, to, file
      end
    end

    mod
  end

  ##
  # Adds +constant+ if not already there. If it is, updates the comment,
  # value and/or is_alias_for of the known constant if they were empty/nil.

  def add_constant constant
    return constant unless @document_self

    # HACK: avoid duplicate 'PI' & 'E' in math.c (1.8.7 source code)
    # (this is a #ifdef: should be handled by the C parser)
    known = @constants_hash[constant.name]

    if known then
      known.comment = constant.comment if known.comment.empty?

      known.value = constant.value if
        known.value.nil? or known.value.strip.empty?

      known.is_alias_for ||= constant.is_alias_for
    else
      @constants_hash[constant.name] = constant
      add_to @constants, constant
    end

    constant
  end

  ##
  # Adds included module +include+ which should be an RDoc::Include

  def add_include include
    add_to @includes, include

    include
  end

  ##
  # Adds extension module +ext+ which should be an RDoc::Extend

  def add_extend ext
    add_to @extends, ext

    ext
  end

  ##
  # Adds +method+ if not already there. If it is (as method or attribute),
  # updates the comment if it was empty.

  def add_method method
    return method unless @document_self

    # HACK: avoid duplicate 'new' in io.c & struct.c (1.8.7 source code)
    key = method.pretty_name
    known = @methods_hash[key]

    if known then
      if @store then # otherwise we are loading
        known.comment = method.comment if known.comment.empty?
        previously = ", previously in #{known.file}" unless
          method.file == known.file
        @store.rdoc.options.warn \
          "Duplicate method #{known.full_name} in #{method.file}#{previously}"
      end
    else
      @methods_hash[key] = method
      if @current_line_visibility
        method.visibility, @current_line_visibility = @current_line_visibility, nil
      else
        method.visibility = @visibility
      end
      add_to @method_list, method
      resolve_aliases method
    end

    method
  end

  ##
  # Adds a module named +name+.  If RDoc already knows +name+ is a class then
  # that class is returned instead.  See also #add_class.

  def add_module(class_type, name)
    mod = @classes[name] || @modules[name]
    return mod if mod

    full_name = child_name name
    mod = @store.modules_hash[full_name] || class_type.new(name)

    add_class_or_module mod, @modules, @store.modules_hash
  end

  ##
  # Adds a module by +RDoc::NormalModule+ instance. See also #add_module.

  def add_module_by_normal_module(mod)
    add_class_or_module mod, @modules, @store.modules_hash
  end

  ##
  # Adds an alias from +from+ (a class or module) to +name+ which was defined
  # in +file+.

  def add_module_alias from, from_name, to, file
    return from if @done_documenting

    to_full_name = child_name to.name

    # if we already know this name, don't register an alias:
    # see the metaprogramming in lib/active_support/basic_object.rb,
    # where we already know BasicObject is a class when we find
    # BasicObject = BlankSlate
    return from if @store.find_class_or_module to_full_name

    unless from
      @store.unmatched_constant_alias[child_name(from_name)] = [to, file]
      return to
    end

    new_to = from.dup
    new_to.name = to.name
    new_to.full_name = nil

    if new_to.module? then
      @store.modules_hash[to_full_name] = new_to
      @modules[to.name] = new_to
    else
      @store.classes_hash[to_full_name] = new_to
      @classes[to.name] = new_to
    end

    # Registers a constant for this alias.  The constant value and comment
    # will be updated later, when the Ruby parser adds the constant
    const = RDoc::Constant.new to.name, nil, new_to.comment
    const.record_location file
    const.is_alias_for = from
    add_constant const

    new_to
  end

  ##
  # Adds +require+ to this context's top level

  def add_require(require)
    return require unless @document_self

    if RDoc::TopLevel === self then
      add_to @requires, require
    else
      parent.add_require require
    end
  end

  ##
  # Returns a section with +title+, creating it if it doesn't already exist.
  # +comment+ will be appended to the section's comment.
  #
  # A section with a +title+ of +nil+ will return the default section.
  #
  # See also RDoc::Context::Section

  def add_section title, comment = nil
    if section = @sections[title] then
      section.add_comment comment if comment
    else
      section = Section.new self, title, comment
      @sections[title] = section
    end

    section
  end

  ##
  # Adds +thing+ to the collection +array+

  def add_to array, thing
    array << thing if @document_self

    thing.parent  = self
    thing.store   = @store if @store
    thing.section = current_section
  end

  ##
  # Is there any content?
  #
  # This means any of: comment, aliases, methods, attributes, external
  # aliases, require, constant.
  #
  # Includes and extends are also checked unless <tt>includes == false</tt>.

  def any_content(includes = true)
    @any_content ||= !(
      @comment.empty? &&
      @method_list.empty? &&
      @attributes.empty? &&
      @aliases.empty? &&
      @external_aliases.empty? &&
      @requires.empty? &&
      @constants.empty?
    )
    @any_content || (includes && !(@includes + @extends).empty? )
  end

  ##
  # Creates the full name for a child with +name+

  def child_name name
    if name =~ /^:+/
      $'  #'
    elsif RDoc::TopLevel === self then
      name
    else
      "#{self.full_name}::#{name}"
    end
  end

  ##
  # Class attributes

  def class_attributes
    @class_attributes ||= attributes.select { |a| a.singleton }
  end

  ##
  # Class methods

  def class_method_list
    @class_method_list ||= method_list.select { |a| a.singleton }
  end

  ##
  # Array of classes in this context

  def classes
    @classes.values
  end

  ##
  # All classes and modules in this namespace

  def classes_and_modules
    classes + modules
  end

  ##
  # Hash of classes keyed by class name

  def classes_hash
    @classes
  end

  ##
  # The current documentation section that new items will be added to.  If
  # temporary_section is available it will be used.

  def current_section
    if section = @temporary_section then
      @temporary_section = nil
    else
      section = @current_section
    end

    section
  end

  ##
  # Is part of this thing was defined in +file+?

  def defined_in?(file)
    @in_files.include?(file)
  end

  def display(method_attr) # :nodoc:
    if method_attr.is_a? RDoc::Attr
      "#{method_attr.definition} #{method_attr.pretty_name}"
    else
      "method #{method_attr.pretty_name}"
    end
  end

  ##
  # Iterator for ancestors for duck-typing.  Does nothing.  See
  # RDoc::ClassModule#each_ancestor.
  #
  # This method exists to make it easy to work with Context subclasses that
  # aren't part of RDoc.

  def each_ancestor # :nodoc:
  end

  ##
  # Iterator for attributes

  def each_attribute # :yields: attribute
    @attributes.each { |a| yield a }
  end

  ##
  # Iterator for classes and modules

  def each_classmodule(&block) # :yields: module
    classes_and_modules.sort.each(&block)
  end

  ##
  # Iterator for constants

  def each_constant # :yields: constant
    @constants.each {|c| yield c}
  end

  ##
  # Iterator for included modules

  def each_include # :yields: include
    @includes.each do |i| yield i end
  end

  ##
  # Iterator for extension modules

  def each_extend # :yields: extend
    @extends.each do |e| yield e end
  end

  ##
  # Iterator for methods

  def each_method # :yields: method
    return enum_for __method__ unless block_given?

    @method_list.sort.each { |m| yield m }
  end

  ##
  # Iterator for each section's contents sorted by title.  The +section+, the
  # section's +constants+ and the sections +attributes+ are yielded.  The
  # +constants+ and +attributes+ collections are sorted.
  #
  # To retrieve methods in a section use #methods_by_type with the optional
  # +section+ parameter.
  #
  # NOTE: Do not edit collections yielded by this method

  def each_section # :yields: section, constants, attributes
    return enum_for __method__ unless block_given?

    constants  = @constants.group_by  do |constant|  constant.section end
    attributes = @attributes.group_by do |attribute| attribute.section end

    constants.default  = []
    attributes.default = []

    sort_sections.each do |section|
      yield section, constants[section].select(&:display?).sort, attributes[section].select(&:display?).sort
    end
  end

  ##
  # Finds an attribute +name+ with singleton value +singleton+.

  def find_attribute(name, singleton)
    name = $1 if name =~ /^(.*)=$/
    @attributes.find { |a| a.name == name && a.singleton == singleton }
  end

  ##
  # Finds an attribute with +name+ in this context

  def find_attribute_named(name)
    case name
    when /\A#/ then
      find_attribute name[1..-1], false
    when /\A::/ then
      find_attribute name[2..-1], true
    else
      @attributes.find { |a| a.name == name }
    end
  end

  ##
  # Finds a class method with +name+ in this context

  def find_class_method_named(name)
    @method_list.find { |meth| meth.singleton && meth.name == name }
  end

  ##
  # Finds a constant with +name+ in this context

  def find_constant_named(name)
    @constants.find do |m|
      m.name == name || m.full_name == name
    end
  end

  ##
  # Find a module at a higher scope

  def find_enclosing_module_named(name)
    parent && parent.find_module_named(name)
  end

  ##
  # Finds an external alias +name+ with singleton value +singleton+.

  def find_external_alias(name, singleton)
    @external_aliases.find { |m| m.name == name && m.singleton == singleton }
  end

  ##
  # Finds an external alias with +name+ in this context

  def find_external_alias_named(name)
    case name
    when /\A#/ then
      find_external_alias name[1..-1], false
    when /\A::/ then
      find_external_alias name[2..-1], true
    else
      @external_aliases.find { |a| a.name == name }
    end
  end

  ##
  # Finds a file with +name+ in this context

  def find_file_named name
    @store.find_file_named name
  end

  ##
  # Finds an instance method with +name+ in this context

  def find_instance_method_named(name)
    @method_list.find { |meth| !meth.singleton && meth.name == name }
  end

  ##
  # Finds a method, constant, attribute, external alias, module or file
  # named +symbol+ in this context.

  def find_local_symbol(symbol)
    find_method_named(symbol) or
    find_constant_named(symbol) or
    find_attribute_named(symbol) or
    find_external_alias_named(symbol) or
    find_module_named(symbol) or
    find_file_named(symbol)
  end

  ##
  # Finds a method named +name+ with singleton value +singleton+.

  def find_method(name, singleton)
    @method_list.find { |m|
      if m.singleton
        m.name == name && m.singleton == singleton
      else
        m.name == name && !m.singleton && !singleton
      end
    }
  end

  ##
  # Finds a instance or module method with +name+ in this context

  def find_method_named(name)
    case name
    when /\A#/ then
      find_method name[1..-1], false
    when /\A::/ then
      find_method name[2..-1], true
    else
      @method_list.find { |meth| meth.name == name }
    end
  end

  ##
  # Find a module with +name+ using ruby's scoping rules

  def find_module_named(name)
    res = @modules[name] || @classes[name]
    return res if res
    return self if self.name == name
    find_enclosing_module_named name
  end

  ##
  # Look up +symbol+, first as a module, then as a local symbol.

  def find_symbol(symbol)
    find_symbol_module(symbol) || find_local_symbol(symbol)
  end

  ##
  # Look up a module named +symbol+.

  def find_symbol_module(symbol)
    result = nil

    # look for a class or module 'symbol'
    case symbol
    when /^::/ then
      result = @store.find_class_or_module symbol
    when /^(\w+):+(.+)$/
      suffix = $2
      top = $1
      searched = self
      while searched do
        mod = searched.find_module_named(top)
        break unless mod
        result = @store.find_class_or_module "#{mod.full_name}::#{suffix}"
        break if result || searched.is_a?(RDoc::TopLevel)
        searched = searched.parent
      end
    else
      searched = self
      while searched do
        result = searched.find_module_named(symbol)
        break if result || searched.is_a?(RDoc::TopLevel)
        searched = searched.parent
      end
    end

    result
  end

  ##
  # The full name for this context.  This method is overridden by subclasses.

  def full_name
    '(unknown)'
  end

  ##
  # Does this context and its methods and constants all have documentation?
  #
  # (Yes, fully documented doesn't mean everything.)

  def fully_documented?
    documented? and
      attributes.all? { |a| a.documented? } and
      method_list.all? { |m| m.documented? } and
      constants.all? { |c| c.documented? }
  end

  ##
  # URL for this with a +prefix+

  def http_url(prefix)
    path = name_for_path
    path = path.gsub(/<<\s*(\w*)/, 'from-\1') if path =~ /<</
    path = [prefix] + path.split('::')

    File.join(*path.compact) + '.html'
  end

  ##
  # Instance attributes

  def instance_attributes
    @instance_attributes ||= attributes.reject { |a| a.singleton }
  end

  ##
  # Instance methods

  def instance_methods
    @instance_methods ||= method_list.reject { |a| a.singleton }
  end

  ##
  # Instance methods
  #--
  # TODO remove this later

  def instance_method_list
    warn '#instance_method_list is obsoleted, please use #instance_methods'
    @instance_methods ||= method_list.reject { |a| a.singleton }
  end

  ##
  # Breaks method_list into a nested hash by type (<tt>'class'</tt> or
  # <tt>'instance'</tt>) and visibility (+:public+, +:protected+, +:private+).
  #
  # If +section+ is provided only methods in that RDoc::Context::Section will
  # be returned.

  def methods_by_type section = nil
    methods = {}

    TYPES.each do |type|
      visibilities = {}
      RDoc::VISIBILITIES.each do |vis|
        visibilities[vis] = []
      end

      methods[type] = visibilities
    end

    each_method do |method|
      next if section and not method.section == section
      methods[method.type][method.visibility] << method
    end

    methods
  end

  ##
  # Yields AnyMethod and Attr entries matching the list of names in +methods+.

  def methods_matching(methods, singleton = false, &block)
    (@method_list + @attributes).each do |m|
      yield m if methods.include?(m.name) and m.singleton == singleton
    end

    each_ancestor do |parent|
      parent.methods_matching(methods, singleton, &block)
    end
  end

  ##
  # Array of modules in this context

  def modules
    @modules.values
  end

  ##
  # Hash of modules keyed by module name

  def modules_hash
    @modules
  end

  ##
  # Name to use to generate the url.
  # <tt>#full_name</tt> by default.

  def name_for_path
    full_name
  end

  ##
  # Changes the visibility for new methods to +visibility+

  def ongoing_visibility=(visibility)
    @visibility = visibility
  end

  ##
  # Record +top_level+ as a file +self+ is in.

  def record_location(top_level)
    @in_files << top_level unless @in_files.include?(top_level)
  end

  ##
  # Should we remove this context from the documentation?
  #
  # The answer is yes if:
  # * #received_nodoc is +true+
  # * #any_content is +false+ (not counting includes)
  # * All #includes are modules (not a string), and their module has
  #   <tt>#remove_from_documentation? == true</tt>
  # * All classes and modules have <tt>#remove_from_documentation? == true</tt>

  def remove_from_documentation?
    @remove_from_documentation ||=
      @received_nodoc &&
      !any_content(false) &&
      @includes.all? { |i| !i.module.is_a?(String) && i.module.remove_from_documentation? } &&
      classes_and_modules.all? { |cm| cm.remove_from_documentation? }
  end

  ##
  # Removes methods and attributes with a visibility less than +min_visibility+.
  #--
  # TODO mark the visibility of attributes in the template (if not public?)

  def remove_invisible min_visibility
    return if [:private, :nodoc].include? min_visibility
    remove_invisible_in @method_list, min_visibility
    remove_invisible_in @attributes, min_visibility
    remove_invisible_in @constants, min_visibility
  end

  ##
  # Only called when min_visibility == :public or :private

  def remove_invisible_in array, min_visibility # :nodoc:
    if min_visibility == :public then
      array.reject! { |e|
        e.visibility != :public and not e.force_documentation
      }
    else
      array.reject! { |e|
        e.visibility == :private and not e.force_documentation
      }
    end
  end

  ##
  # Tries to resolve unmatched aliases when a method or attribute has just
  # been added.

  def resolve_aliases added
    # resolve any pending unmatched aliases
    key = added.pretty_name
    unmatched_alias_list = @unmatched_alias_lists[key]
    return unless unmatched_alias_list
    unmatched_alias_list.each do |unmatched_alias|
      added.add_alias unmatched_alias, self
      @external_aliases.delete unmatched_alias
    end
    @unmatched_alias_lists.delete key
  end

  ##
  # Returns RDoc::Context::Section objects referenced in this context for use
  # in a table of contents.

  def section_contents
    used_sections = {}

    each_method do |method|
      next unless method.display?

      used_sections[method.section] = true
    end

    # order found sections
    sections = sort_sections.select do |section|
      used_sections[section]
    end

    # only the default section is used
    return [] if
      sections.length == 1 and not sections.first.title

    sections
  end

  ##
  # Sections in this context

  def sections
    @sections.values
  end

  def sections_hash # :nodoc:
    @sections
  end

  ##
  # Sets the current section to a section with +title+.  See also #add_section

  def set_current_section title, comment
    @current_section = add_section title, comment
  end

  ##
  # Given an array +methods+ of method names, set the visibility of each to
  # +visibility+

  def set_visibility_for(methods, visibility, singleton = false)
    methods_matching methods, singleton do |m|
      m.visibility = visibility
    end
  end

  ##
  # Given an array +names+ of constants, set the visibility of each constant to
  # +visibility+

  def set_constant_visibility_for(names, visibility)
    names.each do |name|
      constant = @constants_hash[name] or next
      constant.visibility = visibility
    end
  end

  ##
  # Sorts sections alphabetically (default) or in TomDoc fashion (none,
  # Public, Internal, Deprecated)

  def sort_sections
    titles = @sections.map { |title, _| title }

    if titles.length > 1 and
       TOMDOC_TITLES_SORT ==
         (titles | TOMDOC_TITLES).sort_by { |title| title.to_s } then
      @sections.values_at(*TOMDOC_TITLES).compact
    else
      @sections.sort_by { |title, _|
        title.to_s
      }.map { |_, section|
        section
      }
    end
  end

  def to_s # :nodoc:
    "#{self.class.name} #{self.full_name}"
  end

  ##
  # Return the TopLevel that owns us
  #--
  # FIXME we can be 'owned' by several TopLevel (see #record_location &
  # #in_files)

  def top_level
    return @top_level if defined? @top_level
    @top_level = self
    @top_level = @top_level.parent until RDoc::TopLevel === @top_level
    @top_level
  end

  ##
  # Upgrades NormalModule +mod+ in +enclosing+ to a +class_type+

  def upgrade_to_class mod, class_type, enclosing
    enclosing.modules_hash.delete mod.name

    klass = RDoc::ClassModule.from_module class_type, mod
    klass.store = @store

    # if it was there, then we keep it even if done_documenting
    @store.classes_hash[mod.full_name] = klass
    enclosing.classes_hash[mod.name]   = klass

    klass
  end

  autoload :Section, 'rdoc/context/section'

end
PK}$[n��Bgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/pot/message_extractor.rbnu�[���# frozen_string_literal: true
##
# Extracts message from RDoc::Store

class RDoc::Generator::POT::MessageExtractor

  ##
  # Creates a message extractor for +store+.

  def initialize store
    @store = store
    @po = RDoc::Generator::POT::PO.new
  end

  ##
  # Extracts messages from +store+, stores them into
  # RDoc::Generator::POT::PO and returns it.

  def extract
    @store.all_classes_and_modules.each do |klass|
      extract_from_klass(klass)
    end
    @po
  end

  private

  def extract_from_klass klass
    extract_text(klass.comment_location, klass.full_name)

    klass.each_section do |section, constants, attributes|
      extract_text(section.title ,"#{klass.full_name}: section title")
      section.comments.each do |comment|
        extract_text(comment, "#{klass.full_name}: #{section.title}")
      end
    end

    klass.each_constant do |constant|
      extract_text(constant.comment, constant.full_name)
    end

    klass.each_attribute do |attribute|
      extract_text(attribute.comment, attribute.full_name)
    end

    klass.each_method do |method|
      extract_text(method.comment, method.full_name)
    end
  end

  def extract_text text, comment, location = nil
    return if text.nil?

    options = {
      :extracted_comment => comment,
      :references => [location].compact,
    }
    i18n_text = RDoc::I18n::Text.new(text)
    i18n_text.extract_messages do |part|
      @po.add(entry(part[:paragraph], options))
    end
  end

  def entry msgid, options
    RDoc::Generator::POT::POEntry.new(msgid, options)
  end

end
PK}$[�jl{��9gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/pot/po_entry.rbnu�[���# frozen_string_literal: true
##
# A PO entry in PO

class RDoc::Generator::POT::POEntry

  # The msgid content
  attr_reader :msgid

  # The msgstr content
  attr_reader :msgstr

  # The comment content created by translator (PO editor)
  attr_reader :translator_comment

  # The comment content extracted from source file
  attr_reader :extracted_comment

  # The locations where the PO entry is extracted
  attr_reader :references

  # The flags of the PO entry
  attr_reader :flags

  ##
  # Creates a PO entry for +msgid+. Other valus can be specified by
  # +options+.

  def initialize msgid, options = {}
    @msgid = msgid
    @msgstr = options[:msgstr] || ""
    @translator_comment = options[:translator_comment]
    @extracted_comment = options[:extracted_comment]
    @references = options[:references] || []
    @flags = options[:flags] || []
  end

  ##
  # Returns the PO entry in PO format.

  def to_s
    entry = ''
    entry += format_translator_comment
    entry += format_extracted_comment
    entry += format_references
    entry += format_flags
    entry += <<-ENTRY
msgid #{format_message(@msgid)}
msgstr #{format_message(@msgstr)}
    ENTRY
  end

  ##
  # Merges the PO entry with +other_entry+.

  def merge other_entry
    options = {
      :extracted_comment  => merge_string(@extracted_comment,
                                          other_entry.extracted_comment),
      :translator_comment => merge_string(@translator_comment,
                                          other_entry.translator_comment),
      :references         => merge_array(@references,
                                         other_entry.references),
      :flags              => merge_array(@flags,
                                         other_entry.flags),
    }
    self.class.new(@msgid, options)
  end

  private

  def format_comment mark, comment
    return '' unless comment
    return '' if comment.empty?

    formatted_comment = ''
    comment.each_line do |line|
      formatted_comment += "#{mark} #{line}"
    end
    formatted_comment += "\n" unless formatted_comment.end_with?("\n")
    formatted_comment
  end

  def format_translator_comment
    format_comment('#', @translator_comment)
  end

  def format_extracted_comment
    format_comment('#.', @extracted_comment)
  end

  def format_references
    return '' if @references.empty?

    formatted_references = ''
    @references.sort.each do |file, line|
      formatted_references += "\#: #{file}:#{line}\n"
    end
    formatted_references
  end

  def format_flags
    return '' if @flags.empty?

    formatted_flags = flags.join(",")
    "\#, #{formatted_flags}\n"
  end

  def format_message message
    return "\"#{escape(message)}\"" unless message.include?("\n")

    formatted_message = '""'
    message.each_line do |line|
      formatted_message += "\n"
      formatted_message += "\"#{escape(line)}\""
    end
    formatted_message
  end

  def escape string
    string.gsub(/["\\\t\n]/) do |special_character|
      case special_character
      when "\t"
        "\\t"
      when "\n"
        "\\n"
      else
        "\\#{special_character}"
      end
    end
  end

  def merge_string string1, string2
    [string1, string2].compact.join("\n")
  end

  def merge_array array1, array2
      (array1 + array2).uniq
  end

end
PK}$[��3gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/pot/po.rbnu�[���# frozen_string_literal: true
##
# Generates a PO format text

class RDoc::Generator::POT::PO

  ##
  # Creates an object that represents PO format.

  def initialize
    @entries = {}
    add_header
  end

  ##
  # Adds a PO entry to the PO.

  def add entry
    existing_entry = @entries[entry.msgid]
    if existing_entry
      entry = existing_entry.merge(entry)
    end
    @entries[entry.msgid] = entry
  end

  ##
  # Returns PO format text for the PO.

  def to_s
    po = ''
    sort_entries.each do |entry|
      po += "\n" unless po.empty?
      po += entry.to_s
    end
    po
  end

  private

  def add_header
    add(header_entry)
  end

  def header_entry
    comment = <<-COMMENT
SOME DESCRIPTIVE TITLE.
Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
This file is distributed under the same license as the PACKAGE package.
FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
    COMMENT

    content = <<-CONTENT
Project-Id-Version: PACKAGE VERSEION
Report-Msgid-Bugs-To:
PO-Revision-Date: YEAR-MO_DA HO:MI+ZONE
Last-Translator: FULL NAME <EMAIL@ADDRESS>
Language-Team: LANGUAGE <LL@li.org>
Language:
MIME-Version: 1.0
Content-Type: text/plain; charset=CHARSET
Content-Transfer-Encoding: 8bit
Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;
    CONTENT

    options = {
      :msgstr => content,
      :translator_comment => comment,
      :flags => ['fuzzy'],
    }
    RDoc::Generator::POT::POEntry.new('', options)
  end

  def sort_entries
    headers, messages = @entries.values.partition do |entry|
      entry.msgid.empty?
    end
    # TODO: sort by location
    sorted_messages = messages.sort_by do |entry|
      entry.msgid
    end
    headers + sorted_messages
  end

end
PK}$[&���0gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/pot.rbnu�[���# frozen_string_literal: true
##
# Generates a POT file.
#
# Here is a translator work flow with the generator.
#
# == Create .pot
#
# You create .pot file by pot formatter:
#
#   % rdoc --format pot
#
# It generates doc/rdoc.pot.
#
# == Create .po
#
# You create .po file from doc/rdoc.pot. This operation is needed only
# the first time. This work flow assumes that you are a translator
# for Japanese.
#
# You create locale/ja/rdoc.po from doc/rdoc.pot. You can use msginit
# provided by GNU gettext or rmsginit provided by gettext gem. This
# work flow uses gettext gem because it is more portable than GNU
# gettext for Rubyists. Gettext gem is implemented by pure Ruby.
#
#   % gem install gettext
#   % mkdir -p locale/ja
#   % rmsginit --input doc/rdoc.pot --output locale/ja/rdoc.po --locale ja
#
# Translate messages in .po
#
# You translate messages in .po by a PO file editor. po-mode.el exists
# for Emacs users. There are some GUI tools such as GTranslator.
# There are some Web services such as POEditor and Tansifex. You can
# edit by your favorite text editor because .po is a text file.
# Generate localized documentation
#
# You can generate localized documentation with locale/ja/rdoc.po:
#
#   % rdoc --locale ja
#
# You can find documentation in Japanese in doc/. Yay!
#
# == Update translation
#
# You need to update translation when your application is added or
# modified messages.
#
# You can update .po by the following command lines:
#
#   % rdoc --format pot
#   % rmsgmerge --update locale/ja/rdoc.po doc/rdoc.pot
#
# You edit locale/ja/rdoc.po to translate new messages.

class RDoc::Generator::POT

  RDoc::RDoc.add_generator self

  ##
  # Description of this generator

  DESCRIPTION = 'creates .pot file'

  ##
  # Set up a new .pot generator

  def initialize store, options #:not-new:
    @options    = options
    @store      = store
  end

  ##
  # Writes .pot to disk.

  def generate
    po = extract_messages
    pot_path = 'rdoc.pot'
    File.open(pot_path, "w") do |pot|
      pot.print(po.to_s)
    end
  end

  def class_dir
    nil
  end

  private
  def extract_messages
    extractor = MessageExtractor.new(@store)
    extractor.extract
  end

  require_relative 'pot/message_extractor'
  require_relative 'pot/po'
  require_relative 'pot/po_entry'

end
PK}$[��r�
�
Ngems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/json_index/js/navigation.jsnu�[���/*
 * Navigation allows movement using the arrow keys through the search results.
 *
 * When using this library you will need to set scrollIntoView to the
 * appropriate function for your layout.  Use scrollInWindow if the container
 * is not scrollable and scrollInElement if the container is a separate
 * scrolling region.
 */
Navigation = new function() {
  this.initNavigation = function() {
    var _this = this;

    document.addEventListener('keydown', function(e) {
      _this.onkeydown(e);
    });

    this.navigationActive = true;
  }

  this.setNavigationActive = function(state) {
    this.navigationActive = state;
  }

  this.onkeydown = function(e) {
    if (!this.navigationActive) return;
    switch(e.keyCode) {
      case 37: //Event.KEY_LEFT:
        if (this.moveLeft()) e.preventDefault();
        break;
      case 38: //Event.KEY_UP:
        if (e.keyCode == 38 || e.ctrlKey) {
          if (this.moveUp()) e.preventDefault();
        }
        break;
      case 39: //Event.KEY_RIGHT:
        if (this.moveRight()) e.preventDefault();
        break;
      case 40: //Event.KEY_DOWN:
        if (e.keyCode == 40 || e.ctrlKey) {
          if (this.moveDown()) e.preventDefault();
        }
        break;
      case 13: //Event.KEY_RETURN:
        if (this.current) e.preventDefault();
        this.select(this.current);
        break;
    }
    if (e.ctrlKey && e.shiftKey) this.select(this.current);
  }

  this.moveRight = function() {
  }

  this.moveLeft = function() {
  }

  this.move = function(isDown) {
  }

  this.moveUp = function() {
    return this.move(false);
  }

  this.moveDown = function() {
    return this.move(true);
  }

  /*
   * Scrolls to the given element in the scrollable element view.
   */
  this.scrollInElement = function(element, view) {
    var offset, viewHeight, viewScroll, height;
    offset = element.offsetTop;
    height = element.offsetHeight;
    viewHeight = view.offsetHeight;
    viewScroll = view.scrollTop;

    if (offset - viewScroll + height > viewHeight) {
      view.scrollTop = offset - viewHeight + height;
    }
    if (offset < viewScroll) {
      view.scrollTop = offset;
    }
  }

  /*
   * Scrolls to the given element in the window.  The second argument is
   * ignored
   */
  this.scrollInWindow = function(element, ignored) {
    var offset, viewHeight, viewScroll, height;
    offset = element.offsetTop;
    height = element.offsetHeight;
    viewHeight = window.innerHeight;
    viewScroll = window.scrollY;

    if (offset - viewScroll + height > viewHeight) {
      window.scrollTo(window.scrollX, offset - viewHeight + height);
    }
    if (offset < viewScroll) {
      window.scrollTo(window.scrollX, offset);
    }
  }
}

PK}$[P�^���Lgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/json_index/js/searcher.jsnu�[���Searcher = function(data) {
  this.data = data;
  this.handlers = [];
}

Searcher.prototype = new function() {
  // search is performed in chunks of 1000 for non-blocking user input
  var CHUNK_SIZE = 1000;
  // do not try to find more than 100 results
  var MAX_RESULTS = 100;
  var huid = 1;
  var suid = 1;
  var runs = 0;

  this.find = function(query) {
    var queries = splitQuery(query);
    var regexps = buildRegexps(queries);
    var highlighters = buildHilighters(queries);
    var state = { from: 0, pass: 0, limit: MAX_RESULTS, n: suid++};
    var _this = this;

    this.currentSuid = state.n;

    if (!query) return;

    var run = function() {
      // stop current search thread if new search started
      if (state.n != _this.currentSuid) return;

      var results =
        performSearch(_this.data, regexps, queries, highlighters, state);
      var hasMore = (state.limit > 0 && state.pass < 4);

      triggerResults.call(_this, results, !hasMore);
      if (hasMore) {
        setTimeout(run, 2);
      }
      runs++;
    };
    runs = 0;

    // start search thread
    run();
  }

  /*  ----- Events ------  */
  this.ready = function(fn) {
    fn.huid = huid;
    this.handlers.push(fn);
  }

  /*  ----- Utilities ------  */
  function splitQuery(query) {
    return query.split(/(\s+|::?|\(\)?)/).filter(function(string) {
      return string.match(/\S/);
    });
  }

  function buildRegexps(queries) {
    return queries.map(function(query) {
      return new RegExp(query.replace(/(.)/g, '([$1])([^$1]*?)'), 'i');
    });
  }

  function buildHilighters(queries) {
    return queries.map(function(query) {
      return query.split('').map(function(l, i) {
        return '\u0001$' + (i*2+1) + '\u0002$' + (i*2+2);
      }).join('');
    });
  }

  // function longMatchRegexp(index, longIndex, regexps) {
  //     for (var i = regexps.length - 1; i >= 0; i--){
  //         if (!index.match(regexps[i]) && !longIndex.match(regexps[i])) return false;
  //     };
  //     return true;
  // }


  /*  ----- Mathchers ------  */

  /*
   * This record matches if the index starts with queries[0] and the record
   * matches all of the regexps
   */
  function matchPassBeginning(index, longIndex, queries, regexps) {
    if (index.indexOf(queries[0]) != 0) return false;
    for (var i=1, l = regexps.length; i < l; i++) {
      if (!index.match(regexps[i]) && !longIndex.match(regexps[i]))
        return false;
    };
    return true;
  }

  /*
   * This record matches if the longIndex starts with queries[0] and the
   * longIndex matches all of the regexps
   */
  function matchPassLongIndex(index, longIndex, queries, regexps) {
    if (longIndex.indexOf(queries[0]) != 0) return false;
    for (var i=1, l = regexps.length; i < l; i++) {
      if (!longIndex.match(regexps[i]))
        return false;
    };
    return true;
  }

  /*
   * This record matches if the index contains queries[0] and the record
   * matches all of the regexps
   */
  function matchPassContains(index, longIndex, queries, regexps) {
    if (index.indexOf(queries[0]) == -1) return false;
    for (var i=1, l = regexps.length; i < l; i++) {
      if (!index.match(regexps[i]) && !longIndex.match(regexps[i]))
        return false;
    };
    return true;
  }

  /*
   * This record matches if regexps[0] matches the index and the record
   * matches all of the regexps
   */
  function matchPassRegexp(index, longIndex, queries, regexps) {
    if (!index.match(regexps[0])) return false;
    for (var i=1, l = regexps.length; i < l; i++) {
      if (!index.match(regexps[i]) && !longIndex.match(regexps[i]))
        return false;
    };
    return true;
  }


  /*  ----- Highlighters ------  */
  function highlightRegexp(info, queries, regexps, highlighters) {
    var result = createResult(info);
    for (var i=0, l = regexps.length; i < l; i++) {
      result.title = result.title.replace(regexps[i], highlighters[i]);
      result.namespace = result.namespace.replace(regexps[i], highlighters[i]);
    };
    return result;
  }

  function hltSubstring(string, pos, length) {
    return string.substring(0, pos) + '\u0001' + string.substring(pos, pos + length) + '\u0002' + string.substring(pos + length);
  }

  function highlightQuery(info, queries, regexps, highlighters) {
    var result = createResult(info);
    var pos = 0;
    var lcTitle = result.title.toLowerCase();

    pos = lcTitle.indexOf(queries[0]);
    if (pos != -1) {
      result.title = hltSubstring(result.title, pos, queries[0].length);
    }

    result.namespace = result.namespace.replace(regexps[0], highlighters[0]);
    for (var i=1, l = regexps.length; i < l; i++) {
      result.title = result.title.replace(regexps[i], highlighters[i]);
      result.namespace = result.namespace.replace(regexps[i], highlighters[i]);
    };
    return result;
  }

  function createResult(info) {
    var result = {};
    result.title = info[0];
    result.namespace = info[1];
    result.path = info[2];
    result.params = info[3];
    result.snippet = info[4];
    result.badge = info[6];
    return result;
  }

  /*  ----- Searching ------  */
  function performSearch(data, regexps, queries, highlighters, state) {
    var searchIndex = data.searchIndex;
    var longSearchIndex = data.longSearchIndex;
    var info = data.info;
    var result = [];
    var i = state.from;
    var l = searchIndex.length;
    var togo = CHUNK_SIZE;
    var matchFunc, hltFunc;

    while (state.pass < 4 && state.limit > 0 && togo > 0) {
      if (state.pass == 0) {
        matchFunc = matchPassBeginning;
        hltFunc = highlightQuery;
      } else if (state.pass == 1) {
        matchFunc = matchPassLongIndex;
        hltFunc = highlightQuery;
      } else if (state.pass == 2) {
        matchFunc = matchPassContains;
        hltFunc = highlightQuery;
      } else if (state.pass == 3) {
        matchFunc = matchPassRegexp;
        hltFunc = highlightRegexp;
      }

      for (; togo > 0 && i < l && state.limit > 0; i++, togo--) {
        if (info[i].n == state.n) continue;
        if (matchFunc(searchIndex[i], longSearchIndex[i], queries, regexps)) {
          info[i].n = state.n;
          result.push(hltFunc(info[i], queries, regexps, highlighters));
          state.limit--;
        }
      };
      if (searchIndex.length <= i) {
        state.pass++;
        i = state.from = 0;
      } else {
        state.from = i;
      }
    }
    return result;
  }

  function triggerResults(results, isLast) {
    this.handlers.forEach(function(fn) {
      fn.call(this, results, isLast)
    });
  }
}

PK}$[^��\gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtmlnu�[���<%- comment = if current.respond_to? :comment_location then
               current.comment_location
             else
               current.comment
             end
   table = current.parse(comment).table_of_contents

   if table.length > 1 then %>
<div class="nav-section">
  <h3>Table of Contents</h3>

  <ul class="link-list" role="directory">
<%-   table.each do |heading| -%>
    <li><a href="#<%= heading.label current %>"><%= heading.plain_html %></a>
<%-   end -%>
  </ul>
</div>
<%- end -%>
PK}$[��>�q�qPgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/fonts/Lato-Light.ttfnu�[���GPOS�jN�K�GSUBV.TL�OS/2�8�M�`cmapRԟ�N@�cvt &�7g|8fpgm�zAg�	�gaspgtglyf�i�S(��head�DeJ޼6hheaix��$hmtxESvJ�Tkern�2���ll�locaK�p�PP,maxp>
�R| name�
U�R�:post:�\�c��prep�x9�qH�
0JDFLTlatn����kernkernJnv�$R�
�^�	h
B
l�&��rj����Z���j��L��*|�DV�:�� �!.!�##L#�$4$~%�&J'$'�(�)�*�+f+�,6,�-�.(.�/t/�/�0:0|2"2�33T3�3�4&4l4�55b5�66L6�6�7B7�7�888�9d9�9�:&:�:�;@<�=�>j?,?�@hA�B�CzD�E�F�G*G�HfI�K	�V��B��V#��$�V&��*��2��4��97:7<?7D��F��G��H��R��T��m�Bo�By�B}�B��V��V��V��V��V��V��V��������������������������������������������������������������������������������V��������������B�B���B�B�B��VK	�V��B��V#��$�V&��*��2��4��97:7<?7D��F��G��H��R��T��m�Bo�By�B}�B��V��V��V��V��V��V��V��������������������������������������������������������������������������������V��������������B�B���B�B�B��V"#��&��*��2��4��F��G��H��R��T���������������������������������������������������������������������K	�V��B��V#��$�V&��*��2��4��97:7<?7D��F��G��H��R��T��m�Bo�By�B}�B��V��V��V��V��V��V��V��������������������������������������������������������������������������������V��������������B�B���B�B�B��V-�
�
��v#��&��*��2��4��7�L9�L:��<�y?�LY��Z��\��l�m�vo�vr�y�v|�}�v�����������������������y�����y�v�v�����v�v�v��'�B	��
�B
�B�v�v��$��7�L9��:��;��<�`=��?��l�Br�B|�B�����������������������`���`�������B�B�v�B�B�v��B���-�
�
��v#��&��*��2��4��7�L9�L:��<�y?�LY��Z��\��l�m�vo�vr�y�v|�}�v�����������������������y�����y�v�v�����v�v�v��k7	��
7
7�G���G������"<#��$��&��*��-�o2��4��D��F��G��H��I��J�{P��Q��R��S��T��U��V��W��X��Y��[��\��]��l7m��o��r7tFuFw��y��{F|7}���������������������������������������������������������������������������������������������������������������������������������������7�7�G�7�7�G����7���)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������6�V
�V
�V��"��#��&��*��--2��4��7��8��9��:��<�t?��Y��\��l�Vm��o��r�Vt�`u�`y��{�`|�V}�������������������������������������t�����t�����V�V�V�V��������V
�em�eo�ey�e}�e�e�e�e�e�e)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������4	���L�L������"$��-�.F��G��H��P��Q��R��S��T��U��X��w�������������������������������������������������������������������������������������L�L���	��������$��������������������������������1��#��&��*��2��4��F��G��H��I��R��T��W��Y��Z��\��m��o��y��}�������������������������������������������������������������������������������I��
��
��4�$4"��#��&��*��2��4��7�[9�V:�y<�=?�VF��G��H��R��T��Y��Z��\��l��m�$o�$r��t�Bu�By�${�B|��}�$�����������������������=�����������������������������������������������=�$�$�����4�����4�$�$�$���)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������.	������$��-�VD��F��G��H��R��T�����������������������������������������������������������������������������������������������)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������#��&��*��2��4��7��8���������������������������������������[	���L�L�L���`�`#��$��&��*��-�82��4��D�F�)G�)H�)J�>P�`Q�`R�)S�`T�)U�`V�DX�`Y�LZ�t[�g\�L]��m�Lo�Lw�`y�L}�L����������������������������������������������������������)��)��)��)��)��)��`��)��)��)��)��)��)��`��`��`��`������)�)�`���)�L�L�L�L�L�L�L���	��������$��������������������������������k7	��
7
7�G���G������"<#��$��&��*��-�o2��4��D��F��G��H��I��J�{P��Q��R��S��T��U��V��W��X��Y��[��\��]��l7m��o��r7tFuFw��y��{F|7}���������������������������������������������������������������������������������������������������������������������������������������7�7�G�7�7�G����7���I7	��
7
7��������"%$��-��D��F��G��H��J��R��T��V��l7m��o��r7t7u7y��{7|7}�����������������������������������������������������������������������������������������������7�7��7�7��������7���1��#��&��*��2��4��F��G��H��I��R��T��W��Y��Z��\��m��o��y��}�������������������������������������������������������������������������������i	�t

�y�`�y�t����"%#��$�t&��*��-�82��4��D��F�`G�`H�`J�[P��Q��R�`S��T�`U��V��X��Y��Z��[��\��lm�`o�`rt-u-w��y�`{-|}�`��t��t��t��t��t��t��t��������������������������������������������`��`��`��`��`��`�����`��`��`��`��`��`�������������t�����`�`�����`�`�`���y���y�`�`�`���t0��"%#��&��*��2��4��F��G��H��R��T��V��Y��\��m��o��y��}��������������������������������������������������������������������������"#��&��*��2��4��F��G��H��R��T���������������������������������������������������������������������6�V
�V
�V��"��#��&��*��--2��4��7��8��9��:��<�t?��Y��\��l�Vm��o��r�Vt�`u�`y��{�`|�V}�������������������������������������t�����t�����V�V�V�V��������V��
��
��Y��Z��\��l��r��t��u��{��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|���������K
K
K�y�ylKrKtdud{d|K�K�K�y�K�K�y�K��
��
��Y��Z��\��l��r��t��u��{��|���������F��G��H��R��T����������������������������������������������
��
��Y��Z��\��l��r��t��u��{��|�����������
��
��Y��Z��\��l��r��t��u��{��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|���������
����D���������������������������$	��������$��F��G��H��R��T��������������������������������������������������������������������������������F��G��H��R��T��������������������������������������������$	��������$��F��G��H��R��T������������������������������������������������������������������������"#��&��*��2��4��F��G��H��R��T���������������������������������������������������������������������K	�V��B��V#��$�V&��*��2��4��97:7<?7D��F��G��H��R��T��m�Bo�By�B}�B��V��V��V��V��V��V��V��������������������������������������������������������������������������������V��������������B�B���B�B�B��V'�B	��
�B
�B�v�v��$��7�L9��:��;��<�`=��?��l�Br�B|�B�����������������������`���`�������B�B�v�B�B�v��B���'�B	��
�B
�B�v�v��$��7�L9��:��;��<�`=��?��l�Br�B|�B�����������������������`���`�������B�B�v�B�B�v��B���)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������K	�V��B��V#��$�V&��*��2��4��97:7<?7D��F��G��H��R��T��m�Bo�By�B}�B��V��V��V��V��V��V��V��������������������������������������������������������������������������������V��������������B�B���B�B�B��V	�`�`$�`9F:F<(?F��`��`��`��`��`��`��`�(�`�(��`	�`�`$�`9F:F<(?F��`��`��`��`��`��`��`�(�`�(��`'�B	��
�B
�B�v�v��$��7�L9��:��;��<�`=��?��l�Br�B|�B�����������������������`���`�������B�B�v�B�B�v��B���	�`�`$�`9F:F<(?F��`��`��`��`��`��`��`�(�`�(��`K	�V��B��V#��$�V&��*��2��4��97:7<?7D��F��G��H��R��T��m�Bo�By�B}�B��V��V��V��V��V��V��V��������������������������������������������������������������������������������V��������������B�B���B�B�B��V'�B	��
�B
�B�v�v��$��7�L9��:��;��<�`=��?��l�Br�B|�B�����������������������`���`�������B�B�v�B�B�v��B���6�V
�V
�V��"��#��&��*��--2��4��7��8��9��:��<�t?��Y��\��l�Vm��o��r�Vt�`u�`y��{�`|�V}�������������������������������������t�����t�����V�V�V�V��������V6�V
�V
�V��"��#��&��*��--2��4��7��8��9��:��<�t?��Y��\��l�Vm��o��r�Vt�`u�`y��{�`|�V}�������������������������������������t�����t�����V�V�V�V��������V6�V
�V
�V��"��#��&��*��--2��4��7��8��9��:��<�t?��Y��\��l�Vm��o��r�Vt�`u�`y��{�`|�V}�������������������������������������t�����t�����V�V�V�V��������V6�V
�V
�V��"��#��&��*��--2��4��7��8��9��:��<�t?��Y��\��l�Vm��o��r�Vt�`u�`y��{�`|�V}�������������������������������������t�����t�����V�V�V�V��������V6�V
�V
�V��"��#��&��*��--2��4��7��8��9��:��<�t?��Y��\��l�Vm��o��r�Vt�`u�`y��{�`|�V}�������������������������������������t�����t�����V�V�V�V��������V6�V
�V
�V��"��#��&��*��--2��4��7��8��9��:��<�t?��Y��\��l�Vm��o��r�Vt�`u�`y��{�`|�V}�������������������������������������t�����t�����V�V�V�V��������V
�em�eo�ey�e}�e�e�e�e�e�e)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������	��������$��������������������������������	��������$��������������������������������	��������$��������������������������������	��������$��������������������������������i	�t

�y�`�y�t����"%#��$�t&��*��-�82��4��D��F�`G�`H�`J�[P��Q��R�`S��T�`U��V��X��Y��Z��[��\��lm�`o�`rt-u-w��y�`{-|}�`��t��t��t��t��t��t��t��������������������������������������������`��`��`��`��`��`�����`��`��`��`��`��`�������������t�����`�`�����`�`�`���y���y�`�`�`���t)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|��������������������������������������������������������
��
��Y��Z��\��l��r��t��u��{��|�����������
��
��Y��Z��\��l��r��t��u��{��|�����������
��
��Y��Z��\��l��r��t��u��{��|�����������
��
��Y��Z��\��l��r��t��u��{��|�����������
��
��Y��Z��\��l��r��t��u��{��|�����������
��
��Y��Z��\��l��r��t��u��{��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
��
��Y��Z��\��l��r��t��u��{��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|���������6�V
�V
�V��"��#��&��*��--2��4��7��8��9��:��<�t?��Y��\��l�Vm��o��r�Vt�`u�`y��{�`|�V}�������������������������������������t�����t�����V�V�V�V��������V��
��
��Y��Z��\��l��r��t��u��{��|���������
�em�eo�ey�e}�e�e�e�e�e�e��
����
��9��:��?��@��Y��[��\��`��l��r��|��������� �t
�t
�t�o9�j:��<�y?�jY��\��l�tm�oo�or�tt��u��y�o{��|�t}�o��y�y�o�o�t�t�t�t�o�o�o��t��
��
��Y��Z��\��l��r��t��u��{��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|���������i	�t

�y�`�y�t����"%#��$�t&��*��-�82��4��D��F�`G�`H�`J�[P��Q��R�`S��T�`U��V��X��Y��Z��[��\��lm�`o�`rt-u-w��y�`{-|}�`��t��t��t��t��t��t��t��������������������������������������������`��`��`��`��`��`�����`��`��`��`��`��`�������������t�����`�`�����`�`�`���y���y�`�`�`���t0��"%#��&��*��2��4��F��G��H��R��T��V��Y��\��m��o��y��}��������������������������������������������������������������������������0��"%#��&��*��2��4��F��G��H��R��T��V��Y��\��m��o��y��}��������������������������������������������������������������������������0��"%#��&��*��2��4��F��G��H��R��T��V��Y��\��m��o��y��}��������������������������������������������������������������������������'�B	��
�B
�B�v�v��$��7�L9��:��;��<�`=��?��l�Br�B|�B�����������������������`���`�������B�B�v�B�B�v��B���'�B	��
�B
�B�v�v��$��7�L9��:��;��<�`=��?��l�Br�B|�B�����������������������`���`�������B�B�v�B�B�v��B���K	�V��B��V#��$�V&��*��2��4��97:7<?7D��F��G��H��R��T��m�Bo�By�B}�B��V��V��V��V��V��V��V��������������������������������������������������������������������������������V��������������B�B���B�B�B��VK	�V��B��V#��$�V&��*��2��4��97:7<?7D��F��G��H��R��T��m�Bo�By�B}�B��V��V��V��V��V��V��V��������������������������������������������������������������������������������V��������������B�B���B�B�B��V-�
�
��v#��&��*��2��4��7�L9�L:��<�y?�LY��Z��\��l�m�vo�vr�y�v|�}�v�����������������������y�����y�v�v�����v�v�v��K	�V��B��V#��$�V&��*��2��4��97:7<?7D��F��G��H��R��T��m�Bo�By�B}�B��V��V��V��V��V��V��V��������������������������������������������������������������������������������V��������������B�B���B�B�B��VK	�V��B��V#��$�V&��*��2��4��97:7<?7D��F��G��H��R��T��m�Bo�By�B}�B��V��V��V��V��V��V��V��������������������������������������������������������������������������������V��������������B�B���B�B�B��V-�
�
��v#��&��*��2��4��7�L9�L:��<�y?�LY��Z��\��l�m�vo�vr�y�v|�}�v�����������������������y�����y�v�v�����v�v�v��'�B	��
�B
�B�v�v��$��7�L9��:��;��<�`=��?��l�Br�B|�B�����������������������`���`�������B�B�v�B�B�v��B���'�B	��
�B
�B�v�v��$��7�L9��:��;��<�`=��?��l�Br�B|�B�����������������������`���`�������B�B�v�B�B�v��B���'�B	��
�B
�B�v�v��$��7�L9��:��;��<�`=��?��l�Br�B|�B�����������������������`���`�������B�B�v�B�B�v��B���K	�V��B��V#��$�V&��*��2��4��97:7<?7D��F��G��H��R��T��m�Bo�By�B}�B��V��V��V��V��V��V��V��������������������������������������������������������������������������������V��������������B�B���B�B�B��V6�V
�V
�V��"��#��&��*��--2��4��7��8��9��:��<�t?��Y��\��l�Vm��o��r�Vt�`u�`y��{�`|�V}�������������������������������������t�����t�����V�V�V�V��������Vv

#$&')-./2345789:;<=>?DEHIKNPQRSUYZ[\^lmoprtuy{|}��������������������������������������������������������������
8�DFLTlatn����case&case,liga2liga8sups>supsD,>B	

@LO,{tuCjqv�������I�,xx�D���P`KtyPL@�J�z��� ��� �&
	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a���������������������������������rdei�x�pk�vj���sgw�����l|����cn���m}�b�������������������y���������������������q���z���`T@
~�1DS[a~�����    " & 0 : D �!"!&"""""""+"H"`"e%�&i���
 �1ARZ`x�����      & 0 9 D �!"!&"""""""+"H"`"d%�&i����������������{�u�q�[�H����$��������������I�����������������޸ޡޞ�:ڜ`T@
~�1DS[a~�����    " & 0 : D �!"!&"""""""+"H"`"e%�&i���
 �1ARZ`x�����      & 0 9 D �!"!&"""""""+"H"`"d%�&i����������������{�u�q�[�H����$��������������I�����������������޸ޡޞ�:ڜ/��'37;��BK�	PX@3	`f[[		QCQ
D@4hf[[		QCQ
DY@
;:$$#,$
+>32#'&>54.#"#"'4632#"&!!7!!3<G*6]E'!1:3%
A 1;2"/?#.B.{,! ,, !,����]#[��n$;S47O;-('rz/**5C/$8'�� ..  ..��y$?����
&@#QCSD

+#.54>32#"&tA1!""'5���-PS\88\SP-<��""!5��)�
,@)
BQD

$+#"&/!#"&/		u		��ܙ�$�ܙ�$V<�6:��5BK�-PX@(
Y	CQ
C
D@&
Z
Y	C
DY@:98766421/-,(&#"!#!+#"&547!+#"&5<?3#76;>;!323+32%!!�^)V��V*^��R�(�W*_*_*W�(�R���*R����E��m�
	
�&!��F��p&!�{,F����
\;FQ�@)
!
LA*7BK�PX@2j

h
f_

SC	TD@1j

h
fk

SC	TDY@NMCB;965$#$+.'7632.54>?>;#".'+4.'>��H	&4EX8 D�e>4e�_	$e�?
'?]A/_WJ7:m�f
$�2Tm<P}U,��,Lc8LqL&bP'!'#|4QwZE�e>��K?"!(%�� (4G[<V�sF�
�B\@+��7Yu�>X?-(0K`W����'0DX?@<[	[CSC
C		SDUS((%"&((($
+#".54>324.#"32>>;+#".54>324.#"32>�0Rl<>mP..Pm>>lQ/L#=Q--P<##<P--Q=#eC�
D�0Ql<>mP..Pm>>lQ.L#<Q--Q<##<Q--Q<#3W�X--X�WX�Y--Y�XMnG!!GnMMmF!!Fm�
��PW�X--X�WX�Y--Y�XMoG!!GoMMmF  Fmj��T�@RS@PN9K*$BhfSC
CSDGE0.'%!
@@+2#"&'.#">7>;#"&/#".54>7.54>32>7&'�CxY5
":W;<bF'TX�-57C>*Y�-l~�OK�sG4Z|HGG3^���;^s8F}m[&�5BkJ(�.Ng8D<*%C\7R�V�HH�I
^�[���4X?$2a�ZH�mVP�VFwX2��MrM& 9N/�N_n���
@BQD

$+#"&/		��ܙ�$������(+.54>7�yx*Mi@@iM*
wyv�e�
v���uu���v
��eb�����(+4'&54?'&5476Zyw
*Lj@@jL*xyv���
v���uu���v
��{���51@.1-,($#
	BMQE55+5467'7>7./7.=3>?'.'t����4����
��	m,n
n-n
��	m-m	
n-n	�m��,@)MYQE+!!#!5!i��QN�R���=I�;�I�n��@B?S
D"+74632'&5467>7#"&n0'+/(8"
	%/U#2;0)URL 	

'5@$2d)5z@MQE+!!d�/zQi��"�@SD($+74>32#"&i!""'5M""!5������@kD""++6;[ 'n')-�%I��?�'@SCSD((($+#".54>324.#"32>?P��ii��OO��ii��PdBo�RR�pBBp�RR�oB�WW����WW����HH���GG����*@'
BhCR
D%+%!47#"/3!!5E��
	�J5�'J|"&��	(i��J��2>@;.BhSCQ
D-,+)$"
22+2>3!2!5467>54.#"#"&#'>ZQ�pB1To=�E E#c�o�<fK+4Wq>CqW9
0Kr��/_�`P�~w>�<8"�=rtzENsJ$)Ie<#[�b3����HU@RD
Bhh[SCSDB@;910/.&$HH	+2#".'763232>54.#5>54.#"#"/>eQ�m?+Kf<��Fz�ay�h:&#4KeBZ�[-)`�s\�^02Tp=CpV:1
Jr��-Z�XEoT9��W�l=Ah�@
599-<]s6ApQ/E-NlAKnH"(He>#[�b3?^� @[C
D!#+!+#!"&/3467![
�V�e	�UV��^�4
�j�
/��&�������/@@=-,Bh[QCSD(#&(#"+#!>32#".'763232>54.#"'!��UCx7n�q:N��d;j^N

1MiFR�i;-[�^9�H>o|^�(?q�\p�|B#.'$5d�]L�[3s����02@/B[CSD-+#!	+2#".54676;>32>54.#"t[�o?E{�gc�u@T`�"T�Z4;���1Z�QV�a43]�NX�`2N<m�``�vB@x�mSт��)H#=E�]O�a66_�MQ�[1=a|�/�@QC
D#'++67!"&=/�wA�
���+	��=x���';OD@A
B[SCSD=<)(GE<O=O31(;);''	+".54>7.54>32'2>54.#"2>54.#"Df�yD-RqD>`A"9j�_^�k9"B`>DqR.Dy�fQ�`4Dj�<<�jD4_�QQwN%*QuKKvQ*%Nw6f�ZNzZ<>Vi<K�b88b�K<iV><ZzNZ�f6L-StG]|JJ|]GtS-�1Sj9=iN,,Ni=9jS1��22@/B[SC
D/-%#	+".54>32+>74.#"32>=W�k<Cx�b^�q?-@)��"V�3:�"2Z{IN�]40W{KU�\/Z9j�\[�rA@u�d7ddi<��H*K#@F�M�[32Z}KN}W.:^u���J�#;K�#PX@SCSD@[SDY�(&($+74>32#"&4>32#"&�!""'5!""'5M""!5D""!5��J�-H@
(B?K�#PX@SCS
D@[S
DY�,*$($+4>32#"&4632'&5467>7#"&�!""'50'+/(8"
	%/j""!5�#2;0)URL 	

'5@$2�	�5�(+����!'*)���A��		��A����e!@YMQE+!!!!�;��;��,J�J�	�5�(+546767.'&=�*("���	A	
A�)!����(:9@6BhfSCSD(&#-$+>32#'54>54.#"#"'4>32#"&!DQ`8F|]7/HTI3A0GSG0*H^3BaB&�!""'52'*NqFLnS?78"��)>:<KbC6U;#+#�i""!5l�3Naf@c
U
8Bh[

[	[OSGPOYWOaPaFD<:641/'%NN
+%"&'#".54>3232>54.#"3267632#"$&546$32%2>7.#"�XY8�R8R6A}�t5]%[%09hP/a��}���mq����d
p����zv�����q:e���$MG>P3"Z�g9(;�]W]S'D\5U��V��.I,7 <o�b�ݒHj�������]DA%JPi�%���wS��m��HF?kS6Iv�K(E2��
$@!BZC
D# +!#"&'!+3!.'�O��I�NCf��z����e��{�++�z�*=@:B[SCS
D*(" !+3!2#!2654.#%!2>54&#!��y�t9'JkE��@z�q��c��3`�Y��3b�Y*�����0]�U8hXA��Z�d5�����CkK(K2Rh7��|���2D@ABhfSCSD,*" 	22+%2#".54>32#".#"32>7>�
(,h{�X���be���M�ob/	+=TnF�؜WV��yLwdV*	�+/K5g���
�i+@*-%Y�뒖�W(:'�y�@SCS
D!(!$+#!!24.#!!2>yb��������bjR�Ҁ�c��ҕRĤ���b�b������T�T���"�.@+YQCQ
D+!!!!!"�l����U��S��U��"�	(@%YQC
D		+!!!#"���{g�U��U�v�|��C�4H@E!
Bh[SCSD,*%#44+%2>7!"&=!#".546$32#"'.#"2Ixg]/���5r��Y���dd��Q�vf/		9a�h�ޝUV��C+}	8�	%:'g����g+?),,0&X�쓖�X�� @YC
D+!#!#3!3g��ggvg��Z��l��^�@C
D+!#3^gg�Y����'@$BhCSD#'$+#"&'>7>3232>53�;m�b-\1	#-LzV-g�w�|?	0c�f���"&@#B[C
D'(' +32>7>;#"&'.+#3VT;S��!�S�� [ff�	K
���Xd�V����@CR
D+%!!38���fWW��H� %@"BhC
D!5(+>7>;#47+"'#32z
,GZ����YF;� �
�y��#��J�
�(��@C
D!+2&53#"'#3	�Z1�hY2��6��y��Y�{����'@SCSD((($+#".54>324.#"32>�b������cc������bjR�Ҁ~їSS��~�ҕRĤ���gg����hg������WW�씕�VV���S�*@'[SC
D
!+#!2#%!2>54&#!Vfm��E��u��^�g7���:�����]�q?R4\}J��{����0T@
BK�PX@SCSCD@kSCSDY�(((%&+#"&'#".54>324.#"32>�+PsHpV ��?�N���cc������bjR�Ҁ~їSS��~�ҕR�k��~-�vFg����hg������WW�씕�VV�����"2@/B[SC
D" *!+#!2#"&'.#'32>54&#!Vfi��8i�]�Y�;')��^�g6ƽ��������Q�eA
��>L-TvJ��W����==@:=BhfSCSD;9(&!#!+#".#"#"&'763232>54.54>32~	
)FiMMuO)=d�d==t�l��L	(8J`=T�[0=d�d=6h�bn�H�%-&,Ld7H^B-,5PuWY�tCcV,#)#3XyEKaA,*4Qy[G�e=FH#n� @QC
D+!#!5n�f��W��0W����#@ CSD+%2>53#".53�f�p;fJ��||NjJg;o�IG~�ck��u˗VV��uk��c�~H��@BC
D* +3267>;#Q��P��[��j.46,��y��' @#BC
D,; +32>7>;2>7>;#&'#Ue	
��eN�C\�^�][��u..��u,-��y��4��@BC
D(")!+	32>7>;	#"&'+�e
��
b��e�B
�J]����L
�T�%���	��@BC
D,"+#32>7>;�g��Y��ZH��H?
�v++�s��
$@!QCQ
D

+!!547!5��~�������#�U%�U�����
'@$[OQE

!#+!+32�>�����$
��
$������@kD" +32#"&')'n' �%�"k����
!@[OQE!"+46;#"&=!!k��=���
s
$�� ��@
BkD,!+3#"&'.'+ <UD�	
	�
G���
��L���3@MQE+!5���DDV���	@kD		+2#"&/��6���
�k��C�'7T@Q-Bh[SC
C	SD)(/.(7)7" 	''
+!"/#".54>754&#"#"/>32%2>7)QXf=3`J-H��wuHeF,
N�mPxO(�J:aSH#�ͅ?!6H(@,>aD?lP0h��(0(NP3_�S�x5->$#<S52I/�����#�K�%PX@
B@
BYK�%PX@CSCSD@!CSC
CSDY@##&#+33>32#"&'#"32>54&�`B�m��9o�ih�6hc�?9�ZX�Y-����Xf��m��PQOz�f[��VE@u�b��X��X�,9@6,BhfSCSD(&#(#"+#".#"32>32#".54>321	
#:W>V�[01Z�NHa?%
FXg8_�q?<s�la�8^ =r�ei�o:"("
 4&E��yr��K>5W����#q@
BK�%PX@CSCS
D@!CSC
CSDY@##
+!"/#"&54>323%267.#"c
B�n��9o�ie�6`�^c�?:�XX�Y-��Zj��m��PKHN�Q@f[
UF@u�b��X����%0H@EBh[SCSD'&,+&0'0	%%	+2#!32>32#".54>"!4.T�i;
�14`�TKnK,

Oao8f�xA=s�kMzY7	�,Pp�:o�ip�s:!)!
 4%G��k��JG0Z~NPX/n�_�BK�!PX@SCQC
D@[SC
DY@!$%!	+3'&=354>32#"&#"!!nj�,PqD?)1S<!C��{	'~U�V+
.@gK{G��K����:Pd�@3B+BK�PX@,
[[CS	CSD@/h
[[S	CSDY@RQ\ZQdRdMKA?$"::+23#"'#".5467.54>7.54>4.'32>2>54.#"�Ao,��4]�OVF*0<c�c<>u�gi�k6h[2; -GO3]��1Rkuv3&A.-W~RL�a7��@dD#$Ec??dE$$Ed� !&_6HuS.B+.-QC>rX5+I`6Or@9.-()�[HuT.��/9 
	'1;#,K7 ">V.%B\88]B$$B]88\B%���-@*BCSC
D##+33>32#4&#"�_E�nR}R*_��b�B���Ue4b�W��|��eX��G�&@#SCC
D
+##".54>32_�    ��W!!���G�'4@1	BSCCSD$"!$%+#"&'76323265#".54>32;Y<.
QN�    �4XA%
0XQbW!!���0@-B[CC
D%(%!+3267>;#"&'.+#.�T�I
�S�^-`���{�_

�
�
�
���@C
D+#_��Q����,8@5+
BCSC
D,,##&&!	+332>32>32#4&#"#4&#"�4	BKU/m�ATc4JvS,`~u4_I+_toQ�6��)D1q>Z;1`�Z��|��&KpJ��|��aV����1@.BCSC
D#$!+332>32#4&#"�4	D�oR}R*_��b�B��Vi4b�W��|��eX�W����',@)SCSD''	+2#".54>2>54.#"k�t==t�kk�u==u�kY�Y,,Y�YY�Y--Y��I��uu��HH��uu��I�K=r�dc�s>>s�cd�r=�����$D@ABCSCSCD$$&%!+32>32#"&'"32>54&�4
	B�n��9n�if�6Bc�>9�YX�Y-���C�Zj��m��PJI�g\��VF@u�b��W����#D@ABCSCSCD##&#+##"&54>32763267.#"�`B�l��9o�ig�6	��c�?6�YX�Y-��Xf��m��PNLp�]f[RH@u�b�����8@5BhCSC
D#$%!+332>32#".#"�20�u-L"
!0q�-��y�B
���yY����<=@:<BhfSCSD:8'%" #!+#".#"#"&'7>3232>54.54>32�#9S<6Y?#0NchcN0/Y�Si�<
&=[C?`@!0NcicN0.UzL[�;h4E&/>,  ':T<ApR0C6" % #<Q-2B.  &:S>5bJ,464���@#x@
!BK�PX@%jhQCSD@#jh[SDY@
	##	+"&5#"&=7>;!!32>32�eq��
-9��%2$4&&upu�%d	��G�]);&
**3�����-@*BC
CSD$!#+32673#"/#".5逃a�C`5	E�oS|R*���cX��Vh4b�W|��@
BC
D,!+!#32>7>;T�\KH

	JH�	��*+
��* @#BC
D*!); +32>76;2>76;#"'.'+I�'		�F��F����C�	��**��-*+�(��#v�@BC
D("(!+	3267>;	#"&'+���[
$

X��j[��
��U���Z�	�����h	����@BCD,""++32>7>;{D��[OO	KI����	��
J:�
@QCQ
D+!!547!5!:��d�)q������K&MK?����H3@0*B[[OSG@>;83-+4.#52>54.54>;+";2#".54>�):##:)&HiB7!+G3)55)3G+!7BiH&�!7)=)7!7hhi8=hM+*8P19lii5%>./=%5ijl81P8*+Mh=8ihh��Q�@QD+3#KK�i���H5@2B[[OSGEDCB530-3)++546;2>54.54>7.54>54.+"&=323"}&HiB7	!+G3)55)3G+!	7BiH&)9##9)�7hhi8=hM+*8P18lji5%=/.>%5iil91P8*+Mh=8ihh7!7)=)7����9@6jk[OSG
+2>53#".#"#4>32%=*N <X83kib+&;*M <W84khb70B'7^F('0'0B'7^F('0'���
&@#SCQD

+4>734632#"&A�5'""'5��&-PS\88\SP-���'5""7����0;U@R6&,BjhfkSCTD##'#	+.54>?>;#".'>32+M`�r>@{�s
$W�5		!7P8+KfC'EXh:
$��/Y}N,\�a3J��tp��M�
�:.!��"' 1%�
�b�o@i?q�CQ�:@@=3)Bh[SCS
D#&#%&%"	+46;4>32#"'.#"!#!>3!#!5>5#C�4g�fLtW>&	

->V<NuP(�
�?H?+�6"@2��&]�uC%@V0;.4]�O��'��Yy+(A
(:N4F���D#79@6!B
@ ?WSD42*((+467'7>327'#"&''7.732>54.#"�($�1�-n?>m-�1�$*)$�2�-n>>m-�1�$)H+Ic88cJ++Jc88cI+�>m-�2�$*)$�2�-n?>m-�2�$)($�2�-n?8bI++Ib88cJ++JcU(� 8@5	B
Z	YC
D *!+!3267>;!!!!#!5!5!�Z�ZO
Z
	YP�Y[��n��_��n��h�g#!'���:v:��~:v��Q�@YQD+3#3#KKKK������}k�H\A@>HZP=#BhfWSDFD-+(&!#!+#".#"#"&'7>3232>54.5467.54>32>54.'(#9S<8[@#2RhmhR2TR6C/Y�Si�<
&>\D>`B"4VmqmV4[g7E.UzL[�;��'CX`c-G>$=QZ]+YJ
5F'.D7.07F]>S{#&bEApR0C6" % "<Q/3L;004EY=M{%%cJ6aK,55��)A5-*+ `=-F7,)'&^'�"W'3K�PX@
SD@OSGY�((($+#".54>32#".54>32�

W









U����,H\�@
BK�PX@4hf[[		SCSDK�PX@4hf[[		SCSD@4hf[[		SCSDYY@
YW*,((#&(%!
+632#".54>32#".#"3264>32#".732>54.#"8;�t`�s@Cx�c4WJ@
!:[DS�a55^�MU{�S4]���dd���]44]���dc���]4;g���hh���g�
;FAv�fd�wB)!5b�WZ�a3)Pc���^44^���cd���^44^���d��hh���ii��j>5�&4B@? ,Bh[WSD('.-'4(4$##' 	+#"&/#".54>754&#"#"/>322>755 

15=$!<.*]�iDI+;(0jCeh��!81+��!*GD$
%9'$A13LO
0-ub��"�D8'����%�%(+55���
	
���
	
�
z
��	��
{
z
��	��
�S��=K�	PX@_MQE@kMQEY�+!#!�=R���'d)5z@MQE+!!d�/zQU����/FO��:BK�PX@/h		[
[SCSDK�PX@/h		[
[SCSD@/h		[
[SCSDYY@00OMIG0F0E)!(*,&+4>32#".732>54.#"#32#"&'.#'32654&+U4]���dd���]44]���dc���]4;g���hh���g�U����u	P
��n�ywlv��c���^44^���cd���^44^���d��hh���ii��yusvd���
_
@a[\T�5%@MQE+!!!��%A[D��'@WSD((($+4>32#".732>54.#"[/Qn??nQ//Qn??nQ/G$>T00T=$$=T00T>$n>mQ..Qm>>lQ//Ql>0T>$$>T00T?$$?TmP�7@4YYMQE
	+!!#!5!!!i��QN�R��R��U��jI�n�I��Ia�;W-g@
+BK�#PX@h[SD@!h[OQEY@(&#!
--+2>3!2!546?>54.#"#"&/>V,N9!*8�'�&�1%'4>H|W1I0(E?;�*�89< #4"G7`fb|=W?�@=BK�PX@,hh[[SD@1hh[[OSGY@;964.-,+#!??	+2#".'7>3232>54.#5>54.#"#"/>\,L7 H<IM%@V0<Q7!$;-)>).J5[Y'3?I{W/C+BWTB0M73C$
(%*4!4%1K?"2!A;`f���	@kD	#++7>3�9���
������0@-BCS
CD&$!#+32673#"/#"&'#"&5逃a�C`5	F�fb�%0���cX��X\MH+X$��6�B��*@'hiSD+##!#".54>3��U��Vg�r==r�g�R�
�
y8b�MP�\2��o�@OSG($+4>32#".�$&&$P&&%%����V@
BK�	PX@^jTD@jjTDY@+232654.'73#"&'76�(390A'*=Y]1D()N
��
,&!�`<;0!��5RO�	BK�PX@jjQD@jjMRFY�$+37#"/733!����:����%~	��c1W;��)@&WSD	+2#".54>2654&#"wBjJ''JjBDjK''KjDhiihkii�*OoEEoO**OoEEoO*��rq��qr�����)�'(+7'&547>7.'&54?'&547>7.'&54?�������	&

%	��
��	&

%	��
�q�#-O@L!	Bh		Z
[CS
D-+(&#"$!"
+%3+#5!"/3%37#"/733!47!+>;�~m?��`C�����:�������( 
*�$�� �#%~	��c1w�}�
d�K�-=Ge@b710+Bhh		Z[CS

DGEB@=<;:9853/.(&#!
--
+2>3!2!546?>54.#"#"&/>%37#"/733!+>;f,N9!*8�'�&�1%'4>I|�����:����( 
*�1I0(E?;�*�89< #4"@>`f%~	��c1�b
dSq�PU_]@N	
$SBK�	PX@B

h		h
	
	[[
\SCS
DK�PX@B

h		h
	
	[[
\SCS
DK�
PX@B

h		h
	
	[[
\SCS
D@B

h		h
	
	[[
\SCS
DYYY@!_]ZXUTKHEC=<;:20)' PP!"+%3+#5!"/32#".'7>3232>54.#5>54.#"#*.'>47!+>;�~m?��`C�Z,L7 H<IM%@V0<Q7!$;-)>).J5[Y'3>J	{�����( 
*�$�� ��/C+BWTB0M73C$
(%*4!4%1K?"2!G5`f���}�
d*����);5@2BhfSCTD('#-$+#".54>?332>324>32#"&�DQ`8E}]70GTJ3A0GTG0*H^3E_@$
		��!""'5�2')MoGLkM924#��*<45E]B6U;#+#O""!5����&$	[����&$[����&$
`����&$`����&$
`����&$`����4@1YYQCS
D"	+!!!!!!!+!����Hj��K��8���
O� i�U��S��U��c7.|���Oh@e<B
M	Bhf
hSCSC	S			DKIA@:820(&!OO+232654.'7.54>32#".#"32>7>32#"&'76�(390A'$��Ze���M�ob/	+=TnF�؜WV��yLwdV*	
(,ey�UY]1D()N
��
,&!sn���
�i+@*-%Y�뒖�W(:'+.J5K<;0!���"�&(	Z���"�&(Z���"�&(
_���"�&(
_����&,	���N�&,��E�&,
	��N�&,
	1��!,@)YSCS
D!%(!+3!2#!#%4.#!!!!2>1����bb������R�Ҁ�c��l��ҕR��b��������b���T��@��T������&1���{����&2	���{����&2���{����&2
���{����&2���{����&2
����D�	(+		'	7	�t3����4u��5pn����4t��4vp6��o{����!-9b@
21&%BK�PX@kCSCSD@jkSCSDY�**%(%$+#"&'+7&54>327>;.#"4&'32>�b���s�Q�
 ,�lwc���y�So7�eo�$^U�G�j~їSrVN�E�d�ҕRĤ���g=9��`���hC?��`�갠�R�9<W�씘�R�35V��������&8	�������&8�������&8
�������&8
�����&</�S�.@+[[C
D
!+#3!2#%!2>54&#!Vff��E��u��^�g7����������]�q?R4\}J����'�J>@;BhSC
CSDED?='%" JJ+2#"&'7>3232>54.54>54.#"#4>�U�Z./GRG/!7EIE7!2Z~Me�<

%<Y?;\?!;XfX;0ITI0?fIG}^6_Bu��3Qd2>\G87:%$1$!)<S;DrR-C6" % #=R/CQ4&1K?1H>:DS8I?*+X�^��e�o;��k��C�&DC���k��C�&Dv���k��C�&D����k��Ci&D����k��CW&Dj���k��C�&D��k����BR]�@:@BK�1PX@5hh

[S	CSD@?hh

[S	CSCSDY@&TSYXS]T]NLDC><7520-,$"
	BB+2#!32>32#"&'#".54>754&#"#"&/>32>32>5"!4.�K�`7
�l0X|LGdD&
JZe4��/Uly7?lP.H��wuHeF,M�k~�/���ͅ?!<R1BtW2�HsR1V(He�<s�op�r:!'!
4%��MjBBhI@qV6E��)0)
NP�po��(BY58O2,U|O+4^�RU�]1X��X�Gh@e6:
E	Bhf
hSCSC	S			DCA9842/-%# GG+232654.'7.54>32#".#"32>32#"&'76�(390A'%W�g8<s�la�8	
#:W>V�[01Z�NHa?%
-�jY]1D()N
��
,&!vK��sr��K>5" =r�ei�o:"("
 :NO<;0!��X����&HC���X����&Hv���X����&H����X���W&Hj���"V�&�C������&�v�������&��������W&�j�Y���}6J6@3<2B65@[SD87B@7J8J.,$"+&54?.'.546?7#".54>32.'2>7.#"�~<�J
Z�N�
r?iM*9r�s[�wD:o�g5kcV �n�9X�\2;XvLX�Y-7_}.

m!/<0�d/z��u��WAy�l`�I9X<��K��-E��t3fP2<j�R]�d5����i&Q���W����&RC���W����&Rv���W����&R����W���i&R����W���W&Rj�m�_#+@([YOSG($(#+!!4632#"&4632#"&m��Uy5'""'55'""'5�I�'7#!5�_'7#!5W���& ,6=@:54%$
BjkSCSD.--6.6'%($'+#"'+7.54>327>;.#"2>54'h<>=t�k�lQ
!&�DF=u�kX�7W2��/0�-vKY�[.iY�Z.P�
WiC�vu��HOm�C�u��I1-t��h�9�*,?s���>r�d�s�]E�������&XC��������&Xv��������&X��������W&Xj�������&\v������!@@=BCSCSCD!!&#+3>32#"&'"32>54&�_B�m��9n�if�6Bc�>9�YX�Y-�����Xg��m��PNL�g\��VF@u�b�������W&\j���c�&/O@L,BAhZC
CSD('#!&&	+2#"&54>7&'!+3"32>!.'F
T/L^'1��I�NCfC23&@2&�z���"KB92*��e��y/A'05��++k����BRn@k-H	6Bh
h		[SCSCSDDCJICRDR?=1/*(%# BB+2#"&54>7&/#".54>754&#"#"&/>3232>2>7�
T/L^)4
)QXf=3`J-H��wuHeF,N�mPxO(.(@2&��:aSH#�ͅ?!6H�"KB ;3+	(@,>aD?lP0h��(0(
NP3_�S�x"-705(->$#<S52I/��|���&&��X��X�&Fv���A�'T@Q	B
		hYQCQ
C		SD$"''+2#"&54>7!!!!!!#32>$
T/L^&1�RP�l���[.(@2&�"KB82+�U��S��U"-705X����CNg@d2Bhh

[		SCSCSDEDJIDNEN@>0.+)$"CC
+2#"&54>7"#".54>32#!32>3232>"!4.�
T/L^!+
f�xA=s�jT�i;
�14`�TKnK,

7EP*,&@2&�MzY7	�,Pp�"KB4/)G��k��J:o�ip�s:!)!
 *"",505�0Z~NPX/��@C
D+#_��:�#@ BCR
D+%!!54?3c��r�����f��?��WKeB
]�9�#@ 
BC
D+7#54?[��_�����Y2T���Z4Tv����&1������&Qv{��7� 4�@

BK�PX@+YSCQC	S
DK�%PX@)YSCQC	S
DK�)PX@3YSCQC	Q
C	SD@1YSCQCQ
C		SDYYY@
1/%(%
+!!!!!#".54>32!4.#"32>7�l���%k��]�ߠYY�߇]��k%E��J��sr��KK��rs��J2��S��UNR�Y/f�
���h0Z�RM�=��XX�씕�WW��W��W�2FQa@^.
Bh

[
	SCSDHG43MLGQHQ><3F4F,*" 
	22+2#!32>32#"&'#".54>32>2>54.#""!4.�K�`7�l0Y|LCcE)JZe4��,*Ĕb�m::m�c��*E^x�ZR{R))R{RS|S))S|?HsR1W(Ie�<s�op�r:!)!
 4%����H��uu��I��BjL)�K=r�dc�s>>s�cd�r=n4^�RU�]1��W����&6��Y����&Vv���W����&6��Y����&V������&<
4��s��&=h��J:�&]v���s��&=k��J:�&]����s��&=k��J:�&]��v����#2@/YSCSD##""	+#543>7'&=37>3#"!{`Dl�X$3`N7
_��ض$5`N7
e��b�\+0 FpR

'���3FpR�G �(�@BkD* +#"/&'+73(A��C�U���� �(�
@BkD' +32?>;# C��A�U��

�����5%q5�� @WD
+".5332>53$B[9E(A00A)E9[�'DZ2%B22B%2ZD'��}�@SD($+#".54>32}    F!!xs��=K�'PX@WSD@[OSGY�$&($+4>32#".732654&#"x/?##?//?##?/:@32@@23@$<++<$$;,,;$2@@22@@����
+@(B@jSD+2#"&54>732>�
T/L^-81.(@2&�"KB"=6,
"-705&�*iQK�PX@WSD@[OSGY@
+2673#".#"#4>32�+,;%6"!;63*,=&6"";537/$?.!'!9-$?.!'!|���	#@ SD




	#++7>3!+7>3��*�R�/�
��
��
�.��s�\�BK�1PX@SCS
D@SC
CSDY@!$##	++#!#"&'7632325#5463s�_�,mi4
	���$�e��=nt	'��"
��f@MQE+!!���fG��f@MQE+!!���fG�!.��(+.5467�L=&2#!&K&N�;3d6;=n��(+'&547>54'&547�L=&2#�&K&N�;2e6:=n���(+7'&547>54'&547�L=&2#�&K&N�;2e6:=�!;�)�(+.5467.5467�L=&2#�L=&2#!&K&N�;3d6;=&K&N�;3d6;=n'�)�(+'&547>54'&547%'&547>54'&547�L=&2#JL=&2#�&K&N�;2e6:=&K&N�;2e6:=n�'�)�(+7'&547>54'&547%'&547>54'&547�L=&2#JL=&2#�&K&N�;2e6:=&K&N�;2e6:=������@BK�PX@CCSCDK�%PX@ZCCD@`ZCDYY@
#!""+463632>72!#"'!�M�S

R�N��

����

� ��

�������-�@&"	BK�PX@/
	

	`
	
[CCSCDK�%PX@-
	

	`Z
	
[CCD@/`
	

	`Z
	
[CDYY@+)('%#! !"#+7!!5463632>72!!#.'#"'"&5�|��M�S

R�N��}N�R

S�M�� �

� �B �

�1i|@OSG($+4>32#"..Pj<=lP..Pl=<jP.T=lQ..Ql=<iP..Pii����#5@SD(&(&($+74>32#"&%4>32#"&%4>32#"&i!""'5�!""'5�!""'5M""!5'""!5'""!5W��z�'0DXl�K@H[	[CSC
C
		S
D}{sqig_]US((%"&((($+#".54>324.#"32>>;+#".54>324.#"32>%#".54>324.#"32>�0Rl<>mP..Pm>>lQ/L#=Q--P<##<P--Q=#eC�
D�0Ql<>mP..Pm>>lQ.L#<Q--Q<##<Q--Q<# 0Ql<>mP..Pm>>lQ.L#<Q--Q<##<Q--Q<#3W�X--X�WX�Y--Y�XMnG!!GnMMmF!!Fm�
��PW�X--X�WX�Y--Y�XMoG!!GoMMmF  FmMW�X--X�WX�Y--Y�XMoG!!GoMMmF  Fm�����(+5���
	
�
z
��	��
�����(+7'&547>7.'&54?����	&

%	��
�6��	@C
D#"+'+>;k( 
*
d��o�N[@X;	Bh		h
[	[SC
S


DNMHGFEA?97$##%'$+3>32#".#"!#!!#!32>32#".'#53.547#�Z��n@m]Q%
"1CY:Z�qJZ���
Hp�Z>_H4$	
	%$TfxFq��T���_�ҒN,A+#%?z�v/2'|�~@%+%	#.K5N�ً;'10HH�#C@@
BhS	CS	D##!4%
+67>;#7+"'#32###5��	
9>��?9
	�W�G��
l���,��z*�E?��x;��;h}�71@.1BSCS
D76***+!>54.#"!"&=!5.54>32!#c`�r>V��ooŔV>q�`��b�yDe�뇇�eDx�b�kOw�g~�~??~�~g�wO��4�\��m�ؖOO�؉m��\�4{���.BC@@4Bh[SCSD0/:8/B0B#+(($+>32#".54>32>54&#"#"&'2>7.#"�$CCG(W�_2G�ԌQ�`5I��q5cVD��1K8%
MR�oO
+GeEb�k9(If=#H��~����6f�[rɖV9W;;5-��
�&G��y3cN/I�dKvR+�@BCR
D+3!7!&'^\M�
��*
��ySz!+&M���$@!QCD+##!##5�b��b��R�k��k�RW����&@#
BQCQD+!!!!547	&5W�����{�[��`�R����R$1.
�z��@MQE+!!�=���I(��"@Bj[
D*# +#"&=!267>;#5�:�
�:��O�
��.)%'�
�IJ
�';OL@IK-B[
	O
	SG=<)(GE<O=O31(;);	''+".'#".54>32>32%2>7.#"!2>54.#"�7\NCCN[79hO//Oh97[NCCN\79hO//Oh�F,KB;;BK,,M:!!:M�+M9!!9M+-KB;;BK(BW//VC(+PsGGrP+(CW..WC(+PrGGsP+N&@S--T@&:V78V::V87V:&@T--S@&����K�)*@'BSCSD!%)U$+>32#"&#"#"&'7>3232>7�
:Vo@'9
4XC-	�?]xE!A

"<`G/
>W�U+
+
 DgH��c�Z*	'	 GqQ����/d@a('B[[[	O	SG,*%# //

+267#".#"'>32267#".#"'>32
4Xd84ec`.7Wc<4fc_.4Xd84ec`.7Wc<4fc_*-:+/$,$-8-0$,$��-:+.$,$-8-/$,$���pkK�	PX@)^_	ZMQE@'jk	ZMQEY@

+!3!!!!#!5!7!��uGt��h��@vHv��Th�De��J�J��J��P�O!@	@MQE+!!��
��''%���v>����	?x��I�P�O!@
@MQE+5467>7.'.=!5!�
&&&��
���(��?>�I��f��"@
BMQE+3	#	>7	.'��B��nB��L		N��	
�@����@�S�������@CD+3#���k�a�BK�!PX@SCQC	
D@[SC	
DY@!$%!
+3'&=354>32#"&#"!#!nj�6g�_!G
+!��G`�{	'U\�g7
0
��R�<}����"�K�!PX@SCQC	
DK�1PX@[SC	
D@![CSC	
DYY@""A15!
+3'&=354>32;#.#"!!nj�4d�`"IE<H_6w0KvQ+ ��{	'AX�n>�nO/Y~NAG����R��
@jD


+2+:	 0["6M6
��	@ja		+2#"&'%t�G
���	
��2E�%@OSG&(($+#".54>32#".54632�

�

0!
�





!1
U5�q@MQE+!!U��aq<�J�	@ja	#++7>3J��
F����
	<�@Bja, +#"&/.'+73<I��J�Z{{�<�@Bja, +32>?>;#J�	�I�Z�{{�2��
(@%jOSG


+"&5332653$|v@R``R@v�pfGQQGbt�8{�@OSG($+#".54>32{  �}���!@[OSG$&($+4>32#".732654&#"}-="">-->""=-5@32@@23@^";**;"#:**:#2@@22@@*)�1@.[OSG
+2673#".#"#4>32�*,6"5"!<85*+8$4""<84P7+#;- % 8*"<- % j��	+@(OSG




	#++7>3!+7>3��/�
q�4���	��	���m�
@kD


+2+U	 3�#;U<.���U_<��ʓ^p�ӡ�6��z�	��V�6�:z/������V���Wgj��X�Xb {�m�n�d�i���I�������?�������x�������������!kl	�|����x��|��V��Y(������;{��;{��W�#��	����sX���Xk��IV�kD��XDW�X��K:���������7�:�:W.�DW�\Y�4:����#��JX?XXi��������C���UX��I'MU�jj����dMUI[�m�a�bI�:��6�I����Wj������S�*						7��|��������VV�VV'1��;{;{;{;{;{��;{��������������k�k�k�k�k�kIk�X�X�X�X�X�"������0Y:�:W:W:W:W:W�m:W:�:�:�:��.��	�k|�X���X��*:X9��:��{�W:W\YW\Y��s�J�s�J�s�J�vI I II5I�IxI�I&I|�.:�7����n�n���n�n�����`i�Wk�k��6��H�h�{TMTW��c(TJ��������������*lI�IIIUI�III2I�I}I*IjI�l�#`�	�V��B��V#��$�V&��*��2��4��97:7<?7D��F��G��H��R��T��m�Bo�By�B}�B��V��V��V��V��V��V��V��������������������������������������������������������������������������������V��������������B�B���B�B�B��V
	�V
�
�B
�
�V
#��
$�V
&��
*��
2��
4��
97
:7
<
?7
D��
F��
G��
H��
R��
T��
m�B
o�B
y�B
}�B
��V
��V
��V
��V
��V
��V
��V
���
���
���
���
���
���
���
�
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
�V
��
��
��
��
��
��
�
�B
�B
�
�
�B
�B
�B
��V#��&��*��2��4��F��G��H��R��T���������������������������������������������������������������������
	�V
�
�B
�
�V
#��
$�V
&��
*��
2��
4��
97
:7
<
?7
D��
F��
G��
H��
R��
T��
m�B
o�B
y�B
}�B
��V
��V
��V
��V
��V
��V
��V
���
���
���
���
���
���
���
�
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
�V
��
��
��
��
��
��
�
�B
�B
�
�
�B
�B
�B
��V�
�
��v#��&��*��2��4��7�L9�L:��<�y?�LY��Z��\��l�m�vo�vr�y�v|�}�v�����������������������y�����y�v�v�����v�v�v���B	��
�B
�B�v�v��$��7�L9��:��;��<�`=��?��l�Br�B|�B�����������������������`���`�������B�B�v�B�B�v��B����
�
��v#��&��*��2��4��7�L9�L:��<�y?�LY��Z��\��l�m�vo�vr�y�v|�}�v�����������������������y�����y�v�v�����v�v�v��7	��
7
7�G���G������"<#��$��&��*��-�o2��4��D��F��G��H��I��J�{P��Q��R��S��T��U��V��W��X��Y��[��\��]��l7m��o��r7tFuFw��y��{F|7}���������������������������������������������������������������������������������������������������������������������������������������7�7�G�7�7�G����7���#��#	��#
��#��#
��#��#��#��#$��#7��#9��#;��#<��#=��#?��#@��#`��#l��#r��#|��#���#���#���#���#���#���#���#���#��#��#��#��#��#��#��#��#��#��#��#���#���$�V$
�V$
�V$��$"��$#��$&��$*��$--$2��$4��$7��$8��$9��$:��$<�t$?��$Y��$\��$l�V$m��$o��$r�V$t�`$u�`$y��${�`$|�V$}��$���$���$���$���$���$���$���$���$���$���$���$��t$��$��$�t$��$��$�V$�V$�V$�V$��$��$��$��V&�e&m�e&o�e&y�e&}�e&�e&�e&�e&�e&�e'��'	��'
��'��'
��'��'��'��'$��'7��'9��';��'<��'=��'?��'@��'`��'l��'r��'|��'���'���'���'���'���'���'���'���'��'��'��'��'��'��'��'��'��'��'��'���'���)	��)�L)�L)��)��)��)")$��)-�.)F��)G��)H��)P��)Q��)R��)S��)T��)U��)X��)w��)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)��)��)��)��)��)�L)�L)���-	��-��-��-��-$��-���-���-���-���-���-���-���-��-��-��-���.��.#��.&��.*��.2��.4��.F��.G��.H��.I��.R��.T��.W��.Y��.Z��.\��.m��.o��.y��.}��.���.���.���.���.���.���.���.���.���.���.���.���.���.���.���.���.���.���.���.��.��.��.��.��.��.��.��.��.��/��/
��/
��/4/�$/4/"��/#��/&��/*��/2��/4��/7�[/9�V/:�y/<�=/?�V/F��/G��/H��/R��/T��/Y��/Z��/\��/l��/m�$/o�$/r��/t�B/u�B/y�$/{�B/|��/}�$/���/���/���/���/���/���/���/��=/���/���/���/���/���/���/���/���/���/���/���/���/��/��/��/��/��/�=/�$/�$/��/��/�4/��/��/�4/�$/�$/�$/���2��2	��2
��2��2
��2��2��2��2$��27��29��2;��2<��2=��2?��2@��2`��2l��2r��2|��2���2���2���2���2���2���2���2���2��2��2��2��2��2��2��2��2��2��2��2���2���3	��3�3�3��3$��3-�V3D��3F��3G��3H��3R��3T��3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3��3��3��3��3��3�3�3���4��4	��4
��4��4
��4��4��4��4$��47��49��4;��4<��4=��4?��4@��4`��4l��4r��4|��4���4���4���4���4���4���4���4���4��4��4��4��4��4��4��4��4��4��4��4���4���5#��5&��5*��52��54��57��58��5���5���5���5���5���5���5���5���5���5���5���5��5��7	��7�L7�L7�L7��7�`7�`7#��7$��7&��7*��7-�872��74��7D�7F�)7G�)7H�)7J�>7P�`7Q�`7R�)7S�`7T�)7U�`7V�D7X�`7Y�L7Z�t7[�g7\�L7]��7m�L7o�L7w�`7y�L7}�L7���7���7���7���7���7���7���7���7���7���7���7���7���7���7��7��7��7��7��7��7��7��)7��)7��)7��)7��)7��)7��`7��)7��)7��)7��)7��)7��)7��`7��`7��`7��`7��7�7��7�)7�)7�`7��7�)7�L7�L7�L7�L7�L7�L7�L7���8	��8��8��8��8$��8���8���8���8���8���8���8���8��8��8��8���979	��9
79
79�G9��9�G9��9��9��9"<9#��9$��9&��9*��9-�o92��94��9D��9F��9G��9H��9I��9J�{9P��9Q��9R��9S��9T��9U��9V��9W��9X��9Y��9[��9\��9]��9l79m��9o��9r79tF9uF9w��9y��9{F9|79}��9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9��9��9��9��9��9��9��9��9�9�9�79�79�G9�79�79�G9�9�9�9�79���:7:	��:
7:
7:��:��:��:��:"%:$��:-��:D��:F��:G��:H��:J��:R��:T��:V��:l7:m��:o��:r7:t7:u7:y��:{7:|7:}��:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:��:��:��:��:��:��:��:�7:�7:�:�7:�7:�:��:��:��:�7:���;��;#��;&��;*��;2��;4��;F��;G��;H��;I��;R��;T��;W��;Y��;Z��;\��;m��;o��;y��;}��;���;���;���;���;���;���;���;���;���;���;���;���;���;���;���;���;���;���;���;��;��;��;��;��;��;��;��;��;��<<	�t<
<
<�y<�`<�y<�t<��<��<"%<#��<$�t<&��<*��<-�8<2��<4��<D��<F�`<G�`<H�`<J�[<P��<Q��<R�`<S��<T�`<U��<V��<X��<Y��<Z��<[��<\��<l<m�`<o�`<r<t-<u-<w��<y�`<{-<|<}�`<��t<��t<��t<��t<��t<��t<��t<���<���<���<���<���<���<���<���<���<���<���<���<���<���<��`<��`<��`<��`<��`<��`<���<��`<��`<��`<��`<��`<��`<���<���<���<���<�t<��<��<�`<�`<��<��<�`<�`<�`<�<�<�y<�<�<�y<�`<�`<�`<�<��t=��="%=#��=&��=*��=2��=4��=F��=G��=H��=R��=T��=V��=Y��=\��=m��=o��=y��=}��=���=���=���=���=���=���=���=���=���=���=���=���=���=���=���=���=���=���=���=��=��=��=��=��=�=�=�=�=�>#��>&��>*��>2��>4��>F��>G��>H��>R��>T��>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>��>��>��>��>��?�V?
�V?
�V?��?"��?#��?&��?*��?--?2��?4��?7��?8��?9��?:��?<�t??��?Y��?\��?l�V?m��?o��?r�V?t�`?u�`?y��?{�`?|�V?}��?���?���?���?���?���?���?���?���?���?���?���?��t?��?��?�t?��?��?�V?�V?�V?�V?��?��?��?��VD��D
��D
��DY��DZ��D\��Dl��Dr��Dt��Du��D{��D|��D�D�D�D�D���E��E
��E��E
��E9��E:��E?��E@��EY��E[��E\��E`��El��Er��E|��E�E�E�E�E���H��H
��H��H
��H9��H:��H?��H@��HY��H[��H\��H`��Hl��Hr��H|��H�H�H�H�H���IKI
KI
KI�yI�yIlKIrKItdIudI{dI|KI�KI�KI�yI�KI�KI�yI�KK��K
��K
��KY��KZ��K\��Kl��Kr��Kt��Ku��K{��K|��K�K�K�K�K���NF��NG��NH��NR��NT��N���N���N���N���N���N���N���N���N���N���N���N���N��N��N��P��P
��P
��PY��PZ��P\��Pl��Pr��Pt��Pu��P{��P|��P�P�P�P�P���Q��Q
��Q
��QY��QZ��Q\��Ql��Qr��Qt��Qu��Q{��Q|��Q�Q�Q�Q�Q���R��R
��R��R
��R9��R:��R?��R@��RY��R[��R\��R`��Rl��Rr��R|��R�R�R�R�R���S��S
��S��S
��S9��S:��S?��S@��SY��S[��S\��S`��Sl��Sr��S|��S�S�S�S�S���U��U��UD��U���U���U���U���U���U���U���U��U�U�Y	��Y��Y��Y��Y$��YF��YG��YH��YR��YT��Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y��Y��Y��Y��Y�Y�Y���Z��Z��Z��Z��[F��[G��[H��[R��[T��[���[���[���[���[���[���[���[���[���[���[���[���[��[��[��\	��\��\��\��\$��\F��\G��\H��\R��\T��\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\��\��\��\��\�\�\���^#��^&��^*��^2��^4��^F��^G��^H��^R��^T��^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^��^��^��^��^��l	�Vl�l�Bl�l�Vl#��l$�Vl&��l*��l2��l4��l97l:7l<l?7lD��lF��lG��lH��lR��lT��lm�Blo�Bly�Bl}�Bl��Vl��Vl��Vl��Vl��Vl��Vl��Vl���l���l���l���l���l���l���l�l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l�Vl��l��l��l��l��l��l�l�Bl�Bl�l�l�Bl�Bl�Bl��Vm�Bm	��m
�Bm
�Bm�vm�vm��m$��m7�Lm9��m:��m;��m<�`m=��m?��ml�Bmr�Bm|�Bm���m���m���m���m���m���m���m��`m��m�`m��m��m��m�Bm�Bm�vm�Bm�Bm�vm��Bm���o�Bo	��o
�Bo
�Bo�vo�vo��o$��o7�Lo9��o:��o;��o<�`o=��o?��ol�Bor�Bo|�Bo���o���o���o���o���o���o���o��`o��o�`o��o��o��o�Bo�Bo�vo�Bo�Bo�vo��Bo���p��p	��p
��p��p
��p��p��p��p$��p7��p9��p;��p<��p=��p?��p@��p`��pl��pr��p|��p���p���p���p���p���p���p���p���p��p��p��p��p��p��p��p��p��p��p��p���p���r	�Vr�r�Br�r�Vr#��r$�Vr&��r*��r2��r4��r97r:7r<r?7rD��rF��rG��rH��rR��rT��rm�Bro�Bry�Br}�Br��Vr��Vr��Vr��Vr��Vr��Vr��Vr���r���r���r���r���r���r���r�r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r�Vr��r��r��r��r��r��r�r�Br�Br�r�r�Br�Br�Br��Vt	�`t�`t$�`t9Ft:Ft<(t?Ft��`t��`t��`t��`t��`t��`t��`t�(t�`t�(t��`u	�`u�`u$�`u9Fu:Fu<(u?Fu��`u��`u��`u��`u��`u��`u��`u�(u�`u�(u��`y�By	��y
�By
�By�vy�vy��y$��y7�Ly9��y:��y;��y<�`y=��y?��yl�Byr�By|�By���y���y���y���y���y���y���y��`y��y�`y��y��y��y�By�By�vy�By�By�vy��By���{	�`{�`{$�`{9F{:F{<({?F{��`{��`{��`{��`{��`{��`{��`{�({�`{�({��`|	�V|�|�B|�|�V|#��|$�V|&��|*��|2��|4��|97|:7|<|?7|D��|F��|G��|H��|R��|T��|m�B|o�B|y�B|}�B|��V|��V|��V|��V|��V|��V|��V|���|���|���|���|���|���|���|�|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|�V|��|��|��|��|��|��|�|�B|�B|�|�|�B|�B|�B|��V}�B}	��}
�B}
�B}�v}�v}��}$��}7�L}9��}:��};��}<�`}=��}?��}l�B}r�B}|�B}���}���}���}���}���}���}���}��`}��}�`}��}��}��}�B}�B}�v}�B}�B}�v}��B}�����V�
�V�
�V����"���#���&���*���--�2���4���7���8���9���:���<�t�?���Y���\���l�V�m���o���r�V�t�`�u�`�y���{�`�|�V�}�������������������������������������������������t��������t��������V��V��V��V������������V��V�
�V�
�V����"���#���&���*���--�2���4���7���8���9���:���<�t�?���Y���\���l�V�m���o���r�V�t�`�u�`�y���{�`�|�V�}�������������������������������������������������t��������t��������V��V��V��V������������V��V�
�V�
�V����"���#���&���*���--�2���4���7���8���9���:���<�t�?���Y���\���l�V�m���o���r�V�t�`�u�`�y���{�`�|�V�}�������������������������������������������������t��������t��������V��V��V��V������������V��V�
�V�
�V����"���#���&���*���--�2���4���7���8���9���:���<�t�?���Y���\���l�V�m���o���r�V�t�`�u�`�y���{�`�|�V�}�������������������������������������������������t��������t��������V��V��V��V������������V��V�
�V�
�V����"���#���&���*���--�2���4���7���8���9���:���<�t�?���Y���\���l�V�m���o���r�V�t�`�u�`�y���{�`�|�V�}�������������������������������������������������t��������t��������V��V��V��V������������V��V�
�V�
�V����"���#���&���*���--�2���4���7���8���9���:���<�t�?���Y���\���l�V�m���o���r�V�t�`�u�`�y���{�`�|�V�}�������������������������������������������������t��������t��������V��V��V��V������������V��e�m�e�o�e�y�e�}�e��e��e��e��e��e����	���
������
������������$���7���9���;���<���=���?���@���`���l���r���|�������������������������������������������������������������������������������	���
������
������������$���7���9���;���<���=���?���@���`���l���r���|�������������������������������������������������������������������������������	���
������
������������$���7���9���;���<���=���?���@���`���l���r���|�������������������������������������������������������������������������������	���
������
������������$���7���9���;���<���=���?���@���`���l���r���|�������������������������������������������������������������������������������	���
������
������������$���7���9���;���<���=���?���@���`���l���r���|�������������������������������������������������������������������������������	���
������
������������$���7���9���;���<���=���?���@���`���l���r���|����������������������������������������������������������������������������	������������$��������������������������������������������	������������$��������������������������������������������	������������$��������������������������������������������	������������$���������������������������������������������	�t�
�
��y��`��y��t�������"%�#���$�t�&���*���-�8�2���4���D���F�`�G�`�H�`�J�[�P���Q���R�`�S���T�`�U���V���X���Y���Z���[���\���l�m�`�o�`�r�t-�u-�w���y�`�{-�|�}�`���t���t���t���t���t���t���t�����������������������������������������������������������`���`���`���`���`���`�������`���`���`���`���`���`������������������t��������`��`��������`��`��`������y������y��`��`��`�����t����	���
������
������������$���7���9���;���<���=���?���@���`���l���r���|�������������������������������������������������������������������������������
���
���Y���Z���\���l���r���t���u���{���|������������������
���
���Y���Z���\���l���r���t���u���{���|������������������
���
���Y���Z���\���l���r���t���u���{���|������������������
���
���Y���Z���\���l���r���t���u���{���|������������������
���
���Y���Z���\���l���r���t���u���{���|������������������
���
���Y���Z���\���l���r���t���u���{���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
���
���Y���Z���\���l���r���t���u���{���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|����������������V�
�V�
�V����"���#���&���*���--�2���4���7���8���9���:���<�t�?���Y���\���l�V�m���o���r�V�t�`�u�`�y���{�`�|�V�}�������������������������������������������������t��������t��������V��V��V��V������������V����
���
���Y���Z���\���l���r���t���u���{���|����������������e�m�e�o�e�y�e�}�e��e��e��e��e��e����
������
���9���:���?���@���Y���[���\���`���l���r���|����������������t�
�t�
�t��o�9�j�:���<�y�?�j�Y���\���l�t�m�o�o�o�r�t�t���u���y�o�{���|�t�}�o���y��y��o��o��t��t��t��t��o��o��o���t����
���
���Y���Z���\���l���r���t���u���{���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|����������������	�t�
�
��y��`��y��t�������"%�#���$�t�&���*���-�8�2���4���D���F�`�G�`�H�`�J�[�P���Q���R�`�S���T�`�U���V���X���Y���Z���[���\���l�m�`�o�`�r�t-�u-�w���y�`�{-�|�}�`���t���t���t���t���t���t���t�����������������������������������������������������������`���`���`���`���`���`�������`���`���`���`���`���`������������������t��������`��`��������`��`��`������y������y��`��`��`�����t����"%�#���&���*���2���4���F���G���H���R���T���V���Y���\���m���o���y���}�����������������������������������������������������������������������������������������������������������"%�#���&���*���2���4���F���G���H���R���T���V���Y���\���m���o���y���}�����������������������������������������������������������������������������������������������������������"%�#���&���*���2���4���F���G���H���R���T���V���Y���\���m���o���y���}���������������������������������������������������������������������������������������������������������B�	���
�B�
�B��v��v����$���7�L�9���:���;���<�`�=���?���l�B�r�B�|�B�������������������������������`�����`�����������B��B��v��B��B��v���B������B�	���
�B�
�B��v��v����$���7�L�9���:���;���<�`�=���?���l�B�r�B�|�B�������������������������������`�����`�����������B��B��v��B��B��v���B�����	�V����B����V�#���$�V�&���*���2���4���97�:7�<�?7�D���F���G���H���R���T���m�B�o�B�y�B�}�B���V���V���V���V���V���V���V������������������������������������������������������������������������������������������������������������V����������������������B��B������B��B��B���V�	�V����B����V�#���$�V�&���*���2���4���97�:7�<�?7�D���F���G���H���R���T���m�B�o�B�y�B�}�B���V���V���V���V���V���V���V������������������������������������������������������������������������������������������������������������V����������������������B��B������B��B��B���V���
��
���v�#���&���*���2���4���7�L�9�L�:���<�y�?�L�Y���Z���\���l��m�v�o�v�r��y�v�|��}�v�������������������������������y��������y��v��v����������v��v��v����	�V����B����V�#���$�V�&���*���2���4���97�:7�<�?7�D���F���G���H���R���T���m�B�o�B�y�B�}�B���V���V���V���V���V���V���V������������������������������������������������������������������������������������������������������������V����������������������B��B������B��B��B���V�	�V����B����V�#���$�V�&���*���2���4���97�:7�<�?7�D���F���G���H���R���T���m�B�o�B�y�B�}�B���V���V���V���V���V���V���V������������������������������������������������������������������������������������������������������������V����������������������B��B������B��B��B���V���
��
���v�#���&���*���2���4���7�L�9�L�:���<�y�?�L�Y���Z���\���l��m�v�o�v�r��y�v�|��}�v�������������������������������y��������y��v��v����������v��v��v�����B�	���
�B�
�B��v��v����$���7�L�9���:���;���<�`�=���?���l�B�r�B�|�B�������������������������������`�����`�����������B��B��v��B��B��v���B������B�	���
�B�
�B��v��v����$���7�L�9���:���;���<�`�=���?���l�B�r�B�|�B�������������������������������`�����`�����������B��B��v��B��B��v���B������B�	���
�B�
�B��v��v����$���7�L�9���:���;���<�`�=���?���l�B�r�B�|�B�������������������������������`�����`�����������B��B��v��B��B��v���B�����	�V����B����V�#���$�V�&���*���2���4���97�:7�<�?7�D���F���G���H���R���T���m�B�o�B�y�B�}�B���V���V���V���V���V���V���V������������������������������������������������������������������������������������������������������������V����������������������B��B������B��B��B���V��V�
�V�
�V����"���#���&���*���--�2���4���7���8���9���:���<�t�?���Y���\���l�V�m���o���r�V�t�`�u�`�y���{�`�|�V�}�������������������������������������������������t��������t��������V��V��V��V������������V�����"��"��J��"<b��n�6�2�	(	z	�

,
R
�~����

�
�
�Zv��@~�F��F��Fr���*�z�T����T��V�`����P���r�NN���Jl 
 ^!B!�!�"$">##&#n#�$"$�$�%.%d%�%�&.&t&�'0'�))r)~)�)�)�)�)�**�*�*�*�*�*�*�*�++T+`+l+x+�+�+�+�,P,\,h,t,�,�,�-P-\-h-t-�-�-�.x///(/4/@/L/X/d/p/�0000&020>0�1111$101<1�1�22�2�2�3<3�3�4*4\4h4t5<5�5�5�6666(646@6L6X6d6�6�777D7n7�7�8R8�8�8�99>9d9�9�::V:�;t;�;�<�<�= =>=�>4>�??F?p?�?�?�@�@�A^A�A�B6BxB�B�CbC�C�C�DD.D\D�D�D�E$EhE�E��`"/n�	� ��
��(�
�(�
�0�%	%
�42(
�Z	6	J	^	Pl	�	P�	�	` 	�		�	
��	0
V	d
�	
�
�	4n	�	
�Copyright (c) 2010-2013 by tyPoland Lukasz Dziedzic with Reserved Font Name "Lato". Licensed under the SIL Open Font License, Version 1.1.Lato LightRegulartyPolandLukaszDziedzic: Lato Light: 2013Version 1.105; Western+Polish opensourceLato-LightLato is a trademark of tyPoland Lukasz Dziedzic.Lukasz DziedzicLato is a sanserif typeface family designed in the Summer 2010 by Warsaw-based designer Lukasz Dziedzic ("Lato" means "Summer" in Polish). It tries to carefully balance some potentially conflicting priorities: it should seem quite "transparent" when used in body text but would display some original traits when used in larger sizes. The classical proportions, particularly visible in the uppercase, give the letterforms familiar harmony and elegance. At the same time, its sleek sanserif look makes evident the fact that Lato was designed in 2010, even though it does not follow any current trend. The semi-rounded details of the letters give Lato a feeling of warmth, while the strong structure provides stability and seriousness.http://www.typoland.com/http://www.typoland.com/designers/Lukasz_Dziedzic/Copyright (c) 2013-2013 by tyPoland Lukasz Dziedzic (http://www.typoland.com/) with Reserved Font Name "Lato". Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL).http://scripts.sil.org/OFLCopyright (c) 2010-2013 by tyPoland Lukasz Dziedzic with Reserved Font Name "Lato". Licensed under the SIL Open Font License, Version 1.1.Lato LightRegulartyPolandLukaszDziedzic: Lato Light: 2013Lato-LightVersion 1.105; Western+Polish opensourceLato is a trademark of tyPoland Lukasz Dziedzic.Lukasz DziedzicLato is a sanserif typeface family designed in the Summer 2010 by Warsaw-based designer Lukasz Dziedzic ("Lato" means "Summer" in Polish). It tries to carefully balance some potentially conflicting priorities: it should seem quite "transparent" when used in body text but would display some original traits when used in larger sizes. The classical proportions, particularly visible in the uppercase, give the letterforms familiar harmony and elegance. At the same time, its sleek sanserif look makes evident the fact that Lato was designed in 2010, even though it does not follow any current trend. The semi-rounded details of the letters give Lato a feeling of warmth, while the strong structure provides stability and seriousness.http://www.typoland.com/http://www.typoland.com/designers/Lukasz_Dziedzic/Copyright (c) 2013-2013 by tyPoland Lukasz Dziedzic (http://www.typoland.com/) with Reserved Font Name "Lato". Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL).http://scripts.sil.org/OFLLatoLight�ZD	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a��������������������������������bc�d�e�������f����g�����h���jikmln�oqprsutvw�xzy{}|��~�������	
�����
����������������������������������������������� !"#NULLuni00A0uni00ADmacronperiodcenteredAogonekaogonekEogonekeogonekNacutenacuteSacutesacuteZacutezacute
Zdotaccent
zdotaccentuni02C9EuroDeltauni2669undercommaaccent
grave.case
dieresis.casemacron.case
acute.casecircumflex.case
caron.case
breve.casedotaccent.case	ring.case
tilde.casehungarumlaut.case
caron.salt��bKbK�������V��������V�,� `f-�, d ��P�&Z�E[X!#!�X �PPX!�@Y �8PX!�8YY �Ead�(PX!�E �0PX!�0Y ��PX f ��a �
PX` � PX!�
` �6PX!�6``YYY�+YY#�PXeYY-�, E �%ad �CPX�#B�#B!!Y�`-�,#!#! d�bB �#B�*! �C � ��+�0%�QX`PaRYX#Y! �@SX�+!�@Y#�PXeY-�,�C+�C`B-�,�#B# �#Ba��b�`�*-�,  E �Ec�Eb`D�`-�,  E �+#�%` E�#a d � PX!��0PX� �@YY#�PXeY�%#aDD�`-�,�E�aD-�	,�`  �	CJ�PX �	#BY�
CJ�RX �
#BY-�
, �b �c�#a�C` �` �#B#-�,KTX�DY$�
e#x-�,KQXKSX�DY!Y$�e#x-�
,�CUX�C�aB�
+Y�C�%B�	%B�
%B�# �%PX�C`�%B�� �#a�	*!#�a �#a�	*!�C`�%B�%a�	*!Y�	CG�
CG`��b �Ec�Eb`�#D�C�>�C`B-�,�ETX�#B `�a�

BB�`�
+�m+"Y-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�	+-�,�+�ETX�#B `�a�

BB�`�
+�m+"Y-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-� ,�+-�!,�+-�",�+-�#,�	+-�$, <�`-�%, `�
` C#�`C�%a�`�$*!-�&,�%+�%*-�',  G  �Ec�Eb`#a8# �UX G  �Ec�Eb`#a8!Y-�(,�ETX��'*�0"Y-�),�+�ETX��'*�0"Y-�*, 5�`-�+,�Ec�Eb�+�Ec�Eb�+��D>#8�**-�,, < G �Ec�Eb`�Ca8-�-,.<-�., < G �Ec�Eb`�Ca�Cc8-�/,�% . G�#B�%I��G#G#a Xb!Y�#B�.*-�0,��%�%G#G#a�E+e�.#  <�8-�1,��%�% .G#G#a �#B�E+ �`PX �@QX�  �&YBB# �C �#G#G#a#F`�C��b` �+ ��a �C`d#�CadPX�Ca�C`Y�%��ba#  �&#Fa8#�CF�%�CG#G#a` �C��b`# �+#�C`�+�%a�%��b�&a �%`d#�%`dPX!#!Y#  �&#Fa8Y-�2,�   �& .G#G#a#<8-�3,� �#B   F#G�+#a8-�4,��%�%G#G#a�TX. <#!�%�%G#G#a �%�%G#G#a�%�%I�%a�Ec# Xb!Yc�Eb`#.#  <�8#!Y-�5,� �C .G#G#a `� `f��b#  <�8-�6,# .F�%FRX <Y.�&+-�7,# .F�%FPX <Y.�&+-�8,# .F�%FRX <Y# .F�%FPX <Y.�&+-�9,�0+# .F�%FRX <Y.�&+-�:,�1+�  <�#B�8# .F�%FRX <Y.�&+�C.�&+-�;,��%�& .G#G#a�E+# < .#8�&+-�<,�%B��%�% .G#G#a �#B�E+ �`PX �@QX�  �&YBB# G�C��b` �+ ��a �C`d#�CadPX�Ca�C`Y�%��ba�%Fa8# <#8!  F#G�+#a8!Y�&+-�=,�0+.�&+-�>,�1+!#  <�#B#8�&+�C.�&+-�?,� G�#B�.�,*-�@,� G�#B�.�,*-�A,��-*-�B,�/*-�C,�E# . F�#a8�&+-�D,�#B�C+-�E,�<+-�F,�<+-�G,�<+-�H,�<+-�I,�=+-�J,�=+-�K,�=+-�L,�=+-�M,�9+-�N,�9+-�O,�9+-�P,�9+-�Q,�;+-�R,�;+-�S,�;+-�T,�;+-�U,�>+-�V,�>+-�W,�>+-�X,�>+-�Y,�:+-�Z,�:+-�[,�:+-�\,�:+-�],�2+.�&+-�^,�2+�6+-�_,�2+�7+-�`,��2+�8+-�a,�3+.�&+-�b,�3+�6+-�c,�3+�7+-�d,�3+�8+-�e,�4+.�&+-�f,�4+�6+-�g,�4+�7+-�h,�4+�8+-�i,�5+.�&+-�j,�5+�6+-�k,�5+�7+-�l,�5+�8+-�m,+�e�$Px�0-K�KRX��Y�c �#D�#p�E  �(`f �UX�%a�Ec#b�#D�*�*�*Y�(	ERD�*�D�$�QX�@�X�D�&�QX��X�DYYYY������DPK}$[䍒�TtTtXgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/fonts/Lato-RegularItalic.ttfnu�[��� DSIGtLGPOS�,HPGSUBV.TI|OS/2ٮ��J�`cmapRԟ�J��cvt '�i�8fpgm�zAj4	�gaspi�glyfmr��O��>head��d��6hhea�`�L$hmtx4W��pTkern@�B���g�loca�E�/R�,maxpC
�T� name��UTpost:�]fX�prep�x9�s��
0JDFLTlatn����kernkernGr�����T��v		�

����
V
��8�,^$^�0��
D��J��J���J�L F �!z"##P#�$4$~%x&&�'�(�)�*�+�+�,J,�-n..�/$/V/�/�/�1�242n2�2�33V3�3�44J4�4�4�5�5�6�7�7�7�8~8�8�:�;";�;�<�=2>,?&?�@�A�B�C8C�D�E.F(>	�U�������U$�U96:0<-?6D��F��G��H��R��T��m��o��y��}����U��U��U��U��U��U��U�-����������������������������������������������������������U���������-����������U>	�U�������U$�U96:0<-?6D��F��G��H��R��T��m��o��y��}����U��U��U��U��U��U��U�-����������������������������������������������������������U���������-����������U-#��&��*��2��4��D��F��G��H��R��T��k��p��������������������������������������������������������������������������������������������>	�U�������U$�U96:0<-?6D��F��G��H��R��T��m��o��y��}����U��U��U��U��U��U��U�-����������������������������������������������������������U���������-����������U0��
��
���;#��&��*��2��4��7�59�,:�|<�;?�,Y�rZ��\�|k��l��m�;o�;p��r��y�;|��}�;�����������������������;��r��r�����;�;�;�����;�;�;&��	��
��
���^�^��$��7�A9��;��<�@=��?��l��r��|�������������������������@���@���������^���^�^���0��
��
���;#��&��*��2��4��7�59�,:�|<�;?�,Y�rZ��\�|k��l��m�;o�;p��r��y�;|��}�;�����������������������;��r��r�����;�;�;�����;�;�;q6	��
6
6�A���A������":#��$��&��*��-�i2��4��D��F��G��H��P��Q��R��S��T��U��V��X��Y��Z��\��]��k��l6m��o��p��r6tPuPw��y��{P|6}�������������������������������������������������������������������������������������������������������������������������������������������������������6�6�A�6�6�A��A�����$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������:�J
�J
�J��#��&��*��->2��4��7�|8��9��:��<�h?��W��Y��Z��\��k��l�Jm��o��p��r�Jt�Iu�Iy��{�I|�J}�������������������������������������h�����������h�����J�J�J�J������
��m��o��y��}�������$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������>	�|�L�L�|����"$�|-�:D��F��G��H��P��Q��R��S��T��U��X��w����|��|��|��|��|��|��|�������������������������������������������������������������������������|�����������L�L�L��|	����$����������������������������+

��#��&��*��2��4��I��W��Y��Z��\��k��lm��o��p��ry��|}������������������������������������������3��
��
���;#��&��*��2��4��7�89�J:�h<�,?�JY�|Z��\�|k��l��m�;o�;p��r��t�,u�,y�;{�,|��}�;�����������������������,��|��|�����,�;�;�����;�;�;$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������/	�v�C�C�v$�v-�JD��F��G��H��R��T����v��v��v��v��v��v��v����������������������������������������������������������v���������C�C�C��v$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������#��&��*��2��4��7��8��k��p���������������������������������������f	�|�L�L�L�|�f�f"'#��$�|&��*��-�82��4��D�/F�/G�/H�/J�EP�fQ�fR�/S�fT�/U�fV�JX�fY�WZ�[�Z\�L]�_k��m�Lo�Lp��w�fy�L}�L��|��|��|��|��|��|��|�����������������������/��/��/��/��/��/��/��/��/��/��/��/��/��f��/��/��/��/��/��/��f��f��f��f��W��W�|�/���/�/�f���/�J�J�_�_�_�L�L�L�L�L�L�L�L��|	����$����������������������������q6	��
6
6�A���A������":#��$��&��*��-�i2��4��D��F��G��H��P��Q��R��S��T��U��V��X��Y��Z��\��]��k��l6m��o��p��r6tPuPw��y��{P|6}�������������������������������������������������������������������������������������������������������������������������������������������������������6�6�A�6�6�A��A�����N:	��
:
:����������$��-��D��F��G��H��J��P��Q��R��S��T��U��V��X��l:r:t<u<w��{<|:��������������������������������������������������������������������������������������������������������������:�:��:�:�����+

��#��&��*��2��4��I��W��Y��Z��\��k��lm��o��p��ry��|}������������������������������������������m7	�r
7
7�'�J�'�r����"2#��$�r&��*��-�82��4��D�AF�AG�AH�AJ�WP��Q��R�AS��T�AU��V�AX��]��k��l7m�Jo�Jp��r7t>u>w��y�J{>|7}�J��r��r��r��r��r��r��r�����������������������A��A��A��A��A��A��A��A��A��A��A��A��A�����A��A��A��A��A��A�������������r�A���A�A�����A�A�A�������J�J�7�7�'�7�7�'�J�'�J�J��r��"##��&��*��2��4��k��m��o��p��y��}��������������������������������-#��&��*��2��4��D��F��G��H��R��T��k��p��������������������������������������������������������������������������������������������:�J
�J
�J��#��&��*��->2��4��7�|8��9��:��<�h?��W��Y��Z��\��k��l�Jm��o��p��r�Jt�Iu�Iy��{�I|�J}�������������������������������������h�����������h�����J�J�J�J��������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|������E
E
E��lErEtdud{d|E�E�E��E�E����
��
��Y��\��l��r��t��u��{��|����������������D��F��G��H��R��T���������������������������������������������������������������������
��
��Y��\��l��r��t��u��{��|������������������
��
��Y��\��l��r��t��u��{��|������������������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|������"�h�hD��F��G��H��R��T��������������������������������������������������������������������h�h�h.	���r�r��$��D��F��G��H��R��T�������������������������������������������������������������������������������������������r�r�r���	��������$�������������������������������D��F��G��H��R��T�������������������������������������������������������������������.	���h�h��$��D��F��G��H��R��T�������������������������������������������������������������������������������������������h�h�h���-#��&��*��2��4��D��F��G��H��R��T��k��p��������������������������������������������������������������������������������������������$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������>	�U�������U$�U96:0<-?6D��F��G��H��R��T��m��o��y��}����U��U��U��U��U��U��U�-����������������������������������������������������������U���������-����������U&��	��
��
���^�^��$��7�A9��;��<�@=��?��l��r��|�������������������������@���@���������^���^�^���&��	��
��
���^�^��$��7�A9��;��<�@=��?��l��r��|�������������������������@���@���������^���^�^���$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������>	�U�������U$�U96:0<-?6D��F��G��H��R��T��m��o��y��}����U��U��U��U��U��U��U�-����������������������������������������������������������U���������-����������U	�T�T$�T9:::<(?:��T��T��T��T��T��T��T�(�T�(��T	�T�T$�T9:::<(?:��T��T��T��T��T��T��T�(�T�(��T&��	��
��
���^�^��$��7�A9��;��<�@=��?��l��r��|�������������������������@���@���������^���^�^���	�T�T$�T9:::<(?:��T��T��T��T��T��T��T�(�T�(��T>	�U�������U$�U96:0<-?6D��F��G��H��R��T��m��o��y��}����U��U��U��U��U��U��U�-����������������������������������������������������������U���������-����������U&��	��
��
���^�^��$��7�A9��;��<�@=��?��l��r��|�������������������������@���@���������^���^�^���:�J
�J
�J��#��&��*��->2��4��7�|8��9��:��<�h?��W��Y��Z��\��k��l�Jm��o��p��r�Jt�Iu�Iy��{�I|�J}�������������������������������������h�����������h�����J�J�J�J������:�J
�J
�J��#��&��*��->2��4��7�|8��9��:��<�h?��W��Y��Z��\��k��l�Jm��o��p��r�Jt�Iu�Iy��{�I|�J}�������������������������������������h�����������h�����J�J�J�J������:�J
�J
�J��#��&��*��->2��4��7�|8��9��:��<�h?��W��Y��Z��\��k��l�Jm��o��p��r�Jt�Iu�Iy��{�I|�J}�������������������������������������h�����������h�����J�J�J�J������:�J
�J
�J��#��&��*��->2��4��7�|8��9��:��<�h?��W��Y��Z��\��k��l�Jm��o��p��r�Jt�Iu�Iy��{�I|�J}�������������������������������������h�����������h�����J�J�J�J������:�J
�J
�J��#��&��*��->2��4��7�|8��9��:��<�h?��W��Y��Z��\��k��l�Jm��o��p��r�Jt�Iu�Iy��{�I|�J}�������������������������������������h�����������h�����J�J�J�J������:�J
�J
�J��#��&��*��->2��4��7�|8��9��:��<�h?��W��Y��Z��\��k��l�Jm��o��p��r�Jt�Iu�Iy��{�I|�J}�������������������������������������h�����������h�����J�J�J�J������
��m��o��y��}�������$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������	����$����������������������������	����$����������������������������	����$����������������������������	����$����������������������������m7	�r
7
7�'�J�'�r����"2#��$�r&��*��-�82��4��D�AF�AG�AH�AJ�WP��Q��R�AS��T�AU��V�AX��]��k��l7m�Jo�Jp��r7t>u>w��y�J{>|7}�J��r��r��r��r��r��r��r�����������������������A��A��A��A��A��A��A��A��A��A��A��A��A�����A��A��A��A��A��A�������������r�A���A�A�����A�A�A�������J�J�7�7�'�7�7�'�J�'�J�J��r$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�������������������������������������������������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|��������
��
��Y��\��l��r��t��u��{��|������������������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|������.	���r�r��$��D��F��G��H��R��T�������������������������������������������������������������������������������������������r�r�r�����
����
��@��[��`��l��r��|������.	���r�r��$��D��F��G��H��R��T�������������������������������������������������������������������������������������������r�r�r���:�J
�J
�J��#��&��*��->2��4��7�|8��9��:��<�h?��W��Y��Z��\��k��l�Jm��o��p��r�Jt�Iu�Iy��{�I|�J}�������������������������������������h�����������h�����J�J�J�J������
��m��o��y��}���������
����
��@��[��`��l��r��|������"�i
�i
�i��9�^:��<�h?�^Y��Z��\��l�im��o��r�it�}u�}y��{�}|�i}����h�������h���i�i�i�i�����
��
��Y��\��l��r��t��u��{��|������������������
����
��@��[��`��l��r��|������m7	�r
7
7�'�J�'�r����"2#��$�r&��*��-�82��4��D�AF�AG�AH�AJ�WP��Q��R�AS��T�AU��V�AX��]��k��l7m�Jo�Jp��r7t>u>w��y�J{>|7}�J��r��r��r��r��r��r��r�����������������������A��A��A��A��A��A��A��A��A��A��A��A��A�����A��A��A��A��A��A�������������r�A���A�A�����A�A�A�������J�J�7�7�'�7�7�'�J�'�J�J��r��"##��&��*��2��4��k��m��o��p��y��}����������������������������������"##��&��*��2��4��k��m��o��p��y��}����������������������������������"##��&��*��2��4��k��m��o��p��y��}��������������������������������&��	��
��
���^�^��$��7�A9��;��<�@=��?��l��r��|�������������������������@���@���������^���^�^���&��	��
��
���^�^��$��7�A9��;��<�@=��?��l��r��|�������������������������@���@���������^���^�^���>	�U�������U$�U96:0<-?6D��F��G��H��R��T��m��o��y��}����U��U��U��U��U��U��U�-����������������������������������������������������������U���������-����������U>	�U�������U$�U96:0<-?6D��F��G��H��R��T��m��o��y��}����U��U��U��U��U��U��U�-����������������������������������������������������������U���������-����������U0��
��
���;#��&��*��2��4��7�59�,:�|<�;?�,Y�rZ��\�|k��l��m�;o�;p��r��y�;|��}�;�����������������������;��r��r�����;�;�;�����;�;�;>	�U�������U$�U96:0<-?6D��F��G��H��R��T��m��o��y��}����U��U��U��U��U��U��U�-����������������������������������������������������������U���������-����������U>	�U�������U$�U96:0<-?6D��F��G��H��R��T��m��o��y��}����U��U��U��U��U��U��U�-����������������������������������������������������������U���������-����������U0��
��
���;#��&��*��2��4��7�59�,:�|<�;?�,Y�rZ��\�|k��l��m�;o�;p��r��y�;|��}�;�����������������������;��r��r�����;�;�;�����;�;�;&��	��
��
���^�^��$��7�A9��;��<�@=��?��l��r��|�������������������������@���@���������^���^�^���0��
��
���;#��&��*��2��4��7�59�,:�|<�;?�,Y�rZ��\�|k��l��m�;o�;p��r��y�;|��}�;�����������������������;��r��r�����;�;�;�����;�;�;&��	��
��
���^�^��$��7�A9��;��<�@=��?��l��r��|�������������������������@���@���������^���^�^���&��	��
��
���^�^��$��7�A9��;��<�@=��?��l��r��|�������������������������@���@���������^���^�^���>	�U�������U$�U96:0<-?6D��F��G��H��R��T��m��o��y��}����U��U��U��U��U��U��U�-����������������������������������������������������������U���������-����������U:�J
�J
�J��#��&��*��->2��4��7�|8��9��:��<�h?��W��Y��Z��\��k��l�Jm��o��p��r�Jt�Iu�Iy��{�I|�J}�������������������������������������h�����������h�����J�J�J�J������r

#$&')-./2345789:;<=>?EHIKNPQRSUYZ[\^klmoprtuy{|}����������������������������������������������������������
8�DFLTlatn����case&case,liga2liga8sups>supsD,>B	

@LO,{tuCjqv�������I��xx�t���P`KtyPL�J�z��� ��� �&
	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a���������������������������������rdei�x�pk�vj���sgw�����l|����cn���m}�b�������������������y���������������������q���z���`T@
~�1DS[a~�����    " & 0 : D �!"!&"""""""+"H"`"e%�&i���
 �1ARZ`x�����      & 0 9 D �!"!&"""""""+"H"`"d%�&i����������������{�u�q�[�H����$��������������I�����������������޸ޡޞ�:ڜ`T@
~�1DS[a~�����    " & 0 : D �!"!&"""""""+"H"`"e%�&i���
 �1ARZ`x�����      & 0 9 D �!"!&"""""""+"H"`"d%�&i����������������{�u�q�[�H����$��������������I�����������������޸ޡޞ�:ڜ-��(8<@J@GBhf[[		QCQ
D@?($#-$
+>32#'.54>54&#"#"'4632#"&!!7!!�9DO.?gI)-60#z
-5-I9)8(c>0((0>���22c��u&#@[87P;+&%ia/(&.8'3<��/@)(?��g6,����
!&@#QCSD

+#>74>32#".FuF�!-."".-!���-UV\44\VU->��."".-""-����
*@'	BQD

$+#"&=!#"&=�$"%�$"%��ߛ""�!�ߛ""�!6��<@H@E
Y	CQ
C
D@?>=<<6431.-(&##!#!+#"&547#+#"546?3#7>;>;3323+32%3#�Nq�t0M��+�j�'&�v
-N���Mv�&%�j����j���X]��#�(
7KGk �X�	��G��
7KG�bf8CN�@J)?BAK�	PX@$jhfkCDK�
PX@$jhfkCD@$jhfkCDYY�#'#%+.'7632.54>?>;#".'+4.'>�w�?=+A\Dg>w]9B|�o@&g�30%6I2]@~c>F��u"@�":N,`JsP)�5H)WHkG"aKN&1/1KoRS�xL��Q;@"!�2IlO_��S��,A0#�2Oh�*?1%�-DUZ����'1EY�K�PX@'[	[SC		S
DK� PX@+[	[SC
C		SD@/[	[CSC
C		SDYY@
VT((%#&((($
+#".54>324.#"32>>;+#".54>324.#"32>�;`{A8^C%6]}F8^C&�$1(G4$1'G5w|��
~:`|A8]C%6]}F8]D%�$1(G5$1'G6xc�j7)MoFc�k8)NpH2H."JsQ1E-!GqU��
�c�i7)MnFc�l8)NpH2G."JrQ1F-!Hr9����BN�@;LK.&BK�PX@*hSCS
CS
D@(hSCS
CSDY@IG20)'#!
BB+2#"'.#">7>;#"./#".54>7.54>3267�FrR-e)<)3R; /2B)6w[G�`^�R�b65]}H'%9i��q#=T1_�F��sr�,Nj>!8-&C[49x?�gB�Gs�`��zWf1[�QO�u\ B�?R�j>��8W<VF�>�����
@	BQD

$+#"&=�$"%��ߛ""�!z��S
�(+.547*Q*;& U�uGJrN)�J���C.V���S�	�/r�������
�(+4.'&546?
'.547>9)R);& T�uFIsN)1I���C/W���T������.r��a��6C@0,+'$#	BK�PX@kD@
jaY@
66+7>7'767&/7&546?3>?'.'i�!�$$$�3�T
	� �# �2�a�!

dIefIe��!
dIefHd
�s�A�.@+jkMRF+!!#!7!�5��f5�5�i�6��S��Q���2��$�@
?S
D"+74632'&54>7#"&2A6.1F-
 *'4A{/B'3-a_Z&&5E*Ea<�@MQE+!!s��8��-��'�@SD($+74>32#".-"--""--"n."".-""-����.�	@kD#"++>;]:I�4 I "�!O��j�',@)SCSD''	+2#".54>2>54.#"�_�sAb��~`�sAb�� T�qB-Le8T�qB-Le�I�ے���kI�ۓ�J�k��Y��x�j0Y���x�i0���*@'
BhCR
D$+7!7#"&/3!!�6{��,֌����M�
Kq��/J�4;@80BhSCQ
D-+'%
44+2>3!2!7>7>54.#"#"&/>�S�f99b�J�Q)R&��HIrO)#>U2p�%#Wc���/Z�R[��~C�x
"5;)�AusxE6R6ufb�f4]��X�CU@R?
Bhh[SCSD<:64.-,+#!CC	+2#".'763232>54.#7>54.#"#"&/>�T�b6*MmCz{V��jd�jBP,B\AR�W.N�f��">T2r�&#Xc���.UxIOyZ;#�pl�{B.\�_:W:8Zr;0Q;"{��5P5veb�f4-f�'@$
B\C
D!#+3+#!"&/3>7!���.�/��"+����b��{W���7�9D��F�.@@=,+Bh[QCSD(#&(""+#!632#".'763232>54.#"'!<37�9so\i�i4]��u?p_N=/C_CS�d7$HnK2sDg��M$/�9d�Q~͐O)6J%8e�V9]C$�h��0�22@/B[CSD/-%#	+2#".54>7>;>32>54.#"�O�e:T��vb�l99W<�3��.%7���$Dd@O�a6'Ge>O�^5l2`�Wo��P<n�_>wy}E���3,$)�!;cH(5^�L=cE%8_~���$@!BQC
D$'++>7!"&=7�
	�'����D-�+�)uR��>�3GD@AB[SCSD54! ?=4G5G+) 3!3	+".5467.54>32'2>54.#"2>54.#"c�r>��aaH�iZ�e6��t|Q��cN~Z0-Lc5Bz_9$Fd�QqG :X;HoL'9Y3^�Q��)&�bX�q@4[{F��-#�ui�w?�.RtF@Z9$LwS5W?#�4Sf3-N;"-Lh:+P=%�w�12@/B[SC
D.,&$	+".54>32+>74.#"32>5K�`7R��p^�h8;T6�c0��.=�P%D_:I{Z3�xO~Y0M0\�Ti��N;j�XH}vvB�<6-/�:_D%2Y{Ju�5Zv-����';K�$PX@SCSD@[SDY�((($+74>32#".4>32#".-"--""--"d"--""--"n."".-""-	."".-""-.����,D�
?K�$PX@SCS
D@[S
DY@	)'"+74632'&54>7#"&4>32#"..A6.1F-
 *'4Ai"--""--"{/B'3-a_Z&&5E*E."".-""-���W�(+�6�#/+��-��
�
�'0����!@YMQE+!!!!�Z��:X��=�Ѓ}��X�(+	7>7%>7.'%.54>7����/+�Z�|�o
�
�'0�n����%95@2BhfSCSD(&#*$+>32#7>54&#"#"'4>32#".�!KWc8FqP*/HWO=
%w5LWI1_Q8R;'

!-."".-!4(*Je;TvW?;@+��0JA>H[=NZ$��."".-""-M��MTdf@c
[
<Bh[

[	[OSGVU^\UdVdLJ@>9731)'TT
+%"&'#".54>3232>54.#"3267>32#".54>32%2>7&#"FR?�H0G. ?[w�T?[)�!3aK.Dz�e��lP��v��Lk�����_<k���muϛZEv��1<:8k#)I�a92�JMPE#<R0<~uhN-��4L#F�it�v<u�્ړL>03HR_����ɥu@O�؊םYu3WC(	Gr�I9H����
$@!BZC
D# +!#"&'!+3!.'��N���	%����>�
^����zQB&&Cae�*=@:B[SCS
D*(" !+3!2#!2>54&#%32>54&+a��p�h2%JoJ��G��y�?OxP(�����QyQ(|���-SwI@tbL�pc�xB��*NnE_q�+MlAggd����/D@ABhfSCSD'%" 
//+%2>32#".546$32#".#"�BfN7)	A^���̍Kt��L|fS$@(EmWtʔU:g�� ' Qfq\�䉻6�{2F+N

(/(]���o�{Ba=�@SCS
D!(!$+#!!24.#!!2>=q����ՔP�7g�]�Ό2xƎO1����v�Z��l�yA��[��aA�(@%YQCQ
D+!!!!!!.��<��=u�ϱ/�����aA�	"@YQC
D+!!!#!.��?��L��/�����d��%�:G@D&
Bh[SCSD20+)" ::+%2>7#"&50>17!#".546$32#"'.#"�4ZOI$'�	�C6s��R�ӖQs��S�nY%<
5KjK{͓R;l��D

O��':']�芹3�z2D(N


)%^���q�~CaE� @ZC
D+!#!#3!3��Q�EP���O�O���r��}����@C
D+!#3=���������QK�PX�B�BYK�PX@CSD@hCSDY�#%"+#"&'7>3232>73���6^0
!+4\J3u���m"N~\�r%� &@#
B\C
D'(% +3267>;#".'.+#3�B#-�,���%#����'+QQ���" ��	
#�Y
	<�n�af�@CR
D+%!!3/7������av�"&@#BhC
D!6(+67>;#>7+"'#3243����	��/.������[�'*'�	�g#.�~++�.���	�{aE�@BC
D!+2>73#"&'#3rj���^�����`���)�gH���d����)@SCSD(((&+#".546$324.#"32>�4_���k�ӕOr���ӕO�8g�]vƎP8g�]xƎO2zڹ�h8^�扷3�|_��m�|D_���m�|C^��ri�/@,[SC
D
!+#!2#32>54.#nB���r�m6J�υtJ�U�X."DhE���6d�Vq��M�4]�L:\A#d����0P�BK�PX@SCSCD@kSCSDY�(((%&+#"&'#".546$324.#"32>�3^�R!�"5�6q<�ӕOr���ӕO�8g�]vƎP8g�]xƎO2yظ�4�w^�扷3�|_��m�|D_���m�|C^��rU�#7@4B[SC
D#",!+#!2#"'.#32>54&#vJ��yr�m54b�W 5�1��
"%/D�U�Y-��Y���0YNW�wS&��(���0WwGms����==@:=BhfSCSD;9(&#!#"+#".#"#"&'7>3232>54.54>32�&;T?@dE$0NeheN0F��t��AB,DdKEoM*0NcicN0@x�ln�9�#)#(E\54G3')2JhJf��PeVY-7-,NmB7I2%&0JlOX�|JTI{�� @QC
D+!#!7��Y����W��������$�#@ CSD+%2>73#".5473vP�eAk�jc��{o�w>j�k'Ko�>m�Zi��{ӛXH��j-/i��&K|Z1|W�@BC
D, +32>7>;#|���%��7��� M**L!�g���,!@'
BC
D,> +32>7>;2>7>;#.'#���
�$+�

�'�����
�/���
( <��
:  :��gO&&������@BC
D'"(!+	3267>;	#"&'+�	
l��z���
�Q$�������l��
q
��$y��@BC
D,"+#32>7>;�G�G����
}!�=��;^��44>��$@!QCQ
D+!!7>7!7�	����"	l�7�<�l�;��!��W�'@$[OQE!#+!+32!�W�ř��C��	l��q�	@kD# +32#"&'lI +iH2�"�9" ���)�'@$
B[OQE!#+!!7>;#"&57�X�	����C80��@
BkD+!+3#"&'.'+>rg��
����z`+,+��������X@MQE+!7��+�ttM���	@kD		+2#"&'�
kc���0���+^@ BK�"PX@SCS
D@SC
CSDY@
$!++*' +!#"&57#".54>322>7.#"0\#$S]f7<bE&-St��ZA{<��1^TI++<pbP9 $�@hI(/[�VZ��]3��=l�Y\'Fat�E�O����,�K�"PX@ B@ BYK�	PX@CSCTDK�"PX@CSCTD@!CSC
CTDYY@$",,(%+33>32#"&'#"32>54&O��X&X`h6��"?Ym�FQ�*
�0b[P &j74\L<)V��4=eF'��R���_6D?Au<j�W��6-,Kes{<w|<��b/d�BK�	PX@$hfSCSD@$hfSCSDY�%(#%($+%#".54>32#".#"32>3234]^e:X�[/M��rd�38+A3E{\58Q6-F6)!,�9L-<m�\{�hGDC
K��f>eG'!65���*s@ BK�"PX@CSCS
D@!CSC
CSDY@$"**
+!"&57#"&54>323%2>7.#"�#&Zck7��"?Ym�FJ{+E���90a[O!&j6OY0V$�AjK)��R���^6:6-�?�;i�V5,^��Yw};��q*9b@
0BK�	PX@hSCSD@hSCSDY@,++9,9*&%*+32>32#".54>32%">54.q6���uv0K;-& ,3afo@W�`4!?[u�QMpH#��?jR:��d #8BoYB��#75K2:k�^N��xW2,DRB4[{G19B$' ?���#g@
BK�2PX@"SCQCQD@MWSDY@
##T%#++'.5737>32#"&#"3ve.KF�d�AcI>3	+I8&�a���KW
NbW�]0\8ZA]������;K^�@9$BK�PX@+	[[CSCSD@.h	[[SCSDY@=<[YSQEC<K=K4320(&
+#".54>32.5467#".54>32!2>54&#"4&'.#"32>0"(")1)Bz�mW�e7R��Y$G#	&^<:eL,5f�bnQ~	
�~6R9YN6R8W
6_*RxN&yoBmM+�2PD<<?%*DHU:Gb9$B]8OrJ")B)&JoJH�mB4;9��/M`1XZ,J^3Z^�-	0?"HL#:NO��,@)BCSC
D&#+33>32#>54&#"O��SO�es|L�L=B-_ZNA��Tvy��+�{�%RP1ZN��_��GK�	PX@SCC
D@SCC
DY@

+##".54>32�z�z�#,,!",,#���>-##-.##/�g����(Y�	BK�	PX@SCCSD@SCCSDY@%#U%+#"&'7>323267#".54>32��-LiC#2GE
��#-+!"+,#���=iN-

`
IQ@>-##-.##/N��0@-B\CC
D%(%!+3267>;#"&'.+#�jO��y0���
";�����W�s
 ����X��@C
D+33X�����?G�0Z@BK�"PX@SC
D@CSC
DY@00&%$$!	+332>32>32#654&#"#>54&#"GzY<K�cgbL�hpoL�L2;+VPEA�M/;0YOD?�<�~�������2�{�1(KG+S{P���0GD0[�R��G�P@
BK�"PX@SC
D@CSC
DY@&$!+332>32#>54&#"GyY<Q�mq}L�L=A0c\O:�<���*�{�%RO4_�S��7���#NK�	PX@SCSD@SCSDY@##	+%2>54&#"".54>32�IxT.nhJwT.mYS�d8P��nS�d8P��}P��_��O��_���9l�d��b9l�c�c���+�@BK�	PX@SCSCDK�"PX@SCSCD@!CSCSCDYY@#!++(&!+32>32#"&'"32>54&�Y<&Zcl8��"?Ym�FK|*6�0c\O &k74\L<)V��M<�BkL)��R���_6;7�E�<l�W��7-,Kes{<w|0���0b@%
	BK�	PX@SCSCD@SCSCDY@
 )&0 0*, +#"&54>5#".54>322>7.#"p ;#PZb4<bE&-St��ZA{<��0]TH-+<pbP9 ��%�;^C$/[�VZ��]3��<j�Wc'Fat�E�G��,@)
BSC
D#*!+332>32&#"GzY A�Y** /,a�38��������*
��99@69BhfSCSD/#%/#"+#".#"#"&'7>3232>54.54>32�!/D0-J6>^m^>7g�Za�/, 0I81O7>^l^>3`�V[�2S,;!/8)&:ZHF�a:E6D
#2C&3<(#7XI@w\7=4_���>0b�+BK�2PX@#jhQCSD@!jh\SDY@	%#(+&+74>7#"&54>?>;!!32>32#"&�?q
�K^,
��=/)(	%0}?ap�$:/�9����)231	U+1j`����#L�BK�"PX@CT
D@C
CTDY@##*!&+32>73#"&54>57#"&5467bL=B.a[N?�zX"Q�jq}L��|$RP2\�P�"("Q����*�K��@BC
D, +32>7>;#K��:�����t%J$$I&��Q��. @'BC
D*!,< +32>7>;2>7>;#"'.'+Q�]Jq
��W�{
�����t#A  A#��p#B! C#��"�! �R"����@BC
D(")!+32>7>;	#"&'+h���
�����
��
�!���/�+�����Q����@
BCD,"!++32>7>;<)�����	@���)����*+Y�@QCQ
D+!!7>7!7!P����6	K���#�&�J
#ߌ1��Y�E7@4&:B[[OSG=;303++4&#72654.54>;+";2#".54>�85
JI-Y�V1	
'B/"3;5@#C=
2EfC" & �4Bhw|575a�i7MEoQ;?<MgA![?<rsu?FU%(Gb:Bxsq���5�@QD+3#����������G7@4<(B[[OSG?=525++3"+7>;2>5<&454>7.54>54&+"&54>5732�85
JI-Y�V1	

'B/"3;5@#C=
2EfC" & 4Bhw|575a�i7M

	EoQ<?;LhA![?<rsu?FU%(Gb:Bxsq9��9@6jkO[SG
+2673#".#"#4>32�AI�%Ef@4f_V$AI�%EeA4f_VeUFCpP, '!TGCpP-!'!����
!&@#SCQD

+>734>32#".�C

hB."--""--"��-UW\45\VU-���."".-""-��&�/8�@%BK�	PX@.jhfkSCSD@.jhfkSCSDY@
##'#+.54>?>;#".'>32+�R�`4M�ф"@-R}04+=*�@[?*	'!S`i6!@�tj�Z�]0
	Dq�`~מ\��?1<	��"<#6&����Dv���>?@<+Bh[SCS
D&&%#%&"	+#!>3!#!7>7#7>;>32#"&'.#"!z�Y	60<�	
�;#9+$�q!P��mT{X9K#2H4AkQ3 ���Kj*I
p
/C..F	^�zF&B[5,

0$+OpE��F��+`#7?@<!B
@ ?WSD42*((+467'7>327'#"&''7.732>54.#"!�[�,h:9f+�Y�"!�[�,h99e,�Z�!�#>Q//S=$$=S//Q>#�9e,�Z�"!�[�,g:9f+�\�!!�[�,g:.Q=$$=Q./R>##>R~��"8@5
B
Z	YC
D"! ,!+!32>7>;!!!!#!7!7!�6�ʐ�
	_"��6��
V��'�'��
V
��p'��!:; =��cic��Aci���5�@YQD+3#3#����������;���FVA@>FTL;!BhfWSDDB+)&$#!+#".#"#"&'7>3232>54.5467.54>32>54.'R!/B0/K6DfvfDY_%-6f�^a�00	!0I:2O7)BUYUB)ag%.3a�W[�/��:Zn3:26Ug1E9�.>".A88JdH[�)!U9J�`7D6B
"3E))<0(*0?R8Y�'"X>AvZ5>6��/B82V51D70#P^���'@SD((($+#".54>32#".54>32? )(() g))))((**((**]���+Ga�@
BK�	PX@5h
f[[		SCSD@5h
f[[		SCSDY@\ZPNB@42(&+++2#".54>32#".#"32>%4>32#".732>54.#";		<9�tb�s?Dz�bm�9.2M:GpP**Kg>?V9!�.4`���ee���_44_���ed���`4e,Qs��XX��sR-c��X��sQ,�@BIDz�de�yCC8A-TxKMyR+�e���`44`���ed���`44`���eY��tS--St��Y��e.Sv���?��-9L@I!Bh[	WSD/.32.9/9%#
--
+"&/#"&54>?6454&#"#"&/>32'26?.04AR%V�j(0"0$6xD,D//�.G$
B\9*H	1 ED(K;&&.6
(2.4G(��P&#m*"����%�%(+77�4�

o ;]4�

o ;���
��
 ����
��
 �>�=K�	PX@_MQE@kMQEY�+!#!�[4�$�9�^ a<�@MQE+!!s��8��^���3IV��>BK�	PX@/h		[
[SCSD@/h		[
[SCSDY@44VTLJ4I4H)!*,,&+4>32#".732>54.#"#!2#"'.#'32>54.+^4`���ee���`44`���ee���`4e,Rr��XX��sR-c�焄�b� ��kj
�!�	Ps8M/+F4��e���`44`���ed���`44`���eY��tS--St��Y��ee���|}z^�
��.
r(:&%8$p��A@MQE+!!~��Aq�'�'@WSD((($+4>32#".732>54.#"�3XvDEwX22XwEDvX3}6I**I66I**I6hCvW22WvCBuW33WuA*I66I**J77J3PK�<@9jhZMQE
	+!!#!7!!!�/��e-�-�j�/����D������r�{�$����d-9@6+	Bh[SD(&#!
--+26;2!7>?>54&#"#"&/>�`m0?"�2*��
�6(6**A!C�ddS,HA<�*�89:-0+2ji�|�d:S@P6Bhh[[SD31.,('&%::	+2#".'763232>54&#7>54&#"#"&/>�.K5�980Nd48Q7"	:
+!"5%FV[S5,2=@5HWd->$�-E7<]?!1G/!%011Y=>,-.+4P4���	@kD	#++7>3��f�"��������%2@/BCT
CD%%'%!&+32673#"&=#"&'#"&5<7\SVQF�=]�|gF�PA^#U %��Y
RYJB�
lHC/+$H �� k�7��*@'hiSD+##!#".54>3�ܵ���붝j]�i9H��q���7�7]2Z~MZ�tC����@OSG($+4>32#".�)67((76)Q8((86))6��w
�K�PX@B@BYK�	PX@^TDK�PX@jTD@jjTDYY@
+232654&'73#"&'76E(+GB:k JC!;Q0&B�	(#	�R?.$9'5��z^N�
BK�2PX@jjQD@jjMRFY�$+37#"&/733!�6
y �hNy�u��,\		6���]�<��!)@&WSD!!	+2#".54>2654&#"�:]A"0UxH;^A#0Wy
ZYA?2E+@�%Ea<R�]2%Eb<Q�]2���uKU&C^8KTw���%�%(+'&54767&'&54?'&54767&'&54?���5
�
	p!;���5
�
	p!;�{

 �|�{

 �k�+1V@S%/
Bhh
Z\	C
D10+*)('&$##!#
+3+#7!"&/3+>;37#"&/733!>73�n
Uj���w��/F�1!G�u�6
y �hNy�u����I��>�] [���,\		6���]�,���\�	7Hb@_B;5Bhh
Z[	CT
D
HGFEDC?=9820,*
77#"
+%+>;26;2!7>?>54&#"#"&/>%37#"&/733!�/F�1!G�`m3C$�2*��
�6(6*/=	
+����6
y �hNy�u5 [�IdS-LC>!�8*�89:-04)
ji<�,\		6���]�z�TZ~@{P
"/
	X
B

h	
	
h

h	[

[\

SC
DZYMKGEA@?>8631+)TT##!#+3+#7!"&/3+>;%2#".'763232>54&#7>54&#"#"&/>>73n
Uj���w��/F�1!G�u.K5�980Nd48Q7"	:
46"5%FV[S5,2@15HW
���I��>�] [->$�-E7<]?!1G/,2%011Y=>,-0%	4P4�c,����u';5@2BhfSCSD(&#,$+#".54>?332>324>32#".u!LWb8DoQ,/IWN:	$u	1HSF/-;!7S<'��!-."".-!�4''HgAQsS<56$��-B:8CV;)?+$."".-""-������&$	O������&$_������&$
O������&$O������&$
O�����-&$P����9@6AYYQCS
D#	+!!!!!!!+!��L�*�:��&�������������$@d����J�K�PX@9=HB@9=HBYK�	PX@0hfSCSC	SDK�PX@0hfSCSC	SD@7hf	hSCSCSDYY@FD<;64/-%# JJ
+232654&'7.546$32#".#"32>32#"&'76�(+GB0r�~Bt��L|fS$@(EmWtʔU:g�UBfN7)	AWߒJC!;Q0&B�	(#	vd�ڀ�6�{2F+N

(/(]���o�{B ' Q^o:?.$9'5��aA�&(	$��aA�&($��aA�&(
$��aA�&(
$��V
�&,	����&,��g��&,
�����&,
E��!,@)YSCS
D!%(!+3!2#!#%4.#!!!!2>S�P�ԕOp��Q�{7f�]��>\
��?2xŎN	�Z�㈷���v��l�yA�n��[����aE�&1���d����&2	���d����&2���d����&2
���d����&2���d����&2
�l�9W�	(+		'	7	9�|8f��nP���g0������]d��]e[]��Z0����%1=g@5*)#
BK� PX@kCSCSD@jkSCSDY�**'(%&+#"&'+.546$327>;.#"%4&'32>�4_���ka�Cm=J�MRr��h�EY`�EJ��+)�2�OvƎP�$"�<0wHxƎO2zڹ�h82/�	T錷3�|;6p�T��a�<.1_��*X�;��&'^�������$�&8	������$�&8������$�&8
������$�&8
���y��&<<��	�����++���,@)\[C
D"( +32+#332>54&#��r�n6J�΅�!���3J�U�X.���6c�Uq��L����a��4]�Lt�3�&�P}@JGBAK�,PX@(hSCSCQD@%hWSCSDY@LKFD=;%# PP+2#"&'7>3232>54.54>54.#"+'&573>�Y~Q&/FQF/+@K@+>i�OY�10	"-@0*G3.DQD.1JWJ1-I4>mU:
l.KF�n(�^���6Se/D`H638&#/)+=XAV�_3E6B"6I*0?.(4H8>XE:@P8;0Ct�U���KW!M\��K��0����&DCi��0����&Dv+��0����&D�"��0����&D�"��0����&Dj"��0����&D�6���GUbG@E?"BK�	PX@5hh

[S	CSDK�PX@5hh

[S	CSDK�,PX@?hh

[S	CSCSD@Jhh

[S	CS	CSCSDYYY@&WV\[VbWbQOIHCA<:75/.(& 
	GG+232>32#"&'#"&54>7>54#"#"&/>32>32>7">54&]<fK*7��zl1K;-&,3afo@i�' Ydj1��@���<U?0W�hlz<���x�g-NA4]K4	�<bI2��c(K%BY39lU7

��#74L1rr>W8wxG�c>(�!)!7QP`UT^��%<Q2HE%JoJ�-TvH$3@$9D<��bI�K�PX@6<GB@6<GBYK�	PX@0hfSCSC	SDK�PX@0hfSCSC	SD@7hf	hSCSCSDYY@EC;:42-+#!II
+232654&'7.54>32#".#"32>32#"&'76(+GB2JqL'M��rd�38+A3E{\58Q6-F6)!,/TTW1JC!;Q0&B�	(#	y
Ck�T{�hGDC
K��f>eG'!63H-<?.$9'5��;��q�&HC���;����&Hv���;��q�&H����;����&Hj���=��&�C���_u�&�v���"^�&�����/w�&�j�<����1E6@37-B10@[SD32=;2E3E+)!+.54?.'&54?7#".54>32.'2>7.#"��)`7%X�F�qQ^F�ȂR�e8E}�ia�0LL�!AoX>	&<U9KwR+"=S)		^%
7@3|9	ST���k9k�_l��U[\��E���3l�v,Q?&<i�QCjI'��G��&Q����++��7����&RC����++��7����&Rv����++��7����&R�����++��7����&R�����++��7����&Rj����++s�A~'+@([YOSG(&(%+!!4>32#"&4>32#"&���B�&2'&21;X&2'&20<��2&(1$>�f2&(1$>���%)4�@32#"BK�	PX@!CSCSCDK�PX@!CSCSCDK�PX@!kCSCSD@!jkSCSDYYY@+**4+4&$+"'+7.54>327>;&#"2>54&'�|Z$:C�(+P��n}["  Z�'+P�����8NJzY1�I{Y1
�F7=1�5�X��b@.�5�W�c�YBZ-L���sM��g,K ��,��`����&XC����++��`����&Xv����++��`����&X�����++��`����&Xj����++��Q����&\v����++%����,p@ BK�	PX@!CSCSCD@!CSCSCDY@$",,(%+3>32#"&'#"32>54&%ݰY&X`h6��"?Ym�FK{+.'0b\O!&k74\L<)V���4=eF'��R���_6;6��&�<j�W��6,,Kes{<w|��Q����&\j����++������'0�K�PX@
-B@
-BYK�PX@!ZC
C	SD@(	hZC
CSDY@)($"''
+2#"&5467#"&'!+3#32>!.'�
Y0LRVB
N���	%���_-&( ���
�@F:?n)^����g!*3 '	�QB&&C0���4F(K�PX@&;BK�"PX@&;B@&;BYYK�	PX@#SC	SCSDK�PX@#SC	SCSDK�"PX@*hSC	SCSD@.hSC
C	SCSDYYY@65?<5F6F1/('$"44
+2#"&54>7.57#".54>32#32>2>7.#">
Y0LR*:"$S]f7<bE&-St��ZA{<y-&( �C1^TI++<pbP9 �@F: =81�@hI(/[�VZ��]3�,!*3 '	\=l�Y\'Fat�E���d����&&���<��o�&Fv����++a��A�%�K�PX�B�	BYK�PX@*YQCQ
C	
SD@1
		hYQCQ
C		SDY@" 
%%+2#"&5467!!!!!!#32>G
Y0LRVB���/��<��=ui-&( �@F:?n)������!*3 '	;��qAP�K�PX@G2B@G2BYK�	PX@*h	SCSCSDK�PX@*h	SCSCSD@1hh	SCSCSDYY@CBBPCP><0.)'
AA
+2#"&5467.54>3232>3232>">54.I
Y0LRI9U�_2!?[u�QMpH#6���uv0K;-& ,M�T+$( ?jR:��d #8�@F::f(<j�]N��xW2,DR%BoYB��#7P]!)2 '	Y4[{G19B$' _��@C
D+#�z�z�����!@
BCR
D+%!!76?3�m��=7�E��Y�&�}���-`�
W�Lb�@BC
D+4?37#L�N�F��\�T��D��Jf!I��E��aE�&1���G��&Qv���++d����2'@
BK�PX@"YS
C	S
DK�PX@-YS
CS
C	S
DK� PX@*YSCQ
C	S
DK�"PX@4YSCQ
CS
C		S
D@2YSCQ
CQ
C		SDYYYY@/-%#(#+!!!!!7#".54>324.#"32>���;��=q��Z��u��Fh���K�kS h/Z�Sm��I0[�Sm��H�������r~\�ㇹ6�~&Ge?��j�|Dc���k�|Cb��.���4FU�@
L2"BK�	PX@$hS	C
SD@$hS	C
SDY@ HG65GUHU><5F6F0.&$ 44+232>32#"&'#".54>32>2>54&#"">54.�AhJ'8\��~ym0K;-&,2afp@i�'E΁QzQ)U��kk�#?��IQ}U+]aN|X/.JH;fP8��h&'="?X5)LC;0&
��#74L1tsny;e�H���Xe[Zf�vN��qs�L��y/VB(.YQ3:A!*!�����&6���
��#�&Vv���++������&6���
��,�&V�~���++��y��&<
<��	�����++����&=8��Y�&]v����++���&=8��Y�&]�����++����&=8��Y�&]�����++��i�'6@3
BYSCSD''#"+#763>7'.546767376$3#"!��2���:.UH8���*0�/UI9+G�!˹[7:^E�	
�ſ_;^E�}Q���@BkD, +#"&/.'+3�rd�w����	q���@BkD( +32?>;#qxd
�s��������p��Aq���� @WD
	+".5467332>73r>V6y4B'6#z&Eg�!:M-
3?)9!6aI+��@SD($+#".54>32#.-""-.#:-""-/##/�kJ�=K�PX@WSD@[OSGY�$&($+4>32#".732654&#"� 7H()I8  8I)(H7 d6/-77-/6#*D22D*)D00D),88,-88/��t
YK�PX@B@@B@YK�PX@
SD@jSDY@+2#"&54>732>R
Y0LR.@%W-&( �@F:"@:2
!*3 '	h���QK�*PX@WSD@O[SGY@	+273#".#"#>32�Ai!2B% 5-) (j"3A%!4-()X/M7#-,.N8#��)�	#@ SD




	#++7>3!+7>3�H�"��S� ������������!Y�BK�(PX@SCS
D@SC
CSDY@! 6##++#!#"&'7>3267#7>3�"|l�k��O�z=<;N��D#��u�}w�H	?C�?
���@MQE+!!����}�o�@MQE+!!���7�}�����(+.5467�j^/	!

�%J%d�L	
09@"6
�����(+'&5467>54&'&547pj^0	!

�%J%d�L	
08@#6
����(+7'&5467>54&'&547�j^0	!

�%J%d�L	
08@#6
����1�(+.5467.5467�j^/	!

�j^/	!

�%J%d�L	
09@"6
*%J%d�L	
09@"6
����1�(+'&5467>54&'&547%'&5467>54&'&547yj^0	!

�j^0	!

�%J%d�L	
08@#6
*%J%d�L	
08@#6
�����1�(+7'&5467>54&'&547%'&5467>54&'&547�j^0	!

�j^0	!

�%J%d�L	
08@#6
*%J%d�L	
08@#6
�����%,@)BCSCD$&$"+>3632>32!#"&'!�,*?�G#)33#P$KIF &!��6H0+u6���/��,
	)
�D���B����9E@B)!("B[C	SCD98'%#&$"
+>3632>32!!#.'#"&'#"&5<>7!!�,*?�G#)33#P$KIF &"��Pj.*?�G!0+O$KIG&!kP���/��,
	'(�v:/�/�
(�����,K�PX@SD@OSGY�($+4>32#".�:e�LM�e;;e�ML�e:SM�e;;e�MM�d;;d�-��,�';@SD((((($+74>32#".%4>32#".%4>32#".-"--""--""--""--"!..""..!n."".-""-."".-""-."".-""-Z����'1EYm��K�PX@+[	[SC
		S

DK� PX@/[	[SC
C
		S
D@3[	[CSC
C
		S
DYY@~|trjh`^VT((%#&((($+#".54>324.#"32>>;+#".54>324.#"32>%#".54>324.#"32>�;`{A8^C%6]}F8^C&�$1(G4$1'G5w|��
~:`|A8]C%6]}F8]D%�$1(G5$1'G6):`{A8^C%6]}F8]D%�$1(F5#1'F6xc�j7)MoFc�k8)NpH2H."JsQ1E-!GqU��
�c�i7)MnFc�l8)NpH2G."JrQ1F-!HrRc�i7)MnFc�l8)NpH2G."JrQ1F-!Hr�����(+7�4�

o ;���
��
 w����(+'&54767&'&54?���5
�
	p!;�{

 �c�	@C
D#"+'+>;?/F�1!G5 [*����B[@X	4	Bh		h
[	[SC
S


DBA?>=<861/"##%%$+3>32#".#"!#!!#!32>32#".'#7367#T�!w��p��;C&6J3M�oT0����d��RoI.ASގq�v>����̎LcWB 4f�`7#H&6��-6-DeqR�ҀcJG�I6�%B@?BhS	CS	D%%!4(
+>7>;#7+"'#32'###7�
�	fGk.�
}.iGg�
�<x;�P

3��rG��RH��Ne��eA�=/@,!BSCS
D=<,**+!>54.#"!"&546767!7.54>32!�5T�i<5a�Re��H*Lj@4�/LxR,0X|��`zȎNAw�f~
(�Jx�pZ�_0B��zMyY:�O%�Tv�Ta��tQ+L��prěl�a A���3HB@?"Bh[SCSD54?=4H5H#*++$+>32#".5467>32>7>54&#"#"&'2>7.#"�'JMT0ItQ,n�݉HwT._��g^�"	e\'C7)
:qdU .I5K{\:]9*8l�c?!���/X~P#sʔVRQ"=9����7o�r-S@'>m�Wgp����@	BCR
D+)3!.'��ԩ���

����9 !9�����$@!QCD+##!##7��Ȳ�ɱȼ����]��]����$@!BQCQD+!!!!7>7	&5<7�R�����A��
��!
���;4�;�A��^�@MQE+!!�[���Ll�"@Bj[
D,'!+!##"&5<>7!2>7>;p���"Ne[n� 
�[ A 7Q=���';OL@IK-B[
	O
	SG=<)(GE<O=O31(;);	''+%".'#".54>32>32%2>7.#"!2>54.#"{3P?1DNX35[C'7\xB3O@2DMX35\D'7]y��!<86$,4!&A1$1S%B1$1!;86%+4�!8K))K8!(KhAR�i=!9K))K9!(KiAR�i<�5E''E4!<T4&:&!<T4'9&4E''E5�{����!(@%BSCSD6'%"+>32#"#"&'7>32>7�)��#A*\n�Og}F D
6Q=,C��Wnu��f�_-
L
:^B����7^@[0!/"B[[	O[	SG42+)&$77

+2>7#".#"'>322>7#".#"'>32@80%(u=4c_\-90%
)wB4d^\81%
'v=4c_\-81%
)wB5c_[W
l0."("i31!)!��
m/-!(!
h31!)!��}kK�PX@)^_	ZMQE@'jk	ZMQEY@

+!733!!!#7!7!7!��}����w��5�}���Pw�S���ʃ����ZP�� @	@MQE+!!�3�-2/��*>��yz�
�z{�
�iP��@
@MQE+%!7!7>7%>7.'%.54657n��>���2/�a�P����z�
�z������"@
BMQE+3	#>7	&'��|��y|�	��
�5���4��&&EF,#&���~�-K�PX@kD@
jaY@	+3v���0>���'s@

BK�2PX@(SCQC
CQD@MWSC
DY@''W%#+#!+'&5737>32#"&#"�y�k�}f.KF�c(�Iz�k''#
SzU1	�`���KX#O8]�n=Z$HnK5>��!�@	BK�	PX@(SCQC
CQDK�&PX@(SCQC
CQDK�2PX@,CSCQC
CQD@$MWCSC
DYYY@!!#!%#	++'&5737>32;#.#"3wg.KF�b(�
Bn�aG�5w���-_+u��a���KX!Q7T�pA
�Z$
��7�G��2��5K�0PX@QD@MQEY@	+#2~mQR��U
	�	@ja		+2#"&/����
�
����'@OSG((($+#".54>32#".54>32P%##%X$$$$�$$%%$$%%�(��@MQE+!!�4���f
�@ja
#++7>3����
��
�	
f
��@Bja& +#"&/+73ǃr�	���
kk��
��@Bja!+#'327>3�ƒr�	���kk����(@%jOSG
+"&547332673�syo�NOp,Ie�^^c><4T< *@OSG($+#".54>32"-,!!,-"�,!!,,"",��V-!@[OSG$&($+4>32#".732654&#"�4D&'E44E'&D4Y6/-77-/6{'B//B'&@..@&+99+-88���1@.O[SG
+2673#".#"#>32)^.>% 82.'a.>%!82-|*%*G5 -%*H5 �
b�	+@(OSG




	#++7>3!+7>3(�S�'��]�)����

�}��
@kD


+2+�+$<]�

9^I
D��{��_<�	�ʓ^p�ӡ���-	��VO������'-�{����6�G�Z9��(z(�����s�2�a�-����O���/�]�-�D�h���R���-�.+���+}���M���a�dia+aaEdpa6�1���r�a�aoa�dhr�d�r�?{?��|Z�����y|(!�l(������8M�0Ob<5�;]?���$O�_�g�N�XGG�7�0�G

�_`�K�Q����QZ(1X�(���9�{�������~X��;8^=]x�k����a=^8p��3����8;k#�8����kw������������������������d+a+a+a+a6V6�6g6��Eoa�d�d�d�d�d�l�0?�?�?�?��yh�I3�0�0�0�0�0�0�b<�;�;�;�;�=�_�"�/�<G�7�7�7�7�7�s�````�Q%�Q���0�db<+a�;�_�YLoaG�d.�

�

�y|Z|Z|Z�8Q8q8p8�88�8/8h8�x�����������������,�,B���-OZV�VwA��*/�]+A��Y�����xL�=�{����+Z+i����>G>8G8U8�8�88f8�8�8*8�8�8�8g�P`�	�U�������U$�U96:0<-?6D��F��G��H��R��T��m��o��y��}����U��U��U��U��U��U��U�-����������������������������������������������������������U���������-����������U
	�U
��
��
��
�U
$�U
96
:0
<-
?6
D��
F��
G��
H��
R��
T��
m��
o��
y��
}��
��U
��U
��U
��U
��U
��U
��U
�-
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
�U
��
��
��
��
�-
�
�
�
�
�
�
�
�
��U#��&��*��2��4��D��F��G��H��R��T��k��p��������������������������������������������������������������������������������������������
	�U
��
��
��
�U
$�U
96
:0
<-
?6
D��
F��
G��
H��
R��
T��
m��
o��
y��
}��
��U
��U
��U
��U
��U
��U
��U
�-
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
�U
��
��
��
��
�-
�
�
�
�
�
�
�
�
��U��
��
���;#��&��*��2��4��7�59�,:�|<�;?�,Y�rZ��\�|k��l��m�;o�;p��r��y�;|��}�;�����������������������;��r��r�����;�;�;�����;�;�;��	��
��
���^�^��$��7�A9��;��<�@=��?��l��r��|�������������������������@���@���������^���^�^�����
��
���;#��&��*��2��4��7�59�,:�|<�;?�,Y�rZ��\�|k��l��m�;o�;p��r��y�;|��}�;�����������������������;��r��r�����;�;�;�����;�;�;6	��
6
6�A���A������":#��$��&��*��-�i2��4��D��F��G��H��P��Q��R��S��T��U��V��X��Y��Z��\��]��k��l6m��o��p��r6tPuPw��y��{P|6}�������������������������������������������������������������������������������������������������������������������������������������������������������6�6�A�6�6�A��A�����#��#	��#
��#��#
��#��#$��#7��#9��#;��#<��#=��#?��#@��#`��#l��#r��#|��#���#���#���#���#���#���#���#���#��#��#��#��#��#��#��#��#��#���$�J$
�J$
�J$��$#��$&��$*��$->$2��$4��$7�|$8��$9��$:��$<�h$?��$W��$Y��$Z��$\��$k��$l�J$m��$o��$p��$r�J$t�I$u�I$y��${�I$|�J$}��$���$���$���$���$���$���$���$���$���$���$���$��h$���$���$��$��$�h$��$��$�J$�J$�J$�J$��$��$��&��&m��&o��&y��&}��&�&�&�&�&�'��'	��'
��'��'
��'��'$��'7��'9��';��'<��'=��'?��'@��'`��'l��'r��'|��'���'���'���'���'���'���'���'���'��'��'��'��'��'��'��'��'��'���)	�|)�L)�L)�|)��)��)")$�|)-�:)D��)F��)G��)H��)P��)Q��)R��)S��)T��)U��)X��)w��)��|)��|)��|)��|)��|)��|)��|)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)�|)��)��)��)��)��)�L)�L)�L)��|-	��-��-$��-���-���-���-���-���-���-���-��-���..
.
.��.#��.&��.*��.2��.4��.I��.W��.Y��.Z��.\��.k��.l.m��.o��.p��.r.y��.|.}��.���.���.���.���.���.���.���.���.���.��.��.�.�.�.�.�.�.�.�.�/��/
��/
��/�;/#��/&��/*��/2��/4��/7�8/9�J/:�h/<�,/?�J/Y�|/Z��/\�|/k��/l��/m�;/o�;/p��/r��/t�,/u�,/y�;/{�,/|��/}�;/���/���/���/���/���/���/���/��,/��|/��|/��/��/�,/�;/�;/�/�/�/�/�;/�;/�;2��2	��2
��2��2
��2��2$��27��29��2;��2<��2=��2?��2@��2`��2l��2r��2|��2���2���2���2���2���2���2���2���2��2��2��2��2��2��2��2��2��2���3	�v3�C3�C3�v3$�v3-�J3D��3F��3G��3H��3R��3T��3��v3��v3��v3��v3��v3��v3��v3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3�v3��3��3��3��3�C3�C3�C3��v4��4	��4
��4��4
��4��4$��47��49��4;��4<��4=��4?��4@��4`��4l��4r��4|��4���4���4���4���4���4���4���4���4��4��4��4��4��4��4��4��4��4���5#��5&��5*��52��54��57��58��5k��5p��5���5���5���5���5���5���5���5���5���5���5���5��5��7	�|7�L7�L7�L7�|7�f7�f7"'7#��7$�|7&��7*��7-�872��74��7D�/7F�/7G�/7H�/7J�E7P�f7Q�f7R�/7S�f7T�/7U�f7V�J7X�f7Y�W7Z�7[�Z7\�L7]�_7k��7m�L7o�L7p��7w�f7y�L7}�L7��|7��|7��|7��|7��|7��|7��|7���7���7���7���7���7���7���7��/7��/7��/7��/7��/7��/7��/7��/7��/7��/7��/7��/7��/7��f7��/7��/7��/7��/7��/7��/7��f7��f7��f7��f7��W7��W7�|7�/7��7�/7�/7�f7��7�/7�J7�J7�_7�_7�_7�L7�L7�L7�L7�L7�L7�L7�L7��|8	��8��8$��8���8���8���8���8���8���8���8��8���969	��9
69
69�A9��9�A9��9��9��9":9#��9$��9&��9*��9-�i92��94��9D��9F��9G��9H��9P��9Q��9R��9S��9T��9U��9V��9X��9Y��9Z��9\��9]��9k��9l69m��9o��9p��9r69tP9uP9w��9y��9{P9|69}��9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9��9��9��9��9��9��9��9��9��9��9��9��9��9�9�9�69�69�A9�69�69�A9�9�A9�9�9���:::	��:
::
::��:��:��:��:��:$��:-��:D��:F��:G��:H��:J��:P��:Q��:R��:S��:T��:U��:V��:X��:l::r::t<:u<:w��:{<:|::���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:��:��:��:��:��:��:��:��:�::�::�:�::�::�:�:���;;
;
;��;#��;&��;*��;2��;4��;I��;W��;Y��;Z��;\��;k��;l;m��;o��;p��;r;y��;|;}��;���;���;���;���;���;���;���;���;���;��;��;�;�;�;�;�;�;�;�;�<7<	�r<
7<
7<�'<�J<�'<�r<��<��<"2<#��<$�r<&��<*��<-�8<2��<4��<D�A<F�A<G�A<H�A<J�W<P��<Q��<R�A<S��<T�A<U��<V�A<X��<]��<k��<l7<m�J<o�J<p��<r7<t><u><w��<y�J<{><|7<}�J<��r<��r<��r<��r<��r<��r<��r<���<���<���<���<���<���<���<��A<��A<��A<��A<��A<��A<��A<��A<��A<��A<��A<��A<��A<���<��A<��A<��A<��A<��A<��A<���<���<���<���<�r<�A<��<�A<�A<��<��<�A<�A<�A<��<��<��<�J<�J<�7<�7<�'<�7<�7<�'<�J<�'<�J<�J<��r=��="#=#��=&��=*��=2��=4��=k��=m��=o��=p��=y��=}��=���=���=���=���=���=���=���=��=��=�=�=�=�=�>#��>&��>*��>2��>4��>D��>F��>G��>H��>R��>T��>k��>p��>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>��>��>��>��>��>��?�J?
�J?
�J?��?#��?&��?*��?->?2��?4��?7�|?8��?9��?:��?<�h??��?W��?Y��?Z��?\��?k��?l�J?m��?o��?p��?r�J?t�I?u�I?y��?{�I?|�J?}��?���?���?���?���?���?���?���?���?���?���?���?��h?���?���?��?��?�h?��?��?�J?�J?�J?�J?��?��?��E��E
��E��E
��E@��E[��E`��El��Er��E|��E�E�E�E�H��H
��H��H
��H@��H[��H`��Hl��Hr��H|��H�H�H�H�IEI
EI
EI�I�IlEIrEItdIudI{dI|EI�EI�EI�I�EI�EI�I�K��K
��K
��KY��K\��Kl��Kr��Kt��Ku��K{��K|��K���K���K��K��K��K��ND��NF��NG��NH��NR��NT��N���N���N���N���N���N���N���N���N���N���N���N���N���N���N���N���N���N���N���N��N��N��N��P��P
��P
��PY��P\��Pl��Pr��Pt��Pu��P{��P|��P���P���P��P��P��P��Q��Q
��Q
��QY��Q\��Ql��Qr��Qt��Qu��Q{��Q|��Q���Q���Q��Q��Q��Q��R��R
��R��R
��R@��R[��R`��Rl��Rr��R|��R�R�R�R�S��S
��S��S
��S@��S[��S`��Sl��Sr��S|��S�S�S�S�U�hU�hUD��UF��UG��UH��UR��UT��U���U���U���U���U���U���U���U���U���U���U���U���U���U���U���U���U���U���U���U��U��U��U��U�hU�hU�hY	��Y�rY�rY��Y$��YD��YF��YG��YH��YR��YT��Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y��Y��Y��Y��Y��Y�rY�rY�rY���Z	��Z��Z��Z��Z$��Z���Z���Z���Z���Z���Z���Z���Z��Z�Z�Z�Z���[D��[F��[G��[H��[R��[T��[���[���[���[���[���[���[���[���[���[���[���[���[���[���[���[���[���[���[���[��[��[��[��\	��\�h\�h\��\$��\D��\F��\G��\H��\R��\T��\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\��\��\��\��\��\�h\�h\�h\���^#��^&��^*��^2��^4��^D��^F��^G��^H��^R��^T��^k��^p��^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^��^��^��^��^��^��k��k	��k
��k��k
��k��k$��k7��k9��k;��k<��k=��k?��k@��k`��kl��kr��k|��k���k���k���k���k���k���k���k���k��k��k��k��k��k��k��k��k��k���l	�Ul��l��l��l�Ul$�Ul96l:0l<-l?6lD��lF��lG��lH��lR��lT��lm��lo��ly��l}��l��Ul��Ul��Ul��Ul��Ul��Ul��Ul�-l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l�Ul��l��l��l��l�-l�l�l�l�l�l�l�l�l��Um��m	��m
��m
��m�^m�^m��m$��m7�Am9��m;��m<�@m=��m?��ml��mr��m|��m���m���m���m���m���m���m���m��@m��m�@m��m��m��m�m�m�^m�m�m�^m�^m���o��o	��o
��o
��o�^o�^o��o$��o7�Ao9��o;��o<�@o=��o?��ol��or��o|��o���o���o���o���o���o���o���o��@o��o�@o��o��o��o�o�o�^o�o�o�^o�^o���p��p	��p
��p��p
��p��p$��p7��p9��p;��p<��p=��p?��p@��p`��pl��pr��p|��p���p���p���p���p���p���p���p���p��p��p��p��p��p��p��p��p��p���r	�Ur��r��r��r�Ur$�Ur96r:0r<-r?6rD��rF��rG��rH��rR��rT��rm��ro��ry��r}��r��Ur��Ur��Ur��Ur��Ur��Ur��Ur�-r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r�Ur��r��r��r��r�-r�r�r�r�r�r�r�r�r��Ut	�Tt�Tt$�Tt9:t::t<(t?:t��Tt��Tt��Tt��Tt��Tt��Tt��Tt�(t�Tt�(t��Tu	�Tu�Tu$�Tu9:u::u<(u?:u��Tu��Tu��Tu��Tu��Tu��Tu��Tu�(u�Tu�(u��Ty��y	��y
��y
��y�^y�^y��y$��y7�Ay9��y;��y<�@y=��y?��yl��yr��y|��y���y���y���y���y���y���y���y��@y��y�@y��y��y��y�y�y�^y�y�y�^y�^y���{	�T{�T{$�T{9:{::{<({?:{��T{��T{��T{��T{��T{��T{��T{�({�T{�({��T|	�U|��|��|��|�U|$�U|96|:0|<-|?6|D��|F��|G��|H��|R��|T��|m��|o��|y��|}��|��U|��U|��U|��U|��U|��U|��U|�-|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|�U|��|��|��|��|�-|�|�|�|�|�|�|�|�|��U}��}	��}
��}
��}�^}�^}��}$��}7�A}9��};��}<�@}=��}?��}l��}r��}|��}���}���}���}���}���}���}���}��@}��}�@}��}��}��}�}�}�^}�}�}�^}�^}�����J�
�J�
�J����#���&���*���->�2���4���7�|�8���9���:���<�h�?���W���Y���Z���\���k���l�J�m���o���p���r�J�t�I�u�I�y���{�I�|�J�}�������������������������������������������������h����������������h��������J��J��J��J�����������J�
�J�
�J����#���&���*���->�2���4���7�|�8���9���:���<�h�?���W���Y���Z���\���k���l�J�m���o���p���r�J�t�I�u�I�y���{�I�|�J�}�������������������������������������������������h����������������h��������J��J��J��J�����������J�
�J�
�J����#���&���*���->�2���4���7�|�8���9���:���<�h�?���W���Y���Z���\���k���l�J�m���o���p���r�J�t�I�u�I�y���{�I�|�J�}�������������������������������������������������h����������������h��������J��J��J��J�����������J�
�J�
�J����#���&���*���->�2���4���7�|�8���9���:���<�h�?���W���Y���Z���\���k���l�J�m���o���p���r�J�t�I�u�I�y���{�I�|�J�}�������������������������������������������������h����������������h��������J��J��J��J�����������J�
�J�
�J����#���&���*���->�2���4���7�|�8���9���:���<�h�?���W���Y���Z���\���k���l�J�m���o���p���r�J�t�I�u�I�y���{�I�|�J�}�������������������������������������������������h����������������h��������J��J��J��J�����������J�
�J�
�J����#���&���*���->�2���4���7�|�8���9���:���<�h�?���W���Y���Z���\���k���l�J�m���o���p���r�J�t�I�u�I�y���{�I�|�J�}�������������������������������������������������h����������������h��������J��J��J��J�������������m���o���y���}����������������	���
������
������$���7���9���;���<���=���?���@���`���l���r���|���������������������������������������������������������������������	���
������
������$���7���9���;���<���=���?���@���`���l���r���|���������������������������������������������������������������������	���
������
������$���7���9���;���<���=���?���@���`���l���r���|���������������������������������������������������������������������	���
������
������$���7���9���;���<���=���?���@���`���l���r���|���������������������������������������������������������������������	���
������
������$���7���9���;���<���=���?���@���`���l���r���|���������������������������������������������������������������������	���
������
������$���7���9���;���<���=���?���@���`���l���r���|������������������������������������������������������������������	������$��������������������������������������	������$��������������������������������������	������$��������������������������������������	������$��������������������������������������7�	�r�
7�
7��'��J��'��r�������"2�#���$�r�&���*���-�8�2���4���D�A�F�A�G�A�H�A�J�W�P���Q���R�A�S���T�A�U���V�A�X���]���k���l7�m�J�o�J�p���r7�t>�u>�w���y�J�{>�|7�}�J���r���r���r���r���r���r���r�������������������������������A���A���A���A���A���A���A���A���A���A���A���A���A�������A���A���A���A���A���A������������������r��A�����A��A��������A��A��A�����������J��J��7��7��'��7��7��'��J��'��J��J���r����	���
������
������$���7���9���;���<���=���?���@���`���l���r���|���������������������������������������������������������������������
������
���@���[���`���l���r���|��������������
������
���@���[���`���l���r���|��������������
������
���@���[���`���l���r���|��������������
������
���@���[���`���l���r���|��������������
������
���@���[���`���l���r���|��������������
���
���Y���\���l���r���t���u���{���|��������������������������
������
���@���[���`���l���r���|��������������
������
���@���[���`���l���r���|��������������
������
���@���[���`���l���r���|��������������
������
���@���[���`���l���r���|��������������
������
���@���[���`���l���r���|��������������
������
���@���[���`���l���r���|�����������	����r��r����$���D���F���G���H���R���T���������������������������������������������������������������������������������������������������������������������������r��r��r��������
������
���@���[���`���l���r���|�����������	����r��r����$���D���F���G���H���R���T���������������������������������������������������������������������������������������������������������������������������r��r��r������J�
�J�
�J����#���&���*���->�2���4���7�|�8���9���:���<�h�?���W���Y���Z���\���k���l�J�m���o���p���r�J�t�I�u�I�y���{�I�|�J�}�������������������������������������������������h����������������h��������J��J��J��J�������������m���o���y���}����������������
������
���@���[���`���l���r���|������������i�
�i�
�i����9�^�:���<�h�?�^�Y���Z���\���l�i�m���o���r�i�t�}�u�}�y���{�}�|�i�}�����h����������h������i��i��i��i����������
���
���Y���\���l���r���t���u���{���|��������������������������
������
���@���[���`���l���r���|�����������7�	�r�
7�
7��'��J��'��r�������"2�#���$�r�&���*���-�8�2���4���D�A�F�A�G�A�H�A�J�W�P���Q���R�A�S���T�A�U���V�A�X���]���k���l7�m�J�o�J�p���r7�t>�u>�w���y�J�{>�|7�}�J���r���r���r���r���r���r���r�������������������������������A���A���A���A���A���A���A���A���A���A���A���A���A�������A���A���A���A���A���A������������������r��A�����A��A��������A��A��A�����������J��J��7��7��'��7��7��'��J��'��J��J���r����"#�#���&���*���2���4���k���m���o���p���y���}��������������������������������������������������"#�#���&���*���2���4���k���m���o���p���y���}��������������������������������������������������"#�#���&���*���2���4���k���m���o���p���y���}��������������������������������������������������	���
���
����^��^����$���7�A�9���;���<�@�=���?���l���r���|���������������������������������@�����@���������������^������^��^��������	���
���
����^��^����$���7�A�9���;���<�@�=���?���l���r���|���������������������������������@�����@���������������^������^��^�����	�U�����������U�$�U�96�:0�<-�?6�D���F���G���H���R���T���m���o���y���}�����U���U���U���U���U���U���U��-������������������������������������������������������������������������������U��������������-�������������������U�	�U�����������U�$�U�96�:0�<-�?6�D���F���G���H���R���T���m���o���y���}�����U���U���U���U���U���U���U��-������������������������������������������������������������������������������U��������������-�������������������U����
���
����;�#���&���*���2���4���7�5�9�,�:�|�<�;�?�,�Y�r�Z���\�|�k���l���m�;�o�;�p���r���y�;�|���}�;�������������������������������;���r���r��������;��;��;����������;��;��;�	�U�����������U�$�U�96�:0�<-�?6�D���F���G���H���R���T���m���o���y���}�����U���U���U���U���U���U���U��-������������������������������������������������������������������������������U��������������-�������������������U�	�U�����������U�$�U�96�:0�<-�?6�D���F���G���H���R���T���m���o���y���}�����U���U���U���U���U���U���U��-������������������������������������������������������������������������������U��������������-�������������������U����
���
����;�#���&���*���2���4���7�5�9�,�:�|�<�;�?�,�Y�r�Z���\�|�k���l���m�;�o�;�p���r���y�;�|���}�;�������������������������������;���r���r��������;��;��;����������;��;��;����	���
���
����^��^����$���7�A�9���;���<�@�=���?���l���r���|���������������������������������@�����@���������������^������^��^��������
���
����;�#���&���*���2���4���7�5�9�,�:�|�<�;�?�,�Y�r�Z���\�|�k���l���m�;�o�;�p���r���y�;�|���}�;�������������������������������;���r���r��������;��;��;����������;��;��;����	���
���
����^��^����$���7�A�9���;���<�@�=���?���l���r���|���������������������������������@�����@���������������^������^��^��������	���
���
����^��^����$���7�A�9���;���<�@�=���?���l���r���|���������������������������������@�����@���������������^������^��^�����	�U�����������U�$�U�96�:0�<-�?6�D���F���G���H���R���T���m���o���y���}�����U���U���U���U���U���U���U��-������������������������������������������������������������������������������U��������������-�������������������U��J�
�J�
�J����#���&���*���->�2���4���7�|�8���9���:���<�h�?���W���Y���Z���\���k���l�J�m���o���p���r�J�t�I�u�I�y���{�I�|�J�}�������������������������������������������������h����������������h��������J��J��J��J���������������Z,�
Bz�(Zt��J�B��N�		r	�
.
^
�
��z�
 
P
z
�2���>|���Lr��F���(Hx���X�d�`���(���t�(�.l�R��@���f|�@@�   �!!l!�"&"l#<#�#�$,$F%%%b%�&&�&�&�'2'^'�((Z(�)")�*�*�++++$+0+<+�,n,z,�,�,�,�,�,�,�--*-6-B-N-Z-f-�. .,.8.D.P.b.�/R/^/j/v/�/�/�0�1�1�1�1�1�1�1�1�2
2�2�2�2�2�2�2�3L444*4<4N4`4�4�5�6|6�6�7"7�88P8~8�8�9~:8:D:T:`:p:�:�:�:�:�:�:�;8;h;�;�;�;�<J<�<�=,=�=�=�=�>>H>�>�?4?�@@:@�A�A�A�BB�CCxDD0D\D�D�D�E�E�FRF�F�G0GpG�HH�H�IIJIdI�I�I�JJ:JzJ�J�K�b"/n�	�n���)��(��0�+	C
�R.2F
�x:	T	h	p	R|	�	P�	�	`4	0�		�	
��	0
�	d
�	
�.	4�Copyright (c) 2010-2013 by tyPoland Lukasz Dziedzic with Reserved Font Name "Lato". Licensed under the SIL Open Font License, Version 1.1.LatoItalictyPolandLukaszDziedzic: Lato Italic: 2013Lato ItalicVersion 1.105; Western+Polish opensourceLato-ItalicLato is a trademark of tyPoland Lukasz Dziedzic.tyPoland Lukasz DziedzicLukasz DziedzicLato is a sanserif typeface family designed in the Summer 2010 by Warsaw-based designer Lukasz Dziedzic ("Lato" means "Summer" in Polish). It tries to carefully balance some potentially conflicting priorities: it should seem quite "transparent" when used in body text but would display some original traits when used in larger sizes. The classical proportions, particularly visible in the uppercase, give the letterforms familiar harmony and elegance. At the same time, its sleek sanserif look makes evident the fact that Lato was designed in 2010, even though it does not follow any current trend. The semi-rounded details of the letters give Lato a feeling of warmth, while the strong structure provides stability and seriousness.http://www.typoland.com/http://www.typoland.com/designers/Lukasz_Dziedzic/Copyright (c) 2010-2013 by tyPoland Lukasz Dziedzic (http://www.typoland.com/) with Reserved Font Name "Lato". Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL).http://scripts.sil.org/OFLCopyright (c) 2010-2013 by tyPoland Lukasz Dziedzic with Reserved Font Name "Lato". Licensed under the SIL Open Font License, Version 1.1.LatoItalictyPolandLukaszDziedzic: Lato Italic: 2013Lato-ItalicVersion 1.105; Western+Polish opensourceLato is a trademark of tyPoland Lukasz Dziedzic.tyPoland Lukasz DziedzicLukasz DziedzicLato is a sanserif typeface family designed in the Summer 2010 by Warsaw-based designer Lukasz Dziedzic ("Lato" means "Summer" in Polish). It tries to carefully balance some potentially conflicting priorities: it should seem quite "transparent" when used in body text but would display some original traits when used in larger sizes. The classical proportions, particularly visible in the uppercase, give the letterforms familiar harmony and elegance. At the same time, its sleek sanserif look makes evident the fact that Lato was designed in 2010, even though it does not follow any current trend. The semi-rounded details of the letters give Lato a feeling of warmth, while the strong structure provides stability and seriousness.http://www.typoland.com/http://www.typoland.com/designers/Lukasz_Dziedzic/Copyright (c) 2010-2013 by tyPoland Lukasz Dziedzic (http://www.typoland.com/) with Reserved Font Name "Lato". Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL).http://scripts.sil.org/OFL���rt	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a��������������������������������bc�d�e�������f����g�����h���jikmln�oqprsutvw�xzy{}|��~�������	
�����
����������������������������������������������� !"#NULLuni00A0uni00ADmacronperiodcenteredAogonekaogonekEogonekeogonekNacutenacuteSacutesacuteZacutezacute
Zdotaccent
zdotaccentuni02C9EuroDeltauni2669undercommaaccent
grave.case
dieresis.casemacron.case
acute.casecircumflex.case
caron.case
breve.casedotaccent.case	ring.case
tilde.casehungarumlaut.case
caron.salt�������������V��������V�,� `f-�, d ��P�&Z�E[X!#!�X �PPX!�@Y �8PX!�8YY �Ead�(PX!�E �0PX!�0Y ��PX f ��a �
PX` � PX!�
` �6PX!�6``YYY�+YY#�PXeYY-�, E �%ad �CPX�#B�#B!!Y�`-�,#!#! d�bB �#B�*! �C � ��+�0%�QX`PaRYX#Y! �@SX�+!�@Y#�PXeY-�,�C+�C`B-�,�#B# �#Ba��b�`�*-�,  E �Ec�Eb`D�`-�,  E �+#�%` E�#a d � PX!��0PX� �@YY#�PXeY�%#aDD�`-�,�E�aD-�	,�`  �	CJ�PX �	#BY�
CJ�RX �
#BY-�
, �b �c�#a�C` �` �#B#-�,KTX�DY$�
e#x-�,KQXKSX�DY!Y$�e#x-�
,�CUX�C�aB�
+Y�C�%B�	%B�
%B�# �%PX�C`�%B�� �#a�	*!#�a �#a�	*!�C`�%B�%a�	*!Y�	CG�
CG`��b �Ec�Eb`�#D�C�>�C`B-�,�ETX�#B `�a�

BB�`�
+�m+"Y-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�	+-�,�+�ETX�#B `�a�

BB�`�
+�m+"Y-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-� ,�+-�!,�+-�",�+-�#,�	+-�$, <�`-�%, `�
` C#�`C�%a�`�$*!-�&,�%+�%*-�',  G  �Ec�Eb`#a8# �UX G  �Ec�Eb`#a8!Y-�(,�ETX��'*�0"Y-�),�+�ETX��'*�0"Y-�*, 5�`-�+,�Ec�Eb�+�Ec�Eb�+��D>#8�**-�,, < G �Ec�Eb`�Ca8-�-,.<-�., < G �Ec�Eb`�Ca�Cc8-�/,�% . G�#B�%I��G#G#a Xb!Y�#B�.*-�0,��%�%G#G#a�E+e�.#  <�8-�1,��%�% .G#G#a �#B�E+ �`PX �@QX�  �&YBB# �C �#G#G#a#F`�C��b` �+ ��a �C`d#�CadPX�Ca�C`Y�%��ba#  �&#Fa8#�CF�%�CG#G#a` �C��b`# �+#�C`�+�%a�%��b�&a �%`d#�%`dPX!#!Y#  �&#Fa8Y-�2,�   �& .G#G#a#<8-�3,� �#B   F#G�+#a8-�4,��%�%G#G#a�TX. <#!�%�%G#G#a �%�%G#G#a�%�%I�%a�Ec# Xb!Yc�Eb`#.#  <�8#!Y-�5,� �C .G#G#a `� `f��b#  <�8-�6,# .F�%FRX <Y.�&+-�7,# .F�%FPX <Y.�&+-�8,# .F�%FRX <Y# .F�%FPX <Y.�&+-�9,�0+# .F�%FRX <Y.�&+-�:,�1+�  <�#B�8# .F�%FRX <Y.�&+�C.�&+-�;,��%�& .G#G#a�E+# < .#8�&+-�<,�%B��%�% .G#G#a �#B�E+ �`PX �@QX�  �&YBB# G�C��b` �+ ��a �C`d#�CadPX�Ca�C`Y�%��ba�%Fa8# <#8!  F#G�+#a8!Y�&+-�=,�0+.�&+-�>,�1+!#  <�#B#8�&+�C.�&+-�?,� G�#B�.�,*-�@,� G�#B�.�,*-�A,��-*-�B,�/*-�C,�E# . F�#a8�&+-�D,�#B�C+-�E,�<+-�F,�<+-�G,�<+-�H,�<+-�I,�=+-�J,�=+-�K,�=+-�L,�=+-�M,�9+-�N,�9+-�O,�9+-�P,�9+-�Q,�;+-�R,�;+-�S,�;+-�T,�;+-�U,�>+-�V,�>+-�W,�>+-�X,�>+-�Y,�:+-�Z,�:+-�[,�:+-�\,�:+-�],�2+.�&+-�^,�2+�6+-�_,�2+�7+-�`,��2+�8+-�a,�3+.�&+-�b,�3+�6+-�c,�3+�7+-�d,�3+�8+-�e,�4+.�&+-�f,�4+�6+-�g,�4+�7+-�h,�4+�8+-�i,�5+.�&+-�j,�5+�6+-�k,�5+�7+-�l,�5+�8+-�m,+�e�$Px�0-K�KRX��Y�c �#D�#p�E  �(`f �UX�%a�Ec#b�#D�*�*�*Y�(	ERD�*�D�$�QX�@�X�D�&�QX��X�DYYYY������DPK}$[^b��Xgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Bold.ttfnu�[����pBASEe]��0FDSIGGDEF����x�GPOS#f�8�dbGSUB�]��JOS/2���x`cmapspB3fglyfc��[M�Ovhead�ʹ�6hhea3y4$hmtx�s�p�Bloca�ny�A�BmaxpT^X name��s�@�post+���$9	�7
��_<���
��s�0�:($��X�0�0( �*bX��XK�X^2)	 �8ADBO  ����`��� X#	J6F\i,@J;Dk:B&K&F2@8=HC/7R4HO*L2#H/H/t51>%F																							������	J66666FFFF\\\\\\\\^\\\\F\\\\,,,,,,,,,@@@@JJJJJJJJJJJJ;DDD[kkk*k��k:::BBBBBBBB&&&&&&&&&&&&&&&&&&&&&&&&FFFFFFF22222222@@@@@@@@@@@@@@@@@@@@@@@@888888I2AJ&.=============='========HCCCCC"////7777777777777777744444444���HH HOOOOOOOOOOOO*LLLL2222222###HHHHHHHH��/////////////////////////tRttaa/55555555=R1111111>>>>>>>>>>>>>>>>>>>>>>>FFFFFF/HH*A��BHHH4C//6/n7F0/*1/@<HHHOO2)2)y#��HJ/444ttJJ5++21��'>!FF4��2E29C/B////////////////////////////////QQQQQQQQQQQQQQOQOQQQQQQQQQ��QQ	Jl\8@&JD:BB&@K?������J����*H5FVA7=I"@;3
H/2>)IH9*FA==3>>=>I0Jt)�������h�������jijs��noh������}����	JJl\.@@E��:@&@K6@-"J\\l72JJ;��E@?&l2.E@6,>J	��\2@&&=<Tt70IIM%H/HHC2%H@##&Q5"77tC5OO*��$MIK /%x/0MHC %@H2=77I////CQQQ��8O3*#.<>=58O8O3*#.<>=58O8O3*#.<>=58O��������bg�R��3E�E���*;FFFPP��v��zZ��zZ|Y�<<>�c�~�hjiJ�J�@YYG0w><@\�h�h�h�h�he��FT|||@���������������������������������������������������������������������0��������t&|���������������>$@C-`.OC[C5OY##4

5FFTF�FFtbFFFVF44FFIF����p�@<��}!	B,;J
]>Gf
��J<9'H55AADDAA00
��,7����5�����������.���J#��������Z}�uu���}�nm�������.}�����u�nf�������z��mt��wx����u��B9���������"������m���������u��n�J���k�nf�0�c��h��o�������/����������������uzsi�jj�������!!��������������������������������������������������������������������������������������������������������������������KK����^�^^�������^^�������^^������������������������������������������,����
,,5��>A����$�,$
��	����Rkl���������mnopqrstuv�������	

������ !"#$%&'()*+,-./012345����:=R^���
*)+-KJLNipoqsr������VS����������M�����T������&(u�����W�����o69�������������hU������l8_7a]��~������U�������������/9@Z`z~�������������7C\ghnv{~������������������ *,14=E_auz~���������������/_cu��������������CIMPRX[���!+;IScgo���������    " & 0 3 5 : ? D I q y  � � � � � � � � � � � � �!!!! !"!&!.!^!�!�!�!�""""""""")"+"7"H"a"e###!%�%�%�%�%�%�%�%�%�%�&&&<&@&B&`&c&f&k''R'd'�..%������ 0:A[a{�������������7CP^hjox}������������������#,.49@_atz~���������������0br��������������CGMORV[��� $2>RXfl~��������      & / 2 5 9 < D G p t } � � � � � � � � � � � � �!!!! !"!&!.!P!�!�!�!�""""""""")"+"7"H"`"d###%%�%�%�%�%�%�%�%�%�&&&:&@&B&`&c&e&j''R'd'�.."������=������oY���
�����������������x�p�o�%$#$	��;�:�.������������������������������-�i��o�d�c�j�$�~�|�y���������������z�z��������T�i�p�l�G�%����s������޺�ޚޙ�r�m�cݹ�j�q�վջ%y%l������������������������"",028>HNPZ\^bfprxzz||xz�����������������������������������������Rkl��������������������������o�VSQT����&���������������(�mno�6789:=MR]^_a~������������������
)*+-JKLN�iopqrs���������;<	@
S T!V#U"W$[(b.c/d1e0`,p<q=r>s?xC}I�M�O�T�Q�U��V�WZ�[�]�\�b�a�f�j�hn���t��u����������������������������������������������Ww����?�P�v����������Ot@�wo;�g>N�����������������������������2:?A��������H4;@I��	
 "-./02467�C#JE��v�wxy|~�z}�������������������JKLMNOPQRS	T
UVW
XYZ[\]^_`abcd*,-358<=QX%Y&Z'n:uAzEyD{G|H�X�Y�^�_�`�c�d�e�k�l�m������������������������������������F�ABCDEFGHIJKLf2g3h4i5j6k7l8m9�R�S�x�y�z�{�|�}�~����������������������������������������������������������������l��������1��6gY]Uebck�x}~pqrstuvwyz{|����������������������������������������������������������$�  !!�""�##�$$R%%k&&l''�()�**�++�,,�--�..�//�09m:;�<<�==�>>�??�@@�AZ[[�\\�]]�^^�__�``�az{{�||�}}�~~���o�����V��S��Q��T��������������&��������������������������������������������(�����m�����6��=��M��R��]��a��~�������������������������������������
������)��-��J��N�����i��o���������������������;<	@
S T		!

V#U

"W$[(b.c/d1e0`,p<q=  r!!>""s##?$$x%%C&&}''I((�))M**�++O,,�--T..�//Q00�11U2233�44�55V66�77W88Z99�::[;;�<<]==�>>\??�@@bAA�BBaCC�DDfEE�FFjGG�HHhIInJJ�KK�LL�MMtNN�OOPP�QQuRR�SS�TT�UU�VV�WW�XX�YY�ZZ�[[�\\�]]�^^�__�``�aa�bb�cc�dd�ee�ff�gg�hh�ii�jj�kk�ll�mm�nn�oo�pp�qq�rr�ss�tt�uu�vv�ww�xx�yy�zz�{{�||�}}�~~������\�����W��w����������������?�������P�����v��������������������������������O����t��@�����w��o��;�����g��>����N������������77�CCPPP�QQ�RX�Y\�^g�hh�jj�kn�ov�x{�}~����������������������������0��2��:��?��A�����������������������������������������H��4��;��@��I��	
		

 " $#&-''2((4)*6,,8.1944=9=>@@�AABBCCC#DDJEEE__FaaGtu�zz�~~���������v�����w��{��|��~�����^��o��z��}������������������������������������������������/�0_bb�ccJrrssKttuuL����M����N����O����P����Q����R����S��	��T��
��U����V����W��
��X����Y����Z��[����\����]����^����_����`����a����b����c����dCC)GG*HI,MM/OO3PP5RR7VV8WX<[[>��+��.��BQX

%Y&Z'n:  u!!A$$z%%E&&y''D(({))G**|++H22�33X44�55Y66�77^88�99_::�;;`>>�??c@@�AAdBB�CCeDD�EEkFF�GGlHH�IImRR�SS�XX�YY�ZZ�[[�\\�]]�^^�__�``�aa�bb�cc�ff�gg�ll�mm�nn�oo�~~����������������������������������������������F��������A����B����C����D����E����F����G����H����I����J����K����L����f��2��g��3��h��4��i��5��j��6��k��7��l��8��m��9�����R�����S�����x�����y�����z�����{�����|�����}�����~���������������������������������������������������������������������������������������������������������������������������������������������  p  �  �  �  �  �  �  �  �  �  �  �   !� " "� & &� / / 0 0l 2 3� 5 5� 9 :� < <� = =� > ?� D Dh G G� H H� I I� p p� q q1 t y� } ~�  6 � �� � � � �F � �X � �g � �Y � �Z � �\ � �] � �U � �d � �^ � �` � �e � �b � �f!!�!!�!!k!!�! ! �!"!"�!&!&�!.!.�!P!Px!Q!R}!S!Zp![!^y!�!�!�!��!�!��!�!��!�!��!�!��""�""�""�""�""�""�""�""i""�""�""�""�")")�"+"+�"7"7�"H"H�"`"`�"a"a�"d"e�##�##�##�# #!�%%�s%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��&&�&&�&:&;�&<&<�&@&@�&B&B�&`&`�&c&c�&e&e�&f&f�&j&k�''�'R'R�'d'd�'�'��..�.".%����������������������**M�����'<Qp����4p���W����J}��<_ju����)X���0K�����&1<G������		
		&	1	<	G	R	`	�	�	�	�	�	�	�



$
/
:
E
M
~
�
�
�
�
�
�
�
�	*5@KVdoz�������$/;Fit��������



)
4
?
J
V
a
l
z
�
�
�
�
�
�
�
�
�
�$/:EP[fq|������
Xcny�����*5@KYdoz��������
 +EP[fq|�������"-]hs~�����������
#.9DOZe���;br}�������*5�����������r}�������@KVa��������4?JU`kv������������	 +7Bmx�����������!9DP[ft��������"-hs~������%0;FT_j������ +������������(q�������%0;FQ\gr������� ! , 7 B M X c n y � � � � � � � � � � � �!	!!!*!s!�!�!�">"�"�"�#$#g#�#�$$_$�$�$�%%O%�%�%�%�&P&�&�''H'k'�'�'�'�(((/(:(u(�(�(�))7)w)�)�**-*d*�*�*�++E+d+�+�+�,(,^,�,�,�-
-6-S-�-�-�-�.6.f.�.�/G/o/�/�/�00O0�0�0�0�0�0�0�0�0�0�1=1H1S1^1i1t11�1�1�1�1�1�1�2 2(232>2I2T2_2j2u2�2�2�2�2�2�2�2�2�2�2�3333"3J3w3�3�3�3�3�4
44 4.494V4b4�4�4�4�4�4�5
555%5V5^5f5�5�5�5�5�5�5�5�5�5�6)616R6�6�6�6�777E7k7s7�7�8=8i8�8�9(9R9�9�9�::;:]:�:�;
;=;p;�;�<<<U<�<�==a=i=�=�=�=�=�=�=�=�>>>>$>c>�>�>�??? ?)?8?F?N?]?e?m?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�@@!@=@K@S@v@�@�@�AASA[A�A�A�A�A�BBLBmBxB�B�B�B�B�B�B�B�CC*C\CdC{C�C�C�C�DD;DiD�D�D�D�E	EECEKESE[EcE�E�E�E�FFF)FSF�F�F�F�G&GfG�G�G�H
HH7HhH�H�H�H�H�H�H�H�H�H�IIII%IjI�I�I�I�J#J_J�J�J�J�KK)K1KCKKKSKdKlK�K�K�K�LL/LQLwL�L�L�MMM'MdMoM�M�M�M�M�M�N"N*N5N@NKNaN�N�N�N�N�O,OkO�O�O�PP#PHPyP�P�P�P�P�P�P�P�P�P�P�Q	QQQ'QqQyQ�Q�Q�RKR�R�R�SS,S^S�S�TTIT�T�T�T�UURUvU�U�U�U�VVJV_V�V�V�WW@WtW�W�XX_X�X�X�X�X�X�Y,YMYnY�Y�Y�Y�ZZ>ZKZXZaZnZ�Z�Z�Z�Z�Z�Z�Z�Z�Z�[[[[3[_[l[[�[�[�[�[�[�\\\;\G\S\f\s\�\�\�\�\�]*]k]z]�]�]�]�]�^^_^|^�^�^�_P_�_�``+`:`I`X`p`�`�`�`�`�aaha�a�b0b�b�cc&c2c:cBc�c�c�c�c�c�c�c�c�c�c�c�c�ddd7dNdpd�d�d�e,eDe�e�e�fff3fYflf�f�f�g
gBgZg�g�g�h	hh<hEhNhWh`hihrh{h�h�h�h�h�h�h�h�h�h�ii7idi�i�i�jMjnj�j�j�j�k%kFkrk�k�k�l/lSltl�l�l�mm$m]m�m�nnEn�n�n�oo=oJoVocopo�o�p)pTp�p�q
qgq�q�rr^r�r�ssgs�s�s�t"t;tjt�t�t�t�t�u%u4uDuSucusu�u�u�u�u�u�u�u�vvv#v3vyv�v�v�v�v�v�www(w;wVwqw�w�w�w�w�xxx1x@x�x�x�x�x�x�y.ybyy�y�y�y�y�zzz-z@z�z�{!{9{Q{h{�{�{�{�{�{�||<|\|{|�|�|�}}}.}F}V}f}{}�}�}�}�}�}�}�~~I~�~�~�~�.b�����������������7�����ȃЃ؃��
�3�G�U�t�|���������������ȄЄ؄������υ݅����$�7�J�p�����������܆���0�G�^�����Ň�
�8�^���������Ԉ��
�(�C�a�}�������É҉�	��*�?�K�T�]�f�������Պ���(�8�A�J�S�\�e�������ċ�	���8�D�a�������>�k���َ�7�i�������ю�� �K�y�������5�e���Ӑ��!�5�I�l�����Ւ�.�Q�������������������Ӓ��&�C�d�������ēԓ����&�6�F�U�e�u���������ʔߔ���1�D�W�j��������ӕ���$�7�I�^�r�������Ö֖���#�;�T�l�������̗���2�J�b�z�������Ϙ��
�!�6�K�e�z�������љ���-�E�^�}�����͚���6�M�l�����ۛ���*�D�T�e�����������ŜҜߜ���%�7�D�P�]�j�w�����������ŝҝߝ������F�ߥ����!�1�E�V�g�u��������������"�M�p�x��������#5�	3!%3''#7'377##���(()|__�+�u^��l[Mbb
��p_;;��s	O�	3'&&'#3#'#��
�˰˜'�(J<<1m44m����t��J2�"332#32654&##3254&##J�Dl?6:FHBqG[A6014BOv9=O�F?+S
KACT)�+%$�ZX+&6��:�"&&546632&&#"3267dQ�TS�W>d!Q7$E[]I#;QQL�ml�Q3 [pbdp Y`F4�
332#'326654&&##F�_�NM�[)3M++M3�D�pp�Gw(\NNY%\�3!!3#!\�����&�|�{�|i�	3!!3#i������|�|�,��#�"&&546632&&#"32675#53WS�PP�TB^Q2'@UNM#
_�!mL�mm�P3 [pbdp

px��0@�33353##@���������t��J�353#5!#3J��Ę�|�||�l|;���"&'73265#5!6u+U9C23��.k0<[H4C'{�R@j@DR�3333#D����֣�K������wc�k �33!k�"���|:�333773#54>7##''#:�@@�|22H3/��ZZ�t�QXP����PXQ�B�333&&553#'#B��8���8����4:�tE�6|:�&��2�"&&546632'2654&#",MwBBwMNvBBvN3<<33<<N�om�MM�mo�NljekkejlK1�332##3254&##K�GsEFtETKx=;K�'\OLb/�Rh3*&�NG�&%2654&#""&'&&5466323267,3<<33<<�_�XjBwMNvB`QC#
0llqekkeql��bL��m�MM�m��"n	FH�332#'#3254&##F�ErE@4��}MHw<;H�%XNH]����`a0&2��'�*"&'732654&''.546632&&#"*B�5U%Y//-6/T$@'=lF;r,K"D0%-</OAK;q0.e& #$/F/6X4,*]"TE6\89�3#5!#���||��@���"&5332653.ww�-./-�s���`:??:��o�I�
3336673�ŜNM�����5f66f50�tT�!3336677336673#'&&'#[W�,^)�P�&
&���*N,,O)��(O--O([�t�@@�F�33366773#'&'#���?
:����GDO={44{�����0;3�H�353366773�ҞBB�����%I''I%��P�8#�	35!5!!81����5Y�{Y�I|=���%"&&5467&&#"'6632#'#'2675�2I(��42$I*43u@hxx%[!:IQ &(D*SX
"&`&nr��8(rR"H��)�"'##336632'2654#"RH?s�H$]k=bY)8[/-.B6��N�rUy?xFL�.�C��#�"&&546632&#"3267WN}IP�L;`D77@PN='A;-l=uRSt=&['LA@M]%$/���!"&5466323'53#'#52675&&#"^s=a6);�xH+)(<2�yQu>M��C3$x�CGIE7��#�"3&"&&546632!3267>+<�KN|IJvBMh5��L="=!1+h�./]�h=uRRt>?kD%	62YRI�3#57546632&&#"3#Ճ�.cM+L4]��}m
9]6l	
Ws��4�-<�0<J"&&5475&&54675&&5466323##"&'3322654&#"2654&##"'@f;M!&;a8.$�d7\:"T\bgH�R,,++,;K,+>3#D�9,=&
)2B+<P(l#9I$
%:C4Q.�*('**'(*��#H�3336632#4&#"H�Q8SN� )-��_-l^��2.����O��&U
-��*�<��&�
-LI�33373#'L����̟�I��k����N}2�� �"&5#5!3267�]`�/2&!'?p^�t��.#	l
#>�33366326632#4#"#4#"#o
2+D5+5:�s
�=+Q"/VJ��R-0��R-��H�3336632#4&#"Hx T7TN� )-�B .l^��2.��/��)�"&&546632'2654&#",BsHHsBBsHHsB3333333=uRSt==tSRu=wM@ALLA@MH�H)�336632#"'#2654#"HxN(]j=b8D6U)9[/--��2#�sUx?6Q�$FL�.�/�H�!57##"&5466323732675&&#"}D#^s=a6*As�+)(<2��P �yQu>!3�X$�CGIEt$�3336632&&#"tx%i;!)%.Y �l=;

{6C��5���'"&'732654&&'&&54632&&#"(C�/?.e5)&41eXzjCm'B%T)"#4?MT"}-\
K:EV+X+:)C]1��&�"&&55#57733#3267�O^)}�y��270!O7bA�m��s�80j
>��
�"&5332673#'#�UL�),�x!Ql^2��1/!F�G%.9�
33366773ڻ�NN����%M''M%�T� 33366773366773#'&&'#UQ�k �L�	��%H&&J#��%H&&H%�� H+:Y�%2�3'3366773#'&&'#%���3


,����9
1�P+,P��R,+R�>;�"&'7326773366773�&+1
גS
I��<U�p$��#K'%K%�>U*F�	35#5!!F����O.sN��s��	O~&���	O~&���	OC&��	OT&��	ON&��	O/&��	OP&��	O~&	O�
+"&54773'&&'#3#'#2654&#",3?+�;S"@j�
�˰˜'�(��6-5�R(
/ -6��<<1m44m����t�����	OT&	�g�	%3'&&'#"&54667#'##33267��
�1D(('�(�˰�*3
#;J<<1m44m��2. 4%
����t9 
J��	�
O�&-��	Ov&��	O&T��	O&V��	O�&X��	O�&Z��	�
OC&&-��	O�&\��	O�&^��	O�&`��	O�&b��	�
OP&&-��S�3#!#3#3!5#�T
���s�vv���v-d]1]�q�|�|�|������S~&M�[����S/&M[	4�!*35#5732#'3254&##3#532654&##TKK�Dk>59FHBrGRFu8=Fjj95233:�E�E;*K
OEDY*lf3-<K�)'$��J�D2�&<	��6�:�&3+��6��:~&�5��6��:C&5��6��:T&5��6��:d&5��F4T&��F�
4�&-���F�D4�&<���F�4�&3���4��E�3&&546632#7326654&'�&"74:9za��DxO
!2?<5""+^UCDi<��s�Hw)^Qm_��\~&���\~&���\C&��\T&��\N&��\/&��\P&��\d&^�-�!"&54667!!!3#!#3267�1D&�������%)#;�2.3&�|�{�|)J��\�
�&-��\v&��\T&��\D&T��F&V��\@�&X��\�&Z��\�
C&&-��\�&f��,��#~&���,��#C&��,��#P&��,��#d&��,�#�&0��,��#T&��,��#/&��,��#T&,��`21&&#"32675#53#"&&546632&&54632&&#"Q2'@UNM#
_�!m>S�PP�TKB'
E[pbdp

px��0L�mm�P7Nm!��@C&	��@N&	��@�
�&	-����&	3�_��@��&	9U�3#57533533###35#@==���==�����E^]]]K����S��J~&
���J~&
���JC&
��JT&
��JN&
��J/&
��Jd&
��JT&
J�� "&54667#53#5!#3#326731C#�����*#";�2. 3%|�||�l|1J��Jv&
��J�
�&
-��JP&
��;��C&��D�R�&0��D�
R�&-��D�DR�&<��[ ~&
����k &
����k� �&
0#��k�
 �&
-#��*�
 /&
&�-#��k�D �&
<#�� �
35'737!k@2r��1�"�&X@J��dX~�|��k=�&

����:~&���:d&��:�
�&-��B~&�
��B~&�
��BT&
��BT&
��B��&0��Bd&
��B�
�&-��B�D�&<��&��2~&���&��2~&���&��2C&��&��2T&��&��2N&��&��2/&��&��2y&��&��2P&��&��2T&&�2�!-"&5467.54663232672654&#"B1C+Oh3BwMNvB`P(!#;33<<33<<�2.)=
^�Xk�OO�j��#5JSipekkepi��&�
2�&-��&��2v&��&��2&T��&��2&V��&��2�&X��&��2�&Z��&�
2C&&-&��S?("&&5466326654&'7'2654&#",MwBBwM?4
ms'+BvN3<<33<<N�om�M	'$#,5r+�Wo�Nljekkejl��&��S~&����&��S~&����&��Sv&���&��ST&����&�
S?&�-��&��2�&f��D� )77&&5466327#"'7&#"2654&'EBwMV=5PDBvNT?6Z�(3<o3<�
b)oEm�M-K4a(mCo�N.Ls$� k��lj"�!����D~&��S�!"&&54663!#3#3%3#"MzEH}O"�yy���!00G�pp�D{�{�|w�%XOO\'��FH~&���FHT&��FHd&��F�H�&0��F�
H�&-��F�
H/&&-��F�DH�&<��2��'~&���2��'C&��2��'T&��2��'�&h��2�'�&3��2�'�&0��2��'d&��2�
'�&-@��D�$"&'732654&''7&&#"#46632�1P<!)6@V
+\�3iQ\vRG=(S$Y"$ 8V} ��b�Cg<eRx%ZA3R0��9T&���9�&3���9�&0���
9�&-���D9�&<9�3#5735#5!#3#�^'��E�||�K��@��~&���@��~&���@��C&��@��T&��@��N&��@��/&��@��P&��@��~&��@��y&��@��T&@��$"&54667&&53326533267B1C	fi�,./.��<##;�2.1!�w��`:??:��o�;1J��@���&P��@���&I��@���&R��@���&L��@�
�&-��@��v&@���B#"&53326536654&'7swww�-./-F,
mAV������`:??:�.",4=B��@���~&����@���~&����@���v&���@���T&���@�
�B&�-���
I�&-��T~&���T~&���TC&��TN&��H~&���H~&���HC&��HN&��Hd&���
H�&-��Hv&��HT&��8#~&���8#T&��8#d&��8#C&��8�
#�&-
��8�D#�&<
4�3#5732#'326654&&##3#FFF�^�NM�Z)3M++M3ll*ED�pp�Gw(\NNY%�KI6�3332##53254&##I�[GsEFtE[Rw<;R�c'[OMb.{�h3)2��0�"&&547!&&#"'6632'267#/JrAg?7"7D"]>NuABsL);�9P�iVOe )P�kj�Q@UU@A��,�"&'7326654&#"#36632i0 
0+7��G+:\6X	�!YTq]&$�1�>#'A�z��J�J�33"&'732653J�y"+ �!P��t�
m')~��6[7&A�333"&5463233&�i ))  ((6�i���|)* ** *�����|��.�JW~&'��h����=��/&���=��/&���=���&��=���&��=���&��=���&��=���&	��=��&=��n)4@"&54677"&&5467&&#"'6632#'#'26752654&#"@AC�;M)*C�2I(��42$I*43u@hxx%[!:IQ &P8=++{J#
6!+=��(D*SX
"&`&nr��8(rR"	��=���&=�.�,7"&54667'##"&&5467&&#"'66323272675�1D(%[02I(��42$I*43u@hx83!?�!:IQ &�21 1#
:((D*SX
"&`&nr��4AIR"��=�
�&-��=��&��=��U)&S��'��)&U��=��>2&W��=��F&Y��=�
�&&-��=��t&[��=��t&]��=��y&_��=��E&a��=�
�&&	-��Q�3@"3&&"&'#"&5467&&#"'66326632#327%3267&&55�({1M%F%;Jos"/4)Q(&;@$4F#�4$%'3I��
7)�-65.�h("("P>NZ.` )) AmA"32_�
-	,����Q/&�
����Q�&
��)�&"'###57533#36632'2654#"RH?sBB���I#]k=bY)8[/--B6)FHGL1I�nRt=x@H|.���H�D)�&<
��C�#�&2*��C��#/&�*��C��#�&*��C��#�&*��C��#�&
*"��z6!&"&5466323'53#'#72675&&#"3�Te6V/#2�o? "2+"��yQu>M��C3&x�CGIE�b���/�
�&-��/�D�&<��/��&2�/��R�("&5466323'5#53533#'#52675&#"_s=b5*;���BBxH+'**<2�uNp<M*LGGF��3$x�!?BC@��7��#/& ���7��#/& ���7��#�& ��7��#�& ��7��#�& ��7��#�& ��7��#�& 	7�#�2"3&"&5467#"&&546632!3267327>+<�
3B# N|IJvBMh5��L="=!138 ?�./]��21#8=uRRt>?kD%	62Y".&B��7��#�& 
��7�
#�& -��7��#& ��7��#�& ��7��M)& S����#)& U��7��62& W��7��#F& Y��7�
#�& &-��7��#n& e��4�-</&"���4�-<�&"��4�-<�&"	��4�-<�&"
��4�-<�&"1��4�-<�&"��4�-<�&"��4�-<�&"����&#�e<�����&#�e<��H�
�&#-��H�D�&#<�� ��&#2�e��H��&#9�3#57533#36632#4&#"HBB���	Q8SN� )-)FHGL+`-l^��2.���O�/&U�-��O/&U�-��O�&U-��O�&U-��O�&U-��O��&U-��O�&U-��O���&M
-��O�&U-��O�
��&$--��O�&U	-O��!#5!�Z}s���*�<�&�-��L�I�&&0��L�
I�&&-��L�DI�&&<LI�33773#'L����˟�J������H{��2�� �&'��<��2�� 6&'���2� �&'0C��2�
 �&'-C��2�
 k&'&�<-C��2�D �&'<C2�� �"&55'75#5!73267�]`U2��/z2�2&!'?p^U1[K�t�D\^�.#	l
������&'�
����#>2&(���#>�&(
��#�
>�&(-��H/&)���H/&)���H�&)��H�&)��H��&)0��H�&)
��H�
�&)-��H�D�&)<����&3336632#4&#"'667#"&54632�xH1JE�!��'48	
(47)8=W�@-k]��!1-��"NE/3).7UKR}��/��)/&*���/��)/&*���/��)�&*��/��)�&*��/��)�&*��/��)�&*��/��)
&*��/��)�&*/�)�!-"&5467.54663232672654&#"@0B+<e=GtBBsH`M&$  @43333333�21)<AoKSt==tScr"5	AJNCALLACN��/�
)�&*-��/��)&*��/��A)&*S����))&*U��/��*2&*W��/��)F&*Y��/�
)�&*&-��/��)�&*	��/��)n&*e/��Q�)"&&5466326654&'7'2654&#",BsHHsB71%l
B4#+HsB3333333=uRSt=
.+#
07=M!a>Ru=wM@ALLA@M��/��Q/&����/��Q/&����/��Q&���/��Q�&����/�
Q�&�-/��)
 (77&#"'7&&5466327#"&'72654'��!33P9. HsBK=.9/ HsB%F�33���Q��.7!W6St=&7/8 X6Ru=KR@!���/��)/&����Q�872654&#""3&&"&&5466326632#3267#"&'��%w�2S12T3'=D"3E#�5!#3H$K>kM@AMMA@M!.55.�h=uRSt=*11*AmA"41
_'//'��t$/&-�1��R�$�&-0���t$�&-1��t$�&-
1��a�
$�&--���a�
$�&-&1-���/�D$�&-<���5��/&.���5���&.��5���&.��5��R&.g��5��&.2��5��&.0��5���&.
��5�
�&.-=��;�4"&'732654.54>54&#"#46632�)@"1*./('�2eLAS)./'Nd
 $3(,(+#<3��>c91M+$2%"&9,-K,RI�3#57546632&&#"Ճ�.cM+L4]}m
9]6l	
W���1��&6&/���1�&�&/2K��1�&�&/0D��1�
&�&/-D��1�D&�&/<D��1��&j&/���1��&� "&&55#575#57733#3#3267�O^)||}�y�Ҿ�270!O7bAFXm��sXL
80j
��>��
/&0����>��
/&0����>��
�&0���>��
�&0���>��
�&0���>��
�&0���>��
�&0	���>��
&0���>��
&0���>��
�&0�>�$�&"&54667'##"&5332673327�1D(!Q5UL�),�:1!?�210#J%.l^2��1/!F�4A��>��
9&0O���>��
r&0H���>��
i&0Q���>��
r&0K���>�

�&0-��>��
&0�>��n�!"&5332673>54'7#'#�UL�),!)m
7*x!Ql^2��1/!F'&+/77D�7G%.��>��n/&�����>��n/&�����>��n&����>��n�&����>�
n�&�-���
9�&1-��T/&2���T/&2���T�&2��T�&2���>;/&4����>;/&4����>;�&4���>;�&4���>;�&4
���H�&4-����>;&4���>;�&4��F/&5���F�&5��F�&5
��F�&5��F�
�&5-��F�D�&5</��&�/7326544'&&#""&&546632&&''7&'77�F13>9 6?rCqD>e:$C
0#�(w*2@&H"�(o@M<r�;>LK	:��;lIHe6-IKD<Y)ED8<�qP~HH�H)�"336632#"&'#2654&#"H�G%\k>b6%>U(:,0..�u�M�sUx?Q�$FLCC�H�E� "&'73254&#"#336632q)

/ )-�x T7TN!J�	mQ2.���B .l^��7\7*�<��"&'73265#5!�.K +15'�Z(d�i
36es�.<g?A�<#� ,33"&54632"&'732653"&54632M�I%11%&00�)

� M$%11%&00�9,"#++#",�l')�6Z7�,"#++#",���z�."&5#53327"&54632"&5#533267�RU\�$!& ((  ))�RU\�$
 %p^�s�.#	l
5* ** *��p^�s�.#l
B�<u/33"&'732653'7'7M��)

� M��H�d�H�d��l')�6Z7�H�b�H�bH��"�%"&53366323267>54&#"(hxx&Z02I(��42$I*43u�IQ % !:nr8'(C*TW"&a&#H��)� "&'##336632'2654#"Q"FsxN+>Y0=cZ):^,," 6�3$>pLVy?xDH��H��'� ,"&'##46632&&#"36632'2654#"S"Gs+_N$:"+*G$\j=`Y(8Z-.!!6�:`;l(.L�oSt=xAI}�4���"&'732654&#"'6632�4j+<=%AQM8: D i>I}LK$%]M@AL[&=tSRu=C��-�+%"32654'67&&546632&#"6632#"'�*8!"')�r!!$P�L=] @2@AW/b*DO.V>F;�@!��1A5!Y7St=%X+PD%-.E=*F*//�Vm�"/"&&57##"&&5466323'5332672675&&#"7H#B#>]4=`5)9�$��),%83�*E(? >uQQu>M��S%"l�CGIE/��l� -"&5466323'546632&#"#'#72675&&#"�]p<`4';"K?


x
H)-$72�yQu>M,H,l#%��3$x�CGIE6��!�"3&&"&'73267!&&546632X�
::1i*0!="=M
��:mLBqEI}�]/.�hX26	&Dk?>uQRt>/���!"&&546632373#'#72675&&#">_4=b8&CsxK+)(<2>uQQu>!3�3$x�CGIE��n=�7��"�"&&5467!&&#"'6632'267##Mj5S
G9"=!0+h1LwEHtH-:
�@mC%	51X>tRQu>p/1`��o�(2"&&'7&&#"'663273267#"&'744'326�BW,�
+-1&S%DbKC	
#">$4]	�( )>h?y"]:6$8(F	$:Jq@�	H(6F��"�*"&&54675&&546632&&#"33#"3267=FpA>5.0>nF7j+5 H&91eCR75>E+I:.k#E326
;2=],c]%��0���!/��"�+"&&546632'2654&##532654&#"<LzGLyE:`:(/39<h=$-,# ##9FD9tVXs:?2":
:22E"pcHMRA*�<.�"&'732655#575#5!3#�.K +15'���Z��(d�i
36�Fvs�L�<g?1�>n�,9"&'732677##"&&5466323'46632&#"2675&&#")g,1#I82A">\3>a4&8"L@ 

�b(,%83�a."?>oGLq>#(K0m%#�3afE�C>=C/�<�,"&'732677##"&&5466323732675&&#")k,1#M79H#>_4<b9N9s�g+*%?7�d0"?>oGLq>?3� dpG�C>=C@��� "&&54>32&&#"3275#53QI|L.Oc5DX"B/(#@'H9$\� j8rW?bC#%X B5ELSb�&�-9�%"&54673366773'2654&'#/IW#��R

R��$WJ�PB&A0�� 4##4 �h1B&BP\) +��9�#/"&5467&&#"'66326632&#"'2654&',Zn7.**>)R%%S(>*(/6nZ""#"^X,\*k

%**%

k*\,X^w$99$<�H�57#"&5332673}S8SN�!(-���_.l^2��1/K�XH�!346632&&#"36632#4&#"H+_N$:"++	Q8SN� )-�:`;l(.]-l^��2-��H�E�."&'732654&#"#46632&&#"36632i+
 )-�+_N$:"++	Q8SN!N�	m'*2-���:`;l(.]-l^��7\7��H�'��O.�&O
-O	�353#5!#3O�����s
ss��s����&Q
-�H�##73753y��Ͽ�F������G}�X��2�� �&'=�w)�� �	)354&#""&55#"&546325#5!3#3267��]`	RJ;.$�/��2&!'?]&��p^O?.,8zt��LU.#	l
2�E �"&5#5!327�^_�/1!-!'?�p^6t�P.#l)�<W�!33!#"&'732654&#"'7#)���WU?i>Hd#B=&,85+1����N�
lIIf5/"[82,1G��y�33!y��s��5�#'##"'#"&53327332675o

3+D
6+5:�s
�=+Q"/VJ\��-0O��-O�H5� 57##"'#"&53327332673�
-)D
6*4;�s
���a,Q"/VJ\��-0O��-O�X#�E>�+"&'732654#"#4#"#3366326632�%
s
�o
2+D6*4;A�m Z-0��R-���>+Q"/VJ��0O0��E� "&'73265336632#4&#">$x O4TL� #*H�l!%�B .l^��7)��4W4H�Et� "&&54&#"#336632327&@I #*�x P4SL
%�4W47)���B .l^��%!lJ�333&&553#'&&'#J��
	���
 	��<.\%���<.[&�/��)�"&&546632"3&27#,BtGGtBCsGGsCY�Y_�;tUVs;;sVUt;�``��jj��Q�%"&&5466323#3#3#'27&&#"�8f@@f8,"힀���/!3&8sXXs:tMcXtsBM7?�G?�#5.54667534&'66�8b;;b8|9a;;a9�.&&.$.&&.��=oOOo=��=oOOo=��CJ"IDDI��J4����#'##"&'73267�x%i;!)%.Z�l=;

{6C4����"&'732673#'#�!)%.Z�x%i

|6C�Cl<<4�E2�"&&55##"&'73266733267�=FY0+!$40�
.�/O/m56

|0(�("k
t�E$�"&&5336632&&#"3267IN^)x%i;!)%.Y 170!P�7bA�l=;

{6C�9/
k
t$�346632.#"t8v]5T!!A-GqC	{D;�J6�332#'#32654##J�9]79)��mGV('OV�G>:H���$<J6�73254&#3##33�VO'(^��)97]9��G�<$�H:=H�5�E�5"'3267#"&55732654&&'&&54632&&#"(99
)XI?.e5)&41eXzjCm'B%T)"#4?MT"} ij^3\
K:EV+X+:)C]+�<1�"&'7326546632&&#"�1A*&&%XL.=%"+""R�
f	+,�9^8i	
+,�9^8+�<1�%"&'732655#57546632&&#"3#�1A*&&��%XL.=%"+"��"R�
f	+,�E�9^8i	
+,�K�9^82�h'�23#5#5354&#"'66�O^)}�y��27/!P�7bA�m��s�80
j
1�E&�"&&5#57733#3267�O^)}�y��260!Q�7bA^m��s��9/
k
����X� "&55#57533533##'#'32675#�PIRR���VVx
K9'�k]NE����K��E%,�5)b'��1�#"&&54675#5332654&'53#,Op:/W�!2451!�W.:o>b5<Ys_%K94II49K%_sY<5b>>��)�"&5332654&#"'632*l��2-/3
-Kd9qyv
��@:\P;8mcl^�N9�
#'&&'##~��NN����&L''L&��T� #'&&'##'&&'##33677Q�k 
�L�	��%I%%K#��%I%%I%�� H+:Y�9�3>32&#"#'&&'#�;S=%(/גS

I	>V,p(-��#K'%K%�!9�353366773�Û64�–Zk#?&&?#k���F�Ez�"&&55!5#5!!327-@I������
%�3P+
O.sN��t%!lF��M�
%%"2232654'67#5#5!6632##� 	�J	�����*G+1:U\� $��5.O.sO��EL76<V94�<�"&'732654&#"'7#5!2Oo(CH,5EA70���=[3Es�7%\&:4.4
G�sN�3U4Jh6���<j�0;"&&5466323'53!#"&'732654&#"'7##'#7275&#"�,F')F+2 sk=D+P9.C9 #'$.nzY,!" @uOOtA.[��O�kO?e;^29/.	Q���,x3�!EFFG��N�0"&55#57733632&&#"'2654.5445#K�wDJz�!)(I1$'"12"1qSB2#44#A@l[�m��O#+>.1G'm#!(6(�4)�<��4"&'73265#327#"&55#57733546632&&#"r)
�4$YMDKz�"PD#
!K�l')~�*%
kjV�m��3X6l')��6Z72�3>54&#"'6632�BM A8*FI$pMDsE+O59(:5 /3)]'9/]G6QF'��E#�3.546632&&#"�5O,FsDMo%IG)7B MB'FQ6G]/9'])3/ 5:(��2�35#5736654&#"'66323#͗L]PM=4,JI&tOBoCG0���E0\*/3)\(8.]G7`%K�9#�35#573&&546632&&#"3#��L80GCoBPt%IJ,4=MP���E%`7G].8(\)3/*\0K�C�H�#575#5733#3#㠠��������<FyF)��KyK��/��*�+"&&546632'26654&&#"7"&54632,IrBBrIIsBBsI6!!65!!5****P�zz�OO�zz�Pw,k^\i--i\^k,�( ++ (B�J�!"&'73265#'##33&&553z)		
�8���8�D�m'E�6|:�����4:�6[7��/������/��/&���/��/&���/���&��/���&��/���&��/���&��/���&	��/��&/��n#0<"&54677"&&546632373#'#72675&&#"2654&#"4AC�;M)*Cu>_4=b8&CsxK+)(<2<8=++{J#
6!+=��>uQQu>!3�3$x�CGIE��/���&��/�
�&-��/��&��/��I)&S����)&U��/��22&W��/��F&Y��/�
�&&-��/��t&[��/��t&]��/��y&_��/��E&a��/�
�&&	-/�(�'4"&54667'##"&&54663237332672675&&#"�-?!
K$>_4=b8&Cs3';�+)(<2�211$	6$>uQQu>!3�4	AO�CGIE��/�<����/�</&6�
��/�<�&6
��/�<�&6	
��/�<�&6
��/�<�&61
��/�<�&6
��/�<�&6
��/�<�&6
��Q4�&@
Q4�	353#5!3Q��/�s
s��s��Q4/&@���Q4/&@���Q4�&@��Q4�&@��Q4�&@��Q4�&@��Q4�&@��Q�4�&N
��Q4&@��Q�
4�&?-��Q4�&@	��Q4�&P
O���"&5467##5!3267_1D6 *�Z2* 

?�21.?}s�3AQ�4�"&5467#53#5!3#3267N0D4۱�/��2(
@�21.?s
s��s3AO.�
!5#575#5!3#���Z���Evs�K�Q4�3535#575#5!3#3Q����/���seEZs�Kes��
#3267&#"&&'#"&54632#5!�" $),Q5T_WO,*�Z6-�/!V><I
5s�%P3Q4�	353#5!3Q��/�s�t��s��Q4�&R�<��QP6&R���Q�4�&R0��Q�
4�&R-��Q�
4k&R&<-��Q�D4�&R<QA�3535'75#5!73Q�T2��/z2��s�1[K�t�E\^�s����&R�
�����i�	#53#533353#533"&54632`\�NP\�^��&&&&s�t��ss�t��s.''''��Q4�&R=wQ4�
#354&#"535#"&546325#5!3#3�x�OH;-�/���[&

��s�=+*8	|t��G�s��	O���J2�l�3!!l����|��9�353%3'&&'#������9

Y3��Y|�1n44n1��\���8#���@�	&��2�"&&546632'2654&#"'53,NvBBvNNvBBvN3<<33<<�R�jk�OO�jj�Rtbbnnbbt�����J�
��DR�I�
33#&&'#ıŜNM��t05f66f5���:���B�B�35!5!%5!B�pL�z�||{{�||��&��2�@�3!##@ؓ���t����K1�?�357'5!!!?�������%Y��Y|��|��9���H���H�5&&5467534&'66�g{{gtg{{g�5++544,,4U
�ww�
TT
�ww�
U_?Q
0	O>>O	��
Q��F�C�35&&55336553�et�Q|Q�te�tm�n=��n��mt�9�'3535.5466323#5>54&#"d+AvOPuA*d�9669wEZ6[�NN�[6ZEwj&FN3UmmU3NF&jO�	3'&&'#3#'#'
p

鳰�� �!p^-~J<<1X99X����t��[F���3!#3#3'�:�����G^-~�|�{�|[F��(�33353##'Ń^��^�^-~����t��[F���353#5!#3'�YYFYY�O^-~|�||�l|[F��JN�����2�"&&54632'2654&&#"''b=^5t\\tt\ %&�^-~Q�l������`vOZ''ZOv`�Fp�!53366773'\��(		
)����^-~���(G&&G(��P�[F��HN���:�%)3535&&5466323#5>54&#"'�R)3]??\3)R�$  %�^-~w2wTU�II�UTw2wj+GL1a__a1LG+j[F*��N�,"&546632373327#"&'#'2677&&#"�Xl;`5,I�

,4>30 3/!7+�yRu?+8W9�v&l
%-Rx?,V,+CJHCH�O.�246632#"&'2654&#"'6654&#"H/aK7b>+*:O:Z0%O#b'8+*5),%'9��Dl?'P?2J`FI^-&;t923'8k>*)'HDI�I$�O1�>54.'736673� 9I*�42)0�-D2�$-"/���9 "j�GP�Z?nn|L.f*5��#�!-"&&54667&&54632&&#"'32654&')BoC-I+-D]a:{8!9j)2W@3E#<p�A,.:4'8B6gG5O9P91Im9) AO6Fj;�698=,>
EF��"�,"&&54675&&546632&&#"327&#"3267JNuA>4./>nF5j+6 H$82d"$++63<FL%:9g"D326:2>_+i^(V�E�&'6654&'.54675!#�s0D&H;"��=GE�?hM)=4VI�&'5T=_�RttVa`((2
7:ZA�O�>54&#"#4&'336632&0��"M7VE�N��96(!%��XS(T*6k]�7��!�"&54632"3.2667#,n��nn��n,�++�,��������^SOOS�!VNNV!=���"&&55#5!3267�HR!�%+,+ H2]?�s3th%.#	lI��J�!34&'33>7&&'U�&Yi=(I)DK"�E#XT'?#]:a@�$#1kb&&jDH8"��@�''&&#"'6632##���
3  2-Wh!��c�'%w
bn�N@�<I�&3326733267#"&'##"&'@�"!/�%19
>$%
����5+")4:�v*m./+-	<b8/�3.'736673�?O)�+''0�1M9^��= "Zb_)V�UW��];�E�7'6654&'.546675&&54675!#"3267&&#"�s0D8^7(C'051)ԍ1<81(.:P B3=A�&&*L>+H5
E-2ss/)"8t8-"%
0'Y3��%�"&&546632'2654&#",BqFFqBBqFFqB2002111=uRSt==tSRu=wM@ALLA@M
��N�""&54665#'665#57!#3267�SAz�
bK�R
&]MJ\)X�c	e�Rnt+bKl	H�O)�46632#"&'2654#"H@nEp~=a6"FV'8\+81��^x9�wUx? 9l7FL�J?g/��@� "&&54663!&&''2654&#"Al@Fp>(?'&);gA).-*(0/;qRVq7yV8Gh8wB=;T?H@G2��&�"&55#57!#3267�YF�J�� >cR�ms=r+ n
>��� "&&54654&'332654&'7&Nd/�1%/1�}9dB!C!S(>#c/-/LR-g@9x;���O?t#5.54667534&'66�8b;;b8|9a;;a9�.&&.$.&&.��=oOOo=}}=oOOo=��CJ"IDDI��J)�CD�
'7373'#�����w[��ɑ~�V7 ����� ��OEt%5.554&'3336654&'7�N[(�",{)*
�ol��@h>{R)>#><*@
��FQ2hB:|>�����B�-"&54673254&'332654&&'7#"&'#�O_,"�%&-|�!)XQ":4��>�74>l>4A]"6++6"4)HC)BC'15yM��#**#I�F�$'6654&'.54>32&&#"�s&5*QC(/Pg79\C0?RJC>E�&+
#8W><]@"# [H<=8#6)\H��.�)6".5546632'2654&#">54&#"G/[I,0cL5a=/)'?&?iD&6++:/#4R@B,*#<_D�Dk>&O?2O2M/G].0-(8
4=V%$2")'K9��!�
,7&&"&&54&'332667.546632�.RAC/*/lMa,�U*UwO-9b=Xy?z,"
	hT/��4V4"1
4\#\U
-<>7X3X�n�����O?t��OA*6654&#"5.5467546632i'/{:b;:.b%%*-,N1PX<`8,Y-GJH>3���?tSA�4U/Y3:L�Zn2�tSvA+U*��*��N>&��F��">&� ��A�O>&���=��>&����=���&����3��%>&���>��>&����>���&������B>&���=��>&�J���>��>&�J�I�DJ�(34&'33>7'667&&'U�&Yi=(I)DK"0,�%GD"XT'?#]:a@�$#1kb&#H=(W)&iCH80�O(� %2654&#"5.546632,42244223T1GsBBsG0Q3dPDALLADP��BgDSt==tSCfC-U-J�F�!'6654&&'.546633&"#"�r&)9iCKM�(Z$>NBI>E�&*
8_HUp7y>G.8#6)\t�O�!!3#t�������s�aL�S)�K*�'6654''7&&''7&'7�		4h9<�
x�<�Er_��
�2Z-"5 {p/6H{oeLlv���1d����'�"����$��0������������3��/�*��p*3773�/`�����.�>�[~�'1^-~[F��h:�>J���(���E����"&533267gR?�'[L.bZ!m	���8�#���8�#���8�!���+b����.�>��j-�m��i-�j��j-�l��s-�i���3�Pn���3�Pk��n=����o7�!M��h:�>J���;�GN����'6654&'7�$+\L&?�:J9,)4����.5467Z%@&L\+$�4),9J��t�'7<}�����[~������'6654&'7'7�%LH$6�<}�:J90#1��}���.5467'7�7$IL$
~<}�1#09J7������'6654&'7'7�%LH$6�^}�:J90#1�����.54677�7$IL%
C}<�1#09J&������#"&&#"'66323267'6654&'7_!?)%!?){	&
SAE8	3$	4#�/		;!%&����
#&&54677"&&#"'66323267O0EBR
%
!?)%!?)�&%!;		v	3$	4#��	O�J2�3!!32#'32654&##J���[EqDBoE_P;:;;O�|�#SHJ\)s+..%��J2���l�`�DL�	3#'53667>7!3#5!��U�%
YO���JBg%�(9:���\ev:Y^>��\ܼ���\�W�-3'&&#"'6632353376632&&#"####q	-C&x&B-	q�B%x%B[��.C����C.��������.��,�*"&'732654&##532654&#"'6632%B�5N&S.6C=@WC>47,(B"K-r=tz*)1AEw,1f#!.*)&m'#&"b(+^Q/K
P;C[.@�33373#5467#@�8���8���:4�D�t�:|6�����@C&�ER�33376632&&#"##E�:L"S7
!;˞�<���D2�#w���������"&'732667667!##G"
[�W
2C�BGb�b�tE{Fmy0��:���@�	��&��2���@�m��K1���6��:���9���F�"&'7327733773�(	.	ݜL64E��_�⾜���JV��H�5&&5467534&'6�lvvltlvvl�`1/4/1`Z~rq{XX{qr~ZU{	C>>C	����F�@�D^�33333#5@���K
z�����\ܼ-�!#"&&55332673�-!Mo;�:='�.iX��D6�t:�333333�OxO�������t�D^�3333333#5~KtK~;s�������\ܼ9�3#5!32#'32654##��>h?<e? .0c|�*XGN^)u,2V"6�3332#'32654##3"�;[47\:

&+R���)XHN^)u,2V����tJ2�3332#'32654##J�VJsBEtISJ:A{J��)XHN^)u,2V��!�"'73267#53&&#"'6632��ZNE+>M
��M>%;N$n@S�NP�`\$KT{IC^"3K�ts�G��D�"%26654&&#""&'##336632�I\1��2
[G]ees%]TTZ""ZTT]%�������~�����!5##&&54663335#"�I���8FDrE��LL:==��^LNX%�t`�&001��\~]��\Na��:�""'732654&#"##5!#6632�*
+$����%3Y6)F
p631��||�+_NNY%��l~&��7��9�"&&546632&&#"3#3267gU�QT�T?d!N8#;V��
SC(?NRG�st�K3"^CI{UJ$\`��2��'���J�
��JN���;������E�#+"&'732667667!32###%32654##+
7U15[8|2!9%$'L�6;i�Z�(XHO^).VfFYh+�,3UE�3335332###732654&##�V�7U13V6�V� #!#����(XHO^)��u(7/&8�5!#6632#54#"#��#Wh�H�||�Ye��H����ER~&����@~&������FC&�?�D�3333##5?����z����t��<�3#53533#32#'32654&##�ww���%GsEBqG*!8;:>�u``u_"OBN\'r(2+%&��2�"&&546632"3&&267#,MwBBwMNvBBvN-;	�	;-/<�;N�no�KL�nn�N+KJJK�NVRSUo�33366776632&&#"�ŜO
%NH	y���6e66e6�\S�#�2l83!73!l�������2�
3#57!!3#~LL�����F(|�K���De�23'&&#"'6632353376632&&#"3#5####q	-C&x&B-	I6
b'B%x%B[��.C����C.���\ܼ����.�D,�,5&&'732654&##532654&#"'6632�3`)N&S.6C=@WC>47,(B"K-r=tz*)1AdP��+&f#!.*)&m'#&"b(+^Q/K
P;Qb�E�D]�33376632&&#"3#5##E�:L"S7
!;�Ss*�<���D2�#w�\ܼ��X�3#5!37>32&"#"##��13'3 



,��p1|��03�$|����@�D^�333533#5##@���K
pa������\ܼ��6�D:�5.546632&&#"3267!Bj?S�W>d!Q7$E[]I#;Q7T��S�^l�Q3 [pbdp YB���H�H�35#57333667733#�_��BB��r��Fq�%I''I%���K��DU�333667733#5#'&'#���?
:��vWp7GDO={44{���\ܼ�0;3�,�D\�!#"&&553326733#5~+Lm:�8:&�K
{.iX��D6��\ܼ>*�336632#54&#">�+!Mn;�8>'��.hX��D5����J�
��WC&���	OC&�����S�M��\C&���2��0����@/&���&��2N&���&��2�����F/&�����Fy&���=���<���-32654&#""&54>76676632�91+*.(8kv�.TsF.2@#4I-L*5W5<jTTI>B7#
�ګ�o�T*

�803fLLs?T#�#332#32654&##32654&##T�;_8(,/8;b;gQ*$$)R^-%',]�92;623?/��t�3!!t����s���TF�3#'53>77!3#5!��n�
uO~��
1J
�׿` KF��`�����7��#� V�-3'&&#"'6632353376632&&#"#'##5#q

-C$p$C-q�A*p*A<�);i��i;)�<������0���)"&'732654##53254&#"'6632=o;9)T"F>[xoS2>+H)62m=Hn=%375Dv*]0c/_!>2:
722E"I�33366773#5467#I�#���	"��%].;��&\.=��I�&"
MF�33376632&#"#'#M�N.I5
��vO�[?)	� ;������
�"&'73267667!##I
v�o

R�"(J�J�}7o7SY%3�#33366773#54667##'&&'#%�;	7��
6Q9�66��OP!J �� LPOH�33353#5#H����������/��)�*H�3!##Hȓ��}����H�H)�+��C��#�2&�3#5!#��}ss�����>;�4�HB�#/:57#"&546632'536632#"&'275&&#"32654&#"�&CO*C%#|->J*D'$�!� �K�yQu>H��L�sUx?H$�DGIDFLCC���%2�3H�TI�33333#5H���O~�}��`��@�!5#"&&55332753u(#>`6�-4$��'YJ��.)�#5�333333#�IxI��}��}�#�T_�3333333#5#�FuF�;q�}��}��`��3�3#5!32#'3254##��&<`88`<&NN}s� H>@L p<9&2�3332#'3254##3&�$3Q00Q3$??�� H>@L p<9��Q*�3332#'3254##Q�i?d::d?icVVc� H>@L p<95���"&'73267#53&&#"'6632�4m'7F#>R��
L:F2?g:NLI$V17c2+#U#9sXVt:��D�%2654&#""&'##336632�!C^4��5]ATddk=PP>>PP=wec��_a����"�!5##7&&54663335#"{Gm��)97]9��VVO'���H:>G�<$��7��#/)��7��#�-�<&�*"&'7326654&&#"##57533#36632=%

,*(�BB���	H1\a9h�l)j`MX$��*EHGK,^-����E��t/&�#C��!�"&&546632&&#"3#3267[PIP�O9[!?;"8N��R>%D4*j:tVWs:Y,1c71Y%��5���.��O��$��O�N��*�<��%���@� '"&'73267667!32###%3254##.	4S11S4�3

DJJ�-G�P� H>@L }>}>EK|<9$?�3335332##5#73254##$�O�6S//S6�O�CC𳳞 H>@L ��p<9���I��MF/&$���I/&"����>;�&-
K�T
�3333##'K����~�}��� 2t3#53533#32#'3254##������&<a88a<&OO�tWWtW I>@K p<9��/��)��%K�33366776632&&#"ֱ�K
	EA	]��%M''M%HXV|#��x�3!73#xw	���/�
35#575!#3#�SS�����E�srK��Tc�23'&&#"'6632353376632&&#"3#5#'##5#q

-C$p$C-@>a%A*p*A<�);i��i;)�<�`������0�T�+'&&'732654##53254&#"'6632�+S,9)T"F>[xoS2>+H)62m=Hn=%375bO�� ]0c/_!>2:
72=J�M�TR�33376632&#"3#5#'#M�N.I5
_Xl3vO�[?)	� ;�`����S�3#5!376632&&#"#'#��3 E0

��h3}s�[A'� E���H�TI�333533#5#5#H���O~V���`����C�T#�'&&546632&#"3267YsP�L;`D77@PN='A;B#���hSt=&['LA@M] ��H9�53366773�ǔP



P������'F$$F'�� �H8�5#57333667733#�M'��P



P��n���E��'F$$F'�[K�%�TA�3'33667733#5#'&&'#%���3


,��Za|#9
1�P+,P�~`��R,+R@�TJ�!5#"&&5533267533#5h% <]5�*1�O}�'UF��('��`����H�#��V�& 
��2�� �'��=���&
����Q���7��#�&
��7��"����I�&"��/��)�&(��/��)�����>;�&-���>;
&-��/�����/���&e
C���$0"&&5467&&54667>7'32654&'%?f=]G+D5bB:@$C"CA!;%DL<l�:'(;-#4@6dDTd H-49	�


,jQEj<�49;>+;
F��Q4�?��Q4�E��Q4�R���u�)5AE"&''26533&&554632"#&&'#"&54632'2654&#"53
�e


-1
�a-�1JJ11II1J�q�{3[z1_@Cq��/[z1_@COXWQQWXOZ"+,"",+"�NN��J�2=6654&#""&&5467&&5466326673&''327&&'�
	%D]0?*'I1JS%8= 	�, 3(#CG%Y}1(  "@
�%.'��3U2AS&G/M/PD)A4; K+;n3 	w."�%.C$%8�� �'"&54632'26654&&#"7"&54632,n��nn��n 33 44,, ++��������r(`RS\&&\SR`(�*"#))#"*O{353#566733O��AN%l�wo[
��w3�35>54&#"'66326633:[�L62&?O2hICd9Aj>?�TM}i-/1'O232[=5oo6|*���*"&'732654&&#52654&#"'6632Rv%D P+4C"SK^M2,%A!J/l=Ej;@9<RFs2(]$'$)h/&!%Z&+)M81FM>;S+#.{	35467#5!533#��$D��	�PPkO6�n�e~��p�.��{"&'732654&#"'!!632Rt'B I-6EB2, A���(,;c<Fq4%]%2102*A|w*WDFd4<��!�+"32654&".54>32&&#"6632=<B%&;4*1\I+.Mc4Df M< 'C*"S$8X4?h%"L9161+��$LwTY�T)-X&WK!$*WCB_4>{3>7!5!�+D2���<K(P�wt?|ZCv{�]=���&3"&54675&&546632654&#"2654&&'+n�G1(58a?_q5&2E8k"0.,#1G,8'D.#BaM;IH26O*_O,GLA2P.~,1%-$%',��'(%3*/5���*3267&&#""&'732667#"&&546632�4+=A&%<NCg!N='B+"T#7Z4?h=BuJ-Na�1+"K91�.X&XK!%*WCB`3A�pY�T)8�� �!"&54632"6654&&267,n��nn��n(�3 '�4��������*��*Va'�@	)Uc*O{
353'733O�`H�t�wBCQ���w8�� N'"&54632'26654&&#"7"&54632,n��nn��n 33 44,, ++��������r$TGGP!!PGGT$u*""**""*OB353#566733O��AN%l�w6[
�5w3N356654&#"'66326633:��62&?O2hICd96^;?}TY�8/2'P222\>0\W+|*��N*"&'732654&&#52654&#"'6632Rv%D P+4C"SK^M2,%A!J/l=Ej;@9<RFsZ2(]%,(*h2*!(Z&+*O84IMA=W-#��.B	735467#5!533#��#C��	�PP�wN7�Z�e���p�.��B "&'732654&#"'!!6632Rt'B I-6EB2, A���&;c<FqZ4%]&7552*I{�	*YGIg6��<��!�s>��B
>7!5!�%NC���<K)Nm��V{ZD{��`��=���u5��N+3267.#""&'732667#"&&546632�4+>$0%<NCg!N=%A,#S#7Z4?h=BuJ-Nas55$9@2��-X%YM"$.^FEb4A�p_�Y+8�� N"&54632"654&&267',n��nn��n%�3 %�4���������
�#.JS#�y�!-JX%OB
353'733O�^H�t�wAQ��5w8�� �'"&54632'26654&&#"7"&54632,n��nn��n 33 44,, ++��������r*dUV`''`VUd*�*"#**#"*O�353#566733O��AN%l�w�[
��w3�35>54&#"'66326633:\�L62&?O2hICd9Aj>?�TMk.47'O235`A6qp7|*���*"&'732654&&#52654&#"'6632Rv%D P+4C"SK^M2,%A!J/l=Ej;@9<RFs2(]$)'*h2'$&Y&,*O93IP?=T,#.�	35467#5!533#��%D��	�PPq O7�_�f���p�.��� "&'732654&#"'!!6632Rt'B I-6EB2, A���&;c<Fq4%d*4424+I|+YEHe5<��!�+"32654&".54>32&&#"6632=<B%&;4*1\I+.Mc4Df M< 'C*#S$8X4?h."O>383.��%NzV\�V*.X([N!%+YECb4>�3>7!5!�+D3���=K(R�|x@|[Cz�`=���&3"&54675&&546632654&#"2654&&'+n�G1(58a?_q5&2E8k"0.,#1G,8'D."BdO<KK38P,bP.JPB3Q0�,6'/''(.��)*&6 +25���*3267&&#""&'732667#"&&546632�4+=B&%<NCg!N='B+"T#7Z4?h=BuJ-Na�3."P;2��.X'\N!%+YEDa4B�s[�W*8�� �!"&54632"6654&&267,n��nn��n'�3 '�4��������:��-Yc)�0,Yg+O�
353'733O�^H�t�wUBQ���w�����"&54632,4@@44@@D12DD21D��'��'66'#"&54632�%CA*BB.>>j�VI.51/8[Q_�������"'�C�����'�"'�C�����Y�#"&546323"&546323"&54632[)33)*22�)33))33�*22*)338()77)(88()77)(88()77)(8����7'3"&54632��0+99++99�����9-,88,-9�R��73"&54632�`I+99++99�����8,-99-,8b����&7&>54&#"'6632"&54632�+. * 0R$c;:\7!/.<+99++99�(<.'& K(2$H7(7+)2#��9-,88,-9g�F��&"&&54>'33267"&5463249]7!/.�+. +1R$c5+99++99�$H7(7+)2#(<.'& J(3�8,-99-,8�/��''3�#�#/푑�R/�'��{���"��"&5467632-7>WX&48
(36"TLR}(ND02).7�"��'667#"&54632�'48	
(47)8=W"NE/3).7UKR}��3"�'��{����E"$�'��{������������E�$�'��{�������"��&&54632#"'gWW=8)73)
	84"(}RKU7.)3/E���%'57Z��>���7�����7'7'7�>>�7��7����*�'��{����;.�'��{����F~���F~���F~�P�675!P��oo�X655!X�ooP�675!P��oo���X6����������e��%"&&546632,.K++K./J++Je*I..I**I..I*vS��%"&&546632'2654&#",4S//S45R//R5,77,+88S/R23Q//Q32R/K:..::..:�r��7!�.r(���`��7!%35#�R����`L��F�zr��753z��rD��Z`��753%3'Z��ղY`x��F��T��73�D��Td���4��7377'�y��C��4���yYZzR��%5!*�d�RD��Z0��%5!'7#*���Y�0x����|T��%%5%3���DT����Y4��%%5%3'5��yF�4��\y�Z�k��7!'26654&&#"�<�*B&&B**B&&Bk6��%A))A%%A))A%�XJ55!X���<�\��5!<�nn<����5!5!<� �^^�^^>I�5!>�ISS�c����"&'732667,x�g&A��??��A&g��=?C$++$C?=��M��
&&5467�arraRYQQY�V捍�VAW�wv�W~�M��
'6654&'7�RYQQYRbqq�AW�vw�WAV捍��h��!#3�(���\N�@Nh�h��53#5!h��(�N�N��j�h��/"&546654&&'5>54&&54633#"33�`Z<66<Z`M)>(/55/(>)�=Q$53!V"36#Q=N*(O,93		39.L)*Ni�h��/532654&54675&&54654&##532#i)>'.66.'>)M`Z<66<Z`�N*)L.93		39,O(*N=Q#63"V!35$Q=J�`�3JI{���f���m�3��J�`�3���{I�f���m�33낂����H0��H@[67'7'7737'�@a��N��a@t[,�DG+��+GD�,�Y����5'37'�	��	v	��	Pv	��	v��Y����75'75'37'7'�	��		��	v	��		��	P�	v~~v	��	v~~v	�G���1>"&'732654.5467&&54632&&#"654&&'7j"T3<&=C=&-%
^T:]D86'?E?'+)b� 4=$6O(%T)+K3+A/&D)DU)\' -@-,A&C[�!% ( 0���
%"&&5466333 AnAAlA*4��4hLTb)�9���$��w���&Ȍ�t��>���'��v����D�$=I7&>54&#"'6632"&54632&>54&#"'6632"&54632N	%AJ'?V! 4+99++99�	%AJ'?V! 4+99++99�/G;7
TI>+@314!��9-,88,-9/G;7
TI>+@314!��9-,88,-9<��D�$*6%&>54&#"'6632"&54632'3"&54632f	%AJ'?V! 4+99++99���0+99++99�/G;7
TI>+@314!��9-,88,-9����9-,88,-9���$*67&>54&#"'6632"&54632'3"&54632N	%AJ'?V! 4+99++99��0+99++99�/G;7
TI>+@314!��9-,88,-9����9-,88,-9@����(7''36654&#"'6632"&54632�
v%<,&<Q(v<Af;$54"8(44('44��\\(1((+K.1(J41D1%$��7))77))7\�F�(%#753267#"&&54>'2#"&546q
v%<,&<Q(v<Af;$54#8(44('44�\\(1)(+K.1(K31D1%$7)(88()7���3!#�(��N��h��!#5! �(qN�A�z�{33�p���MNh�z�{533h�p�N�����h��!#3%3#�\����11�\N�@NN�h�h��53#5!'3#h��\�11�N�N��N����!#�'��N��h��#5! �(\N�V�h�33�p�����Nh�h�533h�p�N`�R��E�;"&&546632'26654&&#"7"&&546632&&#"3267,L�MM�LL�MM�LAb66bAAb66bM2N-1O-'57%'&!/7	Q�gh�OO�hg�Q=D{RRyCCyRR{DK0Y<;V/=
>,3<
D��E�,4"&&546632'26654&&#"'32##53254&##,L�MM�LL�MM�LAb66bAAb66b:�+F)*F*<	Q�gh�OO�hg�Q=D{RRyCCyRR{DWm901@[�@e7��)2"&&546632'2654&#"'532#'#532654&##+6Z66Z67Z55Z7?QQ??QQY#.*<74[;;[44[;;[41SFFSSFFS8� "M<<d��jR�5#53#333773#57##'#BO�Nqg""gT5:6j�WW�:^GG^��`s��s`��^R�&:"&'73254&''&&54632&&#"733773#57##'#k!72#*%>7 8,") Bng""gT5:6^<	*&);=
	

(%(?:^GG^��`s��s`�m&�/9".546632#'##"&&5466754&&#"32672675S<oV3R�QLa.N<)$:!=pL:-/Z;=a6-;**U$F9�1b�f��SAoE��3#&?'6E(	%@'>�nh�CIK\$!��&�0:".54>32#'##"&&5466754&#"32672675S<oV31Vo=I^-N<)$:!=pL?>#G<$=a6-;**U$F9*T�W\�T(;c<��2#&?'6E'
)?=eHTo6I[
$"F�37#7#537#53733733#3##7#�i
h�KW
P\TiTOZT_Uhn�y�^n^����^n^���T�'7'7737'�@R��N��R@e,�8H �� H8�,~|��675!|`�oo��|��6���|��6�@���'-3'7&&'77.54632237&&'#74&'27"W'L@3)N2wdX"7I*O47iM`J�Es
�
#dr)@1L[�
�$Th*A11P.�
a,	Z��l�
�2���x���2���x�
�2���l�
�2���x�
2���l��2���l�
2���x��2���l�
2���l�
2����X2���}X2���ol�2����v�	2�:��"&54632'2654&#",KbbKKbbK))**�nbbllbbnR8FE66EF8��F��535#566733�ym08Ui�Z�C��Z��F��'6654&#"'6323�Yf# -$=>aEUD8��9A]$!08QF>0S1Z��:��'"&'732654&#52654&#"'6632*7XA.&25*/!&= I1'B(B&+-I�''3>7# 0"<1#$6��F��53533##5��Ok\_::_d6'�ddGVV��:��"&'732654&#"'7!#6632*7WA.&. -�
%>&[�''3" �[79(:M��:��
$"32654"&54632&&#"66321$)"4T]f[/:*$.01=G'C

)$6�p\^tD

71B9'>$��F��>7#5!�2#�:.3�=_[4[::fkA��:��$0"&54675&&54632'6654&#"2654&',HX,%#!V=@SE()X7""/!"�@."3*299293%.A��
��:��%73267&&#""&'73267#"&546632�!#(#%.=*%/.1=G'D*T\dQ
)$��D71B9'?$q\]t���&.54667J'11'O/))/��/U]<<]V.(?uA@v?���}&'6654&'7P/))/P'00��(?v@Au?(.V]<<]U�=l��"&54632,%%%%�$%%$��v��'66'#"&54632�&(''HA��7
#"a9Q����D"&54632'2654&#",@TT@@TT@\MNYYNM\O'33%%33'��8!5#56673Q&*S�@����D356654&#"'66323�>T>A(;G2\7)L#8$:3"AW����D%"&'732654&#52654#"'6632-F#)-#& '#*E(2E#NB7	>1(!
&,8��D7573533##5�`LMA^33^=3��XXB==����8"&'732654&#"'73#6632."D#)++Յ
2;LB�X#3..@����D"%"3254"&546632&&#"66321
$GO%I6 7*
&"'.6G� �^I-M/=."0..B��83>7#5!�&�&(-HE'W8+MS5����D$/"&54675&&54632'654&#"2654&',;K'J35I#K.
6% !)22)
$$%6�

�

����D	#%3267&&#""&'73267#"&54632%
	#!6)
&!'-6G6GO%I���<
-!
0./A^J,M/����&&5467B3993OS+(Y8xOOx70am7i/����'6654'7O)*SO399Y0/i7ma07xOOx�lz"&54632,%%%%	%&&%�}vz'66'#"&54632�&(''#%A�8$#3/9P���+�{
7���7�o7���7�{7���+�{
7���7�{7���+�o7���+�{7���7�o7���+�{7���+�{7������7������7���.l�7����v�7���o��)���o��J���o��7�o��""&5467&#"'6632#'#'2675�2<ep93%#Q*DNS:#?2o<(3?+DIM�$N8�o�K"'##36632'2654#"O0)	Qh/>H)A>#8
o+#�u2\L8P*T+1U�
	�o��"&&546632&&#"3267[2P/4U1"50

'//$ )@o)M67M*@1)(1@�o�K "&546632'53#'#72675&&#"@L)A$&gT0
$ o\P6N*1t�, T�	)./+�p��"3&&"&&546632#3278*�#3T10N-ON�5%**"Gz  ��(M74M+\B">�w�R5#5754632&&#"3#JJGO3#<oow�M
8LK3
Q�����+7F%"&5475&&54675&&5466323##"'3322654&#"2654&##"&'@W4(B%�AP;
6<BGlV&1(	,�(+' 
,(5K:4
(,4C0�	
�w�K36632#54&#"�h5$83hw�u=I>˾��w�k5#53"&54632&}�7&&''w�Q��v"$$"���k7"&'732655#53"&54632�0"~�D)&&''�
I	 #�Q��(E*�"$$"�w�K3373#'�hqr|�pQ-w��~��~-Q�o�K"&5#533267zC=E�

&oL>Q��P0w"�!3366326632#54&#"#54&#"0T.""-
2"73hhwJ+"J=˾ܾ��w��336632#54&#"�U5%83hwJ+I>˾��o��"&&546632'2654&#",,L//L,,L//L,  o)M67M**M76M)S1()11)(1����7336632#"&'72654#"�U3>G)A%(4#8
��!\L8P*3_�+1U�
	���� %57#"&546632373'2675&&#"]-@L)A$*Q�
$ �c0\P6N*"�>��	)./+�w��336632&&#"�V@#
6wJI)(W#,��o��&"&'732654&'.54632&&#",)T/504"PF+E/,0-5#Ro?		&/:=
	%.>�o�""&55#57733#327mPBEJ
W��!"4oQAoMaaQn%J�o��"&553326753#'#�83hhU5oH=���.tw��
3366773�yh0

0cuwJ�33���&w�337733773#''#xRf&S(_OxwI�dd��dd���ZZ|w��7'3366773#'&&'#|oholioo"		w��4

4��44����7"&'7326773366773��h/(ctC�M@�//���@>�w��	57#5!3���#��w7�Q7�Q�p��
"'7"3&&"&&546632#327:}Fl7*�#3T10N-ON�5%**"G�nD��  ��(M74M+\B">�p��
"'7"3&&"&&546632#32704kGv*�#3T10N-ON�5%**"G�2�D�  ��(M74M+\B">����2"3&&"&5467#"&&546632#326732678*�#'".3T10N-ON�5%("1 
	*z  �d""&(M74M+\B" 
=(/
�p��"&54673&&#"'6632'267#'OP�/#)"G1N//M0&�%p]C">)M74M+N!!�w�N4632&&#"6632#54&#"�CI.5$83hwR:KL?H>�� �����%%"&54673366773'2654&'#/1:hh*
)ce91





�6,-�""��� -,6@�w�M5&&546632&&#"1@/M-3H3+ +3?w�$I7.<"A!7$��o��"&546632373#'#72675&&#">M)B%2&	PT2
$!o\P6N))!�� T�	)./+����+%"&'732677#"&546632373'2675&&#"H#3$#->M+B#,S\A
%"�C
&\F2K)��@D�
p	)(')�w�k	535#533"&54632�tf�j�&&''wQ�Q�Qv"$$"���ol�'2���@53ب�HH���=5!�
�AA>�=5!>��AA$?4S)7'7&547'76327'#"'72654&#"mIQ"!PIY0642YIQ"RIZ46/e$22$$22?JR.A?.RJZZJR-@!7RJ[N5-,66,-5@���+773254.546753&&#"#5&&@@/W/J*CJC*XLb4MI#?)E*BKB*WSb1hsd!-*>.AV��+ T.)>.?]��)C&�)356654'#57&&546632&&#"3#!C4BpT;gB>Y#O,07��#[P5
V)?\2*'P.0$[
$4|9{35#535#5333667733#3#⩩����==�������F7F%�!B !B ���F7F�-��G�1"&'#57445447#576632&&#"3!3#3267}f�?67A�j3_%Q4 2B�����D1#6Q(evqDEny(&O<8J
J8=L,0`���!5&&5466753&'66757av8a>Q'?C$;E"�%#$$)_
�mGhB
a]Z��]_\-A�@.��&�&"&'7>77#5737>32&&#"3#�!2
 WK/VE;&'s'Q`	l=9�e+I[+n+#7k�<a9O��3�/5"&7&&5467722327&&'667'7&&'o	13�JY�m23
7(Q
0)Q%X534")%&�c���s!�u��h\fl*O�kL(.c\j�a8]eC&�035667#573&&'#57&546632&&#"3#3#!C.?pOZC;gB>Y#O,07����#[B,D

E?\2*'P.0J
J*|<{#'+3'5#575#57533533#3##'#73'#'3'#3'#�"*SFFFF�TPjEEEE�TP�#�>1�0=
zz���626����<2<���m|<222K{3#575323###3&&#3267#eQQ�;dC
CB
De:,�
6,"",7
�|U� G=[9I#�H&"�'"P{!'3'#573373333###'377#377#*� KD �#w&w?E�A
�ꉉ�"9������?��"��h�((��(([2�)-%"&5466323'5#53533#'#'2675&&#"5!N]4P+$0��yHHd	;#"2*��tc[8P+CJ11D�n%ao+&/-�JJK{',13#575#575323#3###4&'#364'3&#327#eQQQQ�O|K??K}N,����|>"">}Y5.5�9F;
	;C?��
-	}##�&C���#5.5466753&&#"3275#53&Bf;9gCbU=Q4 AGK@#L�I)nfP�_\�U
he@Pqegm
zx��$f5���6"&5467#57367#5736654&#"'66323#3!327Gko<J�J�# 3F#W>\l	Dt���
%(AH=)pgU	ED
 O'0_RJK

%<^((O��3�!5.5466753&&'67CGn?=nIQW@Q"+#Q!O/�3.01nd	N�b_�T
][AO
�Z
(L$-e�Tk�lY{75327#573&&##5!#3##'YIt�Q�
F7I��:MK	H6����uGDuJ#?J@Q����'{ 5'75'75377>54&'7yD#gD#g��#��#�*H,yg�� @17!@2�~E@V7E@V�"8# [|=#5{35'75'75#5!#77�q#�q#���q#�q#��7@H77@H�kks7?I77?I�#5{3#57!#5!�g�����EK�L1JJ9{!35#575#5732##3#32654&##�mmmm�ClACm@=��74::47�E3D'&QAAR%2K�U7.504{35#57!!3#3#�LL����ݏ�aU�|y{PZaGp7'77'7\K�3�3�KI�/�0�I��Gph��Gph����H�'
��D&h
��F�'3?K"&54632'2654&#"'%"&54632'2654&#""&54632'2654&#"�6II67II7�&�X6II67II7-6JJ67II7�H<<CC<<H?''''�,�^�QH<<CC<<H>''&'>H<<CC<<H>''&'��Q|'�qD&h��G|'�qD&h���Q�'
�qD&h����G|'�qD&h
���
��G�'�qD&h
�����G|'�qD&h���
��G�'�qD&h�����G�'
�qD&h�����G�'�qD&h�����G|'�qD&h�����G|'�qD&h���H|'�qD&h�����G|'�qD&h�����G�'
�qD&h�����G|'�qD&h�����G|'�qD&h�����G|'�qD&h�5��F{!-5#56673'%5#56673"&54632'2654&#"�Q&+S��&�@Q&+S�6JJ67II7��@�,�^�]�A�H<<CC<<H>''&'����G�'
��D&h
�F^675#53533#���l��^�h��h�F~5!F�hhTp#7'7'77'�I��I��I��I�pJ��J��J��J�FIK"&54632"&54632%5!,"//"#..#"//"#..����+""++""+��+""++""+�hh������������F��&�t����F-g'��&���t�y%%5%��~���	�f����b�y75%5%5b	��������fF0
35!5%5%F�4̬���hh��z�y."".F0
35!%5775''5F�4�����hh�y."".y�zF675#53533#5!���l����̞�h��h��hhV�	3#''#V�v�y.--.��t����F(l77#537#5!733#3!XGY�I�H]GY�I��H(zg�gzzg�gz4�$�%".#"'66323267�/%$'X U./%$&XU�)))NC(*)NC��4v$&�t��F^~%5!5!����^�h��F^~7!!F��^ h�I^D7546632#54&#"I;fBBf;l@77@^�Gh::hG��CHHC�F^673!Fl`^��h��ye(4%"&'##"&&5463236632%267&&#"%2654&#"�5P)B.(A&ZI/A#L3-J,-N��$( 4"&+$10y.@%/0M-^h,(5/2V7Fb3�%!)0 ).$&./����"&&546632'2654&#"-(B''B()A&&A)%%%%�%A**A%%A**A%F)! )) !)�c��3��/cK����pc�&���v�cr�''3/�c������@�<I��<���+73267&&#""&&5466324454&#"'6632�.&A3*7=5Z57a>#D3;2@)Y4Ng4I��+,>L!7��0X=Eh; 	T`Z#'L�[r�_��b�""&'732654&&546632&#"�
'QN 'P�j>GM��RGoAk>GL��SFpA�p�#46632&#"r�QN
&�p�GoAk>G}�br�"&'732653�
'�P�j>G��qFpA!��Y4'736673�J�c�b�P�EG��**��|��9�a��9�u	O�#33736677#O˰˜'�(�
�
��t�����4m1<<1mB��35!5#535!5!B&����|�{�|�t��,5,c'��tA��A;��.{
55!!!;���⧮=xW"#W|��|��?{!#!&��x�
s����H�".:"&546632&&#"3267'77'7"&54632'2654&#"�?T,G(2/!!)9kK�3�3�K�@TT@@TT@8WO6K(<	
1)(/
=��I�/�0�I��\MNYYNM\O'33%%33'J���	)6654&#""&''667546323267;,+6Cl
71jQJW*[H./5!T�*X6 4��IKZ�~uZP>kd64,Y0��>�1".54>32!"32673!2554'&&#",9cK++Kc99cK+�b6T5_"&(r�
G&(H4\zFFz\44\zF�	<=3<HZ�

�
��8		5!!#��F�e���O�t���9	'3'�OO�f�E��E�����J		'7!5!'74E���f�EO�t�O����9	737*��O�t�O��F�e���F��]�	%'7'��
j�����j
�>��	7'7'%'7�S���j
S�
i��G6��	%%7'7'7���S�
i6j
�S���f6�	7'77ij
�S��6��T�
j
��8	5!!!!#��FN��((��NODU##UD��97'3'#'##nOODU##U�E��EN���((����J	'7!5!75'!5!'74EN���((��NEODU##UDO����9733737*��ODU##UDO��FN��((��NF����d�%'7!'57!'7d�M[��[M��M[$[M��<ll<��<ll<J��0#'7'73'7.�<ll<��<ll<8�N[[M��M[��[N<�S05!'#'7'73'7<���<ll<��<ll<�mmu�N[[M��M[��[N9Z:%"&&546632,Fn??nFFn??nZ?mDEl??lEDm?'H1L%"&&546632'26654&&#",KvDDvKLuDDuL2N--N22N--NHDuIJtDDtJIuDL/S45R//R54S/Hf.7!H�f�85S#A7!%!!5�hB��S�OP5S#A	77!%!!5I�C��`��S�?�WE:f9@b%	,��9��AeJ753A��e�AeJ753%3'A���pe�H�Dk(A73D� k���Dk(A7377'D� J��k���kkAQ6%5!*���Q��AQ6%5!'7#*���p�Q����0kA%%5%3� �k��*0kA%%5%3'5� �N�k��*��k
kuA73
d��k�����kKA%%5%3G��dk��*,M,G#7!%26654&&#"7"&&546632,�JqAAqJIrAArI0J**J00J**JM��AqGHpAApHGqAL,O23N,,N32O,7W!D+%"&&546632'26654&&#"7"&54632,EoAAoEFnAAnF0M--M00M--M01DD11DDW>pIIn??nIIp>H,O44N,,N44O,6E43EE34E��u�	7!%!!KGA����
lA��K:���-7!667%!&&'73667!K�9Z&A���4["�B.]#1R1�_
lA'EO(��K:�R�zMD=7p8c�R���p�&&'73>7�I5](=$f{CZd�=U�J==>xݼEN_���5��-�!"&&5466323'6654&'�4!-N/ OG6195m&$<$0^<*P*,Q��af����j�!"&&546632%#"&&546632b1 (E*"�eT2 (E*"�e&$<$�<��bf&$<$G$��af��X�#.5463236632.\u@W@2LL2@W@u^�vi6_g4DD4g_6iv�X�47"&5466327.546326632#"&'#!5667#�:I'@%$#"
W@@W
!$$%@'H;%IUF�hFUH�OC1>	716CC617	>1CO&3cR
99
Rc3&����\�#53.��..hi��X�!%#"&54>73#"&'#!5667C'9MCsXXsCM9'BUF�hFU�3'BF-OZxUUxZO-FB'3cR
99
Rc��]x+7EMU%"&&546632'26654&&#"'"&546323"&54632"&'73267'254#"3254#",Z�NN�ZZ�MM�ZDg::gDDg::g�iAQ/9''9/Q��
M�XY�MM�YX�MC;jFFj;;jFFj;�' && '' && '�B9!!9B�0Id'3;C%"&&5466322654&#"32654&#"267'#"''"54323"5432,T�HH�TU�HH���:FO/VV/O�0H�RSHHSR�H(&&&&&&&&�@;@@;@�����%#.5463236632.EPOA'kS?TT?Sk'AOPE->02@\D_`7DD7`_D\@20>���x"6BNV&&#"3262672654&#4&#""&&54632#32654&#""&'6632672'&00
6XRN88ohgq6b@U~E��o�;H7X3%j	

	KUXhOPfWh)�
	
	
��03P6/?DNSIu�E;V��bjMG
MJ7T/73�			e+%.45-%+L53��g�%,:H%"&&5467&5467&&54>7'267!'66327&&#"66327&&#",n�B-1%?1	
,30�1?%1-B�n9Q��Pb# "�" #@;0:?6;			'O	;6?:0;@`5==5�""A77A""A77��x%;IW%"&54632'"&5463226654&#""&'&5467663266327&&#"66327&&#",[_gSSg_[Bh;xmmx<gB^�#B�uu�B"��  # #�  # #�l*6SMMS6*�7qWpggpWq7CVT�&(bddb(&�TV0!!A77A!!A77��=X('73546323%37'654&#"354&#"C((.bYYb.((��))5/""/5.�$&%%F  �\dd\� �� ��6"//"6!/55/.��*�'2654&#"5#535.5466323#,?PP??R%B��<Z2AsJKrA2Z<��<UAATTA+D'��lgICd<Em@@mE<dCIgl��v�
'72654&&#""&&54663275%#7�@Q%A+)A%Q>JsAAsJA6q�$aaAsVUA+D''D+AU\@mEDn@ja�݁hI)Em@��d�7%2654&#"'7&&'#5367'7675373#'#5&',5EE55EE�IR
bb	PIQl
RIQ	bbPIR l�F66FF66F�IPhQIR	mm
QIO
hRIS	mm	J���3'377''#�x��>9--99--
QP����{y]\yy\]#5�
33%!5''##�v�g JDDJh/���c�wppw���c������"������"�����C5254#56�]]k\\ODDORDCS�zC&546"3zk\\k]]SCDRODD���A5&&546632&&#"1@/M-3H3+ +3?�P%H7.=#@!6%t��373'!��������<���<�'!%��<��Z���%"&'573267O#?��	
&�)87iQ9?E
��}1z/����1�/���u1����uA���yx�3��yk�����P�����1�/���}1z/��xb3�Z��k����n=����m;�����P�����<��	���8����5
���>��
�����2����4.��)�".:FR^jv��"&54632'"&546323"&54632%"&54632!"&54632%"&54632!"&54632%"&54632!"&54632%"&54632"&54632'"&54632+|���]�a��c]����
-RmmR+}1z/'72�d�1�b����~'7Q�N��w_��+b'7N�!+���1�/'7&H�d1H�b���~'7A�N�J�_�.�>'Xc#�.u1��'73'#�8l�l8}14��4\���C'73'#�@Z�Z@h�'oo'Tn=��".#"'6632327n%\@:%\@=MK7MKf��T"&&#"'66323267s#1$_G4$0%_F�LDKE�P��5!�(P]]���/5!�.�^^���P�������/�<��
"&'73267,URT((()TQ<[B // B[�<��
"&'73267,VTr  rT<TJ*,,*JT���P
"&'73267,JRP*""*PR�FC##CFz��C
"&'73267,`O||O�I;"";I�>��"&54632,+77++77>1()33)(1���d"&54632,(22((22�/%%..%%/m;��"&546323"&54632�#--##--�#--##--;."#..#".."#..#".t��N"&546323"&54632�** **� **  ))�* )) ** )) *�8�'6654&'7$,	bP'?8:ZB5",���v'6654&'7$,]L&?�:

I1(",w<�R
"&'73267'"&54632,XYL6.-7LXY ,,  ,,<[B$44$B[�(!!**!!(x���
"&'73267'"&54632,QY
H
9))9
H[Q ++  ++�FC%%%%CFx(! )) !(�8�"&54632'2654&#",ACCAACCA8=+*==*+=7���~"&54632'2654&#",3??32@@2�6--55--67�5
'7'7�NXbGNXb5#�,�#�,��y'7'7�Ie^AHd^�"�4�"�4uA��'737�l8}}8lA�4\\4����T'737�Z@hh@Z�n(TT(n�$n63��$b�B5�
'7'7�lbXelbX5�,�#�,�9��y'7'7�z^dsz^e��4�"�4��5��
'6632&&#"�TQVVQT)(((5B[[B 00���M
'6632&&#"�PRJJRP*""*�CFFC""�2x"&54676326%.;<B
&&22-.F0$ "�8�.5467W%@'Pb	+%8,"5BZ�2u'67#"&54632�B
&&&-;21$ "1-.F���8������5#5353JuuT��BGB�������533#�Tuu���BGB�>��5#53Al�>OG�"���'6654&'7-%
m2R�;(,/15D"��p��
&546"3pZLLZ$  $��9//96�����53533�UTU�GhhG������5#53#U�U��iFFi������5#53533#UUTUU��BGBBGB��f���53���GG���
���
���m�����������������
'6654&'7�;,"P=g�;6(%31�8��
&&5467ZP=g^:-"8(%31;���'6654&'73�;,.2V&&g�;iH	" 31���'6654&'73�;,.2V&&g�;iH	" 31��"&546673326750A%S!!@�21 4%	/	A��"&5466733267:1D&Z!#;�2. 5&
1J��g��73�j������$���5!#5#�Ln܎�GG��u����������	�����	�����n�������D�����J�L%".#"'6632327�%=3,\92&=2-\9�4DC4DD����
52654&#56�$  $ZLL��769//9��*���53353�LnL֎GG���	���5!'35#��nn���6Jk��'&32366324&#"#54&#"�St'		(<8SF�
�OP
/�6��'7'77'�1??1AA1??1A6,89,77,98,7��n=����f��T�(���"&5533267b=2j
�E:"O�0�C(��5!���^^�cJ�	'6632.#"w&g�xx�g&A��??��JC?==?C%**�;�r"&546323"&54632''7�####�####�8NN;$$$$$$$$�$�4����"&546323"&54632''7�""##�##""�?_\�$##$$##$}'�9h:�>"&5463277"&54632�####;&hM{####H!  !��!  !�;�r"&546323"&54632''7�####�####�dNN;$$$$$$$$�u4�����"&546323"&54632''7�""##�##""�|\_�$##$$##$}9�o7�!"&54632'77"&54632�!!!!_Ig#R!!!!H���;�G,"&546323"&54632'"&&#"'6632327�####�####E +!
@2&!*!	@3;$$$$$$$$�88'79�;�9"&546323"&54632%5!�####�####��(;$$$$$$$$�EE����"&546323"&54632%5!�""##�##""��.�$##$$##$�EE�;�i"&546323"&54632''737�####�####�\0dd0\;$$$$$$$$�\,AA,\����"&546323"&54632''737�""##�##""�\;^^;\�$##$$##$�f'II'f�6A)'73'#7'7�/]t]/f�8ON64\\4A,3��-'73'#7'7�;Z~Z;\�,d1�'dd'H2V<6�)'73'#''7�/]t]/f�iNS64\\4Aw4/��'73'#''7�;Z~Z;\�e0a�'dd'HM;W�6*2'73'#7'6654&'7�/]t]/f�
&RA 464\\4A
2
>*# &��)�'73'#'6654&'7�;Z~Z;\�&
S@C�'dd'H/
<-!,'�6�F'73'#7"&&#"'632327�/]t]/f<&CN%C64TT48^&o&o����'73'#7"&&#"'6632327�;Z~Z;\>(F0*'F0�'\\'?Z&96'	96�<�t
"&'73267''7,URK-+,,KQM@]W<[B$44$B[,�A����
"&'73267''7,JRH.%%/HR9H_\�FC#''#CFl/�9�<�t
"&'73267''7,URK-+,,KQ_tW]<[B$44$B[xA�����
"&'73267''7,JRH.%%/HR[s\_�FC#''#CFl9��<�y
"&'73267''6654&'7,URK-+,,KQy	'SCF<[B$44$B[}3

P4+1'����
"&'73267''6654&'7,JRH.%%/HRj&R@C�FC#''#CFm/
=-!,'�<�E
!"&'73267'"&&#"'6632327,NGH%((%HH&K3)%	K3<D-!!-D�&:6%96����
!"&'73267'"&&#"'6632327,JMG'))'GM(F0*'F0�>22>�'96'	86�4�B'73'#7"&'73267�4RtR4VA;6!%& 6;4!YY!=^:((:����'73'#7"&'73267�8W~W8\ILG&()%GK�'\\'H]<11<�P�n5!''7�(�1�<P]]y<iJ����5!''7�.�1�<�^^qBkQuA�R"&54632'737, ,,  ,,kl0��0l�(!!**!!(}�,aa,�z���"&54632'737, ++  ++pb/��/b1(! )) !(sf0TT0fs-�.54677�8$NR%!<"wG?,#,7R<��i-�.5467'7�8$NR%!�Fw!?,#,7RL���3�P
!&&5467'6632327#"&&#"O0EBR
%
�3)%K3)&3&%";		96&96&j-�'6654&'7'7� &RN$7�R"v?:R7,#,�j-�'6654&'7'7� &RN$7�Fw ?:R7,#,���3�P!"&&#"'6632327'6654&'7f&K3)%K3�	&
SAE�&96&96�/		;"%&����q'5!E�犊�����'!E����pq�3�px����p��!��px��!�7q%53!53!53��������犊����!�7�%3!3!3����������������qA333犊���7
���p
���p
�����A!!!�����7
���p
���p
���Eq%53!53!53!53�p��p��p��p犊�������E�%3!3!3!3�p��p��p��p����������q_53535353犊�����~���������������_5!5!5!5!�������~������������p�q%!#!��Ԋ���p��%!#!��Ԋ����E��p�q%#!!�������p��%#!!�������E���pqq#!5!q�����pw����pq�#!!q�����p3���p�q!#5!������pw����p��!#!������p3����%!3!��J�,�������%!3!��J�,�E������7!3����������7!3��E������q�%!5!3q�J,��w���q�%!!3q�J,��3�����'53!E��w�������'3!E��3���p��%!#3!��Ԋ�,�x���p��%!#3!��Ԋ�,���x����p��	%!##!3��ԊD��w����p��	%#!33!���D�,�w����p��%#!!3�����x����p��	%!##!3��ԊD��3E����p��	%#!33!���D�,���E3����p��%#!!3�����x�����pq�#!5!3q���,��pw�w���pq�#!!3q���,��p33���p��	#!53!#q����D�pw�w�����p��	!#5!33����,�D�pw�w�����p��!#53!������pw�w���p��	#!3!#q����D�p33�����p��	!#!33����,�D�p33�����p��!#3!������p33���p�q%!#!5!��Ԋ����w����p��	#!!!!q����,��p3D����p��	%!#!5!5!��Ԋ��,����w�D���p��%!#!!��Ԋ����3���p�q%#!#5!������w����p��	%#!#!3�������3D���p��	%#!#535!���������w�D���p��%#!#!������3�����%!5!3!��,�,�w�������	%!!!3!���J,�,�D3�������	%!5!5!3!��J��,�,�D�w�������%!!3!��,�,�3�������%!53!3�����w�������	'3!3#E���3���D�����	75#53!3����D�w��������%!3!3����3�����p��%!#!5!3!��Ԋ��,�,�w�w�����p��%!#!!3!��Ԋ��,�,�33�����p��%!#!5!3!��Ԋ��,�,���w�w�����p��%!#!!3!��Ԋ��,�,���33�����p��%!#!53!3��Ԋ�����w�w�����p��%#!#5!3!����,�,�w�w�����p��%#!#53!3�������w�w�����p��
%##!3!3#�D�������33������p��
%!##5#53!3��ԊD����3D�w�����p��
!#!333#����,�D��p33��D����p��
%#!#53533!�����D�,���w�D3�����p��%!#!3!3��Ԋ�����33�����p��%#!#!3!����,�,���33�����p��%#!#3!3�������33�����p��%#!#53!3�������w�w�����p��%#!#3!3�������33��K�
q%53!53w��>�犊��K�
�%3!3w��>�������jq�33犊��,���,����j��!!����,���,����^��5!5!E��q���퉉^�p��3!3q��d��px��x���p��	%!#!!!��Ԋ���,^����^�p�q	##!#q��?��pw�����^�p��!#!##!��J�?��,q����d�w���pq�	#!5!5!5!q���,����p����p�q	###5!q���?�pw��w������p��#!5!##5!���J?�퉣,�p��v��^��	73!!!�,��,^�����^���	73333^�������w���^^��333!q������qw����������^q�	%!5!5!5!3q�J,��,�^���������	%!53333��������w��w��^��!533!5!3�ԣ�����q��v��p��%!#3!!!��Ԋ�,��,^�x���^�p��3##33^�������px��w��x��^�p��	333##!^������,�px��w����w���pq�#!5!5!5!3q���,��,��p�����p��3!##533q��퉣���px��w�w���p��	3!533##5!q���ԣ���,�px��������p��5!!#!5!E�Ԋ���q��������p�q###5!#q����pw��w�������p��	5!##!##5!E⣉,�J��,q����w�����^��!5!3!5!��,�,��q���d�������%!533333��������w��w����^��33!!5335!q���J�ԣ����qw����v�����p��%!#!5!5!5!3!!!��Ԋ��,��,�,��,^��������p��###533333#q����������pw��w�w��w��������p��33!!533##!##5!q���J�ԣ����,�J��,qw����v�w����p�q4>33#"�9f�LEE@i>�p�M�f9�>i@�p���pqq!#4&&##532q�>i@EEM�f9�p�@i>�9f����q�##532665q9f�MEE@i>�pL�f9�>i@�����333#".�>i@EEL�f9X��p@i>�9f���X�3#L��L������X�#5LL��������X�#5533��L��L��L�����A�����A���A�A����qq'5!E�犊��q�73�������q75!��犊�pqq3�p�����q�'!E��������7!��������7!�������p�q!��p�������%!5!5!5!��J��,��D�D��p��!333���D�D�pw�������%!!!!���J�,�DD��p��%###!�D�D�w,X�!X,��D�pX�5!X�p���pX��!X�p^���pX}!X�p
���pX,!X�p��D�pX�!X�pk���pX�!X�p���pX9!X�p�7�pX�!X�px���p
�!
�px���p��!�px���pw�!w�px���p,�!,�px���p��3�px���p��3��px���pK�3K�px��,�pX�!,,�px��*��X�#/;GS_kw�����������+7CO[gs����������4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&���8



�



�



���8



�



�



���8



�



�



���8



�



�



���8



�



�



���8



�



�



���8



�



�



�U










ZU










ZU










ZU










ZU










ZU










ZU










*��L*�#/;GS_kw�����������+7CO[gs����������4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&�  �  �  >���  �  �  >���  �  �  >���  �  �  >���  �  �  >���  �  �  >���  �  �  >���      NU      NU      NU      NU      NU      NU      N*��:E�#/;GS_kw�����������+7CO[gs����������4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&�/""//""/�/""//""/�/""//""/G  �  �  �/""//""/�/""//""/�/""//""/G  �  �  �/""//""/�/""//""/�/""//""/G  �  �  �/""//""/�/""//""/�/""//""/G  �  �  �/""//""/�/""//""/�/""//""/G  �  �  �/""//""/�/""//""/�/""//""/G  �  �  �/""//""/�/""//""/�/""//""/G  �  �  �"//""//""//""//""//""//B      N"//""//""//""//""//""//B      N"//""//""//""//""//""//B      N"//""//""//""//""//""//B      N"//""//""//""//""//""//B      N"//""//""//""//""//""//B      N"//""//""//""//""//""//B      9X�5!X9��
�pX�3
K�px���p,,!,�p��D,�pX,!,,�p��D,,�!,,��D�pX�!!,,�px�D�D�pX�!!,,,��D�D��D�pX�!!!X���X,�Dx�pX�!!!X���X�p��,,X�!,,,��D�pX�!!,,��,,��D�D��D�pX�!!!X��,,�p����5��-��������j��B�'3#57546632&#"3#33"&54632IBB$PC4ZZ��J+77++77}m5V4l
!&s���>1()33)(1��Z�'"&533267%#57546632&#"3#L;�	$�#BB$PC4ZZ[K#��m}m5V4l
!&s��>��z$#4>55#7#3ϑ"8CC8"o��p"8CD8"����H_?,)4M<����I`?-(3L;�T�A�Z�3333'53##A���%���%��h����܂�"]؅����=X���XX��(�l��(q�'7AQ�Q0�PP����\	\��\������(h���0Q���TTP����Hf$<HT`l&~	&�
*�6�D*:n�2�$�D*	�	�	�	F�	(D	dl	$�	��	4�		4�	2	
 N	4n	�	�	�	�	�	�					$	0		 	T	
,	t	0	�	.	�	
2	�	8
0	&
h	<
�	�	"
�	.	�	2	�
�
�"2F`z�0�	(�
,4,8`<�0�H
"2
L8`���� a���� gi & l �� ������������� J���� ����� ����� �������� 1��������� ����� [�]����� �� ������ [0]����������� ����� [-]������������ ���������� [*]������� ��� �������� �� ������ [$]����������� ����������� [-,*]���� �, ���� a���� �, ���� g, ������� 1���� �, ���� J� 2010 - 2020 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name  Source .Source Code ProBold2.038;ADBO;SourceCodePro-Bold;ADOBESource Code Pro BoldVersion 2.038;hotconv 1.0.116;makeotfexe 2.5.65601SourceCodePro-BoldSource is a trademark of Adobe Systems Incorporated in the United States and/or other countries.Adobe Systems IncorporatedPaul D. Hunt, Teo Tuominenhttp://www.adobe.com/typeThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFL. This Font Software is distributed on an  AS IS  BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the SIL Open Font License for the specific language, permissions and limitations governing your use of this Font Software.http://scripts.sil.org/OFLsimple asimple gserifed i & lSami Jcursive �cursive �cursive �Serbian �Cyrillic breve [�]slashed zero [0]typographic hyphen [-]typographic asterisk [*]slashed dollar sign [$]alternate numeral one [1]typographic alternates [-,*]simple a, cursive �simple g, cursive �, Serbian 1Sami J, cursive �?@>AB>9 0?@>AB>9 gV 8 � A 70A5G:0<8A00<A:89 JA:>@>?8A=K9 �A:>@>?8A=K9 �A:>@>?8A=K9 �A5@1A:89 1:8@8;;8G5A:0O :@0B:0 [�]70G5@:=CBK9 =>;L [0]B8?>3@0DA:89 45D8A [-]B8?>3@0DA:0O 72574>G:0 [*]70G5@:=CBK9 7=0: 4>;;0@0 [$]B8?>3@0DA:85 70<5AB8B5;8 [-,*]?@>AB>9 0, A:>@>?8A=K9 �A5@1A:89 1, ?@>AB>9 g, A:>@>?8A=K9 �A00<A:89 J, A:>@>?8A=K9 ���2 $%&'()*+,-./0123456789:;<=DEFGHIJKLMNOPQRSTUVWXYZ[\]����bc	

�d���e�� !"#$%&'()*+,-.�/0123456789:���;�<�=>?@ABCDEFGHIJK�LMNOPQRfSTUV����gWXYZ[\]^_`abcdefghi�j�klmnopqrs�tuvwxyz{|}~����h��������������������������������������������jikml��n��������������������o�������qpr�s����������������������������utv�w��������������������������x�����zy{}|���	

���� !"#$%&~�'�()*+,-./0123456789:;<=>?�@�ABCDE�FGHI��JKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	�

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~�������������������������������������������������������������������������������������������������������	���������������������������"�
��������������	

B>@^`_?�
���� !"#$%&�'��(#)*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef�g�hijklmnopqrstuvwxyz{|}~����������������������������������������������������������������� �!���A�a�������������������������������������������������������������������������������������C������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-.AmacronAbreve
Aringacuteuni01CDAogonekuni1EA0uni1EA2uni1EA4uni1EA6uni1EA8uni1EAAuni1EACuni1EAEuni1EB0uni1EB2uni1EB4uni1EB6AEacuteuni01E2uni0243uni1E06Ccircumflex
CdotaccentDcaronuni1E0Cuni1E0Euni1E10Dcroatuni018AEcaronEmacronEbreve
EdotaccentEogonekuni1EB8uni1EBAuni1EBCuni1EBEuni1EC0uni1EC2uni1EC4uni1EC6uni1E16uni01F4Gcircumflex
Gdotaccentuni0122Gcaronuni1E20uni00470303uni0193Hcircumflexuni1E26uni1E24uni1E28uni1E2AHbarItildeImacronuni01CFIogonekuni1EC8uni1ECAIbreveJcircumflexuni0136uni1E32uni1E34LacuteLcaronuni013Buni1E36uni1E38uni1E3ALdotuni1E3Euni1E40uni1E42Nacuteuni01F8Ncaronuni0145uni1E44uni1E46uni1E48Omacron
OhungarumlautObreveuni01D1uni01EAuni1ECCuni1ECEuni1ED0uni1ED2uni1ED4uni1ED6uni1ED8Ohornuni1EDAuni1EDCuni1EDEuni1EE0uni1EE2uni1E52OslashacuteRacuteRcaronuni1E58uni0156uni1E5Auni1E5Cuni1E5ESacuteScircumflexuni1E66uni015Euni0218uni1E60uni1E62uni1E9ETcaronuni0162uni021Auni1E6Cuni1E6ETbarUtildeUmacronUbreveUring
Uhungarumlautuni01D3Uogonekuni01D5uni01D7uni01D9uni01DBuni1EE4uni1EE6Uhornuni1EE8uni1EEAuni1EECuni1EEEuni1EF0uni1E7EWgraveWacuteWcircumflex	WdieresisYgraveYcircumflexuni1E8Euni1EF4uni1EF6uni1EF8Zacute
Zdotaccentuni1E90uni1E92uni1E94uni018FEngIJuni004C00B7004Cuni01320301amacronabreve
aringacuteuni01CEaogonekuni1EA1uni1EA3uni1EA5uni1EA7uni1EA9uni1EABuni1EADuni1EAFuni1EB1uni1EB3uni1EB5uni1EB7aeacuteuni01E3uni0180uni1E07ccircumflex
cdotaccentdcaronuni1E0Duni1E0Funi1E11ecaronemacronebreveeogonek
edotaccentuni1EB9uni1EBBuni1EBDuni1EBFuni1EC1uni1EC3uni1EC5uni1EC7uni1E17uni01F5gcircumflex
gdotaccentuni0123gcaronuni1E21uni00670303hcircumflexuni1E27uni1E25uni1E96uni1E29uni1E2Bhbaritildeimacronuni01D0iogonekuni1EC9uni1ECBibrevejcircumflexuni0137uni1E33uni1E35kgreenlandiclacutelcaronuni013Cuni1E37uni1E39uni1E3Bldotuni1E3Funi1E41uni1E43nacuteuni01F9ncaronuni0146uni1E45uni1E47uni1E49napostropheomacron
ohungarumlautuni01D2uni01EBuni1ECDuni1ECFuni1ED1uni1ED3uni1ED5uni1ED7uni1ED9obreveuni1E53ohornuni1EDBuni1EDDuni1EDFuni1EE1uni1EE3oslashacuteracuteuni0157rcaronuni1E59uni1E5Buni1E5Duni1E5Fsacutescircumflexuni1E67uni015Funi0219uni1E61uni1E63longstcaronuni0163uni021Buni1E6Duni1E6Funi1E97tbarutildeumacronubreveuring
uhungarumlautuni01D4uogonekuni01D6uni01D8uni01DAuni01DCuni1EE5uni1EE7uhornuni1EE9uni1EEBuni1EEDuni1EEFuni1EF1uni1E7Fwgravewacutewcircumflex	wdieresisygraveycircumflexuni1E8Funi1EF5uni1EF7uni1EF9zacute
zdotaccentuni1E91uni1E93uni1E95enguni0237ijuni006C00B7006Cuni01330301uni0250uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0251uni0299uni0259uni025Auni025Buni025Cuni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni029Cuni0268uni026Auni029Duni029Euni026Buni026Cuni026Duni026Euni029Funi026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0278uni0279uni027Auni027Buni027Duni027Euni0280uni0281uni0282uni0283uni0284uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni02A4uni02A6uni02A7uni0294uni0295uni02A1uni02A2uni01C2uni0298	uni014A.aa.aagrave.aaacute.a
acircumflex.aatilde.aadieresis.a	amacron.aabreve.aaring.aaringacute.a	uni01CE.a	uni1EA1.a	uni1EA3.a	uni1EA5.a	uni1EA7.a	uni1EA9.a	uni1EAB.a	uni1EAD.a	uni1EAF.a	uni1EB1.a	uni1EB3.a	uni1EB5.a	uni1EB7.a	aogonek.ag.a	uni01F5.a
gcircumflex.agbreve.agdotaccent.a	uni0123.agcaron.a	uni1E21.a
uni00670303.ai.a
dotlessi.aigrave.aiacute.a
icircumflex.aitilde.aidieresis.a	imacron.a	uni01D0.a	iogonek.a	uni1EC9.a	uni1ECB.a	uni012D.a	uni0268.a	iogonek.d
iogonek.da	uni0268.d
uni0268.da	uni029D.dl.alacute.alcaron.a	uni013C.a	uni1E37.a	uni1E39.a	uni1E3B.alslash.aldot.auni006C00B7006C.a	uni026B.a	uni026C.aAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9
AlphatonosEpsilontonosEtatonos	IotatonosIotadieresisOmicrontonosUpsilontonosUpsilondieresis
Omegatonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigmatauupsilonphichipsiomegauni03C2uni03D0uni03D1uni03D5phi.a
alphatonosepsilontonosetatonos	iotatonosiotadieresisomicrontonosupsilontonosupsilondieresis
omegatonosiotadieresistonosupsilondieresistonosuni03D7uni03D9uni03DBuni03DDuni03E1uni037E	anoteleia
anoteleia.capuni0374uni0375tonos	tonos.cap
dieresistonosuni037Auni1FBEuni1FBDuni1FBFuni1FFEuni1FEFuni1FFDuni1FCDuni1FDDuni1FCEuni1FDEuni1FCFuni1FDFuni1FC0uni1FEDuni1FEEuni1FC1uni1FBD.capuni1FFE.capuni1FEF.capuni1FFD.capuni1FCD.capuni1FDD.capuni1FCE.capuni1FDE.capuni1FCF.capuni1FDF.capuni0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0462uni0472uni0474uni0490uni0492uni0496uni0498uni049Auni04A0uni04A2uni04AAuni04AEuni04B0uni04B2uni04B6uni04BAuni04C0uni04C1uni04D0uni04D4uni04D6uni04D8uni04E2uni04E6uni04E8uni04EEuni04F2uni0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0463uni0473uni0475uni0491uni0493uni0497uni0499uni049Buni04A1uni04A3uni04ABuni04AFuni04B1uni04B3uni04B7uni04BBuni04C2uni04CFuni04D1uni04D5uni04D7uni04D9uni04E3uni04E7uni04E9uni04EFuni04F3	uni0430.a	uni04D1.auni0431.srb	uni0456.a	uni0457.a	uni04CF.auni2116zero.aone.a	zero.onumone.onumtwo.onum
three.onum	four.onum	five.onumsix.onum
seven.onum
eight.onum	nine.onumzero.bone.bzero.capone.captwo.cap	three.capfour.capfive.capsix.cap	seven.cap	eight.capnine.capzero.cone.c
quotereverseduni00ADuni2010
figuredashuni2015uni25E6uni25AAuni25ABuni25B4uni25B5uni25B8uni25B9uni25BEuni25BFuni25C2uni25C3	invbullet
filledrect
underscoredbluni203Euni203Funi2016	exclamdbluni2047uni2049uni2048uni203Duni2E18uni231Cuni231Duni231Euni231Funi27E6uni27E7uni2E22uni2E23uni2E24uni2E25uni2117uni2120at.case
asterisk.ahyphen.a	uni00AD.a	uni2010.adollar.a	zero.supsone.supstwo.sups
three.sups	four.sups	five.supssix.sups
seven.sups
eight.sups	nine.supsparenleft.supsparenright.supsperiod.sups
comma.sups	zero.subsone.substwo.subs
three.subs	four.subs	five.subssix.subs
seven.subs
eight.subs	nine.subsparenleft.subsparenright.subsperiod.subs
comma.subs	zero.dnomone.dnomtwo.dnom
three.dnom	four.dnom	five.dnomsix.dnom
seven.dnom
eight.dnom	nine.dnomparenleft.dnomparenright.dnomperiod.dnom
comma.dnom	zero.numrone.numrtwo.numr
three.numr	four.numr	five.numrsix.numr
seven.numr
eight.numr	nine.numrparenleft.numrparenright.numrperiod.numr
comma.numr
ordfeminine.aa.supsb.supsc.supsd.supse.supsf.supsg.supsh.supsi.supsj.supsk.supsl.supsm.supsn.supso.supsp.supsq.supsr.supss.supst.supsu.supsv.supsw.supsx.supsy.supsz.supsegrave.supseacute.supseogonek.supsuni0259.supsuni0266.supsuni02E0uni02E4a.supag.supai.supa
colon.supshyphen.supsendash.supsemdash.supsEurouni0192
colonmonetarylirauni20A6pesetauni20A9donguni20B1uni20B2uni20B4uni20B5uni20B9uni20BAuni20AEuni20B8uni20BDuni2215
slash.fraconethird	twothirdsuni2155uni2156uni2157uni2158uni2159uni215Auni2150	oneeighththreeeighthsfiveeighthsseveneighthsuni2151uni2152uni2189uni2219equivalence
revlogicalnotintersection
orthogonaluni2032uni2033uni2035uni00B5
integraltp
integralbtuni2206uni2126uni2200uni2203uni2237uni2105uni2113	estimateduni2190arrowupuni2192	arrowdownuni2196uni2197uni2198uni2199uni21D0uni21D1uni21D2uni21D3	arrowboth	arrowupdnarrowupdnbseuni25CFuni25CBuni25A0uni25A1uni2752uni25C6triagupuni25B3uni25B6uni25B7triagdnuni25BDuni25C0uni25C1triagrttriaglf	invcircleuni25C9uni2610uni2611uni2713musicalnotemusicalnotedblheartclubdiamondspade	smilefaceinvsmilefaceuni2764uni2615u1F4A9u1F916u1F512femalemalesunhouseuni02B9uni02BBuni02BCuni02BEuni02BFuni02C1uni02D0uni02D1uni02DEuni02C8uni02C9uni02CAuni02CBuni02CCuni25CCuni0300uni0300.capuni0340uni0301uni0301.cap	uni0301.guni0302uni0302.capuni0303uni0303.capuni0304uni0304.capuni0305uni0305.capuni0306	uni0306.cuni0306.capuni0306.ccapuni0307uni0307.capuni0308uni0308.capuni0309uni0309.capuni0310uni0310.capuni030Auni030A.capuni030Buni030B.capuni030Cuni030C.cap	uni030C.auni030Funi030F.capuni0311uni0311.capuni0312	uni0312.guni0313uni0343uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0323uni0324uni0325uni0326	uni0326.auni0327uni0327.capuni0328uni0328.capuni0329uni032Auni032Cuni032Euni032Funi0330uni0331uni0334uni0339uni033Auni033Buni033Cuni033Duni0342uni0342.capuni0345uni035Funi0361uni03080301uni03080301.cap
uni03080301.guni03080300uni03080300.cap
uni03080300.guni03080303uni03080304uni03080304.capuni0308030Cuni0308030C.capuni03020301uni03020301.capuni03020300uni03020300.capuni03020309uni03020309.capuni03020303uni03020303.capuni03060301uni03060301.capuni03060300uni03060300.capuni03060309uni03060309.capuni03060303uni03060303.capuni03020306uni03020306.capuni03040301uni03040301.capuni030C0307uni030C0307.capuni03120301uni03120300uni03120303uni03130301uni03130300uni03130303uni00A0uni2007
space.fracnbspace.fracuni2500uni2501uni2502uni2503uni2504uni2505uni2506uni2507uni2508uni2509uni250Auni250Buni250Cuni250Duni250Euni250Funi2510uni2511uni2512uni2513uni2514uni2515uni2516uni2517uni2518uni2519uni251Auni251Buni251Cuni251Duni251Euni251Funi2520uni2521uni2522uni2523uni2524uni2525uni2526uni2527uni2528uni2529uni252Auni252Buni252Cuni252Duni252Euni252Funi2530uni2531uni2532uni2533uni2534uni2535uni2536uni2537uni2538uni2539uni253Auni253Buni253Cuni253Duni253Euni253Funi2540uni2541uni2542uni2543uni2544uni2545uni2546uni2547uni2548uni2549uni254Auni254Buni254Cuni254Duni254Euni254Funi2550uni2551uni2552uni2553uni2554uni2555uni2556uni2557uni2558uni2559uni255Auni255Buni255Cuni255Duni255Euni255Funi2560uni2561uni2562uni2563uni2564uni2565uni2566uni2567uni2568uni2569uni256Auni256Buni256Cuni256Duni256Euni256Funi2570uni2571uni2572uni2573uni2574uni2575uni2576uni2577uni2578uni2579uni257Auni257Buni257Cuni257Duni257Euni257Funi2580uni2581uni2582uni2583uni2584uni2585uni2586uni2587uni2588uni2589uni258Auni258Buni258Cuni258Duni258Euni258Funi2590uni2591uni2592uni2593uni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259Funi202FuniFEFFu1F3B5u1F3B6f_if_luniE0A0uniE0A1uniE0A2uniE0B0uniE0B1uniE0B2uniE0B3ideoromnDFLTcyrlgreklatn�V�t
  !!""#')13577::==@@MM[[^^eevv������������������



$$**00??BBQQUU\\aassww�����������������������������	  ##&&56;;?@HHLNQRYY\^bbddffllnnqquu����������������������������

$%'-0146KLee�����EHn�#11BDHn
�(DFLTcyrl.grekXlatnl�� 
SRB ��	!��
"��#ATH &NSM 6SKS F��$��
%��&��'(ccmp�ccmp�ccmpccmp
ccmpccmpccmp"ccmp*frac2frac8frac>fracDfracJfracPfracVfrac\markbmarkvmark�mark�mark�mark�mark�mark�mkmkmkmkmkmkmkmkmkmkmkmk mkmk&mkmk,size2size6size:size>sizeBsizeFsizeJsizeN	
	
	
	
	
	
	
	








 d&.8BJT\dlt|��vxz�������h��	z	�	�
`
P��
�t����8��&^���^���\��|�ZS������������������������������������������������������������������������������������x~x���xx���x����xxxxx������������r�rr x&,�x�xx2xx����8�rr��8 >DJPV\�b�hnrrtzzr�r������� �������r�rr�r�������h����8�8x�xxx�xx 
rx�"(x.x4"x.x&x�:@�Frrr��rLRrXrhr,,�a�C�M�J�H�B���@�1�-�?�@��V������Y����;C4`8�(H��)�v�Y>�"T�����6R%�'r��*P���f����3d�)J�
�,�.�9E�EEG�BL$>�F�4��OD\&��	Z	`

,�	D	Lhh.djpv|�^�^��^^����������^����������^,WB��O�1�@�V'�b>��7w����6�NMx�jZZZZZZZZZZZZZZZZZZZZZZZ}���� &�,28��>��D�JPV\Vbhnt�z�����������&��V�bn��z�h�DD����V2��������J��b���n
""(.��4:@F������LRX^2V�   �    ���>d�,��U��*��D�����C��E��O�����@��0��-��8��6��T��4��%��Y����3o��2����3��3���3��q��9���37��L��"��.��D�3��h��<�3��(��*�3B��,�$��I�3�3o�3n�3N��	�3W�3��4�3-�36�3�3V�yq�3�$R��K�3�������
,��ZoJo��",��������z�HHDJ>>>>PV>\bDDDJ>hPPPnV>JJJJtt>,���`�!��6�L�2ZShnhhnhhnhnhnhnhhnnhnhnhnhnhnhnhnhnhnhhhhhhhnhnhhnhhhnhnhnhnhnhnhnhnhnhnhnhnhnhhhhhh&&,28822>DJP,,�,�,�,�,�,�,#,�,�GF,!#$%&'/(a�������������������	#"%+,4�������������������	hjFG�E JJJMMKinLR�# 11(BD)Hn,�	

!#$%&')*+,-./01345@M[e���������
QUaw��������������������������������������	
56?@HLMNQRY\]^bdflnqu��������������
$%'()*+,-01456KLe�&�23.	

!#$')*-./035M��U���?@LRY\]�$%(06<>AEE}	

!#$%&')*+,-./01345M[�����Ua��������������������������������������	
6?@LQRY\]^du��=
'R�'*�45
$*047:=^��
*Us #&?@���	


��DFLTcyrlfgreklatnR��! (08@HPX`hpx����������������
SRB T��"	!)19AIQYaiqy�������������������"
"*2:BJRZbjrz�������������������"#+3;CKS[cks{����������������ATH ^NSM �SKS ���!$,4<DLT\dlt|���������������	��!
%-5=EMU]emu}���������������
��"&.6>FNV^fnv~������������������"'/7?GOW_gow����������������
casePcaseVcase\casebcasehcasencasetcasezccmp�ccmp�ccmp�ccmp�ccmp�ccmp�ccmp�ccmp�cv01�cv01�cv01�cv01cv01cv01cv01cv01cv02 cv02&cv02,cv022cv028cv02>cv02Dcv02Jcv04Pcv04Vcv04\cv04bcv04hcv04ncv04tcv04zcv06�cv06�cv06�cv06�cv06�cv06�cv06�cv06�cv07�cv07�cv07�cv07�cv07�cv07�cv07�cv07�cv08�cv08�cv08�cv08�cv08�cv08�cv08cv08
cv09cv09cv09cv09"cv09(cv09.cv094cv09:cv10@cv10Fcv10Lcv10Rcv10Xcv10^cv10dcv10jcv11pcv11vcv11|cv11�cv11�cv11�cv11�cv11�cv12�cv12�cv12�cv12�cv12�cv12�cv12�cv12�cv14�cv14�cv14�cv14�cv14�cv14�cv14�cv14�cv15	cv15	cv15	cv15	cv15	cv15	cv15	$cv15	*cv16	0cv16	6cv16	<cv16	Bcv16	Hcv16	Ncv16	Tcv16	Zcv17	`cv17	fcv17	lcv17	rcv17	xcv17	~cv17	�cv17	�dnom	�dnom	�dnom	�dnom	�dnom	�dnom	�dnom	�dnom	�frac	�frac	�frac	�frac	�frac	�frac	�frac
frac
locl
 locl
&locl
.locl
4locl
:numr
@numr
Fnumr
Lnumr
Rnumr
Xnumr
^numr
dnumr
jonum
ponum
vonum
|onum
�onum
�onum
�onum
�onum
�ordn
�ordn
�ordn
�ordn
�ordn
�ordn
�ordn
�ordn
�salt
�salt
�saltsalt$salt@salt\saltxsalt�sinf�sinf�sinf�sinf�sinf�sinf�sinf�sinf�ss01�ss01�ss01�ss01�ss01ss01ss01ss01ss02 ss02(ss020ss028ss02@ss02Hss02Pss02Xss03`ss03jss03tss03~ss03�ss03�ss03�ss03�ss04�ss04�ss04�ss04�ss04�ss04�ss04�ss04�ss05�ss05�ss05�ss05�ss05
ss05
ss05
ss05
ss06
 ss06
&ss06
,ss06
2ss06
8ss06
>ss06
Dss06
Jss07
Pss07
Vss07
\ss07
bss07
hss07
nss07
tss07
zsubs
�subs
�subs
�subs
�subs
�subs
�subs
�subs
�sups
�sups
�sups
�sups
�sups
�sups
�sups
�sups
�zerozerozerozerozerozerozero$zero*								@:4.("������������������������������~xrltnhb\VPJRLF@:4.(0*$����������������������������~��ztnhb\























        ����������������~tj`VPJD>82,&$������������ � � � � � � � 	

$JRZbjr~���������������&.6>FNV^fn,*0.,z����������� 2<x���� Vh�������������!#L
 &,28>DJP  **
U���������!��!��"�:d��$U�S�Yc	W$]�[�a_aC$*06<K�M�H�JNOQNC &,j�j�i�ikkC &,m�m�l�lnnC�,6@JT`jt~����������@4e4v�4�
�4�4
4$04B?2Q4��'\w4��4���;2*v"�d"� !$%"#�

����#��#���#�)*+,-./0123456789:;<=>?@ABCDEFG��������������rMNOP�����	NR9�������������������������35CILPRTVXZ\^`bdfP !"#$%&'(5)*+,-./01234ef'J:
6789:;<=>K6 ?RABCDEFGHIJK@STUVWXYZ[L\]NPhijL4444
8C<<��<
<
@
M4N4*(U�MOQNP��35CILPRTVXZ\^`bdf(q

r��� "	
_b��+.qt�A_�+q	b�.t��A$4��	

CHKOQSUWY[]_ace?$%Q��HL	!#

 "$'*/0�66Y[[>]x?zz[|�\�����������^~���!��	

24CHKOQSUWY[]_ace!��35CILPRTVXZ\^`bdfmv��
���!o
hj%
qr5)*00��������mv9��mnopqrstuvxyz{|}~������	

24CHKOQSUWY[]_ace\\&&))"";B//	 $'JKLMNOPQRSTU[\]^_`ab����MO@A[1���my����Rnnz�$?($%Q��HL��	

24CHKOQSUWY[]_ace%ooPK}$[�՞�w�wRgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/fonts/Lato-Regular.ttfnu�[��� DSIGw�GPOS��,K�GSUBV.TL�OS/2ٮ�iM�`cmapRԟ�NP�cvt '��m`8fpgm�zAm�	�gaspmXglyf*~ʙS8�Bhead��e��|6hhea���$hmtx[�`���TkernlBjT�,l�loca�.�V,maxp<
�X< name�$�X\^post:�]i��prep�x9�w,�
0JDFLTlatn����kernkernJnv�$R�
�^�	h
B
l�&��rj����Z���j��L��*|�DV�:�� �!.!�##L#�$4$~%�&J'$'�(�)�*�+f+�,6,�-�.(.�/t/�/�0:0|2"2�33T3�3�4&4l4�55b5�66L6�6�7B7�7�888�9d9�9�:&:�:�;@<�=�>j?,?�@hA�B�CzD�E�F�G*G�HfI�K	�J��N��J#��$�J&��*��2��4��90:0<?0D��F��G��H��R��T��m�No�Ny�N}�N��J��J��J��J��J��J��J��������������������������������������������������������������������������������J��������������N�N���N�N�N��JK	�J��N��J#��$�J&��*��2��4��90:0<?0D��F��G��H��R��T��m�No�Ny�N}�N��J��J��J��J��J��J��J��������������������������������������������������������������������������������J��������������N�N���N�N�N��J"#��&��*��2��4��F��G��H��R��T���������������������������������������������������������������������K	�J��N��J#��$�J&��*��2��4��90:0<?0D��F��G��H��R��T��m�No�Ny�N}�N��J��J��J��J��J��J��J��������������������������������������������������������������������������������J��������������N�N���N�N�N��J-�
�
��x#��&��*��2��4��7�L9�L:��<�h?�LY�|Z��\�|l�m�xo�xr�y�x|�}�x�����������������������h�����h�x�x�����x�x�x��'�N	��
�N
�N�x�x��$��7�L9��:��;��<�`=��?��l�Nr�N|�N�����������������������`���`�������N�N�x�N�N�x��N���-�
�
��x#��&��*��2��4��7�L9�L:��<�h?�LY�|Z��\�|l�m�xo�xr�y�x|�}�x�����������������������h�����h�x�x�����x�x�x��k0	�x
0
0�@���@�x����"0#��$�x&��*��-�h2��4��D��F��G��H��I��J�xP��Q��R��S��T��U��V��W��X��Y��[��\��]��l0m��o��r0t:u:w��y��{:|0}����x��x��x��x��x��x��x����������������������������������������������������������������������������������������������x�����������������0�0�@�0�0�@����0��x)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������6�J
�J
�J��"��#��&��*��-22��4��7�|8��9�x:��<�\?�xY��\��l�Jm��o��r�Jt�Hu�Hy��{�H|�J}�������������������������������������\�����\�����J�J�J�J��������J
�jm�jo�jy�j}�j�j�j�j�j�j)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������4	�|�L�L�|����"$�|-�:F��G��H��P��Q��R��S��T��U��X��w����|��|��|��|��|��|��|����������������������������������������������������|���������L�L��|	��������$��������������������������������1��#��&��*��2��4��F��G��H��I��R��T��W��Y��Z��\��m��o��y��}�������������������������������������������������������������������������������I��
��
��6�:6"��#��&��*��2��4��7�T9�J:�h<�,?�JF��G��H��R��T��Y��Z��\��l��m�:o�:r��t�6u�6y�:{�6|��}�:�����������������������,�����������������������������������������������,�:�:�����6�����6�:�:�:���)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������.	�v���v$�v-�JD��F��G��H��R��T����v��v��v��v��v��v��v����������������������������������������������������������v������������v)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������#��&��*��2��4��7��8���������������������������������������[	�|�L�L�L�|�`�`#��$�|&��*��-�82��4��D�F�.G�.H�.J�DP�`Q�`R�.S�`T�.U�`V�^X�`Y�LZ�t[�p\�L]��m�Lo�Lw�`y�L}�L��|��|��|��|��|��|��|�������������������������������������.��.��.��.��.��.��`��.��.��.��.��.��.��`��`��`��`�|����.�.�`���.�L�L�L�L�L�L�L��|	��������$��������������������������������k0	�x
0
0�@���@�x����"0#��$�x&��*��-�h2��4��D��F��G��H��I��J�xP��Q��R��S��T��U��V��W��X��Y��[��\��]��l0m��o��r0t:u:w��y��{:|0}����x��x��x��x��x��x��x����������������������������������������������������������������������������������������������x�����������������0�0�@�0�0�@����0��xI0	��
0
0��������""$��-��D��F��G��H��J��R��T��V��l0m��o��r0t0u0y��{0|0}�����������������������������������������������������������������������������������������������0�0��0�0��������0���1��#��&��*��2��4��F��G��H��I��R��T��W��Y��Z��\��m��o��y��}�������������������������������������������������������������������������������i	�\

�h�`�h�\����""#��$�\&��*��-�82��4��D��F�`G�`H�`J�TP��Q��R�`S��T�`U��V��X��Y��Z��[�|\��lm�`o�`rt2u2w��y�`{2|}�`��\��\��\��\��\��\��\��������������������������������������������`��`��`��`��`��`�����`��`��`��`��`��`�������������\�����`�`�����`�`�`���h���h�`�`�`���\0��""#��&��*��2��4��F��G��H��R��T��V��Y��\��m��o��y��}��������������������������������������������������������������������������"#��&��*��2��4��F��G��H��R��T���������������������������������������������������������������������6�J
�J
�J��"��#��&��*��-22��4��7�|8��9�x:��<�\?�xY��\��l�Jm��o��r�Jt�Hu�Hy��{�H|�J}�������������������������������������\�����\�����J�J�J�J��������J��
��
��Y��Z��\��l��r��t��u��{��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|���������D
D
D�~�~lDrDtdud{d|D�D�D�~�D�D�~�D��
��
��Y��Z��\��l��r��t��u��{��|���������F��G��H��R��T����������������������������������������������
��
��Y��Z��\��l��r��t��u��{��|�����������
��
��Y��Z��\��l��r��t��u��{��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|���������
�|�|D��������������������������|�|$	���|�|��$��F��G��H��R��T��������������������������������������������������������������������|�|�����������F��G��H��R��T��������������������������������������������$	���|�|��$��F��G��H��R��T��������������������������������������������������������������������|�|���"#��&��*��2��4��F��G��H��R��T���������������������������������������������������������������������K	�J��N��J#��$�J&��*��2��4��90:0<?0D��F��G��H��R��T��m�No�Ny�N}�N��J��J��J��J��J��J��J��������������������������������������������������������������������������������J��������������N�N���N�N�N��J'�N	��
�N
�N�x�x��$��7�L9��:��;��<�`=��?��l�Nr�N|�N�����������������������`���`�������N�N�x�N�N�x��N���'�N	��
�N
�N�x�x��$��7�L9��:��;��<�`=��?��l�Nr�N|�N�����������������������`���`�������N�N�x�N�N�x��N���)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������K	�J��N��J#��$�J&��*��2��4��90:0<?0D��F��G��H��R��T��m�No�Ny�N}�N��J��J��J��J��J��J��J��������������������������������������������������������������������������������J��������������N�N���N�N�N��J	�H�H$�H9:::<(?:��H��H��H��H��H��H��H�(�H�(��H	�H�H$�H9:::<(?:��H��H��H��H��H��H��H�(�H�(��H'�N	��
�N
�N�x�x��$��7�L9��:��;��<�`=��?��l�Nr�N|�N�����������������������`���`�������N�N�x�N�N�x��N���	�H�H$�H9:::<(?:��H��H��H��H��H��H��H�(�H�(��HK	�J��N��J#��$�J&��*��2��4��90:0<?0D��F��G��H��R��T��m�No�Ny�N}�N��J��J��J��J��J��J��J��������������������������������������������������������������������������������J��������������N�N���N�N�N��J'�N	��
�N
�N�x�x��$��7�L9��:��;��<�`=��?��l�Nr�N|�N�����������������������`���`�������N�N�x�N�N�x��N���6�J
�J
�J��"��#��&��*��-22��4��7�|8��9�x:��<�\?�xY��\��l�Jm��o��r�Jt�Hu�Hy��{�H|�J}�������������������������������������\�����\�����J�J�J�J��������J6�J
�J
�J��"��#��&��*��-22��4��7�|8��9�x:��<�\?�xY��\��l�Jm��o��r�Jt�Hu�Hy��{�H|�J}�������������������������������������\�����\�����J�J�J�J��������J6�J
�J
�J��"��#��&��*��-22��4��7�|8��9�x:��<�\?�xY��\��l�Jm��o��r�Jt�Hu�Hy��{�H|�J}�������������������������������������\�����\�����J�J�J�J��������J6�J
�J
�J��"��#��&��*��-22��4��7�|8��9�x:��<�\?�xY��\��l�Jm��o��r�Jt�Hu�Hy��{�H|�J}�������������������������������������\�����\�����J�J�J�J��������J6�J
�J
�J��"��#��&��*��-22��4��7�|8��9�x:��<�\?�xY��\��l�Jm��o��r�Jt�Hu�Hy��{�H|�J}�������������������������������������\�����\�����J�J�J�J��������J6�J
�J
�J��"��#��&��*��-22��4��7�|8��9�x:��<�\?�xY��\��l�Jm��o��r�Jt�Hu�Hy��{�H|�J}�������������������������������������\�����\�����J�J�J�J��������J
�jm�jo�jy�j}�j�j�j�j�j�j)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|������������������������������������������������������	��������$��������������������������������	��������$��������������������������������	��������$��������������������������������	��������$��������������������������������i	�\

�h�`�h�\����""#��$�\&��*��-�82��4��D��F�`G�`H�`J�TP��Q��R�`S��T�`U��V��X��Y��Z��[�|\��lm�`o�`rt2u2w��y�`{2|}�`��\��\��\��\��\��\��\��������������������������������������������`��`��`��`��`��`�����`��`��`��`��`��`�������������\�����`�`�����`�`�`���h���h�`�`�`���\)��	��
����
��������$��7��9��;��<��=��?��@��`��l��r��|��������������������������������������������������������
��
��Y��Z��\��l��r��t��u��{��|�����������
��
��Y��Z��\��l��r��t��u��{��|�����������
��
��Y��Z��\��l��r��t��u��{��|�����������
��
��Y��Z��\��l��r��t��u��{��|�����������
��
��Y��Z��\��l��r��t��u��{��|�����������
��
��Y��Z��\��l��r��t��u��{��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
��
��Y��Z��\��l��r��t��u��{��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|���������6�J
�J
�J��"��#��&��*��-22��4��7�|8��9�x:��<�\?�xY��\��l�Jm��o��r�Jt�Hu�Hy��{�H|�J}�������������������������������������\�����\�����J�J�J�J��������J��
��
��Y��Z��\��l��r��t��u��{��|���������
�jm�jo�jy�j}�j�j�j�j�j�j��
����
��9��:��?��@��Y��[��\��`��l��r��|��������� �t
�t
�t��9�^:��<�h?�^Y��\��l�tm��o��r�tt�|u�|y��{�||�t}����h�h���t�t�t�t�����t��
��
��Y��Z��\��l��r��t��u��{��|�����������
����
��9��:��?��@��Y��[��\��`��l��r��|���������i	�\

�h�`�h�\����""#��$�\&��*��-�82��4��D��F�`G�`H�`J�TP��Q��R�`S��T�`U��V��X��Y��Z��[�|\��lm�`o�`rt2u2w��y�`{2|}�`��\��\��\��\��\��\��\��������������������������������������������`��`��`��`��`��`�����`��`��`��`��`��`�������������\�����`�`�����`�`�`���h���h�`�`�`���\0��""#��&��*��2��4��F��G��H��R��T��V��Y��\��m��o��y��}��������������������������������������������������������������������������0��""#��&��*��2��4��F��G��H��R��T��V��Y��\��m��o��y��}��������������������������������������������������������������������������0��""#��&��*��2��4��F��G��H��R��T��V��Y��\��m��o��y��}��������������������������������������������������������������������������'�N	��
�N
�N�x�x��$��7�L9��:��;��<�`=��?��l�Nr�N|�N�����������������������`���`�������N�N�x�N�N�x��N���'�N	��
�N
�N�x�x��$��7�L9��:��;��<�`=��?��l�Nr�N|�N�����������������������`���`�������N�N�x�N�N�x��N���K	�J��N��J#��$�J&��*��2��4��90:0<?0D��F��G��H��R��T��m�No�Ny�N}�N��J��J��J��J��J��J��J��������������������������������������������������������������������������������J��������������N�N���N�N�N��JK	�J��N��J#��$�J&��*��2��4��90:0<?0D��F��G��H��R��T��m�No�Ny�N}�N��J��J��J��J��J��J��J��������������������������������������������������������������������������������J��������������N�N���N�N�N��J-�
�
��x#��&��*��2��4��7�L9�L:��<�h?�LY�|Z��\�|l�m�xo�xr�y�x|�}�x�����������������������h�����h�x�x�����x�x�x��K	�J��N��J#��$�J&��*��2��4��90:0<?0D��F��G��H��R��T��m�No�Ny�N}�N��J��J��J��J��J��J��J��������������������������������������������������������������������������������J��������������N�N���N�N�N��JK	�J��N��J#��$�J&��*��2��4��90:0<?0D��F��G��H��R��T��m�No�Ny�N}�N��J��J��J��J��J��J��J��������������������������������������������������������������������������������J��������������N�N���N�N�N��J-�
�
��x#��&��*��2��4��7�L9�L:��<�h?�LY�|Z��\�|l�m�xo�xr�y�x|�}�x�����������������������h�����h�x�x�����x�x�x��'�N	��
�N
�N�x�x��$��7�L9��:��;��<�`=��?��l�Nr�N|�N�����������������������`���`�������N�N�x�N�N�x��N���'�N	��
�N
�N�x�x��$��7�L9��:��;��<�`=��?��l�Nr�N|�N�����������������������`���`�������N�N�x�N�N�x��N���'�N	��
�N
�N�x�x��$��7�L9��:��;��<�`=��?��l�Nr�N|�N�����������������������`���`�������N�N�x�N�N�x��N���K	�J��N��J#��$�J&��*��2��4��90:0<?0D��F��G��H��R��T��m�No�Ny�N}�N��J��J��J��J��J��J��J��������������������������������������������������������������������������������J��������������N�N���N�N�N��J6�J
�J
�J��"��#��&��*��-22��4��7�|8��9�x:��<�\?�xY��\��l�Jm��o��r�Jt�Hu�Hy��{�H|�J}�������������������������������������\�����\�����J�J�J�J��������Jv

#$&')-./2345789:;<=>?DEHIKNPQRSUYZ[\^lmoprtuy{|}��������������������������������������������������������������
8�DFLTlatn����case&case,liga2liga8sups>supsD,>B	

@LO,{tuCjqv�������I�xx�x���P`KtyPL@�J�z��� ��� �&
	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a���������������������������������rdei�x�pk�vj���sgw�����l|����cn���m}�b�������������������y���������������������q���z���`T@
~�1DS[a~�����    " & 0 : D �!"!&"""""""+"H"`"e%�&i���
 �1ARZ`x�����      & 0 9 D �!"!&"""""""+"H"`"d%�&i����������������{�u�q�[�H����$��������������I�����������������޸ޡޞ�:ڜ`T@
~�1DS[a~�����    " & 0 : D �!"!&"""""""+"H"`"e%�&i���
 �1ARZ`x�����      & 0 9 D �!"!&"""""""+"H"`"d%�&i����������������{�u�q�[�H����$��������������I�����������������޸ޡޞ�:ڜ-��%59=J@GBhf[[		QCQ
D=<($#*$
+>32#'&>54&#"#"'4632#"&!!7!!�9DO.?gI)-60#z-70 I9)8(c>0((0>���22c��u&#@[87P;+&%iu"3+(.:(3<��/@)(?��g6,����
!&@#QCSD

+#.54>32#".�	y	+!..""..!���-VW[44[WV-<��."".-""-����
,@)	BQD

$+#"&/!#"&/3���ޛ ## �"�ޛ ## �"6Q�>BH@E
Y	CQ
C
DBA@?>>86530/*(##!#!+#"&5467#+#"&546?3#7>;>;3323+32%3#TQ G�G-OU��A�
$'�H+PT�TO!I�
%&�A�	���A���Y"Z��%�9FJf"�Z���K��9�Fj�$g8CN~@J( I>)
?4BK�	PX@$hfSCSD@$hfSCSDY�#&#&+.'7>32.54>?>;#".'+4.'>�y�H50FaD%F�kA9m�h
Bi�<+):L1!H�pE<s�kB�%@V1"AeE#��"<P/A_=aKR&1.5U�aI�lE��
R:B!!�4R{\Z�xK��2H4&�-F]�0G6(�(<KH����'1EY�K�PX@'[	[SC		S
DK�"PX@+[	[SC
C		SD@/[	[CSC
C		SDYY@
VT((%#&((($
+#".54>324.#"32>>;+#".54>324.#"32>�4Wt?DsV00VsDCuU1�1A%%A00A%%A1�
���
�54Ws?DsV00VsDCtV0�1A%%A00A%%A1?T�[00[�TV�\00\�VB\;;\BA[99[w��
RT�[00[�TV�\00\�VB]::]BAZ99ZR��x�?K�@8IH+%BK�PX@*hSCS
CS
D@(hSCS
CSDY@FD/-(&" 	??+2#"&'.#">7>;#"&/#".54>7.54>3267�O�_7o
1E.2P9"6&�&-nFB,�$�^��P�yJ/SrD=:5d���0Nd4p�D�Yjk�3To<8. 9M-#@AE&�]C�Js�a���[j6g�]F}jTM�NI�_7��AcD#RD�9���3�
@	BQD

$+#"&/3��ޛ ## �"����
(+.54>7!nhOKiAAiKO
imu�m�0s���zy���t1��lJ����	(+4'&546?'.54676*mi
OKiAAiKOhnu���1t���yz���s0��`_��0J@-)($ BK�PX@QD@MQEY@
00+5467'767./7.=3>?'.'b!�,�$%#�,�#	X�,�!!�,�_�"cKdeKd %��)cKdeKd!'�d�"�,@)MYQE+!!#!5!���i��k���U��R���^��P�@?S
D$+74>32'&547>7#".^,/0G-

 
*{)'3-a_Z&
%0:!!-dR�@MQE+!!d���X��Q�@SD($+74>32#".X!..""..!n."".-""-����	@kD#"++>;�7KY
0!K#"� "<��L�'@SCSD((($+#".54>324.#"32>LQ��mn��PP��nm��Q�7]zBBz\77\zBBz]7̼��XX����XX��켤߈;;�ߤ�ވ;;����*@'BhCR
D&+%!47#"&/3!!4�
	8�����,-�
	Mq��h$�3;@8/BhSCQ
D,*$"
33+2>3!2!5467>54.#"#"&/>Y[�sB0Rk<��(R&�"�D�9^C$(F^66\G1
 ]P{��6g�^P�}u=�~
"l=(�:klo??_> 9N/b�f5l��.�JU@RF
Bhh[SCSDCA;910/.&$JJ	+2#".'763232>54.#5>54.#"#"&/>l[�o>#A\9��K��cr�pHL(DeKKqK&Q�p[�R%'D]66\G0 ]P{��4`�SDkQ8%��c�o;9d�P 		I@,1N`/:`F(�&B\8>\< 9O.b�f5(`�&@#B[C
D!#+3+#!"&/3467!�����������f��y[���< �;l����.@@=,+Bh[QCSD(#&(""+#!632#".'763232>54.#"'!�09�>Bp_p�t;P��m?tdV!63HaCKxU.'OvO6t>pt�K&1��Bt�]r��F*6L&0Y|MClL*!�l��2�.2@/B[CSD+)!	+2#".5467>;>32>54.#"�V�tDH��ml�|CT[k2 ��3|��(MoGHtS-,PpCHtQ+n9m�fc�~HE�p^�z���#'�LErR-.RpBFqO*1Smn<�@QC
D$'++>7!"&=<��
.'Z
��P",�S%�*y`��&�3GD@AB[SCSD54! ?=4G5G+) 3!3	+".5467.54>32'2>54.#"2>54.#"Ck��F��qs>r�ba�r>tp��G�kFoM)1Sl;;lS1)MoFFc>!Aa@@aA!>c9j�^��&*�tO�f::f�Ot�*&��^�j9�'Gc<JiBBiJ<cG'�+G\12XB&&BX21\G+�6�32@/B[SC
D0.&$	+".54>32+>74.#"32>%Q�nAF~�hg�xA,='��
0��&7�+Li?BmM*'IiAHoL(L6i�c^�zFDz�g>oji8�;4,.�CmL)+Lj?DkJ&/Nf���y�';K�$PX@SCSD@[SDY�((($+74>32#".4>32#".�!..""..!!..""..!n."".-""-	."".-""-���y�2D�?K�$PX@SCS
D@[S
DY@	/-%#$+74>32'&547>7#".4>32#".�,/0G-

 
*!..""..!{)'3-a_Z&
%0:!!-�."".-""-���W�(+��?--�����
�
�
������!@YMQE+!!!!�[��[��>�և���W�(+75467%>7.'%.=��++�?�
�
�
�oJ"����(<9@6BhfSCSD(&#-$+>32#'54>54.#"#"'4>32#"."KYg<O�b8-ERG3z-EOE-":O-=W<%�!..""..!4(.TxKLnS=66!��*A99EX<+F1$��."".-""-V�OQaf@c
X
7Bh[

[	[OSGSR[YRaSaGE;9530.&$QQ
+%"&'#".54>3232>54.#"3267632#"$&54>32%2>7&#"�Nb
:�N<X;A��}Ce-])1XC'Y��z��dk�����U
k�ﭭ���}7d���l\���_5=k��?;1L'.K}Z3B�KNQF)Id:U��X��K1$/
8f�W�ЋEf�������XB3	BHRn�,�mʯ�g9(Ns��kl��Lx2VA'	?f�EHW
I�
$@!BZC
D# +!#"&'!+3!&'I� ��}�"�=���
Z����{G6Q)E���*=@:B[SCS
D*(" !+3!2#!2>54&#%!2>54&#!�Ʉ�{;!CeD��C��x��6SwM$����RxO&�����4`�W5bTB��[�l;��
&E_9o��$@[6~vZ��	�.D@ABhfSCSD)'..+2#".546$32#".#"32>76�
LX�����bi�	���Y?
(6Jb@s��MM��i@fWK&(
Sfrk����kbTY

 O�҂�ґL 1"���@SCS
D!(!$+#!!24.#!!2>�f��������f�H��s��Us��H̡���g�g�����АL��L���!�.@+YQCQ
D+!!!!!!�P-��������$�����!�	(@%YQC
D		+!!!#!�PL����������Z��@�4K@H!
Bh[SCSD,*%#44+%2>7#"&=!#"$&546$32#"'.#"-:aVL&��6u��Y����ig��U�}j.7>YySyĊJM���<n��':'k����j/C*X(%O�т�ՔN�8� @YC
D+!#!#3!38�������t������@C
D+!#3����<����QK�PX�B�BYK�PX@CSD@hCSDY�!&$+#"'>7>3232>53�;s�mai<2BgG%��x��F9(T�Z��:�"&@#
B[C
D)(% +3267>;#".'.+#3�I&-�) ���%*:��!X��%�� 
	$�Y
	9�p����@CR
D+%!!3pl��£�����#%@"BhC
D!6)+>7>;#467+"'#32o

�
���--�
��
�53q
�g0��--�2���
���8�@C
D!+2.53#"&'#3>�b���d�
��1��g70��\����'@SCSD((($+#"$&546$324.#"32>�f��������ff����f�H��ts��HH��st��H̡���kk�
��
�ll��ґNN�҄�ёMM����*@'[SC
D
!+#!2#'32>54&+����ɄAF�ȁ��SV,������?t�ed�xC�,OnB��\��$�0s�BK�	PX@kSCSDK�PX@SCSCD@kSCSDYY�(((%&+#"&'#"$&546$324.#"32>�)NpFp�$8�9{C����ff����f�H��ts��HH��st��H�e���/�sk�
��
�ll��ґNN�҄�ёMM�����#2@/B[SC
D#!,!+#!2#"'.#'32>54&+����Ɓ>0[�S$��5��((��U�W,���V���7h�[L�iJ(��)�)Kh?��:����==@:=BhfSCSD;9(&#!#"+#".#"#"&'7>3232>54.54>32�	-EaEAdC";a{�{a;@{�r��Q86QsSElK(;`{�{`;;p�kx�J�")"#<Q/<O8),7TzY^�zFeV\-6-&E`;AS8')6V�_L�nBLH~� @QC
D+!#!5~�1�/���
������#@ CSD+%2>53#".53�Y�a3�O�Ԅ�ԔO�3a��<l�Zg��|ԛXX��|g��Z�l=G�@BC
D, +32>7>;#� �	�"������
"P++P"��g��( @#BC
D+< +32>7>;2>7>;#&'#�"(
	Q#8!O
)#��A���		�����>""?��4C!<��gE)%����@BC
D("(!+	3267>;	#"&'+��'�va	��%�����	���
���P�Y����@BC
D,"+#32>7>;���HG	�:��:_��#>>"-V��
$@!QCQ
D

+!!547!5���2��,���H"���Lv������
'@$[OQE

!#+!+32�p����F��F����	@kD# +32#"&'L!0
YK8
�" �'"#Z����
!@[OQE!"+46;#"&=!!Z��p���3F�����@
BkD+!+3#"&'.'+sf��
����z`+,+�����[@MQE+!5��xx&���	@kD		+2#"&'�! �f���
\��z)9}@!/BK�PX@'h[SCS
D@+h[SC
CSDY@+*10*9+9%##' 	+!#"&/#".54>754&#"#"&/>322>75zO (LT_:;gL-B��ecAYA/ T�vU�Z.�2/NE?{�l1,<^$9'!BeE<oV7Ovy!)!9QP8d�U��#2 �2D*(:%����%�@	BK�	PX@CSCSDK�"PX@CSCSD@!CSC
CSDYY@%%(#+33>32#"&'#"32654.��?�iX�d6<q�fb�3	&QW�70uH��#B`���IYB��~p��QLD\&wPI�B6ʻc�[*J��*i@
*BK�	PX@$hfSCSD@$hfSCSDY�($#(#"+#".#"32>32#".54>32E#6M8JrM'*LmDAT8$2B�n_�xE?y�sj�?A5d�X\�a3&AQKF��|q��NE?H����%p@BK�"PX@CSCS
D@!CSC
CSDY@%%+!"/#".54>323%267.#"[&
A�lW�d6<q�g]�4��=W�71uG��"B`%{O_C��~p��Q?92�?�PI�B5ʻc�[*J���$-{�BK�	PX@'h[SCSD@'h[SCSDY@&%)(%-&-
	$$	+2#!32>32#".54>"!4.#[�p?�^0TtHCaF/2!\ip7i��HAz�r��'"B_=s�l*`�_/$A(;&G�ʃj��M���>gK)��]@
BK�2PX@SCQC
D@YSC
DY@
4%+3'.=354>32+"!!�p�1[�PD: .K6%��]
IbW�]0Y6XA]���2���9M]�@2A*BK�PX@,
[[CS	CSD@/h
[[S	CSDY@ONWUN]O]JH@>#!99+2!#"'#".5467.54>7.54>4.'32>2>54&#"�Bs/*s"9e�SG? !:`zz`:Az�oo�n7_S+3!0 KU9f��*H^hl19G#HmJHrO*��6S8qlkq8RB!	APJyV..$%	2XFAz_9,Ja5KiC8/.**�]JyU.��&.N6";+0BN6K-]nn]-K6���-@*BCSC
D##+33>32#4&#"��A�gSU,�ilO�:���ES7e�V�{�sLA����GK�	PX@SCC
D@SCC
DY@

+##".54>32X��#.-##-.#���>-##-/##/�����(Y�	BK�	PX@SCCSD@SCCSDY@%#U%+#"&'7>323265#".54>32X EmL!6
NB�#.-##-.#���=iN-

`
IQ@>-##-/##/���0@-B[CC
D%(%!+3267>;#"&'.+#K.@���
����2����W�s
��
���X�@C
D+#X���?���*V�)BK�PX@SC
D@CSC
DY@**##&$!	+332>32>32#4&#"#4&#"�j&

8�\gEVa2P}W.�hc,O<#�b^Bq/�%hEXra7P43b�\�{�w{<[<�{�zxG=�
��L�BK�PX@SC
D@CSC
DY@#$!+332>32#4&#"�j&
B�kSU,�ilO�:�%nIZ7e�V�{�sLA�H��#NK�	PX@SCSD@SCSDY@##	+2#".54>2654&#",o�}CC}�oo�~DD~�o����LpK%%KpJ��wx��II��xw��J�xɴ��4b�ZZ�a4���%�@BK�	PX@SCSCDK�PX@SCSCD@!CSCSCDYY@%%($!+32>32#"&'"32654.�j&
A�mW�d6<p�f^�3W�71uH��#B`��L%xO`C��~p��Q>9�@�PI�B6ʻc�[*H���%�K�PX@B@BYK�	PX@SCSCDK�PX@SCSCD@!CSCSCDYY@%%(#+##".54>32763267.#"Ų@�iW�d6<q�gb�6
&��W�70vG��"B`����JZC��~p��QF@O%��PI�@7ʻc�[*��lK�PX@B@BYK�PX@SC
D@hCSC
DY@!$%!+332>32#"&#"�f4�g*D:4]}*��jw�lg�{>��<=@:<BhfSCSD:8'%" #!+#".#"#"&'7>3232>54.54>32�&7L4-H3-J^c^J-2b�]j�<*(9Q=4N4-J_c_J-0\�Vd�:N(5'4&!(<W=FwW2E6D
".<"*7' )>[A:kQ0?7,���>!t@
	BK�2PX@$jhQCTD@"jh[TDY@
!!+"&5#"&=7>;!!32>32�x�z�)Z"��>1)4.��~lG9�����@>U+1z����L�BK�PX@CS
D@C
CSDY@$!#+32673#"/#".5,jkN�:�j&
B�jSV+��zs~JB�%mIY7d�V���@BC
D, +32>7>;#���c���t$H##H$����. @'BC
D*!,< +32>7>;2>7>;#"'.'+���M�	�����
�

����t$C""C$��p#D!!H��"�/0�R"��@BC
D("(!+	3267>;	#"&'+����	�
���c���
��
��@����������@BCD,""++32>7>;�	���^�	
	�������,,}FU�@QCQ
D+!!5467!5!U��)�
'����#�&�J
#ߌ,���@3@0$B[[OSG86303++4&#52654.54>;+";2#".54>�FCCF)S{R5MY)7!!7)YM5R{S)�?QkP@2bbd4EtT.OeV8hcb2&A3%		%4@%2bch8WdP/TtE4ccb�p�@QD+3#把���X��,�@5@2B[[OSG?>=<1/,)3)++546;2654.54>7.54>54&+"&=323"�*R{R5MY)7!!7)YM5R{R*FCCF�2bcc4EtT/PdW8hcb2%@4%		%3A&2bch8VeO.TtE4dbb2@PkQt�9@6jkO[SG
+2673#".#"#4>32�AI�%Ef@4f_V$AI�%EeA4f_VeUFCpP, '!TGCpP-!'!���
!&@#SCQD

+4>734>32#".	y	�"--""--"��-UW\44\WU-���-""-."".���.7�@32&*BK�	PX@)jhfTCSDK�PX@)jhfTCSD@)jhfTCSDYY@	##'#+.54>?>;#".'>32+1\�q?B~�wBR�6.!-?*4?U;&0<�kB�y4LsN'
O��ro��Q��?1>�"	?HJ���9c�4[�>@@=7+Bh[SCS
D%&#&'%"	+46;4>32#"&'.#"!#!>3!#!5>5#4 �6n�nNy^EH

)3B-?`@ ��{929��<">0��$^�{G'DZ4./#*NnD��H�Km-Ls
"3E.!��`#7?@<!B
@ ?WSD42*((+467'7>327'#"&''7.732>54.#"�!�[�,h:9f+�Y�"!�[�,h99e,�Y�"�#>Q//S=$$=S//Q>#�9e,�Z�"!�[�,g:9f+�\�"!�[�,g:.Q=$$=Q./R>##>R,S�"8@5
B
Z	YC
D"! ,!+!32>7>;!!!!#!5!5!�2�h�
!��g3��T�����T��q(��#:;"6��fig��;gi�p�@YQD+3#3#把�������r����HZA@>HXN=#BhfWSDFD-+(&!#!+#".#"#"&'7>3232>54.5467.54>32>54.'1&7L40M51OfifO1NT1>2a�\j�<)(:U?2O62RhnhR2V]2?0\�Vd�:��Fm�>604FOT(B6�*8&9/+.7G\=Q&%bEFwW2E6D
#->&-B3*,3F]@N}#&iK:kP0>7��3G95K/$8.&##I�V{'3K� PX@
SD@OSGY�((($+#".54>32#".54>32� )(() g))))	((**((**D����.Jb�@
BK�	PX@4hf[[		SCSD@4hf[[		SCSDY@
_],,*(#%(%"
+>32#".54>32#".#"32>4>32#".732>54.#"=9�tb�s?Ez�bl�9.2L;FqO++Lj>0B0%�R4_���ee���_44_���ee���_4d,Rr��X��c-Rs��X��b�@BIDz�de�yCD7A-TxKMyR+	e���`44`���ed���`44`���eY��tS-d��Y��vS.e��\?T�)5E@B!-Bh[WSD+*/.*5+5%##' 	+#"&/#".54>754&#"#"&/>322675T<.28"&A0&X�k:9&2%4yI6T:��3J$Fa<4H1 )<)"C5#%?<
*1."<T3��&#i#*"���)�)(+55��:
�
�:/�:
�
�:�
��
��
��
��
��
�;��=K�	PX@_MQE@kMQEY�+!#!�\��;�X!dR�@MQE+!!d���D����3IV��>BK�	PX@/h		[
[SCSD@/h		[
[SCSDY@44VTLJ4I4H)!*,,&+4>32#".732>54.#"#!2#"'.#'32>54.+D4_���ee���_44_���ee���_4d,Rr��X��c-Rs��X��b� ��kj�!�	Pt7M/+F4��e���`44`���ed���`44`���eY��tS-d��Y��vS.e���|}z^�
��.
r(:&%8$�RD@MQE+!!>��DuF'��'@WSD((($+4>32#".732>54.#"F2XwEEwX22XwEEwX26I**H66H**I6hCvW22WvCBuW33WuA*I66I**J77JdP"�7@4YYMQE
	+!!#!5!!!���i��k��k��B������p�x�%�R�Qe-9@6+Bh[SD(&" 
--+2>;2!546?>54&#"#"&/>Z4U<!*6�/��
�, <-.9	G�e6M/(E>:�M+
�455370*jjT|Re=S@P9Bhh[[SD640.*)('==	+2#".'763232>54.#5>54&#"#"&/>b3R; wBE*E[09T=+7+ / 'A/WG:009	C,ATe3D(�-N>7T91H/
 (+W<424/(5O5��U�	@kD	#++7>3U�j�! ���
�z����3@0BCS
CD&$!#+32673#"/#"&'#"&5,liN�:�j&
C�WJp'Y&)��nmxJB�%mHD3.*W&��($*�7�*@'hiSD+##!#".54>3۝��h�u??u�h���7�7]=i�QV�e8|���@OSG($+4>32#".|)68((86)Q8((86))6����
�K�PX@
B@
BYK�	PX@^TDK�PX@jTD@jjTDYY@+232654.'73#"&'76� *+)<&+pZQ 9P0)J�	!�PE6 3$7x�D_O�	BK�$PX@jjQD@jjMRFY�$+37#"/733!��k	'�l��i��+X	8��zUH<��)@&WSD	+2#".54>2654&#"~FqP,,PqFGrQ,,QrGTSSTWSS�+PsGHtQ++QtHGsP+��iddhhddi��
�%�%(+7'&54767&'&54?%'&54767&'&54?�:
�
�
:�(�:
�
�
:�

�{�{

f|� &0O@L$	Bh		Z
[CS
D0.+)&% $!#
+3+#5!"&/3%37#"/733!4673+>;m
Rm��
V|���k	'�l��i��,L2. MA��9�;�+X	8��zU�,���\ f]�-=Ge@b710+Bhh		Z[CS

DGEB@=<;:9853/.(&" 
--
+2>;2!546?>54&#"#"&/>%37#"/733!+>;f4U<!*6�/��
�, <-.9	G����k	'�l��i�,L2. M�6M/(E>:�M+
�455370*jj3�+X	8��zU�v\ D}�NT^x@uJ	
%RB

h		h
	
	[[
\SCS
D^\YWTSGEA?;:980.)'!NN!#+3+#5!"&/32#".'763232>54.#5>54&#"#"&/>4673+>;m
Rm��
V|�B3R; wBE*E[09T=+7+ / 'A/WG:009	C,AT���,L2. MA��9��3D(�-N>7T91H/
 (+W<424/(5O5�\,���\ ,��)=9@6BhfSCTD('#-$+#".54>?332>324>32#".KXh<O�b8-ERG3z-EOE-":O-=W<&�q!..""..!�4(,RvKLjL601!��,>2/<P;,E1$."".-""-��
I�&$	k��
I�&$k��
I�&$
v��
I�&$v��
I�&$
v��
I-&$s����:@7BYYQCS
D#	+!!!!!!!+!���</��=a��1�Գ%���^���$�������)EZ��	�K2K�PX@:>
IB@:>
IBYK�	PX@0hfSCSC	SDK�
PX@0hfSCSC	SDK�PX@0hfSCSC	SD@7hf	hSCSCSDYYY@GE=<861/'% KK
+232654.'7.546$32#".#"32>7632#"&'76� *+)<&$��Vi�	���Y?
(6Jb@s��MM��i@fWK&
LS�ZQ 9P0)J�	!vu����kbTY

 O�҂�ґL 1"
Sap7E6 3$7���!�&(	7���!�&(7���!�&(
B���!�&(
B������&,	������&,�����{�&,
����x�&,
2��!,@)YSCS
D!%(!+3!2#!#%4.#!!!!2>2���ff��������H��t��}��Ut��H�g��������g�2�АL�r�L����8�&1���\����&2	���\����&2���\����&2
���\����&2���\����&2
�~�X�	(+		'	7	���b_����_d��_YX�����`b��`dY`��X\����!-8h@21&%BK�PX@kCSCSD@jkSCSDY�)*%(%$+#"&'+&546$327>;.#"4&'32>�f����l�Od:N�p{f��s�SR  d�gp�AKE�<�Ws��H�A<�qt�t��H̡���k10�b ��
�l:6o�b�꫇�I�*+N�҄~�H��FM��������&8	�������&8�������&8
�������&8
�����&<9��.@+[[C
D!+#332#'32>54&+����ɄAF�ȁ��SV,��������?t�ed�xC�,OnB�����v�HwK�PX�B�BYK�PX@hSCSD@#hSC
CSDY@CB=;%# HH+2#"&'7>3232>54.54>54.#"#4>�g�b/+@K@+5P]P59d�Oa�<)(7K5,F18TbT8-CNC-8Y?DoO+�E���<]n3<VB203 '4-/FfNNzU-E6D
".@%8F3*:SB5O?6<G0 A4!*T~T�&�h�zB��\��z�&DC���\��z�&Dv���\��z�&D����\��z�&D����\��z{&Dj���\��z�&D��\��CQ\�@A;BK�	PX@5hh

[S	CSDK�PX@5hh

[S	CSD@?hh

[S	CSCSDYY@&SRXWR\S\MKED?=8631.-%#
	CC+2#!32>32#"&'#".54>754&#"#"&/>32>32>5"!4.�R�g;��.MiAE\=&/!Wcj4u�7Wjw;ErS-B��ecAYA/ T�qx�!6���{�l1dQ9cI*�=`E)�<W@z�p)[�Z,$	=(;&qt>X8#FjH<t\;2v~#*#9QPf[Xg��#8H*WP$JnJ�)NpFAoP-J��H�K�PX@7;
FB@7;
FBYK�PX@-hffSCTD@3hfffSCTDY@DB42/-%# HH	+232654.'7.54>32#".#"32>32#"&'76� *+)<&%S�f:?y�sj�?/#6M8JrM'*LmDAT8$2;�aZQ 9P0)J�	!yO��qq��NE?@5d�X\�a3&	AHJ:E6 3$7��J����&HC���J����&Hv���J����&H����J���{&Hj�������&�C����(�&�v�����6�&�������){&�j�L���4H6@3:0B43@[SD65@>5H6H.,$"+.54?.'.54?7#".54>32.'2>7.#"�g-e9`�Q�#a<cF'>{�xb�}H>t�hd�Au^�_GsQ.4Kc>KqL'.Pi)
H"><0z9
C1|��n��VB{�p^�~JVW��@���6m�o+Q?%2WwDQV-�����&Q���H���&RC���H���&Rv���H���&R����H���&R����H��{&Rj�d�"�++@([YOSG(((%+!!4>32#".4>32#".d��Bb!--""--!!--""--!��."".-""-�S."".-""-@��-I!+5t@43%$BAK�	PX@ jkSCSD@ jkSCSDY@
-,,5-5%%(%'+#"&'+7.54>327>;&#"2>54'�=BC}�oL�67;C�BFD~�oO�8D  Z��;�IoLtO(7KsO(4�OFtD�vx��I" J�E�|w��J&#[���aN86d��$5d�Z�`��0��z����&XC���z����&Xv���z����&X����z���{&Xj�������&\v�����#q@BK�	PX@!CSCSCD@!CSCSCDY@##(#+3>32#"&'"32654.��?�iW�d6<p�f_�3W�71uH��#B`����JYB��~p��QE?�3�PI�B6ʻc�[*�����{&\j�
����'/�K�PX@
,B@
,BYK�PX@!ZC
C	SD@(	hZC
CSDY@)($"
''
+2#"&5467"&'!+3#32>!&'d	]3XeO< ��}�"�=�=%*"1*
�?�
�BOB:e&Z����g'/&+	�G6Q)E\���CS�@;I	BK�PX@1h		[SC
SCSD@8hh		[SC
SCSDY@EDKJDSES%##.%#'+!32>32#"&54>7&/#".54>754&#"#"&/>322>75z*"1*
	]3Xe'5
(LT_:;gL-B��ecAYA/	 T�vU�Z.�2/NE?{�l1,<'/&+	BOB83- ^$9'!BeE<oV7Ovy!)!9QP8d�U��#2 �2D*(:%��Z��	�&&���J���&Fv����4�&�K�PX�B�	BYK�PX@*YQCQ
C	
SD@1
		hYQCQ
C		SDY@#!
&&+2#"&5467!!!!!!#32>	]3XeO<�Zs�P-���[*"1*
�BOB:e&���$���'/&+	J���<E�K�PX@
-B@
-BYK�PX@2h		[SCSC
SD@9h
h		[SCSCSDY@>=A@=E>E97+)&$ 
<<+2#"&5467.54>32#!32>3232>"!4.�	]3XeB4g�~FAz�n[�p?�^0TtHCaF/22�R'!1*
���'"B_�BOB5]%H�ȁj��M=s�l*`�_/$A<G&.&+	U��>gK)�X�@C
D+#X����,�#@ 
BCR
D+%!!54?3����l�һ��%ā��"�*_�
V�6K�#@ 
BC
D+7#54?���������MfC��LiD���8�&1������&Qv\��'�02@
BK�PX@"YS
C	S
DK�"PX@,YSCQ
C	S
DK�,PX@6YSCQ
C	Q
C	SDK�0PX@4YSCQ
C	Q
C	SD@2YSCQ
CQ
C		SDYYYY@-+#!(#+!!!!!5#".54>3254.#"32>'�P-�����T����\\�ꎡ�T@w�hh�xAAx�hh�w@���$����x�k�
��
�l�y�3�ӔOO�ӄ�ӓNN��H��u0@K�@.
BK�	PX@,h

[
	SCSD@,h

[
	SCSDY@$BA21GFAKBK:81@2@,*" 
	00+2#!32>32#"&'#".54>32>2654.#""!4.�R�g;��.MiA=Y@-3!Wcj4w�76��d�u@@w�f��52�����"DhEGhE"�e=`E*�<W@z�p)[�Z,$A(;&swpzI��xw��Jyni~�xɴZ�b44b�Z��)NpFAoP-��:����&6��>���&Vv���:����&6��>���&V������&<
D��V��&=N��FU�&]v���V�&=X��FU�&]����V��&=X��FU�&]��j����#6@3
BYSCTD###"+#5432>7'.=37>3#"!�Y��<-Q?,Y����.Q@-	B�&͹^9:\D�I�ƿb:]D���d�
@BkD' +#"/+3dw��{ߦ�~~	�d�@BkD+ +32>?>;#{��wߦ�
}	

}	�����RDq �D� @WD
+".5332>532MhA~"9++9"~Ai�+Ib7!9((9!7bI+����@SD($+#".54>32�#.-""-.#:-""-/##/jk��=K�PX@WSD@[OSGY�$&($+4>32#".732654&#"j 7H()I8  8I)(H7 d6/-77-/6#*D22D*)D00D),88,-88����
YK�PX@B@@B@YK�PX@
SD@jSDY@+2#"&54>732>�	]3Xe+;"\*"1*
�BOB;6/
'/&+	�Y�QK�.PX@WSD@O[SGY@
+2673#".#"#4>32�$'l/A(#=60Ho0B'#=6/-*,/O8"X0O9"^���	#@ SD




	#++7>3!+7>3��J�
!!��V�!������
�0����!Y�BK�(PX@SCS
D@SC
CSDY@! 6##++#!#"&'7>3265#54>3����sy�"BB9�	�H$��r��w�K	>B|@
�
��@MQE+!!� �����
��@MQE+!!�2����:�'��(+.5467rYP7
�0a0Z�E"
,16 D&
Z�F��(+'.547>54&'&547YO7
�0`0[�E"
-16 D&Z��F��(+%'.547>54&'&547YO7
�0`0[�E"
-16 D&:�W�1�(+.5467.5467rYP7
�YP7
�0a0Z�E"
,16 D&
,0a0Z�E"
,16 D&
Z�v�1�(+'.547>54&'&547%'.547>54&'&547YO7
�YO7
�0`0[�E"
-16 D&,0`0[�E"
-16 D&Z��v�1�(+%'.547>54&'&547%'.547>54&'&547YO7
�YO7
�0`0[�E"
-16 D&,0`0[�E"
-16 D&v���3@0
	BCSCD#$&"+4632632>72!#"'!v)+"LPP'(57&N�E,(�x&75(�w�0	
��0<�`��	�v���/G@D
	%$ B[C	SCD/.$$#$&"
+4632632>72!!#.'#"'"&=!!v)+"LPP'(57&N�E,(�x�(,E�N&75(N�E+)��w�0	
��0<��<0��0<X����,K�PX@SD@OSGY�($+4>32#".�;d�LM�e;;e�ML�d;SM�e;;e�MM�d;;d�X��V�';@SD((((($+74>32#".%4>32#".%4>32#".X!..""..!!..""..!��!..""..!n."".-""-."".-""-."".-""-H����'1EYm��K�PX@+[	[SC
		S

DK�"PX@/[	[SC
C
		S
D@3[	[CSC
C
		S
DYY@~|trjh`^VT((%#&((($+#".54>324.#"32>>;+#".54>324.#"32>%#".54>324.#"32>�4Wt?DsV00VsDCuU1�1A%%A00A%%A1�	���
�54Ws?DsV00VsDCtV0�1A%%A00A%%A1h4Wt?DsV00VsDCuU1�1A%%A00A%%A1?T�[00[�TV�\00\�VB\;;\BA[99[}
��
RT�[00[�TV�\00\�VB]::]BAZ99ZAT�[00[�TV�\00\�VB]::]BAZ99Z�����(+5��:
�
�:�
��
��
�����(+'&54767&'&54?�:
�
�
:�{

�D#�	@C
D#"+'+>;,L2. M5\ "��r�G[@X	5	Bh		h
[	[SC
S


DGF@?>=9720"###%$+3>32#".#"!#!!#!32>32#".'#53&45467#"�_��l��F=%>aK�� #���j��6R<+ KFЏt��W����~ˏLdXD	
&.&�7(8�� % FfqO�Ӄf)@I)�&C@@BhS	CS	D&&!4)
+>7>;#7+"'#32'###5��	jn	�
�nj�~�U/
��mK��MH��P
i��iV~�71@.1BSCS
D76***+!>54.#"!"&=!5.54>32!#DQ�c7E{�dd�{E7b�Q�$�`�l;c���c;m�`�$�Ag�]k�m88m�k]�gA�J#d�`��e�֚VV�րe��`�d#\��2�*>C@@0Bh[SCSD,+64+>,>#'(($+>32#".54>32>54&#"#"&'2>7.#"\'INV3Z�h9I�ݔV�h:L��ph�0�|*G8*
xBw`G
&>W:T�X- <U9*J�ʀ���9k�_sʔVYV%C����7p�s,S@&>m�WAfF%b�@	BCR
D+3!%!.'`�S��M��				��g��:"";>���$@!QCD+##!##5���������W��W�T���&@#BQCQD+!!!!5467	.5T��e=����Q	
u�����;4�;�A�
�\��@MQE+!!�\���.��"@
Bj[
D,# +#"&=!2>7>;#�)O�	�s�֕�!)9�e D"8G�P:� �';OL@IK-B[
	O
	SG=<)(GE<O=O31(;);	''+%".'#".54>32>32%2>7.#"!2>54.#"�8[MAAL\7>qU22Uq>7\LAAM[8>pV22Vp�O$>7227>$$?00?�$?//?$$>8228>�";L**L;"0Y|LL|X1";L**L;"1X|LL|Y0�5E''E4/H00H//H00H/4E''E5����\�#(@%BSCSD6''"+>32#"#"&'7>32>7v��&E do�
Ac�K#J
	 :W=%C��V	
mv��f�_-
L
;]B�~��7�@0!/"BK�	PX@+[[	O[	SGK�PX@$[[	WSD@+[[	O[	SGYY@42+)&$77

+2>7#".#"'>322>7#".#"'>326."	#p=4ge_-8."	#qB5hd_-6."	#p=4ge_-8."	#qB5hd_Zr/.!(!
m31!)!��
q0.!)!m31!(!���~kK�PX@)^_	ZMQE@'jk	ZMQEY@

+!733!!!#7!5!7!��r�r��_��2w�w��K_�V���ȇ�����P��!@@MQE+!!��G.32�����yz�
�z{�
��P��!@	@MQE+5467%67.'%.=!5!��)81�G��J��z�
�z�������"@
BMQE+3	#>7	&'��|��z|�	��
�5���4��&&EF+#&�����@CD+3#�����!a@BK�2PX@SCQC
D@YSC
DY@!!U%+3'.=354>32#"&#"!#!�p�:t�s&O��d��T]
I8]�p>

]
��3�`������BK�&PX@SCQC
DK�2PX@"CSCQC
D@ YCSC
DYY@A!%	+3'.=354>32;#.#"!!�p�4h�hS�Hd�6m(����]
I6T�pB
�Y*��6��������
@SD


+2+h
>1P
2H4��
��	@ja		+2#"&'%�  Ӌ���
����v�'@OSG((($+#".54>32#".54>32�)'')�((((�''))''))D'"�@MQE+!!D�"�j�
��@ja
#++7>3�����
���
��
x�@Bja* +#"&/&'+73x�	��	��
__���
x�@
Bja,!+#'32>?>;���	��	�
�^^�J�
(@%jOSG


+"&53326533��sNVVNs��sr;==;i|��@OSG($+#".54>32�"-,!!,-"�,!!,,"",v��-!@[OSG$&($+4>32#".732654&#"v3D&'E55E'&D3Y6/-77-/6{'B//B'&@..@&+99+-88V�1@.O[SG
+2673#".#"#4>32�#%b*>(#@;4"%d+?'#@:4)%+H5+$+I4N
��	+@(OSG




	#++7>3!+7>3��V�&!��`�( ��
��
��|��
@SD


+2+� 
>9�
!;ZBG���C�_<��ʓ^p�ӡ�D���-	��V	�D�C�'-�����6�j$H~R��X�XJ `�d�^�d�X���<���h�l�(�l�l�n�`������������"lVP
�ZZ����l��Z��f�x<R��0���<\��<\�$:���P���VX���XZ��f&�\^��J^HJ��2X�������j�X�XHP�^H&�d>�,Xz���FX,X�XX�t������4���,X��rf<D�\�����d<DfF�d�R�Tf�Xz:*"|f��x�H���f�f�D,P
P
P
P
P
P
B��ZZ��������f��f�f��f��*2��<\<\<\<\<\�~<\��������������\�\�\�\�\�\`\�JJJJJ�������RLX�XHXHXHXHXH�dX@XzXzXzXzP�P
�\ZZ�J��J�>,�6��X��\�HH:d>$:d>��V�F�V�F�V�F�jffff f�fjf�ff^�0X�j��:�Z�Z�:�Z�Z�v�v���X	Hx�x�f�D�"�@�V�\pX>XT��z.X: ��������������t�f�f��f��fDf�f��f��ff�fvffNf�l�#`�	�J��N��J#��$�J&��*��2��4��90:0<?0D��F��G��H��R��T��m�No�Ny�N}�N��J��J��J��J��J��J��J��������������������������������������������������������������������������������J��������������N�N���N�N�N��J
	�J
�
�N
�
�J
#��
$�J
&��
*��
2��
4��
90
:0
<
?0
D��
F��
G��
H��
R��
T��
m�N
o�N
y�N
}�N
��J
��J
��J
��J
��J
��J
��J
���
���
���
���
���
���
���
�
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
�J
��
��
��
��
��
��
�
�N
�N
�
�
�N
�N
�N
��J#��&��*��2��4��F��G��H��R��T���������������������������������������������������������������������
	�J
�
�N
�
�J
#��
$�J
&��
*��
2��
4��
90
:0
<
?0
D��
F��
G��
H��
R��
T��
m�N
o�N
y�N
}�N
��J
��J
��J
��J
��J
��J
��J
���
���
���
���
���
���
���
�
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
�J
��
��
��
��
��
��
�
�N
�N
�
�
�N
�N
�N
��J�
�
��x#��&��*��2��4��7�L9�L:��<�h?�LY�|Z��\�|l�m�xo�xr�y�x|�}�x�����������������������h�����h�x�x�����x�x�x���N	��
�N
�N�x�x��$��7�L9��:��;��<�`=��?��l�Nr�N|�N�����������������������`���`�������N�N�x�N�N�x��N����
�
��x#��&��*��2��4��7�L9�L:��<�h?�LY�|Z��\�|l�m�xo�xr�y�x|�}�x�����������������������h�����h�x�x�����x�x�x��0	�x
0
0�@���@�x����"0#��$�x&��*��-�h2��4��D��F��G��H��I��J�xP��Q��R��S��T��U��V��W��X��Y��[��\��]��l0m��o��r0t:u:w��y��{:|0}����x��x��x��x��x��x��x����������������������������������������������������������������������������������������������x�����������������0�0�@�0�0�@����0��x#��#	��#
��#��#
��#��#��#��#$��#7��#9��#;��#<��#=��#?��#@��#`��#l��#r��#|��#���#���#���#���#���#���#���#���#��#��#��#��#��#��#��#��#��#��#��#���#���$�J$
�J$
�J$��$"��$#��$&��$*��$-2$2��$4��$7�|$8��$9�x$:��$<�\$?�x$Y��$\��$l�J$m��$o��$r�J$t�H$u�H$y��${�H$|�J$}��$���$���$���$���$���$���$���$���$���$���$���$��\$��$��$�\$��$��$�J$�J$�J$�J$��$��$��$��J&�j&m�j&o�j&y�j&}�j&�j&�j&�j&�j&�j'��'	��'
��'��'
��'��'��'��'$��'7��'9��';��'<��'=��'?��'@��'`��'l��'r��'|��'���'���'���'���'���'���'���'���'��'��'��'��'��'��'��'��'��'��'��'���'���)	�|)�L)�L)�|)��)��)")$�|)-�:)F��)G��)H��)P��)Q��)R��)S��)T��)U��)X��)w��)��|)��|)��|)��|)��|)��|)��|)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)�|)��)��)��)��)�L)�L)��|-	��-��-��-��-$��-���-���-���-���-���-���-���-��-��-��-���.��.#��.&��.*��.2��.4��.F��.G��.H��.I��.R��.T��.W��.Y��.Z��.\��.m��.o��.y��.}��.���.���.���.���.���.���.���.���.���.���.���.���.���.���.���.���.���.���.���.��.��.��.��.��.��.��.��.��.��/��/
��/
��/6/�:/6/"��/#��/&��/*��/2��/4��/7�T/9�J/:�h/<�,/?�J/F��/G��/H��/R��/T��/Y��/Z��/\��/l��/m�:/o�:/r��/t�6/u�6/y�:/{�6/|��/}�:/���/���/���/���/���/���/���/��,/���/���/���/���/���/���/���/���/���/���/���/���/��/��/��/��/��/�,/�:/�:/��/��/�6/��/��/�6/�:/�:/�:/���2��2	��2
��2��2
��2��2��2��2$��27��29��2;��2<��2=��2?��2@��2`��2l��2r��2|��2���2���2���2���2���2���2���2���2��2��2��2��2��2��2��2��2��2��2��2���2���3	�v3�3�3�v3$�v3-�J3D��3F��3G��3H��3R��3T��3��v3��v3��v3��v3��v3��v3��v3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3�v3��3��3��3��3�3�3��v4��4	��4
��4��4
��4��4��4��4$��47��49��4;��4<��4=��4?��4@��4`��4l��4r��4|��4���4���4���4���4���4���4���4���4��4��4��4��4��4��4��4��4��4��4��4���4���5#��5&��5*��52��54��57��58��5���5���5���5���5���5���5���5���5���5���5���5��5��7	�|7�L7�L7�L7�|7�`7�`7#��7$�|7&��7*��7-�872��74��7D�7F�.7G�.7H�.7J�D7P�`7Q�`7R�.7S�`7T�.7U�`7V�^7X�`7Y�L7Z�t7[�p7\�L7]��7m�L7o�L7w�`7y�L7}�L7��|7��|7��|7��|7��|7��|7��|7���7���7���7���7���7���7���7��7��7��7��7��7��7��7��.7��.7��.7��.7��.7��.7��`7��.7��.7��.7��.7��.7��.7��`7��`7��`7��`7�|7�7��7�.7�.7�`7��7�.7�L7�L7�L7�L7�L7�L7�L7��|8	��8��8��8��8$��8���8���8���8���8���8���8���8��8��8��8���909	�x9
09
09�@9��9�@9�x9��9��9"09#��9$�x9&��9*��9-�h92��94��9D��9F��9G��9H��9I��9J�x9P��9Q��9R��9S��9T��9U��9V��9W��9X��9Y��9[��9\��9]��9l09m��9o��9r09t:9u:9w��9y��9{:9|09}��9��x9��x9��x9��x9��x9��x9��x9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9�x9��9��9��9��9��9��9��9�9�9�09�09�@9�09�09�@9�9�9�9�09��x:0:	��:
0:
0:��:��:��:��:"":$��:-��:D��:F��:G��:H��:J��:R��:T��:V��:l0:m��:o��:r0:t0:u0:y��:{0:|0:}��:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:��:��:��:��:��:��:��:�0:�0:�:�0:�0:�:��:��:��:�0:���;��;#��;&��;*��;2��;4��;F��;G��;H��;I��;R��;T��;W��;Y��;Z��;\��;m��;o��;y��;}��;���;���;���;���;���;���;���;���;���;���;���;���;���;���;���;���;���;���;���;��;��;��;��;��;��;��;��;��;��<<	�\<
<
<�h<�`<�h<�\<��<��<""<#��<$�\<&��<*��<-�8<2��<4��<D��<F�`<G�`<H�`<J�T<P��<Q��<R�`<S��<T�`<U��<V��<X��<Y��<Z��<[�|<\��<l<m�`<o�`<r<t2<u2<w��<y�`<{2<|<}�`<��\<��\<��\<��\<��\<��\<��\<���<���<���<���<���<���<���<���<���<���<���<���<���<���<��`<��`<��`<��`<��`<��`<���<��`<��`<��`<��`<��`<��`<���<���<���<���<�\<��<��<�`<�`<��<��<�`<�`<�`<�<�<�h<�<�<�h<�`<�`<�`<�<��\=��=""=#��=&��=*��=2��=4��=F��=G��=H��=R��=T��=V��=Y��=\��=m��=o��=y��=}��=���=���=���=���=���=���=���=���=���=���=���=���=���=���=���=���=���=���=���=��=��=��=��=��=�=�=�=�=�>#��>&��>*��>2��>4��>F��>G��>H��>R��>T��>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>��>��>��>��>��?�J?
�J?
�J?��?"��?#��?&��?*��?-2?2��?4��?7�|?8��?9�x?:��?<�\??�x?Y��?\��?l�J?m��?o��?r�J?t�H?u�H?y��?{�H?|�J?}��?���?���?���?���?���?���?���?���?���?���?���?��\?��?��?�\?��?��?�J?�J?�J?�J?��?��?��?��JD��D
��D
��DY��DZ��D\��Dl��Dr��Dt��Du��D{��D|��D�D�D�D�D���E��E
��E��E
��E9��E:��E?��E@��EY��E[��E\��E`��El��Er��E|��E�E�E�E�E���H��H
��H��H
��H9��H:��H?��H@��HY��H[��H\��H`��Hl��Hr��H|��H�H�H�H�H���IDI
DI
DI�~I�~IlDIrDItdIudI{dI|DI�DI�DI�~I�DI�DI�~I�DK��K
��K
��KY��KZ��K\��Kl��Kr��Kt��Ku��K{��K|��K�K�K�K�K���NF��NG��NH��NR��NT��N���N���N���N���N���N���N���N���N���N���N���N���N��N��N��P��P
��P
��PY��PZ��P\��Pl��Pr��Pt��Pu��P{��P|��P�P�P�P�P���Q��Q
��Q
��QY��QZ��Q\��Ql��Qr��Qt��Qu��Q{��Q|��Q�Q�Q�Q�Q���R��R
��R��R
��R9��R:��R?��R@��RY��R[��R\��R`��Rl��Rr��R|��R�R�R�R�R���S��S
��S��S
��S9��S:��S?��S@��SY��S[��S\��S`��Sl��Sr��S|��S�S�S�S�S���U�|U�|UD��U���U���U���U���U���U���U���U��U�|U�|Y	��Y�|Y�|Y��Y$��YF��YG��YH��YR��YT��Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y��Y��Y��Y��Y�|Y�|Y���Z��Z��Z��Z��[F��[G��[H��[R��[T��[���[���[���[���[���[���[���[���[���[���[���[���[��[��[��\	��\�|\�|\��\$��\F��\G��\H��\R��\T��\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\��\��\��\��\�|\�|\���^#��^&��^*��^2��^4��^F��^G��^H��^R��^T��^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^��^��^��^��^��l	�Jl�l�Nl�l�Jl#��l$�Jl&��l*��l2��l4��l90l:0l<l?0lD��lF��lG��lH��lR��lT��lm�Nlo�Nly�Nl}�Nl��Jl��Jl��Jl��Jl��Jl��Jl��Jl���l���l���l���l���l���l���l�l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l�Jl��l��l��l��l��l��l�l�Nl�Nl�l�l�Nl�Nl�Nl��Jm�Nm	��m
�Nm
�Nm�xm�xm��m$��m7�Lm9��m:��m;��m<�`m=��m?��ml�Nmr�Nm|�Nm���m���m���m���m���m���m���m��`m��m�`m��m��m��m�Nm�Nm�xm�Nm�Nm�xm��Nm���o�No	��o
�No
�No�xo�xo��o$��o7�Lo9��o:��o;��o<�`o=��o?��ol�Nor�No|�No���o���o���o���o���o���o���o��`o��o�`o��o��o��o�No�No�xo�No�No�xo��No���p��p	��p
��p��p
��p��p��p��p$��p7��p9��p;��p<��p=��p?��p@��p`��pl��pr��p|��p���p���p���p���p���p���p���p���p��p��p��p��p��p��p��p��p��p��p��p���p���r	�Jr�r�Nr�r�Jr#��r$�Jr&��r*��r2��r4��r90r:0r<r?0rD��rF��rG��rH��rR��rT��rm�Nro�Nry�Nr}�Nr��Jr��Jr��Jr��Jr��Jr��Jr��Jr���r���r���r���r���r���r���r�r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r�Jr��r��r��r��r��r��r�r�Nr�Nr�r�r�Nr�Nr�Nr��Jt	�Ht�Ht$�Ht9:t::t<(t?:t��Ht��Ht��Ht��Ht��Ht��Ht��Ht�(t�Ht�(t��Hu	�Hu�Hu$�Hu9:u::u<(u?:u��Hu��Hu��Hu��Hu��Hu��Hu��Hu�(u�Hu�(u��Hy�Ny	��y
�Ny
�Ny�xy�xy��y$��y7�Ly9��y:��y;��y<�`y=��y?��yl�Nyr�Ny|�Ny���y���y���y���y���y���y���y��`y��y�`y��y��y��y�Ny�Ny�xy�Ny�Ny�xy��Ny���{	�H{�H{$�H{9:{::{<({?:{��H{��H{��H{��H{��H{��H{��H{�({�H{�({��H|	�J|�|�N|�|�J|#��|$�J|&��|*��|2��|4��|90|:0|<|?0|D��|F��|G��|H��|R��|T��|m�N|o�N|y�N|}�N|��J|��J|��J|��J|��J|��J|��J|���|���|���|���|���|���|���|�|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|�J|��|��|��|��|��|��|�|�N|�N|�|�|�N|�N|�N|��J}�N}	��}
�N}
�N}�x}�x}��}$��}7�L}9��}:��};��}<�`}=��}?��}l�N}r�N}|�N}���}���}���}���}���}���}���}��`}��}�`}��}��}��}�N}�N}�x}�N}�N}�x}��N}�����J�
�J�
�J����"���#���&���*���-2�2���4���7�|�8���9�x�:���<�\�?�x�Y���\���l�J�m���o���r�J�t�H�u�H�y���{�H�|�J�}�������������������������������������������������\��������\��������J��J��J��J������������J��J�
�J�
�J����"���#���&���*���-2�2���4���7�|�8���9�x�:���<�\�?�x�Y���\���l�J�m���o���r�J�t�H�u�H�y���{�H�|�J�}�������������������������������������������������\��������\��������J��J��J��J������������J��J�
�J�
�J����"���#���&���*���-2�2���4���7�|�8���9�x�:���<�\�?�x�Y���\���l�J�m���o���r�J�t�H�u�H�y���{�H�|�J�}�������������������������������������������������\��������\��������J��J��J��J������������J��J�
�J�
�J����"���#���&���*���-2�2���4���7�|�8���9�x�:���<�\�?�x�Y���\���l�J�m���o���r�J�t�H�u�H�y���{�H�|�J�}�������������������������������������������������\��������\��������J��J��J��J������������J��J�
�J�
�J����"���#���&���*���-2�2���4���7�|�8���9�x�:���<�\�?�x�Y���\���l�J�m���o���r�J�t�H�u�H�y���{�H�|�J�}�������������������������������������������������\��������\��������J��J��J��J������������J��J�
�J�
�J����"���#���&���*���-2�2���4���7�|�8���9�x�:���<�\�?�x�Y���\���l�J�m���o���r�J�t�H�u�H�y���{�H�|�J�}�������������������������������������������������\��������\��������J��J��J��J������������J��j�m�j�o�j�y�j�}�j��j��j��j��j��j����	���
������
������������$���7���9���;���<���=���?���@���`���l���r���|�������������������������������������������������������������������������������	���
������
������������$���7���9���;���<���=���?���@���`���l���r���|�������������������������������������������������������������������������������	���
������
������������$���7���9���;���<���=���?���@���`���l���r���|�������������������������������������������������������������������������������	���
������
������������$���7���9���;���<���=���?���@���`���l���r���|�������������������������������������������������������������������������������	���
������
������������$���7���9���;���<���=���?���@���`���l���r���|�������������������������������������������������������������������������������	���
������
������������$���7���9���;���<���=���?���@���`���l���r���|����������������������������������������������������������������������������	������������$��������������������������������������������	������������$��������������������������������������������	������������$��������������������������������������������	������������$���������������������������������������������	�\�
�
��h��`��h��\�������""�#���$�\�&���*���-�8�2���4���D���F�`�G�`�H�`�J�T�P���Q���R�`�S���T�`�U���V���X���Y���Z���[�|�\���l�m�`�o�`�r�t2�u2�w���y�`�{2�|�}�`���\���\���\���\���\���\���\�����������������������������������������������������������`���`���`���`���`���`�������`���`���`���`���`���`������������������\��������`��`��������`��`��`������h������h��`��`��`�����\����	���
������
������������$���7���9���;���<���=���?���@���`���l���r���|�������������������������������������������������������������������������������
���
���Y���Z���\���l���r���t���u���{���|������������������
���
���Y���Z���\���l���r���t���u���{���|������������������
���
���Y���Z���\���l���r���t���u���{���|������������������
���
���Y���Z���\���l���r���t���u���{���|������������������
���
���Y���Z���\���l���r���t���u���{���|������������������
���
���Y���Z���\���l���r���t���u���{���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
���
���Y���Z���\���l���r���t���u���{���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|����������������J�
�J�
�J����"���#���&���*���-2�2���4���7�|�8���9�x�:���<�\�?�x�Y���\���l�J�m���o���r�J�t�H�u�H�y���{�H�|�J�}�������������������������������������������������\��������\��������J��J��J��J������������J����
���
���Y���Z���\���l���r���t���u���{���|����������������j�m�j�o�j�y�j�}�j��j��j��j��j��j����
������
���9���:���?���@���Y���[���\���`���l���r���|����������������t�
�t�
�t����9�^�:���<�h�?�^�Y���\���l�t�m���o���r�t�t�|�u�|�y���{�|�|�t�}�����h��h������t��t��t��t���������t����
���
���Y���Z���\���l���r���t���u���{���|������������������
������
���9���:���?���@���Y���[���\���`���l���r���|����������������	�\�
�
��h��`��h��\�������""�#���$�\�&���*���-�8�2���4���D���F�`�G�`�H�`�J�T�P���Q���R�`�S���T�`�U���V���X���Y���Z���[�|�\���l�m�`�o�`�r�t2�u2�w���y�`�{2�|�}�`���\���\���\���\���\���\���\�����������������������������������������������������������`���`���`���`���`���`�������`���`���`���`���`���`������������������\��������`��`��������`��`��`������h������h��`��`��`�����\����""�#���&���*���2���4���F���G���H���R���T���V���Y���\���m���o���y���}�����������������������������������������������������������������������������������������������������������""�#���&���*���2���4���F���G���H���R���T���V���Y���\���m���o���y���}�����������������������������������������������������������������������������������������������������������""�#���&���*���2���4���F���G���H���R���T���V���Y���\���m���o���y���}���������������������������������������������������������������������������������������������������������N�	���
�N�
�N��x��x����$���7�L�9���:���;���<�`�=���?���l�N�r�N�|�N�������������������������������`�����`�����������N��N��x��N��N��x���N������N�	���
�N�
�N��x��x����$���7�L�9���:���;���<�`�=���?���l�N�r�N�|�N�������������������������������`�����`�����������N��N��x��N��N��x���N�����	�J����N����J�#���$�J�&���*���2���4���90�:0�<�?0�D���F���G���H���R���T���m�N�o�N�y�N�}�N���J���J���J���J���J���J���J������������������������������������������������������������������������������������������������������������J����������������������N��N������N��N��N���J�	�J����N����J�#���$�J�&���*���2���4���90�:0�<�?0�D���F���G���H���R���T���m�N�o�N�y�N�}�N���J���J���J���J���J���J���J������������������������������������������������������������������������������������������������������������J����������������������N��N������N��N��N���J���
��
���x�#���&���*���2���4���7�L�9�L�:���<�h�?�L�Y�|�Z���\�|�l��m�x�o�x�r��y�x�|��}�x�������������������������������h��������h��x��x����������x��x��x����	�J����N����J�#���$�J�&���*���2���4���90�:0�<�?0�D���F���G���H���R���T���m�N�o�N�y�N�}�N���J���J���J���J���J���J���J������������������������������������������������������������������������������������������������������������J����������������������N��N������N��N��N���J�	�J����N����J�#���$�J�&���*���2���4���90�:0�<�?0�D���F���G���H���R���T���m�N�o�N�y�N�}�N���J���J���J���J���J���J���J������������������������������������������������������������������������������������������������������������J����������������������N��N������N��N��N���J���
��
���x�#���&���*���2���4���7�L�9�L�:���<�h�?�L�Y�|�Z���\�|�l��m�x�o�x�r��y�x�|��}�x�������������������������������h��������h��x��x����������x��x��x�����N�	���
�N�
�N��x��x����$���7�L�9���:���;���<�`�=���?���l�N�r�N�|�N�������������������������������`�����`�����������N��N��x��N��N��x���N������N�	���
�N�
�N��x��x����$���7�L�9���:���;���<�`�=���?���l�N�r�N�|�N�������������������������������`�����`�����������N��N��x��N��N��x���N������N�	���
�N�
�N��x��x����$���7�L�9���:���;���<�`�=���?���l�N�r�N�|�N�������������������������������`�����`�����������N��N��x��N��N��x���N�����	�J����N����J�#���$�J�&���*���2���4���90�:0�<�?0�D���F���G���H���R���T���m�N�o�N�y�N�}�N���J���J���J���J���J���J���J������������������������������������������������������������������������������������������������������������J����������������������N��N������N��N��N���J��J�
�J�
�J����"���#���&���*���-2�2���4���7�|�8���9�x�:���<�\�?�x�Y���\���l�J�m���o���r�J�t�H�u�H�y���{�H�|�J�}�������������������������������������������������\��������\��������J��J��J��J������������J������D��(\��8R|�� �Z� R�	@	�

*
N
t
���:��

:
�
�
�:���*z�>�&`��.d���8Tv��l�HP�Tn�"���`�N��*Z��N����  z � �!�!�"�# #j#�#�$n$�$�%%l%�&&X&�&�'('l'�'�(l))�*>*J*V*b*n*z*�*�+�+�+�+�,,, ,,,8,�,�,�,�,�,�,�,�-�-�-�-�-�-�..�.�.�.�.�.�.�/�0�0�0�0�0�0�0�0�11�1�1�1�1�1�1�2(2�2�2�2�2�2�3d3p44�4�4�5d6"6<6p6�6�6�7�8T8`8l8x8�8�8�8�8�8�8�8�9*9R9�9�9�9�:4:�:�;;x;�;�;�<<0<~<�==j=�>>p?~?�?�?�@~@�ADA�A�BBNBhB�C8C�D8D�D�EEHE^E�F8F`F�F�F�GG4GbG�G�G�H@HzH��b"/n�	�n���*��(��0�/	G
�V22J
�|>	X	l	t	T�	�	P�	�	`>	0�		�	
��	0
�	d
�	
�8	4�Copyright (c) 2010-2013 by tyPoland Lukasz Dziedzic with Reserved Font Name "Lato". Licensed under the SIL Open Font License, Version 1.1.LatoRegulartyPolandLukaszDziedzic: Lato Regular: 2013Lato RegularVersion 1.105; Western+Polish opensourceLato-RegularLato is a trademark of tyPoland Lukasz Dziedzic.tyPoland Lukasz DziedzicLukasz DziedzicLato is a sanserif typeface family designed in the Summer 2010 by Warsaw-based designer Lukasz Dziedzic ("Lato" means "Summer" in Polish). It tries to carefully balance some potentially conflicting priorities: it should seem quite "transparent" when used in body text but would display some original traits when used in larger sizes. The classical proportions, particularly visible in the uppercase, give the letterforms familiar harmony and elegance. At the same time, its sleek sanserif look makes evident the fact that Lato was designed in 2010, even though it does not follow any current trend. The semi-rounded details of the letters give Lato a feeling of warmth, while the strong structure provides stability and seriousness.http://www.typoland.com/http://www.typoland.com/designers/Lukasz_Dziedzic/Copyright (c) 2010-2013 by tyPoland Lukasz Dziedzic (http://www.typoland.com/) with Reserved Font Name "Lato". Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL).http://scripts.sil.org/OFLCopyright (c) 2010-2013 by tyPoland Lukasz Dziedzic with Reserved Font Name "Lato". Licensed under the SIL Open Font License, Version 1.1.LatoRegulartyPolandLukaszDziedzic: Lato Regular: 2013Lato-RegularVersion 1.105; Western+Polish opensourceLato is a trademark of tyPoland Lukasz Dziedzic.tyPoland Lukasz DziedzicLukasz DziedzicLato is a sanserif typeface family designed in the Summer 2010 by Warsaw-based designer Lukasz Dziedzic ("Lato" means "Summer" in Polish). It tries to carefully balance some potentially conflicting priorities: it should seem quite "transparent" when used in body text but would display some original traits when used in larger sizes. The classical proportions, particularly visible in the uppercase, give the letterforms familiar harmony and elegance. At the same time, its sleek sanserif look makes evident the fact that Lato was designed in 2010, even though it does not follow any current trend. The semi-rounded details of the letters give Lato a feeling of warmth, while the strong structure provides stability and seriousness.http://www.typoland.com/http://www.typoland.com/designers/Lukasz_Dziedzic/Copyright (c) 2010-2013 by tyPoland Lukasz Dziedzic (http://www.typoland.com/) with Reserved Font Name "Lato". Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL).http://scripts.sil.org/OFL�tx	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a��������������������������������bc�d�e�������f����g�����h���jikmln�oqprsutvw�xzy{}|��~�������	
�����
����������������������������������������������� !"#NULLuni00A0uni00ADmacronperiodcenteredAogonekaogonekEogonekeogonekNacutenacuteSacutesacuteZacutezacute
Zdotaccent
zdotaccentuni02C9EuroDeltauni2669undercommaaccent
grave.case
dieresis.casemacron.case
acute.casecircumflex.case
caron.case
breve.casedotaccent.case	ring.case
tilde.casehungarumlaut.case
caron.salt�������������V��������V�,� `f-�, d ��P�&Z�E[X!#!�X �PPX!�@Y �8PX!�8YY �Ead�(PX!�E �0PX!�0Y ��PX f ��a �
PX` � PX!�
` �6PX!�6``YYY�+YY#�PXeYY-�, E �%ad �CPX�#B�#B!!Y�`-�,#!#! d�bB �#B�*! �C � ��+�0%�QX`PaRYX#Y! �@SX�+!�@Y#�PXeY-�,�C+�C`B-�,�#B# �#Ba��b�`�*-�,  E �Ec�Eb`D�`-�,  E �+#�%` E�#a d � PX!��0PX� �@YY#�PXeY�%#aDD�`-�,�E�aD-�	,�`  �	CJ�PX �	#BY�
CJ�RX �
#BY-�
, �b �c�#a�C` �` �#B#-�,KTX�DY$�
e#x-�,KQXKSX�DY!Y$�e#x-�
,�CUX�C�aB�
+Y�C�%B�	%B�
%B�# �%PX�C`�%B�� �#a�	*!#�a �#a�	*!�C`�%B�%a�	*!Y�	CG�
CG`��b �Ec�Eb`�#D�C�>�C`B-�,�ETX�#B `�a�

BB�`�
+�m+"Y-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�	+-�,�+�ETX�#B `�a�

BB�`�
+�m+"Y-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-� ,�+-�!,�+-�",�+-�#,�	+-�$, <�`-�%, `�
` C#�`C�%a�`�$*!-�&,�%+�%*-�',  G  �Ec�Eb`#a8# �UX G  �Ec�Eb`#a8!Y-�(,�ETX��'*�0"Y-�),�+�ETX��'*�0"Y-�*, 5�`-�+,�Ec�Eb�+�Ec�Eb�+��D>#8�**-�,, < G �Ec�Eb`�Ca8-�-,.<-�., < G �Ec�Eb`�Ca�Cc8-�/,�% . G�#B�%I��G#G#a Xb!Y�#B�.*-�0,��%�%G#G#a�E+e�.#  <�8-�1,��%�% .G#G#a �#B�E+ �`PX �@QX�  �&YBB# �C �#G#G#a#F`�C��b` �+ ��a �C`d#�CadPX�Ca�C`Y�%��ba#  �&#Fa8#�CF�%�CG#G#a` �C��b`# �+#�C`�+�%a�%��b�&a �%`d#�%`dPX!#!Y#  �&#Fa8Y-�2,�   �& .G#G#a#<8-�3,� �#B   F#G�+#a8-�4,��%�%G#G#a�TX. <#!�%�%G#G#a �%�%G#G#a�%�%I�%a�Ec# Xb!Yc�Eb`#.#  <�8#!Y-�5,� �C .G#G#a `� `f��b#  <�8-�6,# .F�%FRX <Y.�&+-�7,# .F�%FPX <Y.�&+-�8,# .F�%FRX <Y# .F�%FPX <Y.�&+-�9,�0+# .F�%FRX <Y.�&+-�:,�1+�  <�#B�8# .F�%FRX <Y.�&+�C.�&+-�;,��%�& .G#G#a�E+# < .#8�&+-�<,�%B��%�% .G#G#a �#B�E+ �`PX �@QX�  �&YBB# G�C��b` �+ ��a �C`d#�CadPX�Ca�C`Y�%��ba�%Fa8# <#8!  F#G�+#a8!Y�&+-�=,�0+.�&+-�>,�1+!#  <�#B#8�&+�C.�&+-�?,� G�#B�.�,*-�@,� G�#B�.�,*-�A,��-*-�B,�/*-�C,�E# . F�#a8�&+-�D,�#B�C+-�E,�<+-�F,�<+-�G,�<+-�H,�<+-�I,�=+-�J,�=+-�K,�=+-�L,�=+-�M,�9+-�N,�9+-�O,�9+-�P,�9+-�Q,�;+-�R,�;+-�S,�;+-�T,�;+-�U,�>+-�V,�>+-�W,�>+-�X,�>+-�Y,�:+-�Z,�:+-�[,�:+-�\,�:+-�],�2+.�&+-�^,�2+�6+-�_,�2+�7+-�`,��2+�8+-�a,�3+.�&+-�b,�3+�6+-�c,�3+�7+-�d,�3+�8+-�e,�4+.�&+-�f,�4+�6+-�g,�4+�7+-�h,�4+�8+-�i,�5+.�&+-�j,�5+�6+-�k,�5+�7+-�l,�5+�8+-�m,+�e�$Px�0-K�KRX��Y�c �#D�#p�E  �(`f �UX�%a�Ec#b�#D�*�*�*Y�(	ERD�*�D�$�QX�@�X�D�&�QX��X�DYYYY������DPK}$[Z��o�oVgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/fonts/Lato-LightItalic.ttfnu�[���GPOS'��HPGSUBV.TIlOS/2�8��J|`cmapRԟ�J��cvt &�6e�8fpgm�zAe�	�gaspe�glyf�^��O���head��d��6hhea�1��$hmtx?k���TkernO�Q��@g�loca�)N4,maxp>
�P` name�BbdP�}post:�\�b�prep�x9�op�
0JDFLTlatn����kernkernGr�����T��v		�

����
V
��8�,^$^�0��
D��J��J���J�L F �!z"##P#�$4$~%x&&�'�(�)�*�+�+�,J,�-n..�/$/V/�/�/�1�242n2�2�33V3�3�44J4�4�4�5�5�6�7�7�7�8~8�8�:�;";�;�<�=2>,?&?�@�A�B�C8C�D�E.F(>	�[�j�y�j�[$�[9>:A</?>D��F��G��H��R��T��m�yo�yy�y}�y��[��[��[��[��[��[��[�/����������������������������������������������������������[���������/�y�y�j�j�y�j�y�y��[>	�[�j�y�j�[$�[9>:A</?>D��F��G��H��R��T��m�yo�yy�y}�y��[��[��[��[��[��[��[�/����������������������������������������������������������[���������/�y�y�j�j�y�j�y�y��[-#��&��*��2��4��D��F��G��H��R��T��k��p��������������������������������������������������������������������������������������������>	�[�j�y�j�[$�[9>:A</?>D��F��G��H��R��T��m�yo�yy�y}�y��[��[��[��[��[��[��[�/����������������������������������������������������������[���������/�y�y�j�j�y�j�y�y��[0�=
�=
�=�I#��&��*��2��4��7�A9�=:�m<�d?�=Y�~Z��\��k��l�=m�Io�Ip��r�=y�I|�=}�I�����������������������d��~��~�����d�I�I�=�=�=�=�I�I�I&�y	��
�y
�y�j�j��$��7�G9��;��<�Q=��?��l�yr�y|�y�����������������������Q���Q�������y�y�j�y�y�j�j���0�=
�=
�=�I#��&��*��2��4��7�A9�=:�m<�d?�=Y�~Z��\��k��l�=m�Io�Ip��r�=y�I|�=}�I�����������������������d��~��~�����d�I�I�=�=�=�=�I�I�Iq>	��
>
>�G���G������"F#��$��&��*��-�o2��4��D��F��G��H��P��Q��R��S��T��U��V��X��Y��Z��\��]��k��l>m��o��p��r>tPuPw��y��{P|>}�������������������������������������������������������������������������������������������������������������������������������������������������������>�>�G�>�>�G��G�����$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������:�V
�V
�V��#��&��*��-22��4��7��8��9��:��<�y?��W��Y��Z��\��k��l�Vm��o��p��r�Vt�`u�`y��{�`|�V}�������������������������������������y�����������y�����V�V�V�V������
�om�oo�oy�o}�o�o�o�o�o�o$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������>	���L�L������"$��-�.D��F��G��H��P��Q��R��S��T��U��X��w������������������������������������������������������������������������������������������������������������L�L�L���	����$����������������������������+

��#��&��*��2��4��I��W��Y��Z��\��k��lm��o��p��ry��|}������������������������������������������3��
��
���$#��&��*��2��4��7�89�V:�y<�=?�VY�zZ��\�zk��l��m�$o�$p��r��t�=u�=y�${�=|��}�$�����������������������=��z��z�����=�$�$���������$�$�$$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������/	���=�=��$��-�VD��F��G��H��R��T�������������������������������������������������������������������������������������������=�=�=���$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������#��&��*��2��4��7��8��k��p���������������������������������������f	���L�L�L���]�]"-#��$��&��*��-�82��4��D�)F�)G�)H�)J�AP�]Q�]R�)S�]T�)U�]V�FX�]Y�QZ�y[�b\�L]�ek��m�Lo�Lp��w�]y�L}�L��������������������������������������������)��)��)��)��)��)��)��)��)��)��)��)��)��]��)��)��)��)��)��)��]��]��]��]��Q��Q���)���)�)�]���)�F�F�e�e�e�L�L�L�L�L�L�L�L���	����$����������������������������q>	��
>
>�G���G������"F#��$��&��*��-�o2��4��D��F��G��H��P��Q��R��S��T��U��V��X��Y��Z��\��]��k��l>m��o��p��r>tPuPw��y��{P|>}�������������������������������������������������������������������������������������������������������������������������������������������������������>�>�G�>�>�G��G�����NF	��
F
F����������$��-��D��F��G��H��J��P��Q��R��S��T��U��V��X��lFrFt<u<w��{<|F��������������������������������������������������������������������������������������������������������������F�F��F�F�����+

��#��&��*��2��4��I��W��Y��Z��\��k��lm��o��p��ry��|}������������������������������������������m4	�~
4
4�[�V�[�~����"2#��$�~&��*��-�82��4��D�GF�GG�GH�GJ�_P��Q��R�GS��T�GU��V�GX��]��k��l4m�Vo�Vp��r4t2u2w��y�V{2|4}�V��~��~��~��~��~��~��~�����������������������G��G��G��G��G��G��G��G��G��G��G��G��G�����G��G��G��G��G��G�������������~�G���G�G�����G�G�G�������V�V�4�4�[�4�4�[�V�[�V�V��~��" #��&��*��2��4��k��m��o��p��y��}��������������������������������-#��&��*��2��4��D��F��G��H��R��T��k��p��������������������������������������������������������������������������������������������:�V
�V
�V��#��&��*��-22��4��7��8��9��:��<�y?��W��Y��Z��\��k��l�Vm��o��p��r�Vt�`u�`y��{�`|�V}�������������������������������������y�����������y�����V�V�V�V��������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|������K
K
K�y�ylKrKtdud{d|K�K�K�y�K�K�y�y��
��
��Y��\��l��r��t��u��{��|����������������D��F��G��H��R��T���������������������������������������������������������������������
��
��Y��\��l��r��t��u��{��|������������������
��
��Y��\��l��r��t��u��{��|������������������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|������"�y�yD��F��G��H��R��T��������������������������������������������������������������������y�y�y.	���~�~��$��D��F��G��H��R��T�������������������������������������������������������������������������������������������~�~�~���	��������$����������������������������������D��F��G��H��R��T�������������������������������������������������������������������.	���y�y��$��D��F��G��H��R��T�������������������������������������������������������������������������������������������y�y�y���-#��&��*��2��4��D��F��G��H��R��T��k��p��������������������������������������������������������������������������������������������$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������>	�[�j�y�j�[$�[9>:A</?>D��F��G��H��R��T��m�yo�yy�y}�y��[��[��[��[��[��[��[�/����������������������������������������������������������[���������/�y�y�j�j�y�j�y�y��[&�y	��
�y
�y�j�j��$��7�G9��;��<�Q=��?��l�yr�y|�y�����������������������Q���Q�������y�y�j�y�y�j�j���&�y	��
�y
�y�j�j��$��7�G9��;��<�Q=��?��l�yr�y|�y�����������������������Q���Q�������y�y�j�y�y�j�j���$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������>	�[�j�y�j�[$�[9>:A</?>D��F��G��H��R��T��m�yo�yy�y}�y��[��[��[��[��[��[��[�/����������������������������������������������������������[���������/�y�y�j�j�y�j�y�y��[	�e�e$�e9F:F<(?F��e��e��e��e��e��e��e�(�e�(��e	�e�e$�e9F:F<(?F��e��e��e��e��e��e��e�(�e�(��e&�y	��
�y
�y�j�j��$��7�G9��;��<�Q=��?��l�yr�y|�y�����������������������Q���Q�������y�y�j�y�y�j�j���	�e�e$�e9F:F<(?F��e��e��e��e��e��e��e�(�e�(��e>	�[�j�y�j�[$�[9>:A</?>D��F��G��H��R��T��m�yo�yy�y}�y��[��[��[��[��[��[��[�/����������������������������������������������������������[���������/�y�y�j�j�y�j�y�y��[&�y	��
�y
�y�j�j��$��7�G9��;��<�Q=��?��l�yr�y|�y�����������������������Q���Q�������y�y�j�y�y�j�j���:�V
�V
�V��#��&��*��-22��4��7��8��9��:��<�y?��W��Y��Z��\��k��l�Vm��o��p��r�Vt�`u�`y��{�`|�V}�������������������������������������y�����������y�����V�V�V�V������:�V
�V
�V��#��&��*��-22��4��7��8��9��:��<�y?��W��Y��Z��\��k��l�Vm��o��p��r�Vt�`u�`y��{�`|�V}�������������������������������������y�����������y�����V�V�V�V������:�V
�V
�V��#��&��*��-22��4��7��8��9��:��<�y?��W��Y��Z��\��k��l�Vm��o��p��r�Vt�`u�`y��{�`|�V}�������������������������������������y�����������y�����V�V�V�V������:�V
�V
�V��#��&��*��-22��4��7��8��9��:��<�y?��W��Y��Z��\��k��l�Vm��o��p��r�Vt�`u�`y��{�`|�V}�������������������������������������y�����������y�����V�V�V�V������:�V
�V
�V��#��&��*��-22��4��7��8��9��:��<�y?��W��Y��Z��\��k��l�Vm��o��p��r�Vt�`u�`y��{�`|�V}�������������������������������������y�����������y�����V�V�V�V������:�V
�V
�V��#��&��*��-22��4��7��8��9��:��<�y?��W��Y��Z��\��k��l�Vm��o��p��r�Vt�`u�`y��{�`|�V}�������������������������������������y�����������y�����V�V�V�V������
�om�oo�oy�o}�o�o�o�o�o�o$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�����������������������������������������������	����$����������������������������	����$����������������������������	����$����������������������������	����$����������������������������m4	�~
4
4�[�V�[�~����"2#��$�~&��*��-�82��4��D�GF�GG�GH�GJ�_P��Q��R�GS��T�GU��V�GX��]��k��l4m�Vo�Vp��r4t2u2w��y�V{2|4}�V��~��~��~��~��~��~��~�����������������������G��G��G��G��G��G��G��G��G��G��G��G��G�����G��G��G��G��G��G�������������~�G���G�G�����G�G�G�������V�V�4�4�[�4�4�[�V�[�V�V��~$��	��
����
����$��7��9��;��<��=��?��@��`��l��r��|�������������������������������������������������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|��������
��
��Y��\��l��r��t��u��{��|������������������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|��������
����
��@��[��`��l��r��|������.	���~�~��$��D��F��G��H��R��T�������������������������������������������������������������������������������������������~�~�~�����
����
��@��[��`��l��r��|������.	���~�~��$��D��F��G��H��R��T�������������������������������������������������������������������������������������������~�~�~���:�V
�V
�V��#��&��*��-22��4��7��8��9��:��<�y?��W��Y��Z��\��k��l�Vm��o��p��r�Vt�`u�`y��{�`|�V}�������������������������������������y�����������y�����V�V�V�V������
�om�oo�oy�o}�o�o�o�o�o�o��
����
��@��[��`��l��r��|������"�o
�o
�o�t9�j:��<�y?�jY��Z��\��l�om�to�tr�ot��u��y�t{��|�o}�t��y�������y�t�t�o�o�o�o�t�t�t��
��
��Y��\��l��r��t��u��{��|������������������
����
��@��[��`��l��r��|������m4	�~
4
4�[�V�[�~����"2#��$�~&��*��-�82��4��D�GF�GG�GH�GJ�_P��Q��R�GS��T�GU��V�GX��]��k��l4m�Vo�Vp��r4t2u2w��y�V{2|4}�V��~��~��~��~��~��~��~�����������������������G��G��G��G��G��G��G��G��G��G��G��G��G�����G��G��G��G��G��G�������������~�G���G�G�����G�G�G�������V�V�4�4�[�4�4�[�V�[�V�V��~��" #��&��*��2��4��k��m��o��p��y��}����������������������������������" #��&��*��2��4��k��m��o��p��y��}����������������������������������" #��&��*��2��4��k��m��o��p��y��}��������������������������������&�y	��
�y
�y�j�j��$��7�G9��;��<�Q=��?��l�yr�y|�y�����������������������Q���Q�������y�y�j�y�y�j�j���&�y	��
�y
�y�j�j��$��7�G9��;��<�Q=��?��l�yr�y|�y�����������������������Q���Q�������y�y�j�y�y�j�j���>	�[�j�y�j�[$�[9>:A</?>D��F��G��H��R��T��m�yo�yy�y}�y��[��[��[��[��[��[��[�/����������������������������������������������������������[���������/�y�y�j�j�y�j�y�y��[>	�[�j�y�j�[$�[9>:A</?>D��F��G��H��R��T��m�yo�yy�y}�y��[��[��[��[��[��[��[�/����������������������������������������������������������[���������/�y�y�j�j�y�j�y�y��[0�=
�=
�=�I#��&��*��2��4��7�A9�=:�m<�d?�=Y�~Z��\��k��l�=m�Io�Ip��r�=y�I|�=}�I�����������������������d��~��~�����d�I�I�=�=�=�=�I�I�I>	�[�j�y�j�[$�[9>:A</?>D��F��G��H��R��T��m�yo�yy�y}�y��[��[��[��[��[��[��[�/����������������������������������������������������������[���������/�y�y�j�j�y�j�y�y��[>	�[�j�y�j�[$�[9>:A</?>D��F��G��H��R��T��m�yo�yy�y}�y��[��[��[��[��[��[��[�/����������������������������������������������������������[���������/�y�y�j�j�y�j�y�y��[0�=
�=
�=�I#��&��*��2��4��7�A9�=:�m<�d?�=Y�~Z��\��k��l�=m�Io�Ip��r�=y�I|�=}�I�����������������������d��~��~�����d�I�I�=�=�=�=�I�I�I&�y	��
�y
�y�j�j��$��7�G9��;��<�Q=��?��l�yr�y|�y�����������������������Q���Q�������y�y�j�y�y�j�j���0�=
�=
�=�I#��&��*��2��4��7�A9�=:�m<�d?�=Y�~Z��\��k��l�=m�Io�Ip��r�=y�I|�=}�I�����������������������d��~��~�����d�I�I�=�=�=�=�I�I�I&�y	��
�y
�y�j�j��$��7�G9��;��<�Q=��?��l�yr�y|�y�����������������������Q���Q�������y�y�j�y�y�j�j���&�y	��
�y
�y�j�j��$��7�G9��;��<�Q=��?��l�yr�y|�y�����������������������Q���Q�������y�y�j�y�y�j�j���>	�[�j�y�j�[$�[9>:A</?>D��F��G��H��R��T��m�yo�yy�y}�y��[��[��[��[��[��[��[�/����������������������������������������������������������[���������/�y�y�j�j�y�j�y�y��[:�V
�V
�V��#��&��*��-22��4��7��8��9��:��<�y?��W��Y��Z��\��k��l�Vm��o��p��r�Vt�`u�`y��{�`|�V}�������������������������������������y�����������y�����V�V�V�V������r

#$&')-./2345789:;<=>?EHIKNPQRSUYZ[\^klmoprtuy{|}����������������������������������������������������������
8�DFLTlatn����case&case,liga2liga8sups>supsD,>B	

@LO,{tuCjqv�������I�,xx�A���P`KtyPL�J�z��� ��� �&
	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a���������������������������������rdei�x�pk�vj���sgw�����l|����cn���m}�b�������������������y���������������������q���z���`T@
~�1DS[a~�����    " & 0 : D �!"!&"""""""+"H"`"e%�&i���
 �1ARZ`x�����      & 0 9 D �!"!&"""""""+"H"`"d%�&i����������������{�u�q�[�H����$��������������I�����������������޸ޡޞ�:ڜ`T@
~�1DS[a~�����    " & 0 : D �!"!&"""""""+"H"`"e%�&i���
 �1ARZ`x�����      & 0 9 D �!"!&"""""""+"H"`"d%�&i����������������{�u�q�[�H����$��������������I�����������������޸ޡޞ�:ڜ/��,8<@��BK�	PX@3	`f[[		QCQ
D@4hf[[		QCQ
DY@@?>=<;:9751/+)&$$
+>32#'.<54>54.#"#"'4632#"&!!7!!3<G*6]E'!1;3$
A!1:1!/?#.B.{,! ,, !,����]#[��n$;S47O;-('rT.)*4C.$8'�� ..  ..��y$?�����
)@&hCSD

+#>74>32#"&�F
>F�!""'5���-PS\88\SP-<��""!5��t�
,@)	BkD

$+#"&'7!#"&'7e$
&]$
&��ܚ�$�ܚ�$Pr�:>yK�)PX@(
Y	CQ
C
D@&
Z
Y	C
DY@>=<;::5320-,'%#"!#!+#"&547!+#"546?3#76;>;!323+32%!!�'��Ԇ)��ۂ�
)։(�+�)�����	��,�����E
	��l��%��D�
	�m$�yE�r��B[9DO�@!
*BK�PX@2j

h
f_

SC	SD@1j

h
fk

SC	SDY@LKA@#$#$+.'7632.54>?>;#".'+4.'>ေ>	"/AU8o<rY6=r�g
#"d�7#;XAc@|c=D~�p$
#�-Lb6kY�b4��'DX2`TV,bP&!(#�/HhLN�pE��J@!!)%��0GhN\�N��:P9)��>c��6M9*,6Tl}��8�'0DXuK�PX@+[	[SC
C		SD@/[	[CSC
C		SDY@
US((%"&((($
+#".54>324.#"32>>;+#".54>324.#"32>�7Zt>3W?#4XvA3V?$J.>$0XC'-?$0WC(XA��B�7Zt>3W>#4XuA3V?$J.=$0XC(.?$0WB(qg�h4&ImGg�i5&JmI<W9)W�]<V8(V�b
���g�h5&JlGg�i5&KmH<W9)W�];V8(V�M����?OT@QK8J)#BhSCS
CSDFD/-&$ 
??	+2"#"'.#">7>;#"&/#".54>7.54>32>7�>hJ)40K6=eI(>;a2A
<TD�M�/lz�GG|\6:c�M106b��0.J_2>si^(��GrP,�)Kh?	 E:%,Mi>E�I�NH�G^�[���3V>#-U|NR�y\F�FP�d8��BeD"!:P/�Viz��e�
@	BkD

$+#"&'7e$
&��ܚ�$���H� �(+.54>7�!2!	++<'
4UxR&	S~T+�O���H		X���PV�����r	w������ �(+4.'&546?'&547>\!1!	++<'
4UxR&	S~T++O���H		Y���PV�����r	w��	����;*@'40/+'&"
	Bja;;+7>7'7>7./7.5<?3>?'.'x	
��
��2	

����

��n+n		n,n	��	n,n	
	n+n	
���3�.@+jkMRF+!!#!7!�7��O7L8�Q	�8��=G�;�G�?���@B?S
D"+74632'.54>7#"&?0'+/(8"'$	%/U#2;0)URL 	%9J,2c*x@MQE+!!n�	�RxN:����@SD&$+74>32#"&:!#7''5M""'55�����@kD""++6;	!&�''/�$Z��`�',@)SCSD''	+2#".54>2>54.#"�\�r@b��y\�r@b��.c��Q5\}Gc��Q5]}�H�ّ���jH�ّ�G�j��_�)ʂ�z;_��Ƀ�{;���)@&BhCR
D$+%!7#"/3!!F����I�5�(H�E��	'i��HF5�1<@9-BhSCQ
D+)#!
11+2>3!2!7>7>54.#"#"/>�K�c9;e�K�	 G#h�q
	!K}Z2-Mf9Du_F.\~��*S}R[���D�8!5!�C{|�NCcA 'Ig?Z�b4q��<�HU@RD
Bhh[SCSDB@:80/.-%#HH	+2#".'763232>54.#7>54.#"#"/>�K�`73XwCEgF#Q��ha�f<)	
2OpNa�g6$V�m	a�k8,Kd9Dv`F.[~��)OvLP~^?
7Oe:`�xD.\�Y
GhF"Ci�@7aG)B2X|L@_?'Hg@Z�b4>^�+@(
B\C
D!#+!+#!"&/367!Z�1T2�g;Tk�5b�2
�i�
-�� '��g��8�-@@=+*Bh[QCSD(#&(""+#!632#".'763232>54.#"'!2����kg�g3[��m:hXI 
-HgF[�yF(T�Xn�8�{_�$6a�P}NJJ#-'%=r�iBmN,%r���32@/B[CSD0.&$	+2#".54>7>;>32>54.#"�T�b6Q��oY�f7:Z>�	Q�&>B���*PsJ^�p=,QtG_�o=M5`�Rl��J7h�\:qwH	

��*K#?G�-DtU0=l�WFrP+Do����$@!BQC
D$'++>7!"&57�	��H.
��
�#	��


>f��&�%;OD@A
B[SCSD=<'&GE<O=O1/&;';%%	+".54>7.54>32'2>54.#"2>54.#"^�m<6`�MmpBx�fW�_1)MpH<cG'N��eY�l==`u7,]ZQ=$.Ty�[�Y+%HjES�\2!Fk1ZNY�fA!�hT�l?3WuCDw`F5NiBf�q<J3_�SOkA"8PkE?fJ(�9]v>6]E'2XwE2^H+�Z�22@/B[SC
D/-%#	+".54>32+>74.#"32>MP�^3O��iU�c5:V7�H T� >B�V+NnBV�l=)MnD]�i8Z3\�Of�I8f�VDrosE��I&L)BH�CqQ-9g�VClK(Ai�:��Z�;K�#PX@SCSD@[SDY�&&&$+74>32#"&4>32#"&:!#7''5f!#7''5M""'55D""'55<�e�)K@
B?K�#PX@SCS
D@[S
DY@	(& "+74632'.54>7#"&4>32#"&<0'+/(8"'$	%/o!#7''5U#2;0)URL 	%9J,2<""'55�	�5�(+���%(�B��A��

��
���	c!@YMQE+!!!!�;	��/:��+GG�	�5�(+	767>7&'&5<>7���L%(�����A


�~����'95@2BhfSCSD(&#,$+>32#7>54.#"#"'4>32#"&EQ\4=gK*1LYQ< @9NZL2 9M,>\@(
"!""'5
3'&Fa;SvXA<>(��,E>?PhH/K5#*#�g""!5a��2Wlf@c
^
?Bh[

[	[OSGYXb`XlYlOMCA=;86,*" 
WW
+%"&5<7#".54>3232>54.#"3267632#".54>32%2>7.#"IG?�L-B*!>Zq�N1T!';sZ7L��g\���a7V��z��_	o�����^<j���hpɘXDq��%!HHFp.;l\K5/�NH\S 9L,;|tfL,��=Z !*	I��v|�|?7f���z��PD>JP[�����ǡq=I�҉�ՙTD?lT7%AXck4!9*��X�
$@!BZC
D# +!#"&'!+3!.'XLe���L�b�>E�	
��b��z�*�5�*=@:B[SCS
D*(" !+3!2#!2654.#%!2>54&#!��yf�b/,QtI��C�s�JD��)OsJ��a�\,�����*OrHD|eI�yb�p<�����:]B$H:_zAw~�����/D@A
BhfSCSD'%" //+%2>32#".546$32#".#"�ItZA.	#.ix�PzŋKp��ItaQ&)N}`��aBv�E%+%*/K5X�⊹3�y,B*(,5,h���|NjJ�-�@SCS
D!(!&+#!!24.#!!2>-1[���g�$��}ʍLg?u�h���x�ޢZ/}ڵ�b3�U�ދy†H�c��?�(@%YQCQ
D+!!!!!!4�WG7��I���5��P��R��?�	"@YQC
D+!!!#!4�WJO��Pd�5��S�u�����9G@D$	Bh[SCSD1/(& 99+%2>7#"504>7!#".546$32#"'.#"�CobZ-0�k?5o}�R͐Mn��M~hV&	'7Kb?��]Bz�A*��
%:'Y�㊻3�w,@)'!h���|njK�!� @ZC
D+!#!#3!3sdS��Sd�dR(Rd��Y��k����@C
D+!#3	d�d�����'@$BhCSD#%$+#"&'7>3232>73}Hn�W6Y+

#1#;lW=
xd�u�q76%W�i���� &@#
B\C
D'(% +3267>;#"&'.+#3^M"(PQ�~�P	�*	TTc�d�L���Xf�U��X�@CR
D+7!!3�h�6�cUU��<�!'@$BhC
D!6(+67>;#>7+"'#32-
~E�W���	�n�W�D���
�y��#��F���!�@BC
D!+2>73#"'#3b
��W�.�Q�W�1��0��y�-�G����q�'@SCSD((($+#".546$324.#"32>qm���|ȍLn��}ɍLg?v�g�ޣ\@v�g�ޢ[0����xY�≺3�xY��{ŋKh��{ŊKg��?�/@,[SC
D



!+#!2#32>54&#GFc�T��J��v�T�^�k:��;�����l��H��S<j�V�����q�/T@
BK�PX@SCSCD@kSCSDY�((($&+#"&'#".546$324.#"32>q5a�U#N
�|�|ȍLn��}ɍLg?v�g�ޣ\@v�g�ޢ[0�⼓1�{
C2Y�≺3�xY��{ŋKh��{ŊKg��3�!7@4B[SC
D! *!+#!2#"'.#32>54&#POc�P��<n�^qU��!%SM�_�j8�������\�sH��@���4`�S�~'����==@:=BhfSCSD;9(&!#!+#".#"#"&'763232>54.54>32�";]FLwS,2QgmgQ2B{�m��<!	!-@U8T�`32QglhQ1:m�ef�8�&-&1Uq@=S;+)1FdI`��LcV+#)#9d�N>S:((0GgKQ�sDKH��� @QC
D+!#!7�
�8�c��6
�T��3T����#@ CSD+%2>73#".5473o]�uLkdl]��sg�o:kdl-W�FH~�cl��u˖VG|�e,-l��(T�h;
�@BC
D, +32>7>;#O&
	GN�:Y��c00��y�~�( @#BC
D+; +32>7>;2>7>;#.'#�N���
�M��Y�	��Y��h))��h))��y��/����@
BC
D)"'!+	32676;	#"&'+��Y
-�c��Y
���	b��
��4�r���p
���@BC
D,"+#32>7>;gIcI��X+�SG��H?�d! �,��$@!QCQ
D+!!7>7!7��28�A	���!	�R!
�RD��D�'@$[OQE!#+!+32D�&
�̼���#��
q��H�@kD" +32#"&'q''	�%�$�+���'@$B[OQE!#+!!7>;#"5�(���˻�
#v ��@	BkD+!+3#"&'&'+\;UC�

�F���
��L������1@MQE+!7�	�+�AA�~�@kD+2#"/�s5����<��s�+^@ BK�%PX@SCS
D@SC
CSDY@
#!++*' +!#"&5#".54>322>7&#"�.!&[gr=?^? ,Qp��R<h3��9odY#2;EC~o]D%[
9P�^41Z�PW��~\4��@u�d�-Pn��L��f����0h�"BK�%PX@CSCSD@!CSC
CSDY@(&00*%+33>32#"&'#"32>54&f�]a'`ju<AbB" ;Ul�HU�*9sk]$#7?C#?mYE/f���O�\32[�PM���b9MLl�@t�d��'7"3Xu��A��H��F�25@2BhfSCSD%(#&*$+%#".54>32#".#"32>325_[^5VT*!>Xn�I1OB6	
1N;T�k=AbC5TA1&
�;L,;j�VO��vV1#2! % Z��lEvV0")"
@����.p@"BK�%PX@CSCS
D@!CSC
CSDY@&$..
+!"&5#".54>323%2>7.#"�!'alv=AbB" ;Ul�IQ�,I\��I9rk]$#+�E?mYE/f
=Q�_42\�QL���b9GGK�Q@?t�c N@3Xt��@��F��F�,=7@42BhSCSD.--=.=*&%,+32>32#".54>32%">54.F8`�Ќ��5UC3(	1]_f:S�X.;Wp�OIe?��P�cC��O,,G%)JB;1')��$($
4K07e�ZK��zZ4)=GgDq�Q%)0361(B���%^�BK�!PX@kSCQD@kYSDY@%%!$%$	++'&546737>32#"&#"!2j*#�~�
:Wn?8
(-Q?-	
~���w~U�V+
0AhK{F�����>Td�@<& CBBK�PX@+	[[CSCSD@.h	[[SCSDY@VU^\UdVdQOGD7642*(
+#".54>32.5467#".54>32!4&'.#"32>2>54&#"�(/(#*#@t�dO�_4K��b"D#")[69bG(1]�W3Z#
�l 1X)c�a1'Hf>N�[2�@eF$n]@dE$l�7ZKA>@$3016@'?uZ6 =X8HoL(4 #H3$GgDE�h? 

L��1F%?T.+C-*FZ
6Wo8hi3Tm9jnf��,@)BCSC
D%%+33>32#654&#"f�^\(akp9po
^KMS6pi^$A��KuQ*��2]��|.)fj7g�Z��x��&@#SCC
D
+##".54>32Ny]y���W !�m����(4@1	BSCCSD%#!%%+#"&'7>323267#".54>32J�(?W5)JR
���4XA%
XQbW !c��0@-B\CC
D%(%!+3267>;#"&'.+#rm%�R�9	lP	��$=]����	{�_

�


�
�
�u��@C
D+33u�]���Q^��5Z@
BK�)PX@SC
D@CSC
DY@55%&($!	+332>32>32#>54&#"#654&#"^x+#N�qdU']gl5k^
]K>M1eaW#C]K	:Jr�I?�$�ꛫ~v"'PwO'�}
6_��|7Z]-Z�\��|E6TW�^��!P@
BK�)PX@SC
D@CSC
DY@!!%&!+332>32#654&#"^x+")cnt;op
^KMS8rk^$=�$��O}W-��	2[��|.)ej9i�]��G����%,@)SCSD%%	+%2>54&#"".54>32�W�f7�~:fVE/�wP�]3H��lP�]3I��>[��g��)Jex�F��K8j�`yߪe9i�^yޫf2����-m@!BK�)PX@SCSCD@!CSCSCDY@%#--*&!+32>32#"&'"32>54&2�+# 'amv=AbB" ;Ul�HQ�+;�9sj^$#,�E?mYE/f��F$��Q�_42[�PM���b9HF�?t�d��O@3Xu��A��<��s�.6@3#BSCSCD&$..*) +#"&547#".54>322>?&#"�6O&Yeo<?^? ,Qp��R<h3��9mdX#4;EC~o]D%[��sM}Z11Z�PW��~\4��?t�c�-Pn��L��^��,@)
BSC
D#$!+332>32&#"^x+#D�c)+.(k�=<�$�أ�Y��!����<=@:<BhfSCSD:8'%" #!+#".#"#"&'7>3232>54.54>32�
2J73[C'&?OTO?&3^�Ra�/	
5R>;aE&&>PSP>&2Z|JT|0i"9K*)8)%4K5@x]8C6" ' 'DY2,<+#2H4:kS144l���@+g@
	&BK�!PX@#jhQCSD@!jh\SDY@	%#(&&+74>7#"5?>;!!32>32#"&�D��B
./ ��E=0!3&(r9R]�$9,5)d	��G��)4!A:**3Zr����"P@
BK�%PX@CT
D@C
CTDY@""'!%+32>73#"&5#"&54>7!KMS7pj^$@^x,)cmt:oo
�/(fk8i�\�O|U-��	3Z��S��@BC
D+ +3267>;#SI�
�G�N�	��,*0
�Vx�) @#BC
D(!+: +32>76;2>7>;#"'&5+VC�	V$�
FB�VD���B���))��**
�(����V�@BC
D("(!+3267>;	#"&'+s�P
�	 	T��P
�	��P��rq	�0����QV����@
BCD,"!++32>7>;�C��J
�
�	I����
��	
	<�@QCQ
D+!!7>7!7!6�a/	�^
���
����K&	MKG��F�D7@4"5B[[OSG<:303)+4&#72654&54>;+";20#".54>�D9J\+NoE3:P1	'?.*")"'8#38U:#*#�9I;tw<�<U�_3(3Vn:B�>-TF3
)5 =vw{A)B0

	%BY4D{ut���@QD+3#�KK����D7@45"B[[OSG<:303)+3"+7>;2>54&54>7.54>54.+"&504>732�D9J\+NoE3:P1	'>/*")"'9"37V:#*#9I;tw<�<U�_3(3Vm;B�>-TF3
(6 =vw{A(C0

	%BY4D{utP���9@6jk[OSG
+2>53#".#"#4>32�%=*N <X83kib+&;*M <W84khb70B'7^F('0'0B'7^F('0'�����
)@&hSCD

+>734632#"&�D

)			C 5'#7''5��&-PS\88\SP-���'7#'55���/:K@H%BjhfkSCSD##'#	+.54>?>;#".'>32+V�b4L�ˀ#
#)V�.
	4N8�KlI*J]l:$
#�)LmE�i�r=@o�`�לX��;- ��"' 	1%�
�Q�]7lJ��i�=C@@+
Bh[SCS
D%&%##("	+#!>3!#!7>7#7>;>32#"'.#"!a�%'#/)�5$=/*��$Lz�fPuQ4(	&;XAN�`=	$����,F9/'@
#4I5W%)]�uC%?V0 <.4_�O��$��D#79@6!B
@ ?WSD42*((+467'7>327'#"&''7.732>54.#"(#�2�-n?>n-�1�%))#�1�-n?>m,�1�$)H+Ib89cJ++Jc98bI+�>m-�2�%*)$�2�-n?>m-�2�$)($�2�-m?8bI++Ib88cJ++Jc���!8@5	B
Z	YC
D! +!+!32>7>;!!!!#!7!7!�[��M	

�N��[��o��/]/��n��h�d##���9v8��8v���@YQD+3#3#�KKKK����X�}b�EYA@>EWM:#BhfWSDCA,*'%!#!+#".#"#"&'763232>54.5467.54>32>54.'K	1I76[B%(BUXUB(^](22]�Ta�0
4P>>bD$Im�mIdq*42Z}LS{0��!8IPR$NC2CJL#`M
#:N*)>3,-3AR7^�&"U;Dy\5B6" % 'CY2=S@:GaGU�)!V>;lR145��&<2+(+&kE(?3*&&+gv�qm%3K�'PX@
SD@OSGY�&(($+#".54>32#".54632

V
0"





"1
k���/Ka�@
BK�PX@4hf[[		SCSDK�PX@4hf[[		SCSD@4hf[[		SCSDYY@
^\*,*(#&(%"
+>32#".54>32#".#"32>4>32#".732>54.#"Y";�t`�s@Cw�c4WJA	!;[DS�a55_�L<V?-�%4^���dc���^44^���cc���^4<g��\��yW/h���g�#;FAv�fd�wB)!5b�WZ�a3,c���^44^���cd���^44^���d��h/Wy��]��ii���>d�0:L@I!Bh[	WSD21651:2:%#00
+"&=#".54>7>454#"#"&/>32'26?4cB2&)[�go'8)

	1i?*>)�=[+��9GD.11!*H7!w/-1A$	4Y�a*5)�KB.)����%�%(+77�

�			� =

�			� z
����	{z
����	�T��=K�	PX@_MQE@kMQEY�+!#!�<.O$���'c*x@MQE+!!n�	�RxNq���1GP��<BK�PX@/h		[
[SCSDK�PX@/h		[
[SCSD@/h		[
[SCSDYY@22PNJH2G2F)!**,&+4>32#".732>54.#"#32#"'.#'32654&+q4^���dd���^44^���cc���^4<g��\��yW/h���g�U����v
O��n�ywkw��c���^44^���cd���^44^���d��h/Wy��]��ii��yusvd�
��_
@a[\Tr�q$@MQE+!!y��	$@�D��'@WSD((($+4>32#".732>54.#"�0Qm>?nQ//Qn?>mQ0E$>U00T=$$=T00U>$n>mQ..Qm>>lQ//Ql>0T>$$>T00T?$$?T<P8<@9jhZMQE
	+!!#!7!!!�2�	�O1L1�S�2����V�jG�l�G��G���V/g@
-BK�!PX@h[SD@!h[OQEY@+)%#
//+2>3!2!767%>54.#"#"/>�(E33C%�(�'
"=,#/9Z$�V,?*-LD?!��;>@$-B=`e�|�V>�@:BK�PX@,hh[[SD@1hh[[OSGY@8631+*)( >>	+2#".'763232>54.#7>54.#"#"/>�(D2UE@A+H^3<N1 	
 9.,E/+D0ae".?T	$1BPV)<&K_K95U>!3C$
('0;-!2RH+B;0I2�T�@kD"++7>3T�7�
�������$7@4#BCS
CD$$&(!&+32673#"50>7#"&'#"&5RcjX�H][z3K�]Xn(.��cmybX�	;3X[JD*R#��y�B4�*@'hiSD+##!#".54>34	�U����Vm\�h8E��n�R�
�
y-SwKV�i;����@OSG($+4>32#".�$&&$P&&%%��TV@
BK�	PX@^jTD@jjTDY@+232654.'73#"&'764#3:(8"8:'JN2E(&D
��
2*�a73!5%��lQN�	BK�PX@jjQD@jjMRFY�$+37#"/733!��C�
�9R����%��h5�;��#)@&WSD##	+2#".54>2>54&#"�7U;+OpE8V;+Oq7T8RR:U8R�$C]9O�[2$B]9O�\2��*MlBYk+NlAYj���%�#(+7'&54767&'&54?'&54767&'&54?�	�	��	�	���
'	'
����
'	'
���`�(.Q@N"Bhh
Z\	C
D.-('&%$#%"#!"
+%3+#7!"5'3+6;37#"/733!>7!�n=���A��&�$(���C��9R�������'��"�Ud#�k%w
��h5t�|�H�9Jb@_D=7Bhh
Z[	CT
D
	JIHGFEB@;:52/-	9
9""
+%+6;2>3!2!7>7%>54.#"#*/>%37#"/733!w&�$(y(E33C%�(�'
"=,#/>X����C��9R���d#�K,?*-LD?!� �;>@$-F9`e %w
��h5�r�Y_y@vU
!.
	
B

h	
	
h

h	[

[\

SC
D_^SPMKEDCB:820*(YY"#!#+%3+#7!"5'3+6;%2#".'763232>54.#7>54.#"#*/>>7!�		n=���A��&�$(��(D2UE@A+H^3<N1 	"6*,E/+D0ae".?V		1BP+���'��"�Ud#)<&K_K95U>!3C$
-%0;-!2RH+E80I2���|��;�(:5@2BhfSCSD('#,$+#".54>?332>324>32#"&;DP\4;gL+1KZP; >6MXK1!8K)=]B'�!""'5�3'%Db>RtS=68%��+?99KeG0L5$*$P""!5����X�&$	@����X�&$H����X�&$
@����X�&$@����X�&$
@����X�&$@����:@7BYYQCS
D#	+!!!!!!+!!��6��W�X���Mwz���
5��P��R��b��z5+�����Lh@e9?
J	Bhf
hSCSC	S			DHF>=750.&$!LL+232654.'7.546$32#".#"32>32#"&'76#3:(8"/r��Fp��ItaQ&)N}`��aBv�bItZA.	#-ds�LJN2E(&D
��
2*r^�܅�3�y,B*(,5,h���|NjJ%+%*-I5L73!5%���?�&(	G���?�&(G���?�&(
G���?�&(
G�����&,	�����&,�����&,
�����&,
E`�!,@)YSCS
D!%(!+3!2#!#%4.#!!!!2>M�R�}ɍLl�����$T��?u�g��Hs��Jx�ݡZ��U�މ����r�y†H��>��c����!�&1������q�&2	������q�&2������q�&2
������q�&2������q�&2
���)C�	(+		'	7	)�cF6���Z,���9C�
����3u��3wp4��pO����!-9b@
21&%BK�PX@kCSCSD@jkSCSDY�**%(%$+#"&'+7.546$327>;.#"%4&'32>qm���h�C�")�JNn��m�Ez
4�DH�w:6%:�`�ޣ\"40��9�Z�ޢ[0����x>9��Q卺3�xE?��Q��v�E�<@h��(o�E�67g�������&8	�������&8�������&8
�������&8
������&<&�Y�,@)\[C
D"& +32+#332>54&#����J��u�#c�d-T�^�k:��i��l��H������T<j�V��;���P�@
JBK�PX@-hkSCQCSD@+hk[SCSDY@LKIGFD<:$"PP	+2#"&'763232>54.54>54.#"+'&573>�InJ%4MZM4.EQE.6_�M]~03L::^B$/HRH/5O]O54T=A{cEp*#���W|��-I\.FdL<:A+)3'&7TBL\3C6! % (E]58F0#-B58RC=GZ?D9&Bv�^�z�v	(_��K��<��s�&DCT��<����&Dv-��<��s�&D���<���h&D���<���m&Dj��<��s�&D�22��j�GWd�@?E!BK�)PX@5hh

[S	CSD@?hh

[S	CSCSDY@&YX^]XdYdSQIHCA=;860/'%
	GG+232>32#"&'#".54>?>54&#"#"/>32>32>7">54&Z7]D&>���y5UD3(	0\`g:t�[jo08]C%F��\[BaF.Q�crt9�����=0B'=oY<
�GtY;
��{4b� ;Q0:hN0))��$($
3K1��MjA8W<K}[6U#in(/(NPxkjx�'Eb?.B+-U|P+6c�V'<N-HQH��F�Nh@e;A
L	Bhf
hSCSC	S			DJH@?9720(&#!NN+232654.'7.54>32#".#"32>32#"&'76#3:(8"1OtM&!>Xn�I1OB6	
1N;T�k=AbC5TA1&
2XVV/ JN2E(&D
��
2*u?i�SO��vV1#2! % Z��lEvV0")"
7I,P73!5%��F��F�&HC���F��F�&Hv���F��F�&H����F��Qm&Hj���a`�&�C���x'�&�v���B%�&�����IDm&�j�I���y7I5@20B76
@[SD98A?8I9I,*" +&54?.'&54?7#".54>324654&'267.#"��3vD
Q�C�
�+H4@��~L�^5Ay�i1`TE\U�I��!	+GeDZ�`2*Hc.	y#0	=3�
	o(f~�Y����n9h�[m��U9X=��K��,��3dO1H|�^M{V.��^�j&Q����++��G����&RC����++��G����&Rv����++��G����&R�����++��G���j&R�����++��G���o&Rj����++��3^#+@([YOSG&&&%+!!4>32#"&4>32#"&���U�%$.&$,X%$.%#-�G{&1#%/�Y&1#%/ ��� *5u@
43$#BK�PX@!kCSCSD@!jkSCSDY@,++5,5'%  +"'+7.54>327>;&#"2>54&'��YF
!&+-H��lDq-=2u),I����7GnW�h9W�g9��G
K`�5�[yߪe(&S�5�Xyޫf��W�GY��AZ��kBn*�GB��r����&XC����++��r����&Xv����++��r����&X�����++��r���o&Xj����++��V����&\v����++;����0?@<"BCSCSCD(&00*%+3>32#"&'#"32>54&;�]b'`kt<AbB" ;Ul�HQ�+6$9sk]$#7>C#?mYF/g����N�\32[�PM���b9HG�E@u�d��'6"3Xu��A����V���o&\j����++�����'0L@I-BAhZC
CSD)($"''+2#"&54>7.'!+332>!.'�	
Q+BK*6e���L�bg7.3*$��E�		�!B:">6.��b��y$0<")0
��+,<��s�4F�K�%PX@&;B@&;BYK�%PX@*hSC	SCSD@.hSC
C	SCSDY@65><5F6F1/('$"44
+2#"&54>7.5#".54>32#32>2>7&#",	
Q+BK-8!&[gr=?^? ,Qp��R<h3u3+3*$�09odY#2;EC~o]D%[�!B:#@7/
4P�^41Z�PW��~\4�?$0<")0
6@u�d�-Pn��L���������&&���H��F�&Fv����++���?�'T@Q	B
		hYQCQ
C		SD$"''+2#"&54>7!!!!!!#32>X	
Q+BK*6����WG7��I�p3+3*$�!B:">6.�R��P��R$0<")0
F��F�L]e@bR9@?Bh	h
SCSCSDNMM]N]IG>=750.LL+2#"&54>7"#".54>3232>32732>">54.C	
Q+BK$/S�X.;Wp�OIe?8`�Ќ��5UC3(	/XZ_6)-3+3*$P�cC��O,,G�!B:93-7e�ZK��zZ4)=G)JB;1')��$($
1H0
$0<")0
�Dq�Q%)0361(xN�@C
D+#Ny]y��0��!@BCR
D+%!!7>?3g��~Dh�6H�	
�[c��=
��UMf@
^�S8�@BC
D+46?37#S�L]H��_\Z��
Tv��W2V���V���!�&1���^��&Qv���++���� 46@
BK�PX@*YSCQ
C	S
DK�PX@4YSCQ
CS
C		S
DK�#PX@*YSCQ
C	S
DK�%PX@4YSCQ
CS
C		S
D@2YSCQ
CQ
C		SDYYYY@1/'%  (%+!!!!!#".54>324.#"32>	�ZG2	��H��'+q��Vo�}Ce��W�rQ,]7g�]w̕U8h�\x̔T�R��P��R>N{U-W�އ�6�z5a�Vg��x‰Kk��x‰Ij�6����8N]S@PT6$BhS	C
SDPO:9O]P]FD9N:N42*(" 88+232>32#"&'#".54>32>2>54.#"">54.�=aD#8^�ƃ�y5UD3(	0\`g:y�Ui~GOtK$M��ix�:�8GrW>(:W;Z�h88Z~H{_?��{-0J� 9O0%F@80'��$($
3K1��EnL):aE���Z�uv��I2Vs��?CoO+T�ۈ6fP0q:k�_:EN'6)��'����&6��!����&Vv����++��'����&6
��!����&V�����++�����&<
&��,��&=F��	<�&]v����++��,��&=F��	<�&]�����++��,��&=F��	<�&]�����++��U�%SK�PX@ YSCSDK�PX@ YSCSDK�PX@ YSCSDK�PX@ YSCSDK�PX@ YSCSDK�PX@ YSCSDK�PX@ YSCSD@ YSCSDYYYYYYY@%%""	+#763>7'&546737>3#"!��Vw�W%3eWE���//�"5dWE1f	��b�\+/FqS
���1 FqR�Eo�R�
@BkD' +#"/+73R=	{�A�S������r�
@BkD' +32?6;#�A{�?�S������r�q$q��a� @WD+".547332>73e5K.C 3&,?+C#=Y�5H*4%3B&2ZD'2���@SD($+#".54>32�    F!!�s�=K�'PX@WSD@[OSGY�$&($+4>32#".732654&#"�/?##?//?##?/:@32@@23@$<++<$$;,,;$2@@22@@7��\
+@(B@jSD+2#"&54>732>F	
Q+BK1>-3+3*$�!B:%C:/
$0<")0
|�nhQK�PX@WSD@[OSGY@
+2673#".#"#>32�(.9(6 1-+&0:)5 2,*�7/$>.!(!:-$?-!'!����	#@ SD



	#++7>3!+7>3��)�=�-�
�������Y�\�BK�1PX@SCS
D@SC
CSDY@!$##	++#!#"&'7632327#7>3Y�q]q�VVsb0	�V��$�d��;ns	&
��!
�ld@MQE+!!���+dE�Bd@MQE+!!��	�VdE�#���(+&5467�\H):#7;X�B
1v?/*�\��(+'&5467>54&'&547E\H*8
�7;X�A		1v?,
����(+7'&5467>54&'&547�\H*8
�7;X�A		1v?,�#��)�(+&5467&5467�\H):�\H):#7;X�B
1v?/*7;X�B
1v?/*�e�+�(+'&5467>54&'&547%'&5467>54&'&547T\H*8
8\H*8
�7;X�A		1v?,7;X�A		1v?,����+�(+7'&5467>54&'&547%'&5467>54&'&547|\H*8
8\H*8
�7;X�A		1v?,7;X�A		1v?,����"YK�PX@#CSCSCD@OCSCDY@
$!#"+>3>32>72!#"'!�F�K/	GL�F��=O
h=�����&
����f����6��*
BK�PX@6		`

[CSCSC


D@1		`O

[CSC


DY@661.,+)'$##!##+%!7>3>32>72!!#.'#"'"&5467�X��F�K/	GL�F��Z_F�K,
G&OOM$�� ��&
�+�'�
91�|@OSG($+4>32#".9.Pi<=lP..Pl=<iP.T=lQ..Ql=<iP..Pi:����!1@SD&&(&&$+74>32#"&%4>32#"&%4>32#"&:!#7''5�!""'5�!#7''5M""'55'""!5'""'55}����'0DXl��K�PX@/[	[SC
C
		S
D@3[	[CSC
C
		S
DY@}{sqig_]US((%"&((($+#".54>324.#"32>>;+#".54>324.#"32>%#".54>324.#"32>�7Zt>3W?#4XvA3V?$J.>$0XC'-?$0WC(XA��B�7Zt>3W>#4XuA3V?$J.=$0XC(.?$0WB(�6Zt?3W>#4XuA3V?$J.=$0WC'->$0WC'qg�h4&ImGg�i5&JmI<W9)W�]<V8(V�b
���g�h5&JlGg�i5&KmH<W9)W�];V8(V�]g�h5&JlGg�i5&KmH<W9)W�];V8(V������(+7�

�			� z
����	����(+7'&54767&'&54?�	�	���
'	'
�����@C
D""+'+6;�&�$(d#)����J[@X9	Bh		h
[	[SC
S


DJIFEDC?=75$##%'$+3>32#".#"!#!!#!32>32#".5#73>7#L�q��r@jWI %,@W:_��`e��	�4a�Y>cM:)	 )^l|Fn�u<���^�ғN,A*$$@}�u*X0z��C%+%	!.K5Q�ه9/Y*�H�&9@6BhiS	D&&!4)
+>7>;#7+"'#32'###7��

6E<6	�	
�7<F7

��?E?�

n���'��|)�B?
:��:(;�:3@0 BSCS
D::***+!>54.#"!"504>7!7.54>32!�,d�yDCv�]p˛[0Y|L+�3�N�]4l��rÍPK��g�hY��yj�n7I�׎V�hF��
�Rw�\��YF��v}͛h�3W����/AC@@5"Bh[SCSD10;90A1A#)**$+>32#".54>32>54&#"#"'2>7.#"�%BBD&EjH&	k�ԂClM)&Eaw�K1WG4ol-G6%
NK�v_!7V?f�r=t=#5d�^AI����,SvKR��tT/7T:N�V���&F��x4dN0`��`y���i�@	BCR
D+)3!.'i�j�Y�j�������%&���w�$@!QCD+##!##7w	��_���_��	�P�i��i�P���*@'BQCQD+!!!767	&5467	�I��R�
�����R����R$2-
�{��@MQE+!!�<	���GES�"@Bj[
D+%!+!##"&5467!267>;RM��9�
�7�	��)#(�L��';OL@IK-B[
	O
	SG=<)(GE<O=O31(;);	''+".'#".54>32>32%2>7.#"!2>54.#"�3O?3"HPX30T>$3Un<3O?3"GPX31U?$2Up��(IDA -4@(-P=$-<m0Q;"-<$(ICA!,5?'BV..VB'$C`<N�_5'BV..VB'$C`<L�`7N&?T--T@&'Ge=.F0*Id:-F0&@S--T@&�e����'*@'BSCSD!%'U$+>32#"&#"#"&'7>3232>7�EZl;$4

	`�"�Kas@;
 6[J7>W�U+
,
����d�Z)	' GrQ����7d@a!0"/B[[[	O	SG42+)&$77

+2>7#".#"'>322>7#".#"'>3243-%#i83a]\.3,%#h<4a][2-&#h84a]\/3,$$h<5a]Z(8+.$,$6-/$,$��8*/$,$6-0%+%��	pkK�	PX@)^_	ZMQE@'jk	ZMQEY@

+!3!!!!#!7!7!��F��͇�	�F�E���Z��>c
��G�G��G�gP�O@@MQE+!!���&)$�@A�
��v>��	��
x��IuP�Q@@MQE+%!7!7>767.'&5<>7c�	�A��G&)$���PI��>	
����f�"@
BMQE+3	#	>7	.'��B��nB��L		M��		�@����@�S�����~�@ja+3v���0@�T�%k@BK�!PX@"kSCQC
D@ k[SC
DY@!&%$	+!#!+'&5737>32#"&#"8w^n�Fl*"�~�Dl�X%$ 	
,"���<}���v	*U\�e6.��@���$�@

BK�!PX@$kSC
	QC
DK�%PX@"k
	[SC
DK�)PX@&k
	[CSC
D@-hk
	[CSC
DYYY@$$!!%$++'&5737>32;#.#"!3l*"�~�Bj�YE�94�]�/h0EqU7	~���v	*BX�m>
�nL/X~NBFS�����-K�1PX@jD@
jaY@	+#�n;N[��{��	@ja		+2#"&/��I	��	
���6��@OSG$$$"+#"&54632#"&546324/../O.--.�,, -- ,, --�6�p@MQE+!!�	��p:,��	@ja	#++7>3���I����
	���@Bja+ +#"&/.'+73�G��G�W������@Bja+ +326?>;#�G��G�W��������(@%jOSG
+"&547332673�gc>DNXU?
{�XT9AQHcr@8��@OSG($+#".54>32�  ���1�!@[OSG$&($+4>32#".732654&#"�-<"">-->""<-5?32@@23?^";**;"#:**:#2@@22@@���1@.[OSG
+2673#".#"#>32&/4&4 3/-&/7'4 4.-O7+"<, & 9*"<, % ��	+@(OSG



	#++7>3!+7>3�-�Z�3���������@kD	+2+�	$U�
!;XB
-��M�_<�	�ʓ^p�ӡ���	��V �����/�T����P�r�}�M��(�(�����?dc�:����Z���F�q�>�g����f���:�<+���+���a�������v�?��`�p�&�B������n���F������'5�E���T��S��,(D�q(����<�f]H�@F8Bq��f�x��mxc�u^^�G�2�<�^!�l�r�SSVV���VF	(GX�(�P�T��������X��XvMkk�2���dcMqr���<������y�����2��������������������������������?�?�?�?�&�&�&�&��En��������������OE�E�E�E�S�F�;�<�<�<�<�<�<�2]HFFFF�a�x�B�I�I^�G�G�G�G�G��� �r�r�r�r�V�;�V����<�]H?�F�x�02Sn�^��6�'!�'!S��,F	�,F	�,F	�o�r�2�7|�<������n�n��
g�g�g��,�,f�9`: }E�E��)!�l(+W���T�����bE�L�e����+g+u�����@@S{��,���@���g�P`�	�[�j�y�j�[$�[9>:A</?>D��F��G��H��R��T��m�yo�yy�y}�y��[��[��[��[��[��[��[�/����������������������������������������������������������[���������/�y�y�j�j�y�j�y�y��[
	�[
�j
�y
�j
�[
$�[
9>
:A
</
?>
D��
F��
G��
H��
R��
T��
m�y
o�y
y�y
}�y
��[
��[
��[
��[
��[
��[
��[
�/
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
�[
��
��
��
��
�/
�y
�y
�j
�j
�y
�j
�y
�y
��[#��&��*��2��4��D��F��G��H��R��T��k��p��������������������������������������������������������������������������������������������
	�[
�j
�y
�j
�[
$�[
9>
:A
</
?>
D��
F��
G��
H��
R��
T��
m�y
o�y
y�y
}�y
��[
��[
��[
��[
��[
��[
��[
�/
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
���
�[
��
��
��
��
�/
�y
�y
�j
�j
�y
�j
�y
�y
��[�=
�=
�=�I#��&��*��2��4��7�A9�=:�m<�d?�=Y�~Z��\��k��l�=m�Io�Ip��r�=y�I|�=}�I�����������������������d��~��~�����d�I�I�=�=�=�=�I�I�I�y	��
�y
�y�j�j��$��7�G9��;��<�Q=��?��l�yr�y|�y�����������������������Q���Q�������y�y�j�y�y�j�j����=
�=
�=�I#��&��*��2��4��7�A9�=:�m<�d?�=Y�~Z��\��k��l�=m�Io�Ip��r�=y�I|�=}�I�����������������������d��~��~�����d�I�I�=�=�=�=�I�I�I>	��
>
>�G���G������"F#��$��&��*��-�o2��4��D��F��G��H��P��Q��R��S��T��U��V��X��Y��Z��\��]��k��l>m��o��p��r>tPuPw��y��{P|>}�������������������������������������������������������������������������������������������������������������������������������������������������������>�>�G�>�>�G��G�����#��#	��#
��#��#
��#��#$��#7��#9��#;��#<��#=��#?��#@��#`��#l��#r��#|��#���#���#���#���#���#���#���#���#��#��#��#��#��#��#��#��#��#���$�V$
�V$
�V$��$#��$&��$*��$-2$2��$4��$7��$8��$9��$:��$<�y$?��$W��$Y��$Z��$\��$k��$l�V$m��$o��$p��$r�V$t�`$u�`$y��${�`$|�V$}��$���$���$���$���$���$���$���$���$���$���$���$��y$���$���$��$��$�y$��$��$�V$�V$�V$�V$��$��$��&�o&m�o&o�o&y�o&}�o&�o&�o&�o&�o&�o'��'	��'
��'��'
��'��'$��'7��'9��';��'<��'=��'?��'@��'`��'l��'r��'|��'���'���'���'���'���'���'���'���'��'��'��'��'��'��'��'��'��'���)	��)�L)�L)��)��)��)")$��)-�.)D��)F��)G��)H��)P��)Q��)R��)S��)T��)U��)X��)w��)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)���)��)��)��)��)��)��)�L)�L)�L)���-	��-��-$��-���-���-���-���-���-���-���-��-���..
.
.��.#��.&��.*��.2��.4��.I��.W��.Y��.Z��.\��.k��.l.m��.o��.p��.r.y��.|.}��.���.���.���.���.���.���.���.���.���.��.��.�.�.�.�.�.�.�.�.�/��/
��/
��/�$/#��/&��/*��/2��/4��/7�8/9�V/:�y/<�=/?�V/Y�z/Z��/\�z/k��/l��/m�$/o�$/p��/r��/t�=/u�=/y�$/{�=/|��/}�$/���/���/���/���/���/���/���/��=/��z/��z/��/��/�=/�$/�$/��/��/��/��/�$/�$/�$2��2	��2
��2��2
��2��2$��27��29��2;��2<��2=��2?��2@��2`��2l��2r��2|��2���2���2���2���2���2���2���2���2��2��2��2��2��2��2��2��2��2���3	��3�=3�=3��3$��3-�V3D��3F��3G��3H��3R��3T��3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3���3��3��3��3��3��3�=3�=3�=3���4��4	��4
��4��4
��4��4$��47��49��4;��4<��4=��4?��4@��4`��4l��4r��4|��4���4���4���4���4���4���4���4���4��4��4��4��4��4��4��4��4��4���5#��5&��5*��52��54��57��58��5k��5p��5���5���5���5���5���5���5���5���5���5���5���5��5��7	��7�L7�L7�L7��7�]7�]7"-7#��7$��7&��7*��7-�872��74��7D�)7F�)7G�)7H�)7J�A7P�]7Q�]7R�)7S�]7T�)7U�]7V�F7X�]7Y�Q7Z�y7[�b7\�L7]�e7k��7m�L7o�L7p��7w�]7y�L7}�L7���7���7���7���7���7���7���7���7���7���7���7���7���7���7��)7��)7��)7��)7��)7��)7��)7��)7��)7��)7��)7��)7��)7��]7��)7��)7��)7��)7��)7��)7��]7��]7��]7��]7��Q7��Q7��7�)7��7�)7�)7�]7��7�)7�F7�F7�e7�e7�e7�L7�L7�L7�L7�L7�L7�L7�L7���8	��8��8$��8���8���8���8���8���8���8���8��8���9>9	��9
>9
>9�G9��9�G9��9��9��9"F9#��9$��9&��9*��9-�o92��94��9D��9F��9G��9H��9P��9Q��9R��9S��9T��9U��9V��9X��9Y��9Z��9\��9]��9k��9l>9m��9o��9p��9r>9tP9uP9w��9y��9{P9|>9}��9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9���9��9��9��9��9��9��9��9��9��9��9��9��9��9�9�9�>9�>9�G9�>9�>9�G9�9�G9�9�9���:F:	��:
F:
F:��:��:��:��:��:$��:-��:D��:F��:G��:H��:J��:P��:Q��:R��:S��:T��:U��:V��:X��:lF:rF:t<:u<:w��:{<:|F:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:���:��:��:��:��:��:��:��:��:�F:�F:�:�F:�F:�:�:���;;
;
;��;#��;&��;*��;2��;4��;I��;W��;Y��;Z��;\��;k��;l;m��;o��;p��;r;y��;|;}��;���;���;���;���;���;���;���;���;���;��;��;�;�;�;�;�;�;�;�;�<4<	�~<
4<
4<�[<�V<�[<�~<��<��<"2<#��<$�~<&��<*��<-�8<2��<4��<D�G<F�G<G�G<H�G<J�_<P��<Q��<R�G<S��<T�G<U��<V�G<X��<]��<k��<l4<m�V<o�V<p��<r4<t2<u2<w��<y�V<{2<|4<}�V<��~<��~<��~<��~<��~<��~<��~<���<���<���<���<���<���<���<��G<��G<��G<��G<��G<��G<��G<��G<��G<��G<��G<��G<��G<���<��G<��G<��G<��G<��G<��G<���<���<���<���<�~<�G<��<�G<�G<��<��<�G<�G<�G<��<��<��<�V<�V<�4<�4<�[<�4<�4<�[<�V<�[<�V<�V<��~=��=" =#��=&��=*��=2��=4��=k��=m��=o��=p��=y��=}��=���=���=���=���=���=���=���=��=��=�=�=�=�=�>#��>&��>*��>2��>4��>D��>F��>G��>H��>R��>T��>k��>p��>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>���>��>��>��>��>��>��?�V?
�V?
�V?��?#��?&��?*��?-2?2��?4��?7��?8��?9��?:��?<�y??��?W��?Y��?Z��?\��?k��?l�V?m��?o��?p��?r�V?t�`?u�`?y��?{�`?|�V?}��?���?���?���?���?���?���?���?���?���?���?���?��y?���?���?��?��?�y?��?��?�V?�V?�V?�V?��?��?��E��E
��E��E
��E@��E[��E`��El��Er��E|��E�E�E�E�H��H
��H��H
��H@��H[��H`��Hl��Hr��H|��H�H�H�H�IKI
KI
KI�yI�yIlKIrKItdIudI{dI|KI�KI�KI�yI�KI�KI�yI�yK��K
��K
��KY��K\��Kl��Kr��Kt��Ku��K{��K|��K���K���K��K��K��K��ND��NF��NG��NH��NR��NT��N���N���N���N���N���N���N���N���N���N���N���N���N���N���N���N���N���N���N���N��N��N��N��P��P
��P
��PY��P\��Pl��Pr��Pt��Pu��P{��P|��P���P���P��P��P��P��Q��Q
��Q
��QY��Q\��Ql��Qr��Qt��Qu��Q{��Q|��Q���Q���Q��Q��Q��Q��R��R
��R��R
��R@��R[��R`��Rl��Rr��R|��R�R�R�R�S��S
��S��S
��S@��S[��S`��Sl��Sr��S|��S�S�S�S�U�yU�yUD��UF��UG��UH��UR��UT��U���U���U���U���U���U���U���U���U���U���U���U���U���U���U���U���U���U���U���U��U��U��U��U�yU�yU�yY	��Y�~Y�~Y��Y$��YD��YF��YG��YH��YR��YT��Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y���Y��Y��Y��Y��Y��Y�~Y�~Y�~Y���Z	��Z��Z��Z��Z$��Z���Z���Z���Z���Z���Z���Z���Z��Z��Z��Z��Z���[D��[F��[G��[H��[R��[T��[���[���[���[���[���[���[���[���[���[���[���[���[���[���[���[���[���[���[���[��[��[��[��\	��\�y\�y\��\$��\D��\F��\G��\H��\R��\T��\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\���\��\��\��\��\��\�y\�y\�y\���^#��^&��^*��^2��^4��^D��^F��^G��^H��^R��^T��^k��^p��^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^���^��^��^��^��^��^��k��k	��k
��k��k
��k��k$��k7��k9��k;��k<��k=��k?��k@��k`��kl��kr��k|��k���k���k���k���k���k���k���k���k��k��k��k��k��k��k��k��k��k���l	�[l�jl�yl�jl�[l$�[l9>l:Al</l?>lD��lF��lG��lH��lR��lT��lm�ylo�yly�yl}�yl��[l��[l��[l��[l��[l��[l��[l�/l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l���l�[l��l��l��l��l�/l�yl�yl�jl�jl�yl�jl�yl�yl��[m�ym	��m
�ym
�ym�jm�jm��m$��m7�Gm9��m;��m<�Qm=��m?��ml�ymr�ym|�ym���m���m���m���m���m���m���m��Qm��m�Qm��m��m��m�ym�ym�jm�ym�ym�jm�jm���o�yo	��o
�yo
�yo�jo�jo��o$��o7�Go9��o;��o<�Qo=��o?��ol�yor�yo|�yo���o���o���o���o���o���o���o��Qo��o�Qo��o��o��o�yo�yo�jo�yo�yo�jo�jo���p��p	��p
��p��p
��p��p$��p7��p9��p;��p<��p=��p?��p@��p`��pl��pr��p|��p���p���p���p���p���p���p���p���p��p��p��p��p��p��p��p��p��p���r	�[r�jr�yr�jr�[r$�[r9>r:Ar</r?>rD��rF��rG��rH��rR��rT��rm�yro�yry�yr}�yr��[r��[r��[r��[r��[r��[r��[r�/r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r���r�[r��r��r��r��r�/r�yr�yr�jr�jr�yr�jr�yr�yr��[t	�et�et$�et9Ft:Ft<(t?Ft��et��et��et��et��et��et��et�(t�et�(t��eu	�eu�eu$�eu9Fu:Fu<(u?Fu��eu��eu��eu��eu��eu��eu��eu�(u�eu�(u��ey�yy	��y
�yy
�yy�jy�jy��y$��y7�Gy9��y;��y<�Qy=��y?��yl�yyr�yy|�yy���y���y���y���y���y���y���y��Qy��y�Qy��y��y��y�yy�yy�jy�yy�yy�jy�jy���{	�e{�e{$�e{9F{:F{<({?F{��e{��e{��e{��e{��e{��e{��e{�({�e{�({��e|	�[|�j|�y|�j|�[|$�[|9>|:A|</|?>|D��|F��|G��|H��|R��|T��|m�y|o�y|y�y|}�y|��[|��[|��[|��[|��[|��[|��[|�/|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|���|�[|��|��|��|��|�/|�y|�y|�j|�j|�y|�j|�y|�y|��[}�y}	��}
�y}
�y}�j}�j}��}$��}7�G}9��};��}<�Q}=��}?��}l�y}r�y}|�y}���}���}���}���}���}���}���}��Q}��}�Q}��}��}��}�y}�y}�j}�y}�y}�j}�j}�����V�
�V�
�V����#���&���*���-2�2���4���7���8���9���:���<�y�?���W���Y���Z���\���k���l�V�m���o���p���r�V�t�`�u�`�y���{�`�|�V�}�������������������������������������������������y����������������y��������V��V��V��V�����������V�
�V�
�V����#���&���*���-2�2���4���7���8���9���:���<�y�?���W���Y���Z���\���k���l�V�m���o���p���r�V�t�`�u�`�y���{�`�|�V�}�������������������������������������������������y����������������y��������V��V��V��V�����������V�
�V�
�V����#���&���*���-2�2���4���7���8���9���:���<�y�?���W���Y���Z���\���k���l�V�m���o���p���r�V�t�`�u�`�y���{�`�|�V�}�������������������������������������������������y����������������y��������V��V��V��V�����������V�
�V�
�V����#���&���*���-2�2���4���7���8���9���:���<�y�?���W���Y���Z���\���k���l�V�m���o���p���r�V�t�`�u�`�y���{�`�|�V�}�������������������������������������������������y����������������y��������V��V��V��V�����������V�
�V�
�V����#���&���*���-2�2���4���7���8���9���:���<�y�?���W���Y���Z���\���k���l�V�m���o���p���r�V�t�`�u�`�y���{�`�|�V�}�������������������������������������������������y����������������y��������V��V��V��V�����������V�
�V�
�V����#���&���*���-2�2���4���7���8���9���:���<�y�?���W���Y���Z���\���k���l�V�m���o���p���r�V�t�`�u�`�y���{�`�|�V�}�������������������������������������������������y����������������y��������V��V��V��V�����������o�m�o�o�o�y�o�}�o��o��o��o��o��o����	���
������
������$���7���9���;���<���=���?���@���`���l���r���|���������������������������������������������������������������������	���
������
������$���7���9���;���<���=���?���@���`���l���r���|���������������������������������������������������������������������	���
������
������$���7���9���;���<���=���?���@���`���l���r���|���������������������������������������������������������������������	���
������
������$���7���9���;���<���=���?���@���`���l���r���|���������������������������������������������������������������������	���
������
������$���7���9���;���<���=���?���@���`���l���r���|���������������������������������������������������������������������	���
������
������$���7���9���;���<���=���?���@���`���l���r���|������������������������������������������������������������������	������$��������������������������������������	������$��������������������������������������	������$��������������������������������������	������$��������������������������������������4�	�~�
4�
4��[��V��[��~�������"2�#���$�~�&���*���-�8�2���4���D�G�F�G�G�G�H�G�J�_�P���Q���R�G�S���T�G�U���V�G�X���]���k���l4�m�V�o�V�p���r4�t2�u2�w���y�V�{2�|4�}�V���~���~���~���~���~���~���~�������������������������������G���G���G���G���G���G���G���G���G���G���G���G���G�������G���G���G���G���G���G������������������~��G�����G��G��������G��G��G�����������V��V��4��4��[��4��4��[��V��[��V��V���~����	���
������
������$���7���9���;���<���=���?���@���`���l���r���|���������������������������������������������������������������������
������
���@���[���`���l���r���|��������������
������
���@���[���`���l���r���|��������������
������
���@���[���`���l���r���|��������������
������
���@���[���`���l���r���|��������������
������
���@���[���`���l���r���|��������������
���
���Y���\���l���r���t���u���{���|��������������������������
������
���@���[���`���l���r���|��������������
������
���@���[���`���l���r���|��������������
������
���@���[���`���l���r���|��������������
������
���@���[���`���l���r���|��������������
������
���@���[���`���l���r���|��������������
������
���@���[���`���l���r���|�����������	����~��~����$���D���F���G���H���R���T���������������������������������������������������������������������������������������������������������������������������~��~��~��������
������
���@���[���`���l���r���|�����������	����~��~����$���D���F���G���H���R���T���������������������������������������������������������������������������������������������������������������������������~��~��~������V�
�V�
�V����#���&���*���-2�2���4���7���8���9���:���<�y�?���W���Y���Z���\���k���l�V�m���o���p���r�V�t�`�u�`�y���{�`�|�V�}�������������������������������������������������y����������������y��������V��V��V��V�����������o�m�o�o�o�y�o�}�o��o��o��o��o��o����
������
���@���[���`���l���r���|������������o�
�o�
�o��t�9�j�:���<�y�?�j�Y���Z���\���l�o�m�t�o�t�r�o�t���u���y�t�{���|�o�}�t���y����������y��t��t��o��o��o��o��t��t��t����
���
���Y���\���l���r���t���u���{���|��������������������������
������
���@���[���`���l���r���|�����������4�	�~�
4�
4��[��V��[��~�������"2�#���$�~�&���*���-�8�2���4���D�G�F�G�G�G�H�G�J�_�P���Q���R�G�S���T�G�U���V�G�X���]���k���l4�m�V�o�V�p���r4�t2�u2�w���y�V�{2�|4�}�V���~���~���~���~���~���~���~�������������������������������G���G���G���G���G���G���G���G���G���G���G���G���G�������G���G���G���G���G���G������������������~��G�����G��G��������G��G��G�����������V��V��4��4��[��4��4��[��V��[��V��V���~����" �#���&���*���2���4���k���m���o���p���y���}��������������������������������������������������" �#���&���*���2���4���k���m���o���p���y���}��������������������������������������������������" �#���&���*���2���4���k���m���o���p���y���}������������������������������������������������y�	���
�y�
�y��j��j����$���7�G�9���;���<�Q�=���?���l�y�r�y�|�y�������������������������������Q�����Q�����������y��y��j��y��y��j��j������y�	���
�y�
�y��j��j����$���7�G�9���;���<�Q�=���?���l�y�r�y�|�y�������������������������������Q�����Q�����������y��y��j��y��y��j��j�����	�[��j��y��j��[�$�[�9>�:A�</�?>�D���F���G���H���R���T���m�y�o�y�y�y�}�y���[���[���[���[���[���[���[��/������������������������������������������������������������������������������[��������������/��y��y��j��j��y��j��y��y���[�	�[��j��y��j��[�$�[�9>�:A�</�?>�D���F���G���H���R���T���m�y�o�y�y�y�}�y���[���[���[���[���[���[���[��/������������������������������������������������������������������������������[��������������/��y��y��j��j��y��j��y��y���[��=�
�=�
�=��I�#���&���*���2���4���7�A�9�=�:�m�<�d�?�=�Y�~�Z���\���k���l�=�m�I�o�I�p���r�=�y�I�|�=�}�I�������������������������������d���~���~��������d��I��I��=��=��=��=��I��I��I�	�[��j��y��j��[�$�[�9>�:A�</�?>�D���F���G���H���R���T���m�y�o�y�y�y�}�y���[���[���[���[���[���[���[��/������������������������������������������������������������������������������[��������������/��y��y��j��j��y��j��y��y���[�	�[��j��y��j��[�$�[�9>�:A�</�?>�D���F���G���H���R���T���m�y�o�y�y�y�}�y���[���[���[���[���[���[���[��/������������������������������������������������������������������������������[��������������/��y��y��j��j��y��j��y��y���[��=�
�=�
�=��I�#���&���*���2���4���7�A�9�=�:�m�<�d�?�=�Y�~�Z���\���k���l�=�m�I�o�I�p���r�=�y�I�|�=�}�I�������������������������������d���~���~��������d��I��I��=��=��=��=��I��I��I��y�	���
�y�
�y��j��j����$���7�G�9���;���<�Q�=���?���l�y�r�y�|�y�������������������������������Q�����Q�����������y��y��j��y��y��j��j������=�
�=�
�=��I�#���&���*���2���4���7�A�9�=�:�m�<�d�?�=�Y�~�Z���\���k���l�=�m�I�o�I�p���r�=�y�I�|�=�}�I�������������������������������d���~���~��������d��I��I��=��=��=��=��I��I��I��y�	���
�y�
�y��j��j����$���7�G�9���;���<�Q�=���?���l�y�r�y�|�y�������������������������������Q�����Q�����������y��y��j��y��y��j��j������y�	���
�y�
�y��j��j����$���7�G�9���;���<�Q�=���?���l�y�r�y�|�y�������������������������������Q�����Q�����������y��y��j��y��y��j��j�����	�[��j��y��j��[�$�[�9>�:A�</�?>�D���F���G���H���R���T���m�y�o�y�y�y�}�y���[���[���[���[���[���[���[��/������������������������������������������������������������������������������[��������������/��y��y��j��j��y��j��y��y���[��V�
�V�
�V����#���&���*���-2�2���4���7���8���9���:���<�y�?���W���Y���Z���\���k���l�V�m���o���p���r�V�t�`�u�`�y���{�`�|�V�}�������������������������������������������������y����������������y��������V��V��V��V��������������.��B�>t�Tn��<�4t�@x		n	�
 
L
r
��l�

B
l
�"^��N��R�@��P���:j����r�N"j�Pj�@�
j���j����dd�$�  n �!*!|"f"�#&#V#p$@$Z$�$�%`&& &v&�&�'6'|'�((�)$)�*X*d*p*|*�*�*�*�+�+�+�+�+�+�+�+�+�,>,J,V,b,n,z,�,�-<-H-T-`-l-x-�.j.v.�.�.�.�.�/�0<0H0T0`0l0x0�0�0�1 121D1V1h1z1�1�2j2|2�2�2�2�3,3>3�4r4~4�4�5�5�5�6.6:6L7:7�7�888 8,888J8V8h8t8�9l9�9�9�9�:&:t:�;
;>;�;�;�;�<"<J<�<�==�>(>T>�?�?�?�@@�@�AjA�BBBB�B�B�CjC�DBD�D�EE`EzE�F�F�F�GG(GJGxG�G�HHDH�H�H��d"/n�	� ��
��/��(�0B	B
�Q-2E
�w9	S	g	{	^�	 �	P	 �	`U	�		�	
��	0
�	d
�	
�	4�	�	�Copyright (c) 2010-2013 by tyPoland Lukasz Dziedzic with Reserved Font Name "Lato". Licensed under the SIL Open Font License, Version 1.1.Lato LightItalictyPolandLukaszDziedzic: Lato Light Italic: 2013Lato Light ItalicVersion 1.105; Western+Polish opensourceLato-LightItalicLato is a trademark of tyPoland Lukasz Dziedzic.Lukasz DziedzicLato is a sanserif typeface family designed in the Summer 2010 by Warsaw-based designer Lukasz Dziedzic ("Lato" means "Summer" in Polish). It tries to carefully balance some potentially conflicting priorities: it should seem quite "transparent" when used in body text but would display some original traits when used in larger sizes. The classical proportions, particularly visible in the uppercase, give the letterforms familiar harmony and elegance. At the same time, its sleek sanserif look makes evident the fact that Lato was designed in 2010, even though it does not follow any current trend. The semi-rounded details of the letters give Lato a feeling of warmth, while the strong structure provides stability and seriousness.http://www.typoland.com/http://www.typoland.com/designers/Lukasz_Dziedzic/Copyright (c) 2013-2013 by tyPoland Lukasz Dziedzic (http://www.typoland.com/) with Reserved Font Name "Lato". Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL).http://scripts.sil.org/OFLCopyright (c) 2010-2013 by tyPoland Lukasz Dziedzic with Reserved Font Name "Lato". Licensed under the SIL Open Font License, Version 1.1.Lato LightItalictyPolandLukaszDziedzic: Lato Light Italic: 2013Lato-LightItalicVersion 1.105; Western+Polish opensourceLato is a trademark of tyPoland Lukasz Dziedzic.Lukasz DziedzicLato is a sanserif typeface family designed in the Summer 2010 by Warsaw-based designer Lukasz Dziedzic ("Lato" means "Summer" in Polish). It tries to carefully balance some potentially conflicting priorities: it should seem quite "transparent" when used in body text but would display some original traits when used in larger sizes. The classical proportions, particularly visible in the uppercase, give the letterforms familiar harmony and elegance. At the same time, its sleek sanserif look makes evident the fact that Lato was designed in 2010, even though it does not follow any current trend. The semi-rounded details of the letters give Lato a feeling of warmth, while the strong structure provides stability and seriousness.http://www.typoland.com/http://www.typoland.com/designers/Lukasz_Dziedzic/Copyright (c) 2013-2013 by tyPoland Lukasz Dziedzic (http://www.typoland.com/) with Reserved Font Name "Lato". Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL).http://scripts.sil.org/OFLLatoLight Italic���XA	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a��������������������������������bc�d�e�������f����g�����h���jikmln�oqprsutvw�xzy{}|��~�������	
�����
����������������������������������������������� !"#NULLuni00A0uni00ADmacronperiodcenteredAogonekaogonekEogonekeogonekNacutenacuteSacutesacuteZacutezacute
Zdotaccent
zdotaccentuni02C9EuroDeltauni2669undercommaaccent
grave.case
dieresis.casemacron.case
acute.casecircumflex.case
caron.case
breve.casedotaccent.case	ring.case
tilde.casehungarumlaut.case
caron.salt��_K_K�������V��������V�,� `f-�, d ��P�&Z�E[X!#!�X �PPX!�@Y �8PX!�8YY �Ead�(PX!�E �0PX!�0Y ��PX f ��a �
PX` � PX!�
` �6PX!�6``YYY�+YY#�PXeYY-�, E �%ad �CPX�#B�#B!!Y�`-�,#!#! d�bB �#B�*! �C � ��+�0%�QX`PaRYX#Y! �@SX�+!�@Y#�PXeY-�,�C+�C`B-�,�#B# �#Ba��b�`�*-�,  E �Ec�Eb`D�`-�,  E �+#�%` E�#a d � PX!��0PX� �@YY#�PXeY�%#aDD�`-�,�E�aD-�	,�`  �	CJ�PX �	#BY�
CJ�RX �
#BY-�
, �b �c�#a�C` �` �#B#-�,KTX�DY$�
e#x-�,KQXKSX�DY!Y$�e#x-�
,�CUX�C�aB�
+Y�C�%B�	%B�
%B�# �%PX�C`�%B�� �#a�	*!#�a �#a�	*!�C`�%B�%a�	*!Y�	CG�
CG`��b �Ec�Eb`�#D�C�>�C`B-�,�ETX�#B `�a�

BB�`�
+�m+"Y-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-�,�	+-�,�+�ETX�#B `�a�

BB�`�
+�m+"Y-�,�+-�,�+-�,�+-�,�+-�,�+-�,�+-� ,�+-�!,�+-�",�+-�#,�	+-�$, <�`-�%, `�
` C#�`C�%a�`�$*!-�&,�%+�%*-�',  G  �Ec�Eb`#a8# �UX G  �Ec�Eb`#a8!Y-�(,�ETX��'*�0"Y-�),�+�ETX��'*�0"Y-�*, 5�`-�+,�Ec�Eb�+�Ec�Eb�+��D>#8�**-�,, < G �Ec�Eb`�Ca8-�-,.<-�., < G �Ec�Eb`�Ca�Cc8-�/,�% . G�#B�%I��G#G#a Xb!Y�#B�.*-�0,��%�%G#G#a�E+e�.#  <�8-�1,��%�% .G#G#a �#B�E+ �`PX �@QX�  �&YBB# �C �#G#G#a#F`�C��b` �+ ��a �C`d#�CadPX�Ca�C`Y�%��ba#  �&#Fa8#�CF�%�CG#G#a` �C��b`# �+#�C`�+�%a�%��b�&a �%`d#�%`dPX!#!Y#  �&#Fa8Y-�2,�   �& .G#G#a#<8-�3,� �#B   F#G�+#a8-�4,��%�%G#G#a�TX. <#!�%�%G#G#a �%�%G#G#a�%�%I�%a�Ec# Xb!Yc�Eb`#.#  <�8#!Y-�5,� �C .G#G#a `� `f��b#  <�8-�6,# .F�%FRX <Y.�&+-�7,# .F�%FPX <Y.�&+-�8,# .F�%FRX <Y# .F�%FPX <Y.�&+-�9,�0+# .F�%FRX <Y.�&+-�:,�1+�  <�#B�8# .F�%FRX <Y.�&+�C.�&+-�;,��%�& .G#G#a�E+# < .#8�&+-�<,�%B��%�% .G#G#a �#B�E+ �`PX �@QX�  �&YBB# G�C��b` �+ ��a �C`d#�CadPX�Ca�C`Y�%��ba�%Fa8# <#8!  F#G�+#a8!Y�&+-�=,�0+.�&+-�>,�1+!#  <�#B#8�&+�C.�&+-�?,� G�#B�.�,*-�@,� G�#B�.�,*-�A,��-*-�B,�/*-�C,�E# . F�#a8�&+-�D,�#B�C+-�E,�<+-�F,�<+-�G,�<+-�H,�<+-�I,�=+-�J,�=+-�K,�=+-�L,�=+-�M,�9+-�N,�9+-�O,�9+-�P,�9+-�Q,�;+-�R,�;+-�S,�;+-�T,�;+-�U,�>+-�V,�>+-�W,�>+-�X,�>+-�Y,�:+-�Z,�:+-�[,�:+-�\,�:+-�],�2+.�&+-�^,�2+�6+-�_,�2+�7+-�`,��2+�8+-�a,�3+.�&+-�b,�3+�6+-�c,�3+�7+-�d,�3+�8+-�e,�4+.�&+-�f,�4+�6+-�g,�4+�7+-�h,�4+�8+-�i,�5+.�&+-�j,�5+�6+-�k,�5+�7+-�l,�5+�8+-�m,+�e�$Px�0-K�KRX��Y�c �#D�#p�E  �(`f �UX�%a�Ec#b�#D�*�*�*Y�(	ERD�*�D�$�QX�@�X�D�&�QX��X�DYYYY������DPK}$[��I���[gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Regular.ttfnu�[����pBASEe]���FDSIG�GDEF�����GPOS���\GSUB�]dJOS/2���x`cmapspB3fglyf��M�Q.head��:�6hhea3�4$hmtx���Bloca'`ӄA�BmaxpTaX nameܝ���post+����9	�K�4_<���
��sK�?�:$��X�?�? �*eX��XK�X^2#	 �8ADBO@ ����`��� X> cAWr�5O_Qb�HR0f0dC*O+
6&AQ]P<DgH]Z7jJ:]<]<�GEM3@1G                       ������cAAAAAWWWWrrrrrrrrsrrrrrrrrr555555555OOOO
____________Qbbb|���7�
�HHHRRRRRRRR000000000000000000000000$$!dddddddCCCCCCCCN******OOOOOOOOOOOOOOOOOOOOOOO+



&&&&&&&&AAAAAAe;UpDYQQQQQQQQQQQQQQIQQQQQQQQ]PPPPP6<<<<DDDDDDDDDDDDDDDDDDHHHHHHHH��]]']ZZZZZZZZZZZZ7jjjjJJJJJJJ#:::]]]]]]]]��<<<<<<<<<<<<5<<<<<<<<<<<<<�f����@GGGGGGGGXgEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM311111111GGGGGG<]]7]��P^]]=P<<?<sE[>=7<<N3<M]]]ZV8JJJO�**:��]`<!,???��ccG886E2M319GG;0GYGRT<R<<<<<<<<<<<<<<9<<<<<<<<<<<<<<<<<<ccccccccccccccZcZc8cccccccc-��cc c�+rAO0_b+HRF0OfK*&6,&$_(&9]0A[t]HQd8T/\@]<BO,85"Z]O,%9[]QQ@OO"QOd>[�D����	�������	������������������� cc�r>NNfHO0OfA*/6OA(&7b.,rr�BC__Q��'fN/K0&�<>fOA&&6A[_ ��r;N00//QKh�*D>ddn@]<]]PB1 @^X::#F}=,7DD�PGZZ7��:nd1g)<F�H>n!]P33@X]JQDEd<<11<<Uccc*GaE9'8MFDCGaGaE9'8NFDCGaGaE9'8MFDCGa���� ��my����^f�f���R`UUUPP������u���u�u�<<>�f�z�bxcccT[H�]W^t�b�b�b�b�bp��11Wh���U�����������������������������������������������������������������������F���������4����������������=:UM5:q1`N.*m*T=`l-77*E0SUUfU�UUxkUUUoULLUU`U�����TL�	�>+& FOF4t!!`QVg!!��U<J>WII!>>>>>>**��D3���M				������-<��`1�������������������������5�����	��{�����������������������kj���������#��������������	�����o�����{�?�f�������������5Y����������������������������!!������������������������������������������������������������KK�������������������������������������������,����
,,M49cS-����$�,$
��	����Rkl���������mnopqrstuv�������	

������ !"#$%&'()*+,-./012345����:=R^���
*)+-KJLNipoqsr������VS����������M�����T������&(u�����W�����o69�������������hU������l8_7a]��~������U�������������/9@Z`z~�������������7C\ghnv{~������������������ *,14=E_auz~���������������/_cu��������������CIMPRX[���!+;IScgo���������    " & 0 3 5 : ? D I q y  � � � � � � � � � � � � �!!!! !"!&!.!^!�!�!�!�""""""""")"+"7"H"a"e###!%�%�%�%�%�%�%�%�%�%�&&&<&@&B&`&c&f&k''R'd'�..%������ 0:A[a{�������������7CP^hjox}������������������#,.49@_atz~���������������0br��������������CGMORV[��� $2>RXfl~��������      & / 2 5 9 < D G p t } � � � � � � � � � � � � �!!!! !"!&!.!P!�!�!�!�""""""""")"+"7"H"`"d###%%�%�%�%�%�%�%�%�%�&&&:&@&B&`&c&e&j''R'd'�.."������=������oY���
�����������������x�p�o�%$#$	��;�:�.������������������������������-�i��o�d�c�j�$�~�|�y���������������z�z��������T�i�p�l�G�%����s������޺�ޚޙ�r�m�cݹ�j�q�վջ%y%l������������������������"",028>HNPZ\^bfprxzz||xz�����������������������������������������Rkl��������������������������o�VSQT����&���������������(�mno�6789:=MR]^_a~������������������
)*+-JKLN�iopqrs���������;<	@
S T!V#U"W$[(b.c/d1e0`,p<q=r>s?xC}I�M�O�T�Q�U��V�WZ�[�]�\�b�a�f�j�hn���t��u����������������������������������������������Ww����?�P�v����������Ot@�wo;�g>N�����������������������������2:?A��������H4;@I��	
 "-./02467�C#JE��v�wxy|~�z}�������������������JKLMNOPQRS	T
UVW
XYZ[\]^_`abcd*,-358<=QX%Y&Z'n:uAzEyD{G|H�X�Y�^�_�`�c�d�e�k�l�m������������������������������������F�ABCDEFGHIJKLf2g3h4i5j6k7l8m9�R�S�x�y�z�{�|�}�~����������������������������������������������������������������l��������1��6gY]Uebck�x}~pqrstuvwyz{|����������������������������������������������������������$�  !!�""�##�$$R%%k&&l''�()�**�++�,,�--�..�//�09m:;�<<�==�>>�??�@@�AZ[[�\\�]]�^^�__�``�az{{�||�}}�~~���o�����V��S��Q��T��������������&��������������������������������������������(�����m�����6��=��M��R��]��a��~�������������������������������������
������)��-��J��N�����i��o���������������������;<	@
S T		!

V#U

"W$[(b.c/d1e0`,p<q=  r!!>""s##?$$x%%C&&}''I((�))M**�++O,,�--T..�//Q00�11U2233�44�55V66�77W88Z99�::[;;�<<]==�>>\??�@@bAA�BBaCC�DDfEE�FFjGG�HHhIInJJ�KK�LL�MMtNN�OOPP�QQuRR�SS�TT�UU�VV�WW�XX�YY�ZZ�[[�\\�]]�^^�__�``�aa�bb�cc�dd�ee�ff�gg�hh�ii�jj�kk�ll�mm�nn�oo�pp�qq�rr�ss�tt�uu�vv�ww�xx�yy�zz�{{�||�}}�~~������\�����W��w����������������?�������P�����v��������������������������������O����t��@�����w��o��;�����g��>����N������������77�CCPPP�QQ�RX�Y\�^g�hh�jj�kn�ov�x{�}~����������������������������0��2��:��?��A�����������������������������������������H��4��;��@��I��	
		

 " $#&-''2((4)*6,,8.1944=9=>@@�AABBCCC#DDJEEE__FaaGtu�zz�~~���������v�����w��{��|��~�����^��o��z��}������������������������������������������������/�0_bb�ccJrrssKttuuL����M����N����O����P����Q����R����S��	��T��
��U����V����W��
��X����Y����Z��[����\����]����^����_����`����a����b����c����dCC)GG*HI,MM/OO3PP5RR7VV8WX<[[>��+��.��BQX

%Y&Z'n:  u!!A$$z%%E&&y''D(({))G**|++H22�33X44�55Y66�77^88�99_::�;;`>>�??c@@�AAdBB�CCeDD�EEkFF�GGlHH�IImRR�SS�XX�YY�ZZ�[[�\\�]]�^^�__�``�aa�bb�cc�ff�gg�ll�mm�nn�oo�~~����������������������������������������������F��������A����B����C����D����E����F����G����H����I����J����K����L����f��2��g��3��h��4��i��5��j��6��k��7��l��8��m��9�����R�����S�����x�����y�����z�����{�����|�����}�����~���������������������������������������������������������������������������������������������������������������������������������������������  p  �  �  �  �  �  �  �  �  �  �  �   !� " "� & &� / / 0 0l 2 3� 5 5� 9 :� < <� = =� > ?� D Dh G G� H H� I I� p p� q q1 t y� } ~�  6 � �� � � � �F � �X � �g � �Y � �Z � �\ � �] � �U � �d � �^ � �` � �e � �b � �f!!�!!�!!k!!�! ! �!"!"�!&!&�!.!.�!P!Px!Q!R}!S!Zp![!^y!�!�!�!��!�!��!�!��!�!��!�!��""�""�""�""�""�""�""�""i""�""�""�""�")")�"+"+�"7"7�"H"H�"`"`�"a"a�"d"e�##�##�##�# #!�%%�s%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��%�%��&&�&&�&:&;�&<&<�&@&@�&B&B�&`&`�&c&c�&e&e�&f&f�&j&k�''�'R'R�'d'd�'�'��..�.".%����������������������**M�����'>St����<x���4q���Bq���g�����*V���Ac���$/:EP[fq|��			!	,	7	B	M	[	f	q	|	�	�	�	�	�


"
-
8
C
N
Y
d
o
z
�
�
�
�
�
�
�
�
�:EP[fq|�����������?JU`lw���������
#
.
9
D
O
Z
e
p
{
�
�
�
�
�
�
�
�
�
�(3>IT_ju�������'2=K�������	;FQ\gr����������)4?JUp{���������"-8CNY�����������'2=HS^it����Hj����������Ze�������
 +6D����
#.9u��������	mx������������
 +6BNYdp{���������	.9DOZs~��������$/:EP[f���������>IT_ju�������[f�������
 +6ALWb������
<GR]hs~�������    & Z e p { � � � � � � � � � � � �!!!!!,!7!B!M!X!c!�!�""6"y"�"�#+#^#�#�$$]$�$�%	%%F%�%�%�&&?&�&�''E'�'�'�(!()(4(I(T(n(z(�(�)))N)�)�)�*)*P*�*�*�++7+g+�+�+�+�,N,z,�,�,�-(-a-�-�-�..2.[.�.�/+/o/�/�0	060c0�0�0�0�1111"1-181C1N1�1�1�1�1�1�1�1�2222!2,2:2�2�2�2�2�2�2�2�2�2�2�33
33#3.393D3O3Z3e3p3{3�3�3�3�44H4Z4e4q4|4�4�4�4�4�4�5585@5H5W5w55�5�5�5�5�5�5�5�66!636;6S6[6c6�6�6�6�7%7B7`7}7�7�7�7�88c8�8�9$9d9�9�9�::O:v:�:�;%;Q;�;�;�<<D<~<�<�==P=�=�=�>(>3>>>I>T>_>j>u>�>�>�>�>�??D?\?�?�?�?�?�?�?�?�?�?�@@@@#@+@3@;@C@K@S@[@c@k@s@{@�@�@�@�@�@�AA3ATA�A�A�A�A�BB6B>B�B�B�B�CCGCOCWC_CgCoCwCC�C�C�C�DD4DPDtD�D�D�EEDELETE�E�E�E�E�E�E�F$FNFqF|F�F�F�F�GG/GAGYG�G�HHDHaH�H�H�H�II<IDIOIZIbImIuI�I�I�I�I�I�I�J(J7J`JhJ�J�KKK8K_K�K�K�K�K�K�K�K�LBLJLaL�L�L�L�L�MMEMsM�M�M�M�M�N!N)N1N9NAN}N�N�N�N�N�N�O	OO<ONOeO�O�PP8PRP�P�P�P�Q Q(Q3Q;QFQNQYQaQlQwQQ�Q�Q�Q�Q�Q�RRRkR�SSSBS�S�S�TT3T�T�T�UUCUZU�U�U�VV!V<VDV�V�V�V�WW@W~W�W�XX1X�X�X�Y	YY?YKYWY�Y�Y�ZZ>ZOZZZzZ�Z�Z�Z�Z�Z�Z�[[[[%[-[5[A[M[Y[a[j[�[�[�[�[�[�\\\.\D\U\k\�\�\�\�\�\�\�]]!]2]s]�]�]�]�]�^^)^O^�^�^�^�_L_�_�`/`m`|`�`�`�`�`�`�`�aaama�bb2b�b�c#cScqc}c�c�c�c�c�dddd#d,d5d>dGdPdYdbdkd�d�d�ee!eMe�e�e�f#f?f\frf�f�f�f�g$g<gjg�g�g�h7hRhmh�h�h�h�h�h�h�h�h�h�h�h�iiii i(i0i8ipi�i�i�j0jSj�j�j�k#k<kZk�k�k�l	l;lZl�l�l�l�m mLmzm�m�nnLn~n�n�oo@o�o�o�o�o�o�ppVp�p�qq>qyq�rr\r�r�ssWs�s�ttDtzt�t�t�uuu!u)u9u�u�u�u�u�u�vvv&v6vFvVvfvvv�v�v�v�v�ww w-wFwsw|w�w�w�w�w�w�xx$xDxlxwx�x�x�x�yy<yLyWygyoy�y�zzz>zFzNzqz�z�z�z�{{Y{�{�{�{�{�||3|N|h|�|�|�|�}}$}H}d}�}�}�}�}�}�~~~-~>~U~f~}~�~�~�5m�����e�z���'�����@���(�h����;�\�y���������Ą���*�2�:�B�J�Y�a�i�q������������������dž����������Ɇ׆��%�K�X�e�m�u�����Ї���A�f�����ʈ���A�V�k��������̉��(�B�b�j�z�������͊݊��
���(�B�]�z�����݋���
���(�O�h�x�����Ќ،��	�$�P�|���Վ�.�r���Ɏ��-�G�a�{�������C�k�����ّ�>�{���ܒ��+�N�q�������0�j�j�j�j�j�w���������͓��!�>�]�{���������͔ݔ����.�=�M�]�m�|�������Ε����1�D�Y�n���������і���!�7�L�_�r�������×ח���0�H�`�y�����Řߘ���+�C�\�t�������řٙ���*�C�X�m�������Țݚ��#�<�[�s�����›ٛ���)�H�j�����Ҝ��"�2�C�g�t�����������ÝН����&�2�?�L�Y�f�s�������������Ξ۞����(���ͦۦ����'�8�I�W�m�~�~�~�����ŧ��)�L�T�a�t����>�	3!%!''#7'377#>��I46u���1B�Ba��l:�ggP��^ww��� 8�	3'&&'#3#'#��! ��^�X>�?odd7m99m�Z��p��c#�"332#32654&##32654&##c�Ce98;HP�nvYTIML]jT][Vj� F:1ONDa_|675,��;C=5A��*�"&&546632&&#"3267_Q�LL�U;\/B)?]44]?-H/'cQ�kj�R0 5!AvRRyB&#3-2W)�332#'32654&##W�����SIqooqI�����D�||�r�3!!!!!r�����L�F�G�G��	3!!!!�������F�F��5���"&&546632&&#"3275#53QR�IK�UAX/?/=\3iaI)��eQ�kj�R35"AvR|�'�E��-O	�33!3#!OTTT������p5��_��353#5!#3_�����GFF��GQ����"&'73265!5!7j"4K&GA��f)^583,+KQrF�A=e<bD�3333#bT_��^�q���I��iX����33!�RE���GH�33373#4667##'#Hf\ ]fP%^<\&���jj�pH WU����UW ��R�333&&53#'#R\�?	P\�?	��d�1k4T�p��2h3��0��(�"&&546632'2654&#",Jr@@rJJr@@rJK[[KK[[R�lj�PP�jl�RI�~|��|~�f�332##32654&##f�Im==nHsiVSTUi�$UHEZ,��HAFG70�]+�&%2654&#""&'&&5466323267,K[[KK[[Wn_u@rJJr@p\J3	%9��|��|���XB��j�PP�j��+*Cd)�332##32654&##d�Cg;PC�_�umMQQMm�#QDL]����Y?@A4C���-"&'732654&&''.546632&&#"1Hz,2%c8DK5"^!A,7a?>h$, N39F#6\)A'8h5,:%-:.#*)
*B02O--$6!4,((-A14U2*.�!#5!#��JFF��O��	�"&&53326653-@e9T$?'(>%Q9c4r^��fDQ$$QD��h^r4+-�
3336673��XjiU����:e::e:b�p
N�%333>7733>73#&&'#nd^0

@P>
	.Z`h@
@��d-/!!/,��,/!!/,��o::��6"�33366773#'&&'#6ķ\\
ZX��\c

bS=�,,������33�&2�!53366773�Xc$&_V����%L((L&�Z�A�	35!5!!An�����t2F2��GQ���'"&&54667.#"'6632#'#'2675�-K-G�}8//Y" %s@daC(d)S)hw1A!>+7I,
!7"%8.m[��B/B&"�!1 )%]���!"&'##336632'2654&#"@#Q#BR!W+bh>dG@T@I I&#G#6��^"(�qSv>EgZPc#&�P���"&&546632&&#"3267ZLxFJ|I;X)A&8U0/T8-K%(c<rPRr<*5/U87T/$5$(<����!"&5466323'53#'#'275&&#"_t?e9,FRDSHA!? *E)L�yOs>!Z��8@-EI�/S8WcD���"!&&"&&546632!3267><^6N2IwFFqAiu��iL,G!$]�MHKJ�C<sQOr=}g
RT6"gB�3#5754632&&#"3#�`dHD3 A:���>)Yl>	D;,C�]H� 6�0<L"&5475&&54675&&5466323##"&'3322654&#"2654&##"&'(jvP#5W3)�~2U5+50m^[ByX/AA/.BB9Ub78_%"Q�G@>.&1@+5N+C44K(		4>-N/�?43??34?��<%#)&-]�3336632#4&#"]R&W9VRR4<+D+��s)6d`��#EC,,����Z��&U
0��7�'��&�
0j>�3333#'jR^��\�s����q�J���"&5#53327�MS��5++0"8YV�C��50=:.�!33366326632#4#"#4&#":B2*G3*39R4!L%�@"*T'-MI��VU%&��V*+%&��]�3336632#4&#"]D&X9VRR4<+D+�S)6d`��#EC,,��<���"&&546632'2654&#",@mCCm@@mCCm@FUUFFUU<rPRr<<rRPr<DgSThhTSg]�3�!336632#"&'#2654&#"]D"Y-bg>d;"O �AU@I I&#F��> *�qRv>!\�gZPc#&�<�3��!57##"&546632373275&&#"�Q-^t?e9,H"B�HA!? *E)LͱZ+�yOs>" 6�MI�/S8Wc��3336632&&#"�D&pC/$7e,�s;D	G	?L��G���("&'732654&&'&&54632&&#"6G|,&*fC>=AB^`fd8h$("R/>2CJQW!2`-6$-
C7;O%5*"*6%'B(E��"�"&&55#57733#3267�GR#��D��5F#8!I3Z<�>��C�AD
<M����"&5332673#'#�WRS3=*E(RC%Xd`.��EC+/Q�U+63%�
!336673�Sp

pO���%G##G%�P�3336677336673#'&'#rjR:<R:	:Lhj86��"A##A"��"A##A"��3]]3�@�37'3366773#'&&'#@��[M

IW��ZU!P��k+,i�p.+p1�/'�"'732677336673�$
3@�Sw
jN�6O�
A;-$�� J##I!
��0L-G�	35!5!!GM�����W,wC,��C�� 8c&��� 8c&��� 8F&�� 8I&�� 80&�� 8&�� 8J&�� 8p& 8�
+"&54773'&&'#3#'#2654&#",*7%�%O%8m�! ��^�X>�?��2(0i2*.!(2��dd7m99m�Z��p����� 8M& �_�	%3'&&'#"&54667#'##33267��! 
+<(>�?U�^�&5 	.odd7m99m�y-.3'
����p>%
+�� �)8�&-�� 8h&�� 8x&T�� 8x&V�� 8�&X�� 8�&Z�� �)8F&&-�� 8�&\�� 8�&^�� 8�&`�� 8�&b�� �)8J&&-��O�3#!#3#3!5#�.�+�?�����IywL6j�R�F�G�G������Oc&M�x����O&Mx)�!*35#5732#'32654&##3#532654&##iOO�Ce98;HP�nvjT][Vj��YTIML]�8� F:1ONDa_F;C=5V>�675,��c�V#�&<��A�*�&32��A��*c&�.��A��*F&.��A��*M&.��A��*;&.��W)M&��W�))�&-���W�V)�&<���W�)�&3���)��7�3&&546632#'32654&'�9:'%(3;8oR���zRVZcSP70::XEAd:����D��z���rc&���rc&���rF&��rM&��r0&��r&��rJ&��r;&s�)� "&5467!!!!!!#3267�,;5!�������K0"
-�-.-F�F�G�G#2
+��r�)�&-!��rh&��rI&��r*x&T��rx&V��r�&X��r�&Z��r�)F&&-!��r�&f��5��c&���5��F&��5��J&��5��;&��5��&0��5��M&��5��&��5��I&5��M$1&&#"3275#53#"&&546632&54632&&#"
/?/=\3iaI)��e@R�IK�U'>1L5"AvR|�'�E��-Q�kj�R/:?'��O	F&	��O	0&	��O�)	�&	-���	�&	3�N��O�	�&	9
N�3#5753!533##!!5!OEETTEET�����8nnnn>�5��}g��_�c&
���_�c&
���_�F&
��_�I&
��_�0&
��_�&
��_�;&
��_�M&
_���"&5467#53#5!#3#32677+<.�������&$"	-�-.*DGFF��G<
+��_�h&
��_�)��&
-��_�J&
��Q���F&��b�D�&0&��b�)D�&-&��b�VD�&<&��|c&
�����&
|�����&
01����)�&
-1��7�)&
&�-1����V�&
<1
�
35'737!�_|R��E�45Bd��q5��G����&

����Hc&���H;&��H�)�&-��Rc&�
��Rc&�
��RM&
��RI&
��R��&0��R;&
��R�)�&-��R�V�&<��0��(c&���0��(c&���0��(F&��0��(I&��0��(0&��0��(&��0��(l&��0��(J&��0��(M&0�(�!-"&5467.54663232672654&#">,;+Mk6@rJJr@^W.."
-/K[[KK[[�-.(<\�^i�QQ�i��%@
+��|��|����0�)(�&-��0��(h&��0��(x&T��0��(x&V��0��(�&X��0��(�&Z��0�)(F&&-0��2-'"&&546632654'7'2654&#",Jr@@rJ>1NA80,2@rJK[[KK[[R�lj�PF*3?+�]l�RI�~|��|~���0��2c&����0��2c&����0��2h&���0��2I&����0�)2-&�-��0��(�&f$��0�'77&&5466327#"'&#"2654'$C@rJWA48@@rJYA6*�,>K[�K[�+b+tFj�P9M$^*rGl�R<PkW?l2��v�~Y<��6��$��0c&��!O�!"&5463!#3#3%3#"(|��|”���UUU����F�G�GD�}}���d)c&���d)M&��d);&��d�)�&0��d�))�&-��d�))&&-��d�V)�&<��C��c&���C��F&��C��M&��C���&h��C��&3��C��&0
��C��;&��C�)�&-
N��9�&"&'732654&&''7&&#"#4632�1T(6#.5JE|?+@OTziSgycL+P'"5>/ 7+
6�)([_�c�n�TF�bD3Q/��*.M&��*�.�&3��*�.�&0��*�).�&-��*�V.�&<*.�!#5735#5!#3#�Z4�؎�2:�FF�>����O��	c&���O��	c&���O��	F&��O��	I&��O��	0&��O��	&��O��	J&��O��	p&��O��	l&��O��	M&O�	�%"&5467&&533266533267>,;/]nTN;(?%QFD;-"
-�-.+>~���ffS$QD��hjs>
+��O��	�&P��O��	�&I��O��	�&R��O��	�&L��O�)	�&-��O��	h&O��v9!"&&533266536654'7-@e9T$?'(>%!)+A?.9c4r^��fDQ$$QD�$*):8��^r4��O��vc&����O��vc&����O��vh&���O��vI&���O�)v9&�-��+�)-�&-��
Nc&���
Nc&���
NF&��
N0&��&2c&���&2c&���&2F&��&20&��&2;&��&�)2�&-��&2h&��&2I&��Ac&���AM&��A;&��AF&��A�)�&-
��A�V�&<
)�3#5732#'32654&##3#WKK�����SIpoopI��:8����D�||��>e!�3332##532654&##eTvIl==mHvkVTUUk�n%THEZ,��AFG6;��&� "&&5447!&&#"'6632'267!,Im;�VP(C(W:No<?qJEY��ST�fv� 9 )R�ii�THsoqqU��%�!"&'7326654&&#"#36632z*	+%B-%RSQ W0>b8)LK/uhcq06(��M%4@�{~�Ep�[��33"&'732653pS�%
&S?��p�B4,��mJXD*�333"&5463233DL�!--!!//EL����G-''++''-�����G��Y�[9c&'��n����Q��	&���Q��	&���Q���&��Q���&��Q���&��Q���&��Q���&	��Q���&Q��K
*5A"&5477"&&54667.#"'6632#'#'26752654&#"@4:/�#I%):~-K-G�}8//Y" %s@daC(d)S)hw1A^!!!!98(6a2#3"(8��!>+7I,
!7"%8.m[��B/B&"�!1 )%("!!"��Q���&Q�%�.9"&5467'##"&&54667.#"'663232672675�+<8'(d4-K-G�}8//Y" %s@da6/%	/�)S)hw1A�./-D=/!>+7I,
!7"%8.m[��=	'&"�!1 )%��Q�)�&-��Q���&��Q��+&S��I��&U��Q��&W��Q��#&Y��Q�)�&&-��Q��@&[��Q��@&]��Q��P&_��Q��"&a��Q�)�&&	-��U�3@"3&"&'#"&5467&&#"'66326632!3267%3267&55�%A�H3K#P,7Iu�0&=O+,>K(3B ��@90A�q)!>CL�DQ��C.)).G=J\G98 /55/=e<
LY
8�#'#"6A
"/����U	&�����U�&���)"&'###57533#36632'2654&#"@#Q#BIIR��!W+bh>dG@T@I I&#G#62;VV@C["(�lPq<EbUL]#&���]�V�&<
��P��&2.��P��	&�.��P���&.��P���&.��P���&
.6��k0!&"&5466323'53#'#'275&&#"3�Zn;`7)BO@NA@ :(B'HUJ�yOs>"Z��8@.EI�/S8Wc�Q���<�)��&-��<�V��&<��<���&2�<��D�)"&5466323'5#53533#'#'275&&#"_t?e9,F��RIIDSHA!?*F)LuLn<"Z9@VV:��@-EI�-O4R^��D��	& ���D��	& ���D���& ��D���& ��D���& ��D���& ��D���& 	D��3"!&&"&5467#"&&546632!32673267><^6N*-:+! IwFFqAiu��iL,G!3=$
/�MHKJ�n./(?	<rPPs=}g
RT6$5/	'��D���& 
��D�)�& -��D���& ��D���& ��D��'& S��D��& U��D��& W��D��#& Y��D�)�& &-��D��K& e��H� 6	&"���H� 6�&"��H� 6�&"	��H� 6�&"
��H� 6�&"1��H� 6�&"��H� 6�&"��H� 6�&"�����&#�W<����l&#�W<��]�)�&#-��]�V�&#<��'��&#2�Z��]��&#9�3#57533#36632#4&#"]IIR��&W9VRR4<+D+2:VV@@s)6d`��EC,,����Z�	&U�0��Z�	&U�0��Z��&U0��Z	�&U0��Z��&U0��Z��&U0��Z��&U0��Z���&M
0��Z��&U0��Z�)��&$-0��Z��&U	0Z��!#5!<�4�C���7�'��&�0��j�>�&&0#��j�)>�&&-#��j�V>�&&<#j>�337%3#'jR^��\�s������n���J���&'��<��J��0&'���J��&'0U��J�)�&'-U��J�)T&'&�<-U��J�V�&'<UJ���"&55'75#537327�MSl�����5++0"8YV�@6P�C��T6d�50=��#��{�&'�

���:.	&(���:.�&(
��:�).�&(-��]	&)���]	&)���]�&)��]�&)��]��&)0
��]�&)
��]�)�&)-
��]�V�&)<
��V�&3336632#4&#"'667#"&54632�D#P5OLS.4'='��/6(* (2L�L%3a]��)B@)(��^0P4(#+@9Kv��<��	&*���<��	&*���<���&*��<���&*��<���&*��<���&*��<���&*��<���&*<��"."&5467.54663232672654&#"D+:*Bi<Cm@@mC+L4(-$	/7FUUFFUU�./'=?pKRr<<rRC]>@
'gTThhTTg��<�)�&*-��<���&*��<��&*S��5��&*U��<��&*W��<��#&*Y��<�)�&*&-��<���&*	��<��K&*e<��/�)"&&5466326654&'7'2654&#",@mCCm@7.)-@?,(0Cm@FUUFFUU<rPRr<	/+*:A gDPr<DgSThhTSg��<��/	&����<��/	&����<��/�&���<��/�&����<�)/�&�-<��(7&#"'7&&5466327#"'72654'��&6FU%.5Cm@O=4.5Cm@O=�FU�/�<.!j��*> T4Rr<+=*>V5Pr<+iS?,����<��	&����U�772654&#""3&"&&5466326632#3267#"&'�,44,1333'6���1N-.N1.BH.0@ �A1)=#1NB8hSShgUSgyKJ��C<rPRr<:>>:=e<
SR
88==8���	&-�.��f��&-0�����&-.����&-
.����)�&--�����)�&-&.-���@�V�&-<���G��	&.���G���&.��G���&.��G��-&.g��G��&.2��G��&.0	��G���&.
��G�)�&.-	X��4�3"&'732654.54>54&#"#4632�*F !4*-)<<)$-)7?Rk^5I&$)<;)(I:/#*"2*"2+0 %1LJ�\q)C(%6+*$%:/*C(gB�3#5754632&&#"�`dHD3 A:�>)Yl>	D;����E��"0&/���E�"�&/2Y��E�"�&/0O��E�)"�&/-O��E�V"�&/<O��E��"C&/���E��"� "&&55#575#57733#3#3267�GR#����D����5F#8!I3Z<:�>��C�@ AD
<��M���	&0����M���	&0����M����&0���M����&0���M����&0���M����&0���M����&0	���M����&0���M����&0���M����&0�M��&"&5467'##"&53326733267�+<8'%X8WRS3=*E(R6/%	/�./+AU+6d`.��EC+/Q�:	'��M���&0O���M���L&0H���M���H&0Q���M���L&0K���M�)��&0-��M����&0�M��V�!"&53326736654&'7#'#�WRS3=*E($2@:#C%Xd`.��EC+/Q*1+:;�7U+6��M��V	&�����M��V	&�����M��V�&����M��V�&����M�)V�&�-��3�)%�&1-��P	&2���P	&2���P�&2��P�&2��1�/'	&4���1�/'	&4���1�/'�&4��1�/'�&4��1�/'�&4
��1�-'�&4-���1�/'�&4��1�/'�&4��G	&5���G�&5��G�&5
��G�&5��G�)�&5-��G�V�&5<<���17326544'&&#""&&546632&&''7&&'77�,J-PM#R'PS�?mB;gB/T
:,��: &&I!�v?M:k�2K)oW
/&\��9iHDe8*&Bd'N4B 4)F2==�wPyD]�3�"336632#"&'#2654&#"]R"U+bi?d:$L �@VAI H&#F���W"(�qRv>#\�gZPc#&�]�I� "&'732654&#"#336632�(&4<+D+RD&X9VR?�	?7/1EC,,���S)6d`��N[7�'��"&'73265#5!�&H9I2�4%X�=
F>�C�<\5]�'�+33"&54632"&'732653"&54632pR(##""�$


%R<##""�J    ��>3,��JX#    ����l�/"&5#533267"&54632"&5#533267�@Ck�$#(!--!!//�?Cl�$#YV�C��50>-''++''-��YV�C��50>P�'N	33"&'732653'7'7pR�$


%R<��+�:�+�:��>3,��JX)�8�)�8^���%"&53366323267'>54&#"$dbD(d3.K-��8F0Y" %s�hw1A**R)m[*B . >,RU2I%8.�	 1 )%%#]��� "&'##336632'2654&#"@$P#BDZ1bg>dH@UAI$J #E#6�@-�qSv>EfXSc%$�]���+"&'##4632&#"36632'2654&#"A$Q#BY[0!!62!W+bh>dG?UAH J%#G#6Sh?>8z"(�oRt=EeXOa#&�=���"&'7326654&&#"'66328e'%M-8S/.O4+G*_BFtGFw($5$/T78U/5*<rRPr<P���
1%"32654&'667&&546632&&#"6632#"'�H"&.78��C,4JyF>Z(E*5U1/g/:>YYC:�,' � < eBRr<(30V9,G486-4H9<�P_� -"&57##"&5466323'533267%275&&#"">;R-^s?d9,ES

 ��F@!@)D(L�I@d+�yOs>"Z��#)/?�I�/S8Wc<��b� -"&5466323'54632&&#"#'#'275&&#"
^s>d9+F@B	!DSFA!@ (D(K�yOs>!Z8DM?2*��@-EI�/S8Wc?��� "!&&"&'73267!&&546632">U6
WP:]$"H+Kj��:iE@kAGv�JKHM�C"6TR	
Ef9>rPOr=<���� "&546632373#'#'275&&#"^t>f:+H"BDTHA!? *E)L�yOs>" 6�@-EI�/S8Wc��s&�E��� "&&5467!&&#"'6632'267!)If5}^J+I!%]:Jp?@mEAW��P<kE
	OP6"=qPQs<BOMMO��m�(2"&&'%&&#"'663273267#"&'74&'326�=T-1D+&8 K1DdI+
6
52[?�@,9D8_:�818GD 9"
+	(6!Gq@�h<5][���)"&54675&&546632&&#"33#"3267>e~B0)06_==a'!#K2@D�5CLRRL1S$$.iMF48
8$,:"6%&J@%)+- 6(��>���!=���+"&&546632'2654&##532654&#"GLxFIwD6W2+),Ar_=BG6#4:;13Q0c9qSUr::-$:
;4FLB-*('@("&%.U=\_7�'4�"&'732655#575#5!3#�&H9I2���4��%X�=
F>�<�C�B�<\5<�(cu*7"&'732677##"&5466323'4632&#"275&&#"/`)%O%FHQ-^s?e9+F@C
!xaEA!@)D(L�:F:a)�sLo="0AQ?2*�Zf!I� .P4R`<�'�� -"&'732677##"&&546632373275&&#"/b(&P%FLS->_5>e;+J BwdFC!@ )E*M�;G:a);nLLo=#6�[k"I�.P4R`N���!"&&546632&&#"32675#53SHwFIzGAU)?/2U3/R4!9��a;rRPr=*4"-T=;U-p;�(3� %�%"&5467336673'2654&'#.7=#�TqpP�#<8�B4#G4���"7""7"
�N4G#4B9";""="<���#/"&5467&&#"'66326632&#"'2654&',UeH92-)K('M(-28IdV29</.=:ZO8f0"!<-**-<!"0f8OZD:-,Q((Q,-:M�3��57#"&5332673�'X9VRR4<,C+Rͮr(7d`.��EC-+S�M]�34632&#"36632#4&#"]Y[0!!62&W9VRR4<+D+Sh?>8�(7da��EB+,��]�I�+"&'732654&#"#4632&#"36632�((4<+D+RY[0" 62&W9VR?�	?7/*EB+,��Sh?>8�(7da��N[��]��'��Z4�&O
0V�353#5!#3V�����C`CC��C��8���&Q
0�3��##73753���c�U�rR����i��M��J���&'=���J���	)354&#""&55#"&546325#533#327�!#&
	MSTH3'(
����5++0"8n)&��YV�<.&0�C��@�50=J�I�"&5#533267�MR��4+,!:�YV�C�*5/
>O�';�#33!6#"&'7326654&#"'!OR��E_1=a7K` )J7&=%F>"����,�2Y7Fb304%%C->F,�]��33!�R.�]C*���!#'##"'#"&53326733267B2*G3*39R4!L$�@"*T'-MI\��U&%`��*+&%`*�3�"57##"'#"&533267332673�1*G3*39R4!L$Rͬd%*T'-MI\��U&%`��*+&%`�M:�I.�-"&'732654#"#4&#"#3366326632�# 4!L%RB2*G3*39:�?0(rU%&��V*+%&���@"*T'-MI��FQ���I� "&'73265336632#4&#"8
D&W7VQR49+C*8�?/)S)6d`��#GA,,��HS]�Im� "&54&#"#33663232670C84:+B+RD&V7VR

 �SH?GA,,���S)6d`��)/?`��333&&553#&&'#`O�$NO�%��;/['�:/['�<���"&&546632"!&&267!,@nBBn@AmBBmA?U>
V?DW��X9rSUq::qUSr9�OGGO��XOOX!��K�%"&&5466323#3#3#'267&&#"�8]88]8-񾙙�.##5JJ:rSTq:D�@�DC_\_a[,�3,�#5.54667534&'66:b<<b:P:b<<b:�K99KXK99K��<oNNn<��<nNNo<��UataTTa��a?����#'##"&'73267�D&oD.$7f+�s:E	G	?L?����"&'732673#'#�.$7f+RD&o	G	?L��8s:E?�I�"&55##"&'7326733267�I=K1+%IR&.�SKu08	G	5B1�50	>��I�"&&5336632&&#"3267MFR#D&pC/$7e,5F#8!H�3Z<�s;D	G	?L��AD
<��354632&&#"��uQ700S3�y�G(UD�c!�332#'#532654&##c�5S0H3�]���7==7��?6?Gľ��++,$c!�732654&#73##33��7==7]�3H0S5�S��%+++��G?5@�G�I�7"&'3267#"&55732654&&'&&54632&&#"6-T$$
	$C;&*fC>=AB^`fd8h$("R/>2CJQW!2`5'0=SOU6$-
C7;O%5*"*6%'B(8�'�"&'732654632&&#"�(>/3 LZ$4&7&F�=
B77Xd=B7��Xc8�'�#"&'732655#5754632&&#"3#�(>/3 ��LZ$4&7&��F�=
B7�:�Xd=B7�@�Xc6�d�23#5#5354&#"'66�GR#��D��4G"9!I�2[<�>��C�AD
<E�I"�"&&5#57733#3267�FR#��D��5F#9!P�3Z<�>��C�nAD
<��J� "&55#57533533##'#'32675#�LH``R�RffD"Nt,0&:"�a]L:����@�L(0�C='+p2��&�'"&&546675#53326654&'53#,Kk8+j�+8#D33E"8+�j+8j?f82N;C5$bI-N//N-Ib$5C;N28f?M���"&&53326654&#"'6632)?c:SR:2E$+-


GU7l/dM��XK;f@JM@diX�O3%�
#&&'##X�Sp

pO��%H""H%���P�#&&'##'&&'##33677�jR:
<R:	:Lhj86�#A""B"��#A""A#����3]]3�1'�3>32&&#"#&&'#1�4L4"
	0=�Sw
j*0M-A<.?�
 J#"J!��9!�!53366773�YU#!TXˤB�:!!9 ����G�Il�"&55!5!5!!3267/D8��F�����I

 �QB$,wC,��_)/?G��F�&%"2232654&'667#5!5!3632##�+%&�>�D�����,N%9`'3NN-�*2$��
5,wC,���1)6H9;�'�!"&&'7326654&#"'!5!632 8U?(!U@-J,WP $!�����esDm�,50&E.AI
.C,�kWGd4�'j�6C"&5466323'53!6232#"&'732654&#"'7##'#'2675&&#"�CX.K+-L
�0C#-L/1C'- )3-,!��;5'"+5.�xNs?]��,�5Y6Ea3"4JK?E4��]:+E*!�gSVd��:� 0"&&55#57733632&&#"'2654.547#HVe+IL
E�&%A *#'99'l�\G':;'}C,S=�>��0#(?2CN@-%%/"$4)�A:0�'[�3"&'73265#3267#"&5#5773354632&&#"a#
	
"�'
-L=HKE�AL
(<�>3,��-1>ZH
>��PIW?4,��JXG��3>54&#"'6632�BR'NG9O,!gL?g=1U77%@D+=H1 5%;-YB:UF$��Y�!.546632&&#"7V0=f?Mg +O9FO'TA$FU:BY-;%5 1H=+D@%��G�35#5736654&#"'66323#�LfS[KF:P,!iN>e<(B&��:/f<=H25$<-YB/L=?�R�!5#573.546632&&#"3#�LL&B(;e?Nh",P:FL\R���:=L/BY-<$52H=<f/?�T�3�#575#5733#3#����P�����g:l:F��>l>��<���%"&54632'26654&#"7"&54632,m��mn��n.I+]EE]+I.%%%%��������D;�o����o�;�$##$R�[� "&'73265#'##33&&53�#	 �?	P\�?	P9�B5+��2h3����d�1k4T�mKW��<�������<���	&���<���	&���<����&��<����&��<����&��<����&��<����&	��<����&<���K
!.:"&5477"&546632373#'#'275&&#"2654&#"04:(�$J&):V^t>f:+H"BDTHA!? *E)LS!!!!98(3e2#3"(8���yOs>" 6�@-EI�/S8Wc%"!!"��<����&��<�)��&-��<����&��<��&S��9���&U��<��&W��<���#&Y��<�)��&&-��<���@&[��<���@&]��<���P&_��<���"&a��<�)��&&	-<��%2"&5467'##"&5466323733267275&&#"�*94$T.^t>f:+H"B4*!	-�HA!? *E)L�./+B@-�yOs>" 6�;
'I�/S8Wc��<�'�����<�'�	&6�
��<�'��&6
��<�'��&6	
��<�'��&6
��<�'��&61
��<�'��&6
��<�'��&6
��<�'��&6
��c4�&@
c4�	353#533cŭ��C`C�]C��c4	&@���c4	&@���c4�&@��c4�&@��c4�&@��c4�&@��c4�&@��c�4�&N
��c4�&@��c�)4�&?-��c4�&@	��c4�&P
Z���"&5467##5!3267a,<3#�4,,$
/�./*B�C�;	'c�4�"&5467#53#533#3267Y+</�ŭ���)'$
/�./)BC`C�]C<	'Z4�
!5#575#5!3#<���4���8�C�>�c4�3535#575#533#3cŴ������C�:�C�@�C8���&3267&&#"&&'#"&546325#5!z)%(0: (M5FKB? B!�4
/i�/!B-,8�C�)?)c4�	353#533cŭ��CBC�{C��c4�&R�"<��c40&R���c�4�&R0��c�)4�&R-��c�)4T&R&"<-��c�V4�&R<c4�353'75#5373c�l������C@6P�C��T6d��C��-{�&R�

����\�	#53#533353#533"&54632qk�fil�m��####CBC�{CCBC�{C$"!!"��c4�&R=%�c4�
#354&#"535#"&546325#533#3!"#!x�JA1'$�����f
*��C�4%!-
�C��/�C�� 8���c#���3!!�����F��+-�353%!&&'#+�`�YKa!!2^��2G%5o99o5��r���A���O	�	0��(�!"&&546632'26654&#"'53,Jr@@rJJr@@rJ2K)[KK[)K1�T�ii�QQ�ii�TICyRz��zRyC�HH��_��
��bD�+-�
33#&&'#+�a�Xji��pc:e::e:����H���R�F�35!5!5!F�6���GG5GGFF��0��(�O	�3!#!O�T����pJ����f�K�355!!!K�������_21F���G��*.���&2���>�5&&5467534&'66k��kLk��k�SIIS�THHTX�wu�WW�uw�XbVm�hTTh�um��6"�,,�!5&&55336553drP�T�Prd�us���
Z��
���su�&2�'3535.5466323#56654&&#"&y3!=rMNq=!2y�1A&J66J&A1DPjB\�RR�\BjPD=/�gGqAAqGg�/=$8�	3'&&'#3#'#'����^�X;�;.9$Oodd7c;;c�Z��p���
#
�3!#3#3'�@����?9$O�F�G�G�
#
�3333##'�L�LL��9$O����p5���
#
��353#5!#3'�vv@ww�X9$OGFF��G�
#
��_�0���(�"&&54632'2654&#"'\;\4rYZrrZ8CC87CC�9$OQ�l������I��������H
#
(Z�!53366773'e�MI

KJ���9$O���)J&&L'�Z��
#
��&20�0�#'3535&&5466323#56654&#"'�c)/2[=>[1/)c�')?::?)'�9$OD<�^X�OO�X^�<D=;�_n��n_�;=�
#
9��?� 0"&5466323733267#"&5#'26677.#"�Wm=d92[R

 +4@O">*
,3%C*DwTv>8Gs@��-?	03cE)E)[68,V@U]]�M �346632#"&'72654&#"'>54&#"],ZD1W664J[8Z3.]&�8OFG
5@@,8B#S��Bg<&L;6RdMA\0!)=v>�JC:N?1> 88XYX�W.0�M�6654.'736673�#<K)R#D96N
R 0E0�!0(:���2+��M_�e>no{K+c*A���$1"&&54667.54632&&#"'32654&',<lC5Y6(A'QU5vFIl),()J11N.8i�,H)KML5U_5cE;[?4<%,AA./CU;Eh:�/F&YI>U"a[���,"&54675&&546632&#"3267&"#"3267@j{A.+,6_=6b)!IU=EDI%�MO-R+#5cND57
:"-: 74&&!(DP(/"7(t�H�('6654&&'.54>7""5!#�B945]86Yo9HPKy;q[6(K3PM� $
/]O<yqa%CC#brv69C"
+2G]�M�>54&#"#4&'336632�,2-G-RK)Y;NE�P��FD>*=��aB&_83a]�H���"&54632"!&&2667!,jzzjjzzj=Q&R=)@(��'A���������|��|��4yffy4Q��
�"&5#533267�QH��0.,<YVCR�H41

=d��A� 34&'33>7.'nR(o}>	/c1MV(]FC#!%aH > �FrNN
8*3nh,"V_0&-6]8��)�''&&#"'6632##�Y�9-
+ 3G5�Y��G?
D
,ZG���T�E'�&33266733267#"&'##"&'TR1611S&'P,!7����CE.,Bb�W>.:42 2JB(/�!&&'73>73tCR&H9
"=,S
7Q5��]4��H?��AT��W\�H�:'6654&&'.546675&&5467"5!#"3267&&#"�B858`9,I*0?)%+-��7Q)@!!%-R4.P2SG� $
)L@0O7H4)?CC>:#6H"B/05	*2F@���"&&546632'2654&#",@kAAk@@kAAk@FQQFFQQ<rPRr<<rRPr<DgSThhTSg��=�""&54>5#'665#57!#327�:0�ReE�\-?;FX[(f�kk�b?D)_ZF0?]�M�!46632#"&'726654&#"]=g>kr=a6*Q#�'@&AJ&B(#I��Un7�tRv>(AjA�.W<Pc(Q=|+<��<�!"&&54663!&&''2654&&#"">i?Bk=+I*/5<e??P!>.?TS:pPUn5FcDKk9D`R1S4Y[TbB���"&5#57!#3267xA4�F��0GD$>CN�E"@	O���!"&54654&'332654&'7&bqP&=$@TP;ihi'N'B&8 &e*1<bg3l?;w=Wy?,�M,n#5.54667534&'66:b<<b:P:b<<b:�K99KXK99K��<oNNn<<nNNo<��UataTTa��a8�A0�
'7373#�S��R��W��P��V:�������5�M)n$5&&554&'3336654&'7hbP=@P?ELod��}d�B&8 ?6GU7��ba8eB>qA|��"��6�."&546732654&'332654&&'7#"&'#�BZ5&H)*.#(U($,"I&1UE#;8xyM�9!=qMLR7C=''=F4TW2MH):{Uzz'**'Z�L�%'6654&&'.546632&&#"�B./9hAHvC=U*<)2P./Q2:?�!,	4aONm9'5,O59D%+"M]�� �)5".546632'2654&#"6654&#"I(TE+-[E/V6<5P\:a?;MEHH? 15��g@*;@7ZBBh;%M;6TiO>Z1HL:;Q#6E'�!6W@88YO���
+7&&""&54&'332667.546632�@pVZH5E�\hMH3)@'k�S#6Z6|:g >.�x>��c_'/3"J>0|qBR&7R-����H��,�M,n�%�M3�)6654&#"5.546754632S>N'&#O:f?=.@+/P>S@JR>e;+=y>fWS`;�۪9nQK�604dDQ\�k_�qPs?+V*��9��?&��[��&�$��]�M&���Q��
&����Q��
�&����@��&���O��&����O���&����"��6&���Q��
&�J���O��&�J�d�EA�&34&'33>7'667.'nR(o}>	/c1MV(!I_'FFB#!%aH > �FrNN
8*3nh,4d#)X+"U_0&-6]>�M� %2654&#"5.546632,HQQHHQQ#8\5AlAAlA4Y86gUUggUUg�?kIRr<<rRHj@	.G5[�L�"'6654&&'.546633&"#"�A.1:g@FyK�N*Ue-P4:?�!,

4\JSj4FVW3A%+"M��M�!!!!�y��
����C�;Q�XD�M
�'6654&''%&''%&&'7�P
?zD"E�K"*uJ3t�T�
0\. ?:#Ez?8>&E}Gx+=F��2`���+�����T}��`���}���h�73Q#��\��W�3773�#6\����	/���c�')9$O�
#
���4�J���7���E�����"&53327Z3,S

;61P�H>���<|�#���<|�#���>p�!���.M���	/����/�m���/�j���/�l���/�i���2�'n���2�'k��A�����3�M���4�J���L�&N��x�'6654&'7	
!*)BI3�&	/.,#-��w�.5467S3IA	)*!�-#,./	��_�'7(2L������c������'6654'7'7�B6@9�2K�&5/0.,5������&&5467'7"9A5	Cl2K�5,.0/5&������'6654'7'7�B6@9�7L�&5/0.,5�����&&54677"9A5	C9L2�5,.0/5������#"&&#"'66323267'6654&'7]* !* m %;?:P####�!
'!����
#&&54677"&&#"'66323267G$:@:% * !* �!'
x####�� 8�c#�
3!!32#'32654&##c���~Fk>l�tTSUTr�F�$OBg`F9C?5��c#�����`�DB�	!#'53>7>7!3#5!�"�	�	

9I	I�x%Tk8ZZ���2-cWAimF��2Ѽ���r�W�/3'&&#"'66323337>32&&#"####�+
	,%/5L5/#*	
+�Zn<L<n_�5P34���43P5���5��5��>���+"&'7326654&##532654&#"'6632-Hu2/,Y:,G+^VJ6XNK8.P-$k=^u3/9K@l.39+&:)?<@:745"8#-YO4OSD?X/N
�33373#467#NP	?�\P	?����4k1���pW3h2��d��N
E&�fD�3337>32&&#"##fSkX-/Q�\�k���25N$$���5����	�"&'732667667!##:
":T�+6MKNj�n�pJZ�Zdk(��H���O	�	��0��(���O	�m��f���A��*���*.�/��,�"&'7326773373� '
�Yz2/pU�LK#��܁�$��=F��>�5&&5467534&'66p||pLq{{q�MOOM�MOOM_�qo}]]}oq�_XR`l]PP]��`��6"�O�DM�33!33#5OSSG	D���I��2ѼA�!#"&&55332673�<(Km:RWP':T&)_P��S@%�p(0�333333(L�L�L���I��I�p&�DP�3333333#5&J�J�J@	B���I��I��2Ѽ=�
3#5!32#'32654&##ɶ
7Ci=zh>3MPTP,JF��'QAiaD>F<<7!�
3332#'32654&##37L$byvd%KMMMRL���WbiaD>F>:����pb!�3332#'32654&##bTyHm=�nzoSWVVm���&QBiaD>F>:.���"&'73267!5!&&#"'6632Ch)."O3Vh��	dV+K.h=S|EG}2-4"(||Gho!6 1N�oo�M,��4�%2654&#""&'##336632|/33/-55-O_JTTK^LTdd=~��ww��~I������핊������!##&&54663335#"�y�`�AT;hC��nnLRR��[ODQ#�pY�4A@?��rc]��r0a��@�#"&'7326654&#"##5!#6632�$
,ND2*T���7>a80KC;4JC
��JFF�+\JNY%���c&��B��*�"&&546632&&#"!!3267`S�IK�T<^.D)Xl��l]/J.'cM�oo�N1 6"ohG||("4-2��C�����_��
��_�0���Q��������>� )"&'732667667332###%32654&###
		�Wml[_\
!0A?@C
MFIl�j��WbiaJY�h\b%P>F>:'=�333332###732654&##'L�L#WliYp��?@AA�����Wbia5��D=G@87�5!#6632#54&#"#��7bmRED2*SJFF�Zf��C8
��J��fDc&����N
c&����/��,E&�K�D
�33!3##5KTT�E���I�p��'�3#53533#32#'32654&##���S��BHm=~nH>SQSX7�D}}D�"L?i]B;E>50��(�"&&546632"!&&267!,Jr@@rJKq@@qKFYNYFJ[��[P�mm�NN�mm�Pbqjjq��zz�&W�33366776632&&#"��Yj@:4
����:e::e:�IB	M%%���<3!73!�9F	�����<�
3#57!!3#�PP��Ҩ�,:&F�>���Dg�43'&&#"'66323337>32&&#"3#5####�+
	,%/5L5/#*	
+o-	;'n<L<n_�5P34���43P5���2Ѽ5��5��>�D�-5&'7326654&##532654&#"'6632uU/,Y:,G+^VJ6XNK8.P-$k=^u3/9K3X8��	V9+&:)?<@:745"8#-YO4OSD8R2�f�DL�3337>32&&#"3#5##fSkX-/Q�5	B�k���25N$$���2Ѽ5��X�3#5!37>32&#"##ͺBK'*
	
I�Q�@JF��44M#%���5��O�DM�33!33#5#!OTSG	@Q�������2Ѽ5��A�D*� 5.546632&&#"32679Hp@L�U;\/B)?]44]?-H/ N2��
U�cj�R0 5!AvRRyB&#3%/���&2�&2�!5#57333667733#�Y&�Xc$&_V���:v�%L((L&��>�6�D4�333667733#5#'&&'#6ķ\\
ZX��<A%c

bS=�,,�����2Ѽ�33�A�DF�!#"&&553326733#5�;(Jl9RVO&8TG	F&)_P��S@%��2Ѽ[�336632#54&#"[S9&Kk9RTP%7���)^O��S>����_��
��WE&��� 8E&�����O�M��rE&���;��&����N
&���0��(0&���0��(���/��,&���/��,l&���Q���K���.32654&#""&54>7>76632�NMAGGB%P%�p|,RrG#6!;W;!!Z/<[39dd{gRKY&2	�ӥ�y�T)	K

	.WI()6fGMr>h� 332#32654&##32654##h�Ti.'+?qY��B97>��B?���9B(4
65HC%""��&(L��3!!�y���C�]*�T-�73#'53>77!3#5!����		FG	G���HZ`���4#SN�]4�����D��� R�,3'&&#""'6632353376632&"#"#'##5#�"	'<*7P7*;' "�Vi?P?i])M*<p��p<*M)]������>���&"&'732654&##53254#"'6632;k4$*X-LRMITH��4L&"*c@\vW2=�*6"-*)&@KJ7"@CK!
75FLd��3336673#5467#dP%
�LP
%���']/;��'^/<��d��&"
n0�3337>32&#"#'#nR�;&*

5�[����l*-M)a�������"&'73267667!##J

 
	GS�L16O�O��C�C�@�#33366773#54667##'&&'#@d\

ZdN
X>\��::��;>=��=>;�]��33353#5#]R�RR�������<���*]��3!##]�R����]��]�3�+��P���B�!#5!#���CC�]��1�/'�4 �38�#.:57#"&546632'536632#"&'27&#"32654&#"'CS*E''P.DJ*E()� #%.+�),#/!!!͛J
�yOs>J��L�qRv>J�#0!gTVcgZPc"����@�3^�T8�33333#5^R�RGG�]��]4��X��!5#"&553326753�*&dmREK+R�Sazz=4�:�333333:RzLzR�]��]��:�TR�3333333#5:RvLvR<A�]��]��]4��#'�3#5332#'3254&##ɦ�JWkkWJBy;>B�C�HPQJBY.*F�
3332#'3254&##3FKDQbbQD<r8:<6K�HPQJBY.*��}�
3332#'3254&##}SqYllYqh}=@h�HPQJBY.*=���"&'73267#53&&#"'66329d&#N.Sg��cH0F' \BGuGEw&"3SS@KJ2(7rWUq8,��4�%2654&#""&'##336632~,66,.880HcQRRR	aFOee8\^_]]_^\Dqp���ki~��~7��!5##7&&546633'35#"���]�3H0T4�⏏7==���G?6?���$,++��D��	)��D���-�'�*"&'7326654&#"##57533#36632N#8!CD%@*RIIR��$S4^d5L�>5�|�q,,��49VV>Br(6��q�X%���	&�1P���"&&546632&&#"!!3267ZLyEJ|I<W'E*Jg��gT.M"Q8qUVr8&4KJ@RT!4H��G���.��Z��$��Z��N��7�'��%����,�'"&'73267667332###%32654&##%
	 �QddQ_`

B=77=L07M�R�HPQJ�C�GLJN+..*:(�3335332##5#732654&##:P�PS``Sk��;77;��ųHPQJ��B+./)���I��n0	&$���d�	&"���1�/'�&-
g�T��3333##'gR�R�	F�]����)!n3#53533#32#'3254&##™�R��LVkkVLCz<>C�CttC�HPQJBY.*��<����F0�33366776632&#"��Ta	
051	p��#I##H$�HDJ$%�����3!73#�B���]H�
35#575!!3#�JJy�٬��8�C�>��T_�13'&&#""'6632353376632&"#"3#5#'##5#�"	'<*7P7*;' "b/:!i?P?i])M*<p��p<*M)]�4������>�T�)'&&'732654&##53254#"'6632�1[,$*X-LRMITH��4L&"*c@\vW2=eT	�� $6"-*)&@KJ7"@CK!
75=K�n�T=�3337>32&#"3#5#'#nR�;&*

5�<?!����l*-M)a�4����!F�3#53376632&#"#'#ʩ�_*:%

'�O�_�C�lA'M+e���]�T8�333533#5#5#]R�RGGJ����]4����P�T�'.546632&&#"3267/@c9J|I;X)A&8U0/T8-K%FX	��	@jHRr<*5/U87T/$5>�3�3%�5336673�Tn

nP�����%J""J%
��3�3%�5#5733366733#�N9�Tn

nP�����8���%J""J%
�X>�@�T0�37'33667733#5#'&&'#@��[M

IW��LG$U!P��k+,i�4��p.+pX�T+�!5#"&5533267533#5�(&blRDI)RGG�R^~~:3�]4����]�#��R�& 
��J���'��Q���&
����U���D���&
��E������d��&"��<���&(��<������1�/'�&-��1�/'�&-��<������<����&e
U���&3"&&5467.54667>7'32654&''7`;iW"?(9iH(-6FT%(@$-E(6c�&>#BJ=.NZ4aB\n-12/		K
	#BT;Dj;�-C&]I<N"b��c4�?��c4�E��c4�R��^�)5=A"&''26533.55432"#&&'#"&54632'254#"53#Wu	DXu	�.DD..BB.224"�A�nQ?dZ/�cA���P?dY0�b OSSMMSSO7kjjk�66*��A�3?6654&#""&&54667&&5466326673&''3267&&'�*=!"'.:X2#8 $A+=B*@# S-)L4$<5AH$W�J4;/V"+:A++6��/R5+C7)O#,F)H:*C82_'(`8@w4.D7")�7B*e5=G���#"&54632'2654&#"7"&54632,j{{jkzzkCUUCCUUC%%%%��������B���}}����$##$a~353#566733a��8M=�D�5��DE
�35>54&#"'66326633Il�MDG-M/+dC`pJ�W=�1`�t57F- /,5gU<{�OG9���*"&'732654&#52654&#"'6632Rq#* Z=AXj~q`G;-P ,(g=<_8M;+G,?h7#6.@59F?E2/6$4#-&H4:J	+B,8R,'!~	735667#5!533#��"A��?Xcc��=/�4�7��tB�8��
~!"&'7326654&#"'!!6632Ul%) T@-J+VG(8",i��5%=c;Cl6!6-$B,BJ3G�+XEEa2M���)"32654&"&&54>32&&#"6632@&W&	UF9NFAEo@,K`4;X.B$3W7'^0Yn;aH(.\aM?AF��D�f`�U''34wg&-cb=\4F~3>7!5!�1M7���?S0[��CG3H���^D���*7"&&546675&&546632654&#"2654&&'.Hi9(?"(93Y9^h9(#9!6fPB?5C-MGM5[8.?X-P2,@.J21J)`J-O+<./N-h:F/B8/&2#��?1-3"B05EC���)3267&&#""&'732667#"&546632�EC&V'
SG9Np:X .B%3V7']1Xn;a8FnA,K`�AF(-]aM��'44xf&,cb=\4D�g`�U'G���"&54632"6654&267,j{{jkzzkC(�UC 8�	U��������W;��E)�~��[F)��a~
353'733a�t*�@�D�V0���DG��J#"&54632'2654&#"7"&54632,j{{jkzzkCUUCCUUC%%%%��������Bsywnnwys�$##$a>353#566733a��8M=�D�5�DE
J356654&#"'66326633I��DG-M/+dC`p��>�1n�@:H- /,5iXL�\G9��J*"&'732654&#52654&#"'6632Rq#* Z=AXj~q`G;-P ,(g=<_8M;+G,?hV7#6-A7;E@E4/8$4#-'I4:L	+C-:S-'��!>	735667#5!533#��!@��?Xcc��=1�.�7��cC�8��
>!"&'7326654&#"'!!6632Ul%) T@-J+VG(8",i��5%=c;ClV6"5,$C.DJ7G�

*YGFb4��N���sF��>>7!5!�1M7���?S0J\���DG3I���`��D���uC��J)3267&&#""&'732667#"&546632�EC&V'UH9Np:X .B%2V7']1Xn;a8FnA,K`zCJ(.aeN��'33xg%-gd>^4D�gc�W(G��J"&54632"654&27,j{{jkzzk2�UC;'�U����������7Syp�(+K4S|sa>
353'733a�n*�@�D�R/��DG���#"&54632'2654&#"7"&54632,j{{jkzzkCUUCCUUC%%%%��������B���������# "" #a�353#566733a��8M=�D�4��DE
�35>54&#"'66326633Im�MDG-M/+dC`pJ�W>�1`�v5>N, .,5p\<{�PG9���*"&'732654&#52654&#"'6632Rq#* Z=AXj~q`G;-P ,(g=<_8M;+G,?h7#6.B9;G?H418$4#,'J5<M	-D-:T-'!�	735667#5!533#��#A��?Xcc��>0�%�7��fB�8��
�!"&'7326654&#"'!!6632Ul%) T@-J+VG(8",i��5%=c;Cl6!90%D.DL<F�+ZFGc4M���)"32654&"&&54>32&&#"6632@&W'
UF9NFAEo@,K`4;X.B$3W7&_0Yn;aQ(.aePADG��F�ic�V(&36|j',ed>_5F�3>7!5!�1M8���@S0^���EF2J���aD���*7"&&546675&&546632654&#"2654&&'.Hi9(?"(93Y9^h8)#9!6fPB?5C-MGM5[8/>X/R4-B/M42K*aL/S+>/1P/q<I2C:0'5%��A4.5#D27HC���)3267&&#""&'732667#"&546632�EC&V'	TG9Np:X .B%3V7']1Xn;a8FnA,K`�CH(-bfQ��'46|i%-ed?_4F�jb�W(G���"&54632"654&267,j{{jkzzkD(�UC!8�U��������j?��<X���� "i<W��a�
353'733a�n*�@�D�R/���D��}�"&54632,"//""///%&//&%/�+��'667#"&54632�>>
 .0 ,.]�4P;&%%'E;Xy����}'�f����+�'�f� ��8�#"&546323"&546323"&54632f))((�))))�))))*!"))"!**!"))"!**!"))"!*��u�%'3"&54632
P
++++�X^^���*$#))#$*�Hu�73"&54632
8
(++++�^X��^)$#**#$)m����%7&>54&#"'6632"&54632�13$77&A1"\:Sg$52++++�+@3/1)8-#.UG);10:'�*$#))#$*y�<��%"&54>'33267"&546323Sg$52I13$77&A1"\3++++�UG);10:'+@3/1)7-#.)$#**#$)�`c�''3n`�nn����`��&���s�^|�"&5467632+'3MC.6'*^@8Kx"0O4( "+�^��'667#"&54632�/6(* (2L^0P4(#+@9Kv��^^��&���s��f^��&���s����{�����f��{'������s���^�&&54632#"'cCL2( *' 7.^#vK9@+#(4P�4��%'57^��'4�P�#���4��7'7'7�''�4"��#�P��R4��&���s��`4�&���s��U+i���U+i���U+i�P� 75!P��HH�X 55!X�HHP� 75!P��HH���X ����}���s��%"&&546632,'D**D'(C**Cs%B,,B%%B,,B%�g��%"&&546632'2654&#",/I))I//I))I//;;/.<<g*H--H**H--H*0>11>>11>����7!��
���u��7!'35#�$���u"��-�����753����%��uu��753%3'u�����muF��+��e��73�%��eD���O��7377'�G��)��Oo��Kml�c��%5!+�B�c%��uN��%5!'7#+�n�m�NF��T��e��%%5%3���%e����uO��%%5%3'5���G+�O����K�l�s��7!'2654&#"�(�;MM;:NNs&��M:;LL;:M�X455!X�pp<�t��5!<�GG<���5!5!<� �>>z==>Aw5!>�A66�f��
"&'73267,�e_�mm�_d��B>):55:)>B�P��
&&5467�hyyh-d``d�Q䑑�Q*U�~~�Uz�P��
'6654&'7�-e__e-hyy�*U�~~�U*Q䑑��h��!#3��Ә\/�/b�hw�53#5!b���/�/��x�h��/"&54654&&#5>54&54633#"33�^[	?;;?	[^=436'44'634�8M7X2#4$/^4M8/(!+[/13		313T. )/c�h��/5326654&54675&&54654&&##532"#c336&44&633=^Z	?;;?	Z^�/) .T313		31/[+!(/8M4^/$4#2X7M8c�`��3cHJ���f���Q�3J��c�`��3���JH�f���Q�33JJJ���H0��HTo,7'7'7737'�*l��	0	��l*xo�F.7��7.F������5'37'	��F��P;G��G������75'75'37'7'	����F����P�G��G��G��G�[����3C"&'732654.5467&&54632&&#"6654.'7\ 2=*)-)@H@)3(LK2Q(9#*&)@I@)2)Z�)@H  #(@H %@&!-)%)>.,A(4N"5%%*>.0<';N�!+ &"", )H����
%"&&5466333>Fp@>jC+6Q�.`KO])�R��� ������&ȕ�k��]����'��z�y��;�%?K7&>54&#"'6632"&546327&>54&#"'6632"&54632f"&$%')D*>L'&++++�"&$%')D*>L'&++++�*C746!!.1!"K9*B76>'�*$#))#$*�*C746!!.1!"K9*B76>'�*$#))#$*W��;�%+7%&>54&#"'6632"&54632%'3"&54632~"&$%')D*>L'&++++��
P
++++�*C746!!.1!"K9*B76>'�*$#))#$*�X^^���*$#))#$*���%+77&>54&#"'6632"&546327'3"&54632f"&$%')D*>L'&++++�
P
++++�*C746!!.1!"K9*B76>'�*$#))#$*�X^^���*$#))#$*^����)7''3>54&#"'6632"&54632�F0"?=)F0#f:;W1%55 ))))��LLk,6'-< ,&.)F./B0,4$�)""))"")t�<��)%#773267#"&&54>'72#"&546ZF0"?=)F0#e;:X1%55 ))**��LLk-6'-< ,&.)G-/B0,4$�)""))"")���3!#���/�xbw�!#5!5��/�I��~33�B�V�[/b��w~533b�BV/��,��h��!#3%3#�<����++�\/�//�b�h��53#5!'3#b��<_++�/�/��/����!#���/��bw�#5!5�r/�_�h�33�BӘ���/b�hw533b�B�/�R��:�;"&&546632'26654&&#"7"&&546632&&#"3267,L{GG{LMzGGzMCe88eCCe88eK-I,.L+#2".86,&5R�ff�PP�ff�R*I�WX�HH�XW�I^/Y>:U.'K;BM*��:�*3"&&546632'26654&&#"'32##532654&##,L{GG{LMzGGzMCe88eCCe88e(r9OP81''*+&'R�ff�PP�ff�R*I�WX�HH�XW�Ijk8=BAs�&)$ p?��-6"&&546632'26654&&#"'532#'#532654&##,4U33U44U33U4*C''C**C((CL /..#)?2Y:;X22X;:Y2%(I//I))I//I(=�$SFFf��nD�#53#333773#57##'#[`�`�G-,G7G*Hn66�6rPPr�ʉi��i�bD�&:"&'73254&''&&54632&&#"733773#57##'#}!6!%1.%9/2#. :tG-,G7G*Hb%''#'1'	
'##86rPPr�ʉi��i�1�p"{,5"&&546632#'##"&546754&&#"3267275UO�PN�REZ,2G'5L�A5<g@=iA-C'R88gY+�Z����V?kD��:*F=MN0P0J�ok�O-"@~7.#(1��"�,5"&&546632#'##"&546754&&#"3267'275UO�PO�SDY+2G'5L�@3<iA=iA-C'R88gY+N�os�M7]9��:*F=LO
&?'A�bZ~C-�@~6/#'W�37#7#537#53733733#3##7#��hPWU\5�5PWU\6���g�9�:����:�9���h<��'7'7737'�*\��	0	��\*g<�9.,��*.9����� 75!�L�HH����� ������ �U���	5?7&"#"'7&&'77.54663227&&'#""'74&'2326�9)
2<?8)I'9 $)K03X98!5,%!+O45_?�?-";>�&�-���$9	�(:+/E%��
"0�)?00H)�$,�1�����<������<������<�����<�����<����<����<�����<����<����<���<�^<���<l^<����]�<���g�	<��C��"&54632'2654&#",HWWHHWWH+66++66�ldbllbdl3NONMMNON��O��535#566733�{i)54r�6�)��6��O��'>54&#"'66323�C[/.'1&K+>N+J0��%9P>&, ##)A>%CH-6��C��&"&'732654#52654&#"'6632)3Q*9!$4�;9+%0&D+7P'(+3(C�*"!$!F()"""81#.2&$4��O��53533##5��/��::::I!	�tt.hh��C��"&'732654&#"'73#632+7N*(G'36*% �
 (9QU�*"!:1%(.�8`C@<J��C��%%"32654&"&546632&&#"6324/6)#.,$JX0R2&1%0D,@@D%>9:,$#,�i[Ja/,
HK)E8%<#��O��>7#5!�6)�%18�Dmf87$>nrD��C��%2"&54675&&54632'6654&#"2654&&'+GM-'!#H<>H(*(O-)#"&6).3",�?,&7'.98/"-0%.?�# �'))��C��%73267&&#""&'73267#"&546632�+*.6)#.>%3&0C,@?E%?(JX0Q^#-:;-��
-
GK(E7&<#i\Ia/��".5467X&02:-5&'4�,RZ9T|A>wBAw?�l"'6654&'7.5&&5.92/�?wABw>A|T9ZR��D]��"&54632,���g��'66'#"&54632#5��'&&%-E����="&54632'2654&#",=NN==NN= ..  ..XNNUUNNX2::<66<::�a1!5#56673"R!)2�*����=356654&#"'66323�NS&';$6>G2�$;N! !#52(L-5����=$"&'732654#52654&#"'6632+"D 1#`)((>"/;8 'F'3&&,(7',1��=7573533##5�q.ad9229J��aa*JJ����1"&'732654&#"'73#632-)= -%$��
 2>G'�6F4//;����=
#%"32654&"&54632&&#"66327(#,:OVD,
+3-34A�#&"�RFV[)
;95*+=��13>7#53�* ��*-4RM)5$.SW5����=%0"&54675&&54632'6654&#"2654&',8E( D.2A!%H!,)5"/'5# %%//%!%!%3��
%����=$73267&&#""&'73267#"&54632�#,(-)3-33A2;NV�'#�(

995*,<QGU\���
&&5467U1881.-((-L1oKKp1!-c;:d-��l�
'6654&'7.-((-.277L -d:;c-!1pKKo���]Z"&54632,�gZ'66'#"&54632#5u'&&&-E����]
 ��� aQ ��� �] ����]
 ��� �] ����Q ����] ��� �Q ����] ����] ������ ����l� ���]z ����gz ������)������J������7����#"&5467&&#"'6632#'#'2675
-=kp!)7L(A?5</UH$�1+59	,+G?�&1S%���b"&'##36632'2654&#"G22@5AE)B3(4'.'.)� ׁ8YK7M)5>:3<(�����"&546632&&#"3267ZF_0M-#2 !/=;/)2�YO6L')@54@))���b"&546632'53#'#'275&&#"?L)B'+@56,'&'5.�XP5K)7|�)$5(�>57=����"3&&"&&546632#32678$=�20P//K*HM�F./6�+-/)��(K54L)SD
24
("���i#5754632&#"3#OOAE/-!&)%���0;G/
*#2������*6F%"&5475&&5475&&546323##"'3322654&#"2654&##"&'*FO5
'M5
�RI5?G@>cV(((($5@%#;4�,+("
*6>0
 5:"$)/B!%! (( !%�%
���b36632#54&#"�@8$85@$(�ׁE!A>��)(����g#53"&54632<��%�2�����|g7"&'73265#53"&54632�.!!/ ��=1�
	/+(2��'?$
���b3373#'�@�H}�GkF��ʠ���CT���b"&5#53327}53Q�#�<883�� 
1F�� 3366326632#54&#"#54&#"F21 E5!5/>#!,>#",�A-<$F8��&,/��&,/�����336632#54&#"�57%85@$(�A0!A>��)(�����"&&546632'2654&#",*H,,H*+G,,G++11++11�(K56L''L65K(4@45@@54@��� 336632#"&'72654&#"�46AD)B&.N(4'.*)�$YK7M)7j�>:3<����57#"&546632373'275&&#"v4?L)B'-4�,'&'5.o8XP5K)�:�(�>57=����336632&&#"�6B'#
=�AK',
6(2�����'"&'732654&'.54632&&#"4+L7%(&8 7%G@$?-%"4 9%I�)		#(5(

	$(9���0"&55#57733#3267qH8MP5��#,
1�J=�0dd2�)+/����"&553326753#'#
74@#)@49�A=��('�2!����
3366773zB>>>w�A�00���4���337733773#''#�Y@,082+;WK*,�A�[[��[[����[[�����7'3366773#'&&'#�ofD+&DhoE/
	+���B

B��E

E���"&'7326773366773�
	
&
�@E	<>�<2$@�//���2A����	57#5!3�ս���!�2!�2����
"'7"3&&"&&546632#3267Ip-f4$=�20P//K*HM�F./6�n)x{+-/)��(K54L)SD
24
("����
"'7"3&&"&&546632#3267'"f-`$=�20P//K*HM�F./6�x)�+-/)��(K54L)SD
24
("����2"3&&"&5467#"&&546632#326732678$=�2%*
0P//K*HM�F./.%
 �+-/)�R!*(K54L)SD
24
(/	
����"&54673&&#"'6632'267#*IS�?-/>$G_,G,$7�7�XD11
(YP4L*2./1,���g4632&&#"6632#54&#"�;?#
"8$85@$(�Z;G0*#Q!A>ļ)(�����$%"&54673366773'2654'#-'*rA;;?q)'
�+$0"�&&���"1$+*
"/*
���g5&&546632&&#"2H+G)/D"/ +5<=�� M:*:$(*%)B �����"&546632373#'#'275&&#"?L)B'.456.%(%6/�XP5K)��$5(�>57=����*%"&'732677#"&546632373'275&&#"A4--3?L*C%-5QB,'(&60�,+$8WJ3I(��=C�*�<23;���g	535#533"&54632��r�|��2�2��2�����]�'<�zG53ޜ//��E5!�**=E5!=�**:SA)7'7&5467'76327'#"'72654&#"f,T$S,W0?>1W,T$T,X/?>1o1EE11EES-U1C#;V-Z%%Z-V1D";U-Y&&J<<JJ<<JU���-7732654.546753&&#"#5&&U'&\8;>.HQH.YI<7J,"?22<.HRH.aO<7eq9)1&) ';+?Q��+0-&%)=.@W��,M�(356654&'#57&&54632&&#"3#!N>>ucs_>U0;*AF��$$H2`8
4 >Uc+ /A4< 84GG5#~!5#535#5333667733#3#�����U\!"\R������0A/@�!C##C!���/A0�:��6�1"&'#57&45447#576632&&#"!!!#3267vb�@;;@�j3X1<&I[&���XE+A1%]�u,,v�-!/!bV1		1Ua%",+2q����"5&&5466753&&'667:Yp5\83,@(. 4$H'�@87A!h
{jEe<jg"4��4"gWCX
O
X1���&"&'732677#57376632&&#"3#�*4-
hF)
PT1
 !*��&Ga>PL�;8dh>%;"??�=\4`��"�/5""&7&&5467722327&'667'7&'m
<>�=Ip_
00
+!1:21 N20
S<67;H��R{%�l��k\iq$/�
",%0d[
n��H��N�635665445#573&&'#57&&54632&&#"3#3#!N>>|W^Ms_>U0;*AF���$$H2`8,!.!Uc+ /A4 1!14GG.(~#'+3'5#575#57533533#3##'#73'#'3'#3'#�	;@5KKKKT^sAIIIIT]t�	:�bL�Ja3�����+D+����0D0���J�0DDD*G~3#575323###3&&#327#�]]�<a=LL
}YF�PD;;���3� I<8XT�El;1��s:~!'3'#573373333###'377#377#* �$LE"L;b<G?F p", 4/
�
1����(4������:��(��D�bb��bbm"�)-%"&5466323'5#53533#'#'2675&&#"5!L[2P,'5��GNN:>4-.C9vznb[7P,S"1CC,�S.;�D2=F�11*H~'-23#575#575323#3###4&'#366'3&&#327#�]]]]�MrXNMWtMF�����G3;;k#�t(:(t5?.
.@?��	:
�; ��FT���#5.546753&&#"32675#537Cf:|g<.O1<&W_]S :t�CXndR�`��ec,.!�y{��E��>	d=���:"&5467#573667#5736654&#"'66323#3!3267CZo
	PE.-�F�!8/)6,!N=5Q.a�3��>;-I!&$dXO(+ ,.&4!/%.(G/-1 0)+6) 7%/`��"�"5.546753&&'667JEj;�j5/O13 "71!P2�NGHMncR�a��a`+/��#,&0d�p�

�l
~753267!573&&##5!#3##'lOS`��L�]LO��EJH]J�]�C:<,.&D1H1LX���-��~"'75'75377>54&'7�]s]sT�«�%NB(Ed�++5H+*6ǞQ+[HQ+[�)='
To57!~!5'75'75#5!#77������ˊ����A+KHA+K�@@�@(MH@(L�7!~!#57!#5!�R�����,0�&M11*1~!35#575#5732##!!32654&##�tttt�Bh<=hA^��TMTTMT�,C,6$N>@P&C1�HABC7E~35#57!!3#3#�OO������|4�G�Fx8| <p7'77'7M1�!�!�1 -���-�� <ph�� <ph����=�'
�zM&h
�0��?�'3?K"&54632'2654&#"'%"&54632'2654&#""&54632'2654&#"�4AA44AA4##$$��f4AA44AA4##$$*4AA44AA4##$$�F>=DD=>F*,.-**-.,��:�0F>=DD=>F*,.-)*,.,*F>=DD=>F*,.-)*,.,��?~'�sM&h���<~'�sM&h���U�'
�sM&h�����<~'�sM&h
�����<�'�sM&h
�����<~'�sM&h�����<�'�sM&h�����<�'
�sM&h�����<�'�sM&h�����<~'�sM&h�����<~'�sM&h���<~'�sM&h�����<~'�sM&h�����<�'
�sM&h�����<~'�sM&h�����<~'�sM&h�����<~'�sM&h�S��?~!-5#56673'%5#56673"&54632'2654&#"�R!)2m��fR!)2�4AA44AA4##$$��*
�{�:�<�*
�F>=DD=>F*,.-)*,.,����<�'
�zM&h
�Uh,%5#53533#��B��h�>��>�U+i5!U�+>>f~�7'7'77'�,��,��,��,�~-��-��-��-�U`3"&54632"&54632'5!,������>>���y������U��&�k����UT@'��&���)x0�h%%5%�u��-0�>�O��k0�h75%5%5k-��u0O��O�>U
35!5%5%U��R�҇��>>��J�GI,,IU
35!%5775''5U��R҇���>>�GI,,IG�JU,%5#53533#5!��B�����>��>�>>o��	3#''#o�H�HB11B��~����UAS77#537#5!733#3!pLg�[�
L=Lg�[�LA>�>>�>L��".#"'66323267�/)')5H&/)')5H""4G6""4F6��L�&�k��Uhi%5!5!����h�>��Uhi7!!U���h>�`h�:7546632#54&#"`5\;;\5AL??Lh�Aa55aA��MTTM�Uh,73!UBlh�z>���\�'3%"&'##"&&5463236632%27&&#"2654&#"�7O&)5#$=%U=2DO6-E(W��@(4$+/R,15/#=!>�:=-)F+NY<)5@,M2TfSX1+-)(6=+0?17=2����"&&54632'2654&#",!9#K2"9##9""**"!**�:&;F 9(&:..#%..%#.�h�3Q"�d�������&���X��W�''3!"Q��d���T�E'��L���*73267&&#""&&5466326454&#"'6632�C-AY!F!IIh0S34bC)OKA9& P.asCw�;Fmc*"Y��.W;Bf:&"}p4 #��p�_��b�#"'732654.546632&&#"�	*<9
)

;�>RN7~�7Ag<>UM6~�~8Ah<	�p�#46632&&#"TK<9	)�p�Ag<>UM��bT�"'732653�
*K<�>RN��_Ah<>��G4'736673/�G�t�<�_� -;��  ��m��+-�a��&2�u 8�#33736677#8�^�X>�?� �!��p����9m7dd7mF��35!5!5!5!5!FL�����G�G�F�p��OC	R'��tO��OF��%~
55!!!F�������wx5FF5G���G4��$~!#!4�U��x��
��S��=�".:"&546632&&#"3267'77'7"&54632'2654&#"�;P)B% . 
$1.%%
6v1�!�!�1�=NN==NN= ..  ..AVN4J''@33?'��-���-��XNNUUNNX2::<66<::t����	'6654&#""&''66746323267;C!)O<Z!+T>9Ih\5%+!C�;�F2*C��P[4tePK^�NM<3(��>�1".54>32!"32673!2554'&&#",9cK++Kc99cK+�b6T5_"&(r�
G&(H4\zFFz\44\zF�	<=3<HZ�

���9	5!!!��+���J�		.�D�!��7	'3'
�.		.���*��*�I��F	'7!5!'75*�I��*.�D�.��!��7	737*��.�D�.��*���J�*��`!�	%7%��
?|��6!6��|?
��Q ��	7''%'�06��|?
 06	>��V7��	%%777���06	>7?
60����g7�	7'%j?
60��7|��6/��
?��95!!!!!��+p]�hCC���p		.g6>>6g!��77'3'#'##O.		.g6>>6�*��*o���CC�h]��F'7!5!75'!5!'75*o���CC�h]o*.g6>>6g.��!��7733737*��.g6>>6g.��*o\�iCC���o*����%d�%'7!'57!'7d�-~�T~-��-~�~-��&��&��&��&U��0#'7'73'7.�&��&��&��&9�.~�~-��-~�[~.<�v05!'#'7'73'7<���&��&��&��&�@@Q�.~�~-��-~�[~.Ji+%"&&546632,Af;;fAAf;;fi;f@Ae;;eA@f;>^6%"&&546632'26654&&#",Ek>>kEEk>>kE4R//R44R//R^>kCCk>>kCCk>20T66T00T66T0Wu7!W�u��VIg-7!%!!I�o\��g�:1dIg-	77!%!!I;�3��X��g�1�q7(]!K7b%	,��K��>iX753>��i�>iX753%!>��oF�i�,[>m.H73>�m���>m.H737%%>�,Y��m���M��>UD%5!+���U��>UD%5!'!+������U��h[*mH%%5%3��m��%*mH%%5%3'��/��m��%MA�mqH73Y��m�����mCH%%5%3@��Ym��%Dd0#7!'26654&&#"7"&&546632D��Cf;;fCBg;;gB1N,,N12M,,Md�4;g@Af;;fA@g;1.P34O..O43P.3[%R/%"&&546632'26654&&#"7"&&546632,DqDDqDDqDDqD4Y88Y43Z88Z3%@''@%%@''@[=qNMq==qMNq=20Z@@Z00Z@@Z0:#A,+@$$@+,A#��q�	7!%!!=M4����
v3��=+4���7!667%!&&'73667!=�66)4��Cp#VE+8%= jA�'
v3#=2*��=+^�
M�@&:~?n�a����b�&'73>7�;\8)D$r�N6O�u&��&>�Cw��M2I��M���!"&5466323'6654&'�(=(G."2
D.#A<0N'%5!
0[9'E
)/T�i7J&��Q�!"&546632%#"&546632h(<&D,"z.L-(;%D,"��.L'%5!<��7J%'%5!k*�|7J&	��O�#.5463236632.Zr>T=1JK0>S>ra�yj6bd5CC5db6jy�	O�47"&546327&&5466326632#"&'#!5>7#�;JS:"2'C))C'2";RI<%G/F,�z,F0F�UCFG	-O%8  8%O-	GFCU&1KV((((VK1&��S�#53.��%%om��	O�#%#"&54>73#"&'#!5>7F)7J@qUVp@I8)E/F,�z,F0�4&BF-Q]{XX{]Q-FB&4KV((((VK	'Om+7EMU%"&&546632'26654&&#""&546323"&54632"&'73267'254#"3254#",U�KK�UU�KK�UGl==lGGl==l�fBQ"?,,@
"R�


�

'K�TU�KK�UT�K->oIIo>>oIIo>$##$$##$�E=
'$$'
=E�;;Y'5AM%"&&5466322654&#"32654&#"267'#"&''"&546323"&54632,P{DD{PQzDDz��:DQ
"@..@"Q



�



;F{NOzFFzON{F$$$$$$$$�C>
'&&'
>C�			

						

			��	��%#.5463236632.HSRC)oVBWWBVo)CRSH	/@23CaGbg;JJ;gbGaC32@��'�m$8DPY&&#"3262672654&#4&#""&&54632#32654&#""&'663266726+<

<=cTQ:;zqpz;jEU~E��y�:E3U3#p"		"Y]crWXrbt

.�
��28P6.@GQWKw�F)S��^cPJ
ED2M*:6|

k,(/78.(,L8!��\�#*8F%"&&547&5467&&54>7'267!'66327&&#"66327&&#",j�@[$>/	*0/�
/>$[@�j>K��KZ! !�  "@;_?6;			'O	;6?_;@_9::9�##A77A##A77��'rm%;IW%"&54632'"&5463226654&#""&'&5467663266327&&#"66327&&#",a`hYYh_bDm?�oo�?mDY�"?�mn�?"��  # #�  # #�
		
m*6SMMS6*�9v[zhhz[v9-VS�&%b__b%&�SV%!!A77A!!A77-��+X!*'73546323%37'6654&#"354&#"U((.YPPY.((��,,1##1I�2332F$$�W``W�$��$��)#00#)$�;CC;<���*26654&&#"5#535.5466323#,1N--N11O--O��<^5>mEEm>5]=��+-P34N--N43P-���>e?c<Bi==iB<c?e>���	e�)726654&&#""&&54663275%#7�1N..N11O--O1El??lE%A��;�:>lB-O43O--O34O-9=jBBi=�:��?[Bj=��[}8%2654&#"'7&&'#53667'76675373#'#5&&',;MM;;MM�+X
ll
V+W+@*Y+XllW+X%/@*�M==MM==Mm,W+>)X,X
tt
W,V$0>.%Y,Ztt`����3'377''#��L��(@AA@@AA
SR����E�������1'�
33%!''#1�H�PjaRRah3���<�}}����h�����^|�����^�����=
52654&#56�:<<:[]]22,-21ODDO�v=
&546"3v[]][:<<:ODDO12-,2���;5&&546632&&#"2H+G)/D"/ +5<=�[!L:+:$(*%)B v���373'3�]
]g]�]��W���W��'3']�]W������%"&'573267I3i�
 �+5+?<36	+	���8l	����8�	����8�����>����_�3f�?�����Y�����8�	����8l	���_B3�8�@����A�����L�����Y�����;��	���9�����8�����Ln�
���z2����45��#�".9EQ\gs�"&54632'"&546323"&54632%"&54632!"&54632%"&54632!"&54632%"&54632!"&54632%"&54632"&54632'"&54632+z�

��

`�P

��d

M���

{&R$mn&%R�8l	'7A�:�8�8���mc'7I�/��s7��.M'7CU'.���8�	'7+�:8)�8���c'7$�/�*�7	/�'7B9/U/
��8��'73'#�#rRr#v8 �� q���F'73'#�$iVi$n�qq]A��".#"'66323267t&7/4& 7/A",#;M"-":M{��I".#"'6632327w)86-)(86�" 9BB:A�Y��5!�
Y99���5!��99���Y��������;��"&&'732667,6B!3, !+3"B;-E%00%E-�<��"&&'73267,8DD&12&D C<*E&+>>+&E*���J
"&'73267,FF2/++/2F�M4#11#4M���E"&&'73267,7AH#**$H@�$;!#33#!;$�Ln�"&54632,&&&&L####��g;"&54632,""""�  �L��"&546323"&54632��L !!  !! ���0"&546323"&54632����<|�'6654'7	 SDKD<(+61,++��{h'6654'7	 S	AIC�&'0)&+*�;�-"&&'732667'"&54632,6E#00""00#D7    ;-E%2  2%E-�����
"&'73267'"&54632,HJ.5..6.KH�M4%33%4Mt�9��"&54632'2654&#",4::44::4!!!!98()77)(8%"!!"���p"&54632'2654&#",*77*)88)�2()22)(2$�8��'7'7�.W:4.W:8������l'7'7�+\96+]8�� �� �>��'737r#vv#r>� qq ����M'737i$nn$i�q\\q�$I03J$Q�k8��'7'7�c:Wic:W8����j��l'7'7�j8]uj9\�� �� ��8��'>32.#"�3!B66B"3+! ,8%E--E%//���I
'6632&&#"�2FFFF2/++/�5LL5#11�)a�"&54676632/ +/ )'$%?"$�>p�&&5467L+EKDS >)+-06+�)c�'665#"&54632	  +)"%'$%?���<|�����5#5353Sss5�H/H��x��533#�5ss��H/H�=��5#53Oo�=^/�#���'654&'7+T@

W�)L
&?B�j��
&546"3jEEEE&''&��3-.4$  ��-���53533�Y6Y�/jj/�����5#53#Y�Y�j//j�����5#53533#YY6YY�H/HH/H��j���53��//���)n��
�����0������������z��
'6654&'7�?.$#A4U�(&$"+,�?��
&&5467SA4VO?.%"?#",,)�z'6654&'73�?."+(6#&U�(`H +,�z'6654&'73�?."+(6#&U�(`H +,��"&54667332678+;':%-$	0�./2(;!
'��"&5466733267:,;'=%,"	-�-.3(<!
+	��O��73	:���������53#5#��0�␐aa���� ��������	�����������!������V�����o��=%".#"'66323267�!1(&7+1!1(&7+�"+#
6J"+"	6J�x��
52654&#56�&''&EEE��$  $4.-3�����53353�0�0�``������53'35#��Ɩ��(T����'&632366324&#"#54&#"�43/''0240�NF  FN<(*&&*(�5��'7'77'� == >> == >599::99:��A����{��I�7���"5533267XM@
	
�\/
1�?�U��5!�ګ::�fX�
'6632&&#"�e��d_�mm�X*>AA>*:55�L�L"&546323"&54632''7��{#R1Lus"����"&546323"&54632''7��|%_5�lw$�4�"&5463277"&54632�51DKsS�
��L�L"&546323"&54632''7��m`1RLui"s����"&546323"&54632''7��zo5_�lm$w�3�"&54632'77"&54632�]@B)IS ���L�&-"&546323"&54632'"&&#"'66323267��-#+$**&#+$**Lw'5'5�L�"&546323"&54632'5!���L�//����"&546323"&54632%5!������..�L�H"&546323"&54632''737���^``^L�\II\����"&546323"&54632''737���c!dd!c�|`KK`�:'73'#'7�dDdg�#W1:"\\"Hx"��x'73'#'7�"]H]"]{a#�ZZE ]'5:�'73'#'7�dDdg�q0d:"\\"Hp$uY��x'73'#'7�"]H]"]wZ#U�ZZEX%_�:�'73'#'6654&'7�dDdgv	 %;?::"\\"H#)%#(#����'73'#'6654&'7�"]H]"]u!&	x8�ZZE#*D&#�:�#'73'#7"&&#"'66323267�dDdgC*$+!#*#+!:"XX"EG'2&3����'73'#7"&&#"'66323267�"]H]"]D *!-%( *"-$�WWBJ&5'5�;�@"&&'732667''7,6B!0.!"-0"B;'X4;-E%2  2%E-l|(����
"&'73267''7,FF/1,,1/FC)_5�M4%33%4Mbt$�;�@"&&'732667''7,6B!0.!"-0"B1e4X;-E%2  2%E-lq(|����
"&'73267''7,FF/1,,1/FIk5_�M4%33%4Mbm$t�;�P"&&'732667''6654&'7,6B!0.!"-0"BQ#)=D>;-E%2  2%E-o$2)((&����
"&'73267''6654&'7,FF/1,,1/F]
!%;>9�M4%33%4M_#*$#&#�;�"%"&&'732677"&&#"'66323267,1=//././=*$/#%*#/#; 2++2 �&2&2����
#"&'73267'"&&#"'66323267,FD......D *!-%( *"-$�@****@�'5&5�:�$'73'#7"&'73267�_D_`>;&(**(&;:SS>I8!
  
!8����'73'#7"&'73267�!\H\!]BB.++,*.C�WWEI9%""%9�Y�K5!''7�
� �&Y99h'c1����5!''7��y'�99\&g0�>�-"&54632'737,    Arzzr��ss�����"&54632'737,Alyyl5sm\\m�/�
.54677�-G:I3+JCA&)*3'.���/�
.5467'7�-G:Is@K&A&)*3'8���2�'
#&&5467'66323267#"&&#"G$:@:% �#%*#/#%*$2"'
|&2&2�/�
'6654'7'7�
I;F-�2*JA&'3*)&
��/�
'6654'7'7�
I;F-�?J'A&'3*)&���2�'#"&&#"'66323267'6654&'7m*$/#%*#/#� %;?:�&2&2�!
'"��S5!'�NN���z'5!'�ޜ��pS�3N�px���pz�3ޜ�px��!7S53!53!53��������NNNNNN!�7z%53!53!53��������ޜ������SA333NNNNN7
���p
���p
���zA333ޜ����7
���p
���p
��ES53!53!53!53�p��p��p��pNNNNNNNN�Ez%53!53!53!53�p��p��p��pޜ���������S_53535353NNNNNNN~�������������z_53535353ޜ������~������������pS!#!��Nz�k��pz%!#!��Nz��
�pS!#!�����k��pz%!#!������
��pSS#!5!SN��z�p�N��pSz#!5!SN��z�pn���pzS#!5!z�����p�N��pzz#!5!z�����pn��!3!��N,�k��%!3!��N,�
����3!ޜ�kN���73!ޜ�
�����S�!5!3S��,NN����S�%!5!3S��,Nޜn��z�5!3'�N�����z�'5!3'�ޜn���p�!#3!��NN,�kx�k�p�%!#3!��NN,��x���p�	!##3!��N'��k��k�p�	!#33!���'N,�k���k�p�!#3!�����kx�k�p�	%!##3!��N'���n
���p�	%!#33!���'N,��
n���p�%!#3!������x����pS�#!5!3SN��,N�p�N���pS�#!5!3SN��,N�pn�n��pz�	#!5!3#SN���'�p�N����pz�	#!5!33z���,N'�p�N��k��pz�#!5!3z�����p�N���pz�	#!5!3#SN���'�pn�n����pz�	#!5!33z���,N'�pn�n����pz�#!5!3z�����pn�n��pS!#!5!��N����k�N��pz	#!5!!!SN��z,��pn�'N��pz	%!#!5!5!��N��,z���N'��pz%!#!5!��N�����n���pS!#!5!�������k�N��pz	!#!5!!�������kn�'��pz	%!#!5!5!���������N'��pz%!#!5!��������n����!5!3!�Z,N,N��k����	!!5!3!���,N,'�n�k����	%!5!5!3!����,N,�'N�������%!5!3!�Z,N,ޜn�����!5!3!�Z�N��k����	'5!3!!'���ޜn�kN'����	75!5!3!����'N��������%!5!3!�Z�ޜn����p�!#!5!3!��N��,N,�k�N��k��p�!#!5!3!��N��,N,�kn�n�k��p�%!#!5!3!��N��,N,���N�����p�%!#!5!3!��N��,N,��n�n����p�!#!5!3!��N����k�N��k��p�!#!5!3!�����,N,�k�N��k��p�!#!5!3!�������k�N��k��p�
%##!5!3!!z'N�������n�n�kN��p�
%!##5!5!3!��N'�����n'N�����p�
#!5!33!!z���,N'���pn�n��'N��p�
%!#!5!533!�����'N,���N'n����p�%!#!5!3!��N�����n�n����p�%!#!5!3!�����,N,��n�n����p�!#!5!3!�������kn�n�k��p�%!#!5!3!���������N�����p�%!#!5!3!��������n�n��K
S53!53w��>�NNNNK�
z%53!53w��>�ޜ����jS�33NNN�,���,���jz�33ޜ���,���,������5!5!'��Z�SNN�NN��p��3#3SN�N�px��x���p�	%!#!!!��Nz��,���1NN��pS	##!#SNN��p��k�N�k��p�!#!##!��N��N,S�1����pS�	#!5!5!5!SN��,��z�pGNNN��p�S	###5!SNN��p��k�N���p��#!5!##5!�N��ȜN�,�p�N��GN��	%3!!!N,��,�1��NNN��	3333�NNN��k��kN���333!SN�8NzS���N�1�N���S�	%!5!5!5!3S��,��,N�NNNG����	!53333��8�NNNN��k������!533!5!3���N��8zNSNG��N��p�%!#3!!!��NN,��,���x��NN��p�3##33�Nz�NN�px����kx�k��p�	333##!�NNN��N,�px������N������pS�#!5!5!5!3SN��,��,N�pGNNNG��p��3###533SN�N��N�px���N���p��	3!533##5!SN����NN�,�px���NG��GN��p�5!!#!5!'���N���SNN���GN��pS###5!#SNN���p��k�NN�k��p�	5!##!##5!'��N,��N�,SNN�����kGN����!5!3!5!�Z,N,�Z�SNG���NN���!533333�Z�NNN�N��k��k����33!!5335!SN�����N���S���NNG��NN��p�%!#!5!5!5!3!!!��N��,��,N,��,���GNNNG��NN��p�###533333#SNN��NNN��p��k�N��k��kN�k��p�33!!533##!##5!SN�����Nz�N,��N�,S���NNG�����kGN�pS4>33#"5]{F''HwF�p�F{]5NGvH�p��pSS!#4&&##532SNGvH''F{]5�p�HvGN5]{��S�##532665S5]{F''HvG�pF{]5NFwH��333#".NFwH''F{]5X��pHwFN5]{��X�3#-+��+�YW����X�#5+-+�����WYW��X�	#5533-����+��++������WW��W����W��SS5!'zNNS�3N�S5!zNN�pSS3N�p����Sz'5!'zޜ��z�3ޜ��z%5!zޜ��pzS3ޜ�p����z%!5!5!5!����,z�'N'�pz�#333z�'N'�p���k���z!!5!!���z,'�'�pz�###3z'N'��k��,X�!X,��D�pX�5!X�p���pX��!X�p^���pX}!X�p
���pX,!X�p��D�pX�!X�pk���pX�!X�p���pX9!X�p�7�pX�!X�px���p
�!
�px���p��!�px���pw�!w�px���p,�!,�px���p��3�px���p��3��px���pK�3K�px��,�pX�!,,�px��*��X�#/;GS_kw�����������+7CO[gs����������4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&���8



�



�



���8



�



�



���8



�



�



���8



�



�



���8



�



�



���8



�



�



���8



�



�



�U










ZU










ZU










ZU










ZU










ZU










ZU










*��L*�#/;GS_kw�����������+7CO[gs����������4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&�  �  �  >���  �  �  >���  �  �  >���  �  �  >���  �  �  >���  �  �  >���  �  �  >���      NU      NU      NU      NU      NU      NU      N*��:E�#/;GS_kw�����������+7CO[gs����������4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&4632#"&'4632#"&'4632#"&�/""//""/�/""//""/�/""//""/G  �  �  �/""//""/�/""//""/�/""//""/G  �  �  �/""//""/�/""//""/�/""//""/G  �  �  �/""//""/�/""//""/�/""//""/G  �  �  �/""//""/�/""//""/�/""//""/G  �  �  �/""//""/�/""//""/�/""//""/G  �  �  �/""//""/�/""//""/�/""//""/G  �  �  �"//""//""//""//""//""//B      N"//""//""//""//""//""//B      N"//""//""//""//""//""//B      N"//""//""//""//""//""//B      N"//""//""//""//""//""//B      N"//""//""//""//""//""//B      N"//""//""//""//""//""//B      9X�5!X9��
�pX�3
K�px���p,,!,�p��D,�pX,!,,�p��D,,�!,,��D�pX�!!,,�px�D�D�pX�!!,,,��D�D��D�pX�!!!X���X,�Dx�pX�!!!X���X�p��,,X�!,,,��D�pX�!!,,��,,��D�D��D�pX�!!!X��,,�p����M��������Q��4
�%3#5754632&#"3#33"&54632vBBEI*Egg�R(&&&&�>MJW	?^MC�]�L####9���%"&533267%#5754632&#"3#�.)R		��BBEI*Dgg95f��>�>MJW	?^MC�]c��d$#4>55#7#3�Q"8DC8"t��u"8CD8"QQ��DY;+)5O<����EZ<+(4N<�3�S�Z�3333'53##SJ�R�JT���^>���yװ�"�Ǽ��-��+X���XX��(�l���c�'7*1��19�0--0����e	e��e�������_�.��91���]]0���Hf$<HT`l&~	&�
*�6�D*:n�2�$�D*	�	�	�	L	�	dP	*�	��	4�		4�	2	
 8	4X	�	�	�	�	�	�	�			$			 	>	
,	^	0	�	.	�	
2	�	8
	&
R	<
x	�	"
�	.	�	2	�
�
�"
�0Jd~0�	(�
,�48J<�0�H�"
�2
68J���� a���� gi & l �� ������������� J���� ����� ����� �������� 1��������� ����� [�]����� �� ������ [0]����������� ����� [-]������������ ���������� [*]������� ��� �������� �� ������ [$]����������� ����������� [-,*]���� �, ���� a���� �, ���� g, ������� 1���� �, ���� J� 2010 - 2020 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name  Source .Source Code ProRegular2.038;ADBO;SourceCodePro-Regular;ADOBEVersion 2.038;hotconv 1.0.116;makeotfexe 2.5.65601SourceCodePro-RegularSource is a trademark of Adobe Systems Incorporated in the United States and/or other countries.Adobe Systems IncorporatedPaul D. Hunt, Teo Tuominenhttp://www.adobe.com/typeThis Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFL. This Font Software is distributed on an  AS IS  BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the SIL Open Font License for the specific language, permissions and limitations governing your use of this Font Software.http://scripts.sil.org/OFLsimple asimple gserifed i & lSami Jcursive �cursive �cursive �Serbian �Cyrillic breve [�]slashed zero [0]typographic hyphen [-]typographic asterisk [*]slashed dollar sign [$]alternate numeral one [1]typographic alternates [-,*]simple a, cursive �simple g, cursive �, Serbian 1Sami J, cursive �?@>AB>9 0?@>AB>9 gV 8 � A 70A5G:0<8A00<A:89 JA:>@>?8A=K9 �A:>@>?8A=K9 �A:>@>?8A=K9 �A5@1A:89 1:8@8;;8G5A:0O :@0B:0 [�]70G5@:=CBK9 =>;L [0]B8?>3@0DA:89 45D8A [-]B8?>3@0DA:0O 72574>G:0 [*]70G5@:=CBK9 7=0: 4>;;0@0 [$]B8?>3@0DA:85 70<5AB8B5;8 [-,*]?@>AB>9 0, A:>@>?8A=K9 �A5@1A:89 1, ?@>AB>9 g, A:>@>?8A=K9 �A00<A:89 J, A:>@>?8A=K9 ���2 $%&'()*+,-./0123456789:;<=DEFGHIJKLMNOPQRSTUVWXYZ[\]����bc	

�d���e�� !"#$%&'()*+,-.�/0123456789:���;�<�=>?@ABCDEFGHIJK�LMNOPQRfSTUV����gWXYZ[\]^_`abcdefghi�j�klmnopqrs�tuvwxyz{|}~����h��������������������������������������������jikml��n��������������������o�������qpr�s����������������������������utv�w��������������������������x�����zy{}|���	

���� !"#$%&~�'�()*+,-./0123456789:;<=>?�@�ABCDE�FGHI��JKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	�

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~�������������������������������������������������������������������������������������������������������	���������������������������"�
��������������	

B>@^`_?�
���� !"#$%&�'��(#)*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef�g�hijklmnopqrstuvwxyz{|}~����������������������������������������������������������������� �!���A�a�������������������������������������������������������������������������������������C������������	

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������	

 !"#$%&'()*+,-.AmacronAbreve
Aringacuteuni01CDAogonekuni1EA0uni1EA2uni1EA4uni1EA6uni1EA8uni1EAAuni1EACuni1EAEuni1EB0uni1EB2uni1EB4uni1EB6AEacuteuni01E2uni0243uni1E06Ccircumflex
CdotaccentDcaronuni1E0Cuni1E0Euni1E10Dcroatuni018AEcaronEmacronEbreve
EdotaccentEogonekuni1EB8uni1EBAuni1EBCuni1EBEuni1EC0uni1EC2uni1EC4uni1EC6uni1E16uni01F4Gcircumflex
Gdotaccentuni0122Gcaronuni1E20uni00470303uni0193Hcircumflexuni1E26uni1E24uni1E28uni1E2AHbarItildeImacronuni01CFIogonekuni1EC8uni1ECAIbreveJcircumflexuni0136uni1E32uni1E34LacuteLcaronuni013Buni1E36uni1E38uni1E3ALdotuni1E3Euni1E40uni1E42Nacuteuni01F8Ncaronuni0145uni1E44uni1E46uni1E48Omacron
OhungarumlautObreveuni01D1uni01EAuni1ECCuni1ECEuni1ED0uni1ED2uni1ED4uni1ED6uni1ED8Ohornuni1EDAuni1EDCuni1EDEuni1EE0uni1EE2uni1E52OslashacuteRacuteRcaronuni1E58uni0156uni1E5Auni1E5Cuni1E5ESacuteScircumflexuni1E66uni015Euni0218uni1E60uni1E62uni1E9ETcaronuni0162uni021Auni1E6Cuni1E6ETbarUtildeUmacronUbreveUring
Uhungarumlautuni01D3Uogonekuni01D5uni01D7uni01D9uni01DBuni1EE4uni1EE6Uhornuni1EE8uni1EEAuni1EECuni1EEEuni1EF0uni1E7EWgraveWacuteWcircumflex	WdieresisYgraveYcircumflexuni1E8Euni1EF4uni1EF6uni1EF8Zacute
Zdotaccentuni1E90uni1E92uni1E94uni018FEngIJuni004C00B7004Cuni01320301amacronabreve
aringacuteuni01CEaogonekuni1EA1uni1EA3uni1EA5uni1EA7uni1EA9uni1EABuni1EADuni1EAFuni1EB1uni1EB3uni1EB5uni1EB7aeacuteuni01E3uni0180uni1E07ccircumflex
cdotaccentdcaronuni1E0Duni1E0Funi1E11ecaronemacronebreveeogonek
edotaccentuni1EB9uni1EBBuni1EBDuni1EBFuni1EC1uni1EC3uni1EC5uni1EC7uni1E17uni01F5gcircumflex
gdotaccentuni0123gcaronuni1E21uni00670303hcircumflexuni1E27uni1E25uni1E96uni1E29uni1E2Bhbaritildeimacronuni01D0iogonekuni1EC9uni1ECBibrevejcircumflexuni0137uni1E33uni1E35kgreenlandiclacutelcaronuni013Cuni1E37uni1E39uni1E3Bldotuni1E3Funi1E41uni1E43nacuteuni01F9ncaronuni0146uni1E45uni1E47uni1E49napostropheomacron
ohungarumlautuni01D2uni01EBuni1ECDuni1ECFuni1ED1uni1ED3uni1ED5uni1ED7uni1ED9obreveuni1E53ohornuni1EDBuni1EDDuni1EDFuni1EE1uni1EE3oslashacuteracuteuni0157rcaronuni1E59uni1E5Buni1E5Duni1E5Fsacutescircumflexuni1E67uni015Funi0219uni1E61uni1E63longstcaronuni0163uni021Buni1E6Duni1E6Funi1E97tbarutildeumacronubreveuring
uhungarumlautuni01D4uogonekuni01D6uni01D8uni01DAuni01DCuni1EE5uni1EE7uhornuni1EE9uni1EEBuni1EEDuni1EEFuni1EF1uni1E7Fwgravewacutewcircumflex	wdieresisygraveycircumflexuni1E8Funi1EF5uni1EF7uni1EF9zacute
zdotaccentuni1E91uni1E93uni1E95enguni0237ijuni006C00B7006Cuni01330301uni0250uni0252uni0253uni0254uni0255uni0256uni0257uni0258uni0251uni0299uni0259uni025Auni025Buni025Cuni025Euni025Funi0260uni0261uni0262uni0263uni0264uni0265uni0266uni0267uni029Cuni0268uni026Auni029Duni029Euni026Buni026Cuni026Duni026Euni029Funi026Funi0270uni0271uni0272uni0273uni0274uni0275uni0276uni0278uni0279uni027Auni027Buni027Duni027Euni0280uni0281uni0282uni0283uni0284uni0287uni0288uni0289uni028Auni028Buni028Cuni028Duni028Euni028Funi0290uni0291uni0292uni02A4uni02A6uni02A7uni0294uni0295uni02A1uni02A2uni01C2uni0298	uni014A.aa.aagrave.aaacute.a
acircumflex.aatilde.aadieresis.a	amacron.aabreve.aaring.aaringacute.a	uni01CE.a	uni1EA1.a	uni1EA3.a	uni1EA5.a	uni1EA7.a	uni1EA9.a	uni1EAB.a	uni1EAD.a	uni1EAF.a	uni1EB1.a	uni1EB3.a	uni1EB5.a	uni1EB7.a	aogonek.ag.a	uni01F5.a
gcircumflex.agbreve.agdotaccent.a	uni0123.agcaron.a	uni1E21.a
uni00670303.ai.a
dotlessi.aigrave.aiacute.a
icircumflex.aitilde.aidieresis.a	imacron.a	uni01D0.a	iogonek.a	uni1EC9.a	uni1ECB.a	uni012D.a	uni0268.a	iogonek.d
iogonek.da	uni0268.d
uni0268.da	uni029D.dl.alacute.alcaron.a	uni013C.a	uni1E37.a	uni1E39.a	uni1E3B.alslash.aldot.auni006C00B7006C.a	uni026B.a	uni026C.aAlphaBetaGammauni0394EpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsiuni03A9
AlphatonosEpsilontonosEtatonos	IotatonosIotadieresisOmicrontonosUpsilontonosUpsilondieresis
Omegatonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigmatauupsilonphichipsiomegauni03C2uni03D0uni03D1uni03D5phi.a
alphatonosepsilontonosetatonos	iotatonosiotadieresisomicrontonosupsilontonosupsilondieresis
omegatonosiotadieresistonosupsilondieresistonosuni03D7uni03D9uni03DBuni03DDuni03E1uni037E	anoteleia
anoteleia.capuni0374uni0375tonos	tonos.cap
dieresistonosuni037Auni1FBEuni1FBDuni1FBFuni1FFEuni1FEFuni1FFDuni1FCDuni1FDDuni1FCEuni1FDEuni1FCFuni1FDFuni1FC0uni1FEDuni1FEEuni1FC1uni1FBD.capuni1FFE.capuni1FEF.capuni1FFD.capuni1FCD.capuni1FDD.capuni1FCE.capuni1FDE.capuni1FCF.capuni1FDF.capuni0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0462uni0472uni0474uni0490uni0492uni0496uni0498uni049Auni04A0uni04A2uni04AAuni04AEuni04B0uni04B2uni04B6uni04BAuni04C0uni04C1uni04D0uni04D4uni04D6uni04D8uni04E2uni04E6uni04E8uni04EEuni04F2uni0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0463uni0473uni0475uni0491uni0493uni0497uni0499uni049Buni04A1uni04A3uni04ABuni04AFuni04B1uni04B3uni04B7uni04BBuni04C2uni04CFuni04D1uni04D5uni04D7uni04D9uni04E3uni04E7uni04E9uni04EFuni04F3	uni0430.a	uni04D1.auni0431.srb	uni0456.a	uni0457.a	uni04CF.auni2116zero.aone.a	zero.onumone.onumtwo.onum
three.onum	four.onum	five.onumsix.onum
seven.onum
eight.onum	nine.onumzero.bone.bzero.capone.captwo.cap	three.capfour.capfive.capsix.cap	seven.cap	eight.capnine.capzero.cone.c
quotereverseduni00ADuni2010
figuredashuni2015uni25E6uni25AAuni25ABuni25B4uni25B5uni25B8uni25B9uni25BEuni25BFuni25C2uni25C3	invbullet
filledrect
underscoredbluni203Euni203Funi2016	exclamdbluni2047uni2049uni2048uni203Duni2E18uni231Cuni231Duni231Euni231Funi27E6uni27E7uni2E22uni2E23uni2E24uni2E25uni2117uni2120at.case
asterisk.ahyphen.a	uni00AD.a	uni2010.adollar.a	zero.supsone.supstwo.sups
three.sups	four.sups	five.supssix.sups
seven.sups
eight.sups	nine.supsparenleft.supsparenright.supsperiod.sups
comma.sups	zero.subsone.substwo.subs
three.subs	four.subs	five.subssix.subs
seven.subs
eight.subs	nine.subsparenleft.subsparenright.subsperiod.subs
comma.subs	zero.dnomone.dnomtwo.dnom
three.dnom	four.dnom	five.dnomsix.dnom
seven.dnom
eight.dnom	nine.dnomparenleft.dnomparenright.dnomperiod.dnom
comma.dnom	zero.numrone.numrtwo.numr
three.numr	four.numr	five.numrsix.numr
seven.numr
eight.numr	nine.numrparenleft.numrparenright.numrperiod.numr
comma.numr
ordfeminine.aa.supsb.supsc.supsd.supse.supsf.supsg.supsh.supsi.supsj.supsk.supsl.supsm.supsn.supso.supsp.supsq.supsr.supss.supst.supsu.supsv.supsw.supsx.supsy.supsz.supsegrave.supseacute.supseogonek.supsuni0259.supsuni0266.supsuni02E0uni02E4a.supag.supai.supa
colon.supshyphen.supsendash.supsemdash.supsEurouni0192
colonmonetarylirauni20A6pesetauni20A9donguni20B1uni20B2uni20B4uni20B5uni20B9uni20BAuni20AEuni20B8uni20BDuni2215
slash.fraconethird	twothirdsuni2155uni2156uni2157uni2158uni2159uni215Auni2150	oneeighththreeeighthsfiveeighthsseveneighthsuni2151uni2152uni2189uni2219equivalence
revlogicalnotintersection
orthogonaluni2032uni2033uni2035uni00B5
integraltp
integralbtuni2206uni2126uni2200uni2203uni2237uni2105uni2113	estimateduni2190arrowupuni2192	arrowdownuni2196uni2197uni2198uni2199uni21D0uni21D1uni21D2uni21D3	arrowboth	arrowupdnarrowupdnbseuni25CFuni25CBuni25A0uni25A1uni2752uni25C6triagupuni25B3uni25B6uni25B7triagdnuni25BDuni25C0uni25C1triagrttriaglf	invcircleuni25C9uni2610uni2611uni2713musicalnotemusicalnotedblheartclubdiamondspade	smilefaceinvsmilefaceuni2764uni2615u1F4A9u1F916u1F512femalemalesunhouseuni02B9uni02BBuni02BCuni02BEuni02BFuni02C1uni02D0uni02D1uni02DEuni02C8uni02C9uni02CAuni02CBuni02CCuni25CCuni0300uni0300.capuni0340uni0301uni0301.cap	uni0301.guni0302uni0302.capuni0303uni0303.capuni0304uni0304.capuni0305uni0305.capuni0306	uni0306.cuni0306.capuni0306.ccapuni0307uni0307.capuni0308uni0308.capuni0309uni0309.capuni0310uni0310.capuni030Auni030A.capuni030Buni030B.capuni030Cuni030C.cap	uni030C.auni030Funi030F.capuni0311uni0311.capuni0312	uni0312.guni0313uni0343uni0318uni0319uni031Auni031Buni031Cuni031Duni031Euni031Funi0320uni0323uni0324uni0325uni0326	uni0326.auni0327uni0327.capuni0328uni0328.capuni0329uni032Auni032Cuni032Euni032Funi0330uni0331uni0334uni0339uni033Auni033Buni033Cuni033Duni0342uni0342.capuni0345uni035Funi0361uni03080301uni03080301.cap
uni03080301.guni03080300uni03080300.cap
uni03080300.guni03080303uni03080304uni03080304.capuni0308030Cuni0308030C.capuni03020301uni03020301.capuni03020300uni03020300.capuni03020309uni03020309.capuni03020303uni03020303.capuni03060301uni03060301.capuni03060300uni03060300.capuni03060309uni03060309.capuni03060303uni03060303.capuni03020306uni03020306.capuni03040301uni03040301.capuni030C0307uni030C0307.capuni03120301uni03120300uni03120303uni03130301uni03130300uni03130303uni00A0uni2007
space.fracnbspace.fracuni2500uni2501uni2502uni2503uni2504uni2505uni2506uni2507uni2508uni2509uni250Auni250Buni250Cuni250Duni250Euni250Funi2510uni2511uni2512uni2513uni2514uni2515uni2516uni2517uni2518uni2519uni251Auni251Buni251Cuni251Duni251Euni251Funi2520uni2521uni2522uni2523uni2524uni2525uni2526uni2527uni2528uni2529uni252Auni252Buni252Cuni252Duni252Euni252Funi2530uni2531uni2532uni2533uni2534uni2535uni2536uni2537uni2538uni2539uni253Auni253Buni253Cuni253Duni253Euni253Funi2540uni2541uni2542uni2543uni2544uni2545uni2546uni2547uni2548uni2549uni254Auni254Buni254Cuni254Duni254Euni254Funi2550uni2551uni2552uni2553uni2554uni2555uni2556uni2557uni2558uni2559uni255Auni255Buni255Cuni255Duni255Euni255Funi2560uni2561uni2562uni2563uni2564uni2565uni2566uni2567uni2568uni2569uni256Auni256Buni256Cuni256Duni256Euni256Funi2570uni2571uni2572uni2573uni2574uni2575uni2576uni2577uni2578uni2579uni257Auni257Buni257Cuni257Duni257Euni257Funi2580uni2581uni2582uni2583uni2584uni2585uni2586uni2587uni2588uni2589uni258Auni258Buni258Cuni258Duni258Euni258Funi2590uni2591uni2592uni2593uni2594uni2595uni2596uni2597uni2598uni2599uni259Auni259Buni259Cuni259Duni259Euni259Funi202FuniFEFFu1F3B5u1F3B6f_if_luniE0A0uniE0A1uniE0A2uniE0B0uniE0B1uniE0B2uniE0B3ideoromnDFLTcyrlgreklatn�V�t
  !!""#')13577::==@@MM[[^^eevv������������������



$$**00??BBQQUU\\aassww�����������������������������	  ##&&56;;?@HHLNQRYY\^bbddffllnnqquu����������������������������

$%'-0146KLee�����EHn�#11BDHn
�(DFLTcyrl.grekXlatnl�� 
SRB ��	!��
"��#ATH &NSM 6SKS F��$��
%��&��'(ccmp�ccmp�ccmpccmp
ccmpccmpccmp"ccmp*frac2frac8frac>fracDfracJfracPfracVfrac\markbmarkvmark�mark�mark�mark�mark�mark�mkmkmkmkmkmkmkmkmkmkmkmk mkmk&mkmk,size2size6size:size>sizeBsizeFsizeJsizeN	
	
	
	
	
	
	
	








 d&.8BJT\dlt|��vxz�������b|�	n	�	�
Z
P���
�t�����2�� X���X���V��v�ZS������������������������������������������������������������������������������������x~x���xx���x����xxxxx������������r rr&x,2�x�xx8xx�>��D�rr  ��DJPV\bhn�tz��rr���r�r�������J�������rrr�r����������D
Dx�xxx�xxJ�r"x�(�x�x.(x�x,x�4:@�Frrr�rLrRr�r,�,�Z�K�V�J�D�F���@�.�0�<�=�@���Z�������\����>�A�0�d�/��'�B���+��B�\�D�?�%�"�T�`�n���-�6�N�#���{���&�G�����F�j�������J�%�,�2�2�H�H�HN��P�(�:��]�M�<�X�����	Z	`

,���	D	Lhh.djpv|�^�^��^^����������^������������^,^F�z]�?�@�Z'*�bk��:���6�N��jZZZZZZZZZZZZZZZZZZZZZZZ}���� &�,28��>��D�JPV\bhntz8����������b��&��V�hz����n�DD����V2��������D��h���z�
"(��.4:@�F����LRX^2V�ddd�dddd���jp�,��X��&��M�����J��R��]�����@��9��.��<��6��T��0��#��:��\���%O�������%�%���5��|���%P��"��2��i�%��h��3�%����&�%F��,�a���%�%��%e�%W����%��%��0�%H�%6�%�%`��|�%/���N��K�%��H���������
,��Q �Q���",�����������HHDJ>>>>PV>\bDDDh>nPPPtV>JJJJzz>,���d����6�P�2ZShnhhnhhnhnhnhnhhnnhnhnhnhnhnhnhnhnhnhhhhhhhnhnhhnhhhnhnhnhnhnhnhnhnhnhnhnhnhnhhhhhh&&,28822>DJP,�,�,j,�,L,>,�,i,[,TGF,!#$%&'/(a�������������������	#"%+,4�������������������	hjFG�E JJJMMKinLR�# 11(BD)Hn,�	

!#$%&')*+,-./01345@M[e���������
QUaw��������������������������������������	
56?@HLMNQRY\]^bdflnqu��������������
$%'()*+,-01456KLe�&�23.	

!#$')*-./035M��U���?@LRY\]�$%(06<>AEE}	

!#$%&')*+,-./01345M[�����Ua��������������������������������������	
6?@LQRY\]^du��=
'R�'*�45
$*047:=^��
*Us #&?@���	


��DFLTcyrlfgreklatnR��! (08@HPX`hpx����������������
SRB T��"	!)19AIQYaiqy�������������������"
"*2:BJRZbjrz�������������������"#+3;CKS[cks{����������������ATH ^NSM �SKS ���!$,4<DLT\dlt|���������������	��!
%-5=EMU]emu}���������������
��"&.6>FNV^fnv~������������������"'/7?GOW_gow����������������
casePcaseVcase\casebcasehcasencasetcasezccmp�ccmp�ccmp�ccmp�ccmp�ccmp�ccmp�ccmp�cv01�cv01�cv01�cv01cv01cv01cv01cv01cv02 cv02&cv02,cv022cv028cv02>cv02Dcv02Jcv04Pcv04Vcv04\cv04bcv04hcv04ncv04tcv04zcv06�cv06�cv06�cv06�cv06�cv06�cv06�cv06�cv07�cv07�cv07�cv07�cv07�cv07�cv07�cv07�cv08�cv08�cv08�cv08�cv08�cv08�cv08cv08
cv09cv09cv09cv09"cv09(cv09.cv094cv09:cv10@cv10Fcv10Lcv10Rcv10Xcv10^cv10dcv10jcv11pcv11vcv11|cv11�cv11�cv11�cv11�cv11�cv12�cv12�cv12�cv12�cv12�cv12�cv12�cv12�cv14�cv14�cv14�cv14�cv14�cv14�cv14�cv14�cv15	cv15	cv15	cv15	cv15	cv15	cv15	$cv15	*cv16	0cv16	6cv16	<cv16	Bcv16	Hcv16	Ncv16	Tcv16	Zcv17	`cv17	fcv17	lcv17	rcv17	xcv17	~cv17	�cv17	�dnom	�dnom	�dnom	�dnom	�dnom	�dnom	�dnom	�dnom	�frac	�frac	�frac	�frac	�frac	�frac	�frac
frac
locl
 locl
&locl
.locl
4locl
:numr
@numr
Fnumr
Lnumr
Rnumr
Xnumr
^numr
dnumr
jonum
ponum
vonum
|onum
�onum
�onum
�onum
�onum
�ordn
�ordn
�ordn
�ordn
�ordn
�ordn
�ordn
�ordn
�salt
�salt
�saltsalt$salt@salt\saltxsalt�sinf�sinf�sinf�sinf�sinf�sinf�sinf�sinf�ss01�ss01�ss01�ss01�ss01ss01ss01ss01ss02 ss02(ss020ss028ss02@ss02Hss02Pss02Xss03`ss03jss03tss03~ss03�ss03�ss03�ss03�ss04�ss04�ss04�ss04�ss04�ss04�ss04�ss04�ss05�ss05�ss05�ss05�ss05
ss05
ss05
ss05
ss06
 ss06
&ss06
,ss06
2ss06
8ss06
>ss06
Dss06
Jss07
Pss07
Vss07
\ss07
bss07
hss07
nss07
tss07
zsubs
�subs
�subs
�subs
�subs
�subs
�subs
�subs
�sups
�sups
�sups
�sups
�sups
�sups
�sups
�sups
�zerozerozerozerozerozerozero$zero*								@:4.("������������������������������~xrltnhb\VPJRLF@:4.(0*$����������������������������~��ztnhb\























        ����������������~tj`VPJD>82,&$������������ � � � � � � � 	

$JRZbjr~���������������&.6>FNV^fn,*0.,z����������� 2<x���� Vh�������������!#L
 &,28>DJP  **
U���������!��!��"�:d��$U�S�Yc	W$]�[�a_aC$*06<K�M�H�JNOQNC &,j�j�i�ikkC &,m�m�l�lnnC�,6@JT`jt~����������@4e4v�4�
�4�4
4$04B?2Q4��'\w4��4���;2*v"�d"� !$%"#�

����#��#���#�)*+,-./0123456789:;<=>?@ABCDEFG��������������rMNOP�����	NR9�������������������������35CILPRTVXZ\^`bdfP !"#$%&'(5)*+,-./01234ef'J:
6789:;<=>K6 ?RABCDEFGHIJK@STUVWXYZ[L\]NPhijL4444
8C<<��<
<
@
M4N4*(U�MOQNP��35CILPRTVXZ\^`bdf(q

r��� "	
_b��+.qt�A_�+q	b�.t��A$4��	

CHKOQSUWY[]_ace?$%Q��HL	!#

 "$'*/0�66Y[[>]x?zz[|�\�����������^~���!��	

24CHKOQSUWY[]_ace!��35CILPRTVXZ\^`bdfmv��
���!o
hj%
qr5)*00��������mv9��mnopqrstuvxyz{|}~������	

24CHKOQSUWY[]_ace\\&&))"";B//	 $'JKLMNOPQRSTU[\]^_`ab����MO@A[1���my����Rnnz�$?($%Q��HL��	

24CHKOQSUWY[]_ace%ooPK}$[�TB��Sgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_in_files.rhtmlnu�[���<div id="file-list-section" class="nav-section">
  <h3>Defined In</h3>

  <ul>
<%- klass.in_files.each do |tl| -%>
    <li><%= h tl.relative_name %>
<%- end -%>
  </ul>
</div>
PK}$[[�L�>>Ggems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/index.rhtmlnu�[���<body id="top" role="document" class="file">
<nav role="navigation">
  <div id="project-navigation">
    <%= render '_sidebar_navigation.rhtml' %>

    <%= render '_sidebar_search.rhtml' %>
  </div>

  <div id="project-metadata">
    <%= render '_sidebar_pages.rhtml' %>
    <%= render '_sidebar_classes.rhtml' %>
  </div>
</nav>

<main role="main">
<%- if @options.main_page and
      main_page = @files.find { |f| f.full_name == @options.main_page } then %>
<%= main_page.description %>
<%- else -%>
<p>This is the API documentation for <%= @title %>.
<%- end -%>
</main>
PK}$[�3�^^Igems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_footer.rhtmlnu�[���<footer id="validator-badges" role="contentinfo">
  <p><a href="https://validator.w3.org/check/referer">Validate</a>
  <p>Generated by <a href="https://ruby.github.io/rdoc/">RDoc</a> <%= RDoc::VERSION %>.
  <p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
</footer>
PK}$[B�Y��Ggems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/class.rhtmlnu�[���<body id="top" role="document" class="<%= klass.type %>">
<nav role="navigation">
  <div id="project-navigation">
    <%= render '_sidebar_navigation.rhtml' %>
    <%= render '_sidebar_search.rhtml' %>
  </div>

  <%= render '_sidebar_table_of_contents.rhtml' %>

  <div id="class-metadata">
    <%= render '_sidebar_sections.rhtml' %>
    <%= render '_sidebar_parent.rhtml' %>
    <%= render '_sidebar_includes.rhtml' %>
    <%= render '_sidebar_extends.rhtml' %>
    <%= render '_sidebar_methods.rhtml' %>
  </div>
</nav>

<main role="main" aria-labelledby="<%=h klass.aref %>">
  <h1 id="<%=h klass.aref %>" class="<%= klass.type %>">
    <%= klass.type %> <%= klass.full_name %>
  </h1>

  <section class="description">
    <%= klass.description %>
  </section>

  <%- klass.each_section do |section, constants, attributes| -%>
  <section id="<%= section.aref %>" class="documentation-section">
    <%- if section.title then -%>
    <header class="documentation-section-title">
      <h2>
        <%= section.title %>
      </h2>
      <span class="section-click-top">
        <a href="#top">&uarr; top</a>
      </span>
    </header>
    <%- end -%>

    <%- if section.comment then -%>
    <div>
      <%= section.description %>
    </div>
    <%- end -%>

    <%- unless constants.empty? then -%>
    <section class="constants-list">
      <header>
        <h3>Constants</h3>
      </header>
      <dl>
      <%- constants.each do |const| -%>
        <dt id="<%= const.name %>"><%= const.name %>
        <%- if const.comment then -%>
        <dd><%= const.description.strip %>
        <%- else -%>
        <dd class="missing-docs">(Not documented)
        <%- end -%>
      <%- end -%>
      </dl>
    </section>
    <%- end -%>

    <%- unless attributes.empty? then -%>
    <section class="attribute-method-details" class="method-section">
      <header>
        <h3>Attributes</h3>
      </header>

      <%- attributes.each do |attrib| -%>
      <div id="<%= attrib.aref %>" class="method-detail">
        <div class="method-heading attribute-method-heading">
          <span class="method-name"><%= h attrib.name %></span><span
            class="attribute-access-type">[<%= attrib.rw %>]</span>
        </div>

        <div class="method-description">
        <%- if attrib.comment then -%>
        <%= attrib.description.strip %>
        <%- else -%>
        <p class="missing-docs">(Not documented)
        <%- end -%>
        </div>
      </div>
      <%- end -%>
    </section>
    <%- end -%>

    <%- klass.methods_by_type(section).each do |type, visibilities|
       next if visibilities.empty?
       visibilities.each do |visibility, methods|
         next if methods.empty? %>
     <section id="<%= visibility %>-<%= type %>-<%= section.aref %>-method-details" class="method-section">
       <header>
         <h3><%= visibility.to_s.capitalize %> <%= type.capitalize %> Methods</h3>
       </header>

    <%- methods.each do |method| -%>
      <div id="<%= method.aref %>" class="method-detail <%= method.is_alias_for ? "method-alias" : '' %>">
        <%- if (call_seq = method.call_seq) then -%>
        <%-   call_seq.strip.split("\n").each_with_index do |call_seq, i| -%>
        <div class="method-heading">
          <span class="method-callseq">
            <%= h(call_seq.strip.
                  gsub( /^\w+\./m, '')).
                  gsub(/(.*)[-=]&gt;/, '\1&rarr;') %>
          </span>
          <%- if i == 0 and method.token_stream then -%>
          <span class="method-click-advice">click to toggle source</span>
          <%- end -%>
        </div>
        <%-   end -%>
        <%- else -%>
        <div class="method-heading">
          <span class="method-name"><%= h method.name %></span><span
            class="method-args"><%= h method.param_seq %></span>
          <%- if method.token_stream then -%>
          <span class="method-click-advice">click to toggle source</span>
          <%- end -%>
        </div>
        <%- end -%>

        <div class="method-description">
          <%- if method.comment then -%>
          <%= method.description.strip %>
          <%- else -%>
          <p class="missing-docs">(Not documented)
          <%- end -%>
          <%- if method.calls_super then -%>
            <div class="method-calls-super">
              Calls superclass method
              <%=
                  method.superclass_method ?
                  method.formatter.link(method.superclass_method.full_name, method.superclass_method.full_name) : nil
              %>
            </div>
          <%- end -%>

          <%- if method.token_stream then -%>
          <div class="method-source-code" id="<%= method.html_name %>-source">
            <pre><%= method.markup_code %></pre>
          </div>
          <%- end -%>
        </div>

        <%- unless method.aliases.empty? then -%>
        <div class="aliases">
          Also aliased as: <%= method.aliases.map do |aka|
            if aka.parent then # HACK lib/rexml/encodings
              %{<a href="#{klass.aref_to aka.path}">#{h aka.name}</a>}
            else
              h aka.name
            end
          end.join ", " %>
        </div>
        <%- end -%>

        <%- if method.is_alias_for then -%>
        <div class="aliases">
          Alias for: <a href="<%= klass.aref_to method.is_alias_for.path %>"><%= h method.is_alias_for.name %></a>
        </div>
        <%- end -%>
      </div>

    <%- end -%>
    </section>
  <%- end
     end %>
  </section>
<%- end -%>
</main>
PK}$[	O2]]Tgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtmlnu�[���<div id="home-section" class="nav-section">
  <h3>Documentation</h3>

  <ul>
  <%- installed.each do |name, href, exists, type, _| -%>
    <%- next if type == :extra -%>
    <li class="folder">
    <%- if exists then -%>
      <a href="<%= href %>"><%= h name %></a>
    <%- else -%>
      <%= h name %>
    <%- end -%>
  <%- end -%>
  </ul>
</div>
PK}$[
N��NNSgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/servlet_not_found.rhtmlnu�[���<body role="document">
<nav role="navigation">
  <%= render '_sidebar_navigation.rhtml' %>

  <%= render '_sidebar_search.rhtml' %>

  <div id="project-metadata">
    <%= render '_sidebar_pages.rhtml' %>
    <%= render '_sidebar_classes.rhtml' %>
  </div>
</nav>

<main role="main">
  <h1>Not Found</h1>

  <p><%= message %>
</main>

PK}$[��QCCSgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtmlnu�[���<%- unless klass.sections.length == 1 then %>
<div id="sections-section" class="nav-section">
  <h3>Sections</h3>

  <ul class="link-list" role="directory">
    <%- klass.sort_sections.each do |section| -%>
      <li><a href="#<%= section.aref %>"><%= h section.title %></a></li>
    <%- end -%>
  </ul>
</div>
<%- end -%>
PK}$[鿶�Sgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/table_of_contents.rhtmlnu�[���<body id="top" class="table-of-contents">
<main role="main">
<h1 class="class"><%= h @title %></h1>

<%- simple_files = @files.select { |f| f.text? } -%>
<%- unless simple_files.empty? then -%>
<h2 id="pages">Pages</h2>
<ul>
<%- simple_files.sort.each do |file| -%>
  <li class="file">
    <a href="<%= file.path %>"><%= h file.page_name %></a>
<%
   # HACK table_of_contents should not exist on Document
   table = file.parse(file.comment).table_of_contents
   unless table.empty? then %>
    <ul>
<%- table.each do |heading| -%>
      <li><a href="<%= file.path %>#<%= heading.aref %>"><%= heading.plain_html %></a>
<%-   end -%>
    </ul>
<%- end -%>
  </li>
  <%- end -%>
</ul>
<%- end -%>

<h2 id="classes">Classes and Modules</h2>
<ul>
<%- @modsort.each do |klass| -%>
  <li class="<%= klass.type %>">
    <a href="<%= klass.path %>"><%= klass.full_name %></a>
<%- table = []
   table.concat klass.parse(klass.comment_location).table_of_contents
   table.concat klass.section_contents

   unless table.empty? then %>
    <ul>
<%- table.each do |item| -%>
      <li><a href="<%= klass.path %>#<%= item.aref %>"><%= item.plain_html %></a>
<%-   end -%>
    </ul>
<%- end -%>
  </li>
<%- end -%>
</ul>

<h2 id="methods">Methods</h2>
<ul>
<%- @store.all_classes_and_modules.map do |mod|
     mod.method_list
   end.flatten.sort.each do |method| %>
  <li class="method">
    <a href="<%= method.path %>"><%= h method.pretty_name %></a>
    &mdash;
    <span class="container"><%= method.parent.full_name %></span>
<%- end -%>
</ul>
</main>
PK}$[^mqRgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_classes.rhtmlnu�[���<div id="classindex-section" class="nav-section">
  <h3>Class and Module Index</h3>

  <ul class="link-list">
  <%- @modsort.each do |index_klass| -%>
    <li><a href="<%= rel_prefix %>/<%= index_klass.path %>"><%= index_klass.full_name %></a>
  <%- end -%>
  </ul>
</div>
PK}$[E`��Rgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_methods.rhtmlnu�[���<%- unless klass.method_list.empty? then %>
<!-- Method Quickref -->
<div id="method-list-section" class="nav-section">
  <h3>Methods</h3>

  <ul class="link-list" role="directory">
    <%- klass.each_method do |meth| -%>
    <li <%- if meth.calls_super %>class="calls-super" <%- end %>><a href="#<%= meth.aref %>"><%= meth.singleton ? '::' : '#' %><%= h meth.name -%></a>
    <%- end -%>
  </ul>
</div>
<%- end -%>
PK}$[5����Sgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtmlnu�[���<%- unless klass.includes.empty? then %>
<div id="includes-section" class="nav-section">
  <h3>Included Modules</h3>

  <ul class="link-list">
  <%- klass.each_include do |inc| -%>
  <%- unless String === inc.module then -%>
    <li><a class="include" href="<%= klass.aref_to inc.module.path %>"><%= inc.module.full_name %></a>
  <%- else -%>
    <li><span class="include"><%= inc.name %></span>
  <%- end -%>
  <%- end -%>
  </ul>
</div>
<%- end -%>
PK}$[��Hgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/js/search.jsnu�[���Search = function(data, input, result) {
  this.data = data;
  this.input = input;
  this.result = result;

  this.current = null;
  this.view = this.result.parentNode;
  this.searcher = new Searcher(data.index);
  this.init();
}

Search.prototype = Object.assign({}, Navigation, new function() {
  var suid = 1;

  this.init = function() {
    var _this = this;
    var observer = function(e) {
      switch(e.keyCode) {
        case 38: // Event.KEY_UP
        case 40: // Event.KEY_DOWN
          return;
      }
      _this.search(_this.input.value);
    };
    this.input.addEventListener('keyup', observer);
    this.input.addEventListener('click', observer); // mac's clear field

    this.searcher.ready(function(results, isLast) {
      _this.addResults(results, isLast);
    })

    this.initNavigation();
    this.setNavigationActive(false);
  }

  this.search = function(value, selectFirstMatch) {
    value = value.trim().toLowerCase();
    if (value) {
      this.setNavigationActive(true);
    } else {
      this.setNavigationActive(false);
    }

    if (value == '') {
      this.lastQuery = value;
      this.result.innerHTML = '';
      this.result.setAttribute('aria-expanded', 'false');
      this.setNavigationActive(false);
    } else if (value != this.lastQuery) {
      this.lastQuery = value;
      this.result.setAttribute('aria-busy',     'true');
      this.result.setAttribute('aria-expanded', 'true');
      this.firstRun = true;
      this.searcher.find(value);
    }
  }

  this.addResults = function(results, isLast) {
    var target = this.result;
    if (this.firstRun && (results.length > 0 || isLast)) {
      this.current = null;
      this.result.innerHTML = '';
    }

    for (var i=0, l = results.length; i < l; i++) {
      var item = this.renderItem.call(this, results[i]);
      item.setAttribute('id', 'search-result-' + target.childElementCount);
      target.appendChild(item);
    };

    if (this.firstRun && results.length > 0) {
      this.firstRun = false;
      this.current = target.firstChild;
      this.current.classList.add('search-selected');
    }
    //TODO: ECMAScript
    //if (jQuery.browser.msie) this.$element[0].className += '';

    if (isLast) this.result.setAttribute('aria-busy', 'false');
  }

  this.move = function(isDown) {
    if (!this.current) return;
    var next = isDown ? this.current.nextElementSibling : this.current.previousElementSibling;
    if (next) {
      this.current.classList.remove('search-selected');
      next.classList.add('search-selected');
      this.input.setAttribute('aria-activedescendant', next.getAttribute('id'));
      this.scrollIntoView(next, this.view);
      this.current = next;
      this.input.value = next.firstChild.firstChild.text;
      this.input.select();
    }
    return true;
  }

  this.hlt = function(html) {
    return this.escapeHTML(html).
      replace(/\u0001/g, '<em>').
      replace(/\u0002/g, '</em>');
  }

  this.escapeHTML = function(html) {
    return html.replace(/[&<>]/g, function(c) {
      return '&#' + c.charCodeAt(0) + ';';
    });
  }

});

PK}$[��13	3	Jgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/js/darkfish.jsnu�[���/**
 *
 * Darkfish Page Functions
 * $Id: darkfish.js 53 2009-01-07 02:52:03Z deveiant $
 *
 * Author: Michael Granger <mgranger@laika.com>
 *
 */

/* Provide console simulation for firebug-less environments */
/*
if (!("console" in window) || !("firebug" in console)) {
  var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
    "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];

  window.console = {};
  for (var i = 0; i < names.length; ++i)
    window.console[names[i]] = function() {};
};
*/


function showSource( e ) {
  var target = e.target;
  while (!target.classList.contains('method-detail')) {
    target = target.parentNode;
  }
  if (typeof target !== "undefined" && target !== null) {
    target = target.querySelector('.method-source-code');
  }
  if (typeof target !== "undefined" && target !== null) {
    target.classList.toggle('active-menu')
  }
};

function hookSourceViews() {
  document.querySelectorAll('.method-heading').forEach(function (codeObject) {
    codeObject.addEventListener('click', showSource);
  });
};

function hookSearch() {
  var input  = document.querySelector('#search-field');
  var result = document.querySelector('#search-results');
  result.classList.remove("initially-hidden");

  var search_section = document.querySelector('#search-section');
  search_section.classList.remove("initially-hidden");

  var search = new Search(search_data, input, result);

  search.renderItem = function(result) {
    var li = document.createElement('li');
    var html = '';

    // TODO add relative path to <script> per-page
    html += '<p class="search-match"><a href="' + index_rel_prefix + result.path + '">' + this.hlt(result.title);
    if (result.params)
      html += '<span class="params">' + result.params + '</span>';
    html += '</a>';


    if (result.namespace)
      html += '<p class="search-namespace">' + this.hlt(result.namespace);

    if (result.snippet)
      html += '<div class="search-snippet">' + result.snippet + '</div>';

    li.innerHTML = html;

    return li;
  }

  search.select = function(result) {
    window.location.href = result.firstChild.firstChild.href;
  }

  search.scrollIntoView = search.scrollInWindow;
};

document.addEventListener('DOMContentLoaded', function() {
  hookSourceViews();
  hookSearch();
});
PK}$[g:��Sgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_VCS_info.rhtmlnu�[���<%- if !svninfo.empty? then %>
<div id="file-svninfo-section" class="nav-section">
  <h3>VCS Info</h3>

  <div class="section-body">
    <dl class="svninfo">
      <dt>Rev
      <dd><%= svninfo[:rev] %>

      <dt>Last Checked In
      <dd><%= svninfo[:commitdate].strftime('%Y-%m-%d %H:%M:%S') %>
        (<%= svninfo[:commitdelta] %> ago)

      <dt>Checked in by
      <dd><%= svninfo[:committer] %>
    </dl>
  </div>
</div>
<%- end -%>
PK}$[{wj�Ngems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/servlet_root.rhtmlnu�[���<body role="document">
<nav role="navigation">
  <div id="project-navigation">
    <div id="home-section" class="nav-section">
      <h2>
        <a href="<%= rel_prefix %>/" rel="home">Home</a>
      </h2>
    </div>

    <%= render '_sidebar_search.rhtml' %>
  </div>

<%= render '_sidebar_installed.rhtml' %>
</nav>

<main role="main">
  <h1>Local RDoc Documentation</h1>

  <p>Here you can browse local documentation from the ruby standard library and
  your installed gems.

<%- extra_dirs = installed.select { |_, _, _, type,| type == :extra } -%>
<%- unless extra_dirs.empty? -%>
  <h2>Extra Documentation Directories</h2>

  <p>The following additional documentation directories are available:</p>

  <ol>
  <%- extra_dirs.each do |name, href, exists, _, path| -%>
    <li>
    <%- if exists -%>
      <a href="<%= href %>"><%= h name %></a> (<%= h path %>)
    <%- else -%>
      <%= h name %> (<%= h path %>; <i>not available</i>)
    <%- end -%>
    </li>
  <%- end -%>
  </ol>
<%- end -%>

<%- gems = installed.select { |_, _, _, type,| type == :gem } -%>
<%- missing = gems.reject { |_, _, exists,| exists } -%>
<%- unless missing.empty? then -%>
  <h2>Missing Gem Documentation</h2>

  <p>You are missing documentation for some of your installed gems.
  You can install missing documentation for gems by running
  <kbd>gem rdoc --all</kbd>.  After installing the missing documentation you
  only need to reload this page.  The newly created documentation will
  automatically appear.

  <p>You can also install documentation for a specific gem by running one of
  the following commands.

  <ul>
  <%- names = missing.map { |name,| name.sub(/-([^-]*)$/, '') }.uniq -%>
  <%- names.each do |name| -%>
    <li><kbd>gem rdoc <%=h name %></kbd>
  <%- end -%>
  </ul>
<%- end -%>
</main>
PK}$[h˟�eePgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/tag_green.pngnu�[����PNG


IHDR�agAMA��7��tEXtSoftwareAdobe ImageReadyq�e<�IDAT8˅�I�a��O�Uÿ �{�bFc�N4FMt�n����-=�6c li4�BH!�(�dX�՗���.U�>����B�ZE�RA�\F�TB�XD�P�������}!���r��^�C2��^�@�I`�&���tl�$�ɝ�,S3M�D.��'�	��9�0�NCӴ�������Y6��)F?��2���m$	�b�
�@�W��H<���N��t͐x��j�D"�5��v���1o��f�����^���g��V�f�I.l���f����hě��9<��V��O�C|8��i4�>��C8%�J�lGk8�z����#�S�mȉr�X���Z�\@��{�x<.���`����^o�r�Ō��B�x<��^��'��j��}���U�����1���}Q�W��hT��]"�k�L|�s���n���ێ#�~�ߢK\}b���x'�BQ'{i��^�o�PȲ��z��].�c�)��weS�L|iW��(��SIEND�B`�PK}$[�=V��Zgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/bullet_toggle_minus.pngnu�[����PNG


IHDR��7�gAMA��7��tEXtSoftwareAdobe ImageReadyq�e<aIDAT(�c�π2�Q��������+�/ދE����p�,
�%ւ��)X���C�۱)X�dB=6���P�M��u]�[�z+����_70!I�ȓzS5��IEND�B`�PK}$[�S�Jgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/bug.pngnu�[����PNG


IHDR�agAMA��7��tEXtSoftwareAdobe ImageReadyq�e<�IDAT8˝��OSQ�\^[�تtz��%l$�*�**�2:�
iRp�����
�c0���ąKw&&`44���(�e��K�ɽ�w�wrO��X�\���Hi�s�cUQz@��������;քId�Taˀ���)j���C'يKT��8=����ʯ�9ނ^z�����Θ���1OF�Z�[��W�-G�z�?���&�%*��M���Gn�N!�aO>Nc��[ɨX·��0N��qg*�1Su��b|�{g|�fz)̾����&\
��5\	�0	�3�i�D��;`|�0>A?Tx4^���`�o�qs��`>ʦ�`��fC��v�@m�X����[r\���At.��)�G�[Ì�����`��N1���)�B������W�s+�:�Nd��s�V�a�*D�X.pB�&B�]���H@T�3@�Pڏڠ	wV�P6��3yp-�����4�Ǽ

�$�H�'��9��{m@�U�$�ZjC���X�:T��g����L�:�:�?��[#��{1��P=.2���F\�i���A-D
7�7q��XI��פb4�ka��Aj�%
ͼj&Q˫H��&�s.��
`�j������KLE3�*ΫXw�6��_�l���=�@�����h�ߊv��,qq��IEND�B`�PK}$[0���Lgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/brick.pngnu�[����PNG


IHDR��7�gAMA��7��tEXtSoftwareAdobe ImageReadyq�e<VIDAT�?HT��ݝ��^ٟ�
ju
��ɥ����pOhi/���8ԩ�!�p*��0��Ў��;��}E�,tn�M2��|13 "by��K�$i�^NFD��Й�;��4eZ|�U�j|��jf^��$ig)kY�b�I��u�K��W��P�cJ'U>�4�MK����B݆�eS��J���tO9�iԄ
�ʆ���n#2����u`� *�����_�
�R4���+�*����B����u���Ϙ�MY�U׷o���AaL��G��۽�kE�|"�2w��9�m�[�y�Gw�S��B�3{��e�r�~�㫹��<�{
@���%
�@�IEND�B`�PK}$[$V���Rgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/macFFBgHack.pngnu�[����PNG


IHDR��csBIT|d�	pHYs��~�tEXtSoftwareAdobe Fireworks CS3��FtEXtCreation Time7/16/07Z��(IDATH���A0!��U[
Gϱ�JJJJJJJJJ�Y�����IEND�B`�PK}$[�Z�mmQgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/page_green.pngnu�[����PNG


IHDR�agAMA��7��tEXtSoftwareAdobe ImageReadyq�e<�IDAT�?��s��~~���TI�!!�b�F� ,H8���b�1a5�l�
�N�QB� b`�^8M�A��~����y*��޿�����\�)(��0���k��������J�������i�ΆIH ���q�����~����{�СM�кOg��Ԫ(2X2�s��,�}�O>�};���x��3o}~�W�tܠ��$��S�j�bjLEMa8�����y�޿��ww>�����J�Ҫ�*m*��u�=g6=W�|�v�jz
:@B�(%U�Z��4�\��1���m��f��j"�j��A�ƚ6��hT��*J	�V��ZJZ$@�1�0PHZ�(}
)B�e����� @)zc�Ԋe����0�2FH����d�#�����W?�9��</����;���C�9�A��x�y���轍y3t�-�;��w^�t'I����WM����eС*>��W����i!�Gc��{s��ގl6�IEND�B`�PK}$[���(VVVgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/page_white_text.pngnu�[����PNG


IHDR��7�gAMA��7��tEXtSoftwareAdobe ImageReadyq�e<�IDAT�1nSA��Ǟ�4A����(�I�Sp.KPp"��Q�A�7%����1Ӣ�;���+���Z######����DWk=�C��?����|��X��j�9昇���S�ekMs9���NNV��G@���kD)��4�hn�������.Q�@�nJ)1]:�;1@���T��:�t���i��:���I�$fM��-�+g�]����^LvIEND�B`�PK}$[�P��Mgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/delete.pngnu�[����PNG


IHDR�agAMA��7��tEXtSoftwareAdobe ImageReadyq�e<]IDAT8˥��KSa�[���n��QP��2w��ܦγL�[,bi��a�A��\�C��v��_2Ml�ZFjס���NMjm��kʷ�`&.#z�����<ϓ ���bV��P�T3�%�I��{G��qRiv�ȅ�
�tz�#E��6����Edd���J�`���DR�2<]N��;�4�Ѿ;���m>�7��8��ɀQe6�L�I���t��殷c�q!z�|v��j�/Xi���@��
�%1|h���l� !���|������!
�Y#�u�U�N�w]�˼H3��u�	t]E��>k%�I�f��o���R��D:�0��`�~�|�
���(r�
�on�3oG0!�$����V��
�*[W0_������-+���� d��W�&�2�ZfMF��VJp�iF&B��
>��R���g�-� �~	C�m��ڴ���ER�
ឫ� p�5ްy����+��21���K�aw�h�`� ��#���a�Z񽞆�T�Zo���L��ѓ���`"�(?��'��ˎJv�K�ކ��|�:�G9[�a�w8�2
Jw��f'��y����m�zsӘ��Tsw��_��_��ιIr�IEND�B`�PK}$[Os~���Jgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/add.pngnu�[����PNG


IHDR�agAMA��7��tEXtSoftwareAdobe ImageReadyq�e<oIDAT8˥��K�a��[�/���Y(�)%X(o�l��Nۖsk��n.���-����h�;8�f���E��P��"jï��MGˈ�}yພ羹�$I���.t�u���lu���	AX��:�𼂒Z�H�h1�D�nZJ�OJB��{�Z����?�`2`��S���=�N$��ő�=;��a��&j�w��q�JG�#�<"N���2h8�޵`��6���x�ցn_+~��Zto��}`���x%XЛ͈	hXѿ�ƻ/��}���B�J�_G�&�|Q�r-��6��AރEL�⬡\�U3:WUh[�C6+�	6.f� �*��K͸ܝF��q�����ou4܄?�d�|X���ҥ�Mv��D`�
*_���[
���#A���2��0li��R�|x�q`4w=\������u�Q	��m+G��|%$��5��Թ���5�RO*�YGM��UO��G�qj4ְ(X�&
s1�c�˭(LV�f�
R���d�j��Q	'-1��A�TA>U	�j4,�p�V�"4L$e�@.ArB���Y a~m�y���Y])Q8tN�L���ܞt2��"��I	���
�o=C�S��d�)�_��_�AF�(�IEND�B`�PK}$[�CCJUUNgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/package.pngnu�[����PNG


IHDR�agAMA��7��tEXtSoftwareAdobe ImageReadyq�e<�IDAT8�}�Kh\u��{g�̝4�L���)�B�1>�n\��F��)��PAD��Q�TWf!�"؍�����`�HC0ijC�1ͳ��L�fw���(v!�g}�6�9���)wyc�/T4�"����Գ�X�8ѫ������̛v���כ*��������WGU}[E>����7�&����t�Ji�G�+*rQE�>�{�	`�����=�����9o/ror��g�aw=MЪ�U��Q��VcƏ�;}ź;q�D�>��r��7j�T�1a��U&m�8�6��l7K���Vio{�Ǥ9s���VԨ�,O"a��Wū���mpt�k��.h-��V}�����֯K��*�R�\�M�-Юޡ�'O�'C�U0)�7����9Ms�&�3�P#����V
'w'�ů� �
N,�o��p���#�LRi4�Q�j��h�]��G�S\���;Q���Ƥ��B�H��`�1����@<Ѐd�^�{�9�]� �!���"���dlǁD�	@|0mp��
���Q���
a+��k��K7����
�"$���� h$?$�B�r�N#&Cif
�N�7�S���V[�6��l�a�L/Hb�F�6�t����X�=�ֽɕد}��GO�|뻗zU�C5r���h�8�D>��)4V�w���ͦ�|�"������L\>2�FΫ�[�^y�jW��?�'q{�g�Bi��o�.��ȧ��T��c��t�ܲ^&��IEND�B`�PK}$[(?�Y��Sgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/bullet_black.pngnu�[����PNG


IHDR��7�gAMA��7��tEXtSoftwareAdobe ImageReadyq�e<eIDAT(�c�π2.�R�
�We��7JaWА�����\
X�]��?���XH^��?���
��7��3`��[����*60H
ڐ��s���VIEND�B`�PK}$[���<XXOgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/tag_blue.pngnu�[����PNG


IHDR�agAMA��7��iCCPICC Profilex�T�k�P��e���:g	>h�ndStC��kW��Z�6�!H��m\��$�~�ًo:�w�>�كo{�
�a���"L�"���4M'S�����9'��^��qZ�/USO������^C+�hM��J&G@Ӳy���lt�o߫�c՚�� ��5�"�Y�i\�t�։�15��LsX�	g8oc�ግ#�f45@�	��B:K�@8�i��
�΁�'&��.�<�ER/�dE���s��_���雭��m�N�|��9}p���?_�A��pX6�5~B�$�&���ti��e��Y)%$�bT�3li�������P���4�43Y���P��1��KF��ۑ��5>�)�@����r��y������[�:V���ͦ#��wQ?HB��d(�Ba�cĪ�L"J��itTy�8�;(���Gx�_�^�[�����%׎��ŷ��Q�麲�ua��n�7��m�Q���H^e�O�Q�u6�S��u�2��%vX���^�*l
O�—����ޭˀq,>��S���%�L��d����B���1CZ��$M��9��P'w����\/����]��.r#���E|!�3�>_�o�a�۾�d�1Z�ӑ���z���'�=������~V+��cjJ�tO%mN�����|��-���bW�O+
o�^�I�H�.�;���S�]�i_s9�*p����.7U^��s.�3u�	�|^,��<����;�c�=ma��>V��t.[��՟Ϫ����x���#
�¡_2	pHYs��diTXtXML:com.adobe.xmp<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 4.4.0">
   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
      <rdf:Description rdf:about=""
            xmlns:xmp="http://ns.adobe.com/xap/1.0/">
         <xmp:CreatorTool>Adobe ImageReady</xmp:CreatorTool>
      </rdf:Description>
   </rdf:RDF>
</x:xmpmeta>
�z`IDAT8}RMka~vW#�j-�V�&ZjR
��B��"�Q�����!z�R!��JA��"��T	~zi*U��̶��G_�ݝ}g��yEQp�:::�+��z2��t�~&΍�o*��L�o�$��d2�e�e�
'�V @4�3H6��DX�0O���@(R���m���F�ٍ��od��F���ɾ͇xU�p:<"��N�����T�d�}����\��3��,@��A�Z�������r��r��7�!��� ��tZ����W�w��F��_�Z�>���lhR���lޢl�k1��<\�ؼ
��*��q:����Z�UB:������{ے�ܡP�@M���elۀ^��z�>�:�D"1�iX��Z
{�e<��)iJl�
E�n)�ev��`PO�y����db=;;C��X��.�c���k�1k&8�j���ר_���d��{~?j�c�fi�R�ԡs�b��O����A����9��&�yd�V;�8�����$�p.r�=�XL���v�}�@!Oa�X,*�C�;���z�����J��n���Y�T��a�B��!�^�L{n�7��k���IEND�B`�PK}$[��AaaRgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/transparent.pngnu�[����PNG


IHDR%=m"PLTE������tRNS@��fIDATc` 
0���zIEND�B`�PK}$[��Q��Wgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/loadingAnimation.gifnu�[���GIF89a�
���������������������������������������������������������������!�NETSCAPE2.0!�
,�
� �@Ri�h��l�p,�tm�#6N���+�r��rD4�h��@F�Cjz]L�����j�]﹬�R���3-���H$w�Py���|KI��������\K�������Q\���]P��I������������~$�
~�	
��������������������������J�������������������%:`���@X�P@AO	2|�(�D��**�H�E�}l�F�=��$��Ƌ@\9��L�J(��)?�

``��C�=�4�RO@�>}5�TDU�^=�U�Q�H�~���X�e���֫��:<��!���b`�^O�v��y':<�/%Ƅ��E��n`ʎ3A�����Ɗ�~�`�۸Rf*�4�L����E3��DZ�[�����FU��պ�g*>|Ao��G��4Q�]���V;��ޙ
<��G)��}����SvO�<}��&p���y��]�Xg
X�
�`�"1���A� fJh!�B2�8'�m
��uљtbj)򖜊��H	s6.7�L;jԣJ?���p6���l�@k[���-)��P��V�X���fQ9�{f�ĥZ^v	&��0�
l���p�)g9P!�
,�� EMb��T��5+��k��sl�y���[�J;��w3iH�ʒ:�Q��X�R$�Á��511��@��eg;=��(g�ڙ��n%pf�"�|��w}��zv[xE%`	+�%		�����1"	
��������1������������������Ʒ�1��++�'i1֘~���~������%�t����"�����������ݫ'�$|dЉ'N�7o%p�Dz�:�)�D����H�$��D��E��tl���̑5żlP�4	#��y��5��S�RzC>� j��U���z�ҧ]�$�j�QM
ʆķ��772�1@ܒ�DH�;܋%Ѕ���q��ۛX���M�g����Nά�g�MWz!`���d���ѥ]���uj��a��}�aݸ�6;�5լD�zT�h,5�~�z~�@y[�:�3M�7�g�G�]�����q�=@c5

4�u����흃�5_���_9���_A�Mt�B\���Kⵘ}" @l��D�i��Qu�+b�aq&��{#'�L�H�jz��"$&�� �$B!�
,�� EI���@*�P�R*;ò[������L���l7DҎ�%�G�I�0)���m��IԲ�����`��I��}>ă�}-R�wFu�}y�|O�(p�*�"�rt�{R��A>(
�^(		�"��4���	
����3������������3��3���.�.����Чɞ

v.*o3��u���z���z����(�	����D���.��z�Ha ���р�P����*6���=�%������8��A%ϤH�]J��Q&����2�L��z�녆Aɔ>50j�(�]�T�.�s
�*�I�@m:n�Tx^7�}�v(�H�y�!8�/�
��4^ֹ��Gi`z��A�"��?l�8�]�'STҧX�*3��@X��MS<@�蜮-�.���/A��y5��|��U�v�۬�ϰ�V�r�4<A:\�4��bm��dv�i��{˿�ӛ�W��'7��n�����a��q{�"8V�_��u_^���2���_��[k��o�Tpbp
:��M
�s�k�x_"Vؓ��!�
,�� %R�4�y�ԬԢ���\�K���٩��l'#���Q�<�P:��A*�4� G����Z����L���nq�,���I�\��EoI�Uzqx#)��_"�"
����0��0���+�0�#��#�I�"����'�����2�0��	q�+��t�'����k���`���n�����܀�#�����|�2�aq�Vk������oE�f
NC��})Tǐ`���R8��ć=��5��&�D9�ۦZ�{�@滗1M�۴��͇)�Ty��N39]Ʊ�A�o���V
j�>Z0ՠV�T�y����ïe�]U���4�f!P�c0z��kW+_��^��ў`v�"�Ŋa@x:@O,��Ȭt�K5�z�sR�tH5�y3�ʥ�>yz=�3[/�Z|��&�����x@��7n��Gd�n� �B�^��|{Z�C�N�3�Z�&$�p�{f�;^C}C���o� ���%!�
,�� %�$5��,%�:��k��.]�#>�����	�B"�ZRp�]2�S���hk�9�E�-�e<ͩ��k�Gj6�-��t������wsz|m���OQti����x��41
)
�U"		���	�B������Q
��������B������)��������#����B+u���	�)�ێ����#��������"�����p��g�߿=�Q�Ǎ��P�aQ��*֑X�b<88����l$�����Q,?�	y2��=0յT#r�Η5��
�9`jLmgT�J�2��M�Wy6�jukիK�y�0�i��P0J�Cg&(`���oq]�혗']u}C* ���^\sx�a��GtKpeÈa�@��j�v�l�g�V�D�z$�ͣQ�>m�b��1�����6�}�4 @�l�`Ѫ�zvs�Gt�2y֐��/V+��S��NJ=^����"�+Y �	09ڛ>0}���Lj��`���ab�q�O
��'8^�X�d����|5 [��ahW�Y��7֑W6!��i���!��qHX�&�(@�3�&B!�
,�� Q$�@RS��"��	�k;��	S�]�3X'���+�ζS
���tUi���k���`��m��0���c�]���w��l��dt$v}��k~zq,l��ryu�x��?)B��		����
�����;	�0��0�����;�����+	��­�����G�0-g��+�	���.z�����%�������$��z��������+�l�(jx�9hN����t�<�; 8O��7�y�xH#�|�����bH�$ѼLip�ȅѐ�
��2"��-��A��(���P�$��tj�@{��s(W��$( ��=�!u�5��(�jm�nwmĸo����A���@w/��������d�1+:'���l��1�f��#�|,z2�0Hg�������@1}�թٯ�[��3�S�+|�7U�ǃ�.�{��P卵0ʶc=+PL�0�3�:~���p��'����v{��O��n<����~)�@��u�P6
��k(����àK'v�K
V�`I�9(Z�L�G!!�
,�� �PeRN*�'�,Ԣ���v*�o<�����bK�s M��3�k>o�����R��sAE1f�m):��k��v���v�M{w�l
��r�tqPm�|��uF~�?W	a3�&
���A�6��������6	�-�����3���-	����.�,����6o3/h��-��o���	������'�d�����z���z��&�����(�CGo߉O���a��9ќD=
�kOOEuj(�Ǒ�L����ʏ�T��IR&K�.��H���=�����
�t��tI��£B�0E:qjԪP������h�Y��‰	ʾ�B�F�dÎT0@�ܝK!Aݽ_�aw�9��hP�(�!Ѣ,�f�ʓmZ�,r��Ɲ[|.��1鑣wZ���h%�.�:�^m�Ri綽7V޿}c\����u�;o�>o���ü��u+],E�b��d]/\��.������*h�3�;��߯��~�����
��|H�oXg���6�]����	!!�
,�� E9�$�#%5(�,Ԓr��(i�0.����݊�`lXt��D%�ydJ�6���H�^�.�p���l��[k�=.˿�(>�S�x~�gypv}�lNtj�x�{e>	�(	�~~	
�����-������-����,-�(���������������'�e-/p��(��u�'����"�	�����u�������������GN�
����šL��1��:�I<���9u���G '��9��cɕ-Q�$��L�'lD���7U�T��T��ׄ �t�Ѧ�BU�@%J��JŪ�)W?L�S��Y	�b��Zvm��މ���Б]x�F�0�I�{�V�Xg�|��-Bf�E��#��|.@�4O���P4�u8S
g֥_�n�;Ө՞�(�բQ�)����wǮ<.�(��ʳ2?�����eG��|L�Յ"x�/��-���/�y��+,�p=E��1�� �d�Q��ٷ�~��2Kꔛ$���r
`m*Ys�C
zFn� ak}��nn��I#�����Q!�
,�� %R�4��Ԝ"CA,���(~ں8׼د��DA֐���2hs��݌�+�p]���ˤ�Ob��K��w8^>��u�z�`�H~htkv"x�m��|1Z,
���-���#�5��1"�1�����'���'�[�#����,�
��,},�'�	p�#��h�1�w���a�������"��������w��#�p�"b�1��V-��ak�c���B�)��P@�;�]Xq�Č#N�-A�"߲Syr����L�4eM�ʚph�\@�e�q/o��	���D2(𯘳q��s:g��u@��Fu+��Q�AU���ӯZ��#xbR����4�v�G1��
M�����ɻ���;8F�P`B۩3he�11O~�	�˟��>z�(�C�3���A=��\���Z-�ڇ�A����a��-qiS�R�����Ym�G�(�1���;��Ž��=dt�q�B�[���!�	
,�
� %�di�h��l�p,�4�0T:�Ԕ��n琘�9␄\����<
�P)�J�Z���+^�f�(��-N	�Ǥ4��an��t#o~$z|u�#��Svx��@��������"�'�������%	�#m#	���S���%�
���	��$��%�§	������#���ְ��ͽ�$�&	A��"����%���$��#��H݃'/�9�����BH
Ed�O�C�)L��q#F�o�	��g�B��b�DIʤC������'C��Rg̙G��	4^M=<iEj0�ћM�-0��R=��jB+î��{u,H�YÖ$+vhP�z�z�$W-]���&������=���-�>F\�dd��3 X�堙Kl��٣�̊@��@���T��?}��IV�UT+��������o�l�|gr�
T�e��lu�ӭ��ޒ�v��G�]l<ݑ�sg��_D
�)4E�Q����_i���)�Pi#���!h Da
%���.@��q�M��OQ	`�pn��yHW��C�"�$�s*
��]hp$��V
8��<��c!;PK}$[J���Kgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/find.pngnu�[����PNG


IHDR�agAMA��7��tEXtSoftwareAdobe ImageReadyq�e<%IDAT8�c���?%���4��y�dÞ����'/Xf�Ʀ�"ʀ��G�vi�QT�o���@���5 )����%�k;��o�4�����7��Y%u��Z�bV����Ty�E��,X�����ݣ�o6ة��m�=���x��)k����?"����e�KZ��帹y�����L���e����?��	��'��?e���}K��j���m�ѹ�Ó�.dfay����6�\V���o��]Z�������9�մ�6�\�K/�b�Ĭ`�
*Y�Bc~Z�:��
��ola�_[�����S1qI��bR����/*.�����?##�;�L�@�	�:
�]��_����@�$������e��;��@1��/x%�|���W4�
��|F�=c� 9��WA12 5��za�N�?(8����S����SQE�QBZ�(�`�‚���?�֎n�x% �P`�����_IU�
�P,��a�j(��X���@��K�*��п�9����}�c�e&R1�2h�Z<uIEND�B`�PK}$[
�OOMgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/plugin.pngnu�[����PNG


IHDR�agAMA��7��tEXtSoftwareAdobe ImageReadyq�e<�IDAT8˥�=H�q��f~\?��,��yoX�{KC��7�PcM�5�4EkS$�8V*w����J�B%��{�s^1㪋g9�����9IDp�8��ラ�%w%I�
=���@]m�v�bS?��|b��~��?��Gժi�lT70��������p��,�@ۙ�ܘ^�Y3�$ՙO�<o�a ��x8A�܉�BW!�����!JB�x8K?�Y�\����z܃S�<f����R�DKC�������Pf'� ��h����af��WãI��n�]�BW��)䎇�p��!Gos�A�MN���X���	�0eY[�ra�B�A���m����h=ڊ�I#͘�0���6�1;����Ū���3Q�@s�e
���p�k_�;+���?R15�S_?q���9�*�H�3��ɞ����`�!w������2/��L.�\��c�Ie��صf|��Ĕ�b��`���M �o��w=��_��m�6E�XIEND�B`�PK}$[=k��Ygems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/bullet_toggle_plus.pngnu�[����PNG


IHDR��7�gAMA��7��tEXtSoftwareAdobe ImageReadyq�e<cIDAT(�c�π2�Q��������+�/ދE����p�,
�%��ć�O��`
P�oǦ`1�	���BrC6�u�o�_�?��$�
}J ƦgIEND�B`�PK}$[>�)oHHTgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/wrench_orange.pngnu�[����PNG


IHDR�agAMA��7��tEXtSoftwareAdobe ImageReadyq�e<�IDAT8˕��kSQ��8H)N]uA,����w��j�azcbb6���&�	Qcn^b4b2e	�l� x�W�
}$�����9�X��t:�$��n"�0����T8�J)N��!��h4ʉ�F��|�p8|2�X,f��[����͵`0������S���~�O�Z%
}
��i�z=�n���H�X��t:4
��"�B�r�L�R��tv�_�T'�-�l��u��&f_���u�R�����l6� �u]e�
�5~lޢ�n����z�{�e�j���jU��i�w��|}�������?��$����&������x
�r��|TN��%��*4�Ç l��;'T�^�ٗG<����"pF�ୌw��!y��h�ݔ��e��E���6��	�
ܙצ���P���J��:�C\DW�^���,<<�4���A����	�ѹ�]��s��6�ޑ�����IEND�B`�PK}$[7��Kgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/zoom.pngnu�[����PNG


IHDR�agAMA��7��tEXtSoftwareAdobe ImageReadyq�e<FIDAT8ˍ�KH�A���̪-��K�C=�
�Cm�fu�P��)D��B�"�K�$A�
e��t�����J��Z�yu�m���0�}f~3#�sL��|!!|g-V�9��Q�鎺��c�`��T���C8*�����5�b�F'��R!D�Ћ�
�kb�^sP��!��������Loc��g�ע≣�.=^u��֘����[�
���65�޶FG��� �!�� P
�%wN5�\��q=(�t@ȀѶ(t2)է�"�L?B�2�uXcY��V$�����&����a]c��t����<��*����Q��1��}E	)h��Y����ҁ�갎����6`�D�Xr<:=UR���̞��O���9��8�*}�V&b==h��ցq�ف�+;�˜�JT<������������A�!C�:����̼�}�nAH��~0b�M���36��+�/痗����s�IĢ̾�����Ek����J{�v��!���=_�M�yK�b]�ö�a��{6W�03�<U��=�c�@_��@,�/fg�kM�q�?)�+��H�IEND�B`�PK}$["�55Wgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/page_white_width.pngnu�[����PNG


IHDR��7�gAMA��7��tEXtSoftwareAdobe ImageReadyq�e<�IDAT(υ�A�0E��֕n\x���qob♼��R�w(���g�I�u2�U��5�S����6�VX���ʲJ6Yhl�Oe<�Ƥj�56�S&����5���n�2 ��,��be�%,r�[;�z�ֳ��
X`���<�Ɛ�dz�B����7|�!A��/�n2=V����Y����r�o� v��ZdIEND�B`�PK}$[��U�ttOgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/arrow_up.pngnu�[����PNG


IHDR�agAMA��7��tEXtSoftwareAdobe ImageReadyq�e<IDAT8˥�?/Q�ϲ��hg5��j%�'��F,[
���LH��	3�(���v��w�=�fcoN{O~9���VM4Q7ܿ�)v/�WQ����=��&���b����p�S�O�������^��'&^:\˨6���eND!&� ���9꒣�_|�?\����s���r�x�,�����g�*,(F�#d[�O���aAA�*�P
p1����O+C�$`�)����*�w`A��#�0�$���	�*�?�����b&N�RIEND�B`�PK}$[R�7���Qgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/brick_link.pngnu�[����PNG


IHDR�agAMA��7��tEXtSoftwareAdobe ImageReadyq�e<�IDAT8�mR�K�Q����	-f=��?�I�ZT�v��rpm�EDR-*"+RJ,+"ZLR�.JŢ��>DÔ��?��R;��c����}��s�}W��b{{����Jlff�`��[��%��n�Js.��Û/�ZA���8>>F�P@>������5�}q$	{�_���Kx<�B!���y�+q�����IE���auuN�S�1st���ppp�LMM���;99���G ��T/=/����������
LNN�aO�d2H$8;;��9�pzzZt�xgg�p^�W"bbbBU���$A:����-"������W�U9D6nnnJ����JUUqss�d2�X,&U����]�H�tF'$���fS����4
�x\>C����v����XZZ������d�j�r��*���^�G�Q�R)������ג�c���t�]��l6G�M��r�����������8��������d���0���e\SS���$immMW��p�544�zzz�Ipuu�^���u90�_�9�������>�������^WTT|�	������P]]���:	�$����A����W���Ã��w�{5n���ZZZ���&c��]�5�}EP^^�����`�0��,˃�ccc�W�/"֘�kX����Y�j�IEND�B`�PK}$[��bbMgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/wrench.pngnu�[����PNG


IHDR�agAMA��7��tEXtSoftwareAdobe ImageReadyq�e<�IDAT8˕��oQ�_�[�c�+W.]�х�i��5 g�m���J[F�q����#_�)�qո��;,��@��{�;���upL�TʙH$�(Z� X��M��ɤ���n�i"��\nt:�}��yD���	�<o��u]�q�}���,���5Q�X��j�P*��DޅB!5�ɠ�l�����X�2�|X��P�VQ( IEA�X���k�
ί���:�lU*h�{-��PU�,����n�	�Y���>�����0�\�ږIU���4(�r�����
�HM�k̈��_���4��_z����iy�'�"[�
��n1��rM���_�A�`b���=$Ik�_p-�q�S~����=li~3�Bv"q�Z�A���ԧ̸�r�[��G���]<&�e�!�'ڸ67	�y��q�$O�X!�=_��~1�Gs�~�E��ZQ�x&qW��K3��!ޤ�u��n�kz�Grj�Q�n�IEND�B`�PK}$[�ErrKgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/date.pngnu�[����PNG


IHDR�agAMA��7��tEXtSoftwareAdobe ImageReadyq�e<IDAT8˕RmkA~�ԋ�K$��5X�%� �ǂ!��#�?P��@P�Z(*E�A�#�ܹۙ�w��:�0�;3ϼ�@J	���f?W��o�L����`
�O�Z�+���M������<�ww�
^�I���ś�K�����Z��Rj�F�NV0+�v�E8�q ���+��bF"�v���s��;�4t��� ��>9�ck��t���yx�	��D��7��гm\P���S�t�]�Io�@��#�/�د���)�[�f����^ѻ�#dHk��b�G"������uݿ�q�\.X��c8�Y��h��H������|�r��}�/�!�F���s�R�B�(�������]���j�T5���V��?ZxY�l6���s�d2Qg��wp�d����C2���p8�A���厊����*��X,¢��<�}"�W����
����
8s"��j�R-�-tiM�1�e�K�
���l�T*=L��/�F�#�C�7~��
-:MW1��IEND�B`�PK}$[#۸�PPKgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/ruby.pngnu�[����PNG


IHDR�agAMA��7��tEXtSoftwareAdobe ImageReadyq�e<�IDAT8�͓�K�Q���&*z��(	z�2��4��r�!��\e7�7�V"�x!bT7�R*�c�
�<��|���|:[WAD�>���9���{L�i'�v����%IID=z�/�;��"�\k��޸)�k�u�9��x�]2��$��W0=
��������$��Q��H�>}F|`���n6ϜϤkN7
>��9LL��(,.�������}>ּ^��
��OMM|��%꿏�:/T]�F$�6VW)��)t��5����F�K�����ò�Qq"��r�f ��y_�O�a|	���p�HJ�*MT��X8��[^D��r���-|��|[��v(33���!�.���44���NJ�e�bʡr�טu�͚�d�+��@� S[K���o~TK��r�j�k������ora��P�DP��y5�@Y�?i�܅��Sg��@'�˼Zj��_M�5���̻��w��.�;�'5�ڿ_���IEND�B`�PK}$[���zzQgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_parent.rhtmlnu�[���<%- if klass.type == 'class' then %>
<div id="parent-class-section" class="nav-section">
  <h3>Parent</h3>

  <%- if klass.superclass and not String === klass.superclass then -%>
  <p class="link"><a href="<%= klass.aref_to klass.superclass.path %>"><%= klass.superclass.full_name %></a>
  <%- else -%>
  <p class="link"><%= klass.superclass %>
  <%- end -%>
</div>
<%- end -%>
PK}$[�޹�Ugems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_navigation.rhtmlnu�[���<div id="home-section" role="region" title="Quick navigation" class="nav-section">
  <h2>
    <a href="<%= rel_prefix %>/index.html" rel="home">Home</a>
  </h2>

  <div id="table-of-contents-navigation">
    <a href="<%= rel_prefix %>/table_of_contents.html#pages">Pages</a>
    <a href="<%= rel_prefix %>/table_of_contents.html#classes">Classes</a>
    <a href="<%= rel_prefix %>/table_of_contents.html#methods">Methods</a>
  </div>
</div>
PK}$[3����Rgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtmlnu�[���<%- unless klass.extends.empty? then %>
<div id="extends-section" class="nav-section">
  <h3>Extended With Modules</h3>

  <ul class="link-list">
    <%- klass.each_extend do |ext| -%>
  <%- unless String === ext.module then -%>
    <li><a class="extend" href="<%= klass.aref_to ext.module.path %>"><%= ext.module.full_name %></a>
  <%- else -%>
    <li><span class="extend"><%= ext.name %></span>
  <%- end -%>
  <%- end -%>
  </ul>
</div>
<%- end -%>
PK}$[��o�'�'Hgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/css/rdoc.cssnu�[���/*
 * "Darkfish" Rdoc CSS
 * $Id: rdoc.css 54 2009-01-27 01:09:48Z deveiant $
 *
 * Author: Michael Granger <ged@FaerieMUD.org>
 *
 */

/* vim: ft=css et sw=2 ts=2 sts=2 */
/* Base Green is: #6C8C22 */

.hide { display: none !important; }

* { padding: 0; margin: 0; }

body {
  background: #fafafa;
  font-family: Lato, sans-serif;
  font-weight: 300;
}

h1 span,
h2 span,
h3 span,
h4 span,
h5 span,
h6 span {
  position: relative;

  display: none;
  padding-left: 1em;
  line-height: 0;
  vertical-align: baseline;
  font-size: 10px;
}

h1 span { top: -1.3em; }
h2 span { top: -1.2em; }
h3 span { top: -1.0em; }
h4 span { top: -0.8em; }
h5 span { top: -0.5em; }
h6 span { top: -0.5em; }

h1:hover span,
h2:hover span,
h3:hover span,
h4:hover span,
h5:hover span,
h6:hover span {
  display: inline;
}

h1:target,
h2:target,
h3:target,
h4:target,
h5:target,
h6:target {
  margin-left: -10px;
  border-left: 10px solid #f1edba;
}

:link,
:visited {
  color: #6C8C22;
  text-decoration: none;
}

:link:hover,
:visited:hover {
  border-bottom: 1px dotted #6C8C22;
}

code,
pre {
  font-family: "Source Code Pro", Monaco, monospace;
  background-color: rgba(27,31,35,0.05);
  padding: 0em 0.2em;
  border-radius: 0.2em;
}

table {
  margin: 0;
  border-spacing: 0;
  border-collapse: collapse;
}

table tr th, table tr td {
  padding: 0.2em 0.4em;
  border: 1px solid #ccc;
}

table tr th {
  background-color: #eceaed;
}

table tr:nth-child(even) td {
  background-color: #f5f4f6;
}

/* @group Generic Classes */

.initially-hidden {
  display: none;
}

#search-field {
  width: 98%;
  background: white;
  border: none;
  height: 1.5em;
  -webkit-border-radius: 4px;
  -moz-border-radius: 4px;
  border-radius: 4px;
  text-align: left;
}
#search-field:focus {
  background: #f1edba;
}
#search-field:-moz-placeholder,
#search-field::-webkit-input-placeholder {
  font-weight: bold;
  color: #666;
}

.missing-docs {
  font-size: 120%;
  background: white url(../images/wrench_orange.png) no-repeat 4px center;
  color: #ccc;
  line-height: 2em;
  border: 1px solid #d00;
  opacity: 1;
  padding-left: 20px;
  text-indent: 24px;
  letter-spacing: 3px;
  font-weight: bold;
  -webkit-border-radius: 5px;
  -moz-border-radius: 5px;
}

.target-section {
  border: 2px solid #dcce90;
  border-left-width: 8px;
  padding: 0 1em;
  background: #fff3c2;
}

/* @end */

/* @group Index Page, Standalone file pages */
.table-of-contents ul {
  margin: 1em;
  list-style: none;
}

.table-of-contents ul ul {
  margin-top: 0.25em;
}

.table-of-contents ul :link,
.table-of-contents ul :visited {
  font-size: 16px;
}

.table-of-contents li {
  margin-bottom: 0.25em;
}

.table-of-contents li .toc-toggle {
  width: 16px;
  height: 16px;
  background: url(../images/add.png) no-repeat;
}

.table-of-contents li .toc-toggle.open {
  background: url(../images/delete.png) no-repeat;
}

/* @end */

/* @group Top-Level Structure */

nav {
  float: left;
  width: 260px;
  font-family: Helvetica, sans-serif;
  font-size: 14px;
  border-right: 1px solid #ccc;
}

main {
  display: block;
  margin: 0 2em 5em 260px;
  padding-left: 20px;
  min-width: 340px;
  font-size: 16px;
}

main h1,
main h2,
main h3,
main h4,
main h5,
main h6 {
  font-family: Helvetica, sans-serif;
}

.table-of-contents main {
  margin-left: 2em;
}

#validator-badges {
  clear: both;
  margin: 1em 1em 2em;
  font-size: smaller;
}

/* @end */

/* @group navigation */
nav {
  margin-bottom: 1em;
}

nav .nav-section {
  margin-top: 2em;
  border-top: 2px solid #aaa;
  font-size: 90%;
  overflow: hidden;
}

nav h2 {
  margin: 0;
  padding: 2px 8px 2px 8px;
  background-color: #e8e8e8;
  color: #555;
  font-size: 125%;
  text-align: center;
}

nav h3,
#table-of-contents-navigation {
  margin: 0;
  padding: 2px 8px 2px 8px;
  text-align: right;
  background-color: #e8e8e8;
  color: #555;
}

nav ul,
nav dl,
nav p {
  padding: 4px 8px 0;
  list-style: none;
}

#project-navigation .nav-section {
  margin: 0;
  border-top: 0;
}

#home-section h2 {
  text-align: center;
}

#table-of-contents-navigation {
  font-size: 1.2em;
  font-weight: bold;
  text-align: center;
}

#search-section {
  margin-top: 0;
  border-top: 0;
}

#search-field-wrapper {
  border-top: 1px solid #aaa;
  border-bottom: 1px solid #aaa;
  padding: 3px 8px;
  background-color: #e8e8e8;
  color: #555;
}

ul.link-list li {
  white-space: nowrap;
  line-height: 1.4em;
}

ul.link-list .type {
  font-size: 8px;
  text-transform: uppercase;
  color: white;
  background: #969696;
  padding: 2px 4px;
  -webkit-border-radius: 5px;
}

dl.note-list dt {
  float: left;
  margin-right: 1em;
}

.calls-super {
  background: url(../images/arrow_up.png) no-repeat right center;
}

/* @end */

/* @group Documentation Section */
main {
  color: #333;
}

main > h1:first-child,
main > h2:first-child,
main > h3:first-child,
main > h4:first-child,
main > h5:first-child,
main > h6:first-child {
  margin-top: 0px;
}

main sup {
  vertical-align: super;
  font-size: 0.8em;
}

/* The heading with the class name */
main h1[class] {
  margin-top: 0;
  margin-bottom: 1em;
  font-size: 2em;
  color: #6C8C22;
}

main h1 {
  margin: 2em 0 0.5em;
  font-size: 1.7em;
}

main h2 {
  margin: 2em 0 0.5em;
  font-size: 1.5em;
}

main h3 {
  margin: 2em 0 0.5em;
  font-size: 1.2em;
}

main h4 {
  margin: 2em 0 0.5em;
  font-size: 1.1em;
}

main h5 {
  margin: 2em 0 0.5em;
  font-size: 1em;
}

main h6 {
  margin: 2em 0 0.5em;
  font-size: 1em;
}

main p {
  margin: 0 0 0.5em;
  line-height: 1.4em;
}

main pre {
  margin: 1.2em 0.5em;
  padding: 1em;
  font-size: 0.8em;
}

main hr {
  margin: 1.5em 1em;
  border: 2px solid #ddd;
}

main blockquote {
  margin: 0 2em 1.2em 1.2em;
  padding-left: 0.5em;
  border-left: 2px solid #ddd;
}

main ol,
main ul {
  margin: 1em 2em;
}

main li > p {
  margin-bottom: 0.5em;
}

main dl {
  margin: 1em 0.5em;
}

main dt {
  margin-bottom: 0.5em;
  font-weight: bold;
}

main dd {
  margin: 0 1em 1em 0.5em;
}

main header h2 {
  margin-top: 2em;
  border-width: 0;
  border-top: 4px solid #bbb;
  font-size: 130%;
}

main header h3 {
  margin: 2em 0 1.5em;
  border-width: 0;
  border-top: 3px solid #bbb;
  font-size: 120%;
}

.documentation-section-title {
  position: relative;
}
.documentation-section-title .section-click-top {
  position: absolute;
  top: 6px;
  left: 12px;
  font-size: 10px;
  color: #9b9877;
  visibility: hidden;
  padding-left: 0.5px;
}

.documentation-section-title:hover .section-click-top {
  visibility: visible;
}

.constants-list > dl {
  margin: 1em 0 2em;
  border: 0;
}

.constants-list > dl dt {
  margin-bottom: 0.75em;
  padding-left: 0;
  font-family: "Source Code Pro", Monaco, monospace;
  font-size: 110%;
}

.constants-list > dl dt a {
  color: inherit;
}

.constants-list > dl dd {
  margin: 0 0 2em 0;
  padding: 0;
  color: #666;
}

.documentation-section h2 {
  position: relative;
}

.documentation-section h2 a {
  position: absolute;
  top: 8px;
  right: 10px;
  font-size: 12px;
  color: #9b9877;
  visibility: hidden;
}

.documentation-section h2:hover a {
  visibility: visible;
}

/* @group Method Details */

main .method-source-code {
  max-height: 0;
  overflow: hidden;
  transition-duration: 200ms;
  transition-delay: 0ms;
  transition-property: all;
  transition-timing-function: ease-in-out;
}

main .method-source-code.active-menu {
  max-height: 100vh;
}

main .method-description .method-calls-super {
  color: #333;
  font-weight: bold;
}

main .method-detail {
  margin-bottom: 2.5em;
  cursor: pointer;
}

main .method-detail:target {
  margin-left: -10px;
  border-left: 10px solid #f1edba;
}

main .method-heading {
  position: relative;
  font-family: "Source Code Pro", Monaco, monospace;
  font-size: 110%;
  font-weight: bold;
  color: #333;
}
main .method-heading :link,
main .method-heading :visited {
  color: inherit;
}
main .method-click-advice {
  position: absolute;
  top: 2px;
  right: 5px;
  font-size: 12px;
  color: #9b9877;
  visibility: hidden;
  padding-right: 20px;
  line-height: 20px;
  background: url(../images/zoom.png) no-repeat right top;
}
main .method-heading:hover .method-click-advice {
  visibility: visible;
}

main .method-alias .method-heading {
  color: #666;
}

main .method-description,
main .aliases {
  margin-top: 0.75em;
  color: #333;
}

main .aliases {
  padding-top: 4px;
  font-style: italic;
  cursor: default;
}
main .method-description ul {
  margin-left: 1.5em;
}

main #attribute-method-details .method-detail:hover {
  background-color: transparent;
  cursor: default;
}
main .attribute-access-type {
  text-transform: uppercase;
  padding: 0 1em;
}
/* @end */

/* @end */

/* @group Source Code */

pre {
  margin: 0.5em 0;
  border: 1px dashed #999;
  padding: 0.5em;
  background: #262626;
  color: white;
  overflow: auto;
}

.ruby-constant   { color: #7fffd4; background: transparent; }
.ruby-keyword    { color: #00ffff; background: transparent; }
.ruby-ivar       { color: #eedd82; background: transparent; }
.ruby-operator   { color: #00ffee; background: transparent; }
.ruby-identifier { color: #ffdead; background: transparent; }
.ruby-node       { color: #ffa07a; background: transparent; }
.ruby-comment    { color: #dc0000; background: transparent; }
.ruby-regexp     { color: #ffa07a; background: transparent; }
.ruby-value      { color: #7fffd4; background: transparent; }

/* @end */


/* @group search results */
#search-results {
  font-family: Lato, sans-serif;
  font-weight: 300;
}

#search-results .search-match {
  font-family: Helvetica, sans-serif;
  font-weight: normal;
}

#search-results .search-selected {
  background: #e8e8e8;
  border-bottom: 1px solid transparent;
}

#search-results li {
  list-style: none;
  border-bottom: 1px solid #aaa;
  margin-bottom: 0.5em;
}

#search-results li:last-child {
  border-bottom: none;
  margin-bottom: 0;
}

#search-results li p {
  padding: 0;
  margin: 0.5em;
}

#search-results .search-namespace {
  font-weight: bold;
}

#search-results li em {
  background: yellow;
  font-style: normal;
}

#search-results pre {
  margin: 0.5em;
  font-family: "Source Code Pro", Monaco, monospace;
}

/* @end */

PK}$[;9Iv��Igems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/css/fonts.cssnu�[���/*
 * Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/),
 * with Reserved Font Name "Source". All Rights Reserved. Source is a
 * trademark of Adobe Systems Incorporated in the United States and/or other
 * countries.
 *
 * This Font Software is licensed under the SIL Open Font License, Version
 * 1.1.
 *
 * This license is copied below, and is also available with a FAQ at:
 * http://scripts.sil.org/OFL
 */

@font-face {
  font-family: "Source Code Pro";
  font-style: normal;
  font-weight: 400;
  src: local("Source Code Pro"),
       local("SourceCodePro-Regular"),
       url("../fonts/SourceCodePro-Regular.ttf") format("truetype");
}

@font-face {
  font-family: "Source Code Pro";
  font-style: normal;
  font-weight: 700;
  src: local("Source Code Pro Bold"),
       local("SourceCodePro-Bold"),
       url("../fonts/SourceCodePro-Bold.ttf") format("truetype");
}

/*
 * Copyright (c) 2010, Łukasz Dziedzic (dziedzic@typoland.com),
 * with Reserved Font Name Lato.
 *
 * This Font Software is licensed under the SIL Open Font License, Version
 * 1.1.
 *
 * This license is copied below, and is also available with a FAQ at:
 * http://scripts.sil.org/OFL
 */

@font-face {
  font-family: "Lato";
  font-style: normal;
  font-weight: 300;
  src: local("Lato Light"),
       local("Lato-Light"),
       url("../fonts/Lato-Light.ttf") format("truetype");
}

@font-face {
  font-family: "Lato";
  font-style: italic;
  font-weight: 300;
  src: local("Lato Light Italic"),
       local("Lato-LightItalic"),
       url("../fonts/Lato-LightItalic.ttf") format("truetype");
}

@font-face {
  font-family: "Lato";
  font-style: normal;
  font-weight: 700;
  src: local("Lato Regular"),
       local("Lato-Regular"),
       url("../fonts/Lato-Regular.ttf") format("truetype");
}

@font-face {
  font-family: "Lato";
  font-style: italic;
  font-weight: 700;
  src: local("Lato Italic"),
       local("Lato-Italic"),
       url("../fonts/Lato-RegularItalic.ttf") format("truetype");
}

/*
 * -----------------------------------------------------------
 * SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
 * -----------------------------------------------------------
 *
 * PREAMBLE
 * The goals of the Open Font License (OFL) are to stimulate worldwide
 * development of collaborative font projects, to support the font creation
 * efforts of academic and linguistic communities, and to provide a free and
 * open framework in which fonts may be shared and improved in partnership
 * with others.
 *
 * The OFL allows the licensed fonts to be used, studied, modified and
 * redistributed freely as long as they are not sold by themselves. The
 * fonts, including any derivative works, can be bundled, embedded,
 * redistributed and/or sold with any software provided that any reserved
 * names are not used by derivative works. The fonts and derivatives,
 * however, cannot be released under any other type of license. The
 * requirement for fonts to remain under this license does not apply
 * to any document created using the fonts or their derivatives.
 *
 * DEFINITIONS
 * "Font Software" refers to the set of files released by the Copyright
 * Holder(s) under this license and clearly marked as such. This may
 * include source files, build scripts and documentation.
 *
 * "Reserved Font Name" refers to any names specified as such after the
 * copyright statement(s).
 *
 * "Original Version" refers to the collection of Font Software components as
 * distributed by the Copyright Holder(s).
 *
 * "Modified Version" refers to any derivative made by adding to, deleting,
 * or substituting -- in part or in whole -- any of the components of the
 * Original Version, by changing formats or by porting the Font Software to a
 * new environment.
 *
 * "Author" refers to any designer, engineer, programmer, technical
 * writer or other person who contributed to the Font Software.
 *
 * PERMISSION & CONDITIONS
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of the Font Software, to use, study, copy, merge, embed, modify,
 * redistribute, and sell modified and unmodified copies of the Font
 * Software, subject to the following conditions:
 *
 * 1) Neither the Font Software nor any of its individual components,
 * in Original or Modified Versions, may be sold by itself.
 *
 * 2) Original or Modified Versions of the Font Software may be bundled,
 * redistributed and/or sold with any software, provided that each copy
 * contains the above copyright notice and this license. These can be
 * included either as stand-alone text files, human-readable headers or
 * in the appropriate machine-readable metadata fields within text or
 * binary files as long as those fields can be easily viewed by the user.
 *
 * 3) No Modified Version of the Font Software may use the Reserved Font
 * Name(s) unless explicit written permission is granted by the corresponding
 * Copyright Holder. This restriction only applies to the primary font name as
 * presented to the users.
 *
 * 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
 * Software shall not be used to promote, endorse or advertise any
 * Modified Version, except to acknowledge the contribution(s) of the
 * Copyright Holder(s) and the Author(s) or with their explicit written
 * permission.
 *
 * 5) The Font Software, modified or unmodified, in part or in whole,
 * must be distributed entirely under this license, and must not be
 * distributed under any other license. The requirement for fonts to
 * remain under this license does not apply to any document created
 * using the Font Software.
 *
 * TERMINATION
 * This license becomes null and void if any of the above conditions are
 * not met.
 *
 * DISCLAIMER
 * THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
 * OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
 * COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
 * DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
 * OTHER DEALINGS IN THE FONT SOFTWARE.
 */

PK}$[`	e��Fgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/page.rhtmlnu�[���<body id="top" role="document" class="file">
<nav role="navigation">
  <div id="project-navigation">
    <%= render '_sidebar_navigation.rhtml' %>
    <%= render '_sidebar_search.rhtml' %>
  </div>

  <%= render '_sidebar_table_of_contents.rhtml' %>

  <div id="project-metadata">
    <%= render '_sidebar_pages.rhtml' %>
  </div>
</nav>

<main role="main" aria-label="Page <%=h file.full_name%>">
<%= file.description %>
</main>

PK}$[����OOPgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtmlnu�[���<%- simple_files = @files.select { |f| f.text? } %>
<%- unless simple_files.empty? then -%>
<div id="fileindex-section" class="nav-section">
  <h3>Pages</h3>

  <ul class="link-list">
  <%- simple_files.each do |f| -%>
    <li><a href="<%= rel_prefix %>/<%= f.path %>"><%= h f.page_name %></a>
  <%- end -%>
  </ul>
</div>
<%- end -%>
PK}$[��e]]Ggems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_head.rhtmlnu�[���<meta charset="<%= @options.charset %>">

<title><%= h @title %></title>

<script type="text/javascript">
  var rdoc_rel_prefix = "<%= asset_rel_prefix %>/";
  var index_rel_prefix = "<%= rel_prefix %>/";
</script>

<script src="<%= asset_rel_prefix %>/js/navigation.js" defer></script>
<script src="<%= asset_rel_prefix %>/js/search.js" defer></script>
<script src="<%= asset_rel_prefix %>/js/search_index.js" defer></script>
<script src="<%= asset_rel_prefix %>/js/searcher.js" defer></script>
<script src="<%= asset_rel_prefix %>/js/darkfish.js" defer></script>

<link href="<%= asset_rel_prefix %>/css/fonts.css" rel="stylesheet">
<link href="<%= asset_rel_prefix %>/css/rdoc.css" rel="stylesheet">
<%- @options.template_stylesheets.each do |stylesheet| -%>
<link href="<%= asset_rel_prefix %>/<%= File.basename stylesheet %>" rel="stylesheet">
<%- end -%>
PK}$[*�f���Qgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_search.rhtmlnu�[���<div id="search-section" role="search" class="project-section initially-hidden">
  <form action="#" method="get" accept-charset="utf-8">
    <div id="search-field-wrapper">
      <input id="search-field" role="combobox" aria-label="Search"
             aria-autocomplete="list" aria-controls="search-results"
             type="text" name="search" placeholder="Search" spellcheck="false"
             title="Type to search, Up and Down to navigate, Enter to load">
    </div>

    <ul id="search-results" aria-label="Search Results"
        aria-busy="false" aria-expanded="false"
        aria-atomic="false" class="initially-hidden"></ul>
  </form>
</div>
PK}$[ДU�



3gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/markup.rbnu�[���# frozen_string_literal: true
##
# Handle common RDoc::Markup tasks for various CodeObjects
#
# This module is loaded by generators.  It allows RDoc's CodeObject tree to
# avoid loading generator code to improve startup time for +ri+.

module RDoc::Generator::Markup

  ##
  # Generates a relative URL from this object's path to +target_path+

  def aref_to(target_path)
    RDoc::Markup::ToHtml.gen_relative_url path, target_path
  end

  ##
  # Generates a relative URL from +from_path+ to this object's path

  def as_href(from_path)
    RDoc::Markup::ToHtml.gen_relative_url from_path, path
  end

  ##
  # Handy wrapper for marking up this object's comment

  def description
    markup @comment
  end

  ##
  # Creates an RDoc::Markup::ToHtmlCrossref formatter

  def formatter
    return @formatter if defined? @formatter

    options = @store.rdoc.options
    this = RDoc::Context === self ? self : @parent

    @formatter = RDoc::Markup::ToHtmlCrossref.new options, this.path, this
    @formatter.code_object = self
    @formatter
  end

  ##
  # Build a webcvs URL starting for the given +url+ with +full_path+ appended
  # as the destination path.  If +url+ contains '%s' +full_path+ will be
  # will replace the %s using sprintf on the +url+.

  def cvs_url(url, full_path)
    if /%s/ =~ url then
      sprintf url, full_path
    else
      url + full_path
    end
  end

end

class RDoc::CodeObject

  include RDoc::Generator::Markup

end

class RDoc::MethodAttr

  ##
  # Prepend +src+ with line numbers.  Relies on the first line of a source
  # code listing having:
  #
  #   # File xxxxx, line dddd
  #
  # If it has this comment then line numbers are added to +src+ and the <tt>,
  # line dddd</tt> portion of the comment is removed.

  def add_line_numbers(src)
    return unless src.sub!(/\A(.*)(, line (\d+))/, '\1')
    first = $3.to_i - 1
    last  = first + src.count("\n")
    size = last.to_s.length

    line = first
    src.gsub!(/^/) do
      res = if line == first then
              " " * (size + 1)
            else
              "<span class=\"line-num\">%2$*1$d</span> " % [size, line]
            end

      line += 1
      res
    end
  end

  ##
  # Turns the method's token stream into HTML.
  #
  # Prepends line numbers if +options.line_numbers+ is true.

  def markup_code
    return '' unless @token_stream

    src = RDoc::TokenStream.to_html @token_stream

    # dedent the source
    indent = src.length
    lines = src.lines.to_a
    lines.shift if src =~ /\A.*#\ *File/i # remove '# File' comment
    lines.each do |line|
      if line =~ /^ *(?=\S)/
        n = $&.length
        indent = n if n < indent
        break if n == 0
      end
    end
    src.gsub!(/^#{' ' * indent}/, '') if indent > 0

    add_line_numbers(src) if options.line_numbers

    src
  end

end

class RDoc::ClassModule

  ##
  # Handy wrapper for marking up this class or module's comment

  def description
    markup @comment_location
  end

end

class RDoc::Context::Section

  include RDoc::Generator::Markup

end

class RDoc::TopLevel

  ##
  # Returns a URL for this source file on some web repository.  Use the -W
  # command line option to set.

  def cvs_url
    url = @store.rdoc.options.webcvs

    if /%s/ =~ url then
      url % @relative_name
    else
      url + @relative_name
    end
  end

end

PK}$[�q���7gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/json_index.rbnu�[���# frozen_string_literal: true
require 'json'
begin
  require 'zlib'
rescue LoadError
end

##
# The JsonIndex generator is designed to complement an HTML generator and
# produces a JSON search index.  This generator is derived from sdoc by
# Vladimir Kolesnikov and contains verbatim code written by him.
#
# This generator is designed to be used with a regular HTML generator:
#
#   class RDoc::Generator::Darkfish
#     def initialize options
#       # ...
#       @base_dir = Pathname.pwd.expand_path
#
#       @json_index = RDoc::Generator::JsonIndex.new self, options
#     end
#
#     def generate
#       # ...
#       @json_index.generate
#     end
#   end
#
# == Index Format
#
# The index is output as a JSON file assigned to the global variable
# +search_data+.  The structure is:
#
#   var search_data = {
#     "index": {
#       "searchIndex":
#         ["a", "b", ...],
#       "longSearchIndex":
#         ["a", "a::b", ...],
#       "info": [
#         ["A", "A", "A.html", "", ""],
#         ["B", "A::B", "A::B.html", "", ""],
#         ...
#       ]
#     }
#   }
#
# The same item is described across the +searchIndex+, +longSearchIndex+ and
# +info+ fields.  The +searchIndex+ field contains the item's short name, the
# +longSearchIndex+ field contains the full_name (when appropriate) and the
# +info+ field contains the item's name, full_name, path, parameters and a
# snippet of the item's comment.
#
# == LICENSE
#
# Copyright (c) 2009 Vladimir Kolesnikov
#
# 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.

class RDoc::Generator::JsonIndex

  include RDoc::Text

  ##
  # Where the search index lives in the generated output

  SEARCH_INDEX_FILE = File.join 'js', 'search_index.js'

  attr_reader :index # :nodoc:

  ##
  # Creates a new generator.  +parent_generator+ is used to determine the
  # class_dir and file_dir of links in the output index.
  #
  # +options+ are the same options passed to the parent generator.

  def initialize parent_generator, options
    @parent_generator = parent_generator
    @store            = parent_generator.store
    @options          = options

    @template_dir = File.expand_path '../template/json_index', __FILE__
    @base_dir = @parent_generator.base_dir

    @classes = nil
    @files   = nil
    @index   = nil
  end

  ##
  # Builds the JSON index as a Hash.

  def build_index
    reset @store.all_files.sort, @store.all_classes_and_modules.sort

    index_classes
    index_methods
    index_pages

    { :index => @index }
  end

  ##
  # Output progress information if debugging is enabled

  def debug_msg *msg
    return unless $DEBUG_RDOC
    $stderr.puts(*msg)
  end

  ##
  # Writes the JSON index to disk

  def generate
    debug_msg "Generating JSON index"

    debug_msg "  writing search index to %s" % SEARCH_INDEX_FILE
    data = build_index

    return if @options.dry_run

    out_dir = @base_dir + @options.op_dir
    index_file = out_dir + SEARCH_INDEX_FILE

    FileUtils.mkdir_p index_file.dirname, :verbose => $DEBUG_RDOC

    index_file.open 'w', 0644 do |io|
      io.set_encoding Encoding::UTF_8
      io.write 'var search_data = '

      JSON.dump data, io, 0
    end
    unless ENV['SOURCE_DATE_EPOCH'].nil?
      index_file.utime index_file.atime, Time.at(ENV['SOURCE_DATE_EPOCH'].to_i).gmtime
    end

    Dir.chdir @template_dir do
      Dir['**/*.js'].each do |source|
        dest = File.join out_dir, source

        FileUtils.install source, dest, :mode => 0644, :preserve => true, :verbose => $DEBUG_RDOC
      end
    end
  end

  ##
  # Compress the search_index.js file using gzip

  def generate_gzipped
    return if @options.dry_run or not defined?(Zlib)

    debug_msg "Compressing generated JSON index"
    out_dir = @base_dir + @options.op_dir

    search_index_file = out_dir + SEARCH_INDEX_FILE
    outfile           = out_dir + "#{search_index_file}.gz"

    debug_msg "Reading the JSON index file from %s" % search_index_file
    search_index = search_index_file.read(mode: 'r:utf-8')

    debug_msg "Writing gzipped search index to %s" % outfile

    Zlib::GzipWriter.open(outfile) do |gz|
      gz.mtime = File.mtime(search_index_file)
      gz.orig_name = search_index_file.basename.to_s
      gz.write search_index
      gz.close
    end

    # GZip the rest of the js files
    Dir.chdir @template_dir do
      Dir['**/*.js'].each do |source|
        dest = out_dir + source
        outfile = out_dir + "#{dest}.gz"

        debug_msg "Reading the original js file from %s" % dest
        data = dest.read

        debug_msg "Writing gzipped file to %s" % outfile

        Zlib::GzipWriter.open(outfile) do |gz|
          gz.mtime = File.mtime(dest)
          gz.orig_name = dest.basename.to_s
          gz.write data
          gz.close
        end
      end
    end
  end

  ##
  # Adds classes and modules to the index

  def index_classes
    debug_msg "  generating class search index"

    documented = @classes.uniq.select do |klass|
      klass.document_self_or_methods
    end

    documented.each do |klass|
      debug_msg "    #{klass.full_name}"
      record = klass.search_record
      @index[:searchIndex]     << search_string(record.shift)
      @index[:longSearchIndex] << search_string(record.shift)
      @index[:info]            << record
    end
  end

  ##
  # Adds methods to the index

  def index_methods
    debug_msg "  generating method search index"

    list = @classes.uniq.map do |klass|
      klass.method_list
    end.flatten.sort_by do |method|
      [method.name, method.parent.full_name]
    end

    list.each do |method|
      debug_msg "    #{method.full_name}"
      record = method.search_record
      @index[:searchIndex]     << "#{search_string record.shift}()"
      @index[:longSearchIndex] << "#{search_string record.shift}()"
      @index[:info]            << record
    end
  end

  ##
  # Adds pages to the index

  def index_pages
    debug_msg "  generating pages search index"

    pages = @files.select do |file|
      file.text?
    end

    pages.each do |page|
      debug_msg "    #{page.page_name}"
      record = page.search_record
      @index[:searchIndex]     << search_string(record.shift)
      @index[:longSearchIndex] << ''
      record.shift
      @index[:info]            << record
    end
  end

  ##
  # The directory classes are written to

  def class_dir
    @parent_generator.class_dir
  end

  ##
  # The directory files are written to

  def file_dir
    @parent_generator.file_dir
  end

  def reset files, classes # :nodoc:
    @files   = files
    @classes = classes

    @index = {
      :searchIndex => [],
      :longSearchIndex => [],
      :info => []
    }
  end

  ##
  # Removes whitespace and downcases +string+

  def search_string string
    string.downcase.gsub(/\s/, '')
  end

end
PK}$[��P�
Q
Q5gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/darkfish.rbnu�[���# frozen_string_literal: true
# -*- mode: ruby; ruby-indent-level: 2; tab-width: 2 -*-

require 'erb'
require 'fileutils'
require 'pathname'
require_relative 'markup'

##
# Darkfish RDoc HTML Generator
#
# $Id: darkfish.rb 52 2009-01-07 02:08:11Z deveiant $
#
# == Author/s
# * Michael Granger (ged@FaerieMUD.org)
#
# == Contributors
# * Mahlon E. Smith (mahlon@martini.nu)
# * Eric Hodel (drbrain@segment7.net)
#
# == License
#
# Copyright (c) 2007, 2008, Michael Granger. 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 author/s, nor the names of the project's
#   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.
#
# == Attributions
#
# Darkfish uses the {Silk Icons}[http://www.famfamfam.com/lab/icons/silk/] set
# by Mark James.

class RDoc::Generator::Darkfish

  RDoc::RDoc.add_generator self

  include ERB::Util

  ##
  # Stylesheets, fonts, etc. that are included in RDoc.

  BUILTIN_STYLE_ITEMS = # :nodoc:
    %w[
      css/fonts.css
      fonts/Lato-Light.ttf
      fonts/Lato-LightItalic.ttf
      fonts/Lato-Regular.ttf
      fonts/Lato-RegularItalic.ttf
      fonts/SourceCodePro-Bold.ttf
      fonts/SourceCodePro-Regular.ttf
      css/rdoc.css
  ]

  ##
  # Path to this file's parent directory. Used to find templates and other
  # resources.

  GENERATOR_DIR = File.join 'rdoc', 'generator'

  ##
  # Release Version

  VERSION = '3'

  ##
  # Description of this generator

  DESCRIPTION = 'HTML generator, written by Michael Granger'

  ##
  # The relative path to style sheets and javascript.  By default this is set
  # the same as the rel_prefix.

  attr_accessor :asset_rel_path

  ##
  # The path to generate files into, combined with <tt>--op</tt> from the
  # options for a full path.

  attr_reader :base_dir

  ##
  # Classes and modules to be used by this generator, not necessarily
  # displayed.  See also #modsort

  attr_reader :classes

  ##
  # No files will be written when dry_run is true.

  attr_accessor :dry_run

  ##
  # When false the generate methods return a String instead of writing to a
  # file.  The default is true.

  attr_accessor :file_output

  ##
  # Files to be displayed by this generator

  attr_reader :files

  ##
  # The JSON index generator for this Darkfish generator

  attr_reader :json_index

  ##
  # Methods to be displayed by this generator

  attr_reader :methods

  ##
  # Sorted list of classes and modules to be displayed by this generator

  attr_reader :modsort

  ##
  # The RDoc::Store that is the source of the generated content

  attr_reader :store

  ##
  # The directory where the template files live

  attr_reader :template_dir # :nodoc:

  ##
  # The output directory

  attr_reader :outputdir

  ##
  # Initialize a few instance variables before we start

  def initialize store, options
    @store   = store
    @options = options

    @asset_rel_path = ''
    @base_dir       = Pathname.pwd.expand_path
    @dry_run        = @options.dry_run
    @file_output    = true
    @template_dir   = Pathname.new options.template_dir
    @template_cache = {}

    @classes = nil
    @context = nil
    @files   = nil
    @methods = nil
    @modsort = nil

    @json_index = RDoc::Generator::JsonIndex.new self, options
  end

  ##
  # Output progress information if debugging is enabled

  def debug_msg *msg
    return unless $DEBUG_RDOC
    $stderr.puts(*msg)
  end

  ##
  # Directory where generated class HTML files live relative to the output
  # dir.

  def class_dir
    nil
  end

  ##
  # Directory where generated class HTML files live relative to the output
  # dir.

  def file_dir
    nil
  end

  ##
  # Create the directories the generated docs will live in if they don't
  # already exist.

  def gen_sub_directories
    @outputdir.mkpath
  end

  ##
  # Copy over the stylesheet into the appropriate place in the output
  # directory.

  def write_style_sheet
    debug_msg "Copying static files"
    options = { :verbose => $DEBUG_RDOC, :noop => @dry_run }

    BUILTIN_STYLE_ITEMS.each do |item|
      install_rdoc_static_file @template_dir + item, "./#{item}", options
    end

    unless @options.template_stylesheets.empty?
      FileUtils.cp @options.template_stylesheets, '.', **options
    end

    Dir[(@template_dir + "{js,images}/**/*").to_s].each do |path|
      next if File.directory? path
      next if File.basename(path) =~ /^\./

      dst = Pathname.new(path).relative_path_from @template_dir

      install_rdoc_static_file @template_dir + path, dst, options
    end
  end

  ##
  # Build the initial indices and output objects based on an array of TopLevel
  # objects containing the extracted information.

  def generate
    setup

    write_style_sheet
    generate_index
    generate_class_files
    generate_file_files
    generate_table_of_contents
    @json_index.generate
    @json_index.generate_gzipped

    copy_static

  rescue => e
    debug_msg "%s: %s\n  %s" % [
      e.class.name, e.message, e.backtrace.join("\n  ")
    ]

    raise
  end

  ##
  # Copies static files from the static_path into the output directory

  def copy_static
    return if @options.static_path.empty?

    fu_options = { :verbose => $DEBUG_RDOC, :noop => @dry_run }

    @options.static_path.each do |path|
      unless File.directory? path then
        FileUtils.install path, @outputdir, **fu_options.merge(:mode => 0644)
        next
      end

      Dir.chdir path do
        Dir[File.join('**', '*')].each do |entry|
          dest_file = @outputdir + entry

          if File.directory? entry then
            FileUtils.mkdir_p entry, **fu_options
          else
            FileUtils.install entry, dest_file, **fu_options.merge(:mode => 0644)
          end
        end
      end
    end
  end

  ##
  # Return a list of the documented modules sorted by salience first, then
  # by name.

  def get_sorted_module_list classes
    classes.select do |klass|
      klass.display?
    end.sort
  end

  ##
  # Generate an index page which lists all the classes which are documented.

  def generate_index
    setup

    template_file = @template_dir + 'index.rhtml'
    return unless template_file.exist?

    debug_msg "Rendering the index page..."

    out_file = @base_dir + @options.op_dir + 'index.html'
    rel_prefix = @outputdir.relative_path_from out_file.dirname
    search_index_rel_prefix = rel_prefix
    search_index_rel_prefix += @asset_rel_path if @file_output

    asset_rel_prefix = rel_prefix + @asset_rel_path

    @title = @options.title

    render_template template_file, out_file do |io|
      here = binding
      # suppress 1.9.3 warning
      here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
      here
    end
  rescue => e
    error = RDoc::Error.new \
      "error generating index.html: #{e.message} (#{e.class})"
    error.set_backtrace e.backtrace

    raise error
  end

  ##
  # Generates a class file for +klass+

  def generate_class klass, template_file = nil
    setup

    current = klass

    template_file ||= @template_dir + 'class.rhtml'

    debug_msg "  working on %s (%s)" % [klass.full_name, klass.path]
    out_file   = @outputdir + klass.path
    rel_prefix = @outputdir.relative_path_from out_file.dirname
    search_index_rel_prefix = rel_prefix
    search_index_rel_prefix += @asset_rel_path if @file_output

    asset_rel_prefix = rel_prefix + @asset_rel_path
    svninfo          = get_svninfo(current)

    @title = "#{klass.type} #{klass.full_name} - #{@options.title}"

    debug_msg "  rendering #{out_file}"
    render_template template_file, out_file do |io|
      here = binding
      # suppress 1.9.3 warning
      here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
      here.local_variable_set(:svninfo, svninfo)
      here
    end
  end

  ##
  # Generate a documentation file for each class and module

  def generate_class_files
    setup

    template_file = @template_dir + 'class.rhtml'
    template_file = @template_dir + 'classpage.rhtml' unless
      template_file.exist?
    return unless template_file.exist?
    debug_msg "Generating class documentation in #{@outputdir}"

    current = nil

    @classes.each do |klass|
      current = klass

      generate_class klass, template_file
    end
  rescue => e
    error = RDoc::Error.new \
      "error generating #{current.path}: #{e.message} (#{e.class})"
    error.set_backtrace e.backtrace

    raise error
  end

  ##
  # Generate a documentation file for each file

  def generate_file_files
    setup

    page_file     = @template_dir + 'page.rhtml'
    fileinfo_file = @template_dir + 'fileinfo.rhtml'

    # for legacy templates
    filepage_file = @template_dir + 'filepage.rhtml' unless
      page_file.exist? or fileinfo_file.exist?

    return unless
      page_file.exist? or fileinfo_file.exist? or filepage_file.exist?

    debug_msg "Generating file documentation in #{@outputdir}"

    out_file = nil
    current = nil

    @files.each do |file|
      current = file

      if file.text? and page_file.exist? then
        generate_page file
        next
      end

      template_file = nil
      out_file = @outputdir + file.path
      debug_msg "  working on %s (%s)" % [file.full_name, out_file]
      rel_prefix = @outputdir.relative_path_from out_file.dirname
      search_index_rel_prefix = rel_prefix
      search_index_rel_prefix += @asset_rel_path if @file_output

      asset_rel_prefix = rel_prefix + @asset_rel_path

      unless filepage_file then
        if file.text? then
          next unless page_file.exist?
          template_file = page_file
          @title = file.page_name
        else
          next unless fileinfo_file.exist?
          template_file = fileinfo_file
          @title = "File: #{file.base_name}"
        end
      end

      @title += " - #{@options.title}"
      template_file ||= filepage_file

      render_template template_file, out_file do |io|
        here = binding
        # suppress 1.9.3 warning
        here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
        here.local_variable_set(:current, current)
        here
      end
    end
  rescue => e
    error =
      RDoc::Error.new "error generating #{out_file}: #{e.message} (#{e.class})"
    error.set_backtrace e.backtrace

    raise error
  end

  ##
  # Generate a page file for +file+

  def generate_page file
    setup

    template_file = @template_dir + 'page.rhtml'

    out_file = @outputdir + file.path
    debug_msg "  working on %s (%s)" % [file.full_name, out_file]
    rel_prefix = @outputdir.relative_path_from out_file.dirname
    search_index_rel_prefix = rel_prefix
    search_index_rel_prefix += @asset_rel_path if @file_output

    current          = file
    asset_rel_prefix = rel_prefix + @asset_rel_path

    @title = "#{file.page_name} - #{@options.title}"

    debug_msg "  rendering #{out_file}"
    render_template template_file, out_file do |io|
      here = binding
      # suppress 1.9.3 warning
      here.local_variable_set(:current, current)
      here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
      here
    end
  end

  ##
  # Generates the 404 page for the RDoc servlet

  def generate_servlet_not_found message
    setup

    template_file = @template_dir + 'servlet_not_found.rhtml'
    return unless template_file.exist?

    debug_msg "Rendering the servlet 404 Not Found page..."

    rel_prefix = rel_prefix = ''
    search_index_rel_prefix = rel_prefix
    search_index_rel_prefix += @asset_rel_path if @file_output

    asset_rel_prefix = ''

    @title = 'Not Found'

    render_template template_file do |io|
      here = binding
      # suppress 1.9.3 warning
      here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
      here
    end
  rescue => e
    error = RDoc::Error.new \
      "error generating servlet_not_found: #{e.message} (#{e.class})"
    error.set_backtrace e.backtrace

    raise error
  end

  ##
  # Generates the servlet root page for the RDoc servlet

  def generate_servlet_root installed
    setup

    template_file = @template_dir + 'servlet_root.rhtml'
    return unless template_file.exist?

    debug_msg 'Rendering the servlet root page...'

    rel_prefix = '.'
    asset_rel_prefix = rel_prefix
    search_index_rel_prefix = asset_rel_prefix
    search_index_rel_prefix += @asset_rel_path if @file_output

    @title = 'Local RDoc Documentation'

    render_template template_file do |io| binding end
  rescue => e
    error = RDoc::Error.new \
      "error generating servlet_root: #{e.message} (#{e.class})"
    error.set_backtrace e.backtrace

    raise error
  end

  ##
  # Generate an index page which lists all the classes which are documented.

  def generate_table_of_contents
    setup

    template_file = @template_dir + 'table_of_contents.rhtml'
    return unless template_file.exist?

    debug_msg "Rendering the Table of Contents..."

    out_file = @outputdir + 'table_of_contents.html'
    rel_prefix = @outputdir.relative_path_from out_file.dirname
    search_index_rel_prefix = rel_prefix
    search_index_rel_prefix += @asset_rel_path if @file_output

    asset_rel_prefix = rel_prefix + @asset_rel_path

    @title = "Table of Contents - #{@options.title}"

    render_template template_file, out_file do |io|
      here = binding
      # suppress 1.9.3 warning
      here.local_variable_set(:asset_rel_prefix, asset_rel_prefix)
      here
    end
  rescue => e
    error = RDoc::Error.new \
      "error generating table_of_contents.html: #{e.message} (#{e.class})"
    error.set_backtrace e.backtrace

    raise error
  end

  def install_rdoc_static_file source, destination, options # :nodoc:
    return unless source.exist?

    begin
      FileUtils.mkdir_p File.dirname(destination), **options

      begin
        FileUtils.ln source, destination, **options
      rescue Errno::EEXIST
        FileUtils.rm destination
        retry
      end
    rescue
      FileUtils.cp source, destination, **options
    end
  end

  ##
  # Prepares for generation of output from the current directory

  def setup
    return if instance_variable_defined? :@outputdir

    @outputdir = Pathname.new(@options.op_dir).expand_path @base_dir

    return unless @store

    @classes = @store.all_classes_and_modules.sort
    @files   = @store.all_files.sort
    @methods = @classes.map { |m| m.method_list }.flatten.sort
    @modsort = get_sorted_module_list @classes
  end

  ##
  # Return a string describing the amount of time in the given number of
  # seconds in terms a human can understand easily.

  def time_delta_string seconds
    return 'less than a minute'          if seconds < 60
    return "#{seconds / 60} minute#{seconds / 60 == 1 ? '' : 's'}" if
                                            seconds < 3000     # 50 minutes
    return 'about one hour'              if seconds < 5400     # 90 minutes
    return "#{seconds / 3600} hours"     if seconds < 64800    # 18 hours
    return 'one day'                     if seconds < 86400    #  1 day
    return 'about one day'               if seconds < 172800   #  2 days
    return "#{seconds / 86400} days"     if seconds < 604800   #  1 week
    return 'about one week'              if seconds < 1209600  #  2 week
    return "#{seconds / 604800} weeks"   if seconds < 7257600  #  3 months
    return "#{seconds / 2419200} months" if seconds < 31536000 #  1 year
    return "#{seconds / 31536000} years"
  end

  # %q$Id: darkfish.rb 52 2009-01-07 02:08:11Z deveiant $"
  SVNID_PATTERN = /
    \$Id:\s
    (\S+)\s                # filename
    (\d+)\s                # rev
    (\d{4}-\d{2}-\d{2})\s  # Date (YYYY-MM-DD)
    (\d{2}:\d{2}:\d{2}Z)\s # Time (HH:MM:SSZ)
    (\w+)\s                # committer
    \$$
  /x

  ##
  # Try to extract Subversion information out of the first constant whose
  # value looks like a subversion Id tag. If no matching constant is found,
  # and empty hash is returned.

  def get_svninfo klass
    constants = klass.constants or return {}

    constants.find { |c| c.value =~ SVNID_PATTERN } or return {}

    filename, rev, date, time, committer = $~.captures
    commitdate = Time.parse "#{date} #{time}"

    return {
      :filename    => filename,
      :rev         => Integer(rev),
      :commitdate  => commitdate,
      :commitdelta => time_delta_string(Time.now - commitdate),
      :committer   => committer,
    }
  end

  ##
  # Creates a template from its components and the +body_file+.
  #
  # For backwards compatibility, if +body_file+ contains "<html" the body is
  # used directly.

  def assemble_template body_file
    body = body_file.read
    return body if body =~ /<html/

    head_file = @template_dir + '_head.rhtml'
    footer_file = @template_dir + '_footer.rhtml'

    <<-TEMPLATE
<!DOCTYPE html>

<html>
<head>
#{head_file.read}

#{body}

#{footer_file.read}
    TEMPLATE
  end

  ##
  # Renders the ERb contained in +file_name+ relative to the template
  # directory and returns the result based on the current context.

  def render file_name
    template_file = @template_dir + file_name

    template = template_for template_file, false, RDoc::ERBPartial

    template.filename = template_file.to_s

    template.result @context
  end

  ##
  # Load and render the erb template in the given +template_file+ and write
  # it out to +out_file+.
  #
  # Both +template_file+ and +out_file+ should be Pathname-like objects.
  #
  # An io will be yielded which must be captured by binding in the caller.

  def render_template template_file, out_file = nil # :yield: io
    io_output = out_file && !@dry_run && @file_output
    erb_klass = io_output ? RDoc::ERBIO : ERB

    template = template_for template_file, true, erb_klass

    if io_output then
      debug_msg "Outputting to %s" % [out_file.expand_path]

      out_file.dirname.mkpath
      out_file.open 'w', 0644 do |io|
        io.set_encoding @options.encoding

        @context = yield io

        template_result template, @context, template_file
      end
    else
      @context = yield nil

      output = template_result template, @context, template_file

      debug_msg "  would have written %d characters to %s" % [
        output.length, out_file.expand_path
      ] if @dry_run

      output
    end
  end

  ##
  # Creates the result for +template+ with +context+.  If an error is raised a
  # Pathname +template_file+ will indicate the file where the error occurred.

  def template_result template, context, template_file
    template.filename = template_file.to_s
    template.result context
  rescue NoMethodError => e
    raise RDoc::Error, "Error while evaluating %s: %s" % [
      template_file.expand_path,
      e.message,
    ], e.backtrace
  end

  ##
  # Retrieves a cache template for +file+, if present, or fills the cache.

  def template_for file, page = true, klass = ERB
    template = @template_cache[file]

    return template if template

    if page then
      template = assemble_template file
      erbout = 'io'
    else
      template = file.read
      template = template.encode @options.encoding

      file_var = File.basename(file).sub(/\..*/, '')

      erbout = "_erbout_#{file_var}"
    end

    if RUBY_VERSION >= '2.6'
      template = klass.new template, trim_mode: '-', eoutvar: erbout
    else
      template = klass.new template, nil, '-', erbout
    end
    @template_cache[file] = template
    template
  end

end
PK}$[f�=w��/gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/ri.rbnu�[���# frozen_string_literal: true
##
# Generates ri data files

class RDoc::Generator::RI

  RDoc::RDoc.add_generator self

  ##
  # Description of this generator

  DESCRIPTION = 'creates ri data files'

  ##
  # Set up a new ri generator

  def initialize store, options #:not-new:
    @options    = options
    @store      = store
    @store.path = '.'
  end

  ##
  # Writes the parsed data store to disk for use by ri.

  def generate
    @store.save
  end

end

PK}$[�I��#$#$.gems/gems/rdoc-6.4.1.1/lib/rdoc/method_attr.rbnu�[���# frozen_string_literal: true
##
# Abstract class representing either a method or an attribute.

class RDoc::MethodAttr < RDoc::CodeObject

  include Comparable

  ##
  # Name of this method/attribute.

  attr_accessor :name

  ##
  # public, protected, private

  attr_accessor :visibility

  ##
  # Is this a singleton method/attribute?

  attr_accessor :singleton

  ##
  # Source file token stream

  attr_reader :text

  ##
  # Array of other names for this method/attribute

  attr_reader :aliases

  ##
  # The method/attribute we're aliasing

  attr_accessor :is_alias_for

  #--
  # The attributes below are for AnyMethod only.
  # They are left here for the time being to
  # allow ri to operate.
  # TODO modify ri to avoid calling these on attributes.
  #++

  ##
  # Parameters yielded by the called block

  attr_reader :block_params

  ##
  # Parameters for this method

  attr_accessor :params

  ##
  # Different ways to call this method

  attr_accessor :call_seq

  ##
  # The call_seq or the param_seq with method name, if there is no call_seq.

  attr_reader :arglists

  ##
  # Pretty parameter list for this method

  attr_reader :param_seq


  ##
  # Creates a new MethodAttr from token stream +text+ and method or attribute
  # name +name+.
  #
  # Usually this is called by super from a subclass.

  def initialize text, name
    super()

    @text = text
    @name = name

    @aliases      = []
    @is_alias_for = nil
    @parent_name  = nil
    @singleton    = nil
    @visibility   = :public
    @see = false

    @arglists     = nil
    @block_params = nil
    @call_seq     = nil
    @param_seq    = nil
    @params       = nil
  end

  ##
  # Resets cached data for the object so it can be rebuilt by accessor methods

  def initialize_copy other # :nodoc:
    @full_name = nil
  end

  def initialize_visibility # :nodoc:
    super
    @see = nil
  end

  ##
  # Order by #singleton then #name

  def <=>(other)
    return unless other.respond_to?(:singleton) &&
                  other.respond_to?(:name)

    [     @singleton ? 0 : 1,       name] <=>
    [other.singleton ? 0 : 1, other.name]
  end

  def == other # :nodoc:
    equal?(other) or self.class == other.class and full_name == other.full_name
  end

  ##
  # A method/attribute is documented if any of the following is true:
  # - it was marked with :nodoc:;
  # - it has a comment;
  # - it is an alias for a documented method;
  # - it has a +#see+ method that is documented.

  def documented?
    super or
      (is_alias_for and is_alias_for.documented?) or
      (see and see.documented?)
  end

  ##
  # A method/attribute to look at,
  # in particular if this method/attribute has no documentation.
  #
  # It can be a method/attribute of the superclass or of an included module,
  # including the Kernel module, which is always appended to the included
  # modules.
  #
  # Returns +nil+ if there is no such method/attribute.
  # The +#is_alias_for+ method/attribute, if any, is not included.
  #
  # Templates may generate a "see also ..." if this method/attribute
  # has documentation, and "see ..." if it does not.

  def see
    @see = find_see if @see == false
    @see
  end

  ##
  # Sets the store for this class or module and its contained code objects.

  def store= store
    super

    @file = @store.add_file @file.full_name if @file
  end

  def find_see # :nodoc:
    return nil if singleton || is_alias_for

    # look for the method
    other = find_method_or_attribute name
    return other if other

    # if it is a setter, look for a getter
    return nil unless name =~ /[a-z_]=$/i   # avoid == or ===
    return find_method_or_attribute name[0..-2]
  end

  def find_method_or_attribute name # :nodoc:
    return nil unless parent.respond_to? :ancestors

    searched = parent.ancestors
    kernel = @store.modules_hash['Kernel']

    searched << kernel if kernel &&
      parent != kernel && !searched.include?(kernel)

    searched.each do |ancestor|
      next if String === ancestor
      next if parent == ancestor

      other = ancestor.find_method_named('#' + name) ||
              ancestor.find_attribute_named(name)

      return other if other
    end

    nil
  end

  ##
  # Abstract method. Contexts in their building phase call this
  # to register a new alias for this known method/attribute.
  #
  # - creates a new AnyMethod/Attribute named <tt>an_alias.new_name</tt>;
  # - adds +self+ as an alias for the new method or attribute
  # - adds the method or attribute to #aliases
  # - adds the method or attribute to +context+.

  def add_alias(an_alias, context)
    raise NotImplementedError
  end

  ##
  # HTML fragment reference for this method

  def aref
    type = singleton ? 'c' : 'i'
    # % characters are not allowed in html names => dash instead
    "#{aref_prefix}-#{type}-#{html_name}"
  end

  ##
  # Prefix for +aref+, defined by subclasses.

  def aref_prefix
    raise NotImplementedError
  end

  ##
  # Attempts to sanitize the content passed by the Ruby parser:
  # remove outer parentheses, etc.

  def block_params=(value)
    # 'yield.to_s' or 'assert yield, msg'
    return @block_params = '' if value =~ /^[\.,]/

    # remove trailing 'if/unless ...'
    return @block_params = '' if value =~ /^(if|unless)\s/

    value = $1.strip if value =~ /^(.+)\s(if|unless)\s/

    # outer parentheses
    value = $1 if value =~ /^\s*\((.*)\)\s*$/
    value = value.strip

    # proc/lambda
    return @block_params = $1 if value =~ /^(proc|lambda)(\s*\{|\sdo)/

    # surrounding +...+ or [...]
    value = $1.strip if value =~ /^\+(.*)\+$/
    value = $1.strip if value =~ /^\[(.*)\]$/

    return @block_params = '' if value.empty?

    # global variable
    return @block_params = 'str' if value =~ /^\$[&0-9]$/

    # wipe out array/hash indices
    value.gsub!(/(\w)\[[^\[]+\]/, '\1')

    # remove @ from class/instance variables
    value.gsub!(/@@?([a-z0-9_]+)/, '\1')

    # method calls => method name
    value.gsub!(/([A-Z:a-z0-9_]+)\.([a-z0-9_]+)(\s*\(\s*[a-z0-9_.,\s]*\s*\)\s*)?/) do
      case $2
      when 'to_s'      then $1
      when 'const_get' then 'const'
      when 'new' then
        $1.split('::').last.  # ClassName => class_name
          gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
          gsub(/([a-z\d])([A-Z])/,'\1_\2').
          downcase
      else
        $2
      end
    end

    # class prefixes
    value.gsub!(/[A-Za-z0-9_:]+::/, '')

    # simple expressions
    value = $1 if value =~ /^([a-z0-9_]+)\s*[-*+\/]/

    @block_params = value.strip
  end

  ##
  # HTML id-friendly method/attribute name

  def html_name
    require 'cgi'

    CGI.escape(@name.gsub('-', '-2D')).gsub('%','-').sub(/^-/, '')
  end

  ##
  # Full method/attribute name including namespace

  def full_name
    @full_name ||= "#{parent_name}#{pretty_name}"
  end

  def inspect # :nodoc:
    alias_for = @is_alias_for ? " (alias for #{@is_alias_for.name})" : nil
    visibility = self.visibility
    visibility = "forced #{visibility}" if force_documentation
    "#<%s:0x%x %s (%s)%s>" % [
      self.class, object_id,
      full_name,
      visibility,
      alias_for,
    ]
  end

  ##
  # '::' for a class method/attribute, '#' for an instance method.

  def name_prefix
    @singleton ? '::' : '#'
  end

  ##
  # Name for output to HTML.  For class methods the full name with a "." is
  # used like +SomeClass.method_name+.  For instance methods the class name is
  # used if +context+ does not match the parent.
  #
  # This is to help prevent people from using :: to call class methods.

  def output_name context
    return "#{name_prefix}#{@name}" if context == parent

    "#{parent_name}#{@singleton ? '.' : '#'}#{@name}"
  end

  ##
  # Method/attribute name with class/instance indicator

  def pretty_name
    "#{name_prefix}#{@name}"
  end

  ##
  # Type of method/attribute (class or instance)

  def type
    singleton ? 'class' : 'instance'
  end

  ##
  # Path to this method for use with HTML generator output.

  def path
    "#{@parent.path}##{aref}"
  end

  ##
  # Name of our parent with special handling for un-marshaled methods

  def parent_name
    @parent_name || super
  end

  def pretty_print q # :nodoc:
    alias_for =
      if @is_alias_for.respond_to? :name then
        "alias for #{@is_alias_for.name}"
      elsif Array === @is_alias_for then
        "alias for #{@is_alias_for.last}"
      end

    q.group 2, "[#{self.class.name} #{full_name} #{visibility}", "]" do
      if alias_for then
        q.breakable
        q.text alias_for
      end

      if text then
        q.breakable
        q.text "text:"
        q.breakable
        q.pp @text
      end

      unless comment.empty? then
        q.breakable
        q.text "comment:"
        q.breakable
        q.pp @comment
      end
    end
  end

  ##
  # Used by RDoc::Generator::JsonIndex to create a record for the search
  # engine.

  def search_record
    [
      @name,
      full_name,
      @name,
      @parent.full_name,
      path,
      params,
      snippet(@comment),
    ]
  end

  def to_s # :nodoc:
    if @is_alias_for
      "#{self.class.name}: #{full_name} -> #{is_alias_for}"
    else
      "#{self.class.name}: #{full_name}"
    end
  end

end

PK}$[ʥ9e��*gems/gems/rdoc-6.4.1.1/lib/rdoc/tom_doc.rbnu�[���# frozen_string_literal: true
# :markup: tomdoc

# A parser for TomDoc based on TomDoc 1.0.0-rc1 (02adef9b5a)
#
# The TomDoc specification can be found at:
#
# http://tomdoc.org
#
# The latest version of the TomDoc specification can be found at:
#
# https://github.com/mojombo/tomdoc/blob/master/tomdoc.md
#
# To choose TomDoc as your only default format see RDoc::Options@Saved+Options
# for instructions on setting up a <code>.rdoc_options</code> file to store
# your project default.
#
# There are a few differences between this parser and the specification.  A
# best-effort was made to follow the specification as closely as possible but
# some choices to deviate were made.
#
# A future version of RDoc will warn when a MUST or MUST NOT is violated and
# may warn when a SHOULD or SHOULD NOT is violated.  RDoc will always try
# to emit documentation even if given invalid TomDoc.
#
# Here are some implementation choices this parser currently makes:
#
# This parser allows rdoc-style inline markup but you should not depended on
# it.
#
# This parser allows a space between the comment and the method body.
#
# This parser does not require the default value to be described for an
# optional argument.
#
# This parser does not examine the order of sections.  An Examples section may
# precede the Arguments section.
#
# This class is documented in TomDoc format.  Since this is a subclass of the
# RDoc markup parser there isn't much to see here, unfortunately.

class RDoc::TomDoc < RDoc::Markup::Parser

  # Internal: Token accessor

  attr_reader :tokens

  # Internal: Adds a post-processor which sets the RDoc section based on the
  # comment's status.
  #
  # Returns nothing.

  def self.add_post_processor # :nodoc:
    RDoc::Markup::PreProcess.post_process do |comment, code_object|
      next unless code_object and
                  RDoc::Comment === comment and comment.format == 'tomdoc'

      comment.text.gsub!(/(\A\s*# )(Public|Internal|Deprecated):\s+/) do
        section = code_object.add_section $2
        code_object.temporary_section = section

        $1
      end
    end
  end

  add_post_processor

  # Public: Parses TomDoc from text
  #
  # text - A String containing TomDoc-format text.
  #
  # Examples
  #
  #   RDoc::TomDoc.parse <<-TOMDOC
  #   This method does some things
  #
  #   Returns nothing.
  #   TOMDOC
  #   # => #<RDoc::Markup::Document:0xXXX @parts=[...], @file=nil>
  #
  # Returns an RDoc::Markup::Document representing the TomDoc format.

  def self.parse text
    parser = new

    parser.tokenize text
    doc = RDoc::Markup::Document.new
    parser.parse doc
    doc
  end

  # Internal: Extracts the Signature section's method signature
  #
  # comment - An RDoc::Comment that will be parsed and have the signature
  #           extracted
  #
  # Returns a String containing the signature and nil if not

  def self.signature comment
    return unless comment.tomdoc?

    document = comment.parse

    signature = nil
    found_heading = false
    found_signature = false

    document.parts.delete_if do |part|
      next false if found_signature

      found_heading ||=
        RDoc::Markup::Heading === part && part.text == 'Signature'

      next false unless found_heading

      next true if RDoc::Markup::BlankLine === part

      if RDoc::Markup::Verbatim === part then
        signature = part
        found_signature = true
      end
    end

    signature and signature.text
  end

  # Public: Creates a new TomDoc parser.  See also RDoc::Markup::parse

  def initialize
    super

    @section      = nil
    @seen_returns = false
  end

  # Internal: Builds a heading from the token stream
  #
  # level - The level of heading to create
  #
  # Returns an RDoc::Markup::Heading

  def build_heading level
    heading = super

    @section = heading.text

    heading
  end

  # Internal: Builds a verbatim from the token stream.  A verbatim in the
  # Examples section will be marked as in Ruby format.
  #
  # margin - The indentation from the margin for lines that belong to this
  #          verbatim section.
  #
  # Returns an RDoc::Markup::Verbatim

  def build_verbatim margin
    verbatim = super

    verbatim.format = :ruby if @section == 'Examples'

    verbatim
  end

  # Internal: Builds a paragraph from the token stream
  #
  # margin - Unused
  #
  # Returns an RDoc::Markup::Paragraph.

  def build_paragraph margin
    p :paragraph_start => margin if @debug

    paragraph = RDoc::Markup::Paragraph.new

    until @tokens.empty? do
      type, data, = get

      case type
      when :TEXT then
        @section = 'Returns' if data =~ /\A(Returns|Raises)/

        paragraph << data
      when :NEWLINE then
        if :TEXT == peek_token[0] then
          # Lines beginning with 'Raises' in the Returns section should not be
          # treated as multiline text
          if 'Returns' == @section and
            peek_token[1].start_with?('Raises') then
            break
          else
            paragraph << ' '
          end
        else
          break
        end
      else
        unget
        break
      end
    end

    p :paragraph_end => margin if @debug

    paragraph
  end

  ##
  # Detects a section change to "Returns" and adds a heading

  def parse_text parent, indent # :nodoc:
    paragraph = build_paragraph indent

    if false == @seen_returns and 'Returns' == @section then
      @seen_returns = true
      parent << RDoc::Markup::Heading.new(3, 'Returns')
      parent << RDoc::Markup::BlankLine.new
    end

    parent << paragraph
  end

  # Internal: Turns text into an Array of tokens
  #
  # text - A String containing TomDoc-format text.
  #
  # Returns self.

  def tokenize text
    text = text.sub(/\A(Public|Internal|Deprecated):\s+/, '')

    setup_scanner text

    until @s.eos? do
      pos = @s.pos

      # leading spaces will be reflected by the column of the next token
      # the only thing we loose are trailing spaces at the end of the file
      next if @s.scan(/ +/)

      @tokens << case
                 when @s.scan(/\r?\n/) then
                   token = [:NEWLINE, @s.matched, *pos]
                   @s.newline!
                   token
                 when @s.scan(/(Examples|Signature)$/) then
                   @tokens << [:HEADER, 3, *pos]

                   [:TEXT, @s[1], *pos]
                 when @s.scan(/([:\w][\w\[\]]*)[ ]+- /) then
                   [:NOTE, @s[1], *pos]
                 else
                   @s.scan(/.*/)
                   [:TEXT, @s.matched.sub(/\r$/, ''), *pos]
                 end
    end

    self
  end

end
PK}$[x�����'gems/gems/rdoc-6.4.1.1/lib/rdoc/task.rbnu�[���# frozen_string_literal: true
#--
# Copyright (c) 2003, 2004 Jim Weirich, 2009 Eric Hodel
#
# 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.
#++

begin
  gem 'rdoc'
rescue Gem::LoadError
end unless defined?(RDoc)

begin
  gem 'rake'
rescue Gem::LoadError
end unless defined?(Rake)

require 'rdoc'
require 'rake'
require 'rake/tasklib'

##
# RDoc::Task creates the following rake tasks to generate and clean up RDoc
# output:
#
# [rdoc]
#   Main task for this RDoc task.
#
# [clobber_rdoc]
#   Delete all the rdoc files.  This target is automatically added to the main
#   clobber target.
#
# [rerdoc]
#   Rebuild the rdoc files from scratch, even if they are not out of date.
#
# Simple Example:
#
#   require 'rdoc/task'
#
#   RDoc::Task.new do |rdoc|
#     rdoc.main = "README.rdoc"
#     rdoc.rdoc_files.include("README.rdoc", "lib/**/*.rb")
#   end
#
# The +rdoc+ object passed to the block is an RDoc::Task object. See the
# attributes list for the RDoc::Task class for available customization options.
#
# == Specifying different task names
#
# You may wish to give the task a different name, such as if you are
# generating two sets of documentation.  For instance, if you want to have a
# development set of documentation including private methods:
#
#   require 'rdoc/task'
#
#   RDoc::Task.new :rdoc_dev do |rdoc|
#     rdoc.main = "README.doc"
#     rdoc.rdoc_files.include("README.rdoc", "lib/**/*.rb")
#     rdoc.options << "--all"
#   end
#
# The tasks would then be named :<em>rdoc_dev</em>,
# :clobber_<em>rdoc_dev</em>, and :re<em>rdoc_dev</em>.
#
# If you wish to have completely different task names, then pass a Hash as
# first argument. With the <tt>:rdoc</tt>, <tt>:clobber_rdoc</tt> and
# <tt>:rerdoc</tt> options, you can customize the task names to your liking.
#
# For example:
#
#   require 'rdoc/task'
#
#   RDoc::Task.new(:rdoc => "rdoc", :clobber_rdoc => "rdoc:clean",
#                  :rerdoc => "rdoc:force")
#
# This will create the tasks <tt>:rdoc</tt>, <tt>:rdoc:clean</tt> and
# <tt>:rdoc:force</tt>.

class RDoc::Task < Rake::TaskLib

  ##
  # Name of the main, top level task.  (default is :rdoc)

  attr_accessor :name

  ##
  # Comment markup format.  rdoc, rd and tomdoc are supported.  (default is
  # 'rdoc')

  attr_accessor :markup

  ##
  # Name of directory to receive the html output files. (default is "html")

  attr_accessor :rdoc_dir

  ##
  # Title of RDoc documentation. (defaults to rdoc's default)

  attr_accessor :title

  ##
  # Name of file to be used as the main, top level file of the RDoc. (default
  # is none)

  attr_accessor :main

  ##
  # Name of template to be used by rdoc. (defaults to rdoc's default)

  attr_accessor :template

  ##
  # Name of format generator (<tt>--format</tt>) used by rdoc. (defaults to
  # rdoc's default)

  attr_accessor :generator

  ##
  # List of files to be included in the rdoc generation. (default is [])

  attr_accessor :rdoc_files

  ##
  # Additional list of options to be passed rdoc.  (default is [])

  attr_accessor :options

  ##
  # Whether to run the rdoc process as an external shell (default is false)

  attr_accessor :external

  ##
  # Create an RDoc task with the given name. See the RDoc::Task class overview
  # for documentation.

  def initialize name = :rdoc # :yield: self
    defaults

    check_names name

    @name = name

    yield self if block_given?

    define
  end

  ##
  # Ensures that +names+ only includes names for the :rdoc, :clobber_rdoc and
  # :rerdoc.  If other names are given an ArgumentError is raised.

  def check_names names
    return unless Hash === names

    invalid_options =
      names.keys.map { |k| k.to_sym } - [:rdoc, :clobber_rdoc, :rerdoc]

    unless invalid_options.empty? then
      raise ArgumentError, "invalid options: #{invalid_options.join ', '}"
    end
  end

  ##
  # Task description for the clobber rdoc task or its renamed equivalent

  def clobber_task_description
    "Remove RDoc HTML files"
  end

  ##
  # Sets default task values

  def defaults
    @name = :rdoc
    @rdoc_files = Rake::FileList.new
    @rdoc_dir = 'html'
    @main = nil
    @title = nil
    @template = nil
    @generator = nil
    @options = []
  end

  ##
  # All source is inline now.  This method is deprecated

  def inline_source # :nodoc:
    warn "RDoc::Task#inline_source is deprecated"
    true
  end

  ##
  # All source is inline now.  This method is deprecated

  def inline_source=(value) # :nodoc:
    warn "RDoc::Task#inline_source is deprecated"
  end

  ##
  # Create the tasks defined by this task lib.

  def define
    desc rdoc_task_description
    task rdoc_task_name

    desc rerdoc_task_description
    task rerdoc_task_name => [clobber_task_name, rdoc_task_name]

    desc clobber_task_description
    task clobber_task_name do
      rm_r @rdoc_dir rescue nil
    end

    task :clobber => [clobber_task_name]

    directory @rdoc_dir

    rdoc_target_deps = [
      @rdoc_files,
      Rake.application.rakefile
    ].flatten.compact

    task rdoc_task_name => [rdoc_target]
    file rdoc_target => rdoc_target_deps do
      @before_running_rdoc.call if @before_running_rdoc
      args = option_list + @rdoc_files

      $stderr.puts "rdoc #{args.join ' '}" if Rake.application.options.trace
      RDoc::RDoc.new.document args
    end

    self
  end

  ##
  # List of options that will be supplied to RDoc

  def option_list
    result = @options.dup
    result << "-o"       << @rdoc_dir
    result << "--main"   << main      if main
    result << "--markup" << markup    if markup
    result << "--title"  << title     if title
    result << "-T"       << template  if template
    result << '-f'       << generator if generator
    result
  end

  ##
  # The block passed to this method will be called just before running the
  # RDoc generator. It is allowed to modify RDoc::Task attributes inside the
  # block.

  def before_running_rdoc(&block)
    @before_running_rdoc = block
  end

  ##
  # Task description for the rdoc task or its renamed equivalent

  def rdoc_task_description
    'Build RDoc HTML files'
  end

  ##
  # Task description for the rerdoc task or its renamed description

  def rerdoc_task_description
    "Rebuild RDoc HTML files"
  end

  private

  def rdoc_target
    "#{rdoc_dir}/created.rid"
  end

  def rdoc_task_name
    case name
    when Hash then (name[:rdoc] || "rdoc").to_s
    else           name.to_s
    end
  end

  def clobber_task_name
    case name
    when Hash then (name[:clobber_rdoc] || "clobber_rdoc").to_s
    else           "clobber_#{name}"
    end
  end

  def rerdoc_task_name
    case name
    when Hash then (name[:rerdoc] || "rerdoc").to_s
    else           "re#{name}"
    end
  end

end

# :stopdoc:
module Rake

  ##
  # For backwards compatibility

  RDocTask = RDoc::Task

end
# :startdoc:
PK}$[�-�%%.gems/gems/rdoc-6.4.1.1/lib/rdoc/code_object.rbnu�[���# frozen_string_literal: true
##
# Base class for the RDoc code tree.
#
# We contain the common stuff for contexts (which are containers) and other
# elements (methods, attributes and so on)
#
# Here's the tree of the CodeObject subclasses:
#
# * RDoc::Context
#   * RDoc::TopLevel
#   * RDoc::ClassModule
#     * RDoc::AnonClass (never used so far)
#     * RDoc::NormalClass
#     * RDoc::NormalModule
#     * RDoc::SingleClass
# * RDoc::MethodAttr
#   * RDoc::Attr
#   * RDoc::AnyMethod
#     * RDoc::GhostMethod
#     * RDoc::MetaMethod
# * RDoc::Alias
# * RDoc::Constant
# * RDoc::Mixin
#   * RDoc::Require
#   * RDoc::Include

class RDoc::CodeObject

  include RDoc::Text

  ##
  # Our comment

  attr_reader :comment

  ##
  # Do we document our children?

  attr_reader :document_children

  ##
  # Do we document ourselves?

  attr_reader :document_self

  ##
  # Are we done documenting (ie, did we come across a :enddoc:)?

  attr_reader :done_documenting

  ##
  # Which file this code object was defined in

  attr_reader :file

  ##
  # Force documentation of this CodeObject

  attr_reader :force_documentation

  ##
  # Line in #file where this CodeObject was defined

  attr_accessor :line

  ##
  # Hash of arbitrary metadata for this CodeObject

  attr_reader :metadata

  ##
  # Sets the parent CodeObject

  attr_writer :parent

  ##
  # Did we ever receive a +:nodoc:+ directive?

  attr_reader :received_nodoc

  ##
  # Set the section this CodeObject is in

  attr_writer :section

  ##
  # The RDoc::Store for this object.

  attr_reader :store

  ##
  # We are the model of the code, but we know that at some point we will be
  # worked on by viewers. By implementing the Viewable protocol, viewers can
  # associated themselves with these objects.

  attr_accessor :viewer

  ##
  # Creates a new CodeObject that will document itself and its children

  def initialize
    @metadata         = {}
    @comment          = ''
    @parent           = nil
    @parent_name      = nil # for loading
    @parent_class     = nil # for loading
    @section          = nil
    @section_title    = nil # for loading
    @file             = nil
    @full_name        = nil
    @store            = nil
    @track_visibility = true

    initialize_visibility
  end

  ##
  # Initializes state for visibility of this CodeObject and its children.

  def initialize_visibility # :nodoc:
    @document_children   = true
    @document_self       = true
    @done_documenting    = false
    @force_documentation = false
    @received_nodoc      = false
    @ignored             = false
    @suppressed          = false
    @track_visibility    = true
  end

  ##
  # Replaces our comment with +comment+, unless it is empty.

  def comment=(comment)
    @comment = case comment
               when NilClass               then ''
               when RDoc::Markup::Document then comment
               when RDoc::Comment          then comment.normalize
               else
                 if comment and not comment.empty? then
                   normalize_comment comment
                 else
                   # HACK correct fix is to have #initialize create @comment
                   #      with the correct encoding
                   if String === @comment and @comment.empty? then
                     @comment = RDoc::Encoding.change_encoding @comment, comment.encoding
                   end
                   @comment
                 end
               end
  end

  ##
  # Should this CodeObject be displayed in output?
  #
  # A code object should be displayed if:
  #
  # * The item didn't have a nodoc or wasn't in a container that had nodoc
  # * The item wasn't ignored
  # * The item has documentation and was not suppressed

  def display?
    @document_self and not @ignored and
      (documented? or not @suppressed)
  end

  ##
  # Enables or disables documentation of this CodeObject's children unless it
  # has been turned off by :enddoc:

  def document_children=(document_children)
    return unless @track_visibility

    @document_children = document_children unless @done_documenting
  end

  ##
  # Enables or disables documentation of this CodeObject unless it has been
  # turned off by :enddoc:.  If the argument is +nil+ it means the
  # documentation is turned off by +:nodoc:+.

  def document_self=(document_self)
    return unless @track_visibility
    return if @done_documenting

    @document_self = document_self
    @received_nodoc = true if document_self.nil?
  end

  ##
  # Does this object have a comment with content or is #received_nodoc true?

  def documented?
    @received_nodoc or !@comment.empty?
  end

  ##
  # Turns documentation on/off, and turns on/off #document_self
  # and #document_children.
  #
  # Once documentation has been turned off (by +:enddoc:+),
  # the object will refuse to turn #document_self or
  # #document_children on, so +:doc:+ and +:start_doc:+ directives
  # will have no effect in the current file.

  def done_documenting=(value)
    return unless @track_visibility
    @done_documenting  = value
    @document_self     = !value
    @document_children = @document_self
  end

  ##
  # Yields each parent of this CodeObject.  See also
  # RDoc::ClassModule#each_ancestor

  def each_parent
    code_object = self

    while code_object = code_object.parent do
      yield code_object
    end

    self
  end

  ##
  # File name where this CodeObject was found.
  #
  # See also RDoc::Context#in_files

  def file_name
    return unless @file

    @file.absolute_name
  end

  ##
  # Force the documentation of this object unless documentation
  # has been turned off by :enddoc:
  #--
  # HACK untested, was assigning to an ivar

  def force_documentation=(value)
    @force_documentation = value unless @done_documenting
  end

  ##
  # Sets the full_name overriding any computed full name.
  #
  # Set to +nil+ to clear RDoc's cached value

  def full_name= full_name
    @full_name = full_name
  end

  ##
  # Use this to ignore a CodeObject and all its children until found again
  # (#record_location is called).  An ignored item will not be displayed in
  # documentation.
  #
  # See github issue #55
  #
  # The ignored status is temporary in order to allow implementation details
  # to be hidden.  At the end of processing a file RDoc allows all classes
  # and modules to add new documentation to previously created classes.
  #
  # If a class was ignored (via stopdoc) then reopened later with additional
  # documentation it should be displayed.  If a class was ignored and never
  # reopened it should not be displayed.  The ignore flag allows this to
  # occur.

  def ignore
    return unless @track_visibility

    @ignored = true

    stop_doc
  end

  ##
  # Has this class been ignored?
  #
  # See also #ignore

  def ignored?
    @ignored
  end

  ##
  # The options instance from the store this CodeObject is attached to, or a
  # default options instance if the CodeObject is not attached.
  #
  # This is used by Text#snippet

  def options
    if @store and @store.rdoc then
      @store.rdoc.options
    else
      RDoc::Options.new
    end
  end

  ##
  # Our parent CodeObject.  The parent may be missing for classes loaded from
  # legacy RI data stores.

  def parent
    return @parent if @parent
    return nil unless @parent_name

    if @parent_class == RDoc::TopLevel then
      @parent = @store.add_file @parent_name
    else
      @parent = @store.find_class_or_module @parent_name

      return @parent if @parent

      begin
        @parent = @store.load_class @parent_name
      rescue RDoc::Store::MissingFileError
        nil
      end
    end
  end

  ##
  # File name of our parent

  def parent_file_name
    @parent ? @parent.base_name : '(unknown)'
  end

  ##
  # Name of our parent

  def parent_name
    @parent ? @parent.full_name : '(unknown)'
  end

  ##
  # Records the RDoc::TopLevel (file) where this code object was defined

  def record_location top_level
    @ignored    = false
    @suppressed = false
    @file       = top_level
  end

  ##
  # The section this CodeObject is in.  Sections allow grouping of constants,
  # attributes and methods inside a class or module.

  def section
    return @section if @section

    @section = parent.add_section @section_title if parent
  end

  ##
  # Enable capture of documentation unless documentation has been
  # turned off by :enddoc:

  def start_doc
    return if @done_documenting

    @document_self = true
    @document_children = true
    @ignored    = false
    @suppressed = false
  end

  ##
  # Disable capture of documentation

  def stop_doc
    return unless @track_visibility

    @document_self = false
    @document_children = false
  end

  ##
  # Sets the +store+ that contains this CodeObject

  def store= store
    @store = store

    return unless @track_visibility

    if :nodoc == options.visibility then
      initialize_visibility
      @track_visibility = false
    end
  end

  ##
  # Use this to suppress a CodeObject and all its children until the next file
  # it is seen in or documentation is discovered.  A suppressed item with
  # documentation will be displayed while an ignored item with documentation
  # may not be displayed.

  def suppress
    return unless @track_visibility

    @suppressed = true

    stop_doc
  end

  ##
  # Has this class been suppressed?
  #
  # See also #suppress

  def suppressed?
    @suppressed
  end

end
PK}$[S�2��,gems/gems/rdoc-6.4.1.1/lib/rdoc/i18n/text.rbnu�[���# frozen_string_literal: true
##
# An i18n supported text.
#
# This object provides the following two features:
#
#   * Extracts translation messages from wrapped raw text.
#   * Translates wrapped raw text in specified locale.
#
# Wrapped raw text is one of String, RDoc::Comment or Array of them.

class RDoc::I18n::Text

  ##
  # Creates a new i18n supported text for +raw+ text.

  def initialize(raw)
    @raw = raw
  end

  ##
  # Extracts translation target messages and yields each message.
  #
  # Each yielded message is a Hash. It consists of the followings:
  #
  # :type      :: :paragraph
  # :paragraph :: String (The translation target message itself.)
  # :line_no   :: Integer (The line number of the :paragraph is started.)
  #
  # The above content may be added in the future.

  def extract_messages
    parse do |part|
      case part[:type]
      when :empty_line
        # ignore
      when :paragraph
        yield(part)
      end
    end
  end

  # Translates raw text into +locale+.
  def translate(locale)
    translated_text = ''
    parse do |part|
      case part[:type]
      when :paragraph
        translated_text += locale.translate(part[:paragraph])
      when :empty_line
        translated_text += part[:line]
      else
        raise "should not reach here: unexpected type: #{type}"
      end
    end
    translated_text
  end

  private
  def parse(&block)
    paragraph = ''
    paragraph_start_line = 0
    line_no = 0

    each_line(@raw) do |line|
      line_no += 1
      case line
      when /\A\s*\z/
        if paragraph.empty?
          emit_empty_line_event(line, line_no, &block)
        else
          paragraph += line
          emit_paragraph_event(paragraph, paragraph_start_line, line_no,
                               &block)
          paragraph = ''
        end
      else
        paragraph_start_line = line_no if paragraph.empty?
        paragraph += line
      end
    end

    unless paragraph.empty?
      emit_paragraph_event(paragraph, paragraph_start_line, line_no, &block)
    end
  end

  def each_line(raw, &block)
    case raw
    when RDoc::Comment
      raw.text.each_line(&block)
    when Array
      raw.each do |comment, location|
        each_line(comment, &block)
      end
    else
      raw.each_line(&block)
    end
  end

  def emit_empty_line_event(line, line_no)
    part = {
      :type => :empty_line,
      :line => line,
      :line_no => line_no,
    }
    yield(part)
  end

  def emit_paragraph_event(paragraph, paragraph_start_line, line_no, &block)
    paragraph_part = {
      :type => :paragraph,
      :line_no => paragraph_start_line,
    }
    match_data = /(\s*)\z/.match(paragraph)
    if match_data
      paragraph_part[:paragraph] = match_data.pre_match
      yield(paragraph_part)
      emit_empty_line_event(match_data[1], line_no, &block)
    else
      paragraph_part[:paragraph] = paragraph
      yield(paragraph_part)
    end
  end

end
PK}$[KzVf	f	.gems/gems/rdoc-6.4.1.1/lib/rdoc/i18n/locale.rbnu�[���# frozen_string_literal: true
##
# A message container for a locale.
#
# This object provides the following two features:
#
#   * Loads translated messages from .po file.
#   * Translates a message into the locale.

class RDoc::I18n::Locale

  @@locales = {} # :nodoc:

  class << self

    ##
    # Returns the locale object for +locale_name+.

    def [](locale_name)
      @@locales[locale_name] ||= new(locale_name)
    end

    ##
    # Sets the locale object for +locale_name+.
    #
    # Normally, this method is not used. This method is useful for
    # testing.

    def []=(locale_name, locale)
      @@locales[locale_name] = locale
    end

  end

  ##
  # The name of the locale. It uses IETF language tag format
  # +[language[_territory][.codeset][@modifier]]+.
  #
  # See also {BCP 47 - Tags for Identifying
  # Languages}[http://tools.ietf.org/rfc/bcp/bcp47.txt].

  attr_reader :name

  ##
  # Creates a new locale object for +name+ locale. +name+ must
  # follow IETF language tag format.

  def initialize(name)
    @name = name
    @messages = {}
  end

  ##
  # Loads translation messages from +locale_directory+/+@name+/rdoc.po
  # or +locale_directory+/+@name+.po. The former has high priority.
  #
  # This method requires gettext gem for parsing .po file. If you
  # don't have gettext gem, this method doesn't load .po file. This
  # method warns and returns +false+.
  #
  # Returns +true+ if succeeded, +false+ otherwise.

  def load(locale_directory)
    return false if @name.nil?

    po_file_candidates = [
      File.join(locale_directory, @name, 'rdoc.po'),
      File.join(locale_directory, "#{@name}.po"),
    ]
    po_file = po_file_candidates.find do |po_file_candidate|
      File.exist?(po_file_candidate)
    end
    return false unless po_file

    begin
      require 'gettext/po_parser'
      require 'gettext/mo'
    rescue LoadError
      warn('Need gettext gem for i18n feature:')
      warn('  gem install gettext')
      return false
    end

    po_parser = GetText::POParser.new
    messages = GetText::MO.new
    po_parser.report_warning = false
    po_parser.parse_file(po_file, messages)

    @messages.merge!(messages)

    true
  end

  ##
  # Translates the +message+ into locale. If there is no translation
  # messages for +message+ in locale, +message+ itself is returned.

  def translate(message)
    @messages[message] || message
  end

end
PK}$[(�.�Z�Z(gems/gems/rdoc-6.4.1.1/lib/rdoc/store.rbnu�[���# frozen_string_literal: true
require 'fileutils'

##
# A set of rdoc data for a single project (gem, path, etc.).
#
# The store manages reading and writing ri data for a project and maintains a
# cache of methods, classes and ancestors in the store.
#
# The store maintains a #cache of its contents for faster lookup.  After
# adding items to the store it must be flushed using #save_cache.  The cache
# contains the following structures:
#
#    @cache = {
#      :ancestors        => {}, # class name => ancestor names
#      :attributes       => {}, # class name => attributes
#      :class_methods    => {}, # class name => class methods
#      :instance_methods => {}, # class name => instance methods
#      :modules          => [], # classes and modules in this store
#      :pages            => [], # page names
#    }
#--
# TODO need to prune classes

class RDoc::Store

  ##
  # Errors raised from loading or saving the store

  class Error < RDoc::Error
  end

  ##
  # Raised when a stored file for a class, module, page or method is missing.

  class MissingFileError < Error

    ##
    # The store the file should exist in

    attr_reader :store

    ##
    # The file the #name should be saved as

    attr_reader :file

    ##
    # The name of the object the #file would be loaded from

    attr_reader :name

    ##
    # Creates a new MissingFileError for the missing +file+ for the given
    # +name+ that should have been in the +store+.

    def initialize store, file, name
      @store = store
      @file  = file
      @name  = name
    end

    def message # :nodoc:
      "store at #{@store.path} missing file #{@file} for #{@name}"
    end

  end

  ##
  # Stores the name of the C variable a class belongs to.  This helps wire up
  # classes defined from C across files.

  attr_reader :c_enclosure_classes # :nodoc:

  attr_reader :c_enclosure_names # :nodoc:

  ##
  # Maps C variables to class or module names for each parsed C file.

  attr_reader :c_class_variables

  ##
  # Maps C variables to singleton class names for each parsed C file.

  attr_reader :c_singleton_class_variables

  ##
  # If true this Store will not write any files

  attr_accessor :dry_run

  ##
  # Path this store reads or writes

  attr_accessor :path

  ##
  # The RDoc::RDoc driver for this parse tree.  This allows classes consulting
  # the documentation tree to access user-set options, for example.

  attr_accessor :rdoc

  ##
  # Type of ri datastore this was loaded from.  See RDoc::RI::Driver,
  # RDoc::RI::Paths.

  attr_accessor :type

  ##
  # The contents of the Store

  attr_reader :cache

  ##
  # The encoding of the contents in the Store

  attr_accessor :encoding

  ##
  # The lazy constants alias will be discovered in passing

  attr_reader :unmatched_constant_alias

  ##
  # Creates a new Store of +type+ that will load or save to +path+

  def initialize path = nil, type = nil
    @dry_run  = false
    @encoding = nil
    @path     = path
    @rdoc     = nil
    @type     = type

    @cache = {
      :ancestors                   => {},
      :attributes                  => {},
      :class_methods               => {},
      :c_class_variables           => {},
      :c_singleton_class_variables => {},
      :encoding                    => @encoding,
      :instance_methods            => {},
      :main                        => nil,
      :modules                     => [],
      :pages                       => [],
      :title                       => nil,
    }

    @classes_hash = {}
    @modules_hash = {}
    @files_hash   = {}
    @text_files_hash = {}

    @c_enclosure_classes = {}
    @c_enclosure_names   = {}

    @c_class_variables           = {}
    @c_singleton_class_variables = {}

    @unique_classes = nil
    @unique_modules = nil

    @unmatched_constant_alias = {}
  end

  ##
  # Adds +module+ as an enclosure (namespace) for the given +variable+ for C
  # files.

  def add_c_enclosure variable, namespace
    @c_enclosure_classes[variable] = namespace
  end

  ##
  # Adds C variables from an RDoc::Parser::C

  def add_c_variables c_parser
    filename = c_parser.top_level.relative_name

    @c_class_variables[filename] = make_variable_map c_parser.classes

    @c_singleton_class_variables[filename] = c_parser.singleton_classes
  end

  ##
  # Adds the file with +name+ as an RDoc::TopLevel to the store.  Returns the
  # created RDoc::TopLevel.

  def add_file absolute_name, relative_name: absolute_name, parser: nil
    unless top_level = @files_hash[relative_name] then
      top_level = RDoc::TopLevel.new absolute_name, relative_name
      top_level.parser = parser if parser
      top_level.store = self
      @files_hash[relative_name] = top_level
      @text_files_hash[relative_name] = top_level if top_level.text?
    end

    top_level
  end

  def update_parser_of_file(absolute_name, parser)
    if top_level = @files_hash[absolute_name] then
      @text_files_hash[absolute_name] = top_level if top_level.text?
    end
  end

  ##
  # Returns all classes discovered by RDoc

  def all_classes
    @classes_hash.values
  end

  ##
  # Returns all classes and modules discovered by RDoc

  def all_classes_and_modules
    @classes_hash.values + @modules_hash.values
  end

  ##
  # All TopLevels known to RDoc

  def all_files
    @files_hash.values
  end

  ##
  # Returns all modules discovered by RDoc

  def all_modules
    modules_hash.values
  end

  ##
  # Ancestors cache accessor.  Maps a klass name to an Array of its ancestors
  # in this store.  If Foo in this store inherits from Object, Kernel won't be
  # listed (it will be included from ruby's ri store).

  def ancestors
    @cache[:ancestors]
  end

  ##
  # Attributes cache accessor.  Maps a class to an Array of its attributes.

  def attributes
    @cache[:attributes]
  end

  ##
  # Path to the cache file

  def cache_path
    File.join @path, 'cache.ri'
  end

  ##
  # Path to the ri data for +klass_name+

  def class_file klass_name
    name = klass_name.split('::').last
    File.join class_path(klass_name), "cdesc-#{name}.ri"
  end

  ##
  # Class methods cache accessor.  Maps a class to an Array of its class
  # methods (not full name).

  def class_methods
    @cache[:class_methods]
  end

  ##
  # Path where data for +klass_name+ will be stored (methods or class data)

  def class_path klass_name
    File.join @path, *klass_name.split('::')
  end

  ##
  # Hash of all classes known to RDoc

  def classes_hash
    @classes_hash
  end

  ##
  # Removes empty items and ensures item in each collection are unique and
  # sorted

  def clean_cache_collection collection # :nodoc:
    collection.each do |name, item|
      if item.empty? then
        collection.delete name
      else
        # HACK mongrel-1.1.5 documents its files twice
        item.uniq!
        item.sort!
      end
    end
  end

  ##
  # Prepares the RDoc code object tree for use by a generator.
  #
  # It finds unique classes/modules defined, and replaces classes/modules that
  # are aliases for another one by a copy with RDoc::ClassModule#is_alias_for
  # set.
  #
  # It updates the RDoc::ClassModule#constant_aliases attribute of "real"
  # classes or modules.
  #
  # It also completely removes the classes and modules that should be removed
  # from the documentation and the methods that have a visibility below
  # +min_visibility+, which is the <tt>--visibility</tt> option.
  #
  # See also RDoc::Context#remove_from_documentation?

  def complete min_visibility
    fix_basic_object_inheritance

    # cache included modules before they are removed from the documentation
    all_classes_and_modules.each { |cm| cm.ancestors }

    unless min_visibility == :nodoc then
      remove_nodoc @classes_hash
      remove_nodoc @modules_hash
    end

    @unique_classes = find_unique @classes_hash
    @unique_modules = find_unique @modules_hash

    unique_classes_and_modules.each do |cm|
      cm.complete min_visibility
    end

    @files_hash.each_key do |file_name|
      tl = @files_hash[file_name]

      unless tl.text? then
        tl.modules_hash.clear
        tl.classes_hash.clear

        tl.classes_or_modules.each do |cm|
          name = cm.full_name
          if cm.type == 'class' then
            tl.classes_hash[name] = cm if @classes_hash[name]
          else
            tl.modules_hash[name] = cm if @modules_hash[name]
          end
        end
      end
    end
  end

  ##
  # Hash of all files known to RDoc

  def files_hash
    @files_hash
  end

  ##
  # Finds the enclosure (namespace) for the given C +variable+.

  def find_c_enclosure variable
    @c_enclosure_classes.fetch variable do
      break unless name = @c_enclosure_names[variable]

      mod = find_class_or_module name

      unless mod then
        loaded_mod = load_class_data name

        file = loaded_mod.in_files.first

        return unless file # legacy data source

        file.store = self

        mod = file.add_module RDoc::NormalModule, name
      end

      @c_enclosure_classes[variable] = mod
    end
  end

  ##
  # Finds the class with +name+ in all discovered classes

  def find_class_named name
    @classes_hash[name]
  end

  ##
  # Finds the class with +name+ starting in namespace +from+

  def find_class_named_from name, from
    from = find_class_named from unless RDoc::Context === from

    until RDoc::TopLevel === from do
      return nil unless from

      klass = from.find_class_named name
      return klass if klass

      from = from.parent
    end

    find_class_named name
  end

  ##
  # Finds the class or module with +name+

  def find_class_or_module name
    name = $' if name =~ /^::/
    @classes_hash[name] || @modules_hash[name]
  end

  ##
  # Finds the file with +name+ in all discovered files

  def find_file_named name
    @files_hash[name]
  end

  ##
  # Finds the module with +name+ in all discovered modules

  def find_module_named name
    @modules_hash[name]
  end

  ##
  # Returns the RDoc::TopLevel that is a text file and has the given
  # +file_name+

  def find_text_page file_name
    @text_files_hash.each_value.find do |file|
      file.full_name == file_name
    end
  end

  ##
  # Finds unique classes/modules defined in +all_hash+,
  # and returns them as an array. Performs the alias
  # updates in +all_hash+: see ::complete.
  #--
  # TODO  aliases should be registered by Context#add_module_alias

  def find_unique all_hash
    unique = []

    all_hash.each_pair do |full_name, cm|
      unique << cm if full_name == cm.full_name
    end

    unique
  end

  ##
  # Fixes the erroneous <tt>BasicObject < Object</tt> in 1.9.
  #
  # Because we assumed all classes without a stated superclass
  # inherit from Object, we have the above wrong inheritance.
  #
  # We fix BasicObject right away if we are running in a Ruby
  # version >= 1.9.

  def fix_basic_object_inheritance
    basic = classes_hash['BasicObject']
    return unless basic
    basic.superclass = nil
  end

  ##
  # Friendly rendition of #path

  def friendly_path
    case type
    when :gem    then
      parent = File.expand_path '..', @path
      "gem #{File.basename parent}"
    when :home   then RDoc.home
    when :site   then 'ruby site'
    when :system then 'ruby core'
    else @path
    end
  end

  def inspect # :nodoc:
    "#<%s:0x%x %s %p>" % [self.class, object_id, @path, module_names.sort]
  end

  ##
  # Instance methods cache accessor.  Maps a class to an Array of its
  # instance methods (not full name).

  def instance_methods
    @cache[:instance_methods]
  end

  ##
  # Loads all items from this store into memory.  This recreates a
  # documentation tree for use by a generator

  def load_all
    load_cache

    module_names.each do |module_name|
      mod = find_class_or_module(module_name) || load_class(module_name)

      # load method documentation since the loaded class/module does not have
      # it
      loaded_methods = mod.method_list.map do |method|
        load_method module_name, method.full_name
      end

      mod.method_list.replace loaded_methods

      loaded_attributes = mod.attributes.map do |attribute|
        load_method module_name, attribute.full_name
      end

      mod.attributes.replace loaded_attributes
    end

    all_classes_and_modules.each do |mod|
      descendent_re = /^#{mod.full_name}::[^:]+$/

      module_names.each do |name|
        next unless name =~ descendent_re

        descendent = find_class_or_module name

        case descendent
        when RDoc::NormalClass then
          mod.classes_hash[name] = descendent
        when RDoc::NormalModule then
          mod.modules_hash[name] = descendent
        end
      end
    end

    @cache[:pages].each do |page_name|
      page = load_page page_name
      @files_hash[page_name] = page
      @text_files_hash[page_name] = page if page.text?
    end
  end

  ##
  # Loads cache file for this store

  def load_cache
    #orig_enc = @encoding

    @cache = marshal_load(cache_path)

    load_enc = @cache[:encoding]

    # TODO this feature will be time-consuming to add:
    # a) Encodings may be incompatible but transcodeable
    # b) Need to warn in the appropriate spots, wherever they may be
    # c) Need to handle cross-cache differences in encodings
    # d) Need to warn when generating into a cache with different encodings
    #
    #if orig_enc and load_enc != orig_enc then
    #  warn "Cached encoding #{load_enc} is incompatible with #{orig_enc}\n" \
    #       "from #{path}/cache.ri" unless
    #    Encoding.compatible? orig_enc, load_enc
    #end

    @encoding = load_enc unless @encoding

    @cache[:pages]                       ||= []
    @cache[:main]                        ||= nil
    @cache[:c_class_variables]           ||= {}
    @cache[:c_singleton_class_variables] ||= {}

    @cache[:c_class_variables].each do |_, map|
      map.each do |variable, name|
        @c_enclosure_names[variable] = name
      end
    end

    @cache
  rescue Errno::ENOENT
  end

  ##
  # Loads ri data for +klass_name+ and hooks it up to this store.

  def load_class klass_name
    obj = load_class_data klass_name

    obj.store = self

    case obj
    when RDoc::NormalClass then
      @classes_hash[klass_name] = obj
    when RDoc::SingleClass then
      @classes_hash[klass_name] = obj
    when RDoc::NormalModule then
      @modules_hash[klass_name] = obj
    end
  end

  ##
  # Loads ri data for +klass_name+

  def load_class_data klass_name
    file = class_file klass_name

    marshal_load(file)
  rescue Errno::ENOENT => e
    error = MissingFileError.new(self, file, klass_name)
    error.set_backtrace e.backtrace
    raise error
  end

  ##
  # Loads ri data for +method_name+ in +klass_name+

  def load_method klass_name, method_name
    file = method_file klass_name, method_name

    obj = marshal_load(file)
    obj.store = self
    obj.parent ||= find_class_or_module(klass_name) || load_class(klass_name)
    obj
  rescue Errno::ENOENT => e
    error = MissingFileError.new(self, file, klass_name + method_name)
    error.set_backtrace e.backtrace
    raise error
  end

  ##
  # Loads ri data for +page_name+

  def load_page page_name
    file = page_file page_name

    obj = marshal_load(file)
    obj.store = self
    obj
  rescue Errno::ENOENT => e
    error = MissingFileError.new(self, file, page_name)
    error.set_backtrace e.backtrace
    raise error
  end

  ##
  # Gets the main page for this RDoc store.  This page is used as the root of
  # the RDoc server.

  def main
    @cache[:main]
  end

  ##
  # Sets the main page for this RDoc store.

  def main= page
    @cache[:main] = page
  end

  ##
  # Converts the variable => ClassModule map +variables+ from a C parser into
  # a variable => class name map.

  def make_variable_map variables
    map = {}

    variables.each { |variable, class_module|
      map[variable] = class_module.full_name
    }

    map
  end

  ##
  # Path to the ri data for +method_name+ in +klass_name+

  def method_file klass_name, method_name
    method_name = method_name.split('::').last
    method_name =~ /#(.*)/
    method_type = $1 ? 'i' : 'c'
    method_name = $1 if $1
    method_name = method_name.gsub(/\W/) { "%%%02x" % $&[0].ord }

    File.join class_path(klass_name), "#{method_name}-#{method_type}.ri"
  end

  ##
  # Modules cache accessor.  An Array of all the module (and class) names in
  # the store.

  def module_names
    @cache[:modules]
  end

  ##
  # Hash of all modules known to RDoc

  def modules_hash
    @modules_hash
  end

  ##
  # Returns the RDoc::TopLevel that is a text file and has the given +name+

  def page name
    @text_files_hash.each_value.find do |file|
      file.page_name == name or file.base_name == name
    end
  end

  ##
  # Path to the ri data for +page_name+

  def page_file page_name
    file_name = File.basename(page_name).gsub('.', '_')

    File.join @path, File.dirname(page_name), "page-#{file_name}.ri"
  end

  ##
  # Removes from +all_hash+ the contexts that are nodoc or have no content.
  #
  # See RDoc::Context#remove_from_documentation?

  def remove_nodoc all_hash
    all_hash.keys.each do |name|
      context = all_hash[name]
      all_hash.delete(name) if context.remove_from_documentation?
    end
  end

  ##
  # Saves all entries in the store

  def save
    load_cache

    all_classes_and_modules.each do |klass|
      save_class klass

      klass.each_method do |method|
        save_method klass, method
      end

      klass.each_attribute do |attribute|
        save_method klass, attribute
      end
    end

    all_files.each do |file|
      save_page file
    end

    save_cache
  end

  ##
  # Writes the cache file for this store

  def save_cache
    clean_cache_collection @cache[:ancestors]
    clean_cache_collection @cache[:attributes]
    clean_cache_collection @cache[:class_methods]
    clean_cache_collection @cache[:instance_methods]

    @cache[:modules].uniq!
    @cache[:modules].sort!

    @cache[:pages].uniq!
    @cache[:pages].sort!

    @cache[:encoding] = @encoding # this gets set twice due to assert_cache

    @cache[:c_class_variables].merge!           @c_class_variables
    @cache[:c_singleton_class_variables].merge! @c_singleton_class_variables

    return if @dry_run

    File.open cache_path, 'wb' do |io|
      Marshal.dump @cache, io
    end
  end

  ##
  # Writes the ri data for +klass+ (or module)

  def save_class klass
    full_name = klass.full_name

    FileUtils.mkdir_p class_path(full_name) unless @dry_run

    @cache[:modules] << full_name

    path = class_file full_name

    begin
      disk_klass = load_class full_name

      klass = disk_klass.merge klass
    rescue MissingFileError
    end

    # BasicObject has no ancestors
    ancestors = klass.direct_ancestors.compact.map do |ancestor|
      # HACK for classes we don't know about (class X < RuntimeError)
      String === ancestor ? ancestor : ancestor.full_name
    end

    @cache[:ancestors][full_name] ||= []
    @cache[:ancestors][full_name].concat ancestors

    attribute_definitions = klass.attributes.map do |attribute|
      "#{attribute.definition} #{attribute.name}"
    end

    unless attribute_definitions.empty? then
      @cache[:attributes][full_name] ||= []
      @cache[:attributes][full_name].concat attribute_definitions
    end

    to_delete = []

    unless klass.method_list.empty? then
      @cache[:class_methods][full_name]    ||= []
      @cache[:instance_methods][full_name] ||= []

      class_methods, instance_methods =
        klass.method_list.partition { |meth| meth.singleton }

      class_methods    = class_methods.   map { |method| method.name }
      instance_methods = instance_methods.map { |method| method.name }
      attribute_names  = klass.attributes.map { |attr|   attr.name }

      old = @cache[:class_methods][full_name] - class_methods
      to_delete.concat old.map { |method|
        method_file full_name, "#{full_name}::#{method}"
      }

      old = @cache[:instance_methods][full_name] -
        instance_methods - attribute_names
      to_delete.concat old.map { |method|
        method_file full_name, "#{full_name}##{method}"
      }

      @cache[:class_methods][full_name]    = class_methods
      @cache[:instance_methods][full_name] = instance_methods
    end

    return if @dry_run

    FileUtils.rm_f to_delete

    File.open path, 'wb' do |io|
      Marshal.dump klass, io
    end
  end

  ##
  # Writes the ri data for +method+ on +klass+

  def save_method klass, method
    full_name = klass.full_name

    FileUtils.mkdir_p class_path(full_name) unless @dry_run

    cache = if method.singleton then
              @cache[:class_methods]
            else
              @cache[:instance_methods]
            end
    cache[full_name] ||= []
    cache[full_name] << method.name

    return if @dry_run

    File.open method_file(full_name, method.full_name), 'wb' do |io|
      Marshal.dump method, io
    end
  end

  ##
  # Writes the ri data for +page+

  def save_page page
    return unless page.text?

    path = page_file page.full_name

    FileUtils.mkdir_p File.dirname(path) unless @dry_run

    cache[:pages] ||= []
    cache[:pages] << page.full_name

    return if @dry_run

    File.open path, 'wb' do |io|
      Marshal.dump page, io
    end
  end

  ##
  # Source of the contents of this store.
  #
  # For a store from a gem the source is the gem name.  For a store from the
  # home directory the source is "home".  For system ri store (the standard
  # library documentation) the source is"ruby".  For a store from the site
  # ri directory the store is "site".  For other stores the source is the
  # #path.

  def source
    case type
    when :gem    then File.basename File.expand_path '..', @path
    when :home   then 'home'
    when :site   then 'site'
    when :system then 'ruby'
    else @path
    end
  end

  ##
  # Gets the title for this RDoc store.  This is used as the title in each
  # page on the RDoc server

  def title
    @cache[:title]
  end

  ##
  # Sets the title page for this RDoc store.

  def title= title
    @cache[:title] = title
  end

  ##
  # Returns the unique classes discovered by RDoc.
  #
  # ::complete must have been called prior to using this method.

  def unique_classes
    @unique_classes
  end

  ##
  # Returns the unique classes and modules discovered by RDoc.
  # ::complete must have been called prior to using this method.

  def unique_classes_and_modules
    @unique_classes + @unique_modules
  end

  ##
  # Returns the unique modules discovered by RDoc.
  # ::complete must have been called prior to using this method.

  def unique_modules
    @unique_modules
  end

  private
  def marshal_load(file)
    File.open(file, 'rb') {|io| Marshal.load(io, MarshalFilter)}
  end

  MarshalFilter = proc do |obj|
    case obj
    when true, false, nil, Array, Class, Encoding, Hash, Integer, String, Symbol, RDoc::Text
    else
      unless obj.class.name.start_with?("RDoc::")
        raise TypeError, "not permitted class: #{obj.class.name}"
      end
    end
    obj
  end
  private_constant :MarshalFilter

end
PK}$[X�yъp�p)gems/gems/rdoc-6.4.1.1/lib/rdoc/markup.rbnu�[���# frozen_string_literal: true
##
# RDoc::Markup parses plain text documents and attempts to decompose them into
# their constituent parts.  Some of these parts are high-level: paragraphs,
# chunks of verbatim text, list entries and the like.  Other parts happen at
# the character level: a piece of bold text, a word in code font.  This markup
# is similar in spirit to that used on WikiWiki webs, where folks create web
# pages using a simple set of formatting rules.
#
# RDoc::Markup and other markup formats do no output formatting, this is
# handled by the RDoc::Markup::Formatter subclasses.
#
# = Supported Formats
#
# Besides the RDoc::Markup format, the following formats are built in to RDoc:
#
# markdown::
#   The markdown format as described by
#   http://daringfireball.net/projects/markdown/.  See RDoc::Markdown for
#   details on the parser and supported extensions.
# rd::
#   The rdtool format.  See RDoc::RD for details on the parser and format.
# tomdoc::
#   The TomDoc format as described by http://tomdoc.org/.  See RDoc::TomDoc
#   for details on the parser and supported extensions.
#
# You can choose a markup format using the following methods:
#
# per project::
#   If you build your documentation with rake use RDoc::Task#markup.
#
#   If you build your documentation by hand run:
#
#      rdoc --markup your_favorite_format --write-options
#
#   and commit <tt>.rdoc_options</tt> and ship it with your packaged gem.
# per file::
#   At the top of the file use the <tt>:markup:</tt> directive to set the
#   default format for the rest of the file.
# per comment::
#   Use the <tt>:markup:</tt> directive at the top of a comment you want
#   to write in a different format.
#
# = RDoc::Markup
#
# RDoc::Markup is extensible at runtime: you can add \new markup elements to
# be recognized in the documents that RDoc::Markup parses.
#
# RDoc::Markup is intended to be the basis for a family of tools which share
# the common requirement that simple, plain-text should be rendered in a
# variety of different output formats and media.  It is envisaged that
# RDoc::Markup could be the basis for formatting RDoc style comment blocks,
# Wiki entries, and online FAQs.
#
# == Synopsis
#
# This code converts +input_string+ to HTML.  The conversion takes place in
# the +convert+ method, so you can use the same RDoc::Markup converter to
# convert multiple input strings.
#
#   require 'rdoc'
#
#   h = RDoc::Markup::ToHtml.new(RDoc::Options.new)
#
#   puts h.convert(input_string)
#
# You can extend the RDoc::Markup parser to recognize new markup
# sequences, and to add regexp handling. Here we make WikiWords significant to
# the parser, and also make the sequences {word} and \<no>text...</no> signify
# strike-through text.  We then subclass the HTML output class to deal
# with these:
#
#   require 'rdoc'
#
#   class WikiHtml < RDoc::Markup::ToHtml
#     def handle_regexp_WIKIWORD(target)
#       "<font color=red>" + target.text + "</font>"
#     end
#   end
#
#   markup = RDoc::Markup.new
#   markup.add_word_pair("{", "}", :STRIKE)
#   markup.add_html("no", :STRIKE)
#
#   markup.add_regexp_handling(/\b([A-Z][a-z]+[A-Z]\w+)/, :WIKIWORD)
#
#   wh = WikiHtml.new RDoc::Options.new, markup
#   wh.add_tag(:STRIKE, "<strike>", "</strike>")
#
#   puts "<body>#{wh.convert ARGF.read}</body>"
#
# == Encoding
#
# Where Encoding support is available, RDoc will automatically convert all
# documents to the same output encoding.  The output encoding can be set via
# RDoc::Options#encoding and defaults to Encoding.default_external.
#
# = \RDoc Markup Reference
#
# == Block Markup
#
# === Paragraphs and Verbatim
#
# The markup engine looks for a document's natural left margin.  This is
# used as the initial margin for the document.
#
# Consecutive lines starting at this margin are considered to be a
# paragraph. Empty lines separate paragraphs.
#
# Any line that starts to the right of the current margin is treated
# as verbatim text.  This is useful for code listings:
#
#   3.times { puts "Ruby" }
#
# In verbatim text, two or more blank lines are collapsed into one,
# and trailing blank lines are removed:
#
#   This is the first line
#
#
#   This is the second non-blank line,
#   after 2 blank lines in the source markup.
#
#
# There were two trailing blank lines right above this paragraph, that
# have been removed. In addition, the verbatim text has been shifted
# left, so the amount of indentation of verbatim text is unimportant.
#
# For HTML output RDoc makes a small effort to determine if a verbatim section
# contains Ruby source code.  If so, the verbatim block will be marked up as
# HTML.  Triggers include "def", "class", "module", "require", the "hash
# rocket"# (=>) or a block call with a parameter.
#
# === Headers
#
# A line starting with an equal sign (=) is treated as a
# heading.  Level one headings have one equals sign, level two headings
# have two, and so on until level six, which is the maximum
# (seven hyphens or more result in a level six heading).
#
# For example, the above header was obtained with:
#
#   === Headers
#
# In HTML output headers have an id matching their name.  The above example's
# HTML is:
#
#   <h3 id="label-Headers">Headers</h3>
#
# If a heading is inside a method body the id will be prefixed with the
# method's id.  If the above header where in the documentation for a method
# such as:
#
#   ##
#   # This method does fun things
#   #
#   # = Example
#   #
#   #   Example of fun things goes here ...
#
#   def do_fun_things
#   end
#
# The header's id would be:
#
#   <h1 id="method-i-do_fun_things-label-Example">Example</h1>
#
# The label can be linked-to using <tt>SomeClass@Headers</tt>.  See
# {Links}[RDoc::Markup@Links] for further details.
#
# === Rules
#
# A line starting with three or more hyphens (at the current indent)
# generates a horizontal rule.
#
#   ---
#
# produces:
#
# ---
#
# === Simple Lists
#
# If a paragraph starts with a "*", "-", "<digit>." or "<letter>.",
# then it is taken to be the start of a list.  The margin is increased to be
# the first non-space following the list start flag.  Subsequent lines
# should be indented to this new margin until the list ends.  For example:
#
#   * this is a list with three paragraphs in
#     the first item.  This is the first paragraph.
#
#     And this is the second paragraph.
#
#     1. This is an indented, numbered list.
#     2. This is the second item in that list
#
#     This is the third conventional paragraph in the
#     first list item.
#
#   * This is the second item in the original list
#
# produces:
#
# * this is a list with three paragraphs in
#   the first item.  This is the first paragraph.
#
#   And this is the second paragraph.
#
#   1. This is an indented, numbered list.
#   2. This is the second item in that list
#
#   This is the third conventional paragraph in the
#   first list item.
#
# * This is the second item in the original list
#
# === Labeled Lists
#
# You can also construct labeled lists, sometimes called description
# or definition lists.  Do this by putting the label in square brackets
# and indenting the list body:
#
#   [cat]  a small furry mammal
#          that seems to sleep a lot
#
#   [ant]  a little insect that is known
#          to enjoy picnics
#
# produces:
#
# [cat]  a small furry mammal
#        that seems to sleep a lot
#
# [ant]  a little insect that is known
#        to enjoy picnics
#
# If you want the list bodies to line up to the left of the labels,
# use two colons:
#
#   cat::  a small furry mammal
#          that seems to sleep a lot
#
#   ant::  a little insect that is known
#          to enjoy picnics
#
# produces:
#
# cat::  a small furry mammal
#        that seems to sleep a lot
#
# ant::  a little insect that is known
#        to enjoy picnics
#
# Notice that blank lines right after the label are ignored in labeled lists:
#
#   [one]
#
#       definition 1
#
#   [two]
#
#       definition 2
#
# produces the same output as
#
#   [one]  definition 1
#   [two]  definition 2
#
#
# === Lists and Verbatim
#
# If you want to introduce a verbatim section right after a list, it has to be
# less indented than the list item bodies, but more indented than the list
# label, letter, digit or bullet. For instance:
#
#   *   point 1
#
#   *   point 2, first paragraph
#
#       point 2, second paragraph
#         verbatim text inside point 2
#       point 2, third paragraph
#     verbatim text outside of the list (the list is therefore closed)
#   regular paragraph after the list
#
# produces:
#
# *   point 1
#
# *   point 2, first paragraph
#
#     point 2, second paragraph
#       verbatim text inside point 2
#     point 2, third paragraph
#   verbatim text outside of the list (the list is therefore closed)
# regular paragraph after the list
#
# == Text Markup
#
# === Bold, Italic, Typewriter Text
#
# You can use markup within text (except verbatim) to change the
# appearance of parts of that text.  Out of the box, RDoc::Markup
# supports word-based and general markup.
#
# Word-based markup uses flag characters around individual words:
#
# <tt>\*_word_\*</tt>::  displays _word_ in a *bold* font
# <tt>\__word_\_</tt>::  displays _word_ in an _emphasized_ font
# <tt>\+_word_\+</tt>::  displays _word_ in a +code+ font
#
# General markup affects text between a start delimiter and an end
# delimiter.  Not surprisingly, these delimiters look like HTML markup.
#
# <tt>\<b>_text_</b></tt>::    displays _text_ in a *bold* font
# <tt>\<em>_text_</em></tt>::  displays _text_ in an _emphasized_ font
#                              (alternate tag: <tt>\<i></tt>)
# <tt>\<tt>_text_\</tt></tt>:: displays _text_ in a +code+ font
#                              (alternate tag: <tt>\<code></tt>)
#
# Unlike conventional Wiki markup, general markup can cross line
# boundaries.  You can turn off the interpretation of markup by
# preceding the first character with a backslash (see <i>Escaping
# Text Markup</i>, below).
#
# === Links
#
# Links to starting with +http:+, +https:+, +mailto:+, +ftp:+ or +www.+
# are recognized.  An HTTP url that references an external image is converted
# into an inline image element.
#
# Classes and methods will be automatically linked to their definition.  For
# example, <tt>RDoc::Markup</tt> will link to this documentation.  By default
# methods will only be automatically linked if they contain an <tt>_</tt> (all
# methods can be automatically linked through the <tt>--hyperlink-all</tt>
# command line option).
#
# Single-word methods can be linked by using the <tt>#</tt> character for
# instance methods or <tt>::</tt> for class methods.  For example,
# <tt>#convert</tt> links to #convert.  A class or method may be combined like
# <tt>RDoc::Markup#convert</tt>.
#
# A heading inside the documentation can be linked by following the class
# or method by an <tt>@</tt> then the heading name.
# <tt>RDoc::Markup@Links</tt> will link to this section like this:
# RDoc::Markup@Links.  Spaces in headings with multiple words must be escaped
# with <tt>+</tt> like <tt>RDoc::Markup@Escaping+Text+Markup</tt>.
# Punctuation and other special characters must be escaped like CGI.escape.
#
# The <tt>@</tt> can also be used to link to sections.  If a section and a
# heading share the same name the section is preferred for the link.
#
# Links can also be of the form <tt>label[url]</tt>, in which case +label+ is
# used in the displayed text, and +url+ is used as the target.  If +label+
# contains multiple words, put it in braces: <tt>{multi word label}[url]</tt>.
# The +url+ may be an +http:+-type link or a cross-reference to a class,
# module or method with a label.
#
# Links with the <code>rdoc-image:</code> scheme will create an image tag for
# HTML output.  Only fully-qualified URLs are supported.
#
# Links with the <tt>rdoc-ref:</tt> scheme will link to the referenced class,
# module, method, file, etc.  If the referenced item is does not exist
# no link will be generated and <tt>rdoc-ref:</tt> will be removed from the
# resulting text.
#
# Links starting with <tt>rdoc-label:label_name</tt> will link to the
# +label_name+.  You can create a label for the current link (for
# bidirectional links) by supplying a name for the current link like
# <tt>rdoc-label:label-other:label-mine</tt>.
#
# Links starting with +link:+ refer to local files whose path is relative to
# the <tt>--op</tt> directory.  Use <tt>rdoc-ref:</tt> instead of
# <tt>link:</tt> to link to files generated by RDoc as the link target may
# be different across RDoc generators.
#
# Example links:
#
#   https://github.com/ruby/rdoc
#   mailto:user@example.com
#   {RDoc Documentation}[http://rdoc.rubyforge.org]
#   {RDoc Markup}[rdoc-ref:RDoc::Markup]
#
# === Escaping Text Markup
#
# Text markup can be escaped with a backslash, as in \<tt>, which was obtained
# with <tt>\\<tt></tt>.  Except in verbatim sections and between \<tt> tags,
# to produce a backslash you have to double it unless it is followed by a
# space, tab or newline. Otherwise, the HTML formatter will discard it, as it
# is used to escape potential links:
#
#   * The \ must be doubled if not followed by white space: \\.
#   * But not in \<tt> tags: in a Regexp, <tt>\S</tt> matches non-space.
#   * This is a link to {ruby-lang}[www.ruby-lang.org].
#   * This is not a link, however: \{ruby-lang.org}[www.ruby-lang.org].
#   * This will not be linked to \RDoc::RDoc#document
#
# generates:
#
# * The \ must be doubled if not followed by white space: \\.
# * But not in \<tt> tags: in a Regexp, <tt>\S</tt> matches non-space.
# * This is a link to {ruby-lang}[www.ruby-lang.org]
# * This is not a link, however: \{ruby-lang.org}[www.ruby-lang.org]
# * This will not be linked to \RDoc::RDoc#document
#
# Inside \<tt> tags, more precisely, leading backslashes are removed only if
# followed by a markup character (<tt><*_+</tt>), a backslash, or a known link
# reference (a known class or method). So in the example above, the backslash
# of <tt>\S</tt> would be removed if there was a class or module named +S+ in
# the current context.
#
# This behavior is inherited from RDoc version 1, and has been kept for
# compatibility with existing RDoc documentation.
#
# === Conversion of characters
#
# HTML will convert two/three dashes to an em-dash. Other common characters are
# converted as well:
#
#   em-dash::  -- or ---
#   ellipsis:: ...
#
#   single quotes:: 'text' or `text'
#   double quotes:: "text" or ``text''
#
#   copyright:: (c)
#   registered trademark:: (r)
#
# produces:
#
# em-dash::  -- or ---
# ellipsis:: ...
#
# single quotes:: 'text' or `text'
# double quotes:: "text" or ``text''
#
# copyright:: (c)
# registered trademark:: (r)
#
#
# == Documenting Source Code
#
# Comment blocks can be written fairly naturally, either using <tt>#</tt> on
# successive lines of the comment, or by including the comment in
# a <tt>=begin</tt>/<tt>=end</tt> block.  If you use the latter form,
# the <tt>=begin</tt> line _must_ be flagged with an +rdoc+ tag:
#
#   =begin rdoc
#   Documentation to be processed by RDoc.
#
#   ...
#   =end
#
# RDoc stops processing comments if it finds a comment line starting
# with <tt>--</tt> right after the <tt>#</tt> character (otherwise,
# it will be treated as a rule if it has three dashes or more).
# This can be used to separate external from internal comments,
# or to stop a comment being associated with a method, class, or module.
# Commenting can be turned back on with a line that starts with <tt>++</tt>.
#
#   ##
#   # Extract the age and calculate the date-of-birth.
#   #--
#   # FIXME: fails if the birthday falls on February 29th
#   #++
#   # The DOB is returned as a Time object.
#
#   def get_dob(person)
#     # ...
#   end
#
# Names of classes, files, and any method names containing an underscore or
# preceded by a hash character are automatically linked from comment text to
# their description. This linking works inside the current class or module,
# and with ancestor methods (in included modules or in the superclass).
#
# Method parameter lists are extracted and displayed with the method
# description.  If a method calls +yield+, then the parameters passed to yield
# will also be displayed:
#
#   def fred
#     ...
#     yield line, address
#
# This will get documented as:
#
#   fred() { |line, address| ... }
#
# You can override this using a comment containing ':yields: ...' immediately
# after the method definition
#
#   def fred # :yields: index, position
#     # ...
#
#     yield line, address
#
# which will get documented as
#
#    fred() { |index, position| ... }
#
# +:yields:+ is an example of a documentation directive.  These appear
# immediately after the start of the document element they are modifying.
#
# RDoc automatically cross-references words with underscores or camel-case.
# To suppress cross-references, prefix the word with a \ character.  To
# include special characters like "<tt>\n</tt>", you'll need to use
# two \ characters in normal text, but only one in \<tt> text:
#
#   "\\n" or "<tt>\n</tt>"
#
# produces:
#
# "\\n" or "<tt>\n</tt>"
#
# == Directives
#
# Directives are keywords surrounded by ":" characters.
#
# === Controlling what is documented
#
# [+:nodoc:+ / <tt>:nodoc: all</tt>]
#   This directive prevents documentation for the element from
#   being generated.  For classes and modules, methods, aliases,
#   constants, and attributes directly within the affected class or
#   module also will be omitted.  By default, though, modules and
#   classes within that class or module _will_ be documented.  This is
#   turned off by adding the +all+ modifier.
#
#     module MyModule # :nodoc:
#       class Input
#       end
#     end
#
#     module OtherModule # :nodoc: all
#       class Output
#       end
#     end
#
#   In the above code, only class <tt>MyModule::Input</tt> will be documented.
#
#   The +:nodoc:+ directive, like +:enddoc:+, +:stopdoc:+ and +:startdoc:+
#   presented below, is local to the current file: if you do not want to
#   document a module that appears in several files, specify +:nodoc:+ on each
#   appearance, at least once per file.
#
# [+:stopdoc:+ / +:startdoc:+]
#   Stop and start adding new documentation elements to the current container.
#   For example, if a class has a number of constants that you don't want to
#   document, put a +:stopdoc:+ before the first, and a +:startdoc:+ after the
#   last.  If you don't specify a +:startdoc:+ by the end of the container,
#   disables documentation for the rest of the current file.
#
# [+:doc:+]
#   Forces a method or attribute to be documented even if it wouldn't be
#   otherwise.  Useful if, for example, you want to include documentation of a
#   particular private method.
#
# [+:enddoc:+]
#   Document nothing further at the current level: directives +:startdoc:+ and
#   +:doc:+ that appear after this will not be honored for the current container
#   (file, class or module), in the current file.
#
# [+:notnew:+ / +:not_new:+ / +:not-new:+ ]
#   Only applicable to the +initialize+ instance method.  Normally RDoc
#   assumes that the documentation and parameters for +initialize+ are
#   actually for the +new+ method, and so fakes out a +new+ for the class.
#   The +:notnew:+ directive stops this.  Remember that +initialize+ is private,
#   so you won't see the documentation unless you use the +-a+ command line
#   option.
#
# === Method arguments
#
# [+:arg:+ or +:args:+ _parameters_]
#   Overrides the default argument handling with exactly these parameters.
#
#     ##
#     #  :args: a, b
#
#     def some_method(*a)
#     end
#
# [+:yield:+ or +:yields:+ _parameters_]
#   Overrides the default yield discovery with these parameters.
#
#     ##
#     # :yields: key, value
#
#     def each_thing &block
#       @things.each(&block)
#     end
#
# [+:call-seq:+]
#   Lines up to the next blank line or lines with a common prefix in the
#   comment are treated as the method's calling sequence, overriding the
#   default parsing of method parameters and yield arguments.
#
#   Multiple lines may be used.
#
#     # :call-seq:
#     #   ARGF.readlines(sep=$/)     -> array
#     #   ARGF.readlines(limit)      -> array
#     #   ARGF.readlines(sep, limit) -> array
#     #
#     #   ARGF.to_a(sep=$/)     -> array
#     #   ARGF.to_a(limit)      -> array
#     #   ARGF.to_a(sep, limit) -> array
#     #
#     # The remaining lines are documentation ...
#
# === Sections
#
# Sections allow you to group methods in a class into sensible containers.  If
# you use the sections 'Public', 'Internal' and 'Deprecated' (the three
# allowed method statuses from TomDoc) the sections will be displayed in that
# order placing the most useful methods at the top.  Otherwise, sections will
# be displayed in alphabetical order.
#
# [+:category:+ _section_]
#   Adds this item to the named +section+ overriding the current section.  Use
#   this to group methods by section in RDoc output while maintaining a
#   sensible ordering (like alphabetical).
#
#     # :category: Utility Methods
#     #
#     # CGI escapes +text+
#
#     def convert_string text
#       CGI.escapeHTML text
#     end
#
#   An empty category will place the item in the default category:
#
#     # :category:
#     #
#     # This method is in the default category
#
#     def some_method
#       # ...
#     end
#
#   Unlike the :section: directive, :category: is not sticky.  The category
#   only applies to the item immediately following the comment.
#
#   Use the :section: directive to provide introductory text for a section of
#   documentation.
#
# [+:section:+ _title_]
#   Provides section introductory text in RDoc output.  The title following
#   +:section:+ is used as the section name and the remainder of the comment
#   containing the section is used as introductory text.  A section's comment
#   block must be separated from following comment blocks.  Use an empty title
#   to switch to the default section.
#
#   The :section: directive is sticky, so subsequent methods, aliases,
#   attributes, and classes will be contained in this section until the
#   section is changed.  The :category: directive will override the :section:
#   directive.
#
#   A :section: comment block may have one or more lines before the :section:
#   directive.  These will be removed, and any identical lines at the end of
#   the block are also removed.  This allows you to add visual cues to the
#   section.
#
#   Example:
#
#     # ----------------------------------------
#     # :section: My Section
#     # This is the section that I wrote.
#     # See it glisten in the noon-day sun.
#     # ----------------------------------------
#
#     ##
#     # Comment for some_method
#
#     def some_method
#       # ...
#     end
#
# === Other directives
#
# [+:markup:+ _type_]
#   Overrides the default markup type for this comment with the specified
#   markup type.  For Ruby files, if the first comment contains this directive
#   it is applied automatically to all comments in the file.
#
#   Unless you are converting between markup formats you should use a
#   <code>.rdoc_options</code> file to specify the default documentation
#   format for your entire project.  See RDoc::Options@Saved+Options for
#   instructions.
#
#   At the top of a file the +:markup:+ directive applies to the entire file:
#
#     # coding: UTF-8
#     # :markup: TomDoc
#
#     # TomDoc comment here ...
#
#     class MyClass
#       # ...
#
#   For just one comment:
#
#       # ...
#     end
#
#     # :markup: RDoc
#     #
#     # This is a comment in RDoc markup format ...
#
#     def some_method
#       # ...
#
#   See Markup@CONTRIBUTING for instructions on adding a new markup format.
#
# [+:include:+ _filename_]
#   Include the contents of the named file at this point. This directive
#   must appear alone on one line, possibly preceded by spaces. In this
#   position, it can be escaped with a \ in front of the first colon.
#
#   The file will be searched for in the directories listed by the +--include+
#   option, or in the current directory by default.  The contents of the file
#   will be shifted to have the same indentation as the ':' at the start of
#   the +:include:+ directive.
#
# [+:title:+ _text_]
#   Sets the title for the document.  Equivalent to the <tt>--title</tt>
#   command line parameter.  (The command line parameter overrides any :title:
#   directive in the source).
#
# [+:main:+ _name_]
#   Equivalent to the <tt>--main</tt> command line parameter.
#
#--
# Original Author:: Dave Thomas,  dave@pragmaticprogrammer.com
# License:: Ruby license

class RDoc::Markup

  ##
  # An AttributeManager which handles inline markup.

  attr_reader :attribute_manager

  ##
  # Parses +str+ into an RDoc::Markup::Document.

  def self.parse str
    RDoc::Markup::Parser.parse str
  rescue RDoc::Markup::Parser::Error => e
    $stderr.puts <<-EOF
While parsing markup, RDoc encountered a #{e.class}:

#{e}
\tfrom #{e.backtrace.join "\n\tfrom "}

---8<---
#{text}
---8<---

RDoc #{RDoc::VERSION}

Ruby #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} #{RUBY_RELEASE_DATE}

Please file a bug report with the above information at:

https://github.com/ruby/rdoc/issues

    EOF
    raise
  end

  ##
  # Take a block of text and use various heuristics to determine its
  # structure (paragraphs, lists, and so on).  Invoke an event handler as we
  # identify significant chunks.

  def initialize attribute_manager = nil
    @attribute_manager = attribute_manager || RDoc::Markup::AttributeManager.new
    @output = nil
  end

  ##
  # Add to the sequences used to add formatting to an individual word (such
  # as *bold*).  Matching entries will generate attributes that the output
  # formatters can recognize by their +name+.

  def add_word_pair(start, stop, name)
    @attribute_manager.add_word_pair(start, stop, name)
  end

  ##
  # Add to the sequences recognized as general markup.

  def add_html(tag, name)
    @attribute_manager.add_html(tag, name)
  end

  ##
  # Add to other inline sequences.  For example, we could add WikiWords using
  # something like:
  #
  #    parser.add_regexp_handling(/\b([A-Z][a-z]+[A-Z]\w+)/, :WIKIWORD)
  #
  # Each wiki word will be presented to the output formatter.

  def add_regexp_handling(pattern, name)
    @attribute_manager.add_regexp_handling(pattern, name)
  end

  ##
  # We take +input+, parse it if necessary, then invoke the output +formatter+
  # using a Visitor to render the result.

  def convert input, formatter
    document = case input
               when RDoc::Markup::Document then
                 input
               else
                 RDoc::Markup::Parser.parse input
               end

    document.accept formatter
  end

  autoload :Parser,                'rdoc/markup/parser'
  autoload :PreProcess,            'rdoc/markup/pre_process'

  # Inline markup classes
  autoload :AttrChanger,           'rdoc/markup/attr_changer'
  autoload :AttrSpan,              'rdoc/markup/attr_span'
  autoload :Attributes,            'rdoc/markup/attributes'
  autoload :AttributeManager,      'rdoc/markup/attribute_manager'
  autoload :RegexpHandling,        'rdoc/markup/regexp_handling'

  # RDoc::Markup AST
  autoload :BlankLine,             'rdoc/markup/blank_line'
  autoload :BlockQuote,            'rdoc/markup/block_quote'
  autoload :Document,              'rdoc/markup/document'
  autoload :HardBreak,             'rdoc/markup/hard_break'
  autoload :Heading,               'rdoc/markup/heading'
  autoload :Include,               'rdoc/markup/include'
  autoload :IndentedParagraph,     'rdoc/markup/indented_paragraph'
  autoload :List,                  'rdoc/markup/list'
  autoload :ListItem,              'rdoc/markup/list_item'
  autoload :Paragraph,             'rdoc/markup/paragraph'
  autoload :Table,                 'rdoc/markup/table'
  autoload :Raw,                   'rdoc/markup/raw'
  autoload :Rule,                  'rdoc/markup/rule'
  autoload :Verbatim,              'rdoc/markup/verbatim'

  # Formatters
  autoload :Formatter,             'rdoc/markup/formatter'

  autoload :ToAnsi,                'rdoc/markup/to_ansi'
  autoload :ToBs,                  'rdoc/markup/to_bs'
  autoload :ToHtml,                'rdoc/markup/to_html'
  autoload :ToHtmlCrossref,        'rdoc/markup/to_html_crossref'
  autoload :ToHtmlSnippet,         'rdoc/markup/to_html_snippet'
  autoload :ToLabel,               'rdoc/markup/to_label'
  autoload :ToMarkdown,            'rdoc/markup/to_markdown'
  autoload :ToRdoc,                'rdoc/markup/to_rdoc'
  autoload :ToTableOfContents,     'rdoc/markup/to_table_of_contents'
  autoload :ToTest,                'rdoc/markup/to_test'
  autoload :ToTtOnly,              'rdoc/markup/to_tt_only'

end

PK}$[v�T�DODO/gems/gems/rdoc-6.4.1.1/lib/rdoc/class_module.rbnu�[���# frozen_string_literal: true
##
# ClassModule is the base class for objects representing either a class or a
# module.

class RDoc::ClassModule < RDoc::Context

  ##
  # 1::
  #   RDoc 3.7
  #   * Added visibility, singleton and file to attributes
  #   * Added file to constants
  #   * Added file to includes
  #   * Added file to methods
  # 2::
  #   RDoc 3.13
  #   * Added extends
  # 3::
  #   RDoc 4.0
  #   * Added sections
  #   * Added in_files
  #   * Added parent name
  #   * Complete Constant dump

  MARSHAL_VERSION = 3 # :nodoc:

  ##
  # Constants that are aliases for this class or module

  attr_accessor :constant_aliases

  ##
  # Comment and the location it came from.  Use #add_comment to add comments

  attr_accessor :comment_location

  attr_accessor :diagram # :nodoc:

  ##
  # Class or module this constant is an alias for

  attr_accessor :is_alias_for

  ##
  # Return a RDoc::ClassModule of class +class_type+ that is a copy
  # of module +module+. Used to promote modules to classes.
  #--
  # TODO move to RDoc::NormalClass (I think)

  def self.from_module class_type, mod
    klass = class_type.new mod.name

    mod.comment_location.each do |comment, location|
      klass.add_comment comment, location
    end

    klass.parent = mod.parent
    klass.section = mod.section
    klass.viewer = mod.viewer

    klass.attributes.concat mod.attributes
    klass.method_list.concat mod.method_list
    klass.aliases.concat mod.aliases
    klass.external_aliases.concat mod.external_aliases
    klass.constants.concat mod.constants
    klass.includes.concat mod.includes
    klass.extends.concat mod.extends

    klass.methods_hash.update mod.methods_hash
    klass.constants_hash.update mod.constants_hash

    klass.current_section = mod.current_section
    klass.in_files.concat mod.in_files
    klass.sections.concat mod.sections
    klass.unmatched_alias_lists = mod.unmatched_alias_lists
    klass.current_section = mod.current_section
    klass.visibility = mod.visibility

    klass.classes_hash.update mod.classes_hash
    klass.modules_hash.update mod.modules_hash
    klass.metadata.update mod.metadata

    klass.document_self = mod.received_nodoc ? nil : mod.document_self
    klass.document_children = mod.document_children
    klass.force_documentation = mod.force_documentation
    klass.done_documenting = mod.done_documenting

    # update the parent of all children

    (klass.attributes +
     klass.method_list +
     klass.aliases +
     klass.external_aliases +
     klass.constants +
     klass.includes +
     klass.extends +
     klass.classes +
     klass.modules).each do |obj|
      obj.parent = klass
      obj.full_name = nil
    end

    klass
  end

  ##
  # Creates a new ClassModule with +name+ with optional +superclass+
  #
  # This is a constructor for subclasses, and must never be called directly.

  def initialize(name, superclass = nil)
    @constant_aliases = []
    @diagram          = nil
    @is_alias_for     = nil
    @name             = name
    @superclass       = superclass
    @comment_location = [] # [[comment, location]]

    super()
  end

  ##
  # Adds +comment+ to this ClassModule's list of comments at +location+.  This
  # method is preferred over #comment= since it allows ri data to be updated
  # across multiple runs.

  def add_comment comment, location
    return unless document_self

    original = comment

    comment = case comment
              when RDoc::Comment then
                comment.normalize
              else
                normalize_comment comment
              end

    if location.parser == RDoc::Parser::C
      @comment_location.delete_if { |(_, l)| l == location }
    end

    @comment_location << [comment, location]

    self.comment = original
  end

  def add_things my_things, other_things # :nodoc:
    other_things.each do |group, things|
      my_things[group].each { |thing| yield false, thing } if
        my_things.include? group

      things.each do |thing|
        yield true, thing
      end
    end
  end

  ##
  # Ancestors list for this ClassModule: the list of included modules
  # (classes will add their superclass if any).
  #
  # Returns the included classes or modules, not the includes
  # themselves. The returned values are either String or
  # RDoc::NormalModule instances (see RDoc::Include#module).
  #
  # The values are returned in reverse order of their inclusion,
  # which is the order suitable for searching methods/attributes
  # in the ancestors. The superclass, if any, comes last.

  def ancestors
    includes.map { |i| i.module }.reverse
  end

  def aref_prefix # :nodoc:
    raise NotImplementedError, "missing aref_prefix for #{self.class}"
  end

  ##
  # HTML fragment reference for this module or class.  See
  # RDoc::NormalClass#aref and RDoc::NormalModule#aref

  def aref
    "#{aref_prefix}-#{full_name}"
  end

  ##
  # Ancestors of this class or module only

  alias direct_ancestors ancestors

  ##
  # Clears the comment. Used by the Ruby parser.

  def clear_comment
    @comment = ''
  end

  ##
  # This method is deprecated, use #add_comment instead.
  #
  # Appends +comment+ to the current comment, but separated by a rule.  Works
  # more like <tt>+=</tt>.

  def comment= comment # :nodoc:
    comment = case comment
              when RDoc::Comment then
                comment.normalize
              else
                normalize_comment comment
              end

    comment = "#{@comment.to_s}\n---\n#{comment.to_s}" unless @comment.empty?

    super comment
  end

  ##
  # Prepares this ClassModule for use by a generator.
  #
  # See RDoc::Store#complete

  def complete min_visibility
    update_aliases
    remove_nodoc_children
    update_includes
    remove_invisible min_visibility
  end

  ##
  # Does this ClassModule or any of its methods have document_self set?

  def document_self_or_methods
    document_self || method_list.any?{ |m| m.document_self }
  end

  ##
  # Does this class or module have a comment with content or is
  # #received_nodoc true?

  def documented?
    return true if @received_nodoc
    return false if @comment_location.empty?
    @comment_location.any? { |comment, _| not comment.empty? }
  end

  ##
  # Iterates the ancestors of this class or module for which an
  # RDoc::ClassModule exists.

  def each_ancestor # :yields: module
    return enum_for __method__ unless block_given?

    ancestors.each do |mod|
      next if String === mod
      next if self == mod
      yield mod
    end
  end

  ##
  # Looks for a symbol in the #ancestors. See Context#find_local_symbol.

  def find_ancestor_local_symbol symbol
    each_ancestor do |m|
      res = m.find_local_symbol(symbol)
      return res if res
    end

    nil
  end

  ##
  # Finds a class or module with +name+ in this namespace or its descendants

  def find_class_named name
    return self if full_name == name
    return self if @name == name

    @classes.values.find do |klass|
      next if klass == self
      klass.find_class_named name
    end
  end

  ##
  # Return the fully qualified name of this class or module

  def full_name
    @full_name ||= if RDoc::ClassModule === parent then
                     "#{parent.full_name}::#{@name}"
                   else
                     @name
                   end
  end

  ##
  # TODO: filter included items by #display?

  def marshal_dump # :nodoc:
    attrs = attributes.sort.map do |attr|
      next unless attr.display?
      [ attr.name, attr.rw,
        attr.visibility, attr.singleton, attr.file_name,
      ]
    end.compact

    method_types = methods_by_type.map do |type, visibilities|
      visibilities = visibilities.map do |visibility, methods|
        method_names = methods.map do |method|
          next unless method.display?
          [method.name, method.file_name]
        end.compact

        [visibility, method_names.uniq]
      end

      [type, visibilities]
    end

    [ MARSHAL_VERSION,
      @name,
      full_name,
      @superclass,
      parse(@comment_location),
      attrs,
      constants.select { |constant| constant.display? },
      includes.map do |incl|
        next unless incl.display?
        [incl.name, parse(incl.comment), incl.file_name]
      end.compact,
      method_types,
      extends.map do |ext|
        next unless ext.display?
        [ext.name, parse(ext.comment), ext.file_name]
      end.compact,
      @sections.values,
      @in_files.map do |tl|
        tl.relative_name
      end,
      parent.full_name,
      parent.class,
    ]
  end

  def marshal_load array # :nodoc:
    initialize_visibility
    initialize_methods_etc
    @current_section   = nil
    @document_self     = true
    @done_documenting  = false
    @parent            = nil
    @temporary_section = nil
    @visibility        = nil
    @classes           = {}
    @modules           = {}

    @name       = array[1]
    @full_name  = array[2]
    @superclass = array[3]
    @comment    = array[4]

    @comment_location = if RDoc::Markup::Document === @comment.parts.first then
                          @comment
                        else
                          RDoc::Markup::Document.new @comment
                        end

    array[5].each do |name, rw, visibility, singleton, file|
      singleton  ||= false
      visibility ||= :public

      attr = RDoc::Attr.new nil, name, rw, nil, singleton

      add_attribute attr
      attr.visibility = visibility
      attr.record_location RDoc::TopLevel.new file
    end

    array[6].each do |constant, comment, file|
      case constant
      when RDoc::Constant then
        add_constant constant
      else
        constant = add_constant RDoc::Constant.new(constant, nil, comment)
        constant.record_location RDoc::TopLevel.new file
      end
    end

    array[7].each do |name, comment, file|
      incl = add_include RDoc::Include.new(name, comment)
      incl.record_location RDoc::TopLevel.new file
    end

    array[8].each do |type, visibilities|
      visibilities.each do |visibility, methods|
        @visibility = visibility

        methods.each do |name, file|
          method = RDoc::AnyMethod.new nil, name
          method.singleton = true if type == 'class'
          method.record_location RDoc::TopLevel.new file
          add_method method
        end
      end
    end

    array[9].each do |name, comment, file|
      ext = add_extend RDoc::Extend.new(name, comment)
      ext.record_location RDoc::TopLevel.new file
    end if array[9] # Support Marshal version 1

    sections = (array[10] || []).map do |section|
      [section.title, section]
    end

    @sections = Hash[*sections.flatten]
    @current_section = add_section nil

    @in_files = []

    (array[11] || []).each do |filename|
      record_location RDoc::TopLevel.new filename
    end

    @parent_name  = array[12]
    @parent_class = array[13]
  end

  ##
  # Merges +class_module+ into this ClassModule.
  #
  # The data in +class_module+ is preferred over the receiver.

  def merge class_module
    @parent      = class_module.parent
    @parent_name = class_module.parent_name

    other_document = parse class_module.comment_location

    if other_document then
      document = parse @comment_location

      document = document.merge other_document

      @comment = @comment_location = document
    end

    cm = class_module
    other_files = cm.in_files

    merge_collections attributes, cm.attributes, other_files do |add, attr|
      if add then
        add_attribute attr
      else
        @attributes.delete attr
        @methods_hash.delete attr.pretty_name
      end
    end

    merge_collections constants, cm.constants, other_files do |add, const|
      if add then
        add_constant const
      else
        @constants.delete const
        @constants_hash.delete const.name
      end
    end

    merge_collections includes, cm.includes, other_files do |add, incl|
      if add then
        add_include incl
      else
        @includes.delete incl
      end
    end

    @includes.uniq! # clean up

    merge_collections extends, cm.extends, other_files do |add, ext|
      if add then
        add_extend ext
      else
        @extends.delete ext
      end
    end

    @extends.uniq! # clean up

    merge_collections method_list, cm.method_list, other_files do |add, meth|
      if add then
        add_method meth
      else
        @method_list.delete meth
        @methods_hash.delete meth.pretty_name
      end
    end

    merge_sections cm

    self
  end

  ##
  # Merges collection +mine+ with +other+ preferring other.  +other_files+ is
  # used to help determine which items should be deleted.
  #
  # Yields whether the item should be added or removed (true or false) and the
  # item to be added or removed.
  #
  #   merge_collections things, other.things, other.in_files do |add, thing|
  #     if add then
  #       # add the thing
  #     else
  #       # remove the thing
  #     end
  #   end

  def merge_collections mine, other, other_files, &block # :nodoc:
    my_things    = mine. group_by { |thing| thing.file }
    other_things = other.group_by { |thing| thing.file }

    remove_things my_things, other_files,  &block
    add_things    my_things, other_things, &block
  end

  ##
  # Merges the comments in this ClassModule with the comments in the other
  # ClassModule +cm+.

  def merge_sections cm # :nodoc:
    my_sections    =    sections.group_by { |section| section.title }
    other_sections = cm.sections.group_by { |section| section.title }

    other_files = cm.in_files

    remove_things my_sections, other_files do |_, section|
      @sections.delete section.title
    end

    other_sections.each do |group, sections|
      if my_sections.include? group
        my_sections[group].each do |my_section|
          other_section = cm.sections_hash[group]

          my_comments    = my_section.comments
          other_comments = other_section.comments

          other_files = other_section.in_files

          merge_collections my_comments, other_comments, other_files do |add, comment|
            if add then
              my_section.add_comment comment
            else
              my_section.remove_comment comment
            end
          end
        end
      else
        sections.each do |section|
          add_section group, section.comments
        end
      end
    end
  end

  ##
  # Does this object represent a module?

  def module?
    false
  end

  ##
  # Allows overriding the initial name.
  #
  # Used for modules and classes that are constant aliases.

  def name= new_name
    @name = new_name
  end

  ##
  # Parses +comment_location+ into an RDoc::Markup::Document composed of
  # multiple RDoc::Markup::Documents with their file set.

  def parse comment_location
    case comment_location
    when String then
      super
    when Array then
      docs = comment_location.map do |comment, location|
        doc = super comment
        doc.file = location
        doc
      end

      RDoc::Markup::Document.new(*docs)
    when RDoc::Comment then
      doc = super comment_location.text, comment_location.format
      doc.file = comment_location.location
      doc
    when RDoc::Markup::Document then
      return comment_location
    else
      raise ArgumentError, "unknown comment class #{comment_location.class}"
    end
  end

  ##
  # Path to this class or module for use with HTML generator output.

  def path
    http_url @store.rdoc.generator.class_dir
  end

  ##
  # Name to use to generate the url:
  # modules and classes that are aliases for another
  # module or class return the name of the latter.

  def name_for_path
    is_alias_for ? is_alias_for.full_name : full_name
  end

  ##
  # Returns the classes and modules that are not constants
  # aliasing another class or module. For use by formatters
  # only (caches its result).

  def non_aliases
    @non_aliases ||= classes_and_modules.reject { |cm| cm.is_alias_for }
  end

  ##
  # Updates the child modules or classes of class/module +parent+ by
  # deleting the ones that have been removed from the documentation.
  #
  # +parent_hash+ is either <tt>parent.modules_hash</tt> or
  # <tt>parent.classes_hash</tt> and +all_hash+ is ::all_modules_hash or
  # ::all_classes_hash.

  def remove_nodoc_children
    prefix = self.full_name + '::'

    modules_hash.each_key do |name|
      full_name = prefix + name
      modules_hash.delete name unless @store.modules_hash[full_name]
    end

    classes_hash.each_key do |name|
      full_name = prefix + name
      classes_hash.delete name unless @store.classes_hash[full_name]
    end
  end

  def remove_things my_things, other_files # :nodoc:
    my_things.delete_if do |file, things|
      next false unless other_files.include? file

      things.each do |thing|
        yield false, thing
      end

      true
    end
  end

  ##
  # Search record used by RDoc::Generator::JsonIndex

  def search_record
    [
      name,
      full_name,
      full_name,
      '',
      path,
      '',
      snippet(@comment_location),
    ]
  end

  ##
  # Sets the store for this class or module and its contained code objects.

  def store= store
    super

    @attributes .each do |attr|  attr.store  = store end
    @constants  .each do |const| const.store = store end
    @includes   .each do |incl|  incl.store  = store end
    @extends    .each do |ext|   ext.store   = store end
    @method_list.each do |meth|  meth.store  = store end
  end

  ##
  # Get the superclass of this class.  Attempts to retrieve the superclass
  # object, returns the name if it is not known.

  def superclass
    @store.find_class_named(@superclass) || @superclass
  end

  ##
  # Set the superclass of this class to +superclass+

  def superclass=(superclass)
    raise NoMethodError, "#{full_name} is a module" if module?
    @superclass = superclass
  end

  def to_s # :nodoc:
    if is_alias_for then
      "#{self.class.name} #{self.full_name} -> #{is_alias_for}"
    else
      super
    end
  end

  ##
  # 'module' or 'class'

  def type
    module? ? 'module' : 'class'
  end

  ##
  # Updates the child modules & classes by replacing the ones that are
  # aliases through a constant.
  #
  # The aliased module/class is replaced in the children and in
  # RDoc::Store#modules_hash or RDoc::Store#classes_hash
  # by a copy that has <tt>RDoc::ClassModule#is_alias_for</tt> set to
  # the aliased module/class, and this copy is added to <tt>#aliases</tt>
  # of the aliased module/class.
  #
  # Formatters can use the #non_aliases method to retrieve children that
  # are not aliases, for instance to list the namespace content, since
  # the aliased modules are included in the constants of the class/module,
  # that are listed separately.

  def update_aliases
    constants.each do |const|
      next unless cm = const.is_alias_for
      cm_alias = cm.dup
      cm_alias.name = const.name

      # Don't move top-level aliases under Object, they look ugly there
      unless RDoc::TopLevel === cm_alias.parent then
        cm_alias.parent = self
        cm_alias.full_name = nil # force update for new parent
      end

      cm_alias.aliases.clear
      cm_alias.is_alias_for = cm

      if cm.module? then
        @store.modules_hash[cm_alias.full_name] = cm_alias
        modules_hash[const.name] = cm_alias
      else
        @store.classes_hash[cm_alias.full_name] = cm_alias
        classes_hash[const.name] = cm_alias
      end

      cm.aliases << cm_alias
    end
  end

  ##
  # Deletes from #includes those whose module has been removed from the
  # documentation.
  #--
  # FIXME: includes are not reliably removed, see _possible_bug test case

  def update_includes
    includes.reject! do |include|
      mod = include.module
      !(String === mod) && @store.modules_hash[mod.full_name].nil?
    end

    includes.uniq!
  end

  ##
  # Deletes from #extends those whose module has been removed from the
  # documentation.
  #--
  # FIXME: like update_includes, extends are not reliably removed

  def update_extends
    extends.reject! do |ext|
      mod = ext.module

      !(String === mod) && @store.modules_hash[mod.full_name].nil?
    end

    extends.uniq!
  end

end

PK}$[�刊--,gems/gems/rdoc-6.4.1.1/lib/rdoc/generator.rbnu�[���# frozen_string_literal: true
##
# RDoc uses generators to turn parsed source code in the form of an
# RDoc::CodeObject tree into some form of output.  RDoc comes with the HTML
# generator RDoc::Generator::Darkfish and an ri data generator
# RDoc::Generator::RI.
#
# == Registering a Generator
#
# Generators are registered by calling RDoc::RDoc.add_generator with the class
# of the generator:
#
#   class My::Awesome::Generator
#     RDoc::RDoc.add_generator self
#   end
#
# == Adding Options to +rdoc+
#
# Before option processing in +rdoc+, RDoc::Options will call ::setup_options
# on the generator class with an RDoc::Options instance.  The generator can
# use RDoc::Options#option_parser to add command-line options to the +rdoc+
# tool.  See RDoc::Options@Custom+Options for an example and see OptionParser
# for details on how to add options.
#
# You can extend the RDoc::Options instance with additional accessors for your
# generator.
#
# == Generator Instantiation
#
# After parsing, RDoc::RDoc will instantiate a generator by calling
# #initialize with an RDoc::Store instance and an RDoc::Options instance.
#
# The RDoc::Store instance holds documentation for parsed source code.  In
# RDoc 3 and earlier the RDoc::TopLevel class held this data.  When upgrading
# a generator from RDoc 3 and earlier you should only need to replace
# RDoc::TopLevel with the store instance.
#
# RDoc will then call #generate on the generator instance.  You can use the
# various methods on RDoc::Store and in the RDoc::CodeObject tree to create
# your desired output format.

module RDoc::Generator

  autoload :Markup,   'rdoc/generator/markup'

  autoload :Darkfish,  'rdoc/generator/darkfish'
  autoload :JsonIndex, 'rdoc/generator/json_index'
  autoload :RI,        'rdoc/generator/ri'
  autoload :POT,       'rdoc/generator/pot'

end
PK}$[�/��*gems/gems/rdoc-6.4.1.1/lib/rdoc/include.rbnu�[���# frozen_string_literal: true
##
# A Module included in a class with \#include
#
#   RDoc::Include.new 'Enumerable', 'comment ...'

class RDoc::Include < RDoc::Mixin

end

PK}$[����)gems/gems/rdoc-6.4.1.1/lib/rdoc/extend.rbnu�[���# frozen_string_literal: true
##
# A Module extension to a class with \#extend
#
#   RDoc::Extend.new 'Enumerable', 'comment ...'

class RDoc::Extend < RDoc::Mixin

end

PK}$[Wud<)	)	+gems/gems/rdoc-6.4.1.1/lib/rdoc/markdown.rbnu�[���# coding: UTF-8
# frozen_string_literal: true
# :markup: markdown

##
# RDoc::Markdown as described by the [markdown syntax][syntax].
#
# To choose Markdown as your only default format see
# RDoc::Options@Saved+Options for instructions on setting up a `.doc_options`
# file to store your project default.
#
# ## Usage
#
# Here is a brief example of using this parse to read a markdown file by hand.
#
#     data = File.read("README.md")
#     formatter = RDoc::Markup::ToHtml.new(RDoc::Options.new, nil)
#     html = RDoc::Markdown.parse(data).accept(formatter)
#
#     # do something with html
#
# ## Extensions
#
# The following markdown extensions are supported by the parser, but not all
# are used in RDoc output by default.
#
# ### RDoc
#
# The RDoc Markdown parser has the following built-in behaviors that cannot be
# disabled.
#
# Underscores embedded in words are never interpreted as emphasis.  (While the
# [markdown dingus][dingus] emphasizes in-word underscores, neither the
# Markdown syntax nor MarkdownTest mention this behavior.)
#
# For HTML output, RDoc always auto-links bare URLs.
#
# ### Break on Newline
#
# The break_on_newline extension converts all newlines into hard line breaks
# as in [Github Flavored Markdown][GFM].  This extension is disabled by
# default.
#
# ### CSS
#
# The #css extension enables CSS blocks to be included in the output, but they
# are not used for any built-in RDoc output format.  This extension is disabled
# by default.
#
# Example:
#
#     <style type="text/css">
#     h1 { font-size: 3em }
#     </style>
#
# ### Definition Lists
#
# The definition_lists extension allows definition lists using the [PHP
# Markdown Extra syntax][PHPE], but only one label and definition are supported
# at this time.  This extension is enabled by default.
#
# Example:
#
# ```
# cat
# :   A small furry mammal
# that seems to sleep a lot
#
# ant
# :   A little insect that is known
# to enjoy picnics
#
# ```
#
# Produces:
#
# cat
# :   A small furry mammal
# that seems to sleep a lot
#
# ant
# :   A little insect that is known
# to enjoy picnics
#
# ### Strike
#
# Example:
#
# ```
# This is ~~striked~~.
# ```
#
# Produces:
#
# This is ~~striked~~.
#
# ### Github
#
# The #github extension enables a partial set of [Github Flavored Markdown]
# [GFM].  This extension is enabled by default.
#
# Supported github extensions include:
#
# #### Fenced code blocks
#
# Use ` ``` ` around a block of code instead of indenting it four spaces.
#
# #### Syntax highlighting
#
# Use ` ``` ruby ` as the start of a code fence to add syntax highlighting.
# (Currently only `ruby` syntax is supported).
#
# ### HTML
#
# Enables raw HTML to be included in the output.  This extension is enabled by
# default.
#
# Example:
#
#     <table>
#     ...
#     </table>
#
# ### Notes
#
# The #notes extension enables footnote support.  This extension is enabled by
# default.
#
# Example:
#
#     Here is some text[^1] including an inline footnote ^[for short footnotes]
#
#     ...
#
#     [^1]: With the footnote text down at the bottom
#
# Produces:
#
# Here is some text[^1] including an inline footnote ^[for short footnotes]
#
# [^1]: With the footnote text down at the bottom
#
# ## Limitations
#
# * Link titles are not used
# * Footnotes are collapsed into a single paragraph
#
# ## Author
#
# This markdown parser is a port to kpeg from [peg-markdown][pegmarkdown] by
# John MacFarlane.
#
# It is used 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.
#
# The port to kpeg was performed by Eric Hodel and Evan Phoenix
#
# [dingus]: http://daringfireball.net/projects/markdown/dingus
# [GFM]: https://github.github.com/gfm/
# [pegmarkdown]: https://github.com/jgm/peg-markdown
# [PHPE]: http://michelf.com/projects/php-markdown/extra/#def-list
# [syntax]: http://daringfireball.net/projects/markdown/syntax
#--
# Last updated to jgm/peg-markdown commit 8f8fc22ef0
class RDoc::Markdown
  # :stopdoc:

    # This is distinct from setup_parser so that a standalone parser
    # can redefine #initialize and still have access to the proper
    # parser setup code.
    def initialize(str, debug=false)
      setup_parser(str, debug)
    end



    # Prepares for parsing +str+.  If you define a custom initialize you must
    # call this method before #parse
    def setup_parser(str, debug=false)
      set_string str, 0
      @memoizations = Hash.new { |h,k| h[k] = {} }
      @result = nil
      @failed_rule = nil
      @failing_rule_offset = -1

      setup_foreign_grammar
    end

    attr_reader :string
    attr_reader :failing_rule_offset
    attr_accessor :result, :pos

    def current_column(target=pos)
      if c = string.rindex("\n", target-1)
        return target - c - 1
      end

      target + 1
    end

    def current_line(target=pos)
      cur_offset = 0
      cur_line = 0

      string.each_line do |line|
        cur_line += 1
        cur_offset += line.size
        return cur_line if cur_offset >= target
      end

      -1
    end

    def lines
      lines = []
      string.each_line { |l| lines << l }
      lines
    end



    def get_text(start)
      @string[start..@pos-1]
    end

    # Sets the string and current parsing position for the parser.
    def set_string string, pos
      @string = string
      @string_size = string ? string.size : 0
      @pos = pos
    end

    def show_pos
      width = 10
      if @pos < width
        "#{@pos} (\"#{@string[0,@pos]}\" @ \"#{@string[@pos,width]}\")"
      else
        "#{@pos} (\"... #{@string[@pos - width, width]}\" @ \"#{@string[@pos,width]}\")"
      end
    end

    def failure_info
      l = current_line @failing_rule_offset
      c = current_column @failing_rule_offset

      if @failed_rule.kind_of? Symbol
        info = self.class::Rules[@failed_rule]
        "line #{l}, column #{c}: failed rule '#{info.name}' = '#{info.rendered}'"
      else
        "line #{l}, column #{c}: failed rule '#{@failed_rule}'"
      end
    end

    def failure_caret
      l = current_line @failing_rule_offset
      c = current_column @failing_rule_offset

      line = lines[l-1]
      "#{line}\n#{' ' * (c - 1)}^"
    end

    def failure_character
      l = current_line @failing_rule_offset
      c = current_column @failing_rule_offset
      lines[l-1][c-1, 1]
    end

    def failure_oneline
      l = current_line @failing_rule_offset
      c = current_column @failing_rule_offset

      char = lines[l-1][c-1, 1]

      if @failed_rule.kind_of? Symbol
        info = self.class::Rules[@failed_rule]
        "@#{l}:#{c} failed rule '#{info.name}', got '#{char}'"
      else
        "@#{l}:#{c} failed rule '#{@failed_rule}', got '#{char}'"
      end
    end

    class ParseError < RuntimeError
    end

    def raise_error
      raise ParseError, failure_oneline
    end

    def show_error(io=STDOUT)
      error_pos = @failing_rule_offset
      line_no = current_line(error_pos)
      col_no = current_column(error_pos)

      io.puts "On line #{line_no}, column #{col_no}:"

      if @failed_rule.kind_of? Symbol
        info = self.class::Rules[@failed_rule]
        io.puts "Failed to match '#{info.rendered}' (rule '#{info.name}')"
      else
        io.puts "Failed to match rule '#{@failed_rule}'"
      end

      io.puts "Got: #{string[error_pos,1].inspect}"
      line = lines[line_no-1]
      io.puts "=> #{line}"
      io.print(" " * (col_no + 3))
      io.puts "^"
    end

    def set_failed_rule(name)
      if @pos > @failing_rule_offset
        @failed_rule = name
        @failing_rule_offset = @pos
      end
    end

    attr_reader :failed_rule

    def match_string(str)
      len = str.size
      if @string[pos,len] == str
        @pos += len
        return str
      end

      return nil
    end

    def scan(reg)
      if m = reg.match(@string, @pos)
        @pos = m.end(0)
        return true
      end

      return nil
    end

    if "".respond_to? :ord
      def get_byte
        if @pos >= @string_size
          return nil
        end

        s = @string[@pos].ord
        @pos += 1
        s
      end
    else
      def get_byte
        if @pos >= @string_size
          return nil
        end

        s = @string[@pos]
        @pos += 1
        s
      end
    end

    def parse(rule=nil)
      # We invoke the rules indirectly via apply
      # instead of by just calling them as methods because
      # if the rules use left recursion, apply needs to
      # manage that.

      if !rule
        apply(:_root)
      else
        method = rule.gsub("-","_hyphen_")
        apply :"_#{method}"
      end
    end

    class MemoEntry
      def initialize(ans, pos)
        @ans = ans
        @pos = pos
        @result = nil
        @set = false
        @left_rec = false
      end

      attr_reader :ans, :pos, :result, :set
      attr_accessor :left_rec

      def move!(ans, pos, result)
        @ans = ans
        @pos = pos
        @result = result
        @set = true
        @left_rec = false
      end
    end

    def external_invoke(other, rule, *args)
      old_pos = @pos
      old_string = @string

      set_string other.string, other.pos

      begin
        if val = __send__(rule, *args)
          other.pos = @pos
          other.result = @result
        else
          other.set_failed_rule "#{self.class}##{rule}"
        end
        val
      ensure
        set_string old_string, old_pos
      end
    end

    def apply_with_args(rule, *args)
      memo_key = [rule, args]
      if m = @memoizations[memo_key][@pos]
        @pos = m.pos
        if !m.set
          m.left_rec = true
          return nil
        end

        @result = m.result

        return m.ans
      else
        m = MemoEntry.new(nil, @pos)
        @memoizations[memo_key][@pos] = m
        start_pos = @pos

        ans = __send__ rule, *args

        lr = m.left_rec

        m.move! ans, @pos, @result

        # Don't bother trying to grow the left recursion
        # if it's failing straight away (thus there is no seed)
        if ans and lr
          return grow_lr(rule, args, start_pos, m)
        else
          return ans
        end
      end
    end

    def apply(rule)
      if m = @memoizations[rule][@pos]
        @pos = m.pos
        if !m.set
          m.left_rec = true
          return nil
        end

        @result = m.result

        return m.ans
      else
        m = MemoEntry.new(nil, @pos)
        @memoizations[rule][@pos] = m
        start_pos = @pos

        ans = __send__ rule

        lr = m.left_rec

        m.move! ans, @pos, @result

        # Don't bother trying to grow the left recursion
        # if it's failing straight away (thus there is no seed)
        if ans and lr
          return grow_lr(rule, nil, start_pos, m)
        else
          return ans
        end
      end
    end

    def grow_lr(rule, args, start_pos, m)
      while true
        @pos = start_pos
        @result = m.result

        if args
          ans = __send__ rule, *args
        else
          ans = __send__ rule
        end
        return nil unless ans

        break if @pos <= m.pos

        m.move! ans, @pos, @result
      end

      @result = m.result
      @pos = m.pos
      return m.ans
    end

    class RuleInfo
      def initialize(name, rendered)
        @name = name
        @rendered = rendered
      end

      attr_reader :name, :rendered
    end

    def self.rule_info(name, rendered)
      RuleInfo.new(name, rendered)
    end


  # :startdoc:



  require 'rdoc'
  require 'rdoc/markup/to_joined_paragraph'
  require 'rdoc/markdown/entities'

  require 'rdoc/markdown/literals'

  ##
  # Supported extensions

  EXTENSIONS = []

  ##
  # Extensions enabled by default

  DEFAULT_EXTENSIONS = [
    :definition_lists,
    :github,
    :html,
    :notes,
    :strike,
  ]

  # :section: Extensions

  ##
  # Creates extension methods for the `name` extension to enable and disable
  # the extension and to query if they are active.

  def self.extension name
    EXTENSIONS << name

    define_method "#{name}?" do
      extension? name
    end

    define_method "#{name}=" do |enable|
      extension name, enable
    end
  end

  ##
  # Converts all newlines into hard breaks

  extension :break_on_newline

  ##
  # Allow style blocks

  extension :css

  ##
  # Allow PHP Markdown Extras style definition lists

  extension :definition_lists

  ##
  # Allow Github Flavored Markdown

  extension :github

  ##
  # Allow HTML

  extension :html

  ##
  # Enables the notes extension

  extension :notes

  ##
  # Enables the strike extension

  extension :strike

  # :section:

  ##
  # Parses the `markdown` document into an RDoc::Document using the default
  # extensions.

  def self.parse markdown
    parser = new

    parser.parse markdown
  end

  # TODO remove when kpeg 0.10 is released
  alias orig_initialize initialize # :nodoc:

  ##
  # Creates a new markdown parser that enables the given +extensions+.

  def initialize extensions = DEFAULT_EXTENSIONS, debug = false
    @debug      = debug
    @formatter  = RDoc::Markup::ToJoinedParagraph.new
    @extensions = extensions

    @references          = nil
    @unlinked_references = nil

    @footnotes       = nil
    @note_order      = nil
  end

  ##
  # Wraps `text` in emphasis for rdoc inline formatting

  def emphasis text
    if text =~ /\A[a-z\d.\/]+\z/i then
      "_#{text}_"
    else
      "<em>#{text}</em>"
    end
  end

  ##
  # :category: Extensions
  #
  # Is the extension `name` enabled?

  def extension? name
    @extensions.include? name
  end

  ##
  # :category: Extensions
  #
  # Enables or disables the extension with `name`

  def extension name, enable
    if enable then
      @extensions |= [name]
    else
      @extensions -= [name]
    end
  end

  ##
  # Parses `text` in a clone of this parser.  This is used for handling nested
  # lists the same way as markdown_parser.

  def inner_parse text # :nodoc:
    parser = clone

    parser.setup_parser text, @debug

    parser.peg_parse

    doc = parser.result

    doc.accept @formatter

    doc.parts
  end

  ##
  # Finds a link reference for `label` and creates a new link to it with
  # `content` as the link text.  If `label` was not encountered in the
  # reference-gathering parser pass the label and content are reconstructed
  # with the linking `text` (usually whitespace).

  def link_to content, label = content, text = nil
    raise ParseError, 'enable notes extension' if
      content.start_with? '^' and label.equal? content

    if ref = @references[label] then
      "{#{content}}[#{ref}]"
    elsif label.equal? content then
      "[#{content}]#{text}"
    else
      "[#{content}]#{text}[#{label}]"
    end
  end

  ##
  # Creates an RDoc::Markup::ListItem by parsing the `unparsed` content from
  # the first parsing pass.

  def list_item_from unparsed
    parsed = inner_parse unparsed.join
    RDoc::Markup::ListItem.new nil, *parsed
  end

  ##
  # Stores `label` as a note and fills in previously unknown note references.

  def note label
    #foottext = "rdoc-label:foottext-#{label}:footmark-#{label}"

    #ref.replace foottext if ref = @unlinked_notes.delete(label)

    @notes[label] = foottext

    #"{^1}[rdoc-label:footmark-#{label}:foottext-#{label}] "
  end

  ##
  # Creates a new link for the footnote `reference` and adds the reference to
  # the note order list for proper display at the end of the document.

  def note_for ref
    @note_order << ref

    label = @note_order.length

    "{*#{label}}[rdoc-label:foottext-#{label}:footmark-#{label}]"
  end

  ##
  # The internal kpeg parse method

  alias peg_parse parse # :nodoc:

  ##
  # Creates an RDoc::Markup::Paragraph from `parts` and including
  # extension-specific behavior

  def paragraph parts
    parts = parts.map do |part|
      if "\n" == part then
        RDoc::Markup::HardBreak.new
      else
        part
      end
    end if break_on_newline?

    RDoc::Markup::Paragraph.new(*parts)
  end

  ##
  # Parses `markdown` into an RDoc::Document

  def parse markdown
    @references          = {}
    @unlinked_references = {}

    markdown += "\n\n"

    setup_parser markdown, @debug
    peg_parse 'References'

    if notes? then
      @footnotes       = {}

      setup_parser markdown, @debug
      peg_parse 'Notes'

      # using note_order on the first pass would be a bug
      @note_order      = []
    end

    setup_parser markdown, @debug
    peg_parse

    doc = result

    if notes? and not @footnotes.empty? then
      doc << RDoc::Markup::Rule.new(1)

      @note_order.each_with_index do |ref, index|
        label = index + 1
        note = @footnotes[ref]

        link = "{^#{label}}[rdoc-label:footmark-#{label}:foottext-#{label}] "
        note.parts.unshift link

        doc << note
      end
    end

    doc.accept @formatter

    doc
  end

  ##
  # Stores `label` as a reference to `link` and fills in previously unknown
  # link references.

  def reference label, link
    if ref = @unlinked_references.delete(label) then
      ref.replace link
    end

    @references[label] = link
  end

  ##
  # Wraps `text` in strong markup for rdoc inline formatting

  def strong text
    if text =~ /\A[a-z\d.\/-]+\z/i then
      "*#{text}*"
    else
      "<b>#{text}</b>"
    end
  end

  ##
  # Wraps `text` in strike markup for rdoc inline formatting

  def strike text
    if text =~ /\A[a-z\d.\/-]+\z/i then
      "~#{text}~"
    else
      "<s>#{text}</s>"
    end
  end


  # :stopdoc:
  def setup_foreign_grammar
    @_grammar_literals = RDoc::Markdown::Literals.new(nil)
  end

  # root = Doc
  def _root
    _tmp = apply(:_Doc)
    set_failed_rule :_root unless _tmp
    return _tmp
  end

  # Doc = BOM? Block*:a { RDoc::Markup::Document.new(*a.compact) }
  def _Doc

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = apply(:_BOM)
      unless _tmp
        _tmp = true
        self.pos = _save1
      end
      unless _tmp
        self.pos = _save
        break
      end
      _ary = []
      while true
        _tmp = apply(:_Block)
        _ary << @result if _tmp
        break unless _tmp
      end
      _tmp = true
      @result = _ary
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  RDoc::Markup::Document.new(*a.compact) ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Doc unless _tmp
    return _tmp
  end

  # Block = @BlankLine* (BlockQuote | Verbatim | CodeFence | Table | Note | Reference | HorizontalRule | Heading | OrderedList | BulletList | DefinitionList | HtmlBlock | StyleBlock | Para | Plain)
  def _Block

    _save = self.pos
    while true # sequence
      while true
        _tmp = _BlankLine()
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end

      _save2 = self.pos
      while true # choice
        _tmp = apply(:_BlockQuote)
        break if _tmp
        self.pos = _save2
        _tmp = apply(:_Verbatim)
        break if _tmp
        self.pos = _save2
        _tmp = apply(:_CodeFence)
        break if _tmp
        self.pos = _save2
        _tmp = apply(:_Table)
        break if _tmp
        self.pos = _save2
        _tmp = apply(:_Note)
        break if _tmp
        self.pos = _save2
        _tmp = apply(:_Reference)
        break if _tmp
        self.pos = _save2
        _tmp = apply(:_HorizontalRule)
        break if _tmp
        self.pos = _save2
        _tmp = apply(:_Heading)
        break if _tmp
        self.pos = _save2
        _tmp = apply(:_OrderedList)
        break if _tmp
        self.pos = _save2
        _tmp = apply(:_BulletList)
        break if _tmp
        self.pos = _save2
        _tmp = apply(:_DefinitionList)
        break if _tmp
        self.pos = _save2
        _tmp = apply(:_HtmlBlock)
        break if _tmp
        self.pos = _save2
        _tmp = apply(:_StyleBlock)
        break if _tmp
        self.pos = _save2
        _tmp = apply(:_Para)
        break if _tmp
        self.pos = _save2
        _tmp = apply(:_Plain)
        break if _tmp
        self.pos = _save2
        break
      end # end choice

      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Block unless _tmp
    return _tmp
  end

  # Para = @NonindentSpace Inlines:a @BlankLine+ { paragraph a }
  def _Para

    _save = self.pos
    while true # sequence
      _tmp = _NonindentSpace()
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Inlines)
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos
      _tmp = _BlankLine()
      if _tmp
        while true
          _tmp = _BlankLine()
          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save1
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  paragraph a ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Para unless _tmp
    return _tmp
  end

  # Plain = Inlines:a { paragraph a }
  def _Plain

    _save = self.pos
    while true # sequence
      _tmp = apply(:_Inlines)
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  paragraph a ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Plain unless _tmp
    return _tmp
  end

  # AtxInline = !@Newline !(@Sp /#*/ @Sp @Newline) Inline
  def _AtxInline

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = _Newline()
      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos

      _save3 = self.pos
      while true # sequence
        _tmp = _Sp()
        unless _tmp
          self.pos = _save3
          break
        end
        _tmp = scan(/\G(?-mix:#*)/)
        unless _tmp
          self.pos = _save3
          break
        end
        _tmp = _Sp()
        unless _tmp
          self.pos = _save3
          break
        end
        _tmp = _Newline()
        unless _tmp
          self.pos = _save3
        end
        break
      end # end sequence

      _tmp = _tmp ? nil : true
      self.pos = _save2
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Inline)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_AtxInline unless _tmp
    return _tmp
  end

  # AtxStart = < /\#{1,6}/ > { text.length }
  def _AtxStart

    _save = self.pos
    while true # sequence
      _text_start = self.pos
      _tmp = scan(/\G(?-mix:\#{1,6})/)
      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  text.length ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_AtxStart unless _tmp
    return _tmp
  end

  # AtxHeading = AtxStart:s @Sp AtxInline+:a (@Sp /#*/ @Sp)? @Newline { RDoc::Markup::Heading.new(s, a.join) }
  def _AtxHeading

    _save = self.pos
    while true # sequence
      _tmp = apply(:_AtxStart)
      s = @result
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Sp()
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos
      _ary = []
      _tmp = apply(:_AtxInline)
      if _tmp
        _ary << @result
        while true
          _tmp = apply(:_AtxInline)
          _ary << @result if _tmp
          break unless _tmp
        end
        _tmp = true
        @result = _ary
      else
        self.pos = _save1
      end
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos

      _save3 = self.pos
      while true # sequence
        _tmp = _Sp()
        unless _tmp
          self.pos = _save3
          break
        end
        _tmp = scan(/\G(?-mix:#*)/)
        unless _tmp
          self.pos = _save3
          break
        end
        _tmp = _Sp()
        unless _tmp
          self.pos = _save3
        end
        break
      end # end sequence

      unless _tmp
        _tmp = true
        self.pos = _save2
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Newline()
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  RDoc::Markup::Heading.new(s, a.join) ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_AtxHeading unless _tmp
    return _tmp
  end

  # SetextHeading = (SetextHeading1 | SetextHeading2)
  def _SetextHeading

    _save = self.pos
    while true # choice
      _tmp = apply(:_SetextHeading1)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_SetextHeading2)
      break if _tmp
      self.pos = _save
      break
    end # end choice

    set_failed_rule :_SetextHeading unless _tmp
    return _tmp
  end

  # SetextBottom1 = /={1,}/ @Newline
  def _SetextBottom1

    _save = self.pos
    while true # sequence
      _tmp = scan(/\G(?-mix:={1,})/)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Newline()
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_SetextBottom1 unless _tmp
    return _tmp
  end

  # SetextBottom2 = /-{1,}/ @Newline
  def _SetextBottom2

    _save = self.pos
    while true # sequence
      _tmp = scan(/\G(?-mix:-{1,})/)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Newline()
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_SetextBottom2 unless _tmp
    return _tmp
  end

  # SetextHeading1 = &(@RawLine SetextBottom1) @StartList:a (!@Endline Inline:b { a << b })+ @Sp @Newline SetextBottom1 { RDoc::Markup::Heading.new(1, a.join) }
  def _SetextHeading1

    _save = self.pos
    while true # sequence
      _save1 = self.pos

      _save2 = self.pos
      while true # sequence
        _tmp = _RawLine()
        unless _tmp
          self.pos = _save2
          break
        end
        _tmp = apply(:_SetextBottom1)
        unless _tmp
          self.pos = _save2
        end
        break
      end # end sequence

      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _StartList()
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      _save3 = self.pos

      _save4 = self.pos
      while true # sequence
        _save5 = self.pos
        _tmp = _Endline()
        _tmp = _tmp ? nil : true
        self.pos = _save5
        unless _tmp
          self.pos = _save4
          break
        end
        _tmp = apply(:_Inline)
        b = @result
        unless _tmp
          self.pos = _save4
          break
        end
        @result = begin;  a << b ; end
        _tmp = true
        unless _tmp
          self.pos = _save4
        end
        break
      end # end sequence

      if _tmp
        while true

          _save6 = self.pos
          while true # sequence
            _save7 = self.pos
            _tmp = _Endline()
            _tmp = _tmp ? nil : true
            self.pos = _save7
            unless _tmp
              self.pos = _save6
              break
            end
            _tmp = apply(:_Inline)
            b = @result
            unless _tmp
              self.pos = _save6
              break
            end
            @result = begin;  a << b ; end
            _tmp = true
            unless _tmp
              self.pos = _save6
            end
            break
          end # end sequence

          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save3
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Sp()
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Newline()
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_SetextBottom1)
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  RDoc::Markup::Heading.new(1, a.join) ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_SetextHeading1 unless _tmp
    return _tmp
  end

  # SetextHeading2 = &(@RawLine SetextBottom2) @StartList:a (!@Endline Inline:b { a << b })+ @Sp @Newline SetextBottom2 { RDoc::Markup::Heading.new(2, a.join) }
  def _SetextHeading2

    _save = self.pos
    while true # sequence
      _save1 = self.pos

      _save2 = self.pos
      while true # sequence
        _tmp = _RawLine()
        unless _tmp
          self.pos = _save2
          break
        end
        _tmp = apply(:_SetextBottom2)
        unless _tmp
          self.pos = _save2
        end
        break
      end # end sequence

      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _StartList()
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      _save3 = self.pos

      _save4 = self.pos
      while true # sequence
        _save5 = self.pos
        _tmp = _Endline()
        _tmp = _tmp ? nil : true
        self.pos = _save5
        unless _tmp
          self.pos = _save4
          break
        end
        _tmp = apply(:_Inline)
        b = @result
        unless _tmp
          self.pos = _save4
          break
        end
        @result = begin;  a << b ; end
        _tmp = true
        unless _tmp
          self.pos = _save4
        end
        break
      end # end sequence

      if _tmp
        while true

          _save6 = self.pos
          while true # sequence
            _save7 = self.pos
            _tmp = _Endline()
            _tmp = _tmp ? nil : true
            self.pos = _save7
            unless _tmp
              self.pos = _save6
              break
            end
            _tmp = apply(:_Inline)
            b = @result
            unless _tmp
              self.pos = _save6
              break
            end
            @result = begin;  a << b ; end
            _tmp = true
            unless _tmp
              self.pos = _save6
            end
            break
          end # end sequence

          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save3
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Sp()
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Newline()
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_SetextBottom2)
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  RDoc::Markup::Heading.new(2, a.join) ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_SetextHeading2 unless _tmp
    return _tmp
  end

  # Heading = (SetextHeading | AtxHeading)
  def _Heading

    _save = self.pos
    while true # choice
      _tmp = apply(:_SetextHeading)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_AtxHeading)
      break if _tmp
      self.pos = _save
      break
    end # end choice

    set_failed_rule :_Heading unless _tmp
    return _tmp
  end

  # BlockQuote = BlockQuoteRaw:a { RDoc::Markup::BlockQuote.new(*a) }
  def _BlockQuote

    _save = self.pos
    while true # sequence
      _tmp = apply(:_BlockQuoteRaw)
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  RDoc::Markup::BlockQuote.new(*a) ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_BlockQuote unless _tmp
    return _tmp
  end

  # BlockQuoteRaw = @StartList:a (">" " "? Line:l { a << l } (!">" !@BlankLine Line:c { a << c })* (@BlankLine:n { a << n })*)+ { inner_parse a.join }
  def _BlockQuoteRaw

    _save = self.pos
    while true # sequence
      _tmp = _StartList()
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos

      _save2 = self.pos
      while true # sequence
        _tmp = match_string(">")
        unless _tmp
          self.pos = _save2
          break
        end
        _save3 = self.pos
        _tmp = match_string(" ")
        unless _tmp
          _tmp = true
          self.pos = _save3
        end
        unless _tmp
          self.pos = _save2
          break
        end
        _tmp = apply(:_Line)
        l = @result
        unless _tmp
          self.pos = _save2
          break
        end
        @result = begin;  a << l ; end
        _tmp = true
        unless _tmp
          self.pos = _save2
          break
        end
        while true

          _save5 = self.pos
          while true # sequence
            _save6 = self.pos
            _tmp = match_string(">")
            _tmp = _tmp ? nil : true
            self.pos = _save6
            unless _tmp
              self.pos = _save5
              break
            end
            _save7 = self.pos
            _tmp = _BlankLine()
            _tmp = _tmp ? nil : true
            self.pos = _save7
            unless _tmp
              self.pos = _save5
              break
            end
            _tmp = apply(:_Line)
            c = @result
            unless _tmp
              self.pos = _save5
              break
            end
            @result = begin;  a << c ; end
            _tmp = true
            unless _tmp
              self.pos = _save5
            end
            break
          end # end sequence

          break unless _tmp
        end
        _tmp = true
        unless _tmp
          self.pos = _save2
          break
        end
        while true

          _save9 = self.pos
          while true # sequence
            _tmp = _BlankLine()
            n = @result
            unless _tmp
              self.pos = _save9
              break
            end
            @result = begin;  a << n ; end
            _tmp = true
            unless _tmp
              self.pos = _save9
            end
            break
          end # end sequence

          break unless _tmp
        end
        _tmp = true
        unless _tmp
          self.pos = _save2
        end
        break
      end # end sequence

      if _tmp
        while true

          _save10 = self.pos
          while true # sequence
            _tmp = match_string(">")
            unless _tmp
              self.pos = _save10
              break
            end
            _save11 = self.pos
            _tmp = match_string(" ")
            unless _tmp
              _tmp = true
              self.pos = _save11
            end
            unless _tmp
              self.pos = _save10
              break
            end
            _tmp = apply(:_Line)
            l = @result
            unless _tmp
              self.pos = _save10
              break
            end
            @result = begin;  a << l ; end
            _tmp = true
            unless _tmp
              self.pos = _save10
              break
            end
            while true

              _save13 = self.pos
              while true # sequence
                _save14 = self.pos
                _tmp = match_string(">")
                _tmp = _tmp ? nil : true
                self.pos = _save14
                unless _tmp
                  self.pos = _save13
                  break
                end
                _save15 = self.pos
                _tmp = _BlankLine()
                _tmp = _tmp ? nil : true
                self.pos = _save15
                unless _tmp
                  self.pos = _save13
                  break
                end
                _tmp = apply(:_Line)
                c = @result
                unless _tmp
                  self.pos = _save13
                  break
                end
                @result = begin;  a << c ; end
                _tmp = true
                unless _tmp
                  self.pos = _save13
                end
                break
              end # end sequence

              break unless _tmp
            end
            _tmp = true
            unless _tmp
              self.pos = _save10
              break
            end
            while true

              _save17 = self.pos
              while true # sequence
                _tmp = _BlankLine()
                n = @result
                unless _tmp
                  self.pos = _save17
                  break
                end
                @result = begin;  a << n ; end
                _tmp = true
                unless _tmp
                  self.pos = _save17
                end
                break
              end # end sequence

              break unless _tmp
            end
            _tmp = true
            unless _tmp
              self.pos = _save10
            end
            break
          end # end sequence

          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save1
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  inner_parse a.join ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_BlockQuoteRaw unless _tmp
    return _tmp
  end

  # NonblankIndentedLine = !@BlankLine IndentedLine
  def _NonblankIndentedLine

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = _BlankLine()
      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_IndentedLine)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_NonblankIndentedLine unless _tmp
    return _tmp
  end

  # VerbatimChunk = @BlankLine*:a NonblankIndentedLine+:b { a.concat b }
  def _VerbatimChunk

    _save = self.pos
    while true # sequence
      _ary = []
      while true
        _tmp = _BlankLine()
        _ary << @result if _tmp
        break unless _tmp
      end
      _tmp = true
      @result = _ary
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos
      _ary = []
      _tmp = apply(:_NonblankIndentedLine)
      if _tmp
        _ary << @result
        while true
          _tmp = apply(:_NonblankIndentedLine)
          _ary << @result if _tmp
          break unless _tmp
        end
        _tmp = true
        @result = _ary
      else
        self.pos = _save2
      end
      b = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  a.concat b ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_VerbatimChunk unless _tmp
    return _tmp
  end

  # Verbatim = VerbatimChunk+:a { RDoc::Markup::Verbatim.new(*a.flatten) }
  def _Verbatim

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _ary = []
      _tmp = apply(:_VerbatimChunk)
      if _tmp
        _ary << @result
        while true
          _tmp = apply(:_VerbatimChunk)
          _ary << @result if _tmp
          break unless _tmp
        end
        _tmp = true
        @result = _ary
      else
        self.pos = _save1
      end
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  RDoc::Markup::Verbatim.new(*a.flatten) ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Verbatim unless _tmp
    return _tmp
  end

  # HorizontalRule = @NonindentSpace ("*" @Sp "*" @Sp "*" (@Sp "*")* | "-" @Sp "-" @Sp "-" (@Sp "-")* | "_" @Sp "_" @Sp "_" (@Sp "_")*) @Sp @Newline @BlankLine+ { RDoc::Markup::Rule.new 1 }
  def _HorizontalRule

    _save = self.pos
    while true # sequence
      _tmp = _NonindentSpace()
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice

        _save2 = self.pos
        while true # sequence
          _tmp = match_string("*")
          unless _tmp
            self.pos = _save2
            break
          end
          _tmp = _Sp()
          unless _tmp
            self.pos = _save2
            break
          end
          _tmp = match_string("*")
          unless _tmp
            self.pos = _save2
            break
          end
          _tmp = _Sp()
          unless _tmp
            self.pos = _save2
            break
          end
          _tmp = match_string("*")
          unless _tmp
            self.pos = _save2
            break
          end
          while true

            _save4 = self.pos
            while true # sequence
              _tmp = _Sp()
              unless _tmp
                self.pos = _save4
                break
              end
              _tmp = match_string("*")
              unless _tmp
                self.pos = _save4
              end
              break
            end # end sequence

            break unless _tmp
          end
          _tmp = true
          unless _tmp
            self.pos = _save2
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save1

        _save5 = self.pos
        while true # sequence
          _tmp = match_string("-")
          unless _tmp
            self.pos = _save5
            break
          end
          _tmp = _Sp()
          unless _tmp
            self.pos = _save5
            break
          end
          _tmp = match_string("-")
          unless _tmp
            self.pos = _save5
            break
          end
          _tmp = _Sp()
          unless _tmp
            self.pos = _save5
            break
          end
          _tmp = match_string("-")
          unless _tmp
            self.pos = _save5
            break
          end
          while true

            _save7 = self.pos
            while true # sequence
              _tmp = _Sp()
              unless _tmp
                self.pos = _save7
                break
              end
              _tmp = match_string("-")
              unless _tmp
                self.pos = _save7
              end
              break
            end # end sequence

            break unless _tmp
          end
          _tmp = true
          unless _tmp
            self.pos = _save5
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save1

        _save8 = self.pos
        while true # sequence
          _tmp = match_string("_")
          unless _tmp
            self.pos = _save8
            break
          end
          _tmp = _Sp()
          unless _tmp
            self.pos = _save8
            break
          end
          _tmp = match_string("_")
          unless _tmp
            self.pos = _save8
            break
          end
          _tmp = _Sp()
          unless _tmp
            self.pos = _save8
            break
          end
          _tmp = match_string("_")
          unless _tmp
            self.pos = _save8
            break
          end
          while true

            _save10 = self.pos
            while true # sequence
              _tmp = _Sp()
              unless _tmp
                self.pos = _save10
                break
              end
              _tmp = match_string("_")
              unless _tmp
                self.pos = _save10
              end
              break
            end # end sequence

            break unless _tmp
          end
          _tmp = true
          unless _tmp
            self.pos = _save8
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Sp()
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Newline()
      unless _tmp
        self.pos = _save
        break
      end
      _save11 = self.pos
      _tmp = _BlankLine()
      if _tmp
        while true
          _tmp = _BlankLine()
          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save11
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  RDoc::Markup::Rule.new 1 ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HorizontalRule unless _tmp
    return _tmp
  end

  # Bullet = !HorizontalRule @NonindentSpace /[+*-]/ @Spacechar+
  def _Bullet

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = apply(:_HorizontalRule)
      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _NonindentSpace()
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = scan(/\G(?-mix:[+*-])/)
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos
      _tmp = _Spacechar()
      if _tmp
        while true
          _tmp = _Spacechar()
          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save2
      end
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Bullet unless _tmp
    return _tmp
  end

  # BulletList = &Bullet (ListTight | ListLoose):a { RDoc::Markup::List.new(:BULLET, *a) }
  def _BulletList

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = apply(:_Bullet)
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end

      _save2 = self.pos
      while true # choice
        _tmp = apply(:_ListTight)
        break if _tmp
        self.pos = _save2
        _tmp = apply(:_ListLoose)
        break if _tmp
        self.pos = _save2
        break
      end # end choice

      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  RDoc::Markup::List.new(:BULLET, *a) ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_BulletList unless _tmp
    return _tmp
  end

  # ListTight = ListItemTight+:a @BlankLine* !(Bullet | Enumerator) { a }
  def _ListTight

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _ary = []
      _tmp = apply(:_ListItemTight)
      if _tmp
        _ary << @result
        while true
          _tmp = apply(:_ListItemTight)
          _ary << @result if _tmp
          break unless _tmp
        end
        _tmp = true
        @result = _ary
      else
        self.pos = _save1
      end
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = _BlankLine()
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _save3 = self.pos

      _save4 = self.pos
      while true # choice
        _tmp = apply(:_Bullet)
        break if _tmp
        self.pos = _save4
        _tmp = apply(:_Enumerator)
        break if _tmp
        self.pos = _save4
        break
      end # end choice

      _tmp = _tmp ? nil : true
      self.pos = _save3
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  a ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_ListTight unless _tmp
    return _tmp
  end

  # ListLoose = @StartList:a (ListItem:b @BlankLine* { a << b })+ { a }
  def _ListLoose

    _save = self.pos
    while true # sequence
      _tmp = _StartList()
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos

      _save2 = self.pos
      while true # sequence
        _tmp = apply(:_ListItem)
        b = @result
        unless _tmp
          self.pos = _save2
          break
        end
        while true
          _tmp = _BlankLine()
          break unless _tmp
        end
        _tmp = true
        unless _tmp
          self.pos = _save2
          break
        end
        @result = begin;  a << b ; end
        _tmp = true
        unless _tmp
          self.pos = _save2
        end
        break
      end # end sequence

      if _tmp
        while true

          _save4 = self.pos
          while true # sequence
            _tmp = apply(:_ListItem)
            b = @result
            unless _tmp
              self.pos = _save4
              break
            end
            while true
              _tmp = _BlankLine()
              break unless _tmp
            end
            _tmp = true
            unless _tmp
              self.pos = _save4
              break
            end
            @result = begin;  a << b ; end
            _tmp = true
            unless _tmp
              self.pos = _save4
            end
            break
          end # end sequence

          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save1
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  a ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_ListLoose unless _tmp
    return _tmp
  end

  # ListItem = (Bullet | Enumerator) @StartList:a ListBlock:b { a << b } (ListContinuationBlock:c { a.push(*c) })* { list_item_from a }
  def _ListItem

    _save = self.pos
    while true # sequence

      _save1 = self.pos
      while true # choice
        _tmp = apply(:_Bullet)
        break if _tmp
        self.pos = _save1
        _tmp = apply(:_Enumerator)
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _StartList()
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_ListBlock)
      b = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  a << b ; end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save3 = self.pos
        while true # sequence
          _tmp = apply(:_ListContinuationBlock)
          c = @result
          unless _tmp
            self.pos = _save3
            break
          end
          @result = begin;  a.push(*c) ; end
          _tmp = true
          unless _tmp
            self.pos = _save3
          end
          break
        end # end sequence

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  list_item_from a ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_ListItem unless _tmp
    return _tmp
  end

  # ListItemTight = (Bullet | Enumerator) ListBlock:a (!@BlankLine ListContinuationBlock:b { a.push(*b) })* !ListContinuationBlock { list_item_from a }
  def _ListItemTight

    _save = self.pos
    while true # sequence

      _save1 = self.pos
      while true # choice
        _tmp = apply(:_Bullet)
        break if _tmp
        self.pos = _save1
        _tmp = apply(:_Enumerator)
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_ListBlock)
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save3 = self.pos
        while true # sequence
          _save4 = self.pos
          _tmp = _BlankLine()
          _tmp = _tmp ? nil : true
          self.pos = _save4
          unless _tmp
            self.pos = _save3
            break
          end
          _tmp = apply(:_ListContinuationBlock)
          b = @result
          unless _tmp
            self.pos = _save3
            break
          end
          @result = begin;  a.push(*b) ; end
          _tmp = true
          unless _tmp
            self.pos = _save3
          end
          break
        end # end sequence

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _save5 = self.pos
      _tmp = apply(:_ListContinuationBlock)
      _tmp = _tmp ? nil : true
      self.pos = _save5
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  list_item_from a ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_ListItemTight unless _tmp
    return _tmp
  end

  # ListBlock = !@BlankLine Line:a ListBlockLine*:c { [a, *c] }
  def _ListBlock

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = _BlankLine()
      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Line)
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      _ary = []
      while true
        _tmp = apply(:_ListBlockLine)
        _ary << @result if _tmp
        break unless _tmp
      end
      _tmp = true
      @result = _ary
      c = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  [a, *c] ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_ListBlock unless _tmp
    return _tmp
  end

  # ListContinuationBlock = @StartList:a @BlankLine* { a << "\n" } (Indent ListBlock:b { a.concat b })+ { a }
  def _ListContinuationBlock

    _save = self.pos
    while true # sequence
      _tmp = _StartList()
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = _BlankLine()
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  a << "\n" ; end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos

      _save3 = self.pos
      while true # sequence
        _tmp = apply(:_Indent)
        unless _tmp
          self.pos = _save3
          break
        end
        _tmp = apply(:_ListBlock)
        b = @result
        unless _tmp
          self.pos = _save3
          break
        end
        @result = begin;  a.concat b ; end
        _tmp = true
        unless _tmp
          self.pos = _save3
        end
        break
      end # end sequence

      if _tmp
        while true

          _save4 = self.pos
          while true # sequence
            _tmp = apply(:_Indent)
            unless _tmp
              self.pos = _save4
              break
            end
            _tmp = apply(:_ListBlock)
            b = @result
            unless _tmp
              self.pos = _save4
              break
            end
            @result = begin;  a.concat b ; end
            _tmp = true
            unless _tmp
              self.pos = _save4
            end
            break
          end # end sequence

          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save2
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  a ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_ListContinuationBlock unless _tmp
    return _tmp
  end

  # Enumerator = @NonindentSpace [0-9]+ "." @Spacechar+
  def _Enumerator

    _save = self.pos
    while true # sequence
      _tmp = _NonindentSpace()
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos
      _save2 = self.pos
      _tmp = get_byte
      if _tmp
        unless _tmp >= 48 and _tmp <= 57
          self.pos = _save2
          _tmp = nil
        end
      end
      if _tmp
        while true
          _save3 = self.pos
          _tmp = get_byte
          if _tmp
            unless _tmp >= 48 and _tmp <= 57
              self.pos = _save3
              _tmp = nil
            end
          end
          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save1
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(".")
      unless _tmp
        self.pos = _save
        break
      end
      _save4 = self.pos
      _tmp = _Spacechar()
      if _tmp
        while true
          _tmp = _Spacechar()
          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save4
      end
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Enumerator unless _tmp
    return _tmp
  end

  # OrderedList = &Enumerator (ListTight | ListLoose):a { RDoc::Markup::List.new(:NUMBER, *a) }
  def _OrderedList

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = apply(:_Enumerator)
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end

      _save2 = self.pos
      while true # choice
        _tmp = apply(:_ListTight)
        break if _tmp
        self.pos = _save2
        _tmp = apply(:_ListLoose)
        break if _tmp
        self.pos = _save2
        break
      end # end choice

      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  RDoc::Markup::List.new(:NUMBER, *a) ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_OrderedList unless _tmp
    return _tmp
  end

  # ListBlockLine = !@BlankLine !(Indent? (Bullet | Enumerator)) !HorizontalRule OptionallyIndentedLine
  def _ListBlockLine

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = _BlankLine()
      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos

      _save3 = self.pos
      while true # sequence
        _save4 = self.pos
        _tmp = apply(:_Indent)
        unless _tmp
          _tmp = true
          self.pos = _save4
        end
        unless _tmp
          self.pos = _save3
          break
        end

        _save5 = self.pos
        while true # choice
          _tmp = apply(:_Bullet)
          break if _tmp
          self.pos = _save5
          _tmp = apply(:_Enumerator)
          break if _tmp
          self.pos = _save5
          break
        end # end choice

        unless _tmp
          self.pos = _save3
        end
        break
      end # end sequence

      _tmp = _tmp ? nil : true
      self.pos = _save2
      unless _tmp
        self.pos = _save
        break
      end
      _save6 = self.pos
      _tmp = apply(:_HorizontalRule)
      _tmp = _tmp ? nil : true
      self.pos = _save6
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_OptionallyIndentedLine)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_ListBlockLine unless _tmp
    return _tmp
  end

  # HtmlOpenAnchor = "<" Spnl ("a" | "A") Spnl HtmlAttribute* ">"
  def _HtmlOpenAnchor

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("a")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("A")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlOpenAnchor unless _tmp
    return _tmp
  end

  # HtmlCloseAnchor = "<" Spnl "/" ("a" | "A") Spnl ">"
  def _HtmlCloseAnchor

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("a")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("A")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlCloseAnchor unless _tmp
    return _tmp
  end

  # HtmlAnchor = HtmlOpenAnchor (HtmlAnchor | !HtmlCloseAnchor .)* HtmlCloseAnchor
  def _HtmlAnchor

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlOpenAnchor)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlAnchor)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlCloseAnchor)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlCloseAnchor)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlAnchor unless _tmp
    return _tmp
  end

  # HtmlBlockOpenAddress = "<" Spnl ("address" | "ADDRESS") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenAddress

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("address")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("ADDRESS")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenAddress unless _tmp
    return _tmp
  end

  # HtmlBlockCloseAddress = "<" Spnl "/" ("address" | "ADDRESS") Spnl ">"
  def _HtmlBlockCloseAddress

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("address")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("ADDRESS")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseAddress unless _tmp
    return _tmp
  end

  # HtmlBlockAddress = HtmlBlockOpenAddress (HtmlBlockAddress | !HtmlBlockCloseAddress .)* HtmlBlockCloseAddress
  def _HtmlBlockAddress

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenAddress)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockAddress)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseAddress)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseAddress)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockAddress unless _tmp
    return _tmp
  end

  # HtmlBlockOpenBlockquote = "<" Spnl ("blockquote" | "BLOCKQUOTE") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenBlockquote

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("blockquote")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("BLOCKQUOTE")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenBlockquote unless _tmp
    return _tmp
  end

  # HtmlBlockCloseBlockquote = "<" Spnl "/" ("blockquote" | "BLOCKQUOTE") Spnl ">"
  def _HtmlBlockCloseBlockquote

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("blockquote")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("BLOCKQUOTE")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseBlockquote unless _tmp
    return _tmp
  end

  # HtmlBlockBlockquote = HtmlBlockOpenBlockquote (HtmlBlockBlockquote | !HtmlBlockCloseBlockquote .)* HtmlBlockCloseBlockquote
  def _HtmlBlockBlockquote

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenBlockquote)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockBlockquote)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseBlockquote)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseBlockquote)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockBlockquote unless _tmp
    return _tmp
  end

  # HtmlBlockOpenCenter = "<" Spnl ("center" | "CENTER") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenCenter

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("center")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("CENTER")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenCenter unless _tmp
    return _tmp
  end

  # HtmlBlockCloseCenter = "<" Spnl "/" ("center" | "CENTER") Spnl ">"
  def _HtmlBlockCloseCenter

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("center")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("CENTER")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseCenter unless _tmp
    return _tmp
  end

  # HtmlBlockCenter = HtmlBlockOpenCenter (HtmlBlockCenter | !HtmlBlockCloseCenter .)* HtmlBlockCloseCenter
  def _HtmlBlockCenter

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenCenter)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockCenter)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseCenter)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseCenter)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCenter unless _tmp
    return _tmp
  end

  # HtmlBlockOpenDir = "<" Spnl ("dir" | "DIR") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenDir

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("dir")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("DIR")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenDir unless _tmp
    return _tmp
  end

  # HtmlBlockCloseDir = "<" Spnl "/" ("dir" | "DIR") Spnl ">"
  def _HtmlBlockCloseDir

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("dir")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("DIR")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseDir unless _tmp
    return _tmp
  end

  # HtmlBlockDir = HtmlBlockOpenDir (HtmlBlockDir | !HtmlBlockCloseDir .)* HtmlBlockCloseDir
  def _HtmlBlockDir

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenDir)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockDir)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseDir)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseDir)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockDir unless _tmp
    return _tmp
  end

  # HtmlBlockOpenDiv = "<" Spnl ("div" | "DIV") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenDiv

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("div")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("DIV")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenDiv unless _tmp
    return _tmp
  end

  # HtmlBlockCloseDiv = "<" Spnl "/" ("div" | "DIV") Spnl ">"
  def _HtmlBlockCloseDiv

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("div")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("DIV")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseDiv unless _tmp
    return _tmp
  end

  # HtmlBlockDiv = HtmlBlockOpenDiv (HtmlBlockDiv | !HtmlBlockCloseDiv .)* HtmlBlockCloseDiv
  def _HtmlBlockDiv

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenDiv)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockDiv)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseDiv)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseDiv)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockDiv unless _tmp
    return _tmp
  end

  # HtmlBlockOpenDl = "<" Spnl ("dl" | "DL") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenDl

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("dl")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("DL")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenDl unless _tmp
    return _tmp
  end

  # HtmlBlockCloseDl = "<" Spnl "/" ("dl" | "DL") Spnl ">"
  def _HtmlBlockCloseDl

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("dl")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("DL")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseDl unless _tmp
    return _tmp
  end

  # HtmlBlockDl = HtmlBlockOpenDl (HtmlBlockDl | !HtmlBlockCloseDl .)* HtmlBlockCloseDl
  def _HtmlBlockDl

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenDl)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockDl)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseDl)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseDl)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockDl unless _tmp
    return _tmp
  end

  # HtmlBlockOpenFieldset = "<" Spnl ("fieldset" | "FIELDSET") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenFieldset

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("fieldset")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("FIELDSET")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenFieldset unless _tmp
    return _tmp
  end

  # HtmlBlockCloseFieldset = "<" Spnl "/" ("fieldset" | "FIELDSET") Spnl ">"
  def _HtmlBlockCloseFieldset

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("fieldset")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("FIELDSET")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseFieldset unless _tmp
    return _tmp
  end

  # HtmlBlockFieldset = HtmlBlockOpenFieldset (HtmlBlockFieldset | !HtmlBlockCloseFieldset .)* HtmlBlockCloseFieldset
  def _HtmlBlockFieldset

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenFieldset)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockFieldset)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseFieldset)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseFieldset)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockFieldset unless _tmp
    return _tmp
  end

  # HtmlBlockOpenForm = "<" Spnl ("form" | "FORM") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenForm

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("form")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("FORM")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenForm unless _tmp
    return _tmp
  end

  # HtmlBlockCloseForm = "<" Spnl "/" ("form" | "FORM") Spnl ">"
  def _HtmlBlockCloseForm

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("form")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("FORM")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseForm unless _tmp
    return _tmp
  end

  # HtmlBlockForm = HtmlBlockOpenForm (HtmlBlockForm | !HtmlBlockCloseForm .)* HtmlBlockCloseForm
  def _HtmlBlockForm

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenForm)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockForm)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseForm)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseForm)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockForm unless _tmp
    return _tmp
  end

  # HtmlBlockOpenH1 = "<" Spnl ("h1" | "H1") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenH1

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("h1")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("H1")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenH1 unless _tmp
    return _tmp
  end

  # HtmlBlockCloseH1 = "<" Spnl "/" ("h1" | "H1") Spnl ">"
  def _HtmlBlockCloseH1

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("h1")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("H1")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseH1 unless _tmp
    return _tmp
  end

  # HtmlBlockH1 = HtmlBlockOpenH1 (HtmlBlockH1 | !HtmlBlockCloseH1 .)* HtmlBlockCloseH1
  def _HtmlBlockH1

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenH1)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockH1)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseH1)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseH1)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockH1 unless _tmp
    return _tmp
  end

  # HtmlBlockOpenH2 = "<" Spnl ("h2" | "H2") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenH2

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("h2")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("H2")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenH2 unless _tmp
    return _tmp
  end

  # HtmlBlockCloseH2 = "<" Spnl "/" ("h2" | "H2") Spnl ">"
  def _HtmlBlockCloseH2

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("h2")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("H2")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseH2 unless _tmp
    return _tmp
  end

  # HtmlBlockH2 = HtmlBlockOpenH2 (HtmlBlockH2 | !HtmlBlockCloseH2 .)* HtmlBlockCloseH2
  def _HtmlBlockH2

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenH2)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockH2)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseH2)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseH2)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockH2 unless _tmp
    return _tmp
  end

  # HtmlBlockOpenH3 = "<" Spnl ("h3" | "H3") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenH3

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("h3")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("H3")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenH3 unless _tmp
    return _tmp
  end

  # HtmlBlockCloseH3 = "<" Spnl "/" ("h3" | "H3") Spnl ">"
  def _HtmlBlockCloseH3

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("h3")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("H3")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseH3 unless _tmp
    return _tmp
  end

  # HtmlBlockH3 = HtmlBlockOpenH3 (HtmlBlockH3 | !HtmlBlockCloseH3 .)* HtmlBlockCloseH3
  def _HtmlBlockH3

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenH3)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockH3)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseH3)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseH3)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockH3 unless _tmp
    return _tmp
  end

  # HtmlBlockOpenH4 = "<" Spnl ("h4" | "H4") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenH4

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("h4")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("H4")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenH4 unless _tmp
    return _tmp
  end

  # HtmlBlockCloseH4 = "<" Spnl "/" ("h4" | "H4") Spnl ">"
  def _HtmlBlockCloseH4

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("h4")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("H4")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseH4 unless _tmp
    return _tmp
  end

  # HtmlBlockH4 = HtmlBlockOpenH4 (HtmlBlockH4 | !HtmlBlockCloseH4 .)* HtmlBlockCloseH4
  def _HtmlBlockH4

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenH4)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockH4)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseH4)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseH4)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockH4 unless _tmp
    return _tmp
  end

  # HtmlBlockOpenH5 = "<" Spnl ("h5" | "H5") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenH5

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("h5")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("H5")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenH5 unless _tmp
    return _tmp
  end

  # HtmlBlockCloseH5 = "<" Spnl "/" ("h5" | "H5") Spnl ">"
  def _HtmlBlockCloseH5

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("h5")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("H5")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseH5 unless _tmp
    return _tmp
  end

  # HtmlBlockH5 = HtmlBlockOpenH5 (HtmlBlockH5 | !HtmlBlockCloseH5 .)* HtmlBlockCloseH5
  def _HtmlBlockH5

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenH5)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockH5)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseH5)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseH5)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockH5 unless _tmp
    return _tmp
  end

  # HtmlBlockOpenH6 = "<" Spnl ("h6" | "H6") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenH6

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("h6")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("H6")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenH6 unless _tmp
    return _tmp
  end

  # HtmlBlockCloseH6 = "<" Spnl "/" ("h6" | "H6") Spnl ">"
  def _HtmlBlockCloseH6

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("h6")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("H6")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseH6 unless _tmp
    return _tmp
  end

  # HtmlBlockH6 = HtmlBlockOpenH6 (HtmlBlockH6 | !HtmlBlockCloseH6 .)* HtmlBlockCloseH6
  def _HtmlBlockH6

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenH6)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockH6)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseH6)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseH6)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockH6 unless _tmp
    return _tmp
  end

  # HtmlBlockOpenMenu = "<" Spnl ("menu" | "MENU") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenMenu

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("menu")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("MENU")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenMenu unless _tmp
    return _tmp
  end

  # HtmlBlockCloseMenu = "<" Spnl "/" ("menu" | "MENU") Spnl ">"
  def _HtmlBlockCloseMenu

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("menu")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("MENU")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseMenu unless _tmp
    return _tmp
  end

  # HtmlBlockMenu = HtmlBlockOpenMenu (HtmlBlockMenu | !HtmlBlockCloseMenu .)* HtmlBlockCloseMenu
  def _HtmlBlockMenu

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenMenu)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockMenu)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseMenu)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseMenu)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockMenu unless _tmp
    return _tmp
  end

  # HtmlBlockOpenNoframes = "<" Spnl ("noframes" | "NOFRAMES") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenNoframes

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("noframes")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("NOFRAMES")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenNoframes unless _tmp
    return _tmp
  end

  # HtmlBlockCloseNoframes = "<" Spnl "/" ("noframes" | "NOFRAMES") Spnl ">"
  def _HtmlBlockCloseNoframes

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("noframes")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("NOFRAMES")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseNoframes unless _tmp
    return _tmp
  end

  # HtmlBlockNoframes = HtmlBlockOpenNoframes (HtmlBlockNoframes | !HtmlBlockCloseNoframes .)* HtmlBlockCloseNoframes
  def _HtmlBlockNoframes

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenNoframes)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockNoframes)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseNoframes)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseNoframes)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockNoframes unless _tmp
    return _tmp
  end

  # HtmlBlockOpenNoscript = "<" Spnl ("noscript" | "NOSCRIPT") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenNoscript

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("noscript")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("NOSCRIPT")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenNoscript unless _tmp
    return _tmp
  end

  # HtmlBlockCloseNoscript = "<" Spnl "/" ("noscript" | "NOSCRIPT") Spnl ">"
  def _HtmlBlockCloseNoscript

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("noscript")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("NOSCRIPT")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseNoscript unless _tmp
    return _tmp
  end

  # HtmlBlockNoscript = HtmlBlockOpenNoscript (HtmlBlockNoscript | !HtmlBlockCloseNoscript .)* HtmlBlockCloseNoscript
  def _HtmlBlockNoscript

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenNoscript)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockNoscript)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseNoscript)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseNoscript)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockNoscript unless _tmp
    return _tmp
  end

  # HtmlBlockOpenOl = "<" Spnl ("ol" | "OL") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenOl

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("ol")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("OL")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenOl unless _tmp
    return _tmp
  end

  # HtmlBlockCloseOl = "<" Spnl "/" ("ol" | "OL") Spnl ">"
  def _HtmlBlockCloseOl

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("ol")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("OL")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseOl unless _tmp
    return _tmp
  end

  # HtmlBlockOl = HtmlBlockOpenOl (HtmlBlockOl | !HtmlBlockCloseOl .)* HtmlBlockCloseOl
  def _HtmlBlockOl

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenOl)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockOl)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseOl)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseOl)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOl unless _tmp
    return _tmp
  end

  # HtmlBlockOpenP = "<" Spnl ("p" | "P") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenP

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("p")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("P")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenP unless _tmp
    return _tmp
  end

  # HtmlBlockCloseP = "<" Spnl "/" ("p" | "P") Spnl ">"
  def _HtmlBlockCloseP

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("p")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("P")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseP unless _tmp
    return _tmp
  end

  # HtmlBlockP = HtmlBlockOpenP (HtmlBlockP | !HtmlBlockCloseP .)* HtmlBlockCloseP
  def _HtmlBlockP

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenP)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockP)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseP)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseP)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockP unless _tmp
    return _tmp
  end

  # HtmlBlockOpenPre = "<" Spnl ("pre" | "PRE") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenPre

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("pre")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("PRE")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenPre unless _tmp
    return _tmp
  end

  # HtmlBlockClosePre = "<" Spnl "/" ("pre" | "PRE") Spnl ">"
  def _HtmlBlockClosePre

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("pre")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("PRE")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockClosePre unless _tmp
    return _tmp
  end

  # HtmlBlockPre = HtmlBlockOpenPre (HtmlBlockPre | !HtmlBlockClosePre .)* HtmlBlockClosePre
  def _HtmlBlockPre

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenPre)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockPre)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockClosePre)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockClosePre)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockPre unless _tmp
    return _tmp
  end

  # HtmlBlockOpenTable = "<" Spnl ("table" | "TABLE") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenTable

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("table")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("TABLE")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenTable unless _tmp
    return _tmp
  end

  # HtmlBlockCloseTable = "<" Spnl "/" ("table" | "TABLE") Spnl ">"
  def _HtmlBlockCloseTable

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("table")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("TABLE")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseTable unless _tmp
    return _tmp
  end

  # HtmlBlockTable = HtmlBlockOpenTable (HtmlBlockTable | !HtmlBlockCloseTable .)* HtmlBlockCloseTable
  def _HtmlBlockTable

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenTable)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockTable)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseTable)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseTable)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockTable unless _tmp
    return _tmp
  end

  # HtmlBlockOpenUl = "<" Spnl ("ul" | "UL") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenUl

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("ul")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("UL")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenUl unless _tmp
    return _tmp
  end

  # HtmlBlockCloseUl = "<" Spnl "/" ("ul" | "UL") Spnl ">"
  def _HtmlBlockCloseUl

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("ul")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("UL")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseUl unless _tmp
    return _tmp
  end

  # HtmlBlockUl = HtmlBlockOpenUl (HtmlBlockUl | !HtmlBlockCloseUl .)* HtmlBlockCloseUl
  def _HtmlBlockUl

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenUl)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockUl)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseUl)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseUl)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockUl unless _tmp
    return _tmp
  end

  # HtmlBlockOpenDd = "<" Spnl ("dd" | "DD") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenDd

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("dd")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("DD")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenDd unless _tmp
    return _tmp
  end

  # HtmlBlockCloseDd = "<" Spnl "/" ("dd" | "DD") Spnl ">"
  def _HtmlBlockCloseDd

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("dd")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("DD")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseDd unless _tmp
    return _tmp
  end

  # HtmlBlockDd = HtmlBlockOpenDd (HtmlBlockDd | !HtmlBlockCloseDd .)* HtmlBlockCloseDd
  def _HtmlBlockDd

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenDd)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockDd)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseDd)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseDd)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockDd unless _tmp
    return _tmp
  end

  # HtmlBlockOpenDt = "<" Spnl ("dt" | "DT") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenDt

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("dt")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("DT")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenDt unless _tmp
    return _tmp
  end

  # HtmlBlockCloseDt = "<" Spnl "/" ("dt" | "DT") Spnl ">"
  def _HtmlBlockCloseDt

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("dt")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("DT")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseDt unless _tmp
    return _tmp
  end

  # HtmlBlockDt = HtmlBlockOpenDt (HtmlBlockDt | !HtmlBlockCloseDt .)* HtmlBlockCloseDt
  def _HtmlBlockDt

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenDt)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockDt)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseDt)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseDt)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockDt unless _tmp
    return _tmp
  end

  # HtmlBlockOpenFrameset = "<" Spnl ("frameset" | "FRAMESET") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenFrameset

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("frameset")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("FRAMESET")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenFrameset unless _tmp
    return _tmp
  end

  # HtmlBlockCloseFrameset = "<" Spnl "/" ("frameset" | "FRAMESET") Spnl ">"
  def _HtmlBlockCloseFrameset

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("frameset")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("FRAMESET")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseFrameset unless _tmp
    return _tmp
  end

  # HtmlBlockFrameset = HtmlBlockOpenFrameset (HtmlBlockFrameset | !HtmlBlockCloseFrameset .)* HtmlBlockCloseFrameset
  def _HtmlBlockFrameset

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenFrameset)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockFrameset)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseFrameset)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseFrameset)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockFrameset unless _tmp
    return _tmp
  end

  # HtmlBlockOpenLi = "<" Spnl ("li" | "LI") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenLi

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("li")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("LI")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenLi unless _tmp
    return _tmp
  end

  # HtmlBlockCloseLi = "<" Spnl "/" ("li" | "LI") Spnl ">"
  def _HtmlBlockCloseLi

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("li")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("LI")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseLi unless _tmp
    return _tmp
  end

  # HtmlBlockLi = HtmlBlockOpenLi (HtmlBlockLi | !HtmlBlockCloseLi .)* HtmlBlockCloseLi
  def _HtmlBlockLi

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenLi)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockLi)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseLi)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseLi)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockLi unless _tmp
    return _tmp
  end

  # HtmlBlockOpenTbody = "<" Spnl ("tbody" | "TBODY") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenTbody

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("tbody")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("TBODY")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenTbody unless _tmp
    return _tmp
  end

  # HtmlBlockCloseTbody = "<" Spnl "/" ("tbody" | "TBODY") Spnl ">"
  def _HtmlBlockCloseTbody

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("tbody")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("TBODY")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseTbody unless _tmp
    return _tmp
  end

  # HtmlBlockTbody = HtmlBlockOpenTbody (HtmlBlockTbody | !HtmlBlockCloseTbody .)* HtmlBlockCloseTbody
  def _HtmlBlockTbody

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenTbody)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockTbody)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseTbody)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseTbody)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockTbody unless _tmp
    return _tmp
  end

  # HtmlBlockOpenTd = "<" Spnl ("td" | "TD") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenTd

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("td")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("TD")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenTd unless _tmp
    return _tmp
  end

  # HtmlBlockCloseTd = "<" Spnl "/" ("td" | "TD") Spnl ">"
  def _HtmlBlockCloseTd

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("td")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("TD")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseTd unless _tmp
    return _tmp
  end

  # HtmlBlockTd = HtmlBlockOpenTd (HtmlBlockTd | !HtmlBlockCloseTd .)* HtmlBlockCloseTd
  def _HtmlBlockTd

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenTd)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockTd)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseTd)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseTd)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockTd unless _tmp
    return _tmp
  end

  # HtmlBlockOpenTfoot = "<" Spnl ("tfoot" | "TFOOT") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenTfoot

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("tfoot")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("TFOOT")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenTfoot unless _tmp
    return _tmp
  end

  # HtmlBlockCloseTfoot = "<" Spnl "/" ("tfoot" | "TFOOT") Spnl ">"
  def _HtmlBlockCloseTfoot

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("tfoot")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("TFOOT")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseTfoot unless _tmp
    return _tmp
  end

  # HtmlBlockTfoot = HtmlBlockOpenTfoot (HtmlBlockTfoot | !HtmlBlockCloseTfoot .)* HtmlBlockCloseTfoot
  def _HtmlBlockTfoot

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenTfoot)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockTfoot)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseTfoot)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseTfoot)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockTfoot unless _tmp
    return _tmp
  end

  # HtmlBlockOpenTh = "<" Spnl ("th" | "TH") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenTh

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("th")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("TH")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenTh unless _tmp
    return _tmp
  end

  # HtmlBlockCloseTh = "<" Spnl "/" ("th" | "TH") Spnl ">"
  def _HtmlBlockCloseTh

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("th")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("TH")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseTh unless _tmp
    return _tmp
  end

  # HtmlBlockTh = HtmlBlockOpenTh (HtmlBlockTh | !HtmlBlockCloseTh .)* HtmlBlockCloseTh
  def _HtmlBlockTh

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenTh)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockTh)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseTh)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseTh)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockTh unless _tmp
    return _tmp
  end

  # HtmlBlockOpenThead = "<" Spnl ("thead" | "THEAD") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenThead

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("thead")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("THEAD")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenThead unless _tmp
    return _tmp
  end

  # HtmlBlockCloseThead = "<" Spnl "/" ("thead" | "THEAD") Spnl ">"
  def _HtmlBlockCloseThead

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("thead")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("THEAD")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseThead unless _tmp
    return _tmp
  end

  # HtmlBlockThead = HtmlBlockOpenThead (HtmlBlockThead | !HtmlBlockCloseThead .)* HtmlBlockCloseThead
  def _HtmlBlockThead

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenThead)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockThead)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseThead)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseThead)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockThead unless _tmp
    return _tmp
  end

  # HtmlBlockOpenTr = "<" Spnl ("tr" | "TR") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenTr

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("tr")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("TR")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenTr unless _tmp
    return _tmp
  end

  # HtmlBlockCloseTr = "<" Spnl "/" ("tr" | "TR") Spnl ">"
  def _HtmlBlockCloseTr

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("tr")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("TR")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseTr unless _tmp
    return _tmp
  end

  # HtmlBlockTr = HtmlBlockOpenTr (HtmlBlockTr | !HtmlBlockCloseTr .)* HtmlBlockCloseTr
  def _HtmlBlockTr

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenTr)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # choice
          _tmp = apply(:_HtmlBlockTr)
          break if _tmp
          self.pos = _save2

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = apply(:_HtmlBlockCloseTr)
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break if _tmp
          self.pos = _save2
          break
        end # end choice

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseTr)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockTr unless _tmp
    return _tmp
  end

  # HtmlBlockOpenScript = "<" Spnl ("script" | "SCRIPT") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenScript

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("script")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("SCRIPT")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenScript unless _tmp
    return _tmp
  end

  # HtmlBlockCloseScript = "<" Spnl "/" ("script" | "SCRIPT") Spnl ">"
  def _HtmlBlockCloseScript

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("script")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("SCRIPT")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseScript unless _tmp
    return _tmp
  end

  # HtmlBlockScript = HtmlBlockOpenScript (!HtmlBlockCloseScript .)* HtmlBlockCloseScript
  def _HtmlBlockScript

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenScript)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # sequence
          _save3 = self.pos
          _tmp = apply(:_HtmlBlockCloseScript)
          _tmp = _tmp ? nil : true
          self.pos = _save3
          unless _tmp
            self.pos = _save2
            break
          end
          _tmp = get_byte
          unless _tmp
            self.pos = _save2
          end
          break
        end # end sequence

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseScript)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockScript unless _tmp
    return _tmp
  end

  # HtmlBlockOpenHead = "<" Spnl ("head" | "HEAD") Spnl HtmlAttribute* ">"
  def _HtmlBlockOpenHead

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("head")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("HEAD")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockOpenHead unless _tmp
    return _tmp
  end

  # HtmlBlockCloseHead = "<" Spnl "/" ("head" | "HEAD") Spnl ">"
  def _HtmlBlockCloseHead

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("head")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("HEAD")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockCloseHead unless _tmp
    return _tmp
  end

  # HtmlBlockHead = HtmlBlockOpenHead (!HtmlBlockCloseHead .)* HtmlBlockCloseHead
  def _HtmlBlockHead

    _save = self.pos
    while true # sequence
      _tmp = apply(:_HtmlBlockOpenHead)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # sequence
          _save3 = self.pos
          _tmp = apply(:_HtmlBlockCloseHead)
          _tmp = _tmp ? nil : true
          self.pos = _save3
          unless _tmp
            self.pos = _save2
            break
          end
          _tmp = get_byte
          unless _tmp
            self.pos = _save2
          end
          break
        end # end sequence

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockCloseHead)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockHead unless _tmp
    return _tmp
  end

  # HtmlBlockInTags = (HtmlAnchor | HtmlBlockAddress | HtmlBlockBlockquote | HtmlBlockCenter | HtmlBlockDir | HtmlBlockDiv | HtmlBlockDl | HtmlBlockFieldset | HtmlBlockForm | HtmlBlockH1 | HtmlBlockH2 | HtmlBlockH3 | HtmlBlockH4 | HtmlBlockH5 | HtmlBlockH6 | HtmlBlockMenu | HtmlBlockNoframes | HtmlBlockNoscript | HtmlBlockOl | HtmlBlockP | HtmlBlockPre | HtmlBlockTable | HtmlBlockUl | HtmlBlockDd | HtmlBlockDt | HtmlBlockFrameset | HtmlBlockLi | HtmlBlockTbody | HtmlBlockTd | HtmlBlockTfoot | HtmlBlockTh | HtmlBlockThead | HtmlBlockTr | HtmlBlockScript | HtmlBlockHead)
  def _HtmlBlockInTags

    _save = self.pos
    while true # choice
      _tmp = apply(:_HtmlAnchor)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockAddress)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockBlockquote)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockCenter)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockDir)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockDiv)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockDl)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockFieldset)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockForm)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockH1)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockH2)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockH3)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockH4)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockH5)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockH6)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockMenu)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockNoframes)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockNoscript)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockOl)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockP)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockPre)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockTable)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockUl)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockDd)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockDt)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockFrameset)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockLi)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockTbody)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockTd)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockTfoot)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockTh)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockThead)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockTr)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockScript)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_HtmlBlockHead)
      break if _tmp
      self.pos = _save
      break
    end # end choice

    set_failed_rule :_HtmlBlockInTags unless _tmp
    return _tmp
  end

  # HtmlBlock = < (HtmlBlockInTags | HtmlComment | HtmlBlockSelfClosing | HtmlUnclosed) > @BlankLine+ { if html? then                 RDoc::Markup::Raw.new text               end }
  def _HtmlBlock

    _save = self.pos
    while true # sequence
      _text_start = self.pos

      _save1 = self.pos
      while true # choice
        _tmp = apply(:_HtmlBlockInTags)
        break if _tmp
        self.pos = _save1
        _tmp = apply(:_HtmlComment)
        break if _tmp
        self.pos = _save1
        _tmp = apply(:_HtmlBlockSelfClosing)
        break if _tmp
        self.pos = _save1
        _tmp = apply(:_HtmlUnclosed)
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos
      _tmp = _BlankLine()
      if _tmp
        while true
          _tmp = _BlankLine()
          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save2
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  if html? then
                RDoc::Markup::Raw.new text
              end ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlock unless _tmp
    return _tmp
  end

  # HtmlUnclosed = "<" Spnl HtmlUnclosedType Spnl HtmlAttribute* Spnl ">"
  def _HtmlUnclosed

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlUnclosedType)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlUnclosed unless _tmp
    return _tmp
  end

  # HtmlUnclosedType = ("HR" | "hr")
  def _HtmlUnclosedType

    _save = self.pos
    while true # choice
      _tmp = match_string("HR")
      break if _tmp
      self.pos = _save
      _tmp = match_string("hr")
      break if _tmp
      self.pos = _save
      break
    end # end choice

    set_failed_rule :_HtmlUnclosedType unless _tmp
    return _tmp
  end

  # HtmlBlockSelfClosing = "<" Spnl HtmlBlockType Spnl HtmlAttribute* "/" Spnl ">"
  def _HtmlBlockSelfClosing

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_HtmlBlockType)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlBlockSelfClosing unless _tmp
    return _tmp
  end

  # HtmlBlockType = ("ADDRESS" | "BLOCKQUOTE" | "CENTER" | "DD" | "DIR" | "DIV" | "DL" | "DT" | "FIELDSET" | "FORM" | "FRAMESET" | "H1" | "H2" | "H3" | "H4" | "H5" | "H6" | "HR" | "ISINDEX" | "LI" | "MENU" | "NOFRAMES" | "NOSCRIPT" | "OL" | "P" | "PRE" | "SCRIPT" | "TABLE" | "TBODY" | "TD" | "TFOOT" | "TH" | "THEAD" | "TR" | "UL" | "address" | "blockquote" | "center" | "dd" | "dir" | "div" | "dl" | "dt" | "fieldset" | "form" | "frameset" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "hr" | "isindex" | "li" | "menu" | "noframes" | "noscript" | "ol" | "p" | "pre" | "script" | "table" | "tbody" | "td" | "tfoot" | "th" | "thead" | "tr" | "ul")
  def _HtmlBlockType

    _save = self.pos
    while true # choice
      _tmp = match_string("ADDRESS")
      break if _tmp
      self.pos = _save
      _tmp = match_string("BLOCKQUOTE")
      break if _tmp
      self.pos = _save
      _tmp = match_string("CENTER")
      break if _tmp
      self.pos = _save
      _tmp = match_string("DD")
      break if _tmp
      self.pos = _save
      _tmp = match_string("DIR")
      break if _tmp
      self.pos = _save
      _tmp = match_string("DIV")
      break if _tmp
      self.pos = _save
      _tmp = match_string("DL")
      break if _tmp
      self.pos = _save
      _tmp = match_string("DT")
      break if _tmp
      self.pos = _save
      _tmp = match_string("FIELDSET")
      break if _tmp
      self.pos = _save
      _tmp = match_string("FORM")
      break if _tmp
      self.pos = _save
      _tmp = match_string("FRAMESET")
      break if _tmp
      self.pos = _save
      _tmp = match_string("H1")
      break if _tmp
      self.pos = _save
      _tmp = match_string("H2")
      break if _tmp
      self.pos = _save
      _tmp = match_string("H3")
      break if _tmp
      self.pos = _save
      _tmp = match_string("H4")
      break if _tmp
      self.pos = _save
      _tmp = match_string("H5")
      break if _tmp
      self.pos = _save
      _tmp = match_string("H6")
      break if _tmp
      self.pos = _save
      _tmp = match_string("HR")
      break if _tmp
      self.pos = _save
      _tmp = match_string("ISINDEX")
      break if _tmp
      self.pos = _save
      _tmp = match_string("LI")
      break if _tmp
      self.pos = _save
      _tmp = match_string("MENU")
      break if _tmp
      self.pos = _save
      _tmp = match_string("NOFRAMES")
      break if _tmp
      self.pos = _save
      _tmp = match_string("NOSCRIPT")
      break if _tmp
      self.pos = _save
      _tmp = match_string("OL")
      break if _tmp
      self.pos = _save
      _tmp = match_string("P")
      break if _tmp
      self.pos = _save
      _tmp = match_string("PRE")
      break if _tmp
      self.pos = _save
      _tmp = match_string("SCRIPT")
      break if _tmp
      self.pos = _save
      _tmp = match_string("TABLE")
      break if _tmp
      self.pos = _save
      _tmp = match_string("TBODY")
      break if _tmp
      self.pos = _save
      _tmp = match_string("TD")
      break if _tmp
      self.pos = _save
      _tmp = match_string("TFOOT")
      break if _tmp
      self.pos = _save
      _tmp = match_string("TH")
      break if _tmp
      self.pos = _save
      _tmp = match_string("THEAD")
      break if _tmp
      self.pos = _save
      _tmp = match_string("TR")
      break if _tmp
      self.pos = _save
      _tmp = match_string("UL")
      break if _tmp
      self.pos = _save
      _tmp = match_string("address")
      break if _tmp
      self.pos = _save
      _tmp = match_string("blockquote")
      break if _tmp
      self.pos = _save
      _tmp = match_string("center")
      break if _tmp
      self.pos = _save
      _tmp = match_string("dd")
      break if _tmp
      self.pos = _save
      _tmp = match_string("dir")
      break if _tmp
      self.pos = _save
      _tmp = match_string("div")
      break if _tmp
      self.pos = _save
      _tmp = match_string("dl")
      break if _tmp
      self.pos = _save
      _tmp = match_string("dt")
      break if _tmp
      self.pos = _save
      _tmp = match_string("fieldset")
      break if _tmp
      self.pos = _save
      _tmp = match_string("form")
      break if _tmp
      self.pos = _save
      _tmp = match_string("frameset")
      break if _tmp
      self.pos = _save
      _tmp = match_string("h1")
      break if _tmp
      self.pos = _save
      _tmp = match_string("h2")
      break if _tmp
      self.pos = _save
      _tmp = match_string("h3")
      break if _tmp
      self.pos = _save
      _tmp = match_string("h4")
      break if _tmp
      self.pos = _save
      _tmp = match_string("h5")
      break if _tmp
      self.pos = _save
      _tmp = match_string("h6")
      break if _tmp
      self.pos = _save
      _tmp = match_string("hr")
      break if _tmp
      self.pos = _save
      _tmp = match_string("isindex")
      break if _tmp
      self.pos = _save
      _tmp = match_string("li")
      break if _tmp
      self.pos = _save
      _tmp = match_string("menu")
      break if _tmp
      self.pos = _save
      _tmp = match_string("noframes")
      break if _tmp
      self.pos = _save
      _tmp = match_string("noscript")
      break if _tmp
      self.pos = _save
      _tmp = match_string("ol")
      break if _tmp
      self.pos = _save
      _tmp = match_string("p")
      break if _tmp
      self.pos = _save
      _tmp = match_string("pre")
      break if _tmp
      self.pos = _save
      _tmp = match_string("script")
      break if _tmp
      self.pos = _save
      _tmp = match_string("table")
      break if _tmp
      self.pos = _save
      _tmp = match_string("tbody")
      break if _tmp
      self.pos = _save
      _tmp = match_string("td")
      break if _tmp
      self.pos = _save
      _tmp = match_string("tfoot")
      break if _tmp
      self.pos = _save
      _tmp = match_string("th")
      break if _tmp
      self.pos = _save
      _tmp = match_string("thead")
      break if _tmp
      self.pos = _save
      _tmp = match_string("tr")
      break if _tmp
      self.pos = _save
      _tmp = match_string("ul")
      break if _tmp
      self.pos = _save
      break
    end # end choice

    set_failed_rule :_HtmlBlockType unless _tmp
    return _tmp
  end

  # StyleOpen = "<" Spnl ("style" | "STYLE") Spnl HtmlAttribute* ">"
  def _StyleOpen

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("style")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("STYLE")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_StyleOpen unless _tmp
    return _tmp
  end

  # StyleClose = "<" Spnl "/" ("style" | "STYLE") Spnl ">"
  def _StyleClose

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("/")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = match_string("style")
        break if _tmp
        self.pos = _save1
        _tmp = match_string("STYLE")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_StyleClose unless _tmp
    return _tmp
  end

  # InStyleTags = StyleOpen (!StyleClose .)* StyleClose
  def _InStyleTags

    _save = self.pos
    while true # sequence
      _tmp = apply(:_StyleOpen)
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # sequence
          _save3 = self.pos
          _tmp = apply(:_StyleClose)
          _tmp = _tmp ? nil : true
          self.pos = _save3
          unless _tmp
            self.pos = _save2
            break
          end
          _tmp = get_byte
          unless _tmp
            self.pos = _save2
          end
          break
        end # end sequence

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_StyleClose)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_InStyleTags unless _tmp
    return _tmp
  end

  # StyleBlock = < InStyleTags > @BlankLine* { if css? then                     RDoc::Markup::Raw.new text                   end }
  def _StyleBlock

    _save = self.pos
    while true # sequence
      _text_start = self.pos
      _tmp = apply(:_InStyleTags)
      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = _BlankLine()
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  if css? then
                    RDoc::Markup::Raw.new text
                  end ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_StyleBlock unless _tmp
    return _tmp
  end

  # Inlines = (!@Endline Inline:i { i } | @Endline:c !(&{ github? } Ticks3 /[^`\n]*$/) &Inline { c })+:chunks @Endline? { chunks }
  def _Inlines

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _ary = []

      _save2 = self.pos
      while true # choice

        _save3 = self.pos
        while true # sequence
          _save4 = self.pos
          _tmp = _Endline()
          _tmp = _tmp ? nil : true
          self.pos = _save4
          unless _tmp
            self.pos = _save3
            break
          end
          _tmp = apply(:_Inline)
          i = @result
          unless _tmp
            self.pos = _save3
            break
          end
          @result = begin;  i ; end
          _tmp = true
          unless _tmp
            self.pos = _save3
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save2

        _save5 = self.pos
        while true # sequence
          _tmp = _Endline()
          c = @result
          unless _tmp
            self.pos = _save5
            break
          end
          _save6 = self.pos

          _save7 = self.pos
          while true # sequence
            _save8 = self.pos
            _tmp = begin;  github? ; end
            self.pos = _save8
            unless _tmp
              self.pos = _save7
              break
            end
            _tmp = apply(:_Ticks3)
            unless _tmp
              self.pos = _save7
              break
            end
            _tmp = scan(/\G(?-mix:[^`\n]*$)/)
            unless _tmp
              self.pos = _save7
            end
            break
          end # end sequence

          _tmp = _tmp ? nil : true
          self.pos = _save6
          unless _tmp
            self.pos = _save5
            break
          end
          _save9 = self.pos
          _tmp = apply(:_Inline)
          self.pos = _save9
          unless _tmp
            self.pos = _save5
            break
          end
          @result = begin;  c ; end
          _tmp = true
          unless _tmp
            self.pos = _save5
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save2
        break
      end # end choice

      if _tmp
        _ary << @result
        while true

          _save10 = self.pos
          while true # choice

            _save11 = self.pos
            while true # sequence
              _save12 = self.pos
              _tmp = _Endline()
              _tmp = _tmp ? nil : true
              self.pos = _save12
              unless _tmp
                self.pos = _save11
                break
              end
              _tmp = apply(:_Inline)
              i = @result
              unless _tmp
                self.pos = _save11
                break
              end
              @result = begin;  i ; end
              _tmp = true
              unless _tmp
                self.pos = _save11
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save10

            _save13 = self.pos
            while true # sequence
              _tmp = _Endline()
              c = @result
              unless _tmp
                self.pos = _save13
                break
              end
              _save14 = self.pos

              _save15 = self.pos
              while true # sequence
                _save16 = self.pos
                _tmp = begin;  github? ; end
                self.pos = _save16
                unless _tmp
                  self.pos = _save15
                  break
                end
                _tmp = apply(:_Ticks3)
                unless _tmp
                  self.pos = _save15
                  break
                end
                _tmp = scan(/\G(?-mix:[^`\n]*$)/)
                unless _tmp
                  self.pos = _save15
                end
                break
              end # end sequence

              _tmp = _tmp ? nil : true
              self.pos = _save14
              unless _tmp
                self.pos = _save13
                break
              end
              _save17 = self.pos
              _tmp = apply(:_Inline)
              self.pos = _save17
              unless _tmp
                self.pos = _save13
                break
              end
              @result = begin;  c ; end
              _tmp = true
              unless _tmp
                self.pos = _save13
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save10
            break
          end # end choice

          _ary << @result if _tmp
          break unless _tmp
        end
        _tmp = true
        @result = _ary
      else
        self.pos = _save1
      end
      chunks = @result
      unless _tmp
        self.pos = _save
        break
      end
      _save18 = self.pos
      _tmp = _Endline()
      unless _tmp
        _tmp = true
        self.pos = _save18
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  chunks ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Inlines unless _tmp
    return _tmp
  end

  # Inline = (Str | @Endline | UlOrStarLine | @Space | Strong | Emph | Strike | Image | Link | NoteReference | InlineNote | Code | RawHtml | Entity | EscapedChar | Symbol)
  def _Inline

    _save = self.pos
    while true # choice
      _tmp = apply(:_Str)
      break if _tmp
      self.pos = _save
      _tmp = _Endline()
      break if _tmp
      self.pos = _save
      _tmp = apply(:_UlOrStarLine)
      break if _tmp
      self.pos = _save
      _tmp = _Space()
      break if _tmp
      self.pos = _save
      _tmp = apply(:_Strong)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_Emph)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_Strike)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_Image)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_Link)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_NoteReference)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_InlineNote)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_Code)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_RawHtml)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_Entity)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_EscapedChar)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_Symbol)
      break if _tmp
      self.pos = _save
      break
    end # end choice

    set_failed_rule :_Inline unless _tmp
    return _tmp
  end

  # Space = @Spacechar+ { " " }
  def _Space

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = _Spacechar()
      if _tmp
        while true
          _tmp = _Spacechar()
          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save1
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  " " ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Space unless _tmp
    return _tmp
  end

  # Str = @StartList:a < @NormalChar+ > { a = text } (StrChunk:c { a << c })* { a }
  def _Str

    _save = self.pos
    while true # sequence
      _tmp = _StartList()
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      _text_start = self.pos
      _save1 = self.pos
      _tmp = _NormalChar()
      if _tmp
        while true
          _tmp = _NormalChar()
          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save1
      end
      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  a = text ; end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save3 = self.pos
        while true # sequence
          _tmp = apply(:_StrChunk)
          c = @result
          unless _tmp
            self.pos = _save3
            break
          end
          @result = begin;  a << c ; end
          _tmp = true
          unless _tmp
            self.pos = _save3
          end
          break
        end # end sequence

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  a ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Str unless _tmp
    return _tmp
  end

  # StrChunk = < (@NormalChar | /_+/ &Alphanumeric)+ > { text }
  def _StrChunk

    _save = self.pos
    while true # sequence
      _text_start = self.pos
      _save1 = self.pos

      _save2 = self.pos
      while true # choice
        _tmp = _NormalChar()
        break if _tmp
        self.pos = _save2

        _save3 = self.pos
        while true # sequence
          _tmp = scan(/\G(?-mix:_+)/)
          unless _tmp
            self.pos = _save3
            break
          end
          _save4 = self.pos
          _tmp = apply(:_Alphanumeric)
          self.pos = _save4
          unless _tmp
            self.pos = _save3
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save2
        break
      end # end choice

      if _tmp
        while true

          _save5 = self.pos
          while true # choice
            _tmp = _NormalChar()
            break if _tmp
            self.pos = _save5

            _save6 = self.pos
            while true # sequence
              _tmp = scan(/\G(?-mix:_+)/)
              unless _tmp
                self.pos = _save6
                break
              end
              _save7 = self.pos
              _tmp = apply(:_Alphanumeric)
              self.pos = _save7
              unless _tmp
                self.pos = _save6
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save5
            break
          end # end choice

          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save1
      end
      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  text ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_StrChunk unless _tmp
    return _tmp
  end

  # EscapedChar = "\\" !@Newline < /[:\\`|*_{}\[\]()#+.!><-]/ > { text }
  def _EscapedChar

    _save = self.pos
    while true # sequence
      _tmp = match_string("\\")
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos
      _tmp = _Newline()
      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _text_start = self.pos
      _tmp = scan(/\G(?-mix:[:\\`|*_{}\[\]()#+.!><-])/)
      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  text ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_EscapedChar unless _tmp
    return _tmp
  end

  # Entity = (HexEntity | DecEntity | CharEntity):a { a }
  def _Entity

    _save = self.pos
    while true # sequence

      _save1 = self.pos
      while true # choice
        _tmp = apply(:_HexEntity)
        break if _tmp
        self.pos = _save1
        _tmp = apply(:_DecEntity)
        break if _tmp
        self.pos = _save1
        _tmp = apply(:_CharEntity)
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  a ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Entity unless _tmp
    return _tmp
  end

  # Endline = (@LineBreak | @TerminalEndline | @NormalEndline)
  def _Endline

    _save = self.pos
    while true # choice
      _tmp = _LineBreak()
      break if _tmp
      self.pos = _save
      _tmp = _TerminalEndline()
      break if _tmp
      self.pos = _save
      _tmp = _NormalEndline()
      break if _tmp
      self.pos = _save
      break
    end # end choice

    set_failed_rule :_Endline unless _tmp
    return _tmp
  end

  # NormalEndline = @Sp @Newline !@BlankLine !">" !AtxStart !(Line /={1,}|-{1,}/ @Newline) { "\n" }
  def _NormalEndline

    _save = self.pos
    while true # sequence
      _tmp = _Sp()
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Newline()
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos
      _tmp = _BlankLine()
      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos
      _tmp = match_string(">")
      _tmp = _tmp ? nil : true
      self.pos = _save2
      unless _tmp
        self.pos = _save
        break
      end
      _save3 = self.pos
      _tmp = apply(:_AtxStart)
      _tmp = _tmp ? nil : true
      self.pos = _save3
      unless _tmp
        self.pos = _save
        break
      end
      _save4 = self.pos

      _save5 = self.pos
      while true # sequence
        _tmp = apply(:_Line)
        unless _tmp
          self.pos = _save5
          break
        end
        _tmp = scan(/\G(?-mix:={1,}|-{1,})/)
        unless _tmp
          self.pos = _save5
          break
        end
        _tmp = _Newline()
        unless _tmp
          self.pos = _save5
        end
        break
      end # end sequence

      _tmp = _tmp ? nil : true
      self.pos = _save4
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  "\n" ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_NormalEndline unless _tmp
    return _tmp
  end

  # TerminalEndline = @Sp @Newline @Eof
  def _TerminalEndline

    _save = self.pos
    while true # sequence
      _tmp = _Sp()
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Newline()
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Eof()
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_TerminalEndline unless _tmp
    return _tmp
  end

  # LineBreak = "  " @NormalEndline { RDoc::Markup::HardBreak.new }
  def _LineBreak

    _save = self.pos
    while true # sequence
      _tmp = match_string("  ")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _NormalEndline()
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  RDoc::Markup::HardBreak.new ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_LineBreak unless _tmp
    return _tmp
  end

  # Symbol = < @SpecialChar > { text }
  def _Symbol

    _save = self.pos
    while true # sequence
      _text_start = self.pos
      _tmp = _SpecialChar()
      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  text ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Symbol unless _tmp
    return _tmp
  end

  # UlOrStarLine = (UlLine | StarLine):a { a }
  def _UlOrStarLine

    _save = self.pos
    while true # sequence

      _save1 = self.pos
      while true # choice
        _tmp = apply(:_UlLine)
        break if _tmp
        self.pos = _save1
        _tmp = apply(:_StarLine)
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  a ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_UlOrStarLine unless _tmp
    return _tmp
  end

  # StarLine = (< /\*{4,}/ > { text } | < @Spacechar /\*+/ &@Spacechar > { text })
  def _StarLine

    _save = self.pos
    while true # choice

      _save1 = self.pos
      while true # sequence
        _text_start = self.pos
        _tmp = scan(/\G(?-mix:\*{4,})/)
        if _tmp
          text = get_text(_text_start)
        end
        unless _tmp
          self.pos = _save1
          break
        end
        @result = begin;  text ; end
        _tmp = true
        unless _tmp
          self.pos = _save1
        end
        break
      end # end sequence

      break if _tmp
      self.pos = _save

      _save2 = self.pos
      while true # sequence
        _text_start = self.pos

        _save3 = self.pos
        while true # sequence
          _tmp = _Spacechar()
          unless _tmp
            self.pos = _save3
            break
          end
          _tmp = scan(/\G(?-mix:\*+)/)
          unless _tmp
            self.pos = _save3
            break
          end
          _save4 = self.pos
          _tmp = _Spacechar()
          self.pos = _save4
          unless _tmp
            self.pos = _save3
          end
          break
        end # end sequence

        if _tmp
          text = get_text(_text_start)
        end
        unless _tmp
          self.pos = _save2
          break
        end
        @result = begin;  text ; end
        _tmp = true
        unless _tmp
          self.pos = _save2
        end
        break
      end # end sequence

      break if _tmp
      self.pos = _save
      break
    end # end choice

    set_failed_rule :_StarLine unless _tmp
    return _tmp
  end

  # UlLine = (< /_{4,}/ > { text } | < @Spacechar /_+/ &@Spacechar > { text })
  def _UlLine

    _save = self.pos
    while true # choice

      _save1 = self.pos
      while true # sequence
        _text_start = self.pos
        _tmp = scan(/\G(?-mix:_{4,})/)
        if _tmp
          text = get_text(_text_start)
        end
        unless _tmp
          self.pos = _save1
          break
        end
        @result = begin;  text ; end
        _tmp = true
        unless _tmp
          self.pos = _save1
        end
        break
      end # end sequence

      break if _tmp
      self.pos = _save

      _save2 = self.pos
      while true # sequence
        _text_start = self.pos

        _save3 = self.pos
        while true # sequence
          _tmp = _Spacechar()
          unless _tmp
            self.pos = _save3
            break
          end
          _tmp = scan(/\G(?-mix:_+)/)
          unless _tmp
            self.pos = _save3
            break
          end
          _save4 = self.pos
          _tmp = _Spacechar()
          self.pos = _save4
          unless _tmp
            self.pos = _save3
          end
          break
        end # end sequence

        if _tmp
          text = get_text(_text_start)
        end
        unless _tmp
          self.pos = _save2
          break
        end
        @result = begin;  text ; end
        _tmp = true
        unless _tmp
          self.pos = _save2
        end
        break
      end # end sequence

      break if _tmp
      self.pos = _save
      break
    end # end choice

    set_failed_rule :_UlLine unless _tmp
    return _tmp
  end

  # Emph = (EmphStar | EmphUl)
  def _Emph

    _save = self.pos
    while true # choice
      _tmp = apply(:_EmphStar)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_EmphUl)
      break if _tmp
      self.pos = _save
      break
    end # end choice

    set_failed_rule :_Emph unless _tmp
    return _tmp
  end

  # Whitespace = (@Spacechar | @Newline)
  def _Whitespace

    _save = self.pos
    while true # choice
      _tmp = _Spacechar()
      break if _tmp
      self.pos = _save
      _tmp = _Newline()
      break if _tmp
      self.pos = _save
      break
    end # end choice

    set_failed_rule :_Whitespace unless _tmp
    return _tmp
  end

  # EmphStar = "*" !@Whitespace @StartList:a (!"*" Inline:b { a << b } | StrongStar:b { a << b })+ "*" { emphasis a.join }
  def _EmphStar

    _save = self.pos
    while true # sequence
      _tmp = match_string("*")
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos
      _tmp = _Whitespace()
      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _StartList()
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos

      _save3 = self.pos
      while true # choice

        _save4 = self.pos
        while true # sequence
          _save5 = self.pos
          _tmp = match_string("*")
          _tmp = _tmp ? nil : true
          self.pos = _save5
          unless _tmp
            self.pos = _save4
            break
          end
          _tmp = apply(:_Inline)
          b = @result
          unless _tmp
            self.pos = _save4
            break
          end
          @result = begin;  a << b ; end
          _tmp = true
          unless _tmp
            self.pos = _save4
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save3

        _save6 = self.pos
        while true # sequence
          _tmp = apply(:_StrongStar)
          b = @result
          unless _tmp
            self.pos = _save6
            break
          end
          @result = begin;  a << b ; end
          _tmp = true
          unless _tmp
            self.pos = _save6
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save3
        break
      end # end choice

      if _tmp
        while true

          _save7 = self.pos
          while true # choice

            _save8 = self.pos
            while true # sequence
              _save9 = self.pos
              _tmp = match_string("*")
              _tmp = _tmp ? nil : true
              self.pos = _save9
              unless _tmp
                self.pos = _save8
                break
              end
              _tmp = apply(:_Inline)
              b = @result
              unless _tmp
                self.pos = _save8
                break
              end
              @result = begin;  a << b ; end
              _tmp = true
              unless _tmp
                self.pos = _save8
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save7

            _save10 = self.pos
            while true # sequence
              _tmp = apply(:_StrongStar)
              b = @result
              unless _tmp
                self.pos = _save10
                break
              end
              @result = begin;  a << b ; end
              _tmp = true
              unless _tmp
                self.pos = _save10
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save7
            break
          end # end choice

          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save2
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("*")
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  emphasis a.join ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_EmphStar unless _tmp
    return _tmp
  end

  # EmphUl = "_" !@Whitespace @StartList:a (!"_" Inline:b { a << b } | StrongUl:b { a << b })+ "_" { emphasis a.join }
  def _EmphUl

    _save = self.pos
    while true # sequence
      _tmp = match_string("_")
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos
      _tmp = _Whitespace()
      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _StartList()
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos

      _save3 = self.pos
      while true # choice

        _save4 = self.pos
        while true # sequence
          _save5 = self.pos
          _tmp = match_string("_")
          _tmp = _tmp ? nil : true
          self.pos = _save5
          unless _tmp
            self.pos = _save4
            break
          end
          _tmp = apply(:_Inline)
          b = @result
          unless _tmp
            self.pos = _save4
            break
          end
          @result = begin;  a << b ; end
          _tmp = true
          unless _tmp
            self.pos = _save4
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save3

        _save6 = self.pos
        while true # sequence
          _tmp = apply(:_StrongUl)
          b = @result
          unless _tmp
            self.pos = _save6
            break
          end
          @result = begin;  a << b ; end
          _tmp = true
          unless _tmp
            self.pos = _save6
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save3
        break
      end # end choice

      if _tmp
        while true

          _save7 = self.pos
          while true # choice

            _save8 = self.pos
            while true # sequence
              _save9 = self.pos
              _tmp = match_string("_")
              _tmp = _tmp ? nil : true
              self.pos = _save9
              unless _tmp
                self.pos = _save8
                break
              end
              _tmp = apply(:_Inline)
              b = @result
              unless _tmp
                self.pos = _save8
                break
              end
              @result = begin;  a << b ; end
              _tmp = true
              unless _tmp
                self.pos = _save8
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save7

            _save10 = self.pos
            while true # sequence
              _tmp = apply(:_StrongUl)
              b = @result
              unless _tmp
                self.pos = _save10
                break
              end
              @result = begin;  a << b ; end
              _tmp = true
              unless _tmp
                self.pos = _save10
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save7
            break
          end # end choice

          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save2
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("_")
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  emphasis a.join ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_EmphUl unless _tmp
    return _tmp
  end

  # Strong = (StrongStar | StrongUl)
  def _Strong

    _save = self.pos
    while true # choice
      _tmp = apply(:_StrongStar)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_StrongUl)
      break if _tmp
      self.pos = _save
      break
    end # end choice

    set_failed_rule :_Strong unless _tmp
    return _tmp
  end

  # StrongStar = "**" !@Whitespace @StartList:a (!"**" Inline:b { a << b })+ "**" { strong a.join }
  def _StrongStar

    _save = self.pos
    while true # sequence
      _tmp = match_string("**")
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos
      _tmp = _Whitespace()
      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _StartList()
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos

      _save3 = self.pos
      while true # sequence
        _save4 = self.pos
        _tmp = match_string("**")
        _tmp = _tmp ? nil : true
        self.pos = _save4
        unless _tmp
          self.pos = _save3
          break
        end
        _tmp = apply(:_Inline)
        b = @result
        unless _tmp
          self.pos = _save3
          break
        end
        @result = begin;  a << b ; end
        _tmp = true
        unless _tmp
          self.pos = _save3
        end
        break
      end # end sequence

      if _tmp
        while true

          _save5 = self.pos
          while true # sequence
            _save6 = self.pos
            _tmp = match_string("**")
            _tmp = _tmp ? nil : true
            self.pos = _save6
            unless _tmp
              self.pos = _save5
              break
            end
            _tmp = apply(:_Inline)
            b = @result
            unless _tmp
              self.pos = _save5
              break
            end
            @result = begin;  a << b ; end
            _tmp = true
            unless _tmp
              self.pos = _save5
            end
            break
          end # end sequence

          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save2
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("**")
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  strong a.join ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_StrongStar unless _tmp
    return _tmp
  end

  # StrongUl = "__" !@Whitespace @StartList:a (!"__" Inline:b { a << b })+ "__" { strong a.join }
  def _StrongUl

    _save = self.pos
    while true # sequence
      _tmp = match_string("__")
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos
      _tmp = _Whitespace()
      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _StartList()
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos

      _save3 = self.pos
      while true # sequence
        _save4 = self.pos
        _tmp = match_string("__")
        _tmp = _tmp ? nil : true
        self.pos = _save4
        unless _tmp
          self.pos = _save3
          break
        end
        _tmp = apply(:_Inline)
        b = @result
        unless _tmp
          self.pos = _save3
          break
        end
        @result = begin;  a << b ; end
        _tmp = true
        unless _tmp
          self.pos = _save3
        end
        break
      end # end sequence

      if _tmp
        while true

          _save5 = self.pos
          while true # sequence
            _save6 = self.pos
            _tmp = match_string("__")
            _tmp = _tmp ? nil : true
            self.pos = _save6
            unless _tmp
              self.pos = _save5
              break
            end
            _tmp = apply(:_Inline)
            b = @result
            unless _tmp
              self.pos = _save5
              break
            end
            @result = begin;  a << b ; end
            _tmp = true
            unless _tmp
              self.pos = _save5
            end
            break
          end # end sequence

          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save2
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("__")
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  strong a.join ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_StrongUl unless _tmp
    return _tmp
  end

  # Strike = &{ strike? } "~~" !@Whitespace @StartList:a (!"~~" Inline:b { a << b })+ "~~" { strike a.join }
  def _Strike

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = begin;  strike? ; end
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("~~")
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos
      _tmp = _Whitespace()
      _tmp = _tmp ? nil : true
      self.pos = _save2
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _StartList()
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      _save3 = self.pos

      _save4 = self.pos
      while true # sequence
        _save5 = self.pos
        _tmp = match_string("~~")
        _tmp = _tmp ? nil : true
        self.pos = _save5
        unless _tmp
          self.pos = _save4
          break
        end
        _tmp = apply(:_Inline)
        b = @result
        unless _tmp
          self.pos = _save4
          break
        end
        @result = begin;  a << b ; end
        _tmp = true
        unless _tmp
          self.pos = _save4
        end
        break
      end # end sequence

      if _tmp
        while true

          _save6 = self.pos
          while true # sequence
            _save7 = self.pos
            _tmp = match_string("~~")
            _tmp = _tmp ? nil : true
            self.pos = _save7
            unless _tmp
              self.pos = _save6
              break
            end
            _tmp = apply(:_Inline)
            b = @result
            unless _tmp
              self.pos = _save6
              break
            end
            @result = begin;  a << b ; end
            _tmp = true
            unless _tmp
              self.pos = _save6
            end
            break
          end # end sequence

          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save3
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("~~")
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  strike a.join ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Strike unless _tmp
    return _tmp
  end

  # Image = "!" (ExplicitLink | ReferenceLink):a { "rdoc-image:#{a[/\[(.*)\]/, 1]}" }
  def _Image

    _save = self.pos
    while true # sequence
      _tmp = match_string("!")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice
        _tmp = apply(:_ExplicitLink)
        break if _tmp
        self.pos = _save1
        _tmp = apply(:_ReferenceLink)
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  "rdoc-image:#{a[/\[(.*)\]/, 1]}" ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Image unless _tmp
    return _tmp
  end

  # Link = (ExplicitLink | ReferenceLink | AutoLink)
  def _Link

    _save = self.pos
    while true # choice
      _tmp = apply(:_ExplicitLink)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_ReferenceLink)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_AutoLink)
      break if _tmp
      self.pos = _save
      break
    end # end choice

    set_failed_rule :_Link unless _tmp
    return _tmp
  end

  # ReferenceLink = (ReferenceLinkDouble | ReferenceLinkSingle)
  def _ReferenceLink

    _save = self.pos
    while true # choice
      _tmp = apply(:_ReferenceLinkDouble)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_ReferenceLinkSingle)
      break if _tmp
      self.pos = _save
      break
    end # end choice

    set_failed_rule :_ReferenceLink unless _tmp
    return _tmp
  end

  # ReferenceLinkDouble = Label:content < Spnl > !"[]" Label:label { link_to content, label, text }
  def _ReferenceLinkDouble

    _save = self.pos
    while true # sequence
      _tmp = apply(:_Label)
      content = @result
      unless _tmp
        self.pos = _save
        break
      end
      _text_start = self.pos
      _tmp = apply(:_Spnl)
      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos
      _tmp = match_string("[]")
      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Label)
      label = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  link_to content, label, text ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_ReferenceLinkDouble unless _tmp
    return _tmp
  end

  # ReferenceLinkSingle = Label:content < (Spnl "[]")? > { link_to content, content, text }
  def _ReferenceLinkSingle

    _save = self.pos
    while true # sequence
      _tmp = apply(:_Label)
      content = @result
      unless _tmp
        self.pos = _save
        break
      end
      _text_start = self.pos
      _save1 = self.pos

      _save2 = self.pos
      while true # sequence
        _tmp = apply(:_Spnl)
        unless _tmp
          self.pos = _save2
          break
        end
        _tmp = match_string("[]")
        unless _tmp
          self.pos = _save2
        end
        break
      end # end sequence

      unless _tmp
        _tmp = true
        self.pos = _save1
      end
      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  link_to content, content, text ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_ReferenceLinkSingle unless _tmp
    return _tmp
  end

  # ExplicitLink = Label:l "(" @Sp Source:s Spnl Title @Sp ")" { "{#{l}}[#{s}]" }
  def _ExplicitLink

    _save = self.pos
    while true # sequence
      _tmp = apply(:_Label)
      l = @result
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("(")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Sp()
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Source)
      s = @result
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Title)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Sp()
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(")")
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  "{#{l}}[#{s}]" ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_ExplicitLink unless _tmp
    return _tmp
  end

  # Source = ("<" < SourceContents > ">" | < SourceContents >) { text }
  def _Source

    _save = self.pos
    while true # sequence

      _save1 = self.pos
      while true # choice

        _save2 = self.pos
        while true # sequence
          _tmp = match_string("<")
          unless _tmp
            self.pos = _save2
            break
          end
          _text_start = self.pos
          _tmp = apply(:_SourceContents)
          if _tmp
            text = get_text(_text_start)
          end
          unless _tmp
            self.pos = _save2
            break
          end
          _tmp = match_string(">")
          unless _tmp
            self.pos = _save2
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save1
        _text_start = self.pos
        _tmp = apply(:_SourceContents)
        if _tmp
          text = get_text(_text_start)
        end
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  text ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Source unless _tmp
    return _tmp
  end

  # SourceContents = ((!"(" !")" !">" Nonspacechar)+ | "(" SourceContents ")")*
  def _SourceContents
    while true

      _save1 = self.pos
      while true # choice
        _save2 = self.pos

        _save3 = self.pos
        while true # sequence
          _save4 = self.pos
          _tmp = match_string("(")
          _tmp = _tmp ? nil : true
          self.pos = _save4
          unless _tmp
            self.pos = _save3
            break
          end
          _save5 = self.pos
          _tmp = match_string(")")
          _tmp = _tmp ? nil : true
          self.pos = _save5
          unless _tmp
            self.pos = _save3
            break
          end
          _save6 = self.pos
          _tmp = match_string(">")
          _tmp = _tmp ? nil : true
          self.pos = _save6
          unless _tmp
            self.pos = _save3
            break
          end
          _tmp = apply(:_Nonspacechar)
          unless _tmp
            self.pos = _save3
          end
          break
        end # end sequence

        if _tmp
          while true

            _save7 = self.pos
            while true # sequence
              _save8 = self.pos
              _tmp = match_string("(")
              _tmp = _tmp ? nil : true
              self.pos = _save8
              unless _tmp
                self.pos = _save7
                break
              end
              _save9 = self.pos
              _tmp = match_string(")")
              _tmp = _tmp ? nil : true
              self.pos = _save9
              unless _tmp
                self.pos = _save7
                break
              end
              _save10 = self.pos
              _tmp = match_string(">")
              _tmp = _tmp ? nil : true
              self.pos = _save10
              unless _tmp
                self.pos = _save7
                break
              end
              _tmp = apply(:_Nonspacechar)
              unless _tmp
                self.pos = _save7
              end
              break
            end # end sequence

            break unless _tmp
          end
          _tmp = true
        else
          self.pos = _save2
        end
        break if _tmp
        self.pos = _save1

        _save11 = self.pos
        while true # sequence
          _tmp = match_string("(")
          unless _tmp
            self.pos = _save11
            break
          end
          _tmp = apply(:_SourceContents)
          unless _tmp
            self.pos = _save11
            break
          end
          _tmp = match_string(")")
          unless _tmp
            self.pos = _save11
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save1
        break
      end # end choice

      break unless _tmp
    end
    _tmp = true
    set_failed_rule :_SourceContents unless _tmp
    return _tmp
  end

  # Title = (TitleSingle | TitleDouble | ""):a { a }
  def _Title

    _save = self.pos
    while true # sequence

      _save1 = self.pos
      while true # choice
        _tmp = apply(:_TitleSingle)
        break if _tmp
        self.pos = _save1
        _tmp = apply(:_TitleDouble)
        break if _tmp
        self.pos = _save1
        _tmp = match_string("")
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  a ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Title unless _tmp
    return _tmp
  end

  # TitleSingle = "'" (!("'" @Sp (")" | @Newline)) .)* "'"
  def _TitleSingle

    _save = self.pos
    while true # sequence
      _tmp = match_string("'")
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # sequence
          _save3 = self.pos

          _save4 = self.pos
          while true # sequence
            _tmp = match_string("'")
            unless _tmp
              self.pos = _save4
              break
            end
            _tmp = _Sp()
            unless _tmp
              self.pos = _save4
              break
            end

            _save5 = self.pos
            while true # choice
              _tmp = match_string(")")
              break if _tmp
              self.pos = _save5
              _tmp = _Newline()
              break if _tmp
              self.pos = _save5
              break
            end # end choice

            unless _tmp
              self.pos = _save4
            end
            break
          end # end sequence

          _tmp = _tmp ? nil : true
          self.pos = _save3
          unless _tmp
            self.pos = _save2
            break
          end
          _tmp = get_byte
          unless _tmp
            self.pos = _save2
          end
          break
        end # end sequence

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("'")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_TitleSingle unless _tmp
    return _tmp
  end

  # TitleDouble = "\"" (!("\"" @Sp (")" | @Newline)) .)* "\""
  def _TitleDouble

    _save = self.pos
    while true # sequence
      _tmp = match_string("\"")
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # sequence
          _save3 = self.pos

          _save4 = self.pos
          while true # sequence
            _tmp = match_string("\"")
            unless _tmp
              self.pos = _save4
              break
            end
            _tmp = _Sp()
            unless _tmp
              self.pos = _save4
              break
            end

            _save5 = self.pos
            while true # choice
              _tmp = match_string(")")
              break if _tmp
              self.pos = _save5
              _tmp = _Newline()
              break if _tmp
              self.pos = _save5
              break
            end # end choice

            unless _tmp
              self.pos = _save4
            end
            break
          end # end sequence

          _tmp = _tmp ? nil : true
          self.pos = _save3
          unless _tmp
            self.pos = _save2
            break
          end
          _tmp = get_byte
          unless _tmp
            self.pos = _save2
          end
          break
        end # end sequence

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("\"")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_TitleDouble unless _tmp
    return _tmp
  end

  # AutoLink = (AutoLinkUrl | AutoLinkEmail)
  def _AutoLink

    _save = self.pos
    while true # choice
      _tmp = apply(:_AutoLinkUrl)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_AutoLinkEmail)
      break if _tmp
      self.pos = _save
      break
    end # end choice

    set_failed_rule :_AutoLink unless _tmp
    return _tmp
  end

  # AutoLinkUrl = "<" < /[A-Za-z]+/ "://" (!@Newline !">" .)+ > ">" { text }
  def _AutoLinkUrl

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _text_start = self.pos

      _save1 = self.pos
      while true # sequence
        _tmp = scan(/\G(?-mix:[A-Za-z]+)/)
        unless _tmp
          self.pos = _save1
          break
        end
        _tmp = match_string("://")
        unless _tmp
          self.pos = _save1
          break
        end
        _save2 = self.pos

        _save3 = self.pos
        while true # sequence
          _save4 = self.pos
          _tmp = _Newline()
          _tmp = _tmp ? nil : true
          self.pos = _save4
          unless _tmp
            self.pos = _save3
            break
          end
          _save5 = self.pos
          _tmp = match_string(">")
          _tmp = _tmp ? nil : true
          self.pos = _save5
          unless _tmp
            self.pos = _save3
            break
          end
          _tmp = get_byte
          unless _tmp
            self.pos = _save3
          end
          break
        end # end sequence

        if _tmp
          while true

            _save6 = self.pos
            while true # sequence
              _save7 = self.pos
              _tmp = _Newline()
              _tmp = _tmp ? nil : true
              self.pos = _save7
              unless _tmp
                self.pos = _save6
                break
              end
              _save8 = self.pos
              _tmp = match_string(">")
              _tmp = _tmp ? nil : true
              self.pos = _save8
              unless _tmp
                self.pos = _save6
                break
              end
              _tmp = get_byte
              unless _tmp
                self.pos = _save6
              end
              break
            end # end sequence

            break unless _tmp
          end
          _tmp = true
        else
          self.pos = _save2
        end
        unless _tmp
          self.pos = _save1
        end
        break
      end # end sequence

      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  text ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_AutoLinkUrl unless _tmp
    return _tmp
  end

  # AutoLinkEmail = "<" "mailto:"? < /[\w+.\/!%~$-]+/i "@" (!@Newline !">" .)+ > ">" { "mailto:#{text}" }
  def _AutoLinkEmail

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos
      _tmp = match_string("mailto:")
      unless _tmp
        _tmp = true
        self.pos = _save1
      end
      unless _tmp
        self.pos = _save
        break
      end
      _text_start = self.pos

      _save2 = self.pos
      while true # sequence
        _tmp = scan(/\G(?i-mx:[\w+.\/!%~$-]+)/)
        unless _tmp
          self.pos = _save2
          break
        end
        _tmp = match_string("@")
        unless _tmp
          self.pos = _save2
          break
        end
        _save3 = self.pos

        _save4 = self.pos
        while true # sequence
          _save5 = self.pos
          _tmp = _Newline()
          _tmp = _tmp ? nil : true
          self.pos = _save5
          unless _tmp
            self.pos = _save4
            break
          end
          _save6 = self.pos
          _tmp = match_string(">")
          _tmp = _tmp ? nil : true
          self.pos = _save6
          unless _tmp
            self.pos = _save4
            break
          end
          _tmp = get_byte
          unless _tmp
            self.pos = _save4
          end
          break
        end # end sequence

        if _tmp
          while true

            _save7 = self.pos
            while true # sequence
              _save8 = self.pos
              _tmp = _Newline()
              _tmp = _tmp ? nil : true
              self.pos = _save8
              unless _tmp
                self.pos = _save7
                break
              end
              _save9 = self.pos
              _tmp = match_string(">")
              _tmp = _tmp ? nil : true
              self.pos = _save9
              unless _tmp
                self.pos = _save7
                break
              end
              _tmp = get_byte
              unless _tmp
                self.pos = _save7
              end
              break
            end # end sequence

            break unless _tmp
          end
          _tmp = true
        else
          self.pos = _save3
        end
        unless _tmp
          self.pos = _save2
        end
        break
      end # end sequence

      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  "mailto:#{text}" ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_AutoLinkEmail unless _tmp
    return _tmp
  end

  # Reference = @NonindentSpace !"[]" Label:label ":" Spnl RefSrc:link RefTitle @BlankLine+ { # TODO use title               reference label, link               nil             }
  def _Reference

    _save = self.pos
    while true # sequence
      _tmp = _NonindentSpace()
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos
      _tmp = match_string("[]")
      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Label)
      label = @result
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(":")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_RefSrc)
      link = @result
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_RefTitle)
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos
      _tmp = _BlankLine()
      if _tmp
        while true
          _tmp = _BlankLine()
          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save2
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  # TODO use title
              reference label, link
              nil
            ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Reference unless _tmp
    return _tmp
  end

  # Label = "[" (!"^" &{ notes? } | &. &{ !notes? }) @StartList:a (!"]" Inline:l { a << l })* "]" { a.join.gsub(/\s+/, ' ') }
  def _Label

    _save = self.pos
    while true # sequence
      _tmp = match_string("[")
      unless _tmp
        self.pos = _save
        break
      end

      _save1 = self.pos
      while true # choice

        _save2 = self.pos
        while true # sequence
          _save3 = self.pos
          _tmp = match_string("^")
          _tmp = _tmp ? nil : true
          self.pos = _save3
          unless _tmp
            self.pos = _save2
            break
          end
          _save4 = self.pos
          _tmp = begin;  notes? ; end
          self.pos = _save4
          unless _tmp
            self.pos = _save2
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save1

        _save5 = self.pos
        while true # sequence
          _save6 = self.pos
          _tmp = get_byte
          self.pos = _save6
          unless _tmp
            self.pos = _save5
            break
          end
          _save7 = self.pos
          _tmp = begin;  !notes? ; end
          self.pos = _save7
          unless _tmp
            self.pos = _save5
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _StartList()
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save9 = self.pos
        while true # sequence
          _save10 = self.pos
          _tmp = match_string("]")
          _tmp = _tmp ? nil : true
          self.pos = _save10
          unless _tmp
            self.pos = _save9
            break
          end
          _tmp = apply(:_Inline)
          l = @result
          unless _tmp
            self.pos = _save9
            break
          end
          @result = begin;  a << l ; end
          _tmp = true
          unless _tmp
            self.pos = _save9
          end
          break
        end # end sequence

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("]")
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  a.join.gsub(/\s+/, ' ') ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Label unless _tmp
    return _tmp
  end

  # RefSrc = < Nonspacechar+ > { text }
  def _RefSrc

    _save = self.pos
    while true # sequence
      _text_start = self.pos
      _save1 = self.pos
      _tmp = apply(:_Nonspacechar)
      if _tmp
        while true
          _tmp = apply(:_Nonspacechar)
          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save1
      end
      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  text ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_RefSrc unless _tmp
    return _tmp
  end

  # RefTitle = (RefTitleSingle | RefTitleDouble | RefTitleParens | EmptyTitle)
  def _RefTitle

    _save = self.pos
    while true # choice
      _tmp = apply(:_RefTitleSingle)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_RefTitleDouble)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_RefTitleParens)
      break if _tmp
      self.pos = _save
      _tmp = apply(:_EmptyTitle)
      break if _tmp
      self.pos = _save
      break
    end # end choice

    set_failed_rule :_RefTitle unless _tmp
    return _tmp
  end

  # EmptyTitle = ""
  def _EmptyTitle
    _tmp = match_string("")
    set_failed_rule :_EmptyTitle unless _tmp
    return _tmp
  end

  # RefTitleSingle = Spnl "'" < (!("'" @Sp @Newline | @Newline) .)* > "'" { text }
  def _RefTitleSingle

    _save = self.pos
    while true # sequence
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("'")
      unless _tmp
        self.pos = _save
        break
      end
      _text_start = self.pos
      while true

        _save2 = self.pos
        while true # sequence
          _save3 = self.pos

          _save4 = self.pos
          while true # choice

            _save5 = self.pos
            while true # sequence
              _tmp = match_string("'")
              unless _tmp
                self.pos = _save5
                break
              end
              _tmp = _Sp()
              unless _tmp
                self.pos = _save5
                break
              end
              _tmp = _Newline()
              unless _tmp
                self.pos = _save5
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save4
            _tmp = _Newline()
            break if _tmp
            self.pos = _save4
            break
          end # end choice

          _tmp = _tmp ? nil : true
          self.pos = _save3
          unless _tmp
            self.pos = _save2
            break
          end
          _tmp = get_byte
          unless _tmp
            self.pos = _save2
          end
          break
        end # end sequence

        break unless _tmp
      end
      _tmp = true
      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("'")
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  text ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_RefTitleSingle unless _tmp
    return _tmp
  end

  # RefTitleDouble = Spnl "\"" < (!("\"" @Sp @Newline | @Newline) .)* > "\"" { text }
  def _RefTitleDouble

    _save = self.pos
    while true # sequence
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("\"")
      unless _tmp
        self.pos = _save
        break
      end
      _text_start = self.pos
      while true

        _save2 = self.pos
        while true # sequence
          _save3 = self.pos

          _save4 = self.pos
          while true # choice

            _save5 = self.pos
            while true # sequence
              _tmp = match_string("\"")
              unless _tmp
                self.pos = _save5
                break
              end
              _tmp = _Sp()
              unless _tmp
                self.pos = _save5
                break
              end
              _tmp = _Newline()
              unless _tmp
                self.pos = _save5
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save4
            _tmp = _Newline()
            break if _tmp
            self.pos = _save4
            break
          end # end choice

          _tmp = _tmp ? nil : true
          self.pos = _save3
          unless _tmp
            self.pos = _save2
            break
          end
          _tmp = get_byte
          unless _tmp
            self.pos = _save2
          end
          break
        end # end sequence

        break unless _tmp
      end
      _tmp = true
      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("\"")
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  text ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_RefTitleDouble unless _tmp
    return _tmp
  end

  # RefTitleParens = Spnl "(" < (!(")" @Sp @Newline | @Newline) .)* > ")" { text }
  def _RefTitleParens

    _save = self.pos
    while true # sequence
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("(")
      unless _tmp
        self.pos = _save
        break
      end
      _text_start = self.pos
      while true

        _save2 = self.pos
        while true # sequence
          _save3 = self.pos

          _save4 = self.pos
          while true # choice

            _save5 = self.pos
            while true # sequence
              _tmp = match_string(")")
              unless _tmp
                self.pos = _save5
                break
              end
              _tmp = _Sp()
              unless _tmp
                self.pos = _save5
                break
              end
              _tmp = _Newline()
              unless _tmp
                self.pos = _save5
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save4
            _tmp = _Newline()
            break if _tmp
            self.pos = _save4
            break
          end # end choice

          _tmp = _tmp ? nil : true
          self.pos = _save3
          unless _tmp
            self.pos = _save2
            break
          end
          _tmp = get_byte
          unless _tmp
            self.pos = _save2
          end
          break
        end # end sequence

        break unless _tmp
      end
      _tmp = true
      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(")")
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  text ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_RefTitleParens unless _tmp
    return _tmp
  end

  # References = (Reference | SkipBlock)*
  def _References
    while true

      _save1 = self.pos
      while true # choice
        _tmp = apply(:_Reference)
        break if _tmp
        self.pos = _save1
        _tmp = apply(:_SkipBlock)
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      break unless _tmp
    end
    _tmp = true
    set_failed_rule :_References unless _tmp
    return _tmp
  end

  # Ticks1 = "`" !"`"
  def _Ticks1

    _save = self.pos
    while true # sequence
      _tmp = match_string("`")
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos
      _tmp = match_string("`")
      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Ticks1 unless _tmp
    return _tmp
  end

  # Ticks2 = "``" !"`"
  def _Ticks2

    _save = self.pos
    while true # sequence
      _tmp = match_string("``")
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos
      _tmp = match_string("`")
      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Ticks2 unless _tmp
    return _tmp
  end

  # Ticks3 = "```" !"`"
  def _Ticks3

    _save = self.pos
    while true # sequence
      _tmp = match_string("```")
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos
      _tmp = match_string("`")
      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Ticks3 unless _tmp
    return _tmp
  end

  # Ticks4 = "````" !"`"
  def _Ticks4

    _save = self.pos
    while true # sequence
      _tmp = match_string("````")
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos
      _tmp = match_string("`")
      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Ticks4 unless _tmp
    return _tmp
  end

  # Ticks5 = "`````" !"`"
  def _Ticks5

    _save = self.pos
    while true # sequence
      _tmp = match_string("`````")
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos
      _tmp = match_string("`")
      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Ticks5 unless _tmp
    return _tmp
  end

  # Code = (Ticks1 @Sp < ((!"`" Nonspacechar)+ | !Ticks1 /`+/ | !(@Sp Ticks1) (@Spacechar | @Newline !@BlankLine))+ > @Sp Ticks1 | Ticks2 @Sp < ((!"`" Nonspacechar)+ | !Ticks2 /`+/ | !(@Sp Ticks2) (@Spacechar | @Newline !@BlankLine))+ > @Sp Ticks2 | Ticks3 @Sp < ((!"`" Nonspacechar)+ | !Ticks3 /`+/ | !(@Sp Ticks3) (@Spacechar | @Newline !@BlankLine))+ > @Sp Ticks3 | Ticks4 @Sp < ((!"`" Nonspacechar)+ | !Ticks4 /`+/ | !(@Sp Ticks4) (@Spacechar | @Newline !@BlankLine))+ > @Sp Ticks4 | Ticks5 @Sp < ((!"`" Nonspacechar)+ | !Ticks5 /`+/ | !(@Sp Ticks5) (@Spacechar | @Newline !@BlankLine))+ > @Sp Ticks5) { "<code>#{text}</code>" }
  def _Code

    _save = self.pos
    while true # sequence

      _save1 = self.pos
      while true # choice

        _save2 = self.pos
        while true # sequence
          _tmp = apply(:_Ticks1)
          unless _tmp
            self.pos = _save2
            break
          end
          _tmp = _Sp()
          unless _tmp
            self.pos = _save2
            break
          end
          _text_start = self.pos
          _save3 = self.pos

          _save4 = self.pos
          while true # choice
            _save5 = self.pos

            _save6 = self.pos
            while true # sequence
              _save7 = self.pos
              _tmp = match_string("`")
              _tmp = _tmp ? nil : true
              self.pos = _save7
              unless _tmp
                self.pos = _save6
                break
              end
              _tmp = apply(:_Nonspacechar)
              unless _tmp
                self.pos = _save6
              end
              break
            end # end sequence

            if _tmp
              while true

                _save8 = self.pos
                while true # sequence
                  _save9 = self.pos
                  _tmp = match_string("`")
                  _tmp = _tmp ? nil : true
                  self.pos = _save9
                  unless _tmp
                    self.pos = _save8
                    break
                  end
                  _tmp = apply(:_Nonspacechar)
                  unless _tmp
                    self.pos = _save8
                  end
                  break
                end # end sequence

                break unless _tmp
              end
              _tmp = true
            else
              self.pos = _save5
            end
            break if _tmp
            self.pos = _save4

            _save10 = self.pos
            while true # sequence
              _save11 = self.pos
              _tmp = apply(:_Ticks1)
              _tmp = _tmp ? nil : true
              self.pos = _save11
              unless _tmp
                self.pos = _save10
                break
              end
              _tmp = scan(/\G(?-mix:`+)/)
              unless _tmp
                self.pos = _save10
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save4

            _save12 = self.pos
            while true # sequence
              _save13 = self.pos

              _save14 = self.pos
              while true # sequence
                _tmp = _Sp()
                unless _tmp
                  self.pos = _save14
                  break
                end
                _tmp = apply(:_Ticks1)
                unless _tmp
                  self.pos = _save14
                end
                break
              end # end sequence

              _tmp = _tmp ? nil : true
              self.pos = _save13
              unless _tmp
                self.pos = _save12
                break
              end

              _save15 = self.pos
              while true # choice
                _tmp = _Spacechar()
                break if _tmp
                self.pos = _save15

                _save16 = self.pos
                while true # sequence
                  _tmp = _Newline()
                  unless _tmp
                    self.pos = _save16
                    break
                  end
                  _save17 = self.pos
                  _tmp = _BlankLine()
                  _tmp = _tmp ? nil : true
                  self.pos = _save17
                  unless _tmp
                    self.pos = _save16
                  end
                  break
                end # end sequence

                break if _tmp
                self.pos = _save15
                break
              end # end choice

              unless _tmp
                self.pos = _save12
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save4
            break
          end # end choice

          if _tmp
            while true

              _save18 = self.pos
              while true # choice
                _save19 = self.pos

                _save20 = self.pos
                while true # sequence
                  _save21 = self.pos
                  _tmp = match_string("`")
                  _tmp = _tmp ? nil : true
                  self.pos = _save21
                  unless _tmp
                    self.pos = _save20
                    break
                  end
                  _tmp = apply(:_Nonspacechar)
                  unless _tmp
                    self.pos = _save20
                  end
                  break
                end # end sequence

                if _tmp
                  while true

                    _save22 = self.pos
                    while true # sequence
                      _save23 = self.pos
                      _tmp = match_string("`")
                      _tmp = _tmp ? nil : true
                      self.pos = _save23
                      unless _tmp
                        self.pos = _save22
                        break
                      end
                      _tmp = apply(:_Nonspacechar)
                      unless _tmp
                        self.pos = _save22
                      end
                      break
                    end # end sequence

                    break unless _tmp
                  end
                  _tmp = true
                else
                  self.pos = _save19
                end
                break if _tmp
                self.pos = _save18

                _save24 = self.pos
                while true # sequence
                  _save25 = self.pos
                  _tmp = apply(:_Ticks1)
                  _tmp = _tmp ? nil : true
                  self.pos = _save25
                  unless _tmp
                    self.pos = _save24
                    break
                  end
                  _tmp = scan(/\G(?-mix:`+)/)
                  unless _tmp
                    self.pos = _save24
                  end
                  break
                end # end sequence

                break if _tmp
                self.pos = _save18

                _save26 = self.pos
                while true # sequence
                  _save27 = self.pos

                  _save28 = self.pos
                  while true # sequence
                    _tmp = _Sp()
                    unless _tmp
                      self.pos = _save28
                      break
                    end
                    _tmp = apply(:_Ticks1)
                    unless _tmp
                      self.pos = _save28
                    end
                    break
                  end # end sequence

                  _tmp = _tmp ? nil : true
                  self.pos = _save27
                  unless _tmp
                    self.pos = _save26
                    break
                  end

                  _save29 = self.pos
                  while true # choice
                    _tmp = _Spacechar()
                    break if _tmp
                    self.pos = _save29

                    _save30 = self.pos
                    while true # sequence
                      _tmp = _Newline()
                      unless _tmp
                        self.pos = _save30
                        break
                      end
                      _save31 = self.pos
                      _tmp = _BlankLine()
                      _tmp = _tmp ? nil : true
                      self.pos = _save31
                      unless _tmp
                        self.pos = _save30
                      end
                      break
                    end # end sequence

                    break if _tmp
                    self.pos = _save29
                    break
                  end # end choice

                  unless _tmp
                    self.pos = _save26
                  end
                  break
                end # end sequence

                break if _tmp
                self.pos = _save18
                break
              end # end choice

              break unless _tmp
            end
            _tmp = true
          else
            self.pos = _save3
          end
          if _tmp
            text = get_text(_text_start)
          end
          unless _tmp
            self.pos = _save2
            break
          end
          _tmp = _Sp()
          unless _tmp
            self.pos = _save2
            break
          end
          _tmp = apply(:_Ticks1)
          unless _tmp
            self.pos = _save2
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save1

        _save32 = self.pos
        while true # sequence
          _tmp = apply(:_Ticks2)
          unless _tmp
            self.pos = _save32
            break
          end
          _tmp = _Sp()
          unless _tmp
            self.pos = _save32
            break
          end
          _text_start = self.pos
          _save33 = self.pos

          _save34 = self.pos
          while true # choice
            _save35 = self.pos

            _save36 = self.pos
            while true # sequence
              _save37 = self.pos
              _tmp = match_string("`")
              _tmp = _tmp ? nil : true
              self.pos = _save37
              unless _tmp
                self.pos = _save36
                break
              end
              _tmp = apply(:_Nonspacechar)
              unless _tmp
                self.pos = _save36
              end
              break
            end # end sequence

            if _tmp
              while true

                _save38 = self.pos
                while true # sequence
                  _save39 = self.pos
                  _tmp = match_string("`")
                  _tmp = _tmp ? nil : true
                  self.pos = _save39
                  unless _tmp
                    self.pos = _save38
                    break
                  end
                  _tmp = apply(:_Nonspacechar)
                  unless _tmp
                    self.pos = _save38
                  end
                  break
                end # end sequence

                break unless _tmp
              end
              _tmp = true
            else
              self.pos = _save35
            end
            break if _tmp
            self.pos = _save34

            _save40 = self.pos
            while true # sequence
              _save41 = self.pos
              _tmp = apply(:_Ticks2)
              _tmp = _tmp ? nil : true
              self.pos = _save41
              unless _tmp
                self.pos = _save40
                break
              end
              _tmp = scan(/\G(?-mix:`+)/)
              unless _tmp
                self.pos = _save40
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save34

            _save42 = self.pos
            while true # sequence
              _save43 = self.pos

              _save44 = self.pos
              while true # sequence
                _tmp = _Sp()
                unless _tmp
                  self.pos = _save44
                  break
                end
                _tmp = apply(:_Ticks2)
                unless _tmp
                  self.pos = _save44
                end
                break
              end # end sequence

              _tmp = _tmp ? nil : true
              self.pos = _save43
              unless _tmp
                self.pos = _save42
                break
              end

              _save45 = self.pos
              while true # choice
                _tmp = _Spacechar()
                break if _tmp
                self.pos = _save45

                _save46 = self.pos
                while true # sequence
                  _tmp = _Newline()
                  unless _tmp
                    self.pos = _save46
                    break
                  end
                  _save47 = self.pos
                  _tmp = _BlankLine()
                  _tmp = _tmp ? nil : true
                  self.pos = _save47
                  unless _tmp
                    self.pos = _save46
                  end
                  break
                end # end sequence

                break if _tmp
                self.pos = _save45
                break
              end # end choice

              unless _tmp
                self.pos = _save42
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save34
            break
          end # end choice

          if _tmp
            while true

              _save48 = self.pos
              while true # choice
                _save49 = self.pos

                _save50 = self.pos
                while true # sequence
                  _save51 = self.pos
                  _tmp = match_string("`")
                  _tmp = _tmp ? nil : true
                  self.pos = _save51
                  unless _tmp
                    self.pos = _save50
                    break
                  end
                  _tmp = apply(:_Nonspacechar)
                  unless _tmp
                    self.pos = _save50
                  end
                  break
                end # end sequence

                if _tmp
                  while true

                    _save52 = self.pos
                    while true # sequence
                      _save53 = self.pos
                      _tmp = match_string("`")
                      _tmp = _tmp ? nil : true
                      self.pos = _save53
                      unless _tmp
                        self.pos = _save52
                        break
                      end
                      _tmp = apply(:_Nonspacechar)
                      unless _tmp
                        self.pos = _save52
                      end
                      break
                    end # end sequence

                    break unless _tmp
                  end
                  _tmp = true
                else
                  self.pos = _save49
                end
                break if _tmp
                self.pos = _save48

                _save54 = self.pos
                while true # sequence
                  _save55 = self.pos
                  _tmp = apply(:_Ticks2)
                  _tmp = _tmp ? nil : true
                  self.pos = _save55
                  unless _tmp
                    self.pos = _save54
                    break
                  end
                  _tmp = scan(/\G(?-mix:`+)/)
                  unless _tmp
                    self.pos = _save54
                  end
                  break
                end # end sequence

                break if _tmp
                self.pos = _save48

                _save56 = self.pos
                while true # sequence
                  _save57 = self.pos

                  _save58 = self.pos
                  while true # sequence
                    _tmp = _Sp()
                    unless _tmp
                      self.pos = _save58
                      break
                    end
                    _tmp = apply(:_Ticks2)
                    unless _tmp
                      self.pos = _save58
                    end
                    break
                  end # end sequence

                  _tmp = _tmp ? nil : true
                  self.pos = _save57
                  unless _tmp
                    self.pos = _save56
                    break
                  end

                  _save59 = self.pos
                  while true # choice
                    _tmp = _Spacechar()
                    break if _tmp
                    self.pos = _save59

                    _save60 = self.pos
                    while true # sequence
                      _tmp = _Newline()
                      unless _tmp
                        self.pos = _save60
                        break
                      end
                      _save61 = self.pos
                      _tmp = _BlankLine()
                      _tmp = _tmp ? nil : true
                      self.pos = _save61
                      unless _tmp
                        self.pos = _save60
                      end
                      break
                    end # end sequence

                    break if _tmp
                    self.pos = _save59
                    break
                  end # end choice

                  unless _tmp
                    self.pos = _save56
                  end
                  break
                end # end sequence

                break if _tmp
                self.pos = _save48
                break
              end # end choice

              break unless _tmp
            end
            _tmp = true
          else
            self.pos = _save33
          end
          if _tmp
            text = get_text(_text_start)
          end
          unless _tmp
            self.pos = _save32
            break
          end
          _tmp = _Sp()
          unless _tmp
            self.pos = _save32
            break
          end
          _tmp = apply(:_Ticks2)
          unless _tmp
            self.pos = _save32
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save1

        _save62 = self.pos
        while true # sequence
          _tmp = apply(:_Ticks3)
          unless _tmp
            self.pos = _save62
            break
          end
          _tmp = _Sp()
          unless _tmp
            self.pos = _save62
            break
          end
          _text_start = self.pos
          _save63 = self.pos

          _save64 = self.pos
          while true # choice
            _save65 = self.pos

            _save66 = self.pos
            while true # sequence
              _save67 = self.pos
              _tmp = match_string("`")
              _tmp = _tmp ? nil : true
              self.pos = _save67
              unless _tmp
                self.pos = _save66
                break
              end
              _tmp = apply(:_Nonspacechar)
              unless _tmp
                self.pos = _save66
              end
              break
            end # end sequence

            if _tmp
              while true

                _save68 = self.pos
                while true # sequence
                  _save69 = self.pos
                  _tmp = match_string("`")
                  _tmp = _tmp ? nil : true
                  self.pos = _save69
                  unless _tmp
                    self.pos = _save68
                    break
                  end
                  _tmp = apply(:_Nonspacechar)
                  unless _tmp
                    self.pos = _save68
                  end
                  break
                end # end sequence

                break unless _tmp
              end
              _tmp = true
            else
              self.pos = _save65
            end
            break if _tmp
            self.pos = _save64

            _save70 = self.pos
            while true # sequence
              _save71 = self.pos
              _tmp = apply(:_Ticks3)
              _tmp = _tmp ? nil : true
              self.pos = _save71
              unless _tmp
                self.pos = _save70
                break
              end
              _tmp = scan(/\G(?-mix:`+)/)
              unless _tmp
                self.pos = _save70
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save64

            _save72 = self.pos
            while true # sequence
              _save73 = self.pos

              _save74 = self.pos
              while true # sequence
                _tmp = _Sp()
                unless _tmp
                  self.pos = _save74
                  break
                end
                _tmp = apply(:_Ticks3)
                unless _tmp
                  self.pos = _save74
                end
                break
              end # end sequence

              _tmp = _tmp ? nil : true
              self.pos = _save73
              unless _tmp
                self.pos = _save72
                break
              end

              _save75 = self.pos
              while true # choice
                _tmp = _Spacechar()
                break if _tmp
                self.pos = _save75

                _save76 = self.pos
                while true # sequence
                  _tmp = _Newline()
                  unless _tmp
                    self.pos = _save76
                    break
                  end
                  _save77 = self.pos
                  _tmp = _BlankLine()
                  _tmp = _tmp ? nil : true
                  self.pos = _save77
                  unless _tmp
                    self.pos = _save76
                  end
                  break
                end # end sequence

                break if _tmp
                self.pos = _save75
                break
              end # end choice

              unless _tmp
                self.pos = _save72
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save64
            break
          end # end choice

          if _tmp
            while true

              _save78 = self.pos
              while true # choice
                _save79 = self.pos

                _save80 = self.pos
                while true # sequence
                  _save81 = self.pos
                  _tmp = match_string("`")
                  _tmp = _tmp ? nil : true
                  self.pos = _save81
                  unless _tmp
                    self.pos = _save80
                    break
                  end
                  _tmp = apply(:_Nonspacechar)
                  unless _tmp
                    self.pos = _save80
                  end
                  break
                end # end sequence

                if _tmp
                  while true

                    _save82 = self.pos
                    while true # sequence
                      _save83 = self.pos
                      _tmp = match_string("`")
                      _tmp = _tmp ? nil : true
                      self.pos = _save83
                      unless _tmp
                        self.pos = _save82
                        break
                      end
                      _tmp = apply(:_Nonspacechar)
                      unless _tmp
                        self.pos = _save82
                      end
                      break
                    end # end sequence

                    break unless _tmp
                  end
                  _tmp = true
                else
                  self.pos = _save79
                end
                break if _tmp
                self.pos = _save78

                _save84 = self.pos
                while true # sequence
                  _save85 = self.pos
                  _tmp = apply(:_Ticks3)
                  _tmp = _tmp ? nil : true
                  self.pos = _save85
                  unless _tmp
                    self.pos = _save84
                    break
                  end
                  _tmp = scan(/\G(?-mix:`+)/)
                  unless _tmp
                    self.pos = _save84
                  end
                  break
                end # end sequence

                break if _tmp
                self.pos = _save78

                _save86 = self.pos
                while true # sequence
                  _save87 = self.pos

                  _save88 = self.pos
                  while true # sequence
                    _tmp = _Sp()
                    unless _tmp
                      self.pos = _save88
                      break
                    end
                    _tmp = apply(:_Ticks3)
                    unless _tmp
                      self.pos = _save88
                    end
                    break
                  end # end sequence

                  _tmp = _tmp ? nil : true
                  self.pos = _save87
                  unless _tmp
                    self.pos = _save86
                    break
                  end

                  _save89 = self.pos
                  while true # choice
                    _tmp = _Spacechar()
                    break if _tmp
                    self.pos = _save89

                    _save90 = self.pos
                    while true # sequence
                      _tmp = _Newline()
                      unless _tmp
                        self.pos = _save90
                        break
                      end
                      _save91 = self.pos
                      _tmp = _BlankLine()
                      _tmp = _tmp ? nil : true
                      self.pos = _save91
                      unless _tmp
                        self.pos = _save90
                      end
                      break
                    end # end sequence

                    break if _tmp
                    self.pos = _save89
                    break
                  end # end choice

                  unless _tmp
                    self.pos = _save86
                  end
                  break
                end # end sequence

                break if _tmp
                self.pos = _save78
                break
              end # end choice

              break unless _tmp
            end
            _tmp = true
          else
            self.pos = _save63
          end
          if _tmp
            text = get_text(_text_start)
          end
          unless _tmp
            self.pos = _save62
            break
          end
          _tmp = _Sp()
          unless _tmp
            self.pos = _save62
            break
          end
          _tmp = apply(:_Ticks3)
          unless _tmp
            self.pos = _save62
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save1

        _save92 = self.pos
        while true # sequence
          _tmp = apply(:_Ticks4)
          unless _tmp
            self.pos = _save92
            break
          end
          _tmp = _Sp()
          unless _tmp
            self.pos = _save92
            break
          end
          _text_start = self.pos
          _save93 = self.pos

          _save94 = self.pos
          while true # choice
            _save95 = self.pos

            _save96 = self.pos
            while true # sequence
              _save97 = self.pos
              _tmp = match_string("`")
              _tmp = _tmp ? nil : true
              self.pos = _save97
              unless _tmp
                self.pos = _save96
                break
              end
              _tmp = apply(:_Nonspacechar)
              unless _tmp
                self.pos = _save96
              end
              break
            end # end sequence

            if _tmp
              while true

                _save98 = self.pos
                while true # sequence
                  _save99 = self.pos
                  _tmp = match_string("`")
                  _tmp = _tmp ? nil : true
                  self.pos = _save99
                  unless _tmp
                    self.pos = _save98
                    break
                  end
                  _tmp = apply(:_Nonspacechar)
                  unless _tmp
                    self.pos = _save98
                  end
                  break
                end # end sequence

                break unless _tmp
              end
              _tmp = true
            else
              self.pos = _save95
            end
            break if _tmp
            self.pos = _save94

            _save100 = self.pos
            while true # sequence
              _save101 = self.pos
              _tmp = apply(:_Ticks4)
              _tmp = _tmp ? nil : true
              self.pos = _save101
              unless _tmp
                self.pos = _save100
                break
              end
              _tmp = scan(/\G(?-mix:`+)/)
              unless _tmp
                self.pos = _save100
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save94

            _save102 = self.pos
            while true # sequence
              _save103 = self.pos

              _save104 = self.pos
              while true # sequence
                _tmp = _Sp()
                unless _tmp
                  self.pos = _save104
                  break
                end
                _tmp = apply(:_Ticks4)
                unless _tmp
                  self.pos = _save104
                end
                break
              end # end sequence

              _tmp = _tmp ? nil : true
              self.pos = _save103
              unless _tmp
                self.pos = _save102
                break
              end

              _save105 = self.pos
              while true # choice
                _tmp = _Spacechar()
                break if _tmp
                self.pos = _save105

                _save106 = self.pos
                while true # sequence
                  _tmp = _Newline()
                  unless _tmp
                    self.pos = _save106
                    break
                  end
                  _save107 = self.pos
                  _tmp = _BlankLine()
                  _tmp = _tmp ? nil : true
                  self.pos = _save107
                  unless _tmp
                    self.pos = _save106
                  end
                  break
                end # end sequence

                break if _tmp
                self.pos = _save105
                break
              end # end choice

              unless _tmp
                self.pos = _save102
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save94
            break
          end # end choice

          if _tmp
            while true

              _save108 = self.pos
              while true # choice
                _save109 = self.pos

                _save110 = self.pos
                while true # sequence
                  _save111 = self.pos
                  _tmp = match_string("`")
                  _tmp = _tmp ? nil : true
                  self.pos = _save111
                  unless _tmp
                    self.pos = _save110
                    break
                  end
                  _tmp = apply(:_Nonspacechar)
                  unless _tmp
                    self.pos = _save110
                  end
                  break
                end # end sequence

                if _tmp
                  while true

                    _save112 = self.pos
                    while true # sequence
                      _save113 = self.pos
                      _tmp = match_string("`")
                      _tmp = _tmp ? nil : true
                      self.pos = _save113
                      unless _tmp
                        self.pos = _save112
                        break
                      end
                      _tmp = apply(:_Nonspacechar)
                      unless _tmp
                        self.pos = _save112
                      end
                      break
                    end # end sequence

                    break unless _tmp
                  end
                  _tmp = true
                else
                  self.pos = _save109
                end
                break if _tmp
                self.pos = _save108

                _save114 = self.pos
                while true # sequence
                  _save115 = self.pos
                  _tmp = apply(:_Ticks4)
                  _tmp = _tmp ? nil : true
                  self.pos = _save115
                  unless _tmp
                    self.pos = _save114
                    break
                  end
                  _tmp = scan(/\G(?-mix:`+)/)
                  unless _tmp
                    self.pos = _save114
                  end
                  break
                end # end sequence

                break if _tmp
                self.pos = _save108

                _save116 = self.pos
                while true # sequence
                  _save117 = self.pos

                  _save118 = self.pos
                  while true # sequence
                    _tmp = _Sp()
                    unless _tmp
                      self.pos = _save118
                      break
                    end
                    _tmp = apply(:_Ticks4)
                    unless _tmp
                      self.pos = _save118
                    end
                    break
                  end # end sequence

                  _tmp = _tmp ? nil : true
                  self.pos = _save117
                  unless _tmp
                    self.pos = _save116
                    break
                  end

                  _save119 = self.pos
                  while true # choice
                    _tmp = _Spacechar()
                    break if _tmp
                    self.pos = _save119

                    _save120 = self.pos
                    while true # sequence
                      _tmp = _Newline()
                      unless _tmp
                        self.pos = _save120
                        break
                      end
                      _save121 = self.pos
                      _tmp = _BlankLine()
                      _tmp = _tmp ? nil : true
                      self.pos = _save121
                      unless _tmp
                        self.pos = _save120
                      end
                      break
                    end # end sequence

                    break if _tmp
                    self.pos = _save119
                    break
                  end # end choice

                  unless _tmp
                    self.pos = _save116
                  end
                  break
                end # end sequence

                break if _tmp
                self.pos = _save108
                break
              end # end choice

              break unless _tmp
            end
            _tmp = true
          else
            self.pos = _save93
          end
          if _tmp
            text = get_text(_text_start)
          end
          unless _tmp
            self.pos = _save92
            break
          end
          _tmp = _Sp()
          unless _tmp
            self.pos = _save92
            break
          end
          _tmp = apply(:_Ticks4)
          unless _tmp
            self.pos = _save92
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save1

        _save122 = self.pos
        while true # sequence
          _tmp = apply(:_Ticks5)
          unless _tmp
            self.pos = _save122
            break
          end
          _tmp = _Sp()
          unless _tmp
            self.pos = _save122
            break
          end
          _text_start = self.pos
          _save123 = self.pos

          _save124 = self.pos
          while true # choice
            _save125 = self.pos

            _save126 = self.pos
            while true # sequence
              _save127 = self.pos
              _tmp = match_string("`")
              _tmp = _tmp ? nil : true
              self.pos = _save127
              unless _tmp
                self.pos = _save126
                break
              end
              _tmp = apply(:_Nonspacechar)
              unless _tmp
                self.pos = _save126
              end
              break
            end # end sequence

            if _tmp
              while true

                _save128 = self.pos
                while true # sequence
                  _save129 = self.pos
                  _tmp = match_string("`")
                  _tmp = _tmp ? nil : true
                  self.pos = _save129
                  unless _tmp
                    self.pos = _save128
                    break
                  end
                  _tmp = apply(:_Nonspacechar)
                  unless _tmp
                    self.pos = _save128
                  end
                  break
                end # end sequence

                break unless _tmp
              end
              _tmp = true
            else
              self.pos = _save125
            end
            break if _tmp
            self.pos = _save124

            _save130 = self.pos
            while true # sequence
              _save131 = self.pos
              _tmp = apply(:_Ticks5)
              _tmp = _tmp ? nil : true
              self.pos = _save131
              unless _tmp
                self.pos = _save130
                break
              end
              _tmp = scan(/\G(?-mix:`+)/)
              unless _tmp
                self.pos = _save130
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save124

            _save132 = self.pos
            while true # sequence
              _save133 = self.pos

              _save134 = self.pos
              while true # sequence
                _tmp = _Sp()
                unless _tmp
                  self.pos = _save134
                  break
                end
                _tmp = apply(:_Ticks5)
                unless _tmp
                  self.pos = _save134
                end
                break
              end # end sequence

              _tmp = _tmp ? nil : true
              self.pos = _save133
              unless _tmp
                self.pos = _save132
                break
              end

              _save135 = self.pos
              while true # choice
                _tmp = _Spacechar()
                break if _tmp
                self.pos = _save135

                _save136 = self.pos
                while true # sequence
                  _tmp = _Newline()
                  unless _tmp
                    self.pos = _save136
                    break
                  end
                  _save137 = self.pos
                  _tmp = _BlankLine()
                  _tmp = _tmp ? nil : true
                  self.pos = _save137
                  unless _tmp
                    self.pos = _save136
                  end
                  break
                end # end sequence

                break if _tmp
                self.pos = _save135
                break
              end # end choice

              unless _tmp
                self.pos = _save132
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save124
            break
          end # end choice

          if _tmp
            while true

              _save138 = self.pos
              while true # choice
                _save139 = self.pos

                _save140 = self.pos
                while true # sequence
                  _save141 = self.pos
                  _tmp = match_string("`")
                  _tmp = _tmp ? nil : true
                  self.pos = _save141
                  unless _tmp
                    self.pos = _save140
                    break
                  end
                  _tmp = apply(:_Nonspacechar)
                  unless _tmp
                    self.pos = _save140
                  end
                  break
                end # end sequence

                if _tmp
                  while true

                    _save142 = self.pos
                    while true # sequence
                      _save143 = self.pos
                      _tmp = match_string("`")
                      _tmp = _tmp ? nil : true
                      self.pos = _save143
                      unless _tmp
                        self.pos = _save142
                        break
                      end
                      _tmp = apply(:_Nonspacechar)
                      unless _tmp
                        self.pos = _save142
                      end
                      break
                    end # end sequence

                    break unless _tmp
                  end
                  _tmp = true
                else
                  self.pos = _save139
                end
                break if _tmp
                self.pos = _save138

                _save144 = self.pos
                while true # sequence
                  _save145 = self.pos
                  _tmp = apply(:_Ticks5)
                  _tmp = _tmp ? nil : true
                  self.pos = _save145
                  unless _tmp
                    self.pos = _save144
                    break
                  end
                  _tmp = scan(/\G(?-mix:`+)/)
                  unless _tmp
                    self.pos = _save144
                  end
                  break
                end # end sequence

                break if _tmp
                self.pos = _save138

                _save146 = self.pos
                while true # sequence
                  _save147 = self.pos

                  _save148 = self.pos
                  while true # sequence
                    _tmp = _Sp()
                    unless _tmp
                      self.pos = _save148
                      break
                    end
                    _tmp = apply(:_Ticks5)
                    unless _tmp
                      self.pos = _save148
                    end
                    break
                  end # end sequence

                  _tmp = _tmp ? nil : true
                  self.pos = _save147
                  unless _tmp
                    self.pos = _save146
                    break
                  end

                  _save149 = self.pos
                  while true # choice
                    _tmp = _Spacechar()
                    break if _tmp
                    self.pos = _save149

                    _save150 = self.pos
                    while true # sequence
                      _tmp = _Newline()
                      unless _tmp
                        self.pos = _save150
                        break
                      end
                      _save151 = self.pos
                      _tmp = _BlankLine()
                      _tmp = _tmp ? nil : true
                      self.pos = _save151
                      unless _tmp
                        self.pos = _save150
                      end
                      break
                    end # end sequence

                    break if _tmp
                    self.pos = _save149
                    break
                  end # end choice

                  unless _tmp
                    self.pos = _save146
                  end
                  break
                end # end sequence

                break if _tmp
                self.pos = _save138
                break
              end # end choice

              break unless _tmp
            end
            _tmp = true
          else
            self.pos = _save123
          end
          if _tmp
            text = get_text(_text_start)
          end
          unless _tmp
            self.pos = _save122
            break
          end
          _tmp = _Sp()
          unless _tmp
            self.pos = _save122
            break
          end
          _tmp = apply(:_Ticks5)
          unless _tmp
            self.pos = _save122
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  "<code>#{text}</code>" ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Code unless _tmp
    return _tmp
  end

  # RawHtml = < (HtmlComment | HtmlBlockScript | HtmlTag) > { if html? then text else '' end }
  def _RawHtml

    _save = self.pos
    while true # sequence
      _text_start = self.pos

      _save1 = self.pos
      while true # choice
        _tmp = apply(:_HtmlComment)
        break if _tmp
        self.pos = _save1
        _tmp = apply(:_HtmlBlockScript)
        break if _tmp
        self.pos = _save1
        _tmp = apply(:_HtmlTag)
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  if html? then text else '' end ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_RawHtml unless _tmp
    return _tmp
  end

  # BlankLine = @Sp @Newline { "\n" }
  def _BlankLine

    _save = self.pos
    while true # sequence
      _tmp = _Sp()
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Newline()
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  "\n" ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_BlankLine unless _tmp
    return _tmp
  end

  # Quoted = ("\"" (!"\"" .)* "\"" | "'" (!"'" .)* "'")
  def _Quoted

    _save = self.pos
    while true # choice

      _save1 = self.pos
      while true # sequence
        _tmp = match_string("\"")
        unless _tmp
          self.pos = _save1
          break
        end
        while true

          _save3 = self.pos
          while true # sequence
            _save4 = self.pos
            _tmp = match_string("\"")
            _tmp = _tmp ? nil : true
            self.pos = _save4
            unless _tmp
              self.pos = _save3
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save3
            end
            break
          end # end sequence

          break unless _tmp
        end
        _tmp = true
        unless _tmp
          self.pos = _save1
          break
        end
        _tmp = match_string("\"")
        unless _tmp
          self.pos = _save1
        end
        break
      end # end sequence

      break if _tmp
      self.pos = _save

      _save5 = self.pos
      while true # sequence
        _tmp = match_string("'")
        unless _tmp
          self.pos = _save5
          break
        end
        while true

          _save7 = self.pos
          while true # sequence
            _save8 = self.pos
            _tmp = match_string("'")
            _tmp = _tmp ? nil : true
            self.pos = _save8
            unless _tmp
              self.pos = _save7
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save7
            end
            break
          end # end sequence

          break unless _tmp
        end
        _tmp = true
        unless _tmp
          self.pos = _save5
          break
        end
        _tmp = match_string("'")
        unless _tmp
          self.pos = _save5
        end
        break
      end # end sequence

      break if _tmp
      self.pos = _save
      break
    end # end choice

    set_failed_rule :_Quoted unless _tmp
    return _tmp
  end

  # HtmlAttribute = (AlphanumericAscii | "-")+ Spnl ("=" Spnl (Quoted | (!">" Nonspacechar)+))? Spnl
  def _HtmlAttribute

    _save = self.pos
    while true # sequence
      _save1 = self.pos

      _save2 = self.pos
      while true # choice
        _tmp = apply(:_AlphanumericAscii)
        break if _tmp
        self.pos = _save2
        _tmp = match_string("-")
        break if _tmp
        self.pos = _save2
        break
      end # end choice

      if _tmp
        while true

          _save3 = self.pos
          while true # choice
            _tmp = apply(:_AlphanumericAscii)
            break if _tmp
            self.pos = _save3
            _tmp = match_string("-")
            break if _tmp
            self.pos = _save3
            break
          end # end choice

          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save1
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _save4 = self.pos

      _save5 = self.pos
      while true # sequence
        _tmp = match_string("=")
        unless _tmp
          self.pos = _save5
          break
        end
        _tmp = apply(:_Spnl)
        unless _tmp
          self.pos = _save5
          break
        end

        _save6 = self.pos
        while true # choice
          _tmp = apply(:_Quoted)
          break if _tmp
          self.pos = _save6
          _save7 = self.pos

          _save8 = self.pos
          while true # sequence
            _save9 = self.pos
            _tmp = match_string(">")
            _tmp = _tmp ? nil : true
            self.pos = _save9
            unless _tmp
              self.pos = _save8
              break
            end
            _tmp = apply(:_Nonspacechar)
            unless _tmp
              self.pos = _save8
            end
            break
          end # end sequence

          if _tmp
            while true

              _save10 = self.pos
              while true # sequence
                _save11 = self.pos
                _tmp = match_string(">")
                _tmp = _tmp ? nil : true
                self.pos = _save11
                unless _tmp
                  self.pos = _save10
                  break
                end
                _tmp = apply(:_Nonspacechar)
                unless _tmp
                  self.pos = _save10
                end
                break
              end # end sequence

              break unless _tmp
            end
            _tmp = true
          else
            self.pos = _save7
          end
          break if _tmp
          self.pos = _save6
          break
        end # end choice

        unless _tmp
          self.pos = _save5
        end
        break
      end # end sequence

      unless _tmp
        _tmp = true
        self.pos = _save4
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlAttribute unless _tmp
    return _tmp
  end

  # HtmlComment = "<!--" (!"-->" .)* "-->"
  def _HtmlComment

    _save = self.pos
    while true # sequence
      _tmp = match_string("<!--")
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save2 = self.pos
        while true # sequence
          _save3 = self.pos
          _tmp = match_string("-->")
          _tmp = _tmp ? nil : true
          self.pos = _save3
          unless _tmp
            self.pos = _save2
            break
          end
          _tmp = get_byte
          unless _tmp
            self.pos = _save2
          end
          break
        end # end sequence

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("-->")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlComment unless _tmp
    return _tmp
  end

  # HtmlTag = "<" Spnl "/"? AlphanumericAscii+ Spnl HtmlAttribute* "/"? Spnl ">"
  def _HtmlTag

    _save = self.pos
    while true # sequence
      _tmp = match_string("<")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos
      _tmp = match_string("/")
      unless _tmp
        _tmp = true
        self.pos = _save1
      end
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos
      _tmp = apply(:_AlphanumericAscii)
      if _tmp
        while true
          _tmp = apply(:_AlphanumericAscii)
          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save2
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = apply(:_HtmlAttribute)
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      _save4 = self.pos
      _tmp = match_string("/")
      unless _tmp
        _tmp = true
        self.pos = _save4
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(">")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HtmlTag unless _tmp
    return _tmp
  end

  # Eof = !.
  def _Eof
    _save = self.pos
    _tmp = get_byte
    _tmp = _tmp ? nil : true
    self.pos = _save
    set_failed_rule :_Eof unless _tmp
    return _tmp
  end

  # Nonspacechar = !@Spacechar !@Newline .
  def _Nonspacechar

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = _Spacechar()
      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos
      _tmp = _Newline()
      _tmp = _tmp ? nil : true
      self.pos = _save2
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = get_byte
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Nonspacechar unless _tmp
    return _tmp
  end

  # Sp = @Spacechar*
  def _Sp
    while true
      _tmp = _Spacechar()
      break unless _tmp
    end
    _tmp = true
    set_failed_rule :_Sp unless _tmp
    return _tmp
  end

  # Spnl = @Sp (@Newline @Sp)?
  def _Spnl

    _save = self.pos
    while true # sequence
      _tmp = _Sp()
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos

      _save2 = self.pos
      while true # sequence
        _tmp = _Newline()
        unless _tmp
          self.pos = _save2
          break
        end
        _tmp = _Sp()
        unless _tmp
          self.pos = _save2
        end
        break
      end # end sequence

      unless _tmp
        _tmp = true
        self.pos = _save1
      end
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Spnl unless _tmp
    return _tmp
  end

  # SpecialChar = (/[~*_`&\[\]()<!#\\'"]/ | @ExtendedSpecialChar)
  def _SpecialChar

    _save = self.pos
    while true # choice
      _tmp = scan(/\G(?-mix:[~*_`&\[\]()<!#\\'"])/)
      break if _tmp
      self.pos = _save
      _tmp = _ExtendedSpecialChar()
      break if _tmp
      self.pos = _save
      break
    end # end choice

    set_failed_rule :_SpecialChar unless _tmp
    return _tmp
  end

  # NormalChar = !(@SpecialChar | @Spacechar | @Newline) .
  def _NormalChar

    _save = self.pos
    while true # sequence
      _save1 = self.pos

      _save2 = self.pos
      while true # choice
        _tmp = _SpecialChar()
        break if _tmp
        self.pos = _save2
        _tmp = _Spacechar()
        break if _tmp
        self.pos = _save2
        _tmp = _Newline()
        break if _tmp
        self.pos = _save2
        break
      end # end choice

      _tmp = _tmp ? nil : true
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = get_byte
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_NormalChar unless _tmp
    return _tmp
  end

  # Digit = [0-9]
  def _Digit
    _save = self.pos
    _tmp = get_byte
    if _tmp
      unless _tmp >= 48 and _tmp <= 57
        self.pos = _save
        _tmp = nil
      end
    end
    set_failed_rule :_Digit unless _tmp
    return _tmp
  end

  # Alphanumeric = %literals.Alphanumeric
  def _Alphanumeric
    _tmp = @_grammar_literals.external_invoke(self, :_Alphanumeric)
    set_failed_rule :_Alphanumeric unless _tmp
    return _tmp
  end

  # AlphanumericAscii = %literals.AlphanumericAscii
  def _AlphanumericAscii
    _tmp = @_grammar_literals.external_invoke(self, :_AlphanumericAscii)
    set_failed_rule :_AlphanumericAscii unless _tmp
    return _tmp
  end

  # BOM = %literals.BOM
  def _BOM
    _tmp = @_grammar_literals.external_invoke(self, :_BOM)
    set_failed_rule :_BOM unless _tmp
    return _tmp
  end

  # Newline = %literals.Newline
  def _Newline
    _tmp = @_grammar_literals.external_invoke(self, :_Newline)
    set_failed_rule :_Newline unless _tmp
    return _tmp
  end

  # Spacechar = %literals.Spacechar
  def _Spacechar
    _tmp = @_grammar_literals.external_invoke(self, :_Spacechar)
    set_failed_rule :_Spacechar unless _tmp
    return _tmp
  end

  # HexEntity = /&#x/i < /[0-9a-fA-F]+/ > ";" { [text.to_i(16)].pack 'U' }
  def _HexEntity

    _save = self.pos
    while true # sequence
      _tmp = scan(/\G(?i-mx:&#x)/)
      unless _tmp
        self.pos = _save
        break
      end
      _text_start = self.pos
      _tmp = scan(/\G(?-mix:[0-9a-fA-F]+)/)
      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(";")
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  [text.to_i(16)].pack 'U' ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_HexEntity unless _tmp
    return _tmp
  end

  # DecEntity = "&#" < /[0-9]+/ > ";" { [text.to_i].pack 'U' }
  def _DecEntity

    _save = self.pos
    while true # sequence
      _tmp = match_string("&#")
      unless _tmp
        self.pos = _save
        break
      end
      _text_start = self.pos
      _tmp = scan(/\G(?-mix:[0-9]+)/)
      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(";")
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  [text.to_i].pack 'U' ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_DecEntity unless _tmp
    return _tmp
  end

  # CharEntity = "&" < /[A-Za-z0-9]+/ > ";" { if entity = HTML_ENTITIES[text] then                  entity.pack 'U*'                else                  "&#{text};"                end              }
  def _CharEntity

    _save = self.pos
    while true # sequence
      _tmp = match_string("&")
      unless _tmp
        self.pos = _save
        break
      end
      _text_start = self.pos
      _tmp = scan(/\G(?-mix:[A-Za-z0-9]+)/)
      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(";")
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  if entity = HTML_ENTITIES[text] then
                 entity.pack 'U*'
               else
                 "&#{text};"
               end
             ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_CharEntity unless _tmp
    return _tmp
  end

  # NonindentSpace = / {0,3}/
  def _NonindentSpace
    _tmp = scan(/\G(?-mix: {0,3})/)
    set_failed_rule :_NonindentSpace unless _tmp
    return _tmp
  end

  # Indent = /\t|    /
  def _Indent
    _tmp = scan(/\G(?-mix:\t|    )/)
    set_failed_rule :_Indent unless _tmp
    return _tmp
  end

  # IndentedLine = Indent Line
  def _IndentedLine

    _save = self.pos
    while true # sequence
      _tmp = apply(:_Indent)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Line)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_IndentedLine unless _tmp
    return _tmp
  end

  # OptionallyIndentedLine = Indent? Line
  def _OptionallyIndentedLine

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = apply(:_Indent)
      unless _tmp
        _tmp = true
        self.pos = _save1
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Line)
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_OptionallyIndentedLine unless _tmp
    return _tmp
  end

  # StartList = &. { [] }
  def _StartList

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = get_byte
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  [] ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_StartList unless _tmp
    return _tmp
  end

  # Line = @RawLine:a { a }
  def _Line

    _save = self.pos
    while true # sequence
      _tmp = _RawLine()
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  a ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Line unless _tmp
    return _tmp
  end

  # RawLine = (< (!"\r" !"\n" .)* @Newline > | < .+ > @Eof) { text }
  def _RawLine

    _save = self.pos
    while true # sequence

      _save1 = self.pos
      while true # choice
        _text_start = self.pos

        _save2 = self.pos
        while true # sequence
          while true

            _save4 = self.pos
            while true # sequence
              _save5 = self.pos
              _tmp = match_string("\r")
              _tmp = _tmp ? nil : true
              self.pos = _save5
              unless _tmp
                self.pos = _save4
                break
              end
              _save6 = self.pos
              _tmp = match_string("\n")
              _tmp = _tmp ? nil : true
              self.pos = _save6
              unless _tmp
                self.pos = _save4
                break
              end
              _tmp = get_byte
              unless _tmp
                self.pos = _save4
              end
              break
            end # end sequence

            break unless _tmp
          end
          _tmp = true
          unless _tmp
            self.pos = _save2
            break
          end
          _tmp = _Newline()
          unless _tmp
            self.pos = _save2
          end
          break
        end # end sequence

        if _tmp
          text = get_text(_text_start)
        end
        break if _tmp
        self.pos = _save1

        _save7 = self.pos
        while true # sequence
          _text_start = self.pos
          _save8 = self.pos
          _tmp = get_byte
          if _tmp
            while true
              _tmp = get_byte
              break unless _tmp
            end
            _tmp = true
          else
            self.pos = _save8
          end
          if _tmp
            text = get_text(_text_start)
          end
          unless _tmp
            self.pos = _save7
            break
          end
          _tmp = _Eof()
          unless _tmp
            self.pos = _save7
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save1
        break
      end # end choice

      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  text ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_RawLine unless _tmp
    return _tmp
  end

  # SkipBlock = (HtmlBlock | (!"#" !SetextBottom1 !SetextBottom2 !@BlankLine @RawLine)+ @BlankLine* | @BlankLine+ | @RawLine)
  def _SkipBlock

    _save = self.pos
    while true # choice
      _tmp = apply(:_HtmlBlock)
      break if _tmp
      self.pos = _save

      _save1 = self.pos
      while true # sequence
        _save2 = self.pos

        _save3 = self.pos
        while true # sequence
          _save4 = self.pos
          _tmp = match_string("#")
          _tmp = _tmp ? nil : true
          self.pos = _save4
          unless _tmp
            self.pos = _save3
            break
          end
          _save5 = self.pos
          _tmp = apply(:_SetextBottom1)
          _tmp = _tmp ? nil : true
          self.pos = _save5
          unless _tmp
            self.pos = _save3
            break
          end
          _save6 = self.pos
          _tmp = apply(:_SetextBottom2)
          _tmp = _tmp ? nil : true
          self.pos = _save6
          unless _tmp
            self.pos = _save3
            break
          end
          _save7 = self.pos
          _tmp = _BlankLine()
          _tmp = _tmp ? nil : true
          self.pos = _save7
          unless _tmp
            self.pos = _save3
            break
          end
          _tmp = _RawLine()
          unless _tmp
            self.pos = _save3
          end
          break
        end # end sequence

        if _tmp
          while true

            _save8 = self.pos
            while true # sequence
              _save9 = self.pos
              _tmp = match_string("#")
              _tmp = _tmp ? nil : true
              self.pos = _save9
              unless _tmp
                self.pos = _save8
                break
              end
              _save10 = self.pos
              _tmp = apply(:_SetextBottom1)
              _tmp = _tmp ? nil : true
              self.pos = _save10
              unless _tmp
                self.pos = _save8
                break
              end
              _save11 = self.pos
              _tmp = apply(:_SetextBottom2)
              _tmp = _tmp ? nil : true
              self.pos = _save11
              unless _tmp
                self.pos = _save8
                break
              end
              _save12 = self.pos
              _tmp = _BlankLine()
              _tmp = _tmp ? nil : true
              self.pos = _save12
              unless _tmp
                self.pos = _save8
                break
              end
              _tmp = _RawLine()
              unless _tmp
                self.pos = _save8
              end
              break
            end # end sequence

            break unless _tmp
          end
          _tmp = true
        else
          self.pos = _save2
        end
        unless _tmp
          self.pos = _save1
          break
        end
        while true
          _tmp = _BlankLine()
          break unless _tmp
        end
        _tmp = true
        unless _tmp
          self.pos = _save1
        end
        break
      end # end sequence

      break if _tmp
      self.pos = _save
      _save14 = self.pos
      _tmp = _BlankLine()
      if _tmp
        while true
          _tmp = _BlankLine()
          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save14
      end
      break if _tmp
      self.pos = _save
      _tmp = _RawLine()
      break if _tmp
      self.pos = _save
      break
    end # end choice

    set_failed_rule :_SkipBlock unless _tmp
    return _tmp
  end

  # ExtendedSpecialChar = &{ notes? } "^"
  def _ExtendedSpecialChar

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = begin;  notes? ; end
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("^")
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_ExtendedSpecialChar unless _tmp
    return _tmp
  end

  # NoteReference = &{ notes? } RawNoteReference:ref { note_for ref }
  def _NoteReference

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = begin;  notes? ; end
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_RawNoteReference)
      ref = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  note_for ref ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_NoteReference unless _tmp
    return _tmp
  end

  # RawNoteReference = "[^" < (!@Newline !"]" .)+ > "]" { text }
  def _RawNoteReference

    _save = self.pos
    while true # sequence
      _tmp = match_string("[^")
      unless _tmp
        self.pos = _save
        break
      end
      _text_start = self.pos
      _save1 = self.pos

      _save2 = self.pos
      while true # sequence
        _save3 = self.pos
        _tmp = _Newline()
        _tmp = _tmp ? nil : true
        self.pos = _save3
        unless _tmp
          self.pos = _save2
          break
        end
        _save4 = self.pos
        _tmp = match_string("]")
        _tmp = _tmp ? nil : true
        self.pos = _save4
        unless _tmp
          self.pos = _save2
          break
        end
        _tmp = get_byte
        unless _tmp
          self.pos = _save2
        end
        break
      end # end sequence

      if _tmp
        while true

          _save5 = self.pos
          while true # sequence
            _save6 = self.pos
            _tmp = _Newline()
            _tmp = _tmp ? nil : true
            self.pos = _save6
            unless _tmp
              self.pos = _save5
              break
            end
            _save7 = self.pos
            _tmp = match_string("]")
            _tmp = _tmp ? nil : true
            self.pos = _save7
            unless _tmp
              self.pos = _save5
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save5
            end
            break
          end # end sequence

          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save1
      end
      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("]")
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  text ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_RawNoteReference unless _tmp
    return _tmp
  end

  # Note = &{ notes? } @NonindentSpace RawNoteReference:ref ":" @Sp @StartList:a RawNoteBlock:i { a.concat i } (&Indent RawNoteBlock:i { a.concat i })* { @footnotes[ref] = paragraph a                    nil                 }
  def _Note

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = begin;  notes? ; end
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _NonindentSpace()
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_RawNoteReference)
      ref = @result
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(":")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Sp()
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _StartList()
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_RawNoteBlock)
      i = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  a.concat i ; end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      while true

        _save3 = self.pos
        while true # sequence
          _save4 = self.pos
          _tmp = apply(:_Indent)
          self.pos = _save4
          unless _tmp
            self.pos = _save3
            break
          end
          _tmp = apply(:_RawNoteBlock)
          i = @result
          unless _tmp
            self.pos = _save3
            break
          end
          @result = begin;  a.concat i ; end
          _tmp = true
          unless _tmp
            self.pos = _save3
          end
          break
        end # end sequence

        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  @footnotes[ref] = paragraph a

                  nil
                ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Note unless _tmp
    return _tmp
  end

  # InlineNote = &{ notes? } "^[" @StartList:a (!"]" Inline:l { a << l })+ "]" { ref = [:inline, @note_order.length]                @footnotes[ref] = paragraph a                 note_for ref              }
  def _InlineNote

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = begin;  notes? ; end
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("^[")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _StartList()
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos

      _save3 = self.pos
      while true # sequence
        _save4 = self.pos
        _tmp = match_string("]")
        _tmp = _tmp ? nil : true
        self.pos = _save4
        unless _tmp
          self.pos = _save3
          break
        end
        _tmp = apply(:_Inline)
        l = @result
        unless _tmp
          self.pos = _save3
          break
        end
        @result = begin;  a << l ; end
        _tmp = true
        unless _tmp
          self.pos = _save3
        end
        break
      end # end sequence

      if _tmp
        while true

          _save5 = self.pos
          while true # sequence
            _save6 = self.pos
            _tmp = match_string("]")
            _tmp = _tmp ? nil : true
            self.pos = _save6
            unless _tmp
              self.pos = _save5
              break
            end
            _tmp = apply(:_Inline)
            l = @result
            unless _tmp
              self.pos = _save5
              break
            end
            @result = begin;  a << l ; end
            _tmp = true
            unless _tmp
              self.pos = _save5
            end
            break
          end # end sequence

          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save2
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("]")
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  ref = [:inline, @note_order.length]
               @footnotes[ref] = paragraph a

               note_for ref
             ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_InlineNote unless _tmp
    return _tmp
  end

  # Notes = (Note | SkipBlock)*
  def _Notes
    while true

      _save1 = self.pos
      while true # choice
        _tmp = apply(:_Note)
        break if _tmp
        self.pos = _save1
        _tmp = apply(:_SkipBlock)
        break if _tmp
        self.pos = _save1
        break
      end # end choice

      break unless _tmp
    end
    _tmp = true
    set_failed_rule :_Notes unless _tmp
    return _tmp
  end

  # RawNoteBlock = @StartList:a (!@BlankLine OptionallyIndentedLine:l { a << l })+ < @BlankLine* > { a << text } { a }
  def _RawNoteBlock

    _save = self.pos
    while true # sequence
      _tmp = _StartList()
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos

      _save2 = self.pos
      while true # sequence
        _save3 = self.pos
        _tmp = _BlankLine()
        _tmp = _tmp ? nil : true
        self.pos = _save3
        unless _tmp
          self.pos = _save2
          break
        end
        _tmp = apply(:_OptionallyIndentedLine)
        l = @result
        unless _tmp
          self.pos = _save2
          break
        end
        @result = begin;  a << l ; end
        _tmp = true
        unless _tmp
          self.pos = _save2
        end
        break
      end # end sequence

      if _tmp
        while true

          _save4 = self.pos
          while true # sequence
            _save5 = self.pos
            _tmp = _BlankLine()
            _tmp = _tmp ? nil : true
            self.pos = _save5
            unless _tmp
              self.pos = _save4
              break
            end
            _tmp = apply(:_OptionallyIndentedLine)
            l = @result
            unless _tmp
              self.pos = _save4
              break
            end
            @result = begin;  a << l ; end
            _tmp = true
            unless _tmp
              self.pos = _save4
            end
            break
          end # end sequence

          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save1
      end
      unless _tmp
        self.pos = _save
        break
      end
      _text_start = self.pos
      while true
        _tmp = _BlankLine()
        break unless _tmp
      end
      _tmp = true
      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  a << text ; end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  a ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_RawNoteBlock unless _tmp
    return _tmp
  end

  # CodeFence = &{ github? } Ticks3 (@Sp StrChunk:format)? Spnl < ((!"`" Nonspacechar)+ | !Ticks3 /`+/ | Spacechar | @Newline)+ > Ticks3 @Sp @Newline* { verbatim = RDoc::Markup::Verbatim.new text               verbatim.format = format.intern if format.instance_of?(String)               verbatim             }
  def _CodeFence

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = begin;  github? ; end
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Ticks3)
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos

      _save3 = self.pos
      while true # sequence
        _tmp = _Sp()
        unless _tmp
          self.pos = _save3
          break
        end
        _tmp = apply(:_StrChunk)
        format = @result
        unless _tmp
          self.pos = _save3
        end
        break
      end # end sequence

      unless _tmp
        _tmp = true
        self.pos = _save2
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Spnl)
      unless _tmp
        self.pos = _save
        break
      end
      _text_start = self.pos
      _save4 = self.pos

      _save5 = self.pos
      while true # choice
        _save6 = self.pos

        _save7 = self.pos
        while true # sequence
          _save8 = self.pos
          _tmp = match_string("`")
          _tmp = _tmp ? nil : true
          self.pos = _save8
          unless _tmp
            self.pos = _save7
            break
          end
          _tmp = apply(:_Nonspacechar)
          unless _tmp
            self.pos = _save7
          end
          break
        end # end sequence

        if _tmp
          while true

            _save9 = self.pos
            while true # sequence
              _save10 = self.pos
              _tmp = match_string("`")
              _tmp = _tmp ? nil : true
              self.pos = _save10
              unless _tmp
                self.pos = _save9
                break
              end
              _tmp = apply(:_Nonspacechar)
              unless _tmp
                self.pos = _save9
              end
              break
            end # end sequence

            break unless _tmp
          end
          _tmp = true
        else
          self.pos = _save6
        end
        break if _tmp
        self.pos = _save5

        _save11 = self.pos
        while true # sequence
          _save12 = self.pos
          _tmp = apply(:_Ticks3)
          _tmp = _tmp ? nil : true
          self.pos = _save12
          unless _tmp
            self.pos = _save11
            break
          end
          _tmp = scan(/\G(?-mix:`+)/)
          unless _tmp
            self.pos = _save11
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save5
        _tmp = apply(:_Spacechar)
        break if _tmp
        self.pos = _save5
        _tmp = _Newline()
        break if _tmp
        self.pos = _save5
        break
      end # end choice

      if _tmp
        while true

          _save13 = self.pos
          while true # choice
            _save14 = self.pos

            _save15 = self.pos
            while true # sequence
              _save16 = self.pos
              _tmp = match_string("`")
              _tmp = _tmp ? nil : true
              self.pos = _save16
              unless _tmp
                self.pos = _save15
                break
              end
              _tmp = apply(:_Nonspacechar)
              unless _tmp
                self.pos = _save15
              end
              break
            end # end sequence

            if _tmp
              while true

                _save17 = self.pos
                while true # sequence
                  _save18 = self.pos
                  _tmp = match_string("`")
                  _tmp = _tmp ? nil : true
                  self.pos = _save18
                  unless _tmp
                    self.pos = _save17
                    break
                  end
                  _tmp = apply(:_Nonspacechar)
                  unless _tmp
                    self.pos = _save17
                  end
                  break
                end # end sequence

                break unless _tmp
              end
              _tmp = true
            else
              self.pos = _save14
            end
            break if _tmp
            self.pos = _save13

            _save19 = self.pos
            while true # sequence
              _save20 = self.pos
              _tmp = apply(:_Ticks3)
              _tmp = _tmp ? nil : true
              self.pos = _save20
              unless _tmp
                self.pos = _save19
                break
              end
              _tmp = scan(/\G(?-mix:`+)/)
              unless _tmp
                self.pos = _save19
              end
              break
            end # end sequence

            break if _tmp
            self.pos = _save13
            _tmp = apply(:_Spacechar)
            break if _tmp
            self.pos = _save13
            _tmp = _Newline()
            break if _tmp
            self.pos = _save13
            break
          end # end choice

          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save4
      end
      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Ticks3)
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Sp()
      unless _tmp
        self.pos = _save
        break
      end
      while true
        _tmp = _Newline()
        break unless _tmp
      end
      _tmp = true
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  verbatim = RDoc::Markup::Verbatim.new text
              verbatim.format = format.intern if format.instance_of?(String)
              verbatim
            ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_CodeFence unless _tmp
    return _tmp
  end

  # Table = &{ github? } TableRow:header TableLine:line TableRow+:body { table = RDoc::Markup::Table.new(header, line, body) }
  def _Table

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = begin;  github? ; end
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_TableRow)
      header = @result
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_TableLine)
      line = @result
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos
      _ary = []
      _tmp = apply(:_TableRow)
      if _tmp
        _ary << @result
        while true
          _tmp = apply(:_TableRow)
          _ary << @result if _tmp
          break unless _tmp
        end
        _tmp = true
        @result = _ary
      else
        self.pos = _save2
      end
      body = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  table = RDoc::Markup::Table.new(header, line, body) ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_Table unless _tmp
    return _tmp
  end

  # TableRow = TableItem+:row "|" @Newline { row }
  def _TableRow

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _ary = []
      _tmp = apply(:_TableItem)
      if _tmp
        _ary << @result
        while true
          _tmp = apply(:_TableItem)
          _ary << @result if _tmp
          break unless _tmp
        end
        _tmp = true
        @result = _ary
      else
        self.pos = _save1
      end
      row = @result
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("|")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Newline()
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  row ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_TableRow unless _tmp
    return _tmp
  end

  # TableItem = "|" < (!"|" !@Newline .)+ > { text.strip }
  def _TableItem

    _save = self.pos
    while true # sequence
      _tmp = match_string("|")
      unless _tmp
        self.pos = _save
        break
      end
      _text_start = self.pos
      _save1 = self.pos

      _save2 = self.pos
      while true # sequence
        _save3 = self.pos
        _tmp = match_string("|")
        _tmp = _tmp ? nil : true
        self.pos = _save3
        unless _tmp
          self.pos = _save2
          break
        end
        _save4 = self.pos
        _tmp = _Newline()
        _tmp = _tmp ? nil : true
        self.pos = _save4
        unless _tmp
          self.pos = _save2
          break
        end
        _tmp = get_byte
        unless _tmp
          self.pos = _save2
        end
        break
      end # end sequence

      if _tmp
        while true

          _save5 = self.pos
          while true # sequence
            _save6 = self.pos
            _tmp = match_string("|")
            _tmp = _tmp ? nil : true
            self.pos = _save6
            unless _tmp
              self.pos = _save5
              break
            end
            _save7 = self.pos
            _tmp = _Newline()
            _tmp = _tmp ? nil : true
            self.pos = _save7
            unless _tmp
              self.pos = _save5
              break
            end
            _tmp = get_byte
            unless _tmp
              self.pos = _save5
            end
            break
          end # end sequence

          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save1
      end
      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  text.strip ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_TableItem unless _tmp
    return _tmp
  end

  # TableLine = TableColumn+:line "|" @Newline { line }
  def _TableLine

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _ary = []
      _tmp = apply(:_TableColumn)
      if _tmp
        _ary << @result
        while true
          _tmp = apply(:_TableColumn)
          _ary << @result if _tmp
          break unless _tmp
        end
        _tmp = true
        @result = _ary
      else
        self.pos = _save1
      end
      line = @result
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string("|")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Newline()
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  line ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_TableLine unless _tmp
    return _tmp
  end

  # TableColumn = "|" < ("-"+ ":"? | ":" "-"*) > { text.start_with?(":") ? :left :                 text.end_with?(":") ? :right : nil               }
  def _TableColumn

    _save = self.pos
    while true # sequence
      _tmp = match_string("|")
      unless _tmp
        self.pos = _save
        break
      end
      _text_start = self.pos

      _save1 = self.pos
      while true # choice

        _save2 = self.pos
        while true # sequence
          _save3 = self.pos
          _tmp = match_string("-")
          if _tmp
            while true
              _tmp = match_string("-")
              break unless _tmp
            end
            _tmp = true
          else
            self.pos = _save3
          end
          unless _tmp
            self.pos = _save2
            break
          end
          _save4 = self.pos
          _tmp = match_string(":")
          unless _tmp
            _tmp = true
            self.pos = _save4
          end
          unless _tmp
            self.pos = _save2
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save1

        _save5 = self.pos
        while true # sequence
          _tmp = match_string(":")
          unless _tmp
            self.pos = _save5
            break
          end
          while true
            _tmp = match_string("-")
            break unless _tmp
          end
          _tmp = true
          unless _tmp
            self.pos = _save5
          end
          break
        end # end sequence

        break if _tmp
        self.pos = _save1
        break
      end # end choice

      if _tmp
        text = get_text(_text_start)
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  text.start_with?(":") ? :left :
                text.end_with?(":") ? :right : nil
              ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_TableColumn unless _tmp
    return _tmp
  end

  # DefinitionList = &{ definition_lists? } DefinitionListItem+:list { RDoc::Markup::List.new :NOTE, *list.flatten }
  def _DefinitionList

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _tmp = begin;  definition_lists? ; end
      self.pos = _save1
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos
      _ary = []
      _tmp = apply(:_DefinitionListItem)
      if _tmp
        _ary << @result
        while true
          _tmp = apply(:_DefinitionListItem)
          _ary << @result if _tmp
          break unless _tmp
        end
        _tmp = true
        @result = _ary
      else
        self.pos = _save2
      end
      list = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  RDoc::Markup::List.new :NOTE, *list.flatten ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_DefinitionList unless _tmp
    return _tmp
  end

  # DefinitionListItem = DefinitionListLabel+:label DefinitionListDefinition+:defns { list_items = []                        list_items <<                          RDoc::Markup::ListItem.new(label, defns.shift)                         list_items.concat defns.map { |defn|                          RDoc::Markup::ListItem.new nil, defn                        } unless list_items.empty?                         list_items                      }
  def _DefinitionListItem

    _save = self.pos
    while true # sequence
      _save1 = self.pos
      _ary = []
      _tmp = apply(:_DefinitionListLabel)
      if _tmp
        _ary << @result
        while true
          _tmp = apply(:_DefinitionListLabel)
          _ary << @result if _tmp
          break unless _tmp
        end
        _tmp = true
        @result = _ary
      else
        self.pos = _save1
      end
      label = @result
      unless _tmp
        self.pos = _save
        break
      end
      _save2 = self.pos
      _ary = []
      _tmp = apply(:_DefinitionListDefinition)
      if _tmp
        _ary << @result
        while true
          _tmp = apply(:_DefinitionListDefinition)
          _ary << @result if _tmp
          break unless _tmp
        end
        _tmp = true
        @result = _ary
      else
        self.pos = _save2
      end
      defns = @result
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  list_items = []
                       list_items <<
                         RDoc::Markup::ListItem.new(label, defns.shift)

                       list_items.concat defns.map { |defn|
                         RDoc::Markup::ListItem.new nil, defn
                       } unless list_items.empty?

                       list_items
                     ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_DefinitionListItem unless _tmp
    return _tmp
  end

  # DefinitionListLabel = StrChunk:label @Sp @Newline { label }
  def _DefinitionListLabel

    _save = self.pos
    while true # sequence
      _tmp = apply(:_StrChunk)
      label = @result
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Sp()
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Newline()
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  label ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_DefinitionListLabel unless _tmp
    return _tmp
  end

  # DefinitionListDefinition = @NonindentSpace ":" @Space Inlines:a @BlankLine+ { paragraph a }
  def _DefinitionListDefinition

    _save = self.pos
    while true # sequence
      _tmp = _NonindentSpace()
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = match_string(":")
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = _Space()
      unless _tmp
        self.pos = _save
        break
      end
      _tmp = apply(:_Inlines)
      a = @result
      unless _tmp
        self.pos = _save
        break
      end
      _save1 = self.pos
      _tmp = _BlankLine()
      if _tmp
        while true
          _tmp = _BlankLine()
          break unless _tmp
        end
        _tmp = true
      else
        self.pos = _save1
      end
      unless _tmp
        self.pos = _save
        break
      end
      @result = begin;  paragraph a ; end
      _tmp = true
      unless _tmp
        self.pos = _save
      end
      break
    end # end sequence

    set_failed_rule :_DefinitionListDefinition unless _tmp
    return _tmp
  end

  Rules = {}
  Rules[:_root] = rule_info("root", "Doc")
  Rules[:_Doc] = rule_info("Doc", "BOM? Block*:a { RDoc::Markup::Document.new(*a.compact) }")
  Rules[:_Block] = rule_info("Block", "@BlankLine* (BlockQuote | Verbatim | CodeFence | Table | Note | Reference | HorizontalRule | Heading | OrderedList | BulletList | DefinitionList | HtmlBlock | StyleBlock | Para | Plain)")
  Rules[:_Para] = rule_info("Para", "@NonindentSpace Inlines:a @BlankLine+ { paragraph a }")
  Rules[:_Plain] = rule_info("Plain", "Inlines:a { paragraph a }")
  Rules[:_AtxInline] = rule_info("AtxInline", "!@Newline !(@Sp /\#*/ @Sp @Newline) Inline")
  Rules[:_AtxStart] = rule_info("AtxStart", "< /\\\#{1,6}/ > { text.length }")
  Rules[:_AtxHeading] = rule_info("AtxHeading", "AtxStart:s @Sp AtxInline+:a (@Sp /\#*/ @Sp)? @Newline { RDoc::Markup::Heading.new(s, a.join) }")
  Rules[:_SetextHeading] = rule_info("SetextHeading", "(SetextHeading1 | SetextHeading2)")
  Rules[:_SetextBottom1] = rule_info("SetextBottom1", "/={1,}/ @Newline")
  Rules[:_SetextBottom2] = rule_info("SetextBottom2", "/-{1,}/ @Newline")
  Rules[:_SetextHeading1] = rule_info("SetextHeading1", "&(@RawLine SetextBottom1) @StartList:a (!@Endline Inline:b { a << b })+ @Sp @Newline SetextBottom1 { RDoc::Markup::Heading.new(1, a.join) }")
  Rules[:_SetextHeading2] = rule_info("SetextHeading2", "&(@RawLine SetextBottom2) @StartList:a (!@Endline Inline:b { a << b })+ @Sp @Newline SetextBottom2 { RDoc::Markup::Heading.new(2, a.join) }")
  Rules[:_Heading] = rule_info("Heading", "(SetextHeading | AtxHeading)")
  Rules[:_BlockQuote] = rule_info("BlockQuote", "BlockQuoteRaw:a { RDoc::Markup::BlockQuote.new(*a) }")
  Rules[:_BlockQuoteRaw] = rule_info("BlockQuoteRaw", "@StartList:a (\">\" \" \"? Line:l { a << l } (!\">\" !@BlankLine Line:c { a << c })* (@BlankLine:n { a << n })*)+ { inner_parse a.join }")
  Rules[:_NonblankIndentedLine] = rule_info("NonblankIndentedLine", "!@BlankLine IndentedLine")
  Rules[:_VerbatimChunk] = rule_info("VerbatimChunk", "@BlankLine*:a NonblankIndentedLine+:b { a.concat b }")
  Rules[:_Verbatim] = rule_info("Verbatim", "VerbatimChunk+:a { RDoc::Markup::Verbatim.new(*a.flatten) }")
  Rules[:_HorizontalRule] = rule_info("HorizontalRule", "@NonindentSpace (\"*\" @Sp \"*\" @Sp \"*\" (@Sp \"*\")* | \"-\" @Sp \"-\" @Sp \"-\" (@Sp \"-\")* | \"_\" @Sp \"_\" @Sp \"_\" (@Sp \"_\")*) @Sp @Newline @BlankLine+ { RDoc::Markup::Rule.new 1 }")
  Rules[:_Bullet] = rule_info("Bullet", "!HorizontalRule @NonindentSpace /[+*-]/ @Spacechar+")
  Rules[:_BulletList] = rule_info("BulletList", "&Bullet (ListTight | ListLoose):a { RDoc::Markup::List.new(:BULLET, *a) }")
  Rules[:_ListTight] = rule_info("ListTight", "ListItemTight+:a @BlankLine* !(Bullet | Enumerator) { a }")
  Rules[:_ListLoose] = rule_info("ListLoose", "@StartList:a (ListItem:b @BlankLine* { a << b })+ { a }")
  Rules[:_ListItem] = rule_info("ListItem", "(Bullet | Enumerator) @StartList:a ListBlock:b { a << b } (ListContinuationBlock:c { a.push(*c) })* { list_item_from a }")
  Rules[:_ListItemTight] = rule_info("ListItemTight", "(Bullet | Enumerator) ListBlock:a (!@BlankLine ListContinuationBlock:b { a.push(*b) })* !ListContinuationBlock { list_item_from a }")
  Rules[:_ListBlock] = rule_info("ListBlock", "!@BlankLine Line:a ListBlockLine*:c { [a, *c] }")
  Rules[:_ListContinuationBlock] = rule_info("ListContinuationBlock", "@StartList:a @BlankLine* { a << \"\\n\" } (Indent ListBlock:b { a.concat b })+ { a }")
  Rules[:_Enumerator] = rule_info("Enumerator", "@NonindentSpace [0-9]+ \".\" @Spacechar+")
  Rules[:_OrderedList] = rule_info("OrderedList", "&Enumerator (ListTight | ListLoose):a { RDoc::Markup::List.new(:NUMBER, *a) }")
  Rules[:_ListBlockLine] = rule_info("ListBlockLine", "!@BlankLine !(Indent? (Bullet | Enumerator)) !HorizontalRule OptionallyIndentedLine")
  Rules[:_HtmlOpenAnchor] = rule_info("HtmlOpenAnchor", "\"<\" Spnl (\"a\" | \"A\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlCloseAnchor] = rule_info("HtmlCloseAnchor", "\"<\" Spnl \"/\" (\"a\" | \"A\") Spnl \">\"")
  Rules[:_HtmlAnchor] = rule_info("HtmlAnchor", "HtmlOpenAnchor (HtmlAnchor | !HtmlCloseAnchor .)* HtmlCloseAnchor")
  Rules[:_HtmlBlockOpenAddress] = rule_info("HtmlBlockOpenAddress", "\"<\" Spnl (\"address\" | \"ADDRESS\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseAddress] = rule_info("HtmlBlockCloseAddress", "\"<\" Spnl \"/\" (\"address\" | \"ADDRESS\") Spnl \">\"")
  Rules[:_HtmlBlockAddress] = rule_info("HtmlBlockAddress", "HtmlBlockOpenAddress (HtmlBlockAddress | !HtmlBlockCloseAddress .)* HtmlBlockCloseAddress")
  Rules[:_HtmlBlockOpenBlockquote] = rule_info("HtmlBlockOpenBlockquote", "\"<\" Spnl (\"blockquote\" | \"BLOCKQUOTE\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseBlockquote] = rule_info("HtmlBlockCloseBlockquote", "\"<\" Spnl \"/\" (\"blockquote\" | \"BLOCKQUOTE\") Spnl \">\"")
  Rules[:_HtmlBlockBlockquote] = rule_info("HtmlBlockBlockquote", "HtmlBlockOpenBlockquote (HtmlBlockBlockquote | !HtmlBlockCloseBlockquote .)* HtmlBlockCloseBlockquote")
  Rules[:_HtmlBlockOpenCenter] = rule_info("HtmlBlockOpenCenter", "\"<\" Spnl (\"center\" | \"CENTER\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseCenter] = rule_info("HtmlBlockCloseCenter", "\"<\" Spnl \"/\" (\"center\" | \"CENTER\") Spnl \">\"")
  Rules[:_HtmlBlockCenter] = rule_info("HtmlBlockCenter", "HtmlBlockOpenCenter (HtmlBlockCenter | !HtmlBlockCloseCenter .)* HtmlBlockCloseCenter")
  Rules[:_HtmlBlockOpenDir] = rule_info("HtmlBlockOpenDir", "\"<\" Spnl (\"dir\" | \"DIR\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseDir] = rule_info("HtmlBlockCloseDir", "\"<\" Spnl \"/\" (\"dir\" | \"DIR\") Spnl \">\"")
  Rules[:_HtmlBlockDir] = rule_info("HtmlBlockDir", "HtmlBlockOpenDir (HtmlBlockDir | !HtmlBlockCloseDir .)* HtmlBlockCloseDir")
  Rules[:_HtmlBlockOpenDiv] = rule_info("HtmlBlockOpenDiv", "\"<\" Spnl (\"div\" | \"DIV\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseDiv] = rule_info("HtmlBlockCloseDiv", "\"<\" Spnl \"/\" (\"div\" | \"DIV\") Spnl \">\"")
  Rules[:_HtmlBlockDiv] = rule_info("HtmlBlockDiv", "HtmlBlockOpenDiv (HtmlBlockDiv | !HtmlBlockCloseDiv .)* HtmlBlockCloseDiv")
  Rules[:_HtmlBlockOpenDl] = rule_info("HtmlBlockOpenDl", "\"<\" Spnl (\"dl\" | \"DL\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseDl] = rule_info("HtmlBlockCloseDl", "\"<\" Spnl \"/\" (\"dl\" | \"DL\") Spnl \">\"")
  Rules[:_HtmlBlockDl] = rule_info("HtmlBlockDl", "HtmlBlockOpenDl (HtmlBlockDl | !HtmlBlockCloseDl .)* HtmlBlockCloseDl")
  Rules[:_HtmlBlockOpenFieldset] = rule_info("HtmlBlockOpenFieldset", "\"<\" Spnl (\"fieldset\" | \"FIELDSET\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseFieldset] = rule_info("HtmlBlockCloseFieldset", "\"<\" Spnl \"/\" (\"fieldset\" | \"FIELDSET\") Spnl \">\"")
  Rules[:_HtmlBlockFieldset] = rule_info("HtmlBlockFieldset", "HtmlBlockOpenFieldset (HtmlBlockFieldset | !HtmlBlockCloseFieldset .)* HtmlBlockCloseFieldset")
  Rules[:_HtmlBlockOpenForm] = rule_info("HtmlBlockOpenForm", "\"<\" Spnl (\"form\" | \"FORM\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseForm] = rule_info("HtmlBlockCloseForm", "\"<\" Spnl \"/\" (\"form\" | \"FORM\") Spnl \">\"")
  Rules[:_HtmlBlockForm] = rule_info("HtmlBlockForm", "HtmlBlockOpenForm (HtmlBlockForm | !HtmlBlockCloseForm .)* HtmlBlockCloseForm")
  Rules[:_HtmlBlockOpenH1] = rule_info("HtmlBlockOpenH1", "\"<\" Spnl (\"h1\" | \"H1\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseH1] = rule_info("HtmlBlockCloseH1", "\"<\" Spnl \"/\" (\"h1\" | \"H1\") Spnl \">\"")
  Rules[:_HtmlBlockH1] = rule_info("HtmlBlockH1", "HtmlBlockOpenH1 (HtmlBlockH1 | !HtmlBlockCloseH1 .)* HtmlBlockCloseH1")
  Rules[:_HtmlBlockOpenH2] = rule_info("HtmlBlockOpenH2", "\"<\" Spnl (\"h2\" | \"H2\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseH2] = rule_info("HtmlBlockCloseH2", "\"<\" Spnl \"/\" (\"h2\" | \"H2\") Spnl \">\"")
  Rules[:_HtmlBlockH2] = rule_info("HtmlBlockH2", "HtmlBlockOpenH2 (HtmlBlockH2 | !HtmlBlockCloseH2 .)* HtmlBlockCloseH2")
  Rules[:_HtmlBlockOpenH3] = rule_info("HtmlBlockOpenH3", "\"<\" Spnl (\"h3\" | \"H3\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseH3] = rule_info("HtmlBlockCloseH3", "\"<\" Spnl \"/\" (\"h3\" | \"H3\") Spnl \">\"")
  Rules[:_HtmlBlockH3] = rule_info("HtmlBlockH3", "HtmlBlockOpenH3 (HtmlBlockH3 | !HtmlBlockCloseH3 .)* HtmlBlockCloseH3")
  Rules[:_HtmlBlockOpenH4] = rule_info("HtmlBlockOpenH4", "\"<\" Spnl (\"h4\" | \"H4\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseH4] = rule_info("HtmlBlockCloseH4", "\"<\" Spnl \"/\" (\"h4\" | \"H4\") Spnl \">\"")
  Rules[:_HtmlBlockH4] = rule_info("HtmlBlockH4", "HtmlBlockOpenH4 (HtmlBlockH4 | !HtmlBlockCloseH4 .)* HtmlBlockCloseH4")
  Rules[:_HtmlBlockOpenH5] = rule_info("HtmlBlockOpenH5", "\"<\" Spnl (\"h5\" | \"H5\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseH5] = rule_info("HtmlBlockCloseH5", "\"<\" Spnl \"/\" (\"h5\" | \"H5\") Spnl \">\"")
  Rules[:_HtmlBlockH5] = rule_info("HtmlBlockH5", "HtmlBlockOpenH5 (HtmlBlockH5 | !HtmlBlockCloseH5 .)* HtmlBlockCloseH5")
  Rules[:_HtmlBlockOpenH6] = rule_info("HtmlBlockOpenH6", "\"<\" Spnl (\"h6\" | \"H6\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseH6] = rule_info("HtmlBlockCloseH6", "\"<\" Spnl \"/\" (\"h6\" | \"H6\") Spnl \">\"")
  Rules[:_HtmlBlockH6] = rule_info("HtmlBlockH6", "HtmlBlockOpenH6 (HtmlBlockH6 | !HtmlBlockCloseH6 .)* HtmlBlockCloseH6")
  Rules[:_HtmlBlockOpenMenu] = rule_info("HtmlBlockOpenMenu", "\"<\" Spnl (\"menu\" | \"MENU\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseMenu] = rule_info("HtmlBlockCloseMenu", "\"<\" Spnl \"/\" (\"menu\" | \"MENU\") Spnl \">\"")
  Rules[:_HtmlBlockMenu] = rule_info("HtmlBlockMenu", "HtmlBlockOpenMenu (HtmlBlockMenu | !HtmlBlockCloseMenu .)* HtmlBlockCloseMenu")
  Rules[:_HtmlBlockOpenNoframes] = rule_info("HtmlBlockOpenNoframes", "\"<\" Spnl (\"noframes\" | \"NOFRAMES\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseNoframes] = rule_info("HtmlBlockCloseNoframes", "\"<\" Spnl \"/\" (\"noframes\" | \"NOFRAMES\") Spnl \">\"")
  Rules[:_HtmlBlockNoframes] = rule_info("HtmlBlockNoframes", "HtmlBlockOpenNoframes (HtmlBlockNoframes | !HtmlBlockCloseNoframes .)* HtmlBlockCloseNoframes")
  Rules[:_HtmlBlockOpenNoscript] = rule_info("HtmlBlockOpenNoscript", "\"<\" Spnl (\"noscript\" | \"NOSCRIPT\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseNoscript] = rule_info("HtmlBlockCloseNoscript", "\"<\" Spnl \"/\" (\"noscript\" | \"NOSCRIPT\") Spnl \">\"")
  Rules[:_HtmlBlockNoscript] = rule_info("HtmlBlockNoscript", "HtmlBlockOpenNoscript (HtmlBlockNoscript | !HtmlBlockCloseNoscript .)* HtmlBlockCloseNoscript")
  Rules[:_HtmlBlockOpenOl] = rule_info("HtmlBlockOpenOl", "\"<\" Spnl (\"ol\" | \"OL\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseOl] = rule_info("HtmlBlockCloseOl", "\"<\" Spnl \"/\" (\"ol\" | \"OL\") Spnl \">\"")
  Rules[:_HtmlBlockOl] = rule_info("HtmlBlockOl", "HtmlBlockOpenOl (HtmlBlockOl | !HtmlBlockCloseOl .)* HtmlBlockCloseOl")
  Rules[:_HtmlBlockOpenP] = rule_info("HtmlBlockOpenP", "\"<\" Spnl (\"p\" | \"P\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseP] = rule_info("HtmlBlockCloseP", "\"<\" Spnl \"/\" (\"p\" | \"P\") Spnl \">\"")
  Rules[:_HtmlBlockP] = rule_info("HtmlBlockP", "HtmlBlockOpenP (HtmlBlockP | !HtmlBlockCloseP .)* HtmlBlockCloseP")
  Rules[:_HtmlBlockOpenPre] = rule_info("HtmlBlockOpenPre", "\"<\" Spnl (\"pre\" | \"PRE\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockClosePre] = rule_info("HtmlBlockClosePre", "\"<\" Spnl \"/\" (\"pre\" | \"PRE\") Spnl \">\"")
  Rules[:_HtmlBlockPre] = rule_info("HtmlBlockPre", "HtmlBlockOpenPre (HtmlBlockPre | !HtmlBlockClosePre .)* HtmlBlockClosePre")
  Rules[:_HtmlBlockOpenTable] = rule_info("HtmlBlockOpenTable", "\"<\" Spnl (\"table\" | \"TABLE\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseTable] = rule_info("HtmlBlockCloseTable", "\"<\" Spnl \"/\" (\"table\" | \"TABLE\") Spnl \">\"")
  Rules[:_HtmlBlockTable] = rule_info("HtmlBlockTable", "HtmlBlockOpenTable (HtmlBlockTable | !HtmlBlockCloseTable .)* HtmlBlockCloseTable")
  Rules[:_HtmlBlockOpenUl] = rule_info("HtmlBlockOpenUl", "\"<\" Spnl (\"ul\" | \"UL\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseUl] = rule_info("HtmlBlockCloseUl", "\"<\" Spnl \"/\" (\"ul\" | \"UL\") Spnl \">\"")
  Rules[:_HtmlBlockUl] = rule_info("HtmlBlockUl", "HtmlBlockOpenUl (HtmlBlockUl | !HtmlBlockCloseUl .)* HtmlBlockCloseUl")
  Rules[:_HtmlBlockOpenDd] = rule_info("HtmlBlockOpenDd", "\"<\" Spnl (\"dd\" | \"DD\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseDd] = rule_info("HtmlBlockCloseDd", "\"<\" Spnl \"/\" (\"dd\" | \"DD\") Spnl \">\"")
  Rules[:_HtmlBlockDd] = rule_info("HtmlBlockDd", "HtmlBlockOpenDd (HtmlBlockDd | !HtmlBlockCloseDd .)* HtmlBlockCloseDd")
  Rules[:_HtmlBlockOpenDt] = rule_info("HtmlBlockOpenDt", "\"<\" Spnl (\"dt\" | \"DT\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseDt] = rule_info("HtmlBlockCloseDt", "\"<\" Spnl \"/\" (\"dt\" | \"DT\") Spnl \">\"")
  Rules[:_HtmlBlockDt] = rule_info("HtmlBlockDt", "HtmlBlockOpenDt (HtmlBlockDt | !HtmlBlockCloseDt .)* HtmlBlockCloseDt")
  Rules[:_HtmlBlockOpenFrameset] = rule_info("HtmlBlockOpenFrameset", "\"<\" Spnl (\"frameset\" | \"FRAMESET\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseFrameset] = rule_info("HtmlBlockCloseFrameset", "\"<\" Spnl \"/\" (\"frameset\" | \"FRAMESET\") Spnl \">\"")
  Rules[:_HtmlBlockFrameset] = rule_info("HtmlBlockFrameset", "HtmlBlockOpenFrameset (HtmlBlockFrameset | !HtmlBlockCloseFrameset .)* HtmlBlockCloseFrameset")
  Rules[:_HtmlBlockOpenLi] = rule_info("HtmlBlockOpenLi", "\"<\" Spnl (\"li\" | \"LI\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseLi] = rule_info("HtmlBlockCloseLi", "\"<\" Spnl \"/\" (\"li\" | \"LI\") Spnl \">\"")
  Rules[:_HtmlBlockLi] = rule_info("HtmlBlockLi", "HtmlBlockOpenLi (HtmlBlockLi | !HtmlBlockCloseLi .)* HtmlBlockCloseLi")
  Rules[:_HtmlBlockOpenTbody] = rule_info("HtmlBlockOpenTbody", "\"<\" Spnl (\"tbody\" | \"TBODY\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseTbody] = rule_info("HtmlBlockCloseTbody", "\"<\" Spnl \"/\" (\"tbody\" | \"TBODY\") Spnl \">\"")
  Rules[:_HtmlBlockTbody] = rule_info("HtmlBlockTbody", "HtmlBlockOpenTbody (HtmlBlockTbody | !HtmlBlockCloseTbody .)* HtmlBlockCloseTbody")
  Rules[:_HtmlBlockOpenTd] = rule_info("HtmlBlockOpenTd", "\"<\" Spnl (\"td\" | \"TD\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseTd] = rule_info("HtmlBlockCloseTd", "\"<\" Spnl \"/\" (\"td\" | \"TD\") Spnl \">\"")
  Rules[:_HtmlBlockTd] = rule_info("HtmlBlockTd", "HtmlBlockOpenTd (HtmlBlockTd | !HtmlBlockCloseTd .)* HtmlBlockCloseTd")
  Rules[:_HtmlBlockOpenTfoot] = rule_info("HtmlBlockOpenTfoot", "\"<\" Spnl (\"tfoot\" | \"TFOOT\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseTfoot] = rule_info("HtmlBlockCloseTfoot", "\"<\" Spnl \"/\" (\"tfoot\" | \"TFOOT\") Spnl \">\"")
  Rules[:_HtmlBlockTfoot] = rule_info("HtmlBlockTfoot", "HtmlBlockOpenTfoot (HtmlBlockTfoot | !HtmlBlockCloseTfoot .)* HtmlBlockCloseTfoot")
  Rules[:_HtmlBlockOpenTh] = rule_info("HtmlBlockOpenTh", "\"<\" Spnl (\"th\" | \"TH\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseTh] = rule_info("HtmlBlockCloseTh", "\"<\" Spnl \"/\" (\"th\" | \"TH\") Spnl \">\"")
  Rules[:_HtmlBlockTh] = rule_info("HtmlBlockTh", "HtmlBlockOpenTh (HtmlBlockTh | !HtmlBlockCloseTh .)* HtmlBlockCloseTh")
  Rules[:_HtmlBlockOpenThead] = rule_info("HtmlBlockOpenThead", "\"<\" Spnl (\"thead\" | \"THEAD\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseThead] = rule_info("HtmlBlockCloseThead", "\"<\" Spnl \"/\" (\"thead\" | \"THEAD\") Spnl \">\"")
  Rules[:_HtmlBlockThead] = rule_info("HtmlBlockThead", "HtmlBlockOpenThead (HtmlBlockThead | !HtmlBlockCloseThead .)* HtmlBlockCloseThead")
  Rules[:_HtmlBlockOpenTr] = rule_info("HtmlBlockOpenTr", "\"<\" Spnl (\"tr\" | \"TR\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseTr] = rule_info("HtmlBlockCloseTr", "\"<\" Spnl \"/\" (\"tr\" | \"TR\") Spnl \">\"")
  Rules[:_HtmlBlockTr] = rule_info("HtmlBlockTr", "HtmlBlockOpenTr (HtmlBlockTr | !HtmlBlockCloseTr .)* HtmlBlockCloseTr")
  Rules[:_HtmlBlockOpenScript] = rule_info("HtmlBlockOpenScript", "\"<\" Spnl (\"script\" | \"SCRIPT\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseScript] = rule_info("HtmlBlockCloseScript", "\"<\" Spnl \"/\" (\"script\" | \"SCRIPT\") Spnl \">\"")
  Rules[:_HtmlBlockScript] = rule_info("HtmlBlockScript", "HtmlBlockOpenScript (!HtmlBlockCloseScript .)* HtmlBlockCloseScript")
  Rules[:_HtmlBlockOpenHead] = rule_info("HtmlBlockOpenHead", "\"<\" Spnl (\"head\" | \"HEAD\") Spnl HtmlAttribute* \">\"")
  Rules[:_HtmlBlockCloseHead] = rule_info("HtmlBlockCloseHead", "\"<\" Spnl \"/\" (\"head\" | \"HEAD\") Spnl \">\"")
  Rules[:_HtmlBlockHead] = rule_info("HtmlBlockHead", "HtmlBlockOpenHead (!HtmlBlockCloseHead .)* HtmlBlockCloseHead")
  Rules[:_HtmlBlockInTags] = rule_info("HtmlBlockInTags", "(HtmlAnchor | HtmlBlockAddress | HtmlBlockBlockquote | HtmlBlockCenter | HtmlBlockDir | HtmlBlockDiv | HtmlBlockDl | HtmlBlockFieldset | HtmlBlockForm | HtmlBlockH1 | HtmlBlockH2 | HtmlBlockH3 | HtmlBlockH4 | HtmlBlockH5 | HtmlBlockH6 | HtmlBlockMenu | HtmlBlockNoframes | HtmlBlockNoscript | HtmlBlockOl | HtmlBlockP | HtmlBlockPre | HtmlBlockTable | HtmlBlockUl | HtmlBlockDd | HtmlBlockDt | HtmlBlockFrameset | HtmlBlockLi | HtmlBlockTbody | HtmlBlockTd | HtmlBlockTfoot | HtmlBlockTh | HtmlBlockThead | HtmlBlockTr | HtmlBlockScript | HtmlBlockHead)")
  Rules[:_HtmlBlock] = rule_info("HtmlBlock", "< (HtmlBlockInTags | HtmlComment | HtmlBlockSelfClosing | HtmlUnclosed) > @BlankLine+ { if html? then                 RDoc::Markup::Raw.new text               end }")
  Rules[:_HtmlUnclosed] = rule_info("HtmlUnclosed", "\"<\" Spnl HtmlUnclosedType Spnl HtmlAttribute* Spnl \">\"")
  Rules[:_HtmlUnclosedType] = rule_info("HtmlUnclosedType", "(\"HR\" | \"hr\")")
  Rules[:_HtmlBlockSelfClosing] = rule_info("HtmlBlockSelfClosing", "\"<\" Spnl HtmlBlockType Spnl HtmlAttribute* \"/\" Spnl \">\"")
  Rules[:_HtmlBlockType] = rule_info("HtmlBlockType", "(\"ADDRESS\" | \"BLOCKQUOTE\" | \"CENTER\" | \"DD\" | \"DIR\" | \"DIV\" | \"DL\" | \"DT\" | \"FIELDSET\" | \"FORM\" | \"FRAMESET\" | \"H1\" | \"H2\" | \"H3\" | \"H4\" | \"H5\" | \"H6\" | \"HR\" | \"ISINDEX\" | \"LI\" | \"MENU\" | \"NOFRAMES\" | \"NOSCRIPT\" | \"OL\" | \"P\" | \"PRE\" | \"SCRIPT\" | \"TABLE\" | \"TBODY\" | \"TD\" | \"TFOOT\" | \"TH\" | \"THEAD\" | \"TR\" | \"UL\" | \"address\" | \"blockquote\" | \"center\" | \"dd\" | \"dir\" | \"div\" | \"dl\" | \"dt\" | \"fieldset\" | \"form\" | \"frameset\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"hr\" | \"isindex\" | \"li\" | \"menu\" | \"noframes\" | \"noscript\" | \"ol\" | \"p\" | \"pre\" | \"script\" | \"table\" | \"tbody\" | \"td\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"ul\")")
  Rules[:_StyleOpen] = rule_info("StyleOpen", "\"<\" Spnl (\"style\" | \"STYLE\") Spnl HtmlAttribute* \">\"")
  Rules[:_StyleClose] = rule_info("StyleClose", "\"<\" Spnl \"/\" (\"style\" | \"STYLE\") Spnl \">\"")
  Rules[:_InStyleTags] = rule_info("InStyleTags", "StyleOpen (!StyleClose .)* StyleClose")
  Rules[:_StyleBlock] = rule_info("StyleBlock", "< InStyleTags > @BlankLine* { if css? then                     RDoc::Markup::Raw.new text                   end }")
  Rules[:_Inlines] = rule_info("Inlines", "(!@Endline Inline:i { i } | @Endline:c !(&{ github? } Ticks3 /[^`\\n]*$/) &Inline { c })+:chunks @Endline? { chunks }")
  Rules[:_Inline] = rule_info("Inline", "(Str | @Endline | UlOrStarLine | @Space | Strong | Emph | Strike | Image | Link | NoteReference | InlineNote | Code | RawHtml | Entity | EscapedChar | Symbol)")
  Rules[:_Space] = rule_info("Space", "@Spacechar+ { \" \" }")
  Rules[:_Str] = rule_info("Str", "@StartList:a < @NormalChar+ > { a = text } (StrChunk:c { a << c })* { a }")
  Rules[:_StrChunk] = rule_info("StrChunk", "< (@NormalChar | /_+/ &Alphanumeric)+ > { text }")
  Rules[:_EscapedChar] = rule_info("EscapedChar", "\"\\\\\" !@Newline < /[:\\\\`|*_{}\\[\\]()\#+.!><-]/ > { text }")
  Rules[:_Entity] = rule_info("Entity", "(HexEntity | DecEntity | CharEntity):a { a }")
  Rules[:_Endline] = rule_info("Endline", "(@LineBreak | @TerminalEndline | @NormalEndline)")
  Rules[:_NormalEndline] = rule_info("NormalEndline", "@Sp @Newline !@BlankLine !\">\" !AtxStart !(Line /={1,}|-{1,}/ @Newline) { \"\\n\" }")
  Rules[:_TerminalEndline] = rule_info("TerminalEndline", "@Sp @Newline @Eof")
  Rules[:_LineBreak] = rule_info("LineBreak", "\"  \" @NormalEndline { RDoc::Markup::HardBreak.new }")
  Rules[:_Symbol] = rule_info("Symbol", "< @SpecialChar > { text }")
  Rules[:_UlOrStarLine] = rule_info("UlOrStarLine", "(UlLine | StarLine):a { a }")
  Rules[:_StarLine] = rule_info("StarLine", "(< /\\*{4,}/ > { text } | < @Spacechar /\\*+/ &@Spacechar > { text })")
  Rules[:_UlLine] = rule_info("UlLine", "(< /_{4,}/ > { text } | < @Spacechar /_+/ &@Spacechar > { text })")
  Rules[:_Emph] = rule_info("Emph", "(EmphStar | EmphUl)")
  Rules[:_Whitespace] = rule_info("Whitespace", "(@Spacechar | @Newline)")
  Rules[:_EmphStar] = rule_info("EmphStar", "\"*\" !@Whitespace @StartList:a (!\"*\" Inline:b { a << b } | StrongStar:b { a << b })+ \"*\" { emphasis a.join }")
  Rules[:_EmphUl] = rule_info("EmphUl", "\"_\" !@Whitespace @StartList:a (!\"_\" Inline:b { a << b } | StrongUl:b { a << b })+ \"_\" { emphasis a.join }")
  Rules[:_Strong] = rule_info("Strong", "(StrongStar | StrongUl)")
  Rules[:_StrongStar] = rule_info("StrongStar", "\"**\" !@Whitespace @StartList:a (!\"**\" Inline:b { a << b })+ \"**\" { strong a.join }")
  Rules[:_StrongUl] = rule_info("StrongUl", "\"__\" !@Whitespace @StartList:a (!\"__\" Inline:b { a << b })+ \"__\" { strong a.join }")
  Rules[:_Strike] = rule_info("Strike", "&{ strike? } \"~~\" !@Whitespace @StartList:a (!\"~~\" Inline:b { a << b })+ \"~~\" { strike a.join }")
  Rules[:_Image] = rule_info("Image", "\"!\" (ExplicitLink | ReferenceLink):a { \"rdoc-image:\#{a[/\\[(.*)\\]/, 1]}\" }")
  Rules[:_Link] = rule_info("Link", "(ExplicitLink | ReferenceLink | AutoLink)")
  Rules[:_ReferenceLink] = rule_info("ReferenceLink", "(ReferenceLinkDouble | ReferenceLinkSingle)")
  Rules[:_ReferenceLinkDouble] = rule_info("ReferenceLinkDouble", "Label:content < Spnl > !\"[]\" Label:label { link_to content, label, text }")
  Rules[:_ReferenceLinkSingle] = rule_info("ReferenceLinkSingle", "Label:content < (Spnl \"[]\")? > { link_to content, content, text }")
  Rules[:_ExplicitLink] = rule_info("ExplicitLink", "Label:l \"(\" @Sp Source:s Spnl Title @Sp \")\" { \"{\#{l}}[\#{s}]\" }")
  Rules[:_Source] = rule_info("Source", "(\"<\" < SourceContents > \">\" | < SourceContents >) { text }")
  Rules[:_SourceContents] = rule_info("SourceContents", "((!\"(\" !\")\" !\">\" Nonspacechar)+ | \"(\" SourceContents \")\")*")
  Rules[:_Title] = rule_info("Title", "(TitleSingle | TitleDouble | \"\"):a { a }")
  Rules[:_TitleSingle] = rule_info("TitleSingle", "\"'\" (!(\"'\" @Sp (\")\" | @Newline)) .)* \"'\"")
  Rules[:_TitleDouble] = rule_info("TitleDouble", "\"\\\"\" (!(\"\\\"\" @Sp (\")\" | @Newline)) .)* \"\\\"\"")
  Rules[:_AutoLink] = rule_info("AutoLink", "(AutoLinkUrl | AutoLinkEmail)")
  Rules[:_AutoLinkUrl] = rule_info("AutoLinkUrl", "\"<\" < /[A-Za-z]+/ \"://\" (!@Newline !\">\" .)+ > \">\" { text }")
  Rules[:_AutoLinkEmail] = rule_info("AutoLinkEmail", "\"<\" \"mailto:\"? < /[\\w+.\\/!%~$-]+/i \"@\" (!@Newline !\">\" .)+ > \">\" { \"mailto:\#{text}\" }")
  Rules[:_Reference] = rule_info("Reference", "@NonindentSpace !\"[]\" Label:label \":\" Spnl RefSrc:link RefTitle @BlankLine+ { \# TODO use title               reference label, link               nil             }")
  Rules[:_Label] = rule_info("Label", "\"[\" (!\"^\" &{ notes? } | &. &{ !notes? }) @StartList:a (!\"]\" Inline:l { a << l })* \"]\" { a.join.gsub(/\\s+/, ' ') }")
  Rules[:_RefSrc] = rule_info("RefSrc", "< Nonspacechar+ > { text }")
  Rules[:_RefTitle] = rule_info("RefTitle", "(RefTitleSingle | RefTitleDouble | RefTitleParens | EmptyTitle)")
  Rules[:_EmptyTitle] = rule_info("EmptyTitle", "\"\"")
  Rules[:_RefTitleSingle] = rule_info("RefTitleSingle", "Spnl \"'\" < (!(\"'\" @Sp @Newline | @Newline) .)* > \"'\" { text }")
  Rules[:_RefTitleDouble] = rule_info("RefTitleDouble", "Spnl \"\\\"\" < (!(\"\\\"\" @Sp @Newline | @Newline) .)* > \"\\\"\" { text }")
  Rules[:_RefTitleParens] = rule_info("RefTitleParens", "Spnl \"(\" < (!(\")\" @Sp @Newline | @Newline) .)* > \")\" { text }")
  Rules[:_References] = rule_info("References", "(Reference | SkipBlock)*")
  Rules[:_Ticks1] = rule_info("Ticks1", "\"`\" !\"`\"")
  Rules[:_Ticks2] = rule_info("Ticks2", "\"``\" !\"`\"")
  Rules[:_Ticks3] = rule_info("Ticks3", "\"```\" !\"`\"")
  Rules[:_Ticks4] = rule_info("Ticks4", "\"````\" !\"`\"")
  Rules[:_Ticks5] = rule_info("Ticks5", "\"`````\" !\"`\"")
  Rules[:_Code] = rule_info("Code", "(Ticks1 @Sp < ((!\"`\" Nonspacechar)+ | !Ticks1 /`+/ | !(@Sp Ticks1) (@Spacechar | @Newline !@BlankLine))+ > @Sp Ticks1 | Ticks2 @Sp < ((!\"`\" Nonspacechar)+ | !Ticks2 /`+/ | !(@Sp Ticks2) (@Spacechar | @Newline !@BlankLine))+ > @Sp Ticks2 | Ticks3 @Sp < ((!\"`\" Nonspacechar)+ | !Ticks3 /`+/ | !(@Sp Ticks3) (@Spacechar | @Newline !@BlankLine))+ > @Sp Ticks3 | Ticks4 @Sp < ((!\"`\" Nonspacechar)+ | !Ticks4 /`+/ | !(@Sp Ticks4) (@Spacechar | @Newline !@BlankLine))+ > @Sp Ticks4 | Ticks5 @Sp < ((!\"`\" Nonspacechar)+ | !Ticks5 /`+/ | !(@Sp Ticks5) (@Spacechar | @Newline !@BlankLine))+ > @Sp Ticks5) { \"<code>\#{text}</code>\" }")
  Rules[:_RawHtml] = rule_info("RawHtml", "< (HtmlComment | HtmlBlockScript | HtmlTag) > { if html? then text else '' end }")
  Rules[:_BlankLine] = rule_info("BlankLine", "@Sp @Newline { \"\\n\" }")
  Rules[:_Quoted] = rule_info("Quoted", "(\"\\\"\" (!\"\\\"\" .)* \"\\\"\" | \"'\" (!\"'\" .)* \"'\")")
  Rules[:_HtmlAttribute] = rule_info("HtmlAttribute", "(AlphanumericAscii | \"-\")+ Spnl (\"=\" Spnl (Quoted | (!\">\" Nonspacechar)+))? Spnl")
  Rules[:_HtmlComment] = rule_info("HtmlComment", "\"<!--\" (!\"-->\" .)* \"-->\"")
  Rules[:_HtmlTag] = rule_info("HtmlTag", "\"<\" Spnl \"/\"? AlphanumericAscii+ Spnl HtmlAttribute* \"/\"? Spnl \">\"")
  Rules[:_Eof] = rule_info("Eof", "!.")
  Rules[:_Nonspacechar] = rule_info("Nonspacechar", "!@Spacechar !@Newline .")
  Rules[:_Sp] = rule_info("Sp", "@Spacechar*")
  Rules[:_Spnl] = rule_info("Spnl", "@Sp (@Newline @Sp)?")
  Rules[:_SpecialChar] = rule_info("SpecialChar", "(/[~*_`&\\[\\]()<!\#\\\\'\"]/ | @ExtendedSpecialChar)")
  Rules[:_NormalChar] = rule_info("NormalChar", "!(@SpecialChar | @Spacechar | @Newline) .")
  Rules[:_Digit] = rule_info("Digit", "[0-9]")
  Rules[:_Alphanumeric] = rule_info("Alphanumeric", "%literals.Alphanumeric")
  Rules[:_AlphanumericAscii] = rule_info("AlphanumericAscii", "%literals.AlphanumericAscii")
  Rules[:_BOM] = rule_info("BOM", "%literals.BOM")
  Rules[:_Newline] = rule_info("Newline", "%literals.Newline")
  Rules[:_Spacechar] = rule_info("Spacechar", "%literals.Spacechar")
  Rules[:_HexEntity] = rule_info("HexEntity", "/&\#x/i < /[0-9a-fA-F]+/ > \";\" { [text.to_i(16)].pack 'U' }")
  Rules[:_DecEntity] = rule_info("DecEntity", "\"&\#\" < /[0-9]+/ > \";\" { [text.to_i].pack 'U' }")
  Rules[:_CharEntity] = rule_info("CharEntity", "\"&\" < /[A-Za-z0-9]+/ > \";\" { if entity = HTML_ENTITIES[text] then                  entity.pack 'U*'                else                  \"&\#{text};\"                end              }")
  Rules[:_NonindentSpace] = rule_info("NonindentSpace", "/ {0,3}/")
  Rules[:_Indent] = rule_info("Indent", "/\\t|    /")
  Rules[:_IndentedLine] = rule_info("IndentedLine", "Indent Line")
  Rules[:_OptionallyIndentedLine] = rule_info("OptionallyIndentedLine", "Indent? Line")
  Rules[:_StartList] = rule_info("StartList", "&. { [] }")
  Rules[:_Line] = rule_info("Line", "@RawLine:a { a }")
  Rules[:_RawLine] = rule_info("RawLine", "(< (!\"\\r\" !\"\\n\" .)* @Newline > | < .+ > @Eof) { text }")
  Rules[:_SkipBlock] = rule_info("SkipBlock", "(HtmlBlock | (!\"\#\" !SetextBottom1 !SetextBottom2 !@BlankLine @RawLine)+ @BlankLine* | @BlankLine+ | @RawLine)")
  Rules[:_ExtendedSpecialChar] = rule_info("ExtendedSpecialChar", "&{ notes? } \"^\"")
  Rules[:_NoteReference] = rule_info("NoteReference", "&{ notes? } RawNoteReference:ref { note_for ref }")
  Rules[:_RawNoteReference] = rule_info("RawNoteReference", "\"[^\" < (!@Newline !\"]\" .)+ > \"]\" { text }")
  Rules[:_Note] = rule_info("Note", "&{ notes? } @NonindentSpace RawNoteReference:ref \":\" @Sp @StartList:a RawNoteBlock:i { a.concat i } (&Indent RawNoteBlock:i { a.concat i })* { @footnotes[ref] = paragraph a                    nil                 }")
  Rules[:_InlineNote] = rule_info("InlineNote", "&{ notes? } \"^[\" @StartList:a (!\"]\" Inline:l { a << l })+ \"]\" { ref = [:inline, @note_order.length]                @footnotes[ref] = paragraph a                 note_for ref              }")
  Rules[:_Notes] = rule_info("Notes", "(Note | SkipBlock)*")
  Rules[:_RawNoteBlock] = rule_info("RawNoteBlock", "@StartList:a (!@BlankLine OptionallyIndentedLine:l { a << l })+ < @BlankLine* > { a << text } { a }")
  Rules[:_CodeFence] = rule_info("CodeFence", "&{ github? } Ticks3 (@Sp StrChunk:format)? Spnl < ((!\"`\" Nonspacechar)+ | !Ticks3 /`+/ | Spacechar | @Newline)+ > Ticks3 @Sp @Newline* { verbatim = RDoc::Markup::Verbatim.new text               verbatim.format = format.intern if format.instance_of?(String)               verbatim             }")
  Rules[:_Table] = rule_info("Table", "&{ github? } TableRow:header TableLine:line TableRow+:body { table = RDoc::Markup::Table.new(header, line, body) }")
  Rules[:_TableRow] = rule_info("TableRow", "TableItem+:row \"|\" @Newline { row }")
  Rules[:_TableItem] = rule_info("TableItem", "\"|\" < (!\"|\" !@Newline .)+ > { text.strip }")
  Rules[:_TableLine] = rule_info("TableLine", "TableColumn+:line \"|\" @Newline { line }")
  Rules[:_TableColumn] = rule_info("TableColumn", "\"|\" < (\"-\"+ \":\"? | \":\" \"-\"*) > { text.start_with?(\":\") ? :left :                 text.end_with?(\":\") ? :right : nil               }")
  Rules[:_DefinitionList] = rule_info("DefinitionList", "&{ definition_lists? } DefinitionListItem+:list { RDoc::Markup::List.new :NOTE, *list.flatten }")
  Rules[:_DefinitionListItem] = rule_info("DefinitionListItem", "DefinitionListLabel+:label DefinitionListDefinition+:defns { list_items = []                        list_items <<                          RDoc::Markup::ListItem.new(label, defns.shift)                         list_items.concat defns.map { |defn|                          RDoc::Markup::ListItem.new nil, defn                        } unless list_items.empty?                         list_items                      }")
  Rules[:_DefinitionListLabel] = rule_info("DefinitionListLabel", "StrChunk:label @Sp @Newline { label }")
  Rules[:_DefinitionListDefinition] = rule_info("DefinitionListDefinition", "@NonindentSpace \":\" @Space Inlines:a @BlankLine+ { paragraph a }")
  # :startdoc:
end
PK}$[e�3��/gems/gems/rdoc-6.4.1.1/lib/rdoc/token_stream.rbnu�[���# frozen_string_literal: true
##
# A TokenStream is a list of tokens, gathered during the parse of some entity
# (say a method). Entities populate these streams by being registered with the
# lexer. Any class can collect tokens by including TokenStream. From the
# outside, you use such an object by calling the start_collecting_tokens
# method, followed by calls to add_token and pop_token.

module RDoc::TokenStream

  ##
  # Converts +token_stream+ to HTML wrapping various tokens with
  # <tt><span></tt> elements. Some tokens types are wrapped in spans
  # with the given class names. Other token types are not wrapped in spans.

  def self.to_html token_stream
    starting_title = false

    token_stream.map do |t|
      next unless t

      style = case t[:kind]
              when :on_const   then 'ruby-constant'
              when :on_kw      then 'ruby-keyword'
              when :on_ivar    then 'ruby-ivar'
              when :on_cvar    then 'ruby-identifier'
              when :on_gvar    then 'ruby-identifier'
              when '=' != t[:text] && :on_op
                               then 'ruby-operator'
              when :on_tlambda then 'ruby-operator'
              when :on_ident   then 'ruby-identifier'
              when :on_label   then 'ruby-value'
              when :on_backref, :on_dstring
                               then 'ruby-node'
              when :on_comment then 'ruby-comment'
              when :on_embdoc  then 'ruby-comment'
              when :on_regexp  then 'ruby-regexp'
              when :on_tstring then 'ruby-string'
              when :on_int, :on_float,
                   :on_rational, :on_imaginary,
                   :on_heredoc,
                   :on_symbol, :on_CHAR then 'ruby-value'
              when :on_heredoc_beg, :on_heredoc_end
                               then 'ruby-identifier'
              end

      comment_with_nl = false
      if :on_comment == t[:kind] or :on_embdoc == t[:kind] or :on_heredoc_end == t[:kind]
        comment_with_nl = true if "\n" == t[:text][-1]
        text = t[:text].rstrip
      else
        text = t[:text]
      end

      if :on_ident == t[:kind] && starting_title
        starting_title = false
        style = 'ruby-identifier ruby-title'
      end

      if :on_kw == t[:kind] and 'def' == t[:text]
        starting_title = true
      end

      text = CGI.escapeHTML text

      if style then
        "<span class=\"#{style}\">#{text}</span>#{"\n" if comment_with_nl}"
      else
        text
      end
    end.join
  end

  ##
  # Adds +tokens+ to the collected tokens

  def add_tokens(tokens)
    @token_stream.concat(tokens)
  end

  ##
  # Adds one +token+ to the collected tokens

  def add_token(token)
    @token_stream.push(token)
  end

  ##
  # Starts collecting tokens

  def collect_tokens
    @token_stream = []
  end

  alias start_collecting_tokens collect_tokens

  ##
  # Remove the last token from the collected tokens

  def pop_token
    @token_stream.pop
  end

  ##
  # Current token stream

  def token_stream
    @token_stream
  end

  ##
  # Returns a string representation of the token stream

  def tokens_to_s
    token_stream.compact.map { |token| token[:text] }.join ''
  end

end

PK}$[�H"--,gems/gems/rdoc-6.4.1.1/lib/rdoc/top_level.rbnu�[���# frozen_string_literal: true
##
# A TopLevel context is a representation of the contents of a single file

class RDoc::TopLevel < RDoc::Context

  MARSHAL_VERSION = 0 # :nodoc:

  ##
  # This TopLevel's File::Stat struct

  attr_accessor :file_stat

  ##
  # Relative name of this file

  attr_accessor :relative_name

  ##
  # Absolute name of this file

  attr_accessor :absolute_name

  ##
  # All the classes or modules that were declared in
  # this file. These are assigned to either +#classes_hash+
  # or +#modules_hash+ once we know what they really are.

  attr_reader :classes_or_modules

  attr_accessor :diagram # :nodoc:

  ##
  # The parser class that processed this file

  attr_reader :parser

  ##
  # Creates a new TopLevel for the file at +absolute_name+.  If documentation
  # is being generated outside the source dir +relative_name+ is relative to
  # the source directory.

  def initialize absolute_name, relative_name = absolute_name
    super()
    @name = nil
    @absolute_name = absolute_name
    @relative_name = relative_name
    @file_stat     = File.stat(absolute_name) rescue nil # HACK for testing
    @diagram       = nil
    @parser        = nil

    @classes_or_modules = []
  end

  def parser=(val)
    @parser = val
    @store.update_parser_of_file(absolute_name, val) if @store
    @parser
  end

  ##
  # An RDoc::TopLevel is equal to another with the same relative_name

  def == other
    self.class === other and @relative_name == other.relative_name
  end

  alias eql? ==

  ##
  # Adds +an_alias+ to +Object+ instead of +self+.

  def add_alias(an_alias)
    object_class.record_location self
    return an_alias unless @document_self
    object_class.add_alias an_alias
  end

  ##
  # Adds +constant+ to +Object+ instead of +self+.

  def add_constant constant
    object_class.record_location self
    return constant unless @document_self
    object_class.add_constant constant
  end

  ##
  # Adds +include+ to +Object+ instead of +self+.

  def add_include(include)
    object_class.record_location self
    return include unless @document_self
    object_class.add_include include
  end

  ##
  # Adds +method+ to +Object+ instead of +self+.

  def add_method(method)
    object_class.record_location self
    return method unless @document_self
    object_class.add_method method
  end

  ##
  # Adds class or module +mod+. Used in the building phase
  # by the Ruby parser.

  def add_to_classes_or_modules mod
    @classes_or_modules << mod
  end

  ##
  # Base name of this file

  def base_name
    File.basename @relative_name
  end

  alias name base_name

  ##
  # Only a TopLevel that contains text file) will be displayed.  See also
  # RDoc::CodeObject#display?

  def display?
    text? and super
  end

  ##
  # See RDoc::TopLevel::find_class_or_module
  #--
  # TODO Why do we search through all classes/modules found, not just the
  #       ones of this instance?

  def find_class_or_module name
    @store.find_class_or_module name
  end

  ##
  # Finds a class or module named +symbol+

  def find_local_symbol(symbol)
    find_class_or_module(symbol) || super
  end

  ##
  # Finds a module or class with +name+

  def find_module_named(name)
    find_class_or_module(name)
  end

  ##
  # Returns the relative name of this file

  def full_name
    @relative_name
  end

  ##
  # An RDoc::TopLevel has the same hash as another with the same
  # relative_name

  def hash
    @relative_name.hash
  end

  ##
  # URL for this with a +prefix+

  def http_url(prefix)
    path = [prefix, @relative_name.tr('.', '_')]

    File.join(*path.compact) + '.html'
  end

  def inspect # :nodoc:
    "#<%s:0x%x %p modules: %p classes: %p>" % [
      self.class, object_id,
      base_name,
      @modules.map { |n,m| m },
      @classes.map { |n,c| c }
    ]
  end

  ##
  # Time this file was last modified, if known

  def last_modified
    @file_stat ? file_stat.mtime : nil
  end

  ##
  # Dumps this TopLevel for use by ri.  See also #marshal_load

  def marshal_dump
    [
      MARSHAL_VERSION,
      @relative_name,
      @parser,
      parse(@comment),
    ]
  end

  ##
  # Loads this TopLevel from +array+.

  def marshal_load array # :nodoc:
    initialize array[1]

    @parser  = array[2]
    @comment = array[3]

    @file_stat          = nil
  end

  ##
  # Returns the NormalClass "Object", creating it if not found.
  #
  # Records +self+ as a location in "Object".

  def object_class
    @object_class ||= begin
      oc = @store.find_class_named('Object') || add_class(RDoc::NormalClass, 'Object')
      oc.record_location self
      oc
    end
  end

  ##
  # Base name of this file without the extension

  def page_name
    basename = File.basename @relative_name
    basename =~ /\.(rb|rdoc|txt|md)$/i

    $` || basename
  end

  ##
  # Path to this file for use with HTML generator output.

  def path
    http_url @store.rdoc.generator.file_dir
  end

  def pretty_print q # :nodoc:
    q.group 2, "[#{self.class}: ", "]" do
      q.text "base name: #{base_name.inspect}"
      q.breakable

      items = @modules.map { |n,m| m }
      items.concat @modules.map { |n,c| c }
      q.seplist items do |mod| q.pp mod end
    end
  end

  ##
  # Search record used by RDoc::Generator::JsonIndex

  def search_record
    return unless @parser < RDoc::Parser::Text

    [
      page_name,
      '',
      page_name,
      '',
      path,
      '',
      snippet(@comment),
    ]
  end

  ##
  # Is this TopLevel from a text file instead of a source code file?

  def text?
    @parser and @parser.include? RDoc::Parser::Text
  end

  def to_s # :nodoc:
    "file #{full_name}"
  end

end

PK}$[#��@@.gems/gems/rdoc-6.4.1.1/lib/rdoc/stats/quiet.rbnu�[���# frozen_string_literal: true
##
# Stats printer that prints nothing

class RDoc::Stats::Quiet

  ##
  # Creates a new Quiet that will print nothing

  def initialize num_files
    @num_files = num_files
  end

  ##
  # Prints a message at the beginning of parsing

  def begin_adding(*) end

  ##
  # Prints when an alias is added

  def print_alias(*) end

  ##
  # Prints when an attribute is added

  def print_attribute(*) end

  ##
  # Prints when a class is added

  def print_class(*) end

  ##
  # Prints when a constant is added

  def print_constant(*) end

  ##
  # Prints when a file is added

  def print_file(*) end

  ##
  # Prints when a method is added

  def print_method(*) end

  ##
  # Prints when a module is added

  def print_module(*) end

  ##
  # Prints when RDoc is done

  def done_adding(*) end

end

PK}$[�
����0gems/gems/rdoc-6.4.1.1/lib/rdoc/stats/verbose.rbnu�[���# frozen_string_literal: true
##
# Stats printer that prints everything documented, including the documented
# status

class RDoc::Stats::Verbose < RDoc::Stats::Normal

  ##
  # Returns a marker for RDoc::CodeObject +co+ being undocumented

  def nodoc co
    " (undocumented)" unless co.documented?
  end

  def print_alias as # :nodoc:
    puts "    alias #{as.new_name} #{as.old_name}#{nodoc as}"
  end

  def print_attribute attribute # :nodoc:
    puts "    #{attribute.definition} #{attribute.name}#{nodoc attribute}"
  end

  def print_class(klass) # :nodoc:
    puts "  class #{klass.full_name}#{nodoc klass}"
  end

  def print_constant(constant) # :nodoc:
    puts "    #{constant.name}#{nodoc constant}"
  end

  def print_file(files_so_far, file) # :nodoc:
    super
    puts
  end

  def print_method(method) # :nodoc:
    puts "    #{method.singleton ? '::' : '#'}#{method.name}#{nodoc method}"
  end

  def print_module(mod) # :nodoc:
    puts "  module #{mod.full_name}#{nodoc mod}"
  end

end


PK}$[9)-$00/gems/gems/rdoc-6.4.1.1/lib/rdoc/stats/normal.rbnu�[���# frozen_string_literal: true
begin
  require 'io/console/size'
rescue LoadError
  # for JRuby
  require 'io/console'
end

##
# Stats printer that prints just the files being documented with a progress
# bar

class RDoc::Stats::Normal < RDoc::Stats::Quiet

  def begin_adding # :nodoc:
    puts "Parsing sources..."
    @last_width = 0
  end

  ##
  # Prints a file with a progress bar

  def print_file files_so_far, filename
    progress_bar = sprintf("%3d%% [%2d/%2d]  ",
                           100 * files_so_far / @num_files,
                           files_so_far,
                           @num_files)

    if $stdout.tty?
      # Print a progress bar, but make sure it fits on a single line. Filename
      # will be truncated if necessary.
      size = IO.respond_to?(:console_size) ? IO.console_size : IO.console.winsize
      terminal_width = size[1].to_i.nonzero? || 80
      max_filename_size = (terminal_width - progress_bar.size) - 1

      if filename.size > max_filename_size then
        # Turn "some_long_filename.rb" to "...ong_filename.rb"
        filename = filename[(filename.size - max_filename_size) .. -1]
        filename[0..2] = "..."
      end

      # Clean the line with whitespaces so that leftover output from the
      # previous line doesn't show up.
      $stdout.print("\r\e[K") if @last_width && @last_width > 0
      @last_width = progress_bar.size + filename.size
      term = "\r"
    else
      term = "\n"
    end
    $stdout.print(progress_bar, filename, term)
    $stdout.flush
  end

  def done_adding # :nodoc:
    puts
  end

end
PK}$[�M���2gems/gems/rdoc-6.4.1.1/lib/rdoc/context/section.rbnu�[���# frozen_string_literal: true
##
# A section of documentation like:
#
#   # :section: The title
#   # The body
#
# Sections can be referenced multiple times and will be collapsed into a
# single section.

class RDoc::Context::Section

  include RDoc::Text

  MARSHAL_VERSION = 0 # :nodoc:

  ##
  # Section comment

  attr_reader :comment

  ##
  # Section comments

  attr_reader :comments

  ##
  # Context this Section lives in

  attr_reader :parent

  ##
  # Section title

  attr_reader :title

  ##
  # Creates a new section with +title+ and +comment+

  def initialize parent, title, comment
    @parent = parent
    @title = title ? title.strip : title

    @comments = []

    add_comment comment
  end

  ##
  # Sections are equal when they have the same #title

  def == other
    self.class === other and @title == other.title
  end

  alias eql? ==

  ##
  # Adds +comment+ to this section

  def add_comment comment
    comment = extract_comment comment

    return if comment.empty?

    case comment
    when RDoc::Comment then
      @comments << comment
    when RDoc::Markup::Document then
      @comments.concat comment.parts
    when Array then
      @comments.concat comment
    else
      raise TypeError, "unknown comment type: #{comment.inspect}"
    end
  end

  ##
  # Anchor reference for linking to this section

  def aref
    title = @title || '[untitled]'

    CGI.escape(title).gsub('%', '-').sub(/^-/, '')
  end

  ##
  # Extracts the comment for this section from the original comment block.
  # If the first line contains :section:, strip it and use the rest.
  # Otherwise remove lines up to the line containing :section:, and look
  # for those lines again at the end and remove them. This lets us write
  #
  #   # :section: The title
  #   # The body

  def extract_comment comment
    case comment
    when Array then
      comment.map do |c|
        extract_comment c
      end
    when nil
      RDoc::Comment.new ''
    when RDoc::Comment then
      if comment.text =~ /^#[ \t]*:section:.*\n/ then
        start = $`
        rest = $'

        comment.text = if start.empty? then
                         rest
                       else
                         rest.sub(/#{start.chomp}\Z/, '')
                       end
      end

      comment
    when RDoc::Markup::Document then
      comment
    else
      raise TypeError, "unknown comment #{comment.inspect}"
    end
  end

  def inspect # :nodoc:
    "#<%s:0x%x %p>" % [self.class, object_id, title]
  end

  def hash # :nodoc:
    @title.hash
  end

  ##
  # The files comments in this section come from

  def in_files
    return [] if @comments.empty?

    case @comments
    when Array then
      @comments.map do |comment|
        comment.file
      end
    when RDoc::Markup::Document then
      @comment.parts.map do |document|
        document.file
      end
    else
      raise RDoc::Error, "BUG: unknown comment class #{@comments.class}"
    end
  end

  ##
  # Serializes this Section.  The title and parsed comment are saved, but not
  # the section parent which must be restored manually.

  def marshal_dump
    [
      MARSHAL_VERSION,
      @title,
      parse,
    ]
  end

  ##
  # De-serializes this Section.  The section parent must be restored manually.

  def marshal_load array
    @parent  = nil

    @title    = array[1]
    @comments = array[2]
  end

  ##
  # Parses +comment_location+ into an RDoc::Markup::Document composed of
  # multiple RDoc::Markup::Documents with their file set.

  def parse
    case @comments
    when String then
      super
    when Array then
      docs = @comments.map do |comment, location|
        doc = super comment
        doc.file = location if location
        doc
      end

      RDoc::Markup::Document.new(*docs)
    when RDoc::Comment then
      doc = super @comments.text, comments.format
      doc.file = @comments.location
      doc
    when RDoc::Markup::Document then
      return @comments
    else
      raise ArgumentError, "unknown comment class #{comments.class}"
    end
  end

  ##
  # The section's title, or 'Top Section' if the title is nil.
  #
  # This is used by the table of contents template so the name is silly.

  def plain_html
    @title || 'Top Section'
  end

  ##
  # Removes a comment from this section if it is from the same file as
  # +comment+

  def remove_comment comment
    return if @comments.empty?

    case @comments
    when Array then
      @comments.delete_if do |my_comment|
        my_comment.file == comment.file
      end
    when RDoc::Markup::Document then
      @comments.parts.delete_if do |document|
        document.file == comment.file.name
      end
    else
      raise RDoc::Error, "BUG: unknown comment class #{@comments.class}"
    end
  end

end

PK}$[g�*���/gems/gems/rdoc-6.4.1.1/lib/rdoc/code_objects.rbnu�[���# frozen_string_literal: true
# This file was used to load all the RDoc::CodeObject subclasses at once.  Now
# autoload handles this.

require 'rdoc'

PK}$[�R5���/gems/gems/rdoc-6.4.1.1/lib/rdoc/ghost_method.rbnu�[���# frozen_string_literal: true
##
# GhostMethod represents a method referenced only by a comment

class RDoc::GhostMethod < RDoc::AnyMethod
end

PK}$[zk�3� � -gems/gems/rdoc-6.4.1.1/lib/rdoc/any_method.rbnu�[���# frozen_string_literal: true
##
# AnyMethod is the base class for objects representing methods

class RDoc::AnyMethod < RDoc::MethodAttr

  ##
  # 2::
  #   RDoc 4
  #   Added calls_super
  #   Added parent name and class
  #   Added section title
  # 3::
  #   RDoc 4.1
  #   Added is_alias_for

  MARSHAL_VERSION = 3 # :nodoc:

  ##
  # Don't rename \#initialize to \::new

  attr_accessor :dont_rename_initialize

  ##
  # The C function that implements this method (if it was defined in a C file)

  attr_accessor :c_function

  # The section title of the method (if defined in a C file via +:category:+)
  attr_accessor :section_title

  # Parameters for this method

  attr_accessor :params

  ##
  # If true this method uses +super+ to call a superclass version

  attr_accessor :calls_super

  include RDoc::TokenStream

  ##
  # Creates a new AnyMethod with a token stream +text+ and +name+

  def initialize text, name
    super

    @c_function = nil
    @dont_rename_initialize = false
    @token_stream = nil
    @calls_super = false
    @superclass_method = nil
  end

  ##
  # Adds +an_alias+ as an alias for this method in +context+.

  def add_alias an_alias, context = nil
    method = self.class.new an_alias.text, an_alias.new_name

    method.record_location an_alias.file
    method.singleton = self.singleton
    method.params = self.params
    method.visibility = self.visibility
    method.comment = an_alias.comment
    method.is_alias_for = self
    @aliases << method
    context.add_method method if context
    method
  end

  ##
  # Prefix for +aref+ is 'method'.

  def aref_prefix
    'method'
  end

  ##
  # The call_seq or the param_seq with method name, if there is no call_seq.
  #
  # Use this for displaying a method's argument lists.

  def arglists
    if @call_seq then
      @call_seq
    elsif @params then
      "#{name}#{param_seq}"
    end
  end

  ##
  # Different ways to call this method

  def call_seq
    unless call_seq = _call_seq
      call_seq = is_alias_for._call_seq if is_alias_for
    end

    return unless call_seq

    deduplicate_call_seq(call_seq)
  end

  ##
  # Sets the different ways you can call this method.  If an empty +call_seq+
  # is given nil is assumed.
  #
  # See also #param_seq

  def call_seq= call_seq
    return if call_seq.empty?

    @call_seq = call_seq
  end

  ##
  # Loads is_alias_for from the internal name.  Returns nil if the alias
  # cannot be found.

  def is_alias_for # :nodoc:
    case @is_alias_for
    when RDoc::MethodAttr then
      @is_alias_for
    when Array then
      return nil unless @store

      klass_name, singleton, method_name = @is_alias_for

      return nil unless klass = @store.find_class_or_module(klass_name)

      @is_alias_for = klass.find_method method_name, singleton
    end
  end

  ##
  # Dumps this AnyMethod for use by ri.  See also #marshal_load

  def marshal_dump
    aliases = @aliases.map do |a|
      [a.name, parse(a.comment)]
    end

    is_alias_for = [
      @is_alias_for.parent.full_name,
      @is_alias_for.singleton,
      @is_alias_for.name
    ] if @is_alias_for

    [ MARSHAL_VERSION,
      @name,
      full_name,
      @singleton,
      @visibility,
      parse(@comment),
      @call_seq,
      @block_params,
      aliases,
      @params,
      @file.relative_name,
      @calls_super,
      @parent.name,
      @parent.class,
      @section.title,
      is_alias_for,
    ]
  end

  ##
  # Loads this AnyMethod from +array+.  For a loaded AnyMethod the following
  # methods will return cached values:
  #
  # * #full_name
  # * #parent_name

  def marshal_load array
    initialize_visibility

    @dont_rename_initialize = nil
    @token_stream           = nil
    @aliases                = []
    @parent                 = nil
    @parent_name            = nil
    @parent_class           = nil
    @section                = nil
    @file                   = nil

    version        = array[0]
    @name          = array[1]
    @full_name     = array[2]
    @singleton     = array[3]
    @visibility    = array[4]
    @comment       = array[5]
    @call_seq      = array[6]
    @block_params  = array[7]
    #                      8 handled below
    @params        = array[9]
    #                      10 handled below
    @calls_super   = array[11]
    @parent_name   = array[12]
    @parent_title  = array[13]
    @section_title = array[14]
    @is_alias_for  = array[15]

    array[8].each do |new_name, comment|
      add_alias RDoc::Alias.new(nil, @name, new_name, comment, @singleton)
    end

    @parent_name ||= if @full_name =~ /#/ then
                       $`
                     else
                       name = @full_name.split('::')
                       name.pop
                       name.join '::'
                     end

    @file = RDoc::TopLevel.new array[10] if version > 0
  end

  ##
  # Method name
  #
  # If the method has no assigned name, it extracts it from #call_seq.

  def name
    return @name if @name

    @name =
      @call_seq[/^.*?\.(\w+)/, 1] ||
      @call_seq[/^.*?(\w+)/, 1] ||
      @call_seq if @call_seq
  end

  ##
  # A list of this method's method and yield parameters.  +call-seq+ params
  # are preferred over parsed method and block params.

  def param_list
    if @call_seq then
      params = @call_seq.split("\n").last
      params = params.sub(/.*?\((.*)\)/, '\1')
      params = params.sub(/(\{|do)\s*\|([^|]*)\|.*/, ',\2')
    elsif @params then
      params = @params.sub(/\((.*)\)/, '\1')

      params << ",#{@block_params}" if @block_params
    elsif @block_params then
      params = @block_params
    else
      return []
    end

    if @block_params then
      # If this method has explicit block parameters, remove any explicit
      # &block
      params = params.sub(/,?\s*&\w+/, '')
    else
      params = params.sub(/\&(\w+)/, '\1')
    end

    params = params.gsub(/\s+/, '').split(',').reject(&:empty?)

    params.map { |param| param.sub(/=.*/, '') }
  end

  ##
  # Pretty parameter list for this method.  If the method's parameters were
  # given by +call-seq+ it is preferred over the parsed values.

  def param_seq
    if @call_seq then
      params = @call_seq.split("\n").last
      params = params.sub(/[^( ]+/, '')
      params = params.sub(/(\|[^|]+\|)\s*\.\.\.\s*(end|\})/, '\1 \2')
    elsif @params then
      params = @params.gsub(/\s*\#.*/, '')
      params = params.tr_s("\n ", " ")
      params = "(#{params})" unless params[0] == ?(
    else
      params = ''
    end

    if @block_params then
      # If this method has explicit block parameters, remove any explicit
      # &block
      params = params.sub(/,?\s*&\w+/, '')

      block = @block_params.tr_s("\n ", " ")
      if block[0] == ?(
        block = block.sub(/^\(/, '').sub(/\)/, '')
      end
      params << " { |#{block}| ... }"
    end

    params
  end

  ##
  # Sets the store for this method and its referenced code objects.

  def store= store
    super

    @file = @store.add_file @file.full_name if @file
  end

  ##
  # For methods that +super+, find the superclass method that would be called.

  def superclass_method
    return unless @calls_super
    return @superclass_method if @superclass_method

    parent.each_ancestor do |ancestor|
      if method = ancestor.method_list.find { |m| m.name == @name } then
        @superclass_method = method
        break
      end
    end

    @superclass_method
  end

  protected

  ##
  # call_seq without deduplication and alias lookup.

  def _call_seq
    @call_seq if defined?(@call_seq) && @call_seq
  end

  private

  ##
  # call_seq with alias examples information removed, if this
  # method is an alias method.

  def deduplicate_call_seq(call_seq)
    return call_seq unless is_alias_for || !aliases.empty?

    method_name = self.name
    method_name = method_name[0, 1] if method_name =~ /\A\[/

    entries = call_seq.split "\n"

    ignore = aliases.map(&:name)
    if is_alias_for
      ignore << is_alias_for.name
      ignore.concat is_alias_for.aliases.map(&:name)
    end
    ignore.map! { |n| n =~ /\A\[/ ? n[0, 1] : n}
    ignore.delete(method_name)
    ignore = Regexp.union(ignore)

    matching = entries.reject do |entry|
      entry =~ /^\w*\.?#{ignore}/ or
        entry =~ /\s#{ignore}\s/
    end

    matching.empty? ? nil : matching.join("\n")
  end
end
PK}$[c��7��*gems/gems/rdoc-6.4.1.1/lib/rdoc/comment.rbnu�[���# frozen_string_literal: true
##
# A comment holds the text comment for a RDoc::CodeObject and provides a
# unified way of cleaning it up and parsing it into an RDoc::Markup::Document.
#
# Each comment may have a different markup format set by #format=.  By default
# 'rdoc' is used.  The :markup: directive tells RDoc which format to use.
#
# See RDoc::Markup@Other+directives for instructions on adding an alternate
# format.

class RDoc::Comment

  include RDoc::Text

  ##
  # The format of this comment.  Defaults to RDoc::Markup

  attr_reader :format

  ##
  # The RDoc::TopLevel this comment was found in

  attr_accessor :location

  ##
  # Line where this Comment was written

  attr_accessor :line

  ##
  # For duck-typing when merging classes at load time

  alias file location # :nodoc:

  ##
  # The text for this comment

  attr_reader :text

  ##
  # Alias for text

  alias to_s text

  ##
  # Overrides the content returned by #parse.  Use when there is no #text
  # source for this comment

  attr_writer   :document

  ##
  # Creates a new comment with +text+ that is found in the RDoc::TopLevel
  # +location+.

  def initialize text = nil, location = nil, language = nil
    @location = location
    @text     = text.nil? ? nil : text.dup
    @language = language

    @document   = nil
    @format     = 'rdoc'
    @normalized = false
  end

  ##
  #--
  # TODO deep copy @document

  def initialize_copy copy # :nodoc:
    @text = copy.text.dup
  end

  def == other # :nodoc:
    self.class === other and
      other.text == @text and other.location == @location
  end

  ##
  # Look for a 'call-seq' in the comment to override the normal parameter
  # handling.  The :call-seq: is indented from the baseline.  All lines of the
  # same indentation level and prefix are consumed.
  #
  # For example, all of the following will be used as the :call-seq:
  #
  #   # :call-seq:
  #   #   ARGF.readlines(sep=$/)     -> array
  #   #   ARGF.readlines(limit)      -> array
  #   #   ARGF.readlines(sep, limit) -> array
  #   #
  #   #   ARGF.to_a(sep=$/)     -> array
  #   #   ARGF.to_a(limit)      -> array
  #   #   ARGF.to_a(sep, limit) -> array

  def extract_call_seq method
    # we must handle situations like the above followed by an unindented first
    # comment.  The difficulty is to make sure not to match lines starting
    # with ARGF at the same indent, but that are after the first description
    # paragraph.
    if @text =~ /^\s*:?call-seq:(.*?(?:\S).*?)^\s*$/m then
      all_start, all_stop = $~.offset(0)
      seq_start, seq_stop = $~.offset(1)

      # we get the following lines that start with the leading word at the
      # same indent, even if they have blank lines before
      if $1 =~ /(^\s*\n)+^(\s*\w+)/m then
        leading = $2 # ' *    ARGF' in the example above
        re = %r%
          \A(
             (^\s*\n)+
             (^#{Regexp.escape leading}.*?\n)+
            )+
          ^\s*$
        %xm

        if @text[seq_stop..-1] =~ re then
          all_stop = seq_stop + $~.offset(0).last
          seq_stop = seq_stop + $~.offset(1).last
        end
      end

      seq = @text[seq_start..seq_stop]
      seq.gsub!(/^\s*(\S|\n)/m, '\1')
      @text.slice! all_start...all_stop

      method.call_seq = seq.chomp

    else
      regexp = /^\s*:?call-seq:(.*?)(^\s*$|\z)/m
      if regexp =~ @text then
        @text = @text.sub(regexp, '')
        seq = $1
        seq.gsub!(/^\s*/, '')
        method.call_seq = seq
      end
    end

    method
  end

  ##
  # A comment is empty if its text String is empty.

  def empty?
    @text.empty?
  end

  ##
  # HACK dubious

  def encode! encoding
    # TODO: Remove this condition after Ruby 2.2 EOL
    if RUBY_VERSION < '2.3.0'
      @text = @text.force_encoding encoding
    else
      @text = String.new @text, encoding: encoding
    end
    self
  end

  ##
  # Sets the format of this comment and resets any parsed document

  def format= format
    @format = format
    @document = nil
  end

  def inspect # :nodoc:
    location = @location ? @location.relative_name : '(unknown)'

    "#<%s:%x %s %p>" % [self.class, object_id, location, @text]
  end

  ##
  # Normalizes the text.  See RDoc::Text#normalize_comment for details

  def normalize
    return self unless @text
    return self if @normalized # TODO eliminate duplicate normalization

    @text = normalize_comment @text

    @normalized = true

    self
  end

  ##
  # Was this text normalized?

  def normalized? # :nodoc:
    @normalized
  end

  ##
  # Parses the comment into an RDoc::Markup::Document.  The parsed document is
  # cached until the text is changed.

  def parse
    return @document if @document

    @document = super @text, @format
    @document.file = @location
    @document
  end

  ##
  # Removes private sections from this comment.  Private sections are flush to
  # the comment marker and start with <tt>--</tt> and end with <tt>++</tt>.
  # For C-style comments, a private marker may not start at the opening of the
  # comment.
  #
  #   /*
  #    *--
  #    * private
  #    *++
  #    * public
  #    */

  def remove_private
    # Workaround for gsub encoding for Ruby 1.9.2 and earlier
    empty = ''
    empty = RDoc::Encoding.change_encoding empty, @text.encoding

    @text = @text.gsub(%r%^\s*([#*]?)--.*?^\s*(\1)\+\+\n?%m, empty)
    @text = @text.sub(%r%^\s*[#*]?--.*%m, '')
  end

  ##
  # Replaces this comment's text with +text+ and resets the parsed document.
  #
  # An error is raised if the comment contains a document but no text.

  def text= text
    raise RDoc::Error, 'replacing document-only comment is not allowed' if
      @text.nil? and @document

    @document = nil
    @text = text.nil? ? nil : text.dup
  end

  ##
  # Returns true if this comment is in TomDoc format.

  def tomdoc?
    @format == 'tomdoc'
  end

end
PK}$[|y����/gems/gems/rdoc-6.4.1.1/lib/rdoc/single_class.rbnu�[���# frozen_string_literal: true
##
# A singleton class

class RDoc::SingleClass < RDoc::ClassModule

  ##
  # Adds the superclass to the included modules.

  def ancestors
    superclass ? super + [superclass] : super
  end

  def aref_prefix # :nodoc:
    'sclass'
  end

  ##
  # The definition of this singleton class, <tt>class << MyClassName</tt>

  def definition
    "class << #{full_name}"
  end

end

PK}$[OG�!�!�4gems/gems/rdoc-6.4.1.1/lib/rdoc/markdown/entities.rbnu�[���# frozen_string_literal: true
##
# HTML entity name map for RDoc::Markdown

RDoc::Markdown::HTML_ENTITIES = {
  "AElig" => [0x000C6],
  "AMP" => [0x00026],
  "Aacute" => [0x000C1],
  "Abreve" => [0x00102],
  "Acirc" => [0x000C2],
  "Acy" => [0x00410],
  "Afr" => [0x1D504],
  "Agrave" => [0x000C0],
  "Alpha" => [0x00391],
  "Amacr" => [0x00100],
  "And" => [0x02A53],
  "Aogon" => [0x00104],
  "Aopf" => [0x1D538],
  "ApplyFunction" => [0x02061],
  "Aring" => [0x000C5],
  "Ascr" => [0x1D49C],
  "Assign" => [0x02254],
  "Atilde" => [0x000C3],
  "Auml" => [0x000C4],
  "Backslash" => [0x02216],
  "Barv" => [0x02AE7],
  "Barwed" => [0x02306],
  "Bcy" => [0x00411],
  "Because" => [0x02235],
  "Bernoullis" => [0x0212C],
  "Beta" => [0x00392],
  "Bfr" => [0x1D505],
  "Bopf" => [0x1D539],
  "Breve" => [0x002D8],
  "Bscr" => [0x0212C],
  "Bumpeq" => [0x0224E],
  "CHcy" => [0x00427],
  "COPY" => [0x000A9],
  "Cacute" => [0x00106],
  "Cap" => [0x022D2],
  "CapitalDifferentialD" => [0x02145],
  "Cayleys" => [0x0212D],
  "Ccaron" => [0x0010C],
  "Ccedil" => [0x000C7],
  "Ccirc" => [0x00108],
  "Cconint" => [0x02230],
  "Cdot" => [0x0010A],
  "Cedilla" => [0x000B8],
  "CenterDot" => [0x000B7],
  "Cfr" => [0x0212D],
  "Chi" => [0x003A7],
  "CircleDot" => [0x02299],
  "CircleMinus" => [0x02296],
  "CirclePlus" => [0x02295],
  "CircleTimes" => [0x02297],
  "ClockwiseContourIntegral" => [0x02232],
  "CloseCurlyDoubleQuote" => [0x0201D],
  "CloseCurlyQuote" => [0x02019],
  "Colon" => [0x02237],
  "Colone" => [0x02A74],
  "Congruent" => [0x02261],
  "Conint" => [0x0222F],
  "ContourIntegral" => [0x0222E],
  "Copf" => [0x02102],
  "Coproduct" => [0x02210],
  "CounterClockwiseContourIntegral" => [0x02233],
  "Cross" => [0x02A2F],
  "Cscr" => [0x1D49E],
  "Cup" => [0x022D3],
  "CupCap" => [0x0224D],
  "DD" => [0x02145],
  "DDotrahd" => [0x02911],
  "DJcy" => [0x00402],
  "DScy" => [0x00405],
  "DZcy" => [0x0040F],
  "Dagger" => [0x02021],
  "Darr" => [0x021A1],
  "Dashv" => [0x02AE4],
  "Dcaron" => [0x0010E],
  "Dcy" => [0x00414],
  "Del" => [0x02207],
  "Delta" => [0x00394],
  "Dfr" => [0x1D507],
  "DiacriticalAcute" => [0x000B4],
  "DiacriticalDot" => [0x002D9],
  "DiacriticalDoubleAcute" => [0x002DD],
  "DiacriticalGrave" => [0x00060],
  "DiacriticalTilde" => [0x002DC],
  "Diamond" => [0x022C4],
  "DifferentialD" => [0x02146],
  "Dopf" => [0x1D53B],
  "Dot" => [0x000A8],
  "DotDot" => [0x020DC],
  "DotEqual" => [0x02250],
  "DoubleContourIntegral" => [0x0222F],
  "DoubleDot" => [0x000A8],
  "DoubleDownArrow" => [0x021D3],
  "DoubleLeftArrow" => [0x021D0],
  "DoubleLeftRightArrow" => [0x021D4],
  "DoubleLeftTee" => [0x02AE4],
  "DoubleLongLeftArrow" => [0x027F8],
  "DoubleLongLeftRightArrow" => [0x027FA],
  "DoubleLongRightArrow" => [0x027F9],
  "DoubleRightArrow" => [0x021D2],
  "DoubleRightTee" => [0x022A8],
  "DoubleUpArrow" => [0x021D1],
  "DoubleUpDownArrow" => [0x021D5],
  "DoubleVerticalBar" => [0x02225],
  "DownArrow" => [0x02193],
  "DownArrowBar" => [0x02913],
  "DownArrowUpArrow" => [0x021F5],
  "DownBreve" => [0x00311],
  "DownLeftRightVector" => [0x02950],
  "DownLeftTeeVector" => [0x0295E],
  "DownLeftVector" => [0x021BD],
  "DownLeftVectorBar" => [0x02956],
  "DownRightTeeVector" => [0x0295F],
  "DownRightVector" => [0x021C1],
  "DownRightVectorBar" => [0x02957],
  "DownTee" => [0x022A4],
  "DownTeeArrow" => [0x021A7],
  "Downarrow" => [0x021D3],
  "Dscr" => [0x1D49F],
  "Dstrok" => [0x00110],
  "ENG" => [0x0014A],
  "ETH" => [0x000D0],
  "Eacute" => [0x000C9],
  "Ecaron" => [0x0011A],
  "Ecirc" => [0x000CA],
  "Ecy" => [0x0042D],
  "Edot" => [0x00116],
  "Efr" => [0x1D508],
  "Egrave" => [0x000C8],
  "Element" => [0x02208],
  "Emacr" => [0x00112],
  "EmptySmallSquare" => [0x025FB],
  "EmptyVerySmallSquare" => [0x025AB],
  "Eogon" => [0x00118],
  "Eopf" => [0x1D53C],
  "Epsilon" => [0x00395],
  "Equal" => [0x02A75],
  "EqualTilde" => [0x02242],
  "Equilibrium" => [0x021CC],
  "Escr" => [0x02130],
  "Esim" => [0x02A73],
  "Eta" => [0x00397],
  "Euml" => [0x000CB],
  "Exists" => [0x02203],
  "ExponentialE" => [0x02147],
  "Fcy" => [0x00424],
  "Ffr" => [0x1D509],
  "FilledSmallSquare" => [0x025FC],
  "FilledVerySmallSquare" => [0x025AA],
  "Fopf" => [0x1D53D],
  "ForAll" => [0x02200],
  "Fouriertrf" => [0x02131],
  "Fscr" => [0x02131],
  "GJcy" => [0x00403],
  "GT" => [0x0003E],
  "Gamma" => [0x00393],
  "Gammad" => [0x003DC],
  "Gbreve" => [0x0011E],
  "Gcedil" => [0x00122],
  "Gcirc" => [0x0011C],
  "Gcy" => [0x00413],
  "Gdot" => [0x00120],
  "Gfr" => [0x1D50A],
  "Gg" => [0x022D9],
  "Gopf" => [0x1D53E],
  "GreaterEqual" => [0x02265],
  "GreaterEqualLess" => [0x022DB],
  "GreaterFullEqual" => [0x02267],
  "GreaterGreater" => [0x02AA2],
  "GreaterLess" => [0x02277],
  "GreaterSlantEqual" => [0x02A7E],
  "GreaterTilde" => [0x02273],
  "Gscr" => [0x1D4A2],
  "Gt" => [0x0226B],
  "HARDcy" => [0x0042A],
  "Hacek" => [0x002C7],
  "Hat" => [0x0005E],
  "Hcirc" => [0x00124],
  "Hfr" => [0x0210C],
  "HilbertSpace" => [0x0210B],
  "Hopf" => [0x0210D],
  "HorizontalLine" => [0x02500],
  "Hscr" => [0x0210B],
  "Hstrok" => [0x00126],
  "HumpDownHump" => [0x0224E],
  "HumpEqual" => [0x0224F],
  "IEcy" => [0x00415],
  "IJlig" => [0x00132],
  "IOcy" => [0x00401],
  "Iacute" => [0x000CD],
  "Icirc" => [0x000CE],
  "Icy" => [0x00418],
  "Idot" => [0x00130],
  "Ifr" => [0x02111],
  "Igrave" => [0x000CC],
  "Im" => [0x02111],
  "Imacr" => [0x0012A],
  "ImaginaryI" => [0x02148],
  "Implies" => [0x021D2],
  "Int" => [0x0222C],
  "Integral" => [0x0222B],
  "Intersection" => [0x022C2],
  "InvisibleComma" => [0x02063],
  "InvisibleTimes" => [0x02062],
  "Iogon" => [0x0012E],
  "Iopf" => [0x1D540],
  "Iota" => [0x00399],
  "Iscr" => [0x02110],
  "Itilde" => [0x00128],
  "Iukcy" => [0x00406],
  "Iuml" => [0x000CF],
  "Jcirc" => [0x00134],
  "Jcy" => [0x00419],
  "Jfr" => [0x1D50D],
  "Jopf" => [0x1D541],
  "Jscr" => [0x1D4A5],
  "Jsercy" => [0x00408],
  "Jukcy" => [0x00404],
  "KHcy" => [0x00425],
  "KJcy" => [0x0040C],
  "Kappa" => [0x0039A],
  "Kcedil" => [0x00136],
  "Kcy" => [0x0041A],
  "Kfr" => [0x1D50E],
  "Kopf" => [0x1D542],
  "Kscr" => [0x1D4A6],
  "LJcy" => [0x00409],
  "LT" => [0x0003C],
  "Lacute" => [0x00139],
  "Lambda" => [0x0039B],
  "Lang" => [0x027EA],
  "Laplacetrf" => [0x02112],
  "Larr" => [0x0219E],
  "Lcaron" => [0x0013D],
  "Lcedil" => [0x0013B],
  "Lcy" => [0x0041B],
  "LeftAngleBracket" => [0x027E8],
  "LeftArrow" => [0x02190],
  "LeftArrowBar" => [0x021E4],
  "LeftArrowRightArrow" => [0x021C6],
  "LeftCeiling" => [0x02308],
  "LeftDoubleBracket" => [0x027E6],
  "LeftDownTeeVector" => [0x02961],
  "LeftDownVector" => [0x021C3],
  "LeftDownVectorBar" => [0x02959],
  "LeftFloor" => [0x0230A],
  "LeftRightArrow" => [0x02194],
  "LeftRightVector" => [0x0294E],
  "LeftTee" => [0x022A3],
  "LeftTeeArrow" => [0x021A4],
  "LeftTeeVector" => [0x0295A],
  "LeftTriangle" => [0x022B2],
  "LeftTriangleBar" => [0x029CF],
  "LeftTriangleEqual" => [0x022B4],
  "LeftUpDownVector" => [0x02951],
  "LeftUpTeeVector" => [0x02960],
  "LeftUpVector" => [0x021BF],
  "LeftUpVectorBar" => [0x02958],
  "LeftVector" => [0x021BC],
  "LeftVectorBar" => [0x02952],
  "Leftarrow" => [0x021D0],
  "Leftrightarrow" => [0x021D4],
  "LessEqualGreater" => [0x022DA],
  "LessFullEqual" => [0x02266],
  "LessGreater" => [0x02276],
  "LessLess" => [0x02AA1],
  "LessSlantEqual" => [0x02A7D],
  "LessTilde" => [0x02272],
  "Lfr" => [0x1D50F],
  "Ll" => [0x022D8],
  "Lleftarrow" => [0x021DA],
  "Lmidot" => [0x0013F],
  "LongLeftArrow" => [0x027F5],
  "LongLeftRightArrow" => [0x027F7],
  "LongRightArrow" => [0x027F6],
  "Longleftarrow" => [0x027F8],
  "Longleftrightarrow" => [0x027FA],
  "Longrightarrow" => [0x027F9],
  "Lopf" => [0x1D543],
  "LowerLeftArrow" => [0x02199],
  "LowerRightArrow" => [0x02198],
  "Lscr" => [0x02112],
  "Lsh" => [0x021B0],
  "Lstrok" => [0x00141],
  "Lt" => [0x0226A],
  "Map" => [0x02905],
  "Mcy" => [0x0041C],
  "MediumSpace" => [0x0205F],
  "Mellintrf" => [0x02133],
  "Mfr" => [0x1D510],
  "MinusPlus" => [0x02213],
  "Mopf" => [0x1D544],
  "Mscr" => [0x02133],
  "Mu" => [0x0039C],
  "NJcy" => [0x0040A],
  "Nacute" => [0x00143],
  "Ncaron" => [0x00147],
  "Ncedil" => [0x00145],
  "Ncy" => [0x0041D],
  "NegativeMediumSpace" => [0x0200B],
  "NegativeThickSpace" => [0x0200B],
  "NegativeThinSpace" => [0x0200B],
  "NegativeVeryThinSpace" => [0x0200B],
  "NestedGreaterGreater" => [0x0226B],
  "NestedLessLess" => [0x0226A],
  "NewLine" => [0x0000A],
  "Nfr" => [0x1D511],
  "NoBreak" => [0x02060],
  "NonBreakingSpace" => [0x000A0],
  "Nopf" => [0x02115],
  "Not" => [0x02AEC],
  "NotCongruent" => [0x02262],
  "NotCupCap" => [0x0226D],
  "NotDoubleVerticalBar" => [0x02226],
  "NotElement" => [0x02209],
  "NotEqual" => [0x02260],
  "NotEqualTilde" => [0x02242, 0x00338],
  "NotExists" => [0x02204],
  "NotGreater" => [0x0226F],
  "NotGreaterEqual" => [0x02271],
  "NotGreaterFullEqual" => [0x02267, 0x00338],
  "NotGreaterGreater" => [0x0226B, 0x00338],
  "NotGreaterLess" => [0x02279],
  "NotGreaterSlantEqual" => [0x02A7E, 0x00338],
  "NotGreaterTilde" => [0x02275],
  "NotHumpDownHump" => [0x0224E, 0x00338],
  "NotHumpEqual" => [0x0224F, 0x00338],
  "NotLeftTriangle" => [0x022EA],
  "NotLeftTriangleBar" => [0x029CF, 0x00338],
  "NotLeftTriangleEqual" => [0x022EC],
  "NotLess" => [0x0226E],
  "NotLessEqual" => [0x02270],
  "NotLessGreater" => [0x02278],
  "NotLessLess" => [0x0226A, 0x00338],
  "NotLessSlantEqual" => [0x02A7D, 0x00338],
  "NotLessTilde" => [0x02274],
  "NotNestedGreaterGreater" => [0x02AA2, 0x00338],
  "NotNestedLessLess" => [0x02AA1, 0x00338],
  "NotPrecedes" => [0x02280],
  "NotPrecedesEqual" => [0x02AAF, 0x00338],
  "NotPrecedesSlantEqual" => [0x022E0],
  "NotReverseElement" => [0x0220C],
  "NotRightTriangle" => [0x022EB],
  "NotRightTriangleBar" => [0x029D0, 0x00338],
  "NotRightTriangleEqual" => [0x022ED],
  "NotSquareSubset" => [0x0228F, 0x00338],
  "NotSquareSubsetEqual" => [0x022E2],
  "NotSquareSuperset" => [0x02290, 0x00338],
  "NotSquareSupersetEqual" => [0x022E3],
  "NotSubset" => [0x02282, 0x020D2],
  "NotSubsetEqual" => [0x02288],
  "NotSucceeds" => [0x02281],
  "NotSucceedsEqual" => [0x02AB0, 0x00338],
  "NotSucceedsSlantEqual" => [0x022E1],
  "NotSucceedsTilde" => [0x0227F, 0x00338],
  "NotSuperset" => [0x02283, 0x020D2],
  "NotSupersetEqual" => [0x02289],
  "NotTilde" => [0x02241],
  "NotTildeEqual" => [0x02244],
  "NotTildeFullEqual" => [0x02247],
  "NotTildeTilde" => [0x02249],
  "NotVerticalBar" => [0x02224],
  "Nscr" => [0x1D4A9],
  "Ntilde" => [0x000D1],
  "Nu" => [0x0039D],
  "OElig" => [0x00152],
  "Oacute" => [0x000D3],
  "Ocirc" => [0x000D4],
  "Ocy" => [0x0041E],
  "Odblac" => [0x00150],
  "Ofr" => [0x1D512],
  "Ograve" => [0x000D2],
  "Omacr" => [0x0014C],
  "Omega" => [0x003A9],
  "Omicron" => [0x0039F],
  "Oopf" => [0x1D546],
  "OpenCurlyDoubleQuote" => [0x0201C],
  "OpenCurlyQuote" => [0x02018],
  "Or" => [0x02A54],
  "Oscr" => [0x1D4AA],
  "Oslash" => [0x000D8],
  "Otilde" => [0x000D5],
  "Otimes" => [0x02A37],
  "Ouml" => [0x000D6],
  "OverBar" => [0x0203E],
  "OverBrace" => [0x023DE],
  "OverBracket" => [0x023B4],
  "OverParenthesis" => [0x023DC],
  "PartialD" => [0x02202],
  "Pcy" => [0x0041F],
  "Pfr" => [0x1D513],
  "Phi" => [0x003A6],
  "Pi" => [0x003A0],
  "PlusMinus" => [0x000B1],
  "Poincareplane" => [0x0210C],
  "Popf" => [0x02119],
  "Pr" => [0x02ABB],
  "Precedes" => [0x0227A],
  "PrecedesEqual" => [0x02AAF],
  "PrecedesSlantEqual" => [0x0227C],
  "PrecedesTilde" => [0x0227E],
  "Prime" => [0x02033],
  "Product" => [0x0220F],
  "Proportion" => [0x02237],
  "Proportional" => [0x0221D],
  "Pscr" => [0x1D4AB],
  "Psi" => [0x003A8],
  "QUOT" => [0x00022],
  "Qfr" => [0x1D514],
  "Qopf" => [0x0211A],
  "Qscr" => [0x1D4AC],
  "RBarr" => [0x02910],
  "REG" => [0x000AE],
  "Racute" => [0x00154],
  "Rang" => [0x027EB],
  "Rarr" => [0x021A0],
  "Rarrtl" => [0x02916],
  "Rcaron" => [0x00158],
  "Rcedil" => [0x00156],
  "Rcy" => [0x00420],
  "Re" => [0x0211C],
  "ReverseElement" => [0x0220B],
  "ReverseEquilibrium" => [0x021CB],
  "ReverseUpEquilibrium" => [0x0296F],
  "Rfr" => [0x0211C],
  "Rho" => [0x003A1],
  "RightAngleBracket" => [0x027E9],
  "RightArrow" => [0x02192],
  "RightArrowBar" => [0x021E5],
  "RightArrowLeftArrow" => [0x021C4],
  "RightCeiling" => [0x02309],
  "RightDoubleBracket" => [0x027E7],
  "RightDownTeeVector" => [0x0295D],
  "RightDownVector" => [0x021C2],
  "RightDownVectorBar" => [0x02955],
  "RightFloor" => [0x0230B],
  "RightTee" => [0x022A2],
  "RightTeeArrow" => [0x021A6],
  "RightTeeVector" => [0x0295B],
  "RightTriangle" => [0x022B3],
  "RightTriangleBar" => [0x029D0],
  "RightTriangleEqual" => [0x022B5],
  "RightUpDownVector" => [0x0294F],
  "RightUpTeeVector" => [0x0295C],
  "RightUpVector" => [0x021BE],
  "RightUpVectorBar" => [0x02954],
  "RightVector" => [0x021C0],
  "RightVectorBar" => [0x02953],
  "Rightarrow" => [0x021D2],
  "Ropf" => [0x0211D],
  "RoundImplies" => [0x02970],
  "Rrightarrow" => [0x021DB],
  "Rscr" => [0x0211B],
  "Rsh" => [0x021B1],
  "RuleDelayed" => [0x029F4],
  "SHCHcy" => [0x00429],
  "SHcy" => [0x00428],
  "SOFTcy" => [0x0042C],
  "Sacute" => [0x0015A],
  "Sc" => [0x02ABC],
  "Scaron" => [0x00160],
  "Scedil" => [0x0015E],
  "Scirc" => [0x0015C],
  "Scy" => [0x00421],
  "Sfr" => [0x1D516],
  "ShortDownArrow" => [0x02193],
  "ShortLeftArrow" => [0x02190],
  "ShortRightArrow" => [0x02192],
  "ShortUpArrow" => [0x02191],
  "Sigma" => [0x003A3],
  "SmallCircle" => [0x02218],
  "Sopf" => [0x1D54A],
  "Sqrt" => [0x0221A],
  "Square" => [0x025A1],
  "SquareIntersection" => [0x02293],
  "SquareSubset" => [0x0228F],
  "SquareSubsetEqual" => [0x02291],
  "SquareSuperset" => [0x02290],
  "SquareSupersetEqual" => [0x02292],
  "SquareUnion" => [0x02294],
  "Sscr" => [0x1D4AE],
  "Star" => [0x022C6],
  "Sub" => [0x022D0],
  "Subset" => [0x022D0],
  "SubsetEqual" => [0x02286],
  "Succeeds" => [0x0227B],
  "SucceedsEqual" => [0x02AB0],
  "SucceedsSlantEqual" => [0x0227D],
  "SucceedsTilde" => [0x0227F],
  "SuchThat" => [0x0220B],
  "Sum" => [0x02211],
  "Sup" => [0x022D1],
  "Superset" => [0x02283],
  "SupersetEqual" => [0x02287],
  "Supset" => [0x022D1],
  "THORN" => [0x000DE],
  "TRADE" => [0x02122],
  "TSHcy" => [0x0040B],
  "TScy" => [0x00426],
  "Tab" => [0x00009],
  "Tau" => [0x003A4],
  "Tcaron" => [0x00164],
  "Tcedil" => [0x00162],
  "Tcy" => [0x00422],
  "Tfr" => [0x1D517],
  "Therefore" => [0x02234],
  "Theta" => [0x00398],
  "ThickSpace" => [0x0205F, 0x0200A],
  "ThinSpace" => [0x02009],
  "Tilde" => [0x0223C],
  "TildeEqual" => [0x02243],
  "TildeFullEqual" => [0x02245],
  "TildeTilde" => [0x02248],
  "Topf" => [0x1D54B],
  "TripleDot" => [0x020DB],
  "Tscr" => [0x1D4AF],
  "Tstrok" => [0x00166],
  "Uacute" => [0x000DA],
  "Uarr" => [0x0219F],
  "Uarrocir" => [0x02949],
  "Ubrcy" => [0x0040E],
  "Ubreve" => [0x0016C],
  "Ucirc" => [0x000DB],
  "Ucy" => [0x00423],
  "Udblac" => [0x00170],
  "Ufr" => [0x1D518],
  "Ugrave" => [0x000D9],
  "Umacr" => [0x0016A],
  "UnderBar" => [0x0005F],
  "UnderBrace" => [0x023DF],
  "UnderBracket" => [0x023B5],
  "UnderParenthesis" => [0x023DD],
  "Union" => [0x022C3],
  "UnionPlus" => [0x0228E],
  "Uogon" => [0x00172],
  "Uopf" => [0x1D54C],
  "UpArrow" => [0x02191],
  "UpArrowBar" => [0x02912],
  "UpArrowDownArrow" => [0x021C5],
  "UpDownArrow" => [0x02195],
  "UpEquilibrium" => [0x0296E],
  "UpTee" => [0x022A5],
  "UpTeeArrow" => [0x021A5],
  "Uparrow" => [0x021D1],
  "Updownarrow" => [0x021D5],
  "UpperLeftArrow" => [0x02196],
  "UpperRightArrow" => [0x02197],
  "Upsi" => [0x003D2],
  "Upsilon" => [0x003A5],
  "Uring" => [0x0016E],
  "Uscr" => [0x1D4B0],
  "Utilde" => [0x00168],
  "Uuml" => [0x000DC],
  "VDash" => [0x022AB],
  "Vbar" => [0x02AEB],
  "Vcy" => [0x00412],
  "Vdash" => [0x022A9],
  "Vdashl" => [0x02AE6],
  "Vee" => [0x022C1],
  "Verbar" => [0x02016],
  "Vert" => [0x02016],
  "VerticalBar" => [0x02223],
  "VerticalLine" => [0x0007C],
  "VerticalSeparator" => [0x02758],
  "VerticalTilde" => [0x02240],
  "VeryThinSpace" => [0x0200A],
  "Vfr" => [0x1D519],
  "Vopf" => [0x1D54D],
  "Vscr" => [0x1D4B1],
  "Vvdash" => [0x022AA],
  "Wcirc" => [0x00174],
  "Wedge" => [0x022C0],
  "Wfr" => [0x1D51A],
  "Wopf" => [0x1D54E],
  "Wscr" => [0x1D4B2],
  "Xfr" => [0x1D51B],
  "Xi" => [0x0039E],
  "Xopf" => [0x1D54F],
  "Xscr" => [0x1D4B3],
  "YAcy" => [0x0042F],
  "YIcy" => [0x00407],
  "YUcy" => [0x0042E],
  "Yacute" => [0x000DD],
  "Ycirc" => [0x00176],
  "Ycy" => [0x0042B],
  "Yfr" => [0x1D51C],
  "Yopf" => [0x1D550],
  "Yscr" => [0x1D4B4],
  "Yuml" => [0x00178],
  "ZHcy" => [0x00416],
  "Zacute" => [0x00179],
  "Zcaron" => [0x0017D],
  "Zcy" => [0x00417],
  "Zdot" => [0x0017B],
  "ZeroWidthSpace" => [0x0200B],
  "Zeta" => [0x00396],
  "Zfr" => [0x02128],
  "Zopf" => [0x02124],
  "Zscr" => [0x1D4B5],
  "aacute" => [0x000E1],
  "abreve" => [0x00103],
  "ac" => [0x0223E],
  "acE" => [0x0223E, 0x00333],
  "acd" => [0x0223F],
  "acirc" => [0x000E2],
  "acute" => [0x000B4],
  "acy" => [0x00430],
  "aelig" => [0x000E6],
  "af" => [0x02061],
  "afr" => [0x1D51E],
  "agrave" => [0x000E0],
  "alefsym" => [0x02135],
  "aleph" => [0x02135],
  "alpha" => [0x003B1],
  "amacr" => [0x00101],
  "amalg" => [0x02A3F],
  "amp" => [0x00026],
  "and" => [0x02227],
  "andand" => [0x02A55],
  "andd" => [0x02A5C],
  "andslope" => [0x02A58],
  "andv" => [0x02A5A],
  "ang" => [0x02220],
  "ange" => [0x029A4],
  "angle" => [0x02220],
  "angmsd" => [0x02221],
  "angmsdaa" => [0x029A8],
  "angmsdab" => [0x029A9],
  "angmsdac" => [0x029AA],
  "angmsdad" => [0x029AB],
  "angmsdae" => [0x029AC],
  "angmsdaf" => [0x029AD],
  "angmsdag" => [0x029AE],
  "angmsdah" => [0x029AF],
  "angrt" => [0x0221F],
  "angrtvb" => [0x022BE],
  "angrtvbd" => [0x0299D],
  "angsph" => [0x02222],
  "angst" => [0x000C5],
  "angzarr" => [0x0237C],
  "aogon" => [0x00105],
  "aopf" => [0x1D552],
  "ap" => [0x02248],
  "apE" => [0x02A70],
  "apacir" => [0x02A6F],
  "ape" => [0x0224A],
  "apid" => [0x0224B],
  "apos" => [0x00027],
  "approx" => [0x02248],
  "approxeq" => [0x0224A],
  "aring" => [0x000E5],
  "ascr" => [0x1D4B6],
  "ast" => [0x0002A],
  "asymp" => [0x02248],
  "asympeq" => [0x0224D],
  "atilde" => [0x000E3],
  "auml" => [0x000E4],
  "awconint" => [0x02233],
  "awint" => [0x02A11],
  "bNot" => [0x02AED],
  "backcong" => [0x0224C],
  "backepsilon" => [0x003F6],
  "backprime" => [0x02035],
  "backsim" => [0x0223D],
  "backsimeq" => [0x022CD],
  "barvee" => [0x022BD],
  "barwed" => [0x02305],
  "barwedge" => [0x02305],
  "bbrk" => [0x023B5],
  "bbrktbrk" => [0x023B6],
  "bcong" => [0x0224C],
  "bcy" => [0x00431],
  "bdquo" => [0x0201E],
  "becaus" => [0x02235],
  "because" => [0x02235],
  "bemptyv" => [0x029B0],
  "bepsi" => [0x003F6],
  "bernou" => [0x0212C],
  "beta" => [0x003B2],
  "beth" => [0x02136],
  "between" => [0x0226C],
  "bfr" => [0x1D51F],
  "bigcap" => [0x022C2],
  "bigcirc" => [0x025EF],
  "bigcup" => [0x022C3],
  "bigodot" => [0x02A00],
  "bigoplus" => [0x02A01],
  "bigotimes" => [0x02A02],
  "bigsqcup" => [0x02A06],
  "bigstar" => [0x02605],
  "bigtriangledown" => [0x025BD],
  "bigtriangleup" => [0x025B3],
  "biguplus" => [0x02A04],
  "bigvee" => [0x022C1],
  "bigwedge" => [0x022C0],
  "bkarow" => [0x0290D],
  "blacklozenge" => [0x029EB],
  "blacksquare" => [0x025AA],
  "blacktriangle" => [0x025B4],
  "blacktriangledown" => [0x025BE],
  "blacktriangleleft" => [0x025C2],
  "blacktriangleright" => [0x025B8],
  "blank" => [0x02423],
  "blk12" => [0x02592],
  "blk14" => [0x02591],
  "blk34" => [0x02593],
  "block" => [0x02588],
  "bne" => [0x0003D, 0x020E5],
  "bnequiv" => [0x02261, 0x020E5],
  "bnot" => [0x02310],
  "bopf" => [0x1D553],
  "bot" => [0x022A5],
  "bottom" => [0x022A5],
  "bowtie" => [0x022C8],
  "boxDL" => [0x02557],
  "boxDR" => [0x02554],
  "boxDl" => [0x02556],
  "boxDr" => [0x02553],
  "boxH" => [0x02550],
  "boxHD" => [0x02566],
  "boxHU" => [0x02569],
  "boxHd" => [0x02564],
  "boxHu" => [0x02567],
  "boxUL" => [0x0255D],
  "boxUR" => [0x0255A],
  "boxUl" => [0x0255C],
  "boxUr" => [0x02559],
  "boxV" => [0x02551],
  "boxVH" => [0x0256C],
  "boxVL" => [0x02563],
  "boxVR" => [0x02560],
  "boxVh" => [0x0256B],
  "boxVl" => [0x02562],
  "boxVr" => [0x0255F],
  "boxbox" => [0x029C9],
  "boxdL" => [0x02555],
  "boxdR" => [0x02552],
  "boxdl" => [0x02510],
  "boxdr" => [0x0250C],
  "boxh" => [0x02500],
  "boxhD" => [0x02565],
  "boxhU" => [0x02568],
  "boxhd" => [0x0252C],
  "boxhu" => [0x02534],
  "boxminus" => [0x0229F],
  "boxplus" => [0x0229E],
  "boxtimes" => [0x022A0],
  "boxuL" => [0x0255B],
  "boxuR" => [0x02558],
  "boxul" => [0x02518],
  "boxur" => [0x02514],
  "boxv" => [0x02502],
  "boxvH" => [0x0256A],
  "boxvL" => [0x02561],
  "boxvR" => [0x0255E],
  "boxvh" => [0x0253C],
  "boxvl" => [0x02524],
  "boxvr" => [0x0251C],
  "bprime" => [0x02035],
  "breve" => [0x002D8],
  "brvbar" => [0x000A6],
  "bscr" => [0x1D4B7],
  "bsemi" => [0x0204F],
  "bsim" => [0x0223D],
  "bsime" => [0x022CD],
  "bsol" => [0x0005C],
  "bsolb" => [0x029C5],
  "bsolhsub" => [0x027C8],
  "bull" => [0x02022],
  "bullet" => [0x02022],
  "bump" => [0x0224E],
  "bumpE" => [0x02AAE],
  "bumpe" => [0x0224F],
  "bumpeq" => [0x0224F],
  "cacute" => [0x00107],
  "cap" => [0x02229],
  "capand" => [0x02A44],
  "capbrcup" => [0x02A49],
  "capcap" => [0x02A4B],
  "capcup" => [0x02A47],
  "capdot" => [0x02A40],
  "caps" => [0x02229, 0x0FE00],
  "caret" => [0x02041],
  "caron" => [0x002C7],
  "ccaps" => [0x02A4D],
  "ccaron" => [0x0010D],
  "ccedil" => [0x000E7],
  "ccirc" => [0x00109],
  "ccups" => [0x02A4C],
  "ccupssm" => [0x02A50],
  "cdot" => [0x0010B],
  "cedil" => [0x000B8],
  "cemptyv" => [0x029B2],
  "cent" => [0x000A2],
  "centerdot" => [0x000B7],
  "cfr" => [0x1D520],
  "chcy" => [0x00447],
  "check" => [0x02713],
  "checkmark" => [0x02713],
  "chi" => [0x003C7],
  "cir" => [0x025CB],
  "cirE" => [0x029C3],
  "circ" => [0x002C6],
  "circeq" => [0x02257],
  "circlearrowleft" => [0x021BA],
  "circlearrowright" => [0x021BB],
  "circledR" => [0x000AE],
  "circledS" => [0x024C8],
  "circledast" => [0x0229B],
  "circledcirc" => [0x0229A],
  "circleddash" => [0x0229D],
  "cire" => [0x02257],
  "cirfnint" => [0x02A10],
  "cirmid" => [0x02AEF],
  "cirscir" => [0x029C2],
  "clubs" => [0x02663],
  "clubsuit" => [0x02663],
  "colon" => [0x0003A],
  "colone" => [0x02254],
  "coloneq" => [0x02254],
  "comma" => [0x0002C],
  "commat" => [0x00040],
  "comp" => [0x02201],
  "compfn" => [0x02218],
  "complement" => [0x02201],
  "complexes" => [0x02102],
  "cong" => [0x02245],
  "congdot" => [0x02A6D],
  "conint" => [0x0222E],
  "copf" => [0x1D554],
  "coprod" => [0x02210],
  "copy" => [0x000A9],
  "copysr" => [0x02117],
  "crarr" => [0x021B5],
  "cross" => [0x02717],
  "cscr" => [0x1D4B8],
  "csub" => [0x02ACF],
  "csube" => [0x02AD1],
  "csup" => [0x02AD0],
  "csupe" => [0x02AD2],
  "ctdot" => [0x022EF],
  "cudarrl" => [0x02938],
  "cudarrr" => [0x02935],
  "cuepr" => [0x022DE],
  "cuesc" => [0x022DF],
  "cularr" => [0x021B6],
  "cularrp" => [0x0293D],
  "cup" => [0x0222A],
  "cupbrcap" => [0x02A48],
  "cupcap" => [0x02A46],
  "cupcup" => [0x02A4A],
  "cupdot" => [0x0228D],
  "cupor" => [0x02A45],
  "cups" => [0x0222A, 0x0FE00],
  "curarr" => [0x021B7],
  "curarrm" => [0x0293C],
  "curlyeqprec" => [0x022DE],
  "curlyeqsucc" => [0x022DF],
  "curlyvee" => [0x022CE],
  "curlywedge" => [0x022CF],
  "curren" => [0x000A4],
  "curvearrowleft" => [0x021B6],
  "curvearrowright" => [0x021B7],
  "cuvee" => [0x022CE],
  "cuwed" => [0x022CF],
  "cwconint" => [0x02232],
  "cwint" => [0x02231],
  "cylcty" => [0x0232D],
  "dArr" => [0x021D3],
  "dHar" => [0x02965],
  "dagger" => [0x02020],
  "daleth" => [0x02138],
  "darr" => [0x02193],
  "dash" => [0x02010],
  "dashv" => [0x022A3],
  "dbkarow" => [0x0290F],
  "dblac" => [0x002DD],
  "dcaron" => [0x0010F],
  "dcy" => [0x00434],
  "dd" => [0x02146],
  "ddagger" => [0x02021],
  "ddarr" => [0x021CA],
  "ddotseq" => [0x02A77],
  "deg" => [0x000B0],
  "delta" => [0x003B4],
  "demptyv" => [0x029B1],
  "dfisht" => [0x0297F],
  "dfr" => [0x1D521],
  "dharl" => [0x021C3],
  "dharr" => [0x021C2],
  "diam" => [0x022C4],
  "diamond" => [0x022C4],
  "diamondsuit" => [0x02666],
  "diams" => [0x02666],
  "die" => [0x000A8],
  "digamma" => [0x003DD],
  "disin" => [0x022F2],
  "div" => [0x000F7],
  "divide" => [0x000F7],
  "divideontimes" => [0x022C7],
  "divonx" => [0x022C7],
  "djcy" => [0x00452],
  "dlcorn" => [0x0231E],
  "dlcrop" => [0x0230D],
  "dollar" => [0x00024],
  "dopf" => [0x1D555],
  "dot" => [0x002D9],
  "doteq" => [0x02250],
  "doteqdot" => [0x02251],
  "dotminus" => [0x02238],
  "dotplus" => [0x02214],
  "dotsquare" => [0x022A1],
  "doublebarwedge" => [0x02306],
  "downarrow" => [0x02193],
  "downdownarrows" => [0x021CA],
  "downharpoonleft" => [0x021C3],
  "downharpoonright" => [0x021C2],
  "drbkarow" => [0x02910],
  "drcorn" => [0x0231F],
  "drcrop" => [0x0230C],
  "dscr" => [0x1D4B9],
  "dscy" => [0x00455],
  "dsol" => [0x029F6],
  "dstrok" => [0x00111],
  "dtdot" => [0x022F1],
  "dtri" => [0x025BF],
  "dtrif" => [0x025BE],
  "duarr" => [0x021F5],
  "duhar" => [0x0296F],
  "dwangle" => [0x029A6],
  "dzcy" => [0x0045F],
  "dzigrarr" => [0x027FF],
  "eDDot" => [0x02A77],
  "eDot" => [0x02251],
  "eacute" => [0x000E9],
  "easter" => [0x02A6E],
  "ecaron" => [0x0011B],
  "ecir" => [0x02256],
  "ecirc" => [0x000EA],
  "ecolon" => [0x02255],
  "ecy" => [0x0044D],
  "edot" => [0x00117],
  "ee" => [0x02147],
  "efDot" => [0x02252],
  "efr" => [0x1D522],
  "eg" => [0x02A9A],
  "egrave" => [0x000E8],
  "egs" => [0x02A96],
  "egsdot" => [0x02A98],
  "el" => [0x02A99],
  "elinters" => [0x023E7],
  "ell" => [0x02113],
  "els" => [0x02A95],
  "elsdot" => [0x02A97],
  "emacr" => [0x00113],
  "empty" => [0x02205],
  "emptyset" => [0x02205],
  "emptyv" => [0x02205],
  "emsp" => [0x02003],
  "emsp13" => [0x02004],
  "emsp14" => [0x02005],
  "eng" => [0x0014B],
  "ensp" => [0x02002],
  "eogon" => [0x00119],
  "eopf" => [0x1D556],
  "epar" => [0x022D5],
  "eparsl" => [0x029E3],
  "eplus" => [0x02A71],
  "epsi" => [0x003B5],
  "epsilon" => [0x003B5],
  "epsiv" => [0x003F5],
  "eqcirc" => [0x02256],
  "eqcolon" => [0x02255],
  "eqsim" => [0x02242],
  "eqslantgtr" => [0x02A96],
  "eqslantless" => [0x02A95],
  "equals" => [0x0003D],
  "equest" => [0x0225F],
  "equiv" => [0x02261],
  "equivDD" => [0x02A78],
  "eqvparsl" => [0x029E5],
  "erDot" => [0x02253],
  "erarr" => [0x02971],
  "escr" => [0x0212F],
  "esdot" => [0x02250],
  "esim" => [0x02242],
  "eta" => [0x003B7],
  "eth" => [0x000F0],
  "euml" => [0x000EB],
  "euro" => [0x020AC],
  "excl" => [0x00021],
  "exist" => [0x02203],
  "expectation" => [0x02130],
  "exponentiale" => [0x02147],
  "fallingdotseq" => [0x02252],
  "fcy" => [0x00444],
  "female" => [0x02640],
  "ffilig" => [0x0FB03],
  "fflig" => [0x0FB00],
  "ffllig" => [0x0FB04],
  "ffr" => [0x1D523],
  "filig" => [0x0FB01],
  "fjlig" => [0x00066, 0x0006A],
  "flat" => [0x0266D],
  "fllig" => [0x0FB02],
  "fltns" => [0x025B1],
  "fnof" => [0x00192],
  "fopf" => [0x1D557],
  "forall" => [0x02200],
  "fork" => [0x022D4],
  "forkv" => [0x02AD9],
  "fpartint" => [0x02A0D],
  "frac12" => [0x000BD],
  "frac13" => [0x02153],
  "frac14" => [0x000BC],
  "frac15" => [0x02155],
  "frac16" => [0x02159],
  "frac18" => [0x0215B],
  "frac23" => [0x02154],
  "frac25" => [0x02156],
  "frac34" => [0x000BE],
  "frac35" => [0x02157],
  "frac38" => [0x0215C],
  "frac45" => [0x02158],
  "frac56" => [0x0215A],
  "frac58" => [0x0215D],
  "frac78" => [0x0215E],
  "frasl" => [0x02044],
  "frown" => [0x02322],
  "fscr" => [0x1D4BB],
  "gE" => [0x02267],
  "gEl" => [0x02A8C],
  "gacute" => [0x001F5],
  "gamma" => [0x003B3],
  "gammad" => [0x003DD],
  "gap" => [0x02A86],
  "gbreve" => [0x0011F],
  "gcirc" => [0x0011D],
  "gcy" => [0x00433],
  "gdot" => [0x00121],
  "ge" => [0x02265],
  "gel" => [0x022DB],
  "geq" => [0x02265],
  "geqq" => [0x02267],
  "geqslant" => [0x02A7E],
  "ges" => [0x02A7E],
  "gescc" => [0x02AA9],
  "gesdot" => [0x02A80],
  "gesdoto" => [0x02A82],
  "gesdotol" => [0x02A84],
  "gesl" => [0x022DB, 0x0FE00],
  "gesles" => [0x02A94],
  "gfr" => [0x1D524],
  "gg" => [0x0226B],
  "ggg" => [0x022D9],
  "gimel" => [0x02137],
  "gjcy" => [0x00453],
  "gl" => [0x02277],
  "glE" => [0x02A92],
  "gla" => [0x02AA5],
  "glj" => [0x02AA4],
  "gnE" => [0x02269],
  "gnap" => [0x02A8A],
  "gnapprox" => [0x02A8A],
  "gne" => [0x02A88],
  "gneq" => [0x02A88],
  "gneqq" => [0x02269],
  "gnsim" => [0x022E7],
  "gopf" => [0x1D558],
  "grave" => [0x00060],
  "gscr" => [0x0210A],
  "gsim" => [0x02273],
  "gsime" => [0x02A8E],
  "gsiml" => [0x02A90],
  "gt" => [0x0003E],
  "gtcc" => [0x02AA7],
  "gtcir" => [0x02A7A],
  "gtdot" => [0x022D7],
  "gtlPar" => [0x02995],
  "gtquest" => [0x02A7C],
  "gtrapprox" => [0x02A86],
  "gtrarr" => [0x02978],
  "gtrdot" => [0x022D7],
  "gtreqless" => [0x022DB],
  "gtreqqless" => [0x02A8C],
  "gtrless" => [0x02277],
  "gtrsim" => [0x02273],
  "gvertneqq" => [0x02269, 0x0FE00],
  "gvnE" => [0x02269, 0x0FE00],
  "hArr" => [0x021D4],
  "hairsp" => [0x0200A],
  "half" => [0x000BD],
  "hamilt" => [0x0210B],
  "hardcy" => [0x0044A],
  "harr" => [0x02194],
  "harrcir" => [0x02948],
  "harrw" => [0x021AD],
  "hbar" => [0x0210F],
  "hcirc" => [0x00125],
  "hearts" => [0x02665],
  "heartsuit" => [0x02665],
  "hellip" => [0x02026],
  "hercon" => [0x022B9],
  "hfr" => [0x1D525],
  "hksearow" => [0x02925],
  "hkswarow" => [0x02926],
  "hoarr" => [0x021FF],
  "homtht" => [0x0223B],
  "hookleftarrow" => [0x021A9],
  "hookrightarrow" => [0x021AA],
  "hopf" => [0x1D559],
  "horbar" => [0x02015],
  "hscr" => [0x1D4BD],
  "hslash" => [0x0210F],
  "hstrok" => [0x00127],
  "hybull" => [0x02043],
  "hyphen" => [0x02010],
  "iacute" => [0x000ED],
  "ic" => [0x02063],
  "icirc" => [0x000EE],
  "icy" => [0x00438],
  "iecy" => [0x00435],
  "iexcl" => [0x000A1],
  "iff" => [0x021D4],
  "ifr" => [0x1D526],
  "igrave" => [0x000EC],
  "ii" => [0x02148],
  "iiiint" => [0x02A0C],
  "iiint" => [0x0222D],
  "iinfin" => [0x029DC],
  "iiota" => [0x02129],
  "ijlig" => [0x00133],
  "imacr" => [0x0012B],
  "image" => [0x02111],
  "imagline" => [0x02110],
  "imagpart" => [0x02111],
  "imath" => [0x00131],
  "imof" => [0x022B7],
  "imped" => [0x001B5],
  "in" => [0x02208],
  "incare" => [0x02105],
  "infin" => [0x0221E],
  "infintie" => [0x029DD],
  "inodot" => [0x00131],
  "int" => [0x0222B],
  "intcal" => [0x022BA],
  "integers" => [0x02124],
  "intercal" => [0x022BA],
  "intlarhk" => [0x02A17],
  "intprod" => [0x02A3C],
  "iocy" => [0x00451],
  "iogon" => [0x0012F],
  "iopf" => [0x1D55A],
  "iota" => [0x003B9],
  "iprod" => [0x02A3C],
  "iquest" => [0x000BF],
  "iscr" => [0x1D4BE],
  "isin" => [0x02208],
  "isinE" => [0x022F9],
  "isindot" => [0x022F5],
  "isins" => [0x022F4],
  "isinsv" => [0x022F3],
  "isinv" => [0x02208],
  "it" => [0x02062],
  "itilde" => [0x00129],
  "iukcy" => [0x00456],
  "iuml" => [0x000EF],
  "jcirc" => [0x00135],
  "jcy" => [0x00439],
  "jfr" => [0x1D527],
  "jmath" => [0x00237],
  "jopf" => [0x1D55B],
  "jscr" => [0x1D4BF],
  "jsercy" => [0x00458],
  "jukcy" => [0x00454],
  "kappa" => [0x003BA],
  "kappav" => [0x003F0],
  "kcedil" => [0x00137],
  "kcy" => [0x0043A],
  "kfr" => [0x1D528],
  "kgreen" => [0x00138],
  "khcy" => [0x00445],
  "kjcy" => [0x0045C],
  "kopf" => [0x1D55C],
  "kscr" => [0x1D4C0],
  "lAarr" => [0x021DA],
  "lArr" => [0x021D0],
  "lAtail" => [0x0291B],
  "lBarr" => [0x0290E],
  "lE" => [0x02266],
  "lEg" => [0x02A8B],
  "lHar" => [0x02962],
  "lacute" => [0x0013A],
  "laemptyv" => [0x029B4],
  "lagran" => [0x02112],
  "lambda" => [0x003BB],
  "lang" => [0x027E8],
  "langd" => [0x02991],
  "langle" => [0x027E8],
  "lap" => [0x02A85],
  "laquo" => [0x000AB],
  "larr" => [0x02190],
  "larrb" => [0x021E4],
  "larrbfs" => [0x0291F],
  "larrfs" => [0x0291D],
  "larrhk" => [0x021A9],
  "larrlp" => [0x021AB],
  "larrpl" => [0x02939],
  "larrsim" => [0x02973],
  "larrtl" => [0x021A2],
  "lat" => [0x02AAB],
  "latail" => [0x02919],
  "late" => [0x02AAD],
  "lates" => [0x02AAD, 0x0FE00],
  "lbarr" => [0x0290C],
  "lbbrk" => [0x02772],
  "lbrace" => [0x0007B],
  "lbrack" => [0x0005B],
  "lbrke" => [0x0298B],
  "lbrksld" => [0x0298F],
  "lbrkslu" => [0x0298D],
  "lcaron" => [0x0013E],
  "lcedil" => [0x0013C],
  "lceil" => [0x02308],
  "lcub" => [0x0007B],
  "lcy" => [0x0043B],
  "ldca" => [0x02936],
  "ldquo" => [0x0201C],
  "ldquor" => [0x0201E],
  "ldrdhar" => [0x02967],
  "ldrushar" => [0x0294B],
  "ldsh" => [0x021B2],
  "le" => [0x02264],
  "leftarrow" => [0x02190],
  "leftarrowtail" => [0x021A2],
  "leftharpoondown" => [0x021BD],
  "leftharpoonup" => [0x021BC],
  "leftleftarrows" => [0x021C7],
  "leftrightarrow" => [0x02194],
  "leftrightarrows" => [0x021C6],
  "leftrightharpoons" => [0x021CB],
  "leftrightsquigarrow" => [0x021AD],
  "leftthreetimes" => [0x022CB],
  "leg" => [0x022DA],
  "leq" => [0x02264],
  "leqq" => [0x02266],
  "leqslant" => [0x02A7D],
  "les" => [0x02A7D],
  "lescc" => [0x02AA8],
  "lesdot" => [0x02A7F],
  "lesdoto" => [0x02A81],
  "lesdotor" => [0x02A83],
  "lesg" => [0x022DA, 0x0FE00],
  "lesges" => [0x02A93],
  "lessapprox" => [0x02A85],
  "lessdot" => [0x022D6],
  "lesseqgtr" => [0x022DA],
  "lesseqqgtr" => [0x02A8B],
  "lessgtr" => [0x02276],
  "lesssim" => [0x02272],
  "lfisht" => [0x0297C],
  "lfloor" => [0x0230A],
  "lfr" => [0x1D529],
  "lg" => [0x02276],
  "lgE" => [0x02A91],
  "lhard" => [0x021BD],
  "lharu" => [0x021BC],
  "lharul" => [0x0296A],
  "lhblk" => [0x02584],
  "ljcy" => [0x00459],
  "ll" => [0x0226A],
  "llarr" => [0x021C7],
  "llcorner" => [0x0231E],
  "llhard" => [0x0296B],
  "lltri" => [0x025FA],
  "lmidot" => [0x00140],
  "lmoust" => [0x023B0],
  "lmoustache" => [0x023B0],
  "lnE" => [0x02268],
  "lnap" => [0x02A89],
  "lnapprox" => [0x02A89],
  "lne" => [0x02A87],
  "lneq" => [0x02A87],
  "lneqq" => [0x02268],
  "lnsim" => [0x022E6],
  "loang" => [0x027EC],
  "loarr" => [0x021FD],
  "lobrk" => [0x027E6],
  "longleftarrow" => [0x027F5],
  "longleftrightarrow" => [0x027F7],
  "longmapsto" => [0x027FC],
  "longrightarrow" => [0x027F6],
  "looparrowleft" => [0x021AB],
  "looparrowright" => [0x021AC],
  "lopar" => [0x02985],
  "lopf" => [0x1D55D],
  "loplus" => [0x02A2D],
  "lotimes" => [0x02A34],
  "lowast" => [0x02217],
  "lowbar" => [0x0005F],
  "loz" => [0x025CA],
  "lozenge" => [0x025CA],
  "lozf" => [0x029EB],
  "lpar" => [0x00028],
  "lparlt" => [0x02993],
  "lrarr" => [0x021C6],
  "lrcorner" => [0x0231F],
  "lrhar" => [0x021CB],
  "lrhard" => [0x0296D],
  "lrm" => [0x0200E],
  "lrtri" => [0x022BF],
  "lsaquo" => [0x02039],
  "lscr" => [0x1D4C1],
  "lsh" => [0x021B0],
  "lsim" => [0x02272],
  "lsime" => [0x02A8D],
  "lsimg" => [0x02A8F],
  "lsqb" => [0x0005B],
  "lsquo" => [0x02018],
  "lsquor" => [0x0201A],
  "lstrok" => [0x00142],
  "lt" => [0x0003C],
  "ltcc" => [0x02AA6],
  "ltcir" => [0x02A79],
  "ltdot" => [0x022D6],
  "lthree" => [0x022CB],
  "ltimes" => [0x022C9],
  "ltlarr" => [0x02976],
  "ltquest" => [0x02A7B],
  "ltrPar" => [0x02996],
  "ltri" => [0x025C3],
  "ltrie" => [0x022B4],
  "ltrif" => [0x025C2],
  "lurdshar" => [0x0294A],
  "luruhar" => [0x02966],
  "lvertneqq" => [0x02268, 0x0FE00],
  "lvnE" => [0x02268, 0x0FE00],
  "mDDot" => [0x0223A],
  "macr" => [0x000AF],
  "male" => [0x02642],
  "malt" => [0x02720],
  "maltese" => [0x02720],
  "map" => [0x021A6],
  "mapsto" => [0x021A6],
  "mapstodown" => [0x021A7],
  "mapstoleft" => [0x021A4],
  "mapstoup" => [0x021A5],
  "marker" => [0x025AE],
  "mcomma" => [0x02A29],
  "mcy" => [0x0043C],
  "mdash" => [0x02014],
  "measuredangle" => [0x02221],
  "mfr" => [0x1D52A],
  "mho" => [0x02127],
  "micro" => [0x000B5],
  "mid" => [0x02223],
  "midast" => [0x0002A],
  "midcir" => [0x02AF0],
  "middot" => [0x000B7],
  "minus" => [0x02212],
  "minusb" => [0x0229F],
  "minusd" => [0x02238],
  "minusdu" => [0x02A2A],
  "mlcp" => [0x02ADB],
  "mldr" => [0x02026],
  "mnplus" => [0x02213],
  "models" => [0x022A7],
  "mopf" => [0x1D55E],
  "mp" => [0x02213],
  "mscr" => [0x1D4C2],
  "mstpos" => [0x0223E],
  "mu" => [0x003BC],
  "multimap" => [0x022B8],
  "mumap" => [0x022B8],
  "nGg" => [0x022D9, 0x00338],
  "nGt" => [0x0226B, 0x020D2],
  "nGtv" => [0x0226B, 0x00338],
  "nLeftarrow" => [0x021CD],
  "nLeftrightarrow" => [0x021CE],
  "nLl" => [0x022D8, 0x00338],
  "nLt" => [0x0226A, 0x020D2],
  "nLtv" => [0x0226A, 0x00338],
  "nRightarrow" => [0x021CF],
  "nVDash" => [0x022AF],
  "nVdash" => [0x022AE],
  "nabla" => [0x02207],
  "nacute" => [0x00144],
  "nang" => [0x02220, 0x020D2],
  "nap" => [0x02249],
  "napE" => [0x02A70, 0x00338],
  "napid" => [0x0224B, 0x00338],
  "napos" => [0x00149],
  "napprox" => [0x02249],
  "natur" => [0x0266E],
  "natural" => [0x0266E],
  "naturals" => [0x02115],
  "nbsp" => [0x000A0],
  "nbump" => [0x0224E, 0x00338],
  "nbumpe" => [0x0224F, 0x00338],
  "ncap" => [0x02A43],
  "ncaron" => [0x00148],
  "ncedil" => [0x00146],
  "ncong" => [0x02247],
  "ncongdot" => [0x02A6D, 0x00338],
  "ncup" => [0x02A42],
  "ncy" => [0x0043D],
  "ndash" => [0x02013],
  "ne" => [0x02260],
  "neArr" => [0x021D7],
  "nearhk" => [0x02924],
  "nearr" => [0x02197],
  "nearrow" => [0x02197],
  "nedot" => [0x02250, 0x00338],
  "nequiv" => [0x02262],
  "nesear" => [0x02928],
  "nesim" => [0x02242, 0x00338],
  "nexist" => [0x02204],
  "nexists" => [0x02204],
  "nfr" => [0x1D52B],
  "ngE" => [0x02267, 0x00338],
  "nge" => [0x02271],
  "ngeq" => [0x02271],
  "ngeqq" => [0x02267, 0x00338],
  "ngeqslant" => [0x02A7E, 0x00338],
  "nges" => [0x02A7E, 0x00338],
  "ngsim" => [0x02275],
  "ngt" => [0x0226F],
  "ngtr" => [0x0226F],
  "nhArr" => [0x021CE],
  "nharr" => [0x021AE],
  "nhpar" => [0x02AF2],
  "ni" => [0x0220B],
  "nis" => [0x022FC],
  "nisd" => [0x022FA],
  "niv" => [0x0220B],
  "njcy" => [0x0045A],
  "nlArr" => [0x021CD],
  "nlE" => [0x02266, 0x00338],
  "nlarr" => [0x0219A],
  "nldr" => [0x02025],
  "nle" => [0x02270],
  "nleftarrow" => [0x0219A],
  "nleftrightarrow" => [0x021AE],
  "nleq" => [0x02270],
  "nleqq" => [0x02266, 0x00338],
  "nleqslant" => [0x02A7D, 0x00338],
  "nles" => [0x02A7D, 0x00338],
  "nless" => [0x0226E],
  "nlsim" => [0x02274],
  "nlt" => [0x0226E],
  "nltri" => [0x022EA],
  "nltrie" => [0x022EC],
  "nmid" => [0x02224],
  "nopf" => [0x1D55F],
  "not" => [0x000AC],
  "notin" => [0x02209],
  "notinE" => [0x022F9, 0x00338],
  "notindot" => [0x022F5, 0x00338],
  "notinva" => [0x02209],
  "notinvb" => [0x022F7],
  "notinvc" => [0x022F6],
  "notni" => [0x0220C],
  "notniva" => [0x0220C],
  "notnivb" => [0x022FE],
  "notnivc" => [0x022FD],
  "npar" => [0x02226],
  "nparallel" => [0x02226],
  "nparsl" => [0x02AFD, 0x020E5],
  "npart" => [0x02202, 0x00338],
  "npolint" => [0x02A14],
  "npr" => [0x02280],
  "nprcue" => [0x022E0],
  "npre" => [0x02AAF, 0x00338],
  "nprec" => [0x02280],
  "npreceq" => [0x02AAF, 0x00338],
  "nrArr" => [0x021CF],
  "nrarr" => [0x0219B],
  "nrarrc" => [0x02933, 0x00338],
  "nrarrw" => [0x0219D, 0x00338],
  "nrightarrow" => [0x0219B],
  "nrtri" => [0x022EB],
  "nrtrie" => [0x022ED],
  "nsc" => [0x02281],
  "nsccue" => [0x022E1],
  "nsce" => [0x02AB0, 0x00338],
  "nscr" => [0x1D4C3],
  "nshortmid" => [0x02224],
  "nshortparallel" => [0x02226],
  "nsim" => [0x02241],
  "nsime" => [0x02244],
  "nsimeq" => [0x02244],
  "nsmid" => [0x02224],
  "nspar" => [0x02226],
  "nsqsube" => [0x022E2],
  "nsqsupe" => [0x022E3],
  "nsub" => [0x02284],
  "nsubE" => [0x02AC5, 0x00338],
  "nsube" => [0x02288],
  "nsubset" => [0x02282, 0x020D2],
  "nsubseteq" => [0x02288],
  "nsubseteqq" => [0x02AC5, 0x00338],
  "nsucc" => [0x02281],
  "nsucceq" => [0x02AB0, 0x00338],
  "nsup" => [0x02285],
  "nsupE" => [0x02AC6, 0x00338],
  "nsupe" => [0x02289],
  "nsupset" => [0x02283, 0x020D2],
  "nsupseteq" => [0x02289],
  "nsupseteqq" => [0x02AC6, 0x00338],
  "ntgl" => [0x02279],
  "ntilde" => [0x000F1],
  "ntlg" => [0x02278],
  "ntriangleleft" => [0x022EA],
  "ntrianglelefteq" => [0x022EC],
  "ntriangleright" => [0x022EB],
  "ntrianglerighteq" => [0x022ED],
  "nu" => [0x003BD],
  "num" => [0x00023],
  "numero" => [0x02116],
  "numsp" => [0x02007],
  "nvDash" => [0x022AD],
  "nvHarr" => [0x02904],
  "nvap" => [0x0224D, 0x020D2],
  "nvdash" => [0x022AC],
  "nvge" => [0x02265, 0x020D2],
  "nvgt" => [0x0003E, 0x020D2],
  "nvinfin" => [0x029DE],
  "nvlArr" => [0x02902],
  "nvle" => [0x02264, 0x020D2],
  "nvlt" => [0x0003C, 0x020D2],
  "nvltrie" => [0x022B4, 0x020D2],
  "nvrArr" => [0x02903],
  "nvrtrie" => [0x022B5, 0x020D2],
  "nvsim" => [0x0223C, 0x020D2],
  "nwArr" => [0x021D6],
  "nwarhk" => [0x02923],
  "nwarr" => [0x02196],
  "nwarrow" => [0x02196],
  "nwnear" => [0x02927],
  "oS" => [0x024C8],
  "oacute" => [0x000F3],
  "oast" => [0x0229B],
  "ocir" => [0x0229A],
  "ocirc" => [0x000F4],
  "ocy" => [0x0043E],
  "odash" => [0x0229D],
  "odblac" => [0x00151],
  "odiv" => [0x02A38],
  "odot" => [0x02299],
  "odsold" => [0x029BC],
  "oelig" => [0x00153],
  "ofcir" => [0x029BF],
  "ofr" => [0x1D52C],
  "ogon" => [0x002DB],
  "ograve" => [0x000F2],
  "ogt" => [0x029C1],
  "ohbar" => [0x029B5],
  "ohm" => [0x003A9],
  "oint" => [0x0222E],
  "olarr" => [0x021BA],
  "olcir" => [0x029BE],
  "olcross" => [0x029BB],
  "oline" => [0x0203E],
  "olt" => [0x029C0],
  "omacr" => [0x0014D],
  "omega" => [0x003C9],
  "omicron" => [0x003BF],
  "omid" => [0x029B6],
  "ominus" => [0x02296],
  "oopf" => [0x1D560],
  "opar" => [0x029B7],
  "operp" => [0x029B9],
  "oplus" => [0x02295],
  "or" => [0x02228],
  "orarr" => [0x021BB],
  "ord" => [0x02A5D],
  "order" => [0x02134],
  "orderof" => [0x02134],
  "ordf" => [0x000AA],
  "ordm" => [0x000BA],
  "origof" => [0x022B6],
  "oror" => [0x02A56],
  "orslope" => [0x02A57],
  "orv" => [0x02A5B],
  "oscr" => [0x02134],
  "oslash" => [0x000F8],
  "osol" => [0x02298],
  "otilde" => [0x000F5],
  "otimes" => [0x02297],
  "otimesas" => [0x02A36],
  "ouml" => [0x000F6],
  "ovbar" => [0x0233D],
  "par" => [0x02225],
  "para" => [0x000B6],
  "parallel" => [0x02225],
  "parsim" => [0x02AF3],
  "parsl" => [0x02AFD],
  "part" => [0x02202],
  "pcy" => [0x0043F],
  "percnt" => [0x00025],
  "period" => [0x0002E],
  "permil" => [0x02030],
  "perp" => [0x022A5],
  "pertenk" => [0x02031],
  "pfr" => [0x1D52D],
  "phi" => [0x003C6],
  "phiv" => [0x003D5],
  "phmmat" => [0x02133],
  "phone" => [0x0260E],
  "pi" => [0x003C0],
  "pitchfork" => [0x022D4],
  "piv" => [0x003D6],
  "planck" => [0x0210F],
  "planckh" => [0x0210E],
  "plankv" => [0x0210F],
  "plus" => [0x0002B],
  "plusacir" => [0x02A23],
  "plusb" => [0x0229E],
  "pluscir" => [0x02A22],
  "plusdo" => [0x02214],
  "plusdu" => [0x02A25],
  "pluse" => [0x02A72],
  "plusmn" => [0x000B1],
  "plussim" => [0x02A26],
  "plustwo" => [0x02A27],
  "pm" => [0x000B1],
  "pointint" => [0x02A15],
  "popf" => [0x1D561],
  "pound" => [0x000A3],
  "pr" => [0x0227A],
  "prE" => [0x02AB3],
  "prap" => [0x02AB7],
  "prcue" => [0x0227C],
  "pre" => [0x02AAF],
  "prec" => [0x0227A],
  "precapprox" => [0x02AB7],
  "preccurlyeq" => [0x0227C],
  "preceq" => [0x02AAF],
  "precnapprox" => [0x02AB9],
  "precneqq" => [0x02AB5],
  "precnsim" => [0x022E8],
  "precsim" => [0x0227E],
  "prime" => [0x02032],
  "primes" => [0x02119],
  "prnE" => [0x02AB5],
  "prnap" => [0x02AB9],
  "prnsim" => [0x022E8],
  "prod" => [0x0220F],
  "profalar" => [0x0232E],
  "profline" => [0x02312],
  "profsurf" => [0x02313],
  "prop" => [0x0221D],
  "propto" => [0x0221D],
  "prsim" => [0x0227E],
  "prurel" => [0x022B0],
  "pscr" => [0x1D4C5],
  "psi" => [0x003C8],
  "puncsp" => [0x02008],
  "qfr" => [0x1D52E],
  "qint" => [0x02A0C],
  "qopf" => [0x1D562],
  "qprime" => [0x02057],
  "qscr" => [0x1D4C6],
  "quaternions" => [0x0210D],
  "quatint" => [0x02A16],
  "quest" => [0x0003F],
  "questeq" => [0x0225F],
  "quot" => [0x00022],
  "rAarr" => [0x021DB],
  "rArr" => [0x021D2],
  "rAtail" => [0x0291C],
  "rBarr" => [0x0290F],
  "rHar" => [0x02964],
  "race" => [0x0223D, 0x00331],
  "racute" => [0x00155],
  "radic" => [0x0221A],
  "raemptyv" => [0x029B3],
  "rang" => [0x027E9],
  "rangd" => [0x02992],
  "range" => [0x029A5],
  "rangle" => [0x027E9],
  "raquo" => [0x000BB],
  "rarr" => [0x02192],
  "rarrap" => [0x02975],
  "rarrb" => [0x021E5],
  "rarrbfs" => [0x02920],
  "rarrc" => [0x02933],
  "rarrfs" => [0x0291E],
  "rarrhk" => [0x021AA],
  "rarrlp" => [0x021AC],
  "rarrpl" => [0x02945],
  "rarrsim" => [0x02974],
  "rarrtl" => [0x021A3],
  "rarrw" => [0x0219D],
  "ratail" => [0x0291A],
  "ratio" => [0x02236],
  "rationals" => [0x0211A],
  "rbarr" => [0x0290D],
  "rbbrk" => [0x02773],
  "rbrace" => [0x0007D],
  "rbrack" => [0x0005D],
  "rbrke" => [0x0298C],
  "rbrksld" => [0x0298E],
  "rbrkslu" => [0x02990],
  "rcaron" => [0x00159],
  "rcedil" => [0x00157],
  "rceil" => [0x02309],
  "rcub" => [0x0007D],
  "rcy" => [0x00440],
  "rdca" => [0x02937],
  "rdldhar" => [0x02969],
  "rdquo" => [0x0201D],
  "rdquor" => [0x0201D],
  "rdsh" => [0x021B3],
  "real" => [0x0211C],
  "realine" => [0x0211B],
  "realpart" => [0x0211C],
  "reals" => [0x0211D],
  "rect" => [0x025AD],
  "reg" => [0x000AE],
  "rfisht" => [0x0297D],
  "rfloor" => [0x0230B],
  "rfr" => [0x1D52F],
  "rhard" => [0x021C1],
  "rharu" => [0x021C0],
  "rharul" => [0x0296C],
  "rho" => [0x003C1],
  "rhov" => [0x003F1],
  "rightarrow" => [0x02192],
  "rightarrowtail" => [0x021A3],
  "rightharpoondown" => [0x021C1],
  "rightharpoonup" => [0x021C0],
  "rightleftarrows" => [0x021C4],
  "rightleftharpoons" => [0x021CC],
  "rightrightarrows" => [0x021C9],
  "rightsquigarrow" => [0x0219D],
  "rightthreetimes" => [0x022CC],
  "ring" => [0x002DA],
  "risingdotseq" => [0x02253],
  "rlarr" => [0x021C4],
  "rlhar" => [0x021CC],
  "rlm" => [0x0200F],
  "rmoust" => [0x023B1],
  "rmoustache" => [0x023B1],
  "rnmid" => [0x02AEE],
  "roang" => [0x027ED],
  "roarr" => [0x021FE],
  "robrk" => [0x027E7],
  "ropar" => [0x02986],
  "ropf" => [0x1D563],
  "roplus" => [0x02A2E],
  "rotimes" => [0x02A35],
  "rpar" => [0x00029],
  "rpargt" => [0x02994],
  "rppolint" => [0x02A12],
  "rrarr" => [0x021C9],
  "rsaquo" => [0x0203A],
  "rscr" => [0x1D4C7],
  "rsh" => [0x021B1],
  "rsqb" => [0x0005D],
  "rsquo" => [0x02019],
  "rsquor" => [0x02019],
  "rthree" => [0x022CC],
  "rtimes" => [0x022CA],
  "rtri" => [0x025B9],
  "rtrie" => [0x022B5],
  "rtrif" => [0x025B8],
  "rtriltri" => [0x029CE],
  "ruluhar" => [0x02968],
  "rx" => [0x0211E],
  "sacute" => [0x0015B],
  "sbquo" => [0x0201A],
  "sc" => [0x0227B],
  "scE" => [0x02AB4],
  "scap" => [0x02AB8],
  "scaron" => [0x00161],
  "sccue" => [0x0227D],
  "sce" => [0x02AB0],
  "scedil" => [0x0015F],
  "scirc" => [0x0015D],
  "scnE" => [0x02AB6],
  "scnap" => [0x02ABA],
  "scnsim" => [0x022E9],
  "scpolint" => [0x02A13],
  "scsim" => [0x0227F],
  "scy" => [0x00441],
  "sdot" => [0x022C5],
  "sdotb" => [0x022A1],
  "sdote" => [0x02A66],
  "seArr" => [0x021D8],
  "searhk" => [0x02925],
  "searr" => [0x02198],
  "searrow" => [0x02198],
  "sect" => [0x000A7],
  "semi" => [0x0003B],
  "seswar" => [0x02929],
  "setminus" => [0x02216],
  "setmn" => [0x02216],
  "sext" => [0x02736],
  "sfr" => [0x1D530],
  "sfrown" => [0x02322],
  "sharp" => [0x0266F],
  "shchcy" => [0x00449],
  "shcy" => [0x00448],
  "shortmid" => [0x02223],
  "shortparallel" => [0x02225],
  "shy" => [0x000AD],
  "sigma" => [0x003C3],
  "sigmaf" => [0x003C2],
  "sigmav" => [0x003C2],
  "sim" => [0x0223C],
  "simdot" => [0x02A6A],
  "sime" => [0x02243],
  "simeq" => [0x02243],
  "simg" => [0x02A9E],
  "simgE" => [0x02AA0],
  "siml" => [0x02A9D],
  "simlE" => [0x02A9F],
  "simne" => [0x02246],
  "simplus" => [0x02A24],
  "simrarr" => [0x02972],
  "slarr" => [0x02190],
  "smallsetminus" => [0x02216],
  "smashp" => [0x02A33],
  "smeparsl" => [0x029E4],
  "smid" => [0x02223],
  "smile" => [0x02323],
  "smt" => [0x02AAA],
  "smte" => [0x02AAC],
  "smtes" => [0x02AAC, 0x0FE00],
  "softcy" => [0x0044C],
  "sol" => [0x0002F],
  "solb" => [0x029C4],
  "solbar" => [0x0233F],
  "sopf" => [0x1D564],
  "spades" => [0x02660],
  "spadesuit" => [0x02660],
  "spar" => [0x02225],
  "sqcap" => [0x02293],
  "sqcaps" => [0x02293, 0x0FE00],
  "sqcup" => [0x02294],
  "sqcups" => [0x02294, 0x0FE00],
  "sqsub" => [0x0228F],
  "sqsube" => [0x02291],
  "sqsubset" => [0x0228F],
  "sqsubseteq" => [0x02291],
  "sqsup" => [0x02290],
  "sqsupe" => [0x02292],
  "sqsupset" => [0x02290],
  "sqsupseteq" => [0x02292],
  "squ" => [0x025A1],
  "square" => [0x025A1],
  "squarf" => [0x025AA],
  "squf" => [0x025AA],
  "srarr" => [0x02192],
  "sscr" => [0x1D4C8],
  "ssetmn" => [0x02216],
  "ssmile" => [0x02323],
  "sstarf" => [0x022C6],
  "star" => [0x02606],
  "starf" => [0x02605],
  "straightepsilon" => [0x003F5],
  "straightphi" => [0x003D5],
  "strns" => [0x000AF],
  "sub" => [0x02282],
  "subE" => [0x02AC5],
  "subdot" => [0x02ABD],
  "sube" => [0x02286],
  "subedot" => [0x02AC3],
  "submult" => [0x02AC1],
  "subnE" => [0x02ACB],
  "subne" => [0x0228A],
  "subplus" => [0x02ABF],
  "subrarr" => [0x02979],
  "subset" => [0x02282],
  "subseteq" => [0x02286],
  "subseteqq" => [0x02AC5],
  "subsetneq" => [0x0228A],
  "subsetneqq" => [0x02ACB],
  "subsim" => [0x02AC7],
  "subsub" => [0x02AD5],
  "subsup" => [0x02AD3],
  "succ" => [0x0227B],
  "succapprox" => [0x02AB8],
  "succcurlyeq" => [0x0227D],
  "succeq" => [0x02AB0],
  "succnapprox" => [0x02ABA],
  "succneqq" => [0x02AB6],
  "succnsim" => [0x022E9],
  "succsim" => [0x0227F],
  "sum" => [0x02211],
  "sung" => [0x0266A],
  "sup" => [0x02283],
  "sup1" => [0x000B9],
  "sup2" => [0x000B2],
  "sup3" => [0x000B3],
  "supE" => [0x02AC6],
  "supdot" => [0x02ABE],
  "supdsub" => [0x02AD8],
  "supe" => [0x02287],
  "supedot" => [0x02AC4],
  "suphsol" => [0x027C9],
  "suphsub" => [0x02AD7],
  "suplarr" => [0x0297B],
  "supmult" => [0x02AC2],
  "supnE" => [0x02ACC],
  "supne" => [0x0228B],
  "supplus" => [0x02AC0],
  "supset" => [0x02283],
  "supseteq" => [0x02287],
  "supseteqq" => [0x02AC6],
  "supsetneq" => [0x0228B],
  "supsetneqq" => [0x02ACC],
  "supsim" => [0x02AC8],
  "supsub" => [0x02AD4],
  "supsup" => [0x02AD6],
  "swArr" => [0x021D9],
  "swarhk" => [0x02926],
  "swarr" => [0x02199],
  "swarrow" => [0x02199],
  "swnwar" => [0x0292A],
  "szlig" => [0x000DF],
  "target" => [0x02316],
  "tau" => [0x003C4],
  "tbrk" => [0x023B4],
  "tcaron" => [0x00165],
  "tcedil" => [0x00163],
  "tcy" => [0x00442],
  "tdot" => [0x020DB],
  "telrec" => [0x02315],
  "tfr" => [0x1D531],
  "there4" => [0x02234],
  "therefore" => [0x02234],
  "theta" => [0x003B8],
  "thetasym" => [0x003D1],
  "thetav" => [0x003D1],
  "thickapprox" => [0x02248],
  "thicksim" => [0x0223C],
  "thinsp" => [0x02009],
  "thkap" => [0x02248],
  "thksim" => [0x0223C],
  "thorn" => [0x000FE],
  "tilde" => [0x002DC],
  "times" => [0x000D7],
  "timesb" => [0x022A0],
  "timesbar" => [0x02A31],
  "timesd" => [0x02A30],
  "tint" => [0x0222D],
  "toea" => [0x02928],
  "top" => [0x022A4],
  "topbot" => [0x02336],
  "topcir" => [0x02AF1],
  "topf" => [0x1D565],
  "topfork" => [0x02ADA],
  "tosa" => [0x02929],
  "tprime" => [0x02034],
  "trade" => [0x02122],
  "triangle" => [0x025B5],
  "triangledown" => [0x025BF],
  "triangleleft" => [0x025C3],
  "trianglelefteq" => [0x022B4],
  "triangleq" => [0x0225C],
  "triangleright" => [0x025B9],
  "trianglerighteq" => [0x022B5],
  "tridot" => [0x025EC],
  "trie" => [0x0225C],
  "triminus" => [0x02A3A],
  "triplus" => [0x02A39],
  "trisb" => [0x029CD],
  "tritime" => [0x02A3B],
  "trpezium" => [0x023E2],
  "tscr" => [0x1D4C9],
  "tscy" => [0x00446],
  "tshcy" => [0x0045B],
  "tstrok" => [0x00167],
  "twixt" => [0x0226C],
  "twoheadleftarrow" => [0x0219E],
  "twoheadrightarrow" => [0x021A0],
  "uArr" => [0x021D1],
  "uHar" => [0x02963],
  "uacute" => [0x000FA],
  "uarr" => [0x02191],
  "ubrcy" => [0x0045E],
  "ubreve" => [0x0016D],
  "ucirc" => [0x000FB],
  "ucy" => [0x00443],
  "udarr" => [0x021C5],
  "udblac" => [0x00171],
  "udhar" => [0x0296E],
  "ufisht" => [0x0297E],
  "ufr" => [0x1D532],
  "ugrave" => [0x000F9],
  "uharl" => [0x021BF],
  "uharr" => [0x021BE],
  "uhblk" => [0x02580],
  "ulcorn" => [0x0231C],
  "ulcorner" => [0x0231C],
  "ulcrop" => [0x0230F],
  "ultri" => [0x025F8],
  "umacr" => [0x0016B],
  "uml" => [0x000A8],
  "uogon" => [0x00173],
  "uopf" => [0x1D566],
  "uparrow" => [0x02191],
  "updownarrow" => [0x02195],
  "upharpoonleft" => [0x021BF],
  "upharpoonright" => [0x021BE],
  "uplus" => [0x0228E],
  "upsi" => [0x003C5],
  "upsih" => [0x003D2],
  "upsilon" => [0x003C5],
  "upuparrows" => [0x021C8],
  "urcorn" => [0x0231D],
  "urcorner" => [0x0231D],
  "urcrop" => [0x0230E],
  "uring" => [0x0016F],
  "urtri" => [0x025F9],
  "uscr" => [0x1D4CA],
  "utdot" => [0x022F0],
  "utilde" => [0x00169],
  "utri" => [0x025B5],
  "utrif" => [0x025B4],
  "uuarr" => [0x021C8],
  "uuml" => [0x000FC],
  "uwangle" => [0x029A7],
  "vArr" => [0x021D5],
  "vBar" => [0x02AE8],
  "vBarv" => [0x02AE9],
  "vDash" => [0x022A8],
  "vangrt" => [0x0299C],
  "varepsilon" => [0x003F5],
  "varkappa" => [0x003F0],
  "varnothing" => [0x02205],
  "varphi" => [0x003D5],
  "varpi" => [0x003D6],
  "varpropto" => [0x0221D],
  "varr" => [0x02195],
  "varrho" => [0x003F1],
  "varsigma" => [0x003C2],
  "varsubsetneq" => [0x0228A, 0x0FE00],
  "varsubsetneqq" => [0x02ACB, 0x0FE00],
  "varsupsetneq" => [0x0228B, 0x0FE00],
  "varsupsetneqq" => [0x02ACC, 0x0FE00],
  "vartheta" => [0x003D1],
  "vartriangleleft" => [0x022B2],
  "vartriangleright" => [0x022B3],
  "vcy" => [0x00432],
  "vdash" => [0x022A2],
  "vee" => [0x02228],
  "veebar" => [0x022BB],
  "veeeq" => [0x0225A],
  "vellip" => [0x022EE],
  "verbar" => [0x0007C],
  "vert" => [0x0007C],
  "vfr" => [0x1D533],
  "vltri" => [0x022B2],
  "vnsub" => [0x02282, 0x020D2],
  "vnsup" => [0x02283, 0x020D2],
  "vopf" => [0x1D567],
  "vprop" => [0x0221D],
  "vrtri" => [0x022B3],
  "vscr" => [0x1D4CB],
  "vsubnE" => [0x02ACB, 0x0FE00],
  "vsubne" => [0x0228A, 0x0FE00],
  "vsupnE" => [0x02ACC, 0x0FE00],
  "vsupne" => [0x0228B, 0x0FE00],
  "vzigzag" => [0x0299A],
  "wcirc" => [0x00175],
  "wedbar" => [0x02A5F],
  "wedge" => [0x02227],
  "wedgeq" => [0x02259],
  "weierp" => [0x02118],
  "wfr" => [0x1D534],
  "wopf" => [0x1D568],
  "wp" => [0x02118],
  "wr" => [0x02240],
  "wreath" => [0x02240],
  "wscr" => [0x1D4CC],
  "xcap" => [0x022C2],
  "xcirc" => [0x025EF],
  "xcup" => [0x022C3],
  "xdtri" => [0x025BD],
  "xfr" => [0x1D535],
  "xhArr" => [0x027FA],
  "xharr" => [0x027F7],
  "xi" => [0x003BE],
  "xlArr" => [0x027F8],
  "xlarr" => [0x027F5],
  "xmap" => [0x027FC],
  "xnis" => [0x022FB],
  "xodot" => [0x02A00],
  "xopf" => [0x1D569],
  "xoplus" => [0x02A01],
  "xotime" => [0x02A02],
  "xrArr" => [0x027F9],
  "xrarr" => [0x027F6],
  "xscr" => [0x1D4CD],
  "xsqcup" => [0x02A06],
  "xuplus" => [0x02A04],
  "xutri" => [0x025B3],
  "xvee" => [0x022C1],
  "xwedge" => [0x022C0],
  "yacute" => [0x000FD],
  "yacy" => [0x0044F],
  "ycirc" => [0x00177],
  "ycy" => [0x0044B],
  "yen" => [0x000A5],
  "yfr" => [0x1D536],
  "yicy" => [0x00457],
  "yopf" => [0x1D56A],
  "yscr" => [0x1D4CE],
  "yucy" => [0x0044E],
  "yuml" => [0x000FF],
  "zacute" => [0x0017A],
  "zcaron" => [0x0017E],
  "zcy" => [0x00437],
  "zdot" => [0x0017C],
  "zeetrf" => [0x02128],
  "zeta" => [0x003B6],
  "zfr" => [0x1D537],
  "zhcy" => [0x00436],
  "zigrarr" => [0x021DD],
  "zopf" => [0x1D56B],
  "zscr" => [0x1D4CF],
  "zwj" => [0x0200D],
  "zwnj" => [0x0200C],
}

PK}$[�GF�M$M$4gems/gems/rdoc-6.4.1.1/lib/rdoc/markdown/literals.rbnu�[���# coding: UTF-8
# frozen_string_literal: true
# :markup: markdown

##
#--
# This set of literals is for Ruby 1.9 regular expressions and gives full
# unicode support.
#
# Unlike peg-markdown, this set of literals recognizes Unicode alphanumeric
# characters, newlines and spaces.
class RDoc::Markdown::Literals
  # :stopdoc:

    # This is distinct from setup_parser so that a standalone parser
    # can redefine #initialize and still have access to the proper
    # parser setup code.
    def initialize(str, debug=false)
      setup_parser(str, debug)
    end



    # Prepares for parsing +str+.  If you define a custom initialize you must
    # call this method before #parse
    def setup_parser(str, debug=false)
      set_string str, 0
      @memoizations = Hash.new { |h,k| h[k] = {} }
      @result = nil
      @failed_rule = nil
      @failing_rule_offset = -1

      setup_foreign_grammar
    end

    attr_reader :string
    attr_reader :failing_rule_offset
    attr_accessor :result, :pos

    def current_column(target=pos)
      if c = string.rindex("\n", target-1)
        return target - c - 1
      end

      target + 1
    end

    def current_line(target=pos)
      cur_offset = 0
      cur_line = 0

      string.each_line do |line|
        cur_line += 1
        cur_offset += line.size
        return cur_line if cur_offset >= target
      end

      -1
    end

    def lines
      lines = []
      string.each_line { |l| lines << l }
      lines
    end



    def get_text(start)
      @string[start..@pos-1]
    end

    # Sets the string and current parsing position for the parser.
    def set_string string, pos
      @string = string
      @string_size = string ? string.size : 0
      @pos = pos
    end

    def show_pos
      width = 10
      if @pos < width
        "#{@pos} (\"#{@string[0,@pos]}\" @ \"#{@string[@pos,width]}\")"
      else
        "#{@pos} (\"... #{@string[@pos - width, width]}\" @ \"#{@string[@pos,width]}\")"
      end
    end

    def failure_info
      l = current_line @failing_rule_offset
      c = current_column @failing_rule_offset

      if @failed_rule.kind_of? Symbol
        info = self.class::Rules[@failed_rule]
        "line #{l}, column #{c}: failed rule '#{info.name}' = '#{info.rendered}'"
      else
        "line #{l}, column #{c}: failed rule '#{@failed_rule}'"
      end
    end

    def failure_caret
      l = current_line @failing_rule_offset
      c = current_column @failing_rule_offset

      line = lines[l-1]
      "#{line}\n#{' ' * (c - 1)}^"
    end

    def failure_character
      l = current_line @failing_rule_offset
      c = current_column @failing_rule_offset
      lines[l-1][c-1, 1]
    end

    def failure_oneline
      l = current_line @failing_rule_offset
      c = current_column @failing_rule_offset

      char = lines[l-1][c-1, 1]

      if @failed_rule.kind_of? Symbol
        info = self.class::Rules[@failed_rule]
        "@#{l}:#{c} failed rule '#{info.name}', got '#{char}'"
      else
        "@#{l}:#{c} failed rule '#{@failed_rule}', got '#{char}'"
      end
    end

    class ParseError < RuntimeError
    end

    def raise_error
      raise ParseError, failure_oneline
    end

    def show_error(io=STDOUT)
      error_pos = @failing_rule_offset
      line_no = current_line(error_pos)
      col_no = current_column(error_pos)

      io.puts "On line #{line_no}, column #{col_no}:"

      if @failed_rule.kind_of? Symbol
        info = self.class::Rules[@failed_rule]
        io.puts "Failed to match '#{info.rendered}' (rule '#{info.name}')"
      else
        io.puts "Failed to match rule '#{@failed_rule}'"
      end

      io.puts "Got: #{string[error_pos,1].inspect}"
      line = lines[line_no-1]
      io.puts "=> #{line}"
      io.print(" " * (col_no + 3))
      io.puts "^"
    end

    def set_failed_rule(name)
      if @pos > @failing_rule_offset
        @failed_rule = name
        @failing_rule_offset = @pos
      end
    end

    attr_reader :failed_rule

    def match_string(str)
      len = str.size
      if @string[pos,len] == str
        @pos += len
        return str
      end

      return nil
    end

    def scan(reg)
      if m = reg.match(@string, @pos)
        @pos = m.end(0)
        return true
      end

      return nil
    end

    if "".respond_to? :ord
      def get_byte
        if @pos >= @string_size
          return nil
        end

        s = @string[@pos].ord
        @pos += 1
        s
      end
    else
      def get_byte
        if @pos >= @string_size
          return nil
        end

        s = @string[@pos]
        @pos += 1
        s
      end
    end

    def parse(rule=nil)
      # We invoke the rules indirectly via apply
      # instead of by just calling them as methods because
      # if the rules use left recursion, apply needs to
      # manage that.

      if !rule
        apply(:_root)
      else
        method = rule.gsub("-","_hyphen_")
        apply :"_#{method}"
      end
    end

    class MemoEntry
      def initialize(ans, pos)
        @ans = ans
        @pos = pos
        @result = nil
        @set = false
        @left_rec = false
      end

      attr_reader :ans, :pos, :result, :set
      attr_accessor :left_rec

      def move!(ans, pos, result)
        @ans = ans
        @pos = pos
        @result = result
        @set = true
        @left_rec = false
      end
    end

    def external_invoke(other, rule, *args)
      old_pos = @pos
      old_string = @string

      set_string other.string, other.pos

      begin
        if val = __send__(rule, *args)
          other.pos = @pos
          other.result = @result
        else
          other.set_failed_rule "#{self.class}##{rule}"
        end
        val
      ensure
        set_string old_string, old_pos
      end
    end

    def apply_with_args(rule, *args)
      memo_key = [rule, args]
      if m = @memoizations[memo_key][@pos]
        @pos = m.pos
        if !m.set
          m.left_rec = true
          return nil
        end

        @result = m.result

        return m.ans
      else
        m = MemoEntry.new(nil, @pos)
        @memoizations[memo_key][@pos] = m
        start_pos = @pos

        ans = __send__ rule, *args

        lr = m.left_rec

        m.move! ans, @pos, @result

        # Don't bother trying to grow the left recursion
        # if it's failing straight away (thus there is no seed)
        if ans and lr
          return grow_lr(rule, args, start_pos, m)
        else
          return ans
        end
      end
    end

    def apply(rule)
      if m = @memoizations[rule][@pos]
        @pos = m.pos
        if !m.set
          m.left_rec = true
          return nil
        end

        @result = m.result

        return m.ans
      else
        m = MemoEntry.new(nil, @pos)
        @memoizations[rule][@pos] = m
        start_pos = @pos

        ans = __send__ rule

        lr = m.left_rec

        m.move! ans, @pos, @result

        # Don't bother trying to grow the left recursion
        # if it's failing straight away (thus there is no seed)
        if ans and lr
          return grow_lr(rule, nil, start_pos, m)
        else
          return ans
        end
      end
    end

    def grow_lr(rule, args, start_pos, m)
      while true
        @pos = start_pos
        @result = m.result

        if args
          ans = __send__ rule, *args
        else
          ans = __send__ rule
        end
        return nil unless ans

        break if @pos <= m.pos

        m.move! ans, @pos, @result
      end

      @result = m.result
      @pos = m.pos
      return m.ans
    end

    class RuleInfo
      def initialize(name, rendered)
        @name = name
        @rendered = rendered
      end

      attr_reader :name, :rendered
    end

    def self.rule_info(name, rendered)
      RuleInfo.new(name, rendered)
    end


  # :startdoc:
  # :stopdoc:
  def setup_foreign_grammar; end

  # Alphanumeric = /\p{Word}/
  def _Alphanumeric
    _tmp = scan(/\G(?-mix:\p{Word})/)
    set_failed_rule :_Alphanumeric unless _tmp
    return _tmp
  end

  # AlphanumericAscii = /[A-Za-z0-9]/
  def _AlphanumericAscii
    _tmp = scan(/\G(?-mix:[A-Za-z0-9])/)
    set_failed_rule :_AlphanumericAscii unless _tmp
    return _tmp
  end

  # BOM = "uFEFF"
  def _BOM
    _tmp = match_string("uFEFF")
    set_failed_rule :_BOM unless _tmp
    return _tmp
  end

  # Newline = /\n|\r\n?|\p{Zl}|\p{Zp}/
  def _Newline
    _tmp = scan(/\G(?-mix:\n|\r\n?|\p{Zl}|\p{Zp})/)
    set_failed_rule :_Newline unless _tmp
    return _tmp
  end

  # NonAlphanumeric = /\p{^Word}/
  def _NonAlphanumeric
    _tmp = scan(/\G(?-mix:\p{^Word})/)
    set_failed_rule :_NonAlphanumeric unless _tmp
    return _tmp
  end

  # Spacechar = /\t|\p{Zs}/
  def _Spacechar
    _tmp = scan(/\G(?-mix:\t|\p{Zs})/)
    set_failed_rule :_Spacechar unless _tmp
    return _tmp
  end

  Rules = {}
  Rules[:_Alphanumeric] = rule_info("Alphanumeric", "/\\p{Word}/")
  Rules[:_AlphanumericAscii] = rule_info("AlphanumericAscii", "/[A-Za-z0-9]/")
  Rules[:_BOM] = rule_info("BOM", "\"uFEFF\"")
  Rules[:_Newline] = rule_info("Newline", "/\\n|\\r\\n?|\\p{Zl}|\\p{Zp}/")
  Rules[:_NonAlphanumeric] = rule_info("NonAlphanumeric", "/\\p{^Word}/")
  Rules[:_Spacechar] = rule_info("Spacechar", "/\\t|\\p{Zs}/")
  # :startdoc:
end
PK}$[p��-}}(gems/gems/rdoc-6.4.1.1/lib/rdoc/alias.rbnu�[���# frozen_string_literal: true
##
# Represent an alias, which is an old_name/new_name pair associated with a
# particular context
#--
# TODO implement Alias as a proxy to a method/attribute, inheriting from
#      MethodAttr

class RDoc::Alias < RDoc::CodeObject

  ##
  # Aliased method's name

  attr_reader :new_name

  alias name new_name

  ##
  # Aliasee method's name

  attr_reader :old_name

  ##
  # Is this an alias declared in a singleton context?

  attr_accessor :singleton

  ##
  # Source file token stream

  attr_reader :text

  ##
  # Creates a new Alias with a token stream of +text+ that aliases +old_name+
  # to +new_name+, has +comment+ and is a +singleton+ context.

  def initialize(text, old_name, new_name, comment, singleton = false)
    super()

    @text = text
    @singleton = singleton
    @old_name = old_name
    @new_name = new_name
    self.comment = comment
  end

  ##
  # Order by #singleton then #new_name

  def <=>(other)
    [@singleton ? 0 : 1, new_name] <=> [other.singleton ? 0 : 1, other.new_name]
  end

  ##
  # HTML fragment reference for this alias

  def aref
    type = singleton ? 'c' : 'i'
    "#alias-#{type}-#{html_name}"
  end

  ##
  # Full old name including namespace

  def full_old_name
    @full_name || "#{parent.name}#{pretty_old_name}"
  end

  ##
  # HTML id-friendly version of +#new_name+.

  def html_name
    CGI.escape(@new_name.gsub('-', '-2D')).gsub('%','-').sub(/^-/, '')
  end

  def inspect # :nodoc:
    parent_name = parent ? parent.name : '(unknown)'
    "#<%s:0x%x %s.alias_method %s, %s>" % [
      self.class, object_id,
      parent_name, @old_name, @new_name,
    ]
  end

  ##
  # '::' for the alias of a singleton method/attribute, '#' for instance-level.

  def name_prefix
    singleton ? '::' : '#'
  end

  ##
  # Old name with prefix '::' or '#'.

  def pretty_old_name
    "#{singleton ? '::' : '#'}#{@old_name}"
  end

  ##
  # New name with prefix '::' or '#'.

  def pretty_new_name
    "#{singleton ? '::' : '#'}#{@new_name}"
  end

  alias pretty_name pretty_new_name

  def to_s # :nodoc:
    "alias: #{self.new_name} -> #{self.pretty_old_name} in: #{parent}"
  end

end

PK}$[epC0��.gems/gems/rdoc-6.4.1.1/lib/rdoc/meta_method.rbnu�[���# frozen_string_literal: true
##
# MetaMethod represents a meta-programmed method

class RDoc::MetaMethod < RDoc::AnyMethod
end

PK}$[�W,���/gems/gems/rdoc-6.4.1.1/lib/rdoc/normal_class.rbnu�[���# frozen_string_literal: true
##
# A normal class, neither singleton nor anonymous

class RDoc::NormalClass < RDoc::ClassModule

  ##
  # The ancestors of this class including modules.  Unlike Module#ancestors,
  # this class is not included in the result.  The result will contain both
  # RDoc::ClassModules and Strings.

  def ancestors
    if String === superclass then
      super << superclass
    elsif superclass then
      ancestors = super
      ancestors << superclass
      ancestors.concat superclass.ancestors
    else
      super
    end
  end

  def aref_prefix # :nodoc:
    'class'
  end

  ##
  # The definition of this class, <tt>class MyClassName</tt>

  def definition
    "class #{full_name}"
  end

  def direct_ancestors
    superclass ? super + [superclass] : super
  end

  def inspect # :nodoc:
    superclass = @superclass ? " < #{@superclass}" : nil
    "<%s:0x%x class %s%s includes: %p extends: %p attributes: %p methods: %p aliases: %p>" % [
      self.class, object_id,
      full_name, superclass, @includes, @extends, @attributes, @method_list, @aliases
    ]
  end

  def to_s # :nodoc:
    display = "#{self.class.name} #{self.full_name}"
    if superclass
      display += ' < ' + (superclass.is_a?(String) ? superclass : superclass.full_name)
    end
    display += ' -> ' + is_alias_for.to_s if is_alias_for
    display
  end

  def pretty_print q # :nodoc:
    superclass = @superclass ? " < #{@superclass}" : nil

    q.group 2, "[class #{full_name}#{superclass} ", "]" do
      q.breakable
      q.text "includes:"
      q.breakable
      q.seplist @includes do |inc| q.pp inc end

      q.breakable
      q.text "constants:"
      q.breakable
      q.seplist @constants do |const| q.pp const end

      q.breakable
      q.text "attributes:"
      q.breakable
      q.seplist @attributes do |attr| q.pp attr end

      q.breakable
      q.text "methods:"
      q.breakable
      q.seplist @method_list do |meth| q.pp meth end

      q.breakable
      q.text "aliases:"
      q.breakable
      q.seplist @aliases do |aliaz| q.pp aliaz end

      q.breakable
      q.text "comment:"
      q.breakable
      q.pp comment
    end
  end

end

PK}$[a�g���0gems/gems/rdoc-6.4.1.1/lib/rdoc/rubygems_hook.rbnu�[���# frozen_string_literal: true
require 'rubygems/user_interaction'
require 'fileutils'
require 'rdoc'

##
# Gem::RDoc provides methods to generate RDoc and ri data for installed gems
# upon gem installation.
#
# This file is automatically required by RubyGems 1.9 and newer.

class RDoc::RubygemsHook

  include Gem::UserInteraction
  extend  Gem::UserInteraction

  @rdoc_version = nil
  @specs = []

  ##
  # Force installation of documentation?

  attr_accessor :force

  ##
  # Generate rdoc?

  attr_accessor :generate_rdoc

  ##
  # Generate ri data?

  attr_accessor :generate_ri

  class << self

    ##
    # Loaded version of RDoc.  Set by ::load_rdoc

    attr_reader :rdoc_version

  end

  ##
  # Post installs hook that generates documentation for each specification in
  # +specs+

  def self.generation_hook installer, specs
    start = Time.now
    types = installer.document

    generate_rdoc = types.include? 'rdoc'
    generate_ri   = types.include? 'ri'

    specs.each do |spec|
      new(spec, generate_rdoc, generate_ri).generate
    end

    return unless generate_rdoc or generate_ri

    duration = (Time.now - start).to_i
    names    = specs.map(&:name).join ', '

    say "Done installing documentation for #{names} after #{duration} seconds"
  end

  ##
  # Loads the RDoc generator

  def self.load_rdoc
    return if @rdoc_version

    require_relative 'rdoc'

    @rdoc_version = Gem::Version.new ::RDoc::VERSION
  end

  ##
  # Creates a new documentation generator for +spec+.  RDoc and ri data
  # generation can be enabled or disabled through +generate_rdoc+ and
  # +generate_ri+ respectively.
  #
  # Only +generate_ri+ is enabled by default.

  def initialize spec, generate_rdoc = false, generate_ri = true
    @doc_dir   = spec.doc_dir
    @force     = false
    @rdoc      = nil
    @spec      = spec

    @generate_rdoc = generate_rdoc
    @generate_ri   = generate_ri

    @rdoc_dir = spec.doc_dir 'rdoc'
    @ri_dir   = spec.doc_dir 'ri'
  end

  ##
  # Removes legacy rdoc arguments from +args+
  #--
  # TODO move to RDoc::Options

  def delete_legacy_args args
    args.delete '--inline-source'
    args.delete '--promiscuous'
    args.delete '-p'
    args.delete '--one-file'
  end

  ##
  # Generates documentation using the named +generator+ ("darkfish" or "ri")
  # and following the given +options+.
  #
  # Documentation will be generated into +destination+

  def document generator, options, destination
    generator_name = generator

    options = options.dup
    options.exclude ||= [] # TODO maybe move to RDoc::Options#finish
    options.setup_generator generator
    options.op_dir = destination
    Dir.chdir @spec.full_gem_path do
      options.finish
    end

    generator = options.generator.new @rdoc.store, options

    @rdoc.options = options
    @rdoc.generator = generator

    say "Installing #{generator_name} documentation for #{@spec.full_name}"

    FileUtils.mkdir_p options.op_dir

    Dir.chdir options.op_dir do
      begin
        @rdoc.class.current = @rdoc
        @rdoc.generator.generate
      ensure
        @rdoc.class.current = nil
      end
    end
  end

  ##
  # Generates RDoc and ri data

  def generate
    return if @spec.default_gem?
    return unless @generate_ri or @generate_rdoc

    setup

    options = nil

    args = @spec.rdoc_options
    args.concat @spec.source_paths
    args.concat @spec.extra_rdoc_files

    case config_args = Gem.configuration[:rdoc]
    when String then
      args = args.concat config_args.split(' ')
    when Array then
      args = args.concat config_args
    end

    delete_legacy_args args

    Dir.chdir @spec.full_gem_path do
      options = ::RDoc::Options.new
      options.default_title = "#{@spec.full_name} Documentation"
      options.parse args
    end

    options.quiet = !Gem.configuration.really_verbose

    @rdoc = new_rdoc
    @rdoc.options = options

    store = RDoc::Store.new
    store.encoding = options.encoding
    store.dry_run  = options.dry_run
    store.main     = options.main_page
    store.title    = options.title

    @rdoc.store = store

    say "Parsing documentation for #{@spec.full_name}"

    Dir.chdir @spec.full_gem_path do
      @rdoc.parse_files options.files
    end

    document 'ri',       options, @ri_dir if
      @generate_ri   and (@force or not File.exist? @ri_dir)

    document 'darkfish', options, @rdoc_dir if
      @generate_rdoc and (@force or not File.exist? @rdoc_dir)
  end

  ##
  # #new_rdoc creates a new RDoc instance.  This method is provided only to
  # make testing easier.

  def new_rdoc # :nodoc:
    ::RDoc::RDoc.new
  end

  ##
  # Is rdoc documentation installed?

  def rdoc_installed?
    File.exist? @rdoc_dir
  end

  ##
  # Removes generated RDoc and ri data

  def remove
    base_dir = @spec.base_dir

    raise Gem::FilePermissionError, base_dir unless File.writable? base_dir

    FileUtils.rm_rf @rdoc_dir
    FileUtils.rm_rf @ri_dir
  end

  ##
  # Is ri data installed?

  def ri_installed?
    File.exist? @ri_dir
  end

  ##
  # Prepares the spec for documentation generation

  def setup
    self.class.load_rdoc

    raise Gem::FilePermissionError, @doc_dir if
      File.exist?(@doc_dir) and not File.writable?(@doc_dir)

    FileUtils.mkdir_p @doc_dir unless File.exist? @doc_dir
  end

end
PK}$[��/s-5-5'gems/gems/rdoc-6.4.1.1/lib/rdoc/rdoc.rbnu�[���# frozen_string_literal: true
require 'rdoc'

require 'find'
require 'fileutils'
require 'pathname'
require 'time'

##
# This is the driver for generating RDoc output.  It handles file parsing and
# generation of output.
#
# To use this class to generate RDoc output via the API, the recommended way
# is:
#
#   rdoc = RDoc::RDoc.new
#   options = RDoc::Options.load_options # returns an RDoc::Options instance
#   # set extra options
#   rdoc.document options
#
# You can also generate output like the +rdoc+ executable:
#
#   rdoc = RDoc::RDoc.new
#   rdoc.document argv
#
# Where +argv+ is an array of strings, each corresponding to an argument you'd
# give rdoc on the command line.  See <tt>rdoc --help</tt> for details.

class RDoc::RDoc

  @current = nil

  ##
  # This is the list of supported output generators

  GENERATORS = {}

  ##
  # Generator instance used for creating output

  attr_accessor :generator

  ##
  # Hash of files and their last modified times.

  attr_reader :last_modified

  ##
  # RDoc options

  attr_accessor :options

  ##
  # Accessor for statistics.  Available after each call to parse_files

  attr_reader :stats

  ##
  # The current documentation store

  attr_reader :store

  ##
  # Add +klass+ that can generate output after parsing

  def self.add_generator(klass)
    name = klass.name.sub(/^RDoc::Generator::/, '').downcase
    GENERATORS[name] = klass
  end

  ##
  # Active RDoc::RDoc instance

  def self.current
    @current
  end

  ##
  # Sets the active RDoc::RDoc instance

  def self.current= rdoc
    @current = rdoc
  end

  ##
  # Creates a new RDoc::RDoc instance.  Call #document to parse files and
  # generate documentation.

  def initialize
    @current       = nil
    @generator     = nil
    @last_modified = {}
    @old_siginfo   = nil
    @options       = nil
    @stats         = nil
    @store         = nil
  end

  ##
  # Report an error message and exit

  def error(msg)
    raise RDoc::Error, msg
  end

  ##
  # Gathers a set of parseable files from the files and directories listed in
  # +files+.

  def gather_files files
    files = ["."] if files.empty?

    file_list = normalized_file_list files, true, @options.exclude

    file_list = remove_unparseable(file_list)

    if file_list.count {|name, mtime|
         file_list[name] = @last_modified[name] unless mtime
         mtime
       } > 0
      @last_modified.replace file_list
      file_list.keys.sort
    else
      []
    end
  end

  ##
  # Turns RDoc from stdin into HTML

  def handle_pipe
    @html = RDoc::Markup::ToHtml.new @options

    parser = RDoc::Text::MARKUP_FORMAT[@options.markup]

    document = parser.parse $stdin.read

    out = @html.convert document

    $stdout.write out
  end

  ##
  # Installs a siginfo handler that prints the current filename.

  def install_siginfo_handler
    return unless Signal.list.include? 'INFO'

    @old_siginfo = trap 'INFO' do
      puts @current if @current
    end
  end

  ##
  # Create an output dir if it doesn't exist. If it does exist, but doesn't
  # contain the flag file <tt>created.rid</tt> then we refuse to use it, as
  # we may clobber some manually generated documentation

  def setup_output_dir(dir, force)
    flag_file = output_flag_file dir

    last = {}

    if @options.dry_run then
      # do nothing
    elsif File.exist? dir then
      error "#{dir} exists and is not a directory" unless File.directory? dir

      begin
        File.open flag_file do |io|
          unless force then
            Time.parse io.gets

            io.each do |line|
              file, time = line.split "\t", 2
              time = Time.parse(time) rescue next
              last[file] = time
            end
          end
        end
      rescue SystemCallError, TypeError
        error <<-ERROR

Directory #{dir} already exists, but it looks like it isn't an RDoc directory.

Because RDoc doesn't want to risk destroying any of your existing files,
you'll need to specify a different output directory name (using the --op <dir>
option)

        ERROR
      end unless @options.force_output
    else
      FileUtils.mkdir_p dir
      FileUtils.touch flag_file
    end

    last
  end

  ##
  # Sets the current documentation tree to +store+ and sets the store's rdoc
  # driver to this instance.

  def store= store
    @store = store
    @store.rdoc = self
  end

  ##
  # Update the flag file in an output directory.

  def update_output_dir(op_dir, time, last = {})
    return if @options.dry_run or not @options.update_output_dir
    unless ENV['SOURCE_DATE_EPOCH'].nil?
      time = Time.at(ENV['SOURCE_DATE_EPOCH'].to_i).gmtime
    end

    File.open output_flag_file(op_dir), "w" do |f|
      f.puts time.rfc2822
      last.each do |n, t|
        f.puts "#{n}\t#{t.rfc2822}"
      end
    end
  end

  ##
  # Return the path name of the flag file in an output directory.

  def output_flag_file(op_dir)
    File.join op_dir, "created.rid"
  end

  ##
  # The .document file contains a list of file and directory name patterns,
  # representing candidates for documentation. It may also contain comments
  # (starting with '#')

  def parse_dot_doc_file in_dir, filename
    # read and strip comments
    patterns = File.read(filename).gsub(/#.*/, '')

    result = {}

    patterns.split(' ').each do |patt|
      candidates = Dir.glob(File.join(in_dir, patt))
      result.update normalized_file_list(candidates, false, @options.exclude)
    end

    result
  end

  ##
  # Given a list of files and directories, create a list of all the Ruby
  # files they contain.
  #
  # If +force_doc+ is true we always add the given files, if false, only
  # add files that we guarantee we can parse.  It is true when looking at
  # files given on the command line, false when recursing through
  # subdirectories.
  #
  # The effect of this is that if you want a file with a non-standard
  # extension parsed, you must name it explicitly.

  def normalized_file_list(relative_files, force_doc = false,
                           exclude_pattern = nil)
    file_list = {}

    relative_files.each do |rel_file_name|
      rel_file_name = rel_file_name.sub(/^\.\//, '')
      next if rel_file_name.end_with? 'created.rid'
      next if exclude_pattern && exclude_pattern =~ rel_file_name
      stat = File.stat rel_file_name rescue next

      case type = stat.ftype
      when "file" then
        mtime = (stat.mtime unless (last_modified = @last_modified[rel_file_name] and
                                    stat.mtime.to_i <= last_modified.to_i))

        if force_doc or RDoc::Parser.can_parse(rel_file_name) then
          file_list[rel_file_name] = mtime
        end
      when "directory" then
        next if rel_file_name == "CVS" || rel_file_name == ".svn"

        created_rid = File.join rel_file_name, "created.rid"
        next if File.file? created_rid

        dot_doc = File.join rel_file_name, RDoc::DOT_DOC_FILENAME

        if File.file? dot_doc then
          file_list.update(parse_dot_doc_file(rel_file_name, dot_doc))
        else
          file_list.update(list_files_in_directory(rel_file_name))
        end
      else
        warn "rdoc can't parse the #{type} #{rel_file_name}"
      end
    end

    file_list
  end

  ##
  # Return a list of the files to be processed in a directory. We know that
  # this directory doesn't have a .document file, so we're looking for real
  # files. However we may well contain subdirectories which must be tested
  # for .document files.

  def list_files_in_directory dir
    files = Dir.glob File.join(dir, "*")

    normalized_file_list files, false, @options.exclude
  end

  ##
  # Parses +filename+ and returns an RDoc::TopLevel

  def parse_file filename
    encoding = @options.encoding
    filename = filename.encode encoding

    @stats.add_file filename

    return if RDoc::Parser.binary? filename

    content = RDoc::Encoding.read_file filename, encoding

    return unless content

    filename_path = Pathname(filename).expand_path
    begin
      relative_path = filename_path.relative_path_from @options.root
    rescue ArgumentError
      relative_path = filename_path
    end

    if @options.page_dir and
       relative_path.to_s.start_with? @options.page_dir.to_s then
      relative_path =
        relative_path.relative_path_from @options.page_dir
    end

    top_level = @store.add_file filename, relative_name: relative_path.to_s

    parser = RDoc::Parser.for top_level, filename, content, @options, @stats

    return unless parser

    parser.scan

    # restart documentation for the classes & modules found
    top_level.classes_or_modules.each do |cm|
      cm.done_documenting = false
    end

    top_level

  rescue Errno::EACCES => e
    $stderr.puts <<-EOF
Unable to read #{filename}, #{e.message}

Please check the permissions for this file.  Perhaps you do not have access to
it or perhaps the original author's permissions are to restrictive.  If the
this is not your library please report a bug to the author.
    EOF
  rescue => e
    $stderr.puts <<-EOF
Before reporting this, could you check that the file you're documenting
has proper syntax:

  #{Gem.ruby} -c #{filename}

RDoc is not a full Ruby parser and will fail when fed invalid ruby programs.

The internal error was:

\t(#{e.class}) #{e.message}

    EOF

    $stderr.puts e.backtrace.join("\n\t") if $DEBUG_RDOC

    raise e
    nil
  end

  ##
  # Parse each file on the command line, recursively entering directories.

  def parse_files files
    file_list = gather_files files
    @stats = RDoc::Stats.new @store, file_list.length, @options.verbosity

    return [] if file_list.empty?

    original_options = @options.dup
    @stats.begin_adding

    file_info = file_list.map do |filename|
      @current = filename
      parse_file filename
    end.compact

    @stats.done_adding
    @options = original_options

    file_info
  end

  ##
  # Removes file extensions known to be unparseable from +files+ and TAGS
  # files for emacs and vim.

  def remove_unparseable files
    files.reject do |file, *|
      file =~ /\.(?:class|eps|erb|scpt\.txt|svg|ttf|yml)$/i or
        (file =~ /tags$/i and
         File.open(file, 'rb') { |io|
           io.read(100) =~ /\A(\f\n[^,]+,\d+$|!_TAG_)/
         })
    end
  end

  ##
  # Generates documentation or a coverage report depending upon the settings
  # in +options+.
  #
  # +options+ can be either an RDoc::Options instance or an array of strings
  # equivalent to the strings that would be passed on the command line like
  # <tt>%w[-q -o doc -t My\ Doc\ Title]</tt>.  #document will automatically
  # call RDoc::Options#finish if an options instance was given.
  #
  # For a list of options, see either RDoc::Options or <tt>rdoc --help</tt>.
  #
  # By default, output will be stored in a directory called "doc" below the
  # current directory, so make sure you're somewhere writable before invoking.

  def document options
    self.store = RDoc::Store.new

    if RDoc::Options === options then
      @options = options
      @options.finish
    else
      @options = RDoc::Options.load_options
      @options.parse options
    end

    if @options.pipe then
      handle_pipe
      exit
    end

    unless @options.coverage_report then
      @last_modified = setup_output_dir @options.op_dir, @options.force_update
    end

    @store.encoding = @options.encoding
    @store.dry_run  = @options.dry_run
    @store.main     = @options.main_page
    @store.title    = @options.title
    @store.path     = @options.op_dir

    @start_time = Time.now

    @store.load_cache

    file_info = parse_files @options.files

    @options.default_title = "RDoc Documentation"

    @store.complete @options.visibility

    @stats.coverage_level = @options.coverage_report

    if @options.coverage_report then
      puts

      puts @stats.report.accept RDoc::Markup::ToRdoc.new
    elsif file_info.empty? then
      $stderr.puts "\nNo newer files." unless @options.quiet
    else
      gen_klass = @options.generator

      @generator = gen_klass.new @store, @options

      generate
    end

    if @stats and (@options.coverage_report or not @options.quiet) then
      puts
      puts @stats.summary.accept RDoc::Markup::ToRdoc.new
    end

    exit @stats.fully_documented? if @options.coverage_report
  end

  ##
  # Generates documentation for +file_info+ (from #parse_files) into the
  # output dir using the generator selected
  # by the RDoc options

  def generate
    if @options.dry_run then
      # do nothing
      @generator.generate
    else
      Dir.chdir @options.op_dir do
        unless @options.quiet then
          $stderr.puts "\nGenerating #{@generator.class.name.sub(/^.*::/, '')} format into #{Dir.pwd}..."
        end

        @generator.generate
        update_output_dir '.', @start_time, @last_modified
      end
    end
  end

  ##
  # Removes a siginfo handler and replaces the previous

  def remove_siginfo_handler
    return unless Signal.list.key? 'INFO'

    handler = @old_siginfo || 'DEFAULT'

    trap 'INFO', handler
  end

end

begin
  require 'rubygems'

  rdoc_extensions = Gem.find_files 'rdoc/discover'

  rdoc_extensions.each do |extension|
    begin
      load extension
    rescue => e
      warn "error loading #{extension.inspect}: #{e.message} (#{e.class})"
      warn "\t#{e.backtrace.join "\n\t"}" if $DEBUG
    end
  end
rescue LoadError
end

# require built-in generators after discovery in case they've been replaced
require_relative 'generator/darkfish'
require_relative 'generator/ri'
require_relative 'generator/pot'
PK}$[Pw_�{{2gems/gems/rdoc-6.4.1.1/lib/rdoc/cross_reference.rbnu�[���# frozen_string_literal: true
##
# RDoc::CrossReference is a reusable way to create cross references for names.

class RDoc::CrossReference

  ##
  # Regular expression to match class references
  #
  # 1. There can be a '\\' in front of text to suppress the cross-reference
  # 2. There can be a '::' in front of class names to reference from the
  #    top-level namespace.
  # 3. The method can be followed by parenthesis (not recommended)

  CLASS_REGEXP_STR = '\\\\?((?:\:{2})?[A-Z]\w*(?:\:\:\w+)*)'

  ##
  # Regular expression to match method references.
  #
  # See CLASS_REGEXP_STR

  METHOD_REGEXP_STR = '([A-Za-z]\w*[!?=]?|%|===?|\[\]=?|<<|>>|\+@|-@|-|\+|\*)(?:\([\w.+*/=<>-]*\))?'

  ##
  # Regular expressions matching text that should potentially have
  # cross-reference links generated are passed to add_regexp_handling. Note
  # that these expressions are meant to pick up text for which cross-references
  # have been suppressed, since the suppression characters are removed by the
  # code that is triggered.

  CROSSREF_REGEXP = /(?:^|[\s()])
                     (
                      (?:
                       # A::B::C.meth
                       #{CLASS_REGEXP_STR}(?:[.#]|::)#{METHOD_REGEXP_STR}

                       # A::B::C
                       # The stuff after CLASS_REGEXP_STR is a
                       # nasty hack.  CLASS_REGEXP_STR unfortunately matches
                       # words like dog and cat (these are legal "class"
                       # names in Fortran 95).  When a word is flagged as a
                       # potential cross-reference, limitations in the markup
                       # engine suppress other processing, such as typesetting.
                       # This is particularly noticeable for contractions.
                       # In order that words like "can't" not
                       # be flagged as potential cross-references, only
                       # flag potential class cross-references if the character
                       # after the cross-reference is a space, sentence
                       # punctuation, tag start character, or attribute
                       # marker.
                       | #{CLASS_REGEXP_STR}(?=[@\s).?!,;<\000]|\z)

                       # Stand-alone method (preceded by a #)
                       | \\?\##{METHOD_REGEXP_STR}

                       # Stand-alone method (preceded by ::)
                       | ::#{METHOD_REGEXP_STR}

                       # Things that look like filenames
                       # The key thing is that there must be at least
                       # one special character (period, slash, or
                       # underscore).
                       | (?:\.\.\/)*[-\/\w]+[_\/.][-\w\/.]+

                       # Things that have markup suppressed
                       # Don't process things like '\<' in \<tt>, though.
                       # TODO: including < is a hack, not very satisfying.
                       | \\[^\s<]
                      )

                      # labels for headings
                      (?:@[\w+%-]+(?:\.[\w|%-]+)?)?
                     )/x

  ##
  # Version of CROSSREF_REGEXP used when <tt>--hyperlink-all</tt> is specified.

  ALL_CROSSREF_REGEXP = /
                     (?:^|[\s()])
                     (
                      (?:
                       # A::B::C.meth
                       #{CLASS_REGEXP_STR}(?:[.#]|::)#{METHOD_REGEXP_STR}

                       # A::B::C
                       | #{CLASS_REGEXP_STR}(?=[@\s).?!,;<\000]|\z)

                       # Stand-alone method
                       | \\?#{METHOD_REGEXP_STR}

                       # Things that look like filenames
                       | (?:\.\.\/)*[-\/\w]+[_\/.][-\w\/.]+

                       # Things that have markup suppressed
                       | \\[^\s<]
                      )

                      # labels for headings
                      (?:@[\w+%-]+)?
                     )/x

  ##
  # Hash of references that have been looked-up to their replacements

  attr_accessor :seen

  ##
  # Allows cross-references to be created based on the given +context+
  # (RDoc::Context).

  def initialize context
    @context = context
    @store   = context.store

    @seen = {}
  end

  def resolve_method name
    ref = nil

    if /#{CLASS_REGEXP_STR}([.#]|::)#{METHOD_REGEXP_STR}/o =~ name then
      type = $2
      if '.' == type # will find either #method or ::method
        method = $3
      else
        method = "#{type}#{$3}"
      end
      container = @context.find_symbol_module($1)
    elsif /^([.#]|::)#{METHOD_REGEXP_STR}/o =~ name then
      type = $1
      if '.' == type
        method = $2
      else
        method = "#{type}#{$2}"
      end
      container = @context
    else
      type = nil
      container = nil
    end

    if container then
      unless RDoc::TopLevel === container then
        if '.' == type then
          if 'new' == method then # AnyClassName.new will be class method
            ref = container.find_local_symbol method
            ref = container.find_ancestor_local_symbol method unless ref
          else
            ref = container.find_local_symbol "::#{method}"
            ref = container.find_ancestor_local_symbol "::#{method}" unless ref
            ref = container.find_local_symbol "##{method}" unless ref
            ref = container.find_ancestor_local_symbol "##{method}" unless ref
          end
        else
          ref = container.find_local_symbol method
          ref = container.find_ancestor_local_symbol method unless ref
        end
      end
    end

    ref
  end

  ##
  # Returns a reference to +name+.
  #
  # If the reference is found and +name+ is not documented +text+ will be
  # returned.  If +name+ is escaped +name+ is returned.  If +name+ is not
  # found +text+ is returned.

  def resolve name, text
    return @seen[name] if @seen.include? name

    ref = case name
          when /^\\(#{CLASS_REGEXP_STR})$/o then
            @context.find_symbol $1
          else
            @context.find_symbol name
          end

    ref = resolve_method name unless ref

    # Try a page name
    ref = @store.page name if not ref and name =~ /^[\w.]+$/

    ref = nil if RDoc::Alias === ref # external alias, can't link to it

    out = if name == '\\' then
            name
          elsif name =~ /^\\/ then
            # we remove the \ only in front of what we know:
            # other backslashes are treated later, only outside of <tt>
            ref ? $' : name
          elsif ref then
            if ref.display? then
              ref
            else
              text
            end
          else
            text
          end

    @seen[name] = out

    out
  end

end

PK}$[󈗢��0gems/gems/rdoc-6.4.1.1/lib/rdoc/normal_module.rbnu�[���# frozen_string_literal: true
##
# A normal module, like NormalClass

class RDoc::NormalModule < RDoc::ClassModule

  def aref_prefix # :nodoc:
    'module'
  end

  def inspect # :nodoc:
    "#<%s:0x%x module %s includes: %p extends: %p attributes: %p methods: %p aliases: %p>" % [
      self.class, object_id,
      full_name, @includes, @extends, @attributes, @method_list, @aliases
    ]
  end

  ##
  # The definition of this module, <tt>module MyModuleName</tt>

  def definition
    "module #{full_name}"
  end

  ##
  # This is a module, returns true

  def module?
    true
  end

  def pretty_print q # :nodoc:
    q.group 2, "[module #{full_name}: ", "]" do
      q.breakable
      q.text "includes:"
      q.breakable
      q.seplist @includes do |inc| q.pp inc end
      q.breakable

      q.breakable
      q.text "constants:"
      q.breakable
      q.seplist @constants do |const| q.pp const end

      q.text "attributes:"
      q.breakable
      q.seplist @attributes do |attr| q.pp attr end
      q.breakable

      q.text "methods:"
      q.breakable
      q.seplist @method_list do |meth| q.pp meth end
      q.breakable

      q.text "aliases:"
      q.breakable
      q.seplist @aliases do |aliaz| q.pp aliaz end
      q.breakable

      q.text "comment:"
      q.breakable
      q.pp comment
    end
  end

  ##
  # Modules don't have one, raises NoMethodError

  def superclass
    raise NoMethodError, "#{full_name} is a module"
  end

end

PK}$[��y��+gems/gems/rdoc-6.4.1.1/lib/rdoc/encoding.rbnu�[���# coding: US-ASCII
# frozen_string_literal: true

##
# This class is a wrapper around File IO and Encoding that helps RDoc load
# files and convert them to the correct encoding.

module RDoc::Encoding

  HEADER_REGEXP = /^
    (?:
      \A\#!.*\n
      |
      ^\#\s+frozen[-_]string[-_]literal[=:].+\n
      |
      ^\#[^\n]+\b(?:en)?coding[=:]\s*(?<name>[^\s;]+).*\n
      |
      <\?xml[^?]*encoding=(?<quote>["'])(?<name>.*?)\k<quote>.*\n
    )+
  /xi # :nodoc:

  ##
  # Reads the contents of +filename+ and handles any encoding directives in
  # the file.
  #
  # The content will be converted to the +encoding+.  If the file cannot be
  # converted a warning will be printed and nil will be returned.
  #
  # If +force_transcode+ is true the document will be transcoded and any
  # unknown character in the target encoding will be replaced with '?'

  def self.read_file filename, encoding, force_transcode = false
    content = File.open filename, "rb" do |f| f.read end
    content.gsub!("\r\n", "\n") if RUBY_PLATFORM =~ /mswin|mingw/

    utf8 = content.sub!(/\A\xef\xbb\xbf/, '')

    enc = RDoc::Encoding.detect_encoding content
    content = RDoc::Encoding.change_encoding content, enc if enc

    begin
      encoding ||= Encoding.default_external
      orig_encoding = content.encoding

      if not orig_encoding.ascii_compatible? then
        content = content.encode encoding
      elsif utf8 then
        content = RDoc::Encoding.change_encoding content, Encoding::UTF_8
        content = content.encode encoding
      else
        # assume the content is in our output encoding
        content = RDoc::Encoding.change_encoding content, encoding
      end

      unless content.valid_encoding? then
        # revert and try to transcode
        content = RDoc::Encoding.change_encoding content, orig_encoding
        content = content.encode encoding
      end

      unless content.valid_encoding? then
        warn "unable to convert #{filename} to #{encoding}, skipping"
        content = nil
      end
    rescue Encoding::InvalidByteSequenceError,
           Encoding::UndefinedConversionError => e
      if force_transcode then
        content = RDoc::Encoding.change_encoding content, orig_encoding
        content = content.encode(encoding,
                                 :invalid => :replace,
                                 :undef => :replace,
                                 :replace => '?')
        return content
      else
        warn "unable to convert #{e.message} for #{filename}, skipping"
        return nil
      end
    end

    content
  rescue ArgumentError => e
    raise unless e.message =~ /unknown encoding name - (.*)/
    warn "unknown encoding name \"#{$1}\" for #{filename}, skipping"
    nil
  rescue Errno::EISDIR, Errno::ENOENT
    nil
  end

  def self.remove_frozen_string_literal string
    string =~ /\A(?:#!.*\n)?(.*\n)/
    first_line = $1

    if first_line =~ /\A# +frozen[-_]string[-_]literal[=:].+$/i
      string = string.sub first_line, ''
    end

    string
  end

  ##
  # Detects the encoding of +string+ based on the magic comment

  def self.detect_encoding string
    result = HEADER_REGEXP.match string
    name = result && result[:name]

    name ? Encoding.find(name) : nil
  end

  ##
  # Removes magic comments and shebang

  def self.remove_magic_comment string
    string.sub HEADER_REGEXP do |s|
      s.gsub(/[^\n]/, '')
    end
  end

  ##
  # Changes encoding based on +encoding+ without converting and returns new
  # string

  def self.change_encoding text, encoding
    if text.kind_of? RDoc::Comment
      text.encode! encoding
    else
      # TODO: Remove this condition after Ruby 2.2 EOL
      if RUBY_VERSION < '2.3.0'
        text.force_encoding encoding
      else
        String.new text, encoding: encoding
      end
    end
  end

end
PK}$[bb�]]+gems/gems/rdoc-6.4.1.1/lib/rdoc/constant.rbnu�[���# frozen_string_literal: true
##
# A constant

class RDoc::Constant < RDoc::CodeObject

  MARSHAL_VERSION = 0 # :nodoc:

  ##
  # Sets the module or class this is constant is an alias for.

  attr_writer :is_alias_for

  ##
  # The constant's name

  attr_accessor :name

  ##
  # The constant's value

  attr_accessor :value

  ##
  # The constant's visibility

  attr_accessor :visibility

  ##
  # Creates a new constant with +name+, +value+ and +comment+

  def initialize(name, value, comment)
    super()

    @name  = name
    @value = value

    @is_alias_for = nil
    @visibility   = :public

    self.comment = comment
  end

  ##
  # Constants are ordered by name

  def <=> other
    return unless self.class === other

    [parent_name, name] <=> [other.parent_name, other.name]
  end

  ##
  # Constants are equal when their #parent and #name is the same

  def == other
    self.class == other.class and
      @parent == other.parent and
      @name == other.name
  end

  ##
  # A constant is documented if it has a comment, or is an alias
  # for a documented class or module.

  def documented?
    return true if super
    return false unless @is_alias_for
    case @is_alias_for
    when String then
      found = @store.find_class_or_module @is_alias_for
      return false unless found
      @is_alias_for = found
    end
    @is_alias_for.documented?
  end

  ##
  # Full constant name including namespace

  def full_name
    @full_name ||= "#{parent_name}::#{@name}"
  end

  ##
  # The module or class this constant is an alias for

  def is_alias_for
    case @is_alias_for
    when String then
      found = @store.find_class_or_module @is_alias_for
      @is_alias_for = found if found
      @is_alias_for
    else
      @is_alias_for
    end
  end

  def inspect # :nodoc:
    "#<%s:0x%x %s::%s>" % [
      self.class, object_id,
      parent_name, @name,
    ]
  end

  ##
  # Dumps this Constant for use by ri.  See also #marshal_load

  def marshal_dump
    alias_name = case found = is_alias_for
                 when RDoc::CodeObject then found.full_name
                 else                       found
                 end

    [ MARSHAL_VERSION,
      @name,
      full_name,
      @visibility,
      alias_name,
      parse(@comment),
      @file.relative_name,
      parent.name,
      parent.class,
      section.title,
    ]
  end

  ##
  # Loads this Constant from +array+.  For a loaded Constant the following
  # methods will return cached values:
  #
  # * #full_name
  # * #parent_name

  def marshal_load array
    initialize array[1], nil, array[5]

    @full_name     = array[2]
    @visibility    = array[3] || :public
    @is_alias_for  = array[4]
    #                      5 handled above
    #                      6 handled below
    @parent_name   = array[7]
    @parent_class  = array[8]
    @section_title = array[9]

    @file = RDoc::TopLevel.new array[6]
  end

  ##
  # Path to this constant for use with HTML generator output.

  def path
    "#{@parent.path}##{@name}"
  end

  def pretty_print q # :nodoc:
    q.group 2, "[#{self.class.name} #{full_name}", "]" do
      unless comment.empty? then
        q.breakable
        q.text "comment:"
        q.breakable
        q.pp @comment
      end
    end
  end

  ##
  # Sets the store for this class or module and its contained code objects.

  def store= store
    super

    @file = @store.add_file @file.full_name if @file
  end

  def to_s # :nodoc:
    parent_name = parent ? parent.full_name : '(unknown)'
    if is_alias_for
      "constant #{parent_name}::#@name -> #{is_alias_for}"
    else
      "constant #{parent_name}::#@name"
    end
  end

end

PK}$[L���.gems/gems/rdoc-6.4.1.1/lib/rdoc/erb_partial.rbnu�[���# frozen_string_literal: true
##
# Allows an ERB template to be rendered in the context (binding) of an
# existing ERB template evaluation.

class RDoc::ERBPartial < ERB

  ##
  # Overrides +compiler+ startup to set the +eoutvar+ to an empty string only
  # if it isn't already set.

  def set_eoutvar compiler, eoutvar = '_erbout'
    super

    compiler.pre_cmd = ["#{eoutvar} ||= +''"]
  end

end

PK}$[
[>		'gems/gems/rdoc-6.4.1.1/lib/rdoc/attr.rbnu�[���# frozen_string_literal: true
##
# An attribute created by \#attr, \#attr_reader, \#attr_writer or
# \#attr_accessor

class RDoc::Attr < RDoc::MethodAttr

  ##
  # 3::
  #   RDoc 4
  #    Added parent name and class
  #    Added section title

  MARSHAL_VERSION = 3 # :nodoc:

  ##
  # Is the attribute readable ('R'), writable ('W') or both ('RW')?

  attr_accessor :rw

  ##
  # Creates a new Attr with body +text+, +name+, read/write status +rw+ and
  # +comment+.  +singleton+ marks this as a class attribute.

  def initialize(text, name, rw, comment, singleton = false)
    super text, name

    @rw = rw
    @singleton = singleton
    self.comment = comment
  end

  ##
  # Attributes are equal when their names, singleton and rw are identical

  def == other
    self.class == other.class and
      self.name == other.name and
      self.rw == other.rw and
      self.singleton == other.singleton
  end

  ##
  # Add +an_alias+ as an attribute in +context+.

  def add_alias(an_alias, context)
    new_attr = self.class.new(self.text, an_alias.new_name, self.rw,
                              self.comment, self.singleton)

    new_attr.record_location an_alias.file
    new_attr.visibility = self.visibility
    new_attr.is_alias_for = self
    @aliases << new_attr
    context.add_attribute new_attr
    new_attr
  end

  ##
  # The #aref prefix for attributes

  def aref_prefix
    'attribute'
  end

  ##
  # Attributes never call super.  See RDoc::AnyMethod#calls_super
  #
  # An RDoc::Attr can show up in the method list in some situations (see
  # Gem::ConfigFile)

  def calls_super # :nodoc:
    false
  end

  ##
  # Returns attr_reader, attr_writer or attr_accessor as appropriate.

  def definition
    case @rw
    when 'RW' then 'attr_accessor'
    when 'R'  then 'attr_reader'
    when 'W'  then 'attr_writer'
    end
  end

  def inspect # :nodoc:
    alias_for = @is_alias_for ? " (alias for #{@is_alias_for.name})" : nil
    visibility = self.visibility
    visibility = "forced #{visibility}" if force_documentation
    "#<%s:0x%x %s %s (%s)%s>" % [
      self.class, object_id,
      full_name,
      rw,
      visibility,
      alias_for,
    ]
  end

  ##
  # Dumps this Attr for use by ri.  See also #marshal_load

  def marshal_dump
    [ MARSHAL_VERSION,
      @name,
      full_name,
      @rw,
      @visibility,
      parse(@comment),
      singleton,
      @file.relative_name,
      @parent.full_name,
      @parent.class,
      @section.title
    ]
  end

  ##
  # Loads this Attr from +array+.  For a loaded Attr the following
  # methods will return cached values:
  #
  # * #full_name
  # * #parent_name

  def marshal_load array
    initialize_visibility

    @aliases      = []
    @parent       = nil
    @parent_name  = nil
    @parent_class = nil
    @section      = nil
    @file         = nil

    version        = array[0]
    @name          = array[1]
    @full_name     = array[2]
    @rw            = array[3]
    @visibility    = array[4]
    @comment       = array[5]
    @singleton     = array[6] || false # MARSHAL_VERSION == 0
    #                      7 handled below
    @parent_name   = array[8]
    @parent_class  = array[9]
    @section_title = array[10]

    @file = RDoc::TopLevel.new array[7] if version > 1

    @parent_name ||= @full_name.split('#', 2).first
  end

  def pretty_print q # :nodoc:
    q.group 2, "[#{self.class.name} #{full_name} #{rw} #{visibility}", "]" do
      unless comment.empty? then
        q.breakable
        q.text "comment:"
        q.breakable
        q.pp @comment
      end
    end
  end

  def to_s # :nodoc:
    "#{definition} #{name} in: #{parent}"
  end

  ##
  # Attributes do not have token streams.
  #
  # An RDoc::Attr can show up in the method list in some situations (see
  # Gem::ConfigFile)

  def token_stream # :nodoc:
  end

end

PK}$[:�ܶ�,gems/gems/rdoc-6.4.1.1/lib/rdoc/parser/rd.rbnu�[���# frozen_string_literal: true
##
# Parse a RD format file.  The parsed RDoc::Markup::Document is attached as a
# file comment.

class RDoc::Parser::RD < RDoc::Parser

  include RDoc::Parser::Text

  parse_files_matching(/\.rd(?:\.[^.]+)?$/)

  ##
  # Creates an rd-format TopLevel for the given file.

  def scan
    comment = RDoc::Comment.new @content, @top_level
    comment.format = 'rd'

    @top_level.comment = comment
  end

end

PK}$[?�S����+gems/gems/rdoc-6.4.1.1/lib/rdoc/parser/c.rbnu�[���# frozen_string_literal: true
require 'tsort'

##
# RDoc::Parser::C attempts to parse C extension files.  It looks for
# the standard patterns that you find in extensions: +rb_define_class+,
# +rb_define_method+ and so on.  It tries to find the corresponding
# C source for the methods and extract comments, but if we fail
# we don't worry too much.
#
# The comments associated with a Ruby method are extracted from the C
# comment block associated with the routine that _implements_ that
# method, that is to say the method whose name is given in the
# +rb_define_method+ call. For example, you might write:
#
#   /*
#    * Returns a new array that is a one-dimensional flattening of this
#    * array (recursively). That is, for every element that is an array,
#    * extract its elements into the new array.
#    *
#    *    s = [ 1, 2, 3 ]           #=> [1, 2, 3]
#    *    t = [ 4, 5, 6, [7, 8] ]   #=> [4, 5, 6, [7, 8]]
#    *    a = [ s, t, 9, 10 ]       #=> [[1, 2, 3], [4, 5, 6, [7, 8]], 9, 10]
#    *    a.flatten                 #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
#    */
#    static VALUE
#    rb_ary_flatten(VALUE ary)
#    {
#        ary = rb_obj_dup(ary);
#        rb_ary_flatten_bang(ary);
#        return ary;
#    }
#
#    ...
#
#    void
#    Init_Array(void)
#    {
#      ...
#      rb_define_method(rb_cArray, "flatten", rb_ary_flatten, 0);
#
# Here RDoc will determine from the +rb_define_method+ line that there's a
# method called "flatten" in class Array, and will look for the implementation
# in the method +rb_ary_flatten+. It will then use the comment from that
# method in the HTML output. This method must be in the same source file
# as the +rb_define_method+.
#
# The comment blocks may include special directives:
#
# [Document-class: +name+]
#   Documentation for the named class.
#
# [Document-module: +name+]
#   Documentation for the named module.
#
# [Document-const: +name+]
#   Documentation for the named +rb_define_const+.
#
#   Constant values can be supplied on the first line of the comment like so:
#
#     /* 300: The highest possible score in bowling */
#     rb_define_const(cFoo, "PERFECT", INT2FIX(300));
#
#   The value can contain internal colons so long as they are escaped with a \
#
# [Document-global: +name+]
#   Documentation for the named +rb_define_global_const+
#
# [Document-variable: +name+]
#   Documentation for the named +rb_define_variable+
#
# [Document-method\: +method_name+]
#   Documentation for the named method.  Use this when the method name is
#   unambiguous.
#
# [Document-method\: <tt>ClassName::method_name</tt>]
#   Documentation for a singleton method in the given class.  Use this when
#   the method name alone is ambiguous.
#
# [Document-method\: <tt>ClassName#method_name</tt>]
#   Documentation for a instance method in the given class.  Use this when the
#   method name alone is ambiguous.
#
# [Document-attr: +name+]
#   Documentation for the named attribute.
#
# [call-seq:  <i>text up to an empty line</i>]
#   Because C source doesn't give descriptive names to Ruby-level parameters,
#   you need to document the calling sequence explicitly
#
# In addition, RDoc assumes by default that the C method implementing a
# Ruby function is in the same source file as the rb_define_method call.
# If this isn't the case, add the comment:
#
#   rb_define_method(....);  // in filename
#
# As an example, we might have an extension that defines multiple classes
# in its Init_xxx method. We could document them using
#
#   /*
#    * Document-class:  MyClass
#    *
#    * Encapsulate the writing and reading of the configuration
#    * file. ...
#    */
#
#   /*
#    * Document-method: read_value
#    *
#    * call-seq:
#    *   cfg.read_value(key)            -> value
#    *   cfg.read_value(key} { |key| }  -> value
#    *
#    * Return the value corresponding to +key+ from the configuration.
#    * In the second form, if the key isn't found, invoke the
#    * block and return its value.
#    */

class RDoc::Parser::C < RDoc::Parser

  parse_files_matching(/\.(?:([CcHh])\1?|c([+xp])\2|y)\z/)

  include RDoc::Text

  ##
  # Maps C variable names to names of Ruby classes or modules

  attr_reader :classes

  ##
  # C file the parser is parsing

  attr_accessor :content

  ##
  # Dependencies from a missing enclosing class to the classes in
  # missing_dependencies that depend upon it.

  attr_reader :enclosure_dependencies

  ##
  # Maps C variable names to names of Ruby classes (and singleton classes)

  attr_reader :known_classes

  ##
  # Classes found while parsing the C file that were not yet registered due to
  # a missing enclosing class.  These are processed by do_missing

  attr_reader :missing_dependencies

  ##
  # Maps C variable names to names of Ruby singleton classes

  attr_reader :singleton_classes

  ##
  # The TopLevel items in the parsed file belong to

  attr_reader :top_level

  ##
  # Prepares for parsing a C file.  See RDoc::Parser#initialize for details on
  # the arguments.

  def initialize top_level, file_name, content, options, stats
    super

    @known_classes = RDoc::KNOWN_CLASSES.dup
    @content = handle_tab_width handle_ifdefs_in @content
    @file_dir = File.dirname @file_name

    @classes           = load_variable_map :c_class_variables
    @singleton_classes = load_variable_map :c_singleton_class_variables

    @markup = @options.markup

    # class_variable => { function => [method, ...] }
    @methods = Hash.new { |h, f| h[f] = Hash.new { |i, m| i[m] = [] } }

    # missing variable => [handle_class_module arguments]
    @missing_dependencies = {}

    # missing enclosure variable => [dependent handle_class_module arguments]
    @enclosure_dependencies = Hash.new { |h, k| h[k] = [] }
    @enclosure_dependencies.instance_variable_set :@missing_dependencies,
                                                  @missing_dependencies

    @enclosure_dependencies.extend TSort

    def @enclosure_dependencies.tsort_each_node &block
      each_key(&block)
    rescue TSort::Cyclic => e
      cycle_vars = e.message.scan(/"(.*?)"/).flatten

      cycle = cycle_vars.sort.map do |var_name|
        delete var_name

        var_name, type, mod_name, = @missing_dependencies[var_name]

        "#{type} #{mod_name} (#{var_name})"
      end.join ', '

      warn "Unable to create #{cycle} due to a cyclic class or module creation"

      retry
    end

    def @enclosure_dependencies.tsort_each_child node, &block
      fetch(node, []).each(&block)
    end
  end

  ##
  # Scans #content for rb_define_alias

  def do_aliases
    @content.scan(/rb_define_alias\s*\(
                   \s*(\w+),
                   \s*"(.+?)",
                   \s*"(.+?)"
                   \s*\)/xm) do |var_name, new_name, old_name|
      class_name = @known_classes[var_name]

      unless class_name then
        @options.warn "Enclosing class or module %p for alias %s %s is not known" % [
          var_name, new_name, old_name]
        next
      end

      class_obj = find_class var_name, class_name
      comment = find_alias_comment var_name, new_name, old_name
      comment.normalize
      if comment.to_s.empty? and existing_method = class_obj.method_list.find { |m| m.name == old_name}
        comment = existing_method.comment
      end
      add_alias(var_name, class_obj, old_name, new_name, comment)
    end
  end

  ##
  # Add alias, either from a direct alias definition, or from two
  # method that reference the same function.

  def add_alias(var_name, class_obj, old_name, new_name, comment)
    al = RDoc::Alias.new '', old_name, new_name, ''
    al.singleton = @singleton_classes.key? var_name
    al.comment = comment
    al.record_location @top_level
    class_obj.add_alias al
    @stats.add_alias al
    al
  end

  ##
  # Scans #content for rb_attr and rb_define_attr

  def do_attrs
    @content.scan(/rb_attr\s*\(
                   \s*(\w+),
                   \s*([\w"()]+),
                   \s*([01]),
                   \s*([01]),
                   \s*\w+\);/xm) do |var_name, attr_name, read, write|
      handle_attr var_name, attr_name, read, write
    end

    @content.scan(%r%rb_define_attr\(
                             \s*([\w\.]+),
                             \s*"([^"]+)",
                             \s*(\d+),
                             \s*(\d+)\s*\);
                %xm) do |var_name, attr_name, read, write|
      handle_attr var_name, attr_name, read, write
    end
  end

  ##
  # Scans #content for boot_defclass

  def do_boot_defclass
    @content.scan(/(\w+)\s*=\s*boot_defclass\s*\(\s*"(\w+?)",\s*(\w+?)\s*\)/) do
      |var_name, class_name, parent|
      parent = nil if parent == "0"
      handle_class_module(var_name, :class, class_name, parent, nil)
    end
  end

  ##
  # Scans #content for rb_define_class, boot_defclass, rb_define_class_under
  # and rb_singleton_class

  def do_classes_and_modules
    do_boot_defclass if @file_name == "class.c"

    @content.scan(
      %r(
        (?<var_name>[\w\.]+)\s* =
        \s*rb_(?:
          define_(?:
            class(?: # rb_define_class(class_name_1, parent_name_1)
              \s*\(
                \s*"(?<class_name_1>\w+)",
                \s*(?<parent_name_1>\w+)\s*
              \)
            |
              _under\s*\( # rb_define_class_under(class_under, class_name2, parent_name2...)
                \s* (?<class_under>\w+),
                \s* "(?<class_name_2>\w+)",
                \s*
                (?:
                  (?<parent_name_2>[\w\*\s\(\)\.\->]+) |
                  rb_path2class\("(?<path>[\w:]+)"\)
                )
              \s*\)
            )
          |
            module(?: # rb_define_module(module_name_1)
              \s*\(
                \s*"(?<module_name_1>\w+)"\s*
              \)
            |
              _under\s*\( # rb_define_module_under(module_under, module_name_2)
                \s*(?<module_under>\w+),
                \s*"(?<module_name_2>\w+)"
              \s*\)
            )
          )
      |
        struct_define_without_accessor\s*\( # rb_struct_define_without_accessor(class_name_3, parent_name_3, ...)
          \s*"(?<class_name_3>\w+)",
          \s*(?<parent_name_3>\w+),
          \s*\w+,        # Allocation function
          (?:\s*"\w+",)* # Attributes
          \s*NULL
        \)
      |
        singleton_class\s*\( # rb_singleton_class(target_class_name)
          \s*(?<target_class_name>\w+)
        \)
        )
      )mx
    ) do
      class_name = $~[:class_name_1]
      type = :class
      if class_name
        # rb_define_class(class_name_1, parent_name_1)
        parent_name = $~[:parent_name_1]
        #under = nil
      else
        class_name = $~[:class_name_2]
        if class_name
          # rb_define_class_under(class_under, class_name2, parent_name2...)
          parent_name = $~[:parent_name_2] || $~[:path]
          under = $~[:class_under]
        else
          class_name = $~[:class_name_3]
          if class_name
            # rb_struct_define_without_accessor(class_name_3, parent_name_3, ...)
            parent_name = $~[:parent_name_3]
            #under = nil
          else
            type = :module
            class_name = $~[:module_name_1]
            #parent_name = nil
            if class_name
              # rb_define_module(module_name_1)
              #under = nil
            else
              class_name = $~[:module_name_2]
              if class_name
                # rb_define_module_under(module_under, module_name_1)
                under = $~[:module_under]
              else
                # rb_singleton_class(target_class_name)
                target_class_name = $~[:target_class_name]
                handle_singleton $~[:var_name], target_class_name
                next
              end
            end
          end
        end
      end

      handle_class_module($~[:var_name], type, class_name, parent_name, under)
    end
  end

  ##
  # Scans #content for rb_define_variable, rb_define_readonly_variable,
  # rb_define_const and rb_define_global_const

  def do_constants
    @content.scan(%r%\Wrb_define_
                   ( variable          |
                     readonly_variable |
                     const             |
                     global_const        )
               \s*\(
                 (?:\s*(\w+),)?
                 \s*"(\w+)",
                 \s*(.*?)\s*\)\s*;
                 %xm) do |type, var_name, const_name, definition|
      var_name = "rb_cObject" if !var_name or var_name == "rb_mKernel"
      handle_constants type, var_name, const_name, definition
    end

    @content.scan(%r%
                  \Wrb_curses_define_const
                  \s*\(
                    \s*
                    (\w+)
                    \s*
                  \)
                  \s*;%xm) do |consts|
      const = consts.first

      handle_constants 'const', 'mCurses', const, "UINT2NUM(#{const})"
    end

    @content.scan(%r%
                  \Wrb_file_const
                  \s*\(
                    \s*
                    "([^"]+)",
                    \s*
                    (.*?)
                    \s*
                  \)
                  \s*;%xm) do |name, value|
      handle_constants 'const', 'rb_mFConst', name, value
    end
  end


  ##
  # Scans #content for rb_include_module

  def do_includes
    @content.scan(/rb_include_module\s*\(\s*(\w+?),\s*(\w+?)\s*\)/) do |c,m|
      next unless cls = @classes[c]
      m = @known_classes[m] || m

      comment = new_comment '', @top_level, :c
      incl = cls.add_include RDoc::Include.new(m, comment)
      incl.record_location @top_level
    end
  end

  ##
  # Scans #content for rb_define_method, rb_define_singleton_method,
  # rb_define_module_function, rb_define_private_method,
  # rb_define_global_function and define_filetest_function

  def do_methods
    @content.scan(%r%rb_define_
                   (
                      singleton_method |
                      method           |
                      module_function  |
                      private_method
                   )
                   \s*\(\s*([\w\.]+),
                     \s*"([^"]+)",
                     \s*(?:RUBY_METHOD_FUNC\(|VALUEFUNC\(|\(METHOD\))?(\w+)\)?,
                     \s*(-?\w+)\s*\)
                   (?:;\s*/[*/]\s+in\s+(\w+?\.(?:cpp|c|y)))?
                 %xm) do |type, var_name, meth_name, function, param_count, source_file|

      # Ignore top-object and weird struct.c dynamic stuff
      next if var_name == "ruby_top_self"
      next if var_name == "nstr"

      var_name = "rb_cObject" if var_name == "rb_mKernel"
      handle_method(type, var_name, meth_name, function, param_count,
                    source_file)
    end

    @content.scan(%r%rb_define_global_function\s*\(
                             \s*"([^"]+)",
                             \s*(?:RUBY_METHOD_FUNC\(|VALUEFUNC\()?(\w+)\)?,
                             \s*(-?\w+)\s*\)
                (?:;\s*/[*/]\s+in\s+(\w+?\.[cy]))?
                %xm) do |meth_name, function, param_count, source_file|
      handle_method("method", "rb_mKernel", meth_name, function, param_count,
                    source_file)
    end

    @content.scan(/define_filetest_function\s*\(
                     \s*"([^"]+)",
                     \s*(?:RUBY_METHOD_FUNC\(|VALUEFUNC\()?(\w+)\)?,
                     \s*(-?\w+)\s*\)/xm) do |meth_name, function, param_count|

      handle_method("method", "rb_mFileTest", meth_name, function, param_count)
      handle_method("singleton_method", "rb_cFile", meth_name, function,
                    param_count)
    end
  end

  ##
  # Creates classes and module that were missing were defined due to the file
  # order being different than the declaration order.

  def do_missing
    return if @missing_dependencies.empty?

    @enclosure_dependencies.tsort.each do |in_module|
      arguments = @missing_dependencies.delete in_module

      next unless arguments # dependency on existing class

      handle_class_module(*arguments)
    end
  end

  ##
  # Finds the comment for an alias on +class_name+ from +new_name+ to
  # +old_name+

  def find_alias_comment class_name, new_name, old_name
    content =~ %r%((?>/\*.*?\*/\s+))
                  rb_define_alias\(\s*#{Regexp.escape class_name}\s*,
                                   \s*"#{Regexp.escape new_name}"\s*,
                                   \s*"#{Regexp.escape old_name}"\s*\);%xm

    new_comment($1 || '', @top_level, :c)
  end

  ##
  # Finds a comment for rb_define_attr, rb_attr or Document-attr.
  #
  # +var_name+ is the C class variable the attribute is defined on.
  # +attr_name+ is the attribute's name.
  #
  # +read+ and +write+ are the read/write flags ('1' or '0').  Either both or
  # neither must be provided.

  def find_attr_comment var_name, attr_name, read = nil, write = nil
    attr_name = Regexp.escape attr_name

    rw = if read and write then
           /\s*#{read}\s*,\s*#{write}\s*/xm
         else
           /.*?/m
         end

    comment = if @content =~ %r%((?>/\*.*?\*/\s+))
                                rb_define_attr\((?:\s*#{var_name},)?\s*
                                                "#{attr_name}"\s*,
                                                #{rw}\)\s*;%xm then
                $1
              elsif @content =~ %r%((?>/\*.*?\*/\s+))
                                   rb_attr\(\s*#{var_name}\s*,
                                            \s*#{attr_name}\s*,
                                            #{rw},.*?\)\s*;%xm then
                $1
              elsif @content =~ %r%(/\*.*?(?:\s*\*\s*)?)
                                   Document-attr:\s#{attr_name}\s*?\n
                                   ((?>(.|\n)*?\*/))%x then
                "#{$1}\n#{$2}"
              else
                ''
              end

    new_comment comment, @top_level, :c
  end

  ##
  # Generate a Ruby-method table

  def gen_body_table file_content
    table = {}
    file_content.scan(%r{
      ((?>/\*.*?\*/\s*)?)
      ((?:(?:\w+)\s+)?
        (?:intern\s+)?VALUE\s+(\w+)
        \s*(?:\([^)]*\))(?:[^\);]|$))
    | ((?>/\*.*?\*/\s*))^\s*(\#\s*define\s+(\w+)\s+(\w+))
    | ^\s*\#\s*define\s+(\w+)\s+(\w+)
    }xm) do
      case
      when $1
        table[$3] = [:func_def, $1, $2, $~.offset(2)] if !table[$3] || table[$3][0] != :func_def
      when $4
        table[$6] = [:macro_def, $4, $5, $~.offset(5), $7] if !table[$6] || table[$6][0] == :macro_alias
      when $8
        table[$8] ||= [:macro_alias, $9]
      end
    end
    table
  end

  ##
  # Find the C code corresponding to a Ruby method

  def find_body class_name, meth_name, meth_obj, file_content, quiet = false
    if file_content
      @body_table ||= {}
      @body_table[file_content] ||= gen_body_table file_content
      type, *args = @body_table[file_content][meth_name]
    end

    case type
    when :func_def
      comment = new_comment args[0], @top_level, :c
      body = args[1]
      offset, = args[2]

      comment.remove_private if comment

      # try to find the whole body
      body = $& if /#{Regexp.escape body}[^(]*?\{.*?^\}/m =~ file_content

      # The comment block may have been overridden with a 'Document-method'
      # block. This happens in the interpreter when multiple methods are
      # vectored through to the same C method but those methods are logically
      # distinct (for example Kernel.hash and Kernel.object_id share the same
      # implementation

      override_comment = find_override_comment class_name, meth_obj
      comment = override_comment if override_comment

      comment.normalize
      find_modifiers comment, meth_obj if comment

      #meth_obj.params = params
      meth_obj.start_collecting_tokens
      tk = { :line_no => 1, :char_no => 1, :text => body }
      meth_obj.add_token tk
      meth_obj.comment = comment
      meth_obj.line    = file_content[0, offset].count("\n") + 1

      body
    when :macro_def
      comment = new_comment args[0], @top_level, :c
      body = args[1]
      offset, = args[2]

      find_body class_name, args[3], meth_obj, file_content, true

      comment.normalize
      find_modifiers comment, meth_obj

      meth_obj.start_collecting_tokens
      tk = { :line_no => 1, :char_no => 1, :text => body }
      meth_obj.add_token tk
      meth_obj.comment = comment
      meth_obj.line    = file_content[0, offset].count("\n") + 1

      body
    when :macro_alias
      # with no comment we hope the aliased definition has it and use it's
      # definition

      body = find_body(class_name, args[0], meth_obj, file_content, true)

      return body if body

      @options.warn "No definition for #{meth_name}"
      false
    else # No body, but might still have an override comment
      comment = find_override_comment class_name, meth_obj

      if comment then
        comment.normalize
        find_modifiers comment, meth_obj
        meth_obj.comment = comment

        ''
      else
        @options.warn "No definition for #{meth_name}"
        false
      end
    end
  end

  ##
  # Finds a RDoc::NormalClass or RDoc::NormalModule for +raw_name+

  def find_class(raw_name, name)
    unless @classes[raw_name]
      if raw_name =~ /^rb_m/
        container = @top_level.add_module RDoc::NormalModule, name
      else
        container = @top_level.add_class RDoc::NormalClass, name
      end

      container.record_location @top_level
      @classes[raw_name] = container
    end
    @classes[raw_name]
  end

  ##
  # Look for class or module documentation above Init_+class_name+(void),
  # in a Document-class +class_name+ (or module) comment or above an
  # rb_define_class (or module).  If a comment is supplied above a matching
  # Init_ and a rb_define_class the Init_ comment is used.
  #
  #   /*
  #    * This is a comment for Foo
  #    */
  #   Init_Foo(void) {
  #       VALUE cFoo = rb_define_class("Foo", rb_cObject);
  #   }
  #
  #   /*
  #    * Document-class: Foo
  #    * This is a comment for Foo
  #    */
  #   Init_foo(void) {
  #       VALUE cFoo = rb_define_class("Foo", rb_cObject);
  #   }
  #
  #   /*
  #    * This is a comment for Foo
  #    */
  #   VALUE cFoo = rb_define_class("Foo", rb_cObject);

  def find_class_comment class_name, class_mod
    comment = nil

    if @content =~ %r%
        ((?>/\*.*?\*/\s+))
        (static\s+)?
        void\s+
        Init_#{class_name}\s*(?:_\(\s*)?\(\s*(?:void\s*)?\)%xmi then
      comment = $1.sub(%r%Document-(?:class|module):\s+#{class_name}%, '')
    elsif @content =~ %r%Document-(?:class|module):\s+#{class_name}\s*?
                         (?:<\s+[:,\w]+)?\n((?>.*?\*/))%xm then
      comment = "/*\n#{$1}"
    elsif @content =~ %r%((?>/\*.*?\*/\s+))
                         ([\w\.\s]+\s* = \s+)?rb_define_(class|module)[\t (]*?"(#{class_name})"%xm then
      comment = $1
    elsif @content =~ %r%((?>/\*.*?\*/\s+))
                         ([\w\. \t]+ = \s+)?rb_define_(class|module)_under[\t\w, (]*?"(#{class_name.split('::').last})"%xm then
      comment = $1
    else
      comment = ''
    end

    comment = new_comment comment, @top_level, :c
    comment.normalize

    look_for_directives_in class_mod, comment

    class_mod.add_comment comment, @top_level
  end

  ##
  # Generate a const table

  def gen_const_table file_content
    table = {}
    @content.scan(%r{
      ((?>^\s*/\*.*?\*/\s+))
        rb_define_(\w+)\((?:\s*(?:\w+),)?\s*
                           "(\w+)"\s*,
                           .*?\)\s*;
    | Document-(?:const|global|variable):\s
        ((?:\w+::)*\w+)
        \s*?\n((?>.*?\*/))
    }mxi) do
      case
      when $1 then table[[$2, $3]] = $1
      when $4 then table[$4] = "/*\n" + $5
      end
    end
    table
  end

  ##
  # Finds a comment matching +type+ and +const_name+ either above the
  # comment or in the matching Document- section.

  def find_const_comment(type, const_name, class_name = nil)
    @const_table ||= {}
    @const_table[@content] ||= gen_const_table @content
    table = @const_table[@content]

    comment =
      table[[type, const_name]] ||
      (class_name && table[class_name + "::" + const_name]) ||
      table[const_name] ||
      ''

    new_comment comment, @top_level, :c
  end

  ##
  # Handles modifiers in +comment+ and updates +meth_obj+ as appropriate.

  def find_modifiers comment, meth_obj
    comment.normalize
    comment.extract_call_seq meth_obj

    look_for_directives_in meth_obj, comment
  end

  ##
  # Finds a <tt>Document-method</tt> override for +meth_obj+ on +class_name+

  def find_override_comment class_name, meth_obj
    name = Regexp.escape meth_obj.name
    prefix = Regexp.escape meth_obj.name_prefix

    comment = if @content =~ %r%Document-method:
                                \s+#{class_name}#{prefix}#{name}
                                \s*?\n((?>.*?\*/))%xm then
                "/*#{$1}"
              elsif @content =~ %r%Document-method:
                                   \s#{name}\s*?\n((?>.*?\*/))%xm then
                "/*#{$1}"
              end

    return unless comment

    new_comment comment, @top_level, :c
  end

  ##
  # Creates a new RDoc::Attr +attr_name+ on class +var_name+ that is either
  # +read+, +write+ or both

  def handle_attr(var_name, attr_name, read, write)
    rw = ''
    rw += 'R' if '1' == read
    rw += 'W' if '1' == write

    class_name = @known_classes[var_name]

    return unless class_name

    class_obj = find_class var_name, class_name

    return unless class_obj

    comment = find_attr_comment var_name, attr_name
    comment.normalize

    name = attr_name.gsub(/rb_intern(?:_const)?\("([^"]+)"\)/, '\1')

    attr = RDoc::Attr.new '', name, rw, comment

    attr.record_location @top_level
    class_obj.add_attribute attr
    @stats.add_attribute attr
  end

  ##
  # Creates a new RDoc::NormalClass or RDoc::NormalModule based on +type+
  # named +class_name+ in +parent+ which was assigned to the C +var_name+.

  def handle_class_module(var_name, type, class_name, parent, in_module)
    parent_name = @known_classes[parent] || parent

    if in_module then
      enclosure = @classes[in_module] || @store.find_c_enclosure(in_module)

      if enclosure.nil? and enclosure = @known_classes[in_module] then
        enc_type = /^rb_m/ =~ in_module ? :module : :class
        handle_class_module in_module, enc_type, enclosure, nil, nil
        enclosure = @classes[in_module]
      end

      unless enclosure then
        @enclosure_dependencies[in_module] << var_name
        @missing_dependencies[var_name] =
          [var_name, type, class_name, parent, in_module]

        return
      end
    else
      enclosure = @top_level
    end

    if type == :class then
      full_name = if RDoc::ClassModule === enclosure then
                    enclosure.full_name + "::#{class_name}"
                  else
                    class_name
                  end

      if @content =~ %r%Document-class:\s+#{full_name}\s*<\s+([:,\w]+)% then
        parent_name = $1
      end

      cm = enclosure.add_class RDoc::NormalClass, class_name, parent_name
    else
      cm = enclosure.add_module RDoc::NormalModule, class_name
    end

    cm.record_location enclosure.top_level

    find_class_comment cm.full_name, cm

    case cm
    when RDoc::NormalClass
      @stats.add_class cm
    when RDoc::NormalModule
      @stats.add_module cm
    end

    @classes[var_name] = cm
    @known_classes[var_name] = cm.full_name
    @store.add_c_enclosure var_name, cm
  end

  ##
  # Adds constants.  By providing some_value: at the start of the comment you
  # can override the C value of the comment to give a friendly definition.
  #
  #   /* 300: The perfect score in bowling */
  #   rb_define_const(cFoo, "PERFECT", INT2FIX(300));
  #
  # Will override <tt>INT2FIX(300)</tt> with the value +300+ in the output
  # RDoc.  Values may include quotes and escaped colons (\:).

  def handle_constants(type, var_name, const_name, definition)
    class_name = @known_classes[var_name]

    return unless class_name

    class_obj = find_class var_name, class_name

    unless class_obj then
      @options.warn 'Enclosing class or module %p is not known' % [const_name]
      return
    end

    comment = find_const_comment type, const_name, class_name
    comment.normalize

    # In the case of rb_define_const, the definition and comment are in
    # "/* definition: comment */" form.  The literal ':' and '\' characters
    # can be escaped with a backslash.
    if type.downcase == 'const' then
      no_match, new_definition, new_comment = comment.text.split(/(\A.*):/)

      if no_match and no_match.empty? then
        if new_definition.empty? then # Default to literal C definition
          new_definition = definition
        else
          new_definition = new_definition.gsub("\:", ":")
          new_definition = new_definition.gsub("\\", '\\')
        end

        new_definition.sub!(/\A(\s+)/, '')

        new_comment = "#{$1}#{new_comment.lstrip}"

        new_comment = self.new_comment(new_comment, @top_level, :c)

        con = RDoc::Constant.new const_name, new_definition, new_comment
      else
        con = RDoc::Constant.new const_name, definition, comment
      end
    else
      con = RDoc::Constant.new const_name, definition, comment
    end

    con.record_location @top_level
    @stats.add_constant con
    class_obj.add_constant con
  end

  ##
  # Removes #ifdefs that would otherwise confuse us

  def handle_ifdefs_in(body)
    body.gsub(/^#ifdef HAVE_PROTOTYPES.*?#else.*?\n(.*?)#endif.*?\n/m, '\1')
  end

  ##
  # Adds an RDoc::AnyMethod +meth_name+ defined on a class or module assigned
  # to +var_name+.  +type+ is the type of method definition function used.
  # +singleton_method+ and +module_function+ create a singleton method.

  def handle_method(type, var_name, meth_name, function, param_count,
                    source_file = nil)
    class_name = @known_classes[var_name]
    singleton  = @singleton_classes.key? var_name

    @methods[var_name][function] << meth_name

    return unless class_name

    class_obj = find_class var_name, class_name

    if existing_method = class_obj.method_list.find { |m| m.c_function == function }
      add_alias(var_name, class_obj, existing_method.name, meth_name, existing_method.comment)
    end

    if class_obj then
      if meth_name == 'initialize' then
        meth_name = 'new'
        singleton = true
        type = 'method' # force public
      end

      meth_obj = RDoc::AnyMethod.new '', meth_name
      meth_obj.c_function = function
      meth_obj.singleton =
        singleton || %w[singleton_method module_function].include?(type)

      p_count = Integer(param_count) rescue -1

      if source_file then
        file_name = File.join @file_dir, source_file

        if File.exist? file_name then
          file_content = File.read file_name
        else
          @options.warn "unknown source #{source_file} for #{meth_name} in #{@file_name}"
        end
      else
        file_content = @content
      end

      body = find_body class_name, function, meth_obj, file_content

      if body and meth_obj.document_self then
        meth_obj.params = if p_count < -1 then # -2 is Array
                            '(*args)'
                          elsif p_count == -1 then # argc, argv
                            rb_scan_args body
                          else
                            "(#{(1..p_count).map { |i| "p#{i}" }.join ', '})"
                          end


        meth_obj.record_location @top_level

        if meth_obj.section_title
          class_obj.temporary_section = class_obj.add_section(meth_obj.section_title)
        end
        class_obj.add_method meth_obj

        @stats.add_method meth_obj
        meth_obj.visibility = :private if 'private_method' == type
      end
    end
  end

  ##
  # Registers a singleton class +sclass_var+ as a singleton of +class_var+

  def handle_singleton sclass_var, class_var
    class_name = @known_classes[class_var]

    @known_classes[sclass_var]     = class_name
    @singleton_classes[sclass_var] = class_name
  end

  ##
  # Normalizes tabs in +body+

  def handle_tab_width(body)
    if /\t/ =~ body
      tab_width = @options.tab_width
      body.split(/\n/).map do |line|
        1 while line.gsub!(/\t+/) do
          ' ' * (tab_width * $&.length - $`.length % tab_width)
        end && $~
        line
      end.join "\n"
    else
      body
    end
  end

  ##
  # Loads the variable map with the given +name+ from the RDoc::Store, if
  # present.

  def load_variable_map map_name
    return {} unless files = @store.cache[map_name]
    return {} unless name_map = files[@file_name]

    class_map = {}

    name_map.each do |variable, name|
      next unless mod = @store.find_class_or_module(name)

      class_map[variable] = if map_name == :c_class_variables then
                              mod
                            else
                              name
                            end
      @known_classes[variable] = name
    end

    class_map
  end

  ##
  # Look for directives in a normal comment block:
  #
  #   /*
  #    * :title: My Awesome Project
  #    */
  #
  # This method modifies the +comment+

  def look_for_directives_in context, comment
    @preprocess.handle comment, context do |directive, param|
      case directive
      when 'main' then
        @options.main_page = param
        ''
      when 'title' then
        @options.default_title = param if @options.respond_to? :default_title=
        ''
      end
    end

    comment
  end

  ##
  # Extracts parameters from the +method_body+ and returns a method
  # parameter string.  Follows 1.9.3dev's scan-arg-spec, see README.EXT

  def rb_scan_args method_body
    method_body =~ /rb_scan_args\((.*?)\)/m
    return '(*args)' unless $1

    $1.split(/,/)[2] =~ /"(.*?)"/ # format argument
    format = $1.split(//)

    lead = opt = trail = 0

    if format.first =~ /\d/ then
      lead = $&.to_i
      format.shift
      if format.first =~ /\d/ then
        opt = $&.to_i
        format.shift
        if format.first =~ /\d/ then
          trail = $&.to_i
          format.shift
          block_arg = true
        end
      end
    end

    if format.first == '*' and not block_arg then
      var = true
      format.shift
      if format.first =~ /\d/ then
        trail = $&.to_i
        format.shift
      end
    end

    if format.first == ':' then
      hash = true
      format.shift
    end

    if format.first == '&' then
      block = true
      format.shift
    end

    # if the format string is not empty there's a bug in the C code, ignore it

    args = []
    position = 1

    (1...(position + lead)).each do |index|
      args << "p#{index}"
    end

    position += lead

    (position...(position + opt)).each do |index|
      args << "p#{index} = v#{index}"
    end

    position += opt

    if var then
      args << '*args'
      position += 1
    end

    (position...(position + trail)).each do |index|
      args << "p#{index}"
    end

    position += trail

    if hash then
      args << "p#{position} = {}"
    end

    args << '&block' if block

    "(#{args.join ', '})"
  end

  ##
  # Removes lines that are commented out that might otherwise get picked up
  # when scanning for classes and methods

  def remove_commented_out_lines
    @content = @content.gsub(%r%//.*rb_define_%, '//')
  end

  ##
  # Extracts the classes, modules, methods, attributes, constants and aliases
  # from a C file and returns an RDoc::TopLevel for this file

  def scan
    remove_commented_out_lines

    do_classes_and_modules
    do_missing

    do_constants
    do_methods
    do_includes
    do_aliases
    do_attrs

    @store.add_c_variables self

    @top_level
  end

  def new_comment text = nil, location = nil, language = nil
    RDoc::Comment.new(text, location, language).tap do |comment|
      comment.format = @markup
    end
  end
end
PK}$[�7��33.gems/gems/rdoc-6.4.1.1/lib/rdoc/parser/text.rbnu�[���# frozen_string_literal: true
##
# Indicates this parser is text and doesn't contain code constructs.
#
# Include this module in a RDoc::Parser subclass to make it show up as a file,
# not as part of a class or module.
#--
# This is not named File to avoid overriding ::File

module RDoc::Parser::Text
end

PK}$[/��>�>:gems/gems/rdoc-6.4.1.1/lib/rdoc/parser/ripper_state_lex.rbnu�[���# frozen_string_literal: true
require 'ripper'

class RDoc::Parser::RipperStateLex
  # TODO: Remove this constants after Ruby 2.4 EOL
  RIPPER_HAS_LEX_STATE = Ripper::Filter.method_defined?(:state)

  Token = Struct.new(:line_no, :char_no, :kind, :text, :state)

  EXPR_NONE = 0
  EXPR_BEG = 1
  EXPR_END = 2
  EXPR_ENDARG = 4
  EXPR_ENDFN = 8
  EXPR_ARG = 16
  EXPR_CMDARG = 32
  EXPR_MID = 64
  EXPR_FNAME = 128
  EXPR_DOT = 256
  EXPR_CLASS = 512
  EXPR_LABEL = 1024
  EXPR_LABELED = 2048
  EXPR_FITEM = 4096
  EXPR_VALUE = EXPR_BEG
  EXPR_BEG_ANY  =  (EXPR_BEG | EXPR_MID | EXPR_CLASS)
  EXPR_ARG_ANY  =  (EXPR_ARG | EXPR_CMDARG)
  EXPR_END_ANY  =  (EXPR_END | EXPR_ENDARG | EXPR_ENDFN)

  class InnerStateLex < Ripper::Filter
    attr_accessor :lex_state

    def initialize(code)
      @lex_state = EXPR_BEG
      @in_fname = false
      @continue = false
      reset
      super(code)
    end

    def reset
      @command_start = false
      @cmd_state = @command_start
    end

    def on_nl(tok, data)
      case @lex_state
      when EXPR_FNAME, EXPR_DOT
        @continue = true
      else
        @continue = false
        @lex_state = EXPR_BEG unless (EXPR_LABEL & @lex_state) != 0
      end
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_ignored_nl(tok, data)
      case @lex_state
      when EXPR_FNAME, EXPR_DOT
        @continue = true
      else
        @continue = false
        @lex_state = EXPR_BEG unless (EXPR_LABEL & @lex_state) != 0
      end
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_op(tok, data)
      case tok
      when '&', '|', '!', '!=', '!~'
        case @lex_state
        when EXPR_FNAME, EXPR_DOT
          @lex_state = EXPR_ARG
        else
          @lex_state = EXPR_BEG
        end
      when '<<'
        # TODO next token?
        case @lex_state
        when EXPR_FNAME, EXPR_DOT
          @lex_state = EXPR_ARG
        else
          @lex_state = EXPR_BEG
        end
      when '?'
        @lex_state = EXPR_BEG
      when '&&', '||', '+=', '-=', '*=', '**=',
           '&=', '|=', '^=', '<<=', '>>=', '||=', '&&='
        @lex_state = EXPR_BEG
      when '::'
        case @lex_state
        when EXPR_ARG, EXPR_CMDARG
          @lex_state = EXPR_DOT
        when EXPR_FNAME, EXPR_DOT
          @lex_state = EXPR_ARG
        else
          @lex_state = EXPR_BEG
        end
      else
        case @lex_state
        when EXPR_FNAME, EXPR_DOT
          @lex_state = EXPR_ARG
        else
          @lex_state = EXPR_BEG
        end
      end
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_kw(tok, data)
      case tok
      when 'class'
        @lex_state = EXPR_CLASS
        @in_fname = true
      when 'def'
        @lex_state = EXPR_FNAME
        @continue = true
        @in_fname = true
      when 'if', 'unless', 'while', 'until'
        if ((EXPR_MID | EXPR_END | EXPR_ENDARG | EXPR_ENDFN | EXPR_ARG | EXPR_CMDARG) & @lex_state) != 0 # postfix if
          @lex_state = EXPR_BEG | EXPR_LABEL
        else
          @lex_state = EXPR_BEG
        end
      when 'begin', 'case', 'when'
        @lex_state = EXPR_BEG
      when 'return', 'break'
        @lex_state = EXPR_MID
      else
        if @lex_state == EXPR_FNAME
          @lex_state = EXPR_END
        else
          @lex_state = EXPR_END
        end
      end
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_tstring_beg(tok, data)
      @lex_state = EXPR_BEG
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_tstring_end(tok, data)
      @lex_state = EXPR_END | EXPR_ENDARG
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_CHAR(tok, data)
      @lex_state = EXPR_END
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_period(tok, data)
      @lex_state = EXPR_DOT
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_int(tok, data)
      @lex_state = EXPR_END | EXPR_ENDARG
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_float(tok, data)
      @lex_state = EXPR_END | EXPR_ENDARG
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_rational(tok, data)
      @lex_state = EXPR_END | EXPR_ENDARG
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_imaginary(tok, data)
      @lex_state = EXPR_END | EXPR_ENDARG
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_symbeg(tok, data)
      @lex_state = EXPR_FNAME
      @continue = true
      @in_fname = true
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    private def on_variables(event, tok, data)
      if @in_fname
        @lex_state = EXPR_ENDFN
        @in_fname = false
        @continue = false
      elsif @continue
        case @lex_state
        when EXPR_DOT
          @lex_state = EXPR_ARG
        else
          @lex_state = EXPR_ENDFN
          @continue = false
        end
      else
        @lex_state = EXPR_CMDARG
      end
      data << Token.new(lineno, column, event, tok, @lex_state)
    end

    def on_ident(tok, data)
      on_variables(__method__, tok, data)
    end

    def on_ivar(tok, data)
      @lex_state = EXPR_END
      on_variables(__method__, tok, data)
    end

    def on_cvar(tok, data)
      @lex_state = EXPR_END
      on_variables(__method__, tok, data)
    end

    def on_gvar(tok, data)
      @lex_state = EXPR_END
      on_variables(__method__, tok, data)
    end

    def on_backref(tok, data)
      @lex_state = EXPR_END
      on_variables(__method__, tok, data)
    end

    def on_lparen(tok, data)
      @lex_state = EXPR_LABEL | EXPR_BEG
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_rparen(tok, data)
      @lex_state = EXPR_ENDFN
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_lbrace(tok, data)
      @lex_state = EXPR_LABEL | EXPR_BEG
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_rbrace(tok, data)
      @lex_state = EXPR_ENDARG
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_lbracket(tok, data)
      @lex_state = EXPR_LABEL | EXPR_BEG
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_rbracket(tok, data)
      @lex_state = EXPR_ENDARG
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_const(tok, data)
      case @lex_state
      when EXPR_FNAME
        @lex_state = EXPR_ENDFN
      when EXPR_CLASS, EXPR_CMDARG, EXPR_MID
        @lex_state = EXPR_ARG
      else
        @lex_state = EXPR_CMDARG
      end
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_sp(tok, data)
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_comma(tok, data)
      @lex_state = EXPR_BEG | EXPR_LABEL if (EXPR_ARG_ANY & @lex_state) != 0
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_comment(tok, data)
      @lex_state = EXPR_BEG unless (EXPR_LABEL & @lex_state) != 0
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_ignored_sp(tok, data)
      @lex_state = EXPR_BEG unless (EXPR_LABEL & @lex_state) != 0
      data << Token.new(lineno, column, __method__, tok, @lex_state)
    end

    def on_heredoc_beg(tok, data)
      data << Token.new(lineno, column, __method__, tok, @lex_state)
      @lex_state = EXPR_END
      data
    end

    def on_heredoc_end(tok, data)
      data << Token.new(lineno, column, __method__, tok, @lex_state)
      @lex_state = EXPR_BEG
      data
    end

    def on_default(event, tok, data)
      reset
      data << Token.new(lineno, column, event, tok, @lex_state)
    end
  end unless RIPPER_HAS_LEX_STATE

  class InnerStateLex < Ripper::Filter
    def initialize(code)
      super(code)
    end

    def on_default(event, tok, data)
      data << Token.new(lineno, column, event, tok, state)
    end
  end if RIPPER_HAS_LEX_STATE

  def get_squashed_tk
    if @buf.empty?
      tk = @tokens.shift
    else
      tk = @buf.shift
    end
    return nil if tk.nil?
    case tk[:kind]
    when :on_symbeg then
      tk = get_symbol_tk(tk)
    when :on_tstring_beg then
      tk = get_string_tk(tk)
    when :on_backtick then
      if (tk[:state] & (EXPR_FNAME | EXPR_ENDFN)) != 0
        @inner_lex.lex_state = EXPR_ARG unless RIPPER_HAS_LEX_STATE
        tk[:kind] = :on_ident
        tk[:state] = Ripper::Lexer.const_defined?(:State) ? Ripper::Lexer::State.new(EXPR_ARG) : EXPR_ARG
      else
        tk = get_string_tk(tk)
      end
    when :on_regexp_beg then
      tk = get_regexp_tk(tk)
    when :on_embdoc_beg then
      tk = get_embdoc_tk(tk)
    when :on_heredoc_beg then
      @heredoc_queue << retrieve_heredoc_info(tk)
      @inner_lex.lex_state = EXPR_END unless RIPPER_HAS_LEX_STATE
    when :on_nl, :on_ignored_nl, :on_comment, :on_heredoc_end then
      if !@heredoc_queue.empty?
        get_heredoc_tk(*@heredoc_queue.shift)
      elsif tk[:text].nil? # :on_ignored_nl sometimes gives nil
        tk[:text] = ''
      end
    when :on_words_beg then
      tk = get_words_tk(tk)
    when :on_qwords_beg then
      tk = get_words_tk(tk)
    when :on_symbols_beg then
      tk = get_words_tk(tk)
    when :on_qsymbols_beg then
      tk = get_words_tk(tk)
    when :on_op then
      if '&.' == tk[:text]
        tk[:kind] = :on_period
      else
        tk = get_op_tk(tk)
      end
    end
    tk
  end

  private def get_symbol_tk(tk)
    is_symbol = true
    symbol_tk = Token.new(tk.line_no, tk.char_no, :on_symbol)
    if ":'" == tk[:text] or ':"' == tk[:text]
      tk1 = get_string_tk(tk)
      symbol_tk[:text] = tk1[:text]
      symbol_tk[:state] = tk1[:state]
    else
      case (tk1 = get_squashed_tk)[:kind]
      when :on_ident
        symbol_tk[:text] = ":#{tk1[:text]}"
        symbol_tk[:state] = tk1[:state]
      when :on_tstring_content
        symbol_tk[:text] = ":#{tk1[:text]}"
        symbol_tk[:state] = get_squashed_tk[:state] # skip :on_tstring_end
      when :on_tstring_end
        symbol_tk[:text] = ":#{tk1[:text]}"
        symbol_tk[:state] = tk1[:state]
      when :on_op
        symbol_tk[:text] = ":#{tk1[:text]}"
        symbol_tk[:state] = tk1[:state]
      when :on_ivar
        symbol_tk[:text] = ":#{tk1[:text]}"
        symbol_tk[:state] = tk1[:state]
      when :on_cvar
        symbol_tk[:text] = ":#{tk1[:text]}"
        symbol_tk[:state] = tk1[:state]
      when :on_gvar
        symbol_tk[:text] = ":#{tk1[:text]}"
        symbol_tk[:state] = tk1[:state]
      when :on_const
        symbol_tk[:text] = ":#{tk1[:text]}"
        symbol_tk[:state] = tk1[:state]
      when :on_kw
        symbol_tk[:text] = ":#{tk1[:text]}"
        symbol_tk[:state] = tk1[:state]
      else
        is_symbol = false
        tk = tk1
      end
    end
    if is_symbol
      tk = symbol_tk
    end
    tk
  end

  private def get_string_tk(tk)
    string = tk[:text]
    state = nil
    kind = :on_tstring
    loop do
      inner_str_tk = get_squashed_tk
      if inner_str_tk.nil?
        break
      elsif :on_tstring_end == inner_str_tk[:kind]
        string = string + inner_str_tk[:text]
        state = inner_str_tk[:state]
        break
      elsif :on_label_end == inner_str_tk[:kind]
        string = string + inner_str_tk[:text]
        state = inner_str_tk[:state]
        kind = :on_symbol
        break
      else
        string = string + inner_str_tk[:text]
        if :on_embexpr_beg == inner_str_tk[:kind] then
          kind = :on_dstring if :on_tstring == kind
        end
      end
    end
    Token.new(tk.line_no, tk.char_no, kind, string, state)
  end

  private def get_regexp_tk(tk)
    string = tk[:text]
    state = nil
    loop do
      inner_str_tk = get_squashed_tk
      if inner_str_tk.nil?
        break
      elsif :on_regexp_end == inner_str_tk[:kind]
        string = string + inner_str_tk[:text]
        state = inner_str_tk[:state]
        break
      else
        string = string + inner_str_tk[:text]
      end
    end
    Token.new(tk.line_no, tk.char_no, :on_regexp, string, state)
  end

  private def get_embdoc_tk(tk)
    string = tk[:text]
    until :on_embdoc_end == (embdoc_tk = get_squashed_tk)[:kind] do
      string = string + embdoc_tk[:text]
    end
    string = string + embdoc_tk[:text]
    Token.new(tk.line_no, tk.char_no, :on_embdoc, string, embdoc_tk.state)
  end

  private def get_heredoc_tk(heredoc_name, indent)
    string = ''
    start_tk = nil
    prev_tk = nil
    until heredoc_end?(heredoc_name, indent, tk = @tokens.shift) do
      start_tk = tk unless start_tk
      if (prev_tk.nil? or "\n" == prev_tk[:text][-1]) and 0 != tk[:char_no]
        string = string + (' ' * tk[:char_no])
      end
      string = string + tk[:text]
      prev_tk = tk
    end
    start_tk = tk unless start_tk
    prev_tk = tk unless prev_tk
    @buf.unshift tk # closing heredoc
    heredoc_tk = Token.new(start_tk.line_no, start_tk.char_no, :on_heredoc, string, prev_tk.state)
    @buf.unshift heredoc_tk
  end

  private def retrieve_heredoc_info(tk)
    name = tk[:text].gsub(/\A<<[-~]?(['"`]?)(.+)\1\z/, '\2')
    indent = tk[:text] =~ /\A<<[-~]/
    [name, indent]
  end

  private def heredoc_end?(name, indent, tk)
    result = false
    if :on_heredoc_end == tk[:kind] then
      tk_name = tk[:text].chomp
      tk_name.lstrip! if indent
      if name == tk_name
        result = true
      end
    end
    result
  end

  private def get_words_tk(tk)
    string = ''
    start_token = tk[:text]
    start_quote = tk[:text].rstrip[-1]
    line_no = tk[:line_no]
    char_no = tk[:char_no]
    state = tk[:state]
    end_quote =
      case start_quote
      when ?( then ?)
      when ?[ then ?]
      when ?{ then ?}
      when ?< then ?>
      else start_quote
      end
    end_token = nil
    loop do
      tk = get_squashed_tk
      if tk.nil?
        end_token = end_quote
        break
      elsif :on_tstring_content == tk[:kind] then
        string += tk[:text]
      elsif :on_words_sep == tk[:kind] or :on_tstring_end == tk[:kind] then
        if end_quote == tk[:text].strip then
          end_token = tk[:text]
          break
        else
          string += tk[:text]
        end
      else
        string += tk[:text]
      end
    end
    text = "#{start_token}#{string}#{end_token}"
    Token.new(line_no, char_no, :on_dstring, text, state)
  end

  private def get_op_tk(tk)
    redefinable_operators = %w[! != !~ % & * ** + +@ - -@ / < << <= <=> == === =~ > >= >> [] []= ^ ` | ~]
    if redefinable_operators.include?(tk[:text]) and tk[:state] == EXPR_ARG then
      @inner_lex.lex_state = EXPR_ARG unless RIPPER_HAS_LEX_STATE
      tk[:state] = Ripper::Lexer.const_defined?(:State) ? Ripper::Lexer::State.new(EXPR_ARG) : EXPR_ARG
      tk[:kind] = :on_ident
    elsif tk[:text] =~ /^[-+]$/ then
      tk_ahead = get_squashed_tk
      case tk_ahead[:kind]
      when :on_int, :on_float, :on_rational, :on_imaginary then
        tk[:text] += tk_ahead[:text]
        tk[:kind] = tk_ahead[:kind]
        tk[:state] = tk_ahead[:state]
      when :on_heredoc_beg, :on_tstring, :on_dstring # frozen/non-frozen string literal
        tk[:text] += tk_ahead[:text]
        tk[:kind] = tk_ahead[:kind]
        tk[:state] = tk_ahead[:state]
      else
        @buf.unshift tk_ahead
      end
    end
    tk
  end

  def initialize(code)
    @buf = []
    @heredoc_queue = []
    @inner_lex = InnerStateLex.new(code)
    @tokens = @inner_lex.parse([])
  end

  def self.parse(code)
    lex = self.new(code)
    tokens = []
    begin
      while tk = lex.get_squashed_tk
        tokens.push tk
      end
    rescue StopIteration
    end
    tokens
  end

  def self.end?(token)
    (token[:state] & EXPR_END)
  end
end
PK}$[���U��0gems/gems/rdoc-6.4.1.1/lib/rdoc/parser/simple.rbnu�[���# frozen_string_literal: true
##
# Parse a non-source file. We basically take the whole thing as one big
# comment.

class RDoc::Parser::Simple < RDoc::Parser

  include RDoc::Parser::Text

  parse_files_matching(//)

  attr_reader :content # :nodoc:

  ##
  # Prepare to parse a plain file

  def initialize(top_level, file_name, content, options, stats)
    super

    preprocess = RDoc::Markup::PreProcess.new @file_name, @options.rdoc_include

    @content = preprocess.handle @content, @top_level
  end

  ##
  # Extract the file contents and attach them to the TopLevel as a comment

  def scan
    comment = remove_coding_comment @content
    comment = remove_private_comment comment

    comment = RDoc::Comment.new comment, @top_level

    @top_level.comment = comment
    @top_level
  end

  ##
  # Removes the encoding magic comment from +text+

  def remove_coding_comment text
    text.sub(/\A# .*coding[=:].*$/, '')
  end

  ##
  # Removes private comments.
  #
  # Unlike RDoc::Comment#remove_private this implementation only looks for two
  # dashes at the beginning of the line.  Three or more dashes are considered
  # to be a rule and ignored.

  def remove_private_comment comment
    # Workaround for gsub encoding for Ruby 1.9.2 and earlier
    empty = ''
    empty = RDoc::Encoding.change_encoding empty, comment.encoding

    comment = comment.gsub(%r%^--\n.*?^\+\+\n?%m, empty)
    comment.sub(%r%^--\n.*%m, empty)
  end

end
PK}$[�4QՆ
�
4gems/gems/rdoc-6.4.1.1/lib/rdoc/parser/ruby_tools.rbnu�[���# frozen_string_literal: true
##
# Collection of methods for writing parsers

module RDoc::Parser::RubyTools

  ##
  # Adds a token listener +obj+, but you should probably use token_listener

  def add_token_listener(obj)
    @token_listeners ||= []
    @token_listeners << obj
  end

  ##
  # Fetches the next token from the scanner

  def get_tk
    tk = nil

    if @tokens.empty? then
      if @scanner_point >= @scanner.size
        return nil
      else
        tk = @scanner[@scanner_point]
        @scanner_point += 1
        @read.push tk[:text]
      end
    else
      @read.push @unget_read.shift
      tk = @tokens.shift
    end

    if tk == nil || :on___end__ == tk[:kind]
      tk = nil
    end

    return nil unless tk

    # inform any listeners of our shiny new token
    @token_listeners.each do |obj|
      obj.add_token(tk)
    end if @token_listeners

    tk
  end

  ##
  # Reads and returns all tokens up to one of +tokens+.  Leaves the matched
  # token in the token list.

  def get_tk_until(*tokens)
    read = []

    loop do
      tk = get_tk

      case tk
      when *tokens then
        unget_tk tk
        break
      end

      read << tk
    end

    read
  end

  ##
  # Retrieves a String representation of the read tokens

  def get_tkread
    read = @read.join("")
    @read = []
    read
  end

  ##
  # Peek equivalent for get_tkread

  def peek_read
    @read.join('')
  end

  ##
  # Peek at the next token, but don't remove it from the stream

  def peek_tk
    unget_tk(tk = get_tk)
    tk
  end

  ##
  # Removes the token listener +obj+

  def remove_token_listener(obj)
    @token_listeners.delete(obj)
  end

  ##
  # Resets the tools

  def reset
    @read       = []
    @tokens     = []
    @unget_read = []
    @nest = 0
    @scanner_point = 0
  end

  ##
  # Skips whitespace tokens including newlines

  def skip_tkspace
    tokens = []

    while (tk = get_tk) and (:on_sp == tk[:kind] or :on_nl == tk[:kind] or :on_ignored_nl == tk[:kind]) do
      tokens.push(tk)
    end

    unget_tk(tk)
    tokens
  end

  ##
  # Skips whitespace tokens excluding newlines

  def skip_tkspace_without_nl
    tokens = []

    while (tk = get_tk) and :on_sp == tk[:kind] do
      tokens.push(tk)
    end

    unget_tk(tk)
    tokens
  end

  ##
  # Has +obj+ listen to tokens

  def token_listener(obj)
    add_token_listener obj
    yield
  ensure
    remove_token_listener obj
  end

  ##
  # Returns +tk+ to the scanner

  def unget_tk(tk)
    @tokens.unshift tk
    @unget_read.unshift @read.pop

    # Remove this token from any listeners
    @token_listeners.each do |obj|
      obj.pop_token
    end if @token_listeners

    nil
  end

end


PK}$[�_A��2gems/gems/rdoc-6.4.1.1/lib/rdoc/parser/markdown.rbnu�[���# frozen_string_literal: true
##
# Parse a Markdown format file.  The parsed RDoc::Markup::Document is attached
# as a file comment.

class RDoc::Parser::Markdown < RDoc::Parser

  include RDoc::Parser::Text

  parse_files_matching(/\.(md|markdown)(?:\.[^.]+)?$/)

  ##
  # Creates an Markdown-format TopLevel for the given file.

  def scan
    comment = RDoc::Comment.new @content, @top_level
    comment.format = 'markdown'

    @top_level.comment = comment
  end

end


PK}$[��X�����.gems/gems/rdoc-6.4.1.1/lib/rdoc/parser/ruby.rbnu�[���# frozen_string_literal: true
##
# This file contains stuff stolen outright from:
#
#   rtags.rb -
#   ruby-lex.rb - ruby lexcal analyzer
#   ruby-token.rb - ruby tokens
#       by Keiju ISHITSUKA (Nippon Rational Inc.)
#

##
# Extracts code elements from a source file returning a TopLevel object
# containing the constituent file elements.
#
# This file is based on rtags
#
# RubyParser understands how to document:
# * classes
# * modules
# * methods
# * constants
# * aliases
# * private, public, protected
# * private_class_function, public_class_function
# * private_constant, public_constant
# * module_function
# * attr, attr_reader, attr_writer, attr_accessor
# * extra accessors given on the command line
# * metaprogrammed methods
# * require
# * include
#
# == Method Arguments
#
#--
# NOTE: I don't think this works, needs tests, remove the paragraph following
# this block when known to work
#
# The parser extracts the arguments from the method definition.  You can
# override this with a custom argument definition using the :args: directive:
#
#   ##
#   # This method tries over and over until it is tired
#
#   def go_go_go(thing_to_try, tries = 10) # :args: thing_to_try
#     puts thing_to_try
#     go_go_go thing_to_try, tries - 1
#   end
#
# If you have a more-complex set of overrides you can use the :call-seq:
# directive:
#++
#
# The parser extracts the arguments from the method definition.  You can
# override this with a custom argument definition using the :call-seq:
# directive:
#
#   ##
#   # This method can be called with a range or an offset and length
#   #
#   # :call-seq:
#   #   my_method(Range)
#   #   my_method(offset, length)
#
#   def my_method(*args)
#   end
#
# The parser extracts +yield+ expressions from method bodies to gather the
# yielded argument names.  If your method manually calls a block instead of
# yielding or you want to override the discovered argument names use
# the :yields: directive:
#
#   ##
#   # My method is awesome
#
#   def my_method(&block) # :yields: happy, times
#     block.call 1, 2
#   end
#
# == Metaprogrammed Methods
#
# To pick up a metaprogrammed method, the parser looks for a comment starting
# with '##' before an identifier:
#
#   ##
#   # This is a meta-programmed method!
#
#   add_my_method :meta_method, :arg1, :arg2
#
# The parser looks at the token after the identifier to determine the name, in
# this example, :meta_method.  If a name cannot be found, a warning is printed
# and 'unknown is used.
#
# You can force the name of a method using the :method: directive:
#
#   ##
#   # :method: some_method!
#
# By default, meta-methods are instance methods.  To indicate that a method is
# a singleton method instead use the :singleton-method: directive:
#
#   ##
#   # :singleton-method:
#
# You can also use the :singleton-method: directive with a name:
#
#   ##
#   # :singleton-method: some_method!
#
# You can define arguments for metaprogrammed methods via either the
# :call-seq:, :arg: or :args: directives.
#
# Additionally you can mark a method as an attribute by
# using :attr:, :attr_reader:, :attr_writer: or :attr_accessor:.  Just like
# for :method:, the name is optional.
#
#   ##
#   # :attr_reader: my_attr_name
#
# == Hidden methods and attributes
#
# You can provide documentation for methods that don't appear using
# the :method:, :singleton-method: and :attr: directives:
#
#   ##
#   # :attr_writer: ghost_writer
#   # There is an attribute here, but you can't see it!
#
#   ##
#   # :method: ghost_method
#   # There is a method here, but you can't see it!
#
#   ##
#   # this is a comment for a regular method
#
#   def regular_method() end
#
# Note that by default, the :method: directive will be ignored if there is a
# standard rdocable item following it.

require 'ripper'
require_relative 'ripper_state_lex'

class RDoc::Parser::Ruby < RDoc::Parser

  parse_files_matching(/\.rbw?$/)

  include RDoc::TokenStream
  include RDoc::Parser::RubyTools

  ##
  # RDoc::NormalClass type

  NORMAL = "::"

  ##
  # RDoc::SingleClass type

  SINGLE = "<<"

  ##
  # Creates a new Ruby parser.

  def initialize(top_level, file_name, content, options, stats)
    super

    if /\t/ =~ content then
      tab_width = @options.tab_width
      content = content.split(/\n/).map do |line|
        1 while line.gsub!(/\t+/) {
          ' ' * (tab_width*$&.length - $`.length % tab_width)
        }  && $~
        line
      end.join("\n")
    end

    @size = 0
    @token_listeners = nil
    content = RDoc::Encoding.remove_magic_comment content
    @scanner = RDoc::Parser::RipperStateLex.parse(content)
    @content = content
    @scanner_point = 0
    @prev_seek = nil
    @markup = @options.markup
    @track_visibility = :nodoc != @options.visibility
    @encoding = @options.encoding

    reset
  end

  def tk_nl?(tk)
    :on_nl == tk[:kind] or :on_ignored_nl == tk[:kind]
  end

  ##
  # Retrieves the read token stream and replaces +pattern+ with +replacement+
  # using gsub.  If the result is only a ";" returns an empty string.

  def get_tkread_clean pattern, replacement # :nodoc:
    read = get_tkread.gsub(pattern, replacement).strip
    return '' if read == ';'
    read
  end

  ##
  # Extracts the visibility information for the visibility token +tk+
  # and +single+ class type identifier.
  #
  # Returns the visibility type (a string), the visibility (a symbol) and
  # +singleton+ if the methods following should be converted to singleton
  # methods.

  def get_visibility_information tk, single # :nodoc:
    vis_type  = tk[:text]
    singleton = single == SINGLE

    vis =
      case vis_type
      when 'private'   then :private
      when 'protected' then :protected
      when 'public'    then :public
      when 'private_class_method' then
        singleton = true
        :private
      when 'public_class_method' then
        singleton = true
        :public
      when 'module_function' then
        singleton = true
        :public
      else
        raise RDoc::Error, "Invalid visibility: #{tk.name}"
      end

    return vis_type, vis, singleton
  end

  ##
  # Look for the first comment in a file that isn't a shebang line.

  def collect_first_comment
    skip_tkspace
    comment = ''.dup
    comment = RDoc::Encoding.change_encoding comment, @encoding if @encoding
    first_line = true
    first_comment_tk_kind = nil
    line_no = nil

    tk = get_tk

    while tk && (:on_comment == tk[:kind] or :on_embdoc == tk[:kind])
      comment_body = retrieve_comment_body(tk)
      if first_line and comment_body =~ /\A#!/ then
        skip_tkspace
        tk = get_tk
      elsif first_line and comment_body =~ /\A#\s*-\*-/ then
        first_line = false
        skip_tkspace
        tk = get_tk
      else
        break if first_comment_tk_kind and not first_comment_tk_kind === tk[:kind]
        first_comment_tk_kind = tk[:kind]

        line_no = tk[:line_no] if first_line
        first_line = false
        comment << comment_body
        tk = get_tk

        if :on_nl === tk then
          skip_tkspace_without_nl
          tk = get_tk
        end
      end
    end

    unget_tk tk

    new_comment comment, line_no
  end

  ##
  # Consumes trailing whitespace from the token stream

  def consume_trailing_spaces # :nodoc:
    skip_tkspace_without_nl
  end

  ##
  # Creates a new attribute in +container+ with +name+.

  def create_attr container, single, name, rw, comment # :nodoc:
    att = RDoc::Attr.new get_tkread, name, rw, comment, single == SINGLE
    record_location att

    container.add_attribute att
    @stats.add_attribute att

    att
  end

  ##
  # Creates a module alias in +container+ at +rhs_name+ (or at the top-level
  # for "::") with the name from +constant+.

  def create_module_alias container, constant, rhs_name # :nodoc:
    mod = if rhs_name =~ /^::/ then
            @store.find_class_or_module rhs_name
          else
            container.find_module_named rhs_name
          end

    container.add_module_alias mod, rhs_name, constant, @top_level
  end

  ##
  # Aborts with +msg+

  def error(msg)
    msg = make_message msg

    abort msg
  end

  ##
  # Looks for a true or false token.

  def get_bool
    skip_tkspace
    tk = get_tk
    if :on_kw == tk[:kind] && 'true' == tk[:text]
      true
    elsif :on_kw == tk[:kind] && ('false' == tk[:text] || 'nil' == tk[:text])
      false
    else
      unget_tk tk
      true
    end
  end

  ##
  # Look for the name of a class of module (optionally with a leading :: or
  # with :: separated named) and return the ultimate name, the associated
  # container, and the given name (with the ::).

  def get_class_or_module container, ignore_constants = false
    skip_tkspace
    name_t = get_tk
    given_name = ''.dup

    # class ::A -> A is in the top level
    if :on_op == name_t[:kind] and '::' == name_t[:text] then # bug
      name_t = get_tk
      container = @top_level
      given_name << '::'
    end

    skip_tkspace_without_nl
    given_name << name_t[:text]

    is_self = name_t[:kind] == :on_op && name_t[:text] == '<<'
    new_modules = []
    while !is_self && (tk = peek_tk) and :on_op == tk[:kind] and '::' == tk[:text] do
      prev_container = container
      container = container.find_module_named name_t[:text]
      container ||=
        if ignore_constants then
          c = RDoc::NormalModule.new name_t[:text]
          c.store = @store
          new_modules << [prev_container, c]
          c
        else
          c = prev_container.add_module RDoc::NormalModule, name_t[:text]
          c.ignore unless prev_container.document_children
          @top_level.add_to_classes_or_modules c
          c
        end

      record_location container

      get_tk
      skip_tkspace
      if :on_lparen == peek_tk[:kind] # ProcObjectInConstant::()
        parse_method_or_yield_parameters
        break
      end
      name_t = get_tk
      unless :on_const == name_t[:kind] || :on_ident == name_t[:kind]
        raise RDoc::Error, "Invalid class or module definition: #{given_name}"
      end
      if prev_container == container and !ignore_constants
        given_name = name_t[:text]
      else
        given_name << '::' + name_t[:text]
      end
    end

    skip_tkspace_without_nl

    return [container, name_t, given_name, new_modules]
  end

  ##
  # Return a superclass, which can be either a constant of an expression

  def get_class_specification
    tk = peek_tk
    if tk.nil?
      return ''
    elsif :on_kw == tk[:kind] && 'self' == tk[:text]
      return 'self'
    elsif :on_gvar == tk[:kind]
      return ''
    end

    res = get_constant

    skip_tkspace_without_nl

    get_tkread # empty out read buffer

    tk = get_tk
    return res unless tk

    case tk[:kind]
    when :on_nl, :on_comment, :on_embdoc, :on_semicolon then
      unget_tk(tk)
      return res
    end

    res += parse_call_parameters(tk)
    res
  end

  ##
  # Parse a constant, which might be qualified by one or more class or module
  # names

  def get_constant
    res = ""
    skip_tkspace_without_nl
    tk = get_tk

    while tk && ((:on_op == tk[:kind] && '::' == tk[:text]) || :on_const == tk[:kind]) do
      res += tk[:text]
      tk = get_tk
    end

    unget_tk(tk)
    res
  end

  ##
  # Get an included module that may be surrounded by parens

  def get_included_module_with_optional_parens
    skip_tkspace_without_nl
    get_tkread
    tk = get_tk
    end_token = get_end_token tk
    return '' unless end_token

    nest = 0
    continue = false
    only_constant = true

    while tk != nil do
      is_element_of_constant = false
      case tk[:kind]
      when :on_semicolon then
        break if nest == 0
      when :on_lbracket then
        nest += 1
      when :on_rbracket then
        nest -= 1
      when :on_lbrace then
        nest += 1
      when :on_rbrace then
        nest -= 1
        if nest <= 0
          # we might have a.each { |i| yield i }
          unget_tk(tk) if nest < 0
          break
        end
      when :on_lparen then
        nest += 1
      when end_token[:kind] then
        if end_token[:kind] == :on_rparen
          nest -= 1
          break if nest <= 0
        else
          break if nest <= 0
        end
      when :on_rparen then
        nest -= 1
      when :on_comment, :on_embdoc then
        @read.pop
        if :on_nl == end_token[:kind] and "\n" == tk[:text][-1] and
          (!continue or (tk[:state] & RDoc::Parser::RipperStateLex::EXPR_LABEL) != 0) then
          break if !continue and nest <= 0
        end
      when :on_comma then
        continue = true
      when :on_ident then
        continue = false if continue
      when :on_kw then
        case tk[:text]
        when 'def', 'do', 'case', 'for', 'begin', 'class', 'module'
          nest += 1
        when 'if', 'unless', 'while', 'until', 'rescue'
          # postfix if/unless/while/until/rescue must be EXPR_LABEL
          nest += 1 unless (tk[:state] & RDoc::Parser::RipperStateLex::EXPR_LABEL) != 0
        when 'end'
          nest -= 1
          break if nest == 0
        end
      when :on_const then
        is_element_of_constant = true
      when :on_op then
        is_element_of_constant = true if '::' == tk[:text]
      end
      only_constant = false unless is_element_of_constant
      tk = get_tk
    end

    if only_constant
      get_tkread_clean(/\s+/, ' ')
    else
      ''
    end
  end

  ##
  # Little hack going on here. In the statement:
  #
  #   f = 2*(1+yield)
  #
  # We see the RPAREN as the next token, so we need to exit early.  This still
  # won't catch all cases (such as "a = yield + 1"

  def get_end_token tk # :nodoc:
    case tk[:kind]
    when :on_lparen
      token = RDoc::Parser::RipperStateLex::Token.new
      token[:kind] = :on_rparen
      token[:text] = ')'
      token
    when :on_rparen
      nil
    else
      token = RDoc::Parser::RipperStateLex::Token.new
      token[:kind] = :on_nl
      token[:text] = "\n"
      token
    end
  end

  ##
  # Retrieves the method container for a singleton method.

  def get_method_container container, name_t # :nodoc:
    prev_container = container
    container = container.find_module_named(name_t[:text])

    unless container then
      constant = prev_container.constants.find do |const|
        const.name == name_t[:text]
      end

      if constant then
        parse_method_dummy prev_container
        return
      end
    end

    unless container then
      # TODO seems broken, should starting at Object in @store
      obj = name_t[:text].split("::").inject(Object) do |state, item|
        state.const_get(item)
      end rescue nil

      type = obj.class == Class ? RDoc::NormalClass : RDoc::NormalModule

      unless [Class, Module].include?(obj.class) then
        warn("Couldn't find #{name_t[:text]}. Assuming it's a module")
      end

      if type == RDoc::NormalClass then
        sclass = obj.superclass ? obj.superclass.name : nil
        container = prev_container.add_class type, name_t[:text], sclass
      else
        container = prev_container.add_module type, name_t[:text]
      end

      record_location container
    end

    container
  end

  ##
  # Extracts a name or symbol from the token stream.

  def get_symbol_or_name
    tk = get_tk
    case tk[:kind]
    when :on_symbol then
      text = tk[:text].sub(/^:/, '')

      next_tk = peek_tk
      if next_tk && :on_op == next_tk[:kind] && '=' == next_tk[:text] then
        get_tk
        text << '='
      end

      text
    when :on_ident, :on_const, :on_gvar, :on_cvar, :on_ivar, :on_op, :on_kw then
      tk[:text]
    when :on_tstring, :on_dstring then
      tk[:text][1..-2]
    else
      raise RDoc::Error, "Name or symbol expected (got #{tk})"
    end
  end

  ##
  # Marks containers between +container+ and +ancestor+ as ignored

  def suppress_parents container, ancestor # :nodoc:
    while container and container != ancestor do
      container.suppress unless container.documented?
      container = container.parent
    end
  end

  ##
  # Look for directives in a normal comment block:
  #
  #   # :stopdoc:
  #   # Don't display comment from this point forward
  #
  # This routine modifies its +comment+ parameter.

  def look_for_directives_in container, comment
    @preprocess.handle comment, container do |directive, param|
      case directive
      when 'method', 'singleton-method',
           'attr', 'attr_accessor', 'attr_reader', 'attr_writer' then
        false # handled elsewhere
      when 'section' then
        break unless container.kind_of?(RDoc::Context)
        container.set_current_section param, comment.dup
        comment.text = ''
        break
      end
    end

    comment.remove_private
  end

  ##
  # Adds useful info about the parser to +message+

  def make_message message
    prefix = "#{@file_name}:".dup

    tk = peek_tk
    prefix << "#{tk[:line_no]}:#{tk[:char_no]}:" if tk

    "#{prefix} #{message}"
  end

  ##
  # Creates a comment with the correct format

  def new_comment comment, line_no = nil
    c = RDoc::Comment.new comment, @top_level, :ruby
    c.line = line_no
    c.format = @markup
    c
  end

  ##
  # Creates an RDoc::Attr for the name following +tk+, setting the comment to
  # +comment+.

  def parse_attr(context, single, tk, comment)
    line_no = tk[:line_no]

    args = parse_symbol_arg 1
    if args.size > 0 then
      name = args[0]
      rw = "R"
      skip_tkspace_without_nl
      tk = get_tk

      if :on_comma == tk[:kind] then
        rw = "RW" if get_bool
      else
        unget_tk tk
      end

      att = create_attr context, single, name, rw, comment
      att.line   = line_no

      read_documentation_modifiers att, RDoc::ATTR_MODIFIERS
    else
      warn "'attr' ignored - looks like a variable"
    end
  end

  ##
  # Creates an RDoc::Attr for each attribute listed after +tk+, setting the
  # comment for each to +comment+.

  def parse_attr_accessor(context, single, tk, comment)
    line_no = tk[:line_no]

    args = parse_symbol_arg
    rw = "?"

    tmp = RDoc::CodeObject.new
    read_documentation_modifiers tmp, RDoc::ATTR_MODIFIERS
    # TODO In most other places we let the context keep track of document_self
    # and add found items appropriately but here we do not.  I'm not sure why.
    return if @track_visibility and not tmp.document_self

    case tk[:text]
    when "attr_reader"   then rw = "R"
    when "attr_writer"   then rw = "W"
    when "attr_accessor" then rw = "RW"
    else
      rw = '?'
    end

    for name in args
      att = create_attr context, single, name, rw, comment
      att.line   = line_no
    end
  end

  ##
  # Parses an +alias+ in +context+ with +comment+

  def parse_alias(context, single, tk, comment)
    line_no = tk[:line_no]

    skip_tkspace

    if :on_lparen === peek_tk[:kind] then
      get_tk
      skip_tkspace
    end

    new_name = get_symbol_or_name

    skip_tkspace
    if :on_comma === peek_tk[:kind] then
      get_tk
      skip_tkspace
    end

    begin
      old_name = get_symbol_or_name
    rescue RDoc::Error
      return
    end

    al = RDoc::Alias.new(get_tkread, old_name, new_name, comment,
                         single == SINGLE)
    record_location al
    al.line   = line_no

    read_documentation_modifiers al, RDoc::ATTR_MODIFIERS
    context.add_alias al
    @stats.add_alias al

    al
  end

  ##
  # Extracts call parameters from the token stream.

  def parse_call_parameters(tk)
    end_token = case tk[:kind]
                when :on_lparen
                  :on_rparen
                when :on_rparen
                  return ""
                else
                  :on_nl
                end
    nest = 0

    loop do
      break if tk.nil?
      case tk[:kind]
      when :on_semicolon
        break
      when :on_lparen
        nest += 1
      when end_token
        if end_token == :on_rparen
          nest -= 1
          break if RDoc::Parser::RipperStateLex.end?(tk) and nest <= 0
        else
          break if RDoc::Parser::RipperStateLex.end?(tk)
        end
      when :on_comment, :on_embdoc
        unget_tk(tk)
        break
      when :on_op
        if tk[:text] =~ /^(.{1,2})?=$/
          unget_tk(tk)
          break
        end
      end
      tk = get_tk
    end

    get_tkread_clean "\n", " "
  end

  ##
  # Parses a class in +context+ with +comment+

  def parse_class container, single, tk, comment
    line_no = tk[:line_no]

    declaration_context = container
    container, name_t, given_name, = get_class_or_module container

    if name_t[:kind] == :on_const
      cls = parse_class_regular container, declaration_context, single,
        name_t, given_name, comment
    elsif name_t[:kind] == :on_op && name_t[:text] == '<<'
      case name = get_class_specification
      when 'self', container.name
        read_documentation_modifiers cls, RDoc::CLASS_MODIFIERS
        parse_statements container, SINGLE
        return # don't update line
      else
        cls = parse_class_singleton container, name, comment
      end
    else
      warn "Expected class name or '<<'. Got #{name_t[:kind]}: #{name_t[:text].inspect}"
      return
    end

    cls.line   = line_no

    # after end modifiers
    read_documentation_modifiers cls, RDoc::CLASS_MODIFIERS

    cls
  end

  ##
  # Parses and creates a regular class

  def parse_class_regular container, declaration_context, single, # :nodoc:
                          name_t, given_name, comment
    superclass = '::Object'

    if given_name =~ /^::/ then
      declaration_context = @top_level
      given_name = $'
    end

    tk = peek_tk
    if tk[:kind] == :on_op && tk[:text] == '<' then
      get_tk
      skip_tkspace
      superclass = get_class_specification
      superclass = '(unknown)' if superclass.empty?
    end

    cls_type = single == SINGLE ? RDoc::SingleClass : RDoc::NormalClass
    cls = declaration_context.add_class cls_type, given_name, superclass
    cls.ignore unless container.document_children

    read_documentation_modifiers cls, RDoc::CLASS_MODIFIERS
    record_location cls

    cls.add_comment comment, @top_level

    @top_level.add_to_classes_or_modules cls
    @stats.add_class cls

    suppress_parents container, declaration_context unless cls.document_self

    parse_statements cls

    cls
  end

  ##
  # Parses a singleton class in +container+ with the given +name+ and
  # +comment+.

  def parse_class_singleton container, name, comment # :nodoc:
    other = @store.find_class_named name

    unless other then
      if name =~ /^::/ then
        name = $'
        container = @top_level
      end

      other = container.add_module RDoc::NormalModule, name
      record_location other

      # class << $gvar
      other.ignore if name.empty?

      other.add_comment comment, @top_level
    end

    # notify :nodoc: all if not a constant-named class/module
    # (and remove any comment)
    unless name =~ /\A(::)?[A-Z]/ then
      other.document_self = nil
      other.document_children = false
      other.clear_comment
    end

    @top_level.add_to_classes_or_modules other
    @stats.add_class other

    read_documentation_modifiers other, RDoc::CLASS_MODIFIERS
    parse_statements(other, SINGLE)

    other
  end

  ##
  # Parses a constant in +context+ with +comment+.  If +ignore_constants+ is
  # true, no found constants will be added to RDoc.

  def parse_constant container, tk, comment, ignore_constants = false
    line_no = tk[:line_no]

    name = tk[:text]
    skip_tkspace_without_nl

    return unless name =~ /^\w+$/

    new_modules = []
    if :on_op == peek_tk[:kind] && '::' == peek_tk[:text] then
      unget_tk tk

      container, name_t, _, new_modules = get_class_or_module container, true

      name = name_t[:text]
    end

    is_array_or_hash = false
    if peek_tk && :on_lbracket == peek_tk[:kind]
      get_tk
      nest = 1
      while bracket_tk = get_tk
        case bracket_tk[:kind]
        when :on_lbracket
          nest += 1
        when :on_rbracket
          nest -= 1
          break if nest == 0
        end
      end
      skip_tkspace_without_nl
      is_array_or_hash = true
    end

    unless peek_tk && :on_op == peek_tk[:kind] && '=' == peek_tk[:text] then
      return false
    end
    get_tk

    unless ignore_constants
      new_modules.each do |prev_c, new_module|
        prev_c.add_module_by_normal_module new_module
        new_module.ignore unless prev_c.document_children
        @top_level.add_to_classes_or_modules new_module
      end
    end

    value = ''
    con = RDoc::Constant.new name, value, comment

    body = parse_constant_body container, con, is_array_or_hash

    return unless body

    con.value = body
    record_location con
    con.line   = line_no
    read_documentation_modifiers con, RDoc::CONSTANT_MODIFIERS

    return if is_array_or_hash

    @stats.add_constant con
    container.add_constant con

    true
  end

  def parse_constant_body container, constant, is_array_or_hash # :nodoc:
    nest     = 0
    rhs_name = ''.dup

    get_tkread

    tk = get_tk

    body = nil
    loop do
      break if tk.nil?
      if :on_semicolon == tk[:kind] then
        break if nest <= 0
      elsif [:on_tlambeg, :on_lparen, :on_lbrace, :on_lbracket].include?(tk[:kind]) then
        nest += 1
      elsif (:on_kw == tk[:kind] && 'def' == tk[:text]) then
        nest += 1
      elsif (:on_kw == tk[:kind] && %w{do if unless case begin}.include?(tk[:text])) then
        if (tk[:state] & RDoc::Parser::RipperStateLex::EXPR_LABEL) == 0
          nest += 1
        end
      elsif [:on_rparen, :on_rbrace, :on_rbracket].include?(tk[:kind]) ||
            (:on_kw == tk[:kind] && 'end' == tk[:text]) then
        nest -= 1
      elsif (:on_comment == tk[:kind] or :on_embdoc == tk[:kind]) then
        unget_tk tk
        if nest <= 0 and RDoc::Parser::RipperStateLex.end?(tk) then
          body = get_tkread_clean(/^[ \t]+/, '')
          read_documentation_modifiers constant, RDoc::CONSTANT_MODIFIERS
          break
        else
          read_documentation_modifiers constant, RDoc::CONSTANT_MODIFIERS
        end
      elsif :on_const == tk[:kind] then
        rhs_name << tk[:text]

        next_tk = peek_tk
        if nest <= 0 and (next_tk.nil? || :on_nl == next_tk[:kind]) then
          create_module_alias container, constant, rhs_name unless is_array_or_hash
          break
        end
      elsif :on_nl == tk[:kind] then
        if nest <= 0 and RDoc::Parser::RipperStateLex.end?(tk) then
          unget_tk tk
          break
        end
      elsif :on_op == tk[:kind] && '::' == tk[:text]
        rhs_name << '::'
      end
      tk = get_tk
    end

    body ? body : get_tkread_clean(/^[ \t]+/, '')
  end

  ##
  # Generates an RDoc::Method or RDoc::Attr from +comment+ by looking for
  # :method: or :attr: directives in +comment+.

  def parse_comment container, tk, comment
    return parse_comment_tomdoc container, tk, comment if @markup == 'tomdoc'
    column  = tk[:char_no]
    line_no = comment.line.nil? ? tk[:line_no] : comment.line

    comment.text = comment.text.sub(/(^# +:?)(singleton-)(method:)/, '\1\3')
    singleton = !!$~

    co =
      if (comment.text = comment.text.sub(/^# +:?method: *(\S*).*?\n/i, '')) && !!$~ then
        line_no += $`.count("\n")
        parse_comment_ghost container, comment.text, $1, column, line_no, comment
      elsif (comment.text = comment.text.sub(/# +:?(attr(_reader|_writer|_accessor)?): *(\S*).*?\n/i, '')) && !!$~ then
        parse_comment_attr container, $1, $3, comment
      end

    if co then
      co.singleton = singleton
      co.line      = line_no
    end

    true
  end

  ##
  # Parse a comment that is describing an attribute in +container+ with the
  # given +name+ and +comment+.

  def parse_comment_attr container, type, name, comment # :nodoc:
    return if name.empty?

    rw = case type
         when 'attr_reader' then 'R'
         when 'attr_writer' then 'W'
         else 'RW'
         end

    create_attr container, NORMAL, name, rw, comment
  end

  def parse_comment_ghost container, text, name, column, line_no, # :nodoc:
                          comment
    name = nil if name.empty?

    meth = RDoc::GhostMethod.new get_tkread, name
    record_location meth

    meth.start_collecting_tokens
    indent = RDoc::Parser::RipperStateLex::Token.new(1, 1, :on_sp, ' ' * column)
    position_comment = RDoc::Parser::RipperStateLex::Token.new(line_no, 1, :on_comment)
    position_comment[:text] = "# File #{@top_level.relative_name}, line #{line_no}"
    newline = RDoc::Parser::RipperStateLex::Token.new(0, 0, :on_nl, "\n")
    meth.add_tokens [position_comment, newline, indent]

    meth.params =
      if text.sub!(/^#\s+:?args?:\s*(.*?)\s*$/i, '') then
        $1
      else
        ''
      end

    comment.normalize
    comment.extract_call_seq meth

    return unless meth.name

    container.add_method meth

    meth.comment = comment

    @stats.add_method meth

    meth
  end

  ##
  # Creates an RDoc::Method on +container+ from +comment+ if there is a
  # Signature section in the comment

  def parse_comment_tomdoc container, tk, comment
    return unless signature = RDoc::TomDoc.signature(comment)
    column  = tk[:char_no]
    line_no = tk[:line_no]

    name, = signature.split %r%[ \(]%, 2

    meth = RDoc::GhostMethod.new get_tkread, name
    record_location meth
    meth.line      = line_no

    meth.start_collecting_tokens
    indent = RDoc::Parser::RipperStateLex::Token.new(1, 1, :on_sp, ' ' * column)
    position_comment = RDoc::Parser::RipperStateLex::Token.new(line_no, 1, :on_comment)
    position_comment[:text] = "# File #{@top_level.relative_name}, line #{line_no}"
    newline = RDoc::Parser::RipperStateLex::Token.new(0, 0, :on_nl, "\n")
    meth.add_tokens [position_comment, newline, indent]

    meth.call_seq = signature

    comment.normalize

    return unless meth.name

    container.add_method meth

    meth.comment = comment

    @stats.add_method meth
  end

  ##
  # Parses an +include+ or +extend+, indicated by the +klass+ and adds it to
  # +container+ # with +comment+

  def parse_extend_or_include klass, container, comment # :nodoc:
    loop do
      skip_tkspace_comment

      name = get_included_module_with_optional_parens

      unless name.empty? then
        obj = container.add klass, name, comment
        record_location obj
      end

      return if peek_tk.nil? || :on_comma != peek_tk[:kind]

      get_tk
    end
  end

  ##
  # Parses an +included+ with a block feature of ActiveSupport::Concern.

  def parse_included_with_activesupport_concern container, comment # :nodoc:
    skip_tkspace_without_nl
    tk = get_tk
    unless tk[:kind] == :on_lbracket || (tk[:kind] == :on_kw && tk[:text] == 'do')
      unget_tk tk
      return nil # should be a block
    end

    parse_statements container

    container
  end

  ##
  # Parses identifiers that can create new methods or change visibility.
  #
  # Returns true if the comment was not consumed.

  def parse_identifier container, single, tk, comment # :nodoc:
    case tk[:text]
    when 'private', 'protected', 'public', 'private_class_method',
         'public_class_method', 'module_function' then
      parse_visibility container, single, tk
      return true
    when 'private_constant', 'public_constant'
      parse_constant_visibility container, single, tk
      return true
    when 'attr' then
      parse_attr container, single, tk, comment
    when /^attr_(reader|writer|accessor)$/ then
      parse_attr_accessor container, single, tk, comment
    when 'alias_method' then
      parse_alias container, single, tk, comment
    when 'require', 'include' then
      # ignore
    else
      if comment.text =~ /\A#\#$/ then
        case comment.text
        when /^# +:?attr(_reader|_writer|_accessor)?:/ then
          parse_meta_attr container, single, tk, comment
        else
          method = parse_meta_method container, single, tk, comment
          method.params = container.params if
            container.params
          method.block_params = container.block_params if
            container.block_params
        end
      end
    end

    false
  end

  ##
  # Parses a meta-programmed attribute and creates an RDoc::Attr.
  #
  # To create foo and bar attributes on class C with comment "My attributes":
  #
  #   class C
  #
  #     ##
  #     # :attr:
  #     #
  #     # My attributes
  #
  #     my_attr :foo, :bar
  #
  #   end
  #
  # To create a foo attribute on class C with comment "My attribute":
  #
  #   class C
  #
  #     ##
  #     # :attr: foo
  #     #
  #     # My attribute
  #
  #     my_attr :foo, :bar
  #
  #   end

  def parse_meta_attr(context, single, tk, comment)
    args = parse_symbol_arg
    rw = "?"

    # If nodoc is given, don't document any of them

    tmp = RDoc::CodeObject.new
    read_documentation_modifiers tmp, RDoc::ATTR_MODIFIERS

    regexp = /^# +:?(attr(_reader|_writer|_accessor)?): *(\S*).*?\n/i
    if regexp =~ comment.text then
      comment.text = comment.text.sub(regexp, '')
      rw = case $1
           when 'attr_reader' then 'R'
           when 'attr_writer' then 'W'
           else 'RW'
           end
      name = $3 unless $3.empty?
    end

    if name then
      att = create_attr context, single, name, rw, comment
    else
      args.each do |attr_name|
        att = create_attr context, single, attr_name, rw, comment
      end
    end

    att
  end

  ##
  # Parses a meta-programmed method

  def parse_meta_method(container, single, tk, comment)
    column  = tk[:char_no]
    line_no = tk[:line_no]

    start_collecting_tokens
    add_token tk
    add_token_listener self

    skip_tkspace_without_nl

    comment.text = comment.text.sub(/(^# +:?)(singleton-)(method:)/, '\1\3')
    singleton = !!$~

    name = parse_meta_method_name comment, tk

    return unless name

    meth = RDoc::MetaMethod.new get_tkread, name
    record_location meth
    meth.line   = line_no
    meth.singleton = singleton

    remove_token_listener self

    meth.start_collecting_tokens
    indent = RDoc::Parser::RipperStateLex::Token.new(1, 1, :on_sp, ' ' * column)
    position_comment = RDoc::Parser::RipperStateLex::Token.new(line_no, 1, :on_comment)
    position_comment[:text] = "# File #{@top_level.relative_name}, line #{line_no}"
    newline = RDoc::Parser::RipperStateLex::Token.new(0, 0, :on_nl, "\n")
    meth.add_tokens [position_comment, newline, indent]
    meth.add_tokens @token_stream

    parse_meta_method_params container, single, meth, tk, comment

    meth.comment = comment

    @stats.add_method meth

    meth
  end

  ##
  # Parses the name of a metaprogrammed method.  +comment+ is used to
  # determine the name while +tk+ is used in an error message if the name
  # cannot be determined.

  def parse_meta_method_name comment, tk # :nodoc:
    if comment.text.sub!(/^# +:?method: *(\S*).*?\n/i, '') then
      return $1 unless $1.empty?
    end

    name_t = get_tk

    if :on_symbol == name_t[:kind] then
      name_t[:text][1..-1]
    elsif :on_tstring == name_t[:kind] then
      name_t[:text][1..-2]
    elsif :on_op == name_t[:kind] && '=' == name_t[:text] then # ignore
      remove_token_listener self

      nil
    else
      warn "unknown name token #{name_t.inspect} for meta-method '#{tk[:text]}'"
      'unknown'
    end
  end

  ##
  # Parses the parameters and block for a meta-programmed method.

  def parse_meta_method_params container, single, meth, tk, comment # :nodoc:
    token_listener meth do
      meth.params = ''

      look_for_directives_in meth, comment
      comment.normalize
      comment.extract_call_seq meth

      container.add_method meth

      last_tk = tk

      while tk = get_tk do
        if :on_semicolon == tk[:kind] then
          break
        elsif :on_nl == tk[:kind] then
          break unless last_tk and :on_comma == last_tk[:kind]
        elsif :on_sp == tk[:kind] then
          # expression continues
        elsif :on_kw == tk[:kind] && 'do' == tk[:text] then
          parse_statements container, single, meth
          break
        else
          last_tk = tk
        end
      end
    end
  end

  ##
  # Parses a normal method defined by +def+

  def parse_method(container, single, tk, comment)
    singleton = nil
    added_container = false
    name = nil
    column  = tk[:char_no]
    line_no = tk[:line_no]

    start_collecting_tokens
    add_token tk

    token_listener self do
      prev_container = container
      name, container, singleton = parse_method_name container
      added_container = container != prev_container
    end

    return unless name

    meth = RDoc::AnyMethod.new get_tkread, name
    look_for_directives_in meth, comment
    meth.singleton = single == SINGLE ? true : singleton

    record_location meth
    meth.line   = line_no

    meth.start_collecting_tokens
    indent = RDoc::Parser::RipperStateLex::Token.new(1, 1, :on_sp, ' ' * column)
    token = RDoc::Parser::RipperStateLex::Token.new(line_no, 1, :on_comment)
    token[:text] = "# File #{@top_level.relative_name}, line #{line_no}"
    newline = RDoc::Parser::RipperStateLex::Token.new(0, 0, :on_nl, "\n")
    meth.add_tokens [token, newline, indent]
    meth.add_tokens @token_stream

    parse_method_params_and_body container, single, meth, added_container

    comment.normalize
    comment.extract_call_seq meth

    meth.comment = comment

    # after end modifiers
    read_documentation_modifiers meth, RDoc::METHOD_MODIFIERS

    @stats.add_method meth
  end

  ##
  # Parses the parameters and body of +meth+

  def parse_method_params_and_body container, single, meth, added_container
    token_listener meth do
      parse_method_parameters meth

      if meth.document_self or not @track_visibility then
        container.add_method meth
      elsif added_container then
        container.document_self = false
      end

      # Having now read the method parameters and documentation modifiers, we
      # now know whether we have to rename #initialize to ::new

      if meth.name == "initialize" && !meth.singleton then
        if meth.dont_rename_initialize then
          meth.visibility = :protected
        else
          meth.singleton = true
          meth.name = "new"
          meth.visibility = :public
        end
      end

      parse_statements container, single, meth
    end
  end

  ##
  # Parses a method that needs to be ignored.

  def parse_method_dummy container
    dummy = RDoc::Context.new
    dummy.parent = container
    dummy.store  = container.store
    skip_method dummy
  end

  ##
  # Parses the name of a method in +container+.
  #
  # Returns the method name, the container it is in (for def Foo.name) and if
  # it is a singleton or regular method.

  def parse_method_name container # :nodoc:
    skip_tkspace
    name_t = get_tk
    back_tk = skip_tkspace_without_nl
    singleton = false

    dot = get_tk
    if dot[:kind] == :on_period || (dot[:kind] == :on_op && dot[:text] == '::') then
      singleton = true

      name, container = parse_method_name_singleton container, name_t
    else
      unget_tk dot
      back_tk.reverse_each do |token|
        unget_tk token
      end

      name = parse_method_name_regular container, name_t
    end

    return name, container, singleton
  end

  ##
  # For the given +container+ and initial name token +name_t+ the method name
  # is parsed from the token stream for a regular method.

  def parse_method_name_regular container, name_t # :nodoc:
    if :on_op == name_t[:kind] && (%w{* & [] []= <<}.include?(name_t[:text])) then
      name_t[:text]
    else
      unless [:on_kw, :on_const, :on_ident].include?(name_t[:kind]) then
        warn "expected method name token, . or ::, got #{name_t.inspect}"
        skip_method container
        return
      end
      name_t[:text]
    end
  end

  ##
  # For the given +container+ and initial name token +name_t+ the method name
  # and the new +container+ (if necessary) are parsed from the token stream
  # for a singleton method.

  def parse_method_name_singleton container, name_t # :nodoc:
    skip_tkspace
    name_t2 = get_tk

    if (:on_kw == name_t[:kind] && 'self' == name_t[:text]) || (:on_op == name_t[:kind] && '%' == name_t[:text]) then
      # NOTE: work around '[' being consumed early
      if :on_lbracket == name_t2[:kind]
        get_tk
        name = '[]'
      else
        name = name_t2[:text]
      end
    elsif :on_const == name_t[:kind] then
      name = name_t2[:text]

      container = get_method_container container, name_t

      return unless container

      name
    elsif :on_ident == name_t[:kind] || :on_ivar == name_t[:kind] || :on_gvar == name_t[:kind] then
      parse_method_dummy container

      name = nil
    elsif (:on_kw == name_t[:kind]) && ('true' == name_t[:text] || 'false' == name_t[:text] || 'nil' == name_t[:text]) then
      klass_name = "#{name_t[:text].capitalize}Class"
      container = @store.find_class_named klass_name
      container ||= @top_level.add_class RDoc::NormalClass, klass_name

      name = name_t2[:text]
    else
      warn "unexpected method name token #{name_t.inspect}"
      # break
      skip_method container

      name = nil
    end

    return name, container
  end

  ##
  # Extracts +yield+ parameters from +method+

  def parse_method_or_yield_parameters(method = nil,
                                       modifiers = RDoc::METHOD_MODIFIERS)
    skip_tkspace_without_nl
    tk = get_tk
    end_token = get_end_token tk
    return '' unless end_token

    nest = 0
    continue = false

    while tk != nil do
      case tk[:kind]
      when :on_semicolon then
        break if nest == 0
      when :on_lbracket then
        nest += 1
      when :on_rbracket then
        nest -= 1
      when :on_lbrace then
        nest += 1
      when :on_rbrace then
        nest -= 1
        if nest <= 0
          # we might have a.each { |i| yield i }
          unget_tk(tk) if nest < 0
          break
        end
      when :on_lparen then
        nest += 1
      when end_token[:kind] then
        if end_token[:kind] == :on_rparen
          nest -= 1
          break if nest <= 0
        else
          break
        end
      when :on_rparen then
        nest -= 1
      when :on_comment, :on_embdoc then
        @read.pop
        if :on_nl == end_token[:kind] and "\n" == tk[:text][-1] and
          (!continue or (tk[:state] & RDoc::Parser::RipperStateLex::EXPR_LABEL) != 0) then
          if method && method.block_params.nil? then
            unget_tk tk
            read_documentation_modifiers method, modifiers
          end
          break if !continue and nest <= 0
        end
      when :on_comma then
        continue = true
      when :on_ident then
        continue = false if continue
      end
      tk = get_tk
    end

    get_tkread_clean(/\s+/, ' ')
  end

  ##
  # Capture the method's parameters. Along the way, look for a comment
  # containing:
  #
  #    # yields: ....
  #
  # and add this as the block_params for the method

  def parse_method_parameters method
    res = parse_method_or_yield_parameters method

    res = "(#{res})" unless res =~ /\A\(/
    method.params = res unless method.params

    return if  method.block_params

    skip_tkspace_without_nl
    read_documentation_modifiers method, RDoc::METHOD_MODIFIERS
  end

  ##
  # Parses an RDoc::NormalModule in +container+ with +comment+

  def parse_module container, single, tk, comment
    container, name_t, = get_class_or_module container

    name = name_t[:text]

    mod = container.add_module RDoc::NormalModule, name
    mod.ignore unless container.document_children
    record_location mod

    read_documentation_modifiers mod, RDoc::CLASS_MODIFIERS
    mod.add_comment comment, @top_level
    parse_statements mod

    # after end modifiers
    read_documentation_modifiers mod, RDoc::CLASS_MODIFIERS

    @stats.add_module mod
  end

  ##
  # Parses an RDoc::Require in +context+ containing +comment+

  def parse_require(context, comment)
    skip_tkspace_comment
    tk = get_tk

    if :on_lparen == tk[:kind] then
      skip_tkspace_comment
      tk = get_tk
    end

    name = tk[:text][1..-2] if :on_tstring == tk[:kind]

    if name then
      @top_level.add_require RDoc::Require.new(name, comment)
    else
      unget_tk tk
    end
  end

  ##
  # Parses a rescue

  def parse_rescue
    skip_tkspace_without_nl

    while tk = get_tk
      case tk[:kind]
      when :on_nl, :on_semicolon, :on_comment then
        break
      when :on_comma then
        skip_tkspace_without_nl

        get_tk if :on_nl == peek_tk[:kind]
      end

      skip_tkspace_without_nl
    end
  end

  ##
  # Retrieve comment body without =begin/=end

  def retrieve_comment_body(tk)
    if :on_embdoc == tk[:kind]
      tk[:text].gsub(/\A=begin.*\n/, '').gsub(/=end\n?\z/, '')
    else
      tk[:text]
    end
  end

  ##
  # The core of the Ruby parser.

  def parse_statements(container, single = NORMAL, current_method = nil,
                       comment = new_comment(''))
    raise 'no' unless RDoc::Comment === comment
    comment = RDoc::Encoding.change_encoding comment, @encoding if @encoding

    nest = 1
    save_visibility = container.visibility

    non_comment_seen = true

    while tk = get_tk do
      keep_comment = false
      try_parse_comment = false

      non_comment_seen = true unless (:on_comment == tk[:kind] or :on_embdoc == tk[:kind])

      case tk[:kind]
      when :on_nl, :on_ignored_nl, :on_comment, :on_embdoc then
        if :on_nl == tk[:kind] or :on_ignored_nl == tk[:kind]
          skip_tkspace
          tk = get_tk
        else
          past_tokens = @read.size > 1 ? @read[0..-2] : []
          nl_position = 0
          past_tokens.reverse.each_with_index do |read_tk, i|
            if read_tk =~ /^\n$/ then
              nl_position = (past_tokens.size - 1) - i
              break
            elsif read_tk =~ /^#.*\n$/ then
              nl_position = ((past_tokens.size - 1) - i) + 1
              break
            end
          end
          comment_only_line = past_tokens[nl_position..-1].all?{ |c| c =~ /^\s+$/ }
          unless comment_only_line then
            tk = get_tk
          end
        end

        if tk and (:on_comment == tk[:kind] or :on_embdoc == tk[:kind]) then
          if non_comment_seen then
            # Look for RDoc in a comment about to be thrown away
            non_comment_seen = parse_comment container, tk, comment unless
              comment.empty?

            comment = ''
            comment = RDoc::Encoding.change_encoding comment, @encoding if @encoding
          end

          line_no = nil
          while tk and (:on_comment == tk[:kind] or :on_embdoc == tk[:kind]) do
            comment_body = retrieve_comment_body(tk)
            line_no = tk[:line_no] if comment.empty?
            comment += comment_body
            comment << "\n" unless comment_body =~ /\n\z/

            if comment_body.size > 1 && comment_body =~ /\n\z/ then
              skip_tkspace_without_nl # leading spaces
            end
            tk = get_tk
          end

          comment = new_comment comment, line_no

          unless comment.empty? then
            look_for_directives_in container, comment

            if container.done_documenting then
              throw :eof if RDoc::TopLevel === container
              container.ongoing_visibility = save_visibility
            end
          end

          keep_comment = true
        else
          non_comment_seen = true
        end

        unget_tk tk
        keep_comment = true
        container.current_line_visibility = nil

      when :on_kw then
        case tk[:text]
        when 'class' then
          parse_class container, single, tk, comment

        when 'module' then
          parse_module container, single, tk, comment

        when 'def' then
          parse_method container, single, tk, comment

        when 'alias' then
          parse_alias container, single, tk, comment unless current_method

        when 'yield' then
          if current_method.nil? then
            warn "Warning: yield outside of method" if container.document_self
          else
            parse_yield container, single, tk, current_method
          end

        when 'until', 'while' then
          if (tk[:state] & RDoc::Parser::RipperStateLex::EXPR_LABEL) == 0
            nest += 1
            skip_optional_do_after_expression
          end

        # Until and While can have a 'do', which shouldn't increase the nesting.
        # We can't solve the general case, but we can handle most occurrences by
        # ignoring a do at the end of a line.

        # 'for' is trickier
        when 'for' then
          nest += 1
          skip_for_variable
          skip_optional_do_after_expression

        when 'case', 'do', 'if', 'unless', 'begin' then
          if (tk[:state] & RDoc::Parser::RipperStateLex::EXPR_LABEL) == 0
            nest += 1
          end

        when 'super' then
          current_method.calls_super = true if current_method

        when 'rescue' then
          parse_rescue

        when 'end' then
          nest -= 1
          if nest == 0 then
            container.ongoing_visibility = save_visibility

            parse_comment container, tk, comment unless comment.empty?

            return
          end
        end

      when :on_const then
        unless parse_constant container, tk, comment, current_method then
          try_parse_comment = true
        end

      when :on_ident then
        if nest == 1 and current_method.nil? then
          keep_comment = parse_identifier container, single, tk, comment
        end

        case tk[:text]
        when "require" then
          parse_require container, comment
        when "include" then
          parse_extend_or_include RDoc::Include, container, comment
        when "extend" then
          parse_extend_or_include RDoc::Extend, container, comment
        when "included" then
          parse_included_with_activesupport_concern container, comment
        end

      else
        try_parse_comment = nest == 1
      end

      if try_parse_comment then
        non_comment_seen = parse_comment container, tk, comment unless
          comment.empty?

        keep_comment = false
      end

      unless keep_comment then
        comment = new_comment ''
        comment = RDoc::Encoding.change_encoding comment, @encoding if @encoding
        container.params = nil
        container.block_params = nil
      end

      consume_trailing_spaces
    end

    container.params = nil
    container.block_params = nil
  end

  ##
  # Parse up to +no+ symbol arguments

  def parse_symbol_arg(no = nil)
    skip_tkspace_comment

    tk = get_tk
    if tk[:kind] == :on_lparen
      parse_symbol_arg_paren no
    else
      parse_symbol_arg_space no, tk
    end
  end

  ##
  # Parses up to +no+ symbol arguments surrounded by () and places them in
  # +args+.

  def parse_symbol_arg_paren no # :nodoc:
    args = []

    loop do
      skip_tkspace_comment
      if tk1 = parse_symbol_in_arg
        args.push tk1
        break if no and args.size >= no
      end

      skip_tkspace_comment
      case (tk2 = get_tk)[:kind]
      when :on_rparen
        break
      when :on_comma
      else
        warn("unexpected token: '#{tk2.inspect}'") if $DEBUG_RDOC
        break
      end
    end

    args
  end

  ##
  # Parses up to +no+ symbol arguments separated by spaces and places them in
  # +args+.

  def parse_symbol_arg_space no, tk # :nodoc:
    args = []

    unget_tk tk
    if tk = parse_symbol_in_arg
      args.push tk
      return args if no and args.size >= no
    end

    loop do
      skip_tkspace_without_nl

      tk1 = get_tk
      if tk1.nil? || :on_comma != tk1[:kind] then
        unget_tk tk1
        break
      end

      skip_tkspace_comment
      if tk = parse_symbol_in_arg
        args.push tk
        break if no and args.size >= no
      end
    end

    args
  end

  ##
  # Returns symbol text from the next token

  def parse_symbol_in_arg
    tk = get_tk
    if :on_symbol == tk[:kind] then
      tk[:text].sub(/^:/, '')
    elsif :on_tstring == tk[:kind] then
      tk[:text][1..-2]
    elsif :on_dstring == tk[:kind] or :on_ident == tk[:kind] then
      nil # ignore
    else
      warn("Expected symbol or string, got #{tk.inspect}") if $DEBUG_RDOC
      nil
    end
  end

  ##
  # Parses statements in the top-level +container+

  def parse_top_level_statements container
    comment = collect_first_comment

    look_for_directives_in container, comment

    throw :eof if container.done_documenting

    @markup = comment.format

    # HACK move if to RDoc::Context#comment=
    container.comment = comment if container.document_self unless comment.empty?

    parse_statements container, NORMAL, nil, comment
  end

  ##
  # Determines the visibility in +container+ from +tk+

  def parse_visibility(container, single, tk)
    vis_type, vis, singleton = get_visibility_information tk, single

    skip_tkspace_comment false

    ptk = peek_tk
    # Ryan Davis suggested the extension to ignore modifiers, because he
    # often writes
    #
    #   protected unless $TESTING
    #
    if [:on_nl, :on_semicolon].include?(ptk[:kind]) || (:on_kw == ptk[:kind] && (['if', 'unless'].include?(ptk[:text]))) then
      container.ongoing_visibility = vis
    elsif :on_kw == ptk[:kind] && 'def' == ptk[:text]
      container.current_line_visibility = vis
    else
      update_visibility container, vis_type, vis, singleton
    end
  end

  ##
  # Parses a Module#private_constant or Module#public_constant call from +tk+.

  def parse_constant_visibility(container, single, tk)
    args = parse_symbol_arg
    case tk[:text]
    when 'private_constant'
      vis = :private
    when 'public_constant'
      vis = :public
    else
      raise RDoc::Error, 'Unreachable'
    end
    container.set_constant_visibility_for args, vis
  end

  ##
  # Determines the block parameter for +context+

  def parse_yield(context, single, tk, method)
    return if method.block_params

    get_tkread
    method.block_params = parse_method_or_yield_parameters
  end

  ##
  # Directives are modifier comments that can appear after class, module, or
  # method names. For example:
  #
  #   def fred # :yields: a, b
  #
  # or:
  #
  #   class MyClass # :nodoc:
  #
  # We return the directive name and any parameters as a two element array if
  # the name is in +allowed+.  A directive can be found anywhere up to the end
  # of the current line.

  def read_directive allowed
    tokens = []

    while tk = get_tk do
      tokens << tk

      if :on_nl == tk[:kind] or (:on_kw == tk[:kind] && 'def' == tk[:text]) then
        return
      elsif :on_comment == tk[:kind] or :on_embdoc == tk[:kind] then
        return unless tk[:text] =~ /\s*:?([\w-]+):\s*(.*)/

        directive = $1.downcase

        return [directive, $2] if allowed.include? directive

        return
      end
    end
  ensure
    unless tokens.length == 1 and (:on_comment == tokens.first[:kind] or :on_embdoc == tokens.first[:kind]) then
      tokens.reverse_each do |token|
        unget_tk token
      end
    end
  end

  ##
  # Handles directives following the definition for +context+ (any
  # RDoc::CodeObject) if the directives are +allowed+ at this point.
  #
  # See also RDoc::Markup::PreProcess#handle_directive

  def read_documentation_modifiers context, allowed
    skip_tkspace_without_nl
    directive, value = read_directive allowed

    return unless directive

    @preprocess.handle_directive '', directive, value, context do |dir, param|
      if %w[notnew not_new not-new].include? dir then
        context.dont_rename_initialize = true

        true
      end
    end
  end

  ##
  # Records the location of this +container+ in the file for this parser and
  # adds it to the list of classes and modules in the file.

  def record_location container # :nodoc:
    case container
    when RDoc::ClassModule then
      @top_level.add_to_classes_or_modules container
    end

    container.record_location @top_level
  end

  ##
  # Scans this Ruby file for Ruby constructs

  def scan
    reset

    catch :eof do
      begin
        parse_top_level_statements @top_level

      rescue StandardError => e
        if @content.include?('<%') and @content.include?('%>') then
          # Maybe, this is ERB.
          $stderr.puts "\033[2KRDoc detects ERB file. Skips it for compatibility:"
          $stderr.puts @file_name
          return
        end

        if @scanner_point >= @scanner.size
          now_line_no = @scanner[@scanner.size - 1][:line_no]
        else
          now_line_no = peek_tk[:line_no]
        end
        first_tk_index = @scanner.find_index { |tk| tk[:line_no] == now_line_no }
        last_tk_index = @scanner.find_index { |tk| tk[:line_no] == now_line_no + 1 }
        last_tk_index = last_tk_index ? last_tk_index - 1 : @scanner.size - 1
        code = @scanner[first_tk_index..last_tk_index].map{ |t| t[:text] }.join

        $stderr.puts <<-EOF

#{self.class} failure around line #{now_line_no} of
#{@file_name}

        EOF

        unless code.empty? then
          $stderr.puts code
          $stderr.puts
        end

        raise e
      end
    end

    @top_level
  end

  ##
  # while, until, and for have an optional do

  def skip_optional_do_after_expression
    skip_tkspace_without_nl
    tk = get_tk

    b_nest = 0
    nest = 0

    loop do
      break unless tk
      case tk[:kind]
      when :on_semicolon, :on_nl, :on_ignored_nl then
        break if b_nest.zero?
      when :on_lparen then
        nest += 1
      when :on_rparen then
        nest -= 1
      when :on_kw then
        case tk[:text]
        when 'begin'
          b_nest += 1
        when 'end'
          b_nest -= 1
        when 'do'
          break if nest.zero?
        end
      when :on_comment, :on_embdoc then
        if b_nest.zero? and "\n" == tk[:text][-1] then
          break
        end
      end
      tk = get_tk
    end

    skip_tkspace_without_nl

    get_tk if peek_tk && :on_kw == peek_tk[:kind] && 'do' == peek_tk[:text]
  end

  ##
  # skip the var [in] part of a 'for' statement

  def skip_for_variable
    skip_tkspace_without_nl
    get_tk
    skip_tkspace_without_nl
    tk = get_tk
    unget_tk(tk) unless :on_kw == tk[:kind] and 'in' == tk[:text]
  end

  ##
  # Skips the next method in +container+

  def skip_method container
    meth = RDoc::AnyMethod.new "", "anon"
    parse_method_parameters meth
    parse_statements container, false, meth
  end

  ##
  # Skip spaces until a comment is found

  def skip_tkspace_comment(skip_nl = true)
    loop do
      skip_nl ? skip_tkspace : skip_tkspace_without_nl
      next_tk = peek_tk
      return if next_tk.nil? || (:on_comment != next_tk[:kind] and :on_embdoc != next_tk[:kind])
      get_tk
    end
  end

  ##
  # Updates visibility in +container+ from +vis_type+ and +vis+.

  def update_visibility container, vis_type, vis, singleton # :nodoc:
    new_methods = []

    case vis_type
    when 'module_function' then
      args = parse_symbol_arg
      container.set_visibility_for args, :private, false

      container.methods_matching args do |m|
        s_m = m.dup
        record_location s_m
        s_m.singleton = true
        new_methods << s_m
      end
    when 'public_class_method', 'private_class_method' then
      args = parse_symbol_arg

      container.methods_matching args, true do |m|
        if m.parent != container then
          m = m.dup
          record_location m
          new_methods << m
        end

        m.visibility = vis
      end
    else
      args = parse_symbol_arg
      container.set_visibility_for args, vis, singleton
    end

    new_methods.each do |method|
      case method
      when RDoc::AnyMethod then
        container.add_method method
      when RDoc::Attr then
        container.add_attribute method
      end
      method.visibility = vis
    end
  end

  ##
  # Prints +message+ to +$stderr+ unless we're being quiet

  def warn message
    @options.warn make_message message
  end

end
PK}$[h\�;!;!3gems/gems/rdoc-6.4.1.1/lib/rdoc/parser/changelog.rbnu�[���# frozen_string_literal: true

##
# A ChangeLog file parser.
#
# This parser converts a ChangeLog into an RDoc::Markup::Document.  When
# viewed as HTML a ChangeLog page will have an entry for each day's entries in
# the sidebar table of contents.
#
# This parser is meant to parse the MRI ChangeLog, but can be used to parse any
# {GNU style Change
# Log}[http://www.gnu.org/prep/standards/html_node/Style-of-Change-Logs.html].

class RDoc::Parser::ChangeLog < RDoc::Parser

  include RDoc::Parser::Text

  parse_files_matching(/(\/|\\|\A)ChangeLog[^\/\\]*\z/)

  ##
  # Attaches the +continuation+ of the previous line to the +entry_body+.
  #
  # Continued function listings are joined together as a single entry.
  # Continued descriptions are joined to make a single paragraph.

  def continue_entry_body entry_body, continuation
    return unless last = entry_body.last

    if last =~ /\)\s*\z/ and continuation =~ /\A\(/ then
      last.sub!(/\)\s*\z/, ',')
      continuation = continuation.sub(/\A\(/, '')
    end

    if last =~ /\s\z/ then
      last << continuation
    else
      last << ' ' + continuation
    end
  end

  ##
  # Creates an RDoc::Markup::Document given the +groups+ of ChangeLog entries.

  def create_document groups
    doc = RDoc::Markup::Document.new
    doc.omit_headings_below = 2
    doc.file = @top_level

    doc << RDoc::Markup::Heading.new(1, File.basename(@file_name))
    doc << RDoc::Markup::BlankLine.new

    groups.sort_by do |day,| day end.reverse_each do |day, entries|
      doc << RDoc::Markup::Heading.new(2, day.dup)
      doc << RDoc::Markup::BlankLine.new

      doc.concat create_entries entries
    end

    doc
  end

  ##
  # Returns a list of ChangeLog entries an RDoc::Markup nodes for the given
  # +entries+.

  def create_entries entries
    out = []

    entries.each do |entry, items|
      out << RDoc::Markup::Heading.new(3, entry)
      out << RDoc::Markup::BlankLine.new

      out << create_items(items)
    end

    out
  end

  ##
  # Returns an RDoc::Markup::List containing the given +items+ in the
  # ChangeLog

  def create_items items
    list = RDoc::Markup::List.new :NOTE

    items.each do |item|
      item =~ /\A(.*?(?:\([^)]+\))?):\s*/

      title = $1
      body = $'

      paragraph = RDoc::Markup::Paragraph.new body
      list_item = RDoc::Markup::ListItem.new title, paragraph
      list << list_item
    end

    list
  end

  ##
  # Groups +entries+ by date.

  def group_entries entries
    @time_cache ||= {}
    entries.group_by do |title, _|
      begin
        time = @time_cache[title]
        (time || parse_date(title)).strftime '%Y-%m-%d'
      rescue NoMethodError, ArgumentError
        time, = title.split '  ', 2
        parse_date(time).strftime '%Y-%m-%d'
      end
    end
  end

  ##
  # Parse date in ISO-8601, RFC-2822, or default of Git

  def parse_date(date)
    case date
    when /\A\s*(\d+)-(\d+)-(\d+)(?:[ T](\d+):(\d+):(\d+) *([-+]\d\d):?(\d\d))?\b/
      Time.new($1, $2, $3, $4, $5, $6, ("#{$7}:#{$8}" if $7))
    when /\A\s*\w{3}, +(\d+) (\w{3}) (\d+) (\d+):(\d+):(\d+) *(?:([-+]\d\d):?(\d\d))\b/
      Time.new($3, $2, $1, $4, $5, $6, ("#{$7}:#{$8}" if $7))
    when /\A\s*\w{3} (\w{3}) +(\d+) (\d+) (\d+):(\d+):(\d+) *(?:([-+]\d\d):?(\d\d))\b/
      Time.new($3, $1, $2, $4, $5, $6, ("#{$7}:#{$8}" if $7))
    when /\A\s*\w{3} (\w{3}) +(\d+) (\d+):(\d+):(\d+) (\d+)\b/
      Time.new($6, $1, $2, $3, $4, $5)
    else
      raise ArgumentError, "bad date: #{date}"
    end
  end

  ##
  # Parses the entries in the ChangeLog.
  #
  # Returns an Array of each ChangeLog entry in order of parsing.
  #
  # A ChangeLog entry is an Array containing the ChangeLog title (date and
  # committer) and an Array of ChangeLog items (file and function changed with
  # description).
  #
  # An example result would be:
  #
  #    [ 'Tue Dec  4 08:33:46 2012  Eric Hodel  <drbrain@segment7.net>',
  #      [ 'README.EXT:  Converted to RDoc format',
  #        'README.EXT.ja:  ditto']]

  def parse_entries
    @time_cache ||= {}

    if /\A((?:.*\n){,3})commit\s/ =~ @content
      class << self; prepend Git; end
      parse_info($1)
      return parse_entries
    end

    entries = []
    entry_name = nil
    entry_body = []

    @content.each_line do |line|
      case line
      when /^\s*$/ then
        next
      when /^\w.*/ then
        entries << [entry_name, entry_body] if entry_name

        entry_name = $&

        begin
          time = parse_date entry_name
          @time_cache[entry_name] = time
        rescue ArgumentError
          entry_name = nil
        end

        entry_body = []
      when /^(\t| {8})?\*\s*(.*)/ then # "\t* file.c (func): ..."
        entry_body << $2.dup
      when /^(\t| {8})?\s*(\(.*)/ then # "\t(func): ..."
        entry = $2

        if entry_body.last =~ /:/ then
          entry_body << entry.dup
        else
          continue_entry_body entry_body, entry
        end
      when /^(\t| {8})?\s*(.*)/ then
        continue_entry_body entry_body, $2
      end
    end

    entries << [entry_name, entry_body] if entry_name

    entries.reject! do |(entry,_)|
      entry == nil
    end

    entries
  end

  ##
  # Converts the ChangeLog into an RDoc::Markup::Document

  def scan
    @time_cache = {}

    entries = parse_entries
    grouped_entries = group_entries entries

    doc = create_document grouped_entries

    @top_level.comment = doc

    @top_level
  end

  module Git
    def parse_info(info)
      /^\s*base-url\s*=\s*(.*\S)/ =~ info
      @base_url = $1
    end

    def parse_entries
      entries = []

      @content.scan(/^commit\s+(\h{20})\h*\n((?:.+\n)*)\n((?: {4}.*\n+)*)/) do
        entry_name, header, entry_body = $1, $2, $3.gsub(/^ {4}/, '')
        # header = header.scan(/^ *(\S+?): +(.*)/).to_h
        # date = header["CommitDate"] || header["Date"]
        date = header[/^ *(?:Author)?Date: +(.*)/, 1]
        author = header[/^ *Author: +(.*)/, 1]
        begin
          time = parse_date(header[/^ *CommitDate: +(.*)/, 1] || date)
          @time_cache[entry_name] = time
          author.sub!(/\s*<(.*)>/, '')
          email = $1
          entries << [entry_name, [author, email, date, entry_body]]
        rescue ArgumentError
        end
      end

      entries
    end

    def create_entries entries
      # git log entries have no strictly itemized style like the old
      # style, just assume Markdown.
      entries.map do |commit, entry|
        LogEntry.new(@base_url, commit, *entry)
      end
    end

    LogEntry = Struct.new(:base, :commit, :author, :email, :date, :contents) do
      HEADING_LEVEL = 3

      def initialize(base, commit, author, email, date, contents)
        case contents
        when String
          contents = RDoc::Markdown.parse(contents).parts.each do |body|
            case body
            when RDoc::Markup::Heading
              body.level += HEADING_LEVEL + 1
            end
          end
          case first = contents[0]
          when RDoc::Markup::Paragraph
            contents[0] = RDoc::Markup::Heading.new(HEADING_LEVEL + 1, first.text)
          end
        end
        super
      end

      def level
        HEADING_LEVEL
      end

      def aref
        "label-#{commit}"
      end

      def label context = nil
        aref
      end

      def text
        case base
        when nil
          "#{date}"
        when /%s/
          "{#{date}}[#{base % commit}]"
        else
          "{#{date}}[#{base}#{commit}]"
        end + " {#{author}}[mailto:#{email}]"
      end

      def accept visitor
        visitor.accept_heading self
        begin
          if visitor.respond_to?(:code_object=)
            code_object = visitor.code_object
            visitor.code_object = self
          end
          contents.each do |body|
            body.accept visitor
          end
        ensure
          if visitor.respond_to?(:code_object)
            visitor.code_object = code_object
          end
        end
      end

      def pretty_print q # :nodoc:
        q.group(2, '[log_entry: ', ']') do
          q.text commit
          q.text ','
          q.breakable
          q.group(2, '[date: ', ']') { q.text date }
          q.text ','
          q.breakable
          q.group(2, '[author: ', ']') { q.text author }
          q.text ','
          q.breakable
          q.group(2, '[email: ', ']') { q.text email }
          q.text ','
          q.breakable
          q.pp contents
        end
      end
    end
  end
end

PK}$[�(�0�0*gems/gems/rdoc-6.4.1.1/lib/rdoc/servlet.rbnu�[���# frozen_string_literal: true
require 'rdoc'
require 'erb'
require 'time'
require 'json'

begin
  require 'webrick'
rescue LoadError
  abort "webrick is not found. You may need to `gem install webrick` to install webrick."
end

##
# This is a WEBrick servlet that allows you to browse ri documentation.
#
# You can show documentation through either `ri --server` or, with RubyGems
# 2.0 or newer, `gem server`.  For ri, the server runs on port 8214 by
# default.  For RubyGems the server runs on port 8808 by default.
#
# You can use this servlet in your own project by mounting it on a WEBrick
# server:
#
#   require 'webrick'
#
#   server = WEBrick::HTTPServer.new Port: 8000
#
#   server.mount '/', RDoc::Servlet
#
# If you want to mount the servlet some other place than the root, provide the
# base path when mounting:
#
#   server.mount '/rdoc', RDoc::Servlet, '/rdoc'

class RDoc::Servlet < WEBrick::HTTPServlet::AbstractServlet

  @server_stores = Hash.new { |hash, server| hash[server] = {} }
  @cache         = Hash.new { |hash, store|  hash[store]  = {} }

  ##
  # Maps an asset type to its path on the filesystem

  attr_reader :asset_dirs

  ##
  # An RDoc::Options instance used for rendering options

  attr_reader :options

  ##
  # Creates an instance of this servlet that shares cached data between
  # requests.

  def self.get_instance server, *options # :nodoc:
    stores = @server_stores[server]

    new server, stores, @cache, *options
  end

  ##
  # Creates a new WEBrick servlet.
  #
  # Use +mount_path+ when mounting the servlet somewhere other than /.
  #
  # Use +extra_doc_dirs+ for additional documentation directories.
  #
  # +server+ is provided automatically by WEBrick when mounting.  +stores+ and
  # +cache+ are provided automatically by the servlet.

  def initialize server, stores, cache, mount_path = nil, extra_doc_dirs = []
    super server

    @cache      = cache
    @mount_path = mount_path
    @extra_doc_dirs = extra_doc_dirs
    @stores     = stores

    @options = RDoc::Options.new
    @options.op_dir = '.'

    darkfish_dir = nil

    # HACK dup
    $LOAD_PATH.each do |path|
      darkfish_dir = File.join path, 'rdoc/generator/template/darkfish/'
      next unless File.directory? darkfish_dir
      @options.template_dir = darkfish_dir
      break
    end

    @asset_dirs = {
      :darkfish   => darkfish_dir,
      :json_index =>
        File.expand_path('../generator/template/json_index/', __FILE__),
    }
  end

  ##
  # Serves the asset at the path in +req+ for +generator_name+ via +res+.

  def asset generator_name, req, res
    asset_dir = @asset_dirs[generator_name]

    asset_path = File.join asset_dir, req.path

    if_modified_since req, res, asset_path

    res.body = File.read asset_path

    res.content_type = case req.path
                       when /\.css\z/ then 'text/css'
                       when /\.js\z/  then 'application/javascript'
                       else                'application/octet-stream'
                       end
  end

  ##
  # GET request entry point.  Fills in +res+ for the path, etc. in +req+.

  def do_GET req, res
    req.path.sub!(/\A#{Regexp.escape @mount_path}/, '') if @mount_path

    case req.path
    when '/' then
      root req, res
    when '/js/darkfish.js', '/js/jquery.js', '/js/search.js',
         %r%^/css/%, %r%^/images/%, %r%^/fonts/% then
      asset :darkfish, req, res
    when '/js/navigation.js', '/js/searcher.js' then
      asset :json_index, req, res
    when '/js/search_index.js' then
      root_search req, res
    else
      show_documentation req, res
    end
  rescue WEBrick::HTTPStatus::NotFound => e
    generator = generator_for RDoc::Store.new

    not_found generator, req, res, e.message
  rescue WEBrick::HTTPStatus::Status
    raise
  rescue => e
    error e, req, res
  end

  ##
  # Fills in +res+ with the class, module or page for +req+ from +store+.
  #
  # +path+ is relative to the mount_path and is used to determine the class,
  # module or page name (/RDoc/Servlet.html becomes RDoc::Servlet).
  # +generator+ is used to create the page.

  def documentation_page store, generator, path, req, res
    text_name = path.chomp '.html'
    name = text_name.gsub '/', '::'

    if klass = store.find_class_or_module(name) then
      res.body = generator.generate_class klass
    elsif page = store.find_text_page(name.sub(/_([^_]*)\z/, '.\1')) then
      res.body = generator.generate_page page
    elsif page = store.find_text_page(text_name.sub(/_([^_]*)\z/, '.\1')) then
      res.body = generator.generate_page page
    else
      not_found generator, req, res
    end
  end

  ##
  # Creates the JSON search index on +res+ for the given +store+.  +generator+
  # must respond to \#json_index to build.  +req+ is ignored.

  def documentation_search store, generator, req, res
    json_index = @cache[store].fetch :json_index do
      @cache[store][:json_index] =
        JSON.dump generator.json_index.build_index
    end

    res.content_type = 'application/javascript'
    res.body = "var search_data = #{json_index}"
  end

  ##
  # Returns the RDoc::Store and path relative to +mount_path+ for
  # documentation at +path+.

  def documentation_source path
    _, source_name, path = path.split '/', 3

    store = @stores[source_name]
    return store, path if store

    store = store_for source_name

    store.load_all

    @stores[source_name] = store

    return store, path
  end

  ##
  # Generates an error page for the +exception+ while handling +req+ on +res+.

  def error exception, req, res
    backtrace = exception.backtrace.join "\n"

    res.content_type = 'text/html'
    res.status = 500
    res.body = <<-BODY
<!DOCTYPE html>
<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">

<title>Error - #{ERB::Util.html_escape exception.class}</title>

<link type="text/css" media="screen" href="#{@mount_path}/css/rdoc.css" rel="stylesheet">
</head>
<body>
<h1>Error</h1>

<p>While processing <code>#{ERB::Util.html_escape req.request_uri}</code> the
RDoc (#{ERB::Util.html_escape RDoc::VERSION}) server has encountered a
<code>#{ERB::Util.html_escape exception.class}</code>
exception:

<pre>#{ERB::Util.html_escape exception.message}</pre>

<p>Please report this to the
<a href="https://github.com/ruby/rdoc/issues">RDoc issues tracker</a>.  Please
include the RDoc version, the URI above and exception class, message and
backtrace.  If you're viewing a gem's documentation, include the gem name and
version.  If you're viewing Ruby's documentation, include the version of ruby.

<p>Backtrace:

<pre>#{ERB::Util.html_escape backtrace}</pre>

</body>
</html>
    BODY
  end

  ##
  # Instantiates a Darkfish generator for +store+

  def generator_for store
    generator = RDoc::Generator::Darkfish.new store, @options
    generator.file_output = false
    generator.asset_rel_path = '..'

    rdoc = RDoc::RDoc.new
    rdoc.store     = store
    rdoc.generator = generator
    rdoc.options   = @options

    @options.main_page = store.main
    @options.title     = store.title

    generator
  end

  ##
  # Handles the If-Modified-Since HTTP header on +req+ for +path+.  If the
  # file has not been modified a Not Modified response is returned.  If the
  # file has been modified a Last-Modified header is added to +res+.

  def if_modified_since req, res, path = nil
    last_modified = File.stat(path).mtime if path

    res['last-modified'] = last_modified.httpdate

    return unless ims = req['if-modified-since']

    ims = Time.parse ims

    unless ims < last_modified then
      res.body = ''
      raise WEBrick::HTTPStatus::NotModified
    end
  end

  ##
  # Returns an Array of installed documentation.
  #
  # Each entry contains the documentation name (gem name, 'Ruby
  # Documentation', etc.), the path relative to the mount point, whether the
  # documentation exists, the type of documentation (See RDoc::RI::Paths#each)
  # and the filesystem to the RDoc::Store for the documentation.

  def installed_docs
    extra_counter = 0
    ri_paths.map do |path, type|
      store = RDoc::Store.new path, type
      exists = File.exist? store.cache_path

      case type
      when :gem then
        gem_path = path[%r%/([^/]*)/ri$%, 1]
        [gem_path, "#{gem_path}/", exists, type, path]
      when :system then
        ['Ruby Documentation', 'ruby/', exists, type, path]
      when :site then
        ['Site Documentation', 'site/', exists, type, path]
      when :home then
        ['Home Documentation', 'home/', exists, type, path]
      when :extra then
        extra_counter += 1
        store.load_cache if exists
        title = store.title || "Extra Documentation"
        [title, "extra-#{extra_counter}/", exists, type, path]
      end
    end
  end

  ##
  # Returns a 404 page built by +generator+ for +req+ on +res+.

  def not_found generator, req, res, message = nil
    message ||= "The page <kbd>#{ERB::Util.h req.path}</kbd> was not found"
    res.body = generator.generate_servlet_not_found message
    res.status = 404
  end

  ##
  # Enumerates the ri paths.  See RDoc::RI::Paths#each

  def ri_paths &block
    RDoc::RI::Paths.each true, true, true, :all, *@extra_doc_dirs, &block #TODO: pass extra_dirs
  end

  ##
  # Generates the root page on +res+.  +req+ is ignored.

  def root req, res
    generator = RDoc::Generator::Darkfish.new nil, @options

    res.body = generator.generate_servlet_root installed_docs

    res.content_type = 'text/html'
  end

  ##
  # Generates a search index for the root page on +res+.  +req+ is ignored.

  def root_search req, res
    search_index = []
    info         = []

    installed_docs.map do |name, href, exists, type, path|
      next unless exists

      search_index << name

      case type
      when :gem
        gemspec = path.gsub(%r%/doc/([^/]*?)/ri$%,
                            '/specifications/\1.gemspec')

        spec = Gem::Specification.load gemspec

        path    = spec.full_name
        comment = spec.summary
      when :system then
        path    = 'ruby'
        comment = 'Documentation for the Ruby standard library'
      when :site then
        path    = 'site'
        comment = 'Documentation for non-gem libraries'
      when :home then
        path    = 'home'
        comment = 'Documentation from your home directory'
      when :extra
        comment = name
      end

      info << [name, '', path, '', comment]
    end

    index = {
      :index => {
        :searchIndex     => search_index,
        :longSearchIndex => search_index,
        :info            => info,
      }
    }

    res.body = "var search_data = #{JSON.dump index};"
    res.content_type = 'application/javascript'
  end

  ##
  # Displays documentation for +req+ on +res+, whether that be HTML or some
  # asset.

  def show_documentation req, res
    store, path = documentation_source req.path

    if_modified_since req, res, store.cache_path

    generator = generator_for store

    case path
    when nil, '', 'index.html' then
      res.body = generator.generate_index
    when 'table_of_contents.html' then
      res.body = generator.generate_table_of_contents
    when 'js/search_index.js' then
      documentation_search store, generator, req, res
    else
      documentation_page store, generator, path, req, res
    end
  ensure
    res.content_type ||= 'text/html'
  end

  ##
  # Returns an RDoc::Store for the given +source_name+ ('ruby' or a gem name).

  def store_for source_name
    case source_name
    when 'home' then
      RDoc::Store.new RDoc::RI::Paths.home_dir, :home
    when 'ruby' then
      RDoc::Store.new RDoc::RI::Paths.system_dir, :system
    when 'site' then
      RDoc::Store.new RDoc::RI::Paths.site_dir, :site
    when /\Aextra-(\d+)\z/ then
      index = $1.to_i - 1
      ri_dir = installed_docs[index][4]
      RDoc::Store.new ri_dir, :extra
    else
      ri_dir, type = ri_paths.find do |dir, dir_type|
        next unless dir_type == :gem

        source_name == dir[%r%/([^/]*)/ri$%, 1]
      end

      raise WEBrick::HTTPStatus::NotFound,
            "Could not find gem \"#{ERB::Util.html_escape(source_name)}\". Are you sure you installed it?" unless ri_dir

      store = RDoc::Store.new ri_dir, type

      return store if File.exist? store.cache_path

      raise WEBrick::HTTPStatus::NotFound,
            "Could not find documentation for \"#{ERB::Util.html_escape(source_name)}\". Please run `gem rdoc --ri gem_name`"

    end
  end

end
PK}$[W�nYY%gems/gems/rdoc-6.4.1.1/lib/rdoc/ri.rbnu�[���# frozen_string_literal: true
require 'rdoc'

##
# Namespace for the ri command line tool's implementation.
#
# See <tt>ri --help</tt> for details.

module RDoc::RI

  ##
  # Base RI error class

  class Error < RDoc::Error; end

  autoload :Driver, 'rdoc/ri/driver'
  autoload :Paths,  'rdoc/ri/paths'
  autoload :Store,  'rdoc/ri/store'

end

PK}$[�h��}�}3gems/gems/rdoc-6.4.1.1/lib/rdoc/rd/inline_parser.rbnu�[���# frozen_string_literal: true
#
# DO NOT MODIFY!!!!
# This file is automatically generated by Racc 1.5.2
# from Racc grammar file "".
#

require 'racc/parser.rb'

require 'strscan'

class RDoc::RD

##
# RD format parser for inline markup such as emphasis, links, footnotes, etc.

class InlineParser < Racc::Parser


# :stopdoc:

EM_OPEN = '((*'
EM_OPEN_RE = /\A#{Regexp.quote(EM_OPEN)}/
EM_CLOSE = '*))'
EM_CLOSE_RE = /\A#{Regexp.quote(EM_CLOSE)}/
CODE_OPEN = '(({'
CODE_OPEN_RE = /\A#{Regexp.quote(CODE_OPEN)}/
CODE_CLOSE = '}))'
CODE_CLOSE_RE = /\A#{Regexp.quote(CODE_CLOSE)}/
VAR_OPEN = '((|'
VAR_OPEN_RE = /\A#{Regexp.quote(VAR_OPEN)}/
VAR_CLOSE = '|))'
VAR_CLOSE_RE = /\A#{Regexp.quote(VAR_CLOSE)}/
KBD_OPEN = '((%'
KBD_OPEN_RE = /\A#{Regexp.quote(KBD_OPEN)}/
KBD_CLOSE = '%))'
KBD_CLOSE_RE = /\A#{Regexp.quote(KBD_CLOSE)}/
INDEX_OPEN = '((:'
INDEX_OPEN_RE = /\A#{Regexp.quote(INDEX_OPEN)}/
INDEX_CLOSE = ':))'
INDEX_CLOSE_RE = /\A#{Regexp.quote(INDEX_CLOSE)}/
REF_OPEN = '((<'
REF_OPEN_RE = /\A#{Regexp.quote(REF_OPEN)}/
REF_CLOSE = '>))'
REF_CLOSE_RE = /\A#{Regexp.quote(REF_CLOSE)}/
FOOTNOTE_OPEN = '((-'
FOOTNOTE_OPEN_RE = /\A#{Regexp.quote(FOOTNOTE_OPEN)}/
FOOTNOTE_CLOSE = '-))'
FOOTNOTE_CLOSE_RE = /\A#{Regexp.quote(FOOTNOTE_CLOSE)}/
VERB_OPEN = "(('"
VERB_OPEN_RE = /\A#{Regexp.quote(VERB_OPEN)}/
VERB_CLOSE = "'))"
VERB_CLOSE_RE = /\A#{Regexp.quote(VERB_CLOSE)}/

BAR = "|"
BAR_RE = /\A#{Regexp.quote(BAR)}/
QUOTE = '"'
QUOTE_RE = /\A#{Regexp.quote(QUOTE)}/
SLASH = "/"
SLASH_RE = /\A#{Regexp.quote(SLASH)}/
BACK_SLASH = "\\"
BACK_SLASH_RE = /\A#{Regexp.quote(BACK_SLASH)}/
URL = "URL:"
URL_RE = /\A#{Regexp.quote(URL)}/

other_re_mode = Regexp::EXTENDED
other_re_mode |= Regexp::MULTILINE

OTHER_RE = Regexp.new(
  "\\A.+?(?=#{Regexp.quote(EM_OPEN)}|#{Regexp.quote(EM_CLOSE)}|
              #{Regexp.quote(CODE_OPEN)}|#{Regexp.quote(CODE_CLOSE)}|
              #{Regexp.quote(VAR_OPEN)}|#{Regexp.quote(VAR_CLOSE)}|
              #{Regexp.quote(KBD_OPEN)}|#{Regexp.quote(KBD_CLOSE)}|
              #{Regexp.quote(INDEX_OPEN)}|#{Regexp.quote(INDEX_CLOSE)}|
              #{Regexp.quote(REF_OPEN)}|#{Regexp.quote(REF_CLOSE)}|
            #{Regexp.quote(FOOTNOTE_OPEN)}|#{Regexp.quote(FOOTNOTE_CLOSE)}|
              #{Regexp.quote(VERB_OPEN)}|#{Regexp.quote(VERB_CLOSE)}|
              #{Regexp.quote(BAR)}|
              #{Regexp.quote(QUOTE)}|
              #{Regexp.quote(SLASH)}|
              #{Regexp.quote(BACK_SLASH)}|
              #{Regexp.quote(URL)})", other_re_mode)

# :startdoc:

##
# Creates a new parser for inline markup in the rd format.  The +block_parser+
# is used to for footnotes and labels in the inline text.

def initialize block_parser
  @block_parser = block_parser
end

##
# Parses the +inline+ text from RD format into RDoc format.

def parse inline
  @inline = inline
  @src = StringScanner.new inline
  @pre = "".dup
  @yydebug = true
  do_parse.to_s
end

##
# Returns the next token from the inline text

def next_token
  return [false, false] if @src.eos?
#  p @src.rest if @yydebug
  if ret = @src.scan(EM_OPEN_RE)
    @pre << ret
    [:EM_OPEN, ret]
  elsif ret = @src.scan(EM_CLOSE_RE)
    @pre << ret
    [:EM_CLOSE, ret]
  elsif ret = @src.scan(CODE_OPEN_RE)
    @pre << ret
    [:CODE_OPEN, ret]
  elsif ret = @src.scan(CODE_CLOSE_RE)
    @pre << ret
    [:CODE_CLOSE, ret]
  elsif ret = @src.scan(VAR_OPEN_RE)
    @pre << ret
    [:VAR_OPEN, ret]
  elsif ret = @src.scan(VAR_CLOSE_RE)
    @pre << ret
    [:VAR_CLOSE, ret]
  elsif ret = @src.scan(KBD_OPEN_RE)
    @pre << ret
    [:KBD_OPEN, ret]
  elsif ret = @src.scan(KBD_CLOSE_RE)
    @pre << ret
    [:KBD_CLOSE, ret]
  elsif ret = @src.scan(INDEX_OPEN_RE)
    @pre << ret
    [:INDEX_OPEN, ret]
  elsif ret = @src.scan(INDEX_CLOSE_RE)
    @pre << ret
    [:INDEX_CLOSE, ret]
  elsif ret = @src.scan(REF_OPEN_RE)
    @pre << ret
    [:REF_OPEN, ret]
  elsif ret = @src.scan(REF_CLOSE_RE)
    @pre << ret
    [:REF_CLOSE, ret]
  elsif ret = @src.scan(FOOTNOTE_OPEN_RE)
    @pre << ret
    [:FOOTNOTE_OPEN, ret]
  elsif ret = @src.scan(FOOTNOTE_CLOSE_RE)
    @pre << ret
    [:FOOTNOTE_CLOSE, ret]
  elsif ret = @src.scan(VERB_OPEN_RE)
    @pre << ret
    [:VERB_OPEN, ret]
  elsif ret = @src.scan(VERB_CLOSE_RE)
    @pre << ret
    [:VERB_CLOSE, ret]
  elsif ret = @src.scan(BAR_RE)
    @pre << ret
    [:BAR, ret]
  elsif ret = @src.scan(QUOTE_RE)
    @pre << ret
    [:QUOTE, ret]
  elsif ret = @src.scan(SLASH_RE)
    @pre << ret
    [:SLASH, ret]
  elsif ret = @src.scan(BACK_SLASH_RE)
    @pre << ret
    [:BACK_SLASH, ret]
  elsif ret = @src.scan(URL_RE)
    @pre << ret
    [:URL, ret]
  elsif ret = @src.scan(OTHER_RE)
    @pre << ret
    [:OTHER, ret]
  else
    ret = @src.rest
    @pre << ret
    @src.terminate
    [:OTHER, ret]
  end
end

##
# Raises a ParseError when invalid formatting is found

def on_error(et, ev, values)
  lines_of_rest = @src.rest.lines.to_a.length
  prev_words = prev_words_on_error(ev)
  at = 4 + prev_words.length

  message = <<-MSG
RD syntax error: line #{@block_parser.line_index - lines_of_rest}:
...#{prev_words} #{(ev||'')} #{next_words_on_error()} ...
  MSG

  message << " " * at + "^" * (ev ? ev.length : 0) + "\n"
  raise ParseError, message
end

##
# Returns words before the error

def prev_words_on_error(ev)
  pre = @pre
  if ev and /#{Regexp.quote(ev)}$/ =~ pre
    pre = $`
  end
  last_line(pre)
end

##
# Returns the last line of +src+

def last_line(src)
  if n = src.rindex("\n")
    src[(n+1) .. -1]
  else
    src
  end
end
private :last_line

##
# Returns words following an error

def next_words_on_error
  if n = @src.rest.index("\n")
    @src.rest[0 .. (n-1)]
  else
    @src.rest
  end
end

##
# Creates a new RDoc::RD::Inline for the +rdoc+ markup and the raw +reference+

def inline rdoc, reference = rdoc
  RDoc::RD::Inline.new rdoc, reference
end

# :stopdoc:
##### State transition tables begin ###

racc_action_table = [
   104,   103,   102,   100,   101,    99,   115,   116,   117,    29,
   105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
    84,   118,   119,    63,    64,    65,    61,    81,    62,    76,
    78,    79,    85,    66,    67,    68,    69,    70,    71,    72,
    73,    74,    75,    77,    80,   149,    63,    64,    65,   153,
    81,    62,    76,    78,    79,    86,    66,    67,    68,    69,
    70,    71,    72,    73,    74,    75,    77,    80,   152,   104,
   103,   102,   100,   101,    99,   115,   116,   117,    87,   105,
   106,   107,   108,   109,   110,   111,   112,   113,   114,    88,
   118,   119,   104,   103,   102,   100,   101,    99,   115,   116,
   117,    89,   105,   106,   107,   108,   109,   110,   111,   112,
   113,   114,    96,   118,   119,   104,   103,   102,   100,   101,
    99,   115,   116,   117,   124,   105,   106,   107,   108,   109,
   110,   111,   112,   113,   114,   137,   118,   119,    22,    23,
    24,    25,    26,    21,    18,    19,   176,   177,    13,   148,
    14,   154,    15,   137,    16,   161,    17,   164,   173,    20,
    22,    23,    24,    25,    26,    21,    18,    19,   175,   177,
    13,   nil,    14,   nil,    15,   nil,    16,   nil,    17,   nil,
   nil,    20,    22,    23,    24,    25,    26,    21,    18,    19,
   nil,   nil,    13,   nil,    14,   nil,    15,   nil,    16,   nil,
    17,   nil,   nil,    20,    22,    23,    24,    25,    26,    21,
    18,    19,   nil,   nil,    13,   nil,    14,   nil,    15,   nil,
    16,   nil,    17,   nil,   nil,    20,    22,    23,    24,    25,
    26,    21,    18,    19,   nil,   nil,    13,   nil,    14,   nil,
    15,   nil,    16,   nil,    17,   nil,   nil,    20,    22,    23,
    24,    25,    26,    21,    18,    19,   nil,   nil,    13,   nil,
    14,   nil,    15,   nil,    16,   nil,    17,   nil,   nil,    20,
    22,    23,    24,    25,    26,    21,    18,    19,   nil,   nil,
    13,   nil,    14,   nil,    15,   nil,    16,   nil,    17,    42,
   nil,    20,    54,    38,    53,    55,    56,    57,   nil,    13,
   nil,    14,   nil,    15,   nil,    16,   nil,    17,   nil,   nil,
    20,    22,    23,    24,    25,    26,    21,    18,    19,   nil,
   nil,    13,   nil,    14,   nil,    15,   nil,    16,   nil,    17,
   nil,   nil,    20,    63,    64,    65,    61,    81,    62,    76,
    78,    79,   nil,    66,    67,    68,    69,    70,    71,    72,
    73,    74,    75,    77,    80,   122,   nil,   nil,    54,   nil,
    53,    55,    56,    57,   nil,    13,   nil,    14,   nil,    15,
   nil,    16,   nil,    17,   145,   nil,    20,    54,   133,    53,
    55,    56,    57,   nil,    13,   nil,    14,   nil,    15,   nil,
    16,   nil,    17,   145,   nil,    20,    54,   133,    53,    55,
    56,    57,   nil,    13,   nil,    14,   nil,    15,   nil,    16,
   nil,    17,   145,   nil,    20,    54,   133,    53,    55,    56,
    57,   nil,    13,   nil,    14,   nil,    15,   nil,    16,   nil,
    17,   145,   nil,    20,    54,   133,    53,    55,    56,    57,
   nil,    13,   nil,    14,   nil,    15,   nil,    16,   nil,    17,
   nil,   nil,    20,   135,   136,    54,   133,    53,    55,    56,
    57,   nil,    13,   nil,    14,   nil,    15,   nil,    16,   nil,
    17,   nil,   nil,    20,   135,   136,    54,   133,    53,    55,
    56,    57,   nil,    13,   nil,    14,   nil,    15,   nil,    16,
   nil,    17,   nil,   nil,    20,   135,   136,    54,   133,    53,
    55,    56,    57,   nil,    13,   nil,    14,   nil,    15,   nil,
    16,   nil,    17,    95,   nil,    20,    54,    91,    53,    55,
    56,    57,   145,   nil,   nil,    54,   133,    53,    55,    56,
    57,   158,   nil,   nil,    54,   nil,    53,    55,    56,    57,
   165,   135,   136,    54,   133,    53,    55,    56,    57,   145,
   nil,   nil,    54,   133,    53,    55,    56,    57,   172,   135,
   136,    54,   133,    53,    55,    56,    57,   174,   135,   136,
    54,   133,    53,    55,    56,    57,   178,   135,   136,    54,
   133,    53,    55,    56,    57,   135,   136,    54,   133,    53,
    55,    56,    57,   135,   136,    54,   133,    53,    55,    56,
    57,   135,   136,    54,   133,    53,    55,    56,    57,    22,
    23,    24,    25,    26,    21 ]

racc_action_check = [
    38,    38,    38,    38,    38,    38,    38,    38,    38,     1,
    38,    38,    38,    38,    38,    38,    38,    38,    38,    38,
    29,    38,    38,    59,    59,    59,    59,    59,    59,    59,
    59,    59,    31,    59,    59,    59,    59,    59,    59,    59,
    59,    59,    59,    59,    59,    59,    61,    61,    61,    61,
    61,    61,    61,    61,    61,    32,    61,    61,    61,    61,
    61,    61,    61,    61,    61,    61,    61,    61,    61,    91,
    91,    91,    91,    91,    91,    91,    91,    91,    33,    91,
    91,    91,    91,    91,    91,    91,    91,    91,    91,    34,
    91,    91,    97,    97,    97,    97,    97,    97,    97,    97,
    97,    35,    97,    97,    97,    97,    97,    97,    97,    97,
    97,    97,    37,    97,    97,   155,   155,   155,   155,   155,
   155,   155,   155,   155,    41,   155,   155,   155,   155,   155,
   155,   155,   155,   155,   155,    43,   155,   155,     0,     0,
     0,     0,     0,     0,     0,     0,   165,   165,     0,    58,
     0,    90,     0,    94,     0,   100,     0,   125,   162,     0,
     2,     2,     2,     2,     2,     2,     2,     2,   164,   172,
     2,   nil,     2,   nil,     2,   nil,     2,   nil,     2,   nil,
   nil,     2,    13,    13,    13,    13,    13,    13,    13,    13,
   nil,   nil,    13,   nil,    13,   nil,    13,   nil,    13,   nil,
    13,   nil,   nil,    13,    14,    14,    14,    14,    14,    14,
    14,    14,   nil,   nil,    14,   nil,    14,   nil,    14,   nil,
    14,   nil,    14,   nil,   nil,    14,    15,    15,    15,    15,
    15,    15,    15,    15,   nil,   nil,    15,   nil,    15,   nil,
    15,   nil,    15,   nil,    15,   nil,   nil,    15,    16,    16,
    16,    16,    16,    16,    16,    16,   nil,   nil,    16,   nil,
    16,   nil,    16,   nil,    16,   nil,    16,   nil,   nil,    16,
    17,    17,    17,    17,    17,    17,    17,    17,   nil,   nil,
    17,   nil,    17,   nil,    17,   nil,    17,   nil,    17,    18,
   nil,    17,    18,    18,    18,    18,    18,    18,   nil,    18,
   nil,    18,   nil,    18,   nil,    18,   nil,    18,   nil,   nil,
    18,    19,    19,    19,    19,    19,    19,    19,    19,   nil,
   nil,    19,   nil,    19,   nil,    19,   nil,    19,   nil,    19,
   nil,   nil,    19,    20,    20,    20,    20,    20,    20,    20,
    20,    20,   nil,    20,    20,    20,    20,    20,    20,    20,
    20,    20,    20,    20,    20,    39,   nil,   nil,    39,   nil,
    39,    39,    39,    39,   nil,    39,   nil,    39,   nil,    39,
   nil,    39,   nil,    39,    44,   nil,    39,    44,    44,    44,
    44,    44,    44,   nil,    44,   nil,    44,   nil,    44,   nil,
    44,   nil,    44,    45,   nil,    44,    45,    45,    45,    45,
    45,    45,   nil,    45,   nil,    45,   nil,    45,   nil,    45,
   nil,    45,   138,   nil,    45,   138,   138,   138,   138,   138,
   138,   nil,   138,   nil,   138,   nil,   138,   nil,   138,   nil,
   138,   146,   nil,   138,   146,   146,   146,   146,   146,   146,
   nil,   146,   nil,   146,   nil,   146,   nil,   146,   nil,   146,
   nil,   nil,   146,    42,    42,    42,    42,    42,    42,    42,
    42,   nil,    42,   nil,    42,   nil,    42,   nil,    42,   nil,
    42,   nil,   nil,    42,   122,   122,   122,   122,   122,   122,
   122,   122,   nil,   122,   nil,   122,   nil,   122,   nil,   122,
   nil,   122,   nil,   nil,   122,   127,   127,   127,   127,   127,
   127,   127,   127,   nil,   127,   nil,   127,   nil,   127,   nil,
   127,   nil,   127,    36,   nil,   127,    36,    36,    36,    36,
    36,    36,    52,   nil,   nil,    52,    52,    52,    52,    52,
    52,    92,   nil,   nil,    92,   nil,    92,    92,    92,    92,
   126,   126,   126,   126,   126,   126,   126,   126,   126,   142,
   nil,   nil,   142,   142,   142,   142,   142,   142,   159,   159,
   159,   159,   159,   159,   159,   159,   159,   163,   163,   163,
   163,   163,   163,   163,   163,   163,   171,   171,   171,   171,
   171,   171,   171,   171,   171,    95,    95,    95,    95,    95,
    95,    95,    95,   158,   158,   158,   158,   158,   158,   158,
   158,   168,   168,   168,   168,   168,   168,   168,   168,    27,
    27,    27,    27,    27,    27 ]

racc_action_pointer = [
   135,     9,   157,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
   nil,   nil,   nil,   179,   201,   223,   245,   267,   286,   308,
   330,   nil,   nil,   nil,   nil,   nil,   nil,   606,   nil,    20,
   nil,    18,    39,    60,    69,    79,   510,    89,    -3,   352,
   nil,   120,   449,   130,   371,   390,   nil,   nil,   nil,   nil,
   nil,   nil,   519,   nil,   nil,   nil,   nil,   nil,   138,    20,
   nil,    43,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
   128,    66,   528,   nil,   148,   581,   nil,    89,   nil,   nil,
   149,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
   nil,   nil,   470,   nil,   nil,   154,   537,   491,   nil,   nil,
   nil,   nil,   nil,   nil,   nil,   nil,   nil,   nil,   409,   nil,
   nil,   nil,   546,   nil,   nil,   nil,   428,   nil,   nil,   nil,
   nil,   nil,   nil,   nil,   nil,   112,   nil,   nil,   589,   555,
   nil,   nil,   155,   564,   164,   142,   nil,   nil,   597,   nil,
   nil,   573,   164,   nil,   nil,   nil,   nil,   nil,   nil ]

racc_action_default = [
  -138,  -138,    -1,    -3,    -4,    -5,    -6,    -7,    -8,    -9,
   -10,   -11,   -12,  -138,  -138,  -138,  -138,  -138,  -138,  -138,
  -138,  -103,  -104,  -105,  -106,  -107,  -108,  -111,  -110,  -138,
    -2,  -138,  -138,  -138,  -138,  -138,  -138,  -138,  -138,   -27,
   -26,   -35,  -138,   -58,   -41,   -40,   -47,   -48,   -49,   -50,
   -51,   -52,   -63,   -66,   -67,   -68,   -69,   -70,  -138,  -138,
  -112,  -138,  -116,  -117,  -118,  -119,  -120,  -121,  -122,  -123,
  -124,  -125,  -126,  -127,  -128,  -129,  -130,  -131,  -132,  -133,
  -134,  -135,  -137,  -109,   179,   -13,   -14,   -15,   -16,   -17,
  -138,  -138,   -23,   -22,   -33,  -138,   -19,   -24,   -79,   -80,
  -138,   -82,   -83,   -84,   -85,   -86,   -87,   -88,   -89,   -90,
   -91,   -92,   -93,   -94,   -95,   -96,   -97,   -98,   -99,  -100,
   -25,   -35,  -138,   -58,   -28,  -138,   -59,   -42,   -46,   -55,
   -56,   -65,   -71,   -72,   -75,   -76,   -77,   -31,   -38,   -44,
   -53,   -54,   -57,   -61,   -73,   -74,   -39,   -62,  -101,  -102,
  -136,  -113,  -114,  -115,   -18,   -20,   -21,   -33,  -138,  -138,
   -78,   -81,  -138,   -59,   -36,   -37,   -64,   -45,   -59,   -43,
   -60,  -138,   -34,   -36,   -37,   -29,   -30,   -32,   -34 ]

racc_goto_table = [
   126,    44,   125,    43,   144,   144,   160,    93,    97,    52,
   166,    82,   144,    40,    41,    39,   138,   146,   169,    30,
    36,    94,    44,     1,   123,   129,   169,    52,    90,    37,
    52,   167,   147,    92,   120,   121,    31,    32,    33,    34,
    35,   170,    58,   166,    59,    83,   170,   166,   151,   nil,
   150,   nil,   166,   159,     4,   166,     4,   nil,   nil,   nil,
   nil,   155,   nil,   156,   160,   nil,   nil,     4,     4,     4,
     4,     4,   nil,     4,     5,   nil,     5,   157,   nil,   nil,
   163,   nil,   162,    52,   nil,   168,   nil,     5,     5,     5,
     5,     5,   nil,     5,   nil,   nil,   nil,   nil,   144,   nil,
   nil,   nil,   144,   nil,   nil,   129,   144,   144,   nil,     6,
   129,     6,   nil,   nil,   nil,   nil,   171,     7,   nil,     7,
   nil,   nil,     6,     6,     6,     6,     6,     8,     6,     8,
     7,     7,     7,     7,     7,    11,     7,    11,   nil,   nil,
     8,     8,     8,     8,     8,   nil,     8,   nil,    11,    11,
    11,    11,    11,   nil,    11 ]

racc_goto_check = [
    22,    24,    21,    23,    36,    36,    37,    18,    16,    34,
    35,    41,    36,    19,    20,    17,    25,    25,    28,     3,
    13,    23,    24,     1,    23,    24,    28,    34,    14,    15,
    34,    29,    32,    17,    19,    20,     1,     1,     1,     1,
     1,    33,     1,    35,    38,    39,    33,    35,    42,   nil,
    41,   nil,    35,    22,     4,    35,     4,   nil,   nil,   nil,
   nil,    16,   nil,    18,    37,   nil,   nil,     4,     4,     4,
     4,     4,   nil,     4,     5,   nil,     5,    23,   nil,   nil,
    22,   nil,    21,    34,   nil,    22,   nil,     5,     5,     5,
     5,     5,   nil,     5,   nil,   nil,   nil,   nil,    36,   nil,
   nil,   nil,    36,   nil,   nil,    24,    36,    36,   nil,     6,
    24,     6,   nil,   nil,   nil,   nil,    22,     7,   nil,     7,
   nil,   nil,     6,     6,     6,     6,     6,     8,     6,     8,
     7,     7,     7,     7,     7,    11,     7,    11,   nil,   nil,
     8,     8,     8,     8,     8,   nil,     8,   nil,    11,    11,
    11,    11,    11,   nil,    11 ]

racc_goto_pointer = [
   nil,    23,   nil,    17,    54,    74,   109,   117,   127,   nil,
   nil,   135,   nil,     2,    -8,    11,   -30,    -3,   -29,    -5,
    -4,   -40,   -42,   -15,   -17,   -28,   nil,   nil,  -120,   -96,
   nil,   nil,   -20,  -101,    -9,  -116,   -40,   -91,    24,    18,
   nil,    -9,   -13 ]

racc_goto_default = [
   nil,   nil,     2,     3,    46,    47,    48,    49,    50,     9,
    10,    51,    12,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
   nil,   nil,   nil,   nil,   140,   nil,    45,   127,   139,   128,
   141,   130,   142,   143,   132,   131,   134,    98,   nil,    28,
    27,   nil,    60 ]

racc_reduce_table = [
  0, 0, :racc_error,
  1, 27, :_reduce_none,
  2, 28, :_reduce_2,
  1, 28, :_reduce_3,
  1, 29, :_reduce_none,
  1, 29, :_reduce_none,
  1, 29, :_reduce_none,
  1, 29, :_reduce_none,
  1, 29, :_reduce_none,
  1, 29, :_reduce_none,
  1, 29, :_reduce_none,
  1, 29, :_reduce_none,
  1, 29, :_reduce_none,
  3, 30, :_reduce_13,
  3, 31, :_reduce_14,
  3, 32, :_reduce_15,
  3, 33, :_reduce_16,
  3, 34, :_reduce_17,
  4, 35, :_reduce_18,
  3, 35, :_reduce_19,
  2, 40, :_reduce_20,
  2, 40, :_reduce_21,
  1, 40, :_reduce_22,
  1, 40, :_reduce_23,
  2, 41, :_reduce_24,
  2, 41, :_reduce_25,
  1, 41, :_reduce_26,
  1, 41, :_reduce_27,
  2, 39, :_reduce_none,
  4, 39, :_reduce_29,
  4, 39, :_reduce_30,
  2, 43, :_reduce_31,
  4, 43, :_reduce_32,
  1, 44, :_reduce_33,
  3, 44, :_reduce_34,
  1, 45, :_reduce_none,
  3, 45, :_reduce_36,
  3, 45, :_reduce_37,
  2, 46, :_reduce_38,
  2, 46, :_reduce_39,
  1, 46, :_reduce_40,
  1, 46, :_reduce_41,
  1, 47, :_reduce_none,
  2, 51, :_reduce_43,
  1, 51, :_reduce_44,
  2, 53, :_reduce_45,
  1, 53, :_reduce_46,
  1, 50, :_reduce_none,
  1, 50, :_reduce_none,
  1, 50, :_reduce_none,
  1, 50, :_reduce_none,
  1, 50, :_reduce_none,
  1, 50, :_reduce_none,
  1, 54, :_reduce_none,
  1, 54, :_reduce_none,
  1, 55, :_reduce_none,
  1, 55, :_reduce_none,
  1, 56, :_reduce_57,
  1, 52, :_reduce_58,
  1, 57, :_reduce_59,
  2, 58, :_reduce_60,
  1, 58, :_reduce_none,
  2, 49, :_reduce_62,
  1, 49, :_reduce_none,
  2, 48, :_reduce_64,
  1, 48, :_reduce_none,
  1, 60, :_reduce_none,
  1, 60, :_reduce_none,
  1, 60, :_reduce_none,
  1, 60, :_reduce_none,
  1, 60, :_reduce_none,
  1, 62, :_reduce_none,
  1, 62, :_reduce_none,
  1, 59, :_reduce_none,
  1, 59, :_reduce_none,
  1, 61, :_reduce_none,
  1, 61, :_reduce_none,
  1, 61, :_reduce_none,
  2, 42, :_reduce_78,
  1, 42, :_reduce_none,
  1, 63, :_reduce_none,
  2, 63, :_reduce_none,
  1, 63, :_reduce_none,
  1, 63, :_reduce_none,
  1, 63, :_reduce_none,
  1, 63, :_reduce_none,
  1, 63, :_reduce_none,
  1, 63, :_reduce_none,
  1, 63, :_reduce_none,
  1, 63, :_reduce_none,
  1, 63, :_reduce_none,
  1, 63, :_reduce_none,
  1, 63, :_reduce_none,
  1, 63, :_reduce_none,
  1, 63, :_reduce_none,
  1, 63, :_reduce_none,
  1, 63, :_reduce_none,
  1, 63, :_reduce_none,
  1, 63, :_reduce_none,
  1, 63, :_reduce_none,
  1, 63, :_reduce_none,
  3, 36, :_reduce_101,
  3, 37, :_reduce_102,
  1, 65, :_reduce_none,
  1, 65, :_reduce_none,
  1, 65, :_reduce_none,
  1, 65, :_reduce_none,
  1, 65, :_reduce_none,
  1, 65, :_reduce_none,
  2, 66, :_reduce_109,
  1, 66, :_reduce_none,
  1, 38, :_reduce_111,
  1, 67, :_reduce_none,
  2, 67, :_reduce_113,
  2, 67, :_reduce_114,
  2, 67, :_reduce_115,
  1, 68, :_reduce_none,
  1, 68, :_reduce_none,
  1, 68, :_reduce_none,
  1, 68, :_reduce_none,
  1, 68, :_reduce_none,
  1, 68, :_reduce_none,
  1, 68, :_reduce_none,
  1, 68, :_reduce_none,
  1, 68, :_reduce_none,
  1, 68, :_reduce_none,
  1, 68, :_reduce_none,
  1, 68, :_reduce_none,
  1, 68, :_reduce_none,
  1, 68, :_reduce_none,
  1, 68, :_reduce_none,
  1, 68, :_reduce_none,
  1, 68, :_reduce_none,
  1, 68, :_reduce_none,
  1, 68, :_reduce_none,
  1, 68, :_reduce_none,
  2, 64, :_reduce_136,
  1, 64, :_reduce_none ]

racc_reduce_n = 138

racc_shift_n = 179

racc_token_table = {
  false => 0,
  :error => 1,
  :EX_LOW => 2,
  :QUOTE => 3,
  :BAR => 4,
  :SLASH => 5,
  :BACK_SLASH => 6,
  :URL => 7,
  :OTHER => 8,
  :REF_OPEN => 9,
  :FOOTNOTE_OPEN => 10,
  :FOOTNOTE_CLOSE => 11,
  :EX_HIGH => 12,
  :EM_OPEN => 13,
  :EM_CLOSE => 14,
  :CODE_OPEN => 15,
  :CODE_CLOSE => 16,
  :VAR_OPEN => 17,
  :VAR_CLOSE => 18,
  :KBD_OPEN => 19,
  :KBD_CLOSE => 20,
  :INDEX_OPEN => 21,
  :INDEX_CLOSE => 22,
  :REF_CLOSE => 23,
  :VERB_OPEN => 24,
  :VERB_CLOSE => 25 }

racc_nt_base = 26

racc_use_result_var = true

Racc_arg = [
  racc_action_table,
  racc_action_check,
  racc_action_default,
  racc_action_pointer,
  racc_goto_table,
  racc_goto_check,
  racc_goto_default,
  racc_goto_pointer,
  racc_nt_base,
  racc_reduce_table,
  racc_token_table,
  racc_shift_n,
  racc_reduce_n,
  racc_use_result_var ]

Racc_token_to_s_table = [
  "$end",
  "error",
  "EX_LOW",
  "QUOTE",
  "BAR",
  "SLASH",
  "BACK_SLASH",
  "URL",
  "OTHER",
  "REF_OPEN",
  "FOOTNOTE_OPEN",
  "FOOTNOTE_CLOSE",
  "EX_HIGH",
  "EM_OPEN",
  "EM_CLOSE",
  "CODE_OPEN",
  "CODE_CLOSE",
  "VAR_OPEN",
  "VAR_CLOSE",
  "KBD_OPEN",
  "KBD_CLOSE",
  "INDEX_OPEN",
  "INDEX_CLOSE",
  "REF_CLOSE",
  "VERB_OPEN",
  "VERB_CLOSE",
  "$start",
  "content",
  "elements",
  "element",
  "emphasis",
  "code",
  "var",
  "keyboard",
  "index",
  "reference",
  "footnote",
  "verb",
  "normal_str_ele",
  "substitute",
  "ref_label",
  "ref_label2",
  "ref_url_strings",
  "filename",
  "element_label",
  "element_label2",
  "ref_subst_content",
  "ref_subst_content_q",
  "ref_subst_strings_q",
  "ref_subst_strings_first",
  "ref_subst_ele2",
  "ref_subst_eles",
  "ref_subst_str_ele_first",
  "ref_subst_eles_q",
  "ref_subst_ele",
  "ref_subst_ele_q",
  "ref_subst_str_ele",
  "ref_subst_str_ele_q",
  "ref_subst_strings",
  "ref_subst_string3",
  "ref_subst_string",
  "ref_subst_string_q",
  "ref_subst_string2",
  "ref_url_string",
  "verb_strings",
  "normal_string",
  "normal_strings",
  "verb_string",
  "verb_normal_string" ]

Racc_debug_parser = false

##### State transition tables end #####

# reduce 0 omitted

# reduce 1 omitted

def _reduce_2(val, _values, result)
 result.append val[1]
    result
end

def _reduce_3(val, _values, result)
 result = val[0]
    result
end

# reduce 4 omitted

# reduce 5 omitted

# reduce 6 omitted

# reduce 7 omitted

# reduce 8 omitted

# reduce 9 omitted

# reduce 10 omitted

# reduce 11 omitted

# reduce 12 omitted

def _reduce_13(val, _values, result)
      content = val[1]
      result = inline "<em>#{content}</em>", content

    result
end

def _reduce_14(val, _values, result)
      content = val[1]
      result = inline "<code>#{content}</code>", content

    result
end

def _reduce_15(val, _values, result)
      content = val[1]
      result = inline "+#{content}+", content

    result
end

def _reduce_16(val, _values, result)
      content = val[1]
      result = inline "<tt>#{content}</tt>", content

    result
end

def _reduce_17(val, _values, result)
      label = val[1]
      @block_parser.add_label label.reference
      result = "<span id=\"label-#{label}\">#{label}</span>"

    result
end

def _reduce_18(val, _values, result)
      result = "{#{val[1]}}[#{val[2].join}]"

    result
end

def _reduce_19(val, _values, result)
      scheme, inline = val[1]

      result = "{#{inline}}[#{scheme}#{inline.reference}]"

    result
end

def _reduce_20(val, _values, result)
      result = [nil, inline(val[1])]

    result
end

def _reduce_21(val, _values, result)
      result = [
        'rdoc-label:',
        inline("#{val[0].reference}/#{val[1].reference}")
      ]

    result
end

def _reduce_22(val, _values, result)
      result = ['rdoc-label:', val[0].reference]

    result
end

def _reduce_23(val, _values, result)
      result = ['rdoc-label:', "#{val[0].reference}/"]

    result
end

def _reduce_24(val, _values, result)
      result = [nil, inline(val[1])]

    result
end

def _reduce_25(val, _values, result)
      result = [
        'rdoc-label:',
        inline("#{val[0].reference}/#{val[1].reference}")
      ]

    result
end

def _reduce_26(val, _values, result)
      result = ['rdoc-label:', val[0]]

    result
end

def _reduce_27(val, _values, result)
      ref = val[0].reference
      result = ['rdoc-label:', inline(ref, "#{ref}/")]

    result
end

# reduce 28 omitted

def _reduce_29(val, _values, result)
 result = val[1]
    result
end

def _reduce_30(val, _values, result)
 result = val[1]
    result
end

def _reduce_31(val, _values, result)
      result = inline val[0]

    result
end

def _reduce_32(val, _values, result)
      result = inline "\"#{val[1]}\""

    result
end

def _reduce_33(val, _values, result)
      result = inline val[0]

    result
end

def _reduce_34(val, _values, result)
      result = inline "\"#{val[1]}\""

    result
end

# reduce 35 omitted

def _reduce_36(val, _values, result)
 result = val[1]
    result
end

def _reduce_37(val, _values, result)
 result = inline val[1]
    result
end

def _reduce_38(val, _values, result)
      result = val[0].append val[1]

    result
end

def _reduce_39(val, _values, result)
      result = val[0].append val[1]

    result
end

def _reduce_40(val, _values, result)
      result = val[0]

    result
end

def _reduce_41(val, _values, result)
      result = inline val[0]

    result
end

# reduce 42 omitted

def _reduce_43(val, _values, result)
      result = val[0].append val[1]

    result
end

def _reduce_44(val, _values, result)
      result = inline val[0]

    result
end

def _reduce_45(val, _values, result)
      result = val[0].append val[1]

    result
end

def _reduce_46(val, _values, result)
      result = val[0]

    result
end

# reduce 47 omitted

# reduce 48 omitted

# reduce 49 omitted

# reduce 50 omitted

# reduce 51 omitted

# reduce 52 omitted

# reduce 53 omitted

# reduce 54 omitted

# reduce 55 omitted

# reduce 56 omitted

def _reduce_57(val, _values, result)
      result = val[0]

    result
end

def _reduce_58(val, _values, result)
      result = inline val[0]

    result
end

def _reduce_59(val, _values, result)
      result = inline val[0]

    result
end

def _reduce_60(val, _values, result)
 result << val[1]
    result
end

# reduce 61 omitted

def _reduce_62(val, _values, result)
      result << val[1]

    result
end

# reduce 63 omitted

def _reduce_64(val, _values, result)
      result << val[1]

    result
end

# reduce 65 omitted

# reduce 66 omitted

# reduce 67 omitted

# reduce 68 omitted

# reduce 69 omitted

# reduce 70 omitted

# reduce 71 omitted

# reduce 72 omitted

# reduce 73 omitted

# reduce 74 omitted

# reduce 75 omitted

# reduce 76 omitted

# reduce 77 omitted

def _reduce_78(val, _values, result)
 result << val[1]
    result
end

# reduce 79 omitted

# reduce 80 omitted

# reduce 81 omitted

# reduce 82 omitted

# reduce 83 omitted

# reduce 84 omitted

# reduce 85 omitted

# reduce 86 omitted

# reduce 87 omitted

# reduce 88 omitted

# reduce 89 omitted

# reduce 90 omitted

# reduce 91 omitted

# reduce 92 omitted

# reduce 93 omitted

# reduce 94 omitted

# reduce 95 omitted

# reduce 96 omitted

# reduce 97 omitted

# reduce 98 omitted

# reduce 99 omitted

# reduce 100 omitted

def _reduce_101(val, _values, result)
      index = @block_parser.add_footnote val[1].rdoc
      result = "{*#{index}}[rdoc-label:foottext-#{index}:footmark-#{index}]"

    result
end

def _reduce_102(val, _values, result)
      result = inline "<tt>#{val[1]}</tt>", val[1]

    result
end

# reduce 103 omitted

# reduce 104 omitted

# reduce 105 omitted

# reduce 106 omitted

# reduce 107 omitted

# reduce 108 omitted

def _reduce_109(val, _values, result)
 result << val[1]
    result
end

# reduce 110 omitted

def _reduce_111(val, _values, result)
      result = inline val[0]

    result
end

# reduce 112 omitted

def _reduce_113(val, _values, result)
 result = val[1]
    result
end

def _reduce_114(val, _values, result)
 result = val[1]
    result
end

def _reduce_115(val, _values, result)
 result = val[1]
    result
end

# reduce 116 omitted

# reduce 117 omitted

# reduce 118 omitted

# reduce 119 omitted

# reduce 120 omitted

# reduce 121 omitted

# reduce 122 omitted

# reduce 123 omitted

# reduce 124 omitted

# reduce 125 omitted

# reduce 126 omitted

# reduce 127 omitted

# reduce 128 omitted

# reduce 129 omitted

# reduce 130 omitted

# reduce 131 omitted

# reduce 132 omitted

# reduce 133 omitted

# reduce 134 omitted

# reduce 135 omitted

def _reduce_136(val, _values, result)
 result << val[1]
    result
end

# reduce 137 omitted

def _reduce_none(val, _values, result)
  val[0]
end

end   # class InlineParser

end
PK}$[�]��,gems/gems/rdoc-6.4.1.1/lib/rdoc/rd/inline.rbnu�[���# frozen_string_literal: true
##
# Inline keeps track of markup and labels to create proper links.

class RDoc::RD::Inline

  ##
  # The text of the reference

  attr_reader :reference

  ##
  # The markup of this reference in RDoc format

  attr_reader :rdoc

  ##
  # Creates a new Inline for +rdoc+ and +reference+.
  #
  # +rdoc+ may be another Inline or a String.  If +reference+ is not given it
  # will use the text from +rdoc+.

  def self.new rdoc, reference = rdoc
    if self === rdoc and reference.equal? rdoc then
      rdoc
    else
      super
    end
  end

  ##
  # Initializes the Inline with +rdoc+ and +inline+

  def initialize rdoc, reference # :not-new:
    @reference = reference.equal?(rdoc) ? reference.dup : reference

    # unpack
    @reference = @reference.reference if self.class === @reference
    @rdoc      = rdoc
  end

  def == other # :nodoc:
    self.class === other and
      @reference == other.reference and @rdoc == other.rdoc
  end

  ##
  # Appends +more+ to this inline.  +more+ may be a String or another Inline.

  def append more
    case more
    when String then
      @reference += more
      @rdoc      += more
    when RDoc::RD::Inline then
      @reference += more.reference
      @rdoc      += more.rdoc
    else
      raise "unknown thingy #{more}"
    end

    self
  end

  def inspect # :nodoc:
    "(inline: #{self})"
  end

  alias to_s rdoc # :nodoc:

end

PK}$[���X�X2gems/gems/rdoc-6.4.1.1/lib/rdoc/rd/block_parser.rbnu�[���# frozen_string_literal: true
#
# DO NOT MODIFY!!!!
# This file is automatically generated by Racc 1.5.2
# from Racc grammar file "".
#

require 'racc/parser.rb'

class RDoc::RD

##
# RD format parser for headings, paragraphs, lists, verbatim sections that
# exist as blocks.

class BlockParser < Racc::Parser


# :stopdoc:

TMPFILE = ["rdtmp", $$, 0]

MARK_TO_LEVEL = {
  '='    => 1,
  '=='   => 2,
  '==='  => 3,
  '====' => 4,
  '+'    => 5,
  '++'   => 6,
}

# :startdoc:

##
# Footnotes for this document

attr_reader :footnotes

##
# Labels for items in this document

attr_reader :labels

##
# Path to find included files in

attr_accessor :include_path

##
# Creates a new RDoc::RD::BlockParser.  Use #parse to parse an rd-format
# document.

def initialize
  @inline_parser = RDoc::RD::InlineParser.new self
  @include_path = []

  # for testing
  @footnotes = []
  @labels    = {}
end

##
# Parses +src+ and returns an RDoc::Markup::Document.

def parse src
  @src = src
  @src.push false

  @footnotes = []
  @labels    = {}

  # @i: index(line no.) of src
  @i = 0

  # stack for current indentation
  @indent_stack = []

  # how indented.
  @current_indent = @indent_stack.join("")

  # RDoc::RD::BlockParser for tmp src
  @subparser = nil

  # which part is in now
  @in_part = nil
  @part_content = []

  @in_verbatim = false

  @yydebug = true

  document = do_parse

  unless @footnotes.empty? then
    blankline = document.parts.pop

    document.parts << RDoc::Markup::Rule.new(1)
    document.parts.concat @footnotes

    document.parts.push blankline
  end

  document
end

##
# Returns the next token from the document

def next_token # :nodoc:
  # preprocessing
  # if it is not in RD part
  # => method
  while @in_part != "rd"
    line = @src[@i]
    @i += 1 # next line

    case line
    # src end
    when false
      return [false, false]
    # RD part begin
    when /^=begin\s*(?:\bRD\b.*)?\s*$/
      if @in_part # if in non-RD part
        @part_content.push(line)
      else
        @in_part = "rd"
        return [:WHITELINE, "=begin\n"] # <= for textblockand
      end
    # non-RD part begin
    when /^=begin\s+(\w+)/
      part = $1
      if @in_part # if in non-RD part
        @part_content.push(line)
      else
        @in_part = part if @tree.filter[part] # if filter exists
#  p "BEGIN_PART: #{@in_part}" # DEBUG
      end
    # non-RD part end
    when /^=end/
      if @in_part # if in non-RD part
#  p "END_PART: #{@in_part}" # DEBUG
        # make Part-in object
        part = RDoc::RD::Part.new(@part_content.join(""), @tree, "r")
        @part_content.clear
        # call filter, part_out is output(Part object)
        part_out = @tree.filter[@in_part].call(part)

        if @tree.filter[@in_part].mode == :rd # if output is RD formatted
          subtree = parse_subtree(part_out.to_a)
        else # if output is target formatted
          basename = TMPFILE.join('.')
          TMPFILE[-1] += 1
          tmpfile = open(@tree.tmp_dir + "/" + basename + ".#{@in_part}", "w")
          tmpfile.print(part_out)
          tmpfile.close
          subtree = parse_subtree(["=begin\n", "<<< #{basename}\n", "=end\n"])
        end
        @in_part = nil
        return [:SUBTREE, subtree]
      end
    else
      if @in_part # if in non-RD part
        @part_content.push(line)
      end
    end
  end

  @current_indent = @indent_stack.join("")
  line = @src[@i]
  case line
  when false
    if_current_indent_equal("") do
      [false, false]
    end
  when /^=end/
    if_current_indent_equal("") do
      @in_part = nil
      [:WHITELINE, "=end"] # MUST CHANGE??
    end
  when /^\s*$/
    @i += 1 # next line
    return [:WHITELINE, ':WHITELINE']
  when /^\#/  # comment line
    @i += 1 # next line
    self.next_token()
  when /^(={1,4})(?!=)\s*(?=\S)/, /^(\+{1,2})(?!\+)\s*(?=\S)/
    rest = $'                    # '
    rest.strip!
    mark = $1
    if_current_indent_equal("") do
      return [:HEADLINE, [MARK_TO_LEVEL[mark], rest]]
    end
  when /^<<<\s*(\S+)/
    file = $1
    if_current_indent_equal("") do
      suffix = file[-3 .. -1]
      if suffix == ".rd" or suffix == ".rb"
        subtree = parse_subtree(get_included(file))
        [:SUBTREE, subtree]
      else
        [:INCLUDE, file]
      end
    end
  when /^(\s*)\*(\s*)/
    rest = $'                   # '
    newIndent = $2
    if_current_indent_equal($1) do
      if @in_verbatim
        [:STRINGLINE, line]
      else
        @indent_stack.push("\s" + newIndent)
        [:ITEMLISTLINE, rest]
      end
    end
  when /^(\s*)(\(\d+\))(\s*)/
    rest = $'                     # '
    mark = $2
    newIndent = $3
    if_current_indent_equal($1) do
      if @in_verbatim
        [:STRINGLINE, line]
      else
        @indent_stack.push("\s" * mark.size + newIndent)
        [:ENUMLISTLINE, rest]
      end
    end
  when /^(\s*):(\s*)/
    rest = $'                    # '
    newIndent = $2
    if_current_indent_equal($1) do
      if @in_verbatim
        [:STRINGLINE, line]
      else
        @indent_stack.push("\s#{$2}")
        [:DESCLISTLINE, rest]
      end
    end
  when /^(\s*)---(?!-|\s*$)/
    indent = $1
    rest = $'
    /\s*/ === rest
    term = $'
    new_indent = $&
    if_current_indent_equal(indent) do
      if @in_verbatim
        [:STRINGLINE, line]
      else
        @indent_stack.push("\s\s\s" + new_indent)
        [:METHODLISTLINE, term]
      end
    end
  when /^(\s*)/
    if_current_indent_equal($1) do
      [:STRINGLINE, line]
    end
  else
    raise "[BUG] parsing error may occurred."
  end
end

##
# Yields to the given block if +indent+ matches the current indent, otherwise
# an indentation token is processed.

def if_current_indent_equal(indent)
  indent = indent.sub(/\t/, "\s" * 8)
  if @current_indent == indent
    @i += 1 # next line
    yield
  elsif indent.index(@current_indent) == 0
    @indent_stack.push(indent[@current_indent.size .. -1])
    [:INDENT, ":INDENT"]
  else
    @indent_stack.pop
    [:DEDENT, ":DEDENT"]
  end
end
private :if_current_indent_equal

##
# Cuts off excess whitespace in +src+

def cut_off(src)
  ret = []
  whiteline_buf = []

  line = src.shift
  /^\s*/ =~ line

  indent = Regexp.quote($&)
  ret.push($')

  while line = src.shift
    if /^(\s*)$/ =~ line
      whiteline_buf.push(line)
    elsif /^#{indent}/ =~ line
      unless whiteline_buf.empty?
        ret.concat(whiteline_buf)
        whiteline_buf.clear
      end
      ret.push($')
    else
      raise "[BUG]: probably Parser Error while cutting off.\n"
    end
  end
  ret
end
private :cut_off

def set_term_to_element(parent, term)
#  parent.set_term_under_document_struct(term, @tree.document_struct)
  parent.set_term_without_document_struct(term)
end
private :set_term_to_element

##
# Raises a ParseError when invalid formatting is found

def on_error(et, ev, _values)
  prv, cur, nxt = format_line_num(@i, @i+1, @i+2)

  raise ParseError, <<Msg

RD syntax error: line #{@i+1}:
  #{prv}  |#{@src[@i-1].chomp}
  #{cur}=>|#{@src[@i].chomp}
  #{nxt}  |#{@src[@i+1].chomp}

Msg
end

##
# Current line number

def line_index
  @i
end

##
# Parses subtree +src+

def parse_subtree src
  @subparser ||= RDoc::RD::BlockParser.new

  @subparser.parse src
end
private :parse_subtree

##
# Retrieves the content for +file+ from the include_path

def get_included(file)
  included = []

  @include_path.each do |dir|
    file_name = File.join dir, file

    if File.exist? file_name then
      included = IO.readlines file_name
      break
    end
  end

  included
end
private :get_included

##
# Formats line numbers +line_numbers+ prettily

def format_line_num(*line_numbers)
  width = line_numbers.collect{|i| i.to_s.length }.max
  line_numbers.collect{|i| sprintf("%#{width}d", i) }
end
private :format_line_num

##
# Retrieves the content of +values+ as a single String

def content values
 values.map { |value| value.content }.join
end

##
# Creates a paragraph for +value+

def paragraph value
  content = cut_off(value).join(' ').rstrip
  contents = @inline_parser.parse content

  RDoc::Markup::Paragraph.new(*contents)
end

##
# Adds footnote +content+ to the document

def add_footnote content
  index = @footnotes.length / 2 + 1

  footmark_link = "{^#{index}}[rdoc-label:footmark-#{index}:foottext-#{index}]"

  @footnotes << RDoc::Markup::Paragraph.new(footmark_link, ' ', *content)
  @footnotes << RDoc::Markup::BlankLine.new

  index
end

##
# Adds label +label+ to the document

def add_label label
  @labels[label] = true

  label
end

# :stopdoc:

##### State transition tables begin ###

racc_action_table = [
    34,    35,    30,    33,    40,    34,    35,    30,    33,    40,
    65,    34,    35,    30,    33,    14,    73,    36,    38,    34,
    15,    88,    34,    35,    30,    33,    14,     9,    10,    11,
    12,    15,    34,    35,    30,    33,    14,     9,    10,    11,
    12,    15,    34,    35,    30,    33,    35,    47,    30,    54,
    33,    15,    34,    35,    30,    33,    54,    47,    14,    14,
    59,    15,    34,    35,    30,    33,    14,    73,    67,    76,
    77,    15,    34,    35,    30,    33,    14,    73,    54,    81,
    38,    15,    34,    35,    30,    33,    14,    73,    38,    40,
    83,    15,    34,    35,    30,    33,    14,    73,   nil,   nil,
   nil,    15,    34,    35,    30,    33,    14,    73,   nil,   nil,
   nil,    15,    34,    35,    30,    33,    14,    73,   nil,   nil,
   nil,    15,    34,    35,    30,    33,    14,    73,   nil,   nil,
   nil,    15,    34,    35,    30,    33,    14,    73,   nil,   nil,
   nil,    15,    34,    35,    30,    33,    14,    73,    61,    63,
   nil,    15,    14,    62,    60,    61,    63,    79,    61,    63,
    62,    87,   nil,    62,    34,    35,    30,    33 ]

racc_action_check = [
    41,    41,    41,    41,    41,    15,    15,    15,    15,    15,
    41,    86,    86,    86,    86,    86,    86,     1,    13,    22,
    86,    86,     0,     0,     0,     0,     0,     0,     0,     0,
     0,     0,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,    24,    24,    24,    24,    25,    24,    28,    30,
    31,    24,    27,    27,    27,    27,    33,    27,    34,    35,
    36,    27,    45,    45,    45,    45,    45,    45,    44,    49,
    51,    45,    46,    46,    46,    46,    46,    46,    54,    56,
    57,    46,    47,    47,    47,    47,    47,    47,    58,    62,
    66,    47,    68,    68,    68,    68,    68,    68,   nil,   nil,
   nil,    68,    74,    74,    74,    74,    74,    74,   nil,   nil,
   nil,    74,    75,    75,    75,    75,    75,    75,   nil,   nil,
   nil,    75,    78,    78,    78,    78,    78,    78,   nil,   nil,
   nil,    78,    79,    79,    79,    79,    79,    79,   nil,   nil,
   nil,    79,    85,    85,    85,    85,    85,    85,    39,    39,
   nil,    85,    52,    39,    39,    82,    82,    52,    64,    64,
    82,    82,   nil,    64,    20,    20,    20,    20 ]

racc_action_pointer = [
    19,    17,    29,   nil,   nil,   nil,   nil,   nil,   nil,   nil,
   nil,   nil,   nil,    11,   nil,     2,   nil,   nil,   nil,   nil,
   161,   nil,    16,   nil,    39,    42,   nil,    49,    43,   nil,
    41,    44,   nil,    48,    51,    52,    60,   nil,   nil,   141,
   nil,    -3,   nil,   nil,    55,    59,    69,    79,   nil,    56,
   nil,    57,   145,   nil,    70,   nil,    66,    73,    81,   nil,
   nil,   nil,    82,   nil,   151,   nil,    77,   nil,    89,   nil,
   nil,   nil,   nil,   nil,    99,   109,   nil,   nil,   119,   129,
   nil,   nil,   148,   nil,   nil,   139,     8,   nil,   nil ]

racc_action_default = [
    -2,   -73,    -1,    -4,    -5,    -6,    -7,    -8,    -9,   -10,
   -11,   -12,   -13,   -14,   -16,   -73,   -23,   -24,   -25,   -26,
   -27,   -31,   -32,   -34,   -72,   -36,   -38,   -72,   -40,   -42,
   -59,   -44,   -46,   -59,   -63,   -65,   -73,    -3,   -15,   -73,
   -22,   -73,   -30,   -33,   -73,   -69,   -70,   -71,   -37,   -73,
   -41,   -73,   -51,   -58,   -61,   -45,   -73,   -62,   -64,    89,
   -17,   -19,   -73,   -21,   -18,   -28,   -73,   -35,   -66,   -53,
   -54,   -55,   -56,   -57,   -67,   -68,   -39,   -43,   -49,   -73,
   -60,   -47,   -73,   -29,   -52,   -48,   -73,   -20,   -50 ]

racc_goto_table = [
     4,    39,     4,    68,    74,    75,     5,     6,     5,     6,
    44,    42,    51,    49,     3,    56,    37,    57,    58,     1,
     2,    66,    84,    41,    43,    48,    50,    64,    84,    84,
    45,    46,    42,    45,    46,    55,    85,    86,    80,    84,
    84,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    82,   nil,
   nil,   nil,    78 ]

racc_goto_check = [
     4,    10,     4,    31,    31,    31,     5,     6,     5,     6,
    21,    12,    27,    21,     3,    27,     3,     9,     9,     1,
     2,    11,    32,    17,    19,    23,    26,    10,    32,    32,
     5,     6,    12,     5,     6,    29,    31,    31,    33,    32,
    32,   nil,   nil,   nil,   nil,   nil,   nil,   nil,    10,   nil,
   nil,   nil,     4 ]

racc_goto_pointer = [
   nil,    19,    20,    14,     0,     6,     7,   nil,   nil,   -17,
   -14,   -20,    -9,   nil,   nil,   nil,   nil,     8,   nil,     2,
   nil,   -14,   nil,     0,   nil,   nil,    -2,   -18,   nil,     4,
   nil,   -42,   -46,   -16 ]

racc_goto_default = [
   nil,   nil,   nil,   nil,    70,    71,    72,     7,     8,    13,
   nil,   nil,    21,    16,    17,    18,    19,    20,    22,    23,
    24,   nil,    25,    26,    27,    28,    29,   nil,    31,    32,
    52,   nil,    69,    53 ]

racc_reduce_table = [
  0, 0, :racc_error,
  1, 15, :_reduce_1,
  0, 15, :_reduce_2,
  2, 16, :_reduce_3,
  1, 16, :_reduce_4,
  1, 17, :_reduce_5,
  1, 17, :_reduce_6,
  1, 17, :_reduce_none,
  1, 17, :_reduce_8,
  1, 17, :_reduce_9,
  1, 17, :_reduce_10,
  1, 17, :_reduce_11,
  1, 21, :_reduce_12,
  1, 22, :_reduce_13,
  1, 18, :_reduce_14,
  2, 23, :_reduce_15,
  1, 23, :_reduce_16,
  3, 19, :_reduce_17,
  1, 25, :_reduce_18,
  2, 24, :_reduce_19,
  4, 24, :_reduce_20,
  2, 24, :_reduce_21,
  1, 24, :_reduce_22,
  1, 26, :_reduce_none,
  1, 26, :_reduce_none,
  1, 26, :_reduce_none,
  1, 26, :_reduce_none,
  1, 20, :_reduce_27,
  3, 20, :_reduce_28,
  4, 20, :_reduce_29,
  2, 31, :_reduce_30,
  1, 31, :_reduce_31,
  1, 27, :_reduce_32,
  2, 32, :_reduce_33,
  1, 32, :_reduce_34,
  3, 33, :_reduce_35,
  1, 28, :_reduce_36,
  2, 36, :_reduce_37,
  1, 36, :_reduce_38,
  3, 37, :_reduce_39,
  1, 29, :_reduce_40,
  2, 39, :_reduce_41,
  1, 39, :_reduce_42,
  3, 40, :_reduce_43,
  1, 30, :_reduce_44,
  2, 42, :_reduce_45,
  1, 42, :_reduce_46,
  3, 43, :_reduce_47,
  3, 41, :_reduce_48,
  2, 41, :_reduce_49,
  4, 41, :_reduce_50,
  1, 41, :_reduce_51,
  2, 45, :_reduce_52,
  1, 45, :_reduce_none,
  1, 46, :_reduce_54,
  1, 46, :_reduce_55,
  1, 46, :_reduce_none,
  1, 46, :_reduce_57,
  1, 44, :_reduce_none,
  0, 44, :_reduce_none,
  2, 47, :_reduce_none,
  1, 47, :_reduce_none,
  2, 34, :_reduce_62,
  1, 34, :_reduce_63,
  2, 38, :_reduce_64,
  1, 38, :_reduce_65,
  2, 35, :_reduce_66,
  2, 35, :_reduce_67,
  2, 35, :_reduce_68,
  1, 35, :_reduce_69,
  1, 35, :_reduce_none,
  1, 35, :_reduce_71,
  0, 35, :_reduce_72 ]

racc_reduce_n = 73

racc_shift_n = 89

racc_token_table = {
  false => 0,
  :error => 1,
  :DUMMY => 2,
  :ITEMLISTLINE => 3,
  :ENUMLISTLINE => 4,
  :DESCLISTLINE => 5,
  :METHODLISTLINE => 6,
  :STRINGLINE => 7,
  :WHITELINE => 8,
  :SUBTREE => 9,
  :HEADLINE => 10,
  :INCLUDE => 11,
  :INDENT => 12,
  :DEDENT => 13 }

racc_nt_base = 14

racc_use_result_var = true

Racc_arg = [
  racc_action_table,
  racc_action_check,
  racc_action_default,
  racc_action_pointer,
  racc_goto_table,
  racc_goto_check,
  racc_goto_default,
  racc_goto_pointer,
  racc_nt_base,
  racc_reduce_table,
  racc_token_table,
  racc_shift_n,
  racc_reduce_n,
  racc_use_result_var ]

Racc_token_to_s_table = [
  "$end",
  "error",
  "DUMMY",
  "ITEMLISTLINE",
  "ENUMLISTLINE",
  "DESCLISTLINE",
  "METHODLISTLINE",
  "STRINGLINE",
  "WHITELINE",
  "SUBTREE",
  "HEADLINE",
  "INCLUDE",
  "INDENT",
  "DEDENT",
  "$start",
  "document",
  "blocks",
  "block",
  "textblock",
  "verbatim",
  "lists",
  "headline",
  "include",
  "textblockcontent",
  "verbatimcontent",
  "verbatim_after_lists",
  "list",
  "itemlist",
  "enumlist",
  "desclist",
  "methodlist",
  "lists2",
  "itemlistitems",
  "itemlistitem",
  "first_textblock_in_itemlist",
  "other_blocks_in_list",
  "enumlistitems",
  "enumlistitem",
  "first_textblock_in_enumlist",
  "desclistitems",
  "desclistitem",
  "description_part",
  "methodlistitems",
  "methodlistitem",
  "whitelines",
  "blocks_in_list",
  "block_in_list",
  "whitelines2" ]

Racc_debug_parser = false

##### State transition tables end #####

# reduce 0 omitted

def _reduce_1(val, _values, result)
 result = RDoc::Markup::Document.new(*val[0])
    result
end

def _reduce_2(val, _values, result)
 raise ParseError, "file empty"
    result
end

def _reduce_3(val, _values, result)
 result = val[0].concat val[1]
    result
end

def _reduce_4(val, _values, result)
 result = val[0]
    result
end

def _reduce_5(val, _values, result)
 result = val
    result
end

def _reduce_6(val, _values, result)
 result = val
    result
end

# reduce 7 omitted

def _reduce_8(val, _values, result)
 result = val
    result
end

def _reduce_9(val, _values, result)
 result = val
    result
end

def _reduce_10(val, _values, result)
 result = [RDoc::Markup::BlankLine.new]
    result
end

def _reduce_11(val, _values, result)
 result = val[0].parts
    result
end

def _reduce_12(val, _values, result)
      # val[0] is like [level, title]
      title = @inline_parser.parse(val[0][1])
      result = RDoc::Markup::Heading.new(val[0][0], title)

    result
end

def _reduce_13(val, _values, result)
      result = RDoc::Markup::Include.new val[0], @include_path

    result
end

def _reduce_14(val, _values, result)
      # val[0] is Array of String
      result = paragraph val[0]

    result
end

def _reduce_15(val, _values, result)
 result << val[1].rstrip
    result
end

def _reduce_16(val, _values, result)
 result = [val[0].rstrip]
    result
end

def _reduce_17(val, _values, result)
      # val[1] is Array of String
      content = cut_off val[1]
      result = RDoc::Markup::Verbatim.new(*content)

      # imform to lexer.
      @in_verbatim = false

    result
end

def _reduce_18(val, _values, result)
      # val[0] is Array of String
      content = cut_off val[0]
      result = RDoc::Markup::Verbatim.new(*content)

      # imform to lexer.
      @in_verbatim = false

    result
end

def _reduce_19(val, _values, result)
      result << val[1]

    result
end

def _reduce_20(val, _values, result)
      result.concat val[2]

    result
end

def _reduce_21(val, _values, result)
      result << "\n"

    result
end

def _reduce_22(val, _values, result)
      result = val
      # inform to lexer.
      @in_verbatim = true

    result
end

# reduce 23 omitted

# reduce 24 omitted

# reduce 25 omitted

# reduce 26 omitted

def _reduce_27(val, _values, result)
      result = val[0]

    result
end

def _reduce_28(val, _values, result)
      result = val[1]

    result
end

def _reduce_29(val, _values, result)
      result = val[1].push(val[2])

    result
end

def _reduce_30(val, _values, result)
 result = val[0] << val[1]
    result
end

def _reduce_31(val, _values, result)
 result = [val[0]]
    result
end

def _reduce_32(val, _values, result)
      result = RDoc::Markup::List.new :BULLET, *val[0]

    result
end

def _reduce_33(val, _values, result)
 result.push(val[1])
    result
end

def _reduce_34(val, _values, result)
 result = val
    result
end

def _reduce_35(val, _values, result)
      result = RDoc::Markup::ListItem.new nil, val[0], *val[1]

    result
end

def _reduce_36(val, _values, result)
      result = RDoc::Markup::List.new :NUMBER, *val[0]

    result
end

def _reduce_37(val, _values, result)
 result.push(val[1])
    result
end

def _reduce_38(val, _values, result)
 result = val
    result
end

def _reduce_39(val, _values, result)
      result = RDoc::Markup::ListItem.new nil, val[0], *val[1]

    result
end

def _reduce_40(val, _values, result)
      result = RDoc::Markup::List.new :NOTE, *val[0]

    result
end

def _reduce_41(val, _values, result)
 result.push(val[1])
    result
end

def _reduce_42(val, _values, result)
 result = val
    result
end

def _reduce_43(val, _values, result)
      term = @inline_parser.parse val[0].strip

      result = RDoc::Markup::ListItem.new term, *val[1]

    result
end

def _reduce_44(val, _values, result)
      result = RDoc::Markup::List.new :LABEL, *val[0]

    result
end

def _reduce_45(val, _values, result)
 result.push(val[1])
    result
end

def _reduce_46(val, _values, result)
 result = val
    result
end

def _reduce_47(val, _values, result)
      result = RDoc::Markup::ListItem.new "<tt>#{val[0].strip}</tt>", *val[1]

    result
end

def _reduce_48(val, _values, result)
      result = [val[1]].concat(val[2])

    result
end

def _reduce_49(val, _values, result)
      result = [val[1]]

    result
end

def _reduce_50(val, _values, result)
      result = val[2]

    result
end

def _reduce_51(val, _values, result)
      result = []

    result
end

def _reduce_52(val, _values, result)
 result.concat val[1]
    result
end

# reduce 53 omitted

def _reduce_54(val, _values, result)
 result = val
    result
end

def _reduce_55(val, _values, result)
 result = val
    result
end

# reduce 56 omitted

def _reduce_57(val, _values, result)
 result = []
    result
end

# reduce 58 omitted

# reduce 59 omitted

# reduce 60 omitted

# reduce 61 omitted

def _reduce_62(val, _values, result)
      result = paragraph [val[0]].concat(val[1])

    result
end

def _reduce_63(val, _values, result)
      result = paragraph [val[0]]

    result
end

def _reduce_64(val, _values, result)
      result = paragraph [val[0]].concat(val[1])

    result
end

def _reduce_65(val, _values, result)
      result = paragraph [val[0]]

    result
end

def _reduce_66(val, _values, result)
      result = [val[0]].concat(val[1])

    result
end

def _reduce_67(val, _values, result)
 result.concat val[1]
    result
end

def _reduce_68(val, _values, result)
 result = val[1]
    result
end

def _reduce_69(val, _values, result)
 result = val
    result
end

# reduce 70 omitted

def _reduce_71(val, _values, result)
 result = []
    result
end

def _reduce_72(val, _values, result)
 result = []
    result
end

def _reduce_none(val, _values, result)
  val[0]
end

end   # class BlockParser

end
PK}$[��VU}
}
0gems/gems/rdoc-6.4.1.1/lib/rdoc/known_classes.rbnu�[���# frozen_string_literal: true
module RDoc

  ##
  # Ruby's built-in classes, modules and exceptions

  KNOWN_CLASSES = {
    "rb_cArray"            => "Array",
    "rb_cBasicObject"      => "BasicObject",
    "rb_cBignum"           => "Bignum",
    "rb_cClass"            => "Class",
    "rb_cData"             => "Data",
    "rb_cDir"              => "Dir",
    "rb_cEncoding"         => "Encoding",
    "rb_cFalseClass"       => "FalseClass",
    "rb_cFile"             => "File",
    "rb_cFixnum"           => "Fixnum",
    "rb_cFloat"            => "Float",
    "rb_cHash"             => "Hash",
    "rb_cIO"               => "IO",
    "rb_cInteger"          => "Integer",
    "rb_cModule"           => "Module",
    "rb_cNilClass"         => "NilClass",
    "rb_cNumeric"          => "Numeric",
    "rb_cObject"           => "Object",
    "rb_cProc"             => "Proc",
    "rb_cRange"            => "Range",
    "rb_cRegexp"           => "Regexp",
    "rb_cRubyVM"           => "RubyVM",
    "rb_cSocket"           => "Socket",
    "rb_cString"           => "String",
    "rb_cStruct"           => "Struct",
    "rb_cSymbol"           => "Symbol",
    "rb_cThread"           => "Thread",
    "rb_cTime"             => "Time",
    "rb_cTrueClass"        => "TrueClass",

    "rb_eArgError"         => "ArgError",
    "rb_eEOFError"         => "EOFError",
    "rb_eException"        => "Exception",
    "rb_eFatal"            => "fatal",
    "rb_eFloatDomainError" => "FloatDomainError",
    "rb_eIOError"          => "IOError",
    "rb_eIndexError"       => "IndexError",
    "rb_eInterrupt"        => "Interrupt",
    "rb_eLoadError"        => "LoadError",
    "rb_eNameError"        => "NameError",
    "rb_eNoMemError"       => "NoMemError",
    "rb_eNotImpError"      => "NotImpError",
    "rb_eRangeError"       => "RangeError",
    "rb_eRuntimeError"     => "RuntimeError",
    "rb_eScriptError"      => "ScriptError",
    "rb_eSecurityError"    => "SecurityError",
    "rb_eSignal"           => "SignalException",
    "rb_eStandardError"    => "StandardError",
    "rb_eSyntaxError"      => "SyntaxError",
    "rb_eSystemCallError"  => "SystemCallError",
    "rb_eSystemExit"       => "SystemExit",
    "rb_eTypeError"        => "TypeError",
    "rb_eZeroDivError"     => "ZeroDivError",

    "rb_mComparable"       => "Comparable",
    "rb_mEnumerable"       => "Enumerable",
    "rb_mErrno"            => "Errno",
    "rb_mFConst"           => "File::Constants",
    "rb_mFileTest"         => "FileTest",
    "rb_mGC"               => "GC",
    "rb_mKernel"           => "Kernel",
    "rb_mMath"             => "Math",
    "rb_mProcess"          => "Process"
  }

end
PK}$[��n�==*gems/gems/rdoc-6.4.1.1/lib/rdoc/ri/task.rbnu�[���# frozen_string_literal: true
begin
  gem 'rdoc'
rescue Gem::LoadError
end unless defined?(RDoc)

require_relative '../task'

##
# RDoc::RI::Task creates ri data in <code>./.rdoc</code> for your project.
#
# It contains the following tasks:
#
# [ri]
#   Build ri data
#
# [clobber_ri]
#   Delete ri data files.  This target is automatically added to the main
#   clobber target.
#
# [reri]
#   Rebuild the ri data from scratch even if they are not out of date.
#
# Simple example:
#
#   require 'rdoc/ri/task'
#
#   RDoc::RI::Task.new do |ri|
#     ri.main = 'README.rdoc'
#     ri.rdoc_files.include 'README.rdoc', 'lib/**/*.rb'
#   end
#
# For further configuration details see RDoc::Task.

class RDoc::RI::Task < RDoc::Task

  DEFAULT_NAMES = { # :nodoc:
    :clobber_rdoc => :clobber_ri,
    :rdoc         => :ri,
    :rerdoc       => :reri,
  }

  ##
  # Create an ri task with the given name. See RDoc::Task for documentation on
  # setting names.

  def initialize name = DEFAULT_NAMES # :yield: self
    super
  end

  def clobber_task_description # :nodoc:
    "Remove RI data files"
  end

  ##
  # Sets default task values

  def defaults
    super

    @rdoc_dir = '.rdoc'
  end

  def rdoc_task_description # :nodoc:
    'Build RI data files'
  end

  def rerdoc_task_description # :nodoc:
    'Rebuild RI data files'
  end
end
PK}$[��tUU+gems/gems/rdoc-6.4.1.1/lib/rdoc/ri/store.rbnu�[���# frozen_string_literal: true
module RDoc::RI

  Store = RDoc::Store # :nodoc:

end

PK}$[V�nrr/gems/gems/rdoc-6.4.1.1/lib/rdoc/ri/formatter.rbnu�[���# frozen_string_literal: true
##
# For RubyGems backwards compatibility

module RDoc::RI::Formatter # :nodoc:
end
PK}$[�Ų^^+gems/gems/rdoc-6.4.1.1/lib/rdoc/ri/paths.rbnu�[���# frozen_string_literal: true
require_relative '../rdoc'

##
# The directories where ri data lives.  Paths can be enumerated via ::each, or
# queried individually via ::system_dir, ::site_dir, ::home_dir and ::gem_dir.

module RDoc::RI::Paths

  #:stopdoc:
  require 'rbconfig'

  version = RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']

  BASE    = File.join RbConfig::CONFIG['ridir'], version

  HOMEDIR = RDoc.home
  #:startdoc:

  ##
  # Iterates over each selected path yielding the directory and type.
  #
  # Yielded types:
  # :system:: Where Ruby's ri data is stored.  Yielded when +system+ is
  #           true
  # :site:: Where ri for installed libraries are stored.  Yielded when
  #         +site+ is true.  Normally no ri data is stored here.
  # :home:: ~/.rdoc.  Yielded when +home+ is true.
  # :gem:: ri data for an installed gem.  Yielded when +gems+ is true.
  # :extra:: ri data directory from the command line.  Yielded for each
  #          entry in +extra_dirs+

  def self.each system = true, site = true, home = true, gems = :latest, *extra_dirs # :yields: directory, type
    return enum_for __method__, system, site, home, gems, *extra_dirs unless
      block_given?

    extra_dirs.each do |dir|
      yield dir, :extra
    end

    yield system_dir,  :system if system
    yield site_dir,    :site   if site
    yield home_dir,    :home   if home and HOMEDIR

    gemdirs(gems).each do |dir|
      yield dir, :gem
    end if gems

    nil
  end

  ##
  # The ri directory for the gem with +gem_name+.

  def self.gem_dir name, version
    req = Gem::Requirement.new "= #{version}"

    spec = Gem::Specification.find_by_name name, req

    File.join spec.doc_dir, 'ri'
  end

  ##
  # The latest installed gems' ri directories.  +filter+ can be :all or
  # :latest.
  #
  # A +filter+ :all includes all versions of gems and includes gems without
  # ri documentation.

  def self.gemdirs filter = :latest
    ri_paths = {}

    all = Gem::Specification.map do |spec|
      [File.join(spec.doc_dir, 'ri'), spec.name, spec.version]
    end

    if filter == :all then
      gemdirs = []

      all.group_by do |_, name, _|
        name
      end.sort_by do |group, _|
        group
      end.map do |group, items|
        items.sort_by do |_, _, version|
          version
        end.reverse_each do |dir,|
          gemdirs << dir
        end
      end

      return gemdirs
    end

    all.each do |dir, name, ver|
      next unless File.exist? dir

      if ri_paths[name].nil? or ver > ri_paths[name].first then
        ri_paths[name] = [ver, name, dir]
      end
    end

    ri_paths.sort_by { |_, (_, name, _)| name }.map { |k, v| v.last }
  rescue LoadError
    []
  end

  ##
  # The location of the rdoc data in the user's home directory.
  #
  # Like ::system, ri data in the user's home directory is rare and predates
  # libraries distributed via RubyGems.  ri data is rarely generated into this
  # directory.

  def self.home_dir
    HOMEDIR
  end

  ##
  # Returns existing directories from the selected documentation directories
  # as an Array.
  #
  # See also ::each

  def self.path(system = true, site = true, home = true, gems = :latest, *extra_dirs)
    path = raw_path system, site, home, gems, *extra_dirs

    path.select { |directory| File.directory? directory }
  end

  ##
  # Returns selected documentation directories including nonexistent
  # directories.
  #
  # See also ::each

  def self.raw_path(system, site, home, gems, *extra_dirs)
    path = []

    each(system, site, home, gems, *extra_dirs) do |dir, type|
      path << dir
    end

    path.compact
  end

  ##
  # The location of ri data installed into the site dir.
  #
  # Historically this was available for documentation installed by Ruby
  # libraries predating RubyGems.  It is unlikely to contain any content for
  # modern Ruby installations.

  def self.site_dir
    File.join BASE, 'site'
  end

  ##
  # The location of the built-in ri data.
  #
  # This data is built automatically when `make` is run when Ruby is
  # installed.  If you did not install Ruby by hand you may need to install
  # the documentation yourself.  Please consult the documentation for your
  # package manager or Ruby installer for details.  You can also use the
  # rdoc-data gem to install system ri data for common versions of Ruby.

  def self.system_dir
    File.join BASE, 'system'
  end

end
PK}$[���(	�	�,gems/gems/rdoc-6.4.1.1/lib/rdoc/ri/driver.rbnu�[���# frozen_string_literal: true
require 'abbrev'
require 'optparse'

begin
  require 'readline'
rescue LoadError
end

begin
  require 'win32console'
rescue LoadError
end

require 'rdoc'

##
# For RubyGems backwards compatibility

require_relative 'formatter'

##
# The RI driver implements the command-line ri tool.
#
# The driver supports:
# * loading RI data from:
#   * Ruby's standard library
#   * RubyGems
#   * ~/.rdoc
#   * A user-supplied directory
# * Paging output (uses RI_PAGER environment variable, PAGER environment
#   variable or the less, more and pager programs)
# * Interactive mode with tab-completion
# * Abbreviated names (ri Zl shows Zlib documentation)
# * Colorized output
# * Merging output from multiple RI data sources

class RDoc::RI::Driver

  ##
  # Base Driver error class

  class Error < RDoc::RI::Error; end

  ##
  # Raised when a name isn't found in the ri data stores

  class NotFoundError < Error

    def initialize(klass, suggestions = nil) # :nodoc:
      @klass = klass
      @suggestions = suggestions
    end

    ##
    # Name that wasn't found

    def name
      @klass
    end

    def message # :nodoc:
      str = "Nothing known about #{@klass}"
      if @suggestions and !@suggestions.empty?
        str += "\nDid you mean?  #{@suggestions.join("\n               ")}"
      end
      str
    end
  end

  ##
  # Show all method documentation following a class or module

  attr_accessor :show_all

  ##
  # An RDoc::RI::Store for each entry in the RI path

  attr_accessor :stores

  ##
  # Controls the user of the pager vs $stdout

  attr_accessor :use_stdout

  ##
  # Default options for ri

  def self.default_options
    options = {}
    options[:interactive] = false
    options[:profile]     = false
    options[:show_all]    = false
    options[:use_stdout]  = !$stdout.tty?
    options[:width]       = 72

    # By default all standard paths are used.
    options[:use_system]     = true
    options[:use_site]       = true
    options[:use_home]       = true
    options[:use_gems]       = true
    options[:extra_doc_dirs] = []

    return options
  end

  ##
  # Dump +data_path+ using pp

  def self.dump data_path
    require 'pp'

    File.open data_path, 'rb' do |io|
      pp Marshal.load(io.read)
    end
  end

  ##
  # Parses +argv+ and returns a Hash of options

  def self.process_args argv
    options = default_options

    opts = OptionParser.new do |opt|
      opt.accept File do |file,|
        File.readable?(file) and not File.directory?(file) and file
      end

      opt.program_name = File.basename $0
      opt.version = RDoc::VERSION
      opt.release = nil
      opt.summary_indent = ' ' * 4

      opt.banner = <<-EOT
Usage: #{opt.program_name} [options] [name ...]

Where name can be:

  Class | Module | Module::Class

  Class::method | Class#method | Class.method | method

  gem_name: | gem_name:README | gem_name:History

  ruby: | ruby:NEWS | ruby:globals

All class names may be abbreviated to their minimum unambiguous form.
If a name is ambiguous, all valid options will be listed.

A '.' matches either class or instance methods, while #method
matches only instance and ::method matches only class methods.

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 ':' all files in the
gem will be shown.  The file name extension may be omitted where it is
unambiguous.

'ruby' can be used as a pseudo gem name to display files from the Ruby
core documentation. Use 'ruby:' by itself to get a list of all available
core documentation files.

For example:

    #{opt.program_name} Fil
    #{opt.program_name} File
    #{opt.program_name} File.new
    #{opt.program_name} zip
    #{opt.program_name} rdoc:README
    #{opt.program_name} ruby:comments

Note that shell quoting or escaping may be required for method names
containing punctuation:

    #{opt.program_name} 'Array.[]'
    #{opt.program_name} compact\\!

To see the default directories #{opt.program_name} will search, run:

    #{opt.program_name} --list-doc-dirs

Specifying the --system, --site, --home, --gems, or --doc-dir options
will limit ri to searching only the specified directories.

ri options may be set in the RI environment variable.

The ri pager can be set with the RI_PAGER environment variable
or the PAGER environment variable.
      EOT

      opt.separator nil
      opt.separator "Options:"

      opt.separator nil

      opt.on("--[no-]interactive", "-i",
             "In interactive mode you can repeatedly",
             "look up methods with autocomplete.") do |interactive|
        options[:interactive] = interactive
      end

      opt.separator nil

      opt.on("--[no-]all", "-a",
             "Show all documentation for a class or",
             "module.") do |show_all|
        options[:show_all] = show_all
      end

      opt.separator nil

      opt.on("--[no-]list", "-l",
             "List classes ri knows about.") do |list|
        options[:list] = list
      end

      opt.separator nil

      opt.on("--[no-]pager",
             "Send output to a pager,",
             "rather than directly to stdout.") do |use_pager|
        options[:use_stdout] = !use_pager
      end

      opt.separator nil

      opt.on("-T",
             "Synonym for --no-pager.") do
        options[:use_stdout] = true
      end

      opt.separator nil

      opt.on("--width=WIDTH", "-w", OptionParser::DecimalInteger,
             "Set the width of the output.") do |width|
        options[:width] = width
      end

      opt.separator nil

      opt.on("--server[=PORT]", Integer,
             "Run RDoc server on the given port.",
             "The default port is 8214.") do |port|
        options[:server] = port || 8214
      end

      opt.separator nil

      formatters = RDoc::Markup.constants.grep(/^To[A-Z][a-z]+$/).sort
      formatters = formatters.sort.map do |formatter|
        formatter.to_s.sub('To', '').downcase
      end
      formatters -= %w[html label test] # remove useless output formats

      opt.on("--format=NAME", "-f",
             "Use the selected formatter.  The default",
             "formatter is bs for paged output and ansi",
             "otherwise.  Valid formatters are:",
             "#{formatters.join(', ')}.", formatters) do |value|
        options[:formatter] = RDoc::Markup.const_get "To#{value.capitalize}"
      end

      opt.separator nil

      opt.on("--help", "-h",
             "Show help and exit.") do
        puts opts
        exit
      end

      opt.separator nil

      opt.on("--version", "-v",
             "Output version information and exit.") do
        puts "#{opts.program_name} #{opts.version}"
        exit
      end

      opt.separator nil
      opt.separator "Data source options:"
      opt.separator nil

      opt.on("--[no-]list-doc-dirs",
             "List the directories from which ri will",
             "source documentation on stdout and exit.") do |list_doc_dirs|
        options[:list_doc_dirs] = list_doc_dirs
      end

      opt.separator nil

      opt.on("--doc-dir=DIRNAME", "-d", Array,
             "List of directories from which to source",
             "documentation in addition to the standard",
             "directories.  May be repeated.") do |value|
        value.each do |dir|
          unless File.directory? dir then
            raise OptionParser::InvalidArgument, "#{dir} is not a directory"
          end

          options[:extra_doc_dirs] << File.expand_path(dir)
        end
      end

      opt.separator nil

      opt.on("--no-standard-docs",
             "Do not include documentation from",
             "the Ruby standard library, site_lib,",
             "installed gems, or ~/.rdoc.",
             "Use with --doc-dir.") do
        options[:use_system] = false
        options[:use_site] = false
        options[:use_gems] = false
        options[:use_home] = false
      end

      opt.separator nil

      opt.on("--[no-]system",
             "Include documentation from Ruby's",
             "standard library.  Defaults to true.") do |value|
        options[:use_system] = value
      end

      opt.separator nil

      opt.on("--[no-]site",
             "Include documentation from libraries",
             "installed in site_lib.",
             "Defaults to true.") do |value|
        options[:use_site] = value
      end

      opt.separator nil

      opt.on("--[no-]gems",
             "Include documentation from RubyGems.",
             "Defaults to true.") do |value|
        options[:use_gems] = value
      end

      opt.separator nil

      opt.on("--[no-]home",
             "Include documentation stored in ~/.rdoc.",
             "Defaults to true.") do |value|
        options[:use_home] = value
      end

      opt.separator nil
      opt.separator "Debug options:"
      opt.separator nil

      opt.on("--[no-]profile",
             "Run with the ruby profiler.") do |value|
        options[:profile] = value
      end

      opt.separator nil

      opt.on("--dump=CACHE", File,
             "Dump data from an ri cache or data file.") do |value|
        options[:dump_path] = value
      end
    end

    argv = ENV['RI'].to_s.split(' ').concat argv

    opts.parse! argv

    options[:names] = argv

    options[:use_stdout] ||= !$stdout.tty?
    options[:use_stdout] ||= options[:interactive]
    options[:width] ||= 72

    options

  rescue OptionParser::InvalidArgument, OptionParser::InvalidOption => e
    puts opts
    puts
    puts e
    exit 1
  end

  ##
  # Runs the ri command line executable using +argv+

  def self.run argv = ARGV
    options = process_args argv

    if options[:dump_path] then
      dump options[:dump_path]
      return
    end

    ri = new options
    ri.run
  end

  ##
  # Creates a new driver using +initial_options+ from ::process_args

  def initialize initial_options = {}
    @paging = false
    @classes = nil

    options = self.class.default_options.update(initial_options)

    @formatter_klass = options[:formatter]

    require 'profile' if options[:profile]

    @names = options[:names]
    @list = options[:list]

    @doc_dirs = []
    @stores   = []

    RDoc::RI::Paths.each(options[:use_system], options[:use_site],
                         options[:use_home], options[:use_gems],
                         *options[:extra_doc_dirs]) do |path, type|
      @doc_dirs << path

      store = RDoc::RI::Store.new path, type
      store.load_cache
      @stores << store
    end

    @list_doc_dirs = options[:list_doc_dirs]

    @interactive = options[:interactive]
    @server      = options[:server]
    @use_stdout  = options[:use_stdout]
    @show_all    = options[:show_all]
    @width       = options[:width]

    # pager process for jruby
    @jruby_pager_process = nil
  end

  ##
  # Adds paths for undocumented classes +also_in+ to +out+

  def add_also_in out, also_in
    return if also_in.empty?

    out << RDoc::Markup::Rule.new(1)
    out << RDoc::Markup::Paragraph.new("Also found in:")

    paths = RDoc::Markup::Verbatim.new
    also_in.each do |store|
      paths.parts.push store.friendly_path, "\n"
    end
    out << paths
  end

  ##
  # Adds a class header to +out+ for class +name+ which is described in
  # +classes+.

  def add_class out, name, classes
    heading = if classes.all? { |klass| klass.module? } then
                name
              else
                superclass = classes.map do |klass|
                  klass.superclass unless klass.module?
                end.compact.shift || 'Object'

                superclass = superclass.full_name unless String === superclass

                "#{name} < #{superclass}"
              end

    out << RDoc::Markup::Heading.new(1, heading)
    out << RDoc::Markup::BlankLine.new
  end

  ##
  # Adds "(from ...)" to +out+ for +store+

  def add_from out, store
    out << RDoc::Markup::Paragraph.new("(from #{store.friendly_path})")
  end

  ##
  # Adds +extends+ to +out+

  def add_extends out, extends
    add_extension_modules out, 'Extended by', extends
  end

  ##
  # Adds a list of +extensions+ to this module of the given +type+ to +out+.
  # add_includes and add_extends call this, so you should use those directly.

  def add_extension_modules out, type, extensions
    return if extensions.empty?

    out << RDoc::Markup::Rule.new(1)
    out << RDoc::Markup::Heading.new(1, "#{type}:")

    extensions.each do |modules, store|
      if modules.length == 1 then
        add_extension_modules_single out, store, modules.first
      else
        add_extension_modules_multiple out, store, modules
      end
    end
  end

  ##
  # Renders multiple included +modules+ from +store+ to +out+.

  def add_extension_modules_multiple out, store, modules # :nodoc:
    out << RDoc::Markup::Paragraph.new("(from #{store.friendly_path})")

    wout, with = modules.partition { |incl| incl.comment.empty? }

    out << RDoc::Markup::BlankLine.new unless with.empty?

    with.each do |incl|
      out << RDoc::Markup::Paragraph.new(incl.name)
      out << RDoc::Markup::BlankLine.new
      out << incl.comment
    end

    unless wout.empty? then
      verb = RDoc::Markup::Verbatim.new

      wout.each do |incl|
        verb.push incl.name, "\n"
      end

      out << verb
    end
  end

  ##
  # Adds a single extension module +include+ from +store+ to +out+

  def add_extension_modules_single out, store, include # :nodoc:
    name = include.name
    path = store.friendly_path
    out << RDoc::Markup::Paragraph.new("#{name} (from #{path})")

    if include.comment then
      out << RDoc::Markup::BlankLine.new
      out << include.comment
    end
  end

  ##
  # Adds +includes+ to +out+

  def add_includes out, includes
    add_extension_modules out, 'Includes', includes
  end

  ##
  # Looks up the method +name+ and adds it to +out+

  def add_method out, name
    filtered   = lookup_method name

    method_out = method_document name, filtered

    out.concat method_out.parts
  end

  ##
  # Adds documentation for all methods in +klass+ to +out+

  def add_method_documentation out, klass
    klass.method_list.each do |method|
      begin
        add_method out, method.full_name
      rescue NotFoundError
        next
      end
    end
  end

  ##
  # Adds a list of +methods+ to +out+ with a heading of +name+

  def add_method_list out, methods, name
    return if methods.empty?

    out << RDoc::Markup::Heading.new(1, "#{name}:")
    out << RDoc::Markup::BlankLine.new

    if @use_stdout and !@interactive then
      out.concat methods.map { |method|
        RDoc::Markup::Verbatim.new method
      }
    else
      out << RDoc::Markup::IndentedParagraph.new(2, methods.join(', '))
    end

    out << RDoc::Markup::BlankLine.new
  end

  ##
  # Returns ancestor classes of +klass+

  def ancestors_of klass
    ancestors = []

    unexamined = [klass]
    seen = []

    loop do
      break if unexamined.empty?
      current = unexamined.shift
      seen << current

      stores = classes[current]

      next unless stores and not stores.empty?

      klasses = stores.flat_map do |store|
        store.ancestors[current] || []
      end.uniq

      klasses = klasses - seen

      ancestors.concat klasses
      unexamined.concat klasses
    end

    ancestors.reverse
  end

  ##
  # For RubyGems backwards compatibility

  def class_cache # :nodoc:
  end

  ##
  # Builds a RDoc::Markup::Document from +found+, +klasess+ and +includes+

  def class_document name, found, klasses, includes, extends
    also_in = []

    out = RDoc::Markup::Document.new

    add_class out, name, klasses

    add_includes out, includes
    add_extends  out, extends

    found.each do |store, klass|
      render_class out, store, klass, also_in
    end

    add_also_in out, also_in

    out
  end

  ##
  # Adds the class +comment+ to +out+.

  def class_document_comment out, comment # :nodoc:
    unless comment.empty? then
      out << RDoc::Markup::Rule.new(1)

      if comment.merged? then
        parts = comment.parts
        parts = parts.zip [RDoc::Markup::BlankLine.new] * parts.length
        parts.flatten!
        parts.pop

        out.concat parts
      else
        out << comment
      end
    end
  end

  ##
  # Adds the constants from +klass+ to the Document +out+.

  def class_document_constants out, klass # :nodoc:
    return if klass.constants.empty?

    out << RDoc::Markup::Heading.new(1, "Constants:")
    out << RDoc::Markup::BlankLine.new
    list = RDoc::Markup::List.new :NOTE

    constants = klass.constants.sort_by { |constant| constant.name }

    list.items.concat constants.map { |constant|
      parts = constant.comment.parts if constant.comment
      parts << RDoc::Markup::Paragraph.new('[not documented]') if
        parts.empty?

      RDoc::Markup::ListItem.new(constant.name, *parts)
    }

    out << list
    out << RDoc::Markup::BlankLine.new
  end

  ##
  # Hash mapping a known class or module to the stores it can be loaded from

  def classes
    return @classes if @classes

    @classes = {}

    @stores.each do |store|
      store.cache[:modules].each do |mod|
        # using default block causes searched-for modules to be added
        @classes[mod] ||= []
        @classes[mod] << store
      end
    end

    @classes
  end

  ##
  # Returns the stores wherein +name+ is found along with the classes,
  # extends and includes that match it

  def classes_and_includes_and_extends_for name
    klasses = []
    extends = []
    includes = []

    found = @stores.map do |store|
      begin
        klass = store.load_class name
        klasses  << klass
        extends  << [klass.extends,  store] if klass.extends
        includes << [klass.includes, store] if klass.includes
        [store, klass]
      rescue RDoc::Store::MissingFileError
      end
    end.compact

    extends.reject!  do |modules,| modules.empty? end
    includes.reject! do |modules,| modules.empty? end

    [found, klasses, includes, extends]
  end

  ##
  # Completes +name+ based on the caches.  For Readline

  def complete name
    completions = []

    klass, selector, method = parse_name name

    complete_klass  name, klass, selector, method, completions
    complete_method name, klass, selector,         completions

    completions.sort.uniq
  end

  def complete_klass name, klass, selector, method, completions # :nodoc:
    klasses = classes.keys

    # may need to include Foo when given Foo::
    klass_name = method ? name : klass

    if name !~ /#|\./ then
      completions.replace klasses.grep(/^#{Regexp.escape klass_name}[^:]*$/)
      completions.concat klasses.grep(/^#{Regexp.escape name}[^:]*$/) if
        name =~ /::$/

      completions << klass if classes.key? klass # to complete a method name
    elsif selector then
      completions << klass if classes.key? klass
    elsif classes.key? klass_name then
      completions << klass_name
    end
  end

  def complete_method name, klass, selector, completions # :nodoc:
    if completions.include? klass and name =~ /#|\.|::/ then
      methods = list_methods_matching name

      if not methods.empty? then
        # remove Foo if given Foo:: and a method was found
        completions.delete klass
      elsif selector then
        # replace Foo with Foo:: as given
        completions.delete klass
        completions << "#{klass}#{selector}"
      end

      completions.concat methods
    end
  end

  ##
  # Converts +document+ to text and writes it to the pager

  def display document
    page do |io|
      f = formatter(io)
      f.width = @width if @width and f.respond_to?(:width)
      text = document.accept f

      io.write text
    end
  end

  ##
  # Outputs formatted RI data for class +name+.  Groups undocumented classes

  def display_class name
    return if name =~ /#|\./

    found, klasses, includes, extends =
      classes_and_includes_and_extends_for name

    return if found.empty?

    out = class_document name, found, klasses, includes, extends

    display out
  end

  ##
  # Outputs formatted RI data for method +name+

  def display_method name
    out = RDoc::Markup::Document.new

    add_method out, name

    display out
  end

  ##
  # Outputs formatted RI data for the class or method +name+.
  #
  # Returns true if +name+ was found, false if it was not an alternative could
  # be guessed, raises an error if +name+ couldn't be guessed.

  def display_name name
    if name =~ /\w:(\w|$)/ then
      display_page name
      return true
    end

    return true if display_class name

    display_method name if name =~ /::|#|\./

    true
  rescue NotFoundError
    matches = list_methods_matching name if name =~ /::|#|\./
    matches = classes.keys.grep(/^#{Regexp.escape name}/) if matches.empty?

    raise if matches.empty?

    page do |io|
      io.puts "#{name} not found, maybe you meant:"
      io.puts
      io.puts matches.sort.join("\n")
    end

    false
  end

  ##
  # Displays each name in +name+

  def display_names names
    names.each do |name|
      name = expand_name name

      display_name name
    end
  end

  ##
  # Outputs formatted RI data for page +name+.

  def display_page name
    store_name, page_name = name.split ':', 2

    store = @stores.find { |s| s.source == store_name }

    return display_page_list store if page_name.empty?

    pages = store.cache[:pages]

    unless pages.include? page_name then
      found_names = pages.select do |n|
        n =~ /#{Regexp.escape page_name}\.[^.]+$/
      end

      if found_names.length.zero? then
        return display_page_list store, pages
      elsif found_names.length > 1 then
        return display_page_list store, found_names, page_name
      end

      page_name = found_names.first
    end

    page = store.load_page page_name

    display page.comment
  end

  ##
  # Outputs a formatted RI page list for the pages in +store+.

  def display_page_list store, pages = store.cache[:pages], search = nil
    out = RDoc::Markup::Document.new

    title = if search then
              "#{search} pages"
            else
              'Pages'
            end

    out << RDoc::Markup::Heading.new(1, "#{title} in #{store.friendly_path}")
    out << RDoc::Markup::BlankLine.new

    list = RDoc::Markup::List.new(:BULLET)

    pages.each do |page|
      list << RDoc::Markup::Paragraph.new(page)
    end

    out << list

    display out
  end

  def check_did_you_mean # :nodoc:
    if defined? DidYouMean::SpellChecker
      true
    else
      begin
        require 'did_you_mean'
        if defined? DidYouMean::SpellChecker
          true
        else
          false
        end
      rescue LoadError
        false
      end
    end
  end

  ##
  # Expands abbreviated klass +klass+ into a fully-qualified class.  "Zl::Da"
  # will be expanded to Zlib::DataError.

  def expand_class klass
    class_names = classes.keys
    ary = class_names.grep(Regexp.new("\\A#{klass.gsub(/(?=::|\z)/, '[^:]*')}\\z"))
    if ary.length != 1 && ary.first != klass
      if check_did_you_mean
        suggestions = DidYouMean::SpellChecker.new(dictionary: class_names).correct(klass)
        raise NotFoundError.new(klass, suggestions)
      else
        raise NotFoundError, klass
      end
    end
    ary.first
  end

  ##
  # Expands the class portion of +name+ into a fully-qualified class.  See
  # #expand_class.

  def expand_name name
    klass, selector, method = parse_name name

    return [selector, method].join if klass.empty?

    case selector
    when ':' then
      [find_store(klass),   selector, method]
    else
      [expand_class(klass), selector, method]
    end.join
  end

  ##
  # Filters the methods in +found+ trying to find a match for +name+.

  def filter_methods found, name
    regexp = name_regexp name

    filtered = found.find_all do |store, methods|
      methods.any? { |method| method.full_name =~ regexp }
    end

    return filtered unless filtered.empty?

    found
  end

  ##
  # Yields items matching +name+ including the store they were found in, the
  # class being searched for, the class they were found in (an ancestor) the
  # types of methods to look up (from #method_type), and the method name being
  # searched for

  def find_methods name
    klass, selector, method = parse_name name

    types = method_type selector

    klasses = nil
    ambiguous = klass.empty?

    if ambiguous then
      klasses = classes.keys
    else
      klasses = ancestors_of klass
      klasses.unshift klass
    end

    methods = []

    klasses.each do |ancestor|
      ancestors = classes[ancestor]

      next unless ancestors

      klass = ancestor if ambiguous

      ancestors.each do |store|
        methods << [store, klass, ancestor, types, method]
      end
    end

    methods = methods.sort_by do |_, k, a, _, m|
      [k, a, m].compact
    end

    methods.each do |item|
      yield(*item) # :yields: store, klass, ancestor, types, method
    end

    self
  end

  ##
  # Finds the given +pager+ for jruby.  Returns an IO if +pager+ was found.
  #
  # Returns false if +pager+ does not exist.
  #
  # Returns nil if the jruby JVM doesn't support ProcessBuilder redirection
  # (1.6 and older).

  def find_pager_jruby pager
    require 'java'
    require 'shellwords'

    return nil unless java.lang.ProcessBuilder.constants.include? :Redirect

    pager = Shellwords.split pager

    pb = java.lang.ProcessBuilder.new(*pager)
    pb = pb.redirect_output java.lang.ProcessBuilder::Redirect::INHERIT

    @jruby_pager_process = pb.start

    input = @jruby_pager_process.output_stream

    io = input.to_io
    io.sync = true
    io
  rescue java.io.IOException
    false
  end

  ##
  # Finds a store that matches +name+ which can be the name of a gem, "ruby",
  # "home" or "site".
  #
  # See also RDoc::Store#source

  def find_store name
    @stores.each do |store|
      source = store.source

      return source if source == name

      return source if
        store.type == :gem and source =~ /^#{Regexp.escape name}-\d/
    end

    raise RDoc::RI::Driver::NotFoundError, name
  end

  ##
  # Creates a new RDoc::Markup::Formatter.  If a formatter is given with -f,
  # use it.  If we're outputting to a pager, use bs, otherwise ansi.

  def formatter(io)
    if @formatter_klass then
      @formatter_klass.new
    elsif paging? or !io.tty? then
      RDoc::Markup::ToBs.new
    else
      RDoc::Markup::ToAnsi.new
    end
  end

  ##
  # Runs ri interactively using Readline if it is available.

  def interactive
    puts "\nEnter the method name you want to look up."

    if defined? Readline then
      Readline.completion_proc = method :complete
      puts "You can use tab to autocomplete."
    end

    puts "Enter a blank line to exit.\n\n"

    loop do
      name = if defined? Readline then
               Readline.readline ">> "
             else
               print ">> "
               $stdin.gets
             end

      return if name.nil? or name.empty?

      begin
        display_name expand_name(name.strip)
      rescue NotFoundError => e
        puts e.message
      end
    end

  rescue Interrupt
    exit
  end

  ##
  # Is +file+ in ENV['PATH']?

  def in_path? file
    return true if file =~ %r%\A/% and File.exist? file

    ENV['PATH'].split(File::PATH_SEPARATOR).any? do |path|
      File.exist? File.join(path, file)
    end
  end

  ##
  # Lists classes known to ri starting with +names+.  If +names+ is empty all
  # known classes are shown.

  def list_known_classes names = []
    classes = []

    stores.each do |store|
      classes << store.module_names
    end

    classes = classes.flatten.uniq.sort

    unless names.empty? then
      filter = Regexp.union names.map { |name| /^#{name}/ }

      classes = classes.grep filter
    end

    page do |io|
      if paging? or io.tty? then
        if names.empty? then
          io.puts "Classes and Modules known to ri:"
        else
          io.puts "Classes and Modules starting with #{names.join ', '}:"
        end
        io.puts
      end

      io.puts classes.join("\n")
    end
  end

  ##
  # Returns an Array of methods matching +name+

  def list_methods_matching name
    found = []

    find_methods name do |store, klass, ancestor, types, method|
      if types == :instance or types == :both then
        methods = store.instance_methods[ancestor]

        if methods then
          matches = methods.grep(/^#{Regexp.escape method.to_s}/)

          matches = matches.map do |match|
            "#{klass}##{match}"
          end

          found.concat matches
        end
      end

      if types == :class or types == :both then
        methods = store.class_methods[ancestor]

        next unless methods
        matches = methods.grep(/^#{Regexp.escape method.to_s}/)

        matches = matches.map do |match|
          "#{klass}::#{match}"
        end

        found.concat matches
      end
    end

    found.uniq
  end

  ##
  # Loads RI data for method +name+ on +klass+ from +store+.  +type+ and
  # +cache+ indicate if it is a class or instance method.

  def load_method store, cache, klass, type, name
    methods = store.public_send(cache)[klass]

    return unless methods

    method = methods.find do |method_name|
      method_name == name
    end

    return unless method

    store.load_method klass, "#{type}#{method}"
  rescue RDoc::Store::MissingFileError => e
    comment = RDoc::Comment.new("missing documentation at #{e.file}").parse

    method = RDoc::AnyMethod.new nil, name
    method.comment = comment
    method
  end

  ##
  # Returns an Array of RI data for methods matching +name+

  def load_methods_matching name
    found = []

    find_methods name do |store, klass, ancestor, types, method|
      methods = []

      methods << load_method(store, :class_methods, ancestor, '::',  method) if
        [:class, :both].include? types

      methods << load_method(store, :instance_methods, ancestor, '#',  method) if
        [:instance, :both].include? types

      found << [store, methods.compact]
    end

    found.reject do |path, methods| methods.empty? end
  end

  ##
  # Returns a filtered list of methods matching +name+

  def lookup_method name
    found = load_methods_matching name

    if found.empty?
      if check_did_you_mean
        methods = []
        _, _, method_name = parse_name name
        find_methods name do |store, klass, ancestor, types, method|
          methods.push(*store.class_methods[klass]) if [:class, :both].include? types
          methods.push(*store.instance_methods[klass]) if [:instance, :both].include? types
        end
        methods = methods.uniq
        suggestions = DidYouMean::SpellChecker.new(dictionary: methods).correct(method_name)
        raise NotFoundError.new(name, suggestions)
      else
        raise NotFoundError, name
      end
    end

    filter_methods found, name
  end

  ##
  # Builds a RDoc::Markup::Document from +found+, +klasses+ and +includes+

  def method_document name, filtered
    out = RDoc::Markup::Document.new

    out << RDoc::Markup::Heading.new(1, name)
    out << RDoc::Markup::BlankLine.new

    filtered.each do |store, methods|
      methods.each do |method|
        render_method out, store, method, name
      end
    end

    out
  end

  ##
  # Returns the type of method (:both, :instance, :class) for +selector+

  def method_type selector
    case selector
    when '.', nil then :both
    when '#'      then :instance
    else               :class
    end
  end

  ##
  # Returns a regular expression for +name+ that will match an
  # RDoc::AnyMethod's name.

  def name_regexp name
    klass, type, name = parse_name name

    case type
    when '#', '::' then
      /^#{klass}#{type}#{Regexp.escape name}$/
    else
      /^#{klass}(#|::)#{Regexp.escape name}$/
    end
  end

  ##
  # Paginates output through a pager program.

  def page
    if pager = setup_pager then
      begin
        yield pager
      ensure
        pager.close
        @jruby_pager_process.wait_for if @jruby_pager_process
      end
    else
      yield $stdout
    end
  rescue Errno::EPIPE
  ensure
    @paging = false
  end

  ##
  # Are we using a pager?

  def paging?
    @paging
  end

  ##
  # Extracts the class, selector and method name parts from +name+ like
  # Foo::Bar#baz.
  #
  # NOTE: Given Foo::Bar, Bar is considered a class even though it may be a
  # method

  def parse_name name
    parts = name.split(/(::?|#|\.)/)

    if parts.length == 1 then
      if parts.first =~ /^[a-z]|^([%&*+\/<>^`|~-]|\+@|-@|<<|<=>?|===?|=>|=~|>>|\[\]=?|~@)$/ then
        type = '.'
        meth = parts.pop
      else
        type = nil
        meth = nil
      end
    elsif parts.length == 2 or parts.last =~ /::|#|\./ then
      type = parts.pop
      meth = nil
    elsif parts[1] == ':' then
      klass = parts.shift
      type  = parts.shift
      meth  = parts.join
    elsif parts[-2] != '::' or parts.last !~ /^[A-Z]/ then
      meth = parts.pop
      type = parts.pop
    end

    klass ||= parts.join

    [klass, type, meth]
  end

  ##
  # Renders the +klass+ from +store+ to +out+.  If the klass has no
  # documentable items the class is added to +also_in+ instead.

  def render_class out, store, klass, also_in # :nodoc:
    comment = klass.comment
    # TODO the store's cache should always return an empty Array
    class_methods    = store.class_methods[klass.full_name]    || []
    instance_methods = store.instance_methods[klass.full_name] || []
    attributes       = store.attributes[klass.full_name]       || []

    if comment.empty? and
       instance_methods.empty? and class_methods.empty? then
      also_in << store
      return
    end

    add_from out, store

    class_document_comment out, comment

    if class_methods or instance_methods or not klass.constants.empty? then
      out << RDoc::Markup::Rule.new(1)
    end

    class_document_constants out, klass

    add_method_list out, class_methods,    'Class methods'
    add_method_list out, instance_methods, 'Instance methods'
    add_method_list out, attributes,       'Attributes'

    add_method_documentation out, klass if @show_all
  end

  def render_method out, store, method, name # :nodoc:
    out << RDoc::Markup::Paragraph.new("(from #{store.friendly_path})")

    unless name =~ /^#{Regexp.escape method.parent_name}/ then
      out << RDoc::Markup::Heading.new(3, "Implementation from #{method.parent_name}")
    end

    out << RDoc::Markup::Rule.new(1)

    render_method_arguments out, method.arglists
    render_method_superclass out, method
    if method.is_alias_for
      al = method.is_alias_for
      alias_for = store.load_method al.parent_name, "#{al.name_prefix}#{al.name}"
      render_method_comment out, method, alias_for
    else
      render_method_comment out, method
    end
  end

  def render_method_arguments out, arglists # :nodoc:
    return unless arglists

    arglists = arglists.chomp.split "\n"
    arglists = arglists.map { |line| line + "\n" }
    out << RDoc::Markup::Verbatim.new(*arglists)
    out << RDoc::Markup::Rule.new(1)
  end

  def render_method_comment out, method, alias_for = nil# :nodoc:
    if alias_for
      unless method.comment.nil? or method.comment.empty?
        out << RDoc::Markup::BlankLine.new
        out << method.comment
      end
      out << RDoc::Markup::BlankLine.new
      out << RDoc::Markup::Paragraph.new("(This method is an alias for #{alias_for.full_name}.)")
      out << RDoc::Markup::BlankLine.new
      out << alias_for.comment
      out << RDoc::Markup::BlankLine.new
    else
      out << RDoc::Markup::BlankLine.new
      out << method.comment
      out << RDoc::Markup::BlankLine.new
    end
  end

  def render_method_superclass out, method # :nodoc:
    return unless
      method.respond_to?(:superclass_method) and method.superclass_method

    out << RDoc::Markup::BlankLine.new
    out << RDoc::Markup::Heading.new(4, "(Uses superclass method #{method.superclass_method})")
    out << RDoc::Markup::Rule.new(1)
  end

  ##
  # Looks up and displays ri data according to the options given.

  def run
    if @list_doc_dirs then
      puts @doc_dirs
    elsif @list then
      list_known_classes @names
    elsif @server then
      start_server
    elsif @interactive or @names.empty? then
      interactive
    else
      display_names @names
    end
  rescue NotFoundError => e
    abort e.message
  end

  ##
  # Sets up a pager program to pass output through.  Tries the RI_PAGER and
  # PAGER environment variables followed by pager, less then more.

  def setup_pager
    return if @use_stdout

    jruby = RUBY_ENGINE == 'jruby'

    pagers = [ENV['RI_PAGER'], ENV['PAGER'], 'pager', 'less', 'more']

    pagers.compact.uniq.each do |pager|
      next unless pager

      pager_cmd = pager.split(' ').first

      next unless in_path? pager_cmd

      if jruby then
        case io = find_pager_jruby(pager)
        when nil   then break
        when false then next
        else            io
        end
      else
        io = IO.popen(pager, 'w') rescue next
      end

      next if $? and $?.pid == io.pid and $?.exited? # pager didn't work

      @paging = true

      return io
    end

    @use_stdout = true

    nil
  end

  ##
  # Starts a WEBrick server for ri.

  def start_server
    begin
      require 'webrick'
    rescue LoadError
      abort "webrick is not found. You may need to `gem install webrick` to install webrick."
    end

    server = WEBrick::HTTPServer.new :Port => @server

    extra_doc_dirs = @stores.map {|s| s.type == :extra ? s.path : nil}.compact

    server.mount '/', RDoc::Servlet, nil, extra_doc_dirs

    trap 'INT'  do server.shutdown end
    trap 'TERM' do server.shutdown end

    server.start
  end

end
PK}$[��YJJ)gems/gems/rdoc-6.4.1.1/lib/rdoc/parser.rbnu�[���# -*- coding: us-ascii -*-
# frozen_string_literal: true

##
# A parser is simple a class that subclasses RDoc::Parser and implements #scan
# to fill in an RDoc::TopLevel with parsed data.
#
# The initialize method takes an RDoc::TopLevel to fill with parsed content,
# the name of the file to be parsed, the content of the file, an RDoc::Options
# object and an RDoc::Stats object to inform the user of parsed items.  The
# scan method is then called to parse the file and must return the
# RDoc::TopLevel object.  By calling super these items will be set for you.
#
# In order to be used by RDoc the parser needs to register the file extensions
# it can parse.  Use ::parse_files_matching to register extensions.
#
#   require 'rdoc'
#
#   class RDoc::Parser::Xyz < RDoc::Parser
#     parse_files_matching /\.xyz$/
#
#     def initialize top_level, file_name, content, options, stats
#       super
#
#       # extra initialization if needed
#     end
#
#     def scan
#       # parse file and fill in @top_level
#     end
#   end

class RDoc::Parser

  @parsers = []

  class << self

    ##
    # An Array of arrays that maps file extension (or name) regular
    # expressions to parser classes that will parse matching filenames.
    #
    # Use parse_files_matching to register a parser's file extensions.

    attr_reader :parsers

  end

  ##
  # The name of the file being parsed

  attr_reader :file_name

  ##
  # Alias an extension to another extension. After this call, files ending
  # "new_ext" will be parsed using the same parser as "old_ext"

  def self.alias_extension(old_ext, new_ext)
    old_ext = old_ext.sub(/^\.(.*)/, '\1')
    new_ext = new_ext.sub(/^\.(.*)/, '\1')

    parser = can_parse_by_name "xxx.#{old_ext}"
    return false unless parser

    RDoc::Parser.parsers.unshift [/\.#{new_ext}$/, parser]

    true
  end

  ##
  # Determines if the file is a "binary" file which basically means it has
  # content that an RDoc parser shouldn't try to consume.

  def self.binary?(file)
    return false if file =~ /\.(rdoc|txt)$/

    s = File.read(file, 1024) or return false

    return true if s[0, 2] == Marshal.dump('')[0, 2] or s.index("\x00")

    mode = 'r:utf-8' # default source encoding has been changed to utf-8
    s.sub!(/\A#!.*\n/, '')     # assume shebang line isn't longer than 1024.
    encoding = s[/^\s*\#\s*(?:-\*-\s*)?(?:en)?coding:\s*([^\s;]+?)(?:-\*-|[\s;])/, 1]
    mode = "rb:#{encoding}" if encoding
    s = File.open(file, mode) {|f| f.gets(nil, 1024)}

    not s.valid_encoding?
  end

  ##
  # Checks if +file+ is a zip file in disguise.  Signatures from
  # http://www.garykessler.net/library/file_sigs.html

  def self.zip? file
    zip_signature = File.read file, 4

    zip_signature == "PK\x03\x04" or
      zip_signature == "PK\x05\x06" or
      zip_signature == "PK\x07\x08"
  rescue
    false
  end

  ##
  # Return a parser that can handle a particular extension

  def self.can_parse file_name
    parser = can_parse_by_name file_name

    # HACK Selenium hides a jar file using a .txt extension
    return if parser == RDoc::Parser::Simple and zip? file_name

    parser
  end

  ##
  # Returns a parser that can handle the extension for +file_name+.  This does
  # not depend upon the file being readable.

  def self.can_parse_by_name file_name
    _, parser = RDoc::Parser.parsers.find { |regexp,| regexp =~ file_name }

    # The default parser must not parse binary files
    ext_name = File.extname file_name
    return parser if ext_name.empty?

    if parser == RDoc::Parser::Simple and ext_name !~ /txt|rdoc/ then
      case check_modeline file_name
      when nil, 'rdoc' then # continue
      else return nil
      end
    end

    parser
  rescue Errno::EACCES
  end

  ##
  # Returns the file type from the modeline in +file_name+

  def self.check_modeline file_name
    line = File.open file_name do |io|
      io.gets
    end

    /-\*-\s*(.*?\S)\s*-\*-/ =~ line

    return nil unless type = $1

    if /;/ =~ type then
      return nil unless /(?:\s|\A)mode:\s*([^\s;]+)/i =~ type
      type = $1
    end

    return nil if /coding:/i =~ type

    type.downcase
  rescue ArgumentError
  rescue Encoding::InvalidByteSequenceError # invalid byte sequence

  end

  ##
  # Finds and instantiates the correct parser for the given +file_name+ and
  # +content+.

  def self.for top_level, file_name, content, options, stats
    return if binary? file_name

    parser = use_markup content

    unless parser then
      parse_name = file_name

      # If no extension, look for shebang
      if file_name !~ /\.\w+$/ && content =~ %r{\A#!(.+)} then
        shebang = $1
        case shebang
        when %r{env\s+ruby}, %r{/ruby}
          parse_name = 'dummy.rb'
        end
      end

      parser = can_parse parse_name
    end

    return unless parser

    content = remove_modeline content

    parser.new top_level, file_name, content, options, stats
  rescue SystemCallError
    nil
  end

  ##
  # Record which file types this parser can understand.
  #
  # It is ok to call this multiple times.

  def self.parse_files_matching(regexp)
    RDoc::Parser.parsers.unshift [regexp, self]
  end

  ##
  # Removes an emacs-style modeline from the first line of the document

  def self.remove_modeline content
    content.sub(/\A.*-\*-\s*(.*?\S)\s*-\*-.*\r?\n/, '')
  end

  ##
  # If there is a <tt>markup: parser_name</tt> comment at the front of the
  # file, use it to determine the parser.  For example:
  #
  #   # markup: rdoc
  #   # Class comment can go here
  #
  #   class C
  #   end
  #
  # The comment should appear as the first line of the +content+.
  #
  # If the content contains a shebang or editor modeline the comment may
  # appear on the second or third line.
  #
  # Any comment style may be used to hide the markup comment.

  def self.use_markup content
    markup = content.lines.first(3).grep(/markup:\s+(\w+)/) { $1 }.first

    return unless markup

    # TODO Ruby should be returned only when the filename is correct
    return RDoc::Parser::Ruby if %w[tomdoc markdown].include? markup

    markup = Regexp.escape markup

    _, selected = RDoc::Parser.parsers.find do |_, parser|
      /^#{markup}$/i =~ parser.name.sub(/.*:/, '')
    end

    selected
  end

  ##
  # Creates a new Parser storing +top_level+, +file_name+, +content+,
  # +options+ and +stats+ in instance variables.  In +@preprocess+ an
  # RDoc::Markup::PreProcess object is created which allows processing of
  # directives.

  def initialize top_level, file_name, content, options, stats
    @top_level = top_level
    @top_level.parser = self.class
    @store = @top_level.store

    @file_name = file_name
    @content = content
    @options = options
    @stats = stats

    @preprocess = RDoc::Markup::PreProcess.new @file_name, @options.rdoc_include
    @preprocess.options = @options
  end

  autoload :RubyTools, 'rdoc/parser/ruby_tools'
  autoload :Text,      'rdoc/parser/text'

end

# simple must come first in order to show up last in the parsers list
require_relative 'parser/simple'
require_relative 'parser/c'
require_relative 'parser/changelog'
require_relative 'parser/markdown'
require_relative 'parser/rd'
require_relative 'parser/ruby'
PK}$[8�j_��"gems/gems/rdoc-6.4.1.1/lib/rdoc.rbnu�[���# frozen_string_literal: true
$DEBUG_RDOC = nil

# :main: README.rdoc

##
# RDoc produces documentation for Ruby source files by parsing the source and
# extracting the definition for classes, modules, methods, includes and
# requires.  It associates these with optional documentation contained in an
# immediately preceding comment block then renders the result using an output
# formatter.
#
# For a simple introduction to writing or generating documentation using RDoc
# see the README.
#
# == Roadmap
#
# If you think you found a bug in RDoc see CONTRIBUTING@Bugs
#
# If you want to use RDoc to create documentation for your Ruby source files,
# see RDoc::Markup and refer to <tt>rdoc --help</tt> for command line usage.
#
# If you want to set the default markup format see
# RDoc::Markup@Supported+Formats
#
# If you want to store rdoc configuration in your gem (such as the default
# markup format) see RDoc::Options@Saved+Options
#
# If you want to write documentation for Ruby files see RDoc::Parser::Ruby
#
# If you want to write documentation for extensions written in C see
# RDoc::Parser::C
#
# If you want to generate documentation using <tt>rake</tt> see RDoc::Task.
#
# If you want to drive RDoc programmatically, see RDoc::RDoc.
#
# If you want to use the library to format text blocks into HTML or other
# formats, look at RDoc::Markup.
#
# If you want to make an RDoc plugin such as a generator or directive handler
# see RDoc::RDoc.
#
# If you want to write your own output generator see RDoc::Generator.
#
# If you want an overview of how RDoc works see CONTRIBUTING
#
# == Credits
#
# RDoc is currently being maintained by Eric Hodel <drbrain@segment7.net>.
#
# Dave Thomas <dave@pragmaticprogrammer.com> is the original author of RDoc.
#
# * The Ruby parser in rdoc/parse.rb is based heavily on the outstanding
#   work of Keiju ISHITSUKA of Nippon Rational Inc, who produced the Ruby
#   parser for irb and the rtags package.

module RDoc

  ##
  # Exception thrown by any rdoc error.

  class Error < RuntimeError; end

  require 'rdoc/version'

  ##
  # Method visibilities

  VISIBILITIES = [:public, :protected, :private]

  ##
  # Name of the dotfile that contains the description of files to be processed
  # in the current directory

  DOT_DOC_FILENAME = ".document"

  ##
  # General RDoc modifiers

  GENERAL_MODIFIERS = %w[nodoc].freeze

  ##
  # RDoc modifiers for classes

  CLASS_MODIFIERS = GENERAL_MODIFIERS

  ##
  # RDoc modifiers for attributes

  ATTR_MODIFIERS = GENERAL_MODIFIERS

  ##
  # RDoc modifiers for constants

  CONSTANT_MODIFIERS = GENERAL_MODIFIERS

  ##
  # RDoc modifiers for methods

  METHOD_MODIFIERS = GENERAL_MODIFIERS +
    %w[arg args yield yields notnew not-new not_new doc]

  ##
  # Loads the best available YAML library.

  def self.load_yaml
    begin
      gem 'psych'
    rescue NameError => e # --disable-gems
      raise unless e.name == :gem
    rescue Gem::LoadError
    end

    begin
      require 'psych'
    rescue ::LoadError
    ensure
      require 'yaml'
    end
  end

  def self.home
    rdoc_dir = begin
                File.expand_path('~/.rdoc')
              rescue ArgumentError
              end

    if File.directory?(rdoc_dir)
      rdoc_dir
    else
      begin
        # XDG
        xdg_data_home = ENV["XDG_DATA_HOME"] || File.join(File.expand_path("~"), '.local', 'share')
        unless File.exist?(xdg_data_home)
          FileUtils.mkdir_p xdg_data_home
        end
        File.join xdg_data_home, "rdoc"
      rescue Errno::EACCES
      end
    end
  end

  autoload :RDoc,           'rdoc/rdoc'

  autoload :CrossReference, 'rdoc/cross_reference'
  autoload :ERBIO,          'rdoc/erbio'
  autoload :ERBPartial,     'rdoc/erb_partial'
  autoload :Encoding,       'rdoc/encoding'
  autoload :Generator,      'rdoc/generator'
  autoload :Options,        'rdoc/options'
  autoload :Parser,         'rdoc/parser'
  autoload :Servlet,        'rdoc/servlet'
  autoload :RI,             'rdoc/ri'
  autoload :Stats,          'rdoc/stats'
  autoload :Store,          'rdoc/store'
  autoload :Task,           'rdoc/task'
  autoload :Text,           'rdoc/text'

  autoload :Markdown,       'rdoc/markdown'
  autoload :Markup,         'rdoc/markup'
  autoload :RD,             'rdoc/rd'
  autoload :TomDoc,         'rdoc/tom_doc'

  autoload :KNOWN_CLASSES,  'rdoc/known_classes'

  autoload :TokenStream,    'rdoc/token_stream'

  autoload :Comment,        'rdoc/comment'

  require 'rdoc/i18n'

  # code objects
  #
  # We represent the various high-level code constructs that appear in Ruby
  # programs: classes, modules, methods, and so on.
  autoload :CodeObject,     'rdoc/code_object'

  autoload :Context,        'rdoc/context'
  autoload :TopLevel,       'rdoc/top_level'

  autoload :AnonClass,      'rdoc/anon_class'
  autoload :ClassModule,    'rdoc/class_module'
  autoload :NormalClass,    'rdoc/normal_class'
  autoload :NormalModule,   'rdoc/normal_module'
  autoload :SingleClass,    'rdoc/single_class'

  autoload :Alias,          'rdoc/alias'
  autoload :AnyMethod,      'rdoc/any_method'
  autoload :MethodAttr,     'rdoc/method_attr'
  autoload :GhostMethod,    'rdoc/ghost_method'
  autoload :MetaMethod,     'rdoc/meta_method'
  autoload :Attr,           'rdoc/attr'

  autoload :Constant,       'rdoc/constant'
  autoload :Mixin,          'rdoc/mixin'
  autoload :Include,        'rdoc/include'
  autoload :Extend,         'rdoc/extend'
  autoload :Require,        'rdoc/require'

end
PK}$[�L���2gems/gems/io-console-0.5.11/lib/io/console/size.rbnu�[���# frozen_string_literal: false
# fallback to console window size
def IO.default_console_size
  [
    ENV["LINES"].to_i.nonzero? || 25,
    ENV["COLUMNS"].to_i.nonzero? || 80,
  ]
end

begin
  require 'io/console'
rescue LoadError
  class << IO
    alias console_size default_console_size
  end
else
  # returns console window size
  def IO.console_size
    console.winsize
  rescue NoMethodError
    default_console_size
  end
end
PK}$[I��>>gems/cache/rackup-2.1.0.gemnu�[���metadata.gz0000444000000000000000000000127114364637605013455 0ustar00wheelwheel00000000000000��?�c�W]o�0}��0{�S>�
�,1		�@�eC �Pt��&f�cl��B�۹��ڮe�+K+%���>>>��(���拤�?a��B�Y,�Ldc���;(�[���<�bG��C�2iO�Ya�8M�Pm�����'���=!�С^��s0��l~n�C�riJ��;+Ѕ��AR>�1��ӣ(�D�G<ME�����߳-�M!��|{ϖ�j��,4��k觫bJ�H��:$��ɓ�>�����K�	K|�kM�	���R��(�+�
{!|C}�`��_�����O����(�P�5�B�w'�k"�8G�ر�����e��Ȁ>����*�G�S�RM*�Z�B�d�{�ߍ�#o�4�^�+��s����K􅓶�.����m�\
;�qo�MW��J
d�l�l&����mC��^ĕ� ��_gc����*�ګ���+<)*�Ӳq�UN�Fv���R�C�[�(�/H&�u�I�P��ٓ�N�EՍF9��z�$�u��E�QF���zM_�|�4��<�����4>�R�F�Y?%M?�ä���,��o��/�2��]snٴ�Un����[;���g�D���=���|;Ŷ��	�2�T�9.���U�1����?�t���'N��ɑ��{��&���jl�Ǭ[3�^��t��~data.tar.gz0000444000000000000000000002611414364637605013376 0ustar00wheelwheel00000000000000��?�c�}�v7�`�.��2!�Pԇ�/�6%�mIԐ�G��M;jv���9�߾��9�o�>��}��$[U������q�L�4K�(��P�*T�lwͷ���⛯�������o��O���ƃ�o6��?�zx���u�۸�7l��?�'
B�T.g�;��T��?��ʽ�(��F��{��h�,����}��0}�=:v�}�i�Џx����l�}�X�}�Y��Xs�\G�R�~7�}�_p��K���#��y[�Y�ā��G_��nm����o=z�y��_��+��n|�"w�}�8;�؁=�n���-��}6�ls}ss��_g�%�[�;��8�5�ҥ廬����������V��K��c���P�DB��ҧ�GH��+��7�N�K�Mu�͚�Ts%�NJw���a��F��O�Ç[w�����ܒ���/Vp��e/:�Ww�o���*����R����Gw����,��w�B�݅P؞[����K>���y�f��])���g��������������9Z�[a�KM<���=���w2������7�j���v�N4�S
�����l�#v_u�Z1TD��,��sf���I�l��(������b�ȭΗ�bQ{�� k~��y�D�尙̠��8[X�+��r4�����=�6���>�|[�f%m�e����La��>_���ș�,1���z�Pl�@�
���)��L��"h��#H�@���aC�y�O+@2&��]I���7,��bb���\��i�jkr�vH���x���m�wK(��	���3V�u�M-'�
GT��8<����7�sU�O��*
��:9%J�nlv�wc�ӝ|���_��@��8��Jھ�qk+�s�z>oh��GW��4F0k���:��7ɞ�E*	/�#$� Y⛴P��$I�l�/0�&�D�Ϛ�D�m��
�Uc1@���f��:�;h�`���C�=N�$o*��~������}��]]Ds'�I
�֘���TcᓰҚ�ܐ5�6w�Aނ��~2�²k$Ef��g��� ��ǖ�[ˏ̋��,e�J;	�1&�G�h׋��Pl�d�5d=ƞ��ѓ
�Rg�2�� ���2�ٔ��\��RU�7$�Ԭ�4�`d�[��x��K�l̵��eM��UK����~Жc�:Ͳk°����H��l�"g�Vp��D��>�d+��1���n�v�(��Ê�0�hd�>@��ѻs)'G�s���mK�:���
&&rP�A�ǐ�D
*�+l�[n��j3&Y�X1���)��M�smPp��v8�B]6�.�G6�jRN��9E!~��3m�煂�n��;'�\��@3Ō/=~�U��W�_�X~R2Y����^�)�vGz9���'v�O&�O1�����V���.��`F�7,������Y��k;i��t��Z�}f_��/ Vyc�]�c�R�Uƒ^���
����R��M���6�/�s�m
AD�V+%���e�?�y_��o��z�{�����_��˱y�R@�M�c҆��\�.*`��mVg�/L� �ѿ
‰�6F���0��ݠ�f	�i;����P���������`p<��
�G��A���`�\�!O�����+4E�eک�%P�fVmD�	l�UM�=�st�v�ހ㮧�ڽ^��7���g������a[����<u���F��!��yur��ƞ��,A�5�_Ɏ^3I�׷�އa���BK	�`����[�}	��6���qF���h	��@#�
mԮ���PVM7����
� ������ރI��*.<�z�Y�ʮW�u��VM�f.l/
`O�Q�i������nBPY]hͰg���E�E�E����2T��p:L�ӕ��W��E�7ƮJٿR��*�p�D1W�[��	F�+��ꈛ=ciN��s�vF��O<��C֥��gWr�i�~:�����}��S����w���?K`����K־-�%G����U4(:��J�����^�9�b�[��o�^�)�S�4��Q�b�B��A��8�/~�^���{�lE&�pq�U��2�CUo� ���<μ �zz3�mu`3�8�[�
ݵ�d��m��ꤹc���d[^@}��P�T��5��{�BU�^
[����?��=?z����:�1H��v� MG)���H���%'�AI��S�7\~Y�̕�Ԙ���S/<3�k:)cK�;��OT,`>·t�<Ӽ��,�:/,Ǟ%v����ޠ�U�~�f�������ʨ{�#Ԅsp�u�粪���ZYWg˸.���=�>5�G�}u�"2�B<@�ڋ�i�67ih})!_ݨڮ�0���<����,� Z@c)^�Љ�������yc���P(ڕ�B����g϶���-���EH��$Đ�Z� ���%}��#��t�η%��—�H��x���h���'��Y䞛
-���ӪP3�O�������F��T����H"�ϸ)Ό��J��`��l%�u�=�{(i.&�`�h��i	�^H�6�n�.�5��=�V���N|��&6�o�yh
/,?�1���mҌ��.0���Jۜh�n�EIB��dH��0�71�AbP[�"0iP���fR�`P����օu���k��A�^d��j���҃�ãIz�G�ᷰ�Y��r
�*F��%z3�YG���Y83�"�C��ĭ�oY��2����OI+���"t�ݟҩ�ͧ/nw+�!�@����X�iGx.;81fZL�!dlo�X��ĂJT�(���yv�O-���"�k����ܮvn���m��숕JX	x�:��s�W�N����c+�
'"�T��f���qΗu����X���tZ䇸SR�
X� xi���w��())Ƃ/��6�zϫd�4*���b ف/=tZ�1_��)NE��T�9��D�
!X��eO�`�
j~l���0**��o�@�TC�����yk	�~�:�Yh�Y�W����Bo�9�tQB�ˢřVNM�A��BjwGO:��q�,�o�>P�YR���2�.�;��T3��$̽��*�(����7v�s�,WԖ�My��	XCV��
<2�p��E�)�"���&��>C�Zx�4}�v��E�B}��(5�@TT+�0
N�eWgIdŸ�}�{��9�����n�_���|�qw�����f�O��nq�'�2�}-dv%/��؂Ōq�`�{B��ŁX�Jʆ�/J�GY*�'ȵ��f��NؔA{���2���v�{�l�t�<�u��5^�og����/�����_�O��'�._���o��ww���G?��O��[�?����������𧋳����'?X�޿��_�޽�\���7�{[���G�\���~�<�\����
g��a���z�j�錬7����q��X<8�\�t��5��y���8���Ï�u��`���a{�q���o�n���e���vAYhD�(U-Ͽ/�N�O�^s@����Lj�`��^�%	R�xk�<u�E9��Nܘ1!��J�O���sl�a�o�����Y��}�xƄ��$�3LV0t����
�֦�d�aX�!��Q�4�C�?�
�cۋ�{O���r=����Ӆ�%
Pܞ��Wy�a�]Y����*�'�zVVf����^0���T]�`,�/�;?0��OH;�ˑuO6�����߃�d�CXrk�p���g�e�Wuէ��*	mK�R Þ<�A_+�050>_�'b�3��Ӱ����ԅh�h��_F�VM�G���p�A��R�+_�b�-�jP��_�ˮ��D�`�Г׭l��6���Cȱo���"�����J��?�*����ͽ���:�oc�|�O,�y�h�	��_zv
�A��*��+��Wnͩ���]-I�4��ڷ�8Q����A{8�����r��Mֽ�nU�ͼ�!�
P��C�k /�8a��&��,�b;n��W@+�#6#���ju�G�M�d�	�5cTw�������7�o>J���N����"\X>���+���B�	2v�(���潏ͅ��s��wv�WH��P(�Ҍh3��P3߅|�@A�Y�/U~]A\�-�#2&�0L��[O��^\Ԑ������9S��W\�^	�a��1=��-��������7B��1�\�(�
�3�dB|����=�G4��G���N˥t�̬��M�B���u�4ZA����tut�U�'�����r�A稍����!�B��؛�r-�̓.����l�=>h�kw:G{`�`�؃@¨%�D쪔��D`9���x���-O�3�Vŗ��w޾�k��5D��5�|��xRK����)��+�]���=@�9��.��g�طaq�X�ֽ���x��q��tʐ����n�Jn?�uDG��G�N��t���K��A��Gn#V�[K���0�{t���0�� ?��3s�TcDe��tZS�
reIˣY6\c����9���Z�����:����̧�=���#rg�&�>��E����e�kѿ-�k��YΥ�H�@nl�m�`����^������l<���%8�5��y�����הKcz ��[V
g���W�T�\QA2�Q�%�O B�:Z�I��a�h��Y�Ex��F�*�b!�X`��#�ÿ��Q�W��E]���m� 7w�]����'��ZoۧX�׵=�K`� ��J�u��$A�&�*�`��e`�}�~�V5���
B��'��p	��e�\4^����[��ttJ���6X���\g�{S)>"���%�<?^)�ru/0^�������^����j�ar��N�+Co�ܞ�<-z���v|�%~1a�K3<s��M<�ä����u��dV�FE��m!������A���ؒk���m2�SQCHKv�'�
���j
B��;{�6��@���-�]�&K��{lǾ!%r�=��3���~�u�F�����k-�_Ɣc�.�mN��B��8ܸ��y��#�#��k1����Z�����Bl;�=~�`��0o��)(�D����;ey�n�P�4���\�KR찻GxK��eu���\Z����yp2Z�/�'��	x=���v��	�n��_��U�K�,��]�1�)��W�k��`E"�J~p=}n�Nw��v�C�v��3b��r?��x(�������Bڋ��[i?bpo���t��o\

�Ui�Ƙ��|�����Y�Y�[�vz^�����J�Ն0q����׬t0�L@�yC�Y+�F��h�i���񢒆,��V
��)�'y�ȩ��<.�����̟�$�q�V��i)�� ��oѧuF��O���t 0
u.��b�:Sv`,�웉pUHe<h�fre���
�ɉ%Qɤx0�ܓp�DM����Kn���ߪ��~Aղv�7k�]o̭p<{^�ե[a6�{P�T	H��C���:��ZW �Lg�"I@7Ӧ�2c�]����
��Lob�m�N�")�Ĕ�2�E�L77���a��X�_�NUS�M�"�y/����[��z~9��UW>gLq퀖c媆;�ܟ�ͥZȬ�rq�>:"0S���*����}�(e��<ª5D`��
{I��z�+[����ƄN!����(�G[�K�)���ʚ��
?���V��E��=Dd�X���
E?�����R$��[es��T��7k��b�Us��UE2[�eɸ�Β9V�1���DM匯�\�����U��=u7�
E+ӭ�g*@�"V7rE߮���Pr�؏\����
잎�.=ߙTN��48�u�?%�J�'Kj�/#B?&�u�r�6��Z"C�1�$�̄b�	�ҕ%s��B��x�Za��C賦bV��<�ex%�^���諑�K^�?JX�H��}�ɝ�V�:�%-�7F�2��������S�N�4"��`��4h"��1�T�e4l4�Pk����'��+s{����t��X�>���Iq�
��F��3�H[�jS_�lU�jQ�Bx@n�:3}�u"3�;3-,o�m �z.�.��з�qjp 撒�$�6�y0u�H�K5a��A!ŵ{E�����M��R8�M�A�:k0�$=��V�hl�j����X8[�u�i�bp�:�UA
���
a����q�lI�ٶp�"ȴ?�����v���v�֖Z��_o14�i�ZS���@���:Sk�K�@�y��F���*����p�搓gO[���+ix!���}
��c@V�֪�*
<d/6�Af��k�\:�t��
G�C!^ѩJ�P^�ڨ��T���oW/���m�D�d"��ݓ���<��*��q�m��6Z��-�?�z�">���.����Jlu��!�g�BBs]���k�xv1��v� GI���ְvP�����5yQ-i|�F-���4�Ed�������&
�={�Pʹ��i�Z�����j��:�`���Zd;�H
2���X?��S�J1�ȋt*��Pѵ~I�TpU��j�e}4Ѥ{���Ο�ԛի*,j�c��0�~8Wɽ��\$<�5��3�Nu_���?�]oλ���Z��	]�O�$QI�;��Mɤ,��MX��k�5Y9��=�C��B/-P<�κ���� ������@�OkeM��hq�"��T�u�
����1q���uuk{
��آV����&Ҧ�s���r�ᄚi�X���M׷մ$hG�aZ���Kk�0�^����_����N�Ş��ͭL��xcdɘ9�P�S�Q��c=[} en�O�A��X��+�a*��9�֞��$#ȟ���u�9̕���D�^J��*3�k�-�%a����%(�!�h+(�Q�8��Zc]���*��
f�4�~�*�d��3�Zr���+5��ܛ���H�t�-�be�H�E,2^�h�����^�-��|b�������^F�(��0�J�	C�rQ+1�V��2SLD܊R녶T����&Ƴ���C��c�a��U�N�z�7�^�1N۳D��DY CR7�y�AK:#R���`T.����@ >6�Uj�Z�,6��"u'��	��
PFnU����t~L���ra�J���O��N��U�D@�n?UYsb_���3���C�l�h����U�Q��ﮐg��ٌ��:���K7[��-�-s���L_�8anM�a���@���3��L��&�A�G�1�PO|��ў_�6� �5�d�K���5���j�i�a�,�y1�4�R��BB�r^���?��:W�)5n5�5	y�d�8�!+9d�����n���n5gؓ�H�� �3����͌r	ÑB��
�kݻ���y��I+��ԧQ�L/�lAJ�5�{���|AΣ��閠�֖��P����3gCt%���0�
���B]*%�iQ L#֌D^a{�� >*F�B��9�k��a\!�b�+��t�p�_a��ؼ4�y���=��m���8�ՋGnN(K�hdd����Z>Օ9=r)�a>t�
���
�kf�M�ؓ\�Nխ�a�&U�ŧ�ok"�	.�����JW��*cDr�z����q���}��d�GKЉ"4sfu�(L�w��^����C�Җ�����<Bm��j(��u��%w�䑂��AC�[�>��^I�W���̠��W��}�.��j�[�%~n��{�=��u�>���;��^[���Y�Z�*뻦Q\�n+�x�w>�|85QH�H�s�]h����ӓ�*Е�<{�n��B��$�����*�gA���X)H��S�$����>���6[/e&��[�#����f�@��jE)�`����S�ɭ~����g���pL�4Ć�ҽQn��t�����!��ʋ8_մ�D`��
���w�������������3��x�'�����Z�$��:�U
�6��٠�`P�e����[�S�c��0�B��ޣ�[z�Gh�� t@��>:�;�(�f�5�����V��Y}������O���Τ�q[��#۵�%���3����x8�AQ�G`��Fv8ԖT��UPr8��Q��/�^��L�������P.�m�Cy����K��2	jk�9_�U�槉Z����y�*��� *�+��R<�:m���0g��<G8��C��L!I?���?*��E��*���ԛ��3bd��'��a�`'������:9�b
&���8��"�H��_�6�Zd���%}�����gثU-2���S6���~������A�����2Ŧ��ɖ|�=S��:��
�k(ꋿe+�n�KF��g�Ё��%�7XX$��\� ��'u�Dܛ��1/������U��(ƥ���L\j�q1���ԛƺ�rŕ.g9�(s�`F4I��;�`�>y&�	�=�&-�
1�iFߠ�;Z�0�8�������(��z��XƑ�+kw_J�I
��9������˾ad�?�&�Hv!�vSIU���ż�*J~Zֿ�s��r�NE�$,zqV1Q�#�p#^N/�lW���>7.D�ko*��dY�tU���@Ԕ���d�bkI+Ri�T%�5�4��J\[����uqSK���FxSG���<L��5@�����L�-�h6w:G�އ��ww`�a�&�vbv��H
pA3�#��\%�(�ad��$ړ@���0�,����l�c
�93�[a5�
�?�z���9��sS
��	����"����h`r X�P���&z���1��O`ܩ�(E
�S.eЅ��T�ɁhU��M�)��`F����'�{��Ndb��j�VB#}/����u9%%�)�Jb]�NS���Q��u�6���B�[��Hk�.<[�{�x�`H	v��~��W�������9x����!zj�a\������%o�o%(�c�����,���}����M<s�kKy1u>�J������PJ�0�Y9��S�0t����k��eW���<�����w��D�p����BT���,�u����}/
Wϋµ��T�73l.�ݩO�{v�o\�`��R�^C|h\5��ii%�
a恧0�I�=),�NW٠��T�_e�ƶ/��qЊ��s�|]�iM���"n�}��'�3^'&�a��Яm�Ь��}&�N���nr1�A".�d-�Y4{��0��䵹�%����ƒs��w	�5�p$�D<�>YO�W9}/אD2N+E<�T)W�12M'�
q쒆+�qt(��K,�����5
ʫD�������H2S�Z�fH{�	I)}�g�6��"�#�64r�a��Ex3wbS��ͽ-s���9��7����뛛[��-(�;�����]���t�0��fc��^��8��y�O�^7��ͭ�)�����G��ͥ���돀�ן/pkƎxtn��w��`ء�W[������}�[�Ÿm�,t��)���@�ƺh��Y.۱B�]g�g������_q��ƣX;��"��^0�,v�y�>�&{c���l�� ����u r�#�>���z9`8�֚�
��y�`e{{�H���l���AW���"�Y~�v<?�T��7é�]��Z�~4'�#���{���y�Nra	�t��}��"�O����A/�Q��#�&򽉕�R߭�5�EA`��^
|~��{��9/k��o��c�^Z�@����g���s����,��u�‚�؛��^�;�`���� Dg��A�n�ΛL
�x�q��@�Ȳ����_´�ܺE@5�)�AH����g�o��ʖ�K�bL^�E{օ=a�ܱ��YS.���x�o���E���凍߀������'�?���b<s�a��Lͽ0,��<��/r�N
�LA��zE@���d!���8!���bfs��?��)zc}��ۇvr�H�h�^�<���X!U����{�gE0@��K��ؾ
����u��dE䉾p
���z�Z�Bo
���l[�\�����jg�ܴ� �������w�Z�����~��o>�" <�,u�P�X�̑�
Hl1�ޙB��1�O���r��3D'���2�Š<Ä���~����[�+�H�M�Kq����7���2�$	I���Y�/k�ku���rJ2��*��8��H�#�VՇ��	.{ 7=� (A��u�u�*����Ӱ�DӬ�&66=�0�#����Qx�fhէ-؀7�5�N�`@/$h(ID7�/g���JS��l��
��Q��%]�S��6�\�!h�Je������	�*P���dVeQ0��KU�!�8!K�O�%��-��_P�j�`g�۬�}9x��Y����u��{����s���w�ݷ�����d���M�h���?��>�J���N�u�v�b�o�����5w@w�F]�ʦ:�>6v�����ck�s�|��^vG���n���q�7��=h�����q�߆�٣��K�R��6�Wx���0�j�up�]�Zo���v��z�W����L�}���Z;m�j���9����a�U�ju��^	�v�~_a-�ow�f9?�ӃGLy��U�w��:k���+���=����P�K�@���hI͌|~�o�
��v���ce�n�|�<��]�&�����ol�}�����a\�8��L�'6(>��1�*l_$�ZUq���sD�ɽ��$7�-��J��n������P}M|�O�Ec��v�`m;��Ț��FpqV���E�n�\��=��˗VVXmD�!�`�?��o��Sn?�,�:�R���f�0a}�r�}�o�dF�҅yϜ��4�қ��J:��|\���c����X˅M��H�B�ߤ�yH>6i��@*^�+��]oNW�e��C!+�J�o��1�6�a��P�\Ĉ�@��X�#̀�P�*��͗�.�\�pk��}l����h�*T��(Y��ҚL@�e�
V߂��Q0Sچ����<%!��yL�q�Ԫ����(�O�Ǒ���_q�������6��� �ߗ+�{ ��`n��	N�k�7��2����:)��������������ZC
��checksums.yaml.gz0000444000000000000000000000045014364637605014621 0ustar00wheelwheel00000000000000��?�ce�=V@���"�o�[�����Z�Ryz7)��cfn����
e�^�ׯ�NJ{�|��^c$A+���4��2�a���0�h����n)�rm�V��{|?y3=}�kMG�^���Th�LF�W����]����f��)��|"D�e�YK��ljZu-i���P��G��d�u�3�q��/j���RF3�m��.�4цaB��Z��oN+9p-^�����r.qT�m2K�uB���YN3�5�G�S?�`�R὎��[�I[@8���As��*u_~�
���PK}$[�"����gems/cache/rack-3.0.8.gemnu�[���metadata.gz0000444000000000000000000000230414442217575013450 0ustar00wheelwheel00000000000000�}�d�X[O�F~����%���-!me�Q	Y$B�>�����=ݹ�saY��o��,��]����9gf�s�s>�1��b���7(]v
2ˮ(����q�"E%d��r݂�(�&�ԩ"B6F/�Y�]���H��DԻZ�E19Z��Kn�TPi�{n �
�7��Q	��eM9n�˯��_ijo⯏�l��?���1h@1P%���1�7�kD�y)���CA�D�rS�^=��x��������Y����ڄ��d��n� ���-��5�U*,<=߂�`��XǕ�9�aٹ����W��#�4���ƾ�	0��߆��%|��G�f`K��
�@�+A�Y�rT�6I���yA
���h�h!�p�,h	��=�VP�4�qm��K��5YT�y{ss��Mʶ��
�CX�Z�\6
Ȋ�I���x��x�3���[Dž���˳��M,��Aja�nV�,�9��z�V�gHn�ȗ�:.��p�^�`�UpZch,��H�a�H�L"����`��n��O��"��ҷ��l�;*�`�hhn�.�� ���y7O$��'o�/N���O��7Wg��9�h%�5O�����M|~v2��������$~�HIL��)
�"��E��Kk���6}V�l
jy9�`�ڱ�Ӥ��ܣUZ��G�P̽�c0���l�㥸[�6
CImI�GY{�6�j)�]U�}4ҳpwppW�����B�(���k��T���п*��#d���h3�8:D�-a'��hhVe"����+9�Q	OY�t��^���lJ.G��A�O�T��z�P��X�n�<�@��������n�o��H�|"�1]���0�5��r#y{��|*(;�a`�o*���\5~��+7N�E�0ᜭ�
ip	�гSZ�AΏ4�5{�ل30���荐�
qF
��Gr��ZBC+$�s��Ҵ�E����6�$�T�0#���GX�8�
���U:�L�
߿Sʭ�D�2|�S&���E�M�8�T�5t��=iG��F���:�j��]9�3Z{SB^jO#��8,�
֪kC̢v��.��l�����`a��,��=���kȾ�����ks�ar�̶AT �$�m
"6���~Y^)$<��Yd����(�^Jj�9�����8�cL��b�S�p�_�u:�(data.tar.gz0000444000000000000000000031257414442217575013403 0ustar00wheelwheel00000000000000�}�d��vٕ6��QT�-2��M��L�)���DIY�_�"@�$GHAU�V��?�{ܫ=�I�z�7�'���%��]]��U�L"��7��^���nO��+����t���#��������t�[�����[�{�{�~gko�A���yf���qM�i�������Qp4�Q4IG���d$i�&Q���H�b�,K��EpS�^�|%E4�D��I�^��2L�4	����4,��z��<��p0��8M���&Q�GA
�,J�Q��(��n����E1�67o�K�7����t3J6�ڝvgs��h<z|ܡ��?�`�����촶�6��mx�G�"��Y8��(�ig�8�A��n0o���ēnpN�Q��?>���=wQ�y�'�����l>�l��F3����h�Et&��
����Ңv���G�;n�O�{;�?��i<.���%�x��(Â�8y�-u8��Ωu�=��9:]�^���a2��o�~�}O�"�����w�����E������.g��`�ش��k���]�E43k�y��5�<�5���nP��|���[����mt>'I���9��t>)bZqq]�[�\�N�)m�Vo���`[E�b���־?�vkwwo���?���'I����Nk�3�E�R��ߝ:\���/�I�E�uoQD�?쥾۟�t{r�{���۠��䲸7'���I��,�9.o�+��������U7��Mx�<�{N��"�˜�}�eiF�~D��E؁PG��ϳ�ppBK�Mo,���D��&�R<� G!�`�^��:��N�[|�:�)AlWVL�<G����룳wW�ﮮ�~<?���*���{}���K��?lI�}^Ro��iQ�E>m`�ǟ�f�o#Bq��[Zp< D@��x *����s`�*M_�=��t�f�O�ԧ^������6=>|x�#�D��8}κ�<'pLҤ5�fY�A��W�tHM�Q�y�N�;9����JЎ�}�_�ݨ�����_g��~y��y<\'���q`7�=���l��Q��$D������O��DG{XuD�X2!rk_E>�&w<s��,��ƄZ�(�b�^:���іwx4;+1���9!�g՝W�o����$Mo��ЛM�s��~ۮ�B$��� 3+���:�*>d�l�ӌ`hF�=�π0��]&�A�H�C��fЍ���}bX����YX�W��.����z�϶v�϶Vb�b�y���ʻ�pc^�v��*5ݕ�<?>Rv)gZ���و�5�!t��8-������<`�{�q��I
���`WA)1z]4m��l^<p���{e
���8��q4���sy�A�9���9�G	��ٛ�t�9� �`y�*���EE��3�?=S�=#��|�2 �҂<��tBۧ�__9f�>�E�[�;{]Ԯ�o\�W��f3:-�ք�?��0K�DI�o�%I����R�� D�#9W�C:t�	��ķ�@Š.�4OdZ�Ƹ�E�כh�3iN�QJ�j^�o��߱uC(���{��i��I��vO�͘�T)1fA�	�5Ƹ>�(͉���SX`��#�
�%d�ؠ��L~1	֣�^^�x�1a��i�x���r�����$wE�q:�B�9$&,�m<��ށ���a]v�4����X#m�8�o�K�n6��j��}����ܛ�:�"> �^�]��m׍o�Qw����>qO�l�\�$���u넋��n�(���4a��	/�/~w|q}~qvuvtv���S�RׯIx��
����H�.��:L�ܾ�ƈ���;����/B=�6�dHO�}������&�p:�pN�3\�iס:�D.�I��dѾ���u��批��c�W概Y2-�i:����~?�� �o�����yQM�7��b���+_F�P���{�8pl�y����@��K������J��v^Q��H�P%(��T^M��1���
MF�����n��[�O�L-�����l<
c��^A���?�����0�q�y0� W�8	t�Ҕe#}��t�J��;#\�9i��m�mx�zI�;8�<zs����Û���ӓ�+,�B�( [�O�c�Q�
h�q�Į�}�M�����:�atG��
�
B���&���XD���W��һ°�j�8K�<"D=H1�,
F%�,�F��|�����v�rg	
N�e%SV֭���;�}T�R���H��L=����N���㾌2ZP����(�7�E�l��X�)"X���?p��5��#(�J"�ä���1�Ĥ(k1���%���4(��`��~]Fݎ���~8��i��`NT�
Y���	&�=s]X�y"ˎ��_"^e8N���������`�(h�R�G�	�[0P�ū�`{�9tG��,'eȭ��>Q�}�?{z�Ð0��u bC�Ce��L��d�&ΕՖ=�Sŷ�o��[��Ӯ(��C��z��)��.��<gu�Uw"��a<"�_��Q���$gѱȻ�_c��<�m�e
�o$���2+��ّfO;���U���x�y�#���a�=/����	�8�f�_�(�p�}�Jt/��a�0���0����DS��{��4��w�
/����GD'��0
�Ao�`y|<3BB�Q�n?Q�n/2��Wqh�=�����æ�v<݋	m�CL�$��rf��⽚�1<U%=��YHЮ����x�����'�^Gl�<.�ow��P9��ae	O�>l�Ԏ��N&���ڎ~ƬK+���hF({�y)qkK4��z�Ƈ�$�ȏME��T�����DԲ�\�����A(��0K�N�l���4/T5���J����Hu�3Zˠ���I��1dGX�� xu��^~�l���Wĉ��>��*l�2�*Y:���6+%�a�,���<IÁ|5���@`�Y^��t`S Y����]�x�UV��v$�V��Q���G#���q�Q/�	-�3�?��<�n�a-�U@��'=1��"z��-[}X�ELf���`J����!�Z�.�e����lؑd�Ω�2(�nZ�D.~��3��֛��<�w���$B�Zf@"��~���šО ������+W���vpp�fG�9�>�Vzq;~�;�]��4r�Qt
e��l�9�E����cz+a���DC�;h�o�xbxL��[ӡS;�-
�����K�qcc�1�և�1w
�%���3�"W,f�<5��5��>��Q��S\�&�g�h�"����$�ϋ�ޱ8�
���֝�gAwiv�G�@3ľ�!�Lϸ��~S[������ͩ�b�'l�](�#�@r���6��jz�U��{�2b��g.�0��}��)Z���0�����T,�q�z�U������|�j=k�����1�i�0�VQsR�Ԯ���u?����b�f�"���YDm#!~��^	v�;v$��p2��՛.Ia��}9,�a�*�=�< ��� S�Ή�����a�NՎ�2.�P_���u�g�PSB1��I5��P�aE�n�,!7���F���0��r!�Ō;C	}��ݧ�	|��vE4��N�
��[FbSB�l�?z��h��%�h�<�������&�Ô�E�=�j�F�Јz݃uV�
��#�E��>�8�T)������gG7�a����l��n:?�ug�ۀ��ԙvpu��@��JR�p'}9���]���&k7�����Y���z��#�ֳ�iڨ݆ȏ�T�m�����S=���K��%��M�h`T�Zwj�Y�
}UK�ѡjs0�����OkEc�I����g!�4�Y�cn��Z�� �\D���5����{p���"gxR�V�a)��t=�^�~�zD�l_;3�j�e�'¦��{�����SU;M�7a��v�O��](�xG�O���ᒱx���5{�+�c�q���@��g~7�E��9!4�ل��"����ΚO0֞��̸�Fb�&L�Io�(H@���/<�Yg7�g6���SCn�C�wy�8�w��&��]_�{�]7�?���N\�W����"L�„�~�0G-y�MJ^�K�/��u��nu��v:�¹'��{�n"1�v|���P,��@\�U�eu���
C�D�H�o���d�=
����=���L�Ny<�����ߎ�l��c7Aߟu����#���8"�7����
�x�N�5�.u�'b��U�������cp$7B�ͽu�:�֭�e���f�N��
n�����_���Mx�nsM��f���'��J�>3����bQ>�������>�Ў7����y�x������s�Ќ��A&<�#�nĬ6$2���z�t��;�vg	��
��Ɖ`�ՓL�i�a�&��S��1����݊BCg{�0����k��9XÐnb$@]P7�Ě	� |"Һ6O�=�X��XqƆFY��.GP�M8�g��O>m��|�r���<&�[�_�/���Y�N�R����/�̖0������UH�g����Nģ�R�mo��+�߯���;�>�w��17J
����g*M�|����TԹ佁K^�;��$y�@n?º�P+�U��*
�,����ɉS��%i={qre�J�'S�Vn#>�M��,P}��{�;|{�4��]\�i��͙x��e>} :x��_�a�����ʺ�R�50�e�(�Ɯ��@}*�оK��Y6���b&�o�)���wğ�!
]u3�{|�V�7tY�a�W�SG���
De����5�o�����O��=h��0m����D�OO��h����hA�b�U�����6u�^��/e���6F�i�����$���
�s��U�ʚ8�� r�o��։Q���A����a/g��E�x4�G��0*k���Ɨ@�W^����
�b��Ւo ;V�}���	ѷX����)㍾�S1۰}�{����׬�]C1����
yX��5�,�K��U�H�K�-f)m���ʊ1c<��X8:V����`*��c��w�%�k���:U��&���X=M�OP�|���9;h9…�M��x���Y�tث�.�xDwp1�W��d�/�uT����3i�R��&���K�4�ɰ��d��[���藷P�Ő&c�5TN|Q-���ͻ���o�Q�ϖX�	��Dt�(��������d��Oj�+�z7�h(^U�̊�G�B4�R<%y��r&�#ף���*_?�8�o��v�q�Ɨ���q��	^j��%���qUm�òӯ*���N�Ҿ��D�4���8(�ˉ"�*�n=X�������D���ݧ���g���
e�
T����X�5n�#�P�s�A�p�b��x��I�C���h���|�Fyy^J�r�r���K�*B߳���U^��	�JL@	2��-��E��b�ܢ��2ޘlc�|j�J�_����P໳�u%#��*�TK�̓�m��e�Rݥ�k9
�n�O0t�-U�IVQK�l��Y]ds�Sc��h��u�IwQ/O9�o�>�Tqn}��>�;��i���T����:���Q:x��,�2���͇Z!k��z��D�x
W�t旄*@ k����K���̈9"g��_�	�rJZ�{�m˒K��&�
�o��Y�^�4.Q������T�Rb_������l!k�@|Ì7��Ǔ�ۧ`F	�5�O-<�TBHٖH�'G���<�)~��v�v��6��t��
�h�(�����(n6��RV��7�uZ8E_@��u��~��_Z`���J���ᘨG�����(�V��.\�zP�œ����p�9<;4Zˍ���iz���P���.�tG�n���wꇗ郃�w�Nޝ\���d~~w�����w��;L�0�%��W��
�;��o�;�Jn��!Ur� �\Dڈ�qF"�1Fl��iDX&f��aM�D4���t
6|_f�Z>)�(LPr��v���e�g�,<��G�[����w'*bE5{�R�����8|���w�I�[�R��e��1�@E��&G_�X�f�/	�M᥎&i2Z�t�s�F�U��eU�n�!�د�Y1,�L�T�1*��[���(,�:iߋ�6KHJ�O���E4�;+#���5S��M���+�OUgV����y�fW2]�gMn��xU���87a��(��_٨�aq��s���a��"t����c�u������+�&,e42
��,��>�1�/d��
��3;����z!ZS����X.��m�5��M/QJ�>X�E!a_��"��ć��#���*�y�!t-��#��`3��PQC�aφ��r?�����x vM<'�q�:�W�9��^UnU(a0��f��c�t��`��kߋ�4����eè6����J����@��ރ����ܤ�Xԅ\S"R:!��2���ß��b=�$i{�{�O���O��ˣ��Ѻ/�dp(����^��qzwlTFFbe���8�J��Z%F��}���C�^+���aǠ
͒��
��ϵ~i%��9����N	A(~5�z/���4F�}yyz���g���r�4�k(���m4!A$a-+�+��$.�7�g��F��_�Y�3p�&�W]%8V�i����:<�4GQ�+�ON�e�G�I"��%�����0Oy���X����������o>ȩ��ʄI������tOk|�Ϛ��!��\�}Hwc�Y�/�]/5���ud�4(q��Y�S�uT>mh�=ُH:uq���ɻן���Ӂ(�V;�|r��N�y՘�<��#3��X`���"d�ya�`�vI�L-�ð�!�K��5d���"�G6���^�\d~p�x:Xo(���f>Y����(�|O�-�E);v�/���q/�(ψ?��A9��"&��덡�X�`�nTr����9��,�����_��3h&ƞ���/�' �aP�H���=q�]��T�ȖC/��i�b�1 �����ۨ�2���@��,2g�M�L�uF�"�}:�ƭ�/L�a~����,�[���gk��$����
�C�p3�LL�R�
lw�a�/jW'z�E���b���Nņ�W{�
�f�'��7�����.�����3Q���΄���Ţ>�$>,��|8�|˝9%\VD+q�g;P�8���b2���������K7;�#��&����4�!�w��V�h-�Q�i�VH�on��\���SΊ	.
�z}��|�G��!��]�~���/�)~��x�����-=U���A�x��4-Zln�e)
�LK8�4���m�� �b�M�����>���0Xn���o�o�z+s㽪�Y>���+$4��?_$}��…$u�[8&.1�@X�]���aE_�kZߖ�Y�����[�6����mA�U�xp���w+�c�!֨Eo=)��7���/��q���!t..�Z'-c�22<
��l\2ꅲ��f�a���Ȭf�p��1A���~��=�Qs����N��qC,���<J�i��!�M��G����Hd7�Y��$,�`�����L��	}�I�o��J��Q�ޱ��[�H�
���7ßLС	`�jF�`b$��(zG���H�I�P�b�z��Uq����F���%�ϋU�7�X�i=
�?��k�Oar�����$�ؤ^�^��/�r�A�6�կ�8{��tD���"~�7�(����s=%�W���ع�	{0�₄ޢ^�r��	u��>B[7]�0���8[���\�S�ޱ�3&a.�Q�|��W����\}�"N��7$y��:�i/���3*?��^�#*�Sb�&��u�Y���ݕ��4��|xzz���4��\|�!�".�7�����ܳw�tչ'�Xr�O�Do��q��
|�XZ�*����Kj�;��_�|J�3��xj�-I�
��z�d%��5np�^s-m�սF9QB+$�:!�}M�Qr���#�66���s6���i����[�8�{ͫ�r�h�֯ˑ�Bl��}-I	����(�!�'
�3�x�vq迢�������pcC���_��������JZ��Ed�j��
Y�����j�ue|M�u�[6cVZ��冷b��F����f-[Ǝ��J� ���}��>�W��S�(	J�Q��}c�
Hߊ��D�C����xs����

�i�������n��y8�ו��=�s�7�C���:���[��o贊/��j��\�[�@3�\���|4IZ]9<[����̤LdH�����
��}�Yg8v��=���=�E���K�K��W"E9~�� 9�(���RA8��A%+B�^�'ɉSE5{��㞉�����?[z�O��m?8��t����*@+���"(��f��jDN^rJ���&��ҵ�YY�>�Y�JV��ª��2pz?�{�OtE:��~��#�v�X����+mTBt�����t�=�p��B���x�nS|2bx`D�Xl+<�:�GF;^^���7U�	ZN�W�X-����2&�Ǵ�8Z�e���/U��F�����k�a1�\��$fA#�O�qb���I:�,�*��jH��8op�OD٠DU�t	��_õ̰��YEZ/�i4���h������=�-:�c�1�rnhXt�N��[	g�C�
�Lj��>u��y���j>ɉ˪�K��7{n�Qm�,=�>t�F� NB|�Lh�HC��3yZ�2
͎"~d��Y�D�O�jw�j�Z;[K��c��?M�B�`&
���S�����P2���p�B���
?�le,n��E�c�*;��$��)��%B�̗h�1����21�K8��<&nһ(��p�7R��Pj��\�毹=�N��A�6i:�j���J���*���P��
��}^�MBH������p2���xj�H]���)��%���|ّQ����Z8��Ұ�,Pq��7��ƒo�#��Ē/?�f�H��V/.Lu�?��Q>iä����"�H|��s��8��7��z�D`9��U�\��ȶ �sf$I�ж!"ͅ��Z�d|U�1��p֦E��L�!�͢D�M6�"j�z{Z	^�8fɆK4R�%���rW����Y=$�J�E$�,=6���d�g�d�z�ܜy4o�$��}*�Zf�-�20lw��j�
c��j{����H�[4
��&�d��v���˨T߽?=�r8_^.�fS���XH�l��U��o���V'1��vms"�B�$�+���z�����y
�뛸;���%��=Og�8D_�F|��};�l�Pi�i����o���04@�3`�+�Q�4��a<��M4%��ߧk����|·+��|�/�p��V�p��dx��##VE˨ѤtE�X�.����H�u'ї<�R�����)Ԧ�u�A�q�U�̑@I�>tz@�K��1k�\ֈ�fz�0�tE����S!���zj2�T����o/�ޭ`����8\�&I�a�ƣ�M�e,6�Ewyp���F��"�"M"0�%��{7Ń&�����Sx1�Qu�r|n�ZbL���Zd���M�Iz5��\j�J|���+����di�p2���=�� ��E�r�O�5��~a�t��80
�6f:�l�c�[�S����A
�1��$��������r��k3�pX_7XN:-zwC��y�<]���0M7��8�Œ����)���&��9���3M@�����?o�(N�R�M�������.Gz�ML�s�������øM��5t���hu���8T���ܫ0������ETĒ�E�NSxR��G��^b������/���~�0b�04��?�h�c*�x=>	��o��
�a�BP�#@�m�K���NJ�H<��U}B�$奱D��l�A'�0�/�RL�ۓ�6x�H��-D4rq�s�d��Zw��*��w����Di��'w���8�*i�U�8pҝ���)�Z+ɪ^���w$��+ş9Y�PKI�`j�{��E:ϪqA�WqH:Ϗ�Ĵ����Ҥt<\b��]9�-�{0�pa�4�w�T���G�E�Eawz�)�rA1��94ʡ���q�8w��y�da'��*"�1ۈI/�"��|5�����Wts���2xy|~q|txu���^�B~�!�>��m?���3�G㶲�O���vY`6%
ϑ^�{��w&��	e��MH�)�H
]~'l�ba]ġ^���c�T�ez��t&�&c�Y����k�k���4�-
���a��oV�E����=bN�K�(*J�Qˇ`v-���Hi���@^�-6�1�ջĞ�_�٫'�N�z���� �o�ž�^.8�Ðk]J���.^&`<��sޯ�'E���l|ٟ7�-'!��g��D�=��*d�fp�&E���8kȆ�2ߴ��m����=/ݪ(u���$�1g������K��E��#m�����!��~�j���ܽ\pH� �0�΍_�������b˸Ꭱ�ˀ�5~�yx������s����?��<�#z�
�7~���0��c~�G�3��>��U��a1.��
�A��Jq�X�{�FS���"$��u_]o�n��.�=0u�ck;oc#4	a�ڥ��$����Ϝ��+˥��Cɵ3瑘��l��j��OV�pb3GZ��N��#kᖠ��}�Ko�+42R؍\�pB+ȗs�$d��R��h�
Ns��=�e�?B�{�+�N����r^��6~�_E�s&=W)H�p<�0��D������4�������`��4�J��dG��~�=#
!�_��W�-}d$��3���}#W��$�I�œ�g�;P.�wG2�l.���d#��bԕ5�k{���Y}��_��dN!x�݉~�S�[��Ҋ��ǝG3�2SZa�u��ǽ����瑠°����j������fM,�Ȯ@g7��ӄ{���2)�2iB`�ϋ]��
�	~i�J�pNjã�߾?�:9?���>=y{r�!�|���v-c1�)�K�~����ow�o��#��xA?��
�5$�U��{����8�Ϻ�a,��0��'*f}��3;H�6R�}2����IK�A�A�̠EXXh��A*\~H��L�������4���t��������9V����g"uxtt|N�C����c��s���d���Mo30�OZ�FL4rl*�Oڣt �k4���\�zj3�c��-͌�%:o?ݒk��s���>�݅}�^�4�Gsv�^!<�y���ms�%
oJ������s��j���HXOk���?&k뛨L6
?��4H��^�I�O�	i@��xK�
g�v	�3���0=�Ay	xҙT��n�3./N�/�����%a�%���旰ñ�������4�.M�⅖S��D�T;�v�ל����tS���y�{��XR�򰌐������C#พE�~�u���2o#&)�>�I�L\ngg��RXQ��(4:]4a��O�A&Wo2\e��2�N�#Wi�yRw/�n�;�`1���a[�9�%��V@�=�9]t�H�Q D!��Q�����9�p�_�������λI���~��:�E�g�eF�jm+���<%��Q����0���#���f ���c�<�-%+��AU�DE{�5�;�>I[���2��ꪂ�3-W�&����1�����*��0I����w��Р�A���q�-�
��J<Q���Ph�7�!k�E*�l��,�h2��#o��WA�a��G?�'r�<�ưD�	��l{[?U7�N�-��"��b&����^�8��p�y	���k��&�O3��R������	�\�"��^�A4����-�u3}�O�{��H����#�Ǫ���תq��3����.
�t��ztq����.v�PY��G�\���d���0yܩWվ�#�ϧ��1�;�;�n�K*B�M�hMU͍����
�"S"��8 P�/�EBnK���*����JMZv&j���4�P�(�X]�w~�F$�_���QN&���{�-�fRc2����L��e���)���֍�#���$�qB{�2���5|�f�[Bdٰ���y�AQ����ʾ�X@��*��+.��@g�q[�g�DD�?wO��(vI{�Qk�
�;�+��P�}�k�Qd�Yvxꏗ�G��Ã~1XFy\��)"|·]Z؉"����yd��X��$����JI��?��<�!�!K��b�D�&�
B�B�u��u\:��Y'ͽ��>�*-恄Vӕ��la��s�l�L�8OM&Ŏ@%��^��b���ү֔k�R����v�<ȑ:Q:�j��Bb�=yƴW��u�8 z2b�W��Z�ƙ�N�g�D�ʉ��	�.���,vv�V8Nә�sڤ�D��??S��roN��&����;��
.q�"�E�
��@�G޶
��/���ٔ�חeRs�VX7y���u80��u��B�����j�2s(E��ih�9S��ޠ*�9I'��>=�Z.�����������i����L{,���]��U����5�j��{/�>[�f��+p҆O8h<8�T�,H��>yv���HV��M|}@	n���z�t�h8E~��q�㍟��Jm=�kj�;Q�1��+��J�� �g1�;�D1���[�2h�|�a-쑗s64��yR��m)���y_��^��Z\�.z��R��9Ѱ�k��w��.�iQ���`�W����2İ�똑A1"��[8�F+Jr�d�b�@�@��"~�^`�ё������
��籍����a�=��UX�O�:۬�VbPDr�j���W]���z����&4脮C6b�jbU\B��rL�LP�C0�ۚG]W9)���}�֊u�w;{u:	#��vvy]�..��2����J��&��7LJ/7I�W�y�EV�+qE�&�#�M�+az�z�q��x	��iUM�Y@�',��)��.$%f�ޟ�b���di>x)|�����!��p�I��޽���`e,��YsKI���$��$����Q:÷���k�]�Z�ȔY�Y��!�%f��W�٭���h9u2�	 �ˮ`�f.�j��D��txV���e�RΥ7���b���j�,E
�v�NJd*����3#�KA�d/S�-)���6M��X3��=�o\�=�q��Js�]�}8͛��DM��)xN��8'�x�\�ڀ�Y��)��1�s:�ѓ8����Ć����KZ�6眓�����#�����iI�3pDPU����|�K� j�Q�_Ei�L�����"kŊ@#�\m�'�������!��{D��R�0T������׏R�^�]�蝼
Q<y�c_E�w�W���gn��OL>�uN�Fh
���Q���%���ׯ�.>^��y��['����P��Mud���$�eh �^����<Ӽ��yg�q��i0�ln��ݵ�>IN�Mn�e�M���Ct:;m���c�+�$�\r�z) �fğh%
�7��7�����V�ik���8�=��Nk˙�P�`Zn�q���f�����p�
��*������D�&y�G�ic�$�v��!�_�p
tW'+{�����G8%f@K��]ˤ�2zM�A�
!�j�c��-w��³D��zK�
�F���b� ߃�u�ۤ#�'1�{�;����f�m����V�F[m(��
�S�!/0��Y����ܐ{a��c�aů�BD�q.�0�s(�����m�3�U�ct�NiۜҾJ�������YRzYA�q\{�ny���Q�[<쯿�m������r����^���#Ӌ�!���ke�65	�53oc>��R;��dB�&c_����e�9(]�/�r�ܢM���G�QV�+]��:a��U�t�@Y�]Έ�w"B���y�C�����2�e�)�O./�rR�{��E�1���n�
�$��jdz�84.���
Pʾ0�$X���r^\��hշ��!v���Z���Z}��r���v #�H.�%�{�n?�0�Ĥ��T�&�9�4��T�x�iv��u�
[I>g�-;�a�!%�|�R� N�άcaֶ6����F[l��Dg�9�]�a"$@��Lо���(��s���1OM�A��c>9u\�����د���7�$���(�M�fm{���zs�] �ɼ�v�<(�:�bC+��Of����?
�]`�e�4fδ������?G����>�h��?�d|B����p��hL�*���-ߣ�W:q4�V�-3����g�ط�<h�Î��>7�prk�}�w�'�*g�cY����`���FY�N6í���v+��A|�֞��69%��f�*�q(��\�E�p�����l�_�f� ��,XMֈV��ҞF��-eG�5�Q8�Z�pF t`�N���+�[q^��i�T��N��n�\�{!N�����-D�Va��]�S=q�}K	��{�����K
�bw�9p)�m�Gĵ���	��x�/g�(9y�z0�l�{m�iƒ�.Q�t��)�$��Čh��SP�kD�B�$Y!sy����B�%����eWV��U����� �bS����˺W�.����R��e�X�������#A�n�~暹�>����������A8��H����v:+�|��[/D=��~*����IBH�
*��=����������Oq�L�����=֐�0�������5x�K��sb��6��yb��~���Ü�*��P_��QR#�&V!)J$��4o��R�ᓶ���i��0$�����4�ȵ ʒ1S�E������Qqn��S6��lڹ�:�Ra����Y���9#:|M�_�L\�mHߪ�hՑ<�[u��4"��R�����k;�%>_8�!2ޥ8�a�=�3,���rć |���ͳuy-LJMlP�a3���
.D���id
��7h�f��!
%<��'2��|X0�"���v�HnS3�s"�@��h��;B�!iwL�Ë�t�)I���Q͎�n5������e�W �2H%є=�٬��\�n�@|��k���iji	�ma}���،<�R�Ѧ1�f�U��8�L���K��K�U��49;C�N�Ap
���=�l\���M�}
�ڷ߮��y���.���`����L��R�!to��U�0�����S:`�qO��=UQ<��������{U�{�؂�����;Vճ~�����ǭf�S{��:#�K�Qp�H3��cDSA�0�����!*�<b�.�"�pYJNO��u)D��{_�<����%�O*R��>��)�j��T)b�3�L�qUK��^��)N#ʔ�.���4���ڛ\Fs\�#�����#�2Ѯ��ή�}V���hd�s���;�w�������c+|Z^�i�B�Ϟ�,+꛱�H&��d��DN����%��%	+7]�վ����W5~S3.����@Ԋ�Wc��M���6�,ʱ>9+��(}�h��+��բ����Ic3�;��5���ڛ2�L�e8r�u�t�yE�y�[�2�j��(jM�5lC��^h�&���zT��^��r#W�sE�Q��NkŧrJ��F��^P�y��8�E�Zjg�r)q�\���� �Fc�/Xב�����gjd-U*���!�B`Xց�N}`C�
�і�ɨ�53�U�,�d�B�Y��OTʸ�YQ�4GG���8��exG$0���Z��B�y�d��R�x@�Δ0���g�!0����f���C�܀/7�-
7��y��D��3�?���u,��M��l)���+��a4E�Q�o��9�f��D����t��PbӚ�$��p�X�i�
�t��Z4��;�D�e\���1�����pJ���,�H(wt��,�]�E�C�<-�/�Ф
Oz^�O��j!������]ArFu��b(!�*��Ec�C��gk�e�cW�-�x,��1Z������ X��"�'e����I�C�v6�������L=�N����+vZ��@��h��V"z﬋�H�ۧn5u%z۞>�(?��!vv��UT�F�V�ͧ��G������4�X��SI�j���J��;l�t�j��OMV�)t`�qhOj˜��n
/}�X�+��WΘ7'�!�LbB�k�r����^�`�O�N�"����k�vxg!����w�m
¤��~ְPB���^L��1���Zj���~��*u��*st�:�������?����m�bkwww{{ko�����o�"�-`�Z
����v_�^���1J���ܤP�k4'ι
IR�Hr� /�}�%]�@�U���;�7����t�8����Y�yC�y�Q��za=��m�	"5Ys0�;g6�Wޟ#�;�|e4i�!X�v��,e�z���8�1�ķ����X2Xr�7T��ɰ�$D4S��m��7<A¤�Q�Ѻ%?���� �����F_Դ<bD�FH��>�oa<V�
��(�U:#���[ƍ�Sq�!z�Y�H[,+��L�;��3H�%w�YC����`p.�%�/v�g۰����ڒ��>^�٩�D\�xu�4���F�֗�"D=~J3��Ͳ[��C�\+Oѓ�գ.h���&�P1����{����vm�C���m�a�	�-� �%���d�x��Vm�<�V)�,W��W5�����6�����7��8�y+�����H���C�ks��(MC>NZׇH,h���`|$y�JO\���јM~�FtQ��+j6�U�|d��>��7�&Ѭ�]��K-{	�N}�-ʌ���ON�e���5IY��LJ/�Z��Ut�V.��6IG��L�/�- �iݯH���ZD/D��&�p�6�G"�	�����zF�k�d�%��9T�ͽ�~���?�V��a�<���9�z��q���Q��a$�4;�p���I���flu�;��ռۜ5j��S�v���(�����5�JZ��߃T�<C�j���.�C�&)�%�2F)����&�^�Q�?�c�Zb�d�e�-˰�G�=搲H�M2߀
�l����N.��&=�!?��H�� �r04v(�%�d��B3)��j��7���#�<p��$�V��SZ��_#����)�LM�s,�����'a$���i�j���-�Hy�{X	��Y��1��D�+��ɼ���+�˅��lR�Wh:��"m���E�Y��Y��
7�(iJ*�;�9���
�E
ݡ�����v}	�� ���쬍���gHlX,,pD��Q+�Gr�E��7�a~�D�=4X3�8�bz#�_qPG�Ch�oBV�78��?�Z98�����40���e�5�%9'o��(��;h�5p5�[S;��?*8�=�j����<�����o{k{�"�m�?������F#$a<���?6�#N2��֏6DմM�F�8x�o�c�ZA�n�؟9�a��������3z���H����EM����� �j�h��y:,��ǺH���'^��Gk��cm�4����f�e2�3b���]ċ����fS�|^&�n��ل>��o��m��&�R��ǜSp�9F{���1�4Bl����$�~8�B���k�n��8o�Y�;a�<�Y��8d1�i6M�F!`�i�E�A�M+��s߽S?��P�wj�[(����s�y�U��ﹼM�CWo��˳WW/��G����w'/�_k���Z3�pr���U@-.�]���
��p��e38������epv�8y{~zrL���;:}��S_P�wg�HBJ�^��P�:9��`o�/�l_�89=����xur�c�:� �YLO�ޟ^��/��.�i��4컓w�.h�����4+����.��������/.�Ǵ����2*������m3xy���5r�Q�n&	>�9�O
�����
~�bV�џM��ŕ����^�\b�.�hx���&'���ݱ��S
J�OM��c���LJ�4�%6�7n�]�_�+��縟�o?%�J��n���m����O�*�o"/��g��:��k���1�����R�L���n��S�WU��ADC��ǃ������/�[��.�C�r�!��Ɖv��-�ytS-�FR��,�+�H�«�xt3rQ�����4�
�M՚0�4-k[��D�$���pҔa&�
x�����f�P=�Q��؄���
�Vlu�~2���b���?�…-1܄(9O``���"�P>D�e�`ĉI�X��z�T��!�8��l
����,�-�#
?��
�g�Ě5�Zȗl�M��l��;���)��Sb(�s2n�6����IU}�g���G�Ԋ�6D�'�'3A�%6�1���?ڴ{|$��>�?�_Z��pC�k=�W�E�rFI�.��+4:e^r2(���h3qa��vK[���b,�^��e���E�h����5�H��RJ�.W!��ɦ8�t��<��
����
����]�W�x,�hV��s<�a()�8��k3,t5�O�i�S�*1�Ӏ�x����i�G�`��?�k3����X�4��f��ڧO
h�R��tn�����]X"9z� Аg�t���6�=�?���[��Xu�����톷h{b�%H4)I��έ��^e��G���[�R
�7���QZ_�8O�loo3�h�*��WT���l�9�6DD�yU;PS����7�`�8��W_��<E��17�i߽>y���}�!������,xr�����"�I��H,0��3�'����\���ΐ]�g�祪ŀ'�y���
=���q*K�#݊��0{&�"�6�����ޞy��**6��E��|}�m�.�-�v�6��>��i	Q�	���~���D���v������M��XچS:�p�� $�GvX˧uW��W�<([��Z�p��h�}�l�I�Z�	%���mDbRbpb���Lo�"�'6��9K�R%��/�ϙ�K��(K�Z�T�!7ϔ0���-���F``����~��gj��*)cNľS���0e���_\��n3���oy}Rŋ����/�S�D
a�����S���R�
�,B]�VT��o��wo�$�Ʈ����z�K��^�a����ɠ��"��Uk�fF���5ː&�a��HQm|��U]�p�M�������ޏ����e}8|1���ޅ�y��o���+�����6�.���E��,��xENv^_��У3�J�C������l�6'�y����$�/�-P|tM|�"�/�d�E���'�g���л"�&C^H^�"4���8��r>��$���zF�-IF"�����]u�G�z|�"�w�V��4�B�,d�����M`��Qo���n�tv��%�rũLj�P둊-��Hb��*`Ai8���f�"D�C��H4��-���Ec�Љ~Vo֞�,�	�P�zyL��VG4�v�y^��P�]�gS!�M��lqԕ����t�r��';�	Df%��t��,{N3m�paND.Mo�]�X����>��tN��Ħ�w�i��z%�Z��^���}<m*��r�'?���z��M�t��C��u�����]+�`�ꤙ'��E��ͽK}M3k���R�y��Eڗ_��_-���Vp�2��}!��nuXg�m,E��(����Ϛ��`"9P4HL�FlpPiR�7�irP�y�TN+%F������:��~t8�M�E�lC��H�hG��s��x�`������xdM�	�-�S�i�,��N
��X�<����8*Q'I� q����X5
�$�P��p�`��>'d��AP�,@��GW�M.(O���y�}���/���b6��=��s+���z�3-Ӕ�!@#�,��G�P��<3����8�����f��-���nӲ�e�h��4jE ��M��ͥhv��N���^��,Fy=f���zvA��p�4��6����_��}ȸ\m�͆��-91�YjRiIKJ�{NZ�N�5���)�ư�"�}���5��<uː0t[gT���b�]�7ժֆ~��e�-C��D��<����T3���@+q/g���"�4'���{)ih�%ʙj	rdUH��B���&I8���n!�6�겎e��F`�)��o
9-+G{0�ജV�r��ob" ˄[ޡ�f'2�����i�M��Q��
���P�}��$k�{YB`rp,u��ѰN�K)dY�Vx�bwprf�pۖMK�-2%��Py�K�״����\����<�e���(�2�^{����pk��_�J%/c�W��T��
�DSMf�x��c\�����_�i(�LwK����E�w��|\d(��h2g.e�.6���R�\).
v�
�u���k�	��X��}����c��w�z�+b}g������w��q�]\�7i�	��BAXg���R���U,�{�uM�з���w��b�Zn�F��glk�)�0rIMn�VQ*������\^ [��[Q0ǒ
�Fab2�ˌ� ���|��Tp�e���"�f ֆ���z:��L�˅�=:�������墮�NN���k�$f�4�4Ժ�B�e<ۭ͐+�ihƪ����rw�%�(�"������??��&'.�;���
N�34A�(>���j���oo���ï�,��_�e�4���ήOK���	�:�#��o%]���L�r�u+� �aWH�d�X���l��
h�0nBgHmқ��_>!���4�<\��Ͷq��b�J6op�m�����+#��3n���t��4Iٙ_����i�$����/��(|�lUSתI��mJR l]Y:�0+�L	L�<���_��J��5
���z�J	����8I#[��7�W�!gq.��J���
@rH����O!�ϗ��.��T��xzI�E�(vNvi71>�;|���1�#kP��^,�j��0xQ��k��lq)M���DqK�6>o�^�]�8Y6{
0f���X-��0ԖJ�q�T��p�h�6�~VܯϦ�����*y8��.�0���ۅ���!M�k���t%>9�h���kFO?09��5�p��DŽ���x�#V��cĿp������-�wL��2��|��߃@����0�
����O�[��"� \�8\�sF��r8�O��p� ��N��
!�����P?��`�A?�,=��� ?�:��V}�?�m03�5r֯�y�ǘ��Q���wH��r���H�Q��A��~Gǔ[G�0NWu��|�D����܇\0��l��~���3�\G)Ѩ%Fd�c>3�]��3�A5ѥ�	Ag>f7����	��R��U��e�A)WF�f�]J�٫&O��!��JY
|��*�1���	‚����bz%�J�ӕ���(N�X�G9_��?�9;L��J�^�I>��!�$�W7����򉴞D���F��0�B{�/!�?��ߨu�!��s�S�D3�[�4�[B�����ee��^���X?ZѩI���N���9���B��G�+���c��
��	�6��v�"�t���i�I�E�ӫ~K;������O��h}	���ī?��i3x%7qpE�����{�"Hܯ3��ǥ�~;�^�J'��I��?��H�Z�x1��u���"�d����9���y�*��G��|L�c�.�v�桻~���K��D�<�\ҡ�l�vrj��AV���!G�Oi��1�4�8#�2���71/�b�Ѭ	���Fq9:�T\:L8�ъ����i��l�R���RL�#TJ�C45�%�t�̹p�)�Ac��BCu��1�b�_��Q�M���V�p�$�s�V��G|d�۠a�%
-_gt=S�C����Iq2.�F��"�g��$�搄��)~ē@���#���E��(w43ʒbѪhی���%�s3�R^���8���5�&MS�B�T�m��ۤ+�DT��f����/4k��T��u4U�K�U�_QdN��T�roìO�~�dK�J`5!�f�@� ���ъ#���h�]���構3�
խZ��o �P5�� ��6`�{ ��䢠�w�	���}?7+p0]p9"P���q�U�%��H�O�^hĤZ��P��h[��O�Ǟ���������R�������6����2c�P�V~�qk�d
KIbf����:k$�{C2���(u���Y��:+Z��dHٱ8�,����<
���,bS�nXv�����8\�A�(Im�,����y�U
M�ʇ�.�Oڍ����8�s5T�16��O[�MC���%�a�~�LT6>�HH�i�������k�@IO��4��7p����Ʊ�Y��=ŝ�Os{�����`�9J>,�r�q��"��V�&�mB
ǎl��n/��)�Iٟ�)���Jѭ��t�>�K�������ο~�N��,o��8�hS��ա��6�j�R��l�`��Tlɣ��#�k7�-�__���˫��Wo�^~�I?����A��������>�Z�ip
I��p|�p8�E��f���)?I�V�M���9�Τ9\������'�����,^𥉽�l����_�>΃5�a��Y�?S��nu��+���dY��C�I��%h*��dU�58ϣ�9xx{Ǻ��9m�)��mtUo��eiZ����܅����D)���ć]?��@��(	-�zﱸC��DWZ �zŵk�ʁT��o��
��+�Y��2�Z�]������~q(@�땔��n$�!��%�=q�Ӥ �z����!�$WM������+���]���(@yV�m?�1��m��¢M����{��F���A�„Y0�k){j|{�P�-RQ��2�7��ޯ�P�������"8gTx%�a���6W�J ,��pG��`+�j���$��H\��t�8U���Y�-+����Ϛ����@~���e
�I��.�h&�]��	���({�<�
��0�ں�s7a�K{�6�=��}GU7�2\`qa6ൔ�rqvuvtvj�c��x��D�ͥ>t���fe�Hxr;�3@OS��=K[4��=�ƥB؃�e�:�<�}�����v�nz/�A|���J���,p��`���P���-����ϭц|��r�	�������+W�̬N���4��}�������a����z��[�I�Q1d�)T6�a}i����5���s�������	�ŪS����P��Y���:``礒�lr����42��	������?ij�C}�;VG_]�
3L���75��3$��E|�W�ݥ>�'��5�	�ؖl� 0,�jV���R�e���\��Ț��*�]�s�3�vUd[�rKj��M��J&[�nxe�}�)�r��f&	|�0����=���Iڞ8�Q���@n�o�
D���_��x�+D�-�牵m�IY�3�t���$���a�H�Y���z�&Z4�Aݰ_�=ߨ�����jF6ø}���1�B�ba�{�'Q���\��\nl��X���⁦�%!��e@�|W&��ϰ��t���RD�����d��Wo>zxsTxk�Eo>$��,7�'<�j���{�0,��S�ub�B��e\�><�c��nΓ���tW�߆1,p�ټ]�S �Z�[����..G��$�.�*7%X��}��vͮ��Gm82���u�kNG�QQ'g�t%� �)8}���g�r�#�kVS7%��Fp`5�&�R	Ɩ�`�w�&�V8�����6�H�ֲ�s#d�%����h��M��@I�A��%,e����Ǒ#-m�k"Ġ�l=���U��҉M��,�<�	�N:��X�`h�fPJKi(M�$R��Ę�i��Ge�mCJ` ��Ly$�!/�k���32UAY'�zS�>ā�]���/�Gc��吲�g��(M�����ݎ�,�����	82ڔ��"�p�:3���h�a�!<Nq3��,��&c!��7bŭDÉ�S��v�VZ��20
bNh�7����x	*����{}�F@h�'�*�6>�*��zP���z8d�%�&(N�Jf^�:������vL�/H���G''���(����R�hn�z����V��5f���xy	��&X�y��Č7���p5;^�8��^��Ww�9�Rg���z�Q;cɩ_8������`�B}���"����ש��bNw��2��‰��ՙ���?c�0�q�~5-����x֎�O��&8>�V/����Fs0fI�jM��݂E	S;
<[������UU�Z�Ҙh<��Q]#�<rXz�Bh�h�Q 7HIЌ�K���m��tdh�x�����s
���!e�\��p�-�RF7��X�t�0�HL�����bI�m�몃����J(5���m�J�
�Y$��fqTOl������8[�����	a�V�j�QS�y��#�@�Ys��E�޲~h၀=�'����ԣ(�	��NM�R�RR�7�*2>+/��7QH*"�5���t\mZ$9Vt+����r���5(e���5u�n�o��%��*��;���Z�Ti/o���
r>���I�.���'µ>���[���i�,K�Jהi
j��EL%��@s|��G�E]I�o:�G��<����4������G��>����ӆ�zt�(�4{��h �$ѩ�F��Z��wAgî�8�=����J�%���pz���l�D��S�QS�KP��r�$�*z�S��{��dI[V3-υd>D䬞
[C�0�П�]��������:hV���<S㚝�ٽ�(�VmYZg��������d���&$�8H�k����!�P�Tc3����2�1�?�A��#S!�G�
�OlbA+���Kf��s�h�v�YV�_fb6�����t̸��J%�g�)�X��Y@~"�<���e�\�uf1��p��H���3����/FΐG�E=�ʍ��m���g9�*��(�Y�K$c�*�ZY7���hI�ܭ��KP����uT
�fNkl�_�Ͳ�~KD��<f�.�d�I��yn�V�z��U!\���j�R���4����i.e��)^��`���6��������8�r�ڔ@����^�w��Q��1��t��Η6U�<�-J�]b�#Q?������q-�}q���y�.�y���bRN�%9lm�z@�woCੴ'_+n�p�H���J�X�����ܝu_[X�痗�̢�
��^2z�"m}M%a��]�r�N��;d�N��I8�j���y�w��iq�МQ��6�< ls�'��ē���">qjѱi��3����<S����JX
bC�k�0�,4=�.O��焰M"9%�o!)���
�[.���h�z�[�nA�+^����p�w���R��2�0�[4*9�<��_A� ��x�v-&��Ͽ��>v���}���W1^@�W�$`�8�X-��Ҩ�b�Y
.��R�*��T-��<�;Yk�彚�w)�r��DE
��w0,MI(��U�s�i�S�@eGDs�d�vi!
W�k��E�+jx7�P���@�ƒb��űQ~�գv����`O��IþKIH�N�G� }�
`" �捊˗�
�P�fm��j�<�%I��M�������(l9��(͡jMe���t<6NJ�k���'_�LXm����E����2#���ƻ]c�I�H�*��QvkJ���)/��-�U	d��`��ƛ��]mV'o�tD[V֤�oGm�am���Y��N`X0n/����1K��̓_}�ݯ����?|��]���_,��(wTU���a�o��q5G�:N+
h�M��t]��7�����0��K��&�����?����&5
��~+ђ9�r)��!������vg�%���n͔"�}}Ri�r�Fuڠ~Z /y1L��eug���XX�$���;vF@	!PNj֐�b�$��u��<K��7^O "�|F�tZ�ID��>A��g,?��*N��Vz�a�x���<�2����\����l��ۭr�{����a�2��[1
3��"�1eT�Z
�����Fem�@""*�A�m���Q���֛ٳ:���g�.�a�*L��0�砤uG�t���	�aϱI/E��ն �˻}̩$e�%����ud��cA�1�N�e֖��T�����W���:˩ָZ_7Io�J"րEIpV�M7�g��G�ro��XS����r.ڀ��۬ӎ����@�2e��$��T��R%�򄰼V�e��3�a��ܡ�R5}��D7|HG\�R�P��'v,d���JR�#+��Ir砬���ak��-��f-�g%�u=�l�S��5��^;�Tʏ�~���h�c?Q�`B�JKe@���˲���ș
#�0�N�F��m6
5�$r���^u��In������j2�[�o�A��pD%���
��\%����|R�ȥyA����N�vòdK�Gk�H��J]ʍV���4Nع?ĎF�P�)��;'9ǓxWd9�L� ����D⛥�8a�˂�ړP � >aJޔ=��#X�i�����蠤�p�XqH�����.�U��c҉k�l�3i�&lb�ڳ��)C���֙��e�i��U�:ްJniL��2�e�Zz����ɺk��ʜ������"<�%!���g�NM�5�o�m��n�D��ki$��Me!����Y�ӓ3�K� ؃KXM�i�1����ʫE��,��B6�MtV60���ES��Ͼ��m0Iγp$�WZ4fl�M$�M�	�y��h�i� ܏ɳ/&H�p�
QtBP��ھ�V�t�M�)���L�m���ٲ��b�@��9�����sg�x�c��!��A��jw��8y\�}�і��A�3�5e�Bs��?/W8�{��j�Ϫ����]�����������M�?Qm]�K���i�䀣P}�����@%�G�G�I"�����t2�� -q.�6Q�ؔ�#�d���,W��x�)ߤ��h�"ڧ�Rs�)�LRf�Qr��̸�K
�Lz���Ot����!ي��ca�Y�d��#�Y8/R��2YB�m�4ĭ��F�b�K���#��xɏ�-+1�ޑX��M�N�˂�n�%���}Mє?n4dK&ÌYnp��f��d��fO�\+�!��<K?/l+��z�_�
5O�i֗?+m�}?m#V�x�]lC��Z�
��r.����zK]��re��_K-\��!;�����'�-7����KL+�*��{��6�,Qt��S��q$Q�e;��1��Ӷ��L�JI*��B�QI�3���7����~V�$'��g:@ծ�_k����{�����=��@ՙz�Rd�mf���Vi�T����2i̥�z���n+I�U�*��6~��_q+�f�!�O����f��nL?��l�m>�4�o�w���vE��3��F�`��"&�5>���$97
�w���`�oO
�b~����R�����uE������f����I+o�����>��&�1��QJT�L��[�F����v��I@�/;�k�r �Vs6`yM)��nF�-�����c�N���NF����k���u���,���K=�,�
M��uD�W)h̪!�5?��DL�J.���[�T��eǘ�f�T�f;]tP퍽������U�G��o-���S��>=†X���e����T0��_}��?\{t���-�&�9_��E��Z>��N��>����K,��(p�Oyp�d���q�8u��X	��_���h<u�
�n\��.)�-��� �9��6���#����>����i�@��y'�(�1\����\�C�%$췸_����X0b�;C��46��Q���j�<��@�`�IPǟ�͋FU7;��BmW�&UͲ=�*6���jpczdRۋ`&ݍ�?х5���:��S�/��ߊ�����C��?Zٸ���0�W��fQ��
�TBZ��G�z�_@��Ť�'O�����[�����S�C����=ET��頿����8�p����`�G9P��d(�>7�am:N�Tv;U��F�V2=5@�o��c(��w!fJFk~�ȢswhX��@�Ͼ�v���������ޛ�_ۿ��U)$�y���r��N��c{�����c��!?�����p�|�F�i³(�O�);FpSt�k^.�'i竛f���G����x��������kBk���࣍[J
$�۲y���G^ ?
tE��,�z�����2K8�4䋨
�b���5��R���V~⊑���$h�E_�%���n
G$�Yl��&H�Ж�ގxX�~ҷ�(]w��g�ma���>	�
�b���D!�扺�j���P�Wu��z��yw�ޯ�ԃ0�-,�9��[��|�;)pf3����!
���N��V�~V����i7�7GW��a?��F1��D���r捗]íwD�}��a��V����z�`kK�ydQ�^C6/��U�u1X��Z����,܋hKz�Qc��x��̓���"e�����#��_�gm��f���+������Gw���-�ư�y��l�S��`8�Z���N�@9X�ʜ������j��y���@+X-R���[����V�M*Rv��!=�ee��T@��?�����|��_�
�%��#�@)�J+I
�����x;�V
�W�/�2��,�g���6����f	��d��M�*��R��+���\�ps3@/Y�v�Ա�A�L���Ax!)k�(6_�\��J�f�X=�N��8 ؀�`o�p�i9)UB��]21�W���<���W�"M\H�Bu�Ձ̏���*�צϛ`���T`�X*���q8X�ş���Ek�v��8���,��S��Z�-w��l�8�6�{�0�h�NMm�v�lmM=x~\�;�u{w�c}�c߲fe���!��I���B�{2t��Z���E�O��ij}v�����B�-��#�L)�& �>֏����8�8�
�	������#�k�P�#ӳ+��j�;�Z��^y��f��?}���ՠ����Ʌ�Qx�M������l���W+u�͌��,傓8=̀�B7�K�jۭ��?�W��*����8^�7�s����Z��8��"@�"y�C�`���q�IJ`��C
�ڪ!6�}	��@x���=��Bo�CEa����(��ر��@I>�l-^��P2Po��`�y0�
)�7-�;M�5ɔ}�%FVAF\��G�5�޿�-o��c�d���u�o#����}y�dͥ�)��������۝��ݟv�켒�� �Ic'A��,b���``$�)�$&g�;�Q���O��iQ(�	@A�r8�;�fEQ� ��
(�Ϫ�Sv��a�Zl��������Ј�8ݮeW��A��`-D�T�4�qŭ�<�0@`G�Ӭ�הp7���B-5�F�a�ײvhJ ��R:_؛�9esۑ0�v�~����%�t@��k
�X�ze�p?�C�~�\�<8�4�g�&Cz��VPD��Ԃ6�\����ǷP�i��J1F��mT�\���o)MI�^Dp�,�_�\��&0epy��sN_R 0�-�<�p���Bj�I��d��;.g��w�;Z���j�����.�)�Nl��8��WnG\1��FagK.�"
�2��Upn��uo��L��^ ف)t����D�=-]���4�Z�\�lJT��*�����I�P�%���}��S:�'��롋T�S�,�g�;�.�0'i�̯���5��U+ut<�B���|�=����7�֬�t�A�{oaTU��Zt�֨�Vp}�Z��l��<����t��m��F�@�7�MӘ��~Y�?�
��L�]h�RH�B��{��)������珙ƌ�e��]�xm-�����9������ڥ�C��{*G�U�a�#����`8����M�fQ���<*&�S6��)^@�Kد"�sD�/`y��!�"��E>�P��(��"4�u�u�)�p�X�<��9�4n;U
	Z/�t{����v��1~G/Q`㗨����ptgU�P�#����"��ǿ�WS�X�m��,��4@��W=���� �jV�Ȝ��s������N8��=��_{�
�8��RϿxj�$�v�;�ڝ��i�3_�8�gee��|�����O�W���hP�#	���揾�����û�w��Sο��������q�ww��s�W������������οI���l<Z����ο���C�b@9��د�|�`,U�R��T6pL+N����`_N�[�R����\�,6��9)q-�I�rLI��A\T
K�0
U���l�O9K�N��0JCa��g��R�T�^�S�x��׏��-�]=���
N"e�z��`��{0B��L.0��8�j��ی�����vM<NPՎ���˪�� cPS�N-4۞^
����3�0%��d���&-�"��ͱ���#.^F����E�̙�/8���D-tn�	�a7>M�&҇f�#��s�Тw&�k[Y_��:T���Y�lm+�L�]5�R-	��	�y�ȴ.�����d#���;o��%�^k|����b���Q���3�=�&Wȳ�𬄝�e�tf~k,i
�^�����&ݫ5�"SL�厢�[�l�۾����$s�sھ?"��mu��c����w��7p����Vͳlؖd�v�~�6�UN�`
O'�iԞ��sm�!t?�
4�\�F�y4J�U���i3X���h�D��3.�Dp8�+,����f��fg�Jon��qM'lq�fc���\G�lgE�5��-R��][�A���y�^#��%�v�J���+��C�&��ǃ�ۏ�%~����4��]d��g��iGս�V���_eѺ��o�v3�O�F3�����W���q/M�"C�Ǥ�	�D���K�&��.0�w�Ip�Ska�"EJpnK�9K.&G�Ӄ��T�	�~���@�Ź򪩫Ve��a��`�C��&�e�H4���ֿ�~�yy��e�r?�Z��/w��%�˓���ˀ���\��H���E�Ώ{�ч���n�wRUC���E�|Ҹ�L�4V��NJ���0���T,#�G�!y��4�����F��*�
���KN�C�5�EB�n(��٬q���WD 9
q_׍�Ȫ�C.��9���N'�.��T���Wan�q��P���<
�I����ת�^V�b�3d	ƒ�>G����G]�'Y4J;�n-�hx�ee��E5�>�D�E\#�aI	
,�;@|�rZ��:�D�J�<��L���@M�.zn	��?�Qf}2!U��q��g}�&��ʞ�	�qd<#\H�yc�\Wd��Pl�|5�؁�!��bUѽ����źh�Y�֢�á:.�Ti�UlZ�J�l��Z��"��W�H�j�^.Z�B�14��	r&}i0�R��@B�=���H!W%H c�^�t�o�w:@X2.m"�N���~ϔ���c�S�+��O\ ��.��S�>��_p�Ʀ��־��d����r.�+�{w..\�+���[��U��73L�};���i�@'M(�w����p	c�������E�|Po����(����+'�5�E����kzrmp LC����[�;>�>xv�L�"�!��~>x���9�}U��yz�!�^�I�q�F��1B�+�+�_鮓�F��xI�B6r~�X��b�n�hX�W|��G���`+���u��b�s�5�_Ag���Gp�޾j��������o~�h���3�\UZ
m�\�R��N�V�ZLu����H7k|�5���j�W
p���%$�`po�!�Q�ݤ�3�40��S)ukb.\�QR=���hk�L��*Y� X�leI�̢�*�SO�D�i�*#E�(Q<�=QJb��_K&��J���ib���"WՄ�e2{>E	�)z�$l+�� 6�O��X��X�c�"8�� 
cz��yFl��}��Vq��$e *����
_�^,u�햺M	zh4q�-����zW����/�P����S�rj]�Vz���E+ꆫ�f�y,Q���d�x�J'��Z�A5Jʢ��j̶\&*�P\A��b��J�Rqe���M_X�D�_����	�\�h?���+6Ք���Qj�O����(��c�YXXB�!�Wu5p��Q:�딫�&T��t�(hAK�[M<J�$1�ݰ�53��3����/Xa�DM��gHtcs���>��Y9T:��9�)�3��X ͧ�.�Lѭ6SJ����TU)6��wY��E�4)u=[�>m�*үϬ��1<���xi�s:��)=�j4T�S��0,>�E�ʇ�����h�Ηq4w�h<Ż�8�&l�(z(�ʀ쑓a��)<���7d�"̤��^��3��w߹��{�c�ϟ-�ú���>�#;��]���_���#AX�Z�7h�#^G`w㓴�N.���"�D`�*�/Ea8��XX{�fp���*o(2RϵQ�6-F񵄕�J�&R=����.F�VK3Lؤl��!�<��9?O�q��יU'�m��]B���W���KozXx�����}�UV_��p���C�	�q8�rnen-�M�ns������e�����T����-%K���iSL�4�isBdkFHSrUY��4J�F�r�q��1=�u5	�[��p�_�m�P�F��_$1F�V�yB:zZ�钙ƒ9�g :.�a.���MJj�7*�2��5�ښ�eKHm����s�Z�aX��M��D:*9��"�7=�[�	i�o�'G���q�(��9�j����0�:[7��Sq{:�~@���#R_�>�g"�
�څ&�TH��pJ�E���t���k���g�����_�Uz�o����޵�N]a���HD�M[��%�]~&C���%��ğ��(:��<��9�T4��b�ܕL���)?4}��N�5�
ws�}.�mI\	5̊���a2�r�c�������J�	T���R���[�R�F3i<�T='XJY�m&�S�l�;?�����X����b1�I���6ϊJ�HqE�^wr�
1Iؾa
;��P���`�O�E�52ۀ<���j?�4��B����.w?��R+�a�"G)q4��PS�R���o�-�V�|�����������w�_ߤ�Wy�7�&%|B�œ$;DyH<���d
K}�	��u�n�J��ace/�A-1�5H2��Al2O-��I�QVK�`�Rq�V�c���v)հ��$��dig���
U��e%�([�x_��ݣ��(([�����=��գG�_v��)ܺ	r:}�T��H��p<Gy|Ʃ�ic��8�BO#Y�83&he*�Y�h��瑂�[8�x�GT�>����w�m�D�;��odeOҨCL/��;b���-���4�!��L7
�J������^��Oi)-����fR�F�~�׭��v����X���|v������6�Hh�
=���][h�E��^.��7��%4'�T��3G7�Fjhs;2G��?U�o��C�4o��j["��mz�{G�7𩽻��B��o�ς,���#)��Oؤ"��\��.!�;��-*�K&%���+=�ab=��#ǭ�ǚ2��զO23&����k0|���<��h\�D���`��9�L����$���&+"�)�
{8$��7�F�}ats��i%�6�0��n�B��y���nb=�#'�$�X~M�<Ź�I��Ț��5�����1%$��F���ZA�L~��ξ�;���Td_q��f�%��Vaˍ�1�Ș�1+·�Y$��.�@jk]��X�W�
�����7�[Ji�-\ks�W_�N�)��&�p�|���ƣ�|��]��7��`Zéu\�1���.����o%� ��R�G�0;j�Q��Ƭ �i^�+M�
;�%C�j�W��� z)�|�B�� ��d��%�@Yj$��FH��]��d:j@�_��1q��U�8 cf��h8�tĬ�"?��y5�(X�g�d=��(�NU���)�t��[�&ر�elb�e�Qeˮ�!�Z�KyO��VC�q#צk�]�#�#B�<�b��&
�O��<@ͨE��}Y`�.F+���w�Y���/z|��
�j9�k�谽������C�Iz���
��,^�뛊I�~0Vv�\�sWcSX\�ݐW7h�I�B��A�9ڹ\�qr�o�[SD���sXn
����� ���q�^����	��S���s_a�jgn^��[�����8�w�]��G�
�� ��䐾P���a�湏:
�s��/l�<Ӂ�^T�I�C}ԓ���v|��9�K�..�S$�gd`˘H1nk�*#ҤR(�=:wy��oq��&��zET�PL^���7��2�Ue97��@��w}��諒��cf{U��QL����?�I��bDᮔ}Ձ@̾��;F�)7�K��!��I@#�
6mb�Â_��
��n��n�+�T��w��jQ>5TD��?�ش�/B�`R�iγ�D���0�>q>uj�n5\��P�t��b�]�_tD;���&���Pvs5\	jɐLf���BOW¿T�<&���'lkCT1+�k�4dz��!�)UU��;�TU_U+���9!AV~��S�tP��Ά�v���%�NƆ��{�q��|�.��PgL����w�)���\.�V�z�h
s��Ϡ�|�a+J%��|��[{��v�p��ޫc��n����ể�ϻ�/;o�:�7����t~�{�KH�axD�]p��1)ګ���_7:��ys���~�l��jO�m0�TV�j�V_h��ةY�ku���[ԇ��.��Rp?-���,������i�
��(2��jf���Wr����a�?��d+z��ĖY���E����ijDYE�)�n��t>%�^��j[��0q�����B�7G��j6�G?��Y��N�������D���|��_�بRSib ���n���{x�Bt�
nݽ�
8H�	��h,��<n�LN�p�k뭇߷Vւ啍����S�0hr��V��++������g�
�r?��T��}��~x��yAF����Z�l�����I�Atx���o7t�Ob׳6�1!혫}�w�v��nW�v.��7/�*�Q����.2m�c���iK�E,��D��0���/��_�•Q2m{��p����%��%+�݉�p4EKTAk	Y���Mŀkn�]������.wG�&���:1���^�)�6�XUal�3pgYt��3�-�BK<2}΁�h!��u�u���P�"��"�OV=�l��2�jC��[(���n50�lj�>��p��Z�ך�A6�E��n�=��n�/��	�e&ڡ�p���Ԣc����ۉ�T��ϔK�2ݍ�
�aׯ�$@�-�$V[qCA���W
u,x	�l��{LG�?-�v��Ke��3�D/gv��K%H�Ejˠd���W�U�`�\u7>��X�m+�J:=����{��<�H9
�\���FA/20���#�s하v��䆠���Dz����>�JnbhdQiv��vD���ߑ^��C�3��p|Rc
�X�&�SY��_�ƪ�n�b>!�Bkz�����*�����_Z�_��n�?�V��;��b̿�j�8�{�����࿣+�ı �*��T�����L_Oγ�bD��h%׏�+�$�<�.3xa6N�M>��Q�6�u�~x�$?��g�����?�Ti�K�M���+�U�m�����-��w�	��U�(���d�ĺC77U�.�4W.��}⇒	o�~�1�q|Q
�b�	FR%��O�cY�	=��fA���(��
�x�8���Ǩ�EV�Jw�N%��<̈́�;�"�9F��R�.C7J������%iu���V�/lv�	�
�_]��ӛ;����X���'�z��Q���õ�;���T�w��Bc~<D�'%M�yPFe�wr�<L���9���2><%�m���F�zI��� �8!�=�bH1�+�����
�qt�Ӊ�mӃP�
������Zu�}�y"$u���Fq6l���o��'
����xf���W6P`	^�؍{Ž����d
^�*�%�pC�G�!X�T�ˢ�
m�Z�t��i�/��	3p�
�L>�(���q�y?�ЉK^�-Ń௃$;K�0���k��SO�;��)�¤K�/�`��9|���n�6:уe�˸���ED��V�����W?��/�$I�񎴛��w�ό΢��Z5����̄��RdUBy}���������×{Ϗm�*��/�e{�y��B�@�"K�؅���?��ζY���G.[A���z�l��q�f��g7c��^j5��ZG<:���Y�ϵ��0���{/b'k;{��'[��/D�ň4e�=���R�Lh����Gt����a�H��lqEl�Rvv_t��iw@�|�Ҳ!��ٮ��s#�E�55����������睃�7��U2�|l�褷��ښ�Ϊ����7=?|ѕ��''�r�_	�����zY�h�����]]%6�w��em�i�W���cec�f|�$o�S䖭�� ��i:�B4����ӓ-d�%�
Di��T��Q��
��á	,�{�S0�_��^���(��Ț#�>���h��|�f�Ǧ"�(�π��n�"�m���|��8X�K���`�8$��u��XUO���
ٍ�VD��!��L;O%a#��JKɷ,OՐ�8��A
�{��Ȋ+x�w�n!��J�`>�U�Y���AB�1�[j)���,�bz�@��`\%�m�!W���}�3��܄h�z.��(��w��Y������h���׷X�G��|�B�21��<n�39�s4��`�q�3��s��s��O+�����z~��!����	f�[&�S��l��uUj���r�P��=��ϝY�_����
�l
�}�Y���$`V���
_��p����&Ͽ0Q����oY�_�j�f���aU�x���o�U�'<WZ�[m����•]����n��j@�Cld��F�Cl_��98��Ī������>��y��6,��,k;�������Vd��~�|�_y��<{��L�Oc��{�y����Q:�>\�Y�r�,�f�x�(I4B� �7ez�_ow���K	ՠ9t�J�?�`�	��yb��리
�Ɋg6�]\TI	d��0Q��O���;�~t}�R#�3B���W��6=�_i��;
W�W|���pw��>�_���7���+>z���#�Uf�����W���a�ϔN5�x&�$ht�%�9s�jU}v�~�������дEuy�lf�'�#�W{?��ޟ����W�o�M�*^L�����<r�� �YGm���B�.o>�����>oS�O��g饘��p^���n�U�α�$�&�A'��}�/_�o�1s�Β��fm�~�~��?�o?{��6lγW�?Ž	 ��X�j�߽:�}�����<��o��O���q؝��Y�w
�(<��yv���K	�ǝ���tX�9x�
���=x�~^6�8�3;ch�w:M ��:8�;.�:^��fC@)���v��Y�HV��lt�s���f�C`J_<a��S@0��zn1} ��Q8�<�0�7
f[��4��>ow��w�}��J�8=��B��(飗hr�Ŀ�:K����!�
3�`����G����I1��,n$5��=�P�$����^8g4���p̰�
:I>�r8�P�����l�������2��Ê�yBN�������v8+ 9䦹�#\�:��׾k��_�t��_�3���t��U@���#��룕G���3�G4+��l���I49�FA�J�C/�&�);�
'���:h�Q~�4]ڂ��rD���l*b�Z���?vz[���c�9L��
h���/�9:�\���67G)qF��1e�~��A�g�����-����:������w��o����Q*�O%��[�)V�܎��Ϩ�
��;���dETYޤD򵨐�����|\w��hj��E���=���N�'ϸr���T~�d&s҃���B~��e8FW���C���攲��&���hl$�K=!��J��J����(c�\����1����=u�Q5Z\p�}u�.�V���90,�B����ڏU�?��8���`a/�	�1jp�z�����Yv#���D�]R�N�\(YA���B��n�V����^M��5h;�n���n��Z��)'DH�������;�rZFEG��*���V�P���8<�0K���5��'V5�,~�U8�Z�!0i��eB���� Q�.7?У'��յ��6�;���[��6�&N�W�ů�:'��
V���\��Fү�a�S<�
��l�~߂���E�����e��mf���d���_�$����Q��hPd��!ؚ֪��j��t OfyV��9��L�u:<LP,����9�����0]�%`Jҋ3?�1�������2��,�S��4�#�A�FgJUcH�x�S����8�y��BVKxY,�G��*���x*[�n��X�8l>6�ep��w�n��[�.��I<��ho�w��E�eƩ���Q'����L�����7ucUY���xt��ŰG��v���W������y�)�u�C�6
�n�����Ð>2���>�sbV��+��6��ߕFEU�F�D+�dy������D�i4�ھ���
���|�10�Gkl�79!E�#@p�j��LՓ�H�q_Aqgv�禎=�w%ף���QQ���Ƴ\��)��ZT��r�k�n5zJ�IֹO�+�~��=ё�
���g�^���k�Ю2��]��tSN�
�������M�2Wq������r��
g���\��͑�\��_r:�`p:����7P���	f���e�2�c���/� 0�{���hV����U���p�L�G��^��%�Ճ�Cd��,��AuH�l���}��jgem�P�<5y7c?|��P�/\��~�Kusp���;�B��A�h1z!�[�ުdƔm���:����KCw��b����2+�9������R��3��=�_M��O�{Rzb�1!�iW�'�(J>ə�x��ҙ��d<V��))=������������Am��~��tr0�a�i���Ĩ��3�E;U(� ]񐂎�����$����/��mÈ^`
����Z�� �v��\��o�v��;����#N�uԯ9G��\�4�/��
^2��Ȭ���9ў:������h�C>kpO��L���?P�L'c���'�}e`�W� P�W��''T�5t@����{�j�ݫsS��-��b��Q�0�����R�)1�HK�F��'
_*�Ҹ�i�0?i�*I��l�:��j��iyK��N3[$F�r�f�5�Q�Rx�]-SB2>�pl�R��D�Kn�ne�l���
�}�R�Ҷ�r�+��`La��O
�P���	N�M]h�p��'d��,\.�R�e�ܻ���w����gQ֡ut�3�M����/�5������q�^8S%H�n=�E���k-[�����S|�ȫ��&�C�H���]Mو)��A~�\�`W�,,m�	��q�9�9��)w������)ȼr�����J.�c�߷d��"]�z��VE�ϩ��sq/�G{�p��;e�P�n�jm,��t���@��ޡ�T=�{)�o�s�������)�;��{.��{R*���Sl'�&�0@�(��a?�$���l$c�bA!+]\�ҝ�fl�'J����e�Pt��<��\/��7cQ����~��Qo�9=����VM0�'�Qp6�O������f3z�����M���R�d8�	ݪ��8��;?�;E�އQmn.ヅM\�'��mO��&pO��a�o��<Gd\&Ap�+[/mό@,Lj���d|��}%h�l|��$�m/��/�>��?>k%���?B\(x�-�Ar?��ɘ^��4d�&#̝Jm�CC]���D?��0�&����f��b9��l�~��#��&��k�w����o࿰�g�׼����׼��'S�Zv�f�PIlTC�o�����{{��7ejNM��&�%��Bu�9�BE(�\��d�'�0i�S������$�ϰi�ᑊ	@[{��o�k-.�"2W�U>�trv��^yZ��f�!��q֋.�.	���I����5����պW��������ܰ:9��8E[O}�΀�U��:�ؓ_���i�}Mf:<��3��0��)���^@j&�NQ�Hq?�|Q�Bd���m�Z���dN`�Ѩ�뷚M��f��J��UyD�����#e�	��a;+����Tşp�RI�Q��۝G۳��Q��*X����"��"�|��;��Ŵ���"tE[�QP��pϫ����a8�/�,@�_d����M;�1��a��tX苼UmYtK�x�4B�0���S�G�u��s�5	.�jA	%�8"��=�#/�+�7�h(����U8�1l�Ar���sD�B�s,(��X���Hp}i
���ì��*9{��\e�йZ5ɛai��3D|���$�H�I���;�{:ݨߑ�tdz�0�n���C�>G���=	�t!s�SF���נ'�-�v
{��d�wJIɓ*#'�n< ��3;w���|��ڔ����P��� Є���&p9���
��9��oS�az��F1R��H�ә֕O�R��B ���T8�����S�7:���3
6��x
��
[w1��j��jC�ٍb5!��)4�۵j�Ξ��{f�< ��Lj�6�9�H�:�� ��!��
9�Y���8�%k��c� �Ƶ�873!�/��4H�]��HF�Nb���l�F��>8�v���Ʀ0���ߚ�J�z��a��y�;E#�pЊ�ҟ2gs`���c��|�v)8ʭ��q�yA�$e�Z�ą��d�$%��U���/?X]��77�O�ŏ��X]7Ѡ~T�FTA�yQ����0��k�L�5.jgH?_Ӕa�k��gL���a'W2���[�᪘�o,�)����rP���(X+���2��H�� Gpr��"��[Mps�*���&�	)��p�)�Ѳ{!��$"����K���h4L[���=�FC��jo�K��'�<�K3�3	�b�n�\2�-�a&.��
�-'��84�7���Y�{��m�@�D�"B5�m������ϵ�
�.?��u��CJ<��g�&�Z{+7㌾��f�)��bK����8��Ʒr+��V#�4���y$�[)�����]��H
�z?\=9�6�U�v+�D��I�Y�߼Vo�7UoV՛c5��4�MΣa�w�T�8��dM��a2�b�7Sʖ�2!��3�rU��Xr��|4�%�,��lV�[_+�����ʝE��������3����7���}[��~r
k3;�֪_%,�һ;1M�����&6UG��n�������p�p�b��ݼ�:���jU��Er"&2��۲f�Ge��1G���O	�^��yv�r�b���Ε����d��nf�7�b6��tB���bƗ)
q�����R1Z*/��Ӓ�5��Oqa8��ui��ϴ����1QrɄ�dDU�t�3y�P�7�a�*_�㴨�G����x�p�M7���(&�<�h�b�0b�xL�R�(�h|�F����w�;nv��9�*
H�ZŽZ�-������),���ߪQQ�ޣ?6���fʩ�8�҄��F	�p��K�?%9�xɿt��W��N.��A�k?7�I��n*���yfF��w���p�ӝOp�}"���͉��s{�0w���� ����f�v�����`5�+I��1@��������w^z	���ݕc�F(�4<���\��0�s��;k�ª�l=�U��4�s�h)��-<�?�o$��^\[i���
�o��6���I�;�ku��F.���;��o3�˜���^1���hw���<M?wыG���D=2�:E�\�An�Ar��z����u3K9��+6ũf�1;V��ߋnD;��G��r`V1�I0�#�YW#k(DH���=v�C�"]�Gio�C��j�8"�j'Hq��4�dަ�I 3&\
y��*l\G4�n��Ak�d�{g���
��������3l��"8.U�.T�+?P���kx�ƒ��.��L��Fxl'��dDr]�Z�����A�GwU�>D2sY�|���r�ǰ�
���*_à�O&QH8�˸K�*��Y�•Wk���ݞ��O��(ҡ��*�E0a�{`���s���3��жdc�.�|2M�%a��{ۄ�j�&��õ%�G�pL��0��G�q��L(M�1�K��Tec��e2�Zs�co�����1ۢ6��m��w�r�ݫ�X�d�dr�
E
I`E���+��R�����CL.?*�̮���=�b�v�)��]�J���O2F_�1�H*�ܔ&i�Cl���Ў7R�$�+�5�=�/����7�#�{��Z��c�H����U�3��x����ݒLB��ݕ$�B6za���ЩV�i��	o�گ�B�t�������ڷ��m2r�!g�k �u��c"�̠�/#U������Q��rz�<��*Y_�ь4[���.�G�
pjdy_k�@��Z3o(b���q�WƼ_�����*Ulu�i>2�f��|D}Fn!�U������=1{ĝN�Q4���p��ĕ��*-��UI-iVԄKYc�‘Tn��1��5���,o�Gq���jdw��-��C�"$.�#��}FCu��hfHь���Q;8`��W����l��0��0�=��z5����cZ�x	P����;�H>�o+�H*(��wZ'�y������-�u�j:���P�JG�3ˋ�
Z(����LS��3?R���s��Q��r��P�}�~��
�k�5�����~�
�9�!?�"��ZsG�)��-%hَN�g��6�чXy
j��@�v�����&ÙuI�BT���9�!8��<p�3M]�fv�ա��S�;�c����b�S�S��8��>u�2��7�qښ=
��<Ү j
���2}B�[��—�����`��ݗ�LI�Sd~��T0w|Jz��h�~�e�RԹ}�m�(��w��F�>g��I�O�	h�I�����_
Z���W�6r�L	~�����ő���hTLl)����b�l��
�}Y�!$��z�Zi���w�3���;w�?�1柙���r�76nܝ�����0�/�̩J2p<�D���s.��x�~yN���=cuN�t��{rB7�ǃ�A����_�!��QF��f$�hp�f��_����Z{�RIU��?Kz�D�8���iB����X����5���I�_K8�%KÄ9��W��~n?�
�?bY��GX����ݱih"��8$s12�e�o�{���/˰����IRՔk[*�.L/�P.I�s��w��Y+��ĥ�E\�L˿�^o��^�&�4	���1)C1���\�N�d��y{FC�8!~o|���]m���,����ϖ�����j�Β��Je��Vɠ���T^��
��'3��cz�2�WQ�v��(Vzz0��n�P4���u]f:O�b�yw�����CA�OuW�~���F�CHl�wߩ�:�‰UQ���l�c�;�`X��P�u6_Rp�(+cS�Q
#�"���&��B�)�2���,FJ��!cph}����cK?��y��[�`��ވc���k����%��@�jI,E�T�K�TӺKt@�*�_9�x��cP��B1OG��9]
�du����6��bt���0�)L������abY�*Ļ/:������p���Y��@8=�
�Hz�%1��h�"W���O��<O(sqa�[L���p3[��oLϽ�@y��ǣ�^M�t��?\<t�[(���k�?��o�U�h��۬�ok�K����'Xn!�q����`�9��e)���������`�؜
�s��h�8��*�@;	m�,3���dZE�X>k�����T����J>�����N�C�PN�
�������MeV�u����F�y��@V�>=�4�[�=[^��:��[����3ڒ&G+����sY��G!��e�'��,�U�P�5o��	+GLP�}��x����^lGI����?FY�Kn)����5��k�_�[�@*'�	9�S��*�:Dm!O�m�G.���0�o�&iͣČSh��V��$%y��`ZrٔX�ܑK[�%�
�-c�S�c�N䅩
�z�m��k)��U�xeԭp��#��s��`��MuL�v��D4�NƦD�����K��d��ok�)�9 ��x�|�wz�7�������ƒ���/+�h�:��z�D"Y�d�>&��M69���s��1e맏b��4&Y�`�5!�l�E��e1a�y���_�,y�6a��Η�����r{����Bɼ��L]�DӋc�An��������xJb�֘���C��ؾ��A'ES<TȆ�~� X�nH:r�|�Xh$I�O�S;�~�/k
�����I E�,��v8�-oq@��^�z��W@�=6�� �2g�z�}�X$u'��o�D�p:FÊ�J|����ښ�����������7��VL����\wA>w:Խ�}���*}��̩�z�t�ʍ�c���%Q'��K��rNψA"Sч��X}G�F��c��|L"�F��Q�(�VtWy&{Fw�p�sʣP#�e�D?����#y��@S�z�)�/c��n�9INŽ:��{E��9E�˳T�'C���s�#������g[� �s������S쿫+�������;��7i��j�Z��(�E�f�Q�	�h5*��$�p_r�
0�+���{���7U��G���ݩ�N��61�ÏG��|�>8�n��{N��qf%�
�B;�W���PA�-�1_������B�ɧ��g����r���ʿr"M��6��@R�2e��I.��9�_e��b�MN�R~�c(!��hH�+���	�%������m?#@5�|�q���2�GTf�ѱ>G̬[+Ye��a2z)M�w.��&M�2�N£����3K�N�ҹ����ޖ%��
P�7~H�6��X
{s�M_*�j\/��r5-U���J����y����G��ѕ�;���q`Ge�Φ�w;�@]0g[V��@�";KNl��J8���1��\�SUE��Eg�S�+w��&�G��:c}"z[/�n_5�k�{x�댆'�8Ƅ�V;5��1F�<0/�}ٸ��PLX����C-�8��>���
�p)�*T����7#jV�K)�/t?9��|��4qg*�� t�f7*�-p�����p)њ?��\�w��|�C.r��E�n�LU�τ�c��?����
�ze�c���M��H_h7j�h��ş����x���͂w�\Ol�\5|��Jr�;���QL
h�s5@����^A�"��A�z�[�J�6�R��g��;(n:ߠP�7J{���Aן?}��9�t\�+���)lͯ����͚��c4mD���r��A
aF���6]v���u躠��$=T
ƣ��ˮ����T�qbēɚ���t�q�1��P�9�zx7���v3�����y:��{���k���B�G
ae�y`��,=�0�P�&�ȣ��KlZS��Z�ăi�Y抱�؃M|<�
��7�L�`l�g��g�:��c�U_t����ڞ�p�|{�w�ٟ�\�Jh�eXrE!W��!g��ہ�i-��w��Z�`8���{��a�������������N������l_F#r�z��}�IjUҾ]�GN^�!C�}\fѮ��yr��u�,�f��u�@�k���^˒�9�s3؟�W��4���λ×{��`v9�"���Q4l„/����<��)��(:Eg${�P��pU�
8�^BJ�K0
��@�Ŵᱯ��s�3�n�d��J&&��6 9�b��jX�c�%�e$s���<k�k<�:I�^c��!�AI����~��6��x 1M"�TĞ�!�c!�'���-��8��3c�0A�8���M�yu�^��\֋�O@d�T5܏�ѢNz
�����YBfg)̩��RA?�~]H}�y���8�#�|R쵣A�?s%<�a��v�J5�]�;���n�����+�[��ǢSw����~ /T籘p;J���D/[��S�jY)�[r԰c����)p�G���|�򄳔<�uJF��<p��
Q��MJN��W���S{��r����6%����<�kg���w��
���:X⵩|���2����?�FV�����F6�����`GS5>ű�ӭB<2��F�N$E,#�=��5T�+o����a���l�s��s#o*�n��+�a�{�䇩��Q!�1�`����D�s���RC���EH�����A��6~\{�����vK��ql6��%�
D��X])K��lk����b>���#���
?��Z;ns��4\��7EK�u#�����Ly���i��i�@�2��Dͫȏ���zL�J����B��h~�̯��,��+u�[*���M�?̡L�B�YB����U���
(@Q�qA�E�.�j�P@��)pe�I��<̥�U��`%ģ��f Y5�!��̆���e
�Sf1�_����v�F��0B
�Q8�z�%�x
�
a��{�o4٣�*��-<r��4�{i��eݸ�#/�dR�*b���Κʴ�N�@�~�+%�k��u0"/}g}kQ?�й�߶����7Gc���͋�"/��g�0LG����
�h�"�s&���R�ur$�d��		:�as<~���&<j�hn3�C�T�*�BrfQ���S����*o�+�P4�5c>0���"��Ldi��9�D��'�V�D{
��P��nN��9�~�����W���
d4���J��s�CT�r�=�����e`/���
�	��j1㞵3s�P{����Y�2 o+�W��)�a~guuK{_ٳ��&A;�.���!�~6���4ʼ�i��peLv<�0�f>���73���*�-�g���l�)g��Z�&+p4�RdԹ��&�Ӛ	8�����^�We �Qr��V!��	%����	��/���ƨb
�K��d�$�F�,�]m|ڕhx�盾�Uu����^�������w�) z�y7���EdR��(��H���f7�d�E�+����b����<��'��_�%e�\���Ɣ9��a~�Q������s.��R$U��d��Sr�/���q;���_H�=���}���?T�3�p(�{����i<ZB�^�J����y�I&\d�&�!y��<л&�>��3���@&9�h����;�{��J�XV�9�y�R!>S�!yA����N�:k�?Bz��c#��9��Vv҃��9�x^���\X����ҕՒ0��<K�yǁa��*f&^'�fNX�/(8���PO�]�{8fB3�����!�/͜@��0���*5��\�A<�'�/����!VO�+s#\
W�7b�8MY����z�hist��o�e��GAi��IR�U��2=�t�)E�4��?'S;ҝ
�/��~�r��X�7��<Vt`	Wa	7�~˖�˼���lM1C�'�BU����ӦwH����s�^�J��D+S�g�vs��k4�1�K��x.�O'~B���q���E{�:upSdž��2}:9���FQ�d����Kp��L�e<Lw;}]Z��[ǜ�	;�4���!�+,�
^Y%0v��f�f

ᣬK���U9�V�~�&�Ѳgq����ѭ��P	��]��3�k��A؜���XH��z.-��@�
��}�~v
�)�P�W�)�D;����d��h�T��݊e���FPN�u^G�&�x� h�-������X̎8�Jy�4��1�����{����d�_6}ˇt�	�'_q���O���Ł�/�8�gV�u�x�j%9)ƕ�|�m���3��f'w�&�5�
l�{q���d���ٓ4��� �2����n�#���Ϻ6ms��
�)��Ga��W{?��ޟ��R�1U>���j���i;5Y�F���@�6!�/%���N���js h_6	L���s�O��ؗ̀��t���2����0�E�/�}��&A�nM�tz��Ky�;�@`)�D�,��.��A�S*�J������G��
���q*�:��6=����F$+�ɻ/�,n�_U�T|]e�\�V����B���e�
�j�J��;|�_`��|�-k��|�s��ꤏ���:&���R�ކV�Q�Z�J�e6�d��nXwv���c�AFB"�m�[�ܤ���qp,��K��� �ҹ���Ɨ�(T�PV�H>����� ��j��HYDl�Q�/{���u(@<�׻�ۯ߾�}���yv������-�'ׅHi��o�1}д���[��Z!N4�pSK%�N47�*��~��[a��8���^�$u�cs��|γwh4r+*V�K��\��[�ҳp��Tj�a���	]F�w+�
1fԵ��V<h�H>�٘��W���A�C�4�>���L������'�"�N�?4e@p��C�,���:����Q'X'{��Q��/=������0�T�R)=[`�̎M�ҹ~�z2�a�<�2������s�Ƅ��K�K(�IEƗ������c`�,0Ly*���3ZV��)�&��QW\�zYWiv�{�>kQ��N�-I�\�z�
�^z�쉏!�g)\�W�i&ch�*����Í�Пh��nH�D�"	��]����Y��D��s��]K�7c�ϗ����̶������'��c���8����}�Ί�<֋��`~�뢚���k�MH�o�<��#��ul�+x:�v=aW�+�{��h�%�W+s*w"8�h��)ZX�E���!W���-z|o�_ۙaC�V��X�R�Q%g��p��r/�O�p�v��Dp�{���
�u7�[s��VJ�V��5��Ʋ{����������y�gG�py���L��_C�~�eƣ�,Z_/B��$�׹2Xp�xׇ��
����Ն��~����.���z���_)��F����q�0 �"�Y��^뢸�ʉӪS,�Z�JX�<���Z���J�j��g�[y��-e{���Pu)���	f���W�xٮ�,��:��r[~o�h�:�Pe����'h�����O''���N��/{�����J���x�6��ߴ�+�d~��U�dY��b�
��מ5�A�=X(oB2"܀9�p�>��o��
��:�\K\�_u��lQ�-��@�6:l�vX�������ۦfU
��~����ӗm�v����~g��T؛�]Jgl�� �.�b�gٗ���
�r}��l��9N?��v�a�y|�s������G˿�{����W}������Y>^z�[s*�xb��(nar~1I
}
���X�i�\�Q{�4��n�������"�J�Z����Ka}�_�R����w���3��|�o����?����F4]�J�tY��ʕ���X<>,�l�Z�s�_�)�g"���A!w�T��c��BGZa]P��5��,^��hbb�<;��4�b��9 ���2u�d���yz����8�a�R�]�Y�
��Uì��W�ؑ�h}�IZ"U��u��Ӭ�M$��ôT��j�gҕيwK(ee㾥o�T8*�:�j8�]�n�B&��N����c����_]HN9��(e�����YL-�*�gaE�,��[A$�w���ZR&9�O�!��������O4�DX�X;�9�C�@hdr��Z.�U�З^�:G#�D�m��������R�"�0*EC��Z���(�+���a��Ek!�-����bN3l�v��>x����y��f��e��&�2��6�&�K=�|Q�r�6Y�:S�z�y~~�"�\I$Aٖ�s��e��O�B�F�r(����jA�C�5��s6.v���:�����9�p&Ĕz����R�
�C���눝
E�RP1W��<q|�U3�c���M����>�����]b5���'�d��]�F��eD5�:g�†�wH�gH�%���xM?o�@'K،��u*�Ŋ�+���͎C�@=��HEU^���e��g	Ŗ@��.�%v	���<ja�F��6Xs^]G�~�+r+x��`�l[��5Û"��E�XXi(L�07��w�(��i��5�c�%�')�� sn�FF*��Pg0LK�C��{:c�^j\V���{<f0�J"<���]�+��[htEl&�1����a?�cb]�6�\�q�f.s���ݽE|깴펱F�R���Y7�����{g�=��d�^Sd�%�v��Q8Ƨ�aJ��jO(߁�q�Tr�6$Q����l�V�#�C�9�s���Kⵆ\��������4(��C!�@�9ǂ#��*L��4�����X
�c�wHW!�`�5�/,t���d1�;���J�wE/F�W���)%��Q{�:�k��y��ߥ��(EeL��%���s~���f>\�BH��,9�����i�6��)`���"B�'<9��}�!tGƙ��߮���z����N��2���ὯL)�V4\e_7�p�+�k���Bcfj�j��
�h��,��z���*��(\��ܜuA��]T|��
��f�W��G+�yD�1��E8Z��)��(�m�q�mJ\�|�
����/H�RuK��X�/�_5�:H��$�<e��T��g��<�"��Sn��[�o���[�|�,m����qx��G��q�\^�8��}w������[�朔Œ��M�\�='l�`�r�����^b��d0��q[��C��'5�C��*�_&�����Wx��yeOΧ�)�i�Ӽ`"�jU@�pj`��]y���ޒ�b�{�N��p{��Gv����|Lݑ((�0[�Ot&2ӱP�`7M�32[�5c����Qe���;�������#�D#���]#�??v�q9c���¥cnD�Th��p*۫���܎R�Tq�%�>�l��2S�0�
��%:��v��7�P8J*C
��ó!Gԇ���eJζɰ7�,X�y5�)[#�$�W2�M?*�Ct�I�guQ.:{&L�q+����
��n:>#+��I�$�tŗ�Z�xd�b� ��m/�U!��2}`�.v�[
uuk�a#'Þ
C0��c4�9p�{&�6�'8ҭ"@iΊc��wv�6���Xg�Z����ؒ׵rK�qw�g��E��u�c�U�L����0����A�]�Qـt��+� Q��X��h���L8��' �� dª��Q�D��I�
�Kt�°��Rn嗖���ϑ�!��.)��o�����U���|DY�r)Y��7��jɸq�� �ϒ$k�|P,Ӑ��M��"㊾��~��(E�"&�)eXu�.I����5˝\��wK�{K&)��N�V(K����s���Wx.�vJ�.��8��8�eN�,C���c�m�{��dv�LL�}"Qe{����Nf]][���R��i"�4��,sFUNTah��@�,�!�L٩&�PcЖ���W@�U�
�.ِ�(����X�ҌN�
��.ł��C�d&M0م��r:��.$*����;s���A!��\��AF�ZKŁ���94��h��PQ
�ch��E"v�"1}j4Ch��'R�W/W�*��&��K��S��|����7�"b(���<�"٧��,E3��{��@���wI�I�x@>��T��r�Tziǟ�`I�^[�]�Ƒ�tQ����=+����`+<���B�(���%bV}��'��謼.����9�a�.��U�ϹD^KހԕEL�@',+�o�ἇ�Q��X�����l&$�N	)�O�v�[��6Y�{Fpf�aL��E͵D�b�xW牾4u�+Q���w��)��`��r�H��;[�d��Ab7�� \��2T�����fZ]��r	�|��h4��Lϡ�S,�6߂o+���I��)7����e�W�� c�tR��VA㣓�e�Ur�Ϭ(8�y˓ո��t�Ce2Ic�dI
���:(�,1�8�yq����5�E�‡�q^S���`ng-1�}T�F/�����S�_�SKD~�Hm����HR?P�ɐX�CH<�w�ii�����E�x?��48nC�خ�0�����P�{��A�3�0��WdDH�*���K�%7��b���
�1� ��q(~�ޝo�e]����O�����|�wH^ÕZ��l����d�������&�-�в���YR,R�}��A��~���{��
ǣA�9c�e� WEu�r�H���ק��|��C6e�2��p���#�7s,���PLDý�ݘ�B{�M}��fAe`aC�����~Y��+�xc�\�]����h�>�wP���u��;خ20Xo��T��o�M����fSVL��^���7e͑0MzR؃���y����\+�7K�JMfeee�=48n����C\�֔�ùYI屌�<��ȍ��[/��v#W��w�=:��,%:
ذ��SÅ���A�?�+��H�݋kƚ�T\��l�w�t~�=|�y��i�9�=������_��V��8�$3M�v�jZ'�dH2��5���BD�1�D�f�K�,��o����2�~��D�)UwU������g|p>
�a͟�R��"E�Ɲ[�x&�P9�x��\�6=�-vJn9��
�<x�@:&'dHM�*�r��c�̣�K��8��ȏ1�\[4l��l�Kv��i�?t�b,�V���x)�}����#T׳.��r�Z[�8ҙ'���H[��MV�Y��v��̳�_�H1�VX�(�ͱp�9K�:�G.�$�Yc����>���
D�+�x�{��8��$��I��؅�"y[�����TO��:��u)�O�X4��p���{)����7|!,�0P�-O�.�A(����N��?���KOm����U�V�!�79�s�*�N� ���?�����]�B�����B/�G`�0��P�"���������0Y�uX�ȚNF�ˑ��T��K���9]��pO��Іއ��zHq3+_Y/���kHZe}w�r����L]����BG�'��r����W�tаM��rh�$�e~��I;��8��V^m�޲��/|�)�F!zy�5zE� .�g�Tv>!�2B螥`=Y�ɓ\�16V��w�4\vD��?[�ӟf����vٯ�n���O�b�*�#��'t�ڒ�W
:�}�a�j��J��C�vp����ρ�k��R�tN�q�%�鈪�k���YM�lV��*�%Ha��^)A�ݲ���#۝@kԥ��C[��K�
8fv���s���w	��cᛞ[Bm,��.Fi"��w���y��7����U�T�^R�G:����Px�p0���$�%d[x��|<�@^��C�|%6��D�h���_a֦sA	:
̂�Vy�0��d�m����b�9����T��ˆ`��B����&�]�E�w�W�{��0U�
�΂�L����{�0�2�(c��0����e�DA
�nypc���#v�/��(\7&O"��u��˕�)����BQurZ��šHmL��y!�~c�v�����Npni4�='�q�(��,�|5�rʷ��ϼ�%vTA���Z�]p]XoJ����)}�V)�N�)V^�?:DF*��jؕ]�Yմ\�’6a0�4�X`�v���8��mVs��*��ޢ�h��BS�gG0���ĕS��U$z��s9�����s,q�SEHQdF��Cg���aiK0��"�ɂ�A��Mx�*����[�W��C�����5K�-)ʄX�~GDQ�8����@�;�����(s���"�`+��?G���d;�a�-7�_B�=�.5�]�N�aynh��l]	u���7|N���dnH	�ms�GE��K��V(X��$/�kGق����՜Xw����T�'P����?
]$��y���8�્�� xG� 5���0�bƭ���aw@�FP��<l�\��s�9��su+��(�Na笜��u��4eǵ�H�s��ظB6���Qq��TODWr$9(�WV�G�"fD"�67��ˏ7�ߥ)�f�O�����y�G��zY���9I����HG?A*�|z~��K���Hh{!u�YdM&%�+j�t���>`�`aTc��u)xv2ׅgu������iig�R��H�1E�d��V/ý�r%{�E�ƅC�N
���>=C�.~��C*#(Ѣ��Xt��$FT�*0e[A3k�0���~��řYԯ���.�Z�V��M�-�Z���t��;t��u�N�q
��z�8܉?���@I�b"���[�m�>X#f1zu�����8�U��;���lzj��]���E~N���$�[���\�N
?d��Az���&�q���W�~J5(c���`}}=�����7x{#?�]A��h�VgW{\
WL�ً�"/�3�=/���1g���/̎
?ix��1��>�W1�]�����߷�o�t�(6��U8�}����<�����\]y��?V766��V?��WV7��u��g,�O&��,�S��z�O�_�ߢ��vXC���.��‚]�b�YP��>�[��Uua���~�̱��+@%TzȘJh��/�;ǟA&��ӊQ
�3��{*qs5읍�a:�8'.�-��B�M�n�{���5�D6H��zo/8D\s�VtR�A��
���-�%�L��-�xs�x����įi]�EzQ��~��)l�\b���v�Ӻ%�b0s���	Z�܋�|�;��m���ʣ�G>���zG���T=�E7��`Vp!`&��E`UΥ*����"�uZ	�r��K	�.
�D��
6l�(׻K�U#��l��+�*�D��n�Pu�=.,x��R���YE�ŸM`��?��ID��_��8�kx���p����
��b�5��!�DS���p' iIe2y�c�́m�2��A����}�{�y�sx����}����1�s
��e1c�5����M�T�2@���ʩ"唁Z49�W6@3�0��Ӱ���$�K%��4n^�d��d�xk2>Y���?��A��Z����F�{h$CΕ@3a3Ƅuef��qEZ#`�㸥�H������r�d��Rt,k�Nzk�V���Y�[���E��m �h��Z�V
?�б�a�]�՜]oku��8�.jߵ������Ջt+޾[�'ɂH5�l�辤E��s�x,@�~��`v���2����5l4�!���>�hhnbU1iBSd	�l�:9�* ��֓�Jp�Zj��`8�l�^^�P�|{�\%��ͬ�RU4��Q�_�U���:i�0!;��w��2xխ*�����>��u��E��N��T�q��>�H��Ajq
�x���o'~�Z�J��(�?{���6�$
�g�
�<Ӗ����n%nǝ(?��Yۙ�YۣP%1�-$uq�o�
	� %gһ}��>g'Q(�
��BUA�ڲ0� ��ػ���\d�k��t��mS%@��RXu�?�����?�=��C�$i�\�M8��F�4! �pң�@;7]\��;g%oߝ���^��{�����7g��̳�֫�7�޽�����?�;����{��N�^���'�m��7�Fpl�w��T���	��?z���7�f��]�ڨ�cd}��)�L|˂�x�S�;�ٱ�e�S���j�����Y-�c��O�����o�^/���_�鯳�y?���B��'�f�@���)#Y��ª��ӡل��
[~
�z���A�����Y<,����G�2��eU5Q��3��{��IV)H{۟FU��F�+�X��b�m��;�
��P��czv��_H� 7q��!���#+�1~��K�Ϩa����[D�p��<���n,O5�>q3tܔ漥�9��Er?ƛ�lՐ��;yq7�8��t.k
_�o#.����?�;��;���`�џ�?<���z�q��M����Lz	RS�`SS\l���-�B��c��>a�2�/�X��>^��[�=�-|�h����
���<2 ��M�"��ySy����3�d�P�7�#�
��E�Y�V�����irgJ�w�3�J7�7��™a�[�颭�R3Ou��d�Y��Q�����c7N9ʶ�%E`mG���:̲�Ւxv����%�λ��l�K-
v�	M�@(5��E�W��wcC�'�>��≙�:Ms!6�(��D,�+4�Z���ז��S�E:Bpf��=P�@�����&�X�N�D{�R|H���QHK�j���/7�S绠J�8r�Oo3}�K! ��q�f�K����`�ӏ`���f������r(�c���h�^�gO�JD�u%�K�&-6*=e�x�,�x�%���Q�^B�F/A�3��!{L�g�0 ����Q��ϭq��*m�G��9�5��.����yx���F�"�uu:��k�K�鋶9�!P�����t�(`�Tc��b��<),l�����q��M&�wMlD�Co�_l�$��
fa6c��bp>��Hq倅�� ��ʞ���}yB��J.s���,�0���Sc�x�o~:�4e*�AW|N�
{wo��Y?l���c��&*�����^g?��5�Q�7�J����G�P����
�e/�ޟ����$���;zOe6+���	tᄣ8�aJ�rm�����Xz�T�5�ms8F�H� Ǎkk�F^4I�x*�����
$2t���U��H��g
�Xi��#��cj�X
x�+�M���JA^�@,ئ�2h}�s҇N���~8YM��T��VRQ<�;�cmJ�q�����ʴ��G���K"N�z����f~�,W]�׍l��f���(h�+`�����6*��OC�t>��E�
������'��i�F!ȡr홺1��N�)�`��R�e�ŏ̀͆��)��xB�5����\�J���n:�+��Qp1P�q0ݫ�8�}�tfGNz��I*����ݘ�%f0~�&?J Q-
��{�ŏ�-��kdܧJ
���S��i�Q+�C�l�@���I��~^#P��^�A]5`a>Ɋó�Oå�t�T����h0�I�j�On��#׺vo�#��Ĕ��V����D�0FK�j �3�7J�Ei<7�K����[y����Md�4�e�Ǐ�4g&e:�B6XA
�9M]_!�iR�V���5ޔ*
���<�ʆz�rA�od|����/Mg�t��
>����O*��ܠ�Z#Mw�vC���f����/(�@ă�IFj�x��Y�v�:[�:0HP������cp�	���u�+��s*(�Ԋ1�(
"
�S�F2�)Kd@���U�Ԋ�7.^$�{8KA��b<S,�{[Q8V�Q��d�����e$�\�0�U��qc��WJ9�3�C�=��r����]�
�Rï稉�:I��a�'8KL8�V�BTQ�e"IU*I�zZE�M�*WJKS��d��b.C��n'���Z,*'s�C��\����3�e����%י�,��:�H;�Gäz�X�`$��ѨV�A�FF�U���M�%J��AM�܁�X�k��J���T;;Ú�� 0�Y8R�y��#U�y�:��ɔ9�0/s5�ȇ�L��5ց�;2�Q0���2
k,�����'H�HTa�F���lqgb�L�^���#{wO�Tw�F�ݲ˞�a~*7G���t^8A���(
dwV�ΰ�|Q;��� Ќ�JM�H'��j�/(�Lt#�l��[��Ljg��㌲�S/�;X,�e��!KU��a��
¹2´1�+0^
ߚ˺�h�0� �>kx�0�Ť�!,��Y�+��
�e�y��Q6�OpE-ש�����p
��\c�уwvڬ�37q�b�ʣ��P�V姇��P�\%p*v���n��(���ț'�Z�YKVݱb^)�f�a��g��=�5�L`:�/��J��}$�d<�qOf,n�Wlo�e��Y�֞*��8
3v�-W�+�H���Mk�a��>"��	!nZ+OA'����*�IHK]�C[�w<^��Z���SmQsB�Q��C��Қ�)���3�n?�T���F�F�'��7�=j����zp�����N�
�Q:u�9�j�`�(�c��;��O2�*�Ǹ'��h�u�Ēu��䇵���ێ}�	}�ld�U6��G��JT�o��K������+@�:�d��枊���h*��e��c���˒�8��P�蕇���a�d��)�I��d=���D��~��!�w�)P��U`W.��WUc���]3
��5�����j�'��q<��dD�ϕ�~J�ɧO7�F��+��fa�?v��8�s0I�h�vБc���o̰@s�;�IP�ڙBg���2YO��5:���'�A�(<a�k�eYѲ�dA�h3Q�o�xZO����S��㊑;c��;�BjJ�I�@��{�A�|L��{lB�6&Y..�e*�a�Y�,�|�Rd�
B�d{�d^���3O��'���n�^�MW��M��6t@�}̾
��@��ٙ�%�jA`ٙ*b������>�0�=G�Ǚ*�I�>6!������. �� �O2�'u��i�!��7ZU�)j>U������>>�����7͆&���a�]�u�v��8���4+{��}�
Rr��A浆�'p�@uF*����#O��y�^Œ��ջ�Aq�D�m��:��� ( ��JD>(��J��,א��F�AB�����.�ݓ�\Ù�%��`-L�zw��:6�vGa�>�2�I�+G���H�ޛ���\S�GH��7��p�q�!|SN ��Ou��?/HWB�����ݲ��%�*W�ěL�}⠪f��zO�č���[Ѷ&x�i⢗�w�7�׫�^��2>tT�8[��|��նt��@�T���،"f}pj��2;�l����;f��2���P��g+N���LMB?��G�ј�h��u*�Ҍ�L����l��\�!v˞��Q�����0�V�	ʺ!~�@�JYg�tLa�B��PQy�$[i�` R�q��܁[p��1]{�7c��(��DW����sbE��N�MVc4��;Ԗ���Э�m����Q�rJ��;S*�{S%���r^�;P�4��r��v*��ie�,F+[�.��.�<NY�<��� �1�x�7`c�3p||���y�E���J\���n�\>u$�7�}�FY4}>|X���h��r0��hR��n|�l\��c��1Y徇|6^��`R%�`�oH��oWu��_ī���T-؟��`��
�Xy��8e�A��A�
@�1e��SN6u1���Q*�^�CL5c�Β ��%�c�°x�u"�s�՚�]��z
���DU7��\wk��#�I��Jk
K��A�eH��%��
���h�)�Ѱ�jmܲ��S�cA���ɧz_�(sqE������x#�{꘼��X	S贈Xu0�����k�
�%����"pC@R���T@`��Y����Dװa�v�zm1P�тj	Ƽ����V#�sG{�AH�^81F�(�OAxSG�A*��Ad`xg��oLT@�m�O'^�I���*"1��U�6~�4L[I���X��u�a=�����I.�J�Jj9�T_U����gb��4A��F���.{<]�K��O�±o��y���R5\c6��J�x�D�Ns�⛕��^�T����:G�G�NR������q�ê��B�`L��H�~�u�S.��u�B�T�ܴl�>>U`�;����Τ��P������k�b@��|a(.q���47K����y�Zɂ���*���s�(��:P܂e�\�k)��I\6
�|�A���r��ڲv��_�]��k��W�e=��f~Bמc��	��vz�G��Z2�aͅ^�fC�+��D���65A4�kͅ�;��
J��"�T����>&ݐ+��z�����r��n�V��u��0\�Uq��ZU� �:����)�!&��*E���{J�����+�ҵ�����*
��G�v3,�kE臗�t�k�Q�O�C���&w�!3
�H���1pK�.nD�􎈘�MwӉF��h���`��&�:\A4�:�rM\�d�^ �R;�*z�nv��+	׌�k)،m�뮱�(���`�O�5�	�4�V����}�1b�w+F,���Γ�Ib�;�0CG(�ݝ�0�a����ք��|$ŏ�Џ���T���Q'P��Q�NK��a+��LINb'm�3��Wq�p�����|�TLQ����:/��6��_qW�
��&�/��\�,��H)Kd�J.+�k�w���Ǖ���
�l���~��'�h�=	kbb�n
��Dن��.���|�O��
���s�,���`���_{uQ�C�\_��FU�(�j�&�6�1�����)<0KNBg��N�N�?\CG(�θ~����$�����H�`��;,ŝR�vs�!�a��}5}T֓��TfeO�a�x�[
��Tg�y�i'�\pD,3��W�^�։����LY�6�_Ʊ�U����G�F^X7ĸ��`�X�Hq=���R#�8��a��3�A�O�Ѣv��7[ͼ=��m|���Q;�oG�jd�Բ���$qW�T��uɉA�X-"����|U\L��/N�>X�@5����l�qF���i�E@"�V�jݩ�G �}<���B��
�H2��4W�~�E�-�~`�v��d�*�#L�=�@;f�
$v߹���YV+��k�+l���rH��z�Cv!@7���+��A�wl��H5���5Ʋ���G�Uv�3r��|�*r���n��hJ��A��'�Ǚ�\��]R�4�j��	�v�s��@+n���S����0��Ph��8�9���hF�dPC�z�sWz3Uij0�g�	0���u�T+KP���ɨ�y���K�R�D��Y��R�`�\q20�~���=*|�b���+�9�9�v0�pZ�7\�� Q��5�j����G�&�H�9)��U$�A�P|�z�Ø<�)]���.Q���Y|lg�	'"5U'���_�Ut���7�k��M�L��s�|eW�i�Xu=�843(����ٝ*�u?V�`;�G8��\9%��F��>tK�V�Y:*��%�Ն�DqqL9o8Ռ��l}���j&ߴ>��TB������A�
.i�k7#zH��p�`:\ p�j�R��N+N]M;O��j	��uábeI��*��y��;���R��{�[�5��S5��'�6@�Y}��*�R�V·���nP�@�
�z�B���
t��2�1�ȭnP;2G�@�Lu�lK3
P�`\+lMoFID	^��J�v?��ӵ� �TkRu�o�
R
u�A�5N��ʯ�jHEI�#�H�Nor���W�1�f�g*���\>"���Hq�I�#��j�:�ң���PTb���#V��]İ�k N㵙y<�YY��&w�x�� �JA�]���ʰq-���o���յJ̸���,/-���j
N��i��E��/I���ԓ�ȹ6G��̥��\�V�i�H���^d!�W��Oob7���IY�"g3y�U��ᠸc�N�D�X?�*8�3��H���c�l���G}��7}-آ&uB:���g�v��\�g�A�9q����E]�ȜZ�S�2�������|��S}�z�^�W�gF�Mn{H�S�3�6�B3�*Qh��kԀ������
J6�g�(g�D5��=5SS��a���Ǜ;��ɖ>�j�f�!
�L�K5b�D-�k����%ވ`��jW�,q��\5sE��f���$�B�+!K
V� �S�jH��9Pl�q�6=
&˕Y5���#�����2w8�@�G*�ZVo���a�ܜ͖�H���:��3�9[f+�g��<ˋ0>�B�;�7ʠl��b<
�2�`�v��4D�Ff/,�9k��X�\�;�>�J(滋��0�8�H�ש�Ñ��o>v�C����p�C(�J͸K��|X{A0W�i����Q�Rs��
�-0O��1�B�t��y�vW��q���~�!f�,�����)V�����)&N��B5r��d2��ghi�M;�ܺ(�QM�'f�2l-��̏��>�d)�s2�}�5�UqA)��>*0��G	&0�_��PPNդ)��EPk��,C�"�G�d�v�P}qrM��H����KA�+�i�w�
��5V������US�j���S5��b�勦�z�Pr�[����kԃ��z���w��U��W���2�*�h�Z���Q!ˤ6��9t��R[��|����$� �#(�i��Y�^#�u=�M���|1����L]�z駰�?�`:1=#�ҩ�
@��9��uߴ��3Z^��4��.K���u�SgyY�O�Tmqǡɕݰ��a��T�_�Ro'�ӎ���ǣ:�=���y9�ɸKU�^��J�"�C^E���.�U�|�r�dx�+���J���޹��멶e
m@�鲾_�m&Q�Eu�~O뺘�y��o5(��`Y�˫�_T�F�;�l�h˨�Ű����˒�>���vB�_E�axle/V8OQ�8�rC�X�u'��q)B�>C�L�T'W��X�ي�O��;�W\����8D��LQ�7�*�2����qʗ~�M1���'�V���;�ֆ�y�+�)�?��2u���GJ6��HgRc��9y������?�l'��z;���v2�=�����y����wv=������>����`g�?����	 {te߯�[U���6�q}r�~�%^8��$�ߵ�J���7�^�ѵ,�段�t���[�_���ߘ��ݽ�k��������om�o��ŀ�h��!@ƒ9
�t��}0�
��.�S A8�7�n�5@�2Z��-����OhҺ�f	Y��`-�l�2�����7�;O����om,�£1�B�Q�wj˱8�[�Ʊޝ�"d���(�d;�eL������m�c�$n6K�*�޲!�ڳ��|�:4�лQjA��;F�L��*���hf
���U�y�S�5I��[��ݛ̘O��EV6e�*�L��'Y�s����6�ٵ��3ZH:v|��k�
\��rRY�Mu$c's|����`Ԏ�?��$!����)\"�L])�%\d8H%d>h��Ȯ
��X`���b��
�6	�dmI�B�!����u:1L�� (�M�n�Ց;�`�is���6�>�Р�����#ghh���?K��"�'sԍ���?�8z���{�w��N�������sIie�q|b��-�NOON��om�	��6���{�>�MXV1	O�Hp��^nZ��k$�_{�ŀ�;m��֙�Z���ۄ-��ն�8Kq��-6��	��V�R&,�ۓ���#M}]@�z�]x���`V?	�|�I8:�����#C/�> z��><������{!:��(u�e���wa�:�:j@쫨!�Nޞ��9��nn`�i�'���'�)�g'-��	�˿���ν��c���sAa�գ�OX�ykH$x^‰���v�y/�-��;v`��6�L��s�S��tJ���ف�L\��ˇ�j	���\�t�]�ܙ1=�0��|*�E�O]
���
�g*C�.$�,�B��Y�&�s�c�nõ� '5��hT�k쑱r����;�%��X���_L����٥����_}L=|e�Z�HN
=����¥�B:�amO_<���z(����q���IR��/A�>��/<�`���r�d<D(\���/_d�8
*CST�rʈ��DT�Z/��z�$*�	Ŷ��4��p�|_lL��dD��XO�o�Ӷ���Ԋ�A��'��,��~�}�(I#�-��|3	k\HóEMn�H"D|�|�2�S7P�,��s��́�z��ߞ���<;y���â�����������RA��yߋ�����y�����~N'��������OӦ ������mÚ���?�ع����
��Hb�=��R��i�?����{�/O�_�f5�a�teZ�o;���=��,y�^�H���\1��¡�S�]`GX
w�����=9=W�bR	��zM7~ܩ@�)�]&�+������%U��8�g���ͯWR��G��́����'WBz��P!���B�?{����!1��	���
�xve�A-3�V?m�45����@|��Z̍D�45 �����я@%i<�SNC-Y�/G�XlC�U���@�h���b�r4�2�O9����>-n�A��6m/�;�M��V	l���_%�=�d$ej}��_ƾ����Hb����yH\Sn�������y��y���o{
lFLY,�۠3K|�T9jHH�x�S���8�\y��b�6eC	���8�n��c��	"ȫޛ_�_6��tEh�=ɦ�?kkS��i���X��1C�̛����H�O��o�N����{���
�-�ҍ[{ye1����a�0W/�����'�ѹ�aY�A���@��,��>;�խܔ��R�RՀ\�j��}�Qh���t����i��8=��	J�m��'��7��H��<��-y~m�N��֗���E�_vH%�E*�'�J9����bY�P7�������`����%���ޟ�(��p�m���s�k����4�s�y�D�;��fsf/W�p
r��l�m�n��p+���7f.�F
v�=�r�A�e\9�T,�-��}»+>H��'OHY�;��='�.�,��%��%S�闓eI?�V��	��s��˦8U{��E5�S@0-]������J;���s�W��$�N��Rar`�|F:��ciL9Q
L��ZX.f@M�ymL9�~�',W��>Pu�%l�1�t;�#���E�<��f��qK�e�G�>��2h�j��B�#��
�*�"��{��6բ|ț֋���uq78
GW]�v�X�^w��L2�#+�d�M���q�������-���Fl-J%�#7bH�����#[��h�L�{}���V�n	�`����Z�}g�#�[�o5�5��:�e۶��l�pt�}��軆UH]l���.�"s	$�$7�"��p:���cnAQ���+S����!�����m[{;��΃+���l���Q��vC�DA�|��c�K�G�+lj7n�!���wW�Q�PeR�is������43��"��1��wV�V��GI��4K�[Œ�}M��,�;&5�f�2lH5�/��[a3��=�'	��ض�`�Z����=8�h���3o|�/�
(�hIF�`y��q��������la���N��ҔȰE��Z0�V�*�Q�k#�R�Q8^X_��T`��HZ�BU�`م�Qp��5v��U�ش�xLF��T�GY��Zʠ����I�������,�*� ��[�B�چ/�8��������@Co�Q��]i7��/�	~,��F�.k[��l�C��z�>�������ǣжZjF����p�Z����ު�xcƇgف�h���bǜ��o��º_���1��ٓ���^�w��Oɢg�-lxҔ����ʳ��s�7w^������?�?|�����h(���u�f����‘�á� `�l����gpT�u|��Q�[���NO��&y�d�5
[x�
Zދ3���
��m��Eټ�z������Qi)(������vq���L���:�� v�EV��!�/��>��s�-Ո�u�8Z�1u���kf7��7�F�-�gU�Q�r��<�~��U�������?邋��w�z��h�5׌�w/^�N�g��S��w�&�Y8�9}+��{Q[���2�v>���X�V�"M��Ұ9;b�ܴ�W
�X�(�|��e�;�H�_�9�d�n4-s���"���$�[U:�U�jROؖ�O��?}�����~+I`�����C���p���y��b|%�VdY���xR�c0�������(~*�x��� �o}����y@%�c%[{�j0�0�`�P�ըװȷ��_9�=_�P��u�1L0)0��ss/���u8;pbҎ�EW����T�|n��"�8��AC�f�v_`	�P7s�����Zԋ���x�;��]_��1[�*�W�z7�웑�*�+.�e�d�o�i��C�(6:���'�N�21\��lArb��v������%�'���W�#p��YR�!2��6�'�-��C�Y��f�_��,Ha
JbE���YDMӥX
u'�J{��ʁl=.���n�V�k���G��]����r�����UcC%7ӺU��X�H�mY��3F��"�
h�a$|>.��ۋ������vD�R�ۍ��f��5��=�^\[�-W���U��^!ulD�5]}��$&n��m�Q��P��[�c���(@%�q�����.=���Jc���l46�<��N^lT0��d��3��HJ)��kI>]�.4���¿�\�����lYC���
��!�_P|6p���E6�����e(s�o<h�@�&ʽ����A��n���X/�������?����b��Ѷg����6�{���<&[O��%����k��<֣4�z�Q��g����#��X��y�2�|����p�t� ͓?AnZL�x�M��R�u�Ɩz���gl{�n@�O^�����6��!<��tw���C'Q�q�b6�ef�NFxm�������;y�'�I��	���|�<*�}/w��l6/�u�xܾ�߂_Bf&<?�[�
�܆´�z�s�q��q�}yqyuxpu�����y~|��Lv�K��2����P�Ÿ��ߏ^��a�F�q~��W�u��E�2Կ��.�k�3o�־��\s�3a�mq��M�r���j�Z��a�n�ê�����1��U���_�+�ޛJ���e\��q�`X_���5���l�܊<Fcd�`*�wt~~z�˻�^��ˣSZ����.�;;����r�h�j���)[?�|[��zu���nm~V���U>�=�py�b��X��ޯ�^��a�G�{�<ECu���#�=���5`���n[��2b�L�����ˊF����Q���{�z9%������������D���7�����=},�o�֎^G�;��N�4Q)ʅ�t�/�e��ޖ���/X+G(�U�ң҂)
��r\����ˁ��FT�	a�4� *���!1j|�lo��}��������������E@��΃�?<z�KΡ��WGǸu���y�z'��ɩw�t�U
��_4�����F[��&"i
l�Φf�r@������j�A�N��������h
�y�
�|�"[
�z��pX^$���R@g	z�X;��,+쌚�2'�e��Xu���i�9Ɵ�~�J���t���#�˰ p�Ǭ�{bк�r݅�DOKpuU�,�\Y��B�(1��Xdn2W�n��"qHȅ1����gQS58�	g�]D�7�l�B�j[��C�3jc�rD�p�jx�!����C��!��Q�k<V	6�?%bU��njj[W-%�G�,����q[�ݘ��e���Y��\����DQ�O	���WyG��sSZ�(����f�l�t������;�`�7���\��<D��z���.N�?��Zg��D�G���ky�s.z<?ڱ�S/f1����Y�'A��+8_c�����ћ�Оg�����.�`�/�|*�ޓE�ĵ�4҆w+an5�ܐ�r6N�k��e�
�f��=XE
�z	�����-�w�;�"߇����5H/pQo$%H��f��t�'�)NͮJ�]ݺϳ��K1�|�I.���
��I�1�����נ�zé��@�;1u���6 ��ix��VK�u
�gk�����
���Q��9f!���:��O�p+���0o�.#��h1�������(j��c�"����:�Ġ��Y�%4��I	]��M�N�r�y�D�Pc%,g�;�%�YK˥yX3��Y����o~��c��AQ�<L�/@彼�n�@��>��T>絺���
�q���a+l�]��ݥ��m��)hY7������n����~[K�؛���2�X3��i��<^ՒT�j�W5MyJj�厹V/�n���7�W1犸*y9�?����K�w}!;a=��U&Kԋ�x�aF���/|e�h��F�}�@9��/̎�d$Զ̚D�������|^X�3�V�&�2�w̼��ծ�n�Q�Vi�AvݭX��?����P-nJ�tQ�2����b뮚w�fw��	q�G�h�z��e�y���p*
lbUV7��t*5�2�Q���[98vwž�1��,�/
ՄYe�M�RSe��u��^�������2��|`�bں���\I��Wa<U���6���#J1w�P��V�Q��IdŘ�_�1Kc!����Ʒ���/����~�>�D����avj�Dݲ���	�G���� �2hy�nɭA���U�ɇ����/���/NN;:}��.m]�`z:�6����I?�O>�
fKa��l�<�L��DG�T ��y�Ps�d�C���ˣ޴�bIl�EY1խ���im�d�m��݄sEH�+���C���ӁEư�$k[�G�#~�L���13��Ȭ���Y/�A`V��&O"�M����T
��t�Q��E�7��J�ֺ�ta^z�@�y2,^��]����7g�^��t
cƀQ U��vC���Ps!���bJU�_N����jI)��֞ax~򦷆2�2I��0c[�T�D�v�ׇ���;�p,"�N;�l����:�dΤp�)|�j!g�OUؠO����Y�Yv�� ����;o� 1�\�l5������c��<E�7G}.�'E���nP���Wz��ޜ.�*i��0�/�~�x賆)�Hf��K��k��W������T��ˮ�%�(�q����;�uٴ[�m�qy��P�aU�ab�["��ɺ�|�9:,�d���k�d@b�HC'�K���x~
�۲~�L#S2��uiPױ��Bߴ�#7'�b~�,qBvy*�!��2���
N�bF�.�C-�@�#�N�/Xʐk׍-��L�h�C�΄E
��GK=	��p�`bK�.��H�q.��zo�,�p@Y��L�7�b���t����d.<�'��\y^p�0������B�:s�=r}o�>ڈ~�8㌒UJ�O�#����7�r����Uf�t(;��m��뎔��X��/q~�\��Wڥ-@��m��
ZR�\.����!���{�_ѝz��՗��2�p�b��*2Sl��i
aXZD���%�yŀ6��k<*Y�W'���%6%H�����Pr�-i�0=����5[s�����tREm�
԰j����M��2}�MI�lii+Ў��ŭ�!/̮,mK��s�ϊ:��V�5őYr�	�����Z��%����#~6]k�<&;�C\n���SQ����l������O����UC9���B�Mj����mg���(ҭN�w2+Eb�;2A�����6.	�-�i���PT�2ګ܉�͝p���qDo�Y7�l঵r�6:lo~�ڸ������բ�CA�-��CQ�I�j�7,��,���������o�[{Ё�ڋ�^���"خn�W�J3�k��-�u�g�OӅ��4��N����>ᣀ�<���Ч�
�$$�u��g�u��Ԅ�1��J�b�WL�[�#��d3��#<q�J�'���T1��n�ҥ�����_+I"�&p�ӛ`����@�c15aq�,�]]����w�D��4��m՗�|{\�(�_��$i���/�eC/i6{'�P�ɏTP��ҐF�U�P��Bd5[3���CFE2�r�%��eJJ��)��
�NS8y�l�3}��p�Y�jc��#����m]iV����~[���/6�mk_;v�[�� A_U�����/��e�b�t1Wۍ
�_ߖr��~*�Mӆa~��l��>��[��$�1A_J����/氙��[R���`�q0���tU�G�����w0��ˋ]^6���M�^w��`�rw��eJ|�(ǀ`������d:i���*�>tr=롫x�JR7k�2N�!l�H �!���n�}�NLbgv�U��q�Jz�|�V���E��
��6;�ll����gt@�(�d�WܲJ��Hs��>,9��)�"6ðlSߩ�F�=P�5�ª�
̼�܆�b���z(�uۚ>S����Ŋ�Tw�k۝�+�!q�#f�� hos��o�GJ�N�eFk�#=��&��%���L(�A#���+�k�֤f�v}�YqXe7,�B����%E����45Y�L��P2<|�0�U��@����������=����9�O	��
\�r/��{�J<,��Lp��!H�aI^U�����$t���Z��V�v�?V�����0��6@b��G�*\�A��T��(	�n]��-9R�^�Uc�fU8�������*}�����gz�9��"7%��j�=��I��a����m�^]8��H�R#[ʨK�-�쪝�]�.WI��&{�ѢHP���Q|Cm7ي��Aȧ�S͢k,K�R�����/���܃�}Jj�or�ѐ����TA��α�s�����Ҹ���ܶ�
�5���s�{<u.�k[��_�-kS-*Z�S�
�u��ϊ���|��G��7
�_/�'��Z�χ�y����j�>;���"2�ʇ�@�=L�gO|u�믽�+�&��I{�R͉��f�D���o����}f��@�� )�m=Pz�m=�YxF�5��3ph=�ʃů��J�4���$��Y�	��T]������#����]_��O��#'s3�>F��L�}ī�{���Ωi�L�4韖����j{s��>�*�w��l����@�ì�7g4�:n�e7m񜆠��hΌÓ'� �h�����;硷�����_q�@�����ã�_;�ϟ�H��%^Ł��H8R&�n�Y��\|e��y��ׯO���V�q��ؾxL m��_����C#�lb��+�Y��²�� �Ag�t����@�Т�R��ʱ�[j5٣fX~"�E*���	ƾG1�dEHm5��޹'V���蘹��5��"��	���n2�r�y�¡+���'��[%���Q��u�5���Z1'{��]� �7!�͹�O��(ʤ�j��[8)�F�N�<Yv�,꧱3�;�0���ֈ'�}�ޒa���l�����D�\ܠ�<�x�B:|"��y�l\�q����?�0n
	Ƅ
�j[o}�|%A2f^�Q��X�*�y`+��\�o�z�:�xt�Z��hL��F'E~�֮AqG�÷:�p�X�ʰ�i����m�tiRw���d�(ǟ���T���)��T@�Yp��i�e�{���^ÈAal����i���ӯ9���tt`����;��"�PzX�b�[��[�e�3������;�r�\m�v��d�k8��.l�E��:b.��G��9���l87���-[{���V-u�bB�pH
z�(�,�K5��k~ќ{���\���7ѡ'쮵h��j'�E��^>ؾ����3�eu�C[zp).�x�%��;q��b��wMy�ʥ�,)R�5GT(�9y��0�t^�gZ@X�:zUuk�֕k���'@�2�wF��Ň�%�Ѽm�9+��YG�`H��3�4;@q茄��zN�
�;���1��q���'G�0�'�܅�mYI���eI��v��2�)�V"c'����k4��&,�O�c=��x9B
��
�a����:��L�[i�S#���U���ϒ�L�GI��/E\��+DڶvZ_E�&w���
���(�-����R�C%��7�˂^�K$j��!��<M�[*�GCa(0&	����	�x���%�r�͜��@���M��t<�"
lA=��B4��ϡ6k�4u�<i�r|���\����|�m*i�]�y�c�@�<�Օv��R�kT�&[
!�T�1�ӟMH��w���&�������V�(��h�n���)$
`+ҝ�0��`�#v�Cr�3J?�;yd�܅�5q�:�EQ������TJz5�.l�N�ܺv��R]��F
�ײ�$�LP��H
�(\�^�/�D��
]�Y��)�x44��y�_U���śn�gt���衡�f��L����?^*9�]\I^_��l,5��!�q�{��U6�<Ϛ�庢��g��>̭�za��5�2y��U��ԑbdʫt�j$�6y�Dg�6+�$
�3\c�]��+��V�BB��R5�|�A�W'#6.|yǕ�(��Gu��yE�`���6.۷�(�*8֋��W��Dy�
�*Q�]�qU�r}Ez��Hb��Զ�oX-F��	,zbpLL�����-Y�񱆭�/��go���F��-��v+��b5	1�dyquqse51b[��C-I�|^�w��ػb�I��ڔ<>��^N�Q$A�/���m�΃+��.���}��n�\p��2���3���C#3
S���S�ye���҇7��`|�O9lu0��HJ�����i�!��"�u_>5+�6u��9��[f	nŊ�Ҳ��ttx�[+g\�>��hN��9�3*CT����+�<ՉR	>�r_�ҊG����z�-���6o��h
���1�D4>l*
��4ϒVH4.�C�@�O�c=�K!@�l(O+@W��[��>�Z�ה���L8S��I;.��+)gJ�xj�]+�zO/bIx�h!�W�PfIn�Dg�6ޝ�#8JFn�XЅyE�(m��G[�*��)���IJ��ܜ���vq�T��S�gܛ����m(sM�=!
���U[/Q O%{.̐�O��l��#}51�y��NMlV�#㾳�a�S'vY��,�V�iˢ�ߐ�Up}�فsT��hbS�e���h[�-p<6i�,;��
�G/U�ijG��q���<�:O����b������0�6�o�"���91�M�]L�����c�J��60��X�F�Vn���
f껉f�HB7���%��	R�>N�W�6��{�fa�:��޷�_ܡ#T�f������I���|6M�ل%y�	��=�ca���Sf*wƮB�XE��	�#��:�r�8!��8V��qGņ̟�F��,,�m��E�	����~�O�r�$͡�g���Z���2v���X�SM�m�տ�y���p�Ӂ�|9�b͋�����s�fu��viHjr<	ѐ�7ٔ���ӆ���^m9S�:�xa	z��{�dTOKo1����T]�V�潔����o��w����������G�;�&��K�t���B���F��34�2�\$�IF�ȐR�2�>�&,y'C4� ��|���q�nn0��T*�a�ar�E�r"Q��͍܍I���'��*�*@{���pntQ�R($i1�v��D~z��W�cb_.�����yqr�c}��F���w�����O��z%��+=����0�]���ٹ�Q����?K�ޞ����vR��?�j���U������ޕ���n����O1,j��3�Ï@��ۆ�K%Z����E���r�����E(���1�`��X�oJ�HnLBP04�bI��*O��g�[t�RpP�k��¶�'��7�,���]�2���'<�s��G�
��G������
O�a��Y�{���=;=~{N8]����M&n�h�������{@��^�{���D��ō��Q�&� �yP���j �ܶ�X�\�ͦܰ'�E�<dWD���2�I�p��"/���B������Qp!o!A�h6���I�<$��t�y���<'���*�$�8�ʍVU9��:;�<y��~�W7D&�W�7���$���3Ր��ύ��ގ߼}w�p,�.���h��G�/9�K��&�^�[%�=��{����)���M�Y�$Jk�g-kog������k�O׷^���Ó��O'��0
~�(gFa���3��qAuj�]�����f7>zU�]�6�3ץ�W��zo�zx�N�,N���&�F�d�/RO�y�t�mI�E�Fi�T9��0>|,��A�d�,�%rɒ�?�<v���X�7�*��BC��)Z���
�hB!g�8�.1�8��D�� AUu�y�ܰ�jr%�?pY�=�FC���%Lc ���&��`��V=��*�̝R��py�Vp�W�͇�^3�N�hp�$,ɨ����IT�>Y`����I`E��5��<�_؈87��7C?O��N`�э����f}A�i\t���Q���\0wN���m�\;�&!m�+o�ڄ�PX�;m�LΆ9۝�B�p�S��>�0g%��$�7ħd#����إ������2ѿ��bE���%GA��j)�^7�F�{�3�@�<'ۚM��;JN!��vz�@����w�[5Z�`�z#�R����"`��o��z$����_�Dܘ�&=��-��	w�E��O�Q�a+u��.?Q����c�M	�zP�8���jC�:w
;"����,��ei��؏��F�5�����V�v4���E@D]��s�C�rTl�3ؔ
��t�]�aGxgIo�o	I5���W�೛0s��;����'�,q��—@^�|�ɀ�XNn��[I�F�6������:9�Ga_��ߝ�ή�Y�}ܐE}޲��x�m��E��g"*Y���ۗv3��fhn�%��	'�J�o�<Tyٻ�r&8Ʊ����"�S�Җ��s��h�ZD��_A��fӪ�]E��O;Ֆ��q�&��.��yEc�y:]�[�� �A��Q����}����E^�i���Z���z�<@|��6	xA*=MG)5�b��niFd�,�P�ܐ_'[1�lj�9+��n����-�nH�!b��Ln���5���
�����e�~�Dh���畆�>JA�px���6X���UI�E/�T/"i�����|fi<z��I�L<쟊WN��R�[�F�!?�R��.#�Y�C�jņ�U�]u��7'�����ϏO��g��^n�;������G ���3�ڟ��\�������ݝ�������?|��r!OW.ܑ�Q�=���.<�C�ip��
�2�����u%u�g�>I�֑���F}~܇C)MY�;�7�()TB2ǣ{4�-�z+r�ە����
�γC�7�Oo�-C�J6�
�U����_�B��S���d��/J(B�nҤ�{5hD�O��;�����h\ts���]��_�"�-?F���e��Q�>oϢ�f8^#���j��6���E��=a������.��zp�����I@���=��職§)��-|���T	���(8�xg��|�~2d+�>.��\$g��Bt�Id�,Һ;)YuX�6G��� %4�����@��10,�f�@y�b�f(MF?��!yX��$�3��w�p��e~:VDK-��uFW�2E���0�m�K��"'0 pv�(hYBr��suWEx�M]�r�a��v�gM���Z}A��x��b�e���{�>믲���K����PX�1��MG�&�W�1:#�rl�I�KL�O�)�@���	�J�*Uc���±�(�����h��kl�*�p��������
S�_}��ٽ:�?���
`�Z*6pw��$(�Q��3�}y���h�����}|��]}�iQE�c?~;`%���l��_��@g�h��ݭG�VsA�-��/��+���7���N��m����k+HE��d#wv,۶ƣ�X�����$��|�v�I����^<��c��+�2��'Z5c�g�>�wl��ߵ�~��Oj�'hq�Ᏽ���O���������nل��-uj���<B|\�[�r��CQh��������	#��������ɋ���W�N~�=�ng�ᯋ&���݌�)f���q⺟\����[P���>���S��vU�18�ǘj�y�51.�%{���&S���]���!S�����R���Y�P�L9�%���y5�l.��n�#�̕`�w-x	��������{i�����<<�	%�i������hDo��c���AJ6$z���;!5]l��]d0�Z�`�iͽgR�Lb��S���K��$v%�xM�+�4���cy��>;��w�pɭ�2�|�i���������QLa}���jXs��Xࠩ�cz���M������S���X/`x�,f��B���҅����g��3CpF�篢(Nso�F�m޿��q�X�H\*�kX[���'��xug��[0��{��.��K䕓C>�f�F#�Z`{8c��7�)/�����e��-�ʻ���X4�k�S���]��֖8w;'[kW��}o��*3>��q����F�v�R�h��UB��Cw{{�X؋}���e�t;��>�vRw���f��I�I�Pt���(�s���Eה�j�*m|->>U���
K�t���QuU�ן�z��92we%�h��&�\���㣏�Mr,�"��&�����G~��t��{eg2�%6퐫%Y�:<�?`�ۃx@�ח�UD�y��'���vr��]ߛxr�	Neѓm?�s8��}qr�������������P�)��$��e�CXg�O�h�h��S�*�ț��j�4W��3�̊���8��u�YCl�nT��O,�[|���W��XL�
�f�$	Ì=�>�k��LU�D#�����S�kˊ��b�Y�ެ�
�!i���
C9�H�~�g��r��^M���f�R���~
�����"�[r�i	^$���4��m�!�'<�湉�����j��蔮�ON1����1��UT#���d,Һ9�"�Y�it-7��y�T��Y��X[j��]�E�!s"_�oL[1��m�,v4�Tq�_��Z{{zr~bl�J�Ծ��>s3P �r���K�Ζ�'Ls��pXn��i<{e�óW[򩂏K=��UIB(�t[��mqH��U�?ֱI~�-z��.��i�,�I��%�J[&l��}�`��<�ܻ��kz�rl�k� Q`��Z�s\��Aj��uPܳ[kt�%�fWF����A)U�U��WMX��o[�7�Vke����)��!�Z��`$}�u��q	��wg��ѯ�ǭ�e��z
�k&*�W�����<��N�V-E%2|� G�85�Q��5����Y����
�(p��,�ʐmai���+�k�(��kz�?y�����+Q�]�IV������t�b8�94#ʶ6hIVн�a��;=�{�z罒p~��Ҷ!��0�oއ_{窡��1�&�;���$��=�-+�(�� �����R'8�A?ʝ��ߺ���MfN^x]5
�;L�K?X�S�C��;t�>�x)^1	�{L�;����!C�C΁�,��aV��~�.�{��,�X�.�j�)�Y��	�uFAs[Q�%qe�i6��.F����.ԺgUiV]F(�U[��R�r]��yz~�L��c/d��/���衭��0�%�"?�=7�]
_h
��LJhC���ϭ`�I�8$���m3͞'����{�2���Ӡ����luԪdv0�I.���R#�/ K�Q��0�L�:m�I��J���K|AU�H�2wS���"j;`Q_��R6RR�f��S����pi����汍��궻��nu9/4|�%Y��wYG*�U�@�yNu�t��Y�r`������oǽ�ˣ��-�#�,�13oS����%��Z�R�so]Qᠴ���qeF���N\�������S��l���y8�M�-��2R)�Oi�
/�k�H��+4�I
��ɵ���G�4�r�v�x�r9MM�༟��ߎ�_6��7���K���٨���:�#�S�C�>�ի��F�i��E�`O�#�Z
Ci[�v�90_[ы�TeC�L+�����p�
����x+�/��䏍�x�1P9(����V�%8�T�P���jst�sUۑ0��z@��ȟ3G�V9�H��HF�(.����Ֆ"��)��sϟ�8�����`��!��&�#N?Μ�@V$��'m�ak�O�¹WM�nEj9�{{ґ]"X9���j�HT
x��_��Ĝ�]�gFʒH �XK�q,%u*;�9����k)�'�*�Дs��,Q����--��h*�Y
,�W>��l��}�{�Q2��ʂ���C�����j�o��bl����\�#��1� �P=��z���Ua=��M%5){�������f�%*�3̬��ݩI��ا
rj~�IӼ�k��T��@�_1C /���J���[ִh��.W�J��Z
-�>ώ��"M�*�b)�.�2�Ϗjr�U�"Ƨ��'����[R���L
���\}�1��EiSo����Q�o��K`U�B�XX�~���|dY����<��"Fd��4C	L�Q��g��u�.�w�V�����g�"�AL�fO�ۤ��Z<'�@�c�}_Q�`m��	���X��(t��~)����&HJ�^���d��:�jc�*1o>>��3�M\�ޓ��A�o2��q�/�]�G�'D��.Kvb�7-oe0%M��6������l���HB�R�ʊ'��rD�iE��R�H�D������X���+��l���!y�/���}0�Ɲ��1��jP�e��@�ADQ7L���0J�1}@���}
��|�������ۏ$�V���k�?a�x?7ee���JI,��;R���%JCߖ�KD�KP���Dj5��b������VmK^���ˤ/�t�Z$iƈ����KX��&�*�}�=)?[[%9�lޭ<	�:�z�b	x��!�P�zɞ��:Aڛ��jH�&����qro`ti�|�"Eu��_J��7��3�ey
!l��{
i���A��]߼�{���8XD9�"z�_Z:>;��?uvm�ъW��4��]�='Yn�³�4�<�o*����,BM��g�x��ɧ;�1׼��+��>
�#`�"3sL�W���K�a_�މG��i��`L�����#��R�T�I�Y�{%Q��K�Wè y��]�'q��J�s���U�=�c�,�M��h��%������wzz���?9=����ѫ����jO��n2�~D��2J(��,Ҁ6+y�](v-b-&�r&X
��	�m?2Q��n��a@��6��.�� ��[u�=�-� q�.0���U�J�

O��Q��+nG�R��R�M�Z�n!�l�#��P^}��j��k����ޮ_�ۖ��Z��[�
2�U5�
��gIY��J���>Gc�|�K������[�}��U�K�Jum���?LIot�0���A��yxݧ���b���jq<1���s��1�%� �>��Ak�WIV�y���@_��[��n"�m��̦��f1	Ն6�Ve�N�	.<J�C��,T�Ѣxՙ]�k���Ҫ�e���ڒ!�~�哮^EJ���ƒ���ʷ���a�&�5��S�s��$GImcC�}�-I�9s�N�YG�%9��K�$�9�¹���3�r��"o�M�����nma6�<�&%Ӥ�R�V��N1{�w��n+��x�q��h�#�]޿���.pݥ�<����hJl�D��Q]�0{LWt�Ή����A��<���CV��&Z��i��:^9���3�8R�4��Ӧ8���9O�G��f��H�K� %�e{9P)�n,�0rY���Z�o/����_����u�Ϸ�k+�&X�0ˬ�۹��z�mC�I
��&1@��QrgM�-e���U)�x�h���Zi�L+��3��.Q�����D���𔻆�20����`�g�	E3������p)�#�,��&$����察��X��h����رZz9��zVCb#����J���<Ө@T^b.M)�I�w:3�ўgMd�/_�vG�2V��X�롋(dl��E�\�߈��I,:h��1Ɓ�L��<o�5�2Ԗ3��l͓q�W�R���ƮQn����;��t�5{�Pr� A�Lt��Ԗx /��_L�xw����ʝ��7�>%ؔ;1�H7Cœ�����+@���]�O%������	���e8Ӭ�c$�;����ۚ00��� �&�u��Y��y�����s�
��
�-�N8��&�-�:z�뻣_{�-�Y@n(�Gޘ��,O$��*�
�S���%J��Sxu�19��eE|�����n^\���Ɛ� �,�ܸ�
�X�:���8[$=G3�֛+<p2��F�����i��T��✮�v��i5%�W4�z�R_���qi�6�Oin��f��d��J��[�`����/��̜V-yI
�*O̊�A	�zR�c-]D��(�l�>����11+�g����_J~��^�5شzs�k��E.�j+�!��uX?f�ż�ro���+��D���¯�s�cEt�Fa�w'��f�Xpq��&��/�)![d�AY%�����
n)uN@�M�L9E
��/7K#dW��j�=I;�n\IG�D�8g���ap*�(�5���IMq߸��W��!T�*��J����N��+R<"��n�x*�.�_�w�Ö�>0�.�
f�ۖ���֙	t�a���#��3O�]{Gs�/p"+ؾ<�xм��W�[����J�Q�e�6ި�']H#൮VI���G$ċ�v�9�KO_<���d���\�)�|���
�Ybㅏk��;��n9��6�
�B��Bt�h�c1��i�mU��!�����`�R�yn������.16*+ I�m+mW/��6��H��Qz���6D�}��� �]�p��2/d|t��m��Ȑ��y$xV�p����Y�^Jl
�W!�C���Z�v���u^P�����n��#��T�x{ٮ�.R���Z�Z�VW��ݡު�����_��_���^]����ŋ��EϽ�qGAYnW���^t�����'���WU8�~�\�k�{��r5���UH�K��)�ų�w�/ON���y:s�G�}��<V.^��ax�N"Ϟ�KkZg�b��rYV��]^@\�y�3��֥�&���8�$� ̅,8�w��҃�z�-�גo?�Q�qqѝ��5�^}��ſ./.��{�S��_MX�'����ے���H&��$ξH�mu�/��Zo��N$��7-�11vwP,7�"Y���/���-~�Y*>�课GQ�ۨ�vQ�'��2�I_m�hȄy#2`������1��wJ)��g��,�V��ikޮݪ�5�m�Y�j���d���cg�視��/��Z(i���M��rM��3��*�s=\�n>�Չ���Z���Ѣ�R栒p.Xի
7��e��x�GI��y'�8M��zc}��?-㻚��f���o���Q\�Y%‘j	k��JuȈ��DWn���c ��f�(W���e"���]d���llZ�0F��!vo	.��`���ޒ���¢�l��������_�v�����k�z[��{0�Rn
�y*���:oŐ���O��.?C�3V�n��:{��)��B1�Fg�;�����XR������6�ݖ���C�0�;E[�$#�$�ؑ�1���?�I�aE;H�Z��jF1|����9�#�&�N���tW_���u�Ѽ�J���8��[
n�
�=
��D
�UJN��i��y���
�?�����㎸�7�`}H�J���>L.V<��f����Cԡ���dح�ST2�
Y��Ԟ(��f���"�?�,c�j"V�E��I�w�N��LKT���k�h)��+�d�1���lV�L�Н7����
EdËy�I%=:�>�pDQ���c���?x��]��u��ev&��Ü�G]��R. ����J�^�Y
���[��si� jqD�Ŕec�}�>��v��Tm͌b�T��D�}|Xy�3�Ɯ&Z��Q���4�
��ʒ�H�O����c7�q(+�R�4L�'��R�>���Kp���>����x���Zd{z��Pb�&)�d{�Xv������Iq��I��K��~�=�U��\�W�D�b�iN���S?+�0�N���ԏ��@�'
�/�9;^�� RVl�R�K�+x�Y� �ٚ�*.�2�YTfJڀaV��-i�jƁ�J
K��Ym�W$���*�p|-� �x�C���Ï�`	�(%�S%���b�^{�HEWP縂C��4e�~�i
?1��t8����?M�

n�az��T_d�j��0cE��&��K��Q�Ԣy�FmɊ��%� �J��H)<��k�Ji�u�]��tgɱYRc
���U{��٪���AD��I�Ӫ1X���E���3��6cz#{�9�u�6�Nf�E��z�Rّ3�4G2����TH���M#X@35s�Wͻ�[v��@�>�l�_�a��˾�s�3���-�������
8ig^
F�rF�c�ѶAȱ�]��K�#'}땢r�|
�k%�g�k�*�� ��j]���|+���D��wz���|�@��Z��r>:�-�xK�����|7��k[0D���݃V��j@�~[E	�9ya
�6�Aj�����dv��	�
]��!0���Q�Y"���p{��k*ȸ������p˱4u��I�cZ	��g�ip %B��E�BJ)-�|���]��/g�N$��/�R�%�K�ܹoz͊er�LR�殘��I�������C�Tu��}��L)����~:)�i�?I(�|ӕ�-��ێ!�p4Wȳ��Lf\�G�'��ch<3ۙ�*a�"
77���{O��l���ckϩ�y���R����/ڥE�&C���|��Fp����:�{�R!�*���ȏ/��uހs���2���0W��7�ø^�-C͊�t��"
ƒ;�l��3S/Բ�fg�B�u���re2��P�ǻ]�^L�k!��X���XfxtmzdUf�'(\#z����M�(sP�H�<GX/ ~:����i�oP�`
��:$�͔q���,I�|۞�ϑ��������#��P��Ƕ�
�Z�L��ߧ-���5�
��q���#@�U7}��4��*^�����I_tͤ�_zp�7�ʓ�0�M׏�箖��M�i�)X?�艍v�yI�+��?�MU�X�a�f@Y*�9mó������V
I�2�'������^
���ȡȀ2��3������֕Bz���`��O���A�z�ߓF�$�%x@�:��6�YP6��B�@�4 H��D���ď��Hkݩ?H�<B�zݓ"�����ʆ��>��;�+��)�!�=x�����Bz��7@���F�6�'_�'�)�?U�lH���F�:"�Q�mH�	�p8S~���ix��ꃱ@aۃ�!�.�T@�܍w������=ſ���[��<O�5���J��@�B)�3^���;��T�3Շ�c��)3��^�@���\�B�V�����l��������o#�ƀ��uC�+��2`V)�M����$���q��2O�	?��y��`,����I�Ʊgt�&��Z{�r�.�����z���o���v��8c�o��|�(K.�`d��@l�_$XƐ�%�DJ�U������n��~.���6�ǟʐ�k�ã]C�!�M�r��4'�A�I����f�
�Z��j%�
,h��0�[����36pԚ�:�v��u'H��5��ۡ?� ��t���Λ�"����X�'V����H�Se3`�+�9_47<��\{fd���z��r(N��8?��?r�t��M*� }Us���5��ڻ�|�w�{��zQ|��=2�P{S6Tk��
�r���E�'{P�<��I2�~H�b&iQ�q���ΊN��sPI�Z���Aޗ�ԇ�_���PC�D+��8ݨH{ߊ5iW��4�/�9�jz pa�@U�n��a׳���Y�>:l�T˭�l��]��ۻCk����얓�h�kj�Ŋ^�zv�8��^��v��(��h�a͒
�v��1w<�]���6i9l����R�J�;�)�8Дtns��(���\r(�|	�p�:�
��#H~�EY��/i��0١����@ �eD�@�q��'iks���-*��'(�+(.�gzZ��,��nВ����Z�����if����[gT��a{�X,���5T��d��{t����.1�H�c���*���>�-�V-̳^+40+2�����l6cM�f���r�\���]Nt_�:-�k�J��x���P�a����W3��_�шB�q���|��w{��t#c�����?c��|�J(��a��n��҃MÃ��,�k�3��!b�������(�F��
I��m����q��(�h�2�鍱�4O%Ǡ:�0���G~ː���k�Q/���&簛x^�I��GE�<��FM�3�M�� �|�bCv����oCI�(�s�C�����nd%=A�ųpIy�b�+�ʙ�|�2M�̯�X�؅H�p��#�"�g���T�D�o5�g7~E��	EX���^I�M�;���	=��LxBw����,
Z,����<��3�d�)�6�e��،L��X��C�zU���6��	��ĉZ3,��¹qn�]4�v���\���zJƘ����s͠��&��\[�Oq̊~CS9h�Qa��c@���gt
Ų��Az #�dɈe���s�t(꧈�F�ɐ>����x!.#`�MK��x*Et�ڄ�F%	[P\d4I9Hr�^�58\�N�E)��x�F8x�,�S��6�}q'۵/�ܬ��>*��`'稃��.�h��t�Q���c�G2�!�˗v�`}+;J1�P����$&k�$��b����9�{%Mt�5AR0O����)���&��$������4h�(���Z
+��Tl��ea�
�H�f���E��W��$
�c���nc��i@a������s�I��+#��j��T ��$j}aWpBk���;�b�j���~���}�cI`���~�k��Y�(܃)P��AL���VF�X���Úp���ȫ�c�u��O(K@X1�U��;(^�x��:���Ux�ΉN{u]<�
Y�>�S�3��1F5���ԃA>*�`{��[��e�l�B�)�)�{H��|��m�y��&ƽ+�d=�z�~��������Y<�?�U�$��q�n�7����[_/��?�.&���}��Γ��I{m����w��]�(�q$*�M�J��3^�Gt��,��x�.��I�ՠN�Z�J#�G:p�x��az6J�g���$�6�2uk�k�|��gn��7����E��B�	�\�ql�y�K2л�c��Ϲo���Y�O�Q<䓚c�����bk�L���o�3Z{�y��Xʋ���\Q��Bs�3�fU�(����B�*~�k��s�L�*������@O
��ʠ)���U+3l��,�����A�x�����}�c��N/�B���s��r�i��@?���O�謵�����+��S�_�/�@-st��ا�<��K�1���ѐ3�
Eȱ�x("Of��M^$9�,���!K<�A������ꑲh�^]��8;�G�'!
w���X�qԪr��G�Ȭ�$�m4�����g�h>�����m<����㆝��(�ƀ��L�Gr_t	+��s���D�pj(5�Q01k��a��Q"N�K]'!�%;z�nZ��b��T8����Ȟ��̅�1�є�fEإ�5^V��(Վ#�ԁ�I�̂*/�z=FG�8a@�(`�O�b1�	�"�б
d(abV !�~Lre���I%��>E��h��d��7��0��o�I�g��M������h��*�}Z�րp.!+�j�aإt�b��c�=}8|�Se�
/n<g����[��9�w�G�̓�@`I#�2�UZԱV��
8�Iꚝ��6Y�� 8�����:�;k�����zhB[v
�s�j��:E�\��P�~�_�K�&�o:��]ܖ�h�@//���Ξ[�T�v	��8I�>	�`���j��y����{���(���N�z���М�|��Av�(0cf��/�.,EPU+Г+W�
B�B�c@g��׆�u����ڭ���[�rDQ�	l�a�ԉ��_E�?�/�6K"T��ʤ1�&���K�*x��]�w"G�B�y�@�p�Z��0�� ����1o
b�J'�,�7	�7� ���(N��~~��a:������ؐz�q7��qwi��!�@{��VZ���Oa�.�4���$�IZ�I��@z:�Ke:�o��oH�
��(��o�67��V�,k]=��Y��C<�T�[ӂr�����$�Yg����`��
��J��9f���E9Xs�`o*�Y�.���:��􅤷3t5k���0*+L�-�j��{��ەF�ǎ���<�Xw6��0��5��)�������ļMŅd��٫�gW�x����g��	��XHD
�x
�(Hc՛֫x�t�ţ��۝x�"�-p�+gl\�t��X��e�(�}��9
���9�ԶJ��*;;A���1-]� ����쑡5	����k�`s�:�Ô�A`���k�/V[���*��o��}��h�����=��C�Zj�&�q���dy���0S�NY����d�{�Y��TLA�0�M�с�@b(�\�"B�6�d,:�6&��� Ē)vB���V�I��*�[L|�[SDϑ���3ND�A�R��xy&4*4���T����P��F)��YW�b񕡛2H�D�����z���h�P?u�5
=5Ƣ�����Ϫ�]+4e��,;�¯A&
�Cd[e1��32*d��k�BI�,��
-�e6�	�1y����PGn��;��F�Iv�c.-7D����F�(L������VU�:S��G�=Y��5A}��t)�l�t/vR�ٽ�,�J�٧��������{�Ԡ[
Q�v�u&�k\������
5�="�C�b@g����x욂�c����g�쥱%O=�{�9��*%L�$$�x�D{��IQ���:��]�N�߆^ŗ�ͬ}�"��%����j��,d-���C�)B^�:�����g�����1�,��DҎщIpV@N,2{{��U����s�eڂ��W�����i��'��Q��L�p�������C�49ܚ��H�-�H�٩k�%��?�4aw$���~�~o���	�$K��A�F��i�LXu�02��E�'T�W��Z6�. �@�+=��ê�����>�a��B�L�ͯ���y�?
��E���h��gmmm#���x�t����=�(�U�&�����孻4����N������ -۲Y
�����]O�u)˗}��D��4��L��H)�X�2����Jʜ�W��,�,�HאQi�rE&���h�8�(G
�Mڔ���y��pJ`Y�����R2v�QbE�>i<E�(�OS����R�L#�1G���p�<-35(��-�	X�72���c��Fפ!�ƾ�yD�N�w�{!��]uX")ta4�L
����B����P/+}6�'�Ō��$��޶�x([B�ha9ÒI^.�iz�MP/�LY��e���C8�U���&*�g�5�c��L��7
�1W�%�V��d$b�ߙ�jW=�~0'g��$י�G%��(]��w���8�.�����o�o�N��ݨ�J��uZ2�"��e�{o)��&6�ܺB��B{�ҵ���M��Ʈ�8UI����,6��d�u��gY��������i����J�<�������]E�y?�aT����?̞�N,PU}�S	���N��S��tϑf�@�s&�!��H;�P��<��AS,q+Q�����X�~� ��z}US�M��`<&�j
��j[�;ʔ����u/��@w+�ʟo0g(�D��h���J:F5��4�����"��f��U��=ުwk�߰�
#�*N��-;����m�tr_`���߬�����h(%�߬�>���y9�
��t�=s��H@Њ�^���2��8���@7v�ۑ�tC��0�׋��������E5$Y�^ēiQ�!����c$3�yP��P��J[�"��<� �erGd��䝎�!_�Up��Ш����,\�=S%e���wh5�[ӷ��\�G
t�F�<�.Y¦#�#PQ����.]tV������P��$���HuY�#�S$��ُ�c��j����br4�i|�����
��ֆuU�(>KIK�Ջ�ٲ"i^����`B��c�3~Y|H��Kj�8W�G�:ND�G��F��g��Z�ּ�����~xs���,�k(�{�=8�����wo�,9n�K&`m�jU'��|��`�8-,*����ގ�4[���Z��_�u���3?JB��j��WX��<>$ve�5��$�F騢2�n�1�Y�U��z
��d�ݜKAs�ě�e��Bo�jS>�S�\/0�vڛ�g�g��BC�֫���8M,�������Ý7{�u�a:^l~ۻ�C|��D'�/6[\�TOқ1�DdG�IR�S�\<��h�ȥ��\L��v�u��	c�촧�b�*,���+�Y������	�h3	f�Y���g(}J�uM��4�t;�tcF���h�V��H�ͫ�8@κ�)�
�x�
��,��
%S�$8$��g�o�S��Ywycc�-�閺�`"��{��dJ��Rm��
]��|�3��-{����s5��1\���P�����L�Wp�δBk����tӵ��^n��Q��s����Z5R�bT7�]�RPk���V�����s�x,�gd����a���!����a�5N�A"��˾7�S׭`�<`6��O��9Z���<�7=";��"���p|ӝ�Q�9�0"y�&�*W�(���
�[^�7*����U��"-u��><1�4��喻d�wMz�?��|�Af��G|5�tl&��H��ZD�*�C�r$��]L�&���D	��%�q�7��k�z�w��z�^��	.li���s8�%�0�I���E��I�06/��ar�=ܔ
-����c��܃�����VTzinv�S��v�ZØ
�
pg9�C��a}�ggÒ�t�ث �e($��%�ka/�d�(�-ij>^ve�	����� x<.���,����Օ�@�W�n�g��y1W��޼L��q���3p�k�D��:������0?�Q�6�k��L�
�_	��|l�6�/�,�hq���%=r�C��15��WG��1Eny
�(]Љ��F�r-��(%�sgk5�L�+�ŴfI<Jq�^��>w��5ʉao��x� �f�p�f�I�d���{�o-ָ��|�lڗa%9�]��H���M�pv������͎�s|A���z�&�Z��;��F�.3�P��(�?5�W�o���9���l�FM��`�����es@��C���e���A!՘PgFAf��+��C�U��h}�yݬ�L��L��g��?/��!)��5�#P�rU�)�P��ѓ>L���f�!*?6+�mƇ���T���J�_�?&��Xq[Y�|���z	8�<c:��8nZS�q�Fx���C9��ӳW�$�?/(��䈼vbMU�k#�|a#�]��~o:O.4�zQ{wK����E-����4�B�mT�A���ak�f��f4��
��`6s�9	��o&�%�5�"鬺�+�!ƃ���8���BN�ײ������Jt����33�p8�� � ���+�X᪥�8���W���z�2��rk�VY���o�F5
vDE�3Q�0r(�{��Bl�*Eɪ�n!�d��n�`�"����"���(�y9���*#��v'+a��b\E~�Z?i��5�K�ٔĤ�(w.��\k���'����3��I�0��I�z�S�;��0�����j6_�,�Z�ײ%}�$cR��M���^E�WC�y�y��*��~��*[
�f�_�ɭ�Z�SL��`�4_79U�H��Lg�q3�x����pޏ�I8g�4Š1��}�,�&J#��ݨ��s�o�����X��c7�S�.�$������iA�Jm�q&�`���͑5�s�
2`~"�(za��'P=̢�[�PK֢����|2�х5^�*��������8|�鋋Yp֫,9i"g_y����fˇ��{iq:9�����T���=$��
�KYew��⛭���}��ݮonw���&��5"U\B�:�|oo�R"
E�}$2��gqK����Wd	�
T^d{�����jtu����(7l^��|Y�E�UY�B�:���y����۴�ߖ��ѤW����qW:ؤ��q'�ŗu�,�ݘ^M����5��R�C��}P�W��z�WV�Mv�dz}W:��x\�(��-=t	4y�d���ye����K!�^�<O�^$'4�#��x�3��i!l�jl�Xk���z>Z���G�|���`w,ۑ��+sdHc+��O�,&���9�	��ȇO��G�.�,sg8�J���l�L]��z;+�0`Q�.m����]b</�LHf��L��.X.5�$���S���=��Vp�iq�q[�O(���I�Q*��|TR̐��-\{�
*�@
����dv>4gcr�Oݜ�؏�	Oo��n��Vȗc���W#��:�/$
֕�r-�D|(�nOT�8Რ��򜂰������+�>m�S���[Q\68UJ:���݁����Z:x�Zq����J��#�/F�?�f�|�4WM�g����b�[$
F������~�RP����#�AI��߅�`էr�W�M|c/r�u�bU�%�j��&(�
Z-�T��H�ٯ~���lc�w�{�??�tr񟟮=��g��=� R��z�	�?P�u���N�O��,��p�O� �F*T',㡹=ICl��	Ӊ�J0�49�L��߈\Jy�pY ���Y�n��92�[Bt
�Q�D2ǀ>�4LgĔ����Y�_�7�ޡ�;�R�,���=s�O���Td�>�L&�{x�e0dY�+C����A�G�/i-{e�A8��fO����SŐ�2:k�N�1�5�CF��5P.�{���6Z�P�u�ٵ��ћ�o8��=��{k|M~G��꟥|��!g�Z.��.yHʱ���=:�f	�}�,�9��w��Տ+�CR���8��(��!�=��
�M���/�<î�n���-�m�n�=闸(������t�_��e�K����=���[��T��d����R�H{�^>G�א��k+�{�k]G�/�\Z�t�w����-v.*1�B?�R��CѺ�u�*9W����[��{�X>
��|������B��z�,/�t�KĎ�5�@�g�H�RszY�~����]L���@�+k�Mu�.1!��Cֆ�F(���o_XvҐ�+�4�x��q�
�Y�t]ِ��ښ�[nR�Ƈ÷Nx��XӒ�iŝ�:K�Ƃb���Uii�F	`~��o���m_�Y���t�X��b�?"�׽�_�>}����o<���0��/�0	'AQ��L,	�_i�"�K�1��O���q�po��)���
�c	,]
A
����,���4#��By�A��y�X��_FZ��`,���$g`ђ�m�#!h*�.]�e@h.�〿)E��896�>��~K~�ȥve�S ;�'���d�^�I0
}�B��w��)e�H���U��10����׻N�u<\�Ul�.�l��N*�t�oz�l���@ �Q:tJ�$���g�
���^�%��jyu��D�v�Ӳc�#�\28�+�	/�r:�[1���L<�p@�S���̷��
Gu��?�\�s�~���p��Y��8���[=*$�h����(��kf�tpr`5o������s�E���r��O�aW��o�F�z���[�(`6]@tg�|�J��X]}�"9��F��x���#�F�Bo��J������)�l�P��.�`gA]�"�`Qϝ�B���,˝��xd��S��܇�~�� ��򆾈C��(�a��Sۀ��'����w�v}39��;����Z��re9�C�j]�&l*+1�|)|J~��^ru[\��dD=����zm5�Ԑ��ދ��������X%��ۺ�,B9�F�?�Aɟ�j{��U
���I=ߩ�d��7O�D�g��S����r��	Px�\���з����V���|����]j�~��izv�W���*�}�\�����/� ���S�/����LD̓fƒ�������6h�ČA]�xvHt	�E���D�,�0�!���nB��L��N�Α�P��\3�����C�\��6A���R�"<7(�"Q����%�(�@a�j��2���~���8!�̤tCET^��-���|�	wD��2�=�I��8��<g'F����ɤ�u�Y�p����8��º,v(u�%��	a��EB�Z��xT���hs���z:�T�UF�D�J�ɜ{���80o�u��Z����}����ZUH�� �YDfq�4c@�eCLӫjJ�D~��<>��Mj:|�"�i�Ɓs�6k���x���)fT̍���c��3
q?yWKN!�v�e*M�"/�'>ߕ+`�EP�O�e �0vg�e��ொ�G����A/����S�+>돚�5��+U���|�g�Ϋp�M�FF!k3"�l��
�=���l��q>��
2耋�,�S:��o��|���v�H����7����,�)�;�;ov�;<x�+n͊Յ����)ED�g5'/q��z�g�I�SY�v4���V�N� ����`\�Q��5�m�U����1,e��ʜ��i�

Ⳮ�?a��=fU�a�ʻ�4��kqK�jʏn��$nyh�enA�ڶ}g"�p���dA���B+�5�﷏���_�(�ŝ�O�;�Rm�b��y[ܑ�]��|ۯۡ.�a�h렳^pP���+�z��[O���ӖG�9EZ.�P���LJ�Vz���Z���������e�p�iU|�⭷��p:*7�N��Z���x��
f�m��/�#�dQ�
���i�߅��C�E���:)�-y�1‚���Zd��*�+eY��V)��o�$��cX�xI���ޖ.�����A�hi�W|��P��ea��_e_`����왜-|���(�m&��%��[�N�P7�[mMA�qn�ˁ��cH���b����5���3��[/��W�4���kg��=�C̱�jX&x�ڡ�f�l���tS�0���b��t�Ȇ��He��Gl,����`[���!���)��w����l�h�3�����j��a�k�F�^X>CK(P‚�Pq��N��̉��,������;��\����W������x�.I�nC|b�!��p	:���Ȥ�Ju�	rcJ�����B/Pw�w�s�vo�I���o��}�(�������2�bl�n�b��|�:�)LL�<��9mn.!�Ik�Q`"�0������6��|:�۳���Vr�щ��ם�U�Ոi���W��#ځa��>��'�'u����Z�J�H��KegZ����wl���-��SnWȶ���$vϱ�|x{�,��n���?�&����dh~V���J��L�I���Q�����;*R��]1���ιH����!į�{V�K�[2U�a<�+���H�GG������@(��$�G��3�����'��e��!MZ�U{��%�	�AH�\�~���w��.(�J�>J4MYje��qp�2@�
��RklX�(ނ֨�V`H)`�B�G�U��:�X�a�.Ђa�5-\
�cy�Rx�$7zk9ˆ�+��u�+��ד�P�PL��HB�,�E��,Q�O-�n��P��2��t`�L��H��~�c��^
.�%��T_�D�HU���y�d��_0c
���	u�w(}M��=�;A�c��%��4�7�V	�s��T���'d���,��^�����j'��p]��2[��N⌽cZ�▬���$��9q*"{O^m�H��k��|�e�AM�W��[�nl��}	U�r���dN�H�ĝ�7I��	\��/�gk�
��o]�bK4�_�X#��5Ň�����;��!�zԔ��K����T�)�ئ�\Ģ�b���C�7G�Ib8���=t��BDZ�B���@3$�ȱ��?�L�j�
���� 8�je��U����_w&)�+8�]��>+�-37K�}n�>�xs��OE�ſ��3��[S�Li��#Z�����¢�����~ ]�.P��`(�7uVY���f�?�)���,I�a�;�G�aU�'�+9="�� �*HTA>DuG��5�s6�GT����ѐ1�`o	���h��T*,F�vI�X&Si���#��R��760��sV��
���k���~���f�����&�d>�
{+ܤ�㷆�8�F�K8�.W�Z�F.g@��x!J<��Ɯr��:�'�|!Lj5/;�F��K6� $%<���<QC;*�V�R>*���V��U�����+<�cACK�)x3�{ y9]����Д��L���`o�o^��$���ߓ��Z������������57��u�i�c�\z��p>���(�r����Q?)I��������_��f0E/�Y�]y��TPTݍ5%_�8B�:��������*�4�������d���?�Wظ��Ư5)��N�/���3`��K��:@�潏Qaޏo��L�,����4'�n�U�1���º��L��q�
�iy�N	��j�����ǃ����'�x�ݻ������[ps��o;tu�5	��Iq���k$ܢ�`|&ɺ���������H�$f��2�8�S\���#����S`ya)I�1Us���%�r'�^���y�B��,<?'�7�<��$<e�:8�T�*	�n��],�m���̝,`�>Y���*4F�����t����8�w~�c�
A^�8
+u�TH՚N�u=�/����j���L�G0vU��g�E�~� iӑS�;跫m�Q`�#��0� ���pRݾ�L�
��t�M.toQ^�gp���!\��o�H�}� �,z�a=~,��>̀GA ���HB$8�
GA+g-.ra8uvbF�@=h,�����<ϴ+ꨀ�7�u��R���� �'�1Y��7bB��d$�p���,7�z�(h=����.<��
�[�`�������R7
�8���9'��:�V ŪStY���� �V�1��$�ĩ+E�B�#���#�C�U	�������� @�����=��V��Z/�eHR'�u8�OD4��e����{k�}nGÞئ$�Lvc	k�G7��SF��J��l��9x�U�\΍M��w*���N�(�y��iѸ𞹻���*��ۃ
F��x�v���q��ʠ��.�Y}V��sD�f�ԯ�${z07�/���5A�4V&#y� ;V8�,�M�����T����a�w75@d�iz��Z�1VRؑ���LX��d�7�Y���|ӟ����h0�M��}d
�D�n`����4��(���(_�!��������`A/�H�|׼N�!��1�����&`�ɓ����ޚ��G��
���^ם�?�9���Y��l���ƒ�������" �����ZKyd5�?��Y�$����q<ŶƗ���㦊�+�gKY���(�}���_��ܿ!�SG�L��^������C)h��`���6�S���<�2��#-�'���x��>�Rf��r&X6�K�V��뾸+���$���RL��|Z?���e��R�3���*�UJ����Jv�����R��}VC���M��	۹���~��C�ײ-4�.n�]���䨶�f�?��W`^?�͏t��g��2�4����t�рI�>�\*�X���u2���e�8�
�C�Ŏ�Z~َ���A���Jj�4�T�uߒ��K�c8nZ��
��U�IG��ķ�4�KC����s���f��GG��:^��O���	����_z���#��Roi!�*X�m)
���ӷɞkb|"�-+,Ԡ���pJN�y�N���)�B������N�W����|$��s����L6���考�>��i���0��,#�ί�VWM�pv�7����%P-
�uk�7��KRs�Ngq��m��l�N�U���l����Z`���o:�(�����D�L�5Y�K���ڴ@��f��:*Ɨs(�.���/+�`[�Km����9:�\Ldmd^�Ս�p��Tg��l�6 `�bg���h��j�ݐ����H̬sdN������4Lg���\̱��/�'��n�J1�1�hXJ(�,�:��r�*�̀@�-u���g�&;o$��VW��[���P@�-���âfOKj~O�%��wK���X��{��V�]mk��պx,��v]���V3���D}��\��{���~w ��T�p�;2}^i�����8�^��/��U�r�z��y]�T�5�;X�[����|x��ש����}cC1�0+�c���J׺,vY�cڌ��a����"������k�&��0
�$'+��,�1^)1�!�]����c9�����]@�F�ijU�+�#�0p�9�v�
S�)�0'���I����C�8&��`Vab�*e��x6��f�%��E�HZ;�MBz�M�q��GN��Wl邊���"ZA}��n�I2Yu
3J�t�d�
�kX�ꗹ�<�b��0��D�亃!�G~J䯬�%�^��p���7�߾E�p��yRmJ�Vд62�U�홛�md��@�������ˊZa�1��r�Ԭ��T�h6�+BE̦������~��B^eByZI�X4_�~�������*�X9ʋ_93��c���Ս'XII���(��I�'�_(o0��&l3���#;F�'����d�">��d� �+d)��'�3��qW'7WtrC��k/����,�҆�Vz/*�4�<�mW�&ͽ�p�]��B`�8�L��1��ǭh���4�Jݺ�?���i������ᨈ<�{U�"�@
���"�<��@>)S,���<���{:�r��Tr�#f:�
��*��.²���%D�d�Z͚!%A�z!�]��߷5�������Ƀ <�!B������G%Bb4�<�ʃip�����<NŲ��"<�_��Rd������ps�s�4!���<��-������9�p�N�.KjdUX�ZD\\{����)��!�B|��`}��63S���qI�#;Ŭ�7z�x^q��S$���U�;c�6�}jr�VN�8�Ŀ!�Q�/�hZ2$���x[aL^A^A�RfQ�j�Yw�NF8�K�т%��MF��W�$$�Eb���[�+�x�@X��e'�v����MKJ�T��������
�3�G�x��۫�i�̴'^c�x�@�$�i̖�hi��"N��$�W�!�e���j��[�ה�f�"�B$AzF��(R�Zd���r�U�P���v��f~~�V��PIeQF[��	�W7�F�"f�
ɳA!�����S �š�2j\iX�t����A���R턚���=�t�]AK�A��DŌ "����D�� ?S������p>��7dX�N��!Y9$���H緧���S8��I�`�!��ּ��<��\>�?˚�ܿ�He���
� $|0(�Uzo�wh6��.
C~E0�z�d]�(����|�p������D2��ؽ�W}+�F:%n�*�'j��Af���=��ԫ��گ�JY�I4��%�A�I��/��+�ލLt�y�L��}��8�N��s��z��P�ؿo�k���V�"�ڸ�����I!$�U
L\����SIQ$!��F3�9�-+AP�Y��)d3s�5�U�X��W��J��=�^$y���g�v�����d[�Ri�Pu���72l��������?���C�D|���ߩ��Lԣ�β�a�l�=�SL�=�hy��4Y���N9\���%�ŒX�������3��������hH�1r�-�G[�H�к� ���Qe+3�Kg�W~pϢ�夵D*�����:�0�*����P���+�oQ��n|���_�!�|�L�vd�_p�D�����}[�uF_����0�]�77�E�^�;5�.�pTrW(`�9}"����yP
!\3&�'[�ޢ��4�>�^A?0���vO���u�]OuE
�>j�p�D����7��Kӈ���ٺ����b�~6�1P0��q[����Y�C��,a%-1��m�/�
��;y��v��/~xw��4���Ԭ��7	f���,Y�jNh٫.�i�]o�ôZ�X�HSn���}�Қ_&�j�a��<R&��Ұ�j��w_�B�J1���+Ny�_9��b$O�CD�Nw�<���z}�q�tR�4h͋��v���16���=�Y��i�M�ą�2�p�a(���C�ݣ	E������~#��0k�lp�iR�K���aDbL����dЅ�-��N~���n���=4ݷ�5#���K#ǚk�d3�8�����jX������l��lu�����6���Y�AbxtV�NɊa)�@/����WŬ'�:,,ӯhS%~G[�0��*��
@U�2�N
�j��8"�&]9�@9�̰}����i��Q�S�4�����A�6Ռ��������?�V�\<?�����~�
,�;�毳�X�kO^�ۙv�x�zB�4J�ګ���9Z*<Ҟ���MG)(�pTv�T�v��
Δ2��j�jG!���~�)�n�YG;i���sߛ��V#���P�{X��ڔ�d~v^7qr��@{��W���R�[.�Z�f�2s�hb#�k��ږ���m똚��{'��e���d�D��7�]gָ�4�f��\fܿ����C
⋞�K��o|!'�́7��Tb�s6�\>�Yv���4����z��j4�yz1`1y�%1�wG:1�T�^.&q�\��u����ݮ1_Lda�2�Q�Nи��2�S"�'�����H��i�.��;�7�7�w<'B�RW$�qz�+�J-[9ch�fuCR}!�q�R�1��w�8#�]g���z�ɬ�
qZ���'!)���9���� ���i�x;�fC�A��L־7��0'�����NO�
�4���A��|��mO\���I�Ѻ;��Ԍ��)�%��(�U|�Ĕܝ��o>&�:#��TL�P�	^�7J�N�|Dq�=�]�ԛ��$�����Eh.�c��m��o���,e�9b-�6���JGa��m9���]7S��dB��j
������H�]`�l�^�3fs��!�F�B87���b
f�x����)�̍� �m-S��GMkU#'B����%���E�^���y��(��$T�^Z�S3�)���H�@�?
N�}*���=�s�yH$�mq5C!5���@N�eũ�'�{���C'�cC@#���O6�v�;�+)���Ge�����Z�P�]�"���\�Α2�%���Ҕ��J
��'�H.b��`�&�gE�D?�~j��*�|Ba��]�bd�	F������3м=e���H�
/
9�K�?�#��pIow�R�F@9�=ʿ)�h�=��a��@�2?��Q!���Ȥ�hS�Lt$h� �~��	�UxN4=iQ:{No�Ħ�4;�0��R5�,��Ԍ0�
�U���q�y�ިm=�q��c�C����znK
���A����i���ñUY��1�(���է��������F�ռt�<:�>�p4�9x�{d9Bt�m2�%��A��?t��!
��h�Y�2ҧ�M�Ok�iן��Ow�mU�y�7���á������;�~5����	q����S���j�^��U�(���t�qN���П�Z�)}�H�Mηm}|Ɲ�<�a��� V��;L�fޯ�	z��v.�f�*����Ƌ�/�7V	�8�?g��YC��2Y_����Yy����v[_x����������3lZExzt��E��D|��n}�9����o���
3��	C�(Qv�59?�S`"��bf�u9
���q�*솮�8�7��S�a�o�-:
H6����$j2[���xn�_��=���ux�~ �����-_��u�f&6�>��ñSfMM�8�59�c��X%x�0�}�-��ޑxI[}@�w���
�O"K�p*����*�s��~awW�6	F���VWe��햮���a�q�����<XnV�
� �y�8D
�/<�����ɯ��z���n��U��X_�8X�'�xM&�E+�D�+��u�o�s ����đ��D��=��Ā6G���}�TGo�=L������]q����c}S4kv	DPX����BȺ���D�\� ���%!��C�(���Qj�Ob���)����ʁ��nH��hݹݯgo�)�GJ(h}��u4�
G�)�R�L���r?c�)ѫ�Q�-';,�*��!ʸ9O�T���0SCV—RK��Ҡ�]o(���|�?�������{�?�?x�#���ߝ�j�dx^�/��0>���@��ԩ{��F�aZ;A��~]���������sQ �Xe���o(.P	�OW���ɑ��1�m�V[
QT���A�g��w6��u�-F����oK��/��ҫ�{@ሼ��=		F��
k���gզ2��BG
+KY��M!h�v��PO8'Y�_���B��������VLlL�B��(ʫ�_��A�Ș���?ڭ!9��T�v���%(�%��`��#
��^�2�UJ�↼)�ٮlpUF��܁������`n��
��t`�*�J]u4��4a�fW�``�+������?�>�|lW�"���j�饨�Q9n�\�_�Z
�^�c������|������t#�����_Pr?��޵�:�͟6�6��`|���%�J���"үI`�D{��+*�_,-/q�]�m����	�t$v.U_B_&+h컽�&G��L����Zl��vogw�hu�Jf�L�lP'd���=���JV�h�s2
q�.g1��p�˲�Jb�ɦ��>�q��/����,3G���	�<��oM�y�,�fA����.�0+��iLUue��U�g��B6��G:֣�J���@E
�Ҳ���`�NC��=\9Қj��@EV]Yz�T��po�<y:�Z�A�e��_�a-}�Ŗ\Y�z�e�GyA��>�w��n��浽gl��a`2 t:!D�i������bԔ���h���럯~�?����Ke�Bchecksums.yaml.gz0000444000000000000000000000045014442217575014616 0ustar00wheelwheel00000000000000�}�de�;r@D�=�^`���Μ�s}�H(G���CH�@�O�z�?������^���~�y{���-�y��x�r�L��N5"1���vNy��}�>��O|����2�Q�SL
cqD\vY �9�-3����ٟ>i�>tM�o8�[x͉]'?Ղ)�<I�u���%K�d�FGn6UQ�an�h��2u;�ZA��4h�Ap(݃ �͉s�i��̫m�R��b;��M�|oK���Vv�J4h��]��Xs3�魄#ԫ�n�is�'�ޅ����1e��PK}$[������gems/cache/ruby-lsapi-5.6.gemnu�[���metadata.gz0000444000000000000000000000105614554466355013461 0ustar00wheelwheel00000000000000��l�e�TMo�0��W�^�����HTT�BHpi+�@�r�I2�v�V�����v��U/H��g�f�ef�,�/�T���*T�@W��
[T2�5�H
��l�rD�����H�y�q�Z���Wldh��s"&��[�+���
B�oA���C�Qy�Y?'tĀ�ht�7S�P�D��kd ĺ\�e��l��eY�'/����4`��+�cHDo{��(r�`�8���+��d]�C��3��;g�%G��7!|D:^N)܁������C��YEҹ�����]!N
�X%Z�q���|��=�c�Gr�iD�)T�1��&�
	��)��N�
�y����q�St�6a��h'ڎ$�E�~����[-���K�p�1�p��!Lc\�V�(;�>��*��f��^�	���!HjY���h}h|�� 4x���$�M�1-�(�c�D�#n��H���������(��'�Oh��+^�+W�)DM�+�9W���i~��ϙ�Π���'����{���t�����
�LO����|<�data.tar.gz0000444000000000000000000013520614554466355013404 0ustar00wheelwheel00000000000000��l�e�{_�Ȳ(��=�f���M3+��C|��6�X�\��-�Nl�K�!����oU��/�2��Y��a&`������������������j�Z/�?���1��w_�l�G���ϟ�|���(�����?H�?���E��	�rwӒr������MS�-r:�\�H�)�4�#2��_\�����j����szZ�b?�!�I�K� [̷�+2��Ix�Ƞ �;#=�`\��Z�r�9��8� 
JOz$%�<Kk���S�d�	&�pQF�{��d���a���$L1g���=���
��~�$
�1�����O��4��k��8���+�C�s&yJ�R��pʱ�G�`��'�$
�X~^�X�6�q
;�PģX�6���bG;{�g�&�����6L�h�����п�)���*�^ i
�ˆ�Dt�F�?�#�hL�x���9XD� �_w�*�uj�:d@aE0l����&���S!@.��"���G�aO��MZq���r�=�3p�Ǒ��u4[.�
0�=V9�O��Yşϧ���`^4��e_�����T
��Zr�F���'�C��Ӕ��t�g�j�_��u�6�$w�'�b<�ǿ�!0�O�y�32��44c3�BW𫍃�4�ǁ�V`�������_�0Ʒ�}�@�x�@8)�
��{I&N��d�N�p����$�##��R���^�X�Z���w�ìE�r��X`�"�6�'�?���#�j���4���6k�s;����l1�B`S$)�T��U����~��POH�pOyUd��4T�4I��`����)+ϷiNm�
�;9����	�}�
��#-����lSwZ�ɲ��������i�������Q<�I�y�d;w��pg\l�o�Bb�g#�Th�ew�([D�@���L��z�����g������EZ�Z�(�%���D<Z̮�'�p:N`�L��ݯ�W�I�iCD�w�3�-�_�`��^��o7k�頱�M�x ;��`:i�1�a������(��4�)�� �ڌ�-т��
���"�f蘼���ĕct�p�-�(t�*Cns�R0�9y�[��I4����?���㈊�5��Mu!�a��f�{`��t�=�raђ��M�@�„Kz�5��/�Y�����{G��y���l���)4
'a�8q�~��BZ����`�tk5�a��5WW��I��(L��,�g2I�M�7@�0�͓`$��p����t�UT%��f[G��D3K�
�����p�O"���90�'��DM���,���P����1N����2��_���C�����y�b�Dx�):q�;fZ�X�*C�#h�=W^�1��̟N�RX@e8�1��rP,*@�ň�"S�N��`�ZL��_�8!Sw�|XV`(#�#�)��\T)�"��9��\�lF��Sh�I��k�k�#�����}P���j�P6�򡕵�m�*�(A�R
�\�*=+`��?�Y<�9Bqƙz�NS���M0��q�!����"�y�X$�+1σ��c��1U�z���v�����4��@�^D,	�4!J����4ƙL�FPW4��@�=}��w����D�TA�8������P�EWJU��.�cU;�vt^rw��	E3_O)#��)�< 9���Y���I����S b���2܄J�T��
&g
�u"��s�??�ް���mXS��т/��`o$IϦ���.�&���\�b<�3�߆�Z/��U����Xs� 	c�3Rm(�y��ҹqdt�H`U�A��#��V�Ǎ��V*t�8�_��Iw����>YBt�-�9�2��/��c���	K@T�@0&"Uk.�\C���v����K>v���m2a�ƍ�9�y}�r�$�8�v�8��J�s���0����|��Tʕh,�f��6y�LUk /䌃4Lܦ���)��a+����!�d�����E�es~�-�#�9(r�F{F��i���%h��F��~
�0�j��÷�|i�5E�ڠ�Di�����*�{f\�����rX^�n�r��^�n�e�
R���쟾R��X}k�G��qr����a�l���>e���?�܏�4hT�DV�nt=�3�v���~E_��2��d��zINaGO��'C��G�4�F5���`��+mw�@���]���շ����v}����z�bװ��|�ó����wOvi�3�A��\���t�fڭ�w����&l\���Gk�6h�4%�� �S���3�-@�"���$y����r��g,��J��[LPʡ5�.*ž�LY��,��8y�zk���㯟�����C��N�J�y�1�_�h�u���4�k�9��r��^��_�$�bko�Ë��v�4r������!(���oe�s�I3X�wn��������t�����w�Y�tc�Z�u�~��ݺ7�Ä|��1�o2���~�P��3��듇����6I��rـ�@�x>�e��O�%����ܜ����k��?r��>�&Ok�0��@]�}�6²['7�m�q��N��x�1��H�AWc#7J��E�T�_��̓�w~F����d��=H�u�����s2 ����o���a}�����.�=�=h3�DN@jn�[��_��:��o�-o��?��{����?�ggC݃��twk���Y��L��֢6�_�a{�ư�O�+�D@O��;ăz��)�f����&�Hđj���Ho���A23�Zpo�1;�6�p�qH�&�Rmd��?
�X�h���P{�l���A��U|�Yb�άjQ���@
.����Ɍ�hdzA�����#ƍ4�C ���"��@b�:.B��0g�����|1^;�p���Dw�T��C�#F++�]<BZ�鮏���0CaAh��
;5Cbq����h�Z����;���6�7}#`�6�$�d�CJ�4�dw�T����P�����-b����{���ހΏ��t�]�/��?���G��od��K�/~�N�����#X�H��Rφ�ޛ��yP[�����F��^�9�޻����ٰ�4I�����wv�$���k��w�!�7i�v5r~L�u��o�k�M�7���w��a[��Z�\t�����i�O..��.�n����޻��6�-���ݳ!�휞꽬��r��#�jɛ.9�uޜv�!�ɣ^�{8����p��i�6����Т}��kr����/�d��λ�	t���"xhp��C����7�aox9쒓��#J�A��s�;�#��J��A�Y;�;�a��l���rУ4�
�������/Ԡ~؁�G����@W�G���(ҀҾI~yۅ�>ғR��$��j1h8��}$gݓ��I�찋���ޠۀ��
�@�6�m^�.�V5�Qa�&H�;&���{�6/C?�q6�$;|�ɽ]�ة�j߅��B<��;�{o��w�F��
���tB�5��p��n�P�U�*�ͧ��5ȗ/y��dF
m�ID�����w0��	�q��g:I�z��������<����C5	�wNYFI;�(�/�o��tptE"���2��]tʹ�����m�z�S���_ߞ$v��ɻ����w�ݾ�
��]���z���H�{�k� <�î���U���[I 0N�*�gM�S�{�uN{?��үxz�R?��{�S��g��Z�aOr;i��������1V�f��MK=z���\[+7xZ��l���,���7��׸2���=�nj��_����9�`��󶖻ԛމ�z���P/����_z^���D<�$�|N\���WC�׀�C0ɦi�zm訜�&yQT&��I��7.��a!�:o@FZ�v�R��^xo�X����J� �v�)���JAgu�0yxm�Mh/-X��]�O
��R({��S\����RtM:�z�����j�#]F
S�/��p��uл�������~|^sx8Tƺ@��^�hrX?��<���b.�G7~�g�m�����ǰ����6�xO	/�l���32�9�4�,m1�dB>��`I{��eP.<
"�
�"=�b�-���� }��k�aƻ��P,���	&=8@V��i��D���3�]#�,y��b���z�-�YN<�����c�Eoi2�~�
j�5A@^4��v��鹸�S<�ZD���Ŝ4��&{��( 6,�PτF�*��N���d�����=
sz�n�h.��h�>�MJ^{���9�P/���;���$n�P�V��6�5P��iH�<�Q�~�AtkW�~@3c�n䏢�RBG�nt�H�nȟ���gNR���-H�%1�k�f���(+�(,O���P���  F|`�D��U����h�����5ڤ�+ 5�t.R6�m`�Y��<�KKԘęф|g-��?�E]~��Z��{��4������g/Z/��-���_���wG�֎�o.OjY���
�e��*��U�/�p�UXzG��F+o�4�NF��$I�IP&��I�dz�����j�F���=)��|`��Q�1���J�k3
7b6.�)m�ʫx6��S�N�;v��B
��^O�N�z��
~�d6J���߁��	�++	�Aawz6�;zq�?O\�Z�͚n뜆�⓺��Ha�����B�(̓�2���-��I���Tyd4�H>�O���J����/No�:���Ӯ���(�?gױ�8�Y��������I �����)#�j]-&�>%�`J��iN3X=�Q+�޿�ҸǤ�B%�^f��7F�CcϨu9�~��^�@�A��ܛ5�b*M��j�T�i]�3��4{�~��I*�N�u�^gf:z���1���sz��^
}7�::�}�A����G��M��ݳ,�jW��mw�7�G�X�i	�h���D�G�ě��O'��Kn.o�t��\{��?�y���v-�vOC�������R;�v�]zg�i��C��N� 2�s�%n��M>�2�lF��Q̢<�n�����?O�:�d�@�S8�@���K��0�`�c
K�;�Fn�U��y����\*�x�ʛ�:�����eEN�4;��>q��z�ل�v/�0� *L���XA"R�����i^	�v�a��Z�X�x-���'m-'��t��$�\'���Y�Rϝ��f���gi0J>�ܛ�kN�ű1/fso\-�����p�R���<�D�c8�p�X���yv��أ�c>zx�Q��`w	����$"����5��ף#̫5���zW��}>�z�Z����4��ވ�=Z7he�i�2���nj�4�
��lH=z8�h[
q�cL`q�㜥����
<,��]h��#��ȣg)��0qڭ��fi$�Vt]k`Oܒ��k�ٯ}&�3o2>�<Lm���<�'�����$��� ��&�#o�&o>A���x1�2�:������t��b��b�%u�c�A��44�
�w:�:S� �
�J��I�/,��S�	exz��/kM�p5YkZ%%(W��\�F*���h5r',�:��b���|N���l�C��#��ϽQdtG�?��"sJ���c9�HP�;�,~v~�u�P�3���h��qE��pa��~��4�Xe���K���pHJ��jG0��k����������7Y>|�[��f�ȅ�.&<����s^�Ã��]:{]�@9�_>
:T��O[�#
2A�ڍF�$��|�G��@��"}��l,#QF�W����)%h�i]g7�T�1�O9{�)��"�g�H�c�� ���4H�:�NB�G7��!��.{��w������ma"FrS
��Q`%�1���2��X�O�<lu��L�j��u'w~�$�e�����&O�nK��%g���3�N�%!��&�0kgg����9�Y���>��#�q,�a"�jEl��%�F�����
��3���Z�����{L��4���z�P���;�;��0l�a��i|]G
��GSÂLf�����n��(�9�u���7�1��2�����ԫl]�q~BcX����:|
R�Z_'O��o��n'|O��?%$�'�jތ�fy
,1��ؿ��g�M��6������[\Лd=�)��K%=:F���gMM�㕜4���&�y�*-0߷����o�_�����o��5[��f��̻��S-|B�f��ޤ�K�W�oQ�x��ra$>�n#+4��G
	�'�[F����D�@q�ѷ�}��2<�>�p>��=�<�s/+��>��W��5+��%�G��Y{�}�zC�IM?�X\]t��Um�w�����_��z��vXv[sr�37�	�&$��F��9�o��M��o�}��#�\~�!6�>�2D3!S���s(A4����B���DVH�ޜ�� �����2
�AS�i���:�;i&A٨4�$��s���Oh��ޢ@r�=��7��Q���ټj̛Ec]�'�w��%�I'J�(�<�e�I���+�=l]�O����f5�5���A���7#l��a��hog��3m�+Hb#n��⏷	iaN�aXu�mɫO�E��L��q�D�@2�	KJh���~�0���1�e�-��㎰a�5�@Ɉ�݋n��YBG����� �OS�{;h[�Psk3`Gj�j�Ì���R�6�����u��^;��X7�\a�4�ƅ����5��/,��R[/KWkŖ�b����1�e�P�m-j^���=���h�޼i��J}ȸ���A���$��MQ&�9T,@oH��^.^S;�=8c�Qtl�#�ͳ{�N��Y���~TV4��K����	у=��)4��A�<NA�۪7B�
Z�4��BM��x�O���z^��n6���#��
&4�ah7�;���<�h}�c�D���:S� I@�BPO`�Z�}1�ay��j(���:�+����j�l�(,]c���1h�ȱN�P�Oy
ʀ���%etDA�r���O�$��S�6�O���lBk��j}�P:�S�n�,O��$��|z��y�{t��"�bJYN��*������7�A���[���m���
�C���#M���g��e
�d��`�f\9!4��T!q�����˼w�e��R���T�ՠ�u�H.%�ցrq��[���*ܣp�j۠8�(�����O�J����}"���!�ͮ]@y*��+��]��#[a'cFмh��QH��]���i�c�;<�yB��S*BP1�S8���oN�A1�S.�&�I�Eb���ԁ����^��H��U���q��hDD�N�Q*9���uV�L4���$W<{g�>M��TC�xtb&�34��������Q���nO���&
/�N�|l�%�➲a]�k�� ��Q����W9d��q%y� �x���(�D	���w�C�{��aC���: �̀���E<�t��T��@Ŗ��PR�al��̦2��b�T��p�nU�c�r��#4����Ά=��nN����`��ӷȇ�đڍ�_*T1ɵ6m�#� ����$c�
ri�M&��!ȷ;��0]��kZ���\�F�w��e���
Ek�j��a���X5��9�(c��@�i��-'A�ߤ{@o���A�#��3�&1�p���P�T�tM�2� �D�<P
Iݩ)���R@(S��8@�X_��=�D��Cքbæ���n���T�#�~���K�<QPjX"r*n��:TΧ6V6f�uڹ�����s��]̐�
�g#��)$�,t؄��,������V�T"�#������	�8��۴��	��K�s��㲞<���)]�Q�X.�;'��Y��68�!��Z�(��D�kSr�Fy�fg!l/H�A6���2���Sf)�B@a�.����Hk���$['�e��d�쩲��閼��l�LD#��$ ��)Mn�W@��B�+S�aեZ��ޢm7hM��C��T묖����d��\!rײq��۳T�֞�3ȣ�v@��#^FBEi3xD���IbZ�-���5�IE����F�'sb-zb����/ܽn�Z/��2�I���N.8L������|n����c�ǰ�>W@;ؽ�5 qJ��2[y1�\n���B
�YV@f)Nn�$�ܯdb4�����[̺ľ�*��pݎ���6�	�����(@:�Z,�^7�@�vT���I^�{b�=1r�����"n��A�����zV�3�
���K�ܭ
jWAR�%�B	ҍn�T�5я��GC*���tͧ��ԭw�Hp�Cp7P�Ni��H�O��=aȽ�1s/t@�&�'�—b��
�s�†�����X�/��,MA҃Hz���j�Р@ȅ�<U���?����}{�Gq�>���e�4��*z
��t3n��H���&�@QC���˵���!��:dK۶�3G7H u}S�Ϸ�5˞��1�w.��9�*�C�x#��b6�����
�0�|)�3��K��T}]��"�ɾ�ⲙ�
�-h�ύ��c�#��Q7�m�F��A567
G�:��5����C��1u��#�e‹ShSteS�>PvAedc��	�Ό#D��r�~��:���#�ʥ &h8���=WenI�[�̤ח��?l���I�[�wU���4]a�!��l.��$k���kMdM.I�f�҇��Aj�M�y�0�C?b�f0���f�~-ʈvJ�5��3�j��]�r�
�eS/�1�JBQO&�'���
W�/u�9�7w�|I�I�>�Z�/�
:K��J�i��*�䁿JK��a���*-l�ZV�}Y�<�q�7�ದz��8S��9��.8��+�L˰`�Й�b@Y@F?�r�
�U}��9h~0l��D��HL����6v΁��m���E77�8<q�c��Ӣ&�*
�����F4�U�/�+4����p�-JB���H�����}ŅE�J;`ò$��4�L���xN�
�PZp�]$w�NTgn�����zv^
�@���C}�B�Lf�)
Y��B����s������}�f�a��n}�V�+��J�7�1gW�y]�.�1��0n��t���e8Fǭ��P<���	SQ�Z�v���(�=#|���]�7@�#;@6�v�x���s�=����sop��{H�ɰ&���6�s��B�t3S���O�0hTVE����,R��T}c2�:x�K:	�;��y�R�Q@C4�"�u� ���~�Zޒ��4e��&�?��e�����^V��Ҕ2���n�����+ns�c�Ax%���O+�b���xQ�����x�w��)>s���>�����j^Q��)�NI�g��$�2k����O�����\�c�%��X~n
�b�E܋�s�mc��
�>A��ɮ&� ��
�TW�ӹ�W%���(���\V�-���Y�@�~�:/E)�f�'����H=5��]h�pI�BU	��LQU�mT
x,g�iT�����\S����ݫGÜ�(_\m`�Q/��%��Iۯ	�^���q�V,&3v����X��hU��P�ɾ�JWwJ�W�2boqǔ�`{��~`�5u�1I�@tӁ-��e�1���3zTh����g�R��b���:I_6�Ke�Z�Iν����o�IZ/[�϶p����8�&�b�AXL���>}�n��.!k{�N*֡׍G`Þ��n���BN�iK����l;ͨ���r9��,l���D�ɷ�OD���aH�u�j��CU��ۅ6�_���(|�E8�&i��M��0�IrƦ58�� m��7#8ߘ,��9]�����,��*p~A�Y���q��.>S��RX�L��j�n�I���0iW7����.}���>�>��>�($��DBüc�}�
��#�V[�;�x�I?���)֍��^a���1�x,��Rz���3��r�L���Be�dt�NLހŤH��9U�KL�ǝ��S8�A'�f���mL�}jl�\rZa&��1�>���1�0j�-��[#̢���&�罕 	�'����R���y%!�y}Po�:P�^��Z55t��ʶR�u&�
z
��ɉ�'����!F�"o��N�����!�}mkg����
�X��vkg�{����ڝ�̃��2^{���֏��#�S�Kz)�`�ǯwX!����Pbn���\
��& w�U��za
$����O��=YH�	
+!����e?�+���)"��x[k�� %�Ŀ��S��m�ov�v
PFJAWG�oT��S��J�_S�eS�\"�-���x���9��ER�Y�����Ԗ��Y��I�8Ø�	��\L��}Lc��GF4���.��5�b�3<���������뒋;;�*�1@R�~܀M�b��xLӡMR�~}si�b�|b՗�Î��%���YkM���[MDȫh����-��M�bC�w�Ք|��<�]f�5���kk�A��6��]3�����x��Z8��e>�0��lLK�e��&�h�6�@��lE]���,qw��jf�m�[�Ru��,@�,��Y|�I��װx�Y<e?j?x��17���7n�0�V�VG�&��C��䒭j���l�Z�b(�8H��Ӑ��ñ�ޠ@֦���2s������0�!���;��a�+֭�I���[/q��~�𫲥h��9(mR	g�C��ؔ����~�3�~��G��V+��	� �j10�F�O���,�
&���313k�MV�k�̉���}�M���Y�����<����c�Miwy����lB��<�}c�h"%��0D�lF	�#�D�~-��Q��z�s��~�!5֬��Ŗ6��󻭃��G�d���ˏȢl�!�S�J���n�U�g���sK��4��O�#{��_���Ee3��7�:�@�v�a�8)=�yJ!S!�]rQ�Q�q�tD!��&l��ȶ�J�5sz�n�.�O���ٍ��S�8]�0���{�_R���'�b�����_��O��@`����EߤW�ɳ��Y0�ŷA��o21��KfF5��ٺ�uOG��?B��V.gD�7���)���^���G�*{s��1�+V����"!�{�W�{o��W�>eE��\�h6YfV<��y\:�
����!�,7>K��n�t;;�U���Ȓz�|j�xN=�G�UB�,S���H���	>��rFVh�7��iǭ�
^-	`د�ͼ����6�
�h�c�	���BkʔV�%���R�>p�{[/F�s��,��)�B[þ��^X^��	�+	􆒸W�O���j��j�uؕ[�y�MXnטL���)P��mm-��Kg�IJ���׫a_��'�#W���=�u�����Q��2���z��
^ei��f;㋲�Oʒx�B�.'�CnE�.�%8�$��ۧ��ѵ�L�&�qiEM�h�quʲ+��7�n1x��F3M�r� ����4�Jc�M\�1����(8�1Ҙҗ$J�}q5��'�T
�0�l%vZ}4�d�P UL��(ְ��!Җ�8��Je��u��vv�
�0�u+7
�F	�wH5���R���CrAE-on�:�'L~�l�n��'�wf4r�@zT�x�Ŵ�z����Du
�뛚��F�Rn���d��w�S5���0���}���6����~10y��z�c.�_F���u���&��S�����n�O���^��p��b�DZ���D���P&���XCĝ�-0z�+<R�#GQ���c�]�@-�i�u4�3��<��z�G��Q����*���X���5��c��f��Y�W���B�W쯼���h�j��vE���xe�/��k���Uv����I����4퀮_�|MZ���<v��}�vGY=q��j;�|�v�+��2*ToɺA��-���Z�!�,}!�`�"��ڠ-���/�NDڱ$���sA�QZ"[����X�>�V� ��A�c�EK�bZ���-G�0E�I��[�~h�a��ot�ԯ�e�\�9i�
�Po���˹]_(_��iVx2��Jm�UaW��z3(&oQ�0+.�*޽d�\h%<��
��OCz�7��x�����V��|
#�@�m��hsO�S�
���J��Ih�W�c���	��%��V�V��&�߳7Lje�w׶��,h/�
�tj;;���;�b��4�x5Ջ�,��k	y�}�Ӡ�ˑ%DžeB|F����t��f��G(�����&y:xj���ÿ�n���QSS���3�z�9��;T�{@��*8`o�t�*�`� ���|�]	Wx�4�Ɯx��8X��A�Y��N���1�Y�Pg�¼�ɰ,��nҒ`����++���>�&���(mN��nL炆�Z�Ws�����7{��9�ck�4x�(�l,���購�]am�K�+��E���
���P����n�r�r�G�)G/u��	���(r��"�A^_��S�Y���nY�ڌ��2jr����	
]s�5Iq^Z�ZH�L"4�<�>5�
��n�]q��A,Ɓ�:G��4*�ED⑏��1���(����?슩SX	��{2ˤ�q���
g�S5��g� կA87�vx��j�4#�7���X�*�jJ�u��Ť���e��|ZI}8!��6�@Ď>��"<�yk������~>��5�w�%��uLh�b�0��Eu��b'&ƛ�I��^vCݰ*/q!�
V���8&�:�����qH��L�50٤��b�8�xWdfZE�V�(�3��Y�Gsx*�[vc ��6iQ7	�X�xJuv޶��9��	���
.�)'�|�y#��?��r�ꂏ��<�<T7Ok4\�(}�ģ M��Hs~V�m��^��"��ma,��T:�Gy�[p�M�G�X��\R�%[񺦞�uKڡ7��A���a�=9�\�.`W��d�(.}9跛�c�
#���x��YI�z'g
�eF�6�(����A݀Y�����!�,"���򋆚��)Q #�~��X��0���^<o�?��|��O�-Q�����T��
��O��cu7t9��jxJ���ިN���g7(��R�̈́gl���gr��oFg���k�<��&q��C�	J%P��kB�s���#�,�k<m�t�΀��2�*��i5����d�
�|<���
$?�=�x�|BFWy|�9���z�!yGW{��Y�\�x�,
�&���&��^.���F�VW8��h��F����$��Hkƛ�co�G׈�oB���u���o��,yW������Mb`�@sB{d��;�޿���6�}�z�*�
3��Y0�a��
ic�UUef�2|���8�݉����K_-�D!��4��5J��+|����a�m7�;�;�M���V�'!�_m���(�A/�Xku&~
QdB7�4�0�HE��n�j�)4�.��v=�'K���ԿgK�j[f��1�u�'��.I��Y�P���+�HiĄ)��&�2�;�	_Ai�3�ʭL+��,���~݈}_۫��}�ob0q�Fq�.���J`�\�����J_�4Vxs����{,���C<�(x�Ӎ��1�B���6+<��tORuz:���{[�λ?�h�R�cX6�Â�p��#�B�aj�����E�|x�
/�~yg�G���o��K�@�\$JՌo���C��3����kciW�6��9n�u�y�?n�d�[()=I���^˗ ivZ�wv��8�����z�W9|U�#d����<�(���	8]i�4�>_��SHU�힭r�tCz�e��`�G���j�_g=�3xr��G�x^T�v�lQR}Q��u��k�{��������W��u��ı�Y���t�K�_s:������'344TݫRuia�x�
B:oV���i���� ��c'u>`G�)Qxʔy�6<KX��U�|�8�_��=W�o<Ylnמ�{�_�>_�K����_��[LK|������������x�˾k�U�TJ�P����D���Rd�"�:+�
^�t��I#��gF��Xs�u�&=�s�;�H-SH?��і�؜���'][��5��0˹`-RZ�H�Y�q�T��,��ITl��Q�E�OǓ�e���Եg�j��s 
[�˯KB���a

Iռ�!�4��J���r7��Z��=�e۴�Q'�zlc�·�۳no��N�1�K���2����W�S��z�h�g�[γX#�Á+��/� ��w��b�O���xo�/�(pӣ�a�+���B\���BQ$f
ó!��7qwPL�cR溠��)�)�@���$�s�������=?vN�)��:�Ȩ�<�V�b��:�z�2c1�篅�h(��52����b���QP�8Z���p�.&�k���]��<�m>�ͩ-&���1��<�R��I�F�rڞHس���?cl/�$
�����:'%$��ק|��.lI$�+gƔ[E���9�Ou�B:y��F��:�i�q���2����Q��d*���RFV����lt��3TO��jr(��N4�8�)�O���aC���
�b�U!V�5$
]���a1�
�1Pj䫍|.��[�"c�O2���+�5}"�����t��'�y<:�t�=)դWmv�yc
��k��ԛ�bZe��
V�uYH$���X^�'��h��\J�#��Ϯ)[���8Ь�	Ӭ8��T6oD!Fk��f�D��X�\��|=��B���>{.*�jw
;Q�;��*K��D�P�%�@�)S���lK���{�T��"����5�]ɺޢ��H˘�DO4�����p��ZMpQ!�G�i��ES<V�qP�k�G\b
�ٰ�Gَq����,���D,<�S�D��KI���/�F��sY��u)(�ty@�
5Z��X��ޙ$̥�]�)4dl�IN֤K���0y��2��%�\+v���tnB̑�Y�]5K���X��ߖÂ���b�~Ky�"��V�l�J�֒��
�ņ�ΰ#���ʜ�)�(��B@{��}Pn��)F���Ys��	��e��t����*2�W�Psˏ��˰_w�Wz$�fs�,}�1��z�4�W��E���_�PDj�-'�U�i�Ӗ˥�͙���!.����g�H�T�q�@���tGM�5�TUpX]�-ƹ��+I.��k��:�r����/2�eދ�l����.��k\���� ����^D�X�hf��̛ڐ�E�u^Y��;�%�5��Jw�h���ϱs�z!b���Rⱻ÷�I$T5�jk���'4�|��sW��0z�
��ϭE��-D�ΰc�t�?y��PD�Xˏ_��g��CBkN��*�la� ��~yE�(WTx��nq$1�S&���OØ��qc0Z����8�u9\��0�������3�6����
6*�p�7�����j*���~�C��ǿ��r�\Y"�O󘂚`��H��*�܄�e��%#�[h�M�A>L�"�h��uz��m��FQE
����rp��BQ�����s"~�>l��[�z���;��a�A)U�$��J_��!���K1�TVU�@�ۺ�?@n�(���?�Q���Ƴ��ȗo5�z��
T����g�vD�/���I/7jo/.m��_�SV	H!&#!��s��\��i��S��,�`�)����:���K�`�����	][�L�?d7I��t#��leUͨ�X+F����+�Г½_�Q_\�̙YE��h�;D�7�Kݒ�;��5�,ߖU����ߜ	8�Km	.;²�fл���0nK
���`��	V5�n�MÀ,@�C���ў_�:K�ɑ���&]N����B�15�I�om�]��Ϗ&�54#���W

��X�pm��*ue��G����|_@e#]�n�eb�	�%��=��`�b6�j��y7�ח�X�+x:�qҗ?���|�i�q����Q޹xӞ
��4�~�������Z�6s����<�����AO3�Zm�h��,���{��-������C#��G=mYr��T9�Y�Ѵ��!�qd�L��Nj�q[�j��y\�]�Tiu�N��=W!ؘ��t���x�o�V��P�E��&Y"����Pl�W��n��_M�ⓗ���N��M|�;���y�r���2,�P�~~(wV�X�W:Oz���f��X4�n��^<�6+a_�`����~�{ۧ���V
��2|�J$�p�g�JN�*2w�k�5��9��Sp�J��s:�cp����(�ܡsc��1�P5ܵ����2���]��(�X��oݱ�7�
.a��0R?�AV�>Qf�B�ʦE<�^���i�!�ȃv��j����kc��99:��z0���q���ZA�ea~ �/_�3x���{ʚd�O��6
�8<��>E��c�{�����jgI�I�ޖI9������Ry�W���Br�����4�����ݨr]1�p���-y��zĂ_�����X>�P8��{����	Dz�F )+������[k��jg���J�k��u�����*�'�ˮ�#�
�FP^�(`N|O�O�Į����v�(�.�^�6�F�#�/<1�gs?	hNc~��c:+�m�c	����I�W�{*�m��u�Z&[*�k��Z�U��$���<�^r+�q1����֏�S�G��):�'�.�G�V�l�Q�3�."��������`o�q�L�e랸��
��Tm���=����(/YKVVX��`��4�C���6�dP���\_^�i%J5�!.�y+��Xi�eO���t������-E��oL�F��SӁmӨoN�=rNgϞQ:�?��RMh���P��ҞWԞaʨZ��3���*�g+LN[�-��.��B��	i��|��'�8�1ʼ1���Mޯ*�UG�N�e*�?S�&h�d}o��d���O��ƈ�\�4��Q9o4��Ӣ�j�[FQ+�E�2�����E�8N���SQ��KI���h��	U��s_e	/�Z��'����a��/^~��f+���_���:����}�b	�a��K��>躥�a��Y���g��*[�(�ln�ñ5�DYۘonj�۫YW�$m��Hi����-8�Pl���H��D�1�.��c�TE[ܪ�W#v��|�/��guԩ���:^ͺ�mo�Y?_�����[L(,[`gӵV(��kM��l�yi1���-J�+�,>�Ҁ��sT�s��i�pUאJ�O��A��T彯z��*j:��Cz�f�o���\�����
T6��vX[P����C,'�<�
������̪��<�W��*q�y���E�B�.#�V����a���|�=����(�����f_p�M�[h�9�8��<�\�տ��&��9��o�cwFW/�u��U�ܷ�H�v@��9��Vu*T4�%��]��f�����"��O*K����W]5�O�U���=T�7�%.�Ң�e�/ب��<s+�ӌ2�����_�+Y�p�mQ�*F��֖��ܱР"x�L|�H%���ڲ6�֖E1Z>�},
Ż�)W��b��k}uo��jd�#�C�����DKR��r����x=a�"h�pt|��Ӧ�'�筿���rq�[������S�k^��
���ɨ�hj�PUcY��M9�<DbaQ���toU����Vs�,�He�%�ĕ�4؜?�8
��=�9|�G�&qB~o��s�X��K�ꡤ�sY������%�H��1�dP1�y�	�?h��vZE�Jo�����G��e+�_"��H�D���_(��9���4ģ��u�91�/n�� Hn��ߘ�R��ym07��WL�3R��S��J�Œ� �fԧ�TN�/��^IN�h�Jd>��z/��=��F/U�yy�u%��n�"���G��.��(���"b��(�����f��D|��	b3��X'՛��V�o��{�j��pʞ�<�h4�G��_���=$
�
֕��h�)})�;�� �/ �����O>8A�)�5�<~m0oG��*�Ƭ9����fXƢ�X��V��"P9?�|�A���6�+qVh
�~xC�>���Yx
+2��(}"g<��n*@��K`a��Pt��ʩ�Bߪ��z�<Z��vH�$A~5�
�*���AP�	�>�<N2�}�.aF��i:�G�=I+(U��5�Dh`��;���^4]v_����;���G$D���[Ow��snJ�}!J��Z�E�h0��iO>#*�h�,k�]�N�_�	*c5;�uP�>�4�w�<��Ԟms��΍�U�uٌ.Ju���Ȣ�?�eC���՚�V�d�pRcж%��"��h�dz����\+���P�0�WC���&n�8��{g(ʽ��o�҈�O��oԓ���
��&N�5���G�B8.����W%���Ɛ=0��m��.(�bh��Iq� ����'$Y���-��v+����S�>w.?�B�tz�?�vÆ�T�bP49\�ъ7Kl*�	��u
i��N�,�V
-A�ن�s��y��ų�ڞU�{�?��NW-|K�Z��h(s��l�����H�{vi��~��uEs�'q�b4��Zk��� n}.#4r��an�i8��5ïe��(�:�|�(V
G�KVl�~4���W~+p4���)��6�3���e	���Ls��V�\+Z"����c˥\FfڢS��9V��Ѵ}Ea͹��V��,n���a0*����$��`�2���M��B�ᇽN��喇�H؄�X��.��)��w��CPlj#һ���w�.g:@ꍧ�3�m2x	/���,0�†���`�v��z��*�&f�k��E+���BYy�Z�8���Q�c��X�f�>�a�N�>�}��1��hy3�C.��<�m&s6�|A+�pj5[j�S��EeY�9���o�O^E����&����𺲧�Z���t���Z�A�{83j��K+��XC��i)�#��4k�iI��-b�i�Q��4I1��͙7��(�`%�O�}oH��J*|���,��KA��Ɩ,�*�0�����p$�V�I�zox���q�50��h���E��(,�HA��
���d$��:������
n|� �x�2�S���p6�W<��
���ȵK���P�Y�U�}]�c��R$���1h�Ӵ�0���&�H�R��B�����LO���G��w��h��\i�o�F�8���91QgM���a�bA���E]H9�b��Wk�t�p�9�u^��,6M�O�Q���Vc��j�%s���7	���Ώ�����.0�]NV)K��Fé���_{�z��{�ΖߞJ�{Q���{uv��%�� ��m@m����E�ñ|58(�.{gC<�S��a>w�R1��i���itZ��>�-�uZZŷ��{1�DY�5>w�= ��Z�~�Bp��zs�%�b�f��4n �D�\�_3Ǡ,�/C��,4Y8.
����;��>o@[�7f
W8%�]�� ;*�@+���tŊ�j{{���8onj�a����B�-��(V�/��>TN(�@�s�d�ʷ8��u�#�b��^9ՙޭ��9Kx��ųp��"	��(H���:��w�Co��w86Ը�L���u%�V�Ty�<�f��L81٦-�)��@e�
>�q�ă��N0�����Y�p�=��H��*���.,0g'%�~�IfoX��on,4�p�z�C�T��K��/g�o;g'_~�<�;��#�R�]�<��=Y����wr�9��9�U��g�n��-f��/�n�T���	k�/����廋Z���x1�EM�̡�"�v�k�;�E�ڞ��살�`���\6`6����F�,�3E�܅�
��~�����t
|uuϙ�p{�}?F�$�!�=Z��tj2���W'���7��^�v�
Mi���^�/j
��Ӹl�t��մ��2�	���Q�ָ��*[㥀�ؽ�pGt��j]����.I�ܴ��uS�V]�7���n��W`�կ��4�X�:��d����KW֪�.\u�ڑ<f���TW�8<�W�7��u�X;��U�J����Z��o������J����c��j��o�?l�mKK]g�s���f�M���$D*j[�a͆!���B+N�i��uzE�iÎ���W+����Ч�d�7ӭ��@6ڢ��ŀ��ʠ��$@�
���P7�Wc��
2���:?�dO۠���w;G���K�7��3�]��뜝�A6~��nԤ���&ާ�Rǝ�)ꅦV$	��X�Dqt?������0'�ko˕�����j+ͤ��3����t#g����o�m���ڬ����@��Xe/萒h��!�}y�]O�+�����@)��€J�|���h�-Ph��̵��Vݬi�t��$��Wٌ+t���}�������D�5�>��T���8|�vv��.�4
��I��ߋ-A�\��p;�B~��Z����rŮ"g�Lq�p�>�c�%H�d0Y��#�}�f~(�4l���d�}���وl���
��g�S?��#ؑ�ڧF~���}t@�X��r��4�'�:��;���Cr=������l���k~�A���x
ڙn��&#-H��tk��U��{�����߯vi��^��O<![s�+B���[�9\�'�O�`&:Tp�@�r^�����S�����B���r9f+
J5��Wk_l_����-�U����('����:���|�2g}ݑ��.~6�(��u�F���TQ�J��p�V�S˾|a�rP�P�j4ii��@~��&��Sm����A�]%ܴ3����A���V!1�!���?�X���h��po�>��+�iR���d�'.�J���f/]��Aa���j7V����{J��#����(��R��V�E�^!"ĉ�F�Z��L��'��~m�8NF��pY0T*�>�-7j�1�,o��S��r-
�U�h�D���;�:V��ѯ�òH��U����
�
Fh/��n��A��-iT�me'e��ȱ�~��_E�nnҕv��<,?�#�UZ'y���V�1�y�5��}D�
Sr��6�����tO�b�5���Xg�h��#rn��Vz c�"HN�kwvl��4�|�i�À۾vv>ט�l���$��K�["���S{i�-+�G���4��uӥc�/� ү t�g DWU���q�Y����=�|:
�y��8WR�F_d	�l�~k*�O�n<�Ť��d��9�d��ϛ̭;;ҥ��|��-a�d~12�zh�M>��
S/��������6M��zH����(�-f�}��	���Zg|43 *hT��{�U�
݄CuC�钧��۬�-�ERw�U���
�\����s�nj�c�*/��O�4�
1���6����E����l3a��f�(�v��>び&�p�j��X/���,����M�4㲤�.1Z$z�	�dj�x2N�K��֟2h�"���k�F(ӏ{zR���KW(�<O��m����
ax�
!�o�y�f��<�����
�ސ�z�u��oO��j]��i�x��S�ҭD�(���Q����)�Y�%�,�r��C��x-0�ei%�p��G��D�48Y���f�U�
�D�@����pv�U��eo�U�Y+�
c�V�V>ទ.sq���F�u/�N��]	g�����*\_W�ܮ����*���MF��-'}ap�\*�j��H<O��Ȁz��{��@�q!��x��k���l�Z[U
���R�ls9}@
�&�[o��7��K�#U�<i	�75:?kw5L��n�Q��F
��@�G�E�H��>S-_�BL(Ei�ߩ��2�\k7��#��y�ҥOeY�t����XE�ڸ��zT�W=b���l�Y���<����f;oQ\b�WY9`C8P��E-��Nu\lٓ���
C:rLc\���r�,�w�Faߒ�p��{�v$�[-�Ń-�֖
Q�"H��wSy�Y�V�9�~I��V�������n�!|�m�ґ��P&c�=B�X��i�X�W�4�����};kS��3�_4�b�����1nlsK�Ц�,���&�ub�����9;?�}G1%��#��`�{�]`�(�p�����wi�G�Prj)�(��{y���2sKY@}�ݸ?��9�	9���tf�,��=D[ĔB��L�QY6����x��7Ŗ��$G�Òu(�9=?��)����R����F���.�
�N\M��G�Ӛ�ք�)W�����\���ZMLaQ}�����ɕ��E2��m�@#��I@o`M#�k.#w�l{θ/�e�j�xc�������d#�fm���9���	X�i�'�h�y}�U��� �%��hѺ�n �����Z�R��Gy�g^���>�!�OD�*��;�0�#HY{�x��Lf�0)���G���U=�
8���h�
�M��/��J|p@�W��[p�O�-��*�n5+b���Z�,zIH��{�O�.�[ATΆRp$f�ۯ��
l�UbD��E"l�f�?��J��
��i�ɭ��p;Kn�P�[��T��
@�a�`60�aE����7~5�^z*/���!h�Lp��(������g\׃ˑѝ��\bwn,6�\@�v��E���ښ���5�f�@��ˌ{nVr�_�W�3���W��D(8Q�v�e�U���[qU��XR��ޒfV|?U��"����8=mMӜ+�;����!ƀgyZ��;kT�%듅oR�k�{>8�快�=X�]G�X!/Rv4�`љq��7���VC�/j�P��:$�6�cZ��8e�#��uי��)��Վ��6���&�c�7E؛��ִmPN7��MFq����B���VI��Z�ժ�j�{���Q�+�����Up�ڭG��u�B�������h�]�˜�{�
�8]��Y�\^DN��V��=FK+�&/��=5+�j���.ҙkI˗��/;'tK�%�IQ%�V�Psq����:�7H���XJ�c�_�Ρ0w��c��ct[�,�.�To�N�{E�>�
�.NߊLJ"ϊ��N����N��o�T��4�2U�`d>)������q�����^�;z^|kNj2����.�r�x�ۅpl��.
|.�r���rA�
}.��E�Džn_����/�?����n��-����&��ezZ<����8:�-Z���<ݿfZPC�1[鵆?��8tv�V�4r�A��c�"��=W)�0�U�>�s��
�FHf�0�a �{X��_����gv�N�
.ه���+���w�X��a��`Y��h�q��8$!�]G��EͲ�5v�y���Ȱp�&�I�} � [��e�m�5���u�v[�_!��}�A�Q�ő����p�S�lW�&���A�D�F�|fO�A�6���Kލ6O��%��]��ٶA����dE�N�32rU'<���K���a@d%�����G�fDQ-�}b��®�5��цͥe;F�$BA���{�[��}�ҽ� {A�:7�KP#���o�df�T�`�+8�=.��?����-��o1rz��aA;��-f���U)�B����/2:Pa$���P�v>Hơ�8���X�跤�v1�ϥM��Iד,��_Z�����R���־q�b�'��݃�}v3���iŒ���\�z��|xt��R#4�)2�(�^�X_�c*`В����j�'+A*�t](*�#K/o�K���@7���/++V�R����[*V�e�d*�&/S�W���?l-�Z
Fm��٩�Uq@*�j���R��
�<ҙ��n�c�]�Wt�/_}i�+�Ue��P�aeŅ����j��i$%k��j�,L�e�2aV8�u�?��ӯ��V���-���e���z��J�t�67]u򸽕�PB�W+���-�G��q�wu�e˩f�6g���6e�E�
�%���θɎE�R�n��X�(�U0�P�t0�nT3`\p�y�|V�U}�ڋ��o�zNf�h�c�ȸ��'������H�4�S�Rs�:Kq̷�	h�tcی��!��dAަ�Jȩ�+�h�S �=�)�@�u����=ݷg_�Fk����ޥ��6���b�.3>�f�p��#���>r��	���,������o��b�Vq�`��j�*�����8�1�:�]˭���W�wa4�.�y=J2fN�D���%�W=6H݆I�hoj��E���`(�zd���t��n������e���C^����b����d�W��N?��Y�f�:�l�56h�мl0G{�Mx���O�i�<<�vU��#H:��PW�F�cibl��uU_/DZ�Zo���}��^�SKln�_����M��C�1�E����4��v�:���n��w§F�_L��P���SO�T��{�=�1�9�`��� u�;��Cﲧ��]t�ڇ/�fqH�8���L
;t&�k���%X���X����{��-1t�u�R
�F����R�C�e��C)_�ܼ�>�՞=5��v�q�UEO�mVn��q���~!۴h��n)iyt��fw�?��s�W��_wK�C�f��n�`~�3v��I9��u8~��Ъ�S/�����`�AZ1T�����n�X�7�X1�iSޝ��i��'AOo�@x�o��+ӛb5����2��xi��1�u���S�*	�4��9��҂)Ο2����(���R�&a0�9[�^:wZ��ŵ�h4���Ӻ�̇&j=����I`�6�7��j��q{	�P~�.��0g.o��v��O�A��8H��w�Xk@���y�l�'�)�Q�5_r�Bkt��P1��}��b�;���S�oJzi6���N�)빢D��zb��,�$��/�������KgH?�J�=;j����ϕ��Pr�����٧`���׎��
�;G�4�g�aM��5�*Gw	Er`�v�Nj�.�nB�q��f(���n�����;t��h!oH�i���
��p���6ԛ���� ^7)�
��rM�^��\���v�İ��\�\"4V�^t�O�q�y�7��s��Է�=4���3P��N�&���22�篤�TU���&�Q��G}/_*��uOh{ãn���)sp�~@���O
�V�o���.���Q8�lؘ�;1W���ew0�i�>Qh�Z�k����[�fgM�e\��t~�v�O���{�H��K�ѲF;?������O��T����H������M�9�\a���i�69�0('OQ%�_��:���}��u���
Ϊ�wj�U���Kh%[.��菄��w�'D-'U�@S7��|�;�m�X��hֈ�38=�g��v���Z�f@u��'�?��
=|���"�)b�e<|=�@\(t`����ka�[�g|ִE��d���G���*
��Z!t�3���7��u�Z��B���o~naJ(
�/I�ǎf�
gʮ�@H��;�&T��-�mV^&��=���W\l`Fk��(��cϔ�}nP����u��m�Q�z���r��a��BNjn$9�L%<��V���8�_�]���Cà����9��ް���*
�s(7	�Mɠ�,�g�z�=ĥxI������S:��r�����yK��M9��f�\����9T����^�w��x
"�;꾹<�zg��ˇ*u<,�H���qO1v��@��*�#t�s��?�Ö��fI��n��t����V�?�:��n���?FW�Z���b���H4I�*��r!X���8�o���Ni�Z�ı��P�|��a3���MkP�B+5����榚_bڥ!x�+���[�_�Z������e]\+ܸ+���;z1L�(�EpV_�`=�%W�����e�F��/?���٨���Y�d7a�F�¸Ϧ���F8̲i��\�Gd�n����^�V���ς~�<
�V����Qy��/���8f���8V*�U	�� u	�A{��y���H��o�����|�Ԭ��j�>h&M��-��2y&&l��3x`�J�[[�/lH5YH&����-��2�6�p�B�pr��AOX@�����1��n��?
�E볡�^w��\땉�q��@"��O��}�:`]G������}����f��d4��~�����r���?M#��m���x��K.�Yv����=#��A��32^���f�;ACSNД�J�G�1���d鉠&�i
� [:��Z(%�´�@C��ι]?	�QaL��x��l���`r�8J�8�f��r>�yX�Y�}*��*I77�,�
r�'�=�$�f�R�&��!�!����w����g��A�a��M��o���=FyOo�,�[�}_�J��!�`��
����x+
�E���>��8}	X
&dȗ9�zZ�u%��	��%`^>'[���Hz��!�f�l�h���>բ��r�u�e�U�q�Ғ#����pHu1ɚDV�vÒV�~��%S��E:6@��Ϸ/��\�M�/���*�De(z/���]}���Hzpq\��^����`[v��-6���?��`w�?�Z��j��^2^�L�0��c�(�P���y�~��6H��u%�>"=/������$LR���(�?�A�E�I��
�h���kβ\�Ƴ�z-fW %�x��K��#���$SD��)D;��@P*p���cV�!�)��O���(�j	j-���B�O}GE��U�ͅܥB���|s��`�{���đ,���O��$Y/?�1`����E���W;�F����j$���~���3=�������9k�U]]]]]]����	�8z��j�p������d����@(ᜎ�ͭ�(��I��jЮuӞ���2�M�g!2��t�a�#UE�?x����q�Ǩ����J����`ޔ��r���D���������X"�	E�x�ց�����
���LbE��9pr^۸p��ʛve4�};�4g�rbR�K>�YJɨ��B/a��)��A�X�4+D�!���G�Pak	cԪ2~��p���'���ă(�W>����
��C=����opa�<�$����Q�mg���?ye���
��T���m~+1�i��[��t��Q~���`1a��H�
�@=C���xL��1��x5*����V��ṕ�1Jt��
�T�]��׀<��]?~H�O�x��H���gV��\��mX�9	�J�������(V��#8�B�ŔޑqI��lx���=�j��Z�L��|Oӭ�����
�q�d�{|�����(%�ii��ݛSd}�h�,���
��W-���oi�����wO�^�;\.��Z���0x�>�#�����;%�-6�٦g4C�y�`�����܂\w4��Q�7�oԫ��|��F���:oԭuz� J��)6�
ި��ݭ��~�)m�6����V��6�-���Y�nl�ֳMi[@���z�Y�e��o��h��h��m��6;����6�!˔j���o�өe�SMP�Σ�no��q�j�$�:���Z�����%��l��g���	k���N�qZ�*u6�;u�Vv�zr^­ZP�ܪ�Y�^�MlZ���Սjg}�G�6�I���[����Y�E�UlRb��G�����UG�ؔ"z[�~����4%IJ��Fmcs=ۜ�H;~-���8'���vo����d����ZP��ls#u�׷�۽�Ls���۬�v��MI��M���w�,S���������$va��N�)	&���կ�{��MI�^����Hҳ����0$��F]K�f�؜�v��k}NE5G�����{��"~�$S�U|V����;U(��;Z�y���	c#Ӥ�@�^���MJ7[��Fg��qNb�v���j�9	��<�lݭL����k��mRb��F�_��lf��`�Ս��Z�F�9	&�ѫ�?�4%I�V���Q������~}���0ˤ�P�
����%'e��H���G�:R_b��Ĭ!m��~�r���Qڹہ���c�MG�ؤ��>Z�	��Q�4����|�]�4)AH;�j��}T�8)%#���v/ۤ��������ղMJ�}}g;��g��$�~P�[A5ۤ�,�^�m��62�I�o#���j~�II������ԳMJ���[�����l��w��ݫw:�&%�|����?�s�	1�}���u��?��CWX����;����,i=�d��v�����ø��Ŕ{��$R��$��N��ʆI#�.Yս��a���q,�Xg��a��<MF�b\YG �o�w�>�x�5���A�|�{�Q�Uџ�oU�/�������@@�����Z�܄��pK����G3
�\_�pA�e�����������tpy5c^�"i��V���=�v6	�kݫq8/A�`�s�!�V����Y��˝�A4�:s��g��b�zΧ݀�����Z���U���g�Q�S�k�%M4?�f�d~�k�,IQ��5jɺ���"l��]δV�
)�8d��)q��BY�w�OX$�"�h	�
��
��s�q/������i�2$ 0�ޜ��pXrҒH.ԝa=h��b�v�#`��\�
,7�hC��{%�E/�
Μ���q0���0Ꮤ�s1�t��D4��5·�Z�!�iݰN@Y��Y"��k���™�#Z�`@��������5� 7M�.�4�S9�)�ۘS^��r���3vv��i���oOO~n�h�`�߳��;<y�����u��>9z�8=c�/��q��]���,�?8��y*88~��x{�8;c'�����Q:��O�[��Y�5��޽����;>i�Ⱥ��NJ4h�;y��4N_�σ�ͣf�=����:Ʊ^����ۃ�V����){�����Y��^4���o/�0:��?����냣#{���_���9E�����Ϗ8M�E�q����q�Q)w��q؄?
������Z`JG���ü%A��w��72�����V����`�NN^���?7g{��䌐��Qʽ8h��`
�����Κ���q�qz��m�yr\���0@��ܓc�*�H���=v�8 ܗ�/���I�:@��[f5���9��ƫ����aKO��_�g�",U�+4iXX|�M���џ��h!Y�%;x�s��a�Ϛ�Le����9|B��q/�3�Mُ��ۯ���j���qҞ���i�ɼv��
dL��a�}QV�*��-�Wy���h֣�O�o7Q�29��L
���\�ܴ?��yО���ۃM~
n��?cM+2?�?
��'�>��o��EUb���:{�~�8 �A�Թ����:�r�Ԕ���#��kȧ�ΩX�#]t�Iq/���%��IfP��&���t0�T~6�-X�K4Q�,�ѐ݋*�
�e�q���C�z�VUixó&I�(�q׬?q���n⯽%�
��*���*���o�L�2�k�#\�h�z� N�~��ɦl�l'��,�\[V7h�?!�ߡ����j�$R� ڀ7�T��Qd
fP�����l"���la��_�#���JB�ލ?���De:��u�����`�-�t�U��<�ޜ��6�\P�5L�\�4ށl�MbZ/��P��E�N�b�5K홃
q�uN��:���0)�x7�v�����N�&�$�Z��*�Ζ�n(9wQ⥝��Kw0���g>��<*�8�mGr��+\�˞TUl��߯2̚YB������<�ުp�{���EVӢ�S��_𳻔[�Ag>o�O���*�1/�e&��#B����t�ݨ.�
�\ObաwQ��S�G�MfN�Ndê�H�V�=k��O�j�������]Q��{�yc�p��ږt��I��\��'��?c������u���.��ހ�A�."4�kkb��ȑt$]���N4r7!�.����g&f���������z	=���2D�ʆ�B�l�(��u����J���.ޅ�^�D'���N�?�@������4�Lf�E.g���hR���g�WG�jY�wW;:�b��_�Ըg��M�z��]Ch�]�/R�ĝ���,�zΔG:q#��p\��j�L�l*�f)7a,K��@'�S\u	��`�ѐć8p8��ݸd��
�9q��`�B/9����e�H��7A�;C��fw�ƺi�ʢw��quK���_�L�č�@P�~g��l������:9���҆����^�`�i��5C]AҘ܁��B��o��o?ҕ���sT���o
2rn|}����냗�&$��.|�R�j�ej���$;0��Hp��zy'P��Ļ�ܞ
�u�In9d
�c�]p�[D:z2���<�	�}wrC��d	�
�I����]�6�q¦��乞�?o�v /1yr���~����x�,�Y�߂�%ޔ!o3���3��t�z�q�x��Ð��}/�2�"�$�ۄ7�7�l���M8�EHL7��N�M[a���HL�Ĥ���/�蠎�!��.��kɗ,6)<���j+�Ǣu���xxY4��`Be���KIiD� BhH�Zò-�IԪ���T�,�
לx)��<�P�L�6�:³���9�ϔm†~�˦��C*kLdBZ�����~��F�{J6
1�,�<������Y��4g�0����'��w?b�blo?ф���C1� [u�%��к�?�a�o3���2Z}W,ł�b!��Fv$E�ێ�no<�<>{�҂�e��wל^{ߔ;j��9��)��ޝ�S��%��^�TM��QH��?�cG�e��Ɩ P���ɘ�?mO�E���}p���z/���Ӊhz�����d�{�l�]�ϑ��m}��
�m
���4��Jma[n��j5~n��7[g���-�Q�������q��]5�s��������j�8�i5~98=�>6�j4NOON��fZ���f���J���up�5�]X�آg��7o9�<�[�Z\X�%���0"ڒ���Z@���<�:�����o�/�8x4<�5��QxI������?�ӥ\.�6��~u���ΙYv��s�n{ځ�3o��0��%+J�ȽܷXX�*�J����L睛r���1X���Y��?6�76��3��������+���ύӳ��q���E�13G��cV۩��g�!vdz�i{\����?c44���}NK`rP��(����8� %��`�>�Nb&ƒK��&͆�ͱ�߯�A��|�`/Ys4�c@��|���a5����Oʼn���K|~s�?'��ě&�Ǽ0Y�j4��+�6XT��VN����5.N0�!�����Q���,�8�,������Cg�c�����p:��`9���f�}�&{����@����~?��*��y�\��x���K�K�_�^cиZ��@r� ��00!����̌�P�R�
���qp
�lN�,�\8�x�Ұ�8q�ޤX�E��;�½'"Bt���VY�qdj��G#��(+��_E����b�v;�j�;���u���W�
����`�HRw��<Үy�Hг��p��"��P����J��F*�L	i���X��J�:`t����R$�\R�7%�Wv=��Ee�|Q;���/1����t�0��R�G>
�}aj�(�\��4�����{�J�yW�@���g�ݎ"�gk�����o��.�%;��P�G�H�A%J+�.���%Y��jT�E���E�H���V0��#�9�]�a��z�BN'�p��x�x�>�}ȦX2��P��oUe,ŠE�u��ԄR˪�4IsP>/�myҏU�*��)Z�l�5ou�U
1�
�=��h��er��+ja��L�K
�4�a4K��ݯ�e�]���őyO��0Zf����x�i��8iy,Y��d�ŗ���	�����F�0�F`�؋���*�LD��/�&3��T�|���k��o����+L�`�uǦ��J�a��Ą�=��p·֯lҏ{1�OP{�	~�C�D�t{2"�V��iS�e�d&<�\�
#ҋe.<-ģ�&pp���Lrrak�t�I�a��=g�
�n׿�����R����iŕ\R���H˜>s
Y-�n�	?T~x�r���	F^l��S]%�4��${��CH-��t�C� 4����H�F�<E���"r������<|8��	Y$eBNI�N���2p����&&;�d9٘���}���Q[���m�5���usT��w7
�<d��\r�=�rw$�
?7�Լ��9^�v���>��a�?��Gݮ����2��⟆
n��p11~�ǖg����b�'�>e�6�@�+��P�����=��v�J��L�f���`2�5���u�~�'�`=�v��:Y$�s��[$�8�K��k⩤��x[a5���S� #z���̌Ԥ0��ϔ�=8�QJP"��Z�����_���Vxߕ�����jG�������	+�\���m껢-]�*�
HE��:�]�1m�����ρ<�2�dz�Ƃ`�@2�֦�h
7nE���f�G���F�%SGm�j�5��]Ԅ�	��x�i�2��S9݅����6�O�����(@�k�&��q�P�r�X�}��V�z�i�7����UW������$M��o,�r���{��@�\u9�P����p"O�/�a^���o�B�����7�K�"�J�Kͦ��t��c��TY�;mL�����WD��F���m(ZpZb�k	�4����S���A�ܚ�J��H�
�$&h4{;�R��il[�@Ip�ʪN���"�zd7�}��Dfmr5"k�z�n�?GĄ�ư��{ա�� a$by!%�2���9�V5�W��h�צ\�ۨn(ֵ�y�*�����
*��I����ˮ����|�oꇯO��Ž6w�>!�[�5�ن�c����a�6�M���V@�X�䥐\��f�Ν���T-��]�-h��㘍�1�S�i�o[�b#�/G�c�b�����
��c��͌�0O��x�o���Z���ʹ�Ax��q@&7>9�+�`~|�?0&�)�
���ܳ�y��q��Q9v9�����A�`bǤ�f"�:��M29$4�h��� �R�5~� ��Ko�Ŭ�c����a�!C�?n��"��I�m�#z�<��IX&5C#��tc���u��l��E1�{�÷��n��Z���^�Oޥ��)	R/��$�K��g�L`v%2z.@�4*&t
q.�F�}oy����ߎD/�l�$/�`>�X��Ȣ�
V��K�\k�G�jZ�mz#�_��dJB��ۅڶ�p6��ƶ%[ėdF��-�:/��f�d�8�����I����.{�s���)+|O��S�;�9�U�bU Ǭ���А9�dwEu
z
&�m�w��Hc�"���Z�r�,�xۇw@�����'������
ʙ��n�P��z��~�^�1��Ë���v�p��0�t��%"��g�u4HRYq��@7p�a� ���R,����z�q쉾3�^6�m�
�'r��+GB\�,)�j���ǿ���
�d�øp��I����Mצ�{=��g*ֵ�	�he�u4mr�}�"ri��]�����"�K~�꥔�8������^�S�>m
��O��O�u��k_�p	!ZN�A`��즁w��7�~	vY8	�"A����Q�5O��0vnW���E�)����t.��t��Ntt�D8&]�Z!�������t�����\�)�j�]�U�|�J�K�G�g��X����g�(��Ex:�"M�<މ4��L��̸�Q�5p���S�@Ř8�Q����MQhC���-��E�!�e?D�y���#q����,�8f��2������=�@�Є@�0,�"���C!|��9�0%�@{�.��J�k<�:�t$��
H9��KB��v�����+�[p�@����0��|��p���GoE���qD9�S�/S�;�h(�Ϯ�<����#V�=��T]��w@� b) au�N[��6��|�z��5�o��V�+��\�m+�6����[���߾�+�pZ4D��*|c�u�E�.�6`�m�����R|��$�F���Q$�V��q�}��r�l5J�'߶�^�6^ �+�jʲ��ڧ�/�G�wE�K�T�\�鮈r�H��i��8lf�}N��	���&M�jv�����X��y	�o�ˑ����r08��'fo���ҝ'��p(C%%Nu�[��}ʪl��R��F؏+��Sn�gft]��k��l�%��.�����y�����gXg�4+FPd��Q�_��J���|vj��љ���=ɢ���l�����7���S��聁���{U�m��AA��#Z��+'��
������4���+�j�.	H���@�]�ٻ����q�i��13^MY&	U>���tt>u���׌A"��q-JC歟X����\�Bŧ��L�Ψ��^��$9mTmTaR�IJ��カ H1�����'Dr��v�*��^�
e�����9W)���Z�Z�d��3�G�cJQ���$��Ȥxvp|��lC��O�7֮��ĒT�qs�;g�4��ʱ1c�5������[_=����8�1z�˶)݋�B�8�D�P��rL�+��Ė�zl��p�/�xR�Dl��`�f���4i�q������(���ɘ�˟(^ ��x�-N7H�튊5~<2t�"�^�����V�V���Z�&Ղ�Vt�.���L��I�Mz�ݕ8������؆շCg��~���a8F��H\����ڣ�qb�LxuM��✱��sQ�M�\���3�����ۼ.!�
�͚��g�Obgi�����:M'7����&�t��i43�Z�Ӹ���qH��"^�9*��ض�����b�L���ã'D�"��6�F���Y���U��XT�vL���aK�
�fET{��
7�mׅ���hZt<-z�XxP]�1�NI�	k]�O���)W{K�9�G�
YѾ�"5'���5
�^w$�~3��4�B>��y�}�4�x���.IH�M�P��>��4�u�Q�҇\��A��f7�m݌����n7/�?��z�:�4����Un���d-#���pImߛ����CK�
�`�m�F�1*w��b��\�%f��&�K����W*g\9�l��s���a���U0
�޷U�YR�>-��K2
��)�v�(0�tG�߷�+����>�+@����~4�,���s�$rβFU�ٺ�-���uй�/��)�Kf
��ElQv#e-��9N�1����)��r��ѐ�ii�ς��h=7������A>y�?�~^�[o����"��p@eIq3��&��l������Sd(��(_Lꀝ�C�vؐ��N;>�O��>�y���R?`w��D�XJ�������EM]�V��ۗͣ��j�z����M�ɑ�ƶ��O��s6��p[�п�-ow'7����&�X�{8^�Ā��9��(]c[@�y�}��� �c�%$I���x0�k�<&}��Q�EB���i����y�32�I䚳�3�H���SeIJڳU^���n�8m�-���G��9��u�p׸ݨ�s�C�h��	%�R��3�PkAC�����f��Z|�,zp�S��䤵��i�*M8r/Q,��U��fϰ#���?����Hw:�R�c":h���R�(���ͰVf!���;������I�:|^P��Y�ӯ�ί���G�('嵺oy
�>�u����/(�5g�pHե?�����B�֘ϸ���X/�7�iн��H��
�[!^��ޏVk�Z>Ӳ�3����V㗃��&��a�0��|V�v0�˃�����FJ��l�?|լ��u�p�="���^>���ݮnZ��iE#�ww�G��A��A
����t
�o8n�x����GS!�6��?�2αz���+Ѐ��N��6Y�9�����m�z�%�k�֭zO��]�T_ⷱٸK{Js<��_��?��Ja>���ᇦ��Fd�Zѯ,��͘,�N�el׷�����"svQ�V��6�\6����U��_�қ�ݩj�?t��k?[-�O�s����3�c��r�q���S�pP� �	ɵP9�?��v����8}L�Ir�xt���y!�Rr�o�������5|��ݫ��5��ߙ�O�چTI���H:T���n���/�
O5��@�x�U��,
���oh��0ͦ�G�F���e�B	Q��C���$!Y�d%�6�4g�7�T\��+�Z��Š�p��}�BL�J'Ը����-
s9Ԉ�����iu���(M�Lm�1#%�;"����G7:�
)��XL�rhM�OZim�{�0�0U�g�]�[��(�
H�k(����
6GI
�ؐ͸�/L�;p���H�g�2
��0��l�#^hJB7[NQV���ZeTQDҠ���WF]#t���X��Z۪��������g�{�vw)ua�%3�2�h����iGeJ+��~���kD0�T"���bs����o=&j׫���jm�^�{AD!4D�F�%�v˂ϳ`L���%��ft󱀊]fW��(��/A��|/e>p4��c|w�f`T�i/���G�9�S�T��u�Vн���rD�9��T�G�8a���l�#�?��e�����zW��d�R���.'jWxu���2��!^汝^^	�+8���S�҃oP͑>��	�3����3�fڱ
����1�T�L���[?*�p۾���M��W._9�c��n�D}����"O�Q�
��?�)�8FƟ�}{:�a�9��
�+�y6���������=~�2{�p���),�?��uaJ��:�[džU��F�������\����9�V�W�Ѵ2�����
n�\�W�@����מ�O�]T��C!׶��P��f�+����6Z����3|6)�S<Z�v���m��W��
�eŐ���l�P���;=h����a�>�	�蚋��0	8�"�^arU�P��%Z�fUZ~�N�343CC�q����]&o�
6.᪂|�R+��?h?�U�;�*U�;+���ښ������%u�*
��	_����z
Yy��Q0���;F��I���ܽ�]Yv��4i|�O��Z��[���_��q�K:+�r9zG`�a/8�r"�;���P���{�F��{�v8��,g�{�r���IR{�ž�e��=(C�`*�d���=a�A��=�K��Ro�\7A(�9����d�*�A(�wB�8@�q/�)�2�q��d:�2oNaDk��S��6��M��n�!RH��y���D��WYX��X:���D���(�M\B-�l,�	�H��a����^,1Ѱd`�Z��3���tCFdy '��;�IfE�\�bq��=rF��$^,I wO�>j�"�6x�p��(�����~�~����R^}Z�PY����r��6w�=��ԐkN��=�����`@�lȮ�xO؍�=�Q�*+�[*̀�wQ���d��l�*�]�� ��pB��e����aQ�'۬�=��}�5��u�ɷ2����E�/����_��+�ɻ�9�B�O���Y��[���:�����ZI9�qb�tpy5c^���0�5��M��i��G���4���#`)�v�g�4(C���uA��S䷬�$>��p1\6�bSa�;�=Ĝa����;v���Q�ar�){����<�hЅKw���^������*4��T�B�2muy���"p��'�Zy���������ܧ4SҔ%g�{b,�v��Ҕ�#�!p��*�'}~ܓv�|~���޲w'�4x�ޠ���GO�q|�&����_�$����4��P�㡤���M�Ls�
�/[�Oj�w	o*��g\��X�@�^Y��j� W�(�(�´S0�G�-�k�Tz�p:�O�b[L�@Ѯ�zQG�S�:H~!�������J��\R)�����?�8����H
yjG�prqQЛv���/�3��R�����#�0q	���h�qP�؎Dm|��h|3��ŏ˜�gj�_�s	a�m��\ӑ��*�m�\k��]{�d�Q5&U�a%Z�ϧL�qeS�l*~>�@�Mō�cpS�/Ï�	��?�U&�d�PV�dCLv���X�2r�/__ـk�o���#�B(��bߍ0�SO�N	e�Q[�ί1�><t?��R���8dzB�!B��V�`�ۼݷ��yXn>�GW��
���IM�Q+���*�Ȕ����1�p01���a��*�#i
�`Q�o�� ���MQ��@�Z32Ef>�
���k&�r�=˴w�݀��3�z*��1LZ�
pP*-��b\�;��`,�p��������o�*����`֫T3�3��_)��aB�:�������$'�g����sq���!�8n����܇s9����!��|�G����{P-�J�$_�|:��J�OVȗ�z�sF#��u䚝 �;�2�1Ði�"b'��
�D���T��GI�����S�H�
���s��A�2	$lTT�� *ޙ}$uͣH=�Ox�~Bޯ�`�u���.J~��P
����'4��h��U�(��F��!�9@	%*.\�ga{��cU�y�ͲY�ox%*6ˌ�Ǖ/4�m��ހ����E���A��x*��qrm��q�0�m�e��W� W}\Z�q0ԡ�@/��^t�}�'A$��R�	�����¶�~FO��Vy='c�vh��a�s�pq�T�y� E�p���S 6^�4+ExN�S%��$�T�b#�hHU�5FX��B
-/�����{#)�Ee勠��|*�24�Pl�߇���]˺:|s�axa!>��Yz��4ΘM��˷�[0��t��A�������B��L�.G�W�p���4�>O�����3�R�����@�,���vsz�)��4hç�-� ]ag�~e��5�XCs�5���WPՈ���nX�%<
3����dq^��S�Ѷ�l�����t�$o��UG슨�D�-T-+
NW���D;����GK/T�ǰ�x��'o��c�/_�/qK����R��QT����p1�M�xy�wAJ�(tU&*s
s�0�A���ѽk\Z�XO1A�@�e�>�/@iA>�K���
��~�j��n��~6�k��p+��i�0��N.�T%�v.	e�ʏq?`�33�s��JHnz(���C�)߹=�
fDjP�f4Q&JV�K���@�a��}�d��ES��j�G���iУ`+ic#B�-je�ؑi�F7��c5�0��0��1�5d������J� 
X��@
؎T��U��C|�:�K	�`Ή��cfd�۝G%n��mtm�Jy���O搎��h�|'�z������6Ϥ��w@�7
Cu���C�]8�4�I�#�NT,,R�.��.���яT7c�O�#�Q8Q*���ܧT���)6
|�QH]�d9MB�Y���M����*EZcT�i��P'G�`d-���3��7V�*�c��w�q �
߭��eK��[�_d��1�> ~�C=��l
`�n��2i�a
��€vbn)U'�H�/rR��7l7�:3�j��p6��ݏphZ�5W��
j����S_���,I%�\)��7����Qa�zA��_#xdÛp�򘶃@��������q���ψ	��VԉS�pp�<8k��sXN^�ֈ����	��_UϮ�R�P�-�'�Qi���r
�d`T�8-�V�%p�L��\��S:�)�ĺ)�Cڇ_�n�YKB./��L;�*TGO��UE�+�
9�Y�������щ`
�����D-b��V��YW-�ذ��L\�J��j儂����\M)HX�8(�~QO��	��vi>�Y�!�R�f��P���_�cq�šW>��y+_�Kb�u�����m�{���W�ŧ~��<d�(��]���Z|�3�/�м��]����������z,����C��F���k���=xo8�S�~6?/�8���*=��y���|_�3�!�oʗ�ػ�0�1~J2��u��3a�HL�?��h�O��OYğ��e���*0���ws|V�ws%����h�������U0��Lc
 �(*�b~m
ȋ�����Ą
��j�V�t*�!Y�BV��|�'�.Z�˗�u�a����h���Ⱦ�̓�sX�b�e`,@�%�ƿ��,u' �Q�!RI����ʿ,�����c���9��f"qX�@�Br�鋘��l���}��,bJO�S�񂈘0B�9��oq�z��{�Ѥ��J���6 o��-�3��1�`�M.O�5ױ&�b�aM�˄f�� �4d%WD��ǃ�~zP��O��|��lM�j���O�I�څ���-&�Y�3GR�Ma��|ȗ�g!TS-�C�w9��P󆅻�	�t�,,Şb17�(.��9��
ײ/��m1N��0������uK�4b�e���������
~Wl�}����%G��i�rnė�g�^�]c�5���hM04T�K�k�$z4���c�@�$�D��X�G�%�N:���Ӡ'����yHL&9(G,�d�'m:�K�'�R�C�2��e�0	�%��[}.��j�95�[���E͋��
_��r& ��DK4ԣ��}��VNK5�*�AK�L�U6��Ū�B
ІG������걬�9Z���n3��ڡ��^�غkM�`��D�&�ܩ�_tc��+fN�ْW5�6u���R�����Ću�y��,���V�?�#�
�p�+�� ��
��K -��m\��I>`�pEܷ��Y�V��|�=&�bU{��!Q�T�D�Y����P�p.=:��x�ۮI��8���.R��)�p�CAe�=J�
G�'pt����Oo8U�3�	��l�y��x�M��Z�o�t��?s�h�3�
e�へpxH��!�{8�1}��(�xQ����H��G�jO<�_b��ǩ(�Y��a�: ��|H�0��R*c\E������+Q�6�
,qi��(^��<T�N�Y!b�0d~g��ò9���.0����t�R|���x�v�K���PO�Ui$�D(���rt5���w�EEP��L���
5}m|��-�{�M�-�y�\����Sb1z�r$R�,�r)#�3j��r{a�#�ևU��lKB�t8�m��(��J��N�;���b���9�ԥ��f?�a�j�l�1iV�B�A�j!��Tܸ����[Z���C�8�<c�A���r!�@�`b+Nfy�t�:ᣒh-̼LzN�P�V,��5�XK�52�$��l�Zl��t$���!�٦ߧ1�2��8��G���ˋ�]�#�ᓄ��>Sz0 5�����sB�N@'V�r��.%�oͮ�Wp��E�8�W�9�*O��1���A��L��oL2m+ĺ4��noo2&�IN �Z��I��p��|u^��mo��w8�`%��D�O��HB 
���kg���l��Xd�ޓu�F�6��I���O=�bl7dr���7�x�i���#�A����B"h=�D
ओ1_F�O.1����+�6�0�y��JS�]=��A�
~|d[vQ~>Hr$�]��|9���$�,���u��"���b�� ��N���@��h�Ǜ���1�0��01Q���Y�"�PLln(Z���O�c��sd*�E�/��ȟ|��e>z�MЬ�V�t[��c.��Bk+�ì�X�dK�2*�,���>�PX8�����"j���ezC��b���v����Ī�Iڽ��98n�l���"W
#>\l���=�G�s��ȸs�Eڎ/$2��r8q���yb���i��-�x�2+����g�������i�X9�4fEM��(��r�XX�f�gC�ݲS/Gp�I��#�?��i0�D�z
��3z�로ݥR
h�bqi?���3-L��VX�!��(@�qE�.��ܲ���1�d�?ր�Ј|�>c�]�ӏ�Ek0f�p��^�(T���=̧�6��51P��u����Uj�G��c�yAc&&�O��7緇D�W4���s1��
kOT�l���(M4���,�τ�R}l�c���А�lc��E�ϩ)9h��ަ}�HŘ��j�O��1Ҁ0��w�Bk�-��qZᄲD7�j�,�Lѯ��^�(��j�����!S
�U���'4^㖁�d�)���I�;)�D�ui+DŽ/�N�%z��?��Mm�
���Z�CG2���j� �6a��-2�}�Z�I����;.F-�1+a��ǔz�EĠ�5�a�y�<���,c�g�ؑ=��-o��3���Vv�ϡe� �a���)���q�Q�Pؑ��O�ŒLͩt�i>�f�$�b�f+mg��(z�yV]��$f���e$QP�]ь��������
�Nb-	wl�}S��0-�um!�vk<8}�s܃M�d��h�G6��2?���ʑc̥Q�x��q2
r,��
q͑��(+,]��.',�������W��%)��
6C.�na���
몈��聹��1�)�e��EiI��'2�]~�1H��_&N���vj�a�$o��0�����A##!��"�����sʆ��+e��k�m"z�J�/�Y��ͮG_�i�D��+M�&��9oTק=���[S5�Y�ED����e%Y^t��=%��0c �6�+�|�yi�}�a�j���J�r��
 ��((rR�����v�d�_k���<�yǥ�Bi����.��e��Pq��!L[�Ր�E�B\u6Tj1��q­@���Ɨ��m�S���|� ����އ��Tx�9
�.Z,@��m�`$OM����h��#ѯ��fI�ׁ����j�&J5S&��Z������=��5x��<��jrP�H��s##��|�9� ��9c�+Q��|�-�4�	�Q�/\!���O��ʊs�:5@��v��j����_ɀ�{����hp�K����3�[Ӥ�mȎ�?�f 5A�D���,��ABO�S�Z,S(�r4t|L���у�P,<)�,�q�
>��G=�Yk�����A
�r<��\֤��;��3�.��Qt���r׏��qآ1k'b���'v��N�q7pq8����6�H����:��:���ʼn���K#�Uٕv����'��iiJ�X��K�{[ �K��	 }��rP[\t�|U�~�.2�����jIV�:_a��?�Ǽ��p�kk�||�q)�⊤L�L١%b!�D��B�<9�����k8F�0҃�#"M>�>o���wT1j�M�Mkpm^I•�x�+nR����v�=��>o=8kE����OZ7���7
\�B���4�-���p�����Te���]��T�-V�[�F����;2!��A��06� ���{�8q�0u��։�$����4zr��!�J�hT�E����r1��Z}#b&oѤ^Yݛ���?��]���z�'@�@�2� ���R��7-�o^[6�����fQ{�K�}S�S8\�ǒ�I,ɆR�C�Lj�����Jj`���C�-X'�Y.9�9IOb;ơ�5l���:����%��o$�۸.����t���苳`����K���fV�[f�iL�dCi�/5x�,��"�2�+i�y��㳖��cxy. ��C
�l��F/j����S@����]��B�C�a�8���[�G��HL\�W�ۧ��0E�����<"c��`��S��{�%��1k���f�>�D$�q;�F�5���V�
η0@����D�؍[Qo��ig+��ai�x�H{�����mw�AS�������'fC�#+	
a<��&鼢I���y�{�0�G���ȍ�o#���I��٧�eB��1�X�zi��(#�me�o�]dKLc��\B8~1q��&»�k��8�L	����H�ؤ�!_���6ٙՅ����X*��5a��TJ[bC�8g���w�hj#��c��'�@���ʃϓ3�D<n� "K�c����b�%�@=���b������,A?���eRЁ��%���%�&,�b3�{��$of������솷�0�O:D.G(+�:Տs[a�Vh�=����"�A�`
R���L+����,J �B�9F@\�^�Њ^Ҋ�%1�7��J�+S��yF�a4����Ć�?��L��sB�:\$��0�W��B!EC'F���
�~���kt �K��.5���%�TvR"
���d��E���Ş���֤:�:�v�pб�bʐ9������n�z�7���T�-�IyQd5�@�_�h*�r��4�6AKg��o�#��CQ���*7�`�K�
�rE�`$-��x�^�%�����+��ԥ�<�:™_�~�z�m]�yWl��ӌ�
�;���us�4~��o)�Z�vc$O<d)�'�(�iq�EC8�9.�Ѵ�o!a��%f���K�*z��ͥ�^l��T�e$^v��F������8'�4fz�f<I��Wje�����Ly���Cu(�3)�㿁���m"��|��xt�Y�^���ͧA.��Z�@�x���~�d�*x�s�ZA�Ee�R�6�m\tܦHe�2ܾTfQ�jI�82�����0���7��'֐��V��ĄN@��8���L���gA'�ȸ�"H����A�\#Oy	�(�ǭe);�‚���٦Ȟ.��~,�Sl4,�5�%���e�՝$�W�%WW���1o/�b�t9����U�R-�C���5�C����bR��n���x��)j�w�;��]��v�9�p�ƚ3�lo70J�wY���b�c#Z�s�	�(S&�x�j�w�
��k� j�z�l+hX��+�;i�H����ƛar�G�xC-����kł����uEyQ���8iN|hV�g�h���ě藯�q�k¿�ېǒ�+�e0���{i��:�?�-ј(��#�#K:�Љ�Z'n�@�}�x��.Vw�Vt1�K�L�q��D�����S��K�"*3"d��V.�I�$i!���Wv�2�7e�a�f�	�V�3���rj�n�DL��
�ez��������+a���ϩ���T���8�ҩ%�[%�IDm�WbN�bi1ӷXZ�ds�Hۙ�~p�p�`�+��F=��S�Q�-�2��d�Q�,�O57��9�y�����H�w�����k�*�C1-&�l`}�6jl���W�cP/h��!�h�}
Sc�,�H_l:u��ޤ�uM+�:(�nlG�B�`�V'I�p#H�YN����[Ğ���_&��non��bK�(P���5�F���H��S1U����J;��C�K�o@�C+��7B�~�n.��_w_�9;���g��l��McN�p>�*z% �ĥ_��s2
>
�9�8�g�2�r(M����Ȏ�}" ��_"L�Qx��`�7b6�#����/q�A�����CEPX�a��ۈJф�دAw�p�o�j��=�em ���6��r.��E�c�b��e�D21�蝉0)�m��x�����S�.�j��*+�B2=)�О���Mp�S�>��P��ƅ�k$#h#DL츇y�;!+�p��—�zHn�L{�g7]a�A�c"ۄ_`�Ƣ`�O�Z�\���@G���8�e44��w�?�Q'(����m�'���+�&����Wg���K�o���8
ڽ`2�C�����0�0�,����õU��a����~��;�G���?�)p�U��~e�P�?{��Ƭ�
_��l�� z=��R��쫾̓MAl�aP�|5�!b����O4U_�Ϣ ��H6���@�-��d��Wq����f*h@�?�$�Y��{�ӄJ�bXէ�w��a���Jo�|BQ�Xj���,�����i�U�:�D��i�P�����aE~X�ʫV�\ҏA������y�����V>�^TP��^}5`=�^]�[�ၯ��`t�Ɏ��V��y��g���|ۋ��H�xޤ��i��
=�Q��A$�q
��.�����Ҏ��1I�;�p�$��X�E�`PGp���$n��[��?F�o<A���pW�b��k��4�8�S����dQ�-�ޛh-H�E-�w���{0���T@�S4�.�QA�>я�u2�?n%�xs\Iy)u�x��ょ�!���bO)JaU���"�*W�94��,���%�&���R�%�������Bѹ���ʂ'a�BĞ�s1To����J\��{�h��g���$U��Iʰ�M�+�Q�L.	�
*��y<c-oU�n��i��kc*0f�bf�"3U�]y�0�8�L�B��*�P$򩰛w1W0��(������L#����1���@
L	�D����A>r���6�!Q�
,����0�B��yF���էp�V�~��xa��ي�=��f*��<�������h�K�0	m�=k��M9��"(r���J�������^Օ	�ż#l1���l�)��d�������`��/�P���,u�bdG�,�'�K*��ӹ�2�%T!)��]�� �Z�A�����nS@!A{�
��'��R�*��Ԓa!�y,����w�Rn�D��!I�P�0F��eᦲ8�p��� ��=fg"Z	����G?	�7�H���V�.y��I^�.E�v��ӂX+B�ӝ���c�Yl��Rkzc]酣�l���M�KD� �����׿������������Dchecksums.yaml.gz0000444000000000000000000000045014554466355014624 0ustar00wheelwheel00000000000000��l�ee�;�@D�9�\`P���fd��	����l�3����z=���,���g���_~��x�v�Ў��8�W��mXt,�k4
�^:�Vv�q�Cċ/��_����CP�zV0lɑ�,�b	q�	�8<��kps�_O���� �`ە4�i�c�U��׍[xv��A�$Q`ͳ��C�(�9�t �*�pwL�IZIe�٢n�z5���?��\7l�3Z6 s[!�5S{��q��W2�Y̕rms>���
\��Ԍ
�:KʒI1�N�b��s�m����PK}$[��S��rubygems/rubygems.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require "rbconfig"

module Gem
  VERSION = "3.3.27".freeze
end

# Must be first since it unloads the prelude from 1.9.2
require_relative "rubygems/compatibility"

require_relative "rubygems/defaults"
require_relative "rubygems/deprecate"
require_relative "rubygems/errors"

##
# RubyGems is the Ruby standard for publishing and managing third party
# libraries.
#
# For user documentation, see:
#
# * <tt>gem help</tt> and <tt>gem help [command]</tt>
# * {RubyGems User Guide}[https://guides.rubygems.org/]
# * {Frequently Asked Questions}[https://guides.rubygems.org/faqs]
#
# For gem developer documentation see:
#
# * {Creating Gems}[https://guides.rubygems.org/make-your-own-gem]
# * Gem::Specification
# * Gem::Version for version dependency notes
#
# Further RubyGems documentation can be found at:
#
# * {RubyGems Guides}[https://guides.rubygems.org]
# * {RubyGems API}[https://www.rubydoc.info/github/rubygems/rubygems] (also available from
#   <tt>gem server</tt>)
#
# == RubyGems Plugins
#
# RubyGems will load plugins in the latest version of each installed gem or
# $LOAD_PATH.  Plugins must be named 'rubygems_plugin' (.rb, .so, etc) and
# placed at the root of your gem's #require_path.  Plugins are installed at a
# special location and loaded on boot.
#
# For an example plugin, see the {Graph gem}[https://github.com/seattlerb/graph]
# which adds a <tt>gem graph</tt> command.
#
# == RubyGems Defaults, Packaging
#
# RubyGems defaults are stored in lib/rubygems/defaults.rb.  If you're packaging
# RubyGems or implementing Ruby you can change RubyGems' defaults.
#
# For RubyGems packagers, provide lib/rubygems/defaults/operating_system.rb
# and override any defaults from lib/rubygems/defaults.rb.
#
# For Ruby implementers, provide lib/rubygems/defaults/#{RUBY_ENGINE}.rb and
# override any defaults from lib/rubygems/defaults.rb.
#
# If you need RubyGems to perform extra work on install or uninstall, your
# defaults override file can set pre/post install and uninstall hooks.
# See Gem::pre_install, Gem::pre_uninstall, Gem::post_install,
# Gem::post_uninstall.
#
# == Bugs
#
# You can submit bugs to the
# {RubyGems bug tracker}[https://github.com/rubygems/rubygems/issues]
# on GitHub
#
# == Credits
#
# RubyGems is currently maintained by Eric Hodel.
#
# RubyGems was originally developed at RubyConf 2003 by:
#
# * Rich Kilmer  -- rich(at)infoether.com
# * Chad Fowler  -- chad(at)chadfowler.com
# * David Black  -- dblack(at)wobblini.net
# * Paul Brannan -- paul(at)atdesk.com
# * Jim Weirich   -- jim(at)weirichhouse.org
#
# Contributors:
#
# * Gavin Sinclair     -- gsinclair(at)soyabean.com.au
# * George Marrows     -- george.marrows(at)ntlworld.com
# * Dick Davies        -- rasputnik(at)hellooperator.net
# * Mauricio Fernandez -- batsman.geo(at)yahoo.com
# * Simon Strandgaard  -- neoneye(at)adslhome.dk
# * Dave Glasser       -- glasser(at)mit.edu
# * Paul Duncan        -- pabs(at)pablotron.org
# * Ville Aine         -- vaine(at)cs.helsinki.fi
# * Eric Hodel         -- drbrain(at)segment7.net
# * Daniel Berger      -- djberg96(at)gmail.com
# * Phil Hagelberg     -- technomancy(at)gmail.com
# * Ryan Davis         -- ryand-ruby(at)zenspider.com
# * Evan Phoenix       -- evan(at)fallingsnow.net
# * Steve Klabnik      -- steve(at)steveklabnik.com
#
# (If your name is missing, PLEASE let us know!)
#
# == License
#
# See {LICENSE.txt}[rdoc-ref:lib/rubygems/LICENSE.txt] for permissions.
#
# Thanks!
#
# -The RubyGems Team

module Gem
  RUBYGEMS_DIR = __dir__

  # Taint support is deprecated in Ruby 2.7.
  # This allows switching ".untaint" to ".tap(&Gem::UNTAINT)",
  # to avoid deprecation warnings in Ruby 2.7.
  UNTAINT = RUBY_VERSION < "2.7" ? :untaint.to_sym : proc {}

  # When https://bugs.ruby-lang.org/issues/17259 is available, there is no need to override Kernel#warn
  KERNEL_WARN_IGNORES_INTERNAL_ENTRIES = RUBY_ENGINE == "truffleruby" ||
                                         (RUBY_ENGINE == "ruby" && RUBY_VERSION >= "3.0")

  ##
  # An Array of Regexps that match windows Ruby platforms.

  WIN_PATTERNS = [
    /bccwin/i,
    /cygwin/i,
    /djgpp/i,
    /mingw/i,
    /mswin/i,
    /wince/i,
  ].freeze

  GEM_DEP_FILES = %w[
    gem.deps.rb
    gems.rb
    Gemfile
    Isolate
  ].freeze

  ##
  # Subdirectories in a gem repository

  REPOSITORY_SUBDIRECTORIES = %w[
    build_info
    cache
    doc
    extensions
    gems
    plugins
    specifications
  ].freeze

  ##
  # Subdirectories in a gem repository for default gems

  REPOSITORY_DEFAULT_GEM_SUBDIRECTORIES = %w[
    gems
    specifications/default
  ].freeze

  @@win_platform = nil

  @configuration = nil
  @gemdeps = nil
  @loaded_specs = {}
  LOADED_SPECS_MUTEX = Thread::Mutex.new
  @path_to_default_spec_map = {}
  @platforms = []
  @ruby = nil
  @ruby_api_version = nil
  @sources = nil

  @post_build_hooks     ||= []
  @post_install_hooks   ||= []
  @post_uninstall_hooks ||= []
  @pre_uninstall_hooks  ||= []
  @pre_install_hooks    ||= []
  @pre_reset_hooks      ||= []
  @post_reset_hooks     ||= []

  @default_source_date_epoch = nil

  ##
  # Try to activate a gem containing +path+. Returns true if
  # activation succeeded or wasn't needed because it was already
  # activated. Returns false if it can't find the path in a gem.

  def self.try_activate(path)
    # finds the _latest_ version... regardless of loaded specs and their deps
    # if another gem had a requirement that would mean we shouldn't
    # activate the latest version, then either it would already be activated
    # or if it was ambiguous (and thus unresolved) the code in our custom
    # require will try to activate the more specific version.

    spec = Gem::Specification.find_by_path path
    return false unless spec
    return true if spec.activated?

    begin
      spec.activate
    rescue Gem::LoadError => e # this could fail due to gem dep collisions, go lax
      spec_by_name = Gem::Specification.find_by_name(spec.name)
      if spec_by_name.nil?
        raise e
      else
        spec_by_name.activate
      end
    end

    return true
  end

  def self.needs
    rs = Gem::RequestSet.new

    yield rs

    finish_resolve rs
  end

  def self.finish_resolve(request_set=Gem::RequestSet.new)
    request_set.import Gem::Specification.unresolved_deps.values
    request_set.import Gem.loaded_specs.values.map {|s| Gem::Dependency.new(s.name, s.version) }

    request_set.resolve_current.each do |s|
      s.full_spec.activate
    end
  end

  ##
  # Find the full path to the executable for gem +name+.  If the +exec_name+
  # is not given, an exception will be raised, otherwise the
  # specified executable's path is returned.  +requirements+ allows
  # you to specify specific gem versions.

  def self.bin_path(name, exec_name = nil, *requirements)
    requirements = Gem::Requirement.default if
      requirements.empty?

    find_spec_for_exe(name, exec_name, requirements).bin_file exec_name
  end

  def self.find_spec_for_exe(name, exec_name, requirements)
    raise ArgumentError, "you must supply exec_name" unless exec_name

    dep = Gem::Dependency.new name, requirements

    loaded = Gem.loaded_specs[name]

    return loaded if loaded && dep.matches_spec?(loaded)

    specs = dep.matching_specs(true)

    specs = specs.find_all do |spec|
      spec.executables.include? exec_name
    end if exec_name

    unless spec = specs.first
      msg = "can't find gem #{dep} with executable #{exec_name}"
      raise Gem::GemNotFoundException, msg
    end

    spec
  end
  private_class_method :find_spec_for_exe

  ##
  # Find the full path to the executable for gem +name+.  If the +exec_name+
  # is not given, an exception will be raised, otherwise the
  # specified executable's path is returned.  +requirements+ allows
  # you to specify specific gem versions.
  #
  # A side effect of this method is that it will activate the gem that
  # contains the executable.
  #
  # This method should *only* be used in bin stub files.

  def self.activate_bin_path(name, exec_name = nil, *requirements) # :nodoc:
    spec = find_spec_for_exe name, exec_name, requirements
    Gem::LOADED_SPECS_MUTEX.synchronize do
      spec.activate
      finish_resolve
    end
    spec.bin_file exec_name
  end

  ##
  # The mode needed to read a file as straight binary.

  def self.binary_mode
    "rb"
  end

  ##
  # The path where gem executables are to be installed.

  def self.bindir(install_dir=Gem.dir)
    return File.join install_dir, "bin" unless
      install_dir.to_s == Gem.default_dir.to_s
    Gem.default_bindir
  end

  ##
  # The path were rubygems plugins are to be installed.

  def self.plugindir(install_dir=Gem.dir)
    File.join install_dir, "plugins"
  end

  ##
  # Reset the +dir+ and +path+ values.  The next time +dir+ or +path+
  # is requested, the values will be calculated from scratch.  This is
  # mainly used by the unit tests to provide test isolation.

  def self.clear_paths
    @paths         = nil
    @user_home     = nil
    Gem::Specification.reset
    Gem::Security.reset if defined?(Gem::Security)
  end

  ##
  # The standard configuration object for gems.

  def self.configuration
    @configuration ||= Gem::ConfigFile.new []
  end

  ##
  # Use the given configuration object (which implements the ConfigFile
  # protocol) as the standard configuration object.

  def self.configuration=(config)
    @configuration = config
  end

  ##
  # The path to the data directory specified by the gem name.  If the
  # package is not available as a gem, return nil.

  def self.datadir(gem_name)
    spec = @loaded_specs[gem_name]
    return nil if spec.nil?
    spec.datadir
  end

  ##
  # A Zlib::Deflate.deflate wrapper

  def self.deflate(data)
    require "zlib"
    Zlib::Deflate.deflate data
  end

  # Retrieve the PathSupport object that RubyGems uses to
  # lookup files.

  def self.paths
    @paths ||= Gem::PathSupport.new(ENV)
  end

  # Initialize the filesystem paths to use from +env+.
  # +env+ is a hash-like object (typically ENV) that
  # is queried for 'GEM_HOME', 'GEM_PATH', and 'GEM_SPEC_CACHE'
  # Keys for the +env+ hash should be Strings, and values of the hash should
  # be Strings or +nil+.

  def self.paths=(env)
    clear_paths
    target = {}
    env.each_pair do |k,v|
      case k
      when "GEM_HOME", "GEM_PATH", "GEM_SPEC_CACHE"
        case v
        when nil, String
          target[k] = v
        when Array
          unless Gem::Deprecate.skip
            warn <<-EOWARN
Array values in the parameter to `Gem.paths=` are deprecated.
Please use a String or nil.
An Array (#{env.inspect}) was passed in from #{caller[3]}
            EOWARN
          end
          target[k] = v.join File::PATH_SEPARATOR
        end
      else
        target[k] = v
      end
    end
    @paths = Gem::PathSupport.new ENV.to_hash.merge(target)
    Gem::Specification.dirs = @paths.path
  end

  ##
  # The path where gems are to be installed.

  def self.dir
    paths.home
  end

  def self.path
    paths.path
  end

  def self.spec_cache_dir
    paths.spec_cache_dir
  end

  ##
  # Quietly ensure the Gem directory +dir+ contains all the proper
  # subdirectories.  If we can't create a directory due to a permission
  # problem, then we will silently continue.
  #
  # If +mode+ is given, missing directories are created with this mode.
  #
  # World-writable directories will never be created.

  def self.ensure_gem_subdirectories(dir = Gem.dir, mode = nil)
    ensure_subdirectories(dir, mode, REPOSITORY_SUBDIRECTORIES)
  end

  ##
  # Quietly ensure the Gem directory +dir+ contains all the proper
  # subdirectories for handling default gems.  If we can't create a
  # directory due to a permission problem, then we will silently continue.
  #
  # If +mode+ is given, missing directories are created with this mode.
  #
  # World-writable directories will never be created.

  def self.ensure_default_gem_subdirectories(dir = Gem.dir, mode = nil)
    ensure_subdirectories(dir, mode, REPOSITORY_DEFAULT_GEM_SUBDIRECTORIES)
  end

  def self.ensure_subdirectories(dir, mode, subdirs) # :nodoc:
    old_umask = File.umask
    File.umask old_umask | 002

    options = {}

    options[:mode] = mode if mode

    subdirs.each do |name|
      subdir = File.join dir, name
      next if File.exist? subdir

      require "fileutils"

      begin
        FileUtils.mkdir_p subdir, **options
      rescue SystemCallError
      end
    end
  ensure
    File.umask old_umask
  end

  ##
  # The extension API version of ruby.  This includes the static vs non-static
  # distinction as extensions cannot be shared between the two.

  def self.extension_api_version # :nodoc:
    if "no" == RbConfig::CONFIG["ENABLE_SHARED"]
      "#{ruby_api_version}-static"
    else
      ruby_api_version
    end
  end

  ##
  # Returns a list of paths matching +glob+ that can be used by a gem to pick
  # up features from other gems.  For example:
  #
  #   Gem.find_files('rdoc/discover').each do |path| load path end
  #
  # if +check_load_path+ is true (the default), then find_files also searches
  # $LOAD_PATH for files as well as gems.
  #
  # Note that find_files will return all files even if they are from different
  # versions of the same gem.  See also find_latest_files

  def self.find_files(glob, check_load_path=true)
    files = []

    files = find_files_from_load_path glob if check_load_path

    gem_specifications = @gemdeps ? Gem.loaded_specs.values : Gem::Specification.stubs

    files.concat gem_specifications.map {|spec|
      spec.matches_for_glob("#{glob}#{Gem.suffix_pattern}")
    }.flatten

    # $LOAD_PATH might contain duplicate entries or reference
    # the spec dirs directly, so we prune.
    files.uniq! if check_load_path

    return files
  end

  def self.find_files_from_load_path(glob) # :nodoc:
    glob_with_suffixes = "#{glob}#{Gem.suffix_pattern}"
    $LOAD_PATH.map do |load_path|
      Gem::Util.glob_files_in_dir(glob_with_suffixes, load_path)
    end.flatten.select {|file| File.file? file.tap(&Gem::UNTAINT) }
  end

  ##
  # Returns a list of paths matching +glob+ from the latest gems that can be
  # used by a gem to pick up features from other gems.  For example:
  #
  #   Gem.find_latest_files('rdoc/discover').each do |path| load path end
  #
  # if +check_load_path+ is true (the default), then find_latest_files also
  # searches $LOAD_PATH for files as well as gems.
  #
  # Unlike find_files, find_latest_files will return only files from the
  # latest version of a gem.

  def self.find_latest_files(glob, check_load_path=true)
    files = []

    files = find_files_from_load_path glob if check_load_path

    files.concat Gem::Specification.latest_specs(true).map {|spec|
      spec.matches_for_glob("#{glob}#{Gem.suffix_pattern}")
    }.flatten

    # $LOAD_PATH might contain duplicate entries or reference
    # the spec dirs directly, so we prune.
    files.uniq! if check_load_path

    return files
  end

  ##
  # Top level install helper method. Allows you to install gems interactively:
  #
  #   % irb
  #   >> Gem.install "minitest"
  #   Fetching: minitest-5.14.0.gem (100%)
  #   => [#<Gem::Specification:0x1013b4528 @name="minitest", ...>]

  def self.install(name, version = Gem::Requirement.default, *options)
    require_relative "rubygems/dependency_installer"
    inst = Gem::DependencyInstaller.new(*options)
    inst.install name, version
    inst.installed_gems
  end

  ##
  # Get the default RubyGems API host. This is normally
  # <tt>https://rubygems.org</tt>.

  def self.host
    @host ||= Gem::DEFAULT_HOST
  end

  ## Set the default RubyGems API host.

  def self.host=(host)
    @host = host
  end

  ##
  # The index to insert activated gem paths into the $LOAD_PATH. The activated
  # gem's paths are inserted before site lib directory by default.

  def self.load_path_insert_index
    $LOAD_PATH.each_with_index do |path, i|
      return i if path.instance_variable_defined?(:@gem_prelude_index)
    end

    index = $LOAD_PATH.index RbConfig::CONFIG["sitelibdir"]

    index || 0
  end

  ##
  # The number of paths in the +$LOAD_PATH+ from activated gems. Used to
  # prioritize +-I+ and +ENV['RUBYLIB']+ entries during +require+.

  def self.activated_gem_paths
    @activated_gem_paths ||= 0
  end

  ##
  # Add a list of paths to the $LOAD_PATH at the proper place.

  def self.add_to_load_path(*paths)
    @activated_gem_paths = activated_gem_paths + paths.size

    # gem directories must come after -I and ENV['RUBYLIB']
    $LOAD_PATH.insert(Gem.load_path_insert_index, *paths)
  end

  @yaml_loaded = false

  ##
  # Loads YAML, preferring Psych

  def self.load_yaml
    return if @yaml_loaded

    require "psych"
    require_relative "rubygems/psych_tree"

    require_relative "rubygems/safe_yaml"

    @yaml_loaded = true
  end

  ##
  # The file name and line number of the caller of the caller of this method.
  #
  # +depth+ is how many layers up the call stack it should go.
  #
  # e.g.,
  #
  # def a; Gem.location_of_caller; end
  # a #=> ["x.rb", 2]  # (it'll vary depending on file name and line number)
  #
  # def b; c; end
  # def c; Gem.location_of_caller(2); end
  # b #=> ["x.rb", 6]  # (it'll vary depending on file name and line number)

  def self.location_of_caller(depth = 1)
    caller[depth] =~ /(.*?):(\d+).*?$/i
    file = $1
    lineno = $2.to_i

    [file, lineno]
  end

  ##
  # The version of the Marshal format for your Ruby.

  def self.marshal_version
    "#{Marshal::MAJOR_VERSION}.#{Marshal::MINOR_VERSION}"
  end

  ##
  # Set array of platforms this RubyGems supports (primarily for testing).

  def self.platforms=(platforms)
    @platforms = platforms
  end

  ##
  # Array of platforms this RubyGems supports.

  def self.platforms
    @platforms ||= []
    if @platforms.empty?
      @platforms = [Gem::Platform::RUBY, Gem::Platform.local]
    end
    @platforms
  end

  ##
  # Adds a post-build hook that will be passed an Gem::Installer instance
  # when Gem::Installer#install is called.  The hook is called after the gem
  # has been extracted and extensions have been built but before the
  # executables or gemspec has been written.  If the hook returns +false+ then
  # the gem's files will be removed and the install will be aborted.

  def self.post_build(&hook)
    @post_build_hooks << hook
  end

  ##
  # Adds a post-install hook that will be passed an Gem::Installer instance
  # when Gem::Installer#install is called

  def self.post_install(&hook)
    @post_install_hooks << hook
  end

  ##
  # Adds a post-installs hook that will be passed a Gem::DependencyInstaller
  # and a list of installed specifications when
  # Gem::DependencyInstaller#install is complete

  def self.done_installing(&hook)
    @done_installing_hooks << hook
  end

  ##
  # Adds a hook that will get run after Gem::Specification.reset is
  # run.

  def self.post_reset(&hook)
    @post_reset_hooks << hook
  end

  ##
  # Adds a post-uninstall hook that will be passed a Gem::Uninstaller instance
  # and the spec that was uninstalled when Gem::Uninstaller#uninstall is
  # called

  def self.post_uninstall(&hook)
    @post_uninstall_hooks << hook
  end

  ##
  # Adds a pre-install hook that will be passed an Gem::Installer instance
  # when Gem::Installer#install is called.  If the hook returns +false+ then
  # the install will be aborted.

  def self.pre_install(&hook)
    @pre_install_hooks << hook
  end

  ##
  # Adds a hook that will get run before Gem::Specification.reset is
  # run.

  def self.pre_reset(&hook)
    @pre_reset_hooks << hook
  end

  ##
  # Adds a pre-uninstall hook that will be passed an Gem::Uninstaller instance
  # and the spec that will be uninstalled when Gem::Uninstaller#uninstall is
  # called

  def self.pre_uninstall(&hook)
    @pre_uninstall_hooks << hook
  end

  ##
  # The directory prefix this RubyGems was installed at. If your
  # prefix is in a standard location (ie, rubygems is installed where
  # you'd expect it to be), then prefix returns nil.

  def self.prefix
    prefix = File.dirname RUBYGEMS_DIR

    if prefix != File.expand_path(RbConfig::CONFIG["sitelibdir"]) &&
       prefix != File.expand_path(RbConfig::CONFIG["libdir"]) &&
       "lib" == File.basename(RUBYGEMS_DIR)
      prefix
    end
  end

  ##
  # Refresh available gems from disk.

  def self.refresh
    Gem::Specification.reset
  end

  ##
  # Safely read a file in binary mode on all platforms.

  def self.read_binary(path)
    open_file(path, "rb+") do |io|
      io.read
    end
  rescue Errno::EACCES, Errno::EROFS
    open_file(path, "rb") do |io|
      io.read
    end
  end

  ##
  # Safely write a file in binary mode on all platforms.
  def self.write_binary(path, data)
    open_file(path, "wb") do |io|
      io.write data
    end
  end

  ##
  # Open a file with given flags, and on Windows protect access with flock

  def self.open_file(path, flags, &block)
    File.open(path, flags) do |io|
      if !java_platform? && win_platform?
        begin
          io.flock(File::LOCK_EX)
        rescue Errno::ENOSYS, Errno::ENOTSUP
        end
      end
      yield io
    end
  rescue Errno::ENOLCK # NFS
    if Thread.main != Thread.current
      raise
    else
      File.open(path, flags) do |io|
        yield io
      end
    end
  end

  ##
  # The path to the running Ruby interpreter.

  def self.ruby
    if @ruby.nil?
      @ruby = RbConfig.ruby

      @ruby = "\"#{@ruby}\"" if @ruby =~ /\s/
    end

    @ruby
  end

  ##
  # Returns a String containing the API compatibility version of Ruby

  def self.ruby_api_version
    @ruby_api_version ||= RbConfig::CONFIG["ruby_version"].dup
  end

  def self.env_requirement(gem_name)
    @env_requirements_by_name ||= {}
    @env_requirements_by_name[gem_name] ||= begin
      req = ENV["GEM_REQUIREMENT_#{gem_name.upcase}"] || ">= 0".freeze
      Gem::Requirement.create(req)
    end
  end
  post_reset { @env_requirements_by_name = {} }

  ##
  # Returns the latest release-version specification for the gem +name+.

  def self.latest_spec_for(name)
    dependency   = Gem::Dependency.new name
    fetcher      = Gem::SpecFetcher.fetcher
    spec_tuples, = fetcher.spec_for_dependency dependency

    spec, = spec_tuples.last

    spec
  end

  ##
  # Returns the latest release version of RubyGems.

  def self.latest_rubygems_version
    latest_version_for("rubygems-update") ||
      raise("Can't find 'rubygems-update' in any repo. Check `gem source list`.")
  end

  ##
  # Returns the version of the latest release-version of gem +name+

  def self.latest_version_for(name)
    spec = latest_spec_for name
    spec && spec.version
  end

  ##
  # A Gem::Version for the currently running Ruby.

  def self.ruby_version
    return @ruby_version if defined? @ruby_version
    version = RUBY_VERSION.dup

    unless defined?(RUBY_PATCHLEVEL) && RUBY_PATCHLEVEL != -1
      if RUBY_ENGINE == "ruby"
        desc = RUBY_DESCRIPTION[/\Aruby #{Regexp.quote(RUBY_VERSION)}([^ ]+) /, 1]
      else
        desc = RUBY_DESCRIPTION[/\A#{RUBY_ENGINE} #{Regexp.quote(RUBY_ENGINE_VERSION)} \(#{RUBY_VERSION}([^ ]+)\) /, 1]
      end
      version << ".#{desc}" if desc
    end

    @ruby_version = Gem::Version.new version
  end

  ##
  # A Gem::Version for the currently running RubyGems

  def self.rubygems_version
    return @rubygems_version if defined? @rubygems_version
    @rubygems_version = Gem::Version.new Gem::VERSION
  end

  ##
  # Returns an Array of sources to fetch remote gems from. Uses
  # default_sources if the sources list is empty.

  def self.sources
    source_list = configuration.sources || default_sources
    @sources ||= Gem::SourceList.from(source_list)
  end

  ##
  # Need to be able to set the sources without calling
  # Gem.sources.replace since that would cause an infinite loop.
  #
  # DOC: This comment is not documentation about the method itself, it's
  # more of a code comment about the implementation.

  def self.sources=(new_sources)
    if !new_sources
      @sources = nil
    else
      @sources = Gem::SourceList.from(new_sources)
    end
  end

  ##
  # Glob pattern for require-able path suffixes.

  def self.suffix_pattern
    @suffix_pattern ||= "{#{suffixes.join(',')}}"
  end

  ##
  # Regexp for require-able path suffixes.

  def self.suffix_regexp
    @suffix_regexp ||= /#{Regexp.union(suffixes)}\z/
  end

  ##
  # Glob pattern for require-able plugin suffixes.

  def self.plugin_suffix_pattern
    @plugin_suffix_pattern ||= "_plugin#{suffix_pattern}"
  end

  ##
  # Regexp for require-able plugin suffixes.

  def self.plugin_suffix_regexp
    @plugin_suffix_regexp ||= /_plugin#{suffix_regexp}\z/
  end

  ##
  # Suffixes for require-able paths.

  def self.suffixes
    @suffixes ||= ["",
                   ".rb",
                   *%w[DLEXT DLEXT2].map do |key|
                     val = RbConfig::CONFIG[key]
                     next unless val && !val.empty?
                     ".#{val}"
                   end,
                  ].compact.uniq
  end

  ##
  # Prints the amount of time the supplied block takes to run using the debug
  # UI output.

  def self.time(msg, width = 0, display = Gem.configuration.verbose)
    now = Time.now

    value = yield

    elapsed = Time.now - now

    ui.say "%2$*1$s: %3$3.3fs" % [-width, msg, elapsed] if display

    value
  end

  ##
  # Lazily loads DefaultUserInteraction and returns the default UI.

  def self.ui
    require_relative "rubygems/user_interaction"

    Gem::DefaultUserInteraction.ui
  end

  ##
  # Use the +home+ and +paths+ values for Gem.dir and Gem.path.  Used mainly
  # by the unit tests to provide environment isolation.

  def self.use_paths(home, *paths)
    paths.flatten!
    paths.compact!
    hash = { "GEM_HOME" => home, "GEM_PATH" => paths.empty? ? home : paths.join(File::PATH_SEPARATOR) }
    hash.delete_if {|_, v| v.nil? }
    self.paths = hash
  end

  ##
  # Is this a windows platform?

  def self.win_platform?
    if @@win_platform.nil?
      ruby_platform = RbConfig::CONFIG["host_os"]
      @@win_platform = !!WIN_PATTERNS.find {|r| ruby_platform =~ r }
    end

    @@win_platform
  end

  ##
  # Is this a java platform?

  def self.java_platform?
    RUBY_PLATFORM == "java"
  end

  ##
  # Is this platform Solaris?

  def self.solaris_platform?
    RUBY_PLATFORM =~ /solaris/
  end

  ##
  # Load +plugins+ as Ruby files

  def self.load_plugin_files(plugins) # :nodoc:
    plugins.each do |plugin|
      # Skip older versions of the GemCutter plugin: Its commands are in
      # RubyGems proper now.

      next if plugin =~ /gemcutter-0\.[0-3]/

      begin
        load plugin
      rescue ::Exception => e
        details = "#{plugin.inspect}: #{e.message} (#{e.class})"
        warn "Error loading RubyGems plugin #{details}"
      end
    end
  end

  ##
  # Find rubygems plugin files in the standard location and load them

  def self.load_plugins
    Gem.path.each do |gem_path|
      load_plugin_files Gem::Util.glob_files_in_dir("*#{Gem.plugin_suffix_pattern}", plugindir(gem_path))
    end
  end

  ##
  # Find all 'rubygems_plugin' files in $LOAD_PATH and load them

  def self.load_env_plugins
    load_plugin_files find_files_from_load_path("rubygems_plugin")
  end

  ##
  # Looks for a gem dependency file at +path+ and activates the gems in the
  # file if found.  If the file is not found an ArgumentError is raised.
  #
  # If +path+ is not given the RUBYGEMS_GEMDEPS environment variable is used,
  # but if no file is found no exception is raised.
  #
  # If '-' is given for +path+ RubyGems searches up from the current working
  # directory for gem dependency files (gem.deps.rb, Gemfile, Isolate) and
  # activates the gems in the first one found.
  #
  # You can run this automatically when rubygems starts.  To enable, set
  # the <code>RUBYGEMS_GEMDEPS</code> environment variable to either the path
  # of your gem dependencies file or "-" to auto-discover in parent
  # directories.
  #
  # NOTE: Enabling automatic discovery on multiuser systems can lead to
  # execution of arbitrary code when used from directories outside your
  # control.

  def self.use_gemdeps(path = nil)
    raise_exception = path

    path ||= ENV["RUBYGEMS_GEMDEPS"]
    return unless path

    path = path.dup

    if path == "-"
      Gem::Util.traverse_parents Dir.pwd do |directory|
        dep_file = GEM_DEP_FILES.find {|f| File.file?(f) }

        next unless dep_file

        path = File.join directory, dep_file
        break
      end
    end

    path.tap(&Gem::UNTAINT)

    unless File.file? path
      return unless raise_exception

      raise ArgumentError, "Unable to find gem dependencies file at #{path}"
    end

    ENV["BUNDLE_GEMFILE"] ||= File.expand_path(path)
    require_relative "rubygems/user_interaction"
    require "bundler"
    begin
      Gem::DefaultUserInteraction.use_ui(ui) do
        begin
          Bundler.ui.silence do
            @gemdeps = Bundler.setup
          end
        ensure
          Gem::DefaultUserInteraction.ui.close
        end
      end
    rescue Bundler::BundlerError => e
      warn e.message
      warn "You may need to `bundle install` to install missing gems"
      warn ""
    end
  end

  ##
  # If the SOURCE_DATE_EPOCH environment variable is set, returns it's value.
  # Otherwise, returns the time that +Gem.source_date_epoch_string+ was
  # first called in the same format as SOURCE_DATE_EPOCH.
  #
  # NOTE(@duckinator): The implementation is a tad weird because we want to:
  #   1. Make builds reproducible by default, by having this function always
  #      return the same result during a given run.
  #   2. Allow changing ENV['SOURCE_DATE_EPOCH'] at runtime, since multiple
  #      tests that set this variable will be run in a single process.
  #
  # If you simplify this function and a lot of tests fail, that is likely
  # due to #2 above.
  #
  # Details on SOURCE_DATE_EPOCH:
  # https://reproducible-builds.org/specs/source-date-epoch/

  def self.source_date_epoch_string
    # The value used if $SOURCE_DATE_EPOCH is not set.
    @default_source_date_epoch ||= Time.now.to_i.to_s

    specified_epoch = ENV["SOURCE_DATE_EPOCH"]

    # If it's empty or just whitespace, treat it like it wasn't set at all.
    specified_epoch = nil if !specified_epoch.nil? && specified_epoch.strip.empty?

    epoch = specified_epoch || @default_source_date_epoch

    epoch.strip
  end

  ##
  # Returns the value of Gem.source_date_epoch_string, as a Time object.
  #
  # This is used throughout RubyGems for enabling reproducible builds.

  def self.source_date_epoch
    Time.at(self.source_date_epoch_string.to_i).utc.freeze
  end

  # FIX: Almost everywhere else we use the `def self.` way of defining class
  # methods, and then we switch over to `class << self` here. Pick one or the
  # other.
  class << self
    ##
    # RubyGems distributors (like operating system package managers) can
    # disable RubyGems update by setting this to error message printed to
    # end-users on gem update --system instead of actual update.
    attr_accessor :disable_system_update_message

    ##
    # Hash of loaded Gem::Specification keyed by name

    attr_reader :loaded_specs

    ##
    # GemDependencyAPI object, which is set when .use_gemdeps is called.
    # This contains all the information from the Gemfile.

    attr_reader :gemdeps

    ##
    # Register a Gem::Specification for default gem.
    #
    # Two formats for the specification are supported:
    #
    # * MRI 2.0 style, where spec.files contains unprefixed require names.
    #   The spec's filenames will be registered as-is.
    # * New style, where spec.files contains files prefixed with paths
    #   from spec.require_paths. The prefixes are stripped before
    #   registering the spec's filenames. Unprefixed files are omitted.
    #

    def register_default_spec(spec)
      extended_require_paths = spec.require_paths.map {|f| f + "/" }
      new_format = extended_require_paths.any? {|path| spec.files.any? {|f| f.start_with? path } }

      if new_format
        prefix_group = extended_require_paths.join("|")
        prefix_pattern = /^(#{prefix_group})/
      end

      spec.files.each do |file|
        if new_format
          file = file.sub(prefix_pattern, "")
          next unless $~
        end

        spec.activate if already_loaded?(file)

        @path_to_default_spec_map[file] = spec
        @path_to_default_spec_map[file.sub(suffix_regexp, "")] = spec
      end
    end

    ##
    # Find a Gem::Specification of default gem from +path+

    def find_unresolved_default_spec(path)
      default_spec = @path_to_default_spec_map[path]
      return default_spec if default_spec && loaded_specs[default_spec.name] != default_spec
    end

    ##
    # Clear default gem related variables. It is for test

    def clear_default_specs
      @path_to_default_spec_map.clear
    end

    ##
    # The list of hooks to be run after Gem::Installer#install extracts files
    # and builds extensions

    attr_reader :post_build_hooks

    ##
    # The list of hooks to be run after Gem::Installer#install completes
    # installation

    attr_reader :post_install_hooks

    ##
    # The list of hooks to be run after Gem::DependencyInstaller installs a
    # set of gems

    attr_reader :done_installing_hooks

    ##
    # The list of hooks to be run after Gem::Specification.reset is run.

    attr_reader :post_reset_hooks

    ##
    # The list of hooks to be run after Gem::Uninstaller#uninstall completes
    # installation

    attr_reader :post_uninstall_hooks

    ##
    # The list of hooks to be run before Gem::Installer#install does any work

    attr_reader :pre_install_hooks

    ##
    # The list of hooks to be run before Gem::Specification.reset is run.

    attr_reader :pre_reset_hooks

    ##
    # The list of hooks to be run before Gem::Uninstaller#uninstall does any
    # work

    attr_reader :pre_uninstall_hooks

    private

    def already_loaded?(file)
      $LOADED_FEATURES.any? do |feature_path|
        feature_path.end_with?(file) && default_gem_load_paths.any? {|load_path_entry| feature_path == "#{load_path_entry}/#{file}" }
      end
    end

    def default_gem_load_paths
      @default_gem_load_paths ||= $LOAD_PATH[load_path_insert_index..-1].map do |lp|
        expanded = File.expand_path(lp)
        next expanded unless File.exist?(expanded)

        File.realpath(expanded)
      end
    end
  end

  ##
  # Location of Marshal quick gemspecs on remote repositories

  MARSHAL_SPEC_DIR = "quick/Marshal.#{Gem.marshal_version}/".freeze

  autoload :BundlerVersionFinder, File.expand_path("rubygems/bundler_version_finder", __dir__)
  autoload :ConfigFile,         File.expand_path("rubygems/config_file", __dir__)
  autoload :Dependency,         File.expand_path("rubygems/dependency", __dir__)
  autoload :DependencyList,     File.expand_path("rubygems/dependency_list", __dir__)
  autoload :Installer,          File.expand_path("rubygems/installer", __dir__)
  autoload :Licenses,           File.expand_path("rubygems/util/licenses", __dir__)
  autoload :NameTuple,          File.expand_path("rubygems/name_tuple", __dir__)
  autoload :PathSupport,        File.expand_path("rubygems/path_support", __dir__)
  autoload :RequestSet,         File.expand_path("rubygems/request_set", __dir__)
  autoload :Requirement,        File.expand_path("rubygems/requirement", __dir__)
  autoload :Resolver,           File.expand_path("rubygems/resolver", __dir__)
  autoload :Source,             File.expand_path("rubygems/source", __dir__)
  autoload :SourceList,         File.expand_path("rubygems/source_list", __dir__)
  autoload :SpecFetcher,        File.expand_path("rubygems/spec_fetcher", __dir__)
  autoload :SpecificationPolicy, File.expand_path("rubygems/specification_policy", __dir__)
  autoload :Util,               File.expand_path("rubygems/util", __dir__)
  autoload :Version,            File.expand_path("rubygems/version", __dir__)
end

require_relative "rubygems/exceptions"
require_relative "rubygems/specification"

# REFACTOR: This should be pulled out into some kind of hacks file.
begin
  ##
  # Defaults the operating system (or packager) wants to provide for RubyGems.

  require "rubygems/defaults/operating_system"
rescue LoadError
  # Ignored
rescue StandardError => e
  path = e.backtrace_locations.reverse.find {|l| l.path.end_with?("rubygems/defaults/operating_system.rb") }.path
  msg = "#{e.message}\n" \
    "Loading the #{path} file caused an error. " \
    "This file is owned by your OS, not by rubygems upstream. " \
    "Please find out which OS package this file belongs to and follow the guidelines from your OS to report " \
    "the problem and ask for help."
  raise e.class, msg
end

begin
  ##
  # Defaults the Ruby implementation wants to provide for RubyGems

  require "rubygems/defaults/#{RUBY_ENGINE}"
rescue LoadError
end

##
# Loads the default specs.
Gem::Specification.load_defaults

require_relative "rubygems/core_ext/kernel_gem"
require_relative "rubygems/core_ext/kernel_require"
require_relative "rubygems/core_ext/kernel_warn"
PK}$[
���4-4- rubygems/rubygems/request_set.rbnu�[���# frozen_string_literal: true
require_relative "tsort"

##
# A RequestSet groups a request to activate a set of dependencies.
#
#   nokogiri = Gem::Dependency.new 'nokogiri', '~> 1.6'
#   pg = Gem::Dependency.new 'pg', '~> 0.14'
#
#   set = Gem::RequestSet.new nokogiri, pg
#
#   requests = set.resolve
#
#   p requests.map { |r| r.full_name }
#   #=> ["nokogiri-1.6.0", "mini_portile-0.5.1", "pg-0.17.0"]

class Gem::RequestSet
  include Gem::TSort

  ##
  # Array of gems to install even if already installed

  attr_accessor :always_install

  attr_reader :dependencies

  attr_accessor :development

  ##
  # Errors fetching gems during resolution.

  attr_reader :errors

  ##
  # Set to true if you want to install only direct development dependencies.

  attr_accessor :development_shallow

  ##
  # The set of git gems imported via load_gemdeps.

  attr_reader :git_set # :nodoc:

  ##
  # When true, dependency resolution is not performed, only the requested gems
  # are installed.

  attr_accessor :ignore_dependencies

  attr_reader :install_dir # :nodoc:

  ##
  # If true, allow dependencies to match prerelease gems.

  attr_accessor :prerelease

  ##
  # When false no remote sets are used for resolving gems.

  attr_accessor :remote

  attr_reader :resolver # :nodoc:

  ##
  # Sets used for resolution

  attr_reader :sets # :nodoc:

  ##
  # Treat missing dependencies as silent errors

  attr_accessor :soft_missing

  ##
  # The set of vendor gems imported via load_gemdeps.

  attr_reader :vendor_set # :nodoc:

  ##
  # The set of source gems imported via load_gemdeps.

  attr_reader :source_set

  ##
  # Creates a RequestSet for a list of Gem::Dependency objects, +deps+.  You
  # can then #resolve and #install the resolved list of dependencies.
  #
  #   nokogiri = Gem::Dependency.new 'nokogiri', '~> 1.6'
  #   pg = Gem::Dependency.new 'pg', '~> 0.14'
  #
  #   set = Gem::RequestSet.new nokogiri, pg

  def initialize(*deps)
    @dependencies = deps

    @always_install      = []
    @conservative        = false
    @dependency_names    = {}
    @development         = false
    @development_shallow = false
    @errors              = []
    @git_set             = nil
    @ignore_dependencies = false
    @install_dir         = Gem.dir
    @prerelease          = false
    @remote              = true
    @requests            = []
    @sets                = []
    @soft_missing        = false
    @sorted              = nil
    @specs               = nil
    @vendor_set          = nil
    @source_set          = nil

    yield self if block_given?
  end

  ##
  # Declare that a gem of name +name+ with +reqs+ requirements is needed.

  def gem(name, *reqs)
    if dep = @dependency_names[name]
      dep.requirement.concat reqs
    else
      dep = Gem::Dependency.new name, *reqs
      @dependency_names[name] = dep
      @dependencies << dep
    end
  end

  ##
  # Add +deps+ Gem::Dependency objects to the set.

  def import(deps)
    @dependencies.concat deps
  end

  ##
  # Installs gems for this RequestSet using the Gem::Installer +options+.
  #
  # If a +block+ is given an activation +request+ and +installer+ are yielded.
  # The +installer+ will be +nil+ if a gem matching the request was already
  # installed.

  def install(options, &block) # :yields: request, installer
    if dir = options[:install_dir]
      requests = install_into dir, false, options, &block
      return requests
    end

    @prerelease = options[:prerelease]

    requests = []
    download_queue = Thread::Queue.new

    # Create a thread-safe list of gems to download
    sorted_requests.each do |req|
      download_queue << req
    end

    # Create N threads in a pool, have them download all the gems
    threads = Gem.configuration.concurrent_downloads.times.map do
      # When a thread pops this item, it knows to stop running. The symbol
      # is queued here so that there will be one symbol per thread.
      download_queue << :stop

      Thread.new do
        # The pop method will block waiting for items, so the only way
        # to stop a thread from running is to provide a final item that
        # means the thread should stop.
        while req = download_queue.pop
          break if req == :stop
          req.spec.download options unless req.installed?
        end
      end
    end

    # Wait for all the downloads to finish before continuing
    threads.each(&:value)

    # Install requested gems after they have been downloaded
    sorted_requests.each do |req|
      if req.installed?
        req.spec.spec.build_extensions

        if @always_install.none? {|spec| spec == req.spec.spec }
          yield req, nil if block_given?
          next
        end
      end

      spec =
        begin
          req.spec.install options do |installer|
            yield req, installer if block_given?
          end
        rescue Gem::RuntimeRequirementNotMetError => e
          suggestion = "There are no versions of #{req.request} compatible with your Ruby & RubyGems"
          suggestion += ". Maybe try installing an older version of the gem you're looking for?" unless @always_install.include?(req.spec.spec)
          e.suggestion = suggestion
          raise
        end

      requests << spec
    end

    return requests if options[:gemdeps]

    install_hooks requests, options

    requests
  end

  ##
  # Installs from the gem dependencies files in the +:gemdeps+ option in
  # +options+, yielding to the +block+ as in #install.
  #
  # If +:without_groups+ is given in the +options+, those groups in the gem
  # dependencies file are not used.  See Gem::Installer for other +options+.

  def install_from_gemdeps(options, &block)
    gemdeps = options[:gemdeps]

    @install_dir = options[:install_dir] || Gem.dir
    @prerelease  = options[:prerelease]
    @remote      = options[:domain] != :local
    @conservative = true if options[:conservative]

    gem_deps_api = load_gemdeps gemdeps, options[:without_groups], true

    resolve

    if options[:explain]
      puts "Gems to install:"

      sorted_requests.each do |spec|
        puts "  #{spec.full_name}"
      end

      if Gem.configuration.really_verbose
        @resolver.stats.display
      end
    else
      installed = install options, &block

      if options.fetch :lock, true
        lockfile =
          Gem::RequestSet::Lockfile.build self, gemdeps, gem_deps_api.dependencies
        lockfile.write
      end

      installed
    end
  end

  def install_into(dir, force = true, options = {})
    gem_home, ENV["GEM_HOME"] = ENV["GEM_HOME"], dir

    existing = force ? [] : specs_in(dir)
    existing.delete_if {|s| @always_install.include? s }

    dir = File.expand_path dir

    installed = []

    options[:development] = false
    options[:install_dir] = dir
    options[:only_install_dir] = true
    @prerelease = options[:prerelease]

    sorted_requests.each do |request|
      spec = request.spec

      if existing.find {|s| s.full_name == spec.full_name }
        yield request, nil if block_given?
        next
      end

      spec.install options do |installer|
        yield request, installer if block_given?
      end

      installed << request
    end

    install_hooks installed, options

    installed
  ensure
    ENV["GEM_HOME"] = gem_home
  end

  ##
  # Call hooks on installed gems

  def install_hooks(requests, options)
    specs = requests.map do |request|
      case request
      when Gem::Resolver::ActivationRequest then
        request.spec.spec
      else
        request
      end
    end

    require_relative "dependency_installer"
    inst = Gem::DependencyInstaller.new options
    inst.installed_gems.replace specs

    Gem.done_installing_hooks.each do |hook|
      hook.call inst, specs
    end unless Gem.done_installing_hooks.empty?
  end

  ##
  # Load a dependency management file.

  def load_gemdeps(path, without_groups = [], installing = false)
    @git_set    = Gem::Resolver::GitSet.new
    @vendor_set = Gem::Resolver::VendorSet.new
    @source_set = Gem::Resolver::SourceSet.new

    @git_set.root_dir = @install_dir

    lock_file = "#{File.expand_path(path)}.lock".dup.tap(&Gem::UNTAINT)
    begin
      tokenizer = Gem::RequestSet::Lockfile::Tokenizer.from_file lock_file
      parser = tokenizer.make_parser self, []
      parser.parse
    rescue Errno::ENOENT
    end

    gf = Gem::RequestSet::GemDependencyAPI.new self, path
    gf.installing = installing
    gf.without_groups = without_groups if without_groups
    gf.load
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[RequestSet:", "]" do
      q.breakable

      if @remote
        q.text "remote"
        q.breakable
      end

      if @prerelease
        q.text "prerelease"
        q.breakable
      end

      if @development_shallow
        q.text "shallow development"
        q.breakable
      elsif @development
        q.text "development"
        q.breakable
      end

      if @soft_missing
        q.text "soft missing"
      end

      q.group 2, "[dependencies:", "]" do
        q.breakable
        @dependencies.map do |dep|
          q.text dep.to_s
          q.breakable
        end
      end

      q.breakable
      q.text "sets:"

      q.breakable
      q.pp @sets.map {|set| set.class }
    end
  end

  ##
  # Resolve the requested dependencies and return an Array of Specification
  # objects to be activated.

  def resolve(set = Gem::Resolver::BestSet.new)
    @sets << set
    @sets << @git_set
    @sets << @vendor_set
    @sets << @source_set

    set = Gem::Resolver.compose_sets(*@sets)
    set.remote = @remote
    set.prerelease = @prerelease

    resolver = Gem::Resolver.new @dependencies, set
    resolver.development         = @development
    resolver.development_shallow = @development_shallow
    resolver.ignore_dependencies = @ignore_dependencies
    resolver.soft_missing        = @soft_missing

    if @conservative
      installed_gems = {}
      Gem::Specification.find_all do |spec|
        (installed_gems[spec.name] ||= []) << spec
      end
      resolver.skip_gems = installed_gems
    end

    @resolver = resolver

    @requests = resolver.resolve

    @errors = set.errors

    @requests
  end

  ##
  # Resolve the requested dependencies against the gems available via Gem.path
  # and return an Array of Specification objects to be activated.

  def resolve_current
    resolve Gem::Resolver::CurrentSet.new
  end

  def sorted_requests
    @sorted ||= strongly_connected_components.flatten
  end

  def specs
    @specs ||= @requests.map {|r| r.full_spec }
  end

  def specs_in(dir)
    Gem::Util.glob_files_in_dir("*.gemspec", File.join(dir, "specifications")).map do |g|
      Gem::Specification.load g
    end
  end

  def tsort_each_node(&block) # :nodoc:
    @requests.each(&block)
  end

  def tsort_each_child(node) # :nodoc:
    node.spec.dependencies.each do |dep|
      next if dep.type == :development && !@development

      match = @requests.find do |r|
        dep.match? r.spec.name, r.spec.version, r.spec.is_a?(Gem::Resolver::InstalledSpecification) || @prerelease
      end

      unless match
        next if dep.type == :development && @development_shallow
        next if @soft_missing
        raise Gem::DependencyError,
              "Unresolved dependency found during sorting - #{dep} (requested by #{node.spec.full_name})"
      end

      yield match
    end
  end
end

require_relative "request_set/gem_dependency_api"
require_relative "request_set/lockfile"
require_relative "request_set/lockfile/tokenizer"
PK}$[�^�L2L2rubygems/rubygems/version.rbnu�[���# frozen_string_literal: true

require_relative "deprecate"

##
# The Version class processes string versions into comparable
# values. A version string should normally be a series of numbers
# separated by periods. Each part (digits separated by periods) is
# considered its own number, and these are used for sorting. So for
# instance, 3.10 sorts higher than 3.2 because ten is greater than
# two.
#
# If any part contains letters (currently only a-z are supported) then
# that version is considered prerelease. Versions with a prerelease
# part in the Nth part sort less than versions with N-1
# parts. Prerelease parts are sorted alphabetically using the normal
# Ruby string sorting rules. If a prerelease part contains both
# letters and numbers, it will be broken into multiple parts to
# provide expected sort behavior (1.0.a10 becomes 1.0.a.10, and is
# greater than 1.0.a9).
#
# Prereleases sort between real releases (newest to oldest):
#
# 1. 1.0
# 2. 1.0.b1
# 3. 1.0.a.2
# 4. 0.9
#
# If you want to specify a version restriction that includes both prereleases
# and regular releases of the 1.x series this is the best way:
#
#   s.add_dependency 'example', '>= 1.0.0.a', '< 2.0.0'
#
# == How Software Changes
#
# Users expect to be able to specify a version constraint that gives them
# some reasonable expectation that new versions of a library will work with
# their software if the version constraint is true, and not work with their
# software if the version constraint is false.  In other words, the perfect
# system will accept all compatible versions of the library and reject all
# incompatible versions.
#
# Libraries change in 3 ways (well, more than 3, but stay focused here!).
#
# 1. The change may be an implementation detail only and have no effect on
#    the client software.
# 2. The change may add new features, but do so in a way that client software
#    written to an earlier version is still compatible.
# 3. The change may change the public interface of the library in such a way
#    that old software is no longer compatible.
#
# Some examples are appropriate at this point.  Suppose I have a Stack class
# that supports a <tt>push</tt> and a <tt>pop</tt> method.
#
# === Examples of Category 1 changes:
#
# * Switch from an array based implementation to a linked-list based
#   implementation.
# * Provide an automatic (and transparent) backing store for large stacks.
#
# === Examples of Category 2 changes might be:
#
# * Add a <tt>depth</tt> method to return the current depth of the stack.
# * Add a <tt>top</tt> method that returns the current top of stack (without
#   changing the stack).
# * Change <tt>push</tt> so that it returns the item pushed (previously it
#   had no usable return value).
#
# === Examples of Category 3 changes might be:
#
# * Changes <tt>pop</tt> so that it no longer returns a value (you must use
#   <tt>top</tt> to get the top of the stack).
# * Rename the methods to <tt>push_item</tt> and <tt>pop_item</tt>.
#
# == RubyGems Rational Versioning
#
# * Versions shall be represented by three non-negative integers, separated
#   by periods (e.g. 3.1.4).  The first integers is the "major" version
#   number, the second integer is the "minor" version number, and the third
#   integer is the "build" number.
#
# * A category 1 change (implementation detail) will increment the build
#   number.
#
# * A category 2 change (backwards compatible) will increment the minor
#   version number and reset the build number.
#
# * A category 3 change (incompatible) will increment the major build number
#   and reset the minor and build numbers.
#
# * Any "public" release of a gem should have a different version.  Normally
#   that means incrementing the build number.  This means a developer can
#   generate builds all day long, but as soon as they make a public release,
#   the version must be updated.
#
# === Examples
#
# Let's work through a project lifecycle using our Stack example from above.
#
# Version 0.0.1:: The initial Stack class is release.
# Version 0.0.2:: Switched to a linked=list implementation because it is
#                 cooler.
# Version 0.1.0:: Added a <tt>depth</tt> method.
# Version 1.0.0:: Added <tt>top</tt> and made <tt>pop</tt> return nil
#                 (<tt>pop</tt> used to return the  old top item).
# Version 1.1.0:: <tt>push</tt> now returns the value pushed (it used it
#                 return nil).
# Version 1.1.1:: Fixed a bug in the linked list implementation.
# Version 1.1.2:: Fixed a bug introduced in the last fix.
#
# Client A needs a stack with basic push/pop capability.  They write to the
# original interface (no <tt>top</tt>), so their version constraint looks like:
#
#   gem 'stack', '>= 0.0'
#
# Essentially, any version is OK with Client A.  An incompatible change to
# the library will cause them grief, but they are willing to take the chance
# (we call Client A optimistic).
#
# Client B is just like Client A except for two things: (1) They use the
# <tt>depth</tt> method and (2) they are worried about future
# incompatibilities, so they write their version constraint like this:
#
#   gem 'stack', '~> 0.1'
#
# The <tt>depth</tt> method was introduced in version 0.1.0, so that version
# or anything later is fine, as long as the version stays below version 1.0
# where incompatibilities are introduced.  We call Client B pessimistic
# because they are worried about incompatible future changes (it is OK to be
# pessimistic!).
#
# == Preventing Version Catastrophe:
#
# From: http://blog.zenspider.com/2008/10/rubygems-howto-preventing-cata.html
#
# Let's say you're depending on the fnord gem version 2.y.z. If you
# specify your dependency as ">= 2.0.0" then, you're good, right? What
# happens if fnord 3.0 comes out and it isn't backwards compatible
# with 2.y.z? Your stuff will break as a result of using ">=". The
# better route is to specify your dependency with an "approximate" version
# specifier ("~>"). They're a tad confusing, so here is how the dependency
# specifiers work:
#
#   Specification From  ... To (exclusive)
#   ">= 3.0"      3.0   ... &infin;
#   "~> 3.0"      3.0   ... 4.0
#   "~> 3.0.0"    3.0.0 ... 3.1
#   "~> 3.5"      3.5   ... 4.0
#   "~> 3.5.0"    3.5.0 ... 3.6
#   "~> 3"        3.0   ... 4.0
#
# For the last example, single-digit versions are automatically extended with
# a zero to give a sensible result.

class Gem::Version
  include Comparable

  VERSION_PATTERN = '[0-9]+(?>\.[0-9a-zA-Z]+)*(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?'.freeze # :nodoc:
  ANCHORED_VERSION_PATTERN = /\A\s*(#{VERSION_PATTERN})?\s*\z/.freeze # :nodoc:

  ##
  # A string representation of this Version.

  def version
    @version.dup
  end

  alias to_s version

  ##
  # True if the +version+ string matches RubyGems' requirements.

  def self.correct?(version)
    nil_versions_are_discouraged! if version.nil?

    !!(version.to_s =~ ANCHORED_VERSION_PATTERN)
  end

  ##
  # Factory method to create a Version object. Input may be a Version
  # or a String. Intended to simplify client code.
  #
  #   ver1 = Version.create('1.3.17')   # -> (Version object)
  #   ver2 = Version.create(ver1)       # -> (ver1)
  #   ver3 = Version.create(nil)        # -> nil

  def self.create(input)
    if self === input # check yourself before you wreck yourself
      input
    elsif input.nil?
      nil_versions_are_discouraged!

      nil
    else
      new input
    end
  end

  @@all = {}
  @@bump = {}
  @@release = {}

  def self.new(version) # :nodoc:
    return super unless Gem::Version == self

    @@all[version] ||= super
  end

  def self.nil_versions_are_discouraged!
    unless Gem::Deprecate.skip
      warn "nil versions are discouraged and will be deprecated in Rubygems 4"
    end
  end

  private_class_method :nil_versions_are_discouraged!

  ##
  # Constructs a Version from the +version+ string.  A version string is a
  # series of digits or ASCII letters separated by dots.

  def initialize(version)
    unless self.class.correct?(version)
      raise ArgumentError, "Malformed version number string #{version}"
    end

    # If version is an empty string convert it to 0
    version = 0 if version.is_a?(String) && version =~ /\A\s*\Z/

    @version = version.to_s.strip.gsub("-",".pre.")
    @segments = nil
  end

  ##
  # Return a new version object where the next to the last revision
  # number is one greater (e.g., 5.3.1 => 5.4).
  #
  # Pre-release (alpha) parts, e.g, 5.3.1.b.2 => 5.4, are ignored.

  def bump
    @@bump[self] ||= begin
                       segments = self.segments
                       segments.pop while segments.any? {|s| String === s }
                       segments.pop if segments.size > 1

                       segments[-1] = segments[-1].succ
                       self.class.new segments.join(".")
                     end
  end

  ##
  # A Version is only eql? to another version if it's specified to the
  # same precision. Version "1.0" is not the same as version "1".

  def eql?(other)
    self.class === other && @version == other._version
  end

  def hash # :nodoc:
    canonical_segments.hash
  end

  def init_with(coder) # :nodoc:
    yaml_initialize coder.tag, coder.map
  end

  def inspect # :nodoc:
    "#<#{self.class} #{version.inspect}>"
  end

  ##
  # Dump only the raw version string, not the complete object. It's a
  # string for backwards (RubyGems 1.3.5 and earlier) compatibility.

  def marshal_dump
    [version]
  end

  ##
  # Load custom marshal format. It's a string for backwards (RubyGems
  # 1.3.5 and earlier) compatibility.

  def marshal_load(array)
    initialize array[0]
  end

  def yaml_initialize(tag, map) # :nodoc:
    @version = map["version"]
    @segments = nil
    @hash = nil
  end

  def to_yaml_properties # :nodoc:
    ["@version"]
  end

  def encode_with(coder) # :nodoc:
    coder.add "version", @version
  end

  ##
  # A version is considered a prerelease if it contains a letter.

  def prerelease?
    unless instance_variable_defined? :@prerelease
      @prerelease = !!(@version =~ /[a-zA-Z]/)
    end
    @prerelease
  end

  def pretty_print(q) # :nodoc:
    q.text "Gem::Version.new(#{version.inspect})"
  end

  ##
  # The release for this version (e.g. 1.2.0.a -> 1.2.0).
  # Non-prerelease versions return themselves.

  def release
    @@release[self] ||= if prerelease?
      segments = self.segments
      segments.pop while segments.any? {|s| String === s }
      self.class.new segments.join(".")
    else
      self
    end
  end

  def segments # :nodoc:
    _segments.dup
  end

  ##
  # A recommended version for use with a ~> Requirement.

  def approximate_recommendation
    segments = self.segments

    segments.pop    while segments.any? {|s| String === s }
    segments.pop    while segments.size > 2
    segments.push 0 while segments.size < 2

    recommendation = "~> #{segments.join(".")}"
    recommendation += ".a" if prerelease?
    recommendation
  end

  ##
  # Compares this version with +other+ returning -1, 0, or 1 if the
  # other version is larger, the same, or smaller than this
  # one. Attempts to compare to something that's not a
  # <tt>Gem::Version</tt> or a valid version String return +nil+.

  def <=>(other)
    return self <=> self.class.new(other) if (String === other) && self.class.correct?(other)

    return unless Gem::Version === other
    return 0 if @version == other._version || canonical_segments == other.canonical_segments

    lhsegments = canonical_segments
    rhsegments = other.canonical_segments

    lhsize = lhsegments.size
    rhsize = rhsegments.size
    limit  = (lhsize > rhsize ? lhsize : rhsize) - 1

    i = 0

    while i <= limit
      lhs, rhs = lhsegments[i] || 0, rhsegments[i] || 0
      i += 1

      next      if lhs == rhs
      return -1 if String  === lhs && Numeric === rhs
      return  1 if Numeric === lhs && String  === rhs

      return lhs <=> rhs
    end

    return 0
  end

  def canonical_segments
    @canonical_segments ||=
      _split_segments.map! do |segments|
        segments.reverse_each.drop_while {|s| s == 0 }.reverse
      end.reduce(&:concat)
  end

  def freeze
    prerelease?
    canonical_segments
    super
  end

  protected

  def _version
    @version
  end

  def _segments
    # segments is lazy so it can pick up version values that come from
    # old marshaled versions, which don't go through marshal_load.
    # since this version object is cached in @@all, its @segments should be frozen

    @segments ||= @version.scan(/[0-9]+|[a-z]+/i).map do |s|
      /^\d+$/ =~ s ? s.to_i : s
    end.freeze
  end

  def _split_segments
    string_start = _segments.index {|s| s.is_a?(String) }
    string_segments = segments
    numeric_segments = string_segments.slice!(0, string_start || string_segments.size)
    return numeric_segments, string_segments
  end
end
PK}$[D����rubygems/rubygems/text.rbnu�[���# frozen_string_literal: true

##
# A collection of text-wrangling methods

module Gem::Text

  ##
  # Remove any non-printable characters and make the text suitable for
  # printing.
  def clean_text(text)
    text.gsub(/[\000-\b\v-\f\016-\037\177]/, ".".freeze)
  end

  def truncate_text(text, description, max_length = 100_000)
    raise ArgumentError, "max_length must be positive" unless max_length > 0
    return text if text.size <= max_length
    "Truncating #{description} to #{max_length.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse} characters:\n" + text[0, max_length]
  end

  ##
  # Wraps +text+ to +wrap+ characters and optionally indents by +indent+
  # characters

  def format_text(text, wrap, indent=0)
    result = []
    work = clean_text(text)

    while work.length > wrap do
      if work =~ /^(.{0,#{wrap}})[ \n]/
        result << $1.rstrip
        work.slice!(0, $&.length)
      else
        result << work.slice!(0, wrap)
      end
    end

    result << work if work.length.nonzero?
    result.join("\n").gsub(/^/, " " * indent)
  end

  def min3(a, b, c) # :nodoc:
    if a < b && a < c
      a
    elsif b < c
      b
    else
      c
    end
  end

  # Returns a value representing the "cost" of transforming str1 into str2
  # Vendored version of DidYouMean::Levenshtein.distance from the ruby/did_you_mean gem @ 1.4.0
  # https://git.io/JJgZI
  def levenshtein_distance(str1, str2)
    n = str1.length
    m = str2.length
    return m if n.zero?
    return n if m.zero?

    d = (0..m).to_a
    x = nil

    # to avoid duplicating an enumerable object, create it outside of the loop
    str2_codepoints = str2.codepoints

    str1.each_codepoint.with_index(1) do |char1, i|
      j = 0
      while j < m
        cost = (char1 == str2_codepoints[j]) ? 0 : 1
        x = min3(
          d[j + 1] + 1, # insertion
          i + 1,      # deletion
          d[j] + cost # substitution
        )
        d[j] = i
        i = x

        j += 1
      end
      d[m] = x
    end

    x
  end
end
PK}$[�9<>�	�	-rubygems/rubygems/request/connection_pools.rbnu�[���# frozen_string_literal: true

class Gem::Request::ConnectionPools # :nodoc:
  @client = Net::HTTP

  class << self
    attr_accessor :client
  end

  def initialize(proxy_uri, cert_files)
    @proxy_uri  = proxy_uri
    @cert_files = cert_files
    @pools      = {}
    @pool_mutex = Thread::Mutex.new
  end

  def pool_for(uri)
    http_args = net_http_args(uri, @proxy_uri)
    key       = http_args + [https?(uri)]
    @pool_mutex.synchronize do
      @pools[key] ||=
        if https? uri
          Gem::Request::HTTPSPool.new(http_args, @cert_files, @proxy_uri)
        else
          Gem::Request::HTTPPool.new(http_args, @cert_files, @proxy_uri)
        end
    end
  end

  def close_all
    @pools.each_value {|pool| pool.close_all }
  end

  private

  ##
  # Returns list of no_proxy entries (if any) from the environment

  def get_no_proxy_from_env
    env_no_proxy = ENV["no_proxy"] || ENV["NO_PROXY"]

    return [] if env_no_proxy.nil? || env_no_proxy.empty?

    env_no_proxy.split(/\s*,\s*/)
  end

  def https?(uri)
    uri.scheme.downcase == "https"
  end

  def no_proxy?(host, env_no_proxy)
    host = host.downcase

    env_no_proxy.any? do |pattern|
      env_no_proxy_pattern = pattern.downcase.dup

      # Remove dot in front of pattern for wildcard matching
      env_no_proxy_pattern[0] = "" if env_no_proxy_pattern[0] == "."

      host_tokens = host.split(".")
      pattern_tokens = env_no_proxy_pattern.split(".")

      intersection = (host_tokens - pattern_tokens) | (pattern_tokens - host_tokens)

      # When we do the split into tokens we miss a dot character, so add it back if we need it
      missing_dot = intersection.length > 0 ? 1 : 0
      start = intersection.join(".").size + missing_dot

      no_proxy_host = host[start..-1]

      env_no_proxy_pattern == no_proxy_host
    end
  end

  def net_http_args(uri, proxy_uri)
    hostname = uri.hostname
    net_http_args = [hostname, uri.port]

    no_proxy = get_no_proxy_from_env

    if proxy_uri && !no_proxy?(hostname, no_proxy)
      proxy_hostname = proxy_uri.respond_to?(:hostname) ? proxy_uri.hostname : proxy_uri.host
      net_http_args + [
        proxy_hostname,
        proxy_uri.port,
        Gem::UriFormatter.new(proxy_uri.user).unescape,
        Gem::UriFormatter.new(proxy_uri.password).unescape,
      ]
    elsif no_proxy? hostname, no_proxy
      net_http_args + [nil, nil]
    else
      net_http_args
    end
  end
end
PK}$[�	�E��'rubygems/rubygems/request/https_pool.rbnu�[���# frozen_string_literal: true
class Gem::Request::HTTPSPool < Gem::Request::HTTPPool # :nodoc:
  private

  def setup_connection(connection)
    Gem::Request.configure_connection_for_https(connection, @cert_files)
    super
  end
end
PK}$[��u&rubygems/rubygems/request/http_pool.rbnu�[���# frozen_string_literal: true
##
# A connection "pool" that only manages one connection for now.  Provides
# thread safe `checkout` and `checkin` methods.  The pool consists of one
# connection that corresponds to `http_args`.  This class is private, do not
# use it.

class Gem::Request::HTTPPool # :nodoc:
  attr_reader :cert_files, :proxy_uri

  def initialize(http_args, cert_files, proxy_uri)
    @http_args  = http_args
    @cert_files = cert_files
    @proxy_uri  = proxy_uri
    @queue      = Thread::SizedQueue.new 1
    @queue << nil
  end

  def checkout
    @queue.pop || make_connection
  end

  def checkin(connection)
    @queue.push connection
  end

  def close_all
    until @queue.empty?
      if (connection = @queue.pop(true)) && connection.started?
        connection.finish
      end
    end
    @queue.push(nil)
  end

  private

  def make_connection
    setup_connection Gem::Request::ConnectionPools.client.new(*@http_args)
  end

  def setup_connection(connection)
    connection.start
    connection
  end
end
PK}$[��~uurubygems/rubygems/platform.rbnu�[���# frozen_string_literal: true
require_relative "deprecate"

##
# Available list of platforms for targeting Gem installations.
#
# See `gem help platform` for information on platform matching.

class Gem::Platform
  @local = nil

  attr_accessor :cpu, :os, :version

  def self.local
    arch = RbConfig::CONFIG["arch"]
    arch = "#{arch}_60" if arch =~ /mswin(?:32|64)$/
    @local ||= new(arch)
  end

  def self.match(platform)
    match_platforms?(platform, Gem.platforms)
  end

  def self.match_platforms?(platform, platforms)
    platform = Gem::Platform.new(platform) unless platform.is_a?(Gem::Platform)
    platforms.any? do |local_platform|
      platform.nil? ||
        local_platform == platform ||
        (local_platform != Gem::Platform::RUBY && platform =~ local_platform)
    end
  end
  private_class_method :match_platforms?

  def self.match_spec?(spec)
    match_gem?(spec.platform, spec.name)
  end

  def self.match_gem?(platform, gem_name)
    # Note: this method might be redefined by Ruby implementations to
    # customize behavior per RUBY_ENGINE, gem_name or other criteria.
    match_platforms?(platform, Gem.platforms)
  end

  def self.sort_priority(platform)
    platform == Gem::Platform::RUBY ? -1 : 1
  end

  def self.installable?(spec)
    if spec.respond_to? :installable_platform?
      spec.installable_platform?
    else
      match_spec? spec
    end
  end

  def self.new(arch) # :nodoc:
    case arch
    when Gem::Platform::CURRENT then
      Gem::Platform.local
    when Gem::Platform::RUBY, nil, "" then
      Gem::Platform::RUBY
    else
      super
    end
  end

  def initialize(arch)
    case arch
    when Array then
      @cpu, @os, @version = arch
    when String then
      arch = arch.split "-"

      if arch.length > 2 && arch.last !~ /\d+(\.\d+)?$/ # reassemble x86-linux-{libc}
        extra = arch.pop
        arch.last << "-#{extra}"
      end

      cpu = arch.shift

      @cpu = case cpu
      when /i\d86/ then "x86"
      else cpu
      end

      if arch.length == 2 && arch.last =~ /^\d+(\.\d+)?$/ # for command-line
        @os, @version = arch
        return
      end

      os, = arch
      @cpu, os = nil, cpu if os.nil? # legacy jruby

      @os, @version = case os
      when /aix(\d+)?/ then             [ "aix",       $1  ]
      when /cygwin/ then                [ "cygwin",    nil ]
      when /darwin(\d+)?/ then          [ "darwin",    $1  ]
      when /^macruby$/ then             [ "macruby",   nil ]
      when /freebsd(\d+)?/ then         [ "freebsd",   $1  ]
      when /hpux(\d+)?/ then            [ "hpux",      $1  ]
      when /^java$/, /^jruby$/ then     [ "java",      nil ]
      when /^java([\d.]*)/ then         [ "java",      $1  ]
      when /^dalvik(\d+)?$/ then        [ "dalvik",    $1  ]
      when /^dotnet$/ then              [ "dotnet",    nil ]
      when /^dotnet([\d.]*)/ then       [ "dotnet",    $1  ]
      when /linux-?(\w+)?/ then         [ "linux",     $1  ]
      when /mingw32/ then               [ "mingw32",   nil ]
      when /mingw-?(\w+)?/ then         [ "mingw",     $1  ]
      when /(mswin\d+)(\_(\d+))?/ then
        os, version = $1, $3
        @cpu = "x86" if @cpu.nil? && os =~ /32$/
        [os, version]
      when /netbsdelf/ then             [ "netbsdelf", nil ]
      when /openbsd(\d+\.\d+)?/ then    [ "openbsd",   $1  ]
      when /bitrig(\d+\.\d+)?/ then     [ "bitrig",    $1  ]
      when /solaris(\d+\.\d+)?/ then    [ "solaris",   $1  ]
      # test
      when /^(\w+_platform)(\d+)?/ then [ $1,          $2  ]
      else                              [ "unknown",   nil ]
      end
    when Gem::Platform then
      @cpu = arch.cpu
      @os = arch.os
      @version = arch.version
    else
      raise ArgumentError, "invalid argument #{arch.inspect}"
    end
  end

  def to_a
    [@cpu, @os, @version]
  end

  def to_s
    to_a.compact.join "-"
  end

  ##
  # Is +other+ equal to this platform?  Two platforms are equal if they have
  # the same CPU, OS and version.

  def ==(other)
    self.class === other && to_a == other.to_a
  end

  alias :eql? :==

  def hash # :nodoc:
    to_a.hash
  end

  ##
  # Does +other+ match this platform?  Two platforms match if they have the
  # same CPU, or either has a CPU of 'universal', they have the same OS, and
  # they have the same version, or either one has no version
  #
  # Additionally, the platform will match if the local CPU is 'arm' and the
  # other CPU starts with "arm" (for generic ARM family support).
  #
  # Of note, this method is not commutative. Indeed the OS 'linux' has a
  # special case: the version is the libc name, yet while "no version" stands
  # as a wildcard for a binary gem platform (as for other OSes), for the
  # runtime platform "no version" stands for 'gnu'. To be able to disinguish
  # these, the method receiver is the gem platform, while the argument is
  # the runtime platform.
  #
  #--
  # NOTE: Until it can be removed, changes to this method must also be reflected in `bundler/lib/bundler/rubygems_ext.rb`

  def ===(other)
    return nil unless Gem::Platform === other

    # universal-mingw32 matches x64-mingw-ucrt
    return true if (@cpu == "universal" || other.cpu == "universal") &&
                   @os.start_with?("mingw") && other.os.start_with?("mingw")

    # cpu
    ([nil,"universal"].include?(@cpu) || [nil, "universal"].include?(other.cpu) || @cpu == other.cpu ||
    (@cpu == "arm" && other.cpu.start_with?("arm"))) &&

      # os
      @os == other.os &&

      # version
      (
        (@os != "linux" && (@version.nil? || other.version.nil?)) ||
        (@os == "linux" && (normalized_linux_version == other.normalized_linux_version || ["musl#{@version}", "musleabi#{@version}", "musleabihf#{@version}"].include?(other.version))) ||
        @version == other.version
      )
  end

  #--
  # NOTE: Until it can be removed, changes to this method must also be reflected in `bundler/lib/bundler/rubygems_ext.rb`

  def normalized_linux_version
    return nil unless @version

    without_gnu_nor_abi_modifiers = @version.sub(/\Agnu/, "").sub(/eabi(hf)?\Z/, "")
    return nil if without_gnu_nor_abi_modifiers.empty?

    without_gnu_nor_abi_modifiers
  end

  ##
  # Does +other+ match this platform?  If +other+ is a String it will be
  # converted to a Gem::Platform first.  See #=== for matching rules.

  def =~(other)
    case other
    when Gem::Platform then # nop
    when String then
      # This data is from http://gems.rubyforge.org/gems/yaml on 19 Aug 2007
      other = case other
      when /^i686-darwin(\d)/     then ["x86",       "darwin",  $1    ]
      when /^i\d86-linux/         then ["x86",       "linux",   nil   ]
      when "java", "jruby"        then [nil,         "java",    nil   ]
      when /^dalvik(\d+)?$/       then [nil,         "dalvik",  $1    ]
      when /dotnet(\-(\d+\.\d+))?/ then ["universal","dotnet",  $2    ]
      when /mswin32(\_(\d+))?/    then ["x86",       "mswin32", $2    ]
      when /mswin64(\_(\d+))?/    then ["x64",       "mswin64", $2    ]
      when "powerpc-darwin"       then ["powerpc",   "darwin",  nil   ]
      when /powerpc-darwin(\d)/   then ["powerpc",   "darwin",  $1    ]
      when /sparc-solaris2.8/     then ["sparc",     "solaris", "2.8" ]
      when /universal-darwin(\d)/ then ["universal", "darwin",  $1    ]
      else                             other
      end

      other = Gem::Platform.new other
    else
      return nil
    end

    self === other
  end

  ##
  # A pure-Ruby gem that may use Gem::Specification#extensions to build
  # binary files.

  RUBY = "ruby".freeze

  ##
  # A platform-specific gem that is built for the packaging Ruby's platform.
  # This will be replaced with Gem::Platform::local.

  CURRENT = "current".freeze
end
PK}$[���!�! rubygems/rubygems/query_utils.rbnu�[���# frozen_string_literal: true

require_relative "local_remote_options"
require_relative "spec_fetcher"
require_relative "version_option"
require_relative "text"

module Gem::QueryUtils

  include Gem::Text
  include Gem::LocalRemoteOptions
  include Gem::VersionOption

  def add_query_options
    add_option("-i", "--[no-]installed",
               "Check for installed gem") do |value, options|
      options[:installed] = value
    end

    add_option("-I", "Equivalent to --no-installed") do |value, options|
      options[:installed] = false
    end

    add_version_option command, "for use with --installed"

    add_option("-d", "--[no-]details",
               "Display detailed information of gem(s)") do |value, options|
      options[:details] = value
    end

    add_option("--[no-]versions",
               "Display only gem names") do |value, options|
      options[:versions] = value
      options[:details] = false unless value
    end

    add_option("-a", "--all",
               "Display all gem versions") do |value, options|
      options[:all] = value
    end

    add_option("-e", "--exact",
               "Name of gem(s) to query on matches the",
               "provided STRING") do |value, options|
      options[:exact] = value
    end

    add_option("--[no-]prerelease",
               "Display prerelease versions") do |value, options|
      options[:prerelease] = value
    end

    add_local_remote_options
  end

  def defaults_str # :nodoc:
    "--local --no-details --versions --no-installed"
  end

  def execute
    gem_names = if args.empty?
      [options[:name]]
    else
      options[:exact] ? args.map {|arg| /\A#{Regexp.escape(arg)}\Z/ } : args.map {|arg| /#{arg}/i }
    end

    terminate_interaction(check_installed_gems(gem_names)) if check_installed_gems?

    gem_names.each {|n| show_gems(n) }
  end

  private

  def check_installed_gems(gem_names)
    exit_code = 0

    if args.empty? && !gem_name?
      alert_error "You must specify a gem name"
      exit_code = 4
    elsif gem_names.count > 1
      alert_error "You must specify only ONE gem!"
      exit_code = 4
    else
      installed = installed?(gem_names.first, options[:version])
      installed = !installed unless options[:installed]

      say(installed)
      exit_code = 1 if !installed
    end

    exit_code
  end

  def check_installed_gems?
    !options[:installed].nil?
  end

  def gem_name?
    !options[:name].nil?
  end

  def prerelease
    options[:prerelease]
  end

  def show_prereleases?
    prerelease.nil? || prerelease
  end

  def args
    options[:args].to_a
  end

  def display_header(type)
    if (ui.outs.tty? && Gem.configuration.verbose) || both?
      say
      say "*** #{type} GEMS ***"
      say
    end
  end

  #Guts of original execute
  def show_gems(name)
    show_local_gems(name)  if local?
    show_remote_gems(name) if remote?
  end

  def show_local_gems(name, req = Gem::Requirement.default)
    display_header("LOCAL")

    specs = Gem::Specification.find_all do |s|
      name_matches = name ? s.name =~ name : true
      version_matches = show_prereleases? || !s.version.prerelease?

      name_matches && version_matches
    end

    spec_tuples = specs.map do |spec|
      [spec.name_tuple, spec]
    end

    output_query_results(spec_tuples)
  end

  def show_remote_gems(name)
    display_header("REMOTE")

    fetcher = Gem::SpecFetcher.fetcher

    spec_tuples = if name.nil?
      fetcher.detect(specs_type) { true }
    else
      fetcher.detect(specs_type) do |name_tuple|
        name === name_tuple.name && options[:version].satisfied_by?(name_tuple.version)
      end
    end

    output_query_results(spec_tuples)
  end

  def specs_type
    if options[:all] || options[:version].specific?
      if options[:prerelease]
        :complete
      else
        :released
      end
    elsif options[:prerelease]
      :prerelease
    else
      :latest
    end
  end

  ##
  # Check if gem +name+ version +version+ is installed.

  def installed?(name, req = Gem::Requirement.default)
    Gem::Specification.any? {|s| s.name =~ name && req =~ s.version }
  end

  def output_query_results(spec_tuples)
    output = []
    versions = Hash.new {|h,name| h[name] = [] }

    spec_tuples.each do |spec_tuple, source|
      versions[spec_tuple.name] << [spec_tuple, source]
    end

    versions = versions.sort_by do |(n,_),_|
      n.downcase
    end

    output_versions output, versions

    say output.join(options[:details] ? "\n\n" : "\n")
  end

  def output_versions(output, versions)
    versions.each do |gem_name, matching_tuples|
      matching_tuples = matching_tuples.sort_by {|n,_| n.version }.reverse

      platforms = Hash.new {|h,version| h[version] = [] }

      matching_tuples.each do |n, _|
        platforms[n.version] << n.platform if n.platform
      end

      seen = {}

      matching_tuples.delete_if do |n,_|
        if seen[n.version]
          true
        else
          seen[n.version] = true
          false
        end
      end

      output << clean_text(make_entry(matching_tuples, platforms))
    end
  end

  def entry_details(entry, detail_tuple, specs, platforms)
    return unless options[:details]

    name_tuple, spec = detail_tuple

    spec = spec.fetch_spec(name_tuple)if spec.respond_to?(:fetch_spec)

    entry << "\n"

    spec_platforms   entry, platforms
    spec_authors     entry, spec
    spec_homepage    entry, spec
    spec_license     entry, spec
    spec_loaded_from entry, spec, specs
    spec_summary     entry, spec
  end

  def entry_versions(entry, name_tuples, platforms, specs)
    return unless options[:versions]

    list =
      if platforms.empty? || options[:details]
        name_tuples.map {|n| n.version }.uniq
      else
        platforms.sort.reverse.map do |version, pls|
          out = version.to_s

          if options[:domain] == :local
            default = specs.any? do |s|
              !s.is_a?(Gem::Source) && s.version == version && s.default_gem?
            end
            out = "default: #{out}" if default
          end

          if pls != [Gem::Platform::RUBY]
            platform_list = [pls.delete(Gem::Platform::RUBY), *pls.sort].compact
            out = platform_list.unshift(out).join(" ")
          end

          out
        end
      end

    entry << " (#{list.join ', '})"
  end

  def make_entry(entry_tuples, platforms)
    detail_tuple = entry_tuples.first

    name_tuples, specs = entry_tuples.flatten.partition do |item|
      Gem::NameTuple === item
    end

    entry = [name_tuples.first.name]

    entry_versions(entry, name_tuples, platforms, specs)
    entry_details(entry, detail_tuple, specs, platforms)

    entry.join
  end

  def spec_authors(entry, spec)
    authors = "Author#{spec.authors.length > 1 ? 's' : ''}: ".dup
    authors << spec.authors.join(", ")
    entry << format_text(authors, 68, 4)
  end

  def spec_homepage(entry, spec)
    return if spec.homepage.nil? || spec.homepage.empty?

    entry << "\n" << format_text("Homepage: #{spec.homepage}", 68, 4)
  end

  def spec_license(entry, spec)
    return if spec.license.nil? || spec.license.empty?

    licenses = "License#{spec.licenses.length > 1 ? 's' : ''}: ".dup
    licenses << spec.licenses.join(", ")
    entry << "\n" << format_text(licenses, 68, 4)
  end

  def spec_loaded_from(entry, spec, specs)
    return unless spec.loaded_from

    if specs.length == 1
      default = spec.default_gem? ? " (default)" : nil
      entry << "\n" << "    Installed at#{default}: #{spec.base_dir}"
    else
      label = "Installed at"
      specs.each do |s|
        version = s.version.to_s
        version << ", default" if s.default_gem?
        entry << "\n" << "    #{label} (#{version}): #{s.base_dir}"
        label = " " * label.length
      end
    end
  end

  def spec_platforms(entry, platforms)
    non_ruby = platforms.any? do |_, pls|
      pls.any? {|pl| pl != Gem::Platform::RUBY }
    end

    return unless non_ruby

    if platforms.length == 1
      title = platforms.values.length == 1 ? "Platform" : "Platforms"
      entry << "    #{title}: #{platforms.values.sort.join(', ')}\n"
    else
      entry << "    Platforms:\n"

      sorted_platforms = platforms.sort_by {|version,| version }

      sorted_platforms.each do |version, pls|
        label = "        #{version}: "
        data = format_text pls.sort.join(", "), 68, label.length
        data[0, label.length] = label
        entry << data << "\n"
      end
    end
  end

  def spec_summary(entry, spec)
    summary = truncate_text(spec.summary, "the summary for #{spec.full_name}")
    entry << "\n\n" << format_text(summary, 68, 4)
  end

end
PK}$[�<�rubygems/rubygems/errors.rbnu�[���# frozen_string_literal: true
#--
# This file contains all the various exceptions and other errors that are used
# inside of RubyGems.
#
# DOC: Confirm _all_
#++

module Gem
  ##
  # Raised when RubyGems is unable to load or activate a gem.  Contains the
  # name and version requirements of the gem that either conflicts with
  # already activated gems or that RubyGems is otherwise unable to activate.

  class LoadError < ::LoadError
    # Name of gem
    attr_accessor :name

    # Version requirement of gem
    attr_accessor :requirement
  end

  ##
  # Raised when trying to activate a gem, and that gem does not exist on the
  # system.  Instead of rescuing from this class, make sure to rescue from the
  # superclass Gem::LoadError to catch all types of load errors.
  class MissingSpecError < Gem::LoadError
    def initialize(name, requirement, extra_message=nil)
      @name        = name
      @requirement = requirement
      @extra_message = extra_message
    end

    def message # :nodoc:
      build_message +
        "Checked in 'GEM_PATH=#{Gem.path.join(File::PATH_SEPARATOR)}' #{@extra_message}, execute `gem env` for more information"
    end

    private

    def build_message
      total = Gem::Specification.stubs.size
      "Could not find '#{name}' (#{requirement}) among #{total} total gem(s)\n"
    end
  end

  ##
  # Raised when trying to activate a gem, and the gem exists on the system, but
  # not the requested version. Instead of rescuing from this class, make sure to
  # rescue from the superclass Gem::LoadError to catch all types of load errors.
  class MissingSpecVersionError < MissingSpecError
    attr_reader :specs

    def initialize(name, requirement, specs)
      super(name, requirement)
      @specs = specs
    end

    private

    def build_message
      names = specs.map(&:full_name)
      "Could not find '#{name}' (#{requirement}) - did find: [#{names.join ','}]\n"
    end
  end

  # Raised when there are conflicting gem specs loaded

  class ConflictError < LoadError
    ##
    # A Hash mapping conflicting specifications to the dependencies that
    # caused the conflict

    attr_reader :conflicts

    ##
    # The specification that had the conflict

    attr_reader :target

    def initialize(target, conflicts)
      @target    = target
      @conflicts = conflicts
      @name      = target.name

      reason = conflicts.map do |act, dependencies|
        "#{act.full_name} conflicts with #{dependencies.join(", ")}"
      end.join ", "

      # TODO: improve message by saying who activated `con`

      super("Unable to activate #{target.full_name}, because #{reason}")
    end
  end

  class ErrorReason; end

  # Generated when trying to lookup a gem to indicate that the gem
  # was found, but that it isn't usable on the current platform.
  #
  # fetch and install read these and report them to the user to aid
  # in figuring out why a gem couldn't be installed.
  #
  class PlatformMismatch < ErrorReason
    ##
    # the name of the gem
    attr_reader :name

    ##
    # the version
    attr_reader :version

    ##
    # The platforms that are mismatched
    attr_reader :platforms

    def initialize(name, version)
      @name = name
      @version = version
      @platforms = []
    end

    ##
    # append a platform to the list of mismatched platforms.
    #
    # Platforms are added via this instead of injected via the constructor
    # so that we can loop over a list of mismatches and just add them rather
    # than perform some kind of calculation mismatch summary before creation.
    def add_platform(platform)
      @platforms << platform
    end

    ##
    # A wordy description of the error.
    def wordy
      "Found %s (%s), but was for platform%s %s" %
        [@name,
         @version,
         @platforms.size == 1 ? "" : "s",
         @platforms.join(" ,")]
    end
  end

  ##
  # An error that indicates we weren't able to fetch some
  # data from a source

  class SourceFetchProblem < ErrorReason
    ##
    # Creates a new SourceFetchProblem for the given +source+ and +error+.

    def initialize(source, error)
      @source = source
      @error = error
    end

    ##
    # The source that had the fetch problem.

    attr_reader :source

    ##
    # The fetch error which is an Exception subclass.

    attr_reader :error

    ##
    # An English description of the error.

    def wordy
      "Unable to download data from #{Gem::Uri.redact(@source.uri)} - #{@error.message}"
    end

    ##
    # The "exception" alias allows you to call raise on a SourceFetchProblem.

    alias exception error
  end
end
PK}$[ 7?%�#�#(rubygems/rubygems/gemcutter_utilities.rbnu�[���# frozen_string_literal: true
require_relative "remote_fetcher"
require_relative "text"

##
# Utility methods for using the RubyGems API.

module Gem::GemcutterUtilities

  ERROR_CODE = 1
  API_SCOPES = %i[index_rubygems push_rubygem yank_rubygem add_owner remove_owner access_webhooks show_dashboard].freeze

  include Gem::Text

  attr_writer :host
  attr_writer :scope

  ##
  # Add the --key option

  def add_key_option
    add_option("-k", "--key KEYNAME", Symbol,
               "Use the given API key",
               "from #{Gem.configuration.credentials_path}") do |value,options|
      options[:key] = value
    end
  end

  ##
  # Add the --otp option

  def add_otp_option
    add_option("--otp CODE",
               "Digit code for multifactor authentication",
               "You can also use the environment variable GEM_HOST_OTP_CODE") do |value, options|
      options[:otp] = value
    end
  end

  ##
  # The API key from the command options or from the user's configuration.

  def api_key
    if ENV["GEM_HOST_API_KEY"]
      ENV["GEM_HOST_API_KEY"]
    elsif options[:key]
      verify_api_key options[:key]
    elsif Gem.configuration.api_keys.key?(host)
      Gem.configuration.api_keys[host]
    else
      Gem.configuration.rubygems_api_key
    end
  end

  ##
  # The OTP code from the command options or from the user's configuration.

  def otp
    options[:otp] || ENV["GEM_HOST_OTP_CODE"]
  end

  ##
  # The host to connect to either from the RUBYGEMS_HOST environment variable
  # or from the user's configuration

  def host
    configured_host = Gem.host unless
      Gem.configuration.disable_default_gem_server

    @host ||=
      begin
        env_rubygems_host = ENV["RUBYGEMS_HOST"]
        env_rubygems_host = nil if
          env_rubygems_host && env_rubygems_host.empty?

        env_rubygems_host || configured_host
      end
  end

  ##
  # Creates an RubyGems API to +host+ and +path+ with the given HTTP +method+.
  #
  # If +allowed_push_host+ metadata is present, then it will only allow that host.

  def rubygems_api_request(method, path, host = nil, allowed_push_host = nil, scope: nil, &block)
    require "net/http"

    self.host = host if host
    unless self.host
      alert_error "You must specify a gem server"
      terminate_interaction(ERROR_CODE)
    end

    if allowed_push_host
      allowed_host_uri = URI.parse(allowed_push_host)
      host_uri         = URI.parse(self.host)

      unless (host_uri.scheme == allowed_host_uri.scheme) && (host_uri.host == allowed_host_uri.host)
        alert_error "#{self.host.inspect} is not allowed by the gemspec, which only allows #{allowed_push_host.inspect}"
        terminate_interaction(ERROR_CODE)
      end
    end

    uri = URI.parse "#{self.host}/#{path}"
    response = request_with_otp(method, uri, &block)

    if mfa_unauthorized?(response)
      ask_otp
      response = request_with_otp(method, uri, &block)
    end

    if api_key_forbidden?(response)
      update_scope(scope)
      request_with_otp(method, uri, &block)
    else
      response
    end
  end

  def mfa_unauthorized?(response)
    response.kind_of?(Net::HTTPUnauthorized) && response.body.start_with?("You have enabled multifactor authentication")
  end

  def update_scope(scope)
    sign_in_host        = self.host
    pretty_host         = pretty_host(sign_in_host)
    update_scope_params = { scope => true }

    say "The existing key doesn't have access of #{scope} on #{pretty_host}. Please sign in to update access."

    email    = ask "   Email: "
    password = ask_for_password "Password: "

    response = rubygems_api_request(:put, "api/v1/api_key",
                                    sign_in_host, scope: scope) do |request|
      request.basic_auth email, password
      request["OTP"] = otp if otp
      request.body = URI.encode_www_form({ :api_key => api_key }.merge(update_scope_params))
    end

    with_response response do |resp|
      say "Added #{scope} scope to the existing API key"
    end
  end

  ##
  # Signs in with the RubyGems API at +sign_in_host+ and sets the rubygems API
  # key.

  def sign_in(sign_in_host = nil, scope: nil)
    sign_in_host ||= self.host
    return if api_key

    pretty_host = pretty_host(sign_in_host)

    say "Enter your #{pretty_host} credentials."
    say "Don't have an account yet? " +
        "Create one at #{sign_in_host}/sign_up"

    email = ask "   Email: "
    password = ask_for_password "Password: "
    say "\n"

    key_name     = get_key_name(scope)
    scope_params = get_scope_params(scope)
    profile      = get_user_profile(email, password)
    mfa_params   = get_mfa_params(profile)
    all_params   = scope_params.merge(mfa_params)
    warning      = profile["warning"]

    say "#{warning}\n" if warning

    response = rubygems_api_request(:post, "api/v1/api_key",
                                    sign_in_host, scope: scope) do |request|
      request.basic_auth email, password
      request["OTP"] = otp if otp
      request.body = URI.encode_www_form({ name: key_name }.merge(all_params))
    end

    with_response response do |resp|
      say "Signed in with API key: #{key_name}."
      set_api_key host, resp.body
    end
  end

  ##
  # Retrieves the pre-configured API key +key+ or terminates interaction with
  # an error.

  def verify_api_key(key)
    if Gem.configuration.api_keys.key? key
      Gem.configuration.api_keys[key]
    else
      alert_error "No such API key. Please add it to your configuration (done automatically on initial `gem push`)."
      terminate_interaction(ERROR_CODE)
    end
  end

  ##
  # If +response+ is an HTTP Success (2XX) response, yields the response if a
  # block was given or shows the response body to the user.
  #
  # If the response was not successful, shows an error to the user including
  # the +error_prefix+ and the response body. If the response was a permanent redirect,
  # shows an error to the user including the redirect location.

  def with_response(response, error_prefix = nil)
    case response
    when Net::HTTPSuccess then
      if block_given?
        yield response
      else
        say clean_text(response.body)
      end
    when Net::HTTPPermanentRedirect, Net::HTTPRedirection then
      message = "The request has redirected permanently to #{response['location']}. Please check your defined push host URL."
      message = "#{error_prefix}: #{message}" if error_prefix

      say clean_text(message)
      terminate_interaction(ERROR_CODE)
    else
      message = response.body
      message = "#{error_prefix}: #{message}" if error_prefix

      say clean_text(message)
      terminate_interaction(ERROR_CODE)
    end
  end

  ##
  # Returns true when the user has enabled multifactor authentication from
  # +response+ text and no otp provided by options.

  def set_api_key(host, key)
    if default_host?
      Gem.configuration.rubygems_api_key = key
    else
      Gem.configuration.set_api_key host, key
    end
  end

  private

  def request_with_otp(method, uri, &block)
    request_method = Net::HTTP.const_get method.to_s.capitalize

    Gem::RemoteFetcher.fetcher.request(uri, request_method) do |req|
      req["OTP"] = otp if otp
      block.call(req)
    end
  end

  def ask_otp
    say "You have enabled multi-factor authentication. Please enter OTP code."
    options[:otp] = ask "Code: "
  end

  def pretty_host(host)
    if default_host?
      "RubyGems.org"
    else
      host
    end
  end

  def get_scope_params(scope)
    scope_params = {}

    if scope
      scope_params = { scope => true }
    else
      say "Please select scopes you want to enable for the API key (y/n)"
      API_SCOPES.each do |scope|
        selected = ask_yes_no("#{scope}", false)
        scope_params[scope] = true if selected
      end
      say "\n"
    end

    scope_params
  end

  def default_host?
    self.host == Gem::DEFAULT_HOST
  end

  def get_user_profile(email, password)
    return {} unless default_host?

    response = rubygems_api_request(:get, "api/v1/profile/me.yaml") do |request|
      request.basic_auth email, password
    end

    with_response response do |resp|
      Gem::SafeYAML.load clean_text(resp.body)
    end
  end

  def get_mfa_params(profile)
    mfa_level = profile["mfa"]
    params = {}
    if mfa_level == "ui_only" || mfa_level == "ui_and_gem_signin"
      selected = ask_yes_no("Would you like to enable MFA for this key? (strongly recommended)")
      params["mfa"] = true if selected
    end
    params
  end

  def get_key_name(scope)
    hostname = Socket.gethostname || "unknown-host"
    user = ENV["USER"] || ENV["USERNAME"] || "unknown-user"
    ts = Time.now.strftime("%Y%m%d%H%M%S")
    default_key_name = "#{hostname}-#{user}-#{ts}"

    key_name = ask "API Key name [#{default_key_name}]: " unless scope
    if key_name.nil? || key_name.empty?
      default_key_name
    else
      key_name
    end
  end

  def api_key_forbidden?(response)
    response.kind_of?(Net::HTTPForbidden) && response.body.start_with?("The API key doesn't have access")
  end
end
PK}$[�Aa��(�()rubygems/rubygems/dependency_installer.rbnu�[���# frozen_string_literal: true
require_relative "../rubygems"
require_relative "dependency_list"
require_relative "package"
require_relative "installer"
require_relative "spec_fetcher"
require_relative "user_interaction"
require_relative "available_set"
require_relative "deprecate"

##
# Installs a gem along with all its dependencies from local and remote gems.

class Gem::DependencyInstaller
  include Gem::UserInteraction
  extend Gem::Deprecate

  DEFAULT_OPTIONS = { # :nodoc:
    :env_shebang         => false,
    :document            => %w[ri],
    :domain              => :both, # HACK dup
    :force               => false,
    :format_executable   => false, # HACK dup
    :ignore_dependencies => false,
    :prerelease          => false,
    :security_policy     => nil, # HACK NoSecurity requires OpenSSL. AlmostNo? Low?
    :wrappers            => true,
    :build_args          => nil,
    :build_docs_in_background => false,
    :install_as_default => false,
  }.freeze

  ##
  # Documentation types.  For use by the Gem.done_installing hook

  attr_reader :document

  ##
  # Errors from SpecFetcher while searching for remote specifications

  attr_reader :errors

  ##
  # List of gems installed by #install in alphabetic order

  attr_reader :installed_gems

  ##
  # Creates a new installer instance.
  #
  # Options are:
  # :cache_dir:: Alternate repository path to store .gem files in.
  # :domain:: :local, :remote, or :both.  :local only searches gems in the
  #           current directory.  :remote searches only gems in Gem::sources.
  #           :both searches both.
  # :env_shebang:: See Gem::Installer::new.
  # :force:: See Gem::Installer#install.
  # :format_executable:: See Gem::Installer#initialize.
  # :ignore_dependencies:: Don't install any dependencies.
  # :install_dir:: See Gem::Installer#install.
  # :prerelease:: Allow prerelease versions.  See #install.
  # :security_policy:: See Gem::Installer::new and Gem::Security.
  # :user_install:: See Gem::Installer.new
  # :wrappers:: See Gem::Installer::new
  # :build_args:: See Gem::Installer::new

  def initialize(options = {})
    @only_install_dir = !!options[:install_dir]
    @install_dir = options[:install_dir] || Gem.dir
    @build_root = options[:build_root]

    options = DEFAULT_OPTIONS.merge options

    @bin_dir             = options[:bin_dir]
    @dev_shallow         = options[:dev_shallow]
    @development         = options[:development]
    @document            = options[:document]
    @domain              = options[:domain]
    @env_shebang         = options[:env_shebang]
    @force               = options[:force]
    @format_executable   = options[:format_executable]
    @ignore_dependencies = options[:ignore_dependencies]
    @prerelease          = options[:prerelease]
    @security_policy     = options[:security_policy]
    @user_install        = options[:user_install]
    @wrappers            = options[:wrappers]
    @build_args          = options[:build_args]
    @build_docs_in_background = options[:build_docs_in_background]
    @install_as_default = options[:install_as_default]
    @dir_mode = options[:dir_mode]
    @data_mode = options[:data_mode]
    @prog_mode = options[:prog_mode]

    # Indicates that we should not try to update any deps unless
    # we absolutely must.
    @minimal_deps = options[:minimal_deps]

    @available      = nil
    @installed_gems = []
    @toplevel_specs = nil

    @cache_dir = options[:cache_dir] || @install_dir

    @errors = []
  end

  ##
  # Indicated, based on the requested domain, if local
  # gems should be considered.

  def consider_local?
    @domain == :both || @domain == :local
  end

  ##
  # Indicated, based on the requested domain, if remote
  # gems should be considered.

  def consider_remote?
    @domain == :both || @domain == :remote
  end

  ##
  # Returns a list of pairs of gemspecs and source_uris that match
  # Gem::Dependency +dep+ from both local (Dir.pwd) and remote (Gem.sources)
  # sources.  Gems are sorted with newer gems preferred over older gems, and
  # local gems preferred over remote gems.

  def find_gems_with_sources(dep, best_only=false) # :nodoc:
    set = Gem::AvailableSet.new

    if consider_local?
      sl = Gem::Source::Local.new

      if spec = sl.find_gem(dep.name)
        if dep.matches_spec? spec
          set.add spec, sl
        end
      end
    end

    if consider_remote?
      begin
        # This is pulled from #spec_for_dependency to allow
        # us to filter tuples before fetching specs.
        tuples, errors = Gem::SpecFetcher.fetcher.search_for_dependency dep

        if best_only && !tuples.empty?
          tuples.sort! do |a,b|
            if b[0].version == a[0].version
              if b[0].platform != Gem::Platform::RUBY
                1
              else
                -1
              end
            else
              b[0].version <=> a[0].version
            end
          end
          tuples = [tuples.first]
        end

        specs = []
        tuples.each do |tup, source|
          begin
            spec = source.fetch_spec(tup)
          rescue Gem::RemoteFetcher::FetchError => e
            errors << Gem::SourceFetchProblem.new(source, e)
          else
            specs << [spec, source]
          end
        end

        if @errors
          @errors += errors
        else
          @errors = errors
        end

        set << specs

      rescue Gem::RemoteFetcher::FetchError => e
        # FIX if there is a problem talking to the network, we either need to always tell
        # the user (no really_verbose) or fail hard, not silently tell them that we just
        # couldn't find their requested gem.
        verbose do
          "Error fetching remote data:\t\t#{e.message}\n" \
            "Falling back to local-only install"
        end
        @domain = :local
      end
    end

    set
  end
  rubygems_deprecate :find_gems_with_sources

  def in_background(what) # :nodoc:
    fork_happened = false
    if @build_docs_in_background && Process.respond_to?(:fork)
      begin
        Process.fork do
          yield
        end
        fork_happened = true
        say "#{what} in a background process."
      rescue NotImplementedError
      end
    end
    yield unless fork_happened
  end

  ##
  # Installs the gem +dep_or_name+ and all its dependencies.  Returns an Array
  # of installed gem specifications.
  #
  # If the +:prerelease+ option is set and there is a prerelease for
  # +dep_or_name+ the prerelease version will be installed.
  #
  # Unless explicitly specified as a prerelease dependency, prerelease gems
  # that +dep_or_name+ depend on will not be installed.
  #
  # If c-1.a depends on b-1 and a-1.a and there is a gem b-1.a available then
  # c-1.a, b-1 and a-1.a will be installed.  b-1.a will need to be installed
  # separately.

  def install(dep_or_name, version = Gem::Requirement.default)
    request_set = resolve_dependencies dep_or_name, version

    @installed_gems = []

    options = {
      :bin_dir             => @bin_dir,
      :build_args          => @build_args,
      :document            => @document,
      :env_shebang         => @env_shebang,
      :force               => @force,
      :format_executable   => @format_executable,
      :ignore_dependencies => @ignore_dependencies,
      :prerelease          => @prerelease,
      :security_policy     => @security_policy,
      :user_install        => @user_install,
      :wrappers            => @wrappers,
      :build_root          => @build_root,
      :install_as_default  => @install_as_default,
      :dir_mode            => @dir_mode,
      :data_mode           => @data_mode,
      :prog_mode           => @prog_mode,
    }
    options[:install_dir] = @install_dir if @only_install_dir

    request_set.install options do |_, installer|
      @installed_gems << installer.spec if installer
    end

    @installed_gems.sort!

    # Since this is currently only called for docs, we can be lazy and just say
    # it's documentation. Ideally the hook adder could decide whether to be in
    # the background or not, and what to call it.
    in_background "Installing documentation" do
      Gem.done_installing_hooks.each do |hook|
        hook.call self, @installed_gems
      end
    end unless Gem.done_installing_hooks.empty?

    @installed_gems
  end

  def install_development_deps # :nodoc:
    if @development && @dev_shallow
      :shallow
    elsif @development
      :all
    else
      :none
    end
  end

  def resolve_dependencies(dep_or_name, version) # :nodoc:
    request_set = Gem::RequestSet.new
    request_set.development         = @development
    request_set.development_shallow = @dev_shallow
    request_set.soft_missing = @force
    request_set.prerelease = @prerelease

    installer_set = Gem::Resolver::InstallerSet.new @domain
    installer_set.ignore_installed = (@minimal_deps == false) || @only_install_dir
    installer_set.force = @force

    if consider_local?
      if dep_or_name =~ /\.gem$/ && File.file?(dep_or_name)
        src = Gem::Source::SpecificFile.new dep_or_name
        installer_set.add_local dep_or_name, src.spec, src
        version = src.spec.version if version == Gem::Requirement.default
      elsif dep_or_name =~ /\.gem$/
        Dir[dep_or_name].each do |name|
          begin
            src = Gem::Source::SpecificFile.new name
            installer_set.add_local dep_or_name, src.spec, src
          rescue Gem::Package::FormatError
          end
        end
        # else This is a dependency. InstallerSet handles this case
      end
    end

    dependency =
      if spec = installer_set.local?(dep_or_name)
        installer_set.remote = nil if spec.dependencies.none?
        Gem::Dependency.new spec.name, version
      elsif String === dep_or_name
        Gem::Dependency.new dep_or_name, version
      else
        dep_or_name
      end

    dependency.prerelease = @prerelease

    request_set.import [dependency]

    installer_set.add_always_install dependency

    request_set.always_install = installer_set.always_install
    request_set.remote = installer_set.consider_remote?

    if @ignore_dependencies
      installer_set.ignore_dependencies = true
      request_set.ignore_dependencies   = true
      request_set.soft_missing          = true
    end

    request_set.resolve installer_set

    @errors.concat request_set.errors

    request_set
  end
end
PK}$[�ʠ���$rubygems/rubygems/command_manager.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require_relative "command"
require_relative "user_interaction"
require_relative "text"

##
# The command manager registers and installs all the individual sub-commands
# supported by the gem command.
#
# Extra commands can be provided by writing a rubygems_plugin.rb
# file in an installed gem.  You should register your command against the
# Gem::CommandManager instance, like this:
#
#   # file rubygems_plugin.rb
#   require 'rubygems/command_manager'
#
#   Gem::CommandManager.instance.register_command :edit
#
# You should put the implementation of your command in rubygems/commands.
#
#   # file rubygems/commands/edit_command.rb
#   class Gem::Commands::EditCommand < Gem::Command
#     # ...
#   end
#
# See Gem::Command for instructions on writing gem commands.

class Gem::CommandManager
  include Gem::Text
  include Gem::UserInteraction

  BUILTIN_COMMANDS = [ # :nodoc:
    :build,
    :cert,
    :check,
    :cleanup,
    :contents,
    :dependency,
    :environment,
    :fetch,
    :generate_index,
    :help,
    :info,
    :install,
    :list,
    :lock,
    :mirror,
    :open,
    :outdated,
    :owner,
    :pristine,
    :push,
    :query,
    :rdoc,
    :search,
    :server,
    :signin,
    :signout,
    :sources,
    :specification,
    :stale,
    :uninstall,
    :unpack,
    :update,
    :which,
    :yank,
  ].freeze

  ALIAS_COMMANDS = {
    "i"      => "install",
    "login"  => "signin",
    "logout" => "signout",
  }.freeze

  ##
  # Return the authoritative instance of the command manager.

  def self.instance
    @command_manager ||= new
  end

  ##
  # Returns self. Allows a CommandManager instance to stand
  # in for the class itself.

  def instance
    self
  end

  ##
  # Reset the authoritative instance of the command manager.

  def self.reset
    @command_manager = nil
  end

  ##
  # Register all the subcommands supported by the gem command.

  def initialize
    require "timeout"
    @commands = {}

    BUILTIN_COMMANDS.each do |name|
      register_command name
    end
  end

  ##
  # Register the Symbol +command+ as a gem command.

  def register_command(command, obj=false)
    @commands[command] = obj
  end

  ##
  # Unregister the Symbol +command+ as a gem command.

  def unregister_command(command)
    @commands.delete command
  end

  ##
  # Returns a Command instance for +command_name+

  def [](command_name)
    command_name = command_name.intern
    return nil if @commands[command_name].nil?
    @commands[command_name] ||= load_and_instantiate(command_name)
  end

  ##
  # Return a sorted list of all command names as strings.

  def command_names
    @commands.keys.collect {|key| key.to_s }.sort
  end

  ##
  # Run the command specified by +args+.

  def run(args, build_args=nil)
    process_args(args, build_args)
  rescue StandardError, Timeout::Error => ex
    if ex.respond_to?(:detailed_message)
      msg = ex.detailed_message(highlight: false).sub(/\A(.*?)(?: \(.+?\))/) { $1 }
    else
      msg = ex.message
    end
    alert_error clean_text("While executing gem ... (#{ex.class})\n    #{msg}")
    ui.backtrace ex

    terminate_interaction(1)
  rescue Interrupt
    alert_error clean_text("Interrupted")
    terminate_interaction(1)
  end

  def process_args(args, build_args=nil)
    if args.empty?
      say Gem::Command::HELP
      terminate_interaction 1
    end

    case args.first
    when "-h", "--help" then
      say Gem::Command::HELP
      terminate_interaction 0
    when "-v", "--version" then
      say Gem::VERSION
      terminate_interaction 0
    when /^-/ then
      alert_error clean_text("Invalid option: #{args.first}. See 'gem --help'.")
      terminate_interaction 1
    else
      cmd_name = args.shift.downcase
      cmd = find_command cmd_name
      cmd.deprecation_warning if cmd.deprecated?
      cmd.invoke_with_build_args args, build_args
    end
  end

  def find_command(cmd_name)
    cmd_name = find_alias_command cmd_name

    possibilities = find_command_possibilities cmd_name

    if possibilities.size > 1
      raise Gem::CommandLineError,
            "Ambiguous command #{cmd_name} matches [#{possibilities.join(', ')}]"
    elsif possibilities.empty?
      raise Gem::UnknownCommandError.new(cmd_name)
    end

    self[possibilities.first]
  end

  def find_alias_command(cmd_name)
    alias_name = ALIAS_COMMANDS[cmd_name]
    alias_name ? alias_name : cmd_name
  end

  def find_command_possibilities(cmd_name)
    len = cmd_name.length

    found = command_names.select {|name| cmd_name == name[0, len] }

    exact = found.find {|name| name == cmd_name }

    exact ? [exact] : found
  end

  private

  def load_and_instantiate(command_name)
    command_name = command_name.to_s
    const_name = command_name.capitalize.gsub(/_(.)/) { $1.upcase } << "Command"
    load_error = nil

    begin
      begin
        require "rubygems/commands/#{command_name}_command"
      rescue LoadError => e
        load_error = e
      end
      Gem::Commands.const_get(const_name).new
    rescue Exception => e
      e = load_error if load_error

      alert_error clean_text("Loading command: #{command_name} (#{e.class})\n\t#{e}")
      ui.backtrace e
    end
  end
end
PK}$[�n1ABB$rubygems/rubygems/install_message.rbnu�[���# frozen_string_literal: true
require_relative "../rubygems"
require_relative "user_interaction"

##
# A default post-install hook that displays "Successfully installed
# some_gem-1.0"

Gem.post_install do |installer|
  ui = Gem::DefaultUserInteraction.ui
  ui.say "Successfully installed #{installer.spec.full_name}"
end
PK}$[���1..rubygems/rubygems/gem_runner.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require_relative "../rubygems"
require_relative "command_manager"
require_relative "deprecate"

##
# Run an instance of the gem program.
#
# Gem::GemRunner is only intended for internal use by RubyGems itself.  It
# does not form any public API and may change at any time for any reason.
#
# If you would like to duplicate functionality of `gem` commands, use the
# classes they call directly.

class Gem::GemRunner
  def initialize
    @command_manager_class = Gem::CommandManager
    @config_file_class = Gem::ConfigFile
  end

  ##
  # Run the gem command with the following arguments.

  def run(args)
    build_args = extract_build_args args

    do_configuration args

    Gem.load_env_plugins rescue nil
    Gem.load_plugins

    cmd = @command_manager_class.instance

    cmd.command_names.each do |command_name|
      config_args = Gem.configuration[command_name]
      config_args = case config_args
      when String
        config_args.split " "
      else
        Array(config_args)
      end
      Gem::Command.add_specific_extra_args command_name, config_args
    end

    cmd.run Gem.configuration.args, build_args
  end

  ##
  # Separates the build arguments (those following <code>--</code>) from the
  # other arguments in the list.

  def extract_build_args(args) # :nodoc:
    return [] unless offset = args.index("--")

    build_args = args.slice!(offset...args.length)

    build_args.shift

    build_args
  end

  private

  def do_configuration(args)
    Gem.configuration = @config_file_class.new(args)
    Gem.use_paths Gem.configuration[:gemhome], Gem.configuration[:gempath]
    Gem::Command.extra_args = Gem.configuration[:gem]
  end
end
PK}$[yy�##!rubygems/rubygems/path_support.rbnu�[���# frozen_string_literal: true
##
#
# Gem::PathSupport facilitates the GEM_HOME and GEM_PATH environment settings
# to the rest of RubyGems.
#
class Gem::PathSupport
  ##
  # The default system path for managing Gems.
  attr_reader :home

  ##
  # Array of paths to search for Gems.
  attr_reader :path

  ##
  # Directory with spec cache
  attr_reader :spec_cache_dir # :nodoc:

  ##
  #
  # Constructor. Takes a single argument which is to be treated like a
  # hashtable, or defaults to ENV, the system environment.
  #
  def initialize(env)
    @home = env["GEM_HOME"] || Gem.default_dir

    if File::ALT_SEPARATOR
      @home = @home.gsub(File::ALT_SEPARATOR, File::SEPARATOR)
    end

    @home = expand(@home)

    @path = split_gem_path env["GEM_PATH"], @home

    @spec_cache_dir = env["GEM_SPEC_CACHE"] || Gem.default_spec_cache_dir

    @spec_cache_dir = @spec_cache_dir.dup.tap(&Gem::UNTAINT)
  end

  private

  ##
  # Split the Gem search path (as reported by Gem.path).

  def split_gem_path(gpaths, home)
    # FIX: it should be [home, *path], not [*path, home]

    gem_path = []

    if gpaths
      gem_path = gpaths.split(Gem.path_separator)
      # Handle the path_separator being set to a regexp, which will cause
      # end_with? to error
      if gpaths =~ /#{Gem.path_separator}\z/
        gem_path += default_path
      end

      if File::ALT_SEPARATOR
        gem_path.map! do |this_path|
          this_path.gsub File::ALT_SEPARATOR, File::SEPARATOR
        end
      end

      gem_path << home
    else
      gem_path = default_path
    end

    gem_path.map {|path| expand(path) }.uniq
  end

  # Return the default Gem path
  def default_path
    Gem.default_path + [@home]
  end

  def expand(path)
    if File.directory?(path)
      File.realpath(path)
    else
      path
    end
  end
end
PK}$[�4��b"b"rubygems/rubygems/request.rbnu�[���# frozen_string_literal: true
require "net/http"
require_relative "user_interaction"

class Gem::Request
  extend Gem::UserInteraction
  include Gem::UserInteraction

  ###
  # Legacy.  This is used in tests.
  def self.create_with_proxy(uri, request_class, last_modified, proxy) # :nodoc:
    cert_files = get_cert_files
    proxy ||= get_proxy_from_env(uri.scheme)
    pool = ConnectionPools.new proxy_uri(proxy), cert_files

    new(uri, request_class, last_modified, pool.pool_for(uri))
  end

  def self.proxy_uri(proxy) # :nodoc:
    require "uri"
    case proxy
    when :no_proxy then nil
    when URI::HTTP then proxy
    else URI.parse(proxy)
    end
  end

  def initialize(uri, request_class, last_modified, pool)
    @uri = uri
    @request_class = request_class
    @last_modified = last_modified
    @requests = Hash.new 0
    @user_agent = user_agent

    @connection_pool = pool
  end

  def proxy_uri; @connection_pool.proxy_uri; end
  def cert_files; @connection_pool.cert_files; end

  def self.get_cert_files
    pattern = File.expand_path("./ssl_certs/*/*.pem", __dir__)
    Dir.glob(pattern)
  end

  def self.configure_connection_for_https(connection, cert_files)
    raise Gem::Exception.new("OpenSSL is not available. Install OpenSSL and rebuild Ruby (preferred) or use non-HTTPS sources") unless Gem::HAVE_OPENSSL

    connection.use_ssl = true
    connection.verify_mode =
      Gem.configuration.ssl_verify_mode || OpenSSL::SSL::VERIFY_PEER
    store = OpenSSL::X509::Store.new

    if Gem.configuration.ssl_client_cert
      pem = File.read Gem.configuration.ssl_client_cert
      connection.cert = OpenSSL::X509::Certificate.new pem
      connection.key = OpenSSL::PKey::RSA.new pem
    end

    store.set_default_paths
    cert_files.each do |ssl_cert_file|
      store.add_file ssl_cert_file
    end
    if Gem.configuration.ssl_ca_cert
      if File.directory? Gem.configuration.ssl_ca_cert
        store.add_path Gem.configuration.ssl_ca_cert
      else
        store.add_file Gem.configuration.ssl_ca_cert
      end
    end
    connection.cert_store = store

    connection.verify_callback = proc do |preverify_ok, store_context|
      verify_certificate store_context unless preverify_ok

      preverify_ok
    end

    connection
  end

  def self.verify_certificate(store_context)
    depth  = store_context.error_depth
    error  = store_context.error_string
    number = store_context.error
    cert   = store_context.current_cert

    ui.alert_error "SSL verification error at depth #{depth}: #{error} (#{number})"

    extra_message = verify_certificate_message number, cert

    ui.alert_error extra_message if extra_message
  end

  def self.verify_certificate_message(error_number, cert)
    return unless cert
    case error_number
    when OpenSSL::X509::V_ERR_CERT_HAS_EXPIRED then
      require "time"
      "Certificate #{cert.subject} expired at #{cert.not_after.iso8601}"
    when OpenSSL::X509::V_ERR_CERT_NOT_YET_VALID then
      require "time"
      "Certificate #{cert.subject} not valid until #{cert.not_before.iso8601}"
    when OpenSSL::X509::V_ERR_CERT_REJECTED then
      "Certificate #{cert.subject} is rejected"
    when OpenSSL::X509::V_ERR_CERT_UNTRUSTED then
      "Certificate #{cert.subject} is not trusted"
    when OpenSSL::X509::V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT then
      "Certificate #{cert.issuer} is not trusted"
    when OpenSSL::X509::V_ERR_INVALID_CA then
      "Certificate #{cert.subject} is an invalid CA certificate"
    when OpenSSL::X509::V_ERR_INVALID_PURPOSE then
      "Certificate #{cert.subject} has an invalid purpose"
    when OpenSSL::X509::V_ERR_SELF_SIGNED_CERT_IN_CHAIN then
      "Root certificate is not trusted (#{cert.subject})"
    when OpenSSL::X509::V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY then
      "You must add #{cert.issuer} to your local trusted store"
    when
      OpenSSL::X509::V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE then
      "Cannot verify certificate issued by #{cert.issuer}"
    end
  end

  ##
  # Creates or an HTTP connection based on +uri+, or retrieves an existing
  # connection, using a proxy if needed.

  def connection_for(uri)
    @connection_pool.checkout
  rescue Gem::HAVE_OPENSSL ? OpenSSL::SSL::SSLError : Errno::EHOSTDOWN,
         Errno::EHOSTDOWN => e
    raise Gem::RemoteFetcher::FetchError.new(e.message, uri)
  end

  def fetch
    request = @request_class.new @uri.request_uri

    unless @uri.nil? || @uri.user.nil? || @uri.user.empty?
      request.basic_auth Gem::UriFormatter.new(@uri.user).unescape,
                         Gem::UriFormatter.new(@uri.password).unescape
    end

    request.add_field "User-Agent", @user_agent
    request.add_field "Connection", "keep-alive"
    request.add_field "Keep-Alive", "30"

    if @last_modified
      require "time"
      request.add_field "If-Modified-Since", @last_modified.httpdate
    end

    yield request if block_given?

    perform_request request
  end

  ##
  # Returns a proxy URI for the given +scheme+ if one is set in the
  # environment variables.

  def self.get_proxy_from_env(scheme = "http")
    _scheme = scheme.downcase
    _SCHEME = scheme.upcase
    env_proxy = ENV["#{_scheme}_proxy"] || ENV["#{_SCHEME}_PROXY"]

    no_env_proxy = env_proxy.nil? || env_proxy.empty?

    if no_env_proxy
      return (_scheme == "https" || _scheme == "http") ?
        :no_proxy : get_proxy_from_env("http")
    end

    require "uri"
    uri = URI(Gem::UriFormatter.new(env_proxy).normalize)

    if uri && uri.user.nil? && uri.password.nil?
      user     = ENV["#{_scheme}_proxy_user"] || ENV["#{_SCHEME}_PROXY_USER"]
      password = ENV["#{_scheme}_proxy_pass"] || ENV["#{_SCHEME}_PROXY_PASS"]

      uri.user     = Gem::UriFormatter.new(user).escape
      uri.password = Gem::UriFormatter.new(password).escape
    end

    uri
  end

  def perform_request(request) # :nodoc:
    connection = connection_for @uri

    retried = false
    bad_response = false

    begin
      @requests[connection.object_id] += 1

      verbose "#{request.method} #{Gem::Uri.redact(@uri)}"

      file_name = File.basename(@uri.path)
      # perform download progress reporter only for gems
      if request.response_body_permitted? && file_name =~ /\.gem$/
        reporter = ui.download_reporter
        response = connection.request(request) do |incomplete_response|
          if Net::HTTPOK === incomplete_response
            reporter.fetch(file_name, incomplete_response.content_length)
            downloaded = 0
            data = String.new

            incomplete_response.read_body do |segment|
              data << segment
              downloaded += segment.length
              reporter.update(downloaded)
            end
            reporter.done
            if incomplete_response.respond_to? :body=
              incomplete_response.body = data
            else
              incomplete_response.instance_variable_set(:@body, data)
            end
          end
        end
      else
        response = connection.request request
      end

      verbose "#{response.code} #{response.message}"

    rescue Net::HTTPBadResponse
      verbose "bad response"

      reset connection

      raise Gem::RemoteFetcher::FetchError.new("too many bad responses", @uri) if bad_response

      bad_response = true
      retry
    rescue Net::HTTPFatalError
      verbose "fatal error"

      raise Gem::RemoteFetcher::FetchError.new("fatal error", @uri)
    # HACK work around EOFError bug in Net::HTTP
    # NOTE Errno::ECONNABORTED raised a lot on Windows, and make impossible
    # to install gems.
    rescue EOFError, Timeout::Error,
           Errno::ECONNABORTED, Errno::ECONNRESET, Errno::EPIPE

      requests = @requests[connection.object_id]
      verbose "connection reset after #{requests} requests, retrying"

      raise Gem::RemoteFetcher::FetchError.new("too many connection resets", @uri) if retried

      reset connection

      retried = true
      retry
    end

    response
  ensure
    @connection_pool.checkin connection
  end

  ##
  # Resets HTTP connection +connection+.

  def reset(connection)
    @requests.delete connection.object_id

    connection.finish
    connection.start
  end

  def user_agent
    ua = "RubyGems/#{Gem::VERSION} #{Gem::Platform.local}".dup

    ruby_version = RUBY_VERSION
    ruby_version += "dev" if RUBY_PATCHLEVEL == -1

    ua << " Ruby/#{ruby_version} (#{RUBY_RELEASE_DATE}"
    if RUBY_PATCHLEVEL >= 0
      ua << " patchlevel #{RUBY_PATCHLEVEL}"
    elsif defined?(RUBY_REVISION)
      ua << " revision #{RUBY_REVISION}"
    end
    ua << ")"

    ua << " #{RUBY_ENGINE}" if RUBY_ENGINE != "ruby"

    ua
  end
end

require_relative "request/http_pool"
require_relative "request/https_pool"
require_relative "request/connection_pools"
PK}$[ђSÛ�2rubygems/rubygems/unknown_command_spell_checker.rbnu�[���# frozen_string_literal: true

class Gem::UnknownCommandSpellChecker
  attr_reader :error

  def initialize(error)
    @error = error
  end

  def corrections
    @corrections ||=
      spell_checker.correct(error.unknown_command).map(&:inspect)
  end

  private

  def spell_checker
    dictionary = Gem::CommandManager.instance.command_names
    DidYouMean::SpellChecker.new(dictionary: dictionary)
  end
end
PK}$[L��;;.rubygems/rubygems/optparse/lib/optionparser.rbnu�[���# frozen_string_literal: false
require_relative 'optparse'
PK}$[#d��2rubygems/rubygems/optparse/lib/optparse/version.rbnu�[���# frozen_string_literal: false
# Gem::OptionParser internal utility

class << Gem::OptionParser
  def show_version(*pkgs)
    progname = ARGV.options.program_name
    result = false
    show = proc do |klass, cname, version|
      str = "#{progname}"
      unless klass == ::Object and cname == :VERSION
        version = version.join(".") if Array === version
        str << ": #{klass}" unless klass == Object
        str << " version #{version}"
      end
      [:Release, :RELEASE].find do |rel|
        if klass.const_defined?(rel)
          str << " (#{klass.const_get(rel)})"
        end
      end
      puts str
      result = true
    end
    if pkgs.size == 1 and pkgs[0] == "all"
      self.search_const(::Object, /\AV(?:ERSION|ersion)\z/) do |klass, cname, version|
        unless cname[1] == ?e and klass.const_defined?(:Version)
          show.call(klass, cname.intern, version)
        end
      end
    else
      pkgs.each do |pkg|
        begin
          pkg = pkg.split(/::|\//).inject(::Object) {|m, c| m.const_get(c)}
          v = case
              when pkg.const_defined?(:Version)
                pkg.const_get(n = :Version)
              when pkg.const_defined?(:VERSION)
                pkg.const_get(n = :VERSION)
              else
                n = nil
                "unknown"
              end
          show.call(pkg, n, v)
        rescue NameError
        end
      end
    end
    result
  end

  def each_const(path, base = ::Object)
    path.split(/::|\//).inject(base) do |klass, name|
      raise NameError, path unless Module === klass
      klass.constants.grep(/#{name}/i) do |c|
        klass.const_defined?(c) or next
        klass.const_get(c)
      end
    end
  end

  def search_const(klass, name)
    klasses = [klass]
    while klass = klasses.shift
      klass.constants.each do |cname|
        klass.const_defined?(cname) or next
        const = klass.const_get(cname)
        yield klass, cname, const if name === cname
        klasses << const if Module === const and const != ::Object
      end
    end
  end
end
PK}$[ý�''1rubygems/rubygems/optparse/lib/optparse/kwargs.rbnu�[���# frozen_string_literal: true
require_relative '../optparse'

class Gem::OptionParser
  # :call-seq:
  #   define_by_keywords(options, method, **params)
  #
  # :include: ../../doc/optparse/creates_option.rdoc
  #
  def define_by_keywords(options, meth, **opts)
    meth.parameters.each do |type, name|
      case type
      when :key, :keyreq
        op, cl = *(type == :key ? %w"[ ]" : ["", ""])
        define("--#{name}=#{op}#{name.upcase}#{cl}", *opts[name]) do |o|
          options[name] = o
        end
      end
    end
    options
  end
end
PK}$[�m��.rubygems/rubygems/optparse/lib/optparse/uri.rbnu�[���# frozen_string_literal: false
# -*- ruby -*-

require_relative '../optparse'
require 'uri'

Gem::OptionParser.accept(URI) {|s,| URI.parse(s) if s}
PK}$["�j���5rubygems/rubygems/optparse/lib/optparse/shellwords.rbnu�[���# frozen_string_literal: false
# -*- ruby -*-

require 'shellwords'
require_relative '../optparse'

Gem::OptionParser.accept(Shellwords) {|s,| Shellwords.shellwords(s)}
PK}$[O����/rubygems/rubygems/optparse/lib/optparse/date.rbnu�[���# frozen_string_literal: false
require_relative '../optparse'
require 'date'

Gem::OptionParser.accept(DateTime) do |s,|
  begin
    DateTime.parse(s) if s
  rescue ArgumentError
    raise Gem::OptionParser::InvalidArgument, s
  end
end
Gem::OptionParser.accept(Date) do |s,|
  begin
    Date.parse(s) if s
  rescue ArgumentError
    raise Gem::OptionParser::InvalidArgument, s
  end
end
PK}$[�.U��/rubygems/rubygems/optparse/lib/optparse/time.rbnu�[���# frozen_string_literal: false
require_relative '../optparse'
require 'time'

Gem::OptionParser.accept(Time) do |s,|
  begin
    (Time.httpdate(s) rescue Time.parse(s)) if s
  rescue
    raise Gem::OptionParser::InvalidArgument, s
  end
end
PK}$[��X$$-rubygems/rubygems/optparse/lib/optparse/ac.rbnu�[���# frozen_string_literal: false
require_relative '../optparse'

class Gem::OptionParser::AC < Gem::OptionParser
  private

  def _check_ac_args(name, block)
    unless /\A\w[-\w]*\z/ =~ name
      raise ArgumentError, name
    end
    unless block
      raise ArgumentError, "no block given", ParseError.filter_backtrace(caller)
    end
  end

  ARG_CONV = proc {|val| val.nil? ? true : val}

  def _ac_arg_enable(prefix, name, help_string, block)
    _check_ac_args(name, block)

    sdesc = []
    ldesc = ["--#{prefix}-#{name}"]
    desc = [help_string]
    q = name.downcase
    ac_block = proc {|val| block.call(ARG_CONV.call(val))}
    enable = Switch::PlacedArgument.new(nil, ARG_CONV, sdesc, ldesc, nil, desc, ac_block)
    disable = Switch::NoArgument.new(nil, proc {false}, sdesc, ldesc, nil, desc, ac_block)
    top.append(enable, [], ["enable-" + q], disable, ['disable-' + q])
    enable
  end

  public

  def ac_arg_enable(name, help_string, &block)
    _ac_arg_enable("enable", name, help_string, block)
  end

  def ac_arg_disable(name, help_string, &block)
    _ac_arg_enable("disable", name, help_string, block)
  end

  def ac_arg_with(name, help_string, &block)
    _check_ac_args(name, block)

    sdesc = []
    ldesc = ["--with-#{name}"]
    desc = [help_string]
    q = name.downcase
    with = Switch::PlacedArgument.new(*search(:atype, String), sdesc, ldesc, nil, desc, block)
    without = Switch::NoArgument.new(nil, proc {}, sdesc, ldesc, nil, desc, block)
    top.append(with, [], ["with-" + q], without, ['without-' + q])
    with
  end
end
PK}$[�\������*rubygems/rubygems/optparse/lib/optparse.rbnu�[���# frozen_string_literal: true
#
# optparse.rb - command-line option analysis with the Gem::OptionParser class.
#
# Author:: Nobu Nakada
# Documentation:: Nobu Nakada and Gavin Sinclair.
#
# See Gem::OptionParser for documentation.
#


#--
# == Developer Documentation (not for RDoc output)
#
# === Class tree
#
# - Gem::OptionParser:: front end
# - Gem::OptionParser::Switch:: each switches
# - Gem::OptionParser::List:: options list
# - Gem::OptionParser::ParseError:: errors on parsing
#   - Gem::OptionParser::AmbiguousOption
#   - Gem::OptionParser::NeedlessArgument
#   - Gem::OptionParser::MissingArgument
#   - Gem::OptionParser::InvalidOption
#   - Gem::OptionParser::InvalidArgument
#     - Gem::OptionParser::AmbiguousArgument
#
# === Object relationship diagram
#
#   +--------------+
#   | Gem::OptionParser |<>-----+
#   +--------------+       |                      +--------+
#                          |                    ,-| Switch |
#        on_head -------->+---------------+    /  +--------+
#        accept/reject -->| List          |<|>-
#                         |               |<|>-  +----------+
#        on ------------->+---------------+    `-| argument |
#                           :           :        |  class   |
#                         +---------------+      |==========|
#        on_tail -------->|               |      |pattern   |
#                         +---------------+      |----------|
#   Gem::OptionParser.accept ->| DefaultList   |      |converter |
#                reject   |(shared between|      +----------+
#                         | all instances)|
#                         +---------------+
#
#++
#
# == Gem::OptionParser
#
# === New to \Gem::OptionParser?
#
# See the {Tutorial}[optparse/tutorial.rdoc].
#
# === Introduction
#
# Gem::OptionParser is a class for command-line option analysis.  It is much more
# advanced, yet also easier to use, than GetoptLong, and is a more Ruby-oriented
# solution.
#
# === Features
#
# 1. The argument specification and the code to handle it are written in the
#    same place.
# 2. It can output an option summary; you don't need to maintain this string
#    separately.
# 3. Optional and mandatory arguments are specified very gracefully.
# 4. Arguments can be automatically converted to a specified class.
# 5. Arguments can be restricted to a certain set.
#
# All of these features are demonstrated in the examples below.  See
# #make_switch for full documentation.
#
# === Minimal example
#
#   require 'rubygems/optparse/lib/optparse'
#
#   options = {}
#   Gem::OptionParser.new do |parser|
#     parser.banner = "Usage: example.rb [options]"
#
#     parser.on("-v", "--[no-]verbose", "Run verbosely") do |v|
#       options[:verbose] = v
#     end
#   end.parse!
#
#   p options
#   p ARGV
#
# === Generating Help
#
# Gem::OptionParser can be used to automatically generate help for the commands you
# write:
#
#   require 'rubygems/optparse/lib/optparse'
#
#   Options = Struct.new(:name)
#
#   class Parser
#     def self.parse(options)
#       args = Options.new("world")
#
#       opt_parser = Gem::OptionParser.new do |parser|
#         parser.banner = "Usage: example.rb [options]"
#
#         parser.on("-nNAME", "--name=NAME", "Name to say hello to") do |n|
#           args.name = n
#         end
#
#         parser.on("-h", "--help", "Prints this help") do
#           puts parser
#           exit
#         end
#       end
#
#       opt_parser.parse!(options)
#       return args
#     end
#   end
#   options = Parser.parse %w[--help]
#
#   #=>
#      # Usage: example.rb [options]
#      #     -n, --name=NAME                  Name to say hello to
#      #     -h, --help                       Prints this help
#
# === Required Arguments
#
# For options that require an argument, option specification strings may include an
# option name in all caps. If an option is used without the required argument,
# an exception will be raised.
#
#   require 'rubygems/optparse/lib/optparse'
#
#   options = {}
#   Gem::OptionParser.new do |parser|
#     parser.on("-r", "--require LIBRARY",
#               "Require the LIBRARY before executing your script") do |lib|
#       puts "You required #{lib}!"
#     end
#   end.parse!
#
# Used:
#
#   $ ruby optparse-test.rb -r
#   optparse-test.rb:9:in `<main>': missing argument: -r (Gem::OptionParser::MissingArgument)
#   $ ruby optparse-test.rb -r my-library
#   You required my-library!
#
# === Type Coercion
#
# Gem::OptionParser supports the ability to coerce command line arguments
# into objects for us.
#
# Gem::OptionParser comes with a few ready-to-use kinds of  type
# coercion. They are:
#
# - Date  -- Anything accepted by +Date.parse+
# - DateTime -- Anything accepted by +DateTime.parse+
# - Time -- Anything accepted by +Time.httpdate+ or +Time.parse+
# - URI  -- Anything accepted by +URI.parse+
# - Shellwords -- Anything accepted by +Shellwords.shellwords+
# - String -- Any non-empty string
# - Integer -- Any integer. Will convert octal. (e.g. 124, -3, 040)
# - Float -- Any float. (e.g. 10, 3.14, -100E+13)
# - Numeric -- Any integer, float, or rational (1, 3.4, 1/3)
# - DecimalInteger -- Like +Integer+, but no octal format.
# - OctalInteger -- Like +Integer+, but no decimal format.
# - DecimalNumeric -- Decimal integer or float.
# - TrueClass --  Accepts '+, yes, true, -, no, false' and
#   defaults as +true+
# - FalseClass -- Same as +TrueClass+, but defaults to +false+
# - Array -- Strings separated by ',' (e.g. 1,2,3)
# - Regexp -- Regular expressions. Also includes options.
#
# We can also add our own coercions, which we will cover below.
#
# ==== Using Built-in Conversions
#
# As an example, the built-in +Time+ conversion is used. The other built-in
# conversions behave in the same way.
# Gem::OptionParser will attempt to parse the argument
# as a +Time+. If it succeeds, that time will be passed to the
# handler block. Otherwise, an exception will be raised.
#
#   require 'rubygems/optparse/lib/optparse'
#   require 'rubygems/optparse/lib/optparse/time'
#   Gem::OptionParser.new do |parser|
#     parser.on("-t", "--time [TIME]", Time, "Begin execution at given time") do |time|
#       p time
#     end
#   end.parse!
#
# Used:
#
#   $ ruby optparse-test.rb  -t nonsense
#   ... invalid argument: -t nonsense (Gem::OptionParser::InvalidArgument)
#   $ ruby optparse-test.rb  -t 10-11-12
#   2010-11-12 00:00:00 -0500
#   $ ruby optparse-test.rb  -t 9:30
#   2014-08-13 09:30:00 -0400
#
# ==== Creating Custom Conversions
#
# The +accept+ method on Gem::OptionParser may be used to create converters.
# It specifies which conversion block to call whenever a class is specified.
# The example below uses it to fetch a +User+ object before the +on+ handler receives it.
#
#   require 'rubygems/optparse/lib/optparse'
#
#   User = Struct.new(:id, :name)
#
#   def find_user id
#     not_found = ->{ raise "No User Found for id #{id}" }
#     [ User.new(1, "Sam"),
#       User.new(2, "Gandalf") ].find(not_found) do |u|
#       u.id == id
#     end
#   end
#
#   op = Gem::OptionParser.new
#   op.accept(User) do |user_id|
#     find_user user_id.to_i
#   end
#
#   op.on("--user ID", User) do |user|
#     puts user
#   end
#
#   op.parse!
#
# Used:
#
#   $ ruby optparse-test.rb --user 1
#   #<struct User id=1, name="Sam">
#   $ ruby optparse-test.rb --user 2
#   #<struct User id=2, name="Gandalf">
#   $ ruby optparse-test.rb --user 3
#   optparse-test.rb:15:in `block in find_user': No User Found for id 3 (RuntimeError)
#
# === Store options to a Hash
#
# The +into+ option of +order+, +parse+ and so on methods stores command line options into a Hash.
#
#   require 'rubygems/optparse/lib/optparse'
#
#   options = {}
#   Gem::OptionParser.new do |parser|
#     parser.on('-a')
#     parser.on('-b NUM', Integer)
#     parser.on('-v', '--verbose')
#   end.parse!(into: options)
#
#   p options
#
# Used:
#
#   $ ruby optparse-test.rb -a
#   {:a=>true}
#   $ ruby optparse-test.rb -a -v
#   {:a=>true, :verbose=>true}
#   $ ruby optparse-test.rb -a -b 100
#   {:a=>true, :b=>100}
#
# === Complete example
#
# The following example is a complete Ruby program.  You can run it and see the
# effect of specifying various options.  This is probably the best way to learn
# the features of +optparse+.
#
#   require 'rubygems/optparse/lib/optparse'
#   require 'rubygems/optparse/lib/optparse/time'
#   require 'ostruct'
#   require 'pp'
#
#   class OptparseExample
#     Version = '1.0.0'
#
#     CODES = %w[iso-2022-jp shift_jis euc-jp utf8 binary]
#     CODE_ALIASES = { "jis" => "iso-2022-jp", "sjis" => "shift_jis" }
#
#     class ScriptOptions
#       attr_accessor :library, :inplace, :encoding, :transfer_type,
#                     :verbose, :extension, :delay, :time, :record_separator,
#                     :list
#
#       def initialize
#         self.library = []
#         self.inplace = false
#         self.encoding = "utf8"
#         self.transfer_type = :auto
#         self.verbose = false
#       end
#
#       def define_options(parser)
#         parser.banner = "Usage: example.rb [options]"
#         parser.separator ""
#         parser.separator "Specific options:"
#
#         # add additional options
#         perform_inplace_option(parser)
#         delay_execution_option(parser)
#         execute_at_time_option(parser)
#         specify_record_separator_option(parser)
#         list_example_option(parser)
#         specify_encoding_option(parser)
#         optional_option_argument_with_keyword_completion_option(parser)
#         boolean_verbose_option(parser)
#
#         parser.separator ""
#         parser.separator "Common options:"
#         # No argument, shows at tail.  This will print an options summary.
#         # Try it and see!
#         parser.on_tail("-h", "--help", "Show this message") do
#           puts parser
#           exit
#         end
#         # Another typical switch to print the version.
#         parser.on_tail("--version", "Show version") do
#           puts Version
#           exit
#         end
#       end
#
#       def perform_inplace_option(parser)
#         # Specifies an optional option argument
#         parser.on("-i", "--inplace [EXTENSION]",
#                   "Edit ARGV files in place",
#                   "(make backup if EXTENSION supplied)") do |ext|
#           self.inplace = true
#           self.extension = ext || ''
#           self.extension.sub!(/\A\.?(?=.)/, ".")  # Ensure extension begins with dot.
#         end
#       end
#
#       def delay_execution_option(parser)
#         # Cast 'delay' argument to a Float.
#         parser.on("--delay N", Float, "Delay N seconds before executing") do |n|
#           self.delay = n
#         end
#       end
#
#       def execute_at_time_option(parser)
#         # Cast 'time' argument to a Time object.
#         parser.on("-t", "--time [TIME]", Time, "Begin execution at given time") do |time|
#           self.time = time
#         end
#       end
#
#       def specify_record_separator_option(parser)
#         # Cast to octal integer.
#         parser.on("-F", "--irs [OCTAL]", Gem::OptionParser::OctalInteger,
#                   "Specify record separator (default \\0)") do |rs|
#           self.record_separator = rs
#         end
#       end
#
#       def list_example_option(parser)
#         # List of arguments.
#         parser.on("--list x,y,z", Array, "Example 'list' of arguments") do |list|
#           self.list = list
#         end
#       end
#
#       def specify_encoding_option(parser)
#         # Keyword completion.  We are specifying a specific set of arguments (CODES
#         # and CODE_ALIASES - notice the latter is a Hash), and the user may provide
#         # the shortest unambiguous text.
#         code_list = (CODE_ALIASES.keys + CODES).join(', ')
#         parser.on("--code CODE", CODES, CODE_ALIASES, "Select encoding",
#                   "(#{code_list})") do |encoding|
#           self.encoding = encoding
#         end
#       end
#
#       def optional_option_argument_with_keyword_completion_option(parser)
#         # Optional '--type' option argument with keyword completion.
#         parser.on("--type [TYPE]", [:text, :binary, :auto],
#                   "Select transfer type (text, binary, auto)") do |t|
#           self.transfer_type = t
#         end
#       end
#
#       def boolean_verbose_option(parser)
#         # Boolean switch.
#         parser.on("-v", "--[no-]verbose", "Run verbosely") do |v|
#           self.verbose = v
#         end
#       end
#     end
#
#     #
#     # Return a structure describing the options.
#     #
#     def parse(args)
#       # The options specified on the command line will be collected in
#       # *options*.
#
#       @options = ScriptOptions.new
#       @args = Gem::OptionParser.new do |parser|
#         @options.define_options(parser)
#         parser.parse!(args)
#       end
#       @options
#     end
#
#     attr_reader :parser, :options
#   end  # class OptparseExample
#
#   example = OptparseExample.new
#   options = example.parse(ARGV)
#   pp options # example.options
#   pp ARGV
#
# === Shell Completion
#
# For modern shells (e.g. bash, zsh, etc.), you can use shell
# completion for command line options.
#
# === Further documentation
#
# The above examples, along with the accompanying
# {Tutorial}[optparse/tutorial.rdoc],
# should be enough to learn how to use this class.
# If you have any questions, file a ticket at http://bugs.ruby-lang.org.
#
class Gem::OptionParser
  Gem::OptionParser::Version = "0.2.0"

  # :stopdoc:
  NoArgument = [NO_ARGUMENT = :NONE, nil].freeze
  RequiredArgument = [REQUIRED_ARGUMENT = :REQUIRED, true].freeze
  OptionalArgument = [OPTIONAL_ARGUMENT = :OPTIONAL, false].freeze
  # :startdoc:

  #
  # Keyword completion module.  This allows partial arguments to be specified
  # and resolved against a list of acceptable values.
  #
  module Completion
    def self.regexp(key, icase)
      Regexp.new('\A' + Regexp.quote(key).gsub(/\w+\b/, '\&\w*'), icase)
    end

    def self.candidate(key, icase = false, pat = nil, &block)
      pat ||= Completion.regexp(key, icase)
      candidates = []
      block.call do |k, *v|
        (if Regexp === k
           kn = ""
           k === key
         else
           kn = defined?(k.id2name) ? k.id2name : k
           pat === kn
         end) or next
        v << k if v.empty?
        candidates << [k, v, kn]
      end
      candidates
    end

    def candidate(key, icase = false, pat = nil)
      Completion.candidate(key, icase, pat, &method(:each))
    end

    public
    def complete(key, icase = false, pat = nil)
      candidates = candidate(key, icase, pat, &method(:each)).sort_by {|k, v, kn| kn.size}
      if candidates.size == 1
        canon, sw, * = candidates[0]
      elsif candidates.size > 1
        canon, sw, cn = candidates.shift
        candidates.each do |k, v, kn|
          next if sw == v
          if String === cn and String === kn
            if cn.rindex(kn, 0)
              canon, sw, cn = k, v, kn
              next
            elsif kn.rindex(cn, 0)
              next
            end
          end
          throw :ambiguous, key
        end
      end
      if canon
        block_given? or return key, *sw
        yield(key, *sw)
      end
    end

    def convert(opt = nil, val = nil, *)
      val
    end
  end


  #
  # Map from option/keyword string to object with completion.
  #
  class OptionMap < Hash
    include Completion
  end


  #
  # Individual switch class.  Not important to the user.
  #
  # Defined within Switch are several Switch-derived classes: NoArgument,
  # RequiredArgument, etc.
  #
  class Switch
    attr_reader :pattern, :conv, :short, :long, :arg, :desc, :block

    #
    # Guesses argument style from +arg+.  Returns corresponding
    # Gem::OptionParser::Switch class (OptionalArgument, etc.).
    #
    def self.guess(arg)
      case arg
      when ""
        t = self
      when /\A=?\[/
        t = Switch::OptionalArgument
      when /\A\s+\[/
        t = Switch::PlacedArgument
      else
        t = Switch::RequiredArgument
      end
      self >= t or incompatible_argument_styles(arg, t)
      t
    end

    def self.incompatible_argument_styles(arg, t)
      raise(ArgumentError, "#{arg}: incompatible argument styles\n  #{self}, #{t}",
            ParseError.filter_backtrace(caller(2)))
    end

    def self.pattern
      NilClass
    end

    def initialize(pattern = nil, conv = nil,
                   short = nil, long = nil, arg = nil,
                   desc = ([] if short or long), block = nil, &_block)
      raise if Array === pattern
      block ||= _block
      @pattern, @conv, @short, @long, @arg, @desc, @block =
        pattern, conv, short, long, arg, desc, block
    end

    #
    # Parses +arg+ and returns rest of +arg+ and matched portion to the
    # argument pattern. Yields when the pattern doesn't match substring.
    #
    def parse_arg(arg) # :nodoc:
      pattern or return nil, [arg]
      unless m = pattern.match(arg)
        yield(InvalidArgument, arg)
        return arg, []
      end
      if String === m
        m = [s = m]
      else
        m = m.to_a
        s = m[0]
        return nil, m unless String === s
      end
      raise InvalidArgument, arg unless arg.rindex(s, 0)
      return nil, m if s.length == arg.length
      yield(InvalidArgument, arg) # didn't match whole arg
      return arg[s.length..-1], m
    end
    private :parse_arg

    #
    # Parses argument, converts and returns +arg+, +block+ and result of
    # conversion. Yields at semi-error condition instead of raising an
    # exception.
    #
    def conv_arg(arg, val = []) # :nodoc:
      if conv
        val = conv.call(*val)
      else
        val = proc {|v| v}.call(*val)
      end
      return arg, block, val
    end
    private :conv_arg

    #
    # Produces the summary text. Each line of the summary is yielded to the
    # block (without newline).
    #
    # +sdone+::  Already summarized short style options keyed hash.
    # +ldone+::  Already summarized long style options keyed hash.
    # +width+::  Width of left side (option part). In other words, the right
    #            side (description part) starts after +width+ columns.
    # +max+::    Maximum width of left side -> the options are filled within
    #            +max+ columns.
    # +indent+:: Prefix string indents all summarized lines.
    #
    def summarize(sdone = {}, ldone = {}, width = 1, max = width - 1, indent = "")
      sopts, lopts = [], [], nil
      @short.each {|s| sdone.fetch(s) {sopts << s}; sdone[s] = true} if @short
      @long.each {|s| ldone.fetch(s) {lopts << s}; ldone[s] = true} if @long
      return if sopts.empty? and lopts.empty? # completely hidden

      left = [sopts.join(', ')]
      right = desc.dup

      while s = lopts.shift
        l = left[-1].length + s.length
        l += arg.length if left.size == 1 && arg
        l < max or sopts.empty? or left << +''
        left[-1] << (left[-1].empty? ? ' ' * 4 : ', ') << s
      end

      if arg
        left[0] << (left[1] ? arg.sub(/\A(\[?)=/, '\1') + ',' : arg)
      end
      mlen = left.collect {|ss| ss.length}.max.to_i
      while mlen > width and l = left.shift
        mlen = left.collect {|ss| ss.length}.max.to_i if l.length == mlen
        if l.length < width and (r = right[0]) and !r.empty?
          l = l.to_s.ljust(width) + ' ' + r
          right.shift
        end
        yield(indent + l)
      end

      while begin l = left.shift; r = right.shift; l or r end
        l = l.to_s.ljust(width) + ' ' + r if r and !r.empty?
        yield(indent + l)
      end

      self
    end

    def add_banner(to)  # :nodoc:
      unless @short or @long
        s = desc.join
        to << " [" + s + "]..." unless s.empty?
      end
      to
    end

    def match_nonswitch?(str)  # :nodoc:
      @pattern =~ str unless @short or @long
    end

    #
    # Main name of the switch.
    #
    def switch_name
      (long.first || short.first).sub(/\A-+(?:\[no-\])?/, '')
    end

    def compsys(sdone, ldone)   # :nodoc:
      sopts, lopts = [], []
      @short.each {|s| sdone.fetch(s) {sopts << s}; sdone[s] = true} if @short
      @long.each {|s| ldone.fetch(s) {lopts << s}; ldone[s] = true} if @long
      return if sopts.empty? and lopts.empty? # completely hidden

      (sopts+lopts).each do |opt|
        # "(-x -c -r)-l[left justify]"
        if /^--\[no-\](.+)$/ =~ opt
          o = $1
          yield("--#{o}", desc.join(""))
          yield("--no-#{o}", desc.join(""))
        else
          yield("#{opt}", desc.join(""))
        end
      end
    end

    def pretty_print_contents(q) # :nodoc:
      if @block
        q.text ":" + @block.source_location.join(":") + ":"
        first = false
      else
        first = true
      end
      [@short, @long].each do |list|
        list.each do |opt|
          if first
            q.text ":"
            first = false
          end
          q.breakable
          q.text opt
        end
      end
    end

    def pretty_print(q)         # :nodoc:
      q.object_group(self) {pretty_print_contents(q)}
    end

    #
    # Switch that takes no arguments.
    #
    class NoArgument < self

      #
      # Raises an exception if any arguments given.
      #
      def parse(arg, argv)
        yield(NeedlessArgument, arg) if arg
        conv_arg(arg)
      end

      def self.incompatible_argument_styles(*)
      end

      def self.pattern
        Object
      end

      def pretty_head           # :nodoc:
        "NoArgument"
      end
    end

    #
    # Switch that takes an argument.
    #
    class RequiredArgument < self

      #
      # Raises an exception if argument is not present.
      #
      def parse(arg, argv)
        unless arg
          raise MissingArgument if argv.empty?
          arg = argv.shift
        end
        conv_arg(*parse_arg(arg, &method(:raise)))
      end

      def pretty_head           # :nodoc:
        "Required"
      end
    end

    #
    # Switch that can omit argument.
    #
    class OptionalArgument < self

      #
      # Parses argument if given, or uses default value.
      #
      def parse(arg, argv, &error)
        if arg
          conv_arg(*parse_arg(arg, &error))
        else
          conv_arg(arg)
        end
      end

      def pretty_head           # :nodoc:
        "Optional"
      end
    end

    #
    # Switch that takes an argument, which does not begin with '-'.
    #
    class PlacedArgument < self

      #
      # Returns nil if argument is not present or begins with '-'.
      #
      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil
        end
        opt = (val = parse_arg(val, &error))[1]
        val = conv_arg(*val)
        if opt and !arg
          argv.shift
        else
          val[0] = nil
        end
        val
      end

      def pretty_head           # :nodoc:
        "Placed"
      end
    end
  end

  #
  # Simple option list providing mapping from short and/or long option
  # string to Gem::OptionParser::Switch and mapping from acceptable argument to
  # matching pattern and converter pair. Also provides summary feature.
  #
  class List
    # Map from acceptable argument types to pattern and converter pairs.
    attr_reader :atype

    # Map from short style option switches to actual switch objects.
    attr_reader :short

    # Map from long style option switches to actual switch objects.
    attr_reader :long

    # List of all switches and summary string.
    attr_reader :list

    #
    # Just initializes all instance variables.
    #
    def initialize
      @atype = {}
      @short = OptionMap.new
      @long = OptionMap.new
      @list = []
    end

    def pretty_print(q)         # :nodoc:
      q.group(1, "(", ")") do
        @list.each do |sw|
          next unless Switch === sw
          q.group(1, "(" + sw.pretty_head, ")") do
            sw.pretty_print_contents(q)
          end
        end
      end
    end

    #
    # See Gem::OptionParser.accept.
    #
    def accept(t, pat = /.*/m, &block)
      if pat
        pat.respond_to?(:match) or
          raise TypeError, "has no `match'", ParseError.filter_backtrace(caller(2))
      else
        pat = t if t.respond_to?(:match)
      end
      unless block
        block = pat.method(:convert).to_proc if pat.respond_to?(:convert)
      end
      @atype[t] = [pat, block]
    end

    #
    # See Gem::OptionParser.reject.
    #
    def reject(t)
      @atype.delete(t)
    end

    #
    # Adds +sw+ according to +sopts+, +lopts+ and +nlopts+.
    #
    # +sw+::     Gem::OptionParser::Switch instance to be added.
    # +sopts+::  Short style option list.
    # +lopts+::  Long style option list.
    # +nlopts+:: Negated long style options list.
    #
    def update(sw, sopts, lopts, nsw = nil, nlopts = nil) # :nodoc:
      sopts.each {|o| @short[o] = sw} if sopts
      lopts.each {|o| @long[o] = sw} if lopts
      nlopts.each {|o| @long[o] = nsw} if nsw and nlopts
      used = @short.invert.update(@long.invert)
      @list.delete_if {|o| Switch === o and !used[o]}
    end
    private :update

    #
    # Inserts +switch+ at the head of the list, and associates short, long
    # and negated long options. Arguments are:
    #
    # +switch+::      Gem::OptionParser::Switch instance to be inserted.
    # +short_opts+::  List of short style options.
    # +long_opts+::   List of long style options.
    # +nolong_opts+:: List of long style options with "no-" prefix.
    #
    #   prepend(switch, short_opts, long_opts, nolong_opts)
    #
    def prepend(*args)
      update(*args)
      @list.unshift(args[0])
    end

    #
    # Appends +switch+ at the tail of the list, and associates short, long
    # and negated long options. Arguments are:
    #
    # +switch+::      Gem::OptionParser::Switch instance to be inserted.
    # +short_opts+::  List of short style options.
    # +long_opts+::   List of long style options.
    # +nolong_opts+:: List of long style options with "no-" prefix.
    #
    #   append(switch, short_opts, long_opts, nolong_opts)
    #
    def append(*args)
      update(*args)
      @list.push(args[0])
    end

    #
    # Searches +key+ in +id+ list. The result is returned or yielded if a
    # block is given. If it isn't found, nil is returned.
    #
    def search(id, key)
      if list = __send__(id)
        val = list.fetch(key) {return nil}
        block_given? ? yield(val) : val
      end
    end

    #
    # Searches list +id+ for +opt+ and the optional patterns for completion
    # +pat+. If +icase+ is true, the search is case insensitive. The result
    # is returned or yielded if a block is given. If it isn't found, nil is
    # returned.
    #
    def complete(id, opt, icase = false, *pat, &block)
      __send__(id).complete(opt, icase, *pat, &block)
    end

    def get_candidates(id)
      yield __send__(id).keys
    end

    #
    # Iterates over each option, passing the option to the +block+.
    #
    def each_option(&block)
      list.each(&block)
    end

    #
    # Creates the summary table, passing each line to the +block+ (without
    # newline). The arguments +args+ are passed along to the summarize
    # method which is called on every option.
    #
    def summarize(*args, &block)
      sum = []
      list.reverse_each do |opt|
        if opt.respond_to?(:summarize) # perhaps Gem::OptionParser::Switch
          s = []
          opt.summarize(*args) {|l| s << l}
          sum.concat(s.reverse)
        elsif !opt or opt.empty?
          sum << ""
        elsif opt.respond_to?(:each_line)
          sum.concat([*opt.each_line].reverse)
        else
          sum.concat([*opt.each].reverse)
        end
      end
      sum.reverse_each(&block)
    end

    def add_banner(to)  # :nodoc:
      list.each do |opt|
        if opt.respond_to?(:add_banner)
          opt.add_banner(to)
        end
      end
      to
    end

    def compsys(*args, &block)  # :nodoc:
      list.each do |opt|
        if opt.respond_to?(:compsys)
          opt.compsys(*args, &block)
        end
      end
    end
  end

  #
  # Hash with completion search feature. See Gem::OptionParser::Completion.
  #
  class CompletingHash < Hash
    include Completion

    #
    # Completion for hash key.
    #
    def match(key)
      *values = fetch(key) {
        raise AmbiguousArgument, catch(:ambiguous) {return complete(key)}
      }
      return key, *values
    end
  end

  # :stopdoc:

  #
  # Enumeration of acceptable argument styles. Possible values are:
  #
  # NO_ARGUMENT::       The switch takes no arguments. (:NONE)
  # REQUIRED_ARGUMENT:: The switch requires an argument. (:REQUIRED)
  # OPTIONAL_ARGUMENT:: The switch requires an optional argument. (:OPTIONAL)
  #
  # Use like --switch=argument (long style) or -Xargument (short style). For
  # short style, only portion matched to argument pattern is treated as
  # argument.
  #
  ArgumentStyle = {}
  NoArgument.each {|el| ArgumentStyle[el] = Switch::NoArgument}
  RequiredArgument.each {|el| ArgumentStyle[el] = Switch::RequiredArgument}
  OptionalArgument.each {|el| ArgumentStyle[el] = Switch::OptionalArgument}
  ArgumentStyle.freeze

  #
  # Switches common used such as '--', and also provides default
  # argument classes
  #
  DefaultList = List.new
  DefaultList.short['-'] = Switch::NoArgument.new {}
  DefaultList.long[''] = Switch::NoArgument.new {throw :terminate}


  COMPSYS_HEADER = <<'XXX'      # :nodoc:

typeset -A opt_args
local context state line

_arguments -s -S \
XXX

  def compsys(to, name = File.basename($0)) # :nodoc:
    to << "#compdef #{name}\n"
    to << COMPSYS_HEADER
    visit(:compsys, {}, {}) {|o, d|
      to << %Q[  "#{o}[#{d.gsub(/[\"\[\]]/, '\\\\\&')}]" \\\n]
    }
    to << "  '*:file:_files' && return 0\n"
  end

  #
  # Default options for ARGV, which never appear in option summary.
  #
  Officious = {}

  #
  # --help
  # Shows option summary.
  #
  Officious['help'] = proc do |parser|
    Switch::NoArgument.new do |arg|
      puts parser.help
      exit
    end
  end

  #
  # --*-completion-bash=WORD
  # Shows candidates for command line completion.
  #
  Officious['*-completion-bash'] = proc do |parser|
    Switch::RequiredArgument.new do |arg|
      puts parser.candidate(arg)
      exit
    end
  end

  #
  # --*-completion-zsh[=NAME:FILE]
  # Creates zsh completion file.
  #
  Officious['*-completion-zsh'] = proc do |parser|
    Switch::OptionalArgument.new do |arg|
      parser.compsys(STDOUT, arg)
      exit
    end
  end

  #
  # --version
  # Shows version string if Version is defined.
  #
  Officious['version'] = proc do |parser|
    Switch::OptionalArgument.new do |pkg|
      if pkg
        begin
          require 'rubygems/optparse/lib/optparse/version'
        rescue LoadError
        else
          show_version(*pkg.split(/,/)) or
            abort("#{parser.program_name}: no version found in package #{pkg}")
          exit
        end
      end
      v = parser.ver or abort("#{parser.program_name}: version unknown")
      puts v
      exit
    end
  end

  # :startdoc:

  #
  # Class methods
  #

  #
  # Initializes a new instance and evaluates the optional block in context
  # of the instance. Arguments +args+ are passed to #new, see there for
  # description of parameters.
  #
  # This method is *deprecated*, its behavior corresponds to the older #new
  # method.
  #
  def self.with(*args, &block)
    opts = new(*args)
    opts.instance_eval(&block)
    opts
  end

  #
  # Returns an incremented value of +default+ according to +arg+.
  #
  def self.inc(arg, default = nil)
    case arg
    when Integer
      arg.nonzero?
    when nil
      default.to_i + 1
    end
  end
  def inc(*args)
    self.class.inc(*args)
  end

  #
  # Initializes the instance and yields itself if called with a block.
  #
  # +banner+:: Banner message.
  # +width+::  Summary width.
  # +indent+:: Summary indent.
  #
  def initialize(banner = nil, width = 32, indent = ' ' * 4)
    @stack = [DefaultList, List.new, List.new]
    @program_name = nil
    @banner = banner
    @summary_width = width
    @summary_indent = indent
    @default_argv = ARGV
    @require_exact = false
    add_officious
    yield self if block_given?
  end

  def add_officious  # :nodoc:
    list = base()
    Officious.each do |opt, block|
      list.long[opt] ||= block.call(self)
    end
  end

  #
  # Terminates option parsing. Optional parameter +arg+ is a string pushed
  # back to be the first non-option argument.
  #
  def terminate(arg = nil)
    self.class.terminate(arg)
  end
  def self.terminate(arg = nil)
    throw :terminate, arg
  end

  @stack = [DefaultList]
  def self.top() DefaultList end

  #
  # Directs to accept specified class +t+. The argument string is passed to
  # the block in which it should be converted to the desired class.
  #
  # +t+::   Argument class specifier, any object including Class.
  # +pat+:: Pattern for argument, defaults to +t+ if it responds to match.
  #
  #   accept(t, pat, &block)
  #
  def accept(*args, &blk) top.accept(*args, &blk) end
  #
  # See #accept.
  #
  def self.accept(*args, &blk) top.accept(*args, &blk) end

  #
  # Directs to reject specified class argument.
  #
  # +t+:: Argument class specifier, any object including Class.
  #
  #   reject(t)
  #
  def reject(*args, &blk) top.reject(*args, &blk) end
  #
  # See #reject.
  #
  def self.reject(*args, &blk) top.reject(*args, &blk) end

  #
  # Instance methods
  #

  # Heading banner preceding summary.
  attr_writer :banner

  # Program name to be emitted in error message and default banner,
  # defaults to $0.
  attr_writer :program_name

  # Width for option list portion of summary. Must be Numeric.
  attr_accessor :summary_width

  # Indentation for summary. Must be String (or have + String method).
  attr_accessor :summary_indent

  # Strings to be parsed in default.
  attr_accessor :default_argv

  # Whether to require that options match exactly (disallows providing
  # abbreviated long option as short option).
  attr_accessor :require_exact

  #
  # Heading banner preceding summary.
  #
  def banner
    unless @banner
      @banner = +"Usage: #{program_name} [options]"
      visit(:add_banner, @banner)
    end
    @banner
  end

  #
  # Program name to be emitted in error message and default banner, defaults
  # to $0.
  #
  def program_name
    @program_name || File.basename($0, '.*')
  end

  # for experimental cascading :-)
  alias set_banner banner=
  alias set_program_name program_name=
  alias set_summary_width summary_width=
  alias set_summary_indent summary_indent=

  # Version
  attr_writer :version
  # Release code
  attr_writer :release

  #
  # Version
  #
  def version
    (defined?(@version) && @version) || (defined?(::Version) && ::Version)
  end

  #
  # Release code
  #
  def release
    (defined?(@release) && @release) || (defined?(::Release) && ::Release) || (defined?(::RELEASE) && ::RELEASE)
  end

  #
  # Returns version string from program_name, version and release.
  #
  def ver
    if v = version
      str = +"#{program_name} #{[v].join('.')}"
      str << " (#{v})" if v = release
      str
    end
  end

  def warn(mesg = $!)
    super("#{program_name}: #{mesg}")
  end

  def abort(mesg = $!)
    super("#{program_name}: #{mesg}")
  end

  #
  # Subject of #on / #on_head, #accept / #reject
  #
  def top
    @stack[-1]
  end

  #
  # Subject of #on_tail.
  #
  def base
    @stack[1]
  end

  #
  # Pushes a new List.
  #
  def new
    @stack.push(List.new)
    if block_given?
      yield self
    else
      self
    end
  end

  #
  # Removes the last List.
  #
  def remove
    @stack.pop
  end

  #
  # Puts option summary into +to+ and returns +to+. Yields each line if
  # a block is given.
  #
  # +to+:: Output destination, which must have method <<. Defaults to [].
  # +width+:: Width of left side, defaults to @summary_width.
  # +max+:: Maximum length allowed for left side, defaults to +width+ - 1.
  # +indent+:: Indentation, defaults to @summary_indent.
  #
  def summarize(to = [], width = @summary_width, max = width - 1, indent = @summary_indent, &blk)
    nl = "\n"
    blk ||= proc {|l| to << (l.index(nl, -1) ? l : l + nl)}
    visit(:summarize, {}, {}, width, max, indent, &blk)
    to
  end

  #
  # Returns option summary string.
  #
  def help; summarize("#{banner}".sub(/\n?\z/, "\n")) end
  alias to_s help

  def pretty_print(q)           # :nodoc:
    q.object_group(self) do
      first = true
      if @stack.size > 2
        @stack.each_with_index do |s, i|
          next if i < 2
          next if s.list.empty?
          if first
            first = false
            q.text ":"
          end
          q.breakable
          s.pretty_print(q)
        end
      end
    end
  end

  def inspect                   # :nodoc:
    require 'pp'
    pretty_print_inspect
  end

  #
  # Returns option summary list.
  #
  def to_a; summarize("#{banner}".split(/^/)) end

  #
  # Checks if an argument is given twice, in which case an ArgumentError is
  # raised. Called from Gem::OptionParser#switch only.
  #
  # +obj+:: New argument.
  # +prv+:: Previously specified argument.
  # +msg+:: Exception message.
  #
  def notwice(obj, prv, msg) # :nodoc:
    unless !prv or prv == obj
      raise(ArgumentError, "argument #{msg} given twice: #{obj}",
            ParseError.filter_backtrace(caller(2)))
    end
    obj
  end
  private :notwice

  SPLAT_PROC = proc {|*a| a.length <= 1 ? a.first : a} # :nodoc:

  # :call-seq:
  #   make_switch(params, block = nil)
  #
  # :include: ../doc/optparse/creates_option.rdoc
  #
  def make_switch(opts, block = nil)
    short, long, nolong, style, pattern, conv, not_pattern, not_conv, not_style = [], [], []
    ldesc, sdesc, desc, arg = [], [], []
    default_style = Switch::NoArgument
    default_pattern = nil
    klass = nil
    q, a = nil
    has_arg = false

    opts.each do |o|
      # argument class
      next if search(:atype, o) do |pat, c|
        klass = notwice(o, klass, 'type')
        if not_style and not_style != Switch::NoArgument
          not_pattern, not_conv = pat, c
        else
          default_pattern, conv = pat, c
        end
      end

      # directly specified pattern(any object possible to match)
      if (!(String === o || Symbol === o)) and o.respond_to?(:match)
        pattern = notwice(o, pattern, 'pattern')
        if pattern.respond_to?(:convert)
          conv = pattern.method(:convert).to_proc
        else
          conv = SPLAT_PROC
        end
        next
      end

      # anything others
      case o
      when Proc, Method
        block = notwice(o, block, 'block')
      when Array, Hash
        case pattern
        when CompletingHash
        when nil
          pattern = CompletingHash.new
          conv = pattern.method(:convert).to_proc if pattern.respond_to?(:convert)
        else
          raise ArgumentError, "argument pattern given twice"
        end
        o.each {|pat, *v| pattern[pat] = v.fetch(0) {pat}}
      when Module
        raise ArgumentError, "unsupported argument type: #{o}", ParseError.filter_backtrace(caller(4))
      when *ArgumentStyle.keys
        style = notwice(ArgumentStyle[o], style, 'style')
      when /^--no-([^\[\]=\s]*)(.+)?/
        q, a = $1, $2
        o = notwice(a ? Object : TrueClass, klass, 'type')
        not_pattern, not_conv = search(:atype, o) unless not_style
        not_style = (not_style || default_style).guess(arg = a) if a
        default_style = Switch::NoArgument
        default_pattern, conv = search(:atype, FalseClass) unless default_pattern
        ldesc << "--no-#{q}"
        (q = q.downcase).tr!('_', '-')
        long << "no-#{q}"
        nolong << q
      when /^--\[no-\]([^\[\]=\s]*)(.+)?/
        q, a = $1, $2
        o = notwice(a ? Object : TrueClass, klass, 'type')
        if a
          default_style = default_style.guess(arg = a)
          default_pattern, conv = search(:atype, o) unless default_pattern
        end
        ldesc << "--[no-]#{q}"
        (o = q.downcase).tr!('_', '-')
        long << o
        not_pattern, not_conv = search(:atype, FalseClass) unless not_style
        not_style = Switch::NoArgument
        nolong << "no-#{o}"
      when /^--([^\[\]=\s]*)(.+)?/
        q, a = $1, $2
        if a
          o = notwice(NilClass, klass, 'type')
          default_style = default_style.guess(arg = a)
          default_pattern, conv = search(:atype, o) unless default_pattern
        end
        ldesc << "--#{q}"
        (o = q.downcase).tr!('_', '-')
        long << o
      when /^-(\[\^?\]?(?:[^\\\]]|\\.)*\])(.+)?/
        q, a = $1, $2
        o = notwice(Object, klass, 'type')
        if a
          default_style = default_style.guess(arg = a)
          default_pattern, conv = search(:atype, o) unless default_pattern
        else
          has_arg = true
        end
        sdesc << "-#{q}"
        short << Regexp.new(q)
      when /^-(.)(.+)?/
        q, a = $1, $2
        if a
          o = notwice(NilClass, klass, 'type')
          default_style = default_style.guess(arg = a)
          default_pattern, conv = search(:atype, o) unless default_pattern
        end
        sdesc << "-#{q}"
        short << q
      when /^=/
        style = notwice(default_style.guess(arg = o), style, 'style')
        default_pattern, conv = search(:atype, Object) unless default_pattern
      else
        desc.push(o)
      end
    end

    default_pattern, conv = search(:atype, default_style.pattern) unless default_pattern
    if !(short.empty? and long.empty?)
      if has_arg and default_style == Switch::NoArgument
        default_style = Switch::RequiredArgument
      end
      s = (style || default_style).new(pattern || default_pattern,
                                       conv, sdesc, ldesc, arg, desc, block)
    elsif !block
      if style or pattern
        raise ArgumentError, "no switch given", ParseError.filter_backtrace(caller)
      end
      s = desc
    else
      short << pattern
      s = (style || default_style).new(pattern,
                                       conv, nil, nil, arg, desc, block)
    end
    return s, short, long,
      (not_style.new(not_pattern, not_conv, sdesc, ldesc, nil, desc, block) if not_style),
      nolong
  end

  # :call-seq:
  #   define(*params, &block)
  #
  # :include: ../doc/optparse/creates_option.rdoc
  #
  def define(*opts, &block)
    top.append(*(sw = make_switch(opts, block)))
    sw[0]
  end

  # :call-seq:
  #   on(*params, &block)
  #
  # :include: ../doc/optparse/creates_option.rdoc
  #
  def on(*opts, &block)
    define(*opts, &block)
    self
  end
  alias def_option define

  # :call-seq:
  #   define_head(*params, &block)
  #
  # :include: ../doc/optparse/creates_option.rdoc
  #
  def define_head(*opts, &block)
    top.prepend(*(sw = make_switch(opts, block)))
    sw[0]
  end

  # :call-seq:
  #   on_head(*params, &block)
  #
  # :include: ../doc/optparse/creates_option.rdoc
  #
  # The new option is added at the head of the summary.
  #
  def on_head(*opts, &block)
    define_head(*opts, &block)
    self
  end
  alias def_head_option define_head

  # :call-seq:
  #   define_tail(*params, &block)
  #
  # :include: ../doc/optparse/creates_option.rdoc
  #
  def define_tail(*opts, &block)
    base.append(*(sw = make_switch(opts, block)))
    sw[0]
  end

  #
  # :call-seq:
  #   on_tail(*params, &block)
  #
  # :include: ../doc/optparse/creates_option.rdoc
  #
  # The new option is added at the tail of the summary.
  #
  def on_tail(*opts, &block)
    define_tail(*opts, &block)
    self
  end
  alias def_tail_option define_tail

  #
  # Add separator in summary.
  #
  def separator(string)
    top.append(string, nil, nil)
  end

  #
  # Parses command line arguments +argv+ in order. When a block is given,
  # each non-option argument is yielded. When optional +into+ keyword
  # argument is provided, the parsed option values are stored there via
  # <code>[]=</code> method (so it can be Hash, or OpenStruct, or other
  # similar object).
  #
  # Returns the rest of +argv+ left unparsed.
  #
  def order(*argv, into: nil, &nonopt)
    argv = argv[0].dup if argv.size == 1 and Array === argv[0]
    order!(argv, into: into, &nonopt)
  end

  #
  # Same as #order, but removes switches destructively.
  # Non-option arguments remain in +argv+.
  #
  def order!(argv = default_argv, into: nil, &nonopt)
    setter = ->(name, val) {into[name.to_sym] = val} if into
    parse_in_order(argv, setter, &nonopt)
  end

  def parse_in_order(argv = default_argv, setter = nil, &nonopt)  # :nodoc:
    opt, arg, val, rest = nil
    nonopt ||= proc {|a| throw :terminate, a}
    argv.unshift(arg) if arg = catch(:terminate) {
      while arg = argv.shift
        case arg
        # long option
        when /\A--([^=]*)(?:=(.*))?/m
          opt, rest = $1, $2
          opt.tr!('_', '-')
          begin
            sw, = complete(:long, opt, true)
            if require_exact && !sw.long.include?(arg)
              raise InvalidOption, arg
            end
          rescue ParseError
            raise $!.set_option(arg, true)
          end
          begin
            opt, cb, val = sw.parse(rest, argv) {|*exc| raise(*exc)}
            val = cb.call(val) if cb
            setter.call(sw.switch_name, val) if setter
          rescue ParseError
            raise $!.set_option(arg, rest)
          end

        # short option
        when /\A-(.)((=).*|.+)?/m
          eq, rest, opt = $3, $2, $1
          has_arg, val = eq, rest
          begin
            sw, = search(:short, opt)
            unless sw
              begin
                sw, = complete(:short, opt)
                # short option matched.
                val = arg.delete_prefix('-')
                has_arg = true
              rescue InvalidOption
                raise if require_exact
                # if no short options match, try completion with long
                # options.
                sw, = complete(:long, opt)
                eq ||= !rest
              end
            end
          rescue ParseError
            raise $!.set_option(arg, true)
          end
          begin
            opt, cb, val = sw.parse(val, argv) {|*exc| raise(*exc) if eq}
          rescue ParseError
            raise $!.set_option(arg, arg.length > 2)
          else
            raise InvalidOption, arg if has_arg and !eq and arg == "-#{opt}"
          end
          begin
            argv.unshift(opt) if opt and (!rest or (opt = opt.sub(/\A-*/, '-')) != '-')
            val = cb.call(val) if cb
            setter.call(sw.switch_name, val) if setter
          rescue ParseError
            raise $!.set_option(arg, arg.length > 2)
          end

        # non-option argument
        else
          catch(:prune) do
            visit(:each_option) do |sw0|
              sw = sw0
              sw.block.call(arg) if Switch === sw and sw.match_nonswitch?(arg)
            end
            nonopt.call(arg)
          end
        end
      end

      nil
    }

    visit(:search, :short, nil) {|sw| sw.block.call(*argv) if !sw.pattern}

    argv
  end
  private :parse_in_order

  #
  # Parses command line arguments +argv+ in permutation mode and returns
  # list of non-option arguments. When optional +into+ keyword
  # argument is provided, the parsed option values are stored there via
  # <code>[]=</code> method (so it can be Hash, or OpenStruct, or other
  # similar object).
  #
  def permute(*argv, into: nil)
    argv = argv[0].dup if argv.size == 1 and Array === argv[0]
    permute!(argv, into: into)
  end

  #
  # Same as #permute, but removes switches destructively.
  # Non-option arguments remain in +argv+.
  #
  def permute!(argv = default_argv, into: nil)
    nonopts = []
    order!(argv, into: into, &nonopts.method(:<<))
    argv[0, 0] = nonopts
    argv
  end

  #
  # Parses command line arguments +argv+ in order when environment variable
  # POSIXLY_CORRECT is set, and in permutation mode otherwise.
  # When optional +into+ keyword argument is provided, the parsed option
  # values are stored there via <code>[]=</code> method (so it can be Hash,
  # or OpenStruct, or other similar object).
  #
  def parse(*argv, into: nil)
    argv = argv[0].dup if argv.size == 1 and Array === argv[0]
    parse!(argv, into: into)
  end

  #
  # Same as #parse, but removes switches destructively.
  # Non-option arguments remain in +argv+.
  #
  def parse!(argv = default_argv, into: nil)
    if ENV.include?('POSIXLY_CORRECT')
      order!(argv, into: into)
    else
      permute!(argv, into: into)
    end
  end

  #
  # Wrapper method for getopts.rb.
  #
  #   params = ARGV.getopts("ab:", "foo", "bar:", "zot:Z;zot option")
  #   # params["a"] = true   # -a
  #   # params["b"] = "1"    # -b1
  #   # params["foo"] = "1"  # --foo
  #   # params["bar"] = "x"  # --bar x
  #   # params["zot"] = "z"  # --zot Z
  #
  def getopts(*args)
    argv = Array === args.first ? args.shift : default_argv
    single_options, *long_options = *args

    result = {}

    single_options.scan(/(.)(:)?/) do |opt, val|
      if val
        result[opt] = nil
        define("-#{opt} VAL")
      else
        result[opt] = false
        define("-#{opt}")
      end
    end if single_options

    long_options.each do |arg|
      arg, desc = arg.split(';', 2)
      opt, val = arg.split(':', 2)
      if val
        result[opt] = val.empty? ? nil : val
        define("--#{opt}=#{result[opt] || "VAL"}", *[desc].compact)
      else
        result[opt] = false
        define("--#{opt}", *[desc].compact)
      end
    end

    parse_in_order(argv, result.method(:[]=))
    result
  end

  #
  # See #getopts.
  #
  def self.getopts(*args)
    new.getopts(*args)
  end

  #
  # Traverses @stack, sending each element method +id+ with +args+ and
  # +block+.
  #
  def visit(id, *args, &block) # :nodoc:
    @stack.reverse_each do |el|
      el.__send__(id, *args, &block)
    end
    nil
  end
  private :visit

  #
  # Searches +key+ in @stack for +id+ hash and returns or yields the result.
  #
  def search(id, key) # :nodoc:
    block_given = block_given?
    visit(:search, id, key) do |k|
      return block_given ? yield(k) : k
    end
  end
  private :search

  #
  # Completes shortened long style option switch and returns pair of
  # canonical switch and switch descriptor Gem::OptionParser::Switch.
  #
  # +typ+::   Searching table.
  # +opt+::   Searching key.
  # +icase+:: Search case insensitive if true.
  # +pat+::   Optional pattern for completion.
  #
  def complete(typ, opt, icase = false, *pat) # :nodoc:
    if pat.empty?
      search(typ, opt) {|sw| return [sw, opt]} # exact match or...
    end
    ambiguous = catch(:ambiguous) {
      visit(:complete, typ, opt, icase, *pat) {|o, *sw| return sw}
    }
    exc = ambiguous ? AmbiguousOption : InvalidOption
    raise exc.new(opt, additional: self.method(:additional_message).curry[typ])
  end
  private :complete

  #
  # Returns additional info.
  #
  def additional_message(typ, opt)
    return unless typ and opt and defined?(DidYouMean::SpellChecker)
    all_candidates = []
    visit(:get_candidates, typ) do |candidates|
      all_candidates.concat(candidates)
    end
    all_candidates.select! {|cand| cand.is_a?(String) }
    checker = DidYouMean::SpellChecker.new(dictionary: all_candidates)
    suggestions = all_candidates & checker.correct(opt)
    if DidYouMean.respond_to?(:formatter)
      DidYouMean.formatter.message_for(suggestions)
    else
       "\nDid you mean?  #{suggestions.join("\n               ")}"
    end
  end

  def candidate(word)
    list = []
    case word
    when '-'
      long = short = true
    when /\A--/
      word, arg = word.split(/=/, 2)
      argpat = Completion.regexp(arg, false) if arg and !arg.empty?
      long = true
    when /\A-/
      short = true
    end
    pat = Completion.regexp(word, long)
    visit(:each_option) do |opt|
      next unless Switch === opt
      opts = (long ? opt.long : []) + (short ? opt.short : [])
      opts = Completion.candidate(word, true, pat, &opts.method(:each)).map(&:first) if pat
      if /\A=/ =~ opt.arg
        opts.map! {|sw| sw + "="}
        if arg and CompletingHash === opt.pattern
          if opts = opt.pattern.candidate(arg, false, argpat)
            opts.map!(&:last)
          end
        end
      end
      list.concat(opts)
    end
    list
  end

  #
  # Loads options from file names as +filename+. Does nothing when the file
  # is not present. Returns whether successfully loaded.
  #
  # +filename+ defaults to basename of the program without suffix in a
  # directory ~/.options, then the basename with '.options' suffix
  # under XDG and Haiku standard places.
  #
  def load(filename = nil)
    unless filename
      basename = File.basename($0, '.*')
      return true if load(File.expand_path(basename, '~/.options')) rescue nil
      basename << ".options"
      return [
        # XDG
        ENV['XDG_CONFIG_HOME'],
        '~/.config',
        *ENV['XDG_CONFIG_DIRS']&.split(File::PATH_SEPARATOR),

        # Haiku
        '~/config/settings',
      ].any? {|dir|
        next if !dir or dir.empty?
        load(File.expand_path(basename, dir)) rescue nil
      }
    end
    begin
      parse(*IO.readlines(filename).each {|s| s.chomp!})
      true
    rescue Errno::ENOENT, Errno::ENOTDIR
      false
    end
  end

  #
  # Parses environment variable +env+ or its uppercase with splitting like a
  # shell.
  #
  # +env+ defaults to the basename of the program.
  #
  def environment(env = File.basename($0, '.*'))
    env = ENV[env] || ENV[env.upcase] or return
    require 'shellwords'
    parse(*Shellwords.shellwords(env))
  end

  #
  # Acceptable argument classes
  #

  #
  # Any string and no conversion. This is fall-back.
  #
  accept(Object) {|s,|s or s.nil?}

  accept(NilClass) {|s,|s}

  #
  # Any non-empty string, and no conversion.
  #
  accept(String, /.+/m) {|s,*|s}

  #
  # Ruby/C-like integer, octal for 0-7 sequence, binary for 0b, hexadecimal
  # for 0x, and decimal for others; with optional sign prefix. Converts to
  # Integer.
  #
  decimal = '\d+(?:_\d+)*'
  binary = 'b[01]+(?:_[01]+)*'
  hex = 'x[\da-f]+(?:_[\da-f]+)*'
  octal = "0(?:[0-7]+(?:_[0-7]+)*|#{binary}|#{hex})?"
  integer = "#{octal}|#{decimal}"

  accept(Integer, %r"\A[-+]?(?:#{integer})\z"io) {|s,|
    begin
      Integer(s)
    rescue ArgumentError
      raise Gem::OptionParser::InvalidArgument, s
    end if s
  }

  #
  # Float number format, and converts to Float.
  #
  float = "(?:#{decimal}(?=(.)?)(?:\\.(?:#{decimal})?)?|\\.#{decimal})(?:E[-+]?#{decimal})?"
  floatpat = %r"\A[-+]?#{float}\z"io
  accept(Float, floatpat) {|s,| s.to_f if s}

  #
  # Generic numeric format, converts to Integer for integer format, Float
  # for float format, and Rational for rational format.
  #
  real = "[-+]?(?:#{octal}|#{float})"
  accept(Numeric, /\A(#{real})(?:\/(#{real}))?\z/io) {|s, d, f, n,|
    if n
      Rational(d, n)
    elsif f
      Float(s)
    else
      Integer(s)
    end
  }

  #
  # Decimal integer format, to be converted to Integer.
  #
  DecimalInteger = /\A[-+]?#{decimal}\z/io
  accept(DecimalInteger, DecimalInteger) {|s,|
    begin
      Integer(s, 10)
    rescue ArgumentError
      raise Gem::OptionParser::InvalidArgument, s
    end if s
  }

  #
  # Ruby/C like octal/hexadecimal/binary integer format, to be converted to
  # Integer.
  #
  OctalInteger = /\A[-+]?(?:[0-7]+(?:_[0-7]+)*|0(?:#{binary}|#{hex}))\z/io
  accept(OctalInteger, OctalInteger) {|s,|
    begin
      Integer(s, 8)
    rescue ArgumentError
      raise Gem::OptionParser::InvalidArgument, s
    end if s
  }

  #
  # Decimal integer/float number format, to be converted to Integer for
  # integer format, Float for float format.
  #
  DecimalNumeric = floatpat     # decimal integer is allowed as float also.
  accept(DecimalNumeric, floatpat) {|s, f|
    begin
      if f
        Float(s)
      else
        Integer(s)
      end
    rescue ArgumentError
      raise Gem::OptionParser::InvalidArgument, s
    end if s
  }

  #
  # Boolean switch, which means whether it is present or not, whether it is
  # absent or not with prefix no-, or it takes an argument
  # yes/no/true/false/+/-.
  #
  yesno = CompletingHash.new
  %w[- no false].each {|el| yesno[el] = false}
  %w[+ yes true].each {|el| yesno[el] = true}
  yesno['nil'] = false          # should be nil?
  accept(TrueClass, yesno) {|arg, val| val == nil or val}
  #
  # Similar to TrueClass, but defaults to false.
  #
  accept(FalseClass, yesno) {|arg, val| val != nil and val}

  #
  # List of strings separated by ",".
  #
  accept(Array) do |s, |
    if s
      s = s.split(',').collect {|ss| ss unless ss.empty?}
    end
    s
  end

  #
  # Regular expression with options.
  #
  accept(Regexp, %r"\A/((?:\\.|[^\\])*)/([[:alpha:]]+)?\z|.*") do |all, s, o|
    f = 0
    if o
      f |= Regexp::IGNORECASE if /i/ =~ o
      f |= Regexp::MULTILINE if /m/ =~ o
      f |= Regexp::EXTENDED if /x/ =~ o
      k = o.delete("imx")
      k = nil if k.empty?
    end
    Regexp.new(s || all, f, k)
  end

  #
  # Exceptions
  #

  #
  # Base class of exceptions from Gem::OptionParser.
  #
  class ParseError < RuntimeError
    # Reason which caused the error.
    Reason = 'parse error'

    def initialize(*args, additional: nil)
      @additional = additional
      @arg0, = args
      @args = args
      @reason = nil
    end

    attr_reader :args
    attr_writer :reason
    attr_accessor :additional

    #
    # Pushes back erred argument(s) to +argv+.
    #
    def recover(argv)
      argv[0, 0] = @args
      argv
    end

    def self.filter_backtrace(array)
      unless $DEBUG
        array.delete_if(&%r"\A#{Regexp.quote(__FILE__)}:"o.method(:=~))
      end
      array
    end

    def set_backtrace(array)
      super(self.class.filter_backtrace(array))
    end

    def set_option(opt, eq)
      if eq
        @args[0] = opt
      else
        @args.unshift(opt)
      end
      self
    end

    #
    # Returns error reason. Override this for I18N.
    #
    def reason
      @reason || self.class::Reason
    end

    def inspect
      "#<#{self.class}: #{args.join(' ')}>"
    end

    #
    # Default stringizing method to emit standard error message.
    #
    def message
      "#{reason}: #{args.join(' ')}#{additional[@arg0] if additional}"
    end

    alias to_s message
  end

  #
  # Raises when ambiguously completable string is encountered.
  #
  class AmbiguousOption < ParseError
    const_set(:Reason, 'ambiguous option')
  end

  #
  # Raises when there is an argument for a switch which takes no argument.
  #
  class NeedlessArgument < ParseError
    const_set(:Reason, 'needless argument')
  end

  #
  # Raises when a switch with mandatory argument has no argument.
  #
  class MissingArgument < ParseError
    const_set(:Reason, 'missing argument')
  end

  #
  # Raises when switch is undefined.
  #
  class InvalidOption < ParseError
    const_set(:Reason, 'invalid option')
  end

  #
  # Raises when the given argument does not match required format.
  #
  class InvalidArgument < ParseError
    const_set(:Reason, 'invalid argument')
  end

  #
  # Raises when the given argument word can't be completed uniquely.
  #
  class AmbiguousArgument < InvalidArgument
    const_set(:Reason, 'ambiguous argument')
  end

  #
  # Miscellaneous
  #

  #
  # Extends command line arguments array (ARGV) to parse itself.
  #
  module Arguable

    #
    # Sets Gem::OptionParser object, when +opt+ is +false+ or +nil+, methods
    # Gem::OptionParser::Arguable#options and Gem::OptionParser::Arguable#options= are
    # undefined. Thus, there is no ways to access the Gem::OptionParser object
    # via the receiver object.
    #
    def options=(opt)
      unless @optparse = opt
        class << self
          undef_method(:options)
          undef_method(:options=)
        end
      end
    end

    #
    # Actual Gem::OptionParser object, automatically created if nonexistent.
    #
    # If called with a block, yields the Gem::OptionParser object and returns the
    # result of the block. If an Gem::OptionParser::ParseError exception occurs
    # in the block, it is rescued, a error message printed to STDERR and
    # +nil+ returned.
    #
    def options
      @optparse ||= Gem::OptionParser.new
      @optparse.default_argv = self
      block_given? or return @optparse
      begin
        yield @optparse
      rescue ParseError
        @optparse.warn $!
        nil
      end
    end

    #
    # Parses +self+ destructively in order and returns +self+ containing the
    # rest arguments left unparsed.
    #
    def order!(&blk) options.order!(self, &blk) end

    #
    # Parses +self+ destructively in permutation mode and returns +self+
    # containing the rest arguments left unparsed.
    #
    def permute!() options.permute!(self) end

    #
    # Parses +self+ destructively and returns +self+ containing the
    # rest arguments left unparsed.
    #
    def parse!() options.parse!(self) end

    #
    # Substitution of getopts is possible as follows. Also see
    # Gem::OptionParser#getopts.
    #
    #   def getopts(*args)
    #     ($OPT = ARGV.getopts(*args)).each do |opt, val|
    #       eval "$OPT_#{opt.gsub(/[^A-Za-z0-9_]/, '_')} = val"
    #     end
    #   rescue Gem::OptionParser::ParseError
    #   end
    #
    def getopts(*args)
      options.getopts(self, *args)
    end

    #
    # Initializes instance variable.
    #
    def self.extend_object(obj)
      super
      obj.instance_eval {@optparse = nil}
    end
    def initialize(*args)
      super
      @optparse = nil
    end
  end

  #
  # Acceptable argument classes. Now contains DecimalInteger, OctalInteger
  # and DecimalNumeric. See Acceptable argument classes (in source code).
  #
  module Acceptables
    const_set(:DecimalInteger, Gem::OptionParser::DecimalInteger)
    const_set(:OctalInteger, Gem::OptionParser::OctalInteger)
    const_set(:DecimalNumeric, Gem::OptionParser::DecimalNumeric)
  end
end

# ARGV is arguable by Gem::OptionParser
ARGV.extend(Gem::OptionParser::Arguable)
PK}$[ii��F�Frubygems/rubygems/package.rbnu�[���# frozen_string_literal: true
#--
# Copyright (C) 2004 Mauricio Julio Fernández Pradier
# See LICENSE.txt for additional licensing information.
#++

require_relative "../rubygems"
require_relative "security"
require_relative "user_interaction"

##
# Example using a Gem::Package
#
# Builds a .gem file given a Gem::Specification. A .gem file is a tarball
# which contains a data.tar.gz, metadata.gz, checksums.yaml.gz and possibly
# signatures.
#
#   require 'rubygems'
#   require 'rubygems/package'
#
#   spec = Gem::Specification.new do |s|
#     s.summary = "Ruby based make-like utility."
#     s.name = 'rake'
#     s.version = PKG_VERSION
#     s.requirements << 'none'
#     s.files = PKG_FILES
#     s.description = <<-EOF
#   Rake is a Make-like program implemented in Ruby. Tasks
#   and dependencies are specified in standard Ruby syntax.
#     EOF
#   end
#
#   Gem::Package.build spec
#
# Reads a .gem file.
#
#   require 'rubygems'
#   require 'rubygems/package'
#
#   the_gem = Gem::Package.new(path_to_dot_gem)
#   the_gem.contents # get the files in the gem
#   the_gem.extract_files destination_directory # extract the gem into a directory
#   the_gem.spec # get the spec out of the gem
#   the_gem.verify # check the gem is OK (contains valid gem specification, contains a not corrupt contents archive)
#
# #files are the files in the .gem tar file, not the Ruby files in the gem
# #extract_files and #contents automatically call #verify

class Gem::Package
  include Gem::UserInteraction

  class Error < Gem::Exception; end

  class FormatError < Error
    attr_reader :path

    def initialize(message, source = nil)
      if source
        @path = source.path

        message = message + " in #{path}" if path
      end

      super message
    end
  end

  class PathError < Error
    def initialize(destination, destination_dir)
      super "installing into parent path %s of %s is not allowed" %
        [destination, destination_dir]
    end
  end

  class SymlinkError < Error
    def initialize(name, destination, destination_dir)
      super "installing symlink '%s' pointing to parent path %s of %s is not allowed" %
        [name, destination, destination_dir]
    end
  end

  class NonSeekableIO < Error; end

  class TooLongFileName < Error; end

  ##
  # Raised when a tar file is corrupt

  class TarInvalidError < Error; end

  attr_accessor :build_time # :nodoc:

  ##
  # Checksums for the contents of the package

  attr_reader :checksums

  ##
  # The files in this package.  This is not the contents of the gem, just the
  # files in the top-level container.

  attr_reader :files

  ##
  # Reference to the gem being packaged.

  attr_reader :gem

  ##
  # The security policy used for verifying the contents of this package.

  attr_accessor :security_policy

  ##
  # Sets the Gem::Specification to use to build this package.

  attr_writer :spec

  ##
  # Permission for directories
  attr_accessor :dir_mode

  ##
  # Permission for program files
  attr_accessor :prog_mode

  ##
  # Permission for other files
  attr_accessor :data_mode

  def self.build(spec, skip_validation = false, strict_validation = false, file_name = nil)
    gem_file = file_name || spec.file_name

    package = new gem_file
    package.spec = spec
    package.build skip_validation, strict_validation

    gem_file
  end

  ##
  # Creates a new Gem::Package for the file at +gem+. +gem+ can also be
  # provided as an IO object.
  #
  # If +gem+ is an existing file in the old format a Gem::Package::Old will be
  # returned.

  def self.new(gem, security_policy = nil)
    gem = if gem.is_a?(Gem::Package::Source)
      gem
    elsif gem.respond_to? :read
      Gem::Package::IOSource.new gem
    else
      Gem::Package::FileSource.new gem
    end

    return super unless Gem::Package == self
    return super unless gem.present?

    return super unless gem.start
    return super unless gem.start.include? "MD5SUM ="

    Gem::Package::Old.new gem
  end

  ##
  # Extracts the Gem::Specification and raw metadata from the .gem file at
  # +path+.
  #--

  def self.raw_spec(path, security_policy = nil)
    format = new(path, security_policy)
    spec = format.spec

    metadata = nil

    File.open path, Gem.binary_mode do |io|
      tar = Gem::Package::TarReader.new io
      tar.each_entry do |entry|
        case entry.full_name
        when "metadata" then
          metadata = entry.read
        when "metadata.gz" then
          metadata = Gem::Util.gunzip entry.read
        end
      end
    end

    return spec, metadata
  end

  ##
  # Creates a new package that will read or write to the file +gem+.

  def initialize(gem, security_policy) # :notnew:
    require "zlib"

    @gem = gem

    @build_time      = Gem.source_date_epoch
    @checksums       = {}
    @contents        = nil
    @digests         = Hash.new {|h, algorithm| h[algorithm] = {} }
    @files           = nil
    @security_policy = security_policy
    @signatures      = {}
    @signer          = nil
    @spec            = nil
  end

  ##
  # Copies this package to +path+ (if possible)

  def copy_to(path)
    FileUtils.cp @gem.path, path unless File.exist? path
  end

  ##
  # Adds a checksum for each entry in the gem to checksums.yaml.gz.

  def add_checksums(tar)
    Gem.load_yaml

    checksums_by_algorithm = Hash.new {|h, algorithm| h[algorithm] = {} }

    @checksums.each do |name, digests|
      digests.each do |algorithm, digest|
        checksums_by_algorithm[algorithm][name] = digest.hexdigest
      end
    end

    tar.add_file_signed "checksums.yaml.gz", 0444, @signer do |io|
      gzip_to io do |gz_io|
        Psych.dump checksums_by_algorithm, gz_io
      end
    end
  end

  ##
  # Adds the files listed in the packages's Gem::Specification to data.tar.gz
  # and adds this file to the +tar+.

  def add_contents(tar) # :nodoc:
    digests = tar.add_file_signed "data.tar.gz", 0444, @signer do |io|
      gzip_to io do |gz_io|
        Gem::Package::TarWriter.new gz_io do |data_tar|
          add_files data_tar
        end
      end
    end

    @checksums["data.tar.gz"] = digests
  end

  ##
  # Adds files included the package's Gem::Specification to the +tar+ file

  def add_files(tar) # :nodoc:
    @spec.files.each do |file|
      stat = File.lstat file

      if stat.symlink?
        tar.add_symlink file, File.readlink(file), stat.mode
      end

      next unless stat.file?

      tar.add_file_simple file, stat.mode, stat.size do |dst_io|
        File.open file, "rb" do |src_io|
          dst_io.write src_io.read 16384 until src_io.eof?
        end
      end
    end
  end

  ##
  # Adds the package's Gem::Specification to the +tar+ file

  def add_metadata(tar) # :nodoc:
    digests = tar.add_file_signed "metadata.gz", 0444, @signer do |io|
      gzip_to io do |gz_io|
        gz_io.write @spec.to_yaml
      end
    end

    @checksums["metadata.gz"] = digests
  end

  ##
  # Builds this package based on the specification set by #spec=

  def build(skip_validation = false, strict_validation = false)
    raise ArgumentError, "skip_validation = true and strict_validation = true are incompatible" if skip_validation && strict_validation

    Gem.load_yaml

    @spec.mark_version
    @spec.validate true, strict_validation unless skip_validation

    setup_signer(
      signer_options: {
        expiration_length_days: Gem.configuration.cert_expiration_length_days,
      }
    )

    @gem.with_write_io do |gem_io|
      Gem::Package::TarWriter.new gem_io do |gem|
        add_metadata gem
        add_contents gem
        add_checksums gem
      end
    end

    say <<-EOM
  Successfully built RubyGem
  Name: #{@spec.name}
  Version: #{@spec.version}
  File: #{File.basename @gem.path}
EOM
  ensure
    @signer = nil
  end

  ##
  # A list of file names contained in this gem

  def contents
    return @contents if @contents

    verify unless @spec

    @contents = []

    @gem.with_read_io do |io|
      gem_tar = Gem::Package::TarReader.new io

      gem_tar.each do |entry|
        next unless entry.full_name == "data.tar.gz"

        open_tar_gz entry do |pkg_tar|
          pkg_tar.each do |contents_entry|
            @contents << contents_entry.full_name
          end
        end

        return @contents
      end
    end
  end

  ##
  # Creates a digest of the TarEntry +entry+ from the digest algorithm set by
  # the security policy.

  def digest(entry) # :nodoc:
    algorithms = if @checksums
      @checksums.keys
    else
      [Gem::Security::DIGEST_NAME].compact
    end

    algorithms.each do |algorithm|
      digester = Gem::Security.create_digest(algorithm)

      digester << entry.read(16384) until entry.eof?

      entry.rewind

      @digests[algorithm][entry.full_name] = digester
    end

    @digests
  end

  ##
  # Extracts the files in this package into +destination_dir+
  #
  # If +pattern+ is specified, only entries matching that glob will be
  # extracted.

  def extract_files(destination_dir, pattern = "*")
    verify unless @spec

    FileUtils.mkdir_p destination_dir, :mode => dir_mode && 0755

    @gem.with_read_io do |io|
      reader = Gem::Package::TarReader.new io

      reader.each do |entry|
        next unless entry.full_name == "data.tar.gz"

        extract_tar_gz entry, destination_dir, pattern

        return # ignore further entries
      end
    end
  end

  ##
  # Extracts all the files in the gzipped tar archive +io+ into
  # +destination_dir+.
  #
  # If an entry in the archive contains a relative path above
  # +destination_dir+ or an absolute path is encountered an exception is
  # raised.
  #
  # If +pattern+ is specified, only entries matching that glob will be
  # extracted.

  def extract_tar_gz(io, destination_dir, pattern = "*") # :nodoc:
    directories = []
    symlinks = []

    open_tar_gz io do |tar|
      tar.each do |entry|
        full_name = entry.full_name
        next unless File.fnmatch pattern, full_name, File::FNM_DOTMATCH

        destination = install_location full_name, destination_dir

        if entry.symlink?
          link_target = entry.header.linkname
          real_destination = link_target.start_with?("/") ? link_target : File.expand_path(link_target, File.dirname(destination))

          raise Gem::Package::SymlinkError.new(full_name, real_destination, destination_dir) unless
            normalize_path(real_destination).start_with? normalize_path(destination_dir + "/")

          symlinks << [full_name, link_target, destination, real_destination]
        end

        FileUtils.rm_rf destination

        mkdir_options = {}
        mkdir_options[:mode] = dir_mode ? 0755 : (entry.header.mode if entry.directory?)
        mkdir =
          if entry.directory?
            destination
          else
            File.dirname destination
          end

        unless directories.include?(mkdir)
          FileUtils.mkdir_p mkdir, **mkdir_options
          directories << mkdir
        end

        if entry.file?
          File.open(destination, "wb") {|out| out.write entry.read }
          FileUtils.chmod file_mode(entry.header.mode), destination
        end

        verbose destination
      end
    end

    symlinks.each do |name, target, destination, real_destination|
      if File.exist?(real_destination)
        File.symlink(target, destination)
      else
        alert_warning "#{@spec.full_name} ships with a dangling symlink named #{name} pointing to missing #{target} file. Ignoring"
      end
    end

    if dir_mode
      File.chmod(dir_mode, *directories)
    end
  end

  def file_mode(mode) # :nodoc:
    ((mode & 0111).zero? ? data_mode : prog_mode) ||
      # If we're not using one of the default modes, then we're going to fall
      # back to the mode from the tarball. In this case we need to mask it down
      # to fit into 2^16 bits (the maximum value for a mode in CRuby since it
      # gets put into an unsigned short).
      (mode & ((1 << 16) - 1))
  end

  ##
  # Gzips content written to +gz_io+ to +io+.
  #--
  # Also sets the gzip modification time to the package build time to ease
  # testing.

  def gzip_to(io) # :yields: gz_io
    gz_io = Zlib::GzipWriter.new io, Zlib::BEST_COMPRESSION
    gz_io.mtime = @build_time

    yield gz_io
  ensure
    gz_io.close
  end

  ##
  # Returns the full path for installing +filename+.
  #
  # If +filename+ is not inside +destination_dir+ an exception is raised.

  def install_location(filename, destination_dir) # :nodoc:
    raise Gem::Package::PathError.new(filename, destination_dir) if
      filename.start_with? "/"

    destination_dir = File.realpath(destination_dir)
    destination = File.expand_path(filename, destination_dir)

    raise Gem::Package::PathError.new(destination, destination_dir) unless
      normalize_path(destination).start_with? normalize_path(destination_dir + "/")

    destination.tap(&Gem::UNTAINT)
    destination
  end

  def normalize_path(pathname)
    if Gem.win_platform?
      pathname.downcase
    else
      pathname
    end
  end

  ##
  # Loads a Gem::Specification from the TarEntry +entry+

  def load_spec(entry) # :nodoc:
    case entry.full_name
    when "metadata" then
      @spec = Gem::Specification.from_yaml entry.read
    when "metadata.gz" then
      Zlib::GzipReader.wrap(entry, external_encoding: Encoding::UTF_8) do |gzio|
        @spec = Gem::Specification.from_yaml gzio.read
      end
    end
  end

  ##
  # Opens +io+ as a gzipped tar archive

  def open_tar_gz(io) # :nodoc:
    Zlib::GzipReader.wrap io do |gzio|
      tar = Gem::Package::TarReader.new gzio

      yield tar
    end
  end

  ##
  # Reads and loads checksums.yaml.gz from the tar file +gem+

  def read_checksums(gem)
    Gem.load_yaml

    @checksums = gem.seek "checksums.yaml.gz" do |entry|
      Zlib::GzipReader.wrap entry do |gz_io|
        Gem::SafeYAML.safe_load gz_io.read
      end
    end
  end

  ##
  # Prepares the gem for signing and checksum generation.  If a signing
  # certificate and key are not present only checksum generation is set up.

  def setup_signer(signer_options: {})
    passphrase = ENV["GEM_PRIVATE_KEY_PASSPHRASE"]
    if @spec.signing_key
      @signer =
        Gem::Security::Signer.new(
          @spec.signing_key,
          @spec.cert_chain,
          passphrase,
          signer_options
        )

      @spec.signing_key = nil
      @spec.cert_chain = @signer.cert_chain.map {|cert| cert.to_s }
    else
      @signer = Gem::Security::Signer.new nil, nil, passphrase
      @spec.cert_chain = @signer.cert_chain.map {|cert| cert.to_pem } if
        @signer.cert_chain
    end
  end

  ##
  # The spec for this gem.
  #
  # If this is a package for a built gem the spec is loaded from the
  # gem and returned.  If this is a package for a gem being built the provided
  # spec is returned.

  def spec
    verify unless @spec

    @spec
  end

  ##
  # Verifies that this gem:
  #
  # * Contains a valid gem specification
  # * Contains a contents archive
  # * The contents archive is not corrupt
  #
  # After verification the gem specification from the gem is available from
  # #spec

  def verify
    @files     = []
    @spec      = nil

    @gem.with_read_io do |io|
      Gem::Package::TarReader.new io do |reader|
        read_checksums reader

        verify_files reader
      end
    end

    verify_checksums @digests, @checksums

    @security_policy.verify_signatures @spec, @digests, @signatures if
      @security_policy

    true
  rescue Gem::Security::Exception
    @spec = nil
    @files = []
    raise
  rescue Errno::ENOENT => e
    raise Gem::Package::FormatError.new e.message
  rescue Gem::Package::TarInvalidError => e
    raise Gem::Package::FormatError.new e.message, @gem
  end

  ##
  # Verifies the +checksums+ against the +digests+.  This check is not
  # cryptographically secure.  Missing checksums are ignored.

  def verify_checksums(digests, checksums) # :nodoc:
    return unless checksums

    checksums.sort.each do |algorithm, gem_digests|
      gem_digests.sort.each do |file_name, gem_hexdigest|
        computed_digest = digests[algorithm][file_name]

        unless computed_digest.hexdigest == gem_hexdigest
          raise Gem::Package::FormatError.new \
            "#{algorithm} checksum mismatch for #{file_name}", @gem
        end
      end
    end
  end

  ##
  # Verifies +entry+ in a .gem file.

  def verify_entry(entry)
    file_name = entry.full_name
    @files << file_name

    case file_name
    when /\.sig$/ then
      @signatures[$`] = entry.read if @security_policy
      return
    else
      digest entry
    end

    case file_name
    when "metadata", "metadata.gz" then
      load_spec entry
    when "data.tar.gz" then
      verify_gz entry
    end
  rescue
    warn "Exception while verifying #{@gem.path}"
    raise
  end

  ##
  # Verifies the files of the +gem+

  def verify_files(gem)
    gem.each do |entry|
      verify_entry entry
    end

    unless @spec
      raise Gem::Package::FormatError.new "package metadata is missing", @gem
    end

    unless @files.include? "data.tar.gz"
      raise Gem::Package::FormatError.new \
              "package content (data.tar.gz) is missing", @gem
    end

    if (duplicates = @files.group_by {|f| f }.select {|k,v| v.size > 1 }.map(&:first)) && duplicates.any?
      raise Gem::Security::Exception, "duplicate files in the package: (#{duplicates.map(&:inspect).join(', ')})"
    end
  end

  ##
  # Verifies that +entry+ is a valid gzipped file.

  def verify_gz(entry) # :nodoc:
    Zlib::GzipReader.wrap entry do |gzio|
      gzio.read 16384 until gzio.eof? # gzip checksum verification
    end
  rescue Zlib::GzipFile::Error => e
    raise Gem::Package::FormatError.new(e.message, entry.full_name)
  end
end

require_relative "package/digest_io"
require_relative "package/source"
require_relative "package/file_source"
require_relative "package/io_source"
require_relative "package/old"
require_relative "package/tar_header"
require_relative "package/tar_reader"
require_relative "package/tar_reader/entry"
require_relative "package/tar_writer"
PK}$[�_���#rubygems/rubygems/version_option.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require_relative "../rubygems"

##
# Mixin methods for --version and --platform Gem::Command options.

module Gem::VersionOption

  ##
  # Add the --platform option to the option parser.

  def add_platform_option(task = command, *wrap)
    Gem::OptionParser.accept Gem::Platform do |value|
      if value == Gem::Platform::RUBY
        value
      else
        Gem::Platform.new value
      end
    end

    add_option("--platform PLATFORM", Gem::Platform,
               "Specify the platform of gem to #{task}", *wrap) do
                 |value, options|
      unless options[:added_platform]
        Gem.platforms = [Gem::Platform::RUBY]
        options[:added_platform] = true
      end

      Gem.platforms << value unless Gem.platforms.include? value
    end
  end

  ##
  # Add the --prerelease option to the option parser.

  def add_prerelease_option(*wrap)
    add_option("--[no-]prerelease",
               "Allow prerelease versions of a gem", *wrap) do |value, options|
      options[:prerelease] = value
      options[:explicit_prerelease] = true
    end
  end

  ##
  # Add the --version option to the option parser.

  def add_version_option(task = command, *wrap)
    Gem::OptionParser.accept Gem::Requirement do |value|
      Gem::Requirement.new(*value.split(/\s*,\s*/))
    end

    add_option("-v", "--version VERSION", Gem::Requirement,
               "Specify version of gem to #{task}", *wrap) do
                 |value, options|
      # Allow handling for multiple --version operators
      if options[:version] && !options[:version].none?
        options[:version].concat([value])
      else
        options[:version] = value
      end

      explicit_prerelease_set = !options[:explicit_prerelease].nil?
      options[:explicit_prerelease] = false unless explicit_prerelease_set

      options[:prerelease] = value.prerelease? unless
        options[:explicit_prerelease]
    end
  end

  ##
  # Extract platform given on the command line

  def get_platform_from_requirements(requirements)
    Gem.platforms[1].to_s if requirements.key? :added_platform
  end
end
PK}$[yM|�{{rubygems/rubygems/deprecate.rbnu�[���# frozen_string_literal: true
##
# Provides 3 methods for declaring when something is going away.
#
# +deprecate(name, repl, year, month)+:
#     Indicate something may be removed on/after a certain date.
#
# +rubygems_deprecate(name, replacement=:none)+:
#     Indicate something will be removed in the next major RubyGems version,
#     and (optionally) a replacement for it.
#
# +rubygems_deprecate_command+:
#     Indicate a RubyGems command (in +lib/rubygems/commands/*.rb+) will be
#     removed in the next RubyGems version.
#
# Also provides +skip_during+ for temporarily turning off deprecation warnings.
# This is intended to be used in the test suite, so deprecation warnings
# don't cause test failures if you need to make sure stderr is otherwise empty.
#
#
# Example usage of +deprecate+ and +rubygems_deprecate+:
#
#     class Legacy
#       def self.some_class_method
#         # ...
#       end
#
#       def some_instance_method
#         # ...
#       end
#
#       def some_old_method
#         # ...
#       end
#
#       extend Gem::Deprecate
#       deprecate :some_instance_method, "X.z", 2011, 4
#       rubygems_deprecate :some_old_method, "Modern#some_new_method"
#
#       class << self
#         extend Gem::Deprecate
#         deprecate :some_class_method, :none, 2011, 4
#       end
#     end
#
#
# Example usage of +rubygems_deprecate_command+:
#
#     class Gem::Commands::QueryCommand < Gem::Command
#       extend Gem::Deprecate
#       rubygems_deprecate_command
#
#       # ...
#     end
#
#
# Example usage of +skip_during+:
#
#     class TestSomething < Gem::Testcase
#       def test_some_thing_with_deprecations
#         Gem::Deprecate.skip_during do
#           actual_stdout, actual_stderr = capture_output do
#             Gem.something_deprecated
#           end
#           assert_empty actual_stdout
#           assert_equal(expected, actual_stderr)
#         end
#       end
#     end

module Gem::Deprecate

  def self.skip # :nodoc:
    @skip ||= false
  end

  def self.skip=(v) # :nodoc:
    @skip = v
  end

  ##
  # Temporarily turn off warnings. Intended for tests only.

  def skip_during
    Gem::Deprecate.skip, original = true, Gem::Deprecate.skip
    yield
  ensure
    Gem::Deprecate.skip = original
  end

  def self.next_rubygems_major_version # :nodoc:
    Gem::Version.new(Gem.rubygems_version.segments.first).bump
  end

  ##
  # Simple deprecation method that deprecates +name+ by wrapping it up
  # in a dummy method. It warns on each call to the dummy method
  # telling the user of +repl+ (unless +repl+ is :none) and the
  # year/month that it is planned to go away.

  def deprecate(name, repl, year, month)
    class_eval do
      old = "_deprecated_#{name}"
      alias_method old, name
      define_method name do |*args, &block|
        klass = self.kind_of? Module
        target = klass ? "#{self}." : "#{self.class}#"
        msg = [ "NOTE: #{target}#{name} is deprecated",
                repl == :none ? " with no replacement" : "; use #{repl} instead",
                ". It will be removed on or after %4d-%02d." % [year, month],
                "\n#{target}#{name} called from #{Gem.location_of_caller.join(":")}",
        ]
        warn "#{msg.join}." unless Gem::Deprecate.skip
        send old, *args, &block
      end
      ruby2_keywords name if respond_to?(:ruby2_keywords, true)
    end
  end

  ##
  # Simple deprecation method that deprecates +name+ by wrapping it up
  # in a dummy method. It warns on each call to the dummy method
  # telling the user of +repl+ (unless +repl+ is :none) and the
  # Rubygems version that it is planned to go away.

  def rubygems_deprecate(name, replacement=:none)
    class_eval do
      old = "_deprecated_#{name}"
      alias_method old, name
      define_method name do |*args, &block|
        klass = self.kind_of? Module
        target = klass ? "#{self}." : "#{self.class}#"
        msg = [ "NOTE: #{target}#{name} is deprecated",
                replacement == :none ? " with no replacement" : "; use #{replacement} instead",
                ". It will be removed in Rubygems #{Gem::Deprecate.next_rubygems_major_version}",
                "\n#{target}#{name} called from #{Gem.location_of_caller.join(":")}",
        ]
        warn "#{msg.join}." unless Gem::Deprecate.skip
        send old, *args, &block
      end
      ruby2_keywords name if respond_to?(:ruby2_keywords, true)
    end
  end

  # Deprecation method to deprecate Rubygems commands
  def rubygems_deprecate_command
    class_eval do
      define_method "deprecated?" do
        true
      end

      define_method "deprecation_warning" do
        msg = [ "#{self.command} command is deprecated",
                ". It will be removed in Rubygems #{Gem::Deprecate.next_rubygems_major_version}.\n",
        ]

        alert_warning "#{msg.join}" unless Gem::Deprecate.skip
      end
    end
  end

  module_function :rubygems_deprecate, :rubygems_deprecate_command, :skip_during

end
PK}$[�̧

$rubygems/rubygems/security/signer.rbnu�[���# frozen_string_literal: true
##
# Basic OpenSSL-based package signing class.

require_relative "../user_interaction"

class Gem::Security::Signer
  include Gem::UserInteraction

  ##
  # The chain of certificates for signing including the signing certificate

  attr_accessor :cert_chain

  ##
  # The private key for the signing certificate

  attr_accessor :key

  ##
  # The digest algorithm used to create the signature

  attr_reader :digest_algorithm

  ##
  # The name of the digest algorithm, used to pull digests out of the hash by
  # name.

  attr_reader :digest_name # :nodoc:

  ##
  # Gem::Security::Signer options

  attr_reader :options

  DEFAULT_OPTIONS = {
    expiration_length_days: 365,
  }.freeze

  ##
  # Attempts to re-sign an expired cert with a given private key
  def self.re_sign_cert(expired_cert, expired_cert_path, private_key)
    return unless expired_cert.not_after < Time.now

    expiry = expired_cert.not_after.strftime("%Y%m%d%H%M%S")
    expired_cert_file = "#{File.basename(expired_cert_path)}.expired.#{expiry}"
    new_expired_cert_path = File.join(Gem.user_home, ".gem", expired_cert_file)

    Gem::Security.write(expired_cert, new_expired_cert_path)

    re_signed_cert = Gem::Security.re_sign(
      expired_cert,
      private_key,
      (Gem::Security::ONE_DAY * Gem.configuration.cert_expiration_length_days)
    )

    Gem::Security.write(re_signed_cert, expired_cert_path)

    yield(expired_cert_path, new_expired_cert_path) if block_given?
  end

  ##
  # Creates a new signer with an RSA +key+ or path to a key, and a certificate
  # +chain+ containing X509 certificates, encoding certificates or paths to
  # certificates.

  def initialize(key, cert_chain, passphrase = nil, options = {})
    @cert_chain = cert_chain
    @key        = key
    @passphrase = passphrase
    @options = DEFAULT_OPTIONS.merge(options)

    unless @key
      default_key = File.join Gem.default_key_path
      @key = default_key if File.exist? default_key
    end

    unless @cert_chain
      default_cert = File.join Gem.default_cert_path
      @cert_chain = [default_cert] if File.exist? default_cert
    end

    @digest_name      = Gem::Security::DIGEST_NAME
    @digest_algorithm = Gem::Security.create_digest(@digest_name)

    if @key && !@key.is_a?(OpenSSL::PKey::PKey)
      @key = OpenSSL::PKey.read(File.read(@key), @passphrase)
    end

    if @cert_chain
      @cert_chain = @cert_chain.compact.map do |cert|
        next cert if OpenSSL::X509::Certificate === cert

        cert = File.read cert if File.exist? cert

        OpenSSL::X509::Certificate.new cert
      end

      load_cert_chain
    end
  end

  ##
  # Extracts the full name of +cert+.  If the certificate has a subjectAltName
  # this value is preferred, otherwise the subject is used.

  def extract_name(cert) # :nodoc:
    subject_alt_name = cert.extensions.find {|e| "subjectAltName" == e.oid }

    if subject_alt_name
      /\Aemail:/ =~ subject_alt_name.value # rubocop:disable Performance/StartWith

      $' || subject_alt_name.value
    else
      cert.subject
    end
  end

  ##
  # Loads any missing issuers in the cert chain from the trusted certificates.
  #
  # If the issuer does not exist it is ignored as it will be checked later.

  def load_cert_chain # :nodoc:
    return if @cert_chain.empty?

    while @cert_chain.first.issuer.to_s != @cert_chain.first.subject.to_s do
      issuer = Gem::Security.trust_dir.issuer_of @cert_chain.first

      break unless issuer # cert chain is verified later

      @cert_chain.unshift issuer
    end
  end

  ##
  # Sign data with given digest algorithm

  def sign(data)
    return unless @key

    raise Gem::Security::Exception, "no certs provided" if @cert_chain.empty?

    if @cert_chain.length == 1 && @cert_chain.last.not_after < Time.now
      alert("Your certificate has expired, trying to re-sign it...")

      re_sign_key(
        expiration_length: (Gem::Security::ONE_DAY * options[:expiration_length_days])
      )
    end

    full_name = extract_name @cert_chain.last

    Gem::Security::SigningPolicy.verify @cert_chain, @key, {}, {}, full_name

    @key.sign @digest_algorithm.new, data
  end

  ##
  # Attempts to re-sign the private key if the signing certificate is expired.
  #
  # The key will be re-signed if:
  # * The expired certificate is self-signed
  # * The expired certificate is saved at ~/.gem/gem-public_cert.pem
  #   and the private key is saved at ~/.gem/gem-private_key.pem
  # * There is no file matching the expiry date at
  #   ~/.gem/gem-public_cert.pem.expired.%Y%m%d%H%M%S
  #
  # If the signing certificate can be re-signed the expired certificate will
  # be saved as ~/.gem/gem-public_cert.pem.expired.%Y%m%d%H%M%S where the
  # expiry time (not after) is used for the timestamp.

  def re_sign_key(expiration_length: Gem::Security::ONE_YEAR) # :nodoc:
    old_cert = @cert_chain.last

    disk_cert_path = File.join(Gem.default_cert_path)
    disk_cert = File.read(disk_cert_path) rescue nil

    disk_key_path = File.join(Gem.default_key_path)
    disk_key = OpenSSL::PKey.read(File.read(disk_key_path), @passphrase) rescue nil

    return unless disk_key

    if disk_key.to_pem == @key.to_pem && disk_cert == old_cert.to_pem
      expiry = old_cert.not_after.strftime("%Y%m%d%H%M%S")
      old_cert_file = "gem-public_cert.pem.expired.#{expiry}"
      old_cert_path = File.join(Gem.user_home, ".gem", old_cert_file)

      unless File.exist?(old_cert_path)
        Gem::Security.write(old_cert, old_cert_path)

        cert = Gem::Security.re_sign(old_cert, @key, expiration_length)

        Gem::Security.write(cert, disk_cert_path)

        alert("Your cert: #{disk_cert_path} has been auto re-signed with the key: #{disk_key_path}")
        alert("Your expired cert will be located at: #{old_cert_path}")

        @cert_chain = [cert]
      end
    end
  end
end
PK}$[���

'rubygems/rubygems/security/trust_dir.rbnu�[���# frozen_string_literal: true
##
# The TrustDir manages the trusted certificates for gem signature
# verification.

class Gem::Security::TrustDir
  ##
  # Default permissions for the trust directory and its contents

  DEFAULT_PERMISSIONS = {
    :trust_dir    => 0700,
    :trusted_cert => 0600,
  }.freeze

  ##
  # The directory where trusted certificates will be stored.

  attr_reader :dir

  ##
  # Creates a new TrustDir using +dir+ where the directory and file
  # permissions will be checked according to +permissions+

  def initialize(dir, permissions = DEFAULT_PERMISSIONS)
    @dir = dir
    @permissions = permissions

    @digester = Gem::Security.create_digest
  end

  ##
  # Returns the path to the trusted +certificate+

  def cert_path(certificate)
    name_path certificate.subject
  end

  ##
  # Enumerates trusted certificates.

  def each_certificate
    return enum_for __method__ unless block_given?

    glob = File.join @dir, "*.pem"

    Dir[glob].each do |certificate_file|
      begin
        certificate = load_certificate certificate_file

        yield certificate, certificate_file
      rescue OpenSSL::X509::CertificateError
        next # HACK warn
      end
    end
  end

  ##
  # Returns the issuer certificate of the given +certificate+ if it exists in
  # the trust directory.

  def issuer_of(certificate)
    path = name_path certificate.issuer

    return unless File.exist? path

    load_certificate path
  end

  ##
  # Returns the path to the trusted certificate with the given ASN.1 +name+

  def name_path(name)
    digest = @digester.hexdigest name.to_s

    File.join @dir, "cert-#{digest}.pem"
  end

  ##
  # Loads the given +certificate_file+

  def load_certificate(certificate_file)
    pem = File.read certificate_file

    OpenSSL::X509::Certificate.new pem
  end

  ##
  # Add a certificate to trusted certificate list.

  def trust_cert(certificate)
    verify

    destination = cert_path certificate

    File.open destination, "wb", 0600 do |io|
      io.write certificate.to_pem
      io.chmod(@permissions[:trusted_cert])
    end
  end

  ##
  # Make sure the trust directory exists.  If it does exist, make sure it's
  # actually a directory.  If not, then create it with the appropriate
  # permissions.

  def verify
    require "fileutils"
    if File.exist? @dir
      raise Gem::Security::Exception,
        "trust directory #{@dir} is not a directory" unless
          File.directory? @dir

      FileUtils.chmod 0700, @dir
    else
      FileUtils.mkdir_p @dir, :mode => @permissions[:trust_dir]
    end
  end
end
PK}$[0v��DD$rubygems/rubygems/security/policy.rbnu�[���# frozen_string_literal: true
require_relative "../user_interaction"

##
# A Gem::Security::Policy object encapsulates the settings for verifying
# signed gem files.  This is the base class.  You can either declare an
# instance of this or use one of the preset security policies in
# Gem::Security::Policies.

class Gem::Security::Policy
  include Gem::UserInteraction

  attr_reader :name

  attr_accessor :only_signed
  attr_accessor :only_trusted
  attr_accessor :verify_chain
  attr_accessor :verify_data
  attr_accessor :verify_root
  attr_accessor :verify_signer

  ##
  # Create a new Gem::Security::Policy object with the given mode and
  # options.

  def initialize(name, policy = {}, opt = {})
    @name = name

    @opt = opt

    # Default to security
    @only_signed   = true
    @only_trusted  = true
    @verify_chain  = true
    @verify_data   = true
    @verify_root   = true
    @verify_signer = true

    policy.each_pair do |key, val|
      case key
      when :verify_data   then @verify_data   = val
      when :verify_signer then @verify_signer = val
      when :verify_chain  then @verify_chain  = val
      when :verify_root   then @verify_root   = val
      when :only_trusted  then @only_trusted  = val
      when :only_signed   then @only_signed   = val
      end
    end
  end

  ##
  # Verifies each certificate in +chain+ has signed the following certificate
  # and is valid for the given +time+.

  def check_chain(chain, time)
    raise Gem::Security::Exception, "missing signing chain" unless chain
    raise Gem::Security::Exception, "empty signing chain" if chain.empty?

    begin
      chain.each_cons 2 do |issuer, cert|
        check_cert cert, issuer, time
      end

      true
    rescue Gem::Security::Exception => e
      raise Gem::Security::Exception, "invalid signing chain: #{e.message}"
    end
  end

  ##
  # Verifies that +data+ matches the +signature+ created by +public_key+ and
  # the +digest+ algorithm.

  def check_data(public_key, digest, signature, data)
    raise Gem::Security::Exception, "invalid signature" unless
      public_key.verify digest, signature, data.digest

    true
  end

  ##
  # Ensures that +signer+ is valid for +time+ and was signed by the +issuer+.
  # If the +issuer+ is +nil+ no verification is performed.

  def check_cert(signer, issuer, time)
    raise Gem::Security::Exception, "missing signing certificate" unless
      signer

    message = "certificate #{signer.subject}"

    if (not_before = signer.not_before) && not_before > time
      raise Gem::Security::Exception,
            "#{message} not valid before #{not_before}"
    end

    if (not_after = signer.not_after) && not_after < time
      raise Gem::Security::Exception, "#{message} not valid after #{not_after}"
    end

    if issuer && !signer.verify(issuer.public_key)
      raise Gem::Security::Exception,
            "#{message} was not issued by #{issuer.subject}"
    end

    true
  end

  ##
  # Ensures the public key of +key+ matches the public key in +signer+

  def check_key(signer, key)
    unless signer && key
      return true unless @only_signed

      raise Gem::Security::Exception, "missing key or signature"
    end

    raise Gem::Security::Exception,
      "certificate #{signer.subject} does not match the signing key" unless
        signer.check_private_key(key)

    true
  end

  ##
  # Ensures the root certificate in +chain+ is self-signed and valid for
  # +time+.

  def check_root(chain, time)
    raise Gem::Security::Exception, "missing signing chain" unless chain

    root = chain.first

    raise Gem::Security::Exception, "missing root certificate" unless root

    raise Gem::Security::Exception,
          "root certificate #{root.subject} is not self-signed " +
          "(issuer #{root.issuer})" if
      root.issuer != root.subject

    check_cert root, root, time
  end

  ##
  # Ensures the root of +chain+ has a trusted certificate in +trust_dir+ and
  # the digests of the two certificates match according to +digester+

  def check_trust(chain, digester, trust_dir)
    raise Gem::Security::Exception, "missing signing chain" unless chain

    root = chain.first

    raise Gem::Security::Exception, "missing root certificate" unless root

    path = Gem::Security.trust_dir.cert_path root

    unless File.exist? path
      message = "root cert #{root.subject} is not trusted".dup

      message << " (root of signing cert #{chain.last.subject})" if
        chain.length > 1

      raise Gem::Security::Exception, message
    end

    save_cert = OpenSSL::X509::Certificate.new File.read path
    save_dgst = digester.digest save_cert.public_key.to_pem

    pkey_str = root.public_key.to_pem
    cert_dgst = digester.digest pkey_str

    raise Gem::Security::Exception,
          "trusted root certificate #{root.subject} checksum " +
          "does not match signing root certificate checksum" unless
      save_dgst == cert_dgst

    true
  end

  ##
  # Extracts the email or subject from +certificate+

  def subject(certificate) # :nodoc:
    certificate.extensions.each do |extension|
      next unless extension.oid == "subjectAltName"

      return extension.value
    end

    certificate.subject.to_s
  end

  def inspect # :nodoc:
    ("[Policy: %s - data: %p signer: %p chain: %p root: %p " +
     "signed-only: %p trusted-only: %p]") % [
       @name, @verify_chain, @verify_data, @verify_root, @verify_signer,
       @only_signed, @only_trusted
     ]
  end

  ##
  # For +full_name+, verifies the certificate +chain+ is valid, the +digests+
  # match the signatures +signatures+ created by the signer depending on the
  # +policy+ settings.
  #
  # If +key+ is given it is used to validate the signing certificate.

  def verify(chain, key = nil, digests = {}, signatures = {},
             full_name = "(unknown)")
    if signatures.empty?
      if @only_signed
        raise Gem::Security::Exception,
          "unsigned gems are not allowed by the #{name} policy"
      elsif digests.empty?
        # lack of signatures is irrelevant if there is nothing to check
        # against
      else
        alert_warning "#{full_name} is not signed"
        return
      end
    end

    opt       = @opt
    digester  = Gem::Security.create_digest
    trust_dir = opt[:trust_dir]
    time      = Time.now

    _, signer_digests = digests.find do |algorithm, file_digests|
      file_digests.values.first.name == Gem::Security::DIGEST_NAME
    end

    if @verify_data
      raise Gem::Security::Exception, "no digests provided (probable bug)" if
        signer_digests.nil? || signer_digests.empty?
    else
      signer_digests = {}
    end

    signer = chain.last

    check_key signer, key if key

    check_cert signer, nil, time if @verify_signer

    check_chain chain, time if @verify_chain

    check_root chain, time if @verify_root

    if @only_trusted
      check_trust chain, digester, trust_dir
    elsif signatures.empty? && digests.empty?
      # trust is irrelevant if there's no signatures to verify
    else
      alert_warning "#{subject signer} is not trusted for #{full_name}"
    end

    signatures.each do |file, _|
      digest = signer_digests[file]

      raise Gem::Security::Exception, "missing digest for #{file}" unless
        digest
    end

    signer_digests.each do |file, digest|
      signature = signatures[file]

      raise Gem::Security::Exception, "missing signature for #{file}" unless
        signature

      check_data signer.public_key, digester, signature, digest if @verify_data
    end

    true
  end

  ##
  # Extracts the certificate chain from the +spec+ and calls #verify to ensure
  # the signatures and certificate chain is valid according to the policy..

  def verify_signatures(spec, digests, signatures)
    chain = spec.cert_chain.map do |cert_pem|
      OpenSSL::X509::Certificate.new cert_pem
    end

    verify chain, nil, digests, signatures, spec.full_name

    true
  end

  alias to_s name # :nodoc:
end
PK}$[˪m"Y
Y
&rubygems/rubygems/security/policies.rbnu�[���# frozen_string_literal: true
module Gem::Security

  ##
  # No security policy: all package signature checks are disabled.

  NoSecurity = Policy.new(
    "No Security",
    :verify_data      => false,
    :verify_signer    => false,
    :verify_chain     => false,
    :verify_root      => false,
    :only_trusted     => false,
    :only_signed      => false
  )

  ##
  # AlmostNo security policy: only verify that the signing certificate is the
  # one that actually signed the data.  Make no attempt to verify the signing
  # certificate chain.
  #
  # This policy is basically useless. better than nothing, but can still be
  # easily spoofed, and is not recommended.

  AlmostNoSecurity = Policy.new(
    "Almost No Security",
    :verify_data      => true,
    :verify_signer    => false,
    :verify_chain     => false,
    :verify_root      => false,
    :only_trusted     => false,
    :only_signed      => false
  )

  ##
  # Low security policy: only verify that the signing certificate is actually
  # the gem signer, and that the signing certificate is valid.
  #
  # This policy is better than nothing, but can still be easily spoofed, and
  # is not recommended.

  LowSecurity = Policy.new(
    "Low Security",
    :verify_data      => true,
    :verify_signer    => true,
    :verify_chain     => false,
    :verify_root      => false,
    :only_trusted     => false,
    :only_signed      => false
  )

  ##
  # Medium security policy: verify the signing certificate, verify the signing
  # certificate chain all the way to the root certificate, and only trust root
  # certificates that we have explicitly allowed trust for.
  #
  # This security policy is reasonable, but it allows unsigned packages, so a
  # malicious person could simply delete the package signature and pass the
  # gem off as unsigned.

  MediumSecurity = Policy.new(
    "Medium Security",
    :verify_data      => true,
    :verify_signer    => true,
    :verify_chain     => true,
    :verify_root      => true,
    :only_trusted     => true,
    :only_signed      => false
  )

  ##
  # High security policy: only allow signed gems to be installed, verify the
  # signing certificate, verify the signing certificate chain all the way to
  # the root certificate, and only trust root certificates that we have
  # explicitly allowed trust for.
  #
  # This security policy is significantly more difficult to bypass, and offers
  # a reasonable guarantee that the contents of the gem have not been altered.

  HighSecurity = Policy.new(
    "High Security",
    :verify_data      => true,
    :verify_signer    => true,
    :verify_chain     => true,
    :verify_root      => true,
    :only_trusted     => true,
    :only_signed      => true
  )

  ##
  # Policy used to verify a certificate and key when signing a gem

  SigningPolicy = Policy.new(
    "Signing Policy",
    :verify_data      => false,
    :verify_signer    => true,
    :verify_chain     => true,
    :verify_root      => true,
    :only_trusted     => false,
    :only_signed      => false
  )

  ##
  # Hash of configured security policies

  Policies = {
    "NoSecurity"       => NoSecurity,
    "AlmostNoSecurity" => AlmostNoSecurity,
    "LowSecurity"      => LowSecurity,
    "MediumSecurity"   => MediumSecurity,
    "HighSecurity"     => HighSecurity,
    # SigningPolicy is not intended for use by `gem -P` so do not list it
  }.freeze

end
PK}$[7x�;��rubygems/rubygems/validator.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require_relative "package"
require_relative "installer"

##
# Validator performs various gem file and gem database validation

class Gem::Validator
  include Gem::UserInteraction

  def initialize # :nodoc:
    require "find"
  end

  private

  def find_files_for_gem(gem_directory)
    installed_files = []

    Find.find gem_directory do |file_name|
      fn = file_name[gem_directory.size..file_name.size - 1].sub(/^\//, "")
      installed_files << fn unless
        fn =~ /CVS/ || fn.empty? || File.directory?(file_name)
    end

    installed_files
  end

  public

  ##
  # Describes a problem with a file in a gem.

  ErrorData = Struct.new :path, :problem do
    def <=>(other) # :nodoc:
      return nil unless self.class === other

      [path, problem] <=> [other.path, other.problem]
    end
  end

  ##
  # Checks the gem directory for the following potential
  # inconsistencies/problems:
  #
  # * Checksum gem itself
  # * For each file in each gem, check consistency of installed versions
  # * Check for files that aren't part of the gem but are in the gems directory
  # * 1 cache - 1 spec - 1 directory.
  #
  # returns a hash of ErrorData objects, keyed on the problem gem's name.
  #--
  # TODO needs further cleanup

  def alien(gems=[])
    errors = Hash.new {|h,k| h[k] = {} }

    Gem::Specification.each do |spec|
      next unless gems.include? spec.name unless gems.empty?
      next if spec.default_gem?

      gem_name      = spec.file_name
      gem_path      = spec.cache_file
      spec_path     = spec.spec_file
      gem_directory = spec.full_gem_path

      unless File.directory? gem_directory
        errors[gem_name][spec.full_name] =
          "Gem registered but doesn't exist at #{gem_directory}"
        next
      end

      unless File.exist? spec_path
        errors[gem_name][spec_path] = "Spec file missing for installed gem"
      end

      begin
        unless File.readable?(gem_path)
          raise Gem::VerificationError, "missing gem file #{gem_path}"
        end

        good, gone, unreadable = nil, nil, nil, nil

        File.open gem_path, Gem.binary_mode do |file|
          package = Gem::Package.new gem_path

          good, gone = package.contents.partition do |file_name|
            File.exist? File.join(gem_directory, file_name)
          end

          gone.sort.each do |path|
            errors[gem_name][path] = "Missing file"
          end

          good, unreadable = good.partition do |file_name|
            File.readable? File.join(gem_directory, file_name)
          end

          unreadable.sort.each do |path|
            errors[gem_name][path] = "Unreadable file"
          end

          good.each do |entry, data|
            begin
              next unless data # HACK `gem check -a mkrf`

              source = File.join gem_directory, entry["path"]

              File.open source, Gem.binary_mode do |f|
                unless f.read == data
                  errors[gem_name][entry["path"]] = "Modified from original"
                end
              end
            end
          end
        end

        installed_files = find_files_for_gem(gem_directory)
        extras = installed_files - good - unreadable

        extras.each do |extra|
          errors[gem_name][extra] = "Extra file"
        end
      rescue Gem::VerificationError => e
        errors[gem_name][gem_path] = e.message
      end
    end

    errors.each do |name, subhash|
      errors[name] = subhash.map do |path, msg|
        ErrorData.new path, msg
      end.sort
    end

    errors
  end
end
PK}$[�:���rubygems/rubygems/ext.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

##
# Classes for building C extensions live here.

module Gem::Ext; end

require_relative "ext/build_error"
require_relative "ext/builder"
require_relative "ext/configure_builder"
require_relative "ext/ext_conf_builder"
require_relative "ext/rake_builder"
require_relative "ext/cmake_builder"
require_relative "ext/cargo_builder"
PK}$[L�l++$rubygems/rubygems/dependency_list.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require_relative "tsort"
require_relative "deprecate"

##
# Gem::DependencyList is used for installing and uninstalling gems in the
# correct order to avoid conflicts.
#--
# TODO: It appears that all but topo-sort functionality is being duplicated
# (or is planned to be duplicated) elsewhere in rubygems.  Is the majority of
# this class necessary anymore?  Especially #ok?, #why_not_ok?

class Gem::DependencyList
  attr_reader :specs

  include Enumerable
  include Gem::TSort

  ##
  # Allows enabling/disabling use of development dependencies

  attr_accessor :development

  ##
  # Creates a DependencyList from the current specs.

  def self.from_specs
    list = new
    list.add(*Gem::Specification.to_a)
    list
  end

  ##
  # Creates a new DependencyList.  If +development+ is true, development
  # dependencies will be included.

  def initialize(development = false)
    @specs = []

    @development = development
  end

  ##
  # Adds +gemspecs+ to the dependency list.

  def add(*gemspecs)
    @specs.concat gemspecs
  end

  def clear
    @specs.clear
  end

  ##
  # Return a list of the gem specifications in the dependency list, sorted in
  # order so that no gemspec in the list depends on a gemspec earlier in the
  # list.
  #
  # This is useful when removing gems from a set of installed gems.  By
  # removing them in the returned order, you don't get into as many dependency
  # issues.
  #
  # If there are circular dependencies (yuck!), then gems will be returned in
  # order until only the circular dependents and anything they reference are
  # left.  Then arbitrary gemspecs will be returned until the circular
  # dependency is broken, after which gems will be returned in dependency
  # order again.

  def dependency_order
    sorted = strongly_connected_components.flatten

    result = []
    seen = {}

    sorted.each do |spec|
      if index = seen[spec.name]
        if result[index].version < spec.version
          result[index] = spec
        end
      else
        seen[spec.name] = result.length
        result << spec
      end
    end

    result.reverse
  end

  ##
  # Iterator over dependency_order

  def each(&block)
    dependency_order.each(&block)
  end

  def find_name(full_name)
    @specs.find {|spec| spec.full_name == full_name }
  end

  def inspect # :nodoc:
    "%s %p>" % [super[0..-2], map {|s| s.full_name }]
  end

  ##
  # Are all the dependencies in the list satisfied?

  def ok?
    why_not_ok?(:quick).empty?
  end

  def why_not_ok?(quick = false)
    unsatisfied = Hash.new {|h,k| h[k] = [] }
    each do |spec|
      spec.runtime_dependencies.each do |dep|
        inst = Gem::Specification.any? do |installed_spec|
          dep.name == installed_spec.name &&
            dep.requirement.satisfied_by?(installed_spec.version)
        end

        unless inst || @specs.find {|s| s.satisfies_requirement? dep }
          unsatisfied[spec.name] << dep
          return unsatisfied if quick
        end
      end
    end

    unsatisfied
  end

  ##
  # It is ok to remove a gemspec from the dependency list?
  #
  # If removing the gemspec creates breaks a currently ok dependency, then it
  # is NOT ok to remove the gemspec.

  def ok_to_remove?(full_name, check_dev=true)
    gem_to_remove = find_name full_name

    # If the state is inconsistent, at least don't crash
    return true unless gem_to_remove

    siblings = @specs.find_all do |s|
      s.name == gem_to_remove.name &&
        s.full_name != gem_to_remove.full_name
    end

    deps = []

    @specs.each do |spec|
      check = check_dev ? spec.dependencies : spec.runtime_dependencies

      check.each do |dep|
        deps << dep if gem_to_remove.satisfies_requirement?(dep)
      end
    end

    deps.all? do |dep|
      siblings.any? do |s|
        s.satisfies_requirement? dep
      end
    end
  end

  ##
  # Remove everything in the DependencyList that matches but doesn't
  # satisfy items in +dependencies+ (a hash of gem names to arrays of
  # dependencies).

  def remove_specs_unsatisfied_by(dependencies)
    specs.reject! do |spec|
      dep = dependencies[spec.name]
      dep && !dep.requirement.satisfied_by?(spec.version)
    end
  end

  ##
  # Removes the gemspec matching +full_name+ from the dependency list

  def remove_by_name(full_name)
    @specs.delete_if {|spec| spec.full_name == full_name }
  end

  ##
  # Return a hash of predecessors.  <tt>result[spec]</tt> is an Array of
  # gemspecs that have a dependency satisfied by the named gemspec.

  def spec_predecessors
    result = Hash.new {|h,k| h[k] = [] }

    specs = @specs.sort.reverse

    specs.each do |spec|
      specs.each do |other|
        next if spec == other

        other.dependencies.each do |dep|
          if spec.satisfies_requirement? dep
            result[spec] << other
          end
        end
      end
    end

    result
  end

  def tsort_each_node(&block)
    @specs.each(&block)
  end

  def tsort_each_child(node)
    specs = @specs.sort.reverse

    dependencies = node.runtime_dependencies
    dependencies.push(*node.development_dependencies) if @development

    dependencies.each do |dep|
      specs.each do |spec|
        if spec.satisfies_requirement? dep
          yield spec
          break
        end
      end
    end
  end

  private

  ##
  # Count the number of gemspecs in the list +specs+ that are not in
  # +ignored+.

  def active_count(specs, ignored)
    specs.count {|spec| ignored[spec.full_name].nil? }
  end
end
PK}$[�y�1rr!rubygems/rubygems/spec_fetcher.rbnu�[���# frozen_string_literal: true
require_relative "remote_fetcher"
require_relative "user_interaction"
require_relative "errors"
require_relative "text"
require_relative "name_tuple"

##
# SpecFetcher handles metadata updates from remote gem repositories.

class Gem::SpecFetcher
  include Gem::UserInteraction
  include Gem::Text

  ##
  # Cache of latest specs

  attr_reader :latest_specs # :nodoc:

  ##
  # Sources for this SpecFetcher

  attr_reader :sources # :nodoc:

  ##
  # Cache of all released specs

  attr_reader :specs # :nodoc:

  ##
  # Cache of prerelease specs

  attr_reader :prerelease_specs # :nodoc:

  @fetcher = nil

  ##
  # Default fetcher instance.  Use this instead of ::new to reduce object
  # allocation.

  def self.fetcher
    @fetcher ||= new
  end

  def self.fetcher=(fetcher) # :nodoc:
    @fetcher = fetcher
  end

  ##
  # Creates a new SpecFetcher.  Ordinarily you want to use the default fetcher
  # from Gem::SpecFetcher::fetcher which uses the Gem.sources.
  #
  # If you need to retrieve specifications from a different +source+, you can
  # send it as an argument.

  def initialize(sources = nil)
    @sources = sources || Gem.sources

    @update_cache =
      begin
        File.stat(Gem.user_home).uid == Process.uid
      rescue Errno::EACCES, Errno::ENOENT
        false
      end

    @specs = {}
    @latest_specs = {}
    @prerelease_specs = {}

    @caches = {
      :latest => @latest_specs,
      :prerelease => @prerelease_specs,
      :released => @specs,
    }

    @fetcher = Gem::RemoteFetcher.fetcher
  end

  ##
  #
  # Find and fetch gem name tuples that match +dependency+.
  #
  # If +matching_platform+ is false, gems for all platforms are returned.

  def search_for_dependency(dependency, matching_platform=true)
    found = {}

    rejected_specs = {}

    list, errors = available_specs(dependency.identity)

    list.each do |source, specs|
      if dependency.name.is_a?(String) && specs.respond_to?(:bsearch)
        start_index = (0 ... specs.length).bsearch {|i| specs[i].name >= dependency.name }
        end_index   = (0 ... specs.length).bsearch {|i| specs[i].name > dependency.name }
        specs = specs[start_index ... end_index] if start_index && end_index
      end

      found[source] = specs.select do |tup|
        if dependency.match?(tup)
          if matching_platform && !Gem::Platform.match_gem?(tup.platform, tup.name)
            pm = (
              rejected_specs[dependency] ||= \
                Gem::PlatformMismatch.new(tup.name, tup.version))
            pm.add_platform tup.platform
            false
          else
            true
          end
        end
      end
    end

    errors += rejected_specs.values

    tuples = []

    found.each do |source, specs|
      specs.each do |s|
        tuples << [s, source]
      end
    end

    tuples = tuples.sort_by {|x| x[0].version }

    return [tuples, errors]
  end

  ##
  # Return all gem name tuples who's names match +obj+

  def detect(type=:complete)
    tuples = []

    list, _ = available_specs(type)
    list.each do |source, specs|
      specs.each do |tup|
        if yield(tup)
          tuples << [tup, source]
        end
      end
    end

    tuples
  end

  ##
  # Find and fetch specs that match +dependency+.
  #
  # If +matching_platform+ is false, gems for all platforms are returned.

  def spec_for_dependency(dependency, matching_platform=true)
    tuples, errors = search_for_dependency(dependency, matching_platform)

    specs = []
    tuples.each do |tup, source|
      begin
        spec = source.fetch_spec(tup)
      rescue Gem::RemoteFetcher::FetchError => e
        errors << Gem::SourceFetchProblem.new(source, e)
      else
        specs << [spec, source]
      end
    end

    return [specs, errors]
  end

  ##
  # Suggests gems based on the supplied +gem_name+. Returns an array of
  # alternative gem names.

  def suggest_gems_from_name(gem_name, type = :latest, num_results = 5)
    gem_name        = gem_name.downcase.tr("_-", "")
    max             = gem_name.size / 2
    names           = available_specs(type).first.values.flatten(1)

    matches = names.map do |n|
      next unless n.match_platform?
      [n.name, 0] if n.name.downcase.tr("_-", "").include?(gem_name)
    end.compact

    if matches.length < num_results
      matches += names.map do |n|
        next unless n.match_platform?
        distance = levenshtein_distance gem_name, n.name.downcase.tr("_-", "")
        next if distance >= max
        return [n.name] if distance == 0
        [n.name, distance]
      end.compact
    end

    matches = if matches.empty? && type != :prerelease
      suggest_gems_from_name gem_name, :prerelease
    else
      matches.uniq.sort_by {|name, dist| dist }
    end

    matches.map {|name, dist| name }.uniq.first(num_results)
  end

  ##
  # Returns a list of gems available for each source in Gem::sources.
  #
  # +type+ can be one of 3 values:
  # :released   => Return the list of all released specs
  # :complete   => Return the list of all specs
  # :latest     => Return the list of only the highest version of each gem
  # :prerelease => Return the list of all prerelease only specs
  #

  def available_specs(type)
    errors = []
    list = {}

    @sources.each_source do |source|
      begin
        names = case type
        when :latest
          tuples_for source, :latest
        when :released
          tuples_for source, :released
        when :complete
          names =
            tuples_for(source, :prerelease, true) +
            tuples_for(source, :released)

          names.sort
        when :abs_latest
          names =
            tuples_for(source, :prerelease, true) +
            tuples_for(source, :latest)

          names.sort
        when :prerelease
          tuples_for(source, :prerelease)
        else
          raise Gem::Exception, "Unknown type - :#{type}"
        end
      rescue Gem::RemoteFetcher::FetchError => e
        errors << Gem::SourceFetchProblem.new(source, e)
      else
        list[source] = names
      end
    end

    [list, errors]
  end

  ##
  # Retrieves NameTuples from +source+ of the given +type+ (:prerelease,
  # etc.).  If +gracefully_ignore+ is true, errors are ignored.

  def tuples_for(source, type, gracefully_ignore=false) # :nodoc:
    @caches[type][source.uri] ||=
      source.load_specs(type).sort_by {|tup| tup.name }
  rescue Gem::RemoteFetcher::FetchError
    raise unless gracefully_ignore
    []
  end
end
PK}$[����&rubygems/rubygems/resolver/lock_set.rbnu�[���# frozen_string_literal: true
##
# A set of gems from a gem dependencies lockfile.

class Gem::Resolver::LockSet < Gem::Resolver::Set
  attr_reader :specs # :nodoc:

  ##
  # Creates a new LockSet from the given +sources+

  def initialize(sources)
    super()

    @sources = sources.map do |source|
      Gem::Source::Lock.new source
    end

    @specs = []
  end

  ##
  # Creates a new IndexSpecification in this set using the given +name+,
  # +version+ and +platform+.
  #
  # The specification's set will be the current set, and the source will be
  # the current set's source.

  def add(name, version, platform) # :nodoc:
    version = Gem::Version.new version
    specs = [
      Gem::Resolver::LockSpecification.new(self, name, version, @sources, platform),
    ]

    @specs.concat specs

    specs
  end

  ##
  # Returns an Array of IndexSpecification objects matching the
  # DependencyRequest +req+.

  def find_all(req)
    @specs.select do |spec|
      req.match? spec
    end
  end

  ##
  # Loads a Gem::Specification with the given +name+, +version+ and
  # +platform+.  +source+ is ignored.

  def load_spec(name, version, platform, source) # :nodoc:
    dep = Gem::Dependency.new name, version

    found = @specs.find do |spec|
      dep.matches_spec?(spec) && spec.platform == platform
    end

    tuple = Gem::NameTuple.new found.name, found.version, found.platform

    found.source.fetch_spec tuple
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[LockSet", "]" do
      q.breakable
      q.text "source:"

      q.breakable
      q.pp @source

      q.breakable
      q.text "specs:"

      q.breakable
      q.pp @specs.map {|spec| spec.full_name }
    end
  end
end
PK}$[�]�I		0rubygems/rubygems/resolver/dependency_request.rbnu�[���# frozen_string_literal: true
##
# Used Internally. Wraps a Dependency object to also track which spec
# contained the Dependency.

class Gem::Resolver::DependencyRequest
  ##
  # The wrapped Gem::Dependency

  attr_reader :dependency

  ##
  # The request for this dependency.

  attr_reader :requester

  ##
  # Creates a new DependencyRequest for +dependency+ from +requester+.
  # +requester may be nil if the request came from a user.

  def initialize(dependency, requester)
    @dependency = dependency
    @requester  = requester
  end

  def ==(other) # :nodoc:
    case other
    when Gem::Dependency
      @dependency == other
    when Gem::Resolver::DependencyRequest
      @dependency == other.dependency
    else
      false
    end
  end

  ##
  # Is this dependency a development dependency?

  def development?
    @dependency.type == :development
  end

  ##
  # Does this dependency request match +spec+?
  #
  # NOTE:  #match? only matches prerelease versions when #dependency is a
  # prerelease dependency.

  def match?(spec, allow_prerelease = false)
    @dependency.match? spec, nil, allow_prerelease
  end

  ##
  # Does this dependency request match +spec+?
  #
  # NOTE:  #matches_spec? matches prerelease versions.  See also #match?

  def matches_spec?(spec)
    @dependency.matches_spec? spec
  end

  ##
  # The name of the gem this dependency request is requesting.

  def name
    @dependency.name
  end

  def type
    @dependency.type
  end

  ##
  # Indicate that the request is for a gem explicitly requested by the user

  def explicit?
    @requester.nil?
  end

  ##
  # Indicate that the request is for a gem requested as a dependency of
  # another gem

  def implicit?
    !explicit?
  end

  ##
  # Return a String indicating who caused this request to be added (only
  # valid for implicit requests)

  def request_context
    @requester ? @requester.request : "(unknown)"
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[Dependency request ", "]" do
      q.breakable
      q.text @dependency.to_s

      q.breakable
      q.text " requested by "
      q.pp @requester
    end
  end

  ##
  # The version requirement for this dependency request

  def requirement
    @dependency.requirement
  end

  def to_s # :nodoc:
    @dependency.to_s
  end
end
PK}$[�l�3%%1rubygems/rubygems/resolver/local_specification.rbnu�[���# frozen_string_literal: true
##
# A LocalSpecification comes from a .gem file on the local filesystem.

class Gem::Resolver::LocalSpecification < Gem::Resolver::SpecSpecification
  ##
  # Returns +true+ if this gem is installable for the current platform.

  def installable_platform?
    return true if @source.kind_of? Gem::Source::SpecificFile

    super
  end

  def local? # :nodoc:
    true
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[LocalSpecification", "]" do
      q.breakable
      q.text "name: #{name}"

      q.breakable
      q.text "version: #{version}"

      q.breakable
      q.text "platform: #{platform}"

      q.breakable
      q.text "dependencies:"
      q.breakable
      q.pp dependencies

      q.breakable
      q.text "source: #{@source.path}"
    end
  end
end
PK}$[�-
@�
�
/rubygems/rubygems/resolver/api_specification.rbnu�[���# frozen_string_literal: true
##
# Represents a specification retrieved via the rubygems.org API.
#
# This is used to avoid loading the full Specification object when all we need
# is the name, version, and dependencies.

class Gem::Resolver::APISpecification < Gem::Resolver::Specification
  ##
  # We assume that all instances of this class are immutable;
  # so avoid duplicated generation for performance.
  @@cache = {}
  def self.new(set, api_data)
    cache_key = [set, api_data]
    cache = @@cache[cache_key]
    return cache if cache
    @@cache[cache_key] = super
  end

  ##
  # Creates an APISpecification for the given +set+ from the rubygems.org
  # +api_data+.
  #
  # See https://guides.rubygems.org/rubygems-org-api/#misc_methods for the
  # format of the +api_data+.

  def initialize(set, api_data)
    super()

    @set = set
    @name = api_data[:name]
    @version = Gem::Version.new(api_data[:number]).freeze
    @platform = Gem::Platform.new(api_data[:platform]).freeze
    @original_platform = api_data[:platform].freeze
    @dependencies = api_data[:dependencies].map do |name, ver|
      Gem::Dependency.new(name, ver.split(/\s*,\s*/)).freeze
    end.freeze
    @required_ruby_version = Gem::Requirement.new(api_data.dig(:requirements, :ruby)).freeze
    @required_rubygems_version = Gem::Requirement.new(api_data.dig(:requirements, :rubygems)).freeze
  end

  def ==(other) # :nodoc:
    self.class === other &&
      @set          == other.set &&
      @name         == other.name &&
      @version      == other.version &&
      @platform     == other.platform
  end

  def hash
    @set.hash ^ @name.hash ^ @version.hash ^ @platform.hash
  end

  def fetch_development_dependencies # :nodoc:
    spec = source.fetch_spec Gem::NameTuple.new @name, @version, @platform

    @dependencies = spec.dependencies
  end

  def installable_platform? # :nodoc:
    Gem::Platform.match_gem? @platform, @name
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[APISpecification", "]" do
      q.breakable
      q.text "name: #{name}"

      q.breakable
      q.text "version: #{version}"

      q.breakable
      q.text "platform: #{platform}"

      q.breakable
      q.text "dependencies:"
      q.breakable
      q.pp @dependencies

      q.breakable
      q.text "set uri: #{@set.dep_uri}"
    end
  end

  ##
  # Fetches a Gem::Specification for this APISpecification.

  def spec # :nodoc:
    @spec ||=
      begin
        tuple = Gem::NameTuple.new @name, @version, @platform
        source.fetch_spec tuple
      rescue Gem::RemoteFetcher::FetchError
        raise if @original_platform == @platform

        tuple = Gem::NameTuple.new @name, @version, @original_platform
        source.fetch_spec tuple
      end
  end

  def source # :nodoc:
    @set.source
  end
end
PK}$[@�q�II'rubygems/rubygems/resolver/molinillo.rbnu�[���# frozen_string_literal: true
require_relative "molinillo/lib/molinillo"
PK}$[�h:,��#rubygems/rubygems/resolver/stats.rbnu�[���# frozen_string_literal: true
class Gem::Resolver::Stats
  def initialize
    @max_depth = 0
    @max_requirements = 0
    @requirements = 0
    @backtracking = 0
    @iterations = 0
  end

  def record_depth(stack)
    if stack.size > @max_depth
      @max_depth = stack.size
    end
  end

  def record_requirements(reqs)
    if reqs.size > @max_requirements
      @max_requirements = reqs.size
    end
  end

  def requirement!
    @requirements += 1
  end

  def backtracking!
    @backtracking += 1
  end

  def iteration!
    @iterations += 1
  end

  PATTERN = "%20s: %d\n".freeze

  def display
    $stdout.puts "=== Resolver Statistics ==="
    $stdout.printf PATTERN, "Max Depth", @max_depth
    $stdout.printf PATTERN, "Total Requirements", @requirements
    $stdout.printf PATTERN, "Max Requirements", @max_requirements
    $stdout.printf PATTERN, "Backtracking #", @backtracking
    $stdout.printf PATTERN, "Iteration #", @iterations
  end
end
PK}$[�W�k��!rubygems/rubygems/resolver/set.rbnu�[���# frozen_string_literal: true
##
# Resolver sets are used to look up specifications (and their
# dependencies) used in resolution.  This set is abstract.

class Gem::Resolver::Set
  ##
  # Set to true to disable network access for this set

  attr_accessor :remote

  ##
  # Errors encountered when resolving gems

  attr_accessor :errors

  ##
  # When true, allows matching of requests to prerelease gems.

  attr_accessor :prerelease

  def initialize # :nodoc:
    @prerelease = false
    @remote     = true
    @errors     = []
  end

  ##
  # The find_all method must be implemented.  It returns all Resolver
  # Specification objects matching the given DependencyRequest +req+.

  def find_all(req)
    raise NotImplementedError
  end

  ##
  # The #prefetch method may be overridden, but this is not necessary.  This
  # default implementation does nothing, which is suitable for sets where
  # looking up a specification is cheap (such as installed gems).
  #
  # When overridden, the #prefetch method should look up specifications
  # matching +reqs+.

  def prefetch(reqs)
  end

  ##
  # When true, this set is allowed to access the network when looking up
  # specifications or dependencies.

  def remote? # :nodoc:
    @remote
  end
end
PK}$[��,�q	q	1rubygems/rubygems/resolver/index_specification.rbnu�[���# frozen_string_literal: true
##
# Represents a possible Specification object returned from IndexSet.  Used to
# delay needed to download full Specification objects when only the +name+
# and +version+ are needed.

class Gem::Resolver::IndexSpecification < Gem::Resolver::Specification
  ##
  # An IndexSpecification is created from the index format described in `gem
  # help generate_index`.
  #
  # The +set+ contains other specifications for this (URL) +source+.
  #
  # The +name+, +version+ and +platform+ are the name, version and platform of
  # the gem.

  def initialize(set, name, version, source, platform)
    super()

    @set = set
    @name = name
    @version = version
    @source = source
    @platform = Gem::Platform.new(platform.to_s)
    @original_platform = platform.to_s

    @spec = nil
  end

  ##
  # The dependencies of the gem for this specification

  def dependencies
    spec.dependencies
  end

  ##
  # The required_ruby_version constraint for this specification
  #
  # A fallback is included because when generated, some marshalled specs have it
  # set to +nil+.

  def required_ruby_version
    spec.required_ruby_version || Gem::Requirement.default
  end

  ##
  # The required_rubygems_version constraint for this specification
  #
  # A fallback is included because the original version of the specification
  # API didn't include that field, so some marshalled specs in the index have it
  # set to +nil+.

  def required_rubygems_version
    spec.required_rubygems_version || Gem::Requirement.default
  end

  def ==(other)
    self.class === other &&
      @name == other.name &&
      @version == other.version &&
      @platform == other.platform
  end

  def hash
    @name.hash ^ @version.hash ^ @platform.hash
  end

  def inspect # :nodoc:
    "#<%s %s source %s>" % [self.class, full_name, @source]
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[Index specification", "]" do
      q.breakable
      q.text full_name

      unless Gem::Platform::RUBY == @platform
        q.breakable
        q.text @platform.to_s
      end

      q.breakable
      q.text "source "
      q.pp @source
    end
  end

  ##
  # Fetches a Gem::Specification for this IndexSpecification from the #source.

  def spec # :nodoc:
    @spec ||=
      begin
        tuple = Gem::NameTuple.new @name, @version, @original_platform

        @source.fetch_spec tuple
      end
  end
end
PK}$[9u���'rubygems/rubygems/resolver/index_set.rbnu�[���# frozen_string_literal: true
##
# The global rubygems pool represented via the traditional
# source index.

class Gem::Resolver::IndexSet < Gem::Resolver::Set
  def initialize(source = nil) # :nodoc:
    super()

    @f =
      if source
        sources = Gem::SourceList.from [source]

        Gem::SpecFetcher.new sources
      else
        Gem::SpecFetcher.fetcher
      end

    @all = Hash.new {|h,k| h[k] = [] }

    list, errors = @f.available_specs :complete

    @errors.concat errors

    list.each do |uri, specs|
      specs.each do |n|
        @all[n.name] << [uri, n]
      end
    end

    @specs = {}
  end

  ##
  # Return an array of IndexSpecification objects matching
  # DependencyRequest +req+.

  def find_all(req)
    res = []

    return res unless @remote

    name = req.dependency.name

    @all[name].each do |uri, n|
      if req.match? n, @prerelease
        res << Gem::Resolver::IndexSpecification.new(
          self, n.name, n.version, uri, n.platform)
      end
    end

    res
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[IndexSet", "]" do
      q.breakable
      q.text "sources:"
      q.breakable
      q.pp @f.sources

      q.breakable
      q.text "specs:"

      q.breakable

      names = @all.values.map do |tuples|
        tuples.map do |_, tuple|
          tuple.full_name
        end
      end.flatten

      q.seplist names do |name|
        q.text name
      end
    end
  end
end
PK}$[�b)
ee5rubygems/rubygems/resolver/molinillo/lib/molinillo.rbnu�[���# frozen_string_literal: true

require_relative 'molinillo/gem_metadata'
require_relative 'molinillo/errors'
require_relative 'molinillo/resolver'
require_relative 'molinillo/modules/ui'
require_relative 'molinillo/modules/specification_provider'

# Gem::Resolver::Molinillo is a generic dependency resolution algorithm.
module Gem::Resolver::Molinillo
end
PK}$[ ��Ƌ�Brubygems/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rbnu�[���# frozen_string_literal: true

module Gem::Resolver::Molinillo
  # The version of Gem::Resolver::Molinillo.
  VERSION = '0.7.0'.freeze
end
PK}$[�
є��<rubygems/rubygems/resolver/molinillo/lib/molinillo/errors.rbnu�[���# frozen_string_literal: true

module Gem::Resolver::Molinillo
  # An error that occurred during the resolution process
  class ResolverError < StandardError; end

  # An error caused by searching for a dependency that is completely unknown,
  # i.e. has no versions available whatsoever.
  class NoSuchDependencyError < ResolverError
    # @return [Object] the dependency that could not be found
    attr_accessor :dependency

    # @return [Array<Object>] the specifications that depended upon {#dependency}
    attr_accessor :required_by

    # Initializes a new error with the given missing dependency.
    # @param [Object] dependency @see {#dependency}
    # @param [Array<Object>] required_by @see {#required_by}
    def initialize(dependency, required_by = [])
      @dependency = dependency
      @required_by = required_by.uniq
      super()
    end

    # The error message for the missing dependency, including the specifications
    # that had this dependency.
    def message
      sources = required_by.map { |r| "`#{r}`" }.join(' and ')
      message = "Unable to find a specification for `#{dependency}`"
      message += " depended upon by #{sources}" unless sources.empty?
      message
    end
  end

  # An error caused by attempting to fulfil a dependency that was circular
  #
  # @note This exception will be thrown if and only if a {Vertex} is added to a
  #   {DependencyGraph} that has a {DependencyGraph::Vertex#path_to?} an
  #   existing {DependencyGraph::Vertex}
  class CircularDependencyError < ResolverError
    # [Set<Object>] the dependencies responsible for causing the error
    attr_reader :dependencies

    # Initializes a new error with the given circular vertices.
    # @param [Array<DependencyGraph::Vertex>] vertices the vertices in the dependency
    #   that caused the error
    def initialize(vertices)
      super "There is a circular dependency between #{vertices.map(&:name).join(' and ')}"
      @dependencies = vertices.map { |vertex| vertex.payload.possibilities.last }.to_set
    end
  end

  # An error caused by conflicts in version
  class VersionConflict < ResolverError
    # @return [{String => Resolution::Conflict}] the conflicts that caused
    #   resolution to fail
    attr_reader :conflicts

    # @return [SpecificationProvider] the specification provider used during
    #   resolution
    attr_reader :specification_provider

    # Initializes a new error with the given version conflicts.
    # @param [{String => Resolution::Conflict}] conflicts see {#conflicts}
    # @param [SpecificationProvider] specification_provider see {#specification_provider}
    def initialize(conflicts, specification_provider)
      pairs = []
      conflicts.values.flat_map(&:requirements).each do |conflicting|
        conflicting.each do |source, conflict_requirements|
          conflict_requirements.each do |c|
            pairs << [c, source]
          end
        end
      end

      super "Unable to satisfy the following requirements:\n\n" \
        "#{pairs.map { |r, d| "- `#{r}` required by `#{d}`" }.join("\n")}"

      @conflicts = conflicts
      @specification_provider = specification_provider
    end

    require_relative 'delegates/specification_provider'
    include Delegates::SpecificationProvider

    # @return [String] An error message that includes requirement trees,
    #   which is much more detailed & customizable than the default message
    # @param [Hash] opts the options to create a message with.
    # @option opts [String] :solver_name The user-facing name of the solver
    # @option opts [String] :possibility_type The generic name of a possibility
    # @option opts [Proc] :reduce_trees A proc that reduced the list of requirement trees
    # @option opts [Proc] :printable_requirement A proc that pretty-prints requirements
    # @option opts [Proc] :additional_message_for_conflict A proc that appends additional
    #   messages for each conflict
    # @option opts [Proc] :version_for_spec A proc that returns the version number for a
    #   possibility
    def message_with_trees(opts = {})
      solver_name = opts.delete(:solver_name) { self.class.name.split('::').first }
      possibility_type = opts.delete(:possibility_type) { 'possibility named' }
      reduce_trees = opts.delete(:reduce_trees) { proc { |trees| trees.uniq.sort_by(&:to_s) } }
      printable_requirement = opts.delete(:printable_requirement) { proc { |req| req.to_s } }
      additional_message_for_conflict = opts.delete(:additional_message_for_conflict) { proc {} }
      version_for_spec = opts.delete(:version_for_spec) { proc(&:to_s) }
      incompatible_version_message_for_conflict = opts.delete(:incompatible_version_message_for_conflict) do
        proc do |name, _conflict|
          %(#{solver_name} could not find compatible versions for #{possibility_type} "#{name}":)
        end
      end

      conflicts.sort.reduce(''.dup) do |o, (name, conflict)|
        o << "\n" << incompatible_version_message_for_conflict.call(name, conflict) << "\n"
        if conflict.locked_requirement
          o << %(  In snapshot (#{name_for_locking_dependency_source}):\n)
          o << %(    #{printable_requirement.call(conflict.locked_requirement)}\n)
          o << %(\n)
        end
        o << %(  In #{name_for_explicit_dependency_source}:\n)
        trees = reduce_trees.call(conflict.requirement_trees)

        o << trees.map do |tree|
          t = ''.dup
          depth = 2
          tree.each do |req|
            t << '  ' * depth << printable_requirement.call(req)
            unless tree.last == req
              if spec = conflict.activated_by_name[name_for(req)]
                t << %( was resolved to #{version_for_spec.call(spec)}, which)
              end
              t << %( depends on)
            end
            t << %(\n)
            depth += 1
          end
          t
        end.join("\n")

        additional_message_for_conflict.call(o, name, conflict)

        o
      end.strip
    end
  end
end
PK}$[pW����Jrubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/tag.rbnu�[���# frozen_string_literal: true

require_relative 'action'
module Gem::Resolver::Molinillo
  class DependencyGraph
    # @!visibility private
    # @see DependencyGraph#tag
    class Tag < Action
      # @!group Action

      # (see Action.action_name)
      def self.action_name
        :tag
      end

      # (see Action#up)
      def up(graph)
      end

      # (see Action#down)
      def down(graph)
      end

      # @!group Tag

      # @return [Object] An opaque tag
      attr_reader :tag

      # Initialize an action to tag a state of a dependency graph
      # @param [Object] tag an opaque tag
      def initialize(tag)
        @tag = tag
      end
    end
  end
end
PK}$[��)�NNMrubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rbnu�[���# frozen_string_literal: true

module Gem::Resolver::Molinillo
  class DependencyGraph
    # A vertex in a {DependencyGraph} that encapsulates a {#name} and a
    # {#payload}
    class Vertex
      # @return [String] the name of the vertex
      attr_accessor :name

      # @return [Object] the payload the vertex holds
      attr_accessor :payload

      # @return [Array<Object>] the explicit requirements that required
      #   this vertex
      attr_reader :explicit_requirements

      # @return [Boolean] whether the vertex is considered a root vertex
      attr_accessor :root
      alias root? root

      # Initializes a vertex with the given name and payload.
      # @param [String] name see {#name}
      # @param [Object] payload see {#payload}
      def initialize(name, payload)
        @name = name.frozen? ? name : name.dup.freeze
        @payload = payload
        @explicit_requirements = []
        @outgoing_edges = []
        @incoming_edges = []
      end

      # @return [Array<Object>] all of the requirements that required
      #   this vertex
      def requirements
        (incoming_edges.map(&:requirement) + explicit_requirements).uniq
      end

      # @return [Array<Edge>] the edges of {#graph} that have `self` as their
      #   {Edge#origin}
      attr_accessor :outgoing_edges

      # @return [Array<Edge>] the edges of {#graph} that have `self` as their
      #   {Edge#destination}
      attr_accessor :incoming_edges

      # @return [Array<Vertex>] the vertices of {#graph} that have an edge with
      #   `self` as their {Edge#destination}
      def predecessors
        incoming_edges.map(&:origin)
      end

      # @return [Set<Vertex>] the vertices of {#graph} where `self` is a
      #   {#descendent?}
      def recursive_predecessors
        _recursive_predecessors
      end

      # @param [Set<Vertex>] vertices the set to add the predecessors to
      # @return [Set<Vertex>] the vertices of {#graph} where `self` is a
      #   {#descendent?}
      def _recursive_predecessors(vertices = new_vertex_set)
        incoming_edges.each do |edge|
          vertex = edge.origin
          next unless vertices.add?(vertex)
          vertex._recursive_predecessors(vertices)
        end

        vertices
      end
      protected :_recursive_predecessors

      # @return [Array<Vertex>] the vertices of {#graph} that have an edge with
      #   `self` as their {Edge#origin}
      def successors
        outgoing_edges.map(&:destination)
      end

      # @return [Set<Vertex>] the vertices of {#graph} where `self` is an
      #   {#ancestor?}
      def recursive_successors
        _recursive_successors
      end

      # @param [Set<Vertex>] vertices the set to add the successors to
      # @return [Set<Vertex>] the vertices of {#graph} where `self` is an
      #   {#ancestor?}
      def _recursive_successors(vertices = new_vertex_set)
        outgoing_edges.each do |edge|
          vertex = edge.destination
          next unless vertices.add?(vertex)
          vertex._recursive_successors(vertices)
        end

        vertices
      end
      protected :_recursive_successors

      # @return [String] a string suitable for debugging
      def inspect
        "#{self.class}:#{name}(#{payload.inspect})"
      end

      # @return [Boolean] whether the two vertices are equal, determined
      #   by a recursive traversal of each {Vertex#successors}
      def ==(other)
        return true if equal?(other)
        shallow_eql?(other) &&
          successors.to_set == other.successors.to_set
      end

      # @param  [Vertex] other the other vertex to compare to
      # @return [Boolean] whether the two vertices are equal, determined
      #   solely by {#name} and {#payload} equality
      def shallow_eql?(other)
        return true if equal?(other)
        other &&
          name == other.name &&
          payload == other.payload
      end

      alias eql? ==

      # @return [Fixnum] a hash for the vertex based upon its {#name}
      def hash
        name.hash
      end

      # Is there a path from `self` to `other` following edges in the
      # dependency graph?
      # @return whether there is a path following edges within this {#graph}
      def path_to?(other)
        _path_to?(other)
      end

      alias descendent? path_to?

      # @param [Vertex] other the vertex to check if there's a path to
      # @param [Set<Vertex>] visited the vertices of {#graph} that have been visited
      # @return [Boolean] whether there is a path to `other` from `self`
      def _path_to?(other, visited = new_vertex_set)
        return false unless visited.add?(self)
        return true if equal?(other)
        successors.any? { |v| v._path_to?(other, visited) }
      end
      protected :_path_to?

      # Is there a path from `other` to `self` following edges in the
      # dependency graph?
      # @return whether there is a path following edges within this {#graph}
      def ancestor?(other)
        other.path_to?(self)
      end

      alias is_reachable_from? ancestor?

      def new_vertex_set
        require 'set'
        Set.new
      end
      private :new_vertex_set
    end
  end
end
PK}$[��iiQrubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_vertex.rbnu�[���# frozen_string_literal: true

require_relative 'action'
module Gem::Resolver::Molinillo
  class DependencyGraph
    # @!visibility private
    # (see DependencyGraph#add_vertex)
    class AddVertex < Action # :nodoc:
      # @!group Action

      # (see Action.action_name)
      def self.action_name
        :add_vertex
      end

      # (see Action#up)
      def up(graph)
        if existing = graph.vertices[name]
          @existing_payload = existing.payload
          @existing_root = existing.root
        end
        vertex = existing || Vertex.new(name, payload)
        graph.vertices[vertex.name] = vertex
        vertex.payload ||= payload
        vertex.root ||= root
        vertex
      end

      # (see Action#down)
      def down(graph)
        if defined?(@existing_payload)
          vertex = graph.vertices[name]
          vertex.payload = @existing_payload
          vertex.root = @existing_root
        else
          graph.vertices.delete(name)
        end
      end

      # @!group AddVertex

      # @return [String] the name of the vertex
      attr_reader :name

      # @return [Object] the payload for the vertex
      attr_reader :payload

      # @return [Boolean] whether the vertex is root or not
      attr_reader :root

      # Initialize an action to add a vertex to a dependency graph
      # @param [String] name the name of the vertex
      # @param [Object] payload the payload for the vertex
      # @param [Boolean] root whether the vertex is root or not
      def initialize(name, payload, root)
        @name = name
        @payload = payload
        @root = root
      end
    end
  end
end
PK}$[���P��Mrubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/action.rbnu�[���# frozen_string_literal: true

module Gem::Resolver::Molinillo
  class DependencyGraph
    # An action that modifies a {DependencyGraph} that is reversible.
    # @abstract
    class Action
      # rubocop:disable Lint/UnusedMethodArgument

      # @return [Symbol] The name of the action.
      def self.action_name
        raise 'Abstract'
      end

      # Performs the action on the given graph.
      # @param  [DependencyGraph] graph the graph to perform the action on.
      # @return [Void]
      def up(graph)
        raise 'Abstract'
      end

      # Reverses the action on the given graph.
      # @param  [DependencyGraph] graph the graph to reverse the action on.
      # @return [Void]
      def down(graph)
        raise 'Abstract'
      end

      # @return [Action,Nil] The previous action
      attr_accessor :previous

      # @return [Action,Nil] The next action
      attr_accessor :next
    end
  end
end
PK}$[��ŞZrubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rbnu�[���# frozen_string_literal: true

require_relative 'action'
module Gem::Resolver::Molinillo
  class DependencyGraph
    # @!visibility private
    # @see DependencyGraph#detach_vertex_named
    class DetachVertexNamed < Action
      # @!group Action

      # (see Action#name)
      def self.action_name
        :add_vertex
      end

      # (see Action#up)
      def up(graph)
        return [] unless @vertex = graph.vertices.delete(name)

        removed_vertices = [@vertex]
        @vertex.outgoing_edges.each do |e|
          v = e.destination
          v.incoming_edges.delete(e)
          if !v.root? && v.incoming_edges.empty?
            removed_vertices.concat graph.detach_vertex_named(v.name)
          end
        end

        @vertex.incoming_edges.each do |e|
          v = e.origin
          v.outgoing_edges.delete(e)
        end

        removed_vertices
      end

      # (see Action#down)
      def down(graph)
        return unless @vertex
        graph.vertices[@vertex.name] = @vertex
        @vertex.outgoing_edges.each do |e|
          e.destination.incoming_edges << e
        end
        @vertex.incoming_edges.each do |e|
          e.origin.outgoing_edges << e
        end
      end

      # @!group DetachVertexNamed

      # @return [String] the name of the vertex to detach
      attr_reader :name

      # Initialize an action to detach a vertex from a dependency graph
      # @param [String] name the name of the vertex to detach
      def initialize(name)
        @name = name
      end
    end
  end
end
PK}$[	G�G((Rrubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/delete_edge.rbnu�[���# frozen_string_literal: true

require_relative 'action'
module Gem::Resolver::Molinillo
  class DependencyGraph
    # @!visibility private
    # (see DependencyGraph#delete_edge)
    class DeleteEdge < Action
      # @!group Action

      # (see Action.action_name)
      def self.action_name
        :delete_edge
      end

      # (see Action#up)
      def up(graph)
        edge = make_edge(graph)
        edge.origin.outgoing_edges.delete(edge)
        edge.destination.incoming_edges.delete(edge)
      end

      # (see Action#down)
      def down(graph)
        edge = make_edge(graph)
        edge.origin.outgoing_edges << edge
        edge.destination.incoming_edges << edge
        edge
      end

      # @!group DeleteEdge

      # @return [String] the name of the origin of the edge
      attr_reader :origin_name

      # @return [String] the name of the destination of the edge
      attr_reader :destination_name

      # @return [Object] the requirement that the edge represents
      attr_reader :requirement

      # @param  [DependencyGraph] graph the graph to find vertices from
      # @return [Edge] The edge this action adds
      def make_edge(graph)
        Edge.new(
          graph.vertex_named(origin_name),
          graph.vertex_named(destination_name),
          requirement
        )
      end

      # Initialize an action to add an edge to a dependency graph
      # @param [String] origin_name the name of the origin of the edge
      # @param [String] destination_name the name of the destination of the edge
      # @param [Object] requirement the requirement that the edge represents
      def initialize(origin_name, destination_name, requirement)
        @origin_name = origin_name
        @destination_name = destination_name
        @requirement = requirement
      end
    end
  end
end
PK}$[v�k�uu[rubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rbnu�[���# frozen_string_literal: true

require_relative 'action'
module Gem::Resolver::Molinillo
  class DependencyGraph
    # @!visibility private
    # (see DependencyGraph#add_edge_no_circular)
    class AddEdgeNoCircular < Action
      # @!group Action

      # (see Action.action_name)
      def self.action_name
        :add_vertex
      end

      # (see Action#up)
      def up(graph)
        edge = make_edge(graph)
        edge.origin.outgoing_edges << edge
        edge.destination.incoming_edges << edge
        edge
      end

      # (see Action#down)
      def down(graph)
        edge = make_edge(graph)
        delete_first(edge.origin.outgoing_edges, edge)
        delete_first(edge.destination.incoming_edges, edge)
      end

      # @!group AddEdgeNoCircular

      # @return [String] the name of the origin of the edge
      attr_reader :origin

      # @return [String] the name of the destination of the edge
      attr_reader :destination

      # @return [Object] the requirement that the edge represents
      attr_reader :requirement

      # @param  [DependencyGraph] graph the graph to find vertices from
      # @return [Edge] The edge this action adds
      def make_edge(graph)
        Edge.new(graph.vertex_named(origin), graph.vertex_named(destination), requirement)
      end

      # Initialize an action to add an edge to a dependency graph
      # @param [String] origin the name of the origin of the edge
      # @param [String] destination the name of the destination of the edge
      # @param [Object] requirement the requirement that the edge represents
      def initialize(origin, destination, requirement)
        @origin = origin
        @destination = destination
        @requirement = requirement
      end

      private

      def delete_first(array, item)
        return unless index = array.index(item)
        array.delete_at(index)
      end
    end
  end
end
PK}$[�Rk%%Jrubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/log.rbnu�[���# frozen_string_literal: true

require_relative 'add_edge_no_circular'
require_relative 'add_vertex'
require_relative 'delete_edge'
require_relative 'detach_vertex_named'
require_relative 'set_payload'
require_relative 'tag'

module Gem::Resolver::Molinillo
  class DependencyGraph
    # A log for dependency graph actions
    class Log
      # Initializes an empty log
      def initialize
        @current_action = @first_action = nil
      end

      # @!macro [new] action
      #   {include:DependencyGraph#$0}
      #   @param [Graph] graph the graph to perform the action on
      #   @param (see DependencyGraph#$0)
      #   @return (see DependencyGraph#$0)

      # @macro action
      def tag(graph, tag)
        push_action(graph, Tag.new(tag))
      end

      # @macro action
      def add_vertex(graph, name, payload, root)
        push_action(graph, AddVertex.new(name, payload, root))
      end

      # @macro action
      def detach_vertex_named(graph, name)
        push_action(graph, DetachVertexNamed.new(name))
      end

      # @macro action
      def add_edge_no_circular(graph, origin, destination, requirement)
        push_action(graph, AddEdgeNoCircular.new(origin, destination, requirement))
      end

      # {include:DependencyGraph#delete_edge}
      # @param [Graph] graph the graph to perform the action on
      # @param [String] origin_name
      # @param [String] destination_name
      # @param [Object] requirement
      # @return (see DependencyGraph#delete_edge)
      def delete_edge(graph, origin_name, destination_name, requirement)
        push_action(graph, DeleteEdge.new(origin_name, destination_name, requirement))
      end

      # @macro action
      def set_payload(graph, name, payload)
        push_action(graph, SetPayload.new(name, payload))
      end

      # Pops the most recent action from the log and undoes the action
      # @param [DependencyGraph] graph
      # @return [Action] the action that was popped off the log
      def pop!(graph)
        return unless action = @current_action
        unless @current_action = action.previous
          @first_action = nil
        end
        action.down(graph)
        action
      end

      extend Enumerable

      # @!visibility private
      # Enumerates each action in the log
      # @yield [Action]
      def each
        return enum_for unless block_given?
        action = @first_action
        loop do
          break unless action
          yield action
          action = action.next
        end
        self
      end

      # @!visibility private
      # Enumerates each action in the log in reverse order
      # @yield [Action]
      def reverse_each
        return enum_for(:reverse_each) unless block_given?
        action = @current_action
        loop do
          break unless action
          yield action
          action = action.previous
        end
        self
      end

      # @macro action
      def rewind_to(graph, tag)
        loop do
          action = pop!(graph)
          raise "No tag #{tag.inspect} found" unless action
          break if action.class.action_name == :tag && action.tag == tag
        end
      end

      private

      # Adds the given action to the log, running the action
      # @param [DependencyGraph] graph
      # @param [Action] action
      # @return The value returned by `action.up`
      def push_action(graph, action)
        action.previous = @current_action
        @current_action.next = action if @current_action
        @current_action = action
        @first_action ||= action
        action.up(graph)
      end
    end
  end
end
PK}$[k.�]]Rrubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/set_payload.rbnu�[���# frozen_string_literal: true

require_relative 'action'
module Gem::Resolver::Molinillo
  class DependencyGraph
    # @!visibility private
    # @see DependencyGraph#set_payload
    class SetPayload < Action # :nodoc:
      # @!group Action

      # (see Action.action_name)
      def self.action_name
        :set_payload
      end

      # (see Action#up)
      def up(graph)
        vertex = graph.vertex_named(name)
        @old_payload = vertex.payload
        vertex.payload = payload
      end

      # (see Action#down)
      def down(graph)
        graph.vertex_named(name).payload = @old_payload
      end

      # @!group SetPayload

      # @return [String] the name of the vertex
      attr_reader :name

      # @return [Object] the payload for the vertex
      attr_reader :payload

      # Initialize an action to add set the payload for a vertex in a dependency
      # graph
      # @param [String] name the name of the vertex
      # @param [Object] payload the payload for the vertex
      def initialize(name, payload)
        @name = name
        @payload = payload
      end
    end
  end
end
PK}$[�@����Vrubygems/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rbnu�[���# frozen_string_literal: true

module Gem::Resolver::Molinillo
  module Delegates
    # Delegates all {Gem::Resolver::Molinillo::SpecificationProvider} methods to a
    # `#specification_provider` property.
    module SpecificationProvider
      # (see Gem::Resolver::Molinillo::SpecificationProvider#search_for)
      def search_for(dependency)
        with_no_such_dependency_error_handling do
          specification_provider.search_for(dependency)
        end
      end

      # (see Gem::Resolver::Molinillo::SpecificationProvider#dependencies_for)
      def dependencies_for(specification)
        with_no_such_dependency_error_handling do
          specification_provider.dependencies_for(specification)
        end
      end

      # (see Gem::Resolver::Molinillo::SpecificationProvider#requirement_satisfied_by?)
      def requirement_satisfied_by?(requirement, activated, spec)
        with_no_such_dependency_error_handling do
          specification_provider.requirement_satisfied_by?(requirement, activated, spec)
        end
      end

      # (see Gem::Resolver::Molinillo::SpecificationProvider#dependencies_equal?)
      def dependencies_equal?(dependencies, other_dependencies)
        with_no_such_dependency_error_handling do
          specification_provider.dependencies_equal?(dependencies, other_dependencies)
        end
      end

      # (see Gem::Resolver::Molinillo::SpecificationProvider#name_for)
      def name_for(dependency)
        with_no_such_dependency_error_handling do
          specification_provider.name_for(dependency)
        end
      end

      # (see Gem::Resolver::Molinillo::SpecificationProvider#name_for_explicit_dependency_source)
      def name_for_explicit_dependency_source
        with_no_such_dependency_error_handling do
          specification_provider.name_for_explicit_dependency_source
        end
      end

      # (see Gem::Resolver::Molinillo::SpecificationProvider#name_for_locking_dependency_source)
      def name_for_locking_dependency_source
        with_no_such_dependency_error_handling do
          specification_provider.name_for_locking_dependency_source
        end
      end

      # (see Gem::Resolver::Molinillo::SpecificationProvider#sort_dependencies)
      def sort_dependencies(dependencies, activated, conflicts)
        with_no_such_dependency_error_handling do
          specification_provider.sort_dependencies(dependencies, activated, conflicts)
        end
      end

      # (see Gem::Resolver::Molinillo::SpecificationProvider#allow_missing?)
      def allow_missing?(dependency)
        with_no_such_dependency_error_handling do
          specification_provider.allow_missing?(dependency)
        end
      end

      private

      # Ensures any raised {NoSuchDependencyError} has its
      # {NoSuchDependencyError#required_by} set.
      # @yield
      def with_no_such_dependency_error_handling
        yield
      rescue NoSuchDependencyError => error
        if state
          vertex = activated.vertex_named(name_for(error.dependency))
          error.required_by += vertex.incoming_edges.map { |e| e.origin.name }
          error.required_by << name_for_explicit_dependency_source unless vertex.explicit_requirements.empty?
        end
        raise
      end
    end
  end
end
PK}$[y�a��Prubygems/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rbnu�[���# frozen_string_literal: true

module Gem::Resolver::Molinillo
  # @!visibility private
  module Delegates
    # Delegates all {Gem::Resolver::Molinillo::ResolutionState} methods to a `#state` property.
    module ResolutionState
      # (see Gem::Resolver::Molinillo::ResolutionState#name)
      def name
        current_state = state || Gem::Resolver::Molinillo::ResolutionState.empty
        current_state.name
      end

      # (see Gem::Resolver::Molinillo::ResolutionState#requirements)
      def requirements
        current_state = state || Gem::Resolver::Molinillo::ResolutionState.empty
        current_state.requirements
      end

      # (see Gem::Resolver::Molinillo::ResolutionState#activated)
      def activated
        current_state = state || Gem::Resolver::Molinillo::ResolutionState.empty
        current_state.activated
      end

      # (see Gem::Resolver::Molinillo::ResolutionState#requirement)
      def requirement
        current_state = state || Gem::Resolver::Molinillo::ResolutionState.empty
        current_state.requirement
      end

      # (see Gem::Resolver::Molinillo::ResolutionState#possibilities)
      def possibilities
        current_state = state || Gem::Resolver::Molinillo::ResolutionState.empty
        current_state.possibilities
      end

      # (see Gem::Resolver::Molinillo::ResolutionState#depth)
      def depth
        current_state = state || Gem::Resolver::Molinillo::ResolutionState.empty
        current_state.depth
      end

      # (see Gem::Resolver::Molinillo::ResolutionState#conflicts)
      def conflicts
        current_state = state || Gem::Resolver::Molinillo::ResolutionState.empty
        current_state.conflicts
      end

      # (see Gem::Resolver::Molinillo::ResolutionState#unused_unwind_options)
      def unused_unwind_options
        current_state = state || Gem::Resolver::Molinillo::ResolutionState.empty
        current_state.unused_unwind_options
      end
    end
  end
end
PK}$[��R%%>rubygems/rubygems/resolver/molinillo/lib/molinillo/resolver.rbnu�[���# frozen_string_literal: true

require_relative 'dependency_graph'

module Gem::Resolver::Molinillo
  # This class encapsulates a dependency resolver.
  # The resolver is responsible for determining which set of dependencies to
  # activate, with feedback from the {#specification_provider}
  #
  #
  class Resolver
    require_relative 'resolution'

    # @return [SpecificationProvider] the specification provider used
    #   in the resolution process
    attr_reader :specification_provider

    # @return [UI] the UI module used to communicate back to the user
    #   during the resolution process
    attr_reader :resolver_ui

    # Initializes a new resolver.
    # @param  [SpecificationProvider] specification_provider
    #   see {#specification_provider}
    # @param  [UI] resolver_ui
    #   see {#resolver_ui}
    def initialize(specification_provider, resolver_ui)
      @specification_provider = specification_provider
      @resolver_ui = resolver_ui
    end

    # Resolves the requested dependencies into a {DependencyGraph},
    # locking to the base dependency graph (if specified)
    # @param [Array] requested an array of 'requested' dependencies that the
    #   {#specification_provider} can understand
    # @param [DependencyGraph,nil] base the base dependency graph to which
    #   dependencies should be 'locked'
    def resolve(requested, base = DependencyGraph.new)
      Resolution.new(specification_provider,
                     resolver_ui,
                     requested,
                     base).
        resolve
    end
  end
end
PK}$[1�����@rubygems/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rbnu�[���# frozen_string_literal: true

module Gem::Resolver::Molinillo
  # Conveys information about the resolution process to a user.
  module UI
    # The {IO} object that should be used to print output. `STDOUT`, by default.
    #
    # @return [IO]
    def output
      STDOUT
    end

    # Called roughly every {#progress_rate}, this method should convey progress
    # to the user.
    #
    # @return [void]
    def indicate_progress
      output.print '.' unless debug?
    end

    # How often progress should be conveyed to the user via
    # {#indicate_progress}, in seconds. A third of a second, by default.
    #
    # @return [Float]
    def progress_rate
      0.33
    end

    # Called before resolution begins.
    #
    # @return [void]
    def before_resolution
      output.print 'Resolving dependencies...'
    end

    # Called after resolution ends (either successfully or with an error).
    # By default, prints a newline.
    #
    # @return [void]
    def after_resolution
      output.puts
    end

    # Conveys debug information to the user.
    #
    # @param [Integer] depth the current depth of the resolution process.
    # @return [void]
    def debug(depth = 0)
      if debug?
        debug_info = yield
        debug_info = debug_info.inspect unless debug_info.is_a?(String)
        debug_info = debug_info.split("\n").map { |s| ":#{depth.to_s.rjust 4}: #{s}" }
        output.puts debug_info
      end
    end

    # Whether or not debug messages should be printed.
    # By default, whether or not the `MOLINILLO_DEBUG` environment variable is
    # set.
    #
    # @return [Boolean]
    def debug?
      return @debug_mode if defined?(@debug_mode)
      @debug_mode = ENV['MOLINILLO_DEBUG']
    end
  end
end
PK}$[E�rggTrubygems/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rbnu�[���# frozen_string_literal: true

module Gem::Resolver::Molinillo
  # Provides information about specifications and dependencies to the resolver,
  # allowing the {Resolver} class to remain generic while still providing power
  # and flexibility.
  #
  # This module contains the methods that users of Gem::Resolver::Molinillo must to implement,
  # using knowledge of their own model classes.
  module SpecificationProvider
    # Search for the specifications that match the given dependency.
    # The specifications in the returned array will be considered in reverse
    # order, so the latest version ought to be last.
    # @note This method should be 'pure', i.e. the return value should depend
    #   only on the `dependency` parameter.
    #
    # @param [Object] dependency
    # @return [Array<Object>] the specifications that satisfy the given
    #   `dependency`.
    def search_for(dependency)
      []
    end

    # Returns the dependencies of `specification`.
    # @note This method should be 'pure', i.e. the return value should depend
    #   only on the `specification` parameter.
    #
    # @param [Object] specification
    # @return [Array<Object>] the dependencies that are required by the given
    #   `specification`.
    def dependencies_for(specification)
      []
    end

    # Determines whether the given `requirement` is satisfied by the given
    # `spec`, in the context of the current `activated` dependency graph.
    #
    # @param [Object] requirement
    # @param [DependencyGraph] activated the current dependency graph in the
    #   resolution process.
    # @param [Object] spec
    # @return [Boolean] whether `requirement` is satisfied by `spec` in the
    #   context of the current `activated` dependency graph.
    def requirement_satisfied_by?(requirement, activated, spec)
      true
    end

    # Determines whether two arrays of dependencies are equal, and thus can be
    # grouped.
    #
    # @param [Array<Object>] dependencies
    # @param [Array<Object>] other_dependencies
    # @return [Boolean] whether `dependencies` and `other_dependencies` should
    #   be considered equal.
    def dependencies_equal?(dependencies, other_dependencies)
      dependencies == other_dependencies
    end

    # Returns the name for the given `dependency`.
    # @note This method should be 'pure', i.e. the return value should depend
    #   only on the `dependency` parameter.
    #
    # @param [Object] dependency
    # @return [String] the name for the given `dependency`.
    def name_for(dependency)
      dependency.to_s
    end

    # @return [String] the name of the source of explicit dependencies, i.e.
    #   those passed to {Resolver#resolve} directly.
    def name_for_explicit_dependency_source
      'user-specified dependency'
    end

    # @return [String] the name of the source of 'locked' dependencies, i.e.
    #   those passed to {Resolver#resolve} directly as the `base`
    def name_for_locking_dependency_source
      'Lockfile'
    end

    # Sort dependencies so that the ones that are easiest to resolve are first.
    # Easiest to resolve is (usually) defined by:
    #   1) Is this dependency already activated?
    #   2) How relaxed are the requirements?
    #   3) Are there any conflicts for this dependency?
    #   4) How many possibilities are there to satisfy this dependency?
    #
    # @param [Array<Object>] dependencies
    # @param [DependencyGraph] activated the current dependency graph in the
    #   resolution process.
    # @param [{String => Array<Conflict>}] conflicts
    # @return [Array<Object>] a sorted copy of `dependencies`.
    def sort_dependencies(dependencies, activated, conflicts)
      dependencies.sort_by do |dependency|
        name = name_for(dependency)
        [
          activated.vertex_named(name).payload ? 0 : 1,
          conflicts[name] ? 0 : 1,
        ]
      end
    end

    # Returns whether this dependency, which has no possible matching
    # specifications, can safely be ignored.
    #
    # @param [Object] dependency
    # @return [Boolean] whether this dependency can safely be skipped.
    def allow_missing?(dependency)
      false
    end
  end
end
PK}$[H�<(����@rubygems/rubygems/resolver/molinillo/lib/molinillo/resolution.rbnu�[���# frozen_string_literal: true

module Gem::Resolver::Molinillo
  class Resolver
    # A specific resolution from a given {Resolver}
    class Resolution
      # A conflict that the resolution process encountered
      # @attr [Object] requirement the requirement that immediately led to the conflict
      # @attr [{String,Nil=>[Object]}] requirements the requirements that caused the conflict
      # @attr [Object, nil] existing the existing spec that was in conflict with
      #   the {#possibility}
      # @attr [Object] possibility_set the set of specs that was unable to be
      #   activated due to a conflict.
      # @attr [Object] locked_requirement the relevant locking requirement.
      # @attr [Array<Array<Object>>] requirement_trees the different requirement
      #   trees that led to every requirement for the conflicting name.
      # @attr [{String=>Object}] activated_by_name the already-activated specs.
      # @attr [Object] underlying_error an error that has occurred during resolution, and
      #    will be raised at the end of it if no resolution is found.
      Conflict = Struct.new(
        :requirement,
        :requirements,
        :existing,
        :possibility_set,
        :locked_requirement,
        :requirement_trees,
        :activated_by_name,
        :underlying_error
      )

      class Conflict
        # @return [Object] a spec that was unable to be activated due to a conflict
        def possibility
          possibility_set && possibility_set.latest_version
        end
      end

      # A collection of possibility states that share the same dependencies
      # @attr [Array] dependencies the dependencies for this set of possibilities
      # @attr [Array] possibilities the possibilities
      PossibilitySet = Struct.new(:dependencies, :possibilities)

      class PossibilitySet
        # String representation of the possibility set, for debugging
        def to_s
          "[#{possibilities.join(', ')}]"
        end

        # @return [Object] most up-to-date dependency in the possibility set
        def latest_version
          possibilities.last
        end
      end

      # Details of the state to unwind to when a conflict occurs, and the cause of the unwind
      # @attr [Integer] state_index the index of the state to unwind to
      # @attr [Object] state_requirement the requirement of the state we're unwinding to
      # @attr [Array] requirement_tree for the requirement we're relaxing
      # @attr [Array] conflicting_requirements the requirements that combined to cause the conflict
      # @attr [Array] requirement_trees for the conflict
      # @attr [Array] requirements_unwound_to_instead array of unwind requirements that were chosen over this unwind
      UnwindDetails = Struct.new(
        :state_index,
        :state_requirement,
        :requirement_tree,
        :conflicting_requirements,
        :requirement_trees,
        :requirements_unwound_to_instead
      )

      class UnwindDetails
        include Comparable

        # We compare UnwindDetails when choosing which state to unwind to. If
        # two options have the same state_index we prefer the one most
        # removed from a requirement that caused the conflict. Both options
        # would unwind to the same state, but a `grandparent` option will
        # filter out fewer of its possibilities after doing so - where a state
        # is both a `parent` and a `grandparent` to requirements that have
        # caused a conflict this is the correct behaviour.
        # @param [UnwindDetail] other UnwindDetail to be compared
        # @return [Integer] integer specifying ordering
        def <=>(other)
          if state_index > other.state_index
            1
          elsif state_index == other.state_index
            reversed_requirement_tree_index <=> other.reversed_requirement_tree_index
          else
            -1
          end
        end

        # @return [Integer] index of state requirement in reversed requirement tree
        #    (the conflicting requirement itself will be at position 0)
        def reversed_requirement_tree_index
          @reversed_requirement_tree_index ||=
            if state_requirement
              requirement_tree.reverse.index(state_requirement)
            else
              999_999
            end
        end

        # @return [Boolean] where the requirement of the state we're unwinding
        #    to directly caused the conflict. Note: in this case, it is
        #    impossible for the state we're unwinding to to be a parent of
        #    any of the other conflicting requirements (or we would have
        #    circularity)
        def unwinding_to_primary_requirement?
          requirement_tree.last == state_requirement
        end

        # @return [Array] array of sub-dependencies to avoid when choosing a
        #    new possibility for the state we've unwound to. Only relevant for
        #    non-primary unwinds
        def sub_dependencies_to_avoid
          @requirements_to_avoid ||=
            requirement_trees.map do |tree|
              index = tree.index(state_requirement)
              tree[index + 1] if index
            end.compact
        end

        # @return [Array] array of all the requirements that led to the need for
        #    this unwind
        def all_requirements
          @all_requirements ||= requirement_trees.flatten(1)
        end
      end

      # @return [SpecificationProvider] the provider that knows about
      #   dependencies, requirements, specifications, versions, etc.
      attr_reader :specification_provider

      # @return [UI] the UI that knows how to communicate feedback about the
      #   resolution process back to the user
      attr_reader :resolver_ui

      # @return [DependencyGraph] the base dependency graph to which
      #   dependencies should be 'locked'
      attr_reader :base

      # @return [Array] the dependencies that were explicitly required
      attr_reader :original_requested

      # Initializes a new resolution.
      # @param [SpecificationProvider] specification_provider
      #   see {#specification_provider}
      # @param [UI] resolver_ui see {#resolver_ui}
      # @param [Array] requested see {#original_requested}
      # @param [DependencyGraph] base see {#base}
      def initialize(specification_provider, resolver_ui, requested, base)
        @specification_provider = specification_provider
        @resolver_ui = resolver_ui
        @original_requested = requested
        @base = base
        @states = []
        @iteration_counter = 0
        @parents_of = Hash.new { |h, k| h[k] = [] }
      end

      # Resolves the {#original_requested} dependencies into a full dependency
      #   graph
      # @raise [ResolverError] if successful resolution is impossible
      # @return [DependencyGraph] the dependency graph of successfully resolved
      #   dependencies
      def resolve
        start_resolution

        while state
          break if !state.requirement && state.requirements.empty?
          indicate_progress
          if state.respond_to?(:pop_possibility_state) # DependencyState
            debug(depth) { "Creating possibility state for #{requirement} (#{possibilities.count} remaining)" }
            state.pop_possibility_state.tap do |s|
              if s
                states.push(s)
                activated.tag(s)
              end
            end
          end
          process_topmost_state
        end

        resolve_activated_specs
      ensure
        end_resolution
      end

      # @return [Integer] the number of resolver iterations in between calls to
      #   {#resolver_ui}'s {UI#indicate_progress} method
      attr_accessor :iteration_rate
      private :iteration_rate

      # @return [Time] the time at which resolution began
      attr_accessor :started_at
      private :started_at

      # @return [Array<ResolutionState>] the stack of states for the resolution
      attr_accessor :states
      private :states

      private

      # Sets up the resolution process
      # @return [void]
      def start_resolution
        @started_at = Time.now

        push_initial_state

        debug { "Starting resolution (#{@started_at})\nUser-requested dependencies: #{original_requested}" }
        resolver_ui.before_resolution
      end

      def resolve_activated_specs
        activated.vertices.each do |_, vertex|
          next unless vertex.payload

          latest_version = vertex.payload.possibilities.reverse_each.find do |possibility|
            vertex.requirements.all? { |req| requirement_satisfied_by?(req, activated, possibility) }
          end

          activated.set_payload(vertex.name, latest_version)
        end
        activated.freeze
      end

      # Ends the resolution process
      # @return [void]
      def end_resolution
        resolver_ui.after_resolution
        debug do
          "Finished resolution (#{@iteration_counter} steps) " \
          "(Took #{(ended_at = Time.now) - @started_at} seconds) (#{ended_at})"
        end
        debug { 'Unactivated: ' + Hash[activated.vertices.reject { |_n, v| v.payload }].keys.join(', ') } if state
        debug { 'Activated: ' + Hash[activated.vertices.select { |_n, v| v.payload }].keys.join(', ') } if state
      end

      require_relative 'state'
      require_relative 'modules/specification_provider'

      require_relative 'delegates/resolution_state'
      require_relative 'delegates/specification_provider'

      include Gem::Resolver::Molinillo::Delegates::ResolutionState
      include Gem::Resolver::Molinillo::Delegates::SpecificationProvider

      # Processes the topmost available {RequirementState} on the stack
      # @return [void]
      def process_topmost_state
        if possibility
          attempt_to_activate
        else
          create_conflict
          unwind_for_conflict
        end
      rescue CircularDependencyError => underlying_error
        create_conflict(underlying_error)
        unwind_for_conflict
      end

      # @return [Object] the current possibility that the resolution is trying
      #   to activate
      def possibility
        possibilities.last
      end

      # @return [RequirementState] the current state the resolution is
      #   operating upon
      def state
        states.last
      end

      # Creates and pushes the initial state for the resolution, based upon the
      # {#requested} dependencies
      # @return [void]
      def push_initial_state
        graph = DependencyGraph.new.tap do |dg|
          original_requested.each do |requested|
            vertex = dg.add_vertex(name_for(requested), nil, true)
            vertex.explicit_requirements << requested
          end
          dg.tag(:initial_state)
        end

        push_state_for_requirements(original_requested, true, graph)
      end

      # Unwinds the states stack because a conflict has been encountered
      # @return [void]
      def unwind_for_conflict
        details_for_unwind = build_details_for_unwind
        unwind_options = unused_unwind_options
        debug(depth) { "Unwinding for conflict: #{requirement} to #{details_for_unwind.state_index / 2}" }
        conflicts.tap do |c|
          sliced_states = states.slice!((details_for_unwind.state_index + 1)..-1)
          raise_error_unless_state(c)
          activated.rewind_to(sliced_states.first || :initial_state) if sliced_states
          state.conflicts = c
          state.unused_unwind_options = unwind_options
          filter_possibilities_after_unwind(details_for_unwind)
          index = states.size - 1
          @parents_of.each { |_, a| a.reject! { |i| i >= index } }
          state.unused_unwind_options.reject! { |uw| uw.state_index >= index }
        end
      end

      # Raises a VersionConflict error, or any underlying error, if there is no
      # current state
      # @return [void]
      def raise_error_unless_state(conflicts)
        return if state

        error = conflicts.values.map(&:underlying_error).compact.first
        raise error || VersionConflict.new(conflicts, specification_provider)
      end

      # @return [UnwindDetails] Details of the nearest index to which we could unwind
      def build_details_for_unwind
        # Get the possible unwinds for the current conflict
        current_conflict = conflicts[name]
        binding_requirements = binding_requirements_for_conflict(current_conflict)
        unwind_details = unwind_options_for_requirements(binding_requirements)

        last_detail_for_current_unwind = unwind_details.sort.last
        current_detail = last_detail_for_current_unwind

        # Look for past conflicts that could be unwound to affect the
        # requirement tree for the current conflict
        all_reqs = last_detail_for_current_unwind.all_requirements
        all_reqs_size = all_reqs.size
        relevant_unused_unwinds = unused_unwind_options.select do |alternative|
          diff_reqs = all_reqs - alternative.requirements_unwound_to_instead
          next if diff_reqs.size == all_reqs_size
          # Find the highest index unwind whilst looping through
          current_detail = alternative if alternative > current_detail
          alternative
        end

        # Add the current unwind options to the `unused_unwind_options` array.
        # The "used" option will be filtered out during `unwind_for_conflict`.
        state.unused_unwind_options += unwind_details.reject { |detail| detail.state_index == -1 }

        # Update the requirements_unwound_to_instead on any relevant unused unwinds
        relevant_unused_unwinds.each do |d|
          (d.requirements_unwound_to_instead << current_detail.state_requirement).uniq!
        end
        unwind_details.each do |d|
          (d.requirements_unwound_to_instead << current_detail.state_requirement).uniq!
        end

        current_detail
      end

      # @param [Array<Object>] binding_requirements array of requirements that combine to create a conflict
      # @return [Array<UnwindDetails>] array of UnwindDetails that have a chance
      #    of resolving the passed requirements
      def unwind_options_for_requirements(binding_requirements)
        unwind_details = []

        trees = []
        binding_requirements.reverse_each do |r|
          partial_tree = [r]
          trees << partial_tree
          unwind_details << UnwindDetails.new(-1, nil, partial_tree, binding_requirements, trees, [])

          # If this requirement has alternative possibilities, check if any would
          # satisfy the other requirements that created this conflict
          requirement_state = find_state_for(r)
          if conflict_fixing_possibilities?(requirement_state, binding_requirements)
            unwind_details << UnwindDetails.new(
              states.index(requirement_state),
              r,
              partial_tree,
              binding_requirements,
              trees,
              []
            )
          end

          # Next, look at the parent of this requirement, and check if the requirement
          # could have been avoided if an alternative PossibilitySet had been chosen
          parent_r = parent_of(r)
          next if parent_r.nil?
          partial_tree.unshift(parent_r)
          requirement_state = find_state_for(parent_r)
          if requirement_state.possibilities.any? { |set| !set.dependencies.include?(r) }
            unwind_details << UnwindDetails.new(
              states.index(requirement_state),
              parent_r,
              partial_tree,
              binding_requirements,
              trees,
              []
            )
          end

          # Finally, look at the grandparent and up of this requirement, looking
          # for any possibilities that wouldn't create their parent requirement
          grandparent_r = parent_of(parent_r)
          until grandparent_r.nil?
            partial_tree.unshift(grandparent_r)
            requirement_state = find_state_for(grandparent_r)
            if requirement_state.possibilities.any? { |set| !set.dependencies.include?(parent_r) }
              unwind_details << UnwindDetails.new(
                states.index(requirement_state),
                grandparent_r,
                partial_tree,
                binding_requirements,
                trees,
                []
              )
            end
            parent_r = grandparent_r
            grandparent_r = parent_of(parent_r)
          end
        end

        unwind_details
      end

      # @param [DependencyState] state
      # @param [Array] binding_requirements array of requirements
      # @return [Boolean] whether or not the given state has any possibilities
      #    that could satisfy the given requirements
      def conflict_fixing_possibilities?(state, binding_requirements)
        return false unless state

        state.possibilities.any? do |possibility_set|
          possibility_set.possibilities.any? do |poss|
            possibility_satisfies_requirements?(poss, binding_requirements)
          end
        end
      end

      # Filter's a state's possibilities to remove any that would not fix the
      # conflict we've just rewound from
      # @param [UnwindDetails] unwind_details details of the conflict just
      #   unwound from
      # @return [void]
      def filter_possibilities_after_unwind(unwind_details)
        return unless state && !state.possibilities.empty?

        if unwind_details.unwinding_to_primary_requirement?
          filter_possibilities_for_primary_unwind(unwind_details)
        else
          filter_possibilities_for_parent_unwind(unwind_details)
        end
      end

      # Filter's a state's possibilities to remove any that would not satisfy
      # the requirements in the conflict we've just rewound from
      # @param [UnwindDetails] unwind_details details of the conflict just unwound from
      # @return [void]
      def filter_possibilities_for_primary_unwind(unwind_details)
        unwinds_to_state = unused_unwind_options.select { |uw| uw.state_index == unwind_details.state_index }
        unwinds_to_state << unwind_details
        unwind_requirement_sets = unwinds_to_state.map(&:conflicting_requirements)

        state.possibilities.reject! do |possibility_set|
          possibility_set.possibilities.none? do |poss|
            unwind_requirement_sets.any? do |requirements|
              possibility_satisfies_requirements?(poss, requirements)
            end
          end
        end
      end

      # @param [Object] possibility a single possibility
      # @param [Array] requirements an array of requirements
      # @return [Boolean] whether the possibility satisfies all of the
      #    given requirements
      def possibility_satisfies_requirements?(possibility, requirements)
        name = name_for(possibility)

        activated.tag(:swap)
        activated.set_payload(name, possibility) if activated.vertex_named(name)
        satisfied = requirements.all? { |r| requirement_satisfied_by?(r, activated, possibility) }
        activated.rewind_to(:swap)

        satisfied
      end

      # Filter's a state's possibilities to remove any that would (eventually)
      # create a requirement in the conflict we've just rewound from
      # @param [UnwindDetails] unwind_details details of the conflict just unwound from
      # @return [void]
      def filter_possibilities_for_parent_unwind(unwind_details)
        unwinds_to_state = unused_unwind_options.select { |uw| uw.state_index == unwind_details.state_index }
        unwinds_to_state << unwind_details

        primary_unwinds = unwinds_to_state.select(&:unwinding_to_primary_requirement?).uniq
        parent_unwinds = unwinds_to_state.uniq - primary_unwinds

        allowed_possibility_sets = primary_unwinds.flat_map do |unwind|
          states[unwind.state_index].possibilities.select do |possibility_set|
            possibility_set.possibilities.any? do |poss|
              possibility_satisfies_requirements?(poss, unwind.conflicting_requirements)
            end
          end
        end

        requirements_to_avoid = parent_unwinds.flat_map(&:sub_dependencies_to_avoid)

        state.possibilities.reject! do |possibility_set|
          !allowed_possibility_sets.include?(possibility_set) &&
            (requirements_to_avoid - possibility_set.dependencies).empty?
        end
      end

      # @param [Conflict] conflict
      # @return [Array] minimal array of requirements that would cause the passed
      #    conflict to occur.
      def binding_requirements_for_conflict(conflict)
        return [conflict.requirement] if conflict.possibility.nil?

        possible_binding_requirements = conflict.requirements.values.flatten(1).uniq

        # When there's a `CircularDependency` error the conflicting requirement
        # (the one causing the circular) won't be `conflict.requirement`
        # (which won't be for the right state, because we won't have created it,
        # because it's circular).
        # We need to make sure we have that requirement in the conflict's list,
        # otherwise we won't be able to unwind properly, so we just return all
        # the requirements for the conflict.
        return possible_binding_requirements if conflict.underlying_error

        possibilities = search_for(conflict.requirement)

        # If all the requirements together don't filter out all possibilities,
        # then the only two requirements we need to consider are the initial one
        # (where the dependency's version was first chosen) and the last
        if binding_requirement_in_set?(nil, possible_binding_requirements, possibilities)
          return [conflict.requirement, requirement_for_existing_name(name_for(conflict.requirement))].compact
        end

        # Loop through the possible binding requirements, removing each one
        # that doesn't bind. Use a `reverse_each` as we want the earliest set of
        # binding requirements, and don't use `reject!` as we wish to refine the
        # array *on each iteration*.
        binding_requirements = possible_binding_requirements.dup
        possible_binding_requirements.reverse_each do |req|
          next if req == conflict.requirement
          unless binding_requirement_in_set?(req, binding_requirements, possibilities)
            binding_requirements -= [req]
          end
        end

        binding_requirements
      end

      # @param [Object] requirement we wish to check
      # @param [Array] possible_binding_requirements array of requirements
      # @param [Array] possibilities array of possibilities the requirements will be used to filter
      # @return [Boolean] whether or not the given requirement is required to filter
      #    out all elements of the array of possibilities.
      def binding_requirement_in_set?(requirement, possible_binding_requirements, possibilities)
        possibilities.any? do |poss|
          possibility_satisfies_requirements?(poss, possible_binding_requirements - [requirement])
        end
      end

      # @param [Object] requirement
      # @return [Object] the requirement that led to `requirement` being added
      #   to the list of requirements.
      def parent_of(requirement)
        return unless requirement
        return unless index = @parents_of[requirement].last
        return unless parent_state = @states[index]
        parent_state.requirement
      end

      # @param [String] name
      # @return [Object] the requirement that led to a version of a possibility
      #   with the given name being activated.
      def requirement_for_existing_name(name)
        return nil unless vertex = activated.vertex_named(name)
        return nil unless vertex.payload
        states.find { |s| s.name == name }.requirement
      end

      # @param [Object] requirement
      # @return [ResolutionState] the state whose `requirement` is the given
      #   `requirement`.
      def find_state_for(requirement)
        return nil unless requirement
        states.find { |i| requirement == i.requirement }
      end

      # @param [Object] underlying_error
      # @return [Conflict] a {Conflict} that reflects the failure to activate
      #   the {#possibility} in conjunction with the current {#state}
      def create_conflict(underlying_error = nil)
        vertex = activated.vertex_named(name)
        locked_requirement = locked_requirement_named(name)

        requirements = {}
        unless vertex.explicit_requirements.empty?
          requirements[name_for_explicit_dependency_source] = vertex.explicit_requirements
        end
        requirements[name_for_locking_dependency_source] = [locked_requirement] if locked_requirement
        vertex.incoming_edges.each do |edge|
          (requirements[edge.origin.payload.latest_version] ||= []).unshift(edge.requirement)
        end

        activated_by_name = {}
        activated.each { |v| activated_by_name[v.name] = v.payload.latest_version if v.payload }
        conflicts[name] = Conflict.new(
          requirement,
          requirements,
          vertex.payload && vertex.payload.latest_version,
          possibility,
          locked_requirement,
          requirement_trees,
          activated_by_name,
          underlying_error
        )
      end

      # @return [Array<Array<Object>>] The different requirement
      #   trees that led to every requirement for the current spec.
      def requirement_trees
        vertex = activated.vertex_named(name)
        vertex.requirements.map { |r| requirement_tree_for(r) }
      end

      # @param [Object] requirement
      # @return [Array<Object>] the list of requirements that led to
      #   `requirement` being required.
      def requirement_tree_for(requirement)
        tree = []
        while requirement
          tree.unshift(requirement)
          requirement = parent_of(requirement)
        end
        tree
      end

      # Indicates progress roughly once every second
      # @return [void]
      def indicate_progress
        @iteration_counter += 1
        @progress_rate ||= resolver_ui.progress_rate
        if iteration_rate.nil?
          if Time.now - started_at >= @progress_rate
            self.iteration_rate = @iteration_counter
          end
        end

        if iteration_rate && (@iteration_counter % iteration_rate) == 0
          resolver_ui.indicate_progress
        end
      end

      # Calls the {#resolver_ui}'s {UI#debug} method
      # @param [Integer] depth the depth of the {#states} stack
      # @param [Proc] block a block that yields a {#to_s}
      # @return [void]
      def debug(depth = 0, &block)
        resolver_ui.debug(depth, &block)
      end

      # Attempts to activate the current {#possibility}
      # @return [void]
      def attempt_to_activate
        debug(depth) { 'Attempting to activate ' + possibility.to_s }
        existing_vertex = activated.vertex_named(name)
        if existing_vertex.payload
          debug(depth) { "Found existing spec (#{existing_vertex.payload})" }
          attempt_to_filter_existing_spec(existing_vertex)
        else
          latest = possibility.latest_version
          possibility.possibilities.select! do |possibility|
            requirement_satisfied_by?(requirement, activated, possibility)
          end
          if possibility.latest_version.nil?
            # ensure there's a possibility for better error messages
            possibility.possibilities << latest if latest
            create_conflict
            unwind_for_conflict
          else
            activate_new_spec
          end
        end
      end

      # Attempts to update the existing vertex's `PossibilitySet` with a filtered version
      # @return [void]
      def attempt_to_filter_existing_spec(vertex)
        filtered_set = filtered_possibility_set(vertex)
        if !filtered_set.possibilities.empty?
          activated.set_payload(name, filtered_set)
          new_requirements = requirements.dup
          push_state_for_requirements(new_requirements, false)
        else
          create_conflict
          debug(depth) { "Unsatisfied by existing spec (#{vertex.payload})" }
          unwind_for_conflict
        end
      end

      # Generates a filtered version of the existing vertex's `PossibilitySet` using the
      # current state's `requirement`
      # @param [Object] vertex existing vertex
      # @return [PossibilitySet] filtered possibility set
      def filtered_possibility_set(vertex)
        PossibilitySet.new(vertex.payload.dependencies, vertex.payload.possibilities & possibility.possibilities)
      end

      # @param [String] requirement_name the spec name to search for
      # @return [Object] the locked spec named `requirement_name`, if one
      #   is found on {#base}
      def locked_requirement_named(requirement_name)
        vertex = base.vertex_named(requirement_name)
        vertex && vertex.payload
      end

      # Add the current {#possibility} to the dependency graph of the current
      # {#state}
      # @return [void]
      def activate_new_spec
        conflicts.delete(name)
        debug(depth) { "Activated #{name} at #{possibility}" }
        activated.set_payload(name, possibility)
        require_nested_dependencies_for(possibility)
      end

      # Requires the dependencies that the recently activated spec has
      # @param [Object] possibility_set the PossibilitySet that has just been
      #   activated
      # @return [void]
      def require_nested_dependencies_for(possibility_set)
        nested_dependencies = dependencies_for(possibility_set.latest_version)
        debug(depth) { "Requiring nested dependencies (#{nested_dependencies.join(', ')})" }
        nested_dependencies.each do |d|
          activated.add_child_vertex(name_for(d), nil, [name_for(possibility_set.latest_version)], d)
          parent_index = states.size - 1
          parents = @parents_of[d]
          parents << parent_index if parents.empty?
        end

        push_state_for_requirements(requirements + nested_dependencies, !nested_dependencies.empty?)
      end

      # Pushes a new {DependencyState} that encapsulates both existing and new
      # requirements
      # @param [Array] new_requirements
      # @param [Boolean] requires_sort
      # @param [Object] new_activated
      # @return [void]
      def push_state_for_requirements(new_requirements, requires_sort = true, new_activated = activated)
        new_requirements = sort_dependencies(new_requirements.uniq, new_activated, conflicts) if requires_sort
        new_requirement = nil
        loop do
          new_requirement = new_requirements.shift
          break if new_requirement.nil? || states.none? { |s| s.requirement == new_requirement }
        end
        new_name = new_requirement ? name_for(new_requirement) : ''.freeze
        possibilities = possibilities_for_requirement(new_requirement)
        handle_missing_or_push_dependency_state DependencyState.new(
          new_name, new_requirements, new_activated,
          new_requirement, possibilities, depth, conflicts.dup, unused_unwind_options.dup
        )
      end

      # Checks a proposed requirement with any existing locked requirement
      # before generating an array of possibilities for it.
      # @param [Object] requirement the proposed requirement
      # @param [Object] activated
      # @return [Array] possibilities
      def possibilities_for_requirement(requirement, activated = self.activated)
        return [] unless requirement
        if locked_requirement_named(name_for(requirement))
          return locked_requirement_possibility_set(requirement, activated)
        end

        group_possibilities(search_for(requirement))
      end

      # @param [Object] requirement the proposed requirement
      # @param [Object] activated
      # @return [Array] possibility set containing only the locked requirement, if any
      def locked_requirement_possibility_set(requirement, activated = self.activated)
        all_possibilities = search_for(requirement)
        locked_requirement = locked_requirement_named(name_for(requirement))

        # Longwinded way to build a possibilities array with either the locked
        # requirement or nothing in it. Required, since the API for
        # locked_requirement isn't guaranteed.
        locked_possibilities = all_possibilities.select do |possibility|
          requirement_satisfied_by?(locked_requirement, activated, possibility)
        end

        group_possibilities(locked_possibilities)
      end

      # Build an array of PossibilitySets, with each element representing a group of
      # dependency versions that all have the same sub-dependency version constraints
      # and are contiguous.
      # @param [Array] possibilities an array of possibilities
      # @return [Array<PossibilitySet>] an array of possibility sets
      def group_possibilities(possibilities)
        possibility_sets = []
        current_possibility_set = nil

        possibilities.reverse_each do |possibility|
          dependencies = dependencies_for(possibility)
          if current_possibility_set && dependencies_equal?(current_possibility_set.dependencies, dependencies)
            current_possibility_set.possibilities.unshift(possibility)
          else
            possibility_sets.unshift(PossibilitySet.new(dependencies, [possibility]))
            current_possibility_set = possibility_sets.first
          end
        end

        possibility_sets
      end

      # Pushes a new {DependencyState}.
      # If the {#specification_provider} says to
      # {SpecificationProvider#allow_missing?} that particular requirement, and
      # there are no possibilities for that requirement, then `state` is not
      # pushed, and the vertex in {#activated} is removed, and we continue
      # resolving the remaining requirements.
      # @param [DependencyState] state
      # @return [void]
      def handle_missing_or_push_dependency_state(state)
        if state.requirement && state.possibilities.empty? && allow_missing?(state.requirement)
          state.activated.detach_vertex_named(state.name)
          push_state_for_requirements(state.requirements.dup, false, state.activated)
        else
          states.push(state).tap { activated.tag(state) }
        end
      end
    end
  end
end
PK}$[,��h..;rubygems/rubygems/resolver/molinillo/lib/molinillo/state.rbnu�[���# frozen_string_literal: true

module Gem::Resolver::Molinillo
  # A state that a {Resolution} can be in
  # @attr [String] name the name of the current requirement
  # @attr [Array<Object>] requirements currently unsatisfied requirements
  # @attr [DependencyGraph] activated the graph of activated dependencies
  # @attr [Object] requirement the current requirement
  # @attr [Object] possibilities the possibilities to satisfy the current requirement
  # @attr [Integer] depth the depth of the resolution
  # @attr [Hash] conflicts unresolved conflicts, indexed by dependency name
  # @attr [Array<UnwindDetails>] unused_unwind_options unwinds for previous conflicts that weren't explored
  ResolutionState = Struct.new(
    :name,
    :requirements,
    :activated,
    :requirement,
    :possibilities,
    :depth,
    :conflicts,
    :unused_unwind_options
  )

  class ResolutionState
    # Returns an empty resolution state
    # @return [ResolutionState] an empty state
    def self.empty
      new(nil, [], DependencyGraph.new, nil, nil, 0, {}, [])
    end
  end

  # A state that encapsulates a set of {#requirements} with an {Array} of
  # possibilities
  class DependencyState < ResolutionState
    # Removes a possibility from `self`
    # @return [PossibilityState] a state with a single possibility,
    #  the possibility that was removed from `self`
    def pop_possibility_state
      PossibilityState.new(
        name,
        requirements.dup,
        activated,
        requirement,
        [possibilities.pop],
        depth + 1,
        conflicts.dup,
        unused_unwind_options.dup
      ).tap do |state|
        state.activated.tag(state)
      end
    end
  end

  # A state that encapsulates a single possibility to fulfill the given
  # {#requirement}
  class PossibilityState < ResolutionState
  end
end
PK}$[��� � Frubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rbnu�[���# frozen_string_literal: true

require_relative '../../../../tsort'

require_relative 'dependency_graph/log'
require_relative 'dependency_graph/vertex'

module Gem::Resolver::Molinillo
  # A directed acyclic graph that is tuned to hold named dependencies
  class DependencyGraph
    include Enumerable

    # Enumerates through the vertices of the graph.
    # @return [Array<Vertex>] The graph's vertices.
    def each
      return vertices.values.each unless block_given?
      vertices.values.each { |v| yield v }
    end

    include Gem::TSort

    # @!visibility private
    alias tsort_each_node each

    # @!visibility private
    def tsort_each_child(vertex, &block)
      vertex.successors.each(&block)
    end

    # Topologically sorts the given vertices.
    # @param [Enumerable<Vertex>] vertices the vertices to be sorted, which must
    #   all belong to the same graph.
    # @return [Array<Vertex>] The sorted vertices.
    def self.tsort(vertices)
      TSort.tsort(
        lambda { |b| vertices.each(&b) },
        lambda { |v, &b| (v.successors & vertices).each(&b) }
      )
    end

    # A directed edge of a {DependencyGraph}
    # @attr [Vertex] origin The origin of the directed edge
    # @attr [Vertex] destination The destination of the directed edge
    # @attr [Object] requirement The requirement the directed edge represents
    Edge = Struct.new(:origin, :destination, :requirement)

    # @return [{String => Vertex}] the vertices of the dependency graph, keyed
    #   by {Vertex#name}
    attr_reader :vertices

    # @return [Log] the op log for this graph
    attr_reader :log

    # Initializes an empty dependency graph
    def initialize
      @vertices = {}
      @log = Log.new
    end

    # Tags the current state of the dependency as the given tag
    # @param  [Object] tag an opaque tag for the current state of the graph
    # @return [Void]
    def tag(tag)
      log.tag(self, tag)
    end

    # Rewinds the graph to the state tagged as `tag`
    # @param  [Object] tag the tag to rewind to
    # @return [Void]
    def rewind_to(tag)
      log.rewind_to(self, tag)
    end

    # Initializes a copy of a {DependencyGraph}, ensuring that all {#vertices}
    # are properly copied.
    # @param [DependencyGraph] other the graph to copy.
    def initialize_copy(other)
      super
      @vertices = {}
      @log = other.log.dup
      traverse = lambda do |new_v, old_v|
        return if new_v.outgoing_edges.size == old_v.outgoing_edges.size
        old_v.outgoing_edges.each do |edge|
          destination = add_vertex(edge.destination.name, edge.destination.payload)
          add_edge_no_circular(new_v, destination, edge.requirement)
          traverse.call(destination, edge.destination)
        end
      end
      other.vertices.each do |name, vertex|
        new_vertex = add_vertex(name, vertex.payload, vertex.root?)
        new_vertex.explicit_requirements.replace(vertex.explicit_requirements)
        traverse.call(new_vertex, vertex)
      end
    end

    # @return [String] a string suitable for debugging
    def inspect
      "#{self.class}:#{vertices.values.inspect}"
    end

    # @param [Hash] options options for dot output.
    # @return [String] Returns a dot format representation of the graph
    def to_dot(options = {})
      edge_label = options.delete(:edge_label)
      raise ArgumentError, "Unknown options: #{options.keys}" unless options.empty?

      dot_vertices = []
      dot_edges = []
      vertices.each do |n, v|
        dot_vertices << "  #{n} [label=\"{#{n}|#{v.payload}}\"]"
        v.outgoing_edges.each do |e|
          label = edge_label ? edge_label.call(e) : e.requirement
          dot_edges << "  #{e.origin.name} -> #{e.destination.name} [label=#{label.to_s.dump}]"
        end
      end

      dot_vertices.uniq!
      dot_vertices.sort!
      dot_edges.uniq!
      dot_edges.sort!

      dot = dot_vertices.unshift('digraph G {').push('') + dot_edges.push('}')
      dot.join("\n")
    end

    # @param [DependencyGraph] other
    # @return [Boolean] whether the two dependency graphs are equal, determined
    #   by a recursive traversal of each {#root_vertices} and its
    #   {Vertex#successors}
    def ==(other)
      return false unless other
      return true if equal?(other)
      vertices.each do |name, vertex|
        other_vertex = other.vertex_named(name)
        return false unless other_vertex
        return false unless vertex.payload == other_vertex.payload
        return false unless other_vertex.successors.to_set == vertex.successors.to_set
      end
    end

    # @param [String] name
    # @param [Object] payload
    # @param [Array<String>] parent_names
    # @param [Object] requirement the requirement that is requiring the child
    # @return [void]
    def add_child_vertex(name, payload, parent_names, requirement)
      root = !parent_names.delete(nil) { true }
      vertex = add_vertex(name, payload, root)
      vertex.explicit_requirements << requirement if root
      parent_names.each do |parent_name|
        parent_vertex = vertex_named(parent_name)
        add_edge(parent_vertex, vertex, requirement)
      end
      vertex
    end

    # Adds a vertex with the given name, or updates the existing one.
    # @param [String] name
    # @param [Object] payload
    # @return [Vertex] the vertex that was added to `self`
    def add_vertex(name, payload, root = false)
      log.add_vertex(self, name, payload, root)
    end

    # Detaches the {#vertex_named} `name` {Vertex} from the graph, recursively
    # removing any non-root vertices that were orphaned in the process
    # @param [String] name
    # @return [Array<Vertex>] the vertices which have been detached
    def detach_vertex_named(name)
      log.detach_vertex_named(self, name)
    end

    # @param [String] name
    # @return [Vertex,nil] the vertex with the given name
    def vertex_named(name)
      vertices[name]
    end

    # @param [String] name
    # @return [Vertex,nil] the root vertex with the given name
    def root_vertex_named(name)
      vertex = vertex_named(name)
      vertex if vertex && vertex.root?
    end

    # Adds a new {Edge} to the dependency graph
    # @param [Vertex] origin
    # @param [Vertex] destination
    # @param [Object] requirement the requirement that this edge represents
    # @return [Edge] the added edge
    def add_edge(origin, destination, requirement)
      if destination.path_to?(origin)
        raise CircularDependencyError.new(path(destination, origin))
      end
      add_edge_no_circular(origin, destination, requirement)
    end

    # Deletes an {Edge} from the dependency graph
    # @param [Edge] edge
    # @return [Void]
    def delete_edge(edge)
      log.delete_edge(self, edge.origin.name, edge.destination.name, edge.requirement)
    end

    # Sets the payload of the vertex with the given name
    # @param [String] name the name of the vertex
    # @param [Object] payload the payload
    # @return [Void]
    def set_payload(name, payload)
      log.set_payload(self, name, payload)
    end

    private

    # Adds a new {Edge} to the dependency graph without checking for
    # circularity.
    # @param (see #add_edge)
    # @return (see #add_edge)
    def add_edge_no_circular(origin, destination, requirement)
      log.add_edge_no_circular(self, origin.name, destination.name, requirement)
    end

    # Returns the path between two vertices
    # @raise [ArgumentError] if there is no path between the vertices
    # @param [Vertex] from
    # @param [Vertex] to
    # @return [Array<Vertex>] the shortest path from `from` to `to`
    def path(from, to)
      distances = Hash.new(vertices.size + 1)
      distances[from.name] = 0
      predecessors = {}
      each do |vertex|
        vertex.successors.each do |successor|
          if distances[successor.name] > distances[vertex.name] + 1
            distances[successor.name] = distances[vertex.name] + 1
            predecessors[successor] = vertex
          end
        end
      end

      path = [to]
      while before = predecessors[to]
        path << before
        to = before
        break if to == from
      end

      unless path.last.equal?(from)
        raise ArgumentError, "There is no path from #{from.name} to #{to.name}"
      end

      path.reverse
    end
  end
end
PK}$[iق0��0rubygems/rubygems/resolver/api_set/gem_parser.rbnu�[���# frozen_string_literal: true

class Gem::Resolver::APISet::GemParser
  def parse(line)
    version_and_platform, rest = line.split(" ", 2)
    version, platform = version_and_platform.split("-", 2)
    dependencies, requirements = rest.split("|", 2).map {|s| s.split(",") } if rest
    dependencies = dependencies ? dependencies.map {|d| parse_dependency(d) } : []
    requirements = requirements ? requirements.map {|d| parse_dependency(d) } : []
    [version, platform, dependencies, requirements]
  end

  private

  def parse_dependency(string)
    dependency = string.split(":")
    dependency[-1] = dependency[-1].split("&") if dependency.size > 1
    dependency
  end
end
PK}$[�OeϘ�0rubygems/rubygems/resolver/activation_request.rbnu�[���# frozen_string_literal: true
##
# Specifies a Specification object that should be activated.  Also contains a
# dependency that was used to introduce this activation.

class Gem::Resolver::ActivationRequest
  ##
  # The parent request for this activation request.

  attr_reader :request

  ##
  # The specification to be activated.

  attr_reader :spec

  ##
  # Creates a new ActivationRequest that will activate +spec+.  The parent
  # +request+ is used to provide diagnostics in case of conflicts.

  def initialize(spec, request)
    @spec = spec
    @request = request
  end

  def ==(other) # :nodoc:
    case other
    when Gem::Specification
      @spec == other
    when Gem::Resolver::ActivationRequest
      @spec == other.spec
    else
      false
    end
  end

  def eql?(other)
    self == other
  end

  def hash
    @spec.hash
  end

  ##
  # Is this activation request for a development dependency?

  def development?
    @request.development?
  end

  ##
  # Downloads a gem at +path+ and returns the file path.

  def download(path)
    Gem.ensure_gem_subdirectories path

    if @spec.respond_to? :sources
      exception = nil
      path = @spec.sources.find do |source|
        begin
          source.download full_spec, path
        rescue exception
        end
      end
      return path      if path
      raise  exception if exception

    elsif @spec.respond_to? :source
      source = @spec.source
      source.download full_spec, path

    else
      source = Gem.sources.first
      source.download full_spec, path
    end
  end

  ##
  # The full name of the specification to be activated.

  def full_name
    name_tuple.full_name
  end

  alias_method :to_s, :full_name

  ##
  # The Gem::Specification for this activation request.

  def full_spec
    Gem::Specification === @spec ? @spec : @spec.spec
  end

  def inspect # :nodoc:
    "#<%s for %p from %s>" % [
      self.class, @spec, @request
    ]
  end

  ##
  # True if the requested gem has already been installed.

  def installed?
    case @spec
    when Gem::Resolver::VendorSpecification then
      true
    else
      this_spec = full_spec

      Gem::Specification.any? do |s|
        s == this_spec
      end
    end
  end

  ##
  # The name of this activation request's specification

  def name
    @spec.name
  end

  ##
  # Return the ActivationRequest that contained the dependency
  # that we were activated for.

  def parent
    @request.requester
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[Activation request", "]" do
      q.breakable
      q.pp @spec

      q.breakable
      q.text " for "
      q.pp @request
    end
  end

  ##
  # The version of this activation request's specification

  def version
    @spec.version
  end

  ##
  # The platform of this activation request's specification

  def platform
    @spec.platform
  end

  private

  def name_tuple
    @name_tuple ||= Gem::NameTuple.new(name, version, platform)
  end
end
PK}$[�NA�AA0rubygems/rubygems/resolver/lock_specification.rbnu�[���# frozen_string_literal: true
##
# The LockSpecification comes from a lockfile (Gem::RequestSet::Lockfile).
#
# A LockSpecification's dependency information is pre-filled from the
# lockfile.

class Gem::Resolver::LockSpecification < Gem::Resolver::Specification
  attr_reader :sources

  def initialize(set, name, version, sources, platform)
    super()

    @name     = name
    @platform = platform
    @set      = set
    @source   = sources.first
    @sources  = sources
    @version  = version

    @dependencies = []
    @spec         = nil
  end

  ##
  # This is a null install as a locked specification is considered installed.
  # +options+ are ignored.

  def install(options = {})
    destination = options[:install_dir] || Gem.dir

    if File.exist? File.join(destination, "specifications", spec.spec_name)
      yield nil
      return
    end

    super
  end

  ##
  # Adds +dependency+ from the lockfile to this specification

  def add_dependency(dependency) # :nodoc:
    @dependencies << dependency
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[LockSpecification", "]" do
      q.breakable
      q.text "name: #{@name}"

      q.breakable
      q.text "version: #{@version}"

      unless @platform == Gem::Platform::RUBY
        q.breakable
        q.text "platform: #{@platform}"
      end

      unless @dependencies.empty?
        q.breakable
        q.text "dependencies:"
        q.breakable
        q.pp @dependencies
      end
    end
  end

  ##
  # A specification constructed from the lockfile is returned

  def spec
    @spec ||= Gem::Specification.find do |spec|
      spec.name == @name && spec.version == @version
    end

    @spec ||= Gem::Specification.new do |s|
      s.name     = @name
      s.version  = @version
      s.platform = @platform

      s.dependencies.concat @dependencies
    end
  end
end
PK}$[�W&��%rubygems/rubygems/resolver/git_set.rbnu�[���# frozen_string_literal: true
##
# A GitSet represents gems that are sourced from git repositories.
#
# This is used for gem dependency file support.
#
# Example:
#
#   set = Gem::Resolver::GitSet.new
#   set.add_git_gem 'rake', 'git://example/rake.git', tag: 'rake-10.1.0'

class Gem::Resolver::GitSet < Gem::Resolver::Set
  ##
  # The root directory for git gems in this set.  This is usually Gem.dir, the
  # installation directory for regular gems.

  attr_accessor :root_dir

  ##
  # Contains repositories needing submodules

  attr_reader :need_submodules # :nodoc:

  ##
  # A Hash containing git gem names for keys and a Hash of repository and
  # git commit reference as values.

  attr_reader :repositories # :nodoc:

  ##
  # A hash of gem names to Gem::Resolver::GitSpecifications

  attr_reader :specs # :nodoc:

  def initialize # :nodoc:
    super()

    @git             = ENV["git"] || "git"
    @need_submodules = {}
    @repositories    = {}
    @root_dir        = Gem.dir
    @specs           = {}
  end

  def add_git_gem(name, repository, reference, submodules) # :nodoc:
    @repositories[name] = [repository, reference]
    @need_submodules[repository] = submodules
  end

  ##
  # Adds and returns a GitSpecification with the given +name+ and +version+
  # which came from a +repository+ at the given +reference+.  If +submodules+
  # is true they are checked out along with the repository.
  #
  # This fills in the prefetch information as enough information about the gem
  # is present in the arguments.

  def add_git_spec(name, version, repository, reference, submodules) # :nodoc:
    add_git_gem name, repository, reference, submodules

    source = Gem::Source::Git.new name, repository, reference
    source.root_dir = @root_dir

    spec = Gem::Specification.new do |s|
      s.name    = name
      s.version = version
    end

    git_spec = Gem::Resolver::GitSpecification.new self, spec, source

    @specs[spec.name] = git_spec

    git_spec
  end

  ##
  # Finds all git gems matching +req+

  def find_all(req)
    prefetch nil

    specs.values.select do |spec|
      req.match? spec
    end
  end

  ##
  # Prefetches specifications from the git repositories in this set.

  def prefetch(reqs)
    return unless @specs.empty?

    @repositories.each do |name, (repository, reference)|
      source = Gem::Source::Git.new name, repository, reference
      source.root_dir = @root_dir
      source.remote = @remote

      source.specs.each do |spec|
        git_spec = Gem::Resolver::GitSpecification.new self, spec, source

        @specs[spec.name] = git_spec
      end
    end
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[GitSet", "]" do
      next if @repositories.empty?
      q.breakable

      repos = @repositories.map do |name, (repository, reference)|
        "#{name}: #{repository}@#{reference}"
      end

      q.seplist repos do |repo|
        q.text repo
      end
    end
  end
end
PK}$[
����*rubygems/rubygems/resolver/composed_set.rbnu�[���# frozen_string_literal: true
##
# A ComposedSet allows multiple sets to be queried like a single set.
#
# To create a composed set with any number of sets use:
#
#   Gem::Resolver.compose_sets set1, set2
#
# This method will eliminate nesting of composed sets.

class Gem::Resolver::ComposedSet < Gem::Resolver::Set
  attr_reader :sets # :nodoc:

  ##
  # Creates a new ComposedSet containing +sets+.  Use
  # Gem::Resolver::compose_sets instead.

  def initialize(*sets)
    super()

    @sets = sets
  end

  ##
  # When +allow_prerelease+ is set to +true+ prereleases gems are allowed to
  # match dependencies.

  def prerelease=(allow_prerelease)
    super

    sets.each do |set|
      set.prerelease = allow_prerelease
    end
  end

  ##
  # Sets the remote network access for all composed sets.

  def remote=(remote)
    super

    @sets.each {|set| set.remote = remote }
  end

  def errors
    @errors + @sets.map {|set| set.errors }.flatten
  end

  ##
  # Finds all specs matching +req+ in all sets.

  def find_all(req)
    @sets.map do |s|
      s.find_all req
    end.flatten
  end

  ##
  # Prefetches +reqs+ in all sets.

  def prefetch(reqs)
    @sets.each {|s| s.prefetch(reqs) }
  end
end
PK}$[�z�xx&rubygems/rubygems/resolver/best_set.rbnu�[���# frozen_string_literal: true
##
# The BestSet chooses the best available method to query a remote index.
#
# It combines IndexSet and APISet

class Gem::Resolver::BestSet < Gem::Resolver::ComposedSet
  ##
  # Creates a BestSet for the given +sources+ or Gem::sources if none are
  # specified.  +sources+ must be a Gem::SourceList.

  def initialize(sources = Gem.sources)
    super()

    @sources = sources
  end

  ##
  # Picks which sets to use for the configured sources.

  def pick_sets # :nodoc:
    @sources.each_source do |source|
      @sets << source.dependency_resolver_set
    end
  end

  def find_all(req) # :nodoc:
    pick_sets if @remote && @sets.empty?

    super
  rescue Gem::RemoteFetcher::FetchError => e
    replace_failed_api_set e

    retry
  end

  def prefetch(reqs) # :nodoc:
    pick_sets if @remote && @sets.empty?

    super
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[BestSet", "]" do
      q.breakable
      q.text "sets:"

      q.breakable
      q.pp @sets
    end
  end

  ##
  # Replaces a failed APISet for the URI in +error+ with an IndexSet.
  #
  # If no matching APISet can be found the original +error+ is raised.
  #
  # The calling method must retry the exception to repeat the lookup.

  def replace_failed_api_set(error) # :nodoc:
    uri = error.original_uri
    uri = URI uri unless URI === uri
    uri = uri + "."

    raise error unless api_set = @sets.find do |set|
      Gem::Resolver::APISet === set && set.dep_uri == uri
    end

    index_set = Gem::Resolver::IndexSet.new api_set.source

    @sets.map! do |set|
      next set unless set == api_set
      index_set
    end
  end
end
PK}$[m념/rubygems/rubygems/resolver/git_specification.rbnu�[���# frozen_string_literal: true
##
# A GitSpecification represents a gem that is sourced from a git repository
# and is being loaded through a gem dependencies file through the +git:+
# option.

class Gem::Resolver::GitSpecification < Gem::Resolver::SpecSpecification
  def ==(other) # :nodoc:
    self.class === other &&
      @set  == other.set &&
      @spec == other.spec &&
      @source == other.source
  end

  def add_dependency(dependency) # :nodoc:
    spec.dependencies << dependency
  end

  ##
  # Installing a git gem only involves building the extensions and generating
  # the executables.

  def install(options = {})
    require_relative "../installer"

    installer = Gem::Installer.for_spec spec, options

    yield installer if block_given?

    installer.run_pre_install_hooks
    installer.build_extensions
    installer.run_post_build_hooks
    installer.generate_bin
    installer.run_post_install_hooks
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[GitSpecification", "]" do
      q.breakable
      q.text "name: #{name}"

      q.breakable
      q.text "version: #{version}"

      q.breakable
      q.text "dependencies:"
      q.breakable
      q.pp dependencies

      q.breakable
      q.text "source:"
      q.breakable
      q.pp @source
    end
  end
end
PK}$[��3:YY%rubygems/rubygems/resolver/api_set.rbnu�[���# frozen_string_literal: true
##
# The global rubygems pool, available via the rubygems.org API.
# Returns instances of APISpecification.

class Gem::Resolver::APISet < Gem::Resolver::Set
  autoload :GemParser, File.expand_path("api_set/gem_parser", __dir__)

  ##
  # The URI for the dependency API this APISet uses.

  attr_reader :dep_uri # :nodoc:

  ##
  # The Gem::Source that gems are fetched from

  attr_reader :source

  ##
  # The corresponding place to fetch gems.

  attr_reader :uri

  ##
  # Creates a new APISet that will retrieve gems from +uri+ using the RubyGems
  # API URL +dep_uri+ which is described at
  # https://guides.rubygems.org/rubygems-org-api

  def initialize(dep_uri = "https://index.rubygems.org/info/")
    super()

    dep_uri = URI dep_uri unless URI === dep_uri

    @dep_uri = dep_uri
    @uri     = dep_uri + ".."

    @data   = Hash.new {|h,k| h[k] = [] }
    @source = Gem::Source.new @uri

    @to_fetch = []
  end

  ##
  # Return an array of APISpecification objects matching
  # DependencyRequest +req+.

  def find_all(req)
    res = []

    return res unless @remote

    if @to_fetch.include?(req.name)
      prefetch_now
    end

    versions(req.name).each do |ver|
      if req.dependency.match? req.name, ver[:number], @prerelease
        res << Gem::Resolver::APISpecification.new(self, ver)
      end
    end

    res
  end

  ##
  # A hint run by the resolver to allow the Set to fetch
  # data for DependencyRequests +reqs+.

  def prefetch(reqs)
    return unless @remote
    names = reqs.map {|r| r.dependency.name }
    needed = names - @data.keys - @to_fetch

    @to_fetch += needed
  end

  def prefetch_now # :nodoc:
    needed, @to_fetch = @to_fetch, []

    needed.sort.each do |name|
      versions(name)
    end
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[APISet", "]" do
      q.breakable
      q.text "URI: #{@dep_uri}"

      q.breakable
      q.text "gem names:"
      q.pp @data.keys
    end
  end

  ##
  # Return data for all versions of the gem +name+.

  def versions(name) # :nodoc:
    if @data.key?(name)
      return @data[name]
    end

    uri = @dep_uri + name
    str = Gem::RemoteFetcher.fetcher.fetch_path uri

    lines(str).each do |ver|
      number, platform, dependencies, requirements = parse_gem(ver)

      platform ||= "ruby"
      dependencies = dependencies.map {|dep_name, reqs| [dep_name, reqs.join(", ")] }
      requirements = requirements.map {|req_name, reqs| [req_name.to_sym, reqs] }.to_h

      @data[name] << { name: name, number: number, platform: platform, dependencies: dependencies, requirements: requirements }
    end

    @data[name]
  end

  private

  def lines(str)
    lines = str.split("\n")
    header = lines.index("---")
    header ? lines[header + 1..-1] : lines
  end

  def parse_gem(string)
    @gem_parser ||= GemParser.new
    @gem_parser.parse(string)
  end
end
PK}$[]�����(rubygems/rubygems/resolver/source_set.rbnu�[���##
# The SourceSet chooses the best available method to query a remote index.
#
# Kind off like BestSet but filters the sources for gems

class Gem::Resolver::SourceSet < Gem::Resolver::Set
  ##
  # Creates a SourceSet for the given +sources+ or Gem::sources if none are
  # specified.  +sources+ must be a Gem::SourceList.

  def initialize
    super()

    @links = {}
    @sets  = {}
  end

  def find_all(req) # :nodoc:
    if set = get_set(req.dependency.name)
      set.find_all req
    else
      []
    end
  end

  # potentially no-op
  def prefetch(reqs) # :nodoc:
    reqs.each do |req|
      if set = get_set(req.dependency.name)
        set.prefetch reqs
      end
    end
  end

  def add_source_gem(name, source)
    @links[name] = source
  end

  private

  def get_set(name)
    link = @links[name]
    @sets[link] ||= Gem::Source.new(link).dependency_resolver_set if link
  end
end
PK}$[7���@@2rubygems/rubygems/resolver/vendor_specification.rbnu�[���# frozen_string_literal: true
##
# A VendorSpecification represents a gem that has been unpacked into a project
# and is being loaded through a gem dependencies file through the +path:+
# option.

class Gem::Resolver::VendorSpecification < Gem::Resolver::SpecSpecification
  def ==(other) # :nodoc:
    self.class === other &&
      @set  == other.set &&
      @spec == other.spec &&
      @source == other.source
  end

  ##
  # This is a null install as this gem was unpacked into a directory.
  # +options+ are ignored.

  def install(options = {})
    yield nil
  end
end
PK}$[s��PWW.rubygems/rubygems/resolver/requirement_list.rbnu�[���# frozen_string_literal: true
##
# The RequirementList is used to hold the requirements being considered
# while resolving a set of gems.
#
# The RequirementList acts like a queue where the oldest items are removed
# first.

class Gem::Resolver::RequirementList
  include Enumerable

  ##
  # Creates a new RequirementList.

  def initialize
    @exact = []
    @list = []
  end

  def initialize_copy(other) # :nodoc:
    @exact = @exact.dup
    @list = @list.dup
  end

  ##
  # Adds Resolver::DependencyRequest +req+ to this requirements list.

  def add(req)
    if req.requirement.exact?
      @exact.push req
    else
      @list.push req
    end
    req
  end

  ##
  # Enumerates requirements in the list

  def each # :nodoc:
    return enum_for __method__ unless block_given?

    @exact.each do |requirement|
      yield requirement
    end

    @list.each do |requirement|
      yield requirement
    end
  end

  ##
  # How many elements are in the list

  def size
    @exact.size + @list.size
  end

  ##
  # Is the list empty?

  def empty?
    @exact.empty? && @list.empty?
  end

  ##
  # Remove the oldest DependencyRequest from the list.

  def remove
    return @exact.shift unless @exact.empty?
    @list.shift
  end

  ##
  # Returns the oldest five entries from the list.

  def next5
    x = @exact[0,5]
    x + @list[0,5 - x.size]
  end
end
PK}$[`ك��(rubygems/rubygems/resolver/vendor_set.rbnu�[���# frozen_string_literal: true
##
# A VendorSet represents gems that have been unpacked into a specific
# directory that contains a gemspec.
#
# This is used for gem dependency file support.
#
# Example:
#
#   set = Gem::Resolver::VendorSet.new
#
#   set.add_vendor_gem 'rake', 'vendor/rake'
#
# The directory vendor/rake must contain an unpacked rake gem along with a
# rake.gemspec (watching the given name).

class Gem::Resolver::VendorSet < Gem::Resolver::Set
  ##
  # The specifications for this set.

  attr_reader :specs # :nodoc:

  def initialize # :nodoc:
    super()

    @directories = {}
    @specs       = {}
  end

  ##
  # Adds a specification to the set with the given +name+ which has been
  # unpacked into the given +directory+.

  def add_vendor_gem(name, directory) # :nodoc:
    gemspec = File.join directory, "#{name}.gemspec"

    spec = Gem::Specification.load gemspec

    raise Gem::GemNotFoundException,
          "unable to find #{gemspec} for gem #{name}" unless spec

    spec.full_gem_path = File.expand_path directory

    @specs[spec.name]  = spec
    @directories[spec] = directory

    spec
  end

  ##
  # Returns an Array of VendorSpecification objects matching the
  # DependencyRequest +req+.

  def find_all(req)
    @specs.values.select do |spec|
      req.match? spec
    end.map do |spec|
      source = Gem::Source::Vendor.new @directories[spec]
      Gem::Resolver::VendorSpecification.new self, spec, source
    end
  end

  ##
  # Loads a spec with the given +name+. +version+, +platform+ and +source+ are
  # ignored.

  def load_spec(name, version, platform, source) # :nodoc:
    @specs.fetch name
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[VendorSet", "]" do
      next if @directories.empty?
      q.breakable

      dirs = @directories.map do |spec, directory|
        "#{spec.full_name}: #{directory}"
      end

      q.seplist dirs do |dir|
        q.text dir
      end
    end
  end
end
PK}$[5p�
�
+rubygems/rubygems/resolver/specification.rbnu�[���# frozen_string_literal: true
##
# A Resolver::Specification contains a subset of the information
# contained in a Gem::Specification.  Only the information necessary for
# dependency resolution in the resolver is included.

class Gem::Resolver::Specification
  ##
  # The dependencies of the gem for this specification

  attr_reader :dependencies

  ##
  # The name of the gem for this specification

  attr_reader :name

  ##
  # The platform this gem works on.

  attr_reader :platform

  ##
  # The set this specification came from.

  attr_reader :set

  ##
  # The source for this specification

  attr_reader :source

  ##
  # The Gem::Specification for this Resolver::Specification.
  #
  # Implementers, note that #install updates @spec, so be sure to cache the
  # Gem::Specification in @spec when overriding.

  attr_reader :spec

  ##
  # The version of the gem for this specification.

  attr_reader :version

  ##
  # The required_ruby_version constraint for this specification.

  attr_reader :required_ruby_version

  ##
  # The required_ruby_version constraint for this specification.

  attr_reader :required_rubygems_version

  ##
  # Sets default instance variables for the specification.

  def initialize
    @dependencies = nil
    @name         = nil
    @platform     = nil
    @set          = nil
    @source       = nil
    @version      = nil
    @required_ruby_version = Gem::Requirement.default
    @required_rubygems_version = Gem::Requirement.default
  end

  ##
  # Fetches development dependencies if the source does not provide them by
  # default (see APISpecification).

  def fetch_development_dependencies # :nodoc:
  end

  ##
  # The name and version of the specification.
  #
  # Unlike Gem::Specification#full_name, the platform is not included.

  def full_name
    "#{@name}-#{@version}"
  end

  ##
  # Installs this specification using the Gem::Installer +options+.  The
  # install method yields a Gem::Installer instance, which indicates the
  # gem will be installed, or +nil+, which indicates the gem is already
  # installed.
  #
  # After installation #spec is updated to point to the just-installed
  # specification.

  def install(options = {})
    require_relative "../installer"

    gem = download options

    installer = Gem::Installer.at gem, options

    yield installer if block_given?

    @spec = installer.install
  end

  def download(options)
    dir = options[:install_dir] || Gem.dir

    Gem.ensure_gem_subdirectories dir

    source.download spec, dir
  end

  ##
  # Returns true if this specification is installable on this platform.

  def installable_platform?
    Gem::Platform.match_spec? spec
  end

  def local? # :nodoc:
    false
  end
end
PK}$[���UU0rubygems/rubygems/resolver/spec_specification.rbnu�[���# frozen_string_literal: true
##
# The Resolver::SpecSpecification contains common functionality for
# Resolver specifications that are backed by a Gem::Specification.

class Gem::Resolver::SpecSpecification < Gem::Resolver::Specification
  ##
  # A SpecSpecification is created for a +set+ for a Gem::Specification in
  # +spec+.  The +source+ is either where the +spec+ came from, or should be
  # loaded from.

  def initialize(set, spec, source = nil)
    @set    = set
    @source = source
    @spec   = spec
  end

  ##
  # The dependencies of the gem for this specification

  def dependencies
    spec.dependencies
  end

  ##
  # The required_ruby_version constraint for this specification

  def required_ruby_version
    spec.required_ruby_version
  end

  ##
  # The required_rubygems_version constraint for this specification

  def required_rubygems_version
    spec.required_rubygems_version
  end

  ##
  # The name and version of the specification.
  #
  # Unlike Gem::Specification#full_name, the platform is not included.

  def full_name
    "#{spec.name}-#{spec.version}"
  end

  ##
  # The name of the gem for this specification

  def name
    spec.name
  end

  ##
  # The platform this gem works on.

  def platform
    spec.platform
  end

  ##
  # The version of the gem for this specification.

  def version
    spec.version
  end
end
PK}$[6����5rubygems/rubygems/resolver/installed_specification.rbnu�[���# frozen_string_literal: true
##
# An InstalledSpecification represents a gem that is already installed
# locally.

class Gem::Resolver::InstalledSpecification < Gem::Resolver::SpecSpecification
  def ==(other) # :nodoc:
    self.class === other &&
      @set  == other.set &&
      @spec == other.spec
  end

  ##
  # This is a null install as this specification is already installed.
  # +options+ are ignored.

  def install(options = {})
    yield nil
  end

  ##
  # Returns +true+ if this gem is installable for the current platform.

  def installable_platform?
    # BACKCOMPAT If the file is coming out of a specified file, then we
    # ignore the platform. This code can be removed in RG 3.0.
    return true if @source.kind_of? Gem::Source::SpecificFile

    super
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[InstalledSpecification", "]" do
      q.breakable
      q.text "name: #{name}"

      q.breakable
      q.text "version: #{version}"

      q.breakable
      q.text "platform: #{platform}"

      q.breakable
      q.text "dependencies:"
      q.breakable
      q.pp spec.dependencies
    end
  end

  ##
  # The source for this specification

  def source
    @source ||= Gem::Source::Installed.new
  end
end
PK}$[��00+rubygems/rubygems/resolver/installer_set.rbnu�[���# frozen_string_literal: true
##
# A set of gems for installation sourced from remote sources and local .gem
# files

class Gem::Resolver::InstallerSet < Gem::Resolver::Set
  ##
  # List of Gem::Specification objects that must always be installed.

  attr_reader :always_install # :nodoc:

  ##
  # Only install gems in the always_install list

  attr_accessor :ignore_dependencies # :nodoc:

  ##
  # Do not look in the installed set when finding specifications.  This is
  # used by the --install-dir option to `gem install`

  attr_accessor :ignore_installed # :nodoc:

  ##
  # The remote_set looks up remote gems for installation.

  attr_reader :remote_set # :nodoc:

  ##
  # Ignore ruby & rubygems specification constraints.
  #

  attr_accessor :force # :nodoc:

  ##
  # Creates a new InstallerSet that will look for gems in +domain+.

  def initialize(domain)
    super()

    @domain = domain

    @f = Gem::SpecFetcher.fetcher

    @always_install      = []
    @ignore_dependencies = false
    @ignore_installed    = false
    @local               = {}
    @local_source        = Gem::Source::Local.new
    @remote_set          = Gem::Resolver::BestSet.new
    @force               = false
    @specs               = {}
  end

  ##
  # Looks up the latest specification for +dependency+ and adds it to the
  # always_install list.

  def add_always_install(dependency)
    request = Gem::Resolver::DependencyRequest.new dependency, nil

    found = find_all request

    found.delete_if do |s|
      s.version.prerelease? && !s.local?
    end unless dependency.prerelease?

    found = found.select do |s|
      Gem::Source::SpecificFile === s.source ||
        Gem::Platform.match(s.platform)
    end

    found = found.sort_by do |s|
      [s.version, Gem::Platform.sort_priority(s.platform)]
    end

    newest = found.last

    unless newest
      exc = Gem::UnsatisfiableDependencyError.new request
      exc.errors = errors

      raise exc
    end

    unless @force
      found_matching_metadata = found.reverse.find do |spec|
        metadata_satisfied?(spec)
      end

      if found_matching_metadata.nil?
        ensure_required_ruby_version_met(newest.spec)
        ensure_required_rubygems_version_met(newest.spec)
      else
        newest = found_matching_metadata
      end
    end

    @always_install << newest.spec
  end

  ##
  # Adds a local gem requested using +dep_name+ with the given +spec+ that can
  # be loaded and installed using the +source+.

  def add_local(dep_name, spec, source)
    @local[dep_name] = [spec, source]
  end

  ##
  # Should local gems should be considered?

  def consider_local? # :nodoc:
    @domain == :both || @domain == :local
  end

  ##
  # Should remote gems should be considered?

  def consider_remote? # :nodoc:
    @domain == :both || @domain == :remote
  end

  ##
  # Errors encountered while resolving gems

  def errors
    @errors + @remote_set.errors
  end

  ##
  # Returns an array of IndexSpecification objects matching DependencyRequest
  # +req+.

  def find_all(req)
    res = []

    dep = req.dependency

    return res if @ignore_dependencies &&
                  @always_install.none? {|spec| dep.match? spec }

    name = dep.name

    dep.matching_specs.each do |gemspec|
      next if @always_install.any? {|spec| spec.name == gemspec.name }

      res << Gem::Resolver::InstalledSpecification.new(self, gemspec)
    end unless @ignore_installed

    if consider_local?
      matching_local = @local.values.select do |spec, _|
        req.match? spec
      end.map do |spec, source|
        Gem::Resolver::LocalSpecification.new self, spec, source
      end

      res.concat matching_local

      begin
        if local_spec = @local_source.find_gem(name, dep.requirement)
          res << Gem::Resolver::IndexSpecification.new(
            self, local_spec.name, local_spec.version,
            @local_source, local_spec.platform)
        end
      rescue Gem::Package::FormatError
        # ignore
      end
    end

    res.concat @remote_set.find_all req if consider_remote?

    res
  end

  def prefetch(reqs)
    @remote_set.prefetch(reqs) if consider_remote?
  end

  def prerelease=(allow_prerelease)
    super

    @remote_set.prerelease = allow_prerelease
  end

  def inspect # :nodoc:
    always_install = @always_install.map {|s| s.full_name }

    "#<%s domain: %s specs: %p always install: %p>" % [
      self.class, @domain, @specs.keys, always_install
    ]
  end

  ##
  # Called from IndexSpecification to get a true Specification
  # object.

  def load_spec(name, ver, platform, source) # :nodoc:
    key = "#{name}-#{ver}-#{platform}"

    @specs.fetch key do
      tuple = Gem::NameTuple.new name, ver, platform

      @specs[key] = source.fetch_spec tuple
    end
  end

  ##
  # Has a local gem for +dep_name+ been added to this set?

  def local?(dep_name) # :nodoc:
    spec, _ = @local[dep_name]

    spec
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[InstallerSet", "]" do
      q.breakable
      q.text "domain: #{@domain}"

      q.breakable
      q.text "specs: "
      q.pp @specs.keys

      q.breakable
      q.text "always install: "
      q.pp @always_install
    end
  end

  def remote=(remote) # :nodoc:
    case @domain
    when :local then
      @domain = :both if remote
    when :remote then
      @domain = nil unless remote
    when :both then
      @domain = :local unless remote
    end
  end

  private

  def metadata_satisfied?(spec)
    spec.required_ruby_version.satisfied_by?(Gem.ruby_version) &&
      spec.required_rubygems_version.satisfied_by?(Gem.rubygems_version)
  end

  def ensure_required_ruby_version_met(spec) # :nodoc:
    if rrv = spec.required_ruby_version
      ruby_version = Gem.ruby_version
      unless rrv.satisfied_by? ruby_version
        raise Gem::RuntimeRequirementNotMetError,
          "#{spec.full_name} requires Ruby version #{rrv}. The current ruby version is #{ruby_version}."
      end
    end
  end

  def ensure_required_rubygems_version_met(spec) # :nodoc:
    if rrgv = spec.required_rubygems_version
      unless rrgv.satisfied_by? Gem.rubygems_version
        rg_version = Gem::VERSION
        raise Gem::RuntimeRequirementNotMetError,
          "#{spec.full_name} requires RubyGems version #{rrgv}. The current RubyGems version is #{rg_version}. " +
          "Try 'gem update --system' to update RubyGems itself."
      end
    end
  end
end
PK}$[�йe��&rubygems/rubygems/resolver/conflict.rbnu�[���# frozen_string_literal: true
##
# Used internally to indicate that a dependency conflicted
# with a spec that would be activated.

class Gem::Resolver::Conflict
  ##
  # The specification that was activated prior to the conflict

  attr_reader :activated

  ##
  # The dependency that is in conflict with the activated gem.

  attr_reader :dependency

  attr_reader :failed_dep # :nodoc:

  ##
  # Creates a new resolver conflict when +dependency+ is in conflict with an
  # already +activated+ specification.

  def initialize(dependency, activated, failed_dep=dependency)
    @dependency = dependency
    @activated = activated
    @failed_dep = failed_dep
  end

  def ==(other) # :nodoc:
    self.class === other &&
      @dependency == other.dependency &&
      @activated  == other.activated  &&
      @failed_dep == other.failed_dep
  end

  ##
  # A string explanation of the conflict.

  def explain
    "<Conflict wanted: #{@failed_dep}, had: #{activated.spec.full_name}>"
  end

  ##
  # Return the 2 dependency objects that conflicted

  def conflicting_dependencies
    [@failed_dep.dependency, @activated.request.dependency]
  end

  ##
  # Explanation of the conflict used by exceptions to print useful messages

  def explanation
    activated   = @activated.spec.full_name
    dependency  = @failed_dep.dependency
    requirement = dependency.requirement
    alternates  = dependency.matching_specs.map {|spec| spec.full_name }

    unless alternates.empty?
      matching = <<-MATCHING.chomp

  Gems matching %s:
    %s
      MATCHING

      matching = matching % [
        dependency,
        alternates.join(", "),
      ]
    end

    explanation = <<-EXPLANATION
  Activated %s
  which does not match conflicting dependency (%s)

  Conflicting dependency chains:
    %s

  versus:
    %s
%s
    EXPLANATION

    explanation % [
      activated, requirement,
      request_path(@activated).reverse.join(", depends on\n    "),
      request_path(@failed_dep).reverse.join(", depends on\n    "),
      matching
    ]
  end

  ##
  # Returns true if the conflicting dependency's name matches +spec+.

  def for_spec?(spec)
    @dependency.name == spec.name
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[Dependency conflict: ", "]" do
      q.breakable

      q.text "activated "
      q.pp @activated

      q.breakable
      q.text " dependency "
      q.pp @dependency

      q.breakable
      if @dependency == @failed_dep
        q.text " failed"
      else
        q.text " failed dependency "
        q.pp @failed_dep
      end
    end
  end

  ##
  # Path of activations from the +current+ list.

  def request_path(current)
    path = []

    while current do
      case current
      when Gem::Resolver::ActivationRequest then
        path <<
          "#{current.request.dependency}, #{current.spec.version} activated"

        current = current.parent
      when Gem::Resolver::DependencyRequest then
        path << "#{current.dependency}"

        current = current.requester
      else
        raise Gem::Exception, "[BUG] unknown request class #{current.class}"
      end
    end

    path = ["user request (gem command or Gemfile)"] if path.empty?

    path
  end

  ##
  # Return the Specification that listed the dependency

  def requester
    @failed_dep.requester
  end
end
PK}$[�8sL)rubygems/rubygems/resolver/current_set.rbnu�[���# frozen_string_literal: true
##
# A set which represents the installed gems. Respects
# all the normal settings that control where to look
# for installed gems.

class Gem::Resolver::CurrentSet < Gem::Resolver::Set
  def find_all(req)
    req.dependency.matching_specs
  end
end
PK}$[p��).rubygems/rubygems/defaults/operating_system.rbnu�[���module Gem
  class << self

    ##
    # Returns full path of previous but one directory of dir in path
    # E.g. for '/usr/share/ruby', 'ruby', it returns '/usr'

    def previous_but_one_dir_to(path, dir)
      return unless path

      split_path = path.split(File::SEPARATOR)
      File.join(split_path.take_while { |one_dir| one_dir !~ /^#{dir}$/ }[0..-2])
    end
    private :previous_but_one_dir_to

    ##
    # Detects --install-dir option specified on command line.

    def opt_install_dir?
      @opt_install_dir ||= ARGV.include?('--install-dir') || ARGV.include?('-i')
    end
    private :opt_install_dir?

    ##
    # Detects --build-root option specified on command line.

    def opt_build_root?
      @opt_build_root ||= ARGV.include?('--build-root')
    end
    private :opt_build_root?

    ##
    # Tries to detect, if arguments and environment variables suggest that
    # 'gem install' is executed from rpmbuild.

    def rpmbuild?
      @rpmbuild ||= ENV['RPM_PACKAGE_NAME'] && (opt_install_dir? || opt_build_root?)
    end
    private :rpmbuild?

    ##
    # Default gems locations allowed on FHS system (/usr, /usr/share).
    # The locations are derived from directories specified during build
    # configuration.

    def default_locations
      @default_locations ||= {
        :system => previous_but_one_dir_to(RbConfig::CONFIG['vendordir'], RbConfig::CONFIG['RUBY_INSTALL_NAME']),
        :local => previous_but_one_dir_to(RbConfig::CONFIG['sitedir'], RbConfig::CONFIG['RUBY_INSTALL_NAME'])
      }
    end

    ##
    # For each location provides set of directories for binaries (:bin_dir)
    # platform independent (:gem_dir) and dependent (:ext_dir) files.

    def default_dirs
      @libdir ||= case RUBY_PLATFORM
      when 'java'
        RbConfig::CONFIG['datadir']
      else
        RbConfig::CONFIG['libdir']
      end

      @default_dirs ||= default_locations.inject(Hash.new) do |hash, location|
        destination, path = location

        hash[destination] = if path
          {
            :bin_dir => File.join(path, RbConfig::CONFIG['bindir'].split(File::SEPARATOR).last),
            :gem_dir => File.join(path, RbConfig::CONFIG['datadir'].split(File::SEPARATOR).last, 'gems'),
            :ext_dir => File.join(path, @libdir.split(File::SEPARATOR).last, 'gems')
          }
        else
          {
            :bin_dir => '',
            :gem_dir => '',
            :ext_dir => ''
          }
        end

        hash
      end
    end

    ##
    # Remove methods we are going to override. This avoids "method redefined;"
    # warnings otherwise issued by Ruby.

    remove_method :operating_system_defaults if method_defined? :operating_system_defaults
    remove_method :default_dir if method_defined? :default_dir
    remove_method :default_path if method_defined? :default_path
    remove_method :default_ext_dir_for if method_defined? :default_ext_dir_for

    ##
    # Regular user installs into user directory, root manages /usr/local.

    def operating_system_defaults
      unless opt_build_root?
        options = if Process.uid == 0
          "--install-dir=#{Gem.default_dirs[:local][:gem_dir]} --bindir #{Gem.default_dirs[:local][:bin_dir]}"
        end

        {"gem" => options}
      else
        {}
      end
    end

    ##
    # RubyGems default overrides.

    def default_dir
      Gem.default_dirs[:system][:gem_dir]
    end

    def default_path
      path = default_dirs.collect {|location, paths| paths[:gem_dir]}
      path.unshift Gem.user_dir if File.exist? Gem.user_home
      path
    end

    def default_ext_dir_for base_dir
      dir = if rpmbuild?
        build_dir = base_dir.chomp Gem.default_dirs[:system][:gem_dir]
        if build_dir != base_dir
          File.join build_dir, Gem.default_dirs[:system][:ext_dir]
        end
      else
        dirs = Gem.default_dirs.detect {|location, paths| paths[:gem_dir] == base_dir}
        dirs && dirs.last[:ext_dir]
      end
      dir && File.join(dir, RbConfig::CONFIG['RUBY_INSTALL_NAME'])
    end

    # This method should be available since RubyGems 2.2 until RubyGems 3.0.
    # https://github.com/rubygems/rubygems/issues/749
    if method_defined? :install_extension_in_lib
      remove_method :install_extension_in_lib

      def install_extension_in_lib
        false
      end
    end
  end
end
PK}$[�&߲�$rubygems/rubygems/ext/build_error.rbnu�[���# frozen_string_literal: true
##
# Raised when there is an error while building extensions.

require_relative "../exceptions"

class Gem::Ext::BuildError < Gem::InstallError
end
PK}$[ԅ�V��&rubygems/rubygems/ext/cmake_builder.rbnu�[���# frozen_string_literal: true

class Gem::Ext::CmakeBuilder < Gem::Ext::Builder
  def self.build(extension, dest_path, results, args=[], lib_dir=nil, cmake_dir=Dir.pwd)
    unless File.exist?(File.join(cmake_dir, "Makefile"))
      require_relative "../command"
      cmd = ["cmake", ".", "-DCMAKE_INSTALL_PREFIX=#{dest_path}", *Gem::Command.build_args]

      run cmd, results, class_name, cmake_dir
    end

    make dest_path, results, cmake_dir

    results
  end
end
PK}$[��I#I#&rubygems/rubygems/ext/cargo_builder.rbnu�[���# frozen_string_literal: true

# This class is used by rubygems to build Rust extensions. It is a thin-wrapper
# over the `cargo rustc` command which takes care of building Rust code in a way
# that Ruby can use.
class Gem::Ext::CargoBuilder < Gem::Ext::Builder
  attr_accessor :spec, :runner, :profile

  def initialize(spec)
    require_relative "../command"
    require_relative "cargo_builder/link_flag_converter"

    @spec = spec
    @runner = self.class.method(:run)
    @profile = :release
  end

  def build(_extension, dest_path, results, args = [], lib_dir = nil, cargo_dir = Dir.pwd)
    require "fileutils"
    require "shellwords"

    build_crate(dest_path, results, args, cargo_dir)
    validate_cargo_build!(dest_path)
    rename_cdylib_for_ruby_compatibility(dest_path)
    finalize_directory(dest_path, lib_dir, cargo_dir)
    results
  end

  def build_crate(dest_path, results, args, cargo_dir)
    env = build_env
    cmd = cargo_command(cargo_dir, dest_path, args)
    runner.call cmd, results, "cargo", cargo_dir, env

    results
  end

  def build_env
    build_env = rb_config_env
    build_env["RUBY_STATIC"] = "true" if ruby_static? && ENV.key?("RUBY_STATIC")
    build_env["RUSTFLAGS"] = "#{ENV["RUSTFLAGS"]} --cfg=rb_sys_gem".strip
    build_env
  end

  def cargo_command(cargo_dir, dest_path, args = [])
    manifest = File.join(cargo_dir, "Cargo.toml")
    cargo = ENV.fetch("CARGO", "cargo")

    cmd = []
    cmd += [cargo, "rustc"]
    cmd += ["--target", ENV["CARGO_BUILD_TARGET"]] if ENV["CARGO_BUILD_TARGET"]
    cmd += ["--target-dir", dest_path]
    cmd += ["--manifest-path", manifest]
    cmd += ["--lib"]
    cmd += ["--profile", profile.to_s]
    cmd += ["--locked"] if profile == :release
    cmd += Gem::Command.build_args
    cmd += args
    cmd += ["--"]
    cmd += [*cargo_rustc_args(dest_path)]
    cmd
  end

  private

  def rb_config_env
    result = {}
    RbConfig::CONFIG.each {|k, v| result["RBCONFIG_#{k}"] = v }
    result
  end

  def cargo_rustc_args(dest_dir)
    [
      *linker_args,
      *mkmf_libpath,
      *rustc_dynamic_linker_flags(dest_dir),
      *rustc_lib_flags(dest_dir),
      *platform_specific_rustc_args(dest_dir),
      *debug_flags,
    ]
  end

  def platform_specific_rustc_args(dest_dir, flags = [])
    if mingw_target?
      # On mingw platforms, mkmf adds libruby to the linker flags
      flags += libruby_args(dest_dir)

      # Make sure ALSR is used on mingw
      # see https://github.com/rust-lang/rust/pull/75406/files
      flags += ["-C", "link-arg=-Wl,--dynamicbase"]
      flags += ["-C", "link-arg=-Wl,--disable-auto-image-base"]

      # If the gem is installed on a host with build tools installed, but is
      # run on one that isn't the missing libraries will cause the extension
      # to fail on start.
      flags += ["-C", "link-arg=-static-libgcc"]
    elsif darwin_target?
      # Ventura does not always have this flag enabled
      flags += ["-C", "link-arg=-Wl,-undefined,dynamic_lookup"]
    end

    flags
  end

  # We want to use the same linker that Ruby uses, so that the linker flags from
  # mkmf work properly.
  def linker_args
    # Have to handle CC="cl /nologo" on mswin
    cc_flag = Shellwords.split(makefile_config("CC"))
    linker = cc_flag.shift
    link_args = cc_flag.flat_map {|a| ["-C", "link-arg=#{a}"] }

    ["-C", "linker=#{linker}", *link_args]
  end

  def libruby_args(dest_dir)
    libs = makefile_config(ruby_static? ? "LIBRUBYARG_STATIC" : "LIBRUBYARG_SHARED")
    raw_libs = Shellwords.split(libs)
    raw_libs.flat_map {|l| ldflag_to_link_modifier(l) }
  end

  def ruby_static?
    return true if %w[1 true].include?(ENV["RUBY_STATIC"])

    makefile_config("ENABLE_SHARED") == "no"
  end

  # Ruby expects the dylib to follow a file name convention for loading
  def rename_cdylib_for_ruby_compatibility(dest_path)
    new_path = final_extension_path(dest_path)
    FileUtils.cp(cargo_dylib_path(dest_path), new_path)
    new_path
  end

  def validate_cargo_build!(dir)
    dylib_path = cargo_dylib_path(dir)

    raise DylibNotFoundError, dir unless File.exist?(dylib_path)

    dylib_path
  end

  def final_extension_path(dest_path)
    dylib_path = cargo_dylib_path(dest_path)
    dlext_name = "#{spec.name}.#{makefile_config("DLEXT")}"
    dylib_path.gsub(File.basename(dylib_path), dlext_name)
  end

  def cargo_dylib_path(dest_path)
    prefix = so_ext == "dll" ? "" : "lib"
    path_parts = [dest_path]
    path_parts << ENV["CARGO_BUILD_TARGET"] if ENV["CARGO_BUILD_TARGET"]
    path_parts += [profile_target_directory, "#{prefix}#{cargo_crate_name}.#{so_ext}"]
    File.join(*path_parts)
  end

  def cargo_crate_name
    spec.metadata.fetch("cargo_crate_name", spec.name).tr("-", "_")
  end

  def rustc_dynamic_linker_flags(dest_dir)
    split_flags("DLDFLAGS")
      .map {|arg| maybe_resolve_ldflag_variable(arg, dest_dir) }
      .compact
      .flat_map {|arg| ldflag_to_link_modifier(arg) }
  end

  def rustc_lib_flags(dest_dir)
    split_flags("LIBS").flat_map {|arg| ldflag_to_link_modifier(arg) }
  end

  def split_flags(var)
    Shellwords.split(RbConfig::CONFIG.fetch(var, ""))
  end

  def ldflag_to_link_modifier(arg)
    LinkFlagConverter.convert(arg)
  end

  def msvc_target?
    makefile_config("target_os").include?("msvc")
  end

  def darwin_target?
    makefile_config("target_os").include?("darwin")
  end

  def mingw_target?
    makefile_config("target_os").include?("mingw")
  end

  def win_target?
    target_platform = RbConfig::CONFIG["target_os"]
    !!Gem::WIN_PATTERNS.find {|r| target_platform =~ r }
  end

  # Interpolate substition vars in the arg (i.e. $(DEFFILE))
  def maybe_resolve_ldflag_variable(input_arg, dest_dir)
    var_matches = input_arg.match(/\$\((\w+)\)/)

    return input_arg unless var_matches

    var_name = var_matches[1]

    return input_arg if var_name.nil? || var_name.chomp.empty?

    case var_name
    # On windows, it is assumed that mkmf has setup an exports file for the
    # extension, so we have to to create one ourselves.
    when "DEFFILE"
      write_deffile(dest_dir)
    else
      RbConfig::CONFIG[var_name]
    end
  end

  def write_deffile(dest_dir)
    deffile_path = File.join(dest_dir, "#{spec.name}-#{RbConfig::CONFIG["arch"]}.def")
    export_prefix = makefile_config("EXPORT_PREFIX") || ""

    File.open(deffile_path, "w") do |f|
      f.puts "EXPORTS"
      f.puts "#{export_prefix.strip}Init_#{spec.name}"
    end

    deffile_path
  end

  # We have to basically reimplement RbConfig::CONFIG['SOEXT'] here to support
  # Ruby < 2.5
  #
  # @see https://github.com/ruby/ruby/blob/c87c027f18c005460746a74c07cd80ee355b16e4/configure.ac#L3185
  def so_ext
    return RbConfig::CONFIG["SOEXT"] if RbConfig::CONFIG.key?("SOEXT")

    if win_target?
      "dll"
    elsif darwin_target?
      "dylib"
    else
      "so"
    end
  end

  # Corresponds to $(LIBPATH) in mkmf
  def mkmf_libpath
    ["-L", "native=#{makefile_config("libdir")}"]
  end

  def makefile_config(var_name)
    val = RbConfig::MAKEFILE_CONFIG[var_name]

    return unless val

    RbConfig.expand(val.dup)
  end

  # Good balance between binary size and debugability
  def debug_flags
    return [] if profile == :dev

    ["-C", "debuginfo=1"]
  end

  # Copied from ExtConfBuilder
  def finalize_directory(dest_path, lib_dir, extension_dir)
    require "fileutils"
    require "tempfile"

    ext_path = final_extension_path(dest_path)

    begin
      tmp_dest = Dir.mktmpdir(".gem.", extension_dir)

      # Some versions of `mktmpdir` return absolute paths, which will break make
      # if the paths contain spaces.
      #
      # As such, we convert to a relative path.
      tmp_dest_relative = get_relative_path(tmp_dest.clone, extension_dir)

      full_tmp_dest = File.join(extension_dir, tmp_dest_relative)

      # TODO: remove in RubyGems 4
      if Gem.install_extension_in_lib && lib_dir
        FileUtils.mkdir_p lib_dir
        FileUtils.cp_r ext_path, lib_dir, remove_destination: true
      end

      FileUtils::Entry_.new(full_tmp_dest).traverse do |ent|
        destent = ent.class.new(dest_path, ent.rel)
        destent.exist? || FileUtils.mv(ent.path, destent.path)
      end
    ensure
      FileUtils.rm_rf tmp_dest if tmp_dest
    end
  end

  def get_relative_path(path, base)
    path[0..base.length - 1] = "." if path.start_with?(base)
    path
  end

  def profile_target_directory
    case profile
    when :release then "release"
    when :dev     then "debug"
    else          raise "unknown target directory for profile: #{profile}"
    end
  end

  # Error raised when no cdylib artifact was created
  class DylibNotFoundError < StandardError
    def initialize(dir)
      files = Dir.glob(File.join(dir, "**", "*")).map {|f| "- #{f}" }.join "\n"

      super <<~MSG
        Dynamic library not found for Rust extension (in #{dir})

        Make sure you set "crate-type" in Cargo.toml to "cdylib"

        Found files:
        #{files}
      MSG
    end
  end
end
PK}$[b�=��%rubygems/rubygems/ext/rake_builder.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

class Gem::Ext::RakeBuilder < Gem::Ext::Builder
  def self.build(extension, dest_path, results, args=[], lib_dir=nil, extension_dir=Dir.pwd)
    if File.basename(extension) =~ /mkrf_conf/i
      run([Gem.ruby, File.basename(extension), *args], results, class_name, extension_dir)
    end

    rake = ENV["rake"]

    if rake
      require "shellwords"
      rake = rake.shellsplit
    else
      begin
        rake = [Gem.ruby, "-I#{File.expand_path("../..", __dir__)}", "-rrubygems", Gem.bin_path("rake", "rake")]
      rescue Gem::Exception
        rake = [Gem.default_exec_format % "rake"]
      end
    end

    rake_args = ["RUBYARCHDIR=#{dest_path}", "RUBYLIBDIR=#{dest_path}", *args]
    run(rake + rake_args, results, class_name, extension_dir)

    results
  end
end
PK}$[߻ee:rubygems/rubygems/ext/cargo_builder/link_flag_converter.rbnu�[���# frozen_string_literal: true

class Gem::Ext::CargoBuilder < Gem::Ext::Builder
  # Converts Ruby link flags into something cargo understands
  class LinkFlagConverter
    def self.convert(arg)
      case arg.chomp
      when /^-L\s*(.+)$/
        ["-L", "native=#{$1}"]
      when /^--library=(\w+\S+)$/, /^-l\s*(\w+\S+)$/
        ["-l", $1]
      when /^-l\s*:lib(\S+).a$/
        ["-l", "static=#{$1}"]
      when /^-l\s*:lib(\S+).(so|dylib|dll)$/
        ["-l", "dylib=#{$1}"]
      when /^-F\s*(.*)$/
        ["-l", "framework=#{$1}"]
      else
        ["-C", "link_arg=#{arg}"]
      end
    end
  end
end
PK}$[��++ rubygems/rubygems/ext/builder.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require_relative "../user_interaction"

class Gem::Ext::Builder
  include Gem::UserInteraction

  attr_accessor :build_args # :nodoc:

  def self.class_name
    name =~ /Ext::(.*)Builder/
    $1.downcase
  end

  def self.make(dest_path, results, make_dir = Dir.pwd, sitedir = nil)
    unless File.exist? File.join(make_dir, "Makefile")
      raise Gem::InstallError, "Makefile not found"
    end

    # try to find make program from Ruby configure arguments first
    RbConfig::CONFIG["configure_args"] =~ /with-make-prog\=(\w+)/
    make_program_name = ENV["MAKE"] || ENV["make"] || $1
    unless make_program_name
      make_program_name = (/mswin/ =~ RUBY_PLATFORM) ? "nmake" : "make"
    end
    make_program = Shellwords.split(make_program_name)

    # The installation of the bundled gems is failed when DESTDIR is empty in mswin platform.
    destdir = (/\bnmake/i !~ make_program_name || ENV["DESTDIR"] && ENV["DESTDIR"] != "") ? "DESTDIR=%s" % ENV["DESTDIR"] : ""

    env = [destdir]

    if sitedir
      env << "sitearchdir=%s" % sitedir
      env << "sitelibdir=%s" % sitedir
    end

    ["clean", "", "install"].each do |target|
      # Pass DESTDIR via command line to override what's in MAKEFLAGS
      cmd = [
        *make_program,
        *env,
        target,
      ].reject(&:empty?)
      begin
        run(cmd, results, "make #{target}".rstrip, make_dir)
      rescue Gem::InstallError
        raise unless target == "clean" # ignore clean failure
      end
    end
  end

  def self.run(command, results, command_name = nil, dir = Dir.pwd, env = {})
    verbose = Gem.configuration.really_verbose

    begin
      rubygems_gemdeps, ENV["RUBYGEMS_GEMDEPS"] = ENV["RUBYGEMS_GEMDEPS"], nil
      if verbose
        puts("current directory: #{dir}")
        p(command)
      end
      results << "current directory: #{dir}"
      require "shellwords"
      results << command.shelljoin

      require "open3"
      # Set $SOURCE_DATE_EPOCH for the subprocess.
      build_env = { "SOURCE_DATE_EPOCH" => Gem.source_date_epoch_string }.merge(env)
      output, status = begin
                         Open3.capture2e(build_env, *command, :chdir => dir)
                       rescue => error
                         raise Gem::InstallError, "#{command_name || class_name} failed#{error.message}"
                       end
      if verbose
        puts output
      else
        results << output
      end
    ensure
      ENV["RUBYGEMS_GEMDEPS"] = rubygems_gemdeps
    end

    unless status.success?
      results << "Building has failed. See above output for more information on the failure." if verbose
    end

    yield(status, results) if block_given?

    unless status.success?
      exit_reason =
        if status.exited?
          ", exit code #{status.exitstatus}"
        elsif status.signaled?
          ", uncaught signal #{status.termsig}"
        end

      raise Gem::InstallError, "#{command_name || class_name} failed#{exit_reason}"
    end
  end

  ##
  # Creates a new extension builder for +spec+.  If the +spec+ does not yet
  # have build arguments, saved, set +build_args+ which is an ARGV-style
  # array.

  def initialize(spec, build_args = spec.build_args)
    @spec       = spec
    @build_args = build_args
    @gem_dir    = spec.full_gem_path

    @ran_rake = false
  end

  ##
  # Chooses the extension builder class for +extension+

  def builder_for(extension) # :nodoc:
    case extension
    when /extconf/ then
      Gem::Ext::ExtConfBuilder
    when /configure/ then
      Gem::Ext::ConfigureBuilder
    when /rakefile/i, /mkrf_conf/i then
      @ran_rake = true
      Gem::Ext::RakeBuilder
    when /CMakeLists.txt/ then
      Gem::Ext::CmakeBuilder
    when /Cargo.toml/ then
      # We use the spec name here to ensure we invoke the correct init function later
      Gem::Ext::CargoBuilder.new(@spec)
    else
      build_error("No builder for extension '#{extension}'")
    end
  end

  ##
  # Logs the build +output+, then raises Gem::Ext::BuildError.

  def build_error(output, backtrace = nil) # :nodoc:
    gem_make_out = write_gem_make_out output

    message = <<-EOF
ERROR: Failed to build gem native extension.

    #{output}

Gem files will remain installed in #{@gem_dir} for inspection.
Results logged to #{gem_make_out}
EOF

    raise Gem::Ext::BuildError, message, backtrace
  end

  def build_extension(extension, dest_path) # :nodoc:
    results = []

    builder = builder_for(extension)

    extension_dir =
      File.expand_path File.join(@gem_dir, File.dirname(extension))
    lib_dir = File.join @spec.full_gem_path, @spec.raw_require_paths.first

    begin
      FileUtils.mkdir_p dest_path

      results = builder.build(extension, dest_path,
                              results, @build_args, lib_dir, extension_dir)

      verbose { results.join("\n") }

      write_gem_make_out results.join "\n"
    rescue => e
      results << e.message
      build_error(results.join("\n"), $@)
    end
  end

  ##
  # Builds extensions.  Valid types of extensions are extconf.rb files,
  # configure scripts and rakefiles or mkrf_conf files.

  def build_extensions
    return if @spec.extensions.empty?

    if @build_args.empty?
      say "Building native extensions. This could take a while..."
    else
      say "Building native extensions with: '#{@build_args.join ' '}'"
      say "This could take a while..."
    end

    dest_path = @spec.extension_dir

    require "fileutils"
    FileUtils.rm_f @spec.gem_build_complete_path

    @spec.extensions.each do |extension|
      break if @ran_rake

      build_extension extension, dest_path
    end

    FileUtils.touch @spec.gem_build_complete_path
  end

  ##
  # Writes +output+ to gem_make.out in the extension install directory.

  def write_gem_make_out(output) # :nodoc:
    destination = File.join @spec.extension_dir, "gem_make.out"

    FileUtils.mkdir_p @spec.extension_dir

    File.open destination, "wb" do |io|
      io.puts output
    end

    destination
  end
end
PK}$[$No$66*rubygems/rubygems/ext/configure_builder.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

class Gem::Ext::ConfigureBuilder < Gem::Ext::Builder
  def self.build(extension, dest_path, results, args=[], lib_dir=nil, configure_dir=Dir.pwd)
    unless File.exist?(File.join(configure_dir, "Makefile"))
      cmd = ["sh", "./configure", "--prefix=#{dest_path}", *args]

      run cmd, results, class_name, configure_dir
    end

    make dest_path, results, configure_dir

    results
  end
end
PK}$[s����)rubygems/rubygems/ext/ext_conf_builder.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
  def self.build(extension, dest_path, results, args=[], lib_dir=nil, extension_dir=Dir.pwd)
    require "fileutils"
    require "tempfile"

    tmp_dest = Dir.mktmpdir(".gem.", extension_dir)

    # Some versions of `mktmpdir` return absolute paths, which will break make
    # if the paths contain spaces.
    #
    # As such, we convert to a relative path.
    tmp_dest_relative = get_relative_path(tmp_dest.clone, extension_dir)

    destdir = ENV["DESTDIR"]

    begin
      require "shellwords"
      cmd = Gem.ruby.shellsplit << "-I" << File.expand_path("../..", __dir__) << File.basename(extension)
      cmd.push(*args)

      run(cmd, results, class_name, extension_dir) do |s, r|
        mkmf_log = File.join(extension_dir, "mkmf.log")
        if File.exist? mkmf_log
          unless s.success?
            r << "To see why this extension failed to compile, please check" \
              " the mkmf.log which can be found here:\n"
            r << "  " + File.join(dest_path, "mkmf.log") + "\n"
          end
          FileUtils.mv mkmf_log, dest_path
        end
      end

      ENV["DESTDIR"] = nil

      make dest_path, results, extension_dir, tmp_dest_relative

      full_tmp_dest = File.join(extension_dir, tmp_dest_relative)

      # TODO remove in RubyGems 4
      if Gem.install_extension_in_lib && lib_dir
        FileUtils.mkdir_p lib_dir
        entries = Dir.entries(full_tmp_dest) - %w[. ..]
        entries = entries.map {|entry| File.join full_tmp_dest, entry }
        FileUtils.cp_r entries, lib_dir, :remove_destination => true
      end

      FileUtils::Entry_.new(full_tmp_dest).traverse do |ent|
        destent = ent.class.new(dest_path, ent.rel)
        destent.exist? || FileUtils.mv(ent.path, destent.path)
      end
    ensure
      ENV["DESTDIR"] = destdir
    end

    results
  ensure
    FileUtils.rm_rf tmp_dest if tmp_dest
  end

  private

  def self.get_relative_path(path, base)
    path[0..base.length - 1] = "." if path.start_with?(base)
    path
  end
end
PK}$[��V��,rubygems/rubygems/commands/unpack_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../version_option"
require_relative "../security_option"
require_relative "../remote_fetcher"
require_relative "../package"

# forward-declare

module Gem::Security # :nodoc:
  class Policy # :nodoc:
  end
end

class Gem::Commands::UnpackCommand < Gem::Command
  include Gem::VersionOption
  include Gem::SecurityOption

  def initialize
    require "fileutils"

    super "unpack", "Unpack an installed gem to the current directory",
          :version => Gem::Requirement.default,
          :target  => Dir.pwd

    add_option("--target=DIR",
               "target directory for unpacking") do |value, options|
      options[:target] = value
    end

    add_option("--spec", "unpack the gem specification") do |value, options|
      options[:spec] = true
    end

    add_security_option
    add_version_option
  end

  def arguments # :nodoc:
    "GEMNAME       name of gem to unpack"
  end

  def defaults_str # :nodoc:
    "--version '#{Gem::Requirement.default}'"
  end

  def description
    <<-EOF
The unpack command allows you to examine the contents of a gem or modify
them to help diagnose a bug.

You can add the contents of the unpacked gem to the load path using the
RUBYLIB environment variable or -I:

  $ gem unpack my_gem
  Unpacked gem: '.../my_gem-1.0'
  [edit my_gem-1.0/lib/my_gem.rb]
  $ ruby -Imy_gem-1.0/lib -S other_program

You can repackage an unpacked gem using the build command.  See the build
command help for an example.
    EOF
  end

  def usage # :nodoc:
    "#{program_name} GEMNAME"
  end

  #--
  # TODO: allow, e.g., 'gem unpack rake-0.3.1'.  Find a general solution for
  # this, so that it works for uninstall as well.  (And check other commands
  # at the same time.)

  def execute
    security_policy = options[:security_policy]

    get_all_gem_names.each do |name|
      dependency = Gem::Dependency.new name, options[:version]
      path = get_path dependency

      unless path
        alert_error "Gem '#{name}' not installed nor fetchable."
        next
      end

      if @options[:spec]
        spec, metadata = Gem::Package.raw_spec(path, security_policy)

        if metadata.nil?
          alert_error "--spec is unsupported on '#{name}' (old format gem)"
          next
        end

        spec_file = File.basename spec.spec_file

        FileUtils.mkdir_p @options[:target] if @options[:target]

        destination = begin
          if @options[:target]
            File.join @options[:target], spec_file
          else
            spec_file
          end
        end

        File.open destination, "w" do |io|
          io.write metadata
        end
      else
        basename = File.basename path, ".gem"
        target_dir = File.expand_path basename, options[:target]

        package = Gem::Package.new path, security_policy
        package.extract_files target_dir

        say "Unpacked gem: '#{target_dir}'"
      end
    end
  end

  ##
  #
  # Find cached filename in Gem.path. Returns nil if the file cannot be found.
  #
  #--
  # TODO: see comments in get_path() about general service.

  def find_in_cache(filename)
    Gem.path.each do |path|
      this_path = File.join(path, "cache", filename)
      return this_path if File.exist? this_path
    end

    return nil
  end

  ##
  # Return the full path to the cached gem file matching the given
  # name and version requirement.  Returns 'nil' if no match.
  #
  # Example:
  #
  #   get_path 'rake', '> 0.4' # "/usr/lib/ruby/gems/1.8/cache/rake-0.4.2.gem"
  #   get_path 'rake', '< 0.1' # nil
  #   get_path 'rak'           # nil (exact name required)
  #--
  # TODO: This should be refactored so that it's a general service. I don't
  # think any of our existing classes are the right place though.  Just maybe
  # 'Cache'?
  #
  # TODO: It just uses Gem.dir for now.  What's an easy way to get the list of
  # source directories?

  def get_path(dependency)
    return dependency.name if dependency.name =~ /\.gem$/i

    specs = dependency.matching_specs

    selected = specs.max_by {|s| s.version }

    return Gem::RemoteFetcher.fetcher.download_to_cache(dependency) unless
      selected

    return unless dependency.name =~ /^#{selected.name}$/i

    # We expect to find (basename).gem in the 'cache' directory.  Furthermore,
    # the name match must be exact (ignoring case).

    path = find_in_cache File.basename selected.cache_file

    return Gem::RemoteFetcher.fetcher.download_to_cache(dependency) unless path

    path
  end
end
PK}$[��v���+rubygems/rubygems/commands/stale_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"

class Gem::Commands::StaleCommand < Gem::Command
  def initialize
    super("stale", "List gems along with access times")
  end

  def description # :nodoc:
    <<-EOF
The stale command lists the latest access time for all the files in your
installed gems.

You can use this command to discover gems and gem versions you are no
longer using.
    EOF
  end

  def usage # :nodoc:
    "#{program_name}"
  end

  def execute
    gem_to_atime = {}
    Gem::Specification.each do |spec|
      name = spec.full_name
      Dir["#{spec.full_gem_path}/**/*.*"].each do |file|
        next if File.directory?(file)
        stat = File.stat(file)
        gem_to_atime[name] ||= stat.atime
        gem_to_atime[name] = stat.atime if gem_to_atime[name] < stat.atime
      end
    end

    gem_to_atime.sort_by {|_, atime| atime }.each do |name, atime|
      say "#{name} at #{atime.strftime '%c'}"
    end
  end
end
PK}$[�Z�ѣ�/rubygems/rubygems/commands/uninstall_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../version_option"
require_relative "../uninstaller"
require "fileutils"

##
# Gem uninstaller command line tool
#
# See `gem help uninstall`

class Gem::Commands::UninstallCommand < Gem::Command
  include Gem::VersionOption

  def initialize
    super "uninstall", "Uninstall gems from the local repository",
          :version => Gem::Requirement.default, :user_install => true,
          :check_dev => false, :vendor => false

    add_option("-a", "--[no-]all",
      "Uninstall all matching versions"
    ) do |value, options|
      options[:all] = value
    end

    add_option("-I", "--[no-]ignore-dependencies",
               "Ignore dependency requirements while",
               "uninstalling") do |value, options|
      options[:ignore] = value
    end

    add_option("-D", "--[no-]check-development",
               "Check development dependencies while uninstalling",
               "(default: false)") do |value, options|
      options[:check_dev] = value
    end

    add_option("-x", "--[no-]executables",
                 "Uninstall applicable executables without",
                 "confirmation") do |value, options|
      options[:executables] = value
    end

    add_option("-i", "--install-dir DIR",
               "Directory to uninstall gem from") do |value, options|
      options[:install_dir] = File.expand_path(value)
    end

    add_option("-n", "--bindir DIR",
               "Directory to remove executables from") do |value, options|
      options[:bin_dir] = File.expand_path(value)
    end

    add_option("--[no-]user-install",
               "Uninstall from user's home directory",
               "in addition to GEM_HOME.") do |value, options|
      options[:user_install] = value
    end

    add_option("--[no-]format-executable",
               "Assume executable names match Ruby's prefix and suffix.") do |value, options|
      options[:format_executable] = value
    end

    add_option("--[no-]force",
               "Uninstall all versions of the named gems",
               "ignoring dependencies") do |value, options|
      options[:force] = value
    end

    add_option("--[no-]abort-on-dependent",
               "Prevent uninstalling gems that are",
               "depended on by other gems.") do |value, options|
      options[:abort_on_dependent] = value
    end

    add_version_option
    add_platform_option

    add_option("--vendor",
               "Uninstall gem from the vendor directory.",
               "Only for use by gem repackagers.") do |value, options|
      unless Gem.vendor_dir
        raise Gem::OptionParser::InvalidOption.new "your platform is not supported"
      end

      alert_warning "Use your OS package manager to uninstall vendor gems"
      options[:vendor] = true
      options[:install_dir] = Gem.vendor_dir
    end
  end

  def arguments # :nodoc:
    "GEMNAME       name of gem to uninstall"
  end

  def defaults_str # :nodoc:
    "--version '#{Gem::Requirement.default}' --no-force " +
      "--user-install"
  end

  def description # :nodoc:
    <<-EOF
The uninstall command removes a previously installed gem.

RubyGems will ask for confirmation if you are attempting to uninstall a gem
that is a dependency of an existing gem.  You can use the
--ignore-dependencies option to skip this check.
    EOF
  end

  def usage # :nodoc:
    "#{program_name} GEMNAME [GEMNAME ...]"
  end

  def check_version # :nodoc:
    if options[:version] != Gem::Requirement.default &&
       get_all_gem_names.size > 1
      alert_error "Can't use --version with multiple gems. You can specify multiple gems with" \
                  " version requirements using `gem uninstall 'my_gem:1.0.0' 'my_other_gem:~>2.0.0'`"
      terminate_interaction 1
    end
  end

  def execute
    check_version

    if options[:all] && !options[:args].empty?
      uninstall_specific
    elsif options[:all]
      uninstall_all
    else
      uninstall_specific
    end
  end

  def uninstall_all
    specs = Gem::Specification.reject {|spec| spec.default_gem? }

    specs.each do |spec|
      options[:version] = spec.version
      uninstall_gem spec.name
    end

    alert "Uninstalled all gems in #{options[:install_dir] || Gem.dir}"
  end

  def uninstall_specific
    deplist = Gem::DependencyList.new
    original_gem_version = {}

    get_all_gem_names_and_versions.each do |name, version|
      original_gem_version[name] = version || options[:version]

      gem_specs = Gem::Specification.find_all_by_name(name, original_gem_version[name])

      say("Gem '#{name}' is not installed") if gem_specs.empty?
      gem_specs.each do |spec|
        deplist.add spec
      end
    end

    deps = deplist.strongly_connected_components.flatten.reverse

    gems_to_uninstall = {}

    deps.each do |dep|
      unless gems_to_uninstall[dep.name]
        gems_to_uninstall[dep.name] = true

        unless original_gem_version[dep.name] == Gem::Requirement.default
          options[:version] = dep.version
        end

        uninstall_gem(dep.name)
      end
    end
  end

  def uninstall_gem(gem_name)
    uninstall(gem_name)
  rescue Gem::GemNotInHomeException => e
    spec = e.spec
    alert("In order to remove #{spec.name}, please execute:\n" +
          "\tgem uninstall #{spec.name} --install-dir=#{spec.installation_path}")
  rescue Gem::UninstallError => e
    spec = e.spec
    alert_error("Error: unable to successfully uninstall '#{spec.name}' which is " +
          "located at '#{spec.full_gem_path}'. This is most likely because" +
          "the current user does not have the appropriate permissions")
    terminate_interaction 1
  end

  def uninstall(gem_name)
    Gem::Uninstaller.new(gem_name, options).uninstall
  end
end
PK}$[	>~�	�	*rubygems/rubygems/commands/rdoc_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../version_option"
require_relative "../rdoc"
require "fileutils"

class Gem::Commands::RdocCommand < Gem::Command
  include Gem::VersionOption

  def initialize
    super "rdoc", "Generates RDoc for pre-installed gems",
          :version => Gem::Requirement.default,
          :include_rdoc => false, :include_ri => true, :overwrite => false

    add_option("--all",
               "Generate RDoc/RI documentation for all",
               "installed gems") do |value, options|
      options[:all] = value
    end

    add_option("--[no-]rdoc",
               "Generate RDoc HTML") do |value, options|
      options[:include_rdoc] = value
    end

    add_option("--[no-]ri",
               "Generate RI data") do |value, options|
      options[:include_ri] = value
    end

    add_option("--[no-]overwrite",
               "Overwrite installed documents") do |value, options|
      options[:overwrite] = value
    end

    add_version_option
  end

  def arguments # :nodoc:
    "GEMNAME       gem to generate documentation for (unless --all)"
  end

  def defaults_str # :nodoc:
    "--version '#{Gem::Requirement.default}' --ri --no-overwrite"
  end

  def description # :nodoc:
    <<-DESC
The rdoc command builds documentation for installed gems.  By default
only documentation is built using rdoc, but additional types of
documentation may be built through rubygems plugins and the
Gem.post_installs hook.

Use --overwrite to force rebuilding of documentation.
    DESC
  end

  def usage # :nodoc:
    "#{program_name} [args]"
  end

  def execute
    specs = if options[:all]
      Gem::Specification.to_a
    else
      get_all_gem_names.map do |name|
        Gem::Specification.find_by_name name, options[:version]
      end.flatten.uniq
    end

    if specs.empty?
      alert_error "No matching gems found"
      terminate_interaction 1
    end

    specs.each do |spec|
      doc = Gem::RDoc.new spec, options[:include_rdoc], options[:include_ri]

      doc.force = options[:overwrite]

      if options[:overwrite]
        FileUtils.rm_rf File.join(spec.doc_dir, "ri")
        FileUtils.rm_rf File.join(spec.doc_dir, "rdoc")
      end

      begin
        doc.generate
      rescue Errno::ENOENT => e
        e.message =~ / - /
        alert_error "Unable to document #{spec.full_name}, #{$'} is missing, skipping"
        terminate_interaction 1 if specs.length == 1
      end
    end
  end
end
PK}$[i����+rubygems/rubygems/commands/build_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../package"
require_relative "../version_option"

class Gem::Commands::BuildCommand < Gem::Command
  include Gem::VersionOption

  def initialize
    super "build", "Build a gem from a gemspec"

    add_platform_option

    add_option "--force", "skip validation of the spec" do |value, options|
      options[:force] = true
    end

    add_option "--strict", "consider warnings as errors when validating the spec" do |value, options|
      options[:strict] = true
    end

    add_option "-o", "--output FILE", "output gem with the given filename" do |value, options|
      options[:output] = value
    end

    add_option "-C PATH", "Run as if gem build was started in <PATH> instead of the current working directory." do |value, options|
      options[:build_path] = value
    end
  end

  def arguments # :nodoc:
    "GEMSPEC_FILE  gemspec file name to build a gem for"
  end

  def description # :nodoc:
    <<-EOF
The build command allows you to create a gem from a ruby gemspec.

The best way to build a gem is to use a Rakefile and the Gem::PackageTask
which ships with RubyGems.

The gemspec can either be created by hand or extracted from an existing gem
with gem spec:

  $ gem unpack my_gem-1.0.gem
  Unpacked gem: '.../my_gem-1.0'
  $ gem spec my_gem-1.0.gem --ruby > my_gem-1.0/my_gem-1.0.gemspec
  $ cd my_gem-1.0
  [edit gem contents]
  $ gem build my_gem-1.0.gemspec

Gems can be saved to a specified filename with the output option:

  $ gem build my_gem-1.0.gemspec --output=release.gem

    EOF
  end

  def usage # :nodoc:
    "#{program_name} GEMSPEC_FILE"
  end

  def execute
    if build_path = options[:build_path]
      Dir.chdir(build_path) { build_gem }
      return
    end

    build_gem
  end

  private

  def find_gemspec(glob = "*.gemspec")
    gemspecs = Dir.glob(glob).sort

    if gemspecs.size > 1
      alert_error "Multiple gemspecs found: #{gemspecs}, please specify one"
      terminate_interaction(1)
    end

    gemspecs.first
  end

  def build_gem
    gemspec = resolve_gem_name

    if gemspec
      build_package(gemspec)
    else
      alert_error error_message
      terminate_interaction(1)
    end
  end

  def build_package(gemspec)
    spec = Gem::Specification.load(gemspec)
    if spec
      Gem::Package.build(
        spec,
        options[:force],
        options[:strict],
        options[:output]
      )
    else
      alert_error "Error loading gemspec. Aborting."
      terminate_interaction 1
    end
  end

  def resolve_gem_name
    return find_gemspec unless gem_name

    if File.exist?(gem_name)
      gem_name
    else
      find_gemspec("#{gem_name}.gemspec") || find_gemspec(gem_name)
    end
  end

  def error_message
    if gem_name
      "Couldn't find a gemspec file matching '#{gem_name}' in #{Dir.pwd}"
    else
      "Couldn't find a gemspec file in #{Dir.pwd}"
    end
  end

  def gem_name
    get_one_optional_argument
  end
end
PK}$[����

+rubygems/rubygems/commands/fetch_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../local_remote_options"
require_relative "../version_option"

class Gem::Commands::FetchCommand < Gem::Command
  include Gem::LocalRemoteOptions
  include Gem::VersionOption

  def initialize
    defaults = {
      :suggest_alternate => true,
      :version           => Gem::Requirement.default,
    }

    super "fetch", "Download a gem and place it in the current directory", defaults

    add_bulk_threshold_option
    add_proxy_option
    add_source_option
    add_clear_sources_option

    add_version_option
    add_platform_option
    add_prerelease_option

    add_option "--[no-]suggestions", "Suggest alternates when gems are not found" do |value, options|
      options[:suggest_alternate] = value
    end
  end

  def arguments # :nodoc:
    "GEMNAME       name of gem to download"
  end

  def defaults_str # :nodoc:
    "--version '#{Gem::Requirement.default}'"
  end

  def description # :nodoc:
    <<-EOF
The fetch command fetches gem files that can be stored for later use or
unpacked to examine their contents.

See the build command help for an example of unpacking a gem, modifying it,
then repackaging it.
    EOF
  end

  def usage # :nodoc:
    "#{program_name} GEMNAME [GEMNAME ...]"
  end

  def check_version # :nodoc:
    if options[:version] != Gem::Requirement.default &&
       get_all_gem_names.size > 1
      alert_error "Can't use --version with multiple gems. You can specify multiple gems with" \
                  " version requirements using `gem fetch 'my_gem:1.0.0' 'my_other_gem:~>2.0.0'`"
      terminate_interaction 1
    end
  end

  def execute
    check_version
    version = options[:version]

    platform  = Gem.platforms.last
    gem_names = get_all_gem_names_and_versions

    gem_names.each do |gem_name, gem_version|
      gem_version ||= version
      dep = Gem::Dependency.new gem_name, gem_version
      dep.prerelease = options[:prerelease]
      suppress_suggestions = !options[:suggest_alternate]

      specs_and_sources, errors =
        Gem::SpecFetcher.fetcher.spec_for_dependency dep

      if platform
        filtered = specs_and_sources.select {|s,| s.platform == platform }
        specs_and_sources = filtered unless filtered.empty?
      end

      spec, source = specs_and_sources.max_by {|s,| s }

      if spec.nil?
        show_lookup_failure gem_name, gem_version, errors, suppress_suggestions, options[:domain]
        next
      end
      source.download spec
      say "Downloaded #{spec.full_name}"
    end
  end
end
PK}$[��ZHH-rubygems/rubygems/commands/install_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../install_update_options"
require_relative "../dependency_installer"
require_relative "../local_remote_options"
require_relative "../validator"
require_relative "../version_option"

##
# Gem installer command line tool
#
# See `gem help install`

class Gem::Commands::InstallCommand < Gem::Command
  attr_reader :installed_specs # :nodoc:

  include Gem::VersionOption
  include Gem::LocalRemoteOptions
  include Gem::InstallUpdateOptions

  def initialize
    defaults = Gem::DependencyInstaller::DEFAULT_OPTIONS.merge({
      :format_executable => false,
      :lock              => true,
      :suggest_alternate => true,
      :version           => Gem::Requirement.default,
      :without_groups    => [],
    })

    defaults.merge!(install_update_options)

    super "install", "Install a gem into the local repository", defaults

    add_install_update_options
    add_local_remote_options
    add_platform_option
    add_version_option
    add_prerelease_option "to be installed. (Only for listed gems)"

    @installed_specs = []
  end

  def arguments # :nodoc:
    "GEMNAME       name of gem to install"
  end

  def defaults_str # :nodoc:
    "--both --version '#{Gem::Requirement.default}' --no-force\n" +
      "--install-dir #{Gem.dir} --lock\n" +
      install_update_defaults_str
  end

  def description # :nodoc:
    <<-EOF
The install command installs local or remote gem into a gem repository.

For gems with executables ruby installs a wrapper file into the executable
directory by default.  This can be overridden with the --no-wrappers option.
The wrapper allows you to choose among alternate gem versions using _version_.

For example `rake _0.7.3_ --version` will run rake version 0.7.3 if a newer
version is also installed.

Gem Dependency Files
====================

RubyGems can install a consistent set of gems across multiple environments
using `gem install -g` when a gem dependencies file (gem.deps.rb, Gemfile or
Isolate) is present.  If no explicit file is given RubyGems attempts to find
one in the current directory.

When the RUBYGEMS_GEMDEPS environment variable is set to a gem dependencies
file the gems from that file will be activated at startup time.  Set it to a
specific filename or to "-" to have RubyGems automatically discover the gem
dependencies file by walking up from the current directory.

NOTE: Enabling automatic discovery on multiuser systems can lead to
execution of arbitrary code when used from directories outside your control.

Extension Install Failures
==========================

If an extension fails to compile during gem installation the gem
specification is not written out, but the gem remains unpacked in the
repository.  You may need to specify the path to the library's headers and
libraries to continue.  You can do this by adding a -- between RubyGems'
options and the extension's build options:

  $ gem install some_extension_gem
  [build fails]
  Gem files will remain installed in \\
  /path/to/gems/some_extension_gem-1.0 for inspection.
  Results logged to /path/to/gems/some_extension_gem-1.0/gem_make.out
  $ gem install some_extension_gem -- --with-extension-lib=/path/to/lib
  [build succeeds]
  $ gem list some_extension_gem

  *** LOCAL GEMS ***

  some_extension_gem (1.0)
  $

If you correct the compilation errors by editing the gem files you will need
to write the specification by hand.  For example:

  $ gem install some_extension_gem
  [build fails]
  Gem files will remain installed in \\
  /path/to/gems/some_extension_gem-1.0 for inspection.
  Results logged to /path/to/gems/some_extension_gem-1.0/gem_make.out
  $ [cd /path/to/gems/some_extension_gem-1.0]
  $ [edit files or what-have-you and run make]
  $ gem spec ../../cache/some_extension_gem-1.0.gem --ruby > \\
             ../../specifications/some_extension_gem-1.0.gemspec
  $ gem list some_extension_gem

  *** LOCAL GEMS ***

  some_extension_gem (1.0)
  $

Command Alias
==========================

You can use `i` command instead of `install`.

  $ gem i GEMNAME

    EOF
  end

  def usage # :nodoc:
    "#{program_name} [options] GEMNAME [GEMNAME ...] -- --build-flags"
  end

  def check_install_dir # :nodoc:
    if options[:install_dir] && options[:user_install]
      alert_error "Use --install-dir or --user-install but not both"
      terminate_interaction 1
    end
  end

  def check_version # :nodoc:
    if options[:version] != Gem::Requirement.default &&
       get_all_gem_names.size > 1
      alert_error "Can't use --version with multiple gems. You can specify multiple gems with" \
                  " version requirements using `gem install 'my_gem:1.0.0' 'my_other_gem:~>2.0.0'`"
      terminate_interaction 1
    end
  end

  def execute
    if options.include? :gemdeps
      install_from_gemdeps
      return # not reached
    end

    @installed_specs = []

    ENV.delete "GEM_PATH" if options[:install_dir].nil?

    check_install_dir
    check_version

    load_hooks

    exit_code = install_gems

    show_installed

    terminate_interaction exit_code
  end

  def install_from_gemdeps # :nodoc:
    require_relative "../request_set"
    rs = Gem::RequestSet.new

    specs = rs.install_from_gemdeps options do |req, inst|
      s = req.full_spec

      if inst
        say "Installing #{s.name} (#{s.version})"
      else
        say "Using #{s.name} (#{s.version})"
      end
    end

    @installed_specs = specs

    terminate_interaction
  end

  def install_gem(name, version) # :nodoc:
    return if options[:conservative] &&
              !Gem::Dependency.new(name, version).matching_specs.empty?

    req = Gem::Requirement.create(version)

    dinst = Gem::DependencyInstaller.new options

    request_set = dinst.resolve_dependencies name, req

    if options[:explain]
      say "Gems to install:"

      request_set.sorted_requests.each do |activation_request|
        say "  #{activation_request.full_name}"
      end
    else
      @installed_specs.concat request_set.install options
    end

    show_install_errors dinst.errors
  end

  def install_gems # :nodoc:
    exit_code = 0

    get_all_gem_names_and_versions.each do |gem_name, gem_version|
      gem_version ||= options[:version]
      domain = options[:domain]
      domain = :local unless options[:suggest_alternate]
      suppress_suggestions = (domain == :local)

      begin
        install_gem gem_name, gem_version
      rescue Gem::InstallError => e
        alert_error "Error installing #{gem_name}:\n\t#{e.message}"
        exit_code |= 1
      rescue Gem::GemNotFoundException => e
        show_lookup_failure e.name, e.version, e.errors, suppress_suggestions

        exit_code |= 2
      rescue Gem::UnsatisfiableDependencyError => e
        show_lookup_failure e.name, e.version, e.errors, suppress_suggestions,
                            "'#{gem_name}' (#{gem_version})"

        exit_code |= 2
      end
    end

    exit_code
  end

  ##
  # Loads post-install hooks

  def load_hooks # :nodoc:
    if options[:install_as_default]
      require_relative "../install_default_message"
    else
      require_relative "../install_message"
    end
    require_relative "../rdoc"
  end

  def show_install_errors(errors) # :nodoc:
    return unless errors

    errors.each do |x|
      return unless Gem::SourceFetchProblem === x

      require_relative "../uri"
      msg = "Unable to pull data from '#{Gem::Uri.redact(x.source.uri)}': #{x.error.message}"

      alert_warning msg
    end
  end

  def show_installed # :nodoc:
    return if @installed_specs.empty?

    gems = @installed_specs.length == 1 ? "gem" : "gems"
    say "#{@installed_specs.length} #{gems} installed"
  end
end
PK}$[d*(�<<.rubygems/rubygems/commands/contents_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../version_option"

class Gem::Commands::ContentsCommand < Gem::Command
  include Gem::VersionOption

  def initialize
    super "contents", "Display the contents of the installed gems",
          :specdirs => [], :lib_only => false, :prefix => true,
          :show_install_dir => false

    add_version_option

    add_option("--all",
               "Contents for all gems") do |all, options|
      options[:all] = all
    end

    add_option("-s", "--spec-dir a,b,c", Array,
               "Search for gems under specific paths") do |spec_dirs, options|
      options[:specdirs] = spec_dirs
    end

    add_option("-l", "--[no-]lib-only",
               "Only return files in the Gem's lib_dirs") do |lib_only, options|
      options[:lib_only] = lib_only
    end

    add_option("--[no-]prefix",
               "Don't include installed path prefix") do |prefix, options|
      options[:prefix] = prefix
    end

    add_option("--[no-]show-install-dir",
               "Show only the gem install dir") do |show, options|
      options[:show_install_dir] = show
    end

    @path_kind = nil
    @spec_dirs = nil
    @version   = nil
  end

  def arguments # :nodoc:
    "GEMNAME       name of gem to list contents for"
  end

  def defaults_str # :nodoc:
    "--no-lib-only --prefix"
  end

  def description # :nodoc:
    <<-EOF
The contents command lists the files in an installed gem.  The listing can
be given as full file names, file names without the installed directory
prefix or only the files that are requireable.
    EOF
  end

  def usage # :nodoc:
    "#{program_name} GEMNAME [GEMNAME ...]"
  end

  def execute
    @version   = options[:version] || Gem::Requirement.default
    @spec_dirs = specification_directories
    @path_kind = path_description @spec_dirs

    names = gem_names

    names.each do |name|
      found =
        if options[:show_install_dir]
          gem_install_dir name
        else
          gem_contents name
        end

      terminate_interaction 1 unless found || names.length > 1
    end
  end

  def files_in(spec)
    if spec.default_gem?
      files_in_default_gem spec
    else
      files_in_gem spec
    end
  end

  def files_in_gem(spec)
    gem_path  = spec.full_gem_path
    extra     = "/{#{spec.require_paths.join ','}}" if options[:lib_only]
    glob      = "#{gem_path}#{extra}/**/*"
    prefix_re = /#{Regexp.escape(gem_path)}\//

    Dir[glob].map do |file|
      [gem_path, file.sub(prefix_re, "")]
    end
  end

  def files_in_default_gem(spec)
    spec.files.map do |file|
      case file
      when /\A#{spec.bindir}\//
        # $' is POSTMATCH
        [RbConfig::CONFIG["bindir"], $']
      when /\.so\z/
        [RbConfig::CONFIG["archdir"], file]
      else
        [RbConfig::CONFIG["rubylibdir"], file]
      end
    end
  end

  def gem_contents(name)
    spec = spec_for name

    return false unless spec

    files = files_in spec

    show_files files

    true
  end

  def gem_install_dir(name)
    spec = spec_for name

    return false unless spec

    say spec.gem_dir

    true
  end

  def gem_names # :nodoc:
    if options[:all]
      Gem::Specification.map(&:name)
    else
      get_all_gem_names
    end
  end

  def path_description(spec_dirs) # :nodoc:
    if spec_dirs.empty?
      "default gem paths"
    else
      "specified path"
    end
  end

  def show_files(files)
    files.sort.each do |prefix, basename|
      absolute_path = File.join(prefix, basename)
      next if File.directory? absolute_path

      if options[:prefix]
        say absolute_path
      else
        say basename
      end
    end
  end

  def spec_for(name)
    spec = Gem::Specification.find_all_by_name(name, @version).first

    return spec if spec

    say "Unable to find gem '#{name}' in #{@path_kind}"

    if Gem.configuration.verbose
      say "\nDirectories searched:"
      @spec_dirs.sort.each {|dir| say dir }
    end

    return nil
  end

  def specification_directories # :nodoc:
    options[:specdirs].map do |i|
      [i, File.join(i, "specifications")]
    end.flatten
  end
end
PK}$[���]]-rubygems/rubygems/commands/cleanup_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../dependency_list"
require_relative "../uninstaller"

class Gem::Commands::CleanupCommand < Gem::Command
  def initialize
    super "cleanup",
          "Clean up old versions of installed gems",
          :force => false, :install_dir => Gem.dir,
          :check_dev => true

    add_option("-n", "-d", "--dry-run",
               "Do not uninstall gems") do |value, options|
      options[:dryrun] = true
    end

    add_option(:Deprecated, "--dryrun",
               "Do not uninstall gems") do |value, options|
      options[:dryrun] = true
    end
    deprecate_option("--dryrun", extra_msg: "Use --dry-run instead")

    add_option("-D", "--[no-]check-development",
               "Check development dependencies while uninstalling",
               "(default: true)") do |value, options|
      options[:check_dev] = value
    end

    add_option("--[no-]user-install",
               "Cleanup in user's home directory instead",
               "of GEM_HOME.") do |value, options|
      options[:user_install] = value
    end

    @candidate_gems  = nil
    @default_gems    = []
    @full            = nil
    @gems_to_cleanup = nil
    @original_home   = nil
    @original_path   = nil
    @primary_gems    = nil
  end

  def arguments # :nodoc:
    "GEMNAME       name of gem to cleanup"
  end

  def defaults_str # :nodoc:
    "--no-dry-run"
  end

  def description # :nodoc:
    <<-EOF
The cleanup command removes old versions of gems from GEM_HOME that are not
required to meet a dependency.  If a gem is installed elsewhere in GEM_PATH
the cleanup command won't delete it.

If no gems are named all gems in GEM_HOME are cleaned.
    EOF
  end

  def usage # :nodoc:
    "#{program_name} [GEMNAME ...]"
  end

  def execute
    say "Cleaning up installed gems..."

    if options[:args].empty?
      done     = false
      last_set = nil

      until done do
        clean_gems

        this_set = @gems_to_cleanup.map {|spec| spec.full_name }.sort

        done = this_set.empty? || last_set == this_set

        last_set = this_set
      end
    else
      clean_gems
    end

    say "Clean up complete"

    verbose do
      skipped = @default_gems.map {|spec| spec.full_name }

      "Skipped default gems: #{skipped.join ', '}"
    end
  end

  def clean_gems
    @original_home = Gem.dir
    @original_path = Gem.path

    get_primary_gems
    get_candidate_gems
    get_gems_to_cleanup

    @full = Gem::DependencyList.from_specs

    deplist = Gem::DependencyList.new
    @gems_to_cleanup.each {|spec| deplist.add spec }

    deps = deplist.strongly_connected_components.flatten

    deps.reverse_each do |spec|
      uninstall_dep spec
    end

    Gem::Specification.reset
  end

  def get_candidate_gems
    @candidate_gems = unless options[:args].empty?
      options[:args].map do |gem_name|
        Gem::Specification.find_all_by_name gem_name
      end.flatten
    else
      Gem::Specification.to_a
    end
  end

  def get_gems_to_cleanup
    gems_to_cleanup = @candidate_gems.select do |spec|
      @primary_gems[spec.name].version != spec.version
    end

    default_gems, gems_to_cleanup = gems_to_cleanup.partition do |spec|
      spec.default_gem?
    end

    uninstall_from = options[:user_install] ? Gem.user_dir : @original_home

    gems_to_cleanup = gems_to_cleanup.select do |spec|
      spec.base_dir == uninstall_from
    end

    @default_gems += default_gems
    @default_gems.uniq!
    @gems_to_cleanup = gems_to_cleanup.uniq
  end

  def get_primary_gems
    @primary_gems = {}

    Gem::Specification.each do |spec|
      if @primary_gems[spec.name].nil? ||
         @primary_gems[spec.name].version < spec.version
        @primary_gems[spec.name] = spec
      end
    end
  end

  def uninstall_dep(spec)
    return unless @full.ok_to_remove?(spec.full_name, options[:check_dev])

    if options[:dryrun]
      say "Dry Run Mode: Would uninstall #{spec.full_name}"
      return
    end

    say "Attempting to uninstall #{spec.full_name}"

    uninstall_options = {
      :executables => false,
      :version => "= #{spec.version}",
    }

    uninstall_options[:user_install] = Gem.user_dir == spec.base_dir

    uninstaller = Gem::Uninstaller.new spec.name, uninstall_options

    begin
      uninstaller.uninstall
    rescue Gem::DependencyRemovalException, Gem::InstallError,
           Gem::GemNotInHomeException, Gem::FilePermissionError => e
      say "Unable to uninstall #{spec.full_name}:"
      say "\t#{e.class}: #{e.message}"
    end
  ensure
    # Restore path Gem::Uninstaller may have changed
    Gem.use_paths @original_home, *@original_path
  end
end
PK}$[Eo�$�$*rubygems/rubygems/commands/cert_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../security"

class Gem::Commands::CertCommand < Gem::Command
  def initialize
    super "cert", "Manage RubyGems certificates and signing settings",
          :add => [], :remove => [], :list => [], :build => [], :sign => []

    add_option("-a", "--add CERT",
               "Add a trusted certificate.") do |cert_file, options|
      options[:add] << open_cert(cert_file)
    end

    add_option("-l", "--list [FILTER]",
               "List trusted certificates where the",
               "subject contains FILTER") do |filter, options|
      filter ||= ""

      options[:list] << filter
    end

    add_option("-r", "--remove FILTER",
               "Remove trusted certificates where the",
               "subject contains FILTER") do |filter, options|
      options[:remove] << filter
    end

    add_option("-b", "--build EMAIL_ADDR",
               "Build private key and self-signed",
               "certificate for EMAIL_ADDR") do |email_address, options|
      options[:build] << email_address
    end

    add_option("-C", "--certificate CERT",
               "Signing certificate for --sign") do |cert_file, options|
      options[:issuer_cert] = open_cert(cert_file)
      options[:issuer_cert_file] = cert_file
    end

    add_option("-K", "--private-key KEY",
               "Key for --sign or --build") do |key_file, options|
      options[:key] = open_private_key(key_file)
    end

    add_option("-A", "--key-algorithm ALGORITHM",
               "Select which key algorithm to use for --build") do |algorithm, options|
      options[:key_algorithm] = algorithm
    end

    add_option("-s", "--sign CERT",
               "Signs CERT with the key from -K",
               "and the certificate from -C") do |cert_file, options|
      raise Gem::OptionParser::InvalidArgument, "#{cert_file}: does not exist" unless
        File.file? cert_file

      options[:sign] << cert_file
    end

    add_option("-d", "--days NUMBER_OF_DAYS",
               "Days before the certificate expires") do |days, options|
      options[:expiration_length_days] = days.to_i
    end

    add_option("-R", "--re-sign",
               "Re-signs the certificate from -C with the key from -K") do |resign, options|
      options[:resign] = resign
    end
  end

  def add_certificate(certificate) # :nodoc:
    Gem::Security.trust_dir.trust_cert certificate

    say "Added '#{certificate.subject}'"
  end

  def check_openssl
    return if Gem::HAVE_OPENSSL

    alert_error "OpenSSL library is required for the cert command"
    terminate_interaction 1
  end

  def open_cert(certificate_file)
    check_openssl
    OpenSSL::X509::Certificate.new File.read certificate_file
  rescue Errno::ENOENT
    raise Gem::OptionParser::InvalidArgument, "#{certificate_file}: does not exist"
  rescue OpenSSL::X509::CertificateError
    raise Gem::OptionParser::InvalidArgument,
      "#{certificate_file}: invalid X509 certificate"
  end

  def open_private_key(key_file)
    check_openssl
    passphrase = ENV["GEM_PRIVATE_KEY_PASSPHRASE"]
    key = OpenSSL::PKey.read File.read(key_file), passphrase
    raise Gem::OptionParser::InvalidArgument,
      "#{key_file}: private key not found" unless key.private?
    key
  rescue Errno::ENOENT
    raise Gem::OptionParser::InvalidArgument, "#{key_file}: does not exist"
  rescue OpenSSL::PKey::PKeyError, ArgumentError
    raise Gem::OptionParser::InvalidArgument, "#{key_file}: invalid RSA, DSA, or EC key"
  end

  def execute
    check_openssl

    options[:add].each do |certificate|
      add_certificate certificate
    end

    options[:remove].each do |filter|
      remove_certificates_matching filter
    end

    options[:list].each do |filter|
      list_certificates_matching filter
    end

    options[:build].each do |email|
      build email
    end

    if options[:resign]
      re_sign_cert(
        options[:issuer_cert],
        options[:issuer_cert_file],
        options[:key]
      )
    end

    sign_certificates unless options[:sign].empty?
  end

  def build(email)
    if !valid_email?(email)
      raise Gem::CommandLineError, "Invalid email address #{email}"
    end

    key, key_path = build_key
    cert_path = build_cert email, key

    say "Certificate: #{cert_path}"

    if key_path
      say "Private Key: #{key_path}"
      say "Don't forget to move the key file to somewhere private!"
    end
  end

  def build_cert(email, key) # :nodoc:
    expiration_length_days = options[:expiration_length_days] ||
                             Gem.configuration.cert_expiration_length_days

    cert = Gem::Security.create_cert_email(
      email,
      key,
      (Gem::Security::ONE_DAY * expiration_length_days)
    )

    Gem::Security.write cert, "gem-public_cert.pem"
  end

  def build_key # :nodoc:
    return options[:key] if options[:key]

    passphrase = ask_for_password "Passphrase for your Private Key:"
    say "\n"

    passphrase_confirmation = ask_for_password "Please repeat the passphrase for your Private Key:"
    say "\n"

    raise Gem::CommandLineError,
          "Passphrase and passphrase confirmation don't match" unless passphrase == passphrase_confirmation

    algorithm = options[:key_algorithm] || Gem::Security::DEFAULT_KEY_ALGORITHM
    key = Gem::Security.create_key(algorithm)
    key_path = Gem::Security.write key, "gem-private_key.pem", 0600, passphrase

    return key, key_path
  end

  def certificates_matching(filter)
    return enum_for __method__, filter unless block_given?

    Gem::Security.trusted_certificates.select do |certificate, _|
      subject = certificate.subject.to_s
      subject.downcase.index filter
    end.sort_by do |certificate, _|
      certificate.subject.to_a.map {|name, data,| [name, data] }
    end.each do |certificate, path|
      yield certificate, path
    end
  end

  def description # :nodoc:
    <<-EOF
The cert command manages signing keys and certificates for creating signed
gems.  Your signing certificate and private key are typically stored in
~/.gem/gem-public_cert.pem and ~/.gem/gem-private_key.pem respectively.

To build a certificate for signing gems:

  gem cert --build you@example

If you already have an RSA key, or are creating a new certificate for an
existing key:

  gem cert --build you@example --private-key /path/to/key.pem

If you wish to trust a certificate you can add it to the trust list with:

  gem cert --add /path/to/cert.pem

You can list trusted certificates with:

  gem cert --list

or:

  gem cert --list cert_subject_substring

If you wish to remove a previously trusted certificate:

  gem cert --remove cert_subject_substring

To sign another gem author's certificate:

  gem cert --sign /path/to/other_cert.pem

For further reading on signing gems see `ri Gem::Security`.
    EOF
  end

  def list_certificates_matching(filter) # :nodoc:
    certificates_matching filter do |certificate, _|
      # this could probably be formatted more gracefully
      say certificate.subject.to_s
    end
  end

  def load_default_cert
    cert_file = File.join Gem.default_cert_path
    cert = File.read cert_file
    options[:issuer_cert] = OpenSSL::X509::Certificate.new cert
  rescue Errno::ENOENT
    alert_error \
      "--certificate not specified and ~/.gem/gem-public_cert.pem does not exist"

    terminate_interaction 1
  rescue OpenSSL::X509::CertificateError
    alert_error \
      "--certificate not specified and ~/.gem/gem-public_cert.pem is not valid"

    terminate_interaction 1
  end

  def load_default_key
    key_file = File.join Gem.default_key_path
    key = File.read key_file
    passphrase = ENV["GEM_PRIVATE_KEY_PASSPHRASE"]
    options[:key] = OpenSSL::PKey.read key, passphrase

  rescue Errno::ENOENT
    alert_error \
      "--private-key not specified and ~/.gem/gem-private_key.pem does not exist"

    terminate_interaction 1
  rescue OpenSSL::PKey::PKeyError
    alert_error \
      "--private-key not specified and ~/.gem/gem-private_key.pem is not valid"

    terminate_interaction 1
  end

  def load_defaults # :nodoc:
    load_default_cert unless options[:issuer_cert]
    load_default_key  unless options[:key]
  end

  def remove_certificates_matching(filter) # :nodoc:
    certificates_matching filter do |certificate, path|
      FileUtils.rm path
      say "Removed '#{certificate.subject}'"
    end
  end

  def sign(cert_file)
    cert = File.read cert_file
    cert = OpenSSL::X509::Certificate.new cert

    permissions = File.stat(cert_file).mode & 0777

    issuer_cert = options[:issuer_cert]
    issuer_key = options[:key]

    cert = Gem::Security.sign cert, issuer_key, issuer_cert

    Gem::Security.write cert, cert_file, permissions
  end

  def sign_certificates # :nodoc:
    load_defaults unless options[:sign].empty?

    options[:sign].each do |cert_file|
      sign cert_file
    end
  end

  def re_sign_cert(cert, cert_path, private_key)
    Gem::Security::Signer.re_sign_cert(cert, cert_path, private_key) do |expired_cert_path, new_expired_cert_path|
      alert("Your certificate #{expired_cert_path} has been re-signed")
      alert("Your expired certificate will be located at: #{new_expired_cert_path}")
    end
  end

  private

  def valid_email?(email)
    # It's simple, but is all we need
    email =~ /\A.+@.+\z/
  end
end
PK}$[(%%�(�(*rubygems/rubygems/commands/help_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"

class Gem::Commands::HelpCommand < Gem::Command
  # :stopdoc:
  EXAMPLES = <<-EOF.freeze
Some examples of 'gem' usage.

* Install 'rake', either from local directory or remote server:

    gem install rake

* Install 'rake', only from remote server:

    gem install rake --remote

* Install 'rake', but only version 0.3.1, even if dependencies
  are not met, and into a user-specific directory:

    gem install rake --version 0.3.1 --force --user-install

* List local gems whose name begins with 'D':

    gem list D

* List local and remote gems whose name contains 'log':

    gem search log --both

* List only remote gems whose name contains 'log':

    gem search log --remote

* Uninstall 'rake':

    gem uninstall rake

* Create a gem:

    See https://guides.rubygems.org/make-your-own-gem/

* See information about RubyGems:

    gem environment

* Update all gems on your system:

    gem update

* Update your local version of RubyGems

    gem update --system
  EOF

  GEM_DEPENDENCIES = <<-EOF.freeze
A gem dependencies file allows installation of a consistent set of gems across
multiple environments.  The RubyGems implementation is designed to be
compatible with Bundler's Gemfile format.  You can see additional
documentation on the format at:

  http://bundler.io

RubyGems automatically looks for these gem dependencies files:

* gem.deps.rb
* Gemfile
* Isolate

These files are looked up automatically using `gem install -g`, or you can
specify a custom file.

When the RUBYGEMS_GEMDEPS environment variable is set to a gem dependencies
file the gems from that file will be activated at startup time.  Set it to a
specific filename or to "-" to have RubyGems automatically discover the gem
dependencies file by walking up from the current directory.

You can also activate gem dependencies at program startup using
Gem.use_gemdeps.

NOTE: Enabling automatic discovery on multiuser systems can lead to execution
of arbitrary code when used from directories outside your control.

Gem Dependencies
================

Use #gem to declare which gems you directly depend upon:

  gem 'rake'

To depend on a specific set of versions:

  gem 'rake', '~> 10.3', '>= 10.3.2'

RubyGems will require the gem name when activating the gem using
the RUBYGEMS_GEMDEPS environment variable or Gem::use_gemdeps.  Use the
require: option to override this behavior if the gem does not have a file of
that name or you don't want to require those files:

  gem 'my_gem', require: 'other_file'

To prevent RubyGems from requiring any files use:

  gem 'my_gem', require: false

To load dependencies from a .gemspec file:

  gemspec

RubyGems looks for the first .gemspec file in the current directory.  To
override this use the name: option:

  gemspec name: 'specific_gem'

To look in a different directory use the path: option:

  gemspec name: 'specific_gem', path: 'gemspecs'

To depend on a gem unpacked into a local directory:

  gem 'modified_gem', path: 'vendor/modified_gem'

To depend on a gem from git:

  gem 'private_gem', git: 'git@my.company.example:private_gem.git'

To depend on a gem from github:

  gem 'private_gem', github: 'my_company/private_gem'

To depend on a gem from a github gist:

  gem 'bang', gist: '1232884'

Git, github and gist support the ref:, branch: and tag: options to specify a
commit reference or hash, branch or tag respectively to use for the gem.

Setting the submodules: option to true for git, github and gist dependencies
causes fetching of submodules when fetching the repository.

You can depend on multiple gems from a single repository with the git method:

  git 'https://github.com/rails/rails.git' do
    gem 'activesupport'
    gem 'activerecord'
  end

Gem Sources
===========

RubyGems uses the default sources for regular `gem install` for gem
dependencies files.  Unlike bundler, you do need to specify a source.

You can override the sources used for downloading gems with:

  source 'https://gem_server.example'

You may specify multiple sources.  Unlike bundler the prepend: option is not
supported. Sources are used in-order, to prepend a source place it at the
front of the list.

Gem Platform
============

You can restrict gem dependencies to specific platforms with the #platform
and #platforms methods:

  platform :ruby_21 do
    gem 'debugger'
  end

See the bundler Gemfile manual page for a list of platforms supported in a gem
dependencies file.:

  http://bundler.io/v1.6/man/gemfile.5.html

Ruby Version and Engine Dependency
==================================

You can specify the version, engine and engine version of ruby to use with
your gem dependencies file.  If you are not running the specified version
RubyGems will raise an exception.

To depend on a specific version of ruby:

  ruby '2.1.2'

To depend on a specific ruby engine:

  ruby '1.9.3', engine: 'jruby'

To depend on a specific ruby engine version:

  ruby '1.9.3', engine: 'jruby', engine_version: '1.7.11'

Grouping Dependencies
=====================

Gem dependencies may be placed in groups that can be excluded from install.
Dependencies required for development or testing of your code may be excluded
when installed in a production environment.

A #gem dependency may be placed in a group using the group: option:

  gem 'minitest', group: :test

To install dependencies from a gemfile without specific groups use the
`--without` option for `gem install -g`:

  $ gem install -g --without test

The group: option also accepts multiple groups if the gem fits in multiple
categories.

Multiple groups may be excluded during install by comma-separating the groups for `--without` or by specifying `--without` multiple times.

The #group method can also be used to place gems in groups:

  group :test do
    gem 'minitest'
    gem 'minitest-emoji'
  end

The #group method allows multiple groups.

The #gemspec development dependencies are placed in the :development group by
default.  This may be overridden with the :development_group option:

  gemspec development_group: :other

  EOF

  PLATFORMS = <<-'EOF'.freeze
RubyGems platforms are composed of three parts, a CPU, an OS, and a
version.  These values are taken from values in rbconfig.rb.  You can view
your current platform by running `gem environment`.

RubyGems matches platforms as follows:

  * The CPU must match exactly unless one of the platforms has
    "universal" as the CPU or the local CPU starts with "arm" and the gem's
    CPU is exactly "arm" (for gems that support generic ARM architecture).
  * The OS must match exactly.
  * The versions must match exactly unless one of the versions is nil.

For commands that install, uninstall and list gems, you can override what
RubyGems thinks your platform is with the --platform option.  The platform
you pass must match "#{cpu}-#{os}" or "#{cpu}-#{os}-#{version}".  On mswin
platforms, the version is the compiler version, not the OS version.  (Ruby
compiled with VC6 uses "60" as the compiler version, VC8 uses "80".)

For the ARM architecture, gems with a platform of "arm-linux" should run on a
reasonable set of ARM CPUs and not depend on instructions present on a limited
subset of the architecture.  For example, the binary should run on platforms
armv5, armv6hf, armv6l, armv7, etc.  If you use the "arm-linux" platform
please test your gem on a variety of ARM hardware before release to ensure it
functions correctly.

Example platforms:

  x86-freebsd        # Any FreeBSD version on an x86 CPU
  universal-darwin-8 # Darwin 8 only gems that run on any CPU
  x86-mswin32-80     # Windows gems compiled with VC8
  armv7-linux        # Gem complied for an ARMv7 CPU running linux
  arm-linux          # Gem compiled for any ARM CPU running linux

When building platform gems, set the platform in the gem specification to
Gem::Platform::CURRENT.  This will correctly mark the gem with your ruby's
platform.
  EOF

  # NOTE when updating also update Gem::Command::HELP

  SUBCOMMANDS = [
    ["commands",         :show_commands],
    ["options",          Gem::Command::HELP],
    ["examples",         EXAMPLES],
    ["gem_dependencies", GEM_DEPENDENCIES],
    ["platforms",        PLATFORMS],
  ].freeze
  # :startdoc:

  def initialize
    super "help", "Provide help on the 'gem' command"

    @command_manager = Gem::CommandManager.instance
  end

  def usage # :nodoc:
    "#{program_name} ARGUMENT"
  end

  def execute
    arg = options[:args][0]

    _, help = SUBCOMMANDS.find do |command,|
      begins? command, arg
    end

    if help
      if Symbol === help
        send help
      else
        say help
      end
      return
    end

    if options[:help]
      show_help

    elsif arg
      show_command_help arg

    else
      say Gem::Command::HELP
    end
  end

  def show_commands # :nodoc:
    out = []
    out << "GEM commands are:"
    out << nil

    margin_width = 4

    desc_width = @command_manager.command_names.map {|n| n.size }.max + 4

    summary_width = 80 - margin_width - desc_width
    wrap_indent = " " * (margin_width + desc_width)
    format = "#{' ' * margin_width}%-#{desc_width}s%s"

    @command_manager.command_names.each do |cmd_name|
      command = @command_manager[cmd_name]

      next if command.deprecated?

      summary =
        if command
          command.summary
        else
          "[No command found for #{cmd_name}]"
        end

      summary = wrap(summary, summary_width).split "\n"
      out << sprintf(format, cmd_name, summary.shift)
      until summary.empty? do
        out << "#{wrap_indent}#{summary.shift}"
      end
    end

    out << nil
    out << "For help on a particular command, use 'gem help COMMAND'."
    out << nil
    out << "Commands may be abbreviated, so long as they are unambiguous."
    out << "e.g. 'gem i rake' is short for 'gem install rake'."

    say out.join("\n")
  end

  def show_command_help(command_name) # :nodoc:
    command_name = command_name.downcase

    possibilities = @command_manager.find_command_possibilities command_name

    if possibilities.size == 1
      command = @command_manager[possibilities.first]
      command.invoke("--help")
    elsif possibilities.size > 1
      alert_warning "Ambiguous command #{command_name} (#{possibilities.join(', ')})"
    else
      alert_warning "Unknown command #{command_name}. Try: gem help commands"
    end
  end
end
PK}$[�	8��0rubygems/rubygems/commands/dependency_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../local_remote_options"
require_relative "../version_option"

class Gem::Commands::DependencyCommand < Gem::Command
  include Gem::LocalRemoteOptions
  include Gem::VersionOption

  def initialize
    super "dependency",
          "Show the dependencies of an installed gem",
          :version => Gem::Requirement.default, :domain => :local

    add_version_option
    add_platform_option
    add_prerelease_option

    add_option("-R", "--[no-]reverse-dependencies",
               "Include reverse dependencies in the output") do
      |value, options|
      options[:reverse_dependencies] = value
    end

    add_option("-p", "--pipe",
               "Pipe Format (name --version ver)") do |value, options|
      options[:pipe_format] = value
    end

    add_local_remote_options
  end

  def arguments # :nodoc:
    "REGEXP        show dependencies for gems whose names start with REGEXP"
  end

  def defaults_str # :nodoc:
    "--local --version '#{Gem::Requirement.default}' --no-reverse-dependencies"
  end

  def description # :nodoc:
    <<-EOF
The dependency commands lists which other gems a given gem depends on.  For
local gems only the reverse dependencies can be shown (which gems depend on
the named gem).

The dependency list can be displayed in a format suitable for piping for
use with other commands.
    EOF
  end

  def usage # :nodoc:
    "#{program_name} REGEXP"
  end

  def fetch_remote_specs(name, requirement, prerelease) # :nodoc:
    fetcher = Gem::SpecFetcher.fetcher

    specs_type = prerelease ? :complete : :released

    ss = if name.nil?
      fetcher.detect(specs_type) { true }
    else
      fetcher.detect(specs_type) do |name_tuple|
        name === name_tuple.name && requirement.satisfied_by?(name_tuple.version)
      end
    end

    ss.map {|tuple, source| source.fetch_spec(tuple) }
  end

  def fetch_specs(name_pattern, requirement, prerelease) # :nodoc:
    specs = []

    if local?
      specs.concat Gem::Specification.stubs.find_all {|spec|
        name_matches = name_pattern ? name_pattern =~ spec.name : true
        version_matches = requirement.satisfied_by?(spec.version)

        name_matches && version_matches
      }.map(&:to_spec)
    end

    specs.concat fetch_remote_specs name_pattern, requirement, prerelease if remote?

    ensure_specs specs

    specs.uniq.sort
  end

  def display_pipe(specs) # :nodoc:
    specs.each do |spec|
      unless spec.dependencies.empty?
        spec.dependencies.sort_by {|dep| dep.name }.each do |dep|
          say "#{dep.name} --version '#{dep.requirement}'"
        end
      end
    end
  end

  def display_readable(specs, reverse) # :nodoc:
    response = String.new

    specs.each do |spec|
      response << print_dependencies(spec)
      unless reverse[spec.full_name].empty?
        response << "  Used by\n"
        reverse[spec.full_name].each do |sp, dep|
          response << "    #{sp} (#{dep})\n"
        end
      end
      response << "\n"
    end

    say response
  end

  def execute
    ensure_local_only_reverse_dependencies

    pattern = name_pattern options[:args]
    requirement = Gem::Requirement.new options[:version]

    specs = fetch_specs pattern, requirement, options[:prerelease]

    reverse = reverse_dependencies specs

    if options[:pipe_format]
      display_pipe specs
    else
      display_readable specs, reverse
    end
  end

  def ensure_local_only_reverse_dependencies # :nodoc:
    if options[:reverse_dependencies] && remote? && !local?
      alert_error "Only reverse dependencies for local gems are supported."
      terminate_interaction 1
    end
  end

  def ensure_specs(specs) # :nodoc:
    return unless specs.empty?

    patterns = options[:args].join ","
    say "No gems found matching #{patterns} (#{options[:version]})" if
      Gem.configuration.verbose

    terminate_interaction 1
  end

  def print_dependencies(spec, level = 0) # :nodoc:
    response = String.new
    response << "  " * level + "Gem #{spec.full_name}\n"
    unless spec.dependencies.empty?
      spec.dependencies.sort_by {|dep| dep.name }.each do |dep|
        response << "  " * level + "  #{dep}\n"
      end
    end
    response
  end

  def reverse_dependencies(specs) # :nodoc:
    reverse = Hash.new {|h, k| h[k] = [] }

    return reverse unless options[:reverse_dependencies]

    specs.each do |spec|
      reverse[spec.full_name] = find_reverse_dependencies spec
    end

    reverse
  end

  ##
  # Returns an Array of [specification, dep] that are satisfied by +spec+.

  def find_reverse_dependencies(spec) # :nodoc:
    result = []

    Gem::Specification.each do |sp|
      sp.dependencies.each do |dep|
        dep = Gem::Dependency.new(*dep) unless Gem::Dependency === dep

        if spec.name == dep.name &&
           dep.requirement.satisfied_by?(spec.version)
          result << [sp.full_name, dep]
        end
      end
    end

    result
  end

  private

  def name_pattern(args)
    return if args.empty?

    if args.length == 1 && args.first =~ /\A(.*)(i)?\z/m
      flags = $2 ? Regexp::IGNORECASE : nil
      Regexp.new $1, flags
    else
      /\A#{Regexp.union(*args)}/
    end
  end
end
PK}$[�Jz���.rubygems/rubygems/commands/pristine_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../package"
require_relative "../installer"
require_relative "../version_option"

class Gem::Commands::PristineCommand < Gem::Command
  include Gem::VersionOption

  def initialize
    super "pristine",
          "Restores installed gems to pristine condition from files located in the gem cache",
          :version => Gem::Requirement.default,
          :extensions => true,
          :extensions_set => false,
          :all => false

    add_option("--all",
               "Restore all installed gems to pristine",
               "condition") do |value, options|
      options[:all] = value
    end

    add_option("--skip=gem_name",
               "used on --all, skip if name == gem_name") do |value, options|
      options[:skip] ||= []
      options[:skip] << value
    end

    add_option("--[no-]extensions",
               "Restore gems with extensions",
               "in addition to regular gems") do |value, options|
      options[:extensions_set] = true
      options[:extensions]     = value
    end

    add_option("--only-executables",
               "Only restore executables") do |value, options|
      options[:only_executables] = value
    end

    add_option("--only-plugins",
               "Only restore plugins") do |value, options|
      options[:only_plugins] = value
    end

    add_option("-E", "--[no-]env-shebang",
               "Rewrite executables with a shebang",
               "of /usr/bin/env") do |value, options|
      options[:env_shebang] = value
    end

    add_option("-i", "--install-dir DIR",
               "Gem repository to get binstubs and plugins installed") do |value, options|
      options[:install_dir] = File.expand_path(value)
    end

    add_option("-n", "--bindir DIR",
               "Directory where executables are",
               "located") do |value, options|
      options[:bin_dir] = File.expand_path(value)
    end

    add_version_option("restore to", "pristine condition")
  end

  def arguments # :nodoc:
    "GEMNAME       gem to restore to pristine condition (unless --all)"
  end

  def defaults_str # :nodoc:
    "--extensions"
  end

  def description # :nodoc:
    <<-EOF
The pristine command compares an installed gem with the contents of its
cached .gem file and restores any files that don't match the cached .gem's
copy.

If you have made modifications to an installed gem, the pristine command
will revert them.  All extensions are rebuilt and all bin stubs for the gem
are regenerated after checking for modifications.

If the cached gem cannot be found it will be downloaded.

If --no-extensions is provided pristine will not attempt to restore a gem
with an extension.

If --extensions is given (but not --all or gem names) only gems with
extensions will be restored.
    EOF
  end

  def usage # :nodoc:
    "#{program_name} [GEMNAME ...]"
  end

  def execute
    specs = if options[:all]
      Gem::Specification.map

    # `--extensions` must be explicitly given to pristine only gems
    # with extensions.
    elsif options[:extensions_set] &&
          options[:extensions] && options[:args].empty?
      Gem::Specification.select do |spec|
        spec.extensions && !spec.extensions.empty?
      end
    else
      get_all_gem_names.sort.map do |gem_name|
        Gem::Specification.find_all_by_name(gem_name, options[:version]).reverse
      end.flatten
    end

    specs = specs.select {|spec| RUBY_ENGINE == spec.platform || Gem::Platform.local === spec.platform || spec.platform == Gem::Platform::RUBY }

    if specs.to_a.empty?
      raise Gem::Exception,
            "Failed to find gems #{options[:args]} #{options[:version]}"
    end

    say "Restoring gems to pristine condition..."

    specs.each do |spec|
      if spec.default_gem?
        say "Skipped #{spec.full_name}, it is a default gem"
        next
      end

      if options.has_key? :skip
        if options[:skip].include? spec.name
          say "Skipped #{spec.full_name}, it was given through options"
          next
        end
      end

      unless spec.extensions.empty? || options[:extensions] || options[:only_executables] || options[:only_plugins]
        say "Skipped #{spec.full_name}, it needs to compile an extension"
        next
      end

      gem = spec.cache_file

      unless File.exist?(gem) || options[:only_executables] || options[:only_plugins]
        require_relative "../remote_fetcher"

        say "Cached gem for #{spec.full_name} not found, attempting to fetch..."

        dep = Gem::Dependency.new spec.name, spec.version
        found, _ = Gem::SpecFetcher.fetcher.spec_for_dependency dep

        if found.empty?
          say "Skipped #{spec.full_name}, it was not found from cache and remote sources"
          next
        end

        spec_candidate, source = found.first
        Gem::RemoteFetcher.fetcher.download spec_candidate, source.uri.to_s, spec.base_dir
      end

      env_shebang =
        if options.include? :env_shebang
          options[:env_shebang]
        else
          install_defaults = Gem::ConfigFile::PLATFORM_DEFAULTS["install"]
          install_defaults.to_s["--env-shebang"]
        end

      bin_dir = options[:bin_dir] if options[:bin_dir]
      install_dir = options[:install_dir] if options[:install_dir]

      installer_options = {
        :wrappers => true,
        :force => true,
        :install_dir => install_dir || spec.base_dir,
        :env_shebang => env_shebang,
        :build_args => spec.build_args,
        :bin_dir => bin_dir,
      }

      if options[:only_executables]
        installer = Gem::Installer.for_spec(spec, installer_options)
        installer.generate_bin
      elsif options[:only_plugins]
        installer = Gem::Installer.for_spec(spec, installer_options)
        installer.generate_plugins
      else
        installer = Gem::Installer.at(gem, installer_options)
        installer.install
      end

      say "Restored #{spec.full_name}"
    end
  end
end
PK}$[�i�++1rubygems/rubygems/commands/environment_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"

class Gem::Commands::EnvironmentCommand < Gem::Command
  def initialize
    super "environment", "Display information about the RubyGems environment"
  end

  def arguments # :nodoc:
    args = <<-EOF
          home            display the path where gems are installed. Aliases: gemhome, gemdir, GEM_HOME
          path            display path used to search for gems. Aliases: gempath, GEM_PATH
          user_gemhome    display the path where gems are installed when `--user-install` is given. Aliases: user_gemdir
          version         display the gem format version
          remotesources   display the remote gem servers
          platform        display the supported gem platforms
          <omitted>       display everything
    EOF
    return args.gsub(/^\s+/, "")
  end

  def description # :nodoc:
    <<-EOF
The environment command lets you query rubygems for its configuration for
use in shell scripts or as a debugging aid.

The RubyGems environment can be controlled through command line arguments,
gemrc files, environment variables and built-in defaults.

Command line argument defaults and some RubyGems defaults can be set in a
~/.gemrc file for individual users and a gemrc in the SYSTEM CONFIGURATION
DIRECTORY for all users. These files are YAML files with the following YAML
keys:

  :sources: A YAML array of remote gem repositories to install gems from
  :verbose: Verbosity of the gem command. false, true, and :really are the
            levels
  :update_sources: Enable/disable automatic updating of repository metadata
  :backtrace: Print backtrace when RubyGems encounters an error
  :gempath: The paths in which to look for gems
  :disable_default_gem_server: Force specification of gem server host on push
  <gem_command>: A string containing arguments for the specified gem command

Example:

  :verbose: false
  install: --no-wrappers
  update: --no-wrappers
  :disable_default_gem_server: true

RubyGems' default local repository can be overridden with the GEM_PATH and
GEM_HOME environment variables. GEM_HOME sets the default repository to
install into. GEM_PATH allows multiple local repositories to be searched for
gems.

If you are behind a proxy server, RubyGems uses the HTTP_PROXY,
HTTP_PROXY_USER and HTTP_PROXY_PASS environment variables to discover the
proxy server.

If you would like to push gems to a private gem server the RUBYGEMS_HOST
environment variable can be set to the URI for that server.

If you are packaging RubyGems all of RubyGems' defaults are in
lib/rubygems/defaults.rb.  You may override these in
lib/rubygems/defaults/operating_system.rb
    EOF
  end

  def usage # :nodoc:
    "#{program_name} [arg]"
  end

  def execute
    out = String.new
    arg = options[:args][0]
    out <<
      case arg
      when /^version/ then
        Gem::VERSION
      when /^gemdir/, /^gemhome/, /^home/, /^GEM_HOME/ then
        Gem.dir
      when /^gempath/, /^path/, /^GEM_PATH/ then
        Gem.path.join(File::PATH_SEPARATOR)
      when /^user_gemdir/, /^user_gemhome/ then
        Gem.user_dir
      when /^remotesources/ then
        Gem.sources.to_a.join("\n")
      when /^platform/ then
        Gem.platforms.join(File::PATH_SEPARATOR)
      when nil then
        show_environment
      else
        raise Gem::CommandLineError, "Unknown environment option [#{arg}]"
      end
    say out
    true
  end

  def add_path(out, path)
    path.each do |component|
      out << "     - #{component}\n"
    end
  end

  def show_environment # :nodoc:
    out = "RubyGems Environment:\n".dup

    out << "  - RUBYGEMS VERSION: #{Gem::VERSION}\n"

    out << "  - RUBY VERSION: #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}"
    out << " patchlevel #{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
    out << ") [#{RUBY_PLATFORM}]\n"

    out << "  - INSTALLATION DIRECTORY: #{Gem.dir}\n"

    out << "  - USER INSTALLATION DIRECTORY: #{Gem.user_dir}\n"

    out << "  - RUBYGEMS PREFIX: #{Gem.prefix}\n" unless Gem.prefix.nil?

    out << "  - RUBY EXECUTABLE: #{Gem.ruby}\n"

    out << "  - GIT EXECUTABLE: #{git_path}\n"

    out << "  - EXECUTABLE DIRECTORY: #{Gem.bindir}\n"

    out << "  - SPEC CACHE DIRECTORY: #{Gem.spec_cache_dir}\n"

    out << "  - SYSTEM CONFIGURATION DIRECTORY: #{Gem::ConfigFile::SYSTEM_CONFIG_PATH}\n"

    out << "  - RUBYGEMS PLATFORMS:\n"
    Gem.platforms.each do |platform|
      out << "     - #{platform}\n"
    end

    out << "  - GEM PATHS:\n"
    out << "     - #{Gem.dir}\n"

    gem_path = Gem.path.dup
    gem_path.delete Gem.dir
    add_path out, gem_path

    out << "  - GEM CONFIGURATION:\n"
    Gem.configuration.each do |name, value|
      value = value.gsub(/./, "*") if name == "gemcutter_key"
      out << "     - #{name.inspect} => #{value.inspect}\n"
    end

    out << "  - REMOTE SOURCES:\n"
    Gem.sources.each do |s|
      out << "     - #{s}\n"
    end

    out << "  - SHELL PATH:\n"

    shell_path = ENV["PATH"].split(File::PATH_SEPARATOR)
    add_path out, shell_path

    out
  end

  private

  ##
  # Git binary path

  def git_path
    exts = ENV["PATHEXT"] ? ENV["PATHEXT"].split(";") : [""]
    ENV["PATH"].split(File::PATH_SEPARATOR).each do |path|
      exts.each do |ext|
        exe = File.join(path, "git#{ext}")
        return exe if File.executable?(exe) && !File.directory?(exe)
      end
    end

    return nil
  end
end
PK}$[�&��,rubygems/rubygems/commands/signin_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../gemcutter_utilities"

class Gem::Commands::SigninCommand < Gem::Command
  include Gem::GemcutterUtilities

  def initialize
    super "signin", "Sign in to any gemcutter-compatible host. "\
          "It defaults to https://rubygems.org"

    add_option("--host HOST", "Push to another gemcutter-compatible host") do |value, options|
      options[:host] = value
    end

    add_otp_option
  end

  def description # :nodoc:
    "The signin command executes host sign in for a push server (the default is"\
    " https://rubygems.org). The host can be provided with the host flag or can"\
    " be inferred from the provided gem. Host resolution matches the resolution"\
    " strategy for the push command."
  end

  def usage # :nodoc:
    program_name
  end

  def execute
    sign_in options[:host]
  end
end
PK}$[�2�V��+rubygems/rubygems/commands/query_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../query_utils"
require_relative "../deprecate"

class Gem::Commands::QueryCommand < Gem::Command
  extend Gem::Deprecate
  rubygems_deprecate_command

  include Gem::QueryUtils

  alias warning_without_suggested_alternatives deprecation_warning
  def deprecation_warning
    warning_without_suggested_alternatives

    message = "It is recommended that you use `gem search` or `gem list` instead.\n"
    alert_warning message unless Gem::Deprecate.skip
  end

  def initialize(name = "query",
                 summary = "Query gem information in local or remote repositories")
    super name, summary,
         :domain => :local, :details => false, :versions => true,
         :installed => nil, :version => Gem::Requirement.default

    add_option("-n", "--name-matches REGEXP",
               "Name of gem(s) to query on matches the",
               "provided REGEXP") do |value, options|
      options[:name] = /#{value}/i
    end

    add_query_options
  end

  def description # :nodoc:
    <<-EOF
The query command is the basis for the list and search commands.

You should really use the list and search commands instead.  This command
is too hard to use.
    EOF
  end
end
PK}$[[�Q��
�
3rubygems/rubygems/commands/specification_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../local_remote_options"
require_relative "../version_option"
require_relative "../package"

class Gem::Commands::SpecificationCommand < Gem::Command
  include Gem::LocalRemoteOptions
  include Gem::VersionOption

  def initialize
    Gem.load_yaml

    super "specification", "Display gem specification (in yaml)",
          :domain => :local, :version => Gem::Requirement.default,
          :format => :yaml

    add_version_option("examine")
    add_platform_option
    add_prerelease_option

    add_option("--all", "Output specifications for all versions of",
               "the gem") do |value, options|
      options[:all] = true
    end

    add_option("--ruby", "Output ruby format") do |value, options|
      options[:format] = :ruby
    end

    add_option("--yaml", "Output YAML format") do |value, options|
      options[:format] = :yaml
    end

    add_option("--marshal", "Output Marshal format") do |value, options|
      options[:format] = :marshal
    end

    add_local_remote_options
  end

  def arguments # :nodoc:
    <<-ARGS
GEMFILE       name of gem to show the gemspec for
FIELD         name of gemspec field to show
    ARGS
  end

  def defaults_str # :nodoc:
    "--local --version '#{Gem::Requirement.default}' --yaml"
  end

  def description # :nodoc:
    <<-EOF
The specification command allows you to extract the specification from
a gem for examination.

The specification can be output in YAML, ruby or Marshal formats.

Specific fields in the specification can be extracted in YAML format:

  $ gem spec rake summary
  --- Ruby based make-like utility.
  ...

    EOF
  end

  def usage # :nodoc:
    "#{program_name} [GEMFILE] [FIELD]"
  end

  def execute
    specs = []
    gem = options[:args].shift

    unless gem
      raise Gem::CommandLineError,
            "Please specify a gem name or file on the command line"
    end

    case v = options[:version]
    when String
      req = Gem::Requirement.create v
    when Gem::Requirement
      req = v
    else
      raise Gem::CommandLineError, "Unsupported version type: '#{v}'"
    end

    if !req.none? && options[:all]
      alert_error "Specify --all or -v, not both"
      terminate_interaction 1
    end

    if options[:all]
      dep = Gem::Dependency.new gem
    else
      dep = Gem::Dependency.new gem, req
    end

    field = get_one_optional_argument

    raise Gem::CommandLineError, "--ruby and FIELD are mutually exclusive" if
      field && options[:format] == :ruby

    if local?
      if File.exist? gem
        specs << Gem::Package.new(gem).spec rescue nil
      end

      if specs.empty?
        specs.push(*dep.matching_specs)
      end
    end

    if remote?
      dep.prerelease = options[:prerelease]
      found, _ = Gem::SpecFetcher.fetcher.spec_for_dependency dep

      specs.push(*found.map {|spec,| spec })
    end

    if specs.empty?
      alert_error "No gem matching '#{dep}' found"
      terminate_interaction 1
    end

    platform = get_platform_from_requirements(options)

    if platform
      specs = specs.select {|s| s.platform.to_s == platform }
    end

    unless options[:all]
      specs = [specs.max_by {|s| s.version }]
    end

    specs.each do |s|
      s = s.send field if field

      say case options[:format]
      when :ruby then s.to_ruby
      when :marshal then Marshal.dump s
      else s.to_yaml
      end

      say "\n"
    end
  end
end
PK}$[��;M



+rubygems/rubygems/commands/owner_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../local_remote_options"
require_relative "../gemcutter_utilities"
require_relative "../text"

class Gem::Commands::OwnerCommand < Gem::Command
  include Gem::Text
  include Gem::LocalRemoteOptions
  include Gem::GemcutterUtilities

  def description # :nodoc:
    <<-EOF
The owner command lets you add and remove owners of a gem on a push
server (the default is https://rubygems.org). Multiple owners can be
added or removed at the same time, if the flag is given multiple times.

The supported user identifiers are dependant on the push server.
For rubygems.org, both e-mail and handle are supported, even though the
user identifier field is called "email".

The owner of a gem has the permission to push new versions, yank existing
versions or edit the HTML page of the gem.  Be careful of who you give push
permission to.
    EOF
  end

  def arguments # :nodoc:
    "GEM       gem to manage owners for"
  end

  def usage # :nodoc:
    "#{program_name} GEM"
  end

  def initialize
    super "owner", "Manage gem owners of a gem on the push server"
    add_proxy_option
    add_key_option
    add_otp_option
    defaults.merge! :add => [], :remove => []

    add_option "-a", "--add NEW_OWNER", "Add an owner by user identifier" do |value, options|
      options[:add] << value
    end

    add_option "-r", "--remove OLD_OWNER", "Remove an owner by user identifier" do |value, options|
      options[:remove] << value
    end

    add_option "-h", "--host HOST",
               "Use another gemcutter-compatible host",
               "  (e.g. https://rubygems.org)" do |value, options|
      options[:host] = value
    end
  end

  def execute
    @host = options[:host]

    sign_in(scope: get_owner_scope)
    name = get_one_gem_name

    add_owners    name, options[:add]
    remove_owners name, options[:remove]
    show_owners   name
  end

  def show_owners(name)
    Gem.load_yaml

    response = rubygems_api_request :get, "api/v1/gems/#{name}/owners.yaml" do |request|
      request.add_field "Authorization", api_key
    end

    with_response response do |resp|
      owners = Gem::SafeYAML.load clean_text(resp.body)

      say "Owners for gem: #{name}"
      owners.each do |owner|
        say "- #{owner['email'] || owner['handle'] || owner['id']}"
      end
    end
  end

  def add_owners(name, owners)
    manage_owners :post, name, owners
  end

  def remove_owners(name, owners)
    manage_owners :delete, name, owners
  end

  def manage_owners(method, name, owners)
    owners.each do |owner|
      begin
        response = send_owner_request(method, name, owner)
        action = method == :delete ? "Removing" : "Adding"

        with_response response, "#{action} #{owner}"
      rescue
        # ignore
      end
    end
  end

  private

  def send_owner_request(method, name, owner)
    rubygems_api_request method, "api/v1/gems/#{name}/owners", scope: get_owner_scope(method: method) do |request|
      request.set_form_data "email" => owner
      request.add_field "Authorization", api_key
    end
  end

  def get_owner_scope(method: nil)
    if method == :post || options.any? && options[:add].any?
      :add_owner
    elsif method == :delete || options.any? && options[:remove].any?
      :remove_owner
    end
  end
end
PK}$[<X���,rubygems/rubygems/commands/search_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../query_utils"

class Gem::Commands::SearchCommand < Gem::Command
  include Gem::QueryUtils

  def initialize
    super "search", "Display remote gems whose name matches REGEXP",
         :domain => :remote, :details => false, :versions => true,
         :installed => nil, :version => Gem::Requirement.default

    add_query_options
  end

  def arguments # :nodoc:
    "REGEXP        regexp to search for in gem name"
  end

  def defaults_str # :nodoc:
    "--remote --no-details"
  end

  def description # :nodoc:
    <<-EOF
The search command displays remote gems whose name matches the given
regexp.

The --details option displays additional details from the gem but will
take a little longer to complete as it must download the information
individually from the index.

To list local gems use the list command.
    EOF
  end

  def usage # :nodoc:
    "#{program_name} [REGEXP]"
  end
end
PK}$[���``+rubygems/rubygems/commands/which_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"

class Gem::Commands::WhichCommand < Gem::Command
  def initialize
    super "which", "Find the location of a library file you can require",
          :search_gems_first => false, :show_all => false

    add_option "-a", "--[no-]all", "show all matching files" do |show_all, options|
      options[:show_all] = show_all
    end

    add_option "-g", "--[no-]gems-first",
               "search gems before non-gems" do |gems_first, options|
      options[:search_gems_first] = gems_first
    end
  end

  def arguments # :nodoc:
    "FILE          name of file to find"
  end

  def defaults_str # :nodoc:
    "--no-gems-first --no-all"
  end

  def description # :nodoc:
    <<-EOF
The which command is like the shell which command and shows you where
the file you wish to require lives.

You can use the which command to help determine why you are requiring a
version you did not expect or to look at the content of a file you are
requiring to see why it does not behave as you expect.
    EOF
  end

  def execute
    found = true

    options[:args].each do |arg|
      arg = arg.sub(/#{Regexp.union(*Gem.suffixes)}$/, "")
      dirs = $LOAD_PATH

      spec = Gem::Specification.find_by_path arg

      if spec
        if options[:search_gems_first]
          dirs = spec.full_require_paths + $LOAD_PATH
        else
          dirs = $LOAD_PATH + spec.full_require_paths
        end
      end

      paths = find_paths arg, dirs

      if paths.empty?
        alert_error "Can't find Ruby library file or shared library #{arg}"
        found = false
      else
        say paths
      end
    end

    terminate_interaction 1 unless found
  end

  def find_paths(package_name, dirs)
    result = []

    dirs.each do |dir|
      Gem.suffixes.each do |ext|
        full_path = File.join dir, "#{package_name}#{ext}"
        if File.exist?(full_path) && !File.directory?(full_path)
          result << full_path
          return result unless options[:show_all]
        end
      end
    end

    result
  end

  def usage # :nodoc:
    "#{program_name} FILE [FILE ...]"
  end
end
PK}$[�B�&Z	Z	*rubygems/rubygems/commands/yank_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../local_remote_options"
require_relative "../version_option"
require_relative "../gemcutter_utilities"

class Gem::Commands::YankCommand < Gem::Command
  include Gem::LocalRemoteOptions
  include Gem::VersionOption
  include Gem::GemcutterUtilities

  def description # :nodoc:
    <<-EOF
The yank command permanently removes a gem you pushed to a server.

Once you have pushed a gem several downloads will happen automatically
via the webhooks. If you accidentally pushed passwords or other sensitive
data you will need to change them immediately and yank your gem.
    EOF
  end

  def arguments # :nodoc:
    "GEM       name of gem"
  end

  def usage # :nodoc:
    "#{program_name} -v VERSION [-p PLATFORM] [--key KEY_NAME] [--host HOST] GEM"
  end

  def initialize
    super "yank", "Remove a pushed gem from the index"

    add_version_option("remove")
    add_platform_option("remove")
    add_otp_option

    add_option("--host HOST",
               "Yank from another gemcutter-compatible host",
               "  (e.g. https://rubygems.org)") do |value, options|
      options[:host] = value
    end

    add_key_option
    @host = nil
  end

  def execute
    @host = options[:host]

    sign_in @host, scope: get_yank_scope

    version   = get_version_from_requirements(options[:version])
    platform  = get_platform_from_requirements(options)

    if version
      yank_gem(version, platform)
    else
      say "A version argument is required: #{usage}"
      terminate_interaction
    end
  end

  def yank_gem(version, platform)
    say "Yanking gem from #{self.host}..."
    args = [:delete, version, platform, "api/v1/gems/yank"]
    response = yank_api_request(*args)

    say response.body
  end

  private

  def yank_api_request(method, version, platform, api)
    name = get_one_gem_name
    response = rubygems_api_request(method, api, host, scope: get_yank_scope) do |request|
      request.add_field("Authorization", api_key)

      data = {
        "gem_name" => name,
        "version" => version,
      }
      data["platform"] = platform if platform

      request.set_form_data data
    end
    response
  end

  def get_version_from_requirements(requirements)
    requirements.requirements.first[1].version
  rescue
    nil
  end

  def get_yank_scope
    :yank_rubygem
  end
end
PK}$[:��TT*rubygems/rubygems/commands/info_command.rbnu�[���# frozen_string_literal: true

require_relative "../command"
require_relative "../query_utils"

class Gem::Commands::InfoCommand < Gem::Command
  include Gem::QueryUtils

  def initialize
    super "info", "Show information for the given gem",
         :name => //, :domain => :local, :details => false, :versions => true,
         :installed => nil, :version => Gem::Requirement.default

    add_query_options

    remove_option("-d")

    defaults[:details] = true
    defaults[:exact] = true
  end

  def description # :nodoc:
    "Info prints information about the gem such as name,"\
    " description, website, license and installed paths"
  end

  def usage # :nodoc:
    "#{program_name} GEMNAME"
  end

  def arguments # :nodoc:
    "GEMNAME        name of the gem to print information about"
  end

  def defaults_str
    "--local"
  end
end
PK}$[��a�
�
*rubygems/rubygems/commands/lock_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"

class Gem::Commands::LockCommand < Gem::Command
  def initialize
    super "lock", "Generate a lockdown list of gems",
          :strict => false

    add_option "-s", "--[no-]strict",
               "fail if unable to satisfy a dependency" do |strict, options|
      options[:strict] = strict
    end
  end

  def arguments # :nodoc:
    "GEMNAME       name of gem to lock\nVERSION       version of gem to lock"
  end

  def defaults_str # :nodoc:
    "--no-strict"
  end

  def description # :nodoc:
    <<-EOF
The lock command will generate a list of +gem+ statements that will lock down
the versions for the gem given in the command line.  It will specify exact
versions in the requirements list to ensure that the gems loaded will always
be consistent.  A full recursive search of all effected gems will be
generated.

Example:

  gem lock rails-1.0.0 > lockdown.rb

will produce in lockdown.rb:

  require "rubygems"
  gem 'rails', '= 1.0.0'
  gem 'rake', '= 0.7.0.1'
  gem 'activesupport', '= 1.2.5'
  gem 'activerecord', '= 1.13.2'
  gem 'actionpack', '= 1.11.2'
  gem 'actionmailer', '= 1.1.5'
  gem 'actionwebservice', '= 1.0.0'

Just load lockdown.rb from your application to ensure that the current
versions are loaded.  Make sure that lockdown.rb is loaded *before* any
other require statements.

Notice that rails 1.0.0 only requires that rake 0.6.2 or better be used.
Rake-0.7.0.1 is the most recent version installed that satisfies that, so we
lock it down to the exact version.
    EOF
  end

  def usage # :nodoc:
    "#{program_name} GEMNAME-VERSION [GEMNAME-VERSION ...]"
  end

  def complain(message)
    if options[:strict]
      raise Gem::Exception, message
    else
      say "# #{message}"
    end
  end

  def execute
    say "require 'rubygems'"

    locked = {}

    pending = options[:args]

    until pending.empty? do
      full_name = pending.shift

      spec = Gem::Specification.load spec_path(full_name)

      if spec.nil?
        complain "Could not find gem #{full_name}, try using the full name"
        next
      end

      say "gem '#{spec.name}', '= #{spec.version}'" unless locked[spec.name]
      locked[spec.name] = true

      spec.runtime_dependencies.each do |dep|
        next if locked[dep.name]
        candidates = dep.matching_specs

        if candidates.empty?
          complain "Unable to satisfy '#{dep}' from currently installed gems"
        else
          pending << candidates.last.full_name
        end
      end
    end
  end

  def spec_path(gem_full_name)
    gemspecs = Gem.path.map do |path|
      File.join path, "specifications", "#{gem_full_name}.gemspec"
    end

    gemspecs.find {|path| File.exist? path }
  end
end
PK}$[��ہ�-rubygems/rubygems/commands/signout_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"

class Gem::Commands::SignoutCommand < Gem::Command
  def initialize
    super "signout", "Sign out from all the current sessions."
  end

  def description # :nodoc:
    "The `signout` command is used to sign out from all current sessions,"\
    " allowing you to sign in using a different set of credentials."
  end

  def usage # :nodoc:
    program_name
  end

  def execute
    credentials_path = Gem.configuration.credentials_path

    if !File.exist?(credentials_path)
      alert_error "You are not currently signed in."
    elsif !File.writable?(credentials_path)
      alert_error "File '#{Gem.configuration.credentials_path}' is read-only."\
                  " Please make sure it is writable."
    else
      Gem.configuration.unset_api_key!
      say "You have successfully signed out from all sessions."
    end
  end
end
PK}$[#�5���*rubygems/rubygems/commands/list_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../query_utils"

##
# Searches for gems starting with the supplied argument.

class Gem::Commands::ListCommand < Gem::Command
  include Gem::QueryUtils

  def initialize
    super "list", "Display local gems whose name matches REGEXP",
         :domain => :local, :details => false, :versions => true,
         :installed => nil, :version => Gem::Requirement.default

    add_query_options
  end

  def arguments # :nodoc:
    "REGEXP        regexp to look for in gem name"
  end

  def defaults_str # :nodoc:
    "--local --no-details"
  end

  def description # :nodoc:
    <<-EOF
The list command is used to view the gems you have installed locally.

The --details option displays additional details including the summary, the
homepage, the author, the locations of different versions of the gem.

To search for remote gems use the search command.
    EOF
  end

  def usage # :nodoc:
    "#{program_name} [REGEXP ...]"
  end
end
PK}$[��(��4rubygems/rubygems/commands/generate_index_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../indexer"

##
# Generates a index files for use as a gem server.
#
# See `gem help generate_index`

class Gem::Commands::GenerateIndexCommand < Gem::Command
  def initialize
    super "generate_index",
          "Generates the index files for a gem server directory",
          :directory => ".", :build_modern => true

    add_option "-d", "--directory=DIRNAME",
               "repository base dir containing gems subdir" do |dir, options|
      options[:directory] = File.expand_path dir
    end

    add_option "--[no-]modern",
               "Generate indexes for RubyGems",
               "(always true)" do |value, options|
      options[:build_modern] = value
    end

    deprecate_option("--modern", version: "4.0", extra_msg: "Modern indexes (specs, latest_specs, and prerelease_specs) are always generated, so this option is not needed.")
    deprecate_option("--no-modern", version: "4.0", extra_msg: "The `--no-modern` option is currently ignored. Modern indexes (specs, latest_specs, and prerelease_specs) are always generated.")

    add_option "--update",
               "Update modern indexes with gems added",
               "since the last update" do |value, options|
      options[:update] = value
    end
  end

  def defaults_str # :nodoc:
    "--directory . --modern"
  end

  def description # :nodoc:
    <<-EOF
The generate_index command creates a set of indexes for serving gems
statically.  The command expects a 'gems' directory under the path given to
the --directory option.  The given directory will be the directory you serve
as the gem repository.

For `gem generate_index --directory /path/to/repo`, expose /path/to/repo via
your HTTP server configuration (not /path/to/repo/gems).

When done, it will generate a set of files like this:

  gems/*.gem                                   # .gem files you want to
                                               # index

  specs.<version>.gz                           # specs index
  latest_specs.<version>.gz                    # latest specs index
  prerelease_specs.<version>.gz                # prerelease specs index
  quick/Marshal.<version>/<gemname>.gemspec.rz # Marshal quick index file

The .rz extension files are compressed with the inflate algorithm.
The Marshal version number comes from ruby's Marshal::MAJOR_VERSION and
Marshal::MINOR_VERSION constants.  It is used to ensure compatibility.
    EOF
  end

  def execute
    # This is always true because it's the only way now.
    options[:build_modern] = true

    if !File.exist?(options[:directory]) ||
       !File.directory?(options[:directory])
      alert_error "unknown directory name #{options[:directory]}."
      terminate_interaction 1
    else
      indexer = Gem::Indexer.new options.delete(:directory), options

      if options[:update]
        indexer.update_index
      else
        indexer.generate_index
      end
    end
  end
end
PK}$[H|rr,rubygems/rubygems/commands/mirror_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"

unless defined? Gem::Commands::MirrorCommand
  class Gem::Commands::MirrorCommand < Gem::Command
    def initialize
      super("mirror", "Mirror all gem files (requires rubygems-mirror)")
      begin
        Gem::Specification.find_by_name("rubygems-mirror").activate
      rescue Gem::LoadError
        # no-op
      end
    end

    def description # :nodoc:
      <<-EOF
The mirror command has been moved to the rubygems-mirror gem.
      EOF
    end

    def execute
      alert_error "Install the rubygems-mirror gem for the mirror command"
    end
  end
end
PK}$[��O���+rubygems/rubygems/commands/check_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../version_option"
require_relative "../validator"
require_relative "../doctor"

class Gem::Commands::CheckCommand < Gem::Command
  include Gem::VersionOption

  def initialize
    super "check", "Check a gem repository for added or missing files",
          :alien => true, :doctor => false, :dry_run => false, :gems => true

    add_option("-a", "--[no-]alien",
               'Report "unmanaged" or rogue files in the',
               "gem repository") do |value, options|
      options[:alien] = value
    end

    add_option("--[no-]doctor",
               "Clean up uninstalled gems and broken",
               "specifications") do |value, options|
      options[:doctor] = value
    end

    add_option("--[no-]dry-run",
               "Do not remove files, only report what",
               "would be removed") do |value, options|
      options[:dry_run] = value
    end

    add_option("--[no-]gems",
               "Check installed gems for problems") do |value, options|
      options[:gems] = value
    end

    add_version_option "check"
  end

  def check_gems
    say "Checking gems..."
    say
    gems = get_all_gem_names rescue []

    Gem::Validator.new.alien(gems).sort.each do |key, val|
      unless val.empty?
        say "#{key} has #{val.size} problems"
        val.each do |error_entry|
          say "  #{error_entry.path}:"
          say "    #{error_entry.problem}"
        end
      else
        say "#{key} is error-free" if Gem.configuration.verbose
      end
      say
    end
  end

  def doctor
    say "Checking for files from uninstalled gems..."
    say

    Gem.path.each do |gem_repo|
      doctor = Gem::Doctor.new gem_repo, options[:dry_run]
      doctor.doctor
    end
  end

  def execute
    check_gems if options[:gems]
    doctor if options[:doctor]
  end

  def arguments # :nodoc:
    "GEMNAME       name of gem to check"
  end

  def defaults_str # :nodoc:
    "--gems --alien"
  end

  def description # :nodoc:
    <<-EOF
The check command can list and repair problems with installed gems and
specifications and will clean up gems that have been partially uninstalled.
    EOF
  end

  def usage # :nodoc:
    "#{program_name} [OPTIONS] [GEMNAME ...]"
  end
end
PK}$[��}__.rubygems/rubygems/commands/outdated_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../local_remote_options"
require_relative "../spec_fetcher"
require_relative "../version_option"

class Gem::Commands::OutdatedCommand < Gem::Command
  include Gem::LocalRemoteOptions
  include Gem::VersionOption

  def initialize
    super "outdated", "Display all gems that need updates"

    add_local_remote_options
    add_platform_option
  end

  def description # :nodoc:
    <<-EOF
The outdated command lists gems you may wish to upgrade to a newer version.

You can check for dependency mismatches using the dependency command and
update the gems with the update or install commands.
    EOF
  end

  def execute
    Gem::Specification.outdated_and_latest_version.each do |spec, remote_version|
      say "#{spec.name} (#{spec.version} < #{remote_version})"
    end
  end
end
PK}$[��gHH+rubygems/rubygems/commands/setup_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"

##
# Installs RubyGems itself.  This command is ordinarily only available from a
# RubyGems checkout or tarball.

class Gem::Commands::SetupCommand < Gem::Command
  HISTORY_HEADER = /^#\s*[\d.a-zA-Z]+\s*\/\s*\d{4}-\d{2}-\d{2}\s*$/.freeze
  VERSION_MATCHER = /^#\s*([\d.a-zA-Z]+)\s*\/\s*\d{4}-\d{2}-\d{2}\s*$/.freeze

  ENV_PATHS = %w[/usr/bin/env /bin/env].freeze

  def initialize
    super "setup", "Install RubyGems",
          :format_executable => false, :document => %w[ri],
          :force => true,
          :site_or_vendor => "sitelibdir",
          :destdir => "", :prefix => "", :previous_version => "",
          :regenerate_binstubs => true,
          :regenerate_plugins => true

    add_option "--previous-version=VERSION",
               "Previous version of RubyGems",
               "Used for changelog processing" do |version, options|
      options[:previous_version] = version
    end

    add_option "--prefix=PREFIX",
               "Prefix path for installing RubyGems",
               "Will not affect gem repository location" do |prefix, options|
      options[:prefix] = File.expand_path prefix
    end

    add_option "--destdir=DESTDIR",
               "Root directory to install RubyGems into",
               "Mainly used for packaging RubyGems" do |destdir, options|
      options[:destdir] = File.expand_path destdir
    end

    add_option "--[no-]vendor",
               "Install into vendorlibdir not sitelibdir" do |vendor, options|
      options[:site_or_vendor] = vendor ? "vendorlibdir" : "sitelibdir"
    end

    add_option "--[no-]format-executable",
               "Makes `gem` match ruby",
               "If Ruby is ruby18, gem will be gem18" do |value, options|
      options[:format_executable] = value
    end

    add_option "--[no-]document [TYPES]", Array,
               "Generate documentation for RubyGems",
               "List the documentation types you wish to",
               "generate.  For example: rdoc,ri" do |value, options|
      options[:document] = case value
      when nil   then %w[rdoc ri]
      when false then []
      else            value
      end
    end

    add_option "--[no-]rdoc",
               "Generate RDoc documentation for RubyGems" do |value, options|
      if value
        options[:document] << "rdoc"
      else
        options[:document].delete "rdoc"
      end

      options[:document].uniq!
    end

    add_option "--[no-]ri",
               "Generate RI documentation for RubyGems" do |value, options|
      if value
        options[:document] << "ri"
      else
        options[:document].delete "ri"
      end

      options[:document].uniq!
    end

    add_option "--[no-]regenerate-binstubs",
               "Regenerate gem binstubs" do |value, options|
      options[:regenerate_binstubs] = value
    end

    add_option "--[no-]regenerate-plugins",
               "Regenerate gem plugins" do |value, options|
      options[:regenerate_plugins] = value
    end

    add_option "-f", "--[no-]force",
               "Forcefully overwrite binstubs" do |value, options|
      options[:force] = value
    end

    add_option("-E", "--[no-]env-shebang",
               "Rewrite executables with a shebang",
               "of /usr/bin/env") do |value, options|
      options[:env_shebang] = value
    end

    @verbose = nil
  end

  def check_ruby_version
    required_version = Gem::Requirement.new ">= 2.3.0"

    unless required_version.satisfied_by? Gem.ruby_version
      alert_error "Expected Ruby version #{required_version}, is #{Gem.ruby_version}"
      terminate_interaction 1
    end
  end

  def defaults_str # :nodoc:
    "--format-executable --document ri --regenerate-binstubs"
  end

  def description # :nodoc:
    <<-EOF
Installs RubyGems itself.

RubyGems installs RDoc for itself in GEM_HOME.  By default this is:
  #{Gem.dir}

If you prefer a different directory, set the GEM_HOME environment variable.

RubyGems will install the gem command with a name matching ruby's
prefix and suffix.  If ruby was installed as `ruby18`, gem will be
installed as `gem18`.

By default, this RubyGems will install gem as:
  #{Gem.default_exec_format % 'gem'}
    EOF
  end

  module MakeDirs
    def mkdir_p(path, **opts)
      super
      (@mkdirs ||= []) << path
    end
  end

  def execute
    @verbose = Gem.configuration.really_verbose

    check_ruby_version

    require "fileutils"
    if Gem.configuration.really_verbose
      extend FileUtils::Verbose
    else
      extend FileUtils
    end
    extend MakeDirs

    lib_dir, bin_dir = make_destination_dirs
    man_dir = generate_default_man_dir

    install_lib lib_dir

    install_executables bin_dir

    remove_old_bin_files bin_dir

    remove_old_lib_files lib_dir

    # Can be removed one we drop support for bundler 2.2.3 (the last version installing man files to man_dir)
    remove_old_man_files man_dir if man_dir && File.exist?(man_dir)

    install_default_bundler_gem bin_dir

    if mode = options[:dir_mode]
      @mkdirs.uniq!
      File.chmod(mode, @mkdirs)
    end

    say "RubyGems #{Gem::VERSION} installed"

    regenerate_binstubs(bin_dir) if options[:regenerate_binstubs]
    regenerate_plugins(bin_dir) if options[:regenerate_plugins]

    uninstall_old_gemcutter

    documentation_success = install_rdoc

    say
    if @verbose
      say "-" * 78
      say
    end

    if options[:previous_version].empty?
      options[:previous_version] = Gem::VERSION.sub(/[0-9]+$/, "0")
    end

    options[:previous_version] = Gem::Version.new(options[:previous_version])

    show_release_notes

    say
    say "-" * 78
    say

    say "RubyGems installed the following executables:"
    say bin_file_names.map {|name| "\t#{name}\n" }
    say

    unless bin_file_names.grep(/#{File::SEPARATOR}gem$/)
      say "If `gem` was installed by a previous RubyGems installation, you may need"
      say "to remove it by hand."
      say
    end

    if documentation_success
      if options[:document].include? "rdoc"
        say "Rdoc documentation was installed. You may now invoke:"
        say "  gem server"
        say "and then peruse beautifully formatted documentation for your gems"
        say "with your web browser."
        say "If you do not wish to install this documentation in the future, use the"
        say "--no-document flag, or set it as the default in your ~/.gemrc file. See"
        say "'gem help env' for details."
        say
      end

      if options[:document].include? "ri"
        say "Ruby Interactive (ri) documentation was installed. ri is kind of like man "
        say "pages for Ruby libraries. You may access it like this:"
        say "  ri Classname"
        say "  ri Classname.class_method"
        say "  ri Classname#instance_method"
        say "If you do not wish to install this documentation in the future, use the"
        say "--no-document flag, or set it as the default in your ~/.gemrc file. See"
        say "'gem help env' for details."
        say
      end
    end
  end

  def install_executables(bin_dir)
    prog_mode = options[:prog_mode] || 0755

    executables = { "gem" => "bin" }
    executables.each do |tool, path|
      say "Installing #{tool} executable" if @verbose

      Dir.chdir path do
        bin_file = "gem"

        require "tmpdir"

        dest_file = target_bin_path(bin_dir, bin_file)
        bin_tmp_file = File.join Dir.tmpdir, "#{bin_file}.#{$$}"

        begin
          bin = File.readlines bin_file
          bin[0] = shebang

          File.open bin_tmp_file, "w" do |fp|
            fp.puts bin.join
          end

          install bin_tmp_file, dest_file, :mode => prog_mode
          bin_file_names << dest_file
        ensure
          rm bin_tmp_file
        end

        next unless Gem.win_platform?

        begin
          bin_cmd_file = File.join Dir.tmpdir, "#{bin_file}.bat"

          File.open bin_cmd_file, "w" do |file|
            file.puts <<-TEXT
  @ECHO OFF
  IF NOT "%~f0" == "~f0" GOTO :WinNT
  @"#{File.basename(Gem.ruby).chomp('"')}" "#{dest_file}" %1 %2 %3 %4 %5 %6 %7 %8 %9
  GOTO :EOF
  :WinNT
  @"#{File.basename(Gem.ruby).chomp('"')}" "%~dpn0" %*
  TEXT
          end

          install bin_cmd_file, "#{dest_file}.bat", :mode => prog_mode
        ensure
          rm bin_cmd_file
        end
      end
    end
  end

  def shebang
    if options[:env_shebang]
      ruby_name = RbConfig::CONFIG["ruby_install_name"]
      @env_path ||= ENV_PATHS.find {|env_path| File.executable? env_path }
      "#!#{@env_path} #{ruby_name}\n"
    else
      "#!#{Gem.ruby}\n"
    end
  end

  def install_lib(lib_dir)
    libs = { "RubyGems" => "lib" }
    libs["Bundler"] = "bundler/lib"
    libs.each do |tool, path|
      say "Installing #{tool}" if @verbose

      lib_files = files_in path

      Dir.chdir path do
        install_file_list(lib_files, lib_dir)
      end
    end
  end

  def install_rdoc
    gem_doc_dir = File.join Gem.dir, "doc"
    rubygems_name = "rubygems-#{Gem::VERSION}"
    rubygems_doc_dir = File.join gem_doc_dir, rubygems_name

    begin
      Gem.ensure_gem_subdirectories Gem.dir
    rescue SystemCallError
      # ignore
    end

    if File.writable?(gem_doc_dir) &&
       (!File.exist?(rubygems_doc_dir) ||
        File.writable?(rubygems_doc_dir))
      say "Removing old RubyGems RDoc and ri" if @verbose
      Dir[File.join(Gem.dir, "doc", "rubygems-[0-9]*")].each do |dir|
        rm_rf dir
      end

      require_relative "../rdoc"

      fake_spec = Gem::Specification.new "rubygems", Gem::VERSION
      def fake_spec.full_gem_path
        File.expand_path "../../..", __dir__
      end

      generate_ri   = options[:document].include? "ri"
      generate_rdoc = options[:document].include? "rdoc"

      rdoc = Gem::RDoc.new fake_spec, generate_rdoc, generate_ri
      rdoc.generate

      return true
    elsif @verbose
      say "Skipping RDoc generation, #{gem_doc_dir} not writable"
      say "Set the GEM_HOME environment variable if you want RDoc generated"
    end

    return false
  end

  def install_default_bundler_gem(bin_dir)
    current_default_spec = Gem::Specification.default_stubs.find {|s| s.name == "bundler" }
    specs_dir = if current_default_spec && default_dir == Gem.default_dir
      Gem::Specification.remove_spec current_default_spec
      loaded_from = current_default_spec.loaded_from
      File.delete(loaded_from)
      File.dirname(loaded_from)
    else
      target_specs_dir = File.join(default_dir, "specifications", "default")
      mkdir_p target_specs_dir, :mode => 0755
      target_specs_dir
    end

    bundler_spec = Dir.chdir("bundler") { Gem::Specification.load("bundler.gemspec") }
    default_spec_path = File.join(specs_dir, "#{bundler_spec.full_name}.gemspec")
    Gem.write_binary(default_spec_path, bundler_spec.to_ruby)

    bundler_spec = Gem::Specification.load(default_spec_path)

    # Remove gemspec that was same version of vendored bundler.
    normal_gemspec = File.join(default_dir, "specifications", "bundler-#{bundler_spec.version}.gemspec")
    if File.file? normal_gemspec
      File.delete normal_gemspec
    end

    # Remove gem files that were same version of vendored bundler.
    if File.directory? bundler_spec.gems_dir
      Dir.entries(bundler_spec.gems_dir).
        select {|default_gem| File.basename(default_gem) == "bundler-#{bundler_spec.version}" }.
        each {|default_gem| rm_r File.join(bundler_spec.gems_dir, default_gem) }
    end

    bundler_bin_dir = bundler_spec.bin_dir
    mkdir_p bundler_bin_dir, :mode => 0755
    bundler_spec.executables.each do |e|
      cp File.join("bundler", bundler_spec.bindir, e), File.join(bundler_bin_dir, e)
    end

    require_relative "../installer"

    Dir.chdir("bundler") do
      built_gem = Gem::Package.build(bundler_spec)
      begin
        Gem::Installer.at(
          built_gem,
          env_shebang: options[:env_shebang],
          format_executable: options[:format_executable],
          force: options[:force],
          install_as_default: true,
          bin_dir: bin_dir,
          install_dir: default_dir,
          wrappers: true
        ).install
      ensure
        FileUtils.rm_f built_gem
      end
    end

    bundler_spec.executables.each {|executable| bin_file_names << target_bin_path(bin_dir, executable) }

    say "Bundler #{bundler_spec.version} installed"
  end

  def make_destination_dirs
    lib_dir, bin_dir = Gem.default_rubygems_dirs

    unless lib_dir
      lib_dir, bin_dir = generate_default_dirs
    end

    mkdir_p lib_dir, :mode => 0755
    mkdir_p bin_dir, :mode => 0755

    return lib_dir, bin_dir
  end

  def generate_default_man_dir
    prefix = options[:prefix]

    if prefix.empty?
      man_dir = RbConfig::CONFIG["mandir"]
      return unless man_dir
    else
      man_dir = File.join prefix, "man"
    end

    prepend_destdir_if_present(man_dir)
  end

  def generate_default_dirs
    prefix = options[:prefix]
    site_or_vendor = options[:site_or_vendor]

    if prefix.empty?
      lib_dir = RbConfig::CONFIG[site_or_vendor]
      bin_dir = RbConfig::CONFIG["bindir"]
    else
      lib_dir = File.join prefix, "lib"
      bin_dir = File.join prefix, "bin"
    end

    [prepend_destdir_if_present(lib_dir), prepend_destdir_if_present(bin_dir)]
  end

  def files_in(dir)
    Dir.chdir dir do
      Dir.glob(File.join("**", "*"), File::FNM_DOTMATCH).
        select {|f| !File.directory?(f) }
    end
  end

  def remove_old_bin_files(bin_dir)
    old_bin_files = {
      "gem_mirror" => "gem mirror",
      "gem_server" => "gem server",
      "gemlock" => "gem lock",
      "gemri" => "ri",
      "gemwhich" => "gem which",
      "index_gem_repository.rb" => "gem generate_index",
    }

    old_bin_files.each do |old_bin_file, new_name|
      old_bin_path = File.join bin_dir, old_bin_file
      next unless File.exist? old_bin_path

      deprecation_message = "`#{old_bin_file}` has been deprecated. Use `#{new_name}` instead."

      File.open old_bin_path, "w" do |fp|
        fp.write <<-EOF
#!#{Gem.ruby}

abort "#{deprecation_message}"
    EOF
      end

      next unless Gem.win_platform?

      File.open "#{old_bin_path}.bat", "w" do |fp|
        fp.puts %(@ECHO.#{deprecation_message})
      end
    end
  end

  def remove_old_lib_files(lib_dir)
    lib_dirs = { File.join(lib_dir, "rubygems") => "lib/rubygems" }
    lib_dirs[File.join(lib_dir, "bundler")] = "bundler/lib/bundler"
    lib_dirs.each do |old_lib_dir, new_lib_dir|
      lib_files = files_in(new_lib_dir)

      old_lib_files = files_in(old_lib_dir)

      to_remove = old_lib_files - lib_files

      gauntlet_rubygems = File.join(lib_dir, "gauntlet_rubygems.rb")
      to_remove << gauntlet_rubygems if File.exist? gauntlet_rubygems

      to_remove.delete_if do |file|
        file.start_with? "defaults"
      end

      remove_file_list(to_remove, old_lib_dir)
    end
  end

  def remove_old_man_files(old_man_dir)
    old_man1_dir = "#{old_man_dir}/man1"

    if File.exist?(old_man1_dir)
      man1_to_remove = Dir.chdir(old_man1_dir) { Dir["bundle*.1{,.txt,.ronn}"] }

      remove_file_list(man1_to_remove, old_man1_dir)
    end

    old_man5_dir = "#{old_man_dir}/man5"

    if File.exist?(old_man5_dir)
      man5_to_remove = Dir.chdir(old_man5_dir) { Dir["gemfile.5{,.txt,.ronn}"] }

      remove_file_list(man5_to_remove, old_man5_dir)
    end
  end

  def show_release_notes
    release_notes = File.join Dir.pwd, "CHANGELOG.md"

    release_notes =
      if File.exist? release_notes
        history = File.read release_notes

        history.force_encoding Encoding::UTF_8

        text = history.split(HISTORY_HEADER)
        text.shift # correct an off-by-one generated by split
        version_lines = history.scan(HISTORY_HEADER)
        versions = history.scan(VERSION_MATCHER).flatten.map do |x|
          Gem::Version.new(x)
        end

        history_string = ""

        until versions.length == 0 ||
              versions.shift <= options[:previous_version] do
          history_string += version_lines.shift + text.shift
        end

        history_string
      else
        "Oh-no! Unable to find release notes!"
      end

    say release_notes
  end

  def uninstall_old_gemcutter
    require_relative "../uninstaller"

    ui = Gem::Uninstaller.new("gemcutter", :all => true, :ignore => true,
                              :version => "< 0.4")
    ui.uninstall
  rescue Gem::InstallError
  end

  def regenerate_binstubs(bindir)
    require_relative "pristine_command"
    say "Regenerating binstubs"

    args = %w[--all --only-executables --silent]
    args << "--bindir=#{bindir}"
    if options[:env_shebang]
      args << "--env-shebang"
    end

    command = Gem::Commands::PristineCommand.new
    command.invoke(*args)
  end

  def regenerate_plugins(bindir)
    require_relative "pristine_command"
    say "Regenerating plugins"

    args = %w[--all --only-plugins --silent]
    args << "--bindir=#{bindir}"
    args << "--install-dir=#{default_dir}"

    command = Gem::Commands::PristineCommand.new
    command.invoke(*args)
  end

  private

  def default_dir
    prefix = options[:prefix]

    if prefix.empty?
      dir = Gem.default_dir
    else
      dir = prefix
    end

    prepend_destdir_if_present(dir)
  end

  def prepend_destdir_if_present(path)
    destdir = options[:destdir]
    return path if destdir.empty?

    File.join(options[:destdir], path.gsub(/^[a-zA-Z]:/, ""))
  end

  def install_file_list(files, dest_dir)
    files.each do |file|
      install_file file, dest_dir
    end
  end

  def install_file(file, dest_dir)
    dest_file = File.join dest_dir, file
    dest_dir = File.dirname dest_file
    unless File.directory? dest_dir
      mkdir_p dest_dir, :mode => 0755
    end

    install file, dest_file, :mode => options[:data_mode] || 0644
  end

  def remove_file_list(files, dir)
    Dir.chdir dir do
      files.each do |file|
        FileUtils.rm_f file

        warn "unable to remove old file #{file} please remove it by hand" if
          File.exist? file
      end
    end
  end

  def target_bin_path(bin_dir, bin_file)
    bin_file_formatted = if options[:format_executable]
      Gem.default_exec_format % bin_file
    else
      bin_file
    end
    File.join bin_dir, bin_file_formatted
  end

  def bin_file_names
    @bin_file_names ||= []
  end
end
PK}$[�!��,rubygems/rubygems/commands/server_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"

unless defined? Gem::Commands::ServerCommand
  class Gem::Commands::ServerCommand < Gem::Command
    def initialize
      super("server", "Starts up a web server that hosts the RDoc (requires rubygems-server)")
      begin
        Gem::Specification.find_by_name("rubygems-server").activate
      rescue Gem::LoadError
        # no-op
      end
    end

    def description # :nodoc:
      <<-EOF
The server command has been moved to the rubygems-server gem.
      EOF
    end

    def execute
      alert_error "Install the rubygems-server gem for the server command"
    end
  end
end
PK}$[� Q�$�$,rubygems/rubygems/commands/update_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../command_manager"
require_relative "../dependency_installer"
require_relative "../install_update_options"
require_relative "../local_remote_options"
require_relative "../spec_fetcher"
require_relative "../version_option"
require_relative "../install_message" # must come before rdoc for messaging
require_relative "../rdoc"

class Gem::Commands::UpdateCommand < Gem::Command
  include Gem::InstallUpdateOptions
  include Gem::LocalRemoteOptions
  include Gem::VersionOption

  attr_reader :installer # :nodoc:

  attr_reader :updated # :nodoc:

  def initialize
    options = {
      :force => false,
    }

    options.merge!(install_update_options)

    super "update", "Update installed gems to the latest version", options

    add_install_update_options

    Gem::OptionParser.accept Gem::Version do |value|
      Gem::Version.new value

      value
    end

    add_option("--system [VERSION]", Gem::Version,
               "Update the RubyGems system software") do |value, options|
      value = true unless value

      options[:system] = value
    end

    add_local_remote_options
    add_platform_option
    add_prerelease_option "as update targets"

    @updated   = []
    @installer = nil
  end

  def arguments # :nodoc:
    "GEMNAME       name of gem to update"
  end

  def defaults_str # :nodoc:
    "--no-force --install-dir #{Gem.dir}\n" +
      install_update_defaults_str
  end

  def description # :nodoc:
    <<-EOF
The update command will update your gems to the latest version.

The update command does not remove the previous version. Use the cleanup
command to remove old versions.
    EOF
  end

  def usage # :nodoc:
    "#{program_name} GEMNAME [GEMNAME ...]"
  end

  def check_latest_rubygems(version) # :nodoc:
    if Gem.rubygems_version == version
      say "Latest version already installed. Done."
      terminate_interaction
    end
  end

  def check_oldest_rubygems(version) # :nodoc:
    if oldest_supported_version > version
      alert_error "rubygems #{version} is not supported on #{RUBY_VERSION}. The oldest version supported by this ruby is #{oldest_supported_version}"
      terminate_interaction 1
    end
  end

  def check_update_arguments # :nodoc:
    unless options[:args].empty?
      alert_error "Gem names are not allowed with the --system option"
      terminate_interaction 1
    end
  end

  def execute
    if options[:system]
      update_rubygems
      return
    end

    gems_to_update = which_to_update(
      highest_installed_gems,
      options[:args].uniq
    )

    if options[:explain]
      say "Gems to update:"

      gems_to_update.each do |name_tuple|
        say "  #{name_tuple.full_name}"
      end

      return
    end

    say "Updating installed gems"

    updated = update_gems gems_to_update

    installed_names = highest_installed_gems.keys
    updated_names = updated.map {|spec| spec.name }
    not_updated_names = options[:args].uniq - updated_names
    not_installed_names = not_updated_names - installed_names
    up_to_date_names = not_updated_names - not_installed_names

    if updated.empty?
      say "Nothing to update"
    else
      say "Gems updated: #{updated_names.join(' ')}"
    end
    say "Gems already up-to-date: #{up_to_date_names.join(' ')}" unless up_to_date_names.empty?
    say "Gems not currently installed: #{not_installed_names.join(' ')}" unless not_installed_names.empty?
  end

  def fetch_remote_gems(spec) # :nodoc:
    dependency = Gem::Dependency.new spec.name, "> #{spec.version}"
    dependency.prerelease = options[:prerelease]

    fetcher = Gem::SpecFetcher.fetcher

    spec_tuples, errors = fetcher.search_for_dependency dependency

    error = errors.find {|e| e.respond_to? :exception }

    raise error if error

    spec_tuples
  end

  def highest_installed_gems # :nodoc:
    hig = {} # highest installed gems

    # Get only gem specifications installed as --user-install
    Gem::Specification.dirs = Gem.user_dir if options[:user_install]

    Gem::Specification.each do |spec|
      if hig[spec.name].nil? || hig[spec.name].version < spec.version
        hig[spec.name] = spec
      end
    end

    hig
  end

  def highest_remote_name_tuple(spec) # :nodoc:
    spec_tuples = fetch_remote_gems spec

    highest_remote_gem = spec_tuples.max
    return unless highest_remote_gem

    highest_remote_gem.first
  end

  def install_rubygems(spec) # :nodoc:
    args = update_rubygems_arguments
    version = spec.version

    update_dir = File.join spec.base_dir, "gems", "rubygems-update-#{version}"

    Dir.chdir update_dir do
      say "Installing RubyGems #{version}" unless options[:silent]

      installed = preparing_gem_layout_for(version) do
        system Gem.ruby, "--disable-gems", "setup.rb", *args
      end

      say "RubyGems system software updated" if installed unless options[:silent]
    end
  end

  def preparing_gem_layout_for(version)
    if Gem::Version.new(version) >= Gem::Version.new("3.2.a")
      yield
    else
      require "tmpdir"
      tmpdir = Dir.mktmpdir
      FileUtils.mv Gem.plugindir, tmpdir

      status = yield

      if status
        FileUtils.rm_rf tmpdir
      else
        FileUtils.mv File.join(tmpdir, "plugins"), Gem.plugindir
      end

      status
    end
  end

  def rubygems_target_version
    version = options[:system]
    update_latest = version == true

    unless update_latest
      version     = Gem::Version.new     version
      requirement = Gem::Requirement.new version

      return version, requirement
    end

    version     = Gem::Version.new     Gem::VERSION
    requirement = Gem::Requirement.new ">= #{Gem::VERSION}"

    rubygems_update         = Gem::Specification.new
    rubygems_update.name    = "rubygems-update"
    rubygems_update.version = version

    highest_remote_tup = highest_remote_name_tuple(rubygems_update)
    target = highest_remote_tup ? highest_remote_tup.version : version

    return target, requirement
  end

  def update_gem(name, version = Gem::Requirement.default)
    return if @updated.any? {|spec| spec.name == name }

    update_options = options.dup
    update_options[:prerelease] = version.prerelease?

    @installer = Gem::DependencyInstaller.new update_options

    say "Updating #{name}" unless options[:system] && options[:silent]
    begin
      @installer.install name, Gem::Requirement.new(version)
    rescue Gem::InstallError, Gem::DependencyError => e
      alert_error "Error installing #{name}:\n\t#{e.message}"
    end

    @installer.installed_gems.each do |spec|
      @updated << spec
    end
  end

  def update_gems(gems_to_update)
    gems_to_update.uniq.sort.each do |name_tuple|
      update_gem name_tuple.name, name_tuple.version
    end

    @updated
  end

  ##
  # Update RubyGems software to the latest version.

  def update_rubygems
    if Gem.disable_system_update_message
      alert_error Gem.disable_system_update_message
      terminate_interaction 1
    end

    check_update_arguments

    version, requirement = rubygems_target_version

    check_latest_rubygems version

    check_oldest_rubygems version

    installed_gems = Gem::Specification.find_all_by_name "rubygems-update", requirement
    installed_gems = update_gem("rubygems-update", version) if installed_gems.empty? || installed_gems.first.version != version
    return if installed_gems.empty?

    install_rubygems installed_gems.first
  end

  def update_rubygems_arguments # :nodoc:
    args = []
    args << "--silent" if options[:silent]
    args << "--prefix" << Gem.prefix if Gem.prefix
    args << "--no-document" unless options[:document].include?("rdoc") || options[:document].include?("ri")
    args << "--no-format-executable" if options[:no_format_executable]
    args << "--previous-version" << Gem::VERSION if
      options[:system] == true ||
      Gem::Version.new(options[:system]) >= Gem::Version.new(2)
    args
  end

  def which_to_update(highest_installed_gems, gem_names)
    result = []

    highest_installed_gems.each do |l_name, l_spec|
      next if !gem_names.empty? &&
              gem_names.none? {|name| name == l_spec.name }

      highest_remote_tup = highest_remote_name_tuple l_spec
      next unless highest_remote_tup

      result << highest_remote_tup
    end

    result
  end

  private

  #
  # Oldest version we support downgrading to. This is the version that
  # originally ships with the first patch version of each ruby, because we never
  # test each ruby against older rubygems, so we can't really guarantee it
  # works. Version list can be checked here: https://stdgems.org/rubygems
  #
  def oldest_supported_version
    @oldest_supported_version ||=
      if Gem.ruby_version > Gem::Version.new("3.1.a")
        Gem::Version.new("3.3.3")
      elsif Gem.ruby_version > Gem::Version.new("3.0.a")
        Gem::Version.new("3.2.3")
      elsif Gem.ruby_version > Gem::Version.new("2.7.a")
        Gem::Version.new("3.1.2")
      elsif Gem.ruby_version > Gem::Version.new("2.6.a")
        Gem::Version.new("3.0.1")
      elsif Gem.ruby_version > Gem::Version.new("2.5.a")
        Gem::Version.new("2.7.3")
      elsif Gem.ruby_version > Gem::Version.new("2.4.a")
        Gem::Version.new("2.6.8")
      else
        Gem::Version.new("2.5.2")
      end
  end
end
PK}$[��b!A
A
*rubygems/rubygems/commands/push_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../local_remote_options"
require_relative "../gemcutter_utilities"
require_relative "../package"

class Gem::Commands::PushCommand < Gem::Command
  include Gem::LocalRemoteOptions
  include Gem::GemcutterUtilities

  def description # :nodoc:
    <<-EOF
The push command uploads a gem to the push server (the default is
https://rubygems.org) and adds it to the index.

The gem can be removed from the index and deleted from the server using the yank
command.  For further discussion see the help for the yank command.

The push command will use ~/.gem/credentials to authenticate to a server, but you can use the RubyGems environment variable GEM_HOST_API_KEY to set the api key to authenticate.
    EOF
  end

  def arguments # :nodoc:
    "GEM       built gem to push up"
  end

  def usage # :nodoc:
    "#{program_name} GEM"
  end

  def initialize
    super "push", "Push a gem up to the gem server", :host => self.host

    @user_defined_host = false

    add_proxy_option
    add_key_option
    add_otp_option

    add_option("--host HOST",
               "Push to another gemcutter-compatible host",
               "  (e.g. https://rubygems.org)") do |value, options|
      options[:host] = value
      @user_defined_host = true
    end

    @host = nil
  end

  def execute
    gem_name = get_one_gem_name
    default_gem_server, push_host = get_hosts_for(gem_name)

    @host = if @user_defined_host
      options[:host]
    elsif default_gem_server
      default_gem_server
    elsif push_host
      push_host
    else
      options[:host]
    end

    sign_in @host, scope: get_push_scope

    send_gem(gem_name)
  end

  def send_gem(name)
    args = [:post, "api/v1/gems"]

    _, push_host = get_hosts_for(name)

    @host ||= push_host

    # Always include @host, even if it's nil
    args += [ @host, push_host ]

    say "Pushing gem to #{@host || Gem.host}..."

    response = send_push_request(name, args)

    with_response response
  end

  private

  def send_push_request(name, args)
    rubygems_api_request(*args, scope: get_push_scope) do |request|
      request.body = Gem.read_binary name
      request.add_field "Content-Length", request.body.size
      request.add_field "Content-Type",   "application/octet-stream"
      request.add_field "Authorization",  api_key
    end
  end

  def get_hosts_for(name)
    gem_metadata = Gem::Package.new(name).spec.metadata

    [
      gem_metadata["default_gem_server"],
      gem_metadata["allowed_push_host"],
    ]
  end

  def get_push_scope
    :push_rubygem
  end
end
PK}$[I�t���*rubygems/rubygems/commands/open_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../version_option"

class Gem::Commands::OpenCommand < Gem::Command
  include Gem::VersionOption

  def initialize
    super "open", "Open gem sources in editor"

    add_option("-e", "--editor COMMAND", String,
               "Prepends COMMAND to gem path. Could be used to specify editor.") do |command, options|
      options[:editor] = command || get_env_editor
    end
    add_option("-v", "--version VERSION", String,
               "Opens specific gem version") do |version|
      options[:version] = version
    end
  end

  def arguments # :nodoc:
    "GEMNAME     name of gem to open in editor"
  end

  def defaults_str # :nodoc:
    "-e #{get_env_editor}"
  end

  def description # :nodoc:
    <<-EOF
        The open command opens gem in editor and changes current path
        to gem's source directory.
        Editor command can be specified with -e option, otherwise rubygems
        will look for editor in $EDITOR, $VISUAL and $GEM_EDITOR variables.
    EOF
  end

  def usage # :nodoc:
    "#{program_name} [-e COMMAND] GEMNAME"
  end

  def get_env_editor
    ENV["GEM_EDITOR"] ||
      ENV["VISUAL"] ||
      ENV["EDITOR"] ||
      "vi"
  end

  def execute
    @version = options[:version] || Gem::Requirement.default
    @editor  = options[:editor] || get_env_editor

    found = open_gem(get_one_gem_name)

    terminate_interaction 1 unless found
  end

  def open_gem(name)
    spec = spec_for name

    return false unless spec

    if spec.default_gem?
      say "'#{name}' is a default gem and can't be opened."
      return false
    end

    open_editor(spec.full_gem_path)
  end

  def open_editor(path)
    Dir.chdir(path) do
      system(*@editor.split(/\s+/) + [path])
    end
  end

  def spec_for(name)
    spec = Gem::Specification.find_all_by_name(name, @version).first

    return spec if spec

    say "Unable to find gem '#{name}'"
  end
end
PK}$['����-rubygems/rubygems/commands/sources_command.rbnu�[���# frozen_string_literal: true
require_relative "../command"
require_relative "../remote_fetcher"
require_relative "../spec_fetcher"
require_relative "../local_remote_options"

class Gem::Commands::SourcesCommand < Gem::Command
  include Gem::LocalRemoteOptions

  def initialize
    require "fileutils"

    super "sources",
          "Manage the sources and cache file RubyGems uses to search for gems"

    add_option "-a", "--add SOURCE_URI", "Add source" do |value, options|
      options[:add] = value
    end

    add_option "-l", "--list", "List sources" do |value, options|
      options[:list] = value
    end

    add_option "-r", "--remove SOURCE_URI", "Remove source" do |value, options|
      options[:remove] = value
    end

    add_option "-c", "--clear-all",
               "Remove all sources (clear the cache)" do |value, options|
      options[:clear_all] = value
    end

    add_option "-u", "--update", "Update source cache" do |value, options|
      options[:update] = value
    end

    add_option "-f", "--[no-]force", "Do not show any confirmation prompts and behave as if 'yes' was always answered" do |value, options|
      options[:force] = value
    end

    add_proxy_option
  end

  def add_source(source_uri) # :nodoc:
    check_rubygems_https source_uri

    source = Gem::Source.new source_uri

    check_typo_squatting(source)

    begin
      if Gem.sources.include? source
        say "source #{source_uri} already present in the cache"
      else
        source.load_specs :released
        Gem.sources << source
        Gem.configuration.write

        say "#{source_uri} added to sources"
      end
    rescue URI::Error, ArgumentError
      say "#{source_uri} is not a URI"
      terminate_interaction 1
    rescue Gem::RemoteFetcher::FetchError => e
      say "Error fetching #{Gem::Uri.redact(source.uri)}:\n\t#{e.message}"
      terminate_interaction 1
    end
  end

  def check_typo_squatting(source)
    if source.typo_squatting?("rubygems.org")
      question = <<-QUESTION.chomp
#{source.uri.to_s} is too similar to https://rubygems.org

Do you want to add this source?
      QUESTION

      terminate_interaction 1 unless options[:force] || ask_yes_no(question)
    end
  end

  def check_rubygems_https(source_uri) # :nodoc:
    uri = URI source_uri

    if uri.scheme && uri.scheme.downcase == "http" &&
       uri.host.downcase == "rubygems.org"
      question = <<-QUESTION.chomp
https://rubygems.org is recommended for security over #{uri}

Do you want to add this insecure source?
      QUESTION

      terminate_interaction 1 unless options[:force] || ask_yes_no(question)
    end
  end

  def clear_all # :nodoc:
    path = Gem.spec_cache_dir
    FileUtils.rm_rf path

    unless File.exist? path
      say "*** Removed specs cache ***"
    else
      unless File.writable? path
        say "*** Unable to remove source cache (write protected) ***"
      else
        say "*** Unable to remove source cache ***"
      end

      terminate_interaction 1
    end
  end

  def defaults_str # :nodoc:
    "--list"
  end

  def description # :nodoc:
    <<-EOF
RubyGems fetches gems from the sources you have configured (stored in your
~/.gemrc).

The default source is https://rubygems.org, but you may have other sources
configured.  This guide will help you update your sources or configure
yourself to use your own gem server.

Without any arguments the sources lists your currently configured sources:

  $ gem sources
  *** CURRENT SOURCES ***

  https://rubygems.org

This may list multiple sources or non-rubygems sources.  You probably
configured them before or have an old `~/.gemrc`.  If you have sources you
do not recognize you should remove them.

RubyGems has been configured to serve gems via the following URLs through
its history:

* http://gems.rubyforge.org (RubyGems 1.3.5 and earlier)
* http://rubygems.org       (RubyGems 1.3.6 through 1.8.30, and 2.0.0)
* https://rubygems.org      (RubyGems 2.0.1 and newer)

Since all of these sources point to the same set of gems you only need one
of them in your list.  https://rubygems.org is recommended as it brings the
protections of an SSL connection to gem downloads.

To add a source use the --add argument:

    $ gem sources --add https://rubygems.org
    https://rubygems.org added to sources

RubyGems will check to see if gems can be installed from the source given
before it is added.

To remove a source use the --remove argument:

    $ gem sources --remove https://rubygems.org/
    https://rubygems.org/ removed from sources

    EOF
  end

  def list # :nodoc:
    say "*** CURRENT SOURCES ***"
    say

    Gem.sources.each do |src|
      say src
    end
  end

  def list? # :nodoc:
    !(options[:add] ||
      options[:clear_all] ||
      options[:remove] ||
      options[:update])
  end

  def execute
    clear_all if options[:clear_all]

    source_uri = options[:add]
    add_source source_uri if source_uri

    source_uri = options[:remove]
    remove_source source_uri if source_uri

    update if options[:update]

    list if list?
  end

  def remove_source(source_uri) # :nodoc:
    unless Gem.sources.include? source_uri
      say "source #{source_uri} not present in cache"
    else
      Gem.sources.delete source_uri
      Gem.configuration.write

      say "#{source_uri} removed from sources"
    end
  end

  def update # :nodoc:
    Gem.sources.each_source do |src|
      src.load_specs :released
      src.load_specs :latest
    end

    say "source cache successfully updated"
  end

  def remove_cache_file(desc, path) # :nodoc:
    FileUtils.rm_rf path

    if !File.exist?(path)
      say "*** Removed #{desc} source cache ***"
    elsif !File.writable?(path)
      say "*** Unable to remove #{desc} source cache (write protected) ***"
    else
      say "*** Unable to remove #{desc} source cache ***"
    end
  end
end
PK}$[�7�I�+�+rubygems/rubygems/indexer.rbnu�[���# frozen_string_literal: true
require_relative "../rubygems"
require_relative "package"
require "tmpdir"

##
# Top level class for building the gem repository index.

class Gem::Indexer
  include Gem::UserInteraction

  ##
  # Build indexes for RubyGems 1.2.0 and newer when true

  attr_accessor :build_modern

  ##
  # Index install location

  attr_reader :dest_directory

  ##
  # Specs index install location

  attr_reader :dest_specs_index

  ##
  # Latest specs index install location

  attr_reader :dest_latest_specs_index

  ##
  # Prerelease specs index install location

  attr_reader :dest_prerelease_specs_index

  ##
  # Index build directory

  attr_reader :directory

  ##
  # Create an indexer that will index the gems in +directory+.

  def initialize(directory, options = {})
    require "fileutils"
    require "tmpdir"
    require "zlib"

    options = { :build_modern => true }.merge options

    @build_modern = options[:build_modern]

    @dest_directory = directory
    @directory = Dir.mktmpdir "gem_generate_index"

    marshal_name = "Marshal.#{Gem.marshal_version}"

    @master_index = File.join @directory, "yaml"
    @marshal_index = File.join @directory, marshal_name

    @quick_dir = File.join @directory, "quick"
    @quick_marshal_dir = File.join @quick_dir, marshal_name
    @quick_marshal_dir_base = File.join "quick", marshal_name # FIX: UGH

    @quick_index = File.join @quick_dir, "index"
    @latest_index = File.join @quick_dir, "latest_index"

    @specs_index = File.join @directory, "specs.#{Gem.marshal_version}"
    @latest_specs_index =
      File.join(@directory, "latest_specs.#{Gem.marshal_version}")
    @prerelease_specs_index =
      File.join(@directory, "prerelease_specs.#{Gem.marshal_version}")
    @dest_specs_index =
      File.join(@dest_directory, "specs.#{Gem.marshal_version}")
    @dest_latest_specs_index =
      File.join(@dest_directory, "latest_specs.#{Gem.marshal_version}")
    @dest_prerelease_specs_index =
      File.join(@dest_directory, "prerelease_specs.#{Gem.marshal_version}")

    @files = []
  end

  ##
  # Build various indices

  def build_indices
    specs = map_gems_to_specs gem_file_list
    Gem::Specification._resort! specs
    build_marshal_gemspecs specs
    build_modern_indices specs if @build_modern

    compress_indices
  end

  ##
  # Builds Marshal quick index gemspecs.

  def build_marshal_gemspecs(specs)
    count = specs.count
    progress = ui.progress_reporter count,
                                    "Generating Marshal quick index gemspecs for #{count} gems",
                                    "Complete"

    files = []

    Gem.time "Generated Marshal quick index gemspecs" do
      specs.each do |spec|
        next if spec.default_gem?
        spec_file_name = "#{spec.original_name}.gemspec.rz"
        marshal_name = File.join @quick_marshal_dir, spec_file_name

        marshal_zipped = Gem.deflate Marshal.dump(spec)

        File.open marshal_name, "wb" do |io|
          io.write marshal_zipped
        end

        files << marshal_name

        progress.updated spec.original_name
      end

      progress.done
    end

    @files << @quick_marshal_dir

    files
  end

  ##
  # Build a single index for RubyGems 1.2 and newer

  def build_modern_index(index, file, name)
    say "Generating #{name} index"

    Gem.time "Generated #{name} index" do
      File.open(file, "wb") do |io|
        specs = index.map do |*spec|
          # We have to splat here because latest_specs is an array, while the
          # others are hashes.
          spec = spec.flatten.last
          platform = spec.original_platform

          # win32-api-1.0.4-x86-mswin32-60
          unless String === platform
            alert_warning "Skipping invalid platform in gem: #{spec.full_name}"
            next
          end

          platform = Gem::Platform::RUBY if platform.nil? || platform.empty?
          [spec.name, spec.version, platform]
        end

        specs = compact_specs(specs)
        Marshal.dump(specs, io)
      end
    end
  end

  ##
  # Builds indices for RubyGems 1.2 and newer. Handles full, latest, prerelease

  def build_modern_indices(specs)
    prerelease, released = specs.partition do |s|
      s.version.prerelease?
    end
    latest_specs =
      Gem::Specification._latest_specs specs

    build_modern_index(released.sort, @specs_index, "specs")
    build_modern_index(latest_specs.sort, @latest_specs_index, "latest specs")
    build_modern_index(prerelease.sort, @prerelease_specs_index,
                       "prerelease specs")

    @files += [@specs_index,
               "#{@specs_index}.gz",
               @latest_specs_index,
               "#{@latest_specs_index}.gz",
               @prerelease_specs_index,
               "#{@prerelease_specs_index}.gz"]
  end

  def map_gems_to_specs(gems)
    gems.map do |gemfile|
      if File.size(gemfile) == 0
        alert_warning "Skipping zero-length gem: #{gemfile}"
        next
      end

      begin
        spec = Gem::Package.new(gemfile).spec
        spec.loaded_from = gemfile

        spec.abbreviate
        spec.sanitize

        spec
      rescue SignalException
        alert_error "Received signal, exiting"
        raise
      rescue Exception => e
        msg = ["Unable to process #{gemfile}",
               "#{e.message} (#{e.class})",
               "\t#{e.backtrace.join "\n\t"}"].join("\n")
        alert_error msg
      end
    end.compact
  end

  ##
  # Compresses indices on disk
  #--
  # All future files should be compressed using gzip, not deflate

  def compress_indices
    say "Compressing indices"

    Gem.time "Compressed indices" do
      if @build_modern
        gzip @specs_index
        gzip @latest_specs_index
        gzip @prerelease_specs_index
      end
    end
  end

  ##
  # Compacts Marshal output for the specs index data source by using identical
  # objects as much as possible.

  def compact_specs(specs)
    names = {}
    versions = {}
    platforms = {}

    specs.map do |(name, version, platform)|
      names[name] = name unless names.include? name
      versions[version] = version unless versions.include? version
      platforms[platform] = platform unless platforms.include? platform

      [names[name], versions[version], platforms[platform]]
    end
  end

  ##
  # Compress +filename+ with +extension+.

  def compress(filename, extension)
    data = Gem.read_binary filename

    zipped = Gem.deflate data

    File.open "#{filename}.#{extension}", "wb" do |io|
      io.write zipped
    end
  end

  ##
  # List of gem file names to index.

  def gem_file_list
    Gem::Util.glob_files_in_dir("*.gem", File.join(@dest_directory, "gems"))
  end

  ##
  # Builds and installs indices.

  def generate_index
    make_temp_directories
    build_indices
    install_indices
  rescue SignalException
  ensure
    FileUtils.rm_rf @directory
  end

  ##
  # Zlib::GzipWriter wrapper that gzips +filename+ on disk.

  def gzip(filename)
    Zlib::GzipWriter.open "#{filename}.gz" do |io|
      io.write Gem.read_binary(filename)
    end
  end

  ##
  # Install generated indices into the destination directory.

  def install_indices
    verbose = Gem.configuration.really_verbose

    say "Moving index into production dir #{@dest_directory}" if verbose

    files = @files
    files.delete @quick_marshal_dir if files.include? @quick_dir

    if files.include?(@quick_marshal_dir) && !files.include?(@quick_dir)
      files.delete @quick_marshal_dir

      dst_name = File.join(@dest_directory, @quick_marshal_dir_base)

      FileUtils.mkdir_p File.dirname(dst_name), :verbose => verbose
      FileUtils.rm_rf dst_name, :verbose => verbose
      FileUtils.mv(@quick_marshal_dir, dst_name,
                   :verbose => verbose, :force => true)
    end

    files = files.map do |path|
      path.sub(/^#{Regexp.escape @directory}\/?/, "") # HACK?
    end

    files.each do |file|
      src_name = File.join @directory, file
      dst_name = File.join @dest_directory, file

      FileUtils.rm_rf dst_name, :verbose => verbose
      FileUtils.mv(src_name, @dest_directory,
                   :verbose => verbose, :force => true)
    end
  end

  ##
  # Make directories for index generation

  def make_temp_directories
    FileUtils.rm_rf @directory
    FileUtils.mkdir_p @directory, :mode => 0700
    FileUtils.mkdir_p @quick_marshal_dir
  end

  ##
  # Ensure +path+ and path with +extension+ are identical.

  def paranoid(path, extension)
    data = Gem.read_binary path
    compressed_data = Gem.read_binary "#{path}.#{extension}"

    unless data == Gem::Util.inflate(compressed_data)
      raise "Compressed file #{compressed_path} does not match uncompressed file #{path}"
    end
  end

  ##
  # Perform an in-place update of the repository from newly added gems.

  def update_index
    make_temp_directories

    specs_mtime = File.stat(@dest_specs_index).mtime
    newest_mtime = Time.at 0

    updated_gems = gem_file_list.select do |gem|
      gem_mtime = File.stat(gem).mtime
      newest_mtime = gem_mtime if gem_mtime > newest_mtime
      gem_mtime >= specs_mtime
    end

    if updated_gems.empty?
      say "No new gems"
      terminate_interaction 0
    end

    specs = map_gems_to_specs updated_gems
    prerelease, released = specs.partition {|s| s.version.prerelease? }

    files = build_marshal_gemspecs specs

    Gem.time "Updated indexes" do
      update_specs_index released, @dest_specs_index, @specs_index
      update_specs_index released, @dest_latest_specs_index, @latest_specs_index
      update_specs_index(prerelease,
                         @dest_prerelease_specs_index,
                         @prerelease_specs_index)
    end

    compress_indices

    verbose = Gem.configuration.really_verbose

    say "Updating production dir #{@dest_directory}" if verbose

    files << @specs_index
    files << "#{@specs_index}.gz"
    files << @latest_specs_index
    files << "#{@latest_specs_index}.gz"
    files << @prerelease_specs_index
    files << "#{@prerelease_specs_index}.gz"

    files = files.map do |path|
      path.sub(/^#{Regexp.escape @directory}\/?/, "") # HACK?
    end

    files.each do |file|
      src_name = File.join @directory, file
      dst_name = File.join @dest_directory, file # REFACTOR: duped above

      FileUtils.mv src_name, dst_name, :verbose => verbose,
                   :force => true

      File.utime newest_mtime, newest_mtime, dst_name
    end
  ensure
    FileUtils.rm_rf @directory
  end

  ##
  # Combines specs in +index+ and +source+ then writes out a new copy to
  # +dest+.  For a latest index, does not ensure the new file is minimal.

  def update_specs_index(index, source, dest)
    specs_index = Marshal.load Gem.read_binary(source)

    index.each do |spec|
      platform = spec.original_platform
      platform = Gem::Platform::RUBY if platform.nil? || platform.empty?
      specs_index << [spec.name, spec.version, platform]
    end

    specs_index = compact_specs specs_index.uniq.sort

    File.open dest, "wb" do |io|
      Marshal.dump specs_index, io
    end
  end
end
PK}$[�,�YN	N	rubygems/rubygems/uri.rbnu�[���# frozen_string_literal: true

##
# The Uri handles rubygems source URIs.
#

class Gem::Uri
  ##
  # Parses and redacts uri

  def self.redact(uri)
    new(uri).redacted
  end

  ##
  # Parses uri, raising if it's invalid

  def self.parse!(uri)
    require "uri"

    raise URI::InvalidURIError unless uri

    return uri unless uri.is_a?(String)

    # Always escape URI's to deal with potential spaces and such
    # It should also be considered that source_uri may already be
    # a valid URI with escaped characters. e.g. "{DESede}" is encoded
    # as "%7BDESede%7D". If this is escaped again the percentage
    # symbols will be escaped.
    begin
      URI.parse(uri)
    rescue URI::InvalidURIError
      URI.parse(URI::DEFAULT_PARSER.escape(uri))
    end
  end

  ##
  # Parses uri, returning the original uri if it's invalid

  def self.parse(uri)
    parse!(uri)
  rescue URI::InvalidURIError
    uri
  end

  def initialize(source_uri)
    @parsed_uri = parse(source_uri)
  end

  def redacted
    return self unless valid_uri?

    if token? || oauth_basic?
      with_redacted_user
    elsif password?
      with_redacted_password
    else
      self
    end
  end

  def to_s
    @parsed_uri.to_s
  end

  def redact_credentials_from(text)
    return text unless valid_uri? && password? && text.include?(to_s)

    text.sub(password, "REDACTED")
  end

  def method_missing(method_name, *args, &blk)
    if @parsed_uri.respond_to?(method_name)
      @parsed_uri.send(method_name, *args, &blk)
    else
      super
    end
  end

  def respond_to_missing?(method_name, include_private = false)
    @parsed_uri.respond_to?(method_name, include_private) || super
  end

  protected

  # Add a protected reader for the cloned instance to access the original object's parsed uri
  attr_reader :parsed_uri

  private

  def parse!(uri)
    self.class.parse!(uri)
  end

  def parse(uri)
    self.class.parse(uri)
  end

  def with_redacted_user
    clone.tap {|uri| uri.user = "REDACTED" }
  end

  def with_redacted_password
    clone.tap {|uri| uri.password = "REDACTED" }
  end

  def valid_uri?
    !@parsed_uri.is_a?(String)
  end

  def password?
    !!password
  end

  def oauth_basic?
    password == "x-oauth-basic"
  end

  def token?
    !user.nil? && password.nil?
  end

  def initialize_copy(original)
    @parsed_uri = original.parsed_uri.clone
  end
end
PK}$[S�,��rubygems/rubygems/doctor.rbnu�[���# frozen_string_literal: true
require_relative "../rubygems"
require_relative "user_interaction"

##
# Cleans up after a partially-failed uninstall or for an invalid
# Gem::Specification.
#
# If a specification was removed by hand this will remove any remaining files.
#
# If a corrupt specification was installed this will clean up warnings by
# removing the bogus specification.

class Gem::Doctor
  include Gem::UserInteraction

  ##
  # Maps a gem subdirectory to the files that are expected to exist in the
  # subdirectory.

  REPOSITORY_EXTENSION_MAP = [ # :nodoc:
    ["specifications", ".gemspec"],
    ["build_info",     ".info"],
    ["cache",          ".gem"],
    ["doc",            ""],
    ["extensions",     ""],
    ["gems",           ""],
    ["plugins",        ""],
  ].freeze

  missing =
    Gem::REPOSITORY_SUBDIRECTORIES.sort -
    REPOSITORY_EXTENSION_MAP.map {|(k,_)| k }.sort

  raise "Update REPOSITORY_EXTENSION_MAP, missing: #{missing.join ', '}" unless
    missing.empty?

  ##
  # Creates a new Gem::Doctor that will clean up +gem_repository+.  Only one
  # gem repository may be cleaned at a time.
  #
  # If +dry_run+ is true no files or directories will be removed.

  def initialize(gem_repository, dry_run = false)
    @gem_repository = gem_repository
    @dry_run        = dry_run

    @installed_specs = nil
  end

  ##
  # Specs installed in this gem repository

  def installed_specs # :nodoc:
    @installed_specs ||= Gem::Specification.map {|s| s.full_name }
  end

  ##
  # Are we doctoring a gem repository?

  def gem_repository?
    !installed_specs.empty?
  end

  ##
  # Cleans up uninstalled files and invalid gem specifications

  def doctor
    @orig_home = Gem.dir
    @orig_path = Gem.path

    say "Checking #{@gem_repository}"

    Gem.use_paths @gem_repository.to_s

    unless gem_repository?
      say "This directory does not appear to be a RubyGems repository, " +
          "skipping"
      say
      return
    end

    doctor_children

    say
  ensure
    Gem.use_paths @orig_home, *@orig_path
  end

  ##
  # Cleans up children of this gem repository

  def doctor_children # :nodoc:
    REPOSITORY_EXTENSION_MAP.each do |sub_directory, extension|
      doctor_child sub_directory, extension
    end
  end

  ##
  # Removes files in +sub_directory+ with +extension+

  def doctor_child(sub_directory, extension) # :nodoc:
    directory = File.join(@gem_repository, sub_directory)

    Dir.entries(directory).sort.each do |ent|
      next if ent == "." || ent == ".."

      child = File.join(directory, ent)
      next unless File.exist?(child)

      basename = File.basename(child, extension)
      next if installed_specs.include? basename
      next if /^rubygems-\d/ =~ basename
      next if "specifications" == sub_directory && "default" == basename
      next if "plugins" == sub_directory && Gem.plugin_suffix_regexp =~ (basename)

      type = File.directory?(child) ? "directory" : "file"

      action = if @dry_run
        "Extra"
      else
        FileUtils.rm_r(child)
        "Removed"
      end

      say "#{action} #{type} #{sub_directory}/#{File.basename(child)}"
    end
  rescue Errno::ENOENT
    # ignore
  end
end
PK}$[��;}}rubygems/rubygems/openssl.rbnu�[���# frozen_string_literal: true

autoload :OpenSSL, "openssl"

module Gem
  HAVE_OPENSSL = defined? OpenSSL::SSL # :nodoc:
end
PK}$[p7�,,!rubygems/rubygems/package_task.rbnu�[���# frozen_string_literal: true
# Copyright (c) 2003, 2004 Jim Weirich, 2009 Eric Hodel
#
# 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.

require_relative "../rubygems"
require_relative "package"
require "rake/packagetask"

##
# Create a package based upon a Gem::Specification.  Gem packages, as well as
# zip files and tar/gzipped packages can be produced by this task.
#
# In addition to the Rake targets generated by Rake::PackageTask, a
# Gem::PackageTask will also generate the following tasks:
#
# [<b>"<em>package_dir</em>/<em>name</em>-<em>version</em>.gem"</b>]
#   Create a RubyGems package with the given name and version.
#
# Example using a Gem::Specification:
#
#   require 'rubygems'
#   require 'rubygems/package_task'
#
#   spec = Gem::Specification.new do |s|
#     s.summary = "Ruby based make-like utility."
#     s.name = 'rake'
#     s.version = PKG_VERSION
#     s.requirements << 'none'
#     s.files = PKG_FILES
#     s.description = <<-EOF
#   Rake is a Make-like program implemented in Ruby. Tasks
#   and dependencies are specified in standard Ruby syntax.
#     EOF
#   end
#
#   Gem::PackageTask.new(spec) do |pkg|
#     pkg.need_zip = true
#     pkg.need_tar = true
#   end

class Gem::PackageTask < Rake::PackageTask
  ##
  # Ruby Gem::Specification containing the metadata for this package.  The
  # name, version and package_files are automatically determined from the
  # gemspec and don't need to be explicitly provided.

  attr_accessor :gem_spec

  ##
  # Create a Gem Package task library.  Automatically define the gem if a
  # block is given.  If no block is supplied, then #define needs to be called
  # to define the task.

  def initialize(gem_spec)
    init gem_spec
    yield self if block_given?
    define if block_given?
  end

  ##
  # Initialization tasks without the "yield self" or define operations.

  def init(gem)
    super gem.full_name, :noversion
    @gem_spec = gem
    @package_files += gem_spec.files if gem_spec.files
    @fileutils_output = $stdout
  end

  ##
  # Create the Rake tasks and actions specified by this Gem::PackageTask.
  # (+define+ is automatically called if a block is given to +new+).

  def define
    super

    gem_file = File.basename gem_spec.cache_file
    gem_path = File.join package_dir, gem_file
    gem_dir  = File.join package_dir, gem_spec.full_name

    task :package => [:gem]

    directory package_dir
    directory gem_dir

    desc "Build the gem file #{gem_file}"
    task :gem => [gem_path]

    trace = Rake.application.options.trace
    Gem.configuration.verbose = trace

    file gem_path => [package_dir, gem_dir] + @gem_spec.files do
      chdir(gem_dir) do
        when_writing "Creating #{gem_spec.file_name}" do
          Gem::Package.build gem_spec

          verbose trace do
            mv gem_file, ".."
          end
        end
      end
    end
  end
end
PK}$[�N�DBBrubygems/rubygems/tsort.rbnu�[���# frozen_string_literal: true

require_relative "tsort/lib/tsort"
PK}$[���jj+rubygems/rubygems/install_update_options.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require_relative "../rubygems"
require_relative "security_option"

##
# Mixin methods for install and update options for Gem::Commands

module Gem::InstallUpdateOptions
  include Gem::SecurityOption

  ##
  # Add the install/update options to the option parser.

  def add_install_update_options
    add_option(:"Install/Update", "-i", "--install-dir DIR",
               "Gem repository directory to get installed",
               "gems") do |value, options|
      options[:install_dir] = File.expand_path(value)
    end

    add_option(:"Install/Update", "-n", "--bindir DIR",
               "Directory where executables will be",
               "placed when the gem is installed") do |value, options|
      options[:bin_dir] = File.expand_path(value)
    end

    add_option(:"Install/Update", "--document [TYPES]", Array,
               "Generate documentation for installed gems",
               "List the documentation types you wish to",
               "generate.  For example: rdoc,ri") do |value, options|
      options[:document] = case value
      when nil   then %w[ri]
      when false then []
      else            value
      end
    end

    add_option(:"Install/Update", "--build-root DIR",
               "Temporary installation root. Useful for building",
               "packages. Do not use this when installing remote gems.") do |value, options|
      options[:build_root] = File.expand_path(value)
    end

    add_option(:"Install/Update", "--vendor",
               "Install gem into the vendor directory.",
               "Only for use by gem repackagers.") do |value, options|
      unless Gem.vendor_dir
        raise Gem::OptionParser::InvalidOption.new "your platform is not supported"
      end

      options[:vendor] = true
      options[:install_dir] = Gem.vendor_dir
    end

    add_option(:"Install/Update", "-N", "--no-document",
               "Disable documentation generation") do |value, options|
      options[:document] = []
    end

    add_option(:"Install/Update", "-E", "--[no-]env-shebang",
               "Rewrite the shebang line on installed",
               "scripts to use /usr/bin/env") do |value, options|
      options[:env_shebang] = value
    end

    add_option(:"Install/Update", "-f", "--[no-]force",
               "Force gem to install, bypassing dependency",
               "checks") do |value, options|
      options[:force] = value
    end

    add_option(:"Install/Update", "-w", "--[no-]wrappers",
               "Use bin wrappers for executables",
               "Not available on dosish platforms") do |value, options|
      options[:wrappers] = value
    end

    add_security_option

    add_option(:"Install/Update", "--ignore-dependencies",
               "Do not install any required dependent gems") do |value, options|
      options[:ignore_dependencies] = value
    end

    add_option(:"Install/Update", "--[no-]format-executable",
               "Make installed executable names match Ruby.",
               "If Ruby is ruby18, foo_exec will be",
               "foo_exec18") do |value, options|
      options[:format_executable] = value
    end

    add_option(:"Install/Update", "--[no-]user-install",
               "Install in user's home directory instead",
               "of GEM_HOME.") do |value, options|
      options[:user_install] = value
    end

    add_option(:"Install/Update", "--development",
                "Install additional development",
                "dependencies") do |value, options|
      options[:development] = true
      options[:dev_shallow] = true
    end

    add_option(:"Install/Update", "--development-all",
                "Install development dependencies for all",
                "gems (including dev deps themselves)") do |value, options|
      options[:development] = true
      options[:dev_shallow] = false
    end

    add_option(:"Install/Update", "--conservative",
                "Don't attempt to upgrade gems already",
                "meeting version requirement") do |value, options|
      options[:conservative] = true
      options[:minimal_deps] = true
    end

    add_option(:"Install/Update", "--[no-]minimal-deps",
                "Don't upgrade any dependencies that already",
                "meet version requirements") do |value, options|
      options[:minimal_deps] = value
    end

    add_option(:"Install/Update", "--[no-]post-install-message",
                "Print post install message") do |value, options|
      options[:post_install_message] = value
    end

    add_option(:"Install/Update", "-g", "--file [FILE]",
               "Read from a gem dependencies API file and",
               "install the listed gems") do |v,o|
      v = Gem::GEM_DEP_FILES.find do |file|
        File.exist? file
      end unless v

      unless v
        message = v ? v : "(tried #{Gem::GEM_DEP_FILES.join ', '})"

        raise Gem::OptionParser::InvalidArgument,
                "cannot find gem dependencies file #{message}"
      end

      options[:gemdeps] = v
    end

    add_option(:"Install/Update", "--without GROUPS", Array,
               "Omit the named groups (comma separated)",
               "when installing from a gem dependencies",
               "file") do |v,o|
      options[:without_groups].concat v.map {|without| without.intern }
    end

    add_option(:"Install/Update", "--default",
               "Add the gem's full specification to",
               "specifications/default and extract only its bin") do |v,o|
      options[:install_as_default] = v
    end

    add_option(:"Install/Update", "--explain",
               "Rather than install the gems, indicate which would",
               "be installed") do |v,o|
      options[:explain] = v
    end

    add_option(:"Install/Update", "--[no-]lock",
               "Create a lock file (when used with -g/--file)") do |v,o|
      options[:lock] = v
    end

    add_option(:"Install/Update", "--[no-]suggestions",
               "Suggest alternates when gems are not found") do |v,o|
      options[:suggest_alternate] = v
    end
  end

  ##
  # Default options for the gem install and update commands.

  def install_update_options
    {
      :document => %w[ri],
    }
  end

  ##
  # Default description for the gem install and update commands.

  def install_update_defaults_str
    "--document=ri"
  end

end
PK}$[sI�

rubygems/rubygems/util.rbnu�[���# frozen_string_literal: true
require_relative "deprecate"

##
# This module contains various utility methods as module methods.

module Gem::Util

  ##
  # Zlib::GzipReader wrapper that unzips +data+.

  def self.gunzip(data)
    require "zlib"
    require "stringio"
    data = StringIO.new(data, "r")

    gzip_reader = begin
                    Zlib::GzipReader.new(data)
                  rescue Zlib::GzipFile::Error => e
                    raise e.class, e.inspect, e.backtrace
                  end

    unzipped = gzip_reader.read
    unzipped.force_encoding Encoding::BINARY
    unzipped
  end

  ##
  # Zlib::GzipWriter wrapper that zips +data+.

  def self.gzip(data)
    require "zlib"
    require "stringio"
    zipped = StringIO.new(String.new, "w")
    zipped.set_encoding Encoding::BINARY

    Zlib::GzipWriter.wrap zipped do |io|
      io.write data
    end

    zipped.string
  end

  ##
  # A Zlib::Inflate#inflate wrapper

  def self.inflate(data)
    require "zlib"
    Zlib::Inflate.inflate data
  end

  ##
  # This calls IO.popen and reads the result

  def self.popen(*command)
    IO.popen command, &:read
  end

  ##
  # Invokes system, but silences all output.

  def self.silent_system(*command)
    opt = { :out => IO::NULL, :err => [:child, :out] }
    if Hash === command.last
      opt.update(command.last)
      cmds = command[0...-1]
    else
      cmds = command.dup
    end
    system(*(cmds << opt))
  end

  class << self
    extend Gem::Deprecate

    rubygems_deprecate :silent_system
  end

  ##
  # Enumerates the parents of +directory+.

  def self.traverse_parents(directory, &block)
    return enum_for __method__, directory unless block_given?

    here = File.expand_path directory
    loop do
      Dir.chdir here, &block rescue Errno::EACCES

      new_here = File.expand_path("..", here)
      return if new_here == here # toplevel
      here = new_here
    end
  end

  ##
  # Globs for files matching +pattern+ inside of +directory+,
  # returning absolute paths to the matching files.

  def self.glob_files_in_dir(glob, base_path)
    if RUBY_VERSION >= "2.5"
      Dir.glob(glob, base: base_path).map! {|f| File.expand_path(f, base_path) }
    else
      Dir.glob(File.expand_path(glob, base_path))
    end
  end

  ##
  # Corrects +path+ (usually returned by `URI.parse().path` on Windows), that
  # comes with a leading slash.

  def self.correct_for_windows_path(path)
    if path[0].chr == "/" && path[1].chr =~ /[a-z]/i && path[2].chr == ":"
      path[1..-1]
    else
      path
    end
  end

end
PK}$[4}E��(rubygems/rubygems/basic_specification.rbnu�[���# frozen_string_literal: true
##
# BasicSpecification is an abstract class which implements some common code
# used by both Specification and StubSpecification.

class Gem::BasicSpecification
  ##
  # Allows installation of extensions for git: gems.

  attr_writer :base_dir # :nodoc:

  ##
  # Sets the directory where extensions for this gem will be installed.

  attr_writer :extension_dir # :nodoc:

  ##
  # Is this specification ignored for activation purposes?

  attr_writer :ignored # :nodoc:

  ##
  # The path this gemspec was loaded from.  This attribute is not persisted.

  attr_accessor :loaded_from

  ##
  # Allows correct activation of git: and path: gems.

  attr_writer :full_gem_path # :nodoc:

  def initialize
    internal_init
  end

  def self.default_specifications_dir
    Gem.default_specifications_dir
  end

  class << self
    extend Gem::Deprecate
    rubygems_deprecate :default_specifications_dir, "Gem.default_specifications_dir"
  end

  ##
  # The path to the gem.build_complete file within the extension install
  # directory.

  def gem_build_complete_path # :nodoc:
    File.join extension_dir, "gem.build_complete"
  end

  ##
  # True when the gem has been activated

  def activated?
    raise NotImplementedError
  end

  ##
  # Returns the full path to the base gem directory.
  #
  # eg: /usr/local/lib/ruby/gems/1.8

  def base_dir
    raise NotImplementedError
  end

  ##
  # Return true if this spec can require +file+.

  def contains_requirable_file?(file)
    if @ignored
      return false
    elsif missing_extensions?
      @ignored = true

      if Gem::Platform::RUBY == platform || Gem::Platform.local === platform
        warn "Ignoring #{full_name} because its extensions are not built. " +
             "Try: gem pristine #{name} --version #{version}"
      end

      return false
    end

    have_file? file, Gem.suffixes
  end

  def default_gem?
    loaded_from &&
      File.dirname(loaded_from) == Gem.default_specifications_dir
  end

  ##
  # Returns full path to the directory where gem's extensions are installed.

  def extension_dir
    @extension_dir ||= File.expand_path(File.join(extensions_dir, full_name)).tap(&Gem::UNTAINT)
  end

  ##
  # Returns path to the extensions directory.

  def extensions_dir
    Gem.default_ext_dir_for(base_dir) ||
      File.join(base_dir, "extensions", Gem::Platform.local.to_s,
                Gem.extension_api_version)
  end

  def find_full_gem_path # :nodoc:
    # TODO: also, shouldn't it default to full_name if it hasn't been written?
    path = File.expand_path File.join(gems_dir, full_name)
    path.tap(&Gem::UNTAINT)
    path
  end

  private :find_full_gem_path

  ##
  # The full path to the gem (install path + full name).

  def full_gem_path
    # TODO: This is a heavily used method by gems, so we'll need
    # to aleast just alias it to #gem_dir rather than remove it.
    @full_gem_path ||= find_full_gem_path
  end

  ##
  # Returns the full name (name-version) of this Gem.  Platform information
  # is included (name-version-platform) if it is specified and not the
  # default Ruby platform.

  def full_name
    if platform == Gem::Platform::RUBY || platform.nil?
      "#{name}-#{version}".dup.tap(&Gem::UNTAINT)
    else
      "#{name}-#{version}-#{platform}".dup.tap(&Gem::UNTAINT)
    end
  end

  ##
  # Full paths in the gem to add to <code>$LOAD_PATH</code> when this gem is
  # activated.

  def full_require_paths
    @full_require_paths ||=
    begin
      full_paths = raw_require_paths.map do |path|
        File.join full_gem_path, path.tap(&Gem::UNTAINT)
      end

      full_paths << extension_dir if have_extensions?

      full_paths
    end
  end

  ##
  # The path to the data directory for this gem.

  def datadir
    # TODO: drop the extra ", gem_name" which is uselessly redundant
    File.expand_path(File.join(gems_dir, full_name, "data", name)).tap(&Gem::UNTAINT)
  end

  ##
  # Full path of the target library file.
  # If the file is not in this gem, return nil.

  def to_fullpath(path)
    if activated?
      @paths_map ||= {}
      @paths_map[path] ||=
      begin
        fullpath = nil
        suffixes = Gem.suffixes
        suffixes.find do |suf|
          full_require_paths.find do |dir|
            File.file?(fullpath = "#{dir}/#{path}#{suf}")
          end
        end ? fullpath : nil
      end
    else
      nil
    end
  end

  ##
  # Returns the full path to this spec's gem directory.
  # eg: /usr/local/lib/ruby/1.8/gems/mygem-1.0

  def gem_dir
    @gem_dir ||= File.expand_path File.join(gems_dir, full_name)
  end

  ##
  # Returns the full path to the gems directory containing this spec's
  # gem directory. eg: /usr/local/lib/ruby/1.8/gems

  def gems_dir
    raise NotImplementedError
  end

  def internal_init # :nodoc:
    @extension_dir = nil
    @full_gem_path = nil
    @gem_dir = nil
    @ignored = nil
  end

  ##
  # Name of the gem

  def name
    raise NotImplementedError
  end

  ##
  # Platform of the gem

  def platform
    raise NotImplementedError
  end

  def raw_require_paths # :nodoc:
    raise NotImplementedError
  end

  ##
  # Paths in the gem to add to <code>$LOAD_PATH</code> when this gem is
  # activated.
  #
  # See also #require_paths=
  #
  # If you have an extension you do not need to add <code>"ext"</code> to the
  # require path, the extension build process will copy the extension files
  # into "lib" for you.
  #
  # The default value is <code>"lib"</code>
  #
  # Usage:
  #
  #   # If all library files are in the root directory...
  #   spec.require_path = '.'

  def require_paths
    return raw_require_paths unless have_extensions?

    [extension_dir].concat raw_require_paths
  end

  ##
  # Returns the paths to the source files for use with analysis and
  # documentation tools.  These paths are relative to full_gem_path.

  def source_paths
    paths = raw_require_paths.dup

    if have_extensions?
      ext_dirs = extensions.map do |extension|
        extension.split(File::SEPARATOR, 2).first
      end.uniq

      paths.concat ext_dirs
    end

    paths.uniq
  end

  ##
  # Return all files in this gem that match for +glob+.

  def matches_for_glob(glob) # TODO: rename?
    glob = File.join(self.lib_dirs_glob, glob)

    Dir[glob].map {|f| f.tap(&Gem::UNTAINT) } # FIX our tests are broken, run w/ SAFE=1
  end

  ##
  # Returns the list of plugins in this spec.

  def plugins
    matches_for_glob("rubygems#{Gem.plugin_suffix_pattern}")
  end

  ##
  # Returns a string usable in Dir.glob to match all requirable paths
  # for this spec.

  def lib_dirs_glob
    dirs = if self.raw_require_paths
      if self.raw_require_paths.size > 1
        "{#{self.raw_require_paths.join(',')}}"
      else
        self.raw_require_paths.first
      end
    else
      "lib" # default value for require_paths for bundler/inline
    end

    "#{self.full_gem_path}/#{dirs}".dup.tap(&Gem::UNTAINT)
  end

  ##
  # Return a Gem::Specification from this gem

  def to_spec
    raise NotImplementedError
  end

  ##
  # Version of the gem

  def version
    raise NotImplementedError
  end

  ##
  # Whether this specification is stubbed - i.e. we have information
  # about the gem from a stub line, without having to evaluate the
  # entire gemspec file.
  def stubbed?
    raise NotImplementedError
  end

  def this; self; end

  private

  def have_extensions?; !extensions.empty?; end

  def have_file?(file, suffixes)
    return true if raw_require_paths.any? do |path|
      base = File.join(gems_dir, full_name, path.tap(&Gem::UNTAINT), file).tap(&Gem::UNTAINT)
      suffixes.any? {|suf| File.file? base + suf }
    end

    if have_extensions?
      base = File.join extension_dir, file
      suffixes.any? {|suf| File.file? base + suf }
    else
      false
    end
  end
end
PK}$[--&@IIrubygems/rubygems/util/list.rbnu�[���# frozen_string_literal: true
module Gem
  class List
    include Enumerable
    attr_accessor :value, :tail

    def initialize(value = nil, tail = nil)
      @value = value
      @tail = tail
    end

    def each
      n = self
      while n
        yield n.value
        n = n.tail
      end
    end

    def to_a
      super.reverse
    end

    def prepend(value)
      List.new value, self
    end

    def pretty_print(q) # :nodoc:
      q.pp to_a
    end

    def self.prepend(list, value)
      return List.new(value) unless list
      List.new value, list
    end
  end
end
PK}$[���y#y#"rubygems/rubygems/util/licenses.rbnu�[���# frozen_string_literal: true
require_relative "../text"

class Gem::Licenses
  extend Gem::Text

  NONSTANDARD = "Nonstandard".freeze
  LICENSE_REF = "LicenseRef-.+".freeze

  # Software Package Data Exchange (SPDX) standard open-source software
  # license identifiers
  LICENSE_IDENTIFIERS = %w[
    0BSD
    AAL
    ADSL
    AFL-1.1
    AFL-1.2
    AFL-2.0
    AFL-2.1
    AFL-3.0
    AGPL-1.0
    AGPL-1.0-only
    AGPL-1.0-or-later
    AGPL-3.0
    AGPL-3.0-only
    AGPL-3.0-or-later
    AMDPLPA
    AML
    AMPAS
    ANTLR-PD
    ANTLR-PD-fallback
    APAFML
    APL-1.0
    APSL-1.0
    APSL-1.1
    APSL-1.2
    APSL-2.0
    Abstyles
    Adobe-2006
    Adobe-Glyph
    Afmparse
    Aladdin
    Apache-1.0
    Apache-1.1
    Apache-2.0
    Artistic-1.0
    Artistic-1.0-Perl
    Artistic-1.0-cl8
    Artistic-2.0
    BSD-1-Clause
    BSD-2-Clause
    BSD-2-Clause-FreeBSD
    BSD-2-Clause-NetBSD
    BSD-2-Clause-Patent
    BSD-2-Clause-Views
    BSD-3-Clause
    BSD-3-Clause-Attribution
    BSD-3-Clause-Clear
    BSD-3-Clause-LBNL
    BSD-3-Clause-Modification
    BSD-3-Clause-No-Military-License
    BSD-3-Clause-No-Nuclear-License
    BSD-3-Clause-No-Nuclear-License-2014
    BSD-3-Clause-No-Nuclear-Warranty
    BSD-3-Clause-Open-MPI
    BSD-4-Clause
    BSD-4-Clause-Shortened
    BSD-4-Clause-UC
    BSD-Protection
    BSD-Source-Code
    BSL-1.0
    BUSL-1.1
    Bahyph
    Barr
    Beerware
    BitTorrent-1.0
    BitTorrent-1.1
    BlueOak-1.0.0
    Borceux
    C-UDA-1.0
    CAL-1.0
    CAL-1.0-Combined-Work-Exception
    CATOSL-1.1
    CC-BY-1.0
    CC-BY-2.0
    CC-BY-2.5
    CC-BY-3.0
    CC-BY-3.0-AT
    CC-BY-3.0-US
    CC-BY-4.0
    CC-BY-NC-1.0
    CC-BY-NC-2.0
    CC-BY-NC-2.5
    CC-BY-NC-3.0
    CC-BY-NC-4.0
    CC-BY-NC-ND-1.0
    CC-BY-NC-ND-2.0
    CC-BY-NC-ND-2.5
    CC-BY-NC-ND-3.0
    CC-BY-NC-ND-3.0-IGO
    CC-BY-NC-ND-4.0
    CC-BY-NC-SA-1.0
    CC-BY-NC-SA-2.0
    CC-BY-NC-SA-2.5
    CC-BY-NC-SA-3.0
    CC-BY-NC-SA-4.0
    CC-BY-ND-1.0
    CC-BY-ND-2.0
    CC-BY-ND-2.5
    CC-BY-ND-3.0
    CC-BY-ND-4.0
    CC-BY-SA-1.0
    CC-BY-SA-2.0
    CC-BY-SA-2.0-UK
    CC-BY-SA-2.1-JP
    CC-BY-SA-2.5
    CC-BY-SA-3.0
    CC-BY-SA-3.0-AT
    CC-BY-SA-4.0
    CC-PDDC
    CC0-1.0
    CDDL-1.0
    CDDL-1.1
    CDL-1.0
    CDLA-Permissive-1.0
    CDLA-Sharing-1.0
    CECILL-1.0
    CECILL-1.1
    CECILL-2.0
    CECILL-2.1
    CECILL-B
    CECILL-C
    CERN-OHL-1.1
    CERN-OHL-1.2
    CERN-OHL-P-2.0
    CERN-OHL-S-2.0
    CERN-OHL-W-2.0
    CNRI-Jython
    CNRI-Python
    CNRI-Python-GPL-Compatible
    CPAL-1.0
    CPL-1.0
    CPOL-1.02
    CUA-OPL-1.0
    Caldera
    ClArtistic
    Condor-1.1
    Crossword
    CrystalStacker
    Cube
    D-FSL-1.0
    DOC
    DRL-1.0
    DSDP
    Dotseqn
    ECL-1.0
    ECL-2.0
    EFL-1.0
    EFL-2.0
    EPICS
    EPL-1.0
    EPL-2.0
    EUDatagrid
    EUPL-1.0
    EUPL-1.1
    EUPL-1.2
    Entessa
    ErlPL-1.1
    Eurosym
    FSFAP
    FSFUL
    FSFULLR
    FTL
    Fair
    Frameworx-1.0
    FreeBSD-DOC
    FreeImage
    GD
    GFDL-1.1
    GFDL-1.1-invariants-only
    GFDL-1.1-invariants-or-later
    GFDL-1.1-no-invariants-only
    GFDL-1.1-no-invariants-or-later
    GFDL-1.1-only
    GFDL-1.1-or-later
    GFDL-1.2
    GFDL-1.2-invariants-only
    GFDL-1.2-invariants-or-later
    GFDL-1.2-no-invariants-only
    GFDL-1.2-no-invariants-or-later
    GFDL-1.2-only
    GFDL-1.2-or-later
    GFDL-1.3
    GFDL-1.3-invariants-only
    GFDL-1.3-invariants-or-later
    GFDL-1.3-no-invariants-only
    GFDL-1.3-no-invariants-or-later
    GFDL-1.3-only
    GFDL-1.3-or-later
    GL2PS
    GLWTPL
    GPL-1.0
    GPL-1.0+
    GPL-1.0-only
    GPL-1.0-or-later
    GPL-2.0
    GPL-2.0+
    GPL-2.0-only
    GPL-2.0-or-later
    GPL-2.0-with-GCC-exception
    GPL-2.0-with-autoconf-exception
    GPL-2.0-with-bison-exception
    GPL-2.0-with-classpath-exception
    GPL-2.0-with-font-exception
    GPL-3.0
    GPL-3.0+
    GPL-3.0-only
    GPL-3.0-or-later
    GPL-3.0-with-GCC-exception
    GPL-3.0-with-autoconf-exception
    Giftware
    Glide
    Glulxe
    HPND
    HPND-sell-variant
    HTMLTIDY
    HaskellReport
    Hippocratic-2.1
    IBM-pibs
    ICU
    IJG
    IPA
    IPL-1.0
    ISC
    ImageMagick
    Imlib2
    Info-ZIP
    Intel
    Intel-ACPI
    Interbase-1.0
    JPNIC
    JSON
    JasPer-2.0
    LAL-1.2
    LAL-1.3
    LGPL-2.0
    LGPL-2.0+
    LGPL-2.0-only
    LGPL-2.0-or-later
    LGPL-2.1
    LGPL-2.1+
    LGPL-2.1-only
    LGPL-2.1-or-later
    LGPL-3.0
    LGPL-3.0+
    LGPL-3.0-only
    LGPL-3.0-or-later
    LGPLLR
    LPL-1.0
    LPL-1.02
    LPPL-1.0
    LPPL-1.1
    LPPL-1.2
    LPPL-1.3a
    LPPL-1.3c
    Latex2e
    Leptonica
    LiLiQ-P-1.1
    LiLiQ-R-1.1
    LiLiQ-Rplus-1.1
    Libpng
    Linux-OpenIB
    MIT
    MIT-0
    MIT-CMU
    MIT-Modern-Variant
    MIT-advertising
    MIT-enna
    MIT-feh
    MIT-open-group
    MITNFA
    MPL-1.0
    MPL-1.1
    MPL-2.0
    MPL-2.0-no-copyleft-exception
    MS-PL
    MS-RL
    MTLL
    MakeIndex
    MirOS
    Motosoto
    MulanPSL-1.0
    MulanPSL-2.0
    Multics
    Mup
    NAIST-2003
    NASA-1.3
    NBPL-1.0
    NCGL-UK-2.0
    NCSA
    NGPL
    NIST-PD
    NIST-PD-fallback
    NLOD-1.0
    NLPL
    NOSL
    NPL-1.0
    NPL-1.1
    NPOSL-3.0
    NRL
    NTP
    NTP-0
    Naumen
    Net-SNMP
    NetCDF
    Newsletr
    Nokia
    Noweb
    Nunit
    O-UDA-1.0
    OCCT-PL
    OCLC-2.0
    ODC-By-1.0
    ODbL-1.0
    OFL-1.0
    OFL-1.0-RFN
    OFL-1.0-no-RFN
    OFL-1.1
    OFL-1.1-RFN
    OFL-1.1-no-RFN
    OGC-1.0
    OGDL-Taiwan-1.0
    OGL-Canada-2.0
    OGL-UK-1.0
    OGL-UK-2.0
    OGL-UK-3.0
    OGTSL
    OLDAP-1.1
    OLDAP-1.2
    OLDAP-1.3
    OLDAP-1.4
    OLDAP-2.0
    OLDAP-2.0.1
    OLDAP-2.1
    OLDAP-2.2
    OLDAP-2.2.1
    OLDAP-2.2.2
    OLDAP-2.3
    OLDAP-2.4
    OLDAP-2.5
    OLDAP-2.6
    OLDAP-2.7
    OLDAP-2.8
    OML
    OPL-1.0
    OSET-PL-2.1
    OSL-1.0
    OSL-1.1
    OSL-2.0
    OSL-2.1
    OSL-3.0
    OpenSSL
    PDDL-1.0
    PHP-3.0
    PHP-3.01
    PSF-2.0
    Parity-6.0.0
    Parity-7.0.0
    Plexus
    PolyForm-Noncommercial-1.0.0
    PolyForm-Small-Business-1.0.0
    PostgreSQL
    Python-2.0
    QPL-1.0
    Qhull
    RHeCos-1.1
    RPL-1.1
    RPL-1.5
    RPSL-1.0
    RSA-MD
    RSCPL
    Rdisc
    Ruby
    SAX-PD
    SCEA
    SGI-B-1.0
    SGI-B-1.1
    SGI-B-2.0
    SHL-0.5
    SHL-0.51
    SISSL
    SISSL-1.2
    SMLNJ
    SMPPL
    SNIA
    SPL-1.0
    SSH-OpenSSH
    SSH-short
    SSPL-1.0
    SWL
    Saxpath
    Sendmail
    Sendmail-8.23
    SimPL-2.0
    Sleepycat
    Spencer-86
    Spencer-94
    Spencer-99
    StandardML-NJ
    SugarCRM-1.1.3
    TAPR-OHL-1.0
    TCL
    TCP-wrappers
    TMate
    TORQUE-1.1
    TOSL
    TU-Berlin-1.0
    TU-Berlin-2.0
    UCL-1.0
    UPL-1.0
    Unicode-DFS-2015
    Unicode-DFS-2016
    Unicode-TOU
    Unlicense
    VOSTROM
    VSL-1.0
    Vim
    W3C
    W3C-19980720
    W3C-20150513
    WTFPL
    Watcom-1.0
    Wsuipa
    X11
    XFree86-1.1
    XSkat
    Xerox
    Xnet
    YPL-1.0
    YPL-1.1
    ZPL-1.1
    ZPL-2.0
    ZPL-2.1
    Zed
    Zend-2.0
    Zimbra-1.3
    Zimbra-1.4
    Zlib
    blessing
    bzip2-1.0.5
    bzip2-1.0.6
    copyleft-next-0.3.0
    copyleft-next-0.3.1
    curl
    diffmark
    dvipdfm
    eCos-2.0
    eGenix
    etalab-2.0
    gSOAP-1.3b
    gnuplot
    iMatix
    libpng-2.0
    libselinux-1.0
    libtiff
    mpich2
    psfrag
    psutils
    wxWindows
    xinetd
    xpp
    zlib-acknowledgement
  ].freeze

  # exception identifiers
  EXCEPTION_IDENTIFIERS = %w[
    389-exception
    Autoconf-exception-2.0
    Autoconf-exception-3.0
    Bison-exception-2.2
    Bootloader-exception
    CLISP-exception-2.0
    Classpath-exception-2.0
    DigiRule-FOSS-exception
    FLTK-exception
    Fawkes-Runtime-exception
    Font-exception-2.0
    GCC-exception-2.0
    GCC-exception-3.1
    GPL-3.0-linking-exception
    GPL-3.0-linking-source-exception
    GPL-CC-1.0
    LGPL-3.0-linking-exception
    LLVM-exception
    LZMA-exception
    Libtool-exception
    Linux-syscall-note
    Nokia-Qt-exception-1.1
    OCCT-exception-1.0
    OCaml-LGPL-linking-exception
    OpenJDK-assembly-exception-1.0
    PS-or-PDF-font-exception-20170817
    Qt-GPL-exception-1.0
    Qt-LGPL-exception-1.1
    Qwt-exception-1.0
    SHL-2.0
    SHL-2.1
    Swift-exception
    Universal-FOSS-exception-1.0
    WxWindows-exception-3.1
    eCos-exception-2.0
    freertos-exception-2.0
    gnu-javamail-exception
    i2p-gpl-java-exception
    mif-exception
    openvpn-openssl-exception
    u-boot-exception-2.0
  ].freeze

  REGEXP = %r{
    \A
    (?:
      #{Regexp.union(LICENSE_IDENTIFIERS)}
      \+?
      (?:\s WITH \s #{Regexp.union(EXCEPTION_IDENTIFIERS)})?
      | #{NONSTANDARD}
      | #{LICENSE_REF}
    )
    \Z
  }ox.freeze

  def self.match?(license)
    !REGEXP.match(license).nil?
  end

  def self.suggestions(license)
    by_distance = LICENSE_IDENTIFIERS.group_by do |identifier|
      levenshtein_distance(identifier, license)
    end
    lowest = by_distance.keys.min
    return unless lowest < license.size
    by_distance[lowest]
  end
end
PK}$[�\�>>)rubygems/rubygems/local_remote_options.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require "uri"
require_relative "../rubygems"

##
# Mixin methods for local and remote Gem::Command options.

module Gem::LocalRemoteOptions

  ##
  # Allows Gem::OptionParser to handle HTTP URIs.

  def accept_uri_http
    Gem::OptionParser.accept URI::HTTP do |value|
      begin
        uri = URI.parse value
      rescue URI::InvalidURIError
        raise Gem::OptionParser::InvalidArgument, value
      end

      valid_uri_schemes = ["http", "https", "file", "s3"]
      unless valid_uri_schemes.include?(uri.scheme)
        msg = "Invalid uri scheme for #{value}\nPreface URLs with one of #{valid_uri_schemes.map {|s| "#{s}://" }}"
        raise ArgumentError, msg
      end

      value
    end
  end

  ##
  # Add local/remote options to the command line parser.

  def add_local_remote_options
    add_option(:"Local/Remote", "-l", "--local",
               "Restrict operations to the LOCAL domain") do |value, options|
      options[:domain] = :local
    end

    add_option(:"Local/Remote", "-r", "--remote",
      "Restrict operations to the REMOTE domain") do |value, options|
      options[:domain] = :remote
    end

    add_option(:"Local/Remote", "-b", "--both",
               "Allow LOCAL and REMOTE operations") do |value, options|
      options[:domain] = :both
    end

    add_bulk_threshold_option
    add_clear_sources_option
    add_source_option
    add_proxy_option
    add_update_sources_option
  end

  ##
  # Add the --bulk-threshold option

  def add_bulk_threshold_option
    add_option(:"Local/Remote", "-B", "--bulk-threshold COUNT",
               "Threshold for switching to bulk",
               "synchronization (default #{Gem.configuration.bulk_threshold})") do
      |value, options|
      Gem.configuration.bulk_threshold = value.to_i
    end
  end

  ##
  # Add the --clear-sources option

  def add_clear_sources_option
    add_option(:"Local/Remote", "--clear-sources",
               "Clear the gem sources") do |value, options|
      Gem.sources = nil
      options[:sources_cleared] = true
    end
  end

  ##
  # Add the --http-proxy option

  def add_proxy_option
    accept_uri_http

    add_option(:"Local/Remote", "-p", "--[no-]http-proxy [URL]", URI::HTTP,
               "Use HTTP proxy for remote operations") do |value, options|
      options[:http_proxy] = (value == false) ? :no_proxy : value
      Gem.configuration[:http_proxy] = options[:http_proxy]
    end
  end

  ##
  # Add the --source option

  def add_source_option
    accept_uri_http

    add_option(:"Local/Remote", "-s", "--source URL", URI::HTTP,
               "Append URL to list of remote gem sources") do |source, options|
      source << "/" if source !~ /\/\z/

      if options.delete :sources_cleared
        Gem.sources = [source]
      else
        Gem.sources << source unless Gem.sources.include?(source)
      end
    end
  end

  ##
  # Add the --update-sources option

  def add_update_sources_option
    add_option(:Deprecated, "-u", "--[no-]update-sources",
               "Update local source cache") do |value, options|
      Gem.configuration.update_sources = value
    end
  end

  ##
  # Is fetching of local and remote information enabled?

  def both?
    options[:domain] == :both
  end

  ##
  # Is local fetching enabled?

  def local?
    options[:domain] == :local || options[:domain] == :both
  end

  ##
  # Is remote fetching enabled?

  def remote?
    options[:domain] == :remote || options[:domain] == :both
  end

end
PK}$[��g�~3~3)rubygems/rubygems/specification_policy.rbnu�[���require_relative "user_interaction"

class Gem::SpecificationPolicy
  include Gem::UserInteraction

  VALID_NAME_PATTERN = /\A[a-zA-Z0-9\.\-\_]+\z/.freeze # :nodoc:

  SPECIAL_CHARACTERS = /\A[#{Regexp.escape('.-_')}]+/.freeze # :nodoc:

  VALID_URI_PATTERN = %r{\Ahttps?:\/\/([^\s:@]+:[^\s:@]*@)?[A-Za-z\d\-]+(\.[A-Za-z\d\-]+)+\.?(:\d{1,5})?([\/?]\S*)?\z}.freeze # :nodoc:

  METADATA_LINK_KEYS = %w[
    bug_tracker_uri
    changelog_uri
    documentation_uri
    homepage_uri
    mailing_list_uri
    source_code_uri
    wiki_uri
    funding_uri
  ].freeze # :nodoc:

  def initialize(specification)
    @warnings = 0

    @specification = specification
  end

  ##
  # If set to true, run packaging-specific checks, as well.

  attr_accessor :packaging

  ##
  # Does a sanity check on the specification.
  #
  # Raises InvalidSpecificationException if the spec does not pass the
  # checks.
  #
  # It also performs some validations that do not raise but print warning
  # messages instead.

  def validate(strict = false)
    validate_required!

    validate_optional(strict) if packaging || strict

    true
  end

  ##
  # Does a sanity check on the specification.
  #
  # Raises InvalidSpecificationException if the spec does not pass the
  # checks.
  #
  # Only runs checks that are considered necessary for the specification to be
  # functional.

  def validate_required!
    validate_nil_attributes

    validate_rubygems_version

    validate_required_attributes

    validate_name

    validate_require_paths

    @specification.keep_only_files_and_directories

    validate_non_files

    validate_self_inclusion_in_files_list

    validate_specification_version

    validate_platform

    validate_array_attributes

    validate_authors_field

    validate_metadata

    validate_licenses_length

    validate_lazy_metadata

    validate_duplicate_dependencies
  end

  def validate_optional(strict)
    validate_licenses

    validate_permissions

    validate_values

    validate_dependencies

    validate_extensions

    validate_removed_attributes

    if @warnings > 0
      if strict
        error "specification has warnings"
      else
        alert_warning help_text
      end
    end
  end

  ##
  # Implementation for Specification#validate_metadata

  def validate_metadata
    metadata = @specification.metadata

    unless Hash === metadata
      error "metadata must be a hash"
    end

    metadata.each do |key, value|
      entry = "metadata['#{key}']"
      if !key.kind_of?(String)
        error "metadata keys must be a String"
      end

      if key.size > 128
        error "metadata key is too large (#{key.size} > 128)"
      end

      if !value.kind_of?(String)
        error "#{entry} value must be a String"
      end

      if value.size > 1024
        error "#{entry} value is too large (#{value.size} > 1024)"
      end

      if METADATA_LINK_KEYS.include? key
        if value !~ VALID_URI_PATTERN
          error "#{entry} has invalid link: #{value.inspect}"
        end
      end
    end
  end

  ##
  # Checks that no duplicate dependencies are specified.

  def validate_duplicate_dependencies # :nodoc:
    # NOTE: see REFACTOR note in Gem::Dependency about types - this might be brittle
    seen = Gem::Dependency::TYPES.inject({}) {|types, type| types.merge({ type => {} }) }

    error_messages = []
    @specification.dependencies.each do |dep|
      if prev = seen[dep.type][dep.name]
        error_messages << <<-MESSAGE
duplicate dependency on #{dep}, (#{prev.requirement}) use:
    add_#{dep.type}_dependency '#{dep.name}', '#{dep.requirement}', '#{prev.requirement}'
        MESSAGE
      end

      seen[dep.type][dep.name] = dep
    end
    if error_messages.any?
      error error_messages.join
    end
  end

  ##
  # Checks that dependencies use requirements as we recommend.  Warnings are
  # issued when dependencies are open-ended or overly strict for semantic
  # versioning.

  def validate_dependencies # :nodoc:
    warning_messages = []
    @specification.dependencies.each do |dep|
      prerelease_dep = dep.requirements_list.any? do |req|
        Gem::Requirement.new(req).prerelease?
      end

      warning_messages << "prerelease dependency on #{dep} is not recommended" if
          prerelease_dep && !@specification.version.prerelease?

      open_ended = dep.requirement.requirements.all? do |op, version|
        !version.prerelease? && (op == ">" || op == ">=")
      end

      if open_ended
        op, dep_version = dep.requirement.requirements.first

        segments = dep_version.segments

        base = segments.first 2

        recommendation = if (op == ">" || op == ">=") && segments == [0]
          "  use a bounded requirement, such as '~> x.y'"
        else
          bugfix = if op == ">"
            ", '> #{dep_version}'"
          elsif op == ">=" && base != segments
            ", '>= #{dep_version}'"
          end

          "  if #{dep.name} is semantically versioned, use:\n" \
          "    add_#{dep.type}_dependency '#{dep.name}', '~> #{base.join '.'}'#{bugfix}"
        end

        warning_messages << ["open-ended dependency on #{dep} is not recommended", recommendation].join("\n") + "\n"
      end
    end
    if warning_messages.any?
      warning_messages.each {|warning_message| warning warning_message }
    end
  end

  ##
  # Issues a warning for each file to be packaged which is world-readable.
  #
  # Implementation for Specification#validate_permissions

  def validate_permissions
    return if Gem.win_platform?

    @specification.files.each do |file|
      next unless File.file?(file)
      next if File.stat(file).mode & 0444 == 0444
      warning "#{file} is not world-readable"
    end

    @specification.executables.each do |name|
      exec = File.join @specification.bindir, name
      next unless File.file?(exec)
      next if File.stat(exec).executable?
      warning "#{exec} is not executable"
    end
  end

  private

  def validate_nil_attributes
    nil_attributes = Gem::Specification.non_nil_attributes.select do |attrname|
      @specification.instance_variable_get("@#{attrname}").nil?
    end
    return if nil_attributes.empty?
    error "#{nil_attributes.join ', '} must not be nil"
  end

  def validate_rubygems_version
    return unless packaging

    rubygems_version = @specification.rubygems_version

    return if rubygems_version == Gem::VERSION

    error "expected RubyGems version #{Gem::VERSION}, was #{rubygems_version}"
  end

  def validate_required_attributes
    Gem::Specification.required_attributes.each do |symbol|
      unless @specification.send symbol
        error "missing value for attribute #{symbol}"
      end
    end
  end

  def validate_name
    name = @specification.name

    if !name.is_a?(String)
      error "invalid value for attribute name: \"#{name.inspect}\" must be a string"
    elsif name !~ /[a-zA-Z]/
      error "invalid value for attribute name: #{name.dump} must include at least one letter"
    elsif name !~ VALID_NAME_PATTERN
      error "invalid value for attribute name: #{name.dump} can only include letters, numbers, dashes, and underscores"
    elsif name =~ SPECIAL_CHARACTERS
      error "invalid value for attribute name: #{name.dump} can not begin with a period, dash, or underscore"
    end
  end

  def validate_require_paths
    return unless @specification.raw_require_paths.empty?

    error "specification must have at least one require_path"
  end

  def validate_non_files
    return unless packaging

    non_files = @specification.files.reject {|x| File.file?(x) || File.symlink?(x) }

    unless non_files.empty?
      error "[\"#{non_files.join "\", \""}\"] are not files"
    end
  end

  def validate_self_inclusion_in_files_list
    file_name = @specification.file_name

    return unless @specification.files.include?(file_name)

    error "#{@specification.full_name} contains itself (#{file_name}), check your files list"
  end

  def validate_specification_version
    return if @specification.specification_version.is_a?(Integer)

    error "specification_version must be an Integer (did you mean version?)"
  end

  def validate_platform
    platform = @specification.platform

    case platform
    when Gem::Platform, Gem::Platform::RUBY # ok
    else
      error "invalid platform #{platform.inspect}, see Gem::Platform"
    end
  end

  def validate_array_attributes
    Gem::Specification.array_attributes.each do |field|
      validate_array_attribute(field)
    end
  end

  def validate_array_attribute(field)
    val = @specification.send(field)
    klass = case field
    when :dependencies then
      Gem::Dependency
    else
      String
    end

    unless Array === val && val.all? {|x| x.kind_of?(klass) }
      error "#{field} must be an Array of #{klass}"
    end
  end

  def validate_authors_field
    return unless @specification.authors.empty?

    error "authors may not be empty"
  end

  def validate_licenses_length
    licenses = @specification.licenses

    licenses.each do |license|
      if license.length > 64
        error "each license must be 64 characters or less"
      end
    end
  end

  def validate_licenses
    licenses = @specification.licenses

    licenses.each do |license|
      if !Gem::Licenses.match?(license)
        suggestions = Gem::Licenses.suggestions(license)
        message = <<-WARNING
license value '#{license}' is invalid.  Use a license identifier from
http://spdx.org/licenses or '#{Gem::Licenses::NONSTANDARD}' for a nonstandard license.
        WARNING
        message += "Did you mean #{suggestions.map {|s| "'#{s}'" }.join(', ')}?\n" unless suggestions.nil?
        warning(message)
      end
    end

    warning <<-WARNING if licenses.empty?
licenses is empty, but is recommended.  Use a license identifier from
http://spdx.org/licenses or '#{Gem::Licenses::NONSTANDARD}' for a nonstandard license.
    WARNING
  end

  LAZY = '"FIxxxXME" or "TOxxxDO"'.gsub(/xxx/, "")
  LAZY_PATTERN = /\AFI XME|\ATO DO/x.freeze
  HOMEPAGE_URI_PATTERN = /\A[a-z][a-z\d+.-]*:/i.freeze

  def validate_lazy_metadata
    unless @specification.authors.grep(LAZY_PATTERN).empty?
      error "#{LAZY} is not an author"
    end

    unless Array(@specification.email).grep(LAZY_PATTERN).empty?
      error "#{LAZY} is not an email"
    end

    if @specification.description =~ LAZY_PATTERN
      error "#{LAZY} is not a description"
    end

    if @specification.summary =~ LAZY_PATTERN
      error "#{LAZY} is not a summary"
    end

    homepage = @specification.homepage

    # Make sure a homepage is valid HTTP/HTTPS URI
    if homepage && !homepage.empty?
      require "uri"
      begin
        homepage_uri = URI.parse(homepage)
        unless [URI::HTTP, URI::HTTPS].member? homepage_uri.class
          error "\"#{homepage}\" is not a valid HTTP URI"
        end
      rescue URI::InvalidURIError
        error "\"#{homepage}\" is not a valid HTTP URI"
      end
    end
  end

  def validate_values
    %w[author homepage summary files].each do |attribute|
      validate_attribute_present(attribute)
    end

    if @specification.description == @specification.summary
      warning "description and summary are identical"
    end

    # TODO: raise at some given date
    warning "deprecated autorequire specified" if @specification.autorequire

    @specification.executables.each do |executable|
      validate_shebang_line_in(executable)
    end

    @specification.files.select {|f| File.symlink?(f) }.each do |file|
      warning "#{file} is a symlink, which is not supported on all platforms"
    end
  end

  def validate_attribute_present(attribute)
    value = @specification.send attribute
    warning("no #{attribute} specified") if value.nil? || value.empty?
  end

  def validate_shebang_line_in(executable)
    executable_path = File.join(@specification.bindir, executable)
    return if File.read(executable_path, 2) == "#!"

    warning "#{executable_path} is missing #! line"
  end

  def validate_removed_attributes # :nodoc:
    @specification.removed_method_calls.each do |attr|
      warning("#{attr} is deprecated and ignored. Please remove this from your gemspec to ensure that your gem continues to build in the future.")
    end
  end

  def validate_extensions # :nodoc:
    require_relative "ext"
    builder = Gem::Ext::Builder.new(@specification)

    rake_extension = @specification.extensions.any? {|s| builder.builder_for(s) == Gem::Ext::RakeBuilder }
    rake_dependency = @specification.dependencies.any? {|d| d.name == "rake" }

    warning <<-WARNING if rake_extension && !rake_dependency
You have specified rake based extension, but rake is not added as dependency. It is recommended to add rake as a dependency in gemspec since there's no guarantee rake will be already installed.
    WARNING
  end

  def warning(statement) # :nodoc:
    @warnings += 1

    alert_warning statement
  end

  def error(statement) # :nodoc:
    raise Gem::InvalidSpecificationException, statement
  ensure
    alert_warning help_text
  end

  def help_text # :nodoc:
    "See https://guides.rubygems.org/specification-reference/ for help"
  end
end
PK}$[$t%�(�( rubygems/rubygems/uninstaller.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require "fileutils"
require_relative "../rubygems"
require_relative "installer_uninstaller_utils"
require_relative "dependency_list"
require_relative "rdoc"
require_relative "user_interaction"

##
# An Uninstaller.
#
# The uninstaller fires pre and post uninstall hooks.  Hooks can be added
# either through a rubygems_plugin.rb file in an installed gem or via a
# rubygems/defaults/#{RUBY_ENGINE}.rb or rubygems/defaults/operating_system.rb
# file.  See Gem.pre_uninstall and Gem.post_uninstall for details.

class Gem::Uninstaller
  include Gem::UserInteraction

  include Gem::InstallerUninstallerUtils

  ##
  # The directory a gem's executables will be installed into

  attr_reader :bin_dir

  ##
  # The gem repository the gem will be installed into

  attr_reader :gem_home

  ##
  # The Gem::Specification for the gem being uninstalled, only set during
  # #uninstall_gem

  attr_reader :spec

  ##
  # Constructs an uninstaller that will uninstall +gem+

  def initialize(gem, options = {})
    # TODO document the valid options
    @gem                = gem
    @version            = options[:version] || Gem::Requirement.default
    @gem_home           = File.realpath(options[:install_dir] || Gem.dir)
    @plugins_dir        = Gem.plugindir(@gem_home)
    @force_executables  = options[:executables]
    @force_all          = options[:all]
    @force_ignore       = options[:ignore]
    @bin_dir            = options[:bin_dir]
    @format_executable  = options[:format_executable]
    @abort_on_dependent = options[:abort_on_dependent]

    # Indicate if development dependencies should be checked when
    # uninstalling. (default: false)
    #
    @check_dev = options[:check_dev]

    if options[:force]
      @force_all = true
      @force_ignore = true
    end

    # only add user directory if install_dir is not set
    @user_install = false
    @user_install = options[:user_install] unless options[:install_dir]

    # Optimization: populated during #uninstall
    @default_specs_matching_uninstall_params = []
  end

  ##
  # Performs the uninstall of the gem.  This removes the spec, the Gem
  # directory, and the cached .gem file.

  def uninstall
    dependency = Gem::Dependency.new @gem, @version

    list = []

    dirs =
      Gem::Specification.dirs +
      [Gem.default_specifications_dir]

    Gem::Specification.each_spec dirs do |spec|
      next unless dependency.matches_spec? spec

      list << spec
    end

    if list.empty?
      raise Gem::InstallError, "gem #{@gem.inspect} is not installed"
    end

    default_specs, list = list.partition do |spec|
      spec.default_gem?
    end
    warn_cannot_uninstall_default_gems(default_specs - list)
    @default_specs_matching_uninstall_params = default_specs

    list, other_repo_specs = list.partition do |spec|
      @gem_home == spec.base_dir ||
        (@user_install && spec.base_dir == Gem.user_dir)
    end

    list.sort!

    if list.empty?
      return unless other_repo_specs.any?

      other_repos = other_repo_specs.map {|spec| spec.base_dir }.uniq

      message = ["#{@gem} is not installed in GEM_HOME, try:"]
      message.concat other_repos.map {|repo|
        "\tgem uninstall -i #{repo} #{@gem}"
      }

      raise Gem::InstallError, message.join("\n")
    elsif @force_all
      remove_all list

    elsif list.size > 1
      gem_names = list.map {|gem| gem.full_name }
      gem_names << "All versions"

      say
      _, index = choose_from_list "Select gem to uninstall:", gem_names

      if index == list.size
        remove_all list
      elsif index >= 0 && index < list.size
        uninstall_gem list[index]
      else
        say "Error: must enter a number [1-#{list.size + 1}]"
      end
    else
      uninstall_gem list.first
    end
  end

  ##
  # Uninstalls gem +spec+

  def uninstall_gem(spec)
    @spec = spec

    unless dependencies_ok? spec
      if abort_on_dependent? || !ask_if_ok(spec)
        raise Gem::DependencyRemovalException,
          "Uninstallation aborted due to dependent gem(s)"
      end
    end

    Gem.pre_uninstall_hooks.each do |hook|
      hook.call self
    end

    remove_executables @spec
    remove_plugins @spec
    remove @spec

    regenerate_plugins

    Gem.post_uninstall_hooks.each do |hook|
      hook.call self
    end

    @spec = nil
  end

  ##
  # Removes installed executables and batch files (windows only) for +spec+.

  def remove_executables(spec)
    return if spec.executables.empty?

    executables = spec.executables.clone

    # Leave any executables created by other installed versions
    # of this gem installed.

    list = Gem::Specification.find_all do |s|
      s.name == spec.name && s.version != spec.version
    end

    list.each do |s|
      s.executables.each do |exe_name|
        executables.delete exe_name
      end
    end

    return if executables.empty?

    executables = executables.map {|exec| formatted_program_filename exec }

    remove = if @force_executables.nil?
      ask_yes_no("Remove executables:\n" +
                 "\t#{executables.join ', '}\n\n" +
                 "in addition to the gem?",
                 true)
    else
      @force_executables
    end

    if remove
      bin_dir = @bin_dir || Gem.bindir(spec.base_dir)

      raise Gem::FilePermissionError, bin_dir unless File.writable? bin_dir

      executables.each do |exe_name|
        say "Removing #{exe_name}"

        exe_file = File.join bin_dir, exe_name

        safe_delete { FileUtils.rm exe_file }
        safe_delete { FileUtils.rm "#{exe_file}.bat" }
      end
    else
      say "Executables and scripts will remain installed."
    end
  end

  ##
  # Removes all gems in +list+.
  #
  # NOTE: removes uninstalled gems from +list+.

  def remove_all(list)
    list.each {|spec| uninstall_gem spec }
  end

  ##
  # spec:: the spec of the gem to be uninstalled

  def remove(spec)
    unless path_ok?(@gem_home, spec) ||
           (@user_install && path_ok?(Gem.user_dir, spec))
      e = Gem::GemNotInHomeException.new \
            "Gem '#{spec.full_name}' is not installed in directory #{@gem_home}"
      e.spec = spec

      raise e
    end

    raise Gem::FilePermissionError, spec.base_dir unless
      File.writable?(spec.base_dir)

    safe_delete { FileUtils.rm_r spec.full_gem_path }
    safe_delete { FileUtils.rm_r spec.extension_dir }

    old_platform_name = spec.original_name

    gem = spec.cache_file
    gem = File.join(spec.cache_dir, "#{old_platform_name}.gem") unless
      File.exist? gem

    safe_delete { FileUtils.rm_r gem }

    begin
      Gem::RDoc.new(spec).remove
    rescue NameError
    end

    gemspec = spec.spec_file

    unless File.exist? gemspec
      gemspec = File.join(File.dirname(gemspec), "#{old_platform_name}.gemspec")
    end

    safe_delete { FileUtils.rm_r gemspec }
    announce_deletion_of(spec)

    Gem::Specification.reset
  end

  ##
  # Remove any plugin wrappers for +spec+.

  def remove_plugins(spec) # :nodoc:
    return if spec.plugins.empty?

    remove_plugins_for(spec, @plugins_dir)
  end

  ##
  # Regenerates plugin wrappers after removal.

  def regenerate_plugins
    latest = Gem::Specification.latest_spec_for(@spec.name)
    return if latest.nil?

    regenerate_plugins_for(latest, @plugins_dir)
  end

  ##
  # Is +spec+ in +gem_dir+?

  def path_ok?(gem_dir, spec)
    full_path     = File.join gem_dir, "gems", spec.full_name
    original_path = File.join gem_dir, "gems", spec.original_name

    full_path == spec.full_gem_path || original_path == spec.full_gem_path
  end

  ##
  # Returns true if it is OK to remove +spec+ or this is a forced
  # uninstallation.

  def dependencies_ok?(spec) # :nodoc:
    return true if @force_ignore

    deplist = Gem::DependencyList.from_specs
    deplist.ok_to_remove?(spec.full_name, @check_dev)
  end

  ##
  # Should the uninstallation abort if a dependency will go unsatisfied?
  #
  # See ::new.

  def abort_on_dependent? # :nodoc:
    @abort_on_dependent
  end

  ##
  # Asks if it is OK to remove +spec+.  Returns true if it is OK.

  def ask_if_ok(spec) # :nodoc:
    msg = [""]
    msg << "You have requested to uninstall the gem:"
    msg << "\t#{spec.full_name}"
    msg << ""

    siblings = Gem::Specification.select do |s|
      s.name == spec.name && s.full_name != spec.full_name
    end

    spec.dependent_gems(@check_dev).each do |dep_spec, dep, satlist|
      unless siblings.any? {|s| s.satisfies_requirement? dep }
        msg << "#{dep_spec.name}-#{dep_spec.version} depends on #{dep}"
      end
    end

    msg << "If you remove this gem, these dependencies will not be met."
    msg << "Continue with Uninstall?"
    return ask_yes_no(msg.join("\n"), false)
  end

  ##
  # Returns the formatted version of the executable +filename+

  def formatted_program_filename(filename) # :nodoc:
    # TODO perhaps the installer should leave a small manifest
    # of what it did for us to find rather than trying to recreate
    # it again.
    if @format_executable
      require_relative "installer"
      Gem::Installer.exec_format % File.basename(filename)
    else
      filename
    end
  end

  def safe_delete(&block)
    block.call
  rescue Errno::ENOENT
    nil
  rescue Errno::EPERM
    e = Gem::UninstallError.new
    e.spec = @spec

    raise e
  end

  private

  def announce_deletion_of(spec)
    name = spec.full_name
    say "Successfully uninstalled #{name}"
    if default_spec_matches?(spec)
      say(
        "There was both a regular copy and a default copy of #{name}. The " \
          "regular copy was successfully uninstalled, but the default copy " \
          "was left around because default gems can't be removed."
      )
    end
  end

  # @return true if the specs of any default gems are `==` to the given `spec`.
  def default_spec_matches?(spec)
    !default_specs_that_match(spec).empty?
  end

  # @return [Array] specs of default gems that are `==` to the given `spec`.
  def default_specs_that_match(spec)
    @default_specs_matching_uninstall_params.select {|default_spec| spec == default_spec }
  end

  def warn_cannot_uninstall_default_gems(specs)
    specs.each do |spec|
      say "Gem #{spec.full_name} cannot be uninstalled because it is a default gem"
    end
  end
end
PK}$[��

"rubygems/rubygems/uri_formatter.rbnu�[���# frozen_string_literal: true

##
# The UriFormatter handles URIs from user-input and escaping.
#
#   uf = Gem::UriFormatter.new 'example.com'
#
#   p uf.normalize #=> 'http://example.com'

class Gem::UriFormatter
  ##
  # The URI to be formatted.

  attr_reader :uri

  ##
  # Creates a new URI formatter for +uri+.

  def initialize(uri)
    require "cgi"

    @uri = uri
  end

  ##
  # Escapes the #uri for use as a CGI parameter

  def escape
    return unless @uri
    CGI.escape @uri
  end

  ##
  # Normalize the URI by adding "http://" if it is missing.

  def normalize
    (@uri =~ /^(https?|ftp|file):/i) ? @uri : "http://#{@uri}"
  end

  ##
  # Unescapes the #uri which came from a CGI parameter

  def unescape
    return unless @uri
    CGI.unescape @uri
  end
end
PK}$[����

-rubygems/rubygems/package/tar_reader/entry.rbnu�[���# frozen_string_literal: true
#++
# Copyright (C) 2004 Mauricio Julio Fernández Pradier
# See LICENSE.txt for additional licensing information.
#--

##
# Class for reading entries out of a tar file

class Gem::Package::TarReader::Entry
  ##
  # Header for this tar entry

  attr_reader :header

  ##
  # Creates a new tar entry for +header+ that will be read from +io+

  def initialize(header, io)
    @closed = false
    @header = header
    @io = io
    @orig_pos = @io.pos
    @read = 0
  end

  def check_closed # :nodoc:
    raise IOError, "closed #{self.class}" if closed?
  end

  ##
  # Number of bytes read out of the tar entry

  def bytes_read
    @read
  end

  ##
  # Closes the tar entry

  def close
    @closed = true
  end

  ##
  # Is the tar entry closed?

  def closed?
    @closed
  end

  ##
  # Are we at the end of the tar entry?

  def eof?
    check_closed

    @read >= @header.size
  end

  ##
  # Full name of the tar entry

  def full_name
    if @header.prefix != ""
      File.join @header.prefix, @header.name
    else
      @header.name
    end
  rescue ArgumentError => e
    raise unless e.message == "string contains null byte"
    raise Gem::Package::TarInvalidError,
          "tar is corrupt, name contains null byte"
  end

  ##
  # Read one byte from the tar entry

  def getc
    check_closed

    return nil if @read >= @header.size

    ret = @io.getc
    @read += 1 if ret

    ret
  end

  ##
  # Is this tar entry a directory?

  def directory?
    @header.typeflag == "5"
  end

  ##
  # Is this tar entry a file?

  def file?
    @header.typeflag == "0"
  end

  ##
  # Is this tar entry a symlink?

  def symlink?
    @header.typeflag == "2"
  end

  ##
  # The position in the tar entry

  def pos
    check_closed

    bytes_read
  end

  def size
    @header.size
  end

  alias length size

  ##
  # Reads +len+ bytes from the tar file entry, or the rest of the entry if
  # nil

  def read(len = nil)
    check_closed

    return nil if @read >= @header.size

    len ||= @header.size - @read
    max_read = [len, @header.size - @read].min

    ret = @io.read max_read
    @read += ret.size

    ret
  end

  def readpartial(maxlen = nil, outbuf = "".b)
    check_closed

    raise EOFError if @read >= @header.size

    maxlen ||= @header.size - @read
    max_read = [maxlen, @header.size - @read].min

    @io.readpartial(max_read, outbuf)
    @read += outbuf.size

    outbuf
  end

  ##
  # Rewinds to the beginning of the tar file entry

  def rewind
    check_closed

    @io.pos = @orig_pos
    @read = 0
  end
end
PK}$[@۬b	b	'rubygems/rubygems/package/tar_reader.rbnu�[���# frozen_string_literal: true
#--
# Copyright (C) 2004 Mauricio Julio Fernández Pradier
# See LICENSE.txt for additional licensing information.
#++

##
# TarReader reads tar files and allows iteration over their items

class Gem::Package::TarReader
  include Enumerable

  ##
  # Raised if the tar IO is not seekable

  class UnexpectedEOF < StandardError; end

  ##
  # Creates a new TarReader on +io+ and yields it to the block, if given.

  def self.new(io)
    reader = super

    return reader unless block_given?

    begin
      yield reader
    ensure
      reader.close
    end

    nil
  end

  ##
  # Creates a new tar file reader on +io+ which needs to respond to #pos,
  # #eof?, #read, #getc and #pos=

  def initialize(io)
    @io = io
    @init_pos = io.pos
  end

  ##
  # Close the tar file

  def close
  end

  ##
  # Iterates over files in the tarball yielding each entry

  def each
    return enum_for __method__ unless block_given?

    use_seek = @io.respond_to?(:seek)

    until @io.eof? do
      header = Gem::Package::TarHeader.from @io
      return if header.empty?

      entry = Gem::Package::TarReader::Entry.new header, @io
      size = entry.header.size

      yield entry

      skip = (512 - (size % 512)) % 512
      pending = size - entry.bytes_read

      if use_seek
        begin
          # avoid reading if the @io supports seeking
          @io.seek pending, IO::SEEK_CUR
          pending = 0
        rescue Errno::EINVAL
        end
      end

      # if seeking isn't supported or failed
      while pending > 0 do
        bytes_read = @io.read([pending, 4096].min).size
        raise UnexpectedEOF if @io.eof?
        pending -= bytes_read
      end

      @io.read skip # discard trailing zeros

      # make sure nobody can use #read, #getc or #rewind anymore
      entry.close
    end
  end

  alias each_entry each

  ##
  # NOTE: Do not call #rewind during #each

  def rewind
    if @init_pos == 0
      @io.rewind
    else
      @io.pos = @init_pos
    end
  end

  ##
  # Seeks through the tar file until it finds the +entry+ with +name+ and
  # yields it.  Rewinds the tar file to the beginning when the block
  # terminates.

  def seek(name) # :yields: entry
    found = find do |entry|
      entry.full_name == name
    end

    return unless found

    return yield found
  ensure
    rewind
  end
end

require_relative "tar_reader/entry"
PK}$[�:�@

'rubygems/rubygems/package/tar_writer.rbnu�[���# frozen_string_literal: true
#--
# Copyright (C) 2004 Mauricio Julio Fernández Pradier
# See LICENSE.txt for additional licensing information.
#++

##
# Allows writing of tar files

class Gem::Package::TarWriter
  class FileOverflow < StandardError; end

  ##
  # IO wrapper that allows writing a limited amount of data

  class BoundedStream
    ##
    # Maximum number of bytes that can be written

    attr_reader :limit

    ##
    # Number of bytes written

    attr_reader :written

    ##
    # Wraps +io+ and allows up to +limit+ bytes to be written

    def initialize(io, limit)
      @io = io
      @limit = limit
      @written = 0
    end

    ##
    # Writes +data+ onto the IO, raising a FileOverflow exception if the
    # number of bytes will be more than #limit

    def write(data)
      if data.bytesize + @written > @limit
        raise FileOverflow, "You tried to feed more data than fits in the file."
      end
      @io.write data
      @written += data.bytesize
      data.bytesize
    end
  end

  ##
  # IO wrapper that provides only #write

  class RestrictedStream
    ##
    # Creates a new RestrictedStream wrapping +io+

    def initialize(io)
      @io = io
    end

    ##
    # Writes +data+ onto the IO

    def write(data)
      @io.write data
    end
  end

  ##
  # Creates a new TarWriter, yielding it if a block is given

  def self.new(io)
    writer = super

    return writer unless block_given?

    begin
      yield writer
    ensure
      writer.close
    end

    nil
  end

  ##
  # Creates a new TarWriter that will write to +io+

  def initialize(io)
    @io = io
    @closed = false
  end

  ##
  # Adds file +name+ with permissions +mode+, and yields an IO for writing the
  # file to

  def add_file(name, mode) # :yields: io
    check_closed

    name, prefix = split_name name

    init_pos = @io.pos
    @io.write Gem::Package::TarHeader::EMPTY_HEADER # placeholder for the header

    yield RestrictedStream.new(@io) if block_given?

    size = @io.pos - init_pos - 512

    remainder = (512 - (size % 512)) % 512
    @io.write "\0" * remainder

    final_pos = @io.pos
    @io.pos = init_pos

    header = Gem::Package::TarHeader.new :name => name, :mode => mode,
                                         :size => size, :prefix => prefix,
                                         :mtime => Gem.source_date_epoch

    @io.write header
    @io.pos = final_pos

    self
  end

  ##
  # Adds +name+ with permissions +mode+ to the tar, yielding +io+ for writing
  # the file.  The +digest_algorithm+ is written to a read-only +name+.sum
  # file following the given file contents containing the digest name and
  # hexdigest separated by a tab.
  #
  # The created digest object is returned.

  def add_file_digest(name, mode, digest_algorithms) # :yields: io
    digests = digest_algorithms.map do |digest_algorithm|
      digest = digest_algorithm.new
      digest_name =
        if digest.respond_to? :name
          digest.name
        else
          digest_algorithm.class.name[/::([^:]+)\z/, 1]
        end

      [digest_name, digest]
    end

    digests = Hash[*digests.flatten]

    add_file name, mode do |io|
      Gem::Package::DigestIO.wrap io, digests do |digest_io|
        yield digest_io
      end
    end

    digests
  end

  ##
  # Adds +name+ with permissions +mode+ to the tar, yielding +io+ for writing
  # the file.  The +signer+ is used to add a digest file using its
  # digest_algorithm per add_file_digest and a cryptographic signature in
  # +name+.sig.  If the signer has no key only the checksum file is added.
  #
  # Returns the digest.

  def add_file_signed(name, mode, signer)
    digest_algorithms = [
      signer.digest_algorithm,
      Gem::Security.create_digest("SHA512"),
    ].compact.uniq

    digests = add_file_digest name, mode, digest_algorithms do |io|
      yield io
    end

    signature_digest = digests.values.compact.find do |digest|
      digest_name =
        if digest.respond_to? :name
          digest.name
        else
          digest.class.name[/::([^:]+)\z/, 1]
        end

      digest_name == signer.digest_name
    end

    raise "no #{signer.digest_name} in #{digests.values.compact}" unless signature_digest

    if signer.key
      signature = signer.sign signature_digest.digest

      add_file_simple "#{name}.sig", 0444, signature.length do |io|
        io.write signature
      end
    end

    digests
  end

  ##
  # Add file +name+ with permissions +mode+ +size+ bytes long.  Yields an IO
  # to write the file to.

  def add_file_simple(name, mode, size) # :yields: io
    check_closed

    name, prefix = split_name name

    header = Gem::Package::TarHeader.new(:name => name, :mode => mode,
                                         :size => size, :prefix => prefix,
                                         :mtime => Gem.source_date_epoch).to_s

    @io.write header
    os = BoundedStream.new @io, size

    yield os if block_given?

    min_padding = size - os.written
    @io.write("\0" * min_padding)

    remainder = (512 - (size % 512)) % 512
    @io.write("\0" * remainder)

    self
  end

  ##
  # Adds symlink +name+ with permissions +mode+, linking to +target+.

  def add_symlink(name, target, mode)
    check_closed

    name, prefix = split_name name

    header = Gem::Package::TarHeader.new(:name => name, :mode => mode,
                                         :size => 0, :typeflag => "2",
                                         :linkname => target,
                                         :prefix => prefix,
                                         :mtime => Gem.source_date_epoch).to_s

    @io.write header

    self
  end

  ##
  # Raises IOError if the TarWriter is closed

  def check_closed
    raise IOError, "closed #{self.class}" if closed?
  end

  ##
  # Closes the TarWriter

  def close
    check_closed

    @io.write "\0" * 1024
    flush

    @closed = true
  end

  ##
  # Is the TarWriter closed?

  def closed?
    @closed
  end

  ##
  # Flushes the TarWriter's IO

  def flush
    check_closed

    @io.flush if @io.respond_to? :flush
  end

  ##
  # Creates a new directory in the tar file +name+ with +mode+

  def mkdir(name, mode)
    check_closed

    name, prefix = split_name(name)

    header = Gem::Package::TarHeader.new :name => name, :mode => mode,
                                         :typeflag => "5", :size => 0,
                                         :prefix => prefix,
                                         :mtime => Gem.source_date_epoch

    @io.write header

    self
  end

  ##
  # Splits +name+ into a name and prefix that can fit in the TarHeader

  def split_name(name) # :nodoc:
    if name.bytesize > 256
      raise Gem::Package::TooLongFileName.new("File \"#{name}\" has a too long path (should be 256 or less)")
    end

    prefix = ""
    if name.bytesize > 100
      parts = name.split("/", -1) # parts are never empty here
      name = parts.pop            # initially empty for names with a trailing slash ("foo/.../bar/")
      prefix = parts.join("/")    # if empty, then it's impossible to split (parts is empty too)
      while !parts.empty? && (prefix.bytesize > 155 || name.empty?)
        name = parts.pop + "/" + name
        prefix = parts.join("/")
      end

      if name.bytesize > 100 || prefix.empty?
        raise Gem::Package::TooLongFileName.new("File \"#{prefix}/#{name}\" has a too long name (should be 100 or less)")
      end

      if prefix.bytesize > 155
        raise Gem::Package::TooLongFileName.new("File \"#{prefix}/#{name}\" has a too long base path (should be 155 or less)")
      end
    end

    return name, prefix
  end
end
PK}$[�&-GG#rubygems/rubygems/package/source.rbnu�[���# frozen_string_literal: true
class Gem::Package::Source # :nodoc:
end
PK}$[�a��aa(rubygems/rubygems/package/file_source.rbnu�[���# frozen_string_literal: true
##
# The primary source of gems is a file on disk, including all usages
# internal to rubygems.
#
# This is a private class, do not depend on it directly. Instead, pass a path
# object to `Gem::Package.new`.

class Gem::Package::FileSource < Gem::Package::Source # :nodoc: all
  attr_reader :path

  def initialize(path)
    @path = path
  end

  def start
    @start ||= File.read path, 20
  end

  def present?
    File.exist? path
  end

  def with_write_io(&block)
    File.open path, "wb", &block
  end

  def with_read_io(&block)
    File.open path, "rb", &block
  end
end
PK}$[4����'rubygems/rubygems/package/tar_header.rbnu�[���# frozen_string_literal: true
#--
# Copyright (C) 2004 Mauricio Julio Fernández Pradier
# See LICENSE.txt for additional licensing information.
#++

##
#--
# struct tarfile_entry_posix {
#   char name[100];     # ASCII + (Z unless filled)
#   char mode[8];       # 0 padded, octal, null
#   char uid[8];        # ditto
#   char gid[8];        # ditto
#   char size[12];      # 0 padded, octal, null
#   char mtime[12];     # 0 padded, octal, null
#   char checksum[8];   # 0 padded, octal, null, space
#   char typeflag[1];   # file: "0"  dir: "5"
#   char linkname[100]; # ASCII + (Z unless filled)
#   char magic[6];      # "ustar\0"
#   char version[2];    # "00"
#   char uname[32];     # ASCIIZ
#   char gname[32];     # ASCIIZ
#   char devmajor[8];   # 0 padded, octal, null
#   char devminor[8];   # o padded, octal, null
#   char prefix[155];   # ASCII + (Z unless filled)
# };
#++
# A header for a tar file

class Gem::Package::TarHeader
  ##
  # Fields in the tar header

  FIELDS = [
    :checksum,
    :devmajor,
    :devminor,
    :gid,
    :gname,
    :linkname,
    :magic,
    :mode,
    :mtime,
    :name,
    :prefix,
    :size,
    :typeflag,
    :uid,
    :uname,
    :version,
  ].freeze

  ##
  # Pack format for a tar header

  PACK_FORMAT = "a100" + # name
                "a8"   + # mode
                "a8"   + # uid
                "a8"   + # gid
                "a12"  + # size
                "a12"  + # mtime
                "a7a"  + # chksum
                "a"    + # typeflag
                "a100" + # linkname
                "a6"   + # magic
                "a2"   + # version
                "a32"  + # uname
                "a32"  + # gname
                "a8"   + # devmajor
                "a8"   + # devminor
                "a155"   # prefix

  ##
  # Unpack format for a tar header

  UNPACK_FORMAT = "A100" + # name
                  "A8"   + # mode
                  "A8"   + # uid
                  "A8"   + # gid
                  "A12"  + # size
                  "A12"  + # mtime
                  "A8"   + # checksum
                  "A"    + # typeflag
                  "A100" + # linkname
                  "A6"   + # magic
                  "A2"   + # version
                  "A32"  + # uname
                  "A32"  + # gname
                  "A8"   + # devmajor
                  "A8"   + # devminor
                  "A155"   # prefix

  attr_reader(*FIELDS)

  EMPTY_HEADER = ("\0" * 512).freeze # :nodoc:

  ##
  # Creates a tar header from IO +stream+

  def self.from(stream)
    header = stream.read 512
    empty = (EMPTY_HEADER == header)

    fields = header.unpack UNPACK_FORMAT

    new :name     => fields.shift,
        :mode     => strict_oct(fields.shift),
        :uid      => oct_or_256based(fields.shift),
        :gid      => oct_or_256based(fields.shift),
        :size     => strict_oct(fields.shift),
        :mtime    => strict_oct(fields.shift),
        :checksum => strict_oct(fields.shift),
        :typeflag => fields.shift,
        :linkname => fields.shift,
        :magic    => fields.shift,
        :version  => strict_oct(fields.shift),
        :uname    => fields.shift,
        :gname    => fields.shift,
        :devmajor => strict_oct(fields.shift),
        :devminor => strict_oct(fields.shift),
        :prefix   => fields.shift,

        :empty => empty
  end

  def self.strict_oct(str)
    return str.strip.oct if str.strip =~ /\A[0-7]*\z/

    raise ArgumentError, "#{str.inspect} is not an octal string"
  end

  def self.oct_or_256based(str)
    # \x80 flags a positive 256-based number
    # \ff flags a negative 256-based number
    # In case we have a match, parse it as a signed binary value
    # in big-endian order, except that the high-order bit is ignored.
    return str.unpack("N2").last if str =~ /\A[\x80\xff]/n
    strict_oct(str)
  end

  ##
  # Creates a new TarHeader using +vals+

  def initialize(vals)
    unless vals[:name] && vals[:size] && vals[:prefix] && vals[:mode]
      raise ArgumentError, ":name, :size, :prefix and :mode required"
    end

    vals[:uid] ||= 0
    vals[:gid] ||= 0
    vals[:mtime] ||= 0
    vals[:checksum] ||= ""
    vals[:typeflag] = "0" if vals[:typeflag].nil? || vals[:typeflag].empty?
    vals[:magic] ||= "ustar"
    vals[:version] ||= "00"
    vals[:uname] ||= "wheel"
    vals[:gname] ||= "wheel"
    vals[:devmajor] ||= 0
    vals[:devminor] ||= 0

    FIELDS.each do |name|
      instance_variable_set "@#{name}", vals[name]
    end

    @empty = vals[:empty]
  end

  ##
  # Is the tar entry empty?

  def empty?
    @empty
  end

  def ==(other) # :nodoc:
    self.class === other &&
      @checksum == other.checksum &&
      @devmajor == other.devmajor &&
      @devminor == other.devminor &&
      @gid      == other.gid      &&
      @gname    == other.gname    &&
      @linkname == other.linkname &&
      @magic    == other.magic    &&
      @mode     == other.mode     &&
      @mtime    == other.mtime    &&
      @name     == other.name     &&
      @prefix   == other.prefix   &&
      @size     == other.size     &&
      @typeflag == other.typeflag &&
      @uid      == other.uid      &&
      @uname    == other.uname    &&
      @version  == other.version
  end

  def to_s # :nodoc:
    update_checksum
    header
  end

  ##
  # Updates the TarHeader's checksum

  def update_checksum
    header = header " " * 8
    @checksum = oct calculate_checksum(header), 6
  end

  private

  def calculate_checksum(header)
    header.unpack("C*").inject {|a, b| a + b }
  end

  def header(checksum = @checksum)
    header = [
      name,
      oct(mode, 7),
      oct(uid, 7),
      oct(gid, 7),
      oct(size, 11),
      oct(mtime, 11),
      checksum,
      " ",
      typeflag,
      linkname,
      magic,
      oct(version, 2),
      uname,
      gname,
      oct(devmajor, 7),
      oct(devminor, 7),
      prefix,
    ]

    header = header.pack PACK_FORMAT

    header << ("\0" * ((512 - header.size) % 512))
  end

  def oct(num, len)
    "%0#{len}o" % num
  end
end
PK}$[��� rubygems/rubygems/package/old.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

##
# The format class knows the guts of the ancient .gem file format and provides
# the capability to read such ancient gems.
#
# Please pretend this doesn't exist.

class Gem::Package::Old < Gem::Package
  undef_method :spec=

  ##
  # Creates a new old-format package reader for +gem+.  Old-format packages
  # cannot be written.

  def initialize(gem, security_policy)
    require "fileutils"
    require "zlib"
    Gem.load_yaml

    @contents        = nil
    @gem             = gem
    @security_policy = security_policy
    @spec            = nil
  end

  ##
  # A list of file names contained in this gem

  def contents
    verify

    return @contents if @contents

    @gem.with_read_io do |io|
      read_until_dashes io # spec
      header = file_list io

      @contents = header.map {|file| file["path"] }
    end
  end

  ##
  # Extracts the files in this package into +destination_dir+

  def extract_files(destination_dir)
    verify

    errstr = "Error reading files from gem"

    @gem.with_read_io do |io|
      read_until_dashes io # spec
      header = file_list io
      raise Gem::Exception, errstr unless header

      header.each do |entry|
        full_name = entry["path"]

        destination = install_location full_name, destination_dir

        file_data = String.new

        read_until_dashes io do |line|
          file_data << line
        end

        file_data = file_data.strip.unpack("m")[0]
        file_data = Zlib::Inflate.inflate file_data

        raise Gem::Package::FormatError, "#{full_name} in #{@gem} is corrupt" if
          file_data.length != entry["size"].to_i

        FileUtils.rm_rf destination

        FileUtils.mkdir_p File.dirname(destination), :mode => dir_mode && 0755

        File.open destination, "wb", file_mode(entry["mode"]) do |out|
          out.write file_data
        end

        verbose destination
      end
    end
  rescue Zlib::DataError
    raise Gem::Exception, errstr
  end

  ##
  # Reads the file list section from the old-format gem +io+

  def file_list(io) # :nodoc:
    header = String.new

    read_until_dashes io do |line|
      header << line
    end

    Gem::SafeYAML.safe_load header
  end

  ##
  # Reads lines until a "---" separator is found

  def read_until_dashes(io) # :nodoc:
    while (line = io.gets) && line.chomp.strip != "---" do
      yield line if block_given?
    end
  end

  ##
  # Skips the Ruby self-install header in +io+.

  def skip_ruby(io) # :nodoc:
    loop do
      line = io.gets

      return if line.chomp == "__END__"
      break unless line
    end

    raise Gem::Exception, "Failed to find end of Ruby script while reading gem"
  end

  ##
  # The specification for this gem

  def spec
    verify

    return @spec if @spec

    yaml = String.new

    @gem.with_read_io do |io|
      skip_ruby io
      read_until_dashes io do |line|
        yaml << line
      end
    end

    begin
      @spec = Gem::Specification.from_yaml yaml
    rescue Psych::SyntaxError
      raise Gem::Exception, "Failed to parse gem specification out of gem file"
    end
  rescue ArgumentError
    raise Gem::Exception, "Failed to parse gem specification out of gem file"
  end

  ##
  # Raises an exception if a security policy that verifies data is active.
  # Old format gems cannot be verified as signed.

  def verify
    return true unless @security_policy

    raise Gem::Security::Exception,
          "old format gems do not contain signatures and cannot be verified" if
      @security_policy.verify_data

    true
  end
end
PK}$[$B6--&rubygems/rubygems/package/io_source.rbnu�[���# frozen_string_literal: true
##
# Supports reading and writing gems from/to a generic IO object.  This is
# useful for other applications built on top of rubygems, such as
# rubygems.org.
#
# This is a private class, do not depend on it directly. Instead, pass an IO
# object to `Gem::Package.new`.

class Gem::Package::IOSource < Gem::Package::Source # :nodoc: all
  attr_reader :io

  def initialize(io)
    @io = io
  end

  def start
    @start ||= begin
      if io.pos > 0
        raise Gem::Package::Error, "Cannot read start unless IO is at start"
      end

      value = io.read 20
      io.rewind
      value
    end
  end

  def present?
    true
  end

  def with_read_io
    yield io
  ensure
    io.rewind
  end

  def with_write_io
    yield io
  ensure
    io.rewind
  end

  def path
  end
end
PK}$[��̊SS&rubygems/rubygems/package/digest_io.rbnu�[���# frozen_string_literal: true
##
# IO wrapper that creates digests of contents written to the IO it wraps.

class Gem::Package::DigestIO
  ##
  # Collected digests for wrapped writes.
  #
  #   {
  #     'SHA1'   => #<OpenSSL::Digest: [...]>,
  #     'SHA512' => #<OpenSSL::Digest: [...]>,
  #   }

  attr_reader :digests

  ##
  # Wraps +io+ and updates digest for each of the digest algorithms in
  # the +digests+ Hash.  Returns the digests hash.  Example:
  #
  #   io = StringIO.new
  #   digests = {
  #     'SHA1'   => OpenSSL::Digest.new('SHA1'),
  #     'SHA512' => OpenSSL::Digest.new('SHA512'),
  #   }
  #
  #   Gem::Package::DigestIO.wrap io, digests do |digest_io|
  #     digest_io.write "hello"
  #   end
  #
  #   digests['SHA1'].hexdigest   #=> "aaf4c61d[...]"
  #   digests['SHA512'].hexdigest #=> "9b71d224[...]"

  def self.wrap(io, digests)
    digest_io = new io, digests

    yield digest_io

    return digests
  end

  ##
  # Creates a new DigestIO instance.  Using ::wrap is recommended, see the
  # ::wrap documentation for documentation of +io+ and +digests+.

  def initialize(io, digests)
    @io = io
    @digests = digests
  end

  ##
  # Writes +data+ to the underlying IO and updates the digests

  def write(data)
    result = @io.write data

    @digests.each do |_, digest|
      digest << data
    end

    result
  end
end
PK}$[g��M�� rubygems/rubygems/mock_gem_ui.rbnu�[���# frozen_string_literal: true
require_relative "user_interaction"

##
# This Gem::StreamUI subclass records input and output to StringIO for
# retrieval during tests.

class Gem::MockGemUi < Gem::StreamUI
  ##
  # Raised when you haven't provided enough input to your MockGemUi

  class InputEOFError < RuntimeError
    def initialize(question)
      super "Out of input for MockGemUi on #{question.inspect}"
    end
  end

  class TermError < RuntimeError
    attr_reader :exit_code

    def initialize(exit_code)
      super
      @exit_code = exit_code
    end
  end
  class SystemExitException < RuntimeError; end

  module TTY

    attr_accessor :tty

    def tty?()
      @tty = true unless defined?(@tty)
      @tty
    end

    def noecho
      yield self
    end
  end

  def initialize(input = "")
    require "stringio"
    ins = StringIO.new input
    outs = StringIO.new
    errs = StringIO.new

    ins.extend TTY
    outs.extend TTY
    errs.extend TTY

    super ins, outs, errs, true

    @terminated = false
  end

  def ask(question)
    raise InputEOFError, question if @ins.eof?

    super
  end

  def input
    @ins.string
  end

  def output
    @outs.string
  end

  def error
    @errs.string
  end

  def terminated?
    @terminated
  end

  def terminate_interaction(status=0)
    @terminated = true

    raise TermError, status if status != 0
    raise SystemExitException
  end
end
PK}$[�VcUUrubygems/rubygems/defaults.rbnu�[���# frozen_string_literal: true
module Gem
  DEFAULT_HOST = "https://rubygems.org".freeze

  @post_install_hooks ||= []
  @done_installing_hooks ||= []
  @post_uninstall_hooks ||= []
  @pre_uninstall_hooks  ||= []
  @pre_install_hooks    ||= []

  ##
  # An Array of the default sources that come with RubyGems

  def self.default_sources
    %w[https://rubygems.org/]
  end

  ##
  # Default spec directory path to be used if an alternate value is not
  # specified in the environment

  def self.default_spec_cache_dir
    default_spec_cache_dir = File.join Gem.user_home, ".gem", "specs"

    unless File.exist?(default_spec_cache_dir)
      default_spec_cache_dir = File.join Gem.data_home, "gem", "specs"
    end

    default_spec_cache_dir
  end

  ##
  # Default home directory path to be used if an alternate value is not
  # specified in the environment

  def self.default_dir
   @default_dir ||= File.join(RbConfig::CONFIG["rubylibprefix"], "gems", RbConfig::CONFIG["ruby_version_dir_name"] || RbConfig::CONFIG["ruby_version"])
  end

  ##
  # Returns binary extensions dir for specified RubyGems base dir or nil
  # if such directory cannot be determined.
  #
  # By default, the binary extensions are located side by side with their
  # Ruby counterparts, therefore nil is returned

  def self.default_ext_dir_for(base_dir)
    nil
  end

  ##
  # Paths where RubyGems' .rb files and bin files are installed

  def self.default_rubygems_dirs
    nil # default to standard layout
  end

  ##
  # Path to specification files of default gems.

  def self.default_specifications_dir
    @default_specifications_dir ||= File.join(Gem.default_dir, "specifications", "default")
  end

  ##
  # Finds the user's home directory.
  #--
  # Some comments from the ruby-talk list regarding finding the home
  # directory:
  #
  #   I have HOME, USERPROFILE and HOMEDRIVE + HOMEPATH. Ruby seems
  #   to be depending on HOME in those code samples. I propose that
  #   it should fallback to USERPROFILE and HOMEDRIVE + HOMEPATH (at
  #   least on Win32).
  #++
  #--
  #
  #++

  def self.find_home
    Dir.home.dup
  rescue
    if Gem.win_platform?
      File.expand_path File.join(ENV["HOMEDRIVE"] || ENV["SystemDrive"], "/")
    else
      File.expand_path "/"
    end
  end

  private_class_method :find_home

  ##
  # The home directory for the user.

  def self.user_home
    @user_home ||= find_home.tap(&Gem::UNTAINT)
  end

  ##
  # Path for gems in the user's home directory

  def self.user_dir
    gem_dir = File.join(Gem.user_home, ".gem")
    gem_dir = File.join(Gem.data_home, "gem") unless File.exist?(gem_dir)
    parts = [gem_dir, ruby_engine]
    ruby_version_dir_name = RbConfig::CONFIG["ruby_version_dir_name"] || RbConfig::CONFIG["ruby_version"]
    parts << ruby_version_dir_name unless ruby_version_dir_name.empty?
    File.join parts
  end

  ##
  # The path to standard location of the user's configuration directory.

  def self.config_home
    @config_home ||= (ENV["XDG_CONFIG_HOME"] || File.join(Gem.user_home, ".config"))
  end

  ##
  # Finds the user's config file

  def self.find_config_file
    gemrc = File.join Gem.user_home, ".gemrc"
    if File.exist? gemrc
      gemrc
    else
      File.join Gem.config_home, "gem", "gemrc"
    end
  end

  ##
  # The path to standard location of the user's .gemrc file.

  def self.config_file
    @config_file ||= find_config_file.tap(&Gem::UNTAINT)
  end

  ##
  # The path to standard location of the user's cache directory.

  def self.cache_home
    @cache_home ||= (ENV["XDG_CACHE_HOME"] || File.join(Gem.user_home, ".cache"))
  end

  ##
  # The path to standard location of the user's data directory.

  def self.data_home
    @data_home ||= (ENV["XDG_DATA_HOME"] || File.join(Gem.user_home, ".local", "share"))
  end

  ##
  # How String Gem paths should be split.  Overridable for esoteric platforms.

  def self.path_separator
    File::PATH_SEPARATOR
  end

  ##
  # Default gem load path

  def self.default_path
    path = []
    path << user_dir if user_home && File.exist?(user_home)
    path << default_dir
    path << vendor_dir if vendor_dir && File.directory?(vendor_dir)
    path
  end

  ##
  # Deduce Ruby's --program-prefix and --program-suffix from its install name

  def self.default_exec_format
    exec_format = RbConfig::CONFIG["ruby_install_name"].sub("ruby", "%s") rescue "%s"

    unless exec_format =~ /%s/
      raise Gem::Exception,
        "[BUG] invalid exec_format #{exec_format.inspect}, no %s"
    end

    exec_format
  end

  ##
  # The default directory for binaries

  def self.default_bindir
    RbConfig::CONFIG["bindir"]
  end

  def self.ruby_engine
    RUBY_ENGINE
  end

  ##
  # The default signing key path

  def self.default_key_path
    default_key_path = File.join Gem.user_home, ".gem", "gem-private_key.pem"

    unless File.exist?(default_key_path)
      default_key_path = File.join Gem.data_home, "gem", "gem-private_key.pem"
    end

    default_key_path
  end

  ##
  # The default signing certificate chain path

  def self.default_cert_path
    default_cert_path = File.join Gem.user_home, ".gem", "gem-public_cert.pem"

    unless File.exist?(default_cert_path)
      default_cert_path = File.join Gem.data_home, "gem", "gem-public_cert.pem"
    end

    default_cert_path
  end

  ##
  # Install extensions into lib as well as into the extension directory.

  def self.install_extension_in_lib # :nodoc:
    true
  end

  ##
  # Directory where vendor gems are installed.

  def self.vendor_dir # :nodoc:
    if vendor_dir = ENV["GEM_VENDOR"]
      return vendor_dir.dup
    end

    return nil unless RbConfig::CONFIG.key? "vendordir"

    File.join RbConfig::CONFIG["vendordir"], "gems",
              RbConfig::CONFIG["ruby_version_dir_name"] || RbConfig::CONFIG["ruby_version"]
  end

  ##
  # Default options for gem commands for Ruby packagers.
  #
  # The options here should be structured as an array of string "gem"
  # command names as keys and a string of the default options as values.
  #
  # Example:
  #
  # def self.operating_system_defaults
  #   {
  #       'install' => '--no-rdoc --no-ri --env-shebang',
  #       'update' => '--no-rdoc --no-ri --env-shebang'
  #   }
  # end

  def self.operating_system_defaults
    {}
  end

  ##
  # Default options for gem commands for Ruby implementers.
  #
  # The options here should be structured as an array of string "gem"
  # command names as keys and a string of the default options as values.
  #
  # Example:
  #
  # def self.platform_defaults
  #   {
  #       'install' => '--no-rdoc --no-ri --env-shebang',
  #       'update' => '--no-rdoc --no-ri --env-shebang'
  #   }
  # end

  def self.platform_defaults
    {}
  end
end
PK}$[|����)rubygems/rubygems/request_set/lockfile.rbnu�[���# frozen_string_literal: true
##
# Parses a gem.deps.rb.lock file and constructs a LockSet containing the
# dependencies found inside.  If the lock file is missing no LockSet is
# constructed.

class Gem::RequestSet::Lockfile
  ##
  # Raised when a lockfile cannot be parsed

  class ParseError < Gem::Exception
    ##
    # The column where the error was encountered

    attr_reader :column

    ##
    # The line where the error was encountered

    attr_reader :line

    ##
    # The location of the lock file

    attr_reader :path

    ##
    # Raises a ParseError with the given +message+ which was encountered at a
    # +line+ and +column+ while parsing.

    def initialize(message, column, line, path)
      @line   = line
      @column = column
      @path   = path
      super "#{message} (at line #{line} column #{column})"
    end
  end

  ##
  # Creates a new Lockfile for the given +request_set+ and +gem_deps_file+
  # location.

  def self.build(request_set, gem_deps_file, dependencies = nil)
    request_set.resolve
    dependencies ||= requests_to_deps request_set.sorted_requests
    new request_set, gem_deps_file, dependencies
  end

  def self.requests_to_deps(requests) # :nodoc:
    deps = {}

    requests.each do |request|
      spec        = request.spec
      name        = request.name
      requirement = request.request.dependency.requirement

      deps[name] = if [Gem::Resolver::VendorSpecification,
                       Gem::Resolver::GitSpecification].include? spec.class
        Gem::Requirement.source_set
      else
        requirement
      end
    end

    deps
  end

  ##
  # The platforms for this Lockfile

  attr_reader :platforms

  def initialize(request_set, gem_deps_file, dependencies)
    @set           = request_set
    @dependencies  = dependencies
    @gem_deps_file = File.expand_path(gem_deps_file)
    @gem_deps_dir  = File.dirname(@gem_deps_file)

    if RUBY_VERSION < "2.7"
      @gem_deps_file.untaint unless gem_deps_file.tainted?
    end

    @platforms = []
  end

  def add_DEPENDENCIES(out) # :nodoc:
    out << "DEPENDENCIES"

    out.concat @dependencies.sort_by {|name,| name }.map {|name, requirement|
      "  #{name}#{requirement.for_lockfile}"
    }

    out << nil
  end

  def add_GEM(out, spec_groups) # :nodoc:
    return if spec_groups.empty?

    source_groups = spec_groups.values.flatten.group_by do |request|
      request.spec.source.uri
    end

    source_groups.sort_by {|group,| group.to_s }.map do |group, requests|
      out << "GEM"
      out << "  remote: #{group}"
      out << "  specs:"

      requests.sort_by {|request| request.name }.each do |request|
        next if request.spec.name == "bundler"
        platform = "-#{request.spec.platform}" unless
          Gem::Platform::RUBY == request.spec.platform

        out << "    #{request.name} (#{request.version}#{platform})"

        request.full_spec.dependencies.sort.each do |dependency|
          next if dependency.type == :development

          requirement = dependency.requirement
          out << "      #{dependency.name}#{requirement.for_lockfile}"
        end
      end
      out << nil
    end
  end

  def add_GIT(out, git_requests)
    return if git_requests.empty?

    by_repository_revision = git_requests.group_by do |request|
      source = request.spec.source
      [source.repository, source.rev_parse]
    end

    by_repository_revision.each do |(repository, revision), requests|
      out << "GIT"
      out << "  remote: #{repository}"
      out << "  revision: #{revision}"
      out << "  specs:"

      requests.sort_by {|request| request.name }.each do |request|
        out << "    #{request.name} (#{request.version})"

        dependencies = request.spec.dependencies.sort_by {|dep| dep.name }
        dependencies.each do |dep|
          out << "      #{dep.name}#{dep.requirement.for_lockfile}"
        end
      end
      out << nil
    end
  end

  def relative_path_from(dest, base) # :nodoc:
    dest = File.expand_path(dest)
    base = File.expand_path(base)

    if dest.index(base) == 0
      offset = dest[base.size + 1..-1]

      return "." unless offset

      offset
    else
      dest
    end
  end

  def add_PATH(out, path_requests) # :nodoc:
    return if path_requests.empty?

    out << "PATH"
    path_requests.each do |request|
      directory = File.expand_path(request.spec.source.uri)

      out << "  remote: #{relative_path_from directory, @gem_deps_dir}"
      out << "  specs:"
      out << "    #{request.name} (#{request.version})"
    end

    out << nil
  end

  def add_PLATFORMS(out) # :nodoc:
    out << "PLATFORMS"

    platforms = requests.map {|request| request.spec.platform }.uniq

    platforms = platforms.sort_by {|platform| platform.to_s }

    platforms.each do |platform|
      out << "  #{platform}"
    end

    out << nil
  end

  def spec_groups
    requests.group_by {|request| request.spec.class }
  end

  ##
  # The contents of the lock file.

  def to_s
    out = []

    groups = spec_groups

    add_PATH out, groups.delete(Gem::Resolver::VendorSpecification) { [] }

    add_GIT out, groups.delete(Gem::Resolver::GitSpecification) { [] }

    add_GEM out, groups

    add_PLATFORMS out

    add_DEPENDENCIES out

    out.join "\n"
  end

  ##
  # Writes the lock file alongside the gem dependencies file

  def write
    content = to_s

    File.open "#{@gem_deps_file}.lock", "w" do |io|
      io.write content
    end
  end

  private

  def requests
    @set.sorted_requests
  end
end

require_relative "lockfile/tokenizer"
PK}$[�_�RZRZ3rubygems/rubygems/request_set/gem_dependency_api.rbnu�[���# frozen_string_literal: true
##
# A semi-compatible DSL for the Bundler Gemfile and Isolate gem dependencies
# files.
#
# To work with both the Bundler Gemfile and Isolate formats this
# implementation takes some liberties to allow compatibility with each, most
# notably in #source.
#
# A basic gem dependencies file will look like the following:
#
#   source 'https://rubygems.org'
#
#   gem 'rails', '3.2.14a
#   gem 'devise', '~> 2.1', '>= 2.1.3'
#   gem 'cancan'
#   gem 'airbrake'
#   gem 'pg'
#
# RubyGems recommends saving this as gem.deps.rb over Gemfile or Isolate.
#
# To install the gems in this Gemfile use `gem install -g` to install it and
# create a lockfile.  The lockfile will ensure that when you make changes to
# your gem dependencies file a minimum amount of change is made to the
# dependencies of your gems.
#
# RubyGems can activate all the gems in your dependencies file at startup
# using the RUBYGEMS_GEMDEPS environment variable or through Gem.use_gemdeps.
# See Gem.use_gemdeps for details and warnings.
#
# See `gem help install` and `gem help gem_dependencies` for further details.

class Gem::RequestSet::GemDependencyAPI
  ENGINE_MAP = { # :nodoc:
    :jruby        => %w[jruby],
    :jruby_18     => %w[jruby],
    :jruby_19     => %w[jruby],
    :maglev       => %w[maglev],
    :mri          => %w[ruby],
    :mri_18       => %w[ruby],
    :mri_19       => %w[ruby],
    :mri_20       => %w[ruby],
    :mri_21       => %w[ruby],
    :rbx          => %w[rbx],
    :truffleruby  => %w[truffleruby],
    :ruby         => %w[ruby rbx maglev truffleruby],
    :ruby_18      => %w[ruby rbx maglev truffleruby],
    :ruby_19      => %w[ruby rbx maglev truffleruby],
    :ruby_20      => %w[ruby rbx maglev truffleruby],
    :ruby_21      => %w[ruby rbx maglev truffleruby],
  }.freeze

  mswin     = Gem::Platform.new "x86-mswin32"
  mswin64   = Gem::Platform.new "x64-mswin64"
  x86_mingw = Gem::Platform.new "x86-mingw32"
  x64_mingw = Gem::Platform.new "x64-mingw32"

  PLATFORM_MAP = { # :nodoc:
    :jruby        => Gem::Platform::RUBY,
    :jruby_18     => Gem::Platform::RUBY,
    :jruby_19     => Gem::Platform::RUBY,
    :maglev       => Gem::Platform::RUBY,
    :mingw        => x86_mingw,
    :mingw_18     => x86_mingw,
    :mingw_19     => x86_mingw,
    :mingw_20     => x86_mingw,
    :mingw_21     => x86_mingw,
    :mri          => Gem::Platform::RUBY,
    :mri_18       => Gem::Platform::RUBY,
    :mri_19       => Gem::Platform::RUBY,
    :mri_20       => Gem::Platform::RUBY,
    :mri_21       => Gem::Platform::RUBY,
    :mswin        => mswin,
    :mswin_18     => mswin,
    :mswin_19     => mswin,
    :mswin_20     => mswin,
    :mswin_21     => mswin,
    :mswin64      => mswin64,
    :mswin64_19   => mswin64,
    :mswin64_20   => mswin64,
    :mswin64_21   => mswin64,
    :rbx          => Gem::Platform::RUBY,
    :ruby         => Gem::Platform::RUBY,
    :ruby_18      => Gem::Platform::RUBY,
    :ruby_19      => Gem::Platform::RUBY,
    :ruby_20      => Gem::Platform::RUBY,
    :ruby_21      => Gem::Platform::RUBY,
    :truffleruby  => Gem::Platform::RUBY,
    :x64_mingw    => x64_mingw,
    :x64_mingw_20 => x64_mingw,
    :x64_mingw_21 => x64_mingw,
  }.freeze

  gt_eq_0        = Gem::Requirement.new ">= 0"
  tilde_gt_1_8_0 = Gem::Requirement.new "~> 1.8.0"
  tilde_gt_1_9_0 = Gem::Requirement.new "~> 1.9.0"
  tilde_gt_2_0_0 = Gem::Requirement.new "~> 2.0.0"
  tilde_gt_2_1_0 = Gem::Requirement.new "~> 2.1.0"

  VERSION_MAP = { # :nodoc:
    :jruby        => gt_eq_0,
    :jruby_18     => tilde_gt_1_8_0,
    :jruby_19     => tilde_gt_1_9_0,
    :maglev       => gt_eq_0,
    :mingw        => gt_eq_0,
    :mingw_18     => tilde_gt_1_8_0,
    :mingw_19     => tilde_gt_1_9_0,
    :mingw_20     => tilde_gt_2_0_0,
    :mingw_21     => tilde_gt_2_1_0,
    :mri          => gt_eq_0,
    :mri_18       => tilde_gt_1_8_0,
    :mri_19       => tilde_gt_1_9_0,
    :mri_20       => tilde_gt_2_0_0,
    :mri_21       => tilde_gt_2_1_0,
    :mswin        => gt_eq_0,
    :mswin_18     => tilde_gt_1_8_0,
    :mswin_19     => tilde_gt_1_9_0,
    :mswin_20     => tilde_gt_2_0_0,
    :mswin_21     => tilde_gt_2_1_0,
    :mswin64      => gt_eq_0,
    :mswin64_19   => tilde_gt_1_9_0,
    :mswin64_20   => tilde_gt_2_0_0,
    :mswin64_21   => tilde_gt_2_1_0,
    :rbx          => gt_eq_0,
    :ruby         => gt_eq_0,
    :ruby_18      => tilde_gt_1_8_0,
    :ruby_19      => tilde_gt_1_9_0,
    :ruby_20      => tilde_gt_2_0_0,
    :ruby_21      => tilde_gt_2_1_0,
    :truffleruby  => gt_eq_0,
    :x64_mingw    => gt_eq_0,
    :x64_mingw_20 => tilde_gt_2_0_0,
    :x64_mingw_21 => tilde_gt_2_1_0,
  }.freeze

  WINDOWS = { # :nodoc:
    :mingw        => :only,
    :mingw_18     => :only,
    :mingw_19     => :only,
    :mingw_20     => :only,
    :mingw_21     => :only,
    :mri          => :never,
    :mri_18       => :never,
    :mri_19       => :never,
    :mri_20       => :never,
    :mri_21       => :never,
    :mswin        => :only,
    :mswin_18     => :only,
    :mswin_19     => :only,
    :mswin_20     => :only,
    :mswin_21     => :only,
    :mswin64      => :only,
    :mswin64_19   => :only,
    :mswin64_20   => :only,
    :mswin64_21   => :only,
    :rbx          => :never,
    :ruby         => :never,
    :ruby_18      => :never,
    :ruby_19      => :never,
    :ruby_20      => :never,
    :ruby_21      => :never,
    :x64_mingw    => :only,
    :x64_mingw_20 => :only,
    :x64_mingw_21 => :only,
  }.freeze

  ##
  # The gems required by #gem statements in the gem.deps.rb file

  attr_reader :dependencies

  ##
  # A set of gems that are loaded via the +:git+ option to #gem

  attr_reader :git_set # :nodoc:

  ##
  # A Hash containing gem names and files to require from those gems.

  attr_reader :requires

  ##
  # A set of gems that are loaded via the +:path+ option to #gem

  attr_reader :vendor_set # :nodoc:

  ##
  # The groups of gems to exclude from installation

  attr_accessor :without_groups # :nodoc:

  ##
  # Creates a new GemDependencyAPI that will add dependencies to the
  # Gem::RequestSet +set+ based on the dependency API description in +path+.

  def initialize(set, path)
    @set = set
    @path = path

    @current_groups     = nil
    @current_platforms  = nil
    @current_repository = nil
    @dependencies       = {}
    @default_sources    = true
    @git_set            = @set.git_set
    @git_sources        = {}
    @installing         = false
    @requires           = Hash.new {|h, name| h[name] = [] }
    @vendor_set         = @set.vendor_set
    @source_set         = @set.source_set
    @gem_sources        = {}
    @without_groups     = []

    git_source :github do |repo_name|
      repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include? "/"

      "https://github.com/#{repo_name}.git"
    end

    git_source :bitbucket do |repo_name|
      repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include? "/"

      user, = repo_name.split "/", 2

      "https://#{user}@bitbucket.org/#{repo_name}.git"
    end
  end

  ##
  # Adds +dependencies+ to the request set if any of the +groups+ are allowed.
  # This is used for gemspec dependencies.

  def add_dependencies(groups, dependencies) # :nodoc:
    return unless (groups & @without_groups).empty?

    dependencies.each do |dep|
      @set.gem dep.name, *dep.requirement.as_list
    end
  end

  private :add_dependencies

  ##
  # Finds a gemspec with the given +name+ that lives at +path+.

  def find_gemspec(name, path) # :nodoc:
    glob = File.join path, "#{name}.gemspec"

    spec_files = Dir[glob]

    case spec_files.length
    when 1 then
      spec_file = spec_files.first

      spec = Gem::Specification.load spec_file

      return spec if spec

      raise ArgumentError, "invalid gemspec #{spec_file}"
    when 0 then
      raise ArgumentError, "no gemspecs found at #{Dir.pwd}"
    else
      raise ArgumentError,
        "found multiple gemspecs at #{Dir.pwd}, " +
        "use the name: option to specify the one you want"
    end
  end

  ##
  # Changes the behavior of gem dependency file loading to installing mode.
  # In installing mode certain restrictions are ignored such as ruby version
  # mismatch checks.

  def installing=(installing) # :nodoc:
    @installing = installing
  end

  ##
  # Loads the gem dependency file and returns self.

  def load
    instance_eval File.read(@path).tap(&Gem::UNTAINT), @path, 1

    self
  end

  ##
  # :category: Gem Dependencies DSL
  #
  # :call-seq:
  #   gem(name)
  #   gem(name, *requirements)
  #   gem(name, *requirements, options)
  #
  # Specifies a gem dependency with the given +name+ and +requirements+.  You
  # may also supply +options+ following the +requirements+
  #
  # +options+ include:
  #
  # require: ::
  #   RubyGems does not provide any autorequire features so requires in a gem
  #   dependencies file are recorded but ignored.
  #
  #   In bundler the require: option overrides the file to require during
  #   Bundler.require.  By default the name of the dependency is required in
  #   Bundler.  A single file or an Array of files may be given.
  #
  #   To disable requiring any file give +false+:
  #
  #     gem 'rake', require: false
  #
  # group: ::
  #   Place the dependencies in the given dependency group.  A single group or
  #   an Array of groups may be given.
  #
  #   See also #group
  #
  # platform: ::
  #   Only install the dependency on the given platform.  A single platform or
  #   an Array of platforms may be given.
  #
  #   See #platform for a list of platforms available.
  #
  # path: ::
  #   Install this dependency from an unpacked gem in the given directory.
  #
  #     gem 'modified_gem', path: 'vendor/modified_gem'
  #
  # git: ::
  #   Install this dependency from a git repository:
  #
  #     gem 'private_gem', git: git@my.company.example:private_gem.git'
  #
  # gist: ::
  #   Install this dependency from the gist ID:
  #
  #     gem 'bang', gist: '1232884'
  #
  # github: ::
  #   Install this dependency from a github git repository:
  #
  #     gem 'private_gem', github: 'my_company/private_gem'
  #
  # submodules: ::
  #   Set to +true+ to include submodules when fetching the git repository for
  #   git:, gist: and github: dependencies.
  #
  # ref: ::
  #   Use the given commit name or SHA for git:, gist: and github:
  #   dependencies.
  #
  # branch: ::
  #   Use the given branch for git:, gist: and github: dependencies.
  #
  # tag: ::
  #   Use the given tag for git:, gist: and github: dependencies.

  def gem(name, *requirements)
    options = requirements.pop if requirements.last.kind_of?(Hash)
    options ||= {}

    options[:git] = @current_repository if @current_repository

    source_set = false

    source_set ||= gem_path       name, options
    source_set ||= gem_git        name, options
    source_set ||= gem_git_source name, options
    source_set ||= gem_source     name, options

    duplicate = @dependencies.include? name

    @dependencies[name] =
      if requirements.empty? && !source_set
        Gem::Requirement.default
      elsif source_set
        Gem::Requirement.source_set
      else
        Gem::Requirement.create requirements
      end

    return unless gem_platforms name, options

    groups = gem_group name, options

    return unless (groups & @without_groups).empty?

    pin_gem_source name, :default unless source_set

    gem_requires name, options

    if duplicate
      warn <<-WARNING
Gem dependencies file #{@path} requires #{name} more than once.
      WARNING
    end

    @set.gem name, *requirements
  end

  ##
  # Handles the git: option from +options+ for gem +name+.
  #
  # Returns +true+ if the gist or git option was handled.

  def gem_git(name, options) # :nodoc:
    if gist = options.delete(:gist)
      options[:git] = "https://gist.github.com/#{gist}.git"
    end

    return unless repository = options.delete(:git)

    pin_gem_source name, :git, repository

    reference = gem_git_reference options

    submodules = options.delete :submodules

    @git_set.add_git_gem name, repository, reference, submodules

    true
  end

  ##
  # Handles the git options from +options+ for git gem.
  #
  # Returns reference for the git gem.

  def gem_git_reference(options) # :nodoc:
    ref    = options.delete :ref
    branch = options.delete :branch
    tag    = options.delete :tag

    reference = nil
    reference ||= ref
    reference ||= branch
    reference ||= tag
    reference ||= "master"

    if ref && branch
      warn <<-WARNING
Gem dependencies file #{@path} includes git reference for both ref and branch but only ref is used.
      WARNING
    end
    if (ref || branch) && tag
      warn <<-WARNING
Gem dependencies file #{@path} includes git reference for both ref/branch and tag but only ref/branch is used.
      WARNING
    end

    reference
  end

  private :gem_git

  ##
  # Handles a git gem option from +options+ for gem +name+ for a git source
  # registered through git_source.
  #
  # Returns +true+ if the custom source option was handled.

  def gem_git_source(name, options) # :nodoc:
    return unless git_source = (@git_sources.keys & options.keys).last

    source_callback = @git_sources[git_source]
    source_param = options.delete git_source

    git_url = source_callback.call source_param

    options[:git] = git_url

    gem_git name, options

    true
  end

  private :gem_git_source

  ##
  # Handles the :group and :groups +options+ for the gem with the given
  # +name+.

  def gem_group(name, options) # :nodoc:
    g = options.delete :group
    all_groups = g ? Array(g) : []

    groups = options.delete :groups
    all_groups |= groups if groups

    all_groups |= @current_groups if @current_groups

    all_groups
  end

  private :gem_group

  ##
  # Handles the path: option from +options+ for gem +name+.
  #
  # Returns +true+ if the path option was handled.

  def gem_path(name, options) # :nodoc:
    return unless directory = options.delete(:path)

    pin_gem_source name, :path, directory

    @vendor_set.add_vendor_gem name, directory

    true
  end

  private :gem_path

  ##
  # Handles the source: option from +options+ for gem +name+.
  #
  # Returns +true+ if the source option was handled.

  def gem_source(name, options) # :nodoc:
    return unless source = options.delete(:source)

    pin_gem_source name, :source, source

    @source_set.add_source_gem name, source

    true
  end

  private :gem_source

  ##
  # Handles the platforms: option from +options+.  Returns true if the
  # platform matches the current platform.

  def gem_platforms(name, options) # :nodoc:
    platform_names = Array(options.delete :platform)
    platform_names.concat Array(options.delete :platforms)
    platform_names.concat @current_platforms if @current_platforms

    return true if platform_names.empty?

    platform_names.any? do |platform_name|
      raise ArgumentError, "unknown platform #{platform_name.inspect}" unless
        platform = PLATFORM_MAP[platform_name]

      next false unless Gem::Platform.match_gem? platform, name

      if engines = ENGINE_MAP[platform_name]
        next false unless engines.include? Gem.ruby_engine
      end

      case WINDOWS[platform_name]
      when :only then
        next false unless Gem.win_platform?
      when :never then
        next false if Gem.win_platform?
      end

      VERSION_MAP[platform_name].satisfied_by? Gem.ruby_version
    end
  end

  private :gem_platforms

  ##
  # Records the require: option from +options+ and adds those files, or the
  # default file to the require list for +name+.

  def gem_requires(name, options) # :nodoc:
    if options.include? :require
      if requires = options.delete(:require)
        @requires[name].concat Array requires
      end
    else
      @requires[name] << name
    end
    raise ArgumentError, "Unhandled gem options #{options.inspect}" unless options.empty?
  end

  private :gem_requires

  ##
  # :category: Gem Dependencies DSL
  #
  # Block form for specifying gems from a git +repository+.
  #
  #   git 'https://github.com/rails/rails.git' do
  #     gem 'activesupport'
  #     gem 'activerecord'
  #   end

  def git(repository)
    @current_repository = repository

    yield

  ensure
    @current_repository = nil
  end

  ##
  # Defines a custom git source that uses +name+ to expand git repositories
  # for use in gems built from git repositories.  You must provide a block
  # that accepts a git repository name for expansion.

  def git_source(name, &callback)
    @git_sources[name] = callback
  end

  ##
  # Returns the basename of the file the dependencies were loaded from

  def gem_deps_file # :nodoc:
    File.basename @path
  end

  ##
  # :category: Gem Dependencies DSL
  #
  # Loads dependencies from a gemspec file.
  #
  # +options+ include:
  #
  # name: ::
  #   The name portion of the gemspec file.  Defaults to searching for any
  #   gemspec file in the current directory.
  #
  #     gemspec name: 'my_gem'
  #
  # path: ::
  #   The path the gemspec lives in.  Defaults to the current directory:
  #
  #     gemspec 'my_gem', path: 'gemspecs', name: 'my_gem'
  #
  # development_group: ::
  #   The group to add development dependencies to.  By default this is
  #   :development.  Only one group may be specified.

  def gemspec(options = {})
    name              = options.delete(:name) || "{,*}"
    path              = options.delete(:path) || "."
    development_group = options.delete(:development_group) || :development

    spec = find_gemspec name, path

    groups = gem_group spec.name, {}

    self_dep = Gem::Dependency.new spec.name, spec.version

    add_dependencies groups, [self_dep]
    add_dependencies groups, spec.runtime_dependencies

    @dependencies[spec.name] = Gem::Requirement.source_set

    spec.dependencies.each do |dep|
      @dependencies[dep.name] = dep.requirement
    end

    groups << development_group

    add_dependencies groups, spec.development_dependencies

    @vendor_set.add_vendor_gem spec.name, path
    gem_requires spec.name, options
  end

  ##
  # :category: Gem Dependencies DSL
  #
  # Block form for placing a dependency in the given +groups+.
  #
  #   group :development do
  #     gem 'debugger'
  #   end
  #
  #   group :development, :test do
  #     gem 'minitest'
  #   end
  #
  # Groups can be excluded at install time using `gem install -g --without
  # development`.  See `gem help install` and `gem help gem_dependencies` for
  # further details.

  def group(*groups)
    @current_groups = groups

    yield

  ensure
    @current_groups = nil
  end

  ##
  # Pins the gem +name+ to the given +source+.  Adding a gem with the same
  # name from a different +source+ will raise an exception.

  def pin_gem_source(name, type = :default, source = nil)
    source_description =
      case type
      when :default then "(default)"
      when :path    then "path: #{source}"
      when :git     then "git: #{source}"
      when :source  then "source: #{source}"
      else               "(unknown)"
      end

    raise ArgumentError,
      "duplicate source #{source_description} for gem #{name}" if
        @gem_sources.fetch(name, source) != source

    @gem_sources[name] = source
  end

  private :pin_gem_source

  ##
  # :category: Gem Dependencies DSL
  #
  # Block form for restricting gems to a set of platforms.
  #
  # The gem dependencies platform is different from Gem::Platform.  A platform
  # gem.deps.rb platform matches on the ruby engine, the ruby version and
  # whether or not windows is allowed.
  #
  # :ruby, :ruby_XY ::
  #   Matches non-windows, non-jruby implementations where X and Y can be used
  #   to match releases in the 1.8, 1.9, 2.0 or 2.1 series.
  #
  # :mri, :mri_XY ::
  #   Matches non-windows C Ruby (Matz Ruby) or only the 1.8, 1.9, 2.0 or
  #   2.1 series.
  #
  # :mingw, :mingw_XY ::
  #   Matches 32 bit C Ruby on MinGW or only the 1.8, 1.9, 2.0 or 2.1 series.
  #
  # :x64_mingw, :x64_mingw_XY ::
  #   Matches 64 bit C Ruby on MinGW or only the 1.8, 1.9, 2.0 or 2.1 series.
  #
  # :mswin, :mswin_XY ::
  #   Matches 32 bit C Ruby on Microsoft Windows or only the 1.8, 1.9, 2.0 or
  #   2.1 series.
  #
  # :mswin64, :mswin64_XY ::
  #   Matches 64 bit C Ruby on Microsoft Windows or only the 1.8, 1.9, 2.0 or
  #   2.1 series.
  #
  # :jruby, :jruby_XY ::
  #   Matches JRuby or JRuby in 1.8 or 1.9 mode.
  #
  # :maglev ::
  #   Matches Maglev
  #
  # :rbx ::
  #   Matches non-windows Rubinius
  #
  # NOTE:  There is inconsistency in what environment a platform matches.  You
  # may need to read the source to know the exact details.

  def platform(*platforms)
    @current_platforms = platforms

    yield

  ensure
    @current_platforms = nil
  end

  ##
  # :category: Gem Dependencies DSL
  #
  # Block form for restricting gems to a particular set of platforms.  See
  # #platform.

  alias :platforms :platform

  ##
  # :category: Gem Dependencies DSL
  #
  # Restricts this gem dependencies file to the given ruby +version+.
  #
  # You may also provide +engine:+ and +engine_version:+ options to restrict
  # this gem dependencies file to a particular ruby engine and its engine
  # version.  This matching is performed by using the RUBY_ENGINE and
  # RUBY_ENGINE_VERSION constants.

  def ruby(version, options = {})
    engine         = options[:engine]
    engine_version = options[:engine_version]

    raise ArgumentError,
          "You must specify engine_version along with the Ruby engine" if
            engine && !engine_version

    return true if @installing

    unless RUBY_VERSION == version
      message = "Your Ruby version is #{RUBY_VERSION}, " +
                "but your #{gem_deps_file} requires #{version}"

      raise Gem::RubyVersionMismatch, message
    end

    if engine && engine != Gem.ruby_engine
      message = "Your Ruby engine is #{Gem.ruby_engine}, " +
                "but your #{gem_deps_file} requires #{engine}"

      raise Gem::RubyVersionMismatch, message
    end

    if engine_version
      if engine_version != RUBY_ENGINE_VERSION
        message =
          "Your Ruby engine version is #{Gem.ruby_engine} #{RUBY_ENGINE_VERSION}, " +
          "but your #{gem_deps_file} requires #{engine} #{engine_version}"

        raise Gem::RubyVersionMismatch, message
      end
    end

    return true
  end

  ##
  # :category: Gem Dependencies DSL
  #
  # Sets +url+ as a source for gems for this dependency API.  RubyGems uses
  # the default configured sources if no source was given.  If a source is set
  # only that source is used.
  #
  # This method differs in behavior from Bundler:
  #
  # * The +:gemcutter+, # +:rubygems+ and +:rubyforge+ sources are not
  #   supported as they are deprecated in bundler.
  # * The +prepend:+ option is not supported.  If you wish to order sources
  #   then list them in your preferred order.

  def source(url)
    Gem.sources.clear if @default_sources

    @default_sources = false

    Gem.sources << url
  end
end
PK}$[�P�~�
�
3rubygems/rubygems/request_set/lockfile/tokenizer.rbnu�[���#) frozen_string_literal: true
require_relative "parser"

class Gem::RequestSet::Lockfile::Tokenizer
  Token = Struct.new :type, :value, :column, :line
  EOF   = Token.new :EOF

  def self.from_file(file)
    new File.read(file), file
  end

  def initialize(input, filename = nil, line = 0, pos = 0)
    @line     = line
    @line_pos = pos
    @tokens   = []
    @filename = filename
    tokenize input
  end

  def make_parser(set, platforms)
    Gem::RequestSet::Lockfile::Parser.new self, set, platforms, @filename
  end

  def to_a
    @tokens.map {|token| [token.type, token.value, token.column, token.line] }
  end

  def skip(type)
    @tokens.shift while !@tokens.empty? && peek.type == type
  end

  ##
  # Calculates the column (by byte) and the line of the current token based on
  # +byte_offset+.

  def token_pos(byte_offset) # :nodoc:
    [byte_offset - @line_pos, @line]
  end

  def empty?
    @tokens.empty?
  end

  def unshift(token)
    @tokens.unshift token
  end

  def next_token
    @tokens.shift
  end
  alias :shift :next_token

  def peek
    @tokens.first || EOF
  end

  private

  def tokenize(input)
    require "strscan"
    s = StringScanner.new input

    until s.eos? do
      pos = s.pos

      pos = s.pos if leading_whitespace = s.scan(/ +/)

      if s.scan(/[<|=>]{7}/)
        message = "your #{@filename} contains merge conflict markers"
        column, line = token_pos pos

        raise Gem::RequestSet::Lockfile::ParseError.new message, column, line, @filename
      end

      @tokens <<
        case
        when s.scan(/\r?\n/) then
          token = Token.new(:newline, nil, *token_pos(pos))
          @line_pos = s.pos
          @line += 1
          token
        when s.scan(/[A-Z]+/) then
          if leading_whitespace
            text = s.matched
            text += s.scan(/[^\s)]*/).to_s # in case of no match
            Token.new(:text, text, *token_pos(pos))
          else
            Token.new(:section, s.matched, *token_pos(pos))
          end
        when s.scan(/([a-z]+):\s/) then
          s.pos -= 1 # rewind for possible newline
          Token.new(:entry, s[1], *token_pos(pos))
        when s.scan(/\(/) then
          Token.new(:l_paren, nil, *token_pos(pos))
        when s.scan(/\)/) then
          Token.new(:r_paren, nil, *token_pos(pos))
        when s.scan(/<=|>=|=|~>|<|>|!=/) then
          Token.new(:requirement, s.matched, *token_pos(pos))
        when s.scan(/,/) then
          Token.new(:comma, nil, *token_pos(pos))
        when s.scan(/!/) then
          Token.new(:bang, nil, *token_pos(pos))
        when s.scan(/[^\s),!]*/) then
          Token.new(:text, s.matched, *token_pos(pos))
        else
          raise "BUG: can't create token for: #{s.string[s.pos..-1].inspect}"
        end
    end

    @tokens
  end
end
PK}$[*`�0rubygems/rubygems/request_set/lockfile/parser.rbnu�[���# frozen_string_literal: true
class Gem::RequestSet::Lockfile::Parser
  ###
  # Parses lockfiles

  def initialize(tokenizer, set, platforms, filename = nil)
    @tokens    = tokenizer
    @filename  = filename
    @set       = set
    @platforms = platforms
  end

  def parse
    until @tokens.empty? do
      token = get

      case token.type
      when :section then
        @tokens.skip :newline

        case token.value
        when "DEPENDENCIES" then
          parse_DEPENDENCIES
        when "GIT" then
          parse_GIT
        when "GEM" then
          parse_GEM
        when "PATH" then
          parse_PATH
        when "PLATFORMS" then
          parse_PLATFORMS
        else
          token = get until @tokens.empty? || peek.first == :section
        end
      else
        raise "BUG: unhandled token #{token.type} (#{token.value.inspect}) at line #{token.line} column #{token.column}"
      end
    end
  end

  ##
  # Gets the next token for a Lockfile

  def get(expected_types = nil, expected_value = nil) # :nodoc:
    token = @tokens.shift

    if expected_types && !Array(expected_types).include?(token.type)
      unget token

      message = "unexpected token [#{token.type.inspect}, #{token.value.inspect}], " +
                "expected #{expected_types.inspect}"

      raise Gem::RequestSet::Lockfile::ParseError.new message, token.column, token.line, @filename
    end

    if expected_value && expected_value != token.value
      unget token

      message = "unexpected token [#{token.type.inspect}, #{token.value.inspect}], " +
                "expected [#{expected_types.inspect}, " +
                "#{expected_value.inspect}]"

      raise Gem::RequestSet::Lockfile::ParseError.new message, token.column, token.line, @filename
    end

    token
  end

  def parse_DEPENDENCIES # :nodoc:
    while !@tokens.empty? && :text == peek.type do
      token = get :text

      requirements = []

      case peek[0]
      when :bang then
        get :bang

        requirements << pinned_requirement(token.value)
      when :l_paren then
        get :l_paren

        loop do
          op      = get(:requirement).value
          version = get(:text).value

          requirements << "#{op} #{version}"

          break unless peek.type == :comma

          get :comma
        end

        get :r_paren

        if peek[0] == :bang
          requirements.clear
          requirements << pinned_requirement(token.value)

          get :bang
        end
      end

      @set.gem token.value, *requirements

      skip :newline
    end
  end

  def parse_GEM # :nodoc:
    sources = []

    while [:entry, "remote"] == peek.first(2) do
      get :entry, "remote"
      data = get(:text).value
      skip :newline

      sources << Gem::Source.new(data)
    end

    sources << Gem::Source.new(Gem::DEFAULT_HOST) if sources.empty?

    get :entry, "specs"

    skip :newline

    set = Gem::Resolver::LockSet.new sources
    last_specs = nil

    while !@tokens.empty? && :text == peek.type do
      token = get :text
      name = token.value
      column = token.column

      case peek[0]
      when :newline then
        last_specs.each do |spec|
          spec.add_dependency Gem::Dependency.new name if column == 6
        end
      when :l_paren then
        get :l_paren

        token = get [:text, :requirement]
        type = token.type
        data = token.value

        if type == :text && column == 4
          version, platform = data.split "-", 2

          platform =
            platform ? Gem::Platform.new(platform) : Gem::Platform::RUBY

          last_specs = set.add name, version, platform
        else
          dependency = parse_dependency name, data

          last_specs.each do |spec|
            spec.add_dependency dependency
          end
        end

        get :r_paren
      else
        raise "BUG: unknown token #{peek}"
      end

      skip :newline
    end

    @set.sets << set
  end

  def parse_GIT # :nodoc:
    get :entry, "remote"
    repository = get(:text).value

    skip :newline

    get :entry, "revision"
    revision = get(:text).value

    skip :newline

    type = peek.type
    value = peek.value
    if type == :entry && %w[branch ref tag].include?(value)
      get
      get :text

      skip :newline
    end

    get :entry, "specs"

    skip :newline

    set = Gem::Resolver::GitSet.new
    set.root_dir = @set.install_dir

    last_spec = nil

    while !@tokens.empty? && :text == peek.type do
      token = get :text
      name = token.value
      column = token.column

      case peek[0]
      when :newline then
        last_spec.add_dependency Gem::Dependency.new name if column == 6
      when :l_paren then
        get :l_paren

        token = get [:text, :requirement]
        type = token.type
        data = token.value

        if type == :text && column == 4
          last_spec = set.add_git_spec name, data, repository, revision, true
        else
          dependency = parse_dependency name, data

          last_spec.add_dependency dependency
        end

        get :r_paren
      else
        raise "BUG: unknown token #{peek}"
      end

      skip :newline
    end

    @set.sets << set
  end

  def parse_PATH # :nodoc:
    get :entry, "remote"
    directory = get(:text).value

    skip :newline

    get :entry, "specs"

    skip :newline

    set = Gem::Resolver::VendorSet.new
    last_spec = nil

    while !@tokens.empty? && :text == peek.first do
      token = get :text
      name = token.value
      column = token.column

      case peek[0]
      when :newline then
        last_spec.add_dependency Gem::Dependency.new name if column == 6
      when :l_paren then
        get :l_paren

        token = get [:text, :requirement]
        type = token.type
        data = token.value

        if type == :text && column == 4
          last_spec = set.add_vendor_gem name, directory
        else
          dependency = parse_dependency name, data

          last_spec.dependencies << dependency
        end

        get :r_paren
      else
        raise "BUG: unknown token #{peek}"
      end

      skip :newline
    end

    @set.sets << set
  end

  def parse_PLATFORMS # :nodoc:
    while !@tokens.empty? && :text == peek.first do
      name = get(:text).value

      @platforms << name

      skip :newline
    end
  end

  ##
  # Parses the requirements following the dependency +name+ and the +op+ for
  # the first token of the requirements and returns a Gem::Dependency object.

  def parse_dependency(name, op) # :nodoc:
    return Gem::Dependency.new name, op unless peek[0] == :text

    version = get(:text).value

    requirements = ["#{op} #{version}"]

    while peek.type == :comma do
      get :comma
      op      = get(:requirement).value
      version = get(:text).value

      requirements << "#{op} #{version}"
    end

    Gem::Dependency.new name, requirements
  end

  private

  def skip(type) # :nodoc:
    @tokens.skip type
  end

  ##
  # Peeks at the next token for Lockfile

  def peek # :nodoc:
    @tokens.peek
  end

  def pinned_requirement(name) # :nodoc:
    requirement = Gem::Dependency.new name
    specification = @set.sets.flat_map do |set|
      set.find_all(requirement)
    end.compact.first

    specification && specification.version
  end

  ##
  # Ungets the last token retrieved by #get

  def unget(token) # :nodoc:
    @tokens.unshift token
  end
end
PK}$[�ϸTTrubygems/rubygems/source.rbnu�[���# frozen_string_literal: true

require_relative "text"
##
# A Source knows how to list and fetch gems from a RubyGems marshal index.
#
# There are other Source subclasses for installed gems, local gems, the
# bundler dependency API and so-forth.

class Gem::Source
  include Comparable
  include Gem::Text

  FILES = { # :nodoc:
    :released   => "specs",
    :latest     => "latest_specs",
    :prerelease => "prerelease_specs",
  }.freeze

  ##
  # The URI this source will fetch gems from.

  attr_reader :uri

  ##
  # Creates a new Source which will use the index located at +uri+.

  def initialize(uri)
    require_relative "uri"
    @uri = Gem::Uri.parse!(uri)
    @update_cache = nil
  end

  ##
  # Sources are ordered by installation preference.

  def <=>(other)
    case other
    when Gem::Source::Installed,
         Gem::Source::Local,
         Gem::Source::Lock,
         Gem::Source::SpecificFile,
         Gem::Source::Git,
         Gem::Source::Vendor then
      -1
    when Gem::Source then
      if !@uri
        return 0 unless other.uri
        return 1
      end

      return -1 if !other.uri

      # Returning 1 here ensures that when sorting a list of sources, the
      # original ordering of sources supplied by the user is preserved.
      return 1 unless @uri.to_s == other.uri.to_s

      0
    else
      nil
    end
  end

  def ==(other) # :nodoc:
    self.class === other && @uri == other.uri
  end

  alias_method :eql?, :== # :nodoc:

  ##
  # Returns a Set that can fetch specifications from this source.

  def dependency_resolver_set # :nodoc:
    return Gem::Resolver::IndexSet.new self if "file" == uri.scheme

    fetch_uri = if uri.host == "rubygems.org"
      index_uri = uri.dup
      index_uri.host = "index.rubygems.org"
      index_uri
    else
      uri
    end

    bundler_api_uri = enforce_trailing_slash(fetch_uri)

    begin
      fetcher = Gem::RemoteFetcher.fetcher
      response = fetcher.fetch_path bundler_api_uri, nil, true
    rescue Gem::RemoteFetcher::FetchError
      Gem::Resolver::IndexSet.new self
    else
      Gem::Resolver::APISet.new response.uri + "./info/"
    end
  end

  def hash # :nodoc:
    @uri.hash
  end

  ##
  # Returns the local directory to write +uri+ to.

  def cache_dir(uri)
    # Correct for windows paths
    escaped_path = uri.path.sub(/^\/([a-z]):\//i, '/\\1-/')
    escaped_path.tap(&Gem::UNTAINT)

    File.join Gem.spec_cache_dir, "#{uri.host}%#{uri.port}", File.dirname(escaped_path)
  end

  ##
  # Returns true when it is possible and safe to update the cache directory.

  def update_cache?
    return @update_cache unless @update_cache.nil?
    @update_cache =
      begin
        File.stat(Gem.user_home).uid == Process.uid
      rescue Errno::ENOENT
        false
      end
  end

  ##
  # Fetches a specification for the given +name_tuple+.

  def fetch_spec(name_tuple)
    fetcher = Gem::RemoteFetcher.fetcher

    spec_file_name = name_tuple.spec_name

    source_uri = enforce_trailing_slash(uri) + "#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}"

    cache_dir = cache_dir source_uri

    local_spec = File.join cache_dir, spec_file_name

    if File.exist? local_spec
      spec = Gem.read_binary local_spec
      spec = Marshal.load(spec) rescue nil
      return spec if spec
    end

    source_uri.path << ".rz"

    spec = fetcher.fetch_path source_uri
    spec = Gem::Util.inflate spec

    if update_cache?
      require "fileutils"
      FileUtils.mkdir_p cache_dir

      File.open local_spec, "wb" do |io|
        io.write spec
      end
    end

    # TODO: Investigate setting Gem::Specification#loaded_from to a URI
    Marshal.load spec
  end

  ##
  # Loads +type+ kind of specs fetching from +@uri+ if the on-disk cache is
  # out of date.
  #
  # +type+ is one of the following:
  #
  # :released   => Return the list of all released specs
  # :latest     => Return the list of only the highest version of each gem
  # :prerelease => Return the list of all prerelease only specs
  #

  def load_specs(type)
    file       = FILES[type]
    fetcher    = Gem::RemoteFetcher.fetcher
    file_name  = "#{file}.#{Gem.marshal_version}"
    spec_path  = enforce_trailing_slash(uri) + "#{file_name}.gz"
    cache_dir  = cache_dir spec_path
    local_file = File.join(cache_dir, file_name)
    retried    = false

    if update_cache?
      require "fileutils"
      FileUtils.mkdir_p cache_dir
    end

    spec_dump = fetcher.cache_update_path spec_path, local_file, update_cache?

    begin
      Gem::NameTuple.from_list Marshal.load(spec_dump)
    rescue ArgumentError
      if update_cache? && !retried
        FileUtils.rm local_file
        retried = true
        retry
      else
        raise Gem::Exception.new("Invalid spec cache file in #{local_file}")
      end
    end
  end

  ##
  # Downloads +spec+ and writes it to +dir+.  See also
  # Gem::RemoteFetcher#download.

  def download(spec, dir=Dir.pwd)
    fetcher = Gem::RemoteFetcher.fetcher
    fetcher.download spec, uri.to_s, dir
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[Remote:", "]" do
      q.breakable
      q.text @uri.to_s

      if api = uri
        q.breakable
        q.text "API URI: "
        q.text api.to_s
      end
    end
  end

  def typo_squatting?(host, distance_threshold=4)
    return if @uri.host.nil?
    levenshtein_distance(@uri.host, host).between? 1, distance_threshold
  end

  private

  def enforce_trailing_slash(uri)
    uri.merge(uri.path.gsub(/\/+$/, "") + "/")
  end
end

require_relative "source/git"
require_relative "source/installed"
require_relative "source/specific_file"
require_relative "source/local"
require_relative "source/lock"
require_relative "source/vendor"
PK}$[*��	�	 rubygems/rubygems/source_list.rbnu�[���# frozen_string_literal: true

##
# The SourceList represents the sources rubygems has been configured to use.
# A source may be created from an array of sources:
#
#   Gem::SourceList.from %w[https://rubygems.example https://internal.example]
#
# Or by adding them:
#
#   sources = Gem::SourceList.new
#   sources << 'https://rubygems.example'
#
# The most common way to get a SourceList is Gem.sources.

class Gem::SourceList
  include Enumerable

  ##
  # Creates a new SourceList

  def initialize
    @sources = []
  end

  ##
  # The sources in this list

  attr_reader :sources

  ##
  # Creates a new SourceList from an array of sources.

  def self.from(ary)
    list = new

    list.replace ary

    return list
  end

  def initialize_copy(other) # :nodoc:
    @sources = @sources.dup
  end

  ##
  # Appends +obj+ to the source list which may be a Gem::Source, URI or URI
  # String.

  def <<(obj)
    src = case obj
    when Gem::Source
      obj
    else
      Gem::Source.new(obj)
    end

    @sources << src unless @sources.include?(src)
    src
  end

  ##
  # Replaces this SourceList with the sources in +other+  See #<< for
  # acceptable items in +other+.

  def replace(other)
    clear

    other.each do |x|
      self << x
    end

    self
  end

  ##
  # Removes all sources from the SourceList.

  def clear
    @sources.clear
  end

  ##
  # Yields each source URI in the list.

  def each
    @sources.each {|s| yield s.uri.to_s }
  end

  ##
  # Yields each source in the list.

  def each_source(&b)
    @sources.each(&b)
  end

  ##
  # Returns true if there are no sources in this SourceList.

  def empty?
    @sources.empty?
  end

  def ==(other) # :nodoc:
    to_a == other
  end

  ##
  # Returns an Array of source URI Strings.

  def to_a
    @sources.map {|x| x.uri.to_s }
  end

  alias_method :to_ary, :to_a

  ##
  # Returns the first source in the list.

  def first
    @sources.first
  end

  ##
  # Returns true if this source list includes +other+ which may be a
  # Gem::Source or a source URI.

  def include?(other)
    if other.kind_of? Gem::Source
      @sources.include? other
    else
      @sources.find {|x| x.uri.to_s == other.to_s }
    end
  end

  ##
  # Deletes +source+ from the source list which may be a Gem::Source or a URI.

  def delete(source)
    if source.kind_of? Gem::Source
      @sources.delete source
    else
      @sources.delete_if {|x| x.uri.to_s == source.to_s }
    end
  end
end
PK}$[�>a5�&�&rubygems/rubygems/resolver.rbnu�[���# frozen_string_literal: true
require_relative "dependency"
require_relative "exceptions"
require_relative "util/list"

##
# Given a set of Gem::Dependency objects as +needed+ and a way to query the
# set of available specs via +set+, calculates a set of ActivationRequest
# objects which indicate all the specs that should be activated to meet the
# all the requirements.

class Gem::Resolver
  require_relative "resolver/molinillo"

  ##
  # If the DEBUG_RESOLVER environment variable is set then debugging mode is
  # enabled for the resolver.  This will display information about the state
  # of the resolver while a set of dependencies is being resolved.

  DEBUG_RESOLVER = !ENV["DEBUG_RESOLVER"].nil?

  ##
  # Set to true if all development dependencies should be considered.

  attr_accessor :development

  ##
  # Set to true if immediate development dependencies should be considered.

  attr_accessor :development_shallow

  ##
  # When true, no dependencies are looked up for requested gems.

  attr_accessor :ignore_dependencies

  ##
  # List of dependencies that could not be found in the configured sources.

  attr_reader :missing

  attr_reader :stats

  ##
  # Hash of gems to skip resolution.  Keyed by gem name, with arrays of
  # gem specifications as values.

  attr_accessor :skip_gems

  ##
  # When a missing dependency, don't stop. Just go on and record what was
  # missing.

  attr_accessor :soft_missing

  ##
  # Combines +sets+ into a ComposedSet that allows specification lookup in a
  # uniform manner.  If one of the +sets+ is itself a ComposedSet its sets are
  # flattened into the result ComposedSet.

  def self.compose_sets(*sets)
    sets.compact!

    sets = sets.map do |set|
      case set
      when Gem::Resolver::BestSet then
        set
      when Gem::Resolver::ComposedSet then
        set.sets
      else
        set
      end
    end.flatten

    case sets.length
    when 0 then
      raise ArgumentError, "one set in the composition must be non-nil"
    when 1 then
      sets.first
    else
      Gem::Resolver::ComposedSet.new(*sets)
    end
  end

  ##
  # Creates a Resolver that queries only against the already installed gems
  # for the +needed+ dependencies.

  def self.for_current_gems(needed)
    new needed, Gem::Resolver::CurrentSet.new
  end

  ##
  # Create Resolver object which will resolve the tree starting
  # with +needed+ Dependency objects.
  #
  # +set+ is an object that provides where to look for specifications to
  # satisfy the Dependencies. This defaults to IndexSet, which will query
  # rubygems.org.

  def initialize(needed, set = nil)
    @set = set || Gem::Resolver::IndexSet.new
    @needed = needed

    @development         = false
    @development_shallow = false
    @ignore_dependencies = false
    @missing             = []
    @skip_gems           = {}
    @soft_missing        = false
    @stats               = Gem::Resolver::Stats.new
  end

  def explain(stage, *data) # :nodoc:
    return unless DEBUG_RESOLVER

    d = data.map {|x| x.pretty_inspect }.join(", ")
    $stderr.printf "%10s %s\n", stage.to_s.upcase, d
  end

  def explain_list(stage) # :nodoc:
    return unless DEBUG_RESOLVER

    data = yield
    $stderr.printf "%10s (%d entries)\n", stage.to_s.upcase, data.size
    unless data.empty?
      require "pp"
      PP.pp data, $stderr
    end
  end

  ##
  # Creates an ActivationRequest for the given +dep+ and the last +possible+
  # specification.
  #
  # Returns the Specification and the ActivationRequest

  def activation_request(dep, possible) # :nodoc:
    spec = possible.pop

    explain :activate, [spec.full_name, possible.size]
    explain :possible, possible

    activation_request =
      Gem::Resolver::ActivationRequest.new spec, dep, possible

    return spec, activation_request
  end

  def requests(s, act, reqs=[]) # :nodoc:
    return reqs if @ignore_dependencies

    s.fetch_development_dependencies if @development

    s.dependencies.reverse_each do |d|
      next if d.type == :development && !@development
      next if d.type == :development && @development_shallow &&
              act.development?
      next if d.type == :development && @development_shallow &&
              act.parent

      reqs << Gem::Resolver::DependencyRequest.new(d, act)
      @stats.requirement!
    end

    @set.prefetch reqs

    @stats.record_requirements reqs

    reqs
  end

  include Molinillo::UI

  def output
    @output ||= debug? ? $stdout : File.open(IO::NULL, "w")
  end

  def debug?
    DEBUG_RESOLVER
  end

  include Molinillo::SpecificationProvider

  ##
  # Proceed with resolution! Returns an array of ActivationRequest objects.

  def resolve
    locking_dg = Molinillo::DependencyGraph.new
    Molinillo::Resolver.new(self, self).resolve(@needed.map {|d| DependencyRequest.new d, nil }, locking_dg).tsort.map(&:payload).compact
  rescue Molinillo::VersionConflict => e
    conflict = e.conflicts.values.first
    raise Gem::DependencyResolutionError, Conflict.new(conflict.requirement_trees.first.first, conflict.existing, conflict.requirement)
  ensure
    @output.close if defined?(@output) && !debug?
  end

  ##
  # Extracts the specifications that may be able to fulfill +dependency+ and
  # returns those that match the local platform and all those that match.

  def find_possible(dependency) # :nodoc:
    all = @set.find_all dependency

    if (skip_dep_gems = skip_gems[dependency.name]) && !skip_dep_gems.empty?
      matching = all.select do |api_spec|
        skip_dep_gems.any? {|s| api_spec.version == s.version }
      end

      all = matching unless matching.empty?
    end

    matching_platform = select_local_platforms all

    return matching_platform, all
  end

  ##
  # Returns the gems in +specs+ that match the local platform.

  def select_local_platforms(specs) # :nodoc:
    specs.select do |spec|
      Gem::Platform.installable? spec
    end
  end

  def search_for(dependency)
    possibles, all = find_possible(dependency)
    if !@soft_missing && possibles.empty?
      @missing << dependency
      exc = Gem::UnsatisfiableDependencyError.new dependency, all
      exc.errors = @set.errors
      raise exc
    end

    groups = Hash.new {|hash, key| hash[key] = [] }

    # create groups & sources in the same loop
    sources = possibles.map do |spec|
      source = spec.source
      groups[source] << spec
      source
    end.uniq.reverse

    activation_requests = []

    sources.each do |source|
      groups[source].
        sort_by {|spec| [spec.version, spec.platform =~ Gem::Platform.local ? 1 : 0] }.
        map {|spec| ActivationRequest.new spec, dependency }.
        each {|activation_request| activation_requests << activation_request }
    end

    activation_requests
  end

  def dependencies_for(specification)
    return [] if @ignore_dependencies
    spec = specification.spec
    requests(spec, specification)
  end

  def requirement_satisfied_by?(requirement, activated, spec)
    matches_spec = requirement.matches_spec? spec
    return matches_spec if @soft_missing

    matches_spec &&
      spec.spec.required_ruby_version.satisfied_by?(Gem.ruby_version) &&
      spec.spec.required_rubygems_version.satisfied_by?(Gem.rubygems_version)
  end

  def name_for(dependency)
    dependency.name
  end

  def allow_missing?(dependency)
    @missing << dependency
    @soft_missing
  end

  def sort_dependencies(dependencies, activated, conflicts)
    dependencies.sort_by.with_index do |dependency, i|
      name = name_for(dependency)
      [
        activated.vertex_named(name).payload ? 0 : 1,
        amount_constrained(dependency),
        conflicts[name] ? 0 : 1,
        activated.vertex_named(name).payload ? 0 : search_for(dependency).count,
        i, # for stable sort
      ]
    end
  end

  SINGLE_POSSIBILITY_CONSTRAINT_PENALTY = 1_000_000
  private_constant :SINGLE_POSSIBILITY_CONSTRAINT_PENALTY if defined?(private_constant)

  # returns an integer \in (-\infty, 0]
  # a number closer to 0 means the dependency is less constraining
  #
  # dependencies w/ 0 or 1 possibilities (ignoring version requirements)
  # are given very negative values, so they _always_ sort first,
  # before dependencies that are unconstrained
  def amount_constrained(dependency)
    @amount_constrained ||= {}
    @amount_constrained[dependency.name] ||= begin
      name_dependency = Gem::Dependency.new(dependency.name)
      dependency_request_for_name = Gem::Resolver::DependencyRequest.new(name_dependency, dependency.requester)
      all = @set.find_all(dependency_request_for_name).size

      if all <= 1
        all - SINGLE_POSSIBILITY_CONSTRAINT_PENALTY
      else
        search = search_for(dependency).size
        search - all
      end
    end
  end
  private :amount_constrained
end

require_relative "resolver/activation_request"
require_relative "resolver/conflict"
require_relative "resolver/dependency_request"
require_relative "resolver/requirement_list"
require_relative "resolver/stats"

require_relative "resolver/set"
require_relative "resolver/api_set"
require_relative "resolver/composed_set"
require_relative "resolver/best_set"
require_relative "resolver/current_set"
require_relative "resolver/git_set"
require_relative "resolver/index_set"
require_relative "resolver/installer_set"
require_relative "resolver/lock_set"
require_relative "resolver/vendor_set"
require_relative "resolver/source_set"

require_relative "resolver/specification"
require_relative "resolver/spec_specification"
require_relative "resolver/api_specification"
require_relative "resolver/git_specification"
require_relative "resolver/index_specification"
require_relative "resolver/installed_specification"
require_relative "resolver/local_specification"
require_relative "resolver/lock_specification"
require_relative "resolver/vendor_specification"
PK}$[����,rubygems/rubygems/core_ext/tcpsocket_init.rbnu�[���require "socket"

module CoreExtensions
  module TCPSocketExt
    def self.prepended(base)
      base.prepend Initializer
    end

    module Initializer
      CONNECTION_TIMEOUT = 5
      IPV4_DELAY_SECONDS = 0.1

      def initialize(host, serv, *rest)
        mutex = Thread::Mutex.new
        addrs = []
        threads = []
        cond_var = Thread::ConditionVariable.new

        Addrinfo.foreach(host, serv, nil, :STREAM) do |addr|
          Thread.report_on_exception = false if defined? Thread.report_on_exception = ()

          threads << Thread.new(addr) do
            # give head start to ipv6 addresses
            sleep IPV4_DELAY_SECONDS if addr.ipv4?

            # raises Errno::ECONNREFUSED when ip:port is unreachable
            Socket.tcp(addr.ip_address, serv, connect_timeout: CONNECTION_TIMEOUT).close
            mutex.synchronize do
              addrs << addr.ip_address
              cond_var.signal
            end
          end
        end

        mutex.synchronize do
          timeout_time = CONNECTION_TIMEOUT + Time.now.to_f
          while addrs.empty? && (remaining_time = timeout_time - Time.now.to_f) > 0
            cond_var.wait(mutex, remaining_time)
          end

          host = addrs.shift unless addrs.empty?
        end

        threads.each {|t| t.kill.join if t.alive? }

        super(host, serv, *rest)
      end
    end
  end
end

TCPSocket.prepend CoreExtensions::TCPSocketExt
PK}$[-�-,rubygems/rubygems/core_ext/kernel_require.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require "monitor"

module Kernel

  RUBYGEMS_ACTIVATION_MONITOR = Monitor.new # :nodoc:

  # Make sure we have a reference to Ruby's original Kernel#require
  unless defined?(gem_original_require)
    alias gem_original_require require
    private :gem_original_require
  end

  file = Gem::KERNEL_WARN_IGNORES_INTERNAL_ENTRIES ? "<internal:#{__FILE__}>" : __FILE__
  module_eval <<'RUBY', file, __LINE__ + 1 # rubocop:disable Style/EvalWithLocation
  ##
  # When RubyGems is required, Kernel#require is replaced with our own which
  # is capable of loading gems on demand.
  #
  # When you call <tt>require 'x'</tt>, this is what happens:
  # * If the file can be loaded from the existing Ruby loadpath, it
  #   is.
  # * Otherwise, installed gems are searched for a file that matches.
  #   If it's found in gem 'y', that gem is activated (added to the
  #   loadpath).
  #
  # The normal <tt>require</tt> functionality of returning false if
  # that file has already been loaded is preserved.

  def require(path)
    if RUBYGEMS_ACTIVATION_MONITOR.respond_to?(:mon_owned?)
      monitor_owned = RUBYGEMS_ACTIVATION_MONITOR.mon_owned?
    end
    RUBYGEMS_ACTIVATION_MONITOR.enter

    path = path.to_path if path.respond_to? :to_path

    if spec = Gem.find_unresolved_default_spec(path)
      # Ensure -I beats a default gem
      resolved_path = begin
        rp = nil
        load_path_check_index = Gem.load_path_insert_index - Gem.activated_gem_paths
        Gem.suffixes.each do |s|
          $LOAD_PATH[0...load_path_check_index].each do |lp|
            safe_lp = lp.dup.tap(&Gem::UNTAINT)
            begin
              if File.symlink? safe_lp # for backward compatibility
                next
              end
            rescue SecurityError
              RUBYGEMS_ACTIVATION_MONITOR.exit
              raise
            end

            full_path = File.expand_path(File.join(safe_lp, "#{path}#{s}"))
            if File.file?(full_path)
              rp = full_path
              break
            end
          end
          break if rp
        end
        rp
      end

      begin
        Kernel.send(:gem, spec.name, Gem::Requirement.default_prerelease)
      rescue Exception
        RUBYGEMS_ACTIVATION_MONITOR.exit
        raise
      end unless resolved_path
    end

    # If there are no unresolved deps, then we can use just try
    # normal require handle loading a gem from the rescue below.

    if Gem::Specification.unresolved_deps.empty?
      RUBYGEMS_ACTIVATION_MONITOR.exit
      return gem_original_require(path)
    end

    # If +path+ is for a gem that has already been loaded, don't
    # bother trying to find it in an unresolved gem, just go straight
    # to normal require.
    #--
    # TODO request access to the C implementation of this to speed up RubyGems

    if Gem::Specification.find_active_stub_by_path(path)
      RUBYGEMS_ACTIVATION_MONITOR.exit
      return gem_original_require(path)
    end

    # Attempt to find +path+ in any unresolved gems...

    found_specs = Gem::Specification.find_in_unresolved path

    # If there are no directly unresolved gems, then try and find +path+
    # in any gems that are available via the currently unresolved gems.
    # For example, given:
    #
    #   a => b => c => d
    #
    # If a and b are currently active with c being unresolved and d.rb is
    # requested, then find_in_unresolved_tree will find d.rb in d because
    # it's a dependency of c.
    #
    if found_specs.empty?
      found_specs = Gem::Specification.find_in_unresolved_tree path

      found_specs.each do |found_spec|
        found_spec.activate
      end

    # We found +path+ directly in an unresolved gem. Now we figure out, of
    # the possible found specs, which one we should activate.
    else

      # Check that all the found specs are just different
      # versions of the same gem
      names = found_specs.map(&:name).uniq

      if names.size > 1
        RUBYGEMS_ACTIVATION_MONITOR.exit
        raise Gem::LoadError, "#{path} found in multiple gems: #{names.join ', '}"
      end

      # Ok, now find a gem that has no conflicts, starting
      # at the highest version.
      valid = found_specs.find {|s| !s.has_conflicts? }

      unless valid
        le = Gem::LoadError.new "unable to find a version of '#{names.first}' to activate"
        le.name = names.first
        RUBYGEMS_ACTIVATION_MONITOR.exit
        raise le
      end

      valid.activate
    end

    RUBYGEMS_ACTIVATION_MONITOR.exit
    return gem_original_require(path)
  rescue LoadError => load_error
    RUBYGEMS_ACTIVATION_MONITOR.enter

    begin
      if load_error.path == path and Gem.try_activate(path)
        require_again = true
      end
    ensure
      RUBYGEMS_ACTIVATION_MONITOR.exit
    end

    return gem_original_require(path) if require_again

    raise load_error
  ensure
    if RUBYGEMS_ACTIVATION_MONITOR.respond_to?(:mon_owned?)
      if monitor_owned != (ow = RUBYGEMS_ACTIVATION_MONITOR.mon_owned?)
        STDERR.puts [$$, Thread.current, $!, $!.backtrace].inspect if $!
        raise "CRITICAL: RUBYGEMS_ACTIVATION_MONITOR.owned?: before #{monitor_owned} -> after #{ow}"
      end
    end
  end
RUBY

  private :require

end
PK}$[k]�	�	(rubygems/rubygems/core_ext/kernel_gem.rbnu�[���# frozen_string_literal: true
##
# RubyGems adds the #gem method to allow activation of specific gem versions
# and overrides the #require method on Kernel to make gems appear as if they
# live on the <code>$LOAD_PATH</code>.  See the documentation of these methods
# for further detail.

module Kernel

  ##
  # Use Kernel#gem to activate a specific version of +gem_name+.
  #
  # +requirements+ is a list of version requirements that the
  # specified gem must match, most commonly "= example.version.number".  See
  # Gem::Requirement for how to specify a version requirement.
  #
  # If you will be activating the latest version of a gem, there is no need to
  # call Kernel#gem, Kernel#require will do the right thing for you.
  #
  # Kernel#gem returns true if the gem was activated, otherwise false.  If the
  # gem could not be found, didn't match the version requirements, or a
  # different version was already activated, an exception will be raised.
  #
  # Kernel#gem should be called *before* any require statements (otherwise
  # RubyGems may load a conflicting library version).
  #
  # Kernel#gem only loads prerelease versions when prerelease +requirements+
  # are given:
  #
  #   gem 'rake', '>= 1.1.a', '< 2'
  #
  # In older RubyGems versions, the environment variable GEM_SKIP could be
  # used to skip activation of specified gems, for example to test out changes
  # that haven't been installed yet.  Now RubyGems defers to -I and the
  # RUBYLIB environment variable to skip activation of a gem.
  #
  # Example:
  #
  #   GEM_SKIP=libA:libB ruby -I../libA -I../libB ./mycode.rb

  def gem(gem_name, *requirements) # :doc:
    skip_list = (ENV["GEM_SKIP"] || "").split(/:/)
    raise Gem::LoadError, "skipping #{gem_name}" if skip_list.include? gem_name

    if gem_name.kind_of? Gem::Dependency
      unless Gem::Deprecate.skip
        warn "#{Gem.location_of_caller.join ':'}:Warning: Kernel.gem no longer "\
          "accepts a Gem::Dependency object, please pass the name "\
          "and requirements directly"
      end

      requirements = gem_name.requirement
      gem_name = gem_name.name
    end

    dep = Gem::Dependency.new(gem_name, *requirements)

    loaded = Gem.loaded_specs[gem_name]

    return false if loaded && dep.matches_spec?(loaded)

    spec = dep.to_spec

    if spec
      if Gem::LOADED_SPECS_MUTEX.owned?
        spec.activate
      else
        Gem::LOADED_SPECS_MUTEX.synchronize { spec.activate }
      end
    end
  end

  private :gem

end
PK}$[�s�NYY)rubygems/rubygems/core_ext/kernel_warn.rbnu�[���# frozen_string_literal: true

# `uplevel` keyword argument of Kernel#warn is available since ruby 2.5.
if RUBY_VERSION >= "2.5" && !Gem::KERNEL_WARN_IGNORES_INTERNAL_ENTRIES

  module Kernel
    rubygems_path = "#{__dir__}/" # Frames to be skipped start with this path.

    original_warn = instance_method(:warn)

    remove_method :warn

    class << self
      remove_method :warn
    end

    module_function define_method(:warn) {|*messages, **kw|
      unless uplevel = kw[:uplevel]
        if Gem.java_platform? && RUBY_VERSION < "3.1"
          return original_warn.bind(self).call(*messages)
        else
          return original_warn.bind(self).call(*messages, **kw)
        end
      end

      # Ensure `uplevel` fits a `long`
      uplevel, = [uplevel].pack("l!").unpack("l!")

      if uplevel >= 0
        start = 0
        while uplevel >= 0
          loc, = caller_locations(start, 1)
          unless loc
            # No more backtrace
            start += uplevel
            break
          end

          start += 1

          if path = loc.path
            unless path.start_with?(rubygems_path) || path.start_with?("<internal:")
              # Non-rubygems frames
              uplevel -= 1
            end
          end
        end
        kw[:uplevel] = start
      end

      original_warn.bind(self).call(*messages, **kw)
    }
  end
end
PK}$[e�s2��)rubygems/rubygems/source/specific_file.rbnu�[���# frozen_string_literal: true
##
# A source representing a single .gem file.  This is used for installation of
# local gems.

class Gem::Source::SpecificFile < Gem::Source
  ##
  # The path to the gem for this specific file.

  attr_reader :path

  ##
  # Creates a new SpecificFile for the gem in +file+

  def initialize(file)
    @uri = nil
    @path = ::File.expand_path(file)

    @package = Gem::Package.new @path
    @spec = @package.spec
    @name = @spec.name_tuple
  end

  ##
  # The Gem::Specification extracted from this .gem.

  attr_reader :spec

  def load_specs(*a) # :nodoc:
    [@name]
  end

  def fetch_spec(name) # :nodoc:
    return @spec if name == @name
    raise Gem::Exception, "Unable to find '#{name}'"
    @spec
  end

  def download(spec, dir = nil) # :nodoc:
    return @path if spec == @spec
    raise Gem::Exception, "Unable to download '#{spec.full_name}'"
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[SpecificFile:", "]" do
      q.breakable
      q.text @path
    end
  end

  ##
  # Orders this source against +other+.
  #
  # If +other+ is a SpecificFile from a different gem name +nil+ is returned.
  #
  # If +other+ is a SpecificFile from the same gem name the versions are
  # compared using Gem::Version#<=>
  #
  # Otherwise Gem::Source#<=> is used.

  def <=>(other)
    case other
    when Gem::Source::SpecificFile then
      return nil if @spec.name != other.spec.name

      @spec.version <=> other.spec.version
    else
      super
    end
  end
end
PK}$[=��<<rubygems/rubygems/source/git.rbnu�[���# frozen_string_literal: true

##
# A git gem for use in a gem dependencies file.
#
# Example:
#
#   source =
#     Gem::Source::Git.new 'rake', 'git@example:rake.git', 'rake-10.1.0', false
#
#   source.specs

class Gem::Source::Git < Gem::Source
  ##
  # The name of the gem created by this git gem.

  attr_reader :name

  ##
  # The commit reference used for checking out this git gem.

  attr_reader :reference

  ##
  # When false the cache for this repository will not be updated.

  attr_accessor :remote

  ##
  # The git repository this gem is sourced from.

  attr_reader :repository

  ##
  # The directory for cache and git gem installation

  attr_accessor :root_dir

  ##
  # Does this repository need submodules checked out too?

  attr_reader :need_submodules

  ##
  # Creates a new git gem source for a gems from loaded from +repository+ at
  # the given +reference+.  The +name+ is only used to track the repository
  # back to a gem dependencies file, it has no real significance as a git
  # repository may contain multiple gems.  If +submodules+ is true, submodules
  # will be checked out when the gem is installed.

  def initialize(name, repository, reference, submodules = false)
    require_relative "../uri"
    @uri = Gem::Uri.parse(repository)
    @name            = name
    @repository      = repository
    @reference       = reference
    @need_submodules = submodules

    @remote   = true
    @root_dir = Gem.dir
    @git      = ENV["git"] || "git"
  end

  def <=>(other)
    case other
    when Gem::Source::Git then
      0
    when Gem::Source::Vendor,
         Gem::Source::Lock then
      -1
    when Gem::Source then
      1
    else
      nil
    end
  end

  def ==(other) # :nodoc:
    super &&
      @name            == other.name &&
      @repository      == other.repository &&
      @reference       == other.reference &&
      @need_submodules == other.need_submodules
  end

  ##
  # Checks out the files for the repository into the install_dir.

  def checkout # :nodoc:
    cache

    return false unless File.exist? repo_cache_dir

    unless File.exist? install_dir
      system @git, "clone", "--quiet", "--no-checkout",
             repo_cache_dir, install_dir
    end

    Dir.chdir install_dir do
      system @git, "fetch", "--quiet", "--force", "--tags", install_dir

      success = system @git, "reset", "--quiet", "--hard", rev_parse

      if @need_submodules
        require "open3"
        _, status = Open3.capture2e(@git, "submodule", "update", "--quiet", "--init", "--recursive")

        success &&= status.success?
      end

      success
    end
  end

  ##
  # Creates a local cache repository for the git gem.

  def cache # :nodoc:
    return unless @remote

    if File.exist? repo_cache_dir
      Dir.chdir repo_cache_dir do
        system @git, "fetch", "--quiet", "--force", "--tags",
               @repository, "refs/heads/*:refs/heads/*"
      end
    else
      system @git, "clone", "--quiet", "--bare", "--no-hardlinks",
             @repository, repo_cache_dir
    end
  end

  ##
  # Directory where git gems get unpacked and so-forth.

  def base_dir # :nodoc:
    File.join @root_dir, "bundler"
  end

  ##
  # A short reference for use in git gem directories

  def dir_shortref # :nodoc:
    rev_parse[0..11]
  end

  ##
  # Nothing to download for git gems

  def download(full_spec, path) # :nodoc:
  end

  ##
  # The directory where the git gem will be installed.

  def install_dir # :nodoc:
    return unless File.exist? repo_cache_dir

    File.join base_dir, "gems", "#{@name}-#{dir_shortref}"
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[Git: ", "]" do
      q.breakable
      q.text @repository

      q.breakable
      q.text @reference
    end
  end

  ##
  # The directory where the git gem's repository will be cached.

  def repo_cache_dir # :nodoc:
    File.join @root_dir, "cache", "bundler", "git", "#{@name}-#{uri_hash}"
  end

  ##
  # Converts the git reference for the repository into a commit hash.

  def rev_parse # :nodoc:
    hash = nil

    Dir.chdir repo_cache_dir do
      hash = Gem::Util.popen(@git, "rev-parse", @reference).strip
    end

    raise Gem::Exception,
          "unable to find reference #{@reference} in #{@repository}" unless
            $?.success?

    hash
  end

  ##
  # Loads all gemspecs in the repository

  def specs
    checkout

    return [] unless install_dir

    Dir.chdir install_dir do
      Dir["{,*,*/*}.gemspec"].map do |spec_file|
        directory = File.dirname spec_file
        file      = File.basename spec_file

        Dir.chdir directory do
          spec = Gem::Specification.load file
          if spec
            spec.base_dir = base_dir

            spec.extension_dir =
              File.join base_dir, "extensions", Gem::Platform.local.to_s,
                Gem.extension_api_version, "#{name}-#{dir_shortref}"

            spec.full_gem_path = File.dirname spec.loaded_from if spec
          end
          spec
        end
      end.compact
    end
  end

  ##
  # A hash for the git gem based on the git repository URI.

  def uri_hash # :nodoc:
    require_relative "../openssl"

    normalized =
      if @repository =~ %r{^\w+://(\w+@)?}
        uri = URI(@repository).normalize.to_s.sub %r{/$},""
        uri.sub(/\A(\w+)/) { $1.downcase }
      else
        @repository
      end

    OpenSSL::Digest::SHA1.hexdigest normalized
  end
end
PK}$[�jV�//!rubygems/rubygems/source/local.rbnu�[���# frozen_string_literal: true
##
# The local source finds gems in the current directory for fulfilling
# dependencies.

class Gem::Source::Local < Gem::Source
  def initialize # :nodoc:
    @specs   = nil
    @api_uri = nil
    @uri     = nil
    @load_specs_names = {}
  end

  ##
  # Local sorts before Gem::Source and after Gem::Source::Installed

  def <=>(other)
    case other
    when Gem::Source::Installed,
         Gem::Source::Lock then
      -1
    when Gem::Source::Local then
      0
    when Gem::Source then
      1
    else
      nil
    end
  end

  def inspect # :nodoc:
    keys = @specs ? @specs.keys.sort : "NOT LOADED"
    "#<%s specs: %p>" % [self.class, keys]
  end

  def load_specs(type) # :nodoc:
    @load_specs_names[type] ||= begin
      names = []

      @specs = {}

      Dir["*.gem"].each do |file|
        begin
          pkg = Gem::Package.new(file)
        rescue SystemCallError, Gem::Package::FormatError
          # ignore
        else
          tup = pkg.spec.name_tuple
          @specs[tup] = [File.expand_path(file), pkg]

          case type
          when :released
            unless pkg.spec.version.prerelease?
              names << pkg.spec.name_tuple
            end
          when :prerelease
            if pkg.spec.version.prerelease?
              names << pkg.spec.name_tuple
            end
          when :latest
            tup = pkg.spec.name_tuple

            cur = names.find {|x| x.name == tup.name }
            if !cur
              names << tup
            elsif cur.version < tup.version
              names.delete cur
              names << tup
            end
          else
            names << pkg.spec.name_tuple
          end
        end
      end

      names
    end
  end

  def find_gem(gem_name, version = Gem::Requirement.default, # :nodoc:
               prerelease = false)
    load_specs :complete

    found = []

    @specs.each do |n, data|
      if n.name == gem_name
        s = data[1].spec

        if version.satisfied_by?(s.version)
          if prerelease
            found << s
          elsif !s.version.prerelease? || version.prerelease?
            found << s
          end
        end
      end
    end

    found.max_by {|s| s.version }
  end

  def fetch_spec(name) # :nodoc:
    load_specs :complete

    if data = @specs[name]
      data.last.spec
    else
      raise Gem::Exception, "Unable to find spec for #{name.inspect}"
    end
  end

  def download(spec, cache_dir = nil) # :nodoc:
    load_specs :complete

    @specs.each do |name, data|
      return data[0] if data[1].spec == spec
    end

    raise Gem::Exception, "Unable to find file for '#{spec.full_name}'"
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "[Local gems:", "]" do
      q.breakable
      q.seplist @specs.keys do |v|
        q.text v.full_name
      end
    end
  end
end
PK}$[&�4��"rubygems/rubygems/source/vendor.rbnu�[���# frozen_string_literal: true
##
# This represents a vendored source that is similar to an installed gem.

class Gem::Source::Vendor < Gem::Source::Installed
  ##
  # Creates a new Vendor source for a gem that was unpacked at +path+.

  def initialize(path)
    @uri = path
  end

  def <=>(other)
    case other
    when Gem::Source::Lock then
      -1
    when Gem::Source::Vendor then
      0
    when Gem::Source then
      1
    else
      nil
    end
  end
end
PK}$[ڒ�ڕ�%rubygems/rubygems/source/installed.rbnu�[���# frozen_string_literal: true
##
# Represents an installed gem.  This is used for dependency resolution.

class Gem::Source::Installed < Gem::Source
  def initialize # :nodoc:
    @uri = nil
  end

  ##
  # Installed sources sort before all other sources

  def <=>(other)
    case other
    when Gem::Source::Git,
         Gem::Source::Lock,
         Gem::Source::Vendor then
      -1
    when Gem::Source::Installed then
      0
    when Gem::Source then
      1
    else
      nil
    end
  end

  ##
  # We don't need to download an installed gem

  def download(spec, path)
    nil
  end

  def pretty_print(q) # :nodoc:
    q.text "[Installed]"
  end
end
PK}$[xD/{�� rubygems/rubygems/source/lock.rbnu�[���# frozen_string_literal: true
##
# A Lock source wraps an installed gem's source and sorts before other sources
# during dependency resolution.  This allows RubyGems to prefer gems from
# dependency lock files.

class Gem::Source::Lock < Gem::Source
  ##
  # The wrapped Gem::Source

  attr_reader :wrapped

  ##
  # Creates a new Lock source that wraps +source+ and moves it earlier in the
  # sort list.

  def initialize(source)
    @wrapped = source
  end

  def <=>(other) # :nodoc:
    case other
    when Gem::Source::Lock then
      @wrapped <=> other.wrapped
    when Gem::Source then
      1
    else
      nil
    end
  end

  def ==(other) # :nodoc:
    0 == (self <=> other)
  end

  def hash # :nodoc:
    @wrapped.hash ^ 3
  end

  ##
  # Delegates to the wrapped source's fetch_spec method.

  def fetch_spec(name_tuple)
    @wrapped.fetch_spec name_tuple
  end

  def uri # :nodoc:
    @wrapped.uri
  end
end
PK}$[��b��4�4 rubygems/rubygems/config_file.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require_relative "user_interaction"
require "rbconfig"

##
# Gem::ConfigFile RubyGems options and gem command options from gemrc.
#
# gemrc is a YAML file that uses strings to match gem command arguments and
# symbols to match RubyGems options.
#
# Gem command arguments use a String key that matches the command name and
# allow you to specify default arguments:
#
#   install: --no-rdoc --no-ri
#   update: --no-rdoc --no-ri
#
# You can use <tt>gem:</tt> to set default arguments for all commands.
#
# RubyGems options use symbol keys.  Valid options are:
#
# +:backtrace+:: See #backtrace
# +:sources+:: Sets Gem::sources
# +:verbose+:: See #verbose
# +:concurrent_downloads+:: See #concurrent_downloads
#
# gemrc files may exist in various locations and are read and merged in
# the following order:
#
# - system wide (/etc/gemrc)
# - per user (~/.gemrc)
# - per environment (gemrc files listed in the GEMRC environment variable)

class Gem::ConfigFile
  include Gem::UserInteraction

  DEFAULT_BACKTRACE = true
  DEFAULT_BULK_THRESHOLD = 1000
  DEFAULT_VERBOSITY = true
  DEFAULT_UPDATE_SOURCES = true
  DEFAULT_CONCURRENT_DOWNLOADS = 8
  DEFAULT_CERT_EXPIRATION_LENGTH_DAYS = 365
  DEFAULT_IPV4_FALLBACK_ENABLED = false

  ##
  # For Ruby packagers to set configuration defaults.  Set in
  # rubygems/defaults/operating_system.rb

  OPERATING_SYSTEM_DEFAULTS = Gem.operating_system_defaults

  ##
  # For Ruby implementers to set configuration defaults.  Set in
  # rubygems/defaults/#{RUBY_ENGINE}.rb

  PLATFORM_DEFAULTS = Gem.platform_defaults

  # :stopdoc:

  SYSTEM_CONFIG_PATH =
    begin
      require "etc"
      Etc.sysconfdir
    rescue LoadError, NoMethodError
      RbConfig::CONFIG["sysconfdir"] || "/etc"
    end

  # :startdoc:

  SYSTEM_WIDE_CONFIG_FILE = File.join SYSTEM_CONFIG_PATH, "gemrc"

  ##
  # List of arguments supplied to the config file object.

  attr_reader :args

  ##
  # Where to look for gems (deprecated)

  attr_accessor :path

  ##
  # Where to install gems (deprecated)

  attr_accessor :home

  ##
  # True if we print backtraces on errors.

  attr_writer :backtrace

  ##
  # Bulk threshold value.  If the number of missing gems are above this
  # threshold value, then a bulk download technique is used.  (deprecated)

  attr_accessor :bulk_threshold

  ##
  # Verbose level of output:
  # * false -- No output
  # * true -- Normal output
  # * :loud -- Extra output

  attr_accessor :verbose

  ##
  # Number of gem downloads that should be performed concurrently.

  attr_accessor :concurrent_downloads

  ##
  # True if we want to update the SourceInfoCache every time, false otherwise

  attr_accessor :update_sources

  ##
  # True if we want to force specification of gem server when pushing a gem

  attr_accessor :disable_default_gem_server

  # openssl verify mode value, used for remote https connection

  attr_reader :ssl_verify_mode

  ##
  # Path name of directory or file of openssl CA certificate, used for remote
  # https connection

  attr_accessor :ssl_ca_cert

  ##
  # sources to look for gems
  attr_accessor :sources

  ##
  # Expiration length to sign a certificate

  attr_accessor :cert_expiration_length_days

  ##
  # == Experimental ==
  # Fallback to IPv4 when IPv6 is not reachable or slow (default: false)

  attr_accessor :ipv4_fallback_enabled

  ##
  # Path name of directory or file of openssl client certificate, used for remote https connection with client authentication

  attr_reader :ssl_client_cert

  ##
  # Create the config file object.  +args+ is the list of arguments
  # from the command line.
  #
  # The following command line options are handled early here rather
  # than later at the time most command options are processed.
  #
  # <tt>--config-file</tt>, <tt>--config-file==NAME</tt>::
  #   Obviously these need to be handled by the ConfigFile object to ensure we
  #   get the right config file.
  #
  # <tt>--backtrace</tt>::
  #   Backtrace needs to be turned on early so that errors before normal
  #   option parsing can be properly handled.
  #
  # <tt>--debug</tt>::
  #   Enable Ruby level debug messages.  Handled early for the same reason as
  #   --backtrace.
  #--
  # TODO: parse options upstream, pass in options directly

  def initialize(args)
    set_config_file_name(args)

    @backtrace = DEFAULT_BACKTRACE
    @bulk_threshold = DEFAULT_BULK_THRESHOLD
    @verbose = DEFAULT_VERBOSITY
    @update_sources = DEFAULT_UPDATE_SOURCES
    @concurrent_downloads = DEFAULT_CONCURRENT_DOWNLOADS
    @cert_expiration_length_days = DEFAULT_CERT_EXPIRATION_LENGTH_DAYS
    @ipv4_fallback_enabled = ENV["IPV4_FALLBACK_ENABLED"] == "true" || DEFAULT_IPV4_FALLBACK_ENABLED

    operating_system_config = Marshal.load Marshal.dump(OPERATING_SYSTEM_DEFAULTS)
    platform_config = Marshal.load Marshal.dump(PLATFORM_DEFAULTS)
    system_config = load_file SYSTEM_WIDE_CONFIG_FILE
    user_config = load_file config_file_name.dup.tap(&Gem::UNTAINT)

    environment_config = (ENV["GEMRC"] || "")
      .split(File::PATH_SEPARATOR).inject({}) do |result, file|
        result.merge load_file file
      end

    @hash = operating_system_config.merge platform_config
    unless args.index "--norc"
      @hash = @hash.merge system_config
      @hash = @hash.merge user_config
      @hash = @hash.merge environment_config
    end

    # HACK these override command-line args, which is bad
    @backtrace                   = @hash[:backtrace]                   if @hash.key? :backtrace
    @bulk_threshold              = @hash[:bulk_threshold]              if @hash.key? :bulk_threshold
    @home                        = @hash[:gemhome]                     if @hash.key? :gemhome
    @path                        = @hash[:gempath]                     if @hash.key? :gempath
    @update_sources              = @hash[:update_sources]              if @hash.key? :update_sources
    @verbose                     = @hash[:verbose]                     if @hash.key? :verbose
    @disable_default_gem_server  = @hash[:disable_default_gem_server]  if @hash.key? :disable_default_gem_server
    @sources                     = @hash[:sources]                     if @hash.key? :sources
    @cert_expiration_length_days = @hash[:cert_expiration_length_days] if @hash.key? :cert_expiration_length_days
    @ipv4_fallback_enabled       = @hash[:ipv4_fallback_enabled]       if @hash.key? :ipv4_fallback_enabled

    @ssl_verify_mode  = @hash[:ssl_verify_mode]  if @hash.key? :ssl_verify_mode
    @ssl_ca_cert      = @hash[:ssl_ca_cert]      if @hash.key? :ssl_ca_cert
    @ssl_client_cert  = @hash[:ssl_client_cert]  if @hash.key? :ssl_client_cert

    @api_keys         = nil
    @rubygems_api_key = nil

    handle_arguments args
  end

  ##
  # Hash of RubyGems.org and alternate API keys

  def api_keys
    load_api_keys unless @api_keys

    @api_keys
  end

  ##
  # Checks the permissions of the credentials file.  If they are not 0600 an
  # error message is displayed and RubyGems aborts.

  def check_credentials_permissions
    return if Gem.win_platform? # windows doesn't write 0600 as 0600
    return unless File.exist? credentials_path

    existing_permissions = File.stat(credentials_path).mode & 0777

    return if existing_permissions == 0600

    alert_error <<-ERROR
Your gem push credentials file located at:

\t#{credentials_path}

has file permissions of 0#{existing_permissions.to_s 8} but 0600 is required.

To fix this error run:

\tchmod 0600 #{credentials_path}

You should reset your credentials at:

\thttps://rubygems.org/profile/edit

if you believe they were disclosed to a third party.
    ERROR

    terminate_interaction 1
  end

  ##
  # Location of RubyGems.org credentials

  def credentials_path
    credentials = File.join Gem.user_home, ".gem", "credentials"
    if File.exist? credentials
      credentials
    else
      File.join Gem.data_home, "gem", "credentials"
    end
  end

  def load_api_keys
    check_credentials_permissions

    @api_keys = if File.exist? credentials_path
      load_file(credentials_path)
    else
      @hash
    end

    if @api_keys.key? :rubygems_api_key
      @rubygems_api_key    = @api_keys[:rubygems_api_key]
      @api_keys[:rubygems] = @api_keys.delete :rubygems_api_key unless
        @api_keys.key? :rubygems
    end
  end

  ##
  # Returns the RubyGems.org API key

  def rubygems_api_key
    load_api_keys unless @rubygems_api_key

    @rubygems_api_key
  end

  ##
  # Sets the RubyGems.org API key to +api_key+

  def rubygems_api_key=(api_key)
    set_api_key :rubygems_api_key, api_key

    @rubygems_api_key = api_key
  end

  ##
  # Set a specific host's API key to +api_key+

  def set_api_key(host, api_key)
    check_credentials_permissions

    config = load_file(credentials_path).merge(host => api_key)

    dirname = File.dirname credentials_path
    require "fileutils"
    FileUtils.mkdir_p(dirname)

    Gem.load_yaml

    permissions = 0600 & (~File.umask)
    File.open(credentials_path, "w", permissions) do |f|
      f.write config.to_yaml
    end

    load_api_keys # reload
  end

  ##
  # Remove the +~/.gem/credentials+ file to clear all the current sessions.

  def unset_api_key!
    return false unless File.exist?(credentials_path)

    File.delete(credentials_path)
  end

  def load_file(filename)
    Gem.load_yaml

    yaml_errors = [ArgumentError]
    yaml_errors << Psych::SyntaxError if defined?(Psych::SyntaxError)

    return {} unless filename && !filename.empty? && File.exist?(filename)

    begin
      content = Gem::SafeYAML.load(File.read(filename))
      unless content.kind_of? Hash
        warn "Failed to load #{filename} because it doesn't contain valid YAML hash"
        return {}
      end
      return content
    rescue *yaml_errors => e
      warn "Failed to load #{filename}, #{e}"
    rescue Errno::EACCES
      warn "Failed to load #{filename} due to permissions problem."
    end

    {}
  end

  # True if the backtrace option has been specified, or debug is on.
  def backtrace
    @backtrace || $DEBUG
  end

  # The name of the configuration file.
  def config_file_name
    @config_file_name || Gem.config_file
  end

  # Delegates to @hash
  def each(&block)
    hash = @hash.dup
    hash.delete :update_sources
    hash.delete :verbose
    hash.delete :backtrace
    hash.delete :bulk_threshold

    yield :update_sources, @update_sources
    yield :verbose, @verbose
    yield :backtrace, @backtrace
    yield :bulk_threshold, @bulk_threshold

    yield "config_file_name", @config_file_name if @config_file_name

    hash.each(&block)
  end

  # Handle the command arguments.
  def handle_arguments(arg_list)
    @args = []

    arg_list.each do |arg|
      case arg
      when /^--(backtrace|traceback)$/ then
        @backtrace = true
      when /^--debug$/ then
        $DEBUG = true

        warn "NOTE:  Debugging mode prints all exceptions even when rescued"
      else
        @args << arg
      end
    end
  end

  # Really verbose mode gives you extra output.
  def really_verbose
    case verbose
    when true, false, nil then
      false
    else
      true
    end
  end

  # to_yaml only overwrites things you can't override on the command line.
  def to_yaml # :nodoc:
    yaml_hash = {}
    yaml_hash[:backtrace] = @hash.fetch(:backtrace, DEFAULT_BACKTRACE)
    yaml_hash[:bulk_threshold] = @hash.fetch(:bulk_threshold, DEFAULT_BULK_THRESHOLD)
    yaml_hash[:sources] = Gem.sources.to_a
    yaml_hash[:update_sources] = @hash.fetch(:update_sources, DEFAULT_UPDATE_SOURCES)
    yaml_hash[:verbose] = @hash.fetch(:verbose, DEFAULT_VERBOSITY)

    yaml_hash[:concurrent_downloads] =
      @hash.fetch(:concurrent_downloads, DEFAULT_CONCURRENT_DOWNLOADS)

    yaml_hash[:ssl_verify_mode] =
      @hash[:ssl_verify_mode] if @hash.key? :ssl_verify_mode

    yaml_hash[:ssl_ca_cert] =
      @hash[:ssl_ca_cert] if @hash.key? :ssl_ca_cert

    yaml_hash[:ssl_client_cert] =
      @hash[:ssl_client_cert] if @hash.key? :ssl_client_cert

    keys = yaml_hash.keys.map {|key| key.to_s }
    keys << "debug"
    re = Regexp.union(*keys)

    @hash.each do |key, value|
      key = key.to_s
      next if key =~ re
      yaml_hash[key.to_s] = value
    end

    yaml_hash.to_yaml
  end

  # Writes out this config file, replacing its source.
  def write
    require "fileutils"
    FileUtils.mkdir_p File.dirname(config_file_name)

    File.open config_file_name, "w" do |io|
      io.write to_yaml
    end
  end

  # Return the configuration information for +key+.
  def [](key)
    @hash[key.to_s]
  end

  # Set configuration option +key+ to +value+.
  def []=(key, value)
    @hash[key.to_s] = value
  end

  def ==(other) # :nodoc:
    self.class === other &&
      @backtrace == other.backtrace &&
      @bulk_threshold == other.bulk_threshold &&
      @verbose == other.verbose &&
      @update_sources == other.update_sources &&
      @hash == other.hash
  end

  attr_reader :hash
  protected :hash

  private

  def set_config_file_name(args)
    @config_file_name = ENV["GEMRC"]
    need_config_file_name = false

    args.each do |arg|
      if need_config_file_name
        @config_file_name = arg
        need_config_file_name = false
      elsif arg =~ /^--config-file=(.*)/
        @config_file_name = $1
      elsif arg =~ /^--config-file$/
        need_config_file_name = true
      end
    end
  end
end
PK}$[$�to�$�$#rubygems/rubygems/remote_fetcher.rbnu�[���# frozen_string_literal: true
require_relative "../rubygems"
require_relative "request"
require_relative "request/connection_pools"
require_relative "s3_uri_signer"
require_relative "uri_formatter"
require_relative "uri"
require_relative "user_interaction"

##
# RemoteFetcher handles the details of fetching gems and gem information from
# a remote source.

class Gem::RemoteFetcher
  include Gem::UserInteraction

  ##
  # A FetchError exception wraps up the various possible IO and HTTP failures
  # that could happen while downloading from the internet.

  class FetchError < Gem::Exception
    ##
    # The URI which was being accessed when the exception happened.

    attr_accessor :uri, :original_uri

    def initialize(message, uri)
      uri = Gem::Uri.new(uri)

      super uri.redact_credentials_from(message)

      @original_uri = uri.to_s
      @uri = uri.redacted.to_s
    end

    def to_s # :nodoc:
      "#{super} (#{uri})"
    end
  end

  ##
  # A FetchError that indicates that the reason for not being
  # able to fetch data was that the host could not be contacted

  class UnknownHostError < FetchError
  end
  deprecate_constant(:UnknownHostError)

  @fetcher = nil

  ##
  # Cached RemoteFetcher instance.

  def self.fetcher
    @fetcher ||= self.new Gem.configuration[:http_proxy]
  end

  attr_accessor :headers

  ##
  # Initialize a remote fetcher using the source URI and possible proxy
  # information.
  #
  # +proxy+
  # * [String]: explicit specification of proxy; overrides any environment
  #             variable setting
  # * nil: respect environment variables (HTTP_PROXY, HTTP_PROXY_USER,
  #        HTTP_PROXY_PASS)
  # * <tt>:no_proxy</tt>: ignore environment variables and _don't_ use a proxy
  #
  # +headers+: A set of additional HTTP headers to be sent to the server when
  #            fetching the gem.

  def initialize(proxy=nil, dns=nil, headers={})
    require_relative "core_ext/tcpsocket_init" if Gem.configuration.ipv4_fallback_enabled
    require "net/http"
    require "stringio"
    require "uri"

    Socket.do_not_reverse_lookup = true

    @proxy = proxy
    @pools = {}
    @pool_lock = Thread::Mutex.new
    @cert_files = Gem::Request.get_cert_files

    @headers = headers
  end

  ##
  # Given a name and requirement, downloads this gem into cache and returns the
  # filename. Returns nil if the gem cannot be located.
  #--
  # Should probably be integrated with #download below, but that will be a
  # larger, more encompassing effort. -erikh

  def download_to_cache(dependency)
    found, _ = Gem::SpecFetcher.fetcher.spec_for_dependency dependency

    return if found.empty?

    spec, source = found.max_by {|(s,_)| s.version }

    download spec, source.uri
  end

  ##
  # Moves the gem +spec+ from +source_uri+ to the cache dir unless it is
  # already there.  If the source_uri is local the gem cache dir copy is
  # always replaced.

  def download(spec, source_uri, install_dir = Gem.dir)
    install_cache_dir = File.join install_dir, "cache"
    cache_dir =
      if Dir.pwd == install_dir # see fetch_command
        install_dir
      elsif File.writable?(install_cache_dir) || (File.writable?(install_dir) && (!File.exist?(install_cache_dir)))
        install_cache_dir
      else
        File.join Gem.user_dir, "cache"
      end

    gem_file_name = File.basename spec.cache_file
    local_gem_path = File.join cache_dir, gem_file_name

    require "fileutils"
    FileUtils.mkdir_p cache_dir rescue nil unless File.exist? cache_dir

    source_uri = Gem::Uri.new(source_uri)

    scheme = source_uri.scheme

    # URI.parse gets confused by MS Windows paths with forward slashes.
    scheme = nil if scheme =~ /^[a-z]$/i

    # REFACTOR: split this up and dispatch on scheme (eg download_http)
    # REFACTOR: be sure to clean up fake fetcher when you do this... cleaner
    case scheme
    when "http", "https", "s3" then
      unless File.exist? local_gem_path
        begin
          verbose "Downloading gem #{gem_file_name}"

          remote_gem_path = source_uri + "gems/#{gem_file_name}"

          self.cache_update_path remote_gem_path, local_gem_path
        rescue FetchError
          raise if spec.original_platform == spec.platform

          alternate_name = "#{spec.original_name}.gem"

          verbose "Failed, downloading gem #{alternate_name}"

          remote_gem_path = source_uri + "gems/#{alternate_name}"

          self.cache_update_path remote_gem_path, local_gem_path
        end
      end
    when "file" then
      begin
        path = source_uri.path
        path = File.dirname(path) if File.extname(path) == ".gem"

        remote_gem_path = Gem::Util.correct_for_windows_path(File.join(path, "gems", gem_file_name))

        FileUtils.cp(remote_gem_path, local_gem_path)
      rescue Errno::EACCES
        local_gem_path = source_uri.to_s
      end

      verbose "Using local gem #{local_gem_path}"
    when nil then # TODO test for local overriding cache
      source_path = if Gem.win_platform? && source_uri.scheme &&
                       !source_uri.path.include?(":")
        "#{source_uri.scheme}:#{source_uri.path}"
      else
        source_uri.path
      end

      source_path = Gem::UriFormatter.new(source_path).unescape

      begin
        FileUtils.cp source_path, local_gem_path unless
          File.identical?(source_path, local_gem_path)
      rescue Errno::EACCES
        local_gem_path = source_uri.to_s
      end

      verbose "Using local gem #{local_gem_path}"
    else
      raise ArgumentError, "unsupported URI scheme #{source_uri.scheme}"
    end

    local_gem_path
  end

  ##
  # File Fetcher. Dispatched by +fetch_path+. Use it instead.

  def fetch_file(uri, *_)
    Gem.read_binary Gem::Util.correct_for_windows_path uri.path
  end

  ##
  # HTTP Fetcher. Dispatched by +fetch_path+. Use it instead.

  def fetch_http(uri, last_modified = nil, head = false, depth = 0)
    fetch_type = head ? Net::HTTP::Head : Net::HTTP::Get
    response   = request uri, fetch_type, last_modified do |req|
      headers.each {|k,v| req.add_field(k,v) }
    end

    case response
    when Net::HTTPOK, Net::HTTPNotModified then
      response.uri = uri
      head ? response : response.body
    when Net::HTTPMovedPermanently, Net::HTTPFound, Net::HTTPSeeOther,
         Net::HTTPTemporaryRedirect then
      raise FetchError.new("too many redirects", uri) if depth > 10

      unless location = response["Location"]
        raise FetchError.new("redirecting but no redirect location was given", uri)
      end
      location = Gem::Uri.new location

      if https?(uri) && !https?(location)
        raise FetchError.new("redirecting to non-https resource: #{location}", uri)
      end

      fetch_http(location, last_modified, head, depth + 1)
    else
      raise FetchError.new("bad response #{response.message} #{response.code}", uri)
    end
  end

  alias :fetch_https :fetch_http

  ##
  # Downloads +uri+ and returns it as a String.

  def fetch_path(uri, mtime = nil, head = false)
    uri = Gem::Uri.new uri

    unless uri.scheme
      raise ArgumentError, "uri scheme is invalid: #{uri.scheme.inspect}"
    end

    data = send "fetch_#{uri.scheme}", uri, mtime, head

    if data && !head && uri.to_s.end_with?(".gz")
      begin
        data = Gem::Util.gunzip data
      rescue Zlib::GzipFile::Error
        raise FetchError.new("server did not return a valid file", uri)
      end
    end

    data
  rescue Timeout::Error, IOError, SocketError, SystemCallError,
         *(OpenSSL::SSL::SSLError if Gem::HAVE_OPENSSL) => e
    raise FetchError.new("#{e.class}: #{e}", uri)
  end

  def fetch_s3(uri, mtime = nil, head = false)
    begin
      public_uri = s3_uri_signer(uri).sign
    rescue Gem::S3URISigner::ConfigurationError, Gem::S3URISigner::InstanceProfileError => e
      raise FetchError.new(e.message, "s3://#{uri.host}")
    end
    fetch_https public_uri, mtime, head
  end

  # we have our own signing code here to avoid a dependency on the aws-sdk gem
  def s3_uri_signer(uri)
    Gem::S3URISigner.new(uri)
  end

  ##
  # Downloads +uri+ to +path+ if necessary. If no path is given, it just
  # passes the data.

  def cache_update_path(uri, path = nil, update = true)
    mtime = path && File.stat(path).mtime rescue nil

    data = fetch_path(uri, mtime)

    if data.nil? # indicates the server returned 304 Not Modified
      return Gem.read_binary(path)
    end

    if update && path
      Gem.write_binary(path, data)
    end

    data
  end

  ##
  # Performs a Net::HTTP request of type +request_class+ on +uri+ returning
  # a Net::HTTP response object.  request maintains a table of persistent
  # connections to reduce connect overhead.

  def request(uri, request_class, last_modified = nil)
    proxy = proxy_for @proxy, uri
    pool  = pools_for(proxy).pool_for uri

    request = Gem::Request.new uri, request_class, last_modified, pool

    request.fetch do |req|
      yield req if block_given?
    end
  end

  def https?(uri)
    uri.scheme.downcase == "https"
  end

  def close_all
    @pools.each_value {|pool| pool.close_all }
  end

  private

  def proxy_for(proxy, uri)
    Gem::Request.proxy_uri(proxy || Gem::Request.get_proxy_from_env(uri.scheme))
  end

  def pools_for(proxy)
    @pool_lock.synchronize do
      @pools[proxy] ||= Gem::Request::ConnectionPools.new proxy, @cert_files
    end
  end
end
PK}$[��X��� rubygems/rubygems/requirement.rbnu�[���# frozen_string_literal: true
require_relative "version"

##
# A Requirement is a set of one or more version restrictions. It supports a
# few (<tt>=, !=, >, <, >=, <=, ~></tt>) different restriction operators.
#
# See Gem::Version for a description on how versions and requirements work
# together in RubyGems.

class Gem::Requirement
  OPS = { #:nodoc:
    "="  =>  lambda {|v, r| v == r },
    "!=" =>  lambda {|v, r| v != r },
    ">"  =>  lambda {|v, r| v >  r },
    "<"  =>  lambda {|v, r| v <  r },
    ">=" =>  lambda {|v, r| v >= r },
    "<=" =>  lambda {|v, r| v <= r },
    "~>" =>  lambda {|v, r| v >= r && v.release < r.bump },
  }.freeze

  SOURCE_SET_REQUIREMENT = Struct.new(:for_lockfile).new "!" # :nodoc:

  quoted = OPS.keys.map {|k| Regexp.quote k }.join "|"
  PATTERN_RAW = "\\s*(#{quoted})?\\s*(#{Gem::Version::VERSION_PATTERN})\\s*".freeze # :nodoc:

  ##
  # A regular expression that matches a requirement

  PATTERN = /\A#{PATTERN_RAW}\z/.freeze

  ##
  # The default requirement matches any non-prerelease version

  DefaultRequirement = [">=", Gem::Version.new(0)].freeze

  ##
  # The default requirement matches any version

  DefaultPrereleaseRequirement = [">=", Gem::Version.new("0.a")].freeze

  ##
  # Raised when a bad requirement is encountered

  class BadRequirementError < ArgumentError; end

  ##
  # Factory method to create a Gem::Requirement object.  Input may be
  # a Version, a String, or nil.  Intended to simplify client code.
  #
  # If the input is "weird", the default version requirement is
  # returned.

  def self.create(*inputs)
    return new inputs if inputs.length > 1

    input = inputs.shift

    case input
    when Gem::Requirement then
      input
    when Gem::Version, Array then
      new input
    when "!" then
      source_set
    else
      if input.respond_to? :to_str
        new [input.to_str]
      else
        default
      end
    end
  end

  def self.default
    new ">= 0"
  end

  def self.default_prerelease
    new ">= 0.a"
  end

  ###
  # A source set requirement, used for Gemfiles and lockfiles

  def self.source_set # :nodoc:
    SOURCE_SET_REQUIREMENT
  end

  ##
  # Parse +obj+, returning an <tt>[op, version]</tt> pair. +obj+ can
  # be a String or a Gem::Version.
  #
  # If +obj+ is a String, it can be either a full requirement
  # specification, like <tt>">= 1.2"</tt>, or a simple version number,
  # like <tt>"1.2"</tt>.
  #
  #     parse("> 1.0")                 # => [">", Gem::Version.new("1.0")]
  #     parse("1.0")                   # => ["=", Gem::Version.new("1.0")]
  #     parse(Gem::Version.new("1.0")) # => ["=,  Gem::Version.new("1.0")]

  def self.parse(obj)
    return ["=", obj] if Gem::Version === obj

    unless PATTERN =~ obj.to_s
      raise BadRequirementError, "Illformed requirement [#{obj.inspect}]"
    end

    if $1 == ">=" && $2 == "0"
      DefaultRequirement
    elsif $1 == ">=" && $2 == "0.a"
      DefaultPrereleaseRequirement
    else
      [-($1 || "="), Gem::Version.new($2)]
    end
  end

  ##
  # An array of requirement pairs. The first element of the pair is
  # the op, and the second is the Gem::Version.

  attr_reader :requirements #:nodoc:

  ##
  # Constructs a requirement from +requirements+. Requirements can be
  # Strings, Gem::Versions, or Arrays of those. +nil+ and duplicate
  # requirements are ignored. An empty set of +requirements+ is the
  # same as <tt>">= 0"</tt>.

  def initialize(*requirements)
    requirements = requirements.flatten
    requirements.compact!
    requirements.uniq!

    if requirements.empty?
      @requirements = [DefaultRequirement]
    else
      @requirements = requirements.map! {|r| self.class.parse r }
    end
  end

  ##
  # Concatenates the +new+ requirements onto this requirement.

  def concat(new)
    new = new.flatten
    new.compact!
    new.uniq!
    new = new.map {|r| self.class.parse r }

    @requirements.concat new
  end

  ##
  # Formats this requirement for use in a Gem::RequestSet::Lockfile.

  def for_lockfile # :nodoc:
    return if [DefaultRequirement] == @requirements

    list = requirements.sort_by do |_, version|
      version
    end.map do |op, version|
      "#{op} #{version}"
    end.uniq

    " (#{list.join ', '})"
  end

  ##
  # true if this gem has no requirements.

  def none?
    if @requirements.size == 1
      @requirements[0] == DefaultRequirement
    else
      false
    end
  end

  ##
  # true if the requirement is for only an exact version

  def exact?
    return false unless @requirements.size == 1
    @requirements[0][0] == "="
  end

  def as_list # :nodoc:
    requirements.map {|op, version| "#{op} #{version}" }
  end

  def hash # :nodoc:
    requirements.map {|r| r.first == "~>" ? [r[0], r[1].to_s] : r }.sort.hash
  end

  def marshal_dump # :nodoc:
    [@requirements]
  end

  def marshal_load(array) # :nodoc:
    @requirements = array[0]

    raise TypeError, "wrong @requirements" unless Array === @requirements
  end

  def yaml_initialize(tag, vals) # :nodoc:
    vals.each do |ivar, val|
      instance_variable_set "@#{ivar}", val
    end
  end

  def init_with(coder) # :nodoc:
    yaml_initialize coder.tag, coder.map
  end

  def to_yaml_properties # :nodoc:
    ["@requirements"]
  end

  def encode_with(coder) # :nodoc:
    coder.add "requirements", @requirements
  end

  ##
  # A requirement is a prerelease if any of the versions inside of it
  # are prereleases

  def prerelease?
    requirements.any? {|r| r.last.prerelease? }
  end

  def pretty_print(q) # :nodoc:
    q.group 1, "Gem::Requirement.new(", ")" do
      q.pp as_list
    end
  end

  ##
  # True if +version+ satisfies this Requirement.

  def satisfied_by?(version)
    raise ArgumentError, "Need a Gem::Version: #{version.inspect}" unless
      Gem::Version === version
    requirements.all? {|op, rv| OPS[op].call version, rv }
  end

  alias :=== :satisfied_by?
  alias :=~ :satisfied_by?

  ##
  # True if the requirement will not always match the latest version.

  def specific?
    return true if @requirements.length > 1 # GIGO, > 1, > 2 is silly

    !%w[> >=].include? @requirements.first.first # grab the operator
  end

  def to_s # :nodoc:
    as_list.join ", "
  end

  def ==(other) # :nodoc:
    return unless Gem::Requirement === other

    # An == check is always necessary
    return false unless _sorted_requirements == other._sorted_requirements

    # An == check is sufficient unless any requirements use ~>
    return true unless _tilde_requirements.any?

    # If any requirements use ~> we use the stricter `#eql?` that also checks
    # that version precision is the same
    _tilde_requirements.eql?(other._tilde_requirements)
  end

  protected

  def _sorted_requirements
    @_sorted_requirements ||= requirements.sort_by(&:to_s)
  end

  def _tilde_requirements
    @_tilde_requirements ||= _sorted_requirements.select {|r| r.first == "~>" }
  end
end

class Gem::Version
  # This is needed for compatibility with older yaml
  # gemspecs.

  Requirement = Gem::Requirement # :nodoc:
end
PK}$[a���rubygems/rubygems/rdoc.rbnu�[���# frozen_string_literal: true
require_relative "../rubygems"

begin
  require "rdoc/rubygems_hook"
  module Gem
    RDoc = ::RDoc::RubygemsHook
  end

  Gem.done_installing(&Gem::RDoc.method(:generation_hook))
rescue LoadError
end
PK}$[ �{�

"rubygems/rubygems/available_set.rbnu�[���# frozen_string_literal: true
class Gem::AvailableSet
  include Enumerable

  Tuple = Struct.new(:spec, :source)

  attr_accessor :remote # :nodoc:

  def initialize
    @set = []
    @sorted = nil
    @remote = true
  end

  attr_reader :set

  def add(spec, source)
    @set << Tuple.new(spec, source)
    @sorted = nil
    self
  end

  def <<(o)
    case o
    when Gem::AvailableSet
      s = o.set
    when Array
      s = o.map do |sp,so|
        if !sp.kind_of?(Gem::Specification) || !so.kind_of?(Gem::Source)
          raise TypeError, "Array must be in [[spec, source], ...] form"
        end

        Tuple.new(sp,so)
      end
    else
      raise TypeError, "must be a Gem::AvailableSet"
    end

    @set += s
    @sorted = nil

    self
  end

  ##
  # Yields each Tuple in this AvailableSet

  def each
    return enum_for __method__ unless block_given?

    @set.each do |tuple|
      yield tuple
    end
  end

  ##
  # Yields the Gem::Specification for each Tuple in this AvailableSet

  def each_spec
    return enum_for __method__ unless block_given?

    each do |tuple|
      yield tuple.spec
    end
  end

  def empty?
    @set.empty?
  end

  def all_specs
    @set.map {|t| t.spec }
  end

  def match_platform!
    @set.reject! {|t| !Gem::Platform.match_spec?(t.spec) }
    @sorted = nil
    self
  end

  def sorted
    @sorted ||= @set.sort do |a,b|
      i = b.spec <=> a.spec
      i != 0 ? i : (a.source <=> b.source)
    end
  end

  def size
    @set.size
  end

  def source_for(spec)
    f = @set.find {|t| t.spec == spec }
    f.source
  end

  ##
  # Converts this AvailableSet into a RequestSet that can be used to install
  # gems.
  #
  # If +development+ is :none then no development dependencies are installed.
  # Other options are :shallow for only direct development dependencies of the
  # gems in this set or :all for all development dependencies.

  def to_request_set(development = :none)
    request_set = Gem::RequestSet.new
    request_set.development = :all == development

    each_spec do |spec|
      request_set.always_install << spec

      request_set.gem spec.name, spec.version
      request_set.import spec.development_dependencies if
        :shallow == development
    end

    request_set
  end

  ##
  #
  # Used by the Resolver, the protocol to use a AvailableSet as a
  # search Set.

  def find_all(req)
    dep = req.dependency

    match = @set.find_all do |t|
      dep.match? t.spec
    end

    match.map do |t|
      Gem::Resolver::LocalSpecification.new(self, t.spec, t.source)
    end
  end

  def prefetch(reqs)
  end

  def pick_best!
    return self if empty?

    @set = [sorted.first]
    @sorted = nil
    self
  end

  def remove_installed!(dep)
    @set.reject! do |t|
      # already locally installed
      Gem::Specification.any? do |installed_spec|
        dep.name == installed_spec.name &&
          dep.requirement.satisfied_by?(installed_spec.version)
      end
    end

    @sorted = nil
    self
  end

  def inject_into_list(dep_list)
    @set.each {|t| dep_list.add t.spec }
  end
end
PK}$[�QFHHrubygems/rubygems/optparse.rbnu�[���# frozen_string_literal: true

require_relative "optparse/lib/optparse"
PK}$[
��0rubygems/rubygems/installer_uninstaller_utils.rbnu�[���# frozen_string_literal: true

##
# Helper methods for both Gem::Installer and Gem::Uninstaller

module Gem::InstallerUninstallerUtils

  def regenerate_plugins_for(spec, plugins_dir)
    plugins = spec.plugins
    return if plugins.empty?

    require "pathname"

    spec.plugins.each do |plugin|
      plugin_script_path = File.join plugins_dir, "#{spec.name}_plugin#{File.extname(plugin)}"

      File.open plugin_script_path, "wb" do |file|
        file.puts "require_relative '#{Pathname.new(plugin).relative_path_from(Pathname.new(plugins_dir))}'"
      end

      verbose plugin_script_path
    end
  end

  def remove_plugins_for(spec, plugins_dir)
    FileUtils.rm_f Gem::Util.glob_files_in_dir("#{spec.name}#{Gem.plugin_suffix_pattern}", plugins_dir)
  end

end
PK}$[C��a��rubygems/rubygems/exceptions.rbnu�[���# frozen_string_literal: true

require_relative "deprecate"
require_relative "unknown_command_spell_checker"

##
# Base exception class for RubyGems.  All exception raised by RubyGems are a
# subclass of this one.
class Gem::Exception < RuntimeError; end

class Gem::CommandLineError < Gem::Exception; end

class Gem::UnknownCommandError < Gem::Exception
  attr_reader :unknown_command

  def initialize(unknown_command)
    self.class.attach_correctable

    @unknown_command = unknown_command
    super("Unknown command #{unknown_command}")
  end

  def self.attach_correctable
    return if defined?(@attached)

    if defined?(DidYouMean::SPELL_CHECKERS) && defined?(DidYouMean::Correctable)
      if DidYouMean.respond_to?(:correct_error)
        DidYouMean.correct_error(Gem::UnknownCommandError, Gem::UnknownCommandSpellChecker)
      else
        DidYouMean::SPELL_CHECKERS["Gem::UnknownCommandError"] =
          Gem::UnknownCommandSpellChecker

        prepend DidYouMean::Correctable
      end
    end

    @attached = true
  end
end

class Gem::DependencyError < Gem::Exception; end

class Gem::DependencyRemovalException < Gem::Exception; end

##
# Raised by Gem::Resolver when a Gem::Dependency::Conflict reaches the
# toplevel.  Indicates which dependencies were incompatible through #conflict
# and #conflicting_dependencies

class Gem::DependencyResolutionError < Gem::DependencyError
  attr_reader :conflict

  def initialize(conflict)
    @conflict = conflict
    a, b = conflicting_dependencies

    super "conflicting dependencies #{a} and #{b}\n#{@conflict.explanation}"
  end

  def conflicting_dependencies
    @conflict.conflicting_dependencies
  end
end

##
# Raised when attempting to uninstall a gem that isn't in GEM_HOME.

class Gem::GemNotInHomeException < Gem::Exception
  attr_accessor :spec
end

###
# Raised when removing a gem with the uninstall command fails

class Gem::UninstallError < Gem::Exception
  attr_accessor :spec
end

class Gem::DocumentError < Gem::Exception; end

##
# Potentially raised when a specification is validated.
class Gem::EndOfYAMLException < Gem::Exception; end

##
# Signals that a file permission error is preventing the user from
# operating on the given directory.

class Gem::FilePermissionError < Gem::Exception
  attr_reader :directory

  def initialize(directory)
    @directory = directory

    super "You don't have write permissions for the #{directory} directory."
  end
end

##
# Used to raise parsing and loading errors
class Gem::FormatException < Gem::Exception
  attr_accessor :file_path
end

class Gem::GemNotFoundException < Gem::Exception; end

##
# Raised by the DependencyInstaller when a specific gem cannot be found

class Gem::SpecificGemNotFoundException < Gem::GemNotFoundException
  ##
  # Creates a new SpecificGemNotFoundException for a gem with the given +name+
  # and +version+.  Any +errors+ encountered when attempting to find the gem
  # are also stored.

  def initialize(name, version, errors=nil)
    super "Could not find a valid gem '#{name}' (#{version}) locally or in a repository"

    @name = name
    @version = version
    @errors = errors
  end

  ##
  # The name of the gem that could not be found.

  attr_reader :name

  ##
  # The version of the gem that could not be found.

  attr_reader :version

  ##
  # Errors encountered attempting to find the gem.

  attr_reader :errors
end

##
# Raised by Gem::Resolver when dependencies conflict and create the
# inability to find a valid possible spec for a request.

class Gem::ImpossibleDependenciesError < Gem::Exception
  attr_reader :conflicts
  attr_reader :request

  def initialize(request, conflicts)
    @request   = request
    @conflicts = conflicts

    super build_message
  end

  def build_message # :nodoc:
    requester  = @request.requester
    requester  = requester ? requester.spec.full_name : "The user"
    dependency = @request.dependency

    message = "#{requester} requires #{dependency} but it conflicted:\n".dup

    @conflicts.each do |_, conflict|
      message << conflict.explanation
    end

    message
  end

  def dependency
    @request.dependency
  end
end

class Gem::InstallError < Gem::Exception; end
class Gem::RuntimeRequirementNotMetError < Gem::InstallError
  attr_accessor :suggestion
  def message
    [suggestion, super].compact.join("\n\t")
  end
end

##
# Potentially raised when a specification is validated.
class Gem::InvalidSpecificationException < Gem::Exception; end

class Gem::OperationNotSupportedError < Gem::Exception; end

##
# Signals that a remote operation cannot be conducted, probably due to not
# being connected (or just not finding host).
#--
# TODO: create a method that tests connection to the preferred gems server.
# All code dealing with remote operations will want this.  Failure in that
# method should raise this error.
class Gem::RemoteError < Gem::Exception; end

class Gem::RemoteInstallationCancelled < Gem::Exception; end

class Gem::RemoteInstallationSkipped < Gem::Exception; end

##
# Represents an error communicating via HTTP.
class Gem::RemoteSourceException < Gem::Exception; end

##
# Raised when a gem dependencies file specifies a ruby version that does not
# match the current version.

class Gem::RubyVersionMismatch < Gem::Exception; end

##
# Raised by Gem::Validator when something is not right in a gem.

class Gem::VerificationError < Gem::Exception; end

##
# Raised to indicate that a system exit should occur with the specified
# exit_code

class Gem::SystemExitException < SystemExit
  ##
  # The exit code for the process

  attr_accessor :exit_code

  ##
  # Creates a new SystemExitException with the given +exit_code+

  def initialize(exit_code)
    @exit_code = exit_code

    super exit_code, "Exiting RubyGems with exit_code #{exit_code}"
  end
end

##
# Raised by Resolver when a dependency requests a gem for which
# there is no spec.

class Gem::UnsatisfiableDependencyError < Gem::DependencyError
  ##
  # The unsatisfiable dependency.  This is a
  # Gem::Resolver::DependencyRequest, not a Gem::Dependency

  attr_reader :dependency

  ##
  # Errors encountered which may have contributed to this exception

  attr_accessor :errors

  ##
  # Creates a new UnsatisfiableDependencyError for the unsatisfiable
  # Gem::Resolver::DependencyRequest +dep+

  def initialize(dep, platform_mismatch=nil)
    if platform_mismatch && !platform_mismatch.empty?
      plats = platform_mismatch.map {|x| x.platform.to_s }.sort.uniq
      super "Unable to resolve dependency: No match for '#{dep}' on this platform. Found: #{plats.join(', ')}"
    else
      if dep.explicit?
        super "Unable to resolve dependency: user requested '#{dep}'"
      else
        super "Unable to resolve dependency: '#{dep.request_context}' requires '#{dep}'"
      end
    end

    @dependency = dep
    @errors     = []
  end

  ##
  # The name of the unresolved dependency

  def name
    @dependency.name
  end

  ##
  # The Requirement of the unresolved dependency (not Version).

  def version
    @dependency.requirement
  end
end

##
# Backwards compatible typo'd exception class for early RubyGems 2.0.x

Gem::UnsatisfiableDepedencyError = Gem::UnsatisfiableDependencyError # :nodoc:
Gem.deprecate_constant :UnsatisfiableDepedencyError
PK}$[j��ykkrubygems/rubygems/installer.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require_relative "installer_uninstaller_utils"
require_relative "exceptions"
require_relative "deprecate"
require_relative "package"
require_relative "ext"
require_relative "user_interaction"

##
# The installer installs the files contained in the .gem into the Gem.home.
#
# Gem::Installer does the work of putting files in all the right places on the
# filesystem including unpacking the gem into its gem dir, installing the
# gemspec in the specifications dir, storing the cached gem in the cache dir,
# and installing either wrappers or symlinks for executables.
#
# The installer invokes pre and post install hooks.  Hooks can be added either
# through a rubygems_plugin.rb file in an installed gem or via a
# rubygems/defaults/#{RUBY_ENGINE}.rb or rubygems/defaults/operating_system.rb
# file.  See Gem.pre_install and Gem.post_install for details.

class Gem::Installer
  extend Gem::Deprecate

  ##
  # Paths where env(1) might live.  Some systems are broken and have it in
  # /bin

  ENV_PATHS = %w[/usr/bin/env /bin/env].freeze

  ##
  # Deprecated in favor of Gem::Ext::BuildError

  ExtensionBuildError = Gem::Ext::BuildError # :nodoc:

  include Gem::UserInteraction

  include Gem::InstallerUninstallerUtils

  ##
  # The directory a gem's executables will be installed into

  attr_reader :bin_dir

  attr_reader :build_root # :nodoc:

  ##
  # The gem repository the gem will be installed into

  attr_reader :gem_home

  ##
  # The options passed when the Gem::Installer was instantiated.

  attr_reader :options

  ##
  # The gem package instance.

  attr_reader :package

  @path_warning = false

  class << self
    #
    # Changes in rubygems to lazily loading `rubygems/command` (in order to
    # lazily load `optparse` as a side effect) affect bundler's custom installer
    # which uses `Gem::Command` without requiring it (up until bundler 2.2.29).
    # This hook is to compensate for that missing require.
    #
    # TODO: Remove when rubygems no longer supports running on bundler older
    # than 2.2.29.

    def inherited(klass)
      if klass.name == "Bundler::RubyGemsGemInstaller"
        require "rubygems/command"
      end

      super(klass)
    end

    ##
    # True if we've warned about PATH not including Gem.bindir

    attr_accessor :path_warning

    ##
    # Overrides the executable format.
    #
    # This is a sprintf format with a "%s" which will be replaced with the
    # executable name.  It is based off the ruby executable name's difference
    # from "ruby".

    attr_writer :exec_format

    # Defaults to use Ruby's program prefix and suffix.
    def exec_format
      @exec_format ||= Gem.default_exec_format
    end
  end

  ##
  # Construct an installer object for the gem file located at +path+

  def self.at(path, options = {})
    security_policy = options[:security_policy]
    package = Gem::Package.new path, security_policy
    new package, options
  end

  class FakePackage
    attr_accessor :spec

    attr_accessor :dir_mode
    attr_accessor :prog_mode
    attr_accessor :data_mode

    def initialize(spec)
      @spec = spec
    end

    def extract_files(destination_dir, pattern = "*")
      FileUtils.mkdir_p destination_dir

      spec.files.each do |file|
        file = File.join destination_dir, file
        next if File.exist? file
        FileUtils.mkdir_p File.dirname(file)
        File.open file, "w" do |fp|
          fp.puts "# #{file}"
        end
      end
    end

    def copy_to(path)
    end
  end

  ##
  # Construct an installer object for an ephemeral gem (one where we don't
  # actually have a .gem file, just a spec)

  def self.for_spec(spec, options = {})
    # FIXME: we should have a real Package class for this
    new FakePackage.new(spec), options
  end

  ##
  # Constructs an Installer instance that will install the gem at +package+ which
  # can either be a path or an instance of Gem::Package.  +options+ is a Hash
  # with the following keys:
  #
  # :bin_dir:: Where to put a bin wrapper if needed.
  # :development:: Whether or not development dependencies should be installed.
  # :env_shebang:: Use /usr/bin/env in bin wrappers.
  # :force:: Overrides all version checks and security policy checks, except
  #          for a signed-gems-only policy.
  # :format_executable:: Format the executable the same as the Ruby executable.
  #                      If your Ruby is ruby18, foo_exec will be installed as
  #                      foo_exec18.
  # :ignore_dependencies:: Don't raise if a dependency is missing.
  # :install_dir:: The directory to install the gem into.
  # :security_policy:: Use the specified security policy.  See Gem::Security
  # :user_install:: Indicate that the gem should be unpacked into the users
  #                 personal gem directory.
  # :only_install_dir:: Only validate dependencies against what is in the
  #                     install_dir
  # :wrappers:: Install wrappers if true, symlinks if false.
  # :build_args:: An Array of arguments to pass to the extension builder
  #               process. If not set, then Gem::Command.build_args is used
  # :post_install_message:: Print gem post install message if true

  def initialize(package, options={})
    require "fileutils"

    @options = options
    @package = package

    process_options

    @package.dir_mode = options[:dir_mode]
    @package.prog_mode = options[:prog_mode]
    @package.data_mode = options[:data_mode]

    if options[:user_install]
      @gem_home = Gem.user_dir
      @bin_dir = Gem.bindir gem_home unless options[:bin_dir]
      @plugins_dir = Gem.plugindir(gem_home)
      check_that_user_bin_dir_is_in_path
    end
  end

  ##
  # Checks if +filename+ exists in +@bin_dir+.
  #
  # If +@force+ is set +filename+ is overwritten.
  #
  # If +filename+ exists and it is a RubyGems wrapper for a different gem, then
  # the user is consulted.
  #
  # If +filename+ exists and +@bin_dir+ is Gem.default_bindir (/usr/local) the
  # user is consulted.
  #
  # Otherwise +filename+ is overwritten.

  def check_executable_overwrite(filename) # :nodoc:
    return if @force

    generated_bin = File.join @bin_dir, formatted_program_filename(filename)

    return unless File.exist? generated_bin

    ruby_executable = false
    existing = nil

    File.open generated_bin, "rb" do |io|
      line = io.gets
      shebang = /^#!.*ruby/

      if load_relative_enabled?
        until line.nil? || line =~ shebang do
          line = io.gets
        end
      end

      next unless line =~ shebang

      io.gets # blankline

      # TODO detect a specially formatted comment instead of trying
      # to run a regexp against Ruby code.
      next unless io.gets =~ /This file was generated by RubyGems/

      ruby_executable = true
      existing = io.read.slice(%r{
          ^\s*(
            gem \s |
            load \s Gem\.bin_path\( |
            load \s Gem\.activate_bin_path\(
          )
          (['"])(.*?)(\2),
        }x, 3)
    end

    return if spec.name == existing

    # somebody has written to RubyGems' directory, overwrite, too bad
    return if Gem.default_bindir != @bin_dir && !ruby_executable

    question = "#{spec.name}'s executable \"#{filename}\" conflicts with ".dup

    if ruby_executable
      question << (existing || "an unknown executable")

      return if ask_yes_no "#{question}\nOverwrite the executable?", false

      conflict = "installed executable from #{existing}"
    else
      question << generated_bin

      return if ask_yes_no "#{question}\nOverwrite the executable?", false

      conflict = generated_bin
    end

    raise Gem::InstallError,
      "\"#{filename}\" from #{spec.name} conflicts with #{conflict}"
  end

  ##
  # Lazy accessor for the spec's gem directory.

  def gem_dir
    @gem_dir ||= File.join(gem_home, "gems", spec.full_name)
  end

  ##
  # Lazy accessor for the installer's spec.

  def spec
    @package.spec
  end

  ##
  # Installs the gem and returns a loaded Gem::Specification for the installed
  # gem.
  #
  # The gem will be installed with the following structure:
  #
  #   @gem_home/
  #     cache/<gem-version>.gem #=> a cached copy of the installed gem
  #     gems/<gem-version>/... #=> extracted files
  #     specifications/<gem-version>.gemspec #=> the Gem::Specification

  def install
    pre_install_checks

    run_pre_install_hooks

    # Set loaded_from to ensure extension_dir is correct
    if @options[:install_as_default]
      spec.loaded_from = default_spec_file
    else
      spec.loaded_from = spec_file
    end

    # Completely remove any previous gem files
    FileUtils.rm_rf gem_dir
    FileUtils.rm_rf spec.extension_dir

    dir_mode = options[:dir_mode]
    FileUtils.mkdir_p gem_dir, :mode => dir_mode && 0755

    if @options[:install_as_default]
      extract_bin
      write_default_spec
    else
      extract_files

      build_extensions
      write_build_info_file
      run_post_build_hooks
    end

    generate_bin
    generate_plugins

    unless @options[:install_as_default]
      write_spec
      write_cache_file
    end

    File.chmod(dir_mode, gem_dir) if dir_mode

    say spec.post_install_message if options[:post_install_message] && !spec.post_install_message.nil?

    Gem::Specification.add_spec(spec)

    run_post_install_hooks

    spec

  # TODO This rescue is in the wrong place. What is raising this exception?
  # move this rescue to around the code that actually might raise it.
  rescue Zlib::GzipFile::Error
    raise Gem::InstallError, "gzip error installing #{gem}"
  end

  def run_pre_install_hooks # :nodoc:
    Gem.pre_install_hooks.each do |hook|
      if hook.call(self) == false
        location = " at #{$1}" if hook.inspect =~ /[ @](.*:\d+)/

        message = "pre-install hook#{location} failed for #{spec.full_name}"
        raise Gem::InstallError, message
      end
    end
  end

  def run_post_build_hooks # :nodoc:
    Gem.post_build_hooks.each do |hook|
      if hook.call(self) == false
        FileUtils.rm_rf gem_dir

        location = " at #{$1}" if hook.inspect =~ /[ @](.*:\d+)/

        message = "post-build hook#{location} failed for #{spec.full_name}"
        raise Gem::InstallError, message
      end
    end
  end

  def run_post_install_hooks # :nodoc:
    Gem.post_install_hooks.each do |hook|
      hook.call self
    end
  end

  ##
  #
  # Return an Array of Specifications contained within the gem_home
  # we'll be installing into.

  def installed_specs
    @specs ||= begin
      specs = []

      Gem::Util.glob_files_in_dir("*.gemspec", File.join(gem_home, "specifications")).each do |path|
        spec = Gem::Specification.load path.tap(&Gem::UNTAINT)
        specs << spec if spec
      end

      specs
    end
  end

  ##
  # Ensure that the dependency is satisfied by the current installation of
  # gem.  If it is not an exception is raised.
  #
  # spec       :: Gem::Specification
  # dependency :: Gem::Dependency

  def ensure_dependency(spec, dependency)
    unless installation_satisfies_dependency? dependency
      raise Gem::InstallError, "#{spec.name} requires #{dependency}"
    end
    true
  end

  ##
  # True if the gems in the system satisfy +dependency+.

  def installation_satisfies_dependency?(dependency)
    return true if @options[:development] && dependency.type == :development
    return true if installed_specs.detect {|s| dependency.matches_spec? s }
    return false if @only_install_dir
    !dependency.matching_specs.empty?
  end

  ##
  # Unpacks the gem into the given directory.

  def unpack(directory)
    @gem_dir = directory
    extract_files
  end
  rubygems_deprecate :unpack

  ##
  # The location of the spec file that is installed.
  #

  def spec_file
    File.join gem_home, "specifications", "#{spec.full_name}.gemspec"
  end

  ##
  # The location of the default spec file for default gems.
  #

  def default_spec_file
    File.join gem_home, "specifications", "default", "#{spec.full_name}.gemspec"
  end

  ##
  # Writes the .gemspec specification (in Ruby) to the gem home's
  # specifications directory.

  def write_spec
    spec.installed_by_version = Gem.rubygems_version

    Gem.write_binary(spec_file, spec.to_ruby_for_cache)
  end

  ##
  # Writes the full .gemspec specification (in Ruby) to the gem home's
  # specifications/default directory.

  def write_default_spec
    Gem.write_binary(default_spec_file, spec.to_ruby)
  end

  ##
  # Creates windows .bat files for easy running of commands

  def generate_windows_script(filename, bindir)
    if Gem.win_platform?
      script_name = formatted_program_filename(filename) + ".bat"
      script_path = File.join bindir, File.basename(script_name)
      File.open script_path, "w" do |file|
        file.puts windows_stub_script(bindir, filename)
      end

      verbose script_path
    end
  end

  def generate_bin # :nodoc:
    return if spec.executables.nil? || spec.executables.empty?

    ensure_writable_dir @bin_dir

    spec.executables.each do |filename|
      filename.tap(&Gem::UNTAINT)
      bin_path = File.join gem_dir, spec.bindir, filename
      next unless File.exist? bin_path

      mode = File.stat(bin_path).mode
      dir_mode = options[:prog_mode] || (mode | 0111)

      unless dir_mode == mode
        require "fileutils"
        FileUtils.chmod dir_mode, bin_path
      end

      check_executable_overwrite filename

      if @wrappers
        generate_bin_script filename, @bin_dir
      else
        generate_bin_symlink filename, @bin_dir
      end
    end
  end

  def generate_plugins # :nodoc:
    latest = Gem::Specification.latest_spec_for(spec.name)
    return if latest && latest.version > spec.version

    ensure_writable_dir @plugins_dir

    if spec.plugins.empty?
      remove_plugins_for(spec, @plugins_dir)
    else
      regenerate_plugins_for(spec, @plugins_dir)
    end
  end

  ##
  # Creates the scripts to run the applications in the gem.
  #--
  # The Windows script is generated in addition to the regular one due to a
  # bug or misfeature in the Windows shell's pipe.  See
  # http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/193379

  def generate_bin_script(filename, bindir)
    bin_script_path = File.join bindir, formatted_program_filename(filename)

    require "fileutils"
    FileUtils.rm_f bin_script_path # prior install may have been --no-wrappers

    File.open bin_script_path, "wb", 0755 do |file|
      file.print app_script_text(filename)
      file.chmod(options[:prog_mode] || 0755)
    end

    verbose bin_script_path

    generate_windows_script filename, bindir
  end

  ##
  # Creates the symlinks to run the applications in the gem.  Moves
  # the symlink if the gem being installed has a newer version.

  def generate_bin_symlink(filename, bindir)
    src = File.join gem_dir, spec.bindir, filename
    dst = File.join bindir, formatted_program_filename(filename)

    if File.exist? dst
      if File.symlink? dst
        link = File.readlink(dst).split File::SEPARATOR
        cur_version = Gem::Version.create(link[-3].sub(/^.*-/, ""))
        return if spec.version < cur_version
      end
      File.unlink dst
    end

    FileUtils.symlink src, dst, :verbose => Gem.configuration.really_verbose
  rescue NotImplementedError, SystemCallError
    alert_warning "Unable to use symlinks, installing wrapper"
    generate_bin_script filename, bindir
  end

  ##
  # Generates a #! line for +bin_file_name+'s wrapper copying arguments if
  # necessary.
  #
  # If the :custom_shebang config is set, then it is used as a template
  # for how to create the shebang used for to run a gem's executables.
  #
  # The template supports 4 expansions:
  #
  #  $env    the path to the unix env utility
  #  $ruby   the path to the currently running ruby interpreter
  #  $exec   the path to the gem's executable
  #  $name   the name of the gem the executable is for
  #

  def shebang(bin_file_name)
    path = File.join gem_dir, spec.bindir, bin_file_name
    first_line = File.open(path, "rb") {|file| file.gets } || ""

    if first_line.start_with?("#!")
      # Preserve extra words on shebang line, like "-w".  Thanks RPA.
      shebang = first_line.sub(/\A\#!.*?ruby\S*((\s+\S+)+)/, "#!#{Gem.ruby}")
      opts = $1
      shebang.strip! # Avoid nasty ^M issues.
    end

    if which = Gem.configuration[:custom_shebang]
      # replace bin_file_name with "ruby" to avoid endless loops
      which = which.gsub(/ #{bin_file_name}$/," #{ruby_install_name}")

      which = which.gsub(/\$(\w+)/) do
        case $1
        when "env"
          @env_path ||= ENV_PATHS.find {|env_path| File.executable? env_path }
        when "ruby"
          "#{Gem.ruby}#{opts}"
        when "exec"
          bin_file_name
        when "name"
          spec.name
        end
      end

      "#!#{which}"
    elsif @env_shebang
      # Create a plain shebang line.
      @env_path ||= ENV_PATHS.find {|env_path| File.executable? env_path }
      "#!#{@env_path} #{ruby_install_name}"
    else
      "#{bash_prolog_script}#!#{Gem.ruby}#{opts}"
    end
  end

  ##
  # Ensures the Gem::Specification written out for this gem is loadable upon
  # installation.

  def ensure_loadable_spec
    ruby = spec.to_ruby_for_cache
    ruby.tap(&Gem::UNTAINT)

    begin
      eval ruby
    rescue StandardError, SyntaxError => e
      raise Gem::InstallError,
            "The specification for #{spec.full_name} is corrupt (#{e.class})"
    end
  end

  def ensure_dependencies_met # :nodoc:
    deps = spec.runtime_dependencies
    deps |= spec.development_dependencies if @development

    deps.each do |dep_gem|
      ensure_dependency spec, dep_gem
    end
  end

  def process_options # :nodoc:
    @options = {
      :bin_dir      => nil,
      :env_shebang  => false,
      :force        => false,
      :only_install_dir => false,
      :post_install_message => true,
    }.merge options

    @env_shebang         = options[:env_shebang]
    @force               = options[:force]
    @install_dir         = options[:install_dir]
    @gem_home            = options[:install_dir] || Gem.dir
    @plugins_dir         = Gem.plugindir(@gem_home)
    @ignore_dependencies = options[:ignore_dependencies]
    @format_executable   = options[:format_executable]
    @wrappers            = options[:wrappers]
    @only_install_dir    = options[:only_install_dir]

    # If the user has asked for the gem to be installed in a directory that is
    # the system gem directory, then use the system bin directory, else create
    # (or use) a new bin dir under the gem_home.
    @bin_dir             = options[:bin_dir] || Gem.bindir(gem_home)
    @development         = options[:development]
    @build_root          = options[:build_root]

    @build_args = options[:build_args]

    unless @build_root.nil?
      @bin_dir = File.join(@build_root, @bin_dir.gsub(/^[a-zA-Z]:/, ""))
      @gem_home = File.join(@build_root, @gem_home.gsub(/^[a-zA-Z]:/, ""))
      @plugins_dir = File.join(@build_root, @plugins_dir.gsub(/^[a-zA-Z]:/, ""))
      alert_warning "You build with buildroot.\n  Build root: #{@build_root}\n  Bin dir: #{@bin_dir}\n  Gem home: #{@gem_home}\n  Plugins dir: #{@plugins_dir}"
    end
  end

  def check_that_user_bin_dir_is_in_path # :nodoc:
    return if self.class.path_warning

    user_bin_dir = @bin_dir || Gem.bindir(gem_home)
    user_bin_dir = user_bin_dir.tr(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR

    path = ENV["PATH"]
    path = path.tr(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR

    if Gem.win_platform?
      path = path.downcase
      user_bin_dir = user_bin_dir.downcase
    end

    path = path.split(File::PATH_SEPARATOR)

    unless path.include? user_bin_dir
      unless !Gem.win_platform? && (path.include? user_bin_dir.sub(ENV["HOME"], "~"))
        alert_warning "You don't have #{user_bin_dir} in your PATH,\n\t  gem executables will not run."
        self.class.path_warning = true
      end
    end
  end

  def verify_gem_home # :nodoc:
    FileUtils.mkdir_p gem_home, :mode => options[:dir_mode] && 0755
    raise Gem::FilePermissionError, gem_home unless File.writable?(gem_home)
  end

  def verify_spec
    unless spec.name =~ Gem::Specification::VALID_NAME_PATTERN
      raise Gem::InstallError, "#{spec} has an invalid name"
    end

    if spec.raw_require_paths.any? {|path| path =~ /\R/ }
      raise Gem::InstallError, "#{spec} has an invalid require_paths"
    end

    if spec.extensions.any? {|ext| ext =~ /\R/ }
      raise Gem::InstallError, "#{spec} has an invalid extensions"
    end

    if spec.platform.to_s =~ /\R/
      raise Gem::InstallError, "#{spec.platform} is an invalid platform"
    end

    unless spec.specification_version.to_s =~ /\A\d+\z/
      raise Gem::InstallError, "#{spec} has an invalid specification_version"
    end

    if spec.dependencies.any? {|dep| dep.type != :runtime && dep.type != :development }
      raise Gem::InstallError, "#{spec} has an invalid dependencies"
    end

    if spec.dependencies.any? {|dep| dep.name =~ /(?:\R|[<>])/ }
      raise Gem::InstallError, "#{spec} has an invalid dependencies"
    end
  end

  ##
  # Return the text for an application file.

  def app_script_text(bin_file_name)
    # note that the `load` lines cannot be indented, as old RG versions match
    # against the beginning of the line
    return <<-TEXT
#{shebang bin_file_name}
#
# This file was generated by RubyGems.
#
# The application '#{spec.name}' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require 'rubygems'
#{gemdeps_load(spec.name)}
version = "#{Gem::Requirement.default_prerelease}"

str = ARGV.first
if str
  str = str.b[/\\A_(.*)_\\z/, 1]
  if str and Gem::Version.correct?(str)
    #{explicit_version_requirement(spec.name)}
    ARGV.shift
  end
end

if Gem.respond_to?(:activate_bin_path)
load Gem.activate_bin_path('#{spec.name}', '#{bin_file_name}', version)
else
gem #{spec.name.dump}, version
load Gem.bin_path(#{spec.name.dump}, #{bin_file_name.dump}, version)
end
TEXT
  end

  def gemdeps_load(name)
    return "" if name == "bundler"

    <<-TEXT

Gem.use_gemdeps
TEXT
  end

  def explicit_version_requirement(name)
    code = "version = str"
    return code unless name == "bundler"

    code += <<-TEXT

    ENV['BUNDLER_VERSION'] = str
TEXT
  end

  ##
  # return the stub script text used to launch the true Ruby script

  def windows_stub_script(bindir, bin_file_name)
    rb_topdir = RbConfig::TOPDIR || File.dirname(rb_config["bindir"])

    # get ruby executable file name from RbConfig
    ruby_exe = "#{rb_config['RUBY_INSTALL_NAME']}#{rb_config['EXEEXT']}"
    ruby_exe = "ruby.exe" if ruby_exe.empty?

    if File.exist?(File.join bindir, ruby_exe)
      # stub & ruby.exe within same folder.  Portable
      <<-TEXT
@ECHO OFF
@"%~dp0#{ruby_exe}" "%~dpn0" %*
      TEXT
    elsif bindir.downcase.start_with? rb_topdir.downcase
      # stub within ruby folder, but not standard bin.  Portable
      require "pathname"
      from = Pathname.new bindir
      to   = Pathname.new "#{rb_topdir}/bin"
      rel  = to.relative_path_from from
      <<-TEXT
@ECHO OFF
@"%~dp0#{rel}/#{ruby_exe}" "%~dpn0" %*
      TEXT
    else
      # outside ruby folder, maybe -user-install or bundler.  Portable, but ruby
      # is dependent on PATH
      <<-TEXT
@ECHO OFF
@#{ruby_exe} "%~dpn0" %*
      TEXT
    end
  end
  ##
  # Builds extensions.  Valid types of extensions are extconf.rb files,
  # configure scripts and rakefiles or mkrf_conf files.

  def build_extensions
    builder = Gem::Ext::Builder.new spec, build_args

    builder.build_extensions
  end

  ##
  # Reads the file index and extracts each file into the gem directory.
  #
  # Ensures that files can't be installed outside the gem directory.

  def extract_files
    @package.extract_files gem_dir
  end

  ##
  # Extracts only the bin/ files from the gem into the gem directory.
  # This is used by default gems to allow a gem-aware stub to function
  # without the full gem installed.

  def extract_bin
    @package.extract_files gem_dir, "#{spec.bindir}/*"
  end

  ##
  # Prefix and suffix the program filename the same as ruby.

  def formatted_program_filename(filename)
    if @format_executable
      self.class.exec_format % File.basename(filename)
    else
      filename
    end
  end

  ##
  #
  # Return the target directory where the gem is to be installed. This
  # directory is not guaranteed to be populated.
  #

  def dir
    gem_dir.to_s
  end

  ##
  # Filename of the gem being installed.

  def gem
    @package.gem.path
  end

  ##
  # Performs various checks before installing the gem such as the install
  # repository is writable and its directories exist, required Ruby and
  # rubygems versions are met and that dependencies are installed.
  #
  # Version and dependency checks are skipped if this install is forced.
  #
  # The dependent check will be skipped if the install is ignoring dependencies.

  def pre_install_checks
    verify_gem_home

    # The name and require_paths must be verified first, since it could contain
    # ruby code that would be eval'ed in #ensure_loadable_spec
    verify_spec

    ensure_loadable_spec

    if options[:install_as_default]
      Gem.ensure_default_gem_subdirectories gem_home
    else
      Gem.ensure_gem_subdirectories gem_home
    end

    return true if @force

    ensure_dependencies_met unless @ignore_dependencies

    true
  end

  ##
  # Writes the file containing the arguments for building this gem's
  # extensions.

  def write_build_info_file
    return if build_args.empty?

    build_info_dir = File.join gem_home, "build_info"

    dir_mode = options[:dir_mode]
    FileUtils.mkdir_p build_info_dir, :mode => dir_mode && 0755

    build_info_file = File.join build_info_dir, "#{spec.full_name}.info"

    File.open build_info_file, "w" do |io|
      build_args.each do |arg|
        io.puts arg
      end
    end

    File.chmod(dir_mode, build_info_dir) if dir_mode
  end

  ##
  # Writes the .gem file to the cache directory

  def write_cache_file
    cache_file = File.join gem_home, "cache", spec.file_name
    @package.copy_to cache_file
  end

  def ensure_writable_dir(dir) # :nodoc:
    begin
      Dir.mkdir dir, *[options[:dir_mode] && 0755].compact
    rescue SystemCallError
      raise unless File.directory? dir
    end

    raise Gem::FilePermissionError.new(dir) unless File.writable? dir
  end

  private

  def build_args
    @build_args ||= begin
                      require_relative "command"
                      Gem::Command.build_args
                    end
  end

  def rb_config
    RbConfig::CONFIG
  end

  def ruby_install_name
    rb_config["ruby_install_name"]
  end

  def load_relative_enabled?
    rb_config["LIBRUBY_RELATIVE"] == "yes"
  end

  def bash_prolog_script
    if load_relative_enabled?
      script = +<<~EOS
        bindir="${0%/*}"
      EOS

      script << %Q(exec "$bindir/#{ruby_install_name}" "-x" "$0" "$@"\n)

      <<~EOS
        #!/bin/sh
        # -*- ruby -*-
        _=_\\
        =begin
        #{script.chomp}
        =end
      EOS
    else
      ""
    end
  end
end
PK}$[t/w\\,rubygems/rubygems/install_default_message.rbnu�[���# frozen_string_literal: true
require_relative "../rubygems"
require_relative "user_interaction"

##
# A post-install hook that displays "Successfully installed
# some_gem-1.0 as a default gem"

Gem.post_install do |installer|
  ui = Gem::DefaultUserInteraction.ui
  ui.say "Successfully installed #{installer.spec.full_name} as a default gem"
end
PK}$[���Y�Yrubygems/rubygems/security.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require_relative "exceptions"
require_relative "openssl"

##
# = Signing gems
#
# The Gem::Security implements cryptographic signatures for gems.  The section
# below is a step-by-step guide to using signed gems and generating your own.
#
# == Walkthrough
#
# === Building your certificate
#
# In order to start signing your gems, you'll need to build a private key and
# a self-signed certificate.  Here's how:
#
#   # build a private key and certificate for yourself:
#   $ gem cert --build you@example.com
#
# This could take anywhere from a few seconds to a minute or two, depending on
# the speed of your computer (public key algorithms aren't exactly the
# speediest crypto algorithms in the world).  When it's finished, you'll see
# the files "gem-private_key.pem" and "gem-public_cert.pem" in the current
# directory.
#
# First things first: Move both files to ~/.gem if you don't already have a
# key and certificate in that directory.  Ensure the file permissions make the
# key unreadable by others (by default the file is saved securely).
#
# Keep your private key hidden; if it's compromised, someone can sign packages
# as you (note: PKI has ways of mitigating the risk of stolen keys; more on
# that later).
#
# === Signing Gems
#
# In RubyGems 2 and newer there is no extra work to sign a gem.  RubyGems will
# automatically find your key and certificate in your home directory and use
# them to sign newly packaged gems.
#
# If your certificate is not self-signed (signed by a third party) RubyGems
# will attempt to load the certificate chain from the trusted certificates.
# Use <code>gem cert --add signing_cert.pem</code> to add your signers as
# trusted certificates.  See below for further information on certificate
# chains.
#
# If you build your gem it will automatically be signed.  If you peek inside
# your gem file, you'll see a couple of new files have been added:
#
#   $ tar tf your-gem-1.0.gem
#   metadata.gz
#   metadata.gz.sig # metadata signature
#   data.tar.gz
#   data.tar.gz.sig # data signature
#   checksums.yaml.gz
#   checksums.yaml.gz.sig # checksums signature
#
# === Manually signing gems
#
# If you wish to store your key in a separate secure location you'll need to
# set your gems up for signing by hand.  To do this, set the
# <code>signing_key</code> and <code>cert_chain</code> in the gemspec before
# packaging your gem:
#
#   s.signing_key = '/secure/path/to/gem-private_key.pem'
#   s.cert_chain = %w[/secure/path/to/gem-public_cert.pem]
#
# When you package your gem with these options set RubyGems will automatically
# load your key and certificate from the secure paths.
#
# === Signed gems and security policies
#
# Now let's verify the signature.  Go ahead and install the gem, but add the
# following options: <code>-P HighSecurity</code>, like this:
#
#   # install the gem with using the security policy "HighSecurity"
#   $ sudo gem install your.gem -P HighSecurity
#
# The <code>-P</code> option sets your security policy -- we'll talk about
# that in just a minute.  Eh, what's this?
#
#   $ gem install -P HighSecurity your-gem-1.0.gem
#   ERROR:  While executing gem ... (Gem::Security::Exception)
#       root cert /CN=you/DC=example is not trusted
#
# The culprit here is the security policy.  RubyGems has several different
# security policies.  Let's take a short break and go over the security
# policies.  Here's a list of the available security policies, and a brief
# description of each one:
#
# * NoSecurity - Well, no security at all.  Signed packages are treated like
#   unsigned packages.
# * LowSecurity - Pretty much no security.  If a package is signed then
#   RubyGems will make sure the signature matches the signing
#   certificate, and that the signing certificate hasn't expired, but
#   that's it.  A malicious user could easily circumvent this kind of
#   security.
# * MediumSecurity - Better than LowSecurity and NoSecurity, but still
#   fallible.  Package contents are verified against the signing
#   certificate, and the signing certificate is checked for validity,
#   and checked against the rest of the certificate chain (if you don't
#   know what a certificate chain is, stay tuned, we'll get to that).
#   The biggest improvement over LowSecurity is that MediumSecurity
#   won't install packages that are signed by untrusted sources.
#   Unfortunately, MediumSecurity still isn't totally secure -- a
#   malicious user can still unpack the gem, strip the signatures, and
#   distribute the gem unsigned.
# * HighSecurity - Here's the bugger that got us into this mess.
#   The HighSecurity policy is identical to the MediumSecurity policy,
#   except that it does not allow unsigned gems.  A malicious user
#   doesn't have a whole lot of options here; they can't modify the
#   package contents without invalidating the signature, and they can't
#   modify or remove signature or the signing certificate chain, or
#   RubyGems will simply refuse to install the package.  Oh well, maybe
#   they'll have better luck causing problems for CPAN users instead :).
#
# The reason RubyGems refused to install your shiny new signed gem was because
# it was from an untrusted source.  Well, your code is infallible (naturally),
# so you need to add yourself as a trusted source:
#
#   # add trusted certificate
#   gem cert --add ~/.gem/gem-public_cert.pem
#
# You've now added your public certificate as a trusted source.  Now you can
# install packages signed by your private key without any hassle.  Let's try
# the install command above again:
#
#   # install the gem with using the HighSecurity policy (and this time
#   # without any shenanigans)
#   $ gem install -P HighSecurity your-gem-1.0.gem
#   Successfully installed your-gem-1.0
#   1 gem installed
#
# This time RubyGems will accept your signed package and begin installing.
#
# While you're waiting for RubyGems to work it's magic, have a look at some of
# the other security commands by running <code>gem help cert</code>:
#
#   Options:
#     -a, --add CERT                   Add a trusted certificate.
#     -l, --list [FILTER]              List trusted certificates where the
#                                      subject contains FILTER
#     -r, --remove FILTER              Remove trusted certificates where the
#                                      subject contains FILTER
#     -b, --build EMAIL_ADDR           Build private key and self-signed
#                                      certificate for EMAIL_ADDR
#     -C, --certificate CERT           Signing certificate for --sign
#     -K, --private-key KEY            Key for --sign or --build
#     -A, --key-algorithm ALGORITHM    Select key algorithm for --build from RSA, DSA, or EC. Defaults to RSA.
#     -s, --sign CERT                  Signs CERT with the key from -K
#                                      and the certificate from -C
#     -d, --days NUMBER_OF_DAYS        Days before the certificate expires
#     -R, --re-sign                    Re-signs the certificate from -C with the key from -K
#
# We've already covered the <code>--build</code> option, and the
# <code>--add</code>, <code>--list</code>, and <code>--remove</code> commands
# seem fairly straightforward; they allow you to add, list, and remove the
# certificates in your trusted certificate list.  But what's with this
# <code>--sign</code> option?
#
# === Certificate chains
#
# To answer that question, let's take a look at "certificate chains", a
# concept I mentioned earlier.  There are a couple of problems with
# self-signed certificates: first of all, self-signed certificates don't offer
# a whole lot of security.  Sure, the certificate says Yukihiro Matsumoto, but
# how do I know it was actually generated and signed by matz himself unless he
# gave me the certificate in person?
#
# The second problem is scalability.  Sure, if there are 50 gem authors, then
# I have 50 trusted certificates, no problem.  What if there are 500 gem
# authors?  1000?  Having to constantly add new trusted certificates is a
# pain, and it actually makes the trust system less secure by encouraging
# RubyGems users to blindly trust new certificates.
#
# Here's where certificate chains come in.  A certificate chain establishes an
# arbitrarily long chain of trust between an issuing certificate and a child
# certificate.  So instead of trusting certificates on a per-developer basis,
# we use the PKI concept of certificate chains to build a logical hierarchy of
# trust.  Here's a hypothetical example of a trust hierarchy based (roughly)
# on geography:
#
#                         --------------------------
#                         | rubygems@rubygems.org |
#                         --------------------------
#                                     |
#                   -----------------------------------
#                   |                                 |
#       ----------------------------    -----------------------------
#       |  seattlerb@seattlerb.org |    | dcrubyists@richkilmer.com |
#       ----------------------------    -----------------------------
#            |                |                 |             |
#     ---------------   ----------------   -----------   --------------
#     |   drbrain   |   |   zenspider  |   | pabs@dc |   | tomcope@dc |
#     ---------------   ----------------   -----------   --------------
#
#
# Now, rather than having 4 trusted certificates (one for drbrain, zenspider,
# pabs@dc, and tomecope@dc), a user could actually get by with one
# certificate, the "rubygems@rubygems.org" certificate.
#
# Here's how it works:
#
# I install "rdoc-3.12.gem", a package signed by "drbrain".  I've never heard
# of "drbrain", but his certificate has a valid signature from the
# "seattle.rb@seattlerb.org" certificate, which in turn has a valid signature
# from the "rubygems@rubygems.org" certificate.  Voila!  At this point, it's
# much more reasonable for me to trust a package signed by "drbrain", because
# I can establish a chain to "rubygems@rubygems.org", which I do trust.
#
# === Signing certificates
#
# The <code>--sign</code> option allows all this to happen.  A developer
# creates their build certificate with the <code>--build</code> option, then
# has their certificate signed by taking it with them to their next regional
# Ruby meetup (in our hypothetical example), and it's signed there by the
# person holding the regional RubyGems signing certificate, which is signed at
# the next RubyConf by the holder of the top-level RubyGems certificate.  At
# each point the issuer runs the same command:
#
#   # sign a certificate with the specified key and certificate
#   # (note that this modifies client_cert.pem!)
#   $ gem cert -K /mnt/floppy/issuer-priv_key.pem -C issuer-pub_cert.pem
#      --sign client_cert.pem
#
# Then the holder of issued certificate (in this case, your buddy "drbrain"),
# can start using this signed certificate to sign RubyGems.  By the way, in
# order to let everyone else know about his new fancy signed certificate,
# "drbrain" would save his newly signed certificate as
# <code>~/.gem/gem-public_cert.pem</code>
#
# Obviously this RubyGems trust infrastructure doesn't exist yet.  Also, in
# the "real world", issuers actually generate the child certificate from a
# certificate request, rather than sign an existing certificate.  And our
# hypothetical infrastructure is missing a certificate revocation system.
# These are that can be fixed in the future...
#
# At this point you should know how to do all of these new and interesting
# things:
#
# * build a gem signing key and certificate
# * adjust your security policy
# * modify your trusted certificate list
# * sign a certificate
#
# == Manually verifying signatures
#
# In case you don't trust RubyGems you can verify gem signatures manually:
#
# 1. Fetch and unpack the gem
#
#      gem fetch some_signed_gem
#      tar -xf some_signed_gem-1.0.gem
#
# 2. Grab the public key from the gemspec
#
#      gem spec some_signed_gem-1.0.gem cert_chain | \
#        ruby -rpsych -e 'puts Psych.load($stdin)' > public_key.crt
#
# 3. Generate a SHA1 hash of the data.tar.gz
#
#      openssl dgst -sha1 < data.tar.gz > my.hash
#
# 4. Verify the signature
#
#      openssl rsautl -verify -inkey public_key.crt -certin \
#        -in data.tar.gz.sig > verified.hash
#
# 5. Compare your hash to the verified hash
#
#      diff -s verified.hash my.hash
#
# 6. Repeat 5 and 6 with metadata.gz
#
# == OpenSSL Reference
#
# The .pem files generated by --build and --sign are PEM files.  Here's a
# couple of useful OpenSSL commands for manipulating them:
#
#   # convert a PEM format X509 certificate into DER format:
#   # (note: Windows .cer files are X509 certificates in DER format)
#   $ openssl x509 -in input.pem -outform der -out output.der
#
#   # print out the certificate in a human-readable format:
#   $ openssl x509 -in input.pem -noout -text
#
# And you can do the same thing with the private key file as well:
#
#   # convert a PEM format RSA key into DER format:
#   $ openssl rsa -in input_key.pem -outform der -out output_key.der
#
#   # print out the key in a human readable format:
#   $ openssl rsa -in input_key.pem -noout -text
#
# == Bugs/TODO
#
# * There's no way to define a system-wide trust list.
# * custom security policies (from a YAML file, etc)
# * Simple method to generate a signed certificate request
# * Support for OCSP, SCVP, CRLs, or some other form of cert status check
#   (list is in order of preference)
# * Support for encrypted private keys
# * Some sort of semi-formal trust hierarchy (see long-winded explanation
#   above)
# * Path discovery (for gem certificate chains that don't have a self-signed
#   root) -- by the way, since we don't have this, THE ROOT OF THE CERTIFICATE
#   CHAIN MUST BE SELF SIGNED if Policy#verify_root is true (and it is for the
#   MediumSecurity and HighSecurity policies)
# * Better explanation of X509 naming (ie, we don't have to use email
#   addresses)
# * Honor AIA field (see note about OCSP above)
# * Honor extension restrictions
# * Might be better to store the certificate chain as a PKCS#7 or PKCS#12
#   file, instead of an array embedded in the metadata.
#
# == Original author
#
# Paul Duncan <pabs@pablotron.org>
# http://pablotron.org/

module Gem::Security

  ##
  # Gem::Security default exception type

  class Exception < Gem::Exception; end

  ##
  # Used internally to select the signing digest from all computed digests

  DIGEST_NAME = "SHA256" # :nodoc:

  ##
  # Length of keys created by RSA and DSA keys

  RSA_DSA_KEY_LENGTH = 3072

  ##
  # Default algorithm to use when building a key pair

  DEFAULT_KEY_ALGORITHM = "RSA"

  ##
  # Named curve used for Elliptic Curve

  EC_NAME = "secp384r1"

  ##
  # Cipher used to encrypt the key pair used to sign gems.
  # Must be in the list returned by OpenSSL::Cipher.ciphers

  KEY_CIPHER = OpenSSL::Cipher.new("AES-256-CBC") if defined?(OpenSSL::Cipher)

  ##
  # One day in seconds

  ONE_DAY = 86400

  ##
  # One year in seconds

  ONE_YEAR = ONE_DAY * 365

  ##
  # The default set of extensions are:
  #
  # * The certificate is not a certificate authority
  # * The key for the certificate may be used for key and data encipherment
  #   and digital signatures
  # * The certificate contains a subject key identifier

  EXTENSIONS = {
    "basicConstraints"     => "CA:FALSE",
    "keyUsage"             =>
      "keyEncipherment,dataEncipherment,digitalSignature",
    "subjectKeyIdentifier" => "hash",
  }.freeze

  def self.alt_name_or_x509_entry(certificate, x509_entry)
    alt_name = certificate.extensions.find do |extension|
      extension.oid == "#{x509_entry}AltName"
    end

    return alt_name.value if alt_name

    certificate.send x509_entry
  end

  ##
  # Creates an unsigned certificate for +subject+ and +key+.  The lifetime of
  # the key is from the current time to +age+ which defaults to one year.
  #
  # The +extensions+ restrict the key to the indicated uses.

  def self.create_cert(subject, key, age = ONE_YEAR, extensions = EXTENSIONS,
                       serial = 1)
    cert = OpenSSL::X509::Certificate.new

    cert.public_key = get_public_key(key)
    cert.version    = 2
    cert.serial     = serial

    cert.not_before = Time.now
    cert.not_after  = Time.now + age

    cert.subject    = subject

    ef = OpenSSL::X509::ExtensionFactory.new nil, cert

    cert.extensions = extensions.map do |ext_name, value|
      ef.create_extension ext_name, value
    end

    cert
  end

  ##
  # Gets the right public key from a PKey instance

  def self.get_public_key(key)
    # Ruby 3.0 (Ruby/OpenSSL 2.2) or later
    return OpenSSL::PKey.read(key.public_to_der) if key.respond_to?(:public_to_der)
    return key.public_key unless key.is_a?(OpenSSL::PKey::EC)

    ec_key = OpenSSL::PKey::EC.new(key.group.curve_name)
    ec_key.public_key = key.public_key
    ec_key
  end

  ##
  # In Ruby 2.3 EC doesn't implement the private_key? but not the private? method

  if defined?(OpenSSL::PKey::EC) && Gem::Version.new(String.new(RUBY_VERSION)) < Gem::Version.new("2.4.0")
    OpenSSL::PKey::EC.send(:alias_method, :private?, :private_key?)
  end

  ##
  # Creates a self-signed certificate with an issuer and subject from +email+,
  # a subject alternative name of +email+ and the given +extensions+ for the
  # +key+.

  def self.create_cert_email(email, key, age = ONE_YEAR, extensions = EXTENSIONS)
    subject = email_to_name email

    extensions = extensions.merge "subjectAltName" => "email:#{email}"

    create_cert_self_signed subject, key, age, extensions
  end

  ##
  # Creates a self-signed certificate with an issuer and subject of +subject+
  # and the given +extensions+ for the +key+.

  def self.create_cert_self_signed(subject, key, age = ONE_YEAR,
                                   extensions = EXTENSIONS, serial = 1)
    certificate = create_cert subject, key, age, extensions

    sign certificate, key, certificate, age, extensions, serial
  end

  ##
  # Creates a new digest instance using the specified +algorithm+. The default
  # is SHA256.

  if defined?(OpenSSL::Digest)
    def self.create_digest(algorithm = DIGEST_NAME)
      OpenSSL::Digest.new(algorithm)
    end
  else
    require "digest"

    def self.create_digest(algorithm = DIGEST_NAME)
      Digest.const_get(algorithm).new
    end
  end

  ##
  # Creates a new key pair of the specified +algorithm+. RSA, DSA, and EC
  # are supported.

  def self.create_key(algorithm)
    if defined?(OpenSSL::PKey)
      case algorithm.downcase
      when "dsa"
        OpenSSL::PKey::DSA.new(RSA_DSA_KEY_LENGTH)
      when "rsa"
        OpenSSL::PKey::RSA.new(RSA_DSA_KEY_LENGTH)
      when "ec"
        if RUBY_VERSION >= "2.4.0"
          OpenSSL::PKey::EC.generate(EC_NAME)
        else
          domain_key = OpenSSL::PKey::EC.new(EC_NAME)
          domain_key.generate_key
          domain_key
        end
      else
        raise Gem::Security::Exception,
        "#{algorithm} algorithm not found. RSA, DSA, and EC algorithms are supported."
      end
    end
  end

  ##
  # Turns +email_address+ into an OpenSSL::X509::Name

  def self.email_to_name(email_address)
    email_address = email_address.gsub(/[^\w@.-]+/i, "_")

    cn, dcs = email_address.split "@"

    dcs = dcs.split "."

    OpenSSL::X509::Name.new([
      ["CN", cn],
      *dcs.map {|dc| ["DC", dc] },
    ])
  end

  ##
  # Signs +expired_certificate+ with +private_key+ if the keys match and the
  # expired certificate was self-signed.
  #--
  # TODO increment serial

  def self.re_sign(expired_certificate, private_key, age = ONE_YEAR,
                   extensions = EXTENSIONS)
    raise Gem::Security::Exception,
          "incorrect signing key for re-signing " +
          "#{expired_certificate.subject}" unless
      expired_certificate.check_private_key(private_key)

    unless expired_certificate.subject.to_s ==
           expired_certificate.issuer.to_s
      subject = alt_name_or_x509_entry expired_certificate, :subject
      issuer  = alt_name_or_x509_entry expired_certificate, :issuer

      raise Gem::Security::Exception,
            "#{subject} is not self-signed, contact #{issuer} " +
            "to obtain a valid certificate"
    end

    serial = expired_certificate.serial + 1

    create_cert_self_signed(expired_certificate.subject, private_key, age,
                            extensions, serial)
  end

  ##
  # Resets the trust directory for verifying gems.

  def self.reset
    @trust_dir = nil
  end

  ##
  # Sign the public key from +certificate+ with the +signing_key+ and
  # +signing_cert+, using the Gem::Security::DIGEST_NAME.  Uses the
  # default certificate validity range and extensions.
  #
  # Returns the newly signed certificate.

  def self.sign(certificate, signing_key, signing_cert,
                age = ONE_YEAR, extensions = EXTENSIONS, serial = 1)
    signee_subject = certificate.subject
    signee_key     = certificate.public_key

    alt_name = certificate.extensions.find do |extension|
      extension.oid == "subjectAltName"
    end

    extensions = extensions.merge "subjectAltName" => alt_name.value if
      alt_name

    issuer_alt_name = signing_cert.extensions.find do |extension|
      extension.oid == "subjectAltName"
    end

    extensions = extensions.merge "issuerAltName" => issuer_alt_name.value if
      issuer_alt_name

    signed = create_cert signee_subject, signee_key, age, extensions, serial
    signed.issuer = signing_cert.subject

    signed.sign signing_key, Gem::Security::DIGEST_NAME
  end

  ##
  # Returns a Gem::Security::TrustDir which wraps the directory where trusted
  # certificates live.

  def self.trust_dir
    return @trust_dir if @trust_dir

    dir = File.join Gem.user_home, ".gem", "trust"

    @trust_dir ||= Gem::Security::TrustDir.new dir
  end

  ##
  # Enumerates the trusted certificates via Gem::Security::TrustDir.

  def self.trusted_certificates(&block)
    trust_dir.each_certificate(&block)
  end

  ##
  # Writes +pemmable+, which must respond to +to_pem+ to +path+ with the given
  # +permissions+. If passed +cipher+ and +passphrase+ those arguments will be
  # passed to +to_pem+.

  def self.write(pemmable, path, permissions = 0600, passphrase = nil, cipher = KEY_CIPHER)
    path = File.expand_path path

    File.open path, "wb", permissions do |io|
      if passphrase && cipher
        io.write pemmable.to_pem cipher, passphrase
      else
        io.write pemmable.to_pem
      end
    end

    path
  end

  reset

end

if Gem::HAVE_OPENSSL
  require_relative "security/policy"
  require_relative "security/policies"
  require_relative "security/trust_dir"
end

require_relative "security/signer"
PK}$[T.�0�<�<$rubygems/rubygems/tsort/lib/tsort.rbnu�[���# frozen_string_literal: true

#--
# tsort.rb - provides a module for topological sorting and strongly connected components.
#++
#

#
# Gem::TSort implements topological sorting using Tarjan's algorithm for
# strongly connected components.
#
# Gem::TSort is designed to be able to be used with any object which can be
# interpreted as a directed graph.
#
# Gem::TSort requires two methods to interpret an object as a graph,
# tsort_each_node and tsort_each_child.
#
# * tsort_each_node is used to iterate for all nodes over a graph.
# * tsort_each_child is used to iterate for child nodes of a given node.
#
# The equality of nodes are defined by eql? and hash since
# Gem::TSort uses Hash internally.
#
# == A Simple Example
#
# The following example demonstrates how to mix the Gem::TSort module into an
# existing class (in this case, Hash). Here, we're treating each key in
# the hash as a node in the graph, and so we simply alias the required
# #tsort_each_node method to Hash's #each_key method. For each key in the
# hash, the associated value is an array of the node's child nodes. This
# choice in turn leads to our implementation of the required #tsort_each_child
# method, which fetches the array of child nodes and then iterates over that
# array using the user-supplied block.
#
#   require 'rubygems/tsort/lib/tsort'
#
#   class Hash
#     include Gem::TSort
#     alias tsort_each_node each_key
#     def tsort_each_child(node, &block)
#       fetch(node).each(&block)
#     end
#   end
#
#   {1=>[2, 3], 2=>[3], 3=>[], 4=>[]}.tsort
#   #=> [3, 2, 1, 4]
#
#   {1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}.strongly_connected_components
#   #=> [[4], [2, 3], [1]]
#
# == A More Realistic Example
#
# A very simple `make' like tool can be implemented as follows:
#
#   require 'rubygems/tsort/lib/tsort'
#
#   class Make
#     def initialize
#       @dep = {}
#       @dep.default = []
#     end
#
#     def rule(outputs, inputs=[], &block)
#       triple = [outputs, inputs, block]
#       outputs.each {|f| @dep[f] = [triple]}
#       @dep[triple] = inputs
#     end
#
#     def build(target)
#       each_strongly_connected_component_from(target) {|ns|
#         if ns.length != 1
#           fs = ns.delete_if {|n| Array === n}
#           raise Gem::TSort::Cyclic.new("cyclic dependencies: #{fs.join ', '}")
#         end
#         n = ns.first
#         if Array === n
#           outputs, inputs, block = n
#           inputs_time = inputs.map {|f| File.mtime f}.max
#           begin
#             outputs_time = outputs.map {|f| File.mtime f}.min
#           rescue Errno::ENOENT
#             outputs_time = nil
#           end
#           if outputs_time == nil ||
#              inputs_time != nil && outputs_time <= inputs_time
#             sleep 1 if inputs_time != nil && inputs_time.to_i == Time.now.to_i
#             block.call
#           end
#         end
#       }
#     end
#
#     def tsort_each_child(node, &block)
#       @dep[node].each(&block)
#     end
#     include Gem::TSort
#   end
#
#   def command(arg)
#     print arg, "\n"
#     system arg
#   end
#
#   m = Make.new
#   m.rule(%w[t1]) { command 'date > t1' }
#   m.rule(%w[t2]) { command 'date > t2' }
#   m.rule(%w[t3]) { command 'date > t3' }
#   m.rule(%w[t4], %w[t1 t3]) { command 'cat t1 t3 > t4' }
#   m.rule(%w[t5], %w[t4 t2]) { command 'cat t4 t2 > t5' }
#   m.build('t5')
#
# == Bugs
#
# * 'tsort.rb' is wrong name because this library uses
#   Tarjan's algorithm for strongly connected components.
#   Although 'strongly_connected_components.rb' is correct but too long.
#
# == References
#
# R. E. Tarjan, "Depth First Search and Linear Graph Algorithms",
# <em>SIAM Journal on Computing</em>, Vol. 1, No. 2, pp. 146-160, June 1972.
#

module Gem
  module TSort
    class Cyclic < StandardError
    end

    # Returns a topologically sorted array of nodes.
    # The array is sorted from children to parents, i.e.
    # the first element has no child and the last node has no parent.
    #
    # If there is a cycle, Gem::TSort::Cyclic is raised.
    #
    #   class G
    #     include Gem::TSort
    #     def initialize(g)
    #       @g = g
    #     end
    #     def tsort_each_child(n, &b) @g[n].each(&b) end
    #     def tsort_each_node(&b) @g.each_key(&b) end
    #   end
    #
    #   graph = G.new({1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]})
    #   p graph.tsort #=> [4, 2, 3, 1]
    #
    #   graph = G.new({1=>[2], 2=>[3, 4], 3=>[2], 4=>[]})
    #   p graph.tsort # raises Gem::TSort::Cyclic
    #
    def tsort
      each_node = method(:tsort_each_node)
      each_child = method(:tsort_each_child)
      Gem::TSort.tsort(each_node, each_child)
    end

    # Returns a topologically sorted array of nodes.
    # The array is sorted from children to parents, i.e.
    # the first element has no child and the last node has no parent.
    #
    # The graph is represented by _each_node_ and _each_child_.
    # _each_node_ should have +call+ method which yields for each node in the graph.
    # _each_child_ should have +call+ method which takes a node argument and yields for each child node.
    #
    # If there is a cycle, Gem::TSort::Cyclic is raised.
    #
    #   g = {1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]}
    #   each_node = lambda {|&b| g.each_key(&b) }
    #   each_child = lambda {|n, &b| g[n].each(&b) }
    #   p Gem::TSort.tsort(each_node, each_child) #=> [4, 2, 3, 1]
    #
    #   g = {1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}
    #   each_node = lambda {|&b| g.each_key(&b) }
    #   each_child = lambda {|n, &b| g[n].each(&b) }
    #   p Gem::TSort.tsort(each_node, each_child) # raises Gem::TSort::Cyclic
    #
    def TSort.tsort(each_node, each_child)
      Gem::TSort.tsort_each(each_node, each_child).to_a
    end

    # The iterator version of the #tsort method.
    # <tt><em>obj</em>.tsort_each</tt> is similar to <tt><em>obj</em>.tsort.each</tt>, but
    # modification of _obj_ during the iteration may lead to unexpected results.
    #
    # #tsort_each returns +nil+.
    # If there is a cycle, Gem::TSort::Cyclic is raised.
    #
    #   class G
    #     include Gem::TSort
    #     def initialize(g)
    #       @g = g
    #     end
    #     def tsort_each_child(n, &b) @g[n].each(&b) end
    #     def tsort_each_node(&b) @g.each_key(&b) end
    #   end
    #
    #   graph = G.new({1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]})
    #   graph.tsort_each {|n| p n }
    #   #=> 4
    #   #   2
    #   #   3
    #   #   1
    #
    def tsort_each(&block) # :yields: node
      each_node = method(:tsort_each_node)
      each_child = method(:tsort_each_child)
      Gem::TSort.tsort_each(each_node, each_child, &block)
    end

    # The iterator version of the Gem::TSort.tsort method.
    #
    # The graph is represented by _each_node_ and _each_child_.
    # _each_node_ should have +call+ method which yields for each node in the graph.
    # _each_child_ should have +call+ method which takes a node argument and yields for each child node.
    #
    #   g = {1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]}
    #   each_node = lambda {|&b| g.each_key(&b) }
    #   each_child = lambda {|n, &b| g[n].each(&b) }
    #   Gem::TSort.tsort_each(each_node, each_child) {|n| p n }
    #   #=> 4
    #   #   2
    #   #   3
    #   #   1
    #
    def TSort.tsort_each(each_node, each_child) # :yields: node
      return to_enum(__method__, each_node, each_child) unless block_given?

      Gem::TSort.each_strongly_connected_component(each_node, each_child) {|component|
        if component.size == 1
          yield component.first
        else
          raise Cyclic.new("topological sort failed: #{component.inspect}")
        end
      }
    end

    # Returns strongly connected components as an array of arrays of nodes.
    # The array is sorted from children to parents.
    # Each elements of the array represents a strongly connected component.
    #
    #   class G
    #     include Gem::TSort
    #     def initialize(g)
    #       @g = g
    #     end
    #     def tsort_each_child(n, &b) @g[n].each(&b) end
    #     def tsort_each_node(&b) @g.each_key(&b) end
    #   end
    #
    #   graph = G.new({1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]})
    #   p graph.strongly_connected_components #=> [[4], [2], [3], [1]]
    #
    #   graph = G.new({1=>[2], 2=>[3, 4], 3=>[2], 4=>[]})
    #   p graph.strongly_connected_components #=> [[4], [2, 3], [1]]
    #
    def strongly_connected_components
      each_node = method(:tsort_each_node)
      each_child = method(:tsort_each_child)
      Gem::TSort.strongly_connected_components(each_node, each_child)
    end

    # Returns strongly connected components as an array of arrays of nodes.
    # The array is sorted from children to parents.
    # Each elements of the array represents a strongly connected component.
    #
    # The graph is represented by _each_node_ and _each_child_.
    # _each_node_ should have +call+ method which yields for each node in the graph.
    # _each_child_ should have +call+ method which takes a node argument and yields for each child node.
    #
    #   g = {1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]}
    #   each_node = lambda {|&b| g.each_key(&b) }
    #   each_child = lambda {|n, &b| g[n].each(&b) }
    #   p Gem::TSort.strongly_connected_components(each_node, each_child)
    #   #=> [[4], [2], [3], [1]]
    #
    #   g = {1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}
    #   each_node = lambda {|&b| g.each_key(&b) }
    #   each_child = lambda {|n, &b| g[n].each(&b) }
    #   p Gem::TSort.strongly_connected_components(each_node, each_child)
    #   #=> [[4], [2, 3], [1]]
    #
    def TSort.strongly_connected_components(each_node, each_child)
      Gem::TSort.each_strongly_connected_component(each_node, each_child).to_a
    end

    # The iterator version of the #strongly_connected_components method.
    # <tt><em>obj</em>.each_strongly_connected_component</tt> is similar to
    # <tt><em>obj</em>.strongly_connected_components.each</tt>, but
    # modification of _obj_ during the iteration may lead to unexpected results.
    #
    # #each_strongly_connected_component returns +nil+.
    #
    #   class G
    #     include Gem::TSort
    #     def initialize(g)
    #       @g = g
    #     end
    #     def tsort_each_child(n, &b) @g[n].each(&b) end
    #     def tsort_each_node(&b) @g.each_key(&b) end
    #   end
    #
    #   graph = G.new({1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]})
    #   graph.each_strongly_connected_component {|scc| p scc }
    #   #=> [4]
    #   #   [2]
    #   #   [3]
    #   #   [1]
    #
    #   graph = G.new({1=>[2], 2=>[3, 4], 3=>[2], 4=>[]})
    #   graph.each_strongly_connected_component {|scc| p scc }
    #   #=> [4]
    #   #   [2, 3]
    #   #   [1]
    #
    def each_strongly_connected_component(&block) # :yields: nodes
      each_node = method(:tsort_each_node)
      each_child = method(:tsort_each_child)
      Gem::TSort.each_strongly_connected_component(each_node, each_child, &block)
    end

    # The iterator version of the Gem::TSort.strongly_connected_components method.
    #
    # The graph is represented by _each_node_ and _each_child_.
    # _each_node_ should have +call+ method which yields for each node in the graph.
    # _each_child_ should have +call+ method which takes a node argument and yields for each child node.
    #
    #   g = {1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]}
    #   each_node = lambda {|&b| g.each_key(&b) }
    #   each_child = lambda {|n, &b| g[n].each(&b) }
    #   Gem::TSort.each_strongly_connected_component(each_node, each_child) {|scc| p scc }
    #   #=> [4]
    #   #   [2]
    #   #   [3]
    #   #   [1]
    #
    #   g = {1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}
    #   each_node = lambda {|&b| g.each_key(&b) }
    #   each_child = lambda {|n, &b| g[n].each(&b) }
    #   Gem::TSort.each_strongly_connected_component(each_node, each_child) {|scc| p scc }
    #   #=> [4]
    #   #   [2, 3]
    #   #   [1]
    #
    def TSort.each_strongly_connected_component(each_node, each_child) # :yields: nodes
      return to_enum(__method__, each_node, each_child) unless block_given?

      id_map = {}
      stack = []
      each_node.call {|node|
        unless id_map.include? node
          Gem::TSort.each_strongly_connected_component_from(node, each_child, id_map, stack) {|c|
            yield c
          }
        end
      }
      nil
    end

    # Iterates over strongly connected component in the subgraph reachable from
    # _node_.
    #
    # Return value is unspecified.
    #
    # #each_strongly_connected_component_from doesn't call #tsort_each_node.
    #
    #   class G
    #     include Gem::TSort
    #     def initialize(g)
    #       @g = g
    #     end
    #     def tsort_each_child(n, &b) @g[n].each(&b) end
    #     def tsort_each_node(&b) @g.each_key(&b) end
    #   end
    #
    #   graph = G.new({1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]})
    #   graph.each_strongly_connected_component_from(2) {|scc| p scc }
    #   #=> [4]
    #   #   [2]
    #
    #   graph = G.new({1=>[2], 2=>[3, 4], 3=>[2], 4=>[]})
    #   graph.each_strongly_connected_component_from(2) {|scc| p scc }
    #   #=> [4]
    #   #   [2, 3]
    #
    def each_strongly_connected_component_from(node, id_map={}, stack=[], &block) # :yields: nodes
      Gem::TSort.each_strongly_connected_component_from(node, method(:tsort_each_child), id_map, stack, &block)
    end

    # Iterates over strongly connected components in a graph.
    # The graph is represented by _node_ and _each_child_.
    #
    # _node_ is the first node.
    # _each_child_ should have +call+ method which takes a node argument
    # and yields for each child node.
    #
    # Return value is unspecified.
    #
    # #Gem::TSort.each_strongly_connected_component_from is a class method and
    # it doesn't need a class to represent a graph which includes Gem::TSort.
    #
    #   graph = {1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}
    #   each_child = lambda {|n, &b| graph[n].each(&b) }
    #   Gem::TSort.each_strongly_connected_component_from(1, each_child) {|scc|
    #     p scc
    #   }
    #   #=> [4]
    #   #   [2, 3]
    #   #   [1]
    #
    def TSort.each_strongly_connected_component_from(node, each_child, id_map={}, stack=[]) # :yields: nodes
      return to_enum(__method__, node, each_child, id_map, stack) unless block_given?

      minimum_id = node_id = id_map[node] = id_map.size
      stack_length = stack.length
      stack << node

      each_child.call(node) {|child|
        if id_map.include? child
          child_id = id_map[child]
          minimum_id = child_id if child_id && child_id < minimum_id
        else
          sub_minimum_id =
            Gem::TSort.each_strongly_connected_component_from(child, each_child, id_map, stack) {|c|
              yield c
            }
          minimum_id = sub_minimum_id if sub_minimum_id < minimum_id
        end
      }

      if node_id == minimum_id
        component = stack.slice!(stack_length .. -1)
        component.each {|n| id_map[n] = nil}
        yield component
      end

      minimum_id
    end

    # Should be implemented by a extended class.
    #
    # #tsort_each_node is used to iterate for all nodes over a graph.
    #
    def tsort_each_node # :yields: node
      raise NotImplementedError.new
    end

    # Should be implemented by a extended class.
    #
    # #tsort_each_child is used to iterate for child nodes of _node_.
    #
    def tsort_each_child(node) # :yields: child
      raise NotImplementedError.new
    end
  end
end
PK}$[w�Ԓ��'rubygems/rubygems/stub_specification.rbnu�[���# frozen_string_literal: true
##
# Gem::StubSpecification reads the stub: line from the gemspec.  This prevents
# us having to eval the entire gemspec in order to find out certain
# information.

class Gem::StubSpecification < Gem::BasicSpecification
  # :nodoc:
  PREFIX = "# stub: ".freeze

  # :nodoc:
  OPEN_MODE = "r:UTF-8:-".freeze

  class StubLine # :nodoc: all
    attr_reader :name, :version, :platform, :require_paths, :extensions,
                :full_name

    NO_EXTENSIONS = [].freeze

    # These are common require paths.
    REQUIRE_PATHS = { # :nodoc:
      "lib"  => "lib".freeze,
      "test" => "test".freeze,
      "ext"  => "ext".freeze,
    }.freeze

    # These are common require path lists.  This hash is used to optimize
    # and consolidate require_path objects.  Most specs just specify "lib"
    # in their require paths, so lets take advantage of that by pre-allocating
    # a require path list for that case.
    REQUIRE_PATH_LIST = { # :nodoc:
      "lib" => ["lib"].freeze,
    }.freeze

    def initialize(data, extensions)
      parts          = data[PREFIX.length..-1].split(" ".freeze, 4)
      @name          = parts[0].freeze
      @version       = if Gem::Version.correct?(parts[1])
        Gem::Version.new(parts[1])
      else
        Gem::Version.new(0)
      end

      @platform      = Gem::Platform.new parts[2]
      @extensions    = extensions
      @full_name     = if platform == Gem::Platform::RUBY
        "#{name}-#{version}"
      else
        "#{name}-#{version}-#{platform}"
      end

      path_list = parts.last
      @require_paths = REQUIRE_PATH_LIST[path_list] || path_list.split("\0".freeze).map! do |x|
        REQUIRE_PATHS[x] || x
      end
    end
  end

  def self.default_gemspec_stub(filename, base_dir, gems_dir)
    new filename, base_dir, gems_dir, true
  end

  def self.gemspec_stub(filename, base_dir, gems_dir)
    new filename, base_dir, gems_dir, false
  end

  attr_reader :base_dir, :gems_dir

  def initialize(filename, base_dir, gems_dir, default_gem)
    super()
    filename.tap(&Gem::UNTAINT)

    self.loaded_from = filename
    @data            = nil
    @name            = nil
    @spec            = nil
    @base_dir        = base_dir
    @gems_dir        = gems_dir
    @default_gem     = default_gem
  end

  ##
  # True when this gem has been activated

  def activated?
    @activated ||=
    begin
      loaded = Gem.loaded_specs[name]
      loaded && loaded.version == version
    end
  end

  def default_gem?
    @default_gem
  end

  def build_extensions # :nodoc:
    return if default_gem?
    return if extensions.empty?

    to_spec.build_extensions
  end

  ##
  # If the gemspec contains a stubline, returns a StubLine instance. Otherwise
  # returns the full Gem::Specification.

  def data
    unless @data
      begin
        saved_lineno = $.

        Gem.open_file loaded_from, OPEN_MODE do |file|
          begin
            file.readline # discard encoding line
            stubline = file.readline.chomp
            if stubline.start_with?(PREFIX)
              extensions = if /\A#{PREFIX}/ =~ file.readline.chomp
                $'.split "\0"
              else
                StubLine::NO_EXTENSIONS
              end

              @data = StubLine.new stubline, extensions
            end
          rescue EOFError
          end
        end
      ensure
        $. = saved_lineno
      end
    end

    @data ||= to_spec
  end

  private :data

  def raw_require_paths # :nodoc:
    data.require_paths
  end

  def missing_extensions?
    return false if default_gem?
    return false if extensions.empty?
    return false if File.exist? gem_build_complete_path

    to_spec.missing_extensions?
  end

  ##
  # Name of the gem

  def name
    data.name
  end

  ##
  # Platform of the gem

  def platform
    data.platform
  end

  ##
  # Extensions for this gem

  def extensions
    data.extensions
  end

  ##
  # Version of the gem

  def version
    data.version
  end

  def full_name
    data.full_name
  end

  ##
  # The full Gem::Specification for this gem, loaded from evalling its gemspec

  def to_spec
    @spec ||= if @data
      loaded = Gem.loaded_specs[name]
      loaded if loaded && loaded.version == version
    end

    @spec ||= Gem::Specification.load(loaded_from)
  end

  ##
  # Is this StubSpecification valid? i.e. have we found a stub line, OR does
  # the filename contain a valid gemspec?

  def valid?
    data
  end

  ##
  # Is there a stub line present for this StubSpecification?

  def stubbed?
    data.is_a? StubLine
  end
end
PK}$[��44"rubygems/rubygems/specification.rbnu�[���# frozen_string_literal: true
#
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require_relative "deprecate"
require_relative "basic_specification"
require_relative "stub_specification"
require_relative "platform"
require_relative "util/list"

##
# The Specification class contains the information for a gem.  Typically
# defined in a .gemspec file or a Rakefile, and looks like this:
#
#   Gem::Specification.new do |s|
#     s.name        = 'example'
#     s.version     = '0.1.0'
#     s.licenses    = ['MIT']
#     s.summary     = "This is an example!"
#     s.description = "Much longer explanation of the example!"
#     s.authors     = ["Ruby Coder"]
#     s.email       = 'rubycoder@example.com'
#     s.files       = ["lib/example.rb"]
#     s.homepage    = 'https://rubygems.org/gems/example'
#     s.metadata    = { "source_code_uri" => "https://github.com/example/example" }
#   end
#
# Starting in RubyGems 2.0, a Specification can hold arbitrary
# metadata.  See #metadata for restrictions on the format and size of metadata
# items you may add to a specification.

class Gem::Specification < Gem::BasicSpecification
  extend Gem::Deprecate

  # REFACTOR: Consider breaking out this version stuff into a separate
  # module. There's enough special stuff around it that it may justify
  # a separate class.

  ##
  # The version number of a specification that does not specify one
  # (i.e. RubyGems 0.7 or earlier).

  NONEXISTENT_SPECIFICATION_VERSION = -1

  ##
  # The specification version applied to any new Specification instances
  # created.  This should be bumped whenever something in the spec format
  # changes.
  #
  # Specification Version History:
  #
  #   spec   ruby
  #    ver    ver yyyy-mm-dd description
  #     -1 <0.8.0            pre-spec-version-history
  #      1  0.8.0 2004-08-01 Deprecated "test_suite_file" for "test_files"
  #                          "test_file=x" is a shortcut for "test_files=[x]"
  #      2  0.9.5 2007-10-01 Added "required_rubygems_version"
  #                          Now forward-compatible with future versions
  #      3  1.3.2 2009-01-03 Added Fixnum validation to specification_version
  #      4  1.9.0 2011-06-07 Added metadata
  #--
  # When updating this number, be sure to also update #to_ruby.
  #
  # NOTE RubyGems < 1.2 cannot load specification versions > 2.

  CURRENT_SPECIFICATION_VERSION = 4 # :nodoc:

  ##
  # An informal list of changes to the specification.  The highest-valued
  # key should be equal to the CURRENT_SPECIFICATION_VERSION.

  SPECIFICATION_VERSION_HISTORY = { # :nodoc:
    -1 => ["(RubyGems versions up to and including 0.7 did not have versioned specifications)"],
    1  => [
      'Deprecated "test_suite_file" in favor of the new, but equivalent, "test_files"',
      '"test_file=x" is a shortcut for "test_files=[x]"',
    ],
    2 => [
      'Added "required_rubygems_version"',
      "Now forward-compatible with future versions",
    ],
    3 => [
      "Added Fixnum validation to the specification_version",
    ],
    4 => [
      "Added sandboxed freeform metadata to the specification version.",
    ],
  }.freeze

  MARSHAL_FIELDS = { # :nodoc:
    -1 => 16,
     1 => 16,
     2 => 16,
     3 => 17,
     4 => 18,
  }.freeze

  today = Time.now.utc
  TODAY = Time.utc(today.year, today.month, today.day) # :nodoc:

  @load_cache = {} # :nodoc:
  @load_cache_mutex = Thread::Mutex.new

  VALID_NAME_PATTERN = /\A[a-zA-Z0-9\.\-\_]+\z/.freeze # :nodoc:

  # :startdoc:

  ##
  # List of attribute names: [:name, :version, ...]

  @@required_attributes = [:rubygems_version,
                           :specification_version,
                           :name,
                           :version,
                           :date,
                           :summary,
                           :require_paths]

  ##
  # Map of attribute names to default values.

  @@default_value = {
    :authors                   => [],
    :autorequire               => nil,
    :bindir                    => "bin",
    :cert_chain                => [],
    :date                      => nil,
    :dependencies              => [],
    :description               => nil,
    :email                     => nil,
    :executables               => [],
    :extensions                => [],
    :extra_rdoc_files          => [],
    :files                     => [],
    :homepage                  => nil,
    :licenses                  => [],
    :metadata                  => {},
    :name                      => nil,
    :platform                  => Gem::Platform::RUBY,
    :post_install_message      => nil,
    :rdoc_options              => [],
    :require_paths             => ["lib"],
    :required_ruby_version     => Gem::Requirement.default,
    :required_rubygems_version => Gem::Requirement.default,
    :requirements              => [],
    :rubygems_version          => Gem::VERSION,
    :signing_key               => nil,
    :specification_version     => CURRENT_SPECIFICATION_VERSION,
    :summary                   => nil,
    :test_files                => [],
    :version                   => nil,
  }.freeze

  # rubocop:disable Style/MutableConstant
  INITIALIZE_CODE_FOR_DEFAULTS = {} # :nodoc:
  # rubocop:enable Style/MutableConstant

  @@default_value.each do |k,v|
    INITIALIZE_CODE_FOR_DEFAULTS[k] = case v
    when [], {}, true, false, nil, Numeric, Symbol
      v.inspect
    when String
      v.dump
    when Numeric
      "default_value(:#{k})"
    else
      "default_value(:#{k}).dup"
    end
  end

  @@attributes = @@default_value.keys.sort_by {|s| s.to_s }
  @@array_attributes = @@default_value.reject {|k,v| v != [] }.keys
  @@nil_attributes, @@non_nil_attributes = @@default_value.keys.partition do |k|
    @@default_value[k].nil?
  end

  def self.clear_specs # :nodoc:
    @@all = nil
    @@stubs = nil
    @@stubs_by_name = {}
    @@spec_with_requirable_file = {}
    @@active_stub_with_requirable_file = {}
  end
  private_class_method :clear_specs

  clear_specs

  # Sentinel object to represent "not found" stubs
  NOT_FOUND = Struct.new(:to_spec, :this).new # :nodoc:

  # Tracking removed method calls to warn users during build time.
  REMOVED_METHODS = [:rubyforge_project=].freeze # :nodoc:
  def removed_method_calls
    @removed_method_calls ||= []
  end

  ######################################################################
  # :section: Required gemspec attributes

  ##
  # This gem's name.
  #
  # Usage:
  #
  #   spec.name = 'rake'

  attr_accessor :name

  ##
  # This gem's version.
  #
  # The version string can contain numbers and periods, such as +1.0.0+.
  # A gem is a 'prerelease' gem if the version has a letter in it, such as
  # +1.0.0.pre+.
  #
  # Usage:
  #
  #   spec.version = '0.4.1'

  attr_reader :version

  ##
  # A short summary of this gem's description.  Displayed in <tt>gem list -d</tt>.
  #
  # The #description should be more detailed than the summary.
  #
  # Usage:
  #
  #   spec.summary = "This is a small summary of my gem"

  attr_reader :summary

  ##
  # Files included in this gem.  You cannot append to this accessor, you must
  # assign to it.
  #
  # Only add files you can require to this list, not directories, etc.
  #
  # Directories are automatically stripped from this list when building a gem,
  # other non-files cause an error.
  #
  # Usage:
  #
  #   require 'rake'
  #   spec.files = FileList['lib/**/*.rb',
  #                         'bin/*',
  #                         '[A-Z]*'].to_a
  #
  #   # or without Rake...
  #   spec.files = Dir['lib/**/*.rb'] + Dir['bin/*']
  #   spec.files += Dir['[A-Z]*']
  #   spec.files.reject! { |fn| fn.include? "CVS" }

  def files
    # DO NOT CHANGE TO ||= ! This is not a normal accessor. (yes, it sucks)
    # DOC: Why isn't it normal? Why does it suck? How can we fix this?
    @files = [@files,
              @test_files,
              add_bindir(@executables),
              @extra_rdoc_files,
              @extensions,
             ].flatten.compact.uniq.sort
  end

  ##
  # A list of authors for this gem.
  #
  # Alternatively, a single author can be specified by assigning a string to
  # +spec.author+
  #
  # Usage:
  #
  #   spec.authors = ['John Jones', 'Mary Smith']

  def authors=(value)
    @authors = Array(value).flatten.grep(String)
  end

  ######################################################################
  # :section: Recommended gemspec attributes

  ##
  # The version of Ruby required by this gem
  #
  # Usage:
  #
  #   spec.required_ruby_version = '>= 2.7.0'

  attr_reader :required_ruby_version

  ##
  # A long description of this gem
  #
  # The description should be more detailed than the summary but not
  # excessively long.  A few paragraphs is a recommended length with no
  # examples or formatting.
  #
  # Usage:
  #
  #   spec.description = <<-EOF
  #     Rake is a Make-like program implemented in Ruby. Tasks and
  #     dependencies are specified in standard Ruby syntax.
  #   EOF

  attr_reader :description

  ##
  # A contact email address (or addresses) for this gem
  #
  # Usage:
  #
  #   spec.email = 'john.jones@example.com'
  #   spec.email = ['jack@example.com', 'jill@example.com']

  attr_accessor :email

  ##
  # The URL of this gem's home page
  #
  # Usage:
  #
  #   spec.homepage = 'https://github.com/ruby/rake'

  attr_accessor :homepage

  ##
  # The license for this gem.
  #
  # The license must be no more than 64 characters.
  #
  # This should just be the name of your license. The full text of the license
  # should be inside of the gem (at the top level) when you build it.
  #
  # The simplest way is to specify the standard SPDX ID
  # https://spdx.org/licenses/ for the license.
  # Ideally, you should pick one that is OSI (Open Source Initiative)
  # http://opensource.org/licenses/alphabetical approved.
  #
  # The most commonly used OSI-approved licenses are MIT and Apache-2.0.
  # GitHub also provides a license picker at http://choosealicense.com/.
  #
  # You can also use a custom license file along with your gemspec and specify
  # a LicenseRef-<idstring>, where idstring is the name of the file containing
  # the license text.
  #
  # You should specify a license for your gem so that people know how they are
  # permitted to use it and any restrictions you're placing on it.  Not
  # specifying a license means all rights are reserved; others have no right
  # to use the code for any purpose.
  #
  # You can set multiple licenses with #licenses=
  #
  # Usage:
  #   spec.license = 'MIT'

  def license=(o)
    self.licenses = [o]
  end

  ##
  # The license(s) for the library.
  #
  # Each license must be a short name, no more than 64 characters.
  #
  # This should just be the name of your license. The full
  # text of the license should be inside of the gem when you build it.
  #
  # See #license= for more discussion
  #
  # Usage:
  #   spec.licenses = ['MIT', 'GPL-2.0']

  def licenses=(licenses)
    @licenses = Array licenses
  end

  ##
  # The metadata holds extra data for this gem that may be useful to other
  # consumers and is settable by gem authors.
  #
  # Metadata items have the following restrictions:
  #
  # * The metadata must be a Hash object
  # * All keys and values must be Strings
  # * Keys can be a maximum of 128 bytes and values can be a maximum of 1024
  #   bytes
  # * All strings must be UTF-8, no binary data is allowed
  #
  # You can use metadata to specify links to your gem's homepage, codebase,
  # documentation, wiki, mailing list, issue tracker and changelog.
  #
  #   s.metadata = {
  #     "bug_tracker_uri"   => "https://example.com/user/bestgemever/issues",
  #     "changelog_uri"     => "https://example.com/user/bestgemever/CHANGELOG.md",
  #     "documentation_uri" => "https://www.example.info/gems/bestgemever/0.0.1",
  #     "homepage_uri"      => "https://bestgemever.example.io",
  #     "mailing_list_uri"  => "https://groups.example.com/bestgemever",
  #     "source_code_uri"   => "https://example.com/user/bestgemever",
  #     "wiki_uri"          => "https://example.com/user/bestgemever/wiki"
  #     "funding_uri"       => "https://example.com/donate"
  #   }
  #
  # These links will be used on your gem's page on rubygems.org and must pass
  # validation against following regex.
  #
  #   %r{\Ahttps?:\/\/([^\s:@]+:[^\s:@]*@)?[A-Za-z\d\-]+(\.[A-Za-z\d\-]+)+\.?(:\d{1,5})?([\/?]\S*)?\z}

  attr_accessor :metadata

  ######################################################################
  # :section: Optional gemspec attributes

  ##
  # Singular (alternative) writer for #authors
  #
  # Usage:
  #
  #   spec.author = 'John Jones'

  def author=(o)
    self.authors = [o]
  end

  ##
  # The path in the gem for executable scripts.  Usually 'bin'
  #
  # Usage:
  #
  #   spec.bindir = 'bin'

  attr_accessor :bindir

  ##
  # The certificate chain used to sign this gem.  See Gem::Security for
  # details.

  attr_accessor :cert_chain

  ##
  # A message that gets displayed after the gem is installed.
  #
  # Usage:
  #
  #   spec.post_install_message = "Thanks for installing!"

  attr_accessor :post_install_message

  ##
  # The platform this gem runs on.
  #
  # This is usually Gem::Platform::RUBY or Gem::Platform::CURRENT.
  #
  # Most gems contain pure Ruby code; they should simply leave the default
  # value in place.  Some gems contain C (or other) code to be compiled into a
  # Ruby "extension".  The gem should leave the default value in place unless
  # the code will only compile on a certain type of system.  Some gems consist
  # of pre-compiled code ("binary gems").  It's especially important that they
  # set the platform attribute appropriately.  A shortcut is to set the
  # platform to Gem::Platform::CURRENT, which will cause the gem builder to set
  # the platform to the appropriate value for the system on which the build is
  # being performed.
  #
  # If this attribute is set to a non-default value, it will be included in
  # the filename of the gem when it is built such as:
  # nokogiri-1.6.0-x86-mingw32.gem
  #
  # Usage:
  #
  #   spec.platform = Gem::Platform.local

  def platform=(platform)
    if @original_platform.nil? ||
       @original_platform == Gem::Platform::RUBY
      @original_platform = platform
    end

    case platform
    when Gem::Platform::CURRENT then
      @new_platform = Gem::Platform.local
      @original_platform = @new_platform.to_s

    when Gem::Platform then
      @new_platform = platform

    # legacy constants
    when nil, Gem::Platform::RUBY then
      @new_platform = Gem::Platform::RUBY
    when "mswin32" then # was Gem::Platform::WIN32
      @new_platform = Gem::Platform.new "x86-mswin32"
    when "i586-linux" then # was Gem::Platform::LINUX_586
      @new_platform = Gem::Platform.new "x86-linux"
    when "powerpc-darwin" then # was Gem::Platform::DARWIN
      @new_platform = Gem::Platform.new "ppc-darwin"
    else
      @new_platform = Gem::Platform.new platform
    end

    @platform = @new_platform.to_s

    invalidate_memoized_attributes

    @new_platform
  end

  ##
  # Paths in the gem to add to <code>$LOAD_PATH</code> when this gem is
  # activated.
  #--
  # See also #require_paths
  #++
  # If you have an extension you do not need to add <code>"ext"</code> to the
  # require path, the extension build process will copy the extension files
  # into "lib" for you.
  #
  # The default value is <code>"lib"</code>
  #
  # Usage:
  #
  #   # If all library files are in the root directory...
  #   spec.require_paths = ['.']

  def require_paths=(val)
    @require_paths = Array(val)
  end

  ##
  # The RubyGems version required by this gem

  attr_reader :required_rubygems_version

  ##
  # The version of RubyGems used to create this gem.
  #
  # Do not set this, it is set automatically when the gem is packaged.

  attr_accessor :rubygems_version

  ##
  # The key used to sign this gem.  See Gem::Security for details.

  attr_accessor :signing_key

  ##
  # Adds a development dependency named +gem+ with +requirements+ to this
  # gem.
  #
  # Usage:
  #
  #   spec.add_development_dependency 'example', '~> 1.1', '>= 1.1.4'
  #
  # Development dependencies aren't installed by default and aren't
  # activated when a gem is required.

  def add_development_dependency(gem, *requirements)
    add_dependency_with_type(gem, :development, requirements)
  end

  ##
  # Adds a runtime dependency named +gem+ with +requirements+ to this gem.
  #
  # Usage:
  #
  #   spec.add_runtime_dependency 'example', '~> 1.1', '>= 1.1.4'

  def add_runtime_dependency(gem, *requirements)
    if requirements.uniq.size != requirements.size
      warn "WARNING: duplicated #{gem} dependency #{requirements}"
    end

    add_dependency_with_type(gem, :runtime, requirements)
  end

  ##
  # Executables included in the gem.
  #
  # For example, the rake gem has rake as an executable. You don’t specify the
  # full path (as in bin/rake); all application-style files are expected to be
  # found in bindir.  These files must be executable Ruby files.  Files that
  # use bash or other interpreters will not work.
  #
  # Executables included may only be ruby scripts, not scripts for other
  # languages or compiled binaries.
  #
  # Usage:
  #
  #   spec.executables << 'rake'

  def executables
    @executables ||= []
  end

  ##
  # Extensions to build when installing the gem, specifically the paths to
  # extconf.rb-style files used to compile extensions.
  #
  # These files will be run when the gem is installed, causing the C (or
  # whatever) code to be compiled on the user’s machine.
  #
  # Usage:
  #
  #  spec.extensions << 'ext/rmagic/extconf.rb'
  #
  # See Gem::Ext::Builder for information about writing extensions for gems.

  def extensions
    @extensions ||= []
  end

  ##
  # Extra files to add to RDoc such as README or doc/examples.txt
  #
  # When the user elects to generate the RDoc documentation for a gem (typically
  # at install time), all the library files are sent to RDoc for processing.
  # This option allows you to have some non-code files included for a more
  # complete set of documentation.
  #
  # Usage:
  #
  #  spec.extra_rdoc_files = ['README', 'doc/user-guide.txt']

  def extra_rdoc_files
    @extra_rdoc_files ||= []
  end

  ##
  # The version of RubyGems that installed this gem.  Returns
  # <code>Gem::Version.new(0)</code> for gems installed by versions earlier
  # than RubyGems 2.2.0.

  def installed_by_version # :nodoc:
    @installed_by_version ||= Gem::Version.new(0)
  end

  ##
  # Sets the version of RubyGems that installed this gem.  See also
  # #installed_by_version.

  def installed_by_version=(version) # :nodoc:
    @installed_by_version = Gem::Version.new version
  end

  ##
  # Specifies the rdoc options to be used when generating API documentation.
  #
  # Usage:
  #
  #   spec.rdoc_options << '--title' << 'Rake -- Ruby Make' <<
  #     '--main' << 'README' <<
  #     '--line-numbers'

  def rdoc_options
    @rdoc_options ||= []
  end

  LATEST_RUBY_WITHOUT_PATCH_VERSIONS = Gem::Version.new("2.1")

  ##
  # The version of Ruby required by this gem.  The ruby version can be
  # specified to the patch-level:
  #
  #   $ ruby -v -e 'p Gem.ruby_version'
  #   ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.0]
  #   #<Gem::Version "2.0.0.247">
  #
  # Prereleases can also be specified.
  #
  # Usage:
  #
  #  # This gem will work with 1.8.6 or greater...
  #  spec.required_ruby_version = '>= 1.8.6'
  #
  #  # Only with final releases of major version 2 where minor version is at least 3
  #  spec.required_ruby_version = '~> 2.3'
  #
  #  # Only prereleases or final releases after 2.6.0.preview2
  #  spec.required_ruby_version = '> 2.6.0.preview2'
  #
  #  # This gem will work with 2.3.0 or greater, including major version 3, but lesser than 4.0.0
  #  spec.required_ruby_version = '>= 2.3', '< 4'

  def required_ruby_version=(req)
    @required_ruby_version = Gem::Requirement.create req

    @required_ruby_version.requirements.map! do |op, v|
      if v >= LATEST_RUBY_WITHOUT_PATCH_VERSIONS && v.release.segments.size == 4
        [op == "~>" ? "=" : op, Gem::Version.new(v.segments.tap {|s| s.delete_at(3) }.join("."))]
      else
        [op, v]
      end
    end
  end

  ##
  # The RubyGems version required by this gem

  def required_rubygems_version=(req)
    @required_rubygems_version = Gem::Requirement.create req
  end

  ##
  # Lists the external (to RubyGems) requirements that must be met for this gem
  # to work.  It's simply information for the user.
  #
  # Usage:
  #
  #   spec.requirements << 'libmagick, v6.0'
  #   spec.requirements << 'A good graphics card'

  def requirements
    @requirements ||= []
  end

  ##
  # A collection of unit test files.  They will be loaded as unit tests when
  # the user requests a gem to be unit tested.
  #
  # Usage:
  #   spec.test_files = Dir.glob('test/tc_*.rb')
  #   spec.test_files = ['tests/test-suite.rb']

  def test_files=(files) # :nodoc:
    @test_files = Array files
  end

  ######################################################################
  # :section: Specification internals

  ##
  # True when this gemspec has been activated. This attribute is not persisted.

  attr_accessor :activated

  alias :activated? :activated

  ##
  # Autorequire was used by old RubyGems to automatically require a file.
  #
  # Deprecated: It is neither supported nor functional.

  attr_accessor :autorequire # :nodoc:

  ##
  # Sets the default executable for this gem.
  #
  # Deprecated: You must now specify the executable name to  Gem.bin_path.

  attr_writer :default_executable
  rubygems_deprecate :default_executable=

  ##
  # Allows deinstallation of gems with legacy platforms.

  attr_writer :original_platform # :nodoc:

  ##
  # The Gem::Specification version of this gemspec.
  #
  # Do not set this, it is set automatically when the gem is packaged.

  attr_accessor :specification_version

  def self._all # :nodoc:
    @@all ||= Gem.loaded_specs.values | stubs.map(&:to_spec)
  end

  def self.clear_load_cache # :nodoc:
    @load_cache_mutex.synchronize do
      @load_cache.clear
    end
  end
  private_class_method :clear_load_cache

  def self.each_gemspec(dirs) # :nodoc:
    dirs.each do |dir|
      Gem::Util.glob_files_in_dir("*.gemspec", dir).each do |path|
        yield path.tap(&Gem::UNTAINT)
      end
    end
  end

  def self.gemspec_stubs_in(dir, pattern)
    Gem::Util.glob_files_in_dir(pattern, dir).map {|path| yield path }.select(&:valid?)
  end
  private_class_method :gemspec_stubs_in

  def self.installed_stubs(dirs, pattern)
    map_stubs(dirs, pattern) do |path, base_dir, gems_dir|
      Gem::StubSpecification.gemspec_stub(path, base_dir, gems_dir)
    end
  end
  private_class_method :installed_stubs

  def self.map_stubs(dirs, pattern) # :nodoc:
    dirs.flat_map do |dir|
      base_dir = File.dirname dir
      gems_dir = File.join base_dir, "gems"
      gemspec_stubs_in(dir, pattern) {|path| yield path, base_dir, gems_dir }
    end
  end
  private_class_method :map_stubs

  def self.each_spec(dirs) # :nodoc:
    each_gemspec(dirs) do |path|
      spec = self.load path
      yield spec if spec
    end
  end

  ##
  # Returns a Gem::StubSpecification for every installed gem

  def self.stubs
    @@stubs ||= begin
      pattern = "*.gemspec"
      stubs = stubs_for_pattern(pattern, false)

      @@stubs_by_name = stubs.select {|s| Gem::Platform.match_spec? s }.group_by(&:name)
      stubs
    end
  end

  ##
  # Returns a Gem::StubSpecification for default gems

  def self.default_stubs(pattern = "*.gemspec")
    base_dir = Gem.default_dir
    gems_dir = File.join base_dir, "gems"
    gemspec_stubs_in(Gem.default_specifications_dir, pattern) do |path|
      Gem::StubSpecification.default_gemspec_stub(path, base_dir, gems_dir)
    end
  end

  ##
  # Returns a Gem::StubSpecification for installed gem named +name+
  # only returns stubs that match Gem.platforms

  def self.stubs_for(name)
    if @@stubs
      @@stubs_by_name[name] || []
    else
      @@stubs_by_name[name] ||= stubs_for_pattern("#{name}-*.gemspec").select do |s|
        s.name == name
      end
    end
  end

  ##
  # Finds stub specifications matching a pattern from the standard locations,
  # optionally filtering out specs not matching the current platform
  #
  def self.stubs_for_pattern(pattern, match_platform = true) # :nodoc:
    installed_stubs = installed_stubs(Gem::Specification.dirs, pattern)
    installed_stubs.select! {|s| Gem::Platform.match_spec? s } if match_platform
    stubs = installed_stubs + default_stubs(pattern)
    stubs = stubs.uniq {|stub| stub.full_name }
    _resort!(stubs)
    stubs
  end

  def self._resort!(specs) # :nodoc:
    specs.sort! do |a, b|
      names = a.name <=> b.name
      next names if names.nonzero?
      versions = b.version <=> a.version
      next versions if versions.nonzero?
      Gem::Platform.sort_priority(b.platform)
    end
  end

  ##
  # Loads the default specifications. It should be called only once.

  def self.load_defaults
    each_spec([Gem.default_specifications_dir]) do |spec|
      # #load returns nil if the spec is bad, so we just ignore
      # it at this stage
      Gem.register_default_spec(spec)
    end
  end

  ##
  # Adds +spec+ to the known specifications, keeping the collection
  # properly sorted.

  def self.add_spec(spec)
    return if _all.include? spec

    _all << spec
    stubs << spec
    (@@stubs_by_name[spec.name] ||= []) << spec

    _resort!(@@stubs_by_name[spec.name])
    _resort!(stubs)
  end

  ##
  # Removes +spec+ from the known specs.

  def self.remove_spec(spec)
    _all.delete spec.to_spec
    stubs.delete spec
    (@@stubs_by_name[spec.name] || []).delete spec
  end

  ##
  # Returns all specifications. This method is discouraged from use.
  # You probably want to use one of the Enumerable methods instead.

  def self.all
    warn "NOTE: Specification.all called from #{caller.first}" unless
      Gem::Deprecate.skip
    _all
  end

  ##
  # Sets the known specs to +specs+. Not guaranteed to work for you in
  # the future. Use at your own risk. Caveat emptor. Doomy doom doom.
  # Etc etc.
  #
  #--
  # Makes +specs+ the known specs
  # Listen, time is a river
  # Winter comes, code breaks
  #
  # -- wilsonb

  def self.all=(specs)
    @@stubs_by_name = specs.group_by(&:name)
    @@all = @@stubs = specs
  end

  ##
  # Return full names of all specs in sorted order.

  def self.all_names
    self._all.map(&:full_name)
  end

  ##
  # Return the list of all array-oriented instance variables.
  #--
  # Not sure why we need to use so much stupid reflection in here...

  def self.array_attributes
    @@array_attributes.dup
  end

  ##
  # Return the list of all instance variables.
  #--
  # Not sure why we need to use so much stupid reflection in here...

  def self.attribute_names
    @@attributes.dup
  end

  ##
  # Return the directories that Specification uses to find specs.

  def self.dirs
    @@dirs ||= Gem.path.collect do |dir|
      File.join dir.dup.tap(&Gem::UNTAINT), "specifications"
    end
  end

  ##
  # Set the directories that Specification uses to find specs. Setting
  # this resets the list of known specs.

  def self.dirs=(dirs)
    self.reset

    @@dirs = Array(dirs).map {|dir| File.join dir, "specifications" }
  end

  extend Enumerable

  ##
  # Enumerate every known spec.  See ::dirs= and ::add_spec to set the list of
  # specs.

  def self.each
    return enum_for(:each) unless block_given?

    self._all.each do |x|
      yield x
    end
  end

  ##
  # Returns every spec that matches +name+ and optional +requirements+.

  def self.find_all_by_name(name, *requirements)
    requirements = Gem::Requirement.default if requirements.empty?

    # TODO: maybe try: find_all { |s| spec === dep }

    Gem::Dependency.new(name, *requirements).matching_specs
  end

  ##
  # Returns every spec that has the given +full_name+

  def self.find_all_by_full_name(full_name)
    stubs.select {|s| s.full_name == full_name }.map(&:to_spec)
  end

  ##
  # Find the best specification matching a +name+ and +requirements+. Raises
  # if the dependency doesn't resolve to a valid specification.

  def self.find_by_name(name, *requirements)
    requirements = Gem::Requirement.default if requirements.empty?

    # TODO: maybe try: find { |s| spec === dep }

    Gem::Dependency.new(name, *requirements).to_spec
  end

  ##
  # Return the best specification that contains the file matching +path+.

  def self.find_by_path(path)
    path = path.dup.freeze
    spec = @@spec_with_requirable_file[path] ||= (stubs.find do |s|
      s.contains_requirable_file? path
    end || NOT_FOUND)
    spec.to_spec
  end

  ##
  # Return the best specification that contains the file matching +path+
  # amongst the specs that are not activated.

  def self.find_inactive_by_path(path)
    stub = stubs.find do |s|
      next if s.activated?
      s.contains_requirable_file? path
    end
    stub && stub.to_spec
  end

  def self.find_active_stub_by_path(path)
    stub = @@active_stub_with_requirable_file[path] ||= (stubs.find do |s|
      s.activated? && s.contains_requirable_file?(path)
    end || NOT_FOUND)
    stub.this
  end

  ##
  # Return currently unresolved specs that contain the file matching +path+.

  def self.find_in_unresolved(path)
    unresolved_specs.find_all {|spec| spec.contains_requirable_file? path }
  end

  ##
  # Search through all unresolved deps and sub-dependencies and return
  # specs that contain the file matching +path+.

  def self.find_in_unresolved_tree(path)
    unresolved_specs.each do |spec|
      spec.traverse do |from_spec, dep, to_spec, trail|
        if to_spec.has_conflicts? || to_spec.conficts_when_loaded_with?(trail)
          :next
        else
          return trail.reverse if to_spec.contains_requirable_file? path
        end
      end
    end

    []
  end

  def self.unresolved_specs
    unresolved_deps.values.map {|dep| dep.to_specs }.flatten
  end
  private_class_method :unresolved_specs

  ##
  # Special loader for YAML files.  When a Specification object is loaded
  # from a YAML file, it bypasses the normal Ruby object initialization
  # routine (#initialize).  This method makes up for that and deals with
  # gems of different ages.
  #
  # +input+ can be anything that YAML.load() accepts: String or IO.

  def self.from_yaml(input)
    Gem.load_yaml

    input = normalize_yaml_input input
    spec = Gem::SafeYAML.safe_load input

    if spec && spec.class == FalseClass
      raise Gem::EndOfYAMLException
    end

    unless Gem::Specification === spec
      raise Gem::Exception, "YAML data doesn't evaluate to gem specification"
    end

    spec.specification_version ||= NONEXISTENT_SPECIFICATION_VERSION
    spec.reset_nil_attributes_to_default
    spec.flatten_require_paths

    spec
  end

  ##
  # Return the latest specs, optionally including prerelease specs if
  # +prerelease+ is true.

  def self.latest_specs(prerelease = false)
    _latest_specs Gem::Specification.stubs, prerelease
  end

  ##
  # Return the latest installed spec for gem +name+.

  def self.latest_spec_for(name)
    latest_specs(true).find {|installed_spec| installed_spec.name == name }
  end

  def self._latest_specs(specs, prerelease = false) # :nodoc:
    result = {}

    specs.reverse_each do |spec|
      next if spec.version.prerelease? unless prerelease

      result[spec.name] = spec
    end

    result.map(&:last).flatten.sort_by {|tup| tup.name }
  end

  ##
  # Loads Ruby format gemspec from +file+.

  def self.load(file)
    return unless file

    _spec = @load_cache_mutex.synchronize { @load_cache[file] }
    return _spec if _spec

    file = file.dup.tap(&Gem::UNTAINT)
    return unless File.file?(file)

    code = Gem.open_file(file, "r:UTF-8:-", &:read)

    code.tap(&Gem::UNTAINT)

    begin
      _spec = eval code, binding, file

      if Gem::Specification === _spec
        _spec.loaded_from = File.expand_path file.to_s
        @load_cache_mutex.synchronize do
          prev = @load_cache[file]
          if prev
            _spec = prev
          else
            @load_cache[file] = _spec
          end
        end
        return _spec
      end

      warn "[#{file}] isn't a Gem::Specification (#{_spec.class} instead)."
    rescue SignalException, SystemExit
      raise
    rescue SyntaxError, Exception => e
      warn "Invalid gemspec in [#{file}]: #{e}"
    end

    nil
  end

  ##
  # Specification attributes that must be non-nil

  def self.non_nil_attributes
    @@non_nil_attributes.dup
  end

  ##
  # Make sure the YAML specification is properly formatted with dashes

  def self.normalize_yaml_input(input)
    result = input.respond_to?(:read) ? input.read : input
    result = "--- " + result unless result.start_with?("--- ")
    result = result.dup
    result.gsub!(/ !!null \n/, " \n")
    # date: 2011-04-26 00:00:00.000000000Z
    # date: 2011-04-26 00:00:00.000000000 Z
    result.gsub!(/^(date: \d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+?)Z/, '\1 Z')
    result
  end

  ##
  # Return a list of all outdated local gem names.  This method is HEAVY
  # as it must go fetch specifications from the server.
  #
  # Use outdated_and_latest_version if you wish to retrieve the latest remote
  # version as well.

  def self.outdated
    outdated_and_latest_version.map {|local, _| local.name }
  end

  ##
  # Enumerates the outdated local gems yielding the local specification and
  # the latest remote version.
  #
  # This method may take some time to return as it must check each local gem
  # against the server's index.

  def self.outdated_and_latest_version
    return enum_for __method__ unless block_given?

    # TODO: maybe we should switch to rubygems' version service?
    fetcher = Gem::SpecFetcher.fetcher

    latest_specs(true).each do |local_spec|
      dependency =
        Gem::Dependency.new local_spec.name, ">= #{local_spec.version}"

      remotes, = fetcher.search_for_dependency dependency
      remotes  = remotes.map {|n, _| n.version }

      latest_remote = remotes.sort.last

      yield [local_spec, latest_remote] if
        latest_remote && local_spec.version < latest_remote
    end

    nil
  end

  ##
  # Is +name+ a required attribute?

  def self.required_attribute?(name)
    @@required_attributes.include? name.to_sym
  end

  ##
  # Required specification attributes

  def self.required_attributes
    @@required_attributes.dup
  end

  ##
  # Reset the list of known specs, running pre and post reset hooks
  # registered in Gem.

  def self.reset
    @@dirs = nil
    Gem.pre_reset_hooks.each {|hook| hook.call }
    clear_specs
    clear_load_cache
    unresolved = unresolved_deps
    unless unresolved.empty?
      w = "W" + "ARN"
      warn "#{w}: Unresolved or ambiguous specs during Gem::Specification.reset:"
      unresolved.values.each do |dep|
        warn "      #{dep}"

        versions = find_all_by_name(dep.name)
        unless versions.empty?
          warn "      Available/installed versions of this gem:"
          versions.each {|s| warn "      - #{s.version}" }
        end
      end
      warn "#{w}: Clearing out unresolved specs. Try 'gem cleanup <gem>'"
      warn "Please report a bug if this causes problems."
      unresolved.clear
    end
    Gem.post_reset_hooks.each {|hook| hook.call }
  end

  # DOC: This method needs documented or nodoc'd
  def self.unresolved_deps
    @unresolved_deps ||= Hash.new {|h, n| h[n] = Gem::Dependency.new n }
  end

  ##
  # Load custom marshal format, re-initializing defaults as needed

  def self._load(str)
    Gem.load_yaml

    array = begin
      Marshal.load str
    rescue ArgumentError => e
      #
      # Some very old marshaled specs included references to `YAML::PrivateType`
      # and `YAML::Syck::DefaultKey` constants due to bugs in the old emitter
      # that generated them. Workaround the issue by defining the necessary
      # constants and retrying.
      #
      message = e.message
      raise unless message.include?("YAML::")

      Object.const_set "YAML", Psych unless Object.const_defined?(:YAML)

      if message.include?("YAML::Syck::")
        YAML.const_set "Syck", YAML unless YAML.const_defined?(:Syck)

        YAML::Syck.const_set "DefaultKey", Class.new if message.include?("YAML::Syck::DefaultKey")
      elsif message.include?("YAML::PrivateType")
        YAML.const_set "PrivateType", Class.new
      end

      retry
    end

    spec = Gem::Specification.new
    spec.instance_variable_set :@specification_version, array[1]

    current_version = CURRENT_SPECIFICATION_VERSION

    field_count = if spec.specification_version > current_version
      spec.instance_variable_set :@specification_version,
                                 current_version
      MARSHAL_FIELDS[current_version]
    else
      MARSHAL_FIELDS[spec.specification_version]
    end

    if array.size < field_count
      raise TypeError, "invalid Gem::Specification format #{array.inspect}"
    end

    spec.instance_variable_set :@rubygems_version,          array[0]
    # spec version
    spec.instance_variable_set :@name,                      array[2]
    spec.instance_variable_set :@version,                   array[3]
    spec.date =                                             array[4]
    spec.instance_variable_set :@summary,                   array[5]
    spec.instance_variable_set :@required_ruby_version,     array[6]
    spec.instance_variable_set :@required_rubygems_version, array[7]
    spec.instance_variable_set :@original_platform,         array[8]
    spec.instance_variable_set :@dependencies,              array[9]
    # offset due to rubyforge_project removal
    spec.instance_variable_set :@email,                     array[11]
    spec.instance_variable_set :@authors,                   array[12]
    spec.instance_variable_set :@description,               array[13]
    spec.instance_variable_set :@homepage,                  array[14]
    spec.instance_variable_set :@has_rdoc,                  array[15]
    spec.instance_variable_set :@new_platform,              array[16]
    spec.instance_variable_set :@platform,                  array[16].to_s
    spec.instance_variable_set :@license,                   array[17]
    spec.instance_variable_set :@metadata,                  array[18]
    spec.instance_variable_set :@loaded,                    false
    spec.instance_variable_set :@activated,                 false

    spec
  end

  def <=>(other) # :nodoc:
    sort_obj <=> other.sort_obj
  end

  def ==(other) # :nodoc:
    self.class === other &&
      name == other.name &&
      version == other.version &&
      platform == other.platform
  end

  ##
  # Dump only crucial instance variables.
  #--
  # MAINTAIN ORDER!
  # (down with the man)

  def _dump(limit)
    Marshal.dump [
      @rubygems_version,
      @specification_version,
      @name,
      @version,
      date,
      @summary,
      @required_ruby_version,
      @required_rubygems_version,
      @original_platform,
      @dependencies,
      "", # rubyforge_project
      @email,
      @authors,
      @description,
      @homepage,
      true, # has_rdoc
      @new_platform,
      @licenses,
      @metadata,
    ]
  end

  ##
  # Activate this spec, registering it as a loaded spec and adding
  # it's lib paths to $LOAD_PATH. Returns true if the spec was
  # activated, false if it was previously activated. Freaks out if
  # there are conflicts upon activation.

  def activate
    other = Gem.loaded_specs[self.name]
    if other
      check_version_conflict other
      return false
    end

    raise_if_conflicts

    activate_dependencies
    add_self_to_load_path

    Gem.loaded_specs[self.name] = self
    @activated = true
    @loaded = true

    return true
  end

  ##
  # Activate all unambiguously resolved runtime dependencies of this
  # spec. Add any ambiguous dependencies to the unresolved list to be
  # resolved later, as needed.

  def activate_dependencies
    unresolved = Gem::Specification.unresolved_deps

    self.runtime_dependencies.each do |spec_dep|
      if loaded = Gem.loaded_specs[spec_dep.name]
        next if spec_dep.matches_spec? loaded

        msg = "can't satisfy '#{spec_dep}', already activated '#{loaded.full_name}'"
        e = Gem::LoadError.new msg
        e.name = spec_dep.name

        raise e
      end

      begin
        specs = spec_dep.to_specs
      rescue Gem::MissingSpecError => e
        raise Gem::MissingSpecError.new(e.name, e.requirement, "at: #{self.spec_file}")
      end

      if specs.size == 1
        specs.first.activate
      else
        name = spec_dep.name
        unresolved[name] = unresolved[name].merge spec_dep
      end
    end

    unresolved.delete self.name
  end

  ##
  # Abbreviate the spec for downloading.  Abbreviated specs are only used for
  # searching, downloading and related activities and do not need deployment
  # specific information (e.g. list of files).  So we abbreviate the spec,
  # making it much smaller for quicker downloads.

  def abbreviate
    self.files = []
    self.test_files = []
    self.rdoc_options = []
    self.extra_rdoc_files = []
    self.cert_chain = []
  end

  ##
  # Sanitize the descriptive fields in the spec.  Sometimes non-ASCII
  # characters will garble the site index.  Non-ASCII characters will
  # be replaced by their XML entity equivalent.

  def sanitize
    self.summary              = sanitize_string(summary)
    self.description          = sanitize_string(description)
    self.post_install_message = sanitize_string(post_install_message)
    self.authors              = authors.collect {|a| sanitize_string(a) }
  end

  ##
  # Sanitize a single string.

  def sanitize_string(string)
    return string unless string

    # HACK the #to_s is in here because RSpec has an Array of Arrays of
    # Strings for authors.  Need a way to disallow bad values on gemspec
    # generation.  (Probably won't happen.)
    string.to_s
  end

  ##
  # Returns an array with bindir attached to each executable in the
  # +executables+ list

  def add_bindir(executables)
    return nil if executables.nil?

    if @bindir
      Array(executables).map {|e| File.join(@bindir, e) }
    else
      executables
    end
  rescue
    return nil
  end

  ##
  # Adds a dependency on gem +dependency+ with type +type+ that requires
  # +requirements+.  Valid types are currently <tt>:runtime</tt> and
  # <tt>:development</tt>.

  def add_dependency_with_type(dependency, type, requirements)
    requirements = if requirements.empty?
      Gem::Requirement.default
    else
      requirements.flatten
    end

    unless dependency.respond_to?(:name) &&
           dependency.respond_to?(:requirement)
      dependency = Gem::Dependency.new(dependency.to_s, requirements, type)
    end

    dependencies << dependency
  end

  private :add_dependency_with_type

  alias add_dependency add_runtime_dependency

  ##
  # Adds this spec's require paths to LOAD_PATH, in the proper location.

  def add_self_to_load_path
    return if default_gem?

    paths = full_require_paths

    Gem.add_to_load_path(*paths)
  end

  ##
  # Singular reader for #authors.  Returns the first author in the list

  def author
    (val = authors) && val.first
  end

  ##
  # The list of author names who wrote this gem.
  #
  #   spec.authors = ['Chad Fowler', 'Jim Weirich', 'Rich Kilmer']

  def authors
    @authors ||= []
  end

  ##
  # Returns the full path to installed gem's bin directory.
  #
  # NOTE: do not confuse this with +bindir+, which is just 'bin', not
  # a full path.

  def bin_dir
    @bin_dir ||= File.join gem_dir, bindir
  end

  ##
  # Returns the full path to an executable named +name+ in this gem.

  def bin_file(name)
    File.join bin_dir, name
  end

  ##
  # Returns the build_args used to install the gem

  def build_args
    if File.exist? build_info_file
      build_info = File.readlines build_info_file
      build_info = build_info.map {|x| x.strip }
      build_info.delete ""
      build_info
    else
      []
    end
  end

  ##
  # Builds extensions for this platform if the gem has extensions listed and
  # the gem.build_complete file is missing.

  def build_extensions # :nodoc:
    return if extensions.empty?
    return if default_gem?
    return if File.exist? gem_build_complete_path
    return if !File.writable?(base_dir)
    return if !File.exist?(File.join(base_dir, "extensions"))

    begin
      # We need to require things in $LOAD_PATH without looking for the
      # extension we are about to build.
      unresolved_deps = Gem::Specification.unresolved_deps.dup
      Gem::Specification.unresolved_deps.clear

      require_relative "config_file"
      require_relative "ext"
      require_relative "user_interaction"

      ui = Gem::SilentUI.new
      Gem::DefaultUserInteraction.use_ui ui do
        builder = Gem::Ext::Builder.new self
        builder.build_extensions
      end
    ensure
      ui.close if ui
      Gem::Specification.unresolved_deps.replace unresolved_deps
    end
  end

  ##
  # Returns the full path to the build info directory

  def build_info_dir
    File.join base_dir, "build_info"
  end

  ##
  # Returns the full path to the file containing the build
  # information generated when the gem was installed

  def build_info_file
    File.join build_info_dir, "#{full_name}.info"
  end

  ##
  # Returns the full path to the cache directory containing this
  # spec's cached gem.

  def cache_dir
    @cache_dir ||= File.join base_dir, "cache"
  end

  ##
  # Returns the full path to the cached gem for this spec.

  def cache_file
    @cache_file ||= File.join cache_dir, "#{full_name}.gem"
  end

  ##
  # Return any possible conflicts against the currently loaded specs.

  def conflicts
    conflicts = {}
    self.runtime_dependencies.each do |dep|
      spec = Gem.loaded_specs[dep.name]
      if spec && !spec.satisfies_requirement?(dep)
        (conflicts[spec] ||= []) << dep
      end
    end
    env_req = Gem.env_requirement(name)
    (conflicts[self] ||= []) << env_req unless env_req.satisfied_by? version
    conflicts
  end

  ##
  # return true if there will be conflict when spec if loaded together with the list of specs.

  def conficts_when_loaded_with?(list_of_specs) # :nodoc:
    result = list_of_specs.any? do |spec|
      spec.dependencies.any? {|dep| dep.runtime? && (dep.name == name) && !satisfies_requirement?(dep) }
    end
    result
  end

  ##
  # Return true if there are possible conflicts against the currently loaded specs.

  def has_conflicts?
    return true unless Gem.env_requirement(name).satisfied_by?(version)
    self.dependencies.any? do |dep|
      if dep.runtime?
        spec = Gem.loaded_specs[dep.name]
        spec && !spec.satisfies_requirement?(dep)
      else
        false
      end
    end
  end

  # The date this gem was created.
  #
  # If SOURCE_DATE_EPOCH is set as an environment variable, use that to support
  # reproducible builds; otherwise, default to the current UTC date.
  #
  # Details on SOURCE_DATE_EPOCH:
  # https://reproducible-builds.org/specs/source-date-epoch/

  def date
    @date ||= Time.utc(*Gem.source_date_epoch.utc.to_a[3..5].reverse)
  end

  DateLike = Object.new # :nodoc:
  def DateLike.===(obj) # :nodoc:
    defined?(::Date) && Date === obj
  end

  DateTimeFormat = # :nodoc:
    /\A
     (\d{4})-(\d{2})-(\d{2})
     (\s+ \d{2}:\d{2}:\d{2}\.\d+ \s* (Z | [-+]\d\d:\d\d) )?
     \Z/x.freeze

  ##
  # The date this gem was created
  #
  # DO NOT set this, it is set automatically when the gem is packaged.

  def date=(date)
    # We want to end up with a Time object with one-day resolution.
    # This is the cleanest, most-readable, faster-than-using-Date
    # way to do it.
    @date = case date
    when String then
      if DateTimeFormat =~ date
        Time.utc($1.to_i, $2.to_i, $3.to_i)
      else
        raise(Gem::InvalidSpecificationException,
              "invalid date format in specification: #{date.inspect}")
      end
    when Time, DateLike then
      Time.utc(date.year, date.month, date.day)
    else
      TODAY
    end
  end

  ##
  # The default executable for this gem.
  #
  # Deprecated: The name of the gem is assumed to be the name of the
  # executable now.  See Gem.bin_path.

  def default_executable # :nodoc:
    if defined?(@default_executable) && @default_executable
      result = @default_executable
    elsif @executables && @executables.size == 1
      result = Array(@executables).first
    else
      result = nil
    end
    result
  end
  rubygems_deprecate :default_executable

  ##
  # The default value for specification attribute +name+

  def default_value(name)
    @@default_value[name]
  end

  ##
  # A list of Gem::Dependency objects this gem depends on.
  #
  # Use #add_dependency or #add_development_dependency to add dependencies to
  # a gem.

  def dependencies
    @dependencies ||= []
  end

  ##
  # Return a list of all gems that have a dependency on this gemspec.  The
  # list is structured with entries that conform to:
  #
  #   [depending_gem, dependency, [list_of_gems_that_satisfy_dependency]]

  def dependent_gems(check_dev=true)
    out = []
    Gem::Specification.each do |spec|
      deps = check_dev ? spec.dependencies : spec.runtime_dependencies
      deps.each do |dep|
        if self.satisfies_requirement?(dep)
          sats = []
          find_all_satisfiers(dep) do |sat|
            sats << sat
          end
          out << [spec, dep, sats]
        end
      end
    end
    out
  end

  ##
  # Returns all specs that matches this spec's runtime dependencies.

  def dependent_specs
    runtime_dependencies.map {|dep| dep.to_specs }.flatten
  end

  ##
  # A detailed description of this gem.  See also #summary

  def description=(str)
    @description = str.to_s
  end

  ##
  # List of dependencies that are used for development

  def development_dependencies
    dependencies.select {|d| d.type == :development }
  end

  ##
  # Returns the full path to this spec's documentation directory.  If +type+
  # is given it will be appended to the end.  For example:
  #
  #   spec.doc_dir      # => "/path/to/gem_repo/doc/a-1"
  #
  #   spec.doc_dir 'ri' # => "/path/to/gem_repo/doc/a-1/ri"

  def doc_dir(type = nil)
    @doc_dir ||= File.join base_dir, "doc", full_name

    if type
      File.join @doc_dir, type
    else
      @doc_dir
    end
  end

  def encode_with(coder) # :nodoc:
    mark_version

    coder.add "name", @name
    coder.add "version", @version
    platform = case @original_platform
    when nil, "" then
      "ruby"
    when String then
      @original_platform
    else
      @original_platform.to_s
    end
    coder.add "platform", platform

    attributes = @@attributes.map(&:to_s) - %w[name version platform]
    attributes.each do |name|
      coder.add name, instance_variable_get("@#{name}")
    end
  end

  def eql?(other) # :nodoc:
    self.class === other && same_attributes?(other)
  end

  ##
  # Singular accessor for #executables

  def executable
    (val = executables) && val.first
  end

  ##
  # Singular accessor for #executables

  def executable=(o)
    self.executables = [o]
  end

  ##
  # Sets executables to +value+, ensuring it is an array.

  def executables=(value)
    @executables = Array(value)
  end

  ##
  # Sets extensions to +extensions+, ensuring it is an array.

  def extensions=(extensions)
    @extensions = Array extensions
  end

  ##
  # Sets extra_rdoc_files to +files+, ensuring it is an array.

  def extra_rdoc_files=(files)
    @extra_rdoc_files = Array files
  end

  ##
  # The default (generated) file name of the gem.  See also #spec_name.
  #
  #   spec.file_name # => "example-1.0.gem"

  def file_name
    "#{full_name}.gem"
  end

  ##
  # Sets files to +files+, ensuring it is an array.

  def files=(files)
    @files = Array files
  end

  ##
  # Finds all gems that satisfy +dep+

  def find_all_satisfiers(dep)
    Gem::Specification.each do |spec|
      yield spec if spec.satisfies_requirement? dep
    end
  end

  private :find_all_satisfiers

  ##
  # Creates a duplicate spec without large blobs that aren't used at runtime.

  def for_cache
    spec = dup

    spec.files = nil
    spec.test_files = nil

    spec
  end

  def full_name
    @full_name ||= super
  end

  ##
  # Work around bundler removing my methods

  def gem_dir # :nodoc:
    super
  end

  def gems_dir
    @gems_dir ||= File.join(base_dir, "gems")
  end

  ##
  # Deprecated and ignored, defaults to true.
  #
  # Formerly used to indicate this gem was RDoc-capable.

  def has_rdoc # :nodoc:
    true
  end
  rubygems_deprecate :has_rdoc

  ##
  # Deprecated and ignored.
  #
  # Formerly used to indicate this gem was RDoc-capable.

  def has_rdoc=(ignored) # :nodoc:
    @has_rdoc = true
  end
  rubygems_deprecate :has_rdoc=

  alias :has_rdoc? :has_rdoc # :nodoc:
  rubygems_deprecate :has_rdoc?

  ##
  # True if this gem has files in test_files

  def has_unit_tests? # :nodoc:
    !test_files.empty?
  end

  # :stopdoc:
  alias has_test_suite? has_unit_tests?
  # :startdoc:

  def hash # :nodoc:
    name.hash ^ version.hash
  end

  def init_with(coder) # :nodoc:
    @installed_by_version ||= nil
    yaml_initialize coder.tag, coder.map
  end

  eval <<-RUBY, binding, __FILE__, __LINE__ + 1
    # frozen_string_literal: true

    def set_nil_attributes_to_nil
      #{@@nil_attributes.map {|key| "@#{key} = nil" }.join "; "}
    end
    private :set_nil_attributes_to_nil

    def set_not_nil_attributes_to_default_values
      #{@@non_nil_attributes.map {|key| "@#{key} = #{INITIALIZE_CODE_FOR_DEFAULTS[key]}" }.join ";"}
    end
    private :set_not_nil_attributes_to_default_values
  RUBY

  ##
  # Specification constructor. Assigns the default values to the attributes
  # and yields itself for further initialization.  Optionally takes +name+ and
  # +version+.

  def initialize(name = nil, version = nil)
    super()
    @gems_dir              = nil
    @base_dir              = nil
    @loaded = false
    @activated = false
    @loaded_from = nil
    @original_platform = nil
    @installed_by_version = nil

    set_nil_attributes_to_nil
    set_not_nil_attributes_to_default_values

    @new_platform = Gem::Platform::RUBY

    self.name = name if name
    self.version = version if version

    if (platform = Gem.platforms.last) && platform != Gem::Platform::RUBY && platform != Gem::Platform.local
      self.platform = platform
    end

    yield self if block_given?
  end

  ##
  # Duplicates array_attributes from +other_spec+ so state isn't shared.

  def initialize_copy(other_spec)
    self.class.array_attributes.each do |name|
      name = :"@#{name}"
      next unless other_spec.instance_variable_defined? name

      begin
        val = other_spec.instance_variable_get(name)
        if val
          instance_variable_set name, val.dup
        elsif Gem.configuration.really_verbose
          warn "WARNING: #{full_name} has an invalid nil value for #{name}"
        end
      rescue TypeError
        e = Gem::FormatException.new \
          "#{full_name} has an invalid value for #{name}"

        e.file_path = loaded_from
        raise e
      end
    end
  end

  def base_dir
    return Gem.dir unless loaded_from
    @base_dir ||= if default_gem?
      File.dirname File.dirname File.dirname loaded_from
    else
      File.dirname File.dirname loaded_from
    end
  end

  ##
  # Expire memoized instance variables that can incorrectly generate, replace
  # or miss files due changes in certain attributes used to compute them.

  def invalidate_memoized_attributes
    @full_name = nil
    @cache_file = nil
  end

  private :invalidate_memoized_attributes

  def inspect # :nodoc:
    if $DEBUG
      super
    else
      "#{super[0..-2]} #{full_name}>"
    end
  end

  ##
  # Files in the Gem under one of the require_paths

  def lib_files
    @files.select do |file|
      require_paths.any? do |path|
        file.start_with? path
      end
    end
  end

  ##
  # Singular accessor for #licenses

  def license
    licenses.first
  end

  ##
  # Plural accessor for setting licenses
  #
  # See #license= for details

  def licenses
    @licenses ||= []
  end

  def internal_init # :nodoc:
    super
    @bin_dir       = nil
    @cache_dir     = nil
    @cache_file    = nil
    @doc_dir       = nil
    @ri_dir        = nil
    @spec_dir      = nil
    @spec_file     = nil
  end

  ##
  # Sets the rubygems_version to the current RubyGems version.

  def mark_version
    @rubygems_version = Gem::VERSION
  end

  ##
  # Track removed method calls to warn about during build time.
  # Warn about unknown attributes while loading a spec.

  def method_missing(sym, *a, &b) # :nodoc:
    if REMOVED_METHODS.include?(sym)
      removed_method_calls << sym
      return
    end

    if @specification_version > CURRENT_SPECIFICATION_VERSION &&
       sym.to_s.end_with?("=")
      warn "ignoring #{sym} loading #{full_name}" if $DEBUG
    else
      super
    end
  end

  ##
  # Is this specification missing its extensions?  When this returns true you
  # probably want to build_extensions

  def missing_extensions?
    return false if extensions.empty?
    return false if default_gem?
    return false if File.exist? gem_build_complete_path

    true
  end

  ##
  # Normalize the list of files so that:
  # * All file lists have redundancies removed.
  # * Files referenced in the extra_rdoc_files are included in the package
  #   file list.

  def normalize
    if defined?(@extra_rdoc_files) && @extra_rdoc_files
      @extra_rdoc_files.uniq!
      @files ||= []
      @files.concat(@extra_rdoc_files)
    end

    @files            = @files.uniq if @files
    @extensions       = @extensions.uniq if @extensions
    @test_files       = @test_files.uniq if @test_files
    @executables      = @executables.uniq if @executables
    @extra_rdoc_files = @extra_rdoc_files.uniq if @extra_rdoc_files
  end

  ##
  # Return a NameTuple that represents this Specification

  def name_tuple
    Gem::NameTuple.new name, version, original_platform
  end

  ##
  # Returns the full name (name-version) of this gemspec using the original
  # platform.  For use with legacy gems.

  def original_name # :nodoc:
    if platform == Gem::Platform::RUBY || platform.nil?
      "#{@name}-#{@version}"
    else
      "#{@name}-#{@version}-#{@original_platform}"
    end
  end

  ##
  # Cruft. Use +platform+.

  def original_platform # :nodoc:
    @original_platform ||= platform
  end

  ##
  # The platform this gem runs on.  See Gem::Platform for details.

  def platform
    @new_platform ||= Gem::Platform::RUBY
  end

  def pretty_print(q) # :nodoc:
    q.group 2, "Gem::Specification.new do |s|", "end" do
      q.breakable

      attributes = @@attributes - [:name, :version]
      attributes.unshift :installed_by_version
      attributes.unshift :version
      attributes.unshift :name

      attributes.each do |attr_name|
        current_value = self.send attr_name
        current_value = current_value.sort if %i[files test_files].include? attr_name
        if current_value != default_value(attr_name) ||
           self.class.required_attribute?(attr_name)

          q.text "s.#{attr_name} = "

          if attr_name == :date
            current_value = current_value.utc

            q.text "Time.utc(#{current_value.year}, #{current_value.month}, #{current_value.day})"
          else
            q.pp current_value
          end

          q.breakable
        end
      end
    end
  end

  ##
  # Raise an exception if the version of this spec conflicts with the one
  # that is already loaded (+other+)

  def check_version_conflict(other) # :nodoc:
    return if self.version == other.version

    # This gem is already loaded.  If the currently loaded gem is not in the
    # list of candidate gems, then we have a version conflict.

    msg = "can't activate #{full_name}, already activated #{other.full_name}"

    e = Gem::LoadError.new msg
    e.name = self.name

    raise e
  end

  private :check_version_conflict

  ##
  # Check the spec for possible conflicts and freak out if there are any.

  def raise_if_conflicts # :nodoc:
    if has_conflicts?
      raise Gem::ConflictError.new self, conflicts
    end
  end

  ##
  # Sets rdoc_options to +value+, ensuring it is an array.

  def rdoc_options=(options)
    @rdoc_options = Array options
  end

  ##
  # Singular accessor for #require_paths

  def require_path
    (val = require_paths) && val.first
  end

  ##
  # Singular accessor for #require_paths

  def require_path=(path)
    self.require_paths = Array(path)
  end

  ##
  # Set requirements to +req+, ensuring it is an array.

  def requirements=(req)
    @requirements = Array req
  end

  def respond_to_missing?(m, include_private = false) # :nodoc:
    false
  end

  ##
  # Returns the full path to this spec's ri directory.

  def ri_dir
    @ri_dir ||= File.join base_dir, "ri", full_name
  end

  ##
  # Return a string containing a Ruby code representation of the given
  # object.

  def ruby_code(obj)
    case obj
    when String             then obj.dump + ".freeze"
    when Array              then "[" + obj.map {|x| ruby_code x }.join(", ") + "]"
    when Hash               then
      seg = obj.keys.sort.map {|k| "#{k.to_s.dump} => #{obj[k].to_s.dump}" }
      "{ #{seg.join(', ')} }"
    when Gem::Version       then obj.to_s.dump
    when DateLike           then obj.strftime("%Y-%m-%d").dump
    when Time               then obj.strftime("%Y-%m-%d").dump
    when Numeric            then obj.inspect
    when true, false, nil   then obj.inspect
    when Gem::Platform      then "Gem::Platform.new(#{obj.to_a.inspect})"
    when Gem::Requirement   then
      list = obj.as_list
      "Gem::Requirement.new(#{ruby_code(list.size == 1 ? obj.to_s : list)})"
    else raise Gem::Exception, "ruby_code case not handled: #{obj.class}"
    end
  end

  private :ruby_code

  ##
  # List of dependencies that will automatically be activated at runtime.

  def runtime_dependencies
    dependencies.select(&:runtime?)
  end

  ##
  # True if this gem has the same attributes as +other+.

  def same_attributes?(spec)
    @@attributes.all? {|name, default| self.send(name) == spec.send(name) }
  end

  private :same_attributes?

  ##
  # Checks if this specification meets the requirement of +dependency+.

  def satisfies_requirement?(dependency)
    return @name == dependency.name &&
           dependency.requirement.satisfied_by?(@version)
  end

  ##
  # Returns an object you can use to sort specifications in #sort_by.

  def sort_obj
    [@name, @version, Gem::Platform.sort_priority(@new_platform)]
  end

  ##
  # Used by Gem::Resolver to order Gem::Specification objects

  def source # :nodoc:
    Gem::Source::Installed.new
  end

  ##
  # Returns the full path to the directory containing this spec's
  # gemspec file. eg: /usr/local/lib/ruby/gems/1.8/specifications

  def spec_dir
    @spec_dir ||= File.join base_dir, "specifications"
  end

  ##
  # Returns the full path to this spec's gemspec file.
  # eg: /usr/local/lib/ruby/gems/1.8/specifications/mygem-1.0.gemspec

  def spec_file
    @spec_file ||= File.join spec_dir, "#{full_name}.gemspec"
  end

  ##
  # The default name of the gemspec.  See also #file_name
  #
  #   spec.spec_name # => "example-1.0.gemspec"

  def spec_name
    "#{full_name}.gemspec"
  end

  ##
  # A short summary of this gem's description.

  def summary=(str)
    @summary = str.to_s.strip.
      gsub(/(\w-)\n[ \t]*(\w)/, '\1\2').gsub(/\n[ \t]*/, " ") # so. weird.
  end

  ##
  # Singular accessor for #test_files

  def test_file # :nodoc:
    (val = test_files) && val.first
  end

  ##
  # Singular mutator for #test_files

  def test_file=(file) # :nodoc:
    self.test_files = [file]
  end

  ##
  # Test files included in this gem.  You cannot append to this accessor, you
  # must assign to it.

  def test_files # :nodoc:
    # Handle the possibility that we have @test_suite_file but not
    # @test_files.  This will happen when an old gem is loaded via
    # YAML.
    if defined? @test_suite_file
      @test_files = [@test_suite_file].flatten
      @test_suite_file = nil
    end
    if defined?(@test_files) && @test_files
      @test_files
    else
      @test_files = []
    end
  end

  ##
  # Returns a Ruby code representation of this specification, such that it can
  # be eval'ed and reconstruct the same specification later.  Attributes that
  # still have their default values are omitted.

  def to_ruby
    mark_version
    result = []
    result << "# -*- encoding: utf-8 -*-"
    result << "#{Gem::StubSpecification::PREFIX}#{name} #{version} #{platform} #{raw_require_paths.join("\0")}"
    result << "#{Gem::StubSpecification::PREFIX}#{extensions.join "\0"}" unless
      extensions.empty?
    result << nil
    result << "Gem::Specification.new do |s|"

    result << "  s.name = #{ruby_code name}"
    result << "  s.version = #{ruby_code version}"
    unless platform.nil? || platform == Gem::Platform::RUBY
      result << "  s.platform = #{ruby_code original_platform}"
    end
    result << ""
    result << "  s.required_rubygems_version = #{ruby_code required_rubygems_version} if s.respond_to? :required_rubygems_version="

    if metadata && !metadata.empty?
      result << "  s.metadata = #{ruby_code metadata} if s.respond_to? :metadata="
    end
    result << "  s.require_paths = #{ruby_code raw_require_paths}"

    handled = [
      :dependencies,
      :name,
      :platform,
      :require_paths,
      :required_rubygems_version,
      :specification_version,
      :version,
      :has_rdoc,
      :default_executable,
      :metadata,
      :signing_key,
    ]

    @@attributes.each do |attr_name|
      next if handled.include? attr_name
      current_value = self.send(attr_name)
      if current_value != default_value(attr_name) || self.class.required_attribute?(attr_name)
        result << "  s.#{attr_name} = #{ruby_code current_value}"
      end
    end

    if String === signing_key
      result << "  s.signing_key = #{signing_key.dump}.freeze"
    end

    if @installed_by_version
      result << nil
      result << "  s.installed_by_version = \"#{Gem::VERSION}\" if s.respond_to? :installed_by_version"
    end

    unless dependencies.empty?
      result << nil
      result << "  if s.respond_to? :specification_version then"
      result << "    s.specification_version = #{specification_version}"
      result << "  end"
      result << nil

      result << "  if s.respond_to? :add_runtime_dependency then"

      dependencies.each do |dep|
        req = dep.requirements_list.inspect
        dep.instance_variable_set :@type, :runtime if dep.type.nil? # HACK
        result << "    s.add_#{dep.type}_dependency(%q<#{dep.name}>.freeze, #{req})"
      end

      result << "  else"
      dependencies.each do |dep|
        version_reqs_param = dep.requirements_list.inspect
        result << "    s.add_dependency(%q<#{dep.name}>.freeze, #{version_reqs_param})"
      end
      result << "  end"
    end

    result << "end"
    result << nil

    result.join "\n"
  end

  ##
  # Returns a Ruby lighter-weight code representation of this specification,
  # used for indexing only.
  #
  # See #to_ruby.

  def to_ruby_for_cache
    for_cache.to_ruby
  end

  def to_s # :nodoc:
    "#<Gem::Specification name=#{@name} version=#{@version}>"
  end

  ##
  # Returns self

  def to_spec
    self
  end

  def to_yaml(opts = {}) # :nodoc:
    Gem.load_yaml

    # Because the user can switch the YAML engine behind our
    # back, we have to check again here to make sure that our
    # psych code was properly loaded, and load it if not.
    unless Gem.const_defined?(:NoAliasYAMLTree)
      require_relative "psych_tree"
    end

    builder = Gem::NoAliasYAMLTree.create
    builder << self
    ast = builder.tree

    require "stringio"
    io = StringIO.new
    io.set_encoding Encoding::UTF_8

    Psych::Visitors::Emitter.new(io).accept(ast)

    io.string.gsub(/ !!null \n/, " \n")
  end

  ##
  # Recursively walk dependencies of this spec, executing the +block+ for each
  # hop.

  def traverse(trail = [], visited = {}, &block)
    trail.push(self)
    begin
      dependencies.each do |dep|
        next unless dep.runtime?
        dep.matching_specs(true).each do |dep_spec|
          next if visited.has_key?(dep_spec)
          visited[dep_spec] = true
          trail.push(dep_spec)
          begin
            result = block[self, dep, dep_spec, trail]
          ensure
            trail.pop
          end
          unless result == :next
            spec_name = dep_spec.name
            dep_spec.traverse(trail, visited, &block) unless
              trail.any? {|s| s.name == spec_name }
          end
        end
      end
    ensure
      trail.pop
    end
  end

  ##
  # Checks that the specification contains all required fields, and does a
  # very basic sanity check.
  #
  # Raises InvalidSpecificationException if the spec does not pass the
  # checks..

  def validate(packaging = true, strict = false)
    normalize

    validation_policy = Gem::SpecificationPolicy.new(self)
    validation_policy.packaging = packaging
    validation_policy.validate(strict)
  end

  def keep_only_files_and_directories
    @executables.delete_if      {|x| File.directory?(File.join(@bindir, x)) }
    @extensions.delete_if       {|x| File.directory?(x) && !File.symlink?(x) }
    @extra_rdoc_files.delete_if {|x| File.directory?(x) && !File.symlink?(x) }
    @files.delete_if            {|x| File.directory?(x) && !File.symlink?(x) }
    @test_files.delete_if       {|x| File.directory?(x) && !File.symlink?(x) }
  end

  def validate_metadata
    Gem::SpecificationPolicy.new(self).validate_metadata
  end
  rubygems_deprecate :validate_metadata

  def validate_dependencies
    Gem::SpecificationPolicy.new(self).validate_dependencies
  end
  rubygems_deprecate :validate_dependencies

  def validate_permissions
    Gem::SpecificationPolicy.new(self).validate_permissions
  end
  rubygems_deprecate :validate_permissions

  ##
  # Set the version to +version+, potentially also setting
  # required_rubygems_version if +version+ indicates it is a
  # prerelease.

  def version=(version)
    @version = Gem::Version.create(version)
    return if @version.nil?

    # skip to set required_ruby_version when pre-released rubygems.
    # It caused to raise CircularDependencyError
    if @version.prerelease? && (@name.nil? || @name.strip != "rubygems")
      self.required_rubygems_version = "> 1.3.1"
    end
    invalidate_memoized_attributes

    return @version
  end

  def stubbed?
    false
  end

  def yaml_initialize(tag, vals) # :nodoc:
    vals.each do |ivar, val|
      case ivar
      when "date"
        # Force Date to go through the extra coerce logic in date=
        self.date = val.tap(&Gem::UNTAINT)
      else
        instance_variable_set "@#{ivar}", val.tap(&Gem::UNTAINT)
      end
    end

    @original_platform = @platform # for backwards compatibility
    self.platform = Gem::Platform.new @platform
  end

  ##
  # Reset nil attributes to their default values to make the spec valid

  def reset_nil_attributes_to_default
    nil_attributes = self.class.non_nil_attributes.find_all do |name|
      !instance_variable_defined?("@#{name}") || instance_variable_get("@#{name}").nil?
    end

    nil_attributes.each do |attribute|
      default = self.default_value attribute

      value = case default
      when Time, Numeric, Symbol, true, false, nil then default
      else default.dup
      end

      instance_variable_set "@#{attribute}", value
    end

    @installed_by_version ||= nil
  end

  def flatten_require_paths # :nodoc:
    return unless raw_require_paths.first.is_a?(Array)

    warn "#{name} #{version} includes a gemspec with `require_paths` set to an array of arrays. Newer versions of this gem might've already fixed this"
    raw_require_paths.flatten!
  end

  def raw_require_paths # :nodoc:
    @require_paths
  end
end
PK}$[��rubygems/rubygems/psych_tree.rbnu�[���# frozen_string_literal: true
module Gem
  if defined? ::Psych::Visitors
    class NoAliasYAMLTree < Psych::Visitors::YAMLTree
      def self.create
        new({})
      end unless respond_to? :create

      def visit_String(str)
        return super unless str == "=" # or whatever you want

        quote = Psych::Nodes::Scalar::SINGLE_QUOTED
        @emitter.scalar str, nil, nil, false, true, quote
      end

      # Noop this out so there are no anchors
      def register(target, obj)
      end

      # This is ported over from the yaml_tree in 1.9.3
      def format_time(time)
        if time.utc?
          time.strftime("%Y-%m-%d %H:%M:%S.%9N Z")
        else
          time.strftime("%Y-%m-%d %H:%M:%S.%9N %:z")
        end
      end

      private :format_time
    end
  end
end
PK}$[��޶rubygems/rubygems/safe_yaml.rbnu�[���module Gem

  ###
  # This module is used for safely loading YAML specs from a gem.  The
  # `safe_load` method defined on this module is specifically designed for
  # loading Gem specifications.  For loading other YAML safely, please see
  # Psych.safe_load

  module SafeYAML
    PERMITTED_CLASSES = %w[
      Symbol
      Time
      Date
      Gem::Dependency
      Gem::Platform
      Gem::Requirement
      Gem::Specification
      Gem::Version
      Gem::Version::Requirement
    ].freeze

    PERMITTED_SYMBOLS = %w[
      development
      runtime
    ].freeze

    if ::Psych.respond_to? :safe_load
      def self.safe_load(input)
        if Gem::Version.new(Psych::VERSION) >= Gem::Version.new("3.1.0.pre1")
          ::Psych.safe_load(input, permitted_classes: PERMITTED_CLASSES, permitted_symbols: PERMITTED_SYMBOLS, aliases: true)
        else
          ::Psych.safe_load(input, PERMITTED_CLASSES, PERMITTED_SYMBOLS, true)
        end
      end

      def self.load(input)
        if Gem::Version.new(Psych::VERSION) >= Gem::Version.new("3.1.0.pre1")
          ::Psych.safe_load(input, permitted_classes: [::Symbol])
        else
          ::Psych.safe_load(input, [::Symbol])
        end
      end
    else
      unless Gem::Deprecate.skip
        warn "Psych safe loading is not available. Please upgrade psych to a version that supports safe loading (>= 2.0)."
      end

      def self.safe_load(input, *args)
        ::Psych.load input
      end

      def self.load(input)
        ::Psych.load input
      end
    end
  end
end
PK}$[��E�"rubygems/rubygems/compatibility.rbnu�[���# frozen_string_literal: true

#--
# This file contains all sorts of little compatibility hacks that we've
# had to introduce over the years. Quarantining them into one file helps
# us know when we can get rid of them.
#
# Ruby 1.9.x has introduced some things that are awkward, and we need to
# support them, so we define some constants to use later.
#
# TODO remove at RubyGems 4
#++

module Gem
  # :stopdoc:

  RubyGemsVersion = VERSION
  deprecate_constant(:RubyGemsVersion)

  RbConfigPriorities = %w[
    MAJOR
    MINOR
    TEENY
    EXEEXT RUBY_SO_NAME arch bindir datadir libdir ruby_install_name
    ruby_version rubylibprefix sitedir sitelibdir vendordir vendorlibdir
    rubylibdir
  ].freeze

  unless defined?(ConfigMap)
    ##
    # Configuration settings from ::RbConfig
    ConfigMap = Hash.new do |cm, key|
      cm[key] = RbConfig::CONFIG[key.to_s]
    end
    deprecate_constant(:ConfigMap)
  else
    RbConfigPriorities.each do |key|
      ConfigMap[key.to_sym] = RbConfig::CONFIG[key]
    end
  end

end
PK}$[�=�w�	�	rubygems/rubygems/name_tuple.rbnu�[���# frozen_string_literal: true
##
#
# Represents a gem of name +name+ at +version+ of +platform+. These
# wrap the data returned from the indexes.

class Gem::NameTuple
  def initialize(name, version, platform="ruby")
    @name = name
    @version = version

    unless platform.kind_of? Gem::Platform
      platform = "ruby" if !platform || platform.empty?
    end

    @platform = platform
  end

  attr_reader :name, :version, :platform

  ##
  # Turn an array of [name, version, platform] into an array of
  # NameTuple objects.

  def self.from_list(list)
    list.map {|t| new(*t) }
  end

  ##
  # Turn an array of NameTuple objects back into an array of
  # [name, version, platform] tuples.

  def self.to_basic(list)
    list.map {|t| t.to_a }
  end

  ##
  # A null NameTuple, ie name=nil, version=0

  def self.null
    new nil, Gem::Version.new(0), nil
  end

  ##
  # Returns the full name (name-version) of this Gem.  Platform information is
  # included if it is not the default Ruby platform.  This mimics the behavior
  # of Gem::Specification#full_name.

  def full_name
    case @platform
    when nil, "ruby", ""
      "#{@name}-#{@version}"
    else
      "#{@name}-#{@version}-#{@platform}"
    end.dup.tap(&Gem::UNTAINT)
  end

  ##
  # Indicate if this NameTuple matches the current platform.

  def match_platform?
    Gem::Platform.match_gem? @platform, @name
  end

  ##
  # Indicate if this NameTuple is for a prerelease version.
  def prerelease?
    @version.prerelease?
  end

  ##
  # Return the name that the gemspec file would be

  def spec_name
    "#{full_name}.gemspec"
  end

  ##
  # Convert back to the [name, version, platform] tuple

  def to_a
    [@name, @version, @platform]
  end

  def inspect # :nodoc:
    "#<Gem::NameTuple #{@name}, #{@version}, #{@platform}>"
  end

  alias to_s inspect # :nodoc:

  def <=>(other)
    [@name, @version, Gem::Platform.sort_priority(@platform)] <=>
      [other.name, other.version, Gem::Platform.sort_priority(other.platform)]
  end

  include Comparable

  ##
  # Compare with +other+. Supports another NameTuple or an Array
  # in the [name, version, platform] format.

  def ==(other)
    case other
    when self.class
      @name == other.name &&
        @version == other.version &&
        @platform == other.platform
    when Array
      to_a == other
    else
      false
    end
  end

  alias_method :eql?, :==

  def hash
    to_a.hash
  end
end
PK}$[�l��F?F?rubygems/rubygems/command.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require_relative "optparse"
require_relative "requirement"
require_relative "user_interaction"

##
# Base class for all Gem commands.  When creating a new gem command, define
# #initialize, #execute, #arguments, #defaults_str, #description and #usage
# (as appropriate).  See the above mentioned methods for details.
#
# A very good example to look at is Gem::Commands::ContentsCommand

class Gem::Command
  include Gem::UserInteraction

  Gem::OptionParser.accept Symbol do |value|
    value.to_sym
  end

  ##
  # The name of the command.

  attr_reader :command

  ##
  # The options for the command.

  attr_reader :options

  ##
  # The default options for the command.

  attr_accessor :defaults

  ##
  # The name of the command for command-line invocation.

  attr_accessor :program_name

  ##
  # A short description of the command.

  attr_accessor :summary

  ##
  # Arguments used when building gems

  def self.build_args
    @build_args ||= []
  end

  def self.build_args=(value)
    @build_args = value
  end

  def self.common_options
    @common_options ||= []
  end

  def self.add_common_option(*args, &handler)
    Gem::Command.common_options << [args, handler]
  end

  def self.extra_args
    @extra_args ||= []
  end

  def self.extra_args=(value)
    case value
    when Array
      @extra_args = value
    when String
      @extra_args = value.split(" ")
    end
  end

  ##
  # Return an array of extra arguments for the command.  The extra arguments
  # come from the gem configuration file read at program startup.

  def self.specific_extra_args(cmd)
    specific_extra_args_hash[cmd]
  end

  ##
  # Add a list of extra arguments for the given command.  +args+ may be an
  # array or a string to be split on white space.

  def self.add_specific_extra_args(cmd,args)
    args = args.split(/\s+/) if args.kind_of? String
    specific_extra_args_hash[cmd] = args
  end

  ##
  # Accessor for the specific extra args hash (self initializing).

  def self.specific_extra_args_hash
    @specific_extra_args_hash ||= Hash.new do |h,k|
      h[k] = Array.new
    end
  end

  ##
  # Initializes a generic gem command named +command+.  +summary+ is a short
  # description displayed in `gem help commands`.  +defaults+ are the default
  # options.  Defaults should be mirrored in #defaults_str, unless there are
  # none.
  #
  # When defining a new command subclass, use add_option to add command-line
  # switches.
  #
  # Unhandled arguments (gem names, files, etc.) are left in
  # <tt>options[:args]</tt>.

  def initialize(command, summary=nil, defaults={})
    @command = command
    @summary = summary
    @program_name = "gem #{command}"
    @defaults = defaults
    @options = defaults.dup
    @option_groups = Hash.new {|h,k| h[k] = [] }
    @deprecated_options = { command => {} }
    @parser = nil
    @when_invoked = nil
  end

  ##
  # True if +long+ begins with the characters from +short+.

  def begins?(long, short)
    return false if short.nil?
    long[0, short.length] == short
  end

  ##
  # Override to provide command handling.
  #
  # #options will be filled in with your parsed options, unparsed options will
  # be left in <tt>options[:args]</tt>.
  #
  # See also: #get_all_gem_names, #get_one_gem_name,
  # #get_one_optional_argument

  def execute
    raise Gem::Exception, "generic command has no actions"
  end

  ##
  # Display to the user that a gem couldn't be found and reasons why
  #--

  def show_lookup_failure(gem_name, version, errors, suppress_suggestions = false, required_by = nil)
    gem = "'#{gem_name}' (#{version})"
    msg = String.new "Could not find a valid gem #{gem}"

    if errors && !errors.empty?
      msg << ", here is why:\n"
      errors.each {|x| msg << "          #{x.wordy}\n" }
    else
      if required_by && gem != required_by
        msg << " (required by #{required_by}) in any repository"
      else
        msg << " in any repository"
      end
    end

    alert_error msg

    unless suppress_suggestions
      suggestions = Gem::SpecFetcher.fetcher.suggest_gems_from_name(gem_name, :latest, 10)
      unless suggestions.empty?
        alert_error "Possible alternatives: #{suggestions.join(", ")}"
      end
    end
  end

  ##
  # Get all gem names from the command line.

  def get_all_gem_names
    args = options[:args]

    if args.nil? || args.empty?
      raise Gem::CommandLineError,
            "Please specify at least one gem name (e.g. gem build GEMNAME)"
    end

    args.select {|arg| arg !~ /^-/ }
  end

  ##
  # Get all [gem, version] from the command line.
  #
  # An argument in the form gem:ver is pull apart into the gen name and version,
  # respectively.
  def get_all_gem_names_and_versions
    get_all_gem_names.map do |name|
      if /\A(.*):(#{Gem::Requirement::PATTERN_RAW})\z/ =~ name
        [$1, $2]
      else
        [name]
      end
    end
  end

  ##
  # Get a single gem name from the command line.  Fail if there is no gem name
  # or if there is more than one gem name given.

  def get_one_gem_name
    args = options[:args]

    if args.nil? || args.empty?
      raise Gem::CommandLineError,
            "Please specify a gem name on the command line (e.g. gem build GEMNAME)"
    end

    if args.size > 1
      raise Gem::CommandLineError,
            "Too many gem names (#{args.join(', ')}); please specify only one"
    end

    args.first
  end

  ##
  # Get a single optional argument from the command line.  If more than one
  # argument is given, return only the first. Return nil if none are given.

  def get_one_optional_argument
    args = options[:args] || []
    args.first
  end

  ##
  # Override to provide details of the arguments a command takes.  It should
  # return a left-justified string, one argument per line.
  #
  # For example:
  #
  #   def usage
  #     "#{program_name} FILE [FILE ...]"
  #   end
  #
  #   def arguments
  #     "FILE          name of file to find"
  #   end

  def arguments
    ""
  end

  ##
  # Override to display the default values of the command options. (similar to
  # +arguments+, but displays the default values).
  #
  # For example:
  #
  #   def defaults_str
  #     --no-gems-first --no-all
  #   end

  def defaults_str
    ""
  end

  ##
  # Override to display a longer description of what this command does.

  def description
    nil
  end

  ##
  # Override to display the usage for an individual gem command.
  #
  # The text "[options]" is automatically appended to the usage text.

  def usage
    program_name
  end

  ##
  # Display the help message for the command.

  def show_help
    parser.program_name = usage
    say parser
  end

  ##
  # Invoke the command with the given list of arguments.

  def invoke(*args)
    invoke_with_build_args args, nil
  end

  ##
  # Invoke the command with the given list of normal arguments
  # and additional build arguments.

  def invoke_with_build_args(args, build_args)
    handle_options args

    options[:build_args] = build_args

    if options[:silent]
      old_ui = self.ui
      self.ui = ui = Gem::SilentUI.new
    end

    if options[:help]
      show_help
    elsif @when_invoked
      @when_invoked.call options
    else
      execute
    end
  ensure
    if ui
      self.ui = old_ui
      ui.close
    end
  end

  ##
  # Call the given block when invoked.
  #
  # Normal command invocations just executes the +execute+ method of the
  # command.  Specifying an invocation block allows the test methods to
  # override the normal action of a command to determine that it has been
  # invoked correctly.

  def when_invoked(&block)
    @when_invoked = block
  end

  ##
  # Add a command-line option and handler to the command.
  #
  # See Gem::OptionParser#make_switch for an explanation of +opts+.
  #
  # +handler+ will be called with two values, the value of the argument and
  # the options hash.
  #
  # If the first argument of add_option is a Symbol, it's used to group
  # options in output.  See `gem help list` for an example.

  def add_option(*opts, &handler) # :yields: value, options
    group_name = Symbol === opts.first ? opts.shift : :options

    raise "Do not pass an empty string in opts" if opts.include?("")

    @option_groups[group_name] << [opts, handler]
  end

  ##
  # Remove previously defined command-line argument +name+.

  def remove_option(name)
    @option_groups.each do |_, option_list|
      option_list.reject! {|args, _| args.any? {|x| x.is_a?(String) && x =~ /^#{name}/ } }
    end
  end

  ##
  # Mark a command-line option as deprecated, and optionally specify a
  # deprecation horizon.
  #
  # Note that with the current implementation, every version of the option needs
  # to be explicitly deprecated, so to deprecate an option defined as
  #
  #   add_option('-t', '--[no-]test', 'Set test mode') do |value, options|
  #     # ... stuff ...
  #   end
  #
  # you would need to explicitly add a call to `deprecate_option` for every
  # version of the option you want to deprecate, like
  #
  #   deprecate_option('-t')
  #   deprecate_option('--test')
  #   deprecate_option('--no-test')

  def deprecate_option(name, version: nil, extra_msg: nil)
    @deprecated_options[command].merge!({ name => { "rg_version_to_expire" => version, "extra_msg" => extra_msg } })
  end

  def check_deprecated_options(options)
    options.each do |option|
      if option_is_deprecated?(option)
        deprecation = @deprecated_options[command][option]
        version_to_expire = deprecation["rg_version_to_expire"]

        deprecate_option_msg = if version_to_expire
          "The \"#{option}\" option has been deprecated and will be removed in Rubygems #{version_to_expire}."
        else
          "The \"#{option}\" option has been deprecated and will be removed in future versions of Rubygems."
        end

        extra_msg = deprecation["extra_msg"]

        deprecate_option_msg += " #{extra_msg}" if extra_msg

        alert_warning(deprecate_option_msg)
      end
    end
  end

  ##
  # Merge a set of command options with the set of default options (without
  # modifying the default option hash).

  def merge_options(new_options)
    @options = @defaults.clone
    new_options.each {|k,v| @options[k] = v }
  end

  ##
  # True if the command handles the given argument list.

  def handles?(args)
    begin
      parser.parse!(args.dup)
      return true
    rescue
      return false
    end
  end

  ##
  # Handle the given list of arguments by parsing them and recording the
  # results.

  def handle_options(args)
    args = add_extra_args(args)
    check_deprecated_options(args)
    @options = Marshal.load Marshal.dump @defaults # deep copy
    parser.parse!(args)
    @options[:args] = args
  end

  ##
  # Adds extra args from ~/.gemrc

  def add_extra_args(args)
    result = []

    s_extra = Gem::Command.specific_extra_args(@command)
    extra = Gem::Command.extra_args + s_extra

    until extra.empty? do
      ex = []
      ex << extra.shift
      ex << extra.shift if extra.first.to_s =~ /^[^-]/ # rubocop:disable Performance/StartWith
      result << ex if handles?(ex)
    end

    result.flatten!
    result.concat(args)
    result
  end

  def deprecated?
    false
  end

  private

  def option_is_deprecated?(option)
    @deprecated_options[command].has_key?(option)
  end

  def add_parser_description # :nodoc:
    return unless description

    formatted = description.split("\n\n").map do |chunk|
      wrap chunk, 80 - 4
    end.join "\n"

    @parser.separator nil
    @parser.separator "  Description:"
    formatted.split("\n").each do |line|
      @parser.separator "    #{line.rstrip}"
    end
  end

  def add_parser_options # :nodoc:
    @parser.separator nil

    regular_options = @option_groups.delete :options

    configure_options "", regular_options

    @option_groups.sort_by {|n,_| n.to_s }.each do |group_name, option_list|
      @parser.separator nil
      configure_options group_name, option_list
    end
  end

  ##
  # Adds a section with +title+ and +content+ to the parser help view.  Used
  # for adding command arguments and default arguments.

  def add_parser_run_info(title, content)
    return if content.empty?

    @parser.separator nil
    @parser.separator "  #{title}:"
    content.split(/\n/).each do |line|
      @parser.separator "    #{line}"
    end
  end

  def add_parser_summary # :nodoc:
    return unless @summary

    @parser.separator nil
    @parser.separator "  Summary:"
    wrap(@summary, 80 - 4).split("\n").each do |line|
      @parser.separator "    #{line.strip}"
    end
  end

  ##
  # Create on demand parser.

  def parser
    create_option_parser if @parser.nil?
    @parser
  end

  ##
  # Creates an option parser and fills it in with the help info for the
  # command.

  def create_option_parser
    @parser = Gem::OptionParser.new

    add_parser_options

    @parser.separator nil
    configure_options "Common", Gem::Command.common_options

    add_parser_run_info "Arguments", arguments
    add_parser_summary
    add_parser_description
    add_parser_run_info "Defaults", defaults_str
  end

  def configure_options(header, option_list)
    return if option_list.nil? || option_list.empty?

    header = header.to_s.empty? ? "" : "#{header} "
    @parser.separator "  #{header}Options:"

    option_list.each do |args, handler|
      @parser.on(*args) do |value|
        handler.call(value, @options)
      end
    end

    @parser.separator ""
  end

  ##
  # Wraps +text+ to +width+

  def wrap(text, width) # :doc:
    text.gsub(/(.{1,#{width}})( +|$\n?)|(.{1,#{width}})/, "\\1\\3\n")
  end

  # ----------------------------------------------------------------
  # Add the options common to all commands.

  add_common_option("-h", "--help",
                    "Get help on this command") do |value, options|
    options[:help] = true
  end

  add_common_option("-V", "--[no-]verbose",
                    "Set the verbose level of output") do |value, options|
    # Set us to "really verbose" so the progress meter works
    if Gem.configuration.verbose && value
      Gem.configuration.verbose = 1
    else
      Gem.configuration.verbose = value
    end
  end

  add_common_option("-q", "--quiet", "Silence command progress meter") do |value, options|
    Gem.configuration.verbose = false
  end

  add_common_option("--silent",
                    "Silence RubyGems output") do |value, options|
    options[:silent] = true
  end

  # Backtrace and config-file are added so they show up in the help
  # commands.  Both options are actually handled before the other
  # options get parsed.

  add_common_option("--config-file FILE",
                    "Use this config file instead of default") do
  end

  add_common_option("--backtrace",
                    "Show stack backtrace on errors") do
  end

  add_common_option("--debug",
                    "Turn on Ruby debugging") do
  end

  add_common_option("--norc",
                    "Avoid loading any .gemrc file") do
  end

  # :stopdoc:

  HELP = <<-HELP.freeze
RubyGems is a package manager for Ruby.

  Usage:
    gem -h/--help
    gem -v/--version
    gem command [arguments...] [options...]

  Examples:
    gem install rake
    gem list --local
    gem build package.gemspec
    gem push package-0.0.1.gem
    gem help install

  Further help:
    gem help commands            list all 'gem' commands
    gem help examples            show some examples of usage
    gem help gem_dependencies    gem dependencies file guide
    gem help platforms           gem platforms guide
    gem help <COMMAND>           show help on COMMAND
                                   (e.g. 'gem help install')
    gem server                   present a web page at
                                 http://localhost:8808/
                                 with info about installed gems
  Further information:
    https://guides.rubygems.org
  HELP

  # :startdoc:
end

##
# \Commands will be placed in this namespace

module Gem::Commands
end
PK}$[$�1��"rubygems/rubygems/s3_uri_signer.rbnu�[���require_relative "openssl"

##
# S3URISigner implements AWS SigV4 for S3 Source to avoid a dependency on the aws-sdk-* gems
# More on AWS SigV4: https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html
class Gem::S3URISigner
  class ConfigurationError < Gem::Exception
    def initialize(message)
      super message
    end

    def to_s # :nodoc:
      "#{super}"
    end
  end

  class InstanceProfileError < Gem::Exception
    def initialize(message)
      super message
    end

    def to_s # :nodoc:
      "#{super}"
    end
  end

  attr_accessor :uri

  def initialize(uri)
    @uri = uri
  end

  ##
  # Signs S3 URI using query-params according to the reference: https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html
  def sign(expiration = 86400)
    s3_config = fetch_s3_config

    current_time = Time.now.utc
    date_time = current_time.strftime("%Y%m%dT%H%m%SZ")
    date = date_time[0,8]

    credential_info = "#{date}/#{s3_config.region}/s3/aws4_request"
    canonical_host = "#{uri.host}.s3.#{s3_config.region}.amazonaws.com"

    query_params = generate_canonical_query_params(s3_config, date_time, credential_info, expiration)
    canonical_request = generate_canonical_request(canonical_host, query_params)
    string_to_sign = generate_string_to_sign(date_time, credential_info, canonical_request)
    signature = generate_signature(s3_config, date, string_to_sign)

    URI.parse("https://#{canonical_host}#{uri.path}?#{query_params}&X-Amz-Signature=#{signature}")
  end

  private

  S3Config = Struct.new :access_key_id, :secret_access_key, :security_token, :region

  def generate_canonical_query_params(s3_config, date_time, credential_info, expiration)
    canonical_params = {}
    canonical_params["X-Amz-Algorithm"] = "AWS4-HMAC-SHA256"
    canonical_params["X-Amz-Credential"] = "#{s3_config.access_key_id}/#{credential_info}"
    canonical_params["X-Amz-Date"] = date_time
    canonical_params["X-Amz-Expires"] = expiration.to_s
    canonical_params["X-Amz-SignedHeaders"] = "host"
    canonical_params["X-Amz-Security-Token"] = s3_config.security_token if s3_config.security_token

    # Sorting is required to generate proper signature
    canonical_params.sort.to_h.map do |key, value|
      "#{base64_uri_escape(key)}=#{base64_uri_escape(value)}"
    end.join("&")
  end

  def generate_canonical_request(canonical_host, query_params)
    [
      "GET",
      uri.path,
      query_params,
      "host:#{canonical_host}",
      "", # empty params
      "host",
      "UNSIGNED-PAYLOAD",
    ].join("\n")
  end

  def generate_string_to_sign(date_time, credential_info, canonical_request)
    [
      "AWS4-HMAC-SHA256",
      date_time,
      credential_info,
      OpenSSL::Digest::SHA256.hexdigest(canonical_request),
    ].join("\n")
  end

  def generate_signature(s3_config, date, string_to_sign)
    date_key = OpenSSL::HMAC.digest("sha256", "AWS4" + s3_config.secret_access_key, date)
    date_region_key = OpenSSL::HMAC.digest("sha256", date_key, s3_config.region)
    date_region_service_key = OpenSSL::HMAC.digest("sha256", date_region_key, "s3")
    signing_key = OpenSSL::HMAC.digest("sha256", date_region_service_key, "aws4_request")
    OpenSSL::HMAC.hexdigest("sha256", signing_key, string_to_sign)
  end

  ##
  # Extracts S3 configuration for S3 bucket
  def fetch_s3_config
    return S3Config.new(uri.user, uri.password, nil, "us-east-1") if uri.user && uri.password

    s3_source = Gem.configuration[:s3_source] || Gem.configuration["s3_source"]
    host = uri.host
    raise ConfigurationError.new("no s3_source key exists in .gemrc") unless s3_source

    auth = s3_source[host] || s3_source[host.to_sym]
    raise ConfigurationError.new("no key for host #{host} in s3_source in .gemrc") unless auth

    provider = auth[:provider] || auth["provider"]
    case provider
    when "env"
      id = ENV["AWS_ACCESS_KEY_ID"]
      secret = ENV["AWS_SECRET_ACCESS_KEY"]
      security_token = ENV["AWS_SESSION_TOKEN"]
    when "instance_profile"
      credentials = ec2_metadata_credentials_json
      id = credentials["AccessKeyId"]
      secret = credentials["SecretAccessKey"]
      security_token = credentials["Token"]
    else
      id = auth[:id] || auth["id"]
      secret = auth[:secret] || auth["secret"]
      security_token = auth[:security_token] || auth["security_token"]
    end

    raise ConfigurationError.new("s3_source for #{host} missing id or secret") unless id && secret

    region = auth[:region] || auth["region"] || "us-east-1"
    S3Config.new(id, secret, security_token, region)
  end

  def base64_uri_escape(str)
    str.gsub(/[\+\/=\n]/, BASE64_URI_TRANSLATE)
  end

  def ec2_metadata_credentials_json
    require "net/http"
    require_relative "request"
    require_relative "request/connection_pools"
    require "json"

    iam_info = ec2_metadata_request(EC2_IAM_INFO)
    # Expected format: arn:aws:iam::<id>:instance-profile/<role_name>
    role_name = iam_info["InstanceProfileArn"].split("/").last
    ec2_metadata_request(EC2_IAM_SECURITY_CREDENTIALS + role_name)
  end

  def ec2_metadata_request(url)
    uri = URI(url)
    @request_pool ||= create_request_pool(uri)
    request = Gem::Request.new(uri, Net::HTTP::Get, nil, @request_pool)
    response = request.fetch

    case response
    when Net::HTTPOK then
      JSON.parse(response.body)
    else
      raise InstanceProfileError.new("Unable to fetch AWS metadata from #{uri}: #{response.message} #{response.code}")
    end
  end

  def create_request_pool(uri)
    proxy_uri = Gem::Request.proxy_uri(Gem::Request.get_proxy_from_env(uri.scheme))
    certs = Gem::Request.get_cert_files
    Gem::Request::ConnectionPools.new(proxy_uri, certs).pool_for(uri)
  end

  BASE64_URI_TRANSLATE = { "+" => "%2B", "/" => "%2F", "=" => "%3D", "\n" => "" }.freeze
  EC2_IAM_INFO = "http://169.254.169.254/latest/meta-data/iam/info".freeze
  EC2_IAM_SECURITY_CREDENTIALS = "http://169.254.169.254/latest/meta-data/iam/security-credentials/".freeze
end
PK}$[(��;;$rubygems/rubygems/security_option.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require_relative "../rubygems"

# forward-declare

module Gem::Security # :nodoc:
  class Policy # :nodoc:
  end
end

##
# Mixin methods for security option for Gem::Commands

module Gem::SecurityOption
  def add_security_option
    Gem::OptionParser.accept Gem::Security::Policy do |value|
      require_relative "security"

      raise Gem::OptionParser::InvalidArgument, "OpenSSL not installed" unless
        defined?(Gem::Security::HighSecurity)

      policy = Gem::Security::Policies[value]
      unless policy
        valid = Gem::Security::Policies.keys.sort
        raise Gem::OptionParser::InvalidArgument, "#{value} (#{valid.join ', '} are valid)"
      end
      policy
    end

    add_option(:"Install/Update", "-P", "--trust-policy POLICY",
               Gem::Security::Policy,
               "Specify gem trust policy") do |value, options|
      options[:security_policy] = value
    end
  end
end
PK}$[1"�f^"^"rubygems/rubygems/dependency.rbnu�[���# frozen_string_literal: true
##
# The Dependency class holds a Gem name and a Gem::Requirement.

class Gem::Dependency
  ##
  # Valid dependency types.
  #--
  # When this list is updated, be sure to change
  # Gem::Specification::CURRENT_SPECIFICATION_VERSION as well.
  #
  # REFACTOR: This type of constant, TYPES, indicates we might want
  # two classes, used via inheritance or duck typing.

  TYPES = [
    :development,
    :runtime,
  ].freeze

  ##
  # Dependency name or regular expression.

  attr_accessor :name

  ##
  # Allows you to force this dependency to be a prerelease.

  attr_writer :prerelease

  ##
  # Constructs a dependency with +name+ and +requirements+. The last
  # argument can optionally be the dependency type, which defaults to
  # <tt>:runtime</tt>.

  def initialize(name, *requirements)
    case name
    when String then # ok
    when Regexp then
      msg = ["NOTE: Dependency.new w/ a regexp is deprecated.",
             "Dependency.new called from #{Gem.location_of_caller.join(":")}"]
      warn msg.join("\n") unless Gem::Deprecate.skip
    else
      raise ArgumentError,
            "dependency name must be a String, was #{name.inspect}"
    end

    type         = Symbol === requirements.last ? requirements.pop : :runtime
    requirements = requirements.first if 1 == requirements.length # unpack

    unless TYPES.include? type
      raise ArgumentError, "Valid types are #{TYPES.inspect}, " +
                           "not #{type.inspect}"
    end

    @name        = name
    @requirement = Gem::Requirement.create requirements
    @type        = type
    @prerelease  = false

    # This is for Marshal backwards compatibility. See the comments in
    # +requirement+ for the dirty details.

    @version_requirements = @requirement
  end

  ##
  # A dependency's hash is the XOR of the hashes of +name+, +type+,
  # and +requirement+.

  def hash # :nodoc:
    name.hash ^ type.hash ^ requirement.hash
  end

  def inspect # :nodoc:
    if prerelease?
      "<%s type=%p name=%p requirements=%p prerelease=ok>" %
        [self.class, self.type, self.name, requirement.to_s]
    else
      "<%s type=%p name=%p requirements=%p>" %
        [self.class, self.type, self.name, requirement.to_s]
    end
  end

  ##
  # Does this dependency require a prerelease?

  def prerelease?
    @prerelease || requirement.prerelease?
  end

  ##
  # Is this dependency simply asking for the latest version
  # of a gem?

  def latest_version?
    @requirement.none?
  end

  def pretty_print(q) # :nodoc:
    q.group 1, "Gem::Dependency.new(", ")" do
      q.pp name
      q.text ","
      q.breakable

      q.pp requirement

      q.text ","
      q.breakable

      q.pp type
    end
  end

  ##
  # What does this dependency require?

  def requirement
    return @requirement if defined?(@requirement) && @requirement

    # @version_requirements and @version_requirement are legacy ivar
    # names, and supported here because older gems need to keep
    # working and Dependency doesn't implement marshal_dump and
    # marshal_load. In a happier world, this would be an
    # attr_accessor. The horrifying instance_variable_get you see
    # below is also the legacy of some old restructurings.
    #
    # Note also that because of backwards compatibility (loading new
    # gems in an old RubyGems installation), we can't add explicit
    # marshaling to this class until we want to make a big
    # break. Maybe 2.0.
    #
    # Children, define explicit marshal and unmarshal behavior for
    # public classes. Marshal formats are part of your public API.

    # REFACTOR: See above

    if defined?(@version_requirement) && @version_requirement
      version = @version_requirement.instance_variable_get :@version
      @version_requirement = nil
      @version_requirements = Gem::Requirement.new version
    end

    @requirement = @version_requirements if defined?(@version_requirements)
  end

  def requirements_list
    requirement.as_list
  end

  def to_s # :nodoc:
    if type != :runtime
      "#{name} (#{requirement}, #{type})"
    else
      "#{name} (#{requirement})"
    end
  end

  ##
  # Dependency type.

  def type
    @type ||= :runtime
  end

  def runtime?
    @type == :runtime || !@type
  end

  def ==(other) # :nodoc:
    Gem::Dependency === other &&
      self.name        == other.name &&
      self.type        == other.type &&
      self.requirement == other.requirement
  end

  ##
  # Dependencies are ordered by name.

  def <=>(other)
    self.name <=> other.name
  end

  ##
  # Uses this dependency as a pattern to compare to +other+. This
  # dependency will match if the name matches the other's name, and
  # other has only an equal version requirement that satisfies this
  # dependency.

  def =~(other)
    unless Gem::Dependency === other
      return unless other.respond_to?(:name) && other.respond_to?(:version)
      other = Gem::Dependency.new other.name, other.version
    end

    return false unless name === other.name

    reqs = other.requirement.requirements

    return false unless reqs.length == 1
    return false unless reqs.first.first == "="

    version = reqs.first.last

    requirement.satisfied_by? version
  end

  alias === =~

  ##
  # :call-seq:
  #   dep.match? name          => true or false
  #   dep.match? name, version => true or false
  #   dep.match? spec          => true or false
  #
  # Does this dependency match the specification described by +name+ and
  # +version+ or match +spec+?
  #
  # NOTE:  Unlike #matches_spec? this method does not return true when the
  # version is a prerelease version unless this is a prerelease dependency.

  def match?(obj, version=nil, allow_prerelease=false)
    if !version
      name = obj.name
      version = obj.version
    else
      name = obj
    end

    return false unless self.name === name

    version = Gem::Version.new version

    return true if requirement.none? && !version.prerelease?
    return false if version.prerelease? &&
                    !allow_prerelease &&
                    !prerelease?

    requirement.satisfied_by? version
  end

  ##
  # Does this dependency match +spec+?
  #
  # NOTE:  This is not a convenience method.  Unlike #match? this method
  # returns true when +spec+ is a prerelease version even if this dependency
  # is not a prerelease dependency.

  def matches_spec?(spec)
    return false unless name === spec.name
    return true  if requirement.none?

    requirement.satisfied_by?(spec.version)
  end

  ##
  # Merges the requirements of +other+ into this dependency

  def merge(other)
    unless name == other.name
      raise ArgumentError,
            "#{self} and #{other} have different names"
    end

    default = Gem::Requirement.default
    self_req = self.requirement
    other_req = other.requirement

    return self.class.new name, self_req  if other_req == default
    return self.class.new name, other_req if self_req  == default

    self.class.new name, self_req.as_list.concat(other_req.as_list)
  end

  def matching_specs(platform_only = false)
    env_req = Gem.env_requirement(name)
    matches = Gem::Specification.stubs_for(name).find_all do |spec|
      requirement.satisfied_by?(spec.version) && env_req.satisfied_by?(spec.version)
    end.map(&:to_spec)

    Gem::BundlerVersionFinder.prioritize!(matches) if prioritizes_bundler?

    if platform_only
      matches.reject! do |spec|
        spec.nil? || !Gem::Platform.match_spec?(spec)
      end
    end

    matches
  end

  ##
  # True if the dependency will not always match the latest version.

  def specific?
    @requirement.specific?
  end

  def prioritizes_bundler?
    name == "bundler".freeze && !specific?
  end

  def to_specs
    matches = matching_specs true

    # TODO: check Gem.activated_spec[self.name] in case matches falls outside

    if matches.empty?
      specs = Gem::Specification.stubs_for name

      if specs.empty?
        raise Gem::MissingSpecError.new name, requirement
      else
        raise Gem::MissingSpecVersionError.new name, requirement, specs
      end
    end

    # TODO: any other resolver validations should go here

    matches
  end

  def to_spec
    matches = self.to_specs.compact

    active = matches.find {|spec| spec.activated? }
    return active if active

    unless prerelease?
      # Move prereleases to the end of the list for >= 0 requirements
      pre, matches = matches.partition {|spec| spec.version.prerelease? }
      matches += pre if requirement == Gem::Requirement.default
    end

    matches.first
  end

  def identity
    if prerelease?
      if specific?
        :complete
      else
        :abs_latest
      end
    elsif latest_version?
      :latest
    else
      :released
    end
  end
end
PK}$[x��44%rubygems/rubygems/user_interaction.rbnu�[���# frozen_string_literal: true
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require_relative "deprecate"
require_relative "text"

##
# Module that defines the default UserInteraction.  Any class including this
# module will have access to the +ui+ method that returns the default UI.

module Gem::DefaultUserInteraction

  include Gem::Text

  ##
  # The default UI is a class variable of the singleton class for this
  # module.

  @ui = nil

  ##
  # Return the default UI.

  def self.ui
    @ui ||= Gem::ConsoleUI.new
  end

  ##
  # Set the default UI.  If the default UI is never explicitly set, a simple
  # console based UserInteraction will be used automatically.

  def self.ui=(new_ui)
    @ui = new_ui
  end

  ##
  # Use +new_ui+ for the duration of +block+.

  def self.use_ui(new_ui)
    old_ui = @ui
    @ui = new_ui
    yield
  ensure
    @ui = old_ui
  end

  ##
  # See DefaultUserInteraction::ui

  def ui
    Gem::DefaultUserInteraction.ui
  end

  ##
  # See DefaultUserInteraction::ui=

  def ui=(new_ui)
    Gem::DefaultUserInteraction.ui = new_ui
  end

  ##
  # See DefaultUserInteraction::use_ui

  def use_ui(new_ui, &block)
    Gem::DefaultUserInteraction.use_ui(new_ui, &block)
  end

end

##
# UserInteraction allows RubyGems to interact with the user through standard
# methods that can be replaced with more-specific UI methods for different
# displays.
#
# Since UserInteraction dispatches to a concrete UI class you may need to
# reference other classes for specific behavior such as Gem::ConsoleUI or
# Gem::SilentUI.
#
# Example:
#
#   class X
#     include Gem::UserInteraction
#
#     def get_answer
#       n = ask("What is the meaning of life?")
#     end
#   end

module Gem::UserInteraction

  include Gem::DefaultUserInteraction

  ##
  # Displays an alert +statement+.  Asks a +question+ if given.

  def alert(statement, question = nil)
    ui.alert statement, question
  end

  ##
  # Displays an error +statement+ to the error output location.  Asks a
  # +question+ if given.

  def alert_error(statement, question = nil)
    ui.alert_error statement, question
  end

  ##
  # Displays a warning +statement+ to the warning output location.  Asks a
  # +question+ if given.

  def alert_warning(statement, question = nil)
    ui.alert_warning statement, question
  end

  ##
  # Asks a +question+ and returns the answer.

  def ask(question)
    ui.ask question
  end

  ##
  # Asks for a password with a +prompt+

  def ask_for_password(prompt)
    ui.ask_for_password prompt
  end

  ##
  # Asks a yes or no +question+.  Returns true for yes, false for no.

  def ask_yes_no(question, default = nil)
    ui.ask_yes_no question, default
  end

  ##
  # Asks the user to answer +question+ with an answer from the given +list+.

  def choose_from_list(question, list)
    ui.choose_from_list question, list
  end

  ##
  # Displays the given +statement+ on the standard output (or equivalent).

  def say(statement = "")
    ui.say statement
  end

  ##
  # Terminates the RubyGems process with the given +exit_code+

  def terminate_interaction(exit_code = 0)
    ui.terminate_interaction exit_code
  end

  ##
  # Calls +say+ with +msg+ or the results of the block if really_verbose
  # is true.

  def verbose(msg = nil)
    say(clean_text(msg || yield)) if Gem.configuration.really_verbose
  end
end

##
# Gem::StreamUI implements a simple stream based user interface.

class Gem::StreamUI
  extend Gem::Deprecate

  ##
  # The input stream

  attr_reader :ins

  ##
  # The output stream

  attr_reader :outs

  ##
  # The error stream

  attr_reader :errs

  ##
  # Creates a new StreamUI wrapping +in_stream+ for user input, +out_stream+
  # for standard output, +err_stream+ for error output.  If +usetty+ is true
  # then special operations (like asking for passwords) will use the TTY
  # commands to disable character echo.

  def initialize(in_stream, out_stream, err_stream=STDERR, usetty=true)
    @ins = in_stream
    @outs = out_stream
    @errs = err_stream
    @usetty = usetty
  end

  ##
  # Returns true if TTY methods should be used on this StreamUI.

  def tty?
    @usetty && @ins.tty?
  end

  ##
  # Prints a formatted backtrace to the errors stream if backtraces are
  # enabled.

  def backtrace(exception)
    return unless Gem.configuration.backtrace

    @errs.puts "\t#{exception.backtrace.join "\n\t"}"
  end

  ##
  # Choose from a list of options.  +question+ is a prompt displayed above
  # the list.  +list+ is a list of option strings.  Returns the pair
  # [option_name, option_index].

  def choose_from_list(question, list)
    @outs.puts question

    list.each_with_index do |item, index|
      @outs.puts " #{index + 1}. #{item}"
    end

    @outs.print "> "
    @outs.flush

    result = @ins.gets

    return nil, nil unless result

    result = result.strip.to_i - 1
    return list[result], result
  end

  ##
  # Ask a question.  Returns a true for yes, false for no.  If not connected
  # to a tty, raises an exception if default is nil, otherwise returns
  # default.

  def ask_yes_no(question, default=nil)
    unless tty?
      if default.nil?
        raise Gem::OperationNotSupportedError,
              "Not connected to a tty and no default specified"
      else
        return default
      end
    end

    default_answer = case default
    when nil
      "yn"
    when true
      "Yn"
    else
      "yN"
    end

    result = nil

    while result.nil? do
      result = case ask "#{question} [#{default_answer}]"
      when /^y/i then true
      when /^n/i then false
      when /^$/  then default
      else            nil
      end
    end

    return result
  end

  ##
  # Ask a question.  Returns an answer if connected to a tty, nil otherwise.

  def ask(question)
    return nil if !tty?

    @outs.print(question + "  ")
    @outs.flush

    result = @ins.gets
    result.chomp! if result
    result
  end

  ##
  # Ask for a password. Does not echo response to terminal.

  def ask_for_password(question)
    return nil if !tty?

    @outs.print(question, "  ")
    @outs.flush

    password = _gets_noecho
    @outs.puts
    password.chomp! if password
    password
  end

  def require_io_console
    @require_io_console ||= begin
      begin
        require "io/console"
      rescue LoadError
      end
      true
    end
  end

  def _gets_noecho
    require_io_console
    @ins.noecho { @ins.gets }
  end

  ##
  # Display a statement.

  def say(statement="")
    @outs.puts statement
  end

  ##
  # Display an informational alert.  Will ask +question+ if it is not nil.

  def alert(statement, question=nil)
    @outs.puts "INFO:  #{statement}"
    ask(question) if question
  end

  ##
  # Display a warning on stderr.  Will ask +question+ if it is not nil.

  def alert_warning(statement, question=nil)
    @errs.puts "WARNING:  #{statement}"
    ask(question) if question
  end

  ##
  # Display an error message in a location expected to get error messages.
  # Will ask +question+ if it is not nil.

  def alert_error(statement, question=nil)
    @errs.puts "ERROR:  #{statement}"
    ask(question) if question
  end

  ##
  # Terminate the application with exit code +status+, running any exit
  # handlers that might have been defined.

  def terminate_interaction(status = 0)
    close
    raise Gem::SystemExitException, status
  end

  def close
  end

  ##
  # Return a progress reporter object chosen from the current verbosity.

  def progress_reporter(*args)
    case Gem.configuration.verbose
    when nil, false
      SilentProgressReporter.new(@outs, *args)
    when true
      SimpleProgressReporter.new(@outs, *args)
    else
      VerboseProgressReporter.new(@outs, *args)
    end
  end

  ##
  # An absolutely silent progress reporter.

  class SilentProgressReporter
    ##
    # The count of items is never updated for the silent progress reporter.

    attr_reader :count

    ##
    # Creates a silent progress reporter that ignores all input arguments.

    def initialize(out_stream, size, initial_message, terminal_message = nil)
    end

    ##
    # Does not print +message+ when updated as this object has taken a vow of
    # silence.

    def updated(message)
    end

    ##
    # Does not print anything when complete as this object has taken a vow of
    # silence.

    def done
    end
  end

  ##
  # A basic dotted progress reporter.

  class SimpleProgressReporter
    include Gem::DefaultUserInteraction

    ##
    # The number of progress items counted so far.

    attr_reader :count

    ##
    # Creates a new progress reporter that will write to +out_stream+ for
    # +size+ items.  Shows the given +initial_message+ when progress starts
    # and the +terminal_message+ when it is complete.

    def initialize(out_stream, size, initial_message,
                   terminal_message = "complete")
      @out = out_stream
      @total = size
      @count = 0
      @terminal_message = terminal_message

      @out.puts initial_message
    end

    ##
    # Prints out a dot and ignores +message+.

    def updated(message)
      @count += 1
      @out.print "."
      @out.flush
    end

    ##
    # Prints out the terminal message.

    def done
      @out.puts "\n#{@terminal_message}"
    end
  end

  ##
  # A progress reporter that prints out messages about the current progress.

  class VerboseProgressReporter
    include Gem::DefaultUserInteraction

    ##
    # The number of progress items counted so far.

    attr_reader :count

    ##
    # Creates a new progress reporter that will write to +out_stream+ for
    # +size+ items.  Shows the given +initial_message+ when progress starts
    # and the +terminal_message+ when it is complete.

    def initialize(out_stream, size, initial_message,
                   terminal_message = "complete")
      @out = out_stream
      @total = size
      @count = 0
      @terminal_message = terminal_message

      @out.puts initial_message
    end

    ##
    # Prints out the position relative to the total and the +message+.

    def updated(message)
      @count += 1
      @out.puts "#{@count}/#{@total}: #{message}"
    end

    ##
    # Prints out the terminal message.

    def done
      @out.puts @terminal_message
    end
  end

  ##
  # Return a download reporter object chosen from the current verbosity

  def download_reporter(*args)
    if [nil, false].include?(Gem.configuration.verbose) || !@outs.tty?
      SilentDownloadReporter.new(@outs, *args)
    else
      ThreadedDownloadReporter.new(@outs, *args)
    end
  end

  ##
  # An absolutely silent download reporter.

  class SilentDownloadReporter
    ##
    # The silent download reporter ignores all arguments

    def initialize(out_stream, *args)
    end

    ##
    # The silent download reporter does not display +filename+ or care about
    # +filesize+ because it is silent.

    def fetch(filename, filesize)
    end

    ##
    # Nothing can update the silent download reporter.

    def update(current)
    end

    ##
    # The silent download reporter won't tell you when the download is done.
    # Because it is silent.

    def done
    end
  end

  ##
  # A progress reporter that behaves nicely with threaded downloading.

  class ThreadedDownloadReporter
    MUTEX = Thread::Mutex.new

    ##
    # The current file name being displayed

    attr_reader :file_name

    ##
    # Creates a new threaded download reporter that will display on
    # +out_stream+.  The other arguments are ignored.

    def initialize(out_stream, *args)
      @file_name = nil
      @out = out_stream
    end

    ##
    # Tells the download reporter that the +file_name+ is being fetched.
    # The other arguments are ignored.

    def fetch(file_name, *args)
      if @file_name.nil?
        @file_name = file_name
        locked_puts "Fetching #{@file_name}"
      end
    end

    ##
    # Updates the threaded download reporter for the given number of +bytes+.

    def update(bytes)
      # Do nothing.
    end

    ##
    # Indicates the download is complete.

    def done
      # Do nothing.
    end

    private

    def locked_puts(message)
      MUTEX.synchronize do
        @out.puts message
      end
    end
  end
end

##
# Subclass of StreamUI that instantiates the user interaction using STDIN,
# STDOUT, and STDERR.

class Gem::ConsoleUI < Gem::StreamUI
  ##
  # The Console UI has no arguments as it defaults to reading input from
  # stdin, output to stdout and warnings or errors to stderr.

  def initialize
    super STDIN, STDOUT, STDERR, true
  end
end

##
# SilentUI is a UI choice that is absolutely silent.

class Gem::SilentUI < Gem::StreamUI
  ##
  # The SilentUI has no arguments as it does not use any stream.

  def initialize
    io = NullIO.new
    super io, io, io, false
  end

  def close
  end

  def download_reporter(*args) # :nodoc:
    SilentDownloadReporter.new(@outs, *args)
  end

  def progress_reporter(*args) # :nodoc:
    SilentProgressReporter.new(@outs, *args)
  end

  ##
  # An absolutely silent IO.

  class NullIO
    def puts(*args)
    end

    def print(*args)
    end

    def flush
    end

    def gets(*args)
    end

    def tty?
      false
    end
  end
end
PK}$[�����+rubygems/rubygems/bundler_version_finder.rbnu�[���# frozen_string_literal: true

module Gem::BundlerVersionFinder
  def self.bundler_version
    v = ENV["BUNDLER_VERSION"]

    v ||= bundle_update_bundler_version
    return if v == true

    v ||= lockfile_version
    return unless v

    Gem::Version.new(v)
  end

  def self.prioritize!(specs)
    exact_match_index = specs.find_index {|spec| spec.version == bundler_version }
    return unless exact_match_index

    specs.unshift(specs.delete_at(exact_match_index))
  end

  def self.bundle_update_bundler_version
    return unless File.basename($0) == "bundle".freeze
    return unless "update".start_with?(ARGV.first || " ")
    bundler_version = nil
    update_index = nil
    ARGV.each_with_index do |a, i|
      if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN
        bundler_version = a
      end
      next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/
      bundler_version = $1 || true
      update_index = i
    end
    bundler_version
  end
  private_class_method :bundle_update_bundler_version

  def self.lockfile_version
    return unless contents = lockfile_contents
    regexp = /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/
    return unless contents =~ regexp
    $1
  end
  private_class_method :lockfile_version

  def self.lockfile_contents
    gemfile = ENV["BUNDLE_GEMFILE"]
    gemfile = nil if gemfile && gemfile.empty?

    unless gemfile
      begin
        Gem::Util.traverse_parents(Dir.pwd) do |directory|
          next unless gemfile = Gem::GEM_DEP_FILES.find {|f| File.file?(f.tap(&Gem::UNTAINT)) }

          gemfile = File.join directory, gemfile
          break
        end
      rescue Errno::ENOENT
        return
      end
    end

    return unless gemfile

    lockfile = case gemfile
    when "gems.rb" then "gems.locked"
    else "#{gemfile}.lock"
    end.dup.tap(&Gem::UNTAINT)

    return unless File.file?(lockfile)

    File.read(lockfile)
  end
  private_class_method :lockfile_contents
end
PK}$[�!i��!�!#systemtap/tapset/libruby.so.3.1.stpnu�[���/* SystemTap tapset to make it easier to trace Ruby 2.0
 *
 * All probes provided by Ruby can be listed using following command
 * (the path to the library must be adjuste appropriately):
 *
 * stap -L 'process("/opt/alt/ruby31/lib*\/libruby.so.3.1").mark("*")'
 */

/**
 * probe ruby.array.create - Allocation of new array.
 *
 * @size: Number of elements (an int)
 * @file: The file name where the method is being called (string)
 * @line: The line number where the method is being called (int)
 */
probe ruby.array.create =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("array__create")
{
	size = $arg1
	file = user_string($arg2)
	line = $arg3
}

/**
 * probe ruby.cmethod.entry - Fired just before a method implemented in C is entered.
 *
 * @classname: Name of the class (string)
 * @methodname: The method about bo be executed (string)
 * @file: The file name where the method is being called (string)
 * @line: The line number where the method is being called (int)
 */
probe ruby.cmethod.entry =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("cmethod__entry")
{
	classname  = user_string($arg1)
	methodname = user_string($arg2)
	file = user_string($arg3)
	line = $arg4
}

/**
 * probe ruby.cmethod.return - Fired just after a method implemented in C has returned.
 *
 * @classname: Name of the class (string)
 * @methodname: The executed method (string)
 * @file: The file name where the method is being called (string)
 * @line: The line number where the method is being called (int)
 */
probe ruby.cmethod.return =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("cmethod__return")
{
	classname  = user_string($arg1)
	methodname = user_string($arg2)
	file = user_string($arg3)
	line = $arg4
}

/**
 * probe ruby.find.require.entry - Fired when require starts to search load
 * path for suitable file to require.
 *
 * @requiredfile: The name of the file to be required (string)
 * @file: The file name where the method is being called (string)
 * @line: The line number where the method is being called (int)
 */
probe ruby.find.require.entry =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("find__require__entry")
{
	requiredfile = user_string($arg1)
	file = user_string($arg2)
	line = $arg3
}

/**
 * probe ruby.find.require.return - Fired just after require has finished
 * search of load path for suitable file to require.
 *
 * @requiredfile: The name of the file to be required (string)
 * @file: The file name where the method is being called (string)
 * @line: The line number where the method is being called (int)
 */
probe ruby.find.require.return =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("find__require__return")
{
	requiredfile = user_string($arg1)
	file = user_string($arg2)
	line = $arg3
}

/**
 * probe ruby.gc.mark.begin - Fired when a GC mark phase is about to start.
 *
 * It takes no arguments.
 */
probe ruby.gc.mark.begin =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("gc__mark__begin")
{
}

/**
 * probe ruby.gc.mark.end - Fired when a GC mark phase has ended.
 *
 * It takes no arguments.
 */
probe ruby.gc.mark.end =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("gc__mark__end")
{
}

/**
 * probe ruby.gc.sweep.begin - Fired when a GC sweep phase is about to start.
 *
 * It takes no arguments.
 */
probe ruby.gc.sweep.begin =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("gc__sweep__begin")
{
}

/**
 * probe ruby.gc.sweep.end - Fired when a GC sweep phase has ended.
 *
 * It takes no arguments.
 */
probe ruby.gc.sweep.end =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("gc__sweep__end")
{
}

/**
 * probe ruby.hash.create - Allocation of new hash.
 *
 * @size: Number of elements (int)
 * @file: The file name where the method is being called (string)
 * @line: The line number where the method is being called (int)
 */
probe ruby.hash.create =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("hash__create")
{
	size = $arg1
	file = user_string($arg2)
	line = $arg3
}

/**
 * probe ruby.load.entry - Fired when calls to "load" are made.
 *
 * @loadedfile: The name of the file to be loaded (string)
 * @file: The file name where the method is being called (string)
 * @line: The line number where the method is being called (int)
 */
probe ruby.load.entry =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("load__entry")
{
	loadedfile = user_string($arg1)
	file = user_string($arg2)
	line = $arg3
}

/**
 * probe ruby.load.return - Fired just after require has finished
 * search of load path for suitable file to require.
 *
 * @loadedfile: The name of the file that was loaded (string)
 */
probe ruby.load.return =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("load__return")
{
	loadedfile = user_string($arg1)
}

/**
 * probe ruby.method.entry - Fired just before a method implemented in Ruby is entered.
 *
 * @classname: Name of the class (string)
 * @methodname: The method about bo be executed (string)
 * @file: The file name where the method is being called (string)
 * @line: The line number where the method is being called (int)
 */
probe ruby.method.entry =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("method__entry")
{
	classname  = user_string($arg1)
	methodname = user_string($arg2)
	file = user_string($arg3)
	line = $arg4
}

/**
 * probe ruby.method.return - Fired just after a method implemented in Ruby has returned.
 *
 * @classname: Name of the class (string)
 * @methodname: The executed method (string)
 * @file: The file name where the method is being called (string)
 * @line: The line number where the method is being called (int)
 */
probe ruby.method.return =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("method__return")
{
	classname  = user_string($arg1)
	methodname = user_string($arg2)
	file = user_string($arg3)
	line = $arg4
}

/**
 * probe ruby.object.create - Allocation of new object.
 *
 * @classname: Name of the class (string)
 * @file: The file name where the method is being called (string)
 * @line: The line number where the method is being called (int)
 */
probe ruby.object.create =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("object__create")
{
	classname = user_string($arg1)
	file = user_string($arg2)
	line = $arg3
}

/**
 * probe ruby.parse.begin - Fired just before a Ruby source file is parsed.
 *
 * @parsedfile: The name of the file to be parsed (string)
 * @parsedline: The line number of beginning of parsing (int)
 */
probe ruby.parse.begin =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("parse__begin")
{
	parsedfile = user_string($arg1)
	parsedline = $arg2
}

/**
 * probe ruby.parse.end - Fired just after a Ruby source file was parsed.
 *
 * @parsedfile: The name of parsed the file (string)
 * @parsedline: The line number of beginning of parsing (int)
 */
probe ruby.parse.end =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("parse__end")
{
	parsedfile = user_string($arg1)
	parsedline = $arg2
}

/**
 * probe ruby.raise - Fired when an exception is raised.
 *
 * @classname: The class name of the raised exception (string)
 * @file: The name of the file where the exception was raised (string)
 * @line: The line number in the file where the exception was raised (int)
 */
probe ruby.raise =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("raise")
{
	classname  = user_string($arg1)
	file = user_string($arg2)
	line = $arg3
}

/**
 * probe ruby.require.entry - Fired on calls to rb_require_safe (when a file
 * is required).
 *
 * @requiredfile: The name of the file to be required (string)
 * @file: The file that called "require" (string)
 * @line: The line number where the call to require was made(int)
 */
probe ruby.require.entry =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("require__entry")
{
	requiredfile = user_string($arg1)
	file = user_string($arg2)
	line = $arg3
}

/**
 * probe ruby.require.return - Fired just after require has finished
 * search of load path for suitable file to require.
 *
 * @requiredfile: The file that was required (string)
 */
probe ruby.require.return =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("require__return")
{
	requiredfile = user_string($arg1)
}

/**
 * probe ruby.string.create - Allocation of new string.
 *
 * @size: Number of elements (an int)
 * @file: The file name where the method is being called (string)
 * @line: The line number where the method is being called (int)
 */
probe ruby.string.create =
      process("/opt/alt/ruby31/lib*/libruby.so.3.1").mark("string__create")
{
	size = $arg1
	file = user_string($arg2)
	line = $arg3
}
PK}$[z]��	�	#licenses/alt-ruby31-libs/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}$[�����licenses/alt-ruby31-libs/LEGALnu�[���# -*- rdoc -*-

= 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.

[addr2line.c]

  A part of this file is from FreeBSD.

  >>>
    Copyright (c) 1986, 1988, 1991, 1993::
    The Regents of the University of California.  All rights reserved.

    (c) UNIX System Laboratories, Inc.

    All or some portions of this file are derived from material licensed
    to the University of California by American Telephone and Telegraph
    Co. or Unix System Laboratories, Inc. and are reproduced herein with
    the permission of UNIX System Laboratories, Inc.

    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.
    4. 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.

	@(#)subr_prf.c	8.3 (Berkeley) 1/21/94


[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}[rdoc-label:label-MIT+License].

[coroutine]

  Unless otherwise specified, these files are licensed under the
  {MIT License}[rdoc-label:label-MIT+License].

[include/ruby/onigmo.h]
[include/ruby/oniguruma.h]
[regcomp.c]
[regenc.c]
[regenc.h]
[regerror.c]
[regexec.c]
[regint.h]
[regparse.c]
[regparse.h]
[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]
[enc/windows_31j.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/windows_1250.c]
[enc/windows_1252.c]

  >>>
    Copyright (c) 2006-2007::  Byte      <byte AT mail DOT kna DOT ru>
                               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.

[enc/cesu_8.c]
[enc/windows_1253.c]
[enc/windows_1254.c]
[enc/windows_1257.c]

  >>>
    Copyright (c) 2002-2007::  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.

[enc/trans/GB/GB12345%UCS.src]
[enc/trans/GB/UCS%GB12345.src]
[enc/trans/GB/GB2312%UCS.src]
[enc/trans/GB/UCS%GB2312.src]

  These files have this explanatory texts.

  >>>
    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]

  These files are copyrighted as the following.

  >>>
    © 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]

  These files are copyrighted as the following.

  >>>
    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]

  These files are copyrighted as the following.

  >>>
    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.

[enc/trans/ucm/glibc-BIG5-2.3.3.ucm]
[enc/trans/ucm/glibc-BIG5HKSCS-2.3.3.ucm]

  >>>
    Copyright (C) 2001-2005:: International Business Machines
                              Corporation and others.  All Rights Reserved.

[enc/trans/ucm/windows-950-2000.ucm]
[enc/trans/ucm/windows-950_hkscs-2001.ucm]

  >>>
    Copyright (C) 2001-2002:: International Business Machines
                              Corporation and others.  All Rights Reserved.


[configure]

  This file is free software.

  >>>
    Copyright (C) 1992-1996, 1998-2012:: 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 1992-2018:: 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 3 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, see <https://www.gnu.org/licenses/>.

    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.  This Exception is an additional permission under section 7
    of the GNU General Public License, version 3 ("GPLv3").

[tool/lib/test/*]
[tool/lib/core_assertions.rb]

  Some of methods on these files are based on MiniTest 4. MiniTest 4 is
  distributed under the MIT License.

  >>>
    Copyright (c) Ryan Davis, seattle.rb

    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.

[parse.c]
[parse.h]

  These files are licensed under the GPL, but are 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-2015, 2018:: 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 3 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, see <http://www.gnu.org/licenses/>.

    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.

[missing/dtoa.c]

  This file is under these licenses.

  >>>
    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.

  >>>
    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.

[win32/win32.c]
[include/ruby/win32.h]

  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.

[missing/mt19937.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

[missing/procstat_vm.c]

  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}[rdoc-label:label-Old-style+BSD+license].

  >>>
    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.

[st.c]
[strftime.c]
[include/ruby/st.h]
[missing/acosh.c]
[missing/alloca.c]
[missing/erf.c]
[missing/hypot.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.c]
[ext/digest/sha1/sha1.h]

  These files are all under public domain.

[missing/crypt.c]

  This file is under the {old-style BSD license}[rdoc-label:label-Old-style+BSD+license].

  >>>
    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.

[missing/setproctitle.c]

  This file is under the {old-style BSD license}[rdoc-label:label-Old-style+BSD+license].

  >>>
    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.

[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.c]
[ext/digest/md5/md5.h]

  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.c]
[ext/digest/rmd160/rmd160.h]

  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.c]
[ext/digest/sha2/sha2.h]

  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]

  The file contains the following copyright notice.

  >>>
    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]

  The files under these directories are under the following license, except for
  ext/psych/yaml.

  >>>
    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]

  The files under this directory are under the following license.

  >>>
    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/pty/pty.c]

  >>>
    C) Copyright 1998:: by Akinori Ito.

    This software may be redistributed freely for this purpose, in full
    or in part, provided that this entire copyright notice is included
    on any copies of this software and applications and derivations thereof.

    This software is provided on an "as is" basis, without warranty of any
    kind, either expressed or implied, as to any matter including, but not
    limited to warranty of fitness of purpose, or merchantability, or
    results obtained from use of this 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]

  The files under these directories are under the following license.

  >>>
    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 under the following license.

  >>>
    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}[rdoc-label:label-MIT+License], 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.

[lib/bundler]
[lib/bundler.rb]
[spec/bundler]

  Bundler is under the following license.

  >>>
    Portions copyright (c) 2010:: Andre Arko
    Portions copyright (c) 2009:: Engine Yard

    {MIT License}[rdoc-label:label-MIT+License]

[lib/bundler/vendor/thor]

  Thor is under the following license.

  >>>
    Copyright (c) 2008 Yehuda Katz, Eric Hodel, et al.

    {MIT License}[rdoc-label:label-MIT+License]

[lib/rubygems/resolver/molinillo]
[lib/bundler/vendor/molinillo]

  molinillo is under the following license.

  >>>
    Copyright (c) 2014 Samuel E. Giddins segiddins@segiddins.me

    {MIT License}[rdoc-label:label-MIT+License]

[lib/bundler/vendor/connection_pool]

  connection_pool is under the following license.

  >>>
    Copyright (c) 2011 Mike Perham

    {MIT License}[rdoc-label:label-MIT+License]

[lib/bundler/vendor/net-http-persistent]

  net-http-persistent is under the following license.

  >>>
    Copyright (c) Eric Hodel, Aaron Patterson

    {MIT License}[rdoc-label:label-MIT+License]

[lib/did_you_mean]
[lib/did_you_mean.rb]
[test/did_you_mean]

  did_you_mean is under the following license.

  >>>
    Copyright (c) 2014-2016 Yuki Nishijima

    {MIT License}[rdoc-label:label-MIT+License]

[lib/error_highlight]
[lib/error_highlight.rb]
[test/error_highlight]

  error_highlight is under the following license.

  >>>
    Copyright (c) 2021 Yusuke Endoh

    {MIT License}[rdoc-label:label-MIT+License]

[benchmark/so_ackermann.rb]
[benchmark/so_array.rb]
[benchmark/so_binary_trees.rb]
[benchmark/so_concatenate.rb]
[benchmark/so_count_words.yml]
[benchmark/so_exception.rb]
[benchmark/so_fannkuch.rb]
[benchmark/so_fasta.rb]
[benchmark/so_k_nucleotide.yml]
[benchmark/so_lists.rb]
[benchmark/so_mandelbrot.rb]
[benchmark/so_matrix.rb]
[benchmark/so_meteor_contest.rb]
[benchmark/so_nbody.rb]
[benchmark/so_nested_loop.rb]
[benchmark/so_nsieve.rb]
[benchmark/so_nsieve_bits.rb]
[benchmark/so_object.rb]
[benchmark/so_partial_sums.rb]
[benchmark/so_pidigits.rb]
[benchmark/so_random.rb]
[benchmark/so_reverse_complement.yml]
[benchmark/so_sieve.rb]
[benchmark/so_spectralnorm.rb]

  These files are very old copy of then-called "The Great Computer Language
  Shootout".  LEGAL SITUATION OF THESE FILES ARE UNCLEAR because the original
  site has been lost.  Upstream diverged to delete several benchmarks listed
  above.

== 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.

== Old-style BSD license
>>>
      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.
PK}$[Q�{	{	 licenses/alt-ruby31-libs/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}$[��FN�F�Flicenses/alt-ruby31-libs/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.
PK}$[z]��	�	licenses/alt-ruby31/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}$[�����licenses/alt-ruby31/LEGALnu�[���# -*- rdoc -*-

= 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.

[addr2line.c]

  A part of this file is from FreeBSD.

  >>>
    Copyright (c) 1986, 1988, 1991, 1993::
    The Regents of the University of California.  All rights reserved.

    (c) UNIX System Laboratories, Inc.

    All or some portions of this file are derived from material licensed
    to the University of California by American Telephone and Telegraph
    Co. or Unix System Laboratories, Inc. and are reproduced herein with
    the permission of UNIX System Laboratories, Inc.

    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.
    4. 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.

	@(#)subr_prf.c	8.3 (Berkeley) 1/21/94


[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}[rdoc-label:label-MIT+License].

[coroutine]

  Unless otherwise specified, these files are licensed under the
  {MIT License}[rdoc-label:label-MIT+License].

[include/ruby/onigmo.h]
[include/ruby/oniguruma.h]
[regcomp.c]
[regenc.c]
[regenc.h]
[regerror.c]
[regexec.c]
[regint.h]
[regparse.c]
[regparse.h]
[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]
[enc/windows_31j.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/windows_1250.c]
[enc/windows_1252.c]

  >>>
    Copyright (c) 2006-2007::  Byte      <byte AT mail DOT kna DOT ru>
                               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.

[enc/cesu_8.c]
[enc/windows_1253.c]
[enc/windows_1254.c]
[enc/windows_1257.c]

  >>>
    Copyright (c) 2002-2007::  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.

[enc/trans/GB/GB12345%UCS.src]
[enc/trans/GB/UCS%GB12345.src]
[enc/trans/GB/GB2312%UCS.src]
[enc/trans/GB/UCS%GB2312.src]

  These files have this explanatory texts.

  >>>
    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]

  These files are copyrighted as the following.

  >>>
    © 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]

  These files are copyrighted as the following.

  >>>
    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]

  These files are copyrighted as the following.

  >>>
    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.

[enc/trans/ucm/glibc-BIG5-2.3.3.ucm]
[enc/trans/ucm/glibc-BIG5HKSCS-2.3.3.ucm]

  >>>
    Copyright (C) 2001-2005:: International Business Machines
                              Corporation and others.  All Rights Reserved.

[enc/trans/ucm/windows-950-2000.ucm]
[enc/trans/ucm/windows-950_hkscs-2001.ucm]

  >>>
    Copyright (C) 2001-2002:: International Business Machines
                              Corporation and others.  All Rights Reserved.


[configure]

  This file is free software.

  >>>
    Copyright (C) 1992-1996, 1998-2012:: 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 1992-2018:: 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 3 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, see <https://www.gnu.org/licenses/>.

    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.  This Exception is an additional permission under section 7
    of the GNU General Public License, version 3 ("GPLv3").

[tool/lib/test/*]
[tool/lib/core_assertions.rb]

  Some of methods on these files are based on MiniTest 4. MiniTest 4 is
  distributed under the MIT License.

  >>>
    Copyright (c) Ryan Davis, seattle.rb

    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.

[parse.c]
[parse.h]

  These files are licensed under the GPL, but are 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-2015, 2018:: 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 3 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, see <http://www.gnu.org/licenses/>.

    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.

[missing/dtoa.c]

  This file is under these licenses.

  >>>
    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.

  >>>
    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.

[win32/win32.c]
[include/ruby/win32.h]

  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.

[missing/mt19937.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

[missing/procstat_vm.c]

  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}[rdoc-label:label-Old-style+BSD+license].

  >>>
    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.

[st.c]
[strftime.c]
[include/ruby/st.h]
[missing/acosh.c]
[missing/alloca.c]
[missing/erf.c]
[missing/hypot.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.c]
[ext/digest/sha1/sha1.h]

  These files are all under public domain.

[missing/crypt.c]

  This file is under the {old-style BSD license}[rdoc-label:label-Old-style+BSD+license].

  >>>
    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.

[missing/setproctitle.c]

  This file is under the {old-style BSD license}[rdoc-label:label-Old-style+BSD+license].

  >>>
    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.

[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.c]
[ext/digest/md5/md5.h]

  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.c]
[ext/digest/rmd160/rmd160.h]

  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.c]
[ext/digest/sha2/sha2.h]

  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]

  The file contains the following copyright notice.

  >>>
    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]

  The files under these directories are under the following license, except for
  ext/psych/yaml.

  >>>
    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]

  The files under this directory are under the following license.

  >>>
    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/pty/pty.c]

  >>>
    C) Copyright 1998:: by Akinori Ito.

    This software may be redistributed freely for this purpose, in full
    or in part, provided that this entire copyright notice is included
    on any copies of this software and applications and derivations thereof.

    This software is provided on an "as is" basis, without warranty of any
    kind, either expressed or implied, as to any matter including, but not
    limited to warranty of fitness of purpose, or merchantability, or
    results obtained from use of this 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]

  The files under these directories are under the following license.

  >>>
    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 under the following license.

  >>>
    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}[rdoc-label:label-MIT+License], 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.

[lib/bundler]
[lib/bundler.rb]
[spec/bundler]

  Bundler is under the following license.

  >>>
    Portions copyright (c) 2010:: Andre Arko
    Portions copyright (c) 2009:: Engine Yard

    {MIT License}[rdoc-label:label-MIT+License]

[lib/bundler/vendor/thor]

  Thor is under the following license.

  >>>
    Copyright (c) 2008 Yehuda Katz, Eric Hodel, et al.

    {MIT License}[rdoc-label:label-MIT+License]

[lib/rubygems/resolver/molinillo]
[lib/bundler/vendor/molinillo]

  molinillo is under the following license.

  >>>
    Copyright (c) 2014 Samuel E. Giddins segiddins@segiddins.me

    {MIT License}[rdoc-label:label-MIT+License]

[lib/bundler/vendor/connection_pool]

  connection_pool is under the following license.

  >>>
    Copyright (c) 2011 Mike Perham

    {MIT License}[rdoc-label:label-MIT+License]

[lib/bundler/vendor/net-http-persistent]

  net-http-persistent is under the following license.

  >>>
    Copyright (c) Eric Hodel, Aaron Patterson

    {MIT License}[rdoc-label:label-MIT+License]

[lib/did_you_mean]
[lib/did_you_mean.rb]
[test/did_you_mean]

  did_you_mean is under the following license.

  >>>
    Copyright (c) 2014-2016 Yuki Nishijima

    {MIT License}[rdoc-label:label-MIT+License]

[lib/error_highlight]
[lib/error_highlight.rb]
[test/error_highlight]

  error_highlight is under the following license.

  >>>
    Copyright (c) 2021 Yusuke Endoh

    {MIT License}[rdoc-label:label-MIT+License]

[benchmark/so_ackermann.rb]
[benchmark/so_array.rb]
[benchmark/so_binary_trees.rb]
[benchmark/so_concatenate.rb]
[benchmark/so_count_words.yml]
[benchmark/so_exception.rb]
[benchmark/so_fannkuch.rb]
[benchmark/so_fasta.rb]
[benchmark/so_k_nucleotide.yml]
[benchmark/so_lists.rb]
[benchmark/so_mandelbrot.rb]
[benchmark/so_matrix.rb]
[benchmark/so_meteor_contest.rb]
[benchmark/so_nbody.rb]
[benchmark/so_nested_loop.rb]
[benchmark/so_nsieve.rb]
[benchmark/so_nsieve_bits.rb]
[benchmark/so_object.rb]
[benchmark/so_partial_sums.rb]
[benchmark/so_pidigits.rb]
[benchmark/so_random.rb]
[benchmark/so_reverse_complement.yml]
[benchmark/so_sieve.rb]
[benchmark/so_spectralnorm.rb]

  These files are very old copy of then-called "The Great Computer Language
  Shootout".  LEGAL SITUATION OF THESE FILES ARE UNCLEAR because the original
  site has been lost.  Upstream diverged to delete several benchmarks listed
  above.

== 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.

== Old-style BSD license
>>>
      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.
PK}$[V�Slicenses/alt-ruby31/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}$[Q�{	{	licenses/alt-ruby31/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}$[��FN�F�Flicenses/alt-ruby31/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.
PK}$[z]��	�	$licenses/alt-ruby31-devel/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}$[�����licenses/alt-ruby31-devel/LEGALnu�[���# -*- rdoc -*-

= 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.

[addr2line.c]

  A part of this file is from FreeBSD.

  >>>
    Copyright (c) 1986, 1988, 1991, 1993::
    The Regents of the University of California.  All rights reserved.

    (c) UNIX System Laboratories, Inc.

    All or some portions of this file are derived from material licensed
    to the University of California by American Telephone and Telegraph
    Co. or Unix System Laboratories, Inc. and are reproduced herein with
    the permission of UNIX System Laboratories, Inc.

    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.
    4. 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.

	@(#)subr_prf.c	8.3 (Berkeley) 1/21/94


[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}[rdoc-label:label-MIT+License].

[coroutine]

  Unless otherwise specified, these files are licensed under the
  {MIT License}[rdoc-label:label-MIT+License].

[include/ruby/onigmo.h]
[include/ruby/oniguruma.h]
[regcomp.c]
[regenc.c]
[regenc.h]
[regerror.c]
[regexec.c]
[regint.h]
[regparse.c]
[regparse.h]
[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]
[enc/windows_31j.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/windows_1250.c]
[enc/windows_1252.c]

  >>>
    Copyright (c) 2006-2007::  Byte      <byte AT mail DOT kna DOT ru>
                               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.

[enc/cesu_8.c]
[enc/windows_1253.c]
[enc/windows_1254.c]
[enc/windows_1257.c]

  >>>
    Copyright (c) 2002-2007::  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.

[enc/trans/GB/GB12345%UCS.src]
[enc/trans/GB/UCS%GB12345.src]
[enc/trans/GB/GB2312%UCS.src]
[enc/trans/GB/UCS%GB2312.src]

  These files have this explanatory texts.

  >>>
    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]

  These files are copyrighted as the following.

  >>>
    © 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]

  These files are copyrighted as the following.

  >>>
    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]

  These files are copyrighted as the following.

  >>>
    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.

[enc/trans/ucm/glibc-BIG5-2.3.3.ucm]
[enc/trans/ucm/glibc-BIG5HKSCS-2.3.3.ucm]

  >>>
    Copyright (C) 2001-2005:: International Business Machines
                              Corporation and others.  All Rights Reserved.

[enc/trans/ucm/windows-950-2000.ucm]
[enc/trans/ucm/windows-950_hkscs-2001.ucm]

  >>>
    Copyright (C) 2001-2002:: International Business Machines
                              Corporation and others.  All Rights Reserved.


[configure]

  This file is free software.

  >>>
    Copyright (C) 1992-1996, 1998-2012:: 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 1992-2018:: 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 3 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, see <https://www.gnu.org/licenses/>.

    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.  This Exception is an additional permission under section 7
    of the GNU General Public License, version 3 ("GPLv3").

[tool/lib/test/*]
[tool/lib/core_assertions.rb]

  Some of methods on these files are based on MiniTest 4. MiniTest 4 is
  distributed under the MIT License.

  >>>
    Copyright (c) Ryan Davis, seattle.rb

    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.

[parse.c]
[parse.h]

  These files are licensed under the GPL, but are 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-2015, 2018:: 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 3 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, see <http://www.gnu.org/licenses/>.

    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.

[missing/dtoa.c]

  This file is under these licenses.

  >>>
    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.

  >>>
    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.

[win32/win32.c]
[include/ruby/win32.h]

  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.

[missing/mt19937.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

[missing/procstat_vm.c]

  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}[rdoc-label:label-Old-style+BSD+license].

  >>>
    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.

[st.c]
[strftime.c]
[include/ruby/st.h]
[missing/acosh.c]
[missing/alloca.c]
[missing/erf.c]
[missing/hypot.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.c]
[ext/digest/sha1/sha1.h]

  These files are all under public domain.

[missing/crypt.c]

  This file is under the {old-style BSD license}[rdoc-label:label-Old-style+BSD+license].

  >>>
    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.

[missing/setproctitle.c]

  This file is under the {old-style BSD license}[rdoc-label:label-Old-style+BSD+license].

  >>>
    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.

[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.c]
[ext/digest/md5/md5.h]

  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.c]
[ext/digest/rmd160/rmd160.h]

  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.c]
[ext/digest/sha2/sha2.h]

  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]

  The file contains the following copyright notice.

  >>>
    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]

  The files under these directories are under the following license, except for
  ext/psych/yaml.

  >>>
    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]

  The files under this directory are under the following license.

  >>>
    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/pty/pty.c]

  >>>
    C) Copyright 1998:: by Akinori Ito.

    This software may be redistributed freely for this purpose, in full
    or in part, provided that this entire copyright notice is included
    on any copies of this software and applications and derivations thereof.

    This software is provided on an "as is" basis, without warranty of any
    kind, either expressed or implied, as to any matter including, but not
    limited to warranty of fitness of purpose, or merchantability, or
    results obtained from use of this 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]

  The files under these directories are under the following license.

  >>>
    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 under the following license.

  >>>
    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}[rdoc-label:label-MIT+License], 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.

[lib/bundler]
[lib/bundler.rb]
[spec/bundler]

  Bundler is under the following license.

  >>>
    Portions copyright (c) 2010:: Andre Arko
    Portions copyright (c) 2009:: Engine Yard

    {MIT License}[rdoc-label:label-MIT+License]

[lib/bundler/vendor/thor]

  Thor is under the following license.

  >>>
    Copyright (c) 2008 Yehuda Katz, Eric Hodel, et al.

    {MIT License}[rdoc-label:label-MIT+License]

[lib/rubygems/resolver/molinillo]
[lib/bundler/vendor/molinillo]

  molinillo is under the following license.

  >>>
    Copyright (c) 2014 Samuel E. Giddins segiddins@segiddins.me

    {MIT License}[rdoc-label:label-MIT+License]

[lib/bundler/vendor/connection_pool]

  connection_pool is under the following license.

  >>>
    Copyright (c) 2011 Mike Perham

    {MIT License}[rdoc-label:label-MIT+License]

[lib/bundler/vendor/net-http-persistent]

  net-http-persistent is under the following license.

  >>>
    Copyright (c) Eric Hodel, Aaron Patterson

    {MIT License}[rdoc-label:label-MIT+License]

[lib/did_you_mean]
[lib/did_you_mean.rb]
[test/did_you_mean]

  did_you_mean is under the following license.

  >>>
    Copyright (c) 2014-2016 Yuki Nishijima

    {MIT License}[rdoc-label:label-MIT+License]

[lib/error_highlight]
[lib/error_highlight.rb]
[test/error_highlight]

  error_highlight is under the following license.

  >>>
    Copyright (c) 2021 Yusuke Endoh

    {MIT License}[rdoc-label:label-MIT+License]

[benchmark/so_ackermann.rb]
[benchmark/so_array.rb]
[benchmark/so_binary_trees.rb]
[benchmark/so_concatenate.rb]
[benchmark/so_count_words.yml]
[benchmark/so_exception.rb]
[benchmark/so_fannkuch.rb]
[benchmark/so_fasta.rb]
[benchmark/so_k_nucleotide.yml]
[benchmark/so_lists.rb]
[benchmark/so_mandelbrot.rb]
[benchmark/so_matrix.rb]
[benchmark/so_meteor_contest.rb]
[benchmark/so_nbody.rb]
[benchmark/so_nested_loop.rb]
[benchmark/so_nsieve.rb]
[benchmark/so_nsieve_bits.rb]
[benchmark/so_object.rb]
[benchmark/so_partial_sums.rb]
[benchmark/so_pidigits.rb]
[benchmark/so_random.rb]
[benchmark/so_reverse_complement.yml]
[benchmark/so_sieve.rb]
[benchmark/so_spectralnorm.rb]

  These files are very old copy of then-called "The Great Computer Language
  Shootout".  LEGAL SITUATION OF THESE FILES ARE UNCLEAR because the original
  site has been lost.  Upstream diverged to delete several benchmarks listed
  above.

== 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.

== Old-style BSD license
>>>
      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.
PK}$[V�Slicenses/alt-ruby31-devel/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}$[Q�{	{	!licenses/alt-ruby31-devel/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}$[��FN�F�Flicenses/alt-ruby31-devel/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.
PK}$[P/ʮ��doc/alt-ruby31-libs/README.mdnu�[���[![Actions Status: MinGW](https://github.com/ruby/ruby/workflows/MinGW/badge.svg)](https://github.com/ruby/ruby/actions?query=workflow%3A"MinGW")
[![Actions Status: MJIT](https://github.com/ruby/ruby/workflows/MJIT/badge.svg)](https://github.com/ruby/ruby/actions?query=workflow%3A"MJIT")
[![Actions Status: Ubuntu](https://github.com/ruby/ruby/workflows/Ubuntu/badge.svg)](https://github.com/ruby/ruby/actions?query=workflow%3A"Ubuntu")
[![Actions Status: Windows](https://github.com/ruby/ruby/workflows/Windows/badge.svg)](https://github.com/ruby/ruby/actions?query=workflow%3A"Windows")
[![AppVeyor status](https://ci.appveyor.com/api/projects/status/0sy8rrxut4o0k960/branch/master?svg=true)](https://ci.appveyor.com/project/ruby/ruby/branch/master)
[![Travis Status](https://app.travis-ci.com/ruby/ruby.svg?branch=master)](https://app.travis-ci.com/ruby/ruby)
[![Cirrus Status](https://api.cirrus-ci.com/github/ruby/ruby.svg)](https://cirrus-ci.com/github/ruby/ruby/master)

# What's Ruby

Ruby is an interpreted object-oriented programming language often
used for web development. It also offers many scripting features
to process plain text and serialized files, or manage system tasks.
It is simple, straightforward, 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, etc.) cf.
    https://github.com/ruby/ruby/blob/master/doc/maintainers.rdoc#label-Platform+Maintainers


## 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/

### Git

The mirror of the Ruby source tree can be checked out with 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:

    $ git ls-remote https://github.com/ruby/ruby.git

You may also want to use https://git.ruby-lang.org/ruby.git (actual master of Ruby source)
if you are a committer.

### Subversion

Stable branches for older Ruby versions can be checked out with also the
following command:

    $ svn co https://svn.ruby-lang.org/repos/ruby/branches/ruby_2_6/ ruby

Try the following command to see the list of branches:

    $ svn ls https://svn.ruby-lang.org/repos/ruby/branches/


## Ruby home page

https://www.ruby-lang.org/

## Mailing list

There is a mailing list to discuss Ruby. To subscribe to this list, please
send the following phrase:

    subscribe

in the mail body (not subject) to the address [ruby-talk-request@ruby-lang.org].

[ruby-talk-request@ruby-lang.org]: mailto:ruby-talk-request@ruby-lang.org?subject=Join%20Ruby%20Mailing%20List&body=subscribe

## Requirements to build from repository

1. GNU or BSD make
2. C99 compiler
3. autoconf 2.67 or higher
4. automake 1.15 or higher
5. bison 2.3 or higher
6. Ruby 2.2 or higher

When building from a released version, only a C99 compiler and GNU or BSD make
is required.

## How to compile and install

1.  If you want to use Microsoft Visual C++ to compile Ruby, read
    [win32/README.win32](rdoc-ref:win32/README.win32) instead of this document.

2.  Run `./autogen.sh` to generate configure, when you build the source checked
    out from the Git repository.

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 `include/ruby/defines.h` if you need. Usually this step will not be needed.

5.  Optional: Remove comment mark(`#`) before the module names from `ext/Setup`.

    This step is only necessary if you want to link modules statically.

    If you don't want to compile dynamic extensions (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.  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](rdoc-ref:COPYING).

## Feedback

Questions about the Ruby language can be asked on the [Ruby-Talk] mailing list
or on websites like https://stackoverflow.com.

Bugs should be reported at https://bugs.ruby-lang.org. Read [HowToReport] for more information.

[Ruby-Talk]: https://www.ruby-lang.org/en/community/mailing-lists
[HowToReport]: https://bugs.ruby-lang.org/projects/ruby/wiki/HowToReport

## Contributing

See the file [CONTRIBUTING.md](rdoc-ref:CONTRIBUTING)

## The Author

Ruby was originally designed and developed by Yukihiro Matsumoto (Matz) in 1995.

<matz@ruby-lang.org>
PK}$[���'Q'Qdoc/alt-ruby31-libs/NEWS.mdnu�[���# NEWS for Ruby 3.1.0

This document is a list of user-visible feature changes
since the **3.0.0** release, except for bug fixes.

Note that each entry is kept to a minimum, see links for details.

## Language changes

*   The block argument can now be anonymous if the block will
    only be passed to another method. [[Feature #11256]]

    ```ruby
    def foo(&)
      bar(&)
    end
    ```

*   Pin operator now takes an expression. [[Feature #17411]]

    ```ruby
    Prime.each_cons(2).lazy.find_all{_1 in [n, ^(n + 2)]}.take(3).to_a
    #=> [[3, 5], [5, 7], [11, 13]]
    ```

*   Pin operator now supports instance, class, and global variables.
    [[Feature #17724]]

    ```ruby
    @n = 5
    Prime.each_cons(2).lazy.find{_1 in [n, ^@n]}
    #=> [3, 5]
    ```

*   One-line pattern matching is no longer experimental.

*   Parentheses can be omitted in one-line pattern matching.
    [[Feature #16182]]

    ```ruby
    [0, 1] => _, x
    {y: 2} => y:
    x #=> 1
    y #=> 2
    ```

*   Multiple assignment evaluation order has been made consistent with
    single assignment evaluation order.  With single assignment, Ruby
    uses a left-to-right evaluation order.  With this code:

    ```ruby
    foo[0] = bar
    ```

    The following evaluation order is used:

    1. `foo`
    2. `bar`
    3. `[]=` called on the result of `foo`

    In Ruby before 3.1.0, multiple assignment did not follow this
    evaluation order.  With this code:

    ```ruby
    foo[0], bar.baz = a, b
    ```

    Versions of Ruby before 3.1.0 would evaluate in the following
    order

    1. `a`
    2. `b`
    3. `foo`
    4. `[]=` called on the result of `foo`
    5. `bar`
    6. `baz=` called on the result of `bar`

    Starting in Ruby 3.1.0, the evaluation order is now consistent with
    single assignment, with the left-hand side being evaluated before
    the right-hand side:

    1. `foo`
    2. `bar`
    3. `a`
    4. `b`
    5. `[]=` called on the result of `foo`
    6. `baz=` called on the result of `bar`

    [[Bug #4443]]

*   Values in Hash literals and keyword arguments can be omitted.
    [[Feature #14579]]

    For example,

    * `{x:, y:}` is a syntax sugar of `{x: x, y: y}`.
    * `foo(x:, y:)` is a syntax sugar of `foo(x: x, y: y)`.

    Constant names, local variable names, and method names are allowed as
    key names.  Note that a reserved word is considered as a local
    variable or method name even if it's a pseudo variable name such as
    `self`.

*   Non main-Ractors can get instance variables (ivars) of classes/modules
    if ivars refer to shareable objects.
    [[Feature #17592]]

*   A command syntax is allowed in endless method definitions, i.e.,
    you can now write `def foo = puts "Hello"`.
    Note that `private def foo = puts "Hello"` does not parse.
    [[Feature #17398]]

## Command line options

* `--disable-gems` is now explicitly declared as "just for debugging".
  Never use it in any real-world codebase.
  [[Feature #17684]]

## Core classes updates

Note: We're only listing outstanding class updates.

* Array

    * Array#intersect? is added. [[Feature #15198]]

* Class

    *   Class#subclasses, which returns an array of classes
        directly inheriting from the receiver, not
        including singleton classes.
        [[Feature #18273]]

        ```ruby
        class A; end
        class B < A; end
        class C < B; end
        class D < A; end
        A.subclasses    #=> [D, B]
        B.subclasses    #=> [C]
        C.subclasses    #=> []
        ```

* Enumerable

    *   Enumerable#compact is added. [[Feature #17312]]

    *   Enumerable#tally now accepts an optional hash to count. [[Feature #17744]]

    *   Enumerable#each_cons and each_slice to return a receiver. [[GH-1509]]

        ```ruby
        [1, 2, 3].each_cons(2){}
        # 3.0 => nil
        # 3.1 => [1, 2, 3]

        [1, 2, 3].each_slice(2){}
        # 3.0 => nil
        # 3.1 => [1, 2, 3]
        ```

* Enumerator::Lazy

    *   Enumerator::Lazy#compact is added. [[Feature #17312]]

* File

    *   File.dirname now accepts an optional argument for the level to
        strip path components. [[Feature #12194]]

* GC

    *   "GC.measure_total_time = true" enables the measurement of GC.
        Measurement can introduce overhead. It is enabled by default.
        GC.measure_total_time returns the current setting.
        GC.stat[:time] or GC.stat(:time) returns measured time
        in milli-seconds. [[[Feature #10917]]]

    *   GC.total_time returns measured time in nano-seconds. [[[Feature #10917]]]

* Integer

    *   Integer.try_convert is added. [[Feature #15211]]

* Kernel


    *   Kernel#load now accepts a module as the second argument,
        and will load the file using the given module as the
        top-level module. [[Feature #6210]]

* Marshal

    *   Marshal.load now accepts a `freeze: true` option.
        All returned objects are frozen except for `Class` and
        `Module` instances. Strings are deduplicated. [[Feature #18148]]

* MatchData

    *   MatchData#match is added [[Feature #18172]]

    *   MatchData#match_length is added [[Feature #18172]]

* Method / UnboundMethod

    *   Method#public?, Method#private?, Method#protected?,
        UnboundMethod#public?, UnboundMethod#private?,
        UnboundMethod#protected? have been added. [[Feature #11689]]

* Module

    *   Module#prepend now modifies the ancestor chain if the receiver
        already includes the argument. Module#prepend still does not
        modify the ancestor chain if the receiver has already prepended
        the argument. [[Bug #17423]]

    *   Module#private, #public, #protected, and #module_function will
        now return their arguments.  If a single argument is given, it
        is returned. If no arguments are given, nil is returned.  If
        multiple arguments are given, they are returned as an array.
        [[Feature #12495]]

* Process

    *   Process.\_fork is added. This is a core method for fork(2).
        Do not call this method directly; it is called by existing
        fork methods: Kernel.#fork, Process.fork, and IO.popen("-").
        Application monitoring libraries can overwrite this method to
        hook fork events. [[Feature #17795]]

* Struct

    *   Passing only keyword arguments to Struct#initialize is warned.
        You need to use a Hash literal to set a Hash to a first member.
        [[Feature #16806]]

    *   StructClass#keyword_init? is added [[Feature #18008]]

* String

    *   Update Unicode version to 13.0.0 [[Feature #17750]]
        and Emoji version to 13.0 [[Feature #18029]]

    *   String#unpack and String#unpack1 now accept an `offset:` keyword
        argument to start the unpacking after an arbitrary number of bytes
        have been skipped. If `offset` is outside of the string bounds
        `ArgumentError` is raised. [[Feature #18254]]

* Thread

    *   Thread#native_thread_id is added. [[Feature #17853]]

* Thread::Backtrace

    *   Thread::Backtrace.limit, which returns the value to limit backtrace
        length set by `--backtrace-limit` command line option, is added.
        [[Feature #17479]]

* Thread::Queue

    *   Thread::Queue.new now accepts an Enumerable of initial values.
        [[Feature #17327]]

* Time

    *   Time.new now accepts optional `in:` keyword argument for the
        timezone, as well as `Time.at` and `Time.now`, so that is now
        you can omit minor arguments to `Time.new`. [[Feature #17485]]

        ```ruby
        Time.new(2021, 12, 25, in: "+07:00")
        #=> 2021-12-25 00:00:00 +0700
        ```

        At the same time, time component strings are converted to
        integers more strictly now.

        ```ruby
        Time.new(2021, 12, 25, "+07:30")
        #=> invalid value for Integer(): "+07:30" (ArgumentError)
        ```

        Ruby 3.0 or earlier returned probably unexpected result
        `2021-12-25 07:00:00`, not `2021-12-25 07:30:00` nor
        `2021-12-25 00:00:00 +07:30`.

    *   Time#strftime supports RFC 3339 UTC for unknown offset local
        time, `-0000`, as `%-z`. [[Feature #17544]]

* TracePoint

    *   TracePoint.allow_reentry is added to allow reenter while TracePoint
        callback.
        [[Feature #15912]]

* $LOAD_PATH

    *   $LOAD_PATH.resolve_feature_path does not raise. [[Feature #16043]]

* Fiber Scheduler

    *   Add support for `Addrinfo.getaddrinfo` using `address_resolve` hook.
        [[Feature #17370]]

    *   Introduce non-blocking `Timeout.timeout` using `timeout_after` hook.
        [[Feature #17470]]

    *   Introduce new scheduler hooks `io_read` and `io_write` along with a
        low level `IO::Buffer` for zero-copy read/write. [[Feature #18020]]

    *   IO hooks `io_wait`, `io_read`, `io_write`, receive the original IO object
        where possible. [[Bug #18003]]

    *   Make `Monitor` fiber-safe. [[Bug #17827]]

    *   Replace copy coroutine with pthread implementation. [[Feature #18015]]

* Refinement

    *   New class which represents a module created by Module#refine.
        `include` and `prepend` are deprecated, and `import_methods` is added
        instead. [[Bug #17429]]

## Stdlib updates

*   The following default gem are updated.
    * RubyGems 3.3.3
    * base64 0.1.1
    * benchmark 0.2.0
    * bigdecimal 3.1.1
    * bundler 2.3.3
    * cgi 0.3.1
    * csv 3.2.2
    * date 3.2.2
    * did_you_mean 1.6.1
    * digest 3.1.0
    * drb 2.1.0
    * erb 2.2.3
    * error_highlight 0.3.0
    * etc 1.3.0
    * fcntl 1.0.1
    * fiddle 1.1.0
    * fileutils 1.6.0
    * find 0.1.1
    * io-console 0.5.10
    * io-wait 0.2.1
    * ipaddr 1.2.3
    * irb 1.4.1
    * json 2.6.1
    * logger 1.5.0
    * net-http 0.2.0
    * net-protocol 0.1.2
    * nkf 0.1.1
    * open-uri 0.2.0
    * openssl 3.0.0
    * optparse 0.2.0
    * ostruct 0.5.2
    * pathname 0.2.0
    * pp 0.3.0
    * prettyprint 0.1.1
    * psych 4.0.3
    * racc 1.6.0
    * rdoc 6.4.0
    * readline 0.0.3
    * readline-ext 0.1.4
    * reline 0.3.0
    * resolv 0.2.1
    * rinda 0.1.1
    * ruby2_keywords 0.0.5
    * securerandom 0.1.1
    * set 1.0.2
    * stringio 3.0.1
    * strscan 3.0.1
    * tempfile 0.1.2
    * time 0.2.0
    * timeout 0.2.0
    * tmpdir 0.1.2
    * un 0.2.0
    * uri 0.11.0
    * yaml 0.2.0
    * zlib 2.1.1
*   The following bundled gems are updated.
    * minitest 5.15.0
    * power_assert 2.0.1
    * rake 13.0.6
    * test-unit 3.5.3
    * rexml 3.2.5
    * rbs 2.1.0
    * typeprof 0.21.2
*   The following default gems are now bundled gems.
    * net-ftp 0.1.3
    * net-imap 0.2.3
    * net-pop 0.1.1
    * net-smtp 0.3.1
    * matrix 0.4.2
    * prime 0.1.2
    * debug 1.4.0

* Coverage measurement now supports suspension. You can use `Coverage.suspend`
  to stop the measurement temporarily, and `Coverage.resume` to restart it.
  See [[Feature #18176]] in detail.

* Random::Formatter is moved to random/formatter.rb, so that you can
  use `Random#hex`, `Random#base64`, and so on without SecureRandom.
  [[Feature #18190]]

## Compatibility issues

Note: Excluding feature bug fixes.

* `rb_io_wait_readable`, `rb_io_wait_writable` and `rb_wait_for_single_fd` are
  deprecated in favour of `rb_io_maybe_wait_readable`,
  `rb_io_maybe_wait_writable` and `rb_io_maybe_wait` respectively.
  `rb_thread_wait_fd` and `rb_thread_fd_writable` are deprecated. [[Bug #18003]]

## Stdlib compatibility issues

* `ERB#initialize` warns `safe_level` and later arguments even without -w.
  [[Feature #14256]]

* `lib/debug.rb` is replaced with `debug.gem`

* `Kernel#pp` in `lib/pp.rb` uses the width of `IO#winsize` by default.
  This means that the output width is automatically changed depending on
  your terminal size. [[Feature #12913]]

* Psych 4.0 changes `Psych.load` as `safe_load` by the default.
  You may need to use Psych 3.3.2 for migrating to this behavior.
  [[Bug #17866]]

## C API updates

* Documented. [[GH-4815]]

* `rb_gc_force_recycle` is deprecated and has been changed to a no-op.
  [[Feature #18290]]

## Implementation improvements

* Inline cache mechanism is introduced for reading class variables.
  [[Feature #17763]]

* `instance_eval` and `instance_exec` now only allocate a singleton class when
  required, avoiding extra objects and improving performance. [[GH-5146]]

* The performance of `Struct` accessors is improved. [[GH-5131]]

* `mandatory_only?` builtin special form to improve performance on
  builtin methods. [[GH-5112]]

* Experimental feature Variable Width Allocation in the garbage collector.
  This feature is turned off by default and can be enabled by compiling Ruby
  with flag `USE_RVARGC=1` set. [[Feature #18045]] [[Feature #18239]]

## JIT

* Rename Ruby 3.0's `--jit` to `--mjit`, and alias `--jit` to `--yjit`
  on non-Windows x86-64 platforms and to `--mjit` on others.

### MJIT

* The default `--mjit-max-cache` is changed from 100 to 10000.

* JIT-ed code is no longer cancelled when a TracePoint for class events
  is enabled.

* The JIT compiler no longer skips compilation of methods longer than
  1000 instructions.

* `--mjit-verbose` and `--mjit-warning` output "JIT cancel" when JIT-ed
  code is disabled because TracePoint or GC.compact is used.

### YJIT: New experimental in-process JIT compiler

New JIT compiler available as an experimental feature. [[Feature #18229]]

See [this blog post](https://shopify.engineering/yjit-just-in-time-compiler-cruby
) introducing the project.

* Disabled by default, use `--yjit` command-line option to enable YJIT.

* Performance improvements on benchmarks based on real-world software,
  up to 22% on railsbench, 39% on liquid-render.

* Fast warm-up times.

* Limited to Unix-like x86-64 platforms for now.

## Static analysis

### RBS

*   Generics type parameters can be bounded ([PR](https://github.com/ruby/rbs/pull/844)).

    ```rbs
    # `T` must be compatible with the `_Output` interface.
    # `PrettyPrint[String]` is ok, but `PrettyPrint[Integer]` is a type error.
    class PrettyPrint[T < _Output]
      interface _Output
        def <<: (String) -> void
      end

      attr_reader output: T

      def initialize: (T output) -> void
    end
    ```

*   Type aliases can be generic. ([PR](https://github.com/ruby/rbs/pull/823))

    ```rbs
    # Defines a generic type `list`.
    type list[T] = [ T, list[T] ]
                 | nil

    type str_list = list[String]
    type int_list = list[Integer]
    ```

* [rbs collection](https://github.com/ruby/rbs/blob/master/docs/collection.md) has been introduced to manage gems’ RBSs.

* Many signatures for built-in and standard libraries have been added/updated.

* It includes many bug fixes and performance improvements too.

See the [CHANGELOG.md](https://github.com/ruby/rbs/blob/master/CHANGELOG.md) for more information.

### TypeProf

* [Experimental IDE support](https://github.com/ruby/typeprof/blob/master/doc/ide.md) has been implemented.
* Many bug fixes and performance improvements since Ruby 3.0.0.

## Debugger

* A new debugger [debug.gem](https://github.com/ruby/debug) is bundled.
  debug.gem is a fast debugger implementation, and it provides many features
  like remote debugging, colorful REPL, IDE (VSCode) integration, and more.
  It replaces `lib/debug.rb` standard library.

* `rdbg` command is also installed into `bin/` directory to start and control
  debugging execution.

## error_highlight

A built-in gem called error_highlight has been introduced.
It shows fine-grained error locations in the backtrace.

Example: `title = json[:article][:title]`

If `json` is nil, it shows:

```
$ ruby test.rb
test.rb:2:in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)

title = json[:article][:title]
            ^^^^^^^^^^
```

If `json[:article]` returns nil, it shows:

```
$ ruby test.rb
test.rb:2:in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)

title = json[:article][:title]
                      ^^^^^^^^
```

This feature is enabled by default.
You can disable it by using a command-line option `--disable-error_highlight`.
See [the repository](https://github.com/ruby/error_highlight) in detail.

## IRB Autocomplete and Document Display

The IRB now has an autocomplete feature, where you can just type in the code, and the completion candidates dialog will appear. You can use Tab and Shift+Tab to move up and down.

If documents are installed when you select a completion candidate, the documentation dialog will appear next to the completion candidates dialog, showing part of the content. You can read the full document by pressing Alt+d.

## Miscellaneous changes

* lib/objspace/trace.rb is added, which is a tool for tracing the object
  allocation. Just by requiring this file, tracing is started *immediately*.
  Just by `Kernel#p`, you can investigate where an object was created.
  Note that just requiring this file brings a large performance overhead.
  This is only for debugging purposes. Do not use this in production.
  [[Feature #17762]]

* Now exceptions raised in finalizers will be printed to `STDERR`, unless
  `$VERBOSE` is `nil`.  [[Feature #17798]]

* `ruby -run -e httpd` displays URLs to access.  [[Feature #17847]]

* Add `ruby -run -e colorize` to colorize Ruby code using
  `IRB::Color.colorize_code`.

[Bug #4443]:      https://bugs.ruby-lang.org/issues/4443
[Feature #6210]:  https://bugs.ruby-lang.org/issues/6210
[Feature #10917]: https://bugs.ruby-lang.org/issues/10917
[Feature #11256]: https://bugs.ruby-lang.org/issues/11256
[Feature #11689]: https://bugs.ruby-lang.org/issues/11689
[Feature #12194]: https://bugs.ruby-lang.org/issues/12194
[Feature #12495]: https://bugs.ruby-lang.org/issues/12495
[Feature #12913]: https://bugs.ruby-lang.org/issues/12913
[Feature #14256]: https://bugs.ruby-lang.org/issues/14256
[Feature #14579]: https://bugs.ruby-lang.org/issues/14579
[Feature #15198]: https://bugs.ruby-lang.org/issues/15198
[Feature #15211]: https://bugs.ruby-lang.org/issues/15211
[Feature #15912]: https://bugs.ruby-lang.org/issues/15912
[Feature #16043]: https://bugs.ruby-lang.org/issues/16043
[Feature #16182]: https://bugs.ruby-lang.org/issues/16182
[Feature #16806]: https://bugs.ruby-lang.org/issues/16806
[Feature #17312]: https://bugs.ruby-lang.org/issues/17312
[Feature #17327]: https://bugs.ruby-lang.org/issues/17327
[Feature #17370]: https://bugs.ruby-lang.org/issues/17370
[Feature #17398]: https://bugs.ruby-lang.org/issues/17398
[Feature #17411]: https://bugs.ruby-lang.org/issues/17411
[Bug #17423]:     https://bugs.ruby-lang.org/issues/17423
[Bug #17429]:     https://bugs.ruby-lang.org/issues/17429
[Feature #17470]: https://bugs.ruby-lang.org/issues/17470
[Feature #17479]: https://bugs.ruby-lang.org/issues/17479
[Feature #17485]: https://bugs.ruby-lang.org/issues/17485
[Feature #17544]: https://bugs.ruby-lang.org/issues/17544
[Feature #17592]: https://bugs.ruby-lang.org/issues/17592
[Feature #17684]: https://bugs.ruby-lang.org/issues/17684
[Feature #17724]: https://bugs.ruby-lang.org/issues/17724
[Feature #17744]: https://bugs.ruby-lang.org/issues/17744
[Feature #17750]: https://bugs.ruby-lang.org/issues/17750
[Feature #17762]: https://bugs.ruby-lang.org/issues/17762
[Feature #17763]: https://bugs.ruby-lang.org/issues/17763
[Feature #17795]: https://bugs.ruby-lang.org/issues/17795
[Feature #17798]: https://bugs.ruby-lang.org/issues/17798
[Bug #17827]:     https://bugs.ruby-lang.org/issues/17827
[Feature #17847]: https://bugs.ruby-lang.org/issues/17847
[Feature #17853]: https://bugs.ruby-lang.org/issues/17853
[Bug #17866]:     https://bugs.ruby-lang.org/issues/17866
[Bug #18003]:     https://bugs.ruby-lang.org/issues/18003
[Feature #18008]: https://bugs.ruby-lang.org/issues/18008
[Feature #18015]: https://bugs.ruby-lang.org/issues/18015
[Feature #18020]: https://bugs.ruby-lang.org/issues/18020
[Feature #18029]: https://bugs.ruby-lang.org/issues/18029
[Feature #18045]: https://bugs.ruby-lang.org/issues/18045
[Feature #18148]: https://bugs.ruby-lang.org/issues/18148
[Feature #18172]: https://bugs.ruby-lang.org/issues/18172
[Feature #18176]: https://bugs.ruby-lang.org/issues/18176
[Feature #18190]: https://bugs.ruby-lang.org/issues/18190
[Feature #18229]: https://bugs.ruby-lang.org/issues/18229
[Feature #18239]: https://bugs.ruby-lang.org/issues/18239
[Feature #18254]: https://bugs.ruby-lang.org/issues/18254
[Feature #18273]: https://bugs.ruby-lang.org/issues/18273
[Feature #18290]: https://bugs.ruby-lang.org/issues/18290

[GH-1509]: https://github.com/ruby/ruby/pull/1509
[GH-4815]: https://github.com/ruby/ruby/pull/4815
[GH-5112]: https://github.com/ruby/ruby/pull/5112
[GH-5131]: https://github.com/ruby/ruby/pull/5131
[GH-5146]: https://github.com/ruby/ruby/pull/5146
PK}$[)iT���ruby/expect.rbnu�[���# frozen_string_literal: true
$expect_verbose = false

# Expect library adds the IO instance method #expect, which does similar act to
# tcl's expect extension.
#
# In order to use this method, you must require expect:
#
#   require 'expect'
#
# Please see #expect for usage.
class IO
  # call-seq:
  #   IO#expect(pattern,timeout=9999999)                  ->  Array
  #   IO#expect(pattern,timeout=9999999) { |result| ... } ->  nil
  #
  # Reads from the IO until the given +pattern+ matches or the +timeout+ is over.
  #
  # It returns an array with the read buffer, followed by the matches.
  # If a block is given, the result is yielded to the block and returns nil.
  #
  # When called without a block, it waits until the input that matches the
  # given +pattern+ is obtained from the IO or the time specified as the
  # timeout passes. An array is returned when the pattern is obtained from the
  # IO. The first element of the array is the entire string obtained from the
  # IO until the pattern matches, followed by elements indicating which the
  # pattern which matched to the anchor in the regular expression.
  #
  # The optional timeout parameter defines, in seconds, the total time to wait
  # for the pattern.  If the timeout expires or eof is found, nil is returned
  # or yielded.  However, the buffer in a timeout session is kept for the next
  # expect call.  The default timeout is 9999999 seconds.
  def expect(pat,timeout=9999999)
    buf = ''.dup
    case pat
    when String
      e_pat = Regexp.new(Regexp.quote(pat))
    when Regexp
      e_pat = pat
    else
      raise TypeError, "unsupported pattern class: #{pat.class}"
    end
    @unusedBuf ||= ''
    while true
      if not @unusedBuf.empty?
        c = @unusedBuf.slice!(0)
      elsif !IO.select([self],nil,nil,timeout) or eof? then
        result = nil
        @unusedBuf = buf
        break
      else
        c = getc
      end
      buf << c
      if $expect_verbose
        STDOUT.print c
        STDOUT.flush
      end
      if mat=e_pat.match(buf) then
        result = [buf,*mat.captures]
        break
      end
    end
    if block_given? then
      yield result
    else
      return result
    end
    nil
  end
end
PK}$[?pF�SSruby/rinda/rinda.rbnu�[���# frozen_string_literal: false
require 'drb/drb'

##
# A module to implement the Linda distributed computing paradigm in Ruby.
#
# Rinda is part of DRb (dRuby).
#
# == Example(s)
#
# See the sample/drb/ directory in the Ruby distribution, from 1.8.2 onwards.
#
#--
# TODO
# == Introduction to Linda/rinda?
#
# == Why is this library separate from DRb?

module Rinda

  ##
  # Rinda error base class

  class RindaError < RuntimeError; end

  ##
  # Raised when a hash-based tuple has an invalid key.

  class InvalidHashTupleKey < RindaError; end

  ##
  # Raised when trying to use a canceled tuple.

  class RequestCanceledError < ThreadError; end

  ##
  # Raised when trying to use an expired tuple.

  class RequestExpiredError < ThreadError; end

  ##
  # A tuple is the elementary object in Rinda programming.
  # Tuples may be matched against templates if the tuple and
  # the template are the same size.

  class Tuple

    ##
    # Creates a new Tuple from +ary_or_hash+ which must be an Array or Hash.

    def initialize(ary_or_hash)
      if hash?(ary_or_hash)
        init_with_hash(ary_or_hash)
      else
        init_with_ary(ary_or_hash)
      end
    end

    ##
    # The number of elements in the tuple.

    def size
      @tuple.size
    end

    ##
    # Accessor method for elements of the tuple.

    def [](k)
      @tuple[k]
    end

    ##
    # Fetches item +k+ from the tuple.

    def fetch(k)
      @tuple.fetch(k)
    end

    ##
    # Iterate through the tuple, yielding the index or key, and the
    # value, thus ensuring arrays are iterated similarly to hashes.

    def each # FIXME
      if Hash === @tuple
        @tuple.each { |k, v| yield(k, v) }
      else
        @tuple.each_with_index { |v, k| yield(k, v) }
      end
    end

    ##
    # Return the tuple itself
    def value
      @tuple
    end

    private

    def hash?(ary_or_hash)
      ary_or_hash.respond_to?(:keys)
    end

    ##
    # Munges +ary+ into a valid Tuple.

    def init_with_ary(ary)
      @tuple = Array.new(ary.size)
      @tuple.size.times do |i|
        @tuple[i] = ary[i]
      end
    end

    ##
    # Ensures +hash+ is a valid Tuple.

    def init_with_hash(hash)
      @tuple = Hash.new
      hash.each do |k, v|
        raise InvalidHashTupleKey unless String === k
        @tuple[k] = v
      end
    end

  end

  ##
  # Templates are used to match tuples in Rinda.

  class Template < Tuple

    ##
    # Matches this template against +tuple+.  The +tuple+ must be the same
    # size as the template.  An element with a +nil+ value in a template acts
    # as a wildcard, matching any value in the corresponding position in the
    # tuple.  Elements of the template match the +tuple+ if the are #== or
    # #===.
    #
    #   Template.new([:foo, 5]).match   Tuple.new([:foo, 5]) # => true
    #   Template.new([:foo, nil]).match Tuple.new([:foo, 5]) # => true
    #   Template.new([String]).match    Tuple.new(['hello']) # => true
    #
    #   Template.new([:foo]).match      Tuple.new([:foo, 5]) # => false
    #   Template.new([:foo, 6]).match   Tuple.new([:foo, 5]) # => false
    #   Template.new([:foo, nil]).match Tuple.new([:foo])    # => false
    #   Template.new([:foo, 6]).match   Tuple.new([:foo])    # => false

    def match(tuple)
      return false unless tuple.respond_to?(:size)
      return false unless tuple.respond_to?(:fetch)
      return false unless self.size == tuple.size
      each do |k, v|
        begin
          it = tuple.fetch(k)
        rescue
          return false
        end
        next if v.nil?
        next if v == it
        next if v === it
        return false
      end
      return true
    end

    ##
    # Alias for #match.

    def ===(tuple)
      match(tuple)
    end

  end

  ##
  # <i>Documentation?</i>

  class DRbObjectTemplate

    ##
    # Creates a new DRbObjectTemplate that will match against +uri+ and +ref+.

    def initialize(uri=nil, ref=nil)
      @drb_uri = uri
      @drb_ref = ref
    end

    ##
    # This DRbObjectTemplate matches +ro+ if the remote object's drburi and
    # drbref are the same.  +nil+ is used as a wildcard.

    def ===(ro)
      return true if super(ro)
      unless @drb_uri.nil?
        return false unless (@drb_uri === ro.__drburi rescue false)
      end
      unless @drb_ref.nil?
        return false unless (@drb_ref === ro.__drbref rescue false)
      end
      true
    end

  end

  ##
  # TupleSpaceProxy allows a remote Tuplespace to appear as local.

  class TupleSpaceProxy
    ##
    # A Port ensures that a moved tuple arrives properly at its destination
    # and does not get lost.
    #
    # See https://bugs.ruby-lang.org/issues/8125

    class Port # :nodoc:
      attr_reader :value

      def self.deliver
        port = new

        begin
          yield(port)
        ensure
          port.close
        end

        port.value
      end

      def initialize
        @open = true
        @value = nil
      end

      ##
      # Don't let the DRb thread push to it when remote sends tuple

      def close
        @open = false
      end

      ##
      # Stores +value+ and ensure it does not get marshaled multiple times.

      def push value
        raise 'port closed' unless @open

        @value = value

        nil # avoid Marshal
      end
    end

    ##
    # Creates a new TupleSpaceProxy to wrap +ts+.

    def initialize(ts)
      @ts = ts
    end

    ##
    # Adds +tuple+ to the proxied TupleSpace.  See TupleSpace#write.

    def write(tuple, sec=nil)
      @ts.write(tuple, sec)
    end

    ##
    # Takes +tuple+ from the proxied TupleSpace.  See TupleSpace#take.

    def take(tuple, sec=nil, &block)
      Port.deliver do |port|
        @ts.move(DRbObject.new(port), tuple, sec, &block)
      end
    end

    ##
    # Reads +tuple+ from the proxied TupleSpace.  See TupleSpace#read.

    def read(tuple, sec=nil, &block)
      @ts.read(tuple, sec, &block)
    end

    ##
    # Reads all tuples matching +tuple+ from the proxied TupleSpace.  See
    # TupleSpace#read_all.

    def read_all(tuple)
      @ts.read_all(tuple)
    end

    ##
    # Registers for notifications of event +ev+ on the proxied TupleSpace.
    # See TupleSpace#notify

    def notify(ev, tuple, sec=nil)
      @ts.notify(ev, tuple, sec)
    end

  end

  ##
  # An SimpleRenewer allows a TupleSpace to check if a TupleEntry is still
  # alive.

  class SimpleRenewer

    include DRbUndumped

    ##
    # Creates a new SimpleRenewer that keeps an object alive for another +sec+
    # seconds.

    def initialize(sec=180)
      @sec = sec
    end

    ##
    # Called by the TupleSpace to check if the object is still alive.

    def renew
      @sec
    end
  end

end

PK}$[]@��1212ruby/rinda/ring.rbnu�[���# frozen_string_literal: false
#
# Note: Rinda::Ring API is unstable.
#
require 'drb/drb'
require_relative 'rinda'
require 'ipaddr'

module Rinda

  ##
  # The default port Ring discovery will use.

  Ring_PORT = 7647

  ##
  # A RingServer allows a Rinda::TupleSpace to be located via UDP broadcasts.
  # Default service location uses the following steps:
  #
  # 1. A RingServer begins listening on the network broadcast UDP address.
  # 2. A RingFinger sends a UDP packet containing the DRb URI where it will
  #    listen for a reply.
  # 3. The RingServer receives the UDP packet and connects back to the
  #    provided DRb URI with the DRb service.
  #
  # A RingServer requires a TupleSpace:
  #
  #   ts = Rinda::TupleSpace.new
  #   rs = Rinda::RingServer.new
  #
  # RingServer can also listen on multicast addresses for announcements.  This
  # allows multiple RingServers to run on the same host.  To use network
  # broadcast and multicast:
  #
  #   ts = Rinda::TupleSpace.new
  #   rs = Rinda::RingServer.new ts, %w[Socket::INADDR_ANY, 239.0.0.1 ff02::1]

  class RingServer

    include DRbUndumped

    ##
    # Special renewer for the RingServer to allow shutdown

    class Renewer # :nodoc:
      include DRbUndumped

      ##
      # Set to false to shutdown future requests using this Renewer

      attr_writer :renew

      def initialize # :nodoc:
        @renew = true
      end

      def renew # :nodoc:
        @renew ? 1 : true
      end
    end

    ##
    # Advertises +ts+ on the given +addresses+ at +port+.
    #
    # If +addresses+ is omitted only the UDP broadcast address is used.
    #
    # +addresses+ can contain multiple addresses.  If a multicast address is
    # given in +addresses+ then the RingServer will listen for multicast
    # queries.
    #
    # If you use IPv4 multicast you may need to set an address of the inbound
    # interface which joins a multicast group.
    #
    #   ts = Rinda::TupleSpace.new
    #   rs = Rinda::RingServer.new(ts, [['239.0.0.1', '9.5.1.1']])
    #
    # You can set addresses as an Array Object.  The first element of the
    # Array is a multicast address and the second is an inbound interface
    # address.  If the second is omitted then '0.0.0.0' is used.
    #
    # If you use IPv6 multicast you may need to set both the local interface
    # address and the inbound interface index:
    #
    #   rs = Rinda::RingServer.new(ts, [['ff02::1', '::1', 1]])
    #
    # The first element is a multicast address and the second is an inbound
    # interface address.  The third is an inbound interface index.
    #
    # At this time there is no easy way to get an interface index by name.
    #
    # If the second is omitted then '::1' is used.
    # If the third is omitted then 0 (default interface) is used.

    def initialize(ts, addresses=[Socket::INADDR_ANY], port=Ring_PORT)
      @port = port

      if Integer === addresses then
        addresses, @port = [Socket::INADDR_ANY], addresses
      end

      @renewer = Renewer.new

      @ts = ts
      @sockets = []
      addresses.each do |address|
        if Array === address
          make_socket(*address)
        else
          make_socket(address)
        end
      end

      @w_services = write_services
      @r_service  = reply_service
    end

    ##
    # Creates a socket at +address+
    #
    # If +address+ is multicast address then +interface_address+ and
    # +multicast_interface+ can be set as optional.
    #
    # A created socket is bound to +interface_address+.  If you use IPv4
    # multicast then the interface of +interface_address+ is used as the
    # inbound interface.  If +interface_address+ is omitted or nil then
    # '0.0.0.0' or '::1' is used.
    #
    # If you use IPv6 multicast then +multicast_interface+ is used as the
    # inbound interface.  +multicast_interface+ is a network interface index.
    # If +multicast_interface+ is omitted then 0 (default interface) is used.

    def make_socket(address, interface_address=nil, multicast_interface=0)
      addrinfo = Addrinfo.udp(address, @port)

      socket = Socket.new(addrinfo.pfamily, addrinfo.socktype,
                          addrinfo.protocol)

      if addrinfo.ipv4_multicast? or addrinfo.ipv6_multicast? then
        if Socket.const_defined?(:SO_REUSEPORT) then
          socket.setsockopt(:SOCKET, :SO_REUSEPORT, true)
        else
          socket.setsockopt(:SOCKET, :SO_REUSEADDR, true)
        end

        if addrinfo.ipv4_multicast? then
          interface_address = '0.0.0.0' if interface_address.nil?
          socket.bind(Addrinfo.udp(interface_address, @port))

          mreq = IPAddr.new(addrinfo.ip_address).hton +
            IPAddr.new(interface_address).hton

          socket.setsockopt(:IPPROTO_IP, :IP_ADD_MEMBERSHIP, mreq)
        else
          interface_address = '::1' if interface_address.nil?
          socket.bind(Addrinfo.udp(interface_address, @port))

          mreq = IPAddr.new(addrinfo.ip_address).hton +
            [multicast_interface].pack('I')

          socket.setsockopt(:IPPROTO_IPV6, :IPV6_JOIN_GROUP, mreq)
        end
      else
        socket.bind(addrinfo)
      end

      socket
    rescue
      socket = socket.close if socket
      raise
    ensure
      @sockets << socket if socket
    end

    ##
    # Creates threads that pick up UDP packets and passes them to do_write for
    # decoding.

    def write_services
      @sockets.map do |s|
        Thread.new(s) do |socket|
          loop do
            msg = socket.recv(1024)
            do_write(msg)
          end
        end
      end
    end

    ##
    # Extracts the response URI from +msg+ and adds it to TupleSpace where it
    # will be picked up by +reply_service+ for notification.

    def do_write(msg)
      Thread.new do
        begin
          tuple, sec = Marshal.load(msg)
          @ts.write(tuple, sec)
        rescue
        end
      end
    end

    ##
    # Creates a thread that notifies waiting clients from the TupleSpace.

    def reply_service
      Thread.new do
        loop do
          do_reply
        end
      end
    end

    ##
    # Pulls lookup tuples out of the TupleSpace and sends their DRb object the
    # address of the local TupleSpace.

    def do_reply
      tuple = @ts.take([:lookup_ring, nil], @renewer)
      Thread.new { tuple[1].call(@ts) rescue nil}
    rescue
    end

    ##
    # Shuts down the RingServer

    def shutdown
      @renewer.renew = false

      @w_services.each do |thread|
        thread.kill
        thread.join
      end

      @sockets.each do |socket|
        socket.close
      end

      @r_service.kill
      @r_service.join
    end

  end

  ##
  # RingFinger is used by RingServer clients to discover the RingServer's
  # TupleSpace.  Typically, all a client needs to do is call
  # RingFinger.primary to retrieve the remote TupleSpace, which it can then
  # begin using.
  #
  # To find the first available remote TupleSpace:
  #
  #   Rinda::RingFinger.primary
  #
  # To create a RingFinger that broadcasts to a custom list:
  #
  #   rf = Rinda::RingFinger.new  ['localhost', '192.0.2.1']
  #   rf.primary
  #
  # Rinda::RingFinger also understands multicast addresses and sets them up
  # properly.  This allows you to run multiple RingServers on the same host:
  #
  #   rf = Rinda::RingFinger.new ['239.0.0.1']
  #   rf.primary
  #
  # You can set the hop count (or TTL) for multicast searches using
  # #multicast_hops.
  #
  # If you use IPv6 multicast you may need to set both an address and the
  # outbound interface index:
  #
  #   rf = Rinda::RingFinger.new ['ff02::1']
  #   rf.multicast_interface = 1
  #   rf.primary
  #
  # At this time there is no easy way to get an interface index by name.

  class RingFinger

    @@broadcast_list = ['<broadcast>', 'localhost']

    @@finger = nil

    ##
    # Creates a singleton RingFinger and looks for a RingServer.  Returns the
    # created RingFinger.

    def self.finger
      unless @@finger
        @@finger = self.new
        @@finger.lookup_ring_any
      end
      @@finger
    end

    ##
    # Returns the first advertised TupleSpace.

    def self.primary
      finger.primary
    end

    ##
    # Contains all discovered TupleSpaces except for the primary.

    def self.to_a
      finger.to_a
    end

    ##
    # The list of addresses where RingFinger will send query packets.

    attr_accessor :broadcast_list

    ##
    # Maximum number of hops for sent multicast packets (if using a multicast
    # address in the broadcast list).  The default is 1 (same as UDP
    # broadcast).

    attr_accessor :multicast_hops

    ##
    # The interface index to send IPv6 multicast packets from.

    attr_accessor :multicast_interface

    ##
    # The port that RingFinger will send query packets to.

    attr_accessor :port

    ##
    # Contain the first advertised TupleSpace after lookup_ring_any is called.

    attr_accessor :primary

    ##
    # Creates a new RingFinger that will look for RingServers at +port+ on
    # the addresses in +broadcast_list+.
    #
    # If +broadcast_list+ contains a multicast address then multicast queries
    # will be made using the given multicast_hops and multicast_interface.

    def initialize(broadcast_list=@@broadcast_list, port=Ring_PORT)
      @broadcast_list = broadcast_list || ['localhost']
      @port = port
      @primary = nil
      @rings = []

      @multicast_hops = 1
      @multicast_interface = 0
    end

    ##
    # Contains all discovered TupleSpaces except for the primary.

    def to_a
      @rings
    end

    ##
    # Iterates over all discovered TupleSpaces starting with the primary.

    def each
      lookup_ring_any unless @primary
      return unless @primary
      yield(@primary)
      @rings.each { |x| yield(x) }
    end

    ##
    # Looks up RingServers waiting +timeout+ seconds.  RingServers will be
    # given +block+ as a callback, which will be called with the remote
    # TupleSpace.

    def lookup_ring(timeout=5, &block)
      return lookup_ring_any(timeout) unless block_given?

      msg = Marshal.dump([[:lookup_ring, DRbObject.new(block)], timeout])
      @broadcast_list.each do |it|
        send_message(it, msg)
      end
      sleep(timeout)
    end

    ##
    # Returns the first found remote TupleSpace.  Any further recovered
    # TupleSpaces can be found by calling +to_a+.

    def lookup_ring_any(timeout=5)
      queue = Thread::Queue.new

      Thread.new do
        self.lookup_ring(timeout) do |ts|
          queue.push(ts)
        end
        queue.push(nil)
      end

      @primary = queue.pop
      raise('RingNotFound') if @primary.nil?

      Thread.new do
        while it = queue.pop
          @rings.push(it)
        end
      end

      @primary
    end

    ##
    # Creates a socket for +address+ with the appropriate multicast options
    # for multicast addresses.

    def make_socket(address) # :nodoc:
      addrinfo = Addrinfo.udp(address, @port)

      soc = Socket.new(addrinfo.pfamily, addrinfo.socktype, addrinfo.protocol)
      begin
        if addrinfo.ipv4_multicast? then
          soc.setsockopt(Socket::Option.ipv4_multicast_loop(1))
          soc.setsockopt(Socket::Option.ipv4_multicast_ttl(@multicast_hops))
        elsif addrinfo.ipv6_multicast? then
          soc.setsockopt(:IPPROTO_IPV6, :IPV6_MULTICAST_LOOP, true)
          soc.setsockopt(:IPPROTO_IPV6, :IPV6_MULTICAST_HOPS,
                         [@multicast_hops].pack('I'))
          soc.setsockopt(:IPPROTO_IPV6, :IPV6_MULTICAST_IF,
                         [@multicast_interface].pack('I'))
        else
          soc.setsockopt(:SOL_SOCKET, :SO_BROADCAST, true)
        end

        soc.connect(addrinfo)
      rescue Exception
        soc.close
        raise
      end

      soc
    end

    def send_message(address, message) # :nodoc:
      soc = make_socket(address)

      soc.send(message, 0)
    rescue
      nil
    ensure
      soc.close if soc
    end

  end

  ##
  # RingProvider uses a RingServer advertised TupleSpace as a name service.
  # TupleSpace clients can register themselves with the remote TupleSpace and
  # look up other provided services via the remote TupleSpace.
  #
  # Services are registered with a tuple of the format [:name, klass,
  # DRbObject, description].

  class RingProvider

    ##
    # Creates a RingProvider that will provide a +klass+ service running on
    # +front+, with a +description+.  +renewer+ is optional.

    def initialize(klass, front, desc, renewer = nil)
      @tuple = [:name, klass, front, desc]
      @renewer = renewer || Rinda::SimpleRenewer.new
    end

    ##
    # Advertises this service on the primary remote TupleSpace.

    def provide
      ts = Rinda::RingFinger.primary
      ts.write(@tuple, @renewer)
    end

  end

end
PK}$[0��T�7�7ruby/rinda/tuplespace.rbnu�[���# frozen_string_literal: false
require 'monitor'
require 'drb/drb'
require_relative 'rinda'
require 'forwardable'

module Rinda

  ##
  # A TupleEntry is a Tuple (i.e. a possible entry in some Tuplespace)
  # together with expiry and cancellation data.

  class TupleEntry

    include DRbUndumped

    attr_accessor :expires

    ##
    # Creates a TupleEntry based on +ary+ with an optional renewer or expiry
    # time +sec+.
    #
    # A renewer must implement the +renew+ method which returns a Numeric,
    # nil, or true to indicate when the tuple has expired.

    def initialize(ary, sec=nil)
      @cancel = false
      @expires = nil
      @tuple = make_tuple(ary)
      @renewer = nil
      renew(sec)
    end

    ##
    # Marks this TupleEntry as canceled.

    def cancel
      @cancel = true
    end

    ##
    # A TupleEntry is dead when it is canceled or expired.

    def alive?
      !canceled? && !expired?
    end

    ##
    # Return the object which makes up the tuple itself: the Array
    # or Hash.

    def value; @tuple.value; end

    ##
    # Returns the canceled status.

    def canceled?; @cancel; end

    ##
    # Has this tuple expired? (true/false).
    #
    # A tuple has expired when its expiry timer based on the +sec+ argument to
    # #initialize runs out.

    def expired?
      return true unless @expires
      return false if @expires > Time.now
      return true if @renewer.nil?
      renew(@renewer)
      return true unless @expires
      return @expires < Time.now
    end

    ##
    # Reset the expiry time according to +sec_or_renewer+.
    #
    # +nil+::    it is set to expire in the far future.
    # +true+::   it has expired.
    # Numeric::  it will expire in that many seconds.
    #
    # Otherwise the argument refers to some kind of renewer object
    # which will reset its expiry time.

    def renew(sec_or_renewer)
      sec, @renewer = get_renewer(sec_or_renewer)
      @expires = make_expires(sec)
    end

    ##
    # Returns an expiry Time based on +sec+ which can be one of:
    # Numeric:: +sec+ seconds into the future
    # +true+::  the expiry time is the start of 1970 (i.e. expired)
    # +nil+::   it is  Tue Jan 19 03:14:07 GMT Standard Time 2038 (i.e. when
    #           UNIX clocks will die)

    def make_expires(sec=nil)
      case sec
      when Numeric
        Time.now + sec
      when true
        Time.at(1)
      when nil
        Time.at(2**31-1)
      end
    end

    ##
    # Retrieves +key+ from the tuple.

    def [](key)
      @tuple[key]
    end

    ##
    # Fetches +key+ from the tuple.

    def fetch(key)
      @tuple.fetch(key)
    end

    ##
    # The size of the tuple.

    def size
      @tuple.size
    end

    ##
    # Creates a Rinda::Tuple for +ary+.

    def make_tuple(ary)
      Rinda::Tuple.new(ary)
    end

    private

    ##
    # Returns a valid argument to make_expires and the renewer or nil.
    #
    # Given +true+, +nil+, or Numeric, returns that value and +nil+ (no actual
    # renewer).  Otherwise it returns an expiry value from calling +it.renew+
    # and the renewer.

    def get_renewer(it)
      case it
      when Numeric, true, nil
        return it, nil
      else
        begin
          return it.renew, it
        rescue Exception
          return it, nil
        end
      end
    end

  end

  ##
  # A TemplateEntry is a Template together with expiry and cancellation data.

  class TemplateEntry < TupleEntry
    ##
    # Matches this TemplateEntry against +tuple+.  See Template#match for
    # details on how a Template matches a Tuple.

    def match(tuple)
      @tuple.match(tuple)
    end

    alias === match

    def make_tuple(ary) # :nodoc:
      Rinda::Template.new(ary)
    end

  end

  ##
  # <i>Documentation?</i>

  class WaitTemplateEntry < TemplateEntry

    attr_reader :found

    def initialize(place, ary, expires=nil)
      super(ary, expires)
      @place = place
      @cond = place.new_cond
      @found = nil
    end

    def cancel
      super
      signal
    end

    def wait
      @cond.wait
    end

    def read(tuple)
      @found = tuple
      signal
    end

    def signal
      @place.synchronize do
        @cond.signal
      end
    end

  end

  ##
  # A NotifyTemplateEntry is returned by TupleSpace#notify and is notified of
  # TupleSpace changes.  You may receive either your subscribed event or the
  # 'close' event when iterating over notifications.
  #
  # See TupleSpace#notify_event for valid notification types.
  #
  # == Example
  #
  #   ts = Rinda::TupleSpace.new
  #   observer = ts.notify 'write', [nil]
  #
  #   Thread.start do
  #     observer.each { |t| p t }
  #   end
  #
  #   3.times { |i| ts.write [i] }
  #
  # Outputs:
  #
  #   ['write', [0]]
  #   ['write', [1]]
  #   ['write', [2]]

  class NotifyTemplateEntry < TemplateEntry

    ##
    # Creates a new NotifyTemplateEntry that watches +place+ for +event+s that
    # match +tuple+.

    def initialize(place, event, tuple, expires=nil)
      ary = [event, Rinda::Template.new(tuple)]
      super(ary, expires)
      @queue = Thread::Queue.new
      @done = false
    end

    ##
    # Called by TupleSpace to notify this NotifyTemplateEntry of a new event.

    def notify(ev)
      @queue.push(ev)
    end

    ##
    # Retrieves a notification.  Raises RequestExpiredError when this
    # NotifyTemplateEntry expires.

    def pop
      raise RequestExpiredError if @done
      it = @queue.pop
      @done = true if it[0] == 'close'
      return it
    end

    ##
    # Yields event/tuple pairs until this NotifyTemplateEntry expires.

    def each # :yields: event, tuple
      while !@done
        it = pop
        yield(it)
      end
    rescue
    ensure
      cancel
    end

  end

  ##
  # TupleBag is an unordered collection of tuples. It is the basis
  # of Tuplespace.

  class TupleBag
    class TupleBin
      extend Forwardable
      def_delegators '@bin', :find_all, :delete_if, :each, :empty?

      def initialize
        @bin = []
      end

      def add(tuple)
        @bin.push(tuple)
      end

      def delete(tuple)
        idx = @bin.rindex(tuple)
        @bin.delete_at(idx) if idx
      end

      def find
        @bin.reverse_each do |x|
          return x if yield(x)
        end
        nil
      end
    end

    def initialize # :nodoc:
      @hash = {}
      @enum = enum_for(:each_entry)
    end

    ##
    # +true+ if the TupleBag to see if it has any expired entries.

    def has_expires?
      @enum.find do |tuple|
        tuple.expires
      end
    end

    ##
    # Add +tuple+ to the TupleBag.

    def push(tuple)
      key = bin_key(tuple)
      @hash[key] ||= TupleBin.new
      @hash[key].add(tuple)
    end

    ##
    # Removes +tuple+ from the TupleBag.

    def delete(tuple)
      key = bin_key(tuple)
      bin = @hash[key]
      return nil unless bin
      bin.delete(tuple)
      @hash.delete(key) if bin.empty?
      tuple
    end

    ##
    # Finds all live tuples that match +template+.
    def find_all(template)
      bin_for_find(template).find_all do |tuple|
        tuple.alive? && template.match(tuple)
      end
    end

    ##
    # Finds a live tuple that matches +template+.

    def find(template)
      bin_for_find(template).find do |tuple|
        tuple.alive? && template.match(tuple)
      end
    end

    ##
    # Finds all tuples in the TupleBag which when treated as templates, match
    # +tuple+ and are alive.

    def find_all_template(tuple)
      @enum.find_all do |template|
        template.alive? && template.match(tuple)
      end
    end

    ##
    # Delete tuples which dead tuples from the TupleBag, returning the deleted
    # tuples.

    def delete_unless_alive
      deleted = []
      @hash.each do |key, bin|
        bin.delete_if do |tuple|
          if tuple.alive?
            false
          else
            deleted.push(tuple)
            true
          end
        end
      end
      deleted
    end

    private
    def each_entry(&blk)
      @hash.each do |k, v|
        v.each(&blk)
      end
    end

    def bin_key(tuple)
      head = tuple[0]
      if head.class == Symbol
        return head
      else
        false
      end
    end

    def bin_for_find(template)
      key = bin_key(template)
      key ? @hash.fetch(key, []) : @enum
    end
  end

  ##
  # The Tuplespace manages access to the tuples it contains,
  # ensuring mutual exclusion requirements are met.
  #
  # The +sec+ option for the write, take, move, read and notify methods may
  # either be a number of seconds or a Renewer object.

  class TupleSpace

    include DRbUndumped
    include MonitorMixin

    ##
    # Creates a new TupleSpace.  +period+ is used to control how often to look
    # for dead tuples after modifications to the TupleSpace.
    #
    # If no dead tuples are found +period+ seconds after the last
    # modification, the TupleSpace will stop looking for dead tuples.

    def initialize(period=60)
      super()
      @bag = TupleBag.new
      @read_waiter = TupleBag.new
      @take_waiter = TupleBag.new
      @notify_waiter = TupleBag.new
      @period = period
      @keeper = nil
    end

    ##
    # Adds +tuple+

    def write(tuple, sec=nil)
      entry = create_entry(tuple, sec)
      synchronize do
        if entry.expired?
          @read_waiter.find_all_template(entry).each do |template|
            template.read(tuple)
          end
          notify_event('write', entry.value)
          notify_event('delete', entry.value)
        else
          @bag.push(entry)
          start_keeper if entry.expires
          @read_waiter.find_all_template(entry).each do |template|
            template.read(tuple)
          end
          @take_waiter.find_all_template(entry).each do |template|
            template.signal
          end
          notify_event('write', entry.value)
        end
      end
      entry
    end

    ##
    # Removes +tuple+

    def take(tuple, sec=nil, &block)
      move(nil, tuple, sec, &block)
    end

    ##
    # Moves +tuple+ to +port+.

    def move(port, tuple, sec=nil)
      template = WaitTemplateEntry.new(self, tuple, sec)
      yield(template) if block_given?
      synchronize do
        entry = @bag.find(template)
        if entry
          port.push(entry.value) if port
          @bag.delete(entry)
          notify_event('take', entry.value)
          return port ? nil : entry.value
        end
        raise RequestExpiredError if template.expired?

        begin
          @take_waiter.push(template)
          start_keeper if template.expires
          while true
            raise RequestCanceledError if template.canceled?
            raise RequestExpiredError if template.expired?
            entry = @bag.find(template)
            if entry
              port.push(entry.value) if port
              @bag.delete(entry)
              notify_event('take', entry.value)
              return port ? nil : entry.value
            end
            template.wait
          end
        ensure
          @take_waiter.delete(template)
        end
      end
    end

    ##
    # Reads +tuple+, but does not remove it.

    def read(tuple, sec=nil)
      template = WaitTemplateEntry.new(self, tuple, sec)
      yield(template) if block_given?
      synchronize do
        entry = @bag.find(template)
        return entry.value if entry
        raise RequestExpiredError if template.expired?

        begin
          @read_waiter.push(template)
          start_keeper if template.expires
          template.wait
          raise RequestCanceledError if template.canceled?
          raise RequestExpiredError if template.expired?
          return template.found
        ensure
          @read_waiter.delete(template)
        end
      end
    end

    ##
    # Returns all tuples matching +tuple+.  Does not remove the found tuples.

    def read_all(tuple)
      template = WaitTemplateEntry.new(self, tuple, nil)
      synchronize do
        entry = @bag.find_all(template)
        entry.collect do |e|
          e.value
        end
      end
    end

    ##
    # Registers for notifications of +event+.  Returns a NotifyTemplateEntry.
    # See NotifyTemplateEntry for examples of how to listen for notifications.
    #
    # +event+ can be:
    # 'write'::  A tuple was added
    # 'take'::   A tuple was taken or moved
    # 'delete':: A tuple was lost after being overwritten or expiring
    #
    # The TupleSpace will also notify you of the 'close' event when the
    # NotifyTemplateEntry has expired.

    def notify(event, tuple, sec=nil)
      template = NotifyTemplateEntry.new(self, event, tuple, sec)
      synchronize do
        @notify_waiter.push(template)
      end
      template
    end

    private

    def create_entry(tuple, sec)
      TupleEntry.new(tuple, sec)
    end

    ##
    # Removes dead tuples.

    def keep_clean
      synchronize do
        @read_waiter.delete_unless_alive.each do |e|
          e.signal
        end
        @take_waiter.delete_unless_alive.each do |e|
          e.signal
        end
        @notify_waiter.delete_unless_alive.each do |e|
          e.notify(['close'])
        end
        @bag.delete_unless_alive.each do |e|
          notify_event('delete', e.value)
        end
      end
    end

    ##
    # Notifies all registered listeners for +event+ of a status change of
    # +tuple+.

    def notify_event(event, tuple)
      ev = [event, tuple]
      @notify_waiter.find_all_template(ev).each do |template|
        template.notify(ev)
      end
    end

    ##
    # Creates a thread that scans the tuplespace for expired tuples.

    def start_keeper
      return if @keeper && @keeper.alive?
      @keeper = Thread.new do
        while true
          sleep(@period)
          synchronize do
            break unless need_keeper?
            keep_clean
          end
        end
      end
    end

    ##
    # Checks the tuplespace to see if it needs cleaning.

    def need_keeper?
      return true if @bag.has_expires?
      return true if @read_waiter.has_expires?
      return true if @take_waiter.has_expires?
      return true if @notify_waiter.has_expires?
    end

  end

end

PK}$[L��;;ruby/optionparser.rbnu�[���# frozen_string_literal: false
require_relative 'optparse'
PK}$[�w��ppruby/coverage.rbnu�[���require "coverage.so"

module Coverage
  def self.line_stub(file)
    lines = File.foreach(file).map { nil }
    iseqs = [RubyVM::InstructionSequence.compile_file(file)]
    until iseqs.empty?
      iseq = iseqs.pop
      iseq.trace_points.each {|n, type| lines[n - 1] = 0 if type == :line }
      iseq.each_child {|child| iseqs << child }
    end
    lines
  end
end
PK}$[�::ruby/random/formatter.rbnu�[���# -*- coding: us-ascii -*-
# frozen_string_literal: true

# == Random number formatter.
#
# Formats generated random numbers in many manners.
#
# === Examples
#
# Generate random hexadecimal strings:
#
#   require 'random/formatter'
#
#   prng.hex(10) #=> "52750b30ffbc7de3b362"
#   prng.hex(10) #=> "92b15d6c8dc4beb5f559"
#   prng.hex(13) #=> "39b290146bea6ce975c37cfc23"
#
# Generate random base64 strings:
#
#   prng.base64(10) #=> "EcmTPZwWRAozdA=="
#   prng.base64(10) #=> "KO1nIU+p9DKxGg=="
#   prng.base64(12) #=> "7kJSM/MzBJI+75j8"
#
# Generate random binary strings:
#
#   prng.random_bytes(10) #=> "\016\t{\370g\310pbr\301"
#   prng.random_bytes(10) #=> "\323U\030TO\234\357\020\a\337"
#
# Generate alphanumeric strings:
#
#   prng.alphanumeric(10) #=> "S8baxMJnPl"
#   prng.alphanumeric(10) #=> "aOxAg8BAJe"
#
# Generate UUIDs:
#
#   prng.uuid #=> "2d931510-d99f-494a-8c67-87feb05e1594"
#   prng.uuid #=> "bad85eb9-0713-4da7-8d36-07a8e4b00eab"

module Random::Formatter

  # Random::Formatter#random_bytes generates a random binary string.
  #
  # The argument _n_ specifies the length of the result string.
  #
  # If _n_ is not specified or is nil, 16 is assumed.
  # It may be larger in future.
  #
  # The result may contain any byte: "\x00" - "\xff".
  #
  #   require 'random/formatter'
  #
  #   prng.random_bytes #=> "\xD8\\\xE0\xF4\r\xB2\xFC*WM\xFF\x83\x18\xF45\xB6"
  #   prng.random_bytes #=> "m\xDC\xFC/\a\x00Uf\xB2\xB2P\xBD\xFF6S\x97"
  def random_bytes(n=nil)
    n = n ? n.to_int : 16
    gen_random(n)
  end

  # Random::Formatter#hex generates a random hexadecimal string.
  #
  # The argument _n_ specifies the length, in bytes, of the random number to be generated.
  # The length of the resulting hexadecimal string is twice of _n_.
  #
  # If _n_ is not specified or is nil, 16 is assumed.
  # It may be larger in the future.
  #
  # The result may contain 0-9 and a-f.
  #
  #   require 'random/formatter'
  #
  #   prng.hex #=> "eb693ec8252cd630102fd0d0fb7c3485"
  #   prng.hex #=> "91dc3bfb4de5b11d029d376634589b61"
  def hex(n=nil)
    random_bytes(n).unpack1("H*")
  end

  # Random::Formatter#base64 generates a random base64 string.
  #
  # The argument _n_ specifies the length, in bytes, of the random number
  # to be generated. The length of the result string is about 4/3 of _n_.
  #
  # If _n_ is not specified or is nil, 16 is assumed.
  # It may be larger in the future.
  #
  # The result may contain A-Z, a-z, 0-9, "+", "/" and "=".
  #
  #   require 'random/formatter'
  #
  #   prng.base64 #=> "/2BuBuLf3+WfSKyQbRcc/A=="
  #   prng.base64 #=> "6BbW0pxO0YENxn38HMUbcQ=="
  #
  # See RFC 3548 for the definition of base64.
  def base64(n=nil)
    [random_bytes(n)].pack("m0")
  end

  # Random::Formatter#urlsafe_base64 generates a random URL-safe base64 string.
  #
  # The argument _n_ specifies the length, in bytes, of the random number
  # to be generated. The length of the result string is about 4/3 of _n_.
  #
  # If _n_ is not specified or is nil, 16 is assumed.
  # It may be larger in the future.
  #
  # The boolean argument _padding_ specifies the padding.
  # If it is false or nil, padding is not generated.
  # Otherwise padding is generated.
  # By default, padding is not generated because "=" may be used as a URL delimiter.
  #
  # The result may contain A-Z, a-z, 0-9, "-" and "_".
  # "=" is also used if _padding_ is true.
  #
  #   require 'random/formatter'
  #
  #   prng.urlsafe_base64 #=> "b4GOKm4pOYU_-BOXcrUGDg"
  #   prng.urlsafe_base64 #=> "UZLdOkzop70Ddx-IJR0ABg"
  #
  #   prng.urlsafe_base64(nil, true) #=> "i0XQ-7gglIsHGV2_BNPrdQ=="
  #   prng.urlsafe_base64(nil, true) #=> "-M8rLhr7JEpJlqFGUMmOxg=="
  #
  # See RFC 3548 for the definition of URL-safe base64.
  def urlsafe_base64(n=nil, padding=false)
    s = [random_bytes(n)].pack("m0")
    s.tr!("+/", "-_")
    s.delete!("=") unless padding
    s
  end

  # Random::Formatter#uuid generates a random v4 UUID (Universally Unique IDentifier).
  #
  #   require 'random/formatter'
  #
  #   prng.uuid #=> "2d931510-d99f-494a-8c67-87feb05e1594"
  #   prng.uuid #=> "bad85eb9-0713-4da7-8d36-07a8e4b00eab"
  #   prng.uuid #=> "62936e70-1815-439b-bf89-8492855a7e6b"
  #
  # The version 4 UUID is purely random (except the version).
  # It doesn't contain meaningful information such as MAC addresses, timestamps, etc.
  #
  # The result contains 122 random bits (15.25 random bytes).
  #
  # See RFC 4122 for details of UUID.
  #
  def uuid
    ary = random_bytes(16).unpack("NnnnnN")
    ary[2] = (ary[2] & 0x0fff) | 0x4000
    ary[3] = (ary[3] & 0x3fff) | 0x8000
    "%08x-%04x-%04x-%04x-%04x%08x" % ary
  end

  private def gen_random(n)
    self.bytes(n)
  end

  # Random::Formatter#choose generates a string that randomly draws from a
  # source array of characters.
  #
  # The argument _source_ specifies the array of characters from which
  # to generate the string.
  # The argument _n_ specifies the length, in characters, of the string to be
  # generated.
  #
  # The result may contain whatever characters are in the source array.
  #
  #   require 'random/formatter'
  #
  #   prng.choose([*'l'..'r'], 16) #=> "lmrqpoonmmlqlron"
  #   prng.choose([*'0'..'9'], 5)  #=> "27309"
  private def choose(source, n)
    size = source.size
    m = 1
    limit = size
    while limit * size <= 0x100000000
      limit *= size
      m += 1
    end
    result = ''.dup
    while m <= n
      rs = random_number(limit)
      is = rs.digits(size)
      (m-is.length).times { is << 0 }
      result << source.values_at(*is).join('')
      n -= m
    end
    if 0 < n
      rs = random_number(limit)
      is = rs.digits(size)
      if is.length < n
        (n-is.length).times { is << 0 }
      else
        is.pop while n < is.length
      end
      result.concat source.values_at(*is).join('')
    end
    result
  end

  ALPHANUMERIC = [*'A'..'Z', *'a'..'z', *'0'..'9']
  # Random::Formatter#alphanumeric generates a random alphanumeric string.
  #
  # The argument _n_ specifies the length, in characters, of the alphanumeric
  # string to be generated.
  #
  # If _n_ is not specified or is nil, 16 is assumed.
  # It may be larger in the future.
  #
  # The result may contain A-Z, a-z and 0-9.
  #
  #   require 'random/formatter'
  #
  #   prng.alphanumeric     #=> "2BuBuLf3WfSKyQbR"
  #   prng.alphanumeric(10) #=> "i6K93NdqiH"
  def alphanumeric(n=nil)
    n = 16 if n.nil?
    choose(ALPHANUMERIC, n)
  end
end
PK}$[�c��xxruby/fiddle/value.rbnu�[���# frozen_string_literal: true
require 'fiddle'

module Fiddle
  module ValueUtil #:nodoc: all
    def unsigned_value(val, ty)
      case ty.abs
      when TYPE_CHAR
        [val].pack("c").unpack("C")[0]
      when TYPE_SHORT
        [val].pack("s!").unpack("S!")[0]
      when TYPE_INT
        [val].pack("i!").unpack("I!")[0]
      when TYPE_LONG
        [val].pack("l!").unpack("L!")[0]
      else
        if defined?(TYPE_LONG_LONG) and
          ty.abs == TYPE_LONG_LONG
          [val].pack("q").unpack("Q")[0]
        else
          val
        end
      end
    end

    def signed_value(val, ty)
      case ty.abs
      when TYPE_CHAR
        [val].pack("C").unpack("c")[0]
      when TYPE_SHORT
        [val].pack("S!").unpack("s!")[0]
      when TYPE_INT
        [val].pack("I!").unpack("i!")[0]
      when TYPE_LONG
        [val].pack("L!").unpack("l!")[0]
      else
        if defined?(TYPE_LONG_LONG) and
          ty.abs == TYPE_LONG_LONG
          [val].pack("Q").unpack("q")[0]
        else
          val
        end
      end
    end

    def wrap_args(args, tys, funcs, &block)
      result = []
      tys ||= []
      args.each_with_index{|arg, idx|
        result.push(wrap_arg(arg, tys[idx], funcs, &block))
      }
      result
    end

    def wrap_arg(arg, ty, funcs = [], &block)
      funcs ||= []
      case arg
      when nil
        return 0
      when Pointer
        return arg.to_i
      when IO
        case ty
        when TYPE_VOIDP
          return Pointer[arg].to_i
        else
          return arg.to_i
        end
      when Function
        if( block )
          arg.bind_at_call(&block)
          funcs.push(arg)
        elsif !arg.bound?
          raise(RuntimeError, "block must be given.")
        end
        return arg.to_i
      when String
        if( ty.is_a?(Array) )
          return arg.unpack('C*')
        else
          case SIZEOF_VOIDP
          when SIZEOF_LONG
            return [arg].pack("p").unpack("l!")[0]
          else
            if defined?(SIZEOF_LONG_LONG) and
              SIZEOF_VOIDP == SIZEOF_LONG_LONG
              return [arg].pack("p").unpack("q")[0]
            else
              raise(RuntimeError, "sizeof(void*)?")
            end
          end
        end
      when Float, Integer
        return arg
      when Array
        if( ty.is_a?(Array) ) # used only by struct
          case ty[0]
          when TYPE_VOIDP
            return arg.collect{|v| Integer(v)}
          when TYPE_CHAR
            if( arg.is_a?(String) )
              return val.unpack('C*')
            end
          end
          return arg
        else
          return arg
        end
      else
        if( arg.respond_to?(:to_ptr) )
          return arg.to_ptr.to_i
        else
          begin
            return Integer(arg)
          rescue
            raise(ArgumentError, "unknown argument type: #{arg.class}")
          end
        end
      end
    end
  end
end
PK}$[���&&ruby/fiddle/version.rbnu�[���module Fiddle
  VERSION = "1.1.0"
end
PK}$[;#���ruby/fiddle/closure.rbnu�[���# frozen_string_literal: true
module Fiddle
  class Closure

    # the C type of the return of the FFI closure
    attr_reader :ctype

    # arguments of the FFI closure
    attr_reader :args

    # Extends Fiddle::Closure to allow for building the closure in a block
    class BlockCaller < Fiddle::Closure

      # == Description
      #
      # Construct a new BlockCaller object.
      #
      # * +ctype+ is the C type to be returned
      # * +args+ are passed the callback
      # * +abi+ is the abi of the closure
      #
      # If there is an error in preparing the +ffi_cif+ or +ffi_prep_closure+,
      # then a RuntimeError will be raised.
      #
      # == Example
      #
      #   include Fiddle
      #
      #   cb = Closure::BlockCaller.new(TYPE_INT, [TYPE_INT]) do |one|
      #     one
      #   end
      #
      #   func = Function.new(cb, [TYPE_INT], TYPE_INT)
      #
      def initialize ctype, args, abi = Fiddle::Function::DEFAULT, &block
        super(ctype, args, abi)
        @block = block
      end

      # Calls the constructed BlockCaller, with +args+
      #
      # For an example see Fiddle::Closure::BlockCaller.new
      #
      def call *args
        @block.call(*args)
      end
    end
  end
end
PK}$[�����ruby/fiddle/types.rbnu�[���# frozen_string_literal: true
module Fiddle
  # Adds Windows type aliases to the including class for use with
  # Fiddle::Importer.
  #
  # The aliases added are:
  # * ATOM
  # * BOOL
  # * BYTE
  # * DWORD
  # * DWORD32
  # * DWORD64
  # * HANDLE
  # * HDC
  # * HINSTANCE
  # * HWND
  # * LPCSTR
  # * LPSTR
  # * PBYTE
  # * PDWORD
  # * PHANDLE
  # * PVOID
  # * PWORD
  # * UCHAR
  # * UINT
  # * ULONG
  # * WORD
  module Win32Types
    def included(m) # :nodoc:
      # https://docs.microsoft.com/en-us/windows/win32/winprog/windows-data-types
      m.module_eval{
        typealias "ATOM", "WORD"
        typealias "BOOL", "int"
        typealias "BYTE", "unsigned char"
        typealias "DWORD", "unsigned long"
        typealias "DWORD32", "uint32_t"
        typealias "DWORD64", "uint64_t"
        typealias "HANDLE", "PVOID"
        typealias "HDC", "HANDLE"
        typealias "HINSTANCE", "HANDLE"
        typealias "HWND", "HANDLE"
        typealias "LPCSTR", "const char *"
        typealias "LPSTR", "char *"
        typealias "PBYTE", "BYTE *"
        typealias "PDWORD", "DWORD *"
        typealias "PHANDLE", "HANDLE *"
        typealias "PVOID", "void *"
        typealias "PWORD", "WORD *"
        typealias "UCHAR", "unsigned char"
        typealias "UINT", "unsigned int"
        typealias "ULONG", "unsigned long"
        typealias "WORD", "unsigned short"
      }
    end
    module_function :included
  end

  # Adds basic type aliases to the including class for use with Fiddle::Importer.
  #
  # The aliases added are +uint+ and +u_int+ (<tt>unsigned int</tt>) and
  # +ulong+ and +u_long+ (<tt>unsigned long</tt>)
  module BasicTypes
    def included(m) # :nodoc:
      m.module_eval{
        typealias "uint", "unsigned int"
        typealias "u_int", "unsigned int"
        typealias "ulong", "unsigned long"
        typealias "u_long", "unsigned long"
      }
    end
    module_function :included
  end
end
PK}$[y��a"a"ruby/fiddle/cparser.rbnu�[���# frozen_string_literal: true
module Fiddle
  # A mixin that provides methods for parsing C struct and prototype signatures.
  #
  # == Example
  #   require 'fiddle/import'
  #
  #   include Fiddle::CParser
  #     #=> Object
  #
  #   parse_ctype('int')
  #     #=> Fiddle::TYPE_INT
  #
  #   parse_struct_signature(['int i', 'char c'])
  #     #=> [[Fiddle::TYPE_INT, Fiddle::TYPE_CHAR], ["i", "c"]]
  #
  #   parse_signature('double sum(double, double)')
  #     #=> ["sum", Fiddle::TYPE_DOUBLE, [Fiddle::TYPE_DOUBLE, Fiddle::TYPE_DOUBLE]]
  #
  module CParser
    # Parses a C struct's members
    #
    # Example:
    #   require 'fiddle/import'
    #
    #   include Fiddle::CParser
    #     #=> Object
    #
    #   parse_struct_signature(['int i', 'char c'])
    #     #=> [[Fiddle::TYPE_INT, Fiddle::TYPE_CHAR], ["i", "c"]]
    #
    #   parse_struct_signature(['char buffer[80]'])
    #     #=> [[[Fiddle::TYPE_CHAR, 80]], ["buffer"]]
    #
    def parse_struct_signature(signature, tymap=nil)
      if signature.is_a?(String)
        signature = split_arguments(signature, /[,;]/)
      elsif signature.is_a?(Hash)
        signature = [signature]
      end
      mems = []
      tys  = []
      signature.each{|msig|
        msig = compact(msig) if msig.is_a?(String)
        case msig
        when Hash
          msig.each do |struct_name, struct_signature|
            struct_name = struct_name.to_s if struct_name.is_a?(Symbol)
            struct_name = compact(struct_name)
            struct_count = nil
            if struct_name =~ /^([\w\*\s]+)\[(\d+)\]$/
              struct_count = $2.to_i
              struct_name = $1
            end
            if struct_signature.respond_to?(:entity_class)
              struct_type = struct_signature
            else
              parsed_struct = parse_struct_signature(struct_signature, tymap)
              struct_type = CStructBuilder.create(CStruct, *parsed_struct)
            end
            if struct_count
              ty = [struct_type, struct_count]
            else
              ty = struct_type
            end
            mems.push([struct_name, struct_type.members])
            tys.push(ty)
          end
        when /^[\w\*\s]+[\*\s](\w+)$/
          mems.push($1)
          tys.push(parse_ctype(msig, tymap))
        when /^[\w\*\s]+\(\*(\w+)\)\(.*?\)$/
          mems.push($1)
          tys.push(parse_ctype(msig, tymap))
        when /^([\w\*\s]+[\*\s])(\w+)\[(\d+)\]$/
          mems.push($2)
          tys.push([parse_ctype($1.strip, tymap), $3.to_i])
        when /^([\w\*\s]+)\[(\d+)\](\w+)$/
          mems.push($3)
          tys.push([parse_ctype($1.strip, tymap), $2.to_i])
        else
          raise(RuntimeError,"can't parse the struct member: #{msig}")
        end
      }
      return tys, mems
    end

    # Parses a C prototype signature
    #
    # If Hash +tymap+ is provided, the return value and the arguments from the
    # +signature+ are expected to be keys, and the value will be the C type to
    # be looked up.
    #
    # Example:
    #   require 'fiddle/import'
    #
    #   include Fiddle::CParser
    #     #=> Object
    #
    #   parse_signature('double sum(double, double)')
    #     #=> ["sum", Fiddle::TYPE_DOUBLE, [Fiddle::TYPE_DOUBLE, Fiddle::TYPE_DOUBLE]]
    #
    #   parse_signature('void update(void (*cb)(int code))')
    #     #=> ["update", Fiddle::TYPE_VOID, [Fiddle::TYPE_VOIDP]]
    #
    #   parse_signature('char (*getbuffer(void))[80]')
    #     #=> ["getbuffer", Fiddle::TYPE_VOIDP, []]
    #
    def parse_signature(signature, tymap=nil)
      tymap ||= {}
      case compact(signature)
      when /^(?:[\w\*\s]+)\(\*(\w+)\((.*?)\)\)(?:\[\w*\]|\(.*?\));?$/
        func, args = $1, $2
        return [func, TYPE_VOIDP, split_arguments(args).collect {|arg| parse_ctype(arg, tymap)}]
      when /^([\w\*\s]+[\*\s])(\w+)\((.*?)\);?$/
        ret, func, args = $1.strip, $2, $3
        return [func, parse_ctype(ret, tymap), split_arguments(args).collect {|arg| parse_ctype(arg, tymap)}]
      else
        raise(RuntimeError,"can't parse the function prototype: #{signature}")
      end
    end

    # Given a String of C type +ty+, returns the corresponding Fiddle constant.
    #
    # +ty+ can also accept an Array of C type Strings, and will be returned in
    # a corresponding Array.
    #
    # If Hash +tymap+ is provided, +ty+ is expected to be the key, and the
    # value will be the C type to be looked up.
    #
    # Example:
    #   require 'fiddle/import'
    #
    #   include Fiddle::CParser
    #     #=> Object
    #
    #   parse_ctype('int')
    #     #=> Fiddle::TYPE_INT
    #
    #   parse_ctype('double diff')
    #     #=> Fiddle::TYPE_DOUBLE
    #
    #   parse_ctype('unsigned char byte')
    #     #=> -Fiddle::TYPE_CHAR
    #
    #   parse_ctype('const char* const argv[]')
    #     #=> -Fiddle::TYPE_VOIDP
    #
    def parse_ctype(ty, tymap=nil)
      tymap ||= {}
      if ty.is_a?(Array)
        return [parse_ctype(ty[0], tymap), ty[1]]
      end
      ty = ty.gsub(/\Aconst\s+/, "")
      case ty
      when 'void'
        return TYPE_VOID
      when /\A(?:(?:signed\s+)?long\s+long(?:\s+int\s+)?|int64_t)(?:\s+\w+)?\z/
        unless Fiddle.const_defined?(:TYPE_LONG_LONG)
          raise(RuntimeError, "unsupported type: #{ty}")
        end
        return TYPE_LONG_LONG
      when /\A(?:unsigned\s+long\s+long(?:\s+int\s+)?|uint64_t)(?:\s+\w+)?\z/
        unless Fiddle.const_defined?(:TYPE_LONG_LONG)
          raise(RuntimeError, "unsupported type: #{ty}")
        end
        return -TYPE_LONG_LONG
      when /\A(?:signed\s+)?long(?:\s+int\s+)?(?:\s+\w+)?\z/
        return TYPE_LONG
      when /\Aunsigned\s+long(?:\s+int\s+)?(?:\s+\w+)?\z/
        return -TYPE_LONG
      when /\A(?:signed\s+)?int(?:\s+\w+)?\z/
        return TYPE_INT
      when /\A(?:unsigned\s+int|uint)(?:\s+\w+)?\z/
        return -TYPE_INT
      when /\A(?:signed\s+)?short(?:\s+int\s+)?(?:\s+\w+)?\z/
        return TYPE_SHORT
      when /\Aunsigned\s+short(?:\s+int\s+)?(?:\s+\w+)?\z/
        return -TYPE_SHORT
      when /\A(?:signed\s+)?char(?:\s+\w+)?\z/
        return TYPE_CHAR
      when /\Aunsigned\s+char(?:\s+\w+)?\z/
        return  -TYPE_CHAR
      when /\Aint8_t(?:\s+\w+)?\z/
        unless Fiddle.const_defined?(:TYPE_INT8_T)
          raise(RuntimeError, "unsupported type: #{ty}")
        end
        return TYPE_INT8_T
      when /\Auint8_t(?:\s+\w+)?\z/
        unless Fiddle.const_defined?(:TYPE_INT8_T)
          raise(RuntimeError, "unsupported type: #{ty}")
        end
        return -TYPE_INT8_T
      when /\Aint16_t(?:\s+\w+)?\z/
        unless Fiddle.const_defined?(:TYPE_INT16_T)
          raise(RuntimeError, "unsupported type: #{ty}")
        end
        return TYPE_INT16_T
      when /\Auint16_t(?:\s+\w+)?\z/
        unless Fiddle.const_defined?(:TYPE_INT16_T)
          raise(RuntimeError, "unsupported type: #{ty}")
        end
        return -TYPE_INT16_T
      when /\Aint32_t(?:\s+\w+)?\z/
        unless Fiddle.const_defined?(:TYPE_INT32_T)
          raise(RuntimeError, "unsupported type: #{ty}")
        end
        return TYPE_INT32_T
      when /\Auint32_t(?:\s+\w+)?\z/
        unless Fiddle.const_defined?(:TYPE_INT32_T)
          raise(RuntimeError, "unsupported type: #{ty}")
        end
        return -TYPE_INT32_T
      when /\Aint64_t(?:\s+\w+)?\z/
        unless Fiddle.const_defined?(:TYPE_INT64_T)
          raise(RuntimeError, "unsupported type: #{ty}")
        end
        return TYPE_INT64_T
      when /\Auint64_t(?:\s+\w+)?\z/
        unless Fiddle.const_defined?(:TYPE_INT64_T)
          raise(RuntimeError, "unsupported type: #{ty}")
        end
        return -TYPE_INT64_T
      when /\Afloat(?:\s+\w+)?\z/
        return TYPE_FLOAT
      when /\Adouble(?:\s+\w+)?\z/
        return TYPE_DOUBLE
      when /\Asize_t(?:\s+\w+)?\z/
        return TYPE_SIZE_T
      when /\Assize_t(?:\s+\w+)?\z/
        return TYPE_SSIZE_T
      when /\Aptrdiff_t(?:\s+\w+)?\z/
        return TYPE_PTRDIFF_T
      when /\Aintptr_t(?:\s+\w+)?\z/
        return TYPE_INTPTR_T
      when /\Auintptr_t(?:\s+\w+)?\z/
        return TYPE_UINTPTR_T
      when /\*/, /\[[\s\d]*\]/
        return TYPE_VOIDP
      when "..."
        return TYPE_VARIADIC
      else
        ty = ty.split(' ', 2)[0]
        if( tymap[ty] )
          return parse_ctype(tymap[ty], tymap)
        else
          raise(DLError, "unknown type: #{ty}")
        end
      end
    end

    private

    def split_arguments(arguments, sep=',')
      return [] if arguments.strip == 'void'
      arguments.scan(/([\w\*\s]+\(\*\w*\)\(.*?\)|[\w\*\s\[\]]+|\.\.\.)(?:#{sep}\s*|\z)/).collect {|m| m[0]}
    end

    def compact(signature)
      signature.gsub(/\s+/, ' ').gsub(/\s*([\(\)\[\]\*,;])\s*/, '\1').strip
    end

  end
end
PK}$[�ߓ##ruby/fiddle/import.rbnu�[���# frozen_string_literal: true
require 'fiddle'
require 'fiddle/struct'
require 'fiddle/cparser'

module Fiddle

  # Used internally by Fiddle::Importer
  class CompositeHandler
    # Create a new handler with the open +handlers+
    #
    # Used internally by Fiddle::Importer.dlload
    def initialize(handlers)
      @handlers = handlers
    end

    # Array of the currently loaded libraries.
    def handlers()
      @handlers
    end

    # Returns the address as an Integer from any handlers with the function
    # named +symbol+.
    #
    # Raises a DLError if the handle is closed.
    def sym(symbol)
      @handlers.each{|handle|
        if( handle )
          begin
            addr = handle.sym(symbol)
            return addr
          rescue DLError
          end
        end
      }
      return nil
    end

    # See Fiddle::CompositeHandler.sym
    def [](symbol)
      sym(symbol)
    end
  end

  # A DSL that provides the means to dynamically load libraries and build
  # modules around them including calling extern functions within the C
  # library that has been loaded.
  #
  # == Example
  #
  #   require 'fiddle'
  #   require 'fiddle/import'
  #
  #   module LibSum
  #   	extend Fiddle::Importer
  #   	dlload './libsum.so'
  #   	extern 'double sum(double*, int)'
  #   	extern 'double split(double)'
  #   end
  #
  module Importer
    include Fiddle
    include CParser
    extend Importer

    attr_reader :type_alias
    private :type_alias

    # Creates an array of handlers for the given +libs+, can be an instance of
    # Fiddle::Handle, Fiddle::Importer, or will create a new instance of
    # Fiddle::Handle using Fiddle.dlopen
    #
    # Raises a DLError if the library cannot be loaded.
    #
    # See Fiddle.dlopen
    def dlload(*libs)
      handles = libs.collect{|lib|
        case lib
        when nil
          nil
        when Handle
          lib
        when Importer
          lib.handlers
        else
          Fiddle.dlopen(lib)
        end
      }.flatten()
      @handler = CompositeHandler.new(handles)
      @func_map = {}
      @type_alias = {}
    end

    # Sets the type alias for +alias_type+ as +orig_type+
    def typealias(alias_type, orig_type)
      @type_alias[alias_type] = orig_type
    end

    # Returns the sizeof +ty+, using Fiddle::Importer.parse_ctype to determine
    # the C type and the appropriate Fiddle constant.
    def sizeof(ty)
      case ty
      when String
        ty = parse_ctype(ty, type_alias).abs()
        case ty
        when TYPE_CHAR
          return SIZEOF_CHAR
        when TYPE_SHORT
          return SIZEOF_SHORT
        when TYPE_INT
          return SIZEOF_INT
        when TYPE_LONG
          return SIZEOF_LONG
        when TYPE_FLOAT
          return SIZEOF_FLOAT
        when TYPE_DOUBLE
          return SIZEOF_DOUBLE
        when TYPE_VOIDP
          return SIZEOF_VOIDP
        when TYPE_CONST_STRING
          return SIZEOF_CONST_STRING
        else
          if defined?(TYPE_LONG_LONG) and
            ty == TYPE_LONG_LONG
            return SIZEOF_LONG_LONG
          else
            raise(DLError, "unknown type: #{ty}")
          end
        end
      when Class
        if( ty.instance_methods().include?(:to_ptr) )
          return ty.size()
        end
      end
      return Pointer[ty].size()
    end

    def parse_bind_options(opts)
      h = {}
      while( opt = opts.shift() )
        case opt
        when :stdcall, :cdecl
          h[:call_type] = opt
        when :carried, :temp, :temporal, :bind
          h[:callback_type] = opt
          h[:carrier] = opts.shift()
        else
          h[opt] = true
        end
      end
      h
    end
    private :parse_bind_options

    # :stopdoc:
    CALL_TYPE_TO_ABI = Hash.new { |h, k|
      raise RuntimeError, "unsupported call type: #{k}"
    }.merge({ :stdcall => Function.const_defined?(:STDCALL) ? Function::STDCALL :
                          Function::DEFAULT,
              :cdecl   => Function::DEFAULT,
              nil      => Function::DEFAULT
            }).freeze
    private_constant :CALL_TYPE_TO_ABI
    # :startdoc:

    # Creates a global method from the given C +signature+.
    def extern(signature, *opts)
      symname, ctype, argtype = parse_signature(signature, type_alias)
      opt = parse_bind_options(opts)
      f = import_function(symname, ctype, argtype, opt[:call_type])
      name = symname.gsub(/@.+/,'')
      @func_map[name] = f
      # define_method(name){|*args,&block| f.call(*args,&block)}
      begin
        /^(.+?):(\d+)/ =~ caller.first
        file, line = $1, $2.to_i
      rescue
        file, line = __FILE__, __LINE__+3
      end
      module_eval(<<-EOS, file, line)
        def #{name}(*args, &block)
          @func_map['#{name}'].call(*args,&block)
        end
      EOS
      module_function(name)
      f
    end

    # Creates a global method from the given C +signature+ using the given
    # +opts+ as bind parameters with the given block.
    def bind(signature, *opts, &blk)
      name, ctype, argtype = parse_signature(signature, type_alias)
      h = parse_bind_options(opts)
      case h[:callback_type]
      when :bind, nil
        f = bind_function(name, ctype, argtype, h[:call_type], &blk)
      else
        raise(RuntimeError, "unknown callback type: #{h[:callback_type]}")
      end
      @func_map[name] = f
      #define_method(name){|*args,&block| f.call(*args,&block)}
      begin
        /^(.+?):(\d+)/ =~ caller.first
        file, line = $1, $2.to_i
      rescue
        file, line = __FILE__, __LINE__+3
      end
      module_eval(<<-EOS, file, line)
        def #{name}(*args,&block)
          @func_map['#{name}'].call(*args,&block)
        end
      EOS
      module_function(name)
      f
    end

    # Creates a class to wrap the C struct described by +signature+.
    #
    #   MyStruct = struct ['int i', 'char c']
    def struct(signature)
      tys, mems = parse_struct_signature(signature, type_alias)
      Fiddle::CStructBuilder.create(CStruct, tys, mems)
    end

    # Creates a class to wrap the C union described by +signature+.
    #
    #   MyUnion = union ['int i', 'char c']
    def union(signature)
      tys, mems = parse_struct_signature(signature, type_alias)
      Fiddle::CStructBuilder.create(CUnion, tys, mems)
    end

    # Returns the function mapped to +name+, that was created by either
    # Fiddle::Importer.extern or Fiddle::Importer.bind
    def [](name)
      @func_map[name]
    end

    # Creates a class to wrap the C struct with the value +ty+
    #
    # See also Fiddle::Importer.struct
    def create_value(ty, val=nil)
      s = struct([ty + " value"])
      ptr = s.malloc()
      if( val )
        ptr.value = val
      end
      return ptr
    end
    alias value create_value

    # Returns a new instance of the C struct with the value +ty+ at the +addr+
    # address.
    def import_value(ty, addr)
      s = struct([ty + " value"])
      ptr = s.new(addr)
      return ptr
    end


    # The Fiddle::CompositeHandler instance
    #
    # Will raise an error if no handlers are open.
    def handler
      (@handler ||= nil) or raise "call dlload before importing symbols and functions"
    end

    # Returns a new Fiddle::Pointer instance at the memory address of the given
    # +name+ symbol.
    #
    # Raises a DLError if the +name+ doesn't exist.
    #
    # See Fiddle::CompositeHandler.sym and Fiddle::Handle.sym
    def import_symbol(name)
      addr = handler.sym(name)
      if( !addr )
        raise(DLError, "cannot find the symbol: #{name}")
      end
      Pointer.new(addr)
    end

    # Returns a new Fiddle::Function instance at the memory address of the given
    # +name+ function.
    #
    # Raises a DLError if the +name+ doesn't exist.
    #
    # * +argtype+ is an Array of arguments, passed to the +name+ function.
    # * +ctype+ is the return type of the function
    # * +call_type+ is the ABI of the function
    #
    # See also Fiddle:Function.new
    #
    # See Fiddle::CompositeHandler.sym and Fiddle::Handler.sym
    def import_function(name, ctype, argtype, call_type = nil)
      addr = handler.sym(name)
      if( !addr )
        raise(DLError, "cannot find the function: #{name}()")
      end
      Function.new(addr, argtype, ctype, CALL_TYPE_TO_ABI[call_type],
                   name: name)
    end

    # Returns a new closure wrapper for the +name+ function.
    #
    # * +ctype+ is the return type of the function
    # * +argtype+ is an Array of arguments, passed to the callback function
    # * +call_type+ is the abi of the closure
    # * +block+ is passed to the callback
    #
    # See Fiddle::Closure
    def bind_function(name, ctype, argtype, call_type = nil, &block)
      abi = CALL_TYPE_TO_ABI[call_type]
      closure = Class.new(Fiddle::Closure) {
        define_method(:call, block)
      }.new(ctype, argtype, abi)

      Function.new(closure, argtype, ctype, abi, name: name)
    end
  end
end
PK}$[w�ruby/fiddle/function.rbnu�[���# frozen_string_literal: true
module Fiddle
  class Function
    # The ABI of the Function.
    attr_reader :abi

    # The address of this function
    attr_reader :ptr

    # The name of this function
    attr_reader :name

    # Whether GVL is needed to call this function
    def need_gvl?
      @need_gvl
    end

    # The integer memory location of this function
    def to_i
      ptr.to_i
    end

    # Turn this function in to a proc
    def to_proc
      this = self
      lambda { |*args| this.call(*args) }
    end
  end
end
PK}$[64ʓ��ruby/fiddle/pack.rbnu�[���# frozen_string_literal: true
require 'fiddle'

module Fiddle
  module PackInfo # :nodoc: all
    ALIGN_MAP = {
      TYPE_VOIDP => ALIGN_VOIDP,
      TYPE_CHAR  => ALIGN_CHAR,
      TYPE_SHORT => ALIGN_SHORT,
      TYPE_INT   => ALIGN_INT,
      TYPE_LONG  => ALIGN_LONG,
      TYPE_FLOAT => ALIGN_FLOAT,
      TYPE_DOUBLE => ALIGN_DOUBLE,
      -TYPE_CHAR  => ALIGN_CHAR,
      -TYPE_SHORT => ALIGN_SHORT,
      -TYPE_INT   => ALIGN_INT,
      -TYPE_LONG  => ALIGN_LONG,
    }

    PACK_MAP = {
      TYPE_VOIDP => "l!",
      TYPE_CHAR  => "c",
      TYPE_SHORT => "s!",
      TYPE_INT   => "i!",
      TYPE_LONG  => "l!",
      TYPE_FLOAT => "f",
      TYPE_DOUBLE => "d",
      -TYPE_CHAR  => "c",
      -TYPE_SHORT => "s!",
      -TYPE_INT   => "i!",
      -TYPE_LONG  => "l!",
    }

    SIZE_MAP = {
      TYPE_VOIDP => SIZEOF_VOIDP,
      TYPE_CHAR  => SIZEOF_CHAR,
      TYPE_SHORT => SIZEOF_SHORT,
      TYPE_INT   => SIZEOF_INT,
      TYPE_LONG  => SIZEOF_LONG,
      TYPE_FLOAT => SIZEOF_FLOAT,
      TYPE_DOUBLE => SIZEOF_DOUBLE,
      -TYPE_CHAR  => SIZEOF_CHAR,
      -TYPE_SHORT => SIZEOF_SHORT,
      -TYPE_INT   => SIZEOF_INT,
      -TYPE_LONG  => SIZEOF_LONG,
    }
    if defined?(TYPE_LONG_LONG)
      ALIGN_MAP[TYPE_LONG_LONG] = ALIGN_MAP[-TYPE_LONG_LONG] = ALIGN_LONG_LONG
      PACK_MAP[TYPE_LONG_LONG] = PACK_MAP[-TYPE_LONG_LONG] = "q"
      SIZE_MAP[TYPE_LONG_LONG] = SIZE_MAP[-TYPE_LONG_LONG] = SIZEOF_LONG_LONG
      PACK_MAP[TYPE_VOIDP] = "q" if SIZEOF_LONG_LONG == SIZEOF_VOIDP
    end

    def align(addr, align)
      d = addr % align
      if( d == 0 )
        addr
      else
        addr + (align - d)
      end
    end
    module_function :align
  end

  class Packer # :nodoc: all
    include PackInfo

    def self.[](*types)
      new(types)
    end

    def initialize(types)
      parse_types(types)
    end

    def size()
      @size
    end

    def pack(ary)
      case SIZEOF_VOIDP
      when SIZEOF_LONG
        ary.pack(@template)
      else
        if defined?(TYPE_LONG_LONG) and
          SIZEOF_VOIDP == SIZEOF_LONG_LONG
          ary.pack(@template)
        else
          raise(RuntimeError, "sizeof(void*)?")
        end
      end
    end

    def unpack(ary)
      case SIZEOF_VOIDP
      when SIZEOF_LONG
        ary.join().unpack(@template)
      else
        if defined?(TYPE_LONG_LONG) and
          SIZEOF_VOIDP == SIZEOF_LONG_LONG
          ary.join().unpack(@template)
        else
          raise(RuntimeError, "sizeof(void*)?")
        end
      end
    end

    private

    def parse_types(types)
      @template = "".dup
      addr     = 0
      types.each{|t|
        orig_addr = addr
        if( t.is_a?(Array) )
          addr = align(orig_addr, ALIGN_MAP[TYPE_VOIDP])
        else
          addr = align(orig_addr, ALIGN_MAP[t])
        end
        d = addr - orig_addr
        if( d > 0 )
          @template << "x#{d}"
        end
        if( t.is_a?(Array) )
          @template << (PACK_MAP[t[0]] * t[1])
          addr += (SIZE_MAP[t[0]] * t[1])
        else
          @template << PACK_MAP[t]
          addr += SIZE_MAP[t]
        end
      }
      addr = align(addr, ALIGN_MAP[TYPE_VOIDP])
      @size = addr
    end
  end
end
PK}$[��\��8�8ruby/fiddle/struct.rbnu�[���# frozen_string_literal: true
require 'fiddle'
require 'fiddle/value'
require 'fiddle/pack'

module Fiddle
  # A base class for objects representing a C structure
  class CStruct
    include Enumerable

    # accessor to Fiddle::CStructEntity
    def CStruct.entity_class
      CStructEntity
    end

    def self.offsetof(name, members, types) # :nodoc:
      offset = 0
      worklist = name.split('.')
      this_type = self
      while search_name = worklist.shift
        index = 0
        member_index = members.index(search_name)

        unless member_index
          # Possibly a sub-structure
          member_index = members.index { |member_name, _|
            member_name == search_name
          }
          return unless member_index
        end

        types.each { |type, count = 1|
          orig_offset = offset
          if type.respond_to?(:entity_class)
            align = type.alignment
            type_size = type.size
          else
            align = PackInfo::ALIGN_MAP[type]
            type_size = PackInfo::SIZE_MAP[type]
          end

          # Unions shouldn't advance the offset
          if this_type.entity_class == CUnionEntity
            type_size = 0
          end

          offset = PackInfo.align(orig_offset, align)

          if worklist.empty?
            return offset if index == member_index
          else
            if index == member_index
              subtype = types[member_index]
              members = subtype.members
              types = subtype.types
              this_type = subtype
              break
            end
          end

          offset += (type_size * count)
          index += 1
        }
      end
      nil
    end

    def each
      return enum_for(__function__) unless block_given?

      self.class.members.each do |name,|
        yield(self[name])
      end
    end

    def each_pair
      return enum_for(__function__) unless block_given?

      self.class.members.each do |name,|
        yield(name, self[name])
      end
    end

    def to_h
      hash = {}
      each_pair do |name, value|
        hash[name] = unstruct(value)
      end
      hash
    end

    def replace(another)
      if another.nil?
        self.class.members.each do |name,|
          self[name] = nil
        end
      elsif another.respond_to?(:each_pair)
        another.each_pair do |name, value|
          self[name] = value
        end
      else
        another.each do |name, value|
          self[name] = value
        end
      end
      self
    end

    private
    def unstruct(value)
      case value
      when CStruct
        value.to_h
      when Array
        value.collect do |v|
          unstruct(v)
        end
      else
        value
      end
    end
  end

  # A base class for objects representing a C union
  class CUnion
    # accessor to Fiddle::CUnionEntity
    def CUnion.entity_class
      CUnionEntity
    end

    def self.offsetof(name, members, types) # :nodoc:
      0
    end
  end

  # Wrapper for arrays within a struct
  class StructArray < Array
    include ValueUtil

    def initialize(ptr, type, initial_values)
      @ptr = ptr
      @type = type
      @is_struct = @type.respond_to?(:entity_class)
      if @is_struct
        super(initial_values)
      else
        @size = Fiddle::PackInfo::SIZE_MAP[type]
        @pack_format = Fiddle::PackInfo::PACK_MAP[type]
        super(initial_values.collect { |v| unsigned_value(v, type) })
      end
    end

    def to_ptr
      @ptr
    end

    def []=(index, value)
      if index < 0 || index >= size
        raise IndexError, 'index %d outside of array bounds 0...%d' % [index, size]
      end

      if @is_struct
        self[index].replace(value)
      else
        to_ptr[index * @size, @size] = [value].pack(@pack_format)
        super(index, value)
      end
    end
  end

  # Used to construct C classes (CUnion, CStruct, etc)
  #
  # Fiddle::Importer#struct and Fiddle::Importer#union wrap this functionality in an
  # easy-to-use manner.
  module CStructBuilder
    # Construct a new class given a C:
    # * class +klass+ (CUnion, CStruct, or other that provide an
    #   #entity_class)
    # * +types+ (Fiddle::TYPE_INT, Fiddle::TYPE_SIZE_T, etc., see the C types
    #   constants)
    # * corresponding +members+
    #
    # Fiddle::Importer#struct and Fiddle::Importer#union wrap this functionality in an
    # easy-to-use manner.
    #
    # Examples:
    #
    #   require 'fiddle/struct'
    #   require 'fiddle/cparser'
    #
    #   include Fiddle::CParser
    #
    #   types, members = parse_struct_signature(['int i','char c'])
    #
    #   MyStruct = Fiddle::CStructBuilder.create(Fiddle::CUnion, types, members)
    #
    #   MyStruct.malloc(Fiddle::RUBY_FREE) do |obj|
    #     ...
    #   end
    #
    #   obj = MyStruct.malloc(Fiddle::RUBY_FREE)
    #   begin
    #     ...
    #   ensure
    #     obj.call_free
    #   end
    #
    #   obj = MyStruct.malloc
    #   begin
    #     ...
    #   ensure
    #     Fiddle.free obj.to_ptr
    #   end
    #
    def create(klass, types, members)
      new_class = Class.new(klass){
        define_method(:initialize){|addr, func = nil|
          if addr.is_a?(self.class.entity_class)
            @entity = addr
          else
            @entity = self.class.entity_class.new(addr, types, func)
          end
          @entity.assign_names(members)
        }
        define_method(:[]) { |*args| @entity.send(:[], *args) }
        define_method(:[]=) { |*args| @entity.send(:[]=, *args) }
        define_method(:to_ptr){ @entity }
        define_method(:to_i){ @entity.to_i }
        define_singleton_method(:types) { types }
        define_singleton_method(:members) { members }

        # Return the offset of a struct member given its name.
        # For example:
        #
        #     MyStruct = struct [
        #       "int64_t i",
        #       "char c",
        #     ]
        #
        #     MyStruct.offsetof("i") # => 0
        #     MyStruct.offsetof("c") # => 8
        #
        define_singleton_method(:offsetof) { |name|
          klass.offsetof(name, members, types)
        }
        members.each{|name|
          name = name[0] if name.is_a?(Array) # name is a nested struct
          next if method_defined?(name)
          define_method(name){ @entity[name] }
          define_method(name + "="){|val| @entity[name] = val }
        }
        entity_class = klass.entity_class
        alignment = entity_class.alignment(types)
        size = entity_class.size(types)
        define_singleton_method(:alignment) { alignment }
        define_singleton_method(:size) { size }
        define_singleton_method(:malloc) do |func=nil, &block|
          if block
            entity_class.malloc(types, func, size) do |entity|
              block.call(new(entity))
            end
          else
            new(entity_class.malloc(types, func, size))
          end
        end
      }
      return new_class
    end
    module_function :create
  end

  # A pointer to a C structure
  class CStructEntity < Fiddle::Pointer
    include PackInfo
    include ValueUtil

    def CStructEntity.alignment(types)
      max = 1
      types.each do |type, count = 1|
        if type.respond_to?(:entity_class)
          n = type.alignment
        else
          n = ALIGN_MAP[type]
        end
        max = n if n > max
      end
      max
    end

    # Allocates a C struct with the +types+ provided.
    #
    # See Fiddle::Pointer.malloc for memory management issues.
    def CStructEntity.malloc(types, func = nil, size = size(types), &block)
      if block_given?
        super(size, func) do |struct|
          struct.set_ctypes types
          yield struct
        end
      else
        struct = super(size, func)
        struct.set_ctypes types
        struct
      end
    end

    # Returns the offset for the packed sizes for the given +types+.
    #
    #   Fiddle::CStructEntity.size(
    #     [ Fiddle::TYPE_DOUBLE,
    #       Fiddle::TYPE_INT,
    #       Fiddle::TYPE_CHAR,
    #       Fiddle::TYPE_VOIDP ]) #=> 24
    def CStructEntity.size(types)
      offset = 0

      max_align = types.map { |type, count = 1|
        last_offset = offset

        if type.respond_to?(:entity_class)
          align = type.alignment
          type_size = type.size
        else
          align = PackInfo::ALIGN_MAP[type]
          type_size = PackInfo::SIZE_MAP[type]
        end
        offset = PackInfo.align(last_offset, align) +
                 (type_size * count)

        align
      }.max

      PackInfo.align(offset, max_align)
    end

    # Wraps the C pointer +addr+ as a C struct with the given +types+.
    #
    # When the instance is garbage collected, the C function +func+ is called.
    #
    # See also Fiddle::Pointer.new
    def initialize(addr, types, func = nil)
      if func && addr.is_a?(Pointer) && addr.free
        raise ArgumentError, 'free function specified on both underlying struct Pointer and when creating a CStructEntity - who do you want to free this?'
      end
      set_ctypes(types)
      super(addr, @size, func)
    end

    # Set the names of the +members+ in this C struct
    def assign_names(members)
      @members = []
      @nested_structs = {}
      members.each_with_index do |member, index|
        if member.is_a?(Array) # nested struct
          member_name = member[0]
          struct_type, struct_count = @ctypes[index]
          if struct_count.nil?
            struct = struct_type.new(to_i + @offset[index])
          else
            structs = struct_count.times.map do |i|
              struct_type.new(to_i + @offset[index] + i * struct_type.size)
            end
            struct = StructArray.new(to_i + @offset[index],
                                     struct_type,
                                     structs)
          end
          @nested_structs[member_name] = struct
        else
          member_name = member
        end
        @members << member_name
      end
    end

    # Calculates the offsets and sizes for the given +types+ in the struct.
    def set_ctypes(types)
      @ctypes = types
      @offset = []
      offset = 0

      max_align = types.map { |type, count = 1|
        orig_offset = offset
        if type.respond_to?(:entity_class)
          align = type.alignment
          type_size = type.size
        else
          align = ALIGN_MAP[type]
          type_size = SIZE_MAP[type]
        end
        offset = PackInfo.align(orig_offset, align)

        @offset << offset

        offset += (type_size * count)

        align
      }.max

      @size = PackInfo.align(offset, max_align)
    end

    # Fetch struct member +name+ if only one argument is specified. If two
    # arguments are specified, the first is an offset and the second is a
    # length and this method returns the string of +length+ bytes beginning at
    # +offset+.
    #
    # Examples:
    #
    #     my_struct = struct(['int id']).malloc
    #     my_struct.id = 1
    #     my_struct['id'] # => 1
    #     my_struct[0, 4] # => "\x01\x00\x00\x00".b
    #
    def [](*args)
      return super(*args) if args.size > 1
      name = args[0]
      idx = @members.index(name)
      if( idx.nil? )
        raise(ArgumentError, "no such member: #{name}")
      end
      ty = @ctypes[idx]
      if( ty.is_a?(Array) )
        if ty.first.respond_to?(:entity_class)
          return @nested_structs[name]
        else
          r = super(@offset[idx], SIZE_MAP[ty[0]] * ty[1])
        end
      elsif ty.respond_to?(:entity_class)
        return @nested_structs[name]
      else
        r = super(@offset[idx], SIZE_MAP[ty.abs])
      end
      packer = Packer.new([ty])
      val = packer.unpack([r])
      case ty
      when Array
        case ty[0]
        when TYPE_VOIDP
          val = val.collect{|v| Pointer.new(v)}
        end
      when TYPE_VOIDP
        val = Pointer.new(val[0])
      else
        val = val[0]
      end
      if( ty.is_a?(Integer) && (ty < 0) )
        return unsigned_value(val, ty)
      elsif( ty.is_a?(Array) && (ty[0] < 0) )
        return StructArray.new(self + @offset[idx], ty[0], val)
      else
        return val
      end
    end

    # Set struct member +name+, to value +val+. If more arguments are
    # specified, writes the string of bytes to the memory at the given
    # +offset+ and +length+.
    #
    # Examples:
    #
    #     my_struct = struct(['int id']).malloc
    #     my_struct['id'] = 1
    #     my_struct[0, 4] = "\x01\x00\x00\x00".b
    #     my_struct.id # => 1
    #
    def []=(*args)
      return super(*args) if args.size > 2
      name, val = *args
      name = name.to_s if name.is_a?(Symbol)
      nested_struct = @nested_structs[name]
      if nested_struct
        if nested_struct.is_a?(StructArray)
          if val.nil?
            nested_struct.each do |s|
              s.replace(nil)
            end
          else
            val.each_with_index do |v, i|
              nested_struct[i] = v
            end
          end
        else
          nested_struct.replace(val)
        end
        return val
      end
      idx = @members.index(name)
      if( idx.nil? )
        raise(ArgumentError, "no such member: #{name}")
      end
      ty  = @ctypes[idx]
      packer = Packer.new([ty])
      val = wrap_arg(val, ty, [])
      buff = packer.pack([val].flatten())
      super(@offset[idx], buff.size, buff)
      if( ty.is_a?(Integer) && (ty < 0) )
        return unsigned_value(val, ty)
      elsif( ty.is_a?(Array) && (ty[0] < 0) )
        return val.collect{|v| unsigned_value(v,ty[0])}
      else
        return val
      end
    end

    undef_method :size=
    def to_s() # :nodoc:
      super(@size)
    end
  end

  # A pointer to a C union
  class CUnionEntity < CStructEntity
    include PackInfo

    # Returns the size needed for the union with the given +types+.
    #
    #   Fiddle::CUnionEntity.size(
    #     [ Fiddle::TYPE_DOUBLE,
    #       Fiddle::TYPE_INT,
    #       Fiddle::TYPE_CHAR,
    #       Fiddle::TYPE_VOIDP ]) #=> 8
    def CUnionEntity.size(types)
      types.map { |type, count = 1|
        if type.respond_to?(:entity_class)
          type.size * count
        else
          PackInfo::SIZE_MAP[type] * count
        end
      }.max
    end

    # Calculate the necessary offset and for each union member with the given
    # +types+
    def set_ctypes(types)
      @ctypes = types
      @offset = Array.new(types.length, 0)
      @size   = self.class.size types
    end
  end
end
PK}$[9"�Q

ruby/optparse/version.rbnu�[���# frozen_string_literal: false
# OptionParser internal utility

class << OptionParser
  def show_version(*pkgs)
    progname = ARGV.options.program_name
    result = false
    show = proc do |klass, cname, version|
      str = "#{progname}"
      unless klass == ::Object and cname == :VERSION
        version = version.join(".") if Array === version
        str << ": #{klass}" unless klass == Object
        str << " version #{version}"
      end
      [:Release, :RELEASE].find do |rel|
        if klass.const_defined?(rel)
          str << " (#{klass.const_get(rel)})"
        end
      end
      puts str
      result = true
    end
    if pkgs.size == 1 and pkgs[0] == "all"
      self.search_const(::Object, /\AV(?:ERSION|ersion)\z/) do |klass, cname, version|
        unless cname[1] == ?e and klass.const_defined?(:Version)
          show.call(klass, cname.intern, version)
        end
      end
    else
      pkgs.each do |pkg|
        begin
          pkg = pkg.split(/::|\//).inject(::Object) {|m, c| m.const_get(c)}
          v = case
              when pkg.const_defined?(:Version)
                pkg.const_get(n = :Version)
              when pkg.const_defined?(:VERSION)
                pkg.const_get(n = :VERSION)
              else
                n = nil
                "unknown"
              end
          show.call(pkg, n, v)
        rescue NameError
        end
      end
    end
    result
  end

  def each_const(path, base = ::Object)
    path.split(/::|\//).inject(base) do |klass, name|
      raise NameError, path unless Module === klass
      klass.constants.grep(/#{name}/i) do |c|
        klass.const_defined?(c) or next
        klass.const_get(c)
      end
    end
  end

  def search_const(klass, name)
    klasses = [klass]
    while klass = klasses.shift
      klass.constants.each do |cname|
        klass.const_defined?(cname) or next
        const = klass.const_get(cname)
        yield klass, cname, const if name === cname
        klasses << const if Module === const and const != ::Object
      end
    end
  end
end
PK}$[�~�Sruby/optparse/kwargs.rbnu�[���# frozen_string_literal: true
require 'optparse'

class OptionParser
  # :call-seq:
  #   define_by_keywords(options, method, **params)
  #
  # :include: ../../doc/optparse/creates_option.rdoc
  #
  def define_by_keywords(options, meth, **opts)
    meth.parameters.each do |type, name|
      case type
      when :key, :keyreq
        op, cl = *(type == :key ? %w"[ ]" : ["", ""])
        define("--#{name}=#{op}#{name.upcase}#{cl}", *opts[name]) do |o|
          options[name] = o
        end
      end
    end
    options
  end
end
PK}$[�oBσ�ruby/optparse/uri.rbnu�[���# frozen_string_literal: false
# -*- ruby -*-

require 'optparse'
require 'uri'

OptionParser.accept(URI) {|s,| URI.parse(s) if s}
PK}$[>1M��ruby/optparse/shellwords.rbnu�[���# frozen_string_literal: false
# -*- ruby -*-

require 'shellwords'
require 'optparse'

OptionParser.accept(Shellwords) {|s,| Shellwords.shellwords(s)}
PK}$[��/ddruby/optparse/date.rbnu�[���# frozen_string_literal: false
require 'optparse'
require 'date'

OptionParser.accept(DateTime) do |s,|
  begin
    DateTime.parse(s) if s
  rescue ArgumentError
    raise OptionParser::InvalidArgument, s
  end
end
OptionParser.accept(Date) do |s,|
  begin
    Date.parse(s) if s
  rescue ArgumentError
    raise OptionParser::InvalidArgument, s
  end
end
PK}$[�����ruby/optparse/time.rbnu�[���# frozen_string_literal: false
require 'optparse'
require 'time'

OptionParser.accept(Time) do |s,|
  begin
    (Time.httpdate(s) rescue Time.parse(s)) if s
  rescue
    raise OptionParser::InvalidArgument, s
  end
end
PK}$[*Ivhruby/optparse/ac.rbnu�[���# frozen_string_literal: false
require 'optparse'

class OptionParser::AC < OptionParser
  private

  def _check_ac_args(name, block)
    unless /\A\w[-\w]*\z/ =~ name
      raise ArgumentError, name
    end
    unless block
      raise ArgumentError, "no block given", ParseError.filter_backtrace(caller)
    end
  end

  ARG_CONV = proc {|val| val.nil? ? true : val}

  def _ac_arg_enable(prefix, name, help_string, block)
    _check_ac_args(name, block)

    sdesc = []
    ldesc = ["--#{prefix}-#{name}"]
    desc = [help_string]
    q = name.downcase
    ac_block = proc {|val| block.call(ARG_CONV.call(val))}
    enable = Switch::PlacedArgument.new(nil, ARG_CONV, sdesc, ldesc, nil, desc, ac_block)
    disable = Switch::NoArgument.new(nil, proc {false}, sdesc, ldesc, nil, desc, ac_block)
    top.append(enable, [], ["enable-" + q], disable, ['disable-' + q])
    enable
  end

  public

  def ac_arg_enable(name, help_string, &block)
    _ac_arg_enable("enable", name, help_string, block)
  end

  def ac_arg_disable(name, help_string, &block)
    _ac_arg_enable("disable", name, help_string, block)
  end

  def ac_arg_with(name, help_string, &block)
    _check_ac_args(name, block)

    sdesc = []
    ldesc = ["--with-#{name}"]
    desc = [help_string]
    q = name.downcase
    with = Switch::PlacedArgument.new(*search(:atype, String), sdesc, ldesc, nil, desc, block)
    without = Switch::NoArgument.new(nil, proc {}, sdesc, ldesc, nil, desc, block)
    top.append(with, [], ["with-" + q], without, ['without-' + q])
    with
  end
end
PK}$[y�
Y�A�Aruby/pathname.rbnu�[���# frozen_string_literal: true
#
# = pathname.rb
#
# Object-Oriented Pathname Class
#
# Author:: Tanaka Akira <akr@m17n.org>
# Documentation:: Author and Gavin Sinclair
#
# For documentation, see class Pathname.
#

require 'pathname.so'

class Pathname

  # :stopdoc:

  # to_path is implemented so Pathname objects are usable with File.open, etc.
  TO_PATH = :to_path

  SAME_PATHS = if File::FNM_SYSCASE.nonzero?
    # Avoid #zero? here because #casecmp can return nil.
    proc {|a, b| a.casecmp(b) == 0}
  else
    proc {|a, b| a == b}
  end


  if File::ALT_SEPARATOR
    SEPARATOR_LIST = "#{Regexp.quote File::ALT_SEPARATOR}#{Regexp.quote File::SEPARATOR}"
    SEPARATOR_PAT = /[#{SEPARATOR_LIST}]/
  else
    SEPARATOR_LIST = "#{Regexp.quote File::SEPARATOR}"
    SEPARATOR_PAT = /#{Regexp.quote File::SEPARATOR}/
  end

  if File.dirname('A:') == 'A:.' # DOSish drive letter
    ABSOLUTE_PATH = /\A(?:[A-Za-z]:|#{SEPARATOR_PAT})/o
  else
    ABSOLUTE_PATH = /\A#{SEPARATOR_PAT}/o
  end
  private_constant :ABSOLUTE_PATH

  # :startdoc:

  # chop_basename(path) -> [pre-basename, basename] or nil
  def chop_basename(path) # :nodoc:
    base = File.basename(path)
    if /\A#{SEPARATOR_PAT}?\z/o.match?(base)
      return nil
    else
      return path[0, path.rindex(base)], base
    end
  end
  private :chop_basename

  # split_names(path) -> prefix, [name, ...]
  def split_names(path) # :nodoc:
    names = []
    while r = chop_basename(path)
      path, basename = r
      names.unshift basename
    end
    return path, names
  end
  private :split_names

  def prepend_prefix(prefix, relpath) # :nodoc:
    if relpath.empty?
      File.dirname(prefix)
    elsif /#{SEPARATOR_PAT}/o.match?(prefix)
      prefix = File.dirname(prefix)
      prefix = File.join(prefix, "") if File.basename(prefix + 'a') != 'a'
      prefix + relpath
    else
      prefix + relpath
    end
  end
  private :prepend_prefix

  # Returns clean pathname of +self+ with consecutive slashes and useless dots
  # removed.  The filesystem is not accessed.
  #
  # If +consider_symlink+ is +true+, then a more conservative algorithm is used
  # to avoid breaking symbolic linkages.  This may retain more +..+
  # entries than absolutely necessary, but without accessing the filesystem,
  # this can't be avoided.
  #
  # See Pathname#realpath.
  #
  def cleanpath(consider_symlink=false)
    if consider_symlink
      cleanpath_conservative
    else
      cleanpath_aggressive
    end
  end

  #
  # Clean the path simply by resolving and removing excess +.+ and +..+ entries.
  # Nothing more, nothing less.
  #
  def cleanpath_aggressive # :nodoc:
    path = @path
    names = []
    pre = path
    while r = chop_basename(pre)
      pre, base = r
      case base
      when '.'
      when '..'
        names.unshift base
      else
        if names[0] == '..'
          names.shift
        else
          names.unshift base
        end
      end
    end
    pre.tr!(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR
    if /#{SEPARATOR_PAT}/o.match?(File.basename(pre))
      names.shift while names[0] == '..'
    end
    self.class.new(prepend_prefix(pre, File.join(*names)))
  end
  private :cleanpath_aggressive

  # has_trailing_separator?(path) -> bool
  def has_trailing_separator?(path) # :nodoc:
    if r = chop_basename(path)
      pre, basename = r
      pre.length + basename.length < path.length
    else
      false
    end
  end
  private :has_trailing_separator?

  # add_trailing_separator(path) -> path
  def add_trailing_separator(path) # :nodoc:
    if File.basename(path + 'a') == 'a'
      path
    else
      File.join(path, "") # xxx: Is File.join is appropriate to add separator?
    end
  end
  private :add_trailing_separator

  def del_trailing_separator(path) # :nodoc:
    if r = chop_basename(path)
      pre, basename = r
      pre + basename
    elsif /#{SEPARATOR_PAT}+\z/o =~ path
      $` + File.dirname(path)[/#{SEPARATOR_PAT}*\z/o]
    else
      path
    end
  end
  private :del_trailing_separator

  def cleanpath_conservative # :nodoc:
    path = @path
    names = []
    pre = path
    while r = chop_basename(pre)
      pre, base = r
      names.unshift base if base != '.'
    end
    pre.tr!(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR
    if /#{SEPARATOR_PAT}/o.match?(File.basename(pre))
      names.shift while names[0] == '..'
    end
    if names.empty?
      self.class.new(File.dirname(pre))
    else
      if names.last != '..' && File.basename(path) == '.'
        names << '.'
      end
      result = prepend_prefix(pre, File.join(*names))
      if /\A(?:\.|\.\.)\z/ !~ names.last && has_trailing_separator?(path)
        self.class.new(add_trailing_separator(result))
      else
        self.class.new(result)
      end
    end
  end
  private :cleanpath_conservative

  # Returns the parent directory.
  #
  # This is same as <code>self + '..'</code>.
  def parent
    self + '..'
  end

  # Returns +true+ if +self+ points to a mountpoint.
  def mountpoint?
    begin
      stat1 = self.lstat
      stat2 = self.parent.lstat
      stat1.dev != stat2.dev || stat1.ino == stat2.ino
    rescue Errno::ENOENT
      false
    end
  end

  #
  # Predicate method for root directories.  Returns +true+ if the
  # pathname consists of consecutive slashes.
  #
  # It doesn't access the filesystem.  So it may return +false+ for some
  # pathnames which points to roots such as <tt>/usr/..</tt>.
  #
  def root?
    chop_basename(@path) == nil && /#{SEPARATOR_PAT}/o.match?(@path)
  end

  # Predicate method for testing whether a path is absolute.
  #
  # It returns +true+ if the pathname begins with a slash.
  #
  #   p = Pathname.new('/im/sure')
  #   p.absolute?
  #       #=> true
  #
  #   p = Pathname.new('not/so/sure')
  #   p.absolute?
  #       #=> false
  def absolute?
    ABSOLUTE_PATH.match? @path
  end

  # The opposite of Pathname#absolute?
  #
  # It returns +false+ if the pathname begins with a slash.
  #
  #   p = Pathname.new('/im/sure')
  #   p.relative?
  #       #=> false
  #
  #   p = Pathname.new('not/so/sure')
  #   p.relative?
  #       #=> true
  def relative?
    !absolute?
  end

  #
  # Iterates over each component of the path.
  #
  #   Pathname.new("/usr/bin/ruby").each_filename {|filename| ... }
  #     # yields "usr", "bin", and "ruby".
  #
  # Returns an Enumerator if no block was given.
  #
  #   enum = Pathname.new("/usr/bin/ruby").each_filename
  #     # ... do stuff ...
  #   enum.each { |e| ... }
  #     # yields "usr", "bin", and "ruby".
  #
  def each_filename # :yield: filename
    return to_enum(__method__) unless block_given?
    _, names = split_names(@path)
    names.each {|filename| yield filename }
    nil
  end

  # Iterates over and yields a new Pathname object
  # for each element in the given path in descending order.
  #
  #  Pathname.new('/path/to/some/file.rb').descend {|v| p v}
  #     #<Pathname:/>
  #     #<Pathname:/path>
  #     #<Pathname:/path/to>
  #     #<Pathname:/path/to/some>
  #     #<Pathname:/path/to/some/file.rb>
  #
  #  Pathname.new('path/to/some/file.rb').descend {|v| p v}
  #     #<Pathname:path>
  #     #<Pathname:path/to>
  #     #<Pathname:path/to/some>
  #     #<Pathname:path/to/some/file.rb>
  #
  # Returns an Enumerator if no block was given.
  #
  #   enum = Pathname.new("/usr/bin/ruby").descend
  #     # ... do stuff ...
  #   enum.each { |e| ... }
  #     # yields Pathnames /, /usr, /usr/bin, and /usr/bin/ruby.
  #
  # It doesn't access the filesystem.
  #
  def descend
    return to_enum(__method__) unless block_given?
    vs = []
    ascend {|v| vs << v }
    vs.reverse_each {|v| yield v }
    nil
  end

  # Iterates over and yields a new Pathname object
  # for each element in the given path in ascending order.
  #
  #  Pathname.new('/path/to/some/file.rb').ascend {|v| p v}
  #     #<Pathname:/path/to/some/file.rb>
  #     #<Pathname:/path/to/some>
  #     #<Pathname:/path/to>
  #     #<Pathname:/path>
  #     #<Pathname:/>
  #
  #  Pathname.new('path/to/some/file.rb').ascend {|v| p v}
  #     #<Pathname:path/to/some/file.rb>
  #     #<Pathname:path/to/some>
  #     #<Pathname:path/to>
  #     #<Pathname:path>
  #
  # Returns an Enumerator if no block was given.
  #
  #   enum = Pathname.new("/usr/bin/ruby").ascend
  #     # ... do stuff ...
  #   enum.each { |e| ... }
  #     # yields Pathnames /usr/bin/ruby, /usr/bin, /usr, and /.
  #
  # It doesn't access the filesystem.
  #
  def ascend
    return to_enum(__method__) unless block_given?
    path = @path
    yield self
    while r = chop_basename(path)
      path, = r
      break if path.empty?
      yield self.class.new(del_trailing_separator(path))
    end
  end

  #
  # Appends a pathname fragment to +self+ to produce a new Pathname object.
  #
  #   p1 = Pathname.new("/usr")      # Pathname:/usr
  #   p2 = p1 + "bin/ruby"           # Pathname:/usr/bin/ruby
  #   p3 = p1 + "/etc/passwd"        # Pathname:/etc/passwd
  #
  #   # / is aliased to +.
  #   p4 = p1 / "bin/ruby"           # Pathname:/usr/bin/ruby
  #   p5 = p1 / "/etc/passwd"        # Pathname:/etc/passwd
  #
  # This method doesn't access the file system; it is pure string manipulation.
  #
  def +(other)
    other = Pathname.new(other) unless Pathname === other
    Pathname.new(plus(@path, other.to_s))
  end
  alias / +

  def plus(path1, path2) # -> path # :nodoc:
    prefix2 = path2
    index_list2 = []
    basename_list2 = []
    while r2 = chop_basename(prefix2)
      prefix2, basename2 = r2
      index_list2.unshift prefix2.length
      basename_list2.unshift basename2
    end
    return path2 if prefix2 != ''
    prefix1 = path1
    while true
      while !basename_list2.empty? && basename_list2.first == '.'
        index_list2.shift
        basename_list2.shift
      end
      break unless r1 = chop_basename(prefix1)
      prefix1, basename1 = r1
      next if basename1 == '.'
      if basename1 == '..' || basename_list2.empty? || basename_list2.first != '..'
        prefix1 = prefix1 + basename1
        break
      end
      index_list2.shift
      basename_list2.shift
    end
    r1 = chop_basename(prefix1)
    if !r1 && (r1 = /#{SEPARATOR_PAT}/o.match?(File.basename(prefix1)))
      while !basename_list2.empty? && basename_list2.first == '..'
        index_list2.shift
        basename_list2.shift
      end
    end
    if !basename_list2.empty?
      suffix2 = path2[index_list2.first..-1]
      r1 ? File.join(prefix1, suffix2) : prefix1 + suffix2
    else
      r1 ? prefix1 : File.dirname(prefix1)
    end
  end
  private :plus

  #
  # Joins the given pathnames onto +self+ to create a new Pathname object.
  #
  #   path0 = Pathname.new("/usr")                # Pathname:/usr
  #   path0 = path0.join("bin/ruby")              # Pathname:/usr/bin/ruby
  #       # is the same as
  #   path1 = Pathname.new("/usr") + "bin/ruby"   # Pathname:/usr/bin/ruby
  #   path0 == path1
  #       #=> true
  #
  def join(*args)
    return self if args.empty?
    result = args.pop
    result = Pathname.new(result) unless Pathname === result
    return result if result.absolute?
    args.reverse_each {|arg|
      arg = Pathname.new(arg) unless Pathname === arg
      result = arg + result
      return result if result.absolute?
    }
    self + result
  end

  #
  # Returns the children of the directory (files and subdirectories, not
  # recursive) as an array of Pathname objects.
  #
  # By default, the returned pathnames will have enough information to access
  # the files. If you set +with_directory+ to +false+, then the returned
  # pathnames will contain the filename only.
  #
  # For example:
  #   pn = Pathname("/usr/lib/ruby/1.8")
  #   pn.children
  #       # -> [ Pathname:/usr/lib/ruby/1.8/English.rb,
  #              Pathname:/usr/lib/ruby/1.8/Env.rb,
  #              Pathname:/usr/lib/ruby/1.8/abbrev.rb, ... ]
  #   pn.children(false)
  #       # -> [ Pathname:English.rb, Pathname:Env.rb, Pathname:abbrev.rb, ... ]
  #
  # Note that the results never contain the entries +.+ and +..+ in
  # the directory because they are not children.
  #
  def children(with_directory=true)
    with_directory = false if @path == '.'
    result = []
    Dir.foreach(@path) {|e|
      next if e == '.' || e == '..'
      if with_directory
        result << self.class.new(File.join(@path, e))
      else
        result << self.class.new(e)
      end
    }
    result
  end

  # Iterates over the children of the directory
  # (files and subdirectories, not recursive).
  #
  # It yields Pathname object for each child.
  #
  # By default, the yielded pathnames will have enough information to access
  # the files.
  #
  # If you set +with_directory+ to +false+, then the returned pathnames will
  # contain the filename only.
  #
  #   Pathname("/usr/local").each_child {|f| p f }
  #   #=> #<Pathname:/usr/local/share>
  #   #   #<Pathname:/usr/local/bin>
  #   #   #<Pathname:/usr/local/games>
  #   #   #<Pathname:/usr/local/lib>
  #   #   #<Pathname:/usr/local/include>
  #   #   #<Pathname:/usr/local/sbin>
  #   #   #<Pathname:/usr/local/src>
  #   #   #<Pathname:/usr/local/man>
  #
  #   Pathname("/usr/local").each_child(false) {|f| p f }
  #   #=> #<Pathname:share>
  #   #   #<Pathname:bin>
  #   #   #<Pathname:games>
  #   #   #<Pathname:lib>
  #   #   #<Pathname:include>
  #   #   #<Pathname:sbin>
  #   #   #<Pathname:src>
  #   #   #<Pathname:man>
  #
  # Note that the results never contain the entries +.+ and +..+ in
  # the directory because they are not children.
  #
  # See Pathname#children
  #
  def each_child(with_directory=true, &b)
    children(with_directory).each(&b)
  end

  #
  # Returns a relative path from the given +base_directory+ to the receiver.
  #
  # If +self+ is absolute, then +base_directory+ must be absolute too.
  #
  # If +self+ is relative, then +base_directory+ must be relative too.
  #
  # This method doesn't access the filesystem.  It assumes no symlinks.
  #
  # ArgumentError is raised when it cannot find a relative path.
  #
  # Note that this method does not handle situations where the case sensitivity
  # of the filesystem in use differs from the operating system default.
  #
  def relative_path_from(base_directory)
    base_directory = Pathname.new(base_directory) unless base_directory.is_a? Pathname
    dest_directory = self.cleanpath.to_s
    base_directory = base_directory.cleanpath.to_s
    dest_prefix = dest_directory
    dest_names = []
    while r = chop_basename(dest_prefix)
      dest_prefix, basename = r
      dest_names.unshift basename if basename != '.'
    end
    base_prefix = base_directory
    base_names = []
    while r = chop_basename(base_prefix)
      base_prefix, basename = r
      base_names.unshift basename if basename != '.'
    end
    unless SAME_PATHS[dest_prefix, base_prefix]
      raise ArgumentError, "different prefix: #{dest_prefix.inspect} and #{base_directory.inspect}"
    end
    while !dest_names.empty? &&
          !base_names.empty? &&
          SAME_PATHS[dest_names.first, base_names.first]
      dest_names.shift
      base_names.shift
    end
    if base_names.include? '..'
      raise ArgumentError, "base_directory has ..: #{base_directory.inspect}"
    end
    base_names.fill('..')
    relpath_names = base_names + dest_names
    if relpath_names.empty?
      Pathname.new('.')
    else
      Pathname.new(File.join(*relpath_names))
    end
  end
end


class Pathname    # * Find *
  #
  # Iterates over the directory tree in a depth first manner, yielding a
  # Pathname for each file under "this" directory.
  #
  # Returns an Enumerator if no block is given.
  #
  # Since it is implemented by the standard library module Find, Find.prune can
  # be used to control the traversal.
  #
  # If +self+ is +.+, yielded pathnames begin with a filename in the
  # current directory, not +./+.
  #
  # See Find.find
  #
  def find(ignore_error: true) # :yield: pathname
    return to_enum(__method__, ignore_error: ignore_error) unless block_given?
    require 'find'
    if @path == '.'
      Find.find(@path, ignore_error: ignore_error) {|f| yield self.class.new(f.sub(%r{\A\./}, '')) }
    else
      Find.find(@path, ignore_error: ignore_error) {|f| yield self.class.new(f) }
    end
  end
end


class Pathname    # * FileUtils *
  autoload(:FileUtils, 'fileutils')

  # Creates a full path, including any intermediate directories that don't yet
  # exist.
  #
  # See FileUtils.mkpath and FileUtils.mkdir_p
  def mkpath(mode: nil)
    FileUtils.mkpath(@path, mode: mode)
    nil
  end

  # Recursively deletes a directory, including all directories beneath it.
  #
  # See FileUtils.rm_r
  def rmtree
    # The name "rmtree" is borrowed from File::Path of Perl.
    # File::Path provides "mkpath" and "rmtree".
    FileUtils.rm_r(@path)
    nil
  end
end

PK}$[(�[D��ruby/forwardable/impl.rbnu�[���# :stopdoc:
module Forwardable
  def self._valid_method?(method)
    iseq = RubyVM::InstructionSequence.compile("().#{method}", nil, nil, 0, false)
  rescue SyntaxError
    false
  else
    iseq.to_a.dig(-1, 1, 1, :mid) == method.to_sym
  end

  def self._compile_method(src, file, line)
    RubyVM::InstructionSequence.compile(src, file, file, line,
               trace_instruction: false)
      .eval
  end
end
PK}$[N�!rrruby/fiddle.rbnu�[���# frozen_string_literal: true

require 'fiddle.so'
require 'fiddle/closure'
require 'fiddle/function'
require 'fiddle/version'

module Fiddle
  if WINDOWS
    # Returns the last win32 +Error+ of the current executing +Thread+ or nil
    # if none
    def self.win32_last_error
      Thread.current[:__FIDDLE_WIN32_LAST_ERROR__]
    end

    # Sets the last win32 +Error+ of the current executing +Thread+ to +error+
    def self.win32_last_error= error
      Thread.current[:__FIDDLE_WIN32_LAST_ERROR__] = error
    end

    # Returns the last win32 socket +Error+ of the current executing
    # +Thread+ or nil if none
    def self.win32_last_socket_error
      Thread.current[:__FIDDLE_WIN32_LAST_SOCKET_ERROR__]
    end

    # Sets the last win32 socket +Error+ of the current executing
    # +Thread+ to +error+
    def self.win32_last_socket_error= error
      Thread.current[:__FIDDLE_WIN32_LAST_SOCKET_ERROR__] = error
    end
  end

  # Returns the last +Error+ of the current executing +Thread+ or nil if none
  def self.last_error
    Thread.current[:__FIDDLE_LAST_ERROR__]
  end

  # Sets the last +Error+ of the current executing +Thread+ to +error+
  def self.last_error= error
    Thread.current[:__DL2_LAST_ERROR__] = error
    Thread.current[:__FIDDLE_LAST_ERROR__] = error
  end

  # call-seq: dlopen(library) => Fiddle::Handle
  #
  # Creates a new handler that opens +library+, and returns an instance of
  # Fiddle::Handle.
  #
  # If +nil+ is given for the +library+, Fiddle::Handle::DEFAULT is used, which
  # is the equivalent to RTLD_DEFAULT. See <code>man 3 dlopen</code> for more.
  #
  #   lib = Fiddle.dlopen(nil)
  #
  # The default is dependent on OS, and provide a handle for all libraries
  # already loaded. For example, in most cases you can use this to access
  # +libc+ functions, or ruby functions like +rb_str_new+.
  #
  # See Fiddle::Handle.new for more.
  def dlopen library
    Fiddle::Handle.new library
  end
  module_function :dlopen

  # Add constants for backwards compat

  RTLD_GLOBAL = Handle::RTLD_GLOBAL # :nodoc:
  RTLD_LAZY   = Handle::RTLD_LAZY   # :nodoc:
  RTLD_NOW    = Handle::RTLD_NOW    # :nodoc:
end
PK}$[gems/gems/psych-4.0.4/lib/psychnuȯ��PK}$[)gems/gems/bigdecimal-3.1.1/lib/bigdecimalnuȯ��PK}$[���URURruby/ipaddr.rbnu�[���# frozen_string_literal: true
#
# ipaddr.rb - A class to manipulate an IP address
#
# Copyright (c) 2002 Hajimu UMEMOTO <ume@mahoroba.org>.
# Copyright (c) 2007, 2009, 2012 Akinori MUSHA <knu@iDaemons.org>.
# All rights reserved.
#
# You can redistribute and/or modify it under the same terms as Ruby.
#
# $Id$
#
# Contact:
#   - Akinori MUSHA <knu@iDaemons.org> (current maintainer)
#
# TODO:
#   - scope_id support
#
require 'socket'

# IPAddr provides a set of methods to manipulate an IP address.  Both IPv4 and
# IPv6 are supported.
#
# == Example
#
#   require 'ipaddr'
#
#   ipaddr1 = IPAddr.new "3ffe:505:2::1"
#
#   p ipaddr1                   #=> #<IPAddr: IPv6:3ffe:0505:0002:0000:0000:0000:0000:0001/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff>
#
#   p ipaddr1.to_s              #=> "3ffe:505:2::1"
#
#   ipaddr2 = ipaddr1.mask(48)  #=> #<IPAddr: IPv6:3ffe:0505:0002:0000:0000:0000:0000:0000/ffff:ffff:ffff:0000:0000:0000:0000:0000>
#
#   p ipaddr2.to_s              #=> "3ffe:505:2::"
#
#   ipaddr3 = IPAddr.new "192.168.2.0/24"
#
#   p ipaddr3                   #=> #<IPAddr: IPv4:192.168.2.0/255.255.255.0>

class IPAddr
  VERSION = "1.2.4"

  # 32 bit mask for IPv4
  IN4MASK = 0xffffffff
  # 128 bit mask for IPv6
  IN6MASK = 0xffffffffffffffffffffffffffffffff
  # Format string for IPv6
  IN6FORMAT = (["%.4x"] * 8).join(':')

  # Regexp _internally_ used for parsing IPv4 address.
  RE_IPV4ADDRLIKE = %r{
    \A
    (\d+) \. (\d+) \. (\d+) \. (\d+)
    \z
  }x

  # Regexp _internally_ used for parsing IPv6 address.
  RE_IPV6ADDRLIKE_FULL = %r{
    \A
    (?:
      (?: [\da-f]{1,4} : ){7} [\da-f]{1,4}
    |
      ( (?: [\da-f]{1,4} : ){6} )
      (\d+) \. (\d+) \. (\d+) \. (\d+)
    )
    \z
  }xi

  # Regexp _internally_ used for parsing IPv6 address.
  RE_IPV6ADDRLIKE_COMPRESSED = %r{
    \A
    ( (?: (?: [\da-f]{1,4} : )* [\da-f]{1,4} )? )
    ::
    ( (?:
      ( (?: [\da-f]{1,4} : )* )
      (?:
        [\da-f]{1,4}
      |
        (\d+) \. (\d+) \. (\d+) \. (\d+)
      )
    )? )
    \z
  }xi

  # Generic IPAddr related error. Exceptions raised in this class should
  # inherit from Error.
  class Error < ArgumentError; end

  # Raised when the provided IP address is an invalid address.
  class InvalidAddressError < Error; end

  # Raised when the address family is invalid such as an address with an
  # unsupported family, an address with an inconsistent family, or an address
  # who's family cannot be determined.
  class AddressFamilyError < Error; end

  # Raised when the address is an invalid length.
  class InvalidPrefixError < InvalidAddressError; end

  # Returns the address family of this IP address.
  attr_reader :family

  # Creates a new ipaddr containing the given network byte ordered
  # string form of an IP address.
  def self.new_ntoh(addr)
    return new(ntop(addr))
  end

  # Convert a network byte ordered string form of an IP address into
  # human readable form.
  def self.ntop(addr)
    case addr.size
    when 4
      addr.unpack('C4').join('.')
    when 16
      IN6FORMAT % addr.unpack('n8')
    else
      raise AddressFamilyError, "unsupported address family"
    end
  end

  # Returns a new ipaddr built by bitwise AND.
  def &(other)
    return self.clone.set(@addr & coerce_other(other).to_i)
  end

  # Returns a new ipaddr built by bitwise OR.
  def |(other)
    return self.clone.set(@addr | coerce_other(other).to_i)
  end

  # Returns a new ipaddr built by bitwise right-shift.
  def >>(num)
    return self.clone.set(@addr >> num)
  end

  # Returns a new ipaddr built by bitwise left shift.
  def <<(num)
    return self.clone.set(addr_mask(@addr << num))
  end

  # Returns a new ipaddr built by bitwise negation.
  def ~
    return self.clone.set(addr_mask(~@addr))
  end

  # Returns true if two ipaddrs are equal.
  def ==(other)
    other = coerce_other(other)
  rescue
    false
  else
    @family == other.family && @addr == other.to_i
  end

  # Returns a new ipaddr built by masking IP address with the given
  # prefixlen/netmask. (e.g. 8, 64, "255.255.255.0", etc.)
  def mask(prefixlen)
    return self.clone.mask!(prefixlen)
  end

  # Returns true if the given ipaddr is in the range.
  #
  # e.g.:
  #   require 'ipaddr'
  #   net1 = IPAddr.new("192.168.2.0/24")
  #   net2 = IPAddr.new("192.168.2.100")
  #   net3 = IPAddr.new("192.168.3.0")
  #   net4 = IPAddr.new("192.168.2.0/16")
  #   p net1.include?(net2)     #=> true
  #   p net1.include?(net3)     #=> false
  #   p net1.include?(net4)     #=> false
  #   p net4.include?(net1)     #=> true
  def include?(other)
    other = coerce_other(other)
    return false unless other.family == family
    range = to_range
    other = other.to_range
    range.begin <= other.begin && range.end >= other.end
  end
  alias === include?

  # Returns the integer representation of the ipaddr.
  def to_i
    return @addr
  end

  # Returns a string containing the IP address representation.
  def to_s
    str = to_string
    return str if ipv4?

    str.gsub!(/\b0{1,3}([\da-f]+)\b/i, '\1')
    loop do
      break if str.sub!(/\A0:0:0:0:0:0:0:0\z/, '::')
      break if str.sub!(/\b0:0:0:0:0:0:0\b/, ':')
      break if str.sub!(/\b0:0:0:0:0:0\b/, ':')
      break if str.sub!(/\b0:0:0:0:0\b/, ':')
      break if str.sub!(/\b0:0:0:0\b/, ':')
      break if str.sub!(/\b0:0:0\b/, ':')
      break if str.sub!(/\b0:0\b/, ':')
      break
    end
    str.sub!(/:{3,}/, '::')

    if /\A::(ffff:)?([\da-f]{1,4}):([\da-f]{1,4})\z/i =~ str
      str = sprintf('::%s%d.%d.%d.%d', $1, $2.hex / 256, $2.hex % 256, $3.hex / 256, $3.hex % 256)
    end

    str
  end

  # Returns a string containing the IP address representation in
  # canonical form.
  def to_string
    str = _to_string(@addr)

    if @family == Socket::AF_INET6
      str << zone_id.to_s
    end

    return str
  end

  # Returns a network byte ordered string form of the IP address.
  def hton
    case @family
    when Socket::AF_INET
      return [@addr].pack('N')
    when Socket::AF_INET6
      return (0..7).map { |i|
        (@addr >> (112 - 16 * i)) & 0xffff
      }.pack('n8')
    else
      raise AddressFamilyError, "unsupported address family"
    end
  end

  # Returns true if the ipaddr is an IPv4 address.
  def ipv4?
    return @family == Socket::AF_INET
  end

  # Returns true if the ipaddr is an IPv6 address.
  def ipv6?
    return @family == Socket::AF_INET6
  end

  # Returns true if the ipaddr is a loopback address.
  def loopback?
    case @family
    when Socket::AF_INET
      @addr & 0xff000000 == 0x7f000000
    when Socket::AF_INET6
      @addr == 1
    else
      raise AddressFamilyError, "unsupported address family"
    end
  end

  # Returns true if the ipaddr is a private address.  IPv4 addresses
  # in 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16 as defined in RFC
  # 1918 and IPv6 Unique Local Addresses in fc00::/7 as defined in RFC
  # 4193 are considered private.
  def private?
    case @family
    when Socket::AF_INET
      @addr & 0xff000000 == 0x0a000000 ||    # 10.0.0.0/8
        @addr & 0xfff00000 == 0xac100000 ||  # 172.16.0.0/12
        @addr & 0xffff0000 == 0xc0a80000     # 192.168.0.0/16
    when Socket::AF_INET6
      @addr & 0xfe00_0000_0000_0000_0000_0000_0000_0000 == 0xfc00_0000_0000_0000_0000_0000_0000_0000
    else
      raise AddressFamilyError, "unsupported address family"
    end
  end

  # Returns true if the ipaddr is a link-local address.  IPv4
  # addresses in 169.254.0.0/16 reserved by RFC 3927 and Link-Local
  # IPv6 Unicast Addresses in fe80::/10 reserved by RFC 4291 are
  # considered link-local.
  def link_local?
    case @family
    when Socket::AF_INET
      @addr & 0xffff0000 == 0xa9fe0000 # 169.254.0.0/16
    when Socket::AF_INET6
      @addr & 0xffc0_0000_0000_0000_0000_0000_0000_0000 == 0xfe80_0000_0000_0000_0000_0000_0000_0000
    else
      raise AddressFamilyError, "unsupported address family"
    end
  end

  # Returns true if the ipaddr is an IPv4-mapped IPv6 address.
  def ipv4_mapped?
    return ipv6? && (@addr >> 32) == 0xffff
  end

  # Returns true if the ipaddr is an IPv4-compatible IPv6 address.
  def ipv4_compat?
    warn "IPAddr\##{__callee__} is obsolete", uplevel: 1 if $VERBOSE
    _ipv4_compat?
  end

  def _ipv4_compat?
    if !ipv6? || (@addr >> 32) != 0
      return false
    end
    a = (@addr & IN4MASK)
    return a != 0 && a != 1
  end

  private :_ipv4_compat?

  # Returns a new ipaddr built by converting the native IPv4 address
  # into an IPv4-mapped IPv6 address.
  def ipv4_mapped
    if !ipv4?
      raise InvalidAddressError, "not an IPv4 address: #{@addr}"
    end
    clone = self.clone.set(@addr | 0xffff00000000, Socket::AF_INET6)
    clone.instance_variable_set(:@mask_addr, @mask_addr | 0xffffffffffffffffffffffff00000000)
    clone
  end

  # Returns a new ipaddr built by converting the native IPv4 address
  # into an IPv4-compatible IPv6 address.
  def ipv4_compat
    warn "IPAddr\##{__callee__} is obsolete", uplevel: 1 if $VERBOSE
    if !ipv4?
      raise InvalidAddressError, "not an IPv4 address: #{@addr}"
    end
    return self.clone.set(@addr, Socket::AF_INET6)
  end

  # Returns a new ipaddr built by converting the IPv6 address into a
  # native IPv4 address.  If the IP address is not an IPv4-mapped or
  # IPv4-compatible IPv6 address, returns self.
  def native
    if !ipv4_mapped? && !_ipv4_compat?
      return self
    end
    return self.clone.set(@addr & IN4MASK, Socket::AF_INET)
  end

  # Returns a string for DNS reverse lookup.  It returns a string in
  # RFC3172 form for an IPv6 address.
  def reverse
    case @family
    when Socket::AF_INET
      return _reverse + ".in-addr.arpa"
    when Socket::AF_INET6
      return ip6_arpa
    else
      raise AddressFamilyError, "unsupported address family"
    end
  end

  # Returns a string for DNS reverse lookup compatible with RFC3172.
  def ip6_arpa
    if !ipv6?
      raise InvalidAddressError, "not an IPv6 address: #{@addr}"
    end
    return _reverse + ".ip6.arpa"
  end

  # Returns a string for DNS reverse lookup compatible with RFC1886.
  def ip6_int
    if !ipv6?
      raise InvalidAddressError, "not an IPv6 address: #{@addr}"
    end
    return _reverse + ".ip6.int"
  end

  # Returns the successor to the ipaddr.
  def succ
    return self.clone.set(@addr + 1, @family)
  end

  # Compares the ipaddr with another.
  def <=>(other)
    other = coerce_other(other)
  rescue
    nil
  else
    @addr <=> other.to_i if other.family == @family
  end
  include Comparable

  # Checks equality used by Hash.
  def eql?(other)
    return self.class == other.class && self.hash == other.hash && self == other
  end

  # Returns a hash value used by Hash, Set, and Array classes
  def hash
    return ([@addr, @mask_addr, @zone_id].hash << 1) | (ipv4? ? 0 : 1)
  end

  # Creates a Range object for the network address.
  def to_range
    begin_addr = (@addr & @mask_addr)

    case @family
    when Socket::AF_INET
      end_addr = (@addr | (IN4MASK ^ @mask_addr))
    when Socket::AF_INET6
      end_addr = (@addr | (IN6MASK ^ @mask_addr))
    else
      raise AddressFamilyError, "unsupported address family"
    end

    self.class.new(begin_addr, @family)..self.class.new(end_addr, @family)
  end

  # Returns the prefix length in bits for the ipaddr.
  def prefix
    case @family
    when Socket::AF_INET
      n = IN4MASK ^ @mask_addr
      i = 32
    when Socket::AF_INET6
      n = IN6MASK ^ @mask_addr
      i = 128
    else
      raise AddressFamilyError, "unsupported address family"
    end
    while n.positive?
      n >>= 1
      i -= 1
    end
    i
  end

  # Sets the prefix length in bits
  def prefix=(prefix)
    case prefix
    when Integer
      mask!(prefix)
    else
      raise InvalidPrefixError, "prefix must be an integer: #{@addr}"
    end
  end

  # Returns a string containing a human-readable representation of the
  # ipaddr. ("#<IPAddr: family:address/mask>")
  def inspect
    case @family
    when Socket::AF_INET
      af = "IPv4"
    when Socket::AF_INET6
      af = "IPv6"
      zone_id = @zone_id.to_s
    else
      raise AddressFamilyError, "unsupported address family"
    end
    return sprintf("#<%s: %s:%s%s/%s>", self.class.name,
                   af, _to_string(@addr), zone_id, _to_string(@mask_addr))
  end

  # Returns the netmask in string format e.g. 255.255.0.0
  def netmask
    _to_string(@mask_addr)
  end

  # Returns the IPv6 zone identifier, if present.
  # Raises InvalidAddressError if not an IPv6 address.
  def zone_id
    if @family == Socket::AF_INET6
      @zone_id
    else
      raise InvalidAddressError, "not an IPv6 address"
    end
  end

  # Returns the IPv6 zone identifier, if present.
  # Raises InvalidAddressError if not an IPv6 address.
  def zone_id=(zid)
    if @family == Socket::AF_INET6
      case zid
      when nil, /\A%(\w+)\z/
        @zone_id = zid
      else
        raise InvalidAddressError, "invalid zone identifier for address"
      end
    else
      raise InvalidAddressError, "not an IPv6 address"
    end
  end

  protected

  # Set +@addr+, the internal stored ip address, to given +addr+. The
  # parameter +addr+ is validated using the first +family+ member,
  # which is +Socket::AF_INET+ or +Socket::AF_INET6+.
  def set(addr, *family)
    case family[0] ? family[0] : @family
    when Socket::AF_INET
      if addr < 0 || addr > IN4MASK
        raise InvalidAddressError, "invalid address: #{@addr}"
      end
    when Socket::AF_INET6
      if addr < 0 || addr > IN6MASK
        raise InvalidAddressError, "invalid address: #{@addr}"
      end
    else
      raise AddressFamilyError, "unsupported address family"
    end
    @addr = addr
    if family[0]
      @family = family[0]
      if @family == Socket::AF_INET
        @mask_addr &= IN4MASK
      end
    end
    return self
  end

  # Set current netmask to given mask.
  def mask!(mask)
    case mask
    when String
      case mask
      when /\A(0|[1-9]+\d*)\z/
        prefixlen = mask.to_i
      when /\A\d+\z/
        raise InvalidPrefixError, "leading zeros in prefix"
      else
        m = IPAddr.new(mask)
        if m.family != @family
          raise InvalidPrefixError, "address family is not same: #{@addr}"
        end
        @mask_addr = m.to_i
        n = @mask_addr ^ m.instance_variable_get(:@mask_addr)
        unless ((n + 1) & n).zero?
          raise InvalidPrefixError, "invalid mask #{mask}: #{@addr}"
        end
        @addr &= @mask_addr
        return self
      end
    else
      prefixlen = mask
    end
    case @family
    when Socket::AF_INET
      if prefixlen < 0 || prefixlen > 32
        raise InvalidPrefixError, "invalid length: #{@addr}"
      end
      masklen = 32 - prefixlen
      @mask_addr = ((IN4MASK >> masklen) << masklen)
    when Socket::AF_INET6
      if prefixlen < 0 || prefixlen > 128
        raise InvalidPrefixError, "invalid length: #{@addr}"
      end
      masklen = 128 - prefixlen
      @mask_addr = ((IN6MASK >> masklen) << masklen)
    else
      raise AddressFamilyError, "unsupported address family"
    end
    @addr = ((@addr >> masklen) << masklen)
    return self
  end

  private

  # Creates a new ipaddr object either from a human readable IP
  # address representation in string, or from a packed in_addr value
  # followed by an address family.
  #
  # In the former case, the following are the valid formats that will
  # be recognized: "address", "address/prefixlen" and "address/mask",
  # where IPv6 address may be enclosed in square brackets (`[' and
  # `]').  If a prefixlen or a mask is specified, it returns a masked
  # IP address.  Although the address family is determined
  # automatically from a specified string, you can specify one
  # explicitly by the optional second argument.
  #
  # Otherwise an IP address is generated from a packed in_addr value
  # and an address family.
  #
  # The IPAddr class defines many methods and operators, and some of
  # those, such as &, |, include? and ==, accept a string, or a packed
  # in_addr value instead of an IPAddr object.
  def initialize(addr = '::', family = Socket::AF_UNSPEC)
    @mask_addr = nil
    if !addr.kind_of?(String)
      case family
      when Socket::AF_INET, Socket::AF_INET6
        set(addr.to_i, family)
        @mask_addr = (family == Socket::AF_INET) ? IN4MASK : IN6MASK
        return
      when Socket::AF_UNSPEC
        raise AddressFamilyError, "address family must be specified"
      else
        raise AddressFamilyError, "unsupported address family: #{family}"
      end
    end
    prefix, prefixlen = addr.split('/', 2)
    if prefix =~ /\A\[(.*)\]\z/i
      prefix = $1
      family = Socket::AF_INET6
    end
    if prefix =~ /\A(.*)(%\w+)\z/
      prefix = $1
      zone_id = $2
      family = Socket::AF_INET6
    end
    # It seems AI_NUMERICHOST doesn't do the job.
    #Socket.getaddrinfo(left, nil, Socket::AF_INET6, Socket::SOCK_STREAM, nil,
    #                  Socket::AI_NUMERICHOST)
    @addr = @family = nil
    if family == Socket::AF_UNSPEC || family == Socket::AF_INET
      @addr = in_addr(prefix)
      if @addr
        @family = Socket::AF_INET
      end
    end
    if !@addr && (family == Socket::AF_UNSPEC || family == Socket::AF_INET6)
      @addr = in6_addr(prefix)
      @family = Socket::AF_INET6
    end
    @zone_id = zone_id
    if family != Socket::AF_UNSPEC && @family != family
      raise AddressFamilyError, "address family mismatch"
    end
    if prefixlen
      mask!(prefixlen)
    else
      @mask_addr = (@family == Socket::AF_INET) ? IN4MASK : IN6MASK
    end
  end

  def coerce_other(other)
    case other
    when IPAddr
      other
    when String
      self.class.new(other)
    else
      self.class.new(other, @family)
    end
  end

  def in_addr(addr)
    case addr
    when Array
      octets = addr
    else
      m = RE_IPV4ADDRLIKE.match(addr) or return nil
      octets = m.captures
    end
    octets.inject(0) { |i, s|
      (n = s.to_i) < 256 or raise InvalidAddressError, "invalid address: #{@addr}"
      s.match(/\A0./) and raise InvalidAddressError, "zero-filled number in IPv4 address is ambiguous: #{@addr}"
      i << 8 | n
    }
  end

  def in6_addr(left)
    case left
    when RE_IPV6ADDRLIKE_FULL
      if $2
        addr = in_addr($~[2,4])
        left = $1 + ':'
      else
        addr = 0
      end
      right = ''
    when RE_IPV6ADDRLIKE_COMPRESSED
      if $4
        left.count(':') <= 6 or raise InvalidAddressError, "invalid address: #{@addr}"
        addr = in_addr($~[4,4])
        left = $1
        right = $3 + '0:0'
      else
        left.count(':') <= ($1.empty? || $2.empty? ? 8 : 7) or
          raise InvalidAddressError, "invalid address: #{@addr}"
        left = $1
        right = $2
        addr = 0
      end
    else
      raise InvalidAddressError, "invalid address: #{@addr}"
    end
    l = left.split(':')
    r = right.split(':')
    rest = 8 - l.size - r.size
    if rest < 0
      return nil
    end
    (l + Array.new(rest, '0') + r).inject(0) { |i, s|
      i << 16 | s.hex
    } | addr
  end

  def addr_mask(addr)
    case @family
    when Socket::AF_INET
      return addr & IN4MASK
    when Socket::AF_INET6
      return addr & IN6MASK
    else
      raise AddressFamilyError, "unsupported address family"
    end
  end

  def _reverse
    case @family
    when Socket::AF_INET
      return (0..3).map { |i|
        (@addr >> (8 * i)) & 0xff
      }.join('.')
    when Socket::AF_INET6
      return ("%.32x" % @addr).reverse!.gsub!(/.(?!$)/, '\&.')
    else
      raise AddressFamilyError, "unsupported address family"
    end
  end

  def _to_string(addr)
    case @family
    when Socket::AF_INET
      return (0..3).map { |i|
        (addr >> (24 - 8 * i)) & 0xff
      }.join('.')
    when Socket::AF_INET6
      return (("%.32x" % addr).gsub!(/.{4}(?!$)/, '\&:'))
    else
      raise AddressFamilyError, "unsupported address family"
    end
  end

end

unless Socket.const_defined? :AF_INET6
  class Socket < BasicSocket
    # IPv6 protocol family
    AF_INET6 = Object.new
  end

  class << IPSocket
    private

    def valid_v6?(addr)
      case addr
      when IPAddr::RE_IPV6ADDRLIKE_FULL
        if $2
          $~[2,4].all? {|i| i.to_i < 256 }
        else
          true
        end
      when IPAddr::RE_IPV6ADDRLIKE_COMPRESSED
        if $4
          addr.count(':') <= 6 && $~[4,4].all? {|i| i.to_i < 256}
        else
          addr.count(':') <= 7
        end
      else
        false
      end
    end

    alias getaddress_orig getaddress

    public

    # Returns a +String+ based representation of a valid DNS hostname,
    # IPv4 or IPv6 address.
    #
    #   IPSocket.getaddress 'localhost'         #=> "::1"
    #   IPSocket.getaddress 'broadcasthost'     #=> "255.255.255.255"
    #   IPSocket.getaddress 'www.ruby-lang.org' #=> "221.186.184.68"
    #   IPSocket.getaddress 'www.ccc.de'        #=> "2a00:1328:e102:ccc0::122"
    def getaddress(s)
      if valid_v6?(s)
        s
      else
        getaddress_orig(s)
      end
    end
  end
end
PK}$[�')o�:�:ruby/pstore.rbnu�[���# frozen_string_literal: true
# = PStore -- Transactional File Storage for Ruby Objects
#
# pstore.rb -
#   originally by matz
#   documentation by Kev Jackson and James Edward Gray II
#   improved by Hongli Lai
#
# See PStore for documentation.

require "digest"

#
# PStore implements a file based persistence mechanism based on a Hash.  User
# code can store hierarchies of Ruby objects (values) into the data store file
# by name (keys).  An object hierarchy may be just a single object.  User code
# may later read values back from the data store or even update data, as needed.
#
# The transactional behavior ensures that any changes succeed or fail together.
# This can be used to ensure that the data store is not left in a transitory
# state, where some values were updated but others were not.
#
# Behind the scenes, Ruby objects are stored to the data store file with
# Marshal.  That carries the usual limitations.  Proc objects cannot be
# marshalled, for example.
#
# == Usage example:
#
#  require "pstore"
#
#  # a mock wiki object...
#  class WikiPage
#    def initialize( page_name, author, contents )
#      @page_name = page_name
#      @revisions = Array.new
#
#      add_revision(author, contents)
#    end
#
#    attr_reader :page_name
#
#    def add_revision( author, contents )
#      @revisions << { :created  => Time.now,
#                      :author   => author,
#                      :contents => contents }
#    end
#
#    def wiki_page_references
#      [@page_name] + @revisions.last[:contents].scan(/\b(?:[A-Z]+[a-z]+){2,}/)
#    end
#
#    # ...
#  end
#
#  # create a new page...
#  home_page = WikiPage.new( "HomePage", "James Edward Gray II",
#                            "A page about the JoysOfDocumentation..." )
#
#  # then we want to update page data and the index together, or not at all...
#  wiki = PStore.new("wiki_pages.pstore")
#  wiki.transaction do  # begin transaction; do all of this or none of it
#    # store page...
#    wiki[home_page.page_name] = home_page
#    # ensure that an index has been created...
#    wiki[:wiki_index] ||= Array.new
#    # update wiki index...
#    wiki[:wiki_index].push(*home_page.wiki_page_references)
#  end                   # commit changes to wiki data store file
#
#  ### Some time later... ###
#
#  # read wiki data...
#  wiki.transaction(true) do  # begin read-only transaction, no changes allowed
#    wiki.roots.each do |data_root_name|
#      p data_root_name
#      p wiki[data_root_name]
#    end
#  end
#
# == Transaction modes
#
# By default, file integrity is only ensured as long as the operating system
# (and the underlying hardware) doesn't raise any unexpected I/O errors. If an
# I/O error occurs while PStore is writing to its file, then the file will
# become corrupted.
#
# You can prevent this by setting <em>pstore.ultra_safe = true</em>.
# However, this results in a minor performance loss, and only works on platforms
# that support atomic file renames. Please consult the documentation for
# +ultra_safe+ for details.
#
# Needless to say, if you're storing valuable data with PStore, then you should
# backup the PStore files from time to time.
class PStore
  VERSION = "0.1.1"

  RDWR_ACCESS = {mode: IO::RDWR | IO::CREAT | IO::BINARY, encoding: Encoding::ASCII_8BIT}.freeze
  RD_ACCESS = {mode: IO::RDONLY | IO::BINARY, encoding: Encoding::ASCII_8BIT}.freeze
  WR_ACCESS = {mode: IO::WRONLY | IO::CREAT | IO::TRUNC | IO::BINARY, encoding: Encoding::ASCII_8BIT}.freeze

  # The error type thrown by all PStore methods.
  class Error < StandardError
  end

  # Whether PStore should do its best to prevent file corruptions, even when under
  # unlikely-to-occur error conditions such as out-of-space conditions and other
  # unusual OS filesystem errors. Setting this flag comes at the price in the form
  # of a performance loss.
  #
  # This flag only has effect on platforms on which file renames are atomic (e.g.
  # all POSIX platforms: Linux, MacOS X, FreeBSD, etc). The default value is false.
  attr_accessor :ultra_safe

  #
  # To construct a PStore object, pass in the _file_ path where you would like
  # the data to be stored.
  #
  # PStore objects are always reentrant. But if _thread_safe_ is set to true,
  # then it will become thread-safe at the cost of a minor performance hit.
  #
  def initialize(file, thread_safe = false)
    dir = File::dirname(file)
    unless File::directory? dir
      raise PStore::Error, format("directory %s does not exist", dir)
    end
    if File::exist? file and not File::readable? file
      raise PStore::Error, format("file %s not readable", file)
    end
    @filename = file
    @abort = false
    @ultra_safe = false
    @thread_safe = thread_safe
    @lock = Thread::Mutex.new
  end

  # Raises PStore::Error if the calling code is not in a PStore#transaction.
  def in_transaction
    raise PStore::Error, "not in transaction" unless @lock.locked?
  end
  #
  # Raises PStore::Error if the calling code is not in a PStore#transaction or
  # if the code is in a read-only PStore#transaction.
  #
  def in_transaction_wr
    in_transaction
    raise PStore::Error, "in read-only transaction" if @rdonly
  end
  private :in_transaction, :in_transaction_wr

  #
  # Retrieves a value from the PStore file data, by _name_.  The hierarchy of
  # Ruby objects stored under that root _name_ will be returned.
  #
  # *WARNING*:  This method is only valid in a PStore#transaction.  It will
  # raise PStore::Error if called at any other time.
  #
  def [](name)
    in_transaction
    @table[name]
  end
  #
  # This method is just like PStore#[], save that you may also provide a
  # _default_ value for the object.  In the event the specified _name_ is not
  # found in the data store, your _default_ will be returned instead.  If you do
  # not specify a default, PStore::Error will be raised if the object is not
  # found.
  #
  # *WARNING*:  This method is only valid in a PStore#transaction.  It will
  # raise PStore::Error if called at any other time.
  #
  def fetch(name, default=PStore::Error)
    in_transaction
    unless @table.key? name
      if default == PStore::Error
        raise PStore::Error, format("undefined root name `%s'", name)
      else
        return default
      end
    end
    @table[name]
  end
  #
  # Stores an individual Ruby object or a hierarchy of Ruby objects in the data
  # store file under the root _name_.  Assigning to a _name_ already in the data
  # store clobbers the old data.
  #
  # == Example:
  #
  #  require "pstore"
  #
  #  store = PStore.new("data_file.pstore")
  #  store.transaction do  # begin transaction
  #    # load some data into the store...
  #    store[:single_object] = "My data..."
  #    store[:obj_hierarchy] = { "Kev Jackson" => ["rational.rb", "pstore.rb"],
  #                              "James Gray"  => ["erb.rb", "pstore.rb"] }
  #  end                   # commit changes to data store file
  #
  # *WARNING*:  This method is only valid in a PStore#transaction and it cannot
  # be read-only.  It will raise PStore::Error if called at any other time.
  #
  def []=(name, value)
    in_transaction_wr
    @table[name] = value
  end
  #
  # Removes an object hierarchy from the data store, by _name_.
  #
  # *WARNING*:  This method is only valid in a PStore#transaction and it cannot
  # be read-only.  It will raise PStore::Error if called at any other time.
  #
  def delete(name)
    in_transaction_wr
    @table.delete name
  end

  #
  # Returns the names of all object hierarchies currently in the store.
  #
  # *WARNING*:  This method is only valid in a PStore#transaction.  It will
  # raise PStore::Error if called at any other time.
  #
  def roots
    in_transaction
    @table.keys
  end
  #
  # Returns true if the supplied _name_ is currently in the data store.
  #
  # *WARNING*:  This method is only valid in a PStore#transaction.  It will
  # raise PStore::Error if called at any other time.
  #
  def root?(name)
    in_transaction
    @table.key? name
  end
  # Returns the path to the data store file.
  def path
    @filename
  end

  #
  # Ends the current PStore#transaction, committing any changes to the data
  # store immediately.
  #
  # == Example:
  #
  #  require "pstore"
  #
  #  store = PStore.new("data_file.pstore")
  #  store.transaction do  # begin transaction
  #    # load some data into the store...
  #    store[:one] = 1
  #    store[:two] = 2
  #
  #    store.commit        # end transaction here, committing changes
  #
  #    store[:three] = 3   # this change is never reached
  #  end
  #
  # *WARNING*:  This method is only valid in a PStore#transaction.  It will
  # raise PStore::Error if called at any other time.
  #
  def commit
    in_transaction
    @abort = false
    throw :pstore_abort_transaction
  end
  #
  # Ends the current PStore#transaction, discarding any changes to the data
  # store.
  #
  # == Example:
  #
  #  require "pstore"
  #
  #  store = PStore.new("data_file.pstore")
  #  store.transaction do  # begin transaction
  #    store[:one] = 1     # this change is not applied, see below...
  #    store[:two] = 2     # this change is not applied, see below...
  #
  #    store.abort         # end transaction here, discard all changes
  #
  #    store[:three] = 3   # this change is never reached
  #  end
  #
  # *WARNING*:  This method is only valid in a PStore#transaction.  It will
  # raise PStore::Error if called at any other time.
  #
  def abort
    in_transaction
    @abort = true
    throw :pstore_abort_transaction
  end

  #
  # Opens a new transaction for the data store.  Code executed inside a block
  # passed to this method may read and write data to and from the data store
  # file.
  #
  # At the end of the block, changes are committed to the data store
  # automatically.  You may exit the transaction early with a call to either
  # PStore#commit or PStore#abort.  See those methods for details about how
  # changes are handled.  Raising an uncaught Exception in the block is
  # equivalent to calling PStore#abort.
  #
  # If _read_only_ is set to +true+, you will only be allowed to read from the
  # data store during the transaction and any attempts to change the data will
  # raise a PStore::Error.
  #
  # Note that PStore does not support nested transactions.
  #
  def transaction(read_only = false)  # :yields:  pstore
    value = nil
    if !@thread_safe
      raise PStore::Error, "nested transaction" unless @lock.try_lock
    else
      begin
        @lock.lock
      rescue ThreadError
        raise PStore::Error, "nested transaction"
      end
    end
    begin
      @rdonly = read_only
      @abort = false
      file = open_and_lock_file(@filename, read_only)
      if file
        begin
          @table, checksum, original_data_size = load_data(file, read_only)

          catch(:pstore_abort_transaction) do
            value = yield(self)
          end

          if !@abort && !read_only
            save_data(checksum, original_data_size, file)
          end
        ensure
          file.close
        end
      else
        # This can only occur if read_only == true.
        @table = {}
        catch(:pstore_abort_transaction) do
          value = yield(self)
        end
      end
    ensure
      @lock.unlock
    end
    value
  end

  private
  # Constant for relieving Ruby's garbage collector.
  CHECKSUM_ALGO = %w[SHA512 SHA384 SHA256 SHA1 RMD160 MD5].each do |algo|
    begin
      break Digest(algo)
    rescue LoadError
    end
  end
  EMPTY_STRING = ""
  EMPTY_MARSHAL_DATA = Marshal.dump({})
  EMPTY_MARSHAL_CHECKSUM = CHECKSUM_ALGO.digest(EMPTY_MARSHAL_DATA)

  #
  # Open the specified filename (either in read-only mode or in
  # read-write mode) and lock it for reading or writing.
  #
  # The opened File object will be returned. If _read_only_ is true,
  # and the file does not exist, then nil will be returned.
  #
  # All exceptions are propagated.
  #
  def open_and_lock_file(filename, read_only)
    if read_only
      begin
        file = File.new(filename, **RD_ACCESS)
        begin
          file.flock(File::LOCK_SH)
          return file
        rescue
          file.close
          raise
        end
      rescue Errno::ENOENT
        return nil
      end
    else
      file = File.new(filename, **RDWR_ACCESS)
      file.flock(File::LOCK_EX)
      return file
    end
  end

  # Load the given PStore file.
  # If +read_only+ is true, the unmarshalled Hash will be returned.
  # If +read_only+ is false, a 3-tuple will be returned: the unmarshalled
  # Hash, a checksum of the data, and the size of the data.
  def load_data(file, read_only)
    if read_only
      begin
        table = load(file)
        raise Error, "PStore file seems to be corrupted." unless table.is_a?(Hash)
      rescue EOFError
        # This seems to be a newly-created file.
        table = {}
      end
      table
    else
      data = file.read
      if data.empty?
        # This seems to be a newly-created file.
        table = {}
        checksum = empty_marshal_checksum
        size = empty_marshal_data.bytesize
      else
        table = load(data)
        checksum = CHECKSUM_ALGO.digest(data)
        size = data.bytesize
        raise Error, "PStore file seems to be corrupted." unless table.is_a?(Hash)
      end
      data.replace(EMPTY_STRING)
      [table, checksum, size]
    end
  end

  def on_windows?
    is_windows = RUBY_PLATFORM =~ /mswin|mingw|bccwin|wince/
    self.class.__send__(:define_method, :on_windows?) do
      is_windows
    end
    is_windows
  end

  def save_data(original_checksum, original_file_size, file)
    new_data = dump(@table)

    if new_data.bytesize != original_file_size || CHECKSUM_ALGO.digest(new_data) != original_checksum
      if @ultra_safe && !on_windows?
        # Windows doesn't support atomic file renames.
        save_data_with_atomic_file_rename_strategy(new_data, file)
      else
        save_data_with_fast_strategy(new_data, file)
      end
    end

    new_data.replace(EMPTY_STRING)
  end

  def save_data_with_atomic_file_rename_strategy(data, file)
    temp_filename = "#{@filename}.tmp.#{Process.pid}.#{rand 1000000}"
    temp_file = File.new(temp_filename, **WR_ACCESS)
    begin
      temp_file.flock(File::LOCK_EX)
      temp_file.write(data)
      temp_file.flush
      File.rename(temp_filename, @filename)
    rescue
      File.unlink(temp_file) rescue nil
      raise
    ensure
      temp_file.close
    end
  end

  def save_data_with_fast_strategy(data, file)
    file.rewind
    file.write(data)
    file.truncate(data.bytesize)
  end


  # This method is just a wrapped around Marshal.dump
  # to allow subclass overriding used in YAML::Store.
  def dump(table)  # :nodoc:
    Marshal::dump(table)
  end

  # This method is just a wrapped around Marshal.load.
  # to allow subclass overriding used in YAML::Store.
  def load(content)  # :nodoc:
    Marshal::load(content)
  end

  def empty_marshal_data
    EMPTY_MARSHAL_DATA
  end
  def empty_marshal_checksum
    EMPTY_MARSHAL_CHECKSUM
  end
end
PK}$[�u�[�*�*ruby/net/protocol.rbnu�[���# frozen_string_literal: true
#
# = net/protocol.rb
#
#--
# Copyright (c) 1999-2004 Yukihiro Matsumoto
# Copyright (c) 1999-2004 Minero Aoki
#
# written and maintained by Minero Aoki <aamine@loveruby.net>
#
# This program is free software. You can re-distribute and/or
# modify this program under the same terms as Ruby itself,
# Ruby Distribute License or GNU General Public License.
#
# $Id$
#++
#
# WARNING: This file is going to remove.
# Do not rely on the implementation written in this file.
#

require 'socket'
require 'timeout'
require 'io/wait'

module Net # :nodoc:

  class Protocol   #:nodoc: internal use only
    VERSION = "0.1.2"

    private
    def Protocol.protocol_param(name, val)
      module_eval(<<-End, __FILE__, __LINE__ + 1)
        def #{name}
          #{val}
        end
      End
    end

    def ssl_socket_connect(s, timeout)
      if timeout
        while true
          raise Net::OpenTimeout if timeout <= 0
          start = Process.clock_gettime Process::CLOCK_MONOTONIC
          # to_io is required because SSLSocket doesn't have wait_readable yet
          case s.connect_nonblock(exception: false)
          when :wait_readable; s.to_io.wait_readable(timeout)
          when :wait_writable; s.to_io.wait_writable(timeout)
          else; break
          end
          timeout -= Process.clock_gettime(Process::CLOCK_MONOTONIC) - start
        end
      else
        s.connect
      end
    end
  end


  class ProtocolError          < StandardError; end
  class ProtoSyntaxError       < ProtocolError; end
  class ProtoFatalError        < ProtocolError; end
  class ProtoUnknownError      < ProtocolError; end
  class ProtoServerError       < ProtocolError; end
  class ProtoAuthError         < ProtocolError; end
  class ProtoCommandError      < ProtocolError; end
  class ProtoRetriableError    < ProtocolError; end
  ProtocRetryError = ProtoRetriableError

  ##
  # OpenTimeout, a subclass of Timeout::Error, is raised if a connection cannot
  # be created within the open_timeout.

  class OpenTimeout            < Timeout::Error; end

  ##
  # ReadTimeout, a subclass of Timeout::Error, is raised if a chunk of the
  # response cannot be read within the read_timeout.

  class ReadTimeout < Timeout::Error
    def initialize(io = nil)
      @io = io
    end
    attr_reader :io

    def message
      msg = super
      if @io
        msg = "#{msg} with #{@io.inspect}"
      end
      msg
    end
  end

  ##
  # WriteTimeout, a subclass of Timeout::Error, is raised if a chunk of the
  # response cannot be written within the write_timeout.  Not raised on Windows.

  class WriteTimeout < Timeout::Error
    def initialize(io = nil)
      @io = io
    end
    attr_reader :io

    def message
      msg = super
      if @io
        msg = "#{msg} with #{@io.inspect}"
      end
      msg
    end
  end


  class BufferedIO   #:nodoc: internal use only
    def initialize(io, read_timeout: 60, write_timeout: 60, continue_timeout: nil, debug_output: nil)
      @io = io
      @read_timeout = read_timeout
      @write_timeout = write_timeout
      @continue_timeout = continue_timeout
      @debug_output = debug_output
      @rbuf = ''.b
    end

    attr_reader :io
    attr_accessor :read_timeout
    attr_accessor :write_timeout
    attr_accessor :continue_timeout
    attr_accessor :debug_output

    def inspect
      "#<#{self.class} io=#{@io}>"
    end

    def eof?
      @io.eof?
    end

    def closed?
      @io.closed?
    end

    def close
      @io.close
    end

    #
    # Read
    #

    public

    def read(len, dest = ''.b, ignore_eof = false)
      LOG "reading #{len} bytes..."
      read_bytes = 0
      begin
        while read_bytes + @rbuf.size < len
          s = rbuf_consume(@rbuf.size)
          read_bytes += s.size
          dest << s
          rbuf_fill
        end
        s = rbuf_consume(len - read_bytes)
        read_bytes += s.size
        dest << s
      rescue EOFError
        raise unless ignore_eof
      end
      LOG "read #{read_bytes} bytes"
      dest
    end

    def read_all(dest = ''.b)
      LOG 'reading all...'
      read_bytes = 0
      begin
        while true
          s = rbuf_consume(@rbuf.size)
          read_bytes += s.size
          dest << s
          rbuf_fill
        end
      rescue EOFError
        ;
      end
      LOG "read #{read_bytes} bytes"
      dest
    end

    def readuntil(terminator, ignore_eof = false)
      begin
        until idx = @rbuf.index(terminator)
          rbuf_fill
        end
        return rbuf_consume(idx + terminator.size)
      rescue EOFError
        raise unless ignore_eof
        return rbuf_consume(@rbuf.size)
      end
    end

    def readline
      readuntil("\n").chop
    end

    private

    BUFSIZE = 1024 * 16

    def rbuf_fill
      tmp = @rbuf.empty? ? @rbuf : nil
      case rv = @io.read_nonblock(BUFSIZE, tmp, exception: false)
      when String
        return if rv.equal?(tmp)
        @rbuf << rv
        rv.clear
        return
      when :wait_readable
        (io = @io.to_io).wait_readable(@read_timeout) or raise Net::ReadTimeout.new(io)
        # continue looping
      when :wait_writable
        # OpenSSL::Buffering#read_nonblock may fail with IO::WaitWritable.
        # http://www.openssl.org/support/faq.html#PROG10
        (io = @io.to_io).wait_writable(@read_timeout) or raise Net::ReadTimeout.new(io)
        # continue looping
      when nil
        raise EOFError, 'end of file reached'
      end while true
    end

    def rbuf_consume(len)
      if len == @rbuf.size
        s = @rbuf
        @rbuf = ''.b
      else
        s = @rbuf.slice!(0, len)
      end
      @debug_output << %Q[-> #{s.dump}\n] if @debug_output
      s
    end

    #
    # Write
    #

    public

    def write(*strs)
      writing {
        write0(*strs)
      }
    end

    alias << write

    def writeline(str)
      writing {
        write0 str + "\r\n"
      }
    end

    private

    def writing
      @written_bytes = 0
      @debug_output << '<- ' if @debug_output
      yield
      @debug_output << "\n" if @debug_output
      bytes = @written_bytes
      @written_bytes = nil
      bytes
    end

    def write0(*strs)
      @debug_output << strs.map(&:dump).join if @debug_output
      orig_written_bytes = @written_bytes
      strs.each_with_index do |str, i|
        need_retry = true
        case len = @io.write_nonblock(str, exception: false)
        when Integer
          @written_bytes += len
          len -= str.bytesize
          if len == 0
            if strs.size == i+1
              return @written_bytes - orig_written_bytes
            else
              need_retry = false
              # next string
            end
          elsif len < 0
            str = str.byteslice(len, -len)
          else # len > 0
            need_retry = false
            # next string
          end
          # continue looping
        when :wait_writable
          (io = @io.to_io).wait_writable(@write_timeout) or raise Net::WriteTimeout.new(io)
          # continue looping
        end while need_retry
      end
    end

    #
    # Logging
    #

    private

    def LOG_off
      @save_debug_out = @debug_output
      @debug_output = nil
    end

    def LOG_on
      @debug_output = @save_debug_out
    end

    def LOG(msg)
      return unless @debug_output
      @debug_output << msg + "\n"
    end
  end


  class InternetMessageIO < BufferedIO   #:nodoc: internal use only
    def initialize(*, **)
      super
      @wbuf = nil
    end

    #
    # Read
    #

    def each_message_chunk
      LOG 'reading message...'
      LOG_off()
      read_bytes = 0
      while (line = readuntil("\r\n")) != ".\r\n"
        read_bytes += line.size
        yield line.delete_prefix('.')
      end
      LOG_on()
      LOG "read message (#{read_bytes} bytes)"
    end

    # *library private* (cannot handle 'break')
    def each_list_item
      while (str = readuntil("\r\n")) != ".\r\n"
        yield str.chop
      end
    end

    def write_message_0(src)
      prev = @written_bytes
      each_crlf_line(src) do |line|
        write0 dot_stuff(line)
      end
      @written_bytes - prev
    end

    #
    # Write
    #

    def write_message(src)
      LOG "writing message from #{src.class}"
      LOG_off()
      len = writing {
        using_each_crlf_line {
          write_message_0 src
        }
      }
      LOG_on()
      LOG "wrote #{len} bytes"
      len
    end

    def write_message_by_block(&block)
      LOG 'writing message from block'
      LOG_off()
      len = writing {
        using_each_crlf_line {
          begin
            block.call(WriteAdapter.new(self.method(:write_message_0)))
          rescue LocalJumpError
            # allow `break' from writer block
          end
        }
      }
      LOG_on()
      LOG "wrote #{len} bytes"
      len
    end

    private

    def dot_stuff(s)
      s.sub(/\A\./, '..')
    end

    def using_each_crlf_line
      @wbuf = ''.b
      yield
      if not @wbuf.empty?   # unterminated last line
        write0 dot_stuff(@wbuf.chomp) + "\r\n"
      elsif @written_bytes == 0   # empty src
        write0 "\r\n"
      end
      write0 ".\r\n"
      @wbuf = nil
    end

    def each_crlf_line(src)
      buffer_filling(@wbuf, src) do
        while line = @wbuf.slice!(/\A[^\r\n]*(?:\n|\r(?:\n|(?!\z)))/)
          yield line.chomp("\n") + "\r\n"
        end
      end
    end

    def buffer_filling(buf, src)
      case src
      when String    # for speeding up.
        0.step(src.size - 1, 1024) do |i|
          buf << src[i, 1024]
          yield
        end
      when File    # for speeding up.
        while s = src.read(1024)
          buf << s
          yield
        end
      else    # generic reader
        src.each do |str|
          buf << str
          yield if buf.size > 1024
        end
        yield unless buf.empty?
      end
    end
  end


  #
  # The writer adapter class
  #
  class WriteAdapter
    def initialize(writer)
      @writer = writer
    end

    def inspect
      "#<#{self.class} writer=#{@writer.inspect}>"
    end

    def write(str)
      @writer.call(str)
    end

    alias print write

    def <<(str)
      write str
      self
    end

    def puts(str = '')
      write str.chomp("\n") + "\n"
    end

    def printf(*args)
      write sprintf(*args)
    end
  end


  class ReadAdapter   #:nodoc: internal use only
    def initialize(block)
      @block = block
    end

    def inspect
      "#<#{self.class}>"
    end

    def <<(str)
      call_block(str, &@block) if @block
    end

    private

    # This method is needed because @block must be called by yield,
    # not Proc#call.  You can see difference when using `break' in
    # the block.
    def call_block(str)
      yield str
    end
  end


  module NetPrivate   #:nodoc: obsolete
    Socket = ::Net::InternetMessageIO
  end

end   # module Net
PK}$[�dܱruby/net/https.rbnu�[���# frozen_string_literal: false
=begin

= net/https -- SSL/TLS enhancement for Net::HTTP.

  This file has been merged with net/http.  There is no longer any need to
  require 'net/https' to use HTTPS.

  See Net::HTTP for details on how to make HTTPS connections.

== Info
  'OpenSSL for Ruby 2' project
  Copyright (C) 2001 GOTOU Yuuzou <gotoyuzo@notwork.org>
  All rights reserved.

== Licence
  This program is licensed under the same licence as Ruby.
  (See the file 'LICENCE'.)

=end

require_relative 'http'
require 'openssl'
PK}$[�2GNe�e�ruby/net/http.rbnu�[���# frozen_string_literal: false
#
# = net/http.rb
#
# Copyright (c) 1999-2007 Yukihiro Matsumoto
# Copyright (c) 1999-2007 Minero Aoki
# Copyright (c) 2001 GOTOU Yuuzou
#
# Written and maintained by Minero Aoki <aamine@loveruby.net>.
# HTTPS support added by GOTOU Yuuzou <gotoyuzo@notwork.org>.
#
# This file is derived from "http-access.rb".
#
# Documented by Minero Aoki; converted to RDoc by William Webber.
#
# This program is free software. You can re-distribute and/or
# modify this program under the same terms of ruby itself ---
# Ruby Distribution License or GNU General Public License.
#
# See Net::HTTP for an overview and examples.
#

require 'net/protocol'
require 'uri'
require 'resolv'
autoload :OpenSSL, 'openssl'

module Net   #:nodoc:

  # :stopdoc:
  class HTTPBadResponse < StandardError; end
  class HTTPHeaderSyntaxError < StandardError; end
  # :startdoc:

  # == An HTTP client API for Ruby.
  #
  # Net::HTTP provides a rich library which can be used to build HTTP
  # user-agents.  For more details about HTTP see
  # [RFC2616](http://www.ietf.org/rfc/rfc2616.txt).
  #
  # Net::HTTP is designed to work closely with URI.  URI::HTTP#host,
  # URI::HTTP#port and URI::HTTP#request_uri are designed to work with
  # Net::HTTP.
  #
  # If you are only performing a few GET requests you should try OpenURI.
  #
  # == Simple Examples
  #
  # All examples assume you have loaded Net::HTTP with:
  #
  #   require 'net/http'
  #
  # This will also require 'uri' so you don't need to require it separately.
  #
  # The Net::HTTP methods in the following section do not persist
  # connections.  They are not recommended if you are performing many HTTP
  # requests.
  #
  # === GET
  #
  #   Net::HTTP.get('example.com', '/index.html') # => String
  #
  # === GET by URI
  #
  #   uri = URI('http://example.com/index.html?count=10')
  #   Net::HTTP.get(uri) # => String
  #
  # === GET with Dynamic Parameters
  #
  #   uri = URI('http://example.com/index.html')
  #   params = { :limit => 10, :page => 3 }
  #   uri.query = URI.encode_www_form(params)
  #
  #   res = Net::HTTP.get_response(uri)
  #   puts res.body if res.is_a?(Net::HTTPSuccess)
  #
  # === POST
  #
  #   uri = URI('http://www.example.com/search.cgi')
  #   res = Net::HTTP.post_form(uri, 'q' => 'ruby', 'max' => '50')
  #   puts res.body
  #
  # === POST with Multiple Values
  #
  #   uri = URI('http://www.example.com/search.cgi')
  #   res = Net::HTTP.post_form(uri, 'q' => ['ruby', 'perl'], 'max' => '50')
  #   puts res.body
  #
  # == How to use Net::HTTP
  #
  # The following example code can be used as the basis of an HTTP user-agent
  # which can perform a variety of request types using persistent
  # connections.
  #
  #   uri = URI('http://example.com/some_path?query=string')
  #
  #   Net::HTTP.start(uri.host, uri.port) do |http|
  #     request = Net::HTTP::Get.new uri
  #
  #     response = http.request request # Net::HTTPResponse object
  #   end
  #
  # Net::HTTP::start immediately creates a connection to an HTTP server which
  # is kept open for the duration of the block.  The connection will remain
  # open for multiple requests in the block if the server indicates it
  # supports persistent connections.
  #
  # If you wish to re-use a connection across multiple HTTP requests without
  # automatically closing it you can use ::new and then call #start and
  # #finish manually.
  #
  # The request types Net::HTTP supports are listed below in the section "HTTP
  # Request Classes".
  #
  # For all the Net::HTTP request objects and shortcut request methods you may
  # supply either a String for the request path or a URI from which Net::HTTP
  # will extract the request path.
  #
  # === Response Data
  #
  #   uri = URI('http://example.com/index.html')
  #   res = Net::HTTP.get_response(uri)
  #
  #   # Headers
  #   res['Set-Cookie']            # => String
  #   res.get_fields('set-cookie') # => Array
  #   res.to_hash['set-cookie']    # => Array
  #   puts "Headers: #{res.to_hash.inspect}"
  #
  #   # Status
  #   puts res.code       # => '200'
  #   puts res.message    # => 'OK'
  #   puts res.class.name # => 'HTTPOK'
  #
  #   # Body
  #   puts res.body
  #
  # === Following Redirection
  #
  # Each Net::HTTPResponse object belongs to a class for its response code.
  #
  # For example, all 2XX responses are instances of a Net::HTTPSuccess
  # subclass, a 3XX response is an instance of a Net::HTTPRedirection
  # subclass and a 200 response is an instance of the Net::HTTPOK class.  For
  # details of response classes, see the section "HTTP Response Classes"
  # below.
  #
  # Using a case statement you can handle various types of responses properly:
  #
  #   def fetch(uri_str, limit = 10)
  #     # You should choose a better exception.
  #     raise ArgumentError, 'too many HTTP redirects' if limit == 0
  #
  #     response = Net::HTTP.get_response(URI(uri_str))
  #
  #     case response
  #     when Net::HTTPSuccess then
  #       response
  #     when Net::HTTPRedirection then
  #       location = response['location']
  #       warn "redirected to #{location}"
  #       fetch(location, limit - 1)
  #     else
  #       response.value
  #     end
  #   end
  #
  #   print fetch('http://www.ruby-lang.org')
  #
  # === POST
  #
  # A POST can be made using the Net::HTTP::Post request class.  This example
  # creates a URL encoded POST body:
  #
  #   uri = URI('http://www.example.com/todo.cgi')
  #   req = Net::HTTP::Post.new(uri)
  #   req.set_form_data('from' => '2005-01-01', 'to' => '2005-03-31')
  #
  #   res = Net::HTTP.start(uri.hostname, uri.port) do |http|
  #     http.request(req)
  #   end
  #
  #   case res
  #   when Net::HTTPSuccess, Net::HTTPRedirection
  #     # OK
  #   else
  #     res.value
  #   end
  #
  # To send multipart/form-data use Net::HTTPHeader#set_form:
  #
  #   req = Net::HTTP::Post.new(uri)
  #   req.set_form([['upload', File.open('foo.bar')]], 'multipart/form-data')
  #
  # Other requests that can contain a body such as PUT can be created in the
  # same way using the corresponding request class (Net::HTTP::Put).
  #
  # === Setting Headers
  #
  # The following example performs a conditional GET using the
  # If-Modified-Since header.  If the files has not been modified since the
  # time in the header a Not Modified response will be returned.  See RFC 2616
  # section 9.3 for further details.
  #
  #   uri = URI('http://example.com/cached_response')
  #   file = File.stat 'cached_response'
  #
  #   req = Net::HTTP::Get.new(uri)
  #   req['If-Modified-Since'] = file.mtime.rfc2822
  #
  #   res = Net::HTTP.start(uri.hostname, uri.port) {|http|
  #     http.request(req)
  #   }
  #
  #   open 'cached_response', 'w' do |io|
  #     io.write res.body
  #   end if res.is_a?(Net::HTTPSuccess)
  #
  # === Basic Authentication
  #
  # Basic authentication is performed according to
  # [RFC2617](http://www.ietf.org/rfc/rfc2617.txt).
  #
  #   uri = URI('http://example.com/index.html?key=value')
  #
  #   req = Net::HTTP::Get.new(uri)
  #   req.basic_auth 'user', 'pass'
  #
  #   res = Net::HTTP.start(uri.hostname, uri.port) {|http|
  #     http.request(req)
  #   }
  #   puts res.body
  #
  # === Streaming Response Bodies
  #
  # By default Net::HTTP reads an entire response into memory.  If you are
  # handling large files or wish to implement a progress bar you can instead
  # stream the body directly to an IO.
  #
  #   uri = URI('http://example.com/large_file')
  #
  #   Net::HTTP.start(uri.host, uri.port) do |http|
  #     request = Net::HTTP::Get.new uri
  #
  #     http.request request do |response|
  #       open 'large_file', 'w' do |io|
  #         response.read_body do |chunk|
  #           io.write chunk
  #         end
  #       end
  #     end
  #   end
  #
  # === HTTPS
  #
  # HTTPS is enabled for an HTTP connection by Net::HTTP#use_ssl=.
  #
  #   uri = URI('https://secure.example.com/some_path?query=string')
  #
  #   Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
  #     request = Net::HTTP::Get.new uri
  #     response = http.request request # Net::HTTPResponse object
  #   end
  #
  # Or if you simply want to make a GET request, you may pass in an URI
  # object that has an HTTPS URL. Net::HTTP automatically turns on TLS
  # verification if the URI object has a 'https' URI scheme.
  #
  #   uri = URI('https://example.com/')
  #   Net::HTTP.get(uri) # => String
  #
  # In previous versions of Ruby you would need to require 'net/https' to use
  # HTTPS. This is no longer true.
  #
  # === Proxies
  #
  # Net::HTTP will automatically create a proxy from the +http_proxy+
  # environment variable if it is present.  To disable use of +http_proxy+,
  # pass +nil+ for the proxy address.
  #
  # You may also create a custom proxy:
  #
  #   proxy_addr = 'your.proxy.host'
  #   proxy_port = 8080
  #
  #   Net::HTTP.new('example.com', nil, proxy_addr, proxy_port).start { |http|
  #     # always proxy via your.proxy.addr:8080
  #   }
  #
  # See Net::HTTP.new for further details and examples such as proxies that
  # require a username and password.
  #
  # === Compression
  #
  # Net::HTTP automatically adds Accept-Encoding for compression of response
  # bodies and automatically decompresses gzip and deflate responses unless a
  # Range header was sent.
  #
  # Compression can be disabled through the Accept-Encoding: identity header.
  #
  # == HTTP Request Classes
  #
  # Here is the HTTP request class hierarchy.
  #
  # * Net::HTTPRequest
  #   * Net::HTTP::Get
  #   * Net::HTTP::Head
  #   * Net::HTTP::Post
  #   * Net::HTTP::Patch
  #   * Net::HTTP::Put
  #   * Net::HTTP::Proppatch
  #   * Net::HTTP::Lock
  #   * Net::HTTP::Unlock
  #   * Net::HTTP::Options
  #   * Net::HTTP::Propfind
  #   * Net::HTTP::Delete
  #   * Net::HTTP::Move
  #   * Net::HTTP::Copy
  #   * Net::HTTP::Mkcol
  #   * Net::HTTP::Trace
  #
  # == HTTP Response Classes
  #
  # Here is HTTP response class hierarchy.  All classes are defined in Net
  # module and are subclasses of Net::HTTPResponse.
  #
  # HTTPUnknownResponse:: For unhandled HTTP extensions
  # HTTPInformation::                    1xx
  #   HTTPContinue::                        100
  #   HTTPSwitchProtocol::                  101
  #   HTTPProcessing::                      102
  #   HTTPEarlyHints::                      103
  # HTTPSuccess::                        2xx
  #   HTTPOK::                              200
  #   HTTPCreated::                         201
  #   HTTPAccepted::                        202
  #   HTTPNonAuthoritativeInformation::     203
  #   HTTPNoContent::                       204
  #   HTTPResetContent::                    205
  #   HTTPPartialContent::                  206
  #   HTTPMultiStatus::                     207
  #   HTTPAlreadyReported::                 208
  #   HTTPIMUsed::                          226
  # HTTPRedirection::                    3xx
  #   HTTPMultipleChoices::                 300
  #   HTTPMovedPermanently::                301
  #   HTTPFound::                           302
  #   HTTPSeeOther::                        303
  #   HTTPNotModified::                     304
  #   HTTPUseProxy::                        305
  #   HTTPTemporaryRedirect::               307
  #   HTTPPermanentRedirect::               308
  # HTTPClientError::                    4xx
  #   HTTPBadRequest::                      400
  #   HTTPUnauthorized::                    401
  #   HTTPPaymentRequired::                 402
  #   HTTPForbidden::                       403
  #   HTTPNotFound::                        404
  #   HTTPMethodNotAllowed::                405
  #   HTTPNotAcceptable::                   406
  #   HTTPProxyAuthenticationRequired::     407
  #   HTTPRequestTimeOut::                  408
  #   HTTPConflict::                        409
  #   HTTPGone::                            410
  #   HTTPLengthRequired::                  411
  #   HTTPPreconditionFailed::              412
  #   HTTPRequestEntityTooLarge::           413
  #   HTTPRequestURITooLong::               414
  #   HTTPUnsupportedMediaType::            415
  #   HTTPRequestedRangeNotSatisfiable::    416
  #   HTTPExpectationFailed::               417
  #   HTTPMisdirectedRequest::              421
  #   HTTPUnprocessableEntity::             422
  #   HTTPLocked::                          423
  #   HTTPFailedDependency::                424
  #   HTTPUpgradeRequired::                 426
  #   HTTPPreconditionRequired::            428
  #   HTTPTooManyRequests::                 429
  #   HTTPRequestHeaderFieldsTooLarge::     431
  #   HTTPUnavailableForLegalReasons::      451
  # HTTPServerError::                    5xx
  #   HTTPInternalServerError::             500
  #   HTTPNotImplemented::                  501
  #   HTTPBadGateway::                      502
  #   HTTPServiceUnavailable::              503
  #   HTTPGatewayTimeOut::                  504
  #   HTTPVersionNotSupported::             505
  #   HTTPVariantAlsoNegotiates::           506
  #   HTTPInsufficientStorage::             507
  #   HTTPLoopDetected::                    508
  #   HTTPNotExtended::                     510
  #   HTTPNetworkAuthenticationRequired::   511
  #
  # There is also the Net::HTTPBadResponse exception which is raised when
  # there is a protocol error.
  #
  class HTTP < Protocol

    # :stopdoc:
    VERSION = "0.3.0.1"
    Revision = %q$Revision$.split[1]
    HTTPVersion = '1.1'
    begin
      require 'zlib'
      HAVE_ZLIB=true
    rescue LoadError
      HAVE_ZLIB=false
    end
    # :startdoc:

    # Turns on net/http 1.2 (Ruby 1.8) features.
    # Defaults to ON in Ruby 1.8 or later.
    def HTTP.version_1_2
      true
    end

    # Returns true if net/http is in version 1.2 mode.
    # Defaults to true.
    def HTTP.version_1_2?
      true
    end

    def HTTP.version_1_1?  #:nodoc:
      false
    end

    class << HTTP
      alias is_version_1_1? version_1_1?   #:nodoc:
      alias is_version_1_2? version_1_2?   #:nodoc:
    end

    #
    # short cut methods
    #

    #
    # Gets the body text from the target and outputs it to $stdout.  The
    # target can either be specified as
    # (+uri+, +headers+), or as (+host+, +path+, +port+ = 80); so:
    #
    #    Net::HTTP.get_print URI('http://www.example.com/index.html')
    #
    # or:
    #
    #    Net::HTTP.get_print 'www.example.com', '/index.html'
    #
    # you can also specify request headers:
    #
    #    Net::HTTP.get_print URI('http://www.example.com/index.html'), { 'Accept' => 'text/html' }
    #
    def HTTP.get_print(uri_or_host, path_or_headers = nil, port = nil)
      get_response(uri_or_host, path_or_headers, port) {|res|
        res.read_body do |chunk|
          $stdout.print chunk
        end
      }
      nil
    end

    # Sends a GET request to the target and returns the HTTP response
    # as a string.  The target can either be specified as
    # (+uri+, +headers+), or as (+host+, +path+, +port+ = 80); so:
    #
    #    print Net::HTTP.get(URI('http://www.example.com/index.html'))
    #
    # or:
    #
    #    print Net::HTTP.get('www.example.com', '/index.html')
    #
    # you can also specify request headers:
    #
    #    Net::HTTP.get(URI('http://www.example.com/index.html'), { 'Accept' => 'text/html' })
    #
    def HTTP.get(uri_or_host, path_or_headers = nil, port = nil)
      get_response(uri_or_host, path_or_headers, port).body
    end

    # Sends a GET request to the target and returns the HTTP response
    # as a Net::HTTPResponse object.  The target can either be specified as
    # (+uri+, +headers+), or as (+host+, +path+, +port+ = 80); so:
    #
    #    res = Net::HTTP.get_response(URI('http://www.example.com/index.html'))
    #    print res.body
    #
    # or:
    #
    #    res = Net::HTTP.get_response('www.example.com', '/index.html')
    #    print res.body
    #
    # you can also specify request headers:
    #
    #    Net::HTTP.get_response(URI('http://www.example.com/index.html'), { 'Accept' => 'text/html' })
    #
    def HTTP.get_response(uri_or_host, path_or_headers = nil, port = nil, &block)
      if path_or_headers && !path_or_headers.is_a?(Hash)
        host = uri_or_host
        path = path_or_headers
        new(host, port || HTTP.default_port).start {|http|
          return http.request_get(path, &block)
        }
      else
        uri = uri_or_host
        headers = path_or_headers
        start(uri.hostname, uri.port,
              :use_ssl => uri.scheme == 'https') {|http|
          return http.request_get(uri, headers, &block)
        }
      end
    end

    # Posts data to the specified URI object.
    #
    # Example:
    #
    #   require 'net/http'
    #   require 'uri'
    #
    #   Net::HTTP.post URI('http://www.example.com/api/search'),
    #                  { "q" => "ruby", "max" => "50" }.to_json,
    #                  "Content-Type" => "application/json"
    #
    def HTTP.post(url, data, header = nil)
      start(url.hostname, url.port,
            :use_ssl => url.scheme == 'https' ) {|http|
        http.post(url, data, header)
      }
    end

    # Posts HTML form data to the specified URI object.
    # The form data must be provided as a Hash mapping from String to String.
    # Example:
    #
    #   { "cmd" => "search", "q" => "ruby", "max" => "50" }
    #
    # This method also does Basic Authentication if and only if +url+.user exists.
    # But userinfo for authentication is deprecated (RFC3986).
    # So this feature will be removed.
    #
    # Example:
    #
    #   require 'net/http'
    #
    #   Net::HTTP.post_form URI('http://www.example.com/search.cgi'),
    #                       { "q" => "ruby", "max" => "50" }
    #
    def HTTP.post_form(url, params)
      req = Post.new(url)
      req.form_data = params
      req.basic_auth url.user, url.password if url.user
      start(url.hostname, url.port,
            :use_ssl => url.scheme == 'https' ) {|http|
        http.request(req)
      }
    end

    #
    # HTTP session management
    #

    # The default port to use for HTTP requests; defaults to 80.
    def HTTP.default_port
      http_default_port()
    end

    # The default port to use for HTTP requests; defaults to 80.
    def HTTP.http_default_port
      80
    end

    # The default port to use for HTTPS requests; defaults to 443.
    def HTTP.https_default_port
      443
    end

    def HTTP.socket_type   #:nodoc: obsolete
      BufferedIO
    end

    # :call-seq:
    #   HTTP.start(address, port, p_addr, p_port, p_user, p_pass, &block)
    #   HTTP.start(address, port=nil, p_addr=:ENV, p_port=nil, p_user=nil, p_pass=nil, opt, &block)
    #
    # Creates a new Net::HTTP object, then additionally opens the TCP
    # connection and HTTP session.
    #
    # Arguments are the following:
    # _address_ :: hostname or IP address of the server
    # _port_    :: port of the server
    # _p_addr_  :: address of proxy
    # _p_port_  :: port of proxy
    # _p_user_  :: user of proxy
    # _p_pass_  :: pass of proxy
    # _opt_     :: optional hash
    #
    # _opt_ sets following values by its accessor.
    # The keys are ipaddr, ca_file, ca_path, cert, cert_store, ciphers, keep_alive_timeout,
    # close_on_empty_response, key, open_timeout, read_timeout, write_timeout, ssl_timeout,
    # ssl_version, use_ssl, verify_callback, verify_depth and verify_mode.
    # If you set :use_ssl as true, you can use https and default value of
    # verify_mode is set as OpenSSL::SSL::VERIFY_PEER.
    #
    # If the optional block is given, the newly
    # created Net::HTTP object is passed to it and closed when the
    # block finishes.  In this case, the return value of this method
    # is the return value of the block.  If no block is given, the
    # return value of this method is the newly created Net::HTTP object
    # itself, and the caller is responsible for closing it upon completion
    # using the finish() method.
    def HTTP.start(address, *arg, &block) # :yield: +http+
      arg.pop if opt = Hash.try_convert(arg[-1])
      port, p_addr, p_port, p_user, p_pass = *arg
      p_addr = :ENV if arg.size < 2
      port = https_default_port if !port && opt && opt[:use_ssl]
      http = new(address, port, p_addr, p_port, p_user, p_pass)
      http.ipaddr = opt[:ipaddr] if opt && opt[:ipaddr]

      if opt
        if opt[:use_ssl]
          opt = {verify_mode: OpenSSL::SSL::VERIFY_PEER}.update(opt)
        end
        http.methods.grep(/\A(\w+)=\z/) do |meth|
          key = $1.to_sym
          opt.key?(key) or next
          http.__send__(meth, opt[key])
        end
      end

      http.start(&block)
    end

    class << HTTP
      alias newobj new # :nodoc:
    end

    # Creates a new Net::HTTP object without opening a TCP connection or
    # HTTP session.
    #
    # The +address+ should be a DNS hostname or IP address, the +port+ is the
    # port the server operates on.  If no +port+ is given the default port for
    # HTTP or HTTPS is used.
    #
    # If none of the +p_+ arguments are given, the proxy host and port are
    # taken from the +http_proxy+ environment variable (or its uppercase
    # equivalent) if present.  If the proxy requires authentication you must
    # supply it by hand.  See URI::Generic#find_proxy for details of proxy
    # detection from the environment.  To disable proxy detection set +p_addr+
    # to nil.
    #
    # If you are connecting to a custom proxy, +p_addr+ specifies the DNS name
    # or IP address of the proxy host, +p_port+ the port to use to access the
    # proxy, +p_user+ and +p_pass+ the username and password if authorization
    # is required to use the proxy, and p_no_proxy hosts which do not
    # use the proxy.
    #
    def HTTP.new(address, port = nil, p_addr = :ENV, p_port = nil, p_user = nil, p_pass = nil, p_no_proxy = nil)
      http = super address, port

      if proxy_class? then # from Net::HTTP::Proxy()
        http.proxy_from_env = @proxy_from_env
        http.proxy_address  = @proxy_address
        http.proxy_port     = @proxy_port
        http.proxy_user     = @proxy_user
        http.proxy_pass     = @proxy_pass
      elsif p_addr == :ENV then
        http.proxy_from_env = true
      else
        if p_addr && p_no_proxy && !URI::Generic.use_proxy?(p_addr, p_addr, p_port, p_no_proxy)
          p_addr = nil
          p_port = nil
        end
        http.proxy_address = p_addr
        http.proxy_port    = p_port || default_port
        http.proxy_user    = p_user
        http.proxy_pass    = p_pass
      end

      http
    end

    # Creates a new Net::HTTP object for the specified server address,
    # without opening the TCP connection or initializing the HTTP session.
    # The +address+ should be a DNS hostname or IP address.
    def initialize(address, port = nil)
      @address = address
      @port    = (port || HTTP.default_port)
      @ipaddr = nil
      @local_host = nil
      @local_port = nil
      @curr_http_version = HTTPVersion
      @keep_alive_timeout = 2
      @last_communicated = nil
      @close_on_empty_response = false
      @socket  = nil
      @started = false
      @open_timeout = 60
      @read_timeout = 60
      @write_timeout = 60
      @continue_timeout = nil
      @max_retries = 1
      @debug_output = nil
      @response_body_encoding = false
      @ignore_eof = true

      @proxy_from_env = false
      @proxy_uri      = nil
      @proxy_address  = nil
      @proxy_port     = nil
      @proxy_user     = nil
      @proxy_pass     = nil

      @use_ssl = false
      @ssl_context = nil
      @ssl_session = nil
      @sspi_enabled = false
      SSL_IVNAMES.each do |ivname|
        instance_variable_set ivname, nil
      end
    end

    def inspect
      "#<#{self.class} #{@address}:#{@port} open=#{started?}>"
    end

    # *WARNING* This method opens a serious security hole.
    # Never use this method in production code.
    #
    # Sets an output stream for debugging.
    #
    #   http = Net::HTTP.new(hostname)
    #   http.set_debug_output $stderr
    #   http.start { .... }
    #
    def set_debug_output(output)
      warn 'Net::HTTP#set_debug_output called after HTTP started', uplevel: 1 if started?
      @debug_output = output
    end

    # The DNS host name or IP address to connect to.
    attr_reader :address

    # The port number to connect to.
    attr_reader :port

    # The local host used to establish the connection.
    attr_accessor :local_host

    # The local port used to establish the connection.
    attr_accessor :local_port

    # The encoding to use for the response body.  If Encoding, uses the
    # specified encoding.  If other true value, tries to detect the response
    # body encoding.
    attr_reader :response_body_encoding

    # Set the encoding to use for the response body.  If given a String, find
    # the related Encoding.
    def response_body_encoding=(value)
      value = Encoding.find(value) if value.is_a?(String)
      @response_body_encoding = value
    end

    attr_writer :proxy_from_env
    attr_writer :proxy_address
    attr_writer :proxy_port
    attr_writer :proxy_user
    attr_writer :proxy_pass

    # The IP address to connect to/used to connect to
    def ipaddr
      started? ?  @socket.io.peeraddr[3] : @ipaddr
    end

    # Set the IP address to connect to
    def ipaddr=(addr)
      raise IOError, "ipaddr value changed, but session already started" if started?
      @ipaddr = addr
    end

    # Number of seconds to wait for the connection to open. Any number
    # may be used, including Floats for fractional seconds. If the HTTP
    # object cannot open a connection in this many seconds, it raises a
    # Net::OpenTimeout exception. The default value is 60 seconds.
    attr_accessor :open_timeout

    # Number of seconds to wait for one block to be read (via one read(2)
    # call). Any number may be used, including Floats for fractional
    # seconds. If the HTTP object cannot read data in this many seconds,
    # it raises a Net::ReadTimeout exception. The default value is 60 seconds.
    attr_reader :read_timeout

    # Number of seconds to wait for one block to be written (via one write(2)
    # call). Any number may be used, including Floats for fractional
    # seconds. If the HTTP object cannot write data in this many seconds,
    # it raises a Net::WriteTimeout exception. The default value is 60 seconds.
    # Net::WriteTimeout is not raised on Windows.
    attr_reader :write_timeout

    # Maximum number of times to retry an idempotent request in case of
    # Net::ReadTimeout, IOError, EOFError, Errno::ECONNRESET,
    # Errno::ECONNABORTED, Errno::EPIPE, OpenSSL::SSL::SSLError,
    # Timeout::Error.
    # Should be a non-negative integer number. Zero means no retries.
    # The default value is 1.
    def max_retries=(retries)
      retries = retries.to_int
      if retries < 0
        raise ArgumentError, 'max_retries should be non-negative integer number'
      end
      @max_retries = retries
    end

    attr_reader :max_retries

    # Setter for the read_timeout attribute.
    def read_timeout=(sec)
      @socket.read_timeout = sec if @socket
      @read_timeout = sec
    end

    # Setter for the write_timeout attribute.
    def write_timeout=(sec)
      @socket.write_timeout = sec if @socket
      @write_timeout = sec
    end

    # Seconds to wait for 100 Continue response. If the HTTP object does not
    # receive a response in this many seconds it sends the request body. The
    # default value is +nil+.
    attr_reader :continue_timeout

    # Setter for the continue_timeout attribute.
    def continue_timeout=(sec)
      @socket.continue_timeout = sec if @socket
      @continue_timeout = sec
    end

    # Seconds to reuse the connection of the previous request.
    # If the idle time is less than this Keep-Alive Timeout,
    # Net::HTTP reuses the TCP/IP socket used by the previous communication.
    # The default value is 2 seconds.
    attr_accessor :keep_alive_timeout

    # Whether to ignore EOF when reading response bodies with defined
    # Content-Length headers. For backwards compatibility, the default is true.
    attr_accessor :ignore_eof

    # Returns true if the HTTP session has been started.
    def started?
      @started
    end

    alias active? started?   #:nodoc: obsolete

    attr_accessor :close_on_empty_response

    # Returns true if SSL/TLS is being used with HTTP.
    def use_ssl?
      @use_ssl
    end

    # Turn on/off SSL.
    # This flag must be set before starting session.
    # If you change use_ssl value after session started,
    # a Net::HTTP object raises IOError.
    def use_ssl=(flag)
      flag = flag ? true : false
      if started? and @use_ssl != flag
        raise IOError, "use_ssl value changed, but session already started"
      end
      @use_ssl = flag
    end

    SSL_IVNAMES = [
      :@ca_file,
      :@ca_path,
      :@cert,
      :@cert_store,
      :@ciphers,
      :@extra_chain_cert,
      :@key,
      :@ssl_timeout,
      :@ssl_version,
      :@min_version,
      :@max_version,
      :@verify_callback,
      :@verify_depth,
      :@verify_mode,
      :@verify_hostname,
    ]
    SSL_ATTRIBUTES = [
      :ca_file,
      :ca_path,
      :cert,
      :cert_store,
      :ciphers,
      :extra_chain_cert,
      :key,
      :ssl_timeout,
      :ssl_version,
      :min_version,
      :max_version,
      :verify_callback,
      :verify_depth,
      :verify_mode,
      :verify_hostname,
    ]

    # Sets path of a CA certification file in PEM format.
    #
    # The file can contain several CA certificates.
    attr_accessor :ca_file

    # Sets path of a CA certification directory containing certifications in
    # PEM format.
    attr_accessor :ca_path

    # Sets an OpenSSL::X509::Certificate object as client certificate.
    # (This method is appeared in Michal Rokos's OpenSSL extension).
    attr_accessor :cert

    # Sets the X509::Store to verify peer certificate.
    attr_accessor :cert_store

    # Sets the available ciphers.  See OpenSSL::SSL::SSLContext#ciphers=
    attr_accessor :ciphers

    # Sets the extra X509 certificates to be added to the certificate chain.
    # See OpenSSL::SSL::SSLContext#extra_chain_cert=
    attr_accessor :extra_chain_cert

    # Sets an OpenSSL::PKey::RSA or OpenSSL::PKey::DSA object.
    # (This method is appeared in Michal Rokos's OpenSSL extension.)
    attr_accessor :key

    # Sets the SSL timeout seconds.
    attr_accessor :ssl_timeout

    # Sets the SSL version.  See OpenSSL::SSL::SSLContext#ssl_version=
    attr_accessor :ssl_version

    # Sets the minimum SSL version.  See OpenSSL::SSL::SSLContext#min_version=
    attr_accessor :min_version

    # Sets the maximum SSL version.  See OpenSSL::SSL::SSLContext#max_version=
    attr_accessor :max_version

    # Sets the verify callback for the server certification verification.
    attr_accessor :verify_callback

    # Sets the maximum depth for the certificate chain verification.
    attr_accessor :verify_depth

    # Sets the flags for server the certification verification at beginning of
    # SSL/TLS session.
    #
    # OpenSSL::SSL::VERIFY_NONE or OpenSSL::SSL::VERIFY_PEER are acceptable.
    attr_accessor :verify_mode

    # Sets to check the server certificate is valid for the hostname.
    # See OpenSSL::SSL::SSLContext#verify_hostname=
    attr_accessor :verify_hostname

    # Returns the X.509 certificates the server presented.
    def peer_cert
      if not use_ssl? or not @socket
        return nil
      end
      @socket.io.peer_cert
    end

    # Opens a TCP connection and HTTP session.
    #
    # When this method is called with a block, it passes the Net::HTTP
    # object to the block, and closes the TCP connection and HTTP session
    # after the block has been executed.
    #
    # When called with a block, it returns the return value of the
    # block; otherwise, it returns self.
    #
    def start  # :yield: http
      raise IOError, 'HTTP session already opened' if @started
      if block_given?
        begin
          do_start
          return yield(self)
        ensure
          do_finish
        end
      end
      do_start
      self
    end

    def do_start
      connect
      @started = true
    end
    private :do_start

    def connect
      if use_ssl?
        # reference early to load OpenSSL before connecting,
        # as OpenSSL may take time to load.
        @ssl_context = OpenSSL::SSL::SSLContext.new
      end

      if proxy? then
        conn_addr = proxy_address
        conn_port = proxy_port
      else
        conn_addr = conn_address
        conn_port = port
      end

      debug "opening connection to #{conn_addr}:#{conn_port}..."
      s = Timeout.timeout(@open_timeout, Net::OpenTimeout) {
        begin
          TCPSocket.open(conn_addr, conn_port, @local_host, @local_port)
        rescue => e
          raise e, "Failed to open TCP connection to " +
            "#{conn_addr}:#{conn_port} (#{e.message})"
        end
      }
      s.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
      debug "opened"
      if use_ssl?
        if proxy?
          plain_sock = BufferedIO.new(s, read_timeout: @read_timeout,
                                      write_timeout: @write_timeout,
                                      continue_timeout: @continue_timeout,
                                      debug_output: @debug_output)
          buf = "CONNECT #{conn_address}:#{@port} HTTP/#{HTTPVersion}\r\n"
          buf << "Host: #{@address}:#{@port}\r\n"
          if proxy_user
            credential = ["#{proxy_user}:#{proxy_pass}"].pack('m0')
            buf << "Proxy-Authorization: Basic #{credential}\r\n"
          end
          buf << "\r\n"
          plain_sock.write(buf)
          HTTPResponse.read_new(plain_sock).value
          # assuming nothing left in buffers after successful CONNECT response
        end

        ssl_parameters = Hash.new
        iv_list = instance_variables
        SSL_IVNAMES.each_with_index do |ivname, i|
          if iv_list.include?(ivname)
            value = instance_variable_get(ivname)
            unless value.nil?
              ssl_parameters[SSL_ATTRIBUTES[i]] = value
            end
          end
        end
        @ssl_context.set_params(ssl_parameters)
        unless @ssl_context.session_cache_mode.nil? # a dummy method on JRuby
          @ssl_context.session_cache_mode =
              OpenSSL::SSL::SSLContext::SESSION_CACHE_CLIENT |
                  OpenSSL::SSL::SSLContext::SESSION_CACHE_NO_INTERNAL_STORE
        end
        if @ssl_context.respond_to?(:session_new_cb) # not implemented under JRuby
          @ssl_context.session_new_cb = proc {|sock, sess| @ssl_session = sess }
        end

        # Still do the post_connection_check below even if connecting
        # to IP address
        verify_hostname = @ssl_context.verify_hostname

        # Server Name Indication (SNI) RFC 3546/6066
        case @address
        when Resolv::IPv4::Regex, Resolv::IPv6::Regex
          # don't set SNI, as IP addresses in SNI is not valid
          # per RFC 6066, section 3.

          # Avoid openssl warning
          @ssl_context.verify_hostname = false
        else
          ssl_host_address = @address
        end

        debug "starting SSL for #{conn_addr}:#{conn_port}..."
        s = OpenSSL::SSL::SSLSocket.new(s, @ssl_context)
        s.sync_close = true
        s.hostname = ssl_host_address if s.respond_to?(:hostname=) && ssl_host_address

        if @ssl_session and
           Process.clock_gettime(Process::CLOCK_REALTIME) < @ssl_session.time.to_f + @ssl_session.timeout
          s.session = @ssl_session
        end
        ssl_socket_connect(s, @open_timeout)
        if (@ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE) && verify_hostname
          s.post_connection_check(@address)
        end
        debug "SSL established, protocol: #{s.ssl_version}, cipher: #{s.cipher[0]}"
      end
      @socket = BufferedIO.new(s, read_timeout: @read_timeout,
                               write_timeout: @write_timeout,
                               continue_timeout: @continue_timeout,
                               debug_output: @debug_output)
      @last_communicated = nil
      on_connect
    rescue => exception
      if s
        debug "Conn close because of connect error #{exception}"
        s.close
      end
      raise
    end
    private :connect

    def on_connect
    end
    private :on_connect

    # Finishes the HTTP session and closes the TCP connection.
    # Raises IOError if the session has not been started.
    def finish
      raise IOError, 'HTTP session not yet started' unless started?
      do_finish
    end

    def do_finish
      @started = false
      @socket.close if @socket
      @socket = nil
    end
    private :do_finish

    #
    # proxy
    #

    public

    # no proxy
    @is_proxy_class = false
    @proxy_from_env = false
    @proxy_addr = nil
    @proxy_port = nil
    @proxy_user = nil
    @proxy_pass = nil

    # Creates an HTTP proxy class which behaves like Net::HTTP, but
    # performs all access via the specified proxy.
    #
    # This class is obsolete.  You may pass these same parameters directly to
    # Net::HTTP.new.  See Net::HTTP.new for details of the arguments.
    def HTTP.Proxy(p_addr = :ENV, p_port = nil, p_user = nil, p_pass = nil)
      return self unless p_addr

      Class.new(self) {
        @is_proxy_class = true

        if p_addr == :ENV then
          @proxy_from_env = true
          @proxy_address = nil
          @proxy_port    = nil
        else
          @proxy_from_env = false
          @proxy_address = p_addr
          @proxy_port    = p_port || default_port
        end

        @proxy_user = p_user
        @proxy_pass = p_pass
      }
    end

    class << HTTP
      # returns true if self is a class which was created by HTTP::Proxy.
      def proxy_class?
        defined?(@is_proxy_class) ? @is_proxy_class : false
      end

      # Address of proxy host. If Net::HTTP does not use a proxy, nil.
      attr_reader :proxy_address

      # Port number of proxy host. If Net::HTTP does not use a proxy, nil.
      attr_reader :proxy_port

      # User name for accessing proxy. If Net::HTTP does not use a proxy, nil.
      attr_reader :proxy_user

      # User password for accessing proxy. If Net::HTTP does not use a proxy,
      # nil.
      attr_reader :proxy_pass
    end

    # True if requests for this connection will be proxied
    def proxy?
      !!(@proxy_from_env ? proxy_uri : @proxy_address)
    end

    # True if the proxy for this connection is determined from the environment
    def proxy_from_env?
      @proxy_from_env
    end

    # The proxy URI determined from the environment for this connection.
    def proxy_uri # :nodoc:
      return if @proxy_uri == false
      @proxy_uri ||= URI::HTTP.new(
        "http".freeze, nil, address, port, nil, nil, nil, nil, nil
      ).find_proxy || false
      @proxy_uri || nil
    end

    # The address of the proxy server, if one is configured.
    def proxy_address
      if @proxy_from_env then
        proxy_uri&.hostname
      else
        @proxy_address
      end
    end

    # The port of the proxy server, if one is configured.
    def proxy_port
      if @proxy_from_env then
        proxy_uri&.port
      else
        @proxy_port
      end
    end

    # The username of the proxy server, if one is configured.
    def proxy_user
      if @proxy_from_env
        user = proxy_uri&.user
        unescape(user) if user
      else
        @proxy_user
      end
    end

    # The password of the proxy server, if one is configured.
    def proxy_pass
      if @proxy_from_env
        pass = proxy_uri&.password
        unescape(pass) if pass
      else
        @proxy_pass
      end
    end

    alias proxyaddr proxy_address   #:nodoc: obsolete
    alias proxyport proxy_port      #:nodoc: obsolete

    private

    def unescape(value)
      require 'cgi/util'
      CGI.unescape(value)
    end

    # without proxy, obsolete

    def conn_address # :nodoc:
      @ipaddr || address()
    end

    def conn_port # :nodoc:
      port()
    end

    def edit_path(path)
      if proxy?
        if path.start_with?("ftp://") || use_ssl?
          path
        else
          "http://#{addr_port}#{path}"
        end
      else
        path
      end
    end

    #
    # HTTP operations
    #

    public

    # Retrieves data from +path+ on the connected-to host which may be an
    # absolute path String or a URI to extract the path from.
    #
    # +initheader+ must be a Hash like { 'Accept' => '*/*', ... },
    # and it defaults to an empty hash.
    # If +initheader+ doesn't have the key 'accept-encoding', then
    # a value of "gzip;q=1.0,deflate;q=0.6,identity;q=0.3" is used,
    # so that gzip compression is used in preference to deflate
    # compression, which is used in preference to no compression.
    # Ruby doesn't have libraries to support the compress (Lempel-Ziv)
    # compression, so that is not supported.  The intent of this is
    # to reduce bandwidth by default.   If this routine sets up
    # compression, then it does the decompression also, removing
    # the header as well to prevent confusion.  Otherwise
    # it leaves the body as it found it.
    #
    # This method returns a Net::HTTPResponse object.
    #
    # If called with a block, yields each fragment of the
    # entity body in turn as a string as it is read from
    # the socket.  Note that in this case, the returned response
    # object will *not* contain a (meaningful) body.
    #
    # +dest+ argument is obsolete.
    # It still works but you must not use it.
    #
    # This method never raises an exception.
    #
    #     response = http.get('/index.html')
    #
    #     # using block
    #     File.open('result.txt', 'w') {|f|
    #       http.get('/~foo/') do |str|
    #         f.write str
    #       end
    #     }
    #
    def get(path, initheader = nil, dest = nil, &block) # :yield: +body_segment+
      res = nil
      request(Get.new(path, initheader)) {|r|
        r.read_body dest, &block
        res = r
      }
      res
    end

    # Gets only the header from +path+ on the connected-to host.
    # +header+ is a Hash like { 'Accept' => '*/*', ... }.
    #
    # This method returns a Net::HTTPResponse object.
    #
    # This method never raises an exception.
    #
    #     response = nil
    #     Net::HTTP.start('some.www.server', 80) {|http|
    #       response = http.head('/index.html')
    #     }
    #     p response['content-type']
    #
    def head(path, initheader = nil)
      request(Head.new(path, initheader))
    end

    # Posts +data+ (must be a String) to +path+. +header+ must be a Hash
    # like { 'Accept' => '*/*', ... }.
    #
    # This method returns a Net::HTTPResponse object.
    #
    # If called with a block, yields each fragment of the
    # entity body in turn as a string as it is read from
    # the socket.  Note that in this case, the returned response
    # object will *not* contain a (meaningful) body.
    #
    # +dest+ argument is obsolete.
    # It still works but you must not use it.
    #
    # This method never raises exception.
    #
    #     response = http.post('/cgi-bin/search.rb', 'query=foo')
    #
    #     # using block
    #     File.open('result.txt', 'w') {|f|
    #       http.post('/cgi-bin/search.rb', 'query=foo') do |str|
    #         f.write str
    #       end
    #     }
    #
    # You should set Content-Type: header field for POST.
    # If no Content-Type: field given, this method uses
    # "application/x-www-form-urlencoded" by default.
    #
    def post(path, data, initheader = nil, dest = nil, &block) # :yield: +body_segment+
      send_entity(path, data, initheader, dest, Post, &block)
    end

    # Sends a PATCH request to the +path+ and gets a response,
    # as an HTTPResponse object.
    def patch(path, data, initheader = nil, dest = nil, &block) # :yield: +body_segment+
      send_entity(path, data, initheader, dest, Patch, &block)
    end

    def put(path, data, initheader = nil)   #:nodoc:
      request(Put.new(path, initheader), data)
    end

    # Sends a PROPPATCH request to the +path+ and gets a response,
    # as an HTTPResponse object.
    def proppatch(path, body, initheader = nil)
      request(Proppatch.new(path, initheader), body)
    end

    # Sends a LOCK request to the +path+ and gets a response,
    # as an HTTPResponse object.
    def lock(path, body, initheader = nil)
      request(Lock.new(path, initheader), body)
    end

    # Sends a UNLOCK request to the +path+ and gets a response,
    # as an HTTPResponse object.
    def unlock(path, body, initheader = nil)
      request(Unlock.new(path, initheader), body)
    end

    # Sends a OPTIONS request to the +path+ and gets a response,
    # as an HTTPResponse object.
    def options(path, initheader = nil)
      request(Options.new(path, initheader))
    end

    # Sends a PROPFIND request to the +path+ and gets a response,
    # as an HTTPResponse object.
    def propfind(path, body = nil, initheader = {'Depth' => '0'})
      request(Propfind.new(path, initheader), body)
    end

    # Sends a DELETE request to the +path+ and gets a response,
    # as an HTTPResponse object.
    def delete(path, initheader = {'Depth' => 'Infinity'})
      request(Delete.new(path, initheader))
    end

    # Sends a MOVE request to the +path+ and gets a response,
    # as an HTTPResponse object.
    def move(path, initheader = nil)
      request(Move.new(path, initheader))
    end

    # Sends a COPY request to the +path+ and gets a response,
    # as an HTTPResponse object.
    def copy(path, initheader = nil)
      request(Copy.new(path, initheader))
    end

    # Sends a MKCOL request to the +path+ and gets a response,
    # as an HTTPResponse object.
    def mkcol(path, body = nil, initheader = nil)
      request(Mkcol.new(path, initheader), body)
    end

    # Sends a TRACE request to the +path+ and gets a response,
    # as an HTTPResponse object.
    def trace(path, initheader = nil)
      request(Trace.new(path, initheader))
    end

    # Sends a GET request to the +path+.
    # Returns the response as a Net::HTTPResponse object.
    #
    # When called with a block, passes an HTTPResponse object to the block.
    # The body of the response will not have been read yet;
    # the block can process it using HTTPResponse#read_body,
    # if desired.
    #
    # Returns the response.
    #
    # This method never raises Net::* exceptions.
    #
    #     response = http.request_get('/index.html')
    #     # The entity body is already read in this case.
    #     p response['content-type']
    #     puts response.body
    #
    #     # Using a block
    #     http.request_get('/index.html') {|response|
    #       p response['content-type']
    #       response.read_body do |str|   # read body now
    #         print str
    #       end
    #     }
    #
    def request_get(path, initheader = nil, &block) # :yield: +response+
      request(Get.new(path, initheader), &block)
    end

    # Sends a HEAD request to the +path+ and returns the response
    # as a Net::HTTPResponse object.
    #
    # Returns the response.
    #
    # This method never raises Net::* exceptions.
    #
    #     response = http.request_head('/index.html')
    #     p response['content-type']
    #
    def request_head(path, initheader = nil, &block)
      request(Head.new(path, initheader), &block)
    end

    # Sends a POST request to the +path+.
    #
    # Returns the response as a Net::HTTPResponse object.
    #
    # When called with a block, the block is passed an HTTPResponse
    # object.  The body of that response will not have been read yet;
    # the block can process it using HTTPResponse#read_body, if desired.
    #
    # Returns the response.
    #
    # This method never raises Net::* exceptions.
    #
    #     # example
    #     response = http.request_post('/cgi-bin/nice.rb', 'datadatadata...')
    #     p response.status
    #     puts response.body          # body is already read in this case
    #
    #     # using block
    #     http.request_post('/cgi-bin/nice.rb', 'datadatadata...') {|response|
    #       p response.status
    #       p response['content-type']
    #       response.read_body do |str|   # read body now
    #         print str
    #       end
    #     }
    #
    def request_post(path, data, initheader = nil, &block) # :yield: +response+
      request Post.new(path, initheader), data, &block
    end

    def request_put(path, data, initheader = nil, &block)   #:nodoc:
      request Put.new(path, initheader), data, &block
    end

    alias get2   request_get    #:nodoc: obsolete
    alias head2  request_head   #:nodoc: obsolete
    alias post2  request_post   #:nodoc: obsolete
    alias put2   request_put    #:nodoc: obsolete


    # Sends an HTTP request to the HTTP server.
    # Also sends a DATA string if +data+ is given.
    #
    # Returns a Net::HTTPResponse object.
    #
    # This method never raises Net::* exceptions.
    #
    #    response = http.send_request('GET', '/index.html')
    #    puts response.body
    #
    def send_request(name, path, data = nil, header = nil)
      has_response_body = name != 'HEAD'
      r = HTTPGenericRequest.new(name,(data ? true : false),has_response_body,path,header)
      request r, data
    end

    # Sends an HTTPRequest object +req+ to the HTTP server.
    #
    # If +req+ is a Net::HTTP::Post or Net::HTTP::Put request containing
    # data, the data is also sent. Providing data for a Net::HTTP::Head or
    # Net::HTTP::Get request results in an ArgumentError.
    #
    # Returns an HTTPResponse object.
    #
    # When called with a block, passes an HTTPResponse object to the block.
    # The body of the response will not have been read yet;
    # the block can process it using HTTPResponse#read_body,
    # if desired.
    #
    # This method never raises Net::* exceptions.
    #
    def request(req, body = nil, &block)  # :yield: +response+
      unless started?
        start {
          req['connection'] ||= 'close'
          return request(req, body, &block)
        }
      end
      if proxy_user()
        req.proxy_basic_auth proxy_user(), proxy_pass() unless use_ssl?
      end
      req.set_body_internal body
      res = transport_request(req, &block)
      if sspi_auth?(res)
        sspi_auth(req)
        res = transport_request(req, &block)
      end
      res
    end

    private

    # Executes a request which uses a representation
    # and returns its body.
    def send_entity(path, data, initheader, dest, type, &block)
      res = nil
      request(type.new(path, initheader), data) {|r|
        r.read_body dest, &block
        res = r
      }
      res
    end

    IDEMPOTENT_METHODS_ = %w/GET HEAD PUT DELETE OPTIONS TRACE/ # :nodoc:

    def transport_request(req)
      count = 0
      begin
        begin_transport req
        res = catch(:response) {
          begin
            req.exec @socket, @curr_http_version, edit_path(req.path)
          rescue Errno::EPIPE
            # Failure when writing full request, but we can probably
            # still read the received response.
          end

          begin
            res = HTTPResponse.read_new(@socket)
            res.decode_content = req.decode_content
            res.body_encoding = @response_body_encoding
            res.ignore_eof = @ignore_eof
          end while res.kind_of?(HTTPInformation)

          res.uri = req.uri

          res
        }
        res.reading_body(@socket, req.response_body_permitted?) {
          yield res if block_given?
        }
      rescue Net::OpenTimeout
        raise
      rescue Net::ReadTimeout, IOError, EOFError,
             Errno::ECONNRESET, Errno::ECONNABORTED, Errno::EPIPE, Errno::ETIMEDOUT,
             # avoid a dependency on OpenSSL
             defined?(OpenSSL::SSL) ? OpenSSL::SSL::SSLError : IOError,
             Timeout::Error => exception
        if count < max_retries && IDEMPOTENT_METHODS_.include?(req.method)
          count += 1
          @socket.close if @socket
          debug "Conn close because of error #{exception}, and retry"
          retry
        end
        debug "Conn close because of error #{exception}"
        @socket.close if @socket
        raise
      end

      end_transport req, res
      res
    rescue => exception
      debug "Conn close because of error #{exception}"
      @socket.close if @socket
      raise exception
    end

    def begin_transport(req)
      if @socket.closed?
        connect
      elsif @last_communicated
        if @last_communicated + @keep_alive_timeout < Process.clock_gettime(Process::CLOCK_MONOTONIC)
          debug 'Conn close because of keep_alive_timeout'
          @socket.close
          connect
        elsif @socket.io.to_io.wait_readable(0) && @socket.eof?
          debug "Conn close because of EOF"
          @socket.close
          connect
        end
      end

      if not req.response_body_permitted? and @close_on_empty_response
        req['connection'] ||= 'close'
      end

      req.update_uri address, port, use_ssl?
      req['host'] ||= addr_port()
    end

    def end_transport(req, res)
      @curr_http_version = res.http_version
      @last_communicated = nil
      if @socket.closed?
        debug 'Conn socket closed'
      elsif not res.body and @close_on_empty_response
        debug 'Conn close'
        @socket.close
      elsif keep_alive?(req, res)
        debug 'Conn keep-alive'
        @last_communicated = Process.clock_gettime(Process::CLOCK_MONOTONIC)
      else
        debug 'Conn close'
        @socket.close
      end
    end

    def keep_alive?(req, res)
      return false if req.connection_close?
      if @curr_http_version <= '1.0'
        res.connection_keep_alive?
      else   # HTTP/1.1 or later
        not res.connection_close?
      end
    end

    def sspi_auth?(res)
      return false unless @sspi_enabled
      if res.kind_of?(HTTPProxyAuthenticationRequired) and
          proxy? and res["Proxy-Authenticate"].include?("Negotiate")
        begin
          require 'win32/sspi'
          true
        rescue LoadError
          false
        end
      else
        false
      end
    end

    def sspi_auth(req)
      n = Win32::SSPI::NegotiateAuth.new
      req["Proxy-Authorization"] = "Negotiate #{n.get_initial_token}"
      # Some versions of ISA will close the connection if this isn't present.
      req["Connection"] = "Keep-Alive"
      req["Proxy-Connection"] = "Keep-Alive"
      res = transport_request(req)
      authphrase = res["Proxy-Authenticate"]  or return res
      req["Proxy-Authorization"] = "Negotiate #{n.complete_authentication(authphrase)}"
    rescue => err
      raise HTTPAuthenticationError.new('HTTP authentication failed', err)
    end

    #
    # utils
    #

    private

    def addr_port
      addr = address
      addr = "[#{addr}]" if addr.include?(":")
      default_port = use_ssl? ? HTTP.https_default_port : HTTP.http_default_port
      default_port == port ? addr : "#{addr}:#{port}"
    end

    # Adds a message to debugging output
    def debug(msg)
      return unless @debug_output
      @debug_output << msg
      @debug_output << "\n"
    end

    alias_method :D, :debug
  end

end

require_relative 'http/exceptions'

require_relative 'http/header'

require_relative 'http/generic_request'
require_relative 'http/request'
require_relative 'http/requests'

require_relative 'http/response'
require_relative 'http/responses'

require_relative 'http/proxy_delta'

require_relative 'http/backward'
PK}$[w����ruby/net/http/request.rbnu�[���# frozen_string_literal: false
# HTTP request class.
# This class wraps together the request header and the request path.
# You cannot use this class directly. Instead, you should use one of its
# subclasses: Net::HTTP::Get, Net::HTTP::Post, Net::HTTP::Head.
#
class Net::HTTPRequest < Net::HTTPGenericRequest
  # Creates an HTTP request object for +path+.
  #
  # +initheader+ are the default headers to use.  Net::HTTP adds
  # Accept-Encoding to enable compression of the response body unless
  # Accept-Encoding or Range are supplied in +initheader+.

  def initialize(path, initheader = nil)
    super self.class::METHOD,
          self.class::REQUEST_HAS_BODY,
          self.class::RESPONSE_HAS_BODY,
          path, initheader
  end
end

PK}$[�L�66ruby/net/http/backward.rbnu�[���# frozen_string_literal: false
# for backward compatibility

# :enddoc:

class Net::HTTP
  ProxyMod = ProxyDelta
  deprecate_constant :ProxyMod
end

module Net::NetPrivate
  HTTPRequest = ::Net::HTTPRequest
  deprecate_constant :HTTPRequest
end

module Net
  HTTPSession = HTTP

  HTTPInformationCode  = HTTPInformation
  HTTPSuccessCode      = HTTPSuccess
  HTTPRedirectionCode  = HTTPRedirection
  HTTPRetriableCode    = HTTPRedirection
  HTTPClientErrorCode  = HTTPClientError
  HTTPFatalErrorCode   = HTTPClientError
  HTTPServerErrorCode  = HTTPServerError
  HTTPResponseReceiver = HTTPResponse

  HTTPResponceReceiver = HTTPResponse # Typo since 2001

  deprecate_constant :HTTPSession,
                     :HTTPInformationCode,
                     :HTTPSuccessCode,
                     :HTTPRedirectionCode,
                     :HTTPRetriableCode,
                     :HTTPClientErrorCode,
                     :HTTPFatalErrorCode,
                     :HTTPServerErrorCode,
                     :HTTPResponseReceiver,
                     :HTTPResponceReceiver
end
PK}$[���ruby/net/http/proxy_delta.rbnu�[���# frozen_string_literal: false
module Net::HTTP::ProxyDelta   #:nodoc: internal use only
  private

  def conn_address
    proxy_address()
  end

  def conn_port
    proxy_port()
  end

  def edit_path(path)
    use_ssl? ? path : "http://#{addr_port()}#{path}"
  end
end

PK}$[��/_�%�% ruby/net/http/generic_request.rbnu�[���# frozen_string_literal: false
# HTTPGenericRequest is the parent of the Net::HTTPRequest class.
# Do not use this directly; use a subclass of Net::HTTPRequest.
#
# Mixes in the Net::HTTPHeader module to provide easier access to HTTP headers.
#
class Net::HTTPGenericRequest

  include Net::HTTPHeader

  def initialize(m, reqbody, resbody, uri_or_path, initheader = nil)
    @method = m
    @request_has_body = reqbody
    @response_has_body = resbody

    if URI === uri_or_path then
      raise ArgumentError, "not an HTTP URI" unless URI::HTTP === uri_or_path
      hostname = uri_or_path.hostname
      raise ArgumentError, "no host component for URI" unless (hostname && hostname.length > 0)
      @uri = uri_or_path.dup
      host = @uri.hostname.dup
      host << ":".freeze << @uri.port.to_s if @uri.port != @uri.default_port
      @path = uri_or_path.request_uri
      raise ArgumentError, "no HTTP request path given" unless @path
    else
      @uri = nil
      host = nil
      raise ArgumentError, "no HTTP request path given" unless uri_or_path
      raise ArgumentError, "HTTP request path is empty" if uri_or_path.empty?
      @path = uri_or_path.dup
    end

    @decode_content = false

    if Net::HTTP::HAVE_ZLIB then
      if !initheader ||
         !initheader.keys.any? { |k|
           %w[accept-encoding range].include? k.downcase
         } then
        @decode_content = true if @response_has_body
        initheader = initheader ? initheader.dup : {}
        initheader["accept-encoding"] =
          "gzip;q=1.0,deflate;q=0.6,identity;q=0.3"
      end
    end

    initialize_http_header initheader
    self['Accept'] ||= '*/*'
    self['User-Agent'] ||= 'Ruby'
    self['Host'] ||= host if host
    @body = nil
    @body_stream = nil
    @body_data = nil
  end

  attr_reader :method
  attr_reader :path
  attr_reader :uri

  # Automatically set to false if the user sets the Accept-Encoding header.
  # This indicates they wish to handle Content-encoding in responses
  # themselves.
  attr_reader :decode_content

  def inspect
    "\#<#{self.class} #{@method}>"
  end

  ##
  # Don't automatically decode response content-encoding if the user indicates
  # they want to handle it.

  def []=(key, val) # :nodoc:
    @decode_content = false if key.downcase == 'accept-encoding'

    super key, val
  end

  def request_body_permitted?
    @request_has_body
  end

  def response_body_permitted?
    @response_has_body
  end

  def body_exist?
    warn "Net::HTTPRequest#body_exist? is obsolete; use response_body_permitted?", uplevel: 1 if $VERBOSE
    response_body_permitted?
  end

  attr_reader :body

  def body=(str)
    @body = str
    @body_stream = nil
    @body_data = nil
    str
  end

  attr_reader :body_stream

  def body_stream=(input)
    @body = nil
    @body_stream = input
    @body_data = nil
    input
  end

  def set_body_internal(str)   #:nodoc: internal use only
    raise ArgumentError, "both of body argument and HTTPRequest#body set" if str and (@body or @body_stream)
    self.body = str if str
    if @body.nil? && @body_stream.nil? && @body_data.nil? && request_body_permitted?
      self.body = ''
    end
  end

  #
  # write
  #

  def exec(sock, ver, path)   #:nodoc: internal use only
    if @body
      send_request_with_body sock, ver, path, @body
    elsif @body_stream
      send_request_with_body_stream sock, ver, path, @body_stream
    elsif @body_data
      send_request_with_body_data sock, ver, path, @body_data
    else
      write_header sock, ver, path
    end
  end

  def update_uri(addr, port, ssl) # :nodoc: internal use only
    # reflect the connection and @path to @uri
    return unless @uri

    if ssl
      scheme = 'https'.freeze
      klass = URI::HTTPS
    else
      scheme = 'http'.freeze
      klass = URI::HTTP
    end

    if host = self['host']
      host.sub!(/:.*/m, ''.freeze)
    elsif host = @uri.host
    else
     host = addr
    end
    # convert the class of the URI
    if @uri.is_a?(klass)
      @uri.host = host
      @uri.port = port
    else
      @uri = klass.new(
        scheme, @uri.userinfo,
        host, port, nil,
        @uri.path, nil, @uri.query, nil)
    end
  end

  private

  class Chunker #:nodoc:
    def initialize(sock)
      @sock = sock
      @prev = nil
    end

    def write(buf)
      # avoid memcpy() of buf, buf can huge and eat memory bandwidth
      rv = buf.bytesize
      @sock.write("#{rv.to_s(16)}\r\n", buf, "\r\n")
      rv
    end

    def finish
      @sock.write("0\r\n\r\n")
    end
  end

  def send_request_with_body(sock, ver, path, body)
    self.content_length = body.bytesize
    delete 'Transfer-Encoding'
    supply_default_content_type
    write_header sock, ver, path
    wait_for_continue sock, ver if sock.continue_timeout
    sock.write body
  end

  def send_request_with_body_stream(sock, ver, path, f)
    unless content_length() or chunked?
      raise ArgumentError,
          "Content-Length not given and Transfer-Encoding is not `chunked'"
    end
    supply_default_content_type
    write_header sock, ver, path
    wait_for_continue sock, ver if sock.continue_timeout
    if chunked?
      chunker = Chunker.new(sock)
      IO.copy_stream(f, chunker)
      chunker.finish
    else
      IO.copy_stream(f, sock)
    end
  end

  def send_request_with_body_data(sock, ver, path, params)
    if /\Amultipart\/form-data\z/i !~ self.content_type
      self.content_type = 'application/x-www-form-urlencoded'
      return send_request_with_body(sock, ver, path, URI.encode_www_form(params))
    end

    opt = @form_option.dup
    require 'securerandom' unless defined?(SecureRandom)
    opt[:boundary] ||= SecureRandom.urlsafe_base64(40)
    self.set_content_type(self.content_type, boundary: opt[:boundary])
    if chunked?
      write_header sock, ver, path
      encode_multipart_form_data(sock, params, opt)
    else
      require 'tempfile'
      file = Tempfile.new('multipart')
      file.binmode
      encode_multipart_form_data(file, params, opt)
      file.rewind
      self.content_length = file.size
      write_header sock, ver, path
      IO.copy_stream(file, sock)
      file.close(true)
    end
  end

  def encode_multipart_form_data(out, params, opt)
    charset = opt[:charset]
    boundary = opt[:boundary]
    require 'securerandom' unless defined?(SecureRandom)
    boundary ||= SecureRandom.urlsafe_base64(40)
    chunked_p = chunked?

    buf = ''
    params.each do |key, value, h={}|
      key = quote_string(key, charset)
      filename =
        h.key?(:filename) ? h[:filename] :
        value.respond_to?(:to_path) ? File.basename(value.to_path) :
        nil

      buf << "--#{boundary}\r\n"
      if filename
        filename = quote_string(filename, charset)
        type = h[:content_type] || 'application/octet-stream'
        buf << "Content-Disposition: form-data; " \
          "name=\"#{key}\"; filename=\"#{filename}\"\r\n" \
          "Content-Type: #{type}\r\n\r\n"
        if !out.respond_to?(:write) || !value.respond_to?(:read)
          # if +out+ is not an IO or +value+ is not an IO
          buf << (value.respond_to?(:read) ? value.read : value)
        elsif value.respond_to?(:size) && chunked_p
          # if +out+ is an IO and +value+ is a File, use IO.copy_stream
          flush_buffer(out, buf, chunked_p)
          out << "%x\r\n" % value.size if chunked_p
          IO.copy_stream(value, out)
          out << "\r\n" if chunked_p
        else
          # +out+ is an IO, and +value+ is not a File but an IO
          flush_buffer(out, buf, chunked_p)
          1 while flush_buffer(out, value.read(4096), chunked_p)
        end
      else
        # non-file field:
        #   HTML5 says, "The parts of the generated multipart/form-data
        #   resource that correspond to non-file fields must not have a
        #   Content-Type header specified."
        buf << "Content-Disposition: form-data; name=\"#{key}\"\r\n\r\n"
        buf << (value.respond_to?(:read) ? value.read : value)
      end
      buf << "\r\n"
    end
    buf << "--#{boundary}--\r\n"
    flush_buffer(out, buf, chunked_p)
    out << "0\r\n\r\n" if chunked_p
  end

  def quote_string(str, charset)
    str = str.encode(charset, fallback:->(c){'&#%d;'%c.encode("UTF-8").ord}) if charset
    str.gsub(/[\\"]/, '\\\\\&')
  end

  def flush_buffer(out, buf, chunked_p)
    return unless buf
    out << "%x\r\n"%buf.bytesize if chunked_p
    out << buf
    out << "\r\n" if chunked_p
    buf.clear
  end

  def supply_default_content_type
    return if content_type()
    warn 'net/http: Content-Type did not set; using application/x-www-form-urlencoded', uplevel: 1 if $VERBOSE
    set_content_type 'application/x-www-form-urlencoded'
  end

  ##
  # Waits up to the continue timeout for a response from the server provided
  # we're speaking HTTP 1.1 and are expecting a 100-continue response.

  def wait_for_continue(sock, ver)
    if ver >= '1.1' and @header['expect'] and
        @header['expect'].include?('100-continue')
      if sock.io.to_io.wait_readable(sock.continue_timeout)
        res = Net::HTTPResponse.read_new(sock)
        unless res.kind_of?(Net::HTTPContinue)
          res.decode_content = @decode_content
          throw :response, res
        end
      end
    end
  end

  def write_header(sock, ver, path)
    reqline = "#{@method} #{path} HTTP/#{ver}"
    if /[\r\n]/ =~ reqline
      raise ArgumentError, "A Request-Line must not contain CR or LF"
    end
    buf = ""
    buf << reqline << "\r\n"
    each_capitalized do |k,v|
      buf << "#{k}: #{v}\r\n"
    end
    buf << "\r\n"
    sock.write buf
  end

end

PK}$[�6�Q��ruby/net/http/requests.rbnu�[���# frozen_string_literal: false
#
# HTTP/1.1 methods --- RFC2616
#

# See Net::HTTPGenericRequest for attributes and methods.
# See Net::HTTP for usage examples.
class Net::HTTP::Get < Net::HTTPRequest
  METHOD = 'GET'
  REQUEST_HAS_BODY  = false
  RESPONSE_HAS_BODY = true
end

# See Net::HTTPGenericRequest for attributes and methods.
# See Net::HTTP for usage examples.
class Net::HTTP::Head < Net::HTTPRequest
  METHOD = 'HEAD'
  REQUEST_HAS_BODY = false
  RESPONSE_HAS_BODY = false
end

# See Net::HTTPGenericRequest for attributes and methods.
# See Net::HTTP for usage examples.
class Net::HTTP::Post < Net::HTTPRequest
  METHOD = 'POST'
  REQUEST_HAS_BODY = true
  RESPONSE_HAS_BODY = true
end

# See Net::HTTPGenericRequest for attributes and methods.
# See Net::HTTP for usage examples.
class Net::HTTP::Put < Net::HTTPRequest
  METHOD = 'PUT'
  REQUEST_HAS_BODY = true
  RESPONSE_HAS_BODY = true
end

# See Net::HTTPGenericRequest for attributes and methods.
# See Net::HTTP for usage examples.
class Net::HTTP::Delete < Net::HTTPRequest
  METHOD = 'DELETE'
  REQUEST_HAS_BODY = false
  RESPONSE_HAS_BODY = true
end

# See Net::HTTPGenericRequest for attributes and methods.
class Net::HTTP::Options < Net::HTTPRequest
  METHOD = 'OPTIONS'
  REQUEST_HAS_BODY = false
  RESPONSE_HAS_BODY = true
end

# See Net::HTTPGenericRequest for attributes and methods.
class Net::HTTP::Trace < Net::HTTPRequest
  METHOD = 'TRACE'
  REQUEST_HAS_BODY = false
  RESPONSE_HAS_BODY = true
end

#
# PATCH method --- RFC5789
#

# See Net::HTTPGenericRequest for attributes and methods.
class Net::HTTP::Patch < Net::HTTPRequest
  METHOD = 'PATCH'
  REQUEST_HAS_BODY = true
  RESPONSE_HAS_BODY = true
end

#
# WebDAV methods --- RFC2518
#

# See Net::HTTPGenericRequest for attributes and methods.
class Net::HTTP::Propfind < Net::HTTPRequest
  METHOD = 'PROPFIND'
  REQUEST_HAS_BODY = true
  RESPONSE_HAS_BODY = true
end

# See Net::HTTPGenericRequest for attributes and methods.
class Net::HTTP::Proppatch < Net::HTTPRequest
  METHOD = 'PROPPATCH'
  REQUEST_HAS_BODY = true
  RESPONSE_HAS_BODY = true
end

# See Net::HTTPGenericRequest for attributes and methods.
class Net::HTTP::Mkcol < Net::HTTPRequest
  METHOD = 'MKCOL'
  REQUEST_HAS_BODY = true
  RESPONSE_HAS_BODY = true
end

# See Net::HTTPGenericRequest for attributes and methods.
class Net::HTTP::Copy < Net::HTTPRequest
  METHOD = 'COPY'
  REQUEST_HAS_BODY = false
  RESPONSE_HAS_BODY = true
end

# See Net::HTTPGenericRequest for attributes and methods.
class Net::HTTP::Move < Net::HTTPRequest
  METHOD = 'MOVE'
  REQUEST_HAS_BODY = false
  RESPONSE_HAS_BODY = true
end

# See Net::HTTPGenericRequest for attributes and methods.
class Net::HTTP::Lock < Net::HTTPRequest
  METHOD = 'LOCK'
  REQUEST_HAS_BODY = true
  RESPONSE_HAS_BODY = true
end

# See Net::HTTPGenericRequest for attributes and methods.
class Net::HTTP::Unlock < Net::HTTPRequest
  METHOD = 'UNLOCK'
  REQUEST_HAS_BODY = true
  RESPONSE_HAS_BODY = true
end

PK}$[{���ruby/net/http/status.rbnu�[���# frozen_string_literal: true

require_relative '../http'

if $0 == __FILE__
  require 'open-uri'
  IO.foreach(__FILE__) do |line|
    puts line
    break if line.start_with?('end')
  end
  puts
  puts "Net::HTTP::STATUS_CODES = {"
  url = "https://www.iana.org/assignments/http-status-codes/http-status-codes-1.csv"
  URI(url).read.each_line do |line|
    code, mes, = line.split(',')
    next if ['(Unused)', 'Unassigned', 'Description'].include?(mes)
    puts "  #{code} => '#{mes}',"
  end
  puts "}"
end

Net::HTTP::STATUS_CODES = {
  100 => 'Continue',
  101 => 'Switching Protocols',
  102 => 'Processing',
  103 => 'Early Hints',
  200 => 'OK',
  201 => 'Created',
  202 => 'Accepted',
  203 => 'Non-Authoritative Information',
  204 => 'No Content',
  205 => 'Reset Content',
  206 => 'Partial Content',
  207 => 'Multi-Status',
  208 => 'Already Reported',
  226 => 'IM Used',
  300 => 'Multiple Choices',
  301 => 'Moved Permanently',
  302 => 'Found',
  303 => 'See Other',
  304 => 'Not Modified',
  305 => 'Use Proxy',
  307 => 'Temporary Redirect',
  308 => 'Permanent Redirect',
  400 => 'Bad Request',
  401 => 'Unauthorized',
  402 => 'Payment Required',
  403 => 'Forbidden',
  404 => 'Not Found',
  405 => 'Method Not Allowed',
  406 => 'Not Acceptable',
  407 => 'Proxy Authentication Required',
  408 => 'Request Timeout',
  409 => 'Conflict',
  410 => 'Gone',
  411 => 'Length Required',
  412 => 'Precondition Failed',
  413 => 'Payload Too Large',
  414 => 'URI Too Long',
  415 => 'Unsupported Media Type',
  416 => 'Range Not Satisfiable',
  417 => 'Expectation Failed',
  421 => 'Misdirected Request',
  422 => 'Unprocessable Entity',
  423 => 'Locked',
  424 => 'Failed Dependency',
  426 => 'Upgrade Required',
  428 => 'Precondition Required',
  429 => 'Too Many Requests',
  431 => 'Request Header Fields Too Large',
  451 => 'Unavailable For Legal Reasons',
  500 => 'Internal Server Error',
  501 => 'Not Implemented',
  502 => 'Bad Gateway',
  503 => 'Service Unavailable',
  504 => 'Gateway Timeout',
  505 => 'HTTP Version Not Supported',
  506 => 'Variant Also Negotiates',
  507 => 'Insufficient Storage',
  508 => 'Loop Detected',
  510 => 'Not Extended',
  511 => 'Network Authentication Required',
}
PK}$[����FFruby/net/http/exceptions.rbnu�[���# frozen_string_literal: false
module Net
  # Net::HTTP exception class.
  # You cannot use Net::HTTPExceptions directly; instead, you must use
  # its subclasses.
  module HTTPExceptions
    def initialize(msg, res)   #:nodoc:
      super msg
      @response = res
    end
    attr_reader :response
    alias data response    #:nodoc: obsolete
  end

  class HTTPError < ProtocolError
    include HTTPExceptions
  end

  class HTTPRetriableError < ProtoRetriableError
    include HTTPExceptions
  end

  class HTTPClientException < ProtoServerError
    include HTTPExceptions
  end

  class HTTPFatalError < ProtoFatalError
    include HTTPExceptions
  end

  # We cannot use the name "HTTPServerError", it is the name of the response.
  HTTPServerException = HTTPClientException # :nodoc:
  deprecate_constant(:HTTPServerException)
end
PK}$[�)��B�Bruby/net/http/header.rbnu�[���# frozen_string_literal: false
# The HTTPHeader module defines methods for reading and writing
# HTTP headers.
#
# It is used as a mixin by other classes, to provide hash-like
# access to HTTP header values. Unlike raw hash access, HTTPHeader
# provides access via case-insensitive keys. It also provides
# methods for accessing commonly-used HTTP header values in more
# convenient formats.
#
module Net::HTTPHeader

  def initialize_http_header(initheader)
    @header = {}
    return unless initheader
    initheader.each do |key, value|
      warn "net/http: duplicated HTTP header: #{key}", uplevel: 3 if key?(key) and $VERBOSE
      if value.nil?
        warn "net/http: nil HTTP header: #{key}", uplevel: 3 if $VERBOSE
      else
        value = value.strip # raise error for invalid byte sequences
        if value.count("\r\n") > 0
          raise ArgumentError, "header #{key} has field value #{value.inspect}, this cannot include CR/LF"
        end
        @header[key.downcase.to_s] = [value]
      end
    end
  end

  def size   #:nodoc: obsolete
    @header.size
  end

  alias length size   #:nodoc: obsolete

  # Returns the header field corresponding to the case-insensitive key.
  # For example, a key of "Content-Type" might return "text/html"
  def [](key)
    a = @header[key.downcase.to_s] or return nil
    a.join(', ')
  end

  # Sets the header field corresponding to the case-insensitive key.
  def []=(key, val)
    unless val
      @header.delete key.downcase.to_s
      return val
    end
    set_field(key, val)
  end

  # [Ruby 1.8.3]
  # Adds a value to a named header field, instead of replacing its value.
  # Second argument +val+ must be a String.
  # See also #[]=, #[] and #get_fields.
  #
  #   request.add_field 'X-My-Header', 'a'
  #   p request['X-My-Header']              #=> "a"
  #   p request.get_fields('X-My-Header')   #=> ["a"]
  #   request.add_field 'X-My-Header', 'b'
  #   p request['X-My-Header']              #=> "a, b"
  #   p request.get_fields('X-My-Header')   #=> ["a", "b"]
  #   request.add_field 'X-My-Header', 'c'
  #   p request['X-My-Header']              #=> "a, b, c"
  #   p request.get_fields('X-My-Header')   #=> ["a", "b", "c"]
  #
  def add_field(key, val)
    stringified_downcased_key = key.downcase.to_s
    if @header.key?(stringified_downcased_key)
      append_field_value(@header[stringified_downcased_key], val)
    else
      set_field(key, val)
    end
  end

  private def set_field(key, val)
    case val
    when Enumerable
      ary = []
      append_field_value(ary, val)
      @header[key.downcase.to_s] = ary
    else
      val = val.to_s # for compatibility use to_s instead of to_str
      if val.b.count("\r\n") > 0
        raise ArgumentError, 'header field value cannot include CR/LF'
      end
      @header[key.downcase.to_s] = [val]
    end
  end

  private def append_field_value(ary, val)
    case val
    when Enumerable
      val.each{|x| append_field_value(ary, x)}
    else
      val = val.to_s
      if /[\r\n]/n.match?(val.b)
        raise ArgumentError, 'header field value cannot include CR/LF'
      end
      ary.push val
    end
  end

  # [Ruby 1.8.3]
  # Returns an array of header field strings corresponding to the
  # case-insensitive +key+.  This method allows you to get duplicated
  # header fields without any processing.  See also #[].
  #
  #   p response.get_fields('Set-Cookie')
  #     #=> ["session=al98axx; expires=Fri, 31-Dec-1999 23:58:23",
  #          "query=rubyscript; expires=Fri, 31-Dec-1999 23:58:23"]
  #   p response['Set-Cookie']
  #     #=> "session=al98axx; expires=Fri, 31-Dec-1999 23:58:23, query=rubyscript; expires=Fri, 31-Dec-1999 23:58:23"
  #
  def get_fields(key)
    stringified_downcased_key = key.downcase.to_s
    return nil unless @header[stringified_downcased_key]
    @header[stringified_downcased_key].dup
  end

  # Returns the header field corresponding to the case-insensitive key.
  # Returns the default value +args+, or the result of the block, or
  # raises an IndexError if there's no header field named +key+
  # See Hash#fetch
  def fetch(key, *args, &block)   #:yield: +key+
    a = @header.fetch(key.downcase.to_s, *args, &block)
    a.kind_of?(Array) ? a.join(', ') : a
  end

  # Iterates through the header names and values, passing in the name
  # and value to the code block supplied.
  #
  # Returns an enumerator if no block is given.
  #
  # Example:
  #
  #     response.header.each_header {|key,value| puts "#{key} = #{value}" }
  #
  def each_header   #:yield: +key+, +value+
    block_given? or return enum_for(__method__) { @header.size }
    @header.each do |k,va|
      yield k, va.join(', ')
    end
  end

  alias each each_header

  # Iterates through the header names in the header, passing
  # each header name to the code block.
  #
  # Returns an enumerator if no block is given.
  def each_name(&block)   #:yield: +key+
    block_given? or return enum_for(__method__) { @header.size }
    @header.each_key(&block)
  end

  alias each_key each_name

  # Iterates through the header names in the header, passing
  # capitalized header names to the code block.
  #
  # Note that header names are capitalized systematically;
  # capitalization may not match that used by the remote HTTP
  # server in its response.
  #
  # Returns an enumerator if no block is given.
  def each_capitalized_name  #:yield: +key+
    block_given? or return enum_for(__method__) { @header.size }
    @header.each_key do |k|
      yield capitalize(k)
    end
  end

  # Iterates through header values, passing each value to the
  # code block.
  #
  # Returns an enumerator if no block is given.
  def each_value   #:yield: +value+
    block_given? or return enum_for(__method__) { @header.size }
    @header.each_value do |va|
      yield va.join(', ')
    end
  end

  # Removes a header field, specified by case-insensitive key.
  def delete(key)
    @header.delete(key.downcase.to_s)
  end

  # true if +key+ header exists.
  def key?(key)
    @header.key?(key.downcase.to_s)
  end

  # Returns a Hash consisting of header names and array of values.
  # e.g.
  # {"cache-control" => ["private"],
  #  "content-type" => ["text/html"],
  #  "date" => ["Wed, 22 Jun 2005 22:11:50 GMT"]}
  def to_hash
    @header.dup
  end

  # As for #each_header, except the keys are provided in capitalized form.
  #
  # Note that header names are capitalized systematically;
  # capitalization may not match that used by the remote HTTP
  # server in its response.
  #
  # Returns an enumerator if no block is given.
  def each_capitalized
    block_given? or return enum_for(__method__) { @header.size }
    @header.each do |k,v|
      yield capitalize(k), v.join(', ')
    end
  end

  alias canonical_each each_capitalized

  def capitalize(name)
    name.to_s.split(/-/).map {|s| s.capitalize }.join('-')
  end
  private :capitalize

  # Returns an Array of Range objects which represent the Range:
  # HTTP header field, or +nil+ if there is no such header.
  def range
    return nil unless @header['range']

    value = self['Range']
    # byte-range-set = *( "," OWS ) ( byte-range-spec / suffix-byte-range-spec )
    #   *( OWS "," [ OWS ( byte-range-spec / suffix-byte-range-spec ) ] )
    # corrected collected ABNF
    # http://tools.ietf.org/html/draft-ietf-httpbis-p5-range-19#section-5.4.1
    # http://tools.ietf.org/html/draft-ietf-httpbis-p5-range-19#appendix-C
    # http://tools.ietf.org/html/draft-ietf-httpbis-p1-messaging-19#section-3.2.5
    unless /\Abytes=((?:,[ \t]*)*(?:\d+-\d*|-\d+)(?:[ \t]*,(?:[ \t]*\d+-\d*|-\d+)?)*)\z/ =~ value
      raise Net::HTTPHeaderSyntaxError, "invalid syntax for byte-ranges-specifier: '#{value}'"
    end

    byte_range_set = $1
    result = byte_range_set.split(/,/).map {|spec|
      m = /(\d+)?\s*-\s*(\d+)?/i.match(spec) or
              raise Net::HTTPHeaderSyntaxError, "invalid byte-range-spec: '#{spec}'"
      d1 = m[1].to_i
      d2 = m[2].to_i
      if m[1] and m[2]
        if d1 > d2
          raise Net::HTTPHeaderSyntaxError, "last-byte-pos MUST greater than or equal to first-byte-pos but '#{spec}'"
        end
        d1..d2
      elsif m[1]
        d1..-1
      elsif m[2]
        -d2..-1
      else
        raise Net::HTTPHeaderSyntaxError, 'range is not specified'
      end
    }
    # if result.empty?
    # byte-range-set must include at least one byte-range-spec or suffix-byte-range-spec
    # but above regexp already denies it.
    if result.size == 1 && result[0].begin == 0 && result[0].end == -1
      raise Net::HTTPHeaderSyntaxError, 'only one suffix-byte-range-spec with zero suffix-length'
    end
    result
  end

  # Sets the HTTP Range: header.
  # Accepts either a Range object as a single argument,
  # or a beginning index and a length from that index.
  # Example:
  #
  #   req.range = (0..1023)
  #   req.set_range 0, 1023
  #
  def set_range(r, e = nil)
    unless r
      @header.delete 'range'
      return r
    end
    r = (r...r+e) if e
    case r
    when Numeric
      n = r.to_i
      rangestr = (n > 0 ? "0-#{n-1}" : "-#{-n}")
    when Range
      first = r.first
      last = r.end
      last -= 1 if r.exclude_end?
      if last == -1
        rangestr = (first > 0 ? "#{first}-" : "-#{-first}")
      else
        raise Net::HTTPHeaderSyntaxError, 'range.first is negative' if first < 0
        raise Net::HTTPHeaderSyntaxError, 'range.last is negative' if last < 0
        raise Net::HTTPHeaderSyntaxError, 'must be .first < .last' if first > last
        rangestr = "#{first}-#{last}"
      end
    else
      raise TypeError, 'Range/Integer is required'
    end
    @header['range'] = ["bytes=#{rangestr}"]
    r
  end

  alias range= set_range

  # Returns an Integer object which represents the HTTP Content-Length:
  # header field, or +nil+ if that field was not provided.
  def content_length
    return nil unless key?('Content-Length')
    len = self['Content-Length'].slice(/\d+/) or
        raise Net::HTTPHeaderSyntaxError, 'wrong Content-Length format'
    len.to_i
  end

  def content_length=(len)
    unless len
      @header.delete 'content-length'
      return nil
    end
    @header['content-length'] = [len.to_i.to_s]
  end

  # Returns "true" if the "transfer-encoding" header is present and
  # set to "chunked".  This is an HTTP/1.1 feature, allowing
  # the content to be sent in "chunks" without at the outset
  # stating the entire content length.
  def chunked?
    return false unless @header['transfer-encoding']
    field = self['Transfer-Encoding']
    (/(?:\A|[^\-\w])chunked(?![\-\w])/i =~ field) ? true : false
  end

  # Returns a Range object which represents the value of the Content-Range:
  # header field.
  # For a partial entity body, this indicates where this fragment
  # fits inside the full entity body, as range of byte offsets.
  def content_range
    return nil unless @header['content-range']
    m = %r<\A\s*(\w+)\s+(\d+)-(\d+)/(\d+|\*)>.match(self['Content-Range']) or
        raise Net::HTTPHeaderSyntaxError, 'wrong Content-Range format'
    return unless m[1] == 'bytes'
    m[2].to_i .. m[3].to_i
  end

  # The length of the range represented in Content-Range: header.
  def range_length
    r = content_range() or return nil
    r.end - r.begin + 1
  end

  # Returns a content type string such as "text/html".
  # This method returns nil if Content-Type: header field does not exist.
  def content_type
    return nil unless main_type()
    if sub_type()
    then "#{main_type()}/#{sub_type()}"
    else main_type()
    end
  end

  # Returns a content type string such as "text".
  # This method returns nil if Content-Type: header field does not exist.
  def main_type
    return nil unless @header['content-type']
    self['Content-Type'].split(';').first.to_s.split('/')[0].to_s.strip
  end

  # Returns a content type string such as "html".
  # This method returns nil if Content-Type: header field does not exist
  # or sub-type is not given (e.g. "Content-Type: text").
  def sub_type
    return nil unless @header['content-type']
    _, sub = *self['Content-Type'].split(';').first.to_s.split('/')
    return nil unless sub
    sub.strip
  end

  # Any parameters specified for the content type, returned as a Hash.
  # For example, a header of Content-Type: text/html; charset=EUC-JP
  # would result in type_params returning {'charset' => 'EUC-JP'}
  def type_params
    result = {}
    list = self['Content-Type'].to_s.split(';')
    list.shift
    list.each do |param|
      k, v = *param.split('=', 2)
      result[k.strip] = v.strip
    end
    result
  end

  # Sets the content type in an HTTP header.
  # The +type+ should be a full HTTP content type, e.g. "text/html".
  # The +params+ are an optional Hash of parameters to add after the
  # content type, e.g. {'charset' => 'iso-8859-1'}
  def set_content_type(type, params = {})
    @header['content-type'] = [type + params.map{|k,v|"; #{k}=#{v}"}.join('')]
  end

  alias content_type= set_content_type

  # Set header fields and a body from HTML form data.
  # +params+ should be an Array of Arrays or
  # a Hash containing HTML form data.
  # Optional argument +sep+ means data record separator.
  #
  # Values are URL encoded as necessary and the content-type is set to
  # application/x-www-form-urlencoded
  #
  # Example:
  #    http.form_data = {"q" => "ruby", "lang" => "en"}
  #    http.form_data = {"q" => ["ruby", "perl"], "lang" => "en"}
  #    http.set_form_data({"q" => "ruby", "lang" => "en"}, ';')
  #
  def set_form_data(params, sep = '&')
    query = URI.encode_www_form(params)
    query.gsub!(/&/, sep) if sep != '&'
    self.body = query
    self.content_type = 'application/x-www-form-urlencoded'
  end

  alias form_data= set_form_data

  # Set an HTML form data set.
  # +params+ :: The form data to set, which should be an enumerable.
  #             See below for more details.
  # +enctype+ :: The content type to use to encode the form submission,
  #              which should be application/x-www-form-urlencoded or
  #              multipart/form-data.
  # +formopt+ :: An options hash, supporting the following options:
  #              :boundary :: The boundary of the multipart message. If
  #                           not given, a random boundary will be used.
  #              :charset :: The charset of the form submission. All
  #                          field names and values of non-file fields
  #                          should be encoded with this charset.
  #
  # Each item of params should respond to +each+ and yield 2-3 arguments,
  # or an array of 2-3 elements. The arguments yielded should be:
  #  * The name of the field.
  #  * The value of the field, it should be a String or a File or IO-like.
  #  * An options hash, supporting the following options, only
  #    used for file uploads:
  #    :filename :: The name of the file to use.
  #    :content_type :: The content type of the uploaded file.
  #
  # Each item is a file field or a normal field.
  # If +value+ is a File object or the +opt+ hash has a :filename key,
  # the item is treated as a file field.
  #
  # If Transfer-Encoding is set as chunked, this sends the request using
  # chunked encoding. Because chunked encoding is HTTP/1.1 feature,
  # you should confirm that the server supports HTTP/1.1 before using
  # chunked encoding.
  #
  # Example:
  #    req.set_form([["q", "ruby"], ["lang", "en"]])
  #
  #    req.set_form({"f"=>File.open('/path/to/filename')},
  #                 "multipart/form-data",
  #                 charset: "UTF-8",
  #    )
  #
  #    req.set_form([["f",
  #                   File.open('/path/to/filename.bar'),
  #                   {filename: "other-filename.foo"}
  #                 ]],
  #                 "multipart/form-data",
  #    )
  #
  # See also RFC 2388, RFC 2616, HTML 4.01, and HTML5
  #
  def set_form(params, enctype='application/x-www-form-urlencoded', formopt={})
    @body_data = params
    @body = nil
    @body_stream = nil
    @form_option = formopt
    case enctype
    when /\Aapplication\/x-www-form-urlencoded\z/i,
      /\Amultipart\/form-data\z/i
      self.content_type = enctype
    else
      raise ArgumentError, "invalid enctype: #{enctype}"
    end
  end

  # Set the Authorization: header for "Basic" authorization.
  def basic_auth(account, password)
    @header['authorization'] = [basic_encode(account, password)]
  end

  # Set Proxy-Authorization: header for "Basic" authorization.
  def proxy_basic_auth(account, password)
    @header['proxy-authorization'] = [basic_encode(account, password)]
  end

  def basic_encode(account, password)
    'Basic ' + ["#{account}:#{password}"].pack('m0')
  end
  private :basic_encode

  def connection_close?
    token = /(?:\A|,)\s*close\s*(?:\z|,)/i
    @header['connection']&.grep(token) {return true}
    @header['proxy-connection']&.grep(token) {return true}
    false
  end

  def connection_keep_alive?
    token = /(?:\A|,)\s*keep-alive\s*(?:\z|,)/i
    @header['connection']&.grep(token) {return true}
    @header['proxy-connection']&.grep(token) {return true}
    false
  end

end
PK}$[���w&&ruby/net/http/responses.rbnu�[���# frozen_string_literal: true
#--
# https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml

module Net
  # :stopdoc:

  class HTTPUnknownResponse < HTTPResponse
    HAS_BODY = true
    EXCEPTION_TYPE = HTTPError                  #
  end
  class HTTPInformation < HTTPResponse          # 1xx
    HAS_BODY = false
    EXCEPTION_TYPE = HTTPError                  #
  end
  class HTTPSuccess < HTTPResponse              # 2xx
    HAS_BODY = true
    EXCEPTION_TYPE = HTTPError                  #
  end
  class HTTPRedirection < HTTPResponse          # 3xx
    HAS_BODY = true
    EXCEPTION_TYPE = HTTPRetriableError         #
  end
  class HTTPClientError < HTTPResponse          # 4xx
    HAS_BODY = true
    EXCEPTION_TYPE = HTTPClientException        #
  end
  class HTTPServerError < HTTPResponse          # 5xx
    HAS_BODY = true
    EXCEPTION_TYPE = HTTPFatalError             #
  end

  class HTTPContinue < HTTPInformation          # 100
    HAS_BODY = false
  end
  class HTTPSwitchProtocol < HTTPInformation    # 101
    HAS_BODY = false
  end
  class HTTPProcessing < HTTPInformation        # 102
    HAS_BODY = false
  end
  class HTTPEarlyHints < HTTPInformation        # 103 - RFC 8297
    HAS_BODY = false
  end

  class HTTPOK < HTTPSuccess                            # 200
    HAS_BODY = true
  end
  class HTTPCreated < HTTPSuccess                       # 201
    HAS_BODY = true
  end
  class HTTPAccepted < HTTPSuccess                      # 202
    HAS_BODY = true
  end
  class HTTPNonAuthoritativeInformation < HTTPSuccess   # 203
    HAS_BODY = true
  end
  class HTTPNoContent < HTTPSuccess                     # 204
    HAS_BODY = false
  end
  class HTTPResetContent < HTTPSuccess                  # 205
    HAS_BODY = false
  end
  class HTTPPartialContent < HTTPSuccess                # 206
    HAS_BODY = true
  end
  class HTTPMultiStatus < HTTPSuccess                   # 207 - RFC 4918
    HAS_BODY = true
  end
  class HTTPAlreadyReported < HTTPSuccess               # 208 - RFC 5842
    HAS_BODY = true
  end
  class HTTPIMUsed < HTTPSuccess                        # 226 - RFC 3229
    HAS_BODY = true
  end

  class HTTPMultipleChoices < HTTPRedirection   # 300
    HAS_BODY = true
  end
  HTTPMultipleChoice = HTTPMultipleChoices
  class HTTPMovedPermanently < HTTPRedirection  # 301
    HAS_BODY = true
  end
  class HTTPFound < HTTPRedirection             # 302
    HAS_BODY = true
  end
  HTTPMovedTemporarily = HTTPFound
  class HTTPSeeOther < HTTPRedirection          # 303
    HAS_BODY = true
  end
  class HTTPNotModified < HTTPRedirection       # 304
    HAS_BODY = false
  end
  class HTTPUseProxy < HTTPRedirection          # 305
    HAS_BODY = false
  end
  # 306 Switch Proxy - no longer unused
  class HTTPTemporaryRedirect < HTTPRedirection # 307
    HAS_BODY = true
  end
  class HTTPPermanentRedirect < HTTPRedirection # 308
    HAS_BODY = true
  end

  class HTTPBadRequest < HTTPClientError                    # 400
    HAS_BODY = true
  end
  class HTTPUnauthorized < HTTPClientError                  # 401
    HAS_BODY = true
  end
  class HTTPPaymentRequired < HTTPClientError               # 402
    HAS_BODY = true
  end
  class HTTPForbidden < HTTPClientError                     # 403
    HAS_BODY = true
  end
  class HTTPNotFound < HTTPClientError                      # 404
    HAS_BODY = true
  end
  class HTTPMethodNotAllowed < HTTPClientError              # 405
    HAS_BODY = true
  end
  class HTTPNotAcceptable < HTTPClientError                 # 406
    HAS_BODY = true
  end
  class HTTPProxyAuthenticationRequired < HTTPClientError   # 407
    HAS_BODY = true
  end
  class HTTPRequestTimeout < HTTPClientError                # 408
    HAS_BODY = true
  end
  HTTPRequestTimeOut = HTTPRequestTimeout
  class HTTPConflict < HTTPClientError                      # 409
    HAS_BODY = true
  end
  class HTTPGone < HTTPClientError                          # 410
    HAS_BODY = true
  end
  class HTTPLengthRequired < HTTPClientError                # 411
    HAS_BODY = true
  end
  class HTTPPreconditionFailed < HTTPClientError            # 412
    HAS_BODY = true
  end
  class HTTPPayloadTooLarge < HTTPClientError               # 413
    HAS_BODY = true
  end
  HTTPRequestEntityTooLarge = HTTPPayloadTooLarge
  class HTTPURITooLong < HTTPClientError                    # 414
    HAS_BODY = true
  end
  HTTPRequestURITooLong = HTTPURITooLong
  HTTPRequestURITooLarge = HTTPRequestURITooLong
  class HTTPUnsupportedMediaType < HTTPClientError          # 415
    HAS_BODY = true
  end
  class HTTPRangeNotSatisfiable < HTTPClientError           # 416
    HAS_BODY = true
  end
  HTTPRequestedRangeNotSatisfiable = HTTPRangeNotSatisfiable
  class HTTPExpectationFailed < HTTPClientError             # 417
    HAS_BODY = true
  end
  # 418 I'm a teapot - RFC 2324; a joke RFC
  # 420 Enhance Your Calm - Twitter
  class HTTPMisdirectedRequest < HTTPClientError            # 421 - RFC 7540
    HAS_BODY = true
  end
  class HTTPUnprocessableEntity < HTTPClientError           # 422 - RFC 4918
    HAS_BODY = true
  end
  class HTTPLocked < HTTPClientError                        # 423 - RFC 4918
    HAS_BODY = true
  end
  class HTTPFailedDependency < HTTPClientError              # 424 - RFC 4918
    HAS_BODY = true
  end
  # 425 Unordered Collection - existed only in draft
  class HTTPUpgradeRequired < HTTPClientError               # 426 - RFC 2817
    HAS_BODY = true
  end
  class HTTPPreconditionRequired < HTTPClientError          # 428 - RFC 6585
    HAS_BODY = true
  end
  class HTTPTooManyRequests < HTTPClientError               # 429 - RFC 6585
    HAS_BODY = true
  end
  class HTTPRequestHeaderFieldsTooLarge < HTTPClientError   # 431 - RFC 6585
    HAS_BODY = true
  end
  class HTTPUnavailableForLegalReasons < HTTPClientError    # 451 - RFC 7725
    HAS_BODY = true
  end
  # 444 No Response - Nginx
  # 449 Retry With - Microsoft
  # 450 Blocked by Windows Parental Controls - Microsoft
  # 499 Client Closed Request - Nginx

  class HTTPInternalServerError < HTTPServerError           # 500
    HAS_BODY = true
  end
  class HTTPNotImplemented < HTTPServerError                # 501
    HAS_BODY = true
  end
  class HTTPBadGateway < HTTPServerError                    # 502
    HAS_BODY = true
  end
  class HTTPServiceUnavailable < HTTPServerError            # 503
    HAS_BODY = true
  end
  class HTTPGatewayTimeout < HTTPServerError                # 504
    HAS_BODY = true
  end
  HTTPGatewayTimeOut = HTTPGatewayTimeout
  class HTTPVersionNotSupported < HTTPServerError           # 505
    HAS_BODY = true
  end
  class HTTPVariantAlsoNegotiates < HTTPServerError         # 506
    HAS_BODY = true
  end
  class HTTPInsufficientStorage < HTTPServerError           # 507 - RFC 4918
    HAS_BODY = true
  end
  class HTTPLoopDetected < HTTPServerError                  # 508 - RFC 5842
    HAS_BODY = true
  end
  # 509 Bandwidth Limit Exceeded - Apache bw/limited extension
  class HTTPNotExtended < HTTPServerError                   # 510 - RFC 2774
    HAS_BODY = true
  end
  class HTTPNetworkAuthenticationRequired < HTTPServerError # 511 - RFC 6585
    HAS_BODY = true
  end

  # :startdoc:
end

class Net::HTTPResponse
  CODE_CLASS_TO_OBJ = {
    '1' => Net::HTTPInformation,
    '2' => Net::HTTPSuccess,
    '3' => Net::HTTPRedirection,
    '4' => Net::HTTPClientError,
    '5' => Net::HTTPServerError
  }
  CODE_TO_OBJ = {
    '100' => Net::HTTPContinue,
    '101' => Net::HTTPSwitchProtocol,
    '102' => Net::HTTPProcessing,
    '103' => Net::HTTPEarlyHints,

    '200' => Net::HTTPOK,
    '201' => Net::HTTPCreated,
    '202' => Net::HTTPAccepted,
    '203' => Net::HTTPNonAuthoritativeInformation,
    '204' => Net::HTTPNoContent,
    '205' => Net::HTTPResetContent,
    '206' => Net::HTTPPartialContent,
    '207' => Net::HTTPMultiStatus,
    '208' => Net::HTTPAlreadyReported,
    '226' => Net::HTTPIMUsed,

    '300' => Net::HTTPMultipleChoices,
    '301' => Net::HTTPMovedPermanently,
    '302' => Net::HTTPFound,
    '303' => Net::HTTPSeeOther,
    '304' => Net::HTTPNotModified,
    '305' => Net::HTTPUseProxy,
    '307' => Net::HTTPTemporaryRedirect,
    '308' => Net::HTTPPermanentRedirect,

    '400' => Net::HTTPBadRequest,
    '401' => Net::HTTPUnauthorized,
    '402' => Net::HTTPPaymentRequired,
    '403' => Net::HTTPForbidden,
    '404' => Net::HTTPNotFound,
    '405' => Net::HTTPMethodNotAllowed,
    '406' => Net::HTTPNotAcceptable,
    '407' => Net::HTTPProxyAuthenticationRequired,
    '408' => Net::HTTPRequestTimeout,
    '409' => Net::HTTPConflict,
    '410' => Net::HTTPGone,
    '411' => Net::HTTPLengthRequired,
    '412' => Net::HTTPPreconditionFailed,
    '413' => Net::HTTPPayloadTooLarge,
    '414' => Net::HTTPURITooLong,
    '415' => Net::HTTPUnsupportedMediaType,
    '416' => Net::HTTPRangeNotSatisfiable,
    '417' => Net::HTTPExpectationFailed,
    '421' => Net::HTTPMisdirectedRequest,
    '422' => Net::HTTPUnprocessableEntity,
    '423' => Net::HTTPLocked,
    '424' => Net::HTTPFailedDependency,
    '426' => Net::HTTPUpgradeRequired,
    '428' => Net::HTTPPreconditionRequired,
    '429' => Net::HTTPTooManyRequests,
    '431' => Net::HTTPRequestHeaderFieldsTooLarge,
    '451' => Net::HTTPUnavailableForLegalReasons,

    '500' => Net::HTTPInternalServerError,
    '501' => Net::HTTPNotImplemented,
    '502' => Net::HTTPBadGateway,
    '503' => Net::HTTPServiceUnavailable,
    '504' => Net::HTTPGatewayTimeout,
    '505' => Net::HTTPVersionNotSupported,
    '506' => Net::HTTPVariantAlsoNegotiates,
    '507' => Net::HTTPInsufficientStorage,
    '508' => Net::HTTPLoopDetected,
    '510' => Net::HTTPNotExtended,
    '511' => Net::HTTPNetworkAuthenticationRequired,
  }
end
PK}$[1��&<&<ruby/net/http/response.rbnu�[���# frozen_string_literal: false
# HTTP response class.
#
# This class wraps together the response header and the response body (the
# entity requested).
#
# It mixes in the HTTPHeader module, which provides access to response
# header values both via hash-like methods and via individual readers.
#
# Note that each possible HTTP response code defines its own
# HTTPResponse subclass. All classes are defined under the Net module.
# Indentation indicates inheritance.  For a list of the classes see Net::HTTP.
#
# Correspondence <code>HTTP code => class</code> is stored in CODE_TO_OBJ
# constant:
#
#    Net::HTTPResponse::CODE_TO_OBJ['404'] #=> Net::HTTPNotFound
#
class Net::HTTPResponse
  class << self
    # true if the response has a body.
    def body_permitted?
      self::HAS_BODY
    end

    def exception_type   # :nodoc: internal use only
      self::EXCEPTION_TYPE
    end

    def read_new(sock)   #:nodoc: internal use only
      httpv, code, msg = read_status_line(sock)
      res = response_class(code).new(httpv, code, msg)
      each_response_header(sock) do |k,v|
        res.add_field k, v
      end
      res
    end

    private

    def read_status_line(sock)
      str = sock.readline
      m = /\AHTTP(?:\/(\d+\.\d+))?\s+(\d\d\d)(?:\s+(.*))?\z/in.match(str) or
        raise Net::HTTPBadResponse, "wrong status line: #{str.dump}"
      m.captures
    end

    def response_class(code)
      CODE_TO_OBJ[code] or
      CODE_CLASS_TO_OBJ[code[0,1]] or
      Net::HTTPUnknownResponse
    end

    def each_response_header(sock)
      key = value = nil
      while true
        line = sock.readuntil("\n", true).sub(/\s+\z/, '')
        break if line.empty?
        if line[0] == ?\s or line[0] == ?\t and value
          value << ' ' unless value.empty?
          value << line.strip
        else
          yield key, value if key
          key, value = line.strip.split(/\s*:\s*/, 2)
          raise Net::HTTPBadResponse, 'wrong header line format' if value.nil?
        end
      end
      yield key, value if key
    end
  end

  # next is to fix bug in RDoc, where the private inside class << self
  # spills out.
  public

  include Net::HTTPHeader

  def initialize(httpv, code, msg)   #:nodoc: internal use only
    @http_version = httpv
    @code         = code
    @message      = msg
    initialize_http_header nil
    @body = nil
    @read = false
    @uri  = nil
    @decode_content = false
    @body_encoding = false
    @ignore_eof = true
  end

  # The HTTP version supported by the server.
  attr_reader :http_version

  # The HTTP result code string. For example, '302'.  You can also
  # determine the response type by examining which response subclass
  # the response object is an instance of.
  attr_reader :code

  # The HTTP result message sent by the server. For example, 'Not Found'.
  attr_reader :message
  alias msg message   # :nodoc: obsolete

  # The URI used to fetch this response.  The response URI is only available
  # if a URI was used to create the request.
  attr_reader :uri

  # Set to true automatically when the request did not contain an
  # Accept-Encoding header from the user.
  attr_accessor :decode_content

  # The encoding to use for the response body. If Encoding, use that encoding.
  # If other true value, attempt to detect the appropriate encoding, and use
  # that.
  attr_reader :body_encoding

  # Set the encoding to use for the response body.  If given a String, find
  # the related Encoding.
  def body_encoding=(value)
    value = Encoding.find(value) if value.is_a?(String)
    @body_encoding = value
  end

  # Whether to ignore EOF when reading bodies with a specified Content-Length
  # header.
  attr_accessor :ignore_eof

  def inspect
    "#<#{self.class} #{@code} #{@message} readbody=#{@read}>"
  end

  #
  # response <-> exception relationship
  #

  def code_type   #:nodoc:
    self.class
  end

  def error!   #:nodoc:
    message = @code
    message += ' ' + @message.dump if @message
    raise error_type().new(message, self)
  end

  def error_type   #:nodoc:
    self.class::EXCEPTION_TYPE
  end

  # Raises an HTTP error if the response is not 2xx (success).
  def value
    error! unless self.kind_of?(Net::HTTPSuccess)
  end

  def uri= uri # :nodoc:
    @uri = uri.dup if uri
  end

  #
  # header (for backward compatibility only; DO NOT USE)
  #

  def response   #:nodoc:
    warn "Net::HTTPResponse#response is obsolete", uplevel: 1 if $VERBOSE
    self
  end

  def header   #:nodoc:
    warn "Net::HTTPResponse#header is obsolete", uplevel: 1 if $VERBOSE
    self
  end

  def read_header   #:nodoc:
    warn "Net::HTTPResponse#read_header is obsolete", uplevel: 1 if $VERBOSE
    self
  end

  #
  # body
  #

  def reading_body(sock, reqmethodallowbody)  #:nodoc: internal use only
    @socket = sock
    @body_exist = reqmethodallowbody && self.class.body_permitted?
    begin
      yield
      self.body   # ensure to read body
    ensure
      @socket = nil
    end
  end

  # Gets the entity body returned by the remote HTTP server.
  #
  # If a block is given, the body is passed to the block, and
  # the body is provided in fragments, as it is read in from the socket.
  #
  # If +dest+ argument is given, response is read into that variable,
  # with <code>dest#<<</code> method (it could be String or IO, or any
  # other object responding to <code><<</code>).
  #
  # Calling this method a second or subsequent time for the same
  # HTTPResponse object will return the value already read.
  #
  #   http.request_get('/index.html') {|res|
  #     puts res.read_body
  #   }
  #
  #   http.request_get('/index.html') {|res|
  #     p res.read_body.object_id   # 538149362
  #     p res.read_body.object_id   # 538149362
  #   }
  #
  #   # using iterator
  #   http.request_get('/index.html') {|res|
  #     res.read_body do |segment|
  #       print segment
  #     end
  #   }
  #
  def read_body(dest = nil, &block)
    if @read
      raise IOError, "#{self.class}\#read_body called twice" if dest or block
      return @body
    end
    to = procdest(dest, block)
    stream_check
    if @body_exist
      read_body_0 to
      @body = to
    else
      @body = nil
    end
    @read = true

    case enc = @body_encoding
    when Encoding, false, nil
      # Encoding: force given encoding
      # false/nil: do not force encoding
    else
      # other value: detect encoding from body
      enc = detect_encoding(@body)
    end

    @body.force_encoding(enc) if enc

    @body
  end

  # Returns the full entity body.
  #
  # Calling this method a second or subsequent time will return the
  # string already read.
  #
  #   http.request_get('/index.html') {|res|
  #     puts res.body
  #   }
  #
  #   http.request_get('/index.html') {|res|
  #     p res.body.object_id   # 538149362
  #     p res.body.object_id   # 538149362
  #   }
  #
  def body
    read_body()
  end

  # Because it may be necessary to modify the body, Eg, decompression
  # this method facilitates that.
  def body=(value)
    @body = value
  end

  alias entity body   #:nodoc: obsolete

  private

  # :nodoc:
  def detect_encoding(str, encoding=nil)
    if encoding
    elsif encoding = type_params['charset']
    elsif encoding = check_bom(str)
    else
      encoding = case content_type&.downcase
      when %r{text/x(?:ht)?ml|application/(?:[^+]+\+)?xml}
        /\A<xml[ \t\r\n]+
          version[ \t\r\n]*=[ \t\r\n]*(?:"[0-9.]+"|'[0-9.]*')[ \t\r\n]+
          encoding[ \t\r\n]*=[ \t\r\n]*
          (?:"([A-Za-z][\-A-Za-z0-9._]*)"|'([A-Za-z][\-A-Za-z0-9._]*)')/x =~ str
        encoding = $1 || $2 || Encoding::UTF_8
      when %r{text/html.*}
        sniff_encoding(str)
      end
    end
    return encoding
  end

  # :nodoc:
  def sniff_encoding(str, encoding=nil)
    # the encoding sniffing algorithm
    # http://www.w3.org/TR/html5/parsing.html#determining-the-character-encoding
    if enc = scanning_meta(str)
      enc
    # 6. last visited page or something
    # 7. frequency
    elsif str.ascii_only?
      Encoding::US_ASCII
    elsif str.dup.force_encoding(Encoding::UTF_8).valid_encoding?
      Encoding::UTF_8
    end
    # 8. implementation-defined or user-specified
  end

  # :nodoc:
  def check_bom(str)
    case str.byteslice(0, 2)
    when "\xFE\xFF"
      return Encoding::UTF_16BE
    when "\xFF\xFE"
      return Encoding::UTF_16LE
    end
    if "\xEF\xBB\xBF" == str.byteslice(0, 3)
      return Encoding::UTF_8
    end
    nil
  end

  # :nodoc:
  def scanning_meta(str)
    require 'strscan'
    ss = StringScanner.new(str)
    if ss.scan_until(/<meta[\t\n\f\r ]*/)
      attrs = {} # attribute_list
      got_pragma = false
      need_pragma = nil
      charset = nil

      # step: Attributes
      while attr = get_attribute(ss)
        name, value = *attr
        next if attrs[name]
        attrs[name] = true
        case name
        when 'http-equiv'
          got_pragma = true if value == 'content-type'
        when 'content'
          encoding = extracting_encodings_from_meta_elements(value)
          unless charset
            charset = encoding
          end
          need_pragma = true
        when 'charset'
          need_pragma = false
          charset = value
        end
      end

      # step: Processing
      return if need_pragma.nil?
      return if need_pragma && !got_pragma

      charset = Encoding.find(charset) rescue nil
      return unless charset
      charset = Encoding::UTF_8 if charset == Encoding::UTF_16
      return charset # tentative
    end
    nil
  end

  def get_attribute(ss)
    ss.scan(/[\t\n\f\r \/]*/)
    if ss.peek(1) == '>'
      ss.getch
      return nil
    end
    name = ss.scan(/[^=\t\n\f\r \/>]*/)
    name.downcase!
    raise if name.empty?
    ss.skip(/[\t\n\f\r ]*/)
    if ss.getch != '='
      value = ''
      return [name, value]
    end
    ss.skip(/[\t\n\f\r ]*/)
    case ss.peek(1)
    when '"'
      ss.getch
      value = ss.scan(/[^"]+/)
      value.downcase!
      ss.getch
    when "'"
      ss.getch
      value = ss.scan(/[^']+/)
      value.downcase!
      ss.getch
    when '>'
      value = ''
    else
      value = ss.scan(/[^\t\n\f\r >]+/)
      value.downcase!
    end
    [name, value]
  end

  def extracting_encodings_from_meta_elements(value)
    # http://dev.w3.org/html5/spec/fetching-resources.html#algorithm-for-extracting-an-encoding-from-a-meta-element
    if /charset[\t\n\f\r ]*=(?:"([^"]*)"|'([^']*)'|["']|\z|([^\t\n\f\r ;]+))/i =~ value
      return $1 || $2 || $3
    end
    return nil
  end

  ##
  # Checks for a supported Content-Encoding header and yields an Inflate
  # wrapper for this response's socket when zlib is present.  If the
  # Content-Encoding is not supported or zlib is missing, the plain socket is
  # yielded.
  #
  # If a Content-Range header is present, a plain socket is yielded as the
  # bytes in the range may not be a complete deflate block.

  def inflater # :nodoc:
    return yield @socket unless Net::HTTP::HAVE_ZLIB
    return yield @socket unless @decode_content
    return yield @socket if self['content-range']

    v = self['content-encoding']
    case v&.downcase
    when 'deflate', 'gzip', 'x-gzip' then
      self.delete 'content-encoding'

      inflate_body_io = Inflater.new(@socket)

      begin
        yield inflate_body_io
        success = true
      ensure
        begin
          inflate_body_io.finish
          if self['content-length']
            self['content-length'] = inflate_body_io.bytes_inflated.to_s
          end
        rescue => err
          # Ignore #finish's error if there is an exception from yield
          raise err if success
        end
      end
    when 'none', 'identity' then
      self.delete 'content-encoding'

      yield @socket
    else
      yield @socket
    end
  end

  def read_body_0(dest)
    inflater do |inflate_body_io|
      if chunked?
        read_chunked dest, inflate_body_io
        return
      end

      @socket = inflate_body_io

      clen = content_length()
      if clen
        @socket.read clen, dest, @ignore_eof
        return
      end
      clen = range_length()
      if clen
        @socket.read clen, dest
        return
      end
      @socket.read_all dest
    end
  end

  ##
  # read_chunked reads from +@socket+ for chunk-size, chunk-extension, CRLF,
  # etc. and +chunk_data_io+ for chunk-data which may be deflate or gzip
  # encoded.
  #
  # See RFC 2616 section 3.6.1 for definitions

  def read_chunked(dest, chunk_data_io) # :nodoc:
    total = 0
    while true
      line = @socket.readline
      hexlen = line.slice(/[0-9a-fA-F]+/) or
          raise Net::HTTPBadResponse, "wrong chunk size line: #{line}"
      len = hexlen.hex
      break if len == 0
      begin
        chunk_data_io.read len, dest
      ensure
        total += len
        @socket.read 2   # \r\n
      end
    end
    until @socket.readline.empty?
      # none
    end
  end

  def stream_check
    raise IOError, 'attempt to read body out of block' if @socket.closed?
  end

  def procdest(dest, block)
    raise ArgumentError, 'both arg and block given for HTTP method' if
      dest and block
    if block
      Net::ReadAdapter.new(block)
    else
      dest || ''
    end
  end

  ##
  # Inflater is a wrapper around Net::BufferedIO that transparently inflates
  # zlib and gzip streams.

  class Inflater # :nodoc:

    ##
    # Creates a new Inflater wrapping +socket+

    def initialize socket
      @socket = socket
      # zlib with automatic gzip detection
      @inflate = Zlib::Inflate.new(32 + Zlib::MAX_WBITS)
    end

    ##
    # Finishes the inflate stream.

    def finish
      return if @inflate.total_in == 0
      @inflate.finish
    end

    ##
    # The number of bytes inflated, used to update the Content-Length of
    # the response.

    def bytes_inflated
      @inflate.total_out
    end

    ##
    # Returns a Net::ReadAdapter that inflates each read chunk into +dest+.
    #
    # This allows a large response body to be inflated without storing the
    # entire body in memory.

    def inflate_adapter(dest)
      if dest.respond_to?(:set_encoding)
        dest.set_encoding(Encoding::ASCII_8BIT)
      elsif dest.respond_to?(:force_encoding)
        dest.force_encoding(Encoding::ASCII_8BIT)
      end
      block = proc do |compressed_chunk|
        @inflate.inflate(compressed_chunk) do |chunk|
          compressed_chunk.clear
          dest << chunk
        end
      end

      Net::ReadAdapter.new(block)
    end

    ##
    # Reads +clen+ bytes from the socket, inflates them, then writes them to
    # +dest+.  +ignore_eof+ is passed down to Net::BufferedIO#read
    #
    # Unlike Net::BufferedIO#read, this method returns more than +clen+ bytes.
    # At this time there is no way for a user of Net::HTTPResponse to read a
    # specific number of bytes from the HTTP response body, so this internal
    # API does not return the same number of bytes as were requested.
    #
    # See https://bugs.ruby-lang.org/issues/6492 for further discussion.

    def read clen, dest, ignore_eof = false
      temp_dest = inflate_adapter(dest)

      @socket.read clen, temp_dest, ignore_eof
    end

    ##
    # Reads the rest of the socket, inflates it, then writes it to +dest+.

    def read_all dest
      temp_dest = inflate_adapter(dest)

      @socket.read_all temp_dest
    end

  end

end

PK}$[\V��pXpX
ruby/open3.rbnu�[���# frozen_string_literal: true

#
# = open3.rb: Popen, but with stderr, too
#
# Author:: Yukihiro Matsumoto
# Documentation:: Konrad Meyer
#
# Open3 gives you access to stdin, stdout, and stderr when running other
# programs.
#

#
# Open3 grants you access to stdin, stdout, stderr and a thread to wait for the
# child process when running another program.
# You can specify various attributes, redirections, current directory, etc., of
# the program in the same way as for Process.spawn.
#
# - Open3.popen3 : pipes for stdin, stdout, stderr
# - Open3.popen2 : pipes for stdin, stdout
# - Open3.popen2e : pipes for stdin, merged stdout and stderr
# - Open3.capture3 : give a string for stdin; get strings for stdout, stderr
# - Open3.capture2 : give a string for stdin; get a string for stdout
# - Open3.capture2e : give a string for stdin; get a string for merged stdout and stderr
# - Open3.pipeline_rw : pipes for first stdin and last stdout of a pipeline
# - Open3.pipeline_r : pipe for last stdout of a pipeline
# - Open3.pipeline_w : pipe for first stdin of a pipeline
# - Open3.pipeline_start : run a pipeline without waiting
# - Open3.pipeline : run a pipeline and wait for its completion
#

require 'open3/version'

module Open3

  # Open stdin, stdout, and stderr streams and start external executable.
  # In addition, a thread to wait for the started process is created.
  # The thread has a pid method and a thread variable :pid which is the pid of
  # the started process.
  #
  # Block form:
  #
  #   Open3.popen3([env,] cmd... [, opts]) {|stdin, stdout, stderr, wait_thr|
  #     pid = wait_thr.pid # pid of the started process.
  #     ...
  #     exit_status = wait_thr.value # Process::Status object returned.
  #   }
  #
  # Non-block form:
  #
  #   stdin, stdout, stderr, wait_thr = Open3.popen3([env,] cmd... [, opts])
  #   pid = wait_thr[:pid]  # pid of the started process
  #   ...
  #   stdin.close  # stdin, stdout and stderr should be closed explicitly in this form.
  #   stdout.close
  #   stderr.close
  #   exit_status = wait_thr.value  # Process::Status object returned.
  #
  # The parameters env, cmd, and opts are passed to Process.spawn.
  # A commandline string and a list of argument strings can be accepted as follows:
  #
  #   Open3.popen3("echo abc") {|i, o, e, t| ... }
  #   Open3.popen3("echo", "abc") {|i, o, e, t| ... }
  #   Open3.popen3(["echo", "argv0"], "abc") {|i, o, e, t| ... }
  #
  # If the last parameter, opts, is a Hash, it is recognized as an option for Process.spawn.
  #
  #   Open3.popen3("pwd", :chdir=>"/") {|i,o,e,t|
  #     p o.read.chomp #=> "/"
  #   }
  #
  # wait_thr.value waits for the termination of the process.
  # The block form also waits for the process when it returns.
  #
  # Closing stdin, stdout and stderr does not wait for the process to complete.
  #
  # You should be careful to avoid deadlocks.
  # Since pipes are fixed length buffers,
  # Open3.popen3("prog") {|i, o, e, t| o.read } deadlocks if
  # the program generates too much output on stderr.
  # You should read stdout and stderr simultaneously (using threads or IO.select).
  # However, if you don't need stderr output, you can use Open3.popen2.
  # If merged stdout and stderr output is not a problem, you can use Open3.popen2e.
  # If you really need stdout and stderr output as separate strings, you can consider Open3.capture3.
  #
  def popen3(*cmd, &block)
    if Hash === cmd.last
      opts = cmd.pop.dup
    else
      opts = {}
    end

    in_r, in_w = IO.pipe
    opts[:in] = in_r
    in_w.sync = true

    out_r, out_w = IO.pipe
    opts[:out] = out_w

    err_r, err_w = IO.pipe
    opts[:err] = err_w

    popen_run(cmd, opts, [in_r, out_w, err_w], [in_w, out_r, err_r], &block)
  end
  module_function :popen3

  # Open3.popen2 is similar to Open3.popen3 except that it doesn't create a pipe for
  # the standard error stream.
  #
  # Block form:
  #
  #   Open3.popen2([env,] cmd... [, opts]) {|stdin, stdout, wait_thr|
  #     pid = wait_thr.pid # pid of the started process.
  #     ...
  #     exit_status = wait_thr.value # Process::Status object returned.
  #   }
  #
  # Non-block form:
  #
  #   stdin, stdout, wait_thr = Open3.popen2([env,] cmd... [, opts])
  #   ...
  #   stdin.close  # stdin and stdout should be closed explicitly in this form.
  #   stdout.close
  #
  # See Process.spawn for the optional hash arguments _env_ and _opts_.
  #
  # Example:
  #
  #   Open3.popen2("wc -c") {|i,o,t|
  #     i.print "answer to life the universe and everything"
  #     i.close
  #     p o.gets #=> "42\n"
  #   }
  #
  #   Open3.popen2("bc -q") {|i,o,t|
  #     i.puts "obase=13"
  #     i.puts "6 * 9"
  #     p o.gets #=> "42\n"
  #   }
  #
  #   Open3.popen2("dc") {|i,o,t|
  #     i.print "42P"
  #     i.close
  #     p o.read #=> "*"
  #   }
  #
  def popen2(*cmd, &block)
    if Hash === cmd.last
      opts = cmd.pop.dup
    else
      opts = {}
    end

    in_r, in_w = IO.pipe
    opts[:in] = in_r
    in_w.sync = true

    out_r, out_w = IO.pipe
    opts[:out] = out_w

    popen_run(cmd, opts, [in_r, out_w], [in_w, out_r], &block)
  end
  module_function :popen2

  # Open3.popen2e is similar to Open3.popen3 except that it merges
  # the standard output stream and the standard error stream.
  #
  # Block form:
  #
  #   Open3.popen2e([env,] cmd... [, opts]) {|stdin, stdout_and_stderr, wait_thr|
  #     pid = wait_thr.pid # pid of the started process.
  #     ...
  #     exit_status = wait_thr.value # Process::Status object returned.
  #   }
  #
  # Non-block form:
  #
  #   stdin, stdout_and_stderr, wait_thr = Open3.popen2e([env,] cmd... [, opts])
  #   ...
  #   stdin.close  # stdin and stdout_and_stderr should be closed explicitly in this form.
  #   stdout_and_stderr.close
  #
  # See Process.spawn for the optional hash arguments _env_ and _opts_.
  #
  # Example:
  #   # check gcc warnings
  #   source = "foo.c"
  #   Open3.popen2e("gcc", "-Wall", source) {|i,oe,t|
  #     oe.each {|line|
  #       if /warning/ =~ line
  #         ...
  #       end
  #     }
  #   }
  #
  def popen2e(*cmd, &block)
    if Hash === cmd.last
      opts = cmd.pop.dup
    else
      opts = {}
    end

    in_r, in_w = IO.pipe
    opts[:in] = in_r
    in_w.sync = true

    out_r, out_w = IO.pipe
    opts[[:out, :err]] = out_w

    popen_run(cmd, opts, [in_r, out_w], [in_w, out_r], &block)
  ensure
    if block
      in_r.close
      in_w.close
      out_r.close
      out_w.close
    end
  end
  module_function :popen2e

  def popen_run(cmd, opts, child_io, parent_io) # :nodoc:
    pid = spawn(*cmd, opts)
    wait_thr = Process.detach(pid)
    child_io.each(&:close)
    result = [*parent_io, wait_thr]
    if defined? yield
      begin
        return yield(*result)
      ensure
        parent_io.each(&:close)
        wait_thr.join
      end
    end
    result
  end
  module_function :popen_run
  class << self
    private :popen_run
  end

  # Open3.capture3 captures the standard output and the standard error of a command.
  #
  #   stdout_str, stderr_str, status = Open3.capture3([env,] cmd... [, opts])
  #
  # The arguments env, cmd and opts are passed to Open3.popen3 except
  # <code>opts[:stdin_data]</code> and <code>opts[:binmode]</code>.  See Process.spawn.
  #
  # If <code>opts[:stdin_data]</code> is specified, it is sent to the command's standard input.
  #
  # If <code>opts[:binmode]</code> is true, internal pipes are set to binary mode.
  #
  # Examples:
  #
  #   # dot is a command of graphviz.
  #   graph = <<'End'
  #     digraph g {
  #       a -> b
  #     }
  #   End
  #   drawn_graph, dot_log = Open3.capture3("dot -v", :stdin_data=>graph)
  #
  #   o, e, s = Open3.capture3("echo abc; sort >&2", :stdin_data=>"foo\nbar\nbaz\n")
  #   p o #=> "abc\n"
  #   p e #=> "bar\nbaz\nfoo\n"
  #   p s #=> #<Process::Status: pid 32682 exit 0>
  #
  #   # generate a thumbnail image using the convert command of ImageMagick.
  #   # However, if the image is really stored in a file,
  #   # system("convert", "-thumbnail", "80", "png:#{filename}", "png:-") is better
  #   # because of reduced memory consumption.
  #   # But if the image is stored in a DB or generated by the gnuplot Open3.capture2 example,
  #   # Open3.capture3 should be considered.
  #   #
  #   image = File.read("/usr/share/openclipart/png/animals/mammals/sheep-md-v0.1.png", :binmode=>true)
  #   thumbnail, err, s = Open3.capture3("convert -thumbnail 80 png:- png:-", :stdin_data=>image, :binmode=>true)
  #   if s.success?
  #     STDOUT.binmode; print thumbnail
  #   end
  #
  def capture3(*cmd)
    if Hash === cmd.last
      opts = cmd.pop.dup
    else
      opts = {}
    end

    stdin_data = opts.delete(:stdin_data) || ''
    binmode = opts.delete(:binmode)

    popen3(*cmd, opts) {|i, o, e, t|
      if binmode
        i.binmode
        o.binmode
        e.binmode
      end
      out_reader = Thread.new { o.read }
      err_reader = Thread.new { e.read }
      begin
        if stdin_data.respond_to? :readpartial
          IO.copy_stream(stdin_data, i)
        else
          i.write stdin_data
        end
      rescue Errno::EPIPE
      end
      i.close
      [out_reader.value, err_reader.value, t.value]
    }
  end
  module_function :capture3

  # Open3.capture2 captures the standard output of a command.
  #
  #   stdout_str, status = Open3.capture2([env,] cmd... [, opts])
  #
  # The arguments env, cmd and opts are passed to Open3.popen3 except
  # <code>opts[:stdin_data]</code> and <code>opts[:binmode]</code>.  See Process.spawn.
  #
  # If <code>opts[:stdin_data]</code> is specified, it is sent to the command's standard input.
  #
  # If <code>opts[:binmode]</code> is true, internal pipes are set to binary mode.
  #
  # Example:
  #
  #   # factor is a command for integer factorization.
  #   o, s = Open3.capture2("factor", :stdin_data=>"42")
  #   p o #=> "42: 2 3 7\n"
  #
  #   # generate x**2 graph in png using gnuplot.
  #   gnuplot_commands = <<"End"
  #     set terminal png
  #     plot x**2, "-" with lines
  #     1 14
  #     2 1
  #     3 8
  #     4 5
  #     e
  #   End
  #   image, s = Open3.capture2("gnuplot", :stdin_data=>gnuplot_commands, :binmode=>true)
  #
  def capture2(*cmd)
    if Hash === cmd.last
      opts = cmd.pop.dup
    else
      opts = {}
    end

    stdin_data = opts.delete(:stdin_data)
    binmode = opts.delete(:binmode)

    popen2(*cmd, opts) {|i, o, t|
      if binmode
        i.binmode
        o.binmode
      end
      out_reader = Thread.new { o.read }
      if stdin_data
        begin
          if stdin_data.respond_to? :readpartial
            IO.copy_stream(stdin_data, i)
          else
            i.write stdin_data
          end
        rescue Errno::EPIPE
        end
      end
      i.close
      [out_reader.value, t.value]
    }
  end
  module_function :capture2

  # Open3.capture2e captures the standard output and the standard error of a command.
  #
  #   stdout_and_stderr_str, status = Open3.capture2e([env,] cmd... [, opts])
  #
  # The arguments env, cmd and opts are passed to Open3.popen3 except
  # <code>opts[:stdin_data]</code> and <code>opts[:binmode]</code>.  See Process.spawn.
  #
  # If <code>opts[:stdin_data]</code> is specified, it is sent to the command's standard input.
  #
  # If <code>opts[:binmode]</code> is true, internal pipes are set to binary mode.
  #
  # Example:
  #
  #   # capture make log
  #   make_log, s = Open3.capture2e("make")
  #
  def capture2e(*cmd)
    if Hash === cmd.last
      opts = cmd.pop.dup
    else
      opts = {}
    end

    stdin_data = opts.delete(:stdin_data)
    binmode = opts.delete(:binmode)

    popen2e(*cmd, opts) {|i, oe, t|
      if binmode
        i.binmode
        oe.binmode
      end
      outerr_reader = Thread.new { oe.read }
      if stdin_data
        begin
          if stdin_data.respond_to? :readpartial
            IO.copy_stream(stdin_data, i)
          else
            i.write stdin_data
          end
        rescue Errno::EPIPE
        end
      end
      i.close
      [outerr_reader.value, t.value]
    }
  end
  module_function :capture2e

  # Open3.pipeline_rw starts a list of commands as a pipeline with pipes
  # which connect to stdin of the first command and stdout of the last command.
  #
  #   Open3.pipeline_rw(cmd1, cmd2, ... [, opts]) {|first_stdin, last_stdout, wait_threads|
  #     ...
  #   }
  #
  #   first_stdin, last_stdout, wait_threads = Open3.pipeline_rw(cmd1, cmd2, ... [, opts])
  #   ...
  #   first_stdin.close
  #   last_stdout.close
  #
  # Each cmd is a string or an array.
  # If it is an array, the elements are passed to Process.spawn.
  #
  #   cmd:
  #     commandline                              command line string which is passed to a shell
  #     [env, commandline, opts]                 command line string which is passed to a shell
  #     [env, cmdname, arg1, ..., opts]          command name and one or more arguments (no shell)
  #     [env, [cmdname, argv0], arg1, ..., opts] command name and arguments including argv[0] (no shell)
  #
  #   Note that env and opts are optional, as for Process.spawn.
  #
  # The options to pass to Process.spawn are constructed by merging
  # +opts+, the last hash element of the array, and
  # specifications for the pipes between each of the commands.
  #
  # Example:
  #
  #   Open3.pipeline_rw("tr -dc A-Za-z", "wc -c") {|i, o, ts|
  #     i.puts "All persons more than a mile high to leave the court."
  #     i.close
  #     p o.gets #=> "42\n"
  #   }
  #
  #   Open3.pipeline_rw("sort", "cat -n") {|stdin, stdout, wait_thrs|
  #     stdin.puts "foo"
  #     stdin.puts "bar"
  #     stdin.puts "baz"
  #     stdin.close     # send EOF to sort.
  #     p stdout.read   #=> "     1\tbar\n     2\tbaz\n     3\tfoo\n"
  #   }
  def pipeline_rw(*cmds, &block)
    if Hash === cmds.last
      opts = cmds.pop.dup
    else
      opts = {}
    end

    in_r, in_w = IO.pipe
    opts[:in] = in_r
    in_w.sync = true

    out_r, out_w = IO.pipe
    opts[:out] = out_w

    pipeline_run(cmds, opts, [in_r, out_w], [in_w, out_r], &block)
  end
  module_function :pipeline_rw

  # Open3.pipeline_r starts a list of commands as a pipeline with a pipe
  # which connects to stdout of the last command.
  #
  #   Open3.pipeline_r(cmd1, cmd2, ... [, opts]) {|last_stdout, wait_threads|
  #     ...
  #   }
  #
  #   last_stdout, wait_threads = Open3.pipeline_r(cmd1, cmd2, ... [, opts])
  #   ...
  #   last_stdout.close
  #
  # Each cmd is a string or an array.
  # If it is an array, the elements are passed to Process.spawn.
  #
  #   cmd:
  #     commandline                              command line string which is passed to a shell
  #     [env, commandline, opts]                 command line string which is passed to a shell
  #     [env, cmdname, arg1, ..., opts]          command name and one or more arguments (no shell)
  #     [env, [cmdname, argv0], arg1, ..., opts] command name and arguments including argv[0] (no shell)
  #
  #   Note that env and opts are optional, as for Process.spawn.
  #
  # Example:
  #
  #   Open3.pipeline_r("zcat /var/log/apache2/access.log.*.gz",
  #                    [{"LANG"=>"C"}, "grep", "GET /favicon.ico"],
  #                    "logresolve") {|o, ts|
  #     o.each_line {|line|
  #       ...
  #     }
  #   }
  #
  #   Open3.pipeline_r("yes", "head -10") {|o, ts|
  #     p o.read      #=> "y\ny\ny\ny\ny\ny\ny\ny\ny\ny\n"
  #     p ts[0].value #=> #<Process::Status: pid 24910 SIGPIPE (signal 13)>
  #     p ts[1].value #=> #<Process::Status: pid 24913 exit 0>
  #   }
  #
  def pipeline_r(*cmds, &block)
    if Hash === cmds.last
      opts = cmds.pop.dup
    else
      opts = {}
    end

    out_r, out_w = IO.pipe
    opts[:out] = out_w

    pipeline_run(cmds, opts, [out_w], [out_r], &block)
  end
  module_function :pipeline_r

  # Open3.pipeline_w starts a list of commands as a pipeline with a pipe
  # which connects to stdin of the first command.
  #
  #   Open3.pipeline_w(cmd1, cmd2, ... [, opts]) {|first_stdin, wait_threads|
  #     ...
  #   }
  #
  #   first_stdin, wait_threads = Open3.pipeline_w(cmd1, cmd2, ... [, opts])
  #   ...
  #   first_stdin.close
  #
  # Each cmd is a string or an array.
  # If it is an array, the elements are passed to Process.spawn.
  #
  #   cmd:
  #     commandline                              command line string which is passed to a shell
  #     [env, commandline, opts]                 command line string which is passed to a shell
  #     [env, cmdname, arg1, ..., opts]          command name and one or more arguments (no shell)
  #     [env, [cmdname, argv0], arg1, ..., opts] command name and arguments including argv[0] (no shell)
  #
  #   Note that env and opts are optional, as for Process.spawn.
  #
  # Example:
  #
  #   Open3.pipeline_w("bzip2 -c", :out=>"/tmp/hello.bz2") {|i, ts|
  #     i.puts "hello"
  #   }
  #
  def pipeline_w(*cmds, &block)
    if Hash === cmds.last
      opts = cmds.pop.dup
    else
      opts = {}
    end

    in_r, in_w = IO.pipe
    opts[:in] = in_r
    in_w.sync = true

    pipeline_run(cmds, opts, [in_r], [in_w], &block)
  end
  module_function :pipeline_w

  # Open3.pipeline_start starts a list of commands as a pipeline.
  # No pipes are created for stdin of the first command and
  # stdout of the last command.
  #
  #   Open3.pipeline_start(cmd1, cmd2, ... [, opts]) {|wait_threads|
  #     ...
  #   }
  #
  #   wait_threads = Open3.pipeline_start(cmd1, cmd2, ... [, opts])
  #   ...
  #
  # Each cmd is a string or an array.
  # If it is an array, the elements are passed to Process.spawn.
  #
  #   cmd:
  #     commandline                              command line string which is passed to a shell
  #     [env, commandline, opts]                 command line string which is passed to a shell
  #     [env, cmdname, arg1, ..., opts]          command name and one or more arguments (no shell)
  #     [env, [cmdname, argv0], arg1, ..., opts] command name and arguments including argv[0] (no shell)
  #
  #   Note that env and opts are optional, as for Process.spawn.
  #
  # Example:
  #
  #   # Run xeyes in 10 seconds.
  #   Open3.pipeline_start("xeyes") {|ts|
  #     sleep 10
  #     t = ts[0]
  #     Process.kill("TERM", t.pid)
  #     p t.value #=> #<Process::Status: pid 911 SIGTERM (signal 15)>
  #   }
  #
  #   # Convert pdf to ps and send it to a printer.
  #   # Collect error message of pdftops and lpr.
  #   pdf_file = "paper.pdf"
  #   printer = "printer-name"
  #   err_r, err_w = IO.pipe
  #   Open3.pipeline_start(["pdftops", pdf_file, "-"],
  #                        ["lpr", "-P#{printer}"],
  #                        :err=>err_w) {|ts|
  #     err_w.close
  #     p err_r.read # error messages of pdftops and lpr.
  #   }
  #
  def pipeline_start(*cmds, &block)
    if Hash === cmds.last
      opts = cmds.pop.dup
    else
      opts = {}
    end

    if block
      pipeline_run(cmds, opts, [], [], &block)
    else
      ts, = pipeline_run(cmds, opts, [], [])
      ts
    end
  end
  module_function :pipeline_start

  # Open3.pipeline starts a list of commands as a pipeline.
  # It waits for the completion of the commands.
  # No pipes are created for stdin of the first command and
  # stdout of the last command.
  #
  #   status_list = Open3.pipeline(cmd1, cmd2, ... [, opts])
  #
  # Each cmd is a string or an array.
  # If it is an array, the elements are passed to Process.spawn.
  #
  #   cmd:
  #     commandline                              command line string which is passed to a shell
  #     [env, commandline, opts]                 command line string which is passed to a shell
  #     [env, cmdname, arg1, ..., opts]          command name and one or more arguments (no shell)
  #     [env, [cmdname, argv0], arg1, ..., opts] command name and arguments including argv[0] (no shell)
  #
  #   Note that env and opts are optional, as Process.spawn.
  #
  # Example:
  #
  #   fname = "/usr/share/man/man1/ruby.1.gz"
  #   p Open3.pipeline(["zcat", fname], "nroff -man", "less")
  #   #=> [#<Process::Status: pid 11817 exit 0>,
  #   #    #<Process::Status: pid 11820 exit 0>,
  #   #    #<Process::Status: pid 11828 exit 0>]
  #
  #   fname = "/usr/share/man/man1/ls.1.gz"
  #   Open3.pipeline(["zcat", fname], "nroff -man", "colcrt")
  #
  #   # convert PDF to PS and send to a printer by lpr
  #   pdf_file = "paper.pdf"
  #   printer = "printer-name"
  #   Open3.pipeline(["pdftops", pdf_file, "-"],
  #                  ["lpr", "-P#{printer}"])
  #
  #   # count lines
  #   Open3.pipeline("sort", "uniq -c", :in=>"names.txt", :out=>"count")
  #
  #   # cyclic pipeline
  #   r,w = IO.pipe
  #   w.print "ibase=14\n10\n"
  #   Open3.pipeline("bc", "tee /dev/tty", :in=>r, :out=>w)
  #   #=> 14
  #   #   18
  #   #   22
  #   #   30
  #   #   42
  #   #   58
  #   #   78
  #   #   106
  #   #   202
  #
  def pipeline(*cmds)
    if Hash === cmds.last
      opts = cmds.pop.dup
    else
      opts = {}
    end

    pipeline_run(cmds, opts, [], []) {|ts|
      ts.map(&:value)
    }
  end
  module_function :pipeline

  def pipeline_run(cmds, pipeline_opts, child_io, parent_io) # :nodoc:
    if cmds.empty?
      raise ArgumentError, "no commands"
    end

    opts_base = pipeline_opts.dup
    opts_base.delete :in
    opts_base.delete :out

    wait_thrs = []
    r = nil
    cmds.each_with_index {|cmd, i|
      cmd_opts = opts_base.dup
      if String === cmd
        cmd = [cmd]
      else
        cmd_opts.update cmd.pop if Hash === cmd.last
      end
      if i == 0
        if !cmd_opts.include?(:in)
          if pipeline_opts.include?(:in)
            cmd_opts[:in] = pipeline_opts[:in]
          end
        end
      else
        cmd_opts[:in] = r
      end
      if i != cmds.length - 1
        r2, w2 = IO.pipe
        cmd_opts[:out] = w2
      else
        if !cmd_opts.include?(:out)
          if pipeline_opts.include?(:out)
            cmd_opts[:out] = pipeline_opts[:out]
          end
        end
      end
      pid = spawn(*cmd, cmd_opts)
      wait_thrs << Process.detach(pid)
      r&.close
      w2&.close
      r = r2
    }
    result = parent_io + [wait_thrs]
    child_io.each(&:close)
    if defined? yield
      begin
        return yield(*result)
      ensure
        parent_io.each(&:close)
        wait_thrs.each(&:join)
      end
    end
    result
  end
  module_function :pipeline_run
  class << self
    private :pipeline_run
  end

end

# JRuby uses different popen logic on Windows, require it here to reuse wrapper methods above.
require 'open3/jruby_windows' if RUBY_ENGINE == 'jruby' && JRuby::Util::ON_WINDOWS
PK}$[$ۏ�@@ruby/did_you_mean.rbnu�[���require_relative "did_you_mean/version"
require_relative "did_you_mean/core_ext/name_error"

require_relative "did_you_mean/spell_checker"
require_relative 'did_you_mean/spell_checkers/name_error_checkers'
require_relative 'did_you_mean/spell_checkers/method_name_checker'
require_relative 'did_you_mean/spell_checkers/key_error_checker'
require_relative 'did_you_mean/spell_checkers/null_checker'
require_relative 'did_you_mean/spell_checkers/require_path_checker'
require_relative 'did_you_mean/spell_checkers/pattern_key_name_checker'
require_relative 'did_you_mean/formatter'
require_relative 'did_you_mean/tree_spell_checker'

# The +DidYouMean+ gem adds functionality to suggest possible method/class
# names upon errors such as +NameError+ and +NoMethodError+. In Ruby 2.3 or
# later, it is automatically activated during startup.
#
# @example
#
#   methosd
#   # => NameError: undefined local variable or method `methosd' for main:Object
#   #   Did you mean?  methods
#   #                  method
#
#   OBject
#   # => NameError: uninitialized constant OBject
#   #    Did you mean?  Object
#
#   @full_name = "Yuki Nishijima"
#   first_name, last_name = full_name.split(" ")
#   # => NameError: undefined local variable or method `full_name' for main:Object
#   #    Did you mean?  @full_name
#
#   @@full_name = "Yuki Nishijima"
#   @@full_anme
#   # => NameError: uninitialized class variable @@full_anme in Object
#   #    Did you mean?  @@full_name
#
#   full_name = "Yuki Nishijima"
#   full_name.starts_with?("Y")
#   # => NoMethodError: undefined method `starts_with?' for "Yuki Nishijima":String
#   #    Did you mean?  start_with?
#
#   hash = {foo: 1, bar: 2, baz: 3}
#   hash.fetch(:fooo)
#   # => KeyError: key not found: :fooo
#   #    Did you mean?  :foo
#
#
# == Disabling +did_you_mean+
#
# Occasionally, you may want to disable the +did_you_mean+ gem for e.g.
# debugging issues in the error object itself. You can disable it entirely by
# specifying +--disable-did_you_mean+ option to the +ruby+ command:
#
#   $ ruby --disable-did_you_mean -e "1.zeor?"
#   -e:1:in `<main>': undefined method `zeor?' for 1:Integer (NameError)
#
# When you do not have direct access to the +ruby+ command (e.g.
# +rails console+, +irb+), you could applyoptions using the +RUBYOPT+
# environment variable:
#
#   $ RUBYOPT='--disable-did_you_mean' irb
#   irb:0> 1.zeor?
#   # => NoMethodError (undefined method `zeor?' for 1:Integer)
#
#
# == Getting the original error message
#
# Sometimes, you do not want to disable the gem entirely, but need to get the
# original error message without suggestions (e.g. testing). In this case, you
# could use the +#original_message+ method on the error object:
#
#   no_method_error = begin
#                       1.zeor?
#                     rescue NoMethodError => error
#                       error
#                     end
#
#   no_method_error.message
#   # => NoMethodError (undefined method `zeor?' for 1:Integer)
#   #    Did you mean?  zero?
#
#   no_method_error.original_message
#   # => NoMethodError (undefined method `zeor?' for 1:Integer)
#
module DidYouMean
  # Map of error types and spell checker objects.
  @spell_checkers = Hash.new(NullChecker)

  # Returns a sharable hash map of error types and spell checker objects.
  def self.spell_checkers
    @spell_checkers
  end

  # Adds +DidYouMean+ functionality to an error using a given spell checker
  def self.correct_error(error_class, spell_checker)
    if defined?(Ractor)
      new_mapping = { **@spell_checkers, error_class.to_s => spell_checker }
      new_mapping.default = NullChecker

      @spell_checkers = Ractor.make_shareable(new_mapping)
    else
      spell_checkers[error_class.to_s] = spell_checker
    end

    error_class.prepend(Correctable) if error_class.is_a?(Class) && !(error_class < Correctable)
  end

  correct_error NameError, NameErrorCheckers
  correct_error KeyError, KeyErrorChecker
  correct_error NoMethodError, MethodNameChecker
  correct_error LoadError, RequirePathChecker if RUBY_VERSION >= '2.8.0'
  correct_error NoMatchingPatternKeyError, PatternKeyNameChecker if defined?(::NoMatchingPatternKeyError)

  # TODO: Remove on 3.3:
  class DeprecatedMapping # :nodoc:
    def []=(key, value)
      warn "Calling `DidYouMean::SPELL_CHECKERS[#{key.to_s}] = #{value.to_s}' has been deprecated. " \
           "Please call `DidYouMean.correct_error(#{key.to_s}, #{value.to_s})' instead."

      DidYouMean.correct_error(key, value)
    end

    def merge!(hash)
      warn "Calling `DidYouMean::SPELL_CHECKERS.merge!(error_name => spell_checker)' has been deprecated. " \
           "Please call `DidYouMean.correct_error(error_name, spell_checker)' instead."

      hash.each do |error_class, spell_checker|
        DidYouMean.correct_error(error_class, spell_checker)
      end
    end
  end

  # TODO: Remove on 3.3:
  SPELL_CHECKERS = DeprecatedMapping.new
  deprecate_constant :SPELL_CHECKERS
  private_constant :DeprecatedMapping

  # Returns the currently set formatter. By default, it is set to +DidYouMean::Formatter+.
  def self.formatter
    if defined?(Ractor)
      Ractor.current[:__did_you_mean_formatter__] || Formatter
    else
      Formatter
    end
  end

  # Updates the primary formatter used to format the suggestions.
  def self.formatter=(formatter)
    if defined?(Ractor)
      Ractor.current[:__did_you_mean_formatter__] = formatter
    end
  end
end
PK}$[?@�##ruby/drb/version.rbnu�[���module DRb
  VERSION = "2.1.0"
end
PK}$[D[���ruby/drb/timeridconv.rbnu�[���# frozen_string_literal: false
require_relative 'drb'
require 'monitor'

module DRb

  # Timer id conversion keeps objects alive for a certain amount of time after
  # their last access.  The default time period is 600 seconds and can be
  # changed upon initialization.
  #
  # To use TimerIdConv:
  #
  #  DRb.install_id_conv TimerIdConv.new 60 # one minute

  class TimerIdConv < DRbIdConv
    class TimerHolder2 # :nodoc:
      include MonitorMixin

      class InvalidIndexError < RuntimeError; end

      def initialize(keeping=600)
        super()
        @sentinel = Object.new
        @gc = {}
        @renew = {}
        @keeping = keeping
        @expires = nil
      end

      def add(obj)
        synchronize do
          rotate
          key = obj.__id__
          @renew[key] = obj
          invoke_keeper
          return key
        end
      end

      def fetch(key)
        synchronize do
          rotate
          obj = peek(key)
          raise InvalidIndexError if obj == @sentinel
          @renew[key] = obj # KeepIt
          return obj
        end
      end

      private
      def peek(key)
        return @renew.fetch(key) { @gc.fetch(key, @sentinel) }
      end

      def invoke_keeper
        return if @expires
        @expires = Time.now + @keeping
        on_gc
      end

      def on_gc
        return unless Thread.main.alive?
        return if @expires.nil?
        Thread.new { rotate } if @expires < Time.now
        ObjectSpace.define_finalizer(Object.new) {on_gc}
      end

      def rotate
        synchronize do
          if @expires &.< Time.now
            @gc = @renew      # GCed
            @renew = {}
            @expires = @gc.empty? ? nil : Time.now + @keeping
          end
        end
      end
    end

    # Creates a new TimerIdConv which will hold objects for +keeping+ seconds.
    def initialize(keeping=600)
      @holder = TimerHolder2.new(keeping)
    end

    def to_obj(ref) # :nodoc:
      return super if ref.nil?
      @holder.fetch(ref)
    rescue TimerHolder2::InvalidIndexError
      raise "invalid reference"
    end

    def to_id(obj) # :nodoc:
      return @holder.add(obj)
    end
  end
end

# DRb.install_id_conv(TimerIdConv.new)
PK}$[��4ruby/drb/eq.rbnu�[���# frozen_string_literal: false
module DRb
  class DRbObject # :nodoc:
    def ==(other)
      return false unless DRbObject === other
     (@ref == other.__drbref) && (@uri == other.__drburi)
    end

    def hash
      [@uri, @ref].hash
    end

    alias eql? ==
  end
end
PK}$[*Y)		ruby/drb/invokemethod.rbnu�[���# frozen_string_literal: false
# for ruby-1.8.0

module DRb # :nodoc: all
  class DRbServer
    module InvokeMethod18Mixin
      def block_yield(x)
        if x.size == 1 && x[0].class == Array
          x[0] = DRbArray.new(x[0])
        end
        @block.call(*x)
      end

      def perform_with_block
        @obj.__send__(@msg_id, *@argv) do |*x|
          jump_error = nil
          begin
            block_value = block_yield(x)
          rescue LocalJumpError
            jump_error = $!
          end
          if jump_error
            case jump_error.reason
            when :break
              break(jump_error.exit_value)
            else
              raise jump_error
            end
          end
          block_value
        end
      end
    end
  end
end
PK}$[Ew|��ruby/drb/extservm.rbnu�[���# frozen_string_literal: false
=begin
 external service manager
        Copyright (c) 2000 Masatoshi SEKI
=end

require_relative 'drb'
require 'monitor'

module DRb
  class ExtServManager
    include DRbUndumped
    include MonitorMixin

    @@command = {}

    def self.command
      @@command
    end

    def self.command=(cmd)
      @@command = cmd
    end

    def initialize
      super()
      @cond = new_cond
      @servers = {}
      @waiting = []
      @queue = Thread::Queue.new
      @thread = invoke_thread
      @uri = nil
    end
    attr_accessor :uri

    def service(name)
      synchronize do
        while true
          server = @servers[name]
          return server if server && server.alive? # server may be `false'
          invoke_service(name)
          @cond.wait
        end
      end
    end

    def regist(name, ro)
      synchronize do
        @servers[name] = ro
        @cond.signal
      end
      self
    end

    def unregist(name)
      synchronize do
        @servers.delete(name)
      end
    end

    private
    def invoke_thread
      Thread.new do
        while name = @queue.pop
          invoke_service_command(name, @@command[name])
        end
      end
    end

    def invoke_service(name)
      @queue.push(name)
    end

    def invoke_service_command(name, command)
      raise "invalid command. name: #{name}" unless command
      synchronize do
        return if @servers.include?(name)
        @servers[name] = false
      end
      uri = @uri || DRb.uri
      if command.respond_to? :to_ary
        command = command.to_ary + [uri, name]
        pid = spawn(*command)
      else
        pid = spawn("#{command} #{uri} #{name}")
      end
      th = Process.detach(pid)
      th[:drb_service] = name
      th
    end
  end
end
PK}$[�+��ruby/drb/gw.rbnu�[���# frozen_string_literal: false
require_relative 'drb'
require 'monitor'

module DRb

  # Gateway id conversion forms a gateway between different DRb protocols or
  # networks.
  #
  # The gateway needs to install this id conversion and create servers for
  # each of the protocols or networks it will be a gateway between.  It then
  # needs to create a server that attaches to each of these networks.  For
  # example:
  #
  #   require 'drb/drb'
  #   require 'drb/unix'
  #   require 'drb/gw'
  #
  #   DRb.install_id_conv DRb::GWIdConv.new
  #   gw = DRb::GW.new
  #   s1 = DRb::DRbServer.new 'drbunix:/path/to/gateway', gw
  #   s2 = DRb::DRbServer.new 'druby://example:10000', gw
  #
  #   s1.thread.join
  #   s2.thread.join
  #
  # Each client must register services with the gateway, for example:
  #
  #   DRb.start_service 'drbunix:', nil # an anonymous server
  #   gw = DRbObject.new nil, 'drbunix:/path/to/gateway'
  #   gw[:unix] = some_service
  #   DRb.thread.join

  class GWIdConv < DRbIdConv
    def to_obj(ref) # :nodoc:
      if Array === ref && ref[0] == :DRbObject
        return DRbObject.new_with(ref[1], ref[2])
      end
      super(ref)
    end
  end

  # The GW provides a synchronized store for participants in the gateway to
  # communicate.

  class GW
    include MonitorMixin

    # Creates a new GW

    def initialize
      super()
      @hash = {}
    end

    # Retrieves +key+ from the GW

    def [](key)
      synchronize do
        @hash[key]
      end
    end

    # Stores value +v+ at +key+ in the GW

    def []=(key, v)
      synchronize do
        @hash[key] = v
      end
    end
  end

  class DRbObject # :nodoc:
    def self._load(s)
      uri, ref = Marshal.load(s)
      if DRb.uri == uri
        return ref ? DRb.to_obj(ref) : DRb.front
      end

      self.new_with(DRb.uri, [:DRbObject, uri, ref])
    end

    def _dump(lv)
      if DRb.uri == @uri
        if Array === @ref && @ref[0] == :DRbObject
          Marshal.dump([@ref[1], @ref[2]])
        else
          Marshal.dump([@uri, @ref]) # ??
        end
      else
        Marshal.dump([DRb.uri, [:DRbObject, @uri, @ref]])
      end
    end
  end
end

=begin
DRb.install_id_conv(DRb::GWIdConv.new)

front = DRb::GW.new

s1 = DRb::DRbServer.new('drbunix:/tmp/gw_b_a', front)
s2 = DRb::DRbServer.new('drbunix:/tmp/gw_b_c', front)

s1.thread.join
s2.thread.join
=end

=begin
# foo.rb

require 'drb/drb'

class Foo
  include DRbUndumped
  def initialize(name, peer=nil)
    @name = name
    @peer = peer
  end

  def ping(obj)
    puts "#{@name}: ping: #{obj.inspect}"
    @peer.ping(self) if @peer
  end
end
=end

=begin
# gw_a.rb
require 'drb/unix'
require 'foo'

obj = Foo.new('a')
DRb.start_service("drbunix:/tmp/gw_a", obj)

robj = DRbObject.new_with_uri('drbunix:/tmp/gw_b_a')
robj[:a] = obj

DRb.thread.join
=end

=begin
# gw_c.rb
require 'drb/unix'
require 'foo'

foo = Foo.new('c', nil)

DRb.start_service("drbunix:/tmp/gw_c", nil)

robj = DRbObject.new_with_uri("drbunix:/tmp/gw_b_c")

puts "c->b"
a = robj[:a]
sleep 2

a.ping(foo)

DRb.thread.join
=end

PK}$[ы>�qqruby/drb/acl.rbnu�[���# frozen_string_literal: false
# Copyright (c) 2000,2002,2003 Masatoshi SEKI
#
# acl.rb is copyrighted free software by Masatoshi SEKI.
# You can redistribute it and/or modify it under the same terms as Ruby.

require 'ipaddr'

##
# Simple Access Control Lists.
#
# Access control lists are composed of "allow" and "deny" halves to control
# access.  Use "all" or "*" to match any address.  To match a specific address
# use any address or address mask that IPAddr can understand.
#
# Example:
#
#   list = %w[
#     deny all
#     allow 192.168.1.1
#     allow ::ffff:192.168.1.2
#     allow 192.168.1.3
#   ]
#
#   # From Socket#peeraddr, see also ACL#allow_socket?
#   addr = ["AF_INET", 10, "lc630", "192.168.1.3"]
#
#   acl = ACL.new
#   p acl.allow_addr?(addr) # => true
#
#   acl = ACL.new(list, ACL::DENY_ALLOW)
#   p acl.allow_addr?(addr) # => true

class ACL

  ##
  # The current version of ACL

  VERSION=["2.0.0"]

  ##
  # An entry in an ACL

  class ACLEntry

    ##
    # Creates a new entry using +str+.
    #
    # +str+ may be "*" or "all" to match any address, an IP address string
    # to match a specific address, an IP address mask per IPAddr, or one
    # containing "*" to match part of an IPv4 address.
    #
    # IPAddr::InvalidPrefixError may be raised when an IP network
    # address with an invalid netmask/prefix is given.

    def initialize(str)
      if str == '*' or str == 'all'
        @pat = [:all]
      elsif str.include?('*')
        @pat = [:name, dot_pat(str)]
      else
        begin
          @pat = [:ip, IPAddr.new(str)]
        rescue IPAddr::InvalidPrefixError
          # In this case, `str` shouldn't be a host name pattern
          # because it contains a slash.
          raise
        rescue ArgumentError
          @pat = [:name, dot_pat(str)]
        end
      end
    end

    private

    ##
    # Creates a regular expression to match IPv4 addresses

    def dot_pat_str(str)
      list = str.split('.').collect { |s|
        (s == '*') ? '.+' : s
      }
      list.join("\\.")
    end

    private

    ##
    # Creates a Regexp to match an address.

    def dot_pat(str)
      /\A#{dot_pat_str(str)}\z/
    end

    public

    ##
    # Matches +addr+ against this entry.

    def match(addr)
      case @pat[0]
      when :all
        true
      when :ip
        begin
          ipaddr = IPAddr.new(addr[3])
          ipaddr = ipaddr.ipv4_mapped if @pat[1].ipv6? && ipaddr.ipv4?
        rescue ArgumentError
          return false
        end
        (@pat[1].include?(ipaddr)) ? true : false
      when :name
        (@pat[1] =~ addr[2]) ? true : false
      else
        false
      end
    end
  end

  ##
  # A list of ACLEntry objects.  Used to implement the allow and deny halves
  # of an ACL

  class ACLList

    ##
    # Creates an empty ACLList

    def initialize
      @list = []
    end

    public

    ##
    # Matches +addr+ against each ACLEntry in this list.

    def match(addr)
      @list.each do |e|
        return true if e.match(addr)
      end
      false
    end

    public

    ##
    # Adds +str+ as an ACLEntry in this list

    def add(str)
      @list.push(ACLEntry.new(str))
    end

  end

  ##
  # Default to deny

  DENY_ALLOW = 0

  ##
  # Default to allow

  ALLOW_DENY = 1

  ##
  # Creates a new ACL from +list+ with an evaluation +order+ of DENY_ALLOW or
  # ALLOW_DENY.
  #
  # An ACL +list+ is an Array of "allow" or "deny" and an address or address
  # mask or "all" or "*" to match any address:
  #
  #   %w[
  #     deny all
  #     allow 192.0.2.2
  #     allow 192.0.2.128/26
  #   ]

  def initialize(list=nil, order = DENY_ALLOW)
    @order = order
    @deny = ACLList.new
    @allow = ACLList.new
    install_list(list) if list
  end

  public

  ##
  # Allow connections from Socket +soc+?

  def allow_socket?(soc)
    allow_addr?(soc.peeraddr)
  end

  public

  ##
  # Allow connections from addrinfo +addr+?  It must be formatted like
  # Socket#peeraddr:
  #
  #   ["AF_INET", 10, "lc630", "192.0.2.1"]

  def allow_addr?(addr)
    case @order
    when DENY_ALLOW
      return true if @allow.match(addr)
      return false if @deny.match(addr)
      return true
    when ALLOW_DENY
      return false if @deny.match(addr)
      return true if @allow.match(addr)
      return false
    else
      false
    end
  end

  public

  ##
  # Adds +list+ of ACL entries to this ACL.

  def install_list(list)
    i = 0
    while i < list.size
      permission, domain = list.slice(i,2)
      case permission.downcase
      when 'allow'
        @allow.add(domain)
      when 'deny'
        @deny.add(domain)
      else
        raise "Invalid ACL entry #{list}"
      end
      i += 2
    end
  end

end
PK}$[��,�}}ruby/drb/weakidconv.rbnu�[���# frozen_string_literal: false
require_relative 'drb'
require 'monitor'

module DRb

  # To use WeakIdConv:
  #
  #  DRb.start_service(nil, nil, {:idconv => DRb::WeakIdConv.new})

  class WeakIdConv < DRbIdConv
    class WeakSet
      include MonitorMixin
      def initialize
        super()
        @immutable = {}
        @map = ObjectSpace::WeakMap.new
      end

      def add(obj)
        synchronize do
          begin
            @map[obj] = self
          rescue ArgumentError
            @immutable[obj.__id__] = obj
          end
          return obj.__id__
        end
      end

      def fetch(ref)
        synchronize do
          @immutable.fetch(ref) {
            @map.each { |key, _|
              return key if key.__id__ == ref
            }
            raise RangeError.new("invalid reference")
          }
        end
      end
    end

    def initialize()
      super()
      @weak_set = WeakSet.new
    end

    def to_obj(ref) # :nodoc:
      return super if ref.nil?
      @weak_set.fetch(ref)
    end

    def to_id(obj) # :nodoc:
      return @weak_set.add(obj)
    end
  end
end

# DRb.install_id_conv(WeakIdConv.new)
PK}$[�k�:..ruby/drb/ssl.rbnu�[���# frozen_string_literal: false
require 'socket'
require 'openssl'
require_relative 'drb'
require 'singleton'

module DRb

  # The protocol for DRb over an SSL socket
  #
  # The URI for a DRb socket over SSL is:
  # <code>drbssl://<host>:<port>?<option></code>.  The option is optional
  class DRbSSLSocket < DRbTCPSocket

    # SSLConfig handles the needed SSL information for establishing a
    # DRbSSLSocket connection, including generating the X509 / RSA pair.
    #
    # An instance of this config can be passed to DRbSSLSocket.new,
    # DRbSSLSocket.open and DRbSSLSocket.open_server
    #
    # See DRb::DRbSSLSocket::SSLConfig.new for more details
    class SSLConfig

      # Default values for a SSLConfig instance.
      #
      # See DRb::DRbSSLSocket::SSLConfig.new for more details
      DEFAULT = {
        :SSLCertificate       => nil,
        :SSLPrivateKey        => nil,
        :SSLClientCA          => nil,
        :SSLCACertificatePath => nil,
        :SSLCACertificateFile => nil,
        :SSLTmpDhCallback     => nil,
        :SSLVerifyMode        => ::OpenSSL::SSL::VERIFY_NONE,
        :SSLVerifyDepth       => nil,
        :SSLVerifyCallback    => nil,   # custom verification
        :SSLCertificateStore  => nil,
        # Must specify if you use auto generated certificate.
        :SSLCertName          => nil,   # e.g. [["CN","fqdn.example.com"]]
        :SSLCertComment       => "Generated by Ruby/OpenSSL"
      }

      # Create a new DRb::DRbSSLSocket::SSLConfig instance
      #
      # The DRb::DRbSSLSocket will take either a +config+ Hash or an instance
      # of SSLConfig, and will setup the certificate for its session for the
      # configuration. If want it to generate a generic certificate, the bare
      # minimum is to provide the :SSLCertName
      #
      # === Config options
      #
      # From +config+ Hash:
      #
      # :SSLCertificate ::
      #   An instance of OpenSSL::X509::Certificate.  If this is not provided,
      #   then a generic X509 is generated, with a correspond :SSLPrivateKey
      #
      # :SSLPrivateKey ::
      #   A private key instance, like OpenSSL::PKey::RSA.  This key must be
      #   the key that signed the :SSLCertificate
      #
      # :SSLClientCA ::
      #   An OpenSSL::X509::Certificate, or Array of certificates that will
      #   used as ClientCAs in the SSL Context
      #
      # :SSLCACertificatePath ::
      #   A path to the directory of CA certificates.  The certificates must
      #   be in PEM format.
      #
      # :SSLCACertificateFile ::
      #   A path to a CA certificate file, in PEM format.
      #
      # :SSLTmpDhCallback ::
      #   A DH callback. See OpenSSL::SSL::SSLContext.tmp_dh_callback
      #
      # :SSLVerifyMode ::
      #   This is the SSL verification mode.  See OpenSSL::SSL::VERIFY_* for
      #   available modes.  The default is OpenSSL::SSL::VERIFY_NONE
      #
      # :SSLVerifyDepth ::
      #   Number of CA certificates to walk, when verifying a certificate
      #   chain.
      #
      # :SSLVerifyCallback ::
      #   A callback to be used for additional verification.  See
      #   OpenSSL::SSL::SSLContext.verify_callback
      #
      # :SSLCertificateStore ::
      #   A OpenSSL::X509::Store used for verification of certificates
      #
      # :SSLCertName ::
      #   Issuer name for the certificate.  This is required when generating
      #   the certificate (if :SSLCertificate and :SSLPrivateKey were not
      #   given).  The value of this is to be an Array of pairs:
      #
      #     [["C", "Raleigh"], ["ST","North Carolina"],
      #      ["CN","fqdn.example.com"]]
      #
      #   See also OpenSSL::X509::Name
      #
      # :SSLCertComment ::
      #   A comment to be used for generating the certificate.  The default is
      #   "Generated by Ruby/OpenSSL"
      #
      #
      # === Example
      #
      # These values can be added after the fact, like a Hash.
      #
      #   require 'drb/ssl'
      #   c = DRb::DRbSSLSocket::SSLConfig.new {}
      #   c[:SSLCertificate] =
      #     OpenSSL::X509::Certificate.new(File.read('mycert.crt'))
      #   c[:SSLPrivateKey] = OpenSSL::PKey::RSA.new(File.read('mycert.key'))
      #   c[:SSLVerifyMode] = OpenSSL::SSL::VERIFY_PEER
      #   c[:SSLCACertificatePath] = "/etc/ssl/certs/"
      #   c.setup_certificate
      #
      # or
      #
      #   require 'drb/ssl'
      #   c = DRb::DRbSSLSocket::SSLConfig.new({
      #           :SSLCertName => [["CN" => DRb::DRbSSLSocket.getservername]]
      #           })
      #   c.setup_certificate
      #
      def initialize(config)
        @config  = config
        @cert    = config[:SSLCertificate]
        @pkey    = config[:SSLPrivateKey]
        @ssl_ctx = nil
      end

      # A convenience method to access the values like a Hash
      def [](key);
        @config[key] || DEFAULT[key]
      end

      # Connect to IO +tcp+, with context of the current certificate
      # configuration
      def connect(tcp)
        ssl = ::OpenSSL::SSL::SSLSocket.new(tcp, @ssl_ctx)
        ssl.sync = true
        ssl.connect
        ssl
      end

      # Accept connection to IO +tcp+, with context of the current certificate
      # configuration
      def accept(tcp)
        ssl = OpenSSL::SSL::SSLSocket.new(tcp, @ssl_ctx)
        ssl.sync = true
        ssl.accept
        ssl
      end

      # Ensures that :SSLCertificate and :SSLPrivateKey have been provided
      # or that a new certificate is generated with the other parameters
      # provided.
      def setup_certificate
        if @cert && @pkey
          return
        end

        rsa = OpenSSL::PKey::RSA.new(2048){|p, n|
          next unless self[:verbose]
          case p
          when 0; $stderr.putc "."  # BN_generate_prime
          when 1; $stderr.putc "+"  # BN_generate_prime
          when 2; $stderr.putc "*"  # searching good prime,
                                    # n = #of try,
                                    # but also data from BN_generate_prime
          when 3; $stderr.putc "\n" # found good prime, n==0 - p, n==1 - q,
                                    # but also data from BN_generate_prime
          else;   $stderr.putc "*"  # BN_generate_prime
          end
        }

        cert = OpenSSL::X509::Certificate.new
        cert.version = 3
        cert.serial = 0
        name = OpenSSL::X509::Name.new(self[:SSLCertName])
        cert.subject = name
        cert.issuer = name
        cert.not_before = Time.now
        cert.not_after = Time.now + (365*24*60*60)
        cert.public_key = rsa.public_key

        ef = OpenSSL::X509::ExtensionFactory.new(nil,cert)
        cert.extensions = [
          ef.create_extension("basicConstraints","CA:FALSE"),
          ef.create_extension("subjectKeyIdentifier", "hash") ]
        ef.issuer_certificate = cert
        cert.add_extension(ef.create_extension("authorityKeyIdentifier",
                                               "keyid:always,issuer:always"))
        if comment = self[:SSLCertComment]
          cert.add_extension(ef.create_extension("nsComment", comment))
        end
        cert.sign(rsa, "SHA256")

        @cert = cert
        @pkey = rsa
      end

      # Establish the OpenSSL::SSL::SSLContext with the configuration
      # parameters provided.
      def setup_ssl_context
        ctx = ::OpenSSL::SSL::SSLContext.new
        ctx.cert            = @cert
        ctx.key             = @pkey
        ctx.client_ca       = self[:SSLClientCA]
        ctx.ca_path         = self[:SSLCACertificatePath]
        ctx.ca_file         = self[:SSLCACertificateFile]
        ctx.tmp_dh_callback = self[:SSLTmpDhCallback]
        ctx.verify_mode     = self[:SSLVerifyMode]
        ctx.verify_depth    = self[:SSLVerifyDepth]
        ctx.verify_callback = self[:SSLVerifyCallback]
        ctx.cert_store      = self[:SSLCertificateStore]
        @ssl_ctx = ctx
      end
    end

    # Parse the dRuby +uri+ for an SSL connection.
    #
    # Expects drbssl://...
    #
    # Raises DRbBadScheme or DRbBadURI if +uri+ is not matching or malformed
    def self.parse_uri(uri) # :nodoc:
      if /\Adrbssl:\/\/(.*?):(\d+)(\?(.*))?\z/ =~ uri
        host = $1
        port = $2.to_i
        option = $4
        [host, port, option]
      else
        raise(DRbBadScheme, uri) unless uri.start_with?('drbssl:')
        raise(DRbBadURI, 'can\'t parse uri:' + uri)
      end
    end

    # Return an DRb::DRbSSLSocket instance as a client-side connection,
    # with the SSL connected.  This is called from DRb::start_service or while
    # connecting to a remote object:
    #
    #   DRb.start_service 'drbssl://localhost:0', front, config
    #
    # +uri+ is the URI we are connected to,
    # <code>'drbssl://localhost:0'</code> above, +config+ is our
    # configuration.  Either a Hash or DRb::DRbSSLSocket::SSLConfig
    def self.open(uri, config)
      host, port, = parse_uri(uri)
      soc = TCPSocket.open(host, port)
      ssl_conf = SSLConfig::new(config)
      ssl_conf.setup_ssl_context
      ssl = ssl_conf.connect(soc)
      self.new(uri, ssl, ssl_conf, true)
    end

    # Returns a DRb::DRbSSLSocket instance as a server-side connection, with
    # the SSL connected.  This is called from DRb::start_service or while
    # connecting to a remote object:
    #
    #   DRb.start_service 'drbssl://localhost:0', front, config
    #
    # +uri+ is the URI we are connected to,
    # <code>'drbssl://localhost:0'</code> above, +config+ is our
    # configuration.  Either a Hash or DRb::DRbSSLSocket::SSLConfig
    def self.open_server(uri, config)
      uri = 'drbssl://:0' unless uri
      host, port, = parse_uri(uri)
      if host.size == 0
        host = getservername
        soc = open_server_inaddr_any(host, port)
      else
        soc = TCPServer.open(host, port)
      end
      port = soc.addr[1] if port == 0
      @uri = "drbssl://#{host}:#{port}"

      ssl_conf = SSLConfig.new(config)
      ssl_conf.setup_certificate
      ssl_conf.setup_ssl_context
      self.new(@uri, soc, ssl_conf, false)
    end

    # This is a convenience method to parse +uri+ and separate out any
    # additional options appended in the +uri+.
    #
    # Returns an option-less uri and the option => [uri,option]
    #
    # The +config+ is completely unused, so passing nil is sufficient.
    def self.uri_option(uri, config) # :nodoc:
      host, port, option = parse_uri(uri)
      return "drbssl://#{host}:#{port}", option
    end

    # Create a DRb::DRbSSLSocket instance.
    #
    # +uri+ is the URI we are connected to.
    # +soc+ is the tcp socket we are bound to.
    # +config+ is our configuration. Either a Hash or SSLConfig
    # +is_established+ is a boolean of whether +soc+ is currently established
    #
    # This is called automatically based on the DRb protocol.
    def initialize(uri, soc, config, is_established)
      @ssl = is_established ? soc : nil
      super(uri, soc.to_io, config)
    end

    # Returns the SSL stream
    def stream; @ssl; end # :nodoc:

    # Closes the SSL stream before closing the dRuby connection.
    def close # :nodoc:
      if @ssl
        @ssl.close
        @ssl = nil
      end
      super
    end

    def accept # :nodoc:
      begin
      while true
        soc = accept_or_shutdown
        return nil unless soc
        break if (@acl ? @acl.allow_socket?(soc) : true)
        soc.close
      end
      begin
        ssl = @config.accept(soc)
      rescue Exception
        soc.close
        raise
      end
      self.class.new(uri, ssl, @config, true)
      rescue OpenSSL::SSL::SSLError
        warn("#{$!.message} (#{$!.class})", uplevel: 0) if @config[:verbose]
        retry
      end
    end
  end

  DRbProtocol.add_protocol(DRbSSLSocket)
end
PK}$[���^DDruby/drb/extserv.rbnu�[���# frozen_string_literal: false
=begin
 external service
        Copyright (c) 2000,2002 Masatoshi SEKI
=end

require_relative 'drb'
require 'monitor'

module DRb
  class ExtServ
    include MonitorMixin
    include DRbUndumped

    def initialize(there, name, server=nil)
      super()
      @server = server || DRb::primary_server
      @name = name
      ro = DRbObject.new(nil, there)
      synchronize do
        @invoker = ro.regist(name, DRbObject.new(self, @server.uri))
      end
    end
    attr_reader :server

    def front
      DRbObject.new(nil, @server.uri)
    end

    def stop_service
      synchronize do
        @invoker.unregist(@name)
        server = @server
        @server = nil
        server.stop_service
        true
      end
    end

    def alive?
      @server ? @server.alive? : false
    end
  end
end
PK}$[�����ruby/drb/drb.rbnu�[���# frozen_string_literal: false
#
# = drb/drb.rb
#
# Distributed Ruby: _dRuby_ version 2.0.4
#
# Copyright (c) 1999-2003 Masatoshi SEKI.  You can redistribute it and/or
# modify it under the same terms as Ruby.
#
# Author:: Masatoshi SEKI
#
# Documentation:: William Webber (william@williamwebber.com)
#
# == Overview
#
# dRuby is a distributed object system for Ruby.  It allows an object in one
# Ruby process to invoke methods on an object in another Ruby process on the
# same or a different machine.
#
# The Ruby standard library contains the core classes of the dRuby package.
# However, the full package also includes access control lists and the
# Rinda tuple-space distributed task management system, as well as a
# large number of samples.  The full dRuby package can be downloaded from
# the dRuby home page (see *References*).
#
# For an introduction and examples of usage see the documentation to the
# DRb module.
#
# == References
#
# [http://www2a.biglobe.ne.jp/~seki/ruby/druby.html]
#    The dRuby home page, in Japanese.  Contains the full dRuby package
#    and links to other Japanese-language sources.
#
# [http://www2a.biglobe.ne.jp/~seki/ruby/druby.en.html]
#    The English version of the dRuby home page.
#
# [http://pragprog.com/book/sidruby/the-druby-book]
#    The dRuby Book: Distributed and Parallel Computing with Ruby
#    by Masatoshi Seki and Makoto Inoue
#
# [http://www.ruby-doc.org/docs/ProgrammingRuby/html/ospace.html]
#   The chapter from *Programming* *Ruby* by Dave Thomas and Andy Hunt
#   which discusses dRuby.
#
# [http://www.clio.ne.jp/home/web-i31s/Flotuard/Ruby/PRC2K_seki/dRuby.en.html]
#   Translation of presentation on Ruby by Masatoshi Seki.

require 'socket'
require 'io/wait'
require 'monitor'
require_relative 'eq'

#
# == Overview
#
# dRuby is a distributed object system for Ruby.  It is written in
# pure Ruby and uses its own protocol.  No add-in services are needed
# beyond those provided by the Ruby runtime, such as TCP sockets.  It
# does not rely on or interoperate with other distributed object
# systems such as CORBA, RMI, or .NET.
#
# dRuby allows methods to be called in one Ruby process upon a Ruby
# object located in another Ruby process, even on another machine.
# References to objects can be passed between processes.  Method
# arguments and return values are dumped and loaded in marshalled
# format.  All of this is done transparently to both the caller of the
# remote method and the object that it is called upon.
#
# An object in a remote process is locally represented by a
# DRb::DRbObject instance.  This acts as a sort of proxy for the
# remote object.  Methods called upon this DRbObject instance are
# forwarded to its remote object.  This is arranged dynamically at run
# time.  There are no statically declared interfaces for remote
# objects, such as CORBA's IDL.
#
# dRuby calls made into a process are handled by a DRb::DRbServer
# instance within that process.  This reconstitutes the method call,
# invokes it upon the specified local object, and returns the value to
# the remote caller.  Any object can receive calls over dRuby.  There
# is no need to implement a special interface, or mixin special
# functionality.  Nor, in the general case, does an object need to
# explicitly register itself with a DRbServer in order to receive
# dRuby calls.
#
# One process wishing to make dRuby calls upon another process must
# somehow obtain an initial reference to an object in the remote
# process by some means other than as the return value of a remote
# method call, as there is initially no remote object reference it can
# invoke a method upon.  This is done by attaching to the server by
# URI.  Each DRbServer binds itself to a URI such as
# 'druby://example.com:8787'.  A DRbServer can have an object attached
# to it that acts as the server's *front* *object*.  A DRbObject can
# be explicitly created from the server's URI.  This DRbObject's
# remote object will be the server's front object.  This front object
# can then return references to other Ruby objects in the DRbServer's
# process.
#
# Method calls made over dRuby behave largely the same as normal Ruby
# method calls made within a process.  Method calls with blocks are
# supported, as are raising exceptions.  In addition to a method's
# standard errors, a dRuby call may also raise one of the
# dRuby-specific errors, all of which are subclasses of DRb::DRbError.
#
# Any type of object can be passed as an argument to a dRuby call or
# returned as its return value.  By default, such objects are dumped
# or marshalled at the local end, then loaded or unmarshalled at the
# remote end.  The remote end therefore receives a copy of the local
# object, not a distributed reference to it; methods invoked upon this
# copy are executed entirely in the remote process, not passed on to
# the local original.  This has semantics similar to pass-by-value.
#
# However, if an object cannot be marshalled, a dRuby reference to it
# is passed or returned instead.  This will turn up at the remote end
# as a DRbObject instance.  All methods invoked upon this remote proxy
# are forwarded to the local object, as described in the discussion of
# DRbObjects.  This has semantics similar to the normal Ruby
# pass-by-reference.
#
# The easiest way to signal that we want an otherwise marshallable
# object to be passed or returned as a DRbObject reference, rather
# than marshalled and sent as a copy, is to include the
# DRb::DRbUndumped mixin module.
#
# dRuby supports calling remote methods with blocks.  As blocks (or
# rather the Proc objects that represent them) are not marshallable,
# the block executes in the local, not the remote, context.  Each
# value yielded to the block is passed from the remote object to the
# local block, then the value returned by each block invocation is
# passed back to the remote execution context to be collected, before
# the collected values are finally returned to the local context as
# the return value of the method invocation.
#
# == Examples of usage
#
# For more dRuby samples, see the +samples+ directory in the full
# dRuby distribution.
#
# === dRuby in client/server mode
#
# This illustrates setting up a simple client-server drb
# system.  Run the server and client code in different terminals,
# starting the server code first.
#
# ==== Server code
#
#   require 'drb/drb'
#
#   # The URI for the server to connect to
#   URI="druby://localhost:8787"
#
#   class TimeServer
#
#     def get_current_time
#       return Time.now
#     end
#
#   end
#
#   # The object that handles requests on the server
#   FRONT_OBJECT=TimeServer.new
#
#   DRb.start_service(URI, FRONT_OBJECT)
#   # Wait for the drb server thread to finish before exiting.
#   DRb.thread.join
#
# ==== Client code
#
#   require 'drb/drb'
#
#   # The URI to connect to
#   SERVER_URI="druby://localhost:8787"
#
#   # Start a local DRbServer to handle callbacks.
#   #
#   # Not necessary for this small example, but will be required
#   # as soon as we pass a non-marshallable object as an argument
#   # to a dRuby call.
#   #
#   # Note: this must be called at least once per process to take any effect.
#   # This is particularly important if your application forks.
#   DRb.start_service
#
#   timeserver = DRbObject.new_with_uri(SERVER_URI)
#   puts timeserver.get_current_time
#
# === Remote objects under dRuby
#
# This example illustrates returning a reference to an object
# from a dRuby call.  The Logger instances live in the server
# process.  References to them are returned to the client process,
# where methods can be invoked upon them.  These methods are
# executed in the server process.
#
# ==== Server code
#
#   require 'drb/drb'
#
#   URI="druby://localhost:8787"
#
#   class Logger
#
#       # Make dRuby send Logger instances as dRuby references,
#       # not copies.
#       include DRb::DRbUndumped
#
#       def initialize(n, fname)
#           @name = n
#           @filename = fname
#       end
#
#       def log(message)
#           File.open(@filename, "a") do |f|
#               f.puts("#{Time.now}: #{@name}: #{message}")
#           end
#       end
#
#   end
#
#   # We have a central object for creating and retrieving loggers.
#   # This retains a local reference to all loggers created.  This
#   # is so an existing logger can be looked up by name, but also
#   # to prevent loggers from being garbage collected.  A dRuby
#   # reference to an object is not sufficient to prevent it being
#   # garbage collected!
#   class LoggerFactory
#
#       def initialize(bdir)
#           @basedir = bdir
#           @loggers = {}
#       end
#
#       def get_logger(name)
#           if !@loggers.has_key? name
#               # make the filename safe, then declare it to be so
#               fname = name.gsub(/[.\/\\\:]/, "_")
#               @loggers[name] = Logger.new(name, @basedir + "/" + fname)
#           end
#           return @loggers[name]
#       end
#
#   end
#
#   FRONT_OBJECT=LoggerFactory.new("/tmp/dlog")
#
#   DRb.start_service(URI, FRONT_OBJECT)
#   DRb.thread.join
#
# ==== Client code
#
#   require 'drb/drb'
#
#   SERVER_URI="druby://localhost:8787"
#
#   DRb.start_service
#
#   log_service=DRbObject.new_with_uri(SERVER_URI)
#
#   ["loga", "logb", "logc"].each do |logname|
#
#       logger=log_service.get_logger(logname)
#
#       logger.log("Hello, world!")
#       logger.log("Goodbye, world!")
#       logger.log("=== EOT ===")
#
#   end
#
# == Security
#
# As with all network services, security needs to be considered when
# using dRuby.  By allowing external access to a Ruby object, you are
# not only allowing outside clients to call the methods you have
# defined for that object, but by default to execute arbitrary Ruby
# code on your server.  Consider the following:
#
#    # !!! UNSAFE CODE !!!
#    ro = DRbObject::new_with_uri("druby://your.server.com:8989")
#    class << ro
#      undef :instance_eval  # force call to be passed to remote object
#    end
#    ro.instance_eval("`rm -rf *`")
#
# The dangers posed by instance_eval and friends are such that a
# DRbServer should only be used when clients are trusted.
#
# A DRbServer can be configured with an access control list to
# selectively allow or deny access from specified IP addresses.  The
# main druby distribution provides the ACL class for this purpose.  In
# general, this mechanism should only be used alongside, rather than
# as a replacement for, a good firewall.
#
# == dRuby internals
#
# dRuby is implemented using three main components: a remote method
# call marshaller/unmarshaller; a transport protocol; and an
# ID-to-object mapper.  The latter two can be directly, and the first
# indirectly, replaced, in order to provide different behaviour and
# capabilities.
#
# Marshalling and unmarshalling of remote method calls is performed by
# a DRb::DRbMessage instance.  This uses the Marshal module to dump
# the method call before sending it over the transport layer, then
# reconstitute it at the other end.  There is normally no need to
# replace this component, and no direct way is provided to do so.
# However, it is possible to implement an alternative marshalling
# scheme as part of an implementation of the transport layer.
#
# The transport layer is responsible for opening client and server
# network connections and forwarding dRuby request across them.
# Normally, it uses DRb::DRbMessage internally to manage marshalling
# and unmarshalling.  The transport layer is managed by
# DRb::DRbProtocol.  Multiple protocols can be installed in
# DRbProtocol at the one time; selection between them is determined by
# the scheme of a dRuby URI.  The default transport protocol is
# selected by the scheme 'druby:', and implemented by
# DRb::DRbTCPSocket.  This uses plain TCP/IP sockets for
# communication.  An alternative protocol, using UNIX domain sockets,
# is implemented by DRb::DRbUNIXSocket in the file drb/unix.rb, and
# selected by the scheme 'drbunix:'.  A sample implementation over
# HTTP can be found in the samples accompanying the main dRuby
# distribution.
#
# The ID-to-object mapping component maps dRuby object ids to the
# objects they refer to, and vice versa.  The implementation to use
# can be specified as part of a DRb::DRbServer's configuration.  The
# default implementation is provided by DRb::DRbIdConv.  It uses an
# object's ObjectSpace id as its dRuby id.  This means that the dRuby
# reference to that object only remains meaningful for the lifetime of
# the object's process and the lifetime of the object within that
# process.  A modified implementation is provided by DRb::TimerIdConv
# in the file drb/timeridconv.rb.  This implementation retains a local
# reference to all objects exported over dRuby for a configurable
# period of time (defaulting to ten minutes), to prevent them being
# garbage-collected within this time.  Another sample implementation
# is provided in sample/name.rb in the main dRuby distribution.  This
# allows objects to specify their own id or "name".  A dRuby reference
# can be made persistent across processes by having each process
# register an object using the same dRuby name.
#
module DRb

  # Superclass of all errors raised in the DRb module.
  class DRbError < RuntimeError; end

  # Error raised when an error occurs on the underlying communication
  # protocol.
  class DRbConnError < DRbError; end

  # Class responsible for converting between an object and its id.
  #
  # This, the default implementation, uses an object's local ObjectSpace
  # __id__ as its id.  This means that an object's identification over
  # drb remains valid only while that object instance remains alive
  # within the server runtime.
  #
  # For alternative mechanisms, see DRb::TimerIdConv in drb/timeridconv.rb
  # and DRbNameIdConv in sample/name.rb in the full drb distribution.
  class DRbIdConv

    # Convert an object reference id to an object.
    #
    # This implementation looks up the reference id in the local object
    # space and returns the object it refers to.
    def to_obj(ref)
      ObjectSpace._id2ref(ref)
    end

    # Convert an object into a reference id.
    #
    # This implementation returns the object's __id__ in the local
    # object space.
    def to_id(obj)
      case obj
      when Object
        obj.nil? ? nil : obj.__id__
      when BasicObject
        obj.__id__
      end
    end
  end

  # Mixin module making an object undumpable or unmarshallable.
  #
  # If an object which includes this module is returned by method
  # called over drb, then the object remains in the server space
  # and a reference to the object is returned, rather than the
  # object being marshalled and moved into the client space.
  module DRbUndumped
    def _dump(dummy)  # :nodoc:
      raise TypeError, 'can\'t dump'
    end
  end

  # Error raised by the DRb module when an attempt is made to refer to
  # the context's current drb server but the context does not have one.
  # See #current_server.
  class DRbServerNotFound < DRbError; end

  # Error raised by the DRbProtocol module when it cannot find any
  # protocol implementation support the scheme specified in a URI.
  class DRbBadURI < DRbError; end

  # Error raised by a dRuby protocol when it doesn't support the
  # scheme specified in a URI.  See DRb::DRbProtocol.
  class DRbBadScheme < DRbError; end

  # An exception wrapping a DRb::DRbUnknown object
  class DRbUnknownError < DRbError

    # Create a new DRbUnknownError for the DRb::DRbUnknown object +unknown+
    def initialize(unknown)
      @unknown = unknown
      super(unknown.name)
    end

    # Get the wrapped DRb::DRbUnknown object.
    attr_reader :unknown

    def self._load(s)  # :nodoc:
      Marshal::load(s)
    end

    def _dump(lv) # :nodoc:
      Marshal::dump(@unknown)
    end
  end

  # An exception wrapping an error object
  class DRbRemoteError < DRbError

    # Creates a new remote error that wraps the Exception +error+
    def initialize(error)
      @reason = error.class.to_s
      super("#{error.message} (#{error.class})")
      set_backtrace(error.backtrace)
    end

    # the class of the error, as a string.
    attr_reader :reason
  end

  # Class wrapping a marshalled object whose type is unknown locally.
  #
  # If an object is returned by a method invoked over drb, but the
  # class of the object is unknown in the client namespace, or
  # the object is a constant unknown in the client namespace, then
  # the still-marshalled object is returned wrapped in a DRbUnknown instance.
  #
  # If this object is passed as an argument to a method invoked over
  # drb, then the wrapped object is passed instead.
  #
  # The class or constant name of the object can be read from the
  # +name+ attribute.  The marshalled object is held in the +buf+
  # attribute.
  class DRbUnknown

    # Create a new DRbUnknown object.
    #
    # +buf+ is a string containing a marshalled object that could not
    # be unmarshalled.  +err+ is the error message that was raised
    # when the unmarshalling failed.  It is used to determine the
    # name of the unmarshalled object.
    def initialize(err, buf)
      case err.to_s
      when /uninitialized constant (\S+)/
        @name = $1
      when /undefined class\/module (\S+)/
        @name = $1
      else
        @name = nil
      end
      @buf = buf
    end

    # The name of the unknown thing.
    #
    # Class name for unknown objects; variable name for unknown
    # constants.
    attr_reader :name

    # Buffer contained the marshalled, unknown object.
    attr_reader :buf

    def self._load(s) # :nodoc:
      begin
        Marshal::load(s)
      rescue NameError, ArgumentError
        DRbUnknown.new($!, s)
      end
    end

    def _dump(lv) # :nodoc:
      @buf
    end

    # Attempt to load the wrapped marshalled object again.
    #
    # If the class of the object is now known locally, the object
    # will be unmarshalled and returned.  Otherwise, a new
    # but identical DRbUnknown object will be returned.
    def reload
      self.class._load(@buf)
    end

    # Create a DRbUnknownError exception containing this object.
    def exception
      DRbUnknownError.new(self)
    end
  end

  # An Array wrapper that can be sent to another server via DRb.
  #
  # All entries in the array will be dumped or be references that point to
  # the local server.

  class DRbArray

    # Creates a new DRbArray that either dumps or wraps all the items in the
    # Array +ary+ so they can be loaded by a remote DRb server.

    def initialize(ary)
      @ary = ary.collect { |obj|
        if obj.kind_of? DRbUndumped
          DRbObject.new(obj)
        else
          begin
            Marshal.dump(obj)
            obj
          rescue
            DRbObject.new(obj)
          end
        end
      }
    end

    def self._load(s) # :nodoc:
      Marshal::load(s)
    end

    def _dump(lv) # :nodoc:
      Marshal.dump(@ary)
    end
  end

  # Handler for sending and receiving drb messages.
  #
  # This takes care of the low-level marshalling and unmarshalling
  # of drb requests and responses sent over the wire between server
  # and client.  This relieves the implementor of a new drb
  # protocol layer with having to deal with these details.
  #
  # The user does not have to directly deal with this object in
  # normal use.
  class DRbMessage
    def initialize(config) # :nodoc:
      @load_limit = config[:load_limit]
      @argc_limit = config[:argc_limit]
    end

    def dump(obj, error=false)  # :nodoc:
      case obj
      when DRbUndumped
        obj = make_proxy(obj, error)
      when Object
        # nothing
      else
        obj = make_proxy(obj, error)
      end
      begin
        str = Marshal::dump(obj)
      rescue
        str = Marshal::dump(make_proxy(obj, error))
      end
      [str.size].pack('N') + str
    end

    def load(soc)  # :nodoc:
      begin
        sz = soc.read(4)        # sizeof (N)
      rescue
        raise(DRbConnError, $!.message, $!.backtrace)
      end
      raise(DRbConnError, 'connection closed') if sz.nil?
      raise(DRbConnError, 'premature header') if sz.size < 4
      sz = sz.unpack('N')[0]
      raise(DRbConnError, "too large packet #{sz}") if @load_limit < sz
      begin
        str = soc.read(sz)
      rescue
        raise(DRbConnError, $!.message, $!.backtrace)
      end
      raise(DRbConnError, 'connection closed') if str.nil?
      raise(DRbConnError, 'premature marshal format(can\'t read)') if str.size < sz
      DRb.mutex.synchronize do
        begin
          Marshal::load(str)
        rescue NameError, ArgumentError
          DRbUnknown.new($!, str)
        end
      end
    end

    def send_request(stream, ref, msg_id, arg, b) # :nodoc:
      ary = []
      ary.push(dump(ref.__drbref))
      ary.push(dump(msg_id.id2name))
      ary.push(dump(arg.length))
      arg.each do |e|
        ary.push(dump(e))
      end
      ary.push(dump(b))
      stream.write(ary.join(''))
    rescue
      raise(DRbConnError, $!.message, $!.backtrace)
    end

    def recv_request(stream) # :nodoc:
      ref = load(stream)
      ro = DRb.to_obj(ref)
      msg = load(stream)
      argc = load(stream)
      raise(DRbConnError, "too many arguments") if @argc_limit < argc
      argv = Array.new(argc, nil)
      argc.times do |n|
        argv[n] = load(stream)
      end
      block = load(stream)
      return ro, msg, argv, block
    end

    def send_reply(stream, succ, result)  # :nodoc:
      stream.write(dump(succ) + dump(result, !succ))
    rescue
      raise(DRbConnError, $!.message, $!.backtrace)
    end

    def recv_reply(stream)  # :nodoc:
      succ = load(stream)
      result = load(stream)
      [succ, result]
    end

    private
    def make_proxy(obj, error=false) # :nodoc:
      if error
        DRbRemoteError.new(obj)
      else
        DRbObject.new(obj)
      end
    end
  end

  # Module managing the underlying network protocol(s) used by drb.
  #
  # By default, drb uses the DRbTCPSocket protocol.  Other protocols
  # can be defined.  A protocol must define the following class methods:
  #
  #   [open(uri, config)] Open a client connection to the server at +uri+,
  #                       using configuration +config+.  Return a protocol
  #                       instance for this connection.
  #   [open_server(uri, config)] Open a server listening at +uri+,
  #                              using configuration +config+.  Return a
  #                              protocol instance for this listener.
  #   [uri_option(uri, config)] Take a URI, possibly containing an option
  #                             component (e.g. a trailing '?param=val'),
  #                             and return a [uri, option] tuple.
  #
  # All of these methods should raise a DRbBadScheme error if the URI
  # does not identify the protocol they support (e.g. "druby:" for
  # the standard Ruby protocol).  This is how the DRbProtocol module,
  # given a URI, determines which protocol implementation serves that
  # protocol.
  #
  # The protocol instance returned by #open_server must have the
  # following methods:
  #
  # [accept] Accept a new connection to the server.  Returns a protocol
  #          instance capable of communicating with the client.
  # [close] Close the server connection.
  # [uri] Get the URI for this server.
  #
  # The protocol instance returned by #open must have the following methods:
  #
  # [send_request (ref, msg_id, arg, b)]
  #      Send a request to +ref+ with the given message id and arguments.
  #      This is most easily implemented by calling DRbMessage.send_request,
  #      providing a stream that sits on top of the current protocol.
  # [recv_reply]
  #      Receive a reply from the server and return it as a [success-boolean,
  #      reply-value] pair.  This is most easily implemented by calling
  #      DRb.recv_reply, providing a stream that sits on top of the
  #      current protocol.
  # [alive?]
  #      Is this connection still alive?
  # [close]
  #      Close this connection.
  #
  # The protocol instance returned by #open_server().accept() must have
  # the following methods:
  #
  # [recv_request]
  #     Receive a request from the client and return a [object, message,
  #     args, block] tuple.  This is most easily implemented by calling
  #     DRbMessage.recv_request, providing a stream that sits on top of
  #     the current protocol.
  # [send_reply(succ, result)]
  #     Send a reply to the client.  This is most easily implemented
  #     by calling DRbMessage.send_reply, providing a stream that sits
  #     on top of the current protocol.
  # [close]
  #     Close this connection.
  #
  # A new protocol is registered with the DRbProtocol module using
  # the add_protocol method.
  #
  # For examples of other protocols, see DRbUNIXSocket in drb/unix.rb,
  # and HTTP0 in sample/http0.rb and sample/http0serv.rb in the full
  # drb distribution.
  module DRbProtocol

    # Add a new protocol to the DRbProtocol module.
    def add_protocol(prot)
      @protocol.push(prot)
    end
    module_function :add_protocol

    # Open a client connection to +uri+ with the configuration +config+.
    #
    # The DRbProtocol module asks each registered protocol in turn to
    # try to open the URI.  Each protocol signals that it does not handle that
    # URI by raising a DRbBadScheme error.  If no protocol recognises the
    # URI, then a DRbBadURI error is raised.  If a protocol accepts the
    # URI, but an error occurs in opening it, a DRbConnError is raised.
    def open(uri, config, first=true)
      @protocol.each do |prot|
        begin
          return prot.open(uri, config)
        rescue DRbBadScheme
        rescue DRbConnError
          raise($!)
        rescue
          raise(DRbConnError, "#{uri} - #{$!.inspect}")
        end
      end
      if first && (config[:auto_load] != false)
        auto_load(uri)
        return open(uri, config, false)
      end
      raise DRbBadURI, 'can\'t parse uri:' + uri
    end
    module_function :open

    # Open a server listening for connections at +uri+ with
    # configuration +config+.
    #
    # The DRbProtocol module asks each registered protocol in turn to
    # try to open a server at the URI.  Each protocol signals that it does
    # not handle that URI by raising a DRbBadScheme error.  If no protocol
    # recognises the URI, then a DRbBadURI error is raised.  If a protocol
    # accepts the URI, but an error occurs in opening it, the underlying
    # error is passed on to the caller.
    def open_server(uri, config, first=true)
      @protocol.each do |prot|
        begin
          return prot.open_server(uri, config)
        rescue DRbBadScheme
        end
      end
      if first && (config[:auto_load] != false)
        auto_load(uri)
        return open_server(uri, config, false)
      end
      raise DRbBadURI, 'can\'t parse uri:' + uri
    end
    module_function :open_server

    # Parse +uri+ into a [uri, option] pair.
    #
    # The DRbProtocol module asks each registered protocol in turn to
    # try to parse the URI.  Each protocol signals that it does not handle that
    # URI by raising a DRbBadScheme error.  If no protocol recognises the
    # URI, then a DRbBadURI error is raised.
    def uri_option(uri, config, first=true)
      @protocol.each do |prot|
        begin
          uri, opt = prot.uri_option(uri, config)
          # opt = nil if opt == ''
          return uri, opt
        rescue DRbBadScheme
        end
      end
      if first && (config[:auto_load] != false)
        auto_load(uri)
        return uri_option(uri, config, false)
      end
      raise DRbBadURI, 'can\'t parse uri:' + uri
    end
    module_function :uri_option

    def auto_load(uri)  # :nodoc:
      if /\Adrb([a-z0-9]+):/ =~ uri
        require("drb/#{$1}") rescue nil
      end
    end
    module_function :auto_load
  end

  # The default drb protocol which communicates over a TCP socket.
  #
  # The DRb TCP protocol URI looks like:
  # <code>druby://<host>:<port>?<option></code>.  The option is optional.

  class DRbTCPSocket
    # :stopdoc:
    private
    def self.parse_uri(uri)
      if /\Adruby:\/\/(.*?):(\d+)(\?(.*))?\z/ =~ uri
        host = $1
        port = $2.to_i
        option = $4
        [host, port, option]
      else
        raise(DRbBadScheme, uri) unless uri.start_with?('druby:')
        raise(DRbBadURI, 'can\'t parse uri:' + uri)
      end
    end

    public

    # Open a client connection to +uri+ (DRb URI string) using configuration
    # +config+.
    #
    # This can raise DRb::DRbBadScheme or DRb::DRbBadURI if +uri+ is not for a
    # recognized protocol.  See DRb::DRbServer.new for information on built-in
    # URI protocols.
    def self.open(uri, config)
      host, port, = parse_uri(uri)
      soc = TCPSocket.open(host, port)
      self.new(uri, soc, config)
    end

    # Returns the hostname of this server
    def self.getservername
      host = Socket::gethostname
      begin
        Socket::getaddrinfo(host, nil,
                                  Socket::AF_UNSPEC,
                                  Socket::SOCK_STREAM,
                                  0,
                                  Socket::AI_PASSIVE)[0][3]
      rescue
        'localhost'
      end
    end

    # For the families available for +host+, returns a TCPServer on +port+.
    # If +port+ is 0 the first available port is used.  IPv4 servers are
    # preferred over IPv6 servers.
    def self.open_server_inaddr_any(host, port)
      infos = Socket::getaddrinfo(host, nil,
                                  Socket::AF_UNSPEC,
                                  Socket::SOCK_STREAM,
                                  0,
                                  Socket::AI_PASSIVE)
      families = Hash[*infos.collect { |af, *_| af }.uniq.zip([]).flatten]
      return TCPServer.open('0.0.0.0', port) if families.has_key?('AF_INET')
      return TCPServer.open('::', port) if families.has_key?('AF_INET6')
      return TCPServer.open(port)
      # :stopdoc:
    end

    # Open a server listening for connections at +uri+ using
    # configuration +config+.
    def self.open_server(uri, config)
      uri = 'druby://:0' unless uri
      host, port, _ = parse_uri(uri)
      config = {:tcp_original_host => host}.update(config)
      if host.size == 0
        host = getservername
        soc = open_server_inaddr_any(host, port)
      else
        soc = TCPServer.open(host, port)
      end
      port = soc.addr[1] if port == 0
      config[:tcp_port] = port
      uri = "druby://#{host}:#{port}"
      self.new(uri, soc, config)
    end

    # Parse +uri+ into a [uri, option] pair.
    def self.uri_option(uri, config)
      host, port, option = parse_uri(uri)
      return "druby://#{host}:#{port}", option
    end

    # Create a new DRbTCPSocket instance.
    #
    # +uri+ is the URI we are connected to.
    # +soc+ is the tcp socket we are bound to.  +config+ is our
    # configuration.
    def initialize(uri, soc, config={})
      @uri = uri
      @socket = soc
      @config = config
      @acl = config[:tcp_acl]
      @msg = DRbMessage.new(config)
      set_sockopt(@socket)
      @shutdown_pipe_r, @shutdown_pipe_w = IO.pipe
    end

    # Get the URI that we are connected to.
    attr_reader :uri

    # Get the address of our TCP peer (the other end of the socket
    # we are bound to.
    def peeraddr
      @socket.peeraddr
    end

    # Get the socket.
    def stream; @socket; end

    # On the client side, send a request to the server.
    def send_request(ref, msg_id, arg, b)
      @msg.send_request(stream, ref, msg_id, arg, b)
    end

    # On the server side, receive a request from the client.
    def recv_request
      @msg.recv_request(stream)
    end

    # On the server side, send a reply to the client.
    def send_reply(succ, result)
      @msg.send_reply(stream, succ, result)
    end

    # On the client side, receive a reply from the server.
    def recv_reply
      @msg.recv_reply(stream)
    end

    public

    # Close the connection.
    #
    # If this is an instance returned by #open_server, then this stops
    # listening for new connections altogether.  If this is an instance
    # returned by #open or by #accept, then it closes this particular
    # client-server session.
    def close
      shutdown
      if @socket
        @socket.close
        @socket = nil
      end
      close_shutdown_pipe
    end

    def close_shutdown_pipe
      @shutdown_pipe_w.close
      @shutdown_pipe_r.close
    end
    private :close_shutdown_pipe

    # On the server side, for an instance returned by #open_server,
    # accept a client connection and return a new instance to handle
    # the server's side of this client-server session.
    def accept
      while true
        s = accept_or_shutdown
        return nil unless s
        break if (@acl ? @acl.allow_socket?(s) : true)
        s.close
      end
      if @config[:tcp_original_host].to_s.size == 0
        uri = "druby://#{s.addr[3]}:#{@config[:tcp_port]}"
      else
        uri = @uri
      end
      self.class.new(uri, s, @config)
    end

    def accept_or_shutdown
      readables, = IO.select([@socket, @shutdown_pipe_r])
      if readables.include? @shutdown_pipe_r
        return nil
      end
      @socket.accept
    end
    private :accept_or_shutdown

    # Graceful shutdown
    def shutdown
      @shutdown_pipe_w.close
    end

    # Check to see if this connection is alive.
    def alive?
      return false unless @socket
      if @socket.to_io.wait_readable(0)
        close
        return false
      end
      true
    end

    def set_sockopt(soc) # :nodoc:
      soc.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
    rescue IOError, Errno::ECONNRESET, Errno::EINVAL
      # closed/shutdown socket, ignore error
    end
  end

  module DRbProtocol
    @protocol = [DRbTCPSocket] # default
  end

  class DRbURIOption  # :nodoc:  I don't understand the purpose of this class...
    def initialize(option)
      @option = option.to_s
    end
    attr_reader :option
    def to_s; @option; end

    def ==(other)
      return false unless DRbURIOption === other
      @option == other.option
    end

    def hash
      @option.hash
    end

    alias eql? ==
  end

  # Object wrapping a reference to a remote drb object.
  #
  # Method calls on this object are relayed to the remote
  # object that this object is a stub for.
  class DRbObject

    # Unmarshall a marshalled DRbObject.
    #
    # If the referenced object is located within the local server, then
    # the object itself is returned.  Otherwise, a new DRbObject is
    # created to act as a stub for the remote referenced object.
    def self._load(s)
      uri, ref = Marshal.load(s)

      if DRb.here?(uri)
        obj = DRb.to_obj(ref)
        return obj
      end

      self.new_with(uri, ref)
    end

    # Creates a DRb::DRbObject given the reference information to the remote
    # host +uri+ and object +ref+.

    def self.new_with(uri, ref)
      it = self.allocate
      it.instance_variable_set(:@uri, uri)
      it.instance_variable_set(:@ref, ref)
      it
    end

    # Create a new DRbObject from a URI alone.
    def self.new_with_uri(uri)
      self.new(nil, uri)
    end

    # Marshall this object.
    #
    # The URI and ref of the object are marshalled.
    def _dump(lv)
      Marshal.dump([@uri, @ref])
    end

    # Create a new remote object stub.
    #
    # +obj+ is the (local) object we want to create a stub for.  Normally
    # this is +nil+.  +uri+ is the URI of the remote object that this
    # will be a stub for.
    def initialize(obj, uri=nil)
      @uri = nil
      @ref = nil
      case obj
      when Object
        is_nil = obj.nil?
      when BasicObject
        is_nil = false
      end

      if is_nil
        return if uri.nil?
        @uri, option = DRbProtocol.uri_option(uri, DRb.config)
        @ref = DRbURIOption.new(option) unless option.nil?
      else
        @uri = uri ? uri : (DRb.uri rescue nil)
        @ref = obj ? DRb.to_id(obj) : nil
      end
    end

    # Get the URI of the remote object.
    def __drburi
      @uri
    end

    # Get the reference of the object, if local.
    def __drbref
      @ref
    end

    undef :to_s
    undef :to_a if respond_to?(:to_a)

    # Routes respond_to? to the referenced remote object.
    def respond_to?(msg_id, priv=false)
      case msg_id
      when :_dump
        true
      when :marshal_dump
        false
      else
        method_missing(:respond_to?, msg_id, priv)
      end
    end

    # Routes method calls to the referenced remote object.
    ruby2_keywords def method_missing(msg_id, *a, &b)
      if DRb.here?(@uri)
        obj = DRb.to_obj(@ref)
        DRb.current_server.check_insecure_method(obj, msg_id)
        return obj.__send__(msg_id, *a, &b)
      end

      succ, result = self.class.with_friend(@uri) do
        DRbConn.open(@uri) do |conn|
          conn.send_message(self, msg_id, a, b)
        end
      end

      if succ
        return result
      elsif DRbUnknown === result
        raise result
      else
        bt = self.class.prepare_backtrace(@uri, result)
        result.set_backtrace(bt + caller)
        raise result
      end
    end

    # Given the +uri+ of another host executes the block provided.
    def self.with_friend(uri) # :nodoc:
      friend = DRb.fetch_server(uri)
      return yield() unless friend

      save = Thread.current['DRb']
      Thread.current['DRb'] = { 'server' => friend }
      return yield
    ensure
      Thread.current['DRb'] = save if friend
    end

    # Returns a modified backtrace from +result+ with the +uri+ where each call
    # in the backtrace came from.
    def self.prepare_backtrace(uri, result) # :nodoc:
      prefix = "(#{uri}) "
      bt = []
      result.backtrace.each do |x|
        break if /`__send__'$/ =~ x
        if /\A\(druby:\/\// =~ x
          bt.push(x)
        else
          bt.push(prefix + x)
        end
      end
      bt
    end

    def pretty_print(q)   # :nodoc:
      q.pp_object(self)
    end

    def pretty_print_cycle(q)   # :nodoc:
      q.object_address_group(self) {
        q.breakable
        q.text '...'
      }
    end
  end

  class ThreadObject
    include MonitorMixin

    def initialize(&blk)
      super()
      @wait_ev = new_cond
      @req_ev = new_cond
      @res_ev = new_cond
      @status = :wait
      @req = nil
      @res = nil
      @thread = Thread.new(self, &blk)
    end

    def alive?
      @thread.alive?
    end

    def kill
      @thread.kill
      @thread.join
    end

    def method_missing(msg, *arg, &blk)
      synchronize do
        @wait_ev.wait_until { @status == :wait }
        @req = [msg] + arg
        @status = :req
        @req_ev.broadcast
        @res_ev.wait_until { @status == :res }
        value = @res
        @req = @res = nil
        @status = :wait
        @wait_ev.broadcast
        return value
      end
    end

    def _execute()
      synchronize do
        @req_ev.wait_until { @status == :req }
        @res = yield(@req)
        @status = :res
        @res_ev.signal
      end
    end
  end

  # Class handling the connection between a DRbObject and the
  # server the real object lives on.
  #
  # This class maintains a pool of connections, to reduce the
  # overhead of starting and closing down connections for each
  # method call.
  #
  # This class is used internally by DRbObject.  The user does
  # not normally need to deal with it directly.
  class DRbConn
    POOL_SIZE = 16  # :nodoc:

    def self.make_pool
      ThreadObject.new do |queue|
        pool = []
        while true
          queue._execute do |message|
            case(message[0])
            when :take then
              remote_uri = message[1]
              conn = nil
              new_pool = []
              pool.each do |c|
                if conn.nil? and c.uri == remote_uri
                  conn = c if c.alive?
                else
                  new_pool.push c
                end
              end
              pool = new_pool
              conn
            when :store then
              conn = message[1]
              pool.unshift(conn)
              pool.pop.close while pool.size > POOL_SIZE
              conn
            else
              nil
            end
          end
        end
      end
    end
    @pool_proxy = nil

    def self.stop_pool
      @pool_proxy&.kill
      @pool_proxy = nil
    end

    def self.open(remote_uri)  # :nodoc:
      begin
        @pool_proxy = make_pool unless @pool_proxy&.alive?

        conn = @pool_proxy.take(remote_uri)
        conn = self.new(remote_uri) unless conn
        succ, result = yield(conn)
        return succ, result

      ensure
        if conn
          if succ
            @pool_proxy.store(conn)
          else
            conn.close
          end
        end
      end
    end

    def initialize(remote_uri)  # :nodoc:
      @uri = remote_uri
      @protocol = DRbProtocol.open(remote_uri, DRb.config)
    end
    attr_reader :uri  # :nodoc:

    def send_message(ref, msg_id, arg, block)  # :nodoc:
      @protocol.send_request(ref, msg_id, arg, block)
      @protocol.recv_reply
    end

    def close  # :nodoc:
      @protocol.close
      @protocol = nil
    end

    def alive?  # :nodoc:
      return false unless @protocol
      @protocol.alive?
    end
  end

  # Class representing a drb server instance.
  #
  # A DRbServer must be running in the local process before any incoming
  # dRuby calls can be accepted, or any local objects can be passed as
  # dRuby references to remote processes, even if those local objects are
  # never actually called remotely. You do not need to start a DRbServer
  # in the local process if you are only making outgoing dRuby calls
  # passing marshalled parameters.
  #
  # Unless multiple servers are being used, the local DRbServer is normally
  # started by calling DRb.start_service.
  class DRbServer
    @@acl = nil
    @@idconv = DRbIdConv.new
    @@secondary_server = nil
    @@argc_limit = 256
    @@load_limit = 0xffffffff
    @@verbose = false

    # Set the default value for the :argc_limit option.
    #
    # See #new().  The initial default value is 256.
    def self.default_argc_limit(argc)
      @@argc_limit = argc
    end

    # Set the default value for the :load_limit option.
    #
    # See #new().  The initial default value is 25 MB.
    def self.default_load_limit(sz)
      @@load_limit = sz
    end

    # Set the default access control list to +acl+.  The default ACL is +nil+.
    #
    # See also DRb::ACL and #new()
    def self.default_acl(acl)
      @@acl = acl
    end

    # Set the default value for the :id_conv option.
    #
    # See #new().  The initial default value is a DRbIdConv instance.
    def self.default_id_conv(idconv)
      @@idconv = idconv
    end

    # Set the default value of the :verbose option.
    #
    # See #new().  The initial default value is false.
    def self.verbose=(on)
      @@verbose = on
    end

    # Get the default value of the :verbose option.
    def self.verbose
      @@verbose
    end

    def self.make_config(hash={})  # :nodoc:
      default_config = {
        :idconv => @@idconv,
        :verbose => @@verbose,
        :tcp_acl => @@acl,
        :load_limit => @@load_limit,
        :argc_limit => @@argc_limit,
      }
      default_config.update(hash)
    end

    # Create a new DRbServer instance.
    #
    # +uri+ is the URI to bind to.  This is normally of the form
    # 'druby://<hostname>:<port>' where <hostname> is a hostname of
    # the local machine.  If nil, then the system's default hostname
    # will be bound to, on a port selected by the system; these value
    # can be retrieved from the +uri+ attribute.  'druby:' specifies
    # the default dRuby transport protocol: another protocol, such
    # as 'drbunix:', can be specified instead.
    #
    # +front+ is the front object for the server, that is, the object
    # to which remote method calls on the server will be passed.  If
    # nil, then the server will not accept remote method calls.
    #
    # If +config_or_acl+ is a hash, it is the configuration to
    # use for this server.  The following options are recognised:
    #
    # :idconv :: an id-to-object conversion object.  This defaults
    #            to an instance of the class DRb::DRbIdConv.
    # :verbose :: if true, all unsuccessful remote calls on objects
    #             in the server will be logged to $stdout. false
    #             by default.
    # :tcp_acl :: the access control list for this server.  See
    #             the ACL class from the main dRuby distribution.
    # :load_limit :: the maximum message size in bytes accepted by
    #                the server.  Defaults to 25 MB (26214400).
    # :argc_limit :: the maximum number of arguments to a remote
    #                method accepted by the server.  Defaults to
    #                256.
    # The default values of these options can be modified on
    # a class-wide basis by the class methods #default_argc_limit,
    # #default_load_limit, #default_acl, #default_id_conv,
    # and #verbose=
    #
    # If +config_or_acl+ is not a hash, but is not nil, it is
    # assumed to be the access control list for this server.
    # See the :tcp_acl option for more details.
    #
    # If no other server is currently set as the primary server,
    # this will become the primary server.
    #
    # The server will immediately start running in its own thread.
    def initialize(uri=nil, front=nil, config_or_acl=nil)
      if Hash === config_or_acl
        config = config_or_acl.dup
      else
        acl = config_or_acl || @@acl
        config = {
          :tcp_acl => acl
        }
      end

      @config = self.class.make_config(config)

      @protocol = DRbProtocol.open_server(uri, @config)
      @uri = @protocol.uri
      @exported_uri = [@uri]

      @front = front
      @idconv = @config[:idconv]

      @grp = ThreadGroup.new
      @thread = run

      DRb.regist_server(self)
    end

    # The URI of this DRbServer.
    attr_reader :uri

    # The main thread of this DRbServer.
    #
    # This is the thread that listens for and accepts connections
    # from clients, not that handles each client's request-response
    # session.
    attr_reader :thread

    # The front object of the DRbServer.
    #
    # This object receives remote method calls made on the server's
    # URI alone, with an object id.
    attr_reader :front

    # The configuration of this DRbServer
    attr_reader :config

    # Set whether to operate in verbose mode.
    #
    # In verbose mode, failed calls are logged to stdout.
    def verbose=(v); @config[:verbose]=v; end

    # Get whether the server is in verbose mode.
    #
    # In verbose mode, failed calls are logged to stdout.
    def verbose; @config[:verbose]; end

    # Is this server alive?
    def alive?
      @thread.alive?
    end

    # Is +uri+ the URI for this server?
    def here?(uri)
      @exported_uri.include?(uri)
    end

    # Stop this server.
    def stop_service
      DRb.remove_server(self)
      if  Thread.current['DRb'] && Thread.current['DRb']['server'] == self
        Thread.current['DRb']['stop_service'] = true
      else
        shutdown
      end
    end

    # Convert a dRuby reference to the local object it refers to.
    def to_obj(ref)
      return front if ref.nil?
      return front[ref.to_s] if DRbURIOption === ref
      @idconv.to_obj(ref)
    end

    # Convert a local object to a dRuby reference.
    def to_id(obj)
      return nil if obj.__id__ == front.__id__
      @idconv.to_id(obj)
    end

    private

    def shutdown
      current = Thread.current
      if @protocol.respond_to? :shutdown
        @protocol.shutdown
      else
        [@thread, *@grp.list].each { |thread|
          thread.kill unless thread == current # xxx: Thread#kill
        }
      end
      @thread.join unless @thread == current
    end

    ##
    # Starts the DRb main loop in a new thread.

    def run
      Thread.start do
        begin
          while main_loop
          end
        ensure
          @protocol.close if @protocol
        end
      end
    end

    # List of insecure methods.
    #
    # These methods are not callable via dRuby.
    INSECURE_METHOD = [
      :__send__
    ]

    # Has a method been included in the list of insecure methods?
    def insecure_method?(msg_id)
      INSECURE_METHOD.include?(msg_id)
    end

    # Coerce an object to a string, providing our own representation if
    # to_s is not defined for the object.
    def any_to_s(obj)
      "#{obj}:#{obj.class}"
    rescue
      Kernel.instance_method(:to_s).bind_call(obj)
    end

    # Check that a method is callable via dRuby.
    #
    # +obj+ is the object we want to invoke the method on. +msg_id+ is the
    # method name, as a Symbol.
    #
    # If the method is an insecure method (see #insecure_method?) a
    # SecurityError is thrown.  If the method is private or undefined,
    # a NameError is thrown.
    def check_insecure_method(obj, msg_id)
      return true if Proc === obj && msg_id == :__drb_yield
      raise(ArgumentError, "#{any_to_s(msg_id)} is not a symbol") unless Symbol == msg_id.class
      raise(SecurityError, "insecure method `#{msg_id}'") if insecure_method?(msg_id)

      case obj
      when Object
        if obj.private_methods.include?(msg_id)
          desc = any_to_s(obj)
          raise NoMethodError, "private method `#{msg_id}' called for #{desc}"
        elsif obj.protected_methods.include?(msg_id)
          desc = any_to_s(obj)
          raise NoMethodError, "protected method `#{msg_id}' called for #{desc}"
        else
          true
        end
      else
        if Kernel.instance_method(:private_methods).bind(obj).call.include?(msg_id)
          desc = any_to_s(obj)
          raise NoMethodError, "private method `#{msg_id}' called for #{desc}"
        elsif Kernel.instance_method(:protected_methods).bind(obj).call.include?(msg_id)
          desc = any_to_s(obj)
          raise NoMethodError, "protected method `#{msg_id}' called for #{desc}"
        else
          true
        end
      end
    end
    public :check_insecure_method

    class InvokeMethod  # :nodoc:
      def initialize(drb_server, client)
        @drb_server = drb_server
        @client = client
      end

      def perform
        @result = nil
        @succ = false
        setup_message

        if @block
          @result = perform_with_block
        else
          @result = perform_without_block
        end
        @succ = true
        case @result
        when Array
          if @msg_id == :to_ary
            @result = DRbArray.new(@result)
          end
        end
        return @succ, @result
      rescue NoMemoryError, SystemExit, SystemStackError, SecurityError
        raise
      rescue Exception
        @result = $!
        return @succ, @result
      end

      private
      def init_with_client
        obj, msg, argv, block = @client.recv_request
        @obj = obj
        @msg_id = msg.intern
        @argv = argv
        @block = block
      end

      def check_insecure_method
        @drb_server.check_insecure_method(@obj, @msg_id)
      end

      def setup_message
        init_with_client
        check_insecure_method
      end

      def perform_without_block
        if Proc === @obj && @msg_id == :__drb_yield
          if @argv.size == 1
            ary = @argv
          else
            ary = [@argv]
          end
          ary.collect(&@obj)[0]
        else
          @obj.__send__(@msg_id, *@argv)
        end
      end

    end

    require_relative 'invokemethod'
    class InvokeMethod
      include InvokeMethod18Mixin
    end

    def error_print(exception)
      exception.backtrace.inject(true) do |first, x|
        if first
          $stderr.puts "#{x}: #{exception} (#{exception.class})"
        else
          $stderr.puts "\tfrom #{x}"
        end
        false
      end
    end

    # The main loop performed by a DRbServer's internal thread.
    #
    # Accepts a connection from a client, and starts up its own
    # thread to handle it.  This thread loops, receiving requests
    # from the client, invoking them on a local object, and
    # returning responses, until the client closes the connection
    # or a local method call fails.
    def main_loop
      client0 = @protocol.accept
      return nil if !client0
      Thread.start(client0) do |client|
        @grp.add Thread.current
        Thread.current['DRb'] = { 'client' => client ,
                                  'server' => self }
        DRb.mutex.synchronize do
          client_uri = client.uri
          @exported_uri << client_uri unless @exported_uri.include?(client_uri)
        end
        loop do
          begin
            succ = false
            invoke_method = InvokeMethod.new(self, client)
            succ, result = invoke_method.perform
            error_print(result) if !succ && verbose
            unless DRbConnError === result && result.message == 'connection closed'
              client.send_reply(succ, result)
            end
          rescue Exception => e
            error_print(e) if verbose
          ensure
            client.close unless succ
            if Thread.current['DRb']['stop_service']
              shutdown
              break
            end
            break unless succ
          end
        end
      end
    end
  end

  @primary_server = nil

  # Start a dRuby server locally.
  #
  # The new dRuby server will become the primary server, even
  # if another server is currently the primary server.
  #
  # +uri+ is the URI for the server to bind to.  If nil,
  # the server will bind to random port on the default local host
  # name and use the default dRuby protocol.
  #
  # +front+ is the server's front object.  This may be nil.
  #
  # +config+ is the configuration for the new server.  This may
  # be nil.
  #
  # See DRbServer::new.
  def start_service(uri=nil, front=nil, config=nil)
    @primary_server = DRbServer.new(uri, front, config)
  end
  module_function :start_service

  # The primary local dRuby server.
  #
  # This is the server created by the #start_service call.
  attr_accessor :primary_server
  module_function :primary_server=, :primary_server

  # Get the 'current' server.
  #
  # In the context of execution taking place within the main
  # thread of a dRuby server (typically, as a result of a remote
  # call on the server or one of its objects), the current
  # server is that server.  Otherwise, the current server is
  # the primary server.
  #
  # If the above rule fails to find a server, a DRbServerNotFound
  # error is raised.
  def current_server
    drb = Thread.current['DRb']
    server = (drb && drb['server']) ? drb['server'] : @primary_server
    raise DRbServerNotFound unless server
    return server
  end
  module_function :current_server

  # Stop the local dRuby server.
  #
  # This operates on the primary server.  If there is no primary
  # server currently running, it is a noop.
  def stop_service
    @primary_server.stop_service if @primary_server
    @primary_server = nil
  end
  module_function :stop_service

  # Get the URI defining the local dRuby space.
  #
  # This is the URI of the current server.  See #current_server.
  def uri
    drb = Thread.current['DRb']
    client = (drb && drb['client'])
    if client
      uri = client.uri
      return uri if uri
    end
    current_server.uri
  end
  module_function :uri

  # Is +uri+ the URI for the current local server?
  def here?(uri)
    current_server.here?(uri) rescue false
    # (current_server.uri rescue nil) == uri
  end
  module_function :here?

  # Get the configuration of the current server.
  #
  # If there is no current server, this returns the default configuration.
  # See #current_server and DRbServer::make_config.
  def config
    current_server.config
  rescue
    DRbServer.make_config
  end
  module_function :config

  # Get the front object of the current server.
  #
  # This raises a DRbServerNotFound error if there is no current server.
  # See #current_server.
  def front
    current_server.front
  end
  module_function :front

  # Convert a reference into an object using the current server.
  #
  # This raises a DRbServerNotFound error if there is no current server.
  # See #current_server.
  def to_obj(ref)
    current_server.to_obj(ref)
  end

  # Get a reference id for an object using the current server.
  #
  # This raises a DRbServerNotFound error if there is no current server.
  # See #current_server.
  def to_id(obj)
    current_server.to_id(obj)
  end
  module_function :to_id
  module_function :to_obj

  # Get the thread of the primary server.
  #
  # This returns nil if there is no primary server.  See #primary_server.
  def thread
    @primary_server ? @primary_server.thread : nil
  end
  module_function :thread

  # Set the default id conversion object.
  #
  # This is expected to be an instance such as DRb::DRbIdConv that responds to
  # #to_id and #to_obj that can convert objects to and from DRb references.
  #
  # See DRbServer#default_id_conv.
  def install_id_conv(idconv)
    DRbServer.default_id_conv(idconv)
  end
  module_function :install_id_conv

  # Set the default ACL to +acl+.
  #
  # See DRb::DRbServer.default_acl.
  def install_acl(acl)
    DRbServer.default_acl(acl)
  end
  module_function :install_acl

  @mutex = Thread::Mutex.new
  def mutex # :nodoc:
    @mutex
  end
  module_function :mutex

  @server = {}
  # Registers +server+ with DRb.
  #
  # This is called when a new DRb::DRbServer is created.
  #
  # If there is no primary server then +server+ becomes the primary server.
  #
  # Example:
  #
  #  require 'drb'
  #
  #  s = DRb::DRbServer.new # automatically calls regist_server
  #  DRb.fetch_server s.uri #=> #<DRb::DRbServer:0x...>
  def regist_server(server)
    @server[server.uri] = server
    mutex.synchronize do
      @primary_server = server unless @primary_server
    end
  end
  module_function :regist_server

  # Removes +server+ from the list of registered servers.
  def remove_server(server)
    @server.delete(server.uri)
    mutex.synchronize do
      if @primary_server == server
        @primary_server = nil
      end
    end
  end
  module_function :remove_server

  # Retrieves the server with the given +uri+.
  #
  # See also regist_server and remove_server.
  def fetch_server(uri)
    @server[uri]
  end
  module_function :fetch_server
end

# :stopdoc:
DRbObject = DRb::DRbObject
DRbUndumped = DRb::DRbUndumped
DRbIdConv = DRb::DRbIdConv
PK}$[U��ruby/drb/unix.rbnu�[���# frozen_string_literal: false
require 'socket'
require_relative 'drb'
require 'tmpdir'

raise(LoadError, "UNIXServer is required") unless defined?(UNIXServer)

module DRb

  # Implements DRb over a UNIX socket
  #
  # DRb UNIX socket URIs look like <code>drbunix:<path>?<option></code>.  The
  # option is optional.

  class DRbUNIXSocket < DRbTCPSocket
    # :stopdoc:
    def self.parse_uri(uri)
      if /\Adrbunix:(.*?)(\?(.*))?\z/ =~ uri
        filename = $1
        option = $3
        [filename, option]
      else
        raise(DRbBadScheme, uri) unless uri.start_with?('drbunix:')
        raise(DRbBadURI, 'can\'t parse uri:' + uri)
      end
    end

    def self.open(uri, config)
      filename, = parse_uri(uri)
      soc = UNIXSocket.open(filename)
      self.new(uri, soc, config)
    end

    def self.open_server(uri, config)
      filename, = parse_uri(uri)
      if filename.size == 0
        soc = temp_server
        filename = soc.path
        uri = 'drbunix:' + soc.path
      else
        soc = UNIXServer.open(filename)
      end
      owner = config[:UNIXFileOwner]
      group = config[:UNIXFileGroup]
      if owner || group
        require 'etc'
        owner = Etc.getpwnam( owner ).uid  if owner
        group = Etc.getgrnam( group ).gid  if group
        File.chown owner, group, filename
      end
      mode = config[:UNIXFileMode]
      File.chmod(mode, filename) if mode

      self.new(uri, soc, config, true)
    end

    def self.uri_option(uri, config)
      filename, option = parse_uri(uri)
      return "drbunix:#{filename}", option
    end

    def initialize(uri, soc, config={}, server_mode = false)
      super(uri, soc, config)
      set_sockopt(@socket)
      @server_mode = server_mode
      @acl = nil
    end

    # import from tempfile.rb
    Max_try = 10
    private
    def self.temp_server
      tmpdir = Dir::tmpdir
      n = 0
      while true
        begin
          tmpname = sprintf('%s/druby%d.%d', tmpdir, $$, n)
          lock = tmpname + '.lock'
          unless File.exist?(tmpname) or File.exist?(lock)
            Dir.mkdir(lock)
            break
          end
        rescue
          raise "cannot generate tempfile `%s'" % tmpname if n >= Max_try
          #sleep(1)
        end
        n += 1
      end
      soc = UNIXServer.new(tmpname)
      Dir.rmdir(lock)
      soc
    end

    public
    def close
      return unless @socket
      shutdown # DRbProtocol#shutdown
      path = @socket.path if @server_mode
      @socket.close
      File.unlink(path) if @server_mode
      @socket = nil
      close_shutdown_pipe
    end

    def accept
      s = accept_or_shutdown
      return nil unless s
      self.class.new(nil, s, @config)
    end

    def set_sockopt(soc)
      # no-op for now
    end
  end

  DRbProtocol.add_protocol(DRbUNIXSocket)
  # :startdoc:
end
PK}$[�K��ruby/drb/observer.rbnu�[���# frozen_string_literal: false
require 'observer'

module DRb
  # The Observable module extended to DRb.  See Observable for details.
  module DRbObservable
    include Observable

    # Notifies observers of a change in state.  See also
    # Observable#notify_observers
    def notify_observers(*arg)
      if defined? @observer_state and @observer_state
        if defined? @observer_peers
          @observer_peers.each do |observer, method|
            begin
              observer.__send__(method, *arg)
            rescue
              delete_observer(observer)
            end
          end
        end
        @observer_state = false
      end
    end
  end
end
PK}$[4�<DDruby/logger/version.rbnu�[���# frozen_string_literal: true

class Logger
  VERSION = "1.5.0"
end
PK}$[�S|���ruby/logger/errors.rbnu�[���# frozen_string_literal: true

# not used after 1.2.7. just for compat.
class Logger
  class Error < RuntimeError # :nodoc:
  end
  class ShiftingError < Error # :nodoc:
  end
end
PK}$[6�E^��ruby/logger/severity.rbnu�[���# frozen_string_literal: true

class Logger
  # Logging severity.
  module Severity
    # Low-level information, mostly for developers.
    DEBUG = 0
    # Generic (useful) information about system operation.
    INFO = 1
    # A warning.
    WARN = 2
    # A handleable error condition.
    ERROR = 3
    # An unhandleable error that results in a program crash.
    FATAL = 4
    # An unknown message that should always be logged.
    UNKNOWN = 5
  end
end
PK}$[�{��ruby/logger/period.rbnu�[���# frozen_string_literal: true

class Logger
  module Period
    module_function

    SiD = 24 * 60 * 60

    def next_rotate_time(now, shift_age)
      case shift_age
      when 'daily'
        t = Time.mktime(now.year, now.month, now.mday) + SiD
      when 'weekly'
        t = Time.mktime(now.year, now.month, now.mday) + SiD * (7 - now.wday)
      when 'monthly'
        t = Time.mktime(now.year, now.month, 1) + SiD * 32
        return Time.mktime(t.year, t.month, 1)
      when 'now', 'everytime'
        return now
      else
        raise ArgumentError, "invalid :shift_age #{shift_age.inspect}, should be daily, weekly, monthly, or everytime"
      end
      if t.hour.nonzero? or t.min.nonzero? or t.sec.nonzero?
        hour = t.hour
        t = Time.mktime(t.year, t.month, t.mday)
        t += SiD if hour > 12
      end
      t
    end

    def previous_period_end(now, shift_age)
      case shift_age
      when 'daily'
        t = Time.mktime(now.year, now.month, now.mday) - SiD / 2
      when 'weekly'
        t = Time.mktime(now.year, now.month, now.mday) - (SiD * now.wday + SiD / 2)
      when 'monthly'
        t = Time.mktime(now.year, now.month, 1) - SiD / 2
      when 'now', 'everytime'
        return now
      else
        raise ArgumentError, "invalid :shift_age #{shift_age.inspect}, should be daily, weekly, monthly, or everytime"
      end
      Time.mktime(t.year, t.month, t.mday, 23, 59, 59)
    end
  end
end
PK}$[�=`6AAruby/logger/log_device.rbnu�[���# frozen_string_literal: true

require_relative 'period'

class Logger
  # Device used for logging messages.
  class LogDevice
    include Period

    attr_reader :dev
    attr_reader :filename
    include MonitorMixin

    def initialize(log = nil, shift_age: nil, shift_size: nil, shift_period_suffix: nil, binmode: false)
      @dev = @filename = @shift_age = @shift_size = @shift_period_suffix = nil
      @binmode = binmode
      mon_initialize
      set_dev(log)
      if @filename
        @shift_age = shift_age || 7
        @shift_size = shift_size || 1048576
        @shift_period_suffix = shift_period_suffix || '%Y%m%d'

        unless @shift_age.is_a?(Integer)
          base_time = @dev.respond_to?(:stat) ? @dev.stat.mtime : Time.now
          @next_rotate_time = next_rotate_time(base_time, @shift_age)
        end
      end
    end

    def write(message)
      begin
        synchronize do
          if @shift_age and @dev.respond_to?(:stat)
            begin
              check_shift_log
            rescue
              warn("log shifting failed. #{$!}")
            end
          end
          begin
            @dev.write(message)
          rescue
            warn("log writing failed. #{$!}")
          end
        end
      rescue Exception => ignored
        warn("log writing failed. #{ignored}")
      end
    end

    def close
      begin
        synchronize do
          @dev.close rescue nil
        end
      rescue Exception
        @dev.close rescue nil
      end
    end

    def reopen(log = nil)
      # reopen the same filename if no argument, do nothing for IO
      log ||= @filename if @filename
      if log
        synchronize do
          if @filename and @dev
            @dev.close rescue nil # close only file opened by Logger
            @filename = nil
          end
          set_dev(log)
        end
      end
      self
    end

  private

    def set_dev(log)
      if log.respond_to?(:write) and log.respond_to?(:close)
        @dev = log
        if log.respond_to?(:path)
          @filename = log.path
        end
      else
        @dev = open_logfile(log)
        @dev.sync = true
        @dev.binmode if @binmode
        @filename = log
      end
    end

    def open_logfile(filename)
      begin
        File.open(filename, (File::WRONLY | File::APPEND))
      rescue Errno::ENOENT
        create_logfile(filename)
      end
    end

    def create_logfile(filename)
      begin
        logdev = File.open(filename, (File::WRONLY | File::APPEND | File::CREAT | File::EXCL))
        logdev.flock(File::LOCK_EX)
        logdev.sync = true
        logdev.binmode if @binmode
        add_log_header(logdev)
        logdev.flock(File::LOCK_UN)
      rescue Errno::EEXIST
        # file is created by another process
        logdev = open_logfile(filename)
        logdev.sync = true
      end
      logdev
    end

    def add_log_header(file)
      file.write(
        "# Logfile created on %s by %s\n" % [Time.now.to_s, Logger::ProgName]
      ) if file.size == 0
    end

    def check_shift_log
      if @shift_age.is_a?(Integer)
        # Note: always returns false if '0'.
        if @filename && (@shift_age > 0) && (@dev.stat.size > @shift_size)
          lock_shift_log { shift_log_age }
        end
      else
        now = Time.now
        if now >= @next_rotate_time
          @next_rotate_time = next_rotate_time(now, @shift_age)
          lock_shift_log { shift_log_period(previous_period_end(now, @shift_age)) }
        end
      end
    end

    if /mswin|mingw|cygwin/ =~ RUBY_PLATFORM
      def lock_shift_log
        yield
      end
    else
      def lock_shift_log
        retry_limit = 8
        retry_sleep = 0.1
        begin
          File.open(@filename, File::WRONLY | File::APPEND) do |lock|
            lock.flock(File::LOCK_EX) # inter-process locking. will be unlocked at closing file
            if File.identical?(@filename, lock) and File.identical?(lock, @dev)
              yield # log shifting
            else
              # log shifted by another process (i-node before locking and i-node after locking are different)
              @dev.close rescue nil
              @dev = open_logfile(@filename)
              @dev.sync = true
            end
          end
        rescue Errno::ENOENT
          # @filename file would not exist right after #rename and before #create_logfile
          if retry_limit <= 0
            warn("log rotation inter-process lock failed. #{$!}")
          else
            sleep retry_sleep
            retry_limit -= 1
            retry_sleep *= 2
            retry
          end
        end
      rescue
        warn("log rotation inter-process lock failed. #{$!}")
      end
    end

    def shift_log_age
      (@shift_age-3).downto(0) do |i|
        if FileTest.exist?("#{@filename}.#{i}")
          File.rename("#{@filename}.#{i}", "#{@filename}.#{i+1}")
        end
      end
      @dev.close rescue nil
      File.rename("#{@filename}", "#{@filename}.0")
      @dev = create_logfile(@filename)
      return true
    end

    def shift_log_period(period_end)
      suffix = period_end.strftime(@shift_period_suffix)
      age_file = "#{@filename}.#{suffix}"
      if FileTest.exist?(age_file)
        # try to avoid filename crash caused by Timestamp change.
        idx = 0
        # .99 can be overridden; avoid too much file search with 'loop do'
        while idx < 100
          idx += 1
          age_file = "#{@filename}.#{suffix}.#{idx}"
          break unless FileTest.exist?(age_file)
        end
      end
      @dev.close rescue nil
      File.rename("#{@filename}", age_file)
      @dev = create_logfile(@filename)
      return true
    end
  end
end
PK}$[�i��ruby/logger/formatter.rbnu�[���# frozen_string_literal: true

class Logger
  # Default formatter for log messages.
  class Formatter
    Format = "%s, [%s #%d] %5s -- %s: %s\n"
    DatetimeFormat = "%Y-%m-%dT%H:%M:%S.%6N"

    attr_accessor :datetime_format

    def initialize
      @datetime_format = nil
    end

    def call(severity, time, progname, msg)
      Format % [severity[0..0], format_datetime(time), Process.pid, severity, progname,
        msg2str(msg)]
    end

  private

    def format_datetime(time)
      time.strftime(@datetime_format || DatetimeFormat)
    end

    def msg2str(msg)
      case msg
      when ::String
        msg
      when ::Exception
        "#{ msg.message } (#{ msg.class })\n#{ msg.backtrace.join("\n") if msg.backtrace }"
      else
        msg.inspect
      end
    end
  end
end
PK}$[P4@�e�eruby/set.rbnu�[���# frozen_string_literal: true
# :markup: markdown
#
# set.rb - defines the Set class
#
# Copyright (c) 2002-2020 Akinori MUSHA <knu@iDaemons.org>
#
# Documentation by Akinori MUSHA and Gavin Sinclair.
#
# All rights reserved.  You can redistribute and/or modify it under the same
# terms as Ruby.


##
# This library provides the Set class, which deals with a collection
# of unordered values with no duplicates.  It is a hybrid of Array's
# intuitive inter-operation facilities and Hash's fast lookup.
#
# The method `to_set` is added to Enumerable for convenience.
#
# Set implements a collection of unordered values with no duplicates.
# This is a hybrid of Array's intuitive inter-operation facilities and
# Hash's fast lookup.
#
# Set is easy to use with Enumerable objects (implementing `each`).
# Most of the initializer methods and binary operators accept generic
# Enumerable objects besides sets and arrays.  An Enumerable object
# can be converted to Set using the `to_set` method.
#
# Set uses Hash as storage, so you must note the following points:
#
# * Equality of elements is determined according to Object#eql? and
#   Object#hash.  Use Set#compare_by_identity to make a set compare
#   its elements by their identity.
# * Set assumes that the identity of each element does not change
#   while it is stored.  Modifying an element of a set will render the
#   set to an unreliable state.
# * When a string is to be stored, a frozen copy of the string is
#   stored instead unless the original string is already frozen.
#
# ## Comparison
#
# The comparison operators `<`, `>`, `<=`, and `>=` are implemented as
# shorthand for the {proper_,}{subset?,superset?} methods.  The `<=>`
# operator reflects this order, or return `nil` for sets that both
# have distinct elements (`{x, y}` vs. `{x, z}` for example).
#
# ## Example
#
# ```ruby
# require 'set'
# s1 = Set[1, 2]                        #=> #<Set: {1, 2}>
# s2 = [1, 2].to_set                    #=> #<Set: {1, 2}>
# s1 == s2                              #=> true
# s1.add("foo")                         #=> #<Set: {1, 2, "foo"}>
# s1.merge([2, 6])                      #=> #<Set: {1, 2, "foo", 6}>
# s1.subset?(s2)                        #=> false
# s2.subset?(s1)                        #=> true
# ```
#
# ## Contact
#
# - Akinori MUSHA <<knu@iDaemons.org>> (current maintainer)
#
# ## What's Here
#
#  First, what's elsewhere. \Class \Set:
#
# - Inherits from {class Object}[https://docs.ruby-lang.org/en/master/Object.html#class-Object-label-What-27s+Here].
# - Includes {module Enumerable}[https://docs.ruby-lang.org/en/master/Enumerable.html#module-Enumerable-label-What-27s+Here],
#   which provides dozens of additional methods.
#
# In particular, class \Set does not have many methods of its own
# for fetching or for iterating.
# Instead, it relies on those in \Enumerable.
#
# Here, class \Set provides methods that are useful for:
#
# - [Creating a Set](#class-Set-label-Methods+for+Creating+a+Set)
# - [Set Operations](#class-Set-label-Methods+for+Set+Operations)
# - [Comparing](#class-Set-label-Methods+for+Comparing)
# - [Querying](#class-Set-label-Methods+for+Querying)
# - [Assigning](#class-Set-label-Methods+for+Assigning)
# - [Deleting](#class-Set-label-Methods+for+Deleting)
# - [Converting](#class-Set-label-Methods+for+Converting)
# - [Iterating](#class-Set-label-Methods+for+Iterating)
# - [And more....](#class-Set-label-Other+Methods)
#
# ### Methods for Creating a \Set
#
# - ::[] -
#   Returns a new set containing the given objects.
# - ::new -
#   Returns a new set containing either the given objects
#   (if no block given) or the return values from the called block
#   (if a block given).
#
# ### Methods for \Set Operations
#
# - [|](#method-i-7C) (aliased as #union and #+) -
#   Returns a new set containing all elements from +self+
#   and all elements from a given enumerable (no duplicates).
# - [&](#method-i-26) (aliased as #intersection) -
#   Returns a new set containing all elements common to +self+
#   and a given enumerable.
# - [-](#method-i-2D) (aliased as #difference) -
#   Returns a copy of +self+ with all elements
#   in a given enumerable removed.
# - [\^](#method-i-5E) -
#   Returns a new set containing all elements from +self+
#   and a given enumerable except those common to both.
#
# ### Methods for Comparing
#
# - [<=>](#method-i-3C-3D-3E) -
#   Returns -1, 0, or 1 as +self+ is less than, equal to,
#   or greater than a given object.
# - [==](#method-i-3D-3D) -
#   Returns whether +self+ and a given enumerable are equal,
#   as determined by Object#eql?.
# - \#compare_by_identity? -
#   Returns whether the set considers only identity
#   when comparing elements.
#
# ### Methods for Querying
#
# - \#length (aliased as #size) -
#   Returns the count of elements.
# - \#empty? -
#   Returns whether the set has no elements.
# - \#include? (aliased as #member? and #===) -
#   Returns whether a given object is an element in the set.
# - \#subset? (aliased as [<=](#method-i-3C-3D)) -
#   Returns whether a given object is a subset of the set.
# - \#proper_subset? (aliased as [<](#method-i-3C)) -
#   Returns whether a given enumerable is a proper subset of the set.
# - \#superset? (aliased as [<=](#method-i-3E-3D])) -
#   Returns whether a given enumerable is a superset of the set.
# - \#proper_superset? (aliased as [>](#method-i-3E)) -
#   Returns whether a given enumerable is a proper superset of the set.
# - \#disjoint? -
#   Returns +true+ if the set and a given enumerable
#   have no common elements, +false+ otherwise.
# - \#intersect? -
#   Returns +true+ if the set and a given enumerable -
#   have any common elements, +false+ otherwise.
# - \#compare_by_identity? -
#   Returns whether the set considers only identity
#   when comparing elements.
#
# ### Methods for Assigning
#
# - \#add (aliased as #<<) -
#   Adds a given object to the set; returns +self+.
# - \#add? -
#   If the given object is not an element in the set,
#   adds it and returns +self+; otherwise, returns +nil+.
# - \#merge -
#   Adds each given object to the set; returns +self+.
# - \#replace -
#   Replaces the contents of the set with the contents
#   of a given enumerable.
#
# ### Methods for Deleting
#
# - \#clear -
#   Removes all elements in the set; returns +self+.
# - \#delete -
#   Removes a given object from the set; returns +self+.
# - \#delete? -
#   If the given object is an element in the set,
#   removes it and returns +self+; otherwise, returns +nil+.
# - \#subtract -
#   Removes each given object from the set; returns +self+.
# - \#delete_if - Removes elements specified by a given block.
# - \#select! (aliased as #filter!) -
#   Removes elements not specified by a given block.
# - \#keep_if -
#   Removes elements not specified by a given block.
# - \#reject!
#   Removes elements specified by a given block.
#
# ### Methods for Converting
#
# - \#classify -
#   Returns a hash that classifies the elements,
#   as determined by the given block.
# - \#collect! (aliased as #map!) -
#   Replaces each element with a block return-value.
# - \#divide -
#   Returns a hash that classifies the elements,
#   as determined by the given block;
#   differs from #classify in that the block may accept
#   either one or two arguments.
# - \#flatten -
#   Returns a new set that is a recursive flattening of +self+.
#  \#flatten! -
#   Replaces each nested set in +self+ with the elements from that set.
# - \#inspect (aliased as #to_s) -
#   Returns a string displaying the elements.
# - \#join -
#   Returns a string containing all elements, converted to strings
#   as needed, and joined by the given record separator.
# - \#to_a -
#   Returns an array containing all set elements.
# - \#to_set -
#   Returns +self+ if given no arguments and no block;
#   with a block given, returns a new set consisting of block
#   return values.
#
# ### Methods for Iterating
#
# - \#each -
#   Calls the block with each successive element; returns +self+.
#
# ### Other Methods
#
# - \#reset -
#   Resets the internal state; useful if an object
#   has been modified while an element in the set.
#
class Set
  include Enumerable

  # Creates a new set containing the given objects.
  #
  #     Set[1, 2]                   # => #<Set: {1, 2}>
  #     Set[1, 2, 1]                # => #<Set: {1, 2}>
  #     Set[1, 'c', :s]             # => #<Set: {1, "c", :s}>
  def self.[](*ary)
    new(ary)
  end

  # Creates a new set containing the elements of the given enumerable
  # object.
  #
  # If a block is given, the elements of enum are preprocessed by the
  # given block.
  #
  #     Set.new([1, 2])                       #=> #<Set: {1, 2}>
  #     Set.new([1, 2, 1])                    #=> #<Set: {1, 2}>
  #     Set.new([1, 'c', :s])                 #=> #<Set: {1, "c", :s}>
  #     Set.new(1..5)                         #=> #<Set: {1, 2, 3, 4, 5}>
  #     Set.new([1, 2, 3]) { |x| x * x }      #=> #<Set: {1, 4, 9}>
  def initialize(enum = nil, &block) # :yields: o
    @hash ||= Hash.new(false)

    enum.nil? and return

    if block
      do_with_enum(enum) { |o| add(block[o]) }
    else
      merge(enum)
    end
  end

  # Makes the set compare its elements by their identity and returns
  # self.  This method may not be supported by all subclasses of Set.
  def compare_by_identity
    if @hash.respond_to?(:compare_by_identity)
      @hash.compare_by_identity
      self
    else
      raise NotImplementedError, "#{self.class.name}\##{__method__} is not implemented"
    end
  end

  # Returns true if the set will compare its elements by their
  # identity.  Also see Set#compare_by_identity.
  def compare_by_identity?
    @hash.respond_to?(:compare_by_identity?) && @hash.compare_by_identity?
  end

  def do_with_enum(enum, &block) # :nodoc:
    if enum.respond_to?(:each_entry)
      enum.each_entry(&block) if block
    elsif enum.respond_to?(:each)
      enum.each(&block) if block
    else
      raise ArgumentError, "value must be enumerable"
    end
  end
  private :do_with_enum

  # Dup internal hash.
  def initialize_dup(orig)
    super
    @hash = orig.instance_variable_get(:@hash).dup
  end

  if Kernel.instance_method(:initialize_clone).arity != 1
    # Clone internal hash.
    def initialize_clone(orig, **options)
      super
      @hash = orig.instance_variable_get(:@hash).clone(**options)
    end
  else
    # Clone internal hash.
    def initialize_clone(orig)
      super
      @hash = orig.instance_variable_get(:@hash).clone
    end
  end

  def freeze    # :nodoc:
    @hash.freeze
    super
  end

  # Returns the number of elements.
  def size
    @hash.size
  end
  alias length size

  # Returns true if the set contains no elements.
  def empty?
    @hash.empty?
  end

  # Removes all elements and returns self.
  #
  #     set = Set[1, 'c', :s]             #=> #<Set: {1, "c", :s}>
  #     set.clear                         #=> #<Set: {}>
  #     set                               #=> #<Set: {}>
  def clear
    @hash.clear
    self
  end

  # Replaces the contents of the set with the contents of the given
  # enumerable object and returns self.
  #
  #     set = Set[1, 'c', :s]             #=> #<Set: {1, "c", :s}>
  #     set.replace([1, 2])               #=> #<Set: {1, 2}>
  #     set                               #=> #<Set: {1, 2}>
  def replace(enum)
    if enum.instance_of?(self.class)
      @hash.replace(enum.instance_variable_get(:@hash))
      self
    else
      do_with_enum(enum)  # make sure enum is enumerable before calling clear
      clear
      merge(enum)
    end
  end

  # Converts the set to an array.  The order of elements is uncertain.
  #
  #     Set[1, 2].to_a                    #=> [1, 2]
  #     Set[1, 'c', :s].to_a              #=> [1, "c", :s]
  def to_a
    @hash.keys
  end

  # Returns self if no arguments are given.  Otherwise, converts the
  # set to another with `klass.new(self, *args, &block)`.
  #
  # In subclasses, returns `klass.new(self, *args, &block)` unless
  # overridden.
  def to_set(klass = Set, *args, &block)
    return self if instance_of?(Set) && klass == Set && block.nil? && args.empty?
    klass.new(self, *args, &block)
  end

  def flatten_merge(set, seen = Set.new) # :nodoc:
    set.each { |e|
      if e.is_a?(Set)
        if seen.include?(e_id = e.object_id)
          raise ArgumentError, "tried to flatten recursive Set"
        end

        seen.add(e_id)
        flatten_merge(e, seen)
        seen.delete(e_id)
      else
        add(e)
      end
    }

    self
  end
  protected :flatten_merge

  # Returns a new set that is a copy of the set, flattening each
  # containing set recursively.
  def flatten
    self.class.new.flatten_merge(self)
  end

  # Equivalent to Set#flatten, but replaces the receiver with the
  # result in place.  Returns nil if no modifications were made.
  def flatten!
    replace(flatten()) if any? { |e| e.is_a?(Set) }
  end

  # Returns true if the set contains the given object.
  #
  # Note that <code>include?</code> and <code>member?</code> do not test member
  # equality using <code>==</code> as do other Enumerables.
  #
  # See also Enumerable#include?
  def include?(o)
    @hash[o]
  end
  alias member? include?

  # Returns true if the set is a superset of the given set.
  def superset?(set)
    case
    when set.instance_of?(self.class) && @hash.respond_to?(:>=)
      @hash >= set.instance_variable_get(:@hash)
    when set.is_a?(Set)
      size >= set.size && set.all? { |o| include?(o) }
    else
      raise ArgumentError, "value must be a set"
    end
  end
  alias >= superset?

  # Returns true if the set is a proper superset of the given set.
  def proper_superset?(set)
    case
    when set.instance_of?(self.class) && @hash.respond_to?(:>)
      @hash > set.instance_variable_get(:@hash)
    when set.is_a?(Set)
      size > set.size && set.all? { |o| include?(o) }
    else
      raise ArgumentError, "value must be a set"
    end
  end
  alias > proper_superset?

  # Returns true if the set is a subset of the given set.
  def subset?(set)
    case
    when set.instance_of?(self.class) && @hash.respond_to?(:<=)
      @hash <= set.instance_variable_get(:@hash)
    when set.is_a?(Set)
      size <= set.size && all? { |o| set.include?(o) }
    else
      raise ArgumentError, "value must be a set"
    end
  end
  alias <= subset?

  # Returns true if the set is a proper subset of the given set.
  def proper_subset?(set)
    case
    when set.instance_of?(self.class) && @hash.respond_to?(:<)
      @hash < set.instance_variable_get(:@hash)
    when set.is_a?(Set)
      size < set.size && all? { |o| set.include?(o) }
    else
      raise ArgumentError, "value must be a set"
    end
  end
  alias < proper_subset?

  # Returns 0 if the set are equal,
  # -1 / +1 if the set is a proper subset / superset of the given set,
  # or nil if they both have unique elements.
  def <=>(set)
    return unless set.is_a?(Set)

    case size <=> set.size
    when -1 then -1 if proper_subset?(set)
    when +1 then +1 if proper_superset?(set)
    else 0 if self.==(set)
    end
  end

  # Returns true if the set and the given enumerable have at least one
  # element in common.
  #
  #     Set[1, 2, 3].intersect? Set[4, 5]   #=> false
  #     Set[1, 2, 3].intersect? Set[3, 4]   #=> true
  #     Set[1, 2, 3].intersect? 4..5        #=> false
  #     Set[1, 2, 3].intersect? [3, 4]      #=> true
  def intersect?(set)
    case set
    when Set
      if size < set.size
        any? { |o| set.include?(o) }
      else
        set.any? { |o| include?(o) }
      end
    when Enumerable
      set.any? { |o| include?(o) }
    else
      raise ArgumentError, "value must be enumerable"
    end
  end

  # Returns true if the set and the given enumerable have
  # no element in common.  This method is the opposite of `intersect?`.
  #
  #     Set[1, 2, 3].disjoint? Set[3, 4]   #=> false
  #     Set[1, 2, 3].disjoint? Set[4, 5]   #=> true
  #     Set[1, 2, 3].disjoint? [3, 4]      #=> false
  #     Set[1, 2, 3].disjoint? 4..5        #=> true
  def disjoint?(set)
    !intersect?(set)
  end

  # Calls the given block once for each element in the set, passing
  # the element as parameter.  Returns an enumerator if no block is
  # given.
  def each(&block)
    block or return enum_for(__method__) { size }
    @hash.each_key(&block)
    self
  end

  # Adds the given object to the set and returns self.  Use `merge` to
  # add many elements at once.
  #
  #     Set[1, 2].add(3)                    #=> #<Set: {1, 2, 3}>
  #     Set[1, 2].add([3, 4])               #=> #<Set: {1, 2, [3, 4]}>
  #     Set[1, 2].add(2)                    #=> #<Set: {1, 2}>
  def add(o)
    @hash[o] = true
    self
  end
  alias << add

  # Adds the given object to the set and returns self.  If the
  # object is already in the set, returns nil.
  #
  #     Set[1, 2].add?(3)                    #=> #<Set: {1, 2, 3}>
  #     Set[1, 2].add?([3, 4])               #=> #<Set: {1, 2, [3, 4]}>
  #     Set[1, 2].add?(2)                    #=> nil
  def add?(o)
    add(o) unless include?(o)
  end

  # Deletes the given object from the set and returns self.  Use
  # `subtract` to delete many items at once.
  def delete(o)
    @hash.delete(o)
    self
  end

  # Deletes the given object from the set and returns self.  If the
  # object is not in the set, returns nil.
  def delete?(o)
    delete(o) if include?(o)
  end

  # Deletes every element of the set for which block evaluates to
  # true, and returns self. Returns an enumerator if no block is
  # given.
  def delete_if
    block_given? or return enum_for(__method__) { size }
    # @hash.delete_if should be faster, but using it breaks the order
    # of enumeration in subclasses.
    select { |o| yield o }.each { |o| @hash.delete(o) }
    self
  end

  # Deletes every element of the set for which block evaluates to
  # false, and returns self. Returns an enumerator if no block is
  # given.
  def keep_if
    block_given? or return enum_for(__method__) { size }
    # @hash.keep_if should be faster, but using it breaks the order of
    # enumeration in subclasses.
    reject { |o| yield o }.each { |o| @hash.delete(o) }
    self
  end

  # Replaces the elements with ones returned by `collect()`.
  # Returns an enumerator if no block is given.
  def collect!
    block_given? or return enum_for(__method__) { size }
    set = self.class.new
    each { |o| set << yield(o) }
    replace(set)
  end
  alias map! collect!

  # Equivalent to Set#delete_if, but returns nil if no changes were
  # made. Returns an enumerator if no block is given.
  def reject!(&block)
    block or return enum_for(__method__) { size }
    n = size
    delete_if(&block)
    self if size != n
  end

  # Equivalent to Set#keep_if, but returns nil if no changes were
  # made. Returns an enumerator if no block is given.
  def select!(&block)
    block or return enum_for(__method__) { size }
    n = size
    keep_if(&block)
    self if size != n
  end

  # Equivalent to Set#select!
  alias filter! select!

  # Merges the elements of the given enumerable object to the set and
  # returns self.
  def merge(enum)
    if enum.instance_of?(self.class)
      @hash.update(enum.instance_variable_get(:@hash))
    else
      do_with_enum(enum) { |o| add(o) }
    end

    self
  end

  # Deletes every element that appears in the given enumerable object
  # and returns self.
  def subtract(enum)
    do_with_enum(enum) { |o| delete(o) }
    self
  end

  # Returns a new set built by merging the set and the elements of the
  # given enumerable object.
  #
  #     Set[1, 2, 3] | Set[2, 4, 5]         #=> #<Set: {1, 2, 3, 4, 5}>
  #     Set[1, 5, 'z'] | (1..6)             #=> #<Set: {1, 5, "z", 2, 3, 4, 6}>
  def |(enum)
    dup.merge(enum)
  end
  alias + |
  alias union |

  # Returns a new set built by duplicating the set, removing every
  # element that appears in the given enumerable object.
  #
  #     Set[1, 3, 5] - Set[1, 5]                #=> #<Set: {3}>
  #     Set['a', 'b', 'z'] - ['a', 'c']         #=> #<Set: {"b", "z"}>
  def -(enum)
    dup.subtract(enum)
  end
  alias difference -

  # Returns a new set containing elements common to the set and the
  # given enumerable object.
  #
  #     Set[1, 3, 5] & Set[3, 2, 1]             #=> #<Set: {3, 1}>
  #     Set['a', 'b', 'z'] & ['a', 'b', 'c']    #=> #<Set: {"a", "b"}>
  def &(enum)
    n = self.class.new
    if enum.is_a?(Set)
      if enum.size > size
        each { |o| n.add(o) if enum.include?(o) }
      else
        enum.each { |o| n.add(o) if include?(o) }
      end
    else
      do_with_enum(enum) { |o| n.add(o) if include?(o) }
    end
    n
  end
  alias intersection &

  # Returns a new set containing elements exclusive between the set
  # and the given enumerable object.  `(set ^ enum)` is equivalent to
  # `((set | enum) - (set & enum))`.
  #
  #     Set[1, 2] ^ Set[2, 3]                   #=> #<Set: {3, 1}>
  #     Set[1, 'b', 'c'] ^ ['b', 'd']           #=> #<Set: {"d", 1, "c"}>
  def ^(enum)
    n = Set.new(enum)
    each { |o| n.add(o) unless n.delete?(o) }
    n
  end

  # Returns true if two sets are equal.  The equality of each couple
  # of elements is defined according to Object#eql?.
  #
  #     Set[1, 2] == Set[2, 1]                       #=> true
  #     Set[1, 3, 5] == Set[1, 5]                    #=> false
  #     Set['a', 'b', 'c'] == Set['a', 'c', 'b']     #=> true
  #     Set['a', 'b', 'c'] == ['a', 'c', 'b']        #=> false
  def ==(other)
    if self.equal?(other)
      true
    elsif other.instance_of?(self.class)
      @hash == other.instance_variable_get(:@hash)
    elsif other.is_a?(Set) && self.size == other.size
      other.all? { |o| @hash.include?(o) }
    else
      false
    end
  end

  def hash      # :nodoc:
    @hash.hash
  end

  def eql?(o)   # :nodoc:
    return false unless o.is_a?(Set)
    @hash.eql?(o.instance_variable_get(:@hash))
  end

  # Resets the internal state after modification to existing elements
  # and returns self.
  #
  # Elements will be reindexed and deduplicated.
  def reset
    if @hash.respond_to?(:rehash)
      @hash.rehash # This should perform frozenness check.
    else
      raise FrozenError, "can't modify frozen #{self.class.name}" if frozen?
    end
    self
  end

  # Returns true if the given object is a member of the set,
  # and false otherwise.
  #
  # Used in case statements:
  #
  #     require 'set'
  #
  #     case :apple
  #     when Set[:potato, :carrot]
  #       "vegetable"
  #     when Set[:apple, :banana]
  #       "fruit"
  #     end
  #     # => "fruit"
  #
  # Or by itself:
  #
  #     Set[1, 2, 3] === 2   #=> true
  #     Set[1, 2, 3] === 4   #=> false
  #
  alias === include?

  # Classifies the set by the return value of the given block and
  # returns a hash of {value => set of elements} pairs.  The block is
  # called once for each element of the set, passing the element as
  # parameter.
  #
  #     require 'set'
  #     files = Set.new(Dir.glob("*.rb"))
  #     hash = files.classify { |f| File.mtime(f).year }
  #     hash       #=> {2000=>#<Set: {"a.rb", "b.rb"}>,
  #                #    2001=>#<Set: {"c.rb", "d.rb", "e.rb"}>,
  #                #    2002=>#<Set: {"f.rb"}>}
  #
  # Returns an enumerator if no block is given.
  def classify # :yields: o
    block_given? or return enum_for(__method__) { size }

    h = {}

    each { |i|
      (h[yield(i)] ||= self.class.new).add(i)
    }

    h
  end

  # Divides the set into a set of subsets according to the commonality
  # defined by the given block.
  #
  # If the arity of the block is 2, elements o1 and o2 are in common
  # if block.call(o1, o2) is true.  Otherwise, elements o1 and o2 are
  # in common if block.call(o1) == block.call(o2).
  #
  #     require 'set'
  #     numbers = Set[1, 3, 4, 6, 9, 10, 11]
  #     set = numbers.divide { |i,j| (i - j).abs == 1 }
  #     set        #=> #<Set: {#<Set: {1}>,
  #                #           #<Set: {11, 9, 10}>,
  #                #           #<Set: {3, 4}>,
  #                #           #<Set: {6}>}>
  #
  # Returns an enumerator if no block is given.
  def divide(&func)
    func or return enum_for(__method__) { size }

    if func.arity == 2
      require 'tsort'

      class << dig = {}         # :nodoc:
        include TSort

        alias tsort_each_node each_key
        def tsort_each_child(node, &block)
          fetch(node).each(&block)
        end
      end

      each { |u|
        dig[u] = a = []
        each{ |v| func.call(u, v) and a << v }
      }

      set = Set.new()
      dig.each_strongly_connected_component { |css|
        set.add(self.class.new(css))
      }
      set
    else
      Set.new(classify(&func).values)
    end
  end

  # Returns a string created by converting each element of the set to a string
  # See also: Array#join
  def join(separator=nil)
    to_a.join(separator)
  end

  InspectKey = :__inspect_key__         # :nodoc:

  # Returns a string containing a human-readable representation of the
  # set ("#<Set: {element1, element2, ...}>").
  def inspect
    ids = (Thread.current[InspectKey] ||= [])

    if ids.include?(object_id)
      return sprintf('#<%s: {...}>', self.class.name)
    end

    ids << object_id
    begin
      return sprintf('#<%s: {%s}>', self.class, to_a.inspect[1..-2])
    ensure
      ids.pop
    end
  end

  alias to_s inspect

  def pretty_print(pp)  # :nodoc:
    pp.group(1, sprintf('#<%s:', self.class.name), '>') {
      pp.breakable
      pp.group(1, '{', '}') {
        pp.seplist(self) { |o|
          pp.pp o
        }
      }
    }
  end

  def pretty_print_cycle(pp)    # :nodoc:
    pp.text sprintf('#<%s: {%s}>', self.class.name, empty? ? '' : '...')
  end
end

module Enumerable
  # Makes a set from the enumerable object with given arguments.
  # Needs to `require "set"` to use this method.
  def to_set(klass = Set, *args, &block)
    klass.new(self, *args, &block)
  end
end

autoload :SortedSet, "#{__dir__}/set/sorted_set"
PK}$[_v��EEruby/digest/version.rbnu�[���# frozen_string_literal: true

module Digest
  VERSION = "3.1.0"
end
PK}$[24�Z88ruby/digest/sha2/loader.rbnu�[���# frozen_string_literal: true

require 'digest/sha2.so'
PK}$[�6�33ruby/digest/loader.rbnu�[���# frozen_string_literal: true

require 'digest.so'
PK}$[�:i7ruby/digest/sha2.rbnu�[���# frozen_string_literal: false
#--
# sha2.rb - defines Digest::SHA2 class which wraps up the SHA256,
#           SHA384, and SHA512 classes.
#++
# Copyright (c) 2006 Akinori MUSHA <knu@iDaemons.org>
#
# All rights reserved.  You can redistribute and/or modify it under the same
# terms as Ruby.
#
#   $Id$

require 'digest'
require 'digest/sha2/loader'

module Digest
  #
  # A meta digest provider class for SHA256, SHA384 and SHA512.
  #
  # FIPS 180-2 describes SHA2 family of digest algorithms. It defines
  # three algorithms:
  # * one which works on chunks of 512 bits and returns a 256-bit
  #   digest (SHA256),
  # * one which works on chunks of 1024 bits and returns a 384-bit
  #   digest (SHA384),
  # * and one which works on chunks of 1024 bits and returns a 512-bit
  #   digest (SHA512).
  #
  # ==Examples
  #  require 'digest'
  #
  #  # Compute a complete digest
  #  Digest::SHA2.hexdigest 'abc'          # => "ba7816bf8..."
  #  Digest::SHA2.new(256).hexdigest 'abc' # => "ba7816bf8..."
  #  Digest::SHA256.hexdigest 'abc'        # => "ba7816bf8..."
  #
  #  Digest::SHA2.new(384).hexdigest 'abc' # => "cb00753f4..."
  #  Digest::SHA384.hexdigest 'abc'        # => "cb00753f4..."
  #
  #  Digest::SHA2.new(512).hexdigest 'abc' # => "ddaf35a19..."
  #  Digest::SHA512.hexdigest 'abc'        # => "ddaf35a19..."
  #
  #  # Compute digest by chunks
  #  sha2 = Digest::SHA2.new               # =>#<Digest::SHA2:256>
  #  sha2.update "ab"
  #  sha2 << "c"                           # alias for #update
  #  sha2.hexdigest                        # => "ba7816bf8..."
  #
  #  # Use the same object to compute another digest
  #  sha2.reset
  #  sha2 << "message"
  #  sha2.hexdigest                        # => "ab530a13e..."
  #
  class SHA2 < Digest::Class
    # call-seq:
    #   Digest::SHA2.new(bitlen = 256) -> digest_obj
    #
    # Create a new SHA2 hash object with a given bit length.
    #
    # Valid bit lengths are 256, 384 and 512.
    def initialize(bitlen = 256)
      case bitlen
      when 256
        @sha2 = Digest::SHA256.new
      when 384
        @sha2 = Digest::SHA384.new
      when 512
        @sha2 = Digest::SHA512.new
      else
        raise ArgumentError, "unsupported bit length: %s" % bitlen.inspect
      end
      @bitlen = bitlen
    end

    # call-seq:
    #   digest_obj.reset -> digest_obj
    #
    # Reset the digest to the initial state and return self.
    def reset
      @sha2.reset
      self
    end

    # call-seq:
    #   digest_obj.update(string) -> digest_obj
    #   digest_obj << string -> digest_obj
    #
    # Update the digest using a given _string_ and return self.
    def update(str)
      @sha2.update(str)
      self
    end
    alias << update

    def finish # :nodoc:
      @sha2.digest!
    end
    private :finish


    # call-seq:
    #   digest_obj.block_length -> Integer
    #
    # Return the block length of the digest in bytes.
    #
    #   Digest::SHA256.new.block_length * 8
    #   # => 512
    #   Digest::SHA384.new.block_length * 8
    #   # => 1024
    #   Digest::SHA512.new.block_length * 8
    #   # => 1024
    def block_length
      @sha2.block_length
    end

    # call-seq:
    #   digest_obj.digest_length -> Integer
    #
    # Return the length of the hash value (the digest) in bytes.
    #
    #   Digest::SHA256.new.digest_length * 8
    #   # => 256
    #   Digest::SHA384.new.digest_length * 8
    #   # => 384
    #   Digest::SHA512.new.digest_length * 8
    #   # => 512
    #
    # For example, digests produced by Digest::SHA256 will always be 32 bytes
    # (256 bits) in size.
    def digest_length
      @sha2.digest_length
    end

    def initialize_copy(other) # :nodoc:
      @sha2 = other.instance_eval { @sha2.clone }
    end

    def inspect # :nodoc:
      "#<%s:%d %s>" % [self.class.name, @bitlen, hexdigest]
    end
  end
end
PK}$[=�rrruby/English.rbnu�[���# frozen_string_literal: true
#  Include the English library file in a Ruby script, and you can
#  reference the global variables such as <tt>$_</tt> using less
#  cryptic names, listed below.
#
#  Without 'English':
#
#      $\ = ' -- '
#      "waterbuffalo" =~ /buff/
#      print $', $$, "\n"
#
#  With English:
#
#      require "English"
#
#      $OUTPUT_FIELD_SEPARATOR = ' -- '
#      "waterbuffalo" =~ /buff/
#      print $POSTMATCH, $PID, "\n"
#
#  Below is a full list of descriptive aliases and their associated global
#  variable:
#
#  $ERROR_INFO::              $!
#  $ERROR_POSITION::          $@
#  $FS::                      $;
#  $FIELD_SEPARATOR::         $;
#  $OFS::                     $,
#  $OUTPUT_FIELD_SEPARATOR::  $,
#  $RS::                      $/
#  $INPUT_RECORD_SEPARATOR::  $/
#  $ORS::                     $\
#  $OUTPUT_RECORD_SEPARATOR:: $\
#  $INPUT_LINE_NUMBER::       $.
#  $NR::                      $.
#  $LAST_READ_LINE::          $_
#  $DEFAULT_OUTPUT::          $>
#  $DEFAULT_INPUT::           $<
#  $PID::                     $$
#  $PROCESS_ID::              $$
#  $CHILD_STATUS::            $?
#  $LAST_MATCH_INFO::         $~
#  $IGNORECASE::              $=
#  $ARGV::                    $*
#  $MATCH::                   $&
#  $PREMATCH::                $`
#  $POSTMATCH::               $'
#  $LAST_PAREN_MATCH::        $+
#
module English end if false

# The exception object passed to +raise+.
alias $ERROR_INFO              $!

# The stack backtrace generated by the last
# exception. See Kernel#caller for details. Thread local.
alias $ERROR_POSITION          $@

# The default separator pattern used by String#split.  May be set from
# the command line using the <tt>-F</tt> flag.
alias $FS                      $;

# The default separator pattern used by String#split.  May be set from
# the command line using the <tt>-F</tt> flag.
alias $FIELD_SEPARATOR         $;

# The separator string output between the parameters to methods such
# as Kernel#print and Array#join. Defaults to +nil+, which adds no
# text.
alias $OFS                     $,

# The separator string output between the parameters to methods such
# as Kernel#print and Array#join. Defaults to +nil+, which adds no
# text.
alias $OUTPUT_FIELD_SEPARATOR  $,

# The input record separator (newline by default). This is the value
# that routines such as Kernel#gets use to determine record
# boundaries. If set to +nil+, +gets+ will read the entire file.
alias $RS                      $/

# The input record separator (newline by default). This is the value
# that routines such as Kernel#gets use to determine record
# boundaries. If set to +nil+, +gets+ will read the entire file.
alias $INPUT_RECORD_SEPARATOR  $/

# The string appended to the output of every call to methods such as
# Kernel#print and IO#write. The default value is +nil+.
alias $ORS                     $\

# The string appended to the output of every call to methods such as
# Kernel#print and IO#write. The default value is +nil+.
alias $OUTPUT_RECORD_SEPARATOR $\

# The number of the last line read from the current input file.
alias $INPUT_LINE_NUMBER       $.

# The number of the last line read from the current input file.
alias $NR                      $.

# The last line read by Kernel#gets or
# Kernel#readline. Many string-related functions in the
# Kernel module operate on <tt>$_</tt> by default. The variable is
# local to the current scope. Thread local.
alias $LAST_READ_LINE          $_

# The destination of output for Kernel#print
# and Kernel#printf. The default value is
# <tt>$stdout</tt>.
alias $DEFAULT_OUTPUT          $>

# An object that provides access to the concatenation
# of the contents of all the files
# given as command-line arguments, or <tt>$stdin</tt>
# (in the case where there are no
# arguments). <tt>$<</tt> supports methods similar to a
# File object:
# +inmode+, +close+,
# <tt>closed?</tt>, +each+,
# <tt>each_byte</tt>, <tt>each_line</tt>,
# +eof+, <tt>eof?</tt>, +file+,
# +filename+, +fileno+,
# +getc+, +gets+, +lineno+,
# <tt>lineno=</tt>, +path+,
# +pos+, <tt>pos=</tt>,
# +read+, +readchar+,
# +readline+, +readlines+,
# +rewind+, +seek+, +skip+,
# +tell+, <tt>to_a</tt>, <tt>to_i</tt>,
# <tt>to_io</tt>, <tt>to_s</tt>, along with the
# methods in Enumerable. The method +file+
# returns a File object for the file currently
# being read. This may change as <tt>$<</tt> reads
# through the files on the command line. Read only.
alias $DEFAULT_INPUT           $<

# The process number of the program being executed. Read only.
alias $PID                     $$

# The process number of the program being executed. Read only.
alias $PROCESS_ID              $$

# The exit status of the last child process to terminate. Read
# only. Thread local.
alias $CHILD_STATUS            $?

# A +MatchData+ object that encapsulates the results of a successful
# pattern match. The variables <tt>$&</tt>, <tt>$`</tt>, <tt>$'</tt>,
# and <tt>$1</tt> to <tt>$9</tt> are all derived from
# <tt>$~</tt>. Assigning to <tt>$~</tt> changes the values of these
# derived variables.  This variable is local to the current
# scope.
alias $LAST_MATCH_INFO         $~

# This variable is no longer effective. Deprecated.
alias $IGNORECASE              $=

# An array of strings containing the command-line
# options from the invocation of the program. Options
# used by the Ruby interpreter will have been
# removed. Read only. Also known simply as +ARGV+.
alias $ARGV                    $*

# The string matched by the last successful pattern
# match. This variable is local to the current
# scope. Read only.
alias $MATCH                   $&

# The string preceding the match in the last
# successful pattern match. This variable is local to
# the current scope. Read only.
alias $PREMATCH                $`

# The string following the match in the last
# successful pattern match. This variable is local to
# the current scope. Read only.
alias $POSTMATCH               $'

# The contents of the highest-numbered group matched in the last
# successful pattern match. Thus, in <tt>"cat" =~ /(c|a)(t|z)/</tt>,
# <tt>$+</tt> will be set to "t".  This variable is local to the
# current scope. Read only.
alias $LAST_PAREN_MATCH        $+
PK}$[���NNruby/cgi/cookie.rbnu�[���# frozen_string_literal: true
require_relative 'util'
class CGI
  # Class representing an HTTP cookie.
  #
  # In addition to its specific fields and methods, a Cookie instance
  # is a delegator to the array of its values.
  #
  # See RFC 2965.
  #
  # == Examples of use
  #   cookie1 = CGI::Cookie.new("name", "value1", "value2", ...)
  #   cookie1 = CGI::Cookie.new("name" => "name", "value" => "value")
  #   cookie1 = CGI::Cookie.new('name'     => 'name',
  #                             'value'    => ['value1', 'value2', ...],
  #                             'path'     => 'path',   # optional
  #                             'domain'   => 'domain', # optional
  #                             'expires'  => Time.now, # optional
  #                             'secure'   => true,     # optional
  #                             'httponly' => true      # optional
  #                             )
  #
  #   cgi.out("cookie" => [cookie1, cookie2]) { "string" }
  #
  #   name     = cookie1.name
  #   values   = cookie1.value
  #   path     = cookie1.path
  #   domain   = cookie1.domain
  #   expires  = cookie1.expires
  #   secure   = cookie1.secure
  #   httponly = cookie1.httponly
  #
  #   cookie1.name     = 'name'
  #   cookie1.value    = ['value1', 'value2', ...]
  #   cookie1.path     = 'path'
  #   cookie1.domain   = 'domain'
  #   cookie1.expires  = Time.now + 30
  #   cookie1.secure   = true
  #   cookie1.httponly = true
  class Cookie < Array
    @@accept_charset="UTF-8" unless defined?(@@accept_charset)

    TOKEN_RE = %r"\A[[!-~]&&[^()<>@,;:\\\"/?=\[\]{}]]+\z"
    PATH_VALUE_RE = %r"\A[[ -~]&&[^;]]*\z"
    DOMAIN_VALUE_RE = %r"\A\.?(?<label>(?!-)[-A-Za-z0-9]+(?<!-))(?:\.\g<label>)*\z"

    # Create a new CGI::Cookie object.
    #
    # :call-seq:
    #   Cookie.new(name_string,*value)
    #   Cookie.new(options_hash)
    #
    # +name_string+::
    #   The name of the cookie; in this form, there is no #domain or
    #   #expiration.  The #path is gleaned from the +SCRIPT_NAME+ environment
    #   variable, and #secure is false.
    # <tt>*value</tt>::
    #   value or list of values of the cookie
    # +options_hash+::
    #   A Hash of options to initialize this Cookie.  Possible options are:
    #
    #   name:: the name of the cookie.  Required.
    #   value:: the cookie's value or list of values.
    #   path:: the path for which this cookie applies.  Defaults to
    #          the value of the +SCRIPT_NAME+ environment variable.
    #   domain:: the domain for which this cookie applies.
    #   expires:: the time at which this cookie expires, as a +Time+ object.
    #   secure:: whether this cookie is a secure cookie or not (default to
    #            false).  Secure cookies are only transmitted to HTTPS
    #            servers.
    #   httponly:: whether this cookie is a HttpOnly cookie or not (default to
    #            false).  HttpOnly cookies are not available to javascript.
    #
    #   These keywords correspond to attributes of the cookie object.
    def initialize(name = "", *value)
      @domain = nil
      @expires = nil
      if name.kind_of?(String)
        self.name = name
        self.path = (%r|\A(.*/)| =~ ENV["SCRIPT_NAME"] ? $1 : "")
        @secure = false
        @httponly = false
        return super(value)
      end

      options = name
      unless options.has_key?("name")
        raise ArgumentError, "`name' required"
      end

      self.name = options["name"]
      value = Array(options["value"])
      # simple support for IE
      self.path = options["path"] || (%r|\A(.*/)| =~ ENV["SCRIPT_NAME"] ? $1 : "")
      self.domain = options["domain"]
      @expires = options["expires"]
      @secure = options["secure"] == true
      @httponly = options["httponly"] == true

      super(value)
    end

    # Name of this cookie, as a +String+
    attr_reader :name
    # Set name of this cookie
    def name=(str)
      if str and !TOKEN_RE.match?(str)
        raise ArgumentError, "invalid name: #{str.dump}"
      end
      @name = str
    end

    # Path for which this cookie applies, as a +String+
    attr_reader :path
    # Set path for which this cookie applies
    def path=(str)
      if str and !PATH_VALUE_RE.match?(str)
        raise ArgumentError, "invalid path: #{str.dump}"
      end
      @path = str
    end

    # Domain for which this cookie applies, as a +String+
    attr_reader :domain
    # Set domain for which this cookie applies
    def domain=(str)
      if str and ((str = str.b).bytesize > 255 or !DOMAIN_VALUE_RE.match?(str))
        raise ArgumentError, "invalid domain: #{str.dump}"
      end
      @domain = str
    end

    # Time at which this cookie expires, as a +Time+
    attr_accessor :expires
    # True if this cookie is secure; false otherwise
    attr_reader :secure
    # True if this cookie is httponly; false otherwise
    attr_reader :httponly

    # Returns the value or list of values for this cookie.
    def value
      self
    end

    # Replaces the value of this cookie with a new value or list of values.
    def value=(val)
      replace(Array(val))
    end

    # Set whether the Cookie is a secure cookie or not.
    #
    # +val+ must be a boolean.
    def secure=(val)
      @secure = val if val == true or val == false
      @secure
    end

    # Set whether the Cookie is a httponly cookie or not.
    #
    # +val+ must be a boolean.
    def httponly=(val)
      @httponly = !!val
    end

    # Convert the Cookie to its string representation.
    def to_s
      val = collect{|v| CGI.escape(v) }.join("&")
      buf = "#{@name}=#{val}".dup
      buf << "; domain=#{@domain}" if @domain
      buf << "; path=#{@path}"     if @path
      buf << "; expires=#{CGI.rfc1123_date(@expires)}" if @expires
      buf << "; secure"            if @secure
      buf << "; HttpOnly"          if @httponly
      buf
    end

    # Parse a raw cookie string into a hash of cookie-name=>Cookie
    # pairs.
    #
    #   cookies = CGI::Cookie.parse("raw_cookie_string")
    #     # { "name1" => cookie1, "name2" => cookie2, ... }
    #
    def self.parse(raw_cookie)
      cookies = Hash.new([])
      return cookies unless raw_cookie

      raw_cookie.split(/;\s?/).each do |pairs|
        name, values = pairs.split('=',2)
        next unless name and values
        values ||= ""
        values = values.split('&').collect{|v| CGI.unescape(v,@@accept_charset) }
        if cookies.has_key?(name)
          cookies[name].concat(values)
        else
          cookies[name] = Cookie.new(name, *values)
        end
      end

      cookies
    end

    # A summary of cookie string.
    def inspect
      "#<CGI::Cookie: #{self.to_s.inspect}>"
    end

  end # class Cookie
end


PK}$[\��	����ruby/cgi/html.rbnu�[���# frozen_string_literal: true
class CGI
  # Base module for HTML-generation mixins.
  #
  # Provides methods for code generation for tags following
  # the various DTD element types.
  module TagMaker # :nodoc:

    # Generate code for an element with required start and end tags.
    #
    #   - -
    def nn_element(element, attributes = {})
      s = nOE_element(element, attributes)
      if block_given?
        s << yield.to_s
      end
      s << "</#{element.upcase}>"
    end

    def nn_element_def(attributes = {}, &block)
      nn_element(__callee__, attributes, &block)
    end

    # Generate code for an empty element.
    #
    #   - O EMPTY
    def nOE_element(element, attributes = {})
      attributes={attributes=>nil} if attributes.kind_of?(String)
      s = "<#{element.upcase}".dup
      attributes.each do|name, value|
        next unless value
        s << " "
        s << CGI.escapeHTML(name.to_s)
        if value != true
          s << '="'
          s << CGI.escapeHTML(value.to_s)
          s << '"'
        end
      end
      s << ">"
    end

    def nOE_element_def(attributes = {}, &block)
      nOE_element(__callee__, attributes, &block)
    end


    # Generate code for an element for which the end (and possibly the
    # start) tag is optional.
    #
    #   O O or - O
    def nO_element(element, attributes = {})
      s = nOE_element(element, attributes)
      if block_given?
        s << yield.to_s
        s << "</#{element.upcase}>"
      end
      s
    end

    def nO_element_def(attributes = {}, &block)
      nO_element(__callee__, attributes, &block)
    end

  end # TagMaker


  # Mixin module providing HTML generation methods.
  #
  # For example,
  #   cgi.a("http://www.example.com") { "Example" }
  #     # => "<A HREF=\"http://www.example.com\">Example</A>"
  #
  # Modules Html3, Html4, etc., contain more basic HTML-generation methods
  # (+#title+, +#h1+, etc.).
  #
  # See class CGI for a detailed example.
  #
  module HtmlExtension


    # Generate an Anchor element as a string.
    #
    # +href+ can either be a string, giving the URL
    # for the HREF attribute, or it can be a hash of
    # the element's attributes.
    #
    # The body of the element is the string returned by the no-argument
    # block passed in.
    #
    #   a("http://www.example.com") { "Example" }
    #     # => "<A HREF=\"http://www.example.com\">Example</A>"
    #
    #   a("HREF" => "http://www.example.com", "TARGET" => "_top") { "Example" }
    #     # => "<A HREF=\"http://www.example.com\" TARGET=\"_top\">Example</A>"
    #
    def a(href = "") # :yield:
      attributes = if href.kind_of?(String)
                     { "HREF" => href }
                   else
                     href
                   end
      super(attributes)
    end

    # Generate a Document Base URI element as a String.
    #
    # +href+ can either by a string, giving the base URL for the HREF
    # attribute, or it can be a has of the element's attributes.
    #
    # The passed-in no-argument block is ignored.
    #
    #   base("http://www.example.com/cgi")
    #     # => "<BASE HREF=\"http://www.example.com/cgi\">"
    def base(href = "") # :yield:
      attributes = if href.kind_of?(String)
                     { "HREF" => href }
                   else
                     href
                   end
      super(attributes)
    end

    # Generate a BlockQuote element as a string.
    #
    # +cite+ can either be a string, give the URI for the source of
    # the quoted text, or a hash, giving all attributes of the element,
    # or it can be omitted, in which case the element has no attributes.
    #
    # The body is provided by the passed-in no-argument block
    #
    #   blockquote("http://www.example.com/quotes/foo.html") { "Foo!" }
    #     #=> "<BLOCKQUOTE CITE=\"http://www.example.com/quotes/foo.html\">Foo!</BLOCKQUOTE>
    def blockquote(cite = {})  # :yield:
      attributes = if cite.kind_of?(String)
                     { "CITE" => cite }
                   else
                     cite
                   end
      super(attributes)
    end


    # Generate a Table Caption element as a string.
    #
    # +align+ can be a string, giving the alignment of the caption
    # (one of top, bottom, left, or right).  It can be a hash of
    # all the attributes of the element.  Or it can be omitted.
    #
    # The body of the element is provided by the passed-in no-argument block.
    #
    #   caption("left") { "Capital Cities" }
    #     # => <CAPTION ALIGN=\"left\">Capital Cities</CAPTION>
    def caption(align = {}) # :yield:
      attributes = if align.kind_of?(String)
                     { "ALIGN" => align }
                   else
                     align
                   end
      super(attributes)
    end


    # Generate a Checkbox Input element as a string.
    #
    # The attributes of the element can be specified as three arguments,
    # +name+, +value+, and +checked+.  +checked+ is a boolean value;
    # if true, the CHECKED attribute will be included in the element.
    #
    # Alternatively, the attributes can be specified as a hash.
    #
    #   checkbox("name")
    #     # = checkbox("NAME" => "name")
    #
    #   checkbox("name", "value")
    #     # = checkbox("NAME" => "name", "VALUE" => "value")
    #
    #   checkbox("name", "value", true)
    #     # = checkbox("NAME" => "name", "VALUE" => "value", "CHECKED" => true)
    def checkbox(name = "", value = nil, checked = nil)
      attributes = if name.kind_of?(String)
                     { "TYPE" => "checkbox", "NAME" => name,
                       "VALUE" => value, "CHECKED" => checked }
                   else
                     name["TYPE"] = "checkbox"
                     name
                   end
      input(attributes)
    end

    # Generate a sequence of checkbox elements, as a String.
    #
    # The checkboxes will all have the same +name+ attribute.
    # Each checkbox is followed by a label.
    # There will be one checkbox for each value.  Each value
    # can be specified as a String, which will be used both
    # as the value of the VALUE attribute and as the label
    # for that checkbox.  A single-element array has the
    # same effect.
    #
    # Each value can also be specified as a three-element array.
    # The first element is the VALUE attribute; the second is the
    # label; and the third is a boolean specifying whether this
    # checkbox is CHECKED.
    #
    # Each value can also be specified as a two-element
    # array, by omitting either the value element (defaults
    # to the same as the label), or the boolean checked element
    # (defaults to false).
    #
    #   checkbox_group("name", "foo", "bar", "baz")
    #     # <INPUT TYPE="checkbox" NAME="name" VALUE="foo">foo
    #     # <INPUT TYPE="checkbox" NAME="name" VALUE="bar">bar
    #     # <INPUT TYPE="checkbox" NAME="name" VALUE="baz">baz
    #
    #   checkbox_group("name", ["foo"], ["bar", true], "baz")
    #     # <INPUT TYPE="checkbox" NAME="name" VALUE="foo">foo
    #     # <INPUT TYPE="checkbox" CHECKED NAME="name" VALUE="bar">bar
    #     # <INPUT TYPE="checkbox" NAME="name" VALUE="baz">baz
    #
    #   checkbox_group("name", ["1", "Foo"], ["2", "Bar", true], "Baz")
    #     # <INPUT TYPE="checkbox" NAME="name" VALUE="1">Foo
    #     # <INPUT TYPE="checkbox" CHECKED NAME="name" VALUE="2">Bar
    #     # <INPUT TYPE="checkbox" NAME="name" VALUE="Baz">Baz
    #
    #   checkbox_group("NAME" => "name",
    #                    "VALUES" => ["foo", "bar", "baz"])
    #
    #   checkbox_group("NAME" => "name",
    #                    "VALUES" => [["foo"], ["bar", true], "baz"])
    #
    #   checkbox_group("NAME" => "name",
    #                    "VALUES" => [["1", "Foo"], ["2", "Bar", true], "Baz"])
    def checkbox_group(name = "", *values)
      if name.kind_of?(Hash)
        values = name["VALUES"]
        name = name["NAME"]
      end
      values.collect{|value|
        if value.kind_of?(String)
          checkbox(name, value) + value
        else
          if value[-1] == true || value[-1] == false
            checkbox(name, value[0],  value[-1]) +
            value[-2]
          else
            checkbox(name, value[0]) +
            value[-1]
          end
        end
      }.join
    end


    # Generate an File Upload Input element as a string.
    #
    # The attributes of the element can be specified as three arguments,
    # +name+, +size+, and +maxlength+.  +maxlength+ is the maximum length
    # of the file's _name_, not of the file's _contents_.
    #
    # Alternatively, the attributes can be specified as a hash.
    #
    # See #multipart_form() for forms that include file uploads.
    #
    #   file_field("name")
    #     # <INPUT TYPE="file" NAME="name" SIZE="20">
    #
    #   file_field("name", 40)
    #     # <INPUT TYPE="file" NAME="name" SIZE="40">
    #
    #   file_field("name", 40, 100)
    #     # <INPUT TYPE="file" NAME="name" SIZE="40" MAXLENGTH="100">
    #
    #   file_field("NAME" => "name", "SIZE" => 40)
    #     # <INPUT TYPE="file" NAME="name" SIZE="40">
    def file_field(name = "", size = 20, maxlength = nil)
      attributes = if name.kind_of?(String)
                     { "TYPE" => "file", "NAME" => name,
                       "SIZE" => size.to_s }
                   else
                     name["TYPE"] = "file"
                     name
                   end
      attributes["MAXLENGTH"] = maxlength.to_s if maxlength
      input(attributes)
    end


    # Generate a Form element as a string.
    #
    # +method+ should be either "get" or "post", and defaults to the latter.
    # +action+ defaults to the current CGI script name.  +enctype+
    # defaults to "application/x-www-form-urlencoded".
    #
    # Alternatively, the attributes can be specified as a hash.
    #
    # See also #multipart_form() for forms that include file uploads.
    #
    #   form{ "string" }
    #     # <FORM METHOD="post" ENCTYPE="application/x-www-form-urlencoded">string</FORM>
    #
    #   form("get") { "string" }
    #     # <FORM METHOD="get" ENCTYPE="application/x-www-form-urlencoded">string</FORM>
    #
    #   form("get", "url") { "string" }
    #     # <FORM METHOD="get" ACTION="url" ENCTYPE="application/x-www-form-urlencoded">string</FORM>
    #
    #   form("METHOD" => "post", "ENCTYPE" => "enctype") { "string" }
    #     # <FORM METHOD="post" ENCTYPE="enctype">string</FORM>
    def form(method = "post", action = script_name, enctype = "application/x-www-form-urlencoded")
      attributes = if method.kind_of?(String)
                     { "METHOD" => method, "ACTION" => action,
                       "ENCTYPE" => enctype }
                   else
                     unless method.has_key?("METHOD")
                       method["METHOD"] = "post"
                     end
                     unless method.has_key?("ENCTYPE")
                       method["ENCTYPE"] = enctype
                     end
                     method
                   end
      if block_given?
        body = yield
      else
        body = ""
      end
      if @output_hidden
        body << @output_hidden.collect{|k,v|
          "<INPUT TYPE=\"HIDDEN\" NAME=\"#{k}\" VALUE=\"#{v}\">"
        }.join
      end
      super(attributes){body}
    end

    # Generate a Hidden Input element as a string.
    #
    # The attributes of the element can be specified as two arguments,
    # +name+ and +value+.
    #
    # Alternatively, the attributes can be specified as a hash.
    #
    #   hidden("name")
    #     # <INPUT TYPE="hidden" NAME="name">
    #
    #   hidden("name", "value")
    #     # <INPUT TYPE="hidden" NAME="name" VALUE="value">
    #
    #   hidden("NAME" => "name", "VALUE" => "reset", "ID" => "foo")
    #     # <INPUT TYPE="hidden" NAME="name" VALUE="value" ID="foo">
    def hidden(name = "", value = nil)
      attributes = if name.kind_of?(String)
                     { "TYPE" => "hidden", "NAME" => name, "VALUE" => value }
                   else
                     name["TYPE"] = "hidden"
                     name
                   end
      input(attributes)
    end

    # Generate a top-level HTML element as a string.
    #
    # The attributes of the element are specified as a hash.  The
    # pseudo-attribute "PRETTY" can be used to specify that the generated
    # HTML string should be indented.  "PRETTY" can also be specified as
    # a string as the sole argument to this method.  The pseudo-attribute
    # "DOCTYPE", if given, is used as the leading DOCTYPE SGML tag; it
    # should include the entire text of this tag, including angle brackets.
    #
    # The body of the html element is supplied as a block.
    #
    #   html{ "string" }
    #     # <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML>string</HTML>
    #
    #   html("LANG" => "ja") { "string" }
    #     # <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML LANG="ja">string</HTML>
    #
    #   html("DOCTYPE" => false) { "string" }
    #     # <HTML>string</HTML>
    #
    #   html("DOCTYPE" => '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">') { "string" }
    #     # <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><HTML>string</HTML>
    #
    #   html("PRETTY" => "  ") { "<BODY></BODY>" }
    #     # <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
    #     # <HTML>
    #     #   <BODY>
    #     #   </BODY>
    #     # </HTML>
    #
    #   html("PRETTY" => "\t") { "<BODY></BODY>" }
    #     # <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
    #     # <HTML>
    #     #         <BODY>
    #     #         </BODY>
    #     # </HTML>
    #
    #   html("PRETTY") { "<BODY></BODY>" }
    #     # = html("PRETTY" => "  ") { "<BODY></BODY>" }
    #
    #   html(if $VERBOSE then "PRETTY" end) { "HTML string" }
    #
    def html(attributes = {}) # :yield:
      if nil == attributes
        attributes = {}
      elsif "PRETTY" == attributes
        attributes = { "PRETTY" => true }
      end
      pretty = attributes.delete("PRETTY")
      pretty = "  " if true == pretty
      buf = "".dup

      if attributes.has_key?("DOCTYPE")
        if attributes["DOCTYPE"]
          buf << attributes.delete("DOCTYPE")
        else
          attributes.delete("DOCTYPE")
        end
      else
        buf << doctype
      end

      buf << super(attributes)

      if pretty
        CGI.pretty(buf, pretty)
      else
        buf
      end

    end

    # Generate an Image Button Input element as a string.
    #
    # +src+ is the URL of the image to use for the button.  +name+
    # is the input name.  +alt+ is the alternative text for the image.
    #
    # Alternatively, the attributes can be specified as a hash.
    #
    #   image_button("url")
    #     # <INPUT TYPE="image" SRC="url">
    #
    #   image_button("url", "name", "string")
    #     # <INPUT TYPE="image" SRC="url" NAME="name" ALT="string">
    #
    #   image_button("SRC" => "url", "ALT" => "string")
    #     # <INPUT TYPE="image" SRC="url" ALT="string">
    def image_button(src = "", name = nil, alt = nil)
      attributes = if src.kind_of?(String)
                     { "TYPE" => "image", "SRC" => src, "NAME" => name,
                       "ALT" => alt }
                   else
                     src["TYPE"] = "image"
                     src["SRC"] ||= ""
                     src
                   end
      input(attributes)
    end


    # Generate an Image element as a string.
    #
    # +src+ is the URL of the image.  +alt+ is the alternative text for
    # the image.  +width+ is the width of the image, and +height+ is
    # its height.
    #
    # Alternatively, the attributes can be specified as a hash.
    #
    #   img("src", "alt", 100, 50)
    #     # <IMG SRC="src" ALT="alt" WIDTH="100" HEIGHT="50">
    #
    #   img("SRC" => "src", "ALT" => "alt", "WIDTH" => 100, "HEIGHT" => 50)
    #     # <IMG SRC="src" ALT="alt" WIDTH="100" HEIGHT="50">
    def img(src = "", alt = "", width = nil, height = nil)
      attributes = if src.kind_of?(String)
                     { "SRC" => src, "ALT" => alt }
                   else
                     src
                   end
      attributes["WIDTH"] = width.to_s if width
      attributes["HEIGHT"] = height.to_s if height
      super(attributes)
    end


    # Generate a Form element with multipart encoding as a String.
    #
    # Multipart encoding is used for forms that include file uploads.
    #
    # +action+ is the action to perform.  +enctype+ is the encoding
    # type, which defaults to "multipart/form-data".
    #
    # Alternatively, the attributes can be specified as a hash.
    #
    #   multipart_form{ "string" }
    #     # <FORM METHOD="post" ENCTYPE="multipart/form-data">string</FORM>
    #
    #   multipart_form("url") { "string" }
    #     # <FORM METHOD="post" ACTION="url" ENCTYPE="multipart/form-data">string</FORM>
    def multipart_form(action = nil, enctype = "multipart/form-data")
      attributes = if action == nil
                     { "METHOD" => "post", "ENCTYPE" => enctype }
                   elsif action.kind_of?(String)
                     { "METHOD" => "post", "ACTION" => action,
                       "ENCTYPE" => enctype }
                   else
                     unless action.has_key?("METHOD")
                       action["METHOD"] = "post"
                     end
                     unless action.has_key?("ENCTYPE")
                       action["ENCTYPE"] = enctype
                     end
                     action
                   end
      if block_given?
        form(attributes){ yield }
      else
        form(attributes)
      end
    end


    # Generate a Password Input element as a string.
    #
    # +name+ is the name of the input field.  +value+ is its default
    # value.  +size+ is the size of the input field display.  +maxlength+
    # is the maximum length of the inputted password.
    #
    # Alternatively, attributes can be specified as a hash.
    #
    #   password_field("name")
    #     # <INPUT TYPE="password" NAME="name" SIZE="40">
    #
    #   password_field("name", "value")
    #     # <INPUT TYPE="password" NAME="name" VALUE="value" SIZE="40">
    #
    #   password_field("password", "value", 80, 200)
    #     # <INPUT TYPE="password" NAME="name" VALUE="value" SIZE="80" MAXLENGTH="200">
    #
    #   password_field("NAME" => "name", "VALUE" => "value")
    #     # <INPUT TYPE="password" NAME="name" VALUE="value">
    def password_field(name = "", value = nil, size = 40, maxlength = nil)
      attributes = if name.kind_of?(String)
                     { "TYPE" => "password", "NAME" => name,
                       "VALUE" => value, "SIZE" => size.to_s }
                   else
                     name["TYPE"] = "password"
                     name
                   end
      attributes["MAXLENGTH"] = maxlength.to_s if maxlength
      input(attributes)
    end

    # Generate a Select element as a string.
    #
    # +name+ is the name of the element.  The +values+ are the options that
    # can be selected from the Select menu.  Each value can be a String or
    # a one, two, or three-element Array.  If a String or a one-element
    # Array, this is both the value of that option and the text displayed for
    # it.  If a three-element Array, the elements are the option value, displayed
    # text, and a boolean value specifying whether this option starts as selected.
    # The two-element version omits either the option value (defaults to the same
    # as the display text) or the boolean selected specifier (defaults to false).
    #
    # The attributes and options can also be specified as a hash.  In this
    # case, options are specified as an array of values as described above,
    # with the hash key of "VALUES".
    #
    #   popup_menu("name", "foo", "bar", "baz")
    #     # <SELECT NAME="name">
    #     #   <OPTION VALUE="foo">foo</OPTION>
    #     #   <OPTION VALUE="bar">bar</OPTION>
    #     #   <OPTION VALUE="baz">baz</OPTION>
    #     # </SELECT>
    #
    #   popup_menu("name", ["foo"], ["bar", true], "baz")
    #     # <SELECT NAME="name">
    #     #   <OPTION VALUE="foo">foo</OPTION>
    #     #   <OPTION VALUE="bar" SELECTED>bar</OPTION>
    #     #   <OPTION VALUE="baz">baz</OPTION>
    #     # </SELECT>
    #
    #   popup_menu("name", ["1", "Foo"], ["2", "Bar", true], "Baz")
    #     # <SELECT NAME="name">
    #     #   <OPTION VALUE="1">Foo</OPTION>
    #     #   <OPTION SELECTED VALUE="2">Bar</OPTION>
    #     #   <OPTION VALUE="Baz">Baz</OPTION>
    #     # </SELECT>
    #
    #   popup_menu("NAME" => "name", "SIZE" => 2, "MULTIPLE" => true,
    #               "VALUES" => [["1", "Foo"], ["2", "Bar", true], "Baz"])
    #     # <SELECT NAME="name" MULTIPLE SIZE="2">
    #     #   <OPTION VALUE="1">Foo</OPTION>
    #     #   <OPTION SELECTED VALUE="2">Bar</OPTION>
    #     #   <OPTION VALUE="Baz">Baz</OPTION>
    #     # </SELECT>
    def popup_menu(name = "", *values)

      if name.kind_of?(Hash)
        values   = name["VALUES"]
        size     = name["SIZE"].to_s if name["SIZE"]
        multiple = name["MULTIPLE"]
        name     = name["NAME"]
      else
        size = nil
        multiple = nil
      end

      select({ "NAME" => name, "SIZE" => size,
               "MULTIPLE" => multiple }){
        values.collect{|value|
          if value.kind_of?(String)
            option({ "VALUE" => value }){ value }
          else
            if value[value.size - 1] == true
              option({ "VALUE" => value[0], "SELECTED" => true }){
                value[value.size - 2]
              }
            else
              option({ "VALUE" => value[0] }){
                value[value.size - 1]
              }
            end
          end
        }.join
      }

    end

    # Generates a radio-button Input element.
    #
    # +name+ is the name of the input field.  +value+ is the value of
    # the field if checked.  +checked+ specifies whether the field
    # starts off checked.
    #
    # Alternatively, the attributes can be specified as a hash.
    #
    #   radio_button("name", "value")
    #     # <INPUT TYPE="radio" NAME="name" VALUE="value">
    #
    #   radio_button("name", "value", true)
    #     # <INPUT TYPE="radio" NAME="name" VALUE="value" CHECKED>
    #
    #   radio_button("NAME" => "name", "VALUE" => "value", "ID" => "foo")
    #     # <INPUT TYPE="radio" NAME="name" VALUE="value" ID="foo">
    def radio_button(name = "", value = nil, checked = nil)
      attributes = if name.kind_of?(String)
                     { "TYPE" => "radio", "NAME" => name,
                       "VALUE" => value, "CHECKED" => checked }
                   else
                     name["TYPE"] = "radio"
                     name
                   end
      input(attributes)
    end

    # Generate a sequence of radio button Input elements, as a String.
    #
    # This works the same as #checkbox_group().  However, it is not valid
    # to have more than one radiobutton in a group checked.
    #
    #   radio_group("name", "foo", "bar", "baz")
    #     # <INPUT TYPE="radio" NAME="name" VALUE="foo">foo
    #     # <INPUT TYPE="radio" NAME="name" VALUE="bar">bar
    #     # <INPUT TYPE="radio" NAME="name" VALUE="baz">baz
    #
    #   radio_group("name", ["foo"], ["bar", true], "baz")
    #     # <INPUT TYPE="radio" NAME="name" VALUE="foo">foo
    #     # <INPUT TYPE="radio" CHECKED NAME="name" VALUE="bar">bar
    #     # <INPUT TYPE="radio" NAME="name" VALUE="baz">baz
    #
    #   radio_group("name", ["1", "Foo"], ["2", "Bar", true], "Baz")
    #     # <INPUT TYPE="radio" NAME="name" VALUE="1">Foo
    #     # <INPUT TYPE="radio" CHECKED NAME="name" VALUE="2">Bar
    #     # <INPUT TYPE="radio" NAME="name" VALUE="Baz">Baz
    #
    #   radio_group("NAME" => "name",
    #                 "VALUES" => ["foo", "bar", "baz"])
    #
    #   radio_group("NAME" => "name",
    #                 "VALUES" => [["foo"], ["bar", true], "baz"])
    #
    #   radio_group("NAME" => "name",
    #                 "VALUES" => [["1", "Foo"], ["2", "Bar", true], "Baz"])
    def radio_group(name = "", *values)
      if name.kind_of?(Hash)
        values = name["VALUES"]
        name = name["NAME"]
      end
      values.collect{|value|
        if value.kind_of?(String)
          radio_button(name, value) + value
        else
          if value[-1] == true || value[-1] == false
            radio_button(name, value[0],  value[-1]) +
            value[-2]
          else
            radio_button(name, value[0]) +
            value[-1]
          end
        end
      }.join
    end

    # Generate a reset button Input element, as a String.
    #
    # This resets the values on a form to their initial values.  +value+
    # is the text displayed on the button. +name+ is the name of this button.
    #
    # Alternatively, the attributes can be specified as a hash.
    #
    #   reset
    #     # <INPUT TYPE="reset">
    #
    #   reset("reset")
    #     # <INPUT TYPE="reset" VALUE="reset">
    #
    #   reset("VALUE" => "reset", "ID" => "foo")
    #     # <INPUT TYPE="reset" VALUE="reset" ID="foo">
    def reset(value = nil, name = nil)
      attributes = if (not value) or value.kind_of?(String)
                     { "TYPE" => "reset", "VALUE" => value, "NAME" => name }
                   else
                     value["TYPE"] = "reset"
                     value
                   end
      input(attributes)
    end

    alias scrolling_list popup_menu

    # Generate a submit button Input element, as a String.
    #
    # +value+ is the text to display on the button.  +name+ is the name
    # of the input.
    #
    # Alternatively, the attributes can be specified as a hash.
    #
    #   submit
    #     # <INPUT TYPE="submit">
    #
    #   submit("ok")
    #     # <INPUT TYPE="submit" VALUE="ok">
    #
    #   submit("ok", "button1")
    #     # <INPUT TYPE="submit" VALUE="ok" NAME="button1">
    #
    #   submit("VALUE" => "ok", "NAME" => "button1", "ID" => "foo")
    #     # <INPUT TYPE="submit" VALUE="ok" NAME="button1" ID="foo">
    def submit(value = nil, name = nil)
      attributes = if (not value) or value.kind_of?(String)
                     { "TYPE" => "submit", "VALUE" => value, "NAME" => name }
                   else
                     value["TYPE"] = "submit"
                     value
                   end
      input(attributes)
    end

    # Generate a text field Input element, as a String.
    #
    # +name+ is the name of the input field.  +value+ is its initial
    # value.  +size+ is the size of the input area.  +maxlength+
    # is the maximum length of input accepted.
    #
    # Alternatively, the attributes can be specified as a hash.
    #
    #   text_field("name")
    #     # <INPUT TYPE="text" NAME="name" SIZE="40">
    #
    #   text_field("name", "value")
    #     # <INPUT TYPE="text" NAME="name" VALUE="value" SIZE="40">
    #
    #   text_field("name", "value", 80)
    #     # <INPUT TYPE="text" NAME="name" VALUE="value" SIZE="80">
    #
    #   text_field("name", "value", 80, 200)
    #     # <INPUT TYPE="text" NAME="name" VALUE="value" SIZE="80" MAXLENGTH="200">
    #
    #   text_field("NAME" => "name", "VALUE" => "value")
    #     # <INPUT TYPE="text" NAME="name" VALUE="value">
    def text_field(name = "", value = nil, size = 40, maxlength = nil)
      attributes = if name.kind_of?(String)
                     { "TYPE" => "text", "NAME" => name, "VALUE" => value,
                       "SIZE" => size.to_s }
                   else
                     name["TYPE"] = "text"
                     name
                   end
      attributes["MAXLENGTH"] = maxlength.to_s if maxlength
      input(attributes)
    end

    # Generate a TextArea element, as a String.
    #
    # +name+ is the name of the textarea.  +cols+ is the number of
    # columns and +rows+ is the number of rows in the display.
    #
    # Alternatively, the attributes can be specified as a hash.
    #
    # The body is provided by the passed-in no-argument block
    #
    #   textarea("name")
    #      # = textarea("NAME" => "name", "COLS" => 70, "ROWS" => 10)
    #
    #   textarea("name", 40, 5)
    #      # = textarea("NAME" => "name", "COLS" => 40, "ROWS" => 5)
    def textarea(name = "", cols = 70, rows = 10)  # :yield:
      attributes = if name.kind_of?(String)
                     { "NAME" => name, "COLS" => cols.to_s,
                       "ROWS" => rows.to_s }
                   else
                     name
                   end
      super(attributes)
    end

  end # HtmlExtension


  # Mixin module for HTML version 3 generation methods.
  module Html3 # :nodoc:
    include TagMaker

    # The DOCTYPE declaration for this version of HTML
    def doctype
      %|<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">|
    end

    instance_method(:nn_element_def).tap do |m|
      # - -
      for element in %w[ A TT I B U STRIKE BIG SMALL SUB SUP EM STRONG
          DFN CODE SAMP KBD VAR CITE FONT ADDRESS DIV CENTER MAP
          APPLET PRE XMP LISTING DL OL UL DIR MENU SELECT TABLE TITLE
          STYLE SCRIPT H1 H2 H3 H4 H5 H6 TEXTAREA FORM BLOCKQUOTE
          CAPTION ]
        define_method(element.downcase, m)
      end
    end

    instance_method(:nOE_element_def).tap do |m|
      # - O EMPTY
      for element in %w[ IMG BASE BASEFONT BR AREA LINK PARAM HR INPUT
          ISINDEX META ]
        define_method(element.downcase, m)
      end
    end

    instance_method(:nO_element_def).tap do |m|
      # O O or - O
      for element in %w[ HTML HEAD BODY P PLAINTEXT DT DD LI OPTION TR
          TH TD ]
        define_method(element.downcase, m)
      end
    end

  end # Html3


  # Mixin module for HTML version 4 generation methods.
  module Html4 # :nodoc:
    include TagMaker

    # The DOCTYPE declaration for this version of HTML
    def doctype
      %|<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">|
    end

    # Initialize the HTML generation methods for this version.
    # - -
    instance_method(:nn_element_def).tap do |m|
      for element in %w[ TT I B BIG SMALL EM STRONG DFN CODE SAMP KBD
        VAR CITE ABBR ACRONYM SUB SUP SPAN BDO ADDRESS DIV MAP OBJECT
        H1 H2 H3 H4 H5 H6 PRE Q INS DEL DL OL UL LABEL SELECT OPTGROUP
        FIELDSET LEGEND BUTTON TABLE TITLE STYLE SCRIPT NOSCRIPT
        TEXTAREA FORM A BLOCKQUOTE CAPTION ]
        define_method(element.downcase, m)
      end
    end

    # - O EMPTY
    instance_method(:nOE_element_def).tap do |m|
      for element in %w[ IMG BASE BR AREA LINK PARAM HR INPUT COL META ]
        define_method(element.downcase, m)
      end
    end

    # O O or - O
    instance_method(:nO_element_def).tap do |m|
      for element in %w[ HTML BODY P DT DD LI OPTION THEAD TFOOT TBODY
          COLGROUP TR TH TD HEAD ]
        define_method(element.downcase, m)
      end
    end

  end # Html4


  # Mixin module for HTML version 4 transitional generation methods.
  module Html4Tr # :nodoc:
    include TagMaker

    # The DOCTYPE declaration for this version of HTML
    def doctype
      %|<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">|
    end

    # Initialise the HTML generation methods for this version.
    # - -
    instance_method(:nn_element_def).tap do |m|
      for element in %w[ TT I B U S STRIKE BIG SMALL EM STRONG DFN
          CODE SAMP KBD VAR CITE ABBR ACRONYM FONT SUB SUP SPAN BDO
          ADDRESS DIV CENTER MAP OBJECT APPLET H1 H2 H3 H4 H5 H6 PRE Q
          INS DEL DL OL UL DIR MENU LABEL SELECT OPTGROUP FIELDSET
          LEGEND BUTTON TABLE IFRAME NOFRAMES TITLE STYLE SCRIPT
          NOSCRIPT TEXTAREA FORM A BLOCKQUOTE CAPTION ]
        define_method(element.downcase, m)
      end
    end

    # - O EMPTY
    instance_method(:nOE_element_def).tap do |m|
      for element in %w[ IMG BASE BASEFONT BR AREA LINK PARAM HR INPUT
          COL ISINDEX META ]
        define_method(element.downcase, m)
      end
    end

    # O O or - O
    instance_method(:nO_element_def).tap do |m|
      for element in %w[ HTML BODY P DT DD LI OPTION THEAD TFOOT TBODY
          COLGROUP TR TH TD HEAD ]
        define_method(element.downcase, m)
      end
    end

  end # Html4Tr


  # Mixin module for generating HTML version 4 with framesets.
  module Html4Fr # :nodoc:
    include TagMaker

    # The DOCTYPE declaration for this version of HTML
    def doctype
      %|<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">|
    end

    # Initialise the HTML generation methods for this version.
    # - -
    instance_method(:nn_element_def).tap do |m|
      for element in %w[ FRAMESET ]
        define_method(element.downcase, m)
      end
    end

    # - O EMPTY
    instance_method(:nOE_element_def).tap do |m|
      for element in %w[ FRAME ]
        define_method(element.downcase, m)
      end
    end

  end # Html4Fr


  # Mixin module for HTML version 5 generation methods.
  module Html5 # :nodoc:
    include TagMaker

    # The DOCTYPE declaration for this version of HTML
    def doctype
      %|<!DOCTYPE HTML>|
    end

    # Initialise the HTML generation methods for this version.
    # - -
    instance_method(:nn_element_def).tap do |m|
      for element in %w[ SECTION NAV ARTICLE ASIDE HGROUP HEADER
        FOOTER FIGURE FIGCAPTION S TIME U MARK RUBY BDI IFRAME
        VIDEO AUDIO CANVAS DATALIST OUTPUT PROGRESS METER DETAILS
        SUMMARY MENU DIALOG I B SMALL EM STRONG DFN CODE SAMP KBD
        VAR CITE ABBR SUB SUP SPAN BDO ADDRESS DIV MAP OBJECT
        H1 H2 H3 H4 H5 H6 PRE Q INS DEL DL OL UL LABEL SELECT
        FIELDSET LEGEND BUTTON TABLE TITLE STYLE SCRIPT NOSCRIPT
        TEXTAREA FORM A BLOCKQUOTE CAPTION ]
        define_method(element.downcase, m)
      end
    end

    # - O EMPTY
    instance_method(:nOE_element_def).tap do |m|
      for element in %w[ IMG BASE BR AREA LINK PARAM HR INPUT COL META
        COMMAND EMBED KEYGEN SOURCE TRACK WBR ]
        define_method(element.downcase, m)
      end
    end

    # O O or - O
    instance_method(:nO_element_def).tap do |m|
      for element in %w[ HTML HEAD BODY P DT DD LI OPTION THEAD TFOOT TBODY
          OPTGROUP COLGROUP RT RP TR TH TD ]
        define_method(element.downcase, m)
      end
    end

  end # Html5

  class HTML3
    include Html3
    include HtmlExtension
  end

  class HTML4
    include Html4
    include HtmlExtension
  end

  class HTML4Tr
    include Html4Tr
    include HtmlExtension
  end

  class HTML4Fr
    include Html4Tr
    include Html4Fr
    include HtmlExtension
  end

  class HTML5
    include Html5
    include HtmlExtension
  end

end
PK}$[%n&�Q
Q
ruby/cgi/session/pstore.rbnu�[���# frozen_string_literal: true
#
# cgi/session/pstore.rb - persistent storage of marshalled session data
#
# Documentation: William Webber (william@williamwebber.com)
#
# == Overview
#
# This file provides the CGI::Session::PStore class, which builds
# persistent of session data on top of the pstore library.  See
# cgi/session.rb for more details on session storage managers.

require_relative '../session'
require 'pstore'

class CGI
  class Session
    # PStore-based session storage class.
    #
    # This builds upon the top-level PStore class provided by the
    # library file pstore.rb.  Session data is marshalled and stored
    # in a file.  File locking and transaction services are provided.
    class PStore
      # Create a new CGI::Session::PStore instance
      #
      # This constructor is used internally by CGI::Session.  The
      # user does not generally need to call it directly.
      #
      # +session+ is the session for which this instance is being
      # created.  The session id must only contain alphanumeric
      # characters; automatically generated session ids observe
      # this requirement.
      #
      # +option+ is a hash of options for the initializer.  The
      # following options are recognised:
      #
      # tmpdir:: the directory to use for storing the PStore
      #          file.  Defaults to Dir::tmpdir (generally "/tmp"
      #          on Unix systems).
      # prefix:: the prefix to add to the session id when generating
      #          the filename for this session's PStore file.
      #          Defaults to the empty string.
      #
      # This session's PStore file will be created if it does
      # not exist, or opened if it does.
      def initialize(session, option={})
        option = {'suffix'=>''}.update(option)
        path, @hash = session.new_store_file(option)
        @p = ::PStore.new(path)
        @p.transaction do |p|
          File.chmod(0600, p.path)
        end
      end

      # Restore session state from the session's PStore file.
      #
      # Returns the session state as a hash.
      def restore
        unless @hash
          @p.transaction do
            @hash = @p['hash'] || {}
          end
        end
        @hash
      end

      # Save session state to the session's PStore file.
      def update
        @p.transaction do
          @p['hash'] = @hash
        end
      end

      # Update and close the session's PStore file.
      def close
        update
      end

      # Close and delete the session's PStore file.
      def delete
        path = @p.path
        File::unlink path
      end

    end
  end
end
# :enddoc:
PK}$[*7��@@ruby/cgi/util.rbnu�[���# frozen_string_literal: true
class CGI
  module Util; end
  include Util
  extend Util
end
module CGI::Util
  @@accept_charset = Encoding::UTF_8 unless defined?(@@accept_charset)

  # URL-encode a string into application/x-www-form-urlencoded.
  # Space characters (+" "+) are encoded with plus signs (+"+"+)
  #   url_encoded_string = CGI.escape("'Stop!' said Fred")
  #      # => "%27Stop%21%27+said+Fred"
  def escape(string)
    encoding = string.encoding
    buffer = string.b
    buffer.gsub!(/([^ a-zA-Z0-9_.\-~]+)/) do |m|
      '%' + m.unpack('H2' * m.bytesize).join('%').upcase
    end
    buffer.tr!(' ', '+')
    buffer.force_encoding(encoding)
  end

  # URL-decode an application/x-www-form-urlencoded string with encoding(optional).
  #   string = CGI.unescape("%27Stop%21%27+said+Fred")
  #      # => "'Stop!' said Fred"
  def unescape(string, encoding = @@accept_charset)
    str = string.tr('+', ' ')
    str = str.b
    str.gsub!(/((?:%[0-9a-fA-F]{2})+)/) do |m|
      [m.delete('%')].pack('H*')
    end
    str.force_encoding(encoding)
    str.valid_encoding? ? str : str.force_encoding(string.encoding)
  end

  # URL-encode a string following RFC 3986
  # Space characters (+" "+) are encoded with (+"%20"+)
  #   url_encoded_string = CGI.escape("'Stop!' said Fred")
  #      # => "%27Stop%21%27%20said%20Fred"
  def escapeURIComponent(string)
    encoding = string.encoding
    buffer = string.b
    buffer.gsub!(/([^a-zA-Z0-9_.\-~]+)/) do |m|
      '%' + m.unpack('H2' * m.bytesize).join('%').upcase
    end
    buffer.force_encoding(encoding)
  end

  # URL-decode a string following RFC 3986 with encoding(optional).
  #   string = CGI.unescape("%27Stop%21%27+said%20Fred")
  #      # => "'Stop!'+said Fred"
  def unescapeURIComponent(string, encoding = @@accept_charset)
    str = string.b
    str.gsub!(/((?:%[0-9a-fA-F]{2})+)/) do |m|
      [m.delete('%')].pack('H*')
    end
    str.force_encoding(encoding)
    str.valid_encoding? ? str : str.force_encoding(string.encoding)
  end

  # The set of special characters and their escaped values
  TABLE_FOR_ESCAPE_HTML__ = {
    "'" => '&#39;',
    '&' => '&amp;',
    '"' => '&quot;',
    '<' => '&lt;',
    '>' => '&gt;',
  }

  # Escape special characters in HTML, namely '&\"<>
  #   CGI.escapeHTML('Usage: foo "bar" <baz>')
  #      # => "Usage: foo &quot;bar&quot; &lt;baz&gt;"
  def escapeHTML(string)
    enc = string.encoding
    unless enc.ascii_compatible?
      if enc.dummy?
        origenc = enc
        enc = Encoding::Converter.asciicompat_encoding(enc)
        string = enc ? string.encode(enc) : string.b
      end
      table = Hash[TABLE_FOR_ESCAPE_HTML__.map {|pair|pair.map {|s|s.encode(enc)}}]
      string = string.gsub(/#{"['&\"<>]".encode(enc)}/, table)
      string.encode!(origenc) if origenc
      string
    else
      string = string.b
      string.gsub!(/['&\"<>]/, TABLE_FOR_ESCAPE_HTML__)
      string.force_encoding(enc)
    end
  end

  begin
    require 'cgi/escape'
  rescue LoadError
  end

  # Unescape a string that has been HTML-escaped
  #   CGI.unescapeHTML("Usage: foo &quot;bar&quot; &lt;baz&gt;")
  #      # => "Usage: foo \"bar\" <baz>"
  def unescapeHTML(string)
    enc = string.encoding
    unless enc.ascii_compatible?
      if enc.dummy?
        origenc = enc
        enc = Encoding::Converter.asciicompat_encoding(enc)
        string = enc ? string.encode(enc) : string.b
      end
      string = string.gsub(Regexp.new('&(apos|amp|quot|gt|lt|#[0-9]+|#x[0-9A-Fa-f]+);'.encode(enc))) do
        case $1.encode(Encoding::US_ASCII)
        when 'apos'                then "'".encode(enc)
        when 'amp'                 then '&'.encode(enc)
        when 'quot'                then '"'.encode(enc)
        when 'gt'                  then '>'.encode(enc)
        when 'lt'                  then '<'.encode(enc)
        when /\A#0*(\d+)\z/        then $1.to_i.chr(enc)
        when /\A#x([0-9a-f]+)\z/i  then $1.hex.chr(enc)
        end
      end
      string.encode!(origenc) if origenc
      return string
    end
    return string unless string.include? '&'
    charlimit = case enc
                when Encoding::UTF_8; 0x10ffff
                when Encoding::ISO_8859_1; 256
                else 128
                end
    string = string.b
    string.gsub!(/&(apos|amp|quot|gt|lt|\#[0-9]+|\#[xX][0-9A-Fa-f]+);/) do
      match = $1.dup
      case match
      when 'apos'                then "'"
      when 'amp'                 then '&'
      when 'quot'                then '"'
      when 'gt'                  then '>'
      when 'lt'                  then '<'
      when /\A#0*(\d+)\z/
        n = $1.to_i
        if n < charlimit
          n.chr(enc)
        else
          "&##{$1};"
        end
      when /\A#x([0-9a-f]+)\z/i
        n = $1.hex
        if n < charlimit
          n.chr(enc)
        else
          "&#x#{$1};"
        end
      else
        "&#{match};"
      end
    end
    string.force_encoding enc
  end

  # Synonym for CGI.escapeHTML(str)
  alias escape_html escapeHTML

  # Synonym for CGI.unescapeHTML(str)
  alias unescape_html unescapeHTML

  # Escape only the tags of certain HTML elements in +string+.
  #
  # Takes an element or elements or array of elements.  Each element
  # is specified by the name of the element, without angle brackets.
  # This matches both the start and the end tag of that element.
  # The attribute list of the open tag will also be escaped (for
  # instance, the double-quotes surrounding attribute values).
  #
  #   print CGI.escapeElement('<BR><A HREF="url"></A>', "A", "IMG")
  #     # "<BR>&lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt"
  #
  #   print CGI.escapeElement('<BR><A HREF="url"></A>', ["A", "IMG"])
  #     # "<BR>&lt;A HREF=&quot;url&quot;&gt;&lt;/A&gt"
  def escapeElement(string, *elements)
    elements = elements[0] if elements[0].kind_of?(Array)
    unless elements.empty?
      string.gsub(/<\/?(?:#{elements.join("|")})\b[^<>]*+>?/im) do
        CGI.escapeHTML($&)
      end
    else
      string
    end
  end

  # Undo escaping such as that done by CGI.escapeElement()
  #
  #   print CGI.unescapeElement(
  #           CGI.escapeHTML('<BR><A HREF="url"></A>'), "A", "IMG")
  #     # "&lt;BR&gt;<A HREF="url"></A>"
  #
  #   print CGI.unescapeElement(
  #           CGI.escapeHTML('<BR><A HREF="url"></A>'), ["A", "IMG"])
  #     # "&lt;BR&gt;<A HREF="url"></A>"
  def unescapeElement(string, *elements)
    elements = elements[0] if elements[0].kind_of?(Array)
    unless elements.empty?
      string.gsub(/&lt;\/?(?:#{elements.join("|")})\b(?>[^&]+|&(?![gl]t;)\w+;)*(?:&gt;)?/im) do
        unescapeHTML($&)
      end
    else
      string
    end
  end

  # Synonym for CGI.escapeElement(str)
  alias escape_element escapeElement

  # Synonym for CGI.unescapeElement(str)
  alias unescape_element unescapeElement

  # Format a +Time+ object as a String using the format specified by RFC 1123.
  #
  #   CGI.rfc1123_date(Time.now)
  #     # Sat, 01 Jan 2000 00:00:00 GMT
  def rfc1123_date(time)
    time.getgm.strftime("%a, %d %b %Y %T GMT")
  end

  # Prettify (indent) an HTML string.
  #
  # +string+ is the HTML string to indent.  +shift+ is the indentation
  # unit to use; it defaults to two spaces.
  #
  #   print CGI.pretty("<HTML><BODY></BODY></HTML>")
  #     # <HTML>
  #     #   <BODY>
  #     #   </BODY>
  #     # </HTML>
  #
  #   print CGI.pretty("<HTML><BODY></BODY></HTML>", "\t")
  #     # <HTML>
  #     #         <BODY>
  #     #         </BODY>
  #     # </HTML>
  #
  def pretty(string, shift = "  ")
    lines = string.gsub(/(?!\A)<.*?>/m, "\n\\0").gsub(/<.*?>(?!\n)/m, "\\0\n")
    end_pos = 0
    while end_pos = lines.index(/^<\/(\w+)/, end_pos)
      element = $1.dup
      start_pos = lines.rindex(/^\s*<#{element}/i, end_pos)
      lines[start_pos ... end_pos] = "__" + lines[start_pos ... end_pos].gsub(/\n(?!\z)/, "\n" + shift) + "__"
    end
    lines.gsub(/^((?:#{Regexp::quote(shift)})*)__(?=<\/?\w)/, '\1')
  end

  alias h escapeHTML
end
PK}$[P��L�Lruby/cgi/session.rbnu�[���# frozen_string_literal: true
#
# cgi/session.rb - session support for cgi scripts
#
# Copyright (C) 2001  Yukihiro "Matz" Matsumoto
# Copyright (C) 2000  Network Applied Communication Laboratory, Inc.
# Copyright (C) 2000  Information-technology Promotion Agency, Japan
#
# Author: Yukihiro "Matz" Matsumoto
#
# Documentation: William Webber (william@williamwebber.com)

require 'cgi'
require 'tmpdir'

class CGI

  # == Overview
  #
  # This file provides the CGI::Session class, which provides session
  # support for CGI scripts.  A session is a sequence of HTTP requests
  # and responses linked together and associated with a single client.
  # Information associated with the session is stored
  # on the server between requests.  A session id is passed between client
  # and server with every request and response, transparently
  # to the user.  This adds state information to the otherwise stateless
  # HTTP request/response protocol.
  #
  # == Lifecycle
  #
  # A CGI::Session instance is created from a CGI object.  By default,
  # this CGI::Session instance will start a new session if none currently
  # exists, or continue the current session for this client if one does
  # exist.  The +new_session+ option can be used to either always or
  # never create a new session.  See #new() for more details.
  #
  # #delete() deletes a session from session storage.  It
  # does not however remove the session id from the client.  If the client
  # makes another request with the same id, the effect will be to start
  # a new session with the old session's id.
  #
  # == Setting and retrieving session data.
  #
  # The Session class associates data with a session as key-value pairs.
  # This data can be set and retrieved by indexing the Session instance
  # using '[]', much the same as hashes (although other hash methods
  # are not supported).
  #
  # When session processing has been completed for a request, the
  # session should be closed using the close() method.  This will
  # store the session's state to persistent storage.  If you want
  # to store the session's state to persistent storage without
  # finishing session processing for this request, call the update()
  # method.
  #
  # == Storing session state
  #
  # The caller can specify what form of storage to use for the session's
  # data with the +database_manager+ option to CGI::Session::new.  The
  # following storage classes are provided as part of the standard library:
  #
  # CGI::Session::FileStore:: stores data as plain text in a flat file.  Only
  #                           works with String data.  This is the default
  #                           storage type.
  # CGI::Session::MemoryStore:: stores data in an in-memory hash.  The data
  #                             only persists for as long as the current Ruby
  #                             interpreter instance does.
  # CGI::Session::PStore:: stores data in Marshalled format.  Provided by
  #                        cgi/session/pstore.rb.  Supports data of any type,
  #                        and provides file-locking and transaction support.
  #
  # Custom storage types can also be created by defining a class with
  # the following methods:
  #
  #    new(session, options)
  #    restore  # returns hash of session data.
  #    update
  #    close
  #    delete
  #
  # Changing storage type mid-session does not work.  Note in particular
  # that by default the FileStore and PStore session data files have the
  # same name.  If your application switches from one to the other without
  # making sure that filenames will be different
  # and clients still have old sessions lying around in cookies, then
  # things will break nastily!
  #
  # == Maintaining the session id.
  #
  # Most session state is maintained on the server.  However, a session
  # id must be passed backwards and forwards between client and server
  # to maintain a reference to this session state.
  #
  # The simplest way to do this is via cookies.  The CGI::Session class
  # provides transparent support for session id communication via cookies
  # if the client has cookies enabled.
  #
  # If the client has cookies disabled, the session id must be included
  # as a parameter of all requests sent by the client to the server.  The
  # CGI::Session class in conjunction with the CGI class will transparently
  # add the session id as a hidden input field to all forms generated
  # using the CGI#form() HTML generation method.  No built-in support is
  # provided for other mechanisms, such as URL re-writing.  The caller is
  # responsible for extracting the session id from the session_id
  # attribute and manually encoding it in URLs and adding it as a hidden
  # input to HTML forms created by other mechanisms.  Also, session expiry
  # is not automatically handled.
  #
  # == Examples of use
  #
  # === Setting the user's name
  #
  #   require 'cgi'
  #   require 'cgi/session'
  #   require 'cgi/session/pstore'     # provides CGI::Session::PStore
  #
  #   cgi = CGI.new("html4")
  #
  #   session = CGI::Session.new(cgi,
  #       'database_manager' => CGI::Session::PStore,  # use PStore
  #       'session_key' => '_rb_sess_id',              # custom session key
  #       'session_expires' => Time.now + 30 * 60,     # 30 minute timeout
  #       'prefix' => 'pstore_sid_')                   # PStore option
  #   if cgi.has_key?('user_name') and cgi['user_name'] != ''
  #       # coerce to String: cgi[] returns the
  #       # string-like CGI::QueryExtension::Value
  #       session['user_name'] = cgi['user_name'].to_s
  #   elsif !session['user_name']
  #       session['user_name'] = "guest"
  #   end
  #   session.close
  #
  # === Creating a new session safely
  #
  #   require 'cgi'
  #   require 'cgi/session'
  #
  #   cgi = CGI.new("html4")
  #
  #   # We make sure to delete an old session if one exists,
  #   # not just to free resources, but to prevent the session
  #   # from being maliciously hijacked later on.
  #   begin
  #       session = CGI::Session.new(cgi, 'new_session' => false)
  #       session.delete
  #   rescue ArgumentError  # if no old session
  #   end
  #   session = CGI::Session.new(cgi, 'new_session' => true)
  #   session.close
  #
  class Session

    class NoSession < RuntimeError #:nodoc:
    end

    # The id of this session.
    attr_reader :session_id, :new_session

    def Session::callback(dbman)  #:nodoc:
      Proc.new{
        dbman[0].close unless dbman.empty?
      }
    end

    # Create a new session id.
    #
    # The session id is a secure random number by SecureRandom
    # if possible, otherwise an SHA512 hash based upon the time,
    # a random number, and a constant string.  This routine is
    # used internally for automatically generated session ids.
    def create_new_id
      require 'securerandom'
      begin
        # by OpenSSL, or system provided entropy pool
        session_id = SecureRandom.hex(16)
      rescue NotImplementedError
        # never happens on modern systems
        require 'digest'
        d = Digest('SHA512').new
        now = Time::now
        d.update(now.to_s)
        d.update(String(now.usec))
        d.update(String(rand(0)))
        d.update(String($$))
        d.update('foobar')
        session_id = d.hexdigest[0, 32]
      end
      session_id
    end
    private :create_new_id


    # Create a new file to store the session data.
    #
    # This file will be created if it does not exist, or opened if it
    # does.
    #
    # This path is generated under _tmpdir_ from _prefix_, the
    # digested session id, and _suffix_.
    #
    # +option+ is a hash of options for the initializer.  The
    # following options are recognised:
    #
    # tmpdir:: the directory to use for storing the FileStore
    #          file.  Defaults to Dir::tmpdir (generally "/tmp"
    #          on Unix systems).
    # prefix:: the prefix to add to the session id when generating
    #          the filename for this session's FileStore file.
    #          Defaults to "cgi_sid_".
    # suffix:: the prefix to add to the session id when generating
    #          the filename for this session's FileStore file.
    #          Defaults to the empty string.
    def new_store_file(option={}) # :nodoc:
      dir = option['tmpdir'] || Dir::tmpdir
      prefix = option['prefix']
      suffix = option['suffix']
      require 'digest/md5'
      md5 = Digest::MD5.hexdigest(session_id)[0,16]
      path = dir+"/"
      path << prefix if prefix
      path << md5
      path << suffix if suffix
      if File::exist? path
        hash = nil
      elsif new_session
        hash = {}
      else
        raise NoSession, "uninitialized session"
      end
      return path, hash
    end

    # Create a new CGI::Session object for +request+.
    #
    # +request+ is an instance of the +CGI+ class (see cgi.rb).
    # +option+ is a hash of options for initialising this
    # CGI::Session instance.  The following options are
    # recognised:
    #
    # session_key:: the parameter name used for the session id.
    #               Defaults to '_session_id'.
    # session_id:: the session id to use.  If not provided, then
    #              it is retrieved from the +session_key+ parameter
    #              of the request, or automatically generated for
    #              a new session.
    # new_session:: if true, force creation of a new session.  If not set,
    #               a new session is only created if none currently
    #               exists.  If false, a new session is never created,
    #               and if none currently exists and the +session_id+
    #               option is not set, an ArgumentError is raised.
    # database_manager:: the name of the class providing storage facilities
    #                    for session state persistence.  Built-in support
    #                    is provided for +FileStore+ (the default),
    #                    +MemoryStore+, and +PStore+ (from
    #                    cgi/session/pstore.rb).  See the documentation for
    #                    these classes for more details.
    #
    # The following options are also recognised, but only apply if the
    # session id is stored in a cookie.
    #
    # session_expires:: the time the current session expires, as a
    #                   +Time+ object.  If not set, the session will terminate
    #                   when the user's browser is closed.
    # session_domain:: the hostname domain for which this session is valid.
    #                  If not set, defaults to the hostname of the server.
    # session_secure:: if +true+, this session will only work over HTTPS.
    # session_path:: the path for which this session applies.  Defaults
    #                to the directory of the CGI script.
    #
    # +option+ is also passed on to the session storage class initializer; see
    # the documentation for each session storage class for the options
    # they support.
    #
    # The retrieved or created session is automatically added to +request+
    # as a cookie, and also to its +output_hidden+ table, which is used
    # to add hidden input elements to forms.
    #
    # *WARNING* the +output_hidden+
    # fields are surrounded by a <fieldset> tag in HTML 4 generation, which
    # is _not_ invisible on many browsers; you may wish to disable the
    # use of fieldsets with code similar to the following
    # (see http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/37805)
    #
    #   cgi = CGI.new("html4")
    #   class << cgi
    #       undef_method :fieldset
    #   end
    #
    def initialize(request, option={})
      @new_session = false
      session_key = option['session_key'] || '_session_id'
      session_id = option['session_id']
      unless session_id
        if option['new_session']
          session_id = create_new_id
          @new_session = true
        end
      end
      unless session_id
        if request.key?(session_key)
          session_id = request[session_key]
          session_id = session_id.read if session_id.respond_to?(:read)
        end
        unless session_id
          session_id, = request.cookies[session_key]
        end
        unless session_id
          unless option.fetch('new_session', true)
            raise ArgumentError, "session_key `%s' should be supplied"%session_key
          end
          session_id = create_new_id
          @new_session = true
        end
      end
      @session_id = session_id
      dbman = option['database_manager'] || FileStore
      begin
        @dbman = dbman::new(self, option)
      rescue NoSession
        unless option.fetch('new_session', true)
          raise ArgumentError, "invalid session_id `%s'"%session_id
        end
        session_id = @session_id = create_new_id unless session_id
        @new_session=true
        retry
      end
      request.instance_eval do
        @output_hidden = {session_key => session_id} unless option['no_hidden']
        @output_cookies =  [
          Cookie::new("name" => session_key,
          "value" => session_id,
          "expires" => option['session_expires'],
          "domain" => option['session_domain'],
          "secure" => option['session_secure'],
          "path" =>
          if option['session_path']
            option['session_path']
          elsif ENV["SCRIPT_NAME"]
            File::dirname(ENV["SCRIPT_NAME"])
          else
          ""
          end)
        ] unless option['no_cookies']
      end
      @dbprot = [@dbman]
      ObjectSpace::define_finalizer(self, Session::callback(@dbprot))
    end

    # Retrieve the session data for key +key+.
    def [](key)
      @data ||= @dbman.restore
      @data[key]
    end

    # Set the session data for key +key+.
    def []=(key, val)
      @write_lock ||= true
      @data ||= @dbman.restore
      @data[key] = val
    end

    # Store session data on the server.  For some session storage types,
    # this is a no-op.
    def update
      @dbman.update
    end

    # Store session data on the server and close the session storage.
    # For some session storage types, this is a no-op.
    def close
      @dbman.close
      @dbprot.clear
    end

    # Delete the session from storage.  Also closes the storage.
    #
    # Note that the session's data is _not_ automatically deleted
    # upon the session expiring.
    def delete
      @dbman.delete
      @dbprot.clear
    end

    # File-based session storage class.
    #
    # Implements session storage as a flat file of 'key=value' values.
    # This storage type only works directly with String values; the
    # user is responsible for converting other types to Strings when
    # storing and from Strings when retrieving.
    class FileStore
      # Create a new FileStore instance.
      #
      # This constructor is used internally by CGI::Session.  The
      # user does not generally need to call it directly.
      #
      # +session+ is the session for which this instance is being
      # created.  The session id must only contain alphanumeric
      # characters; automatically generated session ids observe
      # this requirement.
      #
      # +option+ is a hash of options for the initializer.  The
      # following options are recognised:
      #
      # tmpdir:: the directory to use for storing the FileStore
      #          file.  Defaults to Dir::tmpdir (generally "/tmp"
      #          on Unix systems).
      # prefix:: the prefix to add to the session id when generating
      #          the filename for this session's FileStore file.
      #          Defaults to "cgi_sid_".
      # suffix:: the prefix to add to the session id when generating
      #          the filename for this session's FileStore file.
      #          Defaults to the empty string.
      #
      # This session's FileStore file will be created if it does
      # not exist, or opened if it does.
      def initialize(session, option={})
        option = {'prefix' => 'cgi_sid_'}.update(option)
        @path, @hash = session.new_store_file(option)
      end

      # Restore session state from the session's FileStore file.
      #
      # Returns the session state as a hash.
      def restore
        unless @hash
          @hash = {}
          begin
            lockf = File.open(@path+".lock", "r")
            lockf.flock File::LOCK_SH
            f = File.open(@path, 'r')
            for line in f
              line.chomp!
              k, v = line.split('=',2)
              @hash[CGI.unescape(k)] = Marshal.restore(CGI.unescape(v))
            end
          ensure
            f&.close
            lockf&.close
          end
        end
        @hash
      end

      # Save session state to the session's FileStore file.
      def update
        return unless @hash
        begin
          lockf = File.open(@path+".lock", File::CREAT|File::RDWR, 0600)
          lockf.flock File::LOCK_EX
          f = File.open(@path+".new", File::CREAT|File::TRUNC|File::WRONLY, 0600)
          for k,v in @hash
            f.printf "%s=%s\n", CGI.escape(k), CGI.escape(String(Marshal.dump(v)))
          end
          f.close
          File.rename @path+".new", @path
        ensure
          f&.close
          lockf&.close
        end
      end

      # Update and close the session's FileStore file.
      def close
        update
      end

      # Close and delete the session's FileStore file.
      def delete
        File::unlink @path+".lock" rescue nil
        File::unlink @path+".new" rescue nil
        File::unlink @path rescue nil
      end
    end

    # In-memory session storage class.
    #
    # Implements session storage as a global in-memory hash.  Session
    # data will only persist for as long as the Ruby interpreter
    # instance does.
    class MemoryStore
      GLOBAL_HASH_TABLE = {} #:nodoc:

      # Create a new MemoryStore instance.
      #
      # +session+ is the session this instance is associated with.
      # +option+ is a list of initialisation options.  None are
      # currently recognized.
      def initialize(session, option=nil)
        @session_id = session.session_id
        unless GLOBAL_HASH_TABLE.key?(@session_id)
          unless session.new_session
            raise CGI::Session::NoSession, "uninitialized session"
          end
          GLOBAL_HASH_TABLE[@session_id] = {}
        end
      end

      # Restore session state.
      #
      # Returns session data as a hash.
      def restore
        GLOBAL_HASH_TABLE[@session_id]
      end

      # Update session state.
      #
      # A no-op.
      def update
        # don't need to update; hash is shared
      end

      # Close session storage.
      #
      # A no-op.
      def close
        # don't need to close
      end

      # Delete the session state.
      def delete
        GLOBAL_HASH_TABLE.delete(@session_id)
      end
    end

    # Dummy session storage class.
    #
    # Implements session storage place holder.  No actual storage
    # will be done.
    class NullStore
      # Create a new NullStore instance.
      #
      # +session+ is the session this instance is associated with.
      # +option+ is a list of initialisation options.  None are
      # currently recognised.
      def initialize(session, option=nil)
      end

      # Restore (empty) session state.
      def restore
        {}
      end

      # Update session state.
      #
      # A no-op.
      def update
      end

      # Close session storage.
      #
      # A no-op.
      def close
      end

      # Delete the session state.
      #
      # A no-op.
      def delete
      end
    end
  end
end
PK}$[@��%u%uruby/cgi/core.rbnu�[���# frozen_string_literal: true
#--
# Methods for generating HTML, parsing CGI-related parameters, and
# generating HTTP responses.
#++
class CGI
  unless const_defined?(:Util)
    module Util
      @@accept_charset = "UTF-8" # :nodoc:
    end
    include Util
    extend Util
  end

  $CGI_ENV = ENV    # for FCGI support

  # String for carriage return
  CR  = "\015"

  # String for linefeed
  LF  = "\012"

  # Standard internet newline sequence
  EOL = CR + LF

  REVISION = '$Id$' #:nodoc:

  # Whether processing will be required in binary vs text
  NEEDS_BINMODE = File::BINARY != 0

  # Path separators in different environments.
  PATH_SEPARATOR = {'UNIX'=>'/', 'WINDOWS'=>'\\', 'MACINTOSH'=>':'}

  # HTTP status codes.
  HTTP_STATUS = {
    "OK"                  => "200 OK",
    "PARTIAL_CONTENT"     => "206 Partial Content",
    "MULTIPLE_CHOICES"    => "300 Multiple Choices",
    "MOVED"               => "301 Moved Permanently",
    "REDIRECT"            => "302 Found",
    "NOT_MODIFIED"        => "304 Not Modified",
    "BAD_REQUEST"         => "400 Bad Request",
    "AUTH_REQUIRED"       => "401 Authorization Required",
    "FORBIDDEN"           => "403 Forbidden",
    "NOT_FOUND"           => "404 Not Found",
    "METHOD_NOT_ALLOWED"  => "405 Method Not Allowed",
    "NOT_ACCEPTABLE"      => "406 Not Acceptable",
    "LENGTH_REQUIRED"     => "411 Length Required",
    "PRECONDITION_FAILED" => "412 Precondition Failed",
    "SERVER_ERROR"        => "500 Internal Server Error",
    "NOT_IMPLEMENTED"     => "501 Method Not Implemented",
    "BAD_GATEWAY"         => "502 Bad Gateway",
    "VARIANT_ALSO_VARIES" => "506 Variant Also Negotiates"
  }

  # :startdoc:

  # Synonym for ENV.
  def env_table
    ENV
  end

  # Synonym for $stdin.
  def stdinput
    $stdin
  end

  # Synonym for $stdout.
  def stdoutput
    $stdout
  end

  private :env_table, :stdinput, :stdoutput

  # Create an HTTP header block as a string.
  #
  # :call-seq:
  #   http_header(content_type_string="text/html")
  #   http_header(headers_hash)
  #
  # Includes the empty line that ends the header block.
  #
  # +content_type_string+::
  #   If this form is used, this string is the <tt>Content-Type</tt>
  # +headers_hash+::
  #   A Hash of header values. The following header keys are recognized:
  #
  #   type:: The Content-Type header.  Defaults to "text/html"
  #   charset:: The charset of the body, appended to the Content-Type header.
  #   nph:: A boolean value.  If true, prepend protocol string and status
  #         code, and date; and sets default values for "server" and
  #         "connection" if not explicitly set.
  #   status::
  #     The HTTP status code as a String, returned as the Status header.  The
  #     values are:
  #
  #     OK:: 200 OK
  #     PARTIAL_CONTENT:: 206 Partial Content
  #     MULTIPLE_CHOICES:: 300 Multiple Choices
  #     MOVED:: 301 Moved Permanently
  #     REDIRECT:: 302 Found
  #     NOT_MODIFIED:: 304 Not Modified
  #     BAD_REQUEST:: 400 Bad Request
  #     AUTH_REQUIRED:: 401 Authorization Required
  #     FORBIDDEN:: 403 Forbidden
  #     NOT_FOUND:: 404 Not Found
  #     METHOD_NOT_ALLOWED:: 405 Method Not Allowed
  #     NOT_ACCEPTABLE:: 406 Not Acceptable
  #     LENGTH_REQUIRED:: 411 Length Required
  #     PRECONDITION_FAILED:: 412 Precondition Failed
  #     SERVER_ERROR:: 500 Internal Server Error
  #     NOT_IMPLEMENTED:: 501 Method Not Implemented
  #     BAD_GATEWAY:: 502 Bad Gateway
  #     VARIANT_ALSO_VARIES:: 506 Variant Also Negotiates
  #
  #   server:: The server software, returned as the Server header.
  #   connection:: The connection type, returned as the Connection header (for
  #                instance, "close".
  #   length:: The length of the content that will be sent, returned as the
  #            Content-Length header.
  #   language:: The language of the content, returned as the Content-Language
  #              header.
  #   expires:: The time on which the current content expires, as a +Time+
  #             object, returned as the Expires header.
  #   cookie::
  #     A cookie or cookies, returned as one or more Set-Cookie headers.  The
  #     value can be the literal string of the cookie; a CGI::Cookie object;
  #     an Array of literal cookie strings or Cookie objects; or a hash all of
  #     whose values are literal cookie strings or Cookie objects.
  #
  #     These cookies are in addition to the cookies held in the
  #     @output_cookies field.
  #
  #   Other headers can also be set; they are appended as key: value.
  #
  # Examples:
  #
  #   http_header
  #     # Content-Type: text/html
  #
  #   http_header("text/plain")
  #     # Content-Type: text/plain
  #
  #   http_header("nph"        => true,
  #               "status"     => "OK",  # == "200 OK"
  #                 # "status"     => "200 GOOD",
  #               "server"     => ENV['SERVER_SOFTWARE'],
  #               "connection" => "close",
  #               "type"       => "text/html",
  #               "charset"    => "iso-2022-jp",
  #                 # Content-Type: text/html; charset=iso-2022-jp
  #               "length"     => 103,
  #               "language"   => "ja",
  #               "expires"    => Time.now + 30,
  #               "cookie"     => [cookie1, cookie2],
  #               "my_header1" => "my_value",
  #               "my_header2" => "my_value")
  #
  # This method does not perform charset conversion.
  def http_header(options='text/html')
    if options.is_a?(String)
      content_type = options
      buf = _header_for_string(content_type)
    elsif options.is_a?(Hash)
      if options.size == 1 && options.has_key?('type')
        content_type = options['type']
        buf = _header_for_string(content_type)
      else
        buf = _header_for_hash(options.dup)
      end
    else
      raise ArgumentError.new("expected String or Hash but got #{options.class}")
    end
    if defined?(MOD_RUBY)
      _header_for_modruby(buf)
      return ''
    else
      buf << EOL    # empty line of separator
      return buf
    end
  end # http_header()

  # This method is an alias for #http_header, when HTML5 tag maker is inactive.
  #
  # NOTE: use #http_header to create HTTP header blocks, this alias is only
  # provided for backwards compatibility.
  #
  # Using #header with the HTML5 tag maker will create a <header> element.
  alias :header :http_header

  def _no_crlf_check(str)
    if str
      str = str.to_s
      raise "A HTTP status or header field must not include CR and LF" if str =~ /[\r\n]/
      str
    else
      nil
    end
  end
  private :_no_crlf_check

  def _header_for_string(content_type) #:nodoc:
    buf = ''.dup
    if nph?()
      buf << "#{_no_crlf_check($CGI_ENV['SERVER_PROTOCOL']) || 'HTTP/1.0'} 200 OK#{EOL}"
      buf << "Date: #{CGI.rfc1123_date(Time.now)}#{EOL}"
      buf << "Server: #{_no_crlf_check($CGI_ENV['SERVER_SOFTWARE'])}#{EOL}"
      buf << "Connection: close#{EOL}"
    end
    buf << "Content-Type: #{_no_crlf_check(content_type)}#{EOL}"
    if @output_cookies
      @output_cookies.each {|cookie| buf << "Set-Cookie: #{_no_crlf_check(cookie)}#{EOL}" }
    end
    return buf
  end # _header_for_string
  private :_header_for_string

  def _header_for_hash(options)  #:nodoc:
    buf = ''.dup
    ## add charset to option['type']
    options['type'] ||= 'text/html'
    charset = options.delete('charset')
    options['type'] += "; charset=#{charset}" if charset
    ## NPH
    options.delete('nph') if defined?(MOD_RUBY)
    if options.delete('nph') || nph?()
      protocol = _no_crlf_check($CGI_ENV['SERVER_PROTOCOL']) || 'HTTP/1.0'
      status = options.delete('status')
      status = HTTP_STATUS[status] || _no_crlf_check(status) || '200 OK'
      buf << "#{protocol} #{status}#{EOL}"
      buf << "Date: #{CGI.rfc1123_date(Time.now)}#{EOL}"
      options['server'] ||= $CGI_ENV['SERVER_SOFTWARE'] || ''
      options['connection'] ||= 'close'
    end
    ## common headers
    status = options.delete('status')
    buf << "Status: #{HTTP_STATUS[status] || _no_crlf_check(status)}#{EOL}" if status
    server = options.delete('server')
    buf << "Server: #{_no_crlf_check(server)}#{EOL}" if server
    connection = options.delete('connection')
    buf << "Connection: #{_no_crlf_check(connection)}#{EOL}" if connection
    type = options.delete('type')
    buf << "Content-Type: #{_no_crlf_check(type)}#{EOL}" #if type
    length = options.delete('length')
    buf << "Content-Length: #{_no_crlf_check(length)}#{EOL}" if length
    language = options.delete('language')
    buf << "Content-Language: #{_no_crlf_check(language)}#{EOL}" if language
    expires = options.delete('expires')
    buf << "Expires: #{CGI.rfc1123_date(expires)}#{EOL}" if expires
    ## cookie
    if cookie = options.delete('cookie')
      case cookie
      when String, Cookie
        buf << "Set-Cookie: #{_no_crlf_check(cookie)}#{EOL}"
      when Array
        arr = cookie
        arr.each {|c| buf << "Set-Cookie: #{_no_crlf_check(c)}#{EOL}" }
      when Hash
        hash = cookie
        hash.each_value {|c| buf << "Set-Cookie: #{_no_crlf_check(c)}#{EOL}" }
      end
    end
    if @output_cookies
      @output_cookies.each {|c| buf << "Set-Cookie: #{_no_crlf_check(c)}#{EOL}" }
    end
    ## other headers
    options.each do |key, value|
      buf << "#{_no_crlf_check(key)}: #{_no_crlf_check(value)}#{EOL}"
    end
    return buf
  end # _header_for_hash
  private :_header_for_hash

  def nph?  #:nodoc:
    return /IIS\/(\d+)/ =~ $CGI_ENV['SERVER_SOFTWARE'] && $1.to_i < 5
  end

  def _header_for_modruby(buf)  #:nodoc:
    request = Apache::request
    buf.scan(/([^:]+): (.+)#{EOL}/o) do |name, value|
      $stderr.printf("name:%s value:%s\n", name, value) if $DEBUG
      case name
      when 'Set-Cookie'
        request.headers_out.add(name, value)
      when /^status$/i
        request.status_line = value
        request.status = value.to_i
      when /^content-type$/i
        request.content_type = value
      when /^content-encoding$/i
        request.content_encoding = value
      when /^location$/i
        request.status = 302 if request.status == 200
        request.headers_out[name] = value
      else
        request.headers_out[name] = value
      end
    end
    request.send_http_header
    return ''
  end
  private :_header_for_modruby

  # Print an HTTP header and body to $DEFAULT_OUTPUT ($>)
  #
  # :call-seq:
  #   cgi.out(content_type_string='text/html')
  #   cgi.out(headers_hash)
  #
  # +content_type_string+::
  #   If a string is passed, it is assumed to be the content type.
  # +headers_hash+::
  #   This is a Hash of headers, similar to that used by #http_header.
  # +block+::
  #   A block is required and should evaluate to the body of the response.
  #
  # <tt>Content-Length</tt> is automatically calculated from the size of
  # the String returned by the content block.
  #
  # If <tt>ENV['REQUEST_METHOD'] == "HEAD"</tt>, then only the header
  # is output (the content block is still required, but it is ignored).
  #
  # If the charset is "iso-2022-jp" or "euc-jp" or "shift_jis" then the
  # content is converted to this charset, and the language is set to "ja".
  #
  # Example:
  #
  #   cgi = CGI.new
  #   cgi.out{ "string" }
  #     # Content-Type: text/html
  #     # Content-Length: 6
  #     #
  #     # string
  #
  #   cgi.out("text/plain") { "string" }
  #     # Content-Type: text/plain
  #     # Content-Length: 6
  #     #
  #     # string
  #
  #   cgi.out("nph"        => true,
  #           "status"     => "OK",  # == "200 OK"
  #           "server"     => ENV['SERVER_SOFTWARE'],
  #           "connection" => "close",
  #           "type"       => "text/html",
  #           "charset"    => "iso-2022-jp",
  #             # Content-Type: text/html; charset=iso-2022-jp
  #           "language"   => "ja",
  #           "expires"    => Time.now + (3600 * 24 * 30),
  #           "cookie"     => [cookie1, cookie2],
  #           "my_header1" => "my_value",
  #           "my_header2" => "my_value") { "string" }
  #      # HTTP/1.1 200 OK
  #      # Date: Sun, 15 May 2011 17:35:54 GMT
  #      # Server: Apache 2.2.0
  #      # Connection: close
  #      # Content-Type: text/html; charset=iso-2022-jp
  #      # Content-Length: 6
  #      # Content-Language: ja
  #      # Expires: Tue, 14 Jun 2011 17:35:54 GMT
  #      # Set-Cookie: foo
  #      # Set-Cookie: bar
  #      # my_header1: my_value
  #      # my_header2: my_value
  #      #
  #      # string
  def out(options = "text/html") # :yield:

    options = { "type" => options } if options.kind_of?(String)
    content = yield
    options["length"] = content.bytesize.to_s
    output = stdoutput
    output.binmode if defined? output.binmode
    output.print http_header(options)
    output.print content unless "HEAD" == env_table['REQUEST_METHOD']
  end


  # Print an argument or list of arguments to the default output stream
  #
  #   cgi = CGI.new
  #   cgi.print    # default:  cgi.print == $DEFAULT_OUTPUT.print
  def print(*options)
    stdoutput.print(*options)
  end

  # Parse an HTTP query string into a hash of key=>value pairs.
  #
  #   params = CGI.parse("query_string")
  #     # {"name1" => ["value1", "value2", ...],
  #     #  "name2" => ["value1", "value2", ...], ... }
  #
  def self.parse(query)
    params = {}
    query.split(/[&;]/).each do |pairs|
      key, value = pairs.split('=',2).collect{|v| CGI.unescape(v) }

      next unless key

      params[key] ||= []
      params[key].push(value) if value
    end

    params.default=[].freeze
    params
  end

  # Maximum content length of post data
  ##MAX_CONTENT_LENGTH  = 2 * 1024 * 1024

  # Maximum number of request parameters when multipart
  MAX_MULTIPART_COUNT = 128

  # Mixin module that provides the following:
  #
  # 1. Access to the CGI environment variables as methods.  See
  #    documentation to the CGI class for a list of these variables.  The
  #    methods are exposed by removing the leading +HTTP_+ (if it exists) and
  #    downcasing the name.  For example, +auth_type+ will return the
  #    environment variable +AUTH_TYPE+, and +accept+ will return the value
  #    for +HTTP_ACCEPT+.
  #
  # 2. Access to cookies, including the cookies attribute.
  #
  # 3. Access to parameters, including the params attribute, and overloading
  #    #[] to perform parameter value lookup by key.
  #
  # 4. The initialize_query method, for initializing the above
  #    mechanisms, handling multipart forms, and allowing the
  #    class to be used in "offline" mode.
  #
  module QueryExtension

    %w[ CONTENT_LENGTH SERVER_PORT ].each do |env|
      define_method(env.delete_prefix('HTTP_').downcase) do
        (val = env_table[env]) && Integer(val)
      end
    end

    %w[ AUTH_TYPE CONTENT_TYPE GATEWAY_INTERFACE PATH_INFO
        PATH_TRANSLATED QUERY_STRING REMOTE_ADDR REMOTE_HOST
        REMOTE_IDENT REMOTE_USER REQUEST_METHOD SCRIPT_NAME
        SERVER_NAME SERVER_PROTOCOL SERVER_SOFTWARE

        HTTP_ACCEPT HTTP_ACCEPT_CHARSET HTTP_ACCEPT_ENCODING
        HTTP_ACCEPT_LANGUAGE HTTP_CACHE_CONTROL HTTP_FROM HTTP_HOST
        HTTP_NEGOTIATE HTTP_PRAGMA HTTP_REFERER HTTP_USER_AGENT ].each do |env|
      define_method(env.delete_prefix('HTTP_').downcase) do
        env_table[env]
      end
    end

    # Get the raw cookies as a string.
    def raw_cookie
      env_table["HTTP_COOKIE"]
    end

    # Get the raw RFC2965 cookies as a string.
    def raw_cookie2
      env_table["HTTP_COOKIE2"]
    end

    # Get the cookies as a hash of cookie-name=>Cookie pairs.
    attr_accessor :cookies

    # Get the parameters as a hash of name=>values pairs, where
    # values is an Array.
    attr_reader :params

    # Get the uploaded files as a hash of name=>values pairs
    attr_reader :files

    # Set all the parameters.
    def params=(hash)
      @params.clear
      @params.update(hash)
    end

    ##
    # Parses multipart form elements according to
    #   http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2
    #
    # Returns a hash of multipart form parameters with bodies of type StringIO or
    # Tempfile depending on whether the multipart form element exceeds 10 KB
    #
    #   params[name => body]
    #
    def read_multipart(boundary, content_length)
      ## read first boundary
      stdin = stdinput
      first_line = "--#{boundary}#{EOL}"
      content_length -= first_line.bytesize
      status = stdin.read(first_line.bytesize)
      raise EOFError.new("no content body")  unless status
      raise EOFError.new("bad content body") unless first_line == status
      ## parse and set params
      params = {}
      @files = {}
      boundary_rexp = /--#{Regexp.quote(boundary)}(#{EOL}|--)/
      boundary_size = "#{EOL}--#{boundary}#{EOL}".bytesize
      buf = ''.dup
      bufsize = 10 * 1024
      max_count = MAX_MULTIPART_COUNT
      n = 0
      tempfiles = []
      while true
        (n += 1) < max_count or raise StandardError.new("too many parameters.")
        ## create body (StringIO or Tempfile)
        body = create_body(bufsize < content_length)
        tempfiles << body if defined?(Tempfile) && body.kind_of?(Tempfile)
        class << body
          if method_defined?(:path)
            alias local_path path
          else
            def local_path
              nil
            end
          end
          attr_reader :original_filename, :content_type
        end
        ## find head and boundary
        head = nil
        separator = EOL * 2
        until head && matched = boundary_rexp.match(buf)
          if !head && pos = buf.index(separator)
            len  = pos + EOL.bytesize
            head = buf[0, len]
            buf  = buf[(pos+separator.bytesize)..-1]
          else
            if head && buf.size > boundary_size
              len = buf.size - boundary_size
              body.print(buf[0, len])
              buf[0, len] = ''
            end
            c = stdin.read(bufsize < content_length ? bufsize : content_length)
            raise EOFError.new("bad content body") if c.nil? || c.empty?
            buf << c
            content_length -= c.bytesize
          end
        end
        ## read to end of boundary
        m = matched
        len = m.begin(0)
        s = buf[0, len]
        if s =~ /(\r?\n)\z/
          s = buf[0, len - $1.bytesize]
        end
        body.print(s)
        buf = buf[m.end(0)..-1]
        boundary_end = m[1]
        content_length = -1 if boundary_end == '--'
        ## reset file cursor position
        body.rewind
        ## original filename
        /Content-Disposition:.* filename=(?:"(.*?)"|([^;\r\n]*))/i.match(head)
        filename = $1 || $2 || ''.dup
        filename = CGI.unescape(filename) if unescape_filename?()
        body.instance_variable_set(:@original_filename, filename)
        ## content type
        /Content-Type: (.*)/i.match(head)
        (content_type = $1 || ''.dup).chomp!
        body.instance_variable_set(:@content_type, content_type)
        ## query parameter name
        /Content-Disposition:.* name=(?:"(.*?)"|([^;\r\n]*))/i.match(head)
        name = $1 || $2 || ''
        if body.original_filename.empty?
          value=body.read.dup.force_encoding(@accept_charset)
          body.close! if defined?(Tempfile) && body.kind_of?(Tempfile)
          (params[name] ||= []) << value
          unless value.valid_encoding?
            if @accept_charset_error_block
              @accept_charset_error_block.call(name,value)
            else
              raise InvalidEncoding,"Accept-Charset encoding error"
            end
          end
          class << params[name].last;self;end.class_eval do
            define_method(:read){self}
            define_method(:original_filename){""}
            define_method(:content_type){""}
          end
        else
          (params[name] ||= []) << body
          @files[name]=body
        end
        ## break loop
        break if content_length == -1
      end
      raise EOFError, "bad boundary end of body part" unless boundary_end =~ /--/
      params.default = []
      params
    rescue Exception
      if tempfiles
        tempfiles.each {|t|
          if t.path
            t.close!
          end
        }
      end
      raise
    end # read_multipart
    private :read_multipart
    def create_body(is_large)  #:nodoc:
      if is_large
        require 'tempfile'
        body = Tempfile.new('CGI', encoding: Encoding::ASCII_8BIT)
      else
        begin
          require 'stringio'
          body = StringIO.new("".b)
        rescue LoadError
          require 'tempfile'
          body = Tempfile.new('CGI', encoding: Encoding::ASCII_8BIT)
        end
      end
      body.binmode if defined? body.binmode
      return body
    end
    def unescape_filename?  #:nodoc:
      user_agent = $CGI_ENV['HTTP_USER_AGENT']
      return false unless user_agent
      return /Mac/i.match(user_agent) && /Mozilla/i.match(user_agent) && !/MSIE/i.match(user_agent)
    end

    # offline mode. read name=value pairs on standard input.
    def read_from_cmdline
      require "shellwords"

      string = unless ARGV.empty?
        ARGV.join(' ')
      else
        if STDIN.tty?
          STDERR.print(
            %|(offline mode: enter name=value pairs on standard input)\n|
          )
        end
        array = readlines rescue nil
        if not array.nil?
            array.join(' ').gsub(/\n/n, '')
        else
            ""
        end
      end.gsub(/\\=/n, '%3D').gsub(/\\&/n, '%26')

      words = Shellwords.shellwords(string)

      if words.find{|x| /=/n.match(x) }
        words.join('&')
      else
        words.join('+')
      end
    end
    private :read_from_cmdline

    # A wrapper class to use a StringIO object as the body and switch
    # to a TempFile when the passed threshold is passed.
    # Initialize the data from the query.
    #
    # Handles multipart forms (in particular, forms that involve file uploads).
    # Reads query parameters in the @params field, and cookies into @cookies.
    def initialize_query()
      if ("POST" == env_table['REQUEST_METHOD']) and
        %r|\Amultipart/form-data.*boundary=\"?([^\";,]+)\"?| =~ env_table['CONTENT_TYPE']
        current_max_multipart_length = @max_multipart_length.respond_to?(:call) ? @max_multipart_length.call : @max_multipart_length
        raise StandardError.new("too large multipart data.") if env_table['CONTENT_LENGTH'].to_i > current_max_multipart_length
        boundary = $1.dup
        @multipart = true
        @params = read_multipart(boundary, Integer(env_table['CONTENT_LENGTH']))
      else
        @multipart = false
        @params = CGI.parse(
                    case env_table['REQUEST_METHOD']
                    when "GET", "HEAD"
                      if defined?(MOD_RUBY)
                        Apache::request.args or ""
                      else
                        env_table['QUERY_STRING'] or ""
                      end
                    when "POST"
                      stdinput.binmode if defined? stdinput.binmode
                      stdinput.read(Integer(env_table['CONTENT_LENGTH'])) or ''
                    else
                      read_from_cmdline
                    end.dup.force_encoding(@accept_charset)
                  )
        unless Encoding.find(@accept_charset) == Encoding::ASCII_8BIT
          @params.each do |key,values|
            values.each do |value|
              unless value.valid_encoding?
                if @accept_charset_error_block
                  @accept_charset_error_block.call(key,value)
                else
                  raise InvalidEncoding,"Accept-Charset encoding error"
                end
              end
            end
          end
        end
      end

      @cookies = CGI::Cookie.parse((env_table['HTTP_COOKIE'] or env_table['COOKIE']))
    end
    private :initialize_query

    # Returns whether the form contained multipart/form-data
    def multipart?
      @multipart
    end

    # Get the value for the parameter with a given key.
    #
    # If the parameter has multiple values, only the first will be
    # retrieved; use #params to get the array of values.
    def [](key)
      params = @params[key]
      return '' unless params
      value = params[0]
      if @multipart
        if value
          return value
        elsif defined? StringIO
          StringIO.new("".b)
        else
          Tempfile.new("CGI",encoding: Encoding::ASCII_8BIT)
        end
      else
        str = if value then value.dup else "" end
        str
      end
    end

    # Return all query parameter names as an array of String.
    def keys(*args)
      @params.keys(*args)
    end

    # Returns true if a given query string parameter exists.
    def has_key?(*args)
      @params.has_key?(*args)
    end
    alias key? has_key?
    alias include? has_key?

  end # QueryExtension

  # Exception raised when there is an invalid encoding detected
  class InvalidEncoding < Exception; end

  # @@accept_charset is default accept character set.
  # This default value default is "UTF-8"
  # If you want to change the default accept character set
  # when create a new CGI instance, set this:
  #
  #   CGI.accept_charset = "EUC-JP"
  #
  @@accept_charset="UTF-8" if false # needed for rdoc?

  # Return the accept character set for all new CGI instances.
  def self.accept_charset
    @@accept_charset
  end

  # Set the accept character set for all new CGI instances.
  def self.accept_charset=(accept_charset)
    @@accept_charset=accept_charset
  end

  # Return the accept character set for this CGI instance.
  attr_reader :accept_charset

  # @@max_multipart_length is the maximum length of multipart data.
  # The default value is 128 * 1024 * 1024 bytes
  #
  # The default can be set to something else in the CGI constructor,
  # via the :max_multipart_length key in the option hash.
  #
  # See CGI.new documentation.
  #
  @@max_multipart_length= 128 * 1024 * 1024

  # Create a new CGI instance.
  #
  # :call-seq:
  #   CGI.new(tag_maker) { block }
  #   CGI.new(options_hash = {}) { block }
  #
  #
  # <tt>tag_maker</tt>::
  #   This is the same as using the +options_hash+ form with the value <tt>{
  #   :tag_maker => tag_maker }</tt> Note that it is recommended to use the
  #   +options_hash+ form, since it also allows you specify the charset you
  #   will accept.
  # <tt>options_hash</tt>::
  #   A Hash that recognizes three options:
  #
  #   <tt>:accept_charset</tt>::
  #     specifies encoding of received query string.  If omitted,
  #     <tt>@@accept_charset</tt> is used.  If the encoding is not valid, a
  #     CGI::InvalidEncoding will be raised.
  #
  #     Example. Suppose <tt>@@accept_charset</tt> is "UTF-8"
  #
  #     when not specified:
  #
  #         cgi=CGI.new      # @accept_charset # => "UTF-8"
  #
  #     when specified as "EUC-JP":
  #
  #         cgi=CGI.new(:accept_charset => "EUC-JP") # => "EUC-JP"
  #
  #   <tt>:tag_maker</tt>::
  #     String that specifies which version of the HTML generation methods to
  #     use.  If not specified, no HTML generation methods will be loaded.
  #
  #     The following values are supported:
  #
  #     "html3":: HTML 3.x
  #     "html4":: HTML 4.0
  #     "html4Tr":: HTML 4.0 Transitional
  #     "html4Fr":: HTML 4.0 with Framesets
  #     "html5":: HTML 5
  #
  #   <tt>:max_multipart_length</tt>::
  #     Specifies maximum length of multipart data. Can be an Integer scalar or
  #     a lambda, that will be evaluated when the request is parsed. This
  #     allows more complex logic to be set when determining whether to accept
  #     multipart data (e.g. consult a registered users upload allowance)
  #
  #     Default is 128 * 1024 * 1024 bytes
  #
  #         cgi=CGI.new(:max_multipart_length => 268435456) # simple scalar
  #
  #         cgi=CGI.new(:max_multipart_length => -> {check_filesystem}) # lambda
  #
  # <tt>block</tt>::
  #   If provided, the block is called when an invalid encoding is
  #   encountered. For example:
  #
  #     encoding_errors={}
  #     cgi=CGI.new(:accept_charset=>"EUC-JP") do |name,value|
  #       encoding_errors[name] = value
  #     end
  #
  # Finally, if the CGI object is not created in a standard CGI call
  # environment (that is, it can't locate REQUEST_METHOD in its environment),
  # then it will run in "offline" mode.  In this mode, it reads its parameters
  # from the command line or (failing that) from standard input.  Otherwise,
  # cookies and other parameters are parsed automatically from the standard
  # CGI locations, which varies according to the REQUEST_METHOD.
  def initialize(options = {}, &block) # :yields: name, value
    @accept_charset_error_block = block_given? ? block : nil
    @options={
      :accept_charset=>@@accept_charset,
      :max_multipart_length=>@@max_multipart_length
    }
    case options
    when Hash
      @options.merge!(options)
    when String
      @options[:tag_maker]=options
    end
    @accept_charset=@options[:accept_charset]
    @max_multipart_length=@options[:max_multipart_length]
    if defined?(MOD_RUBY) && !ENV.key?("GATEWAY_INTERFACE")
      Apache.request.setup_cgi_env
    end

    extend QueryExtension
    @multipart = false

    initialize_query()  # set @params, @cookies
    @output_cookies = nil
    @output_hidden = nil

    case @options[:tag_maker]
    when "html3"
      require_relative 'html'
      extend Html3
      extend HtmlExtension
    when "html4"
      require_relative 'html'
      extend Html4
      extend HtmlExtension
    when "html4Tr"
      require_relative 'html'
      extend Html4Tr
      extend HtmlExtension
    when "html4Fr"
      require_relative 'html'
      extend Html4Tr
      extend Html4Fr
      extend HtmlExtension
    when "html5"
      require_relative 'html'
      extend Html5
      extend HtmlExtension
    end
  end

end   # class CGI
PK}$[h�(�(ruby/resolv.rbnu�[���# frozen_string_literal: true

require 'socket'
require 'timeout'
require 'io/wait'

begin
  require 'securerandom'
rescue LoadError
end

# Resolv is a thread-aware DNS resolver library written in Ruby.  Resolv can
# handle multiple DNS requests concurrently without blocking the entire Ruby
# interpreter.
#
# See also resolv-replace.rb to replace the libc resolver with Resolv.
#
# Resolv can look up various DNS resources using the DNS module directly.
#
# Examples:
#
#   p Resolv.getaddress "www.ruby-lang.org"
#   p Resolv.getname "210.251.121.214"
#
#   Resolv::DNS.open do |dns|
#     ress = dns.getresources "www.ruby-lang.org", Resolv::DNS::Resource::IN::A
#     p ress.map(&:address)
#     ress = dns.getresources "ruby-lang.org", Resolv::DNS::Resource::IN::MX
#     p ress.map { |r| [r.exchange.to_s, r.preference] }
#   end
#
#
# == Bugs
#
# * NIS is not supported.
# * /etc/nsswitch.conf is not supported.

class Resolv

  ##
  # Looks up the first IP address for +name+.

  def self.getaddress(name)
    DefaultResolver.getaddress(name)
  end

  ##
  # Looks up all IP address for +name+.

  def self.getaddresses(name)
    DefaultResolver.getaddresses(name)
  end

  ##
  # Iterates over all IP addresses for +name+.

  def self.each_address(name, &block)
    DefaultResolver.each_address(name, &block)
  end

  ##
  # Looks up the hostname of +address+.

  def self.getname(address)
    DefaultResolver.getname(address)
  end

  ##
  # Looks up all hostnames for +address+.

  def self.getnames(address)
    DefaultResolver.getnames(address)
  end

  ##
  # Iterates over all hostnames for +address+.

  def self.each_name(address, &proc)
    DefaultResolver.each_name(address, &proc)
  end

  ##
  # Creates a new Resolv using +resolvers+.

  def initialize(resolvers=[Hosts.new, DNS.new])
    @resolvers = resolvers
  end

  ##
  # Looks up the first IP address for +name+.

  def getaddress(name)
    each_address(name) {|address| return address}
    raise ResolvError.new("no address for #{name}")
  end

  ##
  # Looks up all IP address for +name+.

  def getaddresses(name)
    ret = []
    each_address(name) {|address| ret << address}
    return ret
  end

  ##
  # Iterates over all IP addresses for +name+.

  def each_address(name)
    if AddressRegex =~ name
      yield name
      return
    end
    yielded = false
    @resolvers.each {|r|
      r.each_address(name) {|address|
        yield address.to_s
        yielded = true
      }
      return if yielded
    }
  end

  ##
  # Looks up the hostname of +address+.

  def getname(address)
    each_name(address) {|name| return name}
    raise ResolvError.new("no name for #{address}")
  end

  ##
  # Looks up all hostnames for +address+.

  def getnames(address)
    ret = []
    each_name(address) {|name| ret << name}
    return ret
  end

  ##
  # Iterates over all hostnames for +address+.

  def each_name(address)
    yielded = false
    @resolvers.each {|r|
      r.each_name(address) {|name|
        yield name.to_s
        yielded = true
      }
      return if yielded
    }
  end

  ##
  # Indicates a failure to resolve a name or address.

  class ResolvError < StandardError; end

  ##
  # Indicates a timeout resolving a name or address.

  class ResolvTimeout < Timeout::Error; end

  ##
  # Resolv::Hosts is a hostname resolver that uses the system hosts file.

  class Hosts
    if /mswin|mingw|cygwin/ =~ RUBY_PLATFORM and
      begin
        require 'win32/resolv'
        DefaultFileName = Win32::Resolv.get_hosts_path || IO::NULL
      rescue LoadError
      end
    end
    DefaultFileName ||= '/etc/hosts'

    ##
    # Creates a new Resolv::Hosts, using +filename+ for its data source.

    def initialize(filename = DefaultFileName)
      @filename = filename
      @mutex = Thread::Mutex.new
      @initialized = nil
    end

    def lazy_initialize # :nodoc:
      @mutex.synchronize {
        unless @initialized
          @name2addr = {}
          @addr2name = {}
          File.open(@filename, 'rb') {|f|
            f.each {|line|
              line.sub!(/#.*/, '')
              addr, hostname, *aliases = line.split(/\s+/)
              next unless addr
              @addr2name[addr] = [] unless @addr2name.include? addr
              @addr2name[addr] << hostname
              @addr2name[addr] += aliases
              @name2addr[hostname] = [] unless @name2addr.include? hostname
              @name2addr[hostname] << addr
              aliases.each {|n|
                @name2addr[n] = [] unless @name2addr.include? n
                @name2addr[n] << addr
              }
            }
          }
          @name2addr.each {|name, arr| arr.reverse!}
          @initialized = true
        end
      }
      self
    end

    ##
    # Gets the IP address of +name+ from the hosts file.

    def getaddress(name)
      each_address(name) {|address| return address}
      raise ResolvError.new("#{@filename} has no name: #{name}")
    end

    ##
    # Gets all IP addresses for +name+ from the hosts file.

    def getaddresses(name)
      ret = []
      each_address(name) {|address| ret << address}
      return ret
    end

    ##
    # Iterates over all IP addresses for +name+ retrieved from the hosts file.

    def each_address(name, &proc)
      lazy_initialize
      @name2addr[name]&.each(&proc)
    end

    ##
    # Gets the hostname of +address+ from the hosts file.

    def getname(address)
      each_name(address) {|name| return name}
      raise ResolvError.new("#{@filename} has no address: #{address}")
    end

    ##
    # Gets all hostnames for +address+ from the hosts file.

    def getnames(address)
      ret = []
      each_name(address) {|name| ret << name}
      return ret
    end

    ##
    # Iterates over all hostnames for +address+ retrieved from the hosts file.

    def each_name(address, &proc)
      lazy_initialize
      @addr2name[address]&.each(&proc)
    end
  end

  ##
  # Resolv::DNS is a DNS stub resolver.
  #
  # Information taken from the following places:
  #
  # * STD0013
  # * RFC 1035
  # * ftp://ftp.isi.edu/in-notes/iana/assignments/dns-parameters
  # * etc.

  class DNS

    ##
    # Default DNS Port

    Port = 53

    ##
    # Default DNS UDP packet size

    UDPSize = 512

    ##
    # Creates a new DNS resolver.  See Resolv::DNS.new for argument details.
    #
    # Yields the created DNS resolver to the block, if given, otherwise
    # returns it.

    def self.open(*args)
      dns = new(*args)
      return dns unless block_given?
      begin
        yield dns
      ensure
        dns.close
      end
    end

    ##
    # Creates a new DNS resolver.
    #
    # +config_info+ can be:
    #
    # nil:: Uses /etc/resolv.conf.
    # String:: Path to a file using /etc/resolv.conf's format.
    # Hash:: Must contain :nameserver, :search and :ndots keys.
    # :nameserver_port can be used to specify port number of nameserver address.
    #
    # The value of :nameserver should be an address string or
    # an array of address strings.
    # - :nameserver => '8.8.8.8'
    # - :nameserver => ['8.8.8.8', '8.8.4.4']
    #
    # The value of :nameserver_port should be an array of
    # pair of nameserver address and port number.
    # - :nameserver_port => [['8.8.8.8', 53], ['8.8.4.4', 53]]
    #
    # Example:
    #
    #   Resolv::DNS.new(:nameserver => ['210.251.121.21'],
    #                   :search => ['ruby-lang.org'],
    #                   :ndots => 1)

    def initialize(config_info=nil)
      @mutex = Thread::Mutex.new
      @config = Config.new(config_info)
      @initialized = nil
    end

    # Sets the resolver timeouts.  This may be a single positive number
    # or an array of positive numbers representing timeouts in seconds.
    # If an array is specified, a DNS request will retry and wait for
    # each successive interval in the array until a successful response
    # is received.  Specifying +nil+ reverts to the default timeouts:
    # [ 5, second = 5 * 2 / nameserver_count, 2 * second, 4 * second ]
    #
    # Example:
    #
    #   dns.timeouts = 3
    #
    def timeouts=(values)
      @config.timeouts = values
    end

    def lazy_initialize # :nodoc:
      @mutex.synchronize {
        unless @initialized
          @config.lazy_initialize
          @initialized = true
        end
      }
      self
    end

    ##
    # Closes the DNS resolver.

    def close
      @mutex.synchronize {
        if @initialized
          @initialized = false
        end
      }
    end

    ##
    # Gets the IP address of +name+ from the DNS resolver.
    #
    # +name+ can be a Resolv::DNS::Name or a String.  Retrieved address will
    # be a Resolv::IPv4 or Resolv::IPv6

    def getaddress(name)
      each_address(name) {|address| return address}
      raise ResolvError.new("DNS result has no information for #{name}")
    end

    ##
    # Gets all IP addresses for +name+ from the DNS resolver.
    #
    # +name+ can be a Resolv::DNS::Name or a String.  Retrieved addresses will
    # be a Resolv::IPv4 or Resolv::IPv6

    def getaddresses(name)
      ret = []
      each_address(name) {|address| ret << address}
      return ret
    end

    ##
    # Iterates over all IP addresses for +name+ retrieved from the DNS
    # resolver.
    #
    # +name+ can be a Resolv::DNS::Name or a String.  Retrieved addresses will
    # be a Resolv::IPv4 or Resolv::IPv6

    def each_address(name)
      each_resource(name, Resource::IN::A) {|resource| yield resource.address}
      if use_ipv6?
        each_resource(name, Resource::IN::AAAA) {|resource| yield resource.address}
      end
    end

    def use_ipv6? # :nodoc:
      begin
        list = Socket.ip_address_list
      rescue NotImplementedError
        return true
      end
      list.any? {|a| a.ipv6? && !a.ipv6_loopback? && !a.ipv6_linklocal? }
    end
    private :use_ipv6?

    ##
    # Gets the hostname for +address+ from the DNS resolver.
    #
    # +address+ must be a Resolv::IPv4, Resolv::IPv6 or a String.  Retrieved
    # name will be a Resolv::DNS::Name.

    def getname(address)
      each_name(address) {|name| return name}
      raise ResolvError.new("DNS result has no information for #{address}")
    end

    ##
    # Gets all hostnames for +address+ from the DNS resolver.
    #
    # +address+ must be a Resolv::IPv4, Resolv::IPv6 or a String.  Retrieved
    # names will be Resolv::DNS::Name instances.

    def getnames(address)
      ret = []
      each_name(address) {|name| ret << name}
      return ret
    end

    ##
    # Iterates over all hostnames for +address+ retrieved from the DNS
    # resolver.
    #
    # +address+ must be a Resolv::IPv4, Resolv::IPv6 or a String.  Retrieved
    # names will be Resolv::DNS::Name instances.

    def each_name(address)
      case address
      when Name
        ptr = address
      when IPv4, IPv6
        ptr = address.to_name
      when IPv4::Regex
        ptr = IPv4.create(address).to_name
      when IPv6::Regex
        ptr = IPv6.create(address).to_name
      else
        raise ResolvError.new("cannot interpret as address: #{address}")
      end
      each_resource(ptr, Resource::IN::PTR) {|resource| yield resource.name}
    end

    ##
    # Look up the +typeclass+ DNS resource of +name+.
    #
    # +name+ must be a Resolv::DNS::Name or a String.
    #
    # +typeclass+ should be one of the following:
    #
    # * Resolv::DNS::Resource::IN::A
    # * Resolv::DNS::Resource::IN::AAAA
    # * Resolv::DNS::Resource::IN::ANY
    # * Resolv::DNS::Resource::IN::CNAME
    # * Resolv::DNS::Resource::IN::HINFO
    # * Resolv::DNS::Resource::IN::MINFO
    # * Resolv::DNS::Resource::IN::MX
    # * Resolv::DNS::Resource::IN::NS
    # * Resolv::DNS::Resource::IN::PTR
    # * Resolv::DNS::Resource::IN::SOA
    # * Resolv::DNS::Resource::IN::TXT
    # * Resolv::DNS::Resource::IN::WKS
    #
    # Returned resource is represented as a Resolv::DNS::Resource instance,
    # i.e. Resolv::DNS::Resource::IN::A.

    def getresource(name, typeclass)
      each_resource(name, typeclass) {|resource| return resource}
      raise ResolvError.new("DNS result has no information for #{name}")
    end

    ##
    # Looks up all +typeclass+ DNS resources for +name+.  See #getresource for
    # argument details.

    def getresources(name, typeclass)
      ret = []
      each_resource(name, typeclass) {|resource| ret << resource}
      return ret
    end

    ##
    # Iterates over all +typeclass+ DNS resources for +name+.  See
    # #getresource for argument details.

    def each_resource(name, typeclass, &proc)
      fetch_resource(name, typeclass) {|reply, reply_name|
        extract_resources(reply, reply_name, typeclass, &proc)
      }
    end

    def fetch_resource(name, typeclass)
      lazy_initialize
      begin
        requester = make_udp_requester
      rescue Errno::EACCES
        # fall back to TCP
      end
      senders = {}
      begin
        @config.resolv(name) {|candidate, tout, nameserver, port|
          requester ||= make_tcp_requester(nameserver, port)
          msg = Message.new
          msg.rd = 1
          msg.add_question(candidate, typeclass)
          unless sender = senders[[candidate, nameserver, port]]
            sender = requester.sender(msg, candidate, nameserver, port)
            next if !sender
            senders[[candidate, nameserver, port]] = sender
          end
          reply, reply_name = requester.request(sender, tout)
          case reply.rcode
          when RCode::NoError
            if reply.tc == 1 and not Requester::TCP === requester
              requester.close
              # Retry via TCP:
              requester = make_tcp_requester(nameserver, port)
              senders = {}
              # This will use TCP for all remaining candidates (assuming the
              # current candidate does not already respond successfully via
              # TCP).  This makes sense because we already know the full
              # response will not fit in an untruncated UDP packet.
              redo
            else
              yield(reply, reply_name)
            end
            return
          when RCode::NXDomain
            raise Config::NXDomain.new(reply_name.to_s)
          else
            raise Config::OtherResolvError.new(reply_name.to_s)
          end
        }
      ensure
        requester&.close
      end
    end

    def make_udp_requester # :nodoc:
      nameserver_port = @config.nameserver_port
      if nameserver_port.length == 1
        Requester::ConnectedUDP.new(*nameserver_port[0])
      else
        Requester::UnconnectedUDP.new(*nameserver_port)
      end
    end

    def make_tcp_requester(host, port) # :nodoc:
      return Requester::TCP.new(host, port)
    end

    def extract_resources(msg, name, typeclass) # :nodoc:
      if typeclass < Resource::ANY
        n0 = Name.create(name)
        msg.each_resource {|n, ttl, data|
          yield data if n0 == n
        }
      end
      yielded = false
      n0 = Name.create(name)
      msg.each_resource {|n, ttl, data|
        if n0 == n
          case data
          when typeclass
            yield data
            yielded = true
          when Resource::CNAME
            n0 = data.name
          end
        end
      }
      return if yielded
      msg.each_resource {|n, ttl, data|
        if n0 == n
          case data
          when typeclass
            yield data
          end
        end
      }
    end

    if defined? SecureRandom
      def self.random(arg) # :nodoc:
        begin
          SecureRandom.random_number(arg)
        rescue NotImplementedError
          rand(arg)
        end
      end
    else
      def self.random(arg) # :nodoc:
        rand(arg)
      end
    end

    RequestID = {} # :nodoc:
    RequestIDMutex = Thread::Mutex.new # :nodoc:

    def self.allocate_request_id(host, port) # :nodoc:
      id = nil
      RequestIDMutex.synchronize {
        h = (RequestID[[host, port]] ||= {})
        begin
          id = random(0x0000..0xffff)
        end while h[id]
        h[id] = true
      }
      id
    end

    def self.free_request_id(host, port, id) # :nodoc:
      RequestIDMutex.synchronize {
        key = [host, port]
        if h = RequestID[key]
          h.delete id
          if h.empty?
            RequestID.delete key
          end
        end
      }
    end

    def self.bind_random_port(udpsock, bind_host="0.0.0.0") # :nodoc:
      begin
        port = random(1024..65535)
        udpsock.bind(bind_host, port)
      rescue Errno::EADDRINUSE, # POSIX
             Errno::EACCES, # SunOS: See PRIV_SYS_NFS in privileges(5)
             Errno::EPERM # FreeBSD: security.mac.portacl.port_high is configurable.  See mac_portacl(4).
        retry
      end
    end

    class Requester # :nodoc:
      def initialize
        @senders = {}
        @socks = nil
      end

      def request(sender, tout)
        start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
        timelimit = start + tout
        begin
          sender.send
        rescue Errno::EHOSTUNREACH, # multi-homed IPv6 may generate this
               Errno::ENETUNREACH
          raise ResolvTimeout
        end
        while true
          before_select = Process.clock_gettime(Process::CLOCK_MONOTONIC)
          timeout = timelimit - before_select
          if timeout <= 0
            raise ResolvTimeout
          end
          if @socks.size == 1
            select_result = @socks[0].wait_readable(timeout) ? [ @socks ] : nil
          else
            select_result = IO.select(@socks, nil, nil, timeout)
          end
          if !select_result
            after_select = Process.clock_gettime(Process::CLOCK_MONOTONIC)
            next if after_select < timelimit
            raise ResolvTimeout
          end
          begin
            reply, from = recv_reply(select_result[0])
          rescue Errno::ECONNREFUSED, # GNU/Linux, FreeBSD
                 Errno::ECONNRESET # Windows
            # No name server running on the server?
            # Don't wait anymore.
            raise ResolvTimeout
          end
          begin
            msg = Message.decode(reply)
          rescue DecodeError
            next # broken DNS message ignored
          end
          if sender == sender_for(from, msg)
            break
          else
            # unexpected DNS message ignored
          end
        end
        return msg, sender.data
      end

      def sender_for(addr, msg)
        @senders[[addr,msg.id]]
      end

      def close
        socks = @socks
        @socks = nil
        socks&.each(&:close)
      end

      class Sender # :nodoc:
        def initialize(msg, data, sock)
          @msg = msg
          @data = data
          @sock = sock
        end
      end

      class UnconnectedUDP < Requester # :nodoc:
        def initialize(*nameserver_port)
          super()
          @nameserver_port = nameserver_port
          @initialized = false
          @mutex = Thread::Mutex.new
        end

        def lazy_initialize
          @mutex.synchronize {
            next if @initialized
            @initialized = true
            @socks_hash = {}
            @socks = []
            @nameserver_port.each {|host, port|
              if host.index(':')
                bind_host = "::"
                af = Socket::AF_INET6
              else
                bind_host = "0.0.0.0"
                af = Socket::AF_INET
              end
              next if @socks_hash[bind_host]
              begin
                sock = UDPSocket.new(af)
              rescue Errno::EAFNOSUPPORT
                next # The kernel doesn't support the address family.
              end
              @socks << sock
              @socks_hash[bind_host] = sock
              sock.do_not_reverse_lookup = true
              DNS.bind_random_port(sock, bind_host)
            }
          }
          self
        end

        def recv_reply(readable_socks)
          lazy_initialize
          reply, from = readable_socks[0].recvfrom(UDPSize)
          return reply, [from[3],from[1]]
        end

        def sender(msg, data, host, port=Port)
          host = Addrinfo.ip(host).ip_address
          lazy_initialize
          sock = @socks_hash[host.index(':') ? "::" : "0.0.0.0"]
          return nil if !sock
          service = [host, port]
          id = DNS.allocate_request_id(host, port)
          request = msg.encode
          request[0,2] = [id].pack('n')
          return @senders[[service, id]] =
            Sender.new(request, data, sock, host, port)
        end

        def close
          @mutex.synchronize {
            if @initialized
              super
              @senders.each_key {|service, id|
                DNS.free_request_id(service[0], service[1], id)
              }
              @initialized = false
            end
          }
        end

        class Sender < Requester::Sender # :nodoc:
          def initialize(msg, data, sock, host, port)
            super(msg, data, sock)
            @host = host
            @port = port
          end
          attr_reader :data

          def send
            raise "@sock is nil." if @sock.nil?
            @sock.send(@msg, 0, @host, @port)
          end
        end
      end

      class ConnectedUDP < Requester # :nodoc:
        def initialize(host, port=Port)
          super()
          @host = host
          @port = port
          @mutex = Thread::Mutex.new
          @initialized = false
        end

        def lazy_initialize
          @mutex.synchronize {
            next if @initialized
            @initialized = true
            is_ipv6 = @host.index(':')
            sock = UDPSocket.new(is_ipv6 ? Socket::AF_INET6 : Socket::AF_INET)
            @socks = [sock]
            sock.do_not_reverse_lookup = true
            DNS.bind_random_port(sock, is_ipv6 ? "::" : "0.0.0.0")
            sock.connect(@host, @port)
          }
          self
        end

        def recv_reply(readable_socks)
          lazy_initialize
          reply = readable_socks[0].recv(UDPSize)
          return reply, nil
        end

        def sender(msg, data, host=@host, port=@port)
          lazy_initialize
          unless host == @host && port == @port
            raise RequestError.new("host/port don't match: #{host}:#{port}")
          end
          id = DNS.allocate_request_id(@host, @port)
          request = msg.encode
          request[0,2] = [id].pack('n')
          return @senders[[nil,id]] = Sender.new(request, data, @socks[0])
        end

        def close
          @mutex.synchronize do
            if @initialized
              super
              @senders.each_key {|from, id|
                DNS.free_request_id(@host, @port, id)
              }
              @initialized = false
            end
          end
        end

        class Sender < Requester::Sender # :nodoc:
          def send
            raise "@sock is nil." if @sock.nil?
            @sock.send(@msg, 0)
          end
          attr_reader :data
        end
      end

      class MDNSOneShot < UnconnectedUDP # :nodoc:
        def sender(msg, data, host, port=Port)
          lazy_initialize
          id = DNS.allocate_request_id(host, port)
          request = msg.encode
          request[0,2] = [id].pack('n')
          sock = @socks_hash[host.index(':') ? "::" : "0.0.0.0"]
          return @senders[id] =
            UnconnectedUDP::Sender.new(request, data, sock, host, port)
        end

        def sender_for(addr, msg)
          lazy_initialize
          @senders[msg.id]
        end
      end

      class TCP < Requester # :nodoc:
        def initialize(host, port=Port)
          super()
          @host = host
          @port = port
          sock = TCPSocket.new(@host, @port)
          @socks = [sock]
          @senders = {}
        end

        def recv_reply(readable_socks)
          len = readable_socks[0].read(2).unpack('n')[0]
          reply = @socks[0].read(len)
          return reply, nil
        end

        def sender(msg, data, host=@host, port=@port)
          unless host == @host && port == @port
            raise RequestError.new("host/port don't match: #{host}:#{port}")
          end
          id = DNS.allocate_request_id(@host, @port)
          request = msg.encode
          request[0,2] = [request.length, id].pack('nn')
          return @senders[[nil,id]] = Sender.new(request, data, @socks[0])
        end

        class Sender < Requester::Sender # :nodoc:
          def send
            @sock.print(@msg)
            @sock.flush
          end
          attr_reader :data
        end

        def close
          super
          @senders.each_key {|from,id|
            DNS.free_request_id(@host, @port, id)
          }
        end
      end

      ##
      # Indicates a problem with the DNS request.

      class RequestError < StandardError
      end
    end

    class Config # :nodoc:
      def initialize(config_info=nil)
        @mutex = Thread::Mutex.new
        @config_info = config_info
        @initialized = nil
        @timeouts = nil
      end

      def timeouts=(values)
        if values
          values = Array(values)
          values.each do |t|
            Numeric === t or raise ArgumentError, "#{t.inspect} is not numeric"
            t > 0.0 or raise ArgumentError, "timeout=#{t} must be positive"
          end
          @timeouts = values
        else
          @timeouts = nil
        end
      end

      def Config.parse_resolv_conf(filename)
        nameserver = []
        search = nil
        ndots = 1
        File.open(filename, 'rb') {|f|
          f.each {|line|
            line.sub!(/[#;].*/, '')
            keyword, *args = line.split(/\s+/)
            next unless keyword
            case keyword
            when 'nameserver'
              nameserver += args
            when 'domain'
              next if args.empty?
              search = [args[0]]
            when 'search'
              next if args.empty?
              search = args
            when 'options'
              args.each {|arg|
                case arg
                when /\Andots:(\d+)\z/
                  ndots = $1.to_i
                end
              }
            end
          }
        }
        return { :nameserver => nameserver, :search => search, :ndots => ndots }
      end

      def Config.default_config_hash(filename="/etc/resolv.conf")
        if File.exist? filename
          config_hash = Config.parse_resolv_conf(filename)
        else
          if /mswin|cygwin|mingw|bccwin/ =~ RUBY_PLATFORM
            require 'win32/resolv'
            search, nameserver = Win32::Resolv.get_resolv_info
            config_hash = {}
            config_hash[:nameserver] = nameserver if nameserver
            config_hash[:search] = [search].flatten if search
          end
        end
        config_hash || {}
      end

      def lazy_initialize
        @mutex.synchronize {
          unless @initialized
            @nameserver_port = []
            @search = nil
            @ndots = 1
            case @config_info
            when nil
              config_hash = Config.default_config_hash
            when String
              config_hash = Config.parse_resolv_conf(@config_info)
            when Hash
              config_hash = @config_info.dup
              if String === config_hash[:nameserver]
                config_hash[:nameserver] = [config_hash[:nameserver]]
              end
              if String === config_hash[:search]
                config_hash[:search] = [config_hash[:search]]
              end
            else
              raise ArgumentError.new("invalid resolv configuration: #{@config_info.inspect}")
            end
            if config_hash.include? :nameserver
              @nameserver_port = config_hash[:nameserver].map {|ns| [ns, Port] }
            end
            if config_hash.include? :nameserver_port
              @nameserver_port = config_hash[:nameserver_port].map {|ns, port| [ns, (port || Port)] }
            end
            @search = config_hash[:search] if config_hash.include? :search
            @ndots = config_hash[:ndots] if config_hash.include? :ndots

            if @nameserver_port.empty?
              @nameserver_port << ['0.0.0.0', Port]
            end
            if @search
              @search = @search.map {|arg| Label.split(arg) }
            else
              hostname = Socket.gethostname
              if /\./ =~ hostname
                @search = [Label.split($')]
              else
                @search = [[]]
              end
            end

            if !@nameserver_port.kind_of?(Array) ||
               @nameserver_port.any? {|ns_port|
                  !(Array === ns_port) ||
                  ns_port.length != 2
                  !(String === ns_port[0]) ||
                  !(Integer === ns_port[1])
               }
              raise ArgumentError.new("invalid nameserver config: #{@nameserver_port.inspect}")
            end

            if !@search.kind_of?(Array) ||
               !@search.all? {|ls| ls.all? {|l| Label::Str === l } }
              raise ArgumentError.new("invalid search config: #{@search.inspect}")
            end

            if !@ndots.kind_of?(Integer)
              raise ArgumentError.new("invalid ndots config: #{@ndots.inspect}")
            end

            @initialized = true
          end
        }
        self
      end

      def single?
        lazy_initialize
        if @nameserver_port.length == 1
          return @nameserver_port[0]
        else
          return nil
        end
      end

      def nameserver_port
        @nameserver_port
      end

      def generate_candidates(name)
        candidates = nil
        name = Name.create(name)
        if name.absolute?
          candidates = [name]
        else
          if @ndots <= name.length - 1
            candidates = [Name.new(name.to_a)]
          else
            candidates = []
          end
          candidates.concat(@search.map {|domain| Name.new(name.to_a + domain)})
          fname = Name.create("#{name}.")
          if !candidates.include?(fname)
            candidates << fname
          end
        end
        return candidates
      end

      InitialTimeout = 5

      def generate_timeouts
        ts = [InitialTimeout]
        ts << ts[-1] * 2 / @nameserver_port.length
        ts << ts[-1] * 2
        ts << ts[-1] * 2
        return ts
      end

      def resolv(name)
        candidates = generate_candidates(name)
        timeouts = @timeouts || generate_timeouts
        begin
          candidates.each {|candidate|
            begin
              timeouts.each {|tout|
                @nameserver_port.each {|nameserver, port|
                  begin
                    yield candidate, tout, nameserver, port
                  rescue ResolvTimeout
                  end
                }
              }
              raise ResolvError.new("DNS resolv timeout: #{name}")
            rescue NXDomain
            end
          }
        rescue ResolvError
        end
      end

      ##
      # Indicates no such domain was found.

      class NXDomain < ResolvError
      end

      ##
      # Indicates some other unhandled resolver error was encountered.

      class OtherResolvError < ResolvError
      end
    end

    module OpCode # :nodoc:
      Query = 0
      IQuery = 1
      Status = 2
      Notify = 4
      Update = 5
    end

    module RCode # :nodoc:
      NoError = 0
      FormErr = 1
      ServFail = 2
      NXDomain = 3
      NotImp = 4
      Refused = 5
      YXDomain = 6
      YXRRSet = 7
      NXRRSet = 8
      NotAuth = 9
      NotZone = 10
      BADVERS = 16
      BADSIG = 16
      BADKEY = 17
      BADTIME = 18
      BADMODE = 19
      BADNAME = 20
      BADALG = 21
    end

    ##
    # Indicates that the DNS response was unable to be decoded.

    class DecodeError < StandardError
    end

    ##
    # Indicates that the DNS request was unable to be encoded.

    class EncodeError < StandardError
    end

    module Label # :nodoc:
      def self.split(arg)
        labels = []
        arg.scan(/[^\.]+/) {labels << Str.new($&)}
        return labels
      end

      class Str # :nodoc:
        def initialize(string)
          @string = string
          # case insensivity of DNS labels doesn't apply non-ASCII characters. [RFC 4343]
          # This assumes @string is given in ASCII compatible encoding.
          @downcase = string.b.downcase
        end
        attr_reader :string, :downcase

        def to_s
          return @string
        end

        def inspect
          return "#<#{self.class} #{self}>"
        end

        def ==(other)
          return self.class == other.class && @downcase == other.downcase
        end

        def eql?(other)
          return self == other
        end

        def hash
          return @downcase.hash
        end
      end
    end

    ##
    # A representation of a DNS name.

    class Name

      ##
      # Creates a new DNS name from +arg+.  +arg+ can be:
      #
      # Name:: returns +arg+.
      # String:: Creates a new Name.

      def self.create(arg)
        case arg
        when Name
          return arg
        when String
          return Name.new(Label.split(arg), /\.\z/ =~ arg ? true : false)
        else
          raise ArgumentError.new("cannot interpret as DNS name: #{arg.inspect}")
        end
      end

      def initialize(labels, absolute=true) # :nodoc:
        labels = labels.map {|label|
          case label
          when String then Label::Str.new(label)
          when Label::Str then label
          else
            raise ArgumentError, "unexpected label: #{label.inspect}"
          end
        }
        @labels = labels
        @absolute = absolute
      end

      def inspect # :nodoc:
        "#<#{self.class}: #{self}#{@absolute ? '.' : ''}>"
      end

      ##
      # True if this name is absolute.

      def absolute?
        return @absolute
      end

      def ==(other) # :nodoc:
        return false unless Name === other
        return false unless @absolute == other.absolute?
        return @labels == other.to_a
      end

      alias eql? == # :nodoc:

      ##
      # Returns true if +other+ is a subdomain.
      #
      # Example:
      #
      #   domain = Resolv::DNS::Name.create("y.z")
      #   p Resolv::DNS::Name.create("w.x.y.z").subdomain_of?(domain) #=> true
      #   p Resolv::DNS::Name.create("x.y.z").subdomain_of?(domain) #=> true
      #   p Resolv::DNS::Name.create("y.z").subdomain_of?(domain) #=> false
      #   p Resolv::DNS::Name.create("z").subdomain_of?(domain) #=> false
      #   p Resolv::DNS::Name.create("x.y.z.").subdomain_of?(domain) #=> false
      #   p Resolv::DNS::Name.create("w.z").subdomain_of?(domain) #=> false
      #

      def subdomain_of?(other)
        raise ArgumentError, "not a domain name: #{other.inspect}" unless Name === other
        return false if @absolute != other.absolute?
        other_len = other.length
        return false if @labels.length <= other_len
        return @labels[-other_len, other_len] == other.to_a
      end

      def hash # :nodoc:
        return @labels.hash ^ @absolute.hash
      end

      def to_a # :nodoc:
        return @labels
      end

      def length # :nodoc:
        return @labels.length
      end

      def [](i) # :nodoc:
        return @labels[i]
      end

      ##
      # returns the domain name as a string.
      #
      # The domain name doesn't have a trailing dot even if the name object is
      # absolute.
      #
      # Example:
      #
      #   p Resolv::DNS::Name.create("x.y.z.").to_s #=> "x.y.z"
      #   p Resolv::DNS::Name.create("x.y.z").to_s #=> "x.y.z"

      def to_s
        return @labels.join('.')
      end
    end

    class Message # :nodoc:
      @@identifier = -1

      def initialize(id = (@@identifier += 1) & 0xffff)
        @id = id
        @qr = 0
        @opcode = 0
        @aa = 0
        @tc = 0
        @rd = 0 # recursion desired
        @ra = 0 # recursion available
        @rcode = 0
        @question = []
        @answer = []
        @authority = []
        @additional = []
      end

      attr_accessor :id, :qr, :opcode, :aa, :tc, :rd, :ra, :rcode
      attr_reader :question, :answer, :authority, :additional

      def ==(other)
        return @id == other.id &&
               @qr == other.qr &&
               @opcode == other.opcode &&
               @aa == other.aa &&
               @tc == other.tc &&
               @rd == other.rd &&
               @ra == other.ra &&
               @rcode == other.rcode &&
               @question == other.question &&
               @answer == other.answer &&
               @authority == other.authority &&
               @additional == other.additional
      end

      def add_question(name, typeclass)
        @question << [Name.create(name), typeclass]
      end

      def each_question
        @question.each {|name, typeclass|
          yield name, typeclass
        }
      end

      def add_answer(name, ttl, data)
        @answer << [Name.create(name), ttl, data]
      end

      def each_answer
        @answer.each {|name, ttl, data|
          yield name, ttl, data
        }
      end

      def add_authority(name, ttl, data)
        @authority << [Name.create(name), ttl, data]
      end

      def each_authority
        @authority.each {|name, ttl, data|
          yield name, ttl, data
        }
      end

      def add_additional(name, ttl, data)
        @additional << [Name.create(name), ttl, data]
      end

      def each_additional
        @additional.each {|name, ttl, data|
          yield name, ttl, data
        }
      end

      def each_resource
        each_answer {|name, ttl, data| yield name, ttl, data}
        each_authority {|name, ttl, data| yield name, ttl, data}
        each_additional {|name, ttl, data| yield name, ttl, data}
      end

      def encode
        return MessageEncoder.new {|msg|
          msg.put_pack('nnnnnn',
            @id,
            (@qr & 1) << 15 |
            (@opcode & 15) << 11 |
            (@aa & 1) << 10 |
            (@tc & 1) << 9 |
            (@rd & 1) << 8 |
            (@ra & 1) << 7 |
            (@rcode & 15),
            @question.length,
            @answer.length,
            @authority.length,
            @additional.length)
          @question.each {|q|
            name, typeclass = q
            msg.put_name(name)
            msg.put_pack('nn', typeclass::TypeValue, typeclass::ClassValue)
          }
          [@answer, @authority, @additional].each {|rr|
            rr.each {|r|
              name, ttl, data = r
              msg.put_name(name)
              msg.put_pack('nnN', data.class::TypeValue, data.class::ClassValue, ttl)
              msg.put_length16 {data.encode_rdata(msg)}
            }
          }
        }.to_s
      end

      class MessageEncoder # :nodoc:
        def initialize
          @data = ''.dup
          @names = {}
          yield self
        end

        def to_s
          return @data
        end

        def put_bytes(d)
          @data << d
        end

        def put_pack(template, *d)
          @data << d.pack(template)
        end

        def put_length16
          length_index = @data.length
          @data << "\0\0"
          data_start = @data.length
          yield
          data_end = @data.length
          @data[length_index, 2] = [data_end - data_start].pack("n")
        end

        def put_string(d)
          self.put_pack("C", d.length)
          @data << d
        end

        def put_string_list(ds)
          ds.each {|d|
            self.put_string(d)
          }
        end

        def put_name(d)
          put_labels(d.to_a)
        end

        def put_labels(d)
          d.each_index {|i|
            domain = d[i..-1]
            if idx = @names[domain]
              self.put_pack("n", 0xc000 | idx)
              return
            else
              if @data.length < 0x4000
                @names[domain] = @data.length
              end
              self.put_label(d[i])
            end
          }
          @data << "\0"
        end

        def put_label(d)
          self.put_string(d.to_s)
        end
      end

      def Message.decode(m)
        o = Message.new(0)
        MessageDecoder.new(m) {|msg|
          id, flag, qdcount, ancount, nscount, arcount =
            msg.get_unpack('nnnnnn')
          o.id = id
          o.qr = (flag >> 15) & 1
          o.opcode = (flag >> 11) & 15
          o.aa = (flag >> 10) & 1
          o.tc = (flag >> 9) & 1
          o.rd = (flag >> 8) & 1
          o.ra = (flag >> 7) & 1
          o.rcode = flag & 15
          (1..qdcount).each {
            name, typeclass = msg.get_question
            o.add_question(name, typeclass)
          }
          (1..ancount).each {
            name, ttl, data = msg.get_rr
            o.add_answer(name, ttl, data)
          }
          (1..nscount).each {
            name, ttl, data = msg.get_rr
            o.add_authority(name, ttl, data)
          }
          (1..arcount).each {
            name, ttl, data = msg.get_rr
            o.add_additional(name, ttl, data)
          }
        }
        return o
      end

      class MessageDecoder # :nodoc:
        def initialize(data)
          @data = data
          @index = 0
          @limit = data.bytesize
          yield self
        end

        def inspect
          "\#<#{self.class}: #{@data.byteslice(0, @index).inspect} #{@data.byteslice(@index..-1).inspect}>"
        end

        def get_length16
          len, = self.get_unpack('n')
          save_limit = @limit
          @limit = @index + len
          d = yield(len)
          if @index < @limit
            raise DecodeError.new("junk exists")
          elsif @limit < @index
            raise DecodeError.new("limit exceeded")
          end
          @limit = save_limit
          return d
        end

        def get_bytes(len = @limit - @index)
          raise DecodeError.new("limit exceeded") if @limit < @index + len
          d = @data.byteslice(@index, len)
          @index += len
          return d
        end

        def get_unpack(template)
          len = 0
          template.each_byte {|byte|
            byte = "%c" % byte
            case byte
            when ?c, ?C
              len += 1
            when ?n
              len += 2
            when ?N
              len += 4
            else
              raise StandardError.new("unsupported template: '#{byte.chr}' in '#{template}'")
            end
          }
          raise DecodeError.new("limit exceeded") if @limit < @index + len
          arr = @data.unpack("@#{@index}#{template}")
          @index += len
          return arr
        end

        def get_string
          raise DecodeError.new("limit exceeded") if @limit <= @index
          len = @data.getbyte(@index)
          raise DecodeError.new("limit exceeded") if @limit < @index + 1 + len
          d = @data.byteslice(@index + 1, len)
          @index += 1 + len
          return d
        end

        def get_string_list
          strings = []
          while @index < @limit
            strings << self.get_string
          end
          strings
        end

        def get_name
          return Name.new(self.get_labels)
        end

        def get_labels
          prev_index = @index
          save_index = nil
          d = []
          while true
            raise DecodeError.new("limit exceeded") if @limit <= @index
            case @data.getbyte(@index)
            when 0
              @index += 1
              if save_index
                @index = save_index
              end
              return d
            when 192..255
              idx = self.get_unpack('n')[0] & 0x3fff
              if prev_index <= idx
                raise DecodeError.new("non-backward name pointer")
              end
              prev_index = idx
              if !save_index
                save_index = @index
              end
              @index = idx
            else
              d << self.get_label
            end
          end
        end

        def get_label
          return Label::Str.new(self.get_string)
        end

        def get_question
          name = self.get_name
          type, klass = self.get_unpack("nn")
          return name, Resource.get_class(type, klass)
        end

        def get_rr
          name = self.get_name
          type, klass, ttl = self.get_unpack('nnN')
          typeclass = Resource.get_class(type, klass)
          res = self.get_length16 do
            begin
              typeclass.decode_rdata self
            rescue => e
              raise DecodeError, e.message, e.backtrace
            end
          end
          res.instance_variable_set :@ttl, ttl
          return name, ttl, res
        end
      end
    end

    ##
    # A DNS query abstract class.

    class Query
      def encode_rdata(msg) # :nodoc:
        raise EncodeError.new("#{self.class} is query.")
      end

      def self.decode_rdata(msg) # :nodoc:
        raise DecodeError.new("#{self.class} is query.")
      end
    end

    ##
    # A DNS resource abstract class.

    class Resource < Query

      ##
      # Remaining Time To Live for this Resource.

      attr_reader :ttl

      ClassHash = {} # :nodoc:

      def encode_rdata(msg) # :nodoc:
        raise NotImplementedError.new
      end

      def self.decode_rdata(msg) # :nodoc:
        raise NotImplementedError.new
      end

      def ==(other) # :nodoc:
        return false unless self.class == other.class
        s_ivars = self.instance_variables
        s_ivars.sort!
        s_ivars.delete :@ttl
        o_ivars = other.instance_variables
        o_ivars.sort!
        o_ivars.delete :@ttl
        return s_ivars == o_ivars &&
          s_ivars.collect {|name| self.instance_variable_get name} ==
            o_ivars.collect {|name| other.instance_variable_get name}
      end

      def eql?(other) # :nodoc:
        return self == other
      end

      def hash # :nodoc:
        h = 0
        vars = self.instance_variables
        vars.delete :@ttl
        vars.each {|name|
          h ^= self.instance_variable_get(name).hash
        }
        return h
      end

      def self.get_class(type_value, class_value) # :nodoc:
        return ClassHash[[type_value, class_value]] ||
               Generic.create(type_value, class_value)
      end

      ##
      # A generic resource abstract class.

      class Generic < Resource

        ##
        # Creates a new generic resource.

        def initialize(data)
          @data = data
        end

        ##
        # Data for this generic resource.

        attr_reader :data

        def encode_rdata(msg) # :nodoc:
          msg.put_bytes(data)
        end

        def self.decode_rdata(msg) # :nodoc:
          return self.new(msg.get_bytes)
        end

        def self.create(type_value, class_value) # :nodoc:
          c = Class.new(Generic)
          c.const_set(:TypeValue, type_value)
          c.const_set(:ClassValue, class_value)
          Generic.const_set("Type#{type_value}_Class#{class_value}", c)
          ClassHash[[type_value, class_value]] = c
          return c
        end
      end

      ##
      # Domain Name resource abstract class.

      class DomainName < Resource

        ##
        # Creates a new DomainName from +name+.

        def initialize(name)
          @name = name
        end

        ##
        # The name of this DomainName.

        attr_reader :name

        def encode_rdata(msg) # :nodoc:
          msg.put_name(@name)
        end

        def self.decode_rdata(msg) # :nodoc:
          return self.new(msg.get_name)
        end
      end

      # Standard (class generic) RRs

      ClassValue = nil # :nodoc:

      ##
      # An authoritative name server.

      class NS < DomainName
        TypeValue = 2 # :nodoc:
      end

      ##
      # The canonical name for an alias.

      class CNAME < DomainName
        TypeValue = 5 # :nodoc:
      end

      ##
      # Start Of Authority resource.

      class SOA < Resource

        TypeValue = 6 # :nodoc:

        ##
        # Creates a new SOA record.  See the attr documentation for the
        # details of each argument.

        def initialize(mname, rname, serial, refresh, retry_, expire, minimum)
          @mname = mname
          @rname = rname
          @serial = serial
          @refresh = refresh
          @retry = retry_
          @expire = expire
          @minimum = minimum
        end

        ##
        # Name of the host where the master zone file for this zone resides.

        attr_reader :mname

        ##
        # The person responsible for this domain name.

        attr_reader :rname

        ##
        # The version number of the zone file.

        attr_reader :serial

        ##
        # How often, in seconds, a secondary name server is to check for
        # updates from the primary name server.

        attr_reader :refresh

        ##
        # How often, in seconds, a secondary name server is to retry after a
        # failure to check for a refresh.

        attr_reader :retry

        ##
        # Time in seconds that a secondary name server is to use the data
        # before refreshing from the primary name server.

        attr_reader :expire

        ##
        # The minimum number of seconds to be used for TTL values in RRs.

        attr_reader :minimum

        def encode_rdata(msg) # :nodoc:
          msg.put_name(@mname)
          msg.put_name(@rname)
          msg.put_pack('NNNNN', @serial, @refresh, @retry, @expire, @minimum)
        end

        def self.decode_rdata(msg) # :nodoc:
          mname = msg.get_name
          rname = msg.get_name
          serial, refresh, retry_, expire, minimum = msg.get_unpack('NNNNN')
          return self.new(
            mname, rname, serial, refresh, retry_, expire, minimum)
        end
      end

      ##
      # A Pointer to another DNS name.

      class PTR < DomainName
        TypeValue = 12 # :nodoc:
      end

      ##
      # Host Information resource.

      class HINFO < Resource

        TypeValue = 13 # :nodoc:

        ##
        # Creates a new HINFO running +os+ on +cpu+.

        def initialize(cpu, os)
          @cpu = cpu
          @os = os
        end

        ##
        # CPU architecture for this resource.

        attr_reader :cpu

        ##
        # Operating system for this resource.

        attr_reader :os

        def encode_rdata(msg) # :nodoc:
          msg.put_string(@cpu)
          msg.put_string(@os)
        end

        def self.decode_rdata(msg) # :nodoc:
          cpu = msg.get_string
          os = msg.get_string
          return self.new(cpu, os)
        end
      end

      ##
      # Mailing list or mailbox information.

      class MINFO < Resource

        TypeValue = 14 # :nodoc:

        def initialize(rmailbx, emailbx)
          @rmailbx = rmailbx
          @emailbx = emailbx
        end

        ##
        # Domain name responsible for this mail list or mailbox.

        attr_reader :rmailbx

        ##
        # Mailbox to use for error messages related to the mail list or mailbox.

        attr_reader :emailbx

        def encode_rdata(msg) # :nodoc:
          msg.put_name(@rmailbx)
          msg.put_name(@emailbx)
        end

        def self.decode_rdata(msg) # :nodoc:
          rmailbx = msg.get_string
          emailbx = msg.get_string
          return self.new(rmailbx, emailbx)
        end
      end

      ##
      # Mail Exchanger resource.

      class MX < Resource

        TypeValue= 15 # :nodoc:

        ##
        # Creates a new MX record with +preference+, accepting mail at
        # +exchange+.

        def initialize(preference, exchange)
          @preference = preference
          @exchange = exchange
        end

        ##
        # The preference for this MX.

        attr_reader :preference

        ##
        # The host of this MX.

        attr_reader :exchange

        def encode_rdata(msg) # :nodoc:
          msg.put_pack('n', @preference)
          msg.put_name(@exchange)
        end

        def self.decode_rdata(msg) # :nodoc:
          preference, = msg.get_unpack('n')
          exchange = msg.get_name
          return self.new(preference, exchange)
        end
      end

      ##
      # Unstructured text resource.

      class TXT < Resource

        TypeValue = 16 # :nodoc:

        def initialize(first_string, *rest_strings)
          @strings = [first_string, *rest_strings]
        end

        ##
        # Returns an Array of Strings for this TXT record.

        attr_reader :strings

        ##
        # Returns the concatenated string from +strings+.

        def data
          @strings.join("")
        end

        def encode_rdata(msg) # :nodoc:
          msg.put_string_list(@strings)
        end

        def self.decode_rdata(msg) # :nodoc:
          strings = msg.get_string_list
          return self.new(*strings)
        end
      end

      ##
      # Location resource

      class LOC < Resource

        TypeValue = 29 # :nodoc:

        def initialize(version, ssize, hprecision, vprecision, latitude, longitude, altitude)
          @version    = version
          @ssize      = Resolv::LOC::Size.create(ssize)
          @hprecision = Resolv::LOC::Size.create(hprecision)
          @vprecision = Resolv::LOC::Size.create(vprecision)
          @latitude   = Resolv::LOC::Coord.create(latitude)
          @longitude  = Resolv::LOC::Coord.create(longitude)
          @altitude   = Resolv::LOC::Alt.create(altitude)
        end

        ##
        # Returns the version value for this LOC record which should always be 00

        attr_reader :version

        ##
        # The spherical size of this LOC
        # in meters using scientific notation as 2 integers of XeY

        attr_reader :ssize

        ##
        # The horizontal precision using ssize type values
        # in meters using scientific notation as 2 integers of XeY
        # for precision use value/2 e.g. 2m = +/-1m

        attr_reader :hprecision

        ##
        # The vertical precision using ssize type values
        # in meters using scientific notation as 2 integers of XeY
        # for precision use value/2 e.g. 2m = +/-1m

        attr_reader :vprecision

        ##
        # The latitude for this LOC where 2**31 is the equator
        # in thousandths of an arc second as an unsigned 32bit integer

        attr_reader :latitude

        ##
        # The longitude for this LOC where 2**31 is the prime meridian
        # in thousandths of an arc second as an unsigned 32bit integer

        attr_reader :longitude

        ##
        # The altitude of the LOC above a reference sphere whose surface sits 100km below the WGS84 spheroid
        # in centimeters as an unsigned 32bit integer

        attr_reader :altitude


        def encode_rdata(msg) # :nodoc:
          msg.put_bytes(@version)
          msg.put_bytes(@ssize.scalar)
          msg.put_bytes(@hprecision.scalar)
          msg.put_bytes(@vprecision.scalar)
          msg.put_bytes(@latitude.coordinates)
          msg.put_bytes(@longitude.coordinates)
          msg.put_bytes(@altitude.altitude)
        end

        def self.decode_rdata(msg) # :nodoc:
          version    = msg.get_bytes(1)
          ssize      = msg.get_bytes(1)
          hprecision = msg.get_bytes(1)
          vprecision = msg.get_bytes(1)
          latitude   = msg.get_bytes(4)
          longitude  = msg.get_bytes(4)
          altitude   = msg.get_bytes(4)
          return self.new(
            version,
            Resolv::LOC::Size.new(ssize),
            Resolv::LOC::Size.new(hprecision),
            Resolv::LOC::Size.new(vprecision),
            Resolv::LOC::Coord.new(latitude,"lat"),
            Resolv::LOC::Coord.new(longitude,"lon"),
            Resolv::LOC::Alt.new(altitude)
          )
        end
      end

      ##
      # A Query type requesting any RR.

      class ANY < Query
        TypeValue = 255 # :nodoc:
      end

      ClassInsensitiveTypes = [ # :nodoc:
        NS, CNAME, SOA, PTR, HINFO, MINFO, MX, TXT, LOC, ANY
      ]

      ##
      # module IN contains ARPA Internet specific RRs.

      module IN

        ClassValue = 1 # :nodoc:

        ClassInsensitiveTypes.each {|s|
          c = Class.new(s)
          c.const_set(:TypeValue, s::TypeValue)
          c.const_set(:ClassValue, ClassValue)
          ClassHash[[s::TypeValue, ClassValue]] = c
          self.const_set(s.name.sub(/.*::/, ''), c)
        }

        ##
        # IPv4 Address resource

        class A < Resource
          TypeValue = 1
          ClassValue = IN::ClassValue
          ClassHash[[TypeValue, ClassValue]] = self # :nodoc:

          ##
          # Creates a new A for +address+.

          def initialize(address)
            @address = IPv4.create(address)
          end

          ##
          # The Resolv::IPv4 address for this A.

          attr_reader :address

          def encode_rdata(msg) # :nodoc:
            msg.put_bytes(@address.address)
          end

          def self.decode_rdata(msg) # :nodoc:
            return self.new(IPv4.new(msg.get_bytes(4)))
          end
        end

        ##
        # Well Known Service resource.

        class WKS < Resource
          TypeValue = 11
          ClassValue = IN::ClassValue
          ClassHash[[TypeValue, ClassValue]] = self # :nodoc:

          def initialize(address, protocol, bitmap)
            @address = IPv4.create(address)
            @protocol = protocol
            @bitmap = bitmap
          end

          ##
          # The host these services run on.

          attr_reader :address

          ##
          # IP protocol number for these services.

          attr_reader :protocol

          ##
          # A bit map of enabled services on this host.
          #
          # If protocol is 6 (TCP) then the 26th bit corresponds to the SMTP
          # service (port 25).  If this bit is set, then an SMTP server should
          # be listening on TCP port 25; if zero, SMTP service is not
          # supported.

          attr_reader :bitmap

          def encode_rdata(msg) # :nodoc:
            msg.put_bytes(@address.address)
            msg.put_pack("n", @protocol)
            msg.put_bytes(@bitmap)
          end

          def self.decode_rdata(msg) # :nodoc:
            address = IPv4.new(msg.get_bytes(4))
            protocol, = msg.get_unpack("n")
            bitmap = msg.get_bytes
            return self.new(address, protocol, bitmap)
          end
        end

        ##
        # An IPv6 address record.

        class AAAA < Resource
          TypeValue = 28
          ClassValue = IN::ClassValue
          ClassHash[[TypeValue, ClassValue]] = self # :nodoc:

          ##
          # Creates a new AAAA for +address+.

          def initialize(address)
            @address = IPv6.create(address)
          end

          ##
          # The Resolv::IPv6 address for this AAAA.

          attr_reader :address

          def encode_rdata(msg) # :nodoc:
            msg.put_bytes(@address.address)
          end

          def self.decode_rdata(msg) # :nodoc:
            return self.new(IPv6.new(msg.get_bytes(16)))
          end
        end

        ##
        # SRV resource record defined in RFC 2782
        #
        # These records identify the hostname and port that a service is
        # available at.

        class SRV < Resource
          TypeValue = 33
          ClassValue = IN::ClassValue
          ClassHash[[TypeValue, ClassValue]] = self # :nodoc:

          # Create a SRV resource record.
          #
          # See the documentation for #priority, #weight, #port and #target
          # for +priority+, +weight+, +port and +target+ respectively.

          def initialize(priority, weight, port, target)
            @priority = priority.to_int
            @weight = weight.to_int
            @port = port.to_int
            @target = Name.create(target)
          end

          # The priority of this target host.
          #
          # A client MUST attempt to contact the target host with the
          # lowest-numbered priority it can reach; target hosts with the same
          # priority SHOULD be tried in an order defined by the weight field.
          # The range is 0-65535.  Note that it is not widely implemented and
          # should be set to zero.

          attr_reader :priority

          # A server selection mechanism.
          #
          # The weight field specifies a relative weight for entries with the
          # same priority. Larger weights SHOULD be given a proportionately
          # higher probability of being selected. The range of this number is
          # 0-65535.  Domain administrators SHOULD use Weight 0 when there
          # isn't any server selection to do, to make the RR easier to read
          # for humans (less noisy). Note that it is not widely implemented
          # and should be set to zero.

          attr_reader :weight

          # The port on this target host of this service.
          #
          # The range is 0-65535.

          attr_reader :port

          # The domain name of the target host.
          #
          # A target of "." means that the service is decidedly not available
          # at this domain.

          attr_reader :target

          def encode_rdata(msg) # :nodoc:
            msg.put_pack("n", @priority)
            msg.put_pack("n", @weight)
            msg.put_pack("n", @port)
            msg.put_name(@target)
          end

          def self.decode_rdata(msg) # :nodoc:
            priority, = msg.get_unpack("n")
            weight,   = msg.get_unpack("n")
            port,     = msg.get_unpack("n")
            target    = msg.get_name
            return self.new(priority, weight, port, target)
          end
        end
      end
    end
  end

  ##
  # A Resolv::DNS IPv4 address.

  class IPv4

    ##
    # Regular expression IPv4 addresses must match.

    Regex256 = /0
               |1(?:[0-9][0-9]?)?
               |2(?:[0-4][0-9]?|5[0-5]?|[6-9])?
               |[3-9][0-9]?/x
    Regex = /\A(#{Regex256})\.(#{Regex256})\.(#{Regex256})\.(#{Regex256})\z/

    def self.create(arg)
      case arg
      when IPv4
        return arg
      when Regex
        if (0..255) === (a = $1.to_i) &&
           (0..255) === (b = $2.to_i) &&
           (0..255) === (c = $3.to_i) &&
           (0..255) === (d = $4.to_i)
          return self.new([a, b, c, d].pack("CCCC"))
        else
          raise ArgumentError.new("IPv4 address with invalid value: " + arg)
        end
      else
        raise ArgumentError.new("cannot interpret as IPv4 address: #{arg.inspect}")
      end
    end

    def initialize(address) # :nodoc:
      unless address.kind_of?(String)
        raise ArgumentError, 'IPv4 address must be a string'
      end
      unless address.length == 4
        raise ArgumentError, "IPv4 address expects 4 bytes but #{address.length} bytes"
      end
      @address = address
    end

    ##
    # A String representation of this IPv4 address.

    ##
    # The raw IPv4 address as a String.

    attr_reader :address

    def to_s # :nodoc:
      return sprintf("%d.%d.%d.%d", *@address.unpack("CCCC"))
    end

    def inspect # :nodoc:
      return "#<#{self.class} #{self}>"
    end

    ##
    # Turns this IPv4 address into a Resolv::DNS::Name.

    def to_name
      return DNS::Name.create(
        '%d.%d.%d.%d.in-addr.arpa.' % @address.unpack('CCCC').reverse)
    end

    def ==(other) # :nodoc:
      return @address == other.address
    end

    def eql?(other) # :nodoc:
      return self == other
    end

    def hash # :nodoc:
      return @address.hash
    end
  end

  ##
  # A Resolv::DNS IPv6 address.

  class IPv6

    ##
    # IPv6 address format a:b:c:d:e:f:g:h
    Regex_8Hex = /\A
      (?:[0-9A-Fa-f]{1,4}:){7}
         [0-9A-Fa-f]{1,4}
      \z/x

    ##
    # Compressed IPv6 address format a::b

    Regex_CompressedHex = /\A
      ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) ::
      ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)
      \z/x

    ##
    # IPv4 mapped IPv6 address format a:b:c:d:e:f:w.x.y.z

    Regex_6Hex4Dec = /\A
      ((?:[0-9A-Fa-f]{1,4}:){6,6})
      (\d+)\.(\d+)\.(\d+)\.(\d+)
      \z/x

    ##
    # Compressed IPv4 mapped IPv6 address format a::b:w.x.y.z

    Regex_CompressedHex4Dec = /\A
      ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) ::
      ((?:[0-9A-Fa-f]{1,4}:)*)
      (\d+)\.(\d+)\.(\d+)\.(\d+)
      \z/x

    ##
    # IPv6 link local address format fe80:b:c:d:e:f:g:h%em1
    Regex_8HexLinkLocal = /\A
      [Ff][Ee]80
      (?::[0-9A-Fa-f]{1,4}){7}
      %[0-9A-Za-z]+
      \z/x

    ##
    # Compressed IPv6 link local address format fe80::b%em1

    Regex_CompressedHexLinkLocal = /\A
      [Ff][Ee]80:
      (?:
        ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) ::
        ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)
        |
        :((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)
      )?
      :[0-9A-Fa-f]{1,4}%[0-9A-Za-z.]+
      \z/x

    ##
    # A composite IPv6 address Regexp.

    Regex = /
      (?:#{Regex_8Hex}) |
      (?:#{Regex_CompressedHex}) |
      (?:#{Regex_6Hex4Dec}) |
      (?:#{Regex_CompressedHex4Dec}) |
      (?:#{Regex_8HexLinkLocal}) |
      (?:#{Regex_CompressedHexLinkLocal})
      /x

    ##
    # Creates a new IPv6 address from +arg+ which may be:
    #
    # IPv6:: returns +arg+.
    # String:: +arg+ must match one of the IPv6::Regex* constants

    def self.create(arg)
      case arg
      when IPv6
        return arg
      when String
        address = ''.b
        if Regex_8Hex =~ arg
          arg.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')}
        elsif Regex_CompressedHex =~ arg
          prefix = $1
          suffix = $2
          a1 = ''.b
          a2 = ''.b
          prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')}
          suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')}
          omitlen = 16 - a1.length - a2.length
          address << a1 << "\0" * omitlen << a2
        elsif Regex_6Hex4Dec =~ arg
          prefix, a, b, c, d = $1, $2.to_i, $3.to_i, $4.to_i, $5.to_i
          if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d
            prefix.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')}
            address << [a, b, c, d].pack('CCCC')
          else
            raise ArgumentError.new("not numeric IPv6 address: " + arg)
          end
        elsif Regex_CompressedHex4Dec =~ arg
          prefix, suffix, a, b, c, d = $1, $2, $3.to_i, $4.to_i, $5.to_i, $6.to_i
          if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d
            a1 = ''.b
            a2 = ''.b
            prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')}
            suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')}
            omitlen = 12 - a1.length - a2.length
            address << a1 << "\0" * omitlen << a2 << [a, b, c, d].pack('CCCC')
          else
            raise ArgumentError.new("not numeric IPv6 address: " + arg)
          end
        else
          raise ArgumentError.new("not numeric IPv6 address: " + arg)
        end
        return IPv6.new(address)
      else
        raise ArgumentError.new("cannot interpret as IPv6 address: #{arg.inspect}")
      end
    end

    def initialize(address) # :nodoc:
      unless address.kind_of?(String) && address.length == 16
        raise ArgumentError.new('IPv6 address must be 16 bytes')
      end
      @address = address
    end

    ##
    # The raw IPv6 address as a String.

    attr_reader :address

    def to_s # :nodoc:
      address = sprintf("%x:%x:%x:%x:%x:%x:%x:%x", *@address.unpack("nnnnnnnn"))
      unless address.sub!(/(^|:)0(:0)+(:|$)/, '::')
        address.sub!(/(^|:)0(:|$)/, '::')
      end
      return address
    end

    def inspect # :nodoc:
      return "#<#{self.class} #{self}>"
    end

    ##
    # Turns this IPv6 address into a Resolv::DNS::Name.
    #--
    # ip6.arpa should be searched too. [RFC3152]

    def to_name
      return DNS::Name.new(
        @address.unpack("H32")[0].split(//).reverse + ['ip6', 'arpa'])
    end

    def ==(other) # :nodoc:
      return @address == other.address
    end

    def eql?(other) # :nodoc:
      return self == other
    end

    def hash # :nodoc:
      return @address.hash
    end
  end

  ##
  # Resolv::MDNS is a one-shot Multicast DNS (mDNS) resolver.  It blindly
  # makes queries to the mDNS addresses without understanding anything about
  # multicast ports.
  #
  # Information taken form the following places:
  #
  # * RFC 6762

  class MDNS < DNS

    ##
    # Default mDNS Port

    Port = 5353

    ##
    # Default IPv4 mDNS address

    AddressV4 = '224.0.0.251'

    ##
    # Default IPv6 mDNS address

    AddressV6 = 'ff02::fb'

    ##
    # Default mDNS addresses

    Addresses = [
      [AddressV4, Port],
      [AddressV6, Port],
    ]

    ##
    # Creates a new one-shot Multicast DNS (mDNS) resolver.
    #
    # +config_info+ can be:
    #
    # nil::
    #   Uses the default mDNS addresses
    #
    # Hash::
    #   Must contain :nameserver or :nameserver_port like
    #   Resolv::DNS#initialize.

    def initialize(config_info=nil)
      if config_info then
        super({ nameserver_port: Addresses }.merge(config_info))
      else
        super(nameserver_port: Addresses)
      end
    end

    ##
    # Iterates over all IP addresses for +name+ retrieved from the mDNS
    # resolver, provided name ends with "local".  If the name does not end in
    # "local" no records will be returned.
    #
    # +name+ can be a Resolv::DNS::Name or a String.  Retrieved addresses will
    # be a Resolv::IPv4 or Resolv::IPv6

    def each_address(name)
      name = Resolv::DNS::Name.create(name)

      return unless name[-1].to_s == 'local'

      super(name)
    end

    def make_udp_requester # :nodoc:
      nameserver_port = @config.nameserver_port
      Requester::MDNSOneShot.new(*nameserver_port)
    end

  end

  module LOC

    ##
    # A Resolv::LOC::Size

    class Size

      Regex = /^(\d+\.*\d*)[m]$/

      ##
      # Creates a new LOC::Size from +arg+ which may be:
      #
      # LOC::Size:: returns +arg+.
      # String:: +arg+ must match the LOC::Size::Regex constant

      def self.create(arg)
        case arg
        when Size
          return arg
        when String
          scalar = ''
          if Regex =~ arg
            scalar = [(($1.to_f*(1e2)).to_i.to_s[0].to_i*(2**4)+(($1.to_f*(1e2)).to_i.to_s.length-1))].pack("C")
          else
            raise ArgumentError.new("not a properly formed Size string: " + arg)
          end
          return Size.new(scalar)
        else
          raise ArgumentError.new("cannot interpret as Size: #{arg.inspect}")
        end
      end

      def initialize(scalar)
        @scalar = scalar
      end

      ##
      # The raw size

      attr_reader :scalar

      def to_s # :nodoc:
        s = @scalar.unpack("H2").join.to_s
        return ((s[0].to_i)*(10**(s[1].to_i-2))).to_s << "m"
      end

      def inspect # :nodoc:
        return "#<#{self.class} #{self}>"
      end

      def ==(other) # :nodoc:
        return @scalar == other.scalar
      end

      def eql?(other) # :nodoc:
        return self == other
      end

      def hash # :nodoc:
        return @scalar.hash
      end

    end

    ##
    # A Resolv::LOC::Coord

    class Coord

      Regex = /^(\d+)\s(\d+)\s(\d+\.\d+)\s([NESW])$/

      ##
      # Creates a new LOC::Coord from +arg+ which may be:
      #
      # LOC::Coord:: returns +arg+.
      # String:: +arg+ must match the LOC::Coord::Regex constant

      def self.create(arg)
        case arg
        when Coord
          return arg
        when String
          coordinates = ''
          if Regex =~ arg && $1.to_f < 180
            m = $~
            hemi = (m[4][/[NE]/]) || (m[4][/[SW]/]) ? 1 : -1
            coordinates = [ ((m[1].to_i*(36e5)) + (m[2].to_i*(6e4)) +
                             (m[3].to_f*(1e3))) * hemi+(2**31) ].pack("N")
            orientation = m[4][/[NS]/] ? 'lat' : 'lon'
          else
            raise ArgumentError.new("not a properly formed Coord string: " + arg)
          end
          return Coord.new(coordinates,orientation)
        else
          raise ArgumentError.new("cannot interpret as Coord: #{arg.inspect}")
        end
      end

      def initialize(coordinates,orientation)
        unless coordinates.kind_of?(String)
          raise ArgumentError.new("Coord must be a 32bit unsigned integer in hex format: #{coordinates.inspect}")
        end
        unless orientation.kind_of?(String) && orientation[/^lon$|^lat$/]
          raise ArgumentError.new('Coord expects orientation to be a String argument of "lat" or "lon"')
        end
        @coordinates = coordinates
        @orientation = orientation
      end

      ##
      # The raw coordinates

      attr_reader :coordinates

      ## The orientation of the hemisphere as 'lat' or 'lon'

      attr_reader :orientation

      def to_s # :nodoc:
          c = @coordinates.unpack("N").join.to_i
          val      = (c - (2**31)).abs
          fracsecs = (val % 1e3).to_i.to_s
          val      = val / 1e3
          secs     = (val % 60).to_i.to_s
          val      = val / 60
          mins     = (val % 60).to_i.to_s
          degs     = (val / 60).to_i.to_s
          posi = (c >= 2**31)
          case posi
          when true
            hemi = @orientation[/^lat$/] ? "N" : "E"
          else
            hemi = @orientation[/^lon$/] ? "W" : "S"
          end
          return degs << " " << mins << " " << secs << "." << fracsecs << " " << hemi
      end

      def inspect # :nodoc:
        return "#<#{self.class} #{self}>"
      end

      def ==(other) # :nodoc:
        return @coordinates == other.coordinates
      end

      def eql?(other) # :nodoc:
        return self == other
      end

      def hash # :nodoc:
        return @coordinates.hash
      end

    end

    ##
    # A Resolv::LOC::Alt

    class Alt

      Regex = /^([+-]*\d+\.*\d*)[m]$/

      ##
      # Creates a new LOC::Alt from +arg+ which may be:
      #
      # LOC::Alt:: returns +arg+.
      # String:: +arg+ must match the LOC::Alt::Regex constant

      def self.create(arg)
        case arg
        when Alt
          return arg
        when String
          altitude = ''
          if Regex =~ arg
            altitude = [($1.to_f*(1e2))+(1e7)].pack("N")
          else
            raise ArgumentError.new("not a properly formed Alt string: " + arg)
          end
          return Alt.new(altitude)
        else
          raise ArgumentError.new("cannot interpret as Alt: #{arg.inspect}")
        end
      end

      def initialize(altitude)
        @altitude = altitude
      end

      ##
      # The raw altitude

      attr_reader :altitude

      def to_s # :nodoc:
        a = @altitude.unpack("N").join.to_i
        return ((a.to_f/1e2)-1e5).to_s + "m"
      end

      def inspect # :nodoc:
        return "#<#{self.class} #{self}>"
      end

      def ==(other) # :nodoc:
        return @altitude == other.altitude
      end

      def eql?(other) # :nodoc:
        return self == other
      end

      def hash # :nodoc:
        return @altitude.hash
      end

    end

  end

  ##
  # Default resolver to use for Resolv class methods.

  DefaultResolver = self.new

  ##
  # Replaces the resolvers in the default resolver with +new_resolvers+.  This
  # allows resolvers to be changed for resolv-replace.

  def DefaultResolver.replace_resolvers new_resolvers
    @resolvers = new_resolvers
  end

  ##
  # Address Regexp to use for matching IP addresses.

  AddressRegex = /(?:#{IPv4::Regex})|(?:#{IPv6::Regex})/

end

PK}$[
Y�x`x`ruby/mkmf.rbnu�[���# -*- coding: us-ascii -*-
# frozen-string-literal: false
# module to create Makefile for extension modules
# invoke like: ruby -r mkmf extconf.rb

require 'rbconfig'
require 'fileutils'
require 'shellwords'

class String # :nodoc:
  # Wraps a string in escaped quotes if it contains whitespace.
  def quote
    /\s/ =~ self ? "\"#{self}\"" : "#{self}"
  end

  # Escape whitespaces for Makefile.
  def unspace
    gsub(/\s/, '\\\\\\&')
  end

  # Generates a string used as cpp macro name.
  def tr_cpp
    strip.upcase.tr_s("^A-Z0-9_*", "_").tr_s("*", "P")
  end

  def funcall_style
    /\)\z/ =~ self ? dup : "#{self}()"
  end

  def sans_arguments
    self[/\A[^()]+/]
  end
end

class Array # :nodoc:
  # Wraps all strings in escaped quotes if they contain whitespace.
  def quote
    map {|s| s.quote}
  end
end

##
# mkmf.rb is used by Ruby C extensions to generate a Makefile which will
# correctly compile and link the C extension to Ruby and a third-party
# library.
module MakeMakefile
  #### defer until this module become global-state free.
  # def self.extended(obj)
  #   obj.init_mkmf
  #   super
  # end
  #
  # def initialize(*args, rbconfig: RbConfig, **rest)
  #   init_mkmf(rbconfig::MAKEFILE_CONFIG, rbconfig::CONFIG)
  #   super(*args, **rest)
  # end

  ##
  # The makefile configuration using the defaults from when Ruby was built.

  CONFIG = RbConfig::MAKEFILE_CONFIG
  ORIG_LIBPATH = ENV['LIB']

  ##
  # Extensions for files compiled with a C compiler

  C_EXT = %w[c m]

  ##
  # Extensions for files compiled with a C++ compiler

  CXX_EXT = %w[cc mm cxx cpp]
  unless File.exist?(File.join(*File.split(__FILE__).tap {|d, b| b.swapcase}))
    CXX_EXT.concat(%w[C])
  end

  ##
  # Extensions for source files

  SRC_EXT = C_EXT + CXX_EXT

  ##
  # Extensions for header files

  HDR_EXT = %w[h hpp]
  $static = nil
  $config_h = '$(arch_hdrdir)/ruby/config.h'
  $default_static = $static

  unless defined? $configure_args
    $configure_args = {}
    args = CONFIG["configure_args"]
    if ENV["CONFIGURE_ARGS"]
      args << " " << ENV["CONFIGURE_ARGS"]
    end
    for arg in Shellwords::shellwords(args)
      arg, val = arg.split('=', 2)
      next unless arg
      arg.tr!('_', '-')
      if arg.sub!(/^(?!--)/, '--')
        val or next
        arg.downcase!
      end
      next if /^--(?:top|topsrc|src|cur)dir$/ =~ arg
      $configure_args[arg] = val || true
    end
    for arg in ARGV
      arg, val = arg.split('=', 2)
      next unless arg
      arg.tr!('_', '-')
      if arg.sub!(/^(?!--)/, '--')
        val or next
        arg.downcase!
      end
      $configure_args[arg] = val || true
    end
  end

  $libdir = CONFIG["libdir"]
  $rubylibdir = CONFIG["rubylibdir"]
  $archdir = CONFIG["archdir"]
  $sitedir = CONFIG["sitedir"]
  $sitelibdir = CONFIG["sitelibdir"]
  $sitearchdir = CONFIG["sitearchdir"]
  $vendordir = CONFIG["vendordir"]
  $vendorlibdir = CONFIG["vendorlibdir"]
  $vendorarchdir = CONFIG["vendorarchdir"]

  $mswin = /mswin/ =~ RUBY_PLATFORM
  $mingw = /mingw/ =~ RUBY_PLATFORM
  $cygwin = /cygwin/ =~ RUBY_PLATFORM
  $netbsd = /netbsd/ =~ RUBY_PLATFORM
  $haiku = /haiku/ =~ RUBY_PLATFORM
  $solaris = /solaris/ =~ RUBY_PLATFORM
  $universal = /universal/ =~ RUBY_PLATFORM
  $dest_prefix_pattern = (File::PATH_SEPARATOR == ';' ? /\A([[:alpha:]]:)?/ : /\A/)

  # :stopdoc:

  def config_string(key, config = CONFIG)
    s = config[key] and !s.empty? and block_given? ? yield(s) : s
  end
  module_function :config_string

  def dir_re(dir)
    Regexp.new('\$(?:\('+dir+'\)|\{'+dir+'\})(?:\$(?:\(target_prefix\)|\{target_prefix\}))?')
  end
  module_function :dir_re

  def relative_from(path, base)
    dir = File.join(path, "")
    if File.expand_path(dir) == File.expand_path(dir, base)
      path
    else
      File.join(base, path)
    end
  end

  INSTALL_DIRS = [
    [dir_re('commondir'), "$(RUBYCOMMONDIR)"],
    [dir_re('sitedir'), "$(RUBYCOMMONDIR)"],
    [dir_re('vendordir'), "$(RUBYCOMMONDIR)"],
    [dir_re('rubylibdir'), "$(RUBYLIBDIR)"],
    [dir_re('archdir'), "$(RUBYARCHDIR)"],
    [dir_re('sitelibdir'), "$(RUBYLIBDIR)"],
    [dir_re('vendorlibdir'), "$(RUBYLIBDIR)"],
    [dir_re('sitearchdir'), "$(RUBYARCHDIR)"],
    [dir_re('vendorarchdir'), "$(RUBYARCHDIR)"],
    [dir_re('rubyhdrdir'), "$(RUBYHDRDIR)"],
    [dir_re('sitehdrdir'), "$(SITEHDRDIR)"],
    [dir_re('vendorhdrdir'), "$(VENDORHDRDIR)"],
    [dir_re('bindir'), "$(BINDIR)"],
  ]

  def install_dirs(target_prefix = nil)
    if $extout and $extmk
      dirs = [
        ['BINDIR',        '$(extout)/bin'],
        ['RUBYCOMMONDIR', '$(extout)/common'],
        ['RUBYLIBDIR',    '$(RUBYCOMMONDIR)$(target_prefix)'],
        ['RUBYARCHDIR',   '$(extout)/$(arch)$(target_prefix)'],
        ['HDRDIR',        '$(extout)/include/ruby$(target_prefix)'],
        ['ARCHHDRDIR',    '$(extout)/include/$(arch)/ruby$(target_prefix)'],
        ['extout',        "#$extout"],
        ['extout_prefix', "#$extout_prefix"],
      ]
    elsif $extmk
      dirs = [
        ['BINDIR',        '$(bindir)'],
        ['RUBYCOMMONDIR', '$(rubylibdir)'],
        ['RUBYLIBDIR',    '$(rubylibdir)$(target_prefix)'],
        ['RUBYARCHDIR',   '$(archdir)$(target_prefix)'],
        ['HDRDIR',        '$(rubyhdrdir)/ruby$(target_prefix)'],
        ['ARCHHDRDIR',    '$(rubyhdrdir)/$(arch)/ruby$(target_prefix)'],
      ]
    elsif $configure_args.has_key?('--vendor')
      dirs = [
        ['BINDIR',        '$(bindir)'],
        ['RUBYCOMMONDIR', '$(vendordir)$(target_prefix)'],
        ['RUBYLIBDIR',    '$(vendorlibdir)$(target_prefix)'],
        ['RUBYARCHDIR',   '$(vendorarchdir)$(target_prefix)'],
        ['HDRDIR',        '$(vendorhdrdir)$(target_prefix)'],
        ['ARCHHDRDIR',    '$(vendorarchhdrdir)$(target_prefix)'],
      ]
    else
      dirs = [
        ['BINDIR',        '$(bindir)'],
        ['RUBYCOMMONDIR', '$(sitedir)$(target_prefix)'],
        ['RUBYLIBDIR',    '$(sitelibdir)$(target_prefix)'],
        ['RUBYARCHDIR',   '$(sitearchdir)$(target_prefix)'],
        ['HDRDIR',        '$(sitehdrdir)$(target_prefix)'],
        ['ARCHHDRDIR',    '$(sitearchhdrdir)$(target_prefix)'],
      ]
    end
    dirs << ['target_prefix', (target_prefix ? "/#{target_prefix}" : "")]
    dirs
  end

  def map_dir(dir, map = nil)
    map ||= INSTALL_DIRS
    map.inject(dir) {|d, (orig, new)| d.gsub(orig, new)}
  end

  topdir = File.dirname(File.dirname(__FILE__))
  path = File.expand_path($0)
  until (dir = File.dirname(path)) == path
    if File.identical?(dir, topdir)
      $extmk = true if %r"\A(?:ext|enc|tool|test)\z" =~ File.basename(path)
      break
    end
    path = dir
  end
  $extmk ||= false
  if not $extmk and File.exist?(($hdrdir = RbConfig::CONFIG["rubyhdrdir"]) + "/ruby/ruby.h")
    $topdir = $hdrdir
    $top_srcdir = $hdrdir
    $arch_hdrdir = RbConfig::CONFIG["rubyarchhdrdir"]
  elsif File.exist?(($hdrdir = ($top_srcdir ||= topdir) + "/include")  + "/ruby.h")
    $topdir ||= RbConfig::CONFIG["topdir"]
    $arch_hdrdir = "$(extout)/include/$(arch)"
  else
    abort <<MESSAGE
mkmf.rb can't find header files for ruby at #{$hdrdir}/ruby.h

You might have to install separate package for the ruby development
environment, ruby-dev or ruby-devel for example.
MESSAGE
  end

  CONFTEST = "conftest".freeze
  CONFTEST_C = "#{CONFTEST}.c"

  OUTFLAG = CONFIG['OUTFLAG']
  COUTFLAG = CONFIG['COUTFLAG']
  CSRCFLAG = CONFIG['CSRCFLAG']
  CPPOUTFILE = config_string('CPPOUTFILE') {|str| str.sub(/\bconftest\b/, CONFTEST)}

  def rm_f(*files)
    opt = (Hash === files.last ? [files.pop] : [])
    FileUtils.rm_f(Dir[*files.flatten], *opt)
  end
  module_function :rm_f

  def rm_rf(*files)
    opt = (Hash === files.last ? [files.pop] : [])
    FileUtils.rm_rf(Dir[*files.flatten], *opt)
  end
  module_function :rm_rf

  # Returns time stamp of the +target+ file if it exists and is newer than or
  # equal to all of +times+.
  def modified?(target, times)
    (t = File.mtime(target)) rescue return nil
    Array === times or times = [times]
    t if times.all? {|n| n <= t}
  end

  def split_libs(*strs)
    sep = $mswin ? /\s+/ : /\s+(?=-|\z)/
    strs.flat_map {|s| s.lstrip.split(sep)}
  end

  def merge_libs(*libs)
    libs.inject([]) do |x, y|
      y = y.inject([]) {|ary, e| ary.last == e ? ary : ary << e}
      y.each_with_index do |v, yi|
        if xi = x.rindex(v)
          x[(xi+1)..-1] = merge_libs(y[(yi+1)..-1], x[(xi+1)..-1])
          x[xi, 0] = y[0...yi]
          break
        end
      end and x.concat(y)
      x
    end
  end

  # This is a custom logging module. It generates an mkmf.log file when you
  # run your extconf.rb script. This can be useful for debugging unexpected
  # failures.
  #
  # This module and its associated methods are meant for internal use only.
  #
  module Logging
    @log = nil
    @logfile = 'mkmf.log'
    @orgerr = $stderr.dup
    @orgout = $stdout.dup
    @postpone = 0
    @quiet = $extmk

    def self::log_open
      @log ||= File::open(@logfile, 'wb')
      @log.sync = true
    end

    def self::log_opened?
      @log and not @log.closed?
    end

    def self::open
      log_open
      $stderr.reopen(@log)
      $stdout.reopen(@log)
      yield
    ensure
      $stderr.reopen(@orgerr)
      $stdout.reopen(@orgout)
    end

    def self::message(*s)
      log_open
      @log.printf(*s)
    end

    def self::logfile file
      @logfile = file
      log_close
    end

    def self::log_close
      if @log and not @log.closed?
        @log.flush
        @log.close
        @log = nil
      end
    end

    def self::postpone
      tmplog = "mkmftmp#{@postpone += 1}.log"
      open do
        log, *save = @log, @logfile, @orgout, @orgerr
        @log, @logfile, @orgout, @orgerr = nil, tmplog, log, log
        begin
          log.print(open {yield @log})
        ensure
          @log.close if @log and not @log.closed?
          File::open(tmplog) {|t| FileUtils.copy_stream(t, log)} if File.exist?(tmplog)
          @log, @logfile, @orgout, @orgerr = log, *save
          @postpone -= 1
          MakeMakefile.rm_f tmplog
        end
      end
    end

    class << self
      attr_accessor :quiet
    end
  end

  def libpath_env
    # used only if native compiling
    if libpathenv = config_string("LIBPATHENV")
      pathenv = ENV[libpathenv]
      libpath = RbConfig.expand($DEFLIBPATH.join(File::PATH_SEPARATOR))
      {libpathenv => [libpath, pathenv].compact.join(File::PATH_SEPARATOR)}
    else
      {}
    end
  end

  def expand_command(commands, envs = libpath_env)
    varpat = /\$\((\w+)\)|\$\{(\w+)\}/
    vars = nil
    expand = proc do |command|
      case command
      when Array
        command.map(&expand)
      when String
        if varpat =~ command
          vars ||= Hash.new {|h, k| h[k] = ENV[k]}
          command = command.dup
          nil while command.gsub!(varpat) {vars[$1||$2]}
        end
        command
      else
        command
      end
    end
    if Array === commands
      env, *commands = commands if Hash === commands.first
      envs.merge!(env) if env
    end
    return envs, expand[commands]
  end

  def env_quote(envs)
    envs.map {|e, v| "#{e}=#{v.quote}"}
  end

  def xsystem command, opts = nil
    env, command = expand_command(command)
    Logging::open do
      puts [env_quote(env), command.quote].join(' ')
      if opts and opts[:werror]
        result = nil
        Logging.postpone do |log|
          output = IO.popen(env, command, &:read)
          result = ($?.success? and File.zero?(log.path))
          output
        end
        result
      else
        system(env, *command)
      end
    end
  end

  def xpopen command, *mode, &block
    env, commands = expand_command(command)
    command = [env_quote(env), command].join(' ')
    Logging::open do
      case mode[0]
      when nil, Hash, /^r/
        puts "#{command} |"
      else
        puts "| #{command}"
      end
      IO.popen(env, commands, *mode, &block)
    end
  end

  def log_src(src, heading="checked program was")
    src = src.split(/^/)
    fmt = "%#{src.size.to_s.size}d: %s"
    Logging::message <<"EOM"
#{heading}:
/* begin */
EOM
    src.each_with_index {|line, no| Logging::message fmt, no+1, line}
    Logging::message <<"EOM"
/* end */

EOM
  end

  def conftest_source
    CONFTEST_C
  end

  def create_tmpsrc(src)
    src = "#{COMMON_HEADERS}\n#{src}"
    src = yield(src) if block_given?
    src.gsub!(/[ \t]+$/, '')
    src.gsub!(/\A\n+|^\n+$/, '')
    src.sub!(/[^\n]\z/, "\\&\n")
    count = 0
    begin
      File.open(conftest_source, "wb") do |cfile|
        cfile.print src
      end
    rescue Errno::EACCES
      if (count += 1) < 5
        sleep 0.2
        retry
      end
    end
    src
  end

  def have_devel?
    unless defined? $have_devel
      $have_devel = true
      $have_devel = try_link(MAIN_DOES_NOTHING)
    end
    $have_devel
  end

  def try_do(src, command, *opts, &b)
    unless have_devel?
      raise <<MSG
The compiler failed to generate an executable file.
You have to install development tools first.
MSG
    end
    begin
      src = create_tmpsrc(src, &b)
      xsystem(command, *opts)
    ensure
      log_src(src)
    end
  end

  def link_config(ldflags, opt="", libpath=$DEFLIBPATH|$LIBPATH)
    librubyarg = $extmk ? $LIBRUBYARG_STATIC : "$(LIBRUBYARG)"
    conf = RbConfig::CONFIG.merge('hdrdir' => $hdrdir.quote,
                                  'src' => "#{conftest_source}",
                                  'arch_hdrdir' => $arch_hdrdir.quote,
                                  'top_srcdir' => $top_srcdir.quote,
                                  'INCFLAGS' => "#$INCFLAGS",
                                  'CPPFLAGS' => "#$CPPFLAGS",
                                  'CFLAGS' => "#$CFLAGS",
                                  'ARCH_FLAG' => "#$ARCH_FLAG",
                                  'LDFLAGS' => "#$LDFLAGS #{ldflags}",
                                  'LOCAL_LIBS' => "#$LOCAL_LIBS #$libs",
                                  'LIBS' => "#{librubyarg} #{opt} #$LIBS")
    conf['LIBPATH'] = libpathflag(libpath.map {|s| RbConfig::expand(s.dup, conf)})
    conf
  end

  def link_command(ldflags, *opts)
    conf = link_config(ldflags, *opts)
    RbConfig::expand(TRY_LINK.dup, conf)
  end

  def cc_config(opt="")
    conf = RbConfig::CONFIG.merge('hdrdir' => $hdrdir.quote, 'srcdir' => $srcdir.quote,
                                  'arch_hdrdir' => $arch_hdrdir.quote,
                                  'top_srcdir' => $top_srcdir.quote)
    conf
  end

  def cc_command(opt="")
    conf = cc_config(opt)
    RbConfig::expand("$(CC) #$INCFLAGS #$CPPFLAGS #$CFLAGS #$ARCH_FLAG #{opt} -c #{CONFTEST_C}",
                     conf)
  end

  def cpp_command(outfile, opt="")
    conf = cc_config(opt)
    if $universal and (arch_flag = conf['ARCH_FLAG']) and !arch_flag.empty?
      conf['ARCH_FLAG'] = arch_flag.gsub(/(?:\G|\s)-arch\s+\S+/, '')
    end
    RbConfig::expand("$(CPP) #$INCFLAGS #$CPPFLAGS #$CFLAGS #{opt} #{CONFTEST_C} #{outfile}",
                     conf)
  end

  def libpathflag(libpath=$DEFLIBPATH|$LIBPATH)
    libpath.map{|x|
      case x
      when "$(topdir)", /\A\./
        LIBPATHFLAG
      else
        LIBPATHFLAG+RPATHFLAG
      end % x.quote
    }.join
  end

  def with_werror(opt, opts = nil)
    if opts
      if opts[:werror] and config_string("WERRORFLAG") {|flag| opt = opt ? "#{opt} #{flag}" : flag}
        (opts = opts.dup).delete(:werror)
      end
      yield(opt, opts)
    else
      yield(opt)
    end
  end

  def try_link0(src, opt="", *opts, &b) # :nodoc:
    exe = CONFTEST+$EXEEXT
    cmd = link_command("", opt)
    if $universal
      require 'tmpdir'
      Dir.mktmpdir("mkmf_", oldtmpdir = ENV["TMPDIR"]) do |tmpdir|
        begin
          ENV["TMPDIR"] = tmpdir
          try_do(src, cmd, *opts, &b)
        ensure
          ENV["TMPDIR"] = oldtmpdir
        end
      end
    else
      try_do(src, cmd, *opts, &b)
    end and File.executable?(exe) or return nil
    exe
  ensure
    MakeMakefile.rm_rf(*Dir["#{CONFTEST}*"]-[exe])
  end

  # Returns whether or not the +src+ can be compiled as a C source and linked
  # with its depending libraries successfully.  +opt+ is passed to the linker
  # as options. Note that +$CFLAGS+ and +$LDFLAGS+ are also passed to the
  # linker.
  #
  # If a block given, it is called with the source before compilation. You can
  # modify the source in the block.
  #
  # [+src+] a String which contains a C source
  # [+opt+] a String which contains linker options
  def try_link(src, opt="", *opts, &b)
    exe = try_link0(src, opt, *opts, &b) or return false
    MakeMakefile.rm_f exe
    true
  end

  # Returns whether or not the +src+ can be compiled as a C source.  +opt+ is
  # passed to the C compiler as options. Note that +$CFLAGS+ is also passed to
  # the compiler.
  #
  # If a block given, it is called with the source before compilation. You can
  # modify the source in the block.
  #
  # [+src+] a String which contains a C source
  # [+opt+] a String which contains compiler options
  def try_compile(src, opt="", *opts, &b)
    with_werror(opt, *opts) {|_opt, *| try_do(src, cc_command(_opt), *opts, &b)} and
      File.file?("#{CONFTEST}.#{$OBJEXT}")
  ensure
    MakeMakefile.rm_f "#{CONFTEST}*"
  end

  # Returns whether or not the +src+ can be preprocessed with the C
  # preprocessor.  +opt+ is passed to the preprocessor as options. Note that
  # +$CFLAGS+ is also passed to the preprocessor.
  #
  # If a block given, it is called with the source before preprocessing. You
  # can modify the source in the block.
  #
  # [+src+] a String which contains a C source
  # [+opt+] a String which contains preprocessor options
  def try_cpp(src, opt="", *opts, &b)
    try_do(src, cpp_command(CPPOUTFILE, opt), *opts, &b) and
      File.file?("#{CONFTEST}.i")
  ensure
    MakeMakefile.rm_f "#{CONFTEST}*"
  end

  alias try_header try_compile

  def cpp_include(header)
    if header
      header = [header] unless header.kind_of? Array
      header.map {|h| String === h ? "#include <#{h}>\n" : h}.join
    else
      ""
    end
  end

  def with_cppflags(flags)
    cppflags = $CPPFLAGS
    $CPPFLAGS = flags.dup
    ret = yield
  ensure
    $CPPFLAGS = cppflags unless ret
  end

  def try_cppflags(flags, opts = {})
    try_header(MAIN_DOES_NOTHING, flags, {:werror => true}.update(opts))
  end

  def append_cppflags(flags, *opts)
    Array(flags).each do |flag|
      if checking_for("whether #{flag} is accepted as CPPFLAGS") {
           try_cppflags(flag, *opts)
         }
        $CPPFLAGS << " " << flag
      end
    end
  end

  def with_cflags(flags)
    cflags = $CFLAGS
    $CFLAGS = flags.dup
    ret = yield
  ensure
    $CFLAGS = cflags unless ret
  end

  def try_cflags(flags, opts = {})
    try_compile(MAIN_DOES_NOTHING, flags, {:werror => true}.update(opts))
  end

  def with_ldflags(flags)
    ldflags = $LDFLAGS
    $LDFLAGS = flags.dup
    ret = yield
  ensure
    $LDFLAGS = ldflags unless ret
  end

  def try_ldflags(flags, opts = {})
    opts = {:werror => true}.update(opts) if $mswin
    try_link(MAIN_DOES_NOTHING, flags, opts)
  end

  def append_ldflags(flags, *opts)
    Array(flags).each do |flag|
      if checking_for("whether #{flag} is accepted as LDFLAGS") {
           try_ldflags(flag, *opts)
         }
        $LDFLAGS << " " << flag
      end
    end
  end

  def try_static_assert(expr, headers = nil, opt = "", &b)
    headers = cpp_include(headers)
    try_compile(<<SRC, opt, &b)
#{headers}
/*top*/
int conftest_const[(#{expr}) ? 1 : -1];
SRC
  end

  def try_constant(const, headers = nil, opt = "", &b)
    includes = cpp_include(headers)
    neg = try_static_assert("#{const} < 0", headers, opt)
    if CROSS_COMPILING
      if neg
        const = "-(#{const})"
      elsif try_static_assert("#{const} > 0", headers, opt)
        # positive constant
      elsif try_static_assert("#{const} == 0", headers, opt)
        return 0
      else
        # not a constant
        return nil
      end
      upper = 1
      until try_static_assert("#{const} <= #{upper}", headers, opt)
        lower = upper
        upper <<= 1
      end
      return nil unless lower
      while upper > lower + 1
        mid = (upper + lower) / 2
        if try_static_assert("#{const} > #{mid}", headers, opt)
          lower = mid
        else
          upper = mid
        end
      end
      upper = -upper if neg
      return upper
    else
      src = %{#{includes}
#include <stdio.h>
/*top*/
typedef#{neg ? '' : ' unsigned'}
#ifdef PRI_LL_PREFIX
#define PRI_CONFTEST_PREFIX PRI_LL_PREFIX
LONG_LONG
#else
#define PRI_CONFTEST_PREFIX "l"
long
#endif
conftest_type;
conftest_type conftest_const = (conftest_type)(#{const});
int main() {printf("%"PRI_CONFTEST_PREFIX"#{neg ? 'd' : 'u'}\\n", conftest_const); return 0;}
}
      begin
        if try_link0(src, opt, &b)
          xpopen("./#{CONFTEST}") do |f|
            return Integer(f.gets)
          end
        end
      ensure
        MakeMakefile.rm_f "#{CONFTEST}#{$EXEEXT}"
      end
    end
    nil
  end

  # You should use +have_func+ rather than +try_func+.
  #
  # [+func+] a String which contains a symbol name
  # [+libs+] a String which contains library names.
  # [+headers+] a String or an Array of strings which contains names of header
  #             files.
  def try_func(func, libs, headers = nil, opt = "", &b)
    headers = cpp_include(headers)
    prepare = String.new
    case func
    when /^&/
      decltype = proc {|x|"const volatile void *#{x}"}
    when /\)$/
      strvars = []
      call = func.gsub(/""/) {
        v = "s#{strvars.size + 1}"
        strvars << v
        v
      }
      unless strvars.empty?
        prepare << "char " << strvars.map {|v| "#{v}[1024]"}.join(", ") << "; "
      end
    when nil
      call = ""
    else
      call = "#{func}()"
      decltype = proc {|x| "void ((*#{x})())"}
    end
    if opt and !opt.empty?
      [[:to_str], [:join, " "], [:to_s]].each do |meth, *args|
        if opt.respond_to?(meth)
          break opt = opt.__send__(meth, *args)
        end
      end
      opt = "#{opt} #{libs}"
    else
      opt = libs
    end
    decltype && try_link(<<"SRC", opt, &b) or
#{headers}
/*top*/
extern int t(void);
#{MAIN_DOES_NOTHING 't'}
int t(void) { #{decltype["volatile p"]}; p = (#{decltype[]})#{func}; return !p; }
SRC
    call && try_link(<<"SRC", opt, &b)
#{headers}
/*top*/
extern int t(void);
#{MAIN_DOES_NOTHING 't'}
#{"extern void #{call};" if decltype}
int t(void) { #{prepare}#{call}; return 0; }
SRC
  end

  # You should use +have_var+ rather than +try_var+.
  def try_var(var, headers = nil, opt = "", &b)
    headers = cpp_include(headers)
    try_compile(<<"SRC", opt, &b)
#{headers}
/*top*/
extern int t(void);
#{MAIN_DOES_NOTHING 't'}
int t(void) { const volatile void *volatile p; p = &(&#{var})[0]; return !p; }
SRC
  end

  # Returns whether or not the +src+ can be preprocessed with the C
  # preprocessor and matches with +pat+.
  #
  # If a block given, it is called with the source before compilation. You can
  # modify the source in the block.
  #
  # [+pat+] a Regexp or a String
  # [+src+] a String which contains a C source
  # [+opt+] a String which contains preprocessor options
  #
  # NOTE: When pat is a Regexp the matching will be checked in process,
  # otherwise egrep(1) will be invoked to check it.
  def egrep_cpp(pat, src, opt = "", &b)
    src = create_tmpsrc(src, &b)
    xpopen(cpp_command('', opt)) do |f|
      if Regexp === pat
        puts("    ruby -ne 'print if #{pat.inspect}'")
        f.grep(pat) {|l|
          puts "#{f.lineno}: #{l}"
          return true
        }
        false
      else
        puts("    egrep '#{pat}'")
        begin
          stdin = $stdin.dup
          $stdin.reopen(f)
          system("egrep", pat)
        ensure
          $stdin.reopen(stdin)
        end
      end
    end
  ensure
    MakeMakefile.rm_f "#{CONFTEST}*"
    log_src(src)
  end

  # This is used internally by the have_macro? method.
  def macro_defined?(macro, src, opt = "", &b)
    src = src.sub(/[^\n]\z/, "\\&\n")
    try_compile(src + <<"SRC", opt, &b)
/*top*/
#ifndef #{macro}
# error
|:/ === #{macro} undefined === /:|
#endif
SRC
  end

  # Returns whether or not:
  # * the +src+ can be compiled as a C source,
  # * the result object can be linked with its depending libraries
  #   successfully,
  # * the linked file can be invoked as an executable
  # * and the executable exits successfully
  #
  # +opt+ is passed to the linker as options. Note that +$CFLAGS+ and
  # +$LDFLAGS+ are also passed to the linker.
  #
  # If a block given, it is called with the source before compilation. You can
  # modify the source in the block.
  #
  # [+src+] a String which contains a C source
  # [+opt+] a String which contains linker options
  #
  # Returns true when the executable exits successfully, false when it fails,
  # or nil when preprocessing, compilation or link fails.
  def try_run(src, opt = "", &b)
    raise "cannot run test program while cross compiling" if CROSS_COMPILING
    if try_link0(src, opt, &b)
      xsystem("./#{CONFTEST}")
    else
      nil
    end
  ensure
    MakeMakefile.rm_f "#{CONFTEST}*"
  end

  def install_files(mfile, ifiles, map = nil, srcprefix = nil)
    ifiles or return
    ifiles.empty? and return
    srcprefix ||= "$(srcdir)/#{srcprefix}".chomp('/')
    RbConfig::expand(srcdir = srcprefix.dup)
    dirs = []
    path = Hash.new {|h, i| h[i] = dirs.push([i])[-1]}
    ifiles.each do |files, dir, prefix|
      dir = map_dir(dir, map)
      prefix &&= %r|\A#{Regexp.quote(prefix)}/?|
      if /\A\.\// =~ files
        # install files which are in current working directory.
        files = files[2..-1]
        len = nil
      else
        # install files which are under the $(srcdir).
        files = File.join(srcdir, files)
        len = srcdir.size
      end
      f = nil
      Dir.glob(files) do |fx|
        f = fx
        f[0..len] = "" if len
        case File.basename(f)
        when *$NONINSTALLFILES
          next
        end
        d = File.dirname(f)
        d.sub!(prefix, "") if prefix
        d = (d.empty? || d == ".") ? dir : File.join(dir, d)
        f = File.join(srcprefix, f) if len
        path[d] << f
      end
      unless len or f
        d = File.dirname(files)
        d.sub!(prefix, "") if prefix
        d = (d.empty? || d == ".") ? dir : File.join(dir, d)
        path[d] << files
      end
    end
    dirs
  end

  def install_rb(mfile, dest, srcdir = nil)
    install_files(mfile, [["lib/**/*.rb", dest, "lib"]], nil, srcdir)
  end

  def append_library(libs, lib) # :no-doc:
    format(LIBARG, lib) + " " + libs
  end

  def message(*s)
    unless Logging.quiet and not $VERBOSE
      printf(*s)
      $stdout.flush
    end
  end

  # This emits a string to stdout that allows users to see the results of the
  # various have* and find* methods as they are tested.
  #
  # Internal use only.
  #
  def checking_for(m, fmt = nil)
    f = caller[0][/in `([^<].*)'$/, 1] and f << ": " #` for vim #'
    m = "checking #{/\Acheck/ =~ f ? '' : 'for '}#{m}... "
    message "%s", m
    a = r = nil
    Logging::postpone do
      r = yield
      a = (fmt ? "#{fmt % r}" : r ? "yes" : "no")
      "#{f}#{m}-------------------- #{a}\n\n"
    end
    message "%s\n", a
    Logging::message "--------------------\n\n"
    r
  end

  def checking_message(target, place = nil, opt = nil)
    [["in", place], ["with", opt]].inject("#{target}") do |msg, (pre, noun)|
      if noun
        [[:to_str], [:join, ","], [:to_s]].each do |meth, *args|
          if noun.respond_to?(meth)
            break noun = noun.__send__(meth, *args)
          end
        end
        unless noun.empty?
          msg << " #{pre} " unless msg.empty?
          msg << noun
        end
      end
      msg
    end
  end

  # :startdoc:

  # Check whether each given C compiler flag is acceptable and append it
  # to <tt>$CFLAGS</tt> if so.
  #
  # [+flags+] a C compiler flag as a +String+ or an +Array+ of them
  #
  def append_cflags(flags, *opts)
    Array(flags).each do |flag|
      if checking_for("whether #{flag} is accepted as CFLAGS") {
           try_cflags(flag, *opts)
         }
        $CFLAGS << " " << flag
      end
    end
  end

  # Returns whether or not +macro+ is defined either in the common header
  # files or within any +headers+ you provide.
  #
  # Any options you pass to +opt+ are passed along to the compiler.
  #
  def have_macro(macro, headers = nil, opt = "", &b)
    checking_for checking_message(macro, headers, opt) do
      macro_defined?(macro, cpp_include(headers), opt, &b)
    end
  end

  # Returns whether or not the given entry point +func+ can be found within
  # +lib+.  If +func+ is +nil+, the <code>main()</code> entry point is used by
  # default.  If found, it adds the library to list of libraries to be used
  # when linking your extension.
  #
  # If +headers+ are provided, it will include those header files as the
  # header files it looks in when searching for +func+.
  #
  # The real name of the library to be linked can be altered by
  # <code>--with-FOOlib</code> configuration option.
  #
  def have_library(lib, func = nil, headers = nil, opt = "", &b)
    dir_config(lib)
    lib = with_config(lib+'lib', lib)
    checking_for checking_message(func && func.funcall_style, LIBARG%lib, opt) do
      if COMMON_LIBS.include?(lib)
        true
      else
        libs = append_library($libs, lib)
        if try_func(func, libs, headers, opt, &b)
          $libs = libs
          true
        else
          false
        end
      end
    end
  end

  # Returns whether or not the entry point +func+ can be found within the
  # library +lib+ in one of the +paths+ specified, where +paths+ is an array
  # of strings.  If +func+ is +nil+ , then the <code>main()</code> function is
  # used as the entry point.
  #
  # If +lib+ is found, then the path it was found on is added to the list of
  # library paths searched and linked against.
  #
  def find_library(lib, func, *paths, &b)
    dir_config(lib)
    lib = with_config(lib+'lib', lib)
    paths = paths.flat_map {|path| path.split(File::PATH_SEPARATOR)}
    checking_for checking_message(func && func.funcall_style, LIBARG%lib) do
      libpath = $LIBPATH
      libs = append_library($libs, lib)
      begin
        until r = try_func(func, libs, &b) or paths.empty?
          $LIBPATH = libpath | [paths.shift]
        end
        if r
          $libs = libs
          libpath = nil
        end
      ensure
        $LIBPATH = libpath if libpath
      end
      r
    end
  end

  # Returns whether or not the function +func+ can be found in the common
  # header files, or within any +headers+ that you provide.  If found, a macro
  # is passed as a preprocessor constant to the compiler using the function
  # name, in uppercase, prepended with +HAVE_+.
  #
  # To check functions in an additional library, you need to check that
  # library first using <code>have_library()</code>.  The +func+ shall be
  # either mere function name or function name with arguments.
  #
  # For example, if <code>have_func('foo')</code> returned +true+, then the
  # +HAVE_FOO+ preprocessor macro would be passed to the compiler.
  #
  def have_func(func, headers = nil, opt = "", &b)
    checking_for checking_message(func.funcall_style, headers, opt) do
      if try_func(func, $libs, headers, opt, &b)
        $defs << "-DHAVE_#{func.sans_arguments.tr_cpp}"
        true
      else
        false
      end
    end
  end

  # Returns whether or not the variable +var+ can be found in the common
  # header files, or within any +headers+ that you provide.  If found, a macro
  # is passed as a preprocessor constant to the compiler using the variable
  # name, in uppercase, prepended with +HAVE_+.
  #
  # To check variables in an additional library, you need to check that
  # library first using <code>have_library()</code>.
  #
  # For example, if <code>have_var('foo')</code> returned true, then the
  # +HAVE_FOO+ preprocessor macro would be passed to the compiler.
  #
  def have_var(var, headers = nil, opt = "", &b)
    checking_for checking_message(var, headers, opt) do
      if try_var(var, headers, opt, &b)
        $defs.push(format("-DHAVE_%s", var.tr_cpp))
        true
      else
        false
      end
    end
  end

  # Returns whether or not the given +header+ file can be found on your system.
  # If found, a macro is passed as a preprocessor constant to the compiler
  # using the header file name, in uppercase, prepended with +HAVE_+.
  #
  # For example, if <code>have_header('foo.h')</code> returned true, then the
  # +HAVE_FOO_H+ preprocessor macro would be passed to the compiler.
  #
  def have_header(header, preheaders = nil, opt = "", &b)
    dir_config(header[/.*?(?=\/)|.*?(?=\.)/])
    checking_for header do
      if try_header(cpp_include(preheaders)+cpp_include(header), opt, &b)
        $defs.push(format("-DHAVE_%s", header.tr_cpp))
        true
      else
        false
      end
    end
  end

  # Returns whether or not the given +framework+ can be found on your system.
  # If found, a macro is passed as a preprocessor constant to the compiler
  # using the framework name, in uppercase, prepended with +HAVE_FRAMEWORK_+.
  #
  # For example, if <code>have_framework('Ruby')</code> returned true, then
  # the +HAVE_FRAMEWORK_RUBY+ preprocessor macro would be passed to the
  # compiler.
  #
  # If +fw+ is a pair of the framework name and its header file name
  # that header file is checked, instead of the normally used header
  # file which is named same as the framework.
  def have_framework(fw, &b)
    if Array === fw
      fw, header = *fw
    else
      header = "#{fw}.h"
    end
    checking_for fw do
      src = cpp_include("#{fw}/#{header}") << "\n" "int main(void){return 0;}"
      opt = " -framework #{fw}"
      if try_link(src, opt, &b) or (objc = try_link(src, "-ObjC#{opt}", &b))
        $defs.push(format("-DHAVE_FRAMEWORK_%s", fw.tr_cpp))
        # TODO: non-worse way than this hack, to get rid of separating
        # option and its argument.
        $LDFLAGS << " -ObjC" if objc and /(\A|\s)-ObjC(\s|\z)/ !~ $LDFLAGS
        $LIBS << opt
        true
      else
        false
      end
    end
  end

  # Instructs mkmf to search for the given +header+ in any of the +paths+
  # provided, and returns whether or not it was found in those paths.
  #
  # If the header is found then the path it was found on is added to the list
  # of included directories that are sent to the compiler (via the
  # <code>-I</code> switch).
  #
  def find_header(header, *paths)
    message = checking_message(header, paths)
    header = cpp_include(header)
    checking_for message do
      if try_header(header)
        true
      else
        found = false
        paths.each do |dir|
          opt = "-I#{dir}".quote
          if try_header(header, opt)
            $INCFLAGS << " " << opt
            found = true
            break
          end
        end
        found
      end
    end
  end

  # Returns whether or not the struct of type +type+ contains +member+.  If
  # it does not, or the struct type can't be found, then false is returned.
  # You may optionally specify additional +headers+ in which to look for the
  # struct (in addition to the common header files).
  #
  # If found, a macro is passed as a preprocessor constant to the compiler
  # using the type name and the member name, in uppercase, prepended with
  # +HAVE_+.
  #
  # For example, if <code>have_struct_member('struct foo', 'bar')</code>
  # returned true, then the +HAVE_STRUCT_FOO_BAR+ preprocessor macro would be
  # passed to the compiler.
  #
  # +HAVE_ST_BAR+ is also defined for backward compatibility.
  #
  def have_struct_member(type, member, headers = nil, opt = "", &b)
    checking_for checking_message("#{type}.#{member}", headers) do
      if try_compile(<<"SRC", opt, &b)
#{cpp_include(headers)}
/*top*/
int s = (char *)&((#{type}*)0)->#{member} - (char *)0;
#{MAIN_DOES_NOTHING}
SRC
        $defs.push(format("-DHAVE_%s_%s", type.tr_cpp, member.tr_cpp))
        $defs.push(format("-DHAVE_ST_%s", member.tr_cpp)) # backward compatibility
        true
      else
        false
      end
    end
  end

  # Returns whether or not the static type +type+ is defined.
  #
  # See also +have_type+
  #
  def try_type(type, headers = nil, opt = "", &b)
    if try_compile(<<"SRC", opt, &b)
#{cpp_include(headers)}
/*top*/
typedef #{type} conftest_type;
int conftestval[sizeof(conftest_type)?1:-1];
SRC
      $defs.push(format("-DHAVE_TYPE_%s", type.tr_cpp))
      true
    else
      false
    end
  end

  # Returns whether or not the static type +type+ is defined.  You may
  # optionally pass additional +headers+ to check against in addition to the
  # common header files.
  #
  # You may also pass additional flags to +opt+ which are then passed along to
  # the compiler.
  #
  # If found, a macro is passed as a preprocessor constant to the compiler
  # using the type name, in uppercase, prepended with +HAVE_TYPE_+.
  #
  # For example, if <code>have_type('foo')</code> returned true, then the
  # +HAVE_TYPE_FOO+ preprocessor macro would be passed to the compiler.
  #
  def have_type(type, headers = nil, opt = "", &b)
    checking_for checking_message(type, headers, opt) do
      try_type(type, headers, opt, &b)
    end
  end

  # Returns where the static type +type+ is defined.
  #
  # You may also pass additional flags to +opt+ which are then passed along to
  # the compiler.
  #
  # See also +have_type+.
  #
  def find_type(type, opt, *headers, &b)
    opt ||= ""
    fmt = "not found"
    def fmt.%(x)
      x ? x.respond_to?(:join) ? x.join(",") : x : self
    end
    checking_for checking_message(type, nil, opt), fmt do
      headers.find do |h|
        try_type(type, h, opt, &b)
      end
    end
  end

  # Returns whether or not the constant +const+ is defined.
  #
  # See also +have_const+
  #
  def try_const(const, headers = nil, opt = "", &b)
    const, type = *const
    if try_compile(<<"SRC", opt, &b)
#{cpp_include(headers)}
/*top*/
typedef #{type || 'int'} conftest_type;
conftest_type conftestval = #{type ? '' : '(int)'}#{const};
SRC
      $defs.push(format("-DHAVE_CONST_%s", const.tr_cpp))
      true
    else
      false
    end
  end

  # Returns whether or not the constant +const+ is defined.  You may
  # optionally pass the +type+ of +const+ as <code>[const, type]</code>,
  # such as:
  #
  #   have_const(%w[PTHREAD_MUTEX_INITIALIZER pthread_mutex_t], "pthread.h")
  #
  # You may also pass additional +headers+ to check against in addition to the
  # common header files, and additional flags to +opt+ which are then passed
  # along to the compiler.
  #
  # If found, a macro is passed as a preprocessor constant to the compiler
  # using the type name, in uppercase, prepended with +HAVE_CONST_+.
  #
  # For example, if <code>have_const('foo')</code> returned true, then the
  # +HAVE_CONST_FOO+ preprocessor macro would be passed to the compiler.
  #
  def have_const(const, headers = nil, opt = "", &b)
    checking_for checking_message([*const].compact.join(' '), headers, opt) do
      try_const(const, headers, opt, &b)
    end
  end

  # :stopdoc:
  STRING_OR_FAILED_FORMAT = "%s"
  class << STRING_OR_FAILED_FORMAT # :nodoc:
    def %(x)
      x ? super : "failed"
    end
  end

  def typedef_expr(type, headers)
    typename, member = type.split('.', 2)
    prelude = cpp_include(headers).split(/$/)
    prelude << "typedef #{typename} rbcv_typedef_;\n"
    return "rbcv_typedef_", member, prelude
  end

  def try_signedness(type, member, headers = nil, opts = nil)
    raise ArgumentError, "don't know how to tell signedness of members" if member
    if try_static_assert("(#{type})-1 < 0", headers, opts)
      return -1
    elsif try_static_assert("(#{type})-1 > 0", headers, opts)
      return +1
    end
  end

  # :startdoc:

  # Returns the size of the given +type+.  You may optionally specify
  # additional +headers+ to search in for the +type+.
  #
  # If found, a macro is passed as a preprocessor constant to the compiler
  # using the type name, in uppercase, prepended with +SIZEOF_+, followed by
  # the type name, followed by <code>=X</code> where "X" is the actual size.
  #
  # For example, if <code>check_sizeof('mystruct')</code> returned 12, then
  # the <code>SIZEOF_MYSTRUCT=12</code> preprocessor macro would be passed to
  # the compiler.
  #
  def check_sizeof(type, headers = nil, opts = "", &b)
    typedef, member, prelude = typedef_expr(type, headers)
    prelude << "#{typedef} *rbcv_ptr_;\n"
    prelude = [prelude]
    expr = "sizeof((*rbcv_ptr_)#{"." << member if member})"
    fmt = STRING_OR_FAILED_FORMAT
    checking_for checking_message("size of #{type}", headers), fmt do
      if size = try_constant(expr, prelude, opts, &b)
        $defs.push(format("-DSIZEOF_%s=%s", type.tr_cpp, size))
        size
      end
    end
  end

  # Returns the signedness of the given +type+.  You may optionally specify
  # additional +headers+ to search in for the +type+.
  #
  # If the +type+ is found and is a numeric type, a macro is passed as a
  # preprocessor constant to the compiler using the +type+ name, in uppercase,
  # prepended with +SIGNEDNESS_OF_+, followed by the +type+ name, followed by
  # <code>=X</code> where "X" is positive integer if the +type+ is unsigned
  # and a negative integer if the +type+ is signed.
  #
  # For example, if +size_t+ is defined as unsigned, then
  # <code>check_signedness('size_t')</code> would return +1 and the
  # <code>SIGNEDNESS_OF_SIZE_T=+1</code> preprocessor macro would be passed to
  # the compiler.  The <code>SIGNEDNESS_OF_INT=-1</code> macro would be set
  # for <code>check_signedness('int')</code>
  #
  def check_signedness(type, headers = nil, opts = nil, &b)
    typedef, member, prelude = typedef_expr(type, headers)
    signed = nil
    checking_for("signedness of #{type}", STRING_OR_FAILED_FORMAT) do
      signed = try_signedness(typedef, member, [prelude], opts, &b) or next nil
      $defs.push("-DSIGNEDNESS_OF_%s=%+d" % [type.tr_cpp, signed])
      signed < 0 ? "signed" : "unsigned"
    end
    signed
  end

  # Returns the convertible integer type of the given +type+.  You may
  # optionally specify additional +headers+ to search in for the +type+.
  # _convertible_ means actually the same type, or typedef'd from the same
  # type.
  #
  # If the +type+ is an integer type and the _convertible_ type is found,
  # the following macros are passed as preprocessor constants to the compiler
  # using the +type+ name, in uppercase.
  #
  # * +TYPEOF_+, followed by the +type+ name, followed by <code>=X</code>
  #   where "X" is the found _convertible_ type name.
  # * +TYP2NUM+ and +NUM2TYP+,
  #   where +TYP+ is the +type+ name in uppercase with replacing an +_t+
  #   suffix with "T", followed by <code>=X</code> where "X" is the macro name
  #   to convert +type+ to an Integer object, and vice versa.
  #
  # For example, if +foobar_t+ is defined as unsigned long, then
  # <code>convertible_int("foobar_t")</code> would return "unsigned long", and
  # define these macros:
  #
  #   #define TYPEOF_FOOBAR_T unsigned long
  #   #define FOOBART2NUM ULONG2NUM
  #   #define NUM2FOOBART NUM2ULONG
  #
  def convertible_int(type, headers = nil, opts = nil, &b)
    type, macname = *type
    checking_for("convertible type of #{type}", STRING_OR_FAILED_FORMAT) do
      if UNIVERSAL_INTS.include?(type)
        type
      else
        typedef, member, prelude = typedef_expr(type, headers, &b)
        if member
          prelude << "static rbcv_typedef_ rbcv_var;"
          compat = UNIVERSAL_INTS.find {|t|
            try_static_assert("sizeof(rbcv_var.#{member}) == sizeof(#{t})", [prelude], opts, &b)
          }
        else
          next unless signed = try_signedness(typedef, member, [prelude])
          u = "unsigned " if signed > 0
          prelude << "extern rbcv_typedef_ foo();"
          compat = UNIVERSAL_INTS.find {|t|
            try_compile([prelude, "extern #{u}#{t} foo();"].join("\n"), opts, :werror=>true, &b)
          }
        end
        if compat
          macname ||= type.sub(/_(?=t\z)/, '').tr_cpp
          conv = (compat == "long long" ? "LL" : compat.upcase)
          compat = "#{u}#{compat}"
          typename = type.tr_cpp
          $defs.push(format("-DSIZEOF_%s=SIZEOF_%s", typename, compat.tr_cpp))
          $defs.push(format("-DTYPEOF_%s=%s", typename, compat.quote))
          $defs.push(format("-DPRI_%s_PREFIX=PRI_%s_PREFIX", macname, conv))
          conv = (u ? "U" : "") + conv
          $defs.push(format("-D%s2NUM=%s2NUM", macname, conv))
          $defs.push(format("-DNUM2%s=NUM2%s", macname, conv))
          compat
        end
      end
    end
  end
  # :stopdoc:

  # Used internally by the what_type? method to determine if +type+ is a scalar
  # pointer.
  def scalar_ptr_type?(type, member = nil, headers = nil, &b)
    try_compile(<<"SRC", &b)   # pointer
#{cpp_include(headers)}
/*top*/
volatile #{type} conftestval;
extern int t(void);
#{MAIN_DOES_NOTHING 't'}
int t(void) {return (int)(1-*(conftestval#{member ? ".#{member}" : ""}));}
SRC
  end

  # Used internally by the what_type? method to determine if +type+ is a scalar
  # pointer.
  def scalar_type?(type, member = nil, headers = nil, &b)
    try_compile(<<"SRC", &b)   # pointer
#{cpp_include(headers)}
/*top*/
volatile #{type} conftestval;
extern int t(void);
#{MAIN_DOES_NOTHING 't'}
int t(void) {return (int)(1-(conftestval#{member ? ".#{member}" : ""}));}
SRC
  end

  # Used internally by the what_type? method to check if the _typeof_ GCC
  # extension is available.
  def have_typeof?
    return $typeof if defined?($typeof)
    $typeof = %w[__typeof__ typeof].find do |t|
      try_compile(<<SRC)
int rbcv_foo;
#{t}(rbcv_foo) rbcv_bar;
SRC
    end
  end

  def what_type?(type, member = nil, headers = nil, &b)
    m = "#{type}"
    var = val = "*rbcv_var_"
    func = "rbcv_func_(void)"
    if member
      m << "." << member
    else
      type, member = type.split('.', 2)
    end
    if member
      val = "(#{var}).#{member}"
    end
    prelude = [cpp_include(headers).split(/^/)]
    prelude << ["typedef #{type} rbcv_typedef_;\n",
                "extern rbcv_typedef_ *#{func};\n",
                "rbcv_typedef_ #{var};\n",
               ]
    type = "rbcv_typedef_"
    fmt = member && !(typeof = have_typeof?) ? "seems %s" : "%s"
    if typeof
      var = "*rbcv_member_"
      func = "rbcv_mem_func_(void)"
      member = nil
      type = "rbcv_mem_typedef_"
      prelude[-1] << "typedef #{typeof}(#{val}) #{type};\n"
      prelude[-1] << "extern #{type} *#{func};\n"
      prelude[-1] << "#{type} #{var};\n"
      val = var
    end
    def fmt.%(x)
      x ? super : "unknown"
    end
    checking_for checking_message(m, headers), fmt do
      if scalar_ptr_type?(type, member, prelude, &b)
        if try_static_assert("sizeof(*#{var}) == 1", prelude)
          return "string"
        end
        ptr = "*"
      elsif scalar_type?(type, member, prelude, &b)
        unless member and !typeof or try_static_assert("(#{type})-1 < 0", prelude)
          unsigned = "unsigned"
        end
        ptr = ""
      else
        next
      end
      type = UNIVERSAL_INTS.find do |t|
        pre = prelude
        unless member
          pre += [["#{unsigned} #{t} #{ptr}#{var};\n",
                   "extern #{unsigned} #{t} #{ptr}*#{func};\n"]]
        end
        try_static_assert("sizeof(#{ptr}#{val}) == sizeof(#{unsigned} #{t})", pre)
      end
      type or next
      [unsigned, type, ptr].join(" ").strip
    end
  end

  # This method is used internally by the find_executable method.
  #
  # Internal use only.
  #
  def find_executable0(bin, path = nil)
    executable_file = proc do |name|
      begin
        stat = File.stat(name)
      rescue SystemCallError
      else
        next name if stat.file? and stat.executable?
      end
    end

    exts = config_string('EXECUTABLE_EXTS') {|s| s.split} || config_string('EXEEXT') {|s| [s]}
    if File.expand_path(bin) == bin
      return bin if executable_file.call(bin)
      if exts
        exts.each {|ext| executable_file.call(file = bin + ext) and return file}
      end
      return nil
    end
    if path ||= ENV['PATH']
      path = path.split(File::PATH_SEPARATOR)
    else
      path = %w[/usr/local/bin /usr/ucb /usr/bin /bin]
    end
    file = nil
    path.each do |dir|
      dir.sub!(/\A"(.*)"\z/m, '\1') if $mswin or $mingw
      return file if executable_file.call(file = File.join(dir, bin))
      if exts
        exts.each {|ext| executable_file.call(ext = file + ext) and return ext}
      end
    end
    nil
  end

  # :startdoc:

  # Searches for the executable +bin+ on +path+.  The default path is your
  # +PATH+ environment variable. If that isn't defined, it will resort to
  # searching /usr/local/bin, /usr/ucb, /usr/bin and /bin.
  #
  # If found, it will return the full path, including the executable name, of
  # where it was found.
  #
  # Note that this method does not actually affect the generated Makefile.
  #
  def find_executable(bin, path = nil)
    checking_for checking_message(bin, path) do
      find_executable0(bin, path)
    end
  end

  # :stopdoc:

  def arg_config(config, default=nil, &block)
    $arg_config << [config, default]
    defaults = []
    if default
      defaults << default
    elsif !block
      defaults << nil
    end
    $configure_args.fetch(config.tr('_', '-'), *defaults, &block)
  end

  # :startdoc:

  # Tests for the presence of a <tt>--with-</tt>_config_ or
  # <tt>--without-</tt>_config_ option.  Returns +true+ if the with option is
  # given, +false+ if the without option is given, and the default value
  # otherwise.
  #
  # This can be useful for adding custom definitions, such as debug
  # information.
  #
  # Example:
  #
  #    if with_config("debug")
  #       $defs.push("-DOSSL_DEBUG") unless $defs.include? "-DOSSL_DEBUG"
  #    end
  #
  def with_config(config, default=nil)
    config = config.sub(/^--with[-_]/, '')
    val = arg_config("--with-"+config) do
      if arg_config("--without-"+config)
        false
      elsif block_given?
        yield(config, default)
      else
        break default
      end
    end
    case val
    when "yes"
      true
    when "no"
      false
    else
      val
    end
  end

  # Tests for the presence of an <tt>--enable-</tt>_config_ or
  # <tt>--disable-</tt>_config_ option. Returns +true+ if the enable option is
  # given, +false+ if the disable option is given, and the default value
  # otherwise.
  #
  # This can be useful for adding custom definitions, such as debug
  # information.
  #
  # Example:
  #
  #    if enable_config("debug")
  #       $defs.push("-DOSSL_DEBUG") unless $defs.include? "-DOSSL_DEBUG"
  #    end
  #
  def enable_config(config, default=nil)
    if arg_config("--enable-"+config)
      true
    elsif arg_config("--disable-"+config)
      false
    elsif block_given?
      yield(config, default)
    else
      return default
    end
  end

  # Generates a header file consisting of the various macro definitions
  # generated by other methods such as have_func and have_header. These are
  # then wrapped in a custom <code>#ifndef</code> based on the +header+ file
  # name, which defaults to "extconf.h".
  #
  # For example:
  #
  #   # extconf.rb
  #   require 'mkmf'
  #   have_func('realpath')
  #   have_header('sys/utime.h')
  #   create_header
  #   create_makefile('foo')
  #
  # The above script would generate the following extconf.h file:
  #
  #   #ifndef EXTCONF_H
  #   #define EXTCONF_H
  #   #define HAVE_REALPATH 1
  #   #define HAVE_SYS_UTIME_H 1
  #   #endif
  #
  # Given that the create_header method generates a file based on definitions
  # set earlier in your extconf.rb file, you will probably want to make this
  # one of the last methods you call in your script.
  #
  def create_header(header = "extconf.h")
    message "creating %s\n", header
    sym = header.tr_cpp
    hdr = ["#ifndef #{sym}\n#define #{sym}\n"]
    for line in $defs
      case line
      when /^-D([^=]+)(?:=(.*))?/
        hdr << "#define #$1 #{$2 ? Shellwords.shellwords($2)[0].gsub(/(?=\t+)/, "\\\n") : 1}\n"
      when /^-U(.*)/
        hdr << "#undef #$1\n"
      end
    end
    hdr << "#endif\n"
    hdr = hdr.join("")
    log_src(hdr, "#{header} is")
    unless (IO.read(header) == hdr rescue false)
      File.open(header, "wb") do |hfile|
        hfile.write(hdr)
      end
    end
    $extconf_h = header
  end

  # call-seq:
  #   dir_config(target)
  #   dir_config(target, prefix)
  #   dir_config(target, idefault, ldefault)
  #
  # Sets a +target+ name that the user can then use to configure
  # various "with" options with on the command line by using that
  # name.  For example, if the target is set to "foo", then the user
  # could use the <code>--with-foo-dir=prefix</code>,
  # <code>--with-foo-include=dir</code> and
  # <code>--with-foo-lib=dir</code> command line options to tell where
  # to search for header/library files.
  #
  # You may pass along additional parameters to specify default
  # values.  If one is given it is taken as default +prefix+, and if
  # two are given they are taken as "include" and "lib" defaults in
  # that order.
  #
  # In any case, the return value will be an array of determined
  # "include" and "lib" directories, either of which can be nil if no
  # corresponding command line option is given when no default value
  # is specified.
  #
  # Note that dir_config only adds to the list of places to search for
  # libraries and include files.  It does not link the libraries into your
  # application.
  #
  def dir_config(target, idefault=nil, ldefault=nil)
    if conf = $config_dirs[target]
      return conf
    end

    if dir = with_config(target + "-dir", (idefault unless ldefault))
      defaults = Array === dir ? dir : dir.split(File::PATH_SEPARATOR)
      idefault = ldefault = nil
    end

    idir = with_config(target + "-include", idefault)
    $arg_config.last[1] ||= "${#{target}-dir}/include"
    ldir = with_config(target + "-lib", ldefault)
    $arg_config.last[1] ||= "${#{target}-dir}/#{_libdir_basename}"

    idirs = idir ? Array === idir ? idir.dup : idir.split(File::PATH_SEPARATOR) : []
    if defaults
      idirs.concat(defaults.collect {|d| d + "/include"})
      idir = ([idir] + idirs).compact.join(File::PATH_SEPARATOR)
    end
    unless idirs.empty?
      idirs.collect! {|d| "-I" + d}
      idirs -= Shellwords.shellwords($CPPFLAGS)
      unless idirs.empty?
        $CPPFLAGS = (idirs.quote << $CPPFLAGS).join(" ")
      end
    end

    ldirs = ldir ? Array === ldir ? ldir.dup : ldir.split(File::PATH_SEPARATOR) : []
    if defaults
      ldirs.concat(defaults.collect {|d| "#{d}/#{_libdir_basename}"})
      ldir = ([ldir] + ldirs).compact.join(File::PATH_SEPARATOR)
    end
    $LIBPATH = ldirs | $LIBPATH

    $config_dirs[target] = [idir, ldir]
  end

  # Returns compile/link information about an installed library in a tuple of <code>[cflags,
  # ldflags, libs]</code>, by using the command found first in the following commands:
  #
  # 1. If <code>--with-{pkg}-config={command}</code> is given via
  #    command line option: <code>{command} {options}</code>
  #
  # 2. <code>{pkg}-config {options}</code>
  #
  # 3. <code>pkg-config {options} {pkg}</code>
  #
  # Where +options+ is the option name without dashes, for instance <code>"cflags"</code> for the
  # <code>--cflags</code> flag.
  #
  # The values obtained are appended to <code>$INCFLAGS</code>, <code>$CFLAGS</code>,
  # <code>$LDFLAGS</code> and <code>$libs</code>.
  #
  # If one or more <code>options</code> argument is given, the config command is
  # invoked with the options and a stripped output string is returned without
  # modifying any of the global values mentioned above.
  def pkg_config(pkg, *options)
    _, ldir = dir_config(pkg)
    if ldir
      pkg_config_path = "#{ldir}/pkgconfig"
      if File.directory?(pkg_config_path)
        Logging.message("PKG_CONFIG_PATH = %s\n", pkg_config_path)
        envs = ["PKG_CONFIG_PATH"=>[pkg_config_path, ENV["PKG_CONFIG_PATH"]].compact.join(File::PATH_SEPARATOR)]
      end
    end
    if pkgconfig = with_config("#{pkg}-config") and find_executable0(pkgconfig)
      # if and only if package specific config command is given
    elsif ($PKGCONFIG ||=
           (pkgconfig = with_config("pkg-config") {config_string("PKG_CONFIG") || "pkg-config"}) &&
           find_executable0(pkgconfig) && pkgconfig) and
        xsystem([*envs, $PKGCONFIG, "--exists", pkg])
      # default to pkg-config command
      pkgconfig = $PKGCONFIG
      args = [pkg]
    elsif find_executable0(pkgconfig = "#{pkg}-config")
      # default to package specific config command, as a last resort.
    else
      pkgconfig = nil
    end
    if pkgconfig
      get = proc {|opts|
        opts = Array(opts).map { |o| "--#{o}" }
        opts = xpopen([*envs, pkgconfig, *opts, *args], err:[:child, :out], &:read)
        Logging.open {puts opts.each_line.map{|s|"=> #{s.inspect}"}}
        opts.strip if $?.success?
      }
    end
    orig_ldflags = $LDFLAGS
    if get and !options.empty?
      get[options]
    elsif get and try_ldflags(ldflags = get['libs'])
      if incflags = get['cflags-only-I']
        $INCFLAGS << " " << incflags
        cflags = get['cflags-only-other']
      else
        cflags = get['cflags']
      end
      libs = get['libs-only-l']
      if cflags
        $CFLAGS += " " << cflags
        $CXXFLAGS += " " << cflags
      end
      if libs
        ldflags = (Shellwords.shellwords(ldflags) - Shellwords.shellwords(libs)).quote.join(" ")
      else
        libs, ldflags = Shellwords.shellwords(ldflags).partition {|s| s =~ /-l([^ ]+)/ }.map {|l|l.quote.join(" ")}
      end
      $libs += " " << libs

      $LDFLAGS = [orig_ldflags, ldflags].join(' ')
      Logging::message "package configuration for %s\n", pkg
      Logging::message "incflags: %s\ncflags: %s\nldflags: %s\nlibs: %s\n\n",
                       incflags, cflags, ldflags, libs
      [[incflags, cflags].join(' '), ldflags, libs]
    else
      Logging::message "package configuration for %s is not found\n", pkg
      nil
    end
  end

  # :stopdoc:

  def with_destdir(dir)
    dir = dir.sub($dest_prefix_pattern, '')
    /\A\$[\(\{]/ =~ dir ? dir : "$(DESTDIR)"+dir
  end

  # Converts forward slashes to backslashes. Aimed at MS Windows.
  #
  # Internal use only.
  #
  def winsep(s)
    s.tr('/', '\\')
  end

  # Converts native path to format acceptable in Makefile
  #
  # Internal use only.
  #
  if !CROSS_COMPILING
    case CONFIG['build_os']
    when 'mingw32'
      def mkintpath(path)
        # mingw uses make from msys and it needs special care
        # converts from C:\some\path to /C/some/path
        path = path.dup
        path.tr!('\\', '/')
        path.sub!(/\A([A-Za-z]):(?=\/)/, '/\1')
        path
      end
    when 'cygwin', 'msys'
      if CONFIG['target_os'] != 'cygwin'
        def mkintpath(path)
          IO.popen(["cygpath", "-u", path], &:read).chomp
        end
      end
    end
  end
  unless method_defined?(:mkintpath)
    def mkintpath(path)
      path
    end
  end

  def configuration(srcdir)
    mk = []
    CONFIG['MKMF_VERBOSE'] ||= "0"
    vpath = $VPATH.dup
    CONFIG["hdrdir"] ||= $hdrdir
    mk << %{
SHELL = /bin/sh

# V=0 quiet, V=1 verbose.  other values don't work.
V = 1
V0 = $(V:0=)
Q1 = $(V:1=)
Q = $(Q1:0=@)
ECHO1 = $(V:1=@ #{CONFIG['NULLCMD']})
ECHO = $(ECHO1:0=@ echo)
NULLCMD = #{CONFIG['NULLCMD']}

#### Start of system configuration section. ####
#{"top_srcdir = " + $top_srcdir.sub(%r"\A#{Regexp.quote($topdir)}/", "$(topdir)/") if $extmk}
srcdir = #{srcdir.gsub(/\$\((srcdir)\)|\$\{(srcdir)\}/) {mkintpath(CONFIG[$1||$2]).unspace}}
topdir = #{mkintpath(topdir = $extmk ? CONFIG["topdir"] : $topdir).unspace}
hdrdir = #{(hdrdir = CONFIG["hdrdir"]) == topdir ? "$(topdir)" : mkintpath(hdrdir).unspace}
arch_hdrdir = #{mkintpath($arch_hdrdir).unspace}
PATH_SEPARATOR = #{CONFIG['PATH_SEPARATOR']}
VPATH = #{vpath.join(CONFIG['PATH_SEPARATOR'])}
}
    if $extmk
      mk << "RUBYLIB =\n""RUBYOPT = -\n"
    end
    prefix = mkintpath(CONFIG["prefix"])
    if destdir = prefix[$dest_prefix_pattern, 1]
      mk << "\nDESTDIR = #{destdir}\n"
      prefix = prefix[destdir.size..-1]
    end
    mk << "prefix = #{with_destdir(prefix).unspace}\n"
    CONFIG.each do |key, var|
      mk << "#{key} = #{with_destdir(mkintpath(var)).unspace}\n" if /.prefix$/ =~ key
    end
    CONFIG.each do |key, var|
      next if /^abs_/ =~ key
      next if /^(?:src|top(?:_src)?|build|hdr)dir$/ =~ key
      next unless /dir$/ =~ key
      mk << "#{key} = #{with_destdir(var)}\n"
    end
    if !$extmk and !$configure_args.has_key?('--ruby') and
        sep = config_string('BUILD_FILE_SEPARATOR')
      sep = ":/=#{sep}"
    else
      sep = ""
    end
    possible_command = (proc {|s| s if /top_srcdir|tooldir/ !~ s} unless $extmk)
    extconf_h = $extconf_h ? "-DRUBY_EXTCONF_H=\\\"$(RUBY_EXTCONF_H)\\\" " : $defs.join(" ") << " "
    headers = %w[
      $(hdrdir)/ruby.h
      $(hdrdir)/ruby/backward.h
      $(hdrdir)/ruby/ruby.h
      $(hdrdir)/ruby/defines.h
      $(hdrdir)/ruby/missing.h
      $(hdrdir)/ruby/intern.h
      $(hdrdir)/ruby/st.h
      $(hdrdir)/ruby/subst.h
    ]
    headers += $headers
    if RULE_SUBST
      headers.each {|h| h.sub!(/.*/, &RULE_SUBST.method(:%))}
    end
    headers << $config_h
    headers << '$(RUBY_EXTCONF_H)' if $extconf_h
    mk << %{

CC_WRAPPER = #{CONFIG['CC_WRAPPER']}
CC = #{CONFIG['CC']}
CXX = #{CONFIG['CXX']}
LIBRUBY = #{CONFIG['LIBRUBY']}
LIBRUBY_A = #{CONFIG['LIBRUBY_A']}
LIBRUBYARG_SHARED = #$LIBRUBYARG_SHARED
LIBRUBYARG_STATIC = #$LIBRUBYARG_STATIC
empty =
OUTFLAG = #{OUTFLAG}$(empty)
COUTFLAG = #{COUTFLAG}$(empty)
CSRCFLAG = #{CSRCFLAG}$(empty)

RUBY_EXTCONF_H = #{$extconf_h}
cflags   = #{CONFIG['cflags']}
cxxflags = #{CONFIG['cxxflags']}
optflags = #{CONFIG['optflags']}
debugflags = #{CONFIG['debugflags']}
warnflags = #{$warnflags}
cppflags = #{CONFIG['cppflags']}
CCDLFLAGS = #{$static ? '' : CONFIG['CCDLFLAGS']}
CFLAGS   = $(CCDLFLAGS) #$CFLAGS $(ARCH_FLAG)
INCFLAGS = -I. #$INCFLAGS
DEFS     = #{CONFIG['DEFS']}
CPPFLAGS = #{extconf_h}#{$CPPFLAGS}
CXXFLAGS = $(CCDLFLAGS) #$CXXFLAGS $(ARCH_FLAG)
ldflags  = #{$LDFLAGS}
dldflags = #{$DLDFLAGS} #{CONFIG['EXTDLDFLAGS']}
ARCH_FLAG = #{$ARCH_FLAG}
DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG)
LDSHARED = #{CONFIG['LDSHARED']}
LDSHAREDXX = #{config_string('LDSHAREDXX') || '$(LDSHARED)'}
AR = #{CONFIG['AR']}
EXEEXT = #{CONFIG['EXEEXT']}

}
    CONFIG.each do |key, val|
      mk << "#{key} = #{val}\n" if /^RUBY.*NAME/ =~ key
    end
    mk << %{
arch = #{CONFIG['arch']}
sitearch = #{CONFIG['sitearch']}
ruby_version = #{RbConfig::CONFIG['ruby_version']}
ruby = #{$ruby.sub(%r[\A#{Regexp.quote(RbConfig::CONFIG['bindir'])}(?=/|\z)]) {'$(bindir)'}}
RUBY = $(ruby#{sep})
BUILTRUBY = #{if defined?($builtruby) && $builtruby
    $builtruby
  else
    File.join('$(bindir)', CONFIG["RUBY_INSTALL_NAME"] + CONFIG['EXEEXT'])
  end}
ruby_headers = #{headers.join(' ')}

RM = #{config_string('RM', &possible_command) || '$(RUBY) -run -e rm -- -f'}
RM_RF = #{config_string('RMALL', &possible_command) || '$(RUBY) -run -e rm -- -rf'}
RMDIRS = #{config_string('RMDIRS', &possible_command) || '$(RUBY) -run -e rmdir -- -p'}
MAKEDIRS = #{config_string('MAKEDIRS', &possible_command) || '@$(RUBY) -run -e mkdir -- -p'}
INSTALL = #{config_string('INSTALL', &possible_command) || '@$(RUBY) -run -e install -- -vp'}
INSTALL_PROG = #{config_string('INSTALL_PROG') || '$(INSTALL) -m 0755'}
INSTALL_DATA = #{config_string('INSTALL_DATA') || '$(INSTALL) -m 0644'}
COPY = #{config_string('CP', &possible_command) || '@$(RUBY) -run -e cp -- -v'}
TOUCH = exit >

#### End of system configuration section. ####

preload = #{defined?($preload) && $preload ? $preload.join(' ') : ''}
}
    mk
  end

  def timestamp_file(name, target_prefix = nil)
    pat = {}
    name = '$(RUBYARCHDIR)' if name == '$(TARGET_SO_DIR)'
    install_dirs.each do |n, d|
      pat[n] = $` if /\$\(target_prefix\)\z/ =~ d
    end
    name = name.gsub(/\$\((#{pat.keys.join("|")})\)/) {pat[$1]+target_prefix}
    name.sub!(/(\$\((?:site)?arch\))\/*/, '')
    arch = $1 || ''
    name.chomp!('/')
    name = name.gsub(/(\$[({]|[})])|(\/+)|[^-.\w]+/) {$1 ? "" : $2 ? ".-." : "_"}
    File.join("$(TIMESTAMP_DIR)", arch, "#{name.sub(/\A(?=.)/, '.')}.time")
  end
  # :startdoc:

  # Creates a stub Makefile.
  #
  def dummy_makefile(srcdir)
    configuration(srcdir) << <<RULES << CLEANINGS
CLEANFILES = #{$cleanfiles.join(' ')}
DISTCLEANFILES = #{$distcleanfiles.join(' ')}

all install static install-so install-rb: Makefile
	@$(NULLCMD)
.PHONY: all install static install-so install-rb
.PHONY: clean clean-so clean-static clean-rb

RULES
  end

  def each_compile_rules # :nodoc:
    vpath_splat = /\$\(\*VPATH\*\)/
    COMPILE_RULES.each do |rule|
      if vpath_splat =~ rule
        $VPATH.each do |path|
          yield rule.sub(vpath_splat) {path}
        end
      else
        yield rule
      end
    end
  end

  # Processes the data contents of the "depend" file.  Each line of this file
  # is expected to be a file name.
  #
  # Returns the output of findings, in Makefile format.
  #
  def depend_rules(depend)
    suffixes = []
    depout = []
    cont = implicit = nil
    impconv = proc do
      each_compile_rules {|rule| depout << (rule % implicit[0]) << implicit[1]}
      implicit = nil
    end
    ruleconv = proc do |line|
      if implicit
        if /\A\t/ =~ line
          implicit[1] << line
          next
        else
          impconv[]
        end
      end
      if m = /\A\.(\w+)\.(\w+)(?:\s*:)/.match(line)
        suffixes << m[1] << m[2]
        implicit = [[m[1], m[2]], [m.post_match]]
        next
      elsif RULE_SUBST and /\A(?!\s*\w+\s*=)[$\w][^#]*:/ =~ line
        line.sub!(/\s*\#.*$/, '')
        comment = $&
        line.gsub!(%r"(\s)(?!\.)([^$(){}+=:\s\\,]+)(?=\s|\z)") {$1 + RULE_SUBST % $2}
        line = line.chomp + comment + "\n" if comment
      end
      depout << line
    end
    depend.each_line do |line|
      line.gsub!(/\.o\b/, ".#{$OBJEXT}")
      line.gsub!(/\{\$\(VPATH\)\}/, "") unless $nmake
      line.gsub!(/\$\((?:hdr|top)dir\)\/config.h/, $config_h)
      if $nmake && /\A\s*\$\(RM|COPY\)/ =~ line
        line.gsub!(%r"[-\w\./]{2,}"){$&.tr("/", "\\")}
        line.gsub!(/(\$\((?!RM|COPY)[^:)]+)(?=\))/, '\1:/=\\')
      end
      if /(?:^|[^\\])(?:\\\\)*\\$/ =~ line
        (cont ||= []) << line
        next
      elsif cont
        line = (cont << line).join
        cont = nil
      end
      ruleconv.call(line)
    end
    if cont
      ruleconv.call(cont.join)
    elsif implicit
      impconv.call
    end
    unless suffixes.empty?
      depout.unshift(".SUFFIXES: ." + suffixes.uniq.join(" .") + "\n\n")
    end
    if $extconf_h
      depout.unshift("$(OBJS): $(RUBY_EXTCONF_H)\n\n")
      depout.unshift("$(OBJS): $(hdrdir)/ruby/win32.h\n\n") if $mswin or $mingw
    end
    depout.flatten!
    depout
  end

  # Generates the Makefile for your extension, passing along any options and
  # preprocessor constants that you may have generated through other methods.
  #
  # The +target+ name should correspond the name of the global function name
  # defined within your C extension, minus the +Init_+.  For example, if your
  # C extension is defined as +Init_foo+, then your target would simply be
  # "foo".
  #
  # If any "/" characters are present in the target name, only the last name
  # is interpreted as the target name, and the rest are considered toplevel
  # directory names, and the generated Makefile will be altered accordingly to
  # follow that directory structure.
  #
  # For example, if you pass "test/foo" as a target name, your extension will
  # be installed under the "test" directory.  This means that in order to
  # load the file within a Ruby program later, that directory structure will
  # have to be followed, e.g. <code>require 'test/foo'</code>.
  #
  # The +srcprefix+ should be used when your source files are not in the same
  # directory as your build script. This will not only eliminate the need for
  # you to manually copy the source files into the same directory as your
  # build script, but it also sets the proper +target_prefix+ in the generated
  # Makefile.
  #
  # Setting the +target_prefix+ will, in turn, install the generated binary in
  # a directory under your <code>RbConfig::CONFIG['sitearchdir']</code> that
  # mimics your local filesystem when you run <code>make install</code>.
  #
  # For example, given the following file tree:
  #
  #   ext/
  #     extconf.rb
  #     test/
  #       foo.c
  #
  # And given the following code:
  #
  #   create_makefile('test/foo', 'test')
  #
  # That will set the +target_prefix+ in the generated Makefile to "test".
  # That, in turn, will create the following file tree when installed via the
  # <code>make install</code> command:
  #
  #   /path/to/ruby/sitearchdir/test/foo.so
  #
  # It is recommended that you use this approach to generate your makefiles,
  # instead of copying files around manually, because some third party
  # libraries may depend on the +target_prefix+ being set properly.
  #
  # The +srcprefix+ argument can be used to override the default source
  # directory, i.e. the current directory.  It is included as part of the
  # +VPATH+ and added to the list of +INCFLAGS+.
  #
  def create_makefile(target, srcprefix = nil)
    $target = target
    libpath = $DEFLIBPATH|$LIBPATH
    message "creating Makefile\n"
    MakeMakefile.rm_f "#{CONFTEST}*"
    if CONFIG["DLEXT"] == $OBJEXT
      for lib in libs = $libs.split(' ')
        lib.sub!(/-l(.*)/, %%"lib\\1.#{$LIBEXT}"%)
      end
      $defs.push(format("-DEXTLIB='%s'", libs.join(",")))
    end

    if target.include?('/')
      target_prefix, target = File.split(target)
      target_prefix[0,0] = '/'
    else
      target_prefix = ""
    end

    srcprefix ||= "$(srcdir)/#{srcprefix}".chomp('/')
    RbConfig.expand(srcdir = srcprefix.dup)

    ext = ".#{$OBJEXT}"
    orig_srcs = Dir[File.join(srcdir, "*.{#{SRC_EXT.join(%q{,})}}")].sort
    if not $objs
      srcs = $srcs || orig_srcs
      $objs = []
      objs = srcs.inject(Hash.new {[]}) {|h, f|
        h.key?(o = File.basename(f, ".*") << ext) or $objs << o
        h[o] <<= f
        h
      }
      unless objs.delete_if {|b, f| f.size == 1}.empty?
        dups = objs.sort.map {|b, f|
          "#{b[/.*\./]}{#{f.collect {|n| n[/([^.]+)\z/]}.join(',')}}"
        }
        abort "source files duplication - #{dups.join(", ")}"
      end
    else
      $objs.collect! {|o| File.basename(o, ".*") << ext} unless $OBJEXT == "o"
      srcs = $srcs || $objs.collect {|o| o.chomp(ext) << ".c"}
    end
    $srcs = srcs

    hdrs = Dir[File.join(srcdir, "*.{#{HDR_EXT.join(%q{,})}}")]

    target = nil if $objs.empty?

    if target and EXPORT_PREFIX
      if File.exist?(File.join(srcdir, target + '.def'))
        deffile = "$(srcdir)/$(TARGET).def"
        unless EXPORT_PREFIX.empty?
          makedef = %{$(RUBY) -pe "$$_.sub!(/^(?=\\w)/,'#{EXPORT_PREFIX}') unless 1../^EXPORTS$/i" #{deffile}}
        end
      else
        makedef = %{(echo EXPORTS && echo $(TARGET_ENTRY))}
      end
      if makedef
        $cleanfiles << '$(DEFFILE)'
        origdef = deffile
        deffile = "$(TARGET)-$(arch).def"
      end
    end
    origdef ||= ''

    if $extout and $INSTALLFILES
      $cleanfiles.concat($INSTALLFILES.collect {|files, dir|File.join(dir, files.delete_prefix('./'))})
      $distcleandirs.concat($INSTALLFILES.collect {|files, dir| dir})
    end

    if $extmk and $static
      $defs << "-DRUBY_EXPORT=1"
    end

    if $extmk and not $extconf_h
      create_header
    end

    libpath = libpathflag(libpath)

    dllib = target ? "$(TARGET).#{CONFIG['DLEXT']}" : ""
    staticlib = target ? "$(TARGET).#$LIBEXT" : ""
    conf = configuration(srcprefix)
    conf << "\
libpath = #{($DEFLIBPATH|$LIBPATH).join(" ")}
LIBPATH = #{libpath}
DEFFILE = #{deffile}

CLEANFILES = #{$cleanfiles.join(' ')}
DISTCLEANFILES = #{$distcleanfiles.join(' ')}
DISTCLEANDIRS = #{$distcleandirs.join(' ')}

extout = #{$extout && $extout.quote}
extout_prefix = #{$extout_prefix}
target_prefix = #{target_prefix}
LOCAL_LIBS = #{$LOCAL_LIBS}
LIBS = #{$LIBRUBYARG} #{$libs} #{$LIBS}
ORIG_SRCS = #{orig_srcs.collect(&File.method(:basename)).join(' ')}
SRCS = $(ORIG_SRCS) #{(srcs - orig_srcs).collect(&File.method(:basename)).join(' ')}
OBJS = #{$objs.join(" ")}
HDRS = #{hdrs.map{|h| '$(srcdir)/' + File.basename(h)}.join(' ')}
LOCAL_HDRS = #{$headers.join(' ')}
TARGET = #{target}
TARGET_NAME = #{target && target[/\A\w+/]}
TARGET_ENTRY = #{EXPORT_PREFIX || ''}Init_$(TARGET_NAME)
DLLIB = #{dllib}
EXTSTATIC = #{$static || ""}
STATIC_LIB = #{staticlib unless $static.nil?}
#{!$extout && defined?($installed_list) ? "INSTALLED_LIST = #{$installed_list}\n" : ""}
TIMESTAMP_DIR = #{$extout && $extmk ? '$(extout)/.timestamp' : '.'}
" #"
    # TODO: fixme
    install_dirs.each {|d| conf << ("%-14s= %s\n" % d) if /^[[:upper:]]/ =~ d[0]}
    sodir = $extout ? '$(TARGET_SO_DIR)' : '$(RUBYARCHDIR)'
    n = '$(TARGET_SO_DIR)$(TARGET)'
    conf << "\
TARGET_SO_DIR =#{$extout ? " $(RUBYARCHDIR)/" : ''}
TARGET_SO     = $(TARGET_SO_DIR)$(DLLIB)
CLEANLIBS     = #{'$(TARGET_SO) ' if target}#{config_string('cleanlibs') {|t| t.gsub(/\$\*/) {n}}}
CLEANOBJS     = *.#{$OBJEXT} #{config_string('cleanobjs') {|t| t.gsub(/\$\*/, "$(TARGET)#{deffile ? '-$(arch)': ''}")} if target} *.bak
" #"

    conf = yield(conf) if block_given?
    mfile = File.open("Makefile", "wb")
    mfile.puts(conf)
    mfile.print "
all:    #{$extout ? "install" : target ? "$(DLLIB)" : "Makefile"}
static: #{$extmk && !$static ? "all" : "$(STATIC_LIB)#{$extout ? " install-rb" : ""}"}
.PHONY: all install static install-so install-rb
.PHONY: clean clean-so clean-static clean-rb
" #"
    mfile.print CLEANINGS
    fsep = config_string('BUILD_FILE_SEPARATOR') {|s| s unless s == "/"}
    if fsep
      sep = ":/=#{fsep}"
      fseprepl = proc {|s|
        s = s.gsub("/", fsep)
        s = s.gsub(/(\$\(\w+)(\))/) {$1+sep+$2}
        s.gsub(/(\$\{\w+)(\})/) {$1+sep+$2}
      }
      rsep = ":#{fsep}=/"
    else
      fseprepl = proc {|s| s}
      sep = ""
      rsep = ""
    end
    dirs = []
    mfile.print "install: install-so install-rb\n\n"
    dir = sodir.dup
    mfile.print("install-so: ")
    if target
      f = "$(DLLIB)"
      dest = "$(TARGET_SO)"
      stamp = timestamp_file(dir, target_prefix)
      if $extout
        mfile.puts dest
        mfile.print "clean-so::\n"
        mfile.print "\t-$(Q)$(RM) #{fseprepl[dest]} #{fseprepl[stamp]}\n"
        mfile.print "\t-$(Q)$(RMDIRS) #{fseprepl[dir]}#{$ignore_error}\n"
      else
        mfile.print "#{f} #{stamp}\n"
        mfile.print "\t$(INSTALL_PROG) #{fseprepl[f]} #{dir}\n"
        if defined?($installed_list)
          mfile.print "\t@echo #{dir}/#{File.basename(f)}>>$(INSTALLED_LIST)\n"
        end
      end
      mfile.print "clean-static::\n"
      mfile.print "\t-$(Q)$(RM) $(STATIC_LIB)\n"
    else
      mfile.puts "Makefile"
    end
    mfile.print("install-rb: pre-install-rb do-install-rb install-rb-default\n")
    mfile.print("install-rb-default: pre-install-rb-default do-install-rb-default\n")
    mfile.print("pre-install-rb: Makefile\n")
    mfile.print("pre-install-rb-default: Makefile\n")
    mfile.print("do-install-rb:\n")
    mfile.print("do-install-rb-default:\n")
    for sfx, i in [["-default", [["lib/**/*.rb", "$(RUBYLIBDIR)", "lib"]]], ["", $INSTALLFILES]]
      files = install_files(mfile, i, nil, srcprefix) or next
      for dir, *files in files
        unless dirs.include?(dir)
          dirs << dir
          mfile.print "pre-install-rb#{sfx}: #{timestamp_file(dir, target_prefix)}\n"
        end
        for f in files
          dest = "#{dir}/#{File.basename(f)}"
          mfile.print("do-install-rb#{sfx}: #{dest}\n")
          mfile.print("#{dest}: #{f} #{timestamp_file(dir, target_prefix)}\n")
          mfile.print("\t$(Q) $(#{$extout ? 'COPY' : 'INSTALL_DATA'}) #{f} $(@D)\n")
          if defined?($installed_list) and !$extout
            mfile.print("\t@echo #{dest}>>$(INSTALLED_LIST)\n")
          end
          if $extout
            mfile.print("clean-rb#{sfx}::\n")
            mfile.print("\t-$(Q)$(RM) #{fseprepl[dest]}\n")
          end
        end
      end
      mfile.print "pre-install-rb#{sfx}:\n"
      if files.empty?
        mfile.print("\t@$(NULLCMD)\n")
      else
        q = "$(MAKE) -q do-install-rb#{sfx}"
        if $nmake
          mfile.print "!if \"$(Q)\" == \"@\"\n\t@#{q} || \\\n!endif\n\t"
        else
          mfile.print "\t$(Q1:0=@#{q} || )"
        end
        mfile.print "$(ECHO1:0=echo) installing#{sfx.sub(/^-/, " ")} #{target} libraries\n"
      end
      if $extout
        dirs.uniq!
        unless dirs.empty?
          mfile.print("clean-rb#{sfx}::\n")
          for dir in dirs.sort_by {|d| -d.count('/')}
            stamp = timestamp_file(dir, target_prefix)
            mfile.print("\t-$(Q)$(RM) #{fseprepl[stamp]}\n")
            mfile.print("\t-$(Q)$(RMDIRS) #{fseprepl[dir]}#{$ignore_error}\n")
          end
        end
      end
    end
    dirs.unshift(sodir) if target and !dirs.include?(sodir)
    dirs.each do |d|
      t = timestamp_file(d, target_prefix)
      mfile.print "#{t}:\n\t$(Q) $(MAKEDIRS) $(@D) #{d}\n\t$(Q) $(TOUCH) $@\n"
    end

    mfile.print <<-SITEINSTALL

site-install: site-install-so site-install-rb
site-install-so: install-so
site-install-rb: install-rb

    SITEINSTALL

    return unless target

    mfile.print ".SUFFIXES: .#{(SRC_EXT + [$OBJEXT, $ASMEXT]).compact.join(' .')}\n"
    mfile.print "\n"

    compile_command = "\n\t$(ECHO) compiling $(<#{rsep})\n\t$(Q) %s\n\n"
    command = compile_command % COMPILE_CXX
    asm_command = compile_command.sub(/compiling/, 'translating') % ASSEMBLE_CXX
    CXX_EXT.each do |e|
      each_compile_rules do |rule|
        mfile.printf(rule, e, $OBJEXT)
        mfile.print(command)
        mfile.printf(rule, e, $ASMEXT)
        mfile.print(asm_command)
      end
    end
    command = compile_command % COMPILE_C
    asm_command = compile_command.sub(/compiling/, 'translating') % ASSEMBLE_C
    C_EXT.each do |e|
      each_compile_rules do |rule|
        mfile.printf(rule, e, $OBJEXT)
        mfile.print(command)
        mfile.printf(rule, e, $ASMEXT)
        mfile.print(asm_command)
      end
    end

    mfile.print "$(TARGET_SO): "
    mfile.print "$(DEFFILE) " if makedef
    mfile.print "$(OBJS) Makefile"
    mfile.print " #{timestamp_file(sodir, target_prefix)}" if $extout
    mfile.print "\n"
    mfile.print "\t$(ECHO) linking shared-object #{target_prefix.sub(/\A\/(.*)/, '\1/')}$(DLLIB)\n"
    mfile.print "\t-$(Q)$(RM) $(@#{sep})\n"
    link_so = LINK_SO.gsub(/^/, "\t$(Q) ")
    if srcs.any?(&%r"\.(?:#{CXX_EXT.join('|')})\z".method(:===))
      link_so = link_so.sub(/\bLDSHARED\b/, '\&XX')
    end
    mfile.print link_so, "\n\n"
    unless $static.nil?
      mfile.print "$(STATIC_LIB): $(OBJS)\n\t-$(Q)$(RM) $(@#{sep})\n\t"
      mfile.print "$(ECHO) linking static-library $(@#{rsep})\n\t$(Q) "
      mfile.print "$(AR) #{config_string('ARFLAGS') || 'cru '}$@ $(OBJS)"
      config_string('RANLIB') do |ranlib|
        mfile.print "\n\t-$(Q)#{ranlib} $(@)#{$ignore_error}"
      end
    end
    mfile.print "\n\n"
    if makedef
      mfile.print "$(DEFFILE): #{origdef}\n"
      mfile.print "\t$(ECHO) generating $(@#{rsep})\n"
      mfile.print "\t$(Q) #{makedef} > $@\n\n"
    end

    depend = File.join(srcdir, "depend")
    if File.exist?(depend)
      mfile.print("###\n", *depend_rules(File.read(depend)))
    else
      mfile.print "$(OBJS): $(HDRS) $(ruby_headers)\n"
    end

    $makefile_created = true
  ensure
    mfile.close if mfile
  end

  # :stopdoc:

  def init_mkmf(config = CONFIG, rbconfig = RbConfig::CONFIG)
    $makefile_created = false
    $arg_config = []
    $enable_shared = config['ENABLE_SHARED'] == 'yes'
    $defs = []
    $extconf_h = nil
    $config_dirs = {}

    if $warnflags = CONFIG['warnflags'] and CONFIG['GCC'] == 'yes'
      # turn warnings into errors only for bundled extensions.
      config['warnflags'] = $warnflags.gsub(/(?:\A|\s)-W\Kerror[-=](?!implicit-function-declaration)/, '')
      if /icc\z/ =~ config['CC']
        config['warnflags'].gsub!(/(\A|\s)-W(?:division-by-zero|deprecated-declarations)/, '\1')
      end
      RbConfig.expand(rbconfig['warnflags'] = config['warnflags'].dup)
      config.each do |key, val|
        RbConfig.expand(rbconfig[key] = val.dup) if /warnflags/ =~ val
      end
      $warnflags = config['warnflags'] unless $extmk
    end
    if (w = rbconfig['CC_WRAPPER']) and !w.empty? and !File.executable?(w)
      rbconfig['CC_WRAPPER'] = config['CC_WRAPPER'] = ''
    end
    $CFLAGS = with_config("cflags", arg_config("CFLAGS", config["CFLAGS"])).dup
    $CXXFLAGS = (with_config("cxxflags", arg_config("CXXFLAGS", config["CXXFLAGS"]))||'').dup
    $ARCH_FLAG = with_config("arch_flag", arg_config("ARCH_FLAG", config["ARCH_FLAG"])).dup
    $CPPFLAGS = with_config("cppflags", arg_config("CPPFLAGS", config["CPPFLAGS"])).dup
    $LDFLAGS = with_config("ldflags", arg_config("LDFLAGS", config["LDFLAGS"])).dup
    $INCFLAGS = "-I$(arch_hdrdir)"
    $INCFLAGS << " -I$(hdrdir)/ruby/backward" unless $extmk
    $INCFLAGS << " -I$(hdrdir) -I$(srcdir)"
    $DLDFLAGS = with_config("dldflags", arg_config("DLDFLAGS", config["DLDFLAGS"])).dup
    config_string("ADDITIONAL_DLDFLAGS") {|flags| $DLDFLAGS << " " << flags} unless $extmk
    $LIBEXT = config['LIBEXT'].dup
    $OBJEXT = config["OBJEXT"].dup
    $EXEEXT = config["EXEEXT"].dup
    $ASMEXT = config_string('ASMEXT', &:dup) || 'S'
    $LIBS = "#{config['LIBS']} #{config['DLDLIBS']}"
    $LIBRUBYARG = ""
    $LIBRUBYARG_STATIC = config['LIBRUBYARG_STATIC']
    $LIBRUBYARG_SHARED = config['LIBRUBYARG_SHARED']
    $DEFLIBPATH = [$extmk ? "$(topdir)" : "$(#{config["libdirname"] || "libdir"})"]
    $DEFLIBPATH.unshift(".")
    $LIBPATH = []
    $INSTALLFILES = []
    $NONINSTALLFILES = [/~\z/, /\A#.*#\z/, /\A\.#/, /\.bak\z/i, /\.orig\z/, /\.rej\z/, /\.l[ao]\z/, /\.o\z/]
    $VPATH = %w[$(srcdir) $(arch_hdrdir)/ruby $(hdrdir)/ruby]

    $objs = nil
    $srcs = nil
    $headers = []
    $libs = ""
    if $enable_shared or RbConfig.expand(config["LIBRUBY"].dup) != RbConfig.expand(config["LIBRUBY_A"].dup)
      $LIBRUBYARG = config['LIBRUBYARG']
    end

    $LOCAL_LIBS = ""

    $cleanfiles = config_string('CLEANFILES') {|s| Shellwords.shellwords(s)} || []
    $cleanfiles << "mkmf.log"
    $distcleanfiles = config_string('DISTCLEANFILES') {|s| Shellwords.shellwords(s)} || []
    $distcleandirs = config_string('DISTCLEANDIRS') {|s| Shellwords.shellwords(s)} || []

    $extout ||= nil
    $extout_prefix ||= nil

    $arg_config.clear
    $config_dirs.clear
    dir_config("opt")
  end

  FailedMessage = <<MESSAGE
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
MESSAGE

  # Returns whether or not the Makefile was successfully generated. If not,
  # the script will abort with an error message.
  #
  # Internal use only.
  #
  def mkmf_failed(path)
    unless $makefile_created or File.exist?("Makefile")
      opts = $arg_config.collect {|t, n| "\t#{t}#{n ? "=#{n}" : ""}\n"}
      abort "*** #{path} failed ***\n" + FailedMessage + opts.join
    end
  end

  private

  def _libdir_basename
    @libdir_basename ||= config_string("libdir") {|name| name[/\A\$\(exec_prefix\)\/(.*)/, 1]} || "lib"
  end

  def MAIN_DOES_NOTHING(*refs)
    src = MAIN_DOES_NOTHING
    unless refs.empty?
      src = src.sub(/\{/) do
        $& +
          "\n  if (argc > 1000000) {\n" +
          refs.map {|n|"    int (* volatile #{n}p)(void)=(int (*)(void))&#{n};\n"}.join("") +
          refs.map {|n|"    printf(\"%d\", (*#{n}p)());\n"}.join("") +
          "  }\n"
      end
    end
    src
  end

  extend self
  init_mkmf

  $make = with_config("make-prog", ENV["MAKE"] || "make")
  make, = Shellwords.shellwords($make)
  $nmake = nil
  case
  when $mswin
    $nmake = ?m if /nmake/i =~ make
  end
  $ignore_error = $nmake ? '' : ' 2> /dev/null || true'

  RbConfig::CONFIG["srcdir"] = CONFIG["srcdir"] =
    $srcdir = arg_config("--srcdir", File.dirname($0))
  $configure_args["--topsrcdir"] ||= $srcdir
  if $curdir = arg_config("--curdir")
    RbConfig.expand(curdir = $curdir.dup)
  else
    curdir = $curdir = "."
  end
  unless File.expand_path(RbConfig::CONFIG["topdir"]) == File.expand_path(curdir)
    CONFIG["topdir"] = $curdir
    RbConfig::CONFIG["topdir"] = curdir
  end
  $configure_args["--topdir"] ||= $curdir
  $ruby = arg_config("--ruby", File.join(RbConfig::CONFIG["bindir"], CONFIG["ruby_install_name"]))

  RbConfig.expand(CONFIG["RUBY_SO_NAME"])

  # :startdoc:

  split = Shellwords.method(:shellwords).to_proc

  EXPORT_PREFIX = config_string('EXPORT_PREFIX') {|s| s.strip}

  hdr = ['#include "ruby.h"' "\n"]
  config_string('COMMON_MACROS') do |s|
    Shellwords.shellwords(s).each do |w|
      w, v = w.split(/=/, 2)
      hdr << "#ifndef #{w}"
      hdr << "#define #{[w, v].compact.join(" ")}"
      hdr << "#endif /* #{w} */"
    end
  end
  config_string('COMMON_HEADERS') do |s|
    Shellwords.shellwords(s).each {|w| hdr << "#include <#{w}>"}
  end

  ##
  # Common headers for Ruby C extensions

  COMMON_HEADERS = hdr.join("\n")

  ##
  # Common libraries for Ruby C extensions

  COMMON_LIBS = config_string('COMMON_LIBS', &split) || []

  ##
  # make compile rules

  COMPILE_RULES = config_string('COMPILE_RULES', &split) || %w[.%s.%s:]
  RULE_SUBST = config_string('RULE_SUBST')

  ##
  # Command which will compile C files in the generated Makefile

  COMPILE_C = config_string('COMPILE_C') || '$(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<'

  ##
  # Command which will compile C++ files in the generated Makefile

  COMPILE_CXX = config_string('COMPILE_CXX') || '$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$<'

  ##
  # Command which will translate C files to assembler sources in the generated Makefile

  ASSEMBLE_C = config_string('ASSEMBLE_C') || COMPILE_C.sub(/(?<=\s)-c(?=\s)/, '-S')

  ##
  # Command which will translate C++ files to assembler sources in the generated Makefile

  ASSEMBLE_CXX = config_string('ASSEMBLE_CXX') || COMPILE_CXX.sub(/(?<=\s)-c(?=\s)/, '-S')

  ##
  # Command which will compile a program in order to test linking a library

  TRY_LINK = config_string('TRY_LINK') ||
    "$(CC) #{OUTFLAG}#{CONFTEST}#{$EXEEXT} $(INCFLAGS) $(CPPFLAGS) " \
    "$(CFLAGS) $(src) $(LIBPATH) $(LDFLAGS) $(ARCH_FLAG) $(LOCAL_LIBS) $(LIBS)"

  ##
  # Command which will link a shared library

  LINK_SO = (config_string('LINK_SO') || "").sub(/^$/) do
    if CONFIG["DLEXT"] == $OBJEXT
      "ld $(DLDFLAGS) -r -o $@ $(OBJS)\n"
    else
      "$(LDSHARED) #{OUTFLAG}$@ $(OBJS) " \
      "$(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)"
    end
  end

  ##
  # Argument which will add a library path to the linker

  LIBPATHFLAG = config_string('LIBPATHFLAG') || ' -L%s'
  RPATHFLAG = config_string('RPATHFLAG') || ''

  ##
  # Argument which will add a library to the linker

  LIBARG = config_string('LIBARG') || '-l%s'

  ##
  # A C main function which does no work

  MAIN_DOES_NOTHING = config_string('MAIN_DOES_NOTHING') || "int main(int argc, char **argv)\n{\n  return !!argv[argc];\n}"
  UNIVERSAL_INTS = config_string('UNIVERSAL_INTS') {|s| Shellwords.shellwords(s)} ||
    %w[int short long long\ long]

  sep = config_string('BUILD_FILE_SEPARATOR') {|s| ":/=#{s}" if s != "/"} || ""

  ##
  # Makefile rules that will clean the extension build directory

  CLEANINGS = "
clean-static::
clean-rb-default::
clean-rb::
clean-so::
clean: clean-so clean-static clean-rb-default clean-rb
\t\t-$(Q)$(RM_RF) $(CLEANLIBS#{sep}) $(CLEANOBJS#{sep}) $(CLEANFILES#{sep}) .*.time

distclean-rb-default::
distclean-rb::
distclean-so::
distclean-static::
distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb
\t\t-$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) #{CONFTEST}.* mkmf.log#{' exts.mk' if $extmk}
\t\t-$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES#{sep})
\t\t-$(Q)$(RMDIRS) $(DISTCLEANDIRS#{sep})#{$ignore_error}

realclean: distclean
"

  @lang = Hash.new(self)

  def self.[](name)
    @lang.fetch(name)
  end

  def self.[]=(name, mod)
    @lang[name] = mod
  end

  self["C++"] = Module.new do
    include MakeMakefile
    extend self

    CONFTEST_CXX = "#{CONFTEST}.#{config_string('CXX_EXT') || CXX_EXT[0]}"

    TRY_LINK_CXX = config_string('TRY_LINK_CXX') ||
                   ((cmd = TRY_LINK.gsub(/\$\(C(?:C|(FLAGS))\)/, '$(CXX\1)')) != TRY_LINK && cmd) ||
                   "$(CXX) #{OUTFLAG}#{CONFTEST}#{$EXEEXT} $(INCFLAGS) $(CPPFLAGS) " \
                   "$(CXXFLAGS) $(src) $(LIBPATH) $(LDFLAGS) $(ARCH_FLAG) $(LOCAL_LIBS) $(LIBS)"

    def have_devel?
      unless defined? @have_devel
        @have_devel = true
        @have_devel = try_link(MAIN_DOES_NOTHING)
      end
      @have_devel
    end

    def conftest_source
      CONFTEST_CXX
    end

    def cc_command(opt="")
      conf = cc_config(opt)
      RbConfig::expand("$(CXX) #$INCFLAGS #$CPPFLAGS #$CXXFLAGS #$ARCH_FLAG #{opt} -c #{CONFTEST_CXX}",
                       conf)
    end

    def link_command(ldflags, *opts)
      conf = link_config(ldflags, *opts)
      RbConfig::expand(TRY_LINK_CXX.dup, conf)
    end
  end
end

# MakeMakefile::Global = #
m = Module.new {
  include(MakeMakefile)
  private(*MakeMakefile.public_instance_methods(false))
}
include m

if not $extmk and /\A(extconf|makefile).rb\z/ =~ File.basename($0)
  END {mkmf_failed($0)}
end
PK}$[�1��;;ruby/uri.rbnu�[���# frozen_string_literal: false
# URI is a module providing classes to handle Uniform Resource Identifiers
# (RFC2396[http://tools.ietf.org/html/rfc2396]).
#
# == Features
#
# * Uniform way of handling URIs.
# * Flexibility to introduce custom URI schemes.
# * Flexibility to have an alternate URI::Parser (or just different patterns
#   and regexp's).
#
# == Basic example
#
#   require 'uri'
#
#   uri = URI("http://foo.com/posts?id=30&limit=5#time=1305298413")
#   #=> #<URI::HTTP http://foo.com/posts?id=30&limit=5#time=1305298413>
#
#   uri.scheme    #=> "http"
#   uri.host      #=> "foo.com"
#   uri.path      #=> "/posts"
#   uri.query     #=> "id=30&limit=5"
#   uri.fragment  #=> "time=1305298413"
#
#   uri.to_s      #=> "http://foo.com/posts?id=30&limit=5#time=1305298413"
#
# == Adding custom URIs
#
#   module URI
#     class RSYNC < Generic
#       DEFAULT_PORT = 873
#     end
#     register_scheme 'RSYNC', RSYNC
#   end
#   #=> URI::RSYNC
#
#   URI.scheme_list
#   #=> {"FILE"=>URI::File, "FTP"=>URI::FTP, "HTTP"=>URI::HTTP,
#   #    "HTTPS"=>URI::HTTPS, "LDAP"=>URI::LDAP, "LDAPS"=>URI::LDAPS,
#   #    "MAILTO"=>URI::MailTo, "RSYNC"=>URI::RSYNC}
#
#   uri = URI("rsync://rsync.foo.com")
#   #=> #<URI::RSYNC rsync://rsync.foo.com>
#
# == RFC References
#
# A good place to view an RFC spec is http://www.ietf.org/rfc.html.
#
# Here is a list of all related RFC's:
# - RFC822[http://tools.ietf.org/html/rfc822]
# - RFC1738[http://tools.ietf.org/html/rfc1738]
# - RFC2255[http://tools.ietf.org/html/rfc2255]
# - RFC2368[http://tools.ietf.org/html/rfc2368]
# - RFC2373[http://tools.ietf.org/html/rfc2373]
# - RFC2396[http://tools.ietf.org/html/rfc2396]
# - RFC2732[http://tools.ietf.org/html/rfc2732]
# - RFC3986[http://tools.ietf.org/html/rfc3986]
#
# == Class tree
#
# - URI::Generic (in uri/generic.rb)
#   - URI::File - (in uri/file.rb)
#   - URI::FTP - (in uri/ftp.rb)
#   - URI::HTTP - (in uri/http.rb)
#     - URI::HTTPS - (in uri/https.rb)
#   - URI::LDAP - (in uri/ldap.rb)
#     - URI::LDAPS - (in uri/ldaps.rb)
#   - URI::MailTo - (in uri/mailto.rb)
# - URI::Parser - (in uri/common.rb)
# - URI::REGEXP - (in uri/common.rb)
#   - URI::REGEXP::PATTERN - (in uri/common.rb)
# - URI::Util - (in uri/common.rb)
# - URI::Error - (in uri/common.rb)
#   - URI::InvalidURIError - (in uri/common.rb)
#   - URI::InvalidComponentError - (in uri/common.rb)
#   - URI::BadURIError - (in uri/common.rb)
#
# == Copyright Info
#
# Author:: Akira Yamada <akira@ruby-lang.org>
# Documentation::
#   Akira Yamada <akira@ruby-lang.org>
#   Dmitry V. Sabanin <sdmitry@lrn.ru>
#   Vincent Batts <vbatts@hashbangbash.com>
# License::
#  Copyright (c) 2001 akira yamada <akira@ruby-lang.org>
#  You can redistribute it and/or modify it under the same term as Ruby.
#

module URI
end

require_relative 'uri/version'
require_relative 'uri/common'
require_relative 'uri/generic'
require_relative 'uri/file'
require_relative 'uri/ftp'
require_relative 'uri/http'
require_relative 'uri/https'
require_relative 'uri/ldap'
require_relative 'uri/ldaps'
require_relative 'uri/mailto'
require_relative 'uri/ws'
require_relative 'uri/wss'
PK}$[ť@@ruby/securerandom.rbnu�[���# -*- coding: us-ascii -*-
# frozen_string_literal: true

require 'random/formatter'

# == Secure random number generator interface.
#
# This library is an interface to secure random number generators which are
# suitable for generating session keys in HTTP cookies, etc.
#
# You can use this library in your application by requiring it:
#
#   require 'securerandom'
#
# It supports the following secure random number generators:
#
# * openssl
# * /dev/urandom
# * Win32
#
# SecureRandom is extended by the Random::Formatter module which
# defines the following methods:
#
# * alphanumeric
# * base64
# * choose
# * gen_random
# * hex
# * rand
# * random_bytes
# * random_number
# * urlsafe_base64
# * uuid
#
# These methods are usable as class methods of SecureRandom such as
# +SecureRandom.hex+.
#
# If a secure random number generator is not available,
# +NotImplementedError+ is raised.

module SecureRandom
  class << self
    def bytes(n)
      return gen_random(n)
    end

    private

    def gen_random_openssl(n)
      @pid = 0 unless defined?(@pid)
      pid = $$
      unless @pid == pid
        now = Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond)
        OpenSSL::Random.random_add([now, @pid, pid].join(""), 0.0)
        seed = Random.urandom(16)
        if (seed)
          OpenSSL::Random.random_add(seed, 16)
        end
        @pid = pid
      end
      return OpenSSL::Random.random_bytes(n)
    end

    def gen_random_urandom(n)
      ret = Random.urandom(n)
      unless ret
        raise NotImplementedError, "No random device"
      end
      unless ret.length == n
        raise NotImplementedError, "Unexpected partial read from random device: only #{ret.length} for #{n} bytes"
      end
      ret
    end

    ret = Random.urandom(1)
    if ret.nil?
      begin
        require 'openssl'
      rescue NoMethodError
        raise NotImplementedError, "No random device"
      else
        alias gen_random gen_random_openssl
      end
    else
      alias gen_random gen_random_urandom
    end

    public :gen_random
  end
end

SecureRandom.extend(Random::Formatter)
PK}$[qm�ruby/openssl.rbnu�[���# frozen_string_literal: true
=begin
= Info
  'OpenSSL for Ruby 2' project
  Copyright (C) 2002  Michal Rokos <m.rokos@sh.cvut.cz>
  All rights reserved.

= Licence
  This program is licensed under the same licence as Ruby.
  (See the file 'LICENCE'.)
=end

require 'openssl.so'

require_relative 'openssl/bn'
require_relative 'openssl/pkey'
require_relative 'openssl/cipher'
require_relative 'openssl/digest'
require_relative 'openssl/hmac'
require_relative 'openssl/x509'
require_relative 'openssl/ssl'
require_relative 'openssl/pkcs5'
require_relative 'openssl/version'

module OpenSSL
  # call-seq:
  #   OpenSSL.secure_compare(string, string) -> boolean
  #
  # Constant time memory comparison. Inputs are hashed using SHA-256 to mask
  # the length of the secret. Returns +true+ if the strings are identical,
  # +false+ otherwise.
  def self.secure_compare(a, b)
    hashed_a = OpenSSL::Digest.digest('SHA256', a)
    hashed_b = OpenSSL::Digest.digest('SHA256', b)
    OpenSSL.fixed_length_secure_compare(hashed_a, hashed_b) && a == b
  end
end
PK}$[6�c`�
�
ruby/abbrev.rbnu�[���# frozen_string_literal: true
#--
# Copyright (c) 2001,2003 Akinori MUSHA <knu@iDaemons.org>
#
# All rights reserved.  You can redistribute and/or modify it under
# the same terms as Ruby.
#
# $Idaemons: /home/cvs/rb/abbrev.rb,v 1.2 2001/05/30 09:37:45 knu Exp $
# $RoughId: abbrev.rb,v 1.4 2003/10/14 19:45:42 knu Exp $
# $Id$
#++

##
# Calculates the set of unambiguous abbreviations for a given set of strings.
#
#   require 'abbrev'
#   require 'pp'
#
#   pp Abbrev.abbrev(['ruby'])
#   #=>  {"ruby"=>"ruby", "rub"=>"ruby", "ru"=>"ruby", "r"=>"ruby"}
#
#   pp Abbrev.abbrev(%w{ ruby rules })
#
# _Generates:_
#   { "ruby"  =>  "ruby",
#     "rub"   =>  "ruby",
#     "rules" =>  "rules",
#     "rule"  =>  "rules",
#     "rul"   =>  "rules" }
#
# It also provides an array core extension, Array#abbrev.
#
#   pp %w{ summer winter }.abbrev
#
# _Generates:_
#   { "summer"  => "summer",
#     "summe"   => "summer",
#     "summ"    => "summer",
#     "sum"     => "summer",
#     "su"      => "summer",
#     "s"       => "summer",
#     "winter"  => "winter",
#     "winte"   => "winter",
#     "wint"    => "winter",
#     "win"     => "winter",
#     "wi"      => "winter",
#     "w"       => "winter" }

module Abbrev

  # Given a set of strings, calculate the set of unambiguous abbreviations for
  # those strings, and return a hash where the keys are all the possible
  # abbreviations and the values are the full strings.
  #
  # Thus, given +words+ is "car" and "cone", the keys pointing to "car" would
  # be "ca" and "car", while those pointing to "cone" would be "co", "con", and
  # "cone".
  #
  #   require 'abbrev'
  #
  #   Abbrev.abbrev(%w{ car cone })
  #   #=> {"ca"=>"car", "con"=>"cone", "co"=>"cone", "car"=>"car", "cone"=>"cone"}
  #
  # The optional +pattern+ parameter is a pattern or a string. Only input
  # strings that match the pattern or start with the string are included in the
  # output hash.
  #
  #   Abbrev.abbrev(%w{car box cone crab}, /b/)
  #   #=> {"box"=>"box", "bo"=>"box", "b"=>"box", "crab" => "crab"}
  #
  #   Abbrev.abbrev(%w{car box cone}, 'ca')
  #   #=> {"car"=>"car", "ca"=>"car"}
  def abbrev(words, pattern = nil)
    table = {}
    seen = Hash.new(0)

    if pattern.is_a?(String)
      pattern = /\A#{Regexp.quote(pattern)}/  # regard as a prefix
    end

    words.each do |word|
      next if word.empty?
      word.size.downto(1) { |len|
        abbrev = word[0...len]

        next if pattern && pattern !~ abbrev

        case seen[abbrev] += 1
        when 1
          table[abbrev] = word
        when 2
          table.delete(abbrev)
        else
          break
        end
      }
    end

    words.each do |word|
      next if pattern && pattern !~ word

      table[word] = word
    end

    table
  end

  module_function :abbrev
end

class Array
  # Calculates the set of unambiguous abbreviations for the strings in +self+.
  #
  #   require 'abbrev'
  #   %w{ car cone }.abbrev
  #   #=> {"car"=>"car", "ca"=>"car", "cone"=>"cone", "con"=>"cone", "co"=>"cone"}
  #
  # The optional +pattern+ parameter is a pattern or a string. Only input
  # strings that match the pattern or start with the string are included in the
  # output hash.
  #
  #   %w{ fast boat day }.abbrev(/^.a/)
  #   #=> {"fast"=>"fast", "fas"=>"fast", "fa"=>"fast", "day"=>"day", "da"=>"day"}
  #
  #   Abbrev.abbrev(%w{car box cone}, "ca")
  #   #=> {"car"=>"car", "ca"=>"car"}
  #
  # See also Abbrev.abbrev
  def abbrev(pattern = nil)
    Abbrev::abbrev(self, pattern)
  end
end
PK}$[���[[ruby/shellwords.rbnu�[���# frozen-string-literal: true
##
# == Manipulates strings like the UNIX Bourne shell
#
# This module manipulates strings according to the word parsing rules
# of the UNIX Bourne shell.
#
# The shellwords() function was originally a port of shellwords.pl,
# but modified to conform to the Shell & Utilities volume of the IEEE
# Std 1003.1-2008, 2016 Edition [1].
#
# === Usage
#
# You can use Shellwords to parse a string into a Bourne shell friendly Array.
#
#   require 'shellwords'
#
#   argv = Shellwords.split('three blind "mice"')
#   argv #=> ["three", "blind", "mice"]
#
# Once you've required Shellwords, you can use the #split alias
# String#shellsplit.
#
#   argv = "see how they run".shellsplit
#   argv #=> ["see", "how", "they", "run"]
#
# They treat quotes as special characters, so an unmatched quote will
# cause an ArgumentError.
#
#   argv = "they all ran after the farmer's wife".shellsplit
#        #=> ArgumentError: Unmatched quote: ...
#
# Shellwords also provides methods that do the opposite.
# Shellwords.escape, or its alias, String#shellescape, escapes
# shell metacharacters in a string for use in a command line.
#
#   filename = "special's.txt"
#
#   system("cat -- #{filename.shellescape}")
#   # runs "cat -- special\\'s.txt"
#
# Note the '--'.  Without it, cat(1) will treat the following argument
# as a command line option if it starts with '-'.  It is guaranteed
# that Shellwords.escape converts a string to a form that a Bourne
# shell will parse back to the original string, but it is the
# programmer's responsibility to make sure that passing an arbitrary
# argument to a command does no harm.
#
# Shellwords also comes with a core extension for Array, Array#shelljoin.
#
#   dir = "Funny GIFs"
#   argv = %W[ls -lta -- #{dir}]
#   system(argv.shelljoin + " | less")
#   # runs "ls -lta -- Funny\\ GIFs | less"
#
# You can use this method to build a complete command line out of an
# array of arguments.
#
# === Authors
# * Wakou Aoyama
# * Akinori MUSHA <knu@iDaemons.org>
#
# === Contact
# * Akinori MUSHA <knu@iDaemons.org> (current maintainer)
#
# === Resources
#
# 1: {IEEE Std 1003.1-2008, 2016 Edition, the Shell & Utilities volume}[http://pubs.opengroup.org/onlinepubs/9699919799/utilities/contents.html]

module Shellwords
  # Splits a string into an array of tokens in the same way the UNIX
  # Bourne shell does.
  #
  #   argv = Shellwords.split('here are "two words"')
  #   argv #=> ["here", "are", "two words"]
  #
  # Note, however, that this is not a command line parser.  Shell
  # metacharacters except for the single and double quotes and
  # backslash are not treated as such.
  #
  #   argv = Shellwords.split('ruby my_prog.rb | less')
  #   argv #=> ["ruby", "my_prog.rb", "|", "less"]
  #
  # String#shellsplit is a shortcut for this function.
  #
  #   argv = 'here are "two words"'.shellsplit
  #   argv #=> ["here", "are", "two words"]
  def shellsplit(line)
    words = []
    field = String.new
    line.scan(/\G\s*(?>([^\s\\\'\"]+)|'([^\']*)'|"((?:[^\"\\]|\\.)*)"|(\\.?)|(\S))(\s|\z)?/m) do
      |word, sq, dq, esc, garbage, sep|
      raise ArgumentError, "Unmatched quote: #{line.inspect}" if garbage
      # 2.2.3 Double-Quotes:
      #
      #   The <backslash> shall retain its special meaning as an
      #   escape character only when followed by one of the following
      #   characters when considered special:
      #
      #   $ ` " \ <newline>
      field << (word || sq || (dq && dq.gsub(/\\([$`"\\\n])/, '\\1')) || esc.gsub(/\\(.)/, '\\1'))
      if sep
        words << field
        field = String.new
      end
    end
    words
  end

  alias shellwords shellsplit

  module_function :shellsplit, :shellwords

  class << self
    alias split shellsplit
  end

  # Escapes a string so that it can be safely used in a Bourne shell
  # command line.  +str+ can be a non-string object that responds to
  # +to_s+.
  #
  # Note that a resulted string should be used unquoted and is not
  # intended for use in double quotes nor in single quotes.
  #
  #   argv = Shellwords.escape("It's better to give than to receive")
  #   argv #=> "It\\'s\\ better\\ to\\ give\\ than\\ to\\ receive"
  #
  # String#shellescape is a shorthand for this function.
  #
  #   argv = "It's better to give than to receive".shellescape
  #   argv #=> "It\\'s\\ better\\ to\\ give\\ than\\ to\\ receive"
  #
  #   # Search files in lib for method definitions
  #   pattern = "^[ \t]*def "
  #   open("| grep -Ern -e #{pattern.shellescape} lib") { |grep|
  #     grep.each_line { |line|
  #       file, lineno, matched_line = line.split(':', 3)
  #       # ...
  #     }
  #   }
  #
  # It is the caller's responsibility to encode the string in the right
  # encoding for the shell environment where this string is used.
  #
  # Multibyte characters are treated as multibyte characters, not as bytes.
  #
  # Returns an empty quoted String if +str+ has a length of zero.
  def shellescape(str)
    str = str.to_s

    # An empty argument will be skipped, so return empty quotes.
    return "''".dup if str.empty?

    str = str.dup

    # Treat multibyte characters as is.  It is the caller's responsibility
    # to encode the string in the right encoding for the shell
    # environment.
    str.gsub!(/[^A-Za-z0-9_\-.,:+\/@\n]/, "\\\\\\&")

    # A LF cannot be escaped with a backslash because a backslash + LF
    # combo is regarded as a line continuation and simply ignored.
    str.gsub!(/\n/, "'\n'")

    return str
  end

  module_function :shellescape

  class << self
    alias escape shellescape
  end

  # Builds a command line string from an argument list, +array+.
  #
  # All elements are joined into a single string with fields separated by a
  # space, where each element is escaped for the Bourne shell and stringified
  # using +to_s+.
  #
  #   ary = ["There's", "a", "time", "and", "place", "for", "everything"]
  #   argv = Shellwords.join(ary)
  #   argv #=> "There\\'s a time and place for everything"
  #
  # Array#shelljoin is a shortcut for this function.
  #
  #   ary = ["Don't", "rock", "the", "boat"]
  #   argv = ary.shelljoin
  #   argv #=> "Don\\'t rock the boat"
  #
  # You can also mix non-string objects in the elements as allowed in Array#join.
  #
  #   output = `#{['ps', '-p', $$].shelljoin}`
  #
  def shelljoin(array)
    array.map { |arg| shellescape(arg) }.join(' ')
  end

  module_function :shelljoin

  class << self
    alias join shelljoin
  end
end

class String
  # call-seq:
  #   str.shellsplit => array
  #
  # Splits +str+ into an array of tokens in the same way the UNIX
  # Bourne shell does.
  #
  # See Shellwords.shellsplit for details.
  def shellsplit
    Shellwords.split(self)
  end

  # call-seq:
  #   str.shellescape => string
  #
  # Escapes +str+ so that it can be safely used in a Bourne shell
  # command line.
  #
  # See Shellwords.shellescape for details.
  def shellescape
    Shellwords.escape(self)
  end
end

class Array
  # call-seq:
  #   array.shelljoin => string
  #
  # Builds a command line string from an argument list +array+ joining
  # all elements escaped for the Bourne shell and separated by a space.
  #
  # See Shellwords.shelljoin for details.
  def shelljoin
    Shellwords.join(self)
  end
end
PK}$[0K}Dkkruby/csv/version.rbnu�[���# frozen_string_literal: true

class CSV
  # The version of the installed library.
  VERSION = "3.2.5"
end
PK}$[Fl�u:
:
ruby/csv/fields_converter.rbnu�[���# frozen_string_literal: true

class CSV
  # Note: Don't use this class directly. This is an internal class.
  class FieldsConverter
    include Enumerable
    #
    # A CSV::FieldsConverter is a data structure for storing the
    # fields converter properties to be passed as a parameter
    # when parsing a new file (e.g. CSV::Parser.new(@io, parser_options))
    #

    def initialize(options={})
      @converters = []
      @nil_value = options[:nil_value]
      @empty_value = options[:empty_value]
      @empty_value_is_empty_string = (@empty_value == "")
      @accept_nil = options[:accept_nil]
      @builtin_converters_name = options[:builtin_converters_name]
      @need_static_convert = need_static_convert?
    end

    def add_converter(name=nil, &converter)
      if name.nil?  # custom converter
        @converters << converter
      else          # named converter
        combo = builtin_converters[name]
        case combo
        when Array  # combo converter
          combo.each do |sub_name|
            add_converter(sub_name)
          end
        else        # individual named converter
          @converters << combo
        end
      end
    end

    def each(&block)
      @converters.each(&block)
    end

    def empty?
      @converters.empty?
    end

    def convert(fields, headers, lineno, quoted_fields)
      return fields unless need_convert?

      fields.collect.with_index do |field, index|
        if field.nil?
          field = @nil_value
        elsif field.is_a?(String) and field.empty?
          field = @empty_value unless @empty_value_is_empty_string
        end
        @converters.each do |converter|
          break if field.nil? and @accept_nil
          if converter.arity == 1  # straight field converter
            field = converter[field]
          else                     # FieldInfo converter
            if headers
              header = headers[index]
            else
              header = nil
            end
            quoted = quoted_fields[index]
            field = converter[field, FieldInfo.new(index, lineno, header, quoted)]
          end
          break unless field.is_a?(String)  # short-circuit pipeline for speed
        end
        field  # final state of each field, converted or original
      end
    end

    private
    def need_static_convert?
      not (@nil_value.nil? and @empty_value_is_empty_string)
    end

    def need_convert?
      @need_static_convert or
        (not @converters.empty?)
    end

    def builtin_converters
      @builtin_converters ||= ::CSV.const_get(@builtin_converters_name)
    end
  end
end
PK}$[���Q�`�`ruby/csv/row.rbnu�[���# frozen_string_literal: true

require "forwardable"

class CSV
  # = \CSV::Row
  # A \CSV::Row instance represents a \CSV table row.
  # (see {class CSV}[../CSV.html]).
  #
  # The instance may have:
  # - Fields: each is an object, not necessarily a \String.
  # - Headers: each serves a key, and also need not be a \String.
  #
  # === Instance Methods
  #
  # \CSV::Row has three groups of instance methods:
  # - Its own internally defined instance methods.
  # - Methods included by module Enumerable.
  # - Methods delegated to class Array.:
  #   * Array#empty?
  #   * Array#length
  #   * Array#size
  #
  # == Creating a \CSV::Row Instance
  #
  # Commonly, a new \CSV::Row instance is created by parsing \CSV source
  # that has headers:
  #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
  #   table = CSV.parse(source, headers: true)
  #   table.each {|row| p row }
  # Output:
  #   #<CSV::Row "Name":"foo" "Value":"0">
  #   #<CSV::Row "Name":"bar" "Value":"1">
  #   #<CSV::Row "Name":"baz" "Value":"2">
  #
  # You can also create a row directly. See ::new.
  #
  # == Headers
  #
  # Like a \CSV::Table, a \CSV::Row has headers.
  #
  # A \CSV::Row that was created by parsing \CSV source
  # inherits its headers from the table:
  #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
  #   table = CSV.parse(source, headers: true)
  #   row = table.first
  #   row.headers # => ["Name", "Value"]
  #
  # You can also create a new row with headers;
  # like the keys in a \Hash, the headers need not be Strings:
  #   row = CSV::Row.new([:name, :value], ['foo', 0])
  #   row.headers # => [:name, :value]
  #
  # The new row retains its headers even if added to a table
  # that has headers:
  #   table << row # => #<CSV::Table mode:col_or_row row_count:5>
  #   row.headers # => [:name, :value]
  #   row[:name] # => "foo"
  #   row['Name'] # => nil
  #
  #
  #
  # == Accessing Fields
  #
  # You may access a field in a \CSV::Row with either its \Integer index
  # (\Array-style) or its header (\Hash-style).
  #
  # Fetch a field using method #[]:
  #   row = CSV::Row.new(['Name', 'Value'], ['foo', 0])
  #   row[1] # => 0
  #   row['Value'] # => 0
  #
  # Set a field using method #[]=:
  #   row = CSV::Row.new(['Name', 'Value'], ['foo', 0])
  #   row # => #<CSV::Row "Name":"foo" "Value":0>
  #   row[0] = 'bar'
  #   row['Value'] = 1
  #   row # => #<CSV::Row "Name":"bar" "Value":1>
  #
  class Row
    # :call-seq:
    #   CSV::Row.new(headers, fields, header_row = false) -> csv_row
    #
    # Returns the new \CSV::Row instance constructed from
    # arguments +headers+ and +fields+; both should be Arrays;
    # note that the fields need not be Strings:
    #   row = CSV::Row.new(['Name', 'Value'], ['foo', 0])
    #   row # => #<CSV::Row "Name":"foo" "Value":0>
    #
    # If the \Array lengths are different, the shorter is +nil+-filled:
    #   row = CSV::Row.new(['Name', 'Value', 'Date', 'Size'], ['foo', 0])
    #   row # => #<CSV::Row "Name":"foo" "Value":0 "Date":nil "Size":nil>
    #
    # Each \CSV::Row object is either a <i>field row</i> or a <i>header row</i>;
    # by default, a new row is a field row;  for the row created above:
    #   row.field_row? # => true
    #   row.header_row? # => false
    #
    # If the optional argument +header_row+ is given as +true+,
    # the created row is a header row:
    #   row = CSV::Row.new(['Name', 'Value'], ['foo', 0], header_row = true)
    #   row # => #<CSV::Row "Name":"foo" "Value":0>
    #   row.field_row? # => false
    #   row.header_row? # => true
    def initialize(headers, fields, header_row = false)
      @header_row = header_row
      headers.each { |h| h.freeze if h.is_a? String }

      # handle extra headers or fields
      @row = if headers.size >= fields.size
        headers.zip(fields)
      else
        fields.zip(headers).each(&:reverse!)
      end
    end

    # Internal data format used to compare equality.
    attr_reader :row
    protected   :row

    ### Array Delegation ###

    extend Forwardable
    def_delegators :@row, :empty?, :length, :size

    # :call-seq:
    #   row.initialize_copy(other_row) -> self
    #
    # Calls superclass method.
    def initialize_copy(other)
      super_return_value = super
      @row = @row.collect(&:dup)
      super_return_value
    end

    # :call-seq:
    #   row.header_row? -> true or false
    #
    # Returns +true+ if this is a header row, +false+ otherwise.
    def header_row?
      @header_row
    end

    # :call-seq:
    #   row.field_row? -> true or false
    #
    # Returns +true+ if this is a field row, +false+ otherwise.
    def field_row?
      not header_row?
    end

    # :call-seq:
    #    row.headers -> array_of_headers
    #
    # Returns the headers for this row:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table.first
    #   row.headers # => ["Name", "Value"]
    def headers
      @row.map(&:first)
    end

    # :call-seq:
    #   field(index) -> value
    #   field(header) -> value
    #   field(header, offset) -> value
    #
    # Returns the field value for the given +index+ or +header+.
    #
    # ---
    #
    # Fetch field value by \Integer index:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.field(0) # => "foo"
    #   row.field(1) # => "bar"
    #
    # Counts backward from the last column if +index+ is negative:
    #   row.field(-1) # => "0"
    #   row.field(-2) # => "foo"
    #
    # Returns +nil+ if +index+ is out of range:
    #   row.field(2) # => nil
    #   row.field(-3) # => nil
    #
    # ---
    #
    # Fetch field value by header (first found):
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.field('Name') # => "Foo"
    #
    # Fetch field value by header, ignoring +offset+ leading fields:
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.field('Name', 2) # => "Baz"
    #
    # Returns +nil+ if the header does not exist.
    def field(header_or_index, minimum_index = 0)
      # locate the pair
      finder = (header_or_index.is_a?(Integer) || header_or_index.is_a?(Range)) ? :[] : :assoc
      pair   = @row[minimum_index..-1].public_send(finder, header_or_index)

      # return the field if we have a pair
      if pair.nil?
        nil
      else
        header_or_index.is_a?(Range) ? pair.map(&:last) : pair.last
      end
    end
    alias_method :[], :field

    #
    # :call-seq:
    #   fetch(header) -> value
    #   fetch(header, default) -> value
    #   fetch(header) {|row| ... } -> value
    #
    # Returns the field value as specified by +header+.
    #
    # ---
    #
    # With the single argument +header+, returns the field value
    # for that header (first found):
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.fetch('Name') # => "Foo"
    #
    # Raises exception +KeyError+ if the header does not exist.
    #
    # ---
    #
    # With arguments +header+ and +default+ given,
    # returns the field value for the header (first found)
    # if the header exists, otherwise returns +default+:
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.fetch('Name', '') # => "Foo"
    #   row.fetch(:nosuch, '') # => ""
    #
    # ---
    #
    # With argument +header+ and a block given,
    # returns the field value for the header (first found)
    # if the header exists; otherwise calls the block
    # and returns its return value:
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.fetch('Name') {|header| fail 'Cannot happen' } # => "Foo"
    #   row.fetch(:nosuch) {|header| "Header '#{header} not found'" } # => "Header 'nosuch not found'"
    def fetch(header, *varargs)
      raise ArgumentError, "Too many arguments" if varargs.length > 1
      pair = @row.assoc(header)
      if pair
        pair.last
      else
        if block_given?
          yield header
        elsif varargs.empty?
          raise KeyError, "key not found: #{header}"
        else
          varargs.first
        end
      end
    end

    # :call-seq:
    #   row.has_key?(header) -> true or false
    #
    # Returns +true+ if there is a field with the given +header+,
    # +false+ otherwise.
    def has_key?(header)
      !!@row.assoc(header)
    end
    alias_method :include?, :has_key?
    alias_method :key?,     :has_key?
    alias_method :member?,  :has_key?
    alias_method :header?,  :has_key?

    #
    # :call-seq:
    #   row[index] = value -> value
    #   row[header, offset] = value -> value
    #   row[header] = value -> value
    #
    # Assigns the field value for the given +index+ or +header+;
    # returns +value+.
    #
    # ---
    #
    # Assign field value by \Integer index:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row[0] = 'Bat'
    #   row[1] = 3
    #   row # => #<CSV::Row "Name":"Bat" "Value":3>
    #
    # Counts backward from the last column if +index+ is negative:
    #   row[-1] = 4
    #   row[-2] = 'Bam'
    #   row # => #<CSV::Row "Name":"Bam" "Value":4>
    #
    # Extends the row with <tt>nil:nil</tt> if positive +index+ is not in the row:
    #   row[4] = 5
    #   row # => #<CSV::Row "Name":"bad" "Value":4 nil:nil nil:nil nil:5>
    #
    # Raises IndexError if negative +index+ is too small (too far from zero).
    #
    # ---
    #
    # Assign field value by header (first found):
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row['Name'] = 'Bat'
    #   row # => #<CSV::Row "Name":"Bat" "Name":"Bar" "Name":"Baz">
    #
    # Assign field value by header, ignoring +offset+ leading fields:
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row['Name', 2] = 4
    #   row # => #<CSV::Row "Name":"Foo" "Name":"Bar" "Name":4>
    #
    # Append new field by (new) header:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row['New'] = 6
    #   row# => #<CSV::Row "Name":"foo" "Value":"0" "New":6>
    def []=(*args)
      value = args.pop

      if args.first.is_a? Integer
        if @row[args.first].nil?  # extending past the end with index
          @row[args.first] = [nil, value]
          @row.map! { |pair| pair.nil? ? [nil, nil] : pair }
        else                      # normal index assignment
          @row[args.first][1] = value
        end
      else
        index = index(*args)
        if index.nil?             # appending a field
          self << [args.first, value]
        else                      # normal header assignment
          @row[index][1] = value
        end
      end
    end

    #
    # :call-seq:
    #   row << [header, value] -> self
    #   row << hash -> self
    #   row << value -> self
    #
    # Adds a field to +self+; returns +self+:
    #
    # If the argument is a 2-element \Array <tt>[header, value]</tt>,
    # a field is added with the given +header+ and +value+:
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row << ['NAME', 'Bat']
    #   row # => #<CSV::Row "Name":"Foo" "Name":"Bar" "Name":"Baz" "NAME":"Bat">
    #
    # If the argument is a \Hash, each <tt>key-value</tt> pair is added
    # as a field with header +key+ and value +value+.
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row << {NAME: 'Bat', name: 'Bam'}
    #   row # => #<CSV::Row "Name":"Foo" "Name":"Bar" "Name":"Baz" NAME:"Bat" name:"Bam">
    #
    # Otherwise, the given +value+ is added as a field with no header.
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row << 'Bag'
    #   row # => #<CSV::Row "Name":"Foo" "Name":"Bar" "Name":"Baz" nil:"Bag">
    def <<(arg)
      if arg.is_a?(Array) and arg.size == 2  # appending a header and name
        @row << arg
      elsif arg.is_a?(Hash)                  # append header and name pairs
        arg.each { |pair| @row << pair }
      else                                   # append field value
        @row << [nil, arg]
      end

      self  # for chaining
    end

    # :call-seq:
    #   row.push(*values) -> self
    #
    # Appends each of the given +values+ to +self+ as a field; returns +self+:
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.push('Bat', 'Bam')
    #   row # => #<CSV::Row "Name":"Foo" "Name":"Bar" "Name":"Baz" nil:"Bat" nil:"Bam">
    def push(*args)
      args.each { |arg| self << arg }

      self  # for chaining
    end

    #
    # :call-seq:
    #   delete(index) -> [header, value] or nil
    #   delete(header) -> [header, value] or empty_array
    #   delete(header, offset) -> [header, value] or empty_array
    #
    # Removes a specified field from +self+; returns the 2-element \Array
    # <tt>[header, value]</tt> if the field exists.
    #
    # If an \Integer argument +index+ is given,
    # removes and returns the field at offset +index+,
    # or returns +nil+ if the field does not exist:
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.delete(1) # => ["Name", "Bar"]
    #   row.delete(50) # => nil
    #
    # Otherwise, if the single argument +header+ is given,
    # removes and returns the first-found field with the given header,
    # of returns a new empty \Array if the field does not exist:
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.delete('Name') # => ["Name", "Foo"]
    #   row.delete('NAME') # => []
    #
    # If argument +header+ and \Integer argument +offset+ are given,
    # removes and returns the first-found field with the given header
    # whose +index+ is at least as large as +offset+:
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.delete('Name', 1) # => ["Name", "Bar"]
    #   row.delete('NAME', 1) # => []
    def delete(header_or_index, minimum_index = 0)
      if header_or_index.is_a? Integer                 # by index
        @row.delete_at(header_or_index)
      elsif i = index(header_or_index, minimum_index)  # by header
        @row.delete_at(i)
      else
        [ ]
      end
    end

    # :call-seq:
    #   row.delete_if {|header, value| ... } -> self
    #
    # Removes fields from +self+ as selected by the block; returns +self+.
    #
    # Removes each field for which the block returns a truthy value:
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.delete_if {|header, value| value.start_with?('B') } # => true
    #   row # => #<CSV::Row "Name":"Foo">
    #   row.delete_if {|header, value| header.start_with?('B') } # => false
    #
    # If no block is given, returns a new Enumerator:
    #   row.delete_if # => #<Enumerator: #<CSV::Row "Name":"Foo">:delete_if>
    def delete_if(&block)
      return enum_for(__method__) { size } unless block_given?

      @row.delete_if(&block)

      self  # for chaining
    end

    # :call-seq:
    #   self.fields(*specifiers) -> array_of_fields
    #
    # Returns field values per the given +specifiers+, which may be any mixture of:
    # - \Integer index.
    # - \Range of \Integer indexes.
    # - 2-element \Array containing a header and offset.
    # - Header.
    # - \Range of headers.
    #
    # For +specifier+ in one of the first four cases above,
    # returns the result of <tt>self.field(specifier)</tt>;  see #field.
    #
    # Although there may be any number of +specifiers+,
    # the examples here will illustrate one at a time.
    #
    # When the specifier is an \Integer +index+,
    # returns <tt>self.field(index)</tt>L
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.fields(1) # => ["Bar"]
    #
    # When the specifier is a \Range of \Integers +range+,
    # returns <tt>self.field(range)</tt>:
    #   row.fields(1..2) # => ["Bar", "Baz"]
    #
    # When the specifier is a 2-element \Array +array+,
    # returns <tt>self.field(array)</tt>L
    #   row.fields('Name', 1) # => ["Foo", "Bar"]
    #
    # When the specifier is a header +header+,
    # returns <tt>self.field(header)</tt>L
    #   row.fields('Name') # => ["Foo"]
    #
    # When the specifier is a \Range of headers +range+,
    # forms a new \Range +new_range+ from the indexes of
    # <tt>range.start</tt> and <tt>range.end</tt>,
    # and returns <tt>self.field(new_range)</tt>:
    #   source = "Name,NAME,name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.fields('Name'..'NAME') # => ["Foo", "Bar"]
    #
    # Returns all fields if no argument given:
    #   row.fields # => ["Foo", "Bar", "Baz"]
    def fields(*headers_and_or_indices)
      if headers_and_or_indices.empty?  # return all fields--no arguments
        @row.map(&:last)
      else                              # or work like values_at()
        all = []
        headers_and_or_indices.each do |h_or_i|
          if h_or_i.is_a? Range
            index_begin = h_or_i.begin.is_a?(Integer) ? h_or_i.begin :
                                                        index(h_or_i.begin)
            index_end   = h_or_i.end.is_a?(Integer)   ? h_or_i.end :
                                                        index(h_or_i.end)
            new_range   = h_or_i.exclude_end? ? (index_begin...index_end) :
                                                (index_begin..index_end)
            all.concat(fields.values_at(new_range))
          else
            all << field(*Array(h_or_i))
          end
        end
        return all
      end
    end
    alias_method :values_at, :fields

    # :call-seq:
    #   index(header) -> index
    #   index(header, offset) -> index
    #
    # Returns the index for the given header, if it exists;
    # otherwise returns +nil+.
    #
    # With the single argument +header+, returns the index
    # of the first-found field with the given +header+:
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.index('Name') # => 0
    #   row.index('NAME') # => nil
    #
    # With arguments +header+ and +offset+,
    # returns the index of the first-found field with given +header+,
    # but ignoring the first +offset+ fields:
    #   row.index('Name', 1) # => 1
    #   row.index('Name', 3) # => nil
    def index(header, minimum_index = 0)
      # find the pair
      index = headers[minimum_index..-1].index(header)
      # return the index at the right offset, if we found one
      index.nil? ? nil : index + minimum_index
    end

    # :call-seq:
    #   row.field?(value) -> true or false
    #
    # Returns +true+ if +value+ is a field in this row, +false+ otherwise:
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.field?('Bar') # => true
    #   row.field?('BAR') # => false
    def field?(data)
      fields.include? data
    end

    include Enumerable

    # :call-seq:
    #   row.each {|header, value| ... } -> self
    #
    # Calls the block with each header-value pair; returns +self+:
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.each {|header, value| p [header, value] }
    # Output:
    #   ["Name", "Foo"]
    #   ["Name", "Bar"]
    #   ["Name", "Baz"]
    #
    # If no block is given, returns a new Enumerator:
    #   row.each # => #<Enumerator: #<CSV::Row "Name":"Foo" "Name":"Bar" "Name":"Baz">:each>
    def each(&block)
      return enum_for(__method__) { size } unless block_given?

      @row.each(&block)

      self  # for chaining
    end

    alias_method :each_pair, :each

    # :call-seq:
    #   row == other -> true or false
    #
    # Returns +true+ if +other+ is a /CSV::Row that has the same
    # fields (headers and values) in the same order as +self+;
    # otherwise returns +false+:
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   other_row = table[0]
    #   row == other_row # => true
    #   other_row = table[1]
    #   row == other_row # => false
    def ==(other)
      return @row == other.row if other.is_a? CSV::Row
      @row == other
    end

    # :call-seq:
    #   row.to_h -> hash
    #
    # Returns the new \Hash formed by adding each header-value pair in +self+
    # as a key-value pair in the \Hash.
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.to_h # => {"Name"=>"foo", "Value"=>"0"}
    #
    # Header order is preserved, but repeated headers are ignored:
    #   source = "Name,Name,Name\nFoo,Bar,Baz\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.to_h # => {"Name"=>"Foo"}
    def to_h
      hash = {}
      each do |key, _value|
        hash[key] = self[key] unless hash.key?(key)
      end
      hash
    end
    alias_method :to_hash, :to_h

    # :call-seq:
    #   row.deconstruct_keys(keys) -> hash
    #
    # Returns the new \Hash suitable for pattern matching containing only the
    # keys specified as an argument.
    def deconstruct_keys(keys)
      if keys.nil?
        to_h
      else
        keys.to_h { |key| [key, self[key]] }
      end
    end

    alias_method :to_ary, :to_a

    # :call-seq:
    #   row.deconstruct -> array
    #
    # Returns the new \Array suitable for pattern matching containing the values
    # of the row.
    def deconstruct
      fields
    end

    # :call-seq:
    #   row.to_csv -> csv_string
    #
    # Returns the row as a \CSV String. Headers are not included:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.to_csv # => "foo,0\n"
    def to_csv(**options)
      fields.to_csv(**options)
    end
    alias_method :to_s, :to_csv

    # :call-seq:
    #   row.dig(index_or_header, *identifiers) -> object
    #
    # Finds and returns the object in nested object that is specified
    # by +index_or_header+ and +specifiers+.
    #
    # The nested objects may be instances of various classes.
    # See {Dig Methods}[https://docs.ruby-lang.org/en/master/dig_methods_rdoc.html].
    #
    # Examples:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.dig(1) # => "0"
    #   row.dig('Value') # => "0"
    #   row.dig(5) # => nil
    def dig(index_or_header, *indexes)
      value = field(index_or_header)
      if value.nil?
        nil
      elsif indexes.empty?
        value
      else
        unless value.respond_to?(:dig)
          raise TypeError, "#{value.class} does not have \#dig method"
        end
        value.dig(*indexes)
      end
    end

    # :call-seq:
    #   row.inspect -> string
    #
    # Returns an ASCII-compatible \String showing:
    # - Class \CSV::Row.
    # - Header-value pairs.
    # Example:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   row = table[0]
    #   row.inspect # => "#<CSV::Row \"Name\":\"foo\" \"Value\":\"0\">"
    def inspect
      str = ["#<", self.class.to_s]
      each do |header, field|
        str << " " << (header.is_a?(Symbol) ? header.to_s : header.inspect) <<
               ":" << field.inspect
      end
      str << ">"
      begin
        str.join('')
      rescue  # any encoding error
        str.map do |s|
          e = Encoding::Converter.asciicompat_encoding(s.encoding)
          e ? s.encode(e) : s.force_encoding("ASCII-8BIT")
        end.join('')
      end
    end
  end
end
PK}$[<rߋ0�0�ruby/csv/table.rbnu�[���# frozen_string_literal: true

require "forwardable"

class CSV
  # = \CSV::Table
  # A \CSV::Table instance represents \CSV data.
  # (see {class CSV}[../CSV.html]).
  #
  # The instance may have:
  # - Rows: each is a Table::Row object.
  # - Headers: names for the columns.
  #
  # === Instance Methods
  #
  # \CSV::Table has three groups of instance methods:
  # - Its own internally defined instance methods.
  # - Methods included by module Enumerable.
  # - Methods delegated to class Array.:
  #   * Array#empty?
  #   * Array#length
  #   * Array#size
  #
  # == Creating a \CSV::Table Instance
  #
  # Commonly, a new \CSV::Table instance is created by parsing \CSV source
  # using headers:
  #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
  #   table = CSV.parse(source, headers: true)
  #   table.class # => CSV::Table
  #
  # You can also create an instance directly. See ::new.
  #
  # == Headers
  #
  # If a table has headers, the headers serve as labels for the columns of data.
  # Each header serves as the label for its column.
  #
  # The headers for a \CSV::Table object are stored as an \Array of Strings.
  #
  # Commonly, headers are defined in the first row of \CSV source:
  #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
  #   table = CSV.parse(source, headers: true)
  #   table.headers # => ["Name", "Value"]
  #
  # If no headers are defined, the \Array is empty:
  #   table = CSV::Table.new([])
  #   table.headers # => []
  #
  # == Access Modes
  #
  # \CSV::Table provides three modes for accessing table data:
  # - \Row mode.
  # - Column mode.
  # - Mixed mode (the default for a new table).
  #
  # The access mode for a\CSV::Table instance affects the behavior
  # of some of its instance methods:
  # - #[]
  # - #[]=
  # - #delete
  # - #delete_if
  # - #each
  # - #values_at
  #
  # === \Row Mode
  #
  # Set a table to row mode with method #by_row!:
  #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
  #   table = CSV.parse(source, headers: true)
  #   table.by_row! # => #<CSV::Table mode:row row_count:4>
  #
  # Specify a single row by an \Integer index:
  #   # Get a row.
  #   table[1] # => #<CSV::Row "Name":"bar" "Value":"1">
  #   # Set a row, then get it.
  #   table[1] = CSV::Row.new(['Name', 'Value'], ['bam', 3])
  #   table[1] # => #<CSV::Row "Name":"bam" "Value":3>
  #
  # Specify a sequence of rows by a \Range:
  #   # Get rows.
  #   table[1..2] # => [#<CSV::Row "Name":"bam" "Value":3>, #<CSV::Row "Name":"baz" "Value":"2">]
  #   # Set rows, then get them.
  #   table[1..2] = [
  #     CSV::Row.new(['Name', 'Value'], ['bat', 4]),
  #     CSV::Row.new(['Name', 'Value'], ['bad', 5]),
  #   ]
  #   table[1..2] # => [["Name", #<CSV::Row "Name":"bat" "Value":4>], ["Value", #<CSV::Row "Name":"bad" "Value":5>]]
  #
  # === Column Mode
  #
  # Set a table to column mode with method #by_col!:
  #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
  #   table = CSV.parse(source, headers: true)
  #   table.by_col! # => #<CSV::Table mode:col row_count:4>
  #
  # Specify a column by an \Integer index:
  #   # Get a column.
  #   table[0]
  #   # Set a column, then get it.
  #   table[0] = ['FOO', 'BAR', 'BAZ']
  #   table[0] # => ["FOO", "BAR", "BAZ"]
  #
  # Specify a column by its \String header:
  #   # Get a column.
  #   table['Name'] # => ["FOO", "BAR", "BAZ"]
  #   # Set a column, then get it.
  #   table['Name'] = ['Foo', 'Bar', 'Baz']
  #   table['Name'] # => ["Foo", "Bar", "Baz"]
  #
  # === Mixed Mode
  #
  # In mixed mode, you can refer to either rows or columns:
  # - An \Integer index refers to a row.
  # - A \Range index refers to multiple rows.
  # - A \String index refers to a column.
  #
  # Set a table to mixed mode with method #by_col_or_row!:
  #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
  #   table = CSV.parse(source, headers: true)
  #   table.by_col_or_row! # => #<CSV::Table mode:col_or_row row_count:4>
  #
  # Specify a single row by an \Integer index:
  #   # Get a row.
  #   table[1] # => #<CSV::Row "Name":"bar" "Value":"1">
  #   # Set a row, then get it.
  #   table[1] = CSV::Row.new(['Name', 'Value'], ['bam', 3])
  #   table[1] # => #<CSV::Row "Name":"bam" "Value":3>
  #
  # Specify a sequence of rows by a \Range:
  #   # Get rows.
  #   table[1..2] # => [#<CSV::Row "Name":"bam" "Value":3>, #<CSV::Row "Name":"baz" "Value":"2">]
  #   # Set rows, then get them.
  #   table[1] = CSV::Row.new(['Name', 'Value'], ['bat', 4])
  #   table[2] = CSV::Row.new(['Name', 'Value'], ['bad', 5])
  #   table[1..2] # => [["Name", #<CSV::Row "Name":"bat" "Value":4>], ["Value", #<CSV::Row "Name":"bad" "Value":5>]]
  #
  # Specify a column by its \String header:
  #   # Get a column.
  #   table['Name'] # => ["foo", "bat", "bad"]
  #   # Set a column, then get it.
  #   table['Name'] = ['Foo', 'Bar', 'Baz']
  #   table['Name'] # => ["Foo", "Bar", "Baz"]
  class Table
    # :call-seq:
    #   CSV::Table.new(array_of_rows, headers = nil) -> csv_table
    #
    # Returns a new \CSV::Table object.
    #
    # - Argument +array_of_rows+ must be an \Array of CSV::Row objects.
    # - Argument +headers+, if given, may be an \Array of Strings.
    #
    # ---
    #
    # Create an empty \CSV::Table object:
    #   table = CSV::Table.new([])
    #   table # => #<CSV::Table mode:col_or_row row_count:1>
    #
    # Create a non-empty \CSV::Table object:
    #   rows = [
    #     CSV::Row.new([], []),
    #     CSV::Row.new([], []),
    #     CSV::Row.new([], []),
    #   ]
    #   table  = CSV::Table.new(rows)
    #   table # => #<CSV::Table mode:col_or_row row_count:4>
    #
    # ---
    #
    # If argument +headers+ is an \Array of Strings,
    # those Strings become the table's headers:
    #   table = CSV::Table.new([], headers: ['Name', 'Age'])
    #   table.headers # => ["Name", "Age"]
    #
    # If argument +headers+ is not given and the table has rows,
    # the headers are taken from the first row:
    #   rows = [
    #     CSV::Row.new(['Foo', 'Bar'], []),
    #     CSV::Row.new(['foo', 'bar'], []),
    #     CSV::Row.new(['FOO', 'BAR'], []),
    #   ]
    #   table  = CSV::Table.new(rows)
    #   table.headers # => ["Foo", "Bar"]
    #
    # If argument +headers+ is not given and the table is empty (has no rows),
    # the headers are also empty:
    #   table  = CSV::Table.new([])
    #   table.headers # => []
    #
    # ---
    #
    # Raises an exception if argument +array_of_rows+ is not an \Array object:
    #   # Raises NoMethodError (undefined method `first' for :foo:Symbol):
    #   CSV::Table.new(:foo)
    #
    # Raises an exception if an element of +array_of_rows+ is not a \CSV::Table object:
    #   # Raises NoMethodError (undefined method `headers' for :foo:Symbol):
    #   CSV::Table.new([:foo])
    def initialize(array_of_rows, headers: nil)
      @table = array_of_rows
      @headers = headers
      unless @headers
        if @table.empty?
          @headers = []
        else
          @headers = @table.first.headers
        end
      end

      @mode  = :col_or_row
    end

    # The current access mode for indexing and iteration.
    attr_reader :mode

    # Internal data format used to compare equality.
    attr_reader :table
    protected   :table

    ### Array Delegation ###

    extend Forwardable
    def_delegators :@table, :empty?, :length, :size

    # :call-seq:
    #   table.by_col -> table_dup
    #
    # Returns a duplicate of +self+, in column mode
    # (see {Column Mode}[#class-CSV::Table-label-Column+Mode]):
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   table.mode # => :col_or_row
    #   dup_table = table.by_col
    #   dup_table.mode # => :col
    #   dup_table.equal?(table) # => false # It's a dup
    #
    # This may be used to chain method calls without changing the mode
    # (but also will affect performance and memory usage):
    #   dup_table.by_col['Name']
    #
    # Also note that changes to the duplicate table will not affect the original.
    def by_col
      self.class.new(@table.dup).by_col!
    end

    # :call-seq:
    #   table.by_col! -> self
    #
    # Sets the mode for +self+ to column mode
    # (see {Column Mode}[#class-CSV::Table-label-Column+Mode]); returns +self+:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   table.mode # => :col_or_row
    #   table1 = table.by_col!
    #   table.mode # => :col
    #   table1.equal?(table) # => true # Returned self
    def by_col!
      @mode = :col

      self
    end

    # :call-seq:
    #   table.by_col_or_row -> table_dup
    #
    # Returns a duplicate of +self+, in mixed mode
    # (see {Mixed Mode}[#class-CSV::Table-label-Mixed+Mode]):
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true).by_col!
    #   table.mode # => :col
    #   dup_table = table.by_col_or_row
    #   dup_table.mode # => :col_or_row
    #   dup_table.equal?(table) # => false # It's a dup
    #
    # This may be used to chain method calls without changing the mode
    # (but also will affect performance and memory usage):
    #   dup_table.by_col_or_row['Name']
    #
    # Also note that changes to the duplicate table will not affect the original.
    def by_col_or_row
      self.class.new(@table.dup).by_col_or_row!
    end

    # :call-seq:
    #   table.by_col_or_row! -> self
    #
    # Sets the mode for +self+ to mixed mode
    # (see {Mixed Mode}[#class-CSV::Table-label-Mixed+Mode]); returns +self+:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true).by_col!
    #   table.mode # => :col
    #   table1 = table.by_col_or_row!
    #   table.mode # => :col_or_row
    #   table1.equal?(table) # => true # Returned self
    def by_col_or_row!
      @mode = :col_or_row

      self
    end

    # :call-seq:
    #   table.by_row -> table_dup
    #
    # Returns a duplicate of +self+, in row mode
    # (see {Row Mode}[#class-CSV::Table-label-Row+Mode]):
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   table.mode # => :col_or_row
    #   dup_table = table.by_row
    #   dup_table.mode # => :row
    #   dup_table.equal?(table) # => false # It's a dup
    #
    # This may be used to chain method calls without changing the mode
    # (but also will affect performance and memory usage):
    #   dup_table.by_row[1]
    #
    # Also note that changes to the duplicate table will not affect the original.
    def by_row
      self.class.new(@table.dup).by_row!
    end

    # :call-seq:
    #   table.by_row! -> self
    #
    # Sets the mode for +self+ to row mode
    # (see {Row Mode}[#class-CSV::Table-label-Row+Mode]); returns +self+:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   table.mode # => :col_or_row
    #   table1 = table.by_row!
    #   table.mode # => :row
    #   table1.equal?(table) # => true # Returned self
    def by_row!
      @mode = :row

      self
    end

    # :call-seq:
    #   table.headers -> array_of_headers
    #
    # Returns a new \Array containing the \String headers for the table.
    #
    # If the table is not empty, returns the headers from the first row:
    #   rows = [
    #     CSV::Row.new(['Foo', 'Bar'], []),
    #     CSV::Row.new(['FOO', 'BAR'], []),
    #     CSV::Row.new(['foo', 'bar'], []),
    #   ]
    #   table  = CSV::Table.new(rows)
    #   table.headers # => ["Foo", "Bar"]
    #   table.delete(0)
    #   table.headers # => ["FOO", "BAR"]
    #   table.delete(0)
    #   table.headers # => ["foo", "bar"]
    #
    # If the table is empty, returns a copy of the headers in the table itself:
    #   table.delete(0)
    #   table.headers # => ["Foo", "Bar"]
    def headers
      if @table.empty?
        @headers.dup
      else
        @table.first.headers
      end
    end

    # :call-seq:
    #   table[n] -> row or column_data
    #   table[range] -> array_of_rows or array_of_column_data
    #   table[header] -> array_of_column_data
    #
    # Returns data from the table;  does not modify the table.
    #
    # ---
    #
    # Fetch a \Row by Its \Integer Index::
    # - Form: <tt>table[n]</tt>, +n+ an integer.
    # - Access mode: <tt>:row</tt> or <tt>:col_or_row</tt>.
    # - Return value: _nth_ row of the table, if that row exists;
    #   otherwise +nil+.
    #
    # Returns the _nth_ row of the table if that row exists:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   table.by_row! # => #<CSV::Table mode:row row_count:4>
    #   table[1] # => #<CSV::Row "Name":"bar" "Value":"1">
    #   table.by_col_or_row! # => #<CSV::Table mode:col_or_row row_count:4>
    #   table[1] # => #<CSV::Row "Name":"bar" "Value":"1">
    #
    # Counts backward from the last row if +n+ is negative:
    #   table[-1] # => #<CSV::Row "Name":"baz" "Value":"2">
    #
    # Returns +nil+ if +n+ is too large or too small:
    #   table[4] # => nil
    #   table[-4] # => nil
    #
    # Raises an exception if the access mode is <tt>:row</tt>
    # and +n+ is not an \Integer:
    #   table.by_row! # => #<CSV::Table mode:row row_count:4>
    #   # Raises TypeError (no implicit conversion of String into Integer):
    #   table['Name']
    #
    # ---
    #
    # Fetch a Column by Its \Integer Index::
    # - Form: <tt>table[n]</tt>, +n+ an \Integer.
    # - Access mode: <tt>:col</tt>.
    # - Return value: _nth_ column of the table, if that column exists;
    #   otherwise an \Array of +nil+ fields of length <tt>self.size</tt>.
    #
    # Returns the _nth_ column of the table if that column exists:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   table.by_col! # => #<CSV::Table mode:col row_count:4>
    #   table[1] # => ["0", "1", "2"]
    #
    # Counts backward from the last column if +n+ is negative:
    #   table[-2] # => ["foo", "bar", "baz"]
    #
    # Returns an \Array of +nil+ fields if +n+ is too large or too small:
    #   table[4] # => [nil, nil, nil]
    #   table[-4] # => [nil, nil, nil]
    #
    # ---
    #
    # Fetch Rows by \Range::
    # - Form: <tt>table[range]</tt>, +range+ a \Range object.
    # - Access mode: <tt>:row</tt> or <tt>:col_or_row</tt>.
    # - Return value: rows from the table, beginning at row <tt>range.start</tt>,
    #   if those rows exists.
    #
    # Returns rows from the table, beginning at row <tt>range.first</tt>,
    # if those rows exist:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   table.by_row! # => #<CSV::Table mode:row row_count:4>
    #   rows = table[1..2] # => #<CSV::Row "Name":"bar" "Value":"1">
    #   rows # => [#<CSV::Row "Name":"bar" "Value":"1">, #<CSV::Row "Name":"baz" "Value":"2">]
    #   table.by_col_or_row! # => #<CSV::Table mode:col_or_row row_count:4>
    #   rows = table[1..2] # => #<CSV::Row "Name":"bar" "Value":"1">
    #   rows # => [#<CSV::Row "Name":"bar" "Value":"1">, #<CSV::Row "Name":"baz" "Value":"2">]
    #
    # If there are too few rows, returns all from <tt>range.start</tt> to the end:
    #   rows = table[1..50] # => #<CSV::Row "Name":"bar" "Value":"1">
    #   rows # => [#<CSV::Row "Name":"bar" "Value":"1">, #<CSV::Row "Name":"baz" "Value":"2">]
    #
    # Special case: if <tt>range.start == table.size</tt>, returns an empty \Array:
    #   table[table.size..50] # => []
    #
    # If <tt>range.end</tt> is negative, calculates the ending index from the end:
    #   rows = table[0..-1]
    #   rows # => [#<CSV::Row "Name":"foo" "Value":"0">, #<CSV::Row "Name":"bar" "Value":"1">, #<CSV::Row "Name":"baz" "Value":"2">]
    #
    # If <tt>range.start</tt> is negative, calculates the starting index from the end:
    #   rows = table[-1..2]
    #   rows # => [#<CSV::Row "Name":"baz" "Value":"2">]
    #
    # If <tt>range.start</tt> is larger than <tt>table.size</tt>, returns +nil+:
    #   table[4..4] # => nil
    #
    # ---
    #
    # Fetch Columns by \Range::
    # - Form: <tt>table[range]</tt>, +range+ a \Range object.
    # - Access mode: <tt>:col</tt>.
    # - Return value: column data from the table, beginning at column <tt>range.start</tt>,
    #   if those columns exist.
    #
    # Returns column values from the table, if the column exists;
    # the values are arranged by row:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   table.by_col!
    #   table[0..1] # => [["foo", "0"], ["bar", "1"], ["baz", "2"]]
    #
    # Special case: if <tt>range.start == headers.size</tt>,
    # returns an \Array (size: <tt>table.size</tt>) of empty \Arrays:
    #   table[table.headers.size..50] # => [[], [], []]
    #
    # If <tt>range.end</tt> is negative, calculates the ending index from the end:
    #   table[0..-1] # => [["foo", "0"], ["bar", "1"], ["baz", "2"]]
    #
    # If <tt>range.start</tt> is negative, calculates the starting index from the end:
    #   table[-2..2] # => [["foo", "0"], ["bar", "1"], ["baz", "2"]]
    #
    # If <tt>range.start</tt> is larger than <tt>table.size</tt>,
    # returns an \Array of +nil+ values:
    #   table[4..4] # => [nil, nil, nil]
    #
    # ---
    #
    # Fetch a Column by Its \String Header::
    # - Form: <tt>table[header]</tt>, +header+ a \String header.
    # - Access mode: <tt>:col</tt> or <tt>:col_or_row</tt>
    # - Return value: column data from the table, if that +header+ exists.
    #
    # Returns column values from the table, if the column exists:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   table.by_col! # => #<CSV::Table mode:col row_count:4>
    #   table['Name'] # => ["foo", "bar", "baz"]
    #   table.by_col_or_row! # => #<CSV::Table mode:col_or_row row_count:4>
    #   col = table['Name']
    #   col # => ["foo", "bar", "baz"]
    #
    # Modifying the returned column values does not modify the table:
    #   col[0] = 'bat'
    #   col # => ["bat", "bar", "baz"]
    #   table['Name'] # => ["foo", "bar", "baz"]
    #
    # Returns an \Array of +nil+ values if there is no such column:
    #   table['Nosuch'] # => [nil, nil, nil]
    def [](index_or_header)
      if @mode == :row or  # by index
         (@mode == :col_or_row and (index_or_header.is_a?(Integer) or index_or_header.is_a?(Range)))
        @table[index_or_header]
      else                 # by header
        @table.map { |row| row[index_or_header] }
      end
    end

    # :call-seq:
    #   table[n] = row -> row
    #   table[n] = field_or_array_of_fields -> field_or_array_of_fields
    #   table[header] = field_or_array_of_fields -> field_or_array_of_fields
    #
    # Puts data onto the table.
    #
    # ---
    #
    # Set a \Row by Its \Integer Index::
    # - Form: <tt>table[n] = row</tt>, +n+ an \Integer,
    #   +row+ a \CSV::Row instance or an \Array of fields.
    # - Access mode: <tt>:row</tt> or <tt>:col_or_row</tt>.
    # - Return value: +row+.
    #
    # If the row exists, it is replaced:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   new_row = CSV::Row.new(['Name', 'Value'], ['bat', 3])
    #   table.by_row! # => #<CSV::Table mode:row row_count:4>
    #   return_value = table[0] = new_row
    #   return_value.equal?(new_row) # => true # Returned the row
    #   table[0].to_h # => {"Name"=>"bat", "Value"=>3}
    #
    # With access mode <tt>:col_or_row</tt>:
    #   table.by_col_or_row! # => #<CSV::Table mode:col_or_row row_count:4>
    #   table[0] = CSV::Row.new(['Name', 'Value'], ['bam', 4])
    #   table[0].to_h # => {"Name"=>"bam", "Value"=>4}
    #
    # With an \Array instead of a \CSV::Row, inherits headers from the table:
    #   array = ['bad', 5]
    #   return_value = table[0] = array
    #   return_value.equal?(array) # => true # Returned the array
    #   table[0].to_h # => {"Name"=>"bad", "Value"=>5}
    #
    # If the row does not exist, extends the table by adding rows:
    # assigns rows with +nil+ as needed:
    #   table.size # => 3
    #   table[5] = ['bag', 6]
    #   table.size # => 6
    #   table[3] # => nil
    #   table[4]# => nil
    #   table[5].to_h # => {"Name"=>"bag", "Value"=>6}
    #
    # Note that the +nil+ rows are actually +nil+, not a row of +nil+ fields.
    #
    # ---
    #
    # Set a Column by Its \Integer Index::
    # - Form: <tt>table[n] = array_of_fields</tt>, +n+ an \Integer,
    #   +array_of_fields+ an \Array of \String fields.
    # - Access mode: <tt>:col</tt>.
    # - Return value: +array_of_fields+.
    #
    # If the column exists, it is replaced:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   new_col = [3, 4, 5]
    #   table.by_col! # => #<CSV::Table mode:col row_count:4>
    #   return_value = table[1] = new_col
    #   return_value.equal?(new_col) # => true # Returned the column
    #   table[1] # => [3, 4, 5]
    #   # The rows, as revised:
    #   table.by_row! # => #<CSV::Table mode:row row_count:4>
    #   table[0].to_h # => {"Name"=>"foo", "Value"=>3}
    #   table[1].to_h # => {"Name"=>"bar", "Value"=>4}
    #   table[2].to_h # => {"Name"=>"baz", "Value"=>5}
    #   table.by_col! # => #<CSV::Table mode:col row_count:4>
    #
    # If there are too few values, fills with +nil+ values:
    #   table[1] = [0]
    #   table[1] # => [0, nil, nil]
    #
    # If there are too many values, ignores the extra values:
    #   table[1] = [0, 1, 2, 3, 4]
    #   table[1] # => [0, 1, 2]
    #
    # If a single value is given, replaces all fields in the column with that value:
    #   table[1] = 'bat'
    #   table[1] # => ["bat", "bat", "bat"]
    #
    # ---
    #
    # Set a Column by Its \String Header::
    # - Form: <tt>table[header] = field_or_array_of_fields</tt>,
    #   +header+ a \String header, +field_or_array_of_fields+ a field value
    #   or an \Array of \String fields.
    # - Access mode: <tt>:col</tt> or <tt>:col_or_row</tt>.
    # - Return value: +field_or_array_of_fields+.
    #
    # If the column exists, it is replaced:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   new_col = [3, 4, 5]
    #   table.by_col! # => #<CSV::Table mode:col row_count:4>
    #   return_value = table['Value'] = new_col
    #   return_value.equal?(new_col) # => true # Returned the column
    #   table['Value'] # => [3, 4, 5]
    #   # The rows, as revised:
    #   table.by_row! # => #<CSV::Table mode:row row_count:4>
    #   table[0].to_h # => {"Name"=>"foo", "Value"=>3}
    #   table[1].to_h # => {"Name"=>"bar", "Value"=>4}
    #   table[2].to_h # => {"Name"=>"baz", "Value"=>5}
    #   table.by_col! # => #<CSV::Table mode:col row_count:4>
    #
    # If there are too few values, fills with +nil+ values:
    #   table['Value'] = [0]
    #   table['Value'] # => [0, nil, nil]
    #
    # If there are too many values, ignores the extra values:
    #   table['Value'] = [0, 1, 2, 3, 4]
    #   table['Value'] # => [0, 1, 2]
    #
    # If the column does not exist, extends the table by adding columns:
    #   table['Note'] = ['x', 'y', 'z']
    #   table['Note'] # => ["x", "y", "z"]
    #   # The rows, as revised:
    #   table.by_row!
    #   table[0].to_h # => {"Name"=>"foo", "Value"=>0, "Note"=>"x"}
    #   table[1].to_h # => {"Name"=>"bar", "Value"=>1, "Note"=>"y"}
    #   table[2].to_h # => {"Name"=>"baz", "Value"=>2, "Note"=>"z"}
    #   table.by_col!
    #
    # If a single value is given, replaces all fields in the column with that value:
    #   table['Value'] = 'bat'
    #   table['Value'] # => ["bat", "bat", "bat"]
    def []=(index_or_header, value)
      if @mode == :row or  # by index
         (@mode == :col_or_row and index_or_header.is_a? Integer)
        if value.is_a? Array
          @table[index_or_header] = Row.new(headers, value)
        else
          @table[index_or_header] = value
        end
      else                 # set column
        unless index_or_header.is_a? Integer
          index = @headers.index(index_or_header) || @headers.size
          @headers[index] = index_or_header
        end
        if value.is_a? Array  # multiple values
          @table.each_with_index do |row, i|
            if row.header_row?
              row[index_or_header] = index_or_header
            else
              row[index_or_header] = value[i]
            end
          end
        else                  # repeated value
          @table.each do |row|
            if row.header_row?
              row[index_or_header] = index_or_header
            else
              row[index_or_header] = value
            end
          end
        end
      end
    end

    # :call-seq:
    #   table.values_at(*indexes) -> array_of_rows
    #   table.values_at(*headers) -> array_of_columns_data
    #
    # If the access mode is <tt>:row</tt> or <tt>:col_or_row</tt>,
    # and each argument is either an \Integer or a \Range,
    # returns rows.
    # Otherwise, returns columns data.
    #
    # In either case, the returned values are in the order
    # specified by the arguments.  Arguments may be repeated.
    #
    # ---
    #
    # Returns rows as an \Array of \CSV::Row objects.
    #
    # No argument:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   table.values_at # => []
    #
    # One index:
    #   values = table.values_at(0)
    #   values # => [#<CSV::Row "Name":"foo" "Value":"0">]
    #
    # Two indexes:
    #   values = table.values_at(2, 0)
    #   values # => [#<CSV::Row "Name":"baz" "Value":"2">, #<CSV::Row "Name":"foo" "Value":"0">]
    #
    # One \Range:
    #   values = table.values_at(1..2)
    #   values # => [#<CSV::Row "Name":"bar" "Value":"1">, #<CSV::Row "Name":"baz" "Value":"2">]
    #
    # \Ranges and indexes:
    #   values = table.values_at(0..1, 1..2, 0, 2)
    #   pp values
    # Output:
    #   [#<CSV::Row "Name":"foo" "Value":"0">,
    #    #<CSV::Row "Name":"bar" "Value":"1">,
    #    #<CSV::Row "Name":"bar" "Value":"1">,
    #    #<CSV::Row "Name":"baz" "Value":"2">,
    #    #<CSV::Row "Name":"foo" "Value":"0">,
    #    #<CSV::Row "Name":"baz" "Value":"2">]
    #
    # ---
    #
    # Returns columns data as row Arrays,
    # each consisting of the specified columns data for that row:
    #   values = table.values_at('Name')
    #   values # => [["foo"], ["bar"], ["baz"]]
    #   values = table.values_at('Value', 'Name')
    #   values # => [["0", "foo"], ["1", "bar"], ["2", "baz"]]
    def values_at(*indices_or_headers)
      if @mode == :row or  # by indices
         ( @mode == :col_or_row and indices_or_headers.all? do |index|
                                      index.is_a?(Integer)         or
                                      ( index.is_a?(Range)         and
                                        index.first.is_a?(Integer) and
                                        index.last.is_a?(Integer) )
                                    end )
        @table.values_at(*indices_or_headers)
      else                 # by headers
        @table.map { |row| row.values_at(*indices_or_headers) }
      end
    end

    # :call-seq:
    #   table << row_or_array -> self
    #
    # If +row_or_array+ is a \CSV::Row object,
    # it is appended to the table:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   table << CSV::Row.new(table.headers, ['bat', 3])
    #   table[3] # => #<CSV::Row "Name":"bat" "Value":3>
    #
    # If +row_or_array+ is an \Array, it is used to create a new
    # \CSV::Row object which is then appended to the table:
    #   table << ['bam', 4]
    #   table[4] # => #<CSV::Row "Name":"bam" "Value":4>
    def <<(row_or_array)
      if row_or_array.is_a? Array  # append Array
        @table << Row.new(headers, row_or_array)
      else                         # append Row
        @table << row_or_array
      end

      self # for chaining
    end

    #
    # :call-seq:
    #   table.push(*rows_or_arrays) -> self
    #
    # A shortcut for appending multiple rows. Equivalent to:
    #   rows.each {|row| self << row }
    #
    # Each argument may be either a \CSV::Row object or an \Array:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   rows = [
    #     CSV::Row.new(table.headers, ['bat', 3]),
    #     ['bam', 4]
    #   ]
    #   table.push(*rows)
    #   table[3..4] # => [#<CSV::Row "Name":"bat" "Value":3>, #<CSV::Row "Name":"bam" "Value":4>]
    def push(*rows)
      rows.each { |row| self << row }

      self # for chaining
    end

    # :call-seq:
    #   table.delete(*indexes) -> deleted_values
    #   table.delete(*headers) -> deleted_values
    #
    # If the access mode is <tt>:row</tt> or <tt>:col_or_row</tt>,
    # and each argument is either an \Integer or a \Range,
    # returns deleted rows.
    # Otherwise, returns deleted columns data.
    #
    # In either case, the returned values are in the order
    # specified by the arguments.  Arguments may be repeated.
    #
    # ---
    #
    # Returns rows as an \Array of \CSV::Row objects.
    #
    # One index:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   deleted_values = table.delete(0)
    #   deleted_values # => [#<CSV::Row "Name":"foo" "Value":"0">]
    #
    # Two indexes:
    #   table = CSV.parse(source, headers: true)
    #   deleted_values = table.delete(2, 0)
    #   deleted_values # => [#<CSV::Row "Name":"baz" "Value":"2">, #<CSV::Row "Name":"foo" "Value":"0">]
    #
    # ---
    #
    # Returns columns data as column Arrays.
    #
    # One header:
    #   table = CSV.parse(source, headers: true)
    #   deleted_values = table.delete('Name')
    #   deleted_values # => ["foo", "bar", "baz"]
    #
    # Two headers:
    #   table = CSV.parse(source, headers: true)
    #   deleted_values = table.delete('Value', 'Name')
    #   deleted_values # => [["0", "1", "2"], ["foo", "bar", "baz"]]
    def delete(*indexes_or_headers)
      if indexes_or_headers.empty?
        raise ArgumentError, "wrong number of arguments (given 0, expected 1+)"
      end
      deleted_values = indexes_or_headers.map do |index_or_header|
        if @mode == :row or  # by index
            (@mode == :col_or_row and index_or_header.is_a? Integer)
          @table.delete_at(index_or_header)
        else                 # by header
          if index_or_header.is_a? Integer
            @headers.delete_at(index_or_header)
          else
            @headers.delete(index_or_header)
          end
          @table.map { |row| row.delete(index_or_header).last }
        end
      end
      if indexes_or_headers.size == 1
        deleted_values[0]
      else
        deleted_values
      end
    end

    # :call-seq:
    #   table.delete_if {|row_or_column| ... } -> self
    #
    # Removes rows or columns for which the block returns a truthy value;
    # returns +self+.
    #
    # Removes rows when the access mode is <tt>:row</tt> or <tt>:col_or_row</tt>;
    # calls the block with each \CSV::Row object:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   table.by_row! # => #<CSV::Table mode:row row_count:4>
    #   table.size # => 3
    #   table.delete_if {|row| row['Name'].start_with?('b') }
    #   table.size # => 1
    #
    # Removes columns when the access mode is <tt>:col</tt>;
    # calls the block with each column as a 2-element array
    # containing the header and an \Array of column fields:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   table.by_col! # => #<CSV::Table mode:col row_count:4>
    #   table.headers.size # => 2
    #   table.delete_if {|column_data| column_data[1].include?('2') }
    #   table.headers.size # => 1
    #
    # Returns a new \Enumerator if no block is given:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   table.delete_if # => #<Enumerator: #<CSV::Table mode:col_or_row row_count:4>:delete_if>
    def delete_if(&block)
      return enum_for(__method__) { @mode == :row or @mode == :col_or_row ? size : headers.size } unless block_given?

      if @mode == :row or @mode == :col_or_row  # by index
        @table.delete_if(&block)
      else                                      # by header
        deleted = []
        headers.each do |header|
          deleted << delete(header) if yield([header, self[header]])
        end
      end

      self # for chaining
    end

    include Enumerable

    # :call-seq:
    #  table.each {|row_or_column| ... ) -> self
    #
    # Calls the block with each row or column; returns +self+.
    #
    # When the access mode is <tt>:row</tt> or <tt>:col_or_row</tt>,
    # calls the block with each \CSV::Row object:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   table.by_row! # => #<CSV::Table mode:row row_count:4>
    #   table.each {|row| p row }
    # Output:
    #   #<CSV::Row "Name":"foo" "Value":"0">
    #   #<CSV::Row "Name":"bar" "Value":"1">
    #   #<CSV::Row "Name":"baz" "Value":"2">
    #
    # When the access mode is <tt>:col</tt>,
    # calls the block with each column as a 2-element array
    # containing the header and an \Array of column fields:
    #   table.by_col! # => #<CSV::Table mode:col row_count:4>
    #   table.each {|column_data| p column_data }
    # Output:
    #   ["Name", ["foo", "bar", "baz"]]
    #   ["Value", ["0", "1", "2"]]
    #
    # Returns a new \Enumerator if no block is given:
    #   table.each # => #<Enumerator: #<CSV::Table mode:col row_count:4>:each>
    def each(&block)
      return enum_for(__method__) { @mode == :col ? headers.size : size } unless block_given?

      if @mode == :col
        headers.each.with_index do |header, i|
          yield([header, @table.map {|row| row[header, i]}])
        end
      else
        @table.each(&block)
      end

      self # for chaining
    end

    # :call-seq:
    #   table == other_table -> true or false
    #
    # Returns +true+ if all each row of +self+ <tt>==</tt>
    # the corresponding row of +other_table+, otherwise, +false+.
    #
    # The access mode does no affect the result.
    #
    # Equal tables:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   other_table = CSV.parse(source, headers: true)
    #   table == other_table # => true
    #
    # Different row count:
    #   other_table.delete(2)
    #   table == other_table # => false
    #
    # Different last row:
    #   other_table << ['bat', 3]
    #   table == other_table # => false
    def ==(other)
      return @table == other.table if other.is_a? CSV::Table
      @table == other
    end

    # :call-seq:
    #   table.to_a -> array_of_arrays
    #
    # Returns the table as an \Array of \Arrays;
    # the headers are in the first row:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   table.to_a # => [["Name", "Value"], ["foo", "0"], ["bar", "1"], ["baz", "2"]]
    def to_a
      array = [headers]
      @table.each do |row|
        array.push(row.fields) unless row.header_row?
      end

      array
    end

    # :call-seq:
    #   table.to_csv(**options) -> csv_string
    #
    # Returns the table as \CSV string.
    # See {Options for Generating}[../CSV.html#class-CSV-label-Options+for+Generating].
    #
    # Defaults option +write_headers+ to +true+:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   table.to_csv # => "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #
    # Omits the headers if option +write_headers+ is given as +false+
    # (see {Option +write_headers+}[../CSV.html#class-CSV-label-Option+write_headers]):
    #   table.to_csv(write_headers: false) # => "foo,0\nbar,1\nbaz,2\n"
    #
    # Limit rows if option +limit+ is given like +2+:
    #   table.to_csv(limit: 2) # => "Name,Value\nfoo,0\nbar,1\n"
    def to_csv(write_headers: true, limit: nil, **options)
      array = write_headers ? [headers.to_csv(**options)] : []
      limit ||= @table.size
      limit = @table.size + 1 + limit if limit < 0
      limit = 0 if limit < 0
      @table.first(limit).each do |row|
        array.push(row.fields.to_csv(**options)) unless row.header_row?
      end

      array.join("")
    end
    alias_method :to_s, :to_csv

    #
    # Extracts the nested value specified by the sequence of +index+ or +header+ objects by calling dig at each step,
    # returning nil if any intermediate step is nil.
    #
    def dig(index_or_header, *index_or_headers)
      value = self[index_or_header]
      if value.nil?
        nil
      elsif index_or_headers.empty?
        value
      else
        unless value.respond_to?(:dig)
          raise TypeError, "#{value.class} does not have \#dig method"
        end
        value.dig(*index_or_headers)
      end
    end

    # :call-seq:
    #   table.inspect => string
    #
    # Returns a <tt>US-ASCII</tt>-encoded \String showing table:
    # - Class: <tt>CSV::Table</tt>.
    # - Access mode: <tt>:row</tt>, <tt>:col</tt>, or <tt>:col_or_row</tt>.
    # - Size:  Row count, including the header row.
    #
    # Example:
    #   source = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   table = CSV.parse(source, headers: true)
    #   table.inspect # => "#<CSV::Table mode:col_or_row row_count:4>\nName,Value\nfoo,0\nbar,1\nbaz,2\n"
    #
    def inspect
      inspected = +"#<#{self.class} mode:#{@mode} row_count:#{to_a.size}>"
      summary = to_csv(limit: 5)
      inspected << "\n" << summary if summary.encoding.ascii_compatible?
      inspected
    end
  end
end
PK}$[��P�"ruby/csv/input_record_separator.rbnu�[���require "English"
require "stringio"

class CSV
  module InputRecordSeparator
    class << self
      if RUBY_VERSION >= "3.0.0"
        def value
          "\n"
        end
      else
        def value
          $INPUT_RECORD_SEPARATOR
        end
      end
    end
  end
end
PK}$[����yyruby/csv/match_p.rbnu�[���# frozen_string_literal: true

# This provides String#match? and Regexp#match? for Ruby 2.3.
unless String.method_defined?(:match?)
  class CSV
    module MatchP
      refine String do
        def match?(pattern)
          self =~ pattern
        end
      end

      refine Regexp do
        def match?(string)
          self =~ string
        end
      end
    end
  end
end
PK}$[�����ruby/csv/core_ext/string.rbnu�[���class String # :nodoc:
  # Equivalent to CSV::parse_line(self, options)
  #
  #   "CSV,data".parse_csv
  #     #=> ["CSV", "data"]
  def parse_csv(**options)
    CSV.parse_line(self, **options)
  end
end
PK}$[��z��ruby/csv/core_ext/array.rbnu�[���class Array # :nodoc:
  # Equivalent to CSV::generate_line(self, options)
  #
  #   ["CSV", "data"].to_csv
  #     #=> "CSV,data\n"
  def to_csv(**options)
    CSV.generate_line(self, **options)
  end
end
PK}$['�xxruby/csv/writer.rbnu�[���# frozen_string_literal: true

require_relative "input_record_separator"
require_relative "row"

class CSV
  # Note: Don't use this class directly. This is an internal class.
  class Writer
    #
    # A CSV::Writer receives an output, prepares the header, format and output.
    # It allows us to write new rows in the object and rewind it.
    #
    attr_reader :lineno
    attr_reader :headers

    def initialize(output, options)
      @output = output
      @options = options
      @lineno = 0
      @fields_converter = nil
      prepare
      if @options[:write_headers] and @headers
        self << @headers
      end
      @fields_converter = @options[:fields_converter]
    end

    #
    # Adds a new row
    #
    def <<(row)
      case row
      when Row
        row = row.fields
      when Hash
        row = @headers.collect {|header| row[header]}
      end

      @headers ||= row if @use_headers
      @lineno += 1

      if @fields_converter
        quoted_fields = [false] * row.size
        row = @fields_converter.convert(row, nil, lineno, quoted_fields)
      end

      i = -1
      converted_row = row.collect do |field|
        i += 1
        quote(field, i)
      end
      line = converted_row.join(@column_separator) + @row_separator
      if @output_encoding
        line = line.encode(@output_encoding)
      end
      @output << line

      self
    end

    #
    # Winds back to the beginning
    #
    def rewind
      @lineno = 0
      @headers = nil if @options[:headers].nil?
    end

    private
    def prepare
      @encoding = @options[:encoding]

      prepare_header
      prepare_format
      prepare_output
    end

    def prepare_header
      headers = @options[:headers]
      case headers
      when Array
        @headers = headers
        @use_headers = true
      when String
        @headers = CSV.parse_line(headers,
                                  col_sep: @options[:column_separator],
                                  row_sep: @options[:row_separator],
                                  quote_char: @options[:quote_character])
        @use_headers = true
      when true
        @headers = nil
        @use_headers = true
      else
        @headers = nil
        @use_headers = false
      end
      return unless @headers

      converter = @options[:header_fields_converter]
      @headers = converter.convert(@headers, nil, 0, [])
      @headers.each do |header|
        header.freeze if header.is_a?(String)
      end
    end

    def prepare_force_quotes_fields(force_quotes)
      @force_quotes_fields = {}
      force_quotes.each do |name_or_index|
        case name_or_index
        when Integer
          index = name_or_index
          @force_quotes_fields[index] = true
        when String, Symbol
          name = name_or_index.to_s
          if @headers.nil?
            message = ":headers is required when you use field name " +
                      "in :force_quotes: " +
                      "#{name_or_index.inspect}: #{force_quotes.inspect}"
            raise ArgumentError, message
          end
          index = @headers.index(name)
          next if index.nil?
          @force_quotes_fields[index] = true
        else
          message = ":force_quotes element must be " +
                    "field index or field name: " +
                    "#{name_or_index.inspect}: #{force_quotes.inspect}"
          raise ArgumentError, message
        end
      end
    end

    def prepare_format
      @column_separator = @options[:column_separator].to_s.encode(@encoding)
      row_separator = @options[:row_separator]
      if row_separator == :auto
        @row_separator = InputRecordSeparator.value.encode(@encoding)
      else
        @row_separator = row_separator.to_s.encode(@encoding)
      end
      @quote_character = @options[:quote_character]
      force_quotes = @options[:force_quotes]
      if force_quotes.is_a?(Array)
        prepare_force_quotes_fields(force_quotes)
        @force_quotes = false
      elsif force_quotes
        @force_quotes_fields = nil
        @force_quotes = true
      else
        @force_quotes_fields = nil
        @force_quotes = false
      end
      unless @force_quotes
        @quotable_pattern =
          Regexp.new("[\r\n".encode(@encoding) +
                     Regexp.escape(@column_separator) +
                     Regexp.escape(@quote_character.encode(@encoding)) +
                     "]".encode(@encoding))
      end
      @quote_empty = @options.fetch(:quote_empty, true)
    end

    def prepare_output
      @output_encoding = nil
      return unless @output.is_a?(StringIO)

      output_encoding = @output.internal_encoding || @output.external_encoding
      if @encoding != output_encoding
        if @options[:force_encoding]
          @output_encoding = output_encoding
        else
          compatible_encoding = Encoding.compatible?(@encoding, output_encoding)
          if compatible_encoding
            @output.set_encoding(compatible_encoding)
            @output.seek(0, IO::SEEK_END)
          end
        end
      end
    end

    def quote_field(field)
      field = String(field)
      encoded_quote_character = @quote_character.encode(field.encoding)
      encoded_quote_character +
        field.gsub(encoded_quote_character,
                   encoded_quote_character * 2) +
        encoded_quote_character
    end

    def quote(field, i)
      if @force_quotes
        quote_field(field)
      elsif @force_quotes_fields and @force_quotes_fields[i]
        quote_field(field)
      else
        if field.nil?  # represent +nil+ fields as empty unquoted fields
          ""
        else
          field = String(field)  # Stringify fields
          # represent empty fields as empty quoted fields
          if (@quote_empty and field.empty?) or (field.valid_encoding? and @quotable_pattern.match?(field))
            quote_field(field)
          else
            field  # unquoted field
          end
        end
      end
    end
  end
end
PK}$[�#vvruby/csv/delete_suffix.rbnu�[���# frozen_string_literal: true

# This provides String#delete_suffix? for Ruby 2.4.
unless String.method_defined?(:delete_suffix)
  class CSV
    module DeleteSuffix
      refine String do
        def delete_suffix(suffix)
          if end_with?(suffix)
            self[0...-suffix.size]
          else
            self
          end
        end
      end
    end
  end
end
PK}$[��xȒȒruby/csv/parser.rbnu�[���# frozen_string_literal: true

require "strscan"

require_relative "input_record_separator"
require_relative "row"
require_relative "table"

class CSV
  # Note: Don't use this class directly. This is an internal class.
  class Parser
    #
    # A CSV::Parser is m17n aware. The parser works in the Encoding of the IO
    # or String object being read from or written to. Your data is never transcoded
    # (unless you ask Ruby to transcode it for you) and will literally be parsed in
    # the Encoding it is in. Thus CSV will return Arrays or Rows of Strings in the
    # Encoding of your data. This is accomplished by transcoding the parser itself
    # into your Encoding.
    #

    # Raised when encoding is invalid.
    class InvalidEncoding < StandardError
    end

    # Raised when unexpected case is happen.
    class UnexpectedError < StandardError
    end

    #
    # CSV::Scanner receives a CSV output, scans it and return the content.
    # It also controls the life cycle of the object with its methods +keep_start+,
    # +keep_end+, +keep_back+, +keep_drop+.
    #
    # Uses StringScanner (the official strscan gem). Strscan provides lexical
    # scanning operations on a String. We inherit its object and take advantage
    # on the methods. For more information, please visit:
    # https://ruby-doc.org/stdlib-2.6.1/libdoc/strscan/rdoc/StringScanner.html
    #
    class Scanner < StringScanner
      alias_method :scan_all, :scan

      def initialize(*args)
        super
        @keeps = []
      end

      def each_line(row_separator)
        position = pos
        rest.each_line(row_separator) do |line|
          position += line.bytesize
          self.pos = position
          yield(line)
        end
      end

      def keep_start
        @keeps.push(pos)
      end

      def keep_end
        start = @keeps.pop
        string.byteslice(start, pos - start)
      end

      def keep_back
        self.pos = @keeps.pop
      end

      def keep_drop
        @keeps.pop
      end
    end

    #
    # CSV::InputsScanner receives IO inputs, encoding and the chunk_size.
    # It also controls the life cycle of the object with its methods +keep_start+,
    # +keep_end+, +keep_back+, +keep_drop+.
    #
    # CSV::InputsScanner.scan() tries to match with pattern at the current position.
    # If there's a match, the scanner advances the "scan pointer" and returns the matched string.
    # Otherwise, the scanner returns nil.
    #
    # CSV::InputsScanner.rest() returns the "rest" of the string (i.e. everything after the scan pointer).
    # If there is no more data (eos? = true), it returns "".
    #
    class InputsScanner
      def initialize(inputs, encoding, row_separator, chunk_size: 8192)
        @inputs = inputs.dup
        @encoding = encoding
        @row_separator = row_separator
        @chunk_size = chunk_size
        @last_scanner = @inputs.empty?
        @keeps = []
        read_chunk
      end

      def each_line(row_separator)
        return enum_for(__method__, row_separator) unless block_given?
        buffer = nil
        input = @scanner.rest
        position = @scanner.pos
        offset = 0
        n_row_separator_chars = row_separator.size
        # trace(__method__, :start, line, input)
        while true
          input.each_line(row_separator) do |line|
            @scanner.pos += line.bytesize
            if buffer
              if n_row_separator_chars == 2 and
                buffer.end_with?(row_separator[0]) and
                line.start_with?(row_separator[1])
                buffer << line[0]
                line = line[1..-1]
                position += buffer.bytesize + offset
                @scanner.pos = position
                offset = 0
                yield(buffer)
                buffer = nil
                next if line.empty?
              else
                buffer << line
                line = buffer
                buffer = nil
              end
            end
            if line.end_with?(row_separator)
              position += line.bytesize + offset
              @scanner.pos = position
              offset = 0
              yield(line)
            else
              buffer = line
            end
          end
          break unless read_chunk
          input = @scanner.rest
          position = @scanner.pos
          offset = -buffer.bytesize if buffer
        end
        yield(buffer) if buffer
      end

      def scan(pattern)
        # trace(__method__, pattern, :start)
        value = @scanner.scan(pattern)
        # trace(__method__, pattern, :done, :last, value) if @last_scanner
        return value if @last_scanner

        read_chunk if value and @scanner.eos?
        # trace(__method__, pattern, :done, value)
        value
      end

      def scan_all(pattern)
        # trace(__method__, pattern, :start)
        value = @scanner.scan(pattern)
        # trace(__method__, pattern, :done, :last, value) if @last_scanner
        return value if @last_scanner

        return nil if value.nil?
        while @scanner.eos? and read_chunk and (sub_value = @scanner.scan(pattern))
          # trace(__method__, pattern, :sub, sub_value)
          value << sub_value
        end
        # trace(__method__, pattern, :done, value)
        value
      end

      def eos?
        @scanner.eos?
      end

      def keep_start
        # trace(__method__, :start)
        adjust_last_keep
        @keeps.push([@scanner, @scanner.pos, nil])
        # trace(__method__, :done)
      end

      def keep_end
        # trace(__method__, :start)
        scanner, start, buffer = @keeps.pop
        if scanner == @scanner
          keep = @scanner.string.byteslice(start, @scanner.pos - start)
        else
          keep = @scanner.string.byteslice(0, @scanner.pos)
        end
        if buffer
          buffer << keep
          keep = buffer
        end
        # trace(__method__, :done, keep)
        keep
      end

      def keep_back
        # trace(__method__, :start)
        scanner, start, buffer = @keeps.pop
        if buffer
          # trace(__method__, :rescan, start, buffer)
          string = @scanner.string
          if scanner == @scanner
            keep = string.byteslice(start, string.bytesize - start)
          else
            keep = string
          end
          if keep and not keep.empty?
            @inputs.unshift(StringIO.new(keep))
            @last_scanner = false
          end
          @scanner = StringScanner.new(buffer)
        else
          if @scanner != scanner
            message = "scanners are different but no buffer: "
            message += "#{@scanner.inspect}(#{@scanner.object_id}): "
            message += "#{scanner.inspect}(#{scanner.object_id})"
            raise UnexpectedError, message
          end
          # trace(__method__, :repos, start, buffer)
          @scanner.pos = start
        end
        read_chunk if @scanner.eos?
      end

      def keep_drop
        _, _, buffer = @keeps.pop
        # trace(__method__, :done, :empty) unless buffer
        return unless buffer

        last_keep = @keeps.last
        # trace(__method__, :done, :no_last_keep) unless last_keep
        return unless last_keep

        if last_keep[2]
          last_keep[2] << buffer
        else
          last_keep[2] = buffer
        end
        # trace(__method__, :done)
      end

      def rest
        @scanner.rest
      end

      def check(pattern)
        @scanner.check(pattern)
      end

      private
      def trace(*args)
        pp([*args, @scanner, @scanner&.string, @scanner&.pos, @keeps])
      end

      def adjust_last_keep
        # trace(__method__, :start)

        keep = @keeps.last
        # trace(__method__, :done, :empty) if keep.nil?
        return if keep.nil?

        scanner, start, buffer = keep
        string = @scanner.string
        if @scanner != scanner
          start = 0
        end
        if start == 0 and @scanner.eos?
          keep_data = string
        else
          keep_data = string.byteslice(start, @scanner.pos - start)
        end
        if keep_data
          if buffer
            buffer << keep_data
          else
            keep[2] = keep_data.dup
          end
        end

        # trace(__method__, :done)
      end

      def read_chunk
        return false if @last_scanner

        adjust_last_keep

        input = @inputs.first
        case input
        when StringIO
          string = input.read
          raise InvalidEncoding unless string.valid_encoding?
          # trace(__method__, :stringio, string)
          @scanner = StringScanner.new(string)
          @inputs.shift
          @last_scanner = @inputs.empty?
          true
        else
          chunk = input.gets(@row_separator, @chunk_size)
          if chunk
            raise InvalidEncoding unless chunk.valid_encoding?
            # trace(__method__, :chunk, chunk)
            @scanner = StringScanner.new(chunk)
            if input.respond_to?(:eof?) and input.eof?
              @inputs.shift
              @last_scanner = @inputs.empty?
            end
            true
          else
            # trace(__method__, :no_chunk)
            @scanner = StringScanner.new("".encode(@encoding))
            @inputs.shift
            @last_scanner = @inputs.empty?
            if @last_scanner
              false
            else
              read_chunk
            end
          end
        end
      end
    end

    def initialize(input, options)
      @input = input
      @options = options
      @samples = []

      prepare
    end

    def column_separator
      @column_separator
    end

    def row_separator
      @row_separator
    end

    def quote_character
      @quote_character
    end

    def field_size_limit
      @max_field_size&.succ
    end

    def max_field_size
      @max_field_size
    end

    def skip_lines
      @skip_lines
    end

    def unconverted_fields?
      @unconverted_fields
    end

    def headers
      @headers
    end

    def header_row?
      @use_headers and @headers.nil?
    end

    def return_headers?
      @return_headers
    end

    def skip_blanks?
      @skip_blanks
    end

    def liberal_parsing?
      @liberal_parsing
    end

    def lineno
      @lineno
    end

    def line
      last_line
    end

    def parse(&block)
      return to_enum(__method__) unless block_given?

      if @return_headers and @headers and @raw_headers
        headers = Row.new(@headers, @raw_headers, true)
        if @unconverted_fields
          headers = add_unconverted_fields(headers, [])
        end
        yield headers
      end

      begin
        @scanner ||= build_scanner
        if quote_character.nil?
          parse_no_quote(&block)
        elsif @need_robust_parsing
          parse_quotable_robust(&block)
        else
          parse_quotable_loose(&block)
        end
      rescue InvalidEncoding
        if @scanner
          ignore_broken_line
          lineno = @lineno
        else
          lineno = @lineno + 1
        end
        message = "Invalid byte sequence in #{@encoding}"
        raise MalformedCSVError.new(message, lineno)
      rescue UnexpectedError => error
        if @scanner
          ignore_broken_line
          lineno = @lineno
        else
          lineno = @lineno + 1
        end
        message = "This should not be happen: #{error.message}: "
        message += "Please report this to https://github.com/ruby/csv/issues"
        raise MalformedCSVError.new(message, lineno)
      end
    end

    def use_headers?
      @use_headers
    end

    private
    # A set of tasks to prepare the file in order to parse it
    def prepare
      prepare_variable
      prepare_quote_character
      prepare_backslash
      prepare_skip_lines
      prepare_strip
      prepare_separators
      validate_strip_and_col_sep_options
      prepare_quoted
      prepare_unquoted
      prepare_line
      prepare_header
      prepare_parser
    end

    def prepare_variable
      @need_robust_parsing = false
      @encoding = @options[:encoding]
      liberal_parsing = @options[:liberal_parsing]
      if liberal_parsing
        @liberal_parsing = true
        if liberal_parsing.is_a?(Hash)
          @double_quote_outside_quote =
            liberal_parsing[:double_quote_outside_quote]
          @backslash_quote = liberal_parsing[:backslash_quote]
        else
          @double_quote_outside_quote = false
          @backslash_quote = false
        end
        @need_robust_parsing = true
      else
        @liberal_parsing = false
        @backslash_quote = false
      end
      @unconverted_fields = @options[:unconverted_fields]
      @max_field_size = @options[:max_field_size]
      @skip_blanks = @options[:skip_blanks]
      @fields_converter = @options[:fields_converter]
      @header_fields_converter = @options[:header_fields_converter]
    end

    def prepare_quote_character
      @quote_character = @options[:quote_character]
      if @quote_character.nil?
        @escaped_quote_character = nil
        @escaped_quote = nil
      else
        @quote_character = @quote_character.to_s.encode(@encoding)
        if @quote_character.length != 1
          message = ":quote_char has to be nil or a single character String"
          raise ArgumentError, message
        end
        @double_quote_character = @quote_character * 2
        @escaped_quote_character = Regexp.escape(@quote_character)
        @escaped_quote = Regexp.new(@escaped_quote_character)
      end
    end

    def prepare_backslash
      return unless @backslash_quote

      @backslash_character = "\\".encode(@encoding)

      @escaped_backslash_character = Regexp.escape(@backslash_character)
      @escaped_backslash = Regexp.new(@escaped_backslash_character)
      if @quote_character.nil?
        @backslash_quote_character = nil
      else
        @backslash_quote_character =
          @backslash_character + @escaped_quote_character
      end
    end

    def prepare_skip_lines
      skip_lines = @options[:skip_lines]
      case skip_lines
      when String
        @skip_lines = skip_lines.encode(@encoding)
      when Regexp, nil
        @skip_lines = skip_lines
      else
        unless skip_lines.respond_to?(:match)
          message =
            ":skip_lines has to respond to \#match: #{skip_lines.inspect}"
          raise ArgumentError, message
        end
        @skip_lines = skip_lines
      end
    end

    def prepare_strip
      @strip = @options[:strip]
      @escaped_strip = nil
      @strip_value = nil
      @rstrip_value = nil
      if @strip.is_a?(String)
        case @strip.length
        when 0
          raise ArgumentError, ":strip must not be an empty String"
        when 1
          # ok
        else
          raise ArgumentError, ":strip doesn't support 2 or more characters yet"
        end
        @strip = @strip.encode(@encoding)
        @escaped_strip = Regexp.escape(@strip)
        if @quote_character
          @strip_value = Regexp.new(@escaped_strip +
                                    "+".encode(@encoding))
          @rstrip_value = Regexp.new(@escaped_strip +
                                     "+\\z".encode(@encoding))
        end
        @need_robust_parsing = true
      elsif @strip
        strip_values = " \t\f\v"
        @escaped_strip = strip_values.encode(@encoding)
        if @quote_character
          @strip_value = Regexp.new("[#{strip_values}]+".encode(@encoding))
          @rstrip_value = Regexp.new("[#{strip_values}]+\\z".encode(@encoding))
        end
        @need_robust_parsing = true
      end
    end

    begin
      StringScanner.new("x").scan("x")
    rescue TypeError
      STRING_SCANNER_SCAN_ACCEPT_STRING = false
    else
      STRING_SCANNER_SCAN_ACCEPT_STRING = true
    end

    def prepare_separators
      column_separator = @options[:column_separator]
      @column_separator = column_separator.to_s.encode(@encoding)
      if @column_separator.size < 1
        message = ":col_sep must be 1 or more characters: "
        message += column_separator.inspect
        raise ArgumentError, message
      end
      @row_separator =
        resolve_row_separator(@options[:row_separator]).encode(@encoding)

      @escaped_column_separator = Regexp.escape(@column_separator)
      @escaped_first_column_separator = Regexp.escape(@column_separator[0])
      if @column_separator.size > 1
        @column_end = Regexp.new(@escaped_column_separator)
        @column_ends = @column_separator.each_char.collect do |char|
          Regexp.new(Regexp.escape(char))
        end
        @first_column_separators = Regexp.new(@escaped_first_column_separator +
                                              "+".encode(@encoding))
      else
        if STRING_SCANNER_SCAN_ACCEPT_STRING
          @column_end = @column_separator
        else
          @column_end = Regexp.new(@escaped_column_separator)
        end
        @column_ends = nil
        @first_column_separators = nil
      end

      escaped_row_separator = Regexp.escape(@row_separator)
      @row_end = Regexp.new(escaped_row_separator)
      if @row_separator.size > 1
        @row_ends = @row_separator.each_char.collect do |char|
          Regexp.new(Regexp.escape(char))
        end
      else
        @row_ends = nil
      end

      @cr = "\r".encode(@encoding)
      @lf = "\n".encode(@encoding)
      @line_end = Regexp.new("\r\n|\n|\r".encode(@encoding))
      @not_line_end = Regexp.new("[^\r\n]+".encode(@encoding))
    end

    # This method verifies that there are no (obvious) ambiguities with the
    # provided +col_sep+ and +strip+ parsing options. For example, if +col_sep+
    # and +strip+ were both equal to +\t+, then there would be no clear way to
    # parse the input.
    def validate_strip_and_col_sep_options
      return unless @strip

      if @strip.is_a?(String)
        if @column_separator.start_with?(@strip) || @column_separator.end_with?(@strip)
          raise ArgumentError,
                "The provided strip (#{@escaped_strip}) and " \
                "col_sep (#{@escaped_column_separator}) options are incompatible."
        end
      else
        if Regexp.new("\\A[#{@escaped_strip}]|[#{@escaped_strip}]\\z").match?(@column_separator)
          raise ArgumentError,
                "The provided strip (true) and " \
                "col_sep (#{@escaped_column_separator}) options are incompatible."
        end
      end
    end

    def prepare_quoted
      if @quote_character
        @quotes = Regexp.new(@escaped_quote_character +
                             "+".encode(@encoding))
        no_quoted_values = @escaped_quote_character.dup
        if @backslash_quote
          no_quoted_values << @escaped_backslash_character
        end
        @quoted_value = Regexp.new("[^".encode(@encoding) +
                                   no_quoted_values +
                                   "]+".encode(@encoding))
      end
      if @escaped_strip
        @split_column_separator = Regexp.new(@escaped_strip +
                                             "*".encode(@encoding) +
                                             @escaped_column_separator +
                                             @escaped_strip +
                                             "*".encode(@encoding))
      else
        if @column_separator == " ".encode(@encoding)
          @split_column_separator = Regexp.new(@escaped_column_separator)
        else
          @split_column_separator = @column_separator
        end
      end
    end

    def prepare_unquoted
      return if @quote_character.nil?

      no_unquoted_values = "\r\n".encode(@encoding)
      no_unquoted_values << @escaped_first_column_separator
      unless @liberal_parsing
        no_unquoted_values << @escaped_quote_character
      end
      @unquoted_value = Regexp.new("[^".encode(@encoding) +
                                   no_unquoted_values +
                                   "]+".encode(@encoding))
    end

    def resolve_row_separator(separator)
      if separator == :auto
        cr = "\r".encode(@encoding)
        lf = "\n".encode(@encoding)
        if @input.is_a?(StringIO)
          pos = @input.pos
          separator = detect_row_separator(@input.read, cr, lf)
          @input.seek(pos)
        elsif @input.respond_to?(:gets)
          if @input.is_a?(File)
            chunk_size = 32 * 1024
          else
            chunk_size = 1024
          end
          begin
            while separator == :auto
              #
              # if we run out of data, it's probably a single line
              # (ensure will set default value)
              #
              break unless sample = @input.gets(nil, chunk_size)

              # extend sample if we're unsure of the line ending
              if sample.end_with?(cr)
                sample << (@input.gets(nil, 1) || "")
              end

              @samples << sample

              separator = detect_row_separator(sample, cr, lf)
            end
          rescue IOError
            # do nothing:  ensure will set default
          end
        end
        separator = InputRecordSeparator.value if separator == :auto
      end
      separator.to_s.encode(@encoding)
    end

    def detect_row_separator(sample, cr, lf)
      lf_index = sample.index(lf)
      if lf_index
        cr_index = sample[0, lf_index].index(cr)
      else
        cr_index = sample.index(cr)
      end
      if cr_index and lf_index
        if cr_index + 1 == lf_index
          cr + lf
        elsif cr_index < lf_index
          cr
        else
          lf
        end
      elsif cr_index
        cr
      elsif lf_index
        lf
      else
        :auto
      end
    end

    def prepare_line
      @lineno = 0
      @last_line = nil
      @scanner = nil
    end

    def last_line
      if @scanner
        @last_line ||= @scanner.keep_end
      else
        @last_line
      end
    end

    def prepare_header
      @return_headers = @options[:return_headers]

      headers = @options[:headers]
      case headers
      when Array
        @raw_headers = headers
        quoted_fields = [false] * @raw_headers.size
        @use_headers = true
      when String
        @raw_headers, quoted_fields = parse_headers(headers)
        @use_headers = true
      when nil, false
        @raw_headers = nil
        @use_headers = false
      else
        @raw_headers = nil
        @use_headers = true
      end
      if @raw_headers
        @headers = adjust_headers(@raw_headers, quoted_fields)
      else
        @headers = nil
      end
    end

    def parse_headers(row)
      quoted_fields = []
      converter = lambda do |field, info|
        quoted_fields << info.quoted?
        field
      end
      headers = CSV.parse_line(row,
                               col_sep:    @column_separator,
                               row_sep:    @row_separator,
                               quote_char: @quote_character,
                               converters: [converter])
      [headers, quoted_fields]
    end

    def adjust_headers(headers, quoted_fields)
      adjusted_headers = @header_fields_converter.convert(headers, nil, @lineno, quoted_fields)
      adjusted_headers.each {|h| h.freeze if h.is_a? String}
      adjusted_headers
    end

    def prepare_parser
      @may_quoted = may_quoted?
    end

    def may_quoted?
      return false if @quote_character.nil?

      if @input.is_a?(StringIO)
        pos = @input.pos
        sample = @input.read
        @input.seek(pos)
      else
        return false if @samples.empty?
        sample = @samples.first
      end
      sample[0, 128].index(@quote_character)
    end

    class UnoptimizedStringIO # :nodoc:
      def initialize(string)
        @io = StringIO.new(string, "rb:#{string.encoding}")
      end

      def gets(*args)
        @io.gets(*args)
      end

      def each_line(*args, &block)
        @io.each_line(*args, &block)
      end

      def eof?
        @io.eof?
      end
    end

    SCANNER_TEST = (ENV["CSV_PARSER_SCANNER_TEST"] == "yes")
    if SCANNER_TEST
      SCANNER_TEST_CHUNK_SIZE_NAME = "CSV_PARSER_SCANNER_TEST_CHUNK_SIZE"
      SCANNER_TEST_CHUNK_SIZE_VALUE = ENV[SCANNER_TEST_CHUNK_SIZE_NAME]
      def build_scanner
        inputs = @samples.collect do |sample|
          UnoptimizedStringIO.new(sample)
        end
        if @input.is_a?(StringIO)
          inputs << UnoptimizedStringIO.new(@input.read)
        else
          inputs << @input
        end
        begin
          chunk_size_value = ENV[SCANNER_TEST_CHUNK_SIZE_NAME]
        rescue # Ractor::IsolationError
          # Ractor on Ruby 3.0 can't read ENV value.
          chunk_size_value = SCANNER_TEST_CHUNK_SIZE_VALUE
        end
        chunk_size = Integer((chunk_size_value || "1"), 10)
        InputsScanner.new(inputs,
                          @encoding,
                          @row_separator,
                          chunk_size: chunk_size)
      end
    else
      def build_scanner
        string = nil
        if @samples.empty? and @input.is_a?(StringIO)
          string = @input.read
        elsif @samples.size == 1 and
              @input != ARGF and
              @input.respond_to?(:eof?) and
              @input.eof?
          string = @samples[0]
        end
        if string
          unless string.valid_encoding?
            index = string.lines(@row_separator).index do |line|
              !line.valid_encoding?
            end
            if index
              message = "Invalid byte sequence in #{@encoding}"
              raise MalformedCSVError.new(message, @lineno + index + 1)
            end
          end
          Scanner.new(string)
        else
          inputs = @samples.collect do |sample|
            StringIO.new(sample)
          end
          inputs << @input
          InputsScanner.new(inputs, @encoding, @row_separator)
        end
      end
    end

    def skip_needless_lines
      return unless @skip_lines

      until @scanner.eos?
        @scanner.keep_start
        line = @scanner.scan_all(@not_line_end) || "".encode(@encoding)
        line << @row_separator if parse_row_end
        if skip_line?(line)
          @lineno += 1
          @scanner.keep_drop
        else
          @scanner.keep_back
          return
        end
      end
    end

    def skip_line?(line)
      line = line.delete_suffix(@row_separator)
      case @skip_lines
      when String
        line.include?(@skip_lines)
      when Regexp
        @skip_lines.match?(line)
      else
        @skip_lines.match(line)
      end
    end

    def validate_field_size(field)
      return unless @max_field_size
      return if field.size <= @max_field_size
      ignore_broken_line
      message = "Field size exceeded: #{field.size} > #{@max_field_size}"
      raise MalformedCSVError.new(message, @lineno)
    end

    def parse_no_quote(&block)
      @scanner.each_line(@row_separator) do |line|
        next if @skip_lines and skip_line?(line)
        original_line = line
        line = line.delete_suffix(@row_separator)

        if line.empty?
          next if @skip_blanks
          row = []
          quoted_fields = []
        else
          line = strip_value(line)
          row = line.split(@split_column_separator, -1)
          quoted_fields = [false] * row.size
          if @max_field_size
            row.each do |column|
              validate_field_size(column)
            end
          end
          n_columns = row.size
          i = 0
          while i < n_columns
            row[i] = nil if row[i].empty?
            i += 1
          end
        end
        @last_line = original_line
        emit_row(row, quoted_fields, &block)
      end
    end

    def parse_quotable_loose(&block)
      @scanner.keep_start
      @scanner.each_line(@row_separator) do |line|
        if @skip_lines and skip_line?(line)
          @scanner.keep_drop
          @scanner.keep_start
          next
        end
        original_line = line
        line = line.delete_suffix(@row_separator)

        if line.empty?
          if @skip_blanks
            @scanner.keep_drop
            @scanner.keep_start
            next
          end
          row = []
          quoted_fields = []
        elsif line.include?(@cr) or line.include?(@lf)
          @scanner.keep_back
          @need_robust_parsing = true
          return parse_quotable_robust(&block)
        else
          row = line.split(@split_column_separator, -1)
          quoted_fields = []
          n_columns = row.size
          i = 0
          while i < n_columns
            column = row[i]
            if column.empty?
              quoted_fields << false
              row[i] = nil
            else
              n_quotes = column.count(@quote_character)
              if n_quotes.zero?
                quoted_fields << false
                # no quote
              elsif n_quotes == 2 and
                   column.start_with?(@quote_character) and
                   column.end_with?(@quote_character)
                quoted_fields << true
                row[i] = column[1..-2]
              else
                @scanner.keep_back
                @need_robust_parsing = true
                return parse_quotable_robust(&block)
              end
              validate_field_size(row[i])
            end
            i += 1
          end
        end
        @scanner.keep_drop
        @scanner.keep_start
        @last_line = original_line
        emit_row(row, quoted_fields, &block)
      end
      @scanner.keep_drop
    end

    def parse_quotable_robust(&block)
      row = []
      quoted_fields = []
      skip_needless_lines
      start_row
      while true
        @quoted_column_value = false
        @unquoted_column_value = false
        @scanner.scan_all(@strip_value) if @strip_value
        value = parse_column_value
        if value
          @scanner.scan_all(@strip_value) if @strip_value
          validate_field_size(value)
        end
        if parse_column_end
          row << value
          quoted_fields << @quoted_column_value
        elsif parse_row_end
          if row.empty? and value.nil?
            emit_row([], [], &block) unless @skip_blanks
          else
            row << value
            quoted_fields << @quoted_column_value
            emit_row(row, quoted_fields, &block)
            row = []
            quoted_fields = []
          end
          skip_needless_lines
          start_row
        elsif @scanner.eos?
          break if row.empty? and value.nil?
          row << value
          quoted_fields << @quoted_column_value
          emit_row(row, quoted_fields, &block)
          break
        else
          if @quoted_column_value
            if liberal_parsing? and (new_line = @scanner.check(@line_end))
              message =
                "Illegal end-of-line sequence outside of a quoted field " +
                "<#{new_line.inspect}>"
            else
              message = "Any value after quoted field isn't allowed"
            end
            ignore_broken_line
            raise MalformedCSVError.new(message, @lineno)
          elsif @unquoted_column_value and
                (new_line = @scanner.scan(@line_end))
            ignore_broken_line
            message = "Unquoted fields do not allow new line " +
                      "<#{new_line.inspect}>"
            raise MalformedCSVError.new(message, @lineno)
          elsif @scanner.rest.start_with?(@quote_character)
            ignore_broken_line
            message = "Illegal quoting"
            raise MalformedCSVError.new(message, @lineno)
          elsif (new_line = @scanner.scan(@line_end))
            ignore_broken_line
            message = "New line must be <#{@row_separator.inspect}> " +
                      "not <#{new_line.inspect}>"
            raise MalformedCSVError.new(message, @lineno)
          else
            ignore_broken_line
            raise MalformedCSVError.new("TODO: Meaningful message",
                                        @lineno)
          end
        end
      end
    end

    def parse_column_value
      if @liberal_parsing
        quoted_value = parse_quoted_column_value
        if quoted_value
          @scanner.scan_all(@strip_value) if @strip_value
          unquoted_value = parse_unquoted_column_value
          if unquoted_value
            if @double_quote_outside_quote
              unquoted_value = unquoted_value.gsub(@quote_character * 2,
                                                   @quote_character)
              if quoted_value.empty? # %Q{""...} case
                return @quote_character + unquoted_value
              end
            end
            @quote_character + quoted_value + @quote_character + unquoted_value
          else
            quoted_value
          end
        else
          parse_unquoted_column_value
        end
      elsif @may_quoted
        parse_quoted_column_value ||
          parse_unquoted_column_value
      else
        parse_unquoted_column_value ||
          parse_quoted_column_value
      end
    end

    def parse_unquoted_column_value
      value = @scanner.scan_all(@unquoted_value)
      return nil unless value

      @unquoted_column_value = true
      if @first_column_separators
        while true
          @scanner.keep_start
          is_column_end = @column_ends.all? do |column_end|
            @scanner.scan(column_end)
          end
          @scanner.keep_back
          break if is_column_end
          sub_separator = @scanner.scan_all(@first_column_separators)
          break if sub_separator.nil?
          value << sub_separator
          sub_value = @scanner.scan_all(@unquoted_value)
          break if sub_value.nil?
          value << sub_value
        end
      end
      value.gsub!(@backslash_quote_character, @quote_character) if @backslash_quote
      if @rstrip_value
        value.gsub!(@rstrip_value, "")
      end
      value
    end

    def parse_quoted_column_value
      quotes = @scanner.scan_all(@quotes)
      return nil unless quotes

      @quoted_column_value = true
      n_quotes = quotes.size
      if (n_quotes % 2).zero?
        quotes[0, (n_quotes - 2) / 2]
      else
        value = quotes[0, n_quotes / 2]
        while true
          quoted_value = @scanner.scan_all(@quoted_value)
          value << quoted_value if quoted_value
          if @backslash_quote
            if @scanner.scan(@escaped_backslash)
              if @scanner.scan(@escaped_quote)
                value << @quote_character
              else
                value << @backslash_character
              end
              next
            end
          end

          quotes = @scanner.scan_all(@quotes)
          unless quotes
            ignore_broken_line
            message = "Unclosed quoted field"
            raise MalformedCSVError.new(message, @lineno)
          end
          n_quotes = quotes.size
          if n_quotes == 1
            break
          else
            value << quotes[0, n_quotes / 2]
            break if (n_quotes % 2) == 1
          end
        end
        value
      end
    end

    def parse_column_end
      return true if @scanner.scan(@column_end)
      return false unless @column_ends

      @scanner.keep_start
      if @column_ends.all? {|column_end| @scanner.scan(column_end)}
        @scanner.keep_drop
        true
      else
        @scanner.keep_back
        false
      end
    end

    def parse_row_end
      return true if @scanner.scan(@row_end)
      return false unless @row_ends
      @scanner.keep_start
      if @row_ends.all? {|row_end| @scanner.scan(row_end)}
        @scanner.keep_drop
        true
      else
        @scanner.keep_back
        false
      end
    end

    def strip_value(value)
      return value unless @strip
      return value if value.nil?

      case @strip
      when String
        while value.delete_prefix!(@strip)
          # do nothing
        end
        while value.delete_suffix!(@strip)
          # do nothing
        end
      else
        value.strip!
      end
      value
    end

    def ignore_broken_line
      @scanner.scan_all(@not_line_end)
      @scanner.scan_all(@line_end)
      @lineno += 1
    end

    def start_row
      if @last_line
        @last_line = nil
      else
        @scanner.keep_drop
      end
      @scanner.keep_start
    end

    def emit_row(row, quoted_fields, &block)
      @lineno += 1

      raw_row = row
      if @use_headers
        if @headers.nil?
          @headers = adjust_headers(row, quoted_fields)
          return unless @return_headers
          row = Row.new(@headers, row, true)
        else
          row = Row.new(@headers,
                        @fields_converter.convert(raw_row, @headers, @lineno, quoted_fields))
        end
      else
        # convert fields, if needed...
        row = @fields_converter.convert(raw_row, nil, @lineno, quoted_fields)
      end

      # inject unconverted fields and accessor, if requested...
      if @unconverted_fields and not row.respond_to?(:unconverted_fields)
        add_unconverted_fields(row, raw_row)
      end

      yield(row)
    end

    # This method injects an instance variable <tt>unconverted_fields</tt> into
    # +row+ and an accessor method for +row+ called unconverted_fields().  The
    # variable is set to the contents of +fields+.
    def add_unconverted_fields(row, fields)
      class << row
        attr_reader :unconverted_fields
      end
      row.instance_variable_set(:@unconverted_fields, fields)
      row
    end
  end
end
PK}$[�\���B�B
ruby/pp.rbnu�[���# frozen_string_literal: true

require 'prettyprint'

##
# A pretty-printer for Ruby objects.
#
##
# == What PP Does
#
# Standard output by #p returns this:
#   #<PP:0x81fedf0 @genspace=#<Proc:0x81feda0>, @group_queue=#<PrettyPrint::GroupQueue:0x81fed3c @queue=[[#<PrettyPrint::Group:0x81fed78 @breakables=[], @depth=0, @break=false>], []]>, @buffer=[], @newline="\n", @group_stack=[#<PrettyPrint::Group:0x81fed78 @breakables=[], @depth=0, @break=false>], @buffer_width=0, @indent=0, @maxwidth=79, @output_width=2, @output=#<IO:0x8114ee4>>
#
# Pretty-printed output returns this:
#   #<PP:0x81fedf0
#    @buffer=[],
#    @buffer_width=0,
#    @genspace=#<Proc:0x81feda0>,
#    @group_queue=
#     #<PrettyPrint::GroupQueue:0x81fed3c
#      @queue=
#       [[#<PrettyPrint::Group:0x81fed78 @break=false, @breakables=[], @depth=0>],
#        []]>,
#    @group_stack=
#     [#<PrettyPrint::Group:0x81fed78 @break=false, @breakables=[], @depth=0>],
#    @indent=0,
#    @maxwidth=79,
#    @newline="\n",
#    @output=#<IO:0x8114ee4>,
#    @output_width=2>
#
##
# == Usage
#
#   pp(obj)             #=> obj
#   pp obj              #=> obj
#   pp(obj1, obj2, ...) #=> [obj1, obj2, ...]
#   pp()                #=> nil
#
# Output <tt>obj(s)</tt> to <tt>$></tt> in pretty printed format.
#
# It returns <tt>obj(s)</tt>.
#
##
# == Output Customization
#
# To define a customized pretty printing function for your classes,
# redefine method <code>#pretty_print(pp)</code> in the class.
#
# <code>#pretty_print</code> takes the +pp+ argument, which is an instance of the PP class.
# The method uses #text, #breakable, #nest, #group and #pp to print the
# object.
#
##
# == Pretty-Print JSON
#
# To pretty-print JSON refer to JSON#pretty_generate.
#
##
# == Author
# Tanaka Akira <akr@fsij.org>

class PP < PrettyPrint
  # Returns the usable width for +out+.
  # As the width of +out+:
  # 1. If +out+ is assigned to a tty device, its width is used.
  # 2. Otherwise, or it could not get the value, the +COLUMN+
  #    environment variable is assumed to be set to the width.
  # 3. If +COLUMN+ is not set to a non-zero number, 80 is assumed.
  #
  # And finally, returns the above width value - 1.
  # * This -1 is for Windows command prompt, which moves the cursor to
  #   the next line if it reaches the last column.
  def PP.width_for(out)
    begin
      require 'io/console'
      _, width = out.winsize
    rescue LoadError, NoMethodError, SystemCallError
    end
    (width || ENV['COLUMNS']&.to_i&.nonzero? || 80) - 1
  end

  # Outputs +obj+ to +out+ in pretty printed format of
  # +width+ columns in width.
  #
  # If +out+ is omitted, <code>$></code> is assumed.
  # If +width+ is omitted, the width of +out+ is assumed (see
  # width_for).
  #
  # PP.pp returns +out+.
  def PP.pp(obj, out=$>, width=width_for(out))
    q = PP.new(out, width)
    q.guard_inspect_key {q.pp obj}
    q.flush
    #$pp = q
    out << "\n"
  end

  # Outputs +obj+ to +out+ like PP.pp but with no indent and
  # newline.
  #
  # PP.singleline_pp returns +out+.
  def PP.singleline_pp(obj, out=$>)
    q = SingleLine.new(out)
    q.guard_inspect_key {q.pp obj}
    q.flush
    out
  end

  # :stopdoc:
  def PP.mcall(obj, mod, meth, *args, &block)
    mod.instance_method(meth).bind_call(obj, *args, &block)
  end
  # :startdoc:

  if defined? ::Ractor
    class << self
      # Returns the sharing detection flag as a boolean value.
      # It is false (nil) by default.
      def sharing_detection
        Ractor.current[:pp_sharing_detection]
      end
      # Sets the sharing detection flag to b.
      def sharing_detection=(b)
        Ractor.current[:pp_sharing_detection] = b
      end
    end
  else
    @sharing_detection = false
    class << self
      # Returns the sharing detection flag as a boolean value.
      # It is false by default.
      attr_accessor :sharing_detection
    end
  end

  module PPMethods

    # Yields to a block
    # and preserves the previous set of objects being printed.
    def guard_inspect_key
      if Thread.current[:__recursive_key__] == nil
        Thread.current[:__recursive_key__] = {}.compare_by_identity
      end

      if Thread.current[:__recursive_key__][:inspect] == nil
        Thread.current[:__recursive_key__][:inspect] = {}.compare_by_identity
      end

      save = Thread.current[:__recursive_key__][:inspect]

      begin
        Thread.current[:__recursive_key__][:inspect] = {}.compare_by_identity
        yield
      ensure
        Thread.current[:__recursive_key__][:inspect] = save
      end
    end

    # Check whether the object_id +id+ is in the current buffer of objects
    # to be pretty printed. Used to break cycles in chains of objects to be
    # pretty printed.
    def check_inspect_key(id)
      Thread.current[:__recursive_key__] &&
      Thread.current[:__recursive_key__][:inspect] &&
      Thread.current[:__recursive_key__][:inspect].include?(id)
    end

    # Adds the object_id +id+ to the set of objects being pretty printed, so
    # as to not repeat objects.
    def push_inspect_key(id)
      Thread.current[:__recursive_key__][:inspect][id] = true
    end

    # Removes an object from the set of objects being pretty printed.
    def pop_inspect_key(id)
      Thread.current[:__recursive_key__][:inspect].delete id
    end

    # Adds +obj+ to the pretty printing buffer
    # using Object#pretty_print or Object#pretty_print_cycle.
    #
    # Object#pretty_print_cycle is used when +obj+ is already
    # printed, a.k.a the object reference chain has a cycle.
    def pp(obj)
      # If obj is a Delegator then use the object being delegated to for cycle
      # detection
      obj = obj.__getobj__ if defined?(::Delegator) and obj.is_a?(::Delegator)

      if check_inspect_key(obj)
        group {obj.pretty_print_cycle self}
        return
      end

      begin
        push_inspect_key(obj)
        group {obj.pretty_print self}
      ensure
        pop_inspect_key(obj) unless PP.sharing_detection
      end
    end

    # A convenience method which is same as follows:
    #
    #   group(1, '#<' + obj.class.name, '>') { ... }
    def object_group(obj, &block) # :yield:
      group(1, '#<' + obj.class.name, '>', &block)
    end

    # A convenience method, like object_group, but also reformats the Object's
    # object_id.
    def object_address_group(obj, &block)
      str = Kernel.instance_method(:to_s).bind_call(obj)
      str.chomp!('>')
      group(1, str, '>', &block)
    end

    # A convenience method which is same as follows:
    #
    #   text ','
    #   breakable
    def comma_breakable
      text ','
      breakable
    end

    # Adds a separated list.
    # The list is separated by comma with breakable space, by default.
    #
    # #seplist iterates the +list+ using +iter_method+.
    # It yields each object to the block given for #seplist.
    # The procedure +separator_proc+ is called between each yields.
    #
    # If the iteration is zero times, +separator_proc+ is not called at all.
    #
    # If +separator_proc+ is nil or not given,
    # +lambda { comma_breakable }+ is used.
    # If +iter_method+ is not given, :each is used.
    #
    # For example, following 3 code fragments has similar effect.
    #
    #   q.seplist([1,2,3]) {|v| xxx v }
    #
    #   q.seplist([1,2,3], lambda { q.comma_breakable }, :each) {|v| xxx v }
    #
    #   xxx 1
    #   q.comma_breakable
    #   xxx 2
    #   q.comma_breakable
    #   xxx 3
    def seplist(list, sep=nil, iter_method=:each) # :yield: element
      sep ||= lambda { comma_breakable }
      first = true
      list.__send__(iter_method) {|*v|
        if first
          first = false
        else
          sep.call
        end
        RUBY_VERSION >= "3.0" ? yield(*v, **{}) : yield(*v)
      }
    end

    # A present standard failsafe for pretty printing any given Object
    def pp_object(obj)
      object_address_group(obj) {
        seplist(obj.pretty_print_instance_variables, lambda { text ',' }) {|v|
          breakable
          v = v.to_s if Symbol === v
          text v
          text '='
          group(1) {
            breakable ''
            pp(obj.instance_eval(v))
          }
        }
      }
    end

    # A pretty print for a Hash
    def pp_hash(obj)
      group(1, '{', '}') {
        seplist(obj, nil, :each_pair) {|k, v|
          group {
            pp k
            text '=>'
            group(1) {
              breakable ''
              pp v
            }
          }
        }
      }
    end
  end

  include PPMethods

  class SingleLine < PrettyPrint::SingleLine # :nodoc:
    include PPMethods
  end

  module ObjectMixin # :nodoc:
    # 1. specific pretty_print
    # 2. specific inspect
    # 3. generic pretty_print

    # A default pretty printing method for general objects.
    # It calls #pretty_print_instance_variables to list instance variables.
    #
    # If +self+ has a customized (redefined) #inspect method,
    # the result of self.inspect is used but it obviously has no
    # line break hints.
    #
    # This module provides predefined #pretty_print methods for some of
    # the most commonly used built-in classes for convenience.
    def pretty_print(q)
      umethod_method = Object.instance_method(:method)
      begin
        inspect_method = umethod_method.bind_call(self, :inspect)
      rescue NameError
      end
      if inspect_method && inspect_method.owner != Kernel
        q.text self.inspect
      elsif !inspect_method && self.respond_to?(:inspect)
        q.text self.inspect
      else
        q.pp_object(self)
      end
    end

    # A default pretty printing method for general objects that are
    # detected as part of a cycle.
    def pretty_print_cycle(q)
      q.object_address_group(self) {
        q.breakable
        q.text '...'
      }
    end

    # Returns a sorted array of instance variable names.
    #
    # This method should return an array of names of instance variables as symbols or strings as:
    # +[:@a, :@b]+.
    def pretty_print_instance_variables
      instance_variables.sort
    end

    # Is #inspect implementation using #pretty_print.
    # If you implement #pretty_print, it can be used as follows.
    #
    #   alias inspect pretty_print_inspect
    #
    # However, doing this requires that every class that #inspect is called on
    # implement #pretty_print, or a RuntimeError will be raised.
    def pretty_print_inspect
      if Object.instance_method(:method).bind_call(self, :pretty_print).owner == PP::ObjectMixin
        raise "pretty_print is not overridden for #{self.class}"
      end
      PP.singleline_pp(self, ''.dup)
    end
  end
end

class Array # :nodoc:
  def pretty_print(q) # :nodoc:
    q.group(1, '[', ']') {
      q.seplist(self) {|v|
        q.pp v
      }
    }
  end

  def pretty_print_cycle(q) # :nodoc:
    q.text(empty? ? '[]' : '[...]')
  end
end

class Hash # :nodoc:
  def pretty_print(q) # :nodoc:
    q.pp_hash self
  end

  def pretty_print_cycle(q) # :nodoc:
    q.text(empty? ? '{}' : '{...}')
  end
end

class << ENV # :nodoc:
  def pretty_print(q) # :nodoc:
    h = {}
    ENV.keys.sort.each {|k|
      h[k] = ENV[k]
    }
    q.pp_hash h
  end
end

class Struct # :nodoc:
  def pretty_print(q) # :nodoc:
    q.group(1, sprintf("#<struct %s", PP.mcall(self, Kernel, :class).name), '>') {
      q.seplist(PP.mcall(self, Struct, :members), lambda { q.text "," }) {|member|
        q.breakable
        q.text member.to_s
        q.text '='
        q.group(1) {
          q.breakable ''
          q.pp self[member]
        }
      }
    }
  end

  def pretty_print_cycle(q) # :nodoc:
    q.text sprintf("#<struct %s:...>", PP.mcall(self, Kernel, :class).name)
  end
end

class Range # :nodoc:
  def pretty_print(q) # :nodoc:
    q.pp self.begin
    q.breakable ''
    q.text(self.exclude_end? ? '...' : '..')
    q.breakable ''
    q.pp self.end if self.end
  end
end

class String # :nodoc:
  def pretty_print(q) # :nodoc:
    lines = self.lines
    if lines.size > 1
      q.group(0, '', '') do
        q.seplist(lines, lambda { q.text ' +'; q.breakable }) do |v|
          q.pp v
        end
      end
    else
      q.text inspect
    end
  end
end

class File < IO # :nodoc:
  class Stat # :nodoc:
    def pretty_print(q) # :nodoc:
      require 'etc'
      q.object_group(self) {
        q.breakable
        q.text sprintf("dev=0x%x", self.dev); q.comma_breakable
        q.text "ino="; q.pp self.ino; q.comma_breakable
        q.group {
          m = self.mode
          q.text sprintf("mode=0%o", m)
          q.breakable
          q.text sprintf("(%s %c%c%c%c%c%c%c%c%c)",
            self.ftype,
            (m & 0400 == 0 ? ?- : ?r),
            (m & 0200 == 0 ? ?- : ?w),
            (m & 0100 == 0 ? (m & 04000 == 0 ? ?- : ?S) :
                             (m & 04000 == 0 ? ?x : ?s)),
            (m & 0040 == 0 ? ?- : ?r),
            (m & 0020 == 0 ? ?- : ?w),
            (m & 0010 == 0 ? (m & 02000 == 0 ? ?- : ?S) :
                             (m & 02000 == 0 ? ?x : ?s)),
            (m & 0004 == 0 ? ?- : ?r),
            (m & 0002 == 0 ? ?- : ?w),
            (m & 0001 == 0 ? (m & 01000 == 0 ? ?- : ?T) :
                             (m & 01000 == 0 ? ?x : ?t)))
        }
        q.comma_breakable
        q.text "nlink="; q.pp self.nlink; q.comma_breakable
        q.group {
          q.text "uid="; q.pp self.uid
          begin
            pw = Etc.getpwuid(self.uid)
          rescue ArgumentError
          end
          if pw
            q.breakable; q.text "(#{pw.name})"
          end
        }
        q.comma_breakable
        q.group {
          q.text "gid="; q.pp self.gid
          begin
            gr = Etc.getgrgid(self.gid)
          rescue ArgumentError
          end
          if gr
            q.breakable; q.text "(#{gr.name})"
          end
        }
        q.comma_breakable
        q.group {
          q.text sprintf("rdev=0x%x", self.rdev)
          if self.rdev_major && self.rdev_minor
            q.breakable
            q.text sprintf('(%d, %d)', self.rdev_major, self.rdev_minor)
          end
        }
        q.comma_breakable
        q.text "size="; q.pp self.size; q.comma_breakable
        q.text "blksize="; q.pp self.blksize; q.comma_breakable
        q.text "blocks="; q.pp self.blocks; q.comma_breakable
        q.group {
          t = self.atime
          q.text "atime="; q.pp t
          q.breakable; q.text "(#{t.tv_sec})"
        }
        q.comma_breakable
        q.group {
          t = self.mtime
          q.text "mtime="; q.pp t
          q.breakable; q.text "(#{t.tv_sec})"
        }
        q.comma_breakable
        q.group {
          t = self.ctime
          q.text "ctime="; q.pp t
          q.breakable; q.text "(#{t.tv_sec})"
        }
      }
    end
  end
end

class MatchData # :nodoc:
  def pretty_print(q) # :nodoc:
    nc = []
    self.regexp.named_captures.each {|name, indexes|
      indexes.each {|i| nc[i] = name }
    }
    q.object_group(self) {
      q.breakable
      q.seplist(0...self.size, lambda { q.breakable }) {|i|
        if i == 0
          q.pp self[i]
        else
          if nc[i]
            q.text nc[i]
          else
            q.pp i
          end
          q.text ':'
          q.pp self[i]
        end
      }
    }
  end
end

if defined?(RubyVM::AbstractSyntaxTree)
  class RubyVM::AbstractSyntaxTree::Node
    def pretty_print_children(q, names = [])
      children.zip(names) do |c, n|
        if n
          q.breakable
          q.text "#{n}:"
        end
        q.group(2) do
          q.breakable
          q.pp c
        end
      end
    end

    def pretty_print(q)
      q.group(1, "(#{type}@#{first_lineno}:#{first_column}-#{last_lineno}:#{last_column}", ")") {
        case type
        when :SCOPE
          pretty_print_children(q, %w"tbl args body")
        when :ARGS
          pretty_print_children(q, %w[pre_num pre_init opt first_post post_num post_init rest kw kwrest block])
        when :DEFN
          pretty_print_children(q, %w[mid body])
        when :ARYPTN
          pretty_print_children(q, %w[const pre rest post])
        when :HSHPTN
          pretty_print_children(q, %w[const kw kwrest])
        else
          pretty_print_children(q)
        end
      }
    end
  end
end

class Object < BasicObject # :nodoc:
  include PP::ObjectMixin
end

[Numeric, Symbol, FalseClass, TrueClass, NilClass, Module].each {|c|
  c.class_eval {
    def pretty_print_cycle(q)
      q.text inspect
    end
  }
}

[Numeric, FalseClass, TrueClass, Module].each {|c|
  c.class_eval {
    def pretty_print(q)
      q.text inspect
    end
  }
}

module Kernel
  # Returns a pretty printed object as a string.
  #
  # In order to use this method you must first require the PP module:
  #
  #   require 'pp'
  #
  # See the PP module for more information.
  def pretty_inspect
    PP.pp(self, ''.dup)
  end

  # prints arguments in pretty form.
  #
  # pp returns argument(s).
  def pp(*objs)
    objs.each {|obj|
      PP.pp(obj)
    }
    objs.size <= 1 ? objs.first : objs
  end
  module_function :pp
end
PK}$[���K2929
ruby/tsort.rbnu�[���# frozen_string_literal: true

#--
# tsort.rb - provides a module for topological sorting and strongly connected components.
#++
#

#
# TSort implements topological sorting using Tarjan's algorithm for
# strongly connected components.
#
# TSort is designed to be able to be used with any object which can be
# interpreted as a directed graph.
#
# TSort requires two methods to interpret an object as a graph,
# tsort_each_node and tsort_each_child.
#
# * tsort_each_node is used to iterate for all nodes over a graph.
# * tsort_each_child is used to iterate for child nodes of a given node.
#
# The equality of nodes are defined by eql? and hash since
# TSort uses Hash internally.
#
# == A Simple Example
#
# The following example demonstrates how to mix the TSort module into an
# existing class (in this case, Hash). Here, we're treating each key in
# the hash as a node in the graph, and so we simply alias the required
# #tsort_each_node method to Hash's #each_key method. For each key in the
# hash, the associated value is an array of the node's child nodes. This
# choice in turn leads to our implementation of the required #tsort_each_child
# method, which fetches the array of child nodes and then iterates over that
# array using the user-supplied block.
#
#   require 'tsort'
#
#   class Hash
#     include TSort
#     alias tsort_each_node each_key
#     def tsort_each_child(node, &block)
#       fetch(node).each(&block)
#     end
#   end
#
#   {1=>[2, 3], 2=>[3], 3=>[], 4=>[]}.tsort
#   #=> [3, 2, 1, 4]
#
#   {1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}.strongly_connected_components
#   #=> [[4], [2, 3], [1]]
#
# == A More Realistic Example
#
# A very simple `make' like tool can be implemented as follows:
#
#   require 'tsort'
#
#   class Make
#     def initialize
#       @dep = {}
#       @dep.default = []
#     end
#
#     def rule(outputs, inputs=[], &block)
#       triple = [outputs, inputs, block]
#       outputs.each {|f| @dep[f] = [triple]}
#       @dep[triple] = inputs
#     end
#
#     def build(target)
#       each_strongly_connected_component_from(target) {|ns|
#         if ns.length != 1
#           fs = ns.delete_if {|n| Array === n}
#           raise TSort::Cyclic.new("cyclic dependencies: #{fs.join ', '}")
#         end
#         n = ns.first
#         if Array === n
#           outputs, inputs, block = n
#           inputs_time = inputs.map {|f| File.mtime f}.max
#           begin
#             outputs_time = outputs.map {|f| File.mtime f}.min
#           rescue Errno::ENOENT
#             outputs_time = nil
#           end
#           if outputs_time == nil ||
#              inputs_time != nil && outputs_time <= inputs_time
#             sleep 1 if inputs_time != nil && inputs_time.to_i == Time.now.to_i
#             block.call
#           end
#         end
#       }
#     end
#
#     def tsort_each_child(node, &block)
#       @dep[node].each(&block)
#     end
#     include TSort
#   end
#
#   def command(arg)
#     print arg, "\n"
#     system arg
#   end
#
#   m = Make.new
#   m.rule(%w[t1]) { command 'date > t1' }
#   m.rule(%w[t2]) { command 'date > t2' }
#   m.rule(%w[t3]) { command 'date > t3' }
#   m.rule(%w[t4], %w[t1 t3]) { command 'cat t1 t3 > t4' }
#   m.rule(%w[t5], %w[t4 t2]) { command 'cat t4 t2 > t5' }
#   m.build('t5')
#
# == Bugs
#
# * 'tsort.rb' is wrong name because this library uses
#   Tarjan's algorithm for strongly connected components.
#   Although 'strongly_connected_components.rb' is correct but too long.
#
# == References
#
# R. E. Tarjan, "Depth First Search and Linear Graph Algorithms",
# <em>SIAM Journal on Computing</em>, Vol. 1, No. 2, pp. 146-160, June 1972.
#

module TSort
  class Cyclic < StandardError
  end

  # Returns a topologically sorted array of nodes.
  # The array is sorted from children to parents, i.e.
  # the first element has no child and the last node has no parent.
  #
  # If there is a cycle, TSort::Cyclic is raised.
  #
  #   class G
  #     include TSort
  #     def initialize(g)
  #       @g = g
  #     end
  #     def tsort_each_child(n, &b) @g[n].each(&b) end
  #     def tsort_each_node(&b) @g.each_key(&b) end
  #   end
  #
  #   graph = G.new({1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]})
  #   p graph.tsort #=> [4, 2, 3, 1]
  #
  #   graph = G.new({1=>[2], 2=>[3, 4], 3=>[2], 4=>[]})
  #   p graph.tsort # raises TSort::Cyclic
  #
  def tsort
    each_node = method(:tsort_each_node)
    each_child = method(:tsort_each_child)
    TSort.tsort(each_node, each_child)
  end

  # Returns a topologically sorted array of nodes.
  # The array is sorted from children to parents, i.e.
  # the first element has no child and the last node has no parent.
  #
  # The graph is represented by _each_node_ and _each_child_.
  # _each_node_ should have +call+ method which yields for each node in the graph.
  # _each_child_ should have +call+ method which takes a node argument and yields for each child node.
  #
  # If there is a cycle, TSort::Cyclic is raised.
  #
  #   g = {1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]}
  #   each_node = lambda {|&b| g.each_key(&b) }
  #   each_child = lambda {|n, &b| g[n].each(&b) }
  #   p TSort.tsort(each_node, each_child) #=> [4, 2, 3, 1]
  #
  #   g = {1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}
  #   each_node = lambda {|&b| g.each_key(&b) }
  #   each_child = lambda {|n, &b| g[n].each(&b) }
  #   p TSort.tsort(each_node, each_child) # raises TSort::Cyclic
  #
  def TSort.tsort(each_node, each_child)
    TSort.tsort_each(each_node, each_child).to_a
  end

  # The iterator version of the #tsort method.
  # <tt><em>obj</em>.tsort_each</tt> is similar to <tt><em>obj</em>.tsort.each</tt>, but
  # modification of _obj_ during the iteration may lead to unexpected results.
  #
  # #tsort_each returns +nil+.
  # If there is a cycle, TSort::Cyclic is raised.
  #
  #   class G
  #     include TSort
  #     def initialize(g)
  #       @g = g
  #     end
  #     def tsort_each_child(n, &b) @g[n].each(&b) end
  #     def tsort_each_node(&b) @g.each_key(&b) end
  #   end
  #
  #   graph = G.new({1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]})
  #   graph.tsort_each {|n| p n }
  #   #=> 4
  #   #   2
  #   #   3
  #   #   1
  #
  def tsort_each(&block) # :yields: node
    each_node = method(:tsort_each_node)
    each_child = method(:tsort_each_child)
    TSort.tsort_each(each_node, each_child, &block)
  end

  # The iterator version of the TSort.tsort method.
  #
  # The graph is represented by _each_node_ and _each_child_.
  # _each_node_ should have +call+ method which yields for each node in the graph.
  # _each_child_ should have +call+ method which takes a node argument and yields for each child node.
  #
  #   g = {1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]}
  #   each_node = lambda {|&b| g.each_key(&b) }
  #   each_child = lambda {|n, &b| g[n].each(&b) }
  #   TSort.tsort_each(each_node, each_child) {|n| p n }
  #   #=> 4
  #   #   2
  #   #   3
  #   #   1
  #
  def TSort.tsort_each(each_node, each_child) # :yields: node
    return to_enum(__method__, each_node, each_child) unless block_given?

    TSort.each_strongly_connected_component(each_node, each_child) {|component|
      if component.size == 1
        yield component.first
      else
        raise Cyclic.new("topological sort failed: #{component.inspect}")
      end
    }
  end

  # Returns strongly connected components as an array of arrays of nodes.
  # The array is sorted from children to parents.
  # Each elements of the array represents a strongly connected component.
  #
  #   class G
  #     include TSort
  #     def initialize(g)
  #       @g = g
  #     end
  #     def tsort_each_child(n, &b) @g[n].each(&b) end
  #     def tsort_each_node(&b) @g.each_key(&b) end
  #   end
  #
  #   graph = G.new({1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]})
  #   p graph.strongly_connected_components #=> [[4], [2], [3], [1]]
  #
  #   graph = G.new({1=>[2], 2=>[3, 4], 3=>[2], 4=>[]})
  #   p graph.strongly_connected_components #=> [[4], [2, 3], [1]]
  #
  def strongly_connected_components
    each_node = method(:tsort_each_node)
    each_child = method(:tsort_each_child)
    TSort.strongly_connected_components(each_node, each_child)
  end

  # Returns strongly connected components as an array of arrays of nodes.
  # The array is sorted from children to parents.
  # Each elements of the array represents a strongly connected component.
  #
  # The graph is represented by _each_node_ and _each_child_.
  # _each_node_ should have +call+ method which yields for each node in the graph.
  # _each_child_ should have +call+ method which takes a node argument and yields for each child node.
  #
  #   g = {1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]}
  #   each_node = lambda {|&b| g.each_key(&b) }
  #   each_child = lambda {|n, &b| g[n].each(&b) }
  #   p TSort.strongly_connected_components(each_node, each_child)
  #   #=> [[4], [2], [3], [1]]
  #
  #   g = {1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}
  #   each_node = lambda {|&b| g.each_key(&b) }
  #   each_child = lambda {|n, &b| g[n].each(&b) }
  #   p TSort.strongly_connected_components(each_node, each_child)
  #   #=> [[4], [2, 3], [1]]
  #
  def TSort.strongly_connected_components(each_node, each_child)
    TSort.each_strongly_connected_component(each_node, each_child).to_a
  end

  # The iterator version of the #strongly_connected_components method.
  # <tt><em>obj</em>.each_strongly_connected_component</tt> is similar to
  # <tt><em>obj</em>.strongly_connected_components.each</tt>, but
  # modification of _obj_ during the iteration may lead to unexpected results.
  #
  # #each_strongly_connected_component returns +nil+.
  #
  #   class G
  #     include TSort
  #     def initialize(g)
  #       @g = g
  #     end
  #     def tsort_each_child(n, &b) @g[n].each(&b) end
  #     def tsort_each_node(&b) @g.each_key(&b) end
  #   end
  #
  #   graph = G.new({1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]})
  #   graph.each_strongly_connected_component {|scc| p scc }
  #   #=> [4]
  #   #   [2]
  #   #   [3]
  #   #   [1]
  #
  #   graph = G.new({1=>[2], 2=>[3, 4], 3=>[2], 4=>[]})
  #   graph.each_strongly_connected_component {|scc| p scc }
  #   #=> [4]
  #   #   [2, 3]
  #   #   [1]
  #
  def each_strongly_connected_component(&block) # :yields: nodes
    each_node = method(:tsort_each_node)
    each_child = method(:tsort_each_child)
    TSort.each_strongly_connected_component(each_node, each_child, &block)
  end

  # The iterator version of the TSort.strongly_connected_components method.
  #
  # The graph is represented by _each_node_ and _each_child_.
  # _each_node_ should have +call+ method which yields for each node in the graph.
  # _each_child_ should have +call+ method which takes a node argument and yields for each child node.
  #
  #   g = {1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]}
  #   each_node = lambda {|&b| g.each_key(&b) }
  #   each_child = lambda {|n, &b| g[n].each(&b) }
  #   TSort.each_strongly_connected_component(each_node, each_child) {|scc| p scc }
  #   #=> [4]
  #   #   [2]
  #   #   [3]
  #   #   [1]
  #
  #   g = {1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}
  #   each_node = lambda {|&b| g.each_key(&b) }
  #   each_child = lambda {|n, &b| g[n].each(&b) }
  #   TSort.each_strongly_connected_component(each_node, each_child) {|scc| p scc }
  #   #=> [4]
  #   #   [2, 3]
  #   #   [1]
  #
  def TSort.each_strongly_connected_component(each_node, each_child) # :yields: nodes
    return to_enum(__method__, each_node, each_child) unless block_given?

    id_map = {}
    stack = []
    each_node.call {|node|
      unless id_map.include? node
        TSort.each_strongly_connected_component_from(node, each_child, id_map, stack) {|c|
          yield c
        }
      end
    }
    nil
  end

  # Iterates over strongly connected component in the subgraph reachable from
  # _node_.
  #
  # Return value is unspecified.
  #
  # #each_strongly_connected_component_from doesn't call #tsort_each_node.
  #
  #   class G
  #     include TSort
  #     def initialize(g)
  #       @g = g
  #     end
  #     def tsort_each_child(n, &b) @g[n].each(&b) end
  #     def tsort_each_node(&b) @g.each_key(&b) end
  #   end
  #
  #   graph = G.new({1=>[2, 3], 2=>[4], 3=>[2, 4], 4=>[]})
  #   graph.each_strongly_connected_component_from(2) {|scc| p scc }
  #   #=> [4]
  #   #   [2]
  #
  #   graph = G.new({1=>[2], 2=>[3, 4], 3=>[2], 4=>[]})
  #   graph.each_strongly_connected_component_from(2) {|scc| p scc }
  #   #=> [4]
  #   #   [2, 3]
  #
  def each_strongly_connected_component_from(node, id_map={}, stack=[], &block) # :yields: nodes
    TSort.each_strongly_connected_component_from(node, method(:tsort_each_child), id_map, stack, &block)
  end

  # Iterates over strongly connected components in a graph.
  # The graph is represented by _node_ and _each_child_.
  #
  # _node_ is the first node.
  # _each_child_ should have +call+ method which takes a node argument
  # and yields for each child node.
  #
  # Return value is unspecified.
  #
  # #TSort.each_strongly_connected_component_from is a class method and
  # it doesn't need a class to represent a graph which includes TSort.
  #
  #   graph = {1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}
  #   each_child = lambda {|n, &b| graph[n].each(&b) }
  #   TSort.each_strongly_connected_component_from(1, each_child) {|scc|
  #     p scc
  #   }
  #   #=> [4]
  #   #   [2, 3]
  #   #   [1]
  #
  def TSort.each_strongly_connected_component_from(node, each_child, id_map={}, stack=[]) # :yields: nodes
    return to_enum(__method__, node, each_child, id_map, stack) unless block_given?

    minimum_id = node_id = id_map[node] = id_map.size
    stack_length = stack.length
    stack << node

    each_child.call(node) {|child|
      if id_map.include? child
        child_id = id_map[child]
        minimum_id = child_id if child_id && child_id < minimum_id
      else
        sub_minimum_id =
          TSort.each_strongly_connected_component_from(child, each_child, id_map, stack) {|c|
            yield c
          }
        minimum_id = sub_minimum_id if sub_minimum_id < minimum_id
      end
    }

    if node_id == minimum_id
      component = stack.slice!(stack_length .. -1)
      component.each {|n| id_map[n] = nil}
      yield component
    end

    minimum_id
  end

  # Should be implemented by a extended class.
  #
  # #tsort_each_node is used to iterate for all nodes over a graph.
  #
  def tsort_each_node # :yields: node
    raise NotImplementedError.new
  end

  # Should be implemented by a extended class.
  #
  # #tsort_each_child is used to iterate for child nodes of _node_.
  #
  def tsort_each_child(node) # :yields: child
    raise NotImplementedError.new
  end
end
PK}$[�:��5
5
ruby/digest.rbnu�[���# frozen_string_literal: false

if defined?(Digest) &&
    /\A(?:2\.|3\.0\.[0-2]\z)/.match?(RUBY_VERSION) &&
    caller_locations.any? { |l|
      %r{/(rubygems/gem_runner|bundler/cli)\.rb}.match?(l.path)
    }
  # Before Ruby 3.0.3/3.1.0, the gem and bundle commands used to load
  # the digest library before loading additionally installed gems, so
  # you will get constant redefinition warnings and unexpected
  # implementation overwriting if we proceed here.  Avoid that.
  return
end

require 'digest/version'
require 'digest/loader'

module Digest
  # A mutex for Digest().
  REQUIRE_MUTEX = Thread::Mutex.new

  def self.const_missing(name) # :nodoc:
    case name
    when :SHA256, :SHA384, :SHA512
      lib = 'digest/sha2'
    else
      lib = File.join('digest', name.to_s.downcase)
    end

    begin
      require lib
    rescue LoadError
      raise LoadError, "library not found for class Digest::#{name} -- #{lib}", caller(1)
    end
    unless Digest.const_defined?(name)
      raise NameError, "uninitialized constant Digest::#{name}", caller(1)
    end
    Digest.const_get(name)
  end

  class ::Digest::Class
    # Creates a digest object and reads a given file, _name_.
    # Optional arguments are passed to the constructor of the digest
    # class.
    #
    #   p Digest::SHA256.file("X11R6.8.2-src.tar.bz2").hexdigest
    #   # => "f02e3c85572dc9ad7cb77c2a638e3be24cc1b5bea9fdbb0b0299c9668475c534"
    def self.file(name, *args)
      new(*args).file(name)
    end

    # Returns the base64 encoded hash value of a given _string_.  The
    # return value is properly padded with '=' and contains no line
    # feeds.
    def self.base64digest(str, *args)
      [digest(str, *args)].pack('m0')
    end
  end

  module Instance
    # Updates the digest with the contents of a given file _name_ and
    # returns self.
    def file(name)
      File.open(name, "rb") {|f|
        buf = ""
        while f.read(16384, buf)
          update buf
        end
      }
      self
    end

    # If none is given, returns the resulting hash value of the digest
    # in a base64 encoded form, keeping the digest's state.
    #
    # If a +string+ is given, returns the hash value for the given
    # +string+ in a base64 encoded form, resetting the digest to the
    # initial state before and after the process.
    #
    # In either case, the return value is properly padded with '=' and
    # contains no line feeds.
    def base64digest(str = nil)
      [str ? digest(str) : digest].pack('m0')
    end

    # Returns the resulting hash value and resets the digest to the
    # initial state.
    def base64digest!
      [digest!].pack('m0')
    end
  end
end

# call-seq:
#   Digest(name) -> digest_subclass
#
# Returns a Digest subclass by +name+ in a thread-safe manner even
# when on-demand loading is involved.
#
#   require 'digest'
#
#   Digest("MD5")
#   # => Digest::MD5
#
#   Digest(:SHA256)
#   # => Digest::SHA256
#
#   Digest(:Foo)
#   # => LoadError: library not found for class Digest::Foo -- digest/foo
def Digest(name)
  const = name.to_sym
  Digest::REQUIRE_MUTEX.synchronize {
    # Ignore autoload's because it is void when we have #const_missing
    Digest.const_missing(const)
  }
rescue LoadError
  # Constants do not necessarily rely on digest/*.
  if Digest.const_defined?(const)
    Digest.const_get(const)
  else
    raise
  end
end
PK}$[|��lruby/monitor.rbnu�[���# frozen_string_literal: false
# = monitor.rb
#
# Copyright (C) 2001  Shugo Maeda <shugo@ruby-lang.org>
#
# This library is distributed under the terms of the Ruby license.
# You can freely distribute/modify this library.
#

#
# In concurrent programming, a monitor is an object or module intended to be
# used safely by more than one thread.  The defining characteristic of a
# monitor is that its methods are executed with mutual exclusion.  That is, at
# each point in time, at most one thread may be executing any of its methods.
# This mutual exclusion greatly simplifies reasoning about the implementation
# of monitors compared to reasoning about parallel code that updates a data
# structure.
#
# You can read more about the general principles on the Wikipedia page for
# Monitors[https://en.wikipedia.org/wiki/Monitor_%28synchronization%29]
#
# == Examples
#
# === Simple object.extend
#
#   require 'monitor.rb'
#
#   buf = []
#   buf.extend(MonitorMixin)
#   empty_cond = buf.new_cond
#
#   # consumer
#   Thread.start do
#     loop do
#       buf.synchronize do
#         empty_cond.wait_while { buf.empty? }
#         print buf.shift
#       end
#     end
#   end
#
#   # producer
#   while line = ARGF.gets
#     buf.synchronize do
#       buf.push(line)
#       empty_cond.signal
#     end
#   end
#
# The consumer thread waits for the producer thread to push a line to buf
# while <tt>buf.empty?</tt>.  The producer thread (main thread) reads a
# line from ARGF and pushes it into buf then calls <tt>empty_cond.signal</tt>
# to notify the consumer thread of new data.
#
# === Simple Class include
#
#   require 'monitor'
#
#   class SynchronizedArray < Array
#
#     include MonitorMixin
#
#     def initialize(*args)
#       super(*args)
#     end
#
#     alias :old_shift :shift
#     alias :old_unshift :unshift
#
#     def shift(n=1)
#       self.synchronize do
#         self.old_shift(n)
#       end
#     end
#
#     def unshift(item)
#       self.synchronize do
#         self.old_unshift(item)
#       end
#     end
#
#     # other methods ...
#   end
#
# +SynchronizedArray+ implements an Array with synchronized access to items.
# This Class is implemented as subclass of Array which includes the
# MonitorMixin module.
#

require 'monitor.so'

module MonitorMixin
  #
  # FIXME: This isn't documented in Nutshell.
  #
  # Since MonitorMixin.new_cond returns a ConditionVariable, and the example
  # above calls while_wait and signal, this class should be documented.
  #
  class ConditionVariable
    #
    # Releases the lock held in the associated monitor and waits; reacquires the lock on wakeup.
    #
    # If +timeout+ is given, this method returns after +timeout+ seconds passed,
    # even if no other thread doesn't signal.
    #
    def wait(timeout = nil)
      @monitor.mon_check_owner
      @monitor.wait_for_cond(@cond, timeout)
    end

    #
    # Calls wait repeatedly while the given block yields a truthy value.
    #
    def wait_while
      while yield
        wait
      end
    end

    #
    # Calls wait repeatedly until the given block yields a truthy value.
    #
    def wait_until
      until yield
        wait
      end
    end

    #
    # Wakes up the first thread in line waiting for this lock.
    #
    def signal
      @monitor.mon_check_owner
      @cond.signal
    end

    #
    # Wakes up all threads waiting for this lock.
    #
    def broadcast
      @monitor.mon_check_owner
      @cond.broadcast
    end

    private

    def initialize(monitor)
      @monitor = monitor
      @cond = Thread::ConditionVariable.new
    end
  end

  def self.extend_object(obj)
    super(obj)
    obj.__send__(:mon_initialize)
  end

  #
  # Attempts to enter exclusive section.  Returns +false+ if lock fails.
  #
  def mon_try_enter
    @mon_data.try_enter
  end
  # For backward compatibility
  alias try_mon_enter mon_try_enter

  #
  # Enters exclusive section.
  #
  def mon_enter
    @mon_data.enter
  end

  #
  # Leaves exclusive section.
  #
  def mon_exit
    mon_check_owner
    @mon_data.exit
  end

  #
  # Returns true if this monitor is locked by any thread
  #
  def mon_locked?
    @mon_data.mon_locked?
  end

  #
  # Returns true if this monitor is locked by current thread.
  #
  def mon_owned?
    @mon_data.mon_owned?
  end

  #
  # Enters exclusive section and executes the block.  Leaves the exclusive
  # section automatically when the block exits.  See example under
  # +MonitorMixin+.
  #
  def mon_synchronize(&b)
    @mon_data.synchronize(&b)
  end
  alias synchronize mon_synchronize

  #
  # Creates a new MonitorMixin::ConditionVariable associated with the
  # Monitor object.
  #
  def new_cond
    unless defined?(@mon_data)
      mon_initialize
      @mon_initialized_by_new_cond = true
    end
    return ConditionVariable.new(@mon_data)
  end

  private

  # Use <tt>extend MonitorMixin</tt> or <tt>include MonitorMixin</tt> instead
  # of this constructor.  Have look at the examples above to understand how to
  # use this module.
  def initialize(...)
    super
    mon_initialize
  end

  # Initializes the MonitorMixin after being included in a class or when an
  # object has been extended with the MonitorMixin
  def mon_initialize
    if defined?(@mon_data)
      if defined?(@mon_initialized_by_new_cond)
        return # already initialized.
      elsif @mon_data_owner_object_id == self.object_id
        raise ThreadError, "already initialized"
      end
    end
    @mon_data = ::Monitor.new
    @mon_data_owner_object_id = self.object_id
  end

  def mon_check_owner
    @mon_data.mon_check_owner
  end
end

# Use the Monitor class when you want to have a lock object for blocks with
# mutual exclusion.
#
#   require 'monitor'
#
#   lock = Monitor.new
#   lock.synchronize do
#     # exclusive access
#   end
#
class Monitor
  def new_cond
    ::MonitorMixin::ConditionVariable.new(self)
  end

  # for compatibility
  alias try_mon_enter try_enter
  alias mon_try_enter try_enter
  alias mon_enter enter
  alias mon_exit exit
  alias mon_synchronize synchronize
end

# Documentation comments:
#  - All documentation comes from Nutshell.
#  - MonitorMixin.new_cond appears in the example, but is not documented in
#    Nutshell.
#  - All the internals (internal modules Accessible and Initializable, class
#    ConditionVariable) appear in RDoc.  It might be good to hide them, by
#    making them private, or marking them :nodoc:, etc.
#  - RDoc doesn't recognise aliases, so we have mon_synchronize documented, but
#    not synchronize.
#  - mon_owner is in Nutshell, but appears as an accessor in a separate module
#    here, so is hard/impossible to RDoc.  Some other useful accessors
#    (mon_count and some queue stuff) are also in this module, and don't appear
#    directly in the RDoc output.
#  - in short, it may be worth changing the code layout in this file to make the
#    documentation easier
PK}$[�3�A��ruby/weakref.rbnu�[���# frozen_string_literal: true
require "delegate"

# Weak Reference class that allows a referenced object to be
# garbage-collected.
#
# A WeakRef may be used exactly like the object it references.
#
# Usage:
#
#   foo = Object.new            # create a new object instance
#   p foo.to_s                  # original's class
#   foo = WeakRef.new(foo)      # reassign foo with WeakRef instance
#   p foo.to_s                  # should be same class
#   GC.start                    # start the garbage collector
#   p foo.to_s                  # should raise exception (recycled)
#

class WeakRef < Delegator
  VERSION = "0.1.1"

  ##
  # RefError is raised when a referenced object has been recycled by the
  # garbage collector

  class RefError < StandardError
  end

  @@__map = ::ObjectSpace::WeakMap.new

  ##
  # Creates a weak reference to +orig+
  #
  # Raises an ArgumentError if the given +orig+ is immutable, such as Symbol,
  # Integer, or Float.

  def initialize(orig)
    case orig
    when true, false, nil
      @delegate_sd_obj = orig
    else
      @@__map[self] = orig
    end
    super
  end

  def __getobj__ # :nodoc:
    @@__map[self] or defined?(@delegate_sd_obj) ? @delegate_sd_obj :
      Kernel::raise(RefError, "Invalid Reference - probably recycled", Kernel::caller(2))
  end

  def __setobj__(obj) # :nodoc:
  end

  ##
  # Returns true if the referenced object is still alive.

  def weakref_alive?
    @@__map.key?(self) or defined?(@delegate_sd_obj)
  end
end
PK}$[�x��FFruby/openssl/version.rbnu�[���# frozen_string_literal: true

module OpenSSL
  VERSION = "3.0.1"
end
PK}$[`�_�E�Eruby/openssl/ssl.rbnu�[���# frozen_string_literal: true
=begin
= Info
  'OpenSSL for Ruby 2' project
  Copyright (C) 2001 GOTOU YUUZOU <gotoyuzo@notwork.org>
  All rights reserved.

= Licence
  This program is licensed under the same licence as Ruby.
  (See the file 'LICENCE'.)
=end

require "openssl/buffering"
require "io/nonblock"
require "ipaddr"
require "socket"

module OpenSSL
  module SSL
    class SSLContext
      DEFAULT_PARAMS = { # :nodoc:
        :min_version => OpenSSL::SSL::TLS1_VERSION,
        :verify_mode => OpenSSL::SSL::VERIFY_PEER,
        :verify_hostname => true,
        :options => -> {
          opts = OpenSSL::SSL::OP_ALL
          opts &= ~OpenSSL::SSL::OP_DONT_INSERT_EMPTY_FRAGMENTS
          opts |= OpenSSL::SSL::OP_NO_COMPRESSION
          opts
        }.call
      }

      if defined?(OpenSSL::PKey::DH)
        DEFAULT_2048 = OpenSSL::PKey::DH.new <<-_end_of_pem_
-----BEGIN DH PARAMETERS-----
MIIBCAKCAQEA7E6kBrYiyvmKAMzQ7i8WvwVk9Y/+f8S7sCTN712KkK3cqd1jhJDY
JbrYeNV3kUIKhPxWHhObHKpD1R84UpL+s2b55+iMd6GmL7OYmNIT/FccKhTcveab
VBmZT86BZKYyf45hUF9FOuUM9xPzuK3Vd8oJQvfYMCd7LPC0taAEljQLR4Edf8E6
YoaOffgTf5qxiwkjnlVZQc3whgnEt9FpVMvQ9eknyeGB5KHfayAc3+hUAvI3/Cr3
1bNveX5wInh5GDx1FGhKBZ+s1H+aedudCm7sCgRwv8lKWYGiHzObSma8A86KG+MD
7Lo5JquQ3DlBodj3IDyPrxIv96lvRPFtAwIBAg==
-----END DH PARAMETERS-----
        _end_of_pem_
        private_constant :DEFAULT_2048

        DEFAULT_TMP_DH_CALLBACK = lambda { |ctx, is_export, keylen| # :nodoc:
          warn "using default DH parameters." if $VERBOSE
          DEFAULT_2048
        }
      end

      if !(OpenSSL::OPENSSL_VERSION.start_with?("OpenSSL") &&
           OpenSSL::OPENSSL_VERSION_NUMBER >= 0x10100000)
        DEFAULT_PARAMS.merge!(
          ciphers: %w{
            ECDHE-ECDSA-AES128-GCM-SHA256
            ECDHE-RSA-AES128-GCM-SHA256
            ECDHE-ECDSA-AES256-GCM-SHA384
            ECDHE-RSA-AES256-GCM-SHA384
            DHE-RSA-AES128-GCM-SHA256
            DHE-DSS-AES128-GCM-SHA256
            DHE-RSA-AES256-GCM-SHA384
            DHE-DSS-AES256-GCM-SHA384
            ECDHE-ECDSA-AES128-SHA256
            ECDHE-RSA-AES128-SHA256
            ECDHE-ECDSA-AES128-SHA
            ECDHE-RSA-AES128-SHA
            ECDHE-ECDSA-AES256-SHA384
            ECDHE-RSA-AES256-SHA384
            ECDHE-ECDSA-AES256-SHA
            ECDHE-RSA-AES256-SHA
            DHE-RSA-AES128-SHA256
            DHE-RSA-AES256-SHA256
            DHE-RSA-AES128-SHA
            DHE-RSA-AES256-SHA
            DHE-DSS-AES128-SHA256
            DHE-DSS-AES256-SHA256
            DHE-DSS-AES128-SHA
            DHE-DSS-AES256-SHA
            AES128-GCM-SHA256
            AES256-GCM-SHA384
            AES128-SHA256
            AES256-SHA256
            AES128-SHA
            AES256-SHA
          }.join(":"),
        )
      end

      DEFAULT_CERT_STORE = OpenSSL::X509::Store.new # :nodoc:
      DEFAULT_CERT_STORE.set_default_paths
      DEFAULT_CERT_STORE.flags = OpenSSL::X509::V_FLAG_CRL_CHECK_ALL

      # A callback invoked when DH parameters are required for ephemeral DH key
      # exchange.
      #
      # The callback is invoked with the SSLSocket, a
      # flag indicating the use of an export cipher and the keylength
      # required.
      #
      # The callback must return an OpenSSL::PKey::DH instance of the correct
      # key length.
      #
      # <b>Deprecated in version 3.0.</b> Use #tmp_dh= instead.
      attr_accessor :tmp_dh_callback

      # A callback invoked at connect time to distinguish between multiple
      # server names.
      #
      # The callback is invoked with an SSLSocket and a server name.  The
      # callback must return an SSLContext for the server name or nil.
      attr_accessor :servername_cb

      # call-seq:
      #    SSLContext.new           -> ctx
      #    SSLContext.new(:TLSv1)   -> ctx
      #    SSLContext.new("SSLv23") -> ctx
      #
      # Creates a new SSL context.
      #
      # If an argument is given, #ssl_version= is called with the value. Note
      # that this form is deprecated. New applications should use #min_version=
      # and #max_version= as necessary.
      def initialize(version = nil)
        self.options |= OpenSSL::SSL::OP_ALL
        self.ssl_version = version if version
        self.verify_mode = OpenSSL::SSL::VERIFY_NONE
        self.verify_hostname = false
      end

      ##
      # call-seq:
      #   ctx.set_params(params = {}) -> params
      #
      # Sets saner defaults optimized for the use with HTTP-like protocols.
      #
      # If a Hash _params_ is given, the parameters are overridden with it.
      # The keys in _params_ must be assignment methods on SSLContext.
      #
      # If the verify_mode is not VERIFY_NONE and ca_file, ca_path and
      # cert_store are not set then the system default certificate store is
      # used.
      def set_params(params={})
        params = DEFAULT_PARAMS.merge(params)
        self.options = params.delete(:options) # set before min_version/max_version
        params.each{|name, value| self.__send__("#{name}=", value) }
        if self.verify_mode != OpenSSL::SSL::VERIFY_NONE
          unless self.ca_file or self.ca_path or self.cert_store
            self.cert_store = DEFAULT_CERT_STORE
          end
        end
        return params
      end

      # call-seq:
      #    ctx.min_version = OpenSSL::SSL::TLS1_2_VERSION
      #    ctx.min_version = :TLS1_2
      #    ctx.min_version = nil
      #
      # Sets the lower bound on the supported SSL/TLS protocol version. The
      # version may be specified by an integer constant named
      # OpenSSL::SSL::*_VERSION, a Symbol, or +nil+ which means "any version".
      #
      # Be careful that you don't overwrite OpenSSL::SSL::OP_NO_{SSL,TLS}v*
      # options by #options= once you have called #min_version= or
      # #max_version=.
      #
      # === Example
      #   ctx = OpenSSL::SSL::SSLContext.new
      #   ctx.min_version = OpenSSL::SSL::TLS1_1_VERSION
      #   ctx.max_version = OpenSSL::SSL::TLS1_2_VERSION
      #
      #   sock = OpenSSL::SSL::SSLSocket.new(tcp_sock, ctx)
      #   sock.connect # Initiates a connection using either TLS 1.1 or TLS 1.2
      def min_version=(version)
        set_minmax_proto_version(version, @max_proto_version ||= nil)
        @min_proto_version = version
      end

      # call-seq:
      #    ctx.max_version = OpenSSL::SSL::TLS1_2_VERSION
      #    ctx.max_version = :TLS1_2
      #    ctx.max_version = nil
      #
      # Sets the upper bound of the supported SSL/TLS protocol version. See
      # #min_version= for the possible values.
      def max_version=(version)
        set_minmax_proto_version(@min_proto_version ||= nil, version)
        @max_proto_version = version
      end

      # call-seq:
      #    ctx.ssl_version = :TLSv1
      #    ctx.ssl_version = "SSLv23"
      #
      # Sets the SSL/TLS protocol version for the context. This forces
      # connections to use only the specified protocol version. This is
      # deprecated and only provided for backwards compatibility. Use
      # #min_version= and #max_version= instead.
      #
      # === History
      # As the name hints, this used to call the SSL_CTX_set_ssl_version()
      # function which sets the SSL method used for connections created from
      # the context. As of Ruby/OpenSSL 2.1, this accessor method is
      # implemented to call #min_version= and #max_version= instead.
      def ssl_version=(meth)
        meth = meth.to_s if meth.is_a?(Symbol)
        if /(?<type>_client|_server)\z/ =~ meth
          meth = $`
          if $VERBOSE
            warn "#{caller(1, 1)[0]}: method type #{type.inspect} is ignored"
          end
        end
        version = METHODS_MAP[meth.intern] or
          raise ArgumentError, "unknown SSL method `%s'" % meth
        set_minmax_proto_version(version, version)
        @min_proto_version = @max_proto_version = version
      end

      METHODS_MAP = {
        SSLv23: 0,
        SSLv2: OpenSSL::SSL::SSL2_VERSION,
        SSLv3: OpenSSL::SSL::SSL3_VERSION,
        TLSv1: OpenSSL::SSL::TLS1_VERSION,
        TLSv1_1: OpenSSL::SSL::TLS1_1_VERSION,
        TLSv1_2: OpenSSL::SSL::TLS1_2_VERSION,
      }.freeze
      private_constant :METHODS_MAP

      # The list of available SSL/TLS methods. This constant is only provided
      # for backwards compatibility.
      METHODS = METHODS_MAP.flat_map { |name,|
        [name, :"#{name}_client", :"#{name}_server"]
      }.freeze
      deprecate_constant :METHODS
    end

    module SocketForwarder
      # The file descriptor for the socket.
      def fileno
        to_io.fileno
      end

      def addr
        to_io.addr
      end

      def peeraddr
        to_io.peeraddr
      end

      def setsockopt(level, optname, optval)
        to_io.setsockopt(level, optname, optval)
      end

      def getsockopt(level, optname)
        to_io.getsockopt(level, optname)
      end

      def fcntl(*args)
        to_io.fcntl(*args)
      end

      def closed?
        to_io.closed?
      end

      def do_not_reverse_lookup=(flag)
        to_io.do_not_reverse_lookup = flag
      end
    end

    def verify_certificate_identity(cert, hostname)
      should_verify_common_name = true
      cert.extensions.each{|ext|
        next if ext.oid != "subjectAltName"
        ostr = OpenSSL::ASN1.decode(ext.to_der).value.last
        sequence = OpenSSL::ASN1.decode(ostr.value)
        sequence.value.each{|san|
          case san.tag
          when 2 # dNSName in GeneralName (RFC5280)
            should_verify_common_name = false
            return true if verify_hostname(hostname, san.value)
          when 7 # iPAddress in GeneralName (RFC5280)
            should_verify_common_name = false
            if san.value.size == 4 || san.value.size == 16
              begin
                return true if san.value == IPAddr.new(hostname).hton
              rescue IPAddr::InvalidAddressError
              end
            end
          end
        }
      }
      if should_verify_common_name
        cert.subject.to_a.each{|oid, value|
          if oid == "CN"
            return true if verify_hostname(hostname, value)
          end
        }
      end
      return false
    end
    module_function :verify_certificate_identity

    def verify_hostname(hostname, san) # :nodoc:
      # RFC 5280, IA5String is limited to the set of ASCII characters
      return false unless san.ascii_only?
      return false unless hostname.ascii_only?

      # See RFC 6125, section 6.4.1
      # Matching is case-insensitive.
      san_parts = san.downcase.split(".")

      # TODO: this behavior should probably be more strict
      return san == hostname if san_parts.size < 2

      # Matching is case-insensitive.
      host_parts = hostname.downcase.split(".")

      # RFC 6125, section 6.4.3, subitem 2.
      # If the wildcard character is the only character of the left-most
      # label in the presented identifier, the client SHOULD NOT compare
      # against anything but the left-most label of the reference
      # identifier (e.g., *.example.com would match foo.example.com but
      # not bar.foo.example.com or example.com).
      return false unless san_parts.size == host_parts.size

      # RFC 6125, section 6.4.3, subitem 1.
      # The client SHOULD NOT attempt to match a presented identifier in
      # which the wildcard character comprises a label other than the
      # left-most label (e.g., do not match bar.*.example.net).
      return false unless verify_wildcard(host_parts.shift, san_parts.shift)

      san_parts.join(".") == host_parts.join(".")
    end
    module_function :verify_hostname

    def verify_wildcard(domain_component, san_component) # :nodoc:
      parts = san_component.split("*", -1)

      return false if parts.size > 2
      return san_component == domain_component if parts.size == 1

      # RFC 6125, section 6.4.3, subitem 3.
      # The client SHOULD NOT attempt to match a presented identifier
      # where the wildcard character is embedded within an A-label or
      # U-label of an internationalized domain name.
      return false if domain_component.start_with?("xn--") && san_component != "*"

      parts[0].length + parts[1].length < domain_component.length &&
      domain_component.start_with?(parts[0]) &&
      domain_component.end_with?(parts[1])
    end
    module_function :verify_wildcard

    class SSLSocket
      include Buffering
      include SocketForwarder

      attr_reader :hostname

      # The underlying IO object.
      attr_reader :io
      alias :to_io :io

      # The SSLContext object used in this connection.
      attr_reader :context

      # Whether to close the underlying socket as well, when the SSL/TLS
      # connection is shut down. This defaults to +false+.
      attr_accessor :sync_close

      # call-seq:
      #    ssl.sysclose => nil
      #
      # Sends "close notify" to the peer and tries to shut down the SSL
      # connection gracefully.
      #
      # If sync_close is set to +true+, the underlying IO is also closed.
      def sysclose
        return if closed?
        stop
        io.close if sync_close
      end

      # call-seq:
      #   ssl.post_connection_check(hostname) -> true
      #
      # Perform hostname verification following RFC 6125.
      #
      # This method MUST be called after calling #connect to ensure that the
      # hostname of a remote peer has been verified.
      def post_connection_check(hostname)
        if peer_cert.nil?
          msg = "Peer verification enabled, but no certificate received."
          if using_anon_cipher?
            msg += " Anonymous cipher suite #{cipher[0]} was negotiated. " \
                   "Anonymous suites must be disabled to use peer verification."
          end
          raise SSLError, msg
        end

        unless OpenSSL::SSL.verify_certificate_identity(peer_cert, hostname)
          raise SSLError, "hostname \"#{hostname}\" does not match the server certificate"
        end
        return true
      end

      # call-seq:
      #   ssl.session -> aSession
      #
      # Returns the SSLSession object currently used, or nil if the session is
      # not established.
      def session
        SSL::Session.new(self)
      rescue SSL::Session::SessionError
        nil
      end

      private

      def using_anon_cipher?
        ctx = OpenSSL::SSL::SSLContext.new
        ctx.ciphers = "aNULL"
        ctx.ciphers.include?(cipher)
      end

      def client_cert_cb
        @context.client_cert_cb
      end

      def tmp_dh_callback
        @context.tmp_dh_callback || OpenSSL::SSL::SSLContext::DEFAULT_TMP_DH_CALLBACK
      end

      def session_new_cb
        @context.session_new_cb
      end

      def session_get_cb
        @context.session_get_cb
      end

      class << self

        # call-seq:
        #   open(remote_host, remote_port, local_host=nil, local_port=nil, context: nil)
        #
        # Creates a new instance of SSLSocket.
        # _remote\_host_ and _remote\_port_ are used to open TCPSocket.
        # If _local\_host_ and _local\_port_ are specified,
        # then those parameters are used on the local end to establish the connection.
        # If _context_ is provided,
        # the SSL Sockets initial params will be taken from the context.
        #
        # === Examples
        #
        #   sock = OpenSSL::SSL::SSLSocket.open('localhost', 443)
        #   sock.connect # Initiates a connection to localhost:443
        #
        # with SSLContext:
        #
        #   ctx = OpenSSL::SSL::SSLContext.new
        #   sock = OpenSSL::SSL::SSLSocket.open('localhost', 443, context: ctx)
        #   sock.connect # Initiates a connection to localhost:443 with SSLContext
        def open(remote_host, remote_port, local_host=nil, local_port=nil, context: nil)
          sock = ::TCPSocket.open(remote_host, remote_port, local_host, local_port)
          if context.nil?
            return OpenSSL::SSL::SSLSocket.new(sock)
          else
            return OpenSSL::SSL::SSLSocket.new(sock, context)
          end
        end
      end
    end

    ##
    # SSLServer represents a TCP/IP server socket with Secure Sockets Layer.
    class SSLServer
      include SocketForwarder
      # When true then #accept works exactly the same as TCPServer#accept
      attr_accessor :start_immediately

      # Creates a new instance of SSLServer.
      # * _srv_ is an instance of TCPServer.
      # * _ctx_ is an instance of OpenSSL::SSL::SSLContext.
      def initialize(svr, ctx)
        @svr = svr
        @ctx = ctx
        unless ctx.session_id_context
          # see #6137 - session id may not exceed 32 bytes
          prng = ::Random.new($0.hash)
          session_id = prng.bytes(16).unpack('H*')[0]
          @ctx.session_id_context = session_id
        end
        @start_immediately = true
      end

      # Returns the TCPServer passed to the SSLServer when initialized.
      def to_io
        @svr
      end

      # See TCPServer#listen for details.
      def listen(backlog=Socket::SOMAXCONN)
        @svr.listen(backlog)
      end

      # See BasicSocket#shutdown for details.
      def shutdown(how=Socket::SHUT_RDWR)
        @svr.shutdown(how)
      end

      # Works similar to TCPServer#accept.
      def accept
        # Socket#accept returns [socket, addrinfo].
        # TCPServer#accept returns a socket.
        # The following comma strips addrinfo.
        sock, = @svr.accept
        begin
          ssl = OpenSSL::SSL::SSLSocket.new(sock, @ctx)
          ssl.sync_close = true
          ssl.accept if @start_immediately
          ssl
        rescue Exception => ex
          if ssl
            ssl.close
          else
            sock.close
          end
          raise ex
        end
      end

      # See IO#close for details.
      def close
        @svr.close
      end
    end
  end
end
PK}$[��;��ruby/openssl/digest.rbnu�[���# frozen_string_literal: true
#--
# = Ruby-space predefined Digest subclasses
#
# = Info
# 'OpenSSL for Ruby 2' project
# Copyright (C) 2002  Michal Rokos <m.rokos@sh.cvut.cz>
# All rights reserved.
#
# = Licence
# This program is licensed under the same licence as Ruby.
# (See the file 'LICENCE'.)
#++

module OpenSSL
  class Digest

    # Return the hash value computed with _name_ Digest. _name_ is either the
    # long name or short name of a supported digest algorithm.
    #
    # === Examples
    #
    #   OpenSSL::Digest.digest("SHA256", "abc")
    #
    # which is equivalent to:
    #
    #   OpenSSL::Digest.digest('SHA256', "abc")

    def self.digest(name, data)
      super(data, name)
    end

    %w(MD4 MD5 RIPEMD160 SHA1 SHA224 SHA256 SHA384 SHA512).each do |name|
      klass = Class.new(self) {
        define_method(:initialize, ->(data = nil) {super(name, data)})
      }

      singleton = (class << klass; self; end)

      singleton.class_eval{
        define_method(:digest) {|data| new.digest(data)}
        define_method(:hexdigest) {|data| new.hexdigest(data)}
      }

      const_set(name.tr('-', '_'), klass)
    end

    # Deprecated.
    #
    # This class is only provided for backwards compatibility.
    # Use OpenSSL::Digest instead.
    class Digest < Digest; end # :nodoc:
    deprecate_constant :Digest

  end # Digest

  # Returns a Digest subclass by _name_
  #
  #   require 'openssl'
  #
  #   OpenSSL::Digest("MD5")
  #   # => OpenSSL::Digest::MD5
  #
  #   Digest("Foo")
  #   # => NameError: wrong constant name Foo

  def Digest(name)
    OpenSSL::Digest.const_get(name)
  end

  module_function :Digest

end # OpenSSL
PK}$[�s�=88ruby/openssl/marshal.rbnu�[���# frozen_string_literal: true
#--
# = Ruby-space definitions to add DER (de)serialization to classes
#
# = Info
# 'OpenSSL for Ruby 2' project
# Copyright (C) 2002  Michal Rokos <m.rokos@sh.cvut.cz>
# All rights reserved.
#
# = Licence
# This program is licensed under the same licence as Ruby.
# (See the file 'LICENCE'.)
#++
module OpenSSL
  module Marshal
    def self.included(base)
      base.extend(ClassMethods)
    end

    module ClassMethods
      def _load(string)
        new(string)
      end
    end

    def _dump(_level)
      to_der
    end
  end
end
PK}$[�/���ruby/openssl/cipher.rbnu�[���# frozen_string_literal: true
#--
# = Ruby-space predefined Cipher subclasses
#
# = Info
# 'OpenSSL for Ruby 2' project
# Copyright (C) 2002  Michal Rokos <m.rokos@sh.cvut.cz>
# All rights reserved.
#
# = Licence
# This program is licensed under the same licence as Ruby.
# (See the file 'LICENCE'.)
#++

module OpenSSL
  class Cipher
    %w(AES CAST5 BF DES IDEA RC2 RC4 RC5).each{|name|
      klass = Class.new(Cipher){
        define_method(:initialize){|*args|
          cipher_name = args.inject(name){|n, arg| "#{n}-#{arg}" }
          super(cipher_name.downcase)
        }
      }
      const_set(name, klass)
    }

    %w(128 192 256).each{|keylen|
      klass = Class.new(Cipher){
        define_method(:initialize){|mode = "CBC"|
          super("aes-#{keylen}-#{mode}".downcase)
        }
      }
      const_set("AES#{keylen}", klass)
    }

    # call-seq:
    #   cipher.random_key -> key
    #
    # Generate a random key with OpenSSL::Random.random_bytes and sets it to
    # the cipher, and returns it.
    #
    # You must call #encrypt or #decrypt before calling this method.
    def random_key
      str = OpenSSL::Random.random_bytes(self.key_len)
      self.key = str
    end

    # call-seq:
    #   cipher.random_iv -> iv
    #
    # Generate a random IV with OpenSSL::Random.random_bytes and sets it to the
    # cipher, and returns it.
    #
    # You must call #encrypt or #decrypt before calling this method.
    def random_iv
      str = OpenSSL::Random.random_bytes(self.iv_len)
      self.iv = str
    end

    # Deprecated.
    #
    # This class is only provided for backwards compatibility.
    # Use OpenSSL::Cipher.
    class Cipher < Cipher; end
    deprecate_constant :Cipher
  end # Cipher
end # OpenSSL
PK}$[�*eeruby/openssl/pkcs5.rbnu�[���# frozen_string_literal: true
#--
# Ruby/OpenSSL Project
# Copyright (C) 2017 Ruby/OpenSSL Project Authors
#++

module OpenSSL
  module PKCS5
    module_function

    # OpenSSL::PKCS5.pbkdf2_hmac has been renamed to OpenSSL::KDF.pbkdf2_hmac.
    # This method is provided for backwards compatibility.
    def pbkdf2_hmac(pass, salt, iter, keylen, digest)
      OpenSSL::KDF.pbkdf2_hmac(pass, salt: salt, iterations: iter,
                               length: keylen, hash: digest)
    end

    def pbkdf2_hmac_sha1(pass, salt, iter, keylen)
      pbkdf2_hmac(pass, salt, iter, keylen, "sha1")
    end
  end
end
PK}$[Ȏ9g.g.ruby/openssl/x509.rbnu�[���# frozen_string_literal: true
#--
# = Ruby-space definitions that completes C-space funcs for X509 and subclasses
#
# = Info
# 'OpenSSL for Ruby 2' project
# Copyright (C) 2002  Michal Rokos <m.rokos@sh.cvut.cz>
# All rights reserved.
#
# = Licence
# This program is licensed under the same licence as Ruby.
# (See the file 'LICENCE'.)
#++

require_relative 'marshal'

module OpenSSL
  module X509
    class ExtensionFactory
      def create_extension(*arg)
        if arg.size > 1
          create_ext(*arg)
        else
          send("create_ext_from_"+arg[0].class.name.downcase, arg[0])
        end
      end

      def create_ext_from_array(ary)
        raise ExtensionError, "unexpected array form" if ary.size > 3
        create_ext(ary[0], ary[1], ary[2])
      end

      def create_ext_from_string(str) # "oid = critical, value"
        oid, value = str.split(/=/, 2)
        oid.strip!
        value.strip!
        create_ext(oid, value)
      end

      def create_ext_from_hash(hash)
        create_ext(hash["oid"], hash["value"], hash["critical"])
      end
    end

    class Extension
      include OpenSSL::Marshal

      def ==(other)
        return false unless Extension === other
        to_der == other.to_der
      end

      def to_s # "oid = critical, value"
        str = self.oid
        str << " = "
        str << "critical, " if self.critical?
        str << self.value.gsub(/\n/, ", ")
      end

      def to_h # {"oid"=>sn|ln, "value"=>value, "critical"=>true|false}
        {"oid"=>self.oid,"value"=>self.value,"critical"=>self.critical?}
      end

      def to_a
        [ self.oid, self.value, self.critical? ]
      end

      module Helpers
        def find_extension(oid)
          extensions.find { |e| e.oid == oid }
        end
      end

      module SubjectKeyIdentifier
        include Helpers

        # Get the subject's key identifier from the subjectKeyIdentifier
        # exteension, as described in RFC5280 Section 4.2.1.2.
        #
        # Returns the binary String key identifier or nil or raises
        # ASN1::ASN1Error.
        def subject_key_identifier
          ext = find_extension("subjectKeyIdentifier")
          return nil if ext.nil?

          ski_asn1 = ASN1.decode(ext.value_der)
          if ext.critical? || ski_asn1.tag_class != :UNIVERSAL || ski_asn1.tag != ASN1::OCTET_STRING
            raise ASN1::ASN1Error, "invalid extension"
          end

          ski_asn1.value
        end
      end

      module AuthorityKeyIdentifier
        include Helpers

        # Get the issuing certificate's key identifier from the
        # authorityKeyIdentifier extension, as described in RFC5280
        # Section 4.2.1.1
        #
        # Returns the binary String keyIdentifier or nil or raises
        # ASN1::ASN1Error.
        def authority_key_identifier
          ext = find_extension("authorityKeyIdentifier")
          return nil if ext.nil?

          aki_asn1 = ASN1.decode(ext.value_der)
          if ext.critical? || aki_asn1.tag_class != :UNIVERSAL || aki_asn1.tag != ASN1::SEQUENCE
            raise ASN1::ASN1Error, "invalid extension"
          end

          key_id = aki_asn1.value.find do |v|
            v.tag_class == :CONTEXT_SPECIFIC && v.tag == 0
          end

          key_id.nil? ? nil : key_id.value
        end
      end

      module CRLDistributionPoints
        include Helpers

        # Get the distributionPoint fullName URI from the certificate's CRL
        # distribution points extension, as described in RFC5280 Section
        # 4.2.1.13
        #
        # Returns an array of strings or nil or raises ASN1::ASN1Error.
        def crl_uris
          ext = find_extension("crlDistributionPoints")
          return nil if ext.nil?

          cdp_asn1 = ASN1.decode(ext.value_der)
          if cdp_asn1.tag_class != :UNIVERSAL || cdp_asn1.tag != ASN1::SEQUENCE
            raise ASN1::ASN1Error, "invalid extension"
          end

          crl_uris = cdp_asn1.map do |crl_distribution_point|
            distribution_point = crl_distribution_point.value.find do |v|
              v.tag_class == :CONTEXT_SPECIFIC && v.tag == 0
            end
            full_name = distribution_point&.value&.find do |v|
              v.tag_class == :CONTEXT_SPECIFIC && v.tag == 0
            end
            full_name&.value&.find do |v|
              v.tag_class == :CONTEXT_SPECIFIC && v.tag == 6 # uniformResourceIdentifier
            end
          end

          crl_uris&.map(&:value)
        end
      end

      module AuthorityInfoAccess
        include Helpers

        # Get the information and services for the issuer from the certificate's
        # authority information access extension exteension, as described in RFC5280
        # Section 4.2.2.1.
        #
        # Returns an array of strings or nil or raises ASN1::ASN1Error.
        def ca_issuer_uris
          aia_asn1 = parse_aia_asn1
          return nil if aia_asn1.nil?

          ca_issuer = aia_asn1.value.select do |authority_info_access|
            authority_info_access.value.first.value == "caIssuers"
          end

          ca_issuer&.map(&:value)&.map(&:last)&.map(&:value)
        end

        # Get the URIs for OCSP from the certificate's authority information access
        # extension exteension, as described in RFC5280 Section 4.2.2.1.
        #
        # Returns an array of strings or nil or raises ASN1::ASN1Error.
        def ocsp_uris
          aia_asn1 = parse_aia_asn1
          return nil if aia_asn1.nil?

          ocsp = aia_asn1.value.select do |authority_info_access|
            authority_info_access.value.first.value == "OCSP"
          end

          ocsp&.map(&:value)&.map(&:last)&.map(&:value)
        end

        private

          def parse_aia_asn1
            ext = find_extension("authorityInfoAccess")
            return nil if ext.nil?

            aia_asn1 = ASN1.decode(ext.value_der)
            if ext.critical? || aia_asn1.tag_class != :UNIVERSAL || aia_asn1.tag != ASN1::SEQUENCE
              raise ASN1::ASN1Error, "invalid extension"
            end

            aia_asn1
          end
      end
    end

    class Name
      include OpenSSL::Marshal

      module RFC2253DN
        Special = ',=+<>#;'
        HexChar = /[0-9a-fA-F]/
        HexPair = /#{HexChar}#{HexChar}/
        HexString = /#{HexPair}+/
        Pair = /\\(?:[#{Special}]|\\|"|#{HexPair})/
        StringChar = /[^\\"#{Special}]/
        QuoteChar = /[^\\"]/
        AttributeType = /[a-zA-Z][0-9a-zA-Z]*|[0-9]+(?:\.[0-9]+)*/
        AttributeValue = /
          (?!["#])((?:#{StringChar}|#{Pair})*)|
          \#(#{HexString})|
          "((?:#{QuoteChar}|#{Pair})*)"
        /x
        TypeAndValue = /\A(#{AttributeType})=#{AttributeValue}/

        module_function

        def expand_pair(str)
          return nil unless str
          return str.gsub(Pair){
            pair = $&
            case pair.size
            when 2 then pair[1,1]
            when 3 then Integer("0x#{pair[1,2]}").chr
            else raise OpenSSL::X509::NameError, "invalid pair: #{str}"
            end
          }
        end

        def expand_hexstring(str)
          return nil unless str
          der = str.gsub(HexPair){$&.to_i(16).chr }
          a1 = OpenSSL::ASN1.decode(der)
          return a1.value, a1.tag
        end

        def expand_value(str1, str2, str3)
          value = expand_pair(str1)
          value, tag = expand_hexstring(str2) unless value
          value = expand_pair(str3) unless value
          return value, tag
        end

        def scan(dn)
          str = dn
          ary = []
          while true
            if md = TypeAndValue.match(str)
              remain = md.post_match
              type = md[1]
              value, tag = expand_value(md[2], md[3], md[4]) rescue nil
              if value
                type_and_value = [type, value]
                type_and_value.push(tag) if tag
                ary.unshift(type_and_value)
                if remain.length > 2 && remain[0] == ?,
                  str = remain[1..-1]
                  next
                elsif remain.length > 2 && remain[0] == ?+
                  raise OpenSSL::X509::NameError,
                    "multi-valued RDN is not supported: #{dn}"
                elsif remain.empty?
                  break
                end
              end
            end
            msg_dn = dn[0, dn.length - str.length] + " =>" + str
            raise OpenSSL::X509::NameError, "malformed RDN: #{msg_dn}"
          end
          return ary
        end
      end

      class << self
        # Parses the UTF-8 string representation of a distinguished name,
        # according to RFC 2253.
        #
        # See also #to_utf8 for the opposite operation.
        def parse_rfc2253(str, template=OBJECT_TYPE_TEMPLATE)
          ary = OpenSSL::X509::Name::RFC2253DN.scan(str)
          self.new(ary, template)
        end

        # Parses the string representation of a distinguished name. Two
        # different forms are supported:
        #
        # - \OpenSSL format (<tt>X509_NAME_oneline()</tt>) used by
        #   <tt>#to_s</tt>. For example: <tt>/DC=com/DC=example/CN=nobody</tt>
        # - \OpenSSL format (<tt>X509_NAME_print()</tt>)
        #   used by <tt>#to_s(OpenSSL::X509::Name::COMPAT)</tt>. For example:
        #   <tt>DC=com, DC=example, CN=nobody</tt>
        #
        # Neither of them is standardized and has quirks and inconsistencies
        # in handling of escaped characters or multi-valued RDNs.
        #
        # Use of this method is discouraged in new applications. See
        # Name.parse_rfc2253 and #to_utf8 for the alternative.
        def parse_openssl(str, template=OBJECT_TYPE_TEMPLATE)
          if str.start_with?("/")
            # /A=B/C=D format
            ary = str[1..-1].split("/").map { |i| i.split("=", 2) }
          else
            # Comma-separated
            ary = str.split(",").map { |i| i.strip.split("=", 2) }
          end
          self.new(ary, template)
        end

        alias parse parse_openssl
      end

      def pretty_print(q)
        q.object_group(self) {
          q.text ' '
          q.text to_s(OpenSSL::X509::Name::RFC2253)
        }
      end
    end

    class Attribute
      include OpenSSL::Marshal

      def ==(other)
        return false unless Attribute === other
        to_der == other.to_der
      end
    end

    class StoreContext
      def cleanup
        warn "(#{caller.first}) OpenSSL::X509::StoreContext#cleanup is deprecated with no replacement" if $VERBOSE
      end
    end

    class Certificate
      include OpenSSL::Marshal
      include Extension::SubjectKeyIdentifier
      include Extension::AuthorityKeyIdentifier
      include Extension::CRLDistributionPoints
      include Extension::AuthorityInfoAccess

      def pretty_print(q)
        q.object_group(self) {
          q.breakable
          q.text 'subject='; q.pp self.subject; q.text ','; q.breakable
          q.text 'issuer='; q.pp self.issuer; q.text ','; q.breakable
          q.text 'serial='; q.pp self.serial; q.text ','; q.breakable
          q.text 'not_before='; q.pp self.not_before; q.text ','; q.breakable
          q.text 'not_after='; q.pp self.not_after
        }
      end

      def self.load_file(path)
        load(File.binread(path))
      end
    end

    class CRL
      include OpenSSL::Marshal
      include Extension::AuthorityKeyIdentifier

      def ==(other)
        return false unless CRL === other
        to_der == other.to_der
      end
    end

    class Revoked
      def ==(other)
        return false unless Revoked === other
        to_der == other.to_der
      end
    end

    class Request
      include OpenSSL::Marshal

      def ==(other)
        return false unless Request === other
        to_der == other.to_der
      end
    end
  end
end
PK}$[�ݧ��(�(ruby/openssl/buffering.rbnu�[���# coding: binary
# frozen_string_literal: true
#--
#= Info
#  'OpenSSL for Ruby 2' project
#  Copyright (C) 2001 GOTOU YUUZOU <gotoyuzo@notwork.org>
#  All rights reserved.
#
#= Licence
#  This program is licensed under the same licence as Ruby.
#  (See the file 'LICENCE'.)
#++

##
# OpenSSL IO buffering mix-in module.
#
# This module allows an OpenSSL::SSL::SSLSocket to behave like an IO.
#
# You typically won't use this module directly, you can see it implemented in
# OpenSSL::SSL::SSLSocket.

module OpenSSL::Buffering
  include Enumerable

  # A buffer which will retain binary encoding.
  class Buffer < String
    BINARY = Encoding::BINARY

    def initialize
      super

      force_encoding(BINARY)
    end

    def << string
      if string.encoding == BINARY
        super(string)
      else
        super(string.b)
      end

      return self
    end

    alias concat <<
  end

  ##
  # The "sync mode" of the SSLSocket.
  #
  # See IO#sync for full details.

  attr_accessor :sync

  ##
  # Default size to read from or write to the SSLSocket for buffer operations.

  BLOCK_SIZE = 1024*16

  ##
  # Creates an instance of OpenSSL's buffering IO module.

  def initialize(*)
    super
    @eof = false
    @rbuffer = Buffer.new
    @sync = @io.sync
  end

  #
  # for reading.
  #
  private

  ##
  # Fills the buffer from the underlying SSLSocket

  def fill_rbuff
    begin
      @rbuffer << self.sysread(BLOCK_SIZE)
    rescue Errno::EAGAIN
      retry
    rescue EOFError
      @eof = true
    end
  end

  ##
  # Consumes _size_ bytes from the buffer

  def consume_rbuff(size=nil)
    if @rbuffer.empty?
      nil
    else
      size = @rbuffer.size unless size
      ret = @rbuffer[0, size]
      @rbuffer[0, size] = ""
      ret
    end
  end

  public

  # call-seq:
  #   ssl.getbyte => 81
  #
  # Get the next 8bit byte from `ssl`.  Returns `nil` on EOF
  def getbyte
    byte = read(1)
    byte && byte.unpack1("C")
  end

  ##
  # Reads _size_ bytes from the stream.  If _buf_ is provided it must
  # reference a string which will receive the data.
  #
  # See IO#read for full details.

  def read(size=nil, buf=nil)
    if size == 0
      if buf
        buf.clear
        return buf
      else
        return ""
      end
    end
    until @eof
      break if size && size <= @rbuffer.size
      fill_rbuff
    end
    ret = consume_rbuff(size) || ""
    if buf
      buf.replace(ret)
      ret = buf
    end
    (size && ret.empty?) ? nil : ret
  end

  ##
  # Reads at most _maxlen_ bytes from the stream.  If _buf_ is provided it
  # must reference a string which will receive the data.
  #
  # See IO#readpartial for full details.

  def readpartial(maxlen, buf=nil)
    if maxlen == 0
      if buf
        buf.clear
        return buf
      else
        return ""
      end
    end
    if @rbuffer.empty?
      begin
        return sysread(maxlen, buf)
      rescue Errno::EAGAIN
        retry
      end
    end
    ret = consume_rbuff(maxlen)
    if buf
      buf.replace(ret)
      ret = buf
    end
    ret
  end

  ##
  # Reads at most _maxlen_ bytes in the non-blocking manner.
  #
  # When no data can be read without blocking it raises
  # OpenSSL::SSL::SSLError extended by IO::WaitReadable or IO::WaitWritable.
  #
  # IO::WaitReadable means SSL needs to read internally so read_nonblock
  # should be called again when the underlying IO is readable.
  #
  # IO::WaitWritable means SSL needs to write internally so read_nonblock
  # should be called again after the underlying IO is writable.
  #
  # OpenSSL::Buffering#read_nonblock needs two rescue clause as follows:
  #
  #   # emulates blocking read (readpartial).
  #   begin
  #     result = ssl.read_nonblock(maxlen)
  #   rescue IO::WaitReadable
  #     IO.select([io])
  #     retry
  #   rescue IO::WaitWritable
  #     IO.select(nil, [io])
  #     retry
  #   end
  #
  # Note that one reason that read_nonblock writes to the underlying IO is
  # when the peer requests a new TLS/SSL handshake.  See openssl the FAQ for
  # more details.  http://www.openssl.org/support/faq.html
  #
  # By specifying a keyword argument _exception_ to +false+, you can indicate
  # that read_nonblock should not raise an IO::Wait*able exception, but
  # return the symbol +:wait_writable+ or +:wait_readable+ instead. At EOF,
  # it will return +nil+ instead of raising EOFError.

  def read_nonblock(maxlen, buf=nil, exception: true)
    if maxlen == 0
      if buf
        buf.clear
        return buf
      else
        return ""
      end
    end
    if @rbuffer.empty?
      return sysread_nonblock(maxlen, buf, exception: exception)
    end
    ret = consume_rbuff(maxlen)
    if buf
      buf.replace(ret)
      ret = buf
    end
    ret
  end

  ##
  # Reads the next "line" from the stream.  Lines are separated by _eol_.  If
  # _limit_ is provided the result will not be longer than the given number of
  # bytes.
  #
  # _eol_ may be a String or Regexp.
  #
  # Unlike IO#gets the line read will not be assigned to +$_+.
  #
  # Unlike IO#gets the separator must be provided if a limit is provided.

  def gets(eol=$/, limit=nil)
    idx = @rbuffer.index(eol)
    until @eof
      break if idx
      fill_rbuff
      idx = @rbuffer.index(eol)
    end
    if eol.is_a?(Regexp)
      size = idx ? idx+$&.size : nil
    else
      size = idx ? idx+eol.size : nil
    end
    if size && limit && limit >= 0
      size = [size, limit].min
    end
    consume_rbuff(size)
  end

  ##
  # Executes the block for every line in the stream where lines are separated
  # by _eol_.
  #
  # See also #gets

  def each(eol=$/)
    while line = self.gets(eol)
      yield line
    end
  end
  alias each_line each

  ##
  # Reads lines from the stream which are separated by _eol_.
  #
  # See also #gets

  def readlines(eol=$/)
    ary = []
    while line = self.gets(eol)
      ary << line
    end
    ary
  end

  ##
  # Reads a line from the stream which is separated by _eol_.
  #
  # Raises EOFError if at end of file.

  def readline(eol=$/)
    raise EOFError if eof?
    gets(eol)
  end

  ##
  # Reads one character from the stream.  Returns nil if called at end of
  # file.

  def getc
    read(1)
  end

  ##
  # Calls the given block once for each byte in the stream.

  def each_byte # :yields: byte
    while c = getc
      yield(c.ord)
    end
  end

  ##
  # Reads a one-character string from the stream.  Raises an EOFError at end
  # of file.

  def readchar
    raise EOFError if eof?
    getc
  end

  ##
  # Pushes character _c_ back onto the stream such that a subsequent buffered
  # character read will return it.
  #
  # Unlike IO#getc multiple bytes may be pushed back onto the stream.
  #
  # Has no effect on unbuffered reads (such as #sysread).

  def ungetc(c)
    @rbuffer[0,0] = c.chr
  end

  ##
  # Returns true if the stream is at file which means there is no more data to
  # be read.

  def eof?
    fill_rbuff if !@eof && @rbuffer.empty?
    @eof && @rbuffer.empty?
  end
  alias eof eof?

  #
  # for writing.
  #
  private

  ##
  # Writes _s_ to the buffer.  When the buffer is full or #sync is true the
  # buffer is flushed to the underlying socket.

  def do_write(s)
    @wbuffer = Buffer.new unless defined? @wbuffer
    @wbuffer << s
    @wbuffer.force_encoding(Encoding::BINARY)
    @sync ||= false
    if @sync or @wbuffer.size > BLOCK_SIZE
      until @wbuffer.empty?
        begin
          nwrote = syswrite(@wbuffer)
        rescue Errno::EAGAIN
          retry
        end
        @wbuffer[0, nwrote] = ""
      end
    end
  end

  public

  ##
  # Writes _s_ to the stream.  If the argument is not a String it will be
  # converted using +.to_s+ method.  Returns the number of bytes written.

  def write(*s)
    s.inject(0) do |written, str|
      do_write(str)
      written + str.bytesize
    end
  end

  ##
  # Writes _s_ in the non-blocking manner.
  #
  # If there is buffered data, it is flushed first.  This may block.
  #
  # write_nonblock returns number of bytes written to the SSL connection.
  #
  # When no data can be written without blocking it raises
  # OpenSSL::SSL::SSLError extended by IO::WaitReadable or IO::WaitWritable.
  #
  # IO::WaitReadable means SSL needs to read internally so write_nonblock
  # should be called again after the underlying IO is readable.
  #
  # IO::WaitWritable means SSL needs to write internally so write_nonblock
  # should be called again after underlying IO is writable.
  #
  # So OpenSSL::Buffering#write_nonblock needs two rescue clause as follows.
  #
  #   # emulates blocking write.
  #   begin
  #     result = ssl.write_nonblock(str)
  #   rescue IO::WaitReadable
  #     IO.select([io])
  #     retry
  #   rescue IO::WaitWritable
  #     IO.select(nil, [io])
  #     retry
  #   end
  #
  # Note that one reason that write_nonblock reads from the underlying IO
  # is when the peer requests a new TLS/SSL handshake.  See the openssl FAQ
  # for more details.  http://www.openssl.org/support/faq.html
  #
  # By specifying a keyword argument _exception_ to +false+, you can indicate
  # that write_nonblock should not raise an IO::Wait*able exception, but
  # return the symbol +:wait_writable+ or +:wait_readable+ instead.

  def write_nonblock(s, exception: true)
    flush
    syswrite_nonblock(s, exception: exception)
  end

  ##
  # Writes _s_ to the stream.  _s_ will be converted to a String using
  # +.to_s+ method.

  def <<(s)
    do_write(s)
    self
  end

  ##
  # Writes _args_ to the stream along with a record separator.
  #
  # See IO#puts for full details.

  def puts(*args)
    s = Buffer.new
    if args.empty?
      s << "\n"
    end
    args.each{|arg|
      s << arg.to_s
      s.sub!(/(?<!\n)\z/, "\n")
    }
    do_write(s)
    nil
  end

  ##
  # Writes _args_ to the stream.
  #
  # See IO#print for full details.

  def print(*args)
    s = Buffer.new
    args.each{ |arg| s << arg.to_s }
    do_write(s)
    nil
  end

  ##
  # Formats and writes to the stream converting parameters under control of
  # the format string.
  #
  # See Kernel#sprintf for format string details.

  def printf(s, *args)
    do_write(s % args)
    nil
  end

  ##
  # Flushes buffered data to the SSLSocket.

  def flush
    osync = @sync
    @sync = true
    do_write ""
    return self
  ensure
    @sync = osync
  end

  ##
  # Closes the SSLSocket and flushes any unwritten data.

  def close
    flush rescue nil
    sysclose
  end
end
PK}$[	�P�	�	ruby/openssl/hmac.rbnu�[���# frozen_string_literal: true

module OpenSSL
  class HMAC
    # Securely compare with another HMAC instance in constant time.
    def ==(other)
      return false unless HMAC === other
      return false unless self.digest.bytesize == other.digest.bytesize

      OpenSSL.fixed_length_secure_compare(self.digest, other.digest)
    end

    # :call-seq:
    #    hmac.base64digest -> string
    #
    # Returns the authentication code an a Base64-encoded string.
    def base64digest
      [digest].pack("m0")
    end

    class << self
      # :call-seq:
      #    HMAC.digest(digest, key, data) -> aString
      #
      # Returns the authentication code as a binary string. The _digest_ parameter
      # specifies the digest algorithm to use. This may be a String representing
      # the algorithm name or an instance of OpenSSL::Digest.
      #
      # === Example
      #  key = 'key'
      #  data = 'The quick brown fox jumps over the lazy dog'
      #
      #  hmac = OpenSSL::HMAC.digest('SHA1', key, data)
      #  #=> "\xDE|\x9B\x85\xB8\xB7\x8A\xA6\xBC\x8Az6\xF7\n\x90p\x1C\x9D\xB4\xD9"
      def digest(digest, key, data)
        hmac = new(key, digest)
        hmac << data
        hmac.digest
      end

      # :call-seq:
      #    HMAC.hexdigest(digest, key, data) -> aString
      #
      # Returns the authentication code as a hex-encoded string. The _digest_
      # parameter specifies the digest algorithm to use. This may be a String
      # representing the algorithm name or an instance of OpenSSL::Digest.
      #
      # === Example
      #  key = 'key'
      #  data = 'The quick brown fox jumps over the lazy dog'
      #
      #  hmac = OpenSSL::HMAC.hexdigest('SHA1', key, data)
      #  #=> "de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9"
      def hexdigest(digest, key, data)
        hmac = new(key, digest)
        hmac << data
        hmac.hexdigest
      end

      # :call-seq:
      #    HMAC.base64digest(digest, key, data) -> aString
      #
      # Returns the authentication code as a Base64-encoded string. The _digest_
      # parameter specifies the digest algorithm to use. This may be a String
      # representing the algorithm name or an instance of OpenSSL::Digest.
      #
      # === Example
      #  key = 'key'
      #  data = 'The quick brown fox jumps over the lazy dog'
      #
      #  hmac = OpenSSL::HMAC.base64digest('SHA1', key, data)
      #  #=> "3nybhbi3iqa8ino29wqQcBydtNk="
      def base64digest(digest, key, data)
        [digest(digest, key, data)].pack("m0")
      end
    end
  end
end
PK}$[A�0S��ruby/openssl/bn.rbnu�[���# frozen_string_literal: true
#--
#
# = Ruby-space definitions that completes C-space funcs for BN
#
# = Info
# 'OpenSSL for Ruby 2' project
# Copyright (C) 2002  Michal Rokos <m.rokos@sh.cvut.cz>
# All rights reserved.
#
# = Licence
# This program is licensed under the same licence as Ruby.
# (See the file 'LICENCE'.)
#++

module OpenSSL
  class BN
    include Comparable

    def pretty_print(q)
      q.object_group(self) {
        q.text ' '
        q.text to_i.to_s
      }
    end
  end # BN
end # OpenSSL

##
#--
# Add double dispatch to Integer
#++
class Integer
  # Casts an Integer as an OpenSSL::BN
  #
  # See `man bn` for more info.
  def to_bn
    OpenSSL::BN::new(self)
  end
end # Integer
PK}$[�|��9�9ruby/openssl/pkey.rbnu�[���# frozen_string_literal: true
#--
# Ruby/OpenSSL Project
# Copyright (C) 2017 Ruby/OpenSSL Project Authors
#++

require_relative 'marshal'

module OpenSSL::PKey
  class DH
    include OpenSSL::Marshal

    # :call-seq:
    #    dh.public_key -> dhnew
    #
    # Returns a new DH instance that carries just the \DH parameters.
    #
    # Contrary to the method name, the returned DH object contains only
    # parameters and not the public key.
    #
    # This method is provided for backwards compatibility. In most cases, there
    # is no need to call this method.
    #
    # For the purpose of re-generating the key pair while keeping the
    # parameters, check OpenSSL::PKey.generate_key.
    #
    # Example:
    #   # OpenSSL::PKey::DH.generate by default generates a random key pair
    #   dh1 = OpenSSL::PKey::DH.generate(2048)
    #   p dh1.priv_key #=> #<OpenSSL::BN 1288347...>
    #   dhcopy = dh1.public_key
    #   p dhcopy.priv_key #=> nil
    def public_key
      DH.new(to_der)
    end

    # :call-seq:
    #    dh.compute_key(pub_bn) -> string
    #
    # Returns a String containing a shared secret computed from the other
    # party's public value.
    #
    # This method is provided for backwards compatibility, and calls #derive
    # internally.
    #
    # === Parameters
    # * _pub_bn_ is a OpenSSL::BN, *not* the DH instance returned by
    #   DH#public_key as that contains the DH parameters only.
    def compute_key(pub_bn)
      # FIXME: This is constructing an X.509 SubjectPublicKeyInfo and is very
      # inefficient
      obj = OpenSSL::ASN1.Sequence([
        OpenSSL::ASN1.Sequence([
          OpenSSL::ASN1.ObjectId("dhKeyAgreement"),
          OpenSSL::ASN1.Sequence([
            OpenSSL::ASN1.Integer(p),
            OpenSSL::ASN1.Integer(g),
          ]),
        ]),
        OpenSSL::ASN1.BitString(OpenSSL::ASN1.Integer(pub_bn).to_der),
      ])
      derive(OpenSSL::PKey.read(obj.to_der))
    end

    # :call-seq:
    #    dh.generate_key! -> self
    #
    # Generates a private and public key unless a private key already exists.
    # If this DH instance was generated from public \DH parameters (e.g. by
    # encoding the result of DH#public_key), then this method needs to be
    # called first in order to generate the per-session keys before performing
    # the actual key exchange.
    #
    # <b>Deprecated in version 3.0</b>. This method is incompatible with
    # OpenSSL 3.0.0 or later.
    #
    # See also OpenSSL::PKey.generate_key.
    #
    # Example:
    #   # DEPRECATED USAGE: This will not work on OpenSSL 3.0 or later
    #   dh0 = OpenSSL::PKey::DH.new(2048)
    #   dh = dh0.public_key # #public_key only copies the DH parameters (contrary to the name)
    #   dh.generate_key!
    #   puts dh.private? # => true
    #   puts dh0.pub_key == dh.pub_key #=> false
    #
    #   # With OpenSSL::PKey.generate_key
    #   dh0 = OpenSSL::PKey::DH.new(2048)
    #   dh = OpenSSL::PKey.generate_key(dh0)
    #   puts dh0.pub_key == dh.pub_key #=> false
    def generate_key!
      if OpenSSL::OPENSSL_VERSION_NUMBER >= 0x30000000
        raise DHError, "OpenSSL::PKey::DH is immutable on OpenSSL 3.0; " \
        "use OpenSSL::PKey.generate_key instead"
      end

      unless priv_key
        tmp = OpenSSL::PKey.generate_key(self)
        set_key(tmp.pub_key, tmp.priv_key)
      end
      self
    end

    class << self
      # :call-seq:
      #    DH.generate(size, generator = 2) -> dh
      #
      # Creates a new DH instance from scratch by generating random parameters
      # and a key pair.
      #
      # See also OpenSSL::PKey.generate_parameters and
      # OpenSSL::PKey.generate_key.
      #
      # +size+::
      #   The desired key size in bits.
      # +generator+::
      #   The generator.
      def generate(size, generator = 2, &blk)
        dhparams = OpenSSL::PKey.generate_parameters("DH", {
          "dh_paramgen_prime_len" => size,
          "dh_paramgen_generator" => generator,
        }, &blk)
        OpenSSL::PKey.generate_key(dhparams)
      end

      # Handle DH.new(size, generator) form here; new(str) and new() forms
      # are handled by #initialize
      def new(*args, &blk) # :nodoc:
        if args[0].is_a?(Integer)
          generate(*args, &blk)
        else
          super
        end
      end
    end
  end

  class DSA
    include OpenSSL::Marshal

    # :call-seq:
    #    dsa.public_key -> dsanew
    #
    # Returns a new DSA instance that carries just the \DSA parameters and the
    # public key.
    #
    # This method is provided for backwards compatibility. In most cases, there
    # is no need to call this method.
    #
    # For the purpose of serializing the public key, to PEM or DER encoding of
    # X.509 SubjectPublicKeyInfo format, check PKey#public_to_pem and
    # PKey#public_to_der.
    def public_key
      OpenSSL::PKey.read(public_to_der)
    end

    class << self
      # :call-seq:
      #    DSA.generate(size) -> dsa
      #
      # Creates a new DSA instance by generating a private/public key pair
      # from scratch.
      #
      # See also OpenSSL::PKey.generate_parameters and
      # OpenSSL::PKey.generate_key.
      #
      # +size+::
      #   The desired key size in bits.
      def generate(size, &blk)
        # FIPS 186-4 specifies four (L,N) pairs: (1024,160), (2048,224),
        # (2048,256), and (3072,256).
        #
        # q size is derived here with compatibility with
        # DSA_generator_parameters_ex() which previous versions of ruby/openssl
        # used to call.
        qsize = size >= 2048 ? 256 : 160
        dsaparams = OpenSSL::PKey.generate_parameters("DSA", {
          "dsa_paramgen_bits" => size,
          "dsa_paramgen_q_bits" => qsize,
        }, &blk)
        OpenSSL::PKey.generate_key(dsaparams)
      end

      # Handle DSA.new(size) form here; new(str) and new() forms
      # are handled by #initialize
      def new(*args, &blk) # :nodoc:
        if args[0].is_a?(Integer)
          generate(*args, &blk)
        else
          super
        end
      end
    end

    # :call-seq:
    #    dsa.syssign(string) -> string
    #
    # Computes and returns the \DSA signature of +string+, where +string+ is
    # expected to be an already-computed message digest of the original input
    # data. The signature is issued using the private key of this DSA instance.
    #
    # <b>Deprecated in version 3.0</b>.
    # Consider using PKey::PKey#sign_raw and PKey::PKey#verify_raw instead.
    #
    # +string+::
    #   A message digest of the original input data to be signed.
    #
    # Example:
    #   dsa = OpenSSL::PKey::DSA.new(2048)
    #   doc = "Sign me"
    #   digest = OpenSSL::Digest.digest('SHA1', doc)
    #
    #   # With legacy #syssign and #sysverify:
    #   sig = dsa.syssign(digest)
    #   p dsa.sysverify(digest, sig) #=> true
    #
    #   # With #sign_raw and #verify_raw:
    #   sig = dsa.sign_raw(nil, digest)
    #   p dsa.verify_raw(nil, sig, digest) #=> true
    def syssign(string)
      q or raise OpenSSL::PKey::DSAError, "incomplete DSA"
      private? or raise OpenSSL::PKey::DSAError, "Private DSA key needed!"
      begin
        sign_raw(nil, string)
      rescue OpenSSL::PKey::PKeyError
        raise OpenSSL::PKey::DSAError, $!.message
      end
    end

    # :call-seq:
    #    dsa.sysverify(digest, sig) -> true | false
    #
    # Verifies whether the signature is valid given the message digest input.
    # It does so by validating +sig+ using the public key of this DSA instance.
    #
    # <b>Deprecated in version 3.0</b>.
    # Consider using PKey::PKey#sign_raw and PKey::PKey#verify_raw instead.
    #
    # +digest+::
    #   A message digest of the original input data to be signed.
    # +sig+::
    #   A \DSA signature value.
    def sysverify(digest, sig)
      verify_raw(nil, sig, digest)
    rescue OpenSSL::PKey::PKeyError
      raise OpenSSL::PKey::DSAError, $!.message
    end
  end

  if defined?(EC)
  class EC
    include OpenSSL::Marshal

    # :call-seq:
    #    key.dsa_sign_asn1(data) -> String
    #
    # <b>Deprecated in version 3.0</b>.
    # Consider using PKey::PKey#sign_raw and PKey::PKey#verify_raw instead.
    def dsa_sign_asn1(data)
      sign_raw(nil, data)
    rescue OpenSSL::PKey::PKeyError
      raise OpenSSL::PKey::ECError, $!.message
    end

    # :call-seq:
    #    key.dsa_verify_asn1(data, sig) -> true | false
    #
    # <b>Deprecated in version 3.0</b>.
    # Consider using PKey::PKey#sign_raw and PKey::PKey#verify_raw instead.
    def dsa_verify_asn1(data, sig)
      verify_raw(nil, sig, data)
    rescue OpenSSL::PKey::PKeyError
      raise OpenSSL::PKey::ECError, $!.message
    end

    # :call-seq:
    #    ec.dh_compute_key(pubkey) -> string
    #
    # Derives a shared secret by ECDH. _pubkey_ must be an instance of
    # OpenSSL::PKey::EC::Point and must belong to the same group.
    #
    # This method is provided for backwards compatibility, and calls #derive
    # internally.
    def dh_compute_key(pubkey)
      obj = OpenSSL::ASN1.Sequence([
        OpenSSL::ASN1.Sequence([
          OpenSSL::ASN1.ObjectId("id-ecPublicKey"),
          group.to_der,
        ]),
        OpenSSL::ASN1.BitString(pubkey.to_octet_string(:uncompressed)),
      ])
      derive(OpenSSL::PKey.read(obj.to_der))
    end
  end

  class EC::Point
    # :call-seq:
    #    point.to_bn([conversion_form]) -> OpenSSL::BN
    #
    # Returns the octet string representation of the EC point as an instance of
    # OpenSSL::BN.
    #
    # If _conversion_form_ is not given, the _point_conversion_form_ attribute
    # set to the group is used.
    #
    # See #to_octet_string for more information.
    def to_bn(conversion_form = group.point_conversion_form)
      OpenSSL::BN.new(to_octet_string(conversion_form), 2)
    end
  end
  end

  class RSA
    include OpenSSL::Marshal

    # :call-seq:
    #    rsa.public_key -> rsanew
    #
    # Returns a new RSA instance that carries just the public key components.
    #
    # This method is provided for backwards compatibility. In most cases, there
    # is no need to call this method.
    #
    # For the purpose of serializing the public key, to PEM or DER encoding of
    # X.509 SubjectPublicKeyInfo format, check PKey#public_to_pem and
    # PKey#public_to_der.
    def public_key
      OpenSSL::PKey.read(public_to_der)
    end

    class << self
      # :call-seq:
      #    RSA.generate(size, exponent = 65537) -> RSA
      #
      # Generates an \RSA keypair.
      #
      # See also OpenSSL::PKey.generate_key.
      #
      # +size+::
      #   The desired key size in bits.
      # +exponent+::
      #   An odd Integer, normally 3, 17, or 65537.
      def generate(size, exp = 0x10001, &blk)
        OpenSSL::PKey.generate_key("RSA", {
          "rsa_keygen_bits" => size,
          "rsa_keygen_pubexp" => exp,
        }, &blk)
      end

      # Handle RSA.new(size, exponent) form here; new(str) and new() forms
      # are handled by #initialize
      def new(*args, &blk) # :nodoc:
        if args[0].is_a?(Integer)
          generate(*args, &blk)
        else
          super
        end
      end
    end

    # :call-seq:
    #    rsa.private_encrypt(string)          -> String
    #    rsa.private_encrypt(string, padding) -> String
    #
    # Encrypt +string+ with the private key.  +padding+ defaults to
    # PKCS1_PADDING. The encrypted string output can be decrypted using
    # #public_decrypt.
    #
    # <b>Deprecated in version 3.0</b>.
    # Consider using PKey::PKey#sign_raw and PKey::PKey#verify_raw, and
    # PKey::PKey#verify_recover instead.
    def private_encrypt(string, padding = PKCS1_PADDING)
      n or raise OpenSSL::PKey::RSAError, "incomplete RSA"
      private? or raise OpenSSL::PKey::RSAError, "private key needed."
      begin
        sign_raw(nil, string, {
          "rsa_padding_mode" => translate_padding_mode(padding),
        })
      rescue OpenSSL::PKey::PKeyError
        raise OpenSSL::PKey::RSAError, $!.message
      end
    end

    # :call-seq:
    #    rsa.public_decrypt(string)          -> String
    #    rsa.public_decrypt(string, padding) -> String
    #
    # Decrypt +string+, which has been encrypted with the private key, with the
    # public key.  +padding+ defaults to PKCS1_PADDING.
    #
    # <b>Deprecated in version 3.0</b>.
    # Consider using PKey::PKey#sign_raw and PKey::PKey#verify_raw, and
    # PKey::PKey#verify_recover instead.
    def public_decrypt(string, padding = PKCS1_PADDING)
      n or raise OpenSSL::PKey::RSAError, "incomplete RSA"
      begin
        verify_recover(nil, string, {
          "rsa_padding_mode" => translate_padding_mode(padding),
        })
      rescue OpenSSL::PKey::PKeyError
        raise OpenSSL::PKey::RSAError, $!.message
      end
    end

    # :call-seq:
    #    rsa.public_encrypt(string)          -> String
    #    rsa.public_encrypt(string, padding) -> String
    #
    # Encrypt +string+ with the public key.  +padding+ defaults to
    # PKCS1_PADDING. The encrypted string output can be decrypted using
    # #private_decrypt.
    #
    # <b>Deprecated in version 3.0</b>.
    # Consider using PKey::PKey#encrypt and PKey::PKey#decrypt instead.
    def public_encrypt(data, padding = PKCS1_PADDING)
      n or raise OpenSSL::PKey::RSAError, "incomplete RSA"
      begin
        encrypt(data, {
          "rsa_padding_mode" => translate_padding_mode(padding),
        })
      rescue OpenSSL::PKey::PKeyError
        raise OpenSSL::PKey::RSAError, $!.message
      end
    end

    # :call-seq:
    #    rsa.private_decrypt(string)          -> String
    #    rsa.private_decrypt(string, padding) -> String
    #
    # Decrypt +string+, which has been encrypted with the public key, with the
    # private key. +padding+ defaults to PKCS1_PADDING.
    #
    # <b>Deprecated in version 3.0</b>.
    # Consider using PKey::PKey#encrypt and PKey::PKey#decrypt instead.
    def private_decrypt(data, padding = PKCS1_PADDING)
      n or raise OpenSSL::PKey::RSAError, "incomplete RSA"
      private? or raise OpenSSL::PKey::RSAError, "private key needed."
      begin
        decrypt(data, {
          "rsa_padding_mode" => translate_padding_mode(padding),
        })
      rescue OpenSSL::PKey::PKeyError
        raise OpenSSL::PKey::RSAError, $!.message
      end
    end

    PKCS1_PADDING = 1
    SSLV23_PADDING = 2
    NO_PADDING = 3
    PKCS1_OAEP_PADDING = 4

    private def translate_padding_mode(num)
      case num
      when PKCS1_PADDING
        "pkcs1"
      when SSLV23_PADDING
        "sslv23"
      when NO_PADDING
        "none"
      when PKCS1_OAEP_PADDING
        "oaep"
      else
        raise OpenSSL::PKey::PKeyError, "unsupported padding mode"
      end
    end
  end
end
PK}$[��LKKruby/timeout.rbnu�[���# frozen_string_literal: false
# Timeout long-running blocks
#
# == Synopsis
#
#   require 'timeout'
#   status = Timeout::timeout(5) {
#     # Something that should be interrupted if it takes more than 5 seconds...
#   }
#
# == Description
#
# Timeout provides a way to auto-terminate a potentially long-running
# operation if it hasn't finished in a fixed amount of time.
#
# Previous versions didn't use a module for namespacing, however
# #timeout is provided for backwards compatibility.  You
# should prefer Timeout.timeout instead.
#
# == Copyright
#
# Copyright:: (C) 2000  Network Applied Communication Laboratory, Inc.
# Copyright:: (C) 2000  Information-technology Promotion Agency, Japan

module Timeout
  VERSION = "0.2.0".freeze

  # Raised by Timeout.timeout when the block times out.
  class Error < RuntimeError
    attr_reader :thread

    def self.catch(*args)
      exc = new(*args)
      exc.instance_variable_set(:@thread, Thread.current)
      exc.instance_variable_set(:@catch_value, exc)
      ::Kernel.catch(exc) {yield exc}
    end

    def exception(*)
      # TODO: use Fiber.current to see if self can be thrown
      if self.thread == Thread.current
        bt = caller
        begin
          throw(@catch_value, bt)
        rescue UncaughtThrowError
        end
      end
      super
    end
  end

  # :stopdoc:
  THIS_FILE = /\A#{Regexp.quote(__FILE__)}:/o
  CALLER_OFFSET = ((c = caller[0]) && THIS_FILE =~ c) ? 1 : 0
  private_constant :THIS_FILE, :CALLER_OFFSET
  # :startdoc:

  # Perform an operation in a block, raising an error if it takes longer than
  # +sec+ seconds to complete.
  #
  # +sec+:: Number of seconds to wait for the block to terminate. Any number
  #         may be used, including Floats to specify fractional seconds. A
  #         value of 0 or +nil+ will execute the block without any timeout.
  # +klass+:: Exception Class to raise if the block fails to terminate
  #           in +sec+ seconds.  Omitting will use the default, Timeout::Error
  # +message+:: Error message to raise with Exception Class.
  #             Omitting will use the default, "execution expired"
  #
  # Returns the result of the block *if* the block completed before
  # +sec+ seconds, otherwise throws an exception, based on the value of +klass+.
  #
  # The exception thrown to terminate the given block cannot be rescued inside
  # the block unless +klass+ is given explicitly. However, the block can use
  # ensure to prevent the handling of the exception.  For that reason, this
  # method cannot be relied on to enforce timeouts for untrusted blocks.
  #
  # If a scheduler is defined, it will be used to handle the timeout by invoking
  # Scheduler#timeout_after.
  #
  # Note that this is both a method of module Timeout, so you can <tt>include
  # Timeout</tt> into your classes so they have a #timeout method, as well as
  # a module method, so you can call it directly as Timeout.timeout().
  def timeout(sec, klass = nil, message = nil, &block)   #:yield: +sec+
    return yield(sec) if sec == nil or sec.zero?

    message ||= "execution expired".freeze

    if Fiber.respond_to?(:current_scheduler) && (scheduler = Fiber.current_scheduler)&.respond_to?(:timeout_after)
      return scheduler.timeout_after(sec, klass || Error, message, &block)
    end

    from = "from #{caller_locations(1, 1)[0]}" if $DEBUG
    e = Error
    bl = proc do |exception|
      begin
        x = Thread.current
        y = Thread.start {
          Thread.current.name = from
          begin
            sleep sec
          rescue => e
            x.raise e
          else
            x.raise exception, message
          end
        }
        return yield(sec)
      ensure
        if y
          y.kill
          y.join # make sure y is dead.
        end
      end
    end
    if klass
      begin
        bl.call(klass)
      rescue klass => e
        message = e.message
        bt = e.backtrace
      end
    else
      bt = Error.catch(message, &bl)
    end
    level = -caller(CALLER_OFFSET).size-2
    while THIS_FILE =~ bt[level]
      bt.delete_at(level)
    end
    raise(e, message, bt)
  end

  module_function :timeout
end
PK}$[AC.K����ruby/socket.rbnu�[���# frozen_string_literal: true

require 'socket.so'
require 'io/wait'

class Addrinfo
  # creates an Addrinfo object from the arguments.
  #
  # The arguments are interpreted as similar to self.
  #
  #   Addrinfo.tcp("0.0.0.0", 4649).family_addrinfo("www.ruby-lang.org", 80)
  #   #=> #<Addrinfo: 221.186.184.68:80 TCP (www.ruby-lang.org:80)>
  #
  #   Addrinfo.unix("/tmp/sock").family_addrinfo("/tmp/sock2")
  #   #=> #<Addrinfo: /tmp/sock2 SOCK_STREAM>
  #
  def family_addrinfo(*args)
    if args.empty?
      raise ArgumentError, "no address specified"
    elsif Addrinfo === args.first
      raise ArgumentError, "too many arguments" if args.length != 1
      addrinfo = args.first
      if (self.pfamily != addrinfo.pfamily) ||
         (self.socktype != addrinfo.socktype)
        raise ArgumentError, "Addrinfo type mismatch"
      end
      addrinfo
    elsif self.ip?
      raise ArgumentError, "IP address needs host and port but #{args.length} arguments given" if args.length != 2
      host, port = args
      Addrinfo.getaddrinfo(host, port, self.pfamily, self.socktype, self.protocol)[0]
    elsif self.unix?
      raise ArgumentError, "UNIX socket needs single path argument but #{args.length} arguments given" if args.length != 1
      path, = args
      Addrinfo.unix(path)
    else
      raise ArgumentError, "unexpected family"
    end
  end

  # creates a new Socket connected to the address of +local_addrinfo+.
  #
  # If _local_addrinfo_ is nil, the address of the socket is not bound.
  #
  # The _timeout_ specify the seconds for timeout.
  # Errno::ETIMEDOUT is raised when timeout occur.
  #
  # If a block is given the created socket is yielded for each address.
  #
  def connect_internal(local_addrinfo, timeout=nil) # :yields: socket
    sock = Socket.new(self.pfamily, self.socktype, self.protocol)
    begin
      sock.ipv6only! if self.ipv6?
      sock.bind local_addrinfo if local_addrinfo
      if timeout
        case sock.connect_nonblock(self, exception: false)
        when 0 # success or EISCONN, other errors raise
          break
        when :wait_writable
          sock.wait_writable(timeout) or
            raise Errno::ETIMEDOUT, 'user specified timeout'
        end while true
      else
        sock.connect(self)
      end
    rescue Exception
      sock.close
      raise
    end
    if block_given?
      begin
        yield sock
      ensure
        sock.close
      end
    else
      sock
    end
  end
  protected :connect_internal

  # :call-seq:
  #   addrinfo.connect_from([local_addr_args], [opts]) {|socket| ... }
  #   addrinfo.connect_from([local_addr_args], [opts])
  #
  # creates a socket connected to the address of self.
  #
  # If one or more arguments given as _local_addr_args_,
  # it is used as the local address of the socket.
  # _local_addr_args_ is given for family_addrinfo to obtain actual address.
  #
  # If _local_addr_args_ is not given, the local address of the socket is not bound.
  #
  # The optional last argument _opts_ is options represented by a hash.
  # _opts_ may have following options:
  #
  # [:timeout] specify the timeout in seconds.
  #
  # If a block is given, it is called with the socket and the value of the block is returned.
  # The socket is returned otherwise.
  #
  #   Addrinfo.tcp("www.ruby-lang.org", 80).connect_from("0.0.0.0", 4649) {|s|
  #     s.print "GET / HTTP/1.0\r\nHost: www.ruby-lang.org\r\n\r\n"
  #     puts s.read
  #   }
  #
  #   # Addrinfo object can be taken for the argument.
  #   Addrinfo.tcp("www.ruby-lang.org", 80).connect_from(Addrinfo.tcp("0.0.0.0", 4649)) {|s|
  #     s.print "GET / HTTP/1.0\r\nHost: www.ruby-lang.org\r\n\r\n"
  #     puts s.read
  #   }
  #
  def connect_from(*args, timeout: nil, &block)
    connect_internal(family_addrinfo(*args), timeout, &block)
  end

  # :call-seq:
  #   addrinfo.connect([opts]) {|socket| ... }
  #   addrinfo.connect([opts])
  #
  # creates a socket connected to the address of self.
  #
  # The optional argument _opts_ is options represented by a hash.
  # _opts_ may have following options:
  #
  # [:timeout] specify the timeout in seconds.
  #
  # If a block is given, it is called with the socket and the value of the block is returned.
  # The socket is returned otherwise.
  #
  #   Addrinfo.tcp("www.ruby-lang.org", 80).connect {|s|
  #     s.print "GET / HTTP/1.0\r\nHost: www.ruby-lang.org\r\n\r\n"
  #     puts s.read
  #   }
  #
  def connect(timeout: nil, &block)
    connect_internal(nil, timeout, &block)
  end

  # :call-seq:
  #   addrinfo.connect_to([remote_addr_args], [opts]) {|socket| ... }
  #   addrinfo.connect_to([remote_addr_args], [opts])
  #
  # creates a socket connected to _remote_addr_args_ and bound to self.
  #
  # The optional last argument _opts_ is options represented by a hash.
  # _opts_ may have following options:
  #
  # [:timeout] specify the timeout in seconds.
  #
  # If a block is given, it is called with the socket and the value of the block is returned.
  # The socket is returned otherwise.
  #
  #   Addrinfo.tcp("0.0.0.0", 4649).connect_to("www.ruby-lang.org", 80) {|s|
  #     s.print "GET / HTTP/1.0\r\nHost: www.ruby-lang.org\r\n\r\n"
  #     puts s.read
  #   }
  #
  def connect_to(*args, timeout: nil, &block)
    remote_addrinfo = family_addrinfo(*args)
    remote_addrinfo.connect_internal(self, timeout, &block)
  end

  # creates a socket bound to self.
  #
  # If a block is given, it is called with the socket and the value of the block is returned.
  # The socket is returned otherwise.
  #
  #   Addrinfo.udp("0.0.0.0", 9981).bind {|s|
  #     s.local_address.connect {|s| s.send "hello", 0 }
  #     p s.recv(10) #=> "hello"
  #   }
  #
  def bind
    sock = Socket.new(self.pfamily, self.socktype, self.protocol)
    begin
      sock.ipv6only! if self.ipv6?
      sock.setsockopt(:SOCKET, :REUSEADDR, 1)
      sock.bind(self)
    rescue Exception
      sock.close
      raise
    end
    if block_given?
      begin
        yield sock
      ensure
        sock.close
      end
    else
      sock
    end
  end

  # creates a listening socket bound to self.
  def listen(backlog=Socket::SOMAXCONN)
    sock = Socket.new(self.pfamily, self.socktype, self.protocol)
    begin
      sock.ipv6only! if self.ipv6?
      sock.setsockopt(:SOCKET, :REUSEADDR, 1)
      sock.bind(self)
      sock.listen(backlog)
    rescue Exception
      sock.close
      raise
    end
    if block_given?
      begin
        yield sock
      ensure
        sock.close
      end
    else
      sock
    end
  end

  # iterates over the list of Addrinfo objects obtained by Addrinfo.getaddrinfo.
  #
  #   Addrinfo.foreach(nil, 80) {|x| p x }
  #   #=> #<Addrinfo: 127.0.0.1:80 TCP (:80)>
  #   #   #<Addrinfo: 127.0.0.1:80 UDP (:80)>
  #   #   #<Addrinfo: [::1]:80 TCP (:80)>
  #   #   #<Addrinfo: [::1]:80 UDP (:80)>
  #
  def self.foreach(nodename, service, family=nil, socktype=nil, protocol=nil, flags=nil, timeout: nil, &block)
    Addrinfo.getaddrinfo(nodename, service, family, socktype, protocol, flags, timeout: timeout).each(&block)
  end
end

class BasicSocket < IO
  # Returns an address of the socket suitable for connect in the local machine.
  #
  # This method returns _self_.local_address, except following condition.
  #
  # - IPv4 unspecified address (0.0.0.0) is replaced by IPv4 loopback address (127.0.0.1).
  # - IPv6 unspecified address (::) is replaced by IPv6 loopback address (::1).
  #
  # If the local address is not suitable for connect, SocketError is raised.
  # IPv4 and IPv6 address which port is 0 is not suitable for connect.
  # Unix domain socket which has no path is not suitable for connect.
  #
  #   Addrinfo.tcp("0.0.0.0", 0).listen {|serv|
  #     p serv.connect_address #=> #<Addrinfo: 127.0.0.1:53660 TCP>
  #     serv.connect_address.connect {|c|
  #       s, _ = serv.accept
  #       p [c, s] #=> [#<Socket:fd 4>, #<Socket:fd 6>]
  #     }
  #   }
  #
  def connect_address
    addr = local_address
    afamily = addr.afamily
    if afamily == Socket::AF_INET
      raise SocketError, "unbound IPv4 socket" if addr.ip_port == 0
      if addr.ip_address == "0.0.0.0"
        addr = Addrinfo.new(["AF_INET", addr.ip_port, nil, "127.0.0.1"], addr.pfamily, addr.socktype, addr.protocol)
      end
    elsif defined?(Socket::AF_INET6) && afamily == Socket::AF_INET6
      raise SocketError, "unbound IPv6 socket" if addr.ip_port == 0
      if addr.ip_address == "::"
        addr = Addrinfo.new(["AF_INET6", addr.ip_port, nil, "::1"], addr.pfamily, addr.socktype, addr.protocol)
      elsif addr.ip_address == "0.0.0.0" # MacOS X 10.4 returns "a.b.c.d" for IPv4-mapped IPv6 address.
        addr = Addrinfo.new(["AF_INET6", addr.ip_port, nil, "::1"], addr.pfamily, addr.socktype, addr.protocol)
      elsif addr.ip_address == "::ffff:0.0.0.0" # MacOS X 10.6 returns "::ffff:a.b.c.d" for IPv4-mapped IPv6 address.
        addr = Addrinfo.new(["AF_INET6", addr.ip_port, nil, "::1"], addr.pfamily, addr.socktype, addr.protocol)
      end
    elsif defined?(Socket::AF_UNIX) && afamily == Socket::AF_UNIX
      raise SocketError, "unbound Unix socket" if addr.unix_path == ""
    end
    addr
  end

  # call-seq:
  #    basicsocket.sendmsg(mesg, flags=0, dest_sockaddr=nil, *controls) => numbytes_sent
  #
  # sendmsg sends a message using sendmsg(2) system call in blocking manner.
  #
  # _mesg_ is a string to send.
  #
  # _flags_ is bitwise OR of MSG_* constants such as Socket::MSG_OOB.
  #
  # _dest_sockaddr_ is a destination socket address for connection-less socket.
  # It should be a sockaddr such as a result of Socket.sockaddr_in.
  # An Addrinfo object can be used too.
  #
  # _controls_ is a list of ancillary data.
  # The element of _controls_ should be Socket::AncillaryData or
  # 3-elements array.
  # The 3-element array should contains cmsg_level, cmsg_type and data.
  #
  # The return value, _numbytes_sent_ is an integer which is the number of bytes sent.
  #
  # sendmsg can be used to implement send_io as follows:
  #
  #   # use Socket::AncillaryData.
  #   ancdata = Socket::AncillaryData.int(:UNIX, :SOCKET, :RIGHTS, io.fileno)
  #   sock.sendmsg("a", 0, nil, ancdata)
  #
  #   # use 3-element array.
  #   ancdata = [:SOCKET, :RIGHTS, [io.fileno].pack("i!")]
  #   sock.sendmsg("\0", 0, nil, ancdata)
  def sendmsg(mesg, flags = 0, dest_sockaddr = nil, *controls)
    __sendmsg(mesg, flags, dest_sockaddr, controls)
  end

  # call-seq:
  #    basicsocket.sendmsg_nonblock(mesg, flags=0, dest_sockaddr=nil, *controls, opts={}) => numbytes_sent
  #
  # sendmsg_nonblock sends a message using sendmsg(2) system call in non-blocking manner.
  #
  # It is similar to BasicSocket#sendmsg
  # but the non-blocking flag is set before the system call
  # and it doesn't retry the system call.
  #
  # By specifying a keyword argument _exception_ to +false+, you can indicate
  # that sendmsg_nonblock should not raise an IO::WaitWritable exception, but
  # return the symbol +:wait_writable+ instead.
  def sendmsg_nonblock(mesg, flags = 0, dest_sockaddr = nil, *controls,
                       exception: true)
    __sendmsg_nonblock(mesg, flags, dest_sockaddr, controls, exception)
  end

  # call-seq:
  # 	basicsocket.recv_nonblock(maxlen [, flags [, buf [, options ]]]) => mesg
  #
  # Receives up to _maxlen_ bytes from +socket+ using recvfrom(2) after
  # O_NONBLOCK is set for the underlying file descriptor.
  # _flags_ is zero or more of the +MSG_+ options.
  # The result, _mesg_, is the data received.
  #
  # When recvfrom(2) returns 0, Socket#recv_nonblock returns
  # an empty string as data.
  # The meaning depends on the socket: EOF on TCP, empty packet on UDP, etc.
  #
  # === Parameters
  # * +maxlen+ - the number of bytes to receive from the socket
  # * +flags+ - zero or more of the +MSG_+ options
  # * +buf+ - destination String buffer
  # * +options+ - keyword hash, supporting `exception: false`
  #
  # === Example
  # 	serv = TCPServer.new("127.0.0.1", 0)
  # 	af, port, host, addr = serv.addr
  # 	c = TCPSocket.new(addr, port)
  # 	s = serv.accept
  # 	c.send "aaa", 0
  # 	begin # emulate blocking recv.
  # 	  p s.recv_nonblock(10) #=> "aaa"
  # 	rescue IO::WaitReadable
  # 	  IO.select([s])
  # 	  retry
  # 	end
  #
  # Refer to Socket#recvfrom for the exceptions that may be thrown if the call
  # to _recv_nonblock_ fails.
  #
  # BasicSocket#recv_nonblock may raise any error corresponding to recvfrom(2) failure,
  # including Errno::EWOULDBLOCK.
  #
  # If the exception is Errno::EWOULDBLOCK or Errno::EAGAIN,
  # it is extended by IO::WaitReadable.
  # So IO::WaitReadable can be used to rescue the exceptions for retrying recv_nonblock.
  #
  # By specifying a keyword argument _exception_ to +false+, you can indicate
  # that recv_nonblock should not raise an IO::WaitReadable exception, but
  # return the symbol +:wait_readable+ instead.
  #
  # === See
  # * Socket#recvfrom
  def recv_nonblock(len, flag = 0, str = nil, exception: true)
    __recv_nonblock(len, flag, str, exception)
  end

  # call-seq:
  #    basicsocket.recvmsg(maxmesglen=nil, flags=0, maxcontrollen=nil, opts={}) => [mesg, sender_addrinfo, rflags, *controls]
  #
  # recvmsg receives a message using recvmsg(2) system call in blocking manner.
  #
  # _maxmesglen_ is the maximum length of mesg to receive.
  #
  # _flags_ is bitwise OR of MSG_* constants such as Socket::MSG_PEEK.
  #
  # _maxcontrollen_ is the maximum length of controls (ancillary data) to receive.
  #
  # _opts_ is option hash.
  # Currently :scm_rights=>bool is the only option.
  #
  # :scm_rights option specifies that application expects SCM_RIGHTS control message.
  # If the value is nil or false, application don't expects SCM_RIGHTS control message.
  # In this case, recvmsg closes the passed file descriptors immediately.
  # This is the default behavior.
  #
  # If :scm_rights value is neither nil nor false, application expects SCM_RIGHTS control message.
  # In this case, recvmsg creates IO objects for each file descriptors for
  # Socket::AncillaryData#unix_rights method.
  #
  # The return value is 4-elements array.
  #
  # _mesg_ is a string of the received message.
  #
  # _sender_addrinfo_ is a sender socket address for connection-less socket.
  # It is an Addrinfo object.
  # For connection-oriented socket such as TCP, sender_addrinfo is platform dependent.
  #
  # _rflags_ is a flags on the received message which is bitwise OR of MSG_* constants such as Socket::MSG_TRUNC.
  # It will be nil if the system uses 4.3BSD style old recvmsg system call.
  #
  # _controls_ is ancillary data which is an array of Socket::AncillaryData objects such as:
  #
  #   #<Socket::AncillaryData: AF_UNIX SOCKET RIGHTS 7>
  #
  # _maxmesglen_ and _maxcontrollen_ can be nil.
  # In that case, the buffer will be grown until the message is not truncated.
  # Internally, MSG_PEEK is used.
  # Buffer full and MSG_CTRUNC are checked for truncation.
  #
  # recvmsg can be used to implement recv_io as follows:
  #
  #   mesg, sender_sockaddr, rflags, *controls = sock.recvmsg(:scm_rights=>true)
  #   controls.each {|ancdata|
  #     if ancdata.cmsg_is?(:SOCKET, :RIGHTS)
  #       return ancdata.unix_rights[0]
  #     end
  #   }
  def recvmsg(dlen = nil, flags = 0, clen = nil, scm_rights: false)
    __recvmsg(dlen, flags, clen, scm_rights)
  end

  # call-seq:
  #    basicsocket.recvmsg_nonblock(maxdatalen=nil, flags=0, maxcontrollen=nil, opts={}) => [data, sender_addrinfo, rflags, *controls]
  #
  # recvmsg receives a message using recvmsg(2) system call in non-blocking manner.
  #
  # It is similar to BasicSocket#recvmsg
  # but non-blocking flag is set before the system call
  # and it doesn't retry the system call.
  #
  # By specifying a keyword argument _exception_ to +false+, you can indicate
  # that recvmsg_nonblock should not raise an IO::WaitReadable exception, but
  # return the symbol +:wait_readable+ instead.
  def recvmsg_nonblock(dlen = nil, flags = 0, clen = nil,
                       scm_rights: false, exception: true)
    __recvmsg_nonblock(dlen, flags, clen, scm_rights, exception)
  end

  # Linux-specific optimizations to avoid fcntl for IO#read_nonblock
  # and IO#write_nonblock using MSG_DONTWAIT
  # Do other platforms support MSG_DONTWAIT reliably?
  if RUBY_PLATFORM =~ /linux/ && Socket.const_defined?(:MSG_DONTWAIT)
    def read_nonblock(len, str = nil, exception: true) # :nodoc:
      __read_nonblock(len, str, exception)
    end

    def write_nonblock(buf, exception: true) # :nodoc:
      __write_nonblock(buf, exception)
    end
  end
end

class Socket < BasicSocket
  # enable the socket option IPV6_V6ONLY if IPV6_V6ONLY is available.
  def ipv6only!
    if defined? Socket::IPV6_V6ONLY
      self.setsockopt(:IPV6, :V6ONLY, 1)
    end
  end

  # call-seq:
  #   socket.recvfrom_nonblock(maxlen[, flags[, outbuf[, opts]]]) => [mesg, sender_addrinfo]
  #
  # Receives up to _maxlen_ bytes from +socket+ using recvfrom(2) after
  # O_NONBLOCK is set for the underlying file descriptor.
  # _flags_ is zero or more of the +MSG_+ options.
  # The first element of the results, _mesg_, is the data received.
  # The second element, _sender_addrinfo_, contains protocol-specific address
  # information of the sender.
  #
  # When recvfrom(2) returns 0, Socket#recvfrom_nonblock returns
  # an empty string as data.
  # The meaning depends on the socket: EOF on TCP, empty packet on UDP, etc.
  #
  # === Parameters
  # * +maxlen+ - the maximum number of bytes to receive from the socket
  # * +flags+ - zero or more of the +MSG_+ options
  # * +outbuf+ - destination String buffer
  # * +opts+ - keyword hash, supporting `exception: false`
  #
  # === Example
  #   # In one file, start this first
  #   require 'socket'
  #   include Socket::Constants
  #   socket = Socket.new(AF_INET, SOCK_STREAM, 0)
  #   sockaddr = Socket.sockaddr_in(2200, 'localhost')
  #   socket.bind(sockaddr)
  #   socket.listen(5)
  #   client, client_addrinfo = socket.accept
  #   begin # emulate blocking recvfrom
  #     pair = client.recvfrom_nonblock(20)
  #   rescue IO::WaitReadable
  #     IO.select([client])
  #     retry
  #   end
  #   data = pair[0].chomp
  #   puts "I only received 20 bytes '#{data}'"
  #   sleep 1
  #   socket.close
  #
  #   # In another file, start this second
  #   require 'socket'
  #   include Socket::Constants
  #   socket = Socket.new(AF_INET, SOCK_STREAM, 0)
  #   sockaddr = Socket.sockaddr_in(2200, 'localhost')
  #   socket.connect(sockaddr)
  #   socket.puts "Watch this get cut short!"
  #   socket.close
  #
  # Refer to Socket#recvfrom for the exceptions that may be thrown if the call
  # to _recvfrom_nonblock_ fails.
  #
  # Socket#recvfrom_nonblock may raise any error corresponding to recvfrom(2) failure,
  # including Errno::EWOULDBLOCK.
  #
  # If the exception is Errno::EWOULDBLOCK or Errno::EAGAIN,
  # it is extended by IO::WaitReadable.
  # So IO::WaitReadable can be used to rescue the exceptions for retrying
  # recvfrom_nonblock.
  #
  # By specifying a keyword argument _exception_ to +false+, you can indicate
  # that recvfrom_nonblock should not raise an IO::WaitReadable exception, but
  # return the symbol +:wait_readable+ instead.
  #
  # === See
  # * Socket#recvfrom
  def recvfrom_nonblock(len, flag = 0, str = nil, exception: true)
    __recvfrom_nonblock(len, flag, str, exception)
  end

  # call-seq:
  #   socket.accept_nonblock([options]) => [client_socket, client_addrinfo]
  #
  # Accepts an incoming connection using accept(2) after
  # O_NONBLOCK is set for the underlying file descriptor.
  # It returns an array containing the accepted socket
  # for the incoming connection, _client_socket_,
  # and an Addrinfo, _client_addrinfo_.
  #
  # === Example
  #   # In one script, start this first
  #   require 'socket'
  #   include Socket::Constants
  #   socket = Socket.new(AF_INET, SOCK_STREAM, 0)
  #   sockaddr = Socket.sockaddr_in(2200, 'localhost')
  #   socket.bind(sockaddr)
  #   socket.listen(5)
  #   begin # emulate blocking accept
  #     client_socket, client_addrinfo = socket.accept_nonblock
  #   rescue IO::WaitReadable, Errno::EINTR
  #     IO.select([socket])
  #     retry
  #   end
  #   puts "The client said, '#{client_socket.readline.chomp}'"
  #   client_socket.puts "Hello from script one!"
  #   socket.close
  #
  #   # In another script, start this second
  #   require 'socket'
  #   include Socket::Constants
  #   socket = Socket.new(AF_INET, SOCK_STREAM, 0)
  #   sockaddr = Socket.sockaddr_in(2200, 'localhost')
  #   socket.connect(sockaddr)
  #   socket.puts "Hello from script 2."
  #   puts "The server said, '#{socket.readline.chomp}'"
  #   socket.close
  #
  # Refer to Socket#accept for the exceptions that may be thrown if the call
  # to _accept_nonblock_ fails.
  #
  # Socket#accept_nonblock may raise any error corresponding to accept(2) failure,
  # including Errno::EWOULDBLOCK.
  #
  # If the exception is Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::ECONNABORTED or Errno::EPROTO,
  # it is extended by IO::WaitReadable.
  # So IO::WaitReadable can be used to rescue the exceptions for retrying accept_nonblock.
  #
  # By specifying a keyword argument _exception_ to +false+, you can indicate
  # that accept_nonblock should not raise an IO::WaitReadable exception, but
  # return the symbol +:wait_readable+ instead.
  #
  # === See
  # * Socket#accept
  def accept_nonblock(exception: true)
    __accept_nonblock(exception)
  end

  # :call-seq:
  #   Socket.tcp(host, port, local_host=nil, local_port=nil, [opts]) {|socket| ... }
  #   Socket.tcp(host, port, local_host=nil, local_port=nil, [opts])
  #
  # creates a new socket object connected to host:port using TCP/IP.
  #
  # If local_host:local_port is given,
  # the socket is bound to it.
  #
  # The optional last argument _opts_ is options represented by a hash.
  # _opts_ may have following options:
  #
  # [:connect_timeout] specify the timeout in seconds.
  # [:resolv_timeout] specify the name resolution timeout in seconds.
  #
  # If a block is given, the block is called with the socket.
  # The value of the block is returned.
  # The socket is closed when this method returns.
  #
  # If no block is given, the socket is returned.
  #
  #   Socket.tcp("www.ruby-lang.org", 80) {|sock|
  #     sock.print "GET / HTTP/1.0\r\nHost: www.ruby-lang.org\r\n\r\n"
  #     sock.close_write
  #     puts sock.read
  #   }
  #
  def self.tcp(host, port, local_host = nil, local_port = nil, connect_timeout: nil, resolv_timeout: nil) # :yield: socket
    last_error = nil
    ret = nil

    local_addr_list = nil
    if local_host != nil || local_port != nil
      local_addr_list = Addrinfo.getaddrinfo(local_host, local_port, nil, :STREAM, nil)
    end

    Addrinfo.foreach(host, port, nil, :STREAM, timeout: resolv_timeout) {|ai|
      if local_addr_list
        local_addr = local_addr_list.find {|local_ai| local_ai.afamily == ai.afamily }
        next unless local_addr
      else
        local_addr = nil
      end
      begin
        sock = local_addr ?
          ai.connect_from(local_addr, timeout: connect_timeout) :
          ai.connect(timeout: connect_timeout)
      rescue SystemCallError
        last_error = $!
        next
      end
      ret = sock
      break
    }
    unless ret
      if last_error
        raise last_error
      else
        raise SocketError, "no appropriate local address"
      end
    end
    if block_given?
      begin
        yield ret
      ensure
        ret.close
      end
    else
      ret
    end
  end

  # :stopdoc:
  def self.ip_sockets_port0(ai_list, reuseaddr)
    sockets = []
    begin
      sockets.clear
      port = nil
      ai_list.each {|ai|
        begin
          s = Socket.new(ai.pfamily, ai.socktype, ai.protocol)
        rescue SystemCallError
          next
        end
        sockets << s
        s.ipv6only! if ai.ipv6?
        if reuseaddr
          s.setsockopt(:SOCKET, :REUSEADDR, 1)
        end
        unless port
          s.bind(ai)
          port = s.local_address.ip_port
        else
          s.bind(ai.family_addrinfo(ai.ip_address, port))
        end
      }
    rescue Errno::EADDRINUSE
      sockets.each(&:close)
      retry
    rescue Exception
      sockets.each(&:close)
      raise
    end
    sockets
  end
  class << self
    private :ip_sockets_port0
  end

  def self.tcp_server_sockets_port0(host)
    ai_list = Addrinfo.getaddrinfo(host, 0, nil, :STREAM, nil, Socket::AI_PASSIVE)
    sockets = ip_sockets_port0(ai_list, true)
    begin
      sockets.each {|s|
        s.listen(Socket::SOMAXCONN)
      }
    rescue Exception
      sockets.each(&:close)
      raise
    end
    sockets
  end
  class << self
    private :tcp_server_sockets_port0
  end
  # :startdoc:

  # creates TCP/IP server sockets for _host_ and _port_.
  # _host_ is optional.
  #
  # If no block given,
  # it returns an array of listening sockets.
  #
  # If a block is given, the block is called with the sockets.
  # The value of the block is returned.
  # The socket is closed when this method returns.
  #
  # If _port_ is 0, actual port number is chosen dynamically.
  # However all sockets in the result has same port number.
  #
  #   # tcp_server_sockets returns two sockets.
  #   sockets = Socket.tcp_server_sockets(1296)
  #   p sockets #=> [#<Socket:fd 3>, #<Socket:fd 4>]
  #
  #   # The sockets contains IPv6 and IPv4 sockets.
  #   sockets.each {|s| p s.local_address }
  #   #=> #<Addrinfo: [::]:1296 TCP>
  #   #   #<Addrinfo: 0.0.0.0:1296 TCP>
  #
  #   # IPv6 and IPv4 socket has same port number, 53114, even if it is chosen dynamically.
  #   sockets = Socket.tcp_server_sockets(0)
  #   sockets.each {|s| p s.local_address }
  #   #=> #<Addrinfo: [::]:53114 TCP>
  #   #   #<Addrinfo: 0.0.0.0:53114 TCP>
  #
  #   # The block is called with the sockets.
  #   Socket.tcp_server_sockets(0) {|sockets|
  #     p sockets #=> [#<Socket:fd 3>, #<Socket:fd 4>]
  #   }
  #
  def self.tcp_server_sockets(host=nil, port)
    if port == 0
      sockets = tcp_server_sockets_port0(host)
    else
      last_error = nil
      sockets = []
      begin
        Addrinfo.foreach(host, port, nil, :STREAM, nil, Socket::AI_PASSIVE) {|ai|
          begin
            s = ai.listen
          rescue SystemCallError
            last_error = $!
            next
          end
          sockets << s
        }
        if sockets.empty?
          raise last_error
        end
      rescue Exception
        sockets.each(&:close)
        raise
      end
    end
    if block_given?
      begin
        yield sockets
      ensure
        sockets.each(&:close)
      end
    else
      sockets
    end
  end

  # yield socket and client address for each a connection accepted via given sockets.
  #
  # The arguments are a list of sockets.
  # The individual argument should be a socket or an array of sockets.
  #
  # This method yields the block sequentially.
  # It means that the next connection is not accepted until the block returns.
  # So concurrent mechanism, thread for example, should be used to service multiple clients at a time.
  #
  def self.accept_loop(*sockets) # :yield: socket, client_addrinfo
    sockets.flatten!(1)
    if sockets.empty?
      raise ArgumentError, "no sockets"
    end
    loop {
      readable, _, _ = IO.select(sockets)
      readable.each {|r|
        sock, addr = r.accept_nonblock(exception: false)
        next if sock == :wait_readable
        yield sock, addr
      }
    }
  end

  # creates a TCP/IP server on _port_ and calls the block for each connection accepted.
  # The block is called with a socket and a client_address as an Addrinfo object.
  #
  # If _host_ is specified, it is used with _port_ to determine the server addresses.
  #
  # The socket is *not* closed when the block returns.
  # So application should close it explicitly.
  #
  # This method calls the block sequentially.
  # It means that the next connection is not accepted until the block returns.
  # So concurrent mechanism, thread for example, should be used to service multiple clients at a time.
  #
  # Note that Addrinfo.getaddrinfo is used to determine the server socket addresses.
  # When Addrinfo.getaddrinfo returns two or more addresses,
  # IPv4 and IPv6 address for example,
  # all of them are used.
  # Socket.tcp_server_loop succeeds if one socket can be used at least.
  #
  #   # Sequential echo server.
  #   # It services only one client at a time.
  #   Socket.tcp_server_loop(16807) {|sock, client_addrinfo|
  #     begin
  #       IO.copy_stream(sock, sock)
  #     ensure
  #       sock.close
  #     end
  #   }
  #
  #   # Threaded echo server
  #   # It services multiple clients at a time.
  #   # Note that it may accept connections too much.
  #   Socket.tcp_server_loop(16807) {|sock, client_addrinfo|
  #     Thread.new {
  #       begin
  #         IO.copy_stream(sock, sock)
  #       ensure
  #         sock.close
  #       end
  #     }
  #   }
  #
  def self.tcp_server_loop(host=nil, port, &b) # :yield: socket, client_addrinfo
    tcp_server_sockets(host, port) {|sockets|
      accept_loop(sockets, &b)
    }
  end

  # :call-seq:
  #   Socket.udp_server_sockets([host, ] port)
  #
  # Creates UDP/IP sockets for a UDP server.
  #
  # If no block given, it returns an array of sockets.
  #
  # If a block is given, the block is called with the sockets.
  # The value of the block is returned.
  # The sockets are closed when this method returns.
  #
  # If _port_ is zero, some port is chosen.
  # But the chosen port is used for the all sockets.
  #
  #   # UDP/IP echo server
  #   Socket.udp_server_sockets(0) {|sockets|
  #     p sockets.first.local_address.ip_port     #=> 32963
  #     Socket.udp_server_loop_on(sockets) {|msg, msg_src|
  #       msg_src.reply msg
  #     }
  #   }
  #
  def self.udp_server_sockets(host=nil, port)
    last_error = nil
    sockets = []

    ipv6_recvpktinfo = nil
    if defined? Socket::AncillaryData
      if defined? Socket::IPV6_RECVPKTINFO # RFC 3542
        ipv6_recvpktinfo = Socket::IPV6_RECVPKTINFO
      elsif defined? Socket::IPV6_PKTINFO # RFC 2292
        ipv6_recvpktinfo = Socket::IPV6_PKTINFO
      end
    end

    local_addrs = Socket.ip_address_list

    ip_list = []
    Addrinfo.foreach(host, port, nil, :DGRAM, nil, Socket::AI_PASSIVE) {|ai|
      if ai.ipv4? && ai.ip_address == "0.0.0.0"
        local_addrs.each {|a|
          next unless a.ipv4?
          ip_list << Addrinfo.new(a.to_sockaddr, :INET, :DGRAM, 0);
        }
      elsif ai.ipv6? && ai.ip_address == "::" && !ipv6_recvpktinfo
        local_addrs.each {|a|
          next unless a.ipv6?
          ip_list << Addrinfo.new(a.to_sockaddr, :INET6, :DGRAM, 0);
        }
      else
        ip_list << ai
      end
    }
    ip_list.uniq!(&:to_sockaddr)

    if port == 0
      sockets = ip_sockets_port0(ip_list, false)
    else
      ip_list.each {|ip|
        ai = Addrinfo.udp(ip.ip_address, port)
        begin
          s = ai.bind
        rescue SystemCallError
          last_error = $!
          next
        end
        sockets << s
      }
      if sockets.empty?
        raise last_error
      end
    end

    sockets.each {|s|
      ai = s.local_address
      if ipv6_recvpktinfo && ai.ipv6? && ai.ip_address == "::"
        s.setsockopt(:IPV6, ipv6_recvpktinfo, 1)
      end
    }

    if block_given?
      begin
        yield sockets
      ensure
        sockets.each(&:close) if sockets
      end
    else
      sockets
    end
  end

  # :call-seq:
  #   Socket.udp_server_recv(sockets) {|msg, msg_src| ... }
  #
  # Receive UDP/IP packets from the given _sockets_.
  # For each packet received, the block is called.
  #
  # The block receives _msg_ and _msg_src_.
  # _msg_ is a string which is the payload of the received packet.
  # _msg_src_ is a Socket::UDPSource object which is used for reply.
  #
  # Socket.udp_server_loop can be implemented using this method as follows.
  #
  #   udp_server_sockets(host, port) {|sockets|
  #     loop {
  #       readable, _, _ = IO.select(sockets)
  #       udp_server_recv(readable) {|msg, msg_src| ... }
  #     }
  #   }
  #
  def self.udp_server_recv(sockets)
    sockets.each {|r|
      msg, sender_addrinfo, _, *controls = r.recvmsg_nonblock(exception: false)
      next if msg == :wait_readable
      ai = r.local_address
      if ai.ipv6? and pktinfo = controls.find {|c| c.cmsg_is?(:IPV6, :PKTINFO) }
        ai = Addrinfo.udp(pktinfo.ipv6_pktinfo_addr.ip_address, ai.ip_port)
        yield msg, UDPSource.new(sender_addrinfo, ai) {|reply_msg|
          r.sendmsg reply_msg, 0, sender_addrinfo, pktinfo
        }
      else
        yield msg, UDPSource.new(sender_addrinfo, ai) {|reply_msg|
          r.send reply_msg, 0, sender_addrinfo
        }
      end
    }
  end

  # :call-seq:
  #   Socket.udp_server_loop_on(sockets) {|msg, msg_src| ... }
  #
  # Run UDP/IP server loop on the given sockets.
  #
  # The return value of Socket.udp_server_sockets is appropriate for the argument.
  #
  # It calls the block for each message received.
  #
  def self.udp_server_loop_on(sockets, &b) # :yield: msg, msg_src
    loop {
      readable, _, _ = IO.select(sockets)
      udp_server_recv(readable, &b)
    }
  end

  # :call-seq:
  #   Socket.udp_server_loop(port) {|msg, msg_src| ... }
  #   Socket.udp_server_loop(host, port) {|msg, msg_src| ... }
  #
  # creates a UDP/IP server on _port_ and calls the block for each message arrived.
  # The block is called with the message and its source information.
  #
  # This method allocates sockets internally using _port_.
  # If _host_ is specified, it is used conjunction with _port_ to determine the server addresses.
  #
  # The _msg_ is a string.
  #
  # The _msg_src_ is a Socket::UDPSource object.
  # It is used for reply.
  #
  #   # UDP/IP echo server.
  #   Socket.udp_server_loop(9261) {|msg, msg_src|
  #     msg_src.reply msg
  #   }
  #
  def self.udp_server_loop(host=nil, port, &b) # :yield: message, message_source
    udp_server_sockets(host, port) {|sockets|
      udp_server_loop_on(sockets, &b)
    }
  end

  # UDP/IP address information used by Socket.udp_server_loop.
  class UDPSource
    # +remote_address+ is an Addrinfo object.
    #
    # +local_address+ is an Addrinfo object.
    #
    # +reply_proc+ is a Proc used to send reply back to the source.
    def initialize(remote_address, local_address, &reply_proc)
      @remote_address = remote_address
      @local_address = local_address
      @reply_proc = reply_proc
    end

    # Address of the source
    attr_reader :remote_address

    # Local address
    attr_reader :local_address

    def inspect # :nodoc:
      "\#<#{self.class}: #{@remote_address.inspect_sockaddr} to #{@local_address.inspect_sockaddr}>".dup
    end

    # Sends the String +msg+ to the source
    def reply(msg)
      @reply_proc.call msg
    end
  end

  # creates a new socket connected to path using UNIX socket socket.
  #
  # If a block is given, the block is called with the socket.
  # The value of the block is returned.
  # The socket is closed when this method returns.
  #
  # If no block is given, the socket is returned.
  #
  #   # talk to /tmp/sock socket.
  #   Socket.unix("/tmp/sock") {|sock|
  #     t = Thread.new { IO.copy_stream(sock, STDOUT) }
  #     IO.copy_stream(STDIN, sock)
  #     t.join
  #   }
  #
  def self.unix(path) # :yield: socket
    addr = Addrinfo.unix(path)
    sock = addr.connect
    if block_given?
      begin
        yield sock
      ensure
        sock.close
      end
    else
      sock
    end
  end

  # creates a UNIX server socket on _path_
  #
  # If no block given, it returns a listening socket.
  #
  # If a block is given, it is called with the socket and the block value is returned.
  # When the block exits, the socket is closed and the socket file is removed.
  #
  #   socket = Socket.unix_server_socket("/tmp/s")
  #   p socket                  #=> #<Socket:fd 3>
  #   p socket.local_address    #=> #<Addrinfo: /tmp/s SOCK_STREAM>
  #
  #   Socket.unix_server_socket("/tmp/sock") {|s|
  #     p s                     #=> #<Socket:fd 3>
  #     p s.local_address       #=> # #<Addrinfo: /tmp/sock SOCK_STREAM>
  #   }
  #
  def self.unix_server_socket(path)
    unless unix_socket_abstract_name?(path)
      begin
        st = File.lstat(path)
      rescue Errno::ENOENT
      end
      if st&.socket? && st.owned?
        File.unlink path
      end
    end
    s = Addrinfo.unix(path).listen
    if block_given?
      begin
        yield s
      ensure
        s.close
        unless unix_socket_abstract_name?(path)
          File.unlink path
        end
      end
    else
      s
    end
  end

  class << self
    private

    def unix_socket_abstract_name?(path)
      /linux/ =~ RUBY_PLATFORM && /\A(\0|\z)/ =~ path
    end
  end

  # creates a UNIX socket server on _path_.
  # It calls the block for each socket accepted.
  #
  # If _host_ is specified, it is used with _port_ to determine the server ports.
  #
  # The socket is *not* closed when the block returns.
  # So application should close it.
  #
  # This method deletes the socket file pointed by _path_ at first if
  # the file is a socket file and it is owned by the user of the application.
  # This is safe only if the directory of _path_ is not changed by a malicious user.
  # So don't use /tmp/malicious-users-directory/socket.
  # Note that /tmp/socket and /tmp/your-private-directory/socket is safe assuming that /tmp has sticky bit.
  #
  #   # Sequential echo server.
  #   # It services only one client at a time.
  #   Socket.unix_server_loop("/tmp/sock") {|sock, client_addrinfo|
  #     begin
  #       IO.copy_stream(sock, sock)
  #     ensure
  #       sock.close
  #     end
  #   }
  #
  def self.unix_server_loop(path, &b) # :yield: socket, client_addrinfo
    unix_server_socket(path) {|serv|
      accept_loop(serv, &b)
    }
  end

  # call-seq:
  #   socket.connect_nonblock(remote_sockaddr, [options]) => 0
  #
  # Requests a connection to be made on the given +remote_sockaddr+ after
  # O_NONBLOCK is set for the underlying file descriptor.
  # Returns 0 if successful, otherwise an exception is raised.
  #
  # === Parameter
  #  # +remote_sockaddr+ - the +struct+ sockaddr contained in a string or Addrinfo object
  #
  # === Example:
  #   # Pull down Google's web page
  #   require 'socket'
  #   include Socket::Constants
  #   socket = Socket.new(AF_INET, SOCK_STREAM, 0)
  #   sockaddr = Socket.sockaddr_in(80, 'www.google.com')
  #   begin # emulate blocking connect
  #     socket.connect_nonblock(sockaddr)
  #   rescue IO::WaitWritable
  #     IO.select(nil, [socket]) # wait 3-way handshake completion
  #     begin
  #       socket.connect_nonblock(sockaddr) # check connection failure
  #     rescue Errno::EISCONN
  #     end
  #   end
  #   socket.write("GET / HTTP/1.0\r\n\r\n")
  #   results = socket.read
  #
  # Refer to Socket#connect for the exceptions that may be thrown if the call
  # to _connect_nonblock_ fails.
  #
  # Socket#connect_nonblock may raise any error corresponding to connect(2) failure,
  # including Errno::EINPROGRESS.
  #
  # If the exception is Errno::EINPROGRESS,
  # it is extended by IO::WaitWritable.
  # So IO::WaitWritable can be used to rescue the exceptions for retrying connect_nonblock.
  #
  # By specifying a keyword argument _exception_ to +false+, you can indicate
  # that connect_nonblock should not raise an IO::WaitWritable exception, but
  # return the symbol +:wait_writable+ instead.
  #
  # === See
  #  # Socket#connect
  def connect_nonblock(addr, exception: true)
    __connect_nonblock(addr, exception)
  end
end

class UDPSocket < IPSocket

  # call-seq:
  #   udpsocket.recvfrom_nonblock(maxlen [, flags[, outbuf [, options]]]) => [mesg, sender_inet_addr]
  #
  # Receives up to _maxlen_ bytes from +udpsocket+ using recvfrom(2) after
  # O_NONBLOCK is set for the underlying file descriptor.
  # _flags_ is zero or more of the +MSG_+ options.
  # The first element of the results, _mesg_, is the data received.
  # The second element, _sender_inet_addr_, is an array to represent the sender address.
  #
  # When recvfrom(2) returns 0,
  # Socket#recvfrom_nonblock returns an empty string as data.
  # It means an empty packet.
  #
  # === Parameters
  # * +maxlen+ - the number of bytes to receive from the socket
  # * +flags+ - zero or more of the +MSG_+ options
  # * +outbuf+ - destination String buffer
  # * +options+ - keyword hash, supporting `exception: false`
  #
  # === Example
  # 	require 'socket'
  # 	s1 = UDPSocket.new
  # 	s1.bind("127.0.0.1", 0)
  # 	s2 = UDPSocket.new
  # 	s2.bind("127.0.0.1", 0)
  # 	s2.connect(*s1.addr.values_at(3,1))
  # 	s1.connect(*s2.addr.values_at(3,1))
  # 	s1.send "aaa", 0
  # 	begin # emulate blocking recvfrom
  # 	  p s2.recvfrom_nonblock(10)  #=> ["aaa", ["AF_INET", 33302, "localhost.localdomain", "127.0.0.1"]]
  # 	rescue IO::WaitReadable
  # 	  IO.select([s2])
  # 	  retry
  # 	end
  #
  # Refer to Socket#recvfrom for the exceptions that may be thrown if the call
  # to _recvfrom_nonblock_ fails.
  #
  # UDPSocket#recvfrom_nonblock may raise any error corresponding to recvfrom(2) failure,
  # including Errno::EWOULDBLOCK.
  #
  # If the exception is Errno::EWOULDBLOCK or Errno::EAGAIN,
  # it is extended by IO::WaitReadable.
  # So IO::WaitReadable can be used to rescue the exceptions for retrying recvfrom_nonblock.
  #
  # By specifying a keyword argument _exception_ to +false+, you can indicate
  # that recvfrom_nonblock should not raise an IO::WaitReadable exception, but
  # return the symbol +:wait_readable+ instead.
  #
  # === See
  # * Socket#recvfrom
  def recvfrom_nonblock(len, flag = 0, outbuf = nil, exception: true)
    __recvfrom_nonblock(len, flag, outbuf, exception)
  end
end

class TCPServer < TCPSocket

  # call-seq:
  #   tcpserver.accept_nonblock([options]) => tcpsocket
  #
  # Accepts an incoming connection using accept(2) after
  # O_NONBLOCK is set for the underlying file descriptor.
  # It returns an accepted TCPSocket for the incoming connection.
  #
  # === Example
  # 	require 'socket'
  # 	serv = TCPServer.new(2202)
  # 	begin # emulate blocking accept
  # 	  sock = serv.accept_nonblock
  # 	rescue IO::WaitReadable, Errno::EINTR
  # 	  IO.select([serv])
  # 	  retry
  # 	end
  # 	# sock is an accepted socket.
  #
  # Refer to Socket#accept for the exceptions that may be thrown if the call
  # to TCPServer#accept_nonblock fails.
  #
  # TCPServer#accept_nonblock may raise any error corresponding to accept(2) failure,
  # including Errno::EWOULDBLOCK.
  #
  # If the exception is Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::ECONNABORTED, Errno::EPROTO,
  # it is extended by IO::WaitReadable.
  # So IO::WaitReadable can be used to rescue the exceptions for retrying accept_nonblock.
  #
  # By specifying a keyword argument _exception_ to +false+, you can indicate
  # that accept_nonblock should not raise an IO::WaitReadable exception, but
  # return the symbol +:wait_readable+ instead.
  #
  # === See
  # * TCPServer#accept
  # * Socket#accept
  def accept_nonblock(exception: true)
    __accept_nonblock(exception)
  end
end

class UNIXServer < UNIXSocket
  # call-seq:
  #   unixserver.accept_nonblock([options]) => unixsocket
  #
  # Accepts an incoming connection using accept(2) after
  # O_NONBLOCK is set for the underlying file descriptor.
  # It returns an accepted UNIXSocket for the incoming connection.
  #
  # === Example
  # 	require 'socket'
  # 	serv = UNIXServer.new("/tmp/sock")
  # 	begin # emulate blocking accept
  # 	  sock = serv.accept_nonblock
  # 	rescue IO::WaitReadable, Errno::EINTR
  # 	  IO.select([serv])
  # 	  retry
  # 	end
  # 	# sock is an accepted socket.
  #
  # Refer to Socket#accept for the exceptions that may be thrown if the call
  # to UNIXServer#accept_nonblock fails.
  #
  # UNIXServer#accept_nonblock may raise any error corresponding to accept(2) failure,
  # including Errno::EWOULDBLOCK.
  #
  # If the exception is Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::ECONNABORTED or Errno::EPROTO,
  # it is extended by IO::WaitReadable.
  # So IO::WaitReadable can be used to rescue the exceptions for retrying accept_nonblock.
  #
  # By specifying a keyword argument _exception_ to +false+, you can indicate
  # that accept_nonblock should not raise an IO::WaitReadable exception, but
  # return the symbol +:wait_readable+ instead.
  #
  # === See
  # * UNIXServer#accept
  # * Socket#accept
  def accept_nonblock(exception: true)
    __accept_nonblock(exception)
  end
end if defined?(UNIXSocket)
PK}$[Se���ruby/tmpdir.rbnu�[���# frozen_string_literal: true
#
# tmpdir - retrieve temporary directory path
#
# $Id$
#

require 'fileutils'
begin
  require 'etc.so'
rescue LoadError # rescue LoadError for miniruby
end

class Dir

  @@systmpdir ||= defined?(Etc.systmpdir) ? Etc.systmpdir : '/tmp'

  ##
  # Returns the operating system's temporary file path.

  def self.tmpdir
    tmp = nil
    ['TMPDIR', 'TMP', 'TEMP', ['system temporary path', @@systmpdir], ['/tmp']*2, ['.']*2].each do |name, dir = ENV[name]|
      next if !dir
      dir = File.expand_path(dir)
      stat = File.stat(dir) rescue next
      case
      when !stat.directory?
        warn "#{name} is not a directory: #{dir}"
      when !stat.writable?
        warn "#{name} is not writable: #{dir}"
      when stat.world_writable? && !stat.sticky?
        warn "#{name} is world-writable: #{dir}"
      else
        tmp = dir
        break
      end
    end
    raise ArgumentError, "could not find a temporary directory" unless tmp
    tmp
  end

  # Dir.mktmpdir creates a temporary directory.
  #
  # The directory is created with 0700 permission.
  # Application should not change the permission to make the temporary directory accessible from other users.
  #
  # The prefix and suffix of the name of the directory is specified by
  # the optional first argument, <i>prefix_suffix</i>.
  # - If it is not specified or nil, "d" is used as the prefix and no suffix is used.
  # - If it is a string, it is used as the prefix and no suffix is used.
  # - If it is an array, first element is used as the prefix and second element is used as a suffix.
  #
  #  Dir.mktmpdir {|dir| dir is ".../d..." }
  #  Dir.mktmpdir("foo") {|dir| dir is ".../foo..." }
  #  Dir.mktmpdir(["foo", "bar"]) {|dir| dir is ".../foo...bar" }
  #
  # The directory is created under Dir.tmpdir or
  # the optional second argument <i>tmpdir</i> if non-nil value is given.
  #
  #  Dir.mktmpdir {|dir| dir is "#{Dir.tmpdir}/d..." }
  #  Dir.mktmpdir(nil, "/var/tmp") {|dir| dir is "/var/tmp/d..." }
  #
  # If a block is given,
  # it is yielded with the path of the directory.
  # The directory and its contents are removed
  # using FileUtils.remove_entry before Dir.mktmpdir returns.
  # The value of the block is returned.
  #
  #  Dir.mktmpdir {|dir|
  #    # use the directory...
  #    open("#{dir}/foo", "w") { something using the file }
  #  }
  #
  # If a block is not given,
  # The path of the directory is returned.
  # In this case, Dir.mktmpdir doesn't remove the directory.
  #
  #  dir = Dir.mktmpdir
  #  begin
  #    # use the directory...
  #    open("#{dir}/foo", "w") { something using the file }
  #  ensure
  #    # remove the directory.
  #    FileUtils.remove_entry dir
  #  end
  #
  def self.mktmpdir(prefix_suffix=nil, *rest, **options)
    base = nil
    path = Tmpname.create(prefix_suffix || "d", *rest, **options) {|path, _, _, d|
      base = d
      mkdir(path, 0700)
    }
    if block_given?
      begin
        yield path.dup
      ensure
        unless base
          stat = File.stat(File.dirname(path))
          if stat.world_writable? and !stat.sticky?
            raise ArgumentError, "parent directory is world writable but not sticky"
          end
        end
        FileUtils.remove_entry path
      end
    else
      path
    end
  end

  module Tmpname # :nodoc:
    module_function

    def tmpdir
      Dir.tmpdir
    end

    UNUSABLE_CHARS = "^,-.0-9A-Z_a-z~"

    class << (RANDOM = Random.new)
      MAX = 36**6 # < 0x100000000
      def next
        rand(MAX).to_s(36)
      end
    end
    private_constant :RANDOM

    def create(basename, tmpdir=nil, max_try: nil, **opts)
      origdir = tmpdir
      tmpdir ||= tmpdir()
      n = nil
      prefix, suffix = basename
      prefix = (String.try_convert(prefix) or
                raise ArgumentError, "unexpected prefix: #{prefix.inspect}")
      prefix = prefix.delete(UNUSABLE_CHARS)
      suffix &&= (String.try_convert(suffix) or
                  raise ArgumentError, "unexpected suffix: #{suffix.inspect}")
      suffix &&= suffix.delete(UNUSABLE_CHARS)
      begin
        t = Time.now.strftime("%Y%m%d")
        path = "#{prefix}#{t}-#{$$}-#{RANDOM.next}"\
               "#{n ? %[-#{n}] : ''}#{suffix||''}"
        path = File.join(tmpdir, path)
        yield(path, n, opts, origdir)
      rescue Errno::EEXIST
        n ||= 0
        n += 1
        retry if !max_try or n < max_try
        raise "cannot generate temporary name using `#{basename}' under `#{tmpdir}'"
      end
      path
    end
  end
end
PK}$[�$J�jjruby/date.rbnu�[���# frozen_string_literal: true
# date.rb: Written by Tadayoshi Funaba 1998-2011

require 'date_core'

class Date
  VERSION = '3.2.2' # :nodoc:

  def infinite?
    false
  end

  class Infinity < Numeric # :nodoc:

    def initialize(d=1) @d = d <=> 0 end

    def d() @d end

    protected :d

    def zero?() false end
    def finite?() false end
    def infinite?() d.nonzero? end
    def nan?() d.zero? end

    def abs() self.class.new end

    def -@() self.class.new(-d) end
    def +@() self.class.new(+d) end

    def <=>(other)
      case other
      when Infinity; return d <=> other.d
      when Float::INFINITY; return d <=> 1
      when -Float::INFINITY; return d <=> -1
      when Numeric; return d
      else
        begin
          l, r = other.coerce(self)
          return l <=> r
        rescue NoMethodError
        end
      end
      nil
    end

    def coerce(other)
      case other
      when Numeric; return -d, d
      else
        super
      end
    end

    def to_f
      return 0 if @d == 0
      if @d > 0
        Float::INFINITY
      else
        -Float::INFINITY
      end
    end

  end

end
PK}$[�mn��^�^ruby/time.rbnu�[���# frozen_string_literal: true
# shareable_constant_value: literal

require 'date'

# :stopdoc:

# = time.rb
#
# When 'time' is required, Time is extended with additional methods for parsing
# and converting Times.
#
# == Features
#
# This library extends the Time class with the following conversions between
# date strings and Time objects:
#
# * date-time defined by {RFC 2822}[http://www.ietf.org/rfc/rfc2822.txt]
# * HTTP-date defined by {RFC 2616}[http://www.ietf.org/rfc/rfc2616.txt]
# * dateTime defined by XML Schema Part 2: Datatypes ({ISO
#   8601}[http://www.iso.org/iso/date_and_time_format])
# * various formats handled by Date._parse
# * custom formats handled by Date._strptime

# :startdoc:

class Time
  class << Time

    #
    # A hash of timezones mapped to hour differences from UTC. The
    # set of time zones corresponds to the ones specified by RFC 2822
    # and ISO 8601.
    #
    ZoneOffset = { # :nodoc:
      'UTC' => 0,
      # ISO 8601
      'Z' => 0,
      # RFC 822
      'UT' => 0, 'GMT' => 0,
      'EST' => -5, 'EDT' => -4,
      'CST' => -6, 'CDT' => -5,
      'MST' => -7, 'MDT' => -6,
      'PST' => -8, 'PDT' => -7,
      # Following definition of military zones is original one.
      # See RFC 1123 and RFC 2822 for the error in RFC 822.
      'A' => +1, 'B' => +2, 'C' => +3, 'D' => +4,  'E' => +5,  'F' => +6,
      'G' => +7, 'H' => +8, 'I' => +9, 'K' => +10, 'L' => +11, 'M' => +12,
      'N' => -1, 'O' => -2, 'P' => -3, 'Q' => -4,  'R' => -5,  'S' => -6,
      'T' => -7, 'U' => -8, 'V' => -9, 'W' => -10, 'X' => -11, 'Y' => -12,
    }

    #
    # Return the number of seconds the specified time zone differs
    # from UTC.
    #
    # Numeric time zones that include minutes, such as
    # <code>-10:00</code> or <code>+1330</code> will work, as will
    # simpler hour-only time zones like <code>-10</code> or
    # <code>+13</code>.
    #
    # Textual time zones listed in ZoneOffset are also supported.
    #
    # If the time zone does not match any of the above, +zone_offset+
    # will check if the local time zone (both with and without
    # potential Daylight Saving \Time changes being in effect) matches
    # +zone+. Specifying a value for +year+ will change the year used
    # to find the local time zone.
    #
    # If +zone_offset+ is unable to determine the offset, nil will be
    # returned.
    #
    #     require 'time'
    #
    #     Time.zone_offset("EST") #=> -18000
    #
    # You must require 'time' to use this method.
    #
    def zone_offset(zone, year=self.now.year)
      off = nil
      zone = zone.upcase
      if /\A([+-])(\d\d)(:?)(\d\d)(?:\3(\d\d))?\z/ =~ zone
        off = ($1 == '-' ? -1 : 1) * (($2.to_i * 60 + $4.to_i) * 60 + $5.to_i)
      elsif zone.match?(/\A[+-]\d\d\z/)
        off = zone.to_i * 3600
      elsif ZoneOffset.include?(zone)
        off = ZoneOffset[zone] * 3600
      elsif ((t = self.local(year, 1, 1)).zone.upcase == zone rescue false)
        off = t.utc_offset
      elsif ((t = self.local(year, 7, 1)).zone.upcase == zone rescue false)
        off = t.utc_offset
      end
      off
    end

    # :stopdoc:
    def zone_utc?(zone)
      # * +0000
      #   In RFC 2822, +0000 indicate a time zone at Universal Time.
      #   Europe/Lisbon is "a time zone at Universal Time" in Winter.
      #   Atlantic/Reykjavik is "a time zone at Universal Time".
      #   Africa/Dakar is "a time zone at Universal Time".
      #   So +0000 is a local time such as Europe/London, etc.
      # * GMT
      #   GMT is used as a time zone abbreviation in Europe/London,
      #   Africa/Dakar, etc.
      #   So it is a local time.
      #
      # * -0000, -00:00
      #   In RFC 2822, -0000 the date-time contains no information about the
      #   local time zone.
      #   In RFC 3339, -00:00 is used for the time in UTC is known,
      #   but the offset to local time is unknown.
      #   They are not appropriate for specific time zone such as
      #   Europe/London because time zone neutral,
      #   So -00:00 and -0000 are treated as UTC.
      zone.match?(/\A(?:-00:00|-0000|-00|UTC|Z|UT)\z/i)
    end
    private :zone_utc?

    def force_zone!(t, zone, offset=nil)
      if zone_utc?(zone)
        t.utc
      elsif offset ||= zone_offset(zone)
        # Prefer the local timezone over the fixed offset timezone because
        # the former is a real timezone and latter is an artificial timezone.
        t.localtime
        if t.utc_offset != offset
          # Use the fixed offset timezone only if the local timezone cannot
          # represent the given offset.
          t.localtime(offset)
        end
      else
        t.localtime
      end
    end
    private :force_zone!

    LeapYearMonthDays = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] # :nodoc:
    CommonYearMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] # :nodoc:
    def month_days(y, m)
      if ((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)
        LeapYearMonthDays[m-1]
      else
        CommonYearMonthDays[m-1]
      end
    end
    private :month_days

    def apply_offset(year, mon, day, hour, min, sec, off)
      if off < 0
        off = -off
        off, o = off.divmod(60)
        if o != 0 then sec += o; o, sec = sec.divmod(60); off += o end
        off, o = off.divmod(60)
        if o != 0 then min += o; o, min = min.divmod(60); off += o end
        off, o = off.divmod(24)
        if o != 0 then hour += o; o, hour = hour.divmod(24); off += o end
        if off != 0
          day += off
          days = month_days(year, mon)
          if days and days < day
            mon += 1
            if 12 < mon
              mon = 1
              year += 1
            end
            day = 1
          end
        end
      elsif 0 < off
        off, o = off.divmod(60)
        if o != 0 then sec -= o; o, sec = sec.divmod(60); off -= o end
        off, o = off.divmod(60)
        if o != 0 then min -= o; o, min = min.divmod(60); off -= o end
        off, o = off.divmod(24)
        if o != 0 then hour -= o; o, hour = hour.divmod(24); off -= o end
        if off != 0 then
          day -= off
          if day < 1
            mon -= 1
            if mon < 1
              year -= 1
              mon = 12
            end
            day = month_days(year, mon)
          end
        end
      end
      return year, mon, day, hour, min, sec
    end
    private :apply_offset

    def make_time(date, year, yday, mon, day, hour, min, sec, sec_fraction, zone, now)
      if !year && !yday && !mon && !day && !hour && !min && !sec && !sec_fraction
        raise ArgumentError, "no time information in #{date.inspect}"
      end

      off = nil
      if year || now
        off_year = year || now.year
        off = zone_offset(zone, off_year) if zone
      end

      if yday
        unless (1..366) === yday
          raise ArgumentError, "yday #{yday} out of range"
        end
        mon, day = (yday-1).divmod(31)
        mon += 1
        day += 1
        t = make_time(date, year, nil, mon, day, hour, min, sec, sec_fraction, zone, now)
        diff = yday - t.yday
        return t if diff.zero?
        day += diff
        if day > 28 and day > (mday = month_days(off_year, mon))
          if (mon += 1) > 12
            raise ArgumentError, "yday #{yday} out of range"
          end
          day -= mday
        end
        return make_time(date, year, nil, mon, day, hour, min, sec, sec_fraction, zone, now)
      end

      if now and now.respond_to?(:getlocal)
        if off
          now = now.getlocal(off) if now.utc_offset != off
        else
          now = now.getlocal
        end
      end

      usec = nil
      usec = sec_fraction * 1000000 if sec_fraction

      if now
        begin
          break if year; year = now.year
          break if mon; mon = now.mon
          break if day; day = now.day
          break if hour; hour = now.hour
          break if min; min = now.min
          break if sec; sec = now.sec
          break if sec_fraction; usec = now.tv_usec
        end until true
      end

      year ||= 1970
      mon ||= 1
      day ||= 1
      hour ||= 0
      min ||= 0
      sec ||= 0
      usec ||= 0

      if year != off_year
        off = nil
        off = zone_offset(zone, year) if zone
      end

      if off
        year, mon, day, hour, min, sec =
          apply_offset(year, mon, day, hour, min, sec, off)
        t = self.utc(year, mon, day, hour, min, sec, usec)
        force_zone!(t, zone, off)
        t
      else
        self.local(year, mon, day, hour, min, sec, usec)
      end
    end
    private :make_time
    # :startdoc:

    #
    # Takes a string representation of a Time and attempts to parse it
    # using a heuristic.
    #
    # This method **does not** function as a validator.  If the input
    # string does not match valid formats strictly, you may get a
    # cryptic result.  Should consider to use `Time.strptime` instead
    # of this method as possible.
    #
    #     require 'time'
    #
    #     Time.parse("2010-10-31") #=> 2010-10-31 00:00:00 -0500
    #
    # Any missing pieces of the date are inferred based on the current date.
    #
    #     require 'time'
    #
    #     # assuming the current date is "2011-10-31"
    #     Time.parse("12:00") #=> 2011-10-31 12:00:00 -0500
    #
    # We can change the date used to infer our missing elements by passing a second
    # object that responds to #mon, #day and #year, such as Date, Time or DateTime.
    # We can also use our own object.
    #
    #     require 'time'
    #
    #     class MyDate
    #       attr_reader :mon, :day, :year
    #
    #       def initialize(mon, day, year)
    #         @mon, @day, @year = mon, day, year
    #       end
    #     end
    #
    #     d  = Date.parse("2010-10-28")
    #     t  = Time.parse("2010-10-29")
    #     dt = DateTime.parse("2010-10-30")
    #     md = MyDate.new(10,31,2010)
    #
    #     Time.parse("12:00", d)  #=> 2010-10-28 12:00:00 -0500
    #     Time.parse("12:00", t)  #=> 2010-10-29 12:00:00 -0500
    #     Time.parse("12:00", dt) #=> 2010-10-30 12:00:00 -0500
    #     Time.parse("12:00", md) #=> 2010-10-31 12:00:00 -0500
    #
    # If a block is given, the year described in +date+ is converted
    # by the block.  This is specifically designed for handling two
    # digit years. For example, if you wanted to treat all two digit
    # years prior to 70 as the year 2000+ you could write this:
    #
    #     require 'time'
    #
    #     Time.parse("01-10-31") {|year| year + (year < 70 ? 2000 : 1900)}
    #     #=> 2001-10-31 00:00:00 -0500
    #     Time.parse("70-10-31") {|year| year + (year < 70 ? 2000 : 1900)}
    #     #=> 1970-10-31 00:00:00 -0500
    #
    # If the upper components of the given time are broken or missing, they are
    # supplied with those of +now+.  For the lower components, the minimum
    # values (1 or 0) are assumed if broken or missing.  For example:
    #
    #     require 'time'
    #
    #     # Suppose it is "Thu Nov 29 14:33:20 2001" now and
    #     # your time zone is EST which is GMT-5.
    #     now = Time.parse("Thu Nov 29 14:33:20 2001")
    #     Time.parse("16:30", now)     #=> 2001-11-29 16:30:00 -0500
    #     Time.parse("7/23", now)      #=> 2001-07-23 00:00:00 -0500
    #     Time.parse("Aug 31", now)    #=> 2001-08-31 00:00:00 -0500
    #     Time.parse("Aug 2000", now)  #=> 2000-08-01 00:00:00 -0500
    #
    # Since there are numerous conflicts among locally defined time zone
    # abbreviations all over the world, this method is not intended to
    # understand all of them.  For example, the abbreviation "CST" is
    # used variously as:
    #
    #     -06:00 in America/Chicago,
    #     -05:00 in America/Havana,
    #     +08:00 in Asia/Harbin,
    #     +09:30 in Australia/Darwin,
    #     +10:30 in Australia/Adelaide,
    #     etc.
    #
    # Based on this fact, this method only understands the time zone
    # abbreviations described in RFC 822 and the system time zone, in the
    # order named. (i.e. a definition in RFC 822 overrides the system
    # time zone definition.)  The system time zone is taken from
    # <tt>Time.local(year, 1, 1).zone</tt> and
    # <tt>Time.local(year, 7, 1).zone</tt>.
    # If the extracted time zone abbreviation does not match any of them,
    # it is ignored and the given time is regarded as a local time.
    #
    # ArgumentError is raised if Date._parse cannot extract information from
    # +date+ or if the Time class cannot represent specified date.
    #
    # This method can be used as a fail-safe for other parsing methods as:
    #
    #   Time.rfc2822(date) rescue Time.parse(date)
    #   Time.httpdate(date) rescue Time.parse(date)
    #   Time.xmlschema(date) rescue Time.parse(date)
    #
    # A failure of Time.parse should be checked, though.
    #
    # You must require 'time' to use this method.
    #
    def parse(date, now=self.now)
      comp = !block_given?
      d = Date._parse(date, comp)
      year = d[:year]
      year = yield(year) if year && !comp
      make_time(date, year, d[:yday], d[:mon], d[:mday], d[:hour], d[:min], d[:sec], d[:sec_fraction], d[:zone], now)
    end

    #
    # Works similar to +parse+ except that instead of using a
    # heuristic to detect the format of the input string, you provide
    # a second argument that describes the format of the string.
    #
    # If a block is given, the year described in +date+ is converted by the
    # block.  For example:
    #
    #   Time.strptime(...) {|y| y < 100 ? (y >= 69 ? y + 1900 : y + 2000) : y}
    #
    # Below is a list of the formatting options:
    #
    # %a :: The abbreviated weekday name ("Sun")
    # %A :: The  full  weekday  name ("Sunday")
    # %b :: The abbreviated month name ("Jan")
    # %B :: The  full  month  name ("January")
    # %c :: The preferred local date and time representation
    # %C :: Century (20 in 2009)
    # %d :: Day of the month (01..31)
    # %D :: Date (%m/%d/%y)
    # %e :: Day of the month, blank-padded ( 1..31)
    # %F :: Equivalent to %Y-%m-%d (the ISO 8601 date format)
    # %g :: The last two digits of the commercial year
    # %G :: The week-based year according to ISO-8601 (week 1 starts on Monday
    #       and includes January 4)
    # %h :: Equivalent to %b
    # %H :: Hour of the day, 24-hour clock (00..23)
    # %I :: Hour of the day, 12-hour clock (01..12)
    # %j :: Day of the year (001..366)
    # %k :: hour, 24-hour clock, blank-padded ( 0..23)
    # %l :: hour, 12-hour clock, blank-padded ( 0..12)
    # %L :: Millisecond of the second (000..999)
    # %m :: Month of the year (01..12)
    # %M :: Minute of the hour (00..59)
    # %n :: Newline (\n)
    # %N :: Fractional seconds digits
    # %p :: Meridian indicator ("AM" or "PM")
    # %P :: Meridian indicator ("am" or "pm")
    # %r :: time, 12-hour (same as %I:%M:%S %p)
    # %R :: time, 24-hour (%H:%M)
    # %s :: Number of seconds since 1970-01-01 00:00:00 UTC.
    # %S :: Second of the minute (00..60)
    # %t :: Tab character (\t)
    # %T :: time, 24-hour (%H:%M:%S)
    # %u :: Day of the week as a decimal, Monday being 1. (1..7)
    # %U :: Week number of the current year, starting with the first Sunday as
    #       the first day of the first week (00..53)
    # %v :: VMS date (%e-%b-%Y)
    # %V :: Week number of year according to ISO 8601 (01..53)
    # %W :: Week  number  of the current year, starting with the first Monday
    #       as the first day of the first week (00..53)
    # %w :: Day of the week (Sunday is 0, 0..6)
    # %x :: Preferred representation for the date alone, no time
    # %X :: Preferred representation for the time alone, no date
    # %y :: Year without a century (00..99)
    # %Y :: Year which may include century, if provided
    # %z :: Time zone as  hour offset from UTC (e.g. +0900)
    # %Z :: Time zone name
    # %% :: Literal "%" character
    # %+ :: date(1) (%a %b %e %H:%M:%S %Z %Y)
    #
    #     require 'time'
    #
    #     Time.strptime("2000-10-31", "%Y-%m-%d") #=> 2000-10-31 00:00:00 -0500
    #
    # You must require 'time' to use this method.
    #
    def strptime(date, format, now=self.now)
      d = Date._strptime(date, format)
      raise ArgumentError, "invalid date or strptime format - `#{date}' `#{format}'" unless d
      if seconds = d[:seconds]
        if sec_fraction = d[:sec_fraction]
          usec = sec_fraction * 1000000
          usec *= -1 if seconds < 0
        else
          usec = 0
        end
        t = Time.at(seconds, usec)
        if zone = d[:zone]
          force_zone!(t, zone)
        end
      else
        year = d[:year]
        year = yield(year) if year && block_given?
        yday = d[:yday]
        if (d[:cwyear] && !year) || ((d[:cwday] || d[:cweek]) && !(d[:mon] && d[:mday]))
          # make_time doesn't deal with cwyear/cwday/cweek
          return Date.strptime(date, format).to_time
        end
        if (d[:wnum0] || d[:wnum1]) && !yday && !(d[:mon] && d[:mday])
          yday = Date.strptime(date, format).yday
        end
        t = make_time(date, year, yday, d[:mon], d[:mday], d[:hour], d[:min], d[:sec], d[:sec_fraction], d[:zone], now)
      end
      t
    end

    MonthValue = { # :nodoc:
      'JAN' => 1, 'FEB' => 2, 'MAR' => 3, 'APR' => 4, 'MAY' => 5, 'JUN' => 6,
      'JUL' => 7, 'AUG' => 8, 'SEP' => 9, 'OCT' =>10, 'NOV' =>11, 'DEC' =>12
    }

    #
    # Parses +date+ as date-time defined by RFC 2822 and converts it to a Time
    # object.  The format is identical to the date format defined by RFC 822 and
    # updated by RFC 1123.
    #
    # ArgumentError is raised if +date+ is not compliant with RFC 2822
    # or if the Time class cannot represent specified date.
    #
    # See #rfc2822 for more information on this format.
    #
    #     require 'time'
    #
    #     Time.rfc2822("Wed, 05 Oct 2011 22:26:12 -0400")
    #     #=> 2010-10-05 22:26:12 -0400
    #
    # You must require 'time' to use this method.
    #
    def rfc2822(date)
      if /\A\s*
          (?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s*,\s*)?
          (\d{1,2})\s+
          (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+
          (\d{2,})\s+
          (\d{2})\s*
          :\s*(\d{2})
          (?:\s*:\s*(\d\d))?\s+
          ([+-]\d{4}|
           UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT|[A-IK-Z])/ix =~ date
        # Since RFC 2822 permit comments, the regexp has no right anchor.
        day = $1.to_i
        mon = MonthValue[$2.upcase]
        year = $3.to_i
        short_year_p = $3.length <= 3
        hour = $4.to_i
        min = $5.to_i
        sec = $6 ? $6.to_i : 0
        zone = $7

        if short_year_p
          # following year completion is compliant with RFC 2822.
          year = if year < 50
                   2000 + year
                 else
                   1900 + year
                 end
        end

        off = zone_offset(zone)
        year, mon, day, hour, min, sec =
          apply_offset(year, mon, day, hour, min, sec, off)
        t = self.utc(year, mon, day, hour, min, sec)
        force_zone!(t, zone, off)
        t
      else
        raise ArgumentError.new("not RFC 2822 compliant date: #{date.inspect}")
      end
    end
    alias rfc822 rfc2822

    #
    # Parses +date+ as an HTTP-date defined by RFC 2616 and converts it to a
    # Time object.
    #
    # ArgumentError is raised if +date+ is not compliant with RFC 2616 or if
    # the Time class cannot represent specified date.
    #
    # See #httpdate for more information on this format.
    #
    #     require 'time'
    #
    #     Time.httpdate("Thu, 06 Oct 2011 02:26:12 GMT")
    #     #=> 2011-10-06 02:26:12 UTC
    #
    # You must require 'time' to use this method.
    #
    def httpdate(date)
      if date.match?(/\A\s*
          (?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),\x20
          (\d{2})\x20
          (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\x20
          (\d{4})\x20
          (\d{2}):(\d{2}):(\d{2})\x20
          GMT
          \s*\z/ix)
        self.rfc2822(date).utc
      elsif /\A\s*
             (?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday),\x20
             (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d)\x20
             (\d\d):(\d\d):(\d\d)\x20
             GMT
             \s*\z/ix =~ date
        year = $3.to_i
        if year < 50
          year += 2000
        else
          year += 1900
        end
        self.utc(year, $2, $1.to_i, $4.to_i, $5.to_i, $6.to_i)
      elsif /\A\s*
             (?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\x20
             (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\x20
             (\d\d|\x20\d)\x20
             (\d\d):(\d\d):(\d\d)\x20
             (\d{4})
             \s*\z/ix =~ date
        self.utc($6.to_i, MonthValue[$1.upcase], $2.to_i,
                 $3.to_i, $4.to_i, $5.to_i)
      else
        raise ArgumentError.new("not RFC 2616 compliant date: #{date.inspect}")
      end
    end

    #
    # Parses +time+ as a dateTime defined by the XML Schema and converts it to
    # a Time object.  The format is a restricted version of the format defined
    # by ISO 8601.
    #
    # ArgumentError is raised if +time+ is not compliant with the format or if
    # the Time class cannot represent the specified time.
    #
    # See #xmlschema for more information on this format.
    #
    #     require 'time'
    #
    #     Time.xmlschema("2011-10-05T22:26:12-04:00")
    #     #=> 2011-10-05 22:26:12-04:00
    #
    # You must require 'time' to use this method.
    #
    def xmlschema(time)
      if /\A\s*
          (-?\d+)-(\d\d)-(\d\d)
          T
          (\d\d):(\d\d):(\d\d)
          (\.\d+)?
          (Z|[+-]\d\d(?::?\d\d)?)?
          \s*\z/ix =~ time
        year = $1.to_i
        mon = $2.to_i
        day = $3.to_i
        hour = $4.to_i
        min = $5.to_i
        sec = $6.to_i
        usec = 0
        if $7
          usec = Rational($7) * 1000000
        end
        if $8
          zone = $8
          off = zone_offset(zone)
          year, mon, day, hour, min, sec =
            apply_offset(year, mon, day, hour, min, sec, off)
          t = self.utc(year, mon, day, hour, min, sec, usec)
          force_zone!(t, zone, off)
          t
        else
          self.local(year, mon, day, hour, min, sec, usec)
        end
      else
        raise ArgumentError.new("invalid xmlschema format: #{time.inspect}")
      end
    end
    alias iso8601 xmlschema
  end # class << self

  #
  # Returns a string which represents the time as date-time defined by RFC 2822:
  #
  #   day-of-week, DD month-name CCYY hh:mm:ss zone
  #
  # where zone is [+-]hhmm.
  #
  # If +self+ is a UTC time, -0000 is used as zone.
  #
  #     require 'time'
  #
  #     t = Time.now
  #     t.rfc2822  # => "Wed, 05 Oct 2011 22:26:12 -0400"
  #
  # You must require 'time' to use this method.
  #
  def rfc2822
    strftime('%a, %d %b %Y %T ') << (utc? ? '-0000' : strftime('%z'))
  end
  alias rfc822 rfc2822

  #
  # Returns a string which represents the time as RFC 1123 date of HTTP-date
  # defined by RFC 2616:
  #
  #   day-of-week, DD month-name CCYY hh:mm:ss GMT
  #
  # Note that the result is always UTC (GMT).
  #
  #     require 'time'
  #
  #     t = Time.now
  #     t.httpdate # => "Thu, 06 Oct 2011 02:26:12 GMT"
  #
  # You must require 'time' to use this method.
  #
  def httpdate
    getutc.strftime('%a, %d %b %Y %T GMT')
  end

  #
  # Returns a string which represents the time as a dateTime defined by XML
  # Schema:
  #
  #   CCYY-MM-DDThh:mm:ssTZD
  #   CCYY-MM-DDThh:mm:ss.sssTZD
  #
  # where TZD is Z or [+-]hh:mm.
  #
  # If self is a UTC time, Z is used as TZD.  [+-]hh:mm is used otherwise.
  #
  # +fraction_digits+ specifies a number of digits to use for fractional
  # seconds.  Its default value is 0.
  #
  #     require 'time'
  #
  #     t = Time.now
  #     t.iso8601  # => "2011-10-05T22:26:12-04:00"
  #
  # You must require 'time' to use this method.
  #
  def xmlschema(fraction_digits=0)
    fraction_digits = fraction_digits.to_i
    s = strftime("%FT%T")
    if fraction_digits > 0
      s << strftime(".%#{fraction_digits}N")
    end
    s << (utc? ? 'Z' : strftime("%:z"))
  end
  alias iso8601 xmlschema
end

PK}$[��G޺1�1ruby/tempfile.rbnu�[���# frozen_string_literal: true
#
# tempfile - manipulates temporary files
#
# $Id$
#

require 'delegate'
require 'tmpdir'

# A utility class for managing temporary files. When you create a Tempfile
# object, it will create a temporary file with a unique filename. A Tempfile
# objects behaves just like a File object, and you can perform all the usual
# file operations on it: reading data, writing data, changing its permissions,
# etc. So although this class does not explicitly document all instance methods
# supported by File, you can in fact call any File instance method on a
# Tempfile object.
#
# == Synopsis
#
#   require 'tempfile'
#
#   file = Tempfile.new('foo')
#   file.path      # => A unique filename in the OS's temp directory,
#                  #    e.g.: "/tmp/foo.24722.0"
#                  #    This filename contains 'foo' in its basename.
#   file.write("hello world")
#   file.rewind
#   file.read      # => "hello world"
#   file.close
#   file.unlink    # deletes the temp file
#
# == Good practices
#
# === Explicit close
#
# When a Tempfile object is garbage collected, or when the Ruby interpreter
# exits, its associated temporary file is automatically deleted. This means
# that it's unnecessary to explicitly delete a Tempfile after use, though
# it's a good practice to do so: not explicitly deleting unused Tempfiles can
# potentially leave behind a large number of temp files on the filesystem
# until they're garbage collected. The existence of these temp files can make
# it harder to determine a new Tempfile filename.
#
# Therefore, one should always call #unlink or close in an ensure block, like
# this:
#
#   file = Tempfile.new('foo')
#   begin
#      # ...do something with file...
#   ensure
#      file.close
#      file.unlink   # deletes the temp file
#   end
#
# Tempfile.create { ... } exists for this purpose and is more convenient to use.
# Note that Tempfile.create returns a File instance instead of a Tempfile, which
# also avoids the overhead and complications of delegation.
#
#   Tempfile.open('foo') do |file|
#      # ...do something with file...
#   end
#
# === Unlink after creation
#
# On POSIX systems, it's possible to unlink a file right after creating it,
# and before closing it. This removes the filesystem entry without closing
# the file handle, so it ensures that only the processes that already had
# the file handle open can access the file's contents. It's strongly
# recommended that you do this if you do not want any other processes to
# be able to read from or write to the Tempfile, and you do not need to
# know the Tempfile's filename either.
#
# For example, a practical use case for unlink-after-creation would be this:
# you need a large byte buffer that's too large to comfortably fit in RAM,
# e.g. when you're writing a web server and you want to buffer the client's
# file upload data.
#
# Please refer to #unlink for more information and a code example.
#
# == Minor notes
#
# Tempfile's filename picking method is both thread-safe and inter-process-safe:
# it guarantees that no other threads or processes will pick the same filename.
#
# Tempfile itself however may not be entirely thread-safe. If you access the
# same Tempfile object from multiple threads then you should protect it with a
# mutex.
class Tempfile < DelegateClass(File)
  # Creates a temporary file with permissions 0600 (= only readable and
  # writable by the owner) and opens it with mode "w+".
  #
  # It is recommended to use Tempfile.create { ... } instead when possible,
  # because that method avoids the cost of delegation and does not rely on a
  # finalizer to close and unlink the file, which is unreliable.
  #
  # The +basename+ parameter is used to determine the name of the
  # temporary file. You can either pass a String or an Array with
  # 2 String elements. In the former form, the temporary file's base
  # name will begin with the given string. In the latter form,
  # the temporary file's base name will begin with the array's first
  # element, and end with the second element. For example:
  #
  #   file = Tempfile.new('hello')
  #   file.path  # => something like: "/tmp/hello2843-8392-92849382--0"
  #
  #   # Use the Array form to enforce an extension in the filename:
  #   file = Tempfile.new(['hello', '.jpg'])
  #   file.path  # => something like: "/tmp/hello2843-8392-92849382--0.jpg"
  #
  # The temporary file will be placed in the directory as specified
  # by the +tmpdir+ parameter. By default, this is +Dir.tmpdir+.
  #
  #   file = Tempfile.new('hello', '/home/aisaka')
  #   file.path  # => something like: "/home/aisaka/hello2843-8392-92849382--0"
  #
  # You can also pass an options hash. Under the hood, Tempfile creates
  # the temporary file using +File.open+. These options will be passed to
  # +File.open+. This is mostly useful for specifying encoding
  # options, e.g.:
  #
  #   Tempfile.new('hello', '/home/aisaka', encoding: 'ascii-8bit')
  #
  #   # You can also omit the 'tmpdir' parameter:
  #   Tempfile.new('hello', encoding: 'ascii-8bit')
  #
  # Note: +mode+ keyword argument, as accepted by Tempfile, can only be
  # numeric, combination of the modes defined in File::Constants.
  #
  # === Exceptions
  #
  # If Tempfile.new cannot find a unique filename within a limited
  # number of tries, then it will raise an exception.
  def initialize(basename="", tmpdir=nil, mode: 0, **options)
    warn "Tempfile.new doesn't call the given block.", uplevel: 1 if block_given?

    @unlinked = false
    @mode = mode|File::RDWR|File::CREAT|File::EXCL
    ::Dir::Tmpname.create(basename, tmpdir, **options) do |tmpname, n, opts|
      opts[:perm] = 0600
      @tmpfile = File.open(tmpname, @mode, **opts)
      @opts = opts.freeze
    end
    ObjectSpace.define_finalizer(self, Remover.new(@tmpfile))

    super(@tmpfile)
  end

  # Opens or reopens the file with mode "r+".
  def open
    _close
    mode = @mode & ~(File::CREAT|File::EXCL)
    @tmpfile = File.open(@tmpfile.path, mode, **@opts)
    __setobj__(@tmpfile)
  end

  def _close    # :nodoc:
    @tmpfile.close
  end
  protected :_close

  # Closes the file. If +unlink_now+ is true, then the file will be unlinked
  # (deleted) after closing. Of course, you can choose to later call #unlink
  # if you do not unlink it now.
  #
  # If you don't explicitly unlink the temporary file, the removal
  # will be delayed until the object is finalized.
  def close(unlink_now=false)
    _close
    unlink if unlink_now
  end

  # Closes and unlinks (deletes) the file. Has the same effect as called
  # <tt>close(true)</tt>.
  def close!
    close(true)
  end

  # Unlinks (deletes) the file from the filesystem. One should always unlink
  # the file after using it, as is explained in the "Explicit close" good
  # practice section in the Tempfile overview:
  #
  #   file = Tempfile.new('foo')
  #   begin
  #      # ...do something with file...
  #   ensure
  #      file.close
  #      file.unlink   # deletes the temp file
  #   end
  #
  # === Unlink-before-close
  #
  # On POSIX systems it's possible to unlink a file before closing it. This
  # practice is explained in detail in the Tempfile overview (section
  # "Unlink after creation"); please refer there for more information.
  #
  # However, unlink-before-close may not be supported on non-POSIX operating
  # systems. Microsoft Windows is the most notable case: unlinking a non-closed
  # file will result in an error, which this method will silently ignore. If
  # you want to practice unlink-before-close whenever possible, then you should
  # write code like this:
  #
  #   file = Tempfile.new('foo')
  #   file.unlink   # On Windows this silently fails.
  #   begin
  #      # ... do something with file ...
  #   ensure
  #      file.close!   # Closes the file handle. If the file wasn't unlinked
  #                    # because #unlink failed, then this method will attempt
  #                    # to do so again.
  #   end
  def unlink
    return if @unlinked
    begin
      File.unlink(@tmpfile.path)
    rescue Errno::ENOENT
    rescue Errno::EACCES
      # may not be able to unlink on Windows; just ignore
      return
    end
    ObjectSpace.undefine_finalizer(self)
    @unlinked = true
  end
  alias delete unlink

  # Returns the full path name of the temporary file.
  # This will be nil if #unlink has been called.
  def path
    @unlinked ? nil : @tmpfile.path
  end

  # Returns the size of the temporary file.  As a side effect, the IO
  # buffer is flushed before determining the size.
  def size
    if !@tmpfile.closed?
      @tmpfile.size # File#size calls rb_io_flush_raw()
    else
      File.size(@tmpfile.path)
    end
  end
  alias length size

  # :stopdoc:
  def inspect
    if @tmpfile.closed?
      "#<#{self.class}:#{path} (closed)>"
    else
      "#<#{self.class}:#{path}>"
    end
  end

  class Remover # :nodoc:
    def initialize(tmpfile)
      @pid = Process.pid
      @tmpfile = tmpfile
    end

    def call(*args)
      return if @pid != Process.pid

      $stderr.puts "removing #{@tmpfile.path}..." if $DEBUG

      @tmpfile.close
      begin
        File.unlink(@tmpfile.path)
      rescue Errno::ENOENT
      end

      $stderr.puts "done" if $DEBUG
    end
  end

  class << self
    # :startdoc:

    # Creates a new Tempfile.
    #
    # This method is not recommended and exists mostly for backward compatibility.
    # Please use Tempfile.create instead, which avoids the cost of delegation,
    # does not rely on a finalizer, and also unlinks the file when given a block.
    #
    # Tempfile.open is still appropriate if you need the Tempfile to be unlinked
    # by a finalizer and you cannot explicitly know where in the program the
    # Tempfile can be unlinked safely.
    #
    # If no block is given, this is a synonym for Tempfile.new.
    #
    # If a block is given, then a Tempfile object will be constructed,
    # and the block is run with the Tempfile object as argument. The Tempfile
    # object will be automatically closed after the block terminates.
    # However, the file will *not* be unlinked and needs to be manually unlinked
    # with Tempfile#close! or Tempfile#unlink. The finalizer will try to unlink
    # but should not be relied upon as it can keep the file on the disk much
    # longer than intended. For instance, on CRuby, finalizers can be delayed
    # due to conservative stack scanning and references left in unused memory.
    #
    # The call returns the value of the block.
    #
    # In any case, all arguments (<code>*args</code>) will be passed to Tempfile.new.
    #
    #   Tempfile.open('foo', '/home/temp') do |f|
    #      # ... do something with f ...
    #   end
    #
    #   # Equivalent:
    #   f = Tempfile.open('foo', '/home/temp')
    #   begin
    #      # ... do something with f ...
    #   ensure
    #      f.close
    #   end
    def open(*args, **kw)
      tempfile = new(*args, **kw)

      if block_given?
        begin
          yield(tempfile)
        ensure
          tempfile.close
        end
      else
        tempfile
      end
    end
  end
end

# Creates a temporary file as a usual File object (not a Tempfile).
# It does not use finalizer and delegation, which makes it more efficient and reliable.
#
# If no block is given, this is similar to Tempfile.new except
# creating File instead of Tempfile. In that case, the created file is
# not removed automatically. You should use File.unlink to remove it.
#
# If a block is given, then a File object will be constructed,
# and the block is invoked with the object as the argument.
# The File object will be automatically closed and
# the temporary file is removed after the block terminates,
# releasing all resources that the block created.
# The call returns the value of the block.
#
# In any case, all arguments (+basename+, +tmpdir+, +mode+, and
# <code>**options</code>) will be treated the same as for Tempfile.new.
#
#   Tempfile.create('foo', '/home/temp') do |f|
#      # ... do something with f ...
#   end
#
def Tempfile.create(basename="", tmpdir=nil, mode: 0, **options)
  tmpfile = nil
  Dir::Tmpname.create(basename, tmpdir, **options) do |tmpname, n, opts|
    mode |= File::RDWR|File::CREAT|File::EXCL
    opts[:perm] = 0600
    tmpfile = File.open(tmpname, mode, **opts)
  end
  if block_given?
    begin
      yield tmpfile
    ensure
      unless tmpfile.closed?
        if File.identical?(tmpfile, tmpfile.path)
          unlinked = File.unlink tmpfile.path rescue nil
        end
        tmpfile.close
      end
      unless unlinked
        begin
          File.unlink tmpfile.path
        rescue Errno::ENOENT
        end
      end
    end
  else
    tmpfile
  end
end
PK}$[��3��q�qruby/csv.rbnu�[���# encoding: US-ASCII
# frozen_string_literal: true
# = csv.rb -- CSV Reading and Writing
#
# Created by James Edward Gray II on 2005-10-31.
#
# See CSV for documentation.
#
# == Description
#
# Welcome to the new and improved CSV.
#
# This version of the CSV library began its life as FasterCSV. FasterCSV was
# intended as a replacement to Ruby's then standard CSV library. It was
# designed to address concerns users of that library had and it had three
# primary goals:
#
# 1.  Be significantly faster than CSV while remaining a pure Ruby library.
# 2.  Use a smaller and easier to maintain code base. (FasterCSV eventually
#     grew larger, was also but considerably richer in features. The parsing
#     core remains quite small.)
# 3.  Improve on the CSV interface.
#
# Obviously, the last one is subjective. I did try to defer to the original
# interface whenever I didn't have a compelling reason to change it though, so
# hopefully this won't be too radically different.
#
# We must have met our goals because FasterCSV was renamed to CSV and replaced
# the original library as of Ruby 1.9. If you are migrating code from 1.8 or
# earlier, you may have to change your code to comply with the new interface.
#
# == What's the Different From the Old CSV?
#
# I'm sure I'll miss something, but I'll try to mention most of the major
# differences I am aware of, to help others quickly get up to speed:
#
# === \CSV Parsing
#
# * This parser is m17n aware. See CSV for full details.
# * This library has a stricter parser and will throw MalformedCSVErrors on
#   problematic data.
# * This library has a less liberal idea of a line ending than CSV. What you
#   set as the <tt>:row_sep</tt> is law. It can auto-detect your line endings
#   though.
# * The old library returned empty lines as <tt>[nil]</tt>. This library calls
#   them <tt>[]</tt>.
# * This library has a much faster parser.
#
# === Interface
#
# * CSV now uses keyword parameters to set options.
# * CSV no longer has generate_row() or parse_row().
# * The old CSV's Reader and Writer classes have been dropped.
# * CSV::open() is now more like Ruby's open().
# * CSV objects now support most standard IO methods.
# * CSV now has a new() method used to wrap objects like String and IO for
#   reading and writing.
# * CSV::generate() is different from the old method.
# * CSV no longer supports partial reads. It works line-by-line.
# * CSV no longer allows the instance methods to override the separators for
#   performance reasons. They must be set in the constructor.
#
# If you use this library and find yourself missing any functionality I have
# trimmed, please {let me know}[mailto:james@grayproductions.net].
#
# == Documentation
#
# See CSV for documentation.
#
# == What is CSV, really?
#
# CSV maintains a pretty strict definition of CSV taken directly from
# {the RFC}[http://www.ietf.org/rfc/rfc4180.txt]. I relax the rules in only one
# place and that is to make using this library easier. CSV will parse all valid
# CSV.
#
# What you don't want to do is to feed CSV invalid data. Because of the way the
# CSV format works, it's common for a parser to need to read until the end of
# the file to be sure a field is invalid. This consumes a lot of time and memory.
#
# Luckily, when working with invalid CSV, Ruby's built-in methods will almost
# always be superior in every way. For example, parsing non-quoted fields is as
# easy as:
#
#   data.split(",")
#
# == Questions and/or Comments
#
# Feel free to email {James Edward Gray II}[mailto:james@grayproductions.net]
# with any questions.

require "forwardable"
require "date"
require "stringio"

require_relative "csv/fields_converter"
require_relative "csv/input_record_separator"
require_relative "csv/parser"
require_relative "csv/row"
require_relative "csv/table"
require_relative "csv/writer"

# == \CSV
#
# === In a Hurry?
#
# If you are familiar with \CSV data and have a particular task in mind,
# you may want to go directly to the:
# - {Recipes for CSV}[doc/csv/recipes/recipes_rdoc.html].
#
# Otherwise, read on here, about the API: classes, methods, and constants.
#
# === \CSV Data
#
# \CSV (comma-separated values) data is a text representation of a table:
# - A _row_ _separator_ delimits table rows.
#   A common row separator is the newline character <tt>"\n"</tt>.
# - A _column_ _separator_ delimits fields in a row.
#   A common column separator is the comma character <tt>","</tt>.
#
# This \CSV \String, with row separator <tt>"\n"</tt>
# and column separator <tt>","</tt>,
# has three rows and two columns:
#   "foo,0\nbar,1\nbaz,2\n"
#
# Despite the name \CSV, a \CSV representation can use different separators.
#
# For more about tables, see the Wikipedia article
# "{Table (information)}[https://en.wikipedia.org/wiki/Table_(information)]",
# especially its section
# "{Simple table}[https://en.wikipedia.org/wiki/Table_(information)#Simple_table]"
#
# == \Class \CSV
#
# Class \CSV provides methods for:
# - Parsing \CSV data from a \String object, a \File (via its file path), or an \IO object.
# - Generating \CSV data to a \String object.
#
# To make \CSV available:
#   require 'csv'
#
# All examples here assume that this has been done.
#
# == Keeping It Simple
#
# A \CSV object has dozens of instance methods that offer fine-grained control
# of parsing and generating \CSV data.
# For many needs, though, simpler approaches will do.
#
# This section summarizes the singleton methods in \CSV
# that allow you to parse and generate without explicitly
# creating \CSV objects.
# For details, follow the links.
#
# === Simple Parsing
#
# Parsing methods commonly return either of:
# - An \Array of Arrays of Strings:
#   - The outer \Array is the entire "table".
#   - Each inner \Array is a row.
#   - Each \String is a field.
# - A CSV::Table object.  For details, see
#   {\CSV with Headers}[#class-CSV-label-CSV+with+Headers].
#
# ==== Parsing a \String
#
# The input to be parsed can be a string:
#   string = "foo,0\nbar,1\nbaz,2\n"
#
# \Method CSV.parse returns the entire \CSV data:
#   CSV.parse(string) # => [["foo", "0"], ["bar", "1"], ["baz", "2"]]
#
# \Method CSV.parse_line returns only the first row:
#   CSV.parse_line(string) # => ["foo", "0"]
#
# \CSV extends class \String with instance method String#parse_csv,
# which also returns only the first row:
#   string.parse_csv # => ["foo", "0"]
#
# ==== Parsing Via a \File Path
#
# The input to be parsed can be in a file:
#   string = "foo,0\nbar,1\nbaz,2\n"
#   path = 't.csv'
#   File.write(path, string)
#
# \Method CSV.read returns the entire \CSV data:
#  CSV.read(path) # => [["foo", "0"], ["bar", "1"], ["baz", "2"]]
#
# \Method CSV.foreach iterates, passing each row to the given block:
#  CSV.foreach(path) do |row|
#    p row
#  end
# Output:
#   ["foo", "0"]
#   ["bar", "1"]
#   ["baz", "2"]
#
# \Method CSV.table returns the entire \CSV data as a CSV::Table object:
#   CSV.table(path) # => #<CSV::Table mode:col_or_row row_count:3>
#
# ==== Parsing from an Open \IO Stream
#
# The input to be parsed can be in an open \IO stream:
#
# \Method CSV.read returns the entire \CSV data:
#   File.open(path) do |file|
#     CSV.read(file)
#   end # => [["foo", "0"], ["bar", "1"], ["baz", "2"]]
#
# As does method CSV.parse:
#   File.open(path) do |file|
#     CSV.parse(file)
#   end # => [["foo", "0"], ["bar", "1"], ["baz", "2"]]
#
# \Method CSV.parse_line returns only the first row:
#   File.open(path) do |file|
#    CSV.parse_line(file)
#   end # => ["foo", "0"]
#
# \Method CSV.foreach iterates, passing each row to the given block:
#   File.open(path) do |file|
#     CSV.foreach(file) do |row|
#       p row
#     end
#   end
# Output:
#   ["foo", "0"]
#   ["bar", "1"]
#   ["baz", "2"]
#
# \Method CSV.table returns the entire \CSV data as a CSV::Table object:
#   File.open(path) do |file|
#     CSV.table(file)
#   end # => #<CSV::Table mode:col_or_row row_count:3>
#
# === Simple Generating
#
# \Method CSV.generate returns a \String;
# this example uses method CSV#<< to append the rows
# that are to be generated:
#   output_string = CSV.generate do |csv|
#     csv << ['foo', 0]
#     csv << ['bar', 1]
#     csv << ['baz', 2]
#   end
#   output_string # => "foo,0\nbar,1\nbaz,2\n"
#
# \Method CSV.generate_line returns a \String containing the single row
# constructed from an \Array:
#   CSV.generate_line(['foo', '0']) # => "foo,0\n"
#
# \CSV extends class \Array with instance method <tt>Array#to_csv</tt>,
# which forms an \Array into a \String:
#   ['foo', '0'].to_csv # => "foo,0\n"
#
# === "Filtering" \CSV
#
# \Method CSV.filter provides a Unix-style filter for \CSV data.
# The input data is processed to form the output data:
#   in_string = "foo,0\nbar,1\nbaz,2\n"
#   out_string = ''
#   CSV.filter(in_string, out_string) do |row|
#     row[0] = row[0].upcase
#     row[1] *= 4
#   end
#   out_string # => "FOO,0000\nBAR,1111\nBAZ,2222\n"
#
# == \CSV Objects
#
# There are three ways to create a \CSV object:
# - \Method CSV.new returns a new \CSV object.
# - \Method CSV.instance returns a new or cached \CSV object.
# - \Method \CSV() also returns a new or cached \CSV object.
#
# === Instance Methods
#
# \CSV has three groups of instance methods:
# - Its own internally defined instance methods.
# - Methods included by module Enumerable.
# - Methods delegated to class IO. See below.
#
# ==== Delegated Methods
#
# For convenience, a CSV object will delegate to many methods in class IO.
# (A few have wrapper "guard code" in \CSV.) You may call:
# * IO#binmode
# * #binmode?
# * IO#close
# * IO#close_read
# * IO#close_write
# * IO#closed?
# * #eof
# * #eof?
# * IO#external_encoding
# * IO#fcntl
# * IO#fileno
# * #flock
# * IO#flush
# * IO#fsync
# * IO#internal_encoding
# * #ioctl
# * IO#isatty
# * #path
# * IO#pid
# * IO#pos
# * IO#pos=
# * IO#reopen
# * #rewind
# * IO#seek
# * #stat
# * IO#string
# * IO#sync
# * IO#sync=
# * IO#tell
# * #to_i
# * #to_io
# * IO#truncate
# * IO#tty?
#
# === Options
#
# The default values for options are:
#   DEFAULT_OPTIONS = {
#     # For both parsing and generating.
#     col_sep:            ",",
#     row_sep:            :auto,
#     quote_char:         '"',
#     # For parsing.
#     field_size_limit:   nil,
#     converters:         nil,
#     unconverted_fields: nil,
#     headers:            false,
#     return_headers:     false,
#     header_converters:  nil,
#     skip_blanks:        false,
#     skip_lines:         nil,
#     liberal_parsing:    false,
#     nil_value:          nil,
#     empty_value:        "",
#     strip:              false,
#     # For generating.
#     write_headers:      nil,
#     quote_empty:        true,
#     force_quotes:       false,
#     write_converters:   nil,
#     write_nil_value:    nil,
#     write_empty_value:  "",
#   }
#
# ==== Options for Parsing
#
# Options for parsing, described in detail below, include:
# - +row_sep+: Specifies the row separator; used to delimit rows.
# - +col_sep+: Specifies the column separator; used to delimit fields.
# - +quote_char+: Specifies the quote character; used to quote fields.
# - +field_size_limit+: Specifies the maximum field size + 1 allowed.
#   Deprecated since 3.2.3. Use +max_field_size+ instead.
# - +max_field_size+: Specifies the maximum field size allowed.
# - +converters+: Specifies the field converters to be used.
# - +unconverted_fields+: Specifies whether unconverted fields are to be available.
# - +headers+: Specifies whether data contains headers,
#   or specifies the headers themselves.
# - +return_headers+: Specifies whether headers are to be returned.
# - +header_converters+: Specifies the header converters to be used.
# - +skip_blanks+: Specifies whether blanks lines are to be ignored.
# - +skip_lines+: Specifies how comments lines are to be recognized.
# - +strip+: Specifies whether leading and trailing whitespace are to be
#   stripped from fields. This must be compatible with +col_sep+; if it is not,
#   then an +ArgumentError+ exception will be raised.
# - +liberal_parsing+: Specifies whether \CSV should attempt to parse
#   non-compliant data.
# - +nil_value+: Specifies the object that is to be substituted for each null (no-text) field.
# - +empty_value+: Specifies the object that is to be substituted for each empty field.
#
# :include: ../doc/csv/options/common/row_sep.rdoc
#
# :include: ../doc/csv/options/common/col_sep.rdoc
#
# :include: ../doc/csv/options/common/quote_char.rdoc
#
# :include: ../doc/csv/options/parsing/field_size_limit.rdoc
#
# :include: ../doc/csv/options/parsing/converters.rdoc
#
# :include: ../doc/csv/options/parsing/unconverted_fields.rdoc
#
# :include: ../doc/csv/options/parsing/headers.rdoc
#
# :include: ../doc/csv/options/parsing/return_headers.rdoc
#
# :include: ../doc/csv/options/parsing/header_converters.rdoc
#
# :include: ../doc/csv/options/parsing/skip_blanks.rdoc
#
# :include: ../doc/csv/options/parsing/skip_lines.rdoc
#
# :include: ../doc/csv/options/parsing/strip.rdoc
#
# :include: ../doc/csv/options/parsing/liberal_parsing.rdoc
#
# :include: ../doc/csv/options/parsing/nil_value.rdoc
#
# :include: ../doc/csv/options/parsing/empty_value.rdoc
#
# ==== Options for Generating
#
# Options for generating, described in detail below, include:
# - +row_sep+: Specifies the row separator; used to delimit rows.
# - +col_sep+: Specifies the column separator; used to delimit fields.
# - +quote_char+: Specifies the quote character; used to quote fields.
# - +write_headers+: Specifies whether headers are to be written.
# - +force_quotes+: Specifies whether each output field is to be quoted.
# - +quote_empty+: Specifies whether each empty output field is to be quoted.
# - +write_converters+: Specifies the field converters to be used in writing.
# - +write_nil_value+: Specifies the object that is to be substituted for each +nil+-valued field.
# - +write_empty_value+: Specifies the object that is to be substituted for each empty field.
#
# :include: ../doc/csv/options/common/row_sep.rdoc
#
# :include: ../doc/csv/options/common/col_sep.rdoc
#
# :include: ../doc/csv/options/common/quote_char.rdoc
#
# :include: ../doc/csv/options/generating/write_headers.rdoc
#
# :include: ../doc/csv/options/generating/force_quotes.rdoc
#
# :include: ../doc/csv/options/generating/quote_empty.rdoc
#
# :include: ../doc/csv/options/generating/write_converters.rdoc
#
# :include: ../doc/csv/options/generating/write_nil_value.rdoc
#
# :include: ../doc/csv/options/generating/write_empty_value.rdoc
#
# === \CSV with Headers
#
# CSV allows to specify column names of CSV file, whether they are in data, or
# provided separately. If headers are specified, reading methods return an instance
# of CSV::Table, consisting of CSV::Row.
#
#   # Headers are part of data
#   data = CSV.parse(<<~ROWS, headers: true)
#     Name,Department,Salary
#     Bob,Engineering,1000
#     Jane,Sales,2000
#     John,Management,5000
#   ROWS
#
#   data.class      #=> CSV::Table
#   data.first      #=> #<CSV::Row "Name":"Bob" "Department":"Engineering" "Salary":"1000">
#   data.first.to_h #=> {"Name"=>"Bob", "Department"=>"Engineering", "Salary"=>"1000"}
#
#   # Headers provided by developer
#   data = CSV.parse('Bob,Engineering,1000', headers: %i[name department salary])
#   data.first      #=> #<CSV::Row name:"Bob" department:"Engineering" salary:"1000">
#
# === \Converters
#
# By default, each value (field or header) parsed by \CSV is formed into a \String.
# You can use a _field_ _converter_ or  _header_ _converter_
# to intercept and modify the parsed values:
# - See {Field Converters}[#class-CSV-label-Field+Converters].
# - See {Header Converters}[#class-CSV-label-Header+Converters].
#
# Also by default, each value to be written during generation is written 'as-is'.
# You can use a _write_ _converter_ to modify values before writing.
# - See {Write Converters}[#class-CSV-label-Write+Converters].
#
# ==== Specifying \Converters
#
# You can specify converters for parsing or generating in the +options+
# argument to various \CSV methods:
# - Option +converters+ for converting parsed field values.
# - Option +header_converters+ for converting parsed header values.
# - Option +write_converters+ for converting values to be written (generated).
#
# There are three forms for specifying converters:
# - A converter proc: executable code to be used for conversion.
# - A converter name: the name of a stored converter.
# - A converter list: an array of converter procs, converter names, and converter lists.
#
# ===== Converter Procs
#
# This converter proc, +strip_converter+, accepts a value +field+
# and returns <tt>field.strip</tt>:
#   strip_converter = proc {|field| field.strip }
# In this call to <tt>CSV.parse</tt>,
# the keyword argument <tt>converters: string_converter</tt>
# specifies that:
# - \Proc +string_converter+ is to be called for each parsed field.
# - The converter's return value is to replace the +field+ value.
# Example:
#   string = " foo , 0 \n bar , 1 \n baz , 2 \n"
#   array = CSV.parse(string, converters: strip_converter)
#   array # => [["foo", "0"], ["bar", "1"], ["baz", "2"]]
#
# A converter proc can receive a second argument, +field_info+,
# that contains details about the field.
# This modified +strip_converter+ displays its arguments:
#   strip_converter = proc do |field, field_info|
#     p [field, field_info]
#     field.strip
#   end
#   string = " foo , 0 \n bar , 1 \n baz , 2 \n"
#   array = CSV.parse(string, converters: strip_converter)
#   array # => [["foo", "0"], ["bar", "1"], ["baz", "2"]]
# Output:
#  [" foo ", #<struct CSV::FieldInfo index=0, line=1, header=nil>]
#  [" 0 ", #<struct CSV::FieldInfo index=1, line=1, header=nil>]
#  [" bar ", #<struct CSV::FieldInfo index=0, line=2, header=nil>]
#  [" 1 ", #<struct CSV::FieldInfo index=1, line=2, header=nil>]
#  [" baz ", #<struct CSV::FieldInfo index=0, line=3, header=nil>]
#  [" 2 ", #<struct CSV::FieldInfo index=1, line=3, header=nil>]
# Each CSV::FieldInfo object shows:
# - The 0-based field index.
# - The 1-based line index.
# - The field header, if any.
#
# ===== Stored \Converters
#
# A converter may be given a name and stored in a structure where
# the parsing methods can find it by name.
#
# The storage structure for field converters is the \Hash CSV::Converters.
# It has several built-in converter procs:
# - <tt>:integer</tt>: converts each \String-embedded integer into a true \Integer.
# - <tt>:float</tt>: converts each \String-embedded float into a true \Float.
# - <tt>:date</tt>: converts each \String-embedded date into a true \Date.
# - <tt>:date_time</tt>: converts each \String-embedded date-time into a true \DateTime
# .
# This example creates a converter proc, then stores it:
#   strip_converter = proc {|field| field.strip }
#   CSV::Converters[:strip] = strip_converter
# Then the parsing method call can refer to the converter
# by its name, <tt>:strip</tt>:
#   string = " foo , 0 \n bar , 1 \n baz , 2 \n"
#   array = CSV.parse(string, converters: :strip)
#   array # => [["foo", "0"], ["bar", "1"], ["baz", "2"]]
#
# The storage structure for header converters is the \Hash CSV::HeaderConverters,
# which works in the same way.
# It also has built-in converter procs:
# - <tt>:downcase</tt>: Downcases each header.
# - <tt>:symbol</tt>: Converts each header to a \Symbol.
#
# There is no such storage structure for write headers.
#
# In order for the parsing methods to access stored converters in non-main-Ractors, the
# storage structure must be made shareable first.
# Therefore, <tt>Ractor.make_shareable(CSV::Converters)</tt> and
# <tt>Ractor.make_shareable(CSV::HeaderConverters)</tt> must be called before the creation
# of Ractors that use the converters stored in these structures. (Since making the storage
# structures shareable involves freezing them, any custom converters that are to be used
# must be added first.)
#
# ===== Converter Lists
#
# A _converter_ _list_ is an \Array that may include any assortment of:
# - Converter procs.
# - Names of stored converters.
# - Nested converter lists.
#
# Examples:
#   numeric_converters = [:integer, :float]
#   date_converters = [:date, :date_time]
#   [numeric_converters, strip_converter]
#   [strip_converter, date_converters, :float]
#
# Like a converter proc, a converter list may be named and stored in either
# \CSV::Converters or CSV::HeaderConverters:
#   CSV::Converters[:custom] = [strip_converter, date_converters, :float]
#   CSV::HeaderConverters[:custom] = [:downcase, :symbol]
#
# There are two built-in converter lists:
#   CSV::Converters[:numeric] # => [:integer, :float]
#   CSV::Converters[:all] # => [:date_time, :numeric]
#
# ==== Field \Converters
#
# With no conversion, all parsed fields in all rows become Strings:
#   string = "foo,0\nbar,1\nbaz,2\n"
#   ary = CSV.parse(string)
#   ary # => # => [["foo", "0"], ["bar", "1"], ["baz", "2"]]
#
# When you specify a field converter, each parsed field is passed to the converter;
# its return value becomes the stored value for the field.
# A converter might, for example, convert an integer embedded in a \String
# into a true \Integer.
# (In fact, that's what built-in field converter +:integer+ does.)
#
# There are three ways to use field \converters.
#
# - Using option {converters}[#class-CSV-label-Option+converters] with a parsing method:
#     ary = CSV.parse(string, converters: :integer)
#     ary # => [0, 1, 2] # => [["foo", 0], ["bar", 1], ["baz", 2]]
# - Using option {converters}[#class-CSV-label-Option+converters] with a new \CSV instance:
#     csv = CSV.new(string, converters: :integer)
#     # Field converters in effect:
#     csv.converters # => [:integer]
#     csv.read # => [["foo", 0], ["bar", 1], ["baz", 2]]
# - Using method #convert to add a field converter to a \CSV instance:
#     csv = CSV.new(string)
#     # Add a converter.
#     csv.convert(:integer)
#     csv.converters # => [:integer]
#     csv.read # => [["foo", 0], ["bar", 1], ["baz", 2]]
#
# Installing a field converter does not affect already-read rows:
#   csv = CSV.new(string)
#   csv.shift # => ["foo", "0"]
#   # Add a converter.
#   csv.convert(:integer)
#   csv.converters # => [:integer]
#   csv.read # => [["bar", 1], ["baz", 2]]
#
# There are additional built-in \converters, and custom \converters are also supported.
#
# ===== Built-In Field \Converters
#
# The built-in field converters are in \Hash CSV::Converters:
# - Each key is a field converter name.
# - Each value is one of:
#   - A \Proc field converter.
#   - An \Array of field converter names.
#
# Display:
#   CSV::Converters.each_pair do |name, value|
#     if value.kind_of?(Proc)
#       p [name, value.class]
#     else
#       p [name, value]
#     end
#   end
# Output:
#   [:integer, Proc]
#   [:float, Proc]
#   [:numeric, [:integer, :float]]
#   [:date, Proc]
#   [:date_time, Proc]
#   [:all, [:date_time, :numeric]]
#
# Each of these converters transcodes values to UTF-8 before attempting conversion.
# If a value cannot be transcoded to UTF-8 the conversion will
# fail and the value will remain unconverted.
#
# Converter +:integer+ converts each field that Integer() accepts:
#   data = '0,1,2,x'
#   # Without the converter
#   csv = CSV.parse_line(data)
#   csv # => ["0", "1", "2", "x"]
#   # With the converter
#   csv = CSV.parse_line(data, converters: :integer)
#   csv # => [0, 1, 2, "x"]
#
# Converter +:float+ converts each field that Float() accepts:
#   data = '1.0,3.14159,x'
#   # Without the converter
#   csv = CSV.parse_line(data)
#   csv # => ["1.0", "3.14159", "x"]
#   # With the converter
#   csv = CSV.parse_line(data, converters: :float)
#   csv # => [1.0, 3.14159, "x"]
#
# Converter +:numeric+ converts with both +:integer+ and +:float+..
#
# Converter +:date+ converts each field that Date::parse accepts:
#   data = '2001-02-03,x'
#   # Without the converter
#   csv = CSV.parse_line(data)
#   csv # => ["2001-02-03", "x"]
#   # With the converter
#   csv = CSV.parse_line(data, converters: :date)
#   csv # => [#<Date: 2001-02-03 ((2451944j,0s,0n),+0s,2299161j)>, "x"]
#
# Converter +:date_time+ converts each field that DateTime::parse accepts:
#   data = '2020-05-07T14:59:00-05:00,x'
#   # Without the converter
#   csv = CSV.parse_line(data)
#   csv # => ["2020-05-07T14:59:00-05:00", "x"]
#   # With the converter
#   csv = CSV.parse_line(data, converters: :date_time)
#   csv # => [#<DateTime: 2020-05-07T14:59:00-05:00 ((2458977j,71940s,0n),-18000s,2299161j)>, "x"]
#
# Converter +:numeric+ converts with both +:date_time+ and +:numeric+..
#
# As seen above, method #convert adds \converters to a \CSV instance,
# and method #converters returns an \Array of the \converters in effect:
#   csv = CSV.new('0,1,2')
#   csv.converters # => []
#   csv.convert(:integer)
#   csv.converters # => [:integer]
#   csv.convert(:date)
#   csv.converters # => [:integer, :date]
#
# ===== Custom Field \Converters
#
# You can define a custom field converter:
#   strip_converter = proc {|field| field.strip }
#   string = " foo , 0 \n bar , 1 \n baz , 2 \n"
#   array = CSV.parse(string, converters: strip_converter)
#   array # => [["foo", "0"], ["bar", "1"], ["baz", "2"]]
# You can register the converter in \Converters \Hash,
# which allows you to refer to it by name:
#   CSV::Converters[:strip] = strip_converter
#   string = " foo , 0 \n bar , 1 \n baz , 2 \n"
#   array = CSV.parse(string, converters: :strip)
#   array # => [["foo", "0"], ["bar", "1"], ["baz", "2"]]
#
# ==== Header \Converters
#
# Header converters operate only on headers (and not on other rows).
#
# There are three ways to use header \converters;
# these examples use built-in header converter +:downcase+,
# which downcases each parsed header.
#
# - Option +header_converters+ with a singleton parsing method:
#     string = "Name,Count\nFoo,0\n,Bar,1\nBaz,2"
#     tbl = CSV.parse(string, headers: true, header_converters: :downcase)
#     tbl.class # => CSV::Table
#     tbl.headers # => ["name", "count"]
#
# - Option +header_converters+ with a new \CSV instance:
#     csv = CSV.new(string, header_converters: :downcase)
#     # Header converters in effect:
#     csv.header_converters # => [:downcase]
#     tbl = CSV.parse(string, headers: true)
#     tbl.headers # => ["Name", "Count"]
#
# - Method #header_convert adds a header converter to a \CSV instance:
#     csv = CSV.new(string)
#     # Add a header converter.
#     csv.header_convert(:downcase)
#     csv.header_converters # => [:downcase]
#     tbl = CSV.parse(string, headers: true)
#     tbl.headers # => ["Name", "Count"]
#
# ===== Built-In Header \Converters
#
# The built-in header \converters are in \Hash CSV::HeaderConverters.
# The keys there are the names of the \converters:
#   CSV::HeaderConverters.keys # => [:downcase, :symbol]
#
# Converter +:downcase+ converts each header by downcasing it:
#   string = "Name,Count\nFoo,0\n,Bar,1\nBaz,2"
#   tbl = CSV.parse(string, headers: true, header_converters: :downcase)
#   tbl.class # => CSV::Table
#   tbl.headers # => ["name", "count"]
#
# Converter +:symbol+ converts each header by making it into a \Symbol:
#   string = "Name,Count\nFoo,0\n,Bar,1\nBaz,2"
#   tbl = CSV.parse(string, headers: true, header_converters: :symbol)
#   tbl.headers # => [:name, :count]
# Details:
# - Strips leading and trailing whitespace.
# - Downcases the header.
# - Replaces embedded spaces with underscores.
# - Removes non-word characters.
# - Makes the string into a \Symbol.
#
# ===== Custom Header \Converters
#
# You can define a custom header converter:
#   upcase_converter = proc {|header| header.upcase }
#   string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
#   table = CSV.parse(string, headers: true, header_converters: upcase_converter)
#   table # => #<CSV::Table mode:col_or_row row_count:4>
#   table.headers # => ["NAME", "VALUE"]
# You can register the converter in \HeaderConverters \Hash,
# which allows you to refer to it by name:
#   CSV::HeaderConverters[:upcase] = upcase_converter
#   table = CSV.parse(string, headers: true, header_converters: :upcase)
#   table # => #<CSV::Table mode:col_or_row row_count:4>
#   table.headers # => ["NAME", "VALUE"]
#
# ===== Write \Converters
#
# When you specify a write converter for generating \CSV,
# each field to be written is passed to the converter;
# its return value becomes the new value for the field.
# A converter might, for example, strip whitespace from a field.
#
# Using no write converter (all fields unmodified):
#   output_string = CSV.generate do |csv|
#     csv << [' foo ', 0]
#     csv << [' bar ', 1]
#     csv << [' baz ', 2]
#   end
#   output_string # => " foo ,0\n bar ,1\n baz ,2\n"
# Using option +write_converters+ with two custom write converters:
#   strip_converter = proc {|field| field.respond_to?(:strip) ? field.strip : field }
#   upcase_converter = proc {|field| field.respond_to?(:upcase) ? field.upcase : field }
#   write_converters = [strip_converter, upcase_converter]
#   output_string = CSV.generate(write_converters: write_converters) do |csv|
#     csv << [' foo ', 0]
#     csv << [' bar ', 1]
#     csv << [' baz ', 2]
#   end
#   output_string # => "FOO,0\nBAR,1\nBAZ,2\n"
#
# === Character Encodings (M17n or Multilingualization)
#
# This new CSV parser is m17n savvy.  The parser works in the Encoding of the IO
# or String object being read from or written to. Your data is never transcoded
# (unless you ask Ruby to transcode it for you) and will literally be parsed in
# the Encoding it is in. Thus CSV will return Arrays or Rows of Strings in the
# Encoding of your data. This is accomplished by transcoding the parser itself
# into your Encoding.
#
# Some transcoding must take place, of course, to accomplish this multiencoding
# support. For example, <tt>:col_sep</tt>, <tt>:row_sep</tt>, and
# <tt>:quote_char</tt> must be transcoded to match your data.  Hopefully this
# makes the entire process feel transparent, since CSV's defaults should just
# magically work for your data. However, you can set these values manually in
# the target Encoding to avoid the translation.
#
# It's also important to note that while all of CSV's core parser is now
# Encoding agnostic, some features are not. For example, the built-in
# converters will try to transcode data to UTF-8 before making conversions.
# Again, you can provide custom converters that are aware of your Encodings to
# avoid this translation. It's just too hard for me to support native
# conversions in all of Ruby's Encodings.
#
# Anyway, the practical side of this is simple: make sure IO and String objects
# passed into CSV have the proper Encoding set and everything should just work.
# CSV methods that allow you to open IO objects (CSV::foreach(), CSV::open(),
# CSV::read(), and CSV::readlines()) do allow you to specify the Encoding.
#
# One minor exception comes when generating CSV into a String with an Encoding
# that is not ASCII compatible. There's no existing data for CSV to use to
# prepare itself and thus you will probably need to manually specify the desired
# Encoding for most of those cases. It will try to guess using the fields in a
# row of output though, when using CSV::generate_line() or Array#to_csv().
#
# I try to point out any other Encoding issues in the documentation of methods
# as they come up.
#
# This has been tested to the best of my ability with all non-"dummy" Encodings
# Ruby ships with. However, it is brave new code and may have some bugs.
# Please feel free to {report}[mailto:james@grayproductions.net] any issues you
# find with it.
#
class CSV

  # The error thrown when the parser encounters illegal CSV formatting.
  class MalformedCSVError < RuntimeError
    attr_reader :line_number
    alias_method :lineno, :line_number
    def initialize(message, line_number)
      @line_number = line_number
      super("#{message} in line #{line_number}.")
    end
  end

  #
  # A FieldInfo Struct contains details about a field's position in the data
  # source it was read from.  CSV will pass this Struct to some blocks that make
  # decisions based on field structure.  See CSV.convert_fields() for an
  # example.
  #
  # <b><tt>index</tt></b>::  The zero-based index of the field in its row.
  # <b><tt>line</tt></b>::   The line of the data source this row is from.
  # <b><tt>header</tt></b>:: The header for the column, when available.
  # <b><tt>quoted?</tt></b>:: True or false, whether the original value is quoted or not.
  #
  FieldInfo = Struct.new(:index, :line, :header, :quoted?)

  # A Regexp used to find and convert some common Date formats.
  DateMatcher     = / \A(?: (\w+,?\s+)?\w+\s+\d{1,2},?\s+\d{2,4} |
                            \d{4}-\d{2}-\d{2} )\z /x
  # A Regexp used to find and convert some common DateTime formats.
  DateTimeMatcher =
    / \A(?: (\w+,?\s+)?\w+\s+\d{1,2}\s+\d{1,2}:\d{1,2}:\d{1,2},?\s+\d{2,4} |
            # ISO-8601 and RFC-3339 (space instead of T) recognized by DateTime.parse
            \d{4}-\d{2}-\d{2}
              (?:[T\s]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?(?:[+-]\d{2}(?::\d{2})|Z)?)?)?
        )\z /x

  # The encoding used by all converters.
  ConverterEncoding = Encoding.find("UTF-8")

  # A \Hash containing the names and \Procs for the built-in field converters.
  # See {Built-In Field Converters}[#class-CSV-label-Built-In+Field+Converters].
  #
  # This \Hash is intentionally left unfrozen, and may be extended with
  # custom field converters.
  # See {Custom Field Converters}[#class-CSV-label-Custom+Field+Converters].
  Converters  = {
    integer:   lambda { |f|
      Integer(f.encode(ConverterEncoding)) rescue f
    },
    float:     lambda { |f|
      Float(f.encode(ConverterEncoding)) rescue f
    },
    numeric:   [:integer, :float],
    date:      lambda { |f|
      begin
        e = f.encode(ConverterEncoding)
        e.match?(DateMatcher) ? Date.parse(e) : f
      rescue  # encoding conversion or date parse errors
        f
      end
    },
    date_time: lambda { |f|
      begin
        e = f.encode(ConverterEncoding)
        e.match?(DateTimeMatcher) ? DateTime.parse(e) : f
      rescue  # encoding conversion or date parse errors
        f
      end
    },
    all:       [:date_time, :numeric],
  }

  # A \Hash containing the names and \Procs for the built-in header converters.
  # See {Built-In Header Converters}[#class-CSV-label-Built-In+Header+Converters].
  #
  # This \Hash is intentionally left unfrozen, and may be extended with
  # custom field converters.
  # See {Custom Header Converters}[#class-CSV-label-Custom+Header+Converters].
  HeaderConverters = {
    downcase: lambda { |h| h.encode(ConverterEncoding).downcase },
    symbol:   lambda { |h|
      h.encode(ConverterEncoding).downcase.gsub(/[^\s\w]+/, "").strip.
                                           gsub(/\s+/, "_").to_sym
    },
    symbol_raw: lambda { |h| h.encode(ConverterEncoding).to_sym }
  }

  # Default values for method options.
  DEFAULT_OPTIONS = {
    # For both parsing and generating.
    col_sep:            ",",
    row_sep:            :auto,
    quote_char:         '"',
    # For parsing.
    field_size_limit:   nil,
    max_field_size:     nil,
    converters:         nil,
    unconverted_fields: nil,
    headers:            false,
    return_headers:     false,
    header_converters:  nil,
    skip_blanks:        false,
    skip_lines:         nil,
    liberal_parsing:    false,
    nil_value:          nil,
    empty_value:        "",
    strip:              false,
    # For generating.
    write_headers:      nil,
    quote_empty:        true,
    force_quotes:       false,
    write_converters:   nil,
    write_nil_value:    nil,
    write_empty_value:  "",
  }.freeze

  class << self
    # :call-seq:
    #   instance(string, **options)
    #   instance(io = $stdout, **options)
    #   instance(string, **options) {|csv| ... }
    #   instance(io = $stdout, **options) {|csv| ... }
    #
    # Creates or retrieves cached \CSV objects.
    # For arguments and options, see CSV.new.
    #
    # This API is not Ractor-safe.
    #
    # ---
    #
    # With no block given, returns a \CSV object.
    #
    # The first call to +instance+ creates and caches a \CSV object:
    #   s0 = 's0'
    #   csv0 = CSV.instance(s0)
    #   csv0.class # => CSV
    #
    # Subsequent calls to +instance+ with that _same_ +string+ or +io+
    # retrieve that same cached object:
    #   csv1 = CSV.instance(s0)
    #   csv1.class # => CSV
    #   csv1.equal?(csv0) # => true # Same CSV object
    #
    # A subsequent call to +instance+ with a _different_ +string+ or +io+
    # creates and caches a _different_ \CSV object.
    #   s1 = 's1'
    #   csv2 = CSV.instance(s1)
    #   csv2.equal?(csv0) # => false # Different CSV object
    #
    # All the cached objects remains available:
    #   csv3 = CSV.instance(s0)
    #   csv3.equal?(csv0) # true # Same CSV object
    #   csv4 = CSV.instance(s1)
    #   csv4.equal?(csv2) # true # Same CSV object
    #
    # ---
    #
    # When a block is given, calls the block with the created or retrieved
    # \CSV object; returns the block's return value:
    #   CSV.instance(s0) {|csv| :foo } # => :foo
    def instance(data = $stdout, **options)
      # create a _signature_ for this method call, data object and options
      sig = [data.object_id] +
            options.values_at(*DEFAULT_OPTIONS.keys.sort_by { |sym| sym.to_s })

      # fetch or create the instance for this signature
      @@instances ||= Hash.new
      instance = (@@instances[sig] ||= new(data, **options))

      if block_given?
        yield instance  # run block, if given, returning result
      else
        instance        # or return the instance
      end
    end

    # :call-seq:
    #   filter(in_string_or_io, **options) {|row| ... } -> array_of_arrays or csv_table
    #   filter(in_string_or_io, out_string_or_io, **options) {|row| ... } -> array_of_arrays or csv_table
    #   filter(**options) {|row| ... } -> array_of_arrays or csv_table
    #
    # - Parses \CSV from a source (\String, \IO stream, or ARGF).
    # - Calls the given block with each parsed row:
    #   - Without headers, each row is an \Array.
    #   - With headers, each row is a CSV::Row.
    # - Generates \CSV to an output (\String, \IO stream, or STDOUT).
    # - Returns the parsed source:
    #   - Without headers, an \Array of \Arrays.
    #   - With headers, a CSV::Table.
    #
    # When +in_string_or_io+ is given, but not +out_string_or_io+,
    # parses from the given +in_string_or_io+
    # and generates to STDOUT.
    #
    # \String input without headers:
    #
    #   in_string = "foo,0\nbar,1\nbaz,2"
    #   CSV.filter(in_string) do |row|
    #     row[0].upcase!
    #     row[1] = - row[1].to_i
    #   end # => [["FOO", 0], ["BAR", -1], ["BAZ", -2]]
    #
    # Output (to STDOUT):
    #
    #   FOO,0
    #   BAR,-1
    #   BAZ,-2
    #
    # \String input with headers:
    #
    #   in_string = "Name,Value\nfoo,0\nbar,1\nbaz,2"
    #   CSV.filter(in_string, headers: true) do |row|
    #     row[0].upcase!
    #     row[1] = - row[1].to_i
    #   end # => #<CSV::Table mode:col_or_row row_count:4>
    #
    # Output (to STDOUT):
    #
    #   Name,Value
    #   FOO,0
    #   BAR,-1
    #   BAZ,-2
    #
    # \IO stream input without headers:
    #
    #   File.write('t.csv', "foo,0\nbar,1\nbaz,2")
    #   File.open('t.csv') do |in_io|
    #     CSV.filter(in_io) do |row|
    #       row[0].upcase!
    #       row[1] = - row[1].to_i
    #     end
    #   end # => [["FOO", 0], ["BAR", -1], ["BAZ", -2]]
    #
    # Output (to STDOUT):
    #
    #   FOO,0
    #   BAR,-1
    #   BAZ,-2
    #
    # \IO stream input with headers:
    #
    #   File.write('t.csv', "Name,Value\nfoo,0\nbar,1\nbaz,2")
    #   File.open('t.csv') do |in_io|
    #     CSV.filter(in_io, headers: true) do |row|
    #       row[0].upcase!
    #       row[1] = - row[1].to_i
    #     end
    #   end # => #<CSV::Table mode:col_or_row row_count:4>
    #
    # Output (to STDOUT):
    #
    #   Name,Value
    #   FOO,0
    #   BAR,-1
    #   BAZ,-2
    #
    # When both +in_string_or_io+ and +out_string_or_io+ are given,
    # parses from +in_string_or_io+ and generates to +out_string_or_io+.
    #
    # \String output without headers:
    #
    #   in_string = "foo,0\nbar,1\nbaz,2"
    #   out_string = ''
    #   CSV.filter(in_string, out_string) do |row|
    #     row[0].upcase!
    #     row[1] = - row[1].to_i
    #   end # => [["FOO", 0], ["BAR", -1], ["BAZ", -2]]
    #   out_string # => "FOO,0\nBAR,-1\nBAZ,-2\n"
    #
    # \String output with headers:
    #
    #   in_string = "Name,Value\nfoo,0\nbar,1\nbaz,2"
    #   out_string = ''
    #   CSV.filter(in_string, out_string, headers: true) do |row|
    #     row[0].upcase!
    #     row[1] = - row[1].to_i
    #   end # => #<CSV::Table mode:col_or_row row_count:4>
    #   out_string # => "Name,Value\nFOO,0\nBAR,-1\nBAZ,-2\n"
    #
    # \IO stream output without headers:
    #
    #   in_string = "foo,0\nbar,1\nbaz,2"
    #   File.open('t.csv', 'w') do |out_io|
    #     CSV.filter(in_string, out_io) do |row|
    #       row[0].upcase!
    #       row[1] = - row[1].to_i
    #     end
    #   end # => [["FOO", 0], ["BAR", -1], ["BAZ", -2]]
    #   File.read('t.csv') # => "FOO,0\nBAR,-1\nBAZ,-2\n"
    #
    # \IO stream output with headers:
    #
    #   in_string = "Name,Value\nfoo,0\nbar,1\nbaz,2"
    #   File.open('t.csv', 'w') do |out_io|
    #     CSV.filter(in_string, out_io, headers: true) do |row|
    #       row[0].upcase!
    #       row[1] = - row[1].to_i
    #     end
    #   end # => #<CSV::Table mode:col_or_row row_count:4>
    #   File.read('t.csv') # => "Name,Value\nFOO,0\nBAR,-1\nBAZ,-2\n"
    #
    # When neither +in_string_or_io+ nor +out_string_or_io+ given,
    # parses from {ARGF}[https://docs.ruby-lang.org/en/master/ARGF.html]
    # and generates to STDOUT.
    #
    # Without headers:
    #
    #   # Put Ruby code into a file.
    #   ruby = <<-EOT
    #     require 'csv'
    #     CSV.filter do |row|
    #       row[0].upcase!
    #       row[1] = - row[1].to_i
    #     end
    #   EOT
    #   File.write('t.rb', ruby)
    #   # Put some CSV into a file.
    #   File.write('t.csv', "foo,0\nbar,1\nbaz,2")
    #   # Run the Ruby code with CSV filename as argument.
    #   system(Gem.ruby, "t.rb", "t.csv")
    #
    # Output (to STDOUT):
    #
    #   FOO,0
    #   BAR,-1
    #   BAZ,-2
    #
    # With headers:
    #
    #   # Put Ruby code into a file.
    #   ruby = <<-EOT
    #     require 'csv'
    #     CSV.filter(headers: true) do |row|
    #       row[0].upcase!
    #       row[1] = - row[1].to_i
    #     end
    #   EOT
    #   File.write('t.rb', ruby)
    #   # Put some CSV into a file.
    #   File.write('t.csv', "Name,Value\nfoo,0\nbar,1\nbaz,2")
    #   # Run the Ruby code with CSV filename as argument.
    #   system(Gem.ruby, "t.rb", "t.csv")
    #
    # Output (to STDOUT):
    #
    #   Name,Value
    #   FOO,0
    #   BAR,-1
    #   BAZ,-2
    #
    # Arguments:
    #
    # * Argument +in_string_or_io+ must be a \String or an \IO stream.
    # * Argument +out_string_or_io+ must be a \String or an \IO stream.
    # * Arguments <tt>**options</tt> must be keyword options.
    #   See {Options for Parsing}[#class-CSV-label-Options+for+Parsing].
    def filter(input=nil, output=nil, **options)
      # parse options for input, output, or both
      in_options, out_options = Hash.new, {row_sep: InputRecordSeparator.value}
      options.each do |key, value|
        case key.to_s
        when /\Ain(?:put)?_(.+)\Z/
          in_options[$1.to_sym] = value
        when /\Aout(?:put)?_(.+)\Z/
          out_options[$1.to_sym] = value
        else
          in_options[key]  = value
          out_options[key] = value
        end
      end

      # build input and output wrappers
      input  = new(input  || ARGF, **in_options)
      output = new(output || $stdout, **out_options)

      # process headers
      need_manual_header_output =
        (in_options[:headers] and
         out_options[:headers] == true and
         out_options[:write_headers])
      if need_manual_header_output
        first_row = input.shift
        if first_row
          if first_row.is_a?(Row)
            headers = first_row.headers
            yield headers
            output << headers
          end
          yield first_row
          output << first_row
        end
      end

      # read, yield, write
      input.each do |row|
        yield row
        output << row
      end
    end

    #
    # :call-seq:
    #   foreach(path_or_io, mode='r', **options) {|row| ... )
    #   foreach(path_or_io, mode='r', **options) -> new_enumerator
    #
    # Calls the block with each row read from source +path_or_io+.
    #
    # \Path input without headers:
    #
    #   string = "foo,0\nbar,1\nbaz,2\n"
    #   in_path = 't.csv'
    #   File.write(in_path, string)
    #   CSV.foreach(in_path) {|row| p row }
    #
    # Output:
    #
    #   ["foo", "0"]
    #   ["bar", "1"]
    #   ["baz", "2"]
    #
    # \Path input with headers:
    #
    #   string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   in_path = 't.csv'
    #   File.write(in_path, string)
    #   CSV.foreach(in_path, headers: true) {|row| p row }
    #
    # Output:
    #
    #   <CSV::Row "Name":"foo" "Value":"0">
    #   <CSV::Row "Name":"bar" "Value":"1">
    #   <CSV::Row "Name":"baz" "Value":"2">
    #
    # \IO stream input without headers:
    #
    #   string = "foo,0\nbar,1\nbaz,2\n"
    #   path = 't.csv'
    #   File.write(path, string)
    #   File.open('t.csv') do |in_io|
    #     CSV.foreach(in_io) {|row| p row }
    #   end
    #
    # Output:
    #
    #   ["foo", "0"]
    #   ["bar", "1"]
    #   ["baz", "2"]
    #
    # \IO stream input with headers:
    #
    #   string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   path = 't.csv'
    #   File.write(path, string)
    #   File.open('t.csv') do |in_io|
    #     CSV.foreach(in_io, headers: true) {|row| p row }
    #   end
    #
    # Output:
    #
    #   <CSV::Row "Name":"foo" "Value":"0">
    #   <CSV::Row "Name":"bar" "Value":"1">
    #   <CSV::Row "Name":"baz" "Value":"2">
    #
    # With no block given, returns an \Enumerator:
    #
    #   string = "foo,0\nbar,1\nbaz,2\n"
    #   path = 't.csv'
    #   File.write(path, string)
    #   CSV.foreach(path) # => #<Enumerator: CSV:foreach("t.csv", "r")>
    #
    # Arguments:
    # * Argument +path_or_io+ must be a file path or an \IO stream.
    # * Argument +mode+, if given, must be a \File mode
    #   See {Open Mode}[https://ruby-doc.org/core/IO.html#method-c-new-label-Open+Mode].
    # * Arguments <tt>**options</tt> must be keyword options.
    #   See {Options for Parsing}[#class-CSV-label-Options+for+Parsing].
    # * This method optionally accepts an additional <tt>:encoding</tt> option
    #   that you can use to specify the Encoding of the data read from +path+ or +io+.
    #   You must provide this unless your data is in the encoding
    #   given by <tt>Encoding::default_external</tt>.
    #   Parsing will use this to determine how to parse the data.
    #   You may provide a second Encoding to
    #   have the data transcoded as it is read. For example,
    #     encoding: 'UTF-32BE:UTF-8'
    #   would read +UTF-32BE+ data from the file
    #   but transcode it to +UTF-8+ before parsing.
    def foreach(path, mode="r", **options, &block)
      return to_enum(__method__, path, mode, **options) unless block_given?
      open(path, mode, **options) do |csv|
        csv.each(&block)
      end
    end

    #
    # :call-seq:
    #   generate(csv_string, **options) {|csv| ... }
    #   generate(**options) {|csv| ... }
    #
    # * Argument +csv_string+, if given, must be a \String object;
    #   defaults to a new empty \String.
    # * Arguments +options+, if given, should be generating options.
    #   See {Options for Generating}[#class-CSV-label-Options+for+Generating].
    #
    # ---
    #
    # Creates a new \CSV object via <tt>CSV.new(csv_string, **options)</tt>;
    # calls the block with the \CSV object, which the block may modify;
    # returns the \String generated from the \CSV object.
    #
    # Note that a passed \String *is* modified by this method.
    # Pass <tt>csv_string</tt>.dup if the \String must be preserved.
    #
    # This method has one additional option: <tt>:encoding</tt>,
    # which sets the base Encoding for the output if no no +str+ is specified.
    # CSV needs this hint if you plan to output non-ASCII compatible data.
    #
    # ---
    #
    # Add lines:
    #   input_string = "foo,0\nbar,1\nbaz,2\n"
    #   output_string = CSV.generate(input_string) do |csv|
    #     csv << ['bat', 3]
    #     csv << ['bam', 4]
    #   end
    #   output_string # => "foo,0\nbar,1\nbaz,2\nbat,3\nbam,4\n"
    #   input_string # => "foo,0\nbar,1\nbaz,2\nbat,3\nbam,4\n"
    #   output_string.equal?(input_string) # => true # Same string, modified
    #
    # Add lines into new string, preserving old string:
    #   input_string = "foo,0\nbar,1\nbaz,2\n"
    #   output_string = CSV.generate(input_string.dup) do |csv|
    #     csv << ['bat', 3]
    #     csv << ['bam', 4]
    #   end
    #   output_string # => "foo,0\nbar,1\nbaz,2\nbat,3\nbam,4\n"
    #   input_string # => "foo,0\nbar,1\nbaz,2\n"
    #   output_string.equal?(input_string) # => false # Different strings
    #
    # Create lines from nothing:
    #   output_string = CSV.generate do |csv|
    #     csv << ['foo', 0]
    #     csv << ['bar', 1]
    #     csv << ['baz', 2]
    #   end
    #   output_string # => "foo,0\nbar,1\nbaz,2\n"
    #
    # ---
    #
    # Raises an exception if +csv_string+ is not a \String object:
    #   # Raises TypeError (no implicit conversion of Integer into String)
    #   CSV.generate(0)
    #
    def generate(str=nil, **options)
      encoding = options[:encoding]
      # add a default empty String, if none was given
      if str
        str = StringIO.new(str)
        str.seek(0, IO::SEEK_END)
        str.set_encoding(encoding) if encoding
      else
        str = +""
        str.force_encoding(encoding) if encoding
      end
      csv = new(str, **options) # wrap
      yield csv         # yield for appending
      csv.string        # return final String
    end

    # :call-seq:
    #   CSV.generate_line(ary)
    #   CSV.generate_line(ary, **options)
    #
    # Returns the \String created by generating \CSV from +ary+
    # using the specified +options+.
    #
    # Argument +ary+ must be an \Array.
    #
    # Special options:
    # * Option <tt>:row_sep</tt> defaults to <tt>"\n"> on Ruby 3.0 or later
    #   and <tt>$INPUT_RECORD_SEPARATOR</tt> (<tt>$/</tt>) otherwise.:
    #     $INPUT_RECORD_SEPARATOR # => "\n"
    # * This method accepts an additional option, <tt>:encoding</tt>, which sets the base
    #   Encoding for the output. This method will try to guess your Encoding from
    #   the first non-+nil+ field in +row+, if possible, but you may need to use
    #   this parameter as a backup plan.
    #
    # For other +options+,
    # see {Options for Generating}[#class-CSV-label-Options+for+Generating].
    #
    # ---
    #
    # Returns the \String generated from an \Array:
    #   CSV.generate_line(['foo', '0']) # => "foo,0\n"
    #
    # ---
    #
    # Raises an exception if +ary+ is not an \Array:
    #   # Raises NoMethodError (undefined method `find' for :foo:Symbol)
    #   CSV.generate_line(:foo)
    #
    def generate_line(row, **options)
      options = {row_sep: InputRecordSeparator.value}.merge(options)
      str = +""
      if options[:encoding]
        str.force_encoding(options[:encoding])
      else
        fallback_encoding = nil
        output_encoding = nil
        row.each do |field|
          next unless field.is_a?(String)
          fallback_encoding ||= field.encoding
          next if field.ascii_only?
          output_encoding = field.encoding
          break
        end
        output_encoding ||= fallback_encoding
        if output_encoding
          str.force_encoding(output_encoding)
        end
      end
      (new(str, **options) << row).string
    end

    # :call-seq:
    #   CSV.generate_lines(rows)
    #   CSV.generate_lines(rows, **options)
    #
    # Returns the \String created by generating \CSV from
    # using the specified +options+.
    #
    # Argument +rows+ must be an \Array of row. Row is \Array of \String or \CSV::Row.
    #
    # Special options:
    # * Option <tt>:row_sep</tt> defaults to <tt>"\n"</tt> on Ruby 3.0 or later
    #   and <tt>$INPUT_RECORD_SEPARATOR</tt> (<tt>$/</tt>) otherwise.:
    #     $INPUT_RECORD_SEPARATOR # => "\n"
    # * This method accepts an additional option, <tt>:encoding</tt>, which sets the base
    #   Encoding for the output. This method will try to guess your Encoding from
    #   the first non-+nil+ field in +row+, if possible, but you may need to use
    #   this parameter as a backup plan.
    #
    # For other +options+,
    # see {Options for Generating}[#class-CSV-label-Options+for+Generating].
    #
    # ---
    #
    # Returns the \String generated from an
    #   CSV.generate_lines(['foo', '0'], ['bar', '1'], ['baz', '2']) # => "foo,0\nbar,1\nbaz.2\n"
    #
    # ---
    #
    # Raises an exception
    #   # Raises NoMethodError (undefined method `find' for :foo:Symbol)
    #   CSV.generate_lines(:foo)
    #
    def generate_lines(rows, **options)
      self.generate(**options) do |csv|
        rows.each do |row|
          csv << row
        end
      end
    end

    #
    # :call-seq:
    #   open(file_path, mode = "rb", **options ) -> new_csv
    #   open(io, mode = "rb", **options ) -> new_csv
    #   open(file_path, mode = "rb", **options ) { |csv| ... } -> object
    #   open(io, mode = "rb", **options ) { |csv| ... } -> object
    #
    # possible options elements:
    #   keyword form:
    #     :invalid => nil      # raise error on invalid byte sequence (default)
    #     :invalid => :replace # replace invalid byte sequence
    #     :undef => :replace   # replace undefined conversion
    #     :replace => string   # replacement string ("?" or "\uFFFD" if not specified)
    #
    # * Argument +path+, if given, must be the path to a file.
    # :include: ../doc/csv/arguments/io.rdoc
    # * Argument +mode+, if given, must be a \File mode
    #   See {Open Mode}[IO.html#method-c-new-label-Open+Mode].
    # * Arguments <tt>**options</tt> must be keyword options.
    #   See {Options for Generating}[#class-CSV-label-Options+for+Generating].
    # * This method optionally accepts an additional <tt>:encoding</tt> option
    #   that you can use to specify the Encoding of the data read from +path+ or +io+.
    #   You must provide this unless your data is in the encoding
    #   given by <tt>Encoding::default_external</tt>.
    #   Parsing will use this to determine how to parse the data.
    #   You may provide a second Encoding to
    #   have the data transcoded as it is read. For example,
    #     encoding: 'UTF-32BE:UTF-8'
    #   would read +UTF-32BE+ data from the file
    #   but transcode it to +UTF-8+ before parsing.
    #
    # ---
    #
    # These examples assume prior execution of:
    #   string = "foo,0\nbar,1\nbaz,2\n"
    #   path = 't.csv'
    #   File.write(path, string)
    #
    # ---
    #
    # With no block given, returns a new \CSV object.
    #
    # Create a \CSV object using a file path:
    #   csv = CSV.open(path)
    #   csv # => #<CSV io_type:File io_path:"t.csv" encoding:UTF-8 lineno:0 col_sep:"," row_sep:"\n" quote_char:"\"">
    #
    # Create a \CSV object using an open \File:
    #   csv = CSV.open(File.open(path))
    #   csv # => #<CSV io_type:File io_path:"t.csv" encoding:UTF-8 lineno:0 col_sep:"," row_sep:"\n" quote_char:"\"">
    #
    # ---
    #
    # With a block given, calls the block with the created \CSV object;
    # returns the block's return value:
    #
    # Using a file path:
    #   csv = CSV.open(path) {|csv| p csv}
    #   csv # => #<CSV io_type:File io_path:"t.csv" encoding:UTF-8 lineno:0 col_sep:"," row_sep:"\n" quote_char:"\"">
    # Output:
    #   #<CSV io_type:File io_path:"t.csv" encoding:UTF-8 lineno:0 col_sep:"," row_sep:"\n" quote_char:"\"">
    #
    # Using an open \File:
    #   csv = CSV.open(File.open(path)) {|csv| p csv}
    #   csv # => #<CSV io_type:File io_path:"t.csv" encoding:UTF-8 lineno:0 col_sep:"," row_sep:"\n" quote_char:"\"">
    # Output:
    #   #<CSV io_type:File io_path:"t.csv" encoding:UTF-8 lineno:0 col_sep:"," row_sep:"\n" quote_char:"\"">
    #
    # ---
    #
    # Raises an exception if the argument is not a \String object or \IO object:
    #   # Raises TypeError (no implicit conversion of Symbol into String)
    #   CSV.open(:foo)
    def open(filename, mode="r", **options)
      # wrap a File opened with the remaining +args+ with no newline
      # decorator
      file_opts = options.dup
      unless file_opts.key?(:newline)
        file_opts[:universal_newline] ||= false
      end
      options.delete(:invalid)
      options.delete(:undef)
      options.delete(:replace)
      options.delete_if {|k, _| /newline\z/.match?(k)}

      begin
        f = File.open(filename, mode, **file_opts)
      rescue ArgumentError => e
        raise unless /needs binmode/.match?(e.message) and mode == "r"
        mode = "rb"
        file_opts = {encoding: Encoding.default_external}.merge(file_opts)
        retry
      end
      begin
        csv = new(f, **options)
      rescue Exception
        f.close
        raise
      end

      # handle blocks like Ruby's open(), not like the CSV library
      if block_given?
        begin
          yield csv
        ensure
          csv.close
        end
      else
        csv
      end
    end

    #
    # :call-seq:
    #   parse(string) -> array_of_arrays
    #   parse(io) -> array_of_arrays
    #   parse(string, headers: ..., **options) -> csv_table
    #   parse(io, headers: ..., **options) -> csv_table
    #   parse(string, **options) {|row| ... }
    #   parse(io, **options) {|row| ... }
    #
    # Parses +string+ or +io+ using the specified +options+.
    #
    # - Argument +string+ should be a \String object;
    #   it will be put into a new StringIO object positioned at the beginning.
    # :include: ../doc/csv/arguments/io.rdoc
    # - Argument +options+: see {Options for Parsing}[#class-CSV-label-Options+for+Parsing]
    #
    # ====== Without Option +headers+
    #
    # Without {option +headers+}[#class-CSV-label-Option+headers] case.
    #
    # These examples assume prior execution of:
    #   string = "foo,0\nbar,1\nbaz,2\n"
    #   path = 't.csv'
    #   File.write(path, string)
    #
    # ---
    #
    # With no block given, returns an \Array of Arrays formed from the source.
    #
    # Parse a \String:
    #   a_of_a = CSV.parse(string)
    #   a_of_a # => [["foo", "0"], ["bar", "1"], ["baz", "2"]]
    #
    # Parse an open \File:
    #   a_of_a = File.open(path) do |file|
    #     CSV.parse(file)
    #   end
    #   a_of_a # => [["foo", "0"], ["bar", "1"], ["baz", "2"]]
    #
    # ---
    #
    # With a block given, calls the block with each parsed row:
    #
    # Parse a \String:
    #   CSV.parse(string) {|row| p row }
    #
    # Output:
    #   ["foo", "0"]
    #   ["bar", "1"]
    #   ["baz", "2"]
    #
    # Parse an open \File:
    #   File.open(path) do |file|
    #     CSV.parse(file) {|row| p row }
    #   end
    #
    # Output:
    #   ["foo", "0"]
    #   ["bar", "1"]
    #   ["baz", "2"]
    #
    # ====== With Option +headers+
    #
    # With {option +headers+}[#class-CSV-label-Option+headers] case.
    #
    # These examples assume prior execution of:
    #   string = "Name,Count\nfoo,0\nbar,1\nbaz,2\n"
    #   path = 't.csv'
    #   File.write(path, string)
    #
    # ---
    #
    # With no block given, returns a CSV::Table object formed from the source.
    #
    # Parse a \String:
    #   csv_table = CSV.parse(string, headers: ['Name', 'Count'])
    #   csv_table # => #<CSV::Table mode:col_or_row row_count:5>
    #
    # Parse an open \File:
    #   csv_table = File.open(path) do |file|
    #     CSV.parse(file, headers: ['Name', 'Count'])
    #   end
    #   csv_table # => #<CSV::Table mode:col_or_row row_count:4>
    #
    # ---
    #
    # With a block given, calls the block with each parsed row,
    # which has been formed into a CSV::Row object:
    #
    # Parse a \String:
    #   CSV.parse(string, headers: ['Name', 'Count']) {|row| p row }
    #
    # Output:
    #   # <CSV::Row "Name":"foo" "Count":"0">
    #   # <CSV::Row "Name":"bar" "Count":"1">
    #   # <CSV::Row "Name":"baz" "Count":"2">
    #
    # Parse an open \File:
    #   File.open(path) do |file|
    #     CSV.parse(file, headers: ['Name', 'Count']) {|row| p row }
    #   end
    #
    # Output:
    #   # <CSV::Row "Name":"foo" "Count":"0">
    #   # <CSV::Row "Name":"bar" "Count":"1">
    #   # <CSV::Row "Name":"baz" "Count":"2">
    #
    # ---
    #
    # Raises an exception if the argument is not a \String object or \IO object:
    #   # Raises NoMethodError (undefined method `close' for :foo:Symbol)
    #   CSV.parse(:foo)
    def parse(str, **options, &block)
      csv = new(str, **options)

      return csv.each(&block) if block_given?

      # slurp contents, if no block is given
      begin
        csv.read
      ensure
        csv.close
      end
    end

    # :call-seq:
    #   CSV.parse_line(string) -> new_array or nil
    #   CSV.parse_line(io) -> new_array or nil
    #   CSV.parse_line(string, **options) -> new_array or nil
    #   CSV.parse_line(io, **options) -> new_array or nil
    #   CSV.parse_line(string, headers: true, **options) -> csv_row or nil
    #   CSV.parse_line(io, headers: true, **options) -> csv_row or nil
    #
    # Returns the data created by parsing the first line of +string+ or +io+
    # using the specified +options+.
    #
    # - Argument +string+ should be a \String object;
    #   it will be put into a new StringIO object positioned at the beginning.
    # :include: ../doc/csv/arguments/io.rdoc
    # - Argument +options+: see {Options for Parsing}[#class-CSV-label-Options+for+Parsing]
    #
    # ====== Without Option +headers+
    #
    # Without option +headers+, returns the first row as a new \Array.
    #
    # These examples assume prior execution of:
    #   string = "foo,0\nbar,1\nbaz,2\n"
    #   path = 't.csv'
    #   File.write(path, string)
    #
    # Parse the first line from a \String object:
    #   CSV.parse_line(string) # => ["foo", "0"]
    #
    # Parse the first line from a File object:
    #   File.open(path) do |file|
    #     CSV.parse_line(file) # => ["foo", "0"]
    #   end # => ["foo", "0"]
    #
    # Returns +nil+ if the argument is an empty \String:
    #   CSV.parse_line('') # => nil
    #
    # ====== With Option +headers+
    #
    # With {option +headers+}[#class-CSV-label-Option+headers],
    # returns the first row as a CSV::Row object.
    #
    # These examples assume prior execution of:
    #   string = "Name,Count\nfoo,0\nbar,1\nbaz,2\n"
    #   path = 't.csv'
    #   File.write(path, string)
    #
    # Parse the first line from a \String object:
    #   CSV.parse_line(string, headers: true) # => #<CSV::Row "Name":"foo" "Count":"0">
    #
    # Parse the first line from a File object:
    #   File.open(path) do |file|
    #     CSV.parse_line(file, headers: true)
    #   end # => #<CSV::Row "Name":"foo" "Count":"0">
    #
    # ---
    #
    # Raises an exception if the argument is +nil+:
    #   # Raises ArgumentError (Cannot parse nil as CSV):
    #   CSV.parse_line(nil)
    #
    def parse_line(line, **options)
      new(line, **options).each.first
    end

    #
    # :call-seq:
    #   read(source, **options) -> array_of_arrays
    #   read(source, headers: true, **options) -> csv_table
    #
    # Opens the given +source+ with the given +options+ (see CSV.open),
    # reads the source (see CSV#read), and returns the result,
    # which will be either an \Array of Arrays or a CSV::Table.
    #
    # Without headers:
    #   string = "foo,0\nbar,1\nbaz,2\n"
    #   path = 't.csv'
    #   File.write(path, string)
    #   CSV.read(path) # => [["foo", "0"], ["bar", "1"], ["baz", "2"]]
    #
    # With headers:
    #   string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   path = 't.csv'
    #   File.write(path, string)
    #   CSV.read(path, headers: true) # => #<CSV::Table mode:col_or_row row_count:4>
    def read(path, **options)
      open(path, **options) { |csv| csv.read }
    end

    # :call-seq:
    #   CSV.readlines(source, **options)
    #
    # Alias for CSV.read.
    def readlines(path, **options)
      read(path, **options)
    end

    # :call-seq:
    #   CSV.table(source, **options)
    #
    # Calls CSV.read with +source+, +options+, and certain default options:
    # - +headers+: +true+
    # - +converters+: +:numeric+
    # - +header_converters+: +:symbol+
    #
    # Returns a CSV::Table object.
    #
    # Example:
    #   string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
    #   path = 't.csv'
    #   File.write(path, string)
    #   CSV.table(path) # => #<CSV::Table mode:col_or_row row_count:4>
    def table(path, **options)
      default_options = {
        headers:           true,
        converters:        :numeric,
        header_converters: :symbol,
      }
      options = default_options.merge(options)
      read(path, **options)
    end
  end

  # :call-seq:
  #   CSV.new(string)
  #   CSV.new(io)
  #   CSV.new(string, **options)
  #   CSV.new(io, **options)
  #
  # Returns the new \CSV object created using +string+ or +io+
  # and the specified +options+.
  #
  # - Argument +string+ should be a \String object;
  #   it will be put into a new StringIO object positioned at the beginning.
  # :include: ../doc/csv/arguments/io.rdoc
  # - Argument +options+: See:
  #   * {Options for Parsing}[#class-CSV-label-Options+for+Parsing]
  #   * {Options for Generating}[#class-CSV-label-Options+for+Generating]
  #   For performance reasons, the options cannot be overridden
  #   in a \CSV object, so those specified here will endure.
  #
  # In addition to the \CSV instance methods, several \IO methods are delegated.
  # See {Delegated Methods}[#class-CSV-label-Delegated+Methods].
  #
  # ---
  #
  # Create a \CSV object from a \String object:
  #   csv = CSV.new('foo,0')
  #   csv # => #<CSV io_type:StringIO encoding:UTF-8 lineno:0 col_sep:"," row_sep:"\n" quote_char:"\"">
  #
  # Create a \CSV object from a \File object:
  #   File.write('t.csv', 'foo,0')
  #   csv = CSV.new(File.open('t.csv'))
  #   csv # => #<CSV io_type:File io_path:"t.csv" encoding:UTF-8 lineno:0 col_sep:"," row_sep:"\n" quote_char:"\"">
  #
  # ---
  #
  # Raises an exception if the argument is +nil+:
  #   # Raises ArgumentError (Cannot parse nil as CSV):
  #   CSV.new(nil)
  #
  def initialize(data,
                 col_sep: ",",
                 row_sep: :auto,
                 quote_char: '"',
                 field_size_limit: nil,
                 max_field_size: nil,
                 converters: nil,
                 unconverted_fields: nil,
                 headers: false,
                 return_headers: false,
                 write_headers: nil,
                 header_converters: nil,
                 skip_blanks: false,
                 force_quotes: false,
                 skip_lines: nil,
                 liberal_parsing: false,
                 internal_encoding: nil,
                 external_encoding: nil,
                 encoding: nil,
                 nil_value: nil,
                 empty_value: "",
                 strip: false,
                 quote_empty: true,
                 write_converters: nil,
                 write_nil_value: nil,
                 write_empty_value: "")
    raise ArgumentError.new("Cannot parse nil as CSV") if data.nil?

    if data.is_a?(String)
      if encoding
        if encoding.is_a?(String)
          data_external_encoding, data_internal_encoding = encoding.split(":", 2)
          if data_internal_encoding
            data = data.encode(data_internal_encoding, data_external_encoding)
          else
            data = data.dup.force_encoding(data_external_encoding)
          end
        else
          data = data.dup.force_encoding(encoding)
        end
      end
      @io = StringIO.new(data)
    else
      @io = data
    end
    @encoding = determine_encoding(encoding, internal_encoding)

    @base_fields_converter_options = {
      nil_value: nil_value,
      empty_value: empty_value,
    }
    @write_fields_converter_options = {
      nil_value: write_nil_value,
      empty_value: write_empty_value,
    }
    @initial_converters = converters
    @initial_header_converters = header_converters
    @initial_write_converters = write_converters

    if max_field_size.nil? and field_size_limit
      max_field_size = field_size_limit - 1
    end
    @parser_options = {
      column_separator: col_sep,
      row_separator: row_sep,
      quote_character: quote_char,
      max_field_size: max_field_size,
      unconverted_fields: unconverted_fields,
      headers: headers,
      return_headers: return_headers,
      skip_blanks: skip_blanks,
      skip_lines: skip_lines,
      liberal_parsing: liberal_parsing,
      encoding: @encoding,
      nil_value: nil_value,
      empty_value: empty_value,
      strip: strip,
    }
    @parser = nil
    @parser_enumerator = nil
    @eof_error = nil

    @writer_options = {
      encoding: @encoding,
      force_encoding: (not encoding.nil?),
      force_quotes: force_quotes,
      headers: headers,
      write_headers: write_headers,
      column_separator: col_sep,
      row_separator: row_sep,
      quote_character: quote_char,
      quote_empty: quote_empty,
    }

    @writer = nil
    writer if @writer_options[:write_headers]
  end

  # :call-seq:
  #   csv.col_sep -> string
  #
  # Returns the encoded column separator; used for parsing and writing;
  # see {Option +col_sep+}[#class-CSV-label-Option+col_sep]:
  #   CSV.new('').col_sep # => ","
  def col_sep
    parser.column_separator
  end

  # :call-seq:
  #   csv.row_sep -> string
  #
  # Returns the encoded row separator; used for parsing and writing;
  # see {Option +row_sep+}[#class-CSV-label-Option+row_sep]:
  #   CSV.new('').row_sep # => "\n"
  def row_sep
    parser.row_separator
  end

  # :call-seq:
  #   csv.quote_char -> character
  #
  # Returns the encoded quote character; used for parsing and writing;
  # see {Option +quote_char+}[#class-CSV-label-Option+quote_char]:
  #   CSV.new('').quote_char # => "\""
  def quote_char
    parser.quote_character
  end

  # :call-seq:
  #   csv.field_size_limit -> integer or nil
  #
  # Returns the limit for field size; used for parsing;
  # see {Option +field_size_limit+}[#class-CSV-label-Option+field_size_limit]:
  #   CSV.new('').field_size_limit # => nil
  #
  # Deprecated since 3.2.3. Use +max_field_size+ instead.
  def field_size_limit
    parser.field_size_limit
  end

  # :call-seq:
  #   csv.max_field_size -> integer or nil
  #
  # Returns the limit for field size; used for parsing;
  # see {Option +max_field_size+}[#class-CSV-label-Option+max_field_size]:
  #   CSV.new('').max_field_size # => nil
  #
  # Since 3.2.3.
  def max_field_size
    parser.max_field_size
  end

  # :call-seq:
  #   csv.skip_lines -> regexp or nil
  #
  # Returns the \Regexp used to identify comment lines; used for parsing;
  # see {Option +skip_lines+}[#class-CSV-label-Option+skip_lines]:
  #   CSV.new('').skip_lines # => nil
  def skip_lines
    parser.skip_lines
  end

  # :call-seq:
  #   csv.converters -> array
  #
  # Returns an \Array containing field converters;
  # see {Field Converters}[#class-CSV-label-Field+Converters]:
  #   csv = CSV.new('')
  #   csv.converters # => []
  #   csv.convert(:integer)
  #   csv.converters # => [:integer]
  #   csv.convert(proc {|x| x.to_s })
  #   csv.converters
  #
  # Notes that you need to call
  # +Ractor.make_shareable(CSV::Converters)+ on the main Ractor to use
  # this method.
  def converters
    parser_fields_converter.map do |converter|
      name = Converters.rassoc(converter)
      name ? name.first : converter
    end
  end

  # :call-seq:
  #   csv.unconverted_fields? -> object
  #
  # Returns the value that determines whether unconverted fields are to be
  # available; used for parsing;
  # see {Option +unconverted_fields+}[#class-CSV-label-Option+unconverted_fields]:
  #   CSV.new('').unconverted_fields? # => nil
  def unconverted_fields?
    parser.unconverted_fields?
  end

  # :call-seq:
  #   csv.headers -> object
  #
  # Returns the value that determines whether headers are used; used for parsing;
  # see {Option +headers+}[#class-CSV-label-Option+headers]:
  #   CSV.new('').headers # => nil
  def headers
    if @writer
      @writer.headers
    else
      parsed_headers = parser.headers
      return parsed_headers if parsed_headers
      raw_headers = @parser_options[:headers]
      raw_headers = nil if raw_headers == false
      raw_headers
    end
  end

  # :call-seq:
  #   csv.return_headers? -> true or false
  #
  # Returns the value that determines whether headers are to be returned; used for parsing;
  # see {Option +return_headers+}[#class-CSV-label-Option+return_headers]:
  #   CSV.new('').return_headers? # => false
  def return_headers?
    parser.return_headers?
  end

  # :call-seq:
  #   csv.write_headers? -> true or false
  #
  # Returns the value that determines whether headers are to be written; used for generating;
  # see {Option +write_headers+}[#class-CSV-label-Option+write_headers]:
  #   CSV.new('').write_headers? # => nil
  def write_headers?
    @writer_options[:write_headers]
  end

  # :call-seq:
  #   csv.header_converters -> array
  #
  # Returns an \Array containing header converters; used for parsing;
  # see {Header Converters}[#class-CSV-label-Header+Converters]:
  #   CSV.new('').header_converters # => []
  #
  # Notes that you need to call
  # +Ractor.make_shareable(CSV::HeaderConverters)+ on the main Ractor
  # to use this method.
  def header_converters
    header_fields_converter.map do |converter|
      name = HeaderConverters.rassoc(converter)
      name ? name.first : converter
    end
  end

  # :call-seq:
  #   csv.skip_blanks? -> true or false
  #
  # Returns the value that determines whether blank lines are to be ignored; used for parsing;
  # see {Option +skip_blanks+}[#class-CSV-label-Option+skip_blanks]:
  #   CSV.new('').skip_blanks? # => false
  def skip_blanks?
    parser.skip_blanks?
  end

  # :call-seq:
  #   csv.force_quotes? -> true or false
  #
  # Returns the value that determines whether all output fields are to be quoted;
  # used for generating;
  # see {Option +force_quotes+}[#class-CSV-label-Option+force_quotes]:
  #   CSV.new('').force_quotes? # => false
  def force_quotes?
    @writer_options[:force_quotes]
  end

  # :call-seq:
  #   csv.liberal_parsing? -> true or false
  #
  # Returns the value that determines whether illegal input is to be handled; used for parsing;
  # see {Option +liberal_parsing+}[#class-CSV-label-Option+liberal_parsing]:
  #   CSV.new('').liberal_parsing? # => false
  def liberal_parsing?
    parser.liberal_parsing?
  end

  # :call-seq:
  #   csv.encoding -> encoding
  #
  # Returns the encoding used for parsing and generating;
  # see {Character Encodings (M17n or Multilingualization)}[#class-CSV-label-Character+Encodings+-28M17n+or+Multilingualization-29]:
  #   CSV.new('').encoding # => #<Encoding:UTF-8>
  attr_reader :encoding

  # :call-seq:
  #   csv.line_no -> integer
  #
  # Returns the count of the rows parsed or generated.
  #
  # Parsing:
  #   string = "foo,0\nbar,1\nbaz,2\n"
  #   path = 't.csv'
  #   File.write(path, string)
  #   CSV.open(path) do |csv|
  #     csv.each do |row|
  #       p [csv.lineno, row]
  #     end
  #   end
  # Output:
  #   [1, ["foo", "0"]]
  #   [2, ["bar", "1"]]
  #   [3, ["baz", "2"]]
  #
  # Generating:
  #   CSV.generate do |csv|
  #     p csv.lineno; csv << ['foo', 0]
  #     p csv.lineno; csv << ['bar', 1]
  #     p csv.lineno; csv << ['baz', 2]
  #   end
  # Output:
  #   0
  #   1
  #   2
  def lineno
    if @writer
      @writer.lineno
    else
      parser.lineno
    end
  end

  # :call-seq:
  #   csv.line -> array
  #
  # Returns the line most recently read:
  #   string = "foo,0\nbar,1\nbaz,2\n"
  #   path = 't.csv'
  #   File.write(path, string)
  #   CSV.open(path) do |csv|
  #     csv.each do |row|
  #       p [csv.lineno, csv.line]
  #     end
  #   end
  # Output:
  #   [1, "foo,0\n"]
  #   [2, "bar,1\n"]
  #   [3, "baz,2\n"]
  def line
    parser.line
  end

  ### IO and StringIO Delegation ###

  extend Forwardable
  def_delegators :@io, :binmode, :close, :close_read, :close_write,
                       :closed?, :external_encoding, :fcntl,
                       :fileno, :flush, :fsync, :internal_encoding,
                       :isatty, :pid, :pos, :pos=, :reopen,
                       :seek, :string, :sync, :sync=, :tell,
                       :truncate, :tty?

  def binmode?
    if @io.respond_to?(:binmode?)
      @io.binmode?
    else
      false
    end
  end

  def flock(*args)
    raise NotImplementedError unless @io.respond_to?(:flock)
    @io.flock(*args)
  end

  def ioctl(*args)
    raise NotImplementedError unless @io.respond_to?(:ioctl)
    @io.ioctl(*args)
  end

  def path
    @io.path if @io.respond_to?(:path)
  end

  def stat(*args)
    raise NotImplementedError unless @io.respond_to?(:stat)
    @io.stat(*args)
  end

  def to_i
    raise NotImplementedError unless @io.respond_to?(:to_i)
    @io.to_i
  end

  def to_io
    @io.respond_to?(:to_io) ? @io.to_io : @io
  end

  def eof?
    return false if @eof_error
    begin
      parser_enumerator.peek
      false
    rescue MalformedCSVError => error
      @eof_error = error
      false
    rescue StopIteration
      true
    end
  end
  alias_method :eof, :eof?

  # Rewinds the underlying IO object and resets CSV's lineno() counter.
  def rewind
    @parser = nil
    @parser_enumerator = nil
    @eof_error = nil
    @writer.rewind if @writer
    @io.rewind
  end

  ### End Delegation ###

  # :call-seq:
  #   csv << row -> self
  #
  # Appends a row to +self+.
  #
  # - Argument +row+ must be an \Array object or a CSV::Row object.
  # - The output stream must be open for writing.
  #
  # ---
  #
  # Append Arrays:
  #   CSV.generate do |csv|
  #     csv << ['foo', 0]
  #     csv << ['bar', 1]
  #     csv << ['baz', 2]
  #   end # => "foo,0\nbar,1\nbaz,2\n"
  #
  # Append CSV::Rows:
  #   headers = []
  #   CSV.generate do |csv|
  #     csv << CSV::Row.new(headers, ['foo', 0])
  #     csv << CSV::Row.new(headers, ['bar', 1])
  #     csv << CSV::Row.new(headers, ['baz', 2])
  #   end # => "foo,0\nbar,1\nbaz,2\n"
  #
  # Headers in CSV::Row objects are not appended:
  #   headers = ['Name', 'Count']
  #   CSV.generate do |csv|
  #     csv << CSV::Row.new(headers, ['foo', 0])
  #     csv << CSV::Row.new(headers, ['bar', 1])
  #     csv << CSV::Row.new(headers, ['baz', 2])
  #   end # => "foo,0\nbar,1\nbaz,2\n"
  #
  # ---
  #
  # Raises an exception if +row+ is not an \Array or \CSV::Row:
  #   CSV.generate do |csv|
  #     # Raises NoMethodError (undefined method `collect' for :foo:Symbol)
  #     csv << :foo
  #   end
  #
  # Raises an exception if the output stream is not opened for writing:
  #   path = 't.csv'
  #   File.write(path, '')
  #   File.open(path) do |file|
  #     CSV.open(file) do |csv|
  #       # Raises IOError (not opened for writing)
  #       csv << ['foo', 0]
  #     end
  #   end
  def <<(row)
    writer << row
    self
  end
  alias_method :add_row, :<<
  alias_method :puts,    :<<

  # :call-seq:
  #   convert(converter_name) -> array_of_procs
  #   convert {|field, field_info| ... } -> array_of_procs
  #
  # - With no block, installs a field converter (a \Proc).
  # - With a block, defines and installs a custom field converter.
  # - Returns the \Array of installed field converters.
  #
  # - Argument +converter_name+, if given, should be the name
  #   of an existing field converter.
  #
  # See {Field Converters}[#class-CSV-label-Field+Converters].
  # ---
  #
  # With no block, installs a field converter:
  #   csv = CSV.new('')
  #   csv.convert(:integer)
  #   csv.convert(:float)
  #   csv.convert(:date)
  #   csv.converters # => [:integer, :float, :date]
  #
  # ---
  #
  # The block, if given, is called for each field:
  # - Argument +field+ is the field value.
  # - Argument +field_info+ is a CSV::FieldInfo object
  #   containing details about the field.
  #
  # The examples here assume the prior execution of:
  #   string = "foo,0\nbar,1\nbaz,2\n"
  #   path = 't.csv'
  #   File.write(path, string)
  #
  # Example giving a block:
  #   csv = CSV.open(path)
  #   csv.convert {|field, field_info| p [field, field_info]; field.upcase }
  #   csv.read # => [["FOO", "0"], ["BAR", "1"], ["BAZ", "2"]]
  #
  # Output:
  #   ["foo", #<struct CSV::FieldInfo index=0, line=1, header=nil>]
  #   ["0", #<struct CSV::FieldInfo index=1, line=1, header=nil>]
  #   ["bar", #<struct CSV::FieldInfo index=0, line=2, header=nil>]
  #   ["1", #<struct CSV::FieldInfo index=1, line=2, header=nil>]
  #   ["baz", #<struct CSV::FieldInfo index=0, line=3, header=nil>]
  #   ["2", #<struct CSV::FieldInfo index=1, line=3, header=nil>]
  #
  # The block need not return a \String object:
  #   csv = CSV.open(path)
  #   csv.convert {|field, field_info| field.to_sym }
  #   csv.read # => [[:foo, :"0"], [:bar, :"1"], [:baz, :"2"]]
  #
  # If +converter_name+ is given, the block is not called:
  #   csv = CSV.open(path)
  #   csv.convert(:integer) {|field, field_info| fail 'Cannot happen' }
  #   csv.read # => [["foo", 0], ["bar", 1], ["baz", 2]]
  #
  # ---
  #
  # Raises a parse-time exception if +converter_name+ is not the name of a built-in
  # field converter:
  #   csv = CSV.open(path)
  #   csv.convert(:nosuch) => [nil]
  #   # Raises NoMethodError (undefined method `arity' for nil:NilClass)
  #   csv.read
  def convert(name = nil, &converter)
    parser_fields_converter.add_converter(name, &converter)
  end

  # :call-seq:
  #   header_convert(converter_name) -> array_of_procs
  #   header_convert {|header, field_info| ... } -> array_of_procs
  #
  # - With no block, installs a header converter (a \Proc).
  # - With a block, defines and installs a custom header converter.
  # - Returns the \Array of installed header converters.
  #
  # - Argument +converter_name+, if given, should be the name
  #   of an existing header converter.
  #
  # See {Header Converters}[#class-CSV-label-Header+Converters].
  # ---
  #
  # With no block, installs a header converter:
  #   csv = CSV.new('')
  #   csv.header_convert(:symbol)
  #   csv.header_convert(:downcase)
  #   csv.header_converters # => [:symbol, :downcase]
  #
  # ---
  #
  # The block, if given, is called for each header:
  # - Argument +header+ is the header value.
  # - Argument +field_info+ is a CSV::FieldInfo object
  #   containing details about the header.
  #
  # The examples here assume the prior execution of:
  #   string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
  #   path = 't.csv'
  #   File.write(path, string)
  #
  # Example giving a block:
  #   csv = CSV.open(path, headers: true)
  #   csv.header_convert {|header, field_info| p [header, field_info]; header.upcase }
  #   table = csv.read
  #   table # => #<CSV::Table mode:col_or_row row_count:4>
  #   table.headers # => ["NAME", "VALUE"]
  #
  # Output:
  #   ["Name", #<struct CSV::FieldInfo index=0, line=1, header=nil>]
  #   ["Value", #<struct CSV::FieldInfo index=1, line=1, header=nil>]

  # The block need not return a \String object:
  #   csv = CSV.open(path, headers: true)
  #   csv.header_convert {|header, field_info| header.to_sym }
  #   table = csv.read
  #   table.headers # => [:Name, :Value]
  #
  # If +converter_name+ is given, the block is not called:
  #   csv = CSV.open(path, headers: true)
  #   csv.header_convert(:downcase) {|header, field_info| fail 'Cannot happen' }
  #   table = csv.read
  #   table.headers # => ["name", "value"]
  # ---
  #
  # Raises a parse-time exception if +converter_name+ is not the name of a built-in
  # field converter:
  #   csv = CSV.open(path, headers: true)
  #   csv.header_convert(:nosuch)
  #   # Raises NoMethodError (undefined method `arity' for nil:NilClass)
  #   csv.read
  def header_convert(name = nil, &converter)
    header_fields_converter.add_converter(name, &converter)
  end

  include Enumerable

  # :call-seq:
  #   csv.each -> enumerator
  #   csv.each {|row| ...}
  #
  # Calls the block with each successive row.
  # The data source must be opened for reading.
  #
  # Without headers:
  #   string = "foo,0\nbar,1\nbaz,2\n"
  #   csv = CSV.new(string)
  #   csv.each do |row|
  #     p row
  #   end
  # Output:
  #   ["foo", "0"]
  #   ["bar", "1"]
  #   ["baz", "2"]
  #
  # With headers:
  #   string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
  #   csv = CSV.new(string, headers: true)
  #   csv.each do |row|
  #     p row
  #   end
  # Output:
  #   <CSV::Row "Name":"foo" "Value":"0">
  #   <CSV::Row "Name":"bar" "Value":"1">
  #   <CSV::Row "Name":"baz" "Value":"2">
  #
  # ---
  #
  # Raises an exception if the source is not opened for reading:
  #   string = "foo,0\nbar,1\nbaz,2\n"
  #   csv = CSV.new(string)
  #   csv.close
  #   # Raises IOError (not opened for reading)
  #   csv.each do |row|
  #     p row
  #   end
  def each(&block)
    parser_enumerator.each(&block)
  end

  # :call-seq:
  #   csv.read -> array or csv_table
  #
  # Forms the remaining rows from +self+ into:
  # - A CSV::Table object, if headers are in use.
  # - An \Array of Arrays, otherwise.
  #
  # The data source must be opened for reading.
  #
  # Without headers:
  #   string = "foo,0\nbar,1\nbaz,2\n"
  #   path = 't.csv'
  #   File.write(path, string)
  #   csv = CSV.open(path)
  #   csv.read # => [["foo", "0"], ["bar", "1"], ["baz", "2"]]
  #
  # With headers:
  #   string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
  #   path = 't.csv'
  #   File.write(path, string)
  #   csv = CSV.open(path, headers: true)
  #   csv.read # => #<CSV::Table mode:col_or_row row_count:4>
  #
  # ---
  #
  # Raises an exception if the source is not opened for reading:
  #   string = "foo,0\nbar,1\nbaz,2\n"
  #   csv = CSV.new(string)
  #   csv.close
  #   # Raises IOError (not opened for reading)
  #   csv.read
  def read
    rows = to_a
    if parser.use_headers?
      Table.new(rows, headers: parser.headers)
    else
      rows
    end
  end
  alias_method :readlines, :read

  # :call-seq:
  #   csv.header_row? -> true or false
  #
  # Returns +true+ if the next row to be read is a header row\;
  # +false+ otherwise.
  #
  # Without headers:
  #   string = "foo,0\nbar,1\nbaz,2\n"
  #   csv = CSV.new(string)
  #   csv.header_row? # => false
  #
  # With headers:
  #   string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
  #   csv = CSV.new(string, headers: true)
  #   csv.header_row? # => true
  #   csv.shift # => #<CSV::Row "Name":"foo" "Value":"0">
  #   csv.header_row? # => false
  #
  # ---
  #
  # Raises an exception if the source is not opened for reading:
  #   string = "foo,0\nbar,1\nbaz,2\n"
  #   csv = CSV.new(string)
  #   csv.close
  #   # Raises IOError (not opened for reading)
  #   csv.header_row?
  def header_row?
    parser.header_row?
  end

  # :call-seq:
  #   csv.shift -> array, csv_row, or nil
  #
  # Returns the next row of data as:
  # - An \Array if no headers are used.
  # - A CSV::Row object if headers are used.
  #
  # The data source must be opened for reading.
  #
  # Without headers:
  #   string = "foo,0\nbar,1\nbaz,2\n"
  #   csv = CSV.new(string)
  #   csv.shift # => ["foo", "0"]
  #   csv.shift # => ["bar", "1"]
  #   csv.shift # => ["baz", "2"]
  #   csv.shift # => nil
  #
  # With headers:
  #   string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
  #   csv = CSV.new(string, headers: true)
  #   csv.shift # => #<CSV::Row "Name":"foo" "Value":"0">
  #   csv.shift # => #<CSV::Row "Name":"bar" "Value":"1">
  #   csv.shift # => #<CSV::Row "Name":"baz" "Value":"2">
  #   csv.shift # => nil
  #
  # ---
  #
  # Raises an exception if the source is not opened for reading:
  #   string = "foo,0\nbar,1\nbaz,2\n"
  #   csv = CSV.new(string)
  #   csv.close
  #   # Raises IOError (not opened for reading)
  #   csv.shift
  def shift
    if @eof_error
      eof_error, @eof_error = @eof_error, nil
      raise eof_error
    end
    begin
      parser_enumerator.next
    rescue StopIteration
      nil
    end
  end
  alias_method :gets,     :shift
  alias_method :readline, :shift

  # :call-seq:
  #   csv.inspect -> string
  #
  # Returns a \String showing certain properties of +self+:
  #   string = "Name,Value\nfoo,0\nbar,1\nbaz,2\n"
  #   csv = CSV.new(string, headers: true)
  #   s = csv.inspect
  #   s # => "#<CSV io_type:StringIO encoding:UTF-8 lineno:0 col_sep:\",\" row_sep:\"\\n\" quote_char:\"\\\"\" headers:true>"
  def inspect
    str = ["#<", self.class.to_s, " io_type:"]
    # show type of wrapped IO
    if    @io == $stdout then str << "$stdout"
    elsif @io == $stdin  then str << "$stdin"
    elsif @io == $stderr then str << "$stderr"
    else                      str << @io.class.to_s
    end
    # show IO.path(), if available
    if @io.respond_to?(:path) and (p = @io.path)
      str << " io_path:" << p.inspect
    end
    # show encoding
    str << " encoding:" << @encoding.name
    # show other attributes
    ["lineno", "col_sep", "row_sep", "quote_char"].each do |attr_name|
      if a = __send__(attr_name)
        str << " " << attr_name << ":" << a.inspect
      end
    end
    ["skip_blanks", "liberal_parsing"].each do |attr_name|
      if a = __send__("#{attr_name}?")
        str << " " << attr_name << ":" << a.inspect
      end
    end
    _headers = headers
    str << " headers:" << _headers.inspect if _headers
    str << ">"
    begin
      str.join('')
    rescue  # any encoding error
      str.map do |s|
        e = Encoding::Converter.asciicompat_encoding(s.encoding)
        e ? s.encode(e) : s.force_encoding("ASCII-8BIT")
      end.join('')
    end
  end

  private

  def determine_encoding(encoding, internal_encoding)
    # honor the IO encoding if we can, otherwise default to ASCII-8BIT
    io_encoding = raw_encoding
    return io_encoding if io_encoding

    return Encoding.find(internal_encoding) if internal_encoding

    if encoding
      encoding, = encoding.split(":", 2) if encoding.is_a?(String)
      return Encoding.find(encoding)
    end

    Encoding.default_internal || Encoding.default_external
  end

  def normalize_converters(converters)
    converters ||= []
    unless converters.is_a?(Array)
      converters = [converters]
    end
    converters.collect do |converter|
      case converter
      when Proc # custom code block
        [nil, converter]
      else # by name
        [converter, nil]
      end
    end
  end

  #
  # Processes +fields+ with <tt>@converters</tt>, or <tt>@header_converters</tt>
  # if +headers+ is passed as +true+, returning the converted field set. Any
  # converter that changes the field into something other than a String halts
  # the pipeline of conversion for that field. This is primarily an efficiency
  # shortcut.
  #
  def convert_fields(fields, headers = false)
    if headers
      header_fields_converter.convert(fields, nil, 0)
    else
      parser_fields_converter.convert(fields, @headers, lineno)
    end
  end

  #
  # Returns the encoding of the internal IO object.
  #
  def raw_encoding
    if @io.respond_to? :internal_encoding
      @io.internal_encoding || @io.external_encoding
    elsif @io.respond_to? :encoding
      @io.encoding
    else
      nil
    end
  end

  def parser_fields_converter
    @parser_fields_converter ||= build_parser_fields_converter
  end

  def build_parser_fields_converter
    specific_options = {
      builtin_converters_name: :Converters,
    }
    options = @base_fields_converter_options.merge(specific_options)
    build_fields_converter(@initial_converters, options)
  end

  def header_fields_converter
    @header_fields_converter ||= build_header_fields_converter
  end

  def build_header_fields_converter
    specific_options = {
      builtin_converters_name: :HeaderConverters,
      accept_nil: true,
    }
    options = @base_fields_converter_options.merge(specific_options)
    build_fields_converter(@initial_header_converters, options)
  end

  def writer_fields_converter
    @writer_fields_converter ||= build_writer_fields_converter
  end

  def build_writer_fields_converter
    build_fields_converter(@initial_write_converters,
                           @write_fields_converter_options)
  end

  def build_fields_converter(initial_converters, options)
    fields_converter = FieldsConverter.new(options)
    normalize_converters(initial_converters).each do |name, converter|
      fields_converter.add_converter(name, &converter)
    end
    fields_converter
  end

  def parser
    @parser ||= Parser.new(@io, parser_options)
  end

  def parser_options
    @parser_options.merge(header_fields_converter: header_fields_converter,
                          fields_converter: parser_fields_converter)
  end

  def parser_enumerator
    @parser_enumerator ||= parser.parse
  end

  def writer
    @writer ||= Writer.new(@io, writer_options)
  end

  def writer_options
    @writer_options.merge(header_fields_converter: header_fields_converter,
                          fields_converter: writer_fields_converter)
  end
end

# Passes +args+ to CSV::instance.
#
#   CSV("CSV,data").read
#     #=> [["CSV", "data"]]
#
# If a block is given, the instance is passed the block and the return value
# becomes the return value of the block.
#
#   CSV("CSV,data") { |c|
#     c.read.any? { |a| a.include?("data") }
#   } #=> true
#
#   CSV("CSV,data") { |c|
#     c.read.any? { |a| a.include?("zombies") }
#   } #=> false
#
# CSV options may also be given.
#
#   io = StringIO.new
#   CSV(io, col_sep: ";") { |csv| csv << ["a", "b", "c"] }
#
# This API is not Ractor-safe.
#
def CSV(*args, **options, &block)
  CSV.instance(*args, **options, &block)
end

require_relative "csv/version"
require_relative "csv/core_ext/array"
require_relative "csv/core_ext/string"
PK}$[P�U��F�Fruby/reline.rbnu�[���require 'io/console'
require 'timeout'
require 'forwardable'
require 'reline/version'
require 'reline/config'
require 'reline/key_actor'
require 'reline/key_stroke'
require 'reline/line_editor'
require 'reline/history'
require 'reline/terminfo'
require 'rbconfig'

module Reline
  FILENAME_COMPLETION_PROC = nil
  USERNAME_COMPLETION_PROC = nil

  class ConfigEncodingConversionError < StandardError; end

  Key = Struct.new('Key', :char, :combined_char, :with_meta) do
    def match?(other)
      case other
      when Reline::Key
        (other.char.nil? or char.nil? or char == other.char) and
        (other.combined_char.nil? or combined_char.nil? or combined_char == other.combined_char) and
        (other.with_meta.nil? or with_meta.nil? or with_meta == other.with_meta)
      when Integer, Symbol
        (combined_char and combined_char == other) or
        (combined_char.nil? and char and char == other)
      else
        false
      end
    end
    alias_method :==, :match?
  end
  CursorPos = Struct.new(:x, :y)
  DialogRenderInfo = Struct.new(:pos, :contents, :bg_color, :width, :height, :scrollbar, keyword_init: true)

  class Core
    ATTR_READER_NAMES = %i(
      completion_append_character
      basic_word_break_characters
      completer_word_break_characters
      basic_quote_characters
      completer_quote_characters
      filename_quote_characters
      special_prefixes
      completion_proc
      output_modifier_proc
      prompt_proc
      auto_indent_proc
      pre_input_hook
      dig_perfect_match_proc
    ).each(&method(:attr_reader))

    attr_accessor :config
    attr_accessor :key_stroke
    attr_accessor :line_editor
    attr_accessor :last_incremental_search
    attr_reader :output

    def initialize
      self.output = STDOUT
      @dialog_proc_list = {}
      yield self
      @completion_quote_character = nil
      @bracketed_paste_finished = false
    end

    def encoding
      Reline::IOGate.encoding
    end

    def completion_append_character=(val)
      if val.nil?
        @completion_append_character = nil
      elsif val.size == 1
        @completion_append_character = val.encode(Reline::IOGate.encoding)
      elsif val.size > 1
        @completion_append_character = val[0].encode(Reline::IOGate.encoding)
      else
        @completion_append_character = nil
      end
    end

    def basic_word_break_characters=(v)
      @basic_word_break_characters = v.encode(Reline::IOGate.encoding)
    end

    def completer_word_break_characters=(v)
      @completer_word_break_characters = v.encode(Reline::IOGate.encoding)
    end

    def basic_quote_characters=(v)
      @basic_quote_characters = v.encode(Reline::IOGate.encoding)
    end

    def completer_quote_characters=(v)
      @completer_quote_characters = v.encode(Reline::IOGate.encoding)
    end

    def filename_quote_characters=(v)
      @filename_quote_characters = v.encode(Reline::IOGate.encoding)
    end

    def special_prefixes=(v)
      @special_prefixes = v.encode(Reline::IOGate.encoding)
    end

    def completion_case_fold=(v)
      @config.completion_ignore_case = v
    end

    def completion_case_fold
      @config.completion_ignore_case
    end

    def completion_quote_character
      @completion_quote_character
    end

    def completion_proc=(p)
      raise ArgumentError unless p.respond_to?(:call) or p.nil?
      @completion_proc = p
    end

    def autocompletion
      @config.autocompletion
    end

    def autocompletion=(val)
      @config.autocompletion = val
    end

    def output_modifier_proc=(p)
      raise ArgumentError unless p.respond_to?(:call) or p.nil?
      @output_modifier_proc = p
    end

    def prompt_proc=(p)
      raise ArgumentError unless p.respond_to?(:call) or p.nil?
      @prompt_proc = p
    end

    def auto_indent_proc=(p)
      raise ArgumentError unless p.respond_to?(:call) or p.nil?
      @auto_indent_proc = p
    end

    def pre_input_hook=(p)
      @pre_input_hook = p
    end

    def dig_perfect_match_proc=(p)
      raise ArgumentError unless p.respond_to?(:call) or p.nil?
      @dig_perfect_match_proc = p
    end

    DialogProc = Struct.new(:dialog_proc, :context)
    def add_dialog_proc(name_sym, p, context = nil)
      raise ArgumentError unless p.respond_to?(:call) or p.nil?
      raise ArgumentError unless name_sym.instance_of?(Symbol)
      @dialog_proc_list[name_sym] = DialogProc.new(p, context)
    end

    def dialog_proc(name_sym)
      @dialog_proc_list[name_sym]
    end

    def input=(val)
      raise TypeError unless val.respond_to?(:getc) or val.nil?
      if val.respond_to?(:getc)
        if defined?(Reline::ANSI) and Reline::IOGate == Reline::ANSI
          Reline::ANSI.input = val
        elsif Reline::IOGate == Reline::GeneralIO
          Reline::GeneralIO.input = val
        end
      end
    end

    def output=(val)
      raise TypeError unless val.respond_to?(:write) or val.nil?
      @output = val
      if defined?(Reline::ANSI) and Reline::IOGate == Reline::ANSI
        Reline::ANSI.output = val
      end
    end

    def vi_editing_mode
      config.editing_mode = :vi_insert
      nil
    end

    def emacs_editing_mode
      config.editing_mode = :emacs
      nil
    end

    def vi_editing_mode?
      config.editing_mode_is?(:vi_insert, :vi_command)
    end

    def emacs_editing_mode?
      config.editing_mode_is?(:emacs)
    end

    def get_screen_size
      Reline::IOGate.get_screen_size
    end

    Reline::DEFAULT_DIALOG_PROC_AUTOCOMPLETE = ->() {
      # autocomplete
      return nil unless config.autocompletion
      if just_cursor_moving and completion_journey_data.nil?
        # Auto complete starts only when edited
        return nil
      end
      pre, target, post = retrieve_completion_block(true)
      if target.nil? or target.empty? or (completion_journey_data&.pointer == -1 and target.size <= 3)
        return nil
      end
      if completion_journey_data and completion_journey_data.list
        result = completion_journey_data.list.dup
        result.shift
        pointer = completion_journey_data.pointer - 1
      else
        result = call_completion_proc_with_checking_args(pre, target, post)
        pointer = nil
      end
      if result and result.size == 1 and result[0] == target and pointer != 0
        result = nil
      end
      target_width = Reline::Unicode.calculate_width(target)
      x = cursor_pos.x - target_width
      if x < 0
        x = screen_width + x
        y = -1
      else
        y = 0
      end
      cursor_pos_to_render = Reline::CursorPos.new(x, y)
      if context and context.is_a?(Array)
        context.clear
        context.push(cursor_pos_to_render, result, pointer, dialog)
      end
      dialog.pointer = pointer
      DialogRenderInfo.new(pos: cursor_pos_to_render, contents: result, scrollbar: true, height: 15)
    }
    Reline::DEFAULT_DIALOG_CONTEXT = Array.new

    def readmultiline(prompt = '', add_hist = false, &confirm_multiline_termination)
      unless confirm_multiline_termination
        raise ArgumentError.new('#readmultiline needs block to confirm multiline termination')
      end
      inner_readline(prompt, add_hist, true, &confirm_multiline_termination)

      whole_buffer = line_editor.whole_buffer.dup
      whole_buffer.taint if RUBY_VERSION < '2.7'
      if add_hist and whole_buffer and whole_buffer.chomp("\n").size > 0
        Reline::HISTORY << whole_buffer
      end

      line_editor.reset_line if line_editor.whole_buffer.nil?
      whole_buffer
    end

    def readline(prompt = '', add_hist = false)
      inner_readline(prompt, add_hist, false)

      line = line_editor.line.dup
      line.taint if RUBY_VERSION < '2.7'
      if add_hist and line and line.chomp("\n").size > 0
        Reline::HISTORY << line.chomp("\n")
      end

      line_editor.reset_line if line_editor.line.nil?
      line
    end

    private def inner_readline(prompt, add_hist, multiline, &confirm_multiline_termination)
      if ENV['RELINE_STDERR_TTY']
        if Reline::IOGate.win?
          $stderr = File.open(ENV['RELINE_STDERR_TTY'], 'a')
        else
          $stderr.reopen(ENV['RELINE_STDERR_TTY'], 'w')
        end
        $stderr.sync = true
        $stderr.puts "Reline is used by #{Process.pid}"
      end
      otio = Reline::IOGate.prep

      may_req_ambiguous_char_width
      line_editor.reset(prompt, encoding: Reline::IOGate.encoding)
      if multiline
        line_editor.multiline_on
        if block_given?
          line_editor.confirm_multiline_termination_proc = confirm_multiline_termination
        end
      else
        line_editor.multiline_off
      end
      line_editor.output = output
      line_editor.completion_proc = completion_proc
      line_editor.completion_append_character = completion_append_character
      line_editor.output_modifier_proc = output_modifier_proc
      line_editor.prompt_proc = prompt_proc
      line_editor.auto_indent_proc = auto_indent_proc
      line_editor.dig_perfect_match_proc = dig_perfect_match_proc
      line_editor.pre_input_hook = pre_input_hook
      @dialog_proc_list.each_pair do |name_sym, d|
        line_editor.add_dialog_proc(name_sym, d.dialog_proc, d.context)
      end

      unless config.test_mode
        config.read
        config.reset_default_key_bindings
        Reline::IOGate.set_default_key_bindings(config)
      end

      line_editor.rerender

      begin
        line_editor.set_signal_handlers
        prev_pasting_state = false
        loop do
          prev_pasting_state = Reline::IOGate.in_pasting?
          read_io(config.keyseq_timeout) { |inputs|
            line_editor.set_pasting_state(Reline::IOGate.in_pasting?)
            inputs.each { |c|
              line_editor.input_key(c)
              line_editor.rerender
            }
            if @bracketed_paste_finished
              line_editor.rerender_all
              @bracketed_paste_finished = false
            end
          }
          if prev_pasting_state == true and not Reline::IOGate.in_pasting? and not line_editor.finished?
            line_editor.set_pasting_state(false)
            prev_pasting_state = false
            line_editor.rerender_all
          end
          break if line_editor.finished?
        end
        Reline::IOGate.move_cursor_column(0)
      rescue Errno::EIO
        # Maybe the I/O has been closed.
      rescue StandardError => e
        line_editor.finalize
        Reline::IOGate.deprep(otio)
        raise e
      rescue Exception
        # Including Interrupt
        line_editor.finalize
        Reline::IOGate.deprep(otio)
        raise
      end

      line_editor.finalize
      Reline::IOGate.deprep(otio)
    end

    # GNU Readline waits for "keyseq-timeout" milliseconds to see if the ESC
    # is followed by a character, and times out and treats it as a standalone
    # ESC if the second character does not arrive. If the second character
    # comes before timed out, it is treated as a modifier key with the
    # meta-property of meta-key, so that it can be distinguished from
    # multibyte characters with the 8th bit turned on.
    #
    # GNU Readline will wait for the 2nd character with "keyseq-timeout"
    # milli-seconds but wait forever after 3rd characters.
    private def read_io(keyseq_timeout, &block)
      buffer = []
      loop do
        c = Reline::IOGate.getc
        if c == -1
          result = :unmatched
          @bracketed_paste_finished = true
        else
          buffer << c
          result = key_stroke.match_status(buffer)
        end
        case result
        when :matched
          expanded = key_stroke.expand(buffer).map{ |expanded_c|
            Reline::Key.new(expanded_c, expanded_c, false)
          }
          block.(expanded)
          break
        when :matching
          if buffer.size == 1
            case read_2nd_character_of_key_sequence(keyseq_timeout, buffer, c, block)
            when :break then break
            when :next  then next
            end
          end
        when :unmatched
          if buffer.size == 1 and c == "\e".ord
            read_escaped_key(keyseq_timeout, c, block)
          else
            expanded = buffer.map{ |expanded_c|
              Reline::Key.new(expanded_c, expanded_c, false)
            }
            block.(expanded)
          end
          break
        end
      end
    end

    private def read_2nd_character_of_key_sequence(keyseq_timeout, buffer, c, block)
      begin
        succ_c = nil
        Timeout.timeout(keyseq_timeout / 1000.0) {
          succ_c = Reline::IOGate.getc
        }
      rescue Timeout::Error # cancel matching only when first byte
        block.([Reline::Key.new(c, c, false)])
        return :break
      else
        case key_stroke.match_status(buffer.dup.push(succ_c))
        when :unmatched
          if c == "\e".ord
            block.([Reline::Key.new(succ_c, succ_c | 0b10000000, true)])
          else
            block.([Reline::Key.new(c, c, false), Reline::Key.new(succ_c, succ_c, false)])
          end
          return :break
        when :matching
          Reline::IOGate.ungetc(succ_c)
          return :next
        when :matched
          buffer << succ_c
          expanded = key_stroke.expand(buffer).map{ |expanded_c|
            Reline::Key.new(expanded_c, expanded_c, false)
          }
          block.(expanded)
          return :break
        end
      end
    end

    private def read_escaped_key(keyseq_timeout, c, block)
      begin
        escaped_c = nil
        Timeout.timeout(keyseq_timeout / 1000.0) {
          escaped_c = Reline::IOGate.getc
        }
      rescue Timeout::Error # independent ESC
        block.([Reline::Key.new(c, c, false)])
      else
        if escaped_c.nil?
          block.([Reline::Key.new(c, c, false)])
        elsif escaped_c >= 128 # maybe, first byte of multi byte
          block.([Reline::Key.new(c, c, false), Reline::Key.new(escaped_c, escaped_c, false)])
        elsif escaped_c == "\e".ord # escape twice
          block.([Reline::Key.new(c, c, false), Reline::Key.new(c, c, false)])
        else
          block.([Reline::Key.new(escaped_c, escaped_c | 0b10000000, true)])
        end
      end
    end

    def ambiguous_width
      may_req_ambiguous_char_width unless defined? @ambiguous_width
      @ambiguous_width
    end

    private def may_req_ambiguous_char_width
      @ambiguous_width = 2 if Reline::IOGate == Reline::GeneralIO or STDOUT.is_a?(File)
      return if defined? @ambiguous_width
      Reline::IOGate.move_cursor_column(0)
      begin
        output.write "\u{25bd}"
      rescue Encoding::UndefinedConversionError
        # LANG=C
        @ambiguous_width = 1
      else
        @ambiguous_width = Reline::IOGate.cursor_pos.x
      end
      Reline::IOGate.move_cursor_column(0)
      Reline::IOGate.erase_after_cursor
    end
  end

  extend Forwardable
  extend SingleForwardable

  #--------------------------------------------------------
  # Documented API
  #--------------------------------------------------------

  (Core::ATTR_READER_NAMES).each { |name|
    def_single_delegators :core, :"#{name}", :"#{name}="
  }
  def_single_delegators :core, :input=, :output=
  def_single_delegators :core, :vi_editing_mode, :emacs_editing_mode
  def_single_delegators :core, :readline
  def_single_delegators :core, :completion_case_fold, :completion_case_fold=
  def_single_delegators :core, :completion_quote_character
  def_instance_delegators self, :readline
  private :readline


  #--------------------------------------------------------
  # Undocumented API
  #--------------------------------------------------------

  # Testable in original
  def_single_delegators :core, :get_screen_size
  def_single_delegators :line_editor, :eof?
  def_instance_delegators self, :eof?
  def_single_delegators :line_editor, :delete_text
  def_single_delegator :line_editor, :line, :line_buffer
  def_single_delegator :line_editor, :byte_pointer, :point
  def_single_delegator :line_editor, :byte_pointer=, :point=

  def self.insert_text(*args, &block)
    line_editor.insert_text(*args, &block)
    self
  end

  # Untestable in original
  def_single_delegator :line_editor, :rerender, :redisplay
  def_single_delegators :core, :vi_editing_mode?, :emacs_editing_mode?
  def_single_delegators :core, :ambiguous_width
  def_single_delegators :core, :last_incremental_search
  def_single_delegators :core, :last_incremental_search=
  def_single_delegators :core, :add_dialog_proc
  def_single_delegators :core, :dialog_proc
  def_single_delegators :core, :autocompletion, :autocompletion=

  def_single_delegators :core, :readmultiline
  def_instance_delegators self, :readmultiline
  private :readmultiline

  def self.encoding_system_needs
    self.core.encoding
  end

  def self.core
    @core ||= Core.new { |core|
      core.config = Reline::Config.new
      core.key_stroke = Reline::KeyStroke.new(core.config)
      core.line_editor = Reline::LineEditor.new(core.config, Reline::IOGate.encoding)

      core.basic_word_break_characters = " \t\n`><=;|&{("
      core.completer_word_break_characters = " \t\n`><=;|&{("
      core.basic_quote_characters = '"\''
      core.completer_quote_characters = '"\''
      core.filename_quote_characters = ""
      core.special_prefixes = ""
      core.add_dialog_proc(:autocomplete, Reline::DEFAULT_DIALOG_PROC_AUTOCOMPLETE, Reline::DEFAULT_DIALOG_CONTEXT)
    }
  end

  def self.ungetc(c)
    Reline::IOGate.ungetc(c)
  end

  def self.line_editor
    core.line_editor
  end
end

require 'reline/general_io'
if RbConfig::CONFIG['host_os'] =~ /mswin|msys|mingw|cygwin|bccwin|wince|emc/
  require 'reline/windows'
  if Reline::Windows.msys_tty?
    Reline::IOGate = if ENV['TERM'] == 'dumb'
      Reline::GeneralIO
    else
      require 'reline/ansi'
      Reline::ANSI
    end
  else
    Reline::IOGate = Reline::Windows
  end
else
  Reline::IOGate = if $stdout.isatty
    require 'reline/ansi'
    Reline::ANSI
  else
    Reline::GeneralIO
  end
end
Reline::HISTORY = Reline::History.new(Reline.core.config)
PK}$[�rٳV'V'ruby/cgi.rbnu�[���# frozen_string_literal: true
#
# cgi.rb - cgi support library
#
# Copyright (C) 2000  Network Applied Communication Laboratory, Inc.
#
# Copyright (C) 2000  Information-technology Promotion Agency, Japan
#
# Author: Wakou Aoyama <wakou@ruby-lang.org>
#
# Documentation: Wakou Aoyama (RDoc'd and embellished by William Webber)
#

# == Overview
#
# The Common Gateway Interface (CGI) is a simple protocol for passing an HTTP
# request from a web server to a standalone program, and returning the output
# to the web browser.  Basically, a CGI program is called with the parameters
# of the request passed in either in the environment (GET) or via $stdin
# (POST), and everything it prints to $stdout is returned to the client.
#
# This file holds the CGI class.  This class provides functionality for
# retrieving HTTP request parameters, managing cookies, and generating HTML
# output.
#
# The file CGI::Session provides session management functionality; see that
# class for more details.
#
# See http://www.w3.org/CGI/ for more information on the CGI protocol.
#
# == Introduction
#
# CGI is a large class, providing several categories of methods, many of which
# are mixed in from other modules.  Some of the documentation is in this class,
# some in the modules CGI::QueryExtension and CGI::HtmlExtension.  See
# CGI::Cookie for specific information on handling cookies, and cgi/session.rb
# (CGI::Session) for information on sessions.
#
# For queries, CGI provides methods to get at environmental variables,
# parameters, cookies, and multipart request data.  For responses, CGI provides
# methods for writing output and generating HTML.
#
# Read on for more details.  Examples are provided at the bottom.
#
# == Queries
#
# The CGI class dynamically mixes in parameter and cookie-parsing
# functionality,  environmental variable access, and support for
# parsing multipart requests (including uploaded files) from the
# CGI::QueryExtension module.
#
# === Environmental Variables
#
# The standard CGI environmental variables are available as read-only
# attributes of a CGI object.  The following is a list of these variables:
#
#
#   AUTH_TYPE               HTTP_HOST          REMOTE_IDENT
#   CONTENT_LENGTH          HTTP_NEGOTIATE     REMOTE_USER
#   CONTENT_TYPE            HTTP_PRAGMA        REQUEST_METHOD
#   GATEWAY_INTERFACE       HTTP_REFERER       SCRIPT_NAME
#   HTTP_ACCEPT             HTTP_USER_AGENT    SERVER_NAME
#   HTTP_ACCEPT_CHARSET     PATH_INFO          SERVER_PORT
#   HTTP_ACCEPT_ENCODING    PATH_TRANSLATED    SERVER_PROTOCOL
#   HTTP_ACCEPT_LANGUAGE    QUERY_STRING       SERVER_SOFTWARE
#   HTTP_CACHE_CONTROL      REMOTE_ADDR
#   HTTP_FROM               REMOTE_HOST
#
#
# For each of these variables, there is a corresponding attribute with the
# same name, except all lower case and without a preceding HTTP_.
# +content_length+ and +server_port+ are integers; the rest are strings.
#
# === Parameters
#
# The method #params() returns a hash of all parameters in the request as
# name/value-list pairs, where the value-list is an Array of one or more
# values.  The CGI object itself also behaves as a hash of parameter names
# to values, but only returns a single value (as a String) for each
# parameter name.
#
# For instance, suppose the request contains the parameter
# "favourite_colours" with the multiple values "blue" and "green".  The
# following behavior would occur:
#
#   cgi.params["favourite_colours"]  # => ["blue", "green"]
#   cgi["favourite_colours"]         # => "blue"
#
# If a parameter does not exist, the former method will return an empty
# array, the latter an empty string.  The simplest way to test for existence
# of a parameter is by the #has_key? method.
#
# === Cookies
#
# HTTP Cookies are automatically parsed from the request.  They are available
# from the #cookies() accessor, which returns a hash from cookie name to
# CGI::Cookie object.
#
# === Multipart requests
#
# If a request's method is POST and its content type is multipart/form-data,
# then it may contain uploaded files.  These are stored by the QueryExtension
# module in the parameters of the request.  The parameter name is the name
# attribute of the file input field, as usual.  However, the value is not
# a string, but an IO object, either an IOString for small files, or a
# Tempfile for larger ones.  This object also has the additional singleton
# methods:
#
# #local_path():: the path of the uploaded file on the local filesystem
# #original_filename():: the name of the file on the client computer
# #content_type():: the content type of the file
#
# == Responses
#
# The CGI class provides methods for sending header and content output to
# the HTTP client, and mixes in methods for programmatic HTML generation
# from CGI::HtmlExtension and CGI::TagMaker modules.  The precise version of HTML
# to use for HTML generation is specified at object creation time.
#
# === Writing output
#
# The simplest way to send output to the HTTP client is using the #out() method.
# This takes the HTTP headers as a hash parameter, and the body content
# via a block.  The headers can be generated as a string using the #http_header()
# method.  The output stream can be written directly to using the #print()
# method.
#
# === Generating HTML
#
# Each HTML element has a corresponding method for generating that
# element as a String.  The name of this method is the same as that
# of the element, all lowercase.  The attributes of the element are
# passed in as a hash, and the body as a no-argument block that evaluates
# to a String.  The HTML generation module knows which elements are
# always empty, and silently drops any passed-in body.  It also knows
# which elements require matching closing tags and which don't.  However,
# it does not know what attributes are legal for which elements.
#
# There are also some additional HTML generation methods mixed in from
# the CGI::HtmlExtension module.  These include individual methods for the
# different types of form inputs, and methods for elements that commonly
# take particular attributes where the attributes can be directly specified
# as arguments, rather than via a hash.
#
# === Utility HTML escape and other methods like a function.
#
# There are some utility tool defined in cgi/util.rb .
# And when include, you can use utility methods like a function.
#
# == Examples of use
#
# === Get form values
#
#   require "cgi"
#   cgi = CGI.new
#   value = cgi['field_name']   # <== value string for 'field_name'
#     # if not 'field_name' included, then return "".
#   fields = cgi.keys            # <== array of field names
#
#   # returns true if form has 'field_name'
#   cgi.has_key?('field_name')
#   cgi.has_key?('field_name')
#   cgi.include?('field_name')
#
# CAUTION! <code>cgi['field_name']</code> returned an Array with the old
# cgi.rb(included in Ruby 1.6)
#
# === Get form values as hash
#
#   require "cgi"
#   cgi = CGI.new
#   params = cgi.params
#
# cgi.params is a hash.
#
#   cgi.params['new_field_name'] = ["value"]  # add new param
#   cgi.params['field_name'] = ["new_value"]  # change value
#   cgi.params.delete('field_name')           # delete param
#   cgi.params.clear                          # delete all params
#
#
# === Save form values to file
#
#   require "pstore"
#   db = PStore.new("query.db")
#   db.transaction do
#     db["params"] = cgi.params
#   end
#
#
# === Restore form values from file
#
#   require "pstore"
#   db = PStore.new("query.db")
#   db.transaction do
#     cgi.params = db["params"]
#   end
#
#
# === Get multipart form values
#
#   require "cgi"
#   cgi = CGI.new
#   value = cgi['field_name']   # <== value string for 'field_name'
#   value.read                  # <== body of value
#   value.local_path            # <== path to local file of value
#   value.original_filename     # <== original filename of value
#   value.content_type          # <== content_type of value
#
# and value has StringIO or Tempfile class methods.
#
# === Get cookie values
#
#   require "cgi"
#   cgi = CGI.new
#   values = cgi.cookies['name']  # <== array of 'name'
#     # if not 'name' included, then return [].
#   names = cgi.cookies.keys      # <== array of cookie names
#
# and cgi.cookies is a hash.
#
# === Get cookie objects
#
#   require "cgi"
#   cgi = CGI.new
#   for name, cookie in cgi.cookies
#     cookie.expires = Time.now + 30
#   end
#   cgi.out("cookie" => cgi.cookies) {"string"}
#
#   cgi.cookies # { "name1" => cookie1, "name2" => cookie2, ... }
#
#   require "cgi"
#   cgi = CGI.new
#   cgi.cookies['name'].expires = Time.now + 30
#   cgi.out("cookie" => cgi.cookies['name']) {"string"}
#
# === Print http header and html string to $DEFAULT_OUTPUT ($>)
#
#   require "cgi"
#   cgi = CGI.new("html4")  # add HTML generation methods
#   cgi.out do
#     cgi.html do
#       cgi.head do
#         cgi.title { "TITLE" }
#       end +
#       cgi.body do
#         cgi.form("ACTION" => "uri") do
#           cgi.p do
#             cgi.textarea("get_text") +
#             cgi.br +
#             cgi.submit
#           end
#         end +
#         cgi.pre do
#           CGI.escapeHTML(
#             "params: #{cgi.params.inspect}\n" +
#             "cookies: #{cgi.cookies.inspect}\n" +
#             ENV.collect do |key, value|
#               "#{key} --> #{value}\n"
#             end.join("")
#           )
#         end
#       end
#     end
#   end
#
#   # add HTML generation methods
#   CGI.new("html3")    # html3.2
#   CGI.new("html4")    # html4.01 (Strict)
#   CGI.new("html4Tr")  # html4.01 Transitional
#   CGI.new("html4Fr")  # html4.01 Frameset
#   CGI.new("html5")    # html5
#
# === Some utility methods
#
#   require 'cgi/util'
#   CGI.escapeHTML('Usage: foo "bar" <baz>')
#
#
# === Some utility methods like a function
#
#   require 'cgi/util'
#   include CGI::Util
#   escapeHTML('Usage: foo "bar" <baz>')
#   h('Usage: foo "bar" <baz>') # alias
#
#

class CGI
  VERSION = "0.3.7"
end

require 'cgi/core'
require 'cgi/cookie'
require 'cgi/util'
CGI.autoload(:HtmlExtension, 'cgi/html')
PK}$[u&E,,ruby/ripper/sexp.rbnu�[���# frozen_string_literal: true
#
# $Id$
#
# Copyright (c) 2004,2005 Minero Aoki
#
# This program is free software.
# You can distribute and/or modify this program under the Ruby License.
# For details of Ruby License, see ruby/COPYING.
#

require 'ripper/core'

class Ripper

  # [EXPERIMENTAL]
  # Parses +src+ and create S-exp tree.
  # Returns more readable tree rather than Ripper.sexp_raw.
  # This method is mainly for developer use.
  # The +filename+ argument is mostly ignored.
  # By default, this method does not handle syntax errors in +src+,
  # returning +nil+ in such cases. Use the +raise_errors+ keyword
  # to raise a SyntaxError for an error in +src+.
  #
  #   require 'ripper'
  #   require 'pp'
  #
  #   pp Ripper.sexp("def m(a) nil end")
  #     #=> [:program,
  #          [[:def,
  #           [:@ident, "m", [1, 4]],
  #           [:paren, [:params, [[:@ident, "a", [1, 6]]], nil, nil, nil, nil, nil, nil]],
  #           [:bodystmt, [[:var_ref, [:@kw, "nil", [1, 9]]]], nil, nil, nil]]]]
  #
  def Ripper.sexp(src, filename = '-', lineno = 1, raise_errors: false)
    builder = SexpBuilderPP.new(src, filename, lineno)
    sexp = builder.parse
    if builder.error?
      if raise_errors
        raise SyntaxError, builder.error
      end
    else
      sexp
    end
  end

  # [EXPERIMENTAL]
  # Parses +src+ and create S-exp tree.
  # This method is mainly for developer use.
  # The +filename+ argument is mostly ignored.
  # By default, this method does not handle syntax errors in +src+,
  # returning +nil+ in such cases. Use the +raise_errors+ keyword
  # to raise a SyntaxError for an error in +src+.
  #
  #   require 'ripper'
  #   require 'pp'
  #
  #   pp Ripper.sexp_raw("def m(a) nil end")
  #     #=> [:program,
  #          [:stmts_add,
  #           [:stmts_new],
  #           [:def,
  #            [:@ident, "m", [1, 4]],
  #            [:paren, [:params, [[:@ident, "a", [1, 6]]], nil, nil, nil]],
  #            [:bodystmt,
  #             [:stmts_add, [:stmts_new], [:var_ref, [:@kw, "nil", [1, 9]]]],
  #             nil,
  #             nil,
  #             nil]]]]
  #
  def Ripper.sexp_raw(src, filename = '-', lineno = 1, raise_errors: false)
    builder = SexpBuilder.new(src, filename, lineno)
    sexp = builder.parse
    if builder.error?
      if raise_errors
        raise SyntaxError, builder.error
      end
    else
      sexp
    end
  end

  class SexpBuilder < ::Ripper   #:nodoc:
    attr_reader :error

    private

    def dedent_element(e, width)
      if (n = dedent_string(e[1], width)) > 0
        e[2][1] += n
      end
      e
    end

    def on_heredoc_dedent(val, width)
      sub = proc do |cont|
        cont.map! do |e|
          if Array === e
            case e[0]
            when :@tstring_content
              e = dedent_element(e, width)
            when /_add\z/
              e[1] = sub[e[1]]
            end
          elsif String === e
            dedent_string(e, width)
          end
          e
        end
      end
      sub[val]
      val
    end

    events = private_instance_methods(false).grep(/\Aon_/) {$'.to_sym}
    (PARSER_EVENTS - events).each do |event|
      module_eval(<<-End, __FILE__, __LINE__ + 1)
        def on_#{event}(*args)
          args.unshift :#{event}
          args
        end
      End
    end

    SCANNER_EVENTS.each do |event|
      module_eval(<<-End, __FILE__, __LINE__ + 1)
        def on_#{event}(tok)
          [:@#{event}, tok, [lineno(), column()]]
        end
      End
    end

    def on_error(mesg)
      @error = mesg
    end
    remove_method :on_parse_error
    alias on_parse_error on_error
    alias compile_error on_error
  end

  class SexpBuilderPP < SexpBuilder #:nodoc:
    private

    def on_heredoc_dedent(val, width)
      val.map! do |e|
        next e if Symbol === e and /_content\z/ =~ e
        if Array === e and e[0] == :@tstring_content
          e = dedent_element(e, width)
        elsif String === e
          dedent_string(e, width)
        end
        e
      end
      val
    end

    def _dispatch_event_new
      []
    end

    def _dispatch_event_push(list, item)
      list.push item
      list
    end

    def on_mlhs_paren(list)
      [:mlhs, *list]
    end

    def on_mlhs_add_star(list, star)
      list.push([:rest_param, star])
    end

    def on_mlhs_add_post(list, post)
      list.concat(post)
    end

    PARSER_EVENT_TABLE.each do |event, arity|
      if /_new\z/ =~ event and arity == 0
        alias_method "on_#{event}", :_dispatch_event_new
      elsif /_add\z/ =~ event
        alias_method "on_#{event}", :_dispatch_event_push
      end
    end
  end

end
PK}$[�m;&&ruby/ripper/lexer.rbnu�[���# frozen_string_literal: true
#
# $Id$
#
# Copyright (c) 2004,2005 Minero Aoki
#
# This program is free software.
# You can distribute and/or modify this program under the Ruby License.
# For details of Ruby License, see ruby/COPYING.
#

require 'ripper/core'

class Ripper

  # Tokenizes the Ruby program and returns an array of strings.
  # The +filename+ and +lineno+ arguments are mostly ignored, since the
  # return value is just the tokenized input.
  # By default, this method does not handle syntax errors in +src+,
  # use the +raise_errors+ keyword to raise a SyntaxError for an error in +src+.
  #
  #   p Ripper.tokenize("def m(a) nil end")
  #      # => ["def", " ", "m", "(", "a", ")", " ", "nil", " ", "end"]
  #
  def Ripper.tokenize(src, filename = '-', lineno = 1, **kw)
    Lexer.new(src, filename, lineno).tokenize(**kw)
  end

  # Tokenizes the Ruby program and returns an array of an array,
  # which is formatted like
  # <code>[[lineno, column], type, token, state]</code>.
  # The +filename+ argument is mostly ignored.
  # By default, this method does not handle syntax errors in +src+,
  # use the +raise_errors+ keyword to raise a SyntaxError for an error in +src+.
  #
  #   require 'ripper'
  #   require 'pp'
  #
  #   pp Ripper.lex("def m(a) nil end")
  #   #=> [[[1,  0], :on_kw,     "def", FNAME    ],
  #        [[1,  3], :on_sp,     " ",   FNAME    ],
  #        [[1,  4], :on_ident,  "m",   ENDFN    ],
  #        [[1,  5], :on_lparen, "(",   BEG|LABEL],
  #        [[1,  6], :on_ident,  "a",   ARG      ],
  #        [[1,  7], :on_rparen, ")",   ENDFN    ],
  #        [[1,  8], :on_sp,     " ",   BEG      ],
  #        [[1,  9], :on_kw,     "nil", END      ],
  #        [[1, 12], :on_sp,     " ",   END      ],
  #        [[1, 13], :on_kw,     "end", END      ]]
  #
  def Ripper.lex(src, filename = '-', lineno = 1, **kw)
    Lexer.new(src, filename, lineno).lex(**kw)
  end

  class Lexer < ::Ripper   #:nodoc: internal use only
    class State
      attr_reader :to_int, :to_s

      def initialize(i)
        @to_int = i
        @to_s = Ripper.lex_state_name(i)
        freeze
      end

      def [](index)
        case index
        when 0, :to_int
          @to_int
        when 1, :to_s
          @event
        else
          nil
        end
      end

      alias to_i to_int
      alias inspect to_s
      def pretty_print(q) q.text(to_s) end
      def ==(i) super or to_int == i end
      def &(i) self.class.new(to_int & i) end
      def |(i) self.class.new(to_int | i) end
      def allbits?(i) to_int.allbits?(i) end
      def anybits?(i) to_int.anybits?(i) end
      def nobits?(i) to_int.nobits?(i) end
    end

    class Elem
      attr_accessor :pos, :event, :tok, :state, :message

      def initialize(pos, event, tok, state, message = nil)
        @pos = pos
        @event = event
        @tok = tok
        @state = State.new(state)
        @message = message
      end

      def [](index)
        case index
        when 0, :pos
          @pos
        when 1, :event
          @event
        when 2, :tok
          @tok
        when 3, :state
          @state
        when 4, :message
          @message
        else
          nil
        end
      end

      def inspect
        "#<#{self.class}: #{event}@#{pos[0]}:#{pos[1]}:#{state}: #{tok.inspect}#{": " if message}#{message}>"
      end

      alias to_s inspect

      def pretty_print(q)
        q.group(2, "#<#{self.class}:", ">") {
          q.breakable
          q.text("#{event}@#{pos[0]}:#{pos[1]}")
          q.breakable
          state.pretty_print(q)
          q.breakable
          q.text("token: ")
          tok.pretty_print(q)
          if message
            q.breakable
            q.text("message: ")
            q.text(message)
          end
        }
      end

      def to_a
        if @message
          [@pos, @event, @tok, @state, @message]
        else
          [@pos, @event, @tok, @state]
        end
      end
    end

    attr_reader :errors

    def tokenize(**kw)
      parse(**kw).sort_by(&:pos).map(&:tok)
    end

    def lex(**kw)
      parse(**kw).sort_by(&:pos).map(&:to_a)
    end

    # parse the code and returns elements including errors.
    def scan(**kw)
      result = (parse(**kw) + errors + @stack.flatten).uniq.sort_by {|e| [*e.pos, (e.message ? -1 : 0)]}
      result.each_with_index do |e, i|
        if e.event == :on_parse_error and e.tok.empty? and (pre = result[i-1]) and
          pre.pos[0] == e.pos[0] and (pre.pos[1] + pre.tok.size) == e.pos[1]
          e.tok = pre.tok
          e.pos[1] = pre.pos[1]
          result[i-1] = e
          result[i] = pre
        end
      end
      result
    end

    def parse(raise_errors: false)
      @errors = []
      @buf = []
      @stack = []
      super()
      @buf = @stack.pop unless @stack.empty?
      if raise_errors and !@errors.empty?
        raise SyntaxError, @errors.map(&:message).join(' ;')
      end
      @buf.flatten!
      unless (result = @buf).empty?
        result.concat(@buf) until (@buf = []; super(); @buf.flatten!; @buf.empty?)
      end
      result
    end

    private

    unless SCANNER_EVENT_TABLE.key?(:ignored_sp)
      SCANNER_EVENT_TABLE[:ignored_sp] = 1
      SCANNER_EVENTS << :ignored_sp
      EVENTS << :ignored_sp
    end

    def on_heredoc_dedent(v, w)
      ignored_sp = []
      heredoc = @buf.last
      if Array === heredoc
        heredoc.each_with_index do |e, i|
          if Elem === e and e.event == :on_tstring_content and e.pos[1].zero?
            tok = e.tok.dup if w > 0 and /\A\s/ =~ e.tok
            if (n = dedent_string(e.tok, w)) > 0
              if e.tok.empty?
                e.tok = tok[0, n]
                e.event = :on_ignored_sp
                next
              end
              ignored_sp << [i, Elem.new(e.pos.dup, :on_ignored_sp, tok[0, n], e.state)]
              e.pos[1] += n
            end
          end
        end
      end
      ignored_sp.reverse_each do |i, e|
        heredoc[i, 0] = [e]
      end
      v
    end

    def on_heredoc_beg(tok)
      @stack.push @buf
      buf = []
      @buf.push buf
      @buf = buf
      @buf.push Elem.new([lineno(), column()], __callee__, tok, state())
    end

    def on_heredoc_end(tok)
      @buf.push Elem.new([lineno(), column()], __callee__, tok, state())
      @buf = @stack.pop
    end

    def _push_token(tok)
      e = Elem.new([lineno(), column()], __callee__, tok, state())
      @buf.push(e)
      e
    end

    def on_error1(mesg)
      @errors.push Elem.new([lineno(), column()], __callee__, token(), state(), mesg)
    end

    def on_error2(mesg, elem)
      @errors.push Elem.new(elem.pos, __callee__, elem.tok, elem.state, mesg)
    end
    PARSER_EVENTS.grep(/_error\z/) do |e|
      arity = PARSER_EVENT_TABLE.fetch(e)
      alias_method "on_#{e}", "on_error#{arity}"
    end
    alias compile_error on_error1

    (SCANNER_EVENTS.map {|event|:"on_#{event}"} - private_instance_methods(false)).each do |event|
      alias_method event, :_push_token
    end
  end

  # [EXPERIMENTAL]
  # Parses +src+ and return a string which was matched to +pattern+.
  # +pattern+ should be described as Regexp.
  #
  #   require 'ripper'
  #
  #   p Ripper.slice('def m(a) nil end', 'ident')                   #=> "m"
  #   p Ripper.slice('def m(a) nil end', '[ident lparen rparen]+')  #=> "m(a)"
  #   p Ripper.slice("<<EOS\nstring\nEOS",
  #                  'heredoc_beg nl $(tstring_content*) heredoc_end', 1)
  #       #=> "string\n"
  #
  def Ripper.slice(src, pattern, n = 0)
    if m = token_match(src, pattern)
    then m.string(n)
    else nil
    end
  end

  def Ripper.token_match(src, pattern)   #:nodoc:
    TokenPattern.compile(pattern).match(src)
  end

  class TokenPattern   #:nodoc:

    class Error < ::StandardError # :nodoc:
    end
    class CompileError < Error # :nodoc:
    end
    class MatchError < Error # :nodoc:
    end

    class << self
      alias compile new
    end

    def initialize(pattern)
      @source = pattern
      @re = compile(pattern)
    end

    def match(str)
      match_list(::Ripper.lex(str))
    end

    def match_list(tokens)
      if m = @re.match(map_tokens(tokens))
      then MatchData.new(tokens, m)
      else nil
      end
    end

    private

    def compile(pattern)
      if m = /[^\w\s$()\[\]{}?*+\.]/.match(pattern)
        raise CompileError, "invalid char in pattern: #{m[0].inspect}"
      end
      buf = +''
      pattern.scan(/(?:\w+|\$\(|[()\[\]\{\}?*+\.]+)/) do |tok|
        case tok
        when /\w/
          buf.concat map_token(tok)
        when '$('
          buf.concat '('
        when '('
          buf.concat '(?:'
        when /[?*\[\])\.]/
          buf.concat tok
        else
          raise 'must not happen'
        end
      end
      Regexp.compile(buf)
    rescue RegexpError => err
      raise CompileError, err.message
    end

    def map_tokens(tokens)
      tokens.map {|pos,type,str| map_token(type.to_s.delete_prefix('on_')) }.join
    end

    MAP = {}
    seed = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a
    SCANNER_EVENT_TABLE.each do |ev, |
      raise CompileError, "[RIPPER FATAL] too many system token" if seed.empty?
      MAP[ev.to_s.delete_prefix('on_')] = seed.shift
    end

    def map_token(tok)
      MAP[tok]  or raise CompileError, "unknown token: #{tok}"
    end

    class MatchData # :nodoc:
      def initialize(tokens, match)
        @tokens = tokens
        @match = match
      end

      def string(n = 0)
        return nil unless @match
        match(n).join
      end

      private

      def match(n = 0)
        return [] unless @match
        @tokens[@match.begin(n)...@match.end(n)].map {|pos,type,str| str }
      end
    end

  end

end
PK}$[��Cppruby/ripper/filter.rbnu�[���# frozen_string_literal: true
#
# $Id$
#
# Copyright (c) 2004,2005 Minero Aoki
#
# This program is free software.
# You can distribute and/or modify this program under the Ruby License.
# For details of Ruby License, see ruby/COPYING.
#

require 'ripper/lexer'

class Ripper

  # This class handles only scanner events,
  # which are dispatched in the 'right' order (same with input).
  class Filter

    # Creates a new Ripper::Filter instance, passes parameters +src+,
    # +filename+, and +lineno+ to Ripper::Lexer.new
    #
    # The lexer is for internal use only.
    def initialize(src, filename = '-', lineno = 1)
      @__lexer = Lexer.new(src, filename, lineno)
      @__line = nil
      @__col = nil
      @__state = nil
    end

    # The file name of the input.
    def filename
      @__lexer.filename
    end

    # The line number of the current token.
    # This value starts from 1.
    # This method is valid only in event handlers.
    def lineno
      @__line
    end

    # The column number of the current token.
    # This value starts from 0.
    # This method is valid only in event handlers.
    def column
      @__col
    end

    # The scanner's state of the current token.
    # This value is the bitwise OR of zero or more of the +Ripper::EXPR_*+ constants.
    def state
      @__state
    end

    # Starts the parser.
    # +init+ is a data accumulator and is passed to the next event handler (as
    # of Enumerable#inject).
    def parse(init = nil)
      data = init
      @__lexer.lex.each do |pos, event, tok, state|
        @__line, @__col = *pos
        @__state = state
        data = if respond_to?(event, true)
               then __send__(event, tok, data)
               else on_default(event, tok, data)
               end
      end
      data
    end

    private

    # This method is called when some event handler is undefined.
    # +event+ is :on_XXX, +token+ is the scanned token, and +data+ is a data
    # accumulator.
    #
    # The return value of this method is passed to the next event handler (as
    # of Enumerable#inject).
    def on_default(event, token, data)
      data
    end

  end

end
PK}$[ڮ�R��ruby/ripper/core.rbnu�[���# frozen_string_literal: true
#
# $Id$
#
# Copyright (c) 2003-2005 Minero Aoki
#
# This program is free software.
# You can distribute and/or modify this program under the Ruby License.
# For details of Ruby License, see ruby/COPYING.
#

require 'ripper.so'

class Ripper

  # Parses the given Ruby program read from +src+.
  # +src+ must be a String or an IO or a object with a #gets method.
  def Ripper.parse(src, filename = '(ripper)', lineno = 1)
    new(src, filename, lineno).parse
  end

  # This array contains name of parser events.
  PARSER_EVENTS = PARSER_EVENT_TABLE.keys

  # This array contains name of scanner events.
  SCANNER_EVENTS = SCANNER_EVENT_TABLE.keys

  # This array contains name of all ripper events.
  EVENTS = PARSER_EVENTS + SCANNER_EVENTS

  private

  # :stopdoc:
  def _dispatch_0() nil end
  def _dispatch_1(a) a end
  def _dispatch_2(a, b) a end
  def _dispatch_3(a, b, c) a end
  def _dispatch_4(a, b, c, d) a end
  def _dispatch_5(a, b, c, d, e) a end
  def _dispatch_6(a, b, c, d, e, f) a end
  def _dispatch_7(a, b, c, d, e, f, g) a end
  # :startdoc:

  #
  # Parser Events
  #

  PARSER_EVENT_TABLE.each do |id, arity|
    alias_method "on_#{id}", "_dispatch_#{arity}"
  end

  # This method is called when weak warning is produced by the parser.
  # +fmt+ and +args+ is printf style.
  def warn(fmt, *args)
  end

  # This method is called when strong warning is produced by the parser.
  # +fmt+ and +args+ is printf style.
  def warning(fmt, *args)
  end

  # This method is called when the parser found syntax error.
  def compile_error(msg)
  end

  #
  # Scanner Events
  #

  SCANNER_EVENTS.each do |id|
    alias_method "on_#{id}", :_dispatch_1
  end

end
PK}$[`�T�

ruby/resolv-replace.rbnu�[���# frozen_string_literal: true

require 'socket'
require 'resolv'

class << IPSocket
  # :stopdoc:
  alias original_resolv_getaddress getaddress
  # :startdoc:
  def getaddress(host)
    begin
      return Resolv.getaddress(host).to_s
    rescue Resolv::ResolvError
      raise SocketError, "Hostname not known: #{host}"
    end
  end
end

class TCPSocket < IPSocket
  # :stopdoc:
  alias original_resolv_initialize initialize
  # :startdoc:
  def initialize(host, serv, *rest)
    rest[0] = IPSocket.getaddress(rest[0]) if rest[0]
    original_resolv_initialize(IPSocket.getaddress(host), serv, *rest)
  end
end

class UDPSocket < IPSocket
  # :stopdoc:
  alias original_resolv_bind bind
  # :startdoc:
  def bind(host, port)
    host = IPSocket.getaddress(host) if host != ""
    original_resolv_bind(host, port)
  end

  # :stopdoc:
  alias original_resolv_connect connect
  # :startdoc:
  def connect(host, port)
    original_resolv_connect(IPSocket.getaddress(host), port)
  end

  # :stopdoc:
  alias original_resolv_send send
  # :startdoc:
  def send(mesg, flags, *rest)
    if rest.length == 2
      host, port = rest
      begin
        addrs = Resolv.getaddresses(host)
      rescue Resolv::ResolvError
        raise SocketError, "Hostname not known: #{host}"
      end
      addrs[0...-1].each {|addr|
        begin
          return original_resolv_send(mesg, flags, addr, port)
        rescue SystemCallError
        end
      }
      original_resolv_send(mesg, flags, addrs[-1], port)
    else
      original_resolv_send(mesg, flags, *rest)
    end
  end
end

class SOCKSSocket < TCPSocket
  # :stopdoc:
  alias original_resolv_initialize initialize
  # :startdoc:
  def initialize(host, serv)
    original_resolv_initialize(IPSocket.getaddress(host), port)
  end
end if defined? SOCKSSocket
PK}$[)�Ar11ruby/did_you_mean/version.rbnu�[���module DidYouMean
  VERSION = "1.6.1".freeze
end
PK}$[T�~1ruby/did_you_mean/formatters/verbose_formatter.rbnu�[���warn "`require 'did_you_mean/formatters/verbose_formatter'` is deprecated and falls back to the default formatter. "

require_relative '../formatter'

# frozen-string-literal: true
module DidYouMean
  # For compatibility:
  VerboseFormatter = Formatter
end
PK}$[a�~��/ruby/did_you_mean/formatters/plain_formatter.rbnu�[���require_relative '../formatter'

warn "`require 'did_you_mean/formatters/plain_formatter'` is deprecated. Please `require 'did_you_mean/formatter'` " \
     "instead."
PK}$[T��)��5ruby/did_you_mean/spell_checkers/key_error_checker.rbnu�[���require_relative "../spell_checker"

module DidYouMean
  class KeyErrorChecker
    def initialize(key_error)
      @key = key_error.key
      @keys = key_error.receiver.keys
    end

    def corrections
      @corrections ||= exact_matches.empty? ? SpellChecker.new(dictionary: @keys).correct(@key).map(&:inspect) : exact_matches
    end

    private

    def exact_matches
      @exact_matches ||= @keys.select { |word| @key == word.to_s }.map(&:inspect)
    end
  end
end
PK}$[!s����8ruby/did_you_mean/spell_checkers/require_path_checker.rbnu�[���# frozen-string-literal: true

require_relative "../spell_checker"
require_relative "../tree_spell_checker"
require "rbconfig"

module DidYouMean
  class RequirePathChecker
    attr_reader :path

    INITIAL_LOAD_PATH = $LOAD_PATH.dup.freeze
    Ractor.make_shareable(INITIAL_LOAD_PATH) if defined?(Ractor)

    ENV_SPECIFIC_EXT = ".#{RbConfig::CONFIG["DLEXT"]}"
    Ractor.make_shareable(ENV_SPECIFIC_EXT) if defined?(Ractor)

    private_constant :INITIAL_LOAD_PATH, :ENV_SPECIFIC_EXT

    def self.requireables
      @requireables ||= INITIAL_LOAD_PATH
                          .flat_map {|path| Dir.glob("**/???*{.rb,#{ENV_SPECIFIC_EXT}}", base: path) }
                          .map {|path| path.chomp!(".rb") || path.chomp!(ENV_SPECIFIC_EXT) }
    end

    def initialize(exception)
      @path = exception.path
    end

    def corrections
      @corrections ||= begin
                         threshold     = path.size * 2
                         dictionary    = self.class.requireables.reject {|str| str.size >= threshold }
                         spell_checker = path.include?("/") ? TreeSpellChecker : SpellChecker

                         spell_checker.new(dictionary: dictionary).correct(path).uniq
                       end
    end
  end
end
PK}$[��xHHMruby/did_you_mean/spell_checkers/name_error_checkers/variable_name_checker.rbnu�[���# frozen-string-literal: true

require_relative "../../spell_checker"

module DidYouMean
  class VariableNameChecker
    attr_reader :name, :method_names, :lvar_names, :ivar_names, :cvar_names

    NAMES_TO_EXCLUDE = { 'foo' => [:fork, :for] }
    NAMES_TO_EXCLUDE.default = []
    Ractor.make_shareable(NAMES_TO_EXCLUDE) if defined?(Ractor)

    # +VariableNameChecker::RB_RESERVED_WORDS+ is the list of all reserved
    # words in Ruby. They could be declared like methods are, and a typo would
    # cause Ruby to raise a +NameError+ because of the way they are declared.
    #
    # The +:VariableNameChecker+ will use this list to suggest a reversed word
    # if a +NameError+ is raised and found closest matches, excluding:
    #
    #   * +do+
    #   * +if+
    #   * +in+
    #   * +or+
    #
    # Also see +MethodNameChecker::RB_RESERVED_WORDS+.
    RB_RESERVED_WORDS = %i(
      BEGIN
      END
      alias
      and
      begin
      break
      case
      class
      def
      defined?
      else
      elsif
      end
      ensure
      false
      for
      module
      next
      nil
      not
      redo
      rescue
      retry
      return
      self
      super
      then
      true
      undef
      unless
      until
      when
      while
      yield
      __LINE__
      __FILE__
      __ENCODING__
    )

    Ractor.make_shareable(RB_RESERVED_WORDS) if defined?(Ractor)

    def initialize(exception)
      @name       = exception.name.to_s.tr("@", "")
      @lvar_names = exception.respond_to?(:local_variables) ? exception.local_variables : []
      receiver    = exception.receiver

      @method_names = receiver.methods + receiver.private_methods
      @ivar_names   = receiver.instance_variables
      @cvar_names   = receiver.class.class_variables
      @cvar_names  += receiver.class_variables if receiver.kind_of?(Module)
    end

    def corrections
      @corrections ||= SpellChecker
                     .new(dictionary: (RB_RESERVED_WORDS + lvar_names + method_names + ivar_names + cvar_names))
                     .correct(name) - NAMES_TO_EXCLUDE[@name]
    end
  end
end
PK}$[�l'��Jruby/did_you_mean/spell_checkers/name_error_checkers/class_name_checker.rbnu�[���# frozen-string-literal: true

require_relative "../../spell_checker"

module DidYouMean
  class ClassNameChecker
    attr_reader :class_name

    def initialize(exception)
      @class_name, @receiver, @original_message = exception.name, exception.receiver, exception.original_message
    end

    def corrections
      @corrections ||= SpellChecker.new(dictionary: class_names)
                         .correct(class_name)
                         .map(&:full_name)
                         .reject {|qualified_name| @original_message.include?(qualified_name) }
    end

    def class_names
      scopes.flat_map do |scope|
        scope.constants.map do |c|
          ClassName.new(c, scope == Object ? "" : "#{scope}::")
        end
      end
    end

    def scopes
      @scopes ||= @receiver.to_s.split("::").inject([Object]) do |_scopes, scope|
        _scopes << _scopes.last.const_get(scope)
      end.uniq
    end

    class ClassName < String
      attr :namespace

      def initialize(name, namespace = '')
        super(name.to_s)
        @namespace = namespace
      end

      def full_name
        self.class.new("#{namespace}#{self}")
      end
    end

    private_constant :ClassName
  end
end
PK}$[	���hh0ruby/did_you_mean/spell_checkers/null_checker.rbnu�[���module DidYouMean
  class NullChecker
    def initialize(*);  end
    def corrections; [] end
  end
end
PK}$[+*�777ruby/did_you_mean/spell_checkers/name_error_checkers.rbnu�[���require_relative 'name_error_checkers/class_name_checker'
require_relative 'name_error_checkers/variable_name_checker'

module DidYouMean
  class << (NameErrorCheckers = Object.new)
    def new(exception)
      case exception.original_message
      when /uninitialized constant/
        ClassNameChecker
      when /undefined local variable or method/,
           /undefined method/,
           /uninitialized class variable/,
           /no member '.*' in struct/
        VariableNameChecker
      else
        NullChecker
      end.new(exception)
    end
  end
end
PK}$[F���7ruby/did_you_mean/spell_checkers/method_name_checker.rbnu�[���require_relative "../spell_checker"

module DidYouMean
  class MethodNameChecker
    attr_reader :method_name, :receiver

    NAMES_TO_EXCLUDE = { NilClass => nil.methods }
    NAMES_TO_EXCLUDE.default = []
    Ractor.make_shareable(NAMES_TO_EXCLUDE) if defined?(Ractor)

    # +MethodNameChecker::RB_RESERVED_WORDS+ is the list of reserved words in
    # Ruby that take an argument. Unlike
    # +VariableNameChecker::RB_RESERVED_WORDS+, these reserved words require
    # an argument, and a +NoMethodError+ is raised due to the presence of the
    # argument.
    #
    # The +MethodNameChecker+ will use this list to suggest a reversed word if
    # a +NoMethodError+ is raised and found closest matches.
    #
    # Also see +VariableNameChecker::RB_RESERVED_WORDS+.
    RB_RESERVED_WORDS = %i(
      alias
      case
      def
      defined?
      elsif
      end
      ensure
      for
      rescue
      super
      undef
      unless
      until
      when
      while
      yield
    )

    Ractor.make_shareable(RB_RESERVED_WORDS) if defined?(Ractor)

    def initialize(exception)
      @method_name  = exception.name
      @receiver     = exception.receiver
      @private_call = exception.respond_to?(:private_call?) ? exception.private_call? : false
    end

    def corrections
      @corrections ||= begin
                         dictionary = method_names
                         dictionary = RB_RESERVED_WORDS + dictionary if @private_call

                         SpellChecker.new(dictionary: dictionary).correct(method_name) - names_to_exclude
                       end
    end

    def method_names
      if Object === receiver
        method_names = receiver.methods + receiver.singleton_methods
        method_names += receiver.private_methods if @private_call
        method_names.uniq!
        method_names
      else
        []
      end
    end

    def names_to_exclude
      Object === receiver ? NAMES_TO_EXCLUDE[receiver.class] : []
    end
  end
end
PK}$[�B
�<ruby/did_you_mean/spell_checkers/pattern_key_name_checker.rbnu�[���require_relative "../spell_checker"

module DidYouMean
  class PatternKeyNameChecker
    def initialize(no_matching_pattern_key_error)
      @key = no_matching_pattern_key_error.key
      @keys = no_matching_pattern_key_error.matchee.keys
    end

    def corrections
      @corrections ||= exact_matches.empty? ? SpellChecker.new(dictionary: @keys).correct(@key).map(&:inspect) : exact_matches
    end

    private

    def exact_matches
      @exact_matches ||= @keys.select { |word| @key == word.to_s }.map(&:inspect)
    end
  end
end
PK}$[>�"ruby/did_you_mean/spell_checker.rbnu�[���# frozen-string-literal: true

require_relative "levenshtein"
require_relative "jaro_winkler"

module DidYouMean
  class SpellChecker
    def initialize(dictionary:)
      @dictionary = dictionary
    end

    def correct(input)
      normalized_input = normalize(input)
      threshold = normalized_input.length > 3 ? 0.834 : 0.77

      words = @dictionary.select { |word| JaroWinkler.distance(normalize(word), normalized_input) >= threshold }
      words.reject! { |word| input.to_s == word.to_s }
      words.sort_by! { |word| JaroWinkler.distance(word.to_s, normalized_input) }
      words.reverse!

      # Correct mistypes
      threshold   = (normalized_input.length * 0.25).ceil
      corrections = words.select { |c| Levenshtein.distance(normalize(c), normalized_input) <= threshold }

      # Correct misspells
      if corrections.empty?
        corrections = words.select do |word|
          word   = normalize(word)
          length = normalized_input.length < word.length ? normalized_input.length : word.length

          Levenshtein.distance(word, normalized_input) < length
        end.first(1)
      end

      corrections
    end

    private

    def normalize(str_or_symbol) #:nodoc:
      str = str_or_symbol.to_s.downcase
      str.tr!("@", "")
      str
    end
  end
end
PK}$[U1i__ ruby/did_you_mean/levenshtein.rbnu�[���module DidYouMean
  module Levenshtein # :nodoc:
    # This code is based directly on the Text gem implementation
    # Copyright (c) 2006-2013 Paul Battley, Michael Neumann, Tim Fletcher.
    #
    # Returns a value representing the "cost" of transforming str1 into str2
    def distance(str1, str2)
      n = str1.length
      m = str2.length
      return m if n.zero?
      return n if m.zero?

      d = (0..m).to_a
      x = nil

      # to avoid duplicating an enumerable object, create it outside of the loop
      str2_codepoints = str2.codepoints

      str1.each_codepoint.with_index(1) do |char1, i|
        j = 0
        while j < m
          cost = (char1 == str2_codepoints[j]) ? 0 : 1
          x = min3(
            d[j+1] + 1, # insertion
            i + 1,      # deletion
            d[j] + cost # substitution
          )
          d[j] = i
          i = x

          j += 1
        end
        d[m] = x
      end

      x
    end
    module_function :distance

    private

    # detects the minimum value out of three arguments. This method is
    # faster than `[a, b, c].min` and puts less GC pressure.
    # See https://github.com/ruby/did_you_mean/pull/1 for a performance
    # benchmark.
    def min3(a, b, c)
      if a < b && a < c
        a
      elsif b < c
        b
      else
        c
      end
    end
    module_function :min3
  end
end
PK}$[aɣ�))!ruby/did_you_mean/jaro_winkler.rbnu�[���module DidYouMean
  module Jaro
    module_function

    def distance(str1, str2)
      str1, str2 = str2, str1 if str1.length > str2.length
      length1, length2 = str1.length, str2.length

      m          = 0.0
      t          = 0.0
      range      = (length2 / 2).floor - 1
      range      = 0 if range < 0
      flags1     = 0
      flags2     = 0

      # Avoid duplicating enumerable objects
      str1_codepoints = str1.codepoints
      str2_codepoints = str2.codepoints

      i = 0
      while i < length1
        last = i + range
        j    = (i >= range) ? i - range : 0

        while j <= last
          if flags2[j] == 0 && str1_codepoints[i] == str2_codepoints[j]
            flags2 |= (1 << j)
            flags1 |= (1 << i)
            m += 1
            break
          end

          j += 1
        end

        i += 1
      end

      k = i = 0
      while i < length1
        if flags1[i] != 0
          j = index = k

          k = while j < length2
            index = j
            break(j + 1) if flags2[j] != 0

            j += 1
          end

          t += 1 if str1_codepoints[i] != str2_codepoints[index]
        end

        i += 1
      end
      t = (t / 2).floor

      m == 0 ? 0 : (m / length1 + m / length2 + (m - t) / m) / 3
    end
  end

  module JaroWinkler
    WEIGHT    = 0.1
    THRESHOLD = 0.7

    module_function

    def distance(str1, str2)
      jaro_distance = Jaro.distance(str1, str2)

      if jaro_distance > THRESHOLD
        codepoints2  = str2.codepoints
        prefix_bonus = 0

        i = 0
        str1.each_codepoint do |char1|
          char1 == codepoints2[i] && i < 4 ? prefix_bonus += 1 : break
          i += 1
        end

        jaro_distance + (prefix_bonus * WEIGHT * (1 - jaro_distance))
      else
        jaro_distance
      end
    end
  end
end
PK}$[B�H�ruby/did_you_mean/formatter.rbnu�[���# frozen-string-literal: true

module DidYouMean
  # The +DidYouMean::Formatter+ is the basic, default formatter for the
  # gem. The formatter responds to the +message_for+ method and it returns a
  # human readable string.
  class Formatter

    # Returns a human readable string that contains +corrections+. This
    # formatter is designed to be less verbose to not take too much screen
    # space while being helpful enough to the user.
    #
    # @example
    #
    #   formatter = DidYouMean::Formatter.new
    #
    #   # displays suggestions in two lines with the leading empty line
    #   puts formatter.message_for(["methods", "method"])
    #
    #   Did you mean?  methods
    #                   method
    #   # => nil
    #
    #   # displays an empty line
    #   puts formatter.message_for([])
    #
    #   # => nil
    #
    def self.message_for(corrections)
      corrections.empty? ? "" : "\nDid you mean?  #{corrections.join("\n               ")}"
    end

    def message_for(corrections)
      warn "The instance method #message_for has been deprecated. Please use the class method " \
           "DidYouMean::Formatter.message_for(...) instead."

      self.class.message_for(corrections)
    end
  end

  PlainFormatter = Formatter

  deprecate_constant :PlainFormatter
end
PK }$[(�9�99'ruby/did_you_mean/tree_spell_checker.rbnu�[���# frozen_string_literal: true

module DidYouMean
  # spell checker for a dictionary that has a tree
  # structure, see doc/tree_spell_checker_api.md
  class TreeSpellChecker
    attr_reader :dictionary, :separator, :augment

    def initialize(dictionary:, separator: '/', augment: nil)
      @dictionary = dictionary
      @separator = separator
      @augment = augment
    end

    def correct(input)
      plausibles = plausible_dimensions(input)
      return fall_back_to_normal_spell_check(input) if plausibles.empty?

      suggestions = find_suggestions(input, plausibles)
      return fall_back_to_normal_spell_check(input) if suggestions.empty?

      suggestions
    end

    def dictionary_without_leaves
      @dictionary_without_leaves ||= dictionary.map { |word| word.split(separator)[0..-2] }.uniq
    end

    def tree_depth
      @tree_depth ||= dictionary_without_leaves.max { |a, b| a.size <=> b.size }.size
    end

    def dimensions
      @dimensions ||= tree_depth.times.map do |index|
                        dictionary_without_leaves.map { |element| element[index] }.compact.uniq
                      end
    end

    def find_leaves(path)
      path_with_separator = "#{path}#{separator}"

      dictionary
        .select {|str| str.include?(path_with_separator) }
        .map {|str| str.gsub(path_with_separator, '') }
    end

    def plausible_dimensions(input)
      input.split(separator)[0..-2]
        .map
        .with_index { |element, index| correct_element(dimensions[index], element) if dimensions[index] }
        .compact
    end

    def possible_paths(states)
      states.map { |state| state.join(separator) }
    end

    private

    def find_suggestions(input, plausibles)
      states = plausibles[0].product(*plausibles[1..-1])
      paths  = possible_paths(states)
      leaf   = input.split(separator).last

      find_ideas(paths, leaf)
    end

    def fall_back_to_normal_spell_check(input)
      return [] unless augment

      ::DidYouMean::SpellChecker.new(dictionary: dictionary).correct(input)
    end

    def find_ideas(paths, leaf)
      paths.flat_map do |path|
        names = find_leaves(path)
        ideas = correct_element(names, leaf)

        ideas_to_paths(ideas, leaf, names, path)
      end.compact
    end

    def ideas_to_paths(ideas, leaf, names, path)
      if ideas.empty?
        nil
      elsif names.include?(leaf)
        ["#{path}#{separator}#{leaf}"]
      else
        ideas.map {|str| "#{path}#{separator}#{str}" }
      end
    end

    def correct_element(names, element)
      return names if names.size == 1

      str = normalize(element)

      return [str] if names.include?(str)

      ::DidYouMean::SpellChecker.new(dictionary: names).correct(str)
    end

    def normalize(str)
      str.downcase!
      str.tr!('@', ' ') if str.include?('@')
      str
    end
  end
end
PK }$[�x�J��ruby/did_you_mean/verbose.rbnu�[���warn "The verbose formatter has been removed and now `require 'did_you_mean/verbose'` has no effect. Please " \
     "remove this call."
PK }$[=�ܯ�(ruby/did_you_mean/core_ext/name_error.rbnu�[���module DidYouMean
  module Correctable
    SKIP_TO_S_FOR_SUPER_LOOKUP = true
    private_constant :SKIP_TO_S_FOR_SUPER_LOOKUP

    def original_message
      meth = method(:to_s)
      while meth.owner.const_defined?(:SKIP_TO_S_FOR_SUPER_LOOKUP)
        meth = meth.super_method
      end
      meth.call
    end

    def to_s
      msg = super.dup
      suggestion = DidYouMean.formatter.message_for(corrections)

      msg << suggestion if !msg.include?(suggestion)
      msg
    rescue
      super
    end

    def corrections
      @corrections ||= spell_checker.corrections
    end

    def spell_checker
      DidYouMean.spell_checkers[self.class.to_s].new(self)
    end
  end
end
PK }$[\Ն0��!ruby/did_you_mean/experimental.rbnu�[���warn "Experimental features in the did_you_mean gem has been removed " \
     "and `require \"did_you_mean/experimental\"' has no effect."
PK }$[���@O	O	ruby/mutex_m.rbnu�[���# frozen_string_literal: false
#
#   mutex_m.rb -
#       $Release Version: 3.0$
#       $Revision: 1.7 $
#       Original from mutex.rb
#       by Keiju ISHITSUKA(keiju@ishitsuka.com)
#       modified by matz
#       patched by akira yamada
#
# --

# = mutex_m.rb
#
# When 'mutex_m' is required, any object that extends or includes Mutex_m will
# be treated like a Mutex.
#
# Start by requiring the standard library Mutex_m:
#
#   require "mutex_m.rb"
#
# From here you can extend an object with Mutex instance methods:
#
#   obj = Object.new
#   obj.extend Mutex_m
#
# Or mixin Mutex_m into your module to your class inherit Mutex instance
# methods --- remember to call super() in your class initialize method.
#
#   class Foo
#     include Mutex_m
#     def initialize
#       # ...
#       super()
#     end
#     # ...
#   end
#   obj = Foo.new
#   # this obj can be handled like Mutex
#
module Mutex_m

  VERSION = "0.1.1"
  Ractor.make_shareable(VERSION) if defined?(Ractor)

  def Mutex_m.define_aliases(cl) # :nodoc:
    cl.module_eval %q{
      alias locked? mu_locked?
      alias lock mu_lock
      alias unlock mu_unlock
      alias try_lock mu_try_lock
      alias synchronize mu_synchronize
    }
  end

  def Mutex_m.append_features(cl) # :nodoc:
    super
    define_aliases(cl) unless cl.instance_of?(Module)
  end

  def Mutex_m.extend_object(obj) # :nodoc:
    super
    obj.mu_extended
  end

  def mu_extended # :nodoc:
    unless (defined? locked? and
            defined? lock and
            defined? unlock and
            defined? try_lock and
            defined? synchronize)
      Mutex_m.define_aliases(singleton_class)
    end
    mu_initialize
  end

  # See Thread::Mutex#synchronize
  def mu_synchronize(&block)
    @_mutex.synchronize(&block)
  end

  # See Thread::Mutex#locked?
  def mu_locked?
    @_mutex.locked?
  end

  # See Thread::Mutex#try_lock
  def mu_try_lock
    @_mutex.try_lock
  end

  # See Thread::Mutex#lock
  def mu_lock
    @_mutex.lock
  end

  # See Thread::Mutex#unlock
  def mu_unlock
    @_mutex.unlock
  end

  # See Thread::Mutex#sleep
  def sleep(timeout = nil)
    @_mutex.sleep(timeout)
  end

  private

  def mu_initialize # :nodoc:
    @_mutex = Thread::Mutex.new
  end

  def initialize(*args) # :nodoc:
    mu_initialize
    super
  end
  ruby2_keywords(:initialize) if respond_to?(:ruby2_keywords, true)
end
PK }$[�<[���ruby/set/sorted_set.rbnu�[���begin
  require 'sorted_set'
rescue ::LoadError
  raise "The `SortedSet` class has been extracted from the `set` library. " \
        "You must use the `sorted_set` gem or other alternatives."
end
PK }$[�*`ruby/bigdecimal.rbnu�[���require 'bigdecimal.so'
PK }$[	�g%%ruby/open3/version.rbnu�[���module Open3
  VERSION = "0.1.1"
end
PK }$[4�E�?�?ruby/prettyprint.rbnu�[���# frozen_string_literal: true
#
# This class implements a pretty printing algorithm. It finds line breaks and
# nice indentations for grouped structure.
#
# By default, the class assumes that primitive elements are strings and each
# byte in the strings have single column in width. But it can be used for
# other situations by giving suitable arguments for some methods:
# * newline object and space generation block for PrettyPrint.new
# * optional width argument for PrettyPrint#text
# * PrettyPrint#breakable
#
# There are several candidate uses:
# * text formatting using proportional fonts
# * multibyte characters which has columns different to number of bytes
# * non-string formatting
#
# == Bugs
# * Box based formatting?
# * Other (better) model/algorithm?
#
# Report any bugs at http://bugs.ruby-lang.org
#
# == References
# Christian Lindig, Strictly Pretty, March 2000,
# http://www.st.cs.uni-sb.de/~lindig/papers/#pretty
#
# Philip Wadler, A prettier printer, March 1998,
# http://homepages.inf.ed.ac.uk/wadler/topics/language-design.html#prettier
#
# == Author
# Tanaka Akira <akr@fsij.org>
#
class PrettyPrint

  # This is a convenience method which is same as follows:
  #
  #   begin
  #     q = PrettyPrint.new(output, maxwidth, newline, &genspace)
  #     ...
  #     q.flush
  #     output
  #   end
  #
  def PrettyPrint.format(output=''.dup, maxwidth=79, newline="\n", genspace=lambda {|n| ' ' * n})
    q = PrettyPrint.new(output, maxwidth, newline, &genspace)
    yield q
    q.flush
    output
  end

  # This is similar to PrettyPrint::format but the result has no breaks.
  #
  # +maxwidth+, +newline+ and +genspace+ are ignored.
  #
  # The invocation of +breakable+ in the block doesn't break a line and is
  # treated as just an invocation of +text+.
  #
  def PrettyPrint.singleline_format(output=''.dup, maxwidth=nil, newline=nil, genspace=nil)
    q = SingleLine.new(output)
    yield q
    output
  end

  # Creates a buffer for pretty printing.
  #
  # +output+ is an output target. If it is not specified, '' is assumed. It
  # should have a << method which accepts the first argument +obj+ of
  # PrettyPrint#text, the first argument +sep+ of PrettyPrint#breakable, the
  # first argument +newline+ of PrettyPrint.new, and the result of a given
  # block for PrettyPrint.new.
  #
  # +maxwidth+ specifies maximum line length. If it is not specified, 79 is
  # assumed. However actual outputs may overflow +maxwidth+ if long
  # non-breakable texts are provided.
  #
  # +newline+ is used for line breaks. "\n" is used if it is not specified.
  #
  # The block is used to generate spaces. {|width| ' ' * width} is used if it
  # is not given.
  #
  def initialize(output=''.dup, maxwidth=79, newline="\n", &genspace)
    @output = output
    @maxwidth = maxwidth
    @newline = newline
    @genspace = genspace || lambda {|n| ' ' * n}

    @output_width = 0
    @buffer_width = 0
    @buffer = []

    root_group = Group.new(0)
    @group_stack = [root_group]
    @group_queue = GroupQueue.new(root_group)
    @indent = 0
  end

  # The output object.
  #
  # This defaults to '', and should accept the << method
  attr_reader :output

  # The maximum width of a line, before it is separated in to a newline
  #
  # This defaults to 79, and should be an Integer
  attr_reader :maxwidth

  # The value that is appended to +output+ to add a new line.
  #
  # This defaults to "\n", and should be String
  attr_reader :newline

  # A lambda or Proc, that takes one argument, of an Integer, and returns
  # the corresponding number of spaces.
  #
  # By default this is:
  #   lambda {|n| ' ' * n}
  attr_reader :genspace

  # The number of spaces to be indented
  attr_reader :indent

  # The PrettyPrint::GroupQueue of groups in stack to be pretty printed
  attr_reader :group_queue

  # Returns the group most recently added to the stack.
  #
  # Contrived example:
  #   out = ""
  #   => ""
  #   q = PrettyPrint.new(out)
  #   => #<PrettyPrint:0x82f85c0 @output="", @maxwidth=79, @newline="\n", @genspace=#<Proc:0x82f8368@/home/vbatts/.rvm/rubies/ruby-head/lib/ruby/2.0.0/prettyprint.rb:82 (lambda)>, @output_width=0, @buffer_width=0, @buffer=[], @group_stack=[#<PrettyPrint::Group:0x82f8138 @depth=0, @breakables=[], @break=false>], @group_queue=#<PrettyPrint::GroupQueue:0x82fb7c0 @queue=[[#<PrettyPrint::Group:0x82f8138 @depth=0, @breakables=[], @break=false>]]>, @indent=0>
  #   q.group {
  #     q.text q.current_group.inspect
  #     q.text q.newline
  #     q.group(q.current_group.depth + 1) {
  #       q.text q.current_group.inspect
  #       q.text q.newline
  #       q.group(q.current_group.depth + 1) {
  #         q.text q.current_group.inspect
  #         q.text q.newline
  #         q.group(q.current_group.depth + 1) {
  #           q.text q.current_group.inspect
  #           q.text q.newline
  #         }
  #       }
  #     }
  #   }
  #   => 284
  #    puts out
  #   #<PrettyPrint::Group:0x8354758 @depth=1, @breakables=[], @break=false>
  #   #<PrettyPrint::Group:0x8354550 @depth=2, @breakables=[], @break=false>
  #   #<PrettyPrint::Group:0x83541cc @depth=3, @breakables=[], @break=false>
  #   #<PrettyPrint::Group:0x8347e54 @depth=4, @breakables=[], @break=false>
  def current_group
    @group_stack.last
  end

  # Breaks the buffer into lines that are shorter than #maxwidth
  def break_outmost_groups
    while @maxwidth < @output_width + @buffer_width
      return unless group = @group_queue.deq
      until group.breakables.empty?
        data = @buffer.shift
        @output_width = data.output(@output, @output_width)
        @buffer_width -= data.width
      end
      while !@buffer.empty? && Text === @buffer.first
        text = @buffer.shift
        @output_width = text.output(@output, @output_width)
        @buffer_width -= text.width
      end
    end
  end

  # This adds +obj+ as a text of +width+ columns in width.
  #
  # If +width+ is not specified, obj.length is used.
  #
  def text(obj, width=obj.length)
    if @buffer.empty?
      @output << obj
      @output_width += width
    else
      text = @buffer.last
      unless Text === text
        text = Text.new
        @buffer << text
      end
      text.add(obj, width)
      @buffer_width += width
      break_outmost_groups
    end
  end

  # This is similar to #breakable except
  # the decision to break or not is determined individually.
  #
  # Two #fill_breakable under a group may cause 4 results:
  # (break,break), (break,non-break), (non-break,break), (non-break,non-break).
  # This is different to #breakable because two #breakable under a group
  # may cause 2 results:
  # (break,break), (non-break,non-break).
  #
  # The text +sep+ is inserted if a line is not broken at this point.
  #
  # If +sep+ is not specified, " " is used.
  #
  # If +width+ is not specified, +sep.length+ is used. You will have to
  # specify this when +sep+ is a multibyte character, for example.
  #
  def fill_breakable(sep=' ', width=sep.length)
    group { breakable sep, width }
  end

  # This says "you can break a line here if necessary", and a +width+\-column
  # text +sep+ is inserted if a line is not broken at the point.
  #
  # If +sep+ is not specified, " " is used.
  #
  # If +width+ is not specified, +sep.length+ is used. You will have to
  # specify this when +sep+ is a multibyte character, for example.
  #
  def breakable(sep=' ', width=sep.length)
    group = @group_stack.last
    if group.break?
      flush
      @output << @newline
      @output << @genspace.call(@indent)
      @output_width = @indent
      @buffer_width = 0
    else
      @buffer << Breakable.new(sep, width, self)
      @buffer_width += width
      break_outmost_groups
    end
  end

  # Groups line break hints added in the block. The line break hints are all
  # to be used or not.
  #
  # If +indent+ is specified, the method call is regarded as nested by
  # nest(indent) { ... }.
  #
  # If +open_obj+ is specified, <tt>text open_obj, open_width</tt> is called
  # before grouping. If +close_obj+ is specified, <tt>text close_obj,
  # close_width</tt> is called after grouping.
  #
  def group(indent=0, open_obj='', close_obj='', open_width=open_obj.length, close_width=close_obj.length)
    text open_obj, open_width
    group_sub {
      nest(indent) {
        yield
      }
    }
    text close_obj, close_width
  end

  # Takes a block and queues a new group that is indented 1 level further.
  def group_sub
    group = Group.new(@group_stack.last.depth + 1)
    @group_stack.push group
    @group_queue.enq group
    begin
      yield
    ensure
      @group_stack.pop
      if group.breakables.empty?
        @group_queue.delete group
      end
    end
  end

  # Increases left margin after newline with +indent+ for line breaks added in
  # the block.
  #
  def nest(indent)
    @indent += indent
    begin
      yield
    ensure
      @indent -= indent
    end
  end

  # outputs buffered data.
  #
  def flush
    @buffer.each {|data|
      @output_width = data.output(@output, @output_width)
    }
    @buffer.clear
    @buffer_width = 0
  end

  # The Text class is the means by which to collect strings from objects.
  #
  # This class is intended for internal use of the PrettyPrint buffers.
  class Text # :nodoc:

    # Creates a new text object.
    #
    # This constructor takes no arguments.
    #
    # The workflow is to append a PrettyPrint::Text object to the buffer, and
    # being able to call the buffer.last() to reference it.
    #
    # As there are objects, use PrettyPrint::Text#add to include the objects
    # and the width to utilized by the String version of this object.
    def initialize
      @objs = []
      @width = 0
    end

    # The total width of the objects included in this Text object.
    attr_reader :width

    # Render the String text of the objects that have been added to this Text object.
    #
    # Output the text to +out+, and increment the width to +output_width+
    def output(out, output_width)
      @objs.each {|obj| out << obj}
      output_width + @width
    end

    # Include +obj+ in the objects to be pretty printed, and increment
    # this Text object's total width by +width+
    def add(obj, width)
      @objs << obj
      @width += width
    end
  end

  # The Breakable class is used for breaking up object information
  #
  # This class is intended for internal use of the PrettyPrint buffers.
  class Breakable # :nodoc:

    # Create a new Breakable object.
    #
    # Arguments:
    # * +sep+ String of the separator
    # * +width+ Integer width of the +sep+
    # * +q+ parent PrettyPrint object, to base from
    def initialize(sep, width, q)
      @obj = sep
      @width = width
      @pp = q
      @indent = q.indent
      @group = q.current_group
      @group.breakables.push self
    end

    # Holds the separator String
    #
    # The +sep+ argument from ::new
    attr_reader :obj

    # The width of +obj+ / +sep+
    attr_reader :width

    # The number of spaces to indent.
    #
    # This is inferred from +q+ within PrettyPrint, passed in ::new
    attr_reader :indent

    # Render the String text of the objects that have been added to this
    # Breakable object.
    #
    # Output the text to +out+, and increment the width to +output_width+
    def output(out, output_width)
      @group.breakables.shift
      if @group.break?
        out << @pp.newline
        out << @pp.genspace.call(@indent)
        @indent
      else
        @pp.group_queue.delete @group if @group.breakables.empty?
        out << @obj
        output_width + @width
      end
    end
  end

  # The Group class is used for making indentation easier.
  #
  # While this class does neither the breaking into newlines nor indentation,
  # it is used in a stack (as well as a queue) within PrettyPrint, to group
  # objects.
  #
  # For information on using groups, see PrettyPrint#group
  #
  # This class is intended for internal use of the PrettyPrint buffers.
  class Group # :nodoc:
    # Create a Group object
    #
    # Arguments:
    # * +depth+ - this group's relation to previous groups
    def initialize(depth)
      @depth = depth
      @breakables = []
      @break = false
    end

    # This group's relation to previous groups
    attr_reader :depth

    # Array to hold the Breakable objects for this Group
    attr_reader :breakables

    # Makes a break for this Group, and returns true
    def break
      @break = true
    end

    # Boolean of whether this Group has made a break
    def break?
      @break
    end

    # Boolean of whether this Group has been queried for being first
    #
    # This is used as a predicate, and ought to be called first.
    def first?
      if defined? @first
        false
      else
        @first = false
        true
      end
    end
  end

  # The GroupQueue class is used for managing the queue of Group to be pretty
  # printed.
  #
  # This queue groups the Group objects, based on their depth.
  #
  # This class is intended for internal use of the PrettyPrint buffers.
  class GroupQueue # :nodoc:
    # Create a GroupQueue object
    #
    # Arguments:
    # * +groups+ - one or more PrettyPrint::Group objects
    def initialize(*groups)
      @queue = []
      groups.each {|g| enq g}
    end

    # Enqueue +group+
    #
    # This does not strictly append the group to the end of the queue,
    # but instead adds it in line, base on the +group.depth+
    def enq(group)
      depth = group.depth
      @queue << [] until depth < @queue.length
      @queue[depth] << group
    end

    # Returns the outer group of the queue
    def deq
      @queue.each {|gs|
        (gs.length-1).downto(0) {|i|
          unless gs[i].breakables.empty?
            group = gs.slice!(i, 1).first
            group.break
            return group
          end
        }
        gs.each {|group| group.break}
        gs.clear
      }
      return nil
    end

    # Remote +group+ from this queue
    def delete(group)
      @queue[group.depth].delete(group)
    end
  end

  # PrettyPrint::SingleLine is used by PrettyPrint.singleline_format
  #
  # It is passed to be similar to a PrettyPrint object itself, by responding to:
  # * #text
  # * #breakable
  # * #nest
  # * #group
  # * #flush
  # * #first?
  #
  # but instead, the output has no line breaks
  #
  class SingleLine
    # Create a PrettyPrint::SingleLine object
    #
    # Arguments:
    # * +output+ - String (or similar) to store rendered text. Needs to respond to '<<'
    # * +maxwidth+ - Argument position expected to be here for compatibility.
    #                This argument is a noop.
    # * +newline+ - Argument position expected to be here for compatibility.
    #               This argument is a noop.
    def initialize(output, maxwidth=nil, newline=nil)
      @output = output
      @first = [true]
    end

    # Add +obj+ to the text to be output.
    #
    # +width+ argument is here for compatibility. It is a noop argument.
    def text(obj, width=nil)
      @output << obj
    end

    # Appends +sep+ to the text to be output. By default +sep+ is ' '
    #
    # +width+ argument is here for compatibility. It is a noop argument.
    def breakable(sep=' ', width=nil)
      @output << sep
    end

    # Takes +indent+ arg, but does nothing with it.
    #
    # Yields to a block.
    def nest(indent) # :nodoc:
      yield
    end

    # Opens a block for grouping objects to be pretty printed.
    #
    # Arguments:
    # * +indent+ - noop argument. Present for compatibility.
    # * +open_obj+ - text appended before the &blok. Default is ''
    # * +close_obj+ - text appended after the &blok. Default is ''
    # * +open_width+ - noop argument. Present for compatibility.
    # * +close_width+ - noop argument. Present for compatibility.
    def group(indent=nil, open_obj='', close_obj='', open_width=nil, close_width=nil)
      @first.push true
      @output << open_obj
      yield
      @output << close_obj
      @first.pop
    end

    # Method present for compatibility, but is a noop
    def flush # :nodoc:
    end

    # This is used as a predicate, and ought to be called first.
    def first?
      result = @first[-1]
      @first[-1] = false
      result
    end
  end
end
PK }$[�g��'B'Bruby/logger.rbnu�[���# frozen_string_literal: true
# logger.rb - simple logging utility
# Copyright (C) 2000-2003, 2005, 2008, 2011  NAKAMURA, Hiroshi <nahi@ruby-lang.org>.
#
# Documentation:: NAKAMURA, Hiroshi and Gavin Sinclair
# License::
#   You can redistribute it and/or modify it under the same terms of Ruby's
#   license; either the dual license version in 2003, or any later version.
# Revision:: $Id$
#
# A simple system for logging messages.  See Logger for more documentation.

require 'monitor'

require_relative 'logger/version'
require_relative 'logger/formatter'
require_relative 'logger/log_device'
require_relative 'logger/severity'
require_relative 'logger/errors'

# == Description
#
# The Logger class provides a simple but sophisticated logging utility that
# you can use to output messages.
#
# The messages have associated levels, such as +INFO+ or +ERROR+ that indicate
# their importance.  You can then give the Logger a level, and only messages
# at that level or higher will be printed.
#
# The levels are:
#
# +UNKNOWN+:: An unknown message that should always be logged.
# +FATAL+:: An unhandleable error that results in a program crash.
# +ERROR+:: A handleable error condition.
# +WARN+::  A warning.
# +INFO+::  Generic (useful) information about system operation.
# +DEBUG+:: Low-level information for developers.
#
# For instance, in a production system, you may have your Logger set to
# +INFO+ or even +WARN+.
# When you are developing the system, however, you probably
# want to know about the program's internal state, and would set the Logger to
# +DEBUG+.
#
# *Note*: Logger does not escape or sanitize any messages passed to it.
# Developers should be aware of when potentially malicious data (user-input)
# is passed to Logger, and manually escape the untrusted data:
#
#   logger.info("User-input: #{input.dump}")
#   logger.info("User-input: %p" % input)
#
# You can use #formatter= for escaping all data.
#
#   original_formatter = Logger::Formatter.new
#   logger.formatter = proc { |severity, datetime, progname, msg|
#     original_formatter.call(severity, datetime, progname, msg.dump)
#   }
#   logger.info(input)
#
# === Example
#
# This creates a Logger that outputs to the standard output stream, with a
# level of +WARN+:
#
#   require 'logger'
#
#   logger = Logger.new(STDOUT)
#   logger.level = Logger::WARN
#
#   logger.debug("Created logger")
#   logger.info("Program started")
#   logger.warn("Nothing to do!")
#
#   path = "a_non_existent_file"
#
#   begin
#     File.foreach(path) do |line|
#       unless line =~ /^(\w+) = (.*)$/
#         logger.error("Line in wrong format: #{line.chomp}")
#       end
#     end
#   rescue => err
#     logger.fatal("Caught exception; exiting")
#     logger.fatal(err)
#   end
#
# Because the Logger's level is set to +WARN+, only the warning, error, and
# fatal messages are recorded.  The debug and info messages are silently
# discarded.
#
# === Features
#
# There are several interesting features that Logger provides, like
# auto-rolling of log files, setting the format of log messages, and
# specifying a program name in conjunction with the message.  The next section
# shows you how to achieve these things.
#
#
# == HOWTOs
#
# === How to create a logger
#
# The options below give you various choices, in more or less increasing
# complexity.
#
# 1. Create a logger which logs messages to STDERR/STDOUT.
#
#      logger = Logger.new(STDERR)
#      logger = Logger.new(STDOUT)
#
# 2. Create a logger for the file which has the specified name.
#
#      logger = Logger.new('logfile.log')
#
# 3. Create a logger for the specified file.
#
#      file = File.open('foo.log', File::WRONLY | File::APPEND)
#      # To create new logfile, add File::CREAT like:
#      # file = File.open('foo.log', File::WRONLY | File::APPEND | File::CREAT)
#      logger = Logger.new(file)
#
# 4. Create a logger which ages the logfile once it reaches a certain size.
#    Leave 10 "old" log files where each file is about 1,024,000 bytes.
#
#      logger = Logger.new('foo.log', 10, 1024000)
#
# 5. Create a logger which ages the logfile daily/weekly/monthly.
#
#      logger = Logger.new('foo.log', 'daily')
#      logger = Logger.new('foo.log', 'weekly')
#      logger = Logger.new('foo.log', 'monthly')
#
# === How to log a message
#
# Notice the different methods (+fatal+, +error+, +info+) being used to log
# messages of various levels?  Other methods in this family are +warn+ and
# +debug+.  +add+ is used below to log a message of an arbitrary (perhaps
# dynamic) level.
#
# 1. Message in a block.
#
#      logger.fatal { "Argument 'foo' not given." }
#
# 2. Message as a string.
#
#      logger.error "Argument #{@foo} mismatch."
#
# 3. With progname.
#
#      logger.info('initialize') { "Initializing..." }
#
# 4. With severity.
#
#      logger.add(Logger::FATAL) { 'Fatal error!' }
#
# The block form allows you to create potentially complex log messages,
# but to delay their evaluation until and unless the message is
# logged.  For example, if we have the following:
#
#     logger.debug { "This is a " + potentially + " expensive operation" }
#
# If the logger's level is +INFO+ or higher, no debug messages will be logged,
# and the entire block will not even be evaluated.  Compare to this:
#
#     logger.debug("This is a " + potentially + " expensive operation")
#
# Here, the string concatenation is done every time, even if the log
# level is not set to show the debug message.
#
# === How to close a logger
#
#      logger.close
#
# === Setting severity threshold
#
# 1. Original interface.
#
#      logger.sev_threshold = Logger::WARN
#
# 2. Log4r (somewhat) compatible interface.
#
#      logger.level = Logger::INFO
#
#      # DEBUG < INFO < WARN < ERROR < FATAL < UNKNOWN
#
# 3. Symbol or String (case insensitive)
#
#      logger.level = :info
#      logger.level = 'INFO'
#
#      # :debug < :info < :warn < :error < :fatal < :unknown
#
# 4. Constructor
#
#      Logger.new(logdev, level: Logger::INFO)
#      Logger.new(logdev, level: :info)
#      Logger.new(logdev, level: 'INFO')
#
# == Format
#
# Log messages are rendered in the output stream in a certain format by
# default.  The default format and a sample are shown below:
#
# Log format:
#   SeverityID, [DateTime #pid] SeverityLabel -- ProgName: message
#
# Log sample:
#   I, [1999-03-03T02:34:24.895701 #19074]  INFO -- Main: info.
#
# You may change the date and time format via #datetime_format=.
#
#   logger.datetime_format = '%Y-%m-%d %H:%M:%S'
#         # e.g. "2004-01-03 00:54:26"
#
# or via the constructor.
#
#   Logger.new(logdev, datetime_format: '%Y-%m-%d %H:%M:%S')
#
# Or, you may change the overall format via the #formatter= method.
#
#   logger.formatter = proc do |severity, datetime, progname, msg|
#     "#{datetime}: #{msg}\n"
#   end
#   # e.g. "2005-09-22 08:51:08 +0900: hello world"
#
# or via the constructor.
#
#   Logger.new(logdev, formatter: proc {|severity, datetime, progname, msg|
#     "#{datetime}: #{msg}\n"
#   })
#
class Logger
  _, name, rev = %w$Id$
  if name
    name = name.chomp(",v")
  else
    name = File.basename(__FILE__)
  end
  rev ||= "v#{VERSION}"
  ProgName = "#{name}/#{rev}"

  include Severity

  # Logging severity threshold (e.g. <tt>Logger::INFO</tt>).
  attr_reader :level

  # Set logging severity threshold.
  #
  # +severity+:: The Severity of the log message.
  def level=(severity)
    if severity.is_a?(Integer)
      @level = severity
    else
      case severity.to_s.downcase
      when 'debug'
        @level = DEBUG
      when 'info'
        @level = INFO
      when 'warn'
        @level = WARN
      when 'error'
        @level = ERROR
      when 'fatal'
        @level = FATAL
      when 'unknown'
        @level = UNKNOWN
      else
        raise ArgumentError, "invalid log level: #{severity}"
      end
    end
  end

  # Program name to include in log messages.
  attr_accessor :progname

  # Set date-time format.
  #
  # +datetime_format+:: A string suitable for passing to +strftime+.
  def datetime_format=(datetime_format)
    @default_formatter.datetime_format = datetime_format
  end

  # Returns the date format being used.  See #datetime_format=
  def datetime_format
    @default_formatter.datetime_format
  end

  # Logging formatter, as a +Proc+ that will take four arguments and
  # return the formatted message. The arguments are:
  #
  # +severity+:: The Severity of the log message.
  # +time+:: A Time instance representing when the message was logged.
  # +progname+:: The #progname configured, or passed to the logger method.
  # +msg+:: The _Object_ the user passed to the log message; not necessarily a
  #         String.
  #
  # The block should return an Object that can be written to the logging
  # device via +write+.  The default formatter is used when no formatter is
  # set.
  attr_accessor :formatter

  alias sev_threshold level
  alias sev_threshold= level=

  # Returns +true+ if and only if the current severity level allows for the printing of
  # +DEBUG+ messages.
  def debug?; level <= DEBUG; end

  # Sets the severity to DEBUG.
  def debug!; self.level = DEBUG; end

  # Returns +true+ if and only if the current severity level allows for the printing of
  # +INFO+ messages.
  def info?; level <= INFO; end

  # Sets the severity to INFO.
  def info!; self.level = INFO; end

  # Returns +true+ if and only if the current severity level allows for the printing of
  # +WARN+ messages.
  def warn?; level <= WARN; end

  # Sets the severity to WARN.
  def warn!; self.level = WARN; end

  # Returns +true+ if and only if the current severity level allows for the printing of
  # +ERROR+ messages.
  def error?; level <= ERROR; end

  # Sets the severity to ERROR.
  def error!; self.level = ERROR; end

  # Returns +true+ if and only if the current severity level allows for the printing of
  # +FATAL+ messages.
  def fatal?; level <= FATAL; end

  # Sets the severity to FATAL.
  def fatal!; self.level = FATAL; end

  #
  # :call-seq:
  #   Logger.new(logdev, shift_age = 0, shift_size = 1048576)
  #   Logger.new(logdev, shift_age = 'weekly')
  #   Logger.new(logdev, level: :info)
  #   Logger.new(logdev, progname: 'progname')
  #   Logger.new(logdev, formatter: formatter)
  #   Logger.new(logdev, datetime_format: '%Y-%m-%d %H:%M:%S')
  #
  # === Args
  #
  # +logdev+::
  #   The log device.  This is a filename (String), IO object (typically
  #   +STDOUT+, +STDERR+, or an open file), +nil+ (it writes nothing) or
  #   +File::NULL+ (same as +nil+).
  # +shift_age+::
  #   Number of old log files to keep, *or* frequency of rotation (+daily+,
  #   +weekly+ or +monthly+). Default value is 0, which disables log file
  #   rotation.
  # +shift_size+::
  #   Maximum logfile size in bytes (only applies when +shift_age+ is a positive
  #   Integer). Defaults to +1048576+ (1MB).
  # +level+::
  #   Logging severity threshold. Default values is Logger::DEBUG.
  # +progname+::
  #   Program name to include in log messages. Default value is nil.
  # +formatter+::
  #   Logging formatter. Default values is an instance of Logger::Formatter.
  # +datetime_format+::
  #   Date and time format. Default value is '%Y-%m-%d %H:%M:%S'.
  # +binmode+::
  #   Use binary mode on the log device. Default value is false.
  # +shift_period_suffix+::
  #   The log file suffix format for +daily+, +weekly+ or +monthly+ rotation.
  #   Default is '%Y%m%d'.
  #
  # === Description
  #
  # Create an instance.
  #
  def initialize(logdev, shift_age = 0, shift_size = 1048576, level: DEBUG,
                 progname: nil, formatter: nil, datetime_format: nil,
                 binmode: false, shift_period_suffix: '%Y%m%d')
    self.level = level
    self.progname = progname
    @default_formatter = Formatter.new
    self.datetime_format = datetime_format
    self.formatter = formatter
    @logdev = nil
    if logdev && logdev != File::NULL
      @logdev = LogDevice.new(logdev, shift_age: shift_age,
        shift_size: shift_size,
        shift_period_suffix: shift_period_suffix,
        binmode: binmode)
    end
  end

  #
  # :call-seq:
  #   Logger#reopen
  #   Logger#reopen(logdev)
  #
  # === Args
  #
  # +logdev+::
  #   The log device.  This is a filename (String) or IO object (typically
  #   +STDOUT+, +STDERR+, or an open file).  reopen the same filename if
  #   it is +nil+, do nothing for IO.  Default is +nil+.
  #
  # === Description
  #
  # Reopen a log device.
  #
  def reopen(logdev = nil)
    @logdev&.reopen(logdev)
    self
  end

  #
  # :call-seq:
  #   Logger#add(severity, message = nil, progname = nil) { ... }
  #
  # === Args
  #
  # +severity+::
  #   Severity.  Constants are defined in Logger namespace: +DEBUG+, +INFO+,
  #   +WARN+, +ERROR+, +FATAL+, or +UNKNOWN+.
  # +message+::
  #   The log message.  A String or Exception.
  # +progname+::
  #   Program name string.  Can be omitted.  Treated as a message if no
  #   +message+ and +block+ are given.
  # +block+::
  #   Can be omitted.  Called to get a message string if +message+ is nil.
  #
  # === Return
  #
  # When the given severity is not high enough (for this particular logger),
  # log no message, and return +true+.
  #
  # === Description
  #
  # Log a message if the given severity is high enough.  This is the generic
  # logging method.  Users will be more inclined to use #debug, #info, #warn,
  # #error, and #fatal.
  #
  # <b>Message format</b>: +message+ can be any object, but it has to be
  # converted to a String in order to log it.  Generally, +inspect+ is used
  # if the given object is not a String.
  # A special case is an +Exception+ object, which will be printed in detail,
  # including message, class, and backtrace.  See #msg2str for the
  # implementation if required.
  #
  # === Bugs
  #
  # * Logfile is not locked.
  # * Append open does not need to lock file.
  # * If the OS supports multi I/O, records possibly may be mixed.
  #
  def add(severity, message = nil, progname = nil)
    severity ||= UNKNOWN
    if @logdev.nil? or severity < level
      return true
    end
    if progname.nil?
      progname = @progname
    end
    if message.nil?
      if block_given?
        message = yield
      else
        message = progname
        progname = @progname
      end
    end
    @logdev.write(
      format_message(format_severity(severity), Time.now, progname, message))
    true
  end
  alias log add

  #
  # Dump given message to the log device without any formatting.  If no log
  # device exists, return +nil+.
  #
  def <<(msg)
    @logdev&.write(msg)
  end

  #
  # Log a +DEBUG+ message.
  #
  # See #info for more information.
  #
  def debug(progname = nil, &block)
    add(DEBUG, nil, progname, &block)
  end

  #
  # :call-seq:
  #   info(message)
  #   info(progname, &block)
  #
  # Log an +INFO+ message.
  #
  # +message+:: The message to log; does not need to be a String.
  # +progname+:: In the block form, this is the #progname to use in the
  #              log message.  The default can be set with #progname=.
  # +block+:: Evaluates to the message to log.  This is not evaluated unless
  #           the logger's level is sufficient to log the message.  This
  #           allows you to create potentially expensive logging messages that
  #           are only called when the logger is configured to show them.
  #
  # === Examples
  #
  #   logger.info("MainApp") { "Received connection from #{ip}" }
  #   # ...
  #   logger.info "Waiting for input from user"
  #   # ...
  #   logger.info { "User typed #{input}" }
  #
  # You'll probably stick to the second form above, unless you want to provide a
  # program name (which you can do with #progname= as well).
  #
  # === Return
  #
  # See #add.
  #
  def info(progname = nil, &block)
    add(INFO, nil, progname, &block)
  end

  #
  # Log a +WARN+ message.
  #
  # See #info for more information.
  #
  def warn(progname = nil, &block)
    add(WARN, nil, progname, &block)
  end

  #
  # Log an +ERROR+ message.
  #
  # See #info for more information.
  #
  def error(progname = nil, &block)
    add(ERROR, nil, progname, &block)
  end

  #
  # Log a +FATAL+ message.
  #
  # See #info for more information.
  #
  def fatal(progname = nil, &block)
    add(FATAL, nil, progname, &block)
  end

  #
  # Log an +UNKNOWN+ message.  This will be printed no matter what the logger's
  # level is.
  #
  # See #info for more information.
  #
  def unknown(progname = nil, &block)
    add(UNKNOWN, nil, progname, &block)
  end

  #
  # Close the logging device.
  #
  def close
    @logdev&.close
  end

private

  # Severity label for logging (max 5 chars).
  SEV_LABEL = %w(DEBUG INFO WARN ERROR FATAL ANY).freeze

  def format_severity(severity)
    SEV_LABEL[severity] || 'ANY'
  end

  def format_message(severity, datetime, progname, msg)
    (@formatter || @default_formatter).call(severity, datetime, progname, msg)
  end
end
PK }$[�u�f��ruby/uri/version.rbnu�[���module URI
  # :stopdoc:
  VERSION_CODE = '001204'.freeze
  VERSION = VERSION_CODE.scan(/../).collect{|n| n.to_i}.join('.').freeze
  # :startdoc:
end
PK }$[���..ruby/uri/https.rbnu�[���# frozen_string_literal: false
# = uri/https.rb
#
# Author:: Akira Yamada <akira@ruby-lang.org>
# License:: You can redistribute it and/or modify it under the same term as Ruby.
#
# See URI for general documentation
#

require_relative 'http'

module URI

  # The default port for HTTPS URIs is 443, and the scheme is 'https:' rather
  # than 'http:'. Other than that, HTTPS URIs are identical to HTTP URIs;
  # see URI::HTTP.
  class HTTPS < HTTP
    # A Default port of 443 for URI::HTTPS
    DEFAULT_PORT = 443
  end

  register_scheme 'HTTPS', HTTPS
end
PK }$[���z&D&Druby/uri/rfc2396_parser.rbnu�[���# frozen_string_literal: false
#--
# = uri/common.rb
#
# Author:: Akira Yamada <akira@ruby-lang.org>
# License::
#   You can redistribute it and/or modify it under the same term as Ruby.
#
# See URI for general documentation
#

module URI
  #
  # Includes URI::REGEXP::PATTERN
  #
  module RFC2396_REGEXP
    #
    # Patterns used to parse URI's
    #
    module PATTERN
      # :stopdoc:

      # RFC 2396 (URI Generic Syntax)
      # RFC 2732 (IPv6 Literal Addresses in URL's)
      # RFC 2373 (IPv6 Addressing Architecture)

      # alpha         = lowalpha | upalpha
      ALPHA = "a-zA-Z"
      # alphanum      = alpha | digit
      ALNUM = "#{ALPHA}\\d"

      # hex           = digit | "A" | "B" | "C" | "D" | "E" | "F" |
      #                         "a" | "b" | "c" | "d" | "e" | "f"
      HEX     = "a-fA-F\\d"
      # escaped       = "%" hex hex
      ESCAPED = "%[#{HEX}]{2}"
      # mark          = "-" | "_" | "." | "!" | "~" | "*" | "'" |
      #                 "(" | ")"
      # unreserved    = alphanum | mark
      UNRESERVED = "\\-_.!~*'()#{ALNUM}"
      # reserved      = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
      #                 "$" | ","
      # reserved      = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
      #                 "$" | "," | "[" | "]" (RFC 2732)
      RESERVED = ";/?:@&=+$,\\[\\]"

      # domainlabel   = alphanum | alphanum *( alphanum | "-" ) alphanum
      DOMLABEL = "(?:[#{ALNUM}](?:[-#{ALNUM}]*[#{ALNUM}])?)"
      # toplabel      = alpha | alpha *( alphanum | "-" ) alphanum
      TOPLABEL = "(?:[#{ALPHA}](?:[-#{ALNUM}]*[#{ALNUM}])?)"
      # hostname      = *( domainlabel "." ) toplabel [ "." ]
      HOSTNAME = "(?:#{DOMLABEL}\\.)*#{TOPLABEL}\\.?"

      # :startdoc:
    end # PATTERN

    # :startdoc:
  end # REGEXP

  # Class that parses String's into URI's.
  #
  # It contains a Hash set of patterns and Regexp's that match and validate.
  #
  class RFC2396_Parser
    include RFC2396_REGEXP

    #
    # == Synopsis
    #
    #   URI::Parser.new([opts])
    #
    # == Args
    #
    # The constructor accepts a hash as options for parser.
    # Keys of options are pattern names of URI components
    # and values of options are pattern strings.
    # The constructor generates set of regexps for parsing URIs.
    #
    # You can use the following keys:
    #
    #   * :ESCAPED (URI::PATTERN::ESCAPED in default)
    #   * :UNRESERVED (URI::PATTERN::UNRESERVED in default)
    #   * :DOMLABEL (URI::PATTERN::DOMLABEL in default)
    #   * :TOPLABEL (URI::PATTERN::TOPLABEL in default)
    #   * :HOSTNAME (URI::PATTERN::HOSTNAME in default)
    #
    # == Examples
    #
    #   p = URI::Parser.new(:ESCAPED => "(?:%[a-fA-F0-9]{2}|%u[a-fA-F0-9]{4})")
    #   u = p.parse("http://example.jp/%uABCD") #=> #<URI::HTTP http://example.jp/%uABCD>
    #   URI.parse(u.to_s) #=> raises URI::InvalidURIError
    #
    #   s = "http://example.com/ABCD"
    #   u1 = p.parse(s) #=> #<URI::HTTP http://example.com/ABCD>
    #   u2 = URI.parse(s) #=> #<URI::HTTP http://example.com/ABCD>
    #   u1 == u2 #=> true
    #   u1.eql?(u2) #=> false
    #
    def initialize(opts = {})
      @pattern = initialize_pattern(opts)
      @pattern.each_value(&:freeze)
      @pattern.freeze

      @regexp = initialize_regexp(@pattern)
      @regexp.each_value(&:freeze)
      @regexp.freeze
    end

    # The Hash of patterns.
    #
    # See also URI::Parser.initialize_pattern.
    attr_reader :pattern

    # The Hash of Regexp.
    #
    # See also URI::Parser.initialize_regexp.
    attr_reader :regexp

    # Returns a split URI against +regexp[:ABS_URI]+.
    def split(uri)
      case uri
      when ''
        # null uri

      when @regexp[:ABS_URI]
        scheme, opaque, userinfo, host, port,
          registry, path, query, fragment = $~[1..-1]

        # URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]

        # absoluteURI   = scheme ":" ( hier_part | opaque_part )
        # hier_part     = ( net_path | abs_path ) [ "?" query ]
        # opaque_part   = uric_no_slash *uric

        # abs_path      = "/"  path_segments
        # net_path      = "//" authority [ abs_path ]

        # authority     = server | reg_name
        # server        = [ [ userinfo "@" ] hostport ]

        if !scheme
          raise InvalidURIError,
            "bad URI(absolute but no scheme): #{uri}"
        end
        if !opaque && (!path && (!host && !registry))
          raise InvalidURIError,
            "bad URI(absolute but no path): #{uri}"
        end

      when @regexp[:REL_URI]
        scheme = nil
        opaque = nil

        userinfo, host, port, registry,
          rel_segment, abs_path, query, fragment = $~[1..-1]
        if rel_segment && abs_path
          path = rel_segment + abs_path
        elsif rel_segment
          path = rel_segment
        elsif abs_path
          path = abs_path
        end

        # URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]

        # relativeURI   = ( net_path | abs_path | rel_path ) [ "?" query ]

        # net_path      = "//" authority [ abs_path ]
        # abs_path      = "/"  path_segments
        # rel_path      = rel_segment [ abs_path ]

        # authority     = server | reg_name
        # server        = [ [ userinfo "@" ] hostport ]

      else
        raise InvalidURIError, "bad URI(is not URI?): #{uri}"
      end

      path = '' if !path && !opaque # (see RFC2396 Section 5.2)
      ret = [
        scheme,
        userinfo, host, port,         # X
        registry,                     # X
        path,                         # Y
        opaque,                       # Y
        query,
        fragment
      ]
      return ret
    end

    #
    # == Args
    #
    # +uri+::
    #    String
    #
    # == Description
    #
    # Parses +uri+ and constructs either matching URI scheme object
    # (File, FTP, HTTP, HTTPS, LDAP, LDAPS, or MailTo) or URI::Generic.
    #
    # == Usage
    #
    #   p = URI::Parser.new
    #   p.parse("ldap://ldap.example.com/dc=example?user=john")
    #   #=> #<URI::LDAP ldap://ldap.example.com/dc=example?user=john>
    #
    def parse(uri)
      URI.for(*self.split(uri), self)
    end

    #
    # == Args
    #
    # +uris+::
    #    an Array of Strings
    #
    # == Description
    #
    # Attempts to parse and merge a set of URIs.
    #
    def join(*uris)
      uris[0] = convert_to_uri(uris[0])
      uris.inject :merge
    end

    #
    # :call-seq:
    #   extract( str )
    #   extract( str, schemes )
    #   extract( str, schemes ) {|item| block }
    #
    # == Args
    #
    # +str+::
    #    String to search
    # +schemes+::
    #    Patterns to apply to +str+
    #
    # == Description
    #
    # Attempts to parse and merge a set of URIs.
    # If no +block+ given, then returns the result,
    # else it calls +block+ for each element in result.
    #
    # See also URI::Parser.make_regexp.
    #
    def extract(str, schemes = nil)
      if block_given?
        str.scan(make_regexp(schemes)) { yield $& }
        nil
      else
        result = []
        str.scan(make_regexp(schemes)) { result.push $& }
        result
      end
    end

    # Returns Regexp that is default +self.regexp[:ABS_URI_REF]+,
    # unless +schemes+ is provided. Then it is a Regexp.union with +self.pattern[:X_ABS_URI]+.
    def make_regexp(schemes = nil)
      unless schemes
        @regexp[:ABS_URI_REF]
      else
        /(?=#{Regexp.union(*schemes)}:)#{@pattern[:X_ABS_URI]}/x
      end
    end

    #
    # :call-seq:
    #   escape( str )
    #   escape( str, unsafe )
    #
    # == Args
    #
    # +str+::
    #    String to make safe
    # +unsafe+::
    #    Regexp to apply. Defaults to +self.regexp[:UNSAFE]+
    #
    # == Description
    #
    # Constructs a safe String from +str+, removing unsafe characters,
    # replacing them with codes.
    #
    def escape(str, unsafe = @regexp[:UNSAFE])
      unless unsafe.kind_of?(Regexp)
        # perhaps unsafe is String object
        unsafe = Regexp.new("[#{Regexp.quote(unsafe)}]", false)
      end
      str.gsub(unsafe) do
        us = $&
        tmp = ''
        us.each_byte do |uc|
          tmp << sprintf('%%%02X', uc)
        end
        tmp
      end.force_encoding(Encoding::US_ASCII)
    end

    #
    # :call-seq:
    #   unescape( str )
    #   unescape( str, escaped )
    #
    # == Args
    #
    # +str+::
    #    String to remove escapes from
    # +escaped+::
    #    Regexp to apply. Defaults to +self.regexp[:ESCAPED]+
    #
    # == Description
    #
    # Removes escapes from +str+.
    #
    def unescape(str, escaped = @regexp[:ESCAPED])
      enc = str.encoding
      enc = Encoding::UTF_8 if enc == Encoding::US_ASCII
      str.gsub(escaped) { [$&[1, 2]].pack('H2').force_encoding(enc) }
    end

    @@to_s = Kernel.instance_method(:to_s)
    if @@to_s.respond_to?(:bind_call)
      def inspect
        @@to_s.bind_call(self)
      end
    else
      def inspect
        @@to_s.bind(self).call
      end
    end

    private

    # Constructs the default Hash of patterns.
    def initialize_pattern(opts = {})
      ret = {}
      ret[:ESCAPED] = escaped = (opts.delete(:ESCAPED) || PATTERN::ESCAPED)
      ret[:UNRESERVED] = unreserved = opts.delete(:UNRESERVED) || PATTERN::UNRESERVED
      ret[:RESERVED] = reserved = opts.delete(:RESERVED) || PATTERN::RESERVED
      ret[:DOMLABEL] = opts.delete(:DOMLABEL) || PATTERN::DOMLABEL
      ret[:TOPLABEL] = opts.delete(:TOPLABEL) || PATTERN::TOPLABEL
      ret[:HOSTNAME] = hostname = opts.delete(:HOSTNAME)

      # RFC 2396 (URI Generic Syntax)
      # RFC 2732 (IPv6 Literal Addresses in URL's)
      # RFC 2373 (IPv6 Addressing Architecture)

      # uric          = reserved | unreserved | escaped
      ret[:URIC] = uric = "(?:[#{unreserved}#{reserved}]|#{escaped})"
      # uric_no_slash = unreserved | escaped | ";" | "?" | ":" | "@" |
      #                 "&" | "=" | "+" | "$" | ","
      ret[:URIC_NO_SLASH] = uric_no_slash = "(?:[#{unreserved};?:@&=+$,]|#{escaped})"
      # query         = *uric
      ret[:QUERY] = query = "#{uric}*"
      # fragment      = *uric
      ret[:FRAGMENT] = fragment = "#{uric}*"

      # hostname      = *( domainlabel "." ) toplabel [ "." ]
      # reg-name      = *( unreserved / pct-encoded / sub-delims ) # RFC3986
      unless hostname
        ret[:HOSTNAME] = hostname = "(?:[a-zA-Z0-9\\-.]|%\\h\\h)+"
      end

      # RFC 2373, APPENDIX B:
      # IPv6address = hexpart [ ":" IPv4address ]
      # IPv4address   = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT
      # hexpart = hexseq | hexseq "::" [ hexseq ] | "::" [ hexseq ]
      # hexseq  = hex4 *( ":" hex4)
      # hex4    = 1*4HEXDIG
      #
      # XXX: This definition has a flaw. "::" + IPv4address must be
      # allowed too.  Here is a replacement.
      #
      # IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT
      ret[:IPV4ADDR] = ipv4addr = "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"
      # hex4     = 1*4HEXDIG
      hex4 = "[#{PATTERN::HEX}]{1,4}"
      # lastpart = hex4 | IPv4address
      lastpart = "(?:#{hex4}|#{ipv4addr})"
      # hexseq1  = *( hex4 ":" ) hex4
      hexseq1 = "(?:#{hex4}:)*#{hex4}"
      # hexseq2  = *( hex4 ":" ) lastpart
      hexseq2 = "(?:#{hex4}:)*#{lastpart}"
      # IPv6address = hexseq2 | [ hexseq1 ] "::" [ hexseq2 ]
      ret[:IPV6ADDR] = ipv6addr = "(?:#{hexseq2}|(?:#{hexseq1})?::(?:#{hexseq2})?)"

      # IPv6prefix  = ( hexseq1 | [ hexseq1 ] "::" [ hexseq1 ] ) "/" 1*2DIGIT
      # unused

      # ipv6reference = "[" IPv6address "]" (RFC 2732)
      ret[:IPV6REF] = ipv6ref = "\\[#{ipv6addr}\\]"

      # host          = hostname | IPv4address
      # host          = hostname | IPv4address | IPv6reference (RFC 2732)
      ret[:HOST] = host = "(?:#{hostname}|#{ipv4addr}|#{ipv6ref})"
      # port          = *digit
      ret[:PORT] = port = '\d*'
      # hostport      = host [ ":" port ]
      ret[:HOSTPORT] = hostport = "#{host}(?::#{port})?"

      # userinfo      = *( unreserved | escaped |
      #                    ";" | ":" | "&" | "=" | "+" | "$" | "," )
      ret[:USERINFO] = userinfo = "(?:[#{unreserved};:&=+$,]|#{escaped})*"

      # pchar         = unreserved | escaped |
      #                 ":" | "@" | "&" | "=" | "+" | "$" | ","
      pchar = "(?:[#{unreserved}:@&=+$,]|#{escaped})"
      # param         = *pchar
      param = "#{pchar}*"
      # segment       = *pchar *( ";" param )
      segment = "#{pchar}*(?:;#{param})*"
      # path_segments = segment *( "/" segment )
      ret[:PATH_SEGMENTS] = path_segments = "#{segment}(?:/#{segment})*"

      # server        = [ [ userinfo "@" ] hostport ]
      server = "(?:#{userinfo}@)?#{hostport}"
      # reg_name      = 1*( unreserved | escaped | "$" | "," |
      #                     ";" | ":" | "@" | "&" | "=" | "+" )
      ret[:REG_NAME] = reg_name = "(?:[#{unreserved}$,;:@&=+]|#{escaped})+"
      # authority     = server | reg_name
      authority = "(?:#{server}|#{reg_name})"

      # rel_segment   = 1*( unreserved | escaped |
      #                     ";" | "@" | "&" | "=" | "+" | "$" | "," )
      ret[:REL_SEGMENT] = rel_segment = "(?:[#{unreserved};@&=+$,]|#{escaped})+"

      # scheme        = alpha *( alpha | digit | "+" | "-" | "." )
      ret[:SCHEME] = scheme = "[#{PATTERN::ALPHA}][\\-+.#{PATTERN::ALPHA}\\d]*"

      # abs_path      = "/"  path_segments
      ret[:ABS_PATH] = abs_path = "/#{path_segments}"
      # rel_path      = rel_segment [ abs_path ]
      ret[:REL_PATH] = rel_path = "#{rel_segment}(?:#{abs_path})?"
      # net_path      = "//" authority [ abs_path ]
      ret[:NET_PATH] = net_path = "//#{authority}(?:#{abs_path})?"

      # hier_part     = ( net_path | abs_path ) [ "?" query ]
      ret[:HIER_PART] = hier_part = "(?:#{net_path}|#{abs_path})(?:\\?(?:#{query}))?"
      # opaque_part   = uric_no_slash *uric
      ret[:OPAQUE_PART] = opaque_part = "#{uric_no_slash}#{uric}*"

      # absoluteURI   = scheme ":" ( hier_part | opaque_part )
      ret[:ABS_URI] = abs_uri = "#{scheme}:(?:#{hier_part}|#{opaque_part})"
      # relativeURI   = ( net_path | abs_path | rel_path ) [ "?" query ]
      ret[:REL_URI] = rel_uri = "(?:#{net_path}|#{abs_path}|#{rel_path})(?:\\?#{query})?"

      # URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ]
      ret[:URI_REF] = "(?:#{abs_uri}|#{rel_uri})?(?:##{fragment})?"

      ret[:X_ABS_URI] = "
        (#{scheme}):                           (?# 1: scheme)
        (?:
           (#{opaque_part})                    (?# 2: opaque)
        |
           (?:(?:
             //(?:
                 (?:(?:(#{userinfo})@)?        (?# 3: userinfo)
                   (?:(#{host})(?::(\\d*))?))? (?# 4: host, 5: port)
               |
                 (#{reg_name})                 (?# 6: registry)
               )
             |
             (?!//))                           (?# XXX: '//' is the mark for hostport)
             (#{abs_path})?                    (?# 7: path)
           )(?:\\?(#{query}))?                 (?# 8: query)
        )
        (?:\\#(#{fragment}))?                  (?# 9: fragment)
      "

      ret[:X_REL_URI] = "
        (?:
          (?:
            //
            (?:
              (?:(#{userinfo})@)?       (?# 1: userinfo)
                (#{host})?(?::(\\d*))?  (?# 2: host, 3: port)
            |
              (#{reg_name})             (?# 4: registry)
            )
          )
        |
          (#{rel_segment})              (?# 5: rel_segment)
        )?
        (#{abs_path})?                  (?# 6: abs_path)
        (?:\\?(#{query}))?              (?# 7: query)
        (?:\\#(#{fragment}))?           (?# 8: fragment)
      "

      ret
    end

    # Constructs the default Hash of Regexp's.
    def initialize_regexp(pattern)
      ret = {}

      # for URI::split
      ret[:ABS_URI] = Regexp.new('\A\s*+' + pattern[:X_ABS_URI] + '\s*\z', Regexp::EXTENDED)
      ret[:REL_URI] = Regexp.new('\A\s*+' + pattern[:X_REL_URI] + '\s*\z', Regexp::EXTENDED)

      # for URI::extract
      ret[:URI_REF]     = Regexp.new(pattern[:URI_REF])
      ret[:ABS_URI_REF] = Regexp.new(pattern[:X_ABS_URI], Regexp::EXTENDED)
      ret[:REL_URI_REF] = Regexp.new(pattern[:X_REL_URI], Regexp::EXTENDED)

      # for URI::escape/unescape
      ret[:ESCAPED] = Regexp.new(pattern[:ESCAPED])
      ret[:UNSAFE]  = Regexp.new("[^#{pattern[:UNRESERVED]}#{pattern[:RESERVED]}]")

      # for Generic#initialize
      ret[:SCHEME]   = Regexp.new("\\A#{pattern[:SCHEME]}\\z")
      ret[:USERINFO] = Regexp.new("\\A#{pattern[:USERINFO]}\\z")
      ret[:HOST]     = Regexp.new("\\A#{pattern[:HOST]}\\z")
      ret[:PORT]     = Regexp.new("\\A#{pattern[:PORT]}\\z")
      ret[:OPAQUE]   = Regexp.new("\\A#{pattern[:OPAQUE_PART]}\\z")
      ret[:REGISTRY] = Regexp.new("\\A#{pattern[:REG_NAME]}\\z")
      ret[:ABS_PATH] = Regexp.new("\\A#{pattern[:ABS_PATH]}\\z")
      ret[:REL_PATH] = Regexp.new("\\A#{pattern[:REL_PATH]}\\z")
      ret[:QUERY]    = Regexp.new("\\A#{pattern[:QUERY]}\\z")
      ret[:FRAGMENT] = Regexp.new("\\A#{pattern[:FRAGMENT]}\\z")

      ret
    end

    def convert_to_uri(uri)
      if uri.is_a?(URI::Generic)
        uri
      elsif uri = String.try_convert(uri)
        parse(uri)
      else
        raise ArgumentError,
          "bad argument (expected URI object or URI string)"
      end
    end

  end # class Parser
end # module URI
PK }$[җA��ruby/uri/ldaps.rbnu�[���# frozen_string_literal: false
# = uri/ldap.rb
#
# License:: You can redistribute it and/or modify it under the same term as Ruby.
#
# See URI for general documentation
#

require_relative 'ldap'

module URI

  # The default port for LDAPS URIs is 636, and the scheme is 'ldaps:' rather
  # than 'ldap:'. Other than that, LDAPS URIs are identical to LDAP URIs;
  # see URI::LDAP.
  class LDAPS < LDAP
    # A Default port of 636 for URI::LDAPS
    DEFAULT_PORT = 636
  end

  register_scheme 'LDAPS', LDAPS
end
PK }$[��	�UUruby/uri/rfc3986_parser.rbnu�[���# frozen_string_literal: false
module URI
  class RFC3986_Parser # :nodoc:
    # URI defined in RFC3986
    RFC3986_URI = /\A(?<URI>(?<scheme>[A-Za-z][+\-.0-9A-Za-z]*+):(?<hier-part>\/\/(?<authority>(?:(?<userinfo>(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*+)@)?(?<host>(?<IP-literal>\[(?:(?<IPv6address>(?:\h{1,4}:){6}(?<ls32>\h{1,4}:\h{1,4}|(?<IPv4address>(?<dec-octet>[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g<dec-octet>\.\g<dec-octet>\.\g<dec-octet>))|::(?:\h{1,4}:){5}\g<ls32>|\h{1,4}?::(?:\h{1,4}:){4}\g<ls32>|(?:(?:\h{1,4}:)?\h{1,4})?::(?:\h{1,4}:){3}\g<ls32>|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g<ls32>|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g<ls32>|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g<ls32>|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?<IPvFuture>v\h++\.[!$&-.0-;=A-Z_a-z~]++))\])|\g<IPv4address>|(?<reg-name>(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])*+))(?::(?<port>\d*+))?)(?<path-abempty>(?:\/(?<segment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*+))*+)|(?<path-absolute>\/(?:(?<segment-nz>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])++)(?:\/\g<segment>)*+)?)|(?<path-rootless>\g<segment-nz>(?:\/\g<segment>)*+)|(?<path-empty>))(?:\?(?<query>[^#]*+))?(?:\#(?<fragment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*+))?)\z/
    RFC3986_relative_ref = /\A(?<relative-ref>(?<relative-part>\/\/(?<authority>(?:(?<userinfo>(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*+)@)?(?<host>(?<IP-literal>\[(?:(?<IPv6address>(?:\h{1,4}:){6}(?<ls32>\h{1,4}:\h{1,4}|(?<IPv4address>(?<dec-octet>[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g<dec-octet>\.\g<dec-octet>\.\g<dec-octet>))|::(?:\h{1,4}:){5}\g<ls32>|\h{1,4}?::(?:\h{1,4}:){4}\g<ls32>|(?:(?:\h{1,4}:){,1}\h{1,4})?::(?:\h{1,4}:){3}\g<ls32>|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g<ls32>|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g<ls32>|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g<ls32>|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?<IPvFuture>v\h++\.[!$&-.0-;=A-Z_a-z~]++))\])|\g<IPv4address>|(?<reg-name>(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])++))?(?::(?<port>\d*+))?)(?<path-abempty>(?:\/(?<segment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*+))*+)|(?<path-absolute>\/(?:(?<segment-nz>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])++)(?:\/\g<segment>)*+)?)|(?<path-noscheme>(?<segment-nz-nc>(?:%\h\h|[!$&-.0-9;=@-Z_a-z~])++)(?:\/\g<segment>)*+)|(?<path-empty>))(?:\?(?<query>[^#]*+))?(?:\#(?<fragment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*+))?)\z/
    attr_reader :regexp

    def initialize
      @regexp = default_regexp.each_value(&:freeze).freeze
    end

    def split(uri) #:nodoc:
      begin
        uri = uri.to_str
      rescue NoMethodError
        raise InvalidURIError, "bad URI(is not URI?): #{uri.inspect}"
      end
      uri.ascii_only? or
        raise InvalidURIError, "URI must be ascii only #{uri.dump}"
      if m = RFC3986_URI.match(uri)
        query = m["query".freeze]
        scheme = m["scheme".freeze]
        opaque = m["path-rootless".freeze]
        if opaque
          opaque << "?#{query}" if query
          [ scheme,
            nil, # userinfo
            nil, # host
            nil, # port
            nil, # registry
            nil, # path
            opaque,
            nil, # query
            m["fragment".freeze]
          ]
        else # normal
          [ scheme,
            m["userinfo".freeze],
            m["host".freeze],
            m["port".freeze],
            nil, # registry
            (m["path-abempty".freeze] ||
             m["path-absolute".freeze] ||
             m["path-empty".freeze]),
            nil, # opaque
            query,
            m["fragment".freeze]
          ]
        end
      elsif m = RFC3986_relative_ref.match(uri)
        [ nil, # scheme
          m["userinfo".freeze],
          m["host".freeze],
          m["port".freeze],
          nil, # registry,
          (m["path-abempty".freeze] ||
           m["path-absolute".freeze] ||
           m["path-noscheme".freeze] ||
           m["path-empty".freeze]),
          nil, # opaque
          m["query".freeze],
          m["fragment".freeze]
        ]
      else
        raise InvalidURIError, "bad URI(is not URI?): #{uri.inspect}"
      end
    end

    def parse(uri) # :nodoc:
      URI.for(*self.split(uri), self)
    end


    def join(*uris) # :nodoc:
      uris[0] = convert_to_uri(uris[0])
      uris.inject :merge
    end

    @@to_s = Kernel.instance_method(:to_s)
    if @@to_s.respond_to?(:bind_call)
      def inspect
        @@to_s.bind_call(self)
      end
    else
      def inspect
        @@to_s.bind(self).call
      end
    end

    private

    def default_regexp # :nodoc:
      {
        SCHEME: /\A[A-Za-z][A-Za-z0-9+\-.]*\z/,
        USERINFO: /\A(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*\z/,
        HOST: /\A(?:(?<IP-literal>\[(?:(?<IPv6address>(?:\h{1,4}:){6}(?<ls32>\h{1,4}:\h{1,4}|(?<IPv4address>(?<dec-octet>[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g<dec-octet>\.\g<dec-octet>\.\g<dec-octet>))|::(?:\h{1,4}:){5}\g<ls32>|\h{,4}::(?:\h{1,4}:){4}\g<ls32>|(?:(?:\h{1,4}:)?\h{1,4})?::(?:\h{1,4}:){3}\g<ls32>|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g<ls32>|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g<ls32>|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g<ls32>|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?<IPvFuture>v\h+\.[!$&-.0-;=A-Z_a-z~]+))\])|\g<IPv4address>|(?<reg-name>(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])*))\z/,
        ABS_PATH: /\A\/(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*(?:\/(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*)*\z/,
        REL_PATH: /\A(?:%\h\h|[!$&-.0-;=@-Z_a-z~])+(?:\/(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*)*\z/,
        QUERY: /\A(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*\z/,
        FRAGMENT: /\A(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*\z/,
        OPAQUE: /\A(?:[^\/].*)?\z/,
        PORT: /\A[\x09\x0a\x0c\x0d ]*+\d*[\x09\x0a\x0c\x0d ]*\z/,
      }
    end

    def convert_to_uri(uri)
      if uri.is_a?(URI::Generic)
        uri
      elsif uri = String.try_convert(uri)
        parse(uri)
      else
        raise ArgumentError,
          "bad argument (expected URI object or URI string)"
      end
    end

  end # class Parser
end # module URI
PK }$[���QQruby/uri/mailto.rbnu�[���# frozen_string_literal: false
# = uri/mailto.rb
#
# Author:: Akira Yamada <akira@ruby-lang.org>
# License:: You can redistribute it and/or modify it under the same term as Ruby.
#
# See URI for general documentation
#

require_relative 'generic'

module URI

  #
  # RFC6068, the mailto URL scheme.
  #
  class MailTo < Generic
    include RFC2396_REGEXP

    # A Default port of nil for URI::MailTo.
    DEFAULT_PORT = nil

    # An Array of the available components for URI::MailTo.
    COMPONENT = [ :scheme, :to, :headers ].freeze

    # :stopdoc:
    #  "hname" and "hvalue" are encodings of an RFC 822 header name and
    #  value, respectively. As with "to", all URL reserved characters must
    #  be encoded.
    #
    #  "#mailbox" is as specified in RFC 822 [RFC822]. This means that it
    #  consists of zero or more comma-separated mail addresses, possibly
    #  including "phrase" and "comment" components. Note that all URL
    #  reserved characters in "to" must be encoded: in particular,
    #  parentheses, commas, and the percent sign ("%"), which commonly occur
    #  in the "mailbox" syntax.
    #
    #  Within mailto URLs, the characters "?", "=", "&" are reserved.

    # ; RFC 6068
    # hfields      = "?" hfield *( "&" hfield )
    # hfield       = hfname "=" hfvalue
    # hfname       = *qchar
    # hfvalue      = *qchar
    # qchar        = unreserved / pct-encoded / some-delims
    # some-delims  = "!" / "$" / "'" / "(" / ")" / "*"
    #              / "+" / "," / ";" / ":" / "@"
    #
    # ; RFC3986
    # unreserved   = ALPHA / DIGIT / "-" / "." / "_" / "~"
    # pct-encoded  = "%" HEXDIG HEXDIG
    HEADER_REGEXP  = /\A(?<hfield>(?:%\h\h|[!$'-.0-;@-Z_a-z~])*=(?:%\h\h|[!$'-.0-;@-Z_a-z~])*)(?:&\g<hfield>)*\z/
    # practical regexp for email address
    # https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address
    EMAIL_REGEXP = /\A[a-zA-Z0-9.!\#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*\z/
    # :startdoc:

    #
    # == Description
    #
    # Creates a new URI::MailTo object from components, with syntax checking.
    #
    # Components can be provided as an Array or Hash. If an Array is used,
    # the components must be supplied as <code>[to, headers]</code>.
    #
    # If a Hash is used, the keys are the component names preceded by colons.
    #
    # The headers can be supplied as a pre-encoded string, such as
    # <code>"subject=subscribe&cc=address"</code>, or as an Array of Arrays
    # like <code>[['subject', 'subscribe'], ['cc', 'address']]</code>.
    #
    # Examples:
    #
    #    require 'uri'
    #
    #    m1 = URI::MailTo.build(['joe@example.com', 'subject=Ruby'])
    #    m1.to_s  # => "mailto:joe@example.com?subject=Ruby"
    #
    #    m2 = URI::MailTo.build(['john@example.com', [['Subject', 'Ruby'], ['Cc', 'jack@example.com']]])
    #    m2.to_s  # => "mailto:john@example.com?Subject=Ruby&Cc=jack@example.com"
    #
    #    m3 = URI::MailTo.build({:to => 'listman@example.com', :headers => [['subject', 'subscribe']]})
    #    m3.to_s  # => "mailto:listman@example.com?subject=subscribe"
    #
    def self.build(args)
      tmp = Util.make_components_hash(self, args)

      case tmp[:to]
      when Array
        tmp[:opaque] = tmp[:to].join(',')
      when String
        tmp[:opaque] = tmp[:to].dup
      else
        tmp[:opaque] = ''
      end

      if tmp[:headers]
        query =
          case tmp[:headers]
          when Array
            tmp[:headers].collect { |x|
              if x.kind_of?(Array)
                x[0] + '=' + x[1..-1].join
              else
                x.to_s
              end
            }.join('&')
          when Hash
            tmp[:headers].collect { |h,v|
              h + '=' + v
            }.join('&')
          else
            tmp[:headers].to_s
          end
        unless query.empty?
          tmp[:opaque] << '?' << query
        end
      end

      super(tmp)
    end

    #
    # == Description
    #
    # Creates a new URI::MailTo object from generic URL components with
    # no syntax checking.
    #
    # This method is usually called from URI::parse, which checks
    # the validity of each component.
    #
    def initialize(*arg)
      super(*arg)

      @to = nil
      @headers = []

      # The RFC3986 parser does not normally populate opaque
      @opaque = "?#{@query}" if @query && !@opaque

      unless @opaque
        raise InvalidComponentError,
          "missing opaque part for mailto URL"
      end
      to, header = @opaque.split('?', 2)
      # allow semicolon as a addr-spec separator
      # http://support.microsoft.com/kb/820868
      unless /\A(?:[^@,;]+@[^@,;]+(?:\z|[,;]))*\z/ =~ to
        raise InvalidComponentError,
          "unrecognised opaque part for mailtoURL: #{@opaque}"
      end

      if arg[10] # arg_check
        self.to = to
        self.headers = header
      else
        set_to(to)
        set_headers(header)
      end
    end

    # The primary e-mail address of the URL, as a String.
    attr_reader :to

    # E-mail headers set by the URL, as an Array of Arrays.
    attr_reader :headers

    # Checks the to +v+ component.
    def check_to(v)
      return true unless v
      return true if v.size == 0

      v.split(/[,;]/).each do |addr|
        # check url safety as path-rootless
        if /\A(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*\z/ !~ addr
          raise InvalidComponentError,
            "an address in 'to' is invalid as URI #{addr.dump}"
        end

        # check addr-spec
        # don't s/\+/ /g
        addr.gsub!(/%\h\h/, URI::TBLDECWWWCOMP_)
        if EMAIL_REGEXP !~ addr
          raise InvalidComponentError,
            "an address in 'to' is invalid as uri-escaped addr-spec #{addr.dump}"
        end
      end

      true
    end
    private :check_to

    # Private setter for to +v+.
    def set_to(v)
      @to = v
    end
    protected :set_to

    # Setter for to +v+.
    def to=(v)
      check_to(v)
      set_to(v)
      v
    end

    # Checks the headers +v+ component against either
    # * HEADER_REGEXP
    def check_headers(v)
      return true unless v
      return true if v.size == 0
      if HEADER_REGEXP !~ v
        raise InvalidComponentError,
          "bad component(expected opaque component): #{v}"
      end

      true
    end
    private :check_headers

    # Private setter for headers +v+.
    def set_headers(v)
      @headers = []
      if v
        v.split('&').each do |x|
          @headers << x.split(/=/, 2)
        end
      end
    end
    protected :set_headers

    # Setter for headers +v+.
    def headers=(v)
      check_headers(v)
      set_headers(v)
      v
    end

    # Constructs String from URI.
    def to_s
      @scheme + ':' +
        if @to
          @to
        else
          ''
        end +
        if @headers.size > 0
          '?' + @headers.collect{|x| x.join('=')}.join('&')
        else
          ''
        end +
        if @fragment
          '#' + @fragment
        else
          ''
        end
    end

    # Returns the RFC822 e-mail text equivalent of the URL, as a String.
    #
    # Example:
    #
    #   require 'uri'
    #
    #   uri = URI.parse("mailto:ruby-list@ruby-lang.org?Subject=subscribe&cc=myaddr")
    #   uri.to_mailtext
    #   # => "To: ruby-list@ruby-lang.org\nSubject: subscribe\nCc: myaddr\n\n\n"
    #
    def to_mailtext
      to = URI.decode_www_form_component(@to)
      head = ''
      body = ''
      @headers.each do |x|
        case x[0]
        when 'body'
          body = URI.decode_www_form_component(x[1])
        when 'to'
          to << ', ' + URI.decode_www_form_component(x[1])
        else
          head << URI.decode_www_form_component(x[0]).capitalize + ': ' +
            URI.decode_www_form_component(x[1])  + "\n"
        end
      end

      "To: #{to}
#{head}
#{body}
"
    end
    alias to_rfc822text to_mailtext
  end

  register_scheme 'MAILTO', MailTo
end
PK }$[��S��ruby/uri/http.rbnu�[���# frozen_string_literal: false
# = uri/http.rb
#
# Author:: Akira Yamada <akira@ruby-lang.org>
# License:: You can redistribute it and/or modify it under the same term as Ruby.
#
# See URI for general documentation
#

require_relative 'generic'

module URI

  #
  # The syntax of HTTP URIs is defined in RFC1738 section 3.3.
  #
  # Note that the Ruby URI library allows HTTP URLs containing usernames and
  # passwords. This is not legal as per the RFC, but used to be
  # supported in Internet Explorer 5 and 6, before the MS04-004 security
  # update. See <URL:http://support.microsoft.com/kb/834489>.
  #
  class HTTP < Generic
    # A Default port of 80 for URI::HTTP.
    DEFAULT_PORT = 80

    # An Array of the available components for URI::HTTP.
    COMPONENT = %i[
      scheme
      userinfo host port
      path
      query
      fragment
    ].freeze

    #
    # == Description
    #
    # Creates a new URI::HTTP object from components, with syntax checking.
    #
    # The components accepted are userinfo, host, port, path, query, and
    # fragment.
    #
    # The components should be provided either as an Array, or as a Hash
    # with keys formed by preceding the component names with a colon.
    #
    # If an Array is used, the components must be passed in the
    # order <code>[userinfo, host, port, path, query, fragment]</code>.
    #
    # Example:
    #
    #     uri = URI::HTTP.build(host: 'www.example.com', path: '/foo/bar')
    #
    #     uri = URI::HTTP.build([nil, "www.example.com", nil, "/path",
    #       "query", 'fragment'])
    #
    # Currently, if passed userinfo components this method generates
    # invalid HTTP URIs as per RFC 1738.
    #
    def self.build(args)
      tmp = Util.make_components_hash(self, args)
      super(tmp)
    end

    #
    # == Description
    #
    # Returns the full path for an HTTP request, as required by Net::HTTP::Get.
    #
    # If the URI contains a query, the full path is URI#path + '?' + URI#query.
    # Otherwise, the path is simply URI#path.
    #
    # Example:
    #
    #     uri = URI::HTTP.build(path: '/foo/bar', query: 'test=true')
    #     uri.request_uri #  => "/foo/bar?test=true"
    #
    def request_uri
      return unless @path

      url = @query ? "#@path?#@query" : @path.dup
      url.start_with?(?/.freeze) ? url : ?/ + url
    end

    #
    # == Description
    #
    # Returns the authority for an HTTP uri, as defined in
    # https://datatracker.ietf.org/doc/html/rfc3986/#section-3.2.
    #
    #
    # Example:
    #
    #     URI::HTTP.build(host: 'www.example.com', path: '/foo/bar').authority #=> "www.example.com"
    #     URI::HTTP.build(host: 'www.example.com', port: 8000, path: '/foo/bar').authority #=> "www.example.com:8000"
    #     URI::HTTP.build(host: 'www.example.com', port: 80, path: '/foo/bar').authority #=> "www.example.com"
    #
    def authority
      if port == default_port
        host
      else
        "#{host}:#{port}"
      end
    end

    #
    # == Description
    #
    # Returns the origin for an HTTP uri, as defined in
    # https://datatracker.ietf.org/doc/html/rfc6454.
    #
    #
    # Example:
    #
    #     URI::HTTP.build(host: 'www.example.com', path: '/foo/bar').origin #=> "http://www.example.com"
    #     URI::HTTP.build(host: 'www.example.com', port: 8000, path: '/foo/bar').origin #=> "http://www.example.com:8000"
    #     URI::HTTP.build(host: 'www.example.com', port: 80, path: '/foo/bar').origin #=> "http://www.example.com"
    #     URI::HTTPS.build(host: 'www.example.com', path: '/foo/bar').origin #=> "https://www.example.com"
    #
    def origin
      "#{scheme}://#{authority}"
    end
  end

  register_scheme 'HTTP', HTTP
end
PK }$[[<��ruby/uri/ftp.rbnu�[���# frozen_string_literal: false
# = uri/ftp.rb
#
# Author:: Akira Yamada <akira@ruby-lang.org>
# License:: You can redistribute it and/or modify it under the same term as Ruby.
#
# See URI for general documentation
#

require_relative 'generic'

module URI

  #
  # FTP URI syntax is defined by RFC1738 section 3.2.
  #
  # This class will be redesigned because of difference of implementations;
  # the structure of its path. draft-hoffman-ftp-uri-04 is a draft but it
  # is a good summary about the de facto spec.
  # http://tools.ietf.org/html/draft-hoffman-ftp-uri-04
  #
  class FTP < Generic
    # A Default port of 21 for URI::FTP.
    DEFAULT_PORT = 21

    #
    # An Array of the available components for URI::FTP.
    #
    COMPONENT = [
      :scheme,
      :userinfo, :host, :port,
      :path, :typecode
    ].freeze

    #
    # Typecode is "a", "i", or "d".
    #
    # * "a" indicates a text file (the FTP command was ASCII)
    # * "i" indicates a binary file (FTP command IMAGE)
    # * "d" indicates the contents of a directory should be displayed
    #
    TYPECODE = ['a', 'i', 'd'].freeze

    # Typecode prefix ";type=".
    TYPECODE_PREFIX = ';type='.freeze

    def self.new2(user, password, host, port, path,
                  typecode = nil, arg_check = true) # :nodoc:
      # Do not use this method!  Not tested.  [Bug #7301]
      # This methods remains just for compatibility,
      # Keep it undocumented until the active maintainer is assigned.
      typecode = nil if typecode.size == 0
      if typecode && !TYPECODE.include?(typecode)
        raise ArgumentError,
          "bad typecode is specified: #{typecode}"
      end

      # do escape

      self.new('ftp',
               [user, password],
               host, port, nil,
               typecode ? path + TYPECODE_PREFIX + typecode : path,
               nil, nil, nil, arg_check)
    end

    #
    # == Description
    #
    # Creates a new URI::FTP object from components, with syntax checking.
    #
    # The components accepted are +userinfo+, +host+, +port+, +path+, and
    # +typecode+.
    #
    # The components should be provided either as an Array, or as a Hash
    # with keys formed by preceding the component names with a colon.
    #
    # If an Array is used, the components must be passed in the
    # order <code>[userinfo, host, port, path, typecode]</code>.
    #
    # If the path supplied is absolute, it will be escaped in order to
    # make it absolute in the URI.
    #
    # Examples:
    #
    #     require 'uri'
    #
    #     uri1 = URI::FTP.build(['user:password', 'ftp.example.com', nil,
    #       '/path/file.zip', 'i'])
    #     uri1.to_s  # => "ftp://user:password@ftp.example.com/%2Fpath/file.zip;type=i"
    #
    #     uri2 = URI::FTP.build({:host => 'ftp.example.com',
    #       :path => 'ruby/src'})
    #     uri2.to_s  # => "ftp://ftp.example.com/ruby/src"
    #
    def self.build(args)

      # Fix the incoming path to be generic URL syntax
      # FTP path  ->  URL path
      # foo/bar       /foo/bar
      # /foo/bar      /%2Ffoo/bar
      #
      if args.kind_of?(Array)
        args[3] = '/' + args[3].sub(/^\//, '%2F')
      else
        args[:path] = '/' + args[:path].sub(/^\//, '%2F')
      end

      tmp = Util::make_components_hash(self, args)

      if tmp[:typecode]
        if tmp[:typecode].size == 1
          tmp[:typecode] = TYPECODE_PREFIX + tmp[:typecode]
        end
        tmp[:path] << tmp[:typecode]
      end

      return super(tmp)
    end

    #
    # == Description
    #
    # Creates a new URI::FTP object from generic URL components with no
    # syntax checking.
    #
    # Unlike build(), this method does not escape the path component as
    # required by RFC1738; instead it is treated as per RFC2396.
    #
    # Arguments are +scheme+, +userinfo+, +host+, +port+, +registry+, +path+,
    # +opaque+, +query+, and +fragment+, in that order.
    #
    def initialize(scheme,
                   userinfo, host, port, registry,
                   path, opaque,
                   query,
                   fragment,
                   parser = nil,
                   arg_check = false)
      raise InvalidURIError unless path
      path = path.sub(/^\//,'')
      path.sub!(/^%2F/,'/')
      super(scheme, userinfo, host, port, registry, path, opaque,
            query, fragment, parser, arg_check)
      @typecode = nil
      if tmp = @path.index(TYPECODE_PREFIX)
        typecode = @path[tmp + TYPECODE_PREFIX.size..-1]
        @path = @path[0..tmp - 1]

        if arg_check
          self.typecode = typecode
        else
          self.set_typecode(typecode)
        end
      end
    end

    # typecode accessor.
    #
    # See URI::FTP::COMPONENT.
    attr_reader :typecode

    # Validates typecode +v+,
    # returns +true+ or +false+.
    #
    def check_typecode(v)
      if TYPECODE.include?(v)
        return true
      else
        raise InvalidComponentError,
          "bad typecode(expected #{TYPECODE.join(', ')}): #{v}"
      end
    end
    private :check_typecode

    # Private setter for the typecode +v+.
    #
    # See also URI::FTP.typecode=.
    #
    def set_typecode(v)
      @typecode = v
    end
    protected :set_typecode

    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the typecode +v+
    # (with validation).
    #
    # See also URI::FTP.check_typecode.
    #
    # == Usage
    #
    #   require 'uri'
    #
    #   uri = URI.parse("ftp://john@ftp.example.com/my_file.img")
    #   #=> #<URI::FTP ftp://john@ftp.example.com/my_file.img>
    #   uri.typecode = "i"
    #   uri
    #   #=> #<URI::FTP ftp://john@ftp.example.com/my_file.img;type=i>
    #
    def typecode=(typecode)
      check_typecode(typecode)
      set_typecode(typecode)
      typecode
    end

    def merge(oth) # :nodoc:
      tmp = super(oth)
      if self != tmp
        tmp.set_typecode(oth.typecode)
      end

      return tmp
    end

    # Returns the path from an FTP URI.
    #
    # RFC 1738 specifically states that the path for an FTP URI does not
    # include the / which separates the URI path from the URI host. Example:
    #
    # <code>ftp://ftp.example.com/pub/ruby</code>
    #
    # The above URI indicates that the client should connect to
    # ftp.example.com then cd to pub/ruby from the initial login directory.
    #
    # If you want to cd to an absolute directory, you must include an
    # escaped / (%2F) in the path. Example:
    #
    # <code>ftp://ftp.example.com/%2Fpub/ruby</code>
    #
    # This method will then return "/pub/ruby".
    #
    def path
      return @path.sub(/^\//,'').sub(/^%2F/,'/')
    end

    # Private setter for the path of the URI::FTP.
    def set_path(v)
      super("/" + v.sub(/^\//, "%2F"))
    end
    protected :set_path

    # Returns a String representation of the URI::FTP.
    def to_s
      save_path = nil
      if @typecode
        save_path = @path
        @path = @path + TYPECODE_PREFIX + @typecode
      end
      str = super
      if @typecode
        @path = save_path
      end

      return str
    end
  end

  register_scheme 'FTP', FTP
end
PK!}$[�K���ruby/uri/ws.rbnu�[���# frozen_string_literal: false
# = uri/ws.rb
#
# Author:: Matt Muller <mamuller@amazon.com>
# License:: You can redistribute it and/or modify it under the same term as Ruby.
#
# See URI for general documentation
#

require_relative 'generic'

module URI

  #
  # The syntax of WS URIs is defined in RFC6455 section 3.
  #
  # Note that the Ruby URI library allows WS URLs containing usernames and
  # passwords. This is not legal as per the RFC, but used to be
  # supported in Internet Explorer 5 and 6, before the MS04-004 security
  # update. See <URL:http://support.microsoft.com/kb/834489>.
  #
  class WS < Generic
    # A Default port of 80 for URI::WS.
    DEFAULT_PORT = 80

    # An Array of the available components for URI::WS.
    COMPONENT = %i[
      scheme
      userinfo host port
      path
      query
    ].freeze

    #
    # == Description
    #
    # Creates a new URI::WS object from components, with syntax checking.
    #
    # The components accepted are userinfo, host, port, path, and query.
    #
    # The components should be provided either as an Array, or as a Hash
    # with keys formed by preceding the component names with a colon.
    #
    # If an Array is used, the components must be passed in the
    # order <code>[userinfo, host, port, path, query]</code>.
    #
    # Example:
    #
    #     uri = URI::WS.build(host: 'www.example.com', path: '/foo/bar')
    #
    #     uri = URI::WS.build([nil, "www.example.com", nil, "/path", "query"])
    #
    # Currently, if passed userinfo components this method generates
    # invalid WS URIs as per RFC 1738.
    #
    def self.build(args)
      tmp = Util.make_components_hash(self, args)
      super(tmp)
    end

    #
    # == Description
    #
    # Returns the full path for a WS URI, as required by Net::HTTP::Get.
    #
    # If the URI contains a query, the full path is URI#path + '?' + URI#query.
    # Otherwise, the path is simply URI#path.
    #
    # Example:
    #
    #     uri = URI::WS.build(path: '/foo/bar', query: 'test=true')
    #     uri.request_uri #  => "/foo/bar?test=true"
    #
    def request_uri
      return unless @path

      url = @query ? "#@path?#@query" : @path.dup
      url.start_with?(?/.freeze) ? url : ?/ + url
    end
  end

  register_scheme 'WS', WS
end
PK!}$[��&O&Oruby/uri/common.rbnu�[���# frozen_string_literal: true
#--
# = uri/common.rb
#
# Author:: Akira Yamada <akira@ruby-lang.org>
# License::
#   You can redistribute it and/or modify it under the same term as Ruby.
#
# See URI for general documentation
#

require_relative "rfc2396_parser"
require_relative "rfc3986_parser"

module URI
  include RFC2396_REGEXP

  REGEXP = RFC2396_REGEXP
  Parser = RFC2396_Parser
  RFC3986_PARSER = RFC3986_Parser.new
  Ractor.make_shareable(RFC3986_PARSER) if defined?(Ractor)
  RFC2396_PARSER = RFC2396_Parser.new
  Ractor.make_shareable(RFC2396_PARSER) if defined?(Ractor)

  # URI::Parser.new
  DEFAULT_PARSER = Parser.new
  DEFAULT_PARSER.pattern.each_pair do |sym, str|
    unless REGEXP::PATTERN.const_defined?(sym)
      REGEXP::PATTERN.const_set(sym, str)
    end
  end
  DEFAULT_PARSER.regexp.each_pair do |sym, str|
    const_set(sym, str)
  end
  Ractor.make_shareable(DEFAULT_PARSER) if defined?(Ractor)

  module Util # :nodoc:
    def make_components_hash(klass, array_hash)
      tmp = {}
      if array_hash.kind_of?(Array) &&
          array_hash.size == klass.component.size - 1
        klass.component[1..-1].each_index do |i|
          begin
            tmp[klass.component[i + 1]] = array_hash[i].clone
          rescue TypeError
            tmp[klass.component[i + 1]] = array_hash[i]
          end
        end

      elsif array_hash.kind_of?(Hash)
        array_hash.each do |key, value|
          begin
            tmp[key] = value.clone
          rescue TypeError
            tmp[key] = value
          end
        end
      else
        raise ArgumentError,
          "expected Array of or Hash of components of #{klass} (#{klass.component[1..-1].join(', ')})"
      end
      tmp[:scheme] = klass.to_s.sub(/\A.*::/, '').downcase

      return tmp
    end
    module_function :make_components_hash
  end

  module Schemes
  end
  private_constant :Schemes

  #
  # Register the given +klass+ to be instantiated when parsing URLs with the given +scheme+.
  # Note that currently only schemes which after .upcase are valid constant names
  # can be registered (no -/+/. allowed).
  #
  def self.register_scheme(scheme, klass)
    Schemes.const_set(scheme.to_s.upcase, klass)
  end

  # Returns a Hash of the defined schemes.
  def self.scheme_list
    Schemes.constants.map { |name|
      [name.to_s.upcase, Schemes.const_get(name)]
    }.to_h
  end

  INITIAL_SCHEMES = scheme_list
  private_constant :INITIAL_SCHEMES
  Ractor.make_shareable(INITIAL_SCHEMES) if defined?(Ractor)

  #
  # Construct a URI instance, using the scheme to detect the appropriate class
  # from +URI.scheme_list+.
  #
  def self.for(scheme, *arguments, default: Generic)
    const_name = scheme.to_s.upcase

    uri_class = INITIAL_SCHEMES[const_name]
    uri_class ||= if /\A[A-Z]\w*\z/.match?(const_name) && Schemes.const_defined?(const_name, false)
      Schemes.const_get(const_name, false)
    end
    uri_class ||= default

    return uri_class.new(scheme, *arguments)
  end

  #
  # Base class for all URI exceptions.
  #
  class Error < StandardError; end
  #
  # Not a URI.
  #
  class InvalidURIError < Error; end
  #
  # Not a URI component.
  #
  class InvalidComponentError < Error; end
  #
  # URI is valid, bad usage is not.
  #
  class BadURIError < Error; end

  #
  # == Synopsis
  #
  #   URI::split(uri)
  #
  # == Args
  #
  # +uri+::
  #   String with URI.
  #
  # == Description
  #
  # Splits the string on following parts and returns array with result:
  #
  # * Scheme
  # * Userinfo
  # * Host
  # * Port
  # * Registry
  # * Path
  # * Opaque
  # * Query
  # * Fragment
  #
  # == Usage
  #
  #   require 'uri'
  #
  #   URI.split("http://www.ruby-lang.org/")
  #   # => ["http", nil, "www.ruby-lang.org", nil, nil, "/", nil, nil, nil]
  #
  def self.split(uri)
    RFC3986_PARSER.split(uri)
  end

  #
  # == Synopsis
  #
  #   URI::parse(uri_str)
  #
  # == Args
  #
  # +uri_str+::
  #   String with URI.
  #
  # == Description
  #
  # Creates one of the URI's subclasses instance from the string.
  #
  # == Raises
  #
  # URI::InvalidURIError::
  #   Raised if URI given is not a correct one.
  #
  # == Usage
  #
  #   require 'uri'
  #
  #   uri = URI.parse("http://www.ruby-lang.org/")
  #   # => #<URI::HTTP http://www.ruby-lang.org/>
  #   uri.scheme
  #   # => "http"
  #   uri.host
  #   # => "www.ruby-lang.org"
  #
  # It's recommended to first ::escape the provided +uri_str+ if there are any
  # invalid URI characters.
  #
  def self.parse(uri)
    RFC3986_PARSER.parse(uri)
  end

  #
  # == Synopsis
  #
  #   URI::join(str[, str, ...])
  #
  # == Args
  #
  # +str+::
  #   String(s) to work with, will be converted to RFC3986 URIs before merging.
  #
  # == Description
  #
  # Joins URIs.
  #
  # == Usage
  #
  #   require 'uri'
  #
  #   URI.join("http://example.com/","main.rbx")
  #   # => #<URI::HTTP http://example.com/main.rbx>
  #
  #   URI.join('http://example.com', 'foo')
  #   # => #<URI::HTTP http://example.com/foo>
  #
  #   URI.join('http://example.com', '/foo', '/bar')
  #   # => #<URI::HTTP http://example.com/bar>
  #
  #   URI.join('http://example.com', '/foo', 'bar')
  #   # => #<URI::HTTP http://example.com/bar>
  #
  #   URI.join('http://example.com', '/foo/', 'bar')
  #   # => #<URI::HTTP http://example.com/foo/bar>
  #
  def self.join(*str)
    RFC3986_PARSER.join(*str)
  end

  #
  # == Synopsis
  #
  #   URI::extract(str[, schemes][,&blk])
  #
  # == Args
  #
  # +str+::
  #   String to extract URIs from.
  # +schemes+::
  #   Limit URI matching to specific schemes.
  #
  # == Description
  #
  # Extracts URIs from a string. If block given, iterates through all matched URIs.
  # Returns nil if block given or array with matches.
  #
  # == Usage
  #
  #   require "uri"
  #
  #   URI.extract("text here http://foo.example.org/bla and here mailto:test@example.com and here also.")
  #   # => ["http://foo.example.com/bla", "mailto:test@example.com"]
  #
  def self.extract(str, schemes = nil, &block)
    warn "URI.extract is obsolete", uplevel: 1 if $VERBOSE
    DEFAULT_PARSER.extract(str, schemes, &block)
  end

  #
  # == Synopsis
  #
  #   URI::regexp([match_schemes])
  #
  # == Args
  #
  # +match_schemes+::
  #   Array of schemes. If given, resulting regexp matches to URIs
  #   whose scheme is one of the match_schemes.
  #
  # == Description
  #
  # Returns a Regexp object which matches to URI-like strings.
  # The Regexp object returned by this method includes arbitrary
  # number of capture group (parentheses).  Never rely on its number.
  #
  # == Usage
  #
  #   require 'uri'
  #
  #   # extract first URI from html_string
  #   html_string.slice(URI.regexp)
  #
  #   # remove ftp URIs
  #   html_string.sub(URI.regexp(['ftp']), '')
  #
  #   # You should not rely on the number of parentheses
  #   html_string.scan(URI.regexp) do |*matches|
  #     p $&
  #   end
  #
  def self.regexp(schemes = nil)
    warn "URI.regexp is obsolete", uplevel: 1 if $VERBOSE
    DEFAULT_PARSER.make_regexp(schemes)
  end

  TBLENCWWWCOMP_ = {} # :nodoc:
  256.times do |i|
    TBLENCWWWCOMP_[-i.chr] = -('%%%02X' % i)
  end
  TBLENCURICOMP_ = TBLENCWWWCOMP_.dup.freeze
  TBLENCWWWCOMP_[' '] = '+'
  TBLENCWWWCOMP_.freeze
  TBLDECWWWCOMP_ = {} # :nodoc:
  256.times do |i|
    h, l = i>>4, i&15
    TBLDECWWWCOMP_[-('%%%X%X' % [h, l])] = -i.chr
    TBLDECWWWCOMP_[-('%%%x%X' % [h, l])] = -i.chr
    TBLDECWWWCOMP_[-('%%%X%x' % [h, l])] = -i.chr
    TBLDECWWWCOMP_[-('%%%x%x' % [h, l])] = -i.chr
  end
  TBLDECWWWCOMP_['+'] = ' '
  TBLDECWWWCOMP_.freeze

  # Encodes given +str+ to URL-encoded form data.
  #
  # This method doesn't convert *, -, ., 0-9, A-Z, _, a-z, but does convert SP
  # (ASCII space) to + and converts others to %XX.
  #
  # If +enc+ is given, convert +str+ to the encoding before percent encoding.
  #
  # This is an implementation of
  # https://www.w3.org/TR/2013/CR-html5-20130806/forms.html#url-encoded-form-data.
  #
  # See URI.decode_www_form_component, URI.encode_www_form.
  def self.encode_www_form_component(str, enc=nil)
    _encode_uri_component(/[^*\-.0-9A-Z_a-z]/, TBLENCWWWCOMP_, str, enc)
  end

  # Decodes given +str+ of URL-encoded form data.
  #
  # This decodes + to SP.
  #
  # See URI.encode_www_form_component, URI.decode_www_form.
  def self.decode_www_form_component(str, enc=Encoding::UTF_8)
    _decode_uri_component(/\+|%\h\h/, str, enc)
  end

  # Encodes +str+ using URL encoding
  #
  # This encodes SP to %20 instead of +.
  def self.encode_uri_component(str, enc=nil)
    _encode_uri_component(/[^*\-.0-9A-Z_a-z]/, TBLENCURICOMP_, str, enc)
  end

  # Decodes given +str+ of URL-encoded data.
  #
  # This does not decode + to SP.
  def self.decode_uri_component(str, enc=Encoding::UTF_8)
    _decode_uri_component(/%\h\h/, str, enc)
  end

  def self._encode_uri_component(regexp, table, str, enc)
    str = str.to_s.dup
    if str.encoding != Encoding::ASCII_8BIT
      if enc && enc != Encoding::ASCII_8BIT
        str.encode!(Encoding::UTF_8, invalid: :replace, undef: :replace)
        str.encode!(enc, fallback: ->(x){"&##{x.ord};"})
      end
      str.force_encoding(Encoding::ASCII_8BIT)
    end
    str.gsub!(regexp, table)
    str.force_encoding(Encoding::US_ASCII)
  end
  private_class_method :_encode_uri_component

  def self._decode_uri_component(regexp, str, enc)
    raise ArgumentError, "invalid %-encoding (#{str})" if /%(?!\h\h)/.match?(str)
    str.b.gsub(regexp, TBLDECWWWCOMP_).force_encoding(enc)
  end
  private_class_method :_decode_uri_component

  # Generates URL-encoded form data from given +enum+.
  #
  # This generates application/x-www-form-urlencoded data defined in HTML5
  # from given an Enumerable object.
  #
  # This internally uses URI.encode_www_form_component(str).
  #
  # This method doesn't convert the encoding of given items, so convert them
  # before calling this method if you want to send data as other than original
  # encoding or mixed encoding data. (Strings which are encoded in an HTML5
  # ASCII incompatible encoding are converted to UTF-8.)
  #
  # This method doesn't handle files.  When you send a file, use
  # multipart/form-data.
  #
  # This refers https://url.spec.whatwg.org/#concept-urlencoded-serializer
  #
  #    URI.encode_www_form([["q", "ruby"], ["lang", "en"]])
  #    #=> "q=ruby&lang=en"
  #    URI.encode_www_form("q" => "ruby", "lang" => "en")
  #    #=> "q=ruby&lang=en"
  #    URI.encode_www_form("q" => ["ruby", "perl"], "lang" => "en")
  #    #=> "q=ruby&q=perl&lang=en"
  #    URI.encode_www_form([["q", "ruby"], ["q", "perl"], ["lang", "en"]])
  #    #=> "q=ruby&q=perl&lang=en"
  #
  # See URI.encode_www_form_component, URI.decode_www_form.
  def self.encode_www_form(enum, enc=nil)
    enum.map do |k,v|
      if v.nil?
        encode_www_form_component(k, enc)
      elsif v.respond_to?(:to_ary)
        v.to_ary.map do |w|
          str = encode_www_form_component(k, enc)
          unless w.nil?
            str << '='
            str << encode_www_form_component(w, enc)
          end
        end.join('&')
      else
        str = encode_www_form_component(k, enc)
        str << '='
        str << encode_www_form_component(v, enc)
      end
    end.join('&')
  end

  # Decodes URL-encoded form data from given +str+.
  #
  # This decodes application/x-www-form-urlencoded data
  # and returns an array of key-value arrays.
  #
  # This refers http://url.spec.whatwg.org/#concept-urlencoded-parser,
  # so this supports only &-separator, and doesn't support ;-separator.
  #
  #    ary = URI.decode_www_form("a=1&a=2&b=3")
  #    ary                   #=> [['a', '1'], ['a', '2'], ['b', '3']]
  #    ary.assoc('a').last   #=> '1'
  #    ary.assoc('b').last   #=> '3'
  #    ary.rassoc('a').last  #=> '2'
  #    Hash[ary]             #=> {"a"=>"2", "b"=>"3"}
  #
  # See URI.decode_www_form_component, URI.encode_www_form.
  def self.decode_www_form(str, enc=Encoding::UTF_8, separator: '&', use__charset_: false, isindex: false)
    raise ArgumentError, "the input of #{self.name}.#{__method__} must be ASCII only string" unless str.ascii_only?
    ary = []
    return ary if str.empty?
    enc = Encoding.find(enc)
    str.b.each_line(separator) do |string|
      string.chomp!(separator)
      key, sep, val = string.partition('=')
      if isindex
        if sep.empty?
          val = key
          key = +''
        end
        isindex = false
      end

      if use__charset_ and key == '_charset_' and e = get_encoding(val)
        enc = e
        use__charset_ = false
      end

      key.gsub!(/\+|%\h\h/, TBLDECWWWCOMP_)
      if val
        val.gsub!(/\+|%\h\h/, TBLDECWWWCOMP_)
      else
        val = +''
      end

      ary << [key, val]
    end
    ary.each do |k, v|
      k.force_encoding(enc)
      k.scrub!
      v.force_encoding(enc)
      v.scrub!
    end
    ary
  end

  private
=begin command for WEB_ENCODINGS_
  curl https://encoding.spec.whatwg.org/encodings.json|
  ruby -rjson -e 'H={}
  h={
    "shift_jis"=>"Windows-31J",
    "euc-jp"=>"cp51932",
    "iso-2022-jp"=>"cp50221",
    "x-mac-cyrillic"=>"macCyrillic",
  }
  JSON($<.read).map{|x|x["encodings"]}.flatten.each{|x|
    Encoding.find(n=h.fetch(n=x["name"].downcase,n))rescue next
    x["labels"].each{|y|H[y]=n}
  }
  puts "{"
  H.each{|k,v|puts %[  #{k.dump}=>#{v.dump},]}
  puts "}"
'
=end
  WEB_ENCODINGS_ = {
    "unicode-1-1-utf-8"=>"utf-8",
    "utf-8"=>"utf-8",
    "utf8"=>"utf-8",
    "866"=>"ibm866",
    "cp866"=>"ibm866",
    "csibm866"=>"ibm866",
    "ibm866"=>"ibm866",
    "csisolatin2"=>"iso-8859-2",
    "iso-8859-2"=>"iso-8859-2",
    "iso-ir-101"=>"iso-8859-2",
    "iso8859-2"=>"iso-8859-2",
    "iso88592"=>"iso-8859-2",
    "iso_8859-2"=>"iso-8859-2",
    "iso_8859-2:1987"=>"iso-8859-2",
    "l2"=>"iso-8859-2",
    "latin2"=>"iso-8859-2",
    "csisolatin3"=>"iso-8859-3",
    "iso-8859-3"=>"iso-8859-3",
    "iso-ir-109"=>"iso-8859-3",
    "iso8859-3"=>"iso-8859-3",
    "iso88593"=>"iso-8859-3",
    "iso_8859-3"=>"iso-8859-3",
    "iso_8859-3:1988"=>"iso-8859-3",
    "l3"=>"iso-8859-3",
    "latin3"=>"iso-8859-3",
    "csisolatin4"=>"iso-8859-4",
    "iso-8859-4"=>"iso-8859-4",
    "iso-ir-110"=>"iso-8859-4",
    "iso8859-4"=>"iso-8859-4",
    "iso88594"=>"iso-8859-4",
    "iso_8859-4"=>"iso-8859-4",
    "iso_8859-4:1988"=>"iso-8859-4",
    "l4"=>"iso-8859-4",
    "latin4"=>"iso-8859-4",
    "csisolatincyrillic"=>"iso-8859-5",
    "cyrillic"=>"iso-8859-5",
    "iso-8859-5"=>"iso-8859-5",
    "iso-ir-144"=>"iso-8859-5",
    "iso8859-5"=>"iso-8859-5",
    "iso88595"=>"iso-8859-5",
    "iso_8859-5"=>"iso-8859-5",
    "iso_8859-5:1988"=>"iso-8859-5",
    "arabic"=>"iso-8859-6",
    "asmo-708"=>"iso-8859-6",
    "csiso88596e"=>"iso-8859-6",
    "csiso88596i"=>"iso-8859-6",
    "csisolatinarabic"=>"iso-8859-6",
    "ecma-114"=>"iso-8859-6",
    "iso-8859-6"=>"iso-8859-6",
    "iso-8859-6-e"=>"iso-8859-6",
    "iso-8859-6-i"=>"iso-8859-6",
    "iso-ir-127"=>"iso-8859-6",
    "iso8859-6"=>"iso-8859-6",
    "iso88596"=>"iso-8859-6",
    "iso_8859-6"=>"iso-8859-6",
    "iso_8859-6:1987"=>"iso-8859-6",
    "csisolatingreek"=>"iso-8859-7",
    "ecma-118"=>"iso-8859-7",
    "elot_928"=>"iso-8859-7",
    "greek"=>"iso-8859-7",
    "greek8"=>"iso-8859-7",
    "iso-8859-7"=>"iso-8859-7",
    "iso-ir-126"=>"iso-8859-7",
    "iso8859-7"=>"iso-8859-7",
    "iso88597"=>"iso-8859-7",
    "iso_8859-7"=>"iso-8859-7",
    "iso_8859-7:1987"=>"iso-8859-7",
    "sun_eu_greek"=>"iso-8859-7",
    "csiso88598e"=>"iso-8859-8",
    "csisolatinhebrew"=>"iso-8859-8",
    "hebrew"=>"iso-8859-8",
    "iso-8859-8"=>"iso-8859-8",
    "iso-8859-8-e"=>"iso-8859-8",
    "iso-ir-138"=>"iso-8859-8",
    "iso8859-8"=>"iso-8859-8",
    "iso88598"=>"iso-8859-8",
    "iso_8859-8"=>"iso-8859-8",
    "iso_8859-8:1988"=>"iso-8859-8",
    "visual"=>"iso-8859-8",
    "csisolatin6"=>"iso-8859-10",
    "iso-8859-10"=>"iso-8859-10",
    "iso-ir-157"=>"iso-8859-10",
    "iso8859-10"=>"iso-8859-10",
    "iso885910"=>"iso-8859-10",
    "l6"=>"iso-8859-10",
    "latin6"=>"iso-8859-10",
    "iso-8859-13"=>"iso-8859-13",
    "iso8859-13"=>"iso-8859-13",
    "iso885913"=>"iso-8859-13",
    "iso-8859-14"=>"iso-8859-14",
    "iso8859-14"=>"iso-8859-14",
    "iso885914"=>"iso-8859-14",
    "csisolatin9"=>"iso-8859-15",
    "iso-8859-15"=>"iso-8859-15",
    "iso8859-15"=>"iso-8859-15",
    "iso885915"=>"iso-8859-15",
    "iso_8859-15"=>"iso-8859-15",
    "l9"=>"iso-8859-15",
    "iso-8859-16"=>"iso-8859-16",
    "cskoi8r"=>"koi8-r",
    "koi"=>"koi8-r",
    "koi8"=>"koi8-r",
    "koi8-r"=>"koi8-r",
    "koi8_r"=>"koi8-r",
    "koi8-ru"=>"koi8-u",
    "koi8-u"=>"koi8-u",
    "dos-874"=>"windows-874",
    "iso-8859-11"=>"windows-874",
    "iso8859-11"=>"windows-874",
    "iso885911"=>"windows-874",
    "tis-620"=>"windows-874",
    "windows-874"=>"windows-874",
    "cp1250"=>"windows-1250",
    "windows-1250"=>"windows-1250",
    "x-cp1250"=>"windows-1250",
    "cp1251"=>"windows-1251",
    "windows-1251"=>"windows-1251",
    "x-cp1251"=>"windows-1251",
    "ansi_x3.4-1968"=>"windows-1252",
    "ascii"=>"windows-1252",
    "cp1252"=>"windows-1252",
    "cp819"=>"windows-1252",
    "csisolatin1"=>"windows-1252",
    "ibm819"=>"windows-1252",
    "iso-8859-1"=>"windows-1252",
    "iso-ir-100"=>"windows-1252",
    "iso8859-1"=>"windows-1252",
    "iso88591"=>"windows-1252",
    "iso_8859-1"=>"windows-1252",
    "iso_8859-1:1987"=>"windows-1252",
    "l1"=>"windows-1252",
    "latin1"=>"windows-1252",
    "us-ascii"=>"windows-1252",
    "windows-1252"=>"windows-1252",
    "x-cp1252"=>"windows-1252",
    "cp1253"=>"windows-1253",
    "windows-1253"=>"windows-1253",
    "x-cp1253"=>"windows-1253",
    "cp1254"=>"windows-1254",
    "csisolatin5"=>"windows-1254",
    "iso-8859-9"=>"windows-1254",
    "iso-ir-148"=>"windows-1254",
    "iso8859-9"=>"windows-1254",
    "iso88599"=>"windows-1254",
    "iso_8859-9"=>"windows-1254",
    "iso_8859-9:1989"=>"windows-1254",
    "l5"=>"windows-1254",
    "latin5"=>"windows-1254",
    "windows-1254"=>"windows-1254",
    "x-cp1254"=>"windows-1254",
    "cp1255"=>"windows-1255",
    "windows-1255"=>"windows-1255",
    "x-cp1255"=>"windows-1255",
    "cp1256"=>"windows-1256",
    "windows-1256"=>"windows-1256",
    "x-cp1256"=>"windows-1256",
    "cp1257"=>"windows-1257",
    "windows-1257"=>"windows-1257",
    "x-cp1257"=>"windows-1257",
    "cp1258"=>"windows-1258",
    "windows-1258"=>"windows-1258",
    "x-cp1258"=>"windows-1258",
    "x-mac-cyrillic"=>"macCyrillic",
    "x-mac-ukrainian"=>"macCyrillic",
    "chinese"=>"gbk",
    "csgb2312"=>"gbk",
    "csiso58gb231280"=>"gbk",
    "gb2312"=>"gbk",
    "gb_2312"=>"gbk",
    "gb_2312-80"=>"gbk",
    "gbk"=>"gbk",
    "iso-ir-58"=>"gbk",
    "x-gbk"=>"gbk",
    "gb18030"=>"gb18030",
    "big5"=>"big5",
    "big5-hkscs"=>"big5",
    "cn-big5"=>"big5",
    "csbig5"=>"big5",
    "x-x-big5"=>"big5",
    "cseucpkdfmtjapanese"=>"cp51932",
    "euc-jp"=>"cp51932",
    "x-euc-jp"=>"cp51932",
    "csiso2022jp"=>"cp50221",
    "iso-2022-jp"=>"cp50221",
    "csshiftjis"=>"Windows-31J",
    "ms932"=>"Windows-31J",
    "ms_kanji"=>"Windows-31J",
    "shift-jis"=>"Windows-31J",
    "shift_jis"=>"Windows-31J",
    "sjis"=>"Windows-31J",
    "windows-31j"=>"Windows-31J",
    "x-sjis"=>"Windows-31J",
    "cseuckr"=>"euc-kr",
    "csksc56011987"=>"euc-kr",
    "euc-kr"=>"euc-kr",
    "iso-ir-149"=>"euc-kr",
    "korean"=>"euc-kr",
    "ks_c_5601-1987"=>"euc-kr",
    "ks_c_5601-1989"=>"euc-kr",
    "ksc5601"=>"euc-kr",
    "ksc_5601"=>"euc-kr",
    "windows-949"=>"euc-kr",
    "utf-16be"=>"utf-16be",
    "utf-16"=>"utf-16le",
    "utf-16le"=>"utf-16le",
  } # :nodoc:
  Ractor.make_shareable(WEB_ENCODINGS_) if defined?(Ractor)

  # :nodoc:
  # return encoding or nil
  # http://encoding.spec.whatwg.org/#concept-encoding-get
  def self.get_encoding(label)
    Encoding.find(WEB_ENCODINGS_[label.to_str.strip.downcase]) rescue nil
  end
end # module URI

module Kernel

  #
  # Returns +uri+ converted to an URI object.
  #
  def URI(uri)
    if uri.is_a?(URI::Generic)
      uri
    elsif uri = String.try_convert(uri)
      URI.parse(uri)
    else
      raise ArgumentError,
        "bad argument (expected URI object or URI string)"
    end
  end
  module_function :URI
end
PK!}$[�R�ruby/uri/wss.rbnu�[���# frozen_string_literal: false
# = uri/wss.rb
#
# Author:: Matt Muller <mamuller@amazon.com>
# License:: You can redistribute it and/or modify it under the same term as Ruby.
#
# See URI for general documentation
#

require_relative 'ws'

module URI

  # The default port for WSS URIs is 443, and the scheme is 'wss:' rather
  # than 'ws:'. Other than that, WSS URIs are identical to WS URIs;
  # see URI::WS.
  class WSS < WS
    # A Default port of 443 for URI::WSS
    DEFAULT_PORT = 443
  end

  register_scheme 'WSS', WSS
end
PK!}$[79���ruby/uri/file.rbnu�[���# frozen_string_literal: true

require_relative 'generic'

module URI

  #
  # The "file" URI is defined by RFC8089.
  #
  class File < Generic
    # A Default port of nil for URI::File.
    DEFAULT_PORT = nil

    #
    # An Array of the available components for URI::File.
    #
    COMPONENT = [
      :scheme,
      :host,
      :path
    ].freeze

    #
    # == Description
    #
    # Creates a new URI::File object from components, with syntax checking.
    #
    # The components accepted are +host+ and +path+.
    #
    # The components should be provided either as an Array, or as a Hash
    # with keys formed by preceding the component names with a colon.
    #
    # If an Array is used, the components must be passed in the
    # order <code>[host, path]</code>.
    #
    # A path from e.g. the File class should be escaped before
    # being passed.
    #
    # Examples:
    #
    #     require 'uri'
    #
    #     uri1 = URI::File.build(['host.example.com', '/path/file.zip'])
    #     uri1.to_s  # => "file://host.example.com/path/file.zip"
    #
    #     uri2 = URI::File.build({:host => 'host.example.com',
    #       :path => '/ruby/src'})
    #     uri2.to_s  # => "file://host.example.com/ruby/src"
    #
    #     uri3 = URI::File.build({:path => URI::escape('/path/my file.txt')})
    #     uri3.to_s  # => "file:///path/my%20file.txt"
    #
    def self.build(args)
      tmp = Util::make_components_hash(self, args)
      super(tmp)
    end

    # Protected setter for the host component +v+.
    #
    # See also URI::Generic.host=.
    #
    def set_host(v)
      v = "" if v.nil? || v == "localhost"
      @host = v
    end

    # do nothing
    def set_port(v)
    end

    # raise InvalidURIError
    def check_userinfo(user)
      raise URI::InvalidURIError, "can not set userinfo for file URI"
    end

    # raise InvalidURIError
    def check_user(user)
      raise URI::InvalidURIError, "can not set user for file URI"
    end

    # raise InvalidURIError
    def check_password(user)
      raise URI::InvalidURIError, "can not set password for file URI"
    end

    # do nothing
    def set_userinfo(v)
    end

    # do nothing
    def set_user(v)
    end

    # do nothing
    def set_password(v)
    end
  end

  register_scheme 'FILE', File
end
PK!}$[��ruby/uri/ldap.rbnu�[���# frozen_string_literal: false
# = uri/ldap.rb
#
# Author::
#  Takaaki Tateishi <ttate@jaist.ac.jp>
#  Akira Yamada <akira@ruby-lang.org>
# License::
#   URI::LDAP is copyrighted free software by Takaaki Tateishi and Akira Yamada.
#   You can redistribute it and/or modify it under the same term as Ruby.
#
# See URI for general documentation
#

require_relative 'generic'

module URI

  #
  # LDAP URI SCHEMA (described in RFC2255).
  #--
  # ldap://<host>/<dn>[?<attrs>[?<scope>[?<filter>[?<extensions>]]]]
  #++
  class LDAP < Generic

    # A Default port of 389 for URI::LDAP.
    DEFAULT_PORT = 389

    # An Array of the available components for URI::LDAP.
    COMPONENT = [
      :scheme,
      :host, :port,
      :dn,
      :attributes,
      :scope,
      :filter,
      :extensions,
    ].freeze

    # Scopes available for the starting point.
    #
    # * SCOPE_BASE - the Base DN
    # * SCOPE_ONE  - one level under the Base DN, not including the base DN and
    #   not including any entries under this
    # * SCOPE_SUB  - subtrees, all entries at all levels
    #
    SCOPE = [
      SCOPE_ONE = 'one',
      SCOPE_SUB = 'sub',
      SCOPE_BASE = 'base',
    ].freeze

    #
    # == Description
    #
    # Creates a new URI::LDAP object from components, with syntax checking.
    #
    # The components accepted are host, port, dn, attributes,
    # scope, filter, and extensions.
    #
    # The components should be provided either as an Array, or as a Hash
    # with keys formed by preceding the component names with a colon.
    #
    # If an Array is used, the components must be passed in the
    # order <code>[host, port, dn, attributes, scope, filter, extensions]</code>.
    #
    # Example:
    #
    #     uri = URI::LDAP.build({:host => 'ldap.example.com',
    #       :dn => '/dc=example'})
    #
    #     uri = URI::LDAP.build(["ldap.example.com", nil,
    #       "/dc=example;dc=com", "query", nil, nil, nil])
    #
    def self.build(args)
      tmp = Util::make_components_hash(self, args)

      if tmp[:dn]
        tmp[:path] = tmp[:dn]
      end

      query = []
      [:extensions, :filter, :scope, :attributes].collect do |x|
        next if !tmp[x] && query.size == 0
        query.unshift(tmp[x])
      end

      tmp[:query] = query.join('?')

      return super(tmp)
    end

    #
    # == Description
    #
    # Creates a new URI::LDAP object from generic URI components as per
    # RFC 2396. No LDAP-specific syntax checking is performed.
    #
    # Arguments are +scheme+, +userinfo+, +host+, +port+, +registry+, +path+,
    # +opaque+, +query+, and +fragment+, in that order.
    #
    # Example:
    #
    #     uri = URI::LDAP.new("ldap", nil, "ldap.example.com", nil, nil,
    #       "/dc=example;dc=com", nil, "query", nil)
    #
    # See also URI::Generic.new.
    #
    def initialize(*arg)
      super(*arg)

      if @fragment
        raise InvalidURIError, 'bad LDAP URL'
      end

      parse_dn
      parse_query
    end

    # Private method to cleanup +dn+ from using the +path+ component attribute.
    def parse_dn
      raise InvalidURIError, 'bad LDAP URL' unless @path
      @dn = @path[1..-1]
    end
    private :parse_dn

    # Private method to cleanup +attributes+, +scope+, +filter+, and +extensions+
    # from using the +query+ component attribute.
    def parse_query
      @attributes = nil
      @scope      = nil
      @filter     = nil
      @extensions = nil

      if @query
        attrs, scope, filter, extensions = @query.split('?')

        @attributes = attrs if attrs && attrs.size > 0
        @scope      = scope if scope && scope.size > 0
        @filter     = filter if filter && filter.size > 0
        @extensions = extensions if extensions && extensions.size > 0
      end
    end
    private :parse_query

    # Private method to assemble +query+ from +attributes+, +scope+, +filter+, and +extensions+.
    def build_path_query
      @path = '/' + @dn

      query = []
      [@extensions, @filter, @scope, @attributes].each do |x|
        next if !x && query.size == 0
        query.unshift(x)
      end
      @query = query.join('?')
    end
    private :build_path_query

    # Returns dn.
    def dn
      @dn
    end

    # Private setter for dn +val+.
    def set_dn(val)
      @dn = val
      build_path_query
      @dn
    end
    protected :set_dn

    # Setter for dn +val+.
    def dn=(val)
      set_dn(val)
      val
    end

    # Returns attributes.
    def attributes
      @attributes
    end

    # Private setter for attributes +val+.
    def set_attributes(val)
      @attributes = val
      build_path_query
      @attributes
    end
    protected :set_attributes

    # Setter for attributes +val+.
    def attributes=(val)
      set_attributes(val)
      val
    end

    # Returns scope.
    def scope
      @scope
    end

    # Private setter for scope +val+.
    def set_scope(val)
      @scope = val
      build_path_query
      @scope
    end
    protected :set_scope

    # Setter for scope +val+.
    def scope=(val)
      set_scope(val)
      val
    end

    # Returns filter.
    def filter
      @filter
    end

    # Private setter for filter +val+.
    def set_filter(val)
      @filter = val
      build_path_query
      @filter
    end
    protected :set_filter

    # Setter for filter +val+.
    def filter=(val)
      set_filter(val)
      val
    end

    # Returns extensions.
    def extensions
      @extensions
    end

    # Private setter for extensions +val+.
    def set_extensions(val)
      @extensions = val
      build_path_query
      @extensions
    end
    protected :set_extensions

    # Setter for extensions +val+.
    def extensions=(val)
      set_extensions(val)
      val
    end

    # Checks if URI has a path.
    # For URI::LDAP this will return +false+.
    def hierarchical?
      false
    end
  end

  register_scheme 'LDAP', LDAP
end
PK!}$[�]sΓΓruby/uri/generic.rbnu�[���# frozen_string_literal: true

# = uri/generic.rb
#
# Author:: Akira Yamada <akira@ruby-lang.org>
# License:: You can redistribute it and/or modify it under the same term as Ruby.
#
# See URI for general documentation
#

require_relative 'common'
autoload :IPSocket, 'socket'
autoload :IPAddr, 'ipaddr'

module URI

  #
  # Base class for all URI classes.
  # Implements generic URI syntax as per RFC 2396.
  #
  class Generic
    include URI

    #
    # A Default port of nil for URI::Generic.
    #
    DEFAULT_PORT = nil

    #
    # Returns default port.
    #
    def self.default_port
      self::DEFAULT_PORT
    end

    #
    # Returns default port.
    #
    def default_port
      self.class.default_port
    end

    #
    # An Array of the available components for URI::Generic.
    #
    COMPONENT = [
      :scheme,
      :userinfo, :host, :port, :registry,
      :path, :opaque,
      :query,
      :fragment
    ].freeze

    #
    # Components of the URI in the order.
    #
    def self.component
      self::COMPONENT
    end

    USE_REGISTRY = false # :nodoc:

    def self.use_registry # :nodoc:
      self::USE_REGISTRY
    end

    #
    # == Synopsis
    #
    # See ::new.
    #
    # == Description
    #
    # At first, tries to create a new URI::Generic instance using
    # URI::Generic::build. But, if exception URI::InvalidComponentError is raised,
    # then it does URI::Escape.escape all URI components and tries again.
    #
    def self.build2(args)
      begin
        return self.build(args)
      rescue InvalidComponentError
        if args.kind_of?(Array)
          return self.build(args.collect{|x|
            if x.is_a?(String)
              DEFAULT_PARSER.escape(x)
            else
              x
            end
          })
        elsif args.kind_of?(Hash)
          tmp = {}
          args.each do |key, value|
            tmp[key] = if value
                DEFAULT_PARSER.escape(value)
              else
                value
              end
          end
          return self.build(tmp)
        end
      end
    end

    #
    # == Synopsis
    #
    # See ::new.
    #
    # == Description
    #
    # Creates a new URI::Generic instance from components of URI::Generic
    # with check.  Components are: scheme, userinfo, host, port, registry, path,
    # opaque, query, and fragment. You can provide arguments either by an Array or a Hash.
    # See ::new for hash keys to use or for order of array items.
    #
    def self.build(args)
      if args.kind_of?(Array) &&
          args.size == ::URI::Generic::COMPONENT.size
        tmp = args.dup
      elsif args.kind_of?(Hash)
        tmp = ::URI::Generic::COMPONENT.collect do |c|
          if args.include?(c)
            args[c]
          else
            nil
          end
        end
      else
        component = self.class.component rescue ::URI::Generic::COMPONENT
        raise ArgumentError,
        "expected Array of or Hash of components of #{self.class} (#{component.join(', ')})"
      end

      tmp << nil
      tmp << true
      return self.new(*tmp)
    end

    #
    # == Args
    #
    # +scheme+::
    #   Protocol scheme, i.e. 'http','ftp','mailto' and so on.
    # +userinfo+::
    #   User name and password, i.e. 'sdmitry:bla'.
    # +host+::
    #   Server host name.
    # +port+::
    #   Server port.
    # +registry+::
    #   Registry of naming authorities.
    # +path+::
    #   Path on server.
    # +opaque+::
    #   Opaque part.
    # +query+::
    #   Query data.
    # +fragment+::
    #   Part of the URI after '#' character.
    # +parser+::
    #   Parser for internal use [URI::DEFAULT_PARSER by default].
    # +arg_check+::
    #   Check arguments [false by default].
    #
    # == Description
    #
    # Creates a new URI::Generic instance from ``generic'' components without check.
    #
    def initialize(scheme,
                   userinfo, host, port, registry,
                   path, opaque,
                   query,
                   fragment,
                   parser = DEFAULT_PARSER,
                   arg_check = false)
      @scheme = nil
      @user = nil
      @password = nil
      @host = nil
      @port = nil
      @path = nil
      @query = nil
      @opaque = nil
      @fragment = nil
      @parser = parser == DEFAULT_PARSER ? nil : parser

      if arg_check
        self.scheme = scheme
        self.userinfo = userinfo
        self.hostname = host
        self.port = port
        self.path = path
        self.query = query
        self.opaque = opaque
        self.fragment = fragment
      else
        self.set_scheme(scheme)
        self.set_userinfo(userinfo)
        self.set_host(host)
        self.set_port(port)
        self.set_path(path)
        self.query = query
        self.set_opaque(opaque)
        self.fragment=(fragment)
      end
      if registry
        raise InvalidURIError,
          "the scheme #{@scheme} does not accept registry part: #{registry} (or bad hostname?)"
      end

      @scheme&.freeze
      self.set_path('') if !@path && !@opaque # (see RFC2396 Section 5.2)
      self.set_port(self.default_port) if self.default_port && !@port
    end

    #
    # Returns the scheme component of the URI.
    #
    #   URI("http://foo/bar/baz").scheme #=> "http"
    #
    attr_reader :scheme

    # Returns the host component of the URI.
    #
    #   URI("http://foo/bar/baz").host #=> "foo"
    #
    # It returns nil if no host component exists.
    #
    #   URI("mailto:foo@example.org").host #=> nil
    #
    # The component does not contain the port number.
    #
    #   URI("http://foo:8080/bar/baz").host #=> "foo"
    #
    # Since IPv6 addresses are wrapped with brackets in URIs,
    # this method returns IPv6 addresses wrapped with brackets.
    # This form is not appropriate to pass to socket methods such as TCPSocket.open.
    # If unwrapped host names are required, use the #hostname method.
    #
    #   URI("http://[::1]/bar/baz").host     #=> "[::1]"
    #   URI("http://[::1]/bar/baz").hostname #=> "::1"
    #
    attr_reader :host

    # Returns the port component of the URI.
    #
    #   URI("http://foo/bar/baz").port      #=> 80
    #   URI("http://foo:8080/bar/baz").port #=> 8080
    #
    attr_reader :port

    def registry # :nodoc:
      nil
    end

    # Returns the path component of the URI.
    #
    #   URI("http://foo/bar/baz").path #=> "/bar/baz"
    #
    attr_reader :path

    # Returns the query component of the URI.
    #
    #   URI("http://foo/bar/baz?search=FooBar").query #=> "search=FooBar"
    #
    attr_reader :query

    # Returns the opaque part of the URI.
    #
    #   URI("mailto:foo@example.org").opaque #=> "foo@example.org"
    #   URI("http://foo/bar/baz").opaque     #=> nil
    #
    # The portion of the path that does not make use of the slash '/'.
    # The path typically refers to an absolute path or an opaque part.
    # (See RFC2396 Section 3 and 5.2.)
    #
    attr_reader :opaque

    # Returns the fragment component of the URI.
    #
    #   URI("http://foo/bar/baz?search=FooBar#ponies").fragment #=> "ponies"
    #
    attr_reader :fragment

    # Returns the parser to be used.
    #
    # Unless a URI::Parser is defined, DEFAULT_PARSER is used.
    #
    def parser
      if !defined?(@parser) || !@parser
        DEFAULT_PARSER
      else
        @parser || DEFAULT_PARSER
      end
    end

    # Replaces self by other URI object.
    #
    def replace!(oth)
      if self.class != oth.class
        raise ArgumentError, "expected #{self.class} object"
      end

      component.each do |c|
        self.__send__("#{c}=", oth.__send__(c))
      end
    end
    private :replace!

    #
    # Components of the URI in the order.
    #
    def component
      self.class.component
    end

    #
    # Checks the scheme +v+ component against the URI::Parser Regexp for :SCHEME.
    #
    def check_scheme(v)
      if v && parser.regexp[:SCHEME] !~ v
        raise InvalidComponentError,
          "bad component(expected scheme component): #{v}"
      end

      return true
    end
    private :check_scheme

    # Protected setter for the scheme component +v+.
    #
    # See also URI::Generic.scheme=.
    #
    def set_scheme(v)
      @scheme = v&.downcase
    end
    protected :set_scheme

    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the scheme component +v+
    # (with validation).
    #
    # See also URI::Generic.check_scheme.
    #
    # == Usage
    #
    #   require 'uri'
    #
    #   uri = URI.parse("http://my.example.com")
    #   uri.scheme = "https"
    #   uri.to_s  #=> "https://my.example.com"
    #
    def scheme=(v)
      check_scheme(v)
      set_scheme(v)
      v
    end

    #
    # Checks the +user+ and +password+.
    #
    # If +password+ is not provided, then +user+ is
    # split, using URI::Generic.split_userinfo, to
    # pull +user+ and +password.
    #
    # See also URI::Generic.check_user, URI::Generic.check_password.
    #
    def check_userinfo(user, password = nil)
      if !password
        user, password = split_userinfo(user)
      end
      check_user(user)
      check_password(password, user)

      return true
    end
    private :check_userinfo

    #
    # Checks the user +v+ component for RFC2396 compliance
    # and against the URI::Parser Regexp for :USERINFO.
    #
    # Can not have a registry or opaque component defined,
    # with a user component defined.
    #
    def check_user(v)
      if @opaque
        raise InvalidURIError,
          "can not set user with opaque"
      end

      return v unless v

      if parser.regexp[:USERINFO] !~ v
        raise InvalidComponentError,
          "bad component(expected userinfo component or user component): #{v}"
      end

      return true
    end
    private :check_user

    #
    # Checks the password +v+ component for RFC2396 compliance
    # and against the URI::Parser Regexp for :USERINFO.
    #
    # Can not have a registry or opaque component defined,
    # with a user component defined.
    #
    def check_password(v, user = @user)
      if @opaque
        raise InvalidURIError,
          "can not set password with opaque"
      end
      return v unless v

      if !user
        raise InvalidURIError,
          "password component depends user component"
      end

      if parser.regexp[:USERINFO] !~ v
        raise InvalidComponentError,
          "bad password component"
      end

      return true
    end
    private :check_password

    #
    # Sets userinfo, argument is string like 'name:pass'.
    #
    def userinfo=(userinfo)
      if userinfo.nil?
        return nil
      end
      check_userinfo(*userinfo)
      set_userinfo(*userinfo)
      # returns userinfo
    end

    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the +user+ component
    # (with validation).
    #
    # See also URI::Generic.check_user.
    #
    # == Usage
    #
    #   require 'uri'
    #
    #   uri = URI.parse("http://john:S3nsit1ve@my.example.com")
    #   uri.user = "sam"
    #   uri.to_s  #=> "http://sam:V3ry_S3nsit1ve@my.example.com"
    #
    def user=(user)
      check_user(user)
      set_user(user)
      # returns user
    end

    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the +password+ component
    # (with validation).
    #
    # See also URI::Generic.check_password.
    #
    # == Usage
    #
    #   require 'uri'
    #
    #   uri = URI.parse("http://john:S3nsit1ve@my.example.com")
    #   uri.password = "V3ry_S3nsit1ve"
    #   uri.to_s  #=> "http://john:V3ry_S3nsit1ve@my.example.com"
    #
    def password=(password)
      check_password(password)
      set_password(password)
      # returns password
    end

    # Protected setter for the +user+ component, and +password+ if available
    # (with validation).
    #
    # See also URI::Generic.userinfo=.
    #
    def set_userinfo(user, password = nil)
      unless password
        user, password = split_userinfo(user)
      end
      @user     = user
      @password = password if password

      [@user, @password]
    end
    protected :set_userinfo

    # Protected setter for the user component +v+.
    #
    # See also URI::Generic.user=.
    #
    def set_user(v)
      set_userinfo(v, @password)
      v
    end
    protected :set_user

    # Protected setter for the password component +v+.
    #
    # See also URI::Generic.password=.
    #
    def set_password(v)
      @password = v
      # returns v
    end
    protected :set_password

    # Returns the userinfo +ui+ as <code>[user, password]</code>
    # if properly formatted as 'user:password'.
    def split_userinfo(ui)
      return nil, nil unless ui
      user, password = ui.split(':', 2)

      return user, password
    end
    private :split_userinfo

    # Escapes 'user:password' +v+ based on RFC 1738 section 3.1.
    def escape_userpass(v)
      parser.escape(v, /[@:\/]/o) # RFC 1738 section 3.1 #/
    end
    private :escape_userpass

    # Returns the userinfo, either as 'user' or 'user:password'.
    def userinfo
      if @user.nil?
        nil
      elsif @password.nil?
        @user
      else
        @user + ':' + @password
      end
    end

    # Returns the user component (without URI decoding).
    def user
      @user
    end

    # Returns the password component (without URI decoding).
    def password
      @password
    end

    # Returns the user component after URI decoding.
    def decoded_user
      URI.decode_uri_component(@user) if @user
    end

    # Returns the password component after URI decoding.
    def decoded_password
      URI.decode_uri_component(@password) if @password
    end

    #
    # Checks the host +v+ component for RFC2396 compliance
    # and against the URI::Parser Regexp for :HOST.
    #
    # Can not have a registry or opaque component defined,
    # with a host component defined.
    #
    def check_host(v)
      return v unless v

      if @opaque
        raise InvalidURIError,
          "can not set host with registry or opaque"
      elsif parser.regexp[:HOST] !~ v
        raise InvalidComponentError,
          "bad component(expected host component): #{v}"
      end

      return true
    end
    private :check_host

    # Protected setter for the host component +v+.
    #
    # See also URI::Generic.host=.
    #
    def set_host(v)
      @host = v
    end
    protected :set_host

    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the host component +v+
    # (with validation).
    #
    # See also URI::Generic.check_host.
    #
    # == Usage
    #
    #   require 'uri'
    #
    #   uri = URI.parse("http://my.example.com")
    #   uri.host = "foo.com"
    #   uri.to_s  #=> "http://foo.com"
    #
    def host=(v)
      check_host(v)
      set_host(v)
      v
    end

    # Extract the host part of the URI and unwrap brackets for IPv6 addresses.
    #
    # This method is the same as URI::Generic#host except
    # brackets for IPv6 (and future IP) addresses are removed.
    #
    #   uri = URI("http://[::1]/bar")
    #   uri.hostname      #=> "::1"
    #   uri.host          #=> "[::1]"
    #
    def hostname
      v = self.host
      v&.start_with?('[') && v.end_with?(']') ? v[1..-2] : v
    end

    # Sets the host part of the URI as the argument with brackets for IPv6 addresses.
    #
    # This method is the same as URI::Generic#host= except
    # the argument can be a bare IPv6 address.
    #
    #   uri = URI("http://foo/bar")
    #   uri.hostname = "::1"
    #   uri.to_s  #=> "http://[::1]/bar"
    #
    # If the argument seems to be an IPv6 address,
    # it is wrapped with brackets.
    #
    def hostname=(v)
      v = "[#{v}]" if !(v&.start_with?('[') && v&.end_with?(']')) && v&.index(':')
      self.host = v
    end

    #
    # Checks the port +v+ component for RFC2396 compliance
    # and against the URI::Parser Regexp for :PORT.
    #
    # Can not have a registry or opaque component defined,
    # with a port component defined.
    #
    def check_port(v)
      return v unless v

      if @opaque
        raise InvalidURIError,
          "can not set port with registry or opaque"
      elsif !v.kind_of?(Integer) && parser.regexp[:PORT] !~ v
        raise InvalidComponentError,
          "bad component(expected port component): #{v.inspect}"
      end

      return true
    end
    private :check_port

    # Protected setter for the port component +v+.
    #
    # See also URI::Generic.port=.
    #
    def set_port(v)
      v = v.empty? ? nil : v.to_i unless !v || v.kind_of?(Integer)
      @port = v
    end
    protected :set_port

    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the port component +v+
    # (with validation).
    #
    # See also URI::Generic.check_port.
    #
    # == Usage
    #
    #   require 'uri'
    #
    #   uri = URI.parse("http://my.example.com")
    #   uri.port = 8080
    #   uri.to_s  #=> "http://my.example.com:8080"
    #
    def port=(v)
      check_port(v)
      set_port(v)
      port
    end

    def check_registry(v) # :nodoc:
      raise InvalidURIError, "can not set registry"
    end
    private :check_registry

    def set_registry(v) #:nodoc:
      raise InvalidURIError, "can not set registry"
    end
    protected :set_registry

    def registry=(v)
      raise InvalidURIError, "can not set registry"
    end

    #
    # Checks the path +v+ component for RFC2396 compliance
    # and against the URI::Parser Regexp
    # for :ABS_PATH and :REL_PATH.
    #
    # Can not have a opaque component defined,
    # with a path component defined.
    #
    def check_path(v)
      # raise if both hier and opaque are not nil, because:
      # absoluteURI   = scheme ":" ( hier_part | opaque_part )
      # hier_part     = ( net_path | abs_path ) [ "?" query ]
      if v && @opaque
        raise InvalidURIError,
          "path conflicts with opaque"
      end

      # If scheme is ftp, path may be relative.
      # See RFC 1738 section 3.2.2, and RFC 2396.
      if @scheme && @scheme != "ftp"
        if v && v != '' && parser.regexp[:ABS_PATH] !~ v
          raise InvalidComponentError,
            "bad component(expected absolute path component): #{v}"
        end
      else
        if v && v != '' && parser.regexp[:ABS_PATH] !~ v &&
           parser.regexp[:REL_PATH] !~ v
          raise InvalidComponentError,
            "bad component(expected relative path component): #{v}"
        end
      end

      return true
    end
    private :check_path

    # Protected setter for the path component +v+.
    #
    # See also URI::Generic.path=.
    #
    def set_path(v)
      @path = v
    end
    protected :set_path

    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the path component +v+
    # (with validation).
    #
    # See also URI::Generic.check_path.
    #
    # == Usage
    #
    #   require 'uri'
    #
    #   uri = URI.parse("http://my.example.com/pub/files")
    #   uri.path = "/faq/"
    #   uri.to_s  #=> "http://my.example.com/faq/"
    #
    def path=(v)
      check_path(v)
      set_path(v)
      v
    end

    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the query component +v+.
    #
    # == Usage
    #
    #   require 'uri'
    #
    #   uri = URI.parse("http://my.example.com/?id=25")
    #   uri.query = "id=1"
    #   uri.to_s  #=> "http://my.example.com/?id=1"
    #
    def query=(v)
      return @query = nil unless v
      raise InvalidURIError, "query conflicts with opaque" if @opaque

      x = v.to_str
      v = x.dup if x.equal? v
      v.encode!(Encoding::UTF_8) rescue nil
      v.delete!("\t\r\n")
      v.force_encoding(Encoding::ASCII_8BIT)
      raise InvalidURIError, "invalid percent escape: #{$1}" if /(%\H\H)/n.match(v)
      v.gsub!(/(?!%\h\h|[!$-&(-;=?-_a-~])./n.freeze){'%%%02X' % $&.ord}
      v.force_encoding(Encoding::US_ASCII)
      @query = v
    end

    #
    # Checks the opaque +v+ component for RFC2396 compliance and
    # against the URI::Parser Regexp for :OPAQUE.
    #
    # Can not have a host, port, user, or path component defined,
    # with an opaque component defined.
    #
    def check_opaque(v)
      return v unless v

      # raise if both hier and opaque are not nil, because:
      # absoluteURI   = scheme ":" ( hier_part | opaque_part )
      # hier_part     = ( net_path | abs_path ) [ "?" query ]
      if @host || @port || @user || @path  # userinfo = @user + ':' + @password
        raise InvalidURIError,
          "can not set opaque with host, port, userinfo or path"
      elsif v && parser.regexp[:OPAQUE] !~ v
        raise InvalidComponentError,
          "bad component(expected opaque component): #{v}"
      end

      return true
    end
    private :check_opaque

    # Protected setter for the opaque component +v+.
    #
    # See also URI::Generic.opaque=.
    #
    def set_opaque(v)
      @opaque = v
    end
    protected :set_opaque

    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the opaque component +v+
    # (with validation).
    #
    # See also URI::Generic.check_opaque.
    #
    def opaque=(v)
      check_opaque(v)
      set_opaque(v)
      v
    end

    #
    # Checks the fragment +v+ component against the URI::Parser Regexp for :FRAGMENT.
    #
    #
    # == Args
    #
    # +v+::
    #    String
    #
    # == Description
    #
    # Public setter for the fragment component +v+
    # (with validation).
    #
    # == Usage
    #
    #   require 'uri'
    #
    #   uri = URI.parse("http://my.example.com/?id=25#time=1305212049")
    #   uri.fragment = "time=1305212086"
    #   uri.to_s  #=> "http://my.example.com/?id=25#time=1305212086"
    #
    def fragment=(v)
      return @fragment = nil unless v

      x = v.to_str
      v = x.dup if x.equal? v
      v.encode!(Encoding::UTF_8) rescue nil
      v.delete!("\t\r\n")
      v.force_encoding(Encoding::ASCII_8BIT)
      v.gsub!(/(?!%\h\h|[!-~])./n){'%%%02X' % $&.ord}
      v.force_encoding(Encoding::US_ASCII)
      @fragment = v
    end

    #
    # Returns true if URI is hierarchical.
    #
    # == Description
    #
    # URI has components listed in order of decreasing significance from left to right,
    # see RFC3986 https://tools.ietf.org/html/rfc3986 1.2.3.
    #
    # == Usage
    #
    #   require 'uri'
    #
    #   uri = URI.parse("http://my.example.com/")
    #   uri.hierarchical?
    #   #=> true
    #   uri = URI.parse("mailto:joe@example.com")
    #   uri.hierarchical?
    #   #=> false
    #
    def hierarchical?
      if @path
        true
      else
        false
      end
    end

    #
    # Returns true if URI has a scheme (e.g. http:// or https://) specified.
    #
    def absolute?
      if @scheme
        true
      else
        false
      end
    end
    alias absolute absolute?

    #
    # Returns true if URI does not have a scheme (e.g. http:// or https://) specified.
    #
    def relative?
      !absolute?
    end

    #
    # Returns an Array of the path split on '/'.
    #
    def split_path(path)
      path.split("/", -1)
    end
    private :split_path

    #
    # Merges a base path +base+, with relative path +rel+,
    # returns a modified base path.
    #
    def merge_path(base, rel)

      # RFC2396, Section 5.2, 5)
      # RFC2396, Section 5.2, 6)
      base_path = split_path(base)
      rel_path  = split_path(rel)

      # RFC2396, Section 5.2, 6), a)
      base_path << '' if base_path.last == '..'
      while i = base_path.index('..')
        base_path.slice!(i - 1, 2)
      end

      if (first = rel_path.first) and first.empty?
        base_path.clear
        rel_path.shift
      end

      # RFC2396, Section 5.2, 6), c)
      # RFC2396, Section 5.2, 6), d)
      rel_path.push('') if rel_path.last == '.' || rel_path.last == '..'
      rel_path.delete('.')

      # RFC2396, Section 5.2, 6), e)
      tmp = []
      rel_path.each do |x|
        if x == '..' &&
            !(tmp.empty? || tmp.last == '..')
          tmp.pop
        else
          tmp << x
        end
      end

      add_trailer_slash = !tmp.empty?
      if base_path.empty?
        base_path = [''] # keep '/' for root directory
      elsif add_trailer_slash
        base_path.pop
      end
      while x = tmp.shift
        if x == '..'
          # RFC2396, Section 4
          # a .. or . in an absolute path has no special meaning
          base_path.pop if base_path.size > 1
        else
          # if x == '..'
          #   valid absolute (but abnormal) path "/../..."
          # else
          #   valid absolute path
          # end
          base_path << x
          tmp.each {|t| base_path << t}
          add_trailer_slash = false
          break
        end
      end
      base_path.push('') if add_trailer_slash

      return base_path.join('/')
    end
    private :merge_path

    #
    # == Args
    #
    # +oth+::
    #    URI or String
    #
    # == Description
    #
    # Destructive form of #merge.
    #
    # == Usage
    #
    #   require 'uri'
    #
    #   uri = URI.parse("http://my.example.com")
    #   uri.merge!("/main.rbx?page=1")
    #   uri.to_s  # => "http://my.example.com/main.rbx?page=1"
    #
    def merge!(oth)
      t = merge(oth)
      if self == t
        nil
      else
        replace!(t)
        self
      end
    end

    #
    # == Args
    #
    # +oth+::
    #    URI or String
    #
    # == Description
    #
    # Merges two URIs.
    #
    # == Usage
    #
    #   require 'uri'
    #
    #   uri = URI.parse("http://my.example.com")
    #   uri.merge("/main.rbx?page=1")
    #   # => "http://my.example.com/main.rbx?page=1"
    #
    def merge(oth)
      rel = parser.__send__(:convert_to_uri, oth)

      if rel.absolute?
        #raise BadURIError, "both URI are absolute" if absolute?
        # hmm... should return oth for usability?
        return rel
      end

      unless self.absolute?
        raise BadURIError, "both URI are relative"
      end

      base = self.dup

      authority = rel.userinfo || rel.host || rel.port

      # RFC2396, Section 5.2, 2)
      if (rel.path.nil? || rel.path.empty?) && !authority && !rel.query
        base.fragment=(rel.fragment) if rel.fragment
        return base
      end

      base.query = nil
      base.fragment=(nil)

      # RFC2396, Section 5.2, 4)
      if authority
        base.set_userinfo(rel.userinfo)
        base.set_host(rel.host)
        base.set_port(rel.port || base.default_port)
        base.set_path(rel.path)
      elsif base.path && rel.path
        base.set_path(merge_path(base.path, rel.path))
      end

      # RFC2396, Section 5.2, 7)
      base.query = rel.query       if rel.query
      base.fragment=(rel.fragment) if rel.fragment

      return base
    end # merge
    alias + merge

    # :stopdoc:
    def route_from_path(src, dst)
      case dst
      when src
        # RFC2396, Section 4.2
        return ''
      when %r{(?:\A|/)\.\.?(?:/|\z)}
        # dst has abnormal absolute path,
        # like "/./", "/../", "/x/../", ...
        return dst.dup
      end

      src_path = src.scan(%r{[^/]*/})
      dst_path = dst.scan(%r{[^/]*/?})

      # discard same parts
      while !dst_path.empty? && dst_path.first == src_path.first
        src_path.shift
        dst_path.shift
      end

      tmp = dst_path.join

      # calculate
      if src_path.empty?
        if tmp.empty?
          return './'
        elsif dst_path.first.include?(':') # (see RFC2396 Section 5)
          return './' + tmp
        else
          return tmp
        end
      end

      return '../' * src_path.size + tmp
    end
    private :route_from_path
    # :startdoc:

    # :stopdoc:
    def route_from0(oth)
      oth = parser.__send__(:convert_to_uri, oth)
      if self.relative?
        raise BadURIError,
          "relative URI: #{self}"
      end
      if oth.relative?
        raise BadURIError,
          "relative URI: #{oth}"
      end

      if self.scheme != oth.scheme
        return self, self.dup
      end
      rel = URI::Generic.new(nil, # it is relative URI
                             self.userinfo, self.host, self.port,
                             nil, self.path, self.opaque,
                             self.query, self.fragment, parser)

      if rel.userinfo != oth.userinfo ||
          rel.host.to_s.downcase != oth.host.to_s.downcase ||
          rel.port != oth.port

        if self.userinfo.nil? && self.host.nil?
          return self, self.dup
        end

        rel.set_port(nil) if rel.port == oth.default_port
        return rel, rel
      end
      rel.set_userinfo(nil)
      rel.set_host(nil)
      rel.set_port(nil)

      if rel.path && rel.path == oth.path
        rel.set_path('')
        rel.query = nil if rel.query == oth.query
        return rel, rel
      elsif rel.opaque && rel.opaque == oth.opaque
        rel.set_opaque('')
        rel.query = nil if rel.query == oth.query
        return rel, rel
      end

      # you can modify `rel', but can not `oth'.
      return oth, rel
    end
    private :route_from0
    # :startdoc:

    #
    # == Args
    #
    # +oth+::
    #    URI or String
    #
    # == Description
    #
    # Calculates relative path from oth to self.
    #
    # == Usage
    #
    #   require 'uri'
    #
    #   uri = URI.parse('http://my.example.com/main.rbx?page=1')
    #   uri.route_from('http://my.example.com')
    #   #=> #<URI::Generic /main.rbx?page=1>
    #
    def route_from(oth)
      # you can modify `rel', but can not `oth'.
      begin
        oth, rel = route_from0(oth)
      rescue
        raise $!.class, $!.message
      end
      if oth == rel
        return rel
      end

      rel.set_path(route_from_path(oth.path, self.path))
      if rel.path == './' && self.query
        # "./?foo" -> "?foo"
        rel.set_path('')
      end

      return rel
    end

    alias - route_from

    #
    # == Args
    #
    # +oth+::
    #    URI or String
    #
    # == Description
    #
    # Calculates relative path to oth from self.
    #
    # == Usage
    #
    #   require 'uri'
    #
    #   uri = URI.parse('http://my.example.com')
    #   uri.route_to('http://my.example.com/main.rbx?page=1')
    #   #=> #<URI::Generic /main.rbx?page=1>
    #
    def route_to(oth)
      parser.__send__(:convert_to_uri, oth).route_from(self)
    end

    #
    # Returns normalized URI.
    #
    #   require 'uri'
    #
    #   URI("HTTP://my.EXAMPLE.com").normalize
    #   #=> #<URI::HTTP http://my.example.com/>
    #
    # Normalization here means:
    #
    # * scheme and host are converted to lowercase,
    # * an empty path component is set to "/".
    #
    def normalize
      uri = dup
      uri.normalize!
      uri
    end

    #
    # Destructive version of #normalize.
    #
    def normalize!
      if path&.empty?
        set_path('/')
      end
      if scheme && scheme != scheme.downcase
        set_scheme(self.scheme.downcase)
      end
      if host && host != host.downcase
        set_host(self.host.downcase)
      end
    end

    #
    # Constructs String from URI.
    #
    def to_s
      str = ''.dup
      if @scheme
        str << @scheme
        str << ':'
      end

      if @opaque
        str << @opaque
      else
        if @host || %w[file postgres].include?(@scheme)
          str << '//'
        end
        if self.userinfo
          str << self.userinfo
          str << '@'
        end
        if @host
          str << @host
        end
        if @port && @port != self.default_port
          str << ':'
          str << @port.to_s
        end
        str << @path
        if @query
          str << '?'
          str << @query
        end
      end
      if @fragment
        str << '#'
        str << @fragment
      end
      str
    end

    #
    # Compares two URIs.
    #
    def ==(oth)
      if self.class == oth.class
        self.normalize.component_ary == oth.normalize.component_ary
      else
        false
      end
    end

    def hash
      self.component_ary.hash
    end

    def eql?(oth)
      self.class == oth.class &&
      parser == oth.parser &&
      self.component_ary.eql?(oth.component_ary)
    end

=begin

--- URI::Generic#===(oth)

=end
#    def ===(oth)
#      raise NotImplementedError
#    end

=begin
=end


    # Returns an Array of the components defined from the COMPONENT Array.
    def component_ary
      component.collect do |x|
        self.__send__(x)
      end
    end
    protected :component_ary

    # == Args
    #
    # +components+::
    #    Multiple Symbol arguments defined in URI::HTTP.
    #
    # == Description
    #
    # Selects specified components from URI.
    #
    # == Usage
    #
    #   require 'uri'
    #
    #   uri = URI.parse('http://myuser:mypass@my.example.com/test.rbx')
    #   uri.select(:userinfo, :host, :path)
    #   # => ["myuser:mypass", "my.example.com", "/test.rbx"]
    #
    def select(*components)
      components.collect do |c|
        if component.include?(c)
          self.__send__(c)
        else
          raise ArgumentError,
            "expected of components of #{self.class} (#{self.class.component.join(', ')})"
        end
      end
    end

    def inspect
      "#<#{self.class} #{self}>"
    end

    #
    # == Args
    #
    # +v+::
    #    URI or String
    #
    # == Description
    #
    # Attempts to parse other URI +oth+,
    # returns [parsed_oth, self].
    #
    # == Usage
    #
    #   require 'uri'
    #
    #   uri = URI.parse("http://my.example.com")
    #   uri.coerce("http://foo.com")
    #   #=> [#<URI::HTTP http://foo.com>, #<URI::HTTP http://my.example.com>]
    #
    def coerce(oth)
      case oth
      when String
        oth = parser.parse(oth)
      else
        super
      end

      return oth, self
    end

    # Returns a proxy URI.
    # The proxy URI is obtained from environment variables such as http_proxy,
    # ftp_proxy, no_proxy, etc.
    # If there is no proper proxy, nil is returned.
    #
    # If the optional parameter +env+ is specified, it is used instead of ENV.
    #
    # Note that capitalized variables (HTTP_PROXY, FTP_PROXY, NO_PROXY, etc.)
    # are examined, too.
    #
    # But http_proxy and HTTP_PROXY is treated specially under CGI environment.
    # It's because HTTP_PROXY may be set by Proxy: header.
    # So HTTP_PROXY is not used.
    # http_proxy is not used too if the variable is case insensitive.
    # CGI_HTTP_PROXY can be used instead.
    def find_proxy(env=ENV)
      raise BadURIError, "relative URI: #{self}" if self.relative?
      name = self.scheme.downcase + '_proxy'
      proxy_uri = nil
      if name == 'http_proxy' && env.include?('REQUEST_METHOD') # CGI?
        # HTTP_PROXY conflicts with *_proxy for proxy settings and
        # HTTP_* for header information in CGI.
        # So it should be careful to use it.
        pairs = env.reject {|k, v| /\Ahttp_proxy\z/i !~ k }
        case pairs.length
        when 0 # no proxy setting anyway.
          proxy_uri = nil
        when 1
          k, _ = pairs.shift
          if k == 'http_proxy' && env[k.upcase] == nil
            # http_proxy is safe to use because ENV is case sensitive.
            proxy_uri = env[name]
          else
            proxy_uri = nil
          end
        else # http_proxy is safe to use because ENV is case sensitive.
          proxy_uri = env.to_hash[name]
        end
        if !proxy_uri
          # Use CGI_HTTP_PROXY.  cf. libwww-perl.
          proxy_uri = env["CGI_#{name.upcase}"]
        end
      elsif name == 'http_proxy'
        if RUBY_ENGINE == 'jruby' && p_addr = ENV_JAVA['http.proxyHost']
          p_port = ENV_JAVA['http.proxyPort']
          if p_user = ENV_JAVA['http.proxyUser']
            p_pass = ENV_JAVA['http.proxyPass']
            proxy_uri = "http://#{p_user}:#{p_pass}@#{p_addr}:#{p_port}"
          else
            proxy_uri = "http://#{p_addr}:#{p_port}"
          end
        else
          unless proxy_uri = env[name]
            if proxy_uri = env[name.upcase]
              warn 'The environment variable HTTP_PROXY is discouraged.  Use http_proxy.', uplevel: 1
            end
          end
        end
      else
        proxy_uri = env[name] || env[name.upcase]
      end

      if proxy_uri.nil? || proxy_uri.empty?
        return nil
      end

      if self.hostname
        begin
          addr = IPSocket.getaddress(self.hostname)
          return nil if /\A127\.|\A::1\z/ =~ addr
        rescue SocketError
        end
      end

      name = 'no_proxy'
      if no_proxy = env[name] || env[name.upcase]
        return nil unless URI::Generic.use_proxy?(self.hostname, addr, self.port, no_proxy)
      end
      URI.parse(proxy_uri)
    end

    def self.use_proxy?(hostname, addr, port, no_proxy) # :nodoc:
      hostname = hostname.downcase
      dothostname = ".#{hostname}"
      no_proxy.scan(/([^:,\s]+)(?::(\d+))?/) {|p_host, p_port|
        if !p_port || port == p_port.to_i
          if p_host.start_with?('.')
            return false if hostname.end_with?(p_host.downcase)
          else
            return false if dothostname.end_with?(".#{p_host.downcase}")
          end
          if addr
            begin
              return false if IPAddr.new(p_host).include?(addr)
            rescue IPAddr::InvalidAddressError
              next
            end
          end
        end
      }
      true
    end
  end
end
PK!}$[�E&))ruby/yaml/dbm.rbnu�[���# frozen_string_literal: false
require 'yaml'
require 'dbm'

module YAML

# YAML + DBM = YDBM
#
# YAML::DBM provides the same interface as ::DBM.
#
# However, while DBM only allows strings for both keys and values,
# this library allows one to use most Ruby objects for values
# by first converting them to YAML. Keys must be strings.
#
# Conversion to and from YAML is performed automatically.
#
# See the documentation for ::DBM and ::YAML for more information.
class DBM < ::DBM
    VERSION = "0.1" # :nodoc:

    # :call-seq:
    #   ydbm[key] -> value
    #
    # Return value associated with +key+ from database.
    #
    # Returns +nil+ if there is no such +key+.
    #
    # See #fetch for more information.
    def []( key )
        fetch( key )
    end

    # :call-seq:
    #   ydbm[key] = value
    #
    # Set +key+ to +value+ in database.
    #
    # +value+ will be converted to YAML before storage.
    #
    # See #store for more information.
    def []=( key, val )
        store( key, val )
    end

    # :call-seq:
    #   ydbm.fetch( key, ifnone = nil )
    #   ydbm.fetch( key ) { |key| ... }
    #
    # Return value associated with +key+.
    #
    # If there is no value for +key+ and no block is given, returns +ifnone+.
    #
    # Otherwise, calls block passing in the given +key+.
    #
    # See ::DBM#fetch for more information.
    def fetch( keystr, ifnone = nil )
        begin
            val = super( keystr )
            return YAML.load( val ) if String === val
        rescue IndexError
        end
        if block_given?
            yield keystr
        else
            ifnone
        end
    end

    # Deprecated, used YAML::DBM#key instead.
    # ----
    # Note:
    # YAML::DBM#index makes warning from internal of ::DBM#index.
    # It says 'DBM#index is deprecated; use DBM#key', but DBM#key
    # behaves not same as DBM#index.
    #
    def index( keystr )
        super( keystr.to_yaml )
    end

    # :call-seq:
    #   ydbm.key(value) -> string
    #
    # Returns the key for the specified value.
    def key( keystr )
        invert[keystr]
    end

    # :call-seq:
    #   ydbm.values_at(*keys)
    #
    # Returns an array containing the values associated with the given keys.
    def values_at( *keys )
        keys.collect { |k| fetch( k ) }
    end

    # :call-seq:
    #   ydbm.delete(key)
    #
    # Deletes value from database associated with +key+.
    #
    # Returns value or +nil+.
    def delete( key )
        v = super( key )
        if String === v
            v = YAML.load( v )
        end
        v
    end

    # :call-seq:
    #   ydbm.delete_if { |key, value| ... }
    #
    # Calls the given block once for each +key+, +value+ pair in the database.
    # Deletes all entries for which the block returns true.
    #
    # Returns +self+.
    def delete_if # :yields: [key, value]
        del_keys = keys.dup
        del_keys.delete_if { |k| yield( k, fetch( k ) ) == false }
        del_keys.each { |k| delete( k ) }
        self
    end

    # :call-seq:
    #   ydbm.reject { |key, value| ... }
    #
    # Converts the contents of the database to an in-memory Hash, then calls
    # Hash#reject with the specified code block, returning a new Hash.
    def reject
        hsh = self.to_hash
        hsh.reject { |k,v| yield k, v }
    end

    # :call-seq:
    #   ydbm.each_pair { |key, value| ... }
    #
    # Calls the given block once for each +key+, +value+ pair in the database.
    #
    # Returns +self+.
    def each_pair # :yields: [key, value]
        keys.each { |k| yield k, fetch( k ) }
        self
    end

    # :call-seq:
    #   ydbm.each_value { |value| ... }
    #
    # Calls the given block for each value in database.
    #
    # Returns +self+.
    def each_value # :yields: value
        super { |v| yield YAML.load( v ) }
        self
    end

    # :call-seq:
    #   ydbm.values
    #
    # Returns an array of values from the database.
    def values
        super.collect { |v| YAML.load( v ) }
    end

    # :call-seq:
    #   ydbm.has_value?(value)
    #
    # Returns true if specified +value+ is found in the database.
    def has_value?( val )
        each_value { |v| return true if v == val }
        return false
    end

    # :call-seq:
    #   ydbm.invert -> hash
    #
    # Returns a Hash (not a DBM database) created by using each value in the
    # database as a key, with the corresponding key as its value.
    #
    # Note that all values in the hash will be Strings, but the keys will be
    # actual objects.
    def invert
        h = {}
        keys.each { |k| h[ self.fetch( k ) ] = k }
        h
    end

    # :call-seq:
    #   ydbm.replace(hash) -> ydbm
    #
    # Replaces the contents of the database with the contents of the specified
    # object. Takes any object which implements the each_pair method, including
    # Hash and DBM objects.
    def replace( hsh )
        clear
        update( hsh )
    end

    # :call-seq:
    #   ydbm.shift -> [key, value]
    #
    # Removes a [key, value] pair from the database, and returns it.
    # If the database is empty, returns +nil+.
    #
    # The order in which values are removed/returned is not guaranteed.
    def shift
        a = super
        a[1] = YAML.load( a[1] ) if a
        a
    end

    # :call-seq:
    #   ydbm.select { |key, value| ... }
    #   ydbm.select(*keys)
    #
    # If a block is provided, returns a new array containing [key, value] pairs
    # for which the block returns true.
    #
    # Otherwise, same as #values_at
    def select( *keys )
        if block_given?
            self.keys.collect { |k| v = self[k]; [k, v] if yield k, v }.compact
        else
            values_at( *keys )
        end
    end

    # :call-seq:
    #   ydbm.store(key, value) -> value
    #
    # Stores +value+ in database with +key+ as the index. +value+ is converted
    # to YAML before being stored.
    #
    # Returns +value+
    def store( key, val )
        super( key, val.to_yaml )
        val
    end

    # :call-seq:
    #   ydbm.update(hash) -> ydbm
    #
    # Updates the database with multiple values from the specified object.
    # Takes any object which implements the each_pair method, including
    # Hash and DBM objects.
    #
    # Returns +self+.
    def update( hsh )
        hsh.each_pair do |k,v|
            self.store( k, v )
        end
        self
    end

    # :call-seq:
    #   ydbm.to_a -> array
    #
    # Converts the contents of the database to an array of [key, value] arrays,
    # and returns it.
    def to_a
        a = []
        keys.each { |k| a.push [ k, self.fetch( k ) ] }
        a
    end


    # :call-seq:
    #   ydbm.to_hash -> hash
    #
    # Converts the contents of the database to an in-memory Hash object, and
    # returns it.
    def to_hash
        h = {}
        keys.each { |k| h[ k ] = self.fetch( k ) }
        h
    end

    alias :each :each_pair
end

end
PK!}$[h:SSruby/yaml/store.rbnu�[���# frozen_string_literal: false
#
# YAML::Store
#
require 'yaml'
require 'pstore'

# YAML::Store provides the same functionality as PStore, except it uses YAML
# to dump objects instead of Marshal.
#
# == Example
#
#   require 'yaml/store'
#
#   Person = Struct.new :first_name, :last_name
#
#   people = [Person.new("Bob", "Smith"), Person.new("Mary", "Johnson")]
#
#   store = YAML::Store.new "test.store"
#
#   store.transaction do
#     store["people"] = people
#     store["greeting"] = { "hello" => "world" }
#   end
#
# After running the above code, the contents of "test.store" will be:
#
#   ---
#   people:
#   - !ruby/struct:Person
#     first_name: Bob
#     last_name: Smith
#   - !ruby/struct:Person
#     first_name: Mary
#     last_name: Johnson
#   greeting:
#     hello: world

class YAML::Store < PStore

  # :call-seq:
  #   initialize( file_name, yaml_opts = {} )
  #   initialize( file_name, thread_safe = false, yaml_opts = {} )
  #
  # Creates a new YAML::Store object, which will store data in +file_name+.
  # If the file does not already exist, it will be created.
  #
  # YAML::Store objects are always reentrant. But if _thread_safe_ is set to true,
  # then it will become thread-safe at the cost of a minor performance hit.
  #
  # Options passed in through +yaml_opts+ will be used when converting the
  # store to YAML via Hash#to_yaml().
  def initialize( *o )
    @opt = {}
    if o.last.is_a? Hash
      @opt.update(o.pop)
    end
    super(*o)
  end

  # :stopdoc:

  def dump(table)
    table.to_yaml(@opt)
  end

  def load(content)
    table = YAML.unsafe_load(content)
    if table == false
      {}
    else
      table
    end
  end

  def marshal_dump_supports_canonical_option?
    false
  end

  def empty_marshal_data
    {}.to_yaml(@opt)
  end
  def empty_marshal_checksum
    CHECKSUM_ALGO.digest(empty_marshal_data)
  end
end
PK!}$[na{��#�#ruby/forwardable.rbnu�[���# frozen_string_literal: false
#
#   forwardable.rb -
#       $Release Version: 1.1$
#       $Revision$
#       by Keiju ISHITSUKA(keiju@ishitsuka.com)
#       original definition by delegator.rb
#       Revised by Daniel J. Berger with suggestions from Florian Gross.
#
#       Documentation by James Edward Gray II and Gavin Sinclair



# The Forwardable module provides delegation of specified
# methods to a designated object, using the methods #def_delegator
# and #def_delegators.
#
# For example, say you have a class RecordCollection which
# contains an array <tt>@records</tt>.  You could provide the lookup method
# #record_number(), which simply calls #[] on the <tt>@records</tt>
# array, like this:
#
#   require 'forwardable'
#
#   class RecordCollection
#     attr_accessor :records
#     extend Forwardable
#     def_delegator :@records, :[], :record_number
#   end
#
# We can use the lookup method like so:
#
#   r = RecordCollection.new
#   r.records = [4,5,6]
#   r.record_number(0)  # => 4
#
# Further, if you wish to provide the methods #size, #<<, and #map,
# all of which delegate to @records, this is how you can do it:
#
#   class RecordCollection # re-open RecordCollection class
#     def_delegators :@records, :size, :<<, :map
#   end
#
#   r = RecordCollection.new
#   r.records = [1,2,3]
#   r.record_number(0)   # => 1
#   r.size               # => 3
#   r << 4               # => [1, 2, 3, 4]
#   r.map { |x| x * 2 }  # => [2, 4, 6, 8]
#
# You can even extend regular objects with Forwardable.
#
#   my_hash = Hash.new
#   my_hash.extend Forwardable              # prepare object for delegation
#   my_hash.def_delegator "STDOUT", "puts"  # add delegation for STDOUT.puts()
#   my_hash.puts "Howdy!"
#
# == Another example
#
# You could use Forwardable as an alternative to inheritance, when you don't want
# to inherit all methods from the superclass. For instance, here is how you might
# add a range of +Array+ instance methods to a new class +Queue+:
#
#   class Queue
#     extend Forwardable
#
#     def initialize
#       @q = [ ]    # prepare delegate object
#     end
#
#     # setup preferred interface, enq() and deq()...
#     def_delegator :@q, :push, :enq
#     def_delegator :@q, :shift, :deq
#
#     # support some general Array methods that fit Queues well
#     def_delegators :@q, :clear, :first, :push, :shift, :size
#   end
#
#   q = Thread::Queue.new
#   q.enq 1, 2, 3, 4, 5
#   q.push 6
#
#   q.shift    # => 1
#   while q.size > 0
#     puts q.deq
#   end
#
#   q.enq "Ruby", "Perl", "Python"
#   puts q.first
#   q.clear
#   puts q.first
#
# This should output:
#
#   2
#   3
#   4
#   5
#   6
#   Ruby
#   nil
#
# == Notes
#
# Be advised, RDoc will not detect delegated methods.
#
# +forwardable.rb+ provides single-method delegation via the def_delegator and
# def_delegators methods. For full-class delegation via DelegateClass, see
# +delegate.rb+.
#
module Forwardable
  require 'forwardable/impl'

  # Version of +forwardable.rb+
  VERSION = "1.3.2"
  FORWARDABLE_VERSION = VERSION

  @debug = nil
  class << self
    # ignored
    attr_accessor :debug
  end

  # Takes a hash as its argument.  The key is a symbol or an array of
  # symbols.  These symbols correspond to method names, instance variable
  # names, or constant names (see def_delegator).  The value is
  # the accessor to which the methods will be delegated.
  #
  # :call-seq:
  #    delegate method => accessor
  #    delegate [method, method, ...] => accessor
  #
  def instance_delegate(hash)
    hash.each do |methods, accessor|
      unless defined?(methods.each)
        def_instance_delegator(accessor, methods)
      else
        methods.each {|method| def_instance_delegator(accessor, method)}
      end
    end
  end

  #
  # Shortcut for defining multiple delegator methods, but with no
  # provision for using a different name.  The following two code
  # samples have the same effect:
  #
  #   def_delegators :@records, :size, :<<, :map
  #
  #   def_delegator :@records, :size
  #   def_delegator :@records, :<<
  #   def_delegator :@records, :map
  #
  def def_instance_delegators(accessor, *methods)
    methods.each do |method|
      next if /\A__(?:send|id)__\z/ =~ method
      def_instance_delegator(accessor, method)
    end
  end

  # Define +method+ as delegator instance method with an optional
  # alias name +ali+. Method calls to +ali+ will be delegated to
  # +accessor.method+.  +accessor+ should be a method name, instance
  # variable name, or constant name.  Use the full path to the
  # constant if providing the constant name.
  # Returns the name of the method defined.
  #
  #   class MyQueue
  #     CONST = 1
  #     extend Forwardable
  #     attr_reader :queue
  #     def initialize
  #       @queue = []
  #     end
  #
  #     def_delegator :@queue, :push, :mypush
  #     def_delegator 'MyQueue::CONST', :to_i
  #   end
  #
  #   q = MyQueue.new
  #   q.mypush 42
  #   q.queue    #=> [42]
  #   q.push 23  #=> NoMethodError
  #   q.to_i     #=> 1
  #
  def def_instance_delegator(accessor, method, ali = method)
    gen = Forwardable._delegator_method(self, accessor, method, ali)

    # If it's not a class or module, it's an instance
    mod = Module === self ? self : singleton_class
    ret = mod.module_eval(&gen)
    mod.__send__(:ruby2_keywords, ali) if RUBY_VERSION >= '2.7'
    ret
  end

  alias delegate instance_delegate
  alias def_delegators def_instance_delegators
  alias def_delegator def_instance_delegator

  # :nodoc:
  def self._delegator_method(obj, accessor, method, ali)
    accessor = accessor.to_s unless Symbol === accessor

    if Module === obj ?
         obj.method_defined?(accessor) || obj.private_method_defined?(accessor) :
         obj.respond_to?(accessor, true)
      accessor = "#{accessor}()"
    end

    method_call = ".__send__(:#{method}, *args, &block)"
    if _valid_method?(method)
      loc, = caller_locations(2,1)
      pre = "_ ="
      mesg = "#{Module === obj ? obj : obj.class}\##{ali} at #{loc.path}:#{loc.lineno} forwarding to private method "
      method_call = "#{<<-"begin;"}\n#{<<-"end;".chomp}"
        begin;
          unless defined? _.#{method}
            ::Kernel.warn #{mesg.dump}"\#{_.class}"'##{method}', uplevel: 1
            _#{method_call}
          else
            _.#{method}(*args, &block)
          end
        end;
    end

    _compile_method("#{<<-"begin;"}\n#{<<-"end;"}", __FILE__, __LINE__+1)
    begin;
      proc do
        def #{ali}(*args, &block)
          #{pre}
          begin
            #{accessor}
          end#{method_call}
        end
      end
    end;
  end
end

# SingleForwardable can be used to setup delegation at the object level as well.
#
#    printer = String.new
#    printer.extend SingleForwardable        # prepare object for delegation
#    printer.def_delegator "STDOUT", "puts"  # add delegation for STDOUT.puts()
#    printer.puts "Howdy!"
#
# Also, SingleForwardable can be used to set up delegation for a Class or Module.
#
#   class Implementation
#     def self.service
#       puts "serviced!"
#     end
#   end
#
#   module Facade
#     extend SingleForwardable
#     def_delegator :Implementation, :service
#   end
#
#   Facade.service #=> serviced!
#
# If you want to use both Forwardable and SingleForwardable, you can
# use methods def_instance_delegator and def_single_delegator, etc.
module SingleForwardable
  # Takes a hash as its argument.  The key is a symbol or an array of
  # symbols.  These symbols correspond to method names.  The value is
  # the accessor to which the methods will be delegated.
  #
  # :call-seq:
  #    delegate method => accessor
  #    delegate [method, method, ...] => accessor
  #
  def single_delegate(hash)
    hash.each do |methods, accessor|
      unless defined?(methods.each)
        def_single_delegator(accessor, methods)
      else
        methods.each {|method| def_single_delegator(accessor, method)}
      end
    end
  end

  #
  # Shortcut for defining multiple delegator methods, but with no
  # provision for using a different name.  The following two code
  # samples have the same effect:
  #
  #   def_delegators :@records, :size, :<<, :map
  #
  #   def_delegator :@records, :size
  #   def_delegator :@records, :<<
  #   def_delegator :@records, :map
  #
  def def_single_delegators(accessor, *methods)
    methods.each do |method|
      next if /\A__(?:send|id)__\z/ =~ method
      def_single_delegator(accessor, method)
    end
  end

  # :call-seq:
  #   def_single_delegator(accessor, method, new_name=method)
  #
  # Defines a method _method_ which delegates to _accessor_ (i.e. it calls
  # the method of the same name in _accessor_).  If _new_name_ is
  # provided, it is used as the name for the delegate method.
  # Returns the name of the method defined.
  def def_single_delegator(accessor, method, ali = method)
    gen = Forwardable._delegator_method(self, accessor, method, ali)

    ret = instance_eval(&gen)
    singleton_class.__send__(:ruby2_keywords, ali) if RUBY_VERSION >= '2.7'
    ret
  end

  alias delegate single_delegate
  alias def_delegators def_single_delegators
  alias def_delegator def_single_delegator
end
PK!}$[�̚mC�C�ruby/optparse.rbnu�[���# frozen_string_literal: true
#
# optparse.rb - command-line option analysis with the OptionParser class.
#
# Author:: Nobu Nakada
# Documentation:: Nobu Nakada and Gavin Sinclair.
#
# See OptionParser for documentation.
#


#--
# == Developer Documentation (not for RDoc output)
#
# === Class tree
#
# - OptionParser:: front end
# - OptionParser::Switch:: each switches
# - OptionParser::List:: options list
# - OptionParser::ParseError:: errors on parsing
#   - OptionParser::AmbiguousOption
#   - OptionParser::NeedlessArgument
#   - OptionParser::MissingArgument
#   - OptionParser::InvalidOption
#   - OptionParser::InvalidArgument
#     - OptionParser::AmbiguousArgument
#
# === Object relationship diagram
#
#   +--------------+
#   | OptionParser |<>-----+
#   +--------------+       |                      +--------+
#                          |                    ,-| Switch |
#        on_head -------->+---------------+    /  +--------+
#        accept/reject -->| List          |<|>-
#                         |               |<|>-  +----------+
#        on ------------->+---------------+    `-| argument |
#                           :           :        |  class   |
#                         +---------------+      |==========|
#        on_tail -------->|               |      |pattern   |
#                         +---------------+      |----------|
#   OptionParser.accept ->| DefaultList   |      |converter |
#                reject   |(shared between|      +----------+
#                         | all instances)|
#                         +---------------+
#
#++
#
# == OptionParser
#
# === New to \OptionParser?
#
# See the {Tutorial}[optparse/tutorial.rdoc].
#
# === Introduction
#
# OptionParser is a class for command-line option analysis.  It is much more
# advanced, yet also easier to use, than GetoptLong, and is a more Ruby-oriented
# solution.
#
# === Features
#
# 1. The argument specification and the code to handle it are written in the
#    same place.
# 2. It can output an option summary; you don't need to maintain this string
#    separately.
# 3. Optional and mandatory arguments are specified very gracefully.
# 4. Arguments can be automatically converted to a specified class.
# 5. Arguments can be restricted to a certain set.
#
# All of these features are demonstrated in the examples below.  See
# #make_switch for full documentation.
#
# === Minimal example
#
#   require 'optparse'
#
#   options = {}
#   OptionParser.new do |parser|
#     parser.banner = "Usage: example.rb [options]"
#
#     parser.on("-v", "--[no-]verbose", "Run verbosely") do |v|
#       options[:verbose] = v
#     end
#   end.parse!
#
#   p options
#   p ARGV
#
# === Generating Help
#
# OptionParser can be used to automatically generate help for the commands you
# write:
#
#   require 'optparse'
#
#   Options = Struct.new(:name)
#
#   class Parser
#     def self.parse(options)
#       args = Options.new("world")
#
#       opt_parser = OptionParser.new do |parser|
#         parser.banner = "Usage: example.rb [options]"
#
#         parser.on("-nNAME", "--name=NAME", "Name to say hello to") do |n|
#           args.name = n
#         end
#
#         parser.on("-h", "--help", "Prints this help") do
#           puts parser
#           exit
#         end
#       end
#
#       opt_parser.parse!(options)
#       return args
#     end
#   end
#   options = Parser.parse %w[--help]
#
#   #=>
#      # Usage: example.rb [options]
#      #     -n, --name=NAME                  Name to say hello to
#      #     -h, --help                       Prints this help
#
# === Required Arguments
#
# For options that require an argument, option specification strings may include an
# option name in all caps. If an option is used without the required argument,
# an exception will be raised.
#
#   require 'optparse'
#
#   options = {}
#   OptionParser.new do |parser|
#     parser.on("-r", "--require LIBRARY",
#               "Require the LIBRARY before executing your script") do |lib|
#       puts "You required #{lib}!"
#     end
#   end.parse!
#
# Used:
#
#   $ ruby optparse-test.rb -r
#   optparse-test.rb:9:in `<main>': missing argument: -r (OptionParser::MissingArgument)
#   $ ruby optparse-test.rb -r my-library
#   You required my-library!
#
# === Type Coercion
#
# OptionParser supports the ability to coerce command line arguments
# into objects for us.
#
# OptionParser comes with a few ready-to-use kinds of  type
# coercion. They are:
#
# - Date  -- Anything accepted by +Date.parse+
# - DateTime -- Anything accepted by +DateTime.parse+
# - Time -- Anything accepted by +Time.httpdate+ or +Time.parse+
# - URI  -- Anything accepted by +URI.parse+
# - Shellwords -- Anything accepted by +Shellwords.shellwords+
# - String -- Any non-empty string
# - Integer -- Any integer. Will convert octal. (e.g. 124, -3, 040)
# - Float -- Any float. (e.g. 10, 3.14, -100E+13)
# - Numeric -- Any integer, float, or rational (1, 3.4, 1/3)
# - DecimalInteger -- Like +Integer+, but no octal format.
# - OctalInteger -- Like +Integer+, but no decimal format.
# - DecimalNumeric -- Decimal integer or float.
# - TrueClass --  Accepts '+, yes, true, -, no, false' and
#   defaults as +true+
# - FalseClass -- Same as +TrueClass+, but defaults to +false+
# - Array -- Strings separated by ',' (e.g. 1,2,3)
# - Regexp -- Regular expressions. Also includes options.
#
# We can also add our own coercions, which we will cover below.
#
# ==== Using Built-in Conversions
#
# As an example, the built-in +Time+ conversion is used. The other built-in
# conversions behave in the same way.
# OptionParser will attempt to parse the argument
# as a +Time+. If it succeeds, that time will be passed to the
# handler block. Otherwise, an exception will be raised.
#
#   require 'optparse'
#   require 'optparse/time'
#   OptionParser.new do |parser|
#     parser.on("-t", "--time [TIME]", Time, "Begin execution at given time") do |time|
#       p time
#     end
#   end.parse!
#
# Used:
#
#   $ ruby optparse-test.rb  -t nonsense
#   ... invalid argument: -t nonsense (OptionParser::InvalidArgument)
#   $ ruby optparse-test.rb  -t 10-11-12
#   2010-11-12 00:00:00 -0500
#   $ ruby optparse-test.rb  -t 9:30
#   2014-08-13 09:30:00 -0400
#
# ==== Creating Custom Conversions
#
# The +accept+ method on OptionParser may be used to create converters.
# It specifies which conversion block to call whenever a class is specified.
# The example below uses it to fetch a +User+ object before the +on+ handler receives it.
#
#   require 'optparse'
#
#   User = Struct.new(:id, :name)
#
#   def find_user id
#     not_found = ->{ raise "No User Found for id #{id}" }
#     [ User.new(1, "Sam"),
#       User.new(2, "Gandalf") ].find(not_found) do |u|
#       u.id == id
#     end
#   end
#
#   op = OptionParser.new
#   op.accept(User) do |user_id|
#     find_user user_id.to_i
#   end
#
#   op.on("--user ID", User) do |user|
#     puts user
#   end
#
#   op.parse!
#
# Used:
#
#   $ ruby optparse-test.rb --user 1
#   #<struct User id=1, name="Sam">
#   $ ruby optparse-test.rb --user 2
#   #<struct User id=2, name="Gandalf">
#   $ ruby optparse-test.rb --user 3
#   optparse-test.rb:15:in `block in find_user': No User Found for id 3 (RuntimeError)
#
# === Store options to a Hash
#
# The +into+ option of +order+, +parse+ and so on methods stores command line options into a Hash.
#
#   require 'optparse'
#
#   options = {}
#   OptionParser.new do |parser|
#     parser.on('-a')
#     parser.on('-b NUM', Integer)
#     parser.on('-v', '--verbose')
#   end.parse!(into: options)
#
#   p options
#
# Used:
#
#   $ ruby optparse-test.rb -a
#   {:a=>true}
#   $ ruby optparse-test.rb -a -v
#   {:a=>true, :verbose=>true}
#   $ ruby optparse-test.rb -a -b 100
#   {:a=>true, :b=>100}
#
# === Complete example
#
# The following example is a complete Ruby program.  You can run it and see the
# effect of specifying various options.  This is probably the best way to learn
# the features of +optparse+.
#
#   require 'optparse'
#   require 'optparse/time'
#   require 'ostruct'
#   require 'pp'
#
#   class OptparseExample
#     Version = '1.0.0'
#
#     CODES = %w[iso-2022-jp shift_jis euc-jp utf8 binary]
#     CODE_ALIASES = { "jis" => "iso-2022-jp", "sjis" => "shift_jis" }
#
#     class ScriptOptions
#       attr_accessor :library, :inplace, :encoding, :transfer_type,
#                     :verbose, :extension, :delay, :time, :record_separator,
#                     :list
#
#       def initialize
#         self.library = []
#         self.inplace = false
#         self.encoding = "utf8"
#         self.transfer_type = :auto
#         self.verbose = false
#       end
#
#       def define_options(parser)
#         parser.banner = "Usage: example.rb [options]"
#         parser.separator ""
#         parser.separator "Specific options:"
#
#         # add additional options
#         perform_inplace_option(parser)
#         delay_execution_option(parser)
#         execute_at_time_option(parser)
#         specify_record_separator_option(parser)
#         list_example_option(parser)
#         specify_encoding_option(parser)
#         optional_option_argument_with_keyword_completion_option(parser)
#         boolean_verbose_option(parser)
#
#         parser.separator ""
#         parser.separator "Common options:"
#         # No argument, shows at tail.  This will print an options summary.
#         # Try it and see!
#         parser.on_tail("-h", "--help", "Show this message") do
#           puts parser
#           exit
#         end
#         # Another typical switch to print the version.
#         parser.on_tail("--version", "Show version") do
#           puts Version
#           exit
#         end
#       end
#
#       def perform_inplace_option(parser)
#         # Specifies an optional option argument
#         parser.on("-i", "--inplace [EXTENSION]",
#                   "Edit ARGV files in place",
#                   "(make backup if EXTENSION supplied)") do |ext|
#           self.inplace = true
#           self.extension = ext || ''
#           self.extension.sub!(/\A\.?(?=.)/, ".")  # Ensure extension begins with dot.
#         end
#       end
#
#       def delay_execution_option(parser)
#         # Cast 'delay' argument to a Float.
#         parser.on("--delay N", Float, "Delay N seconds before executing") do |n|
#           self.delay = n
#         end
#       end
#
#       def execute_at_time_option(parser)
#         # Cast 'time' argument to a Time object.
#         parser.on("-t", "--time [TIME]", Time, "Begin execution at given time") do |time|
#           self.time = time
#         end
#       end
#
#       def specify_record_separator_option(parser)
#         # Cast to octal integer.
#         parser.on("-F", "--irs [OCTAL]", OptionParser::OctalInteger,
#                   "Specify record separator (default \\0)") do |rs|
#           self.record_separator = rs
#         end
#       end
#
#       def list_example_option(parser)
#         # List of arguments.
#         parser.on("--list x,y,z", Array, "Example 'list' of arguments") do |list|
#           self.list = list
#         end
#       end
#
#       def specify_encoding_option(parser)
#         # Keyword completion.  We are specifying a specific set of arguments (CODES
#         # and CODE_ALIASES - notice the latter is a Hash), and the user may provide
#         # the shortest unambiguous text.
#         code_list = (CODE_ALIASES.keys + CODES).join(', ')
#         parser.on("--code CODE", CODES, CODE_ALIASES, "Select encoding",
#                   "(#{code_list})") do |encoding|
#           self.encoding = encoding
#         end
#       end
#
#       def optional_option_argument_with_keyword_completion_option(parser)
#         # Optional '--type' option argument with keyword completion.
#         parser.on("--type [TYPE]", [:text, :binary, :auto],
#                   "Select transfer type (text, binary, auto)") do |t|
#           self.transfer_type = t
#         end
#       end
#
#       def boolean_verbose_option(parser)
#         # Boolean switch.
#         parser.on("-v", "--[no-]verbose", "Run verbosely") do |v|
#           self.verbose = v
#         end
#       end
#     end
#
#     #
#     # Return a structure describing the options.
#     #
#     def parse(args)
#       # The options specified on the command line will be collected in
#       # *options*.
#
#       @options = ScriptOptions.new
#       @args = OptionParser.new do |parser|
#         @options.define_options(parser)
#         parser.parse!(args)
#       end
#       @options
#     end
#
#     attr_reader :parser, :options
#   end  # class OptparseExample
#
#   example = OptparseExample.new
#   options = example.parse(ARGV)
#   pp options # example.options
#   pp ARGV
#
# === Shell Completion
#
# For modern shells (e.g. bash, zsh, etc.), you can use shell
# completion for command line options.
#
# === Further documentation
#
# The above examples, along with the accompanying
# {Tutorial}[optparse/tutorial.rdoc],
# should be enough to learn how to use this class.
# If you have any questions, file a ticket at http://bugs.ruby-lang.org.
#
class OptionParser
  OptionParser::Version = "0.2.0"

  # :stopdoc:
  NoArgument = [NO_ARGUMENT = :NONE, nil].freeze
  RequiredArgument = [REQUIRED_ARGUMENT = :REQUIRED, true].freeze
  OptionalArgument = [OPTIONAL_ARGUMENT = :OPTIONAL, false].freeze
  # :startdoc:

  #
  # Keyword completion module.  This allows partial arguments to be specified
  # and resolved against a list of acceptable values.
  #
  module Completion
    def self.regexp(key, icase)
      Regexp.new('\A' + Regexp.quote(key).gsub(/\w+\b/, '\&\w*'), icase)
    end

    def self.candidate(key, icase = false, pat = nil, &block)
      pat ||= Completion.regexp(key, icase)
      candidates = []
      block.call do |k, *v|
        (if Regexp === k
           kn = ""
           k === key
         else
           kn = defined?(k.id2name) ? k.id2name : k
           pat === kn
         end) or next
        v << k if v.empty?
        candidates << [k, v, kn]
      end
      candidates
    end

    def candidate(key, icase = false, pat = nil)
      Completion.candidate(key, icase, pat, &method(:each))
    end

    public
    def complete(key, icase = false, pat = nil)
      candidates = candidate(key, icase, pat, &method(:each)).sort_by {|k, v, kn| kn.size}
      if candidates.size == 1
        canon, sw, * = candidates[0]
      elsif candidates.size > 1
        canon, sw, cn = candidates.shift
        candidates.each do |k, v, kn|
          next if sw == v
          if String === cn and String === kn
            if cn.rindex(kn, 0)
              canon, sw, cn = k, v, kn
              next
            elsif kn.rindex(cn, 0)
              next
            end
          end
          throw :ambiguous, key
        end
      end
      if canon
        block_given? or return key, *sw
        yield(key, *sw)
      end
    end

    def convert(opt = nil, val = nil, *)
      val
    end
  end


  #
  # Map from option/keyword string to object with completion.
  #
  class OptionMap < Hash
    include Completion
  end


  #
  # Individual switch class.  Not important to the user.
  #
  # Defined within Switch are several Switch-derived classes: NoArgument,
  # RequiredArgument, etc.
  #
  class Switch
    attr_reader :pattern, :conv, :short, :long, :arg, :desc, :block

    #
    # Guesses argument style from +arg+.  Returns corresponding
    # OptionParser::Switch class (OptionalArgument, etc.).
    #
    def self.guess(arg)
      case arg
      when ""
        t = self
      when /\A=?\[/
        t = Switch::OptionalArgument
      when /\A\s+\[/
        t = Switch::PlacedArgument
      else
        t = Switch::RequiredArgument
      end
      self >= t or incompatible_argument_styles(arg, t)
      t
    end

    def self.incompatible_argument_styles(arg, t)
      raise(ArgumentError, "#{arg}: incompatible argument styles\n  #{self}, #{t}",
            ParseError.filter_backtrace(caller(2)))
    end

    def self.pattern
      NilClass
    end

    def initialize(pattern = nil, conv = nil,
                   short = nil, long = nil, arg = nil,
                   desc = ([] if short or long), block = nil, &_block)
      raise if Array === pattern
      block ||= _block
      @pattern, @conv, @short, @long, @arg, @desc, @block =
        pattern, conv, short, long, arg, desc, block
    end

    #
    # Parses +arg+ and returns rest of +arg+ and matched portion to the
    # argument pattern. Yields when the pattern doesn't match substring.
    #
    def parse_arg(arg) # :nodoc:
      pattern or return nil, [arg]
      unless m = pattern.match(arg)
        yield(InvalidArgument, arg)
        return arg, []
      end
      if String === m
        m = [s = m]
      else
        m = m.to_a
        s = m[0]
        return nil, m unless String === s
      end
      raise InvalidArgument, arg unless arg.rindex(s, 0)
      return nil, m if s.length == arg.length
      yield(InvalidArgument, arg) # didn't match whole arg
      return arg[s.length..-1], m
    end
    private :parse_arg

    #
    # Parses argument, converts and returns +arg+, +block+ and result of
    # conversion. Yields at semi-error condition instead of raising an
    # exception.
    #
    def conv_arg(arg, val = []) # :nodoc:
      if conv
        val = conv.call(*val)
      else
        val = proc {|v| v}.call(*val)
      end
      return arg, block, val
    end
    private :conv_arg

    #
    # Produces the summary text. Each line of the summary is yielded to the
    # block (without newline).
    #
    # +sdone+::  Already summarized short style options keyed hash.
    # +ldone+::  Already summarized long style options keyed hash.
    # +width+::  Width of left side (option part). In other words, the right
    #            side (description part) starts after +width+ columns.
    # +max+::    Maximum width of left side -> the options are filled within
    #            +max+ columns.
    # +indent+:: Prefix string indents all summarized lines.
    #
    def summarize(sdone = {}, ldone = {}, width = 1, max = width - 1, indent = "")
      sopts, lopts = [], [], nil
      @short.each {|s| sdone.fetch(s) {sopts << s}; sdone[s] = true} if @short
      @long.each {|s| ldone.fetch(s) {lopts << s}; ldone[s] = true} if @long
      return if sopts.empty? and lopts.empty? # completely hidden

      left = [sopts.join(', ')]
      right = desc.dup

      while s = lopts.shift
        l = left[-1].length + s.length
        l += arg.length if left.size == 1 && arg
        l < max or sopts.empty? or left << +''
        left[-1] << (left[-1].empty? ? ' ' * 4 : ', ') << s
      end

      if arg
        left[0] << (left[1] ? arg.sub(/\A(\[?)=/, '\1') + ',' : arg)
      end
      mlen = left.collect {|ss| ss.length}.max.to_i
      while mlen > width and l = left.shift
        mlen = left.collect {|ss| ss.length}.max.to_i if l.length == mlen
        if l.length < width and (r = right[0]) and !r.empty?
          l = l.to_s.ljust(width) + ' ' + r
          right.shift
        end
        yield(indent + l)
      end

      while begin l = left.shift; r = right.shift; l or r end
        l = l.to_s.ljust(width) + ' ' + r if r and !r.empty?
        yield(indent + l)
      end

      self
    end

    def add_banner(to)  # :nodoc:
      unless @short or @long
        s = desc.join
        to << " [" + s + "]..." unless s.empty?
      end
      to
    end

    def match_nonswitch?(str)  # :nodoc:
      @pattern =~ str unless @short or @long
    end

    #
    # Main name of the switch.
    #
    def switch_name
      (long.first || short.first).sub(/\A-+(?:\[no-\])?/, '')
    end

    def compsys(sdone, ldone)   # :nodoc:
      sopts, lopts = [], []
      @short.each {|s| sdone.fetch(s) {sopts << s}; sdone[s] = true} if @short
      @long.each {|s| ldone.fetch(s) {lopts << s}; ldone[s] = true} if @long
      return if sopts.empty? and lopts.empty? # completely hidden

      (sopts+lopts).each do |opt|
        # "(-x -c -r)-l[left justify]"
        if /^--\[no-\](.+)$/ =~ opt
          o = $1
          yield("--#{o}", desc.join(""))
          yield("--no-#{o}", desc.join(""))
        else
          yield("#{opt}", desc.join(""))
        end
      end
    end

    #
    # Switch that takes no arguments.
    #
    class NoArgument < self

      #
      # Raises an exception if any arguments given.
      #
      def parse(arg, argv)
        yield(NeedlessArgument, arg) if arg
        conv_arg(arg)
      end

      def self.incompatible_argument_styles(*)
      end

      def self.pattern
        Object
      end
    end

    #
    # Switch that takes an argument.
    #
    class RequiredArgument < self

      #
      # Raises an exception if argument is not present.
      #
      def parse(arg, argv)
        unless arg
          raise MissingArgument if argv.empty?
          arg = argv.shift
        end
        conv_arg(*parse_arg(arg, &method(:raise)))
      end
    end

    #
    # Switch that can omit argument.
    #
    class OptionalArgument < self

      #
      # Parses argument if given, or uses default value.
      #
      def parse(arg, argv, &error)
        if arg
          conv_arg(*parse_arg(arg, &error))
        else
          conv_arg(arg)
        end
      end
    end

    #
    # Switch that takes an argument, which does not begin with '-'.
    #
    class PlacedArgument < self

      #
      # Returns nil if argument is not present or begins with '-'.
      #
      def parse(arg, argv, &error)
        if !(val = arg) and (argv.empty? or /\A-/ =~ (val = argv[0]))
          return nil, block, nil
        end
        opt = (val = parse_arg(val, &error))[1]
        val = conv_arg(*val)
        if opt and !arg
          argv.shift
        else
          val[0] = nil
        end
        val
      end
    end
  end

  #
  # Simple option list providing mapping from short and/or long option
  # string to OptionParser::Switch and mapping from acceptable argument to
  # matching pattern and converter pair. Also provides summary feature.
  #
  class List
    # Map from acceptable argument types to pattern and converter pairs.
    attr_reader :atype

    # Map from short style option switches to actual switch objects.
    attr_reader :short

    # Map from long style option switches to actual switch objects.
    attr_reader :long

    # List of all switches and summary string.
    attr_reader :list

    #
    # Just initializes all instance variables.
    #
    def initialize
      @atype = {}
      @short = OptionMap.new
      @long = OptionMap.new
      @list = []
    end

    #
    # See OptionParser.accept.
    #
    def accept(t, pat = /.*/m, &block)
      if pat
        pat.respond_to?(:match) or
          raise TypeError, "has no `match'", ParseError.filter_backtrace(caller(2))
      else
        pat = t if t.respond_to?(:match)
      end
      unless block
        block = pat.method(:convert).to_proc if pat.respond_to?(:convert)
      end
      @atype[t] = [pat, block]
    end

    #
    # See OptionParser.reject.
    #
    def reject(t)
      @atype.delete(t)
    end

    #
    # Adds +sw+ according to +sopts+, +lopts+ and +nlopts+.
    #
    # +sw+::     OptionParser::Switch instance to be added.
    # +sopts+::  Short style option list.
    # +lopts+::  Long style option list.
    # +nlopts+:: Negated long style options list.
    #
    def update(sw, sopts, lopts, nsw = nil, nlopts = nil) # :nodoc:
      sopts.each {|o| @short[o] = sw} if sopts
      lopts.each {|o| @long[o] = sw} if lopts
      nlopts.each {|o| @long[o] = nsw} if nsw and nlopts
      used = @short.invert.update(@long.invert)
      @list.delete_if {|o| Switch === o and !used[o]}
    end
    private :update

    #
    # Inserts +switch+ at the head of the list, and associates short, long
    # and negated long options. Arguments are:
    #
    # +switch+::      OptionParser::Switch instance to be inserted.
    # +short_opts+::  List of short style options.
    # +long_opts+::   List of long style options.
    # +nolong_opts+:: List of long style options with "no-" prefix.
    #
    #   prepend(switch, short_opts, long_opts, nolong_opts)
    #
    def prepend(*args)
      update(*args)
      @list.unshift(args[0])
    end

    #
    # Appends +switch+ at the tail of the list, and associates short, long
    # and negated long options. Arguments are:
    #
    # +switch+::      OptionParser::Switch instance to be inserted.
    # +short_opts+::  List of short style options.
    # +long_opts+::   List of long style options.
    # +nolong_opts+:: List of long style options with "no-" prefix.
    #
    #   append(switch, short_opts, long_opts, nolong_opts)
    #
    def append(*args)
      update(*args)
      @list.push(args[0])
    end

    #
    # Searches +key+ in +id+ list. The result is returned or yielded if a
    # block is given. If it isn't found, nil is returned.
    #
    def search(id, key)
      if list = __send__(id)
        val = list.fetch(key) {return nil}
        block_given? ? yield(val) : val
      end
    end

    #
    # Searches list +id+ for +opt+ and the optional patterns for completion
    # +pat+. If +icase+ is true, the search is case insensitive. The result
    # is returned or yielded if a block is given. If it isn't found, nil is
    # returned.
    #
    def complete(id, opt, icase = false, *pat, &block)
      __send__(id).complete(opt, icase, *pat, &block)
    end

    def get_candidates(id)
      yield __send__(id).keys
    end

    #
    # Iterates over each option, passing the option to the +block+.
    #
    def each_option(&block)
      list.each(&block)
    end

    #
    # Creates the summary table, passing each line to the +block+ (without
    # newline). The arguments +args+ are passed along to the summarize
    # method which is called on every option.
    #
    def summarize(*args, &block)
      sum = []
      list.reverse_each do |opt|
        if opt.respond_to?(:summarize) # perhaps OptionParser::Switch
          s = []
          opt.summarize(*args) {|l| s << l}
          sum.concat(s.reverse)
        elsif !opt or opt.empty?
          sum << ""
        elsif opt.respond_to?(:each_line)
          sum.concat([*opt.each_line].reverse)
        else
          sum.concat([*opt.each].reverse)
        end
      end
      sum.reverse_each(&block)
    end

    def add_banner(to)  # :nodoc:
      list.each do |opt|
        if opt.respond_to?(:add_banner)
          opt.add_banner(to)
        end
      end
      to
    end

    def compsys(*args, &block)  # :nodoc:
      list.each do |opt|
        if opt.respond_to?(:compsys)
          opt.compsys(*args, &block)
        end
      end
    end
  end

  #
  # Hash with completion search feature. See OptionParser::Completion.
  #
  class CompletingHash < Hash
    include Completion

    #
    # Completion for hash key.
    #
    def match(key)
      *values = fetch(key) {
        raise AmbiguousArgument, catch(:ambiguous) {return complete(key)}
      }
      return key, *values
    end
  end

  # :stopdoc:

  #
  # Enumeration of acceptable argument styles. Possible values are:
  #
  # NO_ARGUMENT::       The switch takes no arguments. (:NONE)
  # REQUIRED_ARGUMENT:: The switch requires an argument. (:REQUIRED)
  # OPTIONAL_ARGUMENT:: The switch requires an optional argument. (:OPTIONAL)
  #
  # Use like --switch=argument (long style) or -Xargument (short style). For
  # short style, only portion matched to argument pattern is treated as
  # argument.
  #
  ArgumentStyle = {}
  NoArgument.each {|el| ArgumentStyle[el] = Switch::NoArgument}
  RequiredArgument.each {|el| ArgumentStyle[el] = Switch::RequiredArgument}
  OptionalArgument.each {|el| ArgumentStyle[el] = Switch::OptionalArgument}
  ArgumentStyle.freeze

  #
  # Switches common used such as '--', and also provides default
  # argument classes
  #
  DefaultList = List.new
  DefaultList.short['-'] = Switch::NoArgument.new {}
  DefaultList.long[''] = Switch::NoArgument.new {throw :terminate}


  COMPSYS_HEADER = <<'XXX'      # :nodoc:

typeset -A opt_args
local context state line

_arguments -s -S \
XXX

  def compsys(to, name = File.basename($0)) # :nodoc:
    to << "#compdef #{name}\n"
    to << COMPSYS_HEADER
    visit(:compsys, {}, {}) {|o, d|
      to << %Q[  "#{o}[#{d.gsub(/[\"\[\]]/, '\\\\\&')}]" \\\n]
    }
    to << "  '*:file:_files' && return 0\n"
  end

  #
  # Default options for ARGV, which never appear in option summary.
  #
  Officious = {}

  #
  # --help
  # Shows option summary.
  #
  Officious['help'] = proc do |parser|
    Switch::NoArgument.new do |arg|
      puts parser.help
      exit
    end
  end

  #
  # --*-completion-bash=WORD
  # Shows candidates for command line completion.
  #
  Officious['*-completion-bash'] = proc do |parser|
    Switch::RequiredArgument.new do |arg|
      puts parser.candidate(arg)
      exit
    end
  end

  #
  # --*-completion-zsh[=NAME:FILE]
  # Creates zsh completion file.
  #
  Officious['*-completion-zsh'] = proc do |parser|
    Switch::OptionalArgument.new do |arg|
      parser.compsys(STDOUT, arg)
      exit
    end
  end

  #
  # --version
  # Shows version string if Version is defined.
  #
  Officious['version'] = proc do |parser|
    Switch::OptionalArgument.new do |pkg|
      if pkg
        begin
          require 'optparse/version'
        rescue LoadError
        else
          show_version(*pkg.split(/,/)) or
            abort("#{parser.program_name}: no version found in package #{pkg}")
          exit
        end
      end
      v = parser.ver or abort("#{parser.program_name}: version unknown")
      puts v
      exit
    end
  end

  # :startdoc:

  #
  # Class methods
  #

  #
  # Initializes a new instance and evaluates the optional block in context
  # of the instance. Arguments +args+ are passed to #new, see there for
  # description of parameters.
  #
  # This method is *deprecated*, its behavior corresponds to the older #new
  # method.
  #
  def self.with(*args, &block)
    opts = new(*args)
    opts.instance_eval(&block)
    opts
  end

  #
  # Returns an incremented value of +default+ according to +arg+.
  #
  def self.inc(arg, default = nil)
    case arg
    when Integer
      arg.nonzero?
    when nil
      default.to_i + 1
    end
  end
  def inc(*args)
    self.class.inc(*args)
  end

  #
  # Initializes the instance and yields itself if called with a block.
  #
  # +banner+:: Banner message.
  # +width+::  Summary width.
  # +indent+:: Summary indent.
  #
  def initialize(banner = nil, width = 32, indent = ' ' * 4)
    @stack = [DefaultList, List.new, List.new]
    @program_name = nil
    @banner = banner
    @summary_width = width
    @summary_indent = indent
    @default_argv = ARGV
    @require_exact = false
    add_officious
    yield self if block_given?
  end

  def add_officious  # :nodoc:
    list = base()
    Officious.each do |opt, block|
      list.long[opt] ||= block.call(self)
    end
  end

  #
  # Terminates option parsing. Optional parameter +arg+ is a string pushed
  # back to be the first non-option argument.
  #
  def terminate(arg = nil)
    self.class.terminate(arg)
  end
  def self.terminate(arg = nil)
    throw :terminate, arg
  end

  @stack = [DefaultList]
  def self.top() DefaultList end

  #
  # Directs to accept specified class +t+. The argument string is passed to
  # the block in which it should be converted to the desired class.
  #
  # +t+::   Argument class specifier, any object including Class.
  # +pat+:: Pattern for argument, defaults to +t+ if it responds to match.
  #
  #   accept(t, pat, &block)
  #
  def accept(*args, &blk) top.accept(*args, &blk) end
  #
  # See #accept.
  #
  def self.accept(*args, &blk) top.accept(*args, &blk) end

  #
  # Directs to reject specified class argument.
  #
  # +t+:: Argument class specifier, any object including Class.
  #
  #   reject(t)
  #
  def reject(*args, &blk) top.reject(*args, &blk) end
  #
  # See #reject.
  #
  def self.reject(*args, &blk) top.reject(*args, &blk) end

  #
  # Instance methods
  #

  # Heading banner preceding summary.
  attr_writer :banner

  # Program name to be emitted in error message and default banner,
  # defaults to $0.
  attr_writer :program_name

  # Width for option list portion of summary. Must be Numeric.
  attr_accessor :summary_width

  # Indentation for summary. Must be String (or have + String method).
  attr_accessor :summary_indent

  # Strings to be parsed in default.
  attr_accessor :default_argv

  # Whether to require that options match exactly (disallows providing
  # abbreviated long option as short option).
  attr_accessor :require_exact

  #
  # Heading banner preceding summary.
  #
  def banner
    unless @banner
      @banner = +"Usage: #{program_name} [options]"
      visit(:add_banner, @banner)
    end
    @banner
  end

  #
  # Program name to be emitted in error message and default banner, defaults
  # to $0.
  #
  def program_name
    @program_name || File.basename($0, '.*')
  end

  # for experimental cascading :-)
  alias set_banner banner=
  alias set_program_name program_name=
  alias set_summary_width summary_width=
  alias set_summary_indent summary_indent=

  # Version
  attr_writer :version
  # Release code
  attr_writer :release

  #
  # Version
  #
  def version
    (defined?(@version) && @version) || (defined?(::Version) && ::Version)
  end

  #
  # Release code
  #
  def release
    (defined?(@release) && @release) || (defined?(::Release) && ::Release) || (defined?(::RELEASE) && ::RELEASE)
  end

  #
  # Returns version string from program_name, version and release.
  #
  def ver
    if v = version
      str = +"#{program_name} #{[v].join('.')}"
      str << " (#{v})" if v = release
      str
    end
  end

  def warn(mesg = $!)
    super("#{program_name}: #{mesg}")
  end

  def abort(mesg = $!)
    super("#{program_name}: #{mesg}")
  end

  #
  # Subject of #on / #on_head, #accept / #reject
  #
  def top
    @stack[-1]
  end

  #
  # Subject of #on_tail.
  #
  def base
    @stack[1]
  end

  #
  # Pushes a new List.
  #
  def new
    @stack.push(List.new)
    if block_given?
      yield self
    else
      self
    end
  end

  #
  # Removes the last List.
  #
  def remove
    @stack.pop
  end

  #
  # Puts option summary into +to+ and returns +to+. Yields each line if
  # a block is given.
  #
  # +to+:: Output destination, which must have method <<. Defaults to [].
  # +width+:: Width of left side, defaults to @summary_width.
  # +max+:: Maximum length allowed for left side, defaults to +width+ - 1.
  # +indent+:: Indentation, defaults to @summary_indent.
  #
  def summarize(to = [], width = @summary_width, max = width - 1, indent = @summary_indent, &blk)
    nl = "\n"
    blk ||= proc {|l| to << (l.index(nl, -1) ? l : l + nl)}
    visit(:summarize, {}, {}, width, max, indent, &blk)
    to
  end

  #
  # Returns option summary string.
  #
  def help; summarize("#{banner}".sub(/\n?\z/, "\n")) end
  alias to_s help

  #
  # Returns option summary list.
  #
  def to_a; summarize("#{banner}".split(/^/)) end

  #
  # Checks if an argument is given twice, in which case an ArgumentError is
  # raised. Called from OptionParser#switch only.
  #
  # +obj+:: New argument.
  # +prv+:: Previously specified argument.
  # +msg+:: Exception message.
  #
  def notwice(obj, prv, msg) # :nodoc:
    unless !prv or prv == obj
      raise(ArgumentError, "argument #{msg} given twice: #{obj}",
            ParseError.filter_backtrace(caller(2)))
    end
    obj
  end
  private :notwice

  SPLAT_PROC = proc {|*a| a.length <= 1 ? a.first : a} # :nodoc:

  # :call-seq:
  #   make_switch(params, block = nil)
  #
  # :include: ../doc/optparse/creates_option.rdoc
  #
  def make_switch(opts, block = nil)
    short, long, nolong, style, pattern, conv, not_pattern, not_conv, not_style = [], [], []
    ldesc, sdesc, desc, arg = [], [], []
    default_style = Switch::NoArgument
    default_pattern = nil
    klass = nil
    q, a = nil
    has_arg = false

    opts.each do |o|
      # argument class
      next if search(:atype, o) do |pat, c|
        klass = notwice(o, klass, 'type')
        if not_style and not_style != Switch::NoArgument
          not_pattern, not_conv = pat, c
        else
          default_pattern, conv = pat, c
        end
      end

      # directly specified pattern(any object possible to match)
      if (!(String === o || Symbol === o)) and o.respond_to?(:match)
        pattern = notwice(o, pattern, 'pattern')
        if pattern.respond_to?(:convert)
          conv = pattern.method(:convert).to_proc
        else
          conv = SPLAT_PROC
        end
        next
      end

      # anything others
      case o
      when Proc, Method
        block = notwice(o, block, 'block')
      when Array, Hash
        case pattern
        when CompletingHash
        when nil
          pattern = CompletingHash.new
          conv = pattern.method(:convert).to_proc if pattern.respond_to?(:convert)
        else
          raise ArgumentError, "argument pattern given twice"
        end
        o.each {|pat, *v| pattern[pat] = v.fetch(0) {pat}}
      when Module
        raise ArgumentError, "unsupported argument type: #{o}", ParseError.filter_backtrace(caller(4))
      when *ArgumentStyle.keys
        style = notwice(ArgumentStyle[o], style, 'style')
      when /^--no-([^\[\]=\s]*)(.+)?/
        q, a = $1, $2
        o = notwice(a ? Object : TrueClass, klass, 'type')
        not_pattern, not_conv = search(:atype, o) unless not_style
        not_style = (not_style || default_style).guess(arg = a) if a
        default_style = Switch::NoArgument
        default_pattern, conv = search(:atype, FalseClass) unless default_pattern
        ldesc << "--no-#{q}"
        (q = q.downcase).tr!('_', '-')
        long << "no-#{q}"
        nolong << q
      when /^--\[no-\]([^\[\]=\s]*)(.+)?/
        q, a = $1, $2
        o = notwice(a ? Object : TrueClass, klass, 'type')
        if a
          default_style = default_style.guess(arg = a)
          default_pattern, conv = search(:atype, o) unless default_pattern
        end
        ldesc << "--[no-]#{q}"
        (o = q.downcase).tr!('_', '-')
        long << o
        not_pattern, not_conv = search(:atype, FalseClass) unless not_style
        not_style = Switch::NoArgument
        nolong << "no-#{o}"
      when /^--([^\[\]=\s]*)(.+)?/
        q, a = $1, $2
        if a
          o = notwice(NilClass, klass, 'type')
          default_style = default_style.guess(arg = a)
          default_pattern, conv = search(:atype, o) unless default_pattern
        end
        ldesc << "--#{q}"
        (o = q.downcase).tr!('_', '-')
        long << o
      when /^-(\[\^?\]?(?:[^\\\]]|\\.)*\])(.+)?/
        q, a = $1, $2
        o = notwice(Object, klass, 'type')
        if a
          default_style = default_style.guess(arg = a)
          default_pattern, conv = search(:atype, o) unless default_pattern
        else
          has_arg = true
        end
        sdesc << "-#{q}"
        short << Regexp.new(q)
      when /^-(.)(.+)?/
        q, a = $1, $2
        if a
          o = notwice(NilClass, klass, 'type')
          default_style = default_style.guess(arg = a)
          default_pattern, conv = search(:atype, o) unless default_pattern
        end
        sdesc << "-#{q}"
        short << q
      when /^=/
        style = notwice(default_style.guess(arg = o), style, 'style')
        default_pattern, conv = search(:atype, Object) unless default_pattern
      else
        desc.push(o)
      end
    end

    default_pattern, conv = search(:atype, default_style.pattern) unless default_pattern
    if !(short.empty? and long.empty?)
      if has_arg and default_style == Switch::NoArgument
        default_style = Switch::RequiredArgument
      end
      s = (style || default_style).new(pattern || default_pattern,
                                       conv, sdesc, ldesc, arg, desc, block)
    elsif !block
      if style or pattern
        raise ArgumentError, "no switch given", ParseError.filter_backtrace(caller)
      end
      s = desc
    else
      short << pattern
      s = (style || default_style).new(pattern,
                                       conv, nil, nil, arg, desc, block)
    end
    return s, short, long,
      (not_style.new(not_pattern, not_conv, sdesc, ldesc, nil, desc, block) if not_style),
      nolong
  end

  # :call-seq:
  #   define(*params, &block)
  #
  # :include: ../doc/optparse/creates_option.rdoc
  #
  def define(*opts, &block)
    top.append(*(sw = make_switch(opts, block)))
    sw[0]
  end

  # :call-seq:
  #   on(*params, &block)
  #
  # :include: ../doc/optparse/creates_option.rdoc
  #
  def on(*opts, &block)
    define(*opts, &block)
    self
  end
  alias def_option define

  # :call-seq:
  #   define_head(*params, &block)
  #
  # :include: ../doc/optparse/creates_option.rdoc
  #
  def define_head(*opts, &block)
    top.prepend(*(sw = make_switch(opts, block)))
    sw[0]
  end

  # :call-seq:
  #   on_head(*params, &block)
  #
  # :include: ../doc/optparse/creates_option.rdoc
  #
  # The new option is added at the head of the summary.
  #
  def on_head(*opts, &block)
    define_head(*opts, &block)
    self
  end
  alias def_head_option define_head

  # :call-seq:
  #   define_tail(*params, &block)
  #
  # :include: ../doc/optparse/creates_option.rdoc
  #
  def define_tail(*opts, &block)
    base.append(*(sw = make_switch(opts, block)))
    sw[0]
  end

  #
  # :call-seq:
  #   on_tail(*params, &block)
  #
  # :include: ../doc/optparse/creates_option.rdoc
  #
  # The new option is added at the tail of the summary.
  #
  def on_tail(*opts, &block)
    define_tail(*opts, &block)
    self
  end
  alias def_tail_option define_tail

  #
  # Add separator in summary.
  #
  def separator(string)
    top.append(string, nil, nil)
  end

  #
  # Parses command line arguments +argv+ in order. When a block is given,
  # each non-option argument is yielded. When optional +into+ keyword
  # argument is provided, the parsed option values are stored there via
  # <code>[]=</code> method (so it can be Hash, or OpenStruct, or other
  # similar object).
  #
  # Returns the rest of +argv+ left unparsed.
  #
  def order(*argv, into: nil, &nonopt)
    argv = argv[0].dup if argv.size == 1 and Array === argv[0]
    order!(argv, into: into, &nonopt)
  end

  #
  # Same as #order, but removes switches destructively.
  # Non-option arguments remain in +argv+.
  #
  def order!(argv = default_argv, into: nil, &nonopt)
    setter = ->(name, val) {into[name.to_sym] = val} if into
    parse_in_order(argv, setter, &nonopt)
  end

  def parse_in_order(argv = default_argv, setter = nil, &nonopt)  # :nodoc:
    opt, arg, val, rest = nil
    nonopt ||= proc {|a| throw :terminate, a}
    argv.unshift(arg) if arg = catch(:terminate) {
      while arg = argv.shift
        case arg
        # long option
        when /\A--([^=]*)(?:=(.*))?/m
          opt, rest = $1, $2
          opt.tr!('_', '-')
          begin
            sw, = complete(:long, opt, true)
            if require_exact && !sw.long.include?(arg)
              raise InvalidOption, arg
            end
          rescue ParseError
            raise $!.set_option(arg, true)
          end
          begin
            opt, cb, val = sw.parse(rest, argv) {|*exc| raise(*exc)}
            val = cb.call(val) if cb
            setter.call(sw.switch_name, val) if setter
          rescue ParseError
            raise $!.set_option(arg, rest)
          end

        # short option
        when /\A-(.)((=).*|.+)?/m
          eq, rest, opt = $3, $2, $1
          has_arg, val = eq, rest
          begin
            sw, = search(:short, opt)
            unless sw
              begin
                sw, = complete(:short, opt)
                # short option matched.
                val = arg.delete_prefix('-')
                has_arg = true
              rescue InvalidOption
                raise if require_exact
                # if no short options match, try completion with long
                # options.
                sw, = complete(:long, opt)
                eq ||= !rest
              end
            end
          rescue ParseError
            raise $!.set_option(arg, true)
          end
          begin
            opt, cb, val = sw.parse(val, argv) {|*exc| raise(*exc) if eq}
          rescue ParseError
            raise $!.set_option(arg, arg.length > 2)
          else
            raise InvalidOption, arg if has_arg and !eq and arg == "-#{opt}"
          end
          begin
            argv.unshift(opt) if opt and (!rest or (opt = opt.sub(/\A-*/, '-')) != '-')
            val = cb.call(val) if cb
            setter.call(sw.switch_name, val) if setter
          rescue ParseError
            raise $!.set_option(arg, arg.length > 2)
          end

        # non-option argument
        else
          catch(:prune) do
            visit(:each_option) do |sw0|
              sw = sw0
              sw.block.call(arg) if Switch === sw and sw.match_nonswitch?(arg)
            end
            nonopt.call(arg)
          end
        end
      end

      nil
    }

    visit(:search, :short, nil) {|sw| sw.block.call(*argv) if !sw.pattern}

    argv
  end
  private :parse_in_order

  #
  # Parses command line arguments +argv+ in permutation mode and returns
  # list of non-option arguments. When optional +into+ keyword
  # argument is provided, the parsed option values are stored there via
  # <code>[]=</code> method (so it can be Hash, or OpenStruct, or other
  # similar object).
  #
  def permute(*argv, into: nil)
    argv = argv[0].dup if argv.size == 1 and Array === argv[0]
    permute!(argv, into: into)
  end

  #
  # Same as #permute, but removes switches destructively.
  # Non-option arguments remain in +argv+.
  #
  def permute!(argv = default_argv, into: nil)
    nonopts = []
    order!(argv, into: into, &nonopts.method(:<<))
    argv[0, 0] = nonopts
    argv
  end

  #
  # Parses command line arguments +argv+ in order when environment variable
  # POSIXLY_CORRECT is set, and in permutation mode otherwise.
  # When optional +into+ keyword argument is provided, the parsed option
  # values are stored there via <code>[]=</code> method (so it can be Hash,
  # or OpenStruct, or other similar object).
  #
  def parse(*argv, into: nil)
    argv = argv[0].dup if argv.size == 1 and Array === argv[0]
    parse!(argv, into: into)
  end

  #
  # Same as #parse, but removes switches destructively.
  # Non-option arguments remain in +argv+.
  #
  def parse!(argv = default_argv, into: nil)
    if ENV.include?('POSIXLY_CORRECT')
      order!(argv, into: into)
    else
      permute!(argv, into: into)
    end
  end

  #
  # Wrapper method for getopts.rb.
  #
  #   params = ARGV.getopts("ab:", "foo", "bar:", "zot:Z;zot option")
  #   # params["a"] = true   # -a
  #   # params["b"] = "1"    # -b1
  #   # params["foo"] = "1"  # --foo
  #   # params["bar"] = "x"  # --bar x
  #   # params["zot"] = "z"  # --zot Z
  #
  def getopts(*args)
    argv = Array === args.first ? args.shift : default_argv
    single_options, *long_options = *args

    result = {}

    single_options.scan(/(.)(:)?/) do |opt, val|
      if val
        result[opt] = nil
        define("-#{opt} VAL")
      else
        result[opt] = false
        define("-#{opt}")
      end
    end if single_options

    long_options.each do |arg|
      arg, desc = arg.split(';', 2)
      opt, val = arg.split(':', 2)
      if val
        result[opt] = val.empty? ? nil : val
        define("--#{opt}=#{result[opt] || "VAL"}", *[desc].compact)
      else
        result[opt] = false
        define("--#{opt}", *[desc].compact)
      end
    end

    parse_in_order(argv, result.method(:[]=))
    result
  end

  #
  # See #getopts.
  #
  def self.getopts(*args)
    new.getopts(*args)
  end

  #
  # Traverses @stack, sending each element method +id+ with +args+ and
  # +block+.
  #
  def visit(id, *args, &block) # :nodoc:
    @stack.reverse_each do |el|
      el.__send__(id, *args, &block)
    end
    nil
  end
  private :visit

  #
  # Searches +key+ in @stack for +id+ hash and returns or yields the result.
  #
  def search(id, key) # :nodoc:
    block_given = block_given?
    visit(:search, id, key) do |k|
      return block_given ? yield(k) : k
    end
  end
  private :search

  #
  # Completes shortened long style option switch and returns pair of
  # canonical switch and switch descriptor OptionParser::Switch.
  #
  # +typ+::   Searching table.
  # +opt+::   Searching key.
  # +icase+:: Search case insensitive if true.
  # +pat+::   Optional pattern for completion.
  #
  def complete(typ, opt, icase = false, *pat) # :nodoc:
    if pat.empty?
      search(typ, opt) {|sw| return [sw, opt]} # exact match or...
    end
    ambiguous = catch(:ambiguous) {
      visit(:complete, typ, opt, icase, *pat) {|o, *sw| return sw}
    }
    exc = ambiguous ? AmbiguousOption : InvalidOption
    raise exc.new(opt, additional: self.method(:additional_message).curry[typ])
  end
  private :complete

  #
  # Returns additional info.
  #
  def additional_message(typ, opt)
    return unless typ and opt and defined?(DidYouMean::SpellChecker)
    all_candidates = []
    visit(:get_candidates, typ) do |candidates|
      all_candidates.concat(candidates)
    end
    all_candidates.select! {|cand| cand.is_a?(String) }
    checker = DidYouMean::SpellChecker.new(dictionary: all_candidates)
    DidYouMean.formatter.message_for(all_candidates & checker.correct(opt))
  end

  def candidate(word)
    list = []
    case word
    when '-'
      long = short = true
    when /\A--/
      word, arg = word.split(/=/, 2)
      argpat = Completion.regexp(arg, false) if arg and !arg.empty?
      long = true
    when /\A-/
      short = true
    end
    pat = Completion.regexp(word, long)
    visit(:each_option) do |opt|
      next unless Switch === opt
      opts = (long ? opt.long : []) + (short ? opt.short : [])
      opts = Completion.candidate(word, true, pat, &opts.method(:each)).map(&:first) if pat
      if /\A=/ =~ opt.arg
        opts.map! {|sw| sw + "="}
        if arg and CompletingHash === opt.pattern
          if opts = opt.pattern.candidate(arg, false, argpat)
            opts.map!(&:last)
          end
        end
      end
      list.concat(opts)
    end
    list
  end

  #
  # Loads options from file names as +filename+. Does nothing when the file
  # is not present. Returns whether successfully loaded.
  #
  # +filename+ defaults to basename of the program without suffix in a
  # directory ~/.options, then the basename with '.options' suffix
  # under XDG and Haiku standard places.
  #
  def load(filename = nil)
    unless filename
      basename = File.basename($0, '.*')
      return true if load(File.expand_path(basename, '~/.options')) rescue nil
      basename << ".options"
      return [
        # XDG
        ENV['XDG_CONFIG_HOME'],
        '~/.config',
        *ENV['XDG_CONFIG_DIRS']&.split(File::PATH_SEPARATOR),

        # Haiku
        '~/config/settings',
      ].any? {|dir|
        next if !dir or dir.empty?
        load(File.expand_path(basename, dir)) rescue nil
      }
    end
    begin
      parse(*IO.readlines(filename).each {|s| s.chomp!})
      true
    rescue Errno::ENOENT, Errno::ENOTDIR
      false
    end
  end

  #
  # Parses environment variable +env+ or its uppercase with splitting like a
  # shell.
  #
  # +env+ defaults to the basename of the program.
  #
  def environment(env = File.basename($0, '.*'))
    env = ENV[env] || ENV[env.upcase] or return
    require 'shellwords'
    parse(*Shellwords.shellwords(env))
  end

  #
  # Acceptable argument classes
  #

  #
  # Any string and no conversion. This is fall-back.
  #
  accept(Object) {|s,|s or s.nil?}

  accept(NilClass) {|s,|s}

  #
  # Any non-empty string, and no conversion.
  #
  accept(String, /.+/m) {|s,*|s}

  #
  # Ruby/C-like integer, octal for 0-7 sequence, binary for 0b, hexadecimal
  # for 0x, and decimal for others; with optional sign prefix. Converts to
  # Integer.
  #
  decimal = '\d+(?:_\d+)*'
  binary = 'b[01]+(?:_[01]+)*'
  hex = 'x[\da-f]+(?:_[\da-f]+)*'
  octal = "0(?:[0-7]+(?:_[0-7]+)*|#{binary}|#{hex})?"
  integer = "#{octal}|#{decimal}"

  accept(Integer, %r"\A[-+]?(?:#{integer})\z"io) {|s,|
    begin
      Integer(s)
    rescue ArgumentError
      raise OptionParser::InvalidArgument, s
    end if s
  }

  #
  # Float number format, and converts to Float.
  #
  float = "(?:#{decimal}(?=(.)?)(?:\\.(?:#{decimal})?)?|\\.#{decimal})(?:E[-+]?#{decimal})?"
  floatpat = %r"\A[-+]?#{float}\z"io
  accept(Float, floatpat) {|s,| s.to_f if s}

  #
  # Generic numeric format, converts to Integer for integer format, Float
  # for float format, and Rational for rational format.
  #
  real = "[-+]?(?:#{octal}|#{float})"
  accept(Numeric, /\A(#{real})(?:\/(#{real}))?\z/io) {|s, d, f, n,|
    if n
      Rational(d, n)
    elsif f
      Float(s)
    else
      Integer(s)
    end
  }

  #
  # Decimal integer format, to be converted to Integer.
  #
  DecimalInteger = /\A[-+]?#{decimal}\z/io
  accept(DecimalInteger, DecimalInteger) {|s,|
    begin
      Integer(s, 10)
    rescue ArgumentError
      raise OptionParser::InvalidArgument, s
    end if s
  }

  #
  # Ruby/C like octal/hexadecimal/binary integer format, to be converted to
  # Integer.
  #
  OctalInteger = /\A[-+]?(?:[0-7]+(?:_[0-7]+)*|0(?:#{binary}|#{hex}))\z/io
  accept(OctalInteger, OctalInteger) {|s,|
    begin
      Integer(s, 8)
    rescue ArgumentError
      raise OptionParser::InvalidArgument, s
    end if s
  }

  #
  # Decimal integer/float number format, to be converted to Integer for
  # integer format, Float for float format.
  #
  DecimalNumeric = floatpat     # decimal integer is allowed as float also.
  accept(DecimalNumeric, floatpat) {|s, f|
    begin
      if f
        Float(s)
      else
        Integer(s)
      end
    rescue ArgumentError
      raise OptionParser::InvalidArgument, s
    end if s
  }

  #
  # Boolean switch, which means whether it is present or not, whether it is
  # absent or not with prefix no-, or it takes an argument
  # yes/no/true/false/+/-.
  #
  yesno = CompletingHash.new
  %w[- no false].each {|el| yesno[el] = false}
  %w[+ yes true].each {|el| yesno[el] = true}
  yesno['nil'] = false          # should be nil?
  accept(TrueClass, yesno) {|arg, val| val == nil or val}
  #
  # Similar to TrueClass, but defaults to false.
  #
  accept(FalseClass, yesno) {|arg, val| val != nil and val}

  #
  # List of strings separated by ",".
  #
  accept(Array) do |s, |
    if s
      s = s.split(',').collect {|ss| ss unless ss.empty?}
    end
    s
  end

  #
  # Regular expression with options.
  #
  accept(Regexp, %r"\A/((?:\\.|[^\\])*)/([[:alpha:]]+)?\z|.*") do |all, s, o|
    f = 0
    if o
      f |= Regexp::IGNORECASE if /i/ =~ o
      f |= Regexp::MULTILINE if /m/ =~ o
      f |= Regexp::EXTENDED if /x/ =~ o
      k = o.delete("imx")
      k = nil if k.empty?
    end
    Regexp.new(s || all, f, k)
  end

  #
  # Exceptions
  #

  #
  # Base class of exceptions from OptionParser.
  #
  class ParseError < RuntimeError
    # Reason which caused the error.
    Reason = 'parse error'

    def initialize(*args, additional: nil)
      @additional = additional
      @arg0, = args
      @args = args
      @reason = nil
    end

    attr_reader :args
    attr_writer :reason
    attr_accessor :additional

    #
    # Pushes back erred argument(s) to +argv+.
    #
    def recover(argv)
      argv[0, 0] = @args
      argv
    end

    def self.filter_backtrace(array)
      unless $DEBUG
        array.delete_if(&%r"\A#{Regexp.quote(__FILE__)}:"o.method(:=~))
      end
      array
    end

    def set_backtrace(array)
      super(self.class.filter_backtrace(array))
    end

    def set_option(opt, eq)
      if eq
        @args[0] = opt
      else
        @args.unshift(opt)
      end
      self
    end

    #
    # Returns error reason. Override this for I18N.
    #
    def reason
      @reason || self.class::Reason
    end

    def inspect
      "#<#{self.class}: #{args.join(' ')}>"
    end

    #
    # Default stringizing method to emit standard error message.
    #
    def message
      "#{reason}: #{args.join(' ')}#{additional[@arg0] if additional}"
    end

    alias to_s message
  end

  #
  # Raises when ambiguously completable string is encountered.
  #
  class AmbiguousOption < ParseError
    const_set(:Reason, 'ambiguous option')
  end

  #
  # Raises when there is an argument for a switch which takes no argument.
  #
  class NeedlessArgument < ParseError
    const_set(:Reason, 'needless argument')
  end

  #
  # Raises when a switch with mandatory argument has no argument.
  #
  class MissingArgument < ParseError
    const_set(:Reason, 'missing argument')
  end

  #
  # Raises when switch is undefined.
  #
  class InvalidOption < ParseError
    const_set(:Reason, 'invalid option')
  end

  #
  # Raises when the given argument does not match required format.
  #
  class InvalidArgument < ParseError
    const_set(:Reason, 'invalid argument')
  end

  #
  # Raises when the given argument word can't be completed uniquely.
  #
  class AmbiguousArgument < InvalidArgument
    const_set(:Reason, 'ambiguous argument')
  end

  #
  # Miscellaneous
  #

  #
  # Extends command line arguments array (ARGV) to parse itself.
  #
  module Arguable

    #
    # Sets OptionParser object, when +opt+ is +false+ or +nil+, methods
    # OptionParser::Arguable#options and OptionParser::Arguable#options= are
    # undefined. Thus, there is no ways to access the OptionParser object
    # via the receiver object.
    #
    def options=(opt)
      unless @optparse = opt
        class << self
          undef_method(:options)
          undef_method(:options=)
        end
      end
    end

    #
    # Actual OptionParser object, automatically created if nonexistent.
    #
    # If called with a block, yields the OptionParser object and returns the
    # result of the block. If an OptionParser::ParseError exception occurs
    # in the block, it is rescued, a error message printed to STDERR and
    # +nil+ returned.
    #
    def options
      @optparse ||= OptionParser.new
      @optparse.default_argv = self
      block_given? or return @optparse
      begin
        yield @optparse
      rescue ParseError
        @optparse.warn $!
        nil
      end
    end

    #
    # Parses +self+ destructively in order and returns +self+ containing the
    # rest arguments left unparsed.
    #
    def order!(&blk) options.order!(self, &blk) end

    #
    # Parses +self+ destructively in permutation mode and returns +self+
    # containing the rest arguments left unparsed.
    #
    def permute!() options.permute!(self) end

    #
    # Parses +self+ destructively and returns +self+ containing the
    # rest arguments left unparsed.
    #
    def parse!() options.parse!(self) end

    #
    # Substitution of getopts is possible as follows. Also see
    # OptionParser#getopts.
    #
    #   def getopts(*args)
    #     ($OPT = ARGV.getopts(*args)).each do |opt, val|
    #       eval "$OPT_#{opt.gsub(/[^A-Za-z0-9_]/, '_')} = val"
    #     end
    #   rescue OptionParser::ParseError
    #   end
    #
    def getopts(*args)
      options.getopts(self, *args)
    end

    #
    # Initializes instance variable.
    #
    def self.extend_object(obj)
      super
      obj.instance_eval {@optparse = nil}
    end
    def initialize(*args)
      super
      @optparse = nil
    end
  end

  #
  # Acceptable argument classes. Now contains DecimalInteger, OctalInteger
  # and DecimalNumeric. See Acceptable argument classes (in source code).
  #
  module Acceptables
    const_set(:DecimalInteger, OptionParser::DecimalInteger)
    const_set(:OctalInteger, OptionParser::OctalInteger)
    const_set(:DecimalNumeric, OptionParser::DecimalNumeric)
  end
end

# ARGV is arguable by OptionParser
ARGV.extend(OptionParser::Arguable)

# An alias for OptionParser.
OptParse = OptionParser  # :nodoc:
PK!}$[����11ruby/yaml.rbnu�[���# frozen_string_literal: false

begin
  require 'psych'
rescue LoadError
  warn "It seems your ruby installation is missing psych (for YAML output).\n" \
    "To eliminate this warning, please install libyaml and reinstall your ruby.\n",
    uplevel: 1
  raise
end

YAML = Psych # :nodoc:

# YAML Ain't Markup Language
#
# This module provides a Ruby interface for data serialization in YAML format.
#
# The YAML module is an alias of Psych, the YAML engine for Ruby.
#
# == Usage
#
# Working with YAML can be very simple, for example:
#
#     require 'yaml'
#     # Parse a YAML string
#     YAML.load("--- foo") #=> "foo"
#
#     # Emit some YAML
#     YAML.dump("foo")     # => "--- foo\n...\n"
#     { :a => 'b'}.to_yaml  # => "---\n:a: b\n"
#
# As the implementation is provided by the Psych library, detailed documentation
# can be found in that library's docs (also part of standard library).
#
# == Security
#
# Do not use YAML to load untrusted data. Doing so is unsafe and could allow
# malicious input to execute arbitrary code inside your application. Please see
# doc/security.rdoc for more information.
#
# == History
#
# Syck was the original YAML implementation in Ruby's standard library
# developed by why the lucky stiff.
#
# You can still use Syck, if you prefer, for parsing and emitting YAML, but you
# must install the 'syck' gem now in order to use it.
#
# In older Ruby versions, ie. <= 1.9, Syck is still provided, however it was
# completely removed with the release of Ruby 2.0.0.
#
# == More info
#
# For more advanced details on the implementation see Psych, and also check out
# http://yaml.org for spec details and other helpful information.
#
# Psych is maintained by Aaron Patterson on github: https://github.com/ruby/psych
#
# Syck can also be found on github: https://github.com/ruby/syck
module YAML
end
PK!}$[��4�����ruby/fileutils.rbnu�[���# frozen_string_literal: true

begin
  require 'rbconfig'
rescue LoadError
  # for make mjit-headers
end

#
# = fileutils.rb
#
# Copyright (c) 2000-2007 Minero Aoki
#
# This program is free software.
# You can distribute/modify this program under the same terms of ruby.
#
# == module FileUtils
#
# Namespace for several file utility methods for copying, moving, removing, etc.
#
# === Module Functions
#
#   require 'fileutils'
#
#   FileUtils.cd(dir, **options)
#   FileUtils.cd(dir, **options) {|dir| block }
#   FileUtils.pwd()
#   FileUtils.mkdir(dir, **options)
#   FileUtils.mkdir(list, **options)
#   FileUtils.mkdir_p(dir, **options)
#   FileUtils.mkdir_p(list, **options)
#   FileUtils.rmdir(dir, **options)
#   FileUtils.rmdir(list, **options)
#   FileUtils.ln(target, link, **options)
#   FileUtils.ln(targets, dir, **options)
#   FileUtils.ln_s(target, link, **options)
#   FileUtils.ln_s(targets, dir, **options)
#   FileUtils.ln_sf(target, link, **options)
#   FileUtils.cp(src, dest, **options)
#   FileUtils.cp(list, dir, **options)
#   FileUtils.cp_r(src, dest, **options)
#   FileUtils.cp_r(list, dir, **options)
#   FileUtils.mv(src, dest, **options)
#   FileUtils.mv(list, dir, **options)
#   FileUtils.rm(list, **options)
#   FileUtils.rm_r(list, **options)
#   FileUtils.rm_rf(list, **options)
#   FileUtils.install(src, dest, **options)
#   FileUtils.chmod(mode, list, **options)
#   FileUtils.chmod_R(mode, list, **options)
#   FileUtils.chown(user, group, list, **options)
#   FileUtils.chown_R(user, group, list, **options)
#   FileUtils.touch(list, **options)
#
# Possible <tt>options</tt> are:
#
# <tt>:force</tt> :: forced operation (rewrite files if exist, remove
#                    directories if not empty, etc.);
# <tt>:verbose</tt> :: print command to be run, in bash syntax, before
#                      performing it;
# <tt>:preserve</tt> :: preserve object's group, user and modification
#                       time on copying;
# <tt>:noop</tt> :: no changes are made (usable in combination with
#                   <tt>:verbose</tt> which will print the command to run)
#
# Each method documents the options that it honours. See also ::commands,
# ::options and ::options_of methods to introspect which command have which
# options.
#
# All methods that have the concept of a "source" file or directory can take
# either one file or a list of files in that argument.  See the method
# documentation for examples.
#
# There are some `low level' methods, which do not accept keyword arguments:
#
#   FileUtils.copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false)
#   FileUtils.copy_file(src, dest, preserve = false, dereference = true)
#   FileUtils.copy_stream(srcstream, deststream)
#   FileUtils.remove_entry(path, force = false)
#   FileUtils.remove_entry_secure(path, force = false)
#   FileUtils.remove_file(path, force = false)
#   FileUtils.compare_file(path_a, path_b)
#   FileUtils.compare_stream(stream_a, stream_b)
#   FileUtils.uptodate?(file, cmp_list)
#
# == module FileUtils::Verbose
#
# This module has all methods of FileUtils module, but it outputs messages
# before acting.  This equates to passing the <tt>:verbose</tt> flag to methods
# in FileUtils.
#
# == module FileUtils::NoWrite
#
# This module has all methods of FileUtils module, but never changes
# files/directories.  This equates to passing the <tt>:noop</tt> flag to methods
# in FileUtils.
#
# == module FileUtils::DryRun
#
# This module has all methods of FileUtils module, but never changes
# files/directories.  This equates to passing the <tt>:noop</tt> and
# <tt>:verbose</tt> flags to methods in FileUtils.
#
module FileUtils
  VERSION = "1.6.0"

  def self.private_module_function(name)   #:nodoc:
    module_function name
    private_class_method name
  end

  #
  # Returns the name of the current directory.
  #
  def pwd
    Dir.pwd
  end
  module_function :pwd

  alias getwd pwd
  module_function :getwd

  #
  # Changes the current directory to the directory +dir+.
  #
  # If this method is called with block, resumes to the previous
  # working directory after the block execution has finished.
  #
  #   FileUtils.cd('/')  # change directory
  #
  #   FileUtils.cd('/', verbose: true)   # change directory and report it
  #
  #   FileUtils.cd('/') do  # change directory
  #     # ...               # do something
  #   end                   # return to original directory
  #
  def cd(dir, verbose: nil, &block) # :yield: dir
    fu_output_message "cd #{dir}" if verbose
    result = Dir.chdir(dir, &block)
    fu_output_message 'cd -' if verbose and block
    result
  end
  module_function :cd

  alias chdir cd
  module_function :chdir

  #
  # Returns true if +new+ is newer than all +old_list+.
  # Non-existent files are older than any file.
  #
  #   FileUtils.uptodate?('hello.o', %w(hello.c hello.h)) or \
  #       system 'make hello.o'
  #
  def uptodate?(new, old_list)
    return false unless File.exist?(new)
    new_time = File.mtime(new)
    old_list.each do |old|
      if File.exist?(old)
        return false unless new_time > File.mtime(old)
      end
    end
    true
  end
  module_function :uptodate?

  def remove_trailing_slash(dir)   #:nodoc:
    dir == '/' ? dir : dir.chomp(?/)
  end
  private_module_function :remove_trailing_slash

  #
  # Creates one or more directories.
  #
  #   FileUtils.mkdir 'test'
  #   FileUtils.mkdir %w(tmp data)
  #   FileUtils.mkdir 'notexist', noop: true  # Does not really create.
  #   FileUtils.mkdir 'tmp', mode: 0700
  #
  def mkdir(list, mode: nil, noop: nil, verbose: nil)
    list = fu_list(list)
    fu_output_message "mkdir #{mode ? ('-m %03o ' % mode) : ''}#{list.join ' '}" if verbose
    return if noop

    list.each do |dir|
      fu_mkdir dir, mode
    end
  end
  module_function :mkdir

  #
  # Creates a directory and all its parent directories.
  # For example,
  #
  #   FileUtils.mkdir_p '/usr/local/lib/ruby'
  #
  # causes to make following directories, if they do not exist.
  #
  # * /usr
  # * /usr/local
  # * /usr/local/lib
  # * /usr/local/lib/ruby
  #
  # You can pass several directories at a time in a list.
  #
  def mkdir_p(list, mode: nil, noop: nil, verbose: nil)
    list = fu_list(list)
    fu_output_message "mkdir -p #{mode ? ('-m %03o ' % mode) : ''}#{list.join ' '}" if verbose
    return *list if noop

    list.each do |item|
      path = remove_trailing_slash(item)

      stack = []
      until File.directory?(path) || File.dirname(path) == path
        stack.push path
        path = File.dirname(path)
      end
      stack.reverse_each do |dir|
        begin
          fu_mkdir dir, mode
        rescue SystemCallError
          raise unless File.directory?(dir)
        end
      end
    end

    return *list
  end
  module_function :mkdir_p

  alias mkpath    mkdir_p
  alias makedirs  mkdir_p
  module_function :mkpath
  module_function :makedirs

  def fu_mkdir(path, mode)   #:nodoc:
    path = remove_trailing_slash(path)
    if mode
      Dir.mkdir path, mode
      File.chmod mode, path
    else
      Dir.mkdir path
    end
  end
  private_module_function :fu_mkdir

  #
  # Removes one or more directories.
  #
  #   FileUtils.rmdir 'somedir'
  #   FileUtils.rmdir %w(somedir anydir otherdir)
  #   # Does not really remove directory; outputs message.
  #   FileUtils.rmdir 'somedir', verbose: true, noop: true
  #
  def rmdir(list, parents: nil, noop: nil, verbose: nil)
    list = fu_list(list)
    fu_output_message "rmdir #{parents ? '-p ' : ''}#{list.join ' '}" if verbose
    return if noop
    list.each do |dir|
      Dir.rmdir(dir = remove_trailing_slash(dir))
      if parents
        begin
          until (parent = File.dirname(dir)) == '.' or parent == dir
            dir = parent
            Dir.rmdir(dir)
          end
        rescue Errno::ENOTEMPTY, Errno::EEXIST, Errno::ENOENT
        end
      end
    end
  end
  module_function :rmdir

  #
  # :call-seq:
  #   FileUtils.ln(target, link, force: nil, noop: nil, verbose: nil)
  #   FileUtils.ln(target,  dir, force: nil, noop: nil, verbose: nil)
  #   FileUtils.ln(targets, dir, force: nil, noop: nil, verbose: nil)
  #
  # In the first form, creates a hard link +link+ which points to +target+.
  # If +link+ already exists, raises Errno::EEXIST.
  # But if the +force+ option is set, overwrites +link+.
  #
  #   FileUtils.ln 'gcc', 'cc', verbose: true
  #   FileUtils.ln '/usr/bin/emacs21', '/usr/bin/emacs'
  #
  # In the second form, creates a link +dir/target+ pointing to +target+.
  # In the third form, creates several hard links in the directory +dir+,
  # pointing to each item in +targets+.
  # If +dir+ is not a directory, raises Errno::ENOTDIR.
  #
  #   FileUtils.cd '/sbin'
  #   FileUtils.ln %w(cp mv mkdir), '/bin'   # Now /sbin/cp and /bin/cp are linked.
  #
  def ln(src, dest, force: nil, noop: nil, verbose: nil)
    fu_output_message "ln#{force ? ' -f' : ''} #{[src,dest].flatten.join ' '}" if verbose
    return if noop
    fu_each_src_dest0(src, dest) do |s,d|
      remove_file d, true if force
      File.link s, d
    end
  end
  module_function :ln

  alias link ln
  module_function :link

  #
  # Hard link +src+ to +dest+. If +src+ is a directory, this method links
  # all its contents recursively. If +dest+ is a directory, links
  # +src+ to +dest/src+.
  #
  # +src+ can be a list of files.
  #
  # If +dereference_root+ is true, this method dereference tree root.
  #
  # If +remove_destination+ is true, this method removes each destination file before copy.
  #
  #   FileUtils.rm_r site_ruby + '/mylib', force: true
  #   FileUtils.cp_lr 'lib/', site_ruby + '/mylib'
  #
  #   # Examples of linking several files to target directory.
  #   FileUtils.cp_lr %w(mail.rb field.rb debug/), site_ruby + '/tmail'
  #   FileUtils.cp_lr Dir.glob('*.rb'), '/home/aamine/lib/ruby', noop: true, verbose: true
  #
  #   # If you want to link all contents of a directory instead of the
  #   # directory itself, c.f. src/x -> dest/x, src/y -> dest/y,
  #   # use the following code.
  #   FileUtils.cp_lr 'src/.', 'dest'  # cp_lr('src', 'dest') makes dest/src, but this doesn't.
  #
  def cp_lr(src, dest, noop: nil, verbose: nil,
            dereference_root: true, remove_destination: false)
    fu_output_message "cp -lr#{remove_destination ? ' --remove-destination' : ''} #{[src,dest].flatten.join ' '}" if verbose
    return if noop
    fu_each_src_dest(src, dest) do |s, d|
      link_entry s, d, dereference_root, remove_destination
    end
  end
  module_function :cp_lr

  #
  # :call-seq:
  #   FileUtils.ln_s(target, link, force: nil, noop: nil, verbose: nil)
  #   FileUtils.ln_s(target,  dir, force: nil, noop: nil, verbose: nil)
  #   FileUtils.ln_s(targets, dir, force: nil, noop: nil, verbose: nil)
  #
  # In the first form, creates a symbolic link +link+ which points to +target+.
  # If +link+ already exists, raises Errno::EEXIST.
  # But if the <tt>force</tt> option is set, overwrites +link+.
  #
  #   FileUtils.ln_s '/usr/bin/ruby', '/usr/local/bin/ruby'
  #   FileUtils.ln_s 'verylongsourcefilename.c', 'c', force: true
  #
  # In the second form, creates a link +dir/target+ pointing to +target+.
  # In the third form, creates several symbolic links in the directory +dir+,
  # pointing to each item in +targets+.
  # If +dir+ is not a directory, raises Errno::ENOTDIR.
  #
  #   FileUtils.ln_s Dir.glob('/bin/*.rb'), '/home/foo/bin'
  #
  def ln_s(src, dest, force: nil, noop: nil, verbose: nil)
    fu_output_message "ln -s#{force ? 'f' : ''} #{[src,dest].flatten.join ' '}" if verbose
    return if noop
    fu_each_src_dest0(src, dest) do |s,d|
      remove_file d, true if force
      File.symlink s, d
    end
  end
  module_function :ln_s

  alias symlink ln_s
  module_function :symlink

  #
  # :call-seq:
  #   FileUtils.ln_sf(*args)
  #
  # Same as
  #
  #   FileUtils.ln_s(*args, force: true)
  #
  def ln_sf(src, dest, noop: nil, verbose: nil)
    ln_s src, dest, force: true, noop: noop, verbose: verbose
  end
  module_function :ln_sf

  #
  # Hard links a file system entry +src+ to +dest+.
  # If +src+ is a directory, this method links its contents recursively.
  #
  # Both of +src+ and +dest+ must be a path name.
  # +src+ must exist, +dest+ must not exist.
  #
  # If +dereference_root+ is true, this method dereferences the tree root.
  #
  # If +remove_destination+ is true, this method removes each destination file before copy.
  #
  def link_entry(src, dest, dereference_root = false, remove_destination = false)
    Entry_.new(src, nil, dereference_root).traverse do |ent|
      destent = Entry_.new(dest, ent.rel, false)
      File.unlink destent.path if remove_destination && File.file?(destent.path)
      ent.link destent.path
    end
  end
  module_function :link_entry

  #
  # Copies a file content +src+ to +dest+.  If +dest+ is a directory,
  # copies +src+ to +dest/src+.
  #
  # If +src+ is a list of files, then +dest+ must be a directory.
  #
  #   FileUtils.cp 'eval.c', 'eval.c.org'
  #   FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'
  #   FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6', verbose: true
  #   FileUtils.cp 'symlink', 'dest'   # copy content, "dest" is not a symlink
  #
  def cp(src, dest, preserve: nil, noop: nil, verbose: nil)
    fu_output_message "cp#{preserve ? ' -p' : ''} #{[src,dest].flatten.join ' '}" if verbose
    return if noop
    fu_each_src_dest(src, dest) do |s, d|
      copy_file s, d, preserve
    end
  end
  module_function :cp

  alias copy cp
  module_function :copy

  #
  # Copies +src+ to +dest+. If +src+ is a directory, this method copies
  # all its contents recursively. If +dest+ is a directory, copies
  # +src+ to +dest/src+.
  #
  # +src+ can be a list of files.
  #
  # If +dereference_root+ is true, this method dereference tree root.
  #
  # If +remove_destination+ is true, this method removes each destination file before copy.
  #
  #   # Installing Ruby library "mylib" under the site_ruby
  #   FileUtils.rm_r site_ruby + '/mylib', force: true
  #   FileUtils.cp_r 'lib/', site_ruby + '/mylib'
  #
  #   # Examples of copying several files to target directory.
  #   FileUtils.cp_r %w(mail.rb field.rb debug/), site_ruby + '/tmail'
  #   FileUtils.cp_r Dir.glob('*.rb'), '/home/foo/lib/ruby', noop: true, verbose: true
  #
  #   # If you want to copy all contents of a directory instead of the
  #   # directory itself, c.f. src/x -> dest/x, src/y -> dest/y,
  #   # use following code.
  #   FileUtils.cp_r 'src/.', 'dest'     # cp_r('src', 'dest') makes dest/src,
  #                                      # but this doesn't.
  #
  def cp_r(src, dest, preserve: nil, noop: nil, verbose: nil,
           dereference_root: true, remove_destination: nil)
    fu_output_message "cp -r#{preserve ? 'p' : ''}#{remove_destination ? ' --remove-destination' : ''} #{[src,dest].flatten.join ' '}" if verbose
    return if noop
    fu_each_src_dest(src, dest) do |s, d|
      copy_entry s, d, preserve, dereference_root, remove_destination
    end
  end
  module_function :cp_r

  #
  # Copies a file system entry +src+ to +dest+.
  # If +src+ is a directory, this method copies its contents recursively.
  # This method preserves file types, c.f. symlink, directory...
  # (FIFO, device files and etc. are not supported yet)
  #
  # Both of +src+ and +dest+ must be a path name.
  # +src+ must exist, +dest+ must not exist.
  #
  # If +preserve+ is true, this method preserves owner, group, and
  # modified time.  Permissions are copied regardless +preserve+.
  #
  # If +dereference_root+ is true, this method dereference tree root.
  #
  # If +remove_destination+ is true, this method removes each destination file before copy.
  #
  def copy_entry(src, dest, preserve = false, dereference_root = false, remove_destination = false)
    if dereference_root
      src = File.realpath(src)
    end

    Entry_.new(src, nil, false).wrap_traverse(proc do |ent|
      destent = Entry_.new(dest, ent.rel, false)
      File.unlink destent.path if remove_destination && (File.file?(destent.path) || File.symlink?(destent.path))
      ent.copy destent.path
    end, proc do |ent|
      destent = Entry_.new(dest, ent.rel, false)
      ent.copy_metadata destent.path if preserve
    end)
  end
  module_function :copy_entry

  #
  # Copies file contents of +src+ to +dest+.
  # Both of +src+ and +dest+ must be a path name.
  #
  def copy_file(src, dest, preserve = false, dereference = true)
    ent = Entry_.new(src, nil, dereference)
    ent.copy_file dest
    ent.copy_metadata dest if preserve
  end
  module_function :copy_file

  #
  # Copies stream +src+ to +dest+.
  # +src+ must respond to #read(n) and
  # +dest+ must respond to #write(str).
  #
  def copy_stream(src, dest)
    IO.copy_stream(src, dest)
  end
  module_function :copy_stream

  #
  # Moves file(s) +src+ to +dest+.  If +file+ and +dest+ exist on the different
  # disk partition, the file is copied then the original file is removed.
  #
  #   FileUtils.mv 'badname.rb', 'goodname.rb'
  #   FileUtils.mv 'stuff.rb', '/notexist/lib/ruby', force: true  # no error
  #
  #   FileUtils.mv %w(junk.txt dust.txt), '/home/foo/.trash/'
  #   FileUtils.mv Dir.glob('test*.rb'), 'test', noop: true, verbose: true
  #
  def mv(src, dest, force: nil, noop: nil, verbose: nil, secure: nil)
    fu_output_message "mv#{force ? ' -f' : ''} #{[src,dest].flatten.join ' '}" if verbose
    return if noop
    fu_each_src_dest(src, dest) do |s, d|
      destent = Entry_.new(d, nil, true)
      begin
        if destent.exist?
          if destent.directory?
            raise Errno::EEXIST, d
          end
        end
        begin
          File.rename s, d
        rescue Errno::EXDEV,
               Errno::EPERM # move from unencrypted to encrypted dir (ext4)
          copy_entry s, d, true
          if secure
            remove_entry_secure s, force
          else
            remove_entry s, force
          end
        end
      rescue SystemCallError
        raise unless force
      end
    end
  end
  module_function :mv

  alias move mv
  module_function :move

  #
  # Remove file(s) specified in +list+.  This method cannot remove directories.
  # All StandardErrors are ignored when the :force option is set.
  #
  #   FileUtils.rm %w( junk.txt dust.txt )
  #   FileUtils.rm Dir.glob('*.so')
  #   FileUtils.rm 'NotExistFile', force: true   # never raises exception
  #
  def rm(list, force: nil, noop: nil, verbose: nil)
    list = fu_list(list)
    fu_output_message "rm#{force ? ' -f' : ''} #{list.join ' '}" if verbose
    return if noop

    list.each do |path|
      remove_file path, force
    end
  end
  module_function :rm

  alias remove rm
  module_function :remove

  #
  # Equivalent to
  #
  #   FileUtils.rm(list, force: true)
  #
  def rm_f(list, noop: nil, verbose: nil)
    rm list, force: true, noop: noop, verbose: verbose
  end
  module_function :rm_f

  alias safe_unlink rm_f
  module_function :safe_unlink

  #
  # remove files +list+[0] +list+[1]... If +list+[n] is a directory,
  # removes its all contents recursively. This method ignores
  # StandardError when :force option is set.
  #
  #   FileUtils.rm_r Dir.glob('/tmp/*')
  #   FileUtils.rm_r 'some_dir', force: true
  #
  # WARNING: This method causes local vulnerability
  # if one of parent directories or removing directory tree are world
  # writable (including /tmp, whose permission is 1777), and the current
  # process has strong privilege such as Unix super user (root), and the
  # system has symbolic link.  For secure removing, read the documentation
  # of remove_entry_secure carefully, and set :secure option to true.
  # Default is <tt>secure: false</tt>.
  #
  # NOTE: This method calls remove_entry_secure if :secure option is set.
  # See also remove_entry_secure.
  #
  def rm_r(list, force: nil, noop: nil, verbose: nil, secure: nil)
    list = fu_list(list)
    fu_output_message "rm -r#{force ? 'f' : ''} #{list.join ' '}" if verbose
    return if noop
    list.each do |path|
      if secure
        remove_entry_secure path, force
      else
        remove_entry path, force
      end
    end
  end
  module_function :rm_r

  #
  # Equivalent to
  #
  #   FileUtils.rm_r(list, force: true)
  #
  # WARNING: This method causes local vulnerability.
  # Read the documentation of rm_r first.
  #
  def rm_rf(list, noop: nil, verbose: nil, secure: nil)
    rm_r list, force: true, noop: noop, verbose: verbose, secure: secure
  end
  module_function :rm_rf

  alias rmtree rm_rf
  module_function :rmtree

  #
  # This method removes a file system entry +path+.  +path+ shall be a
  # regular file, a directory, or something.  If +path+ is a directory,
  # remove it recursively.  This method is required to avoid TOCTTOU
  # (time-of-check-to-time-of-use) local security vulnerability of rm_r.
  # #rm_r causes security hole when:
  #
  # * Parent directory is world writable (including /tmp).
  # * Removing directory tree includes world writable directory.
  # * The system has symbolic link.
  #
  # To avoid this security hole, this method applies special preprocess.
  # If +path+ is a directory, this method chown(2) and chmod(2) all
  # removing directories.  This requires the current process is the
  # owner of the removing whole directory tree, or is the super user (root).
  #
  # WARNING: You must ensure that *ALL* parent directories cannot be
  # moved by other untrusted users.  For example, parent directories
  # should not be owned by untrusted users, and should not be world
  # writable except when the sticky bit set.
  #
  # WARNING: Only the owner of the removing directory tree, or Unix super
  # user (root) should invoke this method.  Otherwise this method does not
  # work.
  #
  # For details of this security vulnerability, see Perl's case:
  #
  # * https://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2005-0448
  # * https://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2004-0452
  #
  # For fileutils.rb, this vulnerability is reported in [ruby-dev:26100].
  #
  def remove_entry_secure(path, force = false)
    unless fu_have_symlink?
      remove_entry path, force
      return
    end
    fullpath = File.expand_path(path)
    st = File.lstat(fullpath)
    unless st.directory?
      File.unlink fullpath
      return
    end
    # is a directory.
    parent_st = File.stat(File.dirname(fullpath))
    unless parent_st.world_writable?
      remove_entry path, force
      return
    end
    unless parent_st.sticky?
      raise ArgumentError, "parent directory is world writable, FileUtils#remove_entry_secure does not work; abort: #{path.inspect} (parent directory mode #{'%o' % parent_st.mode})"
    end

    # freeze tree root
    euid = Process.euid
    dot_file = fullpath + "/."
    begin
      File.open(dot_file) {|f|
        unless fu_stat_identical_entry?(st, f.stat)
          # symlink (TOC-to-TOU attack?)
          File.unlink fullpath
          return
        end
        f.chown euid, -1
        f.chmod 0700
      }
    rescue Errno::EISDIR # JRuby in non-native mode can't open files as dirs
      File.lstat(dot_file).tap {|fstat|
        unless fu_stat_identical_entry?(st, fstat)
          # symlink (TOC-to-TOU attack?)
          File.unlink fullpath
          return
        end
        File.chown euid, -1, dot_file
        File.chmod 0700, dot_file
      }
    end

    unless fu_stat_identical_entry?(st, File.lstat(fullpath))
      # TOC-to-TOU attack?
      File.unlink fullpath
      return
    end

    # ---- tree root is frozen ----
    root = Entry_.new(path)
    root.preorder_traverse do |ent|
      if ent.directory?
        ent.chown euid, -1
        ent.chmod 0700
      end
    end
    root.postorder_traverse do |ent|
      begin
        ent.remove
      rescue
        raise unless force
      end
    end
  rescue
    raise unless force
  end
  module_function :remove_entry_secure

  def fu_have_symlink?   #:nodoc:
    File.symlink nil, nil
  rescue NotImplementedError
    return false
  rescue TypeError
    return true
  end
  private_module_function :fu_have_symlink?

  def fu_stat_identical_entry?(a, b)   #:nodoc:
    a.dev == b.dev and a.ino == b.ino
  end
  private_module_function :fu_stat_identical_entry?

  #
  # This method removes a file system entry +path+.
  # +path+ might be a regular file, a directory, or something.
  # If +path+ is a directory, remove it recursively.
  #
  # See also remove_entry_secure.
  #
  def remove_entry(path, force = false)
    Entry_.new(path).postorder_traverse do |ent|
      begin
        ent.remove
      rescue
        raise unless force
      end
    end
  rescue
    raise unless force
  end
  module_function :remove_entry

  #
  # Removes a file +path+.
  # This method ignores StandardError if +force+ is true.
  #
  def remove_file(path, force = false)
    Entry_.new(path).remove_file
  rescue
    raise unless force
  end
  module_function :remove_file

  #
  # Removes a directory +dir+ and its contents recursively.
  # This method ignores StandardError if +force+ is true.
  #
  def remove_dir(path, force = false)
    remove_entry path, force   # FIXME?? check if it is a directory
  end
  module_function :remove_dir

  #
  # Returns true if the contents of a file +a+ and a file +b+ are identical.
  #
  #   FileUtils.compare_file('somefile', 'somefile')       #=> true
  #   FileUtils.compare_file('/dev/null', '/dev/urandom')  #=> false
  #
  def compare_file(a, b)
    return false unless File.size(a) == File.size(b)
    File.open(a, 'rb') {|fa|
      File.open(b, 'rb') {|fb|
        return compare_stream(fa, fb)
      }
    }
  end
  module_function :compare_file

  alias identical? compare_file
  alias cmp compare_file
  module_function :identical?
  module_function :cmp

  #
  # Returns true if the contents of a stream +a+ and +b+ are identical.
  #
  def compare_stream(a, b)
    bsize = fu_stream_blksize(a, b)

    sa = String.new(capacity: bsize)
    sb = String.new(capacity: bsize)

    begin
      a.read(bsize, sa)
      b.read(bsize, sb)
      return true if sa.empty? && sb.empty?
    end while sa == sb
    false
  end
  module_function :compare_stream

  #
  # If +src+ is not same as +dest+, copies it and changes the permission
  # mode to +mode+.  If +dest+ is a directory, destination is +dest+/+src+.
  # This method removes destination before copy.
  #
  #   FileUtils.install 'ruby', '/usr/local/bin/ruby', mode: 0755, verbose: true
  #   FileUtils.install 'lib.rb', '/usr/local/lib/ruby/site_ruby', verbose: true
  #
  def install(src, dest, mode: nil, owner: nil, group: nil, preserve: nil,
              noop: nil, verbose: nil)
    if verbose
      msg = +"install -c"
      msg << ' -p' if preserve
      msg << ' -m ' << mode_to_s(mode) if mode
      msg << " -o #{owner}" if owner
      msg << " -g #{group}" if group
      msg << ' ' << [src,dest].flatten.join(' ')
      fu_output_message msg
    end
    return if noop
    uid = fu_get_uid(owner)
    gid = fu_get_gid(group)
    fu_each_src_dest(src, dest) do |s, d|
      st = File.stat(s)
      unless File.exist?(d) and compare_file(s, d)
        remove_file d, true
        copy_file s, d
        File.utime st.atime, st.mtime, d if preserve
        File.chmod fu_mode(mode, st), d if mode
        File.chown uid, gid, d if uid or gid
      end
    end
  end
  module_function :install

  def user_mask(target)  #:nodoc:
    target.each_char.inject(0) do |mask, chr|
      case chr
      when "u"
        mask | 04700
      when "g"
        mask | 02070
      when "o"
        mask | 01007
      when "a"
        mask | 07777
      else
        raise ArgumentError, "invalid `who' symbol in file mode: #{chr}"
      end
    end
  end
  private_module_function :user_mask

  def apply_mask(mode, user_mask, op, mode_mask)   #:nodoc:
    case op
    when '='
      (mode & ~user_mask) | (user_mask & mode_mask)
    when '+'
      mode | (user_mask & mode_mask)
    when '-'
      mode & ~(user_mask & mode_mask)
    end
  end
  private_module_function :apply_mask

  def symbolic_modes_to_i(mode_sym, path)  #:nodoc:
    path = File.stat(path) unless File::Stat === path
    mode = path.mode
    mode_sym.split(/,/).inject(mode & 07777) do |current_mode, clause|
      target, *actions = clause.split(/([=+-])/)
      raise ArgumentError, "invalid file mode: #{mode_sym}" if actions.empty?
      target = 'a' if target.empty?
      user_mask = user_mask(target)
      actions.each_slice(2) do |op, perm|
        need_apply = op == '='
        mode_mask = (perm || '').each_char.inject(0) do |mask, chr|
          case chr
          when "r"
            mask | 0444
          when "w"
            mask | 0222
          when "x"
            mask | 0111
          when "X"
            if path.directory?
              mask | 0111
            else
              mask
            end
          when "s"
            mask | 06000
          when "t"
            mask | 01000
          when "u", "g", "o"
            if mask.nonzero?
              current_mode = apply_mask(current_mode, user_mask, op, mask)
            end
            need_apply = false
            copy_mask = user_mask(chr)
            (current_mode & copy_mask) / (copy_mask & 0111) * (user_mask & 0111)
          else
            raise ArgumentError, "invalid `perm' symbol in file mode: #{chr}"
          end
        end

        if mode_mask.nonzero? || need_apply
          current_mode = apply_mask(current_mode, user_mask, op, mode_mask)
        end
      end
      current_mode
    end
  end
  private_module_function :symbolic_modes_to_i

  def fu_mode(mode, path)  #:nodoc:
    mode.is_a?(String) ? symbolic_modes_to_i(mode, path) : mode
  end
  private_module_function :fu_mode

  def mode_to_s(mode)  #:nodoc:
    mode.is_a?(String) ? mode : "%o" % mode
  end
  private_module_function :mode_to_s

  #
  # Changes permission bits on the named files (in +list+) to the bit pattern
  # represented by +mode+.
  #
  # +mode+ is the symbolic and absolute mode can be used.
  #
  # Absolute mode is
  #   FileUtils.chmod 0755, 'somecommand'
  #   FileUtils.chmod 0644, %w(my.rb your.rb his.rb her.rb)
  #   FileUtils.chmod 0755, '/usr/bin/ruby', verbose: true
  #
  # Symbolic mode is
  #   FileUtils.chmod "u=wrx,go=rx", 'somecommand'
  #   FileUtils.chmod "u=wr,go=rr", %w(my.rb your.rb his.rb her.rb)
  #   FileUtils.chmod "u=wrx,go=rx", '/usr/bin/ruby', verbose: true
  #
  # "a" :: is user, group, other mask.
  # "u" :: is user's mask.
  # "g" :: is group's mask.
  # "o" :: is other's mask.
  # "w" :: is write permission.
  # "r" :: is read permission.
  # "x" :: is execute permission.
  # "X" ::
  #   is execute permission for directories only, must be used in conjunction with "+"
  # "s" :: is uid, gid.
  # "t" :: is sticky bit.
  # "+" :: is added to a class given the specified mode.
  # "-" :: Is removed from a given class given mode.
  # "=" :: Is the exact nature of the class will be given a specified mode.

  def chmod(mode, list, noop: nil, verbose: nil)
    list = fu_list(list)
    fu_output_message sprintf('chmod %s %s', mode_to_s(mode), list.join(' ')) if verbose
    return if noop
    list.each do |path|
      Entry_.new(path).chmod(fu_mode(mode, path))
    end
  end
  module_function :chmod

  #
  # Changes permission bits on the named files (in +list+)
  # to the bit pattern represented by +mode+.
  #
  #   FileUtils.chmod_R 0700, "/tmp/app.#{$$}"
  #   FileUtils.chmod_R "u=wrx", "/tmp/app.#{$$}"
  #
  def chmod_R(mode, list, noop: nil, verbose: nil, force: nil)
    list = fu_list(list)
    fu_output_message sprintf('chmod -R%s %s %s',
                              (force ? 'f' : ''),
                              mode_to_s(mode), list.join(' ')) if verbose
    return if noop
    list.each do |root|
      Entry_.new(root).traverse do |ent|
        begin
          ent.chmod(fu_mode(mode, ent.path))
        rescue
          raise unless force
        end
      end
    end
  end
  module_function :chmod_R

  #
  # Changes owner and group on the named files (in +list+)
  # to the user +user+ and the group +group+.  +user+ and +group+
  # may be an ID (Integer/String) or a name (String).
  # If +user+ or +group+ is nil, this method does not change
  # the attribute.
  #
  #   FileUtils.chown 'root', 'staff', '/usr/local/bin/ruby'
  #   FileUtils.chown nil, 'bin', Dir.glob('/usr/bin/*'), verbose: true
  #
  def chown(user, group, list, noop: nil, verbose: nil)
    list = fu_list(list)
    fu_output_message sprintf('chown %s %s',
                              (group ? "#{user}:#{group}" : user || ':'),
                              list.join(' ')) if verbose
    return if noop
    uid = fu_get_uid(user)
    gid = fu_get_gid(group)
    list.each do |path|
      Entry_.new(path).chown uid, gid
    end
  end
  module_function :chown

  #
  # Changes owner and group on the named files (in +list+)
  # to the user +user+ and the group +group+ recursively.
  # +user+ and +group+ may be an ID (Integer/String) or
  # a name (String).  If +user+ or +group+ is nil, this
  # method does not change the attribute.
  #
  #   FileUtils.chown_R 'www', 'www', '/var/www/htdocs'
  #   FileUtils.chown_R 'cvs', 'cvs', '/var/cvs', verbose: true
  #
  def chown_R(user, group, list, noop: nil, verbose: nil, force: nil)
    list = fu_list(list)
    fu_output_message sprintf('chown -R%s %s %s',
                              (force ? 'f' : ''),
                              (group ? "#{user}:#{group}" : user || ':'),
                              list.join(' ')) if verbose
    return if noop
    uid = fu_get_uid(user)
    gid = fu_get_gid(group)
    list.each do |root|
      Entry_.new(root).traverse do |ent|
        begin
          ent.chown uid, gid
        rescue
          raise unless force
        end
      end
    end
  end
  module_function :chown_R

  def fu_get_uid(user)   #:nodoc:
    return nil unless user
    case user
    when Integer
      user
    when /\A\d+\z/
      user.to_i
    else
      require 'etc'
      Etc.getpwnam(user) ? Etc.getpwnam(user).uid : nil
    end
  end
  private_module_function :fu_get_uid

  def fu_get_gid(group)   #:nodoc:
    return nil unless group
    case group
    when Integer
      group
    when /\A\d+\z/
      group.to_i
    else
      require 'etc'
      Etc.getgrnam(group) ? Etc.getgrnam(group).gid : nil
    end
  end
  private_module_function :fu_get_gid

  #
  # Updates modification time (mtime) and access time (atime) of file(s) in
  # +list+.  Files are created if they don't exist.
  #
  #   FileUtils.touch 'timestamp'
  #   FileUtils.touch Dir.glob('*.c');  system 'make'
  #
  def touch(list, noop: nil, verbose: nil, mtime: nil, nocreate: nil)
    list = fu_list(list)
    t = mtime
    if verbose
      fu_output_message "touch #{nocreate ? '-c ' : ''}#{t ? t.strftime('-t %Y%m%d%H%M.%S ') : ''}#{list.join ' '}"
    end
    return if noop
    list.each do |path|
      created = nocreate
      begin
        File.utime(t, t, path)
      rescue Errno::ENOENT
        raise if created
        File.open(path, 'a') {
          ;
        }
        created = true
        retry if t
      end
    end
  end
  module_function :touch

  private

  module StreamUtils_
    private

    case (defined?(::RbConfig) ? ::RbConfig::CONFIG['host_os'] : ::RUBY_PLATFORM)
    when /mswin|mingw/
      def fu_windows?; true end
    else
      def fu_windows?; false end
    end

    def fu_copy_stream0(src, dest, blksize = nil)   #:nodoc:
      IO.copy_stream(src, dest)
    end

    def fu_stream_blksize(*streams)
      streams.each do |s|
        next unless s.respond_to?(:stat)
        size = fu_blksize(s.stat)
        return size if size
      end
      fu_default_blksize()
    end

    def fu_blksize(st)
      s = st.blksize
      return nil unless s
      return nil if s == 0
      s
    end

    def fu_default_blksize
      1024
    end
  end

  include StreamUtils_
  extend StreamUtils_

  class Entry_   #:nodoc: internal use only
    include StreamUtils_

    def initialize(a, b = nil, deref = false)
      @prefix = @rel = @path = nil
      if b
        @prefix = a
        @rel = b
      else
        @path = a
      end
      @deref = deref
      @stat = nil
      @lstat = nil
    end

    def inspect
      "\#<#{self.class} #{path()}>"
    end

    def path
      if @path
        File.path(@path)
      else
        join(@prefix, @rel)
      end
    end

    def prefix
      @prefix || @path
    end

    def rel
      @rel
    end

    def dereference?
      @deref
    end

    def exist?
      begin
        lstat
        true
      rescue Errno::ENOENT
        false
      end
    end

    def file?
      s = lstat!
      s and s.file?
    end

    def directory?
      s = lstat!
      s and s.directory?
    end

    def symlink?
      s = lstat!
      s and s.symlink?
    end

    def chardev?
      s = lstat!
      s and s.chardev?
    end

    def blockdev?
      s = lstat!
      s and s.blockdev?
    end

    def socket?
      s = lstat!
      s and s.socket?
    end

    def pipe?
      s = lstat!
      s and s.pipe?
    end

    S_IF_DOOR = 0xD000

    def door?
      s = lstat!
      s and (s.mode & 0xF000 == S_IF_DOOR)
    end

    def entries
      opts = {}
      opts[:encoding] = fu_windows? ? ::Encoding::UTF_8 : path.encoding

      files = Dir.children(path, **opts)

      untaint = RUBY_VERSION < '2.7'
      files.map {|n| Entry_.new(prefix(), join(rel(), untaint ? n.untaint : n)) }
    end

    def stat
      return @stat if @stat
      if lstat() and lstat().symlink?
        @stat = File.stat(path())
      else
        @stat = lstat()
      end
      @stat
    end

    def stat!
      return @stat if @stat
      if lstat! and lstat!.symlink?
        @stat = File.stat(path())
      else
        @stat = lstat!
      end
      @stat
    rescue SystemCallError
      nil
    end

    def lstat
      if dereference?
        @lstat ||= File.stat(path())
      else
        @lstat ||= File.lstat(path())
      end
    end

    def lstat!
      lstat()
    rescue SystemCallError
      nil
    end

    def chmod(mode)
      if symlink?
        File.lchmod mode, path() if have_lchmod?
      else
        File.chmod mode, path()
      end
    rescue Errno::EOPNOTSUPP
    end

    def chown(uid, gid)
      if symlink?
        File.lchown uid, gid, path() if have_lchown?
      else
        File.chown uid, gid, path()
      end
    end

    def link(dest)
      case
      when directory?
        if !File.exist?(dest) and descendant_directory?(dest, path)
          raise ArgumentError, "cannot link directory %s to itself %s" % [path, dest]
        end
        begin
          Dir.mkdir dest
        rescue
          raise unless File.directory?(dest)
        end
      else
        File.link path(), dest
      end
    end

    def copy(dest)
      lstat
      case
      when file?
        copy_file dest
      when directory?
        if !File.exist?(dest) and descendant_directory?(dest, path)
          raise ArgumentError, "cannot copy directory %s to itself %s" % [path, dest]
        end
        begin
          Dir.mkdir dest
        rescue
          raise unless File.directory?(dest)
        end
      when symlink?
        File.symlink File.readlink(path()), dest
      when chardev?, blockdev?
        raise "cannot handle device file"
      when socket?
        begin
          require 'socket'
        rescue LoadError
          raise "cannot handle socket"
        else
          raise "cannot handle socket" unless defined?(UNIXServer)
        end
        UNIXServer.new(dest).close
        File.chmod lstat().mode, dest
      when pipe?
        raise "cannot handle FIFO" unless File.respond_to?(:mkfifo)
        File.mkfifo dest, lstat().mode
      when door?
        raise "cannot handle door: #{path()}"
      else
        raise "unknown file type: #{path()}"
      end
    end

    def copy_file(dest)
      File.open(path()) do |s|
        File.open(dest, 'wb', s.stat.mode) do |f|
          IO.copy_stream(s, f)
        end
      end
    end

    def copy_metadata(path)
      st = lstat()
      if !st.symlink?
        File.utime st.atime, st.mtime, path
      end
      mode = st.mode
      begin
        if st.symlink?
          begin
            File.lchown st.uid, st.gid, path
          rescue NotImplementedError
          end
        else
          File.chown st.uid, st.gid, path
        end
      rescue Errno::EPERM, Errno::EACCES
        # clear setuid/setgid
        mode &= 01777
      end
      if st.symlink?
        begin
          File.lchmod mode, path
        rescue NotImplementedError, Errno::EOPNOTSUPP
        end
      else
        File.chmod mode, path
      end
    end

    def remove
      if directory?
        remove_dir1
      else
        remove_file
      end
    end

    def remove_dir1
      platform_support {
        Dir.rmdir path().chomp(?/)
      }
    end

    def remove_file
      platform_support {
        File.unlink path
      }
    end

    def platform_support
      return yield unless fu_windows?
      first_time_p = true
      begin
        yield
      rescue Errno::ENOENT
        raise
      rescue => err
        if first_time_p
          first_time_p = false
          begin
            File.chmod 0700, path()   # Windows does not have symlink
            retry
          rescue SystemCallError
          end
        end
        raise err
      end
    end

    def preorder_traverse
      stack = [self]
      while ent = stack.pop
        yield ent
        stack.concat ent.entries.reverse if ent.directory?
      end
    end

    alias traverse preorder_traverse

    def postorder_traverse
      if directory?
        entries().each do |ent|
          ent.postorder_traverse do |e|
            yield e
          end
        end
      end
    ensure
      yield self
    end

    def wrap_traverse(pre, post)
      pre.call self
      if directory?
        entries.each do |ent|
          ent.wrap_traverse pre, post
        end
      end
      post.call self
    end

    private

    @@fileutils_rb_have_lchmod = nil

    def have_lchmod?
      # This is not MT-safe, but it does not matter.
      if @@fileutils_rb_have_lchmod == nil
        @@fileutils_rb_have_lchmod = check_have_lchmod?
      end
      @@fileutils_rb_have_lchmod
    end

    def check_have_lchmod?
      return false unless File.respond_to?(:lchmod)
      File.lchmod 0
      return true
    rescue NotImplementedError
      return false
    end

    @@fileutils_rb_have_lchown = nil

    def have_lchown?
      # This is not MT-safe, but it does not matter.
      if @@fileutils_rb_have_lchown == nil
        @@fileutils_rb_have_lchown = check_have_lchown?
      end
      @@fileutils_rb_have_lchown
    end

    def check_have_lchown?
      return false unless File.respond_to?(:lchown)
      File.lchown nil, nil
      return true
    rescue NotImplementedError
      return false
    end

    def join(dir, base)
      return File.path(dir) if not base or base == '.'
      return File.path(base) if not dir or dir == '.'
      begin
        File.join(dir, base)
      rescue EncodingError
        if fu_windows?
          File.join(dir.encode(::Encoding::UTF_8), base.encode(::Encoding::UTF_8))
        else
          raise
        end
      end
    end

    if File::ALT_SEPARATOR
      DIRECTORY_TERM = "(?=[/#{Regexp.quote(File::ALT_SEPARATOR)}]|\\z)"
    else
      DIRECTORY_TERM = "(?=/|\\z)"
    end

    def descendant_directory?(descendant, ascendant)
      if File::FNM_SYSCASE.nonzero?
        File.expand_path(File.dirname(descendant)).casecmp(File.expand_path(ascendant)) == 0
      else
        File.expand_path(File.dirname(descendant)) == File.expand_path(ascendant)
      end
    end
  end   # class Entry_

  def fu_list(arg)   #:nodoc:
    [arg].flatten.map {|path| File.path(path) }
  end
  private_module_function :fu_list

  def fu_each_src_dest(src, dest)   #:nodoc:
    fu_each_src_dest0(src, dest) do |s, d|
      raise ArgumentError, "same file: #{s} and #{d}" if fu_same?(s, d)
      yield s, d
    end
  end
  private_module_function :fu_each_src_dest

  def fu_each_src_dest0(src, dest)   #:nodoc:
    if tmp = Array.try_convert(src)
      tmp.each do |s|
        s = File.path(s)
        yield s, File.join(dest, File.basename(s))
      end
    else
      src = File.path(src)
      if File.directory?(dest)
        yield src, File.join(dest, File.basename(src))
      else
        yield src, File.path(dest)
      end
    end
  end
  private_module_function :fu_each_src_dest0

  def fu_same?(a, b)   #:nodoc:
    File.identical?(a, b)
  end
  private_module_function :fu_same?

  def fu_output_message(msg)   #:nodoc:
    output = @fileutils_output if defined?(@fileutils_output)
    output ||= $stdout
    if defined?(@fileutils_label)
      msg = @fileutils_label + msg
    end
    output.puts msg
  end
  private_module_function :fu_output_message

  # This hash table holds command options.
  OPT_TABLE = {}    #:nodoc: internal use only
  (private_instance_methods & methods(false)).inject(OPT_TABLE) {|tbl, name|
    (tbl[name.to_s] = instance_method(name).parameters).map! {|t, n| n if t == :key}.compact!
    tbl
  }

  public

  #
  # Returns an Array of names of high-level methods that accept any keyword
  # arguments.
  #
  #   p FileUtils.commands  #=> ["chmod", "cp", "cp_r", "install", ...]
  #
  def self.commands
    OPT_TABLE.keys
  end

  #
  # Returns an Array of option names.
  #
  #   p FileUtils.options  #=> ["noop", "force", "verbose", "preserve", "mode"]
  #
  def self.options
    OPT_TABLE.values.flatten.uniq.map {|sym| sym.to_s }
  end

  #
  # Returns true if the method +mid+ have an option +opt+.
  #
  #   p FileUtils.have_option?(:cp, :noop)     #=> true
  #   p FileUtils.have_option?(:rm, :force)    #=> true
  #   p FileUtils.have_option?(:rm, :preserve) #=> false
  #
  def self.have_option?(mid, opt)
    li = OPT_TABLE[mid.to_s] or raise ArgumentError, "no such method: #{mid}"
    li.include?(opt)
  end

  #
  # Returns an Array of option names of the method +mid+.
  #
  #   p FileUtils.options_of(:rm)  #=> ["noop", "verbose", "force"]
  #
  def self.options_of(mid)
    OPT_TABLE[mid.to_s].map {|sym| sym.to_s }
  end

  #
  # Returns an Array of methods names which have the option +opt+.
  #
  #   p FileUtils.collect_method(:preserve) #=> ["cp", "cp_r", "copy", "install"]
  #
  def self.collect_method(opt)
    OPT_TABLE.keys.select {|m| OPT_TABLE[m].include?(opt) }
  end

  private

  LOW_METHODS = singleton_methods(false) - collect_method(:noop).map(&:intern) # :nodoc:
  module LowMethods # :nodoc: internal use only
    private
    def _do_nothing(*)end
    ::FileUtils::LOW_METHODS.map {|name| alias_method name, :_do_nothing}
  end

  METHODS = singleton_methods() - [:private_module_function,                  # :nodoc:
      :commands, :options, :have_option?, :options_of, :collect_method]

  #
  # This module has all methods of FileUtils module, but it outputs messages
  # before acting.  This equates to passing the <tt>:verbose</tt> flag to
  # methods in FileUtils.
  #
  module Verbose
    include FileUtils
    names = ::FileUtils.collect_method(:verbose)
    names.each do |name|
      module_eval(<<-EOS, __FILE__, __LINE__ + 1)
        def #{name}(*args, **options)
          super(*args, **options, verbose: true)
        end
      EOS
    end
    private(*names)
    extend self
    class << self
      public(*::FileUtils::METHODS)
    end
  end

  #
  # This module has all methods of FileUtils module, but never changes
  # files/directories.  This equates to passing the <tt>:noop</tt> flag
  # to methods in FileUtils.
  #
  module NoWrite
    include FileUtils
    include LowMethods
    names = ::FileUtils.collect_method(:noop)
    names.each do |name|
      module_eval(<<-EOS, __FILE__, __LINE__ + 1)
        def #{name}(*args, **options)
          super(*args, **options, noop: true)
        end
      EOS
    end
    private(*names)
    extend self
    class << self
      public(*::FileUtils::METHODS)
    end
  end

  #
  # This module has all methods of FileUtils module, but never changes
  # files/directories, with printing message before acting.
  # This equates to passing the <tt>:noop</tt> and <tt>:verbose</tt> flag
  # to methods in FileUtils.
  #
  module DryRun
    include FileUtils
    include LowMethods
    names = ::FileUtils.collect_method(:noop)
    names.each do |name|
      module_eval(<<-EOS, __FILE__, __LINE__ + 1)
        def #{name}(*args, **options)
          super(*args, **options, noop: true, verbose: true)
        end
      EOS
    end
    private(*names)
    extend self
    class << self
      public(*::FileUtils::METHODS)
    end
  end

end
PK!}$[Z!~ȡ[�[ ruby/unicode_normalize/tables.rbnu�[���# coding: us-ascii
# frozen_string_literal: true

# automatically generated by template/unicode_norm_gen.tmpl

module UnicodeNormalize  # :nodoc:
  accents = "" \
    "[\u0300-\u034E" \
    "\u0350-\u036F" \
    "\u0483-\u0487" \
    "\u0591-\u05BD" \
    "\u05BF" \
    "\u05C1\u05C2" \
    "\u05C4\u05C5" \
    "\u05C7" \
    "\u0610-\u061A" \
    "\u064B-\u065F" \
    "\u0670" \
    "\u06D6-\u06DC" \
    "\u06DF-\u06E4" \
    "\u06E7\u06E8" \
    "\u06EA-\u06ED" \
    "\u0711" \
    "\u0730-\u074A" \
    "\u07EB-\u07F3" \
    "\u07FD" \
    "\u0816-\u0819" \
    "\u081B-\u0823" \
    "\u0825-\u0827" \
    "\u0829-\u082D" \
    "\u0859-\u085B" \
    "\u08D3-\u08E1" \
    "\u08E3-\u08FF" \
    "\u093C" \
    "\u094D" \
    "\u0951-\u0954" \
    "\u09BC" \
    "\u09BE" \
    "\u09CD" \
    "\u09D7" \
    "\u09FE" \
    "\u0A3C" \
    "\u0A4D" \
    "\u0ABC" \
    "\u0ACD" \
    "\u0B3C" \
    "\u0B3E" \
    "\u0B4D" \
    "\u0B56\u0B57" \
    "\u0BBE" \
    "\u0BCD" \
    "\u0BD7" \
    "\u0C4D" \
    "\u0C55\u0C56" \
    "\u0CBC" \
    "\u0CC2" \
    "\u0CCD" \
    "\u0CD5\u0CD6" \
    "\u0D3B\u0D3C" \
    "\u0D3E" \
    "\u0D4D" \
    "\u0D57" \
    "\u0DCA" \
    "\u0DCF" \
    "\u0DDF" \
    "\u0E38-\u0E3A" \
    "\u0E48-\u0E4B" \
    "\u0EB8-\u0EBA" \
    "\u0EC8-\u0ECB" \
    "\u0F18\u0F19" \
    "\u0F35" \
    "\u0F37" \
    "\u0F39" \
    "\u0F71\u0F72" \
    "\u0F74" \
    "\u0F7A-\u0F7D" \
    "\u0F80" \
    "\u0F82-\u0F84" \
    "\u0F86\u0F87" \
    "\u0FC6" \
    "\u102E" \
    "\u1037" \
    "\u1039\u103A" \
    "\u108D" \
    "\u135D-\u135F" \
    "\u1714" \
    "\u1734" \
    "\u17D2" \
    "\u17DD" \
    "\u18A9" \
    "\u1939-\u193B" \
    "\u1A17\u1A18" \
    "\u1A60" \
    "\u1A75-\u1A7C" \
    "\u1A7F" \
    "\u1AB0-\u1ABD" \
    "\u1ABF\u1AC0" \
    "\u1B34\u1B35" \
    "\u1B44" \
    "\u1B6B-\u1B73" \
    "\u1BAA\u1BAB" \
    "\u1BE6" \
    "\u1BF2\u1BF3" \
    "\u1C37" \
    "\u1CD0-\u1CD2" \
    "\u1CD4-\u1CE0" \
    "\u1CE2-\u1CE8" \
    "\u1CED" \
    "\u1CF4" \
    "\u1CF8\u1CF9" \
    "\u1DC0-\u1DF9" \
    "\u1DFB-\u1DFF" \
    "\u20D0-\u20DC" \
    "\u20E1" \
    "\u20E5-\u20F0" \
    "\u2CEF-\u2CF1" \
    "\u2D7F" \
    "\u2DE0-\u2DFF" \
    "\u302A-\u302F" \
    "\u3099\u309A" \
    "\uA66F" \
    "\uA674-\uA67D" \
    "\uA69E\uA69F" \
    "\uA6F0\uA6F1" \
    "\uA806" \
    "\uA82C" \
    "\uA8C4" \
    "\uA8E0-\uA8F1" \
    "\uA92B-\uA92D" \
    "\uA953" \
    "\uA9B3" \
    "\uA9C0" \
    "\uAAB0" \
    "\uAAB2-\uAAB4" \
    "\uAAB7\uAAB8" \
    "\uAABE\uAABF" \
    "\uAAC1" \
    "\uAAF6" \
    "\uABED" \
    "\uFB1E" \
    "\uFE20-\uFE2F" \
    "\u{101FD}" \
    "\u{102E0}" \
    "\u{10376}-\u{1037A}" \
    "\u{10A0D}" \
    "\u{10A0F}" \
    "\u{10A38}-\u{10A3A}" \
    "\u{10A3F}" \
    "\u{10AE5}\u{10AE6}" \
    "\u{10D24}-\u{10D27}" \
    "\u{10EAB}\u{10EAC}" \
    "\u{10F46}-\u{10F50}" \
    "\u{11046}" \
    "\u{1107F}" \
    "\u{110B9}\u{110BA}" \
    "\u{11100}-\u{11102}" \
    "\u{11127}" \
    "\u{11133}\u{11134}" \
    "\u{11173}" \
    "\u{111C0}" \
    "\u{111CA}" \
    "\u{11235}\u{11236}" \
    "\u{112E9}\u{112EA}" \
    "\u{1133B}\u{1133C}" \
    "\u{1133E}" \
    "\u{1134D}" \
    "\u{11357}" \
    "\u{11366}-\u{1136C}" \
    "\u{11370}-\u{11374}" \
    "\u{11442}" \
    "\u{11446}" \
    "\u{1145E}" \
    "\u{114B0}" \
    "\u{114BA}" \
    "\u{114BD}" \
    "\u{114C2}\u{114C3}" \
    "\u{115AF}" \
    "\u{115BF}\u{115C0}" \
    "\u{1163F}" \
    "\u{116B6}\u{116B7}" \
    "\u{1172B}" \
    "\u{11839}\u{1183A}" \
    "\u{11930}" \
    "\u{1193D}\u{1193E}" \
    "\u{11943}" \
    "\u{119E0}" \
    "\u{11A34}" \
    "\u{11A47}" \
    "\u{11A99}" \
    "\u{11C3F}" \
    "\u{11D42}" \
    "\u{11D44}\u{11D45}" \
    "\u{11D97}" \
    "\u{16AF0}-\u{16AF4}" \
    "\u{16B30}-\u{16B36}" \
    "\u{16FF0}\u{16FF1}" \
    "\u{1BC9E}" \
    "\u{1D165}-\u{1D169}" \
    "\u{1D16D}-\u{1D172}" \
    "\u{1D17B}-\u{1D182}" \
    "\u{1D185}-\u{1D18B}" \
    "\u{1D1AA}-\u{1D1AD}" \
    "\u{1D242}-\u{1D244}" \
    "\u{1E000}-\u{1E006}" \
    "\u{1E008}-\u{1E018}" \
    "\u{1E01B}-\u{1E021}" \
    "\u{1E023}\u{1E024}" \
    "\u{1E026}-\u{1E02A}" \
    "\u{1E130}-\u{1E136}" \
    "\u{1E2EC}-\u{1E2EF}" \
    "\u{1E8D0}-\u{1E8D6}" \
    "\u{1E944}-\u{1E94A}" \
    "]"
  ACCENTS = accents
  REGEXP_D_STRING = "#{''  # composition starters and composition exclusions
    }" \
    "[\u00C0-\u00C5" \
    "\u00C7-\u00CF" \
    "\u00D1-\u00D6" \
    "\u00D9-\u00DD" \
    "\u00E0-\u00E5" \
    "\u00E7-\u00EF" \
    "\u00F1-\u00F6" \
    "\u00F9-\u00FD" \
    "\u00FF-\u010F" \
    "\u0112-\u0125" \
    "\u0128-\u0130" \
    "\u0134-\u0137" \
    "\u0139-\u013E" \
    "\u0143-\u0148" \
    "\u014C-\u0151" \
    "\u0154-\u0165" \
    "\u0168-\u017E" \
    "\u01A0\u01A1" \
    "\u01AF\u01B0" \
    "\u01CD-\u01DC" \
    "\u01DE-\u01E3" \
    "\u01E6-\u01F0" \
    "\u01F4\u01F5" \
    "\u01F8-\u021B" \
    "\u021E\u021F" \
    "\u0226-\u0233" \
    "\u0340\u0341" \
    "\u0343\u0344" \
    "\u0374" \
    "\u037E" \
    "\u0385-\u038A" \
    "\u038C" \
    "\u038E-\u0390" \
    "\u03AA-\u03B0" \
    "\u03CA-\u03CE" \
    "\u03D3\u03D4" \
    "\u0400\u0401" \
    "\u0403" \
    "\u0407" \
    "\u040C-\u040E" \
    "\u0419" \
    "\u0439" \
    "\u0450\u0451" \
    "\u0453" \
    "\u0457" \
    "\u045C-\u045E" \
    "\u0476\u0477" \
    "\u04C1\u04C2" \
    "\u04D0-\u04D3" \
    "\u04D6\u04D7" \
    "\u04DA-\u04DF" \
    "\u04E2-\u04E7" \
    "\u04EA-\u04F5" \
    "\u04F8\u04F9" \
    "\u0622-\u0626" \
    "\u06C0" \
    "\u06C2" \
    "\u06D3" \
    "\u0929" \
    "\u0931" \
    "\u0934" \
    "\u0958-\u095F" \
    "\u09CB\u09CC" \
    "\u09DC\u09DD" \
    "\u09DF" \
    "\u0A33" \
    "\u0A36" \
    "\u0A59-\u0A5B" \
    "\u0A5E" \
    "\u0B48" \
    "\u0B4B\u0B4C" \
    "\u0B5C\u0B5D" \
    "\u0B94" \
    "\u0BCA-\u0BCC" \
    "\u0C48" \
    "\u0CC0" \
    "\u0CC7\u0CC8" \
    "\u0CCA\u0CCB" \
    "\u0D4A-\u0D4C" \
    "\u0DDA" \
    "\u0DDC-\u0DDE" \
    "\u0F43" \
    "\u0F4D" \
    "\u0F52" \
    "\u0F57" \
    "\u0F5C" \
    "\u0F69" \
    "\u0F73" \
    "\u0F75\u0F76" \
    "\u0F78" \
    "\u0F81" \
    "\u0F93" \
    "\u0F9D" \
    "\u0FA2" \
    "\u0FA7" \
    "\u0FAC" \
    "\u0FB9" \
    "\u1026" \
    "\u1B06" \
    "\u1B08" \
    "\u1B0A" \
    "\u1B0C" \
    "\u1B0E" \
    "\u1B12" \
    "\u1B3B" \
    "\u1B3D" \
    "\u1B40\u1B41" \
    "\u1B43" \
    "\u1E00-\u1E99" \
    "\u1E9B" \
    "\u1EA0-\u1EF9" \
    "\u1F00-\u1F15" \
    "\u1F18-\u1F1D" \
    "\u1F20-\u1F45" \
    "\u1F48-\u1F4D" \
    "\u1F50-\u1F57" \
    "\u1F59" \
    "\u1F5B" \
    "\u1F5D" \
    "\u1F5F-\u1F7D" \
    "\u1F80-\u1FB4" \
    "\u1FB6-\u1FBC" \
    "\u1FBE" \
    "\u1FC1-\u1FC4" \
    "\u1FC6-\u1FD3" \
    "\u1FD6-\u1FDB" \
    "\u1FDD-\u1FEF" \
    "\u1FF2-\u1FF4" \
    "\u1FF6-\u1FFD" \
    "\u2000\u2001" \
    "\u2126" \
    "\u212A\u212B" \
    "\u219A\u219B" \
    "\u21AE" \
    "\u21CD-\u21CF" \
    "\u2204" \
    "\u2209" \
    "\u220C" \
    "\u2224" \
    "\u2226" \
    "\u2241" \
    "\u2244" \
    "\u2247" \
    "\u2249" \
    "\u2260" \
    "\u2262" \
    "\u226D-\u2271" \
    "\u2274\u2275" \
    "\u2278\u2279" \
    "\u2280\u2281" \
    "\u2284\u2285" \
    "\u2288\u2289" \
    "\u22AC-\u22AF" \
    "\u22E0-\u22E3" \
    "\u22EA-\u22ED" \
    "\u2329\u232A" \
    "\u2ADC" \
    "\u304C" \
    "\u304E" \
    "\u3050" \
    "\u3052" \
    "\u3054" \
    "\u3056" \
    "\u3058" \
    "\u305A" \
    "\u305C" \
    "\u305E" \
    "\u3060" \
    "\u3062" \
    "\u3065" \
    "\u3067" \
    "\u3069" \
    "\u3070\u3071" \
    "\u3073\u3074" \
    "\u3076\u3077" \
    "\u3079\u307A" \
    "\u307C\u307D" \
    "\u3094" \
    "\u309E" \
    "\u30AC" \
    "\u30AE" \
    "\u30B0" \
    "\u30B2" \
    "\u30B4" \
    "\u30B6" \
    "\u30B8" \
    "\u30BA" \
    "\u30BC" \
    "\u30BE" \
    "\u30C0" \
    "\u30C2" \
    "\u30C5" \
    "\u30C7" \
    "\u30C9" \
    "\u30D0\u30D1" \
    "\u30D3\u30D4" \
    "\u30D6\u30D7" \
    "\u30D9\u30DA" \
    "\u30DC\u30DD" \
    "\u30F4" \
    "\u30F7-\u30FA" \
    "\u30FE" \
    "\uF900-\uFA0D" \
    "\uFA10" \
    "\uFA12" \
    "\uFA15-\uFA1E" \
    "\uFA20" \
    "\uFA22" \
    "\uFA25\uFA26" \
    "\uFA2A-\uFA6D" \
    "\uFA70-\uFAD9" \
    "\uFB1D" \
    "\uFB1F" \
    "\uFB2A-\uFB36" \
    "\uFB38-\uFB3C" \
    "\uFB3E" \
    "\uFB40\uFB41" \
    "\uFB43\uFB44" \
    "\uFB46-\uFB4E" \
    "\u{1109A}" \
    "\u{1109C}" \
    "\u{110AB}" \
    "\u{1112E}\u{1112F}" \
    "\u{1134B}\u{1134C}" \
    "\u{114BB}\u{114BC}" \
    "\u{114BE}" \
    "\u{115BA}\u{115BB}" \
    "\u{11938}" \
    "\u{1D15E}-\u{1D164}" \
    "\u{1D1BB}-\u{1D1C0}" \
    "\u{2F800}-\u{2FA1D}" \
    "]#{accents}*" \
    "|#{''  # characters that can be the result of a composition, except composition starters
    }" \
    "[<->" \
    "A-P" \
    "R-Z" \
    "a-p" \
    "r-z" \
    "\u00A8" \
    "\u00C6" \
    "\u00D8" \
    "\u00E6" \
    "\u00F8" \
    "\u017F" \
    "\u01B7" \
    "\u0292" \
    "\u0391" \
    "\u0395" \
    "\u0397" \
    "\u0399" \
    "\u039F" \
    "\u03A1" \
    "\u03A5" \
    "\u03A9" \
    "\u03B1" \
    "\u03B5" \
    "\u03B7" \
    "\u03B9" \
    "\u03BF" \
    "\u03C1" \
    "\u03C5" \
    "\u03C9" \
    "\u03D2" \
    "\u0406" \
    "\u0410" \
    "\u0413" \
    "\u0415-\u0418" \
    "\u041A" \
    "\u041E" \
    "\u0423" \
    "\u0427" \
    "\u042B" \
    "\u042D" \
    "\u0430" \
    "\u0433" \
    "\u0435-\u0438" \
    "\u043A" \
    "\u043E" \
    "\u0443" \
    "\u0447" \
    "\u044B" \
    "\u044D" \
    "\u0456" \
    "\u0474\u0475" \
    "\u04D8\u04D9" \
    "\u04E8\u04E9" \
    "\u0627" \
    "\u0648" \
    "\u064A" \
    "\u06C1" \
    "\u06D2" \
    "\u06D5" \
    "\u0928" \
    "\u0930" \
    "\u0933" \
    "\u09C7" \
    "\u0B47" \
    "\u0B92" \
    "\u0BC6\u0BC7" \
    "\u0C46" \
    "\u0CBF" \
    "\u0CC6" \
    "\u0D46\u0D47" \
    "\u0DD9" \
    "\u1025" \
    "\u1B05" \
    "\u1B07" \
    "\u1B09" \
    "\u1B0B" \
    "\u1B0D" \
    "\u1B11" \
    "\u1B3A" \
    "\u1B3C" \
    "\u1B3E\u1B3F" \
    "\u1B42" \
    "\u1FBF" \
    "\u1FFE" \
    "\u2190" \
    "\u2192" \
    "\u2194" \
    "\u21D0" \
    "\u21D2" \
    "\u21D4" \
    "\u2203" \
    "\u2208" \
    "\u220B" \
    "\u2223" \
    "\u2225" \
    "\u223C" \
    "\u2243" \
    "\u2245" \
    "\u2248" \
    "\u224D" \
    "\u2261" \
    "\u2264\u2265" \
    "\u2272\u2273" \
    "\u2276\u2277" \
    "\u227A-\u227D" \
    "\u2282\u2283" \
    "\u2286\u2287" \
    "\u2291\u2292" \
    "\u22A2" \
    "\u22A8\u22A9" \
    "\u22AB" \
    "\u22B2-\u22B5" \
    "\u3046" \
    "\u304B" \
    "\u304D" \
    "\u304F" \
    "\u3051" \
    "\u3053" \
    "\u3055" \
    "\u3057" \
    "\u3059" \
    "\u305B" \
    "\u305D" \
    "\u305F" \
    "\u3061" \
    "\u3064" \
    "\u3066" \
    "\u3068" \
    "\u306F" \
    "\u3072" \
    "\u3075" \
    "\u3078" \
    "\u307B" \
    "\u309D" \
    "\u30A6" \
    "\u30AB" \
    "\u30AD" \
    "\u30AF" \
    "\u30B1" \
    "\u30B3" \
    "\u30B5" \
    "\u30B7" \
    "\u30B9" \
    "\u30BB" \
    "\u30BD" \
    "\u30BF" \
    "\u30C1" \
    "\u30C4" \
    "\u30C6" \
    "\u30C8" \
    "\u30CF" \
    "\u30D2" \
    "\u30D5" \
    "\u30D8" \
    "\u30DB" \
    "\u30EF-\u30F2" \
    "\u30FD" \
    "\u{11099}" \
    "\u{1109B}" \
    "\u{110A5}" \
    "\u{11131}\u{11132}" \
    "\u{11347}" \
    "\u{114B9}" \
    "\u{115B8}\u{115B9}" \
    "\u{11935}" \
    "]?#{accents}+" \
    "|#{''  # precomposed Hangul syllables
    }" \
    "[\u{AC00}-\u{D7A4}]"
  REGEXP_C_STRING = "#{''  # composition exclusions
    }" \
    "[\u0340\u0341" \
    "\u0343\u0344" \
    "\u0374" \
    "\u037E" \
    "\u0387" \
    "\u0958-\u095F" \
    "\u09DC\u09DD" \
    "\u09DF" \
    "\u0A33" \
    "\u0A36" \
    "\u0A59-\u0A5B" \
    "\u0A5E" \
    "\u0B5C\u0B5D" \
    "\u0F43" \
    "\u0F4D" \
    "\u0F52" \
    "\u0F57" \
    "\u0F5C" \
    "\u0F69" \
    "\u0F73" \
    "\u0F75\u0F76" \
    "\u0F78" \
    "\u0F81" \
    "\u0F93" \
    "\u0F9D" \
    "\u0FA2" \
    "\u0FA7" \
    "\u0FAC" \
    "\u0FB9" \
    "\u1F71" \
    "\u1F73" \
    "\u1F75" \
    "\u1F77" \
    "\u1F79" \
    "\u1F7B" \
    "\u1F7D" \
    "\u1FBB" \
    "\u1FBE" \
    "\u1FC9" \
    "\u1FCB" \
    "\u1FD3" \
    "\u1FDB" \
    "\u1FE3" \
    "\u1FEB" \
    "\u1FEE\u1FEF" \
    "\u1FF9" \
    "\u1FFB" \
    "\u1FFD" \
    "\u2000\u2001" \
    "\u2126" \
    "\u212A\u212B" \
    "\u2329\u232A" \
    "\u2ADC" \
    "\uF900-\uFA0D" \
    "\uFA10" \
    "\uFA12" \
    "\uFA15-\uFA1E" \
    "\uFA20" \
    "\uFA22" \
    "\uFA25\uFA26" \
    "\uFA2A-\uFA6D" \
    "\uFA70-\uFAD9" \
    "\uFB1D" \
    "\uFB1F" \
    "\uFB2A-\uFB36" \
    "\uFB38-\uFB3C" \
    "\uFB3E" \
    "\uFB40\uFB41" \
    "\uFB43\uFB44" \
    "\uFB46-\uFB4E" \
    "\u{1D15E}-\u{1D164}" \
    "\u{1D1BB}-\u{1D1C0}" \
    "\u{2F800}-\u{2FA1D}" \
    "]#{accents}*" \
    "|#{''  # composition starters and characters that can be the result of a composition
    }" \
    "[<->" \
    "A-P" \
    "R-Z" \
    "a-p" \
    "r-z" \
    "\u00A8" \
    "\u00C0-\u00CF" \
    "\u00D1-\u00D6" \
    "\u00D8-\u00DD" \
    "\u00E0-\u00EF" \
    "\u00F1-\u00F6" \
    "\u00F8-\u00FD" \
    "\u00FF-\u010F" \
    "\u0112-\u0125" \
    "\u0128-\u0130" \
    "\u0134-\u0137" \
    "\u0139-\u013E" \
    "\u0143-\u0148" \
    "\u014C-\u0151" \
    "\u0154-\u0165" \
    "\u0168-\u017F" \
    "\u01A0\u01A1" \
    "\u01AF\u01B0" \
    "\u01B7" \
    "\u01CD-\u01DC" \
    "\u01DE-\u01E3" \
    "\u01E6-\u01F0" \
    "\u01F4\u01F5" \
    "\u01F8-\u021B" \
    "\u021E\u021F" \
    "\u0226-\u0233" \
    "\u0292" \
    "\u0385\u0386" \
    "\u0388-\u038A" \
    "\u038C" \
    "\u038E-\u0391" \
    "\u0395" \
    "\u0397" \
    "\u0399" \
    "\u039F" \
    "\u03A1" \
    "\u03A5" \
    "\u03A9-\u03B1" \
    "\u03B5" \
    "\u03B7" \
    "\u03B9" \
    "\u03BF" \
    "\u03C1" \
    "\u03C5" \
    "\u03C9-\u03CE" \
    "\u03D2-\u03D4" \
    "\u0400\u0401" \
    "\u0403" \
    "\u0406\u0407" \
    "\u040C-\u040E" \
    "\u0410" \
    "\u0413" \
    "\u0415-\u041A" \
    "\u041E" \
    "\u0423" \
    "\u0427" \
    "\u042B" \
    "\u042D" \
    "\u0430" \
    "\u0433" \
    "\u0435-\u043A" \
    "\u043E" \
    "\u0443" \
    "\u0447" \
    "\u044B" \
    "\u044D" \
    "\u0450\u0451" \
    "\u0453" \
    "\u0456\u0457" \
    "\u045C-\u045E" \
    "\u0474-\u0477" \
    "\u04C1\u04C2" \
    "\u04D0-\u04D3" \
    "\u04D6-\u04DF" \
    "\u04E2-\u04F5" \
    "\u04F8\u04F9" \
    "\u0622-\u0627" \
    "\u0648" \
    "\u064A" \
    "\u06C0-\u06C2" \
    "\u06D2\u06D3" \
    "\u06D5" \
    "\u0928\u0929" \
    "\u0930\u0931" \
    "\u0933\u0934" \
    "\u09C7" \
    "\u09CB\u09CC" \
    "\u0B47\u0B48" \
    "\u0B4B\u0B4C" \
    "\u0B92" \
    "\u0B94" \
    "\u0BC6\u0BC7" \
    "\u0BCA-\u0BCC" \
    "\u0C46" \
    "\u0C48" \
    "\u0CBF\u0CC0" \
    "\u0CC6-\u0CC8" \
    "\u0CCA\u0CCB" \
    "\u0D46\u0D47" \
    "\u0D4A-\u0D4C" \
    "\u0DD9\u0DDA" \
    "\u0DDC-\u0DDE" \
    "\u1025\u1026" \
    "\u1B05-\u1B0E" \
    "\u1B11\u1B12" \
    "\u1B3A-\u1B43" \
    "\u1E00-\u1E99" \
    "\u1E9B" \
    "\u1EA0-\u1EF9" \
    "\u1F00-\u1F15" \
    "\u1F18-\u1F1D" \
    "\u1F20-\u1F45" \
    "\u1F48-\u1F4D" \
    "\u1F50-\u1F57" \
    "\u1F59" \
    "\u1F5B" \
    "\u1F5D" \
    "\u1F5F-\u1F70" \
    "\u1F72" \
    "\u1F74" \
    "\u1F76" \
    "\u1F78" \
    "\u1F7A" \
    "\u1F7C" \
    "\u1F80-\u1FB4" \
    "\u1FB6-\u1FBA" \
    "\u1FBC" \
    "\u1FBF" \
    "\u1FC1-\u1FC4" \
    "\u1FC6-\u1FC8" \
    "\u1FCA" \
    "\u1FCC-\u1FD2" \
    "\u1FD6-\u1FDA" \
    "\u1FDD-\u1FE2" \
    "\u1FE4-\u1FEA" \
    "\u1FEC\u1FED" \
    "\u1FF2-\u1FF4" \
    "\u1FF6-\u1FF8" \
    "\u1FFA" \
    "\u1FFC" \
    "\u1FFE" \
    "\u2190" \
    "\u2192" \
    "\u2194" \
    "\u219A\u219B" \
    "\u21AE" \
    "\u21CD-\u21D0" \
    "\u21D2" \
    "\u21D4" \
    "\u2203\u2204" \
    "\u2208\u2209" \
    "\u220B\u220C" \
    "\u2223-\u2226" \
    "\u223C" \
    "\u2241" \
    "\u2243-\u2245" \
    "\u2247-\u2249" \
    "\u224D" \
    "\u2260-\u2262" \
    "\u2264\u2265" \
    "\u226D-\u227D" \
    "\u2280-\u2289" \
    "\u2291\u2292" \
    "\u22A2" \
    "\u22A8\u22A9" \
    "\u22AB-\u22AF" \
    "\u22B2-\u22B5" \
    "\u22E0-\u22E3" \
    "\u22EA-\u22ED" \
    "\u3046" \
    "\u304B-\u3062" \
    "\u3064-\u3069" \
    "\u306F-\u307D" \
    "\u3094" \
    "\u309D\u309E" \
    "\u30A6" \
    "\u30AB-\u30C2" \
    "\u30C4-\u30C9" \
    "\u30CF-\u30DD" \
    "\u30EF-\u30F2" \
    "\u30F4" \
    "\u30F7-\u30FA" \
    "\u30FD\u30FE" \
    "\u{11099}-\u{1109C}" \
    "\u{110A5}" \
    "\u{110AB}" \
    "\u{1112E}\u{1112F}" \
    "\u{11131}\u{11132}" \
    "\u{11347}" \
    "\u{1134B}\u{1134C}" \
    "\u{114B9}" \
    "\u{114BB}\u{114BC}" \
    "\u{114BE}" \
    "\u{115B8}-\u{115BB}" \
    "\u{11935}" \
    "\u{11938}" \
    "]?#{accents}+" \
    "|#{''  # Hangul syllables with separate trailer
    }" \
    "[\uAC00" \
    "\uAC1C" \
    "\uAC38" \
    "\uAC54" \
    "\uAC70" \
    "\uAC8C" \
    "\uACA8" \
    "\uACC4" \
    "\uACE0" \
    "\uACFC" \
    "\uAD18" \
    "\uAD34" \
    "\uAD50" \
    "\uAD6C" \
    "\uAD88" \
    "\uADA4" \
    "\uADC0" \
    "\uADDC" \
    "\uADF8" \
    "\uAE14" \
    "\uAE30" \
    "\uAE4C" \
    "\uAE68" \
    "\uAE84" \
    "\uAEA0" \
    "\uAEBC" \
    "\uAED8" \
    "\uAEF4" \
    "\uAF10" \
    "\uAF2C" \
    "\uAF48" \
    "\uAF64" \
    "\uAF80" \
    "\uAF9C" \
    "\uAFB8" \
    "\uAFD4" \
    "\uAFF0" \
    "\uB00C" \
    "\uB028" \
    "\uB044" \
    "\uB060" \
    "\uB07C" \
    "\uB098" \
    "\uB0B4" \
    "\uB0D0" \
    "\uB0EC" \
    "\uB108" \
    "\uB124" \
    "\uB140" \
    "\uB15C" \
    "\uB178" \
    "\uB194" \
    "\uB1B0" \
    "\uB1CC" \
    "\uB1E8" \
    "\uB204" \
    "\uB220" \
    "\uB23C" \
    "\uB258" \
    "\uB274" \
    "\uB290" \
    "\uB2AC" \
    "\uB2C8" \
    "\uB2E4" \
    "\uB300" \
    "\uB31C" \
    "\uB338" \
    "\uB354" \
    "\uB370" \
    "\uB38C" \
    "\uB3A8" \
    "\uB3C4" \
    "\uB3E0" \
    "\uB3FC" \
    "\uB418" \
    "\uB434" \
    "\uB450" \
    "\uB46C" \
    "\uB488" \
    "\uB4A4" \
    "\uB4C0" \
    "\uB4DC" \
    "\uB4F8" \
    "\uB514" \
    "\uB530" \
    "\uB54C" \
    "\uB568" \
    "\uB584" \
    "\uB5A0" \
    "\uB5BC" \
    "\uB5D8" \
    "\uB5F4" \
    "\uB610" \
    "\uB62C" \
    "\uB648" \
    "\uB664" \
    "\uB680" \
    "\uB69C" \
    "\uB6B8" \
    "\uB6D4" \
    "\uB6F0" \
    "\uB70C" \
    "\uB728" \
    "\uB744" \
    "\uB760" \
    "\uB77C" \
    "\uB798" \
    "\uB7B4" \
    "\uB7D0" \
    "\uB7EC" \
    "\uB808" \
    "\uB824" \
    "\uB840" \
    "\uB85C" \
    "\uB878" \
    "\uB894" \
    "\uB8B0" \
    "\uB8CC" \
    "\uB8E8" \
    "\uB904" \
    "\uB920" \
    "\uB93C" \
    "\uB958" \
    "\uB974" \
    "\uB990" \
    "\uB9AC" \
    "\uB9C8" \
    "\uB9E4" \
    "\uBA00" \
    "\uBA1C" \
    "\uBA38" \
    "\uBA54" \
    "\uBA70" \
    "\uBA8C" \
    "\uBAA8" \
    "\uBAC4" \
    "\uBAE0" \
    "\uBAFC" \
    "\uBB18" \
    "\uBB34" \
    "\uBB50" \
    "\uBB6C" \
    "\uBB88" \
    "\uBBA4" \
    "\uBBC0" \
    "\uBBDC" \
    "\uBBF8" \
    "\uBC14" \
    "\uBC30" \
    "\uBC4C" \
    "\uBC68" \
    "\uBC84" \
    "\uBCA0" \
    "\uBCBC" \
    "\uBCD8" \
    "\uBCF4" \
    "\uBD10" \
    "\uBD2C" \
    "\uBD48" \
    "\uBD64" \
    "\uBD80" \
    "\uBD9C" \
    "\uBDB8" \
    "\uBDD4" \
    "\uBDF0" \
    "\uBE0C" \
    "\uBE28" \
    "\uBE44" \
    "\uBE60" \
    "\uBE7C" \
    "\uBE98" \
    "\uBEB4" \
    "\uBED0" \
    "\uBEEC" \
    "\uBF08" \
    "\uBF24" \
    "\uBF40" \
    "\uBF5C" \
    "\uBF78" \
    "\uBF94" \
    "\uBFB0" \
    "\uBFCC" \
    "\uBFE8" \
    "\uC004" \
    "\uC020" \
    "\uC03C" \
    "\uC058" \
    "\uC074" \
    "\uC090" \
    "\uC0AC" \
    "\uC0C8" \
    "\uC0E4" \
    "\uC100" \
    "\uC11C" \
    "\uC138" \
    "\uC154" \
    "\uC170" \
    "\uC18C" \
    "\uC1A8" \
    "\uC1C4" \
    "\uC1E0" \
    "\uC1FC" \
    "\uC218" \
    "\uC234" \
    "\uC250" \
    "\uC26C" \
    "\uC288" \
    "\uC2A4" \
    "\uC2C0" \
    "\uC2DC" \
    "\uC2F8" \
    "\uC314" \
    "\uC330" \
    "\uC34C" \
    "\uC368" \
    "\uC384" \
    "\uC3A0" \
    "\uC3BC" \
    "\uC3D8" \
    "\uC3F4" \
    "\uC410" \
    "\uC42C" \
    "\uC448" \
    "\uC464" \
    "\uC480" \
    "\uC49C" \
    "\uC4B8" \
    "\uC4D4" \
    "\uC4F0" \
    "\uC50C" \
    "\uC528" \
    "\uC544" \
    "\uC560" \
    "\uC57C" \
    "\uC598" \
    "\uC5B4" \
    "\uC5D0" \
    "\uC5EC" \
    "\uC608" \
    "\uC624" \
    "\uC640" \
    "\uC65C" \
    "\uC678" \
    "\uC694" \
    "\uC6B0" \
    "\uC6CC" \
    "\uC6E8" \
    "\uC704" \
    "\uC720" \
    "\uC73C" \
    "\uC758" \
    "\uC774" \
    "\uC790" \
    "\uC7AC" \
    "\uC7C8" \
    "\uC7E4" \
    "\uC800" \
    "\uC81C" \
    "\uC838" \
    "\uC854" \
    "\uC870" \
    "\uC88C" \
    "\uC8A8" \
    "\uC8C4" \
    "\uC8E0" \
    "\uC8FC" \
    "\uC918" \
    "\uC934" \
    "\uC950" \
    "\uC96C" \
    "\uC988" \
    "\uC9A4" \
    "\uC9C0" \
    "\uC9DC" \
    "\uC9F8" \
    "\uCA14" \
    "\uCA30" \
    "\uCA4C" \
    "\uCA68" \
    "\uCA84" \
    "\uCAA0" \
    "\uCABC" \
    "\uCAD8" \
    "\uCAF4" \
    "\uCB10" \
    "\uCB2C" \
    "\uCB48" \
    "\uCB64" \
    "\uCB80" \
    "\uCB9C" \
    "\uCBB8" \
    "\uCBD4" \
    "\uCBF0" \
    "\uCC0C" \
    "\uCC28" \
    "\uCC44" \
    "\uCC60" \
    "\uCC7C" \
    "\uCC98" \
    "\uCCB4" \
    "\uCCD0" \
    "\uCCEC" \
    "\uCD08" \
    "\uCD24" \
    "\uCD40" \
    "\uCD5C" \
    "\uCD78" \
    "\uCD94" \
    "\uCDB0" \
    "\uCDCC" \
    "\uCDE8" \
    "\uCE04" \
    "\uCE20" \
    "\uCE3C" \
    "\uCE58" \
    "\uCE74" \
    "\uCE90" \
    "\uCEAC" \
    "\uCEC8" \
    "\uCEE4" \
    "\uCF00" \
    "\uCF1C" \
    "\uCF38" \
    "\uCF54" \
    "\uCF70" \
    "\uCF8C" \
    "\uCFA8" \
    "\uCFC4" \
    "\uCFE0" \
    "\uCFFC" \
    "\uD018" \
    "\uD034" \
    "\uD050" \
    "\uD06C" \
    "\uD088" \
    "\uD0A4" \
    "\uD0C0" \
    "\uD0DC" \
    "\uD0F8" \
    "\uD114" \
    "\uD130" \
    "\uD14C" \
    "\uD168" \
    "\uD184" \
    "\uD1A0" \
    "\uD1BC" \
    "\uD1D8" \
    "\uD1F4" \
    "\uD210" \
    "\uD22C" \
    "\uD248" \
    "\uD264" \
    "\uD280" \
    "\uD29C" \
    "\uD2B8" \
    "\uD2D4" \
    "\uD2F0" \
    "\uD30C" \
    "\uD328" \
    "\uD344" \
    "\uD360" \
    "\uD37C" \
    "\uD398" \
    "\uD3B4" \
    "\uD3D0" \
    "\uD3EC" \
    "\uD408" \
    "\uD424" \
    "\uD440" \
    "\uD45C" \
    "\uD478" \
    "\uD494" \
    "\uD4B0" \
    "\uD4CC" \
    "\uD4E8" \
    "\uD504" \
    "\uD520" \
    "\uD53C" \
    "\uD558" \
    "\uD574" \
    "\uD590" \
    "\uD5AC" \
    "\uD5C8" \
    "\uD5E4" \
    "\uD600" \
    "\uD61C" \
    "\uD638" \
    "\uD654" \
    "\uD670" \
    "\uD68C" \
    "\uD6A8" \
    "\uD6C4" \
    "\uD6E0" \
    "\uD6FC" \
    "\uD718" \
    "\uD734" \
    "\uD750" \
    "\uD76C" \
    "\uD788" \
    "][\u11A8-\u11C2]" \
    "|#{''  # decomposed Hangul syllables
    }" \
    "[\u1100-\u1112][\u1161-\u1175][\u11A8-\u11C2]?"
  REGEXP_K_STRING = "" \
    "[\u00A0" \
    "\u00A8" \
    "\u00AA" \
    "\u00AF" \
    "\u00B2-\u00B5" \
    "\u00B8-\u00BA" \
    "\u00BC-\u00BE" \
    "\u0132\u0133" \
    "\u013F\u0140" \
    "\u0149" \
    "\u017F" \
    "\u01C4-\u01CC" \
    "\u01F1-\u01F3" \
    "\u02B0-\u02B8" \
    "\u02D8-\u02DD" \
    "\u02E0-\u02E4" \
    "\u037A" \
    "\u0384\u0385" \
    "\u03D0-\u03D6" \
    "\u03F0-\u03F2" \
    "\u03F4\u03F5" \
    "\u03F9" \
    "\u0587" \
    "\u0675-\u0678" \
    "\u0E33" \
    "\u0EB3" \
    "\u0EDC\u0EDD" \
    "\u0F0C" \
    "\u0F77" \
    "\u0F79" \
    "\u10FC" \
    "\u1D2C-\u1D2E" \
    "\u1D30-\u1D3A" \
    "\u1D3C-\u1D4D" \
    "\u1D4F-\u1D6A" \
    "\u1D78" \
    "\u1D9B-\u1DBF" \
    "\u1E9A\u1E9B" \
    "\u1FBD" \
    "\u1FBF-\u1FC1" \
    "\u1FCD-\u1FCF" \
    "\u1FDD-\u1FDF" \
    "\u1FED\u1FEE" \
    "\u1FFD\u1FFE" \
    "\u2000-\u200A" \
    "\u2011" \
    "\u2017" \
    "\u2024-\u2026" \
    "\u202F" \
    "\u2033\u2034" \
    "\u2036\u2037" \
    "\u203C" \
    "\u203E" \
    "\u2047-\u2049" \
    "\u2057" \
    "\u205F" \
    "\u2070\u2071" \
    "\u2074-\u208E" \
    "\u2090-\u209C" \
    "\u20A8" \
    "\u2100-\u2103" \
    "\u2105-\u2107" \
    "\u2109-\u2113" \
    "\u2115\u2116" \
    "\u2119-\u211D" \
    "\u2120-\u2122" \
    "\u2124" \
    "\u2128" \
    "\u212C\u212D" \
    "\u212F-\u2131" \
    "\u2133-\u2139" \
    "\u213B-\u2140" \
    "\u2145-\u2149" \
    "\u2150-\u217F" \
    "\u2189" \
    "\u222C\u222D" \
    "\u222F\u2230" \
    "\u2460-\u24EA" \
    "\u2A0C" \
    "\u2A74-\u2A76" \
    "\u2C7C\u2C7D" \
    "\u2D6F" \
    "\u2E9F" \
    "\u2EF3" \
    "\u2F00-\u2FD5" \
    "\u3000" \
    "\u3036" \
    "\u3038-\u303A" \
    "\u309B\u309C" \
    "\u309F" \
    "\u30FF" \
    "\u3131-\u318E" \
    "\u3192-\u319F" \
    "\u3200-\u321E" \
    "\u3220-\u3247" \
    "\u3250-\u327E" \
    "\u3280-\u33FF" \
    "\uA69C\uA69D" \
    "\uA770" \
    "\uA7F8\uA7F9" \
    "\uAB5C-\uAB5F" \
    "\uAB69" \
    "\uFB00-\uFB06" \
    "\uFB13-\uFB17" \
    "\uFB20-\uFB29" \
    "\uFB4F-\uFBB1" \
    "\uFBD3-\uFD3D" \
    "\uFD50-\uFD8F" \
    "\uFD92-\uFDC7" \
    "\uFDF0-\uFDFC" \
    "\uFE10-\uFE19" \
    "\uFE30-\uFE44" \
    "\uFE47-\uFE52" \
    "\uFE54-\uFE66" \
    "\uFE68-\uFE6B" \
    "\uFE70-\uFE72" \
    "\uFE74" \
    "\uFE76-\uFEFC" \
    "\uFF01-\uFFBE" \
    "\uFFC2-\uFFC7" \
    "\uFFCA-\uFFCF" \
    "\uFFD2-\uFFD7" \
    "\uFFDA-\uFFDC" \
    "\uFFE0-\uFFE6" \
    "\uFFE8-\uFFEE" \
    "\u{1D400}-\u{1D454}" \
    "\u{1D456}-\u{1D49C}" \
    "\u{1D49E}\u{1D49F}" \
    "\u{1D4A2}" \
    "\u{1D4A5}\u{1D4A6}" \
    "\u{1D4A9}-\u{1D4AC}" \
    "\u{1D4AE}-\u{1D4B9}" \
    "\u{1D4BB}" \
    "\u{1D4BD}-\u{1D4C3}" \
    "\u{1D4C5}-\u{1D505}" \
    "\u{1D507}-\u{1D50A}" \
    "\u{1D50D}-\u{1D514}" \
    "\u{1D516}-\u{1D51C}" \
    "\u{1D51E}-\u{1D539}" \
    "\u{1D53B}-\u{1D53E}" \
    "\u{1D540}-\u{1D544}" \
    "\u{1D546}" \
    "\u{1D54A}-\u{1D550}" \
    "\u{1D552}-\u{1D6A5}" \
    "\u{1D6A8}-\u{1D7CB}" \
    "\u{1D7CE}-\u{1D7FF}" \
    "\u{1EE00}-\u{1EE03}" \
    "\u{1EE05}-\u{1EE1F}" \
    "\u{1EE21}\u{1EE22}" \
    "\u{1EE24}" \
    "\u{1EE27}" \
    "\u{1EE29}-\u{1EE32}" \
    "\u{1EE34}-\u{1EE37}" \
    "\u{1EE39}" \
    "\u{1EE3B}" \
    "\u{1EE42}" \
    "\u{1EE47}" \
    "\u{1EE49}" \
    "\u{1EE4B}" \
    "\u{1EE4D}-\u{1EE4F}" \
    "\u{1EE51}\u{1EE52}" \
    "\u{1EE54}" \
    "\u{1EE57}" \
    "\u{1EE59}" \
    "\u{1EE5B}" \
    "\u{1EE5D}" \
    "\u{1EE5F}" \
    "\u{1EE61}\u{1EE62}" \
    "\u{1EE64}" \
    "\u{1EE67}-\u{1EE6A}" \
    "\u{1EE6C}-\u{1EE72}" \
    "\u{1EE74}-\u{1EE77}" \
    "\u{1EE79}-\u{1EE7C}" \
    "\u{1EE7E}" \
    "\u{1EE80}-\u{1EE89}" \
    "\u{1EE8B}-\u{1EE9B}" \
    "\u{1EEA1}-\u{1EEA3}" \
    "\u{1EEA5}-\u{1EEA9}" \
    "\u{1EEAB}-\u{1EEBB}" \
    "\u{1F100}-\u{1F10A}" \
    "\u{1F110}-\u{1F12E}" \
    "\u{1F130}-\u{1F14F}" \
    "\u{1F16A}-\u{1F16C}" \
    "\u{1F190}" \
    "\u{1F200}-\u{1F202}" \
    "\u{1F210}-\u{1F23B}" \
    "\u{1F240}-\u{1F248}" \
    "\u{1F250}\u{1F251}" \
    "\u{1FBF0}-\u{1FBF9}" \
    "]"

  class_table = {
    "\u0300"=>230,
    "\u0301"=>230,
    "\u0302"=>230,
    "\u0303"=>230,
    "\u0304"=>230,
    "\u0305"=>230,
    "\u0306"=>230,
    "\u0307"=>230,
    "\u0308"=>230,
    "\u0309"=>230,
    "\u030A"=>230,
    "\u030B"=>230,
    "\u030C"=>230,
    "\u030D"=>230,
    "\u030E"=>230,
    "\u030F"=>230,
    "\u0310"=>230,
    "\u0311"=>230,
    "\u0312"=>230,
    "\u0313"=>230,
    "\u0314"=>230,
    "\u0315"=>232,
    "\u0316"=>220,
    "\u0317"=>220,
    "\u0318"=>220,
    "\u0319"=>220,
    "\u031A"=>232,
    "\u031B"=>216,
    "\u031C"=>220,
    "\u031D"=>220,
    "\u031E"=>220,
    "\u031F"=>220,
    "\u0320"=>220,
    "\u0321"=>202,
    "\u0322"=>202,
    "\u0323"=>220,
    "\u0324"=>220,
    "\u0325"=>220,
    "\u0326"=>220,
    "\u0327"=>202,
    "\u0328"=>202,
    "\u0329"=>220,
    "\u032A"=>220,
    "\u032B"=>220,
    "\u032C"=>220,
    "\u032D"=>220,
    "\u032E"=>220,
    "\u032F"=>220,
    "\u0330"=>220,
    "\u0331"=>220,
    "\u0332"=>220,
    "\u0333"=>220,
    "\u0334"=>1,
    "\u0335"=>1,
    "\u0336"=>1,
    "\u0337"=>1,
    "\u0338"=>1,
    "\u0339"=>220,
    "\u033A"=>220,
    "\u033B"=>220,
    "\u033C"=>220,
    "\u033D"=>230,
    "\u033E"=>230,
    "\u033F"=>230,
    "\u0340"=>230,
    "\u0341"=>230,
    "\u0342"=>230,
    "\u0343"=>230,
    "\u0344"=>230,
    "\u0345"=>240,
    "\u0346"=>230,
    "\u0347"=>220,
    "\u0348"=>220,
    "\u0349"=>220,
    "\u034A"=>230,
    "\u034B"=>230,
    "\u034C"=>230,
    "\u034D"=>220,
    "\u034E"=>220,
    "\u0350"=>230,
    "\u0351"=>230,
    "\u0352"=>230,
    "\u0353"=>220,
    "\u0354"=>220,
    "\u0355"=>220,
    "\u0356"=>220,
    "\u0357"=>230,
    "\u0358"=>232,
    "\u0359"=>220,
    "\u035A"=>220,
    "\u035B"=>230,
    "\u035C"=>233,
    "\u035D"=>234,
    "\u035E"=>234,
    "\u035F"=>233,
    "\u0360"=>234,
    "\u0361"=>234,
    "\u0362"=>233,
    "\u0363"=>230,
    "\u0364"=>230,
    "\u0365"=>230,
    "\u0366"=>230,
    "\u0367"=>230,
    "\u0368"=>230,
    "\u0369"=>230,
    "\u036A"=>230,
    "\u036B"=>230,
    "\u036C"=>230,
    "\u036D"=>230,
    "\u036E"=>230,
    "\u036F"=>230,
    "\u0483"=>230,
    "\u0484"=>230,
    "\u0485"=>230,
    "\u0486"=>230,
    "\u0487"=>230,
    "\u0591"=>220,
    "\u0592"=>230,
    "\u0593"=>230,
    "\u0594"=>230,
    "\u0595"=>230,
    "\u0596"=>220,
    "\u0597"=>230,
    "\u0598"=>230,
    "\u0599"=>230,
    "\u059A"=>222,
    "\u059B"=>220,
    "\u059C"=>230,
    "\u059D"=>230,
    "\u059E"=>230,
    "\u059F"=>230,
    "\u05A0"=>230,
    "\u05A1"=>230,
    "\u05A2"=>220,
    "\u05A3"=>220,
    "\u05A4"=>220,
    "\u05A5"=>220,
    "\u05A6"=>220,
    "\u05A7"=>220,
    "\u05A8"=>230,
    "\u05A9"=>230,
    "\u05AA"=>220,
    "\u05AB"=>230,
    "\u05AC"=>230,
    "\u05AD"=>222,
    "\u05AE"=>228,
    "\u05AF"=>230,
    "\u05B0"=>10,
    "\u05B1"=>11,
    "\u05B2"=>12,
    "\u05B3"=>13,
    "\u05B4"=>14,
    "\u05B5"=>15,
    "\u05B6"=>16,
    "\u05B7"=>17,
    "\u05B8"=>18,
    "\u05B9"=>19,
    "\u05BA"=>19,
    "\u05BB"=>20,
    "\u05BC"=>21,
    "\u05BD"=>22,
    "\u05BF"=>23,
    "\u05C1"=>24,
    "\u05C2"=>25,
    "\u05C4"=>230,
    "\u05C5"=>220,
    "\u05C7"=>18,
    "\u0610"=>230,
    "\u0611"=>230,
    "\u0612"=>230,
    "\u0613"=>230,
    "\u0614"=>230,
    "\u0615"=>230,
    "\u0616"=>230,
    "\u0617"=>230,
    "\u0618"=>30,
    "\u0619"=>31,
    "\u061A"=>32,
    "\u064B"=>27,
    "\u064C"=>28,
    "\u064D"=>29,
    "\u064E"=>30,
    "\u064F"=>31,
    "\u0650"=>32,
    "\u0651"=>33,
    "\u0652"=>34,
    "\u0653"=>230,
    "\u0654"=>230,
    "\u0655"=>220,
    "\u0656"=>220,
    "\u0657"=>230,
    "\u0658"=>230,
    "\u0659"=>230,
    "\u065A"=>230,
    "\u065B"=>230,
    "\u065C"=>220,
    "\u065D"=>230,
    "\u065E"=>230,
    "\u065F"=>220,
    "\u0670"=>35,
    "\u06D6"=>230,
    "\u06D7"=>230,
    "\u06D8"=>230,
    "\u06D9"=>230,
    "\u06DA"=>230,
    "\u06DB"=>230,
    "\u06DC"=>230,
    "\u06DF"=>230,
    "\u06E0"=>230,
    "\u06E1"=>230,
    "\u06E2"=>230,
    "\u06E3"=>220,
    "\u06E4"=>230,
    "\u06E7"=>230,
    "\u06E8"=>230,
    "\u06EA"=>220,
    "\u06EB"=>230,
    "\u06EC"=>230,
    "\u06ED"=>220,
    "\u0711"=>36,
    "\u0730"=>230,
    "\u0731"=>220,
    "\u0732"=>230,
    "\u0733"=>230,
    "\u0734"=>220,
    "\u0735"=>230,
    "\u0736"=>230,
    "\u0737"=>220,
    "\u0738"=>220,
    "\u0739"=>220,
    "\u073A"=>230,
    "\u073B"=>220,
    "\u073C"=>220,
    "\u073D"=>230,
    "\u073E"=>220,
    "\u073F"=>230,
    "\u0740"=>230,
    "\u0741"=>230,
    "\u0742"=>220,
    "\u0743"=>230,
    "\u0744"=>220,
    "\u0745"=>230,
    "\u0746"=>220,
    "\u0747"=>230,
    "\u0748"=>220,
    "\u0749"=>230,
    "\u074A"=>230,
    "\u07EB"=>230,
    "\u07EC"=>230,
    "\u07ED"=>230,
    "\u07EE"=>230,
    "\u07EF"=>230,
    "\u07F0"=>230,
    "\u07F1"=>230,
    "\u07F2"=>220,
    "\u07F3"=>230,
    "\u07FD"=>220,
    "\u0816"=>230,
    "\u0817"=>230,
    "\u0818"=>230,
    "\u0819"=>230,
    "\u081B"=>230,
    "\u081C"=>230,
    "\u081D"=>230,
    "\u081E"=>230,
    "\u081F"=>230,
    "\u0820"=>230,
    "\u0821"=>230,
    "\u0822"=>230,
    "\u0823"=>230,
    "\u0825"=>230,
    "\u0826"=>230,
    "\u0827"=>230,
    "\u0829"=>230,
    "\u082A"=>230,
    "\u082B"=>230,
    "\u082C"=>230,
    "\u082D"=>230,
    "\u0859"=>220,
    "\u085A"=>220,
    "\u085B"=>220,
    "\u08D3"=>220,
    "\u08D4"=>230,
    "\u08D5"=>230,
    "\u08D6"=>230,
    "\u08D7"=>230,
    "\u08D8"=>230,
    "\u08D9"=>230,
    "\u08DA"=>230,
    "\u08DB"=>230,
    "\u08DC"=>230,
    "\u08DD"=>230,
    "\u08DE"=>230,
    "\u08DF"=>230,
    "\u08E0"=>230,
    "\u08E1"=>230,
    "\u08E3"=>220,
    "\u08E4"=>230,
    "\u08E5"=>230,
    "\u08E6"=>220,
    "\u08E7"=>230,
    "\u08E8"=>230,
    "\u08E9"=>220,
    "\u08EA"=>230,
    "\u08EB"=>230,
    "\u08EC"=>230,
    "\u08ED"=>220,
    "\u08EE"=>220,
    "\u08EF"=>220,
    "\u08F0"=>27,
    "\u08F1"=>28,
    "\u08F2"=>29,
    "\u08F3"=>230,
    "\u08F4"=>230,
    "\u08F5"=>230,
    "\u08F6"=>220,
    "\u08F7"=>230,
    "\u08F8"=>230,
    "\u08F9"=>220,
    "\u08FA"=>220,
    "\u08FB"=>230,
    "\u08FC"=>230,
    "\u08FD"=>230,
    "\u08FE"=>230,
    "\u08FF"=>230,
    "\u093C"=>7,
    "\u094D"=>9,
    "\u0951"=>230,
    "\u0952"=>220,
    "\u0953"=>230,
    "\u0954"=>230,
    "\u09BC"=>7,
    "\u09CD"=>9,
    "\u09FE"=>230,
    "\u0A3C"=>7,
    "\u0A4D"=>9,
    "\u0ABC"=>7,
    "\u0ACD"=>9,
    "\u0B3C"=>7,
    "\u0B4D"=>9,
    "\u0BCD"=>9,
    "\u0C4D"=>9,
    "\u0C55"=>84,
    "\u0C56"=>91,
    "\u0CBC"=>7,
    "\u0CCD"=>9,
    "\u0D3B"=>9,
    "\u0D3C"=>9,
    "\u0D4D"=>9,
    "\u0DCA"=>9,
    "\u0E38"=>103,
    "\u0E39"=>103,
    "\u0E3A"=>9,
    "\u0E48"=>107,
    "\u0E49"=>107,
    "\u0E4A"=>107,
    "\u0E4B"=>107,
    "\u0EB8"=>118,
    "\u0EB9"=>118,
    "\u0EBA"=>9,
    "\u0EC8"=>122,
    "\u0EC9"=>122,
    "\u0ECA"=>122,
    "\u0ECB"=>122,
    "\u0F18"=>220,
    "\u0F19"=>220,
    "\u0F35"=>220,
    "\u0F37"=>220,
    "\u0F39"=>216,
    "\u0F71"=>129,
    "\u0F72"=>130,
    "\u0F74"=>132,
    "\u0F7A"=>130,
    "\u0F7B"=>130,
    "\u0F7C"=>130,
    "\u0F7D"=>130,
    "\u0F80"=>130,
    "\u0F82"=>230,
    "\u0F83"=>230,
    "\u0F84"=>9,
    "\u0F86"=>230,
    "\u0F87"=>230,
    "\u0FC6"=>220,
    "\u1037"=>7,
    "\u1039"=>9,
    "\u103A"=>9,
    "\u108D"=>220,
    "\u135D"=>230,
    "\u135E"=>230,
    "\u135F"=>230,
    "\u1714"=>9,
    "\u1734"=>9,
    "\u17D2"=>9,
    "\u17DD"=>230,
    "\u18A9"=>228,
    "\u1939"=>222,
    "\u193A"=>230,
    "\u193B"=>220,
    "\u1A17"=>230,
    "\u1A18"=>220,
    "\u1A60"=>9,
    "\u1A75"=>230,
    "\u1A76"=>230,
    "\u1A77"=>230,
    "\u1A78"=>230,
    "\u1A79"=>230,
    "\u1A7A"=>230,
    "\u1A7B"=>230,
    "\u1A7C"=>230,
    "\u1A7F"=>220,
    "\u1AB0"=>230,
    "\u1AB1"=>230,
    "\u1AB2"=>230,
    "\u1AB3"=>230,
    "\u1AB4"=>230,
    "\u1AB5"=>220,
    "\u1AB6"=>220,
    "\u1AB7"=>220,
    "\u1AB8"=>220,
    "\u1AB9"=>220,
    "\u1ABA"=>220,
    "\u1ABB"=>230,
    "\u1ABC"=>230,
    "\u1ABD"=>220,
    "\u1ABF"=>220,
    "\u1AC0"=>220,
    "\u1B34"=>7,
    "\u1B44"=>9,
    "\u1B6B"=>230,
    "\u1B6C"=>220,
    "\u1B6D"=>230,
    "\u1B6E"=>230,
    "\u1B6F"=>230,
    "\u1B70"=>230,
    "\u1B71"=>230,
    "\u1B72"=>230,
    "\u1B73"=>230,
    "\u1BAA"=>9,
    "\u1BAB"=>9,
    "\u1BE6"=>7,
    "\u1BF2"=>9,
    "\u1BF3"=>9,
    "\u1C37"=>7,
    "\u1CD0"=>230,
    "\u1CD1"=>230,
    "\u1CD2"=>230,
    "\u1CD4"=>1,
    "\u1CD5"=>220,
    "\u1CD6"=>220,
    "\u1CD7"=>220,
    "\u1CD8"=>220,
    "\u1CD9"=>220,
    "\u1CDA"=>230,
    "\u1CDB"=>230,
    "\u1CDC"=>220,
    "\u1CDD"=>220,
    "\u1CDE"=>220,
    "\u1CDF"=>220,
    "\u1CE0"=>230,
    "\u1CE2"=>1,
    "\u1CE3"=>1,
    "\u1CE4"=>1,
    "\u1CE5"=>1,
    "\u1CE6"=>1,
    "\u1CE7"=>1,
    "\u1CE8"=>1,
    "\u1CED"=>220,
    "\u1CF4"=>230,
    "\u1CF8"=>230,
    "\u1CF9"=>230,
    "\u1DC0"=>230,
    "\u1DC1"=>230,
    "\u1DC2"=>220,
    "\u1DC3"=>230,
    "\u1DC4"=>230,
    "\u1DC5"=>230,
    "\u1DC6"=>230,
    "\u1DC7"=>230,
    "\u1DC8"=>230,
    "\u1DC9"=>230,
    "\u1DCA"=>220,
    "\u1DCB"=>230,
    "\u1DCC"=>230,
    "\u1DCD"=>234,
    "\u1DCE"=>214,
    "\u1DCF"=>220,
    "\u1DD0"=>202,
    "\u1DD1"=>230,
    "\u1DD2"=>230,
    "\u1DD3"=>230,
    "\u1DD4"=>230,
    "\u1DD5"=>230,
    "\u1DD6"=>230,
    "\u1DD7"=>230,
    "\u1DD8"=>230,
    "\u1DD9"=>230,
    "\u1DDA"=>230,
    "\u1DDB"=>230,
    "\u1DDC"=>230,
    "\u1DDD"=>230,
    "\u1DDE"=>230,
    "\u1DDF"=>230,
    "\u1DE0"=>230,
    "\u1DE1"=>230,
    "\u1DE2"=>230,
    "\u1DE3"=>230,
    "\u1DE4"=>230,
    "\u1DE5"=>230,
    "\u1DE6"=>230,
    "\u1DE7"=>230,
    "\u1DE8"=>230,
    "\u1DE9"=>230,
    "\u1DEA"=>230,
    "\u1DEB"=>230,
    "\u1DEC"=>230,
    "\u1DED"=>230,
    "\u1DEE"=>230,
    "\u1DEF"=>230,
    "\u1DF0"=>230,
    "\u1DF1"=>230,
    "\u1DF2"=>230,
    "\u1DF3"=>230,
    "\u1DF4"=>230,
    "\u1DF5"=>230,
    "\u1DF6"=>232,
    "\u1DF7"=>228,
    "\u1DF8"=>228,
    "\u1DF9"=>220,
    "\u1DFB"=>230,
    "\u1DFC"=>233,
    "\u1DFD"=>220,
    "\u1DFE"=>230,
    "\u1DFF"=>220,
    "\u20D0"=>230,
    "\u20D1"=>230,
    "\u20D2"=>1,
    "\u20D3"=>1,
    "\u20D4"=>230,
    "\u20D5"=>230,
    "\u20D6"=>230,
    "\u20D7"=>230,
    "\u20D8"=>1,
    "\u20D9"=>1,
    "\u20DA"=>1,
    "\u20DB"=>230,
    "\u20DC"=>230,
    "\u20E1"=>230,
    "\u20E5"=>1,
    "\u20E6"=>1,
    "\u20E7"=>230,
    "\u20E8"=>220,
    "\u20E9"=>230,
    "\u20EA"=>1,
    "\u20EB"=>1,
    "\u20EC"=>220,
    "\u20ED"=>220,
    "\u20EE"=>220,
    "\u20EF"=>220,
    "\u20F0"=>230,
    "\u2CEF"=>230,
    "\u2CF0"=>230,
    "\u2CF1"=>230,
    "\u2D7F"=>9,
    "\u2DE0"=>230,
    "\u2DE1"=>230,
    "\u2DE2"=>230,
    "\u2DE3"=>230,
    "\u2DE4"=>230,
    "\u2DE5"=>230,
    "\u2DE6"=>230,
    "\u2DE7"=>230,
    "\u2DE8"=>230,
    "\u2DE9"=>230,
    "\u2DEA"=>230,
    "\u2DEB"=>230,
    "\u2DEC"=>230,
    "\u2DED"=>230,
    "\u2DEE"=>230,
    "\u2DEF"=>230,
    "\u2DF0"=>230,
    "\u2DF1"=>230,
    "\u2DF2"=>230,
    "\u2DF3"=>230,
    "\u2DF4"=>230,
    "\u2DF5"=>230,
    "\u2DF6"=>230,
    "\u2DF7"=>230,
    "\u2DF8"=>230,
    "\u2DF9"=>230,
    "\u2DFA"=>230,
    "\u2DFB"=>230,
    "\u2DFC"=>230,
    "\u2DFD"=>230,
    "\u2DFE"=>230,
    "\u2DFF"=>230,
    "\u302A"=>218,
    "\u302B"=>228,
    "\u302C"=>232,
    "\u302D"=>222,
    "\u302E"=>224,
    "\u302F"=>224,
    "\u3099"=>8,
    "\u309A"=>8,
    "\uA66F"=>230,
    "\uA674"=>230,
    "\uA675"=>230,
    "\uA676"=>230,
    "\uA677"=>230,
    "\uA678"=>230,
    "\uA679"=>230,
    "\uA67A"=>230,
    "\uA67B"=>230,
    "\uA67C"=>230,
    "\uA67D"=>230,
    "\uA69E"=>230,
    "\uA69F"=>230,
    "\uA6F0"=>230,
    "\uA6F1"=>230,
    "\uA806"=>9,
    "\uA82C"=>9,
    "\uA8C4"=>9,
    "\uA8E0"=>230,
    "\uA8E1"=>230,
    "\uA8E2"=>230,
    "\uA8E3"=>230,
    "\uA8E4"=>230,
    "\uA8E5"=>230,
    "\uA8E6"=>230,
    "\uA8E7"=>230,
    "\uA8E8"=>230,
    "\uA8E9"=>230,
    "\uA8EA"=>230,
    "\uA8EB"=>230,
    "\uA8EC"=>230,
    "\uA8ED"=>230,
    "\uA8EE"=>230,
    "\uA8EF"=>230,
    "\uA8F0"=>230,
    "\uA8F1"=>230,
    "\uA92B"=>220,
    "\uA92C"=>220,
    "\uA92D"=>220,
    "\uA953"=>9,
    "\uA9B3"=>7,
    "\uA9C0"=>9,
    "\uAAB0"=>230,
    "\uAAB2"=>230,
    "\uAAB3"=>230,
    "\uAAB4"=>220,
    "\uAAB7"=>230,
    "\uAAB8"=>230,
    "\uAABE"=>230,
    "\uAABF"=>230,
    "\uAAC1"=>230,
    "\uAAF6"=>9,
    "\uABED"=>9,
    "\uFB1E"=>26,
    "\uFE20"=>230,
    "\uFE21"=>230,
    "\uFE22"=>230,
    "\uFE23"=>230,
    "\uFE24"=>230,
    "\uFE25"=>230,
    "\uFE26"=>230,
    "\uFE27"=>220,
    "\uFE28"=>220,
    "\uFE29"=>220,
    "\uFE2A"=>220,
    "\uFE2B"=>220,
    "\uFE2C"=>220,
    "\uFE2D"=>220,
    "\uFE2E"=>230,
    "\uFE2F"=>230,
    "\u{101FD}"=>220,
    "\u{102E0}"=>220,
    "\u{10376}"=>230,
    "\u{10377}"=>230,
    "\u{10378}"=>230,
    "\u{10379}"=>230,
    "\u{1037A}"=>230,
    "\u{10A0D}"=>220,
    "\u{10A0F}"=>230,
    "\u{10A38}"=>230,
    "\u{10A39}"=>1,
    "\u{10A3A}"=>220,
    "\u{10A3F}"=>9,
    "\u{10AE5}"=>230,
    "\u{10AE6}"=>220,
    "\u{10D24}"=>230,
    "\u{10D25}"=>230,
    "\u{10D26}"=>230,
    "\u{10D27}"=>230,
    "\u{10EAB}"=>230,
    "\u{10EAC}"=>230,
    "\u{10F46}"=>220,
    "\u{10F47}"=>220,
    "\u{10F48}"=>230,
    "\u{10F49}"=>230,
    "\u{10F4A}"=>230,
    "\u{10F4B}"=>220,
    "\u{10F4C}"=>230,
    "\u{10F4D}"=>220,
    "\u{10F4E}"=>220,
    "\u{10F4F}"=>220,
    "\u{10F50}"=>220,
    "\u{11046}"=>9,
    "\u{1107F}"=>9,
    "\u{110B9}"=>9,
    "\u{110BA}"=>7,
    "\u{11100}"=>230,
    "\u{11101}"=>230,
    "\u{11102}"=>230,
    "\u{11133}"=>9,
    "\u{11134}"=>9,
    "\u{11173}"=>7,
    "\u{111C0}"=>9,
    "\u{111CA}"=>7,
    "\u{11235}"=>9,
    "\u{11236}"=>7,
    "\u{112E9}"=>7,
    "\u{112EA}"=>9,
    "\u{1133B}"=>7,
    "\u{1133C}"=>7,
    "\u{1134D}"=>9,
    "\u{11366}"=>230,
    "\u{11367}"=>230,
    "\u{11368}"=>230,
    "\u{11369}"=>230,
    "\u{1136A}"=>230,
    "\u{1136B}"=>230,
    "\u{1136C}"=>230,
    "\u{11370}"=>230,
    "\u{11371}"=>230,
    "\u{11372}"=>230,
    "\u{11373}"=>230,
    "\u{11374}"=>230,
    "\u{11442}"=>9,
    "\u{11446}"=>7,
    "\u{1145E}"=>230,
    "\u{114C2}"=>9,
    "\u{114C3}"=>7,
    "\u{115BF}"=>9,
    "\u{115C0}"=>7,
    "\u{1163F}"=>9,
    "\u{116B6}"=>9,
    "\u{116B7}"=>7,
    "\u{1172B}"=>9,
    "\u{11839}"=>9,
    "\u{1183A}"=>7,
    "\u{1193D}"=>9,
    "\u{1193E}"=>9,
    "\u{11943}"=>7,
    "\u{119E0}"=>9,
    "\u{11A34}"=>9,
    "\u{11A47}"=>9,
    "\u{11A99}"=>9,
    "\u{11C3F}"=>9,
    "\u{11D42}"=>7,
    "\u{11D44}"=>9,
    "\u{11D45}"=>9,
    "\u{11D97}"=>9,
    "\u{16AF0}"=>1,
    "\u{16AF1}"=>1,
    "\u{16AF2}"=>1,
    "\u{16AF3}"=>1,
    "\u{16AF4}"=>1,
    "\u{16B30}"=>230,
    "\u{16B31}"=>230,
    "\u{16B32}"=>230,
    "\u{16B33}"=>230,
    "\u{16B34}"=>230,
    "\u{16B35}"=>230,
    "\u{16B36}"=>230,
    "\u{16FF0}"=>6,
    "\u{16FF1}"=>6,
    "\u{1BC9E}"=>1,
    "\u{1D165}"=>216,
    "\u{1D166}"=>216,
    "\u{1D167}"=>1,
    "\u{1D168}"=>1,
    "\u{1D169}"=>1,
    "\u{1D16D}"=>226,
    "\u{1D16E}"=>216,
    "\u{1D16F}"=>216,
    "\u{1D170}"=>216,
    "\u{1D171}"=>216,
    "\u{1D172}"=>216,
    "\u{1D17B}"=>220,
    "\u{1D17C}"=>220,
    "\u{1D17D}"=>220,
    "\u{1D17E}"=>220,
    "\u{1D17F}"=>220,
    "\u{1D180}"=>220,
    "\u{1D181}"=>220,
    "\u{1D182}"=>220,
    "\u{1D185}"=>230,
    "\u{1D186}"=>230,
    "\u{1D187}"=>230,
    "\u{1D188}"=>230,
    "\u{1D189}"=>230,
    "\u{1D18A}"=>220,
    "\u{1D18B}"=>220,
    "\u{1D1AA}"=>230,
    "\u{1D1AB}"=>230,
    "\u{1D1AC}"=>230,
    "\u{1D1AD}"=>230,
    "\u{1D242}"=>230,
    "\u{1D243}"=>230,
    "\u{1D244}"=>230,
    "\u{1E000}"=>230,
    "\u{1E001}"=>230,
    "\u{1E002}"=>230,
    "\u{1E003}"=>230,
    "\u{1E004}"=>230,
    "\u{1E005}"=>230,
    "\u{1E006}"=>230,
    "\u{1E008}"=>230,
    "\u{1E009}"=>230,
    "\u{1E00A}"=>230,
    "\u{1E00B}"=>230,
    "\u{1E00C}"=>230,
    "\u{1E00D}"=>230,
    "\u{1E00E}"=>230,
    "\u{1E00F}"=>230,
    "\u{1E010}"=>230,
    "\u{1E011}"=>230,
    "\u{1E012}"=>230,
    "\u{1E013}"=>230,
    "\u{1E014}"=>230,
    "\u{1E015}"=>230,
    "\u{1E016}"=>230,
    "\u{1E017}"=>230,
    "\u{1E018}"=>230,
    "\u{1E01B}"=>230,
    "\u{1E01C}"=>230,
    "\u{1E01D}"=>230,
    "\u{1E01E}"=>230,
    "\u{1E01F}"=>230,
    "\u{1E020}"=>230,
    "\u{1E021}"=>230,
    "\u{1E023}"=>230,
    "\u{1E024}"=>230,
    "\u{1E026}"=>230,
    "\u{1E027}"=>230,
    "\u{1E028}"=>230,
    "\u{1E029}"=>230,
    "\u{1E02A}"=>230,
    "\u{1E130}"=>230,
    "\u{1E131}"=>230,
    "\u{1E132}"=>230,
    "\u{1E133}"=>230,
    "\u{1E134}"=>230,
    "\u{1E135}"=>230,
    "\u{1E136}"=>230,
    "\u{1E2EC}"=>230,
    "\u{1E2ED}"=>230,
    "\u{1E2EE}"=>230,
    "\u{1E2EF}"=>230,
    "\u{1E8D0}"=>220,
    "\u{1E8D1}"=>220,
    "\u{1E8D2}"=>220,
    "\u{1E8D3}"=>220,
    "\u{1E8D4}"=>220,
    "\u{1E8D5}"=>220,
    "\u{1E8D6}"=>220,
    "\u{1E944}"=>230,
    "\u{1E945}"=>230,
    "\u{1E946}"=>230,
    "\u{1E947}"=>230,
    "\u{1E948}"=>230,
    "\u{1E949}"=>230,
    "\u{1E94A}"=>7,
  }
  class_table.default = 0
  CLASS_TABLE = class_table.freeze

  DECOMPOSITION_TABLE = {
    "\u00C0"=>"A\u0300",
    "\u00C1"=>"A\u0301",
    "\u00C2"=>"A\u0302",
    "\u00C3"=>"A\u0303",
    "\u00C4"=>"A\u0308",
    "\u00C5"=>"A\u030A",
    "\u00C7"=>"C\u0327",
    "\u00C8"=>"E\u0300",
    "\u00C9"=>"E\u0301",
    "\u00CA"=>"E\u0302",
    "\u00CB"=>"E\u0308",
    "\u00CC"=>"I\u0300",
    "\u00CD"=>"I\u0301",
    "\u00CE"=>"I\u0302",
    "\u00CF"=>"I\u0308",
    "\u00D1"=>"N\u0303",
    "\u00D2"=>"O\u0300",
    "\u00D3"=>"O\u0301",
    "\u00D4"=>"O\u0302",
    "\u00D5"=>"O\u0303",
    "\u00D6"=>"O\u0308",
    "\u00D9"=>"U\u0300",
    "\u00DA"=>"U\u0301",
    "\u00DB"=>"U\u0302",
    "\u00DC"=>"U\u0308",
    "\u00DD"=>"Y\u0301",
    "\u00E0"=>"a\u0300",
    "\u00E1"=>"a\u0301",
    "\u00E2"=>"a\u0302",
    "\u00E3"=>"a\u0303",
    "\u00E4"=>"a\u0308",
    "\u00E5"=>"a\u030A",
    "\u00E7"=>"c\u0327",
    "\u00E8"=>"e\u0300",
    "\u00E9"=>"e\u0301",
    "\u00EA"=>"e\u0302",
    "\u00EB"=>"e\u0308",
    "\u00EC"=>"i\u0300",
    "\u00ED"=>"i\u0301",
    "\u00EE"=>"i\u0302",
    "\u00EF"=>"i\u0308",
    "\u00F1"=>"n\u0303",
    "\u00F2"=>"o\u0300",
    "\u00F3"=>"o\u0301",
    "\u00F4"=>"o\u0302",
    "\u00F5"=>"o\u0303",
    "\u00F6"=>"o\u0308",
    "\u00F9"=>"u\u0300",
    "\u00FA"=>"u\u0301",
    "\u00FB"=>"u\u0302",
    "\u00FC"=>"u\u0308",
    "\u00FD"=>"y\u0301",
    "\u00FF"=>"y\u0308",
    "\u0100"=>"A\u0304",
    "\u0101"=>"a\u0304",
    "\u0102"=>"A\u0306",
    "\u0103"=>"a\u0306",
    "\u0104"=>"A\u0328",
    "\u0105"=>"a\u0328",
    "\u0106"=>"C\u0301",
    "\u0107"=>"c\u0301",
    "\u0108"=>"C\u0302",
    "\u0109"=>"c\u0302",
    "\u010A"=>"C\u0307",
    "\u010B"=>"c\u0307",
    "\u010C"=>"C\u030C",
    "\u010D"=>"c\u030C",
    "\u010E"=>"D\u030C",
    "\u010F"=>"d\u030C",
    "\u0112"=>"E\u0304",
    "\u0113"=>"e\u0304",
    "\u0114"=>"E\u0306",
    "\u0115"=>"e\u0306",
    "\u0116"=>"E\u0307",
    "\u0117"=>"e\u0307",
    "\u0118"=>"E\u0328",
    "\u0119"=>"e\u0328",
    "\u011A"=>"E\u030C",
    "\u011B"=>"e\u030C",
    "\u011C"=>"G\u0302",
    "\u011D"=>"g\u0302",
    "\u011E"=>"G\u0306",
    "\u011F"=>"g\u0306",
    "\u0120"=>"G\u0307",
    "\u0121"=>"g\u0307",
    "\u0122"=>"G\u0327",
    "\u0123"=>"g\u0327",
    "\u0124"=>"H\u0302",
    "\u0125"=>"h\u0302",
    "\u0128"=>"I\u0303",
    "\u0129"=>"i\u0303",
    "\u012A"=>"I\u0304",
    "\u012B"=>"i\u0304",
    "\u012C"=>"I\u0306",
    "\u012D"=>"i\u0306",
    "\u012E"=>"I\u0328",
    "\u012F"=>"i\u0328",
    "\u0130"=>"I\u0307",
    "\u0134"=>"J\u0302",
    "\u0135"=>"j\u0302",
    "\u0136"=>"K\u0327",
    "\u0137"=>"k\u0327",
    "\u0139"=>"L\u0301",
    "\u013A"=>"l\u0301",
    "\u013B"=>"L\u0327",
    "\u013C"=>"l\u0327",
    "\u013D"=>"L\u030C",
    "\u013E"=>"l\u030C",
    "\u0143"=>"N\u0301",
    "\u0144"=>"n\u0301",
    "\u0145"=>"N\u0327",
    "\u0146"=>"n\u0327",
    "\u0147"=>"N\u030C",
    "\u0148"=>"n\u030C",
    "\u014C"=>"O\u0304",
    "\u014D"=>"o\u0304",
    "\u014E"=>"O\u0306",
    "\u014F"=>"o\u0306",
    "\u0150"=>"O\u030B",
    "\u0151"=>"o\u030B",
    "\u0154"=>"R\u0301",
    "\u0155"=>"r\u0301",
    "\u0156"=>"R\u0327",
    "\u0157"=>"r\u0327",
    "\u0158"=>"R\u030C",
    "\u0159"=>"r\u030C",
    "\u015A"=>"S\u0301",
    "\u015B"=>"s\u0301",
    "\u015C"=>"S\u0302",
    "\u015D"=>"s\u0302",
    "\u015E"=>"S\u0327",
    "\u015F"=>"s\u0327",
    "\u0160"=>"S\u030C",
    "\u0161"=>"s\u030C",
    "\u0162"=>"T\u0327",
    "\u0163"=>"t\u0327",
    "\u0164"=>"T\u030C",
    "\u0165"=>"t\u030C",
    "\u0168"=>"U\u0303",
    "\u0169"=>"u\u0303",
    "\u016A"=>"U\u0304",
    "\u016B"=>"u\u0304",
    "\u016C"=>"U\u0306",
    "\u016D"=>"u\u0306",
    "\u016E"=>"U\u030A",
    "\u016F"=>"u\u030A",
    "\u0170"=>"U\u030B",
    "\u0171"=>"u\u030B",
    "\u0172"=>"U\u0328",
    "\u0173"=>"u\u0328",
    "\u0174"=>"W\u0302",
    "\u0175"=>"w\u0302",
    "\u0176"=>"Y\u0302",
    "\u0177"=>"y\u0302",
    "\u0178"=>"Y\u0308",
    "\u0179"=>"Z\u0301",
    "\u017A"=>"z\u0301",
    "\u017B"=>"Z\u0307",
    "\u017C"=>"z\u0307",
    "\u017D"=>"Z\u030C",
    "\u017E"=>"z\u030C",
    "\u01A0"=>"O\u031B",
    "\u01A1"=>"o\u031B",
    "\u01AF"=>"U\u031B",
    "\u01B0"=>"u\u031B",
    "\u01CD"=>"A\u030C",
    "\u01CE"=>"a\u030C",
    "\u01CF"=>"I\u030C",
    "\u01D0"=>"i\u030C",
    "\u01D1"=>"O\u030C",
    "\u01D2"=>"o\u030C",
    "\u01D3"=>"U\u030C",
    "\u01D4"=>"u\u030C",
    "\u01D5"=>"U\u0308\u0304",
    "\u01D6"=>"u\u0308\u0304",
    "\u01D7"=>"U\u0308\u0301",
    "\u01D8"=>"u\u0308\u0301",
    "\u01D9"=>"U\u0308\u030C",
    "\u01DA"=>"u\u0308\u030C",
    "\u01DB"=>"U\u0308\u0300",
    "\u01DC"=>"u\u0308\u0300",
    "\u01DE"=>"A\u0308\u0304",
    "\u01DF"=>"a\u0308\u0304",
    "\u01E0"=>"A\u0307\u0304",
    "\u01E1"=>"a\u0307\u0304",
    "\u01E2"=>"\u00C6\u0304",
    "\u01E3"=>"\u00E6\u0304",
    "\u01E6"=>"G\u030C",
    "\u01E7"=>"g\u030C",
    "\u01E8"=>"K\u030C",
    "\u01E9"=>"k\u030C",
    "\u01EA"=>"O\u0328",
    "\u01EB"=>"o\u0328",
    "\u01EC"=>"O\u0328\u0304",
    "\u01ED"=>"o\u0328\u0304",
    "\u01EE"=>"\u01B7\u030C",
    "\u01EF"=>"\u0292\u030C",
    "\u01F0"=>"j\u030C",
    "\u01F4"=>"G\u0301",
    "\u01F5"=>"g\u0301",
    "\u01F8"=>"N\u0300",
    "\u01F9"=>"n\u0300",
    "\u01FA"=>"A\u030A\u0301",
    "\u01FB"=>"a\u030A\u0301",
    "\u01FC"=>"\u00C6\u0301",
    "\u01FD"=>"\u00E6\u0301",
    "\u01FE"=>"\u00D8\u0301",
    "\u01FF"=>"\u00F8\u0301",
    "\u0200"=>"A\u030F",
    "\u0201"=>"a\u030F",
    "\u0202"=>"A\u0311",
    "\u0203"=>"a\u0311",
    "\u0204"=>"E\u030F",
    "\u0205"=>"e\u030F",
    "\u0206"=>"E\u0311",
    "\u0207"=>"e\u0311",
    "\u0208"=>"I\u030F",
    "\u0209"=>"i\u030F",
    "\u020A"=>"I\u0311",
    "\u020B"=>"i\u0311",
    "\u020C"=>"O\u030F",
    "\u020D"=>"o\u030F",
    "\u020E"=>"O\u0311",
    "\u020F"=>"o\u0311",
    "\u0210"=>"R\u030F",
    "\u0211"=>"r\u030F",
    "\u0212"=>"R\u0311",
    "\u0213"=>"r\u0311",
    "\u0214"=>"U\u030F",
    "\u0215"=>"u\u030F",
    "\u0216"=>"U\u0311",
    "\u0217"=>"u\u0311",
    "\u0218"=>"S\u0326",
    "\u0219"=>"s\u0326",
    "\u021A"=>"T\u0326",
    "\u021B"=>"t\u0326",
    "\u021E"=>"H\u030C",
    "\u021F"=>"h\u030C",
    "\u0226"=>"A\u0307",
    "\u0227"=>"a\u0307",
    "\u0228"=>"E\u0327",
    "\u0229"=>"e\u0327",
    "\u022A"=>"O\u0308\u0304",
    "\u022B"=>"o\u0308\u0304",
    "\u022C"=>"O\u0303\u0304",
    "\u022D"=>"o\u0303\u0304",
    "\u022E"=>"O\u0307",
    "\u022F"=>"o\u0307",
    "\u0230"=>"O\u0307\u0304",
    "\u0231"=>"o\u0307\u0304",
    "\u0232"=>"Y\u0304",
    "\u0233"=>"y\u0304",
    "\u0340"=>"\u0300",
    "\u0341"=>"\u0301",
    "\u0343"=>"\u0313",
    "\u0344"=>"\u0308\u0301",
    "\u0374"=>"\u02B9",
    "\u037E"=>";",
    "\u0385"=>"\u00A8\u0301",
    "\u0386"=>"\u0391\u0301",
    "\u0387"=>"\u00B7",
    "\u0388"=>"\u0395\u0301",
    "\u0389"=>"\u0397\u0301",
    "\u038A"=>"\u0399\u0301",
    "\u038C"=>"\u039F\u0301",
    "\u038E"=>"\u03A5\u0301",
    "\u038F"=>"\u03A9\u0301",
    "\u0390"=>"\u03B9\u0308\u0301",
    "\u03AA"=>"\u0399\u0308",
    "\u03AB"=>"\u03A5\u0308",
    "\u03AC"=>"\u03B1\u0301",
    "\u03AD"=>"\u03B5\u0301",
    "\u03AE"=>"\u03B7\u0301",
    "\u03AF"=>"\u03B9\u0301",
    "\u03B0"=>"\u03C5\u0308\u0301",
    "\u03CA"=>"\u03B9\u0308",
    "\u03CB"=>"\u03C5\u0308",
    "\u03CC"=>"\u03BF\u0301",
    "\u03CD"=>"\u03C5\u0301",
    "\u03CE"=>"\u03C9\u0301",
    "\u03D3"=>"\u03D2\u0301",
    "\u03D4"=>"\u03D2\u0308",
    "\u0400"=>"\u0415\u0300",
    "\u0401"=>"\u0415\u0308",
    "\u0403"=>"\u0413\u0301",
    "\u0407"=>"\u0406\u0308",
    "\u040C"=>"\u041A\u0301",
    "\u040D"=>"\u0418\u0300",
    "\u040E"=>"\u0423\u0306",
    "\u0419"=>"\u0418\u0306",
    "\u0439"=>"\u0438\u0306",
    "\u0450"=>"\u0435\u0300",
    "\u0451"=>"\u0435\u0308",
    "\u0453"=>"\u0433\u0301",
    "\u0457"=>"\u0456\u0308",
    "\u045C"=>"\u043A\u0301",
    "\u045D"=>"\u0438\u0300",
    "\u045E"=>"\u0443\u0306",
    "\u0476"=>"\u0474\u030F",
    "\u0477"=>"\u0475\u030F",
    "\u04C1"=>"\u0416\u0306",
    "\u04C2"=>"\u0436\u0306",
    "\u04D0"=>"\u0410\u0306",
    "\u04D1"=>"\u0430\u0306",
    "\u04D2"=>"\u0410\u0308",
    "\u04D3"=>"\u0430\u0308",
    "\u04D6"=>"\u0415\u0306",
    "\u04D7"=>"\u0435\u0306",
    "\u04DA"=>"\u04D8\u0308",
    "\u04DB"=>"\u04D9\u0308",
    "\u04DC"=>"\u0416\u0308",
    "\u04DD"=>"\u0436\u0308",
    "\u04DE"=>"\u0417\u0308",
    "\u04DF"=>"\u0437\u0308",
    "\u04E2"=>"\u0418\u0304",
    "\u04E3"=>"\u0438\u0304",
    "\u04E4"=>"\u0418\u0308",
    "\u04E5"=>"\u0438\u0308",
    "\u04E6"=>"\u041E\u0308",
    "\u04E7"=>"\u043E\u0308",
    "\u04EA"=>"\u04E8\u0308",
    "\u04EB"=>"\u04E9\u0308",
    "\u04EC"=>"\u042D\u0308",
    "\u04ED"=>"\u044D\u0308",
    "\u04EE"=>"\u0423\u0304",
    "\u04EF"=>"\u0443\u0304",
    "\u04F0"=>"\u0423\u0308",
    "\u04F1"=>"\u0443\u0308",
    "\u04F2"=>"\u0423\u030B",
    "\u04F3"=>"\u0443\u030B",
    "\u04F4"=>"\u0427\u0308",
    "\u04F5"=>"\u0447\u0308",
    "\u04F8"=>"\u042B\u0308",
    "\u04F9"=>"\u044B\u0308",
    "\u0622"=>"\u0627\u0653",
    "\u0623"=>"\u0627\u0654",
    "\u0624"=>"\u0648\u0654",
    "\u0625"=>"\u0627\u0655",
    "\u0626"=>"\u064A\u0654",
    "\u06C0"=>"\u06D5\u0654",
    "\u06C2"=>"\u06C1\u0654",
    "\u06D3"=>"\u06D2\u0654",
    "\u0929"=>"\u0928\u093C",
    "\u0931"=>"\u0930\u093C",
    "\u0934"=>"\u0933\u093C",
    "\u0958"=>"\u0915\u093C",
    "\u0959"=>"\u0916\u093C",
    "\u095A"=>"\u0917\u093C",
    "\u095B"=>"\u091C\u093C",
    "\u095C"=>"\u0921\u093C",
    "\u095D"=>"\u0922\u093C",
    "\u095E"=>"\u092B\u093C",
    "\u095F"=>"\u092F\u093C",
    "\u09CB"=>"\u09C7\u09BE",
    "\u09CC"=>"\u09C7\u09D7",
    "\u09DC"=>"\u09A1\u09BC",
    "\u09DD"=>"\u09A2\u09BC",
    "\u09DF"=>"\u09AF\u09BC",
    "\u0A33"=>"\u0A32\u0A3C",
    "\u0A36"=>"\u0A38\u0A3C",
    "\u0A59"=>"\u0A16\u0A3C",
    "\u0A5A"=>"\u0A17\u0A3C",
    "\u0A5B"=>"\u0A1C\u0A3C",
    "\u0A5E"=>"\u0A2B\u0A3C",
    "\u0B48"=>"\u0B47\u0B56",
    "\u0B4B"=>"\u0B47\u0B3E",
    "\u0B4C"=>"\u0B47\u0B57",
    "\u0B5C"=>"\u0B21\u0B3C",
    "\u0B5D"=>"\u0B22\u0B3C",
    "\u0B94"=>"\u0B92\u0BD7",
    "\u0BCA"=>"\u0BC6\u0BBE",
    "\u0BCB"=>"\u0BC7\u0BBE",
    "\u0BCC"=>"\u0BC6\u0BD7",
    "\u0C48"=>"\u0C46\u0C56",
    "\u0CC0"=>"\u0CBF\u0CD5",
    "\u0CC7"=>"\u0CC6\u0CD5",
    "\u0CC8"=>"\u0CC6\u0CD6",
    "\u0CCA"=>"\u0CC6\u0CC2",
    "\u0CCB"=>"\u0CC6\u0CC2\u0CD5",
    "\u0D4A"=>"\u0D46\u0D3E",
    "\u0D4B"=>"\u0D47\u0D3E",
    "\u0D4C"=>"\u0D46\u0D57",
    "\u0DDA"=>"\u0DD9\u0DCA",
    "\u0DDC"=>"\u0DD9\u0DCF",
    "\u0DDD"=>"\u0DD9\u0DCF\u0DCA",
    "\u0DDE"=>"\u0DD9\u0DDF",
    "\u0F43"=>"\u0F42\u0FB7",
    "\u0F4D"=>"\u0F4C\u0FB7",
    "\u0F52"=>"\u0F51\u0FB7",
    "\u0F57"=>"\u0F56\u0FB7",
    "\u0F5C"=>"\u0F5B\u0FB7",
    "\u0F69"=>"\u0F40\u0FB5",
    "\u0F73"=>"\u0F71\u0F72",
    "\u0F75"=>"\u0F71\u0F74",
    "\u0F76"=>"\u0FB2\u0F80",
    "\u0F78"=>"\u0FB3\u0F80",
    "\u0F81"=>"\u0F71\u0F80",
    "\u0F93"=>"\u0F92\u0FB7",
    "\u0F9D"=>"\u0F9C\u0FB7",
    "\u0FA2"=>"\u0FA1\u0FB7",
    "\u0FA7"=>"\u0FA6\u0FB7",
    "\u0FAC"=>"\u0FAB\u0FB7",
    "\u0FB9"=>"\u0F90\u0FB5",
    "\u1026"=>"\u1025\u102E",
    "\u1B06"=>"\u1B05\u1B35",
    "\u1B08"=>"\u1B07\u1B35",
    "\u1B0A"=>"\u1B09\u1B35",
    "\u1B0C"=>"\u1B0B\u1B35",
    "\u1B0E"=>"\u1B0D\u1B35",
    "\u1B12"=>"\u1B11\u1B35",
    "\u1B3B"=>"\u1B3A\u1B35",
    "\u1B3D"=>"\u1B3C\u1B35",
    "\u1B40"=>"\u1B3E\u1B35",
    "\u1B41"=>"\u1B3F\u1B35",
    "\u1B43"=>"\u1B42\u1B35",
    "\u1E00"=>"A\u0325",
    "\u1E01"=>"a\u0325",
    "\u1E02"=>"B\u0307",
    "\u1E03"=>"b\u0307",
    "\u1E04"=>"B\u0323",
    "\u1E05"=>"b\u0323",
    "\u1E06"=>"B\u0331",
    "\u1E07"=>"b\u0331",
    "\u1E08"=>"C\u0327\u0301",
    "\u1E09"=>"c\u0327\u0301",
    "\u1E0A"=>"D\u0307",
    "\u1E0B"=>"d\u0307",
    "\u1E0C"=>"D\u0323",
    "\u1E0D"=>"d\u0323",
    "\u1E0E"=>"D\u0331",
    "\u1E0F"=>"d\u0331",
    "\u1E10"=>"D\u0327",
    "\u1E11"=>"d\u0327",
    "\u1E12"=>"D\u032D",
    "\u1E13"=>"d\u032D",
    "\u1E14"=>"E\u0304\u0300",
    "\u1E15"=>"e\u0304\u0300",
    "\u1E16"=>"E\u0304\u0301",
    "\u1E17"=>"e\u0304\u0301",
    "\u1E18"=>"E\u032D",
    "\u1E19"=>"e\u032D",
    "\u1E1A"=>"E\u0330",
    "\u1E1B"=>"e\u0330",
    "\u1E1C"=>"E\u0327\u0306",
    "\u1E1D"=>"e\u0327\u0306",
    "\u1E1E"=>"F\u0307",
    "\u1E1F"=>"f\u0307",
    "\u1E20"=>"G\u0304",
    "\u1E21"=>"g\u0304",
    "\u1E22"=>"H\u0307",
    "\u1E23"=>"h\u0307",
    "\u1E24"=>"H\u0323",
    "\u1E25"=>"h\u0323",
    "\u1E26"=>"H\u0308",
    "\u1E27"=>"h\u0308",
    "\u1E28"=>"H\u0327",
    "\u1E29"=>"h\u0327",
    "\u1E2A"=>"H\u032E",
    "\u1E2B"=>"h\u032E",
    "\u1E2C"=>"I\u0330",
    "\u1E2D"=>"i\u0330",
    "\u1E2E"=>"I\u0308\u0301",
    "\u1E2F"=>"i\u0308\u0301",
    "\u1E30"=>"K\u0301",
    "\u1E31"=>"k\u0301",
    "\u1E32"=>"K\u0323",
    "\u1E33"=>"k\u0323",
    "\u1E34"=>"K\u0331",
    "\u1E35"=>"k\u0331",
    "\u1E36"=>"L\u0323",
    "\u1E37"=>"l\u0323",
    "\u1E38"=>"L\u0323\u0304",
    "\u1E39"=>"l\u0323\u0304",
    "\u1E3A"=>"L\u0331",
    "\u1E3B"=>"l\u0331",
    "\u1E3C"=>"L\u032D",
    "\u1E3D"=>"l\u032D",
    "\u1E3E"=>"M\u0301",
    "\u1E3F"=>"m\u0301",
    "\u1E40"=>"M\u0307",
    "\u1E41"=>"m\u0307",
    "\u1E42"=>"M\u0323",
    "\u1E43"=>"m\u0323",
    "\u1E44"=>"N\u0307",
    "\u1E45"=>"n\u0307",
    "\u1E46"=>"N\u0323",
    "\u1E47"=>"n\u0323",
    "\u1E48"=>"N\u0331",
    "\u1E49"=>"n\u0331",
    "\u1E4A"=>"N\u032D",
    "\u1E4B"=>"n\u032D",
    "\u1E4C"=>"O\u0303\u0301",
    "\u1E4D"=>"o\u0303\u0301",
    "\u1E4E"=>"O\u0303\u0308",
    "\u1E4F"=>"o\u0303\u0308",
    "\u1E50"=>"O\u0304\u0300",
    "\u1E51"=>"o\u0304\u0300",
    "\u1E52"=>"O\u0304\u0301",
    "\u1E53"=>"o\u0304\u0301",
    "\u1E54"=>"P\u0301",
    "\u1E55"=>"p\u0301",
    "\u1E56"=>"P\u0307",
    "\u1E57"=>"p\u0307",
    "\u1E58"=>"R\u0307",
    "\u1E59"=>"r\u0307",
    "\u1E5A"=>"R\u0323",
    "\u1E5B"=>"r\u0323",
    "\u1E5C"=>"R\u0323\u0304",
    "\u1E5D"=>"r\u0323\u0304",
    "\u1E5E"=>"R\u0331",
    "\u1E5F"=>"r\u0331",
    "\u1E60"=>"S\u0307",
    "\u1E61"=>"s\u0307",
    "\u1E62"=>"S\u0323",
    "\u1E63"=>"s\u0323",
    "\u1E64"=>"S\u0301\u0307",
    "\u1E65"=>"s\u0301\u0307",
    "\u1E66"=>"S\u030C\u0307",
    "\u1E67"=>"s\u030C\u0307",
    "\u1E68"=>"S\u0323\u0307",
    "\u1E69"=>"s\u0323\u0307",
    "\u1E6A"=>"T\u0307",
    "\u1E6B"=>"t\u0307",
    "\u1E6C"=>"T\u0323",
    "\u1E6D"=>"t\u0323",
    "\u1E6E"=>"T\u0331",
    "\u1E6F"=>"t\u0331",
    "\u1E70"=>"T\u032D",
    "\u1E71"=>"t\u032D",
    "\u1E72"=>"U\u0324",
    "\u1E73"=>"u\u0324",
    "\u1E74"=>"U\u0330",
    "\u1E75"=>"u\u0330",
    "\u1E76"=>"U\u032D",
    "\u1E77"=>"u\u032D",
    "\u1E78"=>"U\u0303\u0301",
    "\u1E79"=>"u\u0303\u0301",
    "\u1E7A"=>"U\u0304\u0308",
    "\u1E7B"=>"u\u0304\u0308",
    "\u1E7C"=>"V\u0303",
    "\u1E7D"=>"v\u0303",
    "\u1E7E"=>"V\u0323",
    "\u1E7F"=>"v\u0323",
    "\u1E80"=>"W\u0300",
    "\u1E81"=>"w\u0300",
    "\u1E82"=>"W\u0301",
    "\u1E83"=>"w\u0301",
    "\u1E84"=>"W\u0308",
    "\u1E85"=>"w\u0308",
    "\u1E86"=>"W\u0307",
    "\u1E87"=>"w\u0307",
    "\u1E88"=>"W\u0323",
    "\u1E89"=>"w\u0323",
    "\u1E8A"=>"X\u0307",
    "\u1E8B"=>"x\u0307",
    "\u1E8C"=>"X\u0308",
    "\u1E8D"=>"x\u0308",
    "\u1E8E"=>"Y\u0307",
    "\u1E8F"=>"y\u0307",
    "\u1E90"=>"Z\u0302",
    "\u1E91"=>"z\u0302",
    "\u1E92"=>"Z\u0323",
    "\u1E93"=>"z\u0323",
    "\u1E94"=>"Z\u0331",
    "\u1E95"=>"z\u0331",
    "\u1E96"=>"h\u0331",
    "\u1E97"=>"t\u0308",
    "\u1E98"=>"w\u030A",
    "\u1E99"=>"y\u030A",
    "\u1E9B"=>"\u017F\u0307",
    "\u1EA0"=>"A\u0323",
    "\u1EA1"=>"a\u0323",
    "\u1EA2"=>"A\u0309",
    "\u1EA3"=>"a\u0309",
    "\u1EA4"=>"A\u0302\u0301",
    "\u1EA5"=>"a\u0302\u0301",
    "\u1EA6"=>"A\u0302\u0300",
    "\u1EA7"=>"a\u0302\u0300",
    "\u1EA8"=>"A\u0302\u0309",
    "\u1EA9"=>"a\u0302\u0309",
    "\u1EAA"=>"A\u0302\u0303",
    "\u1EAB"=>"a\u0302\u0303",
    "\u1EAC"=>"A\u0323\u0302",
    "\u1EAD"=>"a\u0323\u0302",
    "\u1EAE"=>"A\u0306\u0301",
    "\u1EAF"=>"a\u0306\u0301",
    "\u1EB0"=>"A\u0306\u0300",
    "\u1EB1"=>"a\u0306\u0300",
    "\u1EB2"=>"A\u0306\u0309",
    "\u1EB3"=>"a\u0306\u0309",
    "\u1EB4"=>"A\u0306\u0303",
    "\u1EB5"=>"a\u0306\u0303",
    "\u1EB6"=>"A\u0323\u0306",
    "\u1EB7"=>"a\u0323\u0306",
    "\u1EB8"=>"E\u0323",
    "\u1EB9"=>"e\u0323",
    "\u1EBA"=>"E\u0309",
    "\u1EBB"=>"e\u0309",
    "\u1EBC"=>"E\u0303",
    "\u1EBD"=>"e\u0303",
    "\u1EBE"=>"E\u0302\u0301",
    "\u1EBF"=>"e\u0302\u0301",
    "\u1EC0"=>"E\u0302\u0300",
    "\u1EC1"=>"e\u0302\u0300",
    "\u1EC2"=>"E\u0302\u0309",
    "\u1EC3"=>"e\u0302\u0309",
    "\u1EC4"=>"E\u0302\u0303",
    "\u1EC5"=>"e\u0302\u0303",
    "\u1EC6"=>"E\u0323\u0302",
    "\u1EC7"=>"e\u0323\u0302",
    "\u1EC8"=>"I\u0309",
    "\u1EC9"=>"i\u0309",
    "\u1ECA"=>"I\u0323",
    "\u1ECB"=>"i\u0323",
    "\u1ECC"=>"O\u0323",
    "\u1ECD"=>"o\u0323",
    "\u1ECE"=>"O\u0309",
    "\u1ECF"=>"o\u0309",
    "\u1ED0"=>"O\u0302\u0301",
    "\u1ED1"=>"o\u0302\u0301",
    "\u1ED2"=>"O\u0302\u0300",
    "\u1ED3"=>"o\u0302\u0300",
    "\u1ED4"=>"O\u0302\u0309",
    "\u1ED5"=>"o\u0302\u0309",
    "\u1ED6"=>"O\u0302\u0303",
    "\u1ED7"=>"o\u0302\u0303",
    "\u1ED8"=>"O\u0323\u0302",
    "\u1ED9"=>"o\u0323\u0302",
    "\u1EDA"=>"O\u031B\u0301",
    "\u1EDB"=>"o\u031B\u0301",
    "\u1EDC"=>"O\u031B\u0300",
    "\u1EDD"=>"o\u031B\u0300",
    "\u1EDE"=>"O\u031B\u0309",
    "\u1EDF"=>"o\u031B\u0309",
    "\u1EE0"=>"O\u031B\u0303",
    "\u1EE1"=>"o\u031B\u0303",
    "\u1EE2"=>"O\u031B\u0323",
    "\u1EE3"=>"o\u031B\u0323",
    "\u1EE4"=>"U\u0323",
    "\u1EE5"=>"u\u0323",
    "\u1EE6"=>"U\u0309",
    "\u1EE7"=>"u\u0309",
    "\u1EE8"=>"U\u031B\u0301",
    "\u1EE9"=>"u\u031B\u0301",
    "\u1EEA"=>"U\u031B\u0300",
    "\u1EEB"=>"u\u031B\u0300",
    "\u1EEC"=>"U\u031B\u0309",
    "\u1EED"=>"u\u031B\u0309",
    "\u1EEE"=>"U\u031B\u0303",
    "\u1EEF"=>"u\u031B\u0303",
    "\u1EF0"=>"U\u031B\u0323",
    "\u1EF1"=>"u\u031B\u0323",
    "\u1EF2"=>"Y\u0300",
    "\u1EF3"=>"y\u0300",
    "\u1EF4"=>"Y\u0323",
    "\u1EF5"=>"y\u0323",
    "\u1EF6"=>"Y\u0309",
    "\u1EF7"=>"y\u0309",
    "\u1EF8"=>"Y\u0303",
    "\u1EF9"=>"y\u0303",
    "\u1F00"=>"\u03B1\u0313",
    "\u1F01"=>"\u03B1\u0314",
    "\u1F02"=>"\u03B1\u0313\u0300",
    "\u1F03"=>"\u03B1\u0314\u0300",
    "\u1F04"=>"\u03B1\u0313\u0301",
    "\u1F05"=>"\u03B1\u0314\u0301",
    "\u1F06"=>"\u03B1\u0313\u0342",
    "\u1F07"=>"\u03B1\u0314\u0342",
    "\u1F08"=>"\u0391\u0313",
    "\u1F09"=>"\u0391\u0314",
    "\u1F0A"=>"\u0391\u0313\u0300",
    "\u1F0B"=>"\u0391\u0314\u0300",
    "\u1F0C"=>"\u0391\u0313\u0301",
    "\u1F0D"=>"\u0391\u0314\u0301",
    "\u1F0E"=>"\u0391\u0313\u0342",
    "\u1F0F"=>"\u0391\u0314\u0342",
    "\u1F10"=>"\u03B5\u0313",
    "\u1F11"=>"\u03B5\u0314",
    "\u1F12"=>"\u03B5\u0313\u0300",
    "\u1F13"=>"\u03B5\u0314\u0300",
    "\u1F14"=>"\u03B5\u0313\u0301",
    "\u1F15"=>"\u03B5\u0314\u0301",
    "\u1F18"=>"\u0395\u0313",
    "\u1F19"=>"\u0395\u0314",
    "\u1F1A"=>"\u0395\u0313\u0300",
    "\u1F1B"=>"\u0395\u0314\u0300",
    "\u1F1C"=>"\u0395\u0313\u0301",
    "\u1F1D"=>"\u0395\u0314\u0301",
    "\u1F20"=>"\u03B7\u0313",
    "\u1F21"=>"\u03B7\u0314",
    "\u1F22"=>"\u03B7\u0313\u0300",
    "\u1F23"=>"\u03B7\u0314\u0300",
    "\u1F24"=>"\u03B7\u0313\u0301",
    "\u1F25"=>"\u03B7\u0314\u0301",
    "\u1F26"=>"\u03B7\u0313\u0342",
    "\u1F27"=>"\u03B7\u0314\u0342",
    "\u1F28"=>"\u0397\u0313",
    "\u1F29"=>"\u0397\u0314",
    "\u1F2A"=>"\u0397\u0313\u0300",
    "\u1F2B"=>"\u0397\u0314\u0300",
    "\u1F2C"=>"\u0397\u0313\u0301",
    "\u1F2D"=>"\u0397\u0314\u0301",
    "\u1F2E"=>"\u0397\u0313\u0342",
    "\u1F2F"=>"\u0397\u0314\u0342",
    "\u1F30"=>"\u03B9\u0313",
    "\u1F31"=>"\u03B9\u0314",
    "\u1F32"=>"\u03B9\u0313\u0300",
    "\u1F33"=>"\u03B9\u0314\u0300",
    "\u1F34"=>"\u03B9\u0313\u0301",
    "\u1F35"=>"\u03B9\u0314\u0301",
    "\u1F36"=>"\u03B9\u0313\u0342",
    "\u1F37"=>"\u03B9\u0314\u0342",
    "\u1F38"=>"\u0399\u0313",
    "\u1F39"=>"\u0399\u0314",
    "\u1F3A"=>"\u0399\u0313\u0300",
    "\u1F3B"=>"\u0399\u0314\u0300",
    "\u1F3C"=>"\u0399\u0313\u0301",
    "\u1F3D"=>"\u0399\u0314\u0301",
    "\u1F3E"=>"\u0399\u0313\u0342",
    "\u1F3F"=>"\u0399\u0314\u0342",
    "\u1F40"=>"\u03BF\u0313",
    "\u1F41"=>"\u03BF\u0314",
    "\u1F42"=>"\u03BF\u0313\u0300",
    "\u1F43"=>"\u03BF\u0314\u0300",
    "\u1F44"=>"\u03BF\u0313\u0301",
    "\u1F45"=>"\u03BF\u0314\u0301",
    "\u1F48"=>"\u039F\u0313",
    "\u1F49"=>"\u039F\u0314",
    "\u1F4A"=>"\u039F\u0313\u0300",
    "\u1F4B"=>"\u039F\u0314\u0300",
    "\u1F4C"=>"\u039F\u0313\u0301",
    "\u1F4D"=>"\u039F\u0314\u0301",
    "\u1F50"=>"\u03C5\u0313",
    "\u1F51"=>"\u03C5\u0314",
    "\u1F52"=>"\u03C5\u0313\u0300",
    "\u1F53"=>"\u03C5\u0314\u0300",
    "\u1F54"=>"\u03C5\u0313\u0301",
    "\u1F55"=>"\u03C5\u0314\u0301",
    "\u1F56"=>"\u03C5\u0313\u0342",
    "\u1F57"=>"\u03C5\u0314\u0342",
    "\u1F59"=>"\u03A5\u0314",
    "\u1F5B"=>"\u03A5\u0314\u0300",
    "\u1F5D"=>"\u03A5\u0314\u0301",
    "\u1F5F"=>"\u03A5\u0314\u0342",
    "\u1F60"=>"\u03C9\u0313",
    "\u1F61"=>"\u03C9\u0314",
    "\u1F62"=>"\u03C9\u0313\u0300",
    "\u1F63"=>"\u03C9\u0314\u0300",
    "\u1F64"=>"\u03C9\u0313\u0301",
    "\u1F65"=>"\u03C9\u0314\u0301",
    "\u1F66"=>"\u03C9\u0313\u0342",
    "\u1F67"=>"\u03C9\u0314\u0342",
    "\u1F68"=>"\u03A9\u0313",
    "\u1F69"=>"\u03A9\u0314",
    "\u1F6A"=>"\u03A9\u0313\u0300",
    "\u1F6B"=>"\u03A9\u0314\u0300",
    "\u1F6C"=>"\u03A9\u0313\u0301",
    "\u1F6D"=>"\u03A9\u0314\u0301",
    "\u1F6E"=>"\u03A9\u0313\u0342",
    "\u1F6F"=>"\u03A9\u0314\u0342",
    "\u1F70"=>"\u03B1\u0300",
    "\u1F71"=>"\u03B1\u0301",
    "\u1F72"=>"\u03B5\u0300",
    "\u1F73"=>"\u03B5\u0301",
    "\u1F74"=>"\u03B7\u0300",
    "\u1F75"=>"\u03B7\u0301",
    "\u1F76"=>"\u03B9\u0300",
    "\u1F77"=>"\u03B9\u0301",
    "\u1F78"=>"\u03BF\u0300",
    "\u1F79"=>"\u03BF\u0301",
    "\u1F7A"=>"\u03C5\u0300",
    "\u1F7B"=>"\u03C5\u0301",
    "\u1F7C"=>"\u03C9\u0300",
    "\u1F7D"=>"\u03C9\u0301",
    "\u1F80"=>"\u03B1\u0313\u0345",
    "\u1F81"=>"\u03B1\u0314\u0345",
    "\u1F82"=>"\u03B1\u0313\u0300\u0345",
    "\u1F83"=>"\u03B1\u0314\u0300\u0345",
    "\u1F84"=>"\u03B1\u0313\u0301\u0345",
    "\u1F85"=>"\u03B1\u0314\u0301\u0345",
    "\u1F86"=>"\u03B1\u0313\u0342\u0345",
    "\u1F87"=>"\u03B1\u0314\u0342\u0345",
    "\u1F88"=>"\u0391\u0313\u0345",
    "\u1F89"=>"\u0391\u0314\u0345",
    "\u1F8A"=>"\u0391\u0313\u0300\u0345",
    "\u1F8B"=>"\u0391\u0314\u0300\u0345",
    "\u1F8C"=>"\u0391\u0313\u0301\u0345",
    "\u1F8D"=>"\u0391\u0314\u0301\u0345",
    "\u1F8E"=>"\u0391\u0313\u0342\u0345",
    "\u1F8F"=>"\u0391\u0314\u0342\u0345",
    "\u1F90"=>"\u03B7\u0313\u0345",
    "\u1F91"=>"\u03B7\u0314\u0345",
    "\u1F92"=>"\u03B7\u0313\u0300\u0345",
    "\u1F93"=>"\u03B7\u0314\u0300\u0345",
    "\u1F94"=>"\u03B7\u0313\u0301\u0345",
    "\u1F95"=>"\u03B7\u0314\u0301\u0345",
    "\u1F96"=>"\u03B7\u0313\u0342\u0345",
    "\u1F97"=>"\u03B7\u0314\u0342\u0345",
    "\u1F98"=>"\u0397\u0313\u0345",
    "\u1F99"=>"\u0397\u0314\u0345",
    "\u1F9A"=>"\u0397\u0313\u0300\u0345",
    "\u1F9B"=>"\u0397\u0314\u0300\u0345",
    "\u1F9C"=>"\u0397\u0313\u0301\u0345",
    "\u1F9D"=>"\u0397\u0314\u0301\u0345",
    "\u1F9E"=>"\u0397\u0313\u0342\u0345",
    "\u1F9F"=>"\u0397\u0314\u0342\u0345",
    "\u1FA0"=>"\u03C9\u0313\u0345",
    "\u1FA1"=>"\u03C9\u0314\u0345",
    "\u1FA2"=>"\u03C9\u0313\u0300\u0345",
    "\u1FA3"=>"\u03C9\u0314\u0300\u0345",
    "\u1FA4"=>"\u03C9\u0313\u0301\u0345",
    "\u1FA5"=>"\u03C9\u0314\u0301\u0345",
    "\u1FA6"=>"\u03C9\u0313\u0342\u0345",
    "\u1FA7"=>"\u03C9\u0314\u0342\u0345",
    "\u1FA8"=>"\u03A9\u0313\u0345",
    "\u1FA9"=>"\u03A9\u0314\u0345",
    "\u1FAA"=>"\u03A9\u0313\u0300\u0345",
    "\u1FAB"=>"\u03A9\u0314\u0300\u0345",
    "\u1FAC"=>"\u03A9\u0313\u0301\u0345",
    "\u1FAD"=>"\u03A9\u0314\u0301\u0345",
    "\u1FAE"=>"\u03A9\u0313\u0342\u0345",
    "\u1FAF"=>"\u03A9\u0314\u0342\u0345",
    "\u1FB0"=>"\u03B1\u0306",
    "\u1FB1"=>"\u03B1\u0304",
    "\u1FB2"=>"\u03B1\u0300\u0345",
    "\u1FB3"=>"\u03B1\u0345",
    "\u1FB4"=>"\u03B1\u0301\u0345",
    "\u1FB6"=>"\u03B1\u0342",
    "\u1FB7"=>"\u03B1\u0342\u0345",
    "\u1FB8"=>"\u0391\u0306",
    "\u1FB9"=>"\u0391\u0304",
    "\u1FBA"=>"\u0391\u0300",
    "\u1FBB"=>"\u0391\u0301",
    "\u1FBC"=>"\u0391\u0345",
    "\u1FBE"=>"\u03B9",
    "\u1FC1"=>"\u00A8\u0342",
    "\u1FC2"=>"\u03B7\u0300\u0345",
    "\u1FC3"=>"\u03B7\u0345",
    "\u1FC4"=>"\u03B7\u0301\u0345",
    "\u1FC6"=>"\u03B7\u0342",
    "\u1FC7"=>"\u03B7\u0342\u0345",
    "\u1FC8"=>"\u0395\u0300",
    "\u1FC9"=>"\u0395\u0301",
    "\u1FCA"=>"\u0397\u0300",
    "\u1FCB"=>"\u0397\u0301",
    "\u1FCC"=>"\u0397\u0345",
    "\u1FCD"=>"\u1FBF\u0300",
    "\u1FCE"=>"\u1FBF\u0301",
    "\u1FCF"=>"\u1FBF\u0342",
    "\u1FD0"=>"\u03B9\u0306",
    "\u1FD1"=>"\u03B9\u0304",
    "\u1FD2"=>"\u03B9\u0308\u0300",
    "\u1FD3"=>"\u03B9\u0308\u0301",
    "\u1FD6"=>"\u03B9\u0342",
    "\u1FD7"=>"\u03B9\u0308\u0342",
    "\u1FD8"=>"\u0399\u0306",
    "\u1FD9"=>"\u0399\u0304",
    "\u1FDA"=>"\u0399\u0300",
    "\u1FDB"=>"\u0399\u0301",
    "\u1FDD"=>"\u1FFE\u0300",
    "\u1FDE"=>"\u1FFE\u0301",
    "\u1FDF"=>"\u1FFE\u0342",
    "\u1FE0"=>"\u03C5\u0306",
    "\u1FE1"=>"\u03C5\u0304",
    "\u1FE2"=>"\u03C5\u0308\u0300",
    "\u1FE3"=>"\u03C5\u0308\u0301",
    "\u1FE4"=>"\u03C1\u0313",
    "\u1FE5"=>"\u03C1\u0314",
    "\u1FE6"=>"\u03C5\u0342",
    "\u1FE7"=>"\u03C5\u0308\u0342",
    "\u1FE8"=>"\u03A5\u0306",
    "\u1FE9"=>"\u03A5\u0304",
    "\u1FEA"=>"\u03A5\u0300",
    "\u1FEB"=>"\u03A5\u0301",
    "\u1FEC"=>"\u03A1\u0314",
    "\u1FED"=>"\u00A8\u0300",
    "\u1FEE"=>"\u00A8\u0301",
    "\u1FEF"=>"`",
    "\u1FF2"=>"\u03C9\u0300\u0345",
    "\u1FF3"=>"\u03C9\u0345",
    "\u1FF4"=>"\u03C9\u0301\u0345",
    "\u1FF6"=>"\u03C9\u0342",
    "\u1FF7"=>"\u03C9\u0342\u0345",
    "\u1FF8"=>"\u039F\u0300",
    "\u1FF9"=>"\u039F\u0301",
    "\u1FFA"=>"\u03A9\u0300",
    "\u1FFB"=>"\u03A9\u0301",
    "\u1FFC"=>"\u03A9\u0345",
    "\u1FFD"=>"\u00B4",
    "\u2000"=>"\u2002",
    "\u2001"=>"\u2003",
    "\u2126"=>"\u03A9",
    "\u212A"=>"K",
    "\u212B"=>"A\u030A",
    "\u219A"=>"\u2190\u0338",
    "\u219B"=>"\u2192\u0338",
    "\u21AE"=>"\u2194\u0338",
    "\u21CD"=>"\u21D0\u0338",
    "\u21CE"=>"\u21D4\u0338",
    "\u21CF"=>"\u21D2\u0338",
    "\u2204"=>"\u2203\u0338",
    "\u2209"=>"\u2208\u0338",
    "\u220C"=>"\u220B\u0338",
    "\u2224"=>"\u2223\u0338",
    "\u2226"=>"\u2225\u0338",
    "\u2241"=>"\u223C\u0338",
    "\u2244"=>"\u2243\u0338",
    "\u2247"=>"\u2245\u0338",
    "\u2249"=>"\u2248\u0338",
    "\u2260"=>"=\u0338",
    "\u2262"=>"\u2261\u0338",
    "\u226D"=>"\u224D\u0338",
    "\u226E"=>"<\u0338",
    "\u226F"=>">\u0338",
    "\u2270"=>"\u2264\u0338",
    "\u2271"=>"\u2265\u0338",
    "\u2274"=>"\u2272\u0338",
    "\u2275"=>"\u2273\u0338",
    "\u2278"=>"\u2276\u0338",
    "\u2279"=>"\u2277\u0338",
    "\u2280"=>"\u227A\u0338",
    "\u2281"=>"\u227B\u0338",
    "\u2284"=>"\u2282\u0338",
    "\u2285"=>"\u2283\u0338",
    "\u2288"=>"\u2286\u0338",
    "\u2289"=>"\u2287\u0338",
    "\u22AC"=>"\u22A2\u0338",
    "\u22AD"=>"\u22A8\u0338",
    "\u22AE"=>"\u22A9\u0338",
    "\u22AF"=>"\u22AB\u0338",
    "\u22E0"=>"\u227C\u0338",
    "\u22E1"=>"\u227D\u0338",
    "\u22E2"=>"\u2291\u0338",
    "\u22E3"=>"\u2292\u0338",
    "\u22EA"=>"\u22B2\u0338",
    "\u22EB"=>"\u22B3\u0338",
    "\u22EC"=>"\u22B4\u0338",
    "\u22ED"=>"\u22B5\u0338",
    "\u2329"=>"\u3008",
    "\u232A"=>"\u3009",
    "\u2ADC"=>"\u2ADD\u0338",
    "\u304C"=>"\u304B\u3099",
    "\u304E"=>"\u304D\u3099",
    "\u3050"=>"\u304F\u3099",
    "\u3052"=>"\u3051\u3099",
    "\u3054"=>"\u3053\u3099",
    "\u3056"=>"\u3055\u3099",
    "\u3058"=>"\u3057\u3099",
    "\u305A"=>"\u3059\u3099",
    "\u305C"=>"\u305B\u3099",
    "\u305E"=>"\u305D\u3099",
    "\u3060"=>"\u305F\u3099",
    "\u3062"=>"\u3061\u3099",
    "\u3065"=>"\u3064\u3099",
    "\u3067"=>"\u3066\u3099",
    "\u3069"=>"\u3068\u3099",
    "\u3070"=>"\u306F\u3099",
    "\u3071"=>"\u306F\u309A",
    "\u3073"=>"\u3072\u3099",
    "\u3074"=>"\u3072\u309A",
    "\u3076"=>"\u3075\u3099",
    "\u3077"=>"\u3075\u309A",
    "\u3079"=>"\u3078\u3099",
    "\u307A"=>"\u3078\u309A",
    "\u307C"=>"\u307B\u3099",
    "\u307D"=>"\u307B\u309A",
    "\u3094"=>"\u3046\u3099",
    "\u309E"=>"\u309D\u3099",
    "\u30AC"=>"\u30AB\u3099",
    "\u30AE"=>"\u30AD\u3099",
    "\u30B0"=>"\u30AF\u3099",
    "\u30B2"=>"\u30B1\u3099",
    "\u30B4"=>"\u30B3\u3099",
    "\u30B6"=>"\u30B5\u3099",
    "\u30B8"=>"\u30B7\u3099",
    "\u30BA"=>"\u30B9\u3099",
    "\u30BC"=>"\u30BB\u3099",
    "\u30BE"=>"\u30BD\u3099",
    "\u30C0"=>"\u30BF\u3099",
    "\u30C2"=>"\u30C1\u3099",
    "\u30C5"=>"\u30C4\u3099",
    "\u30C7"=>"\u30C6\u3099",
    "\u30C9"=>"\u30C8\u3099",
    "\u30D0"=>"\u30CF\u3099",
    "\u30D1"=>"\u30CF\u309A",
    "\u30D3"=>"\u30D2\u3099",
    "\u30D4"=>"\u30D2\u309A",
    "\u30D6"=>"\u30D5\u3099",
    "\u30D7"=>"\u30D5\u309A",
    "\u30D9"=>"\u30D8\u3099",
    "\u30DA"=>"\u30D8\u309A",
    "\u30DC"=>"\u30DB\u3099",
    "\u30DD"=>"\u30DB\u309A",
    "\u30F4"=>"\u30A6\u3099",
    "\u30F7"=>"\u30EF\u3099",
    "\u30F8"=>"\u30F0\u3099",
    "\u30F9"=>"\u30F1\u3099",
    "\u30FA"=>"\u30F2\u3099",
    "\u30FE"=>"\u30FD\u3099",
    "\uF900"=>"\u8C48",
    "\uF901"=>"\u66F4",
    "\uF902"=>"\u8ECA",
    "\uF903"=>"\u8CC8",
    "\uF904"=>"\u6ED1",
    "\uF905"=>"\u4E32",
    "\uF906"=>"\u53E5",
    "\uF907"=>"\u9F9C",
    "\uF908"=>"\u9F9C",
    "\uF909"=>"\u5951",
    "\uF90A"=>"\u91D1",
    "\uF90B"=>"\u5587",
    "\uF90C"=>"\u5948",
    "\uF90D"=>"\u61F6",
    "\uF90E"=>"\u7669",
    "\uF90F"=>"\u7F85",
    "\uF910"=>"\u863F",
    "\uF911"=>"\u87BA",
    "\uF912"=>"\u88F8",
    "\uF913"=>"\u908F",
    "\uF914"=>"\u6A02",
    "\uF915"=>"\u6D1B",
    "\uF916"=>"\u70D9",
    "\uF917"=>"\u73DE",
    "\uF918"=>"\u843D",
    "\uF919"=>"\u916A",
    "\uF91A"=>"\u99F1",
    "\uF91B"=>"\u4E82",
    "\uF91C"=>"\u5375",
    "\uF91D"=>"\u6B04",
    "\uF91E"=>"\u721B",
    "\uF91F"=>"\u862D",
    "\uF920"=>"\u9E1E",
    "\uF921"=>"\u5D50",
    "\uF922"=>"\u6FEB",
    "\uF923"=>"\u85CD",
    "\uF924"=>"\u8964",
    "\uF925"=>"\u62C9",
    "\uF926"=>"\u81D8",
    "\uF927"=>"\u881F",
    "\uF928"=>"\u5ECA",
    "\uF929"=>"\u6717",
    "\uF92A"=>"\u6D6A",
    "\uF92B"=>"\u72FC",
    "\uF92C"=>"\u90CE",
    "\uF92D"=>"\u4F86",
    "\uF92E"=>"\u51B7",
    "\uF92F"=>"\u52DE",
    "\uF930"=>"\u64C4",
    "\uF931"=>"\u6AD3",
    "\uF932"=>"\u7210",
    "\uF933"=>"\u76E7",
    "\uF934"=>"\u8001",
    "\uF935"=>"\u8606",
    "\uF936"=>"\u865C",
    "\uF937"=>"\u8DEF",
    "\uF938"=>"\u9732",
    "\uF939"=>"\u9B6F",
    "\uF93A"=>"\u9DFA",
    "\uF93B"=>"\u788C",
    "\uF93C"=>"\u797F",
    "\uF93D"=>"\u7DA0",
    "\uF93E"=>"\u83C9",
    "\uF93F"=>"\u9304",
    "\uF940"=>"\u9E7F",
    "\uF941"=>"\u8AD6",
    "\uF942"=>"\u58DF",
    "\uF943"=>"\u5F04",
    "\uF944"=>"\u7C60",
    "\uF945"=>"\u807E",
    "\uF946"=>"\u7262",
    "\uF947"=>"\u78CA",
    "\uF948"=>"\u8CC2",
    "\uF949"=>"\u96F7",
    "\uF94A"=>"\u58D8",
    "\uF94B"=>"\u5C62",
    "\uF94C"=>"\u6A13",
    "\uF94D"=>"\u6DDA",
    "\uF94E"=>"\u6F0F",
    "\uF94F"=>"\u7D2F",
    "\uF950"=>"\u7E37",
    "\uF951"=>"\u964B",
    "\uF952"=>"\u52D2",
    "\uF953"=>"\u808B",
    "\uF954"=>"\u51DC",
    "\uF955"=>"\u51CC",
    "\uF956"=>"\u7A1C",
    "\uF957"=>"\u7DBE",
    "\uF958"=>"\u83F1",
    "\uF959"=>"\u9675",
    "\uF95A"=>"\u8B80",
    "\uF95B"=>"\u62CF",
    "\uF95C"=>"\u6A02",
    "\uF95D"=>"\u8AFE",
    "\uF95E"=>"\u4E39",
    "\uF95F"=>"\u5BE7",
    "\uF960"=>"\u6012",
    "\uF961"=>"\u7387",
    "\uF962"=>"\u7570",
    "\uF963"=>"\u5317",
    "\uF964"=>"\u78FB",
    "\uF965"=>"\u4FBF",
    "\uF966"=>"\u5FA9",
    "\uF967"=>"\u4E0D",
    "\uF968"=>"\u6CCC",
    "\uF969"=>"\u6578",
    "\uF96A"=>"\u7D22",
    "\uF96B"=>"\u53C3",
    "\uF96C"=>"\u585E",
    "\uF96D"=>"\u7701",
    "\uF96E"=>"\u8449",
    "\uF96F"=>"\u8AAA",
    "\uF970"=>"\u6BBA",
    "\uF971"=>"\u8FB0",
    "\uF972"=>"\u6C88",
    "\uF973"=>"\u62FE",
    "\uF974"=>"\u82E5",
    "\uF975"=>"\u63A0",
    "\uF976"=>"\u7565",
    "\uF977"=>"\u4EAE",
    "\uF978"=>"\u5169",
    "\uF979"=>"\u51C9",
    "\uF97A"=>"\u6881",
    "\uF97B"=>"\u7CE7",
    "\uF97C"=>"\u826F",
    "\uF97D"=>"\u8AD2",
    "\uF97E"=>"\u91CF",
    "\uF97F"=>"\u52F5",
    "\uF980"=>"\u5442",
    "\uF981"=>"\u5973",
    "\uF982"=>"\u5EEC",
    "\uF983"=>"\u65C5",
    "\uF984"=>"\u6FFE",
    "\uF985"=>"\u792A",
    "\uF986"=>"\u95AD",
    "\uF987"=>"\u9A6A",
    "\uF988"=>"\u9E97",
    "\uF989"=>"\u9ECE",
    "\uF98A"=>"\u529B",
    "\uF98B"=>"\u66C6",
    "\uF98C"=>"\u6B77",
    "\uF98D"=>"\u8F62",
    "\uF98E"=>"\u5E74",
    "\uF98F"=>"\u6190",
    "\uF990"=>"\u6200",
    "\uF991"=>"\u649A",
    "\uF992"=>"\u6F23",
    "\uF993"=>"\u7149",
    "\uF994"=>"\u7489",
    "\uF995"=>"\u79CA",
    "\uF996"=>"\u7DF4",
    "\uF997"=>"\u806F",
    "\uF998"=>"\u8F26",
    "\uF999"=>"\u84EE",
    "\uF99A"=>"\u9023",
    "\uF99B"=>"\u934A",
    "\uF99C"=>"\u5217",
    "\uF99D"=>"\u52A3",
    "\uF99E"=>"\u54BD",
    "\uF99F"=>"\u70C8",
    "\uF9A0"=>"\u88C2",
    "\uF9A1"=>"\u8AAA",
    "\uF9A2"=>"\u5EC9",
    "\uF9A3"=>"\u5FF5",
    "\uF9A4"=>"\u637B",
    "\uF9A5"=>"\u6BAE",
    "\uF9A6"=>"\u7C3E",
    "\uF9A7"=>"\u7375",
    "\uF9A8"=>"\u4EE4",
    "\uF9A9"=>"\u56F9",
    "\uF9AA"=>"\u5BE7",
    "\uF9AB"=>"\u5DBA",
    "\uF9AC"=>"\u601C",
    "\uF9AD"=>"\u73B2",
    "\uF9AE"=>"\u7469",
    "\uF9AF"=>"\u7F9A",
    "\uF9B0"=>"\u8046",
    "\uF9B1"=>"\u9234",
    "\uF9B2"=>"\u96F6",
    "\uF9B3"=>"\u9748",
    "\uF9B4"=>"\u9818",
    "\uF9B5"=>"\u4F8B",
    "\uF9B6"=>"\u79AE",
    "\uF9B7"=>"\u91B4",
    "\uF9B8"=>"\u96B8",
    "\uF9B9"=>"\u60E1",
    "\uF9BA"=>"\u4E86",
    "\uF9BB"=>"\u50DA",
    "\uF9BC"=>"\u5BEE",
    "\uF9BD"=>"\u5C3F",
    "\uF9BE"=>"\u6599",
    "\uF9BF"=>"\u6A02",
    "\uF9C0"=>"\u71CE",
    "\uF9C1"=>"\u7642",
    "\uF9C2"=>"\u84FC",
    "\uF9C3"=>"\u907C",
    "\uF9C4"=>"\u9F8D",
    "\uF9C5"=>"\u6688",
    "\uF9C6"=>"\u962E",
    "\uF9C7"=>"\u5289",
    "\uF9C8"=>"\u677B",
    "\uF9C9"=>"\u67F3",
    "\uF9CA"=>"\u6D41",
    "\uF9CB"=>"\u6E9C",
    "\uF9CC"=>"\u7409",
    "\uF9CD"=>"\u7559",
    "\uF9CE"=>"\u786B",
    "\uF9CF"=>"\u7D10",
    "\uF9D0"=>"\u985E",
    "\uF9D1"=>"\u516D",
    "\uF9D2"=>"\u622E",
    "\uF9D3"=>"\u9678",
    "\uF9D4"=>"\u502B",
    "\uF9D5"=>"\u5D19",
    "\uF9D6"=>"\u6DEA",
    "\uF9D7"=>"\u8F2A",
    "\uF9D8"=>"\u5F8B",
    "\uF9D9"=>"\u6144",
    "\uF9DA"=>"\u6817",
    "\uF9DB"=>"\u7387",
    "\uF9DC"=>"\u9686",
    "\uF9DD"=>"\u5229",
    "\uF9DE"=>"\u540F",
    "\uF9DF"=>"\u5C65",
    "\uF9E0"=>"\u6613",
    "\uF9E1"=>"\u674E",
    "\uF9E2"=>"\u68A8",
    "\uF9E3"=>"\u6CE5",
    "\uF9E4"=>"\u7406",
    "\uF9E5"=>"\u75E2",
    "\uF9E6"=>"\u7F79",
    "\uF9E7"=>"\u88CF",
    "\uF9E8"=>"\u88E1",
    "\uF9E9"=>"\u91CC",
    "\uF9EA"=>"\u96E2",
    "\uF9EB"=>"\u533F",
    "\uF9EC"=>"\u6EBA",
    "\uF9ED"=>"\u541D",
    "\uF9EE"=>"\u71D0",
    "\uF9EF"=>"\u7498",
    "\uF9F0"=>"\u85FA",
    "\uF9F1"=>"\u96A3",
    "\uF9F2"=>"\u9C57",
    "\uF9F3"=>"\u9E9F",
    "\uF9F4"=>"\u6797",
    "\uF9F5"=>"\u6DCB",
    "\uF9F6"=>"\u81E8",
    "\uF9F7"=>"\u7ACB",
    "\uF9F8"=>"\u7B20",
    "\uF9F9"=>"\u7C92",
    "\uF9FA"=>"\u72C0",
    "\uF9FB"=>"\u7099",
    "\uF9FC"=>"\u8B58",
    "\uF9FD"=>"\u4EC0",
    "\uF9FE"=>"\u8336",
    "\uF9FF"=>"\u523A",
    "\uFA00"=>"\u5207",
    "\uFA01"=>"\u5EA6",
    "\uFA02"=>"\u62D3",
    "\uFA03"=>"\u7CD6",
    "\uFA04"=>"\u5B85",
    "\uFA05"=>"\u6D1E",
    "\uFA06"=>"\u66B4",
    "\uFA07"=>"\u8F3B",
    "\uFA08"=>"\u884C",
    "\uFA09"=>"\u964D",
    "\uFA0A"=>"\u898B",
    "\uFA0B"=>"\u5ED3",
    "\uFA0C"=>"\u5140",
    "\uFA0D"=>"\u55C0",
    "\uFA10"=>"\u585A",
    "\uFA12"=>"\u6674",
    "\uFA15"=>"\u51DE",
    "\uFA16"=>"\u732A",
    "\uFA17"=>"\u76CA",
    "\uFA18"=>"\u793C",
    "\uFA19"=>"\u795E",
    "\uFA1A"=>"\u7965",
    "\uFA1B"=>"\u798F",
    "\uFA1C"=>"\u9756",
    "\uFA1D"=>"\u7CBE",
    "\uFA1E"=>"\u7FBD",
    "\uFA20"=>"\u8612",
    "\uFA22"=>"\u8AF8",
    "\uFA25"=>"\u9038",
    "\uFA26"=>"\u90FD",
    "\uFA2A"=>"\u98EF",
    "\uFA2B"=>"\u98FC",
    "\uFA2C"=>"\u9928",
    "\uFA2D"=>"\u9DB4",
    "\uFA2E"=>"\u90DE",
    "\uFA2F"=>"\u96B7",
    "\uFA30"=>"\u4FAE",
    "\uFA31"=>"\u50E7",
    "\uFA32"=>"\u514D",
    "\uFA33"=>"\u52C9",
    "\uFA34"=>"\u52E4",
    "\uFA35"=>"\u5351",
    "\uFA36"=>"\u559D",
    "\uFA37"=>"\u5606",
    "\uFA38"=>"\u5668",
    "\uFA39"=>"\u5840",
    "\uFA3A"=>"\u58A8",
    "\uFA3B"=>"\u5C64",
    "\uFA3C"=>"\u5C6E",
    "\uFA3D"=>"\u6094",
    "\uFA3E"=>"\u6168",
    "\uFA3F"=>"\u618E",
    "\uFA40"=>"\u61F2",
    "\uFA41"=>"\u654F",
    "\uFA42"=>"\u65E2",
    "\uFA43"=>"\u6691",
    "\uFA44"=>"\u6885",
    "\uFA45"=>"\u6D77",
    "\uFA46"=>"\u6E1A",
    "\uFA47"=>"\u6F22",
    "\uFA48"=>"\u716E",
    "\uFA49"=>"\u722B",
    "\uFA4A"=>"\u7422",
    "\uFA4B"=>"\u7891",
    "\uFA4C"=>"\u793E",
    "\uFA4D"=>"\u7949",
    "\uFA4E"=>"\u7948",
    "\uFA4F"=>"\u7950",
    "\uFA50"=>"\u7956",
    "\uFA51"=>"\u795D",
    "\uFA52"=>"\u798D",
    "\uFA53"=>"\u798E",
    "\uFA54"=>"\u7A40",
    "\uFA55"=>"\u7A81",
    "\uFA56"=>"\u7BC0",
    "\uFA57"=>"\u7DF4",
    "\uFA58"=>"\u7E09",
    "\uFA59"=>"\u7E41",
    "\uFA5A"=>"\u7F72",
    "\uFA5B"=>"\u8005",
    "\uFA5C"=>"\u81ED",
    "\uFA5D"=>"\u8279",
    "\uFA5E"=>"\u8279",
    "\uFA5F"=>"\u8457",
    "\uFA60"=>"\u8910",
    "\uFA61"=>"\u8996",
    "\uFA62"=>"\u8B01",
    "\uFA63"=>"\u8B39",
    "\uFA64"=>"\u8CD3",
    "\uFA65"=>"\u8D08",
    "\uFA66"=>"\u8FB6",
    "\uFA67"=>"\u9038",
    "\uFA68"=>"\u96E3",
    "\uFA69"=>"\u97FF",
    "\uFA6A"=>"\u983B",
    "\uFA6B"=>"\u6075",
    "\uFA6C"=>"\u{242EE}",
    "\uFA6D"=>"\u8218",
    "\uFA70"=>"\u4E26",
    "\uFA71"=>"\u51B5",
    "\uFA72"=>"\u5168",
    "\uFA73"=>"\u4F80",
    "\uFA74"=>"\u5145",
    "\uFA75"=>"\u5180",
    "\uFA76"=>"\u52C7",
    "\uFA77"=>"\u52FA",
    "\uFA78"=>"\u559D",
    "\uFA79"=>"\u5555",
    "\uFA7A"=>"\u5599",
    "\uFA7B"=>"\u55E2",
    "\uFA7C"=>"\u585A",
    "\uFA7D"=>"\u58B3",
    "\uFA7E"=>"\u5944",
    "\uFA7F"=>"\u5954",
    "\uFA80"=>"\u5A62",
    "\uFA81"=>"\u5B28",
    "\uFA82"=>"\u5ED2",
    "\uFA83"=>"\u5ED9",
    "\uFA84"=>"\u5F69",
    "\uFA85"=>"\u5FAD",
    "\uFA86"=>"\u60D8",
    "\uFA87"=>"\u614E",
    "\uFA88"=>"\u6108",
    "\uFA89"=>"\u618E",
    "\uFA8A"=>"\u6160",
    "\uFA8B"=>"\u61F2",
    "\uFA8C"=>"\u6234",
    "\uFA8D"=>"\u63C4",
    "\uFA8E"=>"\u641C",
    "\uFA8F"=>"\u6452",
    "\uFA90"=>"\u6556",
    "\uFA91"=>"\u6674",
    "\uFA92"=>"\u6717",
    "\uFA93"=>"\u671B",
    "\uFA94"=>"\u6756",
    "\uFA95"=>"\u6B79",
    "\uFA96"=>"\u6BBA",
    "\uFA97"=>"\u6D41",
    "\uFA98"=>"\u6EDB",
    "\uFA99"=>"\u6ECB",
    "\uFA9A"=>"\u6F22",
    "\uFA9B"=>"\u701E",
    "\uFA9C"=>"\u716E",
    "\uFA9D"=>"\u77A7",
    "\uFA9E"=>"\u7235",
    "\uFA9F"=>"\u72AF",
    "\uFAA0"=>"\u732A",
    "\uFAA1"=>"\u7471",
    "\uFAA2"=>"\u7506",
    "\uFAA3"=>"\u753B",
    "\uFAA4"=>"\u761D",
    "\uFAA5"=>"\u761F",
    "\uFAA6"=>"\u76CA",
    "\uFAA7"=>"\u76DB",
    "\uFAA8"=>"\u76F4",
    "\uFAA9"=>"\u774A",
    "\uFAAA"=>"\u7740",
    "\uFAAB"=>"\u78CC",
    "\uFAAC"=>"\u7AB1",
    "\uFAAD"=>"\u7BC0",
    "\uFAAE"=>"\u7C7B",
    "\uFAAF"=>"\u7D5B",
    "\uFAB0"=>"\u7DF4",
    "\uFAB1"=>"\u7F3E",
    "\uFAB2"=>"\u8005",
    "\uFAB3"=>"\u8352",
    "\uFAB4"=>"\u83EF",
    "\uFAB5"=>"\u8779",
    "\uFAB6"=>"\u8941",
    "\uFAB7"=>"\u8986",
    "\uFAB8"=>"\u8996",
    "\uFAB9"=>"\u8ABF",
    "\uFABA"=>"\u8AF8",
    "\uFABB"=>"\u8ACB",
    "\uFABC"=>"\u8B01",
    "\uFABD"=>"\u8AFE",
    "\uFABE"=>"\u8AED",
    "\uFABF"=>"\u8B39",
    "\uFAC0"=>"\u8B8A",
    "\uFAC1"=>"\u8D08",
    "\uFAC2"=>"\u8F38",
    "\uFAC3"=>"\u9072",
    "\uFAC4"=>"\u9199",
    "\uFAC5"=>"\u9276",
    "\uFAC6"=>"\u967C",
    "\uFAC7"=>"\u96E3",
    "\uFAC8"=>"\u9756",
    "\uFAC9"=>"\u97DB",
    "\uFACA"=>"\u97FF",
    "\uFACB"=>"\u980B",
    "\uFACC"=>"\u983B",
    "\uFACD"=>"\u9B12",
    "\uFACE"=>"\u9F9C",
    "\uFACF"=>"\u{2284A}",
    "\uFAD0"=>"\u{22844}",
    "\uFAD1"=>"\u{233D5}",
    "\uFAD2"=>"\u3B9D",
    "\uFAD3"=>"\u4018",
    "\uFAD4"=>"\u4039",
    "\uFAD5"=>"\u{25249}",
    "\uFAD6"=>"\u{25CD0}",
    "\uFAD7"=>"\u{27ED3}",
    "\uFAD8"=>"\u9F43",
    "\uFAD9"=>"\u9F8E",
    "\uFB1D"=>"\u05D9\u05B4",
    "\uFB1F"=>"\u05F2\u05B7",
    "\uFB2A"=>"\u05E9\u05C1",
    "\uFB2B"=>"\u05E9\u05C2",
    "\uFB2C"=>"\u05E9\u05BC\u05C1",
    "\uFB2D"=>"\u05E9\u05BC\u05C2",
    "\uFB2E"=>"\u05D0\u05B7",
    "\uFB2F"=>"\u05D0\u05B8",
    "\uFB30"=>"\u05D0\u05BC",
    "\uFB31"=>"\u05D1\u05BC",
    "\uFB32"=>"\u05D2\u05BC",
    "\uFB33"=>"\u05D3\u05BC",
    "\uFB34"=>"\u05D4\u05BC",
    "\uFB35"=>"\u05D5\u05BC",
    "\uFB36"=>"\u05D6\u05BC",
    "\uFB38"=>"\u05D8\u05BC",
    "\uFB39"=>"\u05D9\u05BC",
    "\uFB3A"=>"\u05DA\u05BC",
    "\uFB3B"=>"\u05DB\u05BC",
    "\uFB3C"=>"\u05DC\u05BC",
    "\uFB3E"=>"\u05DE\u05BC",
    "\uFB40"=>"\u05E0\u05BC",
    "\uFB41"=>"\u05E1\u05BC",
    "\uFB43"=>"\u05E3\u05BC",
    "\uFB44"=>"\u05E4\u05BC",
    "\uFB46"=>"\u05E6\u05BC",
    "\uFB47"=>"\u05E7\u05BC",
    "\uFB48"=>"\u05E8\u05BC",
    "\uFB49"=>"\u05E9\u05BC",
    "\uFB4A"=>"\u05EA\u05BC",
    "\uFB4B"=>"\u05D5\u05B9",
    "\uFB4C"=>"\u05D1\u05BF",
    "\uFB4D"=>"\u05DB\u05BF",
    "\uFB4E"=>"\u05E4\u05BF",
    "\u{1109A}"=>"\u{11099}\u{110BA}",
    "\u{1109C}"=>"\u{1109B}\u{110BA}",
    "\u{110AB}"=>"\u{110A5}\u{110BA}",
    "\u{1112E}"=>"\u{11131}\u{11127}",
    "\u{1112F}"=>"\u{11132}\u{11127}",
    "\u{1134B}"=>"\u{11347}\u{1133E}",
    "\u{1134C}"=>"\u{11347}\u{11357}",
    "\u{114BB}"=>"\u{114B9}\u{114BA}",
    "\u{114BC}"=>"\u{114B9}\u{114B0}",
    "\u{114BE}"=>"\u{114B9}\u{114BD}",
    "\u{115BA}"=>"\u{115B8}\u{115AF}",
    "\u{115BB}"=>"\u{115B9}\u{115AF}",
    "\u{11938}"=>"\u{11935}\u{11930}",
    "\u{1D15E}"=>"\u{1D157}\u{1D165}",
    "\u{1D15F}"=>"\u{1D158}\u{1D165}",
    "\u{1D160}"=>"\u{1D158}\u{1D165}\u{1D16E}",
    "\u{1D161}"=>"\u{1D158}\u{1D165}\u{1D16F}",
    "\u{1D162}"=>"\u{1D158}\u{1D165}\u{1D170}",
    "\u{1D163}"=>"\u{1D158}\u{1D165}\u{1D171}",
    "\u{1D164}"=>"\u{1D158}\u{1D165}\u{1D172}",
    "\u{1D1BB}"=>"\u{1D1B9}\u{1D165}",
    "\u{1D1BC}"=>"\u{1D1BA}\u{1D165}",
    "\u{1D1BD}"=>"\u{1D1B9}\u{1D165}\u{1D16E}",
    "\u{1D1BE}"=>"\u{1D1BA}\u{1D165}\u{1D16E}",
    "\u{1D1BF}"=>"\u{1D1B9}\u{1D165}\u{1D16F}",
    "\u{1D1C0}"=>"\u{1D1BA}\u{1D165}\u{1D16F}",
    "\u{2F800}"=>"\u4E3D",
    "\u{2F801}"=>"\u4E38",
    "\u{2F802}"=>"\u4E41",
    "\u{2F803}"=>"\u{20122}",
    "\u{2F804}"=>"\u4F60",
    "\u{2F805}"=>"\u4FAE",
    "\u{2F806}"=>"\u4FBB",
    "\u{2F807}"=>"\u5002",
    "\u{2F808}"=>"\u507A",
    "\u{2F809}"=>"\u5099",
    "\u{2F80A}"=>"\u50E7",
    "\u{2F80B}"=>"\u50CF",
    "\u{2F80C}"=>"\u349E",
    "\u{2F80D}"=>"\u{2063A}",
    "\u{2F80E}"=>"\u514D",
    "\u{2F80F}"=>"\u5154",
    "\u{2F810}"=>"\u5164",
    "\u{2F811}"=>"\u5177",
    "\u{2F812}"=>"\u{2051C}",
    "\u{2F813}"=>"\u34B9",
    "\u{2F814}"=>"\u5167",
    "\u{2F815}"=>"\u518D",
    "\u{2F816}"=>"\u{2054B}",
    "\u{2F817}"=>"\u5197",
    "\u{2F818}"=>"\u51A4",
    "\u{2F819}"=>"\u4ECC",
    "\u{2F81A}"=>"\u51AC",
    "\u{2F81B}"=>"\u51B5",
    "\u{2F81C}"=>"\u{291DF}",
    "\u{2F81D}"=>"\u51F5",
    "\u{2F81E}"=>"\u5203",
    "\u{2F81F}"=>"\u34DF",
    "\u{2F820}"=>"\u523B",
    "\u{2F821}"=>"\u5246",
    "\u{2F822}"=>"\u5272",
    "\u{2F823}"=>"\u5277",
    "\u{2F824}"=>"\u3515",
    "\u{2F825}"=>"\u52C7",
    "\u{2F826}"=>"\u52C9",
    "\u{2F827}"=>"\u52E4",
    "\u{2F828}"=>"\u52FA",
    "\u{2F829}"=>"\u5305",
    "\u{2F82A}"=>"\u5306",
    "\u{2F82B}"=>"\u5317",
    "\u{2F82C}"=>"\u5349",
    "\u{2F82D}"=>"\u5351",
    "\u{2F82E}"=>"\u535A",
    "\u{2F82F}"=>"\u5373",
    "\u{2F830}"=>"\u537D",
    "\u{2F831}"=>"\u537F",
    "\u{2F832}"=>"\u537F",
    "\u{2F833}"=>"\u537F",
    "\u{2F834}"=>"\u{20A2C}",
    "\u{2F835}"=>"\u7070",
    "\u{2F836}"=>"\u53CA",
    "\u{2F837}"=>"\u53DF",
    "\u{2F838}"=>"\u{20B63}",
    "\u{2F839}"=>"\u53EB",
    "\u{2F83A}"=>"\u53F1",
    "\u{2F83B}"=>"\u5406",
    "\u{2F83C}"=>"\u549E",
    "\u{2F83D}"=>"\u5438",
    "\u{2F83E}"=>"\u5448",
    "\u{2F83F}"=>"\u5468",
    "\u{2F840}"=>"\u54A2",
    "\u{2F841}"=>"\u54F6",
    "\u{2F842}"=>"\u5510",
    "\u{2F843}"=>"\u5553",
    "\u{2F844}"=>"\u5563",
    "\u{2F845}"=>"\u5584",
    "\u{2F846}"=>"\u5584",
    "\u{2F847}"=>"\u5599",
    "\u{2F848}"=>"\u55AB",
    "\u{2F849}"=>"\u55B3",
    "\u{2F84A}"=>"\u55C2",
    "\u{2F84B}"=>"\u5716",
    "\u{2F84C}"=>"\u5606",
    "\u{2F84D}"=>"\u5717",
    "\u{2F84E}"=>"\u5651",
    "\u{2F84F}"=>"\u5674",
    "\u{2F850}"=>"\u5207",
    "\u{2F851}"=>"\u58EE",
    "\u{2F852}"=>"\u57CE",
    "\u{2F853}"=>"\u57F4",
    "\u{2F854}"=>"\u580D",
    "\u{2F855}"=>"\u578B",
    "\u{2F856}"=>"\u5832",
    "\u{2F857}"=>"\u5831",
    "\u{2F858}"=>"\u58AC",
    "\u{2F859}"=>"\u{214E4}",
    "\u{2F85A}"=>"\u58F2",
    "\u{2F85B}"=>"\u58F7",
    "\u{2F85C}"=>"\u5906",
    "\u{2F85D}"=>"\u591A",
    "\u{2F85E}"=>"\u5922",
    "\u{2F85F}"=>"\u5962",
    "\u{2F860}"=>"\u{216A8}",
    "\u{2F861}"=>"\u{216EA}",
    "\u{2F862}"=>"\u59EC",
    "\u{2F863}"=>"\u5A1B",
    "\u{2F864}"=>"\u5A27",
    "\u{2F865}"=>"\u59D8",
    "\u{2F866}"=>"\u5A66",
    "\u{2F867}"=>"\u36EE",
    "\u{2F868}"=>"\u36FC",
    "\u{2F869}"=>"\u5B08",
    "\u{2F86A}"=>"\u5B3E",
    "\u{2F86B}"=>"\u5B3E",
    "\u{2F86C}"=>"\u{219C8}",
    "\u{2F86D}"=>"\u5BC3",
    "\u{2F86E}"=>"\u5BD8",
    "\u{2F86F}"=>"\u5BE7",
    "\u{2F870}"=>"\u5BF3",
    "\u{2F871}"=>"\u{21B18}",
    "\u{2F872}"=>"\u5BFF",
    "\u{2F873}"=>"\u5C06",
    "\u{2F874}"=>"\u5F53",
    "\u{2F875}"=>"\u5C22",
    "\u{2F876}"=>"\u3781",
    "\u{2F877}"=>"\u5C60",
    "\u{2F878}"=>"\u5C6E",
    "\u{2F879}"=>"\u5CC0",
    "\u{2F87A}"=>"\u5C8D",
    "\u{2F87B}"=>"\u{21DE4}",
    "\u{2F87C}"=>"\u5D43",
    "\u{2F87D}"=>"\u{21DE6}",
    "\u{2F87E}"=>"\u5D6E",
    "\u{2F87F}"=>"\u5D6B",
    "\u{2F880}"=>"\u5D7C",
    "\u{2F881}"=>"\u5DE1",
    "\u{2F882}"=>"\u5DE2",
    "\u{2F883}"=>"\u382F",
    "\u{2F884}"=>"\u5DFD",
    "\u{2F885}"=>"\u5E28",
    "\u{2F886}"=>"\u5E3D",
    "\u{2F887}"=>"\u5E69",
    "\u{2F888}"=>"\u3862",
    "\u{2F889}"=>"\u{22183}",
    "\u{2F88A}"=>"\u387C",
    "\u{2F88B}"=>"\u5EB0",
    "\u{2F88C}"=>"\u5EB3",
    "\u{2F88D}"=>"\u5EB6",
    "\u{2F88E}"=>"\u5ECA",
    "\u{2F88F}"=>"\u{2A392}",
    "\u{2F890}"=>"\u5EFE",
    "\u{2F891}"=>"\u{22331}",
    "\u{2F892}"=>"\u{22331}",
    "\u{2F893}"=>"\u8201",
    "\u{2F894}"=>"\u5F22",
    "\u{2F895}"=>"\u5F22",
    "\u{2F896}"=>"\u38C7",
    "\u{2F897}"=>"\u{232B8}",
    "\u{2F898}"=>"\u{261DA}",
    "\u{2F899}"=>"\u5F62",
    "\u{2F89A}"=>"\u5F6B",
    "\u{2F89B}"=>"\u38E3",
    "\u{2F89C}"=>"\u5F9A",
    "\u{2F89D}"=>"\u5FCD",
    "\u{2F89E}"=>"\u5FD7",
    "\u{2F89F}"=>"\u5FF9",
    "\u{2F8A0}"=>"\u6081",
    "\u{2F8A1}"=>"\u393A",
    "\u{2F8A2}"=>"\u391C",
    "\u{2F8A3}"=>"\u6094",
    "\u{2F8A4}"=>"\u{226D4}",
    "\u{2F8A5}"=>"\u60C7",
    "\u{2F8A6}"=>"\u6148",
    "\u{2F8A7}"=>"\u614C",
    "\u{2F8A8}"=>"\u614E",
    "\u{2F8A9}"=>"\u614C",
    "\u{2F8AA}"=>"\u617A",
    "\u{2F8AB}"=>"\u618E",
    "\u{2F8AC}"=>"\u61B2",
    "\u{2F8AD}"=>"\u61A4",
    "\u{2F8AE}"=>"\u61AF",
    "\u{2F8AF}"=>"\u61DE",
    "\u{2F8B0}"=>"\u61F2",
    "\u{2F8B1}"=>"\u61F6",
    "\u{2F8B2}"=>"\u6210",
    "\u{2F8B3}"=>"\u621B",
    "\u{2F8B4}"=>"\u625D",
    "\u{2F8B5}"=>"\u62B1",
    "\u{2F8B6}"=>"\u62D4",
    "\u{2F8B7}"=>"\u6350",
    "\u{2F8B8}"=>"\u{22B0C}",
    "\u{2F8B9}"=>"\u633D",
    "\u{2F8BA}"=>"\u62FC",
    "\u{2F8BB}"=>"\u6368",
    "\u{2F8BC}"=>"\u6383",
    "\u{2F8BD}"=>"\u63E4",
    "\u{2F8BE}"=>"\u{22BF1}",
    "\u{2F8BF}"=>"\u6422",
    "\u{2F8C0}"=>"\u63C5",
    "\u{2F8C1}"=>"\u63A9",
    "\u{2F8C2}"=>"\u3A2E",
    "\u{2F8C3}"=>"\u6469",
    "\u{2F8C4}"=>"\u647E",
    "\u{2F8C5}"=>"\u649D",
    "\u{2F8C6}"=>"\u6477",
    "\u{2F8C7}"=>"\u3A6C",
    "\u{2F8C8}"=>"\u654F",
    "\u{2F8C9}"=>"\u656C",
    "\u{2F8CA}"=>"\u{2300A}",
    "\u{2F8CB}"=>"\u65E3",
    "\u{2F8CC}"=>"\u66F8",
    "\u{2F8CD}"=>"\u6649",
    "\u{2F8CE}"=>"\u3B19",
    "\u{2F8CF}"=>"\u6691",
    "\u{2F8D0}"=>"\u3B08",
    "\u{2F8D1}"=>"\u3AE4",
    "\u{2F8D2}"=>"\u5192",
    "\u{2F8D3}"=>"\u5195",
    "\u{2F8D4}"=>"\u6700",
    "\u{2F8D5}"=>"\u669C",
    "\u{2F8D6}"=>"\u80AD",
    "\u{2F8D7}"=>"\u43D9",
    "\u{2F8D8}"=>"\u6717",
    "\u{2F8D9}"=>"\u671B",
    "\u{2F8DA}"=>"\u6721",
    "\u{2F8DB}"=>"\u675E",
    "\u{2F8DC}"=>"\u6753",
    "\u{2F8DD}"=>"\u{233C3}",
    "\u{2F8DE}"=>"\u3B49",
    "\u{2F8DF}"=>"\u67FA",
    "\u{2F8E0}"=>"\u6785",
    "\u{2F8E1}"=>"\u6852",
    "\u{2F8E2}"=>"\u6885",
    "\u{2F8E3}"=>"\u{2346D}",
    "\u{2F8E4}"=>"\u688E",
    "\u{2F8E5}"=>"\u681F",
    "\u{2F8E6}"=>"\u6914",
    "\u{2F8E7}"=>"\u3B9D",
    "\u{2F8E8}"=>"\u6942",
    "\u{2F8E9}"=>"\u69A3",
    "\u{2F8EA}"=>"\u69EA",
    "\u{2F8EB}"=>"\u6AA8",
    "\u{2F8EC}"=>"\u{236A3}",
    "\u{2F8ED}"=>"\u6ADB",
    "\u{2F8EE}"=>"\u3C18",
    "\u{2F8EF}"=>"\u6B21",
    "\u{2F8F0}"=>"\u{238A7}",
    "\u{2F8F1}"=>"\u6B54",
    "\u{2F8F2}"=>"\u3C4E",
    "\u{2F8F3}"=>"\u6B72",
    "\u{2F8F4}"=>"\u6B9F",
    "\u{2F8F5}"=>"\u6BBA",
    "\u{2F8F6}"=>"\u6BBB",
    "\u{2F8F7}"=>"\u{23A8D}",
    "\u{2F8F8}"=>"\u{21D0B}",
    "\u{2F8F9}"=>"\u{23AFA}",
    "\u{2F8FA}"=>"\u6C4E",
    "\u{2F8FB}"=>"\u{23CBC}",
    "\u{2F8FC}"=>"\u6CBF",
    "\u{2F8FD}"=>"\u6CCD",
    "\u{2F8FE}"=>"\u6C67",
    "\u{2F8FF}"=>"\u6D16",
    "\u{2F900}"=>"\u6D3E",
    "\u{2F901}"=>"\u6D77",
    "\u{2F902}"=>"\u6D41",
    "\u{2F903}"=>"\u6D69",
    "\u{2F904}"=>"\u6D78",
    "\u{2F905}"=>"\u6D85",
    "\u{2F906}"=>"\u{23D1E}",
    "\u{2F907}"=>"\u6D34",
    "\u{2F908}"=>"\u6E2F",
    "\u{2F909}"=>"\u6E6E",
    "\u{2F90A}"=>"\u3D33",
    "\u{2F90B}"=>"\u6ECB",
    "\u{2F90C}"=>"\u6EC7",
    "\u{2F90D}"=>"\u{23ED1}",
    "\u{2F90E}"=>"\u6DF9",
    "\u{2F90F}"=>"\u6F6E",
    "\u{2F910}"=>"\u{23F5E}",
    "\u{2F911}"=>"\u{23F8E}",
    "\u{2F912}"=>"\u6FC6",
    "\u{2F913}"=>"\u7039",
    "\u{2F914}"=>"\u701E",
    "\u{2F915}"=>"\u701B",
    "\u{2F916}"=>"\u3D96",
    "\u{2F917}"=>"\u704A",
    "\u{2F918}"=>"\u707D",
    "\u{2F919}"=>"\u7077",
    "\u{2F91A}"=>"\u70AD",
    "\u{2F91B}"=>"\u{20525}",
    "\u{2F91C}"=>"\u7145",
    "\u{2F91D}"=>"\u{24263}",
    "\u{2F91E}"=>"\u719C",
    "\u{2F91F}"=>"\u{243AB}",
    "\u{2F920}"=>"\u7228",
    "\u{2F921}"=>"\u7235",
    "\u{2F922}"=>"\u7250",
    "\u{2F923}"=>"\u{24608}",
    "\u{2F924}"=>"\u7280",
    "\u{2F925}"=>"\u7295",
    "\u{2F926}"=>"\u{24735}",
    "\u{2F927}"=>"\u{24814}",
    "\u{2F928}"=>"\u737A",
    "\u{2F929}"=>"\u738B",
    "\u{2F92A}"=>"\u3EAC",
    "\u{2F92B}"=>"\u73A5",
    "\u{2F92C}"=>"\u3EB8",
    "\u{2F92D}"=>"\u3EB8",
    "\u{2F92E}"=>"\u7447",
    "\u{2F92F}"=>"\u745C",
    "\u{2F930}"=>"\u7471",
    "\u{2F931}"=>"\u7485",
    "\u{2F932}"=>"\u74CA",
    "\u{2F933}"=>"\u3F1B",
    "\u{2F934}"=>"\u7524",
    "\u{2F935}"=>"\u{24C36}",
    "\u{2F936}"=>"\u753E",
    "\u{2F937}"=>"\u{24C92}",
    "\u{2F938}"=>"\u7570",
    "\u{2F939}"=>"\u{2219F}",
    "\u{2F93A}"=>"\u7610",
    "\u{2F93B}"=>"\u{24FA1}",
    "\u{2F93C}"=>"\u{24FB8}",
    "\u{2F93D}"=>"\u{25044}",
    "\u{2F93E}"=>"\u3FFC",
    "\u{2F93F}"=>"\u4008",
    "\u{2F940}"=>"\u76F4",
    "\u{2F941}"=>"\u{250F3}",
    "\u{2F942}"=>"\u{250F2}",
    "\u{2F943}"=>"\u{25119}",
    "\u{2F944}"=>"\u{25133}",
    "\u{2F945}"=>"\u771E",
    "\u{2F946}"=>"\u771F",
    "\u{2F947}"=>"\u771F",
    "\u{2F948}"=>"\u774A",
    "\u{2F949}"=>"\u4039",
    "\u{2F94A}"=>"\u778B",
    "\u{2F94B}"=>"\u4046",
    "\u{2F94C}"=>"\u4096",
    "\u{2F94D}"=>"\u{2541D}",
    "\u{2F94E}"=>"\u784E",
    "\u{2F94F}"=>"\u788C",
    "\u{2F950}"=>"\u78CC",
    "\u{2F951}"=>"\u40E3",
    "\u{2F952}"=>"\u{25626}",
    "\u{2F953}"=>"\u7956",
    "\u{2F954}"=>"\u{2569A}",
    "\u{2F955}"=>"\u{256C5}",
    "\u{2F956}"=>"\u798F",
    "\u{2F957}"=>"\u79EB",
    "\u{2F958}"=>"\u412F",
    "\u{2F959}"=>"\u7A40",
    "\u{2F95A}"=>"\u7A4A",
    "\u{2F95B}"=>"\u7A4F",
    "\u{2F95C}"=>"\u{2597C}",
    "\u{2F95D}"=>"\u{25AA7}",
    "\u{2F95E}"=>"\u{25AA7}",
    "\u{2F95F}"=>"\u7AEE",
    "\u{2F960}"=>"\u4202",
    "\u{2F961}"=>"\u{25BAB}",
    "\u{2F962}"=>"\u7BC6",
    "\u{2F963}"=>"\u7BC9",
    "\u{2F964}"=>"\u4227",
    "\u{2F965}"=>"\u{25C80}",
    "\u{2F966}"=>"\u7CD2",
    "\u{2F967}"=>"\u42A0",
    "\u{2F968}"=>"\u7CE8",
    "\u{2F969}"=>"\u7CE3",
    "\u{2F96A}"=>"\u7D00",
    "\u{2F96B}"=>"\u{25F86}",
    "\u{2F96C}"=>"\u7D63",
    "\u{2F96D}"=>"\u4301",
    "\u{2F96E}"=>"\u7DC7",
    "\u{2F96F}"=>"\u7E02",
    "\u{2F970}"=>"\u7E45",
    "\u{2F971}"=>"\u4334",
    "\u{2F972}"=>"\u{26228}",
    "\u{2F973}"=>"\u{26247}",
    "\u{2F974}"=>"\u4359",
    "\u{2F975}"=>"\u{262D9}",
    "\u{2F976}"=>"\u7F7A",
    "\u{2F977}"=>"\u{2633E}",
    "\u{2F978}"=>"\u7F95",
    "\u{2F979}"=>"\u7FFA",
    "\u{2F97A}"=>"\u8005",
    "\u{2F97B}"=>"\u{264DA}",
    "\u{2F97C}"=>"\u{26523}",
    "\u{2F97D}"=>"\u8060",
    "\u{2F97E}"=>"\u{265A8}",
    "\u{2F97F}"=>"\u8070",
    "\u{2F980}"=>"\u{2335F}",
    "\u{2F981}"=>"\u43D5",
    "\u{2F982}"=>"\u80B2",
    "\u{2F983}"=>"\u8103",
    "\u{2F984}"=>"\u440B",
    "\u{2F985}"=>"\u813E",
    "\u{2F986}"=>"\u5AB5",
    "\u{2F987}"=>"\u{267A7}",
    "\u{2F988}"=>"\u{267B5}",
    "\u{2F989}"=>"\u{23393}",
    "\u{2F98A}"=>"\u{2339C}",
    "\u{2F98B}"=>"\u8201",
    "\u{2F98C}"=>"\u8204",
    "\u{2F98D}"=>"\u8F9E",
    "\u{2F98E}"=>"\u446B",
    "\u{2F98F}"=>"\u8291",
    "\u{2F990}"=>"\u828B",
    "\u{2F991}"=>"\u829D",
    "\u{2F992}"=>"\u52B3",
    "\u{2F993}"=>"\u82B1",
    "\u{2F994}"=>"\u82B3",
    "\u{2F995}"=>"\u82BD",
    "\u{2F996}"=>"\u82E6",
    "\u{2F997}"=>"\u{26B3C}",
    "\u{2F998}"=>"\u82E5",
    "\u{2F999}"=>"\u831D",
    "\u{2F99A}"=>"\u8363",
    "\u{2F99B}"=>"\u83AD",
    "\u{2F99C}"=>"\u8323",
    "\u{2F99D}"=>"\u83BD",
    "\u{2F99E}"=>"\u83E7",
    "\u{2F99F}"=>"\u8457",
    "\u{2F9A0}"=>"\u8353",
    "\u{2F9A1}"=>"\u83CA",
    "\u{2F9A2}"=>"\u83CC",
    "\u{2F9A3}"=>"\u83DC",
    "\u{2F9A4}"=>"\u{26C36}",
    "\u{2F9A5}"=>"\u{26D6B}",
    "\u{2F9A6}"=>"\u{26CD5}",
    "\u{2F9A7}"=>"\u452B",
    "\u{2F9A8}"=>"\u84F1",
    "\u{2F9A9}"=>"\u84F3",
    "\u{2F9AA}"=>"\u8516",
    "\u{2F9AB}"=>"\u{273CA}",
    "\u{2F9AC}"=>"\u8564",
    "\u{2F9AD}"=>"\u{26F2C}",
    "\u{2F9AE}"=>"\u455D",
    "\u{2F9AF}"=>"\u4561",
    "\u{2F9B0}"=>"\u{26FB1}",
    "\u{2F9B1}"=>"\u{270D2}",
    "\u{2F9B2}"=>"\u456B",
    "\u{2F9B3}"=>"\u8650",
    "\u{2F9B4}"=>"\u865C",
    "\u{2F9B5}"=>"\u8667",
    "\u{2F9B6}"=>"\u8669",
    "\u{2F9B7}"=>"\u86A9",
    "\u{2F9B8}"=>"\u8688",
    "\u{2F9B9}"=>"\u870E",
    "\u{2F9BA}"=>"\u86E2",
    "\u{2F9BB}"=>"\u8779",
    "\u{2F9BC}"=>"\u8728",
    "\u{2F9BD}"=>"\u876B",
    "\u{2F9BE}"=>"\u8786",
    "\u{2F9BF}"=>"\u45D7",
    "\u{2F9C0}"=>"\u87E1",
    "\u{2F9C1}"=>"\u8801",
    "\u{2F9C2}"=>"\u45F9",
    "\u{2F9C3}"=>"\u8860",
    "\u{2F9C4}"=>"\u8863",
    "\u{2F9C5}"=>"\u{27667}",
    "\u{2F9C6}"=>"\u88D7",
    "\u{2F9C7}"=>"\u88DE",
    "\u{2F9C8}"=>"\u4635",
    "\u{2F9C9}"=>"\u88FA",
    "\u{2F9CA}"=>"\u34BB",
    "\u{2F9CB}"=>"\u{278AE}",
    "\u{2F9CC}"=>"\u{27966}",
    "\u{2F9CD}"=>"\u46BE",
    "\u{2F9CE}"=>"\u46C7",
    "\u{2F9CF}"=>"\u8AA0",
    "\u{2F9D0}"=>"\u8AED",
    "\u{2F9D1}"=>"\u8B8A",
    "\u{2F9D2}"=>"\u8C55",
    "\u{2F9D3}"=>"\u{27CA8}",
    "\u{2F9D4}"=>"\u8CAB",
    "\u{2F9D5}"=>"\u8CC1",
    "\u{2F9D6}"=>"\u8D1B",
    "\u{2F9D7}"=>"\u8D77",
    "\u{2F9D8}"=>"\u{27F2F}",
    "\u{2F9D9}"=>"\u{20804}",
    "\u{2F9DA}"=>"\u8DCB",
    "\u{2F9DB}"=>"\u8DBC",
    "\u{2F9DC}"=>"\u8DF0",
    "\u{2F9DD}"=>"\u{208DE}",
    "\u{2F9DE}"=>"\u8ED4",
    "\u{2F9DF}"=>"\u8F38",
    "\u{2F9E0}"=>"\u{285D2}",
    "\u{2F9E1}"=>"\u{285ED}",
    "\u{2F9E2}"=>"\u9094",
    "\u{2F9E3}"=>"\u90F1",
    "\u{2F9E4}"=>"\u9111",
    "\u{2F9E5}"=>"\u{2872E}",
    "\u{2F9E6}"=>"\u911B",
    "\u{2F9E7}"=>"\u9238",
    "\u{2F9E8}"=>"\u92D7",
    "\u{2F9E9}"=>"\u92D8",
    "\u{2F9EA}"=>"\u927C",
    "\u{2F9EB}"=>"\u93F9",
    "\u{2F9EC}"=>"\u9415",
    "\u{2F9ED}"=>"\u{28BFA}",
    "\u{2F9EE}"=>"\u958B",
    "\u{2F9EF}"=>"\u4995",
    "\u{2F9F0}"=>"\u95B7",
    "\u{2F9F1}"=>"\u{28D77}",
    "\u{2F9F2}"=>"\u49E6",
    "\u{2F9F3}"=>"\u96C3",
    "\u{2F9F4}"=>"\u5DB2",
    "\u{2F9F5}"=>"\u9723",
    "\u{2F9F6}"=>"\u{29145}",
    "\u{2F9F7}"=>"\u{2921A}",
    "\u{2F9F8}"=>"\u4A6E",
    "\u{2F9F9}"=>"\u4A76",
    "\u{2F9FA}"=>"\u97E0",
    "\u{2F9FB}"=>"\u{2940A}",
    "\u{2F9FC}"=>"\u4AB2",
    "\u{2F9FD}"=>"\u{29496}",
    "\u{2F9FE}"=>"\u980B",
    "\u{2F9FF}"=>"\u980B",
    "\u{2FA00}"=>"\u9829",
    "\u{2FA01}"=>"\u{295B6}",
    "\u{2FA02}"=>"\u98E2",
    "\u{2FA03}"=>"\u4B33",
    "\u{2FA04}"=>"\u9929",
    "\u{2FA05}"=>"\u99A7",
    "\u{2FA06}"=>"\u99C2",
    "\u{2FA07}"=>"\u99FE",
    "\u{2FA08}"=>"\u4BCE",
    "\u{2FA09}"=>"\u{29B30}",
    "\u{2FA0A}"=>"\u9B12",
    "\u{2FA0B}"=>"\u9C40",
    "\u{2FA0C}"=>"\u9CFD",
    "\u{2FA0D}"=>"\u4CCE",
    "\u{2FA0E}"=>"\u4CED",
    "\u{2FA0F}"=>"\u9D67",
    "\u{2FA10}"=>"\u{2A0CE}",
    "\u{2FA11}"=>"\u4CF8",
    "\u{2FA12}"=>"\u{2A105}",
    "\u{2FA13}"=>"\u{2A20E}",
    "\u{2FA14}"=>"\u{2A291}",
    "\u{2FA15}"=>"\u9EBB",
    "\u{2FA16}"=>"\u4D56",
    "\u{2FA17}"=>"\u9EF9",
    "\u{2FA18}"=>"\u9EFE",
    "\u{2FA19}"=>"\u9F05",
    "\u{2FA1A}"=>"\u9F0F",
    "\u{2FA1B}"=>"\u9F16",
    "\u{2FA1C}"=>"\u9F3B",
    "\u{2FA1D}"=>"\u{2A600}",
  }.freeze

  KOMPATIBLE_TABLE = {
    "\u00A0"=>" ",
    "\u00A8"=>" \u0308",
    "\u00AA"=>"a",
    "\u00AF"=>" \u0304",
    "\u00B2"=>"2",
    "\u00B3"=>"3",
    "\u00B4"=>" \u0301",
    "\u00B5"=>"\u03BC",
    "\u00B8"=>" \u0327",
    "\u00B9"=>"1",
    "\u00BA"=>"o",
    "\u00BC"=>"1\u20444",
    "\u00BD"=>"1\u20442",
    "\u00BE"=>"3\u20444",
    "\u0132"=>"IJ",
    "\u0133"=>"ij",
    "\u013F"=>"L\u00B7",
    "\u0140"=>"l\u00B7",
    "\u0149"=>"\u02BCn",
    "\u017F"=>"s",
    "\u01C4"=>"D\u017D",
    "\u01C5"=>"D\u017E",
    "\u01C6"=>"d\u017E",
    "\u01C7"=>"LJ",
    "\u01C8"=>"Lj",
    "\u01C9"=>"lj",
    "\u01CA"=>"NJ",
    "\u01CB"=>"Nj",
    "\u01CC"=>"nj",
    "\u01F1"=>"DZ",
    "\u01F2"=>"Dz",
    "\u01F3"=>"dz",
    "\u02B0"=>"h",
    "\u02B1"=>"\u0266",
    "\u02B2"=>"j",
    "\u02B3"=>"r",
    "\u02B4"=>"\u0279",
    "\u02B5"=>"\u027B",
    "\u02B6"=>"\u0281",
    "\u02B7"=>"w",
    "\u02B8"=>"y",
    "\u02D8"=>" \u0306",
    "\u02D9"=>" \u0307",
    "\u02DA"=>" \u030A",
    "\u02DB"=>" \u0328",
    "\u02DC"=>" \u0303",
    "\u02DD"=>" \u030B",
    "\u02E0"=>"\u0263",
    "\u02E1"=>"l",
    "\u02E2"=>"s",
    "\u02E3"=>"x",
    "\u02E4"=>"\u0295",
    "\u037A"=>" \u0345",
    "\u0384"=>" \u0301",
    "\u03D0"=>"\u03B2",
    "\u03D1"=>"\u03B8",
    "\u03D2"=>"\u03A5",
    "\u03D5"=>"\u03C6",
    "\u03D6"=>"\u03C0",
    "\u03F0"=>"\u03BA",
    "\u03F1"=>"\u03C1",
    "\u03F2"=>"\u03C2",
    "\u03F4"=>"\u0398",
    "\u03F5"=>"\u03B5",
    "\u03F9"=>"\u03A3",
    "\u0587"=>"\u0565\u0582",
    "\u0675"=>"\u0627\u0674",
    "\u0676"=>"\u0648\u0674",
    "\u0677"=>"\u06C7\u0674",
    "\u0678"=>"\u064A\u0674",
    "\u0E33"=>"\u0E4D\u0E32",
    "\u0EB3"=>"\u0ECD\u0EB2",
    "\u0EDC"=>"\u0EAB\u0E99",
    "\u0EDD"=>"\u0EAB\u0EA1",
    "\u0F0C"=>"\u0F0B",
    "\u0F77"=>"\u0FB2\u0F81",
    "\u0F79"=>"\u0FB3\u0F81",
    "\u10FC"=>"\u10DC",
    "\u1D2C"=>"A",
    "\u1D2D"=>"\u00C6",
    "\u1D2E"=>"B",
    "\u1D30"=>"D",
    "\u1D31"=>"E",
    "\u1D32"=>"\u018E",
    "\u1D33"=>"G",
    "\u1D34"=>"H",
    "\u1D35"=>"I",
    "\u1D36"=>"J",
    "\u1D37"=>"K",
    "\u1D38"=>"L",
    "\u1D39"=>"M",
    "\u1D3A"=>"N",
    "\u1D3C"=>"O",
    "\u1D3D"=>"\u0222",
    "\u1D3E"=>"P",
    "\u1D3F"=>"R",
    "\u1D40"=>"T",
    "\u1D41"=>"U",
    "\u1D42"=>"W",
    "\u1D43"=>"a",
    "\u1D44"=>"\u0250",
    "\u1D45"=>"\u0251",
    "\u1D46"=>"\u1D02",
    "\u1D47"=>"b",
    "\u1D48"=>"d",
    "\u1D49"=>"e",
    "\u1D4A"=>"\u0259",
    "\u1D4B"=>"\u025B",
    "\u1D4C"=>"\u025C",
    "\u1D4D"=>"g",
    "\u1D4F"=>"k",
    "\u1D50"=>"m",
    "\u1D51"=>"\u014B",
    "\u1D52"=>"o",
    "\u1D53"=>"\u0254",
    "\u1D54"=>"\u1D16",
    "\u1D55"=>"\u1D17",
    "\u1D56"=>"p",
    "\u1D57"=>"t",
    "\u1D58"=>"u",
    "\u1D59"=>"\u1D1D",
    "\u1D5A"=>"\u026F",
    "\u1D5B"=>"v",
    "\u1D5C"=>"\u1D25",
    "\u1D5D"=>"\u03B2",
    "\u1D5E"=>"\u03B3",
    "\u1D5F"=>"\u03B4",
    "\u1D60"=>"\u03C6",
    "\u1D61"=>"\u03C7",
    "\u1D62"=>"i",
    "\u1D63"=>"r",
    "\u1D64"=>"u",
    "\u1D65"=>"v",
    "\u1D66"=>"\u03B2",
    "\u1D67"=>"\u03B3",
    "\u1D68"=>"\u03C1",
    "\u1D69"=>"\u03C6",
    "\u1D6A"=>"\u03C7",
    "\u1D78"=>"\u043D",
    "\u1D9B"=>"\u0252",
    "\u1D9C"=>"c",
    "\u1D9D"=>"\u0255",
    "\u1D9E"=>"\u00F0",
    "\u1D9F"=>"\u025C",
    "\u1DA0"=>"f",
    "\u1DA1"=>"\u025F",
    "\u1DA2"=>"\u0261",
    "\u1DA3"=>"\u0265",
    "\u1DA4"=>"\u0268",
    "\u1DA5"=>"\u0269",
    "\u1DA6"=>"\u026A",
    "\u1DA7"=>"\u1D7B",
    "\u1DA8"=>"\u029D",
    "\u1DA9"=>"\u026D",
    "\u1DAA"=>"\u1D85",
    "\u1DAB"=>"\u029F",
    "\u1DAC"=>"\u0271",
    "\u1DAD"=>"\u0270",
    "\u1DAE"=>"\u0272",
    "\u1DAF"=>"\u0273",
    "\u1DB0"=>"\u0274",
    "\u1DB1"=>"\u0275",
    "\u1DB2"=>"\u0278",
    "\u1DB3"=>"\u0282",
    "\u1DB4"=>"\u0283",
    "\u1DB5"=>"\u01AB",
    "\u1DB6"=>"\u0289",
    "\u1DB7"=>"\u028A",
    "\u1DB8"=>"\u1D1C",
    "\u1DB9"=>"\u028B",
    "\u1DBA"=>"\u028C",
    "\u1DBB"=>"z",
    "\u1DBC"=>"\u0290",
    "\u1DBD"=>"\u0291",
    "\u1DBE"=>"\u0292",
    "\u1DBF"=>"\u03B8",
    "\u1E9A"=>"a\u02BE",
    "\u1FBD"=>" \u0313",
    "\u1FBF"=>" \u0313",
    "\u1FC0"=>" \u0342",
    "\u1FFE"=>" \u0314",
    "\u2002"=>" ",
    "\u2003"=>" ",
    "\u2004"=>" ",
    "\u2005"=>" ",
    "\u2006"=>" ",
    "\u2007"=>" ",
    "\u2008"=>" ",
    "\u2009"=>" ",
    "\u200A"=>" ",
    "\u2011"=>"\u2010",
    "\u2017"=>" \u0333",
    "\u2024"=>".",
    "\u2025"=>"..",
    "\u2026"=>"...",
    "\u202F"=>" ",
    "\u2033"=>"\u2032\u2032",
    "\u2034"=>"\u2032\u2032\u2032",
    "\u2036"=>"\u2035\u2035",
    "\u2037"=>"\u2035\u2035\u2035",
    "\u203C"=>"!!",
    "\u203E"=>" \u0305",
    "\u2047"=>"??",
    "\u2048"=>"?!",
    "\u2049"=>"!?",
    "\u2057"=>"\u2032\u2032\u2032\u2032",
    "\u205F"=>" ",
    "\u2070"=>"0",
    "\u2071"=>"i",
    "\u2074"=>"4",
    "\u2075"=>"5",
    "\u2076"=>"6",
    "\u2077"=>"7",
    "\u2078"=>"8",
    "\u2079"=>"9",
    "\u207A"=>"+",
    "\u207B"=>"\u2212",
    "\u207C"=>"=",
    "\u207D"=>"(",
    "\u207E"=>")",
    "\u207F"=>"n",
    "\u2080"=>"0",
    "\u2081"=>"1",
    "\u2082"=>"2",
    "\u2083"=>"3",
    "\u2084"=>"4",
    "\u2085"=>"5",
    "\u2086"=>"6",
    "\u2087"=>"7",
    "\u2088"=>"8",
    "\u2089"=>"9",
    "\u208A"=>"+",
    "\u208B"=>"\u2212",
    "\u208C"=>"=",
    "\u208D"=>"(",
    "\u208E"=>")",
    "\u2090"=>"a",
    "\u2091"=>"e",
    "\u2092"=>"o",
    "\u2093"=>"x",
    "\u2094"=>"\u0259",
    "\u2095"=>"h",
    "\u2096"=>"k",
    "\u2097"=>"l",
    "\u2098"=>"m",
    "\u2099"=>"n",
    "\u209A"=>"p",
    "\u209B"=>"s",
    "\u209C"=>"t",
    "\u20A8"=>"Rs",
    "\u2100"=>"a/c",
    "\u2101"=>"a/s",
    "\u2102"=>"C",
    "\u2103"=>"\u00B0C",
    "\u2105"=>"c/o",
    "\u2106"=>"c/u",
    "\u2107"=>"\u0190",
    "\u2109"=>"\u00B0F",
    "\u210A"=>"g",
    "\u210B"=>"H",
    "\u210C"=>"H",
    "\u210D"=>"H",
    "\u210E"=>"h",
    "\u210F"=>"\u0127",
    "\u2110"=>"I",
    "\u2111"=>"I",
    "\u2112"=>"L",
    "\u2113"=>"l",
    "\u2115"=>"N",
    "\u2116"=>"No",
    "\u2119"=>"P",
    "\u211A"=>"Q",
    "\u211B"=>"R",
    "\u211C"=>"R",
    "\u211D"=>"R",
    "\u2120"=>"SM",
    "\u2121"=>"TEL",
    "\u2122"=>"TM",
    "\u2124"=>"Z",
    "\u2128"=>"Z",
    "\u212C"=>"B",
    "\u212D"=>"C",
    "\u212F"=>"e",
    "\u2130"=>"E",
    "\u2131"=>"F",
    "\u2133"=>"M",
    "\u2134"=>"o",
    "\u2135"=>"\u05D0",
    "\u2136"=>"\u05D1",
    "\u2137"=>"\u05D2",
    "\u2138"=>"\u05D3",
    "\u2139"=>"i",
    "\u213B"=>"FAX",
    "\u213C"=>"\u03C0",
    "\u213D"=>"\u03B3",
    "\u213E"=>"\u0393",
    "\u213F"=>"\u03A0",
    "\u2140"=>"\u2211",
    "\u2145"=>"D",
    "\u2146"=>"d",
    "\u2147"=>"e",
    "\u2148"=>"i",
    "\u2149"=>"j",
    "\u2150"=>"1\u20447",
    "\u2151"=>"1\u20449",
    "\u2152"=>"1\u204410",
    "\u2153"=>"1\u20443",
    "\u2154"=>"2\u20443",
    "\u2155"=>"1\u20445",
    "\u2156"=>"2\u20445",
    "\u2157"=>"3\u20445",
    "\u2158"=>"4\u20445",
    "\u2159"=>"1\u20446",
    "\u215A"=>"5\u20446",
    "\u215B"=>"1\u20448",
    "\u215C"=>"3\u20448",
    "\u215D"=>"5\u20448",
    "\u215E"=>"7\u20448",
    "\u215F"=>"1\u2044",
    "\u2160"=>"I",
    "\u2161"=>"II",
    "\u2162"=>"III",
    "\u2163"=>"IV",
    "\u2164"=>"V",
    "\u2165"=>"VI",
    "\u2166"=>"VII",
    "\u2167"=>"VIII",
    "\u2168"=>"IX",
    "\u2169"=>"X",
    "\u216A"=>"XI",
    "\u216B"=>"XII",
    "\u216C"=>"L",
    "\u216D"=>"C",
    "\u216E"=>"D",
    "\u216F"=>"M",
    "\u2170"=>"i",
    "\u2171"=>"ii",
    "\u2172"=>"iii",
    "\u2173"=>"iv",
    "\u2174"=>"v",
    "\u2175"=>"vi",
    "\u2176"=>"vii",
    "\u2177"=>"viii",
    "\u2178"=>"ix",
    "\u2179"=>"x",
    "\u217A"=>"xi",
    "\u217B"=>"xii",
    "\u217C"=>"l",
    "\u217D"=>"c",
    "\u217E"=>"d",
    "\u217F"=>"m",
    "\u2189"=>"0\u20443",
    "\u222C"=>"\u222B\u222B",
    "\u222D"=>"\u222B\u222B\u222B",
    "\u222F"=>"\u222E\u222E",
    "\u2230"=>"\u222E\u222E\u222E",
    "\u2460"=>"1",
    "\u2461"=>"2",
    "\u2462"=>"3",
    "\u2463"=>"4",
    "\u2464"=>"5",
    "\u2465"=>"6",
    "\u2466"=>"7",
    "\u2467"=>"8",
    "\u2468"=>"9",
    "\u2469"=>"10",
    "\u246A"=>"11",
    "\u246B"=>"12",
    "\u246C"=>"13",
    "\u246D"=>"14",
    "\u246E"=>"15",
    "\u246F"=>"16",
    "\u2470"=>"17",
    "\u2471"=>"18",
    "\u2472"=>"19",
    "\u2473"=>"20",
    "\u2474"=>"(1)",
    "\u2475"=>"(2)",
    "\u2476"=>"(3)",
    "\u2477"=>"(4)",
    "\u2478"=>"(5)",
    "\u2479"=>"(6)",
    "\u247A"=>"(7)",
    "\u247B"=>"(8)",
    "\u247C"=>"(9)",
    "\u247D"=>"(10)",
    "\u247E"=>"(11)",
    "\u247F"=>"(12)",
    "\u2480"=>"(13)",
    "\u2481"=>"(14)",
    "\u2482"=>"(15)",
    "\u2483"=>"(16)",
    "\u2484"=>"(17)",
    "\u2485"=>"(18)",
    "\u2486"=>"(19)",
    "\u2487"=>"(20)",
    "\u2488"=>"1.",
    "\u2489"=>"2.",
    "\u248A"=>"3.",
    "\u248B"=>"4.",
    "\u248C"=>"5.",
    "\u248D"=>"6.",
    "\u248E"=>"7.",
    "\u248F"=>"8.",
    "\u2490"=>"9.",
    "\u2491"=>"10.",
    "\u2492"=>"11.",
    "\u2493"=>"12.",
    "\u2494"=>"13.",
    "\u2495"=>"14.",
    "\u2496"=>"15.",
    "\u2497"=>"16.",
    "\u2498"=>"17.",
    "\u2499"=>"18.",
    "\u249A"=>"19.",
    "\u249B"=>"20.",
    "\u249C"=>"(a)",
    "\u249D"=>"(b)",
    "\u249E"=>"(c)",
    "\u249F"=>"(d)",
    "\u24A0"=>"(e)",
    "\u24A1"=>"(f)",
    "\u24A2"=>"(g)",
    "\u24A3"=>"(h)",
    "\u24A4"=>"(i)",
    "\u24A5"=>"(j)",
    "\u24A6"=>"(k)",
    "\u24A7"=>"(l)",
    "\u24A8"=>"(m)",
    "\u24A9"=>"(n)",
    "\u24AA"=>"(o)",
    "\u24AB"=>"(p)",
    "\u24AC"=>"(q)",
    "\u24AD"=>"(r)",
    "\u24AE"=>"(s)",
    "\u24AF"=>"(t)",
    "\u24B0"=>"(u)",
    "\u24B1"=>"(v)",
    "\u24B2"=>"(w)",
    "\u24B3"=>"(x)",
    "\u24B4"=>"(y)",
    "\u24B5"=>"(z)",
    "\u24B6"=>"A",
    "\u24B7"=>"B",
    "\u24B8"=>"C",
    "\u24B9"=>"D",
    "\u24BA"=>"E",
    "\u24BB"=>"F",
    "\u24BC"=>"G",
    "\u24BD"=>"H",
    "\u24BE"=>"I",
    "\u24BF"=>"J",
    "\u24C0"=>"K",
    "\u24C1"=>"L",
    "\u24C2"=>"M",
    "\u24C3"=>"N",
    "\u24C4"=>"O",
    "\u24C5"=>"P",
    "\u24C6"=>"Q",
    "\u24C7"=>"R",
    "\u24C8"=>"S",
    "\u24C9"=>"T",
    "\u24CA"=>"U",
    "\u24CB"=>"V",
    "\u24CC"=>"W",
    "\u24CD"=>"X",
    "\u24CE"=>"Y",
    "\u24CF"=>"Z",
    "\u24D0"=>"a",
    "\u24D1"=>"b",
    "\u24D2"=>"c",
    "\u24D3"=>"d",
    "\u24D4"=>"e",
    "\u24D5"=>"f",
    "\u24D6"=>"g",
    "\u24D7"=>"h",
    "\u24D8"=>"i",
    "\u24D9"=>"j",
    "\u24DA"=>"k",
    "\u24DB"=>"l",
    "\u24DC"=>"m",
    "\u24DD"=>"n",
    "\u24DE"=>"o",
    "\u24DF"=>"p",
    "\u24E0"=>"q",
    "\u24E1"=>"r",
    "\u24E2"=>"s",
    "\u24E3"=>"t",
    "\u24E4"=>"u",
    "\u24E5"=>"v",
    "\u24E6"=>"w",
    "\u24E7"=>"x",
    "\u24E8"=>"y",
    "\u24E9"=>"z",
    "\u24EA"=>"0",
    "\u2A0C"=>"\u222B\u222B\u222B\u222B",
    "\u2A74"=>"::=",
    "\u2A75"=>"==",
    "\u2A76"=>"===",
    "\u2C7C"=>"j",
    "\u2C7D"=>"V",
    "\u2D6F"=>"\u2D61",
    "\u2E9F"=>"\u6BCD",
    "\u2EF3"=>"\u9F9F",
    "\u2F00"=>"\u4E00",
    "\u2F01"=>"\u4E28",
    "\u2F02"=>"\u4E36",
    "\u2F03"=>"\u4E3F",
    "\u2F04"=>"\u4E59",
    "\u2F05"=>"\u4E85",
    "\u2F06"=>"\u4E8C",
    "\u2F07"=>"\u4EA0",
    "\u2F08"=>"\u4EBA",
    "\u2F09"=>"\u513F",
    "\u2F0A"=>"\u5165",
    "\u2F0B"=>"\u516B",
    "\u2F0C"=>"\u5182",
    "\u2F0D"=>"\u5196",
    "\u2F0E"=>"\u51AB",
    "\u2F0F"=>"\u51E0",
    "\u2F10"=>"\u51F5",
    "\u2F11"=>"\u5200",
    "\u2F12"=>"\u529B",
    "\u2F13"=>"\u52F9",
    "\u2F14"=>"\u5315",
    "\u2F15"=>"\u531A",
    "\u2F16"=>"\u5338",
    "\u2F17"=>"\u5341",
    "\u2F18"=>"\u535C",
    "\u2F19"=>"\u5369",
    "\u2F1A"=>"\u5382",
    "\u2F1B"=>"\u53B6",
    "\u2F1C"=>"\u53C8",
    "\u2F1D"=>"\u53E3",
    "\u2F1E"=>"\u56D7",
    "\u2F1F"=>"\u571F",
    "\u2F20"=>"\u58EB",
    "\u2F21"=>"\u5902",
    "\u2F22"=>"\u590A",
    "\u2F23"=>"\u5915",
    "\u2F24"=>"\u5927",
    "\u2F25"=>"\u5973",
    "\u2F26"=>"\u5B50",
    "\u2F27"=>"\u5B80",
    "\u2F28"=>"\u5BF8",
    "\u2F29"=>"\u5C0F",
    "\u2F2A"=>"\u5C22",
    "\u2F2B"=>"\u5C38",
    "\u2F2C"=>"\u5C6E",
    "\u2F2D"=>"\u5C71",
    "\u2F2E"=>"\u5DDB",
    "\u2F2F"=>"\u5DE5",
    "\u2F30"=>"\u5DF1",
    "\u2F31"=>"\u5DFE",
    "\u2F32"=>"\u5E72",
    "\u2F33"=>"\u5E7A",
    "\u2F34"=>"\u5E7F",
    "\u2F35"=>"\u5EF4",
    "\u2F36"=>"\u5EFE",
    "\u2F37"=>"\u5F0B",
    "\u2F38"=>"\u5F13",
    "\u2F39"=>"\u5F50",
    "\u2F3A"=>"\u5F61",
    "\u2F3B"=>"\u5F73",
    "\u2F3C"=>"\u5FC3",
    "\u2F3D"=>"\u6208",
    "\u2F3E"=>"\u6236",
    "\u2F3F"=>"\u624B",
    "\u2F40"=>"\u652F",
    "\u2F41"=>"\u6534",
    "\u2F42"=>"\u6587",
    "\u2F43"=>"\u6597",
    "\u2F44"=>"\u65A4",
    "\u2F45"=>"\u65B9",
    "\u2F46"=>"\u65E0",
    "\u2F47"=>"\u65E5",
    "\u2F48"=>"\u66F0",
    "\u2F49"=>"\u6708",
    "\u2F4A"=>"\u6728",
    "\u2F4B"=>"\u6B20",
    "\u2F4C"=>"\u6B62",
    "\u2F4D"=>"\u6B79",
    "\u2F4E"=>"\u6BB3",
    "\u2F4F"=>"\u6BCB",
    "\u2F50"=>"\u6BD4",
    "\u2F51"=>"\u6BDB",
    "\u2F52"=>"\u6C0F",
    "\u2F53"=>"\u6C14",
    "\u2F54"=>"\u6C34",
    "\u2F55"=>"\u706B",
    "\u2F56"=>"\u722A",
    "\u2F57"=>"\u7236",
    "\u2F58"=>"\u723B",
    "\u2F59"=>"\u723F",
    "\u2F5A"=>"\u7247",
    "\u2F5B"=>"\u7259",
    "\u2F5C"=>"\u725B",
    "\u2F5D"=>"\u72AC",
    "\u2F5E"=>"\u7384",
    "\u2F5F"=>"\u7389",
    "\u2F60"=>"\u74DC",
    "\u2F61"=>"\u74E6",
    "\u2F62"=>"\u7518",
    "\u2F63"=>"\u751F",
    "\u2F64"=>"\u7528",
    "\u2F65"=>"\u7530",
    "\u2F66"=>"\u758B",
    "\u2F67"=>"\u7592",
    "\u2F68"=>"\u7676",
    "\u2F69"=>"\u767D",
    "\u2F6A"=>"\u76AE",
    "\u2F6B"=>"\u76BF",
    "\u2F6C"=>"\u76EE",
    "\u2F6D"=>"\u77DB",
    "\u2F6E"=>"\u77E2",
    "\u2F6F"=>"\u77F3",
    "\u2F70"=>"\u793A",
    "\u2F71"=>"\u79B8",
    "\u2F72"=>"\u79BE",
    "\u2F73"=>"\u7A74",
    "\u2F74"=>"\u7ACB",
    "\u2F75"=>"\u7AF9",
    "\u2F76"=>"\u7C73",
    "\u2F77"=>"\u7CF8",
    "\u2F78"=>"\u7F36",
    "\u2F79"=>"\u7F51",
    "\u2F7A"=>"\u7F8A",
    "\u2F7B"=>"\u7FBD",
    "\u2F7C"=>"\u8001",
    "\u2F7D"=>"\u800C",
    "\u2F7E"=>"\u8012",
    "\u2F7F"=>"\u8033",
    "\u2F80"=>"\u807F",
    "\u2F81"=>"\u8089",
    "\u2F82"=>"\u81E3",
    "\u2F83"=>"\u81EA",
    "\u2F84"=>"\u81F3",
    "\u2F85"=>"\u81FC",
    "\u2F86"=>"\u820C",
    "\u2F87"=>"\u821B",
    "\u2F88"=>"\u821F",
    "\u2F89"=>"\u826E",
    "\u2F8A"=>"\u8272",
    "\u2F8B"=>"\u8278",
    "\u2F8C"=>"\u864D",
    "\u2F8D"=>"\u866B",
    "\u2F8E"=>"\u8840",
    "\u2F8F"=>"\u884C",
    "\u2F90"=>"\u8863",
    "\u2F91"=>"\u897E",
    "\u2F92"=>"\u898B",
    "\u2F93"=>"\u89D2",
    "\u2F94"=>"\u8A00",
    "\u2F95"=>"\u8C37",
    "\u2F96"=>"\u8C46",
    "\u2F97"=>"\u8C55",
    "\u2F98"=>"\u8C78",
    "\u2F99"=>"\u8C9D",
    "\u2F9A"=>"\u8D64",
    "\u2F9B"=>"\u8D70",
    "\u2F9C"=>"\u8DB3",
    "\u2F9D"=>"\u8EAB",
    "\u2F9E"=>"\u8ECA",
    "\u2F9F"=>"\u8F9B",
    "\u2FA0"=>"\u8FB0",
    "\u2FA1"=>"\u8FB5",
    "\u2FA2"=>"\u9091",
    "\u2FA3"=>"\u9149",
    "\u2FA4"=>"\u91C6",
    "\u2FA5"=>"\u91CC",
    "\u2FA6"=>"\u91D1",
    "\u2FA7"=>"\u9577",
    "\u2FA8"=>"\u9580",
    "\u2FA9"=>"\u961C",
    "\u2FAA"=>"\u96B6",
    "\u2FAB"=>"\u96B9",
    "\u2FAC"=>"\u96E8",
    "\u2FAD"=>"\u9751",
    "\u2FAE"=>"\u975E",
    "\u2FAF"=>"\u9762",
    "\u2FB0"=>"\u9769",
    "\u2FB1"=>"\u97CB",
    "\u2FB2"=>"\u97ED",
    "\u2FB3"=>"\u97F3",
    "\u2FB4"=>"\u9801",
    "\u2FB5"=>"\u98A8",
    "\u2FB6"=>"\u98DB",
    "\u2FB7"=>"\u98DF",
    "\u2FB8"=>"\u9996",
    "\u2FB9"=>"\u9999",
    "\u2FBA"=>"\u99AC",
    "\u2FBB"=>"\u9AA8",
    "\u2FBC"=>"\u9AD8",
    "\u2FBD"=>"\u9ADF",
    "\u2FBE"=>"\u9B25",
    "\u2FBF"=>"\u9B2F",
    "\u2FC0"=>"\u9B32",
    "\u2FC1"=>"\u9B3C",
    "\u2FC2"=>"\u9B5A",
    "\u2FC3"=>"\u9CE5",
    "\u2FC4"=>"\u9E75",
    "\u2FC5"=>"\u9E7F",
    "\u2FC6"=>"\u9EA5",
    "\u2FC7"=>"\u9EBB",
    "\u2FC8"=>"\u9EC3",
    "\u2FC9"=>"\u9ECD",
    "\u2FCA"=>"\u9ED1",
    "\u2FCB"=>"\u9EF9",
    "\u2FCC"=>"\u9EFD",
    "\u2FCD"=>"\u9F0E",
    "\u2FCE"=>"\u9F13",
    "\u2FCF"=>"\u9F20",
    "\u2FD0"=>"\u9F3B",
    "\u2FD1"=>"\u9F4A",
    "\u2FD2"=>"\u9F52",
    "\u2FD3"=>"\u9F8D",
    "\u2FD4"=>"\u9F9C",
    "\u2FD5"=>"\u9FA0",
    "\u3000"=>" ",
    "\u3036"=>"\u3012",
    "\u3038"=>"\u5341",
    "\u3039"=>"\u5344",
    "\u303A"=>"\u5345",
    "\u309B"=>" \u3099",
    "\u309C"=>" \u309A",
    "\u309F"=>"\u3088\u308A",
    "\u30FF"=>"\u30B3\u30C8",
    "\u3131"=>"\u1100",
    "\u3132"=>"\u1101",
    "\u3133"=>"\u11AA",
    "\u3134"=>"\u1102",
    "\u3135"=>"\u11AC",
    "\u3136"=>"\u11AD",
    "\u3137"=>"\u1103",
    "\u3138"=>"\u1104",
    "\u3139"=>"\u1105",
    "\u313A"=>"\u11B0",
    "\u313B"=>"\u11B1",
    "\u313C"=>"\u11B2",
    "\u313D"=>"\u11B3",
    "\u313E"=>"\u11B4",
    "\u313F"=>"\u11B5",
    "\u3140"=>"\u111A",
    "\u3141"=>"\u1106",
    "\u3142"=>"\u1107",
    "\u3143"=>"\u1108",
    "\u3144"=>"\u1121",
    "\u3145"=>"\u1109",
    "\u3146"=>"\u110A",
    "\u3147"=>"\u110B",
    "\u3148"=>"\u110C",
    "\u3149"=>"\u110D",
    "\u314A"=>"\u110E",
    "\u314B"=>"\u110F",
    "\u314C"=>"\u1110",
    "\u314D"=>"\u1111",
    "\u314E"=>"\u1112",
    "\u314F"=>"\u1161",
    "\u3150"=>"\u1162",
    "\u3151"=>"\u1163",
    "\u3152"=>"\u1164",
    "\u3153"=>"\u1165",
    "\u3154"=>"\u1166",
    "\u3155"=>"\u1167",
    "\u3156"=>"\u1168",
    "\u3157"=>"\u1169",
    "\u3158"=>"\u116A",
    "\u3159"=>"\u116B",
    "\u315A"=>"\u116C",
    "\u315B"=>"\u116D",
    "\u315C"=>"\u116E",
    "\u315D"=>"\u116F",
    "\u315E"=>"\u1170",
    "\u315F"=>"\u1171",
    "\u3160"=>"\u1172",
    "\u3161"=>"\u1173",
    "\u3162"=>"\u1174",
    "\u3163"=>"\u1175",
    "\u3164"=>"\u1160",
    "\u3165"=>"\u1114",
    "\u3166"=>"\u1115",
    "\u3167"=>"\u11C7",
    "\u3168"=>"\u11C8",
    "\u3169"=>"\u11CC",
    "\u316A"=>"\u11CE",
    "\u316B"=>"\u11D3",
    "\u316C"=>"\u11D7",
    "\u316D"=>"\u11D9",
    "\u316E"=>"\u111C",
    "\u316F"=>"\u11DD",
    "\u3170"=>"\u11DF",
    "\u3171"=>"\u111D",
    "\u3172"=>"\u111E",
    "\u3173"=>"\u1120",
    "\u3174"=>"\u1122",
    "\u3175"=>"\u1123",
    "\u3176"=>"\u1127",
    "\u3177"=>"\u1129",
    "\u3178"=>"\u112B",
    "\u3179"=>"\u112C",
    "\u317A"=>"\u112D",
    "\u317B"=>"\u112E",
    "\u317C"=>"\u112F",
    "\u317D"=>"\u1132",
    "\u317E"=>"\u1136",
    "\u317F"=>"\u1140",
    "\u3180"=>"\u1147",
    "\u3181"=>"\u114C",
    "\u3182"=>"\u11F1",
    "\u3183"=>"\u11F2",
    "\u3184"=>"\u1157",
    "\u3185"=>"\u1158",
    "\u3186"=>"\u1159",
    "\u3187"=>"\u1184",
    "\u3188"=>"\u1185",
    "\u3189"=>"\u1188",
    "\u318A"=>"\u1191",
    "\u318B"=>"\u1192",
    "\u318C"=>"\u1194",
    "\u318D"=>"\u119E",
    "\u318E"=>"\u11A1",
    "\u3192"=>"\u4E00",
    "\u3193"=>"\u4E8C",
    "\u3194"=>"\u4E09",
    "\u3195"=>"\u56DB",
    "\u3196"=>"\u4E0A",
    "\u3197"=>"\u4E2D",
    "\u3198"=>"\u4E0B",
    "\u3199"=>"\u7532",
    "\u319A"=>"\u4E59",
    "\u319B"=>"\u4E19",
    "\u319C"=>"\u4E01",
    "\u319D"=>"\u5929",
    "\u319E"=>"\u5730",
    "\u319F"=>"\u4EBA",
    "\u3200"=>"(\u1100)",
    "\u3201"=>"(\u1102)",
    "\u3202"=>"(\u1103)",
    "\u3203"=>"(\u1105)",
    "\u3204"=>"(\u1106)",
    "\u3205"=>"(\u1107)",
    "\u3206"=>"(\u1109)",
    "\u3207"=>"(\u110B)",
    "\u3208"=>"(\u110C)",
    "\u3209"=>"(\u110E)",
    "\u320A"=>"(\u110F)",
    "\u320B"=>"(\u1110)",
    "\u320C"=>"(\u1111)",
    "\u320D"=>"(\u1112)",
    "\u320E"=>"(\u1100\u1161)",
    "\u320F"=>"(\u1102\u1161)",
    "\u3210"=>"(\u1103\u1161)",
    "\u3211"=>"(\u1105\u1161)",
    "\u3212"=>"(\u1106\u1161)",
    "\u3213"=>"(\u1107\u1161)",
    "\u3214"=>"(\u1109\u1161)",
    "\u3215"=>"(\u110B\u1161)",
    "\u3216"=>"(\u110C\u1161)",
    "\u3217"=>"(\u110E\u1161)",
    "\u3218"=>"(\u110F\u1161)",
    "\u3219"=>"(\u1110\u1161)",
    "\u321A"=>"(\u1111\u1161)",
    "\u321B"=>"(\u1112\u1161)",
    "\u321C"=>"(\u110C\u116E)",
    "\u321D"=>"(\u110B\u1169\u110C\u1165\u11AB)",
    "\u321E"=>"(\u110B\u1169\u1112\u116E)",
    "\u3220"=>"(\u4E00)",
    "\u3221"=>"(\u4E8C)",
    "\u3222"=>"(\u4E09)",
    "\u3223"=>"(\u56DB)",
    "\u3224"=>"(\u4E94)",
    "\u3225"=>"(\u516D)",
    "\u3226"=>"(\u4E03)",
    "\u3227"=>"(\u516B)",
    "\u3228"=>"(\u4E5D)",
    "\u3229"=>"(\u5341)",
    "\u322A"=>"(\u6708)",
    "\u322B"=>"(\u706B)",
    "\u322C"=>"(\u6C34)",
    "\u322D"=>"(\u6728)",
    "\u322E"=>"(\u91D1)",
    "\u322F"=>"(\u571F)",
    "\u3230"=>"(\u65E5)",
    "\u3231"=>"(\u682A)",
    "\u3232"=>"(\u6709)",
    "\u3233"=>"(\u793E)",
    "\u3234"=>"(\u540D)",
    "\u3235"=>"(\u7279)",
    "\u3236"=>"(\u8CA1)",
    "\u3237"=>"(\u795D)",
    "\u3238"=>"(\u52B4)",
    "\u3239"=>"(\u4EE3)",
    "\u323A"=>"(\u547C)",
    "\u323B"=>"(\u5B66)",
    "\u323C"=>"(\u76E3)",
    "\u323D"=>"(\u4F01)",
    "\u323E"=>"(\u8CC7)",
    "\u323F"=>"(\u5354)",
    "\u3240"=>"(\u796D)",
    "\u3241"=>"(\u4F11)",
    "\u3242"=>"(\u81EA)",
    "\u3243"=>"(\u81F3)",
    "\u3244"=>"\u554F",
    "\u3245"=>"\u5E7C",
    "\u3246"=>"\u6587",
    "\u3247"=>"\u7B8F",
    "\u3250"=>"PTE",
    "\u3251"=>"21",
    "\u3252"=>"22",
    "\u3253"=>"23",
    "\u3254"=>"24",
    "\u3255"=>"25",
    "\u3256"=>"26",
    "\u3257"=>"27",
    "\u3258"=>"28",
    "\u3259"=>"29",
    "\u325A"=>"30",
    "\u325B"=>"31",
    "\u325C"=>"32",
    "\u325D"=>"33",
    "\u325E"=>"34",
    "\u325F"=>"35",
    "\u3260"=>"\u1100",
    "\u3261"=>"\u1102",
    "\u3262"=>"\u1103",
    "\u3263"=>"\u1105",
    "\u3264"=>"\u1106",
    "\u3265"=>"\u1107",
    "\u3266"=>"\u1109",
    "\u3267"=>"\u110B",
    "\u3268"=>"\u110C",
    "\u3269"=>"\u110E",
    "\u326A"=>"\u110F",
    "\u326B"=>"\u1110",
    "\u326C"=>"\u1111",
    "\u326D"=>"\u1112",
    "\u326E"=>"\u1100\u1161",
    "\u326F"=>"\u1102\u1161",
    "\u3270"=>"\u1103\u1161",
    "\u3271"=>"\u1105\u1161",
    "\u3272"=>"\u1106\u1161",
    "\u3273"=>"\u1107\u1161",
    "\u3274"=>"\u1109\u1161",
    "\u3275"=>"\u110B\u1161",
    "\u3276"=>"\u110C\u1161",
    "\u3277"=>"\u110E\u1161",
    "\u3278"=>"\u110F\u1161",
    "\u3279"=>"\u1110\u1161",
    "\u327A"=>"\u1111\u1161",
    "\u327B"=>"\u1112\u1161",
    "\u327C"=>"\u110E\u1161\u11B7\u1100\u1169",
    "\u327D"=>"\u110C\u116E\u110B\u1174",
    "\u327E"=>"\u110B\u116E",
    "\u3280"=>"\u4E00",
    "\u3281"=>"\u4E8C",
    "\u3282"=>"\u4E09",
    "\u3283"=>"\u56DB",
    "\u3284"=>"\u4E94",
    "\u3285"=>"\u516D",
    "\u3286"=>"\u4E03",
    "\u3287"=>"\u516B",
    "\u3288"=>"\u4E5D",
    "\u3289"=>"\u5341",
    "\u328A"=>"\u6708",
    "\u328B"=>"\u706B",
    "\u328C"=>"\u6C34",
    "\u328D"=>"\u6728",
    "\u328E"=>"\u91D1",
    "\u328F"=>"\u571F",
    "\u3290"=>"\u65E5",
    "\u3291"=>"\u682A",
    "\u3292"=>"\u6709",
    "\u3293"=>"\u793E",
    "\u3294"=>"\u540D",
    "\u3295"=>"\u7279",
    "\u3296"=>"\u8CA1",
    "\u3297"=>"\u795D",
    "\u3298"=>"\u52B4",
    "\u3299"=>"\u79D8",
    "\u329A"=>"\u7537",
    "\u329B"=>"\u5973",
    "\u329C"=>"\u9069",
    "\u329D"=>"\u512A",
    "\u329E"=>"\u5370",
    "\u329F"=>"\u6CE8",
    "\u32A0"=>"\u9805",
    "\u32A1"=>"\u4F11",
    "\u32A2"=>"\u5199",
    "\u32A3"=>"\u6B63",
    "\u32A4"=>"\u4E0A",
    "\u32A5"=>"\u4E2D",
    "\u32A6"=>"\u4E0B",
    "\u32A7"=>"\u5DE6",
    "\u32A8"=>"\u53F3",
    "\u32A9"=>"\u533B",
    "\u32AA"=>"\u5B97",
    "\u32AB"=>"\u5B66",
    "\u32AC"=>"\u76E3",
    "\u32AD"=>"\u4F01",
    "\u32AE"=>"\u8CC7",
    "\u32AF"=>"\u5354",
    "\u32B0"=>"\u591C",
    "\u32B1"=>"36",
    "\u32B2"=>"37",
    "\u32B3"=>"38",
    "\u32B4"=>"39",
    "\u32B5"=>"40",
    "\u32B6"=>"41",
    "\u32B7"=>"42",
    "\u32B8"=>"43",
    "\u32B9"=>"44",
    "\u32BA"=>"45",
    "\u32BB"=>"46",
    "\u32BC"=>"47",
    "\u32BD"=>"48",
    "\u32BE"=>"49",
    "\u32BF"=>"50",
    "\u32C0"=>"1\u6708",
    "\u32C1"=>"2\u6708",
    "\u32C2"=>"3\u6708",
    "\u32C3"=>"4\u6708",
    "\u32C4"=>"5\u6708",
    "\u32C5"=>"6\u6708",
    "\u32C6"=>"7\u6708",
    "\u32C7"=>"8\u6708",
    "\u32C8"=>"9\u6708",
    "\u32C9"=>"10\u6708",
    "\u32CA"=>"11\u6708",
    "\u32CB"=>"12\u6708",
    "\u32CC"=>"Hg",
    "\u32CD"=>"erg",
    "\u32CE"=>"eV",
    "\u32CF"=>"LTD",
    "\u32D0"=>"\u30A2",
    "\u32D1"=>"\u30A4",
    "\u32D2"=>"\u30A6",
    "\u32D3"=>"\u30A8",
    "\u32D4"=>"\u30AA",
    "\u32D5"=>"\u30AB",
    "\u32D6"=>"\u30AD",
    "\u32D7"=>"\u30AF",
    "\u32D8"=>"\u30B1",
    "\u32D9"=>"\u30B3",
    "\u32DA"=>"\u30B5",
    "\u32DB"=>"\u30B7",
    "\u32DC"=>"\u30B9",
    "\u32DD"=>"\u30BB",
    "\u32DE"=>"\u30BD",
    "\u32DF"=>"\u30BF",
    "\u32E0"=>"\u30C1",
    "\u32E1"=>"\u30C4",
    "\u32E2"=>"\u30C6",
    "\u32E3"=>"\u30C8",
    "\u32E4"=>"\u30CA",
    "\u32E5"=>"\u30CB",
    "\u32E6"=>"\u30CC",
    "\u32E7"=>"\u30CD",
    "\u32E8"=>"\u30CE",
    "\u32E9"=>"\u30CF",
    "\u32EA"=>"\u30D2",
    "\u32EB"=>"\u30D5",
    "\u32EC"=>"\u30D8",
    "\u32ED"=>"\u30DB",
    "\u32EE"=>"\u30DE",
    "\u32EF"=>"\u30DF",
    "\u32F0"=>"\u30E0",
    "\u32F1"=>"\u30E1",
    "\u32F2"=>"\u30E2",
    "\u32F3"=>"\u30E4",
    "\u32F4"=>"\u30E6",
    "\u32F5"=>"\u30E8",
    "\u32F6"=>"\u30E9",
    "\u32F7"=>"\u30EA",
    "\u32F8"=>"\u30EB",
    "\u32F9"=>"\u30EC",
    "\u32FA"=>"\u30ED",
    "\u32FB"=>"\u30EF",
    "\u32FC"=>"\u30F0",
    "\u32FD"=>"\u30F1",
    "\u32FE"=>"\u30F2",
    "\u32FF"=>"\u4EE4\u548C",
    "\u3300"=>"\u30A2\u30D1\u30FC\u30C8",
    "\u3301"=>"\u30A2\u30EB\u30D5\u30A1",
    "\u3302"=>"\u30A2\u30F3\u30DA\u30A2",
    "\u3303"=>"\u30A2\u30FC\u30EB",
    "\u3304"=>"\u30A4\u30CB\u30F3\u30B0",
    "\u3305"=>"\u30A4\u30F3\u30C1",
    "\u3306"=>"\u30A6\u30A9\u30F3",
    "\u3307"=>"\u30A8\u30B9\u30AF\u30FC\u30C9",
    "\u3308"=>"\u30A8\u30FC\u30AB\u30FC",
    "\u3309"=>"\u30AA\u30F3\u30B9",
    "\u330A"=>"\u30AA\u30FC\u30E0",
    "\u330B"=>"\u30AB\u30A4\u30EA",
    "\u330C"=>"\u30AB\u30E9\u30C3\u30C8",
    "\u330D"=>"\u30AB\u30ED\u30EA\u30FC",
    "\u330E"=>"\u30AC\u30ED\u30F3",
    "\u330F"=>"\u30AC\u30F3\u30DE",
    "\u3310"=>"\u30AE\u30AC",
    "\u3311"=>"\u30AE\u30CB\u30FC",
    "\u3312"=>"\u30AD\u30E5\u30EA\u30FC",
    "\u3313"=>"\u30AE\u30EB\u30C0\u30FC",
    "\u3314"=>"\u30AD\u30ED",
    "\u3315"=>"\u30AD\u30ED\u30B0\u30E9\u30E0",
    "\u3316"=>"\u30AD\u30ED\u30E1\u30FC\u30C8\u30EB",
    "\u3317"=>"\u30AD\u30ED\u30EF\u30C3\u30C8",
    "\u3318"=>"\u30B0\u30E9\u30E0",
    "\u3319"=>"\u30B0\u30E9\u30E0\u30C8\u30F3",
    "\u331A"=>"\u30AF\u30EB\u30BC\u30A4\u30ED",
    "\u331B"=>"\u30AF\u30ED\u30FC\u30CD",
    "\u331C"=>"\u30B1\u30FC\u30B9",
    "\u331D"=>"\u30B3\u30EB\u30CA",
    "\u331E"=>"\u30B3\u30FC\u30DD",
    "\u331F"=>"\u30B5\u30A4\u30AF\u30EB",
    "\u3320"=>"\u30B5\u30F3\u30C1\u30FC\u30E0",
    "\u3321"=>"\u30B7\u30EA\u30F3\u30B0",
    "\u3322"=>"\u30BB\u30F3\u30C1",
    "\u3323"=>"\u30BB\u30F3\u30C8",
    "\u3324"=>"\u30C0\u30FC\u30B9",
    "\u3325"=>"\u30C7\u30B7",
    "\u3326"=>"\u30C9\u30EB",
    "\u3327"=>"\u30C8\u30F3",
    "\u3328"=>"\u30CA\u30CE",
    "\u3329"=>"\u30CE\u30C3\u30C8",
    "\u332A"=>"\u30CF\u30A4\u30C4",
    "\u332B"=>"\u30D1\u30FC\u30BB\u30F3\u30C8",
    "\u332C"=>"\u30D1\u30FC\u30C4",
    "\u332D"=>"\u30D0\u30FC\u30EC\u30EB",
    "\u332E"=>"\u30D4\u30A2\u30B9\u30C8\u30EB",
    "\u332F"=>"\u30D4\u30AF\u30EB",
    "\u3330"=>"\u30D4\u30B3",
    "\u3331"=>"\u30D3\u30EB",
    "\u3332"=>"\u30D5\u30A1\u30E9\u30C3\u30C9",
    "\u3333"=>"\u30D5\u30A3\u30FC\u30C8",
    "\u3334"=>"\u30D6\u30C3\u30B7\u30A7\u30EB",
    "\u3335"=>"\u30D5\u30E9\u30F3",
    "\u3336"=>"\u30D8\u30AF\u30BF\u30FC\u30EB",
    "\u3337"=>"\u30DA\u30BD",
    "\u3338"=>"\u30DA\u30CB\u30D2",
    "\u3339"=>"\u30D8\u30EB\u30C4",
    "\u333A"=>"\u30DA\u30F3\u30B9",
    "\u333B"=>"\u30DA\u30FC\u30B8",
    "\u333C"=>"\u30D9\u30FC\u30BF",
    "\u333D"=>"\u30DD\u30A4\u30F3\u30C8",
    "\u333E"=>"\u30DC\u30EB\u30C8",
    "\u333F"=>"\u30DB\u30F3",
    "\u3340"=>"\u30DD\u30F3\u30C9",
    "\u3341"=>"\u30DB\u30FC\u30EB",
    "\u3342"=>"\u30DB\u30FC\u30F3",
    "\u3343"=>"\u30DE\u30A4\u30AF\u30ED",
    "\u3344"=>"\u30DE\u30A4\u30EB",
    "\u3345"=>"\u30DE\u30C3\u30CF",
    "\u3346"=>"\u30DE\u30EB\u30AF",
    "\u3347"=>"\u30DE\u30F3\u30B7\u30E7\u30F3",
    "\u3348"=>"\u30DF\u30AF\u30ED\u30F3",
    "\u3349"=>"\u30DF\u30EA",
    "\u334A"=>"\u30DF\u30EA\u30D0\u30FC\u30EB",
    "\u334B"=>"\u30E1\u30AC",
    "\u334C"=>"\u30E1\u30AC\u30C8\u30F3",
    "\u334D"=>"\u30E1\u30FC\u30C8\u30EB",
    "\u334E"=>"\u30E4\u30FC\u30C9",
    "\u334F"=>"\u30E4\u30FC\u30EB",
    "\u3350"=>"\u30E6\u30A2\u30F3",
    "\u3351"=>"\u30EA\u30C3\u30C8\u30EB",
    "\u3352"=>"\u30EA\u30E9",
    "\u3353"=>"\u30EB\u30D4\u30FC",
    "\u3354"=>"\u30EB\u30FC\u30D6\u30EB",
    "\u3355"=>"\u30EC\u30E0",
    "\u3356"=>"\u30EC\u30F3\u30C8\u30B2\u30F3",
    "\u3357"=>"\u30EF\u30C3\u30C8",
    "\u3358"=>"0\u70B9",
    "\u3359"=>"1\u70B9",
    "\u335A"=>"2\u70B9",
    "\u335B"=>"3\u70B9",
    "\u335C"=>"4\u70B9",
    "\u335D"=>"5\u70B9",
    "\u335E"=>"6\u70B9",
    "\u335F"=>"7\u70B9",
    "\u3360"=>"8\u70B9",
    "\u3361"=>"9\u70B9",
    "\u3362"=>"10\u70B9",
    "\u3363"=>"11\u70B9",
    "\u3364"=>"12\u70B9",
    "\u3365"=>"13\u70B9",
    "\u3366"=>"14\u70B9",
    "\u3367"=>"15\u70B9",
    "\u3368"=>"16\u70B9",
    "\u3369"=>"17\u70B9",
    "\u336A"=>"18\u70B9",
    "\u336B"=>"19\u70B9",
    "\u336C"=>"20\u70B9",
    "\u336D"=>"21\u70B9",
    "\u336E"=>"22\u70B9",
    "\u336F"=>"23\u70B9",
    "\u3370"=>"24\u70B9",
    "\u3371"=>"hPa",
    "\u3372"=>"da",
    "\u3373"=>"AU",
    "\u3374"=>"bar",
    "\u3375"=>"oV",
    "\u3376"=>"pc",
    "\u3377"=>"dm",
    "\u3378"=>"dm2",
    "\u3379"=>"dm3",
    "\u337A"=>"IU",
    "\u337B"=>"\u5E73\u6210",
    "\u337C"=>"\u662D\u548C",
    "\u337D"=>"\u5927\u6B63",
    "\u337E"=>"\u660E\u6CBB",
    "\u337F"=>"\u682A\u5F0F\u4F1A\u793E",
    "\u3380"=>"pA",
    "\u3381"=>"nA",
    "\u3382"=>"\u03BCA",
    "\u3383"=>"mA",
    "\u3384"=>"kA",
    "\u3385"=>"KB",
    "\u3386"=>"MB",
    "\u3387"=>"GB",
    "\u3388"=>"cal",
    "\u3389"=>"kcal",
    "\u338A"=>"pF",
    "\u338B"=>"nF",
    "\u338C"=>"\u03BCF",
    "\u338D"=>"\u03BCg",
    "\u338E"=>"mg",
    "\u338F"=>"kg",
    "\u3390"=>"Hz",
    "\u3391"=>"kHz",
    "\u3392"=>"MHz",
    "\u3393"=>"GHz",
    "\u3394"=>"THz",
    "\u3395"=>"\u03BCl",
    "\u3396"=>"ml",
    "\u3397"=>"dl",
    "\u3398"=>"kl",
    "\u3399"=>"fm",
    "\u339A"=>"nm",
    "\u339B"=>"\u03BCm",
    "\u339C"=>"mm",
    "\u339D"=>"cm",
    "\u339E"=>"km",
    "\u339F"=>"mm2",
    "\u33A0"=>"cm2",
    "\u33A1"=>"m2",
    "\u33A2"=>"km2",
    "\u33A3"=>"mm3",
    "\u33A4"=>"cm3",
    "\u33A5"=>"m3",
    "\u33A6"=>"km3",
    "\u33A7"=>"m\u2215s",
    "\u33A8"=>"m\u2215s2",
    "\u33A9"=>"Pa",
    "\u33AA"=>"kPa",
    "\u33AB"=>"MPa",
    "\u33AC"=>"GPa",
    "\u33AD"=>"rad",
    "\u33AE"=>"rad\u2215s",
    "\u33AF"=>"rad\u2215s2",
    "\u33B0"=>"ps",
    "\u33B1"=>"ns",
    "\u33B2"=>"\u03BCs",
    "\u33B3"=>"ms",
    "\u33B4"=>"pV",
    "\u33B5"=>"nV",
    "\u33B6"=>"\u03BCV",
    "\u33B7"=>"mV",
    "\u33B8"=>"kV",
    "\u33B9"=>"MV",
    "\u33BA"=>"pW",
    "\u33BB"=>"nW",
    "\u33BC"=>"\u03BCW",
    "\u33BD"=>"mW",
    "\u33BE"=>"kW",
    "\u33BF"=>"MW",
    "\u33C0"=>"k\u03A9",
    "\u33C1"=>"M\u03A9",
    "\u33C2"=>"a.m.",
    "\u33C3"=>"Bq",
    "\u33C4"=>"cc",
    "\u33C5"=>"cd",
    "\u33C6"=>"C\u2215kg",
    "\u33C7"=>"Co.",
    "\u33C8"=>"dB",
    "\u33C9"=>"Gy",
    "\u33CA"=>"ha",
    "\u33CB"=>"HP",
    "\u33CC"=>"in",
    "\u33CD"=>"KK",
    "\u33CE"=>"KM",
    "\u33CF"=>"kt",
    "\u33D0"=>"lm",
    "\u33D1"=>"ln",
    "\u33D2"=>"log",
    "\u33D3"=>"lx",
    "\u33D4"=>"mb",
    "\u33D5"=>"mil",
    "\u33D6"=>"mol",
    "\u33D7"=>"PH",
    "\u33D8"=>"p.m.",
    "\u33D9"=>"PPM",
    "\u33DA"=>"PR",
    "\u33DB"=>"sr",
    "\u33DC"=>"Sv",
    "\u33DD"=>"Wb",
    "\u33DE"=>"V\u2215m",
    "\u33DF"=>"A\u2215m",
    "\u33E0"=>"1\u65E5",
    "\u33E1"=>"2\u65E5",
    "\u33E2"=>"3\u65E5",
    "\u33E3"=>"4\u65E5",
    "\u33E4"=>"5\u65E5",
    "\u33E5"=>"6\u65E5",
    "\u33E6"=>"7\u65E5",
    "\u33E7"=>"8\u65E5",
    "\u33E8"=>"9\u65E5",
    "\u33E9"=>"10\u65E5",
    "\u33EA"=>"11\u65E5",
    "\u33EB"=>"12\u65E5",
    "\u33EC"=>"13\u65E5",
    "\u33ED"=>"14\u65E5",
    "\u33EE"=>"15\u65E5",
    "\u33EF"=>"16\u65E5",
    "\u33F0"=>"17\u65E5",
    "\u33F1"=>"18\u65E5",
    "\u33F2"=>"19\u65E5",
    "\u33F3"=>"20\u65E5",
    "\u33F4"=>"21\u65E5",
    "\u33F5"=>"22\u65E5",
    "\u33F6"=>"23\u65E5",
    "\u33F7"=>"24\u65E5",
    "\u33F8"=>"25\u65E5",
    "\u33F9"=>"26\u65E5",
    "\u33FA"=>"27\u65E5",
    "\u33FB"=>"28\u65E5",
    "\u33FC"=>"29\u65E5",
    "\u33FD"=>"30\u65E5",
    "\u33FE"=>"31\u65E5",
    "\u33FF"=>"gal",
    "\uA69C"=>"\u044A",
    "\uA69D"=>"\u044C",
    "\uA770"=>"\uA76F",
    "\uA7F8"=>"\u0126",
    "\uA7F9"=>"\u0153",
    "\uAB5C"=>"\uA727",
    "\uAB5D"=>"\uAB37",
    "\uAB5E"=>"\u026B",
    "\uAB5F"=>"\uAB52",
    "\uAB69"=>"\u028D",
    "\uFB00"=>"ff",
    "\uFB01"=>"fi",
    "\uFB02"=>"fl",
    "\uFB03"=>"ffi",
    "\uFB04"=>"ffl",
    "\uFB05"=>"st",
    "\uFB06"=>"st",
    "\uFB13"=>"\u0574\u0576",
    "\uFB14"=>"\u0574\u0565",
    "\uFB15"=>"\u0574\u056B",
    "\uFB16"=>"\u057E\u0576",
    "\uFB17"=>"\u0574\u056D",
    "\uFB20"=>"\u05E2",
    "\uFB21"=>"\u05D0",
    "\uFB22"=>"\u05D3",
    "\uFB23"=>"\u05D4",
    "\uFB24"=>"\u05DB",
    "\uFB25"=>"\u05DC",
    "\uFB26"=>"\u05DD",
    "\uFB27"=>"\u05E8",
    "\uFB28"=>"\u05EA",
    "\uFB29"=>"+",
    "\uFB4F"=>"\u05D0\u05DC",
    "\uFB50"=>"\u0671",
    "\uFB51"=>"\u0671",
    "\uFB52"=>"\u067B",
    "\uFB53"=>"\u067B",
    "\uFB54"=>"\u067B",
    "\uFB55"=>"\u067B",
    "\uFB56"=>"\u067E",
    "\uFB57"=>"\u067E",
    "\uFB58"=>"\u067E",
    "\uFB59"=>"\u067E",
    "\uFB5A"=>"\u0680",
    "\uFB5B"=>"\u0680",
    "\uFB5C"=>"\u0680",
    "\uFB5D"=>"\u0680",
    "\uFB5E"=>"\u067A",
    "\uFB5F"=>"\u067A",
    "\uFB60"=>"\u067A",
    "\uFB61"=>"\u067A",
    "\uFB62"=>"\u067F",
    "\uFB63"=>"\u067F",
    "\uFB64"=>"\u067F",
    "\uFB65"=>"\u067F",
    "\uFB66"=>"\u0679",
    "\uFB67"=>"\u0679",
    "\uFB68"=>"\u0679",
    "\uFB69"=>"\u0679",
    "\uFB6A"=>"\u06A4",
    "\uFB6B"=>"\u06A4",
    "\uFB6C"=>"\u06A4",
    "\uFB6D"=>"\u06A4",
    "\uFB6E"=>"\u06A6",
    "\uFB6F"=>"\u06A6",
    "\uFB70"=>"\u06A6",
    "\uFB71"=>"\u06A6",
    "\uFB72"=>"\u0684",
    "\uFB73"=>"\u0684",
    "\uFB74"=>"\u0684",
    "\uFB75"=>"\u0684",
    "\uFB76"=>"\u0683",
    "\uFB77"=>"\u0683",
    "\uFB78"=>"\u0683",
    "\uFB79"=>"\u0683",
    "\uFB7A"=>"\u0686",
    "\uFB7B"=>"\u0686",
    "\uFB7C"=>"\u0686",
    "\uFB7D"=>"\u0686",
    "\uFB7E"=>"\u0687",
    "\uFB7F"=>"\u0687",
    "\uFB80"=>"\u0687",
    "\uFB81"=>"\u0687",
    "\uFB82"=>"\u068D",
    "\uFB83"=>"\u068D",
    "\uFB84"=>"\u068C",
    "\uFB85"=>"\u068C",
    "\uFB86"=>"\u068E",
    "\uFB87"=>"\u068E",
    "\uFB88"=>"\u0688",
    "\uFB89"=>"\u0688",
    "\uFB8A"=>"\u0698",
    "\uFB8B"=>"\u0698",
    "\uFB8C"=>"\u0691",
    "\uFB8D"=>"\u0691",
    "\uFB8E"=>"\u06A9",
    "\uFB8F"=>"\u06A9",
    "\uFB90"=>"\u06A9",
    "\uFB91"=>"\u06A9",
    "\uFB92"=>"\u06AF",
    "\uFB93"=>"\u06AF",
    "\uFB94"=>"\u06AF",
    "\uFB95"=>"\u06AF",
    "\uFB96"=>"\u06B3",
    "\uFB97"=>"\u06B3",
    "\uFB98"=>"\u06B3",
    "\uFB99"=>"\u06B3",
    "\uFB9A"=>"\u06B1",
    "\uFB9B"=>"\u06B1",
    "\uFB9C"=>"\u06B1",
    "\uFB9D"=>"\u06B1",
    "\uFB9E"=>"\u06BA",
    "\uFB9F"=>"\u06BA",
    "\uFBA0"=>"\u06BB",
    "\uFBA1"=>"\u06BB",
    "\uFBA2"=>"\u06BB",
    "\uFBA3"=>"\u06BB",
    "\uFBA4"=>"\u06C0",
    "\uFBA5"=>"\u06C0",
    "\uFBA6"=>"\u06C1",
    "\uFBA7"=>"\u06C1",
    "\uFBA8"=>"\u06C1",
    "\uFBA9"=>"\u06C1",
    "\uFBAA"=>"\u06BE",
    "\uFBAB"=>"\u06BE",
    "\uFBAC"=>"\u06BE",
    "\uFBAD"=>"\u06BE",
    "\uFBAE"=>"\u06D2",
    "\uFBAF"=>"\u06D2",
    "\uFBB0"=>"\u06D3",
    "\uFBB1"=>"\u06D3",
    "\uFBD3"=>"\u06AD",
    "\uFBD4"=>"\u06AD",
    "\uFBD5"=>"\u06AD",
    "\uFBD6"=>"\u06AD",
    "\uFBD7"=>"\u06C7",
    "\uFBD8"=>"\u06C7",
    "\uFBD9"=>"\u06C6",
    "\uFBDA"=>"\u06C6",
    "\uFBDB"=>"\u06C8",
    "\uFBDC"=>"\u06C8",
    "\uFBDD"=>"\u06C7\u0674",
    "\uFBDE"=>"\u06CB",
    "\uFBDF"=>"\u06CB",
    "\uFBE0"=>"\u06C5",
    "\uFBE1"=>"\u06C5",
    "\uFBE2"=>"\u06C9",
    "\uFBE3"=>"\u06C9",
    "\uFBE4"=>"\u06D0",
    "\uFBE5"=>"\u06D0",
    "\uFBE6"=>"\u06D0",
    "\uFBE7"=>"\u06D0",
    "\uFBE8"=>"\u0649",
    "\uFBE9"=>"\u0649",
    "\uFBEA"=>"\u0626\u0627",
    "\uFBEB"=>"\u0626\u0627",
    "\uFBEC"=>"\u0626\u06D5",
    "\uFBED"=>"\u0626\u06D5",
    "\uFBEE"=>"\u0626\u0648",
    "\uFBEF"=>"\u0626\u0648",
    "\uFBF0"=>"\u0626\u06C7",
    "\uFBF1"=>"\u0626\u06C7",
    "\uFBF2"=>"\u0626\u06C6",
    "\uFBF3"=>"\u0626\u06C6",
    "\uFBF4"=>"\u0626\u06C8",
    "\uFBF5"=>"\u0626\u06C8",
    "\uFBF6"=>"\u0626\u06D0",
    "\uFBF7"=>"\u0626\u06D0",
    "\uFBF8"=>"\u0626\u06D0",
    "\uFBF9"=>"\u0626\u0649",
    "\uFBFA"=>"\u0626\u0649",
    "\uFBFB"=>"\u0626\u0649",
    "\uFBFC"=>"\u06CC",
    "\uFBFD"=>"\u06CC",
    "\uFBFE"=>"\u06CC",
    "\uFBFF"=>"\u06CC",
    "\uFC00"=>"\u0626\u062C",
    "\uFC01"=>"\u0626\u062D",
    "\uFC02"=>"\u0626\u0645",
    "\uFC03"=>"\u0626\u0649",
    "\uFC04"=>"\u0626\u064A",
    "\uFC05"=>"\u0628\u062C",
    "\uFC06"=>"\u0628\u062D",
    "\uFC07"=>"\u0628\u062E",
    "\uFC08"=>"\u0628\u0645",
    "\uFC09"=>"\u0628\u0649",
    "\uFC0A"=>"\u0628\u064A",
    "\uFC0B"=>"\u062A\u062C",
    "\uFC0C"=>"\u062A\u062D",
    "\uFC0D"=>"\u062A\u062E",
    "\uFC0E"=>"\u062A\u0645",
    "\uFC0F"=>"\u062A\u0649",
    "\uFC10"=>"\u062A\u064A",
    "\uFC11"=>"\u062B\u062C",
    "\uFC12"=>"\u062B\u0645",
    "\uFC13"=>"\u062B\u0649",
    "\uFC14"=>"\u062B\u064A",
    "\uFC15"=>"\u062C\u062D",
    "\uFC16"=>"\u062C\u0645",
    "\uFC17"=>"\u062D\u062C",
    "\uFC18"=>"\u062D\u0645",
    "\uFC19"=>"\u062E\u062C",
    "\uFC1A"=>"\u062E\u062D",
    "\uFC1B"=>"\u062E\u0645",
    "\uFC1C"=>"\u0633\u062C",
    "\uFC1D"=>"\u0633\u062D",
    "\uFC1E"=>"\u0633\u062E",
    "\uFC1F"=>"\u0633\u0645",
    "\uFC20"=>"\u0635\u062D",
    "\uFC21"=>"\u0635\u0645",
    "\uFC22"=>"\u0636\u062C",
    "\uFC23"=>"\u0636\u062D",
    "\uFC24"=>"\u0636\u062E",
    "\uFC25"=>"\u0636\u0645",
    "\uFC26"=>"\u0637\u062D",
    "\uFC27"=>"\u0637\u0645",
    "\uFC28"=>"\u0638\u0645",
    "\uFC29"=>"\u0639\u062C",
    "\uFC2A"=>"\u0639\u0645",
    "\uFC2B"=>"\u063A\u062C",
    "\uFC2C"=>"\u063A\u0645",
    "\uFC2D"=>"\u0641\u062C",
    "\uFC2E"=>"\u0641\u062D",
    "\uFC2F"=>"\u0641\u062E",
    "\uFC30"=>"\u0641\u0645",
    "\uFC31"=>"\u0641\u0649",
    "\uFC32"=>"\u0641\u064A",
    "\uFC33"=>"\u0642\u062D",
    "\uFC34"=>"\u0642\u0645",
    "\uFC35"=>"\u0642\u0649",
    "\uFC36"=>"\u0642\u064A",
    "\uFC37"=>"\u0643\u0627",
    "\uFC38"=>"\u0643\u062C",
    "\uFC39"=>"\u0643\u062D",
    "\uFC3A"=>"\u0643\u062E",
    "\uFC3B"=>"\u0643\u0644",
    "\uFC3C"=>"\u0643\u0645",
    "\uFC3D"=>"\u0643\u0649",
    "\uFC3E"=>"\u0643\u064A",
    "\uFC3F"=>"\u0644\u062C",
    "\uFC40"=>"\u0644\u062D",
    "\uFC41"=>"\u0644\u062E",
    "\uFC42"=>"\u0644\u0645",
    "\uFC43"=>"\u0644\u0649",
    "\uFC44"=>"\u0644\u064A",
    "\uFC45"=>"\u0645\u062C",
    "\uFC46"=>"\u0645\u062D",
    "\uFC47"=>"\u0645\u062E",
    "\uFC48"=>"\u0645\u0645",
    "\uFC49"=>"\u0645\u0649",
    "\uFC4A"=>"\u0645\u064A",
    "\uFC4B"=>"\u0646\u062C",
    "\uFC4C"=>"\u0646\u062D",
    "\uFC4D"=>"\u0646\u062E",
    "\uFC4E"=>"\u0646\u0645",
    "\uFC4F"=>"\u0646\u0649",
    "\uFC50"=>"\u0646\u064A",
    "\uFC51"=>"\u0647\u062C",
    "\uFC52"=>"\u0647\u0645",
    "\uFC53"=>"\u0647\u0649",
    "\uFC54"=>"\u0647\u064A",
    "\uFC55"=>"\u064A\u062C",
    "\uFC56"=>"\u064A\u062D",
    "\uFC57"=>"\u064A\u062E",
    "\uFC58"=>"\u064A\u0645",
    "\uFC59"=>"\u064A\u0649",
    "\uFC5A"=>"\u064A\u064A",
    "\uFC5B"=>"\u0630\u0670",
    "\uFC5C"=>"\u0631\u0670",
    "\uFC5D"=>"\u0649\u0670",
    "\uFC5E"=>" \u064C\u0651",
    "\uFC5F"=>" \u064D\u0651",
    "\uFC60"=>" \u064E\u0651",
    "\uFC61"=>" \u064F\u0651",
    "\uFC62"=>" \u0650\u0651",
    "\uFC63"=>" \u0651\u0670",
    "\uFC64"=>"\u0626\u0631",
    "\uFC65"=>"\u0626\u0632",
    "\uFC66"=>"\u0626\u0645",
    "\uFC67"=>"\u0626\u0646",
    "\uFC68"=>"\u0626\u0649",
    "\uFC69"=>"\u0626\u064A",
    "\uFC6A"=>"\u0628\u0631",
    "\uFC6B"=>"\u0628\u0632",
    "\uFC6C"=>"\u0628\u0645",
    "\uFC6D"=>"\u0628\u0646",
    "\uFC6E"=>"\u0628\u0649",
    "\uFC6F"=>"\u0628\u064A",
    "\uFC70"=>"\u062A\u0631",
    "\uFC71"=>"\u062A\u0632",
    "\uFC72"=>"\u062A\u0645",
    "\uFC73"=>"\u062A\u0646",
    "\uFC74"=>"\u062A\u0649",
    "\uFC75"=>"\u062A\u064A",
    "\uFC76"=>"\u062B\u0631",
    "\uFC77"=>"\u062B\u0632",
    "\uFC78"=>"\u062B\u0645",
    "\uFC79"=>"\u062B\u0646",
    "\uFC7A"=>"\u062B\u0649",
    "\uFC7B"=>"\u062B\u064A",
    "\uFC7C"=>"\u0641\u0649",
    "\uFC7D"=>"\u0641\u064A",
    "\uFC7E"=>"\u0642\u0649",
    "\uFC7F"=>"\u0642\u064A",
    "\uFC80"=>"\u0643\u0627",
    "\uFC81"=>"\u0643\u0644",
    "\uFC82"=>"\u0643\u0645",
    "\uFC83"=>"\u0643\u0649",
    "\uFC84"=>"\u0643\u064A",
    "\uFC85"=>"\u0644\u0645",
    "\uFC86"=>"\u0644\u0649",
    "\uFC87"=>"\u0644\u064A",
    "\uFC88"=>"\u0645\u0627",
    "\uFC89"=>"\u0645\u0645",
    "\uFC8A"=>"\u0646\u0631",
    "\uFC8B"=>"\u0646\u0632",
    "\uFC8C"=>"\u0646\u0645",
    "\uFC8D"=>"\u0646\u0646",
    "\uFC8E"=>"\u0646\u0649",
    "\uFC8F"=>"\u0646\u064A",
    "\uFC90"=>"\u0649\u0670",
    "\uFC91"=>"\u064A\u0631",
    "\uFC92"=>"\u064A\u0632",
    "\uFC93"=>"\u064A\u0645",
    "\uFC94"=>"\u064A\u0646",
    "\uFC95"=>"\u064A\u0649",
    "\uFC96"=>"\u064A\u064A",
    "\uFC97"=>"\u0626\u062C",
    "\uFC98"=>"\u0626\u062D",
    "\uFC99"=>"\u0626\u062E",
    "\uFC9A"=>"\u0626\u0645",
    "\uFC9B"=>"\u0626\u0647",
    "\uFC9C"=>"\u0628\u062C",
    "\uFC9D"=>"\u0628\u062D",
    "\uFC9E"=>"\u0628\u062E",
    "\uFC9F"=>"\u0628\u0645",
    "\uFCA0"=>"\u0628\u0647",
    "\uFCA1"=>"\u062A\u062C",
    "\uFCA2"=>"\u062A\u062D",
    "\uFCA3"=>"\u062A\u062E",
    "\uFCA4"=>"\u062A\u0645",
    "\uFCA5"=>"\u062A\u0647",
    "\uFCA6"=>"\u062B\u0645",
    "\uFCA7"=>"\u062C\u062D",
    "\uFCA8"=>"\u062C\u0645",
    "\uFCA9"=>"\u062D\u062C",
    "\uFCAA"=>"\u062D\u0645",
    "\uFCAB"=>"\u062E\u062C",
    "\uFCAC"=>"\u062E\u0645",
    "\uFCAD"=>"\u0633\u062C",
    "\uFCAE"=>"\u0633\u062D",
    "\uFCAF"=>"\u0633\u062E",
    "\uFCB0"=>"\u0633\u0645",
    "\uFCB1"=>"\u0635\u062D",
    "\uFCB2"=>"\u0635\u062E",
    "\uFCB3"=>"\u0635\u0645",
    "\uFCB4"=>"\u0636\u062C",
    "\uFCB5"=>"\u0636\u062D",
    "\uFCB6"=>"\u0636\u062E",
    "\uFCB7"=>"\u0636\u0645",
    "\uFCB8"=>"\u0637\u062D",
    "\uFCB9"=>"\u0638\u0645",
    "\uFCBA"=>"\u0639\u062C",
    "\uFCBB"=>"\u0639\u0645",
    "\uFCBC"=>"\u063A\u062C",
    "\uFCBD"=>"\u063A\u0645",
    "\uFCBE"=>"\u0641\u062C",
    "\uFCBF"=>"\u0641\u062D",
    "\uFCC0"=>"\u0641\u062E",
    "\uFCC1"=>"\u0641\u0645",
    "\uFCC2"=>"\u0642\u062D",
    "\uFCC3"=>"\u0642\u0645",
    "\uFCC4"=>"\u0643\u062C",
    "\uFCC5"=>"\u0643\u062D",
    "\uFCC6"=>"\u0643\u062E",
    "\uFCC7"=>"\u0643\u0644",
    "\uFCC8"=>"\u0643\u0645",
    "\uFCC9"=>"\u0644\u062C",
    "\uFCCA"=>"\u0644\u062D",
    "\uFCCB"=>"\u0644\u062E",
    "\uFCCC"=>"\u0644\u0645",
    "\uFCCD"=>"\u0644\u0647",
    "\uFCCE"=>"\u0645\u062C",
    "\uFCCF"=>"\u0645\u062D",
    "\uFCD0"=>"\u0645\u062E",
    "\uFCD1"=>"\u0645\u0645",
    "\uFCD2"=>"\u0646\u062C",
    "\uFCD3"=>"\u0646\u062D",
    "\uFCD4"=>"\u0646\u062E",
    "\uFCD5"=>"\u0646\u0645",
    "\uFCD6"=>"\u0646\u0647",
    "\uFCD7"=>"\u0647\u062C",
    "\uFCD8"=>"\u0647\u0645",
    "\uFCD9"=>"\u0647\u0670",
    "\uFCDA"=>"\u064A\u062C",
    "\uFCDB"=>"\u064A\u062D",
    "\uFCDC"=>"\u064A\u062E",
    "\uFCDD"=>"\u064A\u0645",
    "\uFCDE"=>"\u064A\u0647",
    "\uFCDF"=>"\u0626\u0645",
    "\uFCE0"=>"\u0626\u0647",
    "\uFCE1"=>"\u0628\u0645",
    "\uFCE2"=>"\u0628\u0647",
    "\uFCE3"=>"\u062A\u0645",
    "\uFCE4"=>"\u062A\u0647",
    "\uFCE5"=>"\u062B\u0645",
    "\uFCE6"=>"\u062B\u0647",
    "\uFCE7"=>"\u0633\u0645",
    "\uFCE8"=>"\u0633\u0647",
    "\uFCE9"=>"\u0634\u0645",
    "\uFCEA"=>"\u0634\u0647",
    "\uFCEB"=>"\u0643\u0644",
    "\uFCEC"=>"\u0643\u0645",
    "\uFCED"=>"\u0644\u0645",
    "\uFCEE"=>"\u0646\u0645",
    "\uFCEF"=>"\u0646\u0647",
    "\uFCF0"=>"\u064A\u0645",
    "\uFCF1"=>"\u064A\u0647",
    "\uFCF2"=>"\u0640\u064E\u0651",
    "\uFCF3"=>"\u0640\u064F\u0651",
    "\uFCF4"=>"\u0640\u0650\u0651",
    "\uFCF5"=>"\u0637\u0649",
    "\uFCF6"=>"\u0637\u064A",
    "\uFCF7"=>"\u0639\u0649",
    "\uFCF8"=>"\u0639\u064A",
    "\uFCF9"=>"\u063A\u0649",
    "\uFCFA"=>"\u063A\u064A",
    "\uFCFB"=>"\u0633\u0649",
    "\uFCFC"=>"\u0633\u064A",
    "\uFCFD"=>"\u0634\u0649",
    "\uFCFE"=>"\u0634\u064A",
    "\uFCFF"=>"\u062D\u0649",
    "\uFD00"=>"\u062D\u064A",
    "\uFD01"=>"\u062C\u0649",
    "\uFD02"=>"\u062C\u064A",
    "\uFD03"=>"\u062E\u0649",
    "\uFD04"=>"\u062E\u064A",
    "\uFD05"=>"\u0635\u0649",
    "\uFD06"=>"\u0635\u064A",
    "\uFD07"=>"\u0636\u0649",
    "\uFD08"=>"\u0636\u064A",
    "\uFD09"=>"\u0634\u062C",
    "\uFD0A"=>"\u0634\u062D",
    "\uFD0B"=>"\u0634\u062E",
    "\uFD0C"=>"\u0634\u0645",
    "\uFD0D"=>"\u0634\u0631",
    "\uFD0E"=>"\u0633\u0631",
    "\uFD0F"=>"\u0635\u0631",
    "\uFD10"=>"\u0636\u0631",
    "\uFD11"=>"\u0637\u0649",
    "\uFD12"=>"\u0637\u064A",
    "\uFD13"=>"\u0639\u0649",
    "\uFD14"=>"\u0639\u064A",
    "\uFD15"=>"\u063A\u0649",
    "\uFD16"=>"\u063A\u064A",
    "\uFD17"=>"\u0633\u0649",
    "\uFD18"=>"\u0633\u064A",
    "\uFD19"=>"\u0634\u0649",
    "\uFD1A"=>"\u0634\u064A",
    "\uFD1B"=>"\u062D\u0649",
    "\uFD1C"=>"\u062D\u064A",
    "\uFD1D"=>"\u062C\u0649",
    "\uFD1E"=>"\u062C\u064A",
    "\uFD1F"=>"\u062E\u0649",
    "\uFD20"=>"\u062E\u064A",
    "\uFD21"=>"\u0635\u0649",
    "\uFD22"=>"\u0635\u064A",
    "\uFD23"=>"\u0636\u0649",
    "\uFD24"=>"\u0636\u064A",
    "\uFD25"=>"\u0634\u062C",
    "\uFD26"=>"\u0634\u062D",
    "\uFD27"=>"\u0634\u062E",
    "\uFD28"=>"\u0634\u0645",
    "\uFD29"=>"\u0634\u0631",
    "\uFD2A"=>"\u0633\u0631",
    "\uFD2B"=>"\u0635\u0631",
    "\uFD2C"=>"\u0636\u0631",
    "\uFD2D"=>"\u0634\u062C",
    "\uFD2E"=>"\u0634\u062D",
    "\uFD2F"=>"\u0634\u062E",
    "\uFD30"=>"\u0634\u0645",
    "\uFD31"=>"\u0633\u0647",
    "\uFD32"=>"\u0634\u0647",
    "\uFD33"=>"\u0637\u0645",
    "\uFD34"=>"\u0633\u062C",
    "\uFD35"=>"\u0633\u062D",
    "\uFD36"=>"\u0633\u062E",
    "\uFD37"=>"\u0634\u062C",
    "\uFD38"=>"\u0634\u062D",
    "\uFD39"=>"\u0634\u062E",
    "\uFD3A"=>"\u0637\u0645",
    "\uFD3B"=>"\u0638\u0645",
    "\uFD3C"=>"\u0627\u064B",
    "\uFD3D"=>"\u0627\u064B",
    "\uFD50"=>"\u062A\u062C\u0645",
    "\uFD51"=>"\u062A\u062D\u062C",
    "\uFD52"=>"\u062A\u062D\u062C",
    "\uFD53"=>"\u062A\u062D\u0645",
    "\uFD54"=>"\u062A\u062E\u0645",
    "\uFD55"=>"\u062A\u0645\u062C",
    "\uFD56"=>"\u062A\u0645\u062D",
    "\uFD57"=>"\u062A\u0645\u062E",
    "\uFD58"=>"\u062C\u0645\u062D",
    "\uFD59"=>"\u062C\u0645\u062D",
    "\uFD5A"=>"\u062D\u0645\u064A",
    "\uFD5B"=>"\u062D\u0645\u0649",
    "\uFD5C"=>"\u0633\u062D\u062C",
    "\uFD5D"=>"\u0633\u062C\u062D",
    "\uFD5E"=>"\u0633\u062C\u0649",
    "\uFD5F"=>"\u0633\u0645\u062D",
    "\uFD60"=>"\u0633\u0645\u062D",
    "\uFD61"=>"\u0633\u0645\u062C",
    "\uFD62"=>"\u0633\u0645\u0645",
    "\uFD63"=>"\u0633\u0645\u0645",
    "\uFD64"=>"\u0635\u062D\u062D",
    "\uFD65"=>"\u0635\u062D\u062D",
    "\uFD66"=>"\u0635\u0645\u0645",
    "\uFD67"=>"\u0634\u062D\u0645",
    "\uFD68"=>"\u0634\u062D\u0645",
    "\uFD69"=>"\u0634\u062C\u064A",
    "\uFD6A"=>"\u0634\u0645\u062E",
    "\uFD6B"=>"\u0634\u0645\u062E",
    "\uFD6C"=>"\u0634\u0645\u0645",
    "\uFD6D"=>"\u0634\u0645\u0645",
    "\uFD6E"=>"\u0636\u062D\u0649",
    "\uFD6F"=>"\u0636\u062E\u0645",
    "\uFD70"=>"\u0636\u062E\u0645",
    "\uFD71"=>"\u0637\u0645\u062D",
    "\uFD72"=>"\u0637\u0645\u062D",
    "\uFD73"=>"\u0637\u0645\u0645",
    "\uFD74"=>"\u0637\u0645\u064A",
    "\uFD75"=>"\u0639\u062C\u0645",
    "\uFD76"=>"\u0639\u0645\u0645",
    "\uFD77"=>"\u0639\u0645\u0645",
    "\uFD78"=>"\u0639\u0645\u0649",
    "\uFD79"=>"\u063A\u0645\u0645",
    "\uFD7A"=>"\u063A\u0645\u064A",
    "\uFD7B"=>"\u063A\u0645\u0649",
    "\uFD7C"=>"\u0641\u062E\u0645",
    "\uFD7D"=>"\u0641\u062E\u0645",
    "\uFD7E"=>"\u0642\u0645\u062D",
    "\uFD7F"=>"\u0642\u0645\u0645",
    "\uFD80"=>"\u0644\u062D\u0645",
    "\uFD81"=>"\u0644\u062D\u064A",
    "\uFD82"=>"\u0644\u062D\u0649",
    "\uFD83"=>"\u0644\u062C\u062C",
    "\uFD84"=>"\u0644\u062C\u062C",
    "\uFD85"=>"\u0644\u062E\u0645",
    "\uFD86"=>"\u0644\u062E\u0645",
    "\uFD87"=>"\u0644\u0645\u062D",
    "\uFD88"=>"\u0644\u0645\u062D",
    "\uFD89"=>"\u0645\u062D\u062C",
    "\uFD8A"=>"\u0645\u062D\u0645",
    "\uFD8B"=>"\u0645\u062D\u064A",
    "\uFD8C"=>"\u0645\u062C\u062D",
    "\uFD8D"=>"\u0645\u062C\u0645",
    "\uFD8E"=>"\u0645\u062E\u062C",
    "\uFD8F"=>"\u0645\u062E\u0645",
    "\uFD92"=>"\u0645\u062C\u062E",
    "\uFD93"=>"\u0647\u0645\u062C",
    "\uFD94"=>"\u0647\u0645\u0645",
    "\uFD95"=>"\u0646\u062D\u0645",
    "\uFD96"=>"\u0646\u062D\u0649",
    "\uFD97"=>"\u0646\u062C\u0645",
    "\uFD98"=>"\u0646\u062C\u0645",
    "\uFD99"=>"\u0646\u062C\u0649",
    "\uFD9A"=>"\u0646\u0645\u064A",
    "\uFD9B"=>"\u0646\u0645\u0649",
    "\uFD9C"=>"\u064A\u0645\u0645",
    "\uFD9D"=>"\u064A\u0645\u0645",
    "\uFD9E"=>"\u0628\u062E\u064A",
    "\uFD9F"=>"\u062A\u062C\u064A",
    "\uFDA0"=>"\u062A\u062C\u0649",
    "\uFDA1"=>"\u062A\u062E\u064A",
    "\uFDA2"=>"\u062A\u062E\u0649",
    "\uFDA3"=>"\u062A\u0645\u064A",
    "\uFDA4"=>"\u062A\u0645\u0649",
    "\uFDA5"=>"\u062C\u0645\u064A",
    "\uFDA6"=>"\u062C\u062D\u0649",
    "\uFDA7"=>"\u062C\u0645\u0649",
    "\uFDA8"=>"\u0633\u062E\u0649",
    "\uFDA9"=>"\u0635\u062D\u064A",
    "\uFDAA"=>"\u0634\u062D\u064A",
    "\uFDAB"=>"\u0636\u062D\u064A",
    "\uFDAC"=>"\u0644\u062C\u064A",
    "\uFDAD"=>"\u0644\u0645\u064A",
    "\uFDAE"=>"\u064A\u062D\u064A",
    "\uFDAF"=>"\u064A\u062C\u064A",
    "\uFDB0"=>"\u064A\u0645\u064A",
    "\uFDB1"=>"\u0645\u0645\u064A",
    "\uFDB2"=>"\u0642\u0645\u064A",
    "\uFDB3"=>"\u0646\u062D\u064A",
    "\uFDB4"=>"\u0642\u0645\u062D",
    "\uFDB5"=>"\u0644\u062D\u0645",
    "\uFDB6"=>"\u0639\u0645\u064A",
    "\uFDB7"=>"\u0643\u0645\u064A",
    "\uFDB8"=>"\u0646\u062C\u062D",
    "\uFDB9"=>"\u0645\u062E\u064A",
    "\uFDBA"=>"\u0644\u062C\u0645",
    "\uFDBB"=>"\u0643\u0645\u0645",
    "\uFDBC"=>"\u0644\u062C\u0645",
    "\uFDBD"=>"\u0646\u062C\u062D",
    "\uFDBE"=>"\u062C\u062D\u064A",
    "\uFDBF"=>"\u062D\u062C\u064A",
    "\uFDC0"=>"\u0645\u062C\u064A",
    "\uFDC1"=>"\u0641\u0645\u064A",
    "\uFDC2"=>"\u0628\u062D\u064A",
    "\uFDC3"=>"\u0643\u0645\u0645",
    "\uFDC4"=>"\u0639\u062C\u0645",
    "\uFDC5"=>"\u0635\u0645\u0645",
    "\uFDC6"=>"\u0633\u062E\u064A",
    "\uFDC7"=>"\u0646\u062C\u064A",
    "\uFDF0"=>"\u0635\u0644\u06D2",
    "\uFDF1"=>"\u0642\u0644\u06D2",
    "\uFDF2"=>"\u0627\u0644\u0644\u0647",
    "\uFDF3"=>"\u0627\u0643\u0628\u0631",
    "\uFDF4"=>"\u0645\u062D\u0645\u062F",
    "\uFDF5"=>"\u0635\u0644\u0639\u0645",
    "\uFDF6"=>"\u0631\u0633\u0648\u0644",
    "\uFDF7"=>"\u0639\u0644\u064A\u0647",
    "\uFDF8"=>"\u0648\u0633\u0644\u0645",
    "\uFDF9"=>"\u0635\u0644\u0649",
    "\uFDFA"=>"\u0635\u0644\u0649 \u0627\u0644\u0644\u0647 \u0639\u0644\u064A\u0647 \u0648\u0633\u0644\u0645",
    "\uFDFB"=>"\u062C\u0644 \u062C\u0644\u0627\u0644\u0647",
    "\uFDFC"=>"\u0631\u06CC\u0627\u0644",
    "\uFE10"=>",",
    "\uFE11"=>"\u3001",
    "\uFE12"=>"\u3002",
    "\uFE13"=>":",
    "\uFE14"=>";",
    "\uFE15"=>"!",
    "\uFE16"=>"?",
    "\uFE17"=>"\u3016",
    "\uFE18"=>"\u3017",
    "\uFE19"=>"...",
    "\uFE30"=>"..",
    "\uFE31"=>"\u2014",
    "\uFE32"=>"\u2013",
    "\uFE33"=>"_",
    "\uFE34"=>"_",
    "\uFE35"=>"(",
    "\uFE36"=>")",
    "\uFE37"=>"{",
    "\uFE38"=>"}",
    "\uFE39"=>"\u3014",
    "\uFE3A"=>"\u3015",
    "\uFE3B"=>"\u3010",
    "\uFE3C"=>"\u3011",
    "\uFE3D"=>"\u300A",
    "\uFE3E"=>"\u300B",
    "\uFE3F"=>"\u3008",
    "\uFE40"=>"\u3009",
    "\uFE41"=>"\u300C",
    "\uFE42"=>"\u300D",
    "\uFE43"=>"\u300E",
    "\uFE44"=>"\u300F",
    "\uFE47"=>"[",
    "\uFE48"=>"]",
    "\uFE49"=>" \u0305",
    "\uFE4A"=>" \u0305",
    "\uFE4B"=>" \u0305",
    "\uFE4C"=>" \u0305",
    "\uFE4D"=>"_",
    "\uFE4E"=>"_",
    "\uFE4F"=>"_",
    "\uFE50"=>",",
    "\uFE51"=>"\u3001",
    "\uFE52"=>".",
    "\uFE54"=>";",
    "\uFE55"=>":",
    "\uFE56"=>"?",
    "\uFE57"=>"!",
    "\uFE58"=>"\u2014",
    "\uFE59"=>"(",
    "\uFE5A"=>")",
    "\uFE5B"=>"{",
    "\uFE5C"=>"}",
    "\uFE5D"=>"\u3014",
    "\uFE5E"=>"\u3015",
    "\uFE5F"=>"#",
    "\uFE60"=>"&",
    "\uFE61"=>"*",
    "\uFE62"=>"+",
    "\uFE63"=>"-",
    "\uFE64"=>"<",
    "\uFE65"=>">",
    "\uFE66"=>"=",
    "\uFE68"=>"\\",
    "\uFE69"=>"$",
    "\uFE6A"=>"%",
    "\uFE6B"=>"@",
    "\uFE70"=>" \u064B",
    "\uFE71"=>"\u0640\u064B",
    "\uFE72"=>" \u064C",
    "\uFE74"=>" \u064D",
    "\uFE76"=>" \u064E",
    "\uFE77"=>"\u0640\u064E",
    "\uFE78"=>" \u064F",
    "\uFE79"=>"\u0640\u064F",
    "\uFE7A"=>" \u0650",
    "\uFE7B"=>"\u0640\u0650",
    "\uFE7C"=>" \u0651",
    "\uFE7D"=>"\u0640\u0651",
    "\uFE7E"=>" \u0652",
    "\uFE7F"=>"\u0640\u0652",
    "\uFE80"=>"\u0621",
    "\uFE81"=>"\u0622",
    "\uFE82"=>"\u0622",
    "\uFE83"=>"\u0623",
    "\uFE84"=>"\u0623",
    "\uFE85"=>"\u0624",
    "\uFE86"=>"\u0624",
    "\uFE87"=>"\u0625",
    "\uFE88"=>"\u0625",
    "\uFE89"=>"\u0626",
    "\uFE8A"=>"\u0626",
    "\uFE8B"=>"\u0626",
    "\uFE8C"=>"\u0626",
    "\uFE8D"=>"\u0627",
    "\uFE8E"=>"\u0627",
    "\uFE8F"=>"\u0628",
    "\uFE90"=>"\u0628",
    "\uFE91"=>"\u0628",
    "\uFE92"=>"\u0628",
    "\uFE93"=>"\u0629",
    "\uFE94"=>"\u0629",
    "\uFE95"=>"\u062A",
    "\uFE96"=>"\u062A",
    "\uFE97"=>"\u062A",
    "\uFE98"=>"\u062A",
    "\uFE99"=>"\u062B",
    "\uFE9A"=>"\u062B",
    "\uFE9B"=>"\u062B",
    "\uFE9C"=>"\u062B",
    "\uFE9D"=>"\u062C",
    "\uFE9E"=>"\u062C",
    "\uFE9F"=>"\u062C",
    "\uFEA0"=>"\u062C",
    "\uFEA1"=>"\u062D",
    "\uFEA2"=>"\u062D",
    "\uFEA3"=>"\u062D",
    "\uFEA4"=>"\u062D",
    "\uFEA5"=>"\u062E",
    "\uFEA6"=>"\u062E",
    "\uFEA7"=>"\u062E",
    "\uFEA8"=>"\u062E",
    "\uFEA9"=>"\u062F",
    "\uFEAA"=>"\u062F",
    "\uFEAB"=>"\u0630",
    "\uFEAC"=>"\u0630",
    "\uFEAD"=>"\u0631",
    "\uFEAE"=>"\u0631",
    "\uFEAF"=>"\u0632",
    "\uFEB0"=>"\u0632",
    "\uFEB1"=>"\u0633",
    "\uFEB2"=>"\u0633",
    "\uFEB3"=>"\u0633",
    "\uFEB4"=>"\u0633",
    "\uFEB5"=>"\u0634",
    "\uFEB6"=>"\u0634",
    "\uFEB7"=>"\u0634",
    "\uFEB8"=>"\u0634",
    "\uFEB9"=>"\u0635",
    "\uFEBA"=>"\u0635",
    "\uFEBB"=>"\u0635",
    "\uFEBC"=>"\u0635",
    "\uFEBD"=>"\u0636",
    "\uFEBE"=>"\u0636",
    "\uFEBF"=>"\u0636",
    "\uFEC0"=>"\u0636",
    "\uFEC1"=>"\u0637",
    "\uFEC2"=>"\u0637",
    "\uFEC3"=>"\u0637",
    "\uFEC4"=>"\u0637",
    "\uFEC5"=>"\u0638",
    "\uFEC6"=>"\u0638",
    "\uFEC7"=>"\u0638",
    "\uFEC8"=>"\u0638",
    "\uFEC9"=>"\u0639",
    "\uFECA"=>"\u0639",
    "\uFECB"=>"\u0639",
    "\uFECC"=>"\u0639",
    "\uFECD"=>"\u063A",
    "\uFECE"=>"\u063A",
    "\uFECF"=>"\u063A",
    "\uFED0"=>"\u063A",
    "\uFED1"=>"\u0641",
    "\uFED2"=>"\u0641",
    "\uFED3"=>"\u0641",
    "\uFED4"=>"\u0641",
    "\uFED5"=>"\u0642",
    "\uFED6"=>"\u0642",
    "\uFED7"=>"\u0642",
    "\uFED8"=>"\u0642",
    "\uFED9"=>"\u0643",
    "\uFEDA"=>"\u0643",
    "\uFEDB"=>"\u0643",
    "\uFEDC"=>"\u0643",
    "\uFEDD"=>"\u0644",
    "\uFEDE"=>"\u0644",
    "\uFEDF"=>"\u0644",
    "\uFEE0"=>"\u0644",
    "\uFEE1"=>"\u0645",
    "\uFEE2"=>"\u0645",
    "\uFEE3"=>"\u0645",
    "\uFEE4"=>"\u0645",
    "\uFEE5"=>"\u0646",
    "\uFEE6"=>"\u0646",
    "\uFEE7"=>"\u0646",
    "\uFEE8"=>"\u0646",
    "\uFEE9"=>"\u0647",
    "\uFEEA"=>"\u0647",
    "\uFEEB"=>"\u0647",
    "\uFEEC"=>"\u0647",
    "\uFEED"=>"\u0648",
    "\uFEEE"=>"\u0648",
    "\uFEEF"=>"\u0649",
    "\uFEF0"=>"\u0649",
    "\uFEF1"=>"\u064A",
    "\uFEF2"=>"\u064A",
    "\uFEF3"=>"\u064A",
    "\uFEF4"=>"\u064A",
    "\uFEF5"=>"\u0644\u0622",
    "\uFEF6"=>"\u0644\u0622",
    "\uFEF7"=>"\u0644\u0623",
    "\uFEF8"=>"\u0644\u0623",
    "\uFEF9"=>"\u0644\u0625",
    "\uFEFA"=>"\u0644\u0625",
    "\uFEFB"=>"\u0644\u0627",
    "\uFEFC"=>"\u0644\u0627",
    "\uFF01"=>"!",
    "\uFF02"=>"\"",
    "\uFF03"=>"#",
    "\uFF04"=>"$",
    "\uFF05"=>"%",
    "\uFF06"=>"&",
    "\uFF07"=>"'",
    "\uFF08"=>"(",
    "\uFF09"=>")",
    "\uFF0A"=>"*",
    "\uFF0B"=>"+",
    "\uFF0C"=>",",
    "\uFF0D"=>"-",
    "\uFF0E"=>".",
    "\uFF0F"=>"/",
    "\uFF10"=>"0",
    "\uFF11"=>"1",
    "\uFF12"=>"2",
    "\uFF13"=>"3",
    "\uFF14"=>"4",
    "\uFF15"=>"5",
    "\uFF16"=>"6",
    "\uFF17"=>"7",
    "\uFF18"=>"8",
    "\uFF19"=>"9",
    "\uFF1A"=>":",
    "\uFF1B"=>";",
    "\uFF1C"=>"<",
    "\uFF1D"=>"=",
    "\uFF1E"=>">",
    "\uFF1F"=>"?",
    "\uFF20"=>"@",
    "\uFF21"=>"A",
    "\uFF22"=>"B",
    "\uFF23"=>"C",
    "\uFF24"=>"D",
    "\uFF25"=>"E",
    "\uFF26"=>"F",
    "\uFF27"=>"G",
    "\uFF28"=>"H",
    "\uFF29"=>"I",
    "\uFF2A"=>"J",
    "\uFF2B"=>"K",
    "\uFF2C"=>"L",
    "\uFF2D"=>"M",
    "\uFF2E"=>"N",
    "\uFF2F"=>"O",
    "\uFF30"=>"P",
    "\uFF31"=>"Q",
    "\uFF32"=>"R",
    "\uFF33"=>"S",
    "\uFF34"=>"T",
    "\uFF35"=>"U",
    "\uFF36"=>"V",
    "\uFF37"=>"W",
    "\uFF38"=>"X",
    "\uFF39"=>"Y",
    "\uFF3A"=>"Z",
    "\uFF3B"=>"[",
    "\uFF3C"=>"\\",
    "\uFF3D"=>"]",
    "\uFF3E"=>"^",
    "\uFF3F"=>"_",
    "\uFF40"=>"`",
    "\uFF41"=>"a",
    "\uFF42"=>"b",
    "\uFF43"=>"c",
    "\uFF44"=>"d",
    "\uFF45"=>"e",
    "\uFF46"=>"f",
    "\uFF47"=>"g",
    "\uFF48"=>"h",
    "\uFF49"=>"i",
    "\uFF4A"=>"j",
    "\uFF4B"=>"k",
    "\uFF4C"=>"l",
    "\uFF4D"=>"m",
    "\uFF4E"=>"n",
    "\uFF4F"=>"o",
    "\uFF50"=>"p",
    "\uFF51"=>"q",
    "\uFF52"=>"r",
    "\uFF53"=>"s",
    "\uFF54"=>"t",
    "\uFF55"=>"u",
    "\uFF56"=>"v",
    "\uFF57"=>"w",
    "\uFF58"=>"x",
    "\uFF59"=>"y",
    "\uFF5A"=>"z",
    "\uFF5B"=>"{",
    "\uFF5C"=>"|",
    "\uFF5D"=>"}",
    "\uFF5E"=>"~",
    "\uFF5F"=>"\u2985",
    "\uFF60"=>"\u2986",
    "\uFF61"=>"\u3002",
    "\uFF62"=>"\u300C",
    "\uFF63"=>"\u300D",
    "\uFF64"=>"\u3001",
    "\uFF65"=>"\u30FB",
    "\uFF66"=>"\u30F2",
    "\uFF67"=>"\u30A1",
    "\uFF68"=>"\u30A3",
    "\uFF69"=>"\u30A5",
    "\uFF6A"=>"\u30A7",
    "\uFF6B"=>"\u30A9",
    "\uFF6C"=>"\u30E3",
    "\uFF6D"=>"\u30E5",
    "\uFF6E"=>"\u30E7",
    "\uFF6F"=>"\u30C3",
    "\uFF70"=>"\u30FC",
    "\uFF71"=>"\u30A2",
    "\uFF72"=>"\u30A4",
    "\uFF73"=>"\u30A6",
    "\uFF74"=>"\u30A8",
    "\uFF75"=>"\u30AA",
    "\uFF76"=>"\u30AB",
    "\uFF77"=>"\u30AD",
    "\uFF78"=>"\u30AF",
    "\uFF79"=>"\u30B1",
    "\uFF7A"=>"\u30B3",
    "\uFF7B"=>"\u30B5",
    "\uFF7C"=>"\u30B7",
    "\uFF7D"=>"\u30B9",
    "\uFF7E"=>"\u30BB",
    "\uFF7F"=>"\u30BD",
    "\uFF80"=>"\u30BF",
    "\uFF81"=>"\u30C1",
    "\uFF82"=>"\u30C4",
    "\uFF83"=>"\u30C6",
    "\uFF84"=>"\u30C8",
    "\uFF85"=>"\u30CA",
    "\uFF86"=>"\u30CB",
    "\uFF87"=>"\u30CC",
    "\uFF88"=>"\u30CD",
    "\uFF89"=>"\u30CE",
    "\uFF8A"=>"\u30CF",
    "\uFF8B"=>"\u30D2",
    "\uFF8C"=>"\u30D5",
    "\uFF8D"=>"\u30D8",
    "\uFF8E"=>"\u30DB",
    "\uFF8F"=>"\u30DE",
    "\uFF90"=>"\u30DF",
    "\uFF91"=>"\u30E0",
    "\uFF92"=>"\u30E1",
    "\uFF93"=>"\u30E2",
    "\uFF94"=>"\u30E4",
    "\uFF95"=>"\u30E6",
    "\uFF96"=>"\u30E8",
    "\uFF97"=>"\u30E9",
    "\uFF98"=>"\u30EA",
    "\uFF99"=>"\u30EB",
    "\uFF9A"=>"\u30EC",
    "\uFF9B"=>"\u30ED",
    "\uFF9C"=>"\u30EF",
    "\uFF9D"=>"\u30F3",
    "\uFF9E"=>"\u3099",
    "\uFF9F"=>"\u309A",
    "\uFFA0"=>"\u1160",
    "\uFFA1"=>"\u1100",
    "\uFFA2"=>"\u1101",
    "\uFFA3"=>"\u11AA",
    "\uFFA4"=>"\u1102",
    "\uFFA5"=>"\u11AC",
    "\uFFA6"=>"\u11AD",
    "\uFFA7"=>"\u1103",
    "\uFFA8"=>"\u1104",
    "\uFFA9"=>"\u1105",
    "\uFFAA"=>"\u11B0",
    "\uFFAB"=>"\u11B1",
    "\uFFAC"=>"\u11B2",
    "\uFFAD"=>"\u11B3",
    "\uFFAE"=>"\u11B4",
    "\uFFAF"=>"\u11B5",
    "\uFFB0"=>"\u111A",
    "\uFFB1"=>"\u1106",
    "\uFFB2"=>"\u1107",
    "\uFFB3"=>"\u1108",
    "\uFFB4"=>"\u1121",
    "\uFFB5"=>"\u1109",
    "\uFFB6"=>"\u110A",
    "\uFFB7"=>"\u110B",
    "\uFFB8"=>"\u110C",
    "\uFFB9"=>"\u110D",
    "\uFFBA"=>"\u110E",
    "\uFFBB"=>"\u110F",
    "\uFFBC"=>"\u1110",
    "\uFFBD"=>"\u1111",
    "\uFFBE"=>"\u1112",
    "\uFFC2"=>"\u1161",
    "\uFFC3"=>"\u1162",
    "\uFFC4"=>"\u1163",
    "\uFFC5"=>"\u1164",
    "\uFFC6"=>"\u1165",
    "\uFFC7"=>"\u1166",
    "\uFFCA"=>"\u1167",
    "\uFFCB"=>"\u1168",
    "\uFFCC"=>"\u1169",
    "\uFFCD"=>"\u116A",
    "\uFFCE"=>"\u116B",
    "\uFFCF"=>"\u116C",
    "\uFFD2"=>"\u116D",
    "\uFFD3"=>"\u116E",
    "\uFFD4"=>"\u116F",
    "\uFFD5"=>"\u1170",
    "\uFFD6"=>"\u1171",
    "\uFFD7"=>"\u1172",
    "\uFFDA"=>"\u1173",
    "\uFFDB"=>"\u1174",
    "\uFFDC"=>"\u1175",
    "\uFFE0"=>"\u00A2",
    "\uFFE1"=>"\u00A3",
    "\uFFE2"=>"\u00AC",
    "\uFFE3"=>" \u0304",
    "\uFFE4"=>"\u00A6",
    "\uFFE5"=>"\u00A5",
    "\uFFE6"=>"\u20A9",
    "\uFFE8"=>"\u2502",
    "\uFFE9"=>"\u2190",
    "\uFFEA"=>"\u2191",
    "\uFFEB"=>"\u2192",
    "\uFFEC"=>"\u2193",
    "\uFFED"=>"\u25A0",
    "\uFFEE"=>"\u25CB",
    "\u{1D400}"=>"A",
    "\u{1D401}"=>"B",
    "\u{1D402}"=>"C",
    "\u{1D403}"=>"D",
    "\u{1D404}"=>"E",
    "\u{1D405}"=>"F",
    "\u{1D406}"=>"G",
    "\u{1D407}"=>"H",
    "\u{1D408}"=>"I",
    "\u{1D409}"=>"J",
    "\u{1D40A}"=>"K",
    "\u{1D40B}"=>"L",
    "\u{1D40C}"=>"M",
    "\u{1D40D}"=>"N",
    "\u{1D40E}"=>"O",
    "\u{1D40F}"=>"P",
    "\u{1D410}"=>"Q",
    "\u{1D411}"=>"R",
    "\u{1D412}"=>"S",
    "\u{1D413}"=>"T",
    "\u{1D414}"=>"U",
    "\u{1D415}"=>"V",
    "\u{1D416}"=>"W",
    "\u{1D417}"=>"X",
    "\u{1D418}"=>"Y",
    "\u{1D419}"=>"Z",
    "\u{1D41A}"=>"a",
    "\u{1D41B}"=>"b",
    "\u{1D41C}"=>"c",
    "\u{1D41D}"=>"d",
    "\u{1D41E}"=>"e",
    "\u{1D41F}"=>"f",
    "\u{1D420}"=>"g",
    "\u{1D421}"=>"h",
    "\u{1D422}"=>"i",
    "\u{1D423}"=>"j",
    "\u{1D424}"=>"k",
    "\u{1D425}"=>"l",
    "\u{1D426}"=>"m",
    "\u{1D427}"=>"n",
    "\u{1D428}"=>"o",
    "\u{1D429}"=>"p",
    "\u{1D42A}"=>"q",
    "\u{1D42B}"=>"r",
    "\u{1D42C}"=>"s",
    "\u{1D42D}"=>"t",
    "\u{1D42E}"=>"u",
    "\u{1D42F}"=>"v",
    "\u{1D430}"=>"w",
    "\u{1D431}"=>"x",
    "\u{1D432}"=>"y",
    "\u{1D433}"=>"z",
    "\u{1D434}"=>"A",
    "\u{1D435}"=>"B",
    "\u{1D436}"=>"C",
    "\u{1D437}"=>"D",
    "\u{1D438}"=>"E",
    "\u{1D439}"=>"F",
    "\u{1D43A}"=>"G",
    "\u{1D43B}"=>"H",
    "\u{1D43C}"=>"I",
    "\u{1D43D}"=>"J",
    "\u{1D43E}"=>"K",
    "\u{1D43F}"=>"L",
    "\u{1D440}"=>"M",
    "\u{1D441}"=>"N",
    "\u{1D442}"=>"O",
    "\u{1D443}"=>"P",
    "\u{1D444}"=>"Q",
    "\u{1D445}"=>"R",
    "\u{1D446}"=>"S",
    "\u{1D447}"=>"T",
    "\u{1D448}"=>"U",
    "\u{1D449}"=>"V",
    "\u{1D44A}"=>"W",
    "\u{1D44B}"=>"X",
    "\u{1D44C}"=>"Y",
    "\u{1D44D}"=>"Z",
    "\u{1D44E}"=>"a",
    "\u{1D44F}"=>"b",
    "\u{1D450}"=>"c",
    "\u{1D451}"=>"d",
    "\u{1D452}"=>"e",
    "\u{1D453}"=>"f",
    "\u{1D454}"=>"g",
    "\u{1D456}"=>"i",
    "\u{1D457}"=>"j",
    "\u{1D458}"=>"k",
    "\u{1D459}"=>"l",
    "\u{1D45A}"=>"m",
    "\u{1D45B}"=>"n",
    "\u{1D45C}"=>"o",
    "\u{1D45D}"=>"p",
    "\u{1D45E}"=>"q",
    "\u{1D45F}"=>"r",
    "\u{1D460}"=>"s",
    "\u{1D461}"=>"t",
    "\u{1D462}"=>"u",
    "\u{1D463}"=>"v",
    "\u{1D464}"=>"w",
    "\u{1D465}"=>"x",
    "\u{1D466}"=>"y",
    "\u{1D467}"=>"z",
    "\u{1D468}"=>"A",
    "\u{1D469}"=>"B",
    "\u{1D46A}"=>"C",
    "\u{1D46B}"=>"D",
    "\u{1D46C}"=>"E",
    "\u{1D46D}"=>"F",
    "\u{1D46E}"=>"G",
    "\u{1D46F}"=>"H",
    "\u{1D470}"=>"I",
    "\u{1D471}"=>"J",
    "\u{1D472}"=>"K",
    "\u{1D473}"=>"L",
    "\u{1D474}"=>"M",
    "\u{1D475}"=>"N",
    "\u{1D476}"=>"O",
    "\u{1D477}"=>"P",
    "\u{1D478}"=>"Q",
    "\u{1D479}"=>"R",
    "\u{1D47A}"=>"S",
    "\u{1D47B}"=>"T",
    "\u{1D47C}"=>"U",
    "\u{1D47D}"=>"V",
    "\u{1D47E}"=>"W",
    "\u{1D47F}"=>"X",
    "\u{1D480}"=>"Y",
    "\u{1D481}"=>"Z",
    "\u{1D482}"=>"a",
    "\u{1D483}"=>"b",
    "\u{1D484}"=>"c",
    "\u{1D485}"=>"d",
    "\u{1D486}"=>"e",
    "\u{1D487}"=>"f",
    "\u{1D488}"=>"g",
    "\u{1D489}"=>"h",
    "\u{1D48A}"=>"i",
    "\u{1D48B}"=>"j",
    "\u{1D48C}"=>"k",
    "\u{1D48D}"=>"l",
    "\u{1D48E}"=>"m",
    "\u{1D48F}"=>"n",
    "\u{1D490}"=>"o",
    "\u{1D491}"=>"p",
    "\u{1D492}"=>"q",
    "\u{1D493}"=>"r",
    "\u{1D494}"=>"s",
    "\u{1D495}"=>"t",
    "\u{1D496}"=>"u",
    "\u{1D497}"=>"v",
    "\u{1D498}"=>"w",
    "\u{1D499}"=>"x",
    "\u{1D49A}"=>"y",
    "\u{1D49B}"=>"z",
    "\u{1D49C}"=>"A",
    "\u{1D49E}"=>"C",
    "\u{1D49F}"=>"D",
    "\u{1D4A2}"=>"G",
    "\u{1D4A5}"=>"J",
    "\u{1D4A6}"=>"K",
    "\u{1D4A9}"=>"N",
    "\u{1D4AA}"=>"O",
    "\u{1D4AB}"=>"P",
    "\u{1D4AC}"=>"Q",
    "\u{1D4AE}"=>"S",
    "\u{1D4AF}"=>"T",
    "\u{1D4B0}"=>"U",
    "\u{1D4B1}"=>"V",
    "\u{1D4B2}"=>"W",
    "\u{1D4B3}"=>"X",
    "\u{1D4B4}"=>"Y",
    "\u{1D4B5}"=>"Z",
    "\u{1D4B6}"=>"a",
    "\u{1D4B7}"=>"b",
    "\u{1D4B8}"=>"c",
    "\u{1D4B9}"=>"d",
    "\u{1D4BB}"=>"f",
    "\u{1D4BD}"=>"h",
    "\u{1D4BE}"=>"i",
    "\u{1D4BF}"=>"j",
    "\u{1D4C0}"=>"k",
    "\u{1D4C1}"=>"l",
    "\u{1D4C2}"=>"m",
    "\u{1D4C3}"=>"n",
    "\u{1D4C5}"=>"p",
    "\u{1D4C6}"=>"q",
    "\u{1D4C7}"=>"r",
    "\u{1D4C8}"=>"s",
    "\u{1D4C9}"=>"t",
    "\u{1D4CA}"=>"u",
    "\u{1D4CB}"=>"v",
    "\u{1D4CC}"=>"w",
    "\u{1D4CD}"=>"x",
    "\u{1D4CE}"=>"y",
    "\u{1D4CF}"=>"z",
    "\u{1D4D0}"=>"A",
    "\u{1D4D1}"=>"B",
    "\u{1D4D2}"=>"C",
    "\u{1D4D3}"=>"D",
    "\u{1D4D4}"=>"E",
    "\u{1D4D5}"=>"F",
    "\u{1D4D6}"=>"G",
    "\u{1D4D7}"=>"H",
    "\u{1D4D8}"=>"I",
    "\u{1D4D9}"=>"J",
    "\u{1D4DA}"=>"K",
    "\u{1D4DB}"=>"L",
    "\u{1D4DC}"=>"M",
    "\u{1D4DD}"=>"N",
    "\u{1D4DE}"=>"O",
    "\u{1D4DF}"=>"P",
    "\u{1D4E0}"=>"Q",
    "\u{1D4E1}"=>"R",
    "\u{1D4E2}"=>"S",
    "\u{1D4E3}"=>"T",
    "\u{1D4E4}"=>"U",
    "\u{1D4E5}"=>"V",
    "\u{1D4E6}"=>"W",
    "\u{1D4E7}"=>"X",
    "\u{1D4E8}"=>"Y",
    "\u{1D4E9}"=>"Z",
    "\u{1D4EA}"=>"a",
    "\u{1D4EB}"=>"b",
    "\u{1D4EC}"=>"c",
    "\u{1D4ED}"=>"d",
    "\u{1D4EE}"=>"e",
    "\u{1D4EF}"=>"f",
    "\u{1D4F0}"=>"g",
    "\u{1D4F1}"=>"h",
    "\u{1D4F2}"=>"i",
    "\u{1D4F3}"=>"j",
    "\u{1D4F4}"=>"k",
    "\u{1D4F5}"=>"l",
    "\u{1D4F6}"=>"m",
    "\u{1D4F7}"=>"n",
    "\u{1D4F8}"=>"o",
    "\u{1D4F9}"=>"p",
    "\u{1D4FA}"=>"q",
    "\u{1D4FB}"=>"r",
    "\u{1D4FC}"=>"s",
    "\u{1D4FD}"=>"t",
    "\u{1D4FE}"=>"u",
    "\u{1D4FF}"=>"v",
    "\u{1D500}"=>"w",
    "\u{1D501}"=>"x",
    "\u{1D502}"=>"y",
    "\u{1D503}"=>"z",
    "\u{1D504}"=>"A",
    "\u{1D505}"=>"B",
    "\u{1D507}"=>"D",
    "\u{1D508}"=>"E",
    "\u{1D509}"=>"F",
    "\u{1D50A}"=>"G",
    "\u{1D50D}"=>"J",
    "\u{1D50E}"=>"K",
    "\u{1D50F}"=>"L",
    "\u{1D510}"=>"M",
    "\u{1D511}"=>"N",
    "\u{1D512}"=>"O",
    "\u{1D513}"=>"P",
    "\u{1D514}"=>"Q",
    "\u{1D516}"=>"S",
    "\u{1D517}"=>"T",
    "\u{1D518}"=>"U",
    "\u{1D519}"=>"V",
    "\u{1D51A}"=>"W",
    "\u{1D51B}"=>"X",
    "\u{1D51C}"=>"Y",
    "\u{1D51E}"=>"a",
    "\u{1D51F}"=>"b",
    "\u{1D520}"=>"c",
    "\u{1D521}"=>"d",
    "\u{1D522}"=>"e",
    "\u{1D523}"=>"f",
    "\u{1D524}"=>"g",
    "\u{1D525}"=>"h",
    "\u{1D526}"=>"i",
    "\u{1D527}"=>"j",
    "\u{1D528}"=>"k",
    "\u{1D529}"=>"l",
    "\u{1D52A}"=>"m",
    "\u{1D52B}"=>"n",
    "\u{1D52C}"=>"o",
    "\u{1D52D}"=>"p",
    "\u{1D52E}"=>"q",
    "\u{1D52F}"=>"r",
    "\u{1D530}"=>"s",
    "\u{1D531}"=>"t",
    "\u{1D532}"=>"u",
    "\u{1D533}"=>"v",
    "\u{1D534}"=>"w",
    "\u{1D535}"=>"x",
    "\u{1D536}"=>"y",
    "\u{1D537}"=>"z",
    "\u{1D538}"=>"A",
    "\u{1D539}"=>"B",
    "\u{1D53B}"=>"D",
    "\u{1D53C}"=>"E",
    "\u{1D53D}"=>"F",
    "\u{1D53E}"=>"G",
    "\u{1D540}"=>"I",
    "\u{1D541}"=>"J",
    "\u{1D542}"=>"K",
    "\u{1D543}"=>"L",
    "\u{1D544}"=>"M",
    "\u{1D546}"=>"O",
    "\u{1D54A}"=>"S",
    "\u{1D54B}"=>"T",
    "\u{1D54C}"=>"U",
    "\u{1D54D}"=>"V",
    "\u{1D54E}"=>"W",
    "\u{1D54F}"=>"X",
    "\u{1D550}"=>"Y",
    "\u{1D552}"=>"a",
    "\u{1D553}"=>"b",
    "\u{1D554}"=>"c",
    "\u{1D555}"=>"d",
    "\u{1D556}"=>"e",
    "\u{1D557}"=>"f",
    "\u{1D558}"=>"g",
    "\u{1D559}"=>"h",
    "\u{1D55A}"=>"i",
    "\u{1D55B}"=>"j",
    "\u{1D55C}"=>"k",
    "\u{1D55D}"=>"l",
    "\u{1D55E}"=>"m",
    "\u{1D55F}"=>"n",
    "\u{1D560}"=>"o",
    "\u{1D561}"=>"p",
    "\u{1D562}"=>"q",
    "\u{1D563}"=>"r",
    "\u{1D564}"=>"s",
    "\u{1D565}"=>"t",
    "\u{1D566}"=>"u",
    "\u{1D567}"=>"v",
    "\u{1D568}"=>"w",
    "\u{1D569}"=>"x",
    "\u{1D56A}"=>"y",
    "\u{1D56B}"=>"z",
    "\u{1D56C}"=>"A",
    "\u{1D56D}"=>"B",
    "\u{1D56E}"=>"C",
    "\u{1D56F}"=>"D",
    "\u{1D570}"=>"E",
    "\u{1D571}"=>"F",
    "\u{1D572}"=>"G",
    "\u{1D573}"=>"H",
    "\u{1D574}"=>"I",
    "\u{1D575}"=>"J",
    "\u{1D576}"=>"K",
    "\u{1D577}"=>"L",
    "\u{1D578}"=>"M",
    "\u{1D579}"=>"N",
    "\u{1D57A}"=>"O",
    "\u{1D57B}"=>"P",
    "\u{1D57C}"=>"Q",
    "\u{1D57D}"=>"R",
    "\u{1D57E}"=>"S",
    "\u{1D57F}"=>"T",
    "\u{1D580}"=>"U",
    "\u{1D581}"=>"V",
    "\u{1D582}"=>"W",
    "\u{1D583}"=>"X",
    "\u{1D584}"=>"Y",
    "\u{1D585}"=>"Z",
    "\u{1D586}"=>"a",
    "\u{1D587}"=>"b",
    "\u{1D588}"=>"c",
    "\u{1D589}"=>"d",
    "\u{1D58A}"=>"e",
    "\u{1D58B}"=>"f",
    "\u{1D58C}"=>"g",
    "\u{1D58D}"=>"h",
    "\u{1D58E}"=>"i",
    "\u{1D58F}"=>"j",
    "\u{1D590}"=>"k",
    "\u{1D591}"=>"l",
    "\u{1D592}"=>"m",
    "\u{1D593}"=>"n",
    "\u{1D594}"=>"o",
    "\u{1D595}"=>"p",
    "\u{1D596}"=>"q",
    "\u{1D597}"=>"r",
    "\u{1D598}"=>"s",
    "\u{1D599}"=>"t",
    "\u{1D59A}"=>"u",
    "\u{1D59B}"=>"v",
    "\u{1D59C}"=>"w",
    "\u{1D59D}"=>"x",
    "\u{1D59E}"=>"y",
    "\u{1D59F}"=>"z",
    "\u{1D5A0}"=>"A",
    "\u{1D5A1}"=>"B",
    "\u{1D5A2}"=>"C",
    "\u{1D5A3}"=>"D",
    "\u{1D5A4}"=>"E",
    "\u{1D5A5}"=>"F",
    "\u{1D5A6}"=>"G",
    "\u{1D5A7}"=>"H",
    "\u{1D5A8}"=>"I",
    "\u{1D5A9}"=>"J",
    "\u{1D5AA}"=>"K",
    "\u{1D5AB}"=>"L",
    "\u{1D5AC}"=>"M",
    "\u{1D5AD}"=>"N",
    "\u{1D5AE}"=>"O",
    "\u{1D5AF}"=>"P",
    "\u{1D5B0}"=>"Q",
    "\u{1D5B1}"=>"R",
    "\u{1D5B2}"=>"S",
    "\u{1D5B3}"=>"T",
    "\u{1D5B4}"=>"U",
    "\u{1D5B5}"=>"V",
    "\u{1D5B6}"=>"W",
    "\u{1D5B7}"=>"X",
    "\u{1D5B8}"=>"Y",
    "\u{1D5B9}"=>"Z",
    "\u{1D5BA}"=>"a",
    "\u{1D5BB}"=>"b",
    "\u{1D5BC}"=>"c",
    "\u{1D5BD}"=>"d",
    "\u{1D5BE}"=>"e",
    "\u{1D5BF}"=>"f",
    "\u{1D5C0}"=>"g",
    "\u{1D5C1}"=>"h",
    "\u{1D5C2}"=>"i",
    "\u{1D5C3}"=>"j",
    "\u{1D5C4}"=>"k",
    "\u{1D5C5}"=>"l",
    "\u{1D5C6}"=>"m",
    "\u{1D5C7}"=>"n",
    "\u{1D5C8}"=>"o",
    "\u{1D5C9}"=>"p",
    "\u{1D5CA}"=>"q",
    "\u{1D5CB}"=>"r",
    "\u{1D5CC}"=>"s",
    "\u{1D5CD}"=>"t",
    "\u{1D5CE}"=>"u",
    "\u{1D5CF}"=>"v",
    "\u{1D5D0}"=>"w",
    "\u{1D5D1}"=>"x",
    "\u{1D5D2}"=>"y",
    "\u{1D5D3}"=>"z",
    "\u{1D5D4}"=>"A",
    "\u{1D5D5}"=>"B",
    "\u{1D5D6}"=>"C",
    "\u{1D5D7}"=>"D",
    "\u{1D5D8}"=>"E",
    "\u{1D5D9}"=>"F",
    "\u{1D5DA}"=>"G",
    "\u{1D5DB}"=>"H",
    "\u{1D5DC}"=>"I",
    "\u{1D5DD}"=>"J",
    "\u{1D5DE}"=>"K",
    "\u{1D5DF}"=>"L",
    "\u{1D5E0}"=>"M",
    "\u{1D5E1}"=>"N",
    "\u{1D5E2}"=>"O",
    "\u{1D5E3}"=>"P",
    "\u{1D5E4}"=>"Q",
    "\u{1D5E5}"=>"R",
    "\u{1D5E6}"=>"S",
    "\u{1D5E7}"=>"T",
    "\u{1D5E8}"=>"U",
    "\u{1D5E9}"=>"V",
    "\u{1D5EA}"=>"W",
    "\u{1D5EB}"=>"X",
    "\u{1D5EC}"=>"Y",
    "\u{1D5ED}"=>"Z",
    "\u{1D5EE}"=>"a",
    "\u{1D5EF}"=>"b",
    "\u{1D5F0}"=>"c",
    "\u{1D5F1}"=>"d",
    "\u{1D5F2}"=>"e",
    "\u{1D5F3}"=>"f",
    "\u{1D5F4}"=>"g",
    "\u{1D5F5}"=>"h",
    "\u{1D5F6}"=>"i",
    "\u{1D5F7}"=>"j",
    "\u{1D5F8}"=>"k",
    "\u{1D5F9}"=>"l",
    "\u{1D5FA}"=>"m",
    "\u{1D5FB}"=>"n",
    "\u{1D5FC}"=>"o",
    "\u{1D5FD}"=>"p",
    "\u{1D5FE}"=>"q",
    "\u{1D5FF}"=>"r",
    "\u{1D600}"=>"s",
    "\u{1D601}"=>"t",
    "\u{1D602}"=>"u",
    "\u{1D603}"=>"v",
    "\u{1D604}"=>"w",
    "\u{1D605}"=>"x",
    "\u{1D606}"=>"y",
    "\u{1D607}"=>"z",
    "\u{1D608}"=>"A",
    "\u{1D609}"=>"B",
    "\u{1D60A}"=>"C",
    "\u{1D60B}"=>"D",
    "\u{1D60C}"=>"E",
    "\u{1D60D}"=>"F",
    "\u{1D60E}"=>"G",
    "\u{1D60F}"=>"H",
    "\u{1D610}"=>"I",
    "\u{1D611}"=>"J",
    "\u{1D612}"=>"K",
    "\u{1D613}"=>"L",
    "\u{1D614}"=>"M",
    "\u{1D615}"=>"N",
    "\u{1D616}"=>"O",
    "\u{1D617}"=>"P",
    "\u{1D618}"=>"Q",
    "\u{1D619}"=>"R",
    "\u{1D61A}"=>"S",
    "\u{1D61B}"=>"T",
    "\u{1D61C}"=>"U",
    "\u{1D61D}"=>"V",
    "\u{1D61E}"=>"W",
    "\u{1D61F}"=>"X",
    "\u{1D620}"=>"Y",
    "\u{1D621}"=>"Z",
    "\u{1D622}"=>"a",
    "\u{1D623}"=>"b",
    "\u{1D624}"=>"c",
    "\u{1D625}"=>"d",
    "\u{1D626}"=>"e",
    "\u{1D627}"=>"f",
    "\u{1D628}"=>"g",
    "\u{1D629}"=>"h",
    "\u{1D62A}"=>"i",
    "\u{1D62B}"=>"j",
    "\u{1D62C}"=>"k",
    "\u{1D62D}"=>"l",
    "\u{1D62E}"=>"m",
    "\u{1D62F}"=>"n",
    "\u{1D630}"=>"o",
    "\u{1D631}"=>"p",
    "\u{1D632}"=>"q",
    "\u{1D633}"=>"r",
    "\u{1D634}"=>"s",
    "\u{1D635}"=>"t",
    "\u{1D636}"=>"u",
    "\u{1D637}"=>"v",
    "\u{1D638}"=>"w",
    "\u{1D639}"=>"x",
    "\u{1D63A}"=>"y",
    "\u{1D63B}"=>"z",
    "\u{1D63C}"=>"A",
    "\u{1D63D}"=>"B",
    "\u{1D63E}"=>"C",
    "\u{1D63F}"=>"D",
    "\u{1D640}"=>"E",
    "\u{1D641}"=>"F",
    "\u{1D642}"=>"G",
    "\u{1D643}"=>"H",
    "\u{1D644}"=>"I",
    "\u{1D645}"=>"J",
    "\u{1D646}"=>"K",
    "\u{1D647}"=>"L",
    "\u{1D648}"=>"M",
    "\u{1D649}"=>"N",
    "\u{1D64A}"=>"O",
    "\u{1D64B}"=>"P",
    "\u{1D64C}"=>"Q",
    "\u{1D64D}"=>"R",
    "\u{1D64E}"=>"S",
    "\u{1D64F}"=>"T",
    "\u{1D650}"=>"U",
    "\u{1D651}"=>"V",
    "\u{1D652}"=>"W",
    "\u{1D653}"=>"X",
    "\u{1D654}"=>"Y",
    "\u{1D655}"=>"Z",
    "\u{1D656}"=>"a",
    "\u{1D657}"=>"b",
    "\u{1D658}"=>"c",
    "\u{1D659}"=>"d",
    "\u{1D65A}"=>"e",
    "\u{1D65B}"=>"f",
    "\u{1D65C}"=>"g",
    "\u{1D65D}"=>"h",
    "\u{1D65E}"=>"i",
    "\u{1D65F}"=>"j",
    "\u{1D660}"=>"k",
    "\u{1D661}"=>"l",
    "\u{1D662}"=>"m",
    "\u{1D663}"=>"n",
    "\u{1D664}"=>"o",
    "\u{1D665}"=>"p",
    "\u{1D666}"=>"q",
    "\u{1D667}"=>"r",
    "\u{1D668}"=>"s",
    "\u{1D669}"=>"t",
    "\u{1D66A}"=>"u",
    "\u{1D66B}"=>"v",
    "\u{1D66C}"=>"w",
    "\u{1D66D}"=>"x",
    "\u{1D66E}"=>"y",
    "\u{1D66F}"=>"z",
    "\u{1D670}"=>"A",
    "\u{1D671}"=>"B",
    "\u{1D672}"=>"C",
    "\u{1D673}"=>"D",
    "\u{1D674}"=>"E",
    "\u{1D675}"=>"F",
    "\u{1D676}"=>"G",
    "\u{1D677}"=>"H",
    "\u{1D678}"=>"I",
    "\u{1D679}"=>"J",
    "\u{1D67A}"=>"K",
    "\u{1D67B}"=>"L",
    "\u{1D67C}"=>"M",
    "\u{1D67D}"=>"N",
    "\u{1D67E}"=>"O",
    "\u{1D67F}"=>"P",
    "\u{1D680}"=>"Q",
    "\u{1D681}"=>"R",
    "\u{1D682}"=>"S",
    "\u{1D683}"=>"T",
    "\u{1D684}"=>"U",
    "\u{1D685}"=>"V",
    "\u{1D686}"=>"W",
    "\u{1D687}"=>"X",
    "\u{1D688}"=>"Y",
    "\u{1D689}"=>"Z",
    "\u{1D68A}"=>"a",
    "\u{1D68B}"=>"b",
    "\u{1D68C}"=>"c",
    "\u{1D68D}"=>"d",
    "\u{1D68E}"=>"e",
    "\u{1D68F}"=>"f",
    "\u{1D690}"=>"g",
    "\u{1D691}"=>"h",
    "\u{1D692}"=>"i",
    "\u{1D693}"=>"j",
    "\u{1D694}"=>"k",
    "\u{1D695}"=>"l",
    "\u{1D696}"=>"m",
    "\u{1D697}"=>"n",
    "\u{1D698}"=>"o",
    "\u{1D699}"=>"p",
    "\u{1D69A}"=>"q",
    "\u{1D69B}"=>"r",
    "\u{1D69C}"=>"s",
    "\u{1D69D}"=>"t",
    "\u{1D69E}"=>"u",
    "\u{1D69F}"=>"v",
    "\u{1D6A0}"=>"w",
    "\u{1D6A1}"=>"x",
    "\u{1D6A2}"=>"y",
    "\u{1D6A3}"=>"z",
    "\u{1D6A4}"=>"\u0131",
    "\u{1D6A5}"=>"\u0237",
    "\u{1D6A8}"=>"\u0391",
    "\u{1D6A9}"=>"\u0392",
    "\u{1D6AA}"=>"\u0393",
    "\u{1D6AB}"=>"\u0394",
    "\u{1D6AC}"=>"\u0395",
    "\u{1D6AD}"=>"\u0396",
    "\u{1D6AE}"=>"\u0397",
    "\u{1D6AF}"=>"\u0398",
    "\u{1D6B0}"=>"\u0399",
    "\u{1D6B1}"=>"\u039A",
    "\u{1D6B2}"=>"\u039B",
    "\u{1D6B3}"=>"\u039C",
    "\u{1D6B4}"=>"\u039D",
    "\u{1D6B5}"=>"\u039E",
    "\u{1D6B6}"=>"\u039F",
    "\u{1D6B7}"=>"\u03A0",
    "\u{1D6B8}"=>"\u03A1",
    "\u{1D6B9}"=>"\u0398",
    "\u{1D6BA}"=>"\u03A3",
    "\u{1D6BB}"=>"\u03A4",
    "\u{1D6BC}"=>"\u03A5",
    "\u{1D6BD}"=>"\u03A6",
    "\u{1D6BE}"=>"\u03A7",
    "\u{1D6BF}"=>"\u03A8",
    "\u{1D6C0}"=>"\u03A9",
    "\u{1D6C1}"=>"\u2207",
    "\u{1D6C2}"=>"\u03B1",
    "\u{1D6C3}"=>"\u03B2",
    "\u{1D6C4}"=>"\u03B3",
    "\u{1D6C5}"=>"\u03B4",
    "\u{1D6C6}"=>"\u03B5",
    "\u{1D6C7}"=>"\u03B6",
    "\u{1D6C8}"=>"\u03B7",
    "\u{1D6C9}"=>"\u03B8",
    "\u{1D6CA}"=>"\u03B9",
    "\u{1D6CB}"=>"\u03BA",
    "\u{1D6CC}"=>"\u03BB",
    "\u{1D6CD}"=>"\u03BC",
    "\u{1D6CE}"=>"\u03BD",
    "\u{1D6CF}"=>"\u03BE",
    "\u{1D6D0}"=>"\u03BF",
    "\u{1D6D1}"=>"\u03C0",
    "\u{1D6D2}"=>"\u03C1",
    "\u{1D6D3}"=>"\u03C2",
    "\u{1D6D4}"=>"\u03C3",
    "\u{1D6D5}"=>"\u03C4",
    "\u{1D6D6}"=>"\u03C5",
    "\u{1D6D7}"=>"\u03C6",
    "\u{1D6D8}"=>"\u03C7",
    "\u{1D6D9}"=>"\u03C8",
    "\u{1D6DA}"=>"\u03C9",
    "\u{1D6DB}"=>"\u2202",
    "\u{1D6DC}"=>"\u03B5",
    "\u{1D6DD}"=>"\u03B8",
    "\u{1D6DE}"=>"\u03BA",
    "\u{1D6DF}"=>"\u03C6",
    "\u{1D6E0}"=>"\u03C1",
    "\u{1D6E1}"=>"\u03C0",
    "\u{1D6E2}"=>"\u0391",
    "\u{1D6E3}"=>"\u0392",
    "\u{1D6E4}"=>"\u0393",
    "\u{1D6E5}"=>"\u0394",
    "\u{1D6E6}"=>"\u0395",
    "\u{1D6E7}"=>"\u0396",
    "\u{1D6E8}"=>"\u0397",
    "\u{1D6E9}"=>"\u0398",
    "\u{1D6EA}"=>"\u0399",
    "\u{1D6EB}"=>"\u039A",
    "\u{1D6EC}"=>"\u039B",
    "\u{1D6ED}"=>"\u039C",
    "\u{1D6EE}"=>"\u039D",
    "\u{1D6EF}"=>"\u039E",
    "\u{1D6F0}"=>"\u039F",
    "\u{1D6F1}"=>"\u03A0",
    "\u{1D6F2}"=>"\u03A1",
    "\u{1D6F3}"=>"\u0398",
    "\u{1D6F4}"=>"\u03A3",
    "\u{1D6F5}"=>"\u03A4",
    "\u{1D6F6}"=>"\u03A5",
    "\u{1D6F7}"=>"\u03A6",
    "\u{1D6F8}"=>"\u03A7",
    "\u{1D6F9}"=>"\u03A8",
    "\u{1D6FA}"=>"\u03A9",
    "\u{1D6FB}"=>"\u2207",
    "\u{1D6FC}"=>"\u03B1",
    "\u{1D6FD}"=>"\u03B2",
    "\u{1D6FE}"=>"\u03B3",
    "\u{1D6FF}"=>"\u03B4",
    "\u{1D700}"=>"\u03B5",
    "\u{1D701}"=>"\u03B6",
    "\u{1D702}"=>"\u03B7",
    "\u{1D703}"=>"\u03B8",
    "\u{1D704}"=>"\u03B9",
    "\u{1D705}"=>"\u03BA",
    "\u{1D706}"=>"\u03BB",
    "\u{1D707}"=>"\u03BC",
    "\u{1D708}"=>"\u03BD",
    "\u{1D709}"=>"\u03BE",
    "\u{1D70A}"=>"\u03BF",
    "\u{1D70B}"=>"\u03C0",
    "\u{1D70C}"=>"\u03C1",
    "\u{1D70D}"=>"\u03C2",
    "\u{1D70E}"=>"\u03C3",
    "\u{1D70F}"=>"\u03C4",
    "\u{1D710}"=>"\u03C5",
    "\u{1D711}"=>"\u03C6",
    "\u{1D712}"=>"\u03C7",
    "\u{1D713}"=>"\u03C8",
    "\u{1D714}"=>"\u03C9",
    "\u{1D715}"=>"\u2202",
    "\u{1D716}"=>"\u03B5",
    "\u{1D717}"=>"\u03B8",
    "\u{1D718}"=>"\u03BA",
    "\u{1D719}"=>"\u03C6",
    "\u{1D71A}"=>"\u03C1",
    "\u{1D71B}"=>"\u03C0",
    "\u{1D71C}"=>"\u0391",
    "\u{1D71D}"=>"\u0392",
    "\u{1D71E}"=>"\u0393",
    "\u{1D71F}"=>"\u0394",
    "\u{1D720}"=>"\u0395",
    "\u{1D721}"=>"\u0396",
    "\u{1D722}"=>"\u0397",
    "\u{1D723}"=>"\u0398",
    "\u{1D724}"=>"\u0399",
    "\u{1D725}"=>"\u039A",
    "\u{1D726}"=>"\u039B",
    "\u{1D727}"=>"\u039C",
    "\u{1D728}"=>"\u039D",
    "\u{1D729}"=>"\u039E",
    "\u{1D72A}"=>"\u039F",
    "\u{1D72B}"=>"\u03A0",
    "\u{1D72C}"=>"\u03A1",
    "\u{1D72D}"=>"\u0398",
    "\u{1D72E}"=>"\u03A3",
    "\u{1D72F}"=>"\u03A4",
    "\u{1D730}"=>"\u03A5",
    "\u{1D731}"=>"\u03A6",
    "\u{1D732}"=>"\u03A7",
    "\u{1D733}"=>"\u03A8",
    "\u{1D734}"=>"\u03A9",
    "\u{1D735}"=>"\u2207",
    "\u{1D736}"=>"\u03B1",
    "\u{1D737}"=>"\u03B2",
    "\u{1D738}"=>"\u03B3",
    "\u{1D739}"=>"\u03B4",
    "\u{1D73A}"=>"\u03B5",
    "\u{1D73B}"=>"\u03B6",
    "\u{1D73C}"=>"\u03B7",
    "\u{1D73D}"=>"\u03B8",
    "\u{1D73E}"=>"\u03B9",
    "\u{1D73F}"=>"\u03BA",
    "\u{1D740}"=>"\u03BB",
    "\u{1D741}"=>"\u03BC",
    "\u{1D742}"=>"\u03BD",
    "\u{1D743}"=>"\u03BE",
    "\u{1D744}"=>"\u03BF",
    "\u{1D745}"=>"\u03C0",
    "\u{1D746}"=>"\u03C1",
    "\u{1D747}"=>"\u03C2",
    "\u{1D748}"=>"\u03C3",
    "\u{1D749}"=>"\u03C4",
    "\u{1D74A}"=>"\u03C5",
    "\u{1D74B}"=>"\u03C6",
    "\u{1D74C}"=>"\u03C7",
    "\u{1D74D}"=>"\u03C8",
    "\u{1D74E}"=>"\u03C9",
    "\u{1D74F}"=>"\u2202",
    "\u{1D750}"=>"\u03B5",
    "\u{1D751}"=>"\u03B8",
    "\u{1D752}"=>"\u03BA",
    "\u{1D753}"=>"\u03C6",
    "\u{1D754}"=>"\u03C1",
    "\u{1D755}"=>"\u03C0",
    "\u{1D756}"=>"\u0391",
    "\u{1D757}"=>"\u0392",
    "\u{1D758}"=>"\u0393",
    "\u{1D759}"=>"\u0394",
    "\u{1D75A}"=>"\u0395",
    "\u{1D75B}"=>"\u0396",
    "\u{1D75C}"=>"\u0397",
    "\u{1D75D}"=>"\u0398",
    "\u{1D75E}"=>"\u0399",
    "\u{1D75F}"=>"\u039A",
    "\u{1D760}"=>"\u039B",
    "\u{1D761}"=>"\u039C",
    "\u{1D762}"=>"\u039D",
    "\u{1D763}"=>"\u039E",
    "\u{1D764}"=>"\u039F",
    "\u{1D765}"=>"\u03A0",
    "\u{1D766}"=>"\u03A1",
    "\u{1D767}"=>"\u0398",
    "\u{1D768}"=>"\u03A3",
    "\u{1D769}"=>"\u03A4",
    "\u{1D76A}"=>"\u03A5",
    "\u{1D76B}"=>"\u03A6",
    "\u{1D76C}"=>"\u03A7",
    "\u{1D76D}"=>"\u03A8",
    "\u{1D76E}"=>"\u03A9",
    "\u{1D76F}"=>"\u2207",
    "\u{1D770}"=>"\u03B1",
    "\u{1D771}"=>"\u03B2",
    "\u{1D772}"=>"\u03B3",
    "\u{1D773}"=>"\u03B4",
    "\u{1D774}"=>"\u03B5",
    "\u{1D775}"=>"\u03B6",
    "\u{1D776}"=>"\u03B7",
    "\u{1D777}"=>"\u03B8",
    "\u{1D778}"=>"\u03B9",
    "\u{1D779}"=>"\u03BA",
    "\u{1D77A}"=>"\u03BB",
    "\u{1D77B}"=>"\u03BC",
    "\u{1D77C}"=>"\u03BD",
    "\u{1D77D}"=>"\u03BE",
    "\u{1D77E}"=>"\u03BF",
    "\u{1D77F}"=>"\u03C0",
    "\u{1D780}"=>"\u03C1",
    "\u{1D781}"=>"\u03C2",
    "\u{1D782}"=>"\u03C3",
    "\u{1D783}"=>"\u03C4",
    "\u{1D784}"=>"\u03C5",
    "\u{1D785}"=>"\u03C6",
    "\u{1D786}"=>"\u03C7",
    "\u{1D787}"=>"\u03C8",
    "\u{1D788}"=>"\u03C9",
    "\u{1D789}"=>"\u2202",
    "\u{1D78A}"=>"\u03B5",
    "\u{1D78B}"=>"\u03B8",
    "\u{1D78C}"=>"\u03BA",
    "\u{1D78D}"=>"\u03C6",
    "\u{1D78E}"=>"\u03C1",
    "\u{1D78F}"=>"\u03C0",
    "\u{1D790}"=>"\u0391",
    "\u{1D791}"=>"\u0392",
    "\u{1D792}"=>"\u0393",
    "\u{1D793}"=>"\u0394",
    "\u{1D794}"=>"\u0395",
    "\u{1D795}"=>"\u0396",
    "\u{1D796}"=>"\u0397",
    "\u{1D797}"=>"\u0398",
    "\u{1D798}"=>"\u0399",
    "\u{1D799}"=>"\u039A",
    "\u{1D79A}"=>"\u039B",
    "\u{1D79B}"=>"\u039C",
    "\u{1D79C}"=>"\u039D",
    "\u{1D79D}"=>"\u039E",
    "\u{1D79E}"=>"\u039F",
    "\u{1D79F}"=>"\u03A0",
    "\u{1D7A0}"=>"\u03A1",
    "\u{1D7A1}"=>"\u0398",
    "\u{1D7A2}"=>"\u03A3",
    "\u{1D7A3}"=>"\u03A4",
    "\u{1D7A4}"=>"\u03A5",
    "\u{1D7A5}"=>"\u03A6",
    "\u{1D7A6}"=>"\u03A7",
    "\u{1D7A7}"=>"\u03A8",
    "\u{1D7A8}"=>"\u03A9",
    "\u{1D7A9}"=>"\u2207",
    "\u{1D7AA}"=>"\u03B1",
    "\u{1D7AB}"=>"\u03B2",
    "\u{1D7AC}"=>"\u03B3",
    "\u{1D7AD}"=>"\u03B4",
    "\u{1D7AE}"=>"\u03B5",
    "\u{1D7AF}"=>"\u03B6",
    "\u{1D7B0}"=>"\u03B7",
    "\u{1D7B1}"=>"\u03B8",
    "\u{1D7B2}"=>"\u03B9",
    "\u{1D7B3}"=>"\u03BA",
    "\u{1D7B4}"=>"\u03BB",
    "\u{1D7B5}"=>"\u03BC",
    "\u{1D7B6}"=>"\u03BD",
    "\u{1D7B7}"=>"\u03BE",
    "\u{1D7B8}"=>"\u03BF",
    "\u{1D7B9}"=>"\u03C0",
    "\u{1D7BA}"=>"\u03C1",
    "\u{1D7BB}"=>"\u03C2",
    "\u{1D7BC}"=>"\u03C3",
    "\u{1D7BD}"=>"\u03C4",
    "\u{1D7BE}"=>"\u03C5",
    "\u{1D7BF}"=>"\u03C6",
    "\u{1D7C0}"=>"\u03C7",
    "\u{1D7C1}"=>"\u03C8",
    "\u{1D7C2}"=>"\u03C9",
    "\u{1D7C3}"=>"\u2202",
    "\u{1D7C4}"=>"\u03B5",
    "\u{1D7C5}"=>"\u03B8",
    "\u{1D7C6}"=>"\u03BA",
    "\u{1D7C7}"=>"\u03C6",
    "\u{1D7C8}"=>"\u03C1",
    "\u{1D7C9}"=>"\u03C0",
    "\u{1D7CA}"=>"\u03DC",
    "\u{1D7CB}"=>"\u03DD",
    "\u{1D7CE}"=>"0",
    "\u{1D7CF}"=>"1",
    "\u{1D7D0}"=>"2",
    "\u{1D7D1}"=>"3",
    "\u{1D7D2}"=>"4",
    "\u{1D7D3}"=>"5",
    "\u{1D7D4}"=>"6",
    "\u{1D7D5}"=>"7",
    "\u{1D7D6}"=>"8",
    "\u{1D7D7}"=>"9",
    "\u{1D7D8}"=>"0",
    "\u{1D7D9}"=>"1",
    "\u{1D7DA}"=>"2",
    "\u{1D7DB}"=>"3",
    "\u{1D7DC}"=>"4",
    "\u{1D7DD}"=>"5",
    "\u{1D7DE}"=>"6",
    "\u{1D7DF}"=>"7",
    "\u{1D7E0}"=>"8",
    "\u{1D7E1}"=>"9",
    "\u{1D7E2}"=>"0",
    "\u{1D7E3}"=>"1",
    "\u{1D7E4}"=>"2",
    "\u{1D7E5}"=>"3",
    "\u{1D7E6}"=>"4",
    "\u{1D7E7}"=>"5",
    "\u{1D7E8}"=>"6",
    "\u{1D7E9}"=>"7",
    "\u{1D7EA}"=>"8",
    "\u{1D7EB}"=>"9",
    "\u{1D7EC}"=>"0",
    "\u{1D7ED}"=>"1",
    "\u{1D7EE}"=>"2",
    "\u{1D7EF}"=>"3",
    "\u{1D7F0}"=>"4",
    "\u{1D7F1}"=>"5",
    "\u{1D7F2}"=>"6",
    "\u{1D7F3}"=>"7",
    "\u{1D7F4}"=>"8",
    "\u{1D7F5}"=>"9",
    "\u{1D7F6}"=>"0",
    "\u{1D7F7}"=>"1",
    "\u{1D7F8}"=>"2",
    "\u{1D7F9}"=>"3",
    "\u{1D7FA}"=>"4",
    "\u{1D7FB}"=>"5",
    "\u{1D7FC}"=>"6",
    "\u{1D7FD}"=>"7",
    "\u{1D7FE}"=>"8",
    "\u{1D7FF}"=>"9",
    "\u{1EE00}"=>"\u0627",
    "\u{1EE01}"=>"\u0628",
    "\u{1EE02}"=>"\u062C",
    "\u{1EE03}"=>"\u062F",
    "\u{1EE05}"=>"\u0648",
    "\u{1EE06}"=>"\u0632",
    "\u{1EE07}"=>"\u062D",
    "\u{1EE08}"=>"\u0637",
    "\u{1EE09}"=>"\u064A",
    "\u{1EE0A}"=>"\u0643",
    "\u{1EE0B}"=>"\u0644",
    "\u{1EE0C}"=>"\u0645",
    "\u{1EE0D}"=>"\u0646",
    "\u{1EE0E}"=>"\u0633",
    "\u{1EE0F}"=>"\u0639",
    "\u{1EE10}"=>"\u0641",
    "\u{1EE11}"=>"\u0635",
    "\u{1EE12}"=>"\u0642",
    "\u{1EE13}"=>"\u0631",
    "\u{1EE14}"=>"\u0634",
    "\u{1EE15}"=>"\u062A",
    "\u{1EE16}"=>"\u062B",
    "\u{1EE17}"=>"\u062E",
    "\u{1EE18}"=>"\u0630",
    "\u{1EE19}"=>"\u0636",
    "\u{1EE1A}"=>"\u0638",
    "\u{1EE1B}"=>"\u063A",
    "\u{1EE1C}"=>"\u066E",
    "\u{1EE1D}"=>"\u06BA",
    "\u{1EE1E}"=>"\u06A1",
    "\u{1EE1F}"=>"\u066F",
    "\u{1EE21}"=>"\u0628",
    "\u{1EE22}"=>"\u062C",
    "\u{1EE24}"=>"\u0647",
    "\u{1EE27}"=>"\u062D",
    "\u{1EE29}"=>"\u064A",
    "\u{1EE2A}"=>"\u0643",
    "\u{1EE2B}"=>"\u0644",
    "\u{1EE2C}"=>"\u0645",
    "\u{1EE2D}"=>"\u0646",
    "\u{1EE2E}"=>"\u0633",
    "\u{1EE2F}"=>"\u0639",
    "\u{1EE30}"=>"\u0641",
    "\u{1EE31}"=>"\u0635",
    "\u{1EE32}"=>"\u0642",
    "\u{1EE34}"=>"\u0634",
    "\u{1EE35}"=>"\u062A",
    "\u{1EE36}"=>"\u062B",
    "\u{1EE37}"=>"\u062E",
    "\u{1EE39}"=>"\u0636",
    "\u{1EE3B}"=>"\u063A",
    "\u{1EE42}"=>"\u062C",
    "\u{1EE47}"=>"\u062D",
    "\u{1EE49}"=>"\u064A",
    "\u{1EE4B}"=>"\u0644",
    "\u{1EE4D}"=>"\u0646",
    "\u{1EE4E}"=>"\u0633",
    "\u{1EE4F}"=>"\u0639",
    "\u{1EE51}"=>"\u0635",
    "\u{1EE52}"=>"\u0642",
    "\u{1EE54}"=>"\u0634",
    "\u{1EE57}"=>"\u062E",
    "\u{1EE59}"=>"\u0636",
    "\u{1EE5B}"=>"\u063A",
    "\u{1EE5D}"=>"\u06BA",
    "\u{1EE5F}"=>"\u066F",
    "\u{1EE61}"=>"\u0628",
    "\u{1EE62}"=>"\u062C",
    "\u{1EE64}"=>"\u0647",
    "\u{1EE67}"=>"\u062D",
    "\u{1EE68}"=>"\u0637",
    "\u{1EE69}"=>"\u064A",
    "\u{1EE6A}"=>"\u0643",
    "\u{1EE6C}"=>"\u0645",
    "\u{1EE6D}"=>"\u0646",
    "\u{1EE6E}"=>"\u0633",
    "\u{1EE6F}"=>"\u0639",
    "\u{1EE70}"=>"\u0641",
    "\u{1EE71}"=>"\u0635",
    "\u{1EE72}"=>"\u0642",
    "\u{1EE74}"=>"\u0634",
    "\u{1EE75}"=>"\u062A",
    "\u{1EE76}"=>"\u062B",
    "\u{1EE77}"=>"\u062E",
    "\u{1EE79}"=>"\u0636",
    "\u{1EE7A}"=>"\u0638",
    "\u{1EE7B}"=>"\u063A",
    "\u{1EE7C}"=>"\u066E",
    "\u{1EE7E}"=>"\u06A1",
    "\u{1EE80}"=>"\u0627",
    "\u{1EE81}"=>"\u0628",
    "\u{1EE82}"=>"\u062C",
    "\u{1EE83}"=>"\u062F",
    "\u{1EE84}"=>"\u0647",
    "\u{1EE85}"=>"\u0648",
    "\u{1EE86}"=>"\u0632",
    "\u{1EE87}"=>"\u062D",
    "\u{1EE88}"=>"\u0637",
    "\u{1EE89}"=>"\u064A",
    "\u{1EE8B}"=>"\u0644",
    "\u{1EE8C}"=>"\u0645",
    "\u{1EE8D}"=>"\u0646",
    "\u{1EE8E}"=>"\u0633",
    "\u{1EE8F}"=>"\u0639",
    "\u{1EE90}"=>"\u0641",
    "\u{1EE91}"=>"\u0635",
    "\u{1EE92}"=>"\u0642",
    "\u{1EE93}"=>"\u0631",
    "\u{1EE94}"=>"\u0634",
    "\u{1EE95}"=>"\u062A",
    "\u{1EE96}"=>"\u062B",
    "\u{1EE97}"=>"\u062E",
    "\u{1EE98}"=>"\u0630",
    "\u{1EE99}"=>"\u0636",
    "\u{1EE9A}"=>"\u0638",
    "\u{1EE9B}"=>"\u063A",
    "\u{1EEA1}"=>"\u0628",
    "\u{1EEA2}"=>"\u062C",
    "\u{1EEA3}"=>"\u062F",
    "\u{1EEA5}"=>"\u0648",
    "\u{1EEA6}"=>"\u0632",
    "\u{1EEA7}"=>"\u062D",
    "\u{1EEA8}"=>"\u0637",
    "\u{1EEA9}"=>"\u064A",
    "\u{1EEAB}"=>"\u0644",
    "\u{1EEAC}"=>"\u0645",
    "\u{1EEAD}"=>"\u0646",
    "\u{1EEAE}"=>"\u0633",
    "\u{1EEAF}"=>"\u0639",
    "\u{1EEB0}"=>"\u0641",
    "\u{1EEB1}"=>"\u0635",
    "\u{1EEB2}"=>"\u0642",
    "\u{1EEB3}"=>"\u0631",
    "\u{1EEB4}"=>"\u0634",
    "\u{1EEB5}"=>"\u062A",
    "\u{1EEB6}"=>"\u062B",
    "\u{1EEB7}"=>"\u062E",
    "\u{1EEB8}"=>"\u0630",
    "\u{1EEB9}"=>"\u0636",
    "\u{1EEBA}"=>"\u0638",
    "\u{1EEBB}"=>"\u063A",
    "\u{1F100}"=>"0.",
    "\u{1F101}"=>"0,",
    "\u{1F102}"=>"1,",
    "\u{1F103}"=>"2,",
    "\u{1F104}"=>"3,",
    "\u{1F105}"=>"4,",
    "\u{1F106}"=>"5,",
    "\u{1F107}"=>"6,",
    "\u{1F108}"=>"7,",
    "\u{1F109}"=>"8,",
    "\u{1F10A}"=>"9,",
    "\u{1F110}"=>"(A)",
    "\u{1F111}"=>"(B)",
    "\u{1F112}"=>"(C)",
    "\u{1F113}"=>"(D)",
    "\u{1F114}"=>"(E)",
    "\u{1F115}"=>"(F)",
    "\u{1F116}"=>"(G)",
    "\u{1F117}"=>"(H)",
    "\u{1F118}"=>"(I)",
    "\u{1F119}"=>"(J)",
    "\u{1F11A}"=>"(K)",
    "\u{1F11B}"=>"(L)",
    "\u{1F11C}"=>"(M)",
    "\u{1F11D}"=>"(N)",
    "\u{1F11E}"=>"(O)",
    "\u{1F11F}"=>"(P)",
    "\u{1F120}"=>"(Q)",
    "\u{1F121}"=>"(R)",
    "\u{1F122}"=>"(S)",
    "\u{1F123}"=>"(T)",
    "\u{1F124}"=>"(U)",
    "\u{1F125}"=>"(V)",
    "\u{1F126}"=>"(W)",
    "\u{1F127}"=>"(X)",
    "\u{1F128}"=>"(Y)",
    "\u{1F129}"=>"(Z)",
    "\u{1F12A}"=>"\u3014S\u3015",
    "\u{1F12B}"=>"C",
    "\u{1F12C}"=>"R",
    "\u{1F12D}"=>"CD",
    "\u{1F12E}"=>"WZ",
    "\u{1F130}"=>"A",
    "\u{1F131}"=>"B",
    "\u{1F132}"=>"C",
    "\u{1F133}"=>"D",
    "\u{1F134}"=>"E",
    "\u{1F135}"=>"F",
    "\u{1F136}"=>"G",
    "\u{1F137}"=>"H",
    "\u{1F138}"=>"I",
    "\u{1F139}"=>"J",
    "\u{1F13A}"=>"K",
    "\u{1F13B}"=>"L",
    "\u{1F13C}"=>"M",
    "\u{1F13D}"=>"N",
    "\u{1F13E}"=>"O",
    "\u{1F13F}"=>"P",
    "\u{1F140}"=>"Q",
    "\u{1F141}"=>"R",
    "\u{1F142}"=>"S",
    "\u{1F143}"=>"T",
    "\u{1F144}"=>"U",
    "\u{1F145}"=>"V",
    "\u{1F146}"=>"W",
    "\u{1F147}"=>"X",
    "\u{1F148}"=>"Y",
    "\u{1F149}"=>"Z",
    "\u{1F14A}"=>"HV",
    "\u{1F14B}"=>"MV",
    "\u{1F14C}"=>"SD",
    "\u{1F14D}"=>"SS",
    "\u{1F14E}"=>"PPV",
    "\u{1F14F}"=>"WC",
    "\u{1F16A}"=>"MC",
    "\u{1F16B}"=>"MD",
    "\u{1F16C}"=>"MR",
    "\u{1F190}"=>"DJ",
    "\u{1F200}"=>"\u307B\u304B",
    "\u{1F201}"=>"\u30B3\u30B3",
    "\u{1F202}"=>"\u30B5",
    "\u{1F210}"=>"\u624B",
    "\u{1F211}"=>"\u5B57",
    "\u{1F212}"=>"\u53CC",
    "\u{1F213}"=>"\u30C7",
    "\u{1F214}"=>"\u4E8C",
    "\u{1F215}"=>"\u591A",
    "\u{1F216}"=>"\u89E3",
    "\u{1F217}"=>"\u5929",
    "\u{1F218}"=>"\u4EA4",
    "\u{1F219}"=>"\u6620",
    "\u{1F21A}"=>"\u7121",
    "\u{1F21B}"=>"\u6599",
    "\u{1F21C}"=>"\u524D",
    "\u{1F21D}"=>"\u5F8C",
    "\u{1F21E}"=>"\u518D",
    "\u{1F21F}"=>"\u65B0",
    "\u{1F220}"=>"\u521D",
    "\u{1F221}"=>"\u7D42",
    "\u{1F222}"=>"\u751F",
    "\u{1F223}"=>"\u8CA9",
    "\u{1F224}"=>"\u58F0",
    "\u{1F225}"=>"\u5439",
    "\u{1F226}"=>"\u6F14",
    "\u{1F227}"=>"\u6295",
    "\u{1F228}"=>"\u6355",
    "\u{1F229}"=>"\u4E00",
    "\u{1F22A}"=>"\u4E09",
    "\u{1F22B}"=>"\u904A",
    "\u{1F22C}"=>"\u5DE6",
    "\u{1F22D}"=>"\u4E2D",
    "\u{1F22E}"=>"\u53F3",
    "\u{1F22F}"=>"\u6307",
    "\u{1F230}"=>"\u8D70",
    "\u{1F231}"=>"\u6253",
    "\u{1F232}"=>"\u7981",
    "\u{1F233}"=>"\u7A7A",
    "\u{1F234}"=>"\u5408",
    "\u{1F235}"=>"\u6E80",
    "\u{1F236}"=>"\u6709",
    "\u{1F237}"=>"\u6708",
    "\u{1F238}"=>"\u7533",
    "\u{1F239}"=>"\u5272",
    "\u{1F23A}"=>"\u55B6",
    "\u{1F23B}"=>"\u914D",
    "\u{1F240}"=>"\u3014\u672C\u3015",
    "\u{1F241}"=>"\u3014\u4E09\u3015",
    "\u{1F242}"=>"\u3014\u4E8C\u3015",
    "\u{1F243}"=>"\u3014\u5B89\u3015",
    "\u{1F244}"=>"\u3014\u70B9\u3015",
    "\u{1F245}"=>"\u3014\u6253\u3015",
    "\u{1F246}"=>"\u3014\u76D7\u3015",
    "\u{1F247}"=>"\u3014\u52DD\u3015",
    "\u{1F248}"=>"\u3014\u6557\u3015",
    "\u{1F250}"=>"\u5F97",
    "\u{1F251}"=>"\u53EF",
    "\u{1FBF0}"=>"0",
    "\u{1FBF1}"=>"1",
    "\u{1FBF2}"=>"2",
    "\u{1FBF3}"=>"3",
    "\u{1FBF4}"=>"4",
    "\u{1FBF5}"=>"5",
    "\u{1FBF6}"=>"6",
    "\u{1FBF7}"=>"7",
    "\u{1FBF8}"=>"8",
    "\u{1FBF9}"=>"9",
    "\u0385"=>" \u0308\u0301",
    "\u03D3"=>"\u03A5\u0301",
    "\u03D4"=>"\u03A5\u0308",
    "\u1E9B"=>"s\u0307",
    "\u1FC1"=>" \u0308\u0342",
    "\u1FCD"=>" \u0313\u0300",
    "\u1FCE"=>" \u0313\u0301",
    "\u1FCF"=>" \u0313\u0342",
    "\u1FDD"=>" \u0314\u0300",
    "\u1FDE"=>" \u0314\u0301",
    "\u1FDF"=>" \u0314\u0342",
    "\u1FED"=>" \u0308\u0300",
    "\u1FEE"=>" \u0308\u0301",
    "\u1FFD"=>" \u0301",
    "\u2000"=>" ",
    "\u2001"=>" ",
  }.freeze

  COMPOSITION_TABLE = {
    "A\u0300"=>"\u00C0",
    "A\u0301"=>"\u00C1",
    "A\u0302"=>"\u00C2",
    "A\u0303"=>"\u00C3",
    "A\u0308"=>"\u00C4",
    "A\u030A"=>"\u00C5",
    "C\u0327"=>"\u00C7",
    "E\u0300"=>"\u00C8",
    "E\u0301"=>"\u00C9",
    "E\u0302"=>"\u00CA",
    "E\u0308"=>"\u00CB",
    "I\u0300"=>"\u00CC",
    "I\u0301"=>"\u00CD",
    "I\u0302"=>"\u00CE",
    "I\u0308"=>"\u00CF",
    "N\u0303"=>"\u00D1",
    "O\u0300"=>"\u00D2",
    "O\u0301"=>"\u00D3",
    "O\u0302"=>"\u00D4",
    "O\u0303"=>"\u00D5",
    "O\u0308"=>"\u00D6",
    "U\u0300"=>"\u00D9",
    "U\u0301"=>"\u00DA",
    "U\u0302"=>"\u00DB",
    "U\u0308"=>"\u00DC",
    "Y\u0301"=>"\u00DD",
    "a\u0300"=>"\u00E0",
    "a\u0301"=>"\u00E1",
    "a\u0302"=>"\u00E2",
    "a\u0303"=>"\u00E3",
    "a\u0308"=>"\u00E4",
    "a\u030A"=>"\u00E5",
    "c\u0327"=>"\u00E7",
    "e\u0300"=>"\u00E8",
    "e\u0301"=>"\u00E9",
    "e\u0302"=>"\u00EA",
    "e\u0308"=>"\u00EB",
    "i\u0300"=>"\u00EC",
    "i\u0301"=>"\u00ED",
    "i\u0302"=>"\u00EE",
    "i\u0308"=>"\u00EF",
    "n\u0303"=>"\u00F1",
    "o\u0300"=>"\u00F2",
    "o\u0301"=>"\u00F3",
    "o\u0302"=>"\u00F4",
    "o\u0303"=>"\u00F5",
    "o\u0308"=>"\u00F6",
    "u\u0300"=>"\u00F9",
    "u\u0301"=>"\u00FA",
    "u\u0302"=>"\u00FB",
    "u\u0308"=>"\u00FC",
    "y\u0301"=>"\u00FD",
    "y\u0308"=>"\u00FF",
    "A\u0304"=>"\u0100",
    "a\u0304"=>"\u0101",
    "A\u0306"=>"\u0102",
    "a\u0306"=>"\u0103",
    "A\u0328"=>"\u0104",
    "a\u0328"=>"\u0105",
    "C\u0301"=>"\u0106",
    "c\u0301"=>"\u0107",
    "C\u0302"=>"\u0108",
    "c\u0302"=>"\u0109",
    "C\u0307"=>"\u010A",
    "c\u0307"=>"\u010B",
    "C\u030C"=>"\u010C",
    "c\u030C"=>"\u010D",
    "D\u030C"=>"\u010E",
    "d\u030C"=>"\u010F",
    "E\u0304"=>"\u0112",
    "e\u0304"=>"\u0113",
    "E\u0306"=>"\u0114",
    "e\u0306"=>"\u0115",
    "E\u0307"=>"\u0116",
    "e\u0307"=>"\u0117",
    "E\u0328"=>"\u0118",
    "e\u0328"=>"\u0119",
    "E\u030C"=>"\u011A",
    "e\u030C"=>"\u011B",
    "G\u0302"=>"\u011C",
    "g\u0302"=>"\u011D",
    "G\u0306"=>"\u011E",
    "g\u0306"=>"\u011F",
    "G\u0307"=>"\u0120",
    "g\u0307"=>"\u0121",
    "G\u0327"=>"\u0122",
    "g\u0327"=>"\u0123",
    "H\u0302"=>"\u0124",
    "h\u0302"=>"\u0125",
    "I\u0303"=>"\u0128",
    "i\u0303"=>"\u0129",
    "I\u0304"=>"\u012A",
    "i\u0304"=>"\u012B",
    "I\u0306"=>"\u012C",
    "i\u0306"=>"\u012D",
    "I\u0328"=>"\u012E",
    "i\u0328"=>"\u012F",
    "I\u0307"=>"\u0130",
    "J\u0302"=>"\u0134",
    "j\u0302"=>"\u0135",
    "K\u0327"=>"\u0136",
    "k\u0327"=>"\u0137",
    "L\u0301"=>"\u0139",
    "l\u0301"=>"\u013A",
    "L\u0327"=>"\u013B",
    "l\u0327"=>"\u013C",
    "L\u030C"=>"\u013D",
    "l\u030C"=>"\u013E",
    "N\u0301"=>"\u0143",
    "n\u0301"=>"\u0144",
    "N\u0327"=>"\u0145",
    "n\u0327"=>"\u0146",
    "N\u030C"=>"\u0147",
    "n\u030C"=>"\u0148",
    "O\u0304"=>"\u014C",
    "o\u0304"=>"\u014D",
    "O\u0306"=>"\u014E",
    "o\u0306"=>"\u014F",
    "O\u030B"=>"\u0150",
    "o\u030B"=>"\u0151",
    "R\u0301"=>"\u0154",
    "r\u0301"=>"\u0155",
    "R\u0327"=>"\u0156",
    "r\u0327"=>"\u0157",
    "R\u030C"=>"\u0158",
    "r\u030C"=>"\u0159",
    "S\u0301"=>"\u015A",
    "s\u0301"=>"\u015B",
    "S\u0302"=>"\u015C",
    "s\u0302"=>"\u015D",
    "S\u0327"=>"\u015E",
    "s\u0327"=>"\u015F",
    "S\u030C"=>"\u0160",
    "s\u030C"=>"\u0161",
    "T\u0327"=>"\u0162",
    "t\u0327"=>"\u0163",
    "T\u030C"=>"\u0164",
    "t\u030C"=>"\u0165",
    "U\u0303"=>"\u0168",
    "u\u0303"=>"\u0169",
    "U\u0304"=>"\u016A",
    "u\u0304"=>"\u016B",
    "U\u0306"=>"\u016C",
    "u\u0306"=>"\u016D",
    "U\u030A"=>"\u016E",
    "u\u030A"=>"\u016F",
    "U\u030B"=>"\u0170",
    "u\u030B"=>"\u0171",
    "U\u0328"=>"\u0172",
    "u\u0328"=>"\u0173",
    "W\u0302"=>"\u0174",
    "w\u0302"=>"\u0175",
    "Y\u0302"=>"\u0176",
    "y\u0302"=>"\u0177",
    "Y\u0308"=>"\u0178",
    "Z\u0301"=>"\u0179",
    "z\u0301"=>"\u017A",
    "Z\u0307"=>"\u017B",
    "z\u0307"=>"\u017C",
    "Z\u030C"=>"\u017D",
    "z\u030C"=>"\u017E",
    "O\u031B"=>"\u01A0",
    "o\u031B"=>"\u01A1",
    "U\u031B"=>"\u01AF",
    "u\u031B"=>"\u01B0",
    "A\u030C"=>"\u01CD",
    "a\u030C"=>"\u01CE",
    "I\u030C"=>"\u01CF",
    "i\u030C"=>"\u01D0",
    "O\u030C"=>"\u01D1",
    "o\u030C"=>"\u01D2",
    "U\u030C"=>"\u01D3",
    "u\u030C"=>"\u01D4",
    "\u00DC\u0304"=>"\u01D5",
    "\u00FC\u0304"=>"\u01D6",
    "\u00DC\u0301"=>"\u01D7",
    "\u00FC\u0301"=>"\u01D8",
    "\u00DC\u030C"=>"\u01D9",
    "\u00FC\u030C"=>"\u01DA",
    "\u00DC\u0300"=>"\u01DB",
    "\u00FC\u0300"=>"\u01DC",
    "\u00C4\u0304"=>"\u01DE",
    "\u00E4\u0304"=>"\u01DF",
    "\u0226\u0304"=>"\u01E0",
    "\u0227\u0304"=>"\u01E1",
    "\u00C6\u0304"=>"\u01E2",
    "\u00E6\u0304"=>"\u01E3",
    "G\u030C"=>"\u01E6",
    "g\u030C"=>"\u01E7",
    "K\u030C"=>"\u01E8",
    "k\u030C"=>"\u01E9",
    "O\u0328"=>"\u01EA",
    "o\u0328"=>"\u01EB",
    "\u01EA\u0304"=>"\u01EC",
    "\u01EB\u0304"=>"\u01ED",
    "\u01B7\u030C"=>"\u01EE",
    "\u0292\u030C"=>"\u01EF",
    "j\u030C"=>"\u01F0",
    "G\u0301"=>"\u01F4",
    "g\u0301"=>"\u01F5",
    "N\u0300"=>"\u01F8",
    "n\u0300"=>"\u01F9",
    "\u00C5\u0301"=>"\u01FA",
    "\u00E5\u0301"=>"\u01FB",
    "\u00C6\u0301"=>"\u01FC",
    "\u00E6\u0301"=>"\u01FD",
    "\u00D8\u0301"=>"\u01FE",
    "\u00F8\u0301"=>"\u01FF",
    "A\u030F"=>"\u0200",
    "a\u030F"=>"\u0201",
    "A\u0311"=>"\u0202",
    "a\u0311"=>"\u0203",
    "E\u030F"=>"\u0204",
    "e\u030F"=>"\u0205",
    "E\u0311"=>"\u0206",
    "e\u0311"=>"\u0207",
    "I\u030F"=>"\u0208",
    "i\u030F"=>"\u0209",
    "I\u0311"=>"\u020A",
    "i\u0311"=>"\u020B",
    "O\u030F"=>"\u020C",
    "o\u030F"=>"\u020D",
    "O\u0311"=>"\u020E",
    "o\u0311"=>"\u020F",
    "R\u030F"=>"\u0210",
    "r\u030F"=>"\u0211",
    "R\u0311"=>"\u0212",
    "r\u0311"=>"\u0213",
    "U\u030F"=>"\u0214",
    "u\u030F"=>"\u0215",
    "U\u0311"=>"\u0216",
    "u\u0311"=>"\u0217",
    "S\u0326"=>"\u0218",
    "s\u0326"=>"\u0219",
    "T\u0326"=>"\u021A",
    "t\u0326"=>"\u021B",
    "H\u030C"=>"\u021E",
    "h\u030C"=>"\u021F",
    "A\u0307"=>"\u0226",
    "a\u0307"=>"\u0227",
    "E\u0327"=>"\u0228",
    "e\u0327"=>"\u0229",
    "\u00D6\u0304"=>"\u022A",
    "\u00F6\u0304"=>"\u022B",
    "\u00D5\u0304"=>"\u022C",
    "\u00F5\u0304"=>"\u022D",
    "O\u0307"=>"\u022E",
    "o\u0307"=>"\u022F",
    "\u022E\u0304"=>"\u0230",
    "\u022F\u0304"=>"\u0231",
    "Y\u0304"=>"\u0232",
    "y\u0304"=>"\u0233",
    "\u00A8\u0301"=>"\u0385",
    "\u0391\u0301"=>"\u0386",
    "\u0395\u0301"=>"\u0388",
    "\u0397\u0301"=>"\u0389",
    "\u0399\u0301"=>"\u038A",
    "\u039F\u0301"=>"\u038C",
    "\u03A5\u0301"=>"\u038E",
    "\u03A9\u0301"=>"\u038F",
    "\u03CA\u0301"=>"\u0390",
    "\u0399\u0308"=>"\u03AA",
    "\u03A5\u0308"=>"\u03AB",
    "\u03B1\u0301"=>"\u03AC",
    "\u03B5\u0301"=>"\u03AD",
    "\u03B7\u0301"=>"\u03AE",
    "\u03B9\u0301"=>"\u03AF",
    "\u03CB\u0301"=>"\u03B0",
    "\u03B9\u0308"=>"\u03CA",
    "\u03C5\u0308"=>"\u03CB",
    "\u03BF\u0301"=>"\u03CC",
    "\u03C5\u0301"=>"\u03CD",
    "\u03C9\u0301"=>"\u03CE",
    "\u03D2\u0301"=>"\u03D3",
    "\u03D2\u0308"=>"\u03D4",
    "\u0415\u0300"=>"\u0400",
    "\u0415\u0308"=>"\u0401",
    "\u0413\u0301"=>"\u0403",
    "\u0406\u0308"=>"\u0407",
    "\u041A\u0301"=>"\u040C",
    "\u0418\u0300"=>"\u040D",
    "\u0423\u0306"=>"\u040E",
    "\u0418\u0306"=>"\u0419",
    "\u0438\u0306"=>"\u0439",
    "\u0435\u0300"=>"\u0450",
    "\u0435\u0308"=>"\u0451",
    "\u0433\u0301"=>"\u0453",
    "\u0456\u0308"=>"\u0457",
    "\u043A\u0301"=>"\u045C",
    "\u0438\u0300"=>"\u045D",
    "\u0443\u0306"=>"\u045E",
    "\u0474\u030F"=>"\u0476",
    "\u0475\u030F"=>"\u0477",
    "\u0416\u0306"=>"\u04C1",
    "\u0436\u0306"=>"\u04C2",
    "\u0410\u0306"=>"\u04D0",
    "\u0430\u0306"=>"\u04D1",
    "\u0410\u0308"=>"\u04D2",
    "\u0430\u0308"=>"\u04D3",
    "\u0415\u0306"=>"\u04D6",
    "\u0435\u0306"=>"\u04D7",
    "\u04D8\u0308"=>"\u04DA",
    "\u04D9\u0308"=>"\u04DB",
    "\u0416\u0308"=>"\u04DC",
    "\u0436\u0308"=>"\u04DD",
    "\u0417\u0308"=>"\u04DE",
    "\u0437\u0308"=>"\u04DF",
    "\u0418\u0304"=>"\u04E2",
    "\u0438\u0304"=>"\u04E3",
    "\u0418\u0308"=>"\u04E4",
    "\u0438\u0308"=>"\u04E5",
    "\u041E\u0308"=>"\u04E6",
    "\u043E\u0308"=>"\u04E7",
    "\u04E8\u0308"=>"\u04EA",
    "\u04E9\u0308"=>"\u04EB",
    "\u042D\u0308"=>"\u04EC",
    "\u044D\u0308"=>"\u04ED",
    "\u0423\u0304"=>"\u04EE",
    "\u0443\u0304"=>"\u04EF",
    "\u0423\u0308"=>"\u04F0",
    "\u0443\u0308"=>"\u04F1",
    "\u0423\u030B"=>"\u04F2",
    "\u0443\u030B"=>"\u04F3",
    "\u0427\u0308"=>"\u04F4",
    "\u0447\u0308"=>"\u04F5",
    "\u042B\u0308"=>"\u04F8",
    "\u044B\u0308"=>"\u04F9",
    "\u0627\u0653"=>"\u0622",
    "\u0627\u0654"=>"\u0623",
    "\u0648\u0654"=>"\u0624",
    "\u0627\u0655"=>"\u0625",
    "\u064A\u0654"=>"\u0626",
    "\u06D5\u0654"=>"\u06C0",
    "\u06C1\u0654"=>"\u06C2",
    "\u06D2\u0654"=>"\u06D3",
    "\u0928\u093C"=>"\u0929",
    "\u0930\u093C"=>"\u0931",
    "\u0933\u093C"=>"\u0934",
    "\u09C7\u09BE"=>"\u09CB",
    "\u09C7\u09D7"=>"\u09CC",
    "\u0B47\u0B56"=>"\u0B48",
    "\u0B47\u0B3E"=>"\u0B4B",
    "\u0B47\u0B57"=>"\u0B4C",
    "\u0B92\u0BD7"=>"\u0B94",
    "\u0BC6\u0BBE"=>"\u0BCA",
    "\u0BC7\u0BBE"=>"\u0BCB",
    "\u0BC6\u0BD7"=>"\u0BCC",
    "\u0C46\u0C56"=>"\u0C48",
    "\u0CBF\u0CD5"=>"\u0CC0",
    "\u0CC6\u0CD5"=>"\u0CC7",
    "\u0CC6\u0CD6"=>"\u0CC8",
    "\u0CC6\u0CC2"=>"\u0CCA",
    "\u0CCA\u0CD5"=>"\u0CCB",
    "\u0D46\u0D3E"=>"\u0D4A",
    "\u0D47\u0D3E"=>"\u0D4B",
    "\u0D46\u0D57"=>"\u0D4C",
    "\u0DD9\u0DCA"=>"\u0DDA",
    "\u0DD9\u0DCF"=>"\u0DDC",
    "\u0DDC\u0DCA"=>"\u0DDD",
    "\u0DD9\u0DDF"=>"\u0DDE",
    "\u1025\u102E"=>"\u1026",
    "\u1B05\u1B35"=>"\u1B06",
    "\u1B07\u1B35"=>"\u1B08",
    "\u1B09\u1B35"=>"\u1B0A",
    "\u1B0B\u1B35"=>"\u1B0C",
    "\u1B0D\u1B35"=>"\u1B0E",
    "\u1B11\u1B35"=>"\u1B12",
    "\u1B3A\u1B35"=>"\u1B3B",
    "\u1B3C\u1B35"=>"\u1B3D",
    "\u1B3E\u1B35"=>"\u1B40",
    "\u1B3F\u1B35"=>"\u1B41",
    "\u1B42\u1B35"=>"\u1B43",
    "A\u0325"=>"\u1E00",
    "a\u0325"=>"\u1E01",
    "B\u0307"=>"\u1E02",
    "b\u0307"=>"\u1E03",
    "B\u0323"=>"\u1E04",
    "b\u0323"=>"\u1E05",
    "B\u0331"=>"\u1E06",
    "b\u0331"=>"\u1E07",
    "\u00C7\u0301"=>"\u1E08",
    "\u00E7\u0301"=>"\u1E09",
    "D\u0307"=>"\u1E0A",
    "d\u0307"=>"\u1E0B",
    "D\u0323"=>"\u1E0C",
    "d\u0323"=>"\u1E0D",
    "D\u0331"=>"\u1E0E",
    "d\u0331"=>"\u1E0F",
    "D\u0327"=>"\u1E10",
    "d\u0327"=>"\u1E11",
    "D\u032D"=>"\u1E12",
    "d\u032D"=>"\u1E13",
    "\u0112\u0300"=>"\u1E14",
    "\u0113\u0300"=>"\u1E15",
    "\u0112\u0301"=>"\u1E16",
    "\u0113\u0301"=>"\u1E17",
    "E\u032D"=>"\u1E18",
    "e\u032D"=>"\u1E19",
    "E\u0330"=>"\u1E1A",
    "e\u0330"=>"\u1E1B",
    "\u0228\u0306"=>"\u1E1C",
    "\u0229\u0306"=>"\u1E1D",
    "F\u0307"=>"\u1E1E",
    "f\u0307"=>"\u1E1F",
    "G\u0304"=>"\u1E20",
    "g\u0304"=>"\u1E21",
    "H\u0307"=>"\u1E22",
    "h\u0307"=>"\u1E23",
    "H\u0323"=>"\u1E24",
    "h\u0323"=>"\u1E25",
    "H\u0308"=>"\u1E26",
    "h\u0308"=>"\u1E27",
    "H\u0327"=>"\u1E28",
    "h\u0327"=>"\u1E29",
    "H\u032E"=>"\u1E2A",
    "h\u032E"=>"\u1E2B",
    "I\u0330"=>"\u1E2C",
    "i\u0330"=>"\u1E2D",
    "\u00CF\u0301"=>"\u1E2E",
    "\u00EF\u0301"=>"\u1E2F",
    "K\u0301"=>"\u1E30",
    "k\u0301"=>"\u1E31",
    "K\u0323"=>"\u1E32",
    "k\u0323"=>"\u1E33",
    "K\u0331"=>"\u1E34",
    "k\u0331"=>"\u1E35",
    "L\u0323"=>"\u1E36",
    "l\u0323"=>"\u1E37",
    "\u1E36\u0304"=>"\u1E38",
    "\u1E37\u0304"=>"\u1E39",
    "L\u0331"=>"\u1E3A",
    "l\u0331"=>"\u1E3B",
    "L\u032D"=>"\u1E3C",
    "l\u032D"=>"\u1E3D",
    "M\u0301"=>"\u1E3E",
    "m\u0301"=>"\u1E3F",
    "M\u0307"=>"\u1E40",
    "m\u0307"=>"\u1E41",
    "M\u0323"=>"\u1E42",
    "m\u0323"=>"\u1E43",
    "N\u0307"=>"\u1E44",
    "n\u0307"=>"\u1E45",
    "N\u0323"=>"\u1E46",
    "n\u0323"=>"\u1E47",
    "N\u0331"=>"\u1E48",
    "n\u0331"=>"\u1E49",
    "N\u032D"=>"\u1E4A",
    "n\u032D"=>"\u1E4B",
    "\u00D5\u0301"=>"\u1E4C",
    "\u00F5\u0301"=>"\u1E4D",
    "\u00D5\u0308"=>"\u1E4E",
    "\u00F5\u0308"=>"\u1E4F",
    "\u014C\u0300"=>"\u1E50",
    "\u014D\u0300"=>"\u1E51",
    "\u014C\u0301"=>"\u1E52",
    "\u014D\u0301"=>"\u1E53",
    "P\u0301"=>"\u1E54",
    "p\u0301"=>"\u1E55",
    "P\u0307"=>"\u1E56",
    "p\u0307"=>"\u1E57",
    "R\u0307"=>"\u1E58",
    "r\u0307"=>"\u1E59",
    "R\u0323"=>"\u1E5A",
    "r\u0323"=>"\u1E5B",
    "\u1E5A\u0304"=>"\u1E5C",
    "\u1E5B\u0304"=>"\u1E5D",
    "R\u0331"=>"\u1E5E",
    "r\u0331"=>"\u1E5F",
    "S\u0307"=>"\u1E60",
    "s\u0307"=>"\u1E61",
    "S\u0323"=>"\u1E62",
    "s\u0323"=>"\u1E63",
    "\u015A\u0307"=>"\u1E64",
    "\u015B\u0307"=>"\u1E65",
    "\u0160\u0307"=>"\u1E66",
    "\u0161\u0307"=>"\u1E67",
    "\u1E62\u0307"=>"\u1E68",
    "\u1E63\u0307"=>"\u1E69",
    "T\u0307"=>"\u1E6A",
    "t\u0307"=>"\u1E6B",
    "T\u0323"=>"\u1E6C",
    "t\u0323"=>"\u1E6D",
    "T\u0331"=>"\u1E6E",
    "t\u0331"=>"\u1E6F",
    "T\u032D"=>"\u1E70",
    "t\u032D"=>"\u1E71",
    "U\u0324"=>"\u1E72",
    "u\u0324"=>"\u1E73",
    "U\u0330"=>"\u1E74",
    "u\u0330"=>"\u1E75",
    "U\u032D"=>"\u1E76",
    "u\u032D"=>"\u1E77",
    "\u0168\u0301"=>"\u1E78",
    "\u0169\u0301"=>"\u1E79",
    "\u016A\u0308"=>"\u1E7A",
    "\u016B\u0308"=>"\u1E7B",
    "V\u0303"=>"\u1E7C",
    "v\u0303"=>"\u1E7D",
    "V\u0323"=>"\u1E7E",
    "v\u0323"=>"\u1E7F",
    "W\u0300"=>"\u1E80",
    "w\u0300"=>"\u1E81",
    "W\u0301"=>"\u1E82",
    "w\u0301"=>"\u1E83",
    "W\u0308"=>"\u1E84",
    "w\u0308"=>"\u1E85",
    "W\u0307"=>"\u1E86",
    "w\u0307"=>"\u1E87",
    "W\u0323"=>"\u1E88",
    "w\u0323"=>"\u1E89",
    "X\u0307"=>"\u1E8A",
    "x\u0307"=>"\u1E8B",
    "X\u0308"=>"\u1E8C",
    "x\u0308"=>"\u1E8D",
    "Y\u0307"=>"\u1E8E",
    "y\u0307"=>"\u1E8F",
    "Z\u0302"=>"\u1E90",
    "z\u0302"=>"\u1E91",
    "Z\u0323"=>"\u1E92",
    "z\u0323"=>"\u1E93",
    "Z\u0331"=>"\u1E94",
    "z\u0331"=>"\u1E95",
    "h\u0331"=>"\u1E96",
    "t\u0308"=>"\u1E97",
    "w\u030A"=>"\u1E98",
    "y\u030A"=>"\u1E99",
    "\u017F\u0307"=>"\u1E9B",
    "A\u0323"=>"\u1EA0",
    "a\u0323"=>"\u1EA1",
    "A\u0309"=>"\u1EA2",
    "a\u0309"=>"\u1EA3",
    "\u00C2\u0301"=>"\u1EA4",
    "\u00E2\u0301"=>"\u1EA5",
    "\u00C2\u0300"=>"\u1EA6",
    "\u00E2\u0300"=>"\u1EA7",
    "\u00C2\u0309"=>"\u1EA8",
    "\u00E2\u0309"=>"\u1EA9",
    "\u00C2\u0303"=>"\u1EAA",
    "\u00E2\u0303"=>"\u1EAB",
    "\u1EA0\u0302"=>"\u1EAC",
    "\u1EA1\u0302"=>"\u1EAD",
    "\u0102\u0301"=>"\u1EAE",
    "\u0103\u0301"=>"\u1EAF",
    "\u0102\u0300"=>"\u1EB0",
    "\u0103\u0300"=>"\u1EB1",
    "\u0102\u0309"=>"\u1EB2",
    "\u0103\u0309"=>"\u1EB3",
    "\u0102\u0303"=>"\u1EB4",
    "\u0103\u0303"=>"\u1EB5",
    "\u1EA0\u0306"=>"\u1EB6",
    "\u1EA1\u0306"=>"\u1EB7",
    "E\u0323"=>"\u1EB8",
    "e\u0323"=>"\u1EB9",
    "E\u0309"=>"\u1EBA",
    "e\u0309"=>"\u1EBB",
    "E\u0303"=>"\u1EBC",
    "e\u0303"=>"\u1EBD",
    "\u00CA\u0301"=>"\u1EBE",
    "\u00EA\u0301"=>"\u1EBF",
    "\u00CA\u0300"=>"\u1EC0",
    "\u00EA\u0300"=>"\u1EC1",
    "\u00CA\u0309"=>"\u1EC2",
    "\u00EA\u0309"=>"\u1EC3",
    "\u00CA\u0303"=>"\u1EC4",
    "\u00EA\u0303"=>"\u1EC5",
    "\u1EB8\u0302"=>"\u1EC6",
    "\u1EB9\u0302"=>"\u1EC7",
    "I\u0309"=>"\u1EC8",
    "i\u0309"=>"\u1EC9",
    "I\u0323"=>"\u1ECA",
    "i\u0323"=>"\u1ECB",
    "O\u0323"=>"\u1ECC",
    "o\u0323"=>"\u1ECD",
    "O\u0309"=>"\u1ECE",
    "o\u0309"=>"\u1ECF",
    "\u00D4\u0301"=>"\u1ED0",
    "\u00F4\u0301"=>"\u1ED1",
    "\u00D4\u0300"=>"\u1ED2",
    "\u00F4\u0300"=>"\u1ED3",
    "\u00D4\u0309"=>"\u1ED4",
    "\u00F4\u0309"=>"\u1ED5",
    "\u00D4\u0303"=>"\u1ED6",
    "\u00F4\u0303"=>"\u1ED7",
    "\u1ECC\u0302"=>"\u1ED8",
    "\u1ECD\u0302"=>"\u1ED9",
    "\u01A0\u0301"=>"\u1EDA",
    "\u01A1\u0301"=>"\u1EDB",
    "\u01A0\u0300"=>"\u1EDC",
    "\u01A1\u0300"=>"\u1EDD",
    "\u01A0\u0309"=>"\u1EDE",
    "\u01A1\u0309"=>"\u1EDF",
    "\u01A0\u0303"=>"\u1EE0",
    "\u01A1\u0303"=>"\u1EE1",
    "\u01A0\u0323"=>"\u1EE2",
    "\u01A1\u0323"=>"\u1EE3",
    "U\u0323"=>"\u1EE4",
    "u\u0323"=>"\u1EE5",
    "U\u0309"=>"\u1EE6",
    "u\u0309"=>"\u1EE7",
    "\u01AF\u0301"=>"\u1EE8",
    "\u01B0\u0301"=>"\u1EE9",
    "\u01AF\u0300"=>"\u1EEA",
    "\u01B0\u0300"=>"\u1EEB",
    "\u01AF\u0309"=>"\u1EEC",
    "\u01B0\u0309"=>"\u1EED",
    "\u01AF\u0303"=>"\u1EEE",
    "\u01B0\u0303"=>"\u1EEF",
    "\u01AF\u0323"=>"\u1EF0",
    "\u01B0\u0323"=>"\u1EF1",
    "Y\u0300"=>"\u1EF2",
    "y\u0300"=>"\u1EF3",
    "Y\u0323"=>"\u1EF4",
    "y\u0323"=>"\u1EF5",
    "Y\u0309"=>"\u1EF6",
    "y\u0309"=>"\u1EF7",
    "Y\u0303"=>"\u1EF8",
    "y\u0303"=>"\u1EF9",
    "\u03B1\u0313"=>"\u1F00",
    "\u03B1\u0314"=>"\u1F01",
    "\u1F00\u0300"=>"\u1F02",
    "\u1F01\u0300"=>"\u1F03",
    "\u1F00\u0301"=>"\u1F04",
    "\u1F01\u0301"=>"\u1F05",
    "\u1F00\u0342"=>"\u1F06",
    "\u1F01\u0342"=>"\u1F07",
    "\u0391\u0313"=>"\u1F08",
    "\u0391\u0314"=>"\u1F09",
    "\u1F08\u0300"=>"\u1F0A",
    "\u1F09\u0300"=>"\u1F0B",
    "\u1F08\u0301"=>"\u1F0C",
    "\u1F09\u0301"=>"\u1F0D",
    "\u1F08\u0342"=>"\u1F0E",
    "\u1F09\u0342"=>"\u1F0F",
    "\u03B5\u0313"=>"\u1F10",
    "\u03B5\u0314"=>"\u1F11",
    "\u1F10\u0300"=>"\u1F12",
    "\u1F11\u0300"=>"\u1F13",
    "\u1F10\u0301"=>"\u1F14",
    "\u1F11\u0301"=>"\u1F15",
    "\u0395\u0313"=>"\u1F18",
    "\u0395\u0314"=>"\u1F19",
    "\u1F18\u0300"=>"\u1F1A",
    "\u1F19\u0300"=>"\u1F1B",
    "\u1F18\u0301"=>"\u1F1C",
    "\u1F19\u0301"=>"\u1F1D",
    "\u03B7\u0313"=>"\u1F20",
    "\u03B7\u0314"=>"\u1F21",
    "\u1F20\u0300"=>"\u1F22",
    "\u1F21\u0300"=>"\u1F23",
    "\u1F20\u0301"=>"\u1F24",
    "\u1F21\u0301"=>"\u1F25",
    "\u1F20\u0342"=>"\u1F26",
    "\u1F21\u0342"=>"\u1F27",
    "\u0397\u0313"=>"\u1F28",
    "\u0397\u0314"=>"\u1F29",
    "\u1F28\u0300"=>"\u1F2A",
    "\u1F29\u0300"=>"\u1F2B",
    "\u1F28\u0301"=>"\u1F2C",
    "\u1F29\u0301"=>"\u1F2D",
    "\u1F28\u0342"=>"\u1F2E",
    "\u1F29\u0342"=>"\u1F2F",
    "\u03B9\u0313"=>"\u1F30",
    "\u03B9\u0314"=>"\u1F31",
    "\u1F30\u0300"=>"\u1F32",
    "\u1F31\u0300"=>"\u1F33",
    "\u1F30\u0301"=>"\u1F34",
    "\u1F31\u0301"=>"\u1F35",
    "\u1F30\u0342"=>"\u1F36",
    "\u1F31\u0342"=>"\u1F37",
    "\u0399\u0313"=>"\u1F38",
    "\u0399\u0314"=>"\u1F39",
    "\u1F38\u0300"=>"\u1F3A",
    "\u1F39\u0300"=>"\u1F3B",
    "\u1F38\u0301"=>"\u1F3C",
    "\u1F39\u0301"=>"\u1F3D",
    "\u1F38\u0342"=>"\u1F3E",
    "\u1F39\u0342"=>"\u1F3F",
    "\u03BF\u0313"=>"\u1F40",
    "\u03BF\u0314"=>"\u1F41",
    "\u1F40\u0300"=>"\u1F42",
    "\u1F41\u0300"=>"\u1F43",
    "\u1F40\u0301"=>"\u1F44",
    "\u1F41\u0301"=>"\u1F45",
    "\u039F\u0313"=>"\u1F48",
    "\u039F\u0314"=>"\u1F49",
    "\u1F48\u0300"=>"\u1F4A",
    "\u1F49\u0300"=>"\u1F4B",
    "\u1F48\u0301"=>"\u1F4C",
    "\u1F49\u0301"=>"\u1F4D",
    "\u03C5\u0313"=>"\u1F50",
    "\u03C5\u0314"=>"\u1F51",
    "\u1F50\u0300"=>"\u1F52",
    "\u1F51\u0300"=>"\u1F53",
    "\u1F50\u0301"=>"\u1F54",
    "\u1F51\u0301"=>"\u1F55",
    "\u1F50\u0342"=>"\u1F56",
    "\u1F51\u0342"=>"\u1F57",
    "\u03A5\u0314"=>"\u1F59",
    "\u1F59\u0300"=>"\u1F5B",
    "\u1F59\u0301"=>"\u1F5D",
    "\u1F59\u0342"=>"\u1F5F",
    "\u03C9\u0313"=>"\u1F60",
    "\u03C9\u0314"=>"\u1F61",
    "\u1F60\u0300"=>"\u1F62",
    "\u1F61\u0300"=>"\u1F63",
    "\u1F60\u0301"=>"\u1F64",
    "\u1F61\u0301"=>"\u1F65",
    "\u1F60\u0342"=>"\u1F66",
    "\u1F61\u0342"=>"\u1F67",
    "\u03A9\u0313"=>"\u1F68",
    "\u03A9\u0314"=>"\u1F69",
    "\u1F68\u0300"=>"\u1F6A",
    "\u1F69\u0300"=>"\u1F6B",
    "\u1F68\u0301"=>"\u1F6C",
    "\u1F69\u0301"=>"\u1F6D",
    "\u1F68\u0342"=>"\u1F6E",
    "\u1F69\u0342"=>"\u1F6F",
    "\u03B1\u0300"=>"\u1F70",
    "\u03B5\u0300"=>"\u1F72",
    "\u03B7\u0300"=>"\u1F74",
    "\u03B9\u0300"=>"\u1F76",
    "\u03BF\u0300"=>"\u1F78",
    "\u03C5\u0300"=>"\u1F7A",
    "\u03C9\u0300"=>"\u1F7C",
    "\u1F00\u0345"=>"\u1F80",
    "\u1F01\u0345"=>"\u1F81",
    "\u1F02\u0345"=>"\u1F82",
    "\u1F03\u0345"=>"\u1F83",
    "\u1F04\u0345"=>"\u1F84",
    "\u1F05\u0345"=>"\u1F85",
    "\u1F06\u0345"=>"\u1F86",
    "\u1F07\u0345"=>"\u1F87",
    "\u1F08\u0345"=>"\u1F88",
    "\u1F09\u0345"=>"\u1F89",
    "\u1F0A\u0345"=>"\u1F8A",
    "\u1F0B\u0345"=>"\u1F8B",
    "\u1F0C\u0345"=>"\u1F8C",
    "\u1F0D\u0345"=>"\u1F8D",
    "\u1F0E\u0345"=>"\u1F8E",
    "\u1F0F\u0345"=>"\u1F8F",
    "\u1F20\u0345"=>"\u1F90",
    "\u1F21\u0345"=>"\u1F91",
    "\u1F22\u0345"=>"\u1F92",
    "\u1F23\u0345"=>"\u1F93",
    "\u1F24\u0345"=>"\u1F94",
    "\u1F25\u0345"=>"\u1F95",
    "\u1F26\u0345"=>"\u1F96",
    "\u1F27\u0345"=>"\u1F97",
    "\u1F28\u0345"=>"\u1F98",
    "\u1F29\u0345"=>"\u1F99",
    "\u1F2A\u0345"=>"\u1F9A",
    "\u1F2B\u0345"=>"\u1F9B",
    "\u1F2C\u0345"=>"\u1F9C",
    "\u1F2D\u0345"=>"\u1F9D",
    "\u1F2E\u0345"=>"\u1F9E",
    "\u1F2F\u0345"=>"\u1F9F",
    "\u1F60\u0345"=>"\u1FA0",
    "\u1F61\u0345"=>"\u1FA1",
    "\u1F62\u0345"=>"\u1FA2",
    "\u1F63\u0345"=>"\u1FA3",
    "\u1F64\u0345"=>"\u1FA4",
    "\u1F65\u0345"=>"\u1FA5",
    "\u1F66\u0345"=>"\u1FA6",
    "\u1F67\u0345"=>"\u1FA7",
    "\u1F68\u0345"=>"\u1FA8",
    "\u1F69\u0345"=>"\u1FA9",
    "\u1F6A\u0345"=>"\u1FAA",
    "\u1F6B\u0345"=>"\u1FAB",
    "\u1F6C\u0345"=>"\u1FAC",
    "\u1F6D\u0345"=>"\u1FAD",
    "\u1F6E\u0345"=>"\u1FAE",
    "\u1F6F\u0345"=>"\u1FAF",
    "\u03B1\u0306"=>"\u1FB0",
    "\u03B1\u0304"=>"\u1FB1",
    "\u1F70\u0345"=>"\u1FB2",
    "\u03B1\u0345"=>"\u1FB3",
    "\u03AC\u0345"=>"\u1FB4",
    "\u03B1\u0342"=>"\u1FB6",
    "\u1FB6\u0345"=>"\u1FB7",
    "\u0391\u0306"=>"\u1FB8",
    "\u0391\u0304"=>"\u1FB9",
    "\u0391\u0300"=>"\u1FBA",
    "\u0391\u0345"=>"\u1FBC",
    "\u00A8\u0342"=>"\u1FC1",
    "\u1F74\u0345"=>"\u1FC2",
    "\u03B7\u0345"=>"\u1FC3",
    "\u03AE\u0345"=>"\u1FC4",
    "\u03B7\u0342"=>"\u1FC6",
    "\u1FC6\u0345"=>"\u1FC7",
    "\u0395\u0300"=>"\u1FC8",
    "\u0397\u0300"=>"\u1FCA",
    "\u0397\u0345"=>"\u1FCC",
    "\u1FBF\u0300"=>"\u1FCD",
    "\u1FBF\u0301"=>"\u1FCE",
    "\u1FBF\u0342"=>"\u1FCF",
    "\u03B9\u0306"=>"\u1FD0",
    "\u03B9\u0304"=>"\u1FD1",
    "\u03CA\u0300"=>"\u1FD2",
    "\u03B9\u0342"=>"\u1FD6",
    "\u03CA\u0342"=>"\u1FD7",
    "\u0399\u0306"=>"\u1FD8",
    "\u0399\u0304"=>"\u1FD9",
    "\u0399\u0300"=>"\u1FDA",
    "\u1FFE\u0300"=>"\u1FDD",
    "\u1FFE\u0301"=>"\u1FDE",
    "\u1FFE\u0342"=>"\u1FDF",
    "\u03C5\u0306"=>"\u1FE0",
    "\u03C5\u0304"=>"\u1FE1",
    "\u03CB\u0300"=>"\u1FE2",
    "\u03C1\u0313"=>"\u1FE4",
    "\u03C1\u0314"=>"\u1FE5",
    "\u03C5\u0342"=>"\u1FE6",
    "\u03CB\u0342"=>"\u1FE7",
    "\u03A5\u0306"=>"\u1FE8",
    "\u03A5\u0304"=>"\u1FE9",
    "\u03A5\u0300"=>"\u1FEA",
    "\u03A1\u0314"=>"\u1FEC",
    "\u00A8\u0300"=>"\u1FED",
    "\u1F7C\u0345"=>"\u1FF2",
    "\u03C9\u0345"=>"\u1FF3",
    "\u03CE\u0345"=>"\u1FF4",
    "\u03C9\u0342"=>"\u1FF6",
    "\u1FF6\u0345"=>"\u1FF7",
    "\u039F\u0300"=>"\u1FF8",
    "\u03A9\u0300"=>"\u1FFA",
    "\u03A9\u0345"=>"\u1FFC",
    "\u2190\u0338"=>"\u219A",
    "\u2192\u0338"=>"\u219B",
    "\u2194\u0338"=>"\u21AE",
    "\u21D0\u0338"=>"\u21CD",
    "\u21D4\u0338"=>"\u21CE",
    "\u21D2\u0338"=>"\u21CF",
    "\u2203\u0338"=>"\u2204",
    "\u2208\u0338"=>"\u2209",
    "\u220B\u0338"=>"\u220C",
    "\u2223\u0338"=>"\u2224",
    "\u2225\u0338"=>"\u2226",
    "\u223C\u0338"=>"\u2241",
    "\u2243\u0338"=>"\u2244",
    "\u2245\u0338"=>"\u2247",
    "\u2248\u0338"=>"\u2249",
    "=\u0338"=>"\u2260",
    "\u2261\u0338"=>"\u2262",
    "\u224D\u0338"=>"\u226D",
    "<\u0338"=>"\u226E",
    ">\u0338"=>"\u226F",
    "\u2264\u0338"=>"\u2270",
    "\u2265\u0338"=>"\u2271",
    "\u2272\u0338"=>"\u2274",
    "\u2273\u0338"=>"\u2275",
    "\u2276\u0338"=>"\u2278",
    "\u2277\u0338"=>"\u2279",
    "\u227A\u0338"=>"\u2280",
    "\u227B\u0338"=>"\u2281",
    "\u2282\u0338"=>"\u2284",
    "\u2283\u0338"=>"\u2285",
    "\u2286\u0338"=>"\u2288",
    "\u2287\u0338"=>"\u2289",
    "\u22A2\u0338"=>"\u22AC",
    "\u22A8\u0338"=>"\u22AD",
    "\u22A9\u0338"=>"\u22AE",
    "\u22AB\u0338"=>"\u22AF",
    "\u227C\u0338"=>"\u22E0",
    "\u227D\u0338"=>"\u22E1",
    "\u2291\u0338"=>"\u22E2",
    "\u2292\u0338"=>"\u22E3",
    "\u22B2\u0338"=>"\u22EA",
    "\u22B3\u0338"=>"\u22EB",
    "\u22B4\u0338"=>"\u22EC",
    "\u22B5\u0338"=>"\u22ED",
    "\u304B\u3099"=>"\u304C",
    "\u304D\u3099"=>"\u304E",
    "\u304F\u3099"=>"\u3050",
    "\u3051\u3099"=>"\u3052",
    "\u3053\u3099"=>"\u3054",
    "\u3055\u3099"=>"\u3056",
    "\u3057\u3099"=>"\u3058",
    "\u3059\u3099"=>"\u305A",
    "\u305B\u3099"=>"\u305C",
    "\u305D\u3099"=>"\u305E",
    "\u305F\u3099"=>"\u3060",
    "\u3061\u3099"=>"\u3062",
    "\u3064\u3099"=>"\u3065",
    "\u3066\u3099"=>"\u3067",
    "\u3068\u3099"=>"\u3069",
    "\u306F\u3099"=>"\u3070",
    "\u306F\u309A"=>"\u3071",
    "\u3072\u3099"=>"\u3073",
    "\u3072\u309A"=>"\u3074",
    "\u3075\u3099"=>"\u3076",
    "\u3075\u309A"=>"\u3077",
    "\u3078\u3099"=>"\u3079",
    "\u3078\u309A"=>"\u307A",
    "\u307B\u3099"=>"\u307C",
    "\u307B\u309A"=>"\u307D",
    "\u3046\u3099"=>"\u3094",
    "\u309D\u3099"=>"\u309E",
    "\u30AB\u3099"=>"\u30AC",
    "\u30AD\u3099"=>"\u30AE",
    "\u30AF\u3099"=>"\u30B0",
    "\u30B1\u3099"=>"\u30B2",
    "\u30B3\u3099"=>"\u30B4",
    "\u30B5\u3099"=>"\u30B6",
    "\u30B7\u3099"=>"\u30B8",
    "\u30B9\u3099"=>"\u30BA",
    "\u30BB\u3099"=>"\u30BC",
    "\u30BD\u3099"=>"\u30BE",
    "\u30BF\u3099"=>"\u30C0",
    "\u30C1\u3099"=>"\u30C2",
    "\u30C4\u3099"=>"\u30C5",
    "\u30C6\u3099"=>"\u30C7",
    "\u30C8\u3099"=>"\u30C9",
    "\u30CF\u3099"=>"\u30D0",
    "\u30CF\u309A"=>"\u30D1",
    "\u30D2\u3099"=>"\u30D3",
    "\u30D2\u309A"=>"\u30D4",
    "\u30D5\u3099"=>"\u30D6",
    "\u30D5\u309A"=>"\u30D7",
    "\u30D8\u3099"=>"\u30D9",
    "\u30D8\u309A"=>"\u30DA",
    "\u30DB\u3099"=>"\u30DC",
    "\u30DB\u309A"=>"\u30DD",
    "\u30A6\u3099"=>"\u30F4",
    "\u30EF\u3099"=>"\u30F7",
    "\u30F0\u3099"=>"\u30F8",
    "\u30F1\u3099"=>"\u30F9",
    "\u30F2\u3099"=>"\u30FA",
    "\u30FD\u3099"=>"\u30FE",
    "\u{11099}\u{110BA}"=>"\u{1109A}",
    "\u{1109B}\u{110BA}"=>"\u{1109C}",
    "\u{110A5}\u{110BA}"=>"\u{110AB}",
    "\u{11131}\u{11127}"=>"\u{1112E}",
    "\u{11132}\u{11127}"=>"\u{1112F}",
    "\u{11347}\u{1133E}"=>"\u{1134B}",
    "\u{11347}\u{11357}"=>"\u{1134C}",
    "\u{114B9}\u{114BA}"=>"\u{114BB}",
    "\u{114B9}\u{114B0}"=>"\u{114BC}",
    "\u{114B9}\u{114BD}"=>"\u{114BE}",
    "\u{115B8}\u{115AF}"=>"\u{115BA}",
    "\u{115B9}\u{115AF}"=>"\u{115BB}",
    "\u{11935}\u{11930}"=>"\u{11938}",
  }.freeze
end
PK!}$[�.
��#ruby/unicode_normalize/normalize.rbnu�[���# coding: utf-8
# frozen_string_literal: false

# Copyright Ayumu Nojima (野島 歩) and Martin J. Dürst (duerst@it.aoyama.ac.jp)

# This file, the companion file tables.rb (autogenerated), and the module,
# constants, and method defined herein are part of the implementation of the
# built-in String class, not part of the standard library. They should
# therefore never be gemified. They implement the methods
# String#unicode_normalize, String#unicode_normalize!, and String#unicode_normalized?.
#
# They are placed here because they are written in Ruby. They are loaded on
# demand when any of the three methods mentioned above is executed for the
# first time. This reduces the memory footprint and startup time for scripts
# and applications that do not use those methods.
#
# The name and even the existence of the module UnicodeNormalize and all of its
# content are purely an implementation detail, and should not be exposed in
# any test or spec or otherwise.

require_relative 'tables'


module UnicodeNormalize  # :nodoc:
  ## Constant for max hash capacity to avoid DoS attack
  MAX_HASH_LENGTH = 18000 # enough for all test cases, otherwise tests get slow

  ## Regular Expressions and Hash Constants
  REGEXP_D = Regexp.compile(REGEXP_D_STRING, Regexp::EXTENDED)
  REGEXP_C = Regexp.compile(REGEXP_C_STRING, Regexp::EXTENDED)
  REGEXP_K = Regexp.compile(REGEXP_K_STRING, Regexp::EXTENDED)
  NF_HASH_D = Hash.new do |hash, key|
                         hash.shift if hash.length>MAX_HASH_LENGTH # prevent DoS attack
                         hash[key] = nfd_one(key)
                       end
  NF_HASH_C = Hash.new do |hash, key|
                         hash.shift if hash.length>MAX_HASH_LENGTH # prevent DoS attack
                         hash[key] = nfc_one(key)
                       end

  ## Constants For Hangul
  # for details such as the meaning of the identifiers below, please see
  # http://www.unicode.org/versions/Unicode7.0.0/ch03.pdf, pp. 144/145
  SBASE = 0xAC00
  LBASE = 0x1100
  VBASE = 0x1161
  TBASE = 0x11A7
  LCOUNT = 19
  VCOUNT = 21
  TCOUNT = 28
  NCOUNT = VCOUNT * TCOUNT
  SCOUNT = LCOUNT * NCOUNT

  # Unicode-based encodings (except UTF-8)
  UNICODE_ENCODINGS = [Encoding::UTF_16BE, Encoding::UTF_16LE, Encoding::UTF_32BE, Encoding::UTF_32LE,
                       Encoding::GB18030, Encoding::UCS_2BE, Encoding::UCS_4BE]

  ## Hangul Algorithm
  def self.hangul_decomp_one(target)
    syllable_index = target.ord - SBASE
    return target if syllable_index < 0 || syllable_index >= SCOUNT
    l = LBASE + syllable_index / NCOUNT
    v = VBASE + (syllable_index % NCOUNT) / TCOUNT
    t = TBASE + syllable_index % TCOUNT
    (t==TBASE ? [l, v] : [l, v, t]).pack('U*') + target[1..-1]
  end

  def self.hangul_comp_one(string)
    length = string.length
    if length>1 and 0 <= (lead =string[0].ord-LBASE) and lead  < LCOUNT and
                    0 <= (vowel=string[1].ord-VBASE) and vowel < VCOUNT
      lead_vowel = SBASE + (lead * VCOUNT + vowel) * TCOUNT
      if length>2 and 0 < (trail=string[2].ord-TBASE) and trail < TCOUNT
        (lead_vowel + trail).chr(Encoding::UTF_8) + string[3..-1]
      else
        lead_vowel.chr(Encoding::UTF_8) + string[2..-1]
      end
    else
      string
    end
  end

  ## Canonical Ordering
  def self.canonical_ordering_one(string)
    sorting = string.each_char.collect { |c| [c, CLASS_TABLE[c]] }
    (sorting.length-2).downto(0) do |i| # almost, but not exactly bubble sort
      (0..i).each do |j|
        later_class = sorting[j+1].last
        if 0<later_class and later_class<sorting[j].last
          sorting[j], sorting[j+1] = sorting[j+1], sorting[j]
        end
      end
    end
    return sorting.collect(&:first).join('')
  end

  ## Normalization Forms for Patterns (not whole Strings)
  def self.nfd_one(string)
    string = string.chars.map! {|c| DECOMPOSITION_TABLE[c] || c}.join('')
    canonical_ordering_one(hangul_decomp_one(string))
  end

  def self.nfc_one(string)
    nfd_string = nfd_one string
    start = nfd_string[0]
    last_class = CLASS_TABLE[start]-1
    accents = ''
    nfd_string[1..-1].each_char do |accent|
      accent_class = CLASS_TABLE[accent]
      if last_class<accent_class and composite = COMPOSITION_TABLE[start+accent]
        start = composite
      else
        accents << accent
        last_class = accent_class
      end
    end
    hangul_comp_one(start+accents)
  end

  def self.normalize(string, form = :nfc)
    encoding = string.encoding
    case encoding
    when Encoding::UTF_8
      case form
      when :nfc then
        string.gsub REGEXP_C, NF_HASH_C
      when :nfd then
        string.gsub REGEXP_D, NF_HASH_D
      when :nfkc then
        string.gsub(REGEXP_K, KOMPATIBLE_TABLE).gsub(REGEXP_C, NF_HASH_C)
      when :nfkd then
        string.gsub(REGEXP_K, KOMPATIBLE_TABLE).gsub(REGEXP_D, NF_HASH_D)
      else
        raise ArgumentError, "Invalid normalization form #{form}."
      end
    when Encoding::US_ASCII
      string
    when *UNICODE_ENCODINGS
      normalize(string.encode(Encoding::UTF_8), form).encode(encoding)
    else
      raise Encoding::CompatibilityError, "Unicode Normalization not appropriate for #{encoding}"
    end
  end

  def self.normalized?(string, form = :nfc)
    encoding = string.encoding
    case encoding
    when Encoding::UTF_8
      case form
      when :nfc then
        string.scan REGEXP_C do |match|
          return false  if NF_HASH_C[match] != match
        end
        true
      when :nfd then
        string.scan REGEXP_D do |match|
          return false  if NF_HASH_D[match] != match
        end
        true
      when :nfkc then
        normalized?(string, :nfc) and string !~ REGEXP_K
      when :nfkd then
        normalized?(string, :nfd) and string !~ REGEXP_K
      else
        raise ArgumentError, "Invalid normalization form #{form}."
      end
    when Encoding::US_ASCII
      true
    when *UNICODE_ENCODINGS
      normalized? string.encode(Encoding::UTF_8), form
    else
      raise Encoding::CompatibilityError, "Unicode Normalization not appropriate for #{encoding}"
    end
  end
end # module
PK!}$[�N<�=�=ruby/getoptlong.rbnu�[���# frozen_string_literal: true
#
# GetoptLong for Ruby
#
# Copyright (C) 1998, 1999, 2000  Motoyuki Kasahara.
#
# You may redistribute and/or modify this library under the same license
# terms as Ruby.
#
# See GetoptLong for documentation.
#
# Additional documents and the latest version of `getoptlong.rb' can be
# found at http://www.sra.co.jp/people/m-kasahr/ruby/getoptlong/

# The GetoptLong class allows you to parse command line options similarly to
# the GNU getopt_long() C library call. Note, however, that GetoptLong is a
# pure Ruby implementation.
#
# GetoptLong allows for POSIX-style options like <tt>--file</tt> as well
# as single letter options like <tt>-f</tt>
#
# The empty option <tt>--</tt> (two minus symbols) is used to end option
# processing. This can be particularly important if options have optional
# arguments.
#
# Here is a simple example of usage:
#
#     require 'getoptlong'
#
#     opts = GetoptLong.new(
#       [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
#       [ '--repeat', '-n', GetoptLong::REQUIRED_ARGUMENT ],
#       [ '--name', GetoptLong::OPTIONAL_ARGUMENT ]
#     )
#
#     dir = nil
#     name = nil
#     repetitions = 1
#     opts.each do |opt, arg|
#       case opt
#         when '--help'
#           puts <<-EOF
#     hello [OPTION] ... DIR
#
#     -h, --help:
#        show help
#
#     --repeat x, -n x:
#        repeat x times
#
#     --name [name]:
#        greet user by name, if name not supplied default is John
#
#     DIR: The directory in which to issue the greeting.
#           EOF
#         when '--repeat'
#           repetitions = arg.to_i
#         when '--name'
#           if arg == ''
#             name = 'John'
#           else
#             name = arg
#           end
#       end
#     end
#
#     if ARGV.length != 1
#       puts "Missing dir argument (try --help)"
#       exit 0
#     end
#
#     dir = ARGV.shift
#
#     Dir.chdir(dir)
#     for i in (1..repetitions)
#       print "Hello"
#       if name
#         print ", #{name}"
#       end
#       puts
#     end
#
# Example command line:
#
#     hello -n 6 --name -- /tmp
#
class GetoptLong
  # Version.
  VERSION = "0.1.1"

  #
  # Orderings.
  #
  ORDERINGS = [REQUIRE_ORDER = 0, PERMUTE = 1, RETURN_IN_ORDER = 2]

  #
  # Argument flags.
  #
  ARGUMENT_FLAGS = [NO_ARGUMENT = 0, REQUIRED_ARGUMENT = 1,
    OPTIONAL_ARGUMENT = 2]

  #
  # Status codes.
  #
  STATUS_YET, STATUS_STARTED, STATUS_TERMINATED = 0, 1, 2

  #
  # Error types.
  #
  class Error  < StandardError; end
  class AmbiguousOption   < Error; end
  class NeedlessArgument < Error; end
  class MissingArgument  < Error; end
  class InvalidOption    < Error; end

  #
  # \Set up option processing.
  #
  # The options to support are passed to new() as an array of arrays.
  # Each sub-array contains any number of String option names which carry
  # the same meaning, and one of the following flags:
  #
  # GetoptLong::NO_ARGUMENT :: Option does not take an argument.
  #
  # GetoptLong::REQUIRED_ARGUMENT :: Option always takes an argument.
  #
  # GetoptLong::OPTIONAL_ARGUMENT :: Option may or may not take an argument.
  #
  # The first option name is considered to be the preferred (canonical) name.
  # Other than that, the elements of each sub-array can be in any order.
  #
  def initialize(*arguments)
    #
    # Current ordering.
    #
    if ENV.include?('POSIXLY_CORRECT')
      @ordering = REQUIRE_ORDER
    else
      @ordering = PERMUTE
    end

    #
    # Hash table of option names.
    # Keys of the table are option names, and their values are canonical
    # names of the options.
    #
    @canonical_names = Hash.new

    #
    # Hash table of argument flags.
    # Keys of the table are option names, and their values are argument
    # flags of the options.
    #
    @argument_flags = Hash.new

    #
    # Whether error messages are output to $stderr.
    #
    @quiet = false

    #
    # Status code.
    #
    @status = STATUS_YET

    #
    # Error code.
    #
    @error = nil

    #
    # Error message.
    #
    @error_message = nil

    #
    # Rest of catenated short options.
    #
    @rest_singles = ''

    #
    # List of non-option-arguments.
    # Append them to ARGV when option processing is terminated.
    #
    @non_option_arguments = Array.new

    if 0 < arguments.length
      set_options(*arguments)
    end
  end

  #
  # \Set the handling of the ordering of options and arguments.
  # A RuntimeError is raised if option processing has already started.
  #
  # The supplied value must be a member of GetoptLong::ORDERINGS. It alters
  # the processing of options as follows:
  #
  # <b>REQUIRE_ORDER</b> :
  #
  # Options are required to occur before non-options.
  #
  # Processing of options ends as soon as a word is encountered that has not
  # been preceded by an appropriate option flag.
  #
  # For example, if -a and -b are options which do not take arguments,
  # parsing command line arguments of '-a one -b two' would result in
  # 'one', '-b', 'two' being left in ARGV, and only ('-a', '') being
  # processed as an option/arg pair.
  #
  # This is the default ordering, if the environment variable
  # POSIXLY_CORRECT is set. (This is for compatibility with GNU getopt_long.)
  #
  # <b>PERMUTE</b> :
  #
  # Options can occur anywhere in the command line parsed. This is the
  # default behavior.
  #
  # Every sequence of words which can be interpreted as an option (with or
  # without argument) is treated as an option; non-option words are skipped.
  #
  # For example, if -a does not require an argument and -b optionally takes
  # an argument, parsing '-a one -b two three' would result in ('-a','') and
  # ('-b', 'two') being processed as option/arg pairs, and 'one','three'
  # being left in ARGV.
  #
  # If the ordering is set to PERMUTE but the environment variable
  # POSIXLY_CORRECT is set, REQUIRE_ORDER is used instead. This is for
  # compatibility with GNU getopt_long.
  #
  # <b>RETURN_IN_ORDER</b> :
  #
  # All words on the command line are processed as options. Words not
  # preceded by a short or long option flag are passed as arguments
  # with an option of '' (empty string).
  #
  # For example, if -a requires an argument but -b does not, a command line
  # of '-a one -b two three' would result in option/arg pairs of ('-a', 'one')
  # ('-b', ''), ('', 'two'), ('', 'three') being processed.
  #
  def ordering=(ordering)
    #
    # The method is failed if option processing has already started.
    #
    if @status != STATUS_YET
      set_error(ArgumentError, "argument error")
      raise RuntimeError,
        "invoke ordering=, but option processing has already started"
    end

    #
    # Check ordering.
    #
    if !ORDERINGS.include?(ordering)
      raise ArgumentError, "invalid ordering `#{ordering}'"
    end
    if ordering == PERMUTE && ENV.include?('POSIXLY_CORRECT')
      @ordering = REQUIRE_ORDER
    else
      @ordering = ordering
    end
  end

  #
  # Return ordering.
  #
  attr_reader :ordering

  #
  # \Set options. Takes the same argument as GetoptLong.new.
  #
  # Raises a RuntimeError if option processing has already started.
  #
  def set_options(*arguments)
    #
    # The method is failed if option processing has already started.
    #
    if @status != STATUS_YET
      raise RuntimeError,
        "invoke set_options, but option processing has already started"
    end

    #
    # Clear tables of option names and argument flags.
    #
    @canonical_names.clear
    @argument_flags.clear

    arguments.each do |arg|
      if !arg.is_a?(Array)
       raise ArgumentError, "the option list contains non-Array argument"
      end

      #
      # Find an argument flag and it set to `argument_flag'.
      #
      argument_flag = nil
      arg.each do |i|
        if ARGUMENT_FLAGS.include?(i)
          if argument_flag != nil
            raise ArgumentError, "too many argument-flags"
          end
          argument_flag = i
        end
      end

      raise ArgumentError, "no argument-flag" if argument_flag == nil

      canonical_name = nil
      arg.each do |i|
        #
        # Check an option name.
        #
        next if i == argument_flag
        begin
          if !i.is_a?(String) || i !~ /\A-([^-]|-.+)\z/
            raise ArgumentError, "an invalid option `#{i}'"
          end
          if (@canonical_names.include?(i))
            raise ArgumentError, "option redefined `#{i}'"
          end
        rescue
          @canonical_names.clear
          @argument_flags.clear
          raise
        end

        #
        # Register the option (`i') to the `@canonical_names' and
        # `@canonical_names' Hashes.
        #
        if canonical_name == nil
          canonical_name = i
        end
        @canonical_names[i] = canonical_name
        @argument_flags[i] = argument_flag
      end
      raise ArgumentError, "no option name" if canonical_name == nil
    end
    return self
  end

  #
  # \Set/Unset `quiet' mode.
  #
  attr_writer :quiet

  #
  # Return the flag of `quiet' mode.
  #
  attr_reader :quiet

  #
  # `quiet?' is an alias of `quiet'.
  #
  alias quiet? quiet

  #
  # Explicitly terminate option processing.
  #
  def terminate
    return nil if @status == STATUS_TERMINATED
    raise RuntimeError, "an error has occurred" if @error != nil

    @status = STATUS_TERMINATED
    @non_option_arguments.reverse_each do |argument|
      ARGV.unshift(argument)
    end

    @canonical_names = nil
    @argument_flags = nil
    @rest_singles = nil
    @non_option_arguments = nil

    return self
  end

  #
  # Returns true if option processing has terminated, false otherwise.
  #
  def terminated?
    return @status == STATUS_TERMINATED
  end

  #
  # \Set an error (a protected method).
  #
  def set_error(type, message)
    $stderr.print("#{$0}: #{message}\n") if !@quiet

    @error = type
    @error_message = message
    @canonical_names = nil
    @argument_flags = nil
    @rest_singles = nil
    @non_option_arguments = nil

    raise type, message
  end
  protected :set_error

  #
  # Examine whether an option processing is failed.
  #
  attr_reader :error

  #
  # `error?' is an alias of `error'.
  #
  alias error? error

  # Return the appropriate error message in POSIX-defined format.
  # If no error has occurred, returns nil.
  #
  def error_message
    return @error_message
  end

  #
  # Get next option name and its argument, as an Array of two elements.
  #
  # The option name is always converted to the first (preferred)
  # name given in the original options to GetoptLong.new.
  #
  # Example: ['--option', 'value']
  #
  # Returns nil if the processing is complete (as determined by
  # STATUS_TERMINATED).
  #
  def get
    option_name, option_argument = nil, ''

    #
    # Check status.
    #
    return nil if @error != nil
    case @status
    when STATUS_YET
      @status = STATUS_STARTED
    when STATUS_TERMINATED
      return nil
    end

    #
    # Get next option argument.
    #
    if 0 < @rest_singles.length
      argument = '-' + @rest_singles
    elsif (ARGV.length == 0)
      terminate
      return nil
    elsif @ordering == PERMUTE
      while 0 < ARGV.length && ARGV[0] !~ /\A-./
        @non_option_arguments.push(ARGV.shift)
      end
      if ARGV.length == 0
        terminate
        return nil
      end
      argument = ARGV.shift
    elsif @ordering == REQUIRE_ORDER
      if (ARGV[0] !~ /\A-./)
        terminate
        return nil
      end
      argument = ARGV.shift
    else
      argument = ARGV.shift
    end

    #
    # Check the special argument `--'.
    # `--' indicates the end of the option list.
    #
    if argument == '--' && @rest_singles.length == 0
      terminate
      return nil
    end

    #
    # Check for long and short options.
    #
    if argument =~ /\A(--[^=]+)/ && @rest_singles.length == 0
      #
      # This is a long style option, which start with `--'.
      #
      pattern = $1
      if @canonical_names.include?(pattern)
        option_name = pattern
      else
        #
        # The option `option_name' is not registered in `@canonical_names'.
        # It may be an abbreviated.
        #
        matches = []
        @canonical_names.each_key do |key|
          if key.index(pattern) == 0
            option_name = key
            matches << key
          end
        end
        if 2 <= matches.length
          set_error(AmbiguousOption, "option `#{argument}' is ambiguous between #{matches.join(', ')}")
        elsif matches.length == 0
          set_error(InvalidOption, "unrecognized option `#{argument}'")
        end
      end

      #
      # Check an argument to the option.
      #
      if @argument_flags[option_name] == REQUIRED_ARGUMENT
        if argument =~ /=(.*)/m
          option_argument = $1
        elsif 0 < ARGV.length
          option_argument = ARGV.shift
        else
          set_error(MissingArgument,
                    "option `#{argument}' requires an argument")
        end
      elsif @argument_flags[option_name] == OPTIONAL_ARGUMENT
        if argument =~ /=(.*)/m
          option_argument = $1
        elsif 0 < ARGV.length && ARGV[0] !~ /\A-./
          option_argument = ARGV.shift
        else
          option_argument = ''
        end
      elsif argument =~ /=(.*)/m
        set_error(NeedlessArgument,
                  "option `#{option_name}' doesn't allow an argument")
      end

    elsif argument =~ /\A(-(.))(.*)/m
      #
      # This is a short style option, which start with `-' (not `--').
      # Short options may be catenated (e.g. `-l -g' is equivalent to
      # `-lg').
      #
      option_name, ch, @rest_singles = $1, $2, $3

      if @canonical_names.include?(option_name)
        #
        # The option `option_name' is found in `@canonical_names'.
        # Check its argument.
        #
        if @argument_flags[option_name] == REQUIRED_ARGUMENT
          if 0 < @rest_singles.length
            option_argument = @rest_singles
            @rest_singles = ''
          elsif 0 < ARGV.length
            option_argument = ARGV.shift
          else
            # 1003.2 specifies the format of this message.
            set_error(MissingArgument, "option requires an argument -- #{ch}")
          end
        elsif @argument_flags[option_name] == OPTIONAL_ARGUMENT
          if 0 < @rest_singles.length
            option_argument = @rest_singles
            @rest_singles = ''
          elsif 0 < ARGV.length && ARGV[0] !~ /\A-./
            option_argument = ARGV.shift
          else
            option_argument = ''
          end
        end
      else
        #
        # This is an invalid option.
        # 1003.2 specifies the format of this message.
        #
        if ENV.include?('POSIXLY_CORRECT')
          set_error(InvalidOption, "invalid option -- #{ch}")
        else
          set_error(InvalidOption, "invalid option -- #{ch}")
        end
      end
    else
      #
      # This is a non-option argument.
      # Only RETURN_IN_ORDER fell into here.
      #
      return '', argument
    end

    return @canonical_names[option_name], option_argument
  end

  #
  # `get_option' is an alias of `get'.
  #
  alias get_option get

  # Iterator version of `get'.
  #
  # The block is called repeatedly with two arguments:
  # The first is the option name.
  # The second is the argument which followed it (if any).
  # Example: ('--opt', 'value')
  #
  # The option name is always converted to the first (preferred)
  # name given in the original options to GetoptLong.new.
  #
  def each
    loop do
      option_name, option_argument = get_option
      break if option_name == nil
      yield option_name, option_argument
    end
  end

  #
  # `each_option' is an alias of `each'.
  #
  alias each_option each
end
PK!}$[�+�RRruby/singleton.rbnu�[���# frozen_string_literal: false

# The Singleton module implements the Singleton pattern.
#
# == Usage
#
# To use Singleton, include the module in your class.
#
#    class Klass
#       include Singleton
#       # ...
#    end
#
# This ensures that only one instance of Klass can be created.
#
#      a,b = Klass.instance, Klass.instance
#
#      a == b
#      # => true
#
#      Klass.new
#      # => NoMethodError - new is private ...
#
# The instance is created at upon the first call of Klass.instance().
#
#      class OtherKlass
#        include Singleton
#        # ...
#      end
#
#      ObjectSpace.each_object(OtherKlass){}
#      # => 0
#
#      OtherKlass.instance
#      ObjectSpace.each_object(OtherKlass){}
#      # => 1
#
#
# This behavior is preserved under inheritance and cloning.
#
# == Implementation
#
# This above is achieved by:
#
# *  Making Klass.new and Klass.allocate private.
#
# *  Overriding Klass.inherited(sub_klass) and Klass.clone() to ensure that the
#    Singleton properties are kept when inherited and cloned.
#
# *  Providing the Klass.instance() method that returns the same object each
#    time it is called.
#
# *  Overriding Klass._load(str) to call Klass.instance().
#
# *  Overriding Klass#clone and Klass#dup to raise TypeErrors to prevent
#    cloning or duping.
#
# == Singleton and Marshal
#
# By default Singleton's #_dump(depth) returns the empty string. Marshalling by
# default will strip state information, e.g. instance variables from the instance.
# Classes using Singleton can provide custom _load(str) and _dump(depth) methods
# to retain some of the previous state of the instance.
#
#    require 'singleton'
#
#    class Example
#      include Singleton
#      attr_accessor :keep, :strip
#      def _dump(depth)
#        # this strips the @strip information from the instance
#        Marshal.dump(@keep, depth)
#      end
#
#      def self._load(str)
#        instance.keep = Marshal.load(str)
#        instance
#      end
#    end
#
#    a = Example.instance
#    a.keep = "keep this"
#    a.strip = "get rid of this"
#
#    stored_state = Marshal.dump(a)
#
#    a.keep = nil
#    a.strip = nil
#    b = Marshal.load(stored_state)
#    p a == b  #  => true
#    p a.keep  #  => "keep this"
#    p a.strip #  => nil
#
module Singleton
  VERSION = "0.1.1"

  # Raises a TypeError to prevent cloning.
  def clone
    raise TypeError, "can't clone instance of singleton #{self.class}"
  end

  # Raises a TypeError to prevent duping.
  def dup
    raise TypeError, "can't dup instance of singleton #{self.class}"
  end

  # By default, do not retain any state when marshalling.
  def _dump(depth = -1)
    ''
  end

  module SingletonClassMethods # :nodoc:

    def clone # :nodoc:
      Singleton.__init__(super)
    end

    # By default calls instance(). Override to retain singleton state.
    def _load(str)
      instance
    end

    def instance # :nodoc:
      return @singleton__instance__ if @singleton__instance__
      @singleton__mutex__.synchronize {
        return @singleton__instance__ if @singleton__instance__
        @singleton__instance__ = new()
      }
      @singleton__instance__
    end

    private

    def inherited(sub_klass)
      super
      Singleton.__init__(sub_klass)
    end
  end

  class << Singleton # :nodoc:
    def __init__(klass) # :nodoc:
      klass.instance_eval {
        @singleton__instance__ = nil
        @singleton__mutex__ = Thread::Mutex.new
      }
      klass
    end

    private

    # extending an object with Singleton is a bad idea
    undef_method :extend_object

    def append_features(mod)
      #  help out people counting on transitive mixins
      unless mod.instance_of?(Class)
        raise TypeError, "Inclusion of the OO-Singleton module in module #{mod}"
      end
      super
    end

    def included(klass)
      super
      klass.private_class_method :new, :allocate
      klass.extend SingletonClassMethods
      Singleton.__init__(klass)
    end
  end

  ##
  # :singleton-method: _load
  #  By default calls instance(). Override to retain singleton state.

  ##
  # :singleton-method: instance
  #  Returns the singleton instance.
end
PK!}$[_x�[�.�.ruby/delegate.rbnu�[���# frozen_string_literal: true
# = delegate -- Support for the Delegation Pattern
#
# Documentation by James Edward Gray II and Gavin Sinclair

##
# This library provides three different ways to delegate method calls to an
# object.  The easiest to use is SimpleDelegator.  Pass an object to the
# constructor and all methods supported by the object will be delegated.  This
# object can be changed later.
#
# Going a step further, the top level DelegateClass method allows you to easily
# setup delegation through class inheritance.  This is considerably more
# flexible and thus probably the most common use for this library.
#
# Finally, if you need full control over the delegation scheme, you can inherit
# from the abstract class Delegator and customize as needed.  (If you find
# yourself needing this control, have a look at Forwardable which is also in
# the standard library.  It may suit your needs better.)
#
# SimpleDelegator's implementation serves as a nice example of the use of
# Delegator:
#
#   require 'delegate'
#
#   class SimpleDelegator < Delegator
#     def __getobj__
#       @delegate_sd_obj # return object we are delegating to, required
#     end
#
#     def __setobj__(obj)
#       @delegate_sd_obj = obj # change delegation object,
#                              # a feature we're providing
#     end
#   end
#
# == Notes
#
# Be advised, RDoc will not detect delegated methods.
#
class Delegator < BasicObject
  VERSION = "0.2.0"

  kernel = ::Kernel.dup
  kernel.class_eval do
    alias __raise__ raise
    [:to_s, :inspect, :=~, :!~, :===, :<=>, :hash].each do |m|
      undef_method m
    end
    private_instance_methods.each do |m|
      if /\Ablock_given\?\z|\Aiterator\?\z|\A__.*__\z/ =~ m
        next
      end
      undef_method m
    end
  end
  include kernel

  # :stopdoc:
  def self.const_missing(n)
    ::Object.const_get(n)
  end
  # :startdoc:

  ##
  # :method: raise
  # Use #__raise__ if your Delegator does not have a object to delegate the
  # #raise method call.
  #

  #
  # Pass in the _obj_ to delegate method calls to.  All methods supported by
  # _obj_ will be delegated to.
  #
  def initialize(obj)
    __setobj__(obj)
  end

  #
  # Handles the magic of delegation through \_\_getobj\_\_.
  #
  ruby2_keywords def method_missing(m, *args, &block)
    r = true
    target = self.__getobj__ {r = false}

    if r && target_respond_to?(target, m, false)
      target.__send__(m, *args, &block)
    elsif ::Kernel.method_defined?(m) || ::Kernel.private_method_defined?(m)
      ::Kernel.instance_method(m).bind_call(self, *args, &block)
    else
      super(m, *args, &block)
    end
  end

  #
  # Checks for a method provided by this the delegate object by forwarding the
  # call through \_\_getobj\_\_.
  #
  def respond_to_missing?(m, include_private)
    r = true
    target = self.__getobj__ {r = false}
    r &&= target_respond_to?(target, m, include_private)
    if r && include_private && !target_respond_to?(target, m, false)
      warn "delegator does not forward private method \##{m}", uplevel: 3
      return false
    end
    r
  end

  KERNEL_RESPOND_TO = ::Kernel.instance_method(:respond_to?)
  private_constant :KERNEL_RESPOND_TO

  # Handle BasicObject instances
  private def target_respond_to?(target, m, include_private)
    case target
    when Object
      target.respond_to?(m, include_private)
    else
      if KERNEL_RESPOND_TO.bind_call(target, :respond_to?)
        target.respond_to?(m, include_private)
      else
        KERNEL_RESPOND_TO.bind_call(target, m, include_private)
      end
    end
  end

  #
  # Returns the methods available to this delegate object as the union
  # of this object's and \_\_getobj\_\_ methods.
  #
  def methods(all=true)
    __getobj__.methods(all) | super
  end

  #
  # Returns the methods available to this delegate object as the union
  # of this object's and \_\_getobj\_\_ public methods.
  #
  def public_methods(all=true)
    __getobj__.public_methods(all) | super
  end

  #
  # Returns the methods available to this delegate object as the union
  # of this object's and \_\_getobj\_\_ protected methods.
  #
  def protected_methods(all=true)
    __getobj__.protected_methods(all) | super
  end

  # Note: no need to specialize private_methods, since they are not forwarded

  #
  # Returns true if two objects are considered of equal value.
  #
  def ==(obj)
    return true if obj.equal?(self)
    self.__getobj__ == obj
  end

  #
  # Returns true if two objects are not considered of equal value.
  #
  def !=(obj)
    return false if obj.equal?(self)
    __getobj__ != obj
  end

  #
  # Returns true if two objects are considered of equal value.
  #
  def eql?(obj)
    return true if obj.equal?(self)
    obj.eql?(__getobj__)
  end

  #
  # Delegates ! to the \_\_getobj\_\_
  #
  def !
    !__getobj__
  end

  #
  # This method must be overridden by subclasses and should return the object
  # method calls are being delegated to.
  #
  def __getobj__
    __raise__ ::NotImplementedError, "need to define `__getobj__'"
  end

  #
  # This method must be overridden by subclasses and change the object delegate
  # to _obj_.
  #
  def __setobj__(obj)
    __raise__ ::NotImplementedError, "need to define `__setobj__'"
  end

  #
  # Serialization support for the object returned by \_\_getobj\_\_.
  #
  def marshal_dump
    ivars = instance_variables.reject {|var| /\A@delegate_/ =~ var}
    [
      :__v2__,
      ivars, ivars.map {|var| instance_variable_get(var)},
      __getobj__
    ]
  end

  #
  # Reinitializes delegation from a serialized object.
  #
  def marshal_load(data)
    version, vars, values, obj = data
    if version == :__v2__
      vars.each_with_index {|var, i| instance_variable_set(var, values[i])}
      __setobj__(obj)
    else
      __setobj__(data)
    end
  end

  def initialize_clone(obj, freeze: nil) # :nodoc:
    self.__setobj__(obj.__getobj__.clone(freeze: freeze))
  end
  def initialize_dup(obj) # :nodoc:
    self.__setobj__(obj.__getobj__.dup)
  end
  private :initialize_clone, :initialize_dup

  ##
  # :method: freeze
  # Freeze both the object returned by \_\_getobj\_\_ and self.
  #
  def freeze
    __getobj__.freeze
    super()
  end

  @delegator_api = self.public_instance_methods
  def self.public_api # :nodoc:
    @delegator_api
  end
end

##
# A concrete implementation of Delegator, this class provides the means to
# delegate all supported method calls to the object passed into the constructor
# and even to change the object being delegated to at a later time with
# #__setobj__.
#
#   class User
#     def born_on
#       Date.new(1989, 9, 10)
#     end
#   end
#
#   require 'delegate'
#
#   class UserDecorator < SimpleDelegator
#     def birth_year
#       born_on.year
#     end
#   end
#
#   decorated_user = UserDecorator.new(User.new)
#   decorated_user.birth_year  #=> 1989
#   decorated_user.__getobj__  #=> #<User: ...>
#
# A SimpleDelegator instance can take advantage of the fact that SimpleDelegator
# is a subclass of +Delegator+ to call <tt>super</tt> to have methods called on
# the object being delegated to.
#
#   class SuperArray < SimpleDelegator
#     def [](*args)
#       super + 1
#     end
#   end
#
#   SuperArray.new([1])[0]  #=> 2
#
# Here's a simple example that takes advantage of the fact that
# SimpleDelegator's delegation object can be changed at any time.
#
#   class Stats
#     def initialize
#       @source = SimpleDelegator.new([])
#     end
#
#     def stats(records)
#       @source.__setobj__(records)
#
#       "Elements:  #{@source.size}\n" +
#       " Non-Nil:  #{@source.compact.size}\n" +
#       "  Unique:  #{@source.uniq.size}\n"
#     end
#   end
#
#   s = Stats.new
#   puts s.stats(%w{James Edward Gray II})
#   puts
#   puts s.stats([1, 2, 3, nil, 4, 5, 1, 2])
#
# Prints:
#
#   Elements:  4
#    Non-Nil:  4
#     Unique:  4
#
#   Elements:  8
#    Non-Nil:  7
#     Unique:  6
#
class SimpleDelegator < Delegator
  # Returns the current object method calls are being delegated to.
  def __getobj__
    unless defined?(@delegate_sd_obj)
      return yield if block_given?
      __raise__ ::ArgumentError, "not delegated"
    end
    @delegate_sd_obj
  end

  #
  # Changes the delegate object to _obj_.
  #
  # It's important to note that this does *not* cause SimpleDelegator's methods
  # to change.  Because of this, you probably only want to change delegation
  # to objects of the same type as the original delegate.
  #
  # Here's an example of changing the delegation object.
  #
  #   names = SimpleDelegator.new(%w{James Edward Gray II})
  #   puts names[1]    # => Edward
  #   names.__setobj__(%w{Gavin Sinclair})
  #   puts names[1]    # => Sinclair
  #
  def __setobj__(obj)
    __raise__ ::ArgumentError, "cannot delegate to self" if self.equal?(obj)
    @delegate_sd_obj = obj
  end
end

def Delegator.delegating_block(mid) # :nodoc:
  lambda do |*args, &block|
    target = self.__getobj__
    target.__send__(mid, *args, &block)
  end.ruby2_keywords
end

#
# The primary interface to this library.  Use to setup delegation when defining
# your class.
#
#   class MyClass < DelegateClass(ClassToDelegateTo) # Step 1
#     def initialize
#       super(obj_of_ClassToDelegateTo)              # Step 2
#     end
#   end
#
# or:
#
#   MyClass = DelegateClass(ClassToDelegateTo) do    # Step 1
#     def initialize
#       super(obj_of_ClassToDelegateTo)              # Step 2
#     end
#   end
#
# Here's a sample of use from Tempfile which is really a File object with a
# few special rules about storage location and when the File should be
# deleted.  That makes for an almost textbook perfect example of how to use
# delegation.
#
#   class Tempfile < DelegateClass(File)
#     # constant and class member data initialization...
#
#     def initialize(basename, tmpdir=Dir::tmpdir)
#       # build up file path/name in var tmpname...
#
#       @tmpfile = File.open(tmpname, File::RDWR|File::CREAT|File::EXCL, 0600)
#
#       # ...
#
#       super(@tmpfile)
#
#       # below this point, all methods of File are supported...
#     end
#
#     # ...
#   end
#
def DelegateClass(superclass, &block)
  klass = Class.new(Delegator)
  ignores = [*::Delegator.public_api, :to_s, :inspect, :=~, :!~, :===]
  protected_instance_methods = superclass.protected_instance_methods
  protected_instance_methods -= ignores
  public_instance_methods = superclass.public_instance_methods
  public_instance_methods -= ignores
  klass.module_eval do
    def __getobj__ # :nodoc:
      unless defined?(@delegate_dc_obj)
        return yield if block_given?
        __raise__ ::ArgumentError, "not delegated"
      end
      @delegate_dc_obj
    end
    def __setobj__(obj)  # :nodoc:
      __raise__ ::ArgumentError, "cannot delegate to self" if self.equal?(obj)
      @delegate_dc_obj = obj
    end
    protected_instance_methods.each do |method|
      define_method(method, Delegator.delegating_block(method))
      protected method
    end
    public_instance_methods.each do |method|
      define_method(method, Delegator.delegating_block(method))
    end
  end
  klass.define_singleton_method :public_instance_methods do |all=true|
    super(all) | superclass.public_instance_methods
  end
  klass.define_singleton_method :protected_instance_methods do |all=true|
    super(all) | superclass.protected_instance_methods
  end
  klass.define_singleton_method :instance_methods do |all=true|
    super(all) | superclass.instance_methods
  end
  klass.define_singleton_method :public_instance_method do |name|
    super(name)
  rescue NameError
    raise unless self.public_instance_methods.include?(name)
    superclass.public_instance_method(name)
  end
  klass.define_singleton_method :instance_method do |name|
    super(name)
  rescue NameError
    raise unless self.instance_methods.include?(name)
    superclass.instance_method(name)
  end
  klass.module_eval(&block) if block
  return klass
end
PK!}$[gems/gems/json-2.6.1/lib/jsonnuȯ��PK!}$[�"�22ruby/drb.rbnu�[���# frozen_string_literal: false
require 'drb/drb'

PK!}$[T��..ruby/error_highlight/version.rbnu�[���module ErrorHighlight
  VERSION = "0.3.0"
end
PK!}$[
�1S1S1ruby/error_highlight/base.rbnu�[���require_relative "version"

module ErrorHighlight
  # Identify the code fragment that seems associated with a given error
  #
  # Arguments:
  #  node: RubyVM::AbstractSyntaxTree::Node (script_lines should be enabled)
  #  point_type: :name | :args
  #  name: The name associated with the NameError/NoMethodError
  #
  # Returns:
  #  {
  #    first_lineno: Integer,
  #    first_column: Integer,
  #    last_lineno: Integer,
  #    last_column: Integer,
  #    snippet: String,
  #  } | nil
  def self.spot(...)
    Spotter.new(...).spot
  end

  class Spotter
    class NonAscii < Exception; end
    private_constant :NonAscii

    def initialize(node, point_type: :name, name: nil)
      @node = node
      @point_type = point_type
      @name = name

      # Not-implemented-yet options
      @arg = nil # Specify the index or keyword at which argument caused the TypeError/ArgumentError
      @multiline = false # Allow multiline spot

      @fetch = -> (lineno, last_lineno = lineno) do
        snippet = @node.script_lines[lineno - 1 .. last_lineno - 1].join("")
        snippet += "\n" unless snippet.end_with?("\n")

        # It require some work to support Unicode (or multibyte) characters.
        # Tentatively, we stop highlighting if the code snippet has non-ascii characters.
        # See https://github.com/ruby/error_highlight/issues/4
        raise NonAscii unless snippet.ascii_only?

        snippet
      end
    end

    def spot
      return nil unless @node

      case @node.type

      when :CALL, :QCALL
        case @point_type
        when :name
          spot_call_for_name
        when :args
          spot_call_for_args
        end

      when :ATTRASGN
        case @point_type
        when :name
          spot_attrasgn_for_name
        when :args
          spot_attrasgn_for_args
        end

      when :OPCALL
        case @point_type
        when :name
          spot_opcall_for_name
        when :args
          spot_opcall_for_args
        end

      when :FCALL
        case @point_type
        when :name
          spot_fcall_for_name
        when :args
          spot_fcall_for_args
        end

      when :VCALL
        spot_vcall

      when :OP_ASGN1
        case @point_type
        when :name
          spot_op_asgn1_for_name
        when :args
          spot_op_asgn1_for_args
        end

      when :OP_ASGN2
        case @point_type
        when :name
          spot_op_asgn2_for_name
        when :args
          spot_op_asgn2_for_args
        end

      when :CONST
        spot_vcall

      when :COLON2
        spot_colon2

      when :COLON3
        spot_vcall

      when :OP_CDECL
        spot_op_cdecl
      end

      if @snippet && @beg_column && @end_column && @beg_column < @end_column
        return {
          first_lineno: @beg_lineno,
          first_column: @beg_column,
          last_lineno: @end_lineno,
          last_column: @end_column,
          snippet: @snippet,
        }
      else
        return nil
      end

    rescue NonAscii
      nil
    end

    private

    # Example:
    #   x.foo
    #    ^^^^
    #   x.foo(42)
    #    ^^^^
    #   x&.foo
    #    ^^^^^
    #   x[42]
    #    ^^^^
    #   x += 1
    #     ^
    def spot_call_for_name
      nd_recv, mid, nd_args = @node.children
      lineno = nd_recv.last_lineno
      lines = @fetch[lineno, @node.last_lineno]
      if mid == :[] && lines.match(/\G[\s)]*(\[(?:\s*\])?)/, nd_recv.last_column)
        @beg_column = $~.begin(1)
        @snippet = lines[/.*\n/]
        @beg_lineno = @end_lineno = lineno
        if nd_args
          if nd_recv.last_lineno == nd_args.last_lineno && @snippet.match(/\s*\]/, nd_args.last_column)
            @end_column = $~.end(0)
          end
        else
          if lines.match(/\G[\s)]*?\[\s*\]/, nd_recv.last_column)
            @end_column = $~.end(0)
          end
        end
      elsif lines.match(/\G[\s)]*?(\&?\.)(\s*?)(#{ Regexp.quote(mid) }).*\n/, nd_recv.last_column)
        lines = $` + $&
        @beg_column = $~.begin($2.include?("\n") ? 3 : 1)
        @end_column = $~.end(3)
        if i = lines[..@beg_column].rindex("\n")
          @beg_lineno = @end_lineno = lineno + lines[..@beg_column].count("\n")
          @snippet = lines[i + 1..]
          @beg_column -= i + 1
          @end_column -= i + 1
        else
          @snippet = lines
          @beg_lineno = @end_lineno = lineno
        end
      elsif mid.to_s =~ /\A\W+\z/ && lines.match(/\G\s*(#{ Regexp.quote(mid) })=.*\n/, nd_recv.last_column)
        @snippet = $` + $&
        @beg_column = $~.begin(1)
        @end_column = $~.end(1)
      end
    end

    # Example:
    #   x.foo(42)
    #         ^^
    #   x[42]
    #     ^^
    #   x += 1
    #        ^
    def spot_call_for_args
      _nd_recv, _mid, nd_args = @node.children
      if nd_args && nd_args.first_lineno == nd_args.last_lineno
        fetch_line(nd_args.first_lineno)
        @beg_column = nd_args.first_column
        @end_column = nd_args.last_column
      end
      # TODO: support @arg
    end

    # Example:
    #   x.foo = 1
    #    ^^^^^^
    #   x[42] = 1
    #    ^^^^^^
    def spot_attrasgn_for_name
      nd_recv, mid, nd_args = @node.children
      *nd_args, _nd_last_arg, _nil = nd_args.children
      fetch_line(nd_recv.last_lineno)
      if mid == :[]= && @snippet.match(/\G[\s)]*(\[)/, nd_recv.last_column)
        @beg_column = $~.begin(1)
        args_last_column = $~.end(0)
        if nd_args.last && nd_recv.last_lineno == nd_args.last.last_lineno
          args_last_column = nd_args.last.last_column
        end
        if @snippet.match(/[\s)]*\]\s*=/, args_last_column)
          @end_column = $~.end(0)
        end
      elsif @snippet.match(/\G[\s)]*(\.\s*#{ Regexp.quote(mid.to_s.sub(/=\z/, "")) }\s*=)/, nd_recv.last_column)
        @beg_column = $~.begin(1)
        @end_column = $~.end(1)
      end
    end

    # Example:
    #   x.foo = 1
    #           ^
    #   x[42] = 1
    #     ^^^^^^^
    #   x[] = 1
    #     ^^^^^
    def spot_attrasgn_for_args
      nd_recv, mid, nd_args = @node.children
      fetch_line(nd_recv.last_lineno)
      if mid == :[]= && @snippet.match(/\G[\s)]*\[/, nd_recv.last_column)
        @beg_column = $~.end(0)
        if nd_recv.last_lineno == nd_args.last_lineno
          @end_column = nd_args.last_column
        end
      elsif nd_args && nd_args.first_lineno == nd_args.last_lineno
        @beg_column = nd_args.first_column
        @end_column = nd_args.last_column
      end
      # TODO: support @arg
    end

    # Example:
    #   x + 1
    #     ^
    #   +x
    #   ^
    def spot_opcall_for_name
      nd_recv, op, nd_arg = @node.children
      fetch_line(nd_recv.last_lineno)
      if nd_arg
        # binary operator
        if @snippet.match(/\G[\s)]*(#{ Regexp.quote(op) })/, nd_recv.last_column)
          @beg_column = $~.begin(1)
          @end_column = $~.end(1)
        end
      else
        # unary operator
        if @snippet[...nd_recv.first_column].match(/(#{ Regexp.quote(op.to_s.sub(/@\z/, "")) })\s*\(?\s*\z/)
          @beg_column = $~.begin(1)
          @end_column = $~.end(1)
        end
      end
    end

    # Example:
    #   x + 1
    #       ^
    def spot_opcall_for_args
      _nd_recv, _op, nd_arg = @node.children
      if nd_arg && nd_arg.first_lineno == nd_arg.last_lineno
        # binary operator
        fetch_line(nd_arg.first_lineno)
        @beg_column = nd_arg.first_column
        @end_column = nd_arg.last_column
      end
    end

    # Example:
    #   foo(42)
    #   ^^^
    #   foo 42
    #   ^^^
    def spot_fcall_for_name
      mid, _nd_args = @node.children
      fetch_line(@node.first_lineno)
      if @snippet.match(/(#{ Regexp.quote(mid) })/, @node.first_column)
        @beg_column = $~.begin(1)
        @end_column = $~.end(1)
      end
    end

    # Example:
    #   foo(42)
    #       ^^
    #   foo 42
    #       ^^
    def spot_fcall_for_args
      _mid, nd_args = @node.children
      if nd_args && nd_args.first_lineno == nd_args.last_lineno
        # binary operator
        fetch_line(nd_args.first_lineno)
        @beg_column = nd_args.first_column
        @end_column = nd_args.last_column
      end
    end

    # Example:
    #   foo
    #   ^^^
    def spot_vcall
      if @node.first_lineno == @node.last_lineno
        fetch_line(@node.last_lineno)
        @beg_column = @node.first_column
        @end_column = @node.last_column
      end
    end

    # Example:
    #   x[1] += 42
    #    ^^^    (for [])
    #   x[1] += 42
    #        ^  (for +)
    #   x[1] += 42
    #    ^^^^^^ (for []=)
    def spot_op_asgn1_for_name
      nd_recv, op, nd_args, _nd_rhs = @node.children
      fetch_line(nd_recv.last_lineno)
      if @snippet.match(/\G[\s)]*(\[)/, nd_recv.last_column)
        bracket_beg_column = $~.begin(1)
        args_last_column = $~.end(0)
        if nd_args && nd_recv.last_lineno == nd_args.last_lineno
          args_last_column = nd_args.last_column
        end
        if @snippet.match(/\s*\](\s*)(#{ Regexp.quote(op) })=()/, args_last_column)
          case @name
          when :[], :[]=
            @beg_column = bracket_beg_column
            @end_column = $~.begin(@name == :[] ? 1 : 3)
          when op
            @beg_column = $~.begin(2)
            @end_column = $~.end(2)
          end
        end
      end
    end

    # Example:
    #   x[1] += 42
    #     ^^^^^^^^
    def spot_op_asgn1_for_args
      nd_recv, mid, nd_args, nd_rhs = @node.children
      fetch_line(nd_recv.last_lineno)
      if mid == :[]= && @snippet.match(/\G\s*\[/, nd_recv.last_column)
        @beg_column = $~.end(0)
        if nd_recv.last_lineno == nd_rhs.last_lineno
          @end_column = nd_rhs.last_column
        end
      elsif nd_args && nd_args.first_lineno == nd_rhs.last_lineno
        @beg_column = nd_args.first_column
        @end_column = nd_rhs.last_column
      end
      # TODO: support @arg
    end

    # Example:
    #   x.foo += 42
    #    ^^^     (for foo)
    #   x.foo += 42
    #         ^  (for +)
    #   x.foo += 42
    #    ^^^^^^^ (for foo=)
    def spot_op_asgn2_for_name
      nd_recv, _qcall, attr, op, _nd_rhs = @node.children
      fetch_line(nd_recv.last_lineno)
      if @snippet.match(/\G[\s)]*(\.)\s*#{ Regexp.quote(attr) }()\s*(#{ Regexp.quote(op) })(=)/, nd_recv.last_column)
        case @name
        when attr
          @beg_column = $~.begin(1)
          @end_column = $~.begin(2)
        when op
          @beg_column = $~.begin(3)
          @end_column = $~.end(3)
        when :"#{ attr }="
          @beg_column = $~.begin(1)
          @end_column = $~.end(4)
        end
      end
    end

    # Example:
    #   x.foo += 42
    #            ^^
    def spot_op_asgn2_for_args
      _nd_recv, _qcall, _attr, _op, nd_rhs = @node.children
      if nd_rhs.first_lineno == nd_rhs.last_lineno
        fetch_line(nd_rhs.first_lineno)
        @beg_column = nd_rhs.first_column
        @end_column = nd_rhs.last_column
      end
    end

    # Example:
    #   Foo::Bar
    #      ^^^^^
    def spot_colon2
      nd_parent, const = @node.children
      if nd_parent.last_lineno == @node.last_lineno
        fetch_line(nd_parent.last_lineno)
        @beg_column = nd_parent.last_column
        @end_column = @node.last_column
      else
        @snippet = @fetch[@node.last_lineno]
        if @snippet[...@node.last_column].match(/#{ Regexp.quote(const) }\z/)
          @beg_column = $~.begin(0)
          @end_column = $~.end(0)
        end
      end
    end

    # Example:
    #   Foo::Bar += 1
    #      ^^^^^^^^
    def spot_op_cdecl
      nd_lhs, op, _nd_rhs = @node.children
      *nd_parent_lhs, _const = nd_lhs.children
      if @name == op
        @snippet = @fetch[nd_lhs.last_lineno]
        if @snippet.match(/\G\s*(#{ Regexp.quote(op) })=/, nd_lhs.last_column)
          @beg_column = $~.begin(1)
          @end_column = $~.end(1)
        end
      else
        # constant access error
        @end_column = nd_lhs.last_column
        if nd_parent_lhs.empty? # example: ::C += 1
          if nd_lhs.first_lineno == nd_lhs.last_lineno
            @snippet = @fetch[nd_lhs.last_lineno]
            @beg_column = nd_lhs.first_column
          end
        else # example: Foo::Bar::C += 1
          if nd_parent_lhs.last.last_lineno == nd_lhs.last_lineno
            @snippet = @fetch[nd_lhs.last_lineno]
            @beg_column = nd_parent_lhs.last.last_column
          end
        end
      end
    end

    def fetch_line(lineno)
      @beg_lineno = @end_lineno = lineno
      @snippet = @fetch[lineno]
    end
  end

  private_constant :Spotter
end
PK!}$[�V�~~!ruby/error_highlight/formatter.rbnu�[���module ErrorHighlight
  class DefaultFormatter
    def self.message_for(spot)
      # currently only a one-line code snippet is supported
      if spot[:first_lineno] == spot[:last_lineno]
        indent = spot[:snippet][0...spot[:first_column]].gsub(/[^\t]/, " ")
        marker = indent + "^" * (spot[:last_column] - spot[:first_column])

        "\n\n#{ spot[:snippet] }#{ marker }"
      else
        ""
      end
    end
  end

  def self.formatter
    Ractor.current[:__error_highlight_formatter__] || DefaultFormatter
  end

  def self.formatter=(formatter)
    Ractor.current[:__error_highlight_formatter__] = formatter
  end
end
PK!}$[�o�P%% ruby/error_highlight/core_ext.rbnu�[���require_relative "formatter"

module ErrorHighlight
  module CoreExt
    # This is a marker to let `DidYouMean::Correctable#original_message` skip
    # the following method definition of `to_s`.
    # See https://github.com/ruby/did_you_mean/pull/152
    SKIP_TO_S_FOR_SUPER_LOOKUP = true
    private_constant :SKIP_TO_S_FOR_SUPER_LOOKUP

    def to_s
      msg = super.dup

      locs = backtrace_locations
      return msg unless locs

      loc = locs.first
      begin
        node = RubyVM::AbstractSyntaxTree.of(loc, keep_script_lines: true)
        opts = {}

        case self
        when NoMethodError, NameError
          opts[:point_type] = :name
          opts[:name] = name
        when TypeError, ArgumentError
          opts[:point_type] = :args
        end

        spot = ErrorHighlight.spot(node, **opts)

      rescue SyntaxError
      rescue SystemCallError # file not found or something
      rescue ArgumentError   # eval'ed code
      end

      if spot
        points = ErrorHighlight.formatter.message_for(spot)
        msg << points if !msg.include?(points)
      end

      msg
    end
  end

  NameError.prepend(CoreExt)

  # The extension for TypeError/ArgumentError is temporarily disabled due to many test failures

  #TypeError.prepend(CoreExt)
  #ArgumentError.prepend(CoreExt)
end
PK!}$[ĵ�\\ruby/erb/version.rbnu�[���# frozen_string_literal: true
class ERB
  VERSION = '2.2.3'
  private_constant :VERSION
end
PK!}$[Eۢ;��ruby/readline.rbnu�[���begin
  require 'readline.so'
rescue LoadError
  require 'reline' unless defined? Reline
  Object.send(:remove_const, :Readline) if Object.const_defined?(:Readline)
  Readline = Reline
end
PK!}$[�4����ruby/objspace/trace.rbnu�[���# This is a simple tool to enable the object allocation tracer.
# When you have an object of unknown provenance, you can use this
# to investigate where the object in question is created.
#
# = Important notice
#
# This is only for debugging purpose. Do not use this in production.
# Require'ing this file immediately starts tracing the object allocation,
# which brings a large performance overhead.
#
# = Usage
#
# 1. Add `require "objspace/trace"` into your code (or add `-robjspace/trace` into the command line)
# 2. `p obj` will show the allocation site of `obj`
#
# Note: This redefines `Kernel#p` method, but not `Object#inspect`.
#
# = Examples
#
#   1: require "objspace/trace"
#   2:
#   3: obj = "str"
#   4:
#   5: p obj  #=> "str" @ test.rb:3

require 'objspace.so'

module Kernel
  remove_method :p
  define_method(:p) do |*objs|
    objs.each do |obj|
      file = ObjectSpace.allocation_sourcefile(obj)
      line = ObjectSpace.allocation_sourceline(obj)
      if file
        puts "#{ obj.inspect } @ #{ file }:#{ line }"
      else
        puts obj.inspect
      end
    end
  end
end

ObjectSpace.trace_object_allocations_start

warn "objspace/trace is enabled"
PK!}$[�7TTruby/error_highlight.rbnu�[���require_relative "error_highlight/base"
require_relative "error_highlight/core_ext"
PK!}$[�"F��
�
ruby/objspace.rbnu�[���# frozen_string_literal: true

require 'objspace.so'

module ObjectSpace
  class << self
    private :_dump
    private :_dump_all
  end

  module_function

  # call-seq:
  #   ObjectSpace.dump(obj[, output: :string]) # => "{ ... }"
  #   ObjectSpace.dump(obj, output: :file)     # => #<File:/tmp/rubyobj20131125-88733-1xkfmpv.json>
  #   ObjectSpace.dump(obj, output: :stdout)   # => nil
  #
  # Dump the contents of a ruby object as JSON.
  #
  # This method is only expected to work with C Ruby.
  # This is an experimental method and is subject to change.
  # In particular, the function signature and output format are
  # not guaranteed to be compatible in future versions of ruby.
  def dump(obj, output: :string)
    out = case output
    when :file, nil
      require 'tempfile'
      Tempfile.create(%w(rubyobj .json))
    when :stdout
      STDOUT
    when :string
      +''
    when IO
      output
    else
      raise ArgumentError, "wrong output option: #{output.inspect}"
    end

    ret = _dump(obj, out)
    return nil if output == :stdout
    ret
  end


  #  call-seq:
  #    ObjectSpace.dump_all([output: :file]) # => #<File:/tmp/rubyheap20131125-88469-laoj3v.json>
  #    ObjectSpace.dump_all(output: :stdout) # => nil
  #    ObjectSpace.dump_all(output: :string) # => "{...}\n{...}\n..."
  #    ObjectSpace.dump_all(output:
  #      File.open('heap.json','w'))         # => #<File:heap.json>
  #    ObjectSpace.dump_all(output: :string,
  #      since: 42)                          # => "{...}\n{...}\n..."
  #
  #  Dump the contents of the ruby heap as JSON.
  #
  #  _since_ must be a non-negative integer or +nil+.
  #
  #  If _since_ is a positive integer, only objects of that generation and
  #  newer generations are dumped. The current generation can be accessed using
  #  GC::count.
  #
  #  Objects that were allocated without object allocation tracing enabled
  #  are ignored. See ::trace_object_allocations for more information and
  #  examples.
  #
  #  If _since_ is omitted or is +nil+, all objects are dumped.
  #
  #  This method is only expected to work with C Ruby.
  #  This is an experimental method and is subject to change.
  #  In particular, the function signature and output format are
  #  not guaranteed to be compatible in future versions of ruby.
  def dump_all(output: :file, full: false, since: nil)
    out = case output
    when :file, nil
      require 'tempfile'
      Tempfile.create(%w(rubyheap .json))
    when :stdout
      STDOUT
    when :string
      +''
    when IO
      output
    else
      raise ArgumentError, "wrong output option: #{output.inspect}"
    end

    ret = _dump_all(out, full, since)
    return nil if output == :stdout
    ret
  end
end
PK!}$[3�V��r�rruby/erb.rbnu�[���# -*- coding: us-ascii -*-
# frozen_string_literal: true
# = ERB -- Ruby Templating
#
# Author:: Masatoshi SEKI
# Documentation:: James Edward Gray II, Gavin Sinclair, and Simon Chiang
#
# See ERB for primary documentation and ERB::Util for a couple of utility
# routines.
#
# Copyright (c) 1999-2000,2002,2003 Masatoshi SEKI
#
# You can redistribute it and/or modify it under the same terms as Ruby.

require 'cgi/util'
require 'erb/version'

#
# = ERB -- Ruby Templating
#
# == Introduction
#
# 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.
#
# A very simple example is this:
#
#   require 'erb'
#
#   x = 42
#   template = ERB.new <<-EOF
#     The value of x is: <%= x %>
#   EOF
#   puts template.result(binding)
#
# <em>Prints:</em> The value of x is: 42
#
# More complex examples are given below.
#
#
# == Recognized Tags
#
# ERB recognizes certain tags in the provided template and converts them based
# on the rules below:
#
#   <% Ruby code -- inline with output %>
#   <%= Ruby expression -- replace with result %>
#   <%# comment -- ignored -- useful in testing %> (`<% #` doesn't work. Don't use Ruby comments.)
#   % a line of Ruby code -- treated as <% line %> (optional -- see ERB.new)
#   %% replaced with % if first thing on a line and % processing is used
#   <%% or %%> -- replace with <% or %> respectively
#
# All other text is passed through ERB filtering unchanged.
#
#
# == Options
#
# There are several settings you can change when you use ERB:
# * the nature of the tags that are recognized;
# * the binding used to resolve local variables in the template.
#
# See the ERB.new and ERB#result methods for more detail.
#
# == Character encodings
#
# ERB (or Ruby code generated by ERB) 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.
#
#   # -*- coding: utf-8 -*-
#   require 'erb'
#
#   template = ERB.new <<EOF
#   <%#-*- coding: Big5 -*-%>
#     \_\_ENCODING\_\_ is <%= \_\_ENCODING\_\_ %>.
#   EOF
#   puts template.result
#
# <em>Prints:</em> \_\_ENCODING\_\_ is Big5.
#
#
# == Examples
#
# === Plain Text
#
# ERB is useful for any generic templating situation.  Note that in this example, we use the
# convenient "% at start of line" tag, and we quote the template literally with
# <tt>%q{...}</tt> to avoid trouble with the backslash.
#
#   require "erb"
#
#   # Create template.
#   template = %q{
#     From:  James Edward Gray II <james@grayproductions.net>
#     To:  <%= to %>
#     Subject:  Addressing Needs
#
#     <%= to[/\w+/] %>:
#
#     Just wanted to send a quick note assuring that your needs are being
#     addressed.
#
#     I want you to know that my team will keep working on the issues,
#     especially:
#
#     <%# ignore numerous minor requests -- focus on priorities %>
#     % priorities.each do |priority|
#       * <%= priority %>
#     % end
#
#     Thanks for your patience.
#
#     James Edward Gray II
#   }.gsub(/^  /, '')
#
#   message = ERB.new(template, trim_mode: "%<>")
#
#   # Set up template data.
#   to = "Community Spokesman <spokesman@ruby_community.org>"
#   priorities = [ "Run Ruby Quiz",
#                  "Document Modules",
#                  "Answer Questions on Ruby Talk" ]
#
#   # Produce result.
#   email = message.result
#   puts email
#
# <i>Generates:</i>
#
#   From:  James Edward Gray II <james@grayproductions.net>
#   To:  Community Spokesman <spokesman@ruby_community.org>
#   Subject:  Addressing Needs
#
#   Community:
#
#   Just wanted to send a quick note assuring that your needs are being addressed.
#
#   I want you to know that my team will keep working on the issues, especially:
#
#       * Run Ruby Quiz
#       * Document Modules
#       * Answer Questions on Ruby Talk
#
#   Thanks for your patience.
#
#   James Edward Gray II
#
# === Ruby in HTML
#
# ERB is often used in <tt>.rhtml</tt> files (HTML with embedded Ruby).  Notice the need in
# this example to provide a special binding when the template is run, so that the instance
# variables in the Product object can be resolved.
#
#   require "erb"
#
#   # Build template data class.
#   class Product
#     def initialize( code, name, desc, cost )
#       @code = code
#       @name = name
#       @desc = desc
#       @cost = cost
#
#       @features = [ ]
#     end
#
#     def add_feature( feature )
#       @features << feature
#     end
#
#     # Support templating of member data.
#     def get_binding
#       binding
#     end
#
#     # ...
#   end
#
#   # Create template.
#   template = %{
#     <html>
#       <head><title>Ruby Toys -- <%= @name %></title></head>
#       <body>
#
#         <h1><%= @name %> (<%= @code %>)</h1>
#         <p><%= @desc %></p>
#
#         <ul>
#           <% @features.each do |f| %>
#             <li><b><%= f %></b></li>
#           <% end %>
#         </ul>
#
#         <p>
#           <% if @cost < 10 %>
#             <b>Only <%= @cost %>!!!</b>
#           <% else %>
#              Call for a price, today!
#           <% end %>
#         </p>
#
#       </body>
#     </html>
#   }.gsub(/^  /, '')
#
#   rhtml = ERB.new(template)
#
#   # Set up template data.
#   toy = Product.new( "TZ-1002",
#                      "Rubysapien",
#                      "Geek's Best Friend!  Responds to Ruby commands...",
#                      999.95 )
#   toy.add_feature("Listens for verbal commands in the Ruby language!")
#   toy.add_feature("Ignores Perl, Java, and all C variants.")
#   toy.add_feature("Karate-Chop Action!!!")
#   toy.add_feature("Matz signature on left leg.")
#   toy.add_feature("Gem studded eyes... Rubies, of course!")
#
#   # Produce result.
#   rhtml.run(toy.get_binding)
#
# <i>Generates (some blank lines removed):</i>
#
#    <html>
#      <head><title>Ruby Toys -- Rubysapien</title></head>
#      <body>
#
#        <h1>Rubysapien (TZ-1002)</h1>
#        <p>Geek's Best Friend!  Responds to Ruby commands...</p>
#
#        <ul>
#            <li><b>Listens for verbal commands in the Ruby language!</b></li>
#            <li><b>Ignores Perl, Java, and all C variants.</b></li>
#            <li><b>Karate-Chop Action!!!</b></li>
#            <li><b>Matz signature on left leg.</b></li>
#            <li><b>Gem studded eyes... Rubies, of course!</b></li>
#        </ul>
#
#        <p>
#             Call for a price, today!
#        </p>
#
#      </body>
#    </html>
#
#
# == Notes
#
# There are a variety of templating solutions available in various Ruby projects.
# For example, RDoc, distributed with Ruby, uses its own template engine, which
# can be reused elsewhere.
#
# Other popular engines could be found in the corresponding
# {Category}[https://www.ruby-toolbox.com/categories/template_engines] of
# The Ruby Toolbox.
#
class ERB
  Revision = '$Date::                           $' # :nodoc: #'
  deprecate_constant :Revision

  # Returns revision information for the erb.rb module.
  def self.version
    VERSION
  end
end

#--
# ERB::Compiler
class ERB
  # = ERB::Compiler
  #
  # Compiles ERB templates into Ruby code; the compiled code produces the
  # template result when evaluated. ERB::Compiler provides hooks to define how
  # generated output is handled.
  #
  # Internally ERB does something like this to generate the code returned by
  # ERB#src:
  #
  #   compiler = ERB::Compiler.new('<>')
  #   compiler.pre_cmd    = ["_erbout=+''"]
  #   compiler.put_cmd    = "_erbout.<<"
  #   compiler.insert_cmd = "_erbout.<<"
  #   compiler.post_cmd   = ["_erbout"]
  #
  #   code, enc = compiler.compile("Got <%= obj %>!\n")
  #   puts code
  #
  # <i>Generates</i>:
  #
  #   #coding:UTF-8
  #   _erbout=+''; _erbout.<< "Got ".freeze; _erbout.<<(( obj ).to_s); _erbout.<< "!\n".freeze; _erbout
  #
  # By default the output is sent to the print method.  For example:
  #
  #   compiler = ERB::Compiler.new('<>')
  #   code, enc = compiler.compile("Got <%= obj %>!\n")
  #   puts code
  #
  # <i>Generates</i>:
  #
  #   #coding:UTF-8
  #   print "Got ".freeze; print(( obj ).to_s); print "!\n".freeze
  #
  # == Evaluation
  #
  # The compiled code can be used in any context where the names in the code
  # correctly resolve. Using the last example, each of these print 'Got It!'
  #
  # Evaluate using a variable:
  #
  #   obj = 'It'
  #   eval code
  #
  # Evaluate using an input:
  #
  #   mod = Module.new
  #   mod.module_eval %{
  #     def get(obj)
  #       #{code}
  #     end
  #   }
  #   extend mod
  #   get('It')
  #
  # Evaluate using an accessor:
  #
  #   klass = Class.new Object
  #   klass.class_eval %{
  #     attr_accessor :obj
  #     def initialize(obj)
  #       @obj = obj
  #     end
  #     def get_it
  #       #{code}
  #     end
  #   }
  #   klass.new('It').get_it
  #
  # Good! See also ERB#def_method, ERB#def_module, and ERB#def_class.
  class Compiler # :nodoc:
    class PercentLine # :nodoc:
      def initialize(str)
        @value = str
      end
      attr_reader :value
      alias :to_s :value
    end

    class Scanner # :nodoc:
      @scanner_map = {}
      class << self
        def register_scanner(klass, trim_mode, percent)
          @scanner_map[[trim_mode, percent]] = klass
        end
        alias :regist_scanner :register_scanner
      end

      def self.default_scanner=(klass)
        @default_scanner = klass
      end

      def self.make_scanner(src, trim_mode, percent)
        klass = @scanner_map.fetch([trim_mode, percent], @default_scanner)
        klass.new(src, trim_mode, percent)
      end

      DEFAULT_STAGS = %w(<%% <%= <%# <%).freeze
      DEFAULT_ETAGS = %w(%%> %>).freeze
      def initialize(src, trim_mode, percent)
        @src = src
        @stag = nil
        @stags = DEFAULT_STAGS
        @etags = DEFAULT_ETAGS
      end
      attr_accessor :stag
      attr_reader :stags, :etags

      def scan; end
    end

    class TrimScanner < Scanner # :nodoc:
      def initialize(src, trim_mode, percent)
        super
        @trim_mode = trim_mode
        @percent = percent
        if @trim_mode == '>'
          @scan_reg  = /(.*?)(%>\r?\n|#{(stags + etags).join('|')}|\n|\z)/m
          @scan_line = self.method(:trim_line1)
        elsif @trim_mode == '<>'
          @scan_reg  = /(.*?)(%>\r?\n|#{(stags + etags).join('|')}|\n|\z)/m
          @scan_line = self.method(:trim_line2)
        elsif @trim_mode == '-'
          @scan_reg  = /(.*?)(^[ \t]*<%\-|<%\-|-%>\r?\n|-%>|#{(stags + etags).join('|')}|\z)/m
          @scan_line = self.method(:explicit_trim_line)
        else
          @scan_reg  = /(.*?)(#{(stags + etags).join('|')}|\n|\z)/m
          @scan_line = self.method(:scan_line)
        end
      end

      def scan(&block)
        @stag = nil
        if @percent
          @src.each_line do |line|
            percent_line(line, &block)
          end
        else
          @scan_line.call(@src, &block)
        end
        nil
      end

      def percent_line(line, &block)
        if @stag || line[0] != ?%
          return @scan_line.call(line, &block)
        end

        line[0] = ''
        if line[0] == ?%
          @scan_line.call(line, &block)
        else
          yield(PercentLine.new(line.chomp))
        end
      end

      def scan_line(line)
        line.scan(@scan_reg) do |tokens|
          tokens.each do |token|
            next if token.empty?
            yield(token)
          end
        end
      end

      def trim_line1(line)
        line.scan(@scan_reg) do |tokens|
          tokens.each do |token|
            next if token.empty?
            if token == "%>\n" || token == "%>\r\n"
              yield('%>')
              yield(:cr)
            else
              yield(token)
            end
          end
        end
      end

      def trim_line2(line)
        head = nil
        line.scan(@scan_reg) do |tokens|
          tokens.each do |token|
            next if token.empty?
            head = token unless head
            if token == "%>\n" || token == "%>\r\n"
              yield('%>')
              if is_erb_stag?(head)
                yield(:cr)
              else
                yield("\n")
              end
              head = nil
            else
              yield(token)
              head = nil if token == "\n"
            end
          end
        end
      end

      def explicit_trim_line(line)
        line.scan(@scan_reg) do |tokens|
          tokens.each do |token|
            next if token.empty?
            if @stag.nil? && /[ \t]*<%-/ =~ token
              yield('<%')
            elsif @stag && (token == "-%>\n" || token == "-%>\r\n")
              yield('%>')
              yield(:cr)
            elsif @stag && token == '-%>'
              yield('%>')
            else
              yield(token)
            end
          end
        end
      end

      ERB_STAG = %w(<%= <%# <%)
      def is_erb_stag?(s)
        ERB_STAG.member?(s)
      end
    end

    Scanner.default_scanner = TrimScanner

    begin
      require 'strscan'
    rescue LoadError
    else
      class SimpleScanner < Scanner # :nodoc:
        def scan
          stag_reg = (stags == DEFAULT_STAGS) ? /(.*?)(<%[%=#]?|\z)/m : /(.*?)(#{stags.join('|')}|\z)/m
          etag_reg = (etags == DEFAULT_ETAGS) ? /(.*?)(%%?>|\z)/m : /(.*?)(#{etags.join('|')}|\z)/m
          scanner = StringScanner.new(@src)
          while ! scanner.eos?
            scanner.scan(@stag ? etag_reg : stag_reg)
            yield(scanner[1])
            yield(scanner[2])
          end
        end
      end
      Scanner.register_scanner(SimpleScanner, nil, false)

      class ExplicitScanner < Scanner # :nodoc:
        def scan
          stag_reg = /(.*?)(^[ \t]*<%-|<%-|#{stags.join('|')}|\z)/m
          etag_reg = /(.*?)(-%>|#{etags.join('|')}|\z)/m
          scanner = StringScanner.new(@src)
          while ! scanner.eos?
            scanner.scan(@stag ? etag_reg : stag_reg)
            yield(scanner[1])

            elem = scanner[2]
            if /[ \t]*<%-/ =~ elem
              yield('<%')
            elsif elem == '-%>'
              yield('%>')
              yield(:cr) if scanner.scan(/(\r?\n|\z)/)
            else
              yield(elem)
            end
          end
        end
      end
      Scanner.register_scanner(ExplicitScanner, '-', false)
    end

    class Buffer # :nodoc:
      def initialize(compiler, enc=nil, frozen=nil)
        @compiler = compiler
        @line = []
        @script = +''
        @script << "#coding:#{enc}\n" if enc
        @script << "#frozen-string-literal:#{frozen}\n" unless frozen.nil?
        @compiler.pre_cmd.each do |x|
          push(x)
        end
      end
      attr_reader :script

      def push(cmd)
        @line << cmd
      end

      def cr
        @script << (@line.join('; '))
        @line = []
        @script << "\n"
      end

      def close
        return unless @line
        @compiler.post_cmd.each do |x|
          push(x)
        end
        @script << (@line.join('; '))
        @line = nil
      end
    end

    def add_put_cmd(out, content)
      out.push("#{@put_cmd} #{content.dump}.freeze#{"\n" * content.count("\n")}")
    end

    def add_insert_cmd(out, content)
      out.push("#{@insert_cmd}((#{content}).to_s)")
    end

    # Compiles an ERB template into Ruby code.  Returns an array of the code
    # and encoding like ["code", Encoding].
    def compile(s)
      enc = s.encoding
      raise ArgumentError, "#{enc} is not ASCII compatible" if enc.dummy?
      s = s.b # see String#b
      magic_comment = detect_magic_comment(s, enc)
      out = Buffer.new(self, *magic_comment)

      self.content = +''
      scanner = make_scanner(s)
      scanner.scan do |token|
        next if token.nil?
        next if token == ''
        if scanner.stag.nil?
          compile_stag(token, out, scanner)
        else
          compile_etag(token, out, scanner)
        end
      end
      add_put_cmd(out, content) if content.size > 0
      out.close
      return out.script, *magic_comment
    end

    def compile_stag(stag, out, scanner)
      case stag
      when PercentLine
        add_put_cmd(out, content) if content.size > 0
        self.content = +''
        out.push(stag.to_s)
        out.cr
      when :cr
        out.cr
      when '<%', '<%=', '<%#'
        scanner.stag = stag
        add_put_cmd(out, content) if content.size > 0
        self.content = +''
      when "\n"
        content << "\n"
        add_put_cmd(out, content)
        self.content = +''
      when '<%%'
        content << '<%'
      else
        content << stag
      end
    end

    def compile_etag(etag, out, scanner)
      case etag
      when '%>'
        compile_content(scanner.stag, out)
        scanner.stag = nil
        self.content = +''
      when '%%>'
        content << '%>'
      else
        content << etag
      end
    end

    def compile_content(stag, out)
      case stag
      when '<%'
        if content[-1] == ?\n
          content.chop!
          out.push(content)
          out.cr
        else
          out.push(content)
        end
      when '<%='
        add_insert_cmd(out, content)
      when '<%#'
        # commented out
      end
    end

    def prepare_trim_mode(mode) # :nodoc:
      case mode
      when 1
        return [false, '>']
      when 2
        return [false, '<>']
      when 0, nil
        return [false, nil]
      when String
        unless mode.match?(/\A(%|-|>|<>){1,2}\z/)
          warn_invalid_trim_mode(mode, uplevel: 5)
        end

        perc = mode.include?('%')
        if mode.include?('-')
          return [perc, '-']
        elsif mode.include?('<>')
          return [perc, '<>']
        elsif mode.include?('>')
          return [perc, '>']
        else
          [perc, nil]
        end
      else
        warn_invalid_trim_mode(mode, uplevel: 5)
        return [false, nil]
      end
    end

    def make_scanner(src) # :nodoc:
      Scanner.make_scanner(src, @trim_mode, @percent)
    end

    # Construct a new compiler using the trim_mode. See ERB::new for available
    # trim modes.
    def initialize(trim_mode)
      @percent, @trim_mode = prepare_trim_mode(trim_mode)
      @put_cmd = 'print'
      @insert_cmd = @put_cmd
      @pre_cmd = []
      @post_cmd = []
    end
    attr_reader :percent, :trim_mode

    # The command to handle text that ends with a newline
    attr_accessor :put_cmd

    # The command to handle text that is inserted prior to a newline
    attr_accessor :insert_cmd

    # An array of commands prepended to compiled code
    attr_accessor :pre_cmd

    # An array of commands appended to compiled code
    attr_accessor :post_cmd

    private

    # A buffered text in #compile
    attr_accessor :content

    def detect_magic_comment(s, enc = nil)
      re = @percent ? /\G(?:<%#(.*)%>|%#(.*)\n)/ : /\G<%#(.*)%>/
      frozen = nil
      s.scan(re) do
        comment = $+
        comment = $1 if comment[/-\*-\s*(.*?)\s*-*-$/]
        case comment
        when %r"coding\s*[=:]\s*([[:alnum:]\-_]+)"
          enc = Encoding.find($1.sub(/-(?:mac|dos|unix)/i, ''))
        when %r"frozen[-_]string[-_]literal\s*:\s*([[:alnum:]]+)"
          frozen = $1
        end
      end
      return enc, frozen
    end

    def warn_invalid_trim_mode(mode, uplevel:)
      warn "Invalid ERB trim mode: #{mode.inspect} (trim_mode: nil, 0, 1, 2, or String composed of '%' and/or '-', '>', '<>')", uplevel: uplevel + 1
    end
  end
end

#--
# ERB
class ERB
  #
  # Constructs a new ERB object with the template specified in _str_.
  #
  # An ERB object works by building a chunk of Ruby code that will output
  # the completed template when run.
  #
  # If _trim_mode_ is passed a String containing one or more of the following
  # modifiers, ERB will adjust its code generation as listed:
  #
  #     %  enables Ruby code processing for lines beginning with %
  #     <> omit newline for lines starting with <% and ending in %>
  #     >  omit newline for lines ending in %>
  #     -  omit blank lines ending in -%>
  #
  # _eoutvar_ can be used to set the name of the variable ERB will build up
  # its output in.  This is useful when you need to run multiple ERB
  # templates through the same binding and/or when you want to control where
  # output ends up.  Pass the name of the variable to be used inside a String.
  #
  # === Example
  #
  #  require "erb"
  #
  #  # build data class
  #  class Listings
  #    PRODUCT = { :name => "Chicken Fried Steak",
  #                :desc => "A well messages pattie, breaded and fried.",
  #                :cost => 9.95 }
  #
  #    attr_reader :product, :price
  #
  #    def initialize( product = "", price = "" )
  #      @product = product
  #      @price = price
  #    end
  #
  #    def build
  #      b = binding
  #      # create and run templates, filling member data variables
  #      ERB.new(<<-'END_PRODUCT'.gsub(/^\s+/, ""), trim_mode: "", eoutvar: "@product").result b
  #        <%= PRODUCT[:name] %>
  #        <%= PRODUCT[:desc] %>
  #      END_PRODUCT
  #      ERB.new(<<-'END_PRICE'.gsub(/^\s+/, ""), trim_mode: "", eoutvar: "@price").result b
  #        <%= PRODUCT[:name] %> -- <%= PRODUCT[:cost] %>
  #        <%= PRODUCT[:desc] %>
  #      END_PRICE
  #    end
  #  end
  #
  #  # setup template data
  #  listings = Listings.new
  #  listings.build
  #
  #  puts listings.product + "\n" + listings.price
  #
  # _Generates_
  #
  #  Chicken Fried Steak
  #  A well messages pattie, breaded and fried.
  #
  #  Chicken Fried Steak -- 9.95
  #  A well messages pattie, breaded and fried.
  #
  def initialize(str, safe_level=NOT_GIVEN, legacy_trim_mode=NOT_GIVEN, legacy_eoutvar=NOT_GIVEN, trim_mode: nil, eoutvar: '_erbout')
    # Complex initializer for $SAFE deprecation at [Feature #14256]. Use keyword arguments to pass trim_mode or eoutvar.
    if safe_level != NOT_GIVEN
      warn 'Passing safe_level with the 2nd argument of ERB.new is deprecated. Do not use it, and specify other arguments as keyword arguments.', uplevel: 1
    end
    if legacy_trim_mode != NOT_GIVEN
      warn 'Passing trim_mode with the 3rd argument of ERB.new is deprecated. Use keyword argument like ERB.new(str, trim_mode: ...) instead.', uplevel: 1
      trim_mode = legacy_trim_mode
    end
    if legacy_eoutvar != NOT_GIVEN
      warn 'Passing eoutvar with the 4th argument of ERB.new is deprecated. Use keyword argument like ERB.new(str, eoutvar: ...) instead.', uplevel: 1
      eoutvar = legacy_eoutvar
    end

    compiler = make_compiler(trim_mode)
    set_eoutvar(compiler, eoutvar)
    @src, @encoding, @frozen_string = *compiler.compile(str)
    @filename = nil
    @lineno = 0
    @_init = self.class.singleton_class
  end
  NOT_GIVEN = Object.new
  private_constant :NOT_GIVEN

  ##
  # Creates a new compiler for ERB.  See ERB::Compiler.new for details

  def make_compiler(trim_mode)
    ERB::Compiler.new(trim_mode)
  end

  # The Ruby code generated by ERB
  attr_reader :src

  # The encoding to eval
  attr_reader :encoding

  # The optional _filename_ argument passed to Kernel#eval when the ERB code
  # is run
  attr_accessor :filename

  # The optional _lineno_ argument passed to Kernel#eval when the ERB code
  # is run
  attr_accessor :lineno

  #
  # Sets optional filename and line number that will be used in ERB code
  # evaluation and error reporting. See also #filename= and #lineno=
  #
  #   erb = ERB.new('<%= some_x %>')
  #   erb.render
  #   # undefined local variable or method `some_x'
  #   #   from (erb):1
  #
  #   erb.location = ['file.erb', 3]
  #   # All subsequent error reporting would use new location
  #   erb.render
  #   # undefined local variable or method `some_x'
  #   #   from file.erb:4
  #
  def location=((filename, lineno))
    @filename = filename
    @lineno = lineno if lineno
  end

  #
  # Can be used to set _eoutvar_ as described in ERB::new.  It's probably
  # easier to just use the constructor though, since calling this method
  # requires the setup of an ERB _compiler_ object.
  #
  def set_eoutvar(compiler, eoutvar = '_erbout')
    compiler.put_cmd = "#{eoutvar}.<<"
    compiler.insert_cmd = "#{eoutvar}.<<"
    compiler.pre_cmd = ["#{eoutvar} = +''"]
    compiler.post_cmd = [eoutvar]
  end

  # Generate results and print them. (see ERB#result)
  def run(b=new_toplevel)
    print self.result(b)
  end

  #
  # Executes the generated ERB code to produce a completed template, returning
  # the results of that code.  (See ERB::new for details on how this process
  # can be affected by _safe_level_.)
  #
  # _b_ accepts a Binding object which is used to set the context of
  # code evaluation.
  #
  def result(b=new_toplevel)
    unless @_init.equal?(self.class.singleton_class)
      raise ArgumentError, "not initialized"
    end
    eval(@src, b, (@filename || '(erb)'), @lineno)
  end

  # Render a template on a new toplevel binding with local variables specified
  # by a Hash object.
  def result_with_hash(hash)
    b = new_toplevel(hash.keys)
    hash.each_pair do |key, value|
      b.local_variable_set(key, value)
    end
    result(b)
  end

  ##
  # Returns a new binding each time *near* TOPLEVEL_BINDING for runs that do
  # not specify a binding.

  def new_toplevel(vars = nil)
    b = TOPLEVEL_BINDING
    if vars
      vars = vars.select {|v| b.local_variable_defined?(v)}
      unless vars.empty?
        return b.eval("tap {|;#{vars.join(',')}| break binding}")
      end
    end
    b.dup
  end
  private :new_toplevel

  # Define _methodname_ as instance method of _mod_ from compiled Ruby source.
  #
  # example:
  #   filename = 'example.rhtml'   # 'arg1' and 'arg2' are used in example.rhtml
  #   erb = ERB.new(File.read(filename))
  #   erb.def_method(MyClass, 'render(arg1, arg2)', filename)
  #   print MyClass.new.render('foo', 123)
  def def_method(mod, methodname, fname='(ERB)')
    src = self.src.sub(/^(?!#|$)/) {"def #{methodname}\n"} << "\nend\n"
    mod.module_eval do
      eval(src, binding, fname, -1)
    end
  end

  # Create unnamed module, define _methodname_ as instance method of it, and return it.
  #
  # example:
  #   filename = 'example.rhtml'   # 'arg1' and 'arg2' are used in example.rhtml
  #   erb = ERB.new(File.read(filename))
  #   erb.filename = filename
  #   MyModule = erb.def_module('render(arg1, arg2)')
  #   class MyClass
  #     include MyModule
  #   end
  def def_module(methodname='erb')
    mod = Module.new
    def_method(mod, methodname, @filename || '(ERB)')
    mod
  end

  # Define unnamed class which has _methodname_ as instance method, and return it.
  #
  # example:
  #   class MyClass_
  #     def initialize(arg1, arg2)
  #       @arg1 = arg1;  @arg2 = arg2
  #     end
  #   end
  #   filename = 'example.rhtml'  # @arg1 and @arg2 are used in example.rhtml
  #   erb = ERB.new(File.read(filename))
  #   erb.filename = filename
  #   MyClass = erb.def_class(MyClass_, 'render()')
  #   print MyClass.new('foo', 123).render()
  def def_class(superklass=Object, methodname='result')
    cls = Class.new(superklass)
    def_method(cls, methodname, @filename || '(ERB)')
    cls
  end
end

#--
# ERB::Util
class ERB
  # A utility module for conversion routines, often handy in HTML generation.
  module Util
    public
    #
    # A utility method for escaping HTML tag characters in _s_.
    #
    #   require "erb"
    #   include ERB::Util
    #
    #   puts html_escape("is a > 0 & a < 10?")
    #
    # _Generates_
    #
    #   is a &gt; 0 &amp; a &lt; 10?
    #
    def html_escape(s)
      CGI.escapeHTML(s.to_s)
    end
    alias h html_escape
    module_function :h
    module_function :html_escape

    #
    # A utility method for encoding the String _s_ as a URL.
    #
    #   require "erb"
    #   include ERB::Util
    #
    #   puts url_encode("Programming Ruby:  The Pragmatic Programmer's Guide")
    #
    # _Generates_
    #
    #   Programming%20Ruby%3A%20%20The%20Pragmatic%20Programmer%27s%20Guide
    #
    def url_encode(s)
      s.to_s.b.gsub(/[^a-zA-Z0-9_\-.~]/n) { |m|
        sprintf("%%%02X", m.unpack1("C"))
      }
    end
    alias u url_encode
    module_function :u
    module_function :url_encode
  end
end

#--
# ERB::DefMethod
class ERB
  # Utility module to define eRuby script as instance method.
  #
  # === Example
  #
  # example.rhtml:
  #   <% for item in @items %>
  #   <b><%= item %></b>
  #   <% end %>
  #
  # example.rb:
  #   require 'erb'
  #   class MyClass
  #     extend ERB::DefMethod
  #     def_erb_method('render()', 'example.rhtml')
  #     def initialize(items)
  #       @items = items
  #     end
  #   end
  #   print MyClass.new([10,20,30]).render()
  #
  # result:
  #
  #   <b>10</b>
  #
  #   <b>20</b>
  #
  #   <b>30</b>
  #
  module DefMethod
    public
    # define _methodname_ as instance method of current module, using ERB
    # object or eRuby file
    def def_erb_method(methodname, erb_or_fname)
      if erb_or_fname.kind_of? String
        fname = erb_or_fname
        erb = ERB.new(File.read(fname))
        erb.def_method(self, methodname, fname)
      else
        erb = erb_or_fname
        erb.def_method(self, methodname, erb.filename || '(ERB)')
      end
    end
    module_function :def_erb_method
  end
end
PK!}$[��?;,;,
ruby/un.rbnu�[���# frozen_string_literal: false
#
# = un.rb
#
# Copyright (c) 2003 WATANABE Hirofumi <eban@ruby-lang.org>
#
# This program is free software.
# You can distribute/modify this program under the same terms of Ruby.
#
# == Utilities to replace common UNIX commands in Makefiles etc
#
# == SYNOPSIS
#
#   ruby -run -e cp -- [OPTION] SOURCE DEST
#   ruby -run -e ln -- [OPTION] TARGET LINK_NAME
#   ruby -run -e mv -- [OPTION] SOURCE DEST
#   ruby -run -e rm -- [OPTION] FILE
#   ruby -run -e mkdir -- [OPTION] DIRS
#   ruby -run -e rmdir -- [OPTION] DIRS
#   ruby -run -e install -- [OPTION] SOURCE DEST
#   ruby -run -e chmod -- [OPTION] OCTAL-MODE FILE
#   ruby -run -e touch -- [OPTION] FILE
#   ruby -run -e wait_writable -- [OPTION] FILE
#   ruby -run -e mkmf -- [OPTION] EXTNAME [OPTION]
#   ruby -run -e httpd -- [OPTION] [DocumentRoot]
#   ruby -run -e colorize -- [FILE]
#   ruby -run -e help [COMMAND]

require "fileutils"
require "optparse"

module FileUtils
#  @fileutils_label = ""
  @fileutils_output = $stdout
end

# :nodoc:
def setup(options = "", *long_options)
  caller = caller_locations(1, 1)[0].label
  opt_hash = {}
  argv = []
  OptionParser.new do |o|
    options.scan(/.:?/) do |s|
      opt_name = s.delete(":").intern
      o.on("-" + s.tr(":", " ")) do |val|
        opt_hash[opt_name] = val
      end
    end
    long_options.each do |s|
      opt_name, arg_name = s.split(/(?=[\s=])/, 2)
      opt_name.delete_prefix!('--')
      s = "--#{opt_name.gsub(/([A-Z]+|[a-z])([A-Z])/, '\1-\2').downcase}#{arg_name}"
      puts "#{opt_name}=>#{s}" if $DEBUG
      opt_name = opt_name.intern
      o.on(s) do |val|
        opt_hash[opt_name] = val
      end
    end
    o.on("-v") do opt_hash[:verbose] = true end
    o.on("--help") do
      UN.help([caller])
      exit
    end
    o.order!(ARGV) do |x|
      if /[*?\[{]/ =~ x
        argv.concat(Dir[x])
      else
        argv << x
      end
    end
  end
  yield argv, opt_hash
end

##
# Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY
#
#   ruby -run -e cp -- [OPTION] SOURCE DEST
#
#   -p          preserve file attributes if possible
#   -r          copy recursively
#   -v          verbose
#

def cp
  setup("pr") do |argv, options|
    cmd = "cp"
    cmd += "_r" if options.delete :r
    options[:preserve] = true if options.delete :p
    dest = argv.pop
    argv = argv[0] if argv.size == 1
    FileUtils.__send__ cmd, argv, dest, **options
  end
end

##
# Create a link to the specified TARGET with LINK_NAME.
#
#   ruby -run -e ln -- [OPTION] TARGET LINK_NAME
#
#   -s          make symbolic links instead of hard links
#   -f          remove existing destination files
#   -v          verbose
#

def ln
  setup("sf") do |argv, options|
    cmd = "ln"
    cmd += "_s" if options.delete :s
    options[:force] = true if options.delete :f
    dest = argv.pop
    argv = argv[0] if argv.size == 1
    FileUtils.__send__ cmd, argv, dest, **options
  end
end

##
# Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.
#
#   ruby -run -e mv -- [OPTION] SOURCE DEST
#
#   -v          verbose
#

def mv
  setup do |argv, options|
    dest = argv.pop
    argv = argv[0] if argv.size == 1
    FileUtils.mv argv, dest, **options
  end
end

##
# Remove the FILE
#
#   ruby -run -e rm -- [OPTION] FILE
#
#   -f          ignore nonexistent files
#   -r          remove the contents of directories recursively
#   -v          verbose
#

def rm
  setup("fr") do |argv, options|
    cmd = "rm"
    cmd += "_r" if options.delete :r
    options[:force] = true if options.delete :f
    FileUtils.__send__ cmd, argv, **options
  end
end

##
# Create the DIR, if they do not already exist.
#
#   ruby -run -e mkdir -- [OPTION] DIR
#
#   -p          no error if existing, make parent directories as needed
#   -v          verbose
#

def mkdir
  setup("p") do |argv, options|
    cmd = "mkdir"
    cmd += "_p" if options.delete :p
    FileUtils.__send__ cmd, argv, **options
  end
end

##
# Remove the DIR.
#
#   ruby -run -e rmdir -- [OPTION] DIR
#
#   -p          remove DIRECTORY and its ancestors.
#   -v          verbose
#

def rmdir
  setup("p") do |argv, options|
    options[:parents] = true if options.delete :p
    FileUtils.rmdir argv, **options
  end
end

##
# Copy SOURCE to DEST.
#
#   ruby -run -e install -- [OPTION] SOURCE DEST
#
#   -p          apply access/modification times of SOURCE files to
#               corresponding destination files
#   -m          set permission mode (as in chmod), instead of 0755
#   -o          set owner user id, instead of the current owner
#   -g          set owner group id, instead of the current group
#   -v          verbose
#

def install
  setup("pm:o:g:") do |argv, options|
    (mode = options.delete :m) and options[:mode] = /\A\d/ =~ mode ? mode.oct : mode
    options[:preserve] = true if options.delete :p
    (owner = options.delete :o) and options[:owner] = owner
    (group = options.delete :g) and options[:group] = group
    dest = argv.pop
    argv = argv[0] if argv.size == 1
    FileUtils.install argv, dest, **options
  end
end

##
# Change the mode of each FILE to OCTAL-MODE.
#
#   ruby -run -e chmod -- [OPTION] OCTAL-MODE FILE
#
#   -v          verbose
#

def chmod
  setup do |argv, options|
    mode = argv.shift
    mode = /\A\d/ =~ mode ? mode.oct : mode
    FileUtils.chmod mode, argv, **options
  end
end

##
# Update the access and modification times of each FILE to the current time.
#
#   ruby -run -e touch -- [OPTION] FILE
#
#   -v          verbose
#

def touch
  setup do |argv, options|
    FileUtils.touch argv, **options
  end
end

##
# Wait until the file becomes writable.
#
#   ruby -run -e wait_writable -- [OPTION] FILE
#
#   -n RETRY    count to retry
#   -w SEC      each wait time in seconds
#   -v          verbose
#

def wait_writable
  setup("n:w:v") do |argv, options|
    verbose = options[:verbose]
    n = options[:n] and n = Integer(n)
    wait = (wait = options[:w]) ? Float(wait) : 0.2
    argv.each do |file|
      begin
        open(file, "r+b")
      rescue Errno::ENOENT
        break
      rescue Errno::EACCES => e
        raise if n and (n -= 1) <= 0
        if verbose
          puts e
          STDOUT.flush
        end
        sleep wait
        retry
      end
    end
  end
end

##
# Create makefile using mkmf.
#
#   ruby -run -e mkmf -- [OPTION] EXTNAME [OPTION]
#
#   -d ARGS     run dir_config
#   -h ARGS     run have_header
#   -l ARGS     run have_library
#   -f ARGS     run have_func
#   -v ARGS     run have_var
#   -t ARGS     run have_type
#   -m ARGS     run have_macro
#   -c ARGS     run have_const
#   --vendor    install to vendor_ruby
#

def mkmf
  setup("d:h:l:f:v:t:m:c:", "vendor") do |argv, options|
    require 'mkmf'
    opt = options[:d] and opt.split(/:/).each {|n| dir_config(*n.split(/,/))}
    opt = options[:h] and opt.split(/:/).each {|n| have_header(*n.split(/,/))}
    opt = options[:l] and opt.split(/:/).each {|n| have_library(*n.split(/,/))}
    opt = options[:f] and opt.split(/:/).each {|n| have_func(*n.split(/,/))}
    opt = options[:v] and opt.split(/:/).each {|n| have_var(*n.split(/,/))}
    opt = options[:t] and opt.split(/:/).each {|n| have_type(*n.split(/,/))}
    opt = options[:m] and opt.split(/:/).each {|n| have_macro(*n.split(/,/))}
    opt = options[:c] and opt.split(/:/).each {|n| have_const(*n.split(/,/))}
    $configure_args["--vendor"] = true if options[:vendor]
    create_makefile(*argv)
  end
end

##
# Run WEBrick HTTP server.
#
#   ruby -run -e httpd -- [OPTION] [DocumentRoot]
#
#   --bind-address=ADDR         address to bind
#   --port=NUM                  listening port number
#   --max-clients=MAX           max number of simultaneous clients
#   --temp-dir=DIR              temporary directory
#   --do-not-reverse-lookup     disable reverse lookup
#   --request-timeout=SECOND    request timeout in seconds
#   --http-version=VERSION      HTTP version
#   --server-name=NAME          name of the server host
#   --server-software=NAME      name and version of the server
#   --ssl-certificate=CERT      The SSL certificate file for the server
#   --ssl-private-key=KEY       The SSL private key file for the server certificate
#   -v                          verbose
#

def httpd
  setup("", "BindAddress=ADDR", "Port=PORT", "MaxClients=NUM", "TempDir=DIR",
        "DoNotReverseLookup", "RequestTimeout=SECOND", "HTTPVersion=VERSION",
        "ServerName=NAME", "ServerSoftware=NAME",
        "SSLCertificate=CERT", "SSLPrivateKey=KEY") do
    |argv, options|
    begin
      require 'webrick'
    rescue LoadError
      abort "webrick is not found. You may need to `gem install webrick` to install webrick."
    end
    opt = options[:RequestTimeout] and options[:RequestTimeout] = opt.to_i
    [:Port, :MaxClients].each do |name|
      opt = options[name] and (options[name] = Integer(opt)) rescue nil
    end
    if cert = options[:SSLCertificate]
      key = options[:SSLPrivateKey] or
        raise "--ssl-private-key option must also be given"
      require 'webrick/https'
      options[:SSLEnable] = true
      options[:SSLCertificate] = OpenSSL::X509::Certificate.new(File.read(cert))
      options[:SSLPrivateKey] = OpenSSL::PKey.read(File.read(key))
      options[:Port] ||= 8443   # HTTPS Alternate
    end
    options[:Port] ||= 8080     # HTTP Alternate
    options[:DocumentRoot] = argv.shift || '.'
    s = nil
    options[:StartCallback] = proc {
      logger = s.logger
      logger.info("To access this server, open this URL in a browser:")
      s.listeners.each do |listener|
        if options[:SSLEnable]
          addr = listener.addr
          addr[3] = "127.0.0.1" if addr[3] == "0.0.0.0"
          addr[3] = "::1" if addr[3] == "::"
          logger.info("    https://#{Addrinfo.new(addr).inspect_sockaddr}")
        else
          logger.info("    http://#{listener.connect_address.inspect_sockaddr}")
        end
      end
    }
    s = WEBrick::HTTPServer.new(options)
    shut = proc {s.shutdown}
    siglist = %w"TERM QUIT"
    siglist.concat(%w"HUP INT") if STDIN.tty?
    siglist &= Signal.list.keys
    siglist.each do |sig|
      Signal.trap(sig, shut)
    end
    s.start
  end
end

##
# Colorize ruby code.
#
#   ruby -run -e colorize -- [FILE]
#

def colorize
  begin
    require "irb/color"
  rescue LoadError
    raise "colorize requires irb 1.1.0 or later"
  end
  setup do |argv, |
    if argv.empty?
      puts IRB::Color.colorize_code STDIN.read
      return
    end
    argv.each do |file|
      puts IRB::Color.colorize_code File.read(file)
    end
  end
end

##
# Display help message.
#
#   ruby -run -e help [COMMAND]
#

def help
  setup do |argv,|
    UN.help(argv)
  end
end

module UN # :nodoc:
  module_function
  def help(argv, output: $stdout)
    all = argv.empty?
    cmd = nil
    if all
      store = proc {|msg| output << msg}
    else
      messages = {}
      store = proc {|msg| messages[cmd] = msg}
    end
    open(__FILE__) do |me|
      while me.gets("##\n")
        if help = me.gets("\n\n")
          if all or argv.include?(cmd = help[/^#\s*ruby\s.*-e\s+(\w+)/, 1])
            store[help.gsub(/^# ?/, "")]
            break unless all or argv.size > messages.size
          end
        end
      end
    end
    if messages
      argv.each {|arg| output << messages[arg]}
    end
  end
end
PK!}$[MA���I�Iruby/benchmark.rbnu�[���# frozen_string_literal: true
#--
# benchmark.rb - a performance benchmarking library
#
# $Id$
#
# Created by Gotoken (gotoken@notwork.org).
#
# Documentation by Gotoken (original RD), Lyle Johnson (RDoc conversion), and
# Gavin Sinclair (editing).
#++
#
# == Overview
#
# The Benchmark module provides methods for benchmarking Ruby code, giving
# detailed reports on the time taken for each task.
#

# The Benchmark module provides methods to measure and report the time
# used to execute Ruby code.
#
# * Measure the time to construct the string given by the expression
#   <code>"a"*1_000_000_000</code>:
#
#       require 'benchmark'
#
#       puts Benchmark.measure { "a"*1_000_000_000 }
#
#   On my machine (OSX 10.8.3 on i5 1.7 GHz) this generates:
#
#       0.350000   0.400000   0.750000 (  0.835234)
#
#   This report shows the user CPU time, system CPU time, the sum of
#   the user and system CPU times, and the elapsed real time. The unit
#   of time is seconds.
#
# * Do some experiments sequentially using the #bm method:
#
#       require 'benchmark'
#
#       n = 5000000
#       Benchmark.bm do |x|
#         x.report { for i in 1..n; a = "1"; end }
#         x.report { n.times do   ; a = "1"; end }
#         x.report { 1.upto(n) do ; a = "1"; end }
#       end
#
#   The result:
#
#              user     system      total        real
#          1.010000   0.000000   1.010000 (  1.014479)
#          1.000000   0.000000   1.000000 (  0.998261)
#          0.980000   0.000000   0.980000 (  0.981335)
#
# * Continuing the previous example, put a label in each report:
#
#       require 'benchmark'
#
#       n = 5000000
#       Benchmark.bm(7) do |x|
#         x.report("for:")   { for i in 1..n; a = "1"; end }
#         x.report("times:") { n.times do   ; a = "1"; end }
#         x.report("upto:")  { 1.upto(n) do ; a = "1"; end }
#       end
#
# The result:
#
#                     user     system      total        real
#       for:      1.010000   0.000000   1.010000 (  1.015688)
#       times:    1.000000   0.000000   1.000000 (  1.003611)
#       upto:     1.030000   0.000000   1.030000 (  1.028098)
#
# * The times for some benchmarks depend on the order in which items
#   are run.  These differences are due to the cost of memory
#   allocation and garbage collection. To avoid these discrepancies,
#   the #bmbm method is provided.  For example, to compare ways to
#   sort an array of floats:
#
#       require 'benchmark'
#
#       array = (1..1000000).map { rand }
#
#       Benchmark.bmbm do |x|
#         x.report("sort!") { array.dup.sort! }
#         x.report("sort")  { array.dup.sort  }
#       end
#
#   The result:
#
#        Rehearsal -----------------------------------------
#        sort!   1.490000   0.010000   1.500000 (  1.490520)
#        sort    1.460000   0.000000   1.460000 (  1.463025)
#        -------------------------------- total: 2.960000sec
#
#                    user     system      total        real
#        sort!   1.460000   0.000000   1.460000 (  1.460465)
#        sort    1.450000   0.010000   1.460000 (  1.448327)
#
# * Report statistics of sequential experiments with unique labels,
#   using the #benchmark method:
#
#       require 'benchmark'
#       include Benchmark         # we need the CAPTION and FORMAT constants
#
#       n = 5000000
#       Benchmark.benchmark(CAPTION, 7, FORMAT, ">total:", ">avg:") do |x|
#         tf = x.report("for:")   { for i in 1..n; a = "1"; end }
#         tt = x.report("times:") { n.times do   ; a = "1"; end }
#         tu = x.report("upto:")  { 1.upto(n) do ; a = "1"; end }
#         [tf+tt+tu, (tf+tt+tu)/3]
#       end
#
#   The result:
#
#                     user     system      total        real
#        for:      0.950000   0.000000   0.950000 (  0.952039)
#        times:    0.980000   0.000000   0.980000 (  0.984938)
#        upto:     0.950000   0.000000   0.950000 (  0.946787)
#        >total:   2.880000   0.000000   2.880000 (  2.883764)
#        >avg:     0.960000   0.000000   0.960000 (  0.961255)

module Benchmark

  BENCHMARK_VERSION = "2002-04-25" # :nodoc:

  # Invokes the block with a Benchmark::Report object, which
  # may be used to collect and report on the results of individual
  # benchmark tests. Reserves +label_width+ leading spaces for
  # labels on each line. Prints +caption+ at the top of the
  # report, and uses +format+ to format each line.
  # (Note: +caption+ must contain a terminating newline character,
  # see the default Benchmark::Tms::CAPTION for an example.)
  #
  # Returns an array of Benchmark::Tms objects.
  #
  # If the block returns an array of
  # Benchmark::Tms objects, these will be used to format
  # additional lines of output. If +labels+ parameter are
  # given, these are used to label these extra lines.
  #
  # _Note_: Other methods provide a simpler interface to this one, and are
  # suitable for nearly all benchmarking requirements.  See the examples in
  # Benchmark, and the #bm and #bmbm methods.
  #
  # Example:
  #
  #     require 'benchmark'
  #     include Benchmark          # we need the CAPTION and FORMAT constants
  #
  #     n = 5000000
  #     Benchmark.benchmark(CAPTION, 7, FORMAT, ">total:", ">avg:") do |x|
  #       tf = x.report("for:")   { for i in 1..n; a = "1"; end }
  #       tt = x.report("times:") { n.times do   ; a = "1"; end }
  #       tu = x.report("upto:")  { 1.upto(n) do ; a = "1"; end }
  #       [tf+tt+tu, (tf+tt+tu)/3]
  #     end
  #
  # Generates:
  #
  #                     user     system      total        real
  #       for:      0.970000   0.000000   0.970000 (  0.970493)
  #       times:    0.990000   0.000000   0.990000 (  0.989542)
  #       upto:     0.970000   0.000000   0.970000 (  0.972854)
  #       >total:   2.930000   0.000000   2.930000 (  2.932889)
  #       >avg:     0.976667   0.000000   0.976667 (  0.977630)
  #

  def benchmark(caption = "", label_width = nil, format = nil, *labels) # :yield: report
    sync = $stdout.sync
    $stdout.sync = true
    label_width ||= 0
    label_width += 1
    format ||= FORMAT
    print ' '*label_width + caption unless caption.empty?
    report = Report.new(label_width, format)
    results = yield(report)
    Array === results and results.grep(Tms).each {|t|
      print((labels.shift || t.label || "").ljust(label_width), t.format(format))
    }
    report.list
  ensure
    $stdout.sync = sync unless sync.nil?
  end


  # A simple interface to the #benchmark method, #bm generates sequential
  # reports with labels. +label_width+ and +labels+ parameters have the same
  # meaning as for #benchmark.
  #
  #     require 'benchmark'
  #
  #     n = 5000000
  #     Benchmark.bm(7) do |x|
  #       x.report("for:")   { for i in 1..n; a = "1"; end }
  #       x.report("times:") { n.times do   ; a = "1"; end }
  #       x.report("upto:")  { 1.upto(n) do ; a = "1"; end }
  #     end
  #
  # Generates:
  #
  #                     user     system      total        real
  #       for:      0.960000   0.000000   0.960000 (  0.957966)
  #       times:    0.960000   0.000000   0.960000 (  0.960423)
  #       upto:     0.950000   0.000000   0.950000 (  0.954864)
  #

  def bm(label_width = 0, *labels, &blk) # :yield: report
    benchmark(CAPTION, label_width, FORMAT, *labels, &blk)
  end


  # Sometimes benchmark results are skewed because code executed
  # earlier encounters different garbage collection overheads than
  # that run later. #bmbm attempts to minimize this effect by running
  # the tests twice, the first time as a rehearsal in order to get the
  # runtime environment stable, the second time for
  # real. GC.start is executed before the start of each of
  # the real timings; the cost of this is not included in the
  # timings. In reality, though, there's only so much that #bmbm can
  # do, and the results are not guaranteed to be isolated from garbage
  # collection and other effects.
  #
  # Because #bmbm takes two passes through the tests, it can
  # calculate the required label width.
  #
  #       require 'benchmark'
  #
  #       array = (1..1000000).map { rand }
  #
  #       Benchmark.bmbm do |x|
  #         x.report("sort!") { array.dup.sort! }
  #         x.report("sort")  { array.dup.sort  }
  #       end
  #
  # Generates:
  #
  #        Rehearsal -----------------------------------------
  #        sort!   1.440000   0.010000   1.450000 (  1.446833)
  #        sort    1.440000   0.000000   1.440000 (  1.448257)
  #        -------------------------------- total: 2.890000sec
  #
  #                    user     system      total        real
  #        sort!   1.460000   0.000000   1.460000 (  1.458065)
  #        sort    1.450000   0.000000   1.450000 (  1.455963)
  #
  # #bmbm yields a Benchmark::Job object and returns an array of
  # Benchmark::Tms objects.
  #
  def bmbm(width = 0) # :yield: job
    job = Job.new(width)
    yield(job)
    width = job.width + 1
    sync = $stdout.sync
    $stdout.sync = true

    # rehearsal
    puts 'Rehearsal '.ljust(width+CAPTION.length,'-')
    ets = job.list.inject(Tms.new) { |sum,(label,item)|
      print label.ljust(width)
      res = Benchmark.measure(&item)
      print res.format
      sum + res
    }.format("total: %tsec")
    print " #{ets}\n\n".rjust(width+CAPTION.length+2,'-')

    # take
    print ' '*width + CAPTION
    job.list.map { |label,item|
      GC.start
      print label.ljust(width)
      Benchmark.measure(label, &item).tap { |res| print res }
    }
  ensure
    $stdout.sync = sync unless sync.nil?
  end

  #
  # Returns the time used to execute the given block as a
  # Benchmark::Tms object. Takes +label+ option.
  #
  #       require 'benchmark'
  #
  #       n = 1000000
  #
  #       time = Benchmark.measure do
  #         n.times { a = "1" }
  #       end
  #       puts time
  #
  # Generates:
  #
  #        0.220000   0.000000   0.220000 (  0.227313)
  #
  def measure(label = "") # :yield:
    t0, r0 = Process.times, Process.clock_gettime(Process::CLOCK_MONOTONIC)
    yield
    t1, r1 = Process.times, Process.clock_gettime(Process::CLOCK_MONOTONIC)
    Benchmark::Tms.new(t1.utime  - t0.utime,
                       t1.stime  - t0.stime,
                       t1.cutime - t0.cutime,
                       t1.cstime - t0.cstime,
                       r1 - r0,
                       label)
  end

  #
  # Returns the elapsed real time used to execute the given block.
  #
  def realtime # :yield:
    r0 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
    yield
    Process.clock_gettime(Process::CLOCK_MONOTONIC) - r0
  end

  module_function :benchmark, :measure, :realtime, :bm, :bmbm

  #
  # A Job is a sequence of labelled blocks to be processed by the
  # Benchmark.bmbm method.  It is of little direct interest to the user.
  #
  class Job # :nodoc:
    #
    # Returns an initialized Job instance.
    # Usually, one doesn't call this method directly, as new
    # Job objects are created by the #bmbm method.
    # +width+ is a initial value for the label offset used in formatting;
    # the #bmbm method passes its +width+ argument to this constructor.
    #
    def initialize(width)
      @width = width
      @list = []
    end

    #
    # Registers the given label and block pair in the job list.
    #
    def item(label = "", &blk) # :yield:
      raise ArgumentError, "no block" unless block_given?
      label = label.to_s
      w = label.length
      @width = w if @width < w
      @list << [label, blk]
      self
    end

    alias report item

    # An array of 2-element arrays, consisting of label and block pairs.
    attr_reader :list

    # Length of the widest label in the #list.
    attr_reader :width
  end

  #
  # This class is used by the Benchmark.benchmark and Benchmark.bm methods.
  # It is of little direct interest to the user.
  #
  class Report # :nodoc:
    #
    # Returns an initialized Report instance.
    # Usually, one doesn't call this method directly, as new
    # Report objects are created by the #benchmark and #bm methods.
    # +width+ and +format+ are the label offset and
    # format string used by Tms#format.
    #
    def initialize(width = 0, format = nil)
      @width, @format, @list = width, format, []
    end

    #
    # Prints the +label+ and measured time for the block,
    # formatted by +format+. See Tms#format for the
    # formatting rules.
    #
    def item(label = "", *format, &blk) # :yield:
      print label.to_s.ljust(@width)
      @list << res = Benchmark.measure(label, &blk)
      print res.format(@format, *format)
      res
    end

    alias report item

    # An array of Benchmark::Tms objects representing each item.
    attr_reader :list
  end



  #
  # A data object, representing the times associated with a benchmark
  # measurement.
  #
  class Tms

    # Default caption, see also Benchmark::CAPTION
    CAPTION = "      user     system      total        real\n"

    # Default format string, see also Benchmark::FORMAT
    FORMAT = "%10.6u %10.6y %10.6t %10.6r\n"

    # User CPU time
    attr_reader :utime

    # System CPU time
    attr_reader :stime

    # User CPU time of children
    attr_reader :cutime

    # System CPU time of children
    attr_reader :cstime

    # Elapsed real time
    attr_reader :real

    # Total time, that is +utime+ + +stime+ + +cutime+ + +cstime+
    attr_reader :total

    # Label
    attr_reader :label

    #
    # Returns an initialized Tms object which has
    # +utime+ as the user CPU time, +stime+ as the system CPU time,
    # +cutime+ as the children's user CPU time, +cstime+ as the children's
    # system CPU time, +real+ as the elapsed real time and +label+ as the label.
    #
    def initialize(utime = 0.0, stime = 0.0, cutime = 0.0, cstime = 0.0, real = 0.0, label = nil)
      @utime, @stime, @cutime, @cstime, @real, @label = utime, stime, cutime, cstime, real, label.to_s
      @total = @utime + @stime + @cutime + @cstime
    end

    #
    # Returns a new Tms object whose times are the sum of the times for this
    # Tms object, plus the time required to execute the code block (+blk+).
    #
    def add(&blk) # :yield:
      self + Benchmark.measure(&blk)
    end

    #
    # An in-place version of #add.
    # Changes the times of this Tms object by making it the sum of the times
    # for this Tms object, plus the time required to execute
    # the code block (+blk+).
    #
    def add!(&blk)
      t = Benchmark.measure(&blk)
      @utime  = utime + t.utime
      @stime  = stime + t.stime
      @cutime = cutime + t.cutime
      @cstime = cstime + t.cstime
      @real   = real + t.real
      self
    end

    #
    # Returns a new Tms object obtained by memberwise summation
    # of the individual times for this Tms object with those of the +other+
    # Tms object.
    # This method and #/() are useful for taking statistics.
    #
    def +(other); memberwise(:+, other) end

    #
    # Returns a new Tms object obtained by memberwise subtraction
    # of the individual times for the +other+ Tms object from those of this
    # Tms object.
    #
    def -(other); memberwise(:-, other) end

    #
    # Returns a new Tms object obtained by memberwise multiplication
    # of the individual times for this Tms object by +x+.
    #
    def *(x); memberwise(:*, x) end

    #
    # Returns a new Tms object obtained by memberwise division
    # of the individual times for this Tms object by +x+.
    # This method and #+() are useful for taking statistics.
    #
    def /(x); memberwise(:/, x) end

    #
    # Returns the contents of this Tms object as
    # a formatted string, according to a +format+ string
    # like that passed to Kernel.format. In addition, #format
    # accepts the following extensions:
    #
    # <tt>%u</tt>::     Replaced by the user CPU time, as reported by Tms#utime.
    # <tt>%y</tt>::     Replaced by the system CPU time, as reported by #stime (Mnemonic: y of "s*y*stem")
    # <tt>%U</tt>::     Replaced by the children's user CPU time, as reported by Tms#cutime
    # <tt>%Y</tt>::     Replaced by the children's system CPU time, as reported by Tms#cstime
    # <tt>%t</tt>::     Replaced by the total CPU time, as reported by Tms#total
    # <tt>%r</tt>::     Replaced by the elapsed real time, as reported by Tms#real
    # <tt>%n</tt>::     Replaced by the label string, as reported by Tms#label (Mnemonic: n of "*n*ame")
    #
    # If +format+ is not given, FORMAT is used as default value, detailing the
    # user, system and real elapsed time.
    #
    def format(format = nil, *args)
      str = (format || FORMAT).dup
      str.gsub!(/(%[-+.\d]*)n/) { "#{$1}s" % label }
      str.gsub!(/(%[-+.\d]*)u/) { "#{$1}f" % utime }
      str.gsub!(/(%[-+.\d]*)y/) { "#{$1}f" % stime }
      str.gsub!(/(%[-+.\d]*)U/) { "#{$1}f" % cutime }
      str.gsub!(/(%[-+.\d]*)Y/) { "#{$1}f" % cstime }
      str.gsub!(/(%[-+.\d]*)t/) { "#{$1}f" % total }
      str.gsub!(/(%[-+.\d]*)r/) { "(#{$1}f)" % real }
      format ? str % args : str
    end

    #
    # Same as #format.
    #
    def to_s
      format
    end

    #
    # Returns a new 6-element array, consisting of the
    # label, user CPU time, system CPU time, children's
    # user CPU time, children's system CPU time and elapsed
    # real time.
    #
    def to_a
      [@label, @utime, @stime, @cutime, @cstime, @real]
    end

    #
    # Returns a hash containing the same data as `to_a`.
    #
    def to_h
      {
        label:  @label,
        utime:  @utime,
        stime:  @stime,
        cutime: @cutime,
        cstime: @cstime,
        real:   @real
      }
    end

    protected

    #
    # Returns a new Tms object obtained by memberwise operation +op+
    # of the individual times for this Tms object with those of the other
    # Tms object (+x+).
    #
    # +op+ can be a mathematical operation such as <tt>+</tt>, <tt>-</tt>,
    # <tt>*</tt>, <tt>/</tt>
    #
    def memberwise(op, x)
      case x
      when Benchmark::Tms
        Benchmark::Tms.new(utime.__send__(op, x.utime),
                           stime.__send__(op, x.stime),
                           cutime.__send__(op, x.cutime),
                           cstime.__send__(op, x.cstime),
                           real.__send__(op, x.real)
                           )
      else
        Benchmark::Tms.new(utime.__send__(op, x),
                           stime.__send__(op, x),
                           cutime.__send__(op, x),
                           cstime.__send__(op, x),
                           real.__send__(op, x)
                           )
      end
    end
  end

  # The default caption string (heading above the output times).
  CAPTION = Benchmark::Tms::CAPTION

  # The default format string used to display times.  See also Benchmark::Tms#format.
  FORMAT = Benchmark::Tms::FORMAT
end
PK!}$[(	���
ruby/kconv.rbnu�[���# frozen_string_literal: false
#
# kconv.rb - Kanji Converter.
#
# $Id$
#
# ----
#
# kconv.rb implements the Kconv class for Kanji Converter.  Additionally,
# some methods in String classes are added to allow easy conversion.
#

require 'nkf'

#
# Kanji Converter for Ruby.
#
module Kconv
  #
  # Public Constants
  #

  #Constant of Encoding

  # Auto-Detect
  AUTO = NKF::AUTO
  # ISO-2022-JP
  JIS = NKF::JIS
  # EUC-JP
  EUC = NKF::EUC
  # Shift_JIS
  SJIS = NKF::SJIS
  # BINARY
  BINARY = NKF::BINARY
  # NOCONV
  NOCONV = NKF::NOCONV
  # ASCII
  ASCII = NKF::ASCII
  # UTF-8
  UTF8 = NKF::UTF8
  # UTF-16
  UTF16 = NKF::UTF16
  # UTF-32
  UTF32 = NKF::UTF32
  # UNKNOWN
  UNKNOWN = NKF::UNKNOWN

  #
  # Public Methods
  #

  # call-seq:
  #    Kconv.kconv(str, to_enc, from_enc=nil)
  #
  # Convert <code>str</code> to <code>to_enc</code>.
  # <code>to_enc</code> and <code>from_enc</code> are given as constants of Kconv or Encoding objects.
  def kconv(str, to_enc, from_enc=nil)
    opt = ''
    opt += ' --ic=' + from_enc.to_s if from_enc
    opt += ' --oc=' + to_enc.to_s if to_enc

    ::NKF::nkf(opt, str)
  end
  module_function :kconv

  #
  # Encode to
  #

  # call-seq:
  #    Kconv.tojis(str)   => string
  #
  # Convert <code>str</code> to ISO-2022-JP
  def tojis(str)
    kconv(str, JIS)
  end
  module_function :tojis

  # call-seq:
  #    Kconv.toeuc(str)   => string
  #
  # Convert <code>str</code> to EUC-JP
  def toeuc(str)
    kconv(str, EUC)
  end
  module_function :toeuc

  # call-seq:
  #    Kconv.tosjis(str)   => string
  #
  # Convert <code>str</code> to Shift_JIS
  def tosjis(str)
    kconv(str, SJIS)
  end
  module_function :tosjis

  # call-seq:
  #    Kconv.toutf8(str)   => string
  #
  # Convert <code>str</code> to UTF-8
  def toutf8(str)
    kconv(str, UTF8)
  end
  module_function :toutf8

  # call-seq:
  #    Kconv.toutf16(str)   => string
  #
  # Convert <code>str</code> to UTF-16
  def toutf16(str)
    kconv(str, UTF16)
  end
  module_function :toutf16

  # call-seq:
  #    Kconv.toutf32(str)   => string
  #
  # Convert <code>str</code> to UTF-32
  def toutf32(str)
    kconv(str, UTF32)
  end
  module_function :toutf32

  # call-seq:
  #    Kconv.tolocale   => string
  #
  # Convert <code>self</code> to locale encoding
  def tolocale(str)
    kconv(str, Encoding.locale_charmap)
  end
  module_function :tolocale

  #
  # guess
  #

  # call-seq:
  #    Kconv.guess(str)   => encoding
  #
  # Guess input encoding by NKF.guess
  def guess(str)
    ::NKF::guess(str)
  end
  module_function :guess

  #
  # isEncoding
  #

  # call-seq:
  #    Kconv.iseuc(str)   => true or false
  #
  # Returns whether input encoding is EUC-JP or not.
  #
  # *Note* don't expect this return value is MatchData.
  def iseuc(str)
    str.dup.force_encoding(EUC).valid_encoding?
  end
  module_function :iseuc

  # call-seq:
  #    Kconv.issjis(str)   => true or false
  #
  # Returns whether input encoding is Shift_JIS or not.
  def issjis(str)
    str.dup.force_encoding(SJIS).valid_encoding?
  end
  module_function :issjis

  # call-seq:
  #    Kconv.isjis(str)   => true or false
  #
  # Returns whether input encoding is ISO-2022-JP or not.
  def isjis(str)
    /\A [\t\n\r\x20-\x7E]*
      (?:
        (?:\x1b \x28 I      [\x21-\x7E]*
          |\x1b \x28 J      [\x21-\x7E]*
          |\x1b \x24 @      (?:[\x21-\x7E]{2})*
          |\x1b \x24 B      (?:[\x21-\x7E]{2})*
          |\x1b \x24 \x28 D (?:[\x21-\x7E]{2})*
        )*
        \x1b \x28 B [\t\n\r\x20-\x7E]*
      )*
     \z/nox =~ str.dup.force_encoding('BINARY') ? true : false
  end
  module_function :isjis

  # call-seq:
  #    Kconv.isutf8(str)   => true or false
  #
  # Returns whether input encoding is UTF-8 or not.
  def isutf8(str)
    str.dup.force_encoding(UTF8).valid_encoding?
  end
  module_function :isutf8
end

class String
  # call-seq:
  #    String#kconv(to_enc, from_enc)
  #
  # Convert <code>self</code> to <code>to_enc</code>.
  # <code>to_enc</code> and <code>from_enc</code> are given as constants of Kconv or Encoding objects.
  def kconv(to_enc, from_enc=nil)
    from_enc = self.encoding if !from_enc && self.encoding != Encoding.list[0]
    Kconv::kconv(self, to_enc, from_enc)
  end

  #
  # to Encoding
  #

  # call-seq:
  #    String#tojis   => string
  #
  # Convert <code>self</code> to ISO-2022-JP
  def tojis; Kconv.tojis(self) end

  # call-seq:
  #    String#toeuc   => string
  #
  # Convert <code>self</code> to EUC-JP
  def toeuc; Kconv.toeuc(self) end

  # call-seq:
  #    String#tosjis   => string
  #
  # Convert <code>self</code> to Shift_JIS
  def tosjis; Kconv.tosjis(self) end

  # call-seq:
  #    String#toutf8   => string
  #
  # Convert <code>self</code> to UTF-8
  def toutf8; Kconv.toutf8(self) end

  # call-seq:
  #    String#toutf16   => string
  #
  # Convert <code>self</code> to UTF-16
  def toutf16; Kconv.toutf16(self) end

  # call-seq:
  #    String#toutf32   => string
  #
  # Convert <code>self</code> to UTF-32
  def toutf32; Kconv.toutf32(self) end

  # call-seq:
  #    String#tolocale   => string
  #
  # Convert <code>self</code> to locale encoding
  def tolocale; Kconv.tolocale(self) end

  #
  # is Encoding
  #

  # call-seq:
  #    String#iseuc   => true or false
  #
  # Returns whether <code>self</code>'s encoding is EUC-JP or not.
  def iseuc;	Kconv.iseuc(self) end

  # call-seq:
  #    String#issjis   => true or false
  #
  # Returns whether <code>self</code>'s encoding is Shift_JIS or not.
  def issjis;	Kconv.issjis(self) end

  # call-seq:
  #    String#isjis   => true or false
  #
  # Returns whether <code>self</code>'s encoding is ISO-2022-JP or not.
  def isjis;	Kconv.isjis(self) end

  # call-seq:
  #    String#isutf8   => true or false
  #
  # Returns whether <code>self</code>'s encoding is UTF-8 or not.
  def isutf8;	Kconv.isutf8(self) end
end
PK!}$[�Ԕ�	�	ruby/find.rbnu�[���# frozen_string_literal: true
#
# find.rb: the Find module for processing all files under a given directory.
#

#
# The +Find+ module supports the top-down traversal of a set of file paths.
#
# For example, to total the size of all files under your home directory,
# ignoring anything in a "dot" directory (e.g. $HOME/.ssh):
#
#   require 'find'
#
#   total_size = 0
#
#   Find.find(ENV["HOME"]) do |path|
#     if FileTest.directory?(path)
#       if File.basename(path).start_with?('.')
#         Find.prune       # Don't look any further into this directory.
#       else
#         next
#       end
#     else
#       total_size += FileTest.size(path)
#     end
#   end
#
module Find

  #
  # Calls the associated block with the name of every file and directory listed
  # as arguments, then recursively on their subdirectories, and so on.
  #
  # Returns an enumerator if no block is given.
  #
  # See the +Find+ module documentation for an example.
  #
  def find(*paths, ignore_error: true) # :yield: path
    block_given? or return enum_for(__method__, *paths, ignore_error: ignore_error)

    fs_encoding = Encoding.find("filesystem")

    paths.collect!{|d| raise Errno::ENOENT, d unless File.exist?(d); d.dup}.each do |path|
      path = path.to_path if path.respond_to? :to_path
      enc = path.encoding == Encoding::US_ASCII ? fs_encoding : path.encoding
      ps = [path]
      while file = ps.shift
        catch(:prune) do
          yield file.dup
          begin
            s = File.lstat(file)
          rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG, Errno::EINVAL
            raise unless ignore_error
            next
          end
          if s.directory? then
            begin
              fs = Dir.children(file, encoding: enc)
            rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG, Errno::EINVAL
              raise unless ignore_error
              next
            end
            fs.sort!
            fs.reverse_each {|f|
              f = File.join(file, f)
              ps.unshift f
            }
          end
        end
      end
    end
    nil
  end

  #
  # Skips the current file or directory, restarting the loop with the next
  # entry. If the current file is a directory, that directory will not be
  # recursively entered. Meaningful only within the block associated with
  # Find::find.
  #
  # See the +Find+ module documentation for an example.
  #
  def prune
    throw :prune
  end

  module_function :find, :prune
end
PK"}$[����	�	ruby/ripper.rbnu�[���# frozen_string_literal: true
require 'ripper/core'
require 'ripper/lexer'
require 'ripper/filter'
require 'ripper/sexp'

# Ripper is a Ruby script parser.
#
# You can get information from the parser with event-based style.
# Information such as abstract syntax trees or simple lexical analysis of the
# Ruby program.
#
# == Usage
#
# Ripper provides an easy interface for parsing your program into a symbolic
# expression tree (or S-expression).
#
# Understanding the output of the parser may come as a challenge, it's
# recommended you use PP to format the output for legibility.
#
#   require 'ripper'
#   require 'pp'
#
#   pp Ripper.sexp('def hello(world) "Hello, #{world}!"; end')
#     #=> [:program,
#          [[:def,
#            [:@ident, "hello", [1, 4]],
#            [:paren,
#             [:params, [[:@ident, "world", [1, 10]]], nil, nil, nil, nil, nil, nil]],
#            [:bodystmt,
#             [[:string_literal,
#               [:string_content,
#                [:@tstring_content, "Hello, ", [1, 18]],
#                [:string_embexpr, [[:var_ref, [:@ident, "world", [1, 27]]]]],
#                [:@tstring_content, "!", [1, 33]]]]],
#             nil,
#             nil,
#             nil]]]]
#
# You can see in the example above, the expression starts with +:program+.
#
# From here, a method definition at +:def+, followed by the method's identifier
# <code>:@ident</code>. After the method's identifier comes the parentheses
# +:paren+ and the method parameters under +:params+.
#
# Next is the method body, starting at +:bodystmt+ (+stmt+ meaning statement),
# which contains the full definition of the method.
#
# In our case, we're simply returning a String, so next we have the
# +:string_literal+ expression.
#
# Within our +:string_literal+ you'll notice two <code>@tstring_content</code>,
# this is the literal part for <code>Hello, </code> and <code>!</code>. Between
# the two <code>@tstring_content</code> statements is a +:string_embexpr+,
# where _embexpr_ is an embedded expression. Our expression consists of a local
# variable, or +var_ref+, with the identifier (<code>@ident</code>) of +world+.
#
# == Resources
#
# * {Ruby Inside}[http://www.rubyinside.com/using-ripper-to-see-how-ruby-is-parsing-your-code-5270.html]
#
# == Requirements
#
# * ruby 1.9 (support CVS HEAD only)
# * bison 1.28 or later (Other yaccs do not work)
#
# == License
#
# Ruby License.
#
# - Minero Aoki
# - aamine@loveruby.net
# - http://i.loveruby.net
class Ripper; end
PK"}$["gems/gems/io-console-0.5.11/lib/ionuȯ��PK"}$[l2�7&&ruby/reline/version.rbnu�[���module Reline
  VERSION = '0.3.1'
end
PK"}$[���v:
:
ruby/reline/key_stroke.rbnu�[���class Reline::KeyStroke
  def initialize(config)
    @config = config
  end

  def compress_meta_key(ary)
    return ary unless @config.convert_meta
    ary.inject([]) { |result, key|
      if result.size > 0 and result.last == "\e".ord
        result[result.size - 1] = Reline::Key.new(key, key | 0b10000000, true)
      else
        result << key
      end
      result
    }
  end

  def start_with?(me, other)
    compressed_me = compress_meta_key(me)
    compressed_other = compress_meta_key(other)
    i = 0
    loop do
      my_c = compressed_me[i]
      other_c = compressed_other[i]
      other_is_last = (i + 1) == compressed_other.size
      me_is_last = (i + 1) == compressed_me.size
      if my_c != other_c
        if other_c == "\e".ord and other_is_last and my_c.is_a?(Reline::Key) and my_c.with_meta
          return true
        else
          return false
        end
      elsif other_is_last
        return true
      elsif me_is_last
        return false
      end
      i += 1
    end
  end

  def equal?(me, other)
    case me
    when Array
      compressed_me = compress_meta_key(me)
      compressed_other = compress_meta_key(other)
      compressed_me.size == compressed_other.size and [compressed_me, compressed_other].transpose.all?{ |i| equal?(i[0], i[1]) }
    when Integer
      if other.is_a?(Reline::Key)
        if other.combined_char == "\e".ord
          false
        else
          other.combined_char == me
        end
      else
        me == other
      end
    when Reline::Key
      if other.is_a?(Integer)
        me.combined_char == other
      else
        me == other
      end
    end
  end

  def match_status(input)
    key_mapping.keys.select { |lhs|
      start_with?(lhs, input)
    }.tap { |it|
      return :matched  if it.size == 1 && equal?(it[0], input)
      return :matching if it.size == 1 && !equal?(it[0], input)
      return :matched  if it.max_by(&:size)&.size&.< input.size
      return :matching if it.size > 1
    }
    key_mapping.keys.select { |lhs|
      start_with?(input, lhs)
    }.tap { |it|
      return it.size > 0 ? :matched : :unmatched
    }
  end

  def expand(input)
    input = compress_meta_key(input)
    lhs = key_mapping.keys.select { |item| start_with?(input, item) }.sort_by(&:size).last
    return input unless lhs
    rhs = key_mapping[lhs]

    case rhs
    when String
      rhs_bytes = rhs.bytes
      expand(expand(rhs_bytes) + expand(input.drop(lhs.size)))
    when Symbol
      [rhs] + expand(input.drop(lhs.size))
    when Array
      rhs
    end
  end

  private

  def key_mapping
    @config.key_bindings
  end
end
PK"}$[`b��]�]'ruby/reline/unicode/east_asian_width.rbnu�[���class Reline::Unicode::EastAsianWidth
  # This is based on EastAsianWidth.txt
  # EastAsianWidth.txt

  # Fullwidth
  TYPE_F = /^[#{ %W(
    \u{3000}
    \u{FF01}-\u{FF60}
    \u{FFE0}-\u{FFE6}
  ).join }]/

  # Halfwidth
  TYPE_H = /^[#{ %W(
    \u{20A9}
    \u{FF61}-\u{FFBE}
    \u{FFC2}-\u{FFC7}
    \u{FFCA}-\u{FFCF}
    \u{FFD2}-\u{FFD7}
    \u{FFDA}-\u{FFDC}
    \u{FFE8}-\u{FFEE}
  ).join }]/

  # Wide
  TYPE_W = /^[#{ %W(
    \u{1100}-\u{115F}
    \u{231A}-\u{231B}
    \u{2329}-\u{232A}
    \u{23E9}-\u{23EC}
    \u{23F0}
    \u{23F3}
    \u{25FD}-\u{25FE}
    \u{2614}-\u{2615}
    \u{2648}-\u{2653}
    \u{267F}
    \u{2693}
    \u{26A1}
    \u{26AA}-\u{26AB}
    \u{26BD}-\u{26BE}
    \u{26C4}-\u{26C5}
    \u{26CE}
    \u{26D4}
    \u{26EA}
    \u{26F2}-\u{26F3}
    \u{26F5}
    \u{26FA}
    \u{26FD}
    \u{2705}
    \u{270A}-\u{270B}
    \u{2728}
    \u{274C}
    \u{274E}
    \u{2753}-\u{2755}
    \u{2757}
    \u{2795}-\u{2797}
    \u{27B0}
    \u{27BF}
    \u{2B1B}-\u{2B1C}
    \u{2B50}
    \u{2B55}
    \u{2E80}-\u{2E99}
    \u{2E9B}-\u{2EF3}
    \u{2F00}-\u{2FD5}
    \u{2FF0}-\u{2FFB}
    \u{3001}-\u{303E}
    \u{3041}-\u{3096}
    \u{3099}-\u{30FF}
    \u{3105}-\u{312F}
    \u{3131}-\u{318E}
    \u{3190}-\u{31E3}
    \u{31F0}-\u{321E}
    \u{3220}-\u{3247}
    \u{3250}-\u{4DBF}
    \u{4E00}-\u{A48C}
    \u{A490}-\u{A4C6}
    \u{A960}-\u{A97C}
    \u{AC00}-\u{D7A3}
    \u{F900}-\u{FAFF}
    \u{FE10}-\u{FE19}
    \u{FE30}-\u{FE52}
    \u{FE54}-\u{FE66}
    \u{FE68}-\u{FE6B}
    \u{16FE0}-\u{16FE4}
    \u{16FF0}-\u{16FF1}
    \u{17000}-\u{187F7}
    \u{18800}-\u{18CD5}
    \u{18D00}-\u{18D08}
    \u{1B000}-\u{1B11E}
    \u{1B150}-\u{1B152}
    \u{1B164}-\u{1B167}
    \u{1B170}-\u{1B2FB}
    \u{1F004}
    \u{1F0CF}
    \u{1F18E}
    \u{1F191}-\u{1F19A}
    \u{1F200}-\u{1F202}
    \u{1F210}-\u{1F23B}
    \u{1F240}-\u{1F248}
    \u{1F250}-\u{1F251}
    \u{1F260}-\u{1F265}
    \u{1F300}-\u{1F320}
    \u{1F32D}-\u{1F335}
    \u{1F337}-\u{1F37C}
    \u{1F37E}-\u{1F393}
    \u{1F3A0}-\u{1F3CA}
    \u{1F3CF}-\u{1F3D3}
    \u{1F3E0}-\u{1F3F0}
    \u{1F3F4}
    \u{1F3F8}-\u{1F43E}
    \u{1F440}
    \u{1F442}-\u{1F4FC}
    \u{1F4FF}-\u{1F53D}
    \u{1F54B}-\u{1F54E}
    \u{1F550}-\u{1F567}
    \u{1F57A}
    \u{1F595}-\u{1F596}
    \u{1F5A4}
    \u{1F5FB}-\u{1F64F}
    \u{1F680}-\u{1F6C5}
    \u{1F6CC}
    \u{1F6D0}-\u{1F6D2}
    \u{1F6D5}-\u{1F6D7}
    \u{1F6EB}-\u{1F6EC}
    \u{1F6F4}-\u{1F6FC}
    \u{1F7E0}-\u{1F7EB}
    \u{1F90C}-\u{1F93A}
    \u{1F93C}-\u{1F945}
    \u{1F947}-\u{1F978}
    \u{1F97A}-\u{1F9CB}
    \u{1F9CD}-\u{1F9FF}
    \u{1FA70}-\u{1FA74}
    \u{1FA78}-\u{1FA7A}
    \u{1FA80}-\u{1FA86}
    \u{1FA90}-\u{1FAA8}
    \u{1FAB0}-\u{1FAB6}
    \u{1FAC0}-\u{1FAC2}
    \u{1FAD0}-\u{1FAD6}
    \u{20000}-\u{2FFFD}
    \u{30000}-\u{3FFFD}
  ).join }]/

  # Narrow
  TYPE_NA = /^[#{ %W(
    \u{0020}-\u{007E}
    \u{00A2}-\u{00A3}
    \u{00A5}-\u{00A6}
    \u{00AC}
    \u{00AF}
    \u{27E6}-\u{27ED}
    \u{2985}-\u{2986}
  ).join }]/

  # Ambiguous
  TYPE_A = /^[#{ %W(
    \u{00A1}
    \u{00A4}
    \u{00A7}-\u{00A8}
    \u{00AA}
    \u{00AD}-\u{00AE}
    \u{00B0}-\u{00B4}
    \u{00B6}-\u{00BA}
    \u{00BC}-\u{00BF}
    \u{00C6}
    \u{00D0}
    \u{00D7}-\u{00D8}
    \u{00DE}-\u{00E1}
    \u{00E6}
    \u{00E8}-\u{00EA}
    \u{00EC}-\u{00ED}
    \u{00F0}
    \u{00F2}-\u{00F3}
    \u{00F7}-\u{00FA}
    \u{00FC}
    \u{00FE}
    \u{0101}
    \u{0111}
    \u{0113}
    \u{011B}
    \u{0126}-\u{0127}
    \u{012B}
    \u{0131}-\u{0133}
    \u{0138}
    \u{013F}-\u{0142}
    \u{0144}
    \u{0148}-\u{014B}
    \u{014D}
    \u{0152}-\u{0153}
    \u{0166}-\u{0167}
    \u{016B}
    \u{01CE}
    \u{01D0}
    \u{01D2}
    \u{01D4}
    \u{01D6}
    \u{01D8}
    \u{01DA}
    \u{01DC}
    \u{0251}
    \u{0261}
    \u{02C4}
    \u{02C7}
    \u{02C9}-\u{02CB}
    \u{02CD}
    \u{02D0}
    \u{02D8}-\u{02DB}
    \u{02DD}
    \u{02DF}
    \u{0300}-\u{036F}
    \u{0391}-\u{03A1}
    \u{03A3}-\u{03A9}
    \u{03B1}-\u{03C1}
    \u{03C3}-\u{03C9}
    \u{0401}
    \u{0410}-\u{044F}
    \u{0451}
    \u{2010}
    \u{2013}-\u{2016}
    \u{2018}-\u{2019}
    \u{201C}-\u{201D}
    \u{2020}-\u{2022}
    \u{2024}-\u{2027}
    \u{2030}
    \u{2032}-\u{2033}
    \u{2035}
    \u{203B}
    \u{203E}
    \u{2074}
    \u{207F}
    \u{2081}-\u{2084}
    \u{20AC}
    \u{2103}
    \u{2105}
    \u{2109}
    \u{2113}
    \u{2116}
    \u{2121}-\u{2122}
    \u{2126}
    \u{212B}
    \u{2153}-\u{2154}
    \u{215B}-\u{215E}
    \u{2160}-\u{216B}
    \u{2170}-\u{2179}
    \u{2189}
    \u{2190}-\u{2199}
    \u{21B8}-\u{21B9}
    \u{21D2}
    \u{21D4}
    \u{21E7}
    \u{2200}
    \u{2202}-\u{2203}
    \u{2207}-\u{2208}
    \u{220B}
    \u{220F}
    \u{2211}
    \u{2215}
    \u{221A}
    \u{221D}-\u{2220}
    \u{2223}
    \u{2225}
    \u{2227}-\u{222C}
    \u{222E}
    \u{2234}-\u{2237}
    \u{223C}-\u{223D}
    \u{2248}
    \u{224C}
    \u{2252}
    \u{2260}-\u{2261}
    \u{2264}-\u{2267}
    \u{226A}-\u{226B}
    \u{226E}-\u{226F}
    \u{2282}-\u{2283}
    \u{2286}-\u{2287}
    \u{2295}
    \u{2299}
    \u{22A5}
    \u{22BF}
    \u{2312}
    \u{2460}-\u{24E9}
    \u{24EB}-\u{254B}
    \u{2550}-\u{2573}
    \u{2580}-\u{258F}
    \u{2592}-\u{2595}
    \u{25A0}-\u{25A1}
    \u{25A3}-\u{25A9}
    \u{25B2}-\u{25B3}
    \u{25B6}-\u{25B7}
    \u{25BC}-\u{25BD}
    \u{25C0}-\u{25C1}
    \u{25C6}-\u{25C8}
    \u{25CB}
    \u{25CE}-\u{25D1}
    \u{25E2}-\u{25E5}
    \u{25EF}
    \u{2605}-\u{2606}
    \u{2609}
    \u{260E}-\u{260F}
    \u{261C}
    \u{261E}
    \u{2640}
    \u{2642}
    \u{2660}-\u{2661}
    \u{2663}-\u{2665}
    \u{2667}-\u{266A}
    \u{266C}-\u{266D}
    \u{266F}
    \u{269E}-\u{269F}
    \u{26BF}
    \u{26C6}-\u{26CD}
    \u{26CF}-\u{26D3}
    \u{26D5}-\u{26E1}
    \u{26E3}
    \u{26E8}-\u{26E9}
    \u{26EB}-\u{26F1}
    \u{26F4}
    \u{26F6}-\u{26F9}
    \u{26FB}-\u{26FC}
    \u{26FE}-\u{26FF}
    \u{273D}
    \u{2776}-\u{277F}
    \u{2B56}-\u{2B59}
    \u{3248}-\u{324F}
    \u{E000}-\u{F8FF}
    \u{FE00}-\u{FE0F}
    \u{FFFD}
    \u{1F100}-\u{1F10A}
    \u{1F110}-\u{1F12D}
    \u{1F130}-\u{1F169}
    \u{1F170}-\u{1F18D}
    \u{1F18F}-\u{1F190}
    \u{1F19B}-\u{1F1AC}
    \u{E0100}-\u{E01EF}
    \u{F0000}-\u{FFFFD}
    \u{100000}-\u{10FFFD}
  ).join }]/

  # Neutral
  TYPE_N = /^[#{ %W(
    \u{0000}-\u{001F}
    \u{007F}-\u{00A0}
    \u{00A9}
    \u{00AB}
    \u{00B5}
    \u{00BB}
    \u{00C0}-\u{00C5}
    \u{00C7}-\u{00CF}
    \u{00D1}-\u{00D6}
    \u{00D9}-\u{00DD}
    \u{00E2}-\u{00E5}
    \u{00E7}
    \u{00EB}
    \u{00EE}-\u{00EF}
    \u{00F1}
    \u{00F4}-\u{00F6}
    \u{00FB}
    \u{00FD}
    \u{00FF}-\u{0100}
    \u{0102}-\u{0110}
    \u{0112}
    \u{0114}-\u{011A}
    \u{011C}-\u{0125}
    \u{0128}-\u{012A}
    \u{012C}-\u{0130}
    \u{0134}-\u{0137}
    \u{0139}-\u{013E}
    \u{0143}
    \u{0145}-\u{0147}
    \u{014C}
    \u{014E}-\u{0151}
    \u{0154}-\u{0165}
    \u{0168}-\u{016A}
    \u{016C}-\u{01CD}
    \u{01CF}
    \u{01D1}
    \u{01D3}
    \u{01D5}
    \u{01D7}
    \u{01D9}
    \u{01DB}
    \u{01DD}-\u{0250}
    \u{0252}-\u{0260}
    \u{0262}-\u{02C3}
    \u{02C5}-\u{02C6}
    \u{02C8}
    \u{02CC}
    \u{02CE}-\u{02CF}
    \u{02D1}-\u{02D7}
    \u{02DC}
    \u{02DE}
    \u{02E0}-\u{02FF}
    \u{0370}-\u{0377}
    \u{037A}-\u{037F}
    \u{0384}-\u{038A}
    \u{038C}
    \u{038E}-\u{0390}
    \u{03AA}-\u{03B0}
    \u{03C2}
    \u{03CA}-\u{0400}
    \u{0402}-\u{040F}
    \u{0450}
    \u{0452}-\u{052F}
    \u{0531}-\u{0556}
    \u{0559}-\u{058A}
    \u{058D}-\u{058F}
    \u{0591}-\u{05C7}
    \u{05D0}-\u{05EA}
    \u{05EF}-\u{05F4}
    \u{0600}-\u{061C}
    \u{061E}-\u{070D}
    \u{070F}-\u{074A}
    \u{074D}-\u{07B1}
    \u{07C0}-\u{07FA}
    \u{07FD}-\u{082D}
    \u{0830}-\u{083E}
    \u{0840}-\u{085B}
    \u{085E}
    \u{0860}-\u{086A}
    \u{08A0}-\u{08B4}
    \u{08B6}-\u{08C7}
    \u{08D3}-\u{0983}
    \u{0985}-\u{098C}
    \u{098F}-\u{0990}
    \u{0993}-\u{09A8}
    \u{09AA}-\u{09B0}
    \u{09B2}
    \u{09B6}-\u{09B9}
    \u{09BC}-\u{09C4}
    \u{09C7}-\u{09C8}
    \u{09CB}-\u{09CE}
    \u{09D7}
    \u{09DC}-\u{09DD}
    \u{09DF}-\u{09E3}
    \u{09E6}-\u{09FE}
    \u{0A01}-\u{0A03}
    \u{0A05}-\u{0A0A}
    \u{0A0F}-\u{0A10}
    \u{0A13}-\u{0A28}
    \u{0A2A}-\u{0A30}
    \u{0A32}-\u{0A33}
    \u{0A35}-\u{0A36}
    \u{0A38}-\u{0A39}
    \u{0A3C}
    \u{0A3E}-\u{0A42}
    \u{0A47}-\u{0A48}
    \u{0A4B}-\u{0A4D}
    \u{0A51}
    \u{0A59}-\u{0A5C}
    \u{0A5E}
    \u{0A66}-\u{0A76}
    \u{0A81}-\u{0A83}
    \u{0A85}-\u{0A8D}
    \u{0A8F}-\u{0A91}
    \u{0A93}-\u{0AA8}
    \u{0AAA}-\u{0AB0}
    \u{0AB2}-\u{0AB3}
    \u{0AB5}-\u{0AB9}
    \u{0ABC}-\u{0AC5}
    \u{0AC7}-\u{0AC9}
    \u{0ACB}-\u{0ACD}
    \u{0AD0}
    \u{0AE0}-\u{0AE3}
    \u{0AE6}-\u{0AF1}
    \u{0AF9}-\u{0AFF}
    \u{0B01}-\u{0B03}
    \u{0B05}-\u{0B0C}
    \u{0B0F}-\u{0B10}
    \u{0B13}-\u{0B28}
    \u{0B2A}-\u{0B30}
    \u{0B32}-\u{0B33}
    \u{0B35}-\u{0B39}
    \u{0B3C}-\u{0B44}
    \u{0B47}-\u{0B48}
    \u{0B4B}-\u{0B4D}
    \u{0B55}-\u{0B57}
    \u{0B5C}-\u{0B5D}
    \u{0B5F}-\u{0B63}
    \u{0B66}-\u{0B77}
    \u{0B82}-\u{0B83}
    \u{0B85}-\u{0B8A}
    \u{0B8E}-\u{0B90}
    \u{0B92}-\u{0B95}
    \u{0B99}-\u{0B9A}
    \u{0B9C}
    \u{0B9E}-\u{0B9F}
    \u{0BA3}-\u{0BA4}
    \u{0BA8}-\u{0BAA}
    \u{0BAE}-\u{0BB9}
    \u{0BBE}-\u{0BC2}
    \u{0BC6}-\u{0BC8}
    \u{0BCA}-\u{0BCD}
    \u{0BD0}
    \u{0BD7}
    \u{0BE6}-\u{0BFA}
    \u{0C00}-\u{0C0C}
    \u{0C0E}-\u{0C10}
    \u{0C12}-\u{0C28}
    \u{0C2A}-\u{0C39}
    \u{0C3D}-\u{0C44}
    \u{0C46}-\u{0C48}
    \u{0C4A}-\u{0C4D}
    \u{0C55}-\u{0C56}
    \u{0C58}-\u{0C5A}
    \u{0C60}-\u{0C63}
    \u{0C66}-\u{0C6F}
    \u{0C77}-\u{0C8C}
    \u{0C8E}-\u{0C90}
    \u{0C92}-\u{0CA8}
    \u{0CAA}-\u{0CB3}
    \u{0CB5}-\u{0CB9}
    \u{0CBC}-\u{0CC4}
    \u{0CC6}-\u{0CC8}
    \u{0CCA}-\u{0CCD}
    \u{0CD5}-\u{0CD6}
    \u{0CDE}
    \u{0CE0}-\u{0CE3}
    \u{0CE6}-\u{0CEF}
    \u{0CF1}-\u{0CF2}
    \u{0D00}-\u{0D0C}
    \u{0D0E}-\u{0D10}
    \u{0D12}-\u{0D44}
    \u{0D46}-\u{0D48}
    \u{0D4A}-\u{0D4F}
    \u{0D54}-\u{0D63}
    \u{0D66}-\u{0D7F}
    \u{0D81}-\u{0D83}
    \u{0D85}-\u{0D96}
    \u{0D9A}-\u{0DB1}
    \u{0DB3}-\u{0DBB}
    \u{0DBD}
    \u{0DC0}-\u{0DC6}
    \u{0DCA}
    \u{0DCF}-\u{0DD4}
    \u{0DD6}
    \u{0DD8}-\u{0DDF}
    \u{0DE6}-\u{0DEF}
    \u{0DF2}-\u{0DF4}
    \u{0E01}-\u{0E3A}
    \u{0E3F}-\u{0E5B}
    \u{0E81}-\u{0E82}
    \u{0E84}
    \u{0E86}-\u{0E8A}
    \u{0E8C}-\u{0EA3}
    \u{0EA5}
    \u{0EA7}-\u{0EBD}
    \u{0EC0}-\u{0EC4}
    \u{0EC6}
    \u{0EC8}-\u{0ECD}
    \u{0ED0}-\u{0ED9}
    \u{0EDC}-\u{0EDF}
    \u{0F00}-\u{0F47}
    \u{0F49}-\u{0F6C}
    \u{0F71}-\u{0F97}
    \u{0F99}-\u{0FBC}
    \u{0FBE}-\u{0FCC}
    \u{0FCE}-\u{0FDA}
    \u{1000}-\u{10C5}
    \u{10C7}
    \u{10CD}
    \u{10D0}-\u{10FF}
    \u{1160}-\u{1248}
    \u{124A}-\u{124D}
    \u{1250}-\u{1256}
    \u{1258}
    \u{125A}-\u{125D}
    \u{1260}-\u{1288}
    \u{128A}-\u{128D}
    \u{1290}-\u{12B0}
    \u{12B2}-\u{12B5}
    \u{12B8}-\u{12BE}
    \u{12C0}
    \u{12C2}-\u{12C5}
    \u{12C8}-\u{12D6}
    \u{12D8}-\u{1310}
    \u{1312}-\u{1315}
    \u{1318}-\u{135A}
    \u{135D}-\u{137C}
    \u{1380}-\u{1399}
    \u{13A0}-\u{13F5}
    \u{13F8}-\u{13FD}
    \u{1400}-\u{169C}
    \u{16A0}-\u{16F8}
    \u{1700}-\u{170C}
    \u{170E}-\u{1714}
    \u{1720}-\u{1736}
    \u{1740}-\u{1753}
    \u{1760}-\u{176C}
    \u{176E}-\u{1770}
    \u{1772}-\u{1773}
    \u{1780}-\u{17DD}
    \u{17E0}-\u{17E9}
    \u{17F0}-\u{17F9}
    \u{1800}-\u{180E}
    \u{1810}-\u{1819}
    \u{1820}-\u{1878}
    \u{1880}-\u{18AA}
    \u{18B0}-\u{18F5}
    \u{1900}-\u{191E}
    \u{1920}-\u{192B}
    \u{1930}-\u{193B}
    \u{1940}
    \u{1944}-\u{196D}
    \u{1970}-\u{1974}
    \u{1980}-\u{19AB}
    \u{19B0}-\u{19C9}
    \u{19D0}-\u{19DA}
    \u{19DE}-\u{1A1B}
    \u{1A1E}-\u{1A5E}
    \u{1A60}-\u{1A7C}
    \u{1A7F}-\u{1A89}
    \u{1A90}-\u{1A99}
    \u{1AA0}-\u{1AAD}
    \u{1AB0}-\u{1AC0}
    \u{1B00}-\u{1B4B}
    \u{1B50}-\u{1B7C}
    \u{1B80}-\u{1BF3}
    \u{1BFC}-\u{1C37}
    \u{1C3B}-\u{1C49}
    \u{1C4D}-\u{1C88}
    \u{1C90}-\u{1CBA}
    \u{1CBD}-\u{1CC7}
    \u{1CD0}-\u{1CFA}
    \u{1D00}-\u{1DF9}
    \u{1DFB}-\u{1F15}
    \u{1F18}-\u{1F1D}
    \u{1F20}-\u{1F45}
    \u{1F48}-\u{1F4D}
    \u{1F50}-\u{1F57}
    \u{1F59}
    \u{1F5B}
    \u{1F5D}
    \u{1F5F}-\u{1F7D}
    \u{1F80}-\u{1FB4}
    \u{1FB6}-\u{1FC4}
    \u{1FC6}-\u{1FD3}
    \u{1FD6}-\u{1FDB}
    \u{1FDD}-\u{1FEF}
    \u{1FF2}-\u{1FF4}
    \u{1FF6}-\u{1FFE}
    \u{2000}-\u{200F}
    \u{2011}-\u{2012}
    \u{2017}
    \u{201A}-\u{201B}
    \u{201E}-\u{201F}
    \u{2023}
    \u{2028}-\u{202F}
    \u{2031}
    \u{2034}
    \u{2036}-\u{203A}
    \u{203C}-\u{203D}
    \u{203F}-\u{2064}
    \u{2066}-\u{2071}
    \u{2075}-\u{207E}
    \u{2080}
    \u{2085}-\u{208E}
    \u{2090}-\u{209C}
    \u{20A0}-\u{20A8}
    \u{20AA}-\u{20AB}
    \u{20AD}-\u{20BF}
    \u{20D0}-\u{20F0}
    \u{2100}-\u{2102}
    \u{2104}
    \u{2106}-\u{2108}
    \u{210A}-\u{2112}
    \u{2114}-\u{2115}
    \u{2117}-\u{2120}
    \u{2123}-\u{2125}
    \u{2127}-\u{212A}
    \u{212C}-\u{2152}
    \u{2155}-\u{215A}
    \u{215F}
    \u{216C}-\u{216F}
    \u{217A}-\u{2188}
    \u{218A}-\u{218B}
    \u{219A}-\u{21B7}
    \u{21BA}-\u{21D1}
    \u{21D3}
    \u{21D5}-\u{21E6}
    \u{21E8}-\u{21FF}
    \u{2201}
    \u{2204}-\u{2206}
    \u{2209}-\u{220A}
    \u{220C}-\u{220E}
    \u{2210}
    \u{2212}-\u{2214}
    \u{2216}-\u{2219}
    \u{221B}-\u{221C}
    \u{2221}-\u{2222}
    \u{2224}
    \u{2226}
    \u{222D}
    \u{222F}-\u{2233}
    \u{2238}-\u{223B}
    \u{223E}-\u{2247}
    \u{2249}-\u{224B}
    \u{224D}-\u{2251}
    \u{2253}-\u{225F}
    \u{2262}-\u{2263}
    \u{2268}-\u{2269}
    \u{226C}-\u{226D}
    \u{2270}-\u{2281}
    \u{2284}-\u{2285}
    \u{2288}-\u{2294}
    \u{2296}-\u{2298}
    \u{229A}-\u{22A4}
    \u{22A6}-\u{22BE}
    \u{22C0}-\u{2311}
    \u{2313}-\u{2319}
    \u{231C}-\u{2328}
    \u{232B}-\u{23E8}
    \u{23ED}-\u{23EF}
    \u{23F1}-\u{23F2}
    \u{23F4}-\u{2426}
    \u{2440}-\u{244A}
    \u{24EA}
    \u{254C}-\u{254F}
    \u{2574}-\u{257F}
    \u{2590}-\u{2591}
    \u{2596}-\u{259F}
    \u{25A2}
    \u{25AA}-\u{25B1}
    \u{25B4}-\u{25B5}
    \u{25B8}-\u{25BB}
    \u{25BE}-\u{25BF}
    \u{25C2}-\u{25C5}
    \u{25C9}-\u{25CA}
    \u{25CC}-\u{25CD}
    \u{25D2}-\u{25E1}
    \u{25E6}-\u{25EE}
    \u{25F0}-\u{25FC}
    \u{25FF}-\u{2604}
    \u{2607}-\u{2608}
    \u{260A}-\u{260D}
    \u{2610}-\u{2613}
    \u{2616}-\u{261B}
    \u{261D}
    \u{261F}-\u{263F}
    \u{2641}
    \u{2643}-\u{2647}
    \u{2654}-\u{265F}
    \u{2662}
    \u{2666}
    \u{266B}
    \u{266E}
    \u{2670}-\u{267E}
    \u{2680}-\u{2692}
    \u{2694}-\u{269D}
    \u{26A0}
    \u{26A2}-\u{26A9}
    \u{26AC}-\u{26BC}
    \u{26C0}-\u{26C3}
    \u{26E2}
    \u{26E4}-\u{26E7}
    \u{2700}-\u{2704}
    \u{2706}-\u{2709}
    \u{270C}-\u{2727}
    \u{2729}-\u{273C}
    \u{273E}-\u{274B}
    \u{274D}
    \u{274F}-\u{2752}
    \u{2756}
    \u{2758}-\u{2775}
    \u{2780}-\u{2794}
    \u{2798}-\u{27AF}
    \u{27B1}-\u{27BE}
    \u{27C0}-\u{27E5}
    \u{27EE}-\u{2984}
    \u{2987}-\u{2B1A}
    \u{2B1D}-\u{2B4F}
    \u{2B51}-\u{2B54}
    \u{2B5A}-\u{2B73}
    \u{2B76}-\u{2B95}
    \u{2B97}-\u{2C2E}
    \u{2C30}-\u{2C5E}
    \u{2C60}-\u{2CF3}
    \u{2CF9}-\u{2D25}
    \u{2D27}
    \u{2D2D}
    \u{2D30}-\u{2D67}
    \u{2D6F}-\u{2D70}
    \u{2D7F}-\u{2D96}
    \u{2DA0}-\u{2DA6}
    \u{2DA8}-\u{2DAE}
    \u{2DB0}-\u{2DB6}
    \u{2DB8}-\u{2DBE}
    \u{2DC0}-\u{2DC6}
    \u{2DC8}-\u{2DCE}
    \u{2DD0}-\u{2DD6}
    \u{2DD8}-\u{2DDE}
    \u{2DE0}-\u{2E52}
    \u{303F}
    \u{4DC0}-\u{4DFF}
    \u{A4D0}-\u{A62B}
    \u{A640}-\u{A6F7}
    \u{A700}-\u{A7BF}
    \u{A7C2}-\u{A7CA}
    \u{A7F5}-\u{A82C}
    \u{A830}-\u{A839}
    \u{A840}-\u{A877}
    \u{A880}-\u{A8C5}
    \u{A8CE}-\u{A8D9}
    \u{A8E0}-\u{A953}
    \u{A95F}
    \u{A980}-\u{A9CD}
    \u{A9CF}-\u{A9D9}
    \u{A9DE}-\u{A9FE}
    \u{AA00}-\u{AA36}
    \u{AA40}-\u{AA4D}
    \u{AA50}-\u{AA59}
    \u{AA5C}-\u{AAC2}
    \u{AADB}-\u{AAF6}
    \u{AB01}-\u{AB06}
    \u{AB09}-\u{AB0E}
    \u{AB11}-\u{AB16}
    \u{AB20}-\u{AB26}
    \u{AB28}-\u{AB2E}
    \u{AB30}-\u{AB6B}
    \u{AB70}-\u{ABED}
    \u{ABF0}-\u{ABF9}
    \u{D7B0}-\u{D7C6}
    \u{D7CB}-\u{D7FB}
    \u{FB00}-\u{FB06}
    \u{FB13}-\u{FB17}
    \u{FB1D}-\u{FB36}
    \u{FB38}-\u{FB3C}
    \u{FB3E}
    \u{FB40}-\u{FB41}
    \u{FB43}-\u{FB44}
    \u{FB46}-\u{FBC1}
    \u{FBD3}-\u{FD3F}
    \u{FD50}-\u{FD8F}
    \u{FD92}-\u{FDC7}
    \u{FDF0}-\u{FDFD}
    \u{FE20}-\u{FE2F}
    \u{FE70}-\u{FE74}
    \u{FE76}-\u{FEFC}
    \u{FEFF}
    \u{FFF9}-\u{FFFC}
    \u{10000}-\u{1000B}
    \u{1000D}-\u{10026}
    \u{10028}-\u{1003A}
    \u{1003C}-\u{1003D}
    \u{1003F}-\u{1004D}
    \u{10050}-\u{1005D}
    \u{10080}-\u{100FA}
    \u{10100}-\u{10102}
    \u{10107}-\u{10133}
    \u{10137}-\u{1018E}
    \u{10190}-\u{1019C}
    \u{101A0}
    \u{101D0}-\u{101FD}
    \u{10280}-\u{1029C}
    \u{102A0}-\u{102D0}
    \u{102E0}-\u{102FB}
    \u{10300}-\u{10323}
    \u{1032D}-\u{1034A}
    \u{10350}-\u{1037A}
    \u{10380}-\u{1039D}
    \u{1039F}-\u{103C3}
    \u{103C8}-\u{103D5}
    \u{10400}-\u{1049D}
    \u{104A0}-\u{104A9}
    \u{104B0}-\u{104D3}
    \u{104D8}-\u{104FB}
    \u{10500}-\u{10527}
    \u{10530}-\u{10563}
    \u{1056F}
    \u{10600}-\u{10736}
    \u{10740}-\u{10755}
    \u{10760}-\u{10767}
    \u{10800}-\u{10805}
    \u{10808}
    \u{1080A}-\u{10835}
    \u{10837}-\u{10838}
    \u{1083C}
    \u{1083F}-\u{10855}
    \u{10857}-\u{1089E}
    \u{108A7}-\u{108AF}
    \u{108E0}-\u{108F2}
    \u{108F4}-\u{108F5}
    \u{108FB}-\u{1091B}
    \u{1091F}-\u{10939}
    \u{1093F}
    \u{10980}-\u{109B7}
    \u{109BC}-\u{109CF}
    \u{109D2}-\u{10A03}
    \u{10A05}-\u{10A06}
    \u{10A0C}-\u{10A13}
    \u{10A15}-\u{10A17}
    \u{10A19}-\u{10A35}
    \u{10A38}-\u{10A3A}
    \u{10A3F}-\u{10A48}
    \u{10A50}-\u{10A58}
    \u{10A60}-\u{10A9F}
    \u{10AC0}-\u{10AE6}
    \u{10AEB}-\u{10AF6}
    \u{10B00}-\u{10B35}
    \u{10B39}-\u{10B55}
    \u{10B58}-\u{10B72}
    \u{10B78}-\u{10B91}
    \u{10B99}-\u{10B9C}
    \u{10BA9}-\u{10BAF}
    \u{10C00}-\u{10C48}
    \u{10C80}-\u{10CB2}
    \u{10CC0}-\u{10CF2}
    \u{10CFA}-\u{10D27}
    \u{10D30}-\u{10D39}
    \u{10E60}-\u{10E7E}
    \u{10E80}-\u{10EA9}
    \u{10EAB}-\u{10EAD}
    \u{10EB0}-\u{10EB1}
    \u{10F00}-\u{10F27}
    \u{10F30}-\u{10F59}
    \u{10FB0}-\u{10FCB}
    \u{10FE0}-\u{10FF6}
    \u{11000}-\u{1104D}
    \u{11052}-\u{1106F}
    \u{1107F}-\u{110C1}
    \u{110CD}
    \u{110D0}-\u{110E8}
    \u{110F0}-\u{110F9}
    \u{11100}-\u{11134}
    \u{11136}-\u{11147}
    \u{11150}-\u{11176}
    \u{11180}-\u{111DF}
    \u{111E1}-\u{111F4}
    \u{11200}-\u{11211}
    \u{11213}-\u{1123E}
    \u{11280}-\u{11286}
    \u{11288}
    \u{1128A}-\u{1128D}
    \u{1128F}-\u{1129D}
    \u{1129F}-\u{112A9}
    \u{112B0}-\u{112EA}
    \u{112F0}-\u{112F9}
    \u{11300}-\u{11303}
    \u{11305}-\u{1130C}
    \u{1130F}-\u{11310}
    \u{11313}-\u{11328}
    \u{1132A}-\u{11330}
    \u{11332}-\u{11333}
    \u{11335}-\u{11339}
    \u{1133B}-\u{11344}
    \u{11347}-\u{11348}
    \u{1134B}-\u{1134D}
    \u{11350}
    \u{11357}
    \u{1135D}-\u{11363}
    \u{11366}-\u{1136C}
    \u{11370}-\u{11374}
    \u{11400}-\u{1145B}
    \u{1145D}-\u{11461}
    \u{11480}-\u{114C7}
    \u{114D0}-\u{114D9}
    \u{11580}-\u{115B5}
    \u{115B8}-\u{115DD}
    \u{11600}-\u{11644}
    \u{11650}-\u{11659}
    \u{11660}-\u{1166C}
    \u{11680}-\u{116B8}
    \u{116C0}-\u{116C9}
    \u{11700}-\u{1171A}
    \u{1171D}-\u{1172B}
    \u{11730}-\u{1173F}
    \u{11800}-\u{1183B}
    \u{118A0}-\u{118F2}
    \u{118FF}-\u{11906}
    \u{11909}
    \u{1190C}-\u{11913}
    \u{11915}-\u{11916}
    \u{11918}-\u{11935}
    \u{11937}-\u{11938}
    \u{1193B}-\u{11946}
    \u{11950}-\u{11959}
    \u{119A0}-\u{119A7}
    \u{119AA}-\u{119D7}
    \u{119DA}-\u{119E4}
    \u{11A00}-\u{11A47}
    \u{11A50}-\u{11AA2}
    \u{11AC0}-\u{11AF8}
    \u{11C00}-\u{11C08}
    \u{11C0A}-\u{11C36}
    \u{11C38}-\u{11C45}
    \u{11C50}-\u{11C6C}
    \u{11C70}-\u{11C8F}
    \u{11C92}-\u{11CA7}
    \u{11CA9}-\u{11CB6}
    \u{11D00}-\u{11D06}
    \u{11D08}-\u{11D09}
    \u{11D0B}-\u{11D36}
    \u{11D3A}
    \u{11D3C}-\u{11D3D}
    \u{11D3F}-\u{11D47}
    \u{11D50}-\u{11D59}
    \u{11D60}-\u{11D65}
    \u{11D67}-\u{11D68}
    \u{11D6A}-\u{11D8E}
    \u{11D90}-\u{11D91}
    \u{11D93}-\u{11D98}
    \u{11DA0}-\u{11DA9}
    \u{11EE0}-\u{11EF8}
    \u{11FB0}
    \u{11FC0}-\u{11FF1}
    \u{11FFF}-\u{12399}
    \u{12400}-\u{1246E}
    \u{12470}-\u{12474}
    \u{12480}-\u{12543}
    \u{13000}-\u{1342E}
    \u{13430}-\u{13438}
    \u{14400}-\u{14646}
    \u{16800}-\u{16A38}
    \u{16A40}-\u{16A5E}
    \u{16A60}-\u{16A69}
    \u{16A6E}-\u{16A6F}
    \u{16AD0}-\u{16AED}
    \u{16AF0}-\u{16AF5}
    \u{16B00}-\u{16B45}
    \u{16B50}-\u{16B59}
    \u{16B5B}-\u{16B61}
    \u{16B63}-\u{16B77}
    \u{16B7D}-\u{16B8F}
    \u{16E40}-\u{16E9A}
    \u{16F00}-\u{16F4A}
    \u{16F4F}-\u{16F87}
    \u{16F8F}-\u{16F9F}
    \u{1BC00}-\u{1BC6A}
    \u{1BC70}-\u{1BC7C}
    \u{1BC80}-\u{1BC88}
    \u{1BC90}-\u{1BC99}
    \u{1BC9C}-\u{1BCA3}
    \u{1D000}-\u{1D0F5}
    \u{1D100}-\u{1D126}
    \u{1D129}-\u{1D1E8}
    \u{1D200}-\u{1D245}
    \u{1D2E0}-\u{1D2F3}
    \u{1D300}-\u{1D356}
    \u{1D360}-\u{1D378}
    \u{1D400}-\u{1D454}
    \u{1D456}-\u{1D49C}
    \u{1D49E}-\u{1D49F}
    \u{1D4A2}
    \u{1D4A5}-\u{1D4A6}
    \u{1D4A9}-\u{1D4AC}
    \u{1D4AE}-\u{1D4B9}
    \u{1D4BB}
    \u{1D4BD}-\u{1D4C3}
    \u{1D4C5}-\u{1D505}
    \u{1D507}-\u{1D50A}
    \u{1D50D}-\u{1D514}
    \u{1D516}-\u{1D51C}
    \u{1D51E}-\u{1D539}
    \u{1D53B}-\u{1D53E}
    \u{1D540}-\u{1D544}
    \u{1D546}
    \u{1D54A}-\u{1D550}
    \u{1D552}-\u{1D6A5}
    \u{1D6A8}-\u{1D7CB}
    \u{1D7CE}-\u{1DA8B}
    \u{1DA9B}-\u{1DA9F}
    \u{1DAA1}-\u{1DAAF}
    \u{1E000}-\u{1E006}
    \u{1E008}-\u{1E018}
    \u{1E01B}-\u{1E021}
    \u{1E023}-\u{1E024}
    \u{1E026}-\u{1E02A}
    \u{1E100}-\u{1E12C}
    \u{1E130}-\u{1E13D}
    \u{1E140}-\u{1E149}
    \u{1E14E}-\u{1E14F}
    \u{1E2C0}-\u{1E2F9}
    \u{1E2FF}
    \u{1E800}-\u{1E8C4}
    \u{1E8C7}-\u{1E8D6}
    \u{1E900}-\u{1E94B}
    \u{1E950}-\u{1E959}
    \u{1E95E}-\u{1E95F}
    \u{1EC71}-\u{1ECB4}
    \u{1ED01}-\u{1ED3D}
    \u{1EE00}-\u{1EE03}
    \u{1EE05}-\u{1EE1F}
    \u{1EE21}-\u{1EE22}
    \u{1EE24}
    \u{1EE27}
    \u{1EE29}-\u{1EE32}
    \u{1EE34}-\u{1EE37}
    \u{1EE39}
    \u{1EE3B}
    \u{1EE42}
    \u{1EE47}
    \u{1EE49}
    \u{1EE4B}
    \u{1EE4D}-\u{1EE4F}
    \u{1EE51}-\u{1EE52}
    \u{1EE54}
    \u{1EE57}
    \u{1EE59}
    \u{1EE5B}
    \u{1EE5D}
    \u{1EE5F}
    \u{1EE61}-\u{1EE62}
    \u{1EE64}
    \u{1EE67}-\u{1EE6A}
    \u{1EE6C}-\u{1EE72}
    \u{1EE74}-\u{1EE77}
    \u{1EE79}-\u{1EE7C}
    \u{1EE7E}
    \u{1EE80}-\u{1EE89}
    \u{1EE8B}-\u{1EE9B}
    \u{1EEA1}-\u{1EEA3}
    \u{1EEA5}-\u{1EEA9}
    \u{1EEAB}-\u{1EEBB}
    \u{1EEF0}-\u{1EEF1}
    \u{1F000}-\u{1F003}
    \u{1F005}-\u{1F02B}
    \u{1F030}-\u{1F093}
    \u{1F0A0}-\u{1F0AE}
    \u{1F0B1}-\u{1F0BF}
    \u{1F0C1}-\u{1F0CE}
    \u{1F0D1}-\u{1F0F5}
    \u{1F10B}-\u{1F10F}
    \u{1F12E}-\u{1F12F}
    \u{1F16A}-\u{1F16F}
    \u{1F1AD}
    \u{1F1E6}-\u{1F1FF}
    \u{1F321}-\u{1F32C}
    \u{1F336}
    \u{1F37D}
    \u{1F394}-\u{1F39F}
    \u{1F3CB}-\u{1F3CE}
    \u{1F3D4}-\u{1F3DF}
    \u{1F3F1}-\u{1F3F3}
    \u{1F3F5}-\u{1F3F7}
    \u{1F43F}
    \u{1F441}
    \u{1F4FD}-\u{1F4FE}
    \u{1F53E}-\u{1F54A}
    \u{1F54F}
    \u{1F568}-\u{1F579}
    \u{1F57B}-\u{1F594}
    \u{1F597}-\u{1F5A3}
    \u{1F5A5}-\u{1F5FA}
    \u{1F650}-\u{1F67F}
    \u{1F6C6}-\u{1F6CB}
    \u{1F6CD}-\u{1F6CF}
    \u{1F6D3}-\u{1F6D4}
    \u{1F6E0}-\u{1F6EA}
    \u{1F6F0}-\u{1F6F3}
    \u{1F700}-\u{1F773}
    \u{1F780}-\u{1F7D8}
    \u{1F800}-\u{1F80B}
    \u{1F810}-\u{1F847}
    \u{1F850}-\u{1F859}
    \u{1F860}-\u{1F887}
    \u{1F890}-\u{1F8AD}
    \u{1F8B0}-\u{1F8B1}
    \u{1F900}-\u{1F90B}
    \u{1F93B}
    \u{1F946}
    \u{1FA00}-\u{1FA53}
    \u{1FA60}-\u{1FA6D}
    \u{1FB00}-\u{1FB92}
    \u{1FB94}-\u{1FBCA}
    \u{1FBF0}-\u{1FBF9}
    \u{E0001}
    \u{E0020}-\u{E007F}
  ).join }]/
end
PK"}$[�6���A�Aruby/reline/windows.rbnu�[���require 'fiddle/import'

class Reline::Windows
  def self.encoding
    Encoding::UTF_8
  end

  def self.win?
    true
  end

  def self.win_legacy_console?
    @@legacy_console
  end

  def self.set_default_key_bindings(config)
    {
      [224, 72] => :ed_prev_history, # ↑
      [224, 80] => :ed_next_history, # ↓
      [224, 77] => :ed_next_char,    # →
      [224, 75] => :ed_prev_char,    # ←
      [224, 83] => :key_delete,      # Del
      [224, 71] => :ed_move_to_beg,  # Home
      [224, 79] => :ed_move_to_end,  # End
      [  0, 41] => :ed_unassigned,   # input method on/off
      [  0, 72] => :ed_prev_history, # ↑
      [  0, 80] => :ed_next_history, # ↓
      [  0, 77] => :ed_next_char,    # →
      [  0, 75] => :ed_prev_char,    # ←
      [  0, 83] => :key_delete,      # Del
      [  0, 71] => :ed_move_to_beg,  # Home
      [  0, 79] => :ed_move_to_end   # End
    }.each_pair do |key, func|
      config.add_default_key_binding_by_keymap(:emacs, key, func)
      config.add_default_key_binding_by_keymap(:vi_insert, key, func)
      config.add_default_key_binding_by_keymap(:vi_command, key, func)
    end

    {
      [27, 32] => :em_set_mark,             # M-<space>
      [24, 24] => :em_exchange_mark,        # C-x C-x
    }.each_pair do |key, func|
      config.add_default_key_binding_by_keymap(:emacs, key, func)
    end

    # Emulate ANSI key sequence.
    {
      [27, 91, 90] => :completion_journey_up, # S-Tab
    }.each_pair do |key, func|
      config.add_default_key_binding_by_keymap(:emacs, key, func)
      config.add_default_key_binding_by_keymap(:vi_insert, key, func)
    end
  end

  if defined? JRUBY_VERSION
    require 'win32api'
  else
    class Win32API
      DLL = {}
      TYPEMAP = {"0" => Fiddle::TYPE_VOID, "S" => Fiddle::TYPE_VOIDP, "I" => Fiddle::TYPE_LONG}
      POINTER_TYPE = Fiddle::SIZEOF_VOIDP == Fiddle::SIZEOF_LONG_LONG ? 'q*' : 'l!*'

      WIN32_TYPES = "VPpNnLlIi"
      DL_TYPES = "0SSI"

      def initialize(dllname, func, import, export = "0", calltype = :stdcall)
        @proto = [import].join.tr(WIN32_TYPES, DL_TYPES).sub(/^(.)0*$/, '\1')
        import = @proto.chars.map {|win_type| TYPEMAP[win_type.tr(WIN32_TYPES, DL_TYPES)]}
        export = TYPEMAP[export.tr(WIN32_TYPES, DL_TYPES)]
        calltype = Fiddle::Importer.const_get(:CALL_TYPE_TO_ABI)[calltype]

        handle = DLL[dllname] ||=
                 begin
                   Fiddle.dlopen(dllname)
                 rescue Fiddle::DLError
                   raise unless File.extname(dllname).empty?
                   Fiddle.dlopen(dllname + ".dll")
                 end

        @func = Fiddle::Function.new(handle[func], import, export, calltype)
      rescue Fiddle::DLError => e
        raise LoadError, e.message, e.backtrace
      end

      def call(*args)
        import = @proto.split("")
        args.each_with_index do |x, i|
          args[i], = [x == 0 ? nil : x].pack("p").unpack(POINTER_TYPE) if import[i] == "S"
          args[i], = [x].pack("I").unpack("i") if import[i] == "I"
        end
        ret, = @func.call(*args)
        return ret || 0
      end
    end
  end

  VK_RETURN = 0x0D
  VK_MENU = 0x12
  VK_LMENU = 0xA4
  VK_CONTROL = 0x11
  VK_SHIFT = 0x10
  VK_DIVIDE = 0x6F

  KEY_EVENT = 0x01
  WINDOW_BUFFER_SIZE_EVENT = 0x04

  CAPSLOCK_ON = 0x0080
  ENHANCED_KEY = 0x0100
  LEFT_ALT_PRESSED = 0x0002
  LEFT_CTRL_PRESSED = 0x0008
  NUMLOCK_ON = 0x0020
  RIGHT_ALT_PRESSED = 0x0001
  RIGHT_CTRL_PRESSED = 0x0004
  SCROLLLOCK_ON = 0x0040
  SHIFT_PRESSED = 0x0010

  VK_TAB = 0x09
  VK_END = 0x23
  VK_HOME = 0x24
  VK_LEFT = 0x25
  VK_UP = 0x26
  VK_RIGHT = 0x27
  VK_DOWN = 0x28
  VK_DELETE = 0x2E

  STD_INPUT_HANDLE = -10
  STD_OUTPUT_HANDLE = -11
  FILE_TYPE_PIPE = 0x0003
  FILE_NAME_INFO = 2
  @@getwch = Win32API.new('msvcrt', '_getwch', [], 'I')
  @@kbhit = Win32API.new('msvcrt', '_kbhit', [], 'I')
  @@GetKeyState = Win32API.new('user32', 'GetKeyState', ['L'], 'L')
  @@GetConsoleScreenBufferInfo = Win32API.new('kernel32', 'GetConsoleScreenBufferInfo', ['L', 'P'], 'L')
  @@SetConsoleCursorPosition = Win32API.new('kernel32', 'SetConsoleCursorPosition', ['L', 'L'], 'L')
  @@GetStdHandle = Win32API.new('kernel32', 'GetStdHandle', ['L'], 'L')
  @@FillConsoleOutputCharacter = Win32API.new('kernel32', 'FillConsoleOutputCharacter', ['L', 'L', 'L', 'L', 'P'], 'L')
  @@ScrollConsoleScreenBuffer = Win32API.new('kernel32', 'ScrollConsoleScreenBuffer', ['L', 'P', 'P', 'L', 'P'], 'L')
  @@hConsoleHandle = @@GetStdHandle.call(STD_OUTPUT_HANDLE)
  @@hConsoleInputHandle = @@GetStdHandle.call(STD_INPUT_HANDLE)
  @@GetNumberOfConsoleInputEvents = Win32API.new('kernel32', 'GetNumberOfConsoleInputEvents', ['L', 'P'], 'L')
  @@ReadConsoleInputW = Win32API.new('kernel32', 'ReadConsoleInputW', ['L', 'P', 'L', 'P'], 'L')
  @@GetFileType = Win32API.new('kernel32', 'GetFileType', ['L'], 'L')
  @@GetFileInformationByHandleEx = Win32API.new('kernel32', 'GetFileInformationByHandleEx', ['L', 'I', 'P', 'L'], 'I')
  @@FillConsoleOutputAttribute = Win32API.new('kernel32', 'FillConsoleOutputAttribute', ['L', 'L', 'L', 'L', 'P'], 'L')
  @@SetConsoleCursorInfo = Win32API.new('kernel32', 'SetConsoleCursorInfo', ['L', 'P'], 'L')

  @@GetConsoleMode = Win32API.new('kernel32', 'GetConsoleMode', ['L', 'P'], 'L')
  @@SetConsoleMode = Win32API.new('kernel32', 'SetConsoleMode', ['L', 'L'], 'L')
  @@WaitForSingleObject = Win32API.new('kernel32', 'WaitForSingleObject', ['L', 'L'], 'L')
  ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4

  private_class_method def self.getconsolemode
    mode = "\000\000\000\000"
    @@GetConsoleMode.call(@@hConsoleHandle, mode)
    mode.unpack1('L')
  end

  private_class_method def self.setconsolemode(mode)
    @@SetConsoleMode.call(@@hConsoleHandle, mode)
  end

  @@legacy_console = (getconsolemode() & ENABLE_VIRTUAL_TERMINAL_PROCESSING == 0)
  #if @@legacy_console
  #  setconsolemode(getconsolemode() | ENABLE_VIRTUAL_TERMINAL_PROCESSING)
  #  @@legacy_console = (getconsolemode() & ENABLE_VIRTUAL_TERMINAL_PROCESSING == 0)
  #end

  @@input_buf = []
  @@output_buf = []

  @@output = STDOUT

  def self.msys_tty?(io = @@hConsoleInputHandle)
    # check if fd is a pipe
    if @@GetFileType.call(io) != FILE_TYPE_PIPE
      return false
    end

    bufsize = 1024
    p_buffer = "\0" * bufsize
    res = @@GetFileInformationByHandleEx.call(io, FILE_NAME_INFO, p_buffer, bufsize - 2)
    return false if res == 0

    # get pipe name: p_buffer layout is:
    #   struct _FILE_NAME_INFO {
    #     DWORD FileNameLength;
    #     WCHAR FileName[1];
    #   } FILE_NAME_INFO
    len = p_buffer[0, 4].unpack1("L")
    name = p_buffer[4, len].encode(Encoding::UTF_8, Encoding::UTF_16LE, invalid: :replace)

    # Check if this could be a MSYS2 pty pipe ('\msys-XXXX-ptyN-XX')
    # or a cygwin pty pipe ('\cygwin-XXXX-ptyN-XX')
    name =~ /(msys-|cygwin-).*-pty/ ? true : false
  end

  KEY_MAP = [
    # It's treated as Meta+Enter on Windows.
    [ { control_keys: :CTRL,  virtual_key_code: 0x0D }, "\e\r".bytes ],
    [ { control_keys: :SHIFT, virtual_key_code: 0x0D }, "\e\r".bytes ],

    # It's treated as Meta+Space on Windows.
    [ { control_keys: :CTRL,  char_code: 0x20 }, "\e ".bytes ],

    # Emulate getwch() key sequences.
    [ { control_keys: [], virtual_key_code: VK_UP },     [0, 72] ],
    [ { control_keys: [], virtual_key_code: VK_DOWN },   [0, 80] ],
    [ { control_keys: [], virtual_key_code: VK_RIGHT },  [0, 77] ],
    [ { control_keys: [], virtual_key_code: VK_LEFT },   [0, 75] ],
    [ { control_keys: [], virtual_key_code: VK_DELETE }, [0, 83] ],
    [ { control_keys: [], virtual_key_code: VK_HOME },   [0, 71] ],
    [ { control_keys: [], virtual_key_code: VK_END },    [0, 79] ],

    # Emulate ANSI key sequence.
    [ { control_keys: :SHIFT, virtual_key_code: VK_TAB }, [27, 91, 90] ],
  ]

  @@hsg = nil

  def self.process_key_event(repeat_count, virtual_key_code, virtual_scan_code, char_code, control_key_state)

    # high-surrogate
    if 0xD800 <= char_code and char_code <= 0xDBFF
      @@hsg = char_code
      return
    end
    # low-surrogate
    if 0xDC00 <= char_code and char_code <= 0xDFFF
      if @@hsg
        char_code = 0x10000 + (@@hsg - 0xD800) * 0x400 + char_code - 0xDC00
        @@hsg = nil
      else
        # no high-surrogate. ignored.
        return
      end
    else
      # ignore high-surrogate without low-surrogate if there
      @@hsg = nil
    end

    key = KeyEventRecord.new(virtual_key_code, char_code, control_key_state)

    match = KEY_MAP.find { |args,| key.matches?(**args) }
    unless match.nil?
      @@output_buf.concat(match.last)
      return
    end

    # no char, only control keys
    return if key.char_code == 0 and key.control_keys.any?

    @@output_buf.push("\e".ord) if key.control_keys.include?(:ALT)

    @@output_buf.concat(key.char.bytes)
  end

  def self.check_input_event
    num_of_events = 0.chr * 8
    while @@output_buf.empty?
      Reline.core.line_editor.resize
      if @@WaitForSingleObject.(@@hConsoleInputHandle, 100) != 0 # max 0.1 sec
        # prevent for background consolemode change
        @@legacy_console = (getconsolemode() & ENABLE_VIRTUAL_TERMINAL_PROCESSING == 0)
        next
      end
      next if @@GetNumberOfConsoleInputEvents.(@@hConsoleInputHandle, num_of_events) == 0 or num_of_events.unpack1('L') == 0
      input_records = 0.chr * 20 * 80
      read_event = 0.chr * 4
      if @@ReadConsoleInputW.(@@hConsoleInputHandle, input_records, 80, read_event) != 0
        read_events = read_event.unpack1('L')
        0.upto(read_events) do |idx|
          input_record = input_records[idx * 20, 20]
          event = input_record[0, 2].unpack1('s*')
          case event
          when WINDOW_BUFFER_SIZE_EVENT
            @@winch_handler.()
          when KEY_EVENT
            key_down = input_record[4, 4].unpack1('l*')
            repeat_count = input_record[8, 2].unpack1('s*')
            virtual_key_code = input_record[10, 2].unpack1('s*')
            virtual_scan_code = input_record[12, 2].unpack1('s*')
            char_code = input_record[14, 2].unpack1('S*')
            control_key_state = input_record[16, 2].unpack1('S*')
            is_key_down = key_down.zero? ? false : true
            if is_key_down
              process_key_event(repeat_count, virtual_key_code, virtual_scan_code, char_code, control_key_state)
            end
          end
        end
      end
    end
  end

  def self.getc
    check_input_event
    @@output_buf.shift
  end

  def self.ungetc(c)
    @@output_buf.unshift(c)
  end

  def self.in_pasting?
    not self.empty_buffer?
  end

  def self.empty_buffer?
    if not @@output_buf.empty?
      false
    elsif @@kbhit.call == 0
      true
    else
      false
    end
  end

  def self.get_console_screen_buffer_info
    # CONSOLE_SCREEN_BUFFER_INFO
    # [ 0,2] dwSize.X
    # [ 2,2] dwSize.Y
    # [ 4,2] dwCursorPositions.X
    # [ 6,2] dwCursorPositions.Y
    # [ 8,2] wAttributes
    # [10,2] srWindow.Left
    # [12,2] srWindow.Top
    # [14,2] srWindow.Right
    # [16,2] srWindow.Bottom
    # [18,2] dwMaximumWindowSize.X
    # [20,2] dwMaximumWindowSize.Y
    csbi = 0.chr * 22
    return if @@GetConsoleScreenBufferInfo.call(@@hConsoleHandle, csbi) == 0
    csbi
  end

  def self.get_screen_size
    unless csbi = get_console_screen_buffer_info
      return [1, 1]
    end
    csbi[0, 4].unpack('SS').reverse
  end

  def self.cursor_pos
    unless csbi = get_console_screen_buffer_info
      return Reline::CursorPos.new(0, 0)
    end
    x = csbi[4, 2].unpack1('s')
    y = csbi[6, 2].unpack1('s')
    Reline::CursorPos.new(x, y)
  end

  def self.move_cursor_column(val)
    @@SetConsoleCursorPosition.call(@@hConsoleHandle, cursor_pos.y * 65536 + val)
  end

  def self.move_cursor_up(val)
    if val > 0
      y = cursor_pos.y - val
      y = 0 if y < 0
      @@SetConsoleCursorPosition.call(@@hConsoleHandle, y * 65536 + cursor_pos.x)
    elsif val < 0
      move_cursor_down(-val)
    end
  end

  def self.move_cursor_down(val)
    if val > 0
      return unless csbi = get_console_screen_buffer_info
      screen_height = get_screen_size.first
      y = cursor_pos.y + val
      y = screen_height - 1 if y > (screen_height - 1)
      @@SetConsoleCursorPosition.call(@@hConsoleHandle, (cursor_pos.y + val) * 65536 + cursor_pos.x)
    elsif val < 0
      move_cursor_up(-val)
    end
  end

  def self.erase_after_cursor
    return unless csbi = get_console_screen_buffer_info
    attributes = csbi[8, 2].unpack1('S')
    cursor = csbi[4, 4].unpack1('L')
    written = 0.chr * 4
    @@FillConsoleOutputCharacter.call(@@hConsoleHandle, 0x20, get_screen_size.last - cursor_pos.x, cursor, written)
    @@FillConsoleOutputAttribute.call(@@hConsoleHandle, attributes, get_screen_size.last - cursor_pos.x, cursor, written)
  end

  def self.scroll_down(val)
    return if val < 0
    return unless csbi = get_console_screen_buffer_info
    buffer_width, buffer_lines, x, y, attributes, window_left, window_top, window_bottom = csbi.unpack('ssssSssx2s')
    screen_height = window_bottom - window_top + 1
    val = screen_height if val > screen_height

    if @@legacy_console || window_left != 0
      # unless ENABLE_VIRTUAL_TERMINAL,
      # if srWindow.Left != 0 then it's conhost.exe hosted console
      # and puts "\n" causes horizontal scroll. its glitch.
      # FYI irb write from culumn 1, so this gives no gain.
      scroll_rectangle = [0, val, buffer_width, buffer_lines - val].pack('s4')
      destination_origin = 0 # y * 65536 + x
      fill = [' '.ord, attributes].pack('SS')
      @@ScrollConsoleScreenBuffer.call(@@hConsoleHandle, scroll_rectangle, nil, destination_origin, fill)
    else
      origin_x = x + 1
      origin_y = y - window_top + 1
      @@output.write [
        (origin_y != screen_height) ? "\e[#{screen_height};H" : nil,
        "\n" * val,
        (origin_y != screen_height or !x.zero?) ? "\e[#{origin_y};#{origin_x}H" : nil
      ].join
    end
  end

  def self.clear_screen
    if @@legacy_console
      return unless csbi = get_console_screen_buffer_info
      buffer_width, _buffer_lines, attributes, window_top, window_bottom = csbi.unpack('ss@8S@12sx2s')
      fill_length = buffer_width * (window_bottom - window_top + 1)
      screen_topleft = window_top * 65536
      written = 0.chr * 4
      @@FillConsoleOutputCharacter.call(@@hConsoleHandle, 0x20, fill_length, screen_topleft, written)
      @@FillConsoleOutputAttribute.call(@@hConsoleHandle, attributes, fill_length, screen_topleft, written)
      @@SetConsoleCursorPosition.call(@@hConsoleHandle, screen_topleft)
    else
      @@output.write "\e[2J" "\e[H"
    end
  end

  def self.set_screen_size(rows, columns)
    raise NotImplementedError
  end

  def self.hide_cursor
    size = 100
    visible = 0 # 0 means false
    cursor_info = [size, visible].pack('Li')
    @@SetConsoleCursorInfo.call(@@hConsoleHandle, cursor_info)
  end

  def self.show_cursor
    size = 100
    visible = 1 # 1 means true
    cursor_info = [size, visible].pack('Li')
    @@SetConsoleCursorInfo.call(@@hConsoleHandle, cursor_info)
  end

  def self.set_winch_handler(&handler)
    @@winch_handler = handler
  end

  def self.prep
    # do nothing
    nil
  end

  def self.deprep(otio)
    # do nothing
  end

  class KeyEventRecord

    attr_reader :virtual_key_code, :char_code, :control_key_state, :control_keys

    def initialize(virtual_key_code, char_code, control_key_state)
      @virtual_key_code = virtual_key_code
      @char_code = char_code
      @control_key_state = control_key_state
      @enhanced = control_key_state & ENHANCED_KEY != 0

      (@control_keys = []).tap do |control_keys|
        # symbols must be sorted to make comparison is easier later on
        control_keys << :ALT   if control_key_state & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED) != 0
        control_keys << :CTRL  if control_key_state & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED) != 0
        control_keys << :SHIFT if control_key_state & SHIFT_PRESSED != 0
      end.freeze
    end

    def char
      @char_code.chr(Encoding::UTF_8)
    end

    def enhanced?
      @enhanced
    end

    # Verifies if the arguments match with this key event.
    # Nil arguments are ignored, but at least one must be passed as non-nil.
    # To verify that no control keys were pressed, pass an empty array: `control_keys: []`.
    def matches?(control_keys: nil, virtual_key_code: nil, char_code: nil)
      raise ArgumentError, 'No argument was passed to match key event' if control_keys.nil? && virtual_key_code.nil? && char_code.nil?

      (control_keys.nil? || [*control_keys].sort == @control_keys) &&
      (virtual_key_code.nil? || @virtual_key_code == virtual_key_code) &&
      (char_code.nil? || char_code == @char_code)
    end

  end
end
PK"}$[o]#zzruby/reline/history.rbnu�[���class Reline::History < Array
  def initialize(config)
    @config = config
  end

  def to_s
    'HISTORY'
  end

  def delete_at(index)
    index = check_index(index)
    super(index)
  end

  def [](index)
    index = check_index(index) unless index.is_a?(Range)
    super(index)
  end

  def []=(index, val)
    index = check_index(index)
    super(index, String.new(val, encoding: Reline.encoding_system_needs))
  end

  def concat(*val)
    val.each do |v|
      push(*v)
    end
  end

  def push(*val)
    # If history_size is zero, all histories are dropped.
    return self if @config.history_size.zero?
    # If history_size is negative, history size is unlimited.
    if @config.history_size.positive?
      diff = size + val.size - @config.history_size
      if diff > 0
        if diff <= size
          shift(diff)
        else
          diff -= size
          clear
          val.shift(diff)
        end
      end
    end
    super(*(val.map{ |v|
      String.new(v, encoding: Reline.encoding_system_needs)
    }))
  end

  def <<(val)
    # If history_size is zero, all histories are dropped.
    return self if @config.history_size.zero?
    # If history_size is negative, history size is unlimited.
    if @config.history_size.positive?
      shift if size + 1 > @config.history_size
    end
    super(String.new(val, encoding: Reline.encoding_system_needs))
  end

  private def check_index(index)
    index += size if index < 0
    if index < -2147483648 or 2147483647 < index
      raise RangeError.new("integer #{index} too big to convert to `int'")
    end
    # If history_size is negative, history size is unlimited.
    if @config.history_size.positive?
      if index < -@config.history_size or @config.history_size < index
        raise RangeError.new("index=<#{index}>")
      end
    end
    raise IndexError.new("index=<#{index}>") if index < 0 or size <= index
    index
  end
end
PK"}$[��mǺǺruby/reline/line_editor.rbnu�[���require 'reline/kill_ring'
require 'reline/unicode'

require 'tempfile'

class Reline::LineEditor
  # TODO: undo
  # TODO: Use "private alias_method" idiom after drop Ruby 2.5.
  attr_reader :line
  attr_reader :byte_pointer
  attr_accessor :confirm_multiline_termination_proc
  attr_accessor :completion_proc
  attr_accessor :completion_append_character
  attr_accessor :output_modifier_proc
  attr_accessor :prompt_proc
  attr_accessor :auto_indent_proc
  attr_accessor :pre_input_hook
  attr_accessor :dig_perfect_match_proc
  attr_writer :output

  VI_MOTIONS = %i{
    ed_prev_char
    ed_next_char
    vi_zero
    ed_move_to_beg
    ed_move_to_end
    vi_to_column
    vi_next_char
    vi_prev_char
    vi_next_word
    vi_prev_word
    vi_to_next_char
    vi_to_prev_char
    vi_end_word
    vi_next_big_word
    vi_prev_big_word
    vi_end_big_word
    vi_repeat_next_char
    vi_repeat_prev_char
  }

  module CompletionState
    NORMAL = :normal
    COMPLETION = :completion
    MENU = :menu
    JOURNEY = :journey
    MENU_WITH_PERFECT_MATCH = :menu_with_perfect_match
    PERFECT_MATCH = :perfect_match
  end

  CompletionJourneyData = Struct.new('CompletionJourneyData', :preposing, :postposing, :list, :pointer)
  MenuInfo = Struct.new('MenuInfo', :target, :list)

  PROMPT_LIST_CACHE_TIMEOUT = 0.5

  def initialize(config, encoding)
    @config = config
    @completion_append_character = ''
    reset_variables(encoding: encoding)
  end

  def set_pasting_state(in_pasting)
    @in_pasting = in_pasting
  end

  def simplified_rendering?
    if finished?
      false
    elsif @just_cursor_moving and not @rerender_all
      true
    else
      not @rerender_all and not finished? and @in_pasting
    end
  end

  private def check_mode_string
    mode_string = nil
    if @config.show_mode_in_prompt
      if @config.editing_mode_is?(:vi_command)
        mode_string = @config.vi_cmd_mode_string
      elsif @config.editing_mode_is?(:vi_insert)
        mode_string = @config.vi_ins_mode_string
      elsif @config.editing_mode_is?(:emacs)
        mode_string = @config.emacs_mode_string
      else
        mode_string = '?'
      end
    end
    if mode_string != @prev_mode_string
      @rerender_all = true
    end
    @prev_mode_string = mode_string
    mode_string
  end

  private def check_multiline_prompt(buffer)
    if @vi_arg
      prompt = "(arg: #{@vi_arg}) "
      @rerender_all = true
    elsif @searching_prompt
      prompt = @searching_prompt
      @rerender_all = true
    else
      prompt = @prompt
    end
    if simplified_rendering?
      mode_string = check_mode_string
      prompt = mode_string + prompt if mode_string
      return [prompt, calculate_width(prompt, true), [prompt] * buffer.size]
    end
    if @prompt_proc
      use_cached_prompt_list = false
      if @cached_prompt_list
        if @just_cursor_moving
          use_cached_prompt_list = true
        elsif Time.now.to_f < (@prompt_cache_time + PROMPT_LIST_CACHE_TIMEOUT) and buffer.size == @cached_prompt_list.size
          use_cached_prompt_list = true
        end
      end
      use_cached_prompt_list = false if @rerender_all
      if use_cached_prompt_list
        prompt_list = @cached_prompt_list
      else
        prompt_list = @cached_prompt_list = @prompt_proc.(buffer).map { |pr| pr.gsub("\n", "\\n") }
        @prompt_cache_time = Time.now.to_f
      end
      prompt_list.map!{ prompt } if @vi_arg or @searching_prompt
      prompt_list = [prompt] if prompt_list.empty?
      mode_string = check_mode_string
      prompt_list = prompt_list.map{ |pr| mode_string + pr } if mode_string
      prompt = prompt_list[@line_index]
      prompt = prompt_list[0] if prompt.nil?
      prompt = prompt_list.last if prompt.nil?
      if buffer.size > prompt_list.size
        (buffer.size - prompt_list.size).times do
          prompt_list << prompt_list.last
        end
      end
      prompt_width = calculate_width(prompt, true)
      [prompt, prompt_width, prompt_list]
    else
      mode_string = check_mode_string
      prompt = mode_string + prompt if mode_string
      prompt_width = calculate_width(prompt, true)
      [prompt, prompt_width, nil]
    end
  end

  def reset(prompt = '', encoding:)
    @rest_height = (Reline::IOGate.get_screen_size.first - 1) - Reline::IOGate.cursor_pos.y
    @screen_size = Reline::IOGate.get_screen_size
    @screen_height = @screen_size.first
    reset_variables(prompt, encoding: encoding)
    Reline::IOGate.set_winch_handler do
      @resized = true
    end
    if ENV.key?('RELINE_ALT_SCROLLBAR')
      @full_block = '::'
      @upper_half_block = "''"
      @lower_half_block = '..'
      @block_elem_width = 2
    elsif Reline::IOGate.win?
      @full_block = '█'
      @upper_half_block = '▀'
      @lower_half_block = '▄'
      @block_elem_width = 1
    elsif @encoding == Encoding::UTF_8
      @full_block = '█'
      @upper_half_block = '▀'
      @lower_half_block = '▄'
      @block_elem_width = Reline::Unicode.calculate_width('█')
    else
      @full_block = '::'
      @upper_half_block = "''"
      @lower_half_block = '..'
      @block_elem_width = 2
    end
  end

  def resize
    return unless @resized
    @resized = false
    @rest_height = (Reline::IOGate.get_screen_size.first - 1) - Reline::IOGate.cursor_pos.y
    old_screen_size = @screen_size
    @screen_size = Reline::IOGate.get_screen_size
    @screen_height = @screen_size.first
    if old_screen_size.last < @screen_size.last # columns increase
      @rerender_all = true
      rerender
    else
      back = 0
      new_buffer = whole_lines
      prompt, prompt_width, prompt_list = check_multiline_prompt(new_buffer)
      new_buffer.each_with_index do |line, index|
        prompt_width = calculate_width(prompt_list[index], true) if @prompt_proc
        width = prompt_width + calculate_width(line)
        height = calculate_height_by_width(width)
        back += height
      end
      @highest_in_all = back
      @highest_in_this = calculate_height_by_width(prompt_width + @cursor_max)
      @first_line_started_from =
        if @line_index.zero?
          0
        else
          calculate_height_by_lines(@buffer_of_lines[0..(@line_index - 1)], prompt_list || prompt)
        end
      if @prompt_proc
        prompt = prompt_list[@line_index]
        prompt_width = calculate_width(prompt, true)
      end
      calculate_nearest_cursor
      @started_from = calculate_height_by_width(prompt_width + @cursor) - 1
      Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last)
      @highest_in_this = calculate_height_by_width(prompt_width + @cursor_max)
      @rerender_all = true
    end
  end

  def set_signal_handlers
    @old_trap = Signal.trap('INT') {
      clear_dialog
      if @scroll_partial_screen
        move_cursor_down(@screen_height - (@line_index - @scroll_partial_screen) - 1)
      else
        move_cursor_down(@highest_in_all - @line_index - 1)
      end
      Reline::IOGate.move_cursor_column(0)
      scroll_down(1)
      case @old_trap
      when 'DEFAULT', 'SYSTEM_DEFAULT'
        raise Interrupt
      when 'IGNORE'
        # Do nothing
      when 'EXIT'
        exit
      else
        @old_trap.call if @old_trap.respond_to?(:call)
      end
    }
    begin
      @old_tstp_trap = Signal.trap('TSTP') {
        Reline::IOGate.ungetc("\C-z".ord)
        @old_tstp_trap.call if @old_tstp_trap.respond_to?(:call)
      }
    rescue ArgumentError
    end
  end

  def finalize
    Signal.trap('INT', @old_trap)
    begin
      Signal.trap('TSTP', @old_tstp_trap)
    rescue ArgumentError
    end
  end

  def eof?
    @eof
  end

  def reset_variables(prompt = '', encoding:)
    @prompt = prompt.gsub("\n", "\\n")
    @mark_pointer = nil
    @encoding = encoding
    @is_multiline = false
    @finished = false
    @cleared = false
    @rerender_all = false
    @history_pointer = nil
    @kill_ring ||= Reline::KillRing.new
    @vi_clipboard = ''
    @vi_arg = nil
    @waiting_proc = nil
    @waiting_operator_proc = nil
    @waiting_operator_vi_arg = nil
    @completion_journey_data = nil
    @completion_state = CompletionState::NORMAL
    @perfect_matched = nil
    @menu_info = nil
    @first_prompt = true
    @searching_prompt = nil
    @first_char = true
    @add_newline_to_end_of_buffer = false
    @just_cursor_moving = nil
    @cached_prompt_list = nil
    @prompt_cache_time = nil
    @eof = false
    @continuous_insertion_buffer = String.new(encoding: @encoding)
    @scroll_partial_screen = nil
    @prev_mode_string = nil
    @drop_terminate_spaces = false
    @in_pasting = false
    @auto_indent_proc = nil
    @dialogs = []
    @last_key = nil
    @resized = false
    reset_line
  end

  def reset_line
    @cursor = 0
    @cursor_max = 0
    @byte_pointer = 0
    @buffer_of_lines = [String.new(encoding: @encoding)]
    @line_index = 0
    @previous_line_index = nil
    @line = @buffer_of_lines[0]
    @first_line_started_from = 0
    @move_up = 0
    @started_from = 0
    @highest_in_this = 1
    @highest_in_all = 1
    @line_backup_in_history = nil
    @multibyte_buffer = String.new(encoding: 'ASCII-8BIT')
    @check_new_auto_indent = false
  end

  def multiline_on
    @is_multiline = true
  end

  def multiline_off
    @is_multiline = false
  end

  private def calculate_height_by_lines(lines, prompt)
    result = 0
    prompt_list = prompt.is_a?(Array) ? prompt : nil
    lines.each_with_index { |line, i|
      prompt = prompt_list[i] if prompt_list and prompt_list[i]
      result += calculate_height_by_width(calculate_width(prompt, true) + calculate_width(line))
    }
    result
  end

  private def insert_new_line(cursor_line, next_line)
    @line = cursor_line
    @buffer_of_lines.insert(@line_index + 1, String.new(next_line, encoding: @encoding))
    @previous_line_index = @line_index
    @line_index += 1
    @just_cursor_moving = false
  end

  private def calculate_height_by_width(width)
    width.div(@screen_size.last) + 1
  end

  private def split_by_width(str, max_width)
    Reline::Unicode.split_by_width(str, max_width, @encoding)
  end

  private def scroll_down(val)
    if val <= @rest_height
      Reline::IOGate.move_cursor_down(val)
      @rest_height -= val
    else
      Reline::IOGate.move_cursor_down(@rest_height)
      Reline::IOGate.scroll_down(val - @rest_height)
      @rest_height = 0
    end
  end

  private def move_cursor_up(val)
    if val > 0
      Reline::IOGate.move_cursor_up(val)
      @rest_height += val
    elsif val < 0
      move_cursor_down(-val)
    end
  end

  private def move_cursor_down(val)
    if val > 0
      Reline::IOGate.move_cursor_down(val)
      @rest_height -= val
      @rest_height = 0 if @rest_height < 0
    elsif val < 0
      move_cursor_up(-val)
    end
  end

  private def calculate_nearest_cursor(line_to_calc = @line, cursor = @cursor, started_from = @started_from, byte_pointer = @byte_pointer, update = true)
    new_cursor_max = calculate_width(line_to_calc)
    new_cursor = 0
    new_byte_pointer = 0
    height = 1
    max_width = @screen_size.last
    if @config.editing_mode_is?(:vi_command)
      last_byte_size = Reline::Unicode.get_prev_mbchar_size(line_to_calc, line_to_calc.bytesize)
      if last_byte_size > 0
        last_mbchar = line_to_calc.byteslice(line_to_calc.bytesize - last_byte_size, last_byte_size)
        last_width = Reline::Unicode.get_mbchar_width(last_mbchar)
        end_of_line_cursor = new_cursor_max - last_width
      else
      end_of_line_cursor = new_cursor_max
      end
    else
    end_of_line_cursor = new_cursor_max
    end
    line_to_calc.grapheme_clusters.each do |gc|
      mbchar = gc.encode(Encoding::UTF_8)
      mbchar_width = Reline::Unicode.get_mbchar_width(mbchar)
      now = new_cursor + mbchar_width
      if now > end_of_line_cursor or now > cursor
        break
      end
      new_cursor += mbchar_width
      if new_cursor > max_width * height
        height += 1
      end
      new_byte_pointer += gc.bytesize
    end
    new_started_from = height - 1
    if update
      @cursor = new_cursor
      @cursor_max = new_cursor_max
      @started_from = new_started_from
      @byte_pointer = new_byte_pointer
    else
      [new_cursor, new_cursor_max, new_started_from, new_byte_pointer]
    end
  end

  def rerender_all
    @rerender_all = true
    process_insert(force: true)
    rerender
  end

  def rerender
    return if @line.nil?
    if @menu_info
      scroll_down(@highest_in_all - @first_line_started_from)
      @rerender_all = true
    end
    if @menu_info
      show_menu
      @menu_info = nil
    end
    prompt, prompt_width, prompt_list = check_multiline_prompt(whole_lines)
    if @cleared
      clear_screen_buffer(prompt, prompt_list, prompt_width)
      @cleared = false
      return
    end
    if @is_multiline and finished? and @scroll_partial_screen
      # Re-output all code higher than the screen when finished.
      Reline::IOGate.move_cursor_up(@first_line_started_from + @started_from - @scroll_partial_screen)
      Reline::IOGate.move_cursor_column(0)
      @scroll_partial_screen = nil
      prompt, prompt_width, prompt_list = check_multiline_prompt(whole_lines)
      if @previous_line_index
        new_lines = whole_lines(index: @previous_line_index, line: @line)
      else
        new_lines = whole_lines
      end
      modify_lines(new_lines).each_with_index do |line, index|
        @output.write "#{prompt_list ? prompt_list[index] : prompt}#{line}\n"
        Reline::IOGate.erase_after_cursor
      end
      @output.flush
      clear_dialog
      return
    end
    new_highest_in_this = calculate_height_by_width(prompt_width + calculate_width(@line.nil? ? '' : @line))
    rendered = false
    if @add_newline_to_end_of_buffer
      rerender_added_newline(prompt, prompt_width)
      @add_newline_to_end_of_buffer = false
    else
      if @just_cursor_moving and not @rerender_all
        rendered = just_move_cursor
        render_dialog((prompt_width + @cursor) % @screen_size.last)
        @just_cursor_moving = false
        return
      elsif @previous_line_index or new_highest_in_this != @highest_in_this
        rerender_changed_current_line
        @previous_line_index = nil
        rendered = true
      elsif @rerender_all
        rerender_all_lines
        @rerender_all = false
        rendered = true
      else
      end
    end
    if @is_multiline
      if finished?
        # Always rerender on finish because output_modifier_proc may return a different output.
        if @previous_line_index
          new_lines = whole_lines(index: @previous_line_index, line: @line)
        else
          new_lines = whole_lines
        end
        line = modify_lines(new_lines)[@line_index]
        clear_dialog
        prompt, prompt_width, prompt_list = check_multiline_prompt(new_lines)
        render_partial(prompt, prompt_width, line, @first_line_started_from)
        move_cursor_down(@highest_in_all - (@first_line_started_from + @highest_in_this - 1) - 1)
        scroll_down(1)
        Reline::IOGate.move_cursor_column(0)
        Reline::IOGate.erase_after_cursor
      else
        if not rendered and not @in_pasting
          line = modify_lines(whole_lines)[@line_index]
          prompt, prompt_width, prompt_list = check_multiline_prompt(whole_lines)
          render_partial(prompt, prompt_width, line, @first_line_started_from)
        end
        render_dialog((prompt_width + @cursor) % @screen_size.last)
      end
      @buffer_of_lines[@line_index] = @line
      @rest_height = 0 if @scroll_partial_screen
    else
      line = modify_lines(whole_lines)[@line_index]
      render_partial(prompt, prompt_width, line, 0)
      if finished?
        scroll_down(1)
        Reline::IOGate.move_cursor_column(0)
        Reline::IOGate.erase_after_cursor
      end
    end
  end

  class DialogProcScope
    def initialize(line_editor, config, proc_to_exec, context)
      @line_editor = line_editor
      @config = config
      @proc_to_exec = proc_to_exec
      @context = context
      @cursor_pos = Reline::CursorPos.new
    end

    def context
      @context
    end

    def retrieve_completion_block(set_completion_quote_character = false)
      @line_editor.retrieve_completion_block(set_completion_quote_character)
    end

    def call_completion_proc_with_checking_args(pre, target, post)
      @line_editor.call_completion_proc_with_checking_args(pre, target, post)
    end

    def set_dialog(dialog)
      @dialog = dialog
    end

    def dialog
      @dialog
    end

    def set_cursor_pos(col, row)
      @cursor_pos.x = col
      @cursor_pos.y = row
    end

    def set_key(key)
      @key = key
    end

    def key
      @key
    end

    def cursor_pos
      @cursor_pos
    end

    def just_cursor_moving
      @line_editor.instance_variable_get(:@just_cursor_moving)
    end

    def screen_width
      @line_editor.instance_variable_get(:@screen_size).last
    end

    def completion_journey_data
      @line_editor.instance_variable_get(:@completion_journey_data)
    end

    def config
      @config
    end

    def call
      instance_exec(&@proc_to_exec)
    end
  end

  class Dialog
    attr_reader :name, :contents, :width
    attr_accessor :scroll_top, :scrollbar_pos, :pointer, :column, :vertical_offset, :lines_backup, :trap_key

    def initialize(name, config, proc_scope)
      @name = name
      @config = config
      @proc_scope = proc_scope
      @width = nil
      @scroll_top = 0
      @trap_key = nil
    end

    def set_cursor_pos(col, row)
      @proc_scope.set_cursor_pos(col, row)
    end

    def width=(v)
      @width = v
    end

    def contents=(contents)
      @contents = contents
      if contents and @width.nil?
        @width = contents.map{ |line| Reline::Unicode.calculate_width(line, true) }.max
      end
    end

    def call(key)
      @proc_scope.set_dialog(self)
      @proc_scope.set_key(key)
      dialog_render_info = @proc_scope.call
      if @trap_key
        if @trap_key.any?{ |i| i.is_a?(Array) } # multiple trap
          @trap_key.each do |t|
            @config.add_oneshot_key_binding(t, @name)
          end
        elsif @trap_key.is_a?(Array)
          @config.add_oneshot_key_binding(@trap_key, @name)
        elsif @trap_key.is_a?(Integer) or @trap_key.is_a?(Reline::Key)
          @config.add_oneshot_key_binding([@trap_key], @name)
        end
      end
      dialog_render_info
    end
  end

  def add_dialog_proc(name, p, context = nil)
    dialog = Dialog.new(name, @config, DialogProcScope.new(self, @config, p, context))
    if index = @dialogs.find_index { |d| d.name == name }
      @dialogs[index] = dialog
    else
      @dialogs << dialog
    end
  end

  DIALOG_DEFAULT_HEIGHT = 20
  private def render_dialog(cursor_column)
    @dialogs.each do |dialog|
      render_each_dialog(dialog, cursor_column)
    end
  end

  private def padding_space_with_escape_sequences(str, width)
    str + (' ' * (width - calculate_width(str, true)))
  end

  private def render_each_dialog(dialog, cursor_column)
    if @in_pasting
      clear_each_dialog(dialog)
      dialog.contents = nil
      dialog.trap_key = nil
      return
    end
    dialog.set_cursor_pos(cursor_column, @first_line_started_from + @started_from)
    dialog_render_info = dialog.call(@last_key)
    if dialog_render_info.nil? or dialog_render_info.contents.nil? or dialog_render_info.contents.empty?
      dialog.lines_backup = {
        lines: modify_lines(whole_lines),
        line_index: @line_index,
        first_line_started_from: @first_line_started_from,
        started_from: @started_from,
        byte_pointer: @byte_pointer
      }
      clear_each_dialog(dialog)
      dialog.contents = nil
      dialog.trap_key = nil
      return
    end
    old_dialog = dialog.clone
    dialog.contents = dialog_render_info.contents
    pointer = dialog.pointer
    if dialog_render_info.width
      dialog.width = dialog_render_info.width
    else
      dialog.width = dialog.contents.map { |l| calculate_width(l, true) }.max
    end
    height = dialog_render_info.height || DIALOG_DEFAULT_HEIGHT
    height = dialog.contents.size if dialog.contents.size < height
    if dialog.contents.size > height
      if dialog.pointer
        if dialog.pointer < 0
          dialog.scroll_top = 0
        elsif (dialog.pointer - dialog.scroll_top) >= (height - 1)
          dialog.scroll_top = dialog.pointer - (height - 1)
        elsif (dialog.pointer - dialog.scroll_top) < 0
          dialog.scroll_top = dialog.pointer
        end
        pointer = dialog.pointer - dialog.scroll_top
      end
      dialog.contents = dialog.contents[dialog.scroll_top, height]
    end
    if dialog.contents and dialog.scroll_top >= dialog.contents.size
      dialog.scroll_top = dialog.contents.size - height
    end
    if dialog_render_info.scrollbar and dialog_render_info.contents.size > height
      bar_max_height = height * 2
      moving_distance = (dialog_render_info.contents.size - height) * 2
      position_ratio = dialog.scroll_top.zero? ? 0.0 : ((dialog.scroll_top * 2).to_f / moving_distance)
      bar_height = (bar_max_height * ((dialog.contents.size * 2).to_f / (dialog_render_info.contents.size * 2))).floor.to_i
      dialog.scrollbar_pos = ((bar_max_height - bar_height) * position_ratio).floor.to_i
    else
      dialog.scrollbar_pos = nil
    end
    upper_space = @first_line_started_from - @started_from
    dialog.column = dialog_render_info.pos.x
    dialog.width += @block_elem_width if dialog.scrollbar_pos
    diff = (dialog.column + dialog.width) - (@screen_size.last)
    if diff > 0
      dialog.column -= diff
    end
    if (@rest_height - dialog_render_info.pos.y) >= height
      dialog.vertical_offset = dialog_render_info.pos.y + 1
    elsif upper_space >= height
      dialog.vertical_offset = dialog_render_info.pos.y - height
    else
      if (@rest_height - dialog_render_info.pos.y) < height
        scroll_down(height + dialog_render_info.pos.y)
        move_cursor_up(height + dialog_render_info.pos.y)
      end
      dialog.vertical_offset = dialog_render_info.pos.y + 1
    end
    Reline::IOGate.hide_cursor
    if dialog.column < 0
      dialog.column = 0
      dialog.width = @screen_size.last
    end
    reset_dialog(dialog, old_dialog)
    move_cursor_down(dialog.vertical_offset)
    Reline::IOGate.move_cursor_column(dialog.column)
    dialog.contents.each_with_index do |item, i|
      if i == pointer
        bg_color = '45'
      else
        if dialog_render_info.bg_color
          bg_color = dialog_render_info.bg_color
        else
          bg_color = '46'
        end
      end
      str_width = dialog.width - (dialog.scrollbar_pos.nil? ? 0 : @block_elem_width)
      str = padding_space_with_escape_sequences(Reline::Unicode.take_range(item, 0, str_width), str_width)
      @output.write "\e[#{bg_color}m#{str}"
      if dialog.scrollbar_pos and (dialog.scrollbar_pos != old_dialog.scrollbar_pos or dialog.column != old_dialog.column)
        @output.write "\e[37m"
        if dialog.scrollbar_pos <= (i * 2) and (i * 2 + 1) < (dialog.scrollbar_pos + bar_height)
          @output.write @full_block
        elsif dialog.scrollbar_pos <= (i * 2) and (i * 2) < (dialog.scrollbar_pos + bar_height)
          @output.write @upper_half_block
          str += ''
        elsif dialog.scrollbar_pos <= (i * 2 + 1) and (i * 2) < (dialog.scrollbar_pos + bar_height)
          @output.write @lower_half_block
        else
          @output.write ' ' * @block_elem_width
        end
      end
      @output.write "\e[0m"
      Reline::IOGate.move_cursor_column(dialog.column)
      move_cursor_down(1) if i < (dialog.contents.size - 1)
    end
    Reline::IOGate.move_cursor_column(cursor_column)
    move_cursor_up(dialog.vertical_offset + dialog.contents.size - 1)
    Reline::IOGate.show_cursor
    dialog.lines_backup = {
      lines: modify_lines(whole_lines),
      line_index: @line_index,
      first_line_started_from: @first_line_started_from,
      started_from: @started_from,
      byte_pointer: @byte_pointer
    }
  end

  private def reset_dialog(dialog, old_dialog)
    return if dialog.lines_backup.nil? or old_dialog.contents.nil?
    prompt, prompt_width, prompt_list = check_multiline_prompt(dialog.lines_backup[:lines])
    visual_lines = []
    visual_start = nil
    dialog.lines_backup[:lines].each_with_index { |l, i|
      pr = prompt_list ? prompt_list[i] : prompt
      vl, _ = split_by_width(pr + l, @screen_size.last)
      vl.compact!
      if i == dialog.lines_backup[:line_index]
        visual_start = visual_lines.size + dialog.lines_backup[:started_from]
      end
      visual_lines.concat(vl)
    }
    old_y = dialog.lines_backup[:first_line_started_from] + dialog.lines_backup[:started_from]
    y = @first_line_started_from + @started_from
    y_diff = y - old_y
    if (old_y + old_dialog.vertical_offset) < (y + dialog.vertical_offset)
      # rerender top
      move_cursor_down(old_dialog.vertical_offset - y_diff)
      start = visual_start + old_dialog.vertical_offset
      line_num = dialog.vertical_offset - old_dialog.vertical_offset
      line_num.times do |i|
        Reline::IOGate.move_cursor_column(old_dialog.column)
        if visual_lines[start + i].nil?
          s = ' ' * old_dialog.width
        else
          s = Reline::Unicode.take_range(visual_lines[start + i], old_dialog.column, old_dialog.width)
          s = padding_space_with_escape_sequences(s, old_dialog.width)
        end
        @output.write "\e[0m#{s}\e[0m"
        move_cursor_down(1) if i < (line_num - 1)
      end
      move_cursor_up(old_dialog.vertical_offset + line_num - 1 - y_diff)
    end
    if (old_y + old_dialog.vertical_offset + old_dialog.contents.size) > (y + dialog.vertical_offset + dialog.contents.size)
      # rerender bottom
      move_cursor_down(dialog.vertical_offset + dialog.contents.size - y_diff)
      start = visual_start + dialog.vertical_offset + dialog.contents.size
      line_num = (old_dialog.vertical_offset + old_dialog.contents.size) - (dialog.vertical_offset + dialog.contents.size)
      line_num.times do |i|
        Reline::IOGate.move_cursor_column(old_dialog.column)
        if visual_lines[start + i].nil?
          s = ' ' * old_dialog.width
        else
          s = Reline::Unicode.take_range(visual_lines[start + i], old_dialog.column, old_dialog.width)
          s = padding_space_with_escape_sequences(s, old_dialog.width)
        end
        @output.write "\e[0m#{s}\e[0m"
        move_cursor_down(1) if i < (line_num - 1)
      end
      move_cursor_up(dialog.vertical_offset + dialog.contents.size + line_num - 1 - y_diff)
    end
    if old_dialog.column < dialog.column
      # rerender left
      move_cursor_down(old_dialog.vertical_offset - y_diff)
      width = dialog.column - old_dialog.column
      start = visual_start + old_dialog.vertical_offset
      line_num = old_dialog.contents.size
      line_num.times do |i|
        Reline::IOGate.move_cursor_column(old_dialog.column)
        if visual_lines[start + i].nil?
          s = ' ' * width
        else
          s = Reline::Unicode.take_range(visual_lines[start + i], old_dialog.column, width)
          s = padding_space_with_escape_sequences(s, dialog.width)
        end
        @output.write "\e[0m#{s}\e[0m"
        move_cursor_down(1) if i < (line_num - 1)
      end
      move_cursor_up(old_dialog.vertical_offset + line_num - 1 - y_diff)
    end
    if (old_dialog.column + old_dialog.width) > (dialog.column + dialog.width)
      # rerender right
      move_cursor_down(old_dialog.vertical_offset + y_diff)
      width = (old_dialog.column + old_dialog.width) - (dialog.column + dialog.width)
      start = visual_start + old_dialog.vertical_offset
      line_num = old_dialog.contents.size
      line_num.times do |i|
        Reline::IOGate.move_cursor_column(old_dialog.column + dialog.width)
        if visual_lines[start + i].nil?
          s = ' ' * width
        else
          s = Reline::Unicode.take_range(visual_lines[start + i], old_dialog.column + dialog.width, width)
          rerender_width = old_dialog.width - dialog.width
          s = padding_space_with_escape_sequences(s, rerender_width)
        end
        Reline::IOGate.move_cursor_column(dialog.column + dialog.width)
        @output.write "\e[0m#{s}\e[0m"
        move_cursor_down(1) if i < (line_num - 1)
      end
      move_cursor_up(old_dialog.vertical_offset + line_num - 1 + y_diff)
    end
    Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last)
  end

  private def clear_dialog
    @dialogs.each do |dialog|
      clear_each_dialog(dialog)
    end
  end

  private def clear_each_dialog(dialog)
    dialog.trap_key = nil
    return unless dialog.contents
    prompt, prompt_width, prompt_list = check_multiline_prompt(dialog.lines_backup[:lines])
    visual_lines = []
    visual_lines_under_dialog = []
    visual_start = nil
    dialog.lines_backup[:lines].each_with_index { |l, i|
      pr = prompt_list ? prompt_list[i] : prompt
      vl, _ = split_by_width(pr + l, @screen_size.last)
      vl.compact!
      if i == dialog.lines_backup[:line_index]
        visual_start = visual_lines.size + dialog.lines_backup[:started_from] + dialog.vertical_offset
      end
      visual_lines.concat(vl)
    }
    visual_lines_under_dialog = visual_lines[visual_start, dialog.contents.size]
    visual_lines_under_dialog = [] if visual_lines_under_dialog.nil?
    Reline::IOGate.hide_cursor
    move_cursor_down(dialog.vertical_offset)
    dialog_vertical_size = dialog.contents.size
    dialog_vertical_size.times do |i|
      if i < visual_lines_under_dialog.size
        Reline::IOGate.move_cursor_column(dialog.column)
        str = Reline::Unicode.take_range(visual_lines_under_dialog[i], dialog.column, dialog.width)
        str = padding_space_with_escape_sequences(str, dialog.width)
        @output.write "\e[0m#{str}\e[0m"
      else
        Reline::IOGate.move_cursor_column(dialog.column)
        @output.write "\e[0m#{' ' * dialog.width}\e[0m"
      end
      move_cursor_down(1) if i < (dialog_vertical_size - 1)
    end
    move_cursor_up(dialog_vertical_size - 1 + dialog.vertical_offset)
    Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last)
    Reline::IOGate.show_cursor
  end

  private def calculate_scroll_partial_screen(highest_in_all, cursor_y)
    if @screen_height < highest_in_all
      old_scroll_partial_screen = @scroll_partial_screen
      if cursor_y == 0
        @scroll_partial_screen = 0
      elsif cursor_y == (highest_in_all - 1)
        @scroll_partial_screen = highest_in_all - @screen_height
      else
        if @scroll_partial_screen
          if cursor_y <= @scroll_partial_screen
            @scroll_partial_screen = cursor_y
          elsif (@scroll_partial_screen + @screen_height - 1) < cursor_y
            @scroll_partial_screen = cursor_y - (@screen_height - 1)
          end
        else
          if cursor_y > (@screen_height - 1)
            @scroll_partial_screen = cursor_y - (@screen_height - 1)
          else
            @scroll_partial_screen = 0
          end
        end
      end
      if @scroll_partial_screen != old_scroll_partial_screen
        @rerender_all = true
      end
    else
      if @scroll_partial_screen
        @rerender_all = true
      end
      @scroll_partial_screen = nil
    end
  end

  private def rerender_added_newline(prompt, prompt_width)
    scroll_down(1)
    @buffer_of_lines[@previous_line_index] = @line
    @line = @buffer_of_lines[@line_index]
    unless @in_pasting
      render_partial(prompt, prompt_width, @line, @first_line_started_from + @started_from + 1, with_control: false)
    end
    @cursor = @cursor_max = calculate_width(@line)
    @byte_pointer = @line.bytesize
    @highest_in_all += @highest_in_this
    @highest_in_this = calculate_height_by_width(prompt_width + @cursor_max)
    @first_line_started_from += @started_from + 1
    @started_from = calculate_height_by_width(prompt_width + @cursor) - 1
    @previous_line_index = nil
  end

  def just_move_cursor
    prompt, prompt_width, prompt_list = check_multiline_prompt(@buffer_of_lines)
    move_cursor_up(@started_from)
    new_first_line_started_from =
      if @line_index.zero?
        0
      else
        calculate_height_by_lines(@buffer_of_lines[0..(@line_index - 1)], prompt_list || prompt)
      end
    first_line_diff = new_first_line_started_from - @first_line_started_from
    new_cursor, new_cursor_max, new_started_from, new_byte_pointer = calculate_nearest_cursor(@buffer_of_lines[@line_index], @cursor, @started_from, @byte_pointer, false)
    new_started_from = calculate_height_by_width(prompt_width + new_cursor) - 1
    calculate_scroll_partial_screen(@highest_in_all, new_first_line_started_from + new_started_from)
    @previous_line_index = nil
    if @rerender_all
      @line = @buffer_of_lines[@line_index]
      rerender_all_lines
      @rerender_all = false
      true
    else
      @line = @buffer_of_lines[@line_index]
      @first_line_started_from = new_first_line_started_from
      @started_from = new_started_from
      @cursor = new_cursor
      @cursor_max = new_cursor_max
      @byte_pointer = new_byte_pointer
      move_cursor_down(first_line_diff + @started_from)
      Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last)
      false
    end
  end

  private def rerender_changed_current_line
    if @previous_line_index
      new_lines = whole_lines(index: @previous_line_index, line: @line)
    else
      new_lines = whole_lines
    end
    prompt, prompt_width, prompt_list = check_multiline_prompt(new_lines)
    all_height = calculate_height_by_lines(new_lines, prompt_list || prompt)
    diff = all_height - @highest_in_all
    move_cursor_down(@highest_in_all - @first_line_started_from - @started_from - 1)
    if diff > 0
      scroll_down(diff)
      move_cursor_up(all_height - 1)
    elsif diff < 0
      (-diff).times do
        Reline::IOGate.move_cursor_column(0)
        Reline::IOGate.erase_after_cursor
        move_cursor_up(1)
      end
      move_cursor_up(all_height - 1)
    else
      move_cursor_up(all_height - 1)
    end
    @highest_in_all = all_height
    back = render_whole_lines(new_lines, prompt_list || prompt, prompt_width)
    move_cursor_up(back)
    if @previous_line_index
      @buffer_of_lines[@previous_line_index] = @line
      @line = @buffer_of_lines[@line_index]
    end
    @first_line_started_from =
      if @line_index.zero?
        0
      else
        calculate_height_by_lines(@buffer_of_lines[0..(@line_index - 1)], prompt_list || prompt)
      end
    if @prompt_proc
      prompt = prompt_list[@line_index]
      prompt_width = calculate_width(prompt, true)
    end
    move_cursor_down(@first_line_started_from)
    calculate_nearest_cursor
    @started_from = calculate_height_by_width(prompt_width + @cursor) - 1
    move_cursor_down(@started_from)
    Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last)
    @highest_in_this = calculate_height_by_width(prompt_width + @cursor_max)
  end

  private def rerender_all_lines
    move_cursor_up(@first_line_started_from + @started_from)
    Reline::IOGate.move_cursor_column(0)
    back = 0
    new_buffer = whole_lines
    prompt, prompt_width, prompt_list = check_multiline_prompt(new_buffer)
    new_buffer.each_with_index do |line, index|
      prompt_width = calculate_width(prompt_list[index], true) if @prompt_proc
      width = prompt_width + calculate_width(line)
      height = calculate_height_by_width(width)
      back += height
    end
    old_highest_in_all = @highest_in_all
    if @line_index.zero?
      new_first_line_started_from = 0
    else
      new_first_line_started_from = calculate_height_by_lines(new_buffer[0..(@line_index - 1)], prompt_list || prompt)
    end
    new_started_from = calculate_height_by_width(prompt_width + @cursor) - 1
    calculate_scroll_partial_screen(back, new_first_line_started_from + new_started_from)
    if @scroll_partial_screen
      move_cursor_up(@first_line_started_from + @started_from)
      scroll_down(@screen_height - 1)
      move_cursor_up(@screen_height)
      Reline::IOGate.move_cursor_column(0)
    elsif back > old_highest_in_all
      scroll_down(back - 1)
      move_cursor_up(back - 1)
    elsif back < old_highest_in_all
      scroll_down(back)
      Reline::IOGate.erase_after_cursor
      (old_highest_in_all - back - 1).times do
        scroll_down(1)
        Reline::IOGate.erase_after_cursor
      end
      move_cursor_up(old_highest_in_all - 1)
    end
    render_whole_lines(new_buffer, prompt_list || prompt, prompt_width)
    if @prompt_proc
      prompt = prompt_list[@line_index]
      prompt_width = calculate_width(prompt, true)
    end
    @highest_in_this = calculate_height_by_width(prompt_width + @cursor_max)
    @highest_in_all = back
    @first_line_started_from = new_first_line_started_from
    @started_from = new_started_from
    if @scroll_partial_screen
      Reline::IOGate.move_cursor_up(@screen_height - (@first_line_started_from + @started_from - @scroll_partial_screen) - 1)
      Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last)
    else
      move_cursor_down(@first_line_started_from + @started_from - back + 1)
      Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last)
    end
  end

  private def render_whole_lines(lines, prompt, prompt_width)
    rendered_height = 0
    modify_lines(lines).each_with_index do |line, index|
      if prompt.is_a?(Array)
        line_prompt = prompt[index]
        prompt_width = calculate_width(line_prompt, true)
      else
        line_prompt = prompt
      end
      height = render_partial(line_prompt, prompt_width, line, rendered_height, with_control: false)
      if index < (lines.size - 1)
        if @scroll_partial_screen
          if (@scroll_partial_screen - height) < rendered_height and (@scroll_partial_screen + @screen_height - 1) >= (rendered_height + height)
            move_cursor_down(1)
          end
        else
          scroll_down(1)
        end
        rendered_height += height
      else
        rendered_height += height - 1
      end
    end
    rendered_height
  end

  private def render_partial(prompt, prompt_width, line_to_render, this_started_from, with_control: true)
    visual_lines, height = split_by_width(line_to_render.nil? ? prompt : prompt + line_to_render, @screen_size.last)
    cursor_up_from_last_line = 0
    if @scroll_partial_screen
      last_visual_line = this_started_from + (height - 1)
      last_screen_line = @scroll_partial_screen + (@screen_height - 1)
      if (@scroll_partial_screen - this_started_from) >= height
        # Render nothing because this line is before the screen.
        visual_lines = []
      elsif this_started_from > last_screen_line
        # Render nothing because this line is after the screen.
        visual_lines = []
      else
        deleted_lines_before_screen = []
        if @scroll_partial_screen > this_started_from and last_visual_line >= @scroll_partial_screen
          # A part of visual lines are before the screen.
          deleted_lines_before_screen = visual_lines.shift((@scroll_partial_screen - this_started_from) * 2)
          deleted_lines_before_screen.compact!
        end
        if this_started_from <= last_screen_line and last_screen_line < last_visual_line
          # A part of visual lines are after the screen.
          visual_lines.pop((last_visual_line - last_screen_line) * 2)
        end
        move_cursor_up(deleted_lines_before_screen.size - @started_from)
        cursor_up_from_last_line = @started_from - deleted_lines_before_screen.size
      end
    end
    if with_control
      if height > @highest_in_this
        diff = height - @highest_in_this
        scroll_down(diff)
        @highest_in_all += diff
        @highest_in_this = height
        move_cursor_up(diff)
      elsif height < @highest_in_this
        diff = @highest_in_this - height
        @highest_in_all -= diff
        @highest_in_this = height
      end
      move_cursor_up(@started_from)
      @started_from = calculate_height_by_width(prompt_width + @cursor) - 1
      cursor_up_from_last_line = height - 1 - @started_from
    end
    if Reline::Unicode::CSI_REGEXP.match?(prompt + line_to_render)
      @output.write "\e[0m" # clear character decorations
    end
    visual_lines.each_with_index do |line, index|
      Reline::IOGate.move_cursor_column(0)
      if line.nil?
        if calculate_width(visual_lines[index - 1], true) == Reline::IOGate.get_screen_size.last
          # reaches the end of line
          if Reline::IOGate.win? and Reline::IOGate.win_legacy_console?
            # A newline is automatically inserted if a character is rendered at
            # eol on command prompt.
          else
            # When the cursor is at the end of the line and erases characters
            # after the cursor, some terminals delete the character at the
            # cursor position.
            move_cursor_down(1)
            Reline::IOGate.move_cursor_column(0)
          end
        else
          Reline::IOGate.erase_after_cursor
          move_cursor_down(1)
          Reline::IOGate.move_cursor_column(0)
        end
        next
      end
      @output.write line
      if Reline::IOGate.win? and Reline::IOGate.win_legacy_console? and calculate_width(line, true) == Reline::IOGate.get_screen_size.last
        # A newline is automatically inserted if a character is rendered at eol on command prompt.
        @rest_height -= 1 if @rest_height > 0
      end
      @output.flush
      if @first_prompt
        @first_prompt = false
        @pre_input_hook&.call
      end
    end
    unless visual_lines.empty?
      Reline::IOGate.erase_after_cursor
      Reline::IOGate.move_cursor_column(0)
    end
    if with_control
      # Just after rendring, so the cursor is on the last line.
      if finished?
        Reline::IOGate.move_cursor_column(0)
      else
        # Moves up from bottom of lines to the cursor position.
        move_cursor_up(cursor_up_from_last_line)
        # This logic is buggy if a fullwidth char is wrapped because there is only one halfwidth at end of a line.
        Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last)
      end
    end
    height
  end

  private def modify_lines(before)
    return before if before.nil? || before.empty? || simplified_rendering?

    if after = @output_modifier_proc&.call("#{before.join("\n")}\n", complete: finished?)
      after.lines("\n").map { |l| l.chomp('') }
    else
      before
    end
  end

  private def show_menu
    scroll_down(@highest_in_all - @first_line_started_from)
    @rerender_all = true
    @menu_info.list.sort!.each do |item|
      Reline::IOGate.move_cursor_column(0)
      @output.write item
      @output.flush
      scroll_down(1)
    end
    scroll_down(@highest_in_all - 1)
    move_cursor_up(@highest_in_all - 1 - @first_line_started_from)
  end

  private def clear_screen_buffer(prompt, prompt_list, prompt_width)
    Reline::IOGate.clear_screen
    back = 0
    modify_lines(whole_lines).each_with_index do |line, index|
      if @prompt_proc
        pr = prompt_list[index]
        height = render_partial(pr, calculate_width(pr), line, back, with_control: false)
      else
        height = render_partial(prompt, prompt_width, line, back, with_control: false)
      end
      if index < (@buffer_of_lines.size - 1)
        move_cursor_down(1)
        back += height
      end
    end
    move_cursor_up(back)
    move_cursor_down(@first_line_started_from + @started_from)
    @rest_height = (Reline::IOGate.get_screen_size.first - 1) - Reline::IOGate.cursor_pos.y
    Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last)
  end

  def editing_mode
    @config.editing_mode
  end

  private def menu(target, list)
    @menu_info = MenuInfo.new(target, list)
  end

  private def complete_internal_proc(list, is_menu)
    preposing, target, postposing = retrieve_completion_block
    list = list.select { |i|
      if i and not Encoding.compatible?(target.encoding, i.encoding)
        raise Encoding::CompatibilityError, "#{target.encoding.name} is not compatible with #{i.encoding.name}"
      end
      if @config.completion_ignore_case
        i&.downcase&.start_with?(target.downcase)
      else
        i&.start_with?(target)
      end
    }.uniq
    if is_menu
      menu(target, list)
      return nil
    end
    completed = list.inject { |memo, item|
      begin
        memo_mbchars = memo.unicode_normalize.grapheme_clusters
        item_mbchars = item.unicode_normalize.grapheme_clusters
      rescue Encoding::CompatibilityError
        memo_mbchars = memo.grapheme_clusters
        item_mbchars = item.grapheme_clusters
      end
      size = [memo_mbchars.size, item_mbchars.size].min
      result = ''
      size.times do |i|
        if @config.completion_ignore_case
          if memo_mbchars[i].casecmp?(item_mbchars[i])
            result << memo_mbchars[i]
          else
            break
          end
        else
          if memo_mbchars[i] == item_mbchars[i]
            result << memo_mbchars[i]
          else
            break
          end
        end
      end
      result
    }
    [target, preposing, completed, postposing]
  end

  private def complete(list, just_show_list = false)
    case @completion_state
    when CompletionState::NORMAL, CompletionState::JOURNEY
      @completion_state = CompletionState::COMPLETION
    when CompletionState::PERFECT_MATCH
      @dig_perfect_match_proc&.(@perfect_matched)
    end
    if just_show_list
      is_menu = true
    elsif @completion_state == CompletionState::MENU
      is_menu = true
    elsif @completion_state == CompletionState::MENU_WITH_PERFECT_MATCH
      is_menu = true
    else
      is_menu = false
    end
    result = complete_internal_proc(list, is_menu)
    if @completion_state == CompletionState::MENU_WITH_PERFECT_MATCH
      @completion_state = CompletionState::PERFECT_MATCH
    end
    return if result.nil?
    target, preposing, completed, postposing = result
    return if completed.nil?
    if target <= completed and (@completion_state == CompletionState::COMPLETION)
      if list.include?(completed)
        if list.one?
          @completion_state = CompletionState::PERFECT_MATCH
        else
          @completion_state = CompletionState::MENU_WITH_PERFECT_MATCH
        end
        @perfect_matched = completed
      else
        @completion_state = CompletionState::MENU
      end
      if not just_show_list and target < completed
        @line = preposing + completed + completion_append_character.to_s + postposing
        line_to_pointer = preposing + completed + completion_append_character.to_s
        @cursor_max = calculate_width(@line)
        @cursor = calculate_width(line_to_pointer)
        @byte_pointer = line_to_pointer.bytesize
      end
    end
  end

  private def move_completed_list(list, direction)
    case @completion_state
    when CompletionState::NORMAL, CompletionState::COMPLETION,
         CompletionState::MENU, CompletionState::MENU_WITH_PERFECT_MATCH
      @completion_state = CompletionState::JOURNEY
      result = retrieve_completion_block
      return if result.nil?
      preposing, target, postposing = result
      @completion_journey_data = CompletionJourneyData.new(
        preposing, postposing,
        [target] + list.select{ |item| item.start_with?(target) }, 0)
      if @completion_journey_data.list.size == 1
        @completion_journey_data.pointer = 0
      else
        case direction
        when :up
          @completion_journey_data.pointer = @completion_journey_data.list.size - 1
        when :down
          @completion_journey_data.pointer = 1
        end
      end
      @completion_state = CompletionState::JOURNEY
    else
      case direction
      when :up
        @completion_journey_data.pointer -= 1
        if @completion_journey_data.pointer < 0
          @completion_journey_data.pointer = @completion_journey_data.list.size - 1
        end
      when :down
        @completion_journey_data.pointer += 1
        if @completion_journey_data.pointer >= @completion_journey_data.list.size
          @completion_journey_data.pointer = 0
        end
      end
    end
    completed = @completion_journey_data.list[@completion_journey_data.pointer]
    new_line = (@completion_journey_data.preposing + completed + @completion_journey_data.postposing).split("\n")[@line_index]
    @line = new_line.nil? ? String.new(encoding: @encoding) : new_line
    line_to_pointer = (@completion_journey_data.preposing + completed).split("\n").last
    line_to_pointer = String.new(encoding: @encoding) if line_to_pointer.nil?
    @cursor_max = calculate_width(@line)
    @cursor = calculate_width(line_to_pointer)
    @byte_pointer = line_to_pointer.bytesize
  end

  private def run_for_operators(key, method_symbol, &block)
    if @waiting_operator_proc
      if VI_MOTIONS.include?(method_symbol)
        old_cursor, old_byte_pointer = @cursor, @byte_pointer
        @vi_arg = @waiting_operator_vi_arg if @waiting_operator_vi_arg > 1
        block.(true)
        unless @waiting_proc
          cursor_diff, byte_pointer_diff = @cursor - old_cursor, @byte_pointer - old_byte_pointer
          @cursor, @byte_pointer = old_cursor, old_byte_pointer
          @waiting_operator_proc.(cursor_diff, byte_pointer_diff)
        else
          old_waiting_proc = @waiting_proc
          old_waiting_operator_proc = @waiting_operator_proc
          current_waiting_operator_proc = @waiting_operator_proc
          @waiting_proc = proc { |k|
            old_cursor, old_byte_pointer = @cursor, @byte_pointer
            old_waiting_proc.(k)
            cursor_diff, byte_pointer_diff = @cursor - old_cursor, @byte_pointer - old_byte_pointer
            @cursor, @byte_pointer = old_cursor, old_byte_pointer
            current_waiting_operator_proc.(cursor_diff, byte_pointer_diff)
            @waiting_operator_proc = old_waiting_operator_proc
          }
        end
      else
        # Ignores operator when not motion is given.
        block.(false)
      end
      @waiting_operator_proc = nil
      @waiting_operator_vi_arg = nil
      if @vi_arg
        @rerender_all = true
        @vi_arg = nil
      end
    else
      block.(false)
    end
  end

  private def argumentable?(method_obj)
    method_obj and method_obj.parameters.any? { |param| param[0] == :key and param[1] == :arg }
  end

  private def inclusive?(method_obj)
    # If a motion method with the keyword argument "inclusive" follows the
    # operator, it must contain the character at the cursor position.
    method_obj and method_obj.parameters.any? { |param| param[0] == :key and param[1] == :inclusive }
  end

  def wrap_method_call(method_symbol, method_obj, key, with_operator = false)
    if @config.editing_mode_is?(:emacs, :vi_insert) and @waiting_proc.nil? and @waiting_operator_proc.nil?
      not_insertion = method_symbol != :ed_insert
      process_insert(force: not_insertion)
    end
    if @vi_arg and argumentable?(method_obj)
      if with_operator and inclusive?(method_obj)
        method_obj.(key, arg: @vi_arg, inclusive: true)
      else
        method_obj.(key, arg: @vi_arg)
      end
    else
      if with_operator and inclusive?(method_obj)
        method_obj.(key, inclusive: true)
      else
        method_obj.(key)
      end
    end
  end

  private def process_key(key, method_symbol)
    if method_symbol and respond_to?(method_symbol, true)
      method_obj = method(method_symbol)
    else
      method_obj = nil
    end
    if method_symbol and key.is_a?(Symbol)
      if @vi_arg and argumentable?(method_obj)
        run_for_operators(key, method_symbol) do |with_operator|
          wrap_method_call(method_symbol, method_obj, key, with_operator)
        end
      else
        wrap_method_call(method_symbol, method_obj, key) if method_obj
      end
      @kill_ring.process
      if @vi_arg
        @rerender_al = true
        @vi_arg = nil
      end
    elsif @vi_arg
      if key.chr =~ /[0-9]/
        ed_argument_digit(key)
      else
        if argumentable?(method_obj)
          run_for_operators(key, method_symbol) do |with_operator|
            wrap_method_call(method_symbol, method_obj, key, with_operator)
          end
        elsif @waiting_proc
          @waiting_proc.(key)
        elsif method_obj
          wrap_method_call(method_symbol, method_obj, key)
        else
          ed_insert(key) unless @config.editing_mode_is?(:vi_command)
        end
        @kill_ring.process
        if @vi_arg
          @rerender_all = true
          @vi_arg = nil
        end
      end
    elsif @waiting_proc
      @waiting_proc.(key)
      @kill_ring.process
    elsif method_obj
      if method_symbol == :ed_argument_digit
        wrap_method_call(method_symbol, method_obj, key)
      else
        run_for_operators(key, method_symbol) do |with_operator|
          wrap_method_call(method_symbol, method_obj, key, with_operator)
        end
      end
      @kill_ring.process
    else
      ed_insert(key) unless @config.editing_mode_is?(:vi_command)
    end
  end

  private def normal_char(key)
    method_symbol = method_obj = nil
    if key.combined_char.is_a?(Symbol)
      process_key(key.combined_char, key.combined_char)
      return
    end
    @multibyte_buffer << key.combined_char
    if @multibyte_buffer.size > 1
      if @multibyte_buffer.dup.force_encoding(@encoding).valid_encoding?
        process_key(@multibyte_buffer.dup.force_encoding(@encoding), nil)
        @multibyte_buffer.clear
      else
        # invalid
        return
      end
    else # single byte
      return if key.char >= 128 # maybe, first byte of multi byte
      method_symbol = @config.editing_mode.get_method(key.combined_char)
      if key.with_meta and method_symbol == :ed_unassigned
        # split ESC + key
        method_symbol = @config.editing_mode.get_method("\e".ord)
        process_key("\e".ord, method_symbol)
        method_symbol = @config.editing_mode.get_method(key.char)
        process_key(key.char, method_symbol)
      else
        process_key(key.combined_char, method_symbol)
      end
      @multibyte_buffer.clear
    end
    if @config.editing_mode_is?(:vi_command) and @cursor > 0 and @cursor == @cursor_max
      byte_size = Reline::Unicode.get_prev_mbchar_size(@line, @byte_pointer)
      @byte_pointer -= byte_size
      mbchar = @line.byteslice(@byte_pointer, byte_size)
      width = Reline::Unicode.get_mbchar_width(mbchar)
      @cursor -= width
    end
  end

  def input_key(key)
    @last_key = key
    @config.reset_oneshot_key_bindings
    @dialogs.each do |dialog|
      if key.char.instance_of?(Symbol) and key.char == dialog.name
        return
      end
    end
    @just_cursor_moving = nil
    if key.char.nil?
      if @first_char
        @line = nil
      end
      finish
      return
    end
    old_line = @line.dup
    @first_char = false
    completion_occurs = false
    if @config.editing_mode_is?(:emacs, :vi_insert) and key.char == "\C-i".ord
      unless @config.disable_completion
        result = call_completion_proc
        if result.is_a?(Array)
          completion_occurs = true
          process_insert
          if @config.autocompletion
            move_completed_list(result, :down)
          else
            complete(result)
          end
        end
      end
    elsif @config.editing_mode_is?(:emacs, :vi_insert) and key.char == :completion_journey_up
      if not @config.disable_completion and @config.autocompletion
        result = call_completion_proc
        if result.is_a?(Array)
          completion_occurs = true
          process_insert
          move_completed_list(result, :up)
        end
      end
    elsif not @config.disable_completion and @config.editing_mode_is?(:vi_insert) and ["\C-p".ord, "\C-n".ord].include?(key.char)
      unless @config.disable_completion
        result = call_completion_proc
        if result.is_a?(Array)
          completion_occurs = true
          process_insert
          move_completed_list(result, "\C-p".ord == key.char ? :up : :down)
        end
      end
    elsif Symbol === key.char and respond_to?(key.char, true)
      process_key(key.char, key.char)
    else
      normal_char(key)
    end
    unless completion_occurs
      @completion_state = CompletionState::NORMAL
      @completion_journey_data = nil
    end
    if not @in_pasting and @just_cursor_moving.nil?
      if @previous_line_index and @buffer_of_lines[@previous_line_index] == @line
        @just_cursor_moving = true
      elsif @previous_line_index.nil? and @buffer_of_lines[@line_index] == @line and old_line == @line
        @just_cursor_moving = true
      else
        @just_cursor_moving = false
      end
    else
      @just_cursor_moving = false
    end
    if @is_multiline and @auto_indent_proc and not simplified_rendering?
      process_auto_indent
    end
  end

  def call_completion_proc
    result = retrieve_completion_block(true)
    pre, target, post = result
    result = call_completion_proc_with_checking_args(pre, target, post)
    Reline.core.instance_variable_set(:@completion_quote_character, nil)
    result
  end

  def call_completion_proc_with_checking_args(pre, target, post)
    if @completion_proc and target
      argnum = @completion_proc.parameters.inject(0) { |result, item|
        case item.first
        when :req, :opt
          result + 1
        when :rest
          break 3
        end
      }
      case argnum
      when 1
        result = @completion_proc.(target)
      when 2
        result = @completion_proc.(target, pre)
      when 3..Float::INFINITY
        result = @completion_proc.(target, pre, post)
      end
    end
    result
  end

  private def process_auto_indent
    return if not @check_new_auto_indent and @previous_line_index # move cursor up or down
    if @check_new_auto_indent and @previous_line_index and @previous_line_index > 0 and @line_index > @previous_line_index
      # Fix indent of a line when a newline is inserted to the next
      new_lines = whole_lines(index: @previous_line_index, line: @line)
      new_indent = @auto_indent_proc.(new_lines[0..-3].push(''), @line_index - 1, 0, true)
      md = @line.match(/\A */)
      prev_indent = md[0].count(' ')
      @line = ' ' * new_indent + @line.lstrip

      new_indent = nil
      result = @auto_indent_proc.(new_lines[0..-2], @line_index - 1, (new_lines[-2].size + 1), false)
      if result
        new_indent = result
      end
      if new_indent&.>= 0
        @line = ' ' * new_indent + @line.lstrip
      end
    end
    if @previous_line_index
      new_lines = whole_lines(index: @previous_line_index, line: @line)
    else
      new_lines = whole_lines
    end
    new_indent = @auto_indent_proc.(new_lines, @line_index, @byte_pointer, @check_new_auto_indent)
    new_indent = @cursor_max if new_indent&.> @cursor_max
    if new_indent&.>= 0
      md = new_lines[@line_index].match(/\A */)
      prev_indent = md[0].count(' ')
      if @check_new_auto_indent
        @buffer_of_lines[@line_index] = ' ' * new_indent + @buffer_of_lines[@line_index].lstrip
        @cursor = new_indent
        @byte_pointer = new_indent
      else
        @line = ' ' * new_indent + @line.lstrip
        @cursor += new_indent - prev_indent
        @byte_pointer += new_indent - prev_indent
      end
    end
    @check_new_auto_indent = false
  end

  def retrieve_completion_block(set_completion_quote_character = false)
    if Reline.completer_word_break_characters.empty?
      word_break_regexp = nil
    else
      word_break_regexp = /\A[#{Regexp.escape(Reline.completer_word_break_characters)}]/
    end
    if Reline.completer_quote_characters.empty?
      quote_characters_regexp = nil
    else
      quote_characters_regexp = /\A[#{Regexp.escape(Reline.completer_quote_characters)}]/
    end
    before = @line.byteslice(0, @byte_pointer)
    rest = nil
    break_pointer = nil
    quote = nil
    closing_quote = nil
    escaped_quote = nil
    i = 0
    while i < @byte_pointer do
      slice = @line.byteslice(i, @byte_pointer - i)
      unless slice.valid_encoding?
        i += 1
        next
      end
      if quote and slice.start_with?(closing_quote)
        quote = nil
        i += 1
        rest = nil
      elsif quote and slice.start_with?(escaped_quote)
        # skip
        i += 2
      elsif quote_characters_regexp and slice =~ quote_characters_regexp # find new "
        rest = $'
        quote = $&
        closing_quote = /(?!\\)#{Regexp.escape(quote)}/
        escaped_quote = /\\#{Regexp.escape(quote)}/
        i += 1
        break_pointer = i - 1
      elsif word_break_regexp and not quote and slice =~ word_break_regexp
        rest = $'
        i += 1
        before = @line.byteslice(i, @byte_pointer - i)
        break_pointer = i
      else
        i += 1
      end
    end
    postposing = @line.byteslice(@byte_pointer, @line.bytesize - @byte_pointer)
    if rest
      preposing = @line.byteslice(0, break_pointer)
      target = rest
      if set_completion_quote_character and quote
        Reline.core.instance_variable_set(:@completion_quote_character, quote)
        if postposing !~ /(?!\\)#{Regexp.escape(quote)}/ # closing quote
          insert_text(quote)
        end
      end
    else
      preposing = ''
      if break_pointer
        preposing = @line.byteslice(0, break_pointer)
      else
        preposing = ''
      end
      target = before
    end
    if @is_multiline
      if @previous_line_index
        lines = whole_lines(index: @previous_line_index, line: @line)
      else
        lines = whole_lines
      end
      if @line_index > 0
        preposing = lines[0..(@line_index - 1)].join("\n") + "\n" + preposing
      end
      if (lines.size - 1) > @line_index
        postposing = postposing + "\n" + lines[(@line_index + 1)..-1].join("\n")
      end
    end
    [preposing.encode(@encoding), target.encode(@encoding), postposing.encode(@encoding)]
  end

  def confirm_multiline_termination
    temp_buffer = @buffer_of_lines.dup
    if @previous_line_index and @line_index == (@buffer_of_lines.size - 1)
      temp_buffer[@previous_line_index] = @line
    else
      temp_buffer[@line_index] = @line
    end
    @confirm_multiline_termination_proc.(temp_buffer.join("\n") + "\n")
  end

  def insert_text(text)
    width = calculate_width(text)
    if @cursor == @cursor_max
      @line += text
    else
      @line = byteinsert(@line, @byte_pointer, text)
    end
    @byte_pointer += text.bytesize
    @cursor += width
    @cursor_max += width
  end

  def delete_text(start = nil, length = nil)
    if start.nil? and length.nil?
      if @is_multiline
        if @buffer_of_lines.size == 1
          @line&.clear
          @byte_pointer = 0
          @cursor = 0
          @cursor_max = 0
        elsif @line_index == (@buffer_of_lines.size - 1) and @line_index > 0
          @buffer_of_lines.pop
          @line_index -= 1
          @line = @buffer_of_lines[@line_index]
          @byte_pointer = 0
          @cursor = 0
          @cursor_max = calculate_width(@line)
        elsif @line_index < (@buffer_of_lines.size - 1)
          @buffer_of_lines.delete_at(@line_index)
          @line = @buffer_of_lines[@line_index]
          @byte_pointer = 0
          @cursor = 0
          @cursor_max = calculate_width(@line)
        end
      else
        @line&.clear
        @byte_pointer = 0
        @cursor = 0
        @cursor_max = 0
      end
    elsif not start.nil? and not length.nil?
      if @line
        before = @line.byteslice(0, start)
        after = @line.byteslice(start + length, @line.bytesize)
        @line = before + after
        @byte_pointer = @line.bytesize if @byte_pointer > @line.bytesize
        str = @line.byteslice(0, @byte_pointer)
        @cursor = calculate_width(str)
        @cursor_max = calculate_width(@line)
      end
    elsif start.is_a?(Range)
      range = start
      first = range.first
      last = range.last
      last = @line.bytesize - 1 if last > @line.bytesize
      last += @line.bytesize if last < 0
      first += @line.bytesize if first < 0
      range = range.exclude_end? ? first...last : first..last
      @line = @line.bytes.reject.with_index{ |c, i| range.include?(i) }.map{ |c| c.chr(Encoding::ASCII_8BIT) }.join.force_encoding(@encoding)
      @byte_pointer = @line.bytesize if @byte_pointer > @line.bytesize
      str = @line.byteslice(0, @byte_pointer)
      @cursor = calculate_width(str)
      @cursor_max = calculate_width(@line)
    else
      @line = @line.byteslice(0, start)
      @byte_pointer = @line.bytesize if @byte_pointer > @line.bytesize
      str = @line.byteslice(0, @byte_pointer)
      @cursor = calculate_width(str)
      @cursor_max = calculate_width(@line)
    end
  end

  def byte_pointer=(val)
    @byte_pointer = val
    str = @line.byteslice(0, @byte_pointer)
    @cursor = calculate_width(str)
    @cursor_max = calculate_width(@line)
  end

  def whole_lines(index: @line_index, line: @line)
    temp_lines = @buffer_of_lines.dup
    temp_lines[index] = line
    temp_lines
  end

  def whole_buffer
    if @buffer_of_lines.size == 1 and @line.nil?
      nil
    else
      if @previous_line_index
        whole_lines(index: @previous_line_index, line: @line).join("\n")
      else
        whole_lines.join("\n")
      end
    end
  end

  def finished?
    @finished
  end

  def finish
    @finished = true
    @rerender_all = true
    @config.reset
  end

  private def byteslice!(str, byte_pointer, size)
    new_str = str.byteslice(0, byte_pointer)
    new_str << str.byteslice(byte_pointer + size, str.bytesize)
    [new_str, str.byteslice(byte_pointer, size)]
  end

  private def byteinsert(str, byte_pointer, other)
    new_str = str.byteslice(0, byte_pointer)
    new_str << other
    new_str << str.byteslice(byte_pointer, str.bytesize)
    new_str
  end

  private def calculate_width(str, allow_escape_code = false)
    Reline::Unicode.calculate_width(str, allow_escape_code)
  end

  private def key_delete(key)
    if @config.editing_mode_is?(:vi_insert, :emacs)
      ed_delete_next_char(key)
    end
  end

  private def key_newline(key)
    if @is_multiline
      if (@buffer_of_lines.size - 1) == @line_index and @line.bytesize == @byte_pointer
        @add_newline_to_end_of_buffer = true
      end
      next_line = @line.byteslice(@byte_pointer, @line.bytesize - @byte_pointer)
      cursor_line = @line.byteslice(0, @byte_pointer)
      insert_new_line(cursor_line, next_line)
      @cursor = 0
      @check_new_auto_indent = true unless @in_pasting
    end
  end

  # Editline:: +ed-unassigned+ This  editor command always results in an error.
  # GNU Readline:: There is no corresponding macro.
  private def ed_unassigned(key) end # do nothing

  private def process_insert(force: false)
    return if @continuous_insertion_buffer.empty? or (@in_pasting and not force)
    width = Reline::Unicode.calculate_width(@continuous_insertion_buffer)
    bytesize = @continuous_insertion_buffer.bytesize
    if @cursor == @cursor_max
      @line += @continuous_insertion_buffer
    else
      @line = byteinsert(@line, @byte_pointer, @continuous_insertion_buffer)
    end
    @byte_pointer += bytesize
    @cursor += width
    @cursor_max += width
    @continuous_insertion_buffer.clear
  end

  # Editline:: +ed-insert+ (vi input: almost all; emacs: printable characters)
  #            In insert mode, insert the input character left of the cursor
  #            position. In replace mode, overwrite the character at the
  #            cursor and move the cursor to the right by one character
  #            position. Accept an argument to do this repeatedly. It is an
  #            error if the input character is the NUL character (+Ctrl-@+).
  #            Failure to enlarge the edit buffer also results in an error.
  # Editline:: +ed-digit+ (emacs: 0 to 9) If in argument input mode, append
  #            the input digit to the argument being read. Otherwise, call
  #            +ed-insert+. It is an error if the input character is not a
  #            digit or if the existing argument is already greater than a
  #            million.
  # GNU Readline:: +self-insert+ (a, b, A, 1, !, …) Insert yourself.
  private def ed_insert(key)
    str = nil
    width = nil
    bytesize = nil
    if key.instance_of?(String)
      begin
        key.encode(Encoding::UTF_8)
      rescue Encoding::UndefinedConversionError
        return
      end
      str = key
      bytesize = key.bytesize
    else
      begin
        key.chr.encode(Encoding::UTF_8)
      rescue Encoding::UndefinedConversionError
        return
      end
      str = key.chr
      bytesize = 1
    end
    if @in_pasting
      @continuous_insertion_buffer << str
      return
    elsif not @continuous_insertion_buffer.empty?
      process_insert
    end
    width = Reline::Unicode.get_mbchar_width(str)
    if @cursor == @cursor_max
      @line += str
    else
      @line = byteinsert(@line, @byte_pointer, str)
    end
    last_byte_size = Reline::Unicode.get_prev_mbchar_size(@line, @byte_pointer)
    @byte_pointer += bytesize
    last_mbchar = @line.byteslice((@byte_pointer - bytesize - last_byte_size), last_byte_size)
    combined_char = last_mbchar + str
    if last_byte_size != 0 and combined_char.grapheme_clusters.size == 1
      # combined char
      last_mbchar_width = Reline::Unicode.get_mbchar_width(last_mbchar)
      combined_char_width = Reline::Unicode.get_mbchar_width(combined_char)
      if combined_char_width > last_mbchar_width
        width = combined_char_width - last_mbchar_width
      else
        width = 0
      end
    end
    @cursor += width
    @cursor_max += width
  end
  alias_method :ed_digit, :ed_insert
  alias_method :self_insert, :ed_insert

  private def ed_quoted_insert(str, arg: 1)
    @waiting_proc = proc { |key|
      arg.times do
        if key == "\C-j".ord or key == "\C-m".ord
          key_newline(key)
        elsif key == 0
          # Ignore NUL.
        else
          ed_insert(key)
        end
      end
      @waiting_proc = nil
    }
  end
  alias_method :quoted_insert, :ed_quoted_insert

  private def ed_next_char(key, arg: 1)
    byte_size = Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer)
    if (@byte_pointer < @line.bytesize)
      mbchar = @line.byteslice(@byte_pointer, byte_size)
      width = Reline::Unicode.get_mbchar_width(mbchar)
      @cursor += width if width
      @byte_pointer += byte_size
    elsif @is_multiline and @config.editing_mode_is?(:emacs) and @byte_pointer == @line.bytesize and @line_index < @buffer_of_lines.size - 1
      next_line = @buffer_of_lines[@line_index + 1]
      @cursor = 0
      @byte_pointer = 0
      @cursor_max = calculate_width(next_line)
      @previous_line_index = @line_index
      @line_index += 1
    end
    arg -= 1
    ed_next_char(key, arg: arg) if arg > 0
  end
  alias_method :forward_char, :ed_next_char

  private def ed_prev_char(key, arg: 1)
    if @cursor > 0
      byte_size = Reline::Unicode.get_prev_mbchar_size(@line, @byte_pointer)
      @byte_pointer -= byte_size
      mbchar = @line.byteslice(@byte_pointer, byte_size)
      width = Reline::Unicode.get_mbchar_width(mbchar)
      @cursor -= width
    elsif @is_multiline and @config.editing_mode_is?(:emacs) and @byte_pointer == 0 and @line_index > 0
      prev_line = @buffer_of_lines[@line_index - 1]
      @cursor = calculate_width(prev_line)
      @byte_pointer = prev_line.bytesize
      @cursor_max = calculate_width(prev_line)
      @previous_line_index = @line_index
      @line_index -= 1
    end
    arg -= 1
    ed_prev_char(key, arg: arg) if arg > 0
  end
  alias_method :backward_char, :ed_prev_char

  private def vi_first_print(key)
    @byte_pointer, @cursor = Reline::Unicode.vi_first_print(@line)
  end

  private def ed_move_to_beg(key)
    @byte_pointer = @cursor = 0
  end
  alias_method :beginning_of_line, :ed_move_to_beg

  private def ed_move_to_end(key)
    @byte_pointer = 0
    @cursor = 0
    byte_size = 0
    while @byte_pointer < @line.bytesize
      byte_size = Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer)
      if byte_size > 0
        mbchar = @line.byteslice(@byte_pointer, byte_size)
        @cursor += Reline::Unicode.get_mbchar_width(mbchar)
      end
      @byte_pointer += byte_size
    end
  end
  alias_method :end_of_line, :ed_move_to_end

  private def generate_searcher
    Fiber.new do |first_key|
      prev_search_key = first_key
      search_word = String.new(encoding: @encoding)
      multibyte_buf = String.new(encoding: 'ASCII-8BIT')
      last_hit = nil
      case first_key
      when "\C-r".ord
        prompt_name = 'reverse-i-search'
      when "\C-s".ord
        prompt_name = 'i-search'
      end
      loop do
        key = Fiber.yield(search_word)
        search_again = false
        case key
        when -1 # determined
          Reline.last_incremental_search = search_word
          break
        when "\C-h".ord, "\C-?".ord
          grapheme_clusters = search_word.grapheme_clusters
          if grapheme_clusters.size > 0
            grapheme_clusters.pop
            search_word = grapheme_clusters.join
          end
        when "\C-r".ord, "\C-s".ord
          search_again = true if prev_search_key == key
          prev_search_key = key
        else
          multibyte_buf << key
          if multibyte_buf.dup.force_encoding(@encoding).valid_encoding?
            search_word << multibyte_buf.dup.force_encoding(@encoding)
            multibyte_buf.clear
          end
        end
        hit = nil
        if not search_word.empty? and @line_backup_in_history&.include?(search_word)
          @history_pointer = nil
          hit = @line_backup_in_history
        else
          if search_again
            if search_word.empty? and Reline.last_incremental_search
              search_word = Reline.last_incremental_search
            end
            if @history_pointer
              case prev_search_key
              when "\C-r".ord
                history_pointer_base = 0
                history = Reline::HISTORY[0..(@history_pointer - 1)]
              when "\C-s".ord
                history_pointer_base = @history_pointer + 1
                history = Reline::HISTORY[(@history_pointer + 1)..-1]
              end
            else
              history_pointer_base = 0
              history = Reline::HISTORY
            end
          elsif @history_pointer
            case prev_search_key
            when "\C-r".ord
              history_pointer_base = 0
              history = Reline::HISTORY[0..@history_pointer]
            when "\C-s".ord
              history_pointer_base = @history_pointer
              history = Reline::HISTORY[@history_pointer..-1]
            end
          else
            history_pointer_base = 0
            history = Reline::HISTORY
          end
          case prev_search_key
          when "\C-r".ord
            hit_index = history.rindex { |item|
              item.include?(search_word)
            }
          when "\C-s".ord
            hit_index = history.index { |item|
              item.include?(search_word)
            }
          end
          if hit_index
            @history_pointer = history_pointer_base + hit_index
            hit = Reline::HISTORY[@history_pointer]
          end
        end
        case prev_search_key
        when "\C-r".ord
          prompt_name = 'reverse-i-search'
        when "\C-s".ord
          prompt_name = 'i-search'
        end
        if hit
          if @is_multiline
            @buffer_of_lines = hit.split("\n")
            @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty?
            @line_index = @buffer_of_lines.size - 1
            @line = @buffer_of_lines.last
            @rerender_all = true
            @searching_prompt = "(%s)`%s'" % [prompt_name, search_word]
          else
            @line = hit
            @searching_prompt = "(%s)`%s': %s" % [prompt_name, search_word, hit]
          end
          last_hit = hit
        else
          if @is_multiline
            @rerender_all = true
            @searching_prompt = "(failed %s)`%s'" % [prompt_name, search_word]
          else
            @searching_prompt = "(failed %s)`%s': %s" % [prompt_name, search_word, last_hit]
          end
        end
      end
    end
  end

  private def incremental_search_history(key)
    unless @history_pointer
      if @is_multiline
        @line_backup_in_history = whole_buffer
      else
        @line_backup_in_history = @line
      end
    end
    searcher = generate_searcher
    searcher.resume(key)
    @searching_prompt = "(reverse-i-search)`': "
    termination_keys = ["\C-j".ord]
    termination_keys.concat(@config.isearch_terminators&.chars&.map(&:ord)) if @config.isearch_terminators
    @waiting_proc = ->(k) {
      case k
      when *termination_keys
        if @history_pointer
          buffer = Reline::HISTORY[@history_pointer]
        else
          buffer = @line_backup_in_history
        end
        if @is_multiline
          @buffer_of_lines = buffer.split("\n")
          @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty?
          @line_index = @buffer_of_lines.size - 1
          @line = @buffer_of_lines.last
          @rerender_all = true
        else
          @line = buffer
        end
        @searching_prompt = nil
        @waiting_proc = nil
        @cursor_max = calculate_width(@line)
        @cursor = @byte_pointer = 0
        @rerender_all = true
        @cached_prompt_list = nil
        searcher.resume(-1)
      when "\C-g".ord
        if @is_multiline
          @buffer_of_lines = @line_backup_in_history.split("\n")
          @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty?
          @line_index = @buffer_of_lines.size - 1
          @line = @buffer_of_lines.last
          @rerender_all = true
        else
          @line = @line_backup_in_history
        end
        @history_pointer = nil
        @searching_prompt = nil
        @waiting_proc = nil
        @line_backup_in_history = nil
        @cursor_max = calculate_width(@line)
        @cursor = @byte_pointer = 0
        @rerender_all = true
      else
        chr = k.is_a?(String) ? k : k.chr(Encoding::ASCII_8BIT)
        if chr.match?(/[[:print:]]/) or k == "\C-h".ord or k == "\C-?".ord or k == "\C-r".ord or k == "\C-s".ord
          searcher.resume(k)
        else
          if @history_pointer
            line = Reline::HISTORY[@history_pointer]
          else
            line = @line_backup_in_history
          end
          if @is_multiline
            @line_backup_in_history = whole_buffer
            @buffer_of_lines = line.split("\n")
            @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty?
            @line_index = @buffer_of_lines.size - 1
            @line = @buffer_of_lines.last
            @rerender_all = true
          else
            @line_backup_in_history = @line
            @line = line
          end
          @searching_prompt = nil
          @waiting_proc = nil
          @cursor_max = calculate_width(@line)
          @cursor = @byte_pointer = 0
          @rerender_all = true
          @cached_prompt_list = nil
          searcher.resume(-1)
        end
      end
    }
  end

  private def vi_search_prev(key)
    incremental_search_history(key)
  end
  alias_method :reverse_search_history, :vi_search_prev

  private def vi_search_next(key)
    incremental_search_history(key)
  end
  alias_method :forward_search_history, :vi_search_next

  private def ed_search_prev_history(key, arg: 1)
    history = nil
    h_pointer = nil
    line_no = nil
    substr = @line.slice(0, @byte_pointer)
    if @history_pointer.nil?
      return if not @line.empty? and substr.empty?
      history = Reline::HISTORY
    elsif @history_pointer.zero?
      history = nil
      h_pointer = nil
    else
      history = Reline::HISTORY.slice(0, @history_pointer)
    end
    return if history.nil?
    if @is_multiline
      h_pointer = history.rindex { |h|
        h.split("\n").each_with_index { |l, i|
          if l.start_with?(substr)
            line_no = i
            break
          end
        }
        not line_no.nil?
      }
    else
      h_pointer = history.rindex { |l|
        l.start_with?(substr)
      }
    end
    return if h_pointer.nil?
    @history_pointer = h_pointer
    if @is_multiline
      @buffer_of_lines = Reline::HISTORY[@history_pointer].split("\n")
      @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty?
      @line_index = line_no
      @line = @buffer_of_lines[@line_index]
      @rerender_all = true
    else
      @line = Reline::HISTORY[@history_pointer]
    end
    @cursor_max = calculate_width(@line)
    arg -= 1
    ed_search_prev_history(key, arg: arg) if arg > 0
  end
  alias_method :history_search_backward, :ed_search_prev_history

  private def ed_search_next_history(key, arg: 1)
    substr = @line.slice(0, @byte_pointer)
    if @history_pointer.nil?
      return
    elsif @history_pointer == (Reline::HISTORY.size - 1) and not substr.empty?
      return
    end
    history = Reline::HISTORY.slice((@history_pointer + 1)..-1)
    h_pointer = nil
    line_no = nil
    if @is_multiline
      h_pointer = history.index { |h|
        h.split("\n").each_with_index { |l, i|
          if l.start_with?(substr)
            line_no = i
            break
          end
        }
        not line_no.nil?
      }
    else
      h_pointer = history.index { |l|
        l.start_with?(substr)
      }
    end
    h_pointer += @history_pointer + 1 if h_pointer and @history_pointer
    return if h_pointer.nil? and not substr.empty?
    @history_pointer = h_pointer
    if @is_multiline
      if @history_pointer.nil? and substr.empty?
        @buffer_of_lines = []
        @line_index = 0
      else
        @buffer_of_lines = Reline::HISTORY[@history_pointer].split("\n")
        @line_index = line_no
      end
      @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty?
      @line = @buffer_of_lines[@line_index]
      @rerender_all = true
    else
      if @history_pointer.nil? and substr.empty?
        @line = ''
      else
        @line = Reline::HISTORY[@history_pointer]
      end
    end
    @cursor_max = calculate_width(@line)
    arg -= 1
    ed_search_next_history(key, arg: arg) if arg > 0
  end
  alias_method :history_search_forward, :ed_search_next_history

  private def ed_prev_history(key, arg: 1)
    if @is_multiline and @line_index > 0
      @previous_line_index = @line_index
      @line_index -= 1
      return
    end
    if Reline::HISTORY.empty?
      return
    end
    if @history_pointer.nil?
      @history_pointer = Reline::HISTORY.size - 1
      if @is_multiline
        @line_backup_in_history = whole_buffer
        @buffer_of_lines = Reline::HISTORY[@history_pointer].split("\n")
        @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty?
        @line_index = @buffer_of_lines.size - 1
        @line = @buffer_of_lines.last
        @rerender_all = true
      else
        @line_backup_in_history = @line
        @line = Reline::HISTORY[@history_pointer]
      end
    elsif @history_pointer.zero?
      return
    else
      if @is_multiline
        Reline::HISTORY[@history_pointer] = whole_buffer
        @history_pointer -= 1
        @buffer_of_lines = Reline::HISTORY[@history_pointer].split("\n")
        @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty?
        @line_index = @buffer_of_lines.size - 1
        @line = @buffer_of_lines.last
        @rerender_all = true
      else
        Reline::HISTORY[@history_pointer] = @line
        @history_pointer -= 1
        @line = Reline::HISTORY[@history_pointer]
      end
    end
    if @config.editing_mode_is?(:emacs, :vi_insert)
      @cursor_max = @cursor = calculate_width(@line)
      @byte_pointer = @line.bytesize
    elsif @config.editing_mode_is?(:vi_command)
      @byte_pointer = @cursor = 0
      @cursor_max = calculate_width(@line)
    end
    arg -= 1
    ed_prev_history(key, arg: arg) if arg > 0
  end
  alias_method :previous_history, :ed_prev_history

  private def ed_next_history(key, arg: 1)
    if @is_multiline and @line_index < (@buffer_of_lines.size - 1)
      @previous_line_index = @line_index
      @line_index += 1
      return
    end
    if @history_pointer.nil?
      return
    elsif @history_pointer == (Reline::HISTORY.size - 1)
      if @is_multiline
        @history_pointer = nil
        @buffer_of_lines = @line_backup_in_history.split("\n")
        @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty?
        @line_index = 0
        @line = @buffer_of_lines.first
        @rerender_all = true
      else
        @history_pointer = nil
        @line = @line_backup_in_history
      end
    else
      if @is_multiline
        Reline::HISTORY[@history_pointer] = whole_buffer
        @history_pointer += 1
        @buffer_of_lines = Reline::HISTORY[@history_pointer].split("\n")
        @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty?
        @line_index = 0
        @line = @buffer_of_lines.first
        @rerender_all = true
      else
        Reline::HISTORY[@history_pointer] = @line
        @history_pointer += 1
        @line = Reline::HISTORY[@history_pointer]
      end
    end
    @line = '' unless @line
    if @config.editing_mode_is?(:emacs, :vi_insert)
      @cursor_max = @cursor = calculate_width(@line)
      @byte_pointer = @line.bytesize
    elsif @config.editing_mode_is?(:vi_command)
      @byte_pointer = @cursor = 0
      @cursor_max = calculate_width(@line)
    end
    arg -= 1
    ed_next_history(key, arg: arg) if arg > 0
  end
  alias_method :next_history, :ed_next_history

  private def ed_newline(key)
    process_insert(force: true)
    if @is_multiline
      if @config.editing_mode_is?(:vi_command)
        if @line_index < (@buffer_of_lines.size - 1)
          ed_next_history(key) # means cursor down
        else
          # should check confirm_multiline_termination to finish?
          finish
        end
      else
        if @line_index == (@buffer_of_lines.size - 1)
          if confirm_multiline_termination
            finish
          else
            key_newline(key)
          end
        else
          # should check confirm_multiline_termination to finish?
          @previous_line_index = @line_index
          @line_index = @buffer_of_lines.size - 1
          finish
        end
      end
    else
      if @history_pointer
        Reline::HISTORY[@history_pointer] = @line
        @history_pointer = nil
      end
      finish
    end
  end

  private def em_delete_prev_char(key, arg: 1)
    if @is_multiline and @cursor == 0 and @line_index > 0
      @buffer_of_lines[@line_index] = @line
      @cursor = calculate_width(@buffer_of_lines[@line_index - 1])
      @byte_pointer = @buffer_of_lines[@line_index - 1].bytesize
      @buffer_of_lines[@line_index - 1] += @buffer_of_lines.delete_at(@line_index)
      @line_index -= 1
      @line = @buffer_of_lines[@line_index]
      @cursor_max = calculate_width(@line)
      @rerender_all = true
    elsif @cursor > 0
      byte_size = Reline::Unicode.get_prev_mbchar_size(@line, @byte_pointer)
      @byte_pointer -= byte_size
      @line, mbchar = byteslice!(@line, @byte_pointer, byte_size)
      width = Reline::Unicode.get_mbchar_width(mbchar)
      @cursor -= width
      @cursor_max -= width
    end
    arg -= 1
    em_delete_prev_char(key, arg: arg) if arg > 0
  end
  alias_method :backward_delete_char, :em_delete_prev_char

  # Editline:: +ed-kill-line+ (vi command: +D+, +Ctrl-K+; emacs: +Ctrl-K+,
  #            +Ctrl-U+) + Kill from the cursor to the end of the line.
  # GNU Readline:: +kill-line+ (+C-k+) Kill the text from point to the end of
  #                the line. With a negative numeric argument, kill backward
  #                from the cursor to the beginning of the current line.
  private def ed_kill_line(key)
    if @line.bytesize > @byte_pointer
      @line, deleted = byteslice!(@line, @byte_pointer, @line.bytesize - @byte_pointer)
      @byte_pointer = @line.bytesize
      @cursor = @cursor_max = calculate_width(@line)
      @kill_ring.append(deleted)
    elsif @is_multiline and @byte_pointer == @line.bytesize and @buffer_of_lines.size > @line_index + 1
      @cursor = calculate_width(@line)
      @byte_pointer = @line.bytesize
      @line += @buffer_of_lines.delete_at(@line_index + 1)
      @cursor_max = calculate_width(@line)
      @buffer_of_lines[@line_index] = @line
      @rerender_all = true
      @rest_height += 1
    end
  end
  alias_method :kill_line, :ed_kill_line

  # Editline:: +vi-kill-line-prev+ (vi: +Ctrl-U+) Delete the string from the
  #            beginning  of the edit buffer to the cursor and save it to the
  #            cut buffer.
  # GNU Readline:: +unix-line-discard+ (+C-u+) Kill backward from the cursor
  #                to the beginning of the current line.
  private def vi_kill_line_prev(key)
    if @byte_pointer > 0
      @line, deleted = byteslice!(@line, 0, @byte_pointer)
      @byte_pointer = 0
      @kill_ring.append(deleted, true)
      @cursor_max = calculate_width(@line)
      @cursor = 0
    end
  end
  alias_method :unix_line_discard, :vi_kill_line_prev

  # Editline:: +em-kill-line+ (not bound) Delete the entire contents of the
  #            edit buffer and save it to the cut buffer. +vi-kill-line-prev+
  # GNU Readline:: +kill-whole-line+ (not bound) Kill all characters on the
  #                current line, no matter where point is.
  private def em_kill_line(key)
    if @line.size > 0
      @kill_ring.append(@line.dup, true)
      @line.clear
      @byte_pointer = 0
      @cursor_max = 0
      @cursor = 0
    end
  end
  alias_method :kill_whole_line, :em_kill_line

  private def em_delete(key)
    if (not @is_multiline and @line.empty?) or (@is_multiline and @line.empty? and @buffer_of_lines.size == 1)
      @line = nil
      if @buffer_of_lines.size > 1
        scroll_down(@highest_in_all - @first_line_started_from)
      end
      Reline::IOGate.move_cursor_column(0)
      @eof = true
      finish
    elsif @byte_pointer < @line.bytesize
      splitted_last = @line.byteslice(@byte_pointer, @line.bytesize)
      mbchar = splitted_last.grapheme_clusters.first
      width = Reline::Unicode.get_mbchar_width(mbchar)
      @cursor_max -= width
      @line, = byteslice!(@line, @byte_pointer, mbchar.bytesize)
    elsif @is_multiline and @byte_pointer == @line.bytesize and @buffer_of_lines.size > @line_index + 1
      @cursor = calculate_width(@line)
      @byte_pointer = @line.bytesize
      @line += @buffer_of_lines.delete_at(@line_index + 1)
      @cursor_max = calculate_width(@line)
      @buffer_of_lines[@line_index] = @line
      @rerender_all = true
      @rest_height += 1
    end
  end
  alias_method :delete_char, :em_delete

  private def em_delete_or_list(key)
    if @line.empty? or @byte_pointer < @line.bytesize
      em_delete(key)
    else # show completed list
      result = call_completion_proc
      if result.is_a?(Array)
        complete(result, true)
      end
    end
  end
  alias_method :delete_char_or_list, :em_delete_or_list

  private def em_yank(key)
    yanked = @kill_ring.yank
    if yanked
      @line = byteinsert(@line, @byte_pointer, yanked)
      yanked_width = calculate_width(yanked)
      @cursor += yanked_width
      @cursor_max += yanked_width
      @byte_pointer += yanked.bytesize
    end
  end
  alias_method :yank, :em_yank

  private def em_yank_pop(key)
    yanked, prev_yank = @kill_ring.yank_pop
    if yanked
      prev_yank_width = calculate_width(prev_yank)
      @cursor -= prev_yank_width
      @cursor_max -= prev_yank_width
      @byte_pointer -= prev_yank.bytesize
      @line, = byteslice!(@line, @byte_pointer, prev_yank.bytesize)
      @line = byteinsert(@line, @byte_pointer, yanked)
      yanked_width = calculate_width(yanked)
      @cursor += yanked_width
      @cursor_max += yanked_width
      @byte_pointer += yanked.bytesize
    end
  end
  alias_method :yank_pop, :em_yank_pop

  private def ed_clear_screen(key)
    @cleared = true
  end
  alias_method :clear_screen, :ed_clear_screen

  private def em_next_word(key)
    if @line.bytesize > @byte_pointer
      byte_size, width = Reline::Unicode.em_forward_word(@line, @byte_pointer)
      @byte_pointer += byte_size
      @cursor += width
    end
  end
  alias_method :forward_word, :em_next_word

  private def ed_prev_word(key)
    if @byte_pointer > 0
      byte_size, width = Reline::Unicode.em_backward_word(@line, @byte_pointer)
      @byte_pointer -= byte_size
      @cursor -= width
    end
  end
  alias_method :backward_word, :ed_prev_word

  private def em_delete_next_word(key)
    if @line.bytesize > @byte_pointer
      byte_size, width = Reline::Unicode.em_forward_word(@line, @byte_pointer)
      @line, word = byteslice!(@line, @byte_pointer, byte_size)
      @kill_ring.append(word)
      @cursor_max -= width
    end
  end

  private def ed_delete_prev_word(key)
    if @byte_pointer > 0
      byte_size, width = Reline::Unicode.em_backward_word(@line, @byte_pointer)
      @line, word = byteslice!(@line, @byte_pointer - byte_size, byte_size)
      @kill_ring.append(word, true)
      @byte_pointer -= byte_size
      @cursor -= width
      @cursor_max -= width
    end
  end

  private def ed_transpose_chars(key)
    if @byte_pointer > 0
      if @cursor_max > @cursor
        byte_size = Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer)
        mbchar = @line.byteslice(@byte_pointer, byte_size)
        width = Reline::Unicode.get_mbchar_width(mbchar)
        @cursor += width
        @byte_pointer += byte_size
      end
      back1_byte_size = Reline::Unicode.get_prev_mbchar_size(@line, @byte_pointer)
      if (@byte_pointer - back1_byte_size) > 0
        back2_byte_size = Reline::Unicode.get_prev_mbchar_size(@line, @byte_pointer - back1_byte_size)
        back2_pointer = @byte_pointer - back1_byte_size - back2_byte_size
        @line, back2_mbchar = byteslice!(@line, back2_pointer, back2_byte_size)
        @line = byteinsert(@line, @byte_pointer - back2_byte_size, back2_mbchar)
      end
    end
  end
  alias_method :transpose_chars, :ed_transpose_chars

  private def ed_transpose_words(key)
    left_word_start, middle_start, right_word_start, after_start = Reline::Unicode.ed_transpose_words(@line, @byte_pointer)
    before = @line.byteslice(0, left_word_start)
    left_word = @line.byteslice(left_word_start, middle_start - left_word_start)
    middle = @line.byteslice(middle_start, right_word_start - middle_start)
    right_word = @line.byteslice(right_word_start, after_start - right_word_start)
    after = @line.byteslice(after_start, @line.bytesize - after_start)
    return if left_word.empty? or right_word.empty?
    @line = before + right_word + middle + left_word + after
    from_head_to_left_word = before + right_word + middle + left_word
    @byte_pointer = from_head_to_left_word.bytesize
    @cursor = calculate_width(from_head_to_left_word)
  end
  alias_method :transpose_words, :ed_transpose_words

  private def em_capitol_case(key)
    if @line.bytesize > @byte_pointer
      byte_size, _, new_str = Reline::Unicode.em_forward_word_with_capitalization(@line, @byte_pointer)
      before = @line.byteslice(0, @byte_pointer)
      after = @line.byteslice((@byte_pointer + byte_size)..-1)
      @line = before + new_str + after
      @byte_pointer += new_str.bytesize
      @cursor += calculate_width(new_str)
    end
  end
  alias_method :capitalize_word, :em_capitol_case

  private def em_lower_case(key)
    if @line.bytesize > @byte_pointer
      byte_size, = Reline::Unicode.em_forward_word(@line, @byte_pointer)
      part = @line.byteslice(@byte_pointer, byte_size).grapheme_clusters.map { |mbchar|
        mbchar =~ /[A-Z]/ ? mbchar.downcase : mbchar
      }.join
      rest = @line.byteslice((@byte_pointer + byte_size)..-1)
      @line = @line.byteslice(0, @byte_pointer) + part
      @byte_pointer = @line.bytesize
      @cursor = calculate_width(@line)
      @cursor_max = @cursor + calculate_width(rest)
      @line += rest
    end
  end
  alias_method :downcase_word, :em_lower_case

  private def em_upper_case(key)
    if @line.bytesize > @byte_pointer
      byte_size, = Reline::Unicode.em_forward_word(@line, @byte_pointer)
      part = @line.byteslice(@byte_pointer, byte_size).grapheme_clusters.map { |mbchar|
        mbchar =~ /[a-z]/ ? mbchar.upcase : mbchar
      }.join
      rest = @line.byteslice((@byte_pointer + byte_size)..-1)
      @line = @line.byteslice(0, @byte_pointer) + part
      @byte_pointer = @line.bytesize
      @cursor = calculate_width(@line)
      @cursor_max = @cursor + calculate_width(rest)
      @line += rest
    end
  end
  alias_method :upcase_word, :em_upper_case

  private def em_kill_region(key)
    if @byte_pointer > 0
      byte_size, width = Reline::Unicode.em_big_backward_word(@line, @byte_pointer)
      @line, deleted = byteslice!(@line, @byte_pointer - byte_size, byte_size)
      @byte_pointer -= byte_size
      @cursor -= width
      @cursor_max -= width
      @kill_ring.append(deleted, true)
    end
  end
  alias_method :unix_word_rubout, :em_kill_region

  private def copy_for_vi(text)
    if @config.editing_mode_is?(:vi_insert) or @config.editing_mode_is?(:vi_command)
      @vi_clipboard = text
    end
  end

  private def vi_insert(key)
    @config.editing_mode = :vi_insert
  end

  private def vi_add(key)
    @config.editing_mode = :vi_insert
    ed_next_char(key)
  end

  private def vi_command_mode(key)
    ed_prev_char(key)
    @config.editing_mode = :vi_command
  end
  alias_method :vi_movement_mode, :vi_command_mode

  private def vi_next_word(key, arg: 1)
    if @line.bytesize > @byte_pointer
      byte_size, width = Reline::Unicode.vi_forward_word(@line, @byte_pointer, @drop_terminate_spaces)
      @byte_pointer += byte_size
      @cursor += width
    end
    arg -= 1
    vi_next_word(key, arg: arg) if arg > 0
  end

  private def vi_prev_word(key, arg: 1)
    if @byte_pointer > 0
      byte_size, width = Reline::Unicode.vi_backward_word(@line, @byte_pointer)
      @byte_pointer -= byte_size
      @cursor -= width
    end
    arg -= 1
    vi_prev_word(key, arg: arg) if arg > 0
  end

  private def vi_end_word(key, arg: 1, inclusive: false)
    if @line.bytesize > @byte_pointer
      byte_size, width = Reline::Unicode.vi_forward_end_word(@line, @byte_pointer)
      @byte_pointer += byte_size
      @cursor += width
    end
    arg -= 1
    if inclusive and arg.zero?
      byte_size = Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer)
      if byte_size > 0
        c = @line.byteslice(@byte_pointer, byte_size)
        width = Reline::Unicode.get_mbchar_width(c)
        @byte_pointer += byte_size
        @cursor += width
      end
    end
    vi_end_word(key, arg: arg) if arg > 0
  end

  private def vi_next_big_word(key, arg: 1)
    if @line.bytesize > @byte_pointer
      byte_size, width = Reline::Unicode.vi_big_forward_word(@line, @byte_pointer)
      @byte_pointer += byte_size
      @cursor += width
    end
    arg -= 1
    vi_next_big_word(key, arg: arg) if arg > 0
  end

  private def vi_prev_big_word(key, arg: 1)
    if @byte_pointer > 0
      byte_size, width = Reline::Unicode.vi_big_backward_word(@line, @byte_pointer)
      @byte_pointer -= byte_size
      @cursor -= width
    end
    arg -= 1
    vi_prev_big_word(key, arg: arg) if arg > 0
  end

  private def vi_end_big_word(key, arg: 1, inclusive: false)
    if @line.bytesize > @byte_pointer
      byte_size, width = Reline::Unicode.vi_big_forward_end_word(@line, @byte_pointer)
      @byte_pointer += byte_size
      @cursor += width
    end
    arg -= 1
    if inclusive and arg.zero?
      byte_size = Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer)
      if byte_size > 0
        c = @line.byteslice(@byte_pointer, byte_size)
        width = Reline::Unicode.get_mbchar_width(c)
        @byte_pointer += byte_size
        @cursor += width
      end
    end
    vi_end_big_word(key, arg: arg) if arg > 0
  end

  private def vi_delete_prev_char(key)
    if @is_multiline and @cursor == 0 and @line_index > 0
      @buffer_of_lines[@line_index] = @line
      @cursor = calculate_width(@buffer_of_lines[@line_index - 1])
      @byte_pointer = @buffer_of_lines[@line_index - 1].bytesize
      @buffer_of_lines[@line_index - 1] += @buffer_of_lines.delete_at(@line_index)
      @line_index -= 1
      @line = @buffer_of_lines[@line_index]
      @cursor_max = calculate_width(@line)
      @rerender_all = true
    elsif @cursor > 0
      byte_size = Reline::Unicode.get_prev_mbchar_size(@line, @byte_pointer)
      @byte_pointer -= byte_size
      @line, mbchar = byteslice!(@line, @byte_pointer, byte_size)
      width = Reline::Unicode.get_mbchar_width(mbchar)
      @cursor -= width
      @cursor_max -= width
    end
  end

  private def vi_insert_at_bol(key)
    ed_move_to_beg(key)
    @config.editing_mode = :vi_insert
  end

  private def vi_add_at_eol(key)
    ed_move_to_end(key)
    @config.editing_mode = :vi_insert
  end

  private def ed_delete_prev_char(key, arg: 1)
    deleted = ''
    arg.times do
      if @cursor > 0
        byte_size = Reline::Unicode.get_prev_mbchar_size(@line, @byte_pointer)
        @byte_pointer -= byte_size
        @line, mbchar = byteslice!(@line, @byte_pointer, byte_size)
        deleted.prepend(mbchar)
        width = Reline::Unicode.get_mbchar_width(mbchar)
        @cursor -= width
        @cursor_max -= width
      end
    end
    copy_for_vi(deleted)
  end

  private def vi_zero(key)
    @byte_pointer = 0
    @cursor = 0
  end

  private def vi_change_meta(key, arg: 1)
    @drop_terminate_spaces = true
    @waiting_operator_proc = proc { |cursor_diff, byte_pointer_diff|
      if byte_pointer_diff > 0
        @line, cut = byteslice!(@line, @byte_pointer, byte_pointer_diff)
      elsif byte_pointer_diff < 0
        @line, cut = byteslice!(@line, @byte_pointer + byte_pointer_diff, -byte_pointer_diff)
      end
      copy_for_vi(cut)
      @cursor += cursor_diff if cursor_diff < 0
      @cursor_max -= cursor_diff.abs
      @byte_pointer += byte_pointer_diff if byte_pointer_diff < 0
      @config.editing_mode = :vi_insert
      @drop_terminate_spaces = false
    }
    @waiting_operator_vi_arg = arg
  end

  private def vi_delete_meta(key, arg: 1)
    @waiting_operator_proc = proc { |cursor_diff, byte_pointer_diff|
      if byte_pointer_diff > 0
        @line, cut = byteslice!(@line, @byte_pointer, byte_pointer_diff)
      elsif byte_pointer_diff < 0
        @line, cut = byteslice!(@line, @byte_pointer + byte_pointer_diff, -byte_pointer_diff)
      end
      copy_for_vi(cut)
      @cursor += cursor_diff if cursor_diff < 0
      @cursor_max -= cursor_diff.abs
      @byte_pointer += byte_pointer_diff if byte_pointer_diff < 0
    }
    @waiting_operator_vi_arg = arg
  end

  private def vi_yank(key, arg: 1)
    @waiting_operator_proc = proc { |cursor_diff, byte_pointer_diff|
      if byte_pointer_diff > 0
        cut = @line.byteslice(@byte_pointer, byte_pointer_diff)
      elsif byte_pointer_diff < 0
        cut = @line.byteslice(@byte_pointer + byte_pointer_diff, -byte_pointer_diff)
      end
      copy_for_vi(cut)
    }
    @waiting_operator_vi_arg = arg
  end

  private def vi_list_or_eof(key)
    if (not @is_multiline and @line.empty?) or (@is_multiline and @line.empty? and @buffer_of_lines.size == 1)
      @line = nil
      if @buffer_of_lines.size > 1
        scroll_down(@highest_in_all - @first_line_started_from)
      end
      Reline::IOGate.move_cursor_column(0)
      @eof = true
      finish
    else
      ed_newline(key)
    end
  end
  alias_method :vi_end_of_transmission, :vi_list_or_eof
  alias_method :vi_eof_maybe, :vi_list_or_eof

  private def ed_delete_next_char(key, arg: 1)
    byte_size = Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer)
    unless @line.empty? || byte_size == 0
      @line, mbchar = byteslice!(@line, @byte_pointer, byte_size)
      copy_for_vi(mbchar)
      width = Reline::Unicode.get_mbchar_width(mbchar)
      @cursor_max -= width
      if @cursor > 0 and @cursor >= @cursor_max
        byte_size = Reline::Unicode.get_prev_mbchar_size(@line, @byte_pointer)
        mbchar = @line.byteslice(@byte_pointer - byte_size, byte_size)
        width = Reline::Unicode.get_mbchar_width(mbchar)
        @byte_pointer -= byte_size
        @cursor -= width
      end
    end
    arg -= 1
    ed_delete_next_char(key, arg: arg) if arg > 0
  end

  private def vi_to_history_line(key)
    if Reline::HISTORY.empty?
      return
    end
    if @history_pointer.nil?
      @history_pointer = 0
      @line_backup_in_history = @line
      @line = Reline::HISTORY[@history_pointer]
      @cursor_max = calculate_width(@line)
      @cursor = 0
      @byte_pointer = 0
    elsif @history_pointer.zero?
      return
    else
      Reline::HISTORY[@history_pointer] = @line
      @history_pointer = 0
      @line = Reline::HISTORY[@history_pointer]
      @cursor_max = calculate_width(@line)
      @cursor = 0
      @byte_pointer = 0
    end
  end

  private def vi_histedit(key)
    path = Tempfile.open { |fp|
      if @is_multiline
        fp.write whole_lines.join("\n")
      else
        fp.write @line
      end
      fp.path
    }
    system("#{ENV['EDITOR']} #{path}")
    if @is_multiline
      @buffer_of_lines = File.read(path).split("\n")
      @buffer_of_lines = [String.new(encoding: @encoding)] if @buffer_of_lines.empty?
      @line_index = 0
      @line = @buffer_of_lines[@line_index]
      @rerender_all = true
    else
      @line = File.read(path)
    end
    finish
  end

  private def vi_paste_prev(key, arg: 1)
    if @vi_clipboard.size > 0
      @line = byteinsert(@line, @byte_pointer, @vi_clipboard)
      @cursor_max += calculate_width(@vi_clipboard)
      cursor_point = @vi_clipboard.grapheme_clusters[0..-2].join
      @cursor += calculate_width(cursor_point)
      @byte_pointer += cursor_point.bytesize
    end
    arg -= 1
    vi_paste_prev(key, arg: arg) if arg > 0
  end

  private def vi_paste_next(key, arg: 1)
    if @vi_clipboard.size > 0
      byte_size = Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer)
      @line = byteinsert(@line, @byte_pointer + byte_size, @vi_clipboard)
      @cursor_max += calculate_width(@vi_clipboard)
      @cursor += calculate_width(@vi_clipboard)
      @byte_pointer += @vi_clipboard.bytesize
    end
    arg -= 1
    vi_paste_next(key, arg: arg) if arg > 0
  end

  private def ed_argument_digit(key)
    if @vi_arg.nil?
      if key.chr.to_i.zero?
        if key.anybits?(0b10000000)
          unescaped_key = key ^ 0b10000000
          unless unescaped_key.chr.to_i.zero?
            @vi_arg = unescaped_key.chr.to_i
          end
        end
      else
        @vi_arg = key.chr.to_i
      end
    else
      @vi_arg = @vi_arg * 10 + key.chr.to_i
    end
  end

  private def vi_to_column(key, arg: 0)
    @byte_pointer, @cursor = @line.grapheme_clusters.inject([0, 0]) { |total, gc|
      # total has [byte_size, cursor]
      mbchar_width = Reline::Unicode.get_mbchar_width(gc)
      if (total.last + mbchar_width) >= arg
        break total
      elsif (total.last + mbchar_width) >= @cursor_max
        break total
      else
        total = [total.first + gc.bytesize, total.last + mbchar_width]
        total
      end
    }
  end

  private def vi_replace_char(key, arg: 1)
    @waiting_proc = ->(k) {
      if arg == 1
        byte_size = Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer)
        before = @line.byteslice(0, @byte_pointer)
        remaining_point = @byte_pointer + byte_size
        after = @line.byteslice(remaining_point, @line.bytesize - remaining_point)
        @line = before + k.chr + after
        @cursor_max = calculate_width(@line)
        @waiting_proc = nil
      elsif arg > 1
        byte_size = 0
        arg.times do
          byte_size += Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer + byte_size)
        end
        before = @line.byteslice(0, @byte_pointer)
        remaining_point = @byte_pointer + byte_size
        after = @line.byteslice(remaining_point, @line.bytesize - remaining_point)
        replaced = k.chr * arg
        @line = before + replaced + after
        @byte_pointer += replaced.bytesize
        @cursor += calculate_width(replaced)
        @cursor_max = calculate_width(@line)
        @waiting_proc = nil
      end
    }
  end

  private def vi_next_char(key, arg: 1, inclusive: false)
    @waiting_proc = ->(key_for_proc) { search_next_char(key_for_proc, arg, inclusive: inclusive) }
  end

  private def vi_to_next_char(key, arg: 1, inclusive: false)
    @waiting_proc = ->(key_for_proc) { search_next_char(key_for_proc, arg, need_prev_char: true, inclusive: inclusive) }
  end

  private def search_next_char(key, arg, need_prev_char: false, inclusive: false)
    if key.instance_of?(String)
      inputed_char = key
    else
      inputed_char = key.chr
    end
    prev_total = nil
    total = nil
    found = false
    @line.byteslice(@byte_pointer..-1).grapheme_clusters.each do |mbchar|
      # total has [byte_size, cursor]
      unless total
        # skip cursor point
        width = Reline::Unicode.get_mbchar_width(mbchar)
        total = [mbchar.bytesize, width]
      else
        if inputed_char == mbchar
          arg -= 1
          if arg.zero?
            found = true
            break
          end
        end
        width = Reline::Unicode.get_mbchar_width(mbchar)
        prev_total = total
        total = [total.first + mbchar.bytesize, total.last + width]
      end
    end
    if not need_prev_char and found and total
      byte_size, width = total
      @byte_pointer += byte_size
      @cursor += width
    elsif need_prev_char and found and prev_total
      byte_size, width = prev_total
      @byte_pointer += byte_size
      @cursor += width
    end
    if inclusive
      byte_size = Reline::Unicode.get_next_mbchar_size(@line, @byte_pointer)
      if byte_size > 0
        c = @line.byteslice(@byte_pointer, byte_size)
        width = Reline::Unicode.get_mbchar_width(c)
        @byte_pointer += byte_size
        @cursor += width
      end
    end
    @waiting_proc = nil
  end

  private def vi_prev_char(key, arg: 1)
    @waiting_proc = ->(key_for_proc) { search_prev_char(key_for_proc, arg) }
  end

  private def vi_to_prev_char(key, arg: 1)
    @waiting_proc = ->(key_for_proc) { search_prev_char(key_for_proc, arg, true) }
  end

  private def search_prev_char(key, arg, need_next_char = false)
    if key.instance_of?(String)
      inputed_char = key
    else
      inputed_char = key.chr
    end
    prev_total = nil
    total = nil
    found = false
    @line.byteslice(0..@byte_pointer).grapheme_clusters.reverse_each do |mbchar|
      # total has [byte_size, cursor]
      unless total
        # skip cursor point
        width = Reline::Unicode.get_mbchar_width(mbchar)
        total = [mbchar.bytesize, width]
      else
        if inputed_char == mbchar
          arg -= 1
          if arg.zero?
            found = true
            break
          end
        end
        width = Reline::Unicode.get_mbchar_width(mbchar)
        prev_total = total
        total = [total.first + mbchar.bytesize, total.last + width]
      end
    end
    if not need_next_char and found and total
      byte_size, width = total
      @byte_pointer -= byte_size
      @cursor -= width
    elsif need_next_char and found and prev_total
      byte_size, width = prev_total
      @byte_pointer -= byte_size
      @cursor -= width
    end
    @waiting_proc = nil
  end

  private def vi_join_lines(key, arg: 1)
    if @is_multiline and @buffer_of_lines.size > @line_index + 1
      @cursor = calculate_width(@line)
      @byte_pointer = @line.bytesize
      @line += ' ' + @buffer_of_lines.delete_at(@line_index + 1).lstrip
      @cursor_max = calculate_width(@line)
      @buffer_of_lines[@line_index] = @line
      @rerender_all = true
      @rest_height += 1
    end
    arg -= 1
    vi_join_lines(key, arg: arg) if arg > 0
  end

  private def em_set_mark(key)
    @mark_pointer = [@byte_pointer, @line_index]
  end
  alias_method :set_mark, :em_set_mark

  private def em_exchange_mark(key)
    return unless @mark_pointer
    new_pointer = [@byte_pointer, @line_index]
    @previous_line_index = @line_index
    @byte_pointer, @line_index = @mark_pointer
    @cursor = calculate_width(@line.byteslice(0, @byte_pointer))
    @cursor_max = calculate_width(@line)
    @mark_pointer = new_pointer
  end
  alias_method :exchange_point_and_mark, :em_exchange_mark
end
PK"}$[��\_��ruby/reline/general_io.rbnu�[���require 'timeout'
require 'io/wait'

class Reline::GeneralIO
  def self.reset(encoding: nil)
    @@pasting = false
    @@encoding = encoding
  end

  def self.encoding
    if defined?(@@encoding)
      @@encoding
    elsif RUBY_PLATFORM =~ /mswin|mingw/
      Encoding::UTF_8
    else
      Encoding::default_external
    end
  end

  def self.win?
    false
  end

  def self.set_default_key_bindings(_)
  end

  @@buf = []
  @@input = STDIN

  def self.input=(val)
    @@input = val
  end

  def self.getc
    unless @@buf.empty?
      return @@buf.shift
    end
    c = nil
    loop do
      result = @@input.wait_readable(0.1)
      next if result.nil?
      c = @@input.read(1)
      break
    end
    c&.ord
  end

  def self.ungetc(c)
    @@buf.unshift(c)
  end

  def self.get_screen_size
    [1, 1]
  end

  def self.cursor_pos
    Reline::CursorPos.new(1, 1)
  end

  def self.move_cursor_column(val)
  end

  def self.move_cursor_up(val)
  end

  def self.move_cursor_down(val)
  end

  def self.erase_after_cursor
  end

  def self.scroll_down(val)
  end

  def self.clear_screen
  end

  def self.set_screen_size(rows, columns)
  end

  def self.set_winch_handler(&handler)
  end

  @@pasting = false

  def self.in_pasting?
    @@pasting
  end

  def self.start_pasting
    @@pasting = true
  end

  def self.finish_pasting
    @@pasting = false
  end

  def self.prep
  end

  def self.deprep(otio)
  end
end
PK"}$[.x�p��ruby/reline/key_actor.rbnu�[���module Reline::KeyActor
end

require 'reline/key_actor/base'
require 'reline/key_actor/emacs'
require 'reline/key_actor/vi_command'
require 'reline/key_actor/vi_insert'
PK"}$[��11ruby/reline/key_actor/base.rbnu�[���class Reline::KeyActor::Base
  MAPPING = Array.new(256)

  def get_method(key)
    self.class::MAPPING[key]
  end

  def initialize
    @default_key_bindings = {}
  end

  def default_key_bindings
    @default_key_bindings
  end

  def reset_default_key_bindings
    @default_key_bindings.clear
  end
end
PK"}$[AY'�m m ruby/reline/key_actor/emacs.rbnu�[���class Reline::KeyActor::Emacs < Reline::KeyActor::Base
  MAPPING = [
    #   0 ^@
    :em_set_mark,
    #   1 ^A
    :ed_move_to_beg,
    #   2 ^B
    :ed_prev_char,
    #   3 ^C
    :ed_ignore,
    #   4 ^D
    :em_delete,
    #   5 ^E
    :ed_move_to_end,
    #   6 ^F
    :ed_next_char,
    #   7 ^G
    :ed_unassigned,
    #   8 ^H
    :em_delete_prev_char,
    #   9 ^I
    :ed_unassigned,
    #  10 ^J
    :ed_newline,
    #  11 ^K
    :ed_kill_line,
    #  12 ^L
    :ed_clear_screen,
    #  13 ^M
    :ed_newline,
    #  14 ^N
    :ed_next_history,
    #  15 ^O
    :ed_ignore,
    #  16 ^P
    :ed_prev_history,
    #  17 ^Q
    :ed_quoted_insert,
    #  18 ^R
    :vi_search_prev,
    #  19 ^S
    :vi_search_next,
    #  20 ^T
    :ed_transpose_chars,
    #  21 ^U
    :unix_line_discard,
    #  22 ^V
    :ed_quoted_insert,
    #  23 ^W
    :em_kill_region,
    #  24 ^X
    :ed_sequence_lead_in,
    #  25 ^Y
    :em_yank,
    #  26 ^Z
    :ed_ignore,
    #  27 ^[
    :em_meta_next,
    #  28 ^\
    :ed_ignore,
    #  29 ^]
    :ed_ignore,
    #  30 ^^
    :ed_unassigned,
    #  31 ^_
    :ed_unassigned,
    #  32 SPACE
    :ed_insert,
    #  33 !
    :ed_insert,
    #  34 "
    :ed_insert,
    #  35 #
    :ed_insert,
    #  36 $
    :ed_insert,
    #  37 %
    :ed_insert,
    #  38 &
    :ed_insert,
    #  39 '
    :ed_insert,
    #  40 (
    :ed_insert,
    #  41 )
    :ed_insert,
    #  42 *
    :ed_insert,
    #  43 +
    :ed_insert,
    #  44 ,
    :ed_insert,
    #  45 -
    :ed_insert,
    #  46 .
    :ed_insert,
    #  47 /
    :ed_insert,
    #  48 0
    :ed_digit,
    #  49 1
    :ed_digit,
    #  50 2
    :ed_digit,
    #  51 3
    :ed_digit,
    #  52 4
    :ed_digit,
    #  53 5
    :ed_digit,
    #  54 6
    :ed_digit,
    #  55 7
    :ed_digit,
    #  56 8
    :ed_digit,
    #  57 9
    :ed_digit,
    #  58 :
    :ed_insert,
    #  59 ;
    :ed_insert,
    #  60 <
    :ed_insert,
    #  61 =
    :ed_insert,
    #  62 >
    :ed_insert,
    #  63 ?
    :ed_insert,
    #  64 @
    :ed_insert,
    #  65 A
    :ed_insert,
    #  66 B
    :ed_insert,
    #  67 C
    :ed_insert,
    #  68 D
    :ed_insert,
    #  69 E
    :ed_insert,
    #  70 F
    :ed_insert,
    #  71 G
    :ed_insert,
    #  72 H
    :ed_insert,
    #  73 I
    :ed_insert,
    #  74 J
    :ed_insert,
    #  75 K
    :ed_insert,
    #  76 L
    :ed_insert,
    #  77 M
    :ed_insert,
    #  78 N
    :ed_insert,
    #  79 O
    :ed_insert,
    #  80 P
    :ed_insert,
    #  81 Q
    :ed_insert,
    #  82 R
    :ed_insert,
    #  83 S
    :ed_insert,
    #  84 T
    :ed_insert,
    #  85 U
    :ed_insert,
    #  86 V
    :ed_insert,
    #  87 W
    :ed_insert,
    #  88 X
    :ed_insert,
    #  89 Y
    :ed_insert,
    #  90 Z
    :ed_insert,
    #  91 [
    :ed_insert,
    #  92 \
    :ed_insert,
    #  93 ]
    :ed_insert,
    #  94 ^
    :ed_insert,
    #  95 _
    :ed_insert,
    #  96 `
    :ed_insert,
    #  97 a
    :ed_insert,
    #  98 b
    :ed_insert,
    #  99 c
    :ed_insert,
    # 100 d
    :ed_insert,
    # 101 e
    :ed_insert,
    # 102 f
    :ed_insert,
    # 103 g
    :ed_insert,
    # 104 h
    :ed_insert,
    # 105 i
    :ed_insert,
    # 106 j
    :ed_insert,
    # 107 k
    :ed_insert,
    # 108 l
    :ed_insert,
    # 109 m
    :ed_insert,
    # 110 n
    :ed_insert,
    # 111 o
    :ed_insert,
    # 112 p
    :ed_insert,
    # 113 q
    :ed_insert,
    # 114 r
    :ed_insert,
    # 115 s
    :ed_insert,
    # 116 t
    :ed_insert,
    # 117 u
    :ed_insert,
    # 118 v
    :ed_insert,
    # 119 w
    :ed_insert,
    # 120 x
    :ed_insert,
    # 121 y
    :ed_insert,
    # 122 z
    :ed_insert,
    # 123 {
    :ed_insert,
    # 124 |
    :ed_insert,
    # 125 }
    :ed_insert,
    # 126 ~
    :ed_insert,
    # 127 ^?
    :em_delete_prev_char,
    # 128 M-^@
    :ed_unassigned,
    # 129 M-^A
    :ed_unassigned,
    # 130 M-^B
    :ed_unassigned,
    # 131 M-^C
    :ed_unassigned,
    # 132 M-^D
    :ed_unassigned,
    # 133 M-^E
    :ed_unassigned,
    # 134 M-^F
    :ed_unassigned,
    # 135 M-^G
    :ed_unassigned,
    # 136 M-^H
    :ed_delete_prev_word,
    # 137 M-^I
    :ed_unassigned,
    # 138 M-^J
    :key_newline,
    # 139 M-^K
    :ed_unassigned,
    # 140 M-^L
    :ed_clear_screen,
    # 141 M-^M
    :key_newline,
    # 142 M-^N
    :ed_unassigned,
    # 143 M-^O
    :ed_unassigned,
    # 144 M-^P
    :ed_unassigned,
    # 145 M-^Q
    :ed_unassigned,
    # 146 M-^R
    :ed_unassigned,
    # 147 M-^S
    :ed_unassigned,
    # 148 M-^T
    :ed_unassigned,
    # 149 M-^U
    :ed_unassigned,
    # 150 M-^V
    :ed_unassigned,
    # 151 M-^W
    :ed_unassigned,
    # 152 M-^X
    :ed_unassigned,
    # 153 M-^Y
    :em_yank_pop,
    # 154 M-^Z
    :ed_unassigned,
    # 155 M-^[
    :ed_unassigned,
    # 156 M-^\
    :ed_unassigned,
    # 157 M-^]
    :ed_unassigned,
    # 158 M-^^
    :ed_unassigned,
    # 159 M-^_
    :em_copy_prev_word,
    # 160 M-SPACE
    :ed_unassigned,
    # 161 M-!
    :ed_unassigned,
    # 162 M-"
    :ed_unassigned,
    # 163 M-#
    :ed_unassigned,
    # 164 M-$
    :ed_unassigned,
    # 165 M-%
    :ed_unassigned,
    # 166 M-&
    :ed_unassigned,
    # 167 M-'
    :ed_unassigned,
    # 168 M-(
    :ed_unassigned,
    # 169 M-)
    :ed_unassigned,
    # 170 M-*
    :ed_unassigned,
    # 171 M-+
    :ed_unassigned,
    # 172 M-,
    :ed_unassigned,
    # 173 M--
    :ed_unassigned,
    # 174 M-.
    :ed_unassigned,
    # 175 M-/
    :ed_unassigned,
    # 176 M-0
    :ed_argument_digit,
    # 177 M-1
    :ed_argument_digit,
    # 178 M-2
    :ed_argument_digit,
    # 179 M-3
    :ed_argument_digit,
    # 180 M-4
    :ed_argument_digit,
    # 181 M-5
    :ed_argument_digit,
    # 182 M-6
    :ed_argument_digit,
    # 183 M-7
    :ed_argument_digit,
    # 184 M-8
    :ed_argument_digit,
    # 185 M-9
    :ed_argument_digit,
    # 186 M-:
    :ed_unassigned,
    # 187 M-;
    :ed_unassigned,
    # 188 M-<
    :ed_unassigned,
    # 189 M-=
    :ed_unassigned,
    # 190 M->
    :ed_unassigned,
    # 191 M-?
    :ed_unassigned,
    # 192 M-@
    :ed_unassigned,
    # 193 M-A
    :ed_unassigned,
    # 194 M-B
    :ed_prev_word,
    # 195 M-C
    :em_capitol_case,
    # 196 M-D
    :em_delete_next_word,
    # 197 M-E
    :ed_unassigned,
    # 198 M-F
    :em_next_word,
    # 199 M-G
    :ed_unassigned,
    # 200 M-H
    :ed_unassigned,
    # 201 M-I
    :ed_unassigned,
    # 202 M-J
    :ed_unassigned,
    # 203 M-K
    :ed_unassigned,
    # 204 M-L
    :em_lower_case,
    # 205 M-M
    :ed_unassigned,
    # 206 M-N
    :vi_search_next,
    # 207 M-O
    :ed_sequence_lead_in,
    # 208 M-P
    :vi_search_prev,
    # 209 M-Q
    :ed_unassigned,
    # 210 M-R
    :ed_unassigned,
    # 211 M-S
    :ed_unassigned,
    # 212 M-T
    :ed_unassigned,
    # 213 M-U
    :em_upper_case,
    # 214 M-V
    :ed_unassigned,
    # 215 M-W
    :em_copy_region,
    # 216 M-X
    :ed_command,
    # 217 M-Y
    :ed_unassigned,
    # 218 M-Z
    :ed_unassigned,
    # 219 M-[
    :ed_sequence_lead_in,
    # 220 M-\
    :ed_unassigned,
    # 221 M-]
    :ed_unassigned,
    # 222 M-^
    :ed_unassigned,
    # 223 M-_
    :ed_unassigned,
    # 224 M-`
    :ed_unassigned,
    # 225 M-a
    :ed_unassigned,
    # 226 M-b
    :ed_prev_word,
    # 227 M-c
    :em_capitol_case,
    # 228 M-d
    :em_delete_next_word,
    # 229 M-e
    :ed_unassigned,
    # 230 M-f
    :em_next_word,
    # 231 M-g
    :ed_unassigned,
    # 232 M-h
    :ed_unassigned,
    # 233 M-i
    :ed_unassigned,
    # 234 M-j
    :ed_unassigned,
    # 235 M-k
    :ed_unassigned,
    # 236 M-l
    :em_lower_case,
    # 237 M-m
    :ed_unassigned,
    # 238 M-n
    :vi_search_next,
    # 239 M-o
    :ed_unassigned,
    # 240 M-p
    :vi_search_prev,
    # 241 M-q
    :ed_unassigned,
    # 242 M-r
    :ed_unassigned,
    # 243 M-s
    :ed_unassigned,
    # 244 M-t
    :ed_transpose_words,
    # 245 M-u
    :em_upper_case,
    # 246 M-v
    :ed_unassigned,
    # 247 M-w
    :em_copy_region,
    # 248 M-x
    :ed_command,
    # 249 M-y
    :ed_unassigned,
    # 250 M-z
    :ed_unassigned,
    # 251 M-{
    :ed_unassigned,
    # 252 M-|
    :ed_unassigned,
    # 253 M-}
    :ed_unassigned,
    # 254 M-~
    :ed_unassigned,
    # 255 M-^?
    :ed_delete_prev_word
    # EOF
  ]
end
PK"}$[P�Z�""#ruby/reline/key_actor/vi_command.rbnu�[���class Reline::KeyActor::ViCommand < Reline::KeyActor::Base
  MAPPING = [
    #   0 ^@
    :ed_unassigned,
    #   1 ^A
    :ed_move_to_beg,
    #   2 ^B
    :ed_unassigned,
    #   3 ^C
    :ed_ignore,
    #   4 ^D
    :vi_end_of_transmission,
    #   5 ^E
    :ed_move_to_end,
    #   6 ^F
    :ed_unassigned,
    #   7 ^G
    :ed_unassigned,
    #   8 ^H
    :ed_unassigned,
    #   9 ^I
    :ed_unassigned,
    #  10 ^J
    :ed_newline,
    #  11 ^K
    :ed_kill_line,
    #  12 ^L
    :ed_clear_screen,
    #  13 ^M
    :ed_newline,
    #  14 ^N
    :ed_next_history,
    #  15 ^O
    :ed_ignore,
    #  16 ^P
    :ed_prev_history,
    #  17 ^Q
    :ed_ignore,
    #  18 ^R
    :vi_search_prev,
    #  19 ^S
    :ed_ignore,
    #  20 ^T
    :ed_unassigned,
    #  21 ^U
    :vi_kill_line_prev,
    #  22 ^V
    :ed_quoted_insert,
    #  23 ^W
    :ed_delete_prev_word,
    #  24 ^X
    :ed_unassigned,
    #  25 ^Y
    :ed_unassigned,
    #  26 ^Z
    :ed_unassigned,
    #  27 ^[
    :ed_unassigned,
    #  28 ^\
    :ed_ignore,
    #  29 ^]
    :ed_unassigned,
    #  30 ^^
    :ed_unassigned,
    #  31 ^_
    :ed_unassigned,
    #  32 SPACE
    :ed_next_char,
    #  33 !
    :ed_unassigned,
    #  34 "
    :ed_unassigned,
    #  35 #
    :vi_comment_out,
    #  36 $
    :ed_move_to_end,
    #  37 %
    :vi_match,
    #  38 &
    :ed_unassigned,
    #  39 '
    :ed_unassigned,
    #  40 (
    :ed_unassigned,
    #  41 )
    :ed_unassigned,
    #  42 *
    :ed_unassigned,
    #  43 +
    :ed_next_history,
    #  44 ,
    :vi_repeat_prev_char,
    #  45 -
    :ed_prev_history,
    #  46 .
    :vi_redo,
    #  47 /
    :vi_search_prev,
    #  48 0
    :vi_zero,
    #  49 1
    :ed_argument_digit,
    #  50 2
    :ed_argument_digit,
    #  51 3
    :ed_argument_digit,
    #  52 4
    :ed_argument_digit,
    #  53 5
    :ed_argument_digit,
    #  54 6
    :ed_argument_digit,
    #  55 7
    :ed_argument_digit,
    #  56 8
    :ed_argument_digit,
    #  57 9
    :ed_argument_digit,
    #  58 :
    :ed_command,
    #  59 ;
    :vi_repeat_next_char,
    #  60 <
    :ed_unassigned,
    #  61 =
    :ed_unassigned,
    #  62 >
    :ed_unassigned,
    #  63 ?
    :vi_search_next,
    #  64 @
    :vi_alias,
    #  65 A
    :vi_add_at_eol,
    #  66 B
    :vi_prev_big_word,
    #  67 C
    :vi_change_to_eol,
    #  68 D
    :ed_kill_line,
    #  69 E
    :vi_end_big_word,
    #  70 F
    :vi_prev_char,
    #  71 G
    :vi_to_history_line,
    #  72 H
    :ed_unassigned,
    #  73 I
    :vi_insert_at_bol,
    #  74 J
    :vi_join_lines,
    #  75 K
    :vi_search_prev,
    #  76 L
    :ed_unassigned,
    #  77 M
    :ed_unassigned,
    #  78 N
    :vi_repeat_search_prev,
    #  79 O
    :ed_sequence_lead_in,
    #  80 P
    :vi_paste_prev,
    #  81 Q
    :ed_unassigned,
    #  82 R
    :vi_replace_mode,
    #  83 S
    :vi_substitute_line,
    #  84 T
    :vi_to_prev_char,
    #  85 U
    :vi_undo_line,
    #  86 V
    :ed_unassigned,
    #  87 W
    :vi_next_big_word,
    #  88 X
    :ed_delete_prev_char,
    #  89 Y
    :vi_yank_end,
    #  90 Z
    :ed_unassigned,
    #  91 [
    :ed_sequence_lead_in,
    #  92 \
    :ed_unassigned,
    #  93 ]
    :ed_unassigned,
    #  94 ^
    :vi_first_print,
    #  95 _
    :vi_history_word,
    #  96 `
    :ed_unassigned,
    #  97 a
    :vi_add,
    #  98 b
    :vi_prev_word,
    #  99 c
    :vi_change_meta,
    # 100 d
    :vi_delete_meta,
    # 101 e
    :vi_end_word,
    # 102 f
    :vi_next_char,
    # 103 g
    :ed_unassigned,
    # 104 h
    :ed_prev_char,
    # 105 i
    :vi_insert,
    # 106 j
    :ed_next_history,
    # 107 k
    :ed_prev_history,
    # 108 l
    :ed_next_char,
    # 109 m
    :ed_unassigned,
    # 110 n
    :vi_repeat_search_next,
    # 111 o
    :ed_unassigned,
    # 112 p
    :vi_paste_next,
    # 113 q
    :ed_unassigned,
    # 114 r
    :vi_replace_char,
    # 115 s
    :vi_substitute_char,
    # 116 t
    :vi_to_next_char,
    # 117 u
    :vi_undo,
    # 118 v
    :vi_histedit,
    # 119 w
    :vi_next_word,
    # 120 x
    :ed_delete_next_char,
    # 121 y
    :vi_yank,
    # 122 z
    :ed_unassigned,
    # 123 {
    :ed_unassigned,
    # 124 |
    :vi_to_column,
    # 125 }
    :ed_unassigned,
    # 126 ~
    :vi_change_case,
    # 127 ^?
    :ed_unassigned,
    # 128 M-^@
    :ed_unassigned,
    # 129 M-^A
    :ed_unassigned,
    # 130 M-^B
    :ed_unassigned,
    # 131 M-^C
    :ed_unassigned,
    # 132 M-^D
    :ed_unassigned,
    # 133 M-^E
    :ed_unassigned,
    # 134 M-^F
    :ed_unassigned,
    # 135 M-^G
    :ed_unassigned,
    # 136 M-^H
    :ed_unassigned,
    # 137 M-^I
    :ed_unassigned,
    # 138 M-^J
    :ed_unassigned,
    # 139 M-^K
    :ed_unassigned,
    # 140 M-^L
    :ed_unassigned,
    # 141 M-^M
    :ed_unassigned,
    # 142 M-^N
    :ed_unassigned,
    # 143 M-^O
    :ed_unassigned,
    # 144 M-^P
    :ed_unassigned,
    # 145 M-^Q
    :ed_unassigned,
    # 146 M-^R
    :ed_unassigned,
    # 147 M-^S
    :ed_unassigned,
    # 148 M-^T
    :ed_unassigned,
    # 149 M-^U
    :ed_unassigned,
    # 150 M-^V
    :ed_unassigned,
    # 151 M-^W
    :ed_unassigned,
    # 152 M-^X
    :ed_unassigned,
    # 153 M-^Y
    :ed_unassigned,
    # 154 M-^Z
    :ed_unassigned,
    # 155 M-^[
    :ed_unassigned,
    # 156 M-^\
    :ed_unassigned,
    # 157 M-^]
    :ed_unassigned,
    # 158 M-^^
    :ed_unassigned,
    # 159 M-^_
    :ed_unassigned,
    # 160 M-SPACE
    :ed_unassigned,
    # 161 M-!
    :ed_unassigned,
    # 162 M-"
    :ed_unassigned,
    # 163 M-#
    :ed_unassigned,
    # 164 M-$
    :ed_unassigned,
    # 165 M-%
    :ed_unassigned,
    # 166 M-&
    :ed_unassigned,
    # 167 M-'
    :ed_unassigned,
    # 168 M-(
    :ed_unassigned,
    # 169 M-)
    :ed_unassigned,
    # 170 M-*
    :ed_unassigned,
    # 171 M-+
    :ed_unassigned,
    # 172 M-,
    :ed_unassigned,
    # 173 M--
    :ed_unassigned,
    # 174 M-.
    :ed_unassigned,
    # 175 M-/
    :ed_unassigned,
    # 176 M-0
    :ed_unassigned,
    # 177 M-1
    :ed_unassigned,
    # 178 M-2
    :ed_unassigned,
    # 179 M-3
    :ed_unassigned,
    # 180 M-4
    :ed_unassigned,
    # 181 M-5
    :ed_unassigned,
    # 182 M-6
    :ed_unassigned,
    # 183 M-7
    :ed_unassigned,
    # 184 M-8
    :ed_unassigned,
    # 185 M-9
    :ed_unassigned,
    # 186 M-:
    :ed_unassigned,
    # 187 M-;
    :ed_unassigned,
    # 188 M-<
    :ed_unassigned,
    # 189 M-=
    :ed_unassigned,
    # 190 M->
    :ed_unassigned,
    # 191 M-?
    :ed_unassigned,
    # 192 M-@
    :ed_unassigned,
    # 193 M-A
    :ed_unassigned,
    # 194 M-B
    :ed_unassigned,
    # 195 M-C
    :ed_unassigned,
    # 196 M-D
    :ed_unassigned,
    # 197 M-E
    :ed_unassigned,
    # 198 M-F
    :ed_unassigned,
    # 199 M-G
    :ed_unassigned,
    # 200 M-H
    :ed_unassigned,
    # 201 M-I
    :ed_unassigned,
    # 202 M-J
    :ed_unassigned,
    # 203 M-K
    :ed_unassigned,
    # 204 M-L
    :ed_unassigned,
    # 205 M-M
    :ed_unassigned,
    # 206 M-N
    :ed_unassigned,
    # 207 M-O
    :ed_sequence_lead_in,
    # 208 M-P
    :ed_unassigned,
    # 209 M-Q
    :ed_unassigned,
    # 210 M-R
    :ed_unassigned,
    # 211 M-S
    :ed_unassigned,
    # 212 M-T
    :ed_unassigned,
    # 213 M-U
    :ed_unassigned,
    # 214 M-V
    :ed_unassigned,
    # 215 M-W
    :ed_unassigned,
    # 216 M-X
    :ed_unassigned,
    # 217 M-Y
    :ed_unassigned,
    # 218 M-Z
    :ed_unassigned,
    # 219 M-[
    :ed_sequence_lead_in,
    # 220 M-\
    :ed_unassigned,
    # 221 M-]
    :ed_unassigned,
    # 222 M-^
    :ed_unassigned,
    # 223 M-_
    :ed_unassigned,
    # 224 M-`
    :ed_unassigned,
    # 225 M-a
    :ed_unassigned,
    # 226 M-b
    :ed_unassigned,
    # 227 M-c
    :ed_unassigned,
    # 228 M-d
    :ed_unassigned,
    # 229 M-e
    :ed_unassigned,
    # 230 M-f
    :ed_unassigned,
    # 231 M-g
    :ed_unassigned,
    # 232 M-h
    :ed_unassigned,
    # 233 M-i
    :ed_unassigned,
    # 234 M-j
    :ed_unassigned,
    # 235 M-k
    :ed_unassigned,
    # 236 M-l
    :ed_unassigned,
    # 237 M-m
    :ed_unassigned,
    # 238 M-n
    :ed_unassigned,
    # 239 M-o
    :ed_unassigned,
    # 240 M-p
    :ed_unassigned,
    # 241 M-q
    :ed_unassigned,
    # 242 M-r
    :ed_unassigned,
    # 243 M-s
    :ed_unassigned,
    # 244 M-t
    :ed_unassigned,
    # 245 M-u
    :ed_unassigned,
    # 246 M-v
    :ed_unassigned,
    # 247 M-w
    :ed_unassigned,
    # 248 M-x
    :ed_unassigned,
    # 249 M-y
    :ed_unassigned,
    # 250 M-z
    :ed_unassigned,
    # 251 M-{
    :ed_unassigned,
    # 252 M-|
    :ed_unassigned,
    # 253 M-}
    :ed_unassigned,
    # 254 M-~
    :ed_unassigned,
    # 255 M-^?
    :ed_unassigned
    # EOF
  ]
end

PK"}$[V�����"ruby/reline/key_actor/vi_insert.rbnu�[���class Reline::KeyActor::ViInsert < Reline::KeyActor::Base
  MAPPING = [
    #   0 ^@
    :ed_unassigned,
    #   1 ^A
    :ed_insert,
    #   2 ^B
    :ed_insert,
    #   3 ^C
    :ed_insert,
    #   4 ^D
    :vi_list_or_eof,
    #   5 ^E
    :ed_insert,
    #   6 ^F
    :ed_insert,
    #   7 ^G
    :ed_insert,
    #   8 ^H
    :vi_delete_prev_char,
    #   9 ^I
    :ed_insert,
    #  10 ^J
    :ed_newline,
    #  11 ^K
    :ed_insert,
    #  12 ^L
    :ed_insert,
    #  13 ^M
    :ed_newline,
    #  14 ^N
    :ed_insert,
    #  15 ^O
    :ed_insert,
    #  16 ^P
    :ed_insert,
    #  17 ^Q
    :ed_ignore,
    #  18 ^R
    :vi_search_prev,
    #  19 ^S
    :vi_search_next,
    #  20 ^T
    :ed_insert,
    #  21 ^U
    :vi_kill_line_prev,
    #  22 ^V
    :ed_quoted_insert,
    #  23 ^W
    :ed_delete_prev_word,
    #  24 ^X
    :ed_insert,
    #  25 ^Y
    :ed_insert,
    #  26 ^Z
    :ed_insert,
    #  27 ^[
    :vi_command_mode,
    #  28 ^\
    :ed_ignore,
    #  29 ^]
    :ed_insert,
    #  30 ^^
    :ed_insert,
    #  31 ^_
    :ed_insert,
    #  32 SPACE
    :ed_insert,
    #  33 !
    :ed_insert,
    #  34 "
    :ed_insert,
    #  35 #
    :ed_insert,
    #  36 $
    :ed_insert,
    #  37 %
    :ed_insert,
    #  38 &
    :ed_insert,
    #  39 '
    :ed_insert,
    #  40 (
    :ed_insert,
    #  41 )
    :ed_insert,
    #  42 *
    :ed_insert,
    #  43 +
    :ed_insert,
    #  44 ,
    :ed_insert,
    #  45 -
    :ed_insert,
    #  46 .
    :ed_insert,
    #  47 /
    :ed_insert,
    #  48 0
    :ed_insert,
    #  49 1
    :ed_insert,
    #  50 2
    :ed_insert,
    #  51 3
    :ed_insert,
    #  52 4
    :ed_insert,
    #  53 5
    :ed_insert,
    #  54 6
    :ed_insert,
    #  55 7
    :ed_insert,
    #  56 8
    :ed_insert,
    #  57 9
    :ed_insert,
    #  58 :
    :ed_insert,
    #  59 ;
    :ed_insert,
    #  60 <
    :ed_insert,
    #  61 =
    :ed_insert,
    #  62 >
    :ed_insert,
    #  63 ?
    :ed_insert,
    #  64 @
    :ed_insert,
    #  65 A
    :ed_insert,
    #  66 B
    :ed_insert,
    #  67 C
    :ed_insert,
    #  68 D
    :ed_insert,
    #  69 E
    :ed_insert,
    #  70 F
    :ed_insert,
    #  71 G
    :ed_insert,
    #  72 H
    :ed_insert,
    #  73 I
    :ed_insert,
    #  74 J
    :ed_insert,
    #  75 K
    :ed_insert,
    #  76 L
    :ed_insert,
    #  77 M
    :ed_insert,
    #  78 N
    :ed_insert,
    #  79 O
    :ed_insert,
    #  80 P
    :ed_insert,
    #  81 Q
    :ed_insert,
    #  82 R
    :ed_insert,
    #  83 S
    :ed_insert,
    #  84 T
    :ed_insert,
    #  85 U
    :ed_insert,
    #  86 V
    :ed_insert,
    #  87 W
    :ed_insert,
    #  88 X
    :ed_insert,
    #  89 Y
    :ed_insert,
    #  90 Z
    :ed_insert,
    #  91 [
    :ed_insert,
    #  92 \
    :ed_insert,
    #  93 ]
    :ed_insert,
    #  94 ^
    :ed_insert,
    #  95 _
    :ed_insert,
    #  96 `
    :ed_insert,
    #  97 a
    :ed_insert,
    #  98 b
    :ed_insert,
    #  99 c
    :ed_insert,
    # 100 d
    :ed_insert,
    # 101 e
    :ed_insert,
    # 102 f
    :ed_insert,
    # 103 g
    :ed_insert,
    # 104 h
    :ed_insert,
    # 105 i
    :ed_insert,
    # 106 j
    :ed_insert,
    # 107 k
    :ed_insert,
    # 108 l
    :ed_insert,
    # 109 m
    :ed_insert,
    # 110 n
    :ed_insert,
    # 111 o
    :ed_insert,
    # 112 p
    :ed_insert,
    # 113 q
    :ed_insert,
    # 114 r
    :ed_insert,
    # 115 s
    :ed_insert,
    # 116 t
    :ed_insert,
    # 117 u
    :ed_insert,
    # 118 v
    :ed_insert,
    # 119 w
    :ed_insert,
    # 120 x
    :ed_insert,
    # 121 y
    :ed_insert,
    # 122 z
    :ed_insert,
    # 123 {
    :ed_insert,
    # 124 |
    :ed_insert,
    # 125 }
    :ed_insert,
    # 126 ~
    :ed_insert,
    # 127 ^?
    :vi_delete_prev_char,
    # 128 M-^@
    :ed_unassigned,
    # 129 M-^A
    :ed_unassigned,
    # 130 M-^B
    :ed_unassigned,
    # 131 M-^C
    :ed_unassigned,
    # 132 M-^D
    :ed_unassigned,
    # 133 M-^E
    :ed_unassigned,
    # 134 M-^F
    :ed_unassigned,
    # 135 M-^G
    :ed_unassigned,
    # 136 M-^H
    :ed_unassigned,
    # 137 M-^I
    :ed_unassigned,
    # 138 M-^J
    :key_newline,
    # 139 M-^K
    :ed_unassigned,
    # 140 M-^L
    :ed_unassigned,
    # 141 M-^M
    :key_newline,
    # 142 M-^N
    :ed_unassigned,
    # 143 M-^O
    :ed_unassigned,
    # 144 M-^P
    :ed_unassigned,
    # 145 M-^Q
    :ed_unassigned,
    # 146 M-^R
    :ed_unassigned,
    # 147 M-^S
    :ed_unassigned,
    # 148 M-^T
    :ed_unassigned,
    # 149 M-^U
    :ed_unassigned,
    # 150 M-^V
    :ed_unassigned,
    # 151 M-^W
    :ed_unassigned,
    # 152 M-^X
    :ed_unassigned,
    # 153 M-^Y
    :ed_unassigned,
    # 154 M-^Z
    :ed_unassigned,
    # 155 M-^[
    :ed_unassigned,
    # 156 M-^\
    :ed_unassigned,
    # 157 M-^]
    :ed_unassigned,
    # 158 M-^^
    :ed_unassigned,
    # 159 M-^_
    :ed_unassigned,
    # 160 M-SPACE
    :ed_unassigned,
    # 161 M-!
    :ed_unassigned,
    # 162 M-"
    :ed_unassigned,
    # 163 M-#
    :ed_unassigned,
    # 164 M-$
    :ed_unassigned,
    # 165 M-%
    :ed_unassigned,
    # 166 M-&
    :ed_unassigned,
    # 167 M-'
    :ed_unassigned,
    # 168 M-(
    :ed_unassigned,
    # 169 M-)
    :ed_unassigned,
    # 170 M-*
    :ed_unassigned,
    # 171 M-+
    :ed_unassigned,
    # 172 M-,
    :ed_unassigned,
    # 173 M--
    :ed_unassigned,
    # 174 M-.
    :ed_unassigned,
    # 175 M-/
    :ed_unassigned,
    # 176 M-0
    :ed_unassigned,
    # 177 M-1
    :ed_unassigned,
    # 178 M-2
    :ed_unassigned,
    # 179 M-3
    :ed_unassigned,
    # 180 M-4
    :ed_unassigned,
    # 181 M-5
    :ed_unassigned,
    # 182 M-6
    :ed_unassigned,
    # 183 M-7
    :ed_unassigned,
    # 184 M-8
    :ed_unassigned,
    # 185 M-9
    :ed_unassigned,
    # 186 M-:
    :ed_unassigned,
    # 187 M-;
    :ed_unassigned,
    # 188 M-<
    :ed_unassigned,
    # 189 M-=
    :ed_unassigned,
    # 190 M->
    :ed_unassigned,
    # 191 M-?
    :ed_unassigned,
    # 192 M-@
    :ed_unassigned,
    # 193 M-A
    :ed_unassigned,
    # 194 M-B
    :ed_unassigned,
    # 195 M-C
    :ed_unassigned,
    # 196 M-D
    :ed_unassigned,
    # 197 M-E
    :ed_unassigned,
    # 198 M-F
    :ed_unassigned,
    # 199 M-G
    :ed_unassigned,
    # 200 M-H
    :ed_unassigned,
    # 201 M-I
    :ed_unassigned,
    # 202 M-J
    :ed_unassigned,
    # 203 M-K
    :ed_unassigned,
    # 204 M-L
    :ed_unassigned,
    # 205 M-M
    :ed_unassigned,
    # 206 M-N
    :ed_unassigned,
    # 207 M-O
    :ed_unassigned,
    # 208 M-P
    :ed_unassigned,
    # 209 M-Q
    :ed_unassigned,
    # 210 M-R
    :ed_unassigned,
    # 211 M-S
    :ed_unassigned,
    # 212 M-T
    :ed_unassigned,
    # 213 M-U
    :ed_unassigned,
    # 214 M-V
    :ed_unassigned,
    # 215 M-W
    :ed_unassigned,
    # 216 M-X
    :ed_unassigned,
    # 217 M-Y
    :ed_unassigned,
    # 218 M-Z
    :ed_unassigned,
    # 219 M-[
    :ed_unassigned,
    # 220 M-\
    :ed_unassigned,
    # 221 M-]
    :ed_unassigned,
    # 222 M-^
    :ed_unassigned,
    # 223 M-_
    :ed_unassigned,
    # 224 M-`
    :ed_unassigned,
    # 225 M-a
    :ed_unassigned,
    # 226 M-b
    :ed_unassigned,
    # 227 M-c
    :ed_unassigned,
    # 228 M-d
    :ed_unassigned,
    # 229 M-e
    :ed_unassigned,
    # 230 M-f
    :ed_unassigned,
    # 231 M-g
    :ed_unassigned,
    # 232 M-h
    :ed_unassigned,
    # 233 M-i
    :ed_unassigned,
    # 234 M-j
    :ed_unassigned,
    # 235 M-k
    :ed_unassigned,
    # 236 M-l
    :ed_unassigned,
    # 237 M-m
    :ed_unassigned,
    # 238 M-n
    :ed_unassigned,
    # 239 M-o
    :ed_unassigned,
    # 240 M-p
    :ed_unassigned,
    # 241 M-q
    :ed_unassigned,
    # 242 M-r
    :ed_unassigned,
    # 243 M-s
    :ed_unassigned,
    # 244 M-t
    :ed_unassigned,
    # 245 M-u
    :ed_unassigned,
    # 246 M-v
    :ed_unassigned,
    # 247 M-w
    :ed_unassigned,
    # 248 M-x
    :ed_unassigned,
    # 249 M-y
    :ed_unassigned,
    # 250 M-z
    :ed_unassigned,
    # 251 M-{
    :ed_unassigned,
    # 252 M-|
    :ed_unassigned,
    # 253 M-}
    :ed_unassigned,
    # 254 M-~
    :ed_unassigned,
    # 255 M-^?
    :ed_unassigned
    # EOF
  ]
end
PK"}$[�5 �^S^Sruby/reline/unicode.rbnu�[���class Reline::Unicode
  EscapedPairs = {
    0x00 => '^@',
    0x01 => '^A', # C-a
    0x02 => '^B',
    0x03 => '^C',
    0x04 => '^D',
    0x05 => '^E',
    0x06 => '^F',
    0x07 => '^G',
    0x08 => '^H', # Backspace
    0x09 => '^I',
    0x0A => '^J',
    0x0B => '^K',
    0x0C => '^L',
    0x0D => '^M', # Enter
    0x0E => '^N',
    0x0F => '^O',
    0x10 => '^P',
    0x11 => '^Q',
    0x12 => '^R',
    0x13 => '^S',
    0x14 => '^T',
    0x15 => '^U',
    0x16 => '^V',
    0x17 => '^W',
    0x18 => '^X',
    0x19 => '^Y',
    0x1A => '^Z', # C-z
    0x1B => '^[', # C-[ C-3
    0x1D => '^]', # C-]
    0x1E => '^^', # C-~ C-6
    0x1F => '^_', # C-_ C-7
    0x7F => '^?', # C-? C-8
  }
  EscapedChars = EscapedPairs.keys.map(&:chr)

  NON_PRINTING_START = "\1"
  NON_PRINTING_END = "\2"
  CSI_REGEXP = /\e\[[\d;]*[ABCDEFGHJKSTfminsuhl]/
  OSC_REGEXP = /\e\]\d+(?:;[^;]+)*\a/
  WIDTH_SCANNER = /\G(?:(#{NON_PRINTING_START})|(#{NON_PRINTING_END})|(#{CSI_REGEXP})|(#{OSC_REGEXP})|(\X))/o
  NON_PRINTING_START_INDEX = 0
  NON_PRINTING_END_INDEX = 1
  CSI_REGEXP_INDEX = 2
  OSC_REGEXP_INDEX = 3
  GRAPHEME_CLUSTER_INDEX = 4

  def self.get_mbchar_byte_size_by_first_char(c)
    # Checks UTF-8 character byte size
    case c.ord
    # 0b0xxxxxxx
    when ->(code) { (code ^ 0b10000000).allbits?(0b10000000) } then 1
    # 0b110xxxxx
    when ->(code) { (code ^ 0b00100000).allbits?(0b11100000) } then 2
    # 0b1110xxxx
    when ->(code) { (code ^ 0b00010000).allbits?(0b11110000) } then 3
    # 0b11110xxx
    when ->(code) { (code ^ 0b00001000).allbits?(0b11111000) } then 4
    # 0b111110xx
    when ->(code) { (code ^ 0b00000100).allbits?(0b11111100) } then 5
    # 0b1111110x
    when ->(code) { (code ^ 0b00000010).allbits?(0b11111110) } then 6
    # successor of mbchar
    else 0
    end
  end

  def self.escape_for_print(str)
    str.chars.map! { |gr|
      escaped = EscapedPairs[gr.ord]
      if escaped && gr != -"\n" && gr != -"\t"
        escaped
      else
        gr
      end
    }.join
  end

  require 'reline/unicode/east_asian_width'

  HalfwidthDakutenHandakuten = /[\u{FF9E}\u{FF9F}]/

  MBCharWidthRE = /
    (?<width_2_1>
      [#{ EscapedChars.map {|c| "\\x%02x" % c.ord }.join }] (?# ^ + char, such as ^M, ^H, ^[, ...)
    )
  | (?<width_3>^\u{2E3B}) (?# THREE-EM DASH)
  | (?<width_0>^\p{M})
  | (?<width_2_2>
      #{ EastAsianWidth::TYPE_F }
    | #{ EastAsianWidth::TYPE_W }
    )
  | (?<width_1>
      #{ EastAsianWidth::TYPE_H }
    | #{ EastAsianWidth::TYPE_NA }
    | #{ EastAsianWidth::TYPE_N }
    )(?!#{ HalfwidthDakutenHandakuten })
  | (?<width_2_3>
      (?: #{ EastAsianWidth::TYPE_H }
        | #{ EastAsianWidth::TYPE_NA }
        | #{ EastAsianWidth::TYPE_N })
      #{ HalfwidthDakutenHandakuten }
    )
  | (?<ambiguous_width>
      #{EastAsianWidth::TYPE_A}
    )
  /x

  def self.get_mbchar_width(mbchar)
    ord = mbchar.ord
    if (0x00 <= ord and ord <= 0x1F) # in EscapedPairs
      return 2
    elsif (0x20 <= ord and ord <= 0x7E) # printable ASCII chars
      return 1
    end
    m = mbchar.encode(Encoding::UTF_8).match(MBCharWidthRE)
    case
    when m.nil? then 1 # TODO should be U+FFFD � REPLACEMENT CHARACTER
    when m[:width_2_1], m[:width_2_2], m[:width_2_3] then 2
    when m[:width_3] then 3
    when m[:width_0] then 0
    when m[:width_1] then 1
    when m[:ambiguous_width] then Reline.ambiguous_width
    else
      nil
    end
  end

  def self.calculate_width(str, allow_escape_code = false)
    if allow_escape_code
      width = 0
      rest = str.encode(Encoding::UTF_8)
      in_zero_width = false
      rest.scan(WIDTH_SCANNER) do |gc|
        case
        when gc[NON_PRINTING_START_INDEX]
          in_zero_width = true
        when gc[NON_PRINTING_END_INDEX]
          in_zero_width = false
        when gc[CSI_REGEXP_INDEX], gc[OSC_REGEXP_INDEX]
        when gc[GRAPHEME_CLUSTER_INDEX]
          gc = gc[GRAPHEME_CLUSTER_INDEX]
          unless in_zero_width
            width += get_mbchar_width(gc)
          end
        end
      end
      width
    else
      str.encode(Encoding::UTF_8).grapheme_clusters.inject(0) { |w, gc|
        w + get_mbchar_width(gc)
      }
    end
  end

  def self.split_by_width(str, max_width, encoding = str.encoding)
    lines = [String.new(encoding: encoding)]
    height = 1
    width = 0
    rest = str.encode(Encoding::UTF_8)
    in_zero_width = false
    rest.scan(WIDTH_SCANNER) do |gc|
      case
      when gc[NON_PRINTING_START_INDEX]
        in_zero_width = true
      when gc[NON_PRINTING_END_INDEX]
        in_zero_width = false
      when gc[CSI_REGEXP_INDEX]
        lines.last << gc[CSI_REGEXP_INDEX]
      when gc[OSC_REGEXP_INDEX]
        lines.last << gc[OSC_REGEXP_INDEX]
      when gc[GRAPHEME_CLUSTER_INDEX]
        gc = gc[GRAPHEME_CLUSTER_INDEX]
        unless in_zero_width
          mbchar_width = get_mbchar_width(gc)
          if (width += mbchar_width) > max_width
            width = mbchar_width
            lines << nil
            lines << String.new(encoding: encoding)
            height += 1
          end
        end
        lines.last << gc
      end
    end
    # The cursor moves to next line in first
    if width == max_width
      lines << nil
      lines << String.new(encoding: encoding)
      height += 1
    end
    [lines, height]
  end

  # Take a chunk of a String cut by width with escape sequences.
  def self.take_range(str, start_col, max_width, encoding = str.encoding)
    chunk = String.new(encoding: encoding)
    total_width = 0
    rest = str.encode(Encoding::UTF_8)
    in_zero_width = false
    rest.scan(WIDTH_SCANNER) do |gc|
      case
      when gc[NON_PRINTING_START_INDEX]
        in_zero_width = true
      when gc[NON_PRINTING_END_INDEX]
        in_zero_width = false
      when gc[CSI_REGEXP_INDEX]
        chunk << gc[CSI_REGEXP_INDEX]
      when gc[OSC_REGEXP_INDEX]
        chunk << gc[OSC_REGEXP_INDEX]
      when gc[GRAPHEME_CLUSTER_INDEX]
        gc = gc[GRAPHEME_CLUSTER_INDEX]
        if in_zero_width
          chunk << gc
        else
          mbchar_width = get_mbchar_width(gc)
          total_width += mbchar_width
          break if (start_col + max_width) < total_width
          chunk << gc if start_col < total_width
        end
      end
    end
    chunk
  end

  def self.get_next_mbchar_size(line, byte_pointer)
    grapheme = line.byteslice(byte_pointer..-1).grapheme_clusters.first
    grapheme ? grapheme.bytesize : 0
  end

  def self.get_prev_mbchar_size(line, byte_pointer)
    if byte_pointer.zero?
      0
    else
      grapheme = line.byteslice(0..(byte_pointer - 1)).grapheme_clusters.last
      grapheme ? grapheme.bytesize : 0
    end
  end

  def self.em_forward_word(line, byte_pointer)
    width = 0
    byte_size = 0
    while line.bytesize > (byte_pointer + byte_size)
      size = get_next_mbchar_size(line, byte_pointer + byte_size)
      mbchar = line.byteslice(byte_pointer + byte_size, size)
      break if mbchar.encode(Encoding::UTF_8) =~ /\p{Word}/
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    while line.bytesize > (byte_pointer + byte_size)
      size = get_next_mbchar_size(line, byte_pointer + byte_size)
      mbchar = line.byteslice(byte_pointer + byte_size, size)
      break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    [byte_size, width]
  end

  def self.em_forward_word_with_capitalization(line, byte_pointer)
    width = 0
    byte_size = 0
    new_str = String.new
    while line.bytesize > (byte_pointer + byte_size)
      size = get_next_mbchar_size(line, byte_pointer + byte_size)
      mbchar = line.byteslice(byte_pointer + byte_size, size)
      break if mbchar.encode(Encoding::UTF_8) =~ /\p{Word}/
      new_str += mbchar
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    first = true
    while line.bytesize > (byte_pointer + byte_size)
      size = get_next_mbchar_size(line, byte_pointer + byte_size)
      mbchar = line.byteslice(byte_pointer + byte_size, size)
      break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/
      if first
        new_str += mbchar.upcase
        first = false
      else
        new_str += mbchar.downcase
      end
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    [byte_size, width, new_str]
  end

  def self.em_backward_word(line, byte_pointer)
    width = 0
    byte_size = 0
    while 0 < (byte_pointer - byte_size)
      size = get_prev_mbchar_size(line, byte_pointer - byte_size)
      mbchar = line.byteslice(byte_pointer - byte_size - size, size)
      break if mbchar.encode(Encoding::UTF_8) =~ /\p{Word}/
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    while 0 < (byte_pointer - byte_size)
      size = get_prev_mbchar_size(line, byte_pointer - byte_size)
      mbchar = line.byteslice(byte_pointer - byte_size - size, size)
      break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    [byte_size, width]
  end

  def self.em_big_backward_word(line, byte_pointer)
    width = 0
    byte_size = 0
    while 0 < (byte_pointer - byte_size)
      size = get_prev_mbchar_size(line, byte_pointer - byte_size)
      mbchar = line.byteslice(byte_pointer - byte_size - size, size)
      break if mbchar =~ /\S/
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    while 0 < (byte_pointer - byte_size)
      size = get_prev_mbchar_size(line, byte_pointer - byte_size)
      mbchar = line.byteslice(byte_pointer - byte_size - size, size)
      break if mbchar =~ /\s/
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    [byte_size, width]
  end

  def self.ed_transpose_words(line, byte_pointer)
    right_word_start = nil
    size = get_next_mbchar_size(line, byte_pointer)
    mbchar = line.byteslice(byte_pointer, size)
    if size.zero?
      # ' aaa bbb [cursor]'
      byte_size = 0
      while 0 < (byte_pointer + byte_size)
        size = get_prev_mbchar_size(line, byte_pointer + byte_size)
        mbchar = line.byteslice(byte_pointer + byte_size - size, size)
        break if mbchar.encode(Encoding::UTF_8) =~ /\p{Word}/
        byte_size -= size
      end
      while 0 < (byte_pointer + byte_size)
        size = get_prev_mbchar_size(line, byte_pointer + byte_size)
        mbchar = line.byteslice(byte_pointer + byte_size - size, size)
        break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/
        byte_size -= size
      end
      right_word_start = byte_pointer + byte_size
      byte_size = 0
      while line.bytesize > (byte_pointer + byte_size)
        size = get_next_mbchar_size(line, byte_pointer + byte_size)
        mbchar = line.byteslice(byte_pointer + byte_size, size)
        break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/
        byte_size += size
      end
      after_start = byte_pointer + byte_size
    elsif mbchar.encode(Encoding::UTF_8) =~ /\p{Word}/
      # ' aaa bb[cursor]b'
      byte_size = 0
      while 0 < (byte_pointer + byte_size)
        size = get_prev_mbchar_size(line, byte_pointer + byte_size)
        mbchar = line.byteslice(byte_pointer + byte_size - size, size)
        break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/
        byte_size -= size
      end
      right_word_start = byte_pointer + byte_size
      byte_size = 0
      while line.bytesize > (byte_pointer + byte_size)
        size = get_next_mbchar_size(line, byte_pointer + byte_size)
        mbchar = line.byteslice(byte_pointer + byte_size, size)
        break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/
        byte_size += size
      end
      after_start = byte_pointer + byte_size
    else
      byte_size = 0
      while (line.bytesize - 1) > (byte_pointer + byte_size)
        size = get_next_mbchar_size(line, byte_pointer + byte_size)
        mbchar = line.byteslice(byte_pointer + byte_size, size)
        break if mbchar.encode(Encoding::UTF_8) =~ /\p{Word}/
        byte_size += size
      end
      if (byte_pointer + byte_size) == (line.bytesize - 1)
        # ' aaa bbb [cursor] '
        after_start = line.bytesize
        while 0 < (byte_pointer + byte_size)
          size = get_prev_mbchar_size(line, byte_pointer + byte_size)
          mbchar = line.byteslice(byte_pointer + byte_size - size, size)
          break if mbchar.encode(Encoding::UTF_8) =~ /\p{Word}/
          byte_size -= size
        end
        while 0 < (byte_pointer + byte_size)
          size = get_prev_mbchar_size(line, byte_pointer + byte_size)
          mbchar = line.byteslice(byte_pointer + byte_size - size, size)
          break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/
          byte_size -= size
        end
        right_word_start = byte_pointer + byte_size
      else
        # ' aaa [cursor] bbb '
        right_word_start = byte_pointer + byte_size
        while line.bytesize > (byte_pointer + byte_size)
          size = get_next_mbchar_size(line, byte_pointer + byte_size)
          mbchar = line.byteslice(byte_pointer + byte_size, size)
          break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/
          byte_size += size
        end
        after_start = byte_pointer + byte_size
      end
    end
    byte_size = right_word_start - byte_pointer
    while 0 < (byte_pointer + byte_size)
      size = get_prev_mbchar_size(line, byte_pointer + byte_size)
      mbchar = line.byteslice(byte_pointer + byte_size - size, size)
      break if mbchar.encode(Encoding::UTF_8) =~ /\p{Word}/
      byte_size -= size
    end
    middle_start = byte_pointer + byte_size
    byte_size = middle_start - byte_pointer
    while 0 < (byte_pointer + byte_size)
      size = get_prev_mbchar_size(line, byte_pointer + byte_size)
      mbchar = line.byteslice(byte_pointer + byte_size - size, size)
      break if mbchar.encode(Encoding::UTF_8) =~ /\P{Word}/
      byte_size -= size
    end
    left_word_start = byte_pointer + byte_size
    [left_word_start, middle_start, right_word_start, after_start]
  end

  def self.vi_big_forward_word(line, byte_pointer)
    width = 0
    byte_size = 0
    while (line.bytesize - 1) > (byte_pointer + byte_size)
      size = get_next_mbchar_size(line, byte_pointer + byte_size)
      mbchar = line.byteslice(byte_pointer + byte_size, size)
      break if mbchar =~ /\s/
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    while (line.bytesize - 1) > (byte_pointer + byte_size)
      size = get_next_mbchar_size(line, byte_pointer + byte_size)
      mbchar = line.byteslice(byte_pointer + byte_size, size)
      break if mbchar =~ /\S/
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    [byte_size, width]
  end

  def self.vi_big_forward_end_word(line, byte_pointer)
    if (line.bytesize - 1) > byte_pointer
      size = get_next_mbchar_size(line, byte_pointer)
      mbchar = line.byteslice(byte_pointer, size)
      width = get_mbchar_width(mbchar)
      byte_size = size
    else
      return [0, 0]
    end
    while (line.bytesize - 1) > (byte_pointer + byte_size)
      size = get_next_mbchar_size(line, byte_pointer + byte_size)
      mbchar = line.byteslice(byte_pointer + byte_size, size)
      break if mbchar =~ /\S/
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    prev_width = width
    prev_byte_size = byte_size
    while line.bytesize > (byte_pointer + byte_size)
      size = get_next_mbchar_size(line, byte_pointer + byte_size)
      mbchar = line.byteslice(byte_pointer + byte_size, size)
      break if mbchar =~ /\s/
      prev_width = width
      prev_byte_size = byte_size
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    [prev_byte_size, prev_width]
  end

  def self.vi_big_backward_word(line, byte_pointer)
    width = 0
    byte_size = 0
    while 0 < (byte_pointer - byte_size)
      size = get_prev_mbchar_size(line, byte_pointer - byte_size)
      mbchar = line.byteslice(byte_pointer - byte_size - size, size)
      break if mbchar =~ /\S/
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    while 0 < (byte_pointer - byte_size)
      size = get_prev_mbchar_size(line, byte_pointer - byte_size)
      mbchar = line.byteslice(byte_pointer - byte_size - size, size)
      break if mbchar =~ /\s/
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    [byte_size, width]
  end

  def self.vi_forward_word(line, byte_pointer, drop_terminate_spaces = false)
    if line.bytesize > byte_pointer
      size = get_next_mbchar_size(line, byte_pointer)
      mbchar = line.byteslice(byte_pointer, size)
      if mbchar =~ /\w/
        started_by = :word
      elsif mbchar =~ /\s/
        started_by = :space
      else
        started_by = :non_word_printable
      end
      width = get_mbchar_width(mbchar)
      byte_size = size
    else
      return [0, 0]
    end
    while line.bytesize > (byte_pointer + byte_size)
      size = get_next_mbchar_size(line, byte_pointer + byte_size)
      mbchar = line.byteslice(byte_pointer + byte_size, size)
      case started_by
      when :word
        break if mbchar =~ /\W/
      when :space
        break if mbchar =~ /\S/
      when :non_word_printable
        break if mbchar =~ /\w|\s/
      end
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    return [byte_size, width] if drop_terminate_spaces
    while line.bytesize > (byte_pointer + byte_size)
      size = get_next_mbchar_size(line, byte_pointer + byte_size)
      mbchar = line.byteslice(byte_pointer + byte_size, size)
      break if mbchar =~ /\S/
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    [byte_size, width]
  end

  def self.vi_forward_end_word(line, byte_pointer)
    if (line.bytesize - 1) > byte_pointer
      size = get_next_mbchar_size(line, byte_pointer)
      mbchar = line.byteslice(byte_pointer, size)
      if mbchar =~ /\w/
        started_by = :word
      elsif mbchar =~ /\s/
        started_by = :space
      else
        started_by = :non_word_printable
      end
      width = get_mbchar_width(mbchar)
      byte_size = size
    else
      return [0, 0]
    end
    if (line.bytesize - 1) > (byte_pointer + byte_size)
      size = get_next_mbchar_size(line, byte_pointer + byte_size)
      mbchar = line.byteslice(byte_pointer + byte_size, size)
      if mbchar =~ /\w/
        second = :word
      elsif mbchar =~ /\s/
        second = :space
      else
        second = :non_word_printable
      end
      second_width = get_mbchar_width(mbchar)
      second_byte_size = size
    else
      return [byte_size, width]
    end
    if second == :space
      width += second_width
      byte_size += second_byte_size
      while (line.bytesize - 1) > (byte_pointer + byte_size)
        size = get_next_mbchar_size(line, byte_pointer + byte_size)
        mbchar = line.byteslice(byte_pointer + byte_size, size)
        if mbchar =~ /\S/
          if mbchar =~ /\w/
            started_by = :word
          else
            started_by = :non_word_printable
          end
          break
        end
        width += get_mbchar_width(mbchar)
        byte_size += size
      end
    else
      case [started_by, second]
      when [:word, :non_word_printable], [:non_word_printable, :word]
        started_by = second
      else
        width += second_width
        byte_size += second_byte_size
        started_by = second
      end
    end
    prev_width = width
    prev_byte_size = byte_size
    while line.bytesize > (byte_pointer + byte_size)
      size = get_next_mbchar_size(line, byte_pointer + byte_size)
      mbchar = line.byteslice(byte_pointer + byte_size, size)
      case started_by
      when :word
        break if mbchar =~ /\W/
      when :non_word_printable
        break if mbchar =~ /[\w\s]/
      end
      prev_width = width
      prev_byte_size = byte_size
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    [prev_byte_size, prev_width]
  end

  def self.vi_backward_word(line, byte_pointer)
    width = 0
    byte_size = 0
    while 0 < (byte_pointer - byte_size)
      size = get_prev_mbchar_size(line, byte_pointer - byte_size)
      mbchar = line.byteslice(byte_pointer - byte_size - size, size)
      if mbchar =~ /\S/
        if mbchar =~ /\w/
          started_by = :word
        else
          started_by = :non_word_printable
        end
        break
      end
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    while 0 < (byte_pointer - byte_size)
      size = get_prev_mbchar_size(line, byte_pointer - byte_size)
      mbchar = line.byteslice(byte_pointer - byte_size - size, size)
      case started_by
      when :word
        break if mbchar =~ /\W/
      when :non_word_printable
        break if mbchar =~ /[\w\s]/
      end
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    [byte_size, width]
  end

  def self.vi_first_print(line)
    width = 0
    byte_size = 0
    while (line.bytesize - 1) > byte_size
      size = get_next_mbchar_size(line, byte_size)
      mbchar = line.byteslice(byte_size, size)
      if mbchar =~ /\S/
        break
      end
      width += get_mbchar_width(mbchar)
      byte_size += size
    end
    [byte_size, width]
  end
end
PK"}$[ԉ�	�	ruby/reline/kill_ring.rbnu�[���class Reline::KillRing
  include Enumerable

  module State
    FRESH = :fresh
    CONTINUED = :continued
    PROCESSED = :processed
    YANK = :yank
  end

  RingPoint = Struct.new(:backward, :forward, :str) do
    def initialize(str)
      super(nil, nil, str)
    end

    def ==(other)
      object_id == other.object_id
    end
  end

  class RingBuffer
    attr_reader :size
    attr_reader :head

    def initialize(max = 1024)
      @max = max
      @size = 0
      @head = nil # reading head of ring-shaped tape
    end

    def <<(point)
      if @size.zero?
        @head = point
        @head.backward = @head
        @head.forward = @head
        @size = 1
      elsif @size >= @max
        tail = @head.forward
        new_tail = tail.forward
        @head.forward = point
        point.backward = @head
        new_tail.backward = point
        point.forward = new_tail
        @head = point
      else
        tail = @head.forward
        @head.forward = point
        point.backward = @head
        tail.backward = point
        point.forward = tail
        @head = point
        @size += 1
      end
    end

    def empty?
      @size.zero?
    end
  end

  def initialize(max = 1024)
    @ring = RingBuffer.new(max)
    @ring_pointer = nil
    @buffer = nil
    @state = State::FRESH
  end

  def append(string, before_p = false)
    case @state
    when State::FRESH, State::YANK
      @ring << RingPoint.new(string)
      @state = State::CONTINUED
    when State::CONTINUED, State::PROCESSED
      if before_p
        @ring.head.str.prepend(string)
      else
        @ring.head.str.concat(string)
      end
      @state = State::CONTINUED
    end
  end

  def process
    case @state
    when State::FRESH
      # nothing to do
    when State::CONTINUED
      @state = State::PROCESSED
    when State::PROCESSED
      @state = State::FRESH
    when State::YANK
      # nothing to do
    end
  end

  def yank
    unless @ring.empty?
      @state = State::YANK
      @ring_pointer = @ring.head
      @ring_pointer.str
    else
      nil
    end
  end

  def yank_pop
    if @state == State::YANK
      prev_yank = @ring_pointer.str
      @ring_pointer = @ring_pointer.backward
      [@ring_pointer.str, prev_yank]
    else
      nil
    end
  end

  def each
    start = head = @ring.head
    loop do
      break if head.nil?
      yield head.str
      head = head.backward
      break if head == start
    end
  end
end
PK"}$[����$�$ruby/reline/ansi.rbnu�[���require 'io/console'
require 'io/wait'
require 'timeout'
require_relative 'terminfo'

class Reline::ANSI
  CAPNAME_KEY_BINDINGS = {
    'khome' => :ed_move_to_beg,
    'kend'  => :ed_move_to_end,
    'kcuu1' => :ed_prev_history,
    'kcud1' => :ed_next_history,
    'kcuf1' => :ed_next_char,
    'kcub1' => :ed_prev_char,
    'cuu' => :ed_prev_history,
    'cud' => :ed_next_history,
    'cuf' => :ed_next_char,
    'cub' => :ed_prev_char,
  }

  if Reline::Terminfo.enabled?
    Reline::Terminfo.setupterm(0, 2)
  end

  def self.encoding
    Encoding.default_external
  end

  def self.win?
    false
  end

  def self.set_default_key_bindings(config)
    if Reline::Terminfo.enabled?
      set_default_key_bindings_terminfo(config)
    else
      set_default_key_bindings_comprehensive_list(config)
    end
    {
      # extended entries of terminfo
      [27, 91, 49, 59, 53, 67] => :em_next_word, # Ctrl+→, extended entry
      [27, 91, 49, 59, 53, 68] => :ed_prev_word, # Ctrl+←, extended entry
      [27, 91, 49, 59, 51, 67] => :em_next_word, # Meta+→, extended entry
      [27, 91, 49, 59, 51, 68] => :ed_prev_word, # Meta+←, extended entry
    }.each_pair do |key, func|
      config.add_default_key_binding_by_keymap(:emacs, key, func)
      config.add_default_key_binding_by_keymap(:vi_insert, key, func)
      config.add_default_key_binding_by_keymap(:vi_command, key, func)
    end
    {
      [27, 91, 90] => :completion_journey_up, # S-Tab
    }.each_pair do |key, func|
      config.add_default_key_binding_by_keymap(:emacs, key, func)
      config.add_default_key_binding_by_keymap(:vi_insert, key, func)
    end
    {
      # default bindings
      [27, 32] => :em_set_mark,             # M-<space>
      [24, 24] => :em_exchange_mark,        # C-x C-x
    }.each_pair do |key, func|
      config.add_default_key_binding_by_keymap(:emacs, key, func)
    end
  end

  def self.set_default_key_bindings_terminfo(config)
    key_bindings = CAPNAME_KEY_BINDINGS.map do |capname, key_binding|
      begin
        key_code = Reline::Terminfo.tigetstr(capname)
        case capname
        # Escape sequences that omit the move distance and are set to defaults
        # value 1 may be sometimes sent by pressing the arrow-key.
        when 'cuu', 'cud', 'cuf', 'cub'
          [ key_code.sub(/%p1%d/, '').bytes, key_binding ]
        else
          [ key_code.bytes, key_binding ]
        end
      rescue Reline::Terminfo::TerminfoError
        # capname is undefined
      end
    end.compact.to_h

    key_bindings.each_pair do |key, func|
      config.add_default_key_binding_by_keymap(:emacs, key, func)
      config.add_default_key_binding_by_keymap(:vi_insert, key, func)
      config.add_default_key_binding_by_keymap(:vi_command, key, func)
    end
  end

  def self.set_default_key_bindings_comprehensive_list(config)
    {
      # Console (80x25)
      [27, 91, 49, 126] => :ed_move_to_beg, # Home
      [27, 91, 52, 126] => :ed_move_to_end, # End
      [27, 91, 51, 126] => :key_delete,     # Del
      [27, 91, 65] => :ed_prev_history,     # ↑
      [27, 91, 66] => :ed_next_history,     # ↓
      [27, 91, 67] => :ed_next_char,        # →
      [27, 91, 68] => :ed_prev_char,        # ←

      # KDE
      [27, 91, 72] => :ed_move_to_beg,      # Home
      [27, 91, 70] => :ed_move_to_end,      # End
      # Del is 0x08
      [27, 71, 65] => :ed_prev_history,     # ↑
      [27, 71, 66] => :ed_next_history,     # ↓
      [27, 71, 67] => :ed_next_char,        # →
      [27, 71, 68] => :ed_prev_char,        # ←

      # urxvt / exoterm
      [27, 91, 55, 126] => :ed_move_to_beg, # Home
      [27, 91, 56, 126] => :ed_move_to_end, # End

      # GNOME
      [27, 79, 72] => :ed_move_to_beg,      # Home
      [27, 79, 70] => :ed_move_to_end,      # End
      # Del is 0x08
      # Arrow keys are the same of KDE

      # iTerm2
      [27, 27, 91, 67] => :em_next_word,    # Option+→, extended entry
      [27, 27, 91, 68] => :ed_prev_word,    # Option+←, extended entry
      [195, 166] => :em_next_word,          # Option+f
      [195, 162] => :ed_prev_word,          # Option+b

      [27, 79, 65] => :ed_prev_history,     # ↑
      [27, 79, 66] => :ed_next_history,     # ↓
      [27, 79, 67] => :ed_next_char,        # →
      [27, 79, 68] => :ed_prev_char,        # ←
    }.each_pair do |key, func|
      config.add_default_key_binding_by_keymap(:emacs, key, func)
      config.add_default_key_binding_by_keymap(:vi_insert, key, func)
      config.add_default_key_binding_by_keymap(:vi_command, key, func)
    end
  end

  @@input = STDIN
  def self.input=(val)
    @@input = val
  end

  @@output = STDOUT
  def self.output=(val)
    @@output = val
  end

  @@buf = []
  def self.inner_getc
    unless @@buf.empty?
      return @@buf.shift
    end
    until c = @@input.raw(intr: true) { @@input.wait_readable(0.1) && @@input.getbyte }
      Reline.core.line_editor.resize
    end
    (c == 0x16 && @@input.raw(min: 0, tim: 0, &:getbyte)) || c
  rescue Errno::EIO
    # Maybe the I/O has been closed.
    nil
  rescue Errno::ENOTTY
    nil
  end

  @@in_bracketed_paste_mode = false
  START_BRACKETED_PASTE = String.new("\e[200~,", encoding: Encoding::ASCII_8BIT)
  END_BRACKETED_PASTE = String.new("\e[200~.", encoding: Encoding::ASCII_8BIT)
  def self.getc_with_bracketed_paste
    buffer = String.new(encoding: Encoding::ASCII_8BIT)
    buffer << inner_getc
    while START_BRACKETED_PASTE.start_with?(buffer) or END_BRACKETED_PASTE.start_with?(buffer) do
      if START_BRACKETED_PASTE == buffer
        @@in_bracketed_paste_mode = true
        return inner_getc
      elsif END_BRACKETED_PASTE == buffer
        @@in_bracketed_paste_mode = false
        ungetc(-1)
        return inner_getc
      end
      begin
        succ_c = nil
        Timeout.timeout(Reline.core.config.keyseq_timeout * 100) {
          succ_c = inner_getc
        }
      rescue Timeout::Error
        break
      else
        buffer << succ_c
      end
    end
    buffer.bytes.reverse_each do |ch|
      ungetc ch
    end
    inner_getc
  end

  def self.getc
    if Reline.core.config.enable_bracketed_paste
      getc_with_bracketed_paste
    else
      inner_getc
    end
  end

  def self.in_pasting?
    @@in_bracketed_paste_mode or (not Reline::IOGate.empty_buffer?)
  end

  def self.empty_buffer?
    unless @@buf.empty?
      return false
    end
    !@@input.wait_readable(0)
  end

  def self.ungetc(c)
    @@buf.unshift(c)
  end

  def self.retrieve_keybuffer
    begin
      return unless @@input.wait_readable(0.001)
      str = @@input.read_nonblock(1024)
      str.bytes.each do |c|
        @@buf.push(c)
      end
    rescue EOFError
    end
  end

  def self.get_screen_size
    s = @@input.winsize
    return s if s[0] > 0 && s[1] > 0
    s = [ENV["LINES"].to_i, ENV["COLUMNS"].to_i]
    return s if s[0] > 0 && s[1] > 0
    [24, 80]
  rescue Errno::ENOTTY
    [24, 80]
  end

  def self.set_screen_size(rows, columns)
    @@input.winsize = [rows, columns]
    self
  rescue Errno::ENOTTY
    self
  end

  def self.cursor_pos
    begin
      res = +''
      m = nil
      @@input.raw do |stdin|
        @@output << "\e[6n"
        @@output.flush
        loop do
          c = stdin.getc
          next if c.nil?
          res << c
          m = res.match(/\e\[(?<row>\d+);(?<column>\d+)R/)
          break if m
        end
        (m.pre_match + m.post_match).chars.reverse_each do |ch|
          stdin.ungetc ch
        end
      end
      column = m[:column].to_i - 1
      row = m[:row].to_i - 1
    rescue Errno::ENOTTY
      begin
        buf = @@output.pread(@@output.pos, 0)
        row = buf.count("\n")
        column = buf.rindex("\n") ? (buf.size - buf.rindex("\n")) - 1 : 0
      rescue Errno::ESPIPE
        # Just returns column 1 for ambiguous width because this I/O is not
        # tty and can't seek.
        row = 0
        column = 1
      end
    end
    Reline::CursorPos.new(column, row)
  end

  def self.move_cursor_column(x)
    @@output.write "\e[#{x + 1}G"
  end

  def self.move_cursor_up(x)
    if x > 0
      @@output.write "\e[#{x}A"
    elsif x < 0
      move_cursor_down(-x)
    end
  end

  def self.move_cursor_down(x)
    if x > 0
      @@output.write "\e[#{x}B"
    elsif x < 0
      move_cursor_up(-x)
    end
  end

  def self.hide_cursor
    if Reline::Terminfo.enabled?
      begin
        @@output.write Reline::Terminfo.tigetstr('civis')
      rescue Reline::Terminfo::TerminfoError
        # civis is undefined
      end
    else
      # ignored
    end
  end

  def self.show_cursor
    if Reline::Terminfo.enabled?
      begin
        @@output.write Reline::Terminfo.tigetstr('cnorm')
      rescue Reline::Terminfo::TerminfoError
        # cnorm is undefined
      end
    else
      # ignored
    end
  end

  def self.erase_after_cursor
    @@output.write "\e[K"
  end

  def self.scroll_down(x)
    return if x.zero?
    @@output.write "\e[#{x}S"
  end

  def self.clear_screen
    @@output.write "\e[2J"
    @@output.write "\e[1;1H"
  end

  @@old_winch_handler = nil
  def self.set_winch_handler(&handler)
    @@old_winch_handler = Signal.trap('WINCH', &handler)
  end

  def self.prep
    retrieve_keybuffer
    nil
  end

  def self.deprep(otio)
    Signal.trap('WINCH', @@old_winch_handler) if @@old_winch_handler
  end
end
PK"}$[6.G�(�(ruby/reline/config.rbnu�[���class Reline::Config
  attr_reader :test_mode

  KEYSEQ_PATTERN = /\\(?:C|Control)-[A-Za-z_]|\\(?:M|Meta)-[0-9A-Za-z_]|\\(?:C|Control)-(?:M|Meta)-[A-Za-z_]|\\(?:M|Meta)-(?:C|Control)-[A-Za-z_]|\\e|\\[\\\"\'abdfnrtv]|\\\d{1,3}|\\x\h{1,2}|./

  class InvalidInputrc < RuntimeError
    attr_accessor :file, :lineno
  end

  VARIABLE_NAMES = %w{
    bind-tty-special-chars
    blink-matching-paren
    byte-oriented
    completion-ignore-case
    convert-meta
    disable-completion
    enable-keypad
    expand-tilde
    history-preserve-point
    history-size
    horizontal-scroll-mode
    input-meta
    keyseq-timeout
    mark-directories
    mark-modified-lines
    mark-symlinked-directories
    match-hidden-files
    meta-flag
    output-meta
    page-completions
    prefer-visible-bell
    print-completions-horizontally
    show-all-if-ambiguous
    show-all-if-unmodified
    visible-stats
    show-mode-in-prompt
    vi-cmd-mode-string
    vi-ins-mode-string
    emacs-mode-string
    enable-bracketed-paste
    isearch-terminators
  }
  VARIABLE_NAME_SYMBOLS = VARIABLE_NAMES.map { |v| :"#{v.tr(?-, ?_)}" }
  VARIABLE_NAME_SYMBOLS.each do |v|
    attr_accessor v
  end

  def initialize
    @additional_key_bindings = {} # from inputrc
    @additional_key_bindings[:emacs] = {}
    @additional_key_bindings[:vi_insert] = {}
    @additional_key_bindings[:vi_command] = {}
    @oneshot_key_bindings = {}
    @skip_section = nil
    @if_stack = nil
    @editing_mode_label = :emacs
    @keymap_label = :emacs
    @key_actors = {}
    @key_actors[:emacs] = Reline::KeyActor::Emacs.new
    @key_actors[:vi_insert] = Reline::KeyActor::ViInsert.new
    @key_actors[:vi_command] = Reline::KeyActor::ViCommand.new
    @vi_cmd_mode_string = '(cmd)'
    @vi_ins_mode_string = '(ins)'
    @emacs_mode_string = '@'
    # https://tiswww.case.edu/php/chet/readline/readline.html#IDX25
    @history_size = -1 # unlimited
    @keyseq_timeout = 500
    @test_mode = false
    @autocompletion = false
    @convert_meta = true if seven_bit_encoding?(Reline::IOGate.encoding)
  end

  def reset
    if editing_mode_is?(:vi_command)
      @editing_mode_label = :vi_insert
    end
    @additional_key_bindings.keys.each do |key|
      @additional_key_bindings[key].clear
    end
    @oneshot_key_bindings.clear
    reset_default_key_bindings
  end

  def editing_mode
    @key_actors[@editing_mode_label]
  end

  def editing_mode=(val)
    @editing_mode_label = val
  end

  def editing_mode_is?(*val)
    (val.respond_to?(:any?) ? val : [val]).any?(@editing_mode_label)
  end

  def autocompletion=(val)
    @autocompletion = val
  end

  def autocompletion
    @autocompletion
  end

  def keymap
    @key_actors[@keymap_label]
  end

  def inputrc_path
    case ENV['INPUTRC']
    when nil, ''
    else
      return File.expand_path(ENV['INPUTRC'])
    end

    # In the XDG Specification, if ~/.config/readline/inputrc exists, then
    # ~/.inputrc should not be read, but for compatibility with GNU Readline,
    # if ~/.inputrc exists, then it is given priority.
    home_rc_path = File.expand_path('~/.inputrc')
    return home_rc_path if File.exist?(home_rc_path)

    case path = ENV['XDG_CONFIG_HOME']
    when nil, ''
    else
      path = File.join(path, 'readline/inputrc')
      return path if File.exist?(path) and path == File.expand_path(path)
    end

    path = File.expand_path('~/.config/readline/inputrc')
    return path if File.exist?(path)

    return home_rc_path
  end

  private def default_inputrc_path
    @default_inputrc_path ||= inputrc_path
  end

  def read(file = nil)
    file ||= default_inputrc_path
    begin
      if file.respond_to?(:readlines)
        lines = file.readlines
      else
        lines = File.readlines(file)
      end
    rescue Errno::ENOENT
      return nil
    end

    read_lines(lines, file)
    self
  rescue InvalidInputrc => e
    warn e.message
    nil
  end

  def key_bindings
    # The key bindings for each editing mode will be overwritten by the user-defined ones.
    kb = @key_actors[@editing_mode_label].default_key_bindings.dup
    kb.merge!(@additional_key_bindings[@editing_mode_label])
    kb.merge!(@oneshot_key_bindings)
    kb
  end

  def add_oneshot_key_binding(keystroke, target)
    @oneshot_key_bindings[keystroke] = target
  end

  def reset_oneshot_key_bindings
    @oneshot_key_bindings.clear
  end

  def add_default_key_binding_by_keymap(keymap, keystroke, target)
    @key_actors[keymap].default_key_bindings[keystroke] = target
  end

  def add_default_key_binding(keystroke, target)
    @key_actors[@keymap_label].default_key_bindings[keystroke] = target
  end

  def reset_default_key_bindings
    @key_actors.values.each do |ka|
      ka.reset_default_key_bindings
    end
  end

  def read_lines(lines, file = nil)
    if not lines.empty? and lines.first.encoding != Reline.encoding_system_needs
      begin
        lines = lines.map do |l|
          l.encode(Reline.encoding_system_needs)
        rescue Encoding::UndefinedConversionError
          mes = "The inputrc encoded in #{lines.first.encoding.name} can't be converted to the locale #{Reline.encoding_system_needs.name}."
          raise Reline::ConfigEncodingConversionError.new(mes)
        end
      end
    end
    conditions = [@skip_section, @if_stack]
    @skip_section = nil
    @if_stack = []

    lines.each_with_index do |line, no|
      next if line.match(/\A\s*#/)

      no += 1

      line = line.chomp.lstrip
      if line.start_with?('$')
        handle_directive(line[1..-1], file, no)
        next
      end

      next if @skip_section

      case line
      when /^set +([^ ]+) +([^ ]+)/i
        var, value = $1.downcase, $2
        bind_variable(var, value)
        next
      when /\s*("#{KEYSEQ_PATTERN}+")\s*:\s*(.*)\s*$/o
        key, func_name = $1, $2
        keystroke, func = bind_key(key, func_name)
        next unless keystroke
        @additional_key_bindings[@keymap_label][keystroke] = func
      end
    end
    unless @if_stack.empty?
      raise InvalidInputrc, "#{file}:#{@if_stack.last[1]}: unclosed if"
    end
  ensure
    @skip_section, @if_stack = conditions
  end

  def handle_directive(directive, file, no)
    directive, args = directive.split(' ')
    case directive
    when 'if'
      condition = false
      case args
      when 'mode'
      when 'term'
      when 'version'
      else # application name
        condition = true if args == 'Ruby'
        condition = true if args == 'Reline'
      end
      @if_stack << [file, no, @skip_section]
      @skip_section = !condition
    when 'else'
      if @if_stack.empty?
        raise InvalidInputrc, "#{file}:#{no}: unmatched else"
      end
      @skip_section = !@skip_section
    when 'endif'
      if @if_stack.empty?
        raise InvalidInputrc, "#{file}:#{no}: unmatched endif"
      end
      @skip_section = @if_stack.pop
    when 'include'
      read(args)
    end
  end

  def bind_variable(name, value)
    case name
    when 'history-size'
      begin
        @history_size = Integer(value)
      rescue ArgumentError
        @history_size = 500
      end
    when 'bell-style'
      @bell_style =
        case value
        when 'none', 'off'
          :none
        when 'audible', 'on'
          :audible
        when 'visible'
          :visible
        else
          :audible
        end
    when 'comment-begin'
      @comment_begin = value.dup
    when 'completion-query-items'
      @completion_query_items = value.to_i
    when 'isearch-terminators'
      @isearch_terminators = retrieve_string(value)
    when 'editing-mode'
      case value
      when 'emacs'
        @editing_mode_label = :emacs
        @keymap_label = :emacs
      when 'vi'
        @editing_mode_label = :vi_insert
        @keymap_label = :vi_insert
      end
    when 'keymap'
      case value
      when 'emacs', 'emacs-standard', 'emacs-meta', 'emacs-ctlx'
        @keymap_label = :emacs
      when 'vi', 'vi-move', 'vi-command'
        @keymap_label = :vi_command
      when 'vi-insert'
        @keymap_label = :vi_insert
      end
    when 'keyseq-timeout'
      @keyseq_timeout = value.to_i
    when 'show-mode-in-prompt'
      case value
      when 'off'
        @show_mode_in_prompt = false
      when 'on'
        @show_mode_in_prompt = true
      else
        @show_mode_in_prompt = false
      end
    when 'vi-cmd-mode-string'
      @vi_cmd_mode_string = retrieve_string(value)
    when 'vi-ins-mode-string'
      @vi_ins_mode_string = retrieve_string(value)
    when 'emacs-mode-string'
      @emacs_mode_string = retrieve_string(value)
    when *VARIABLE_NAMES then
      variable_name = :"@#{name.tr(?-, ?_)}"
      instance_variable_set(variable_name, value.nil? || value == '1' || value == 'on')
    end
  end

  def retrieve_string(str)
    str = $1 if str =~ /\A"(.*)"\z/
    parse_keyseq(str).map { |c| c.chr(Reline.encoding_system_needs) }.join
  end

  def bind_key(key, func_name)
    if key =~ /\A"(.*)"\z/
      keyseq = parse_keyseq($1)
    else
      keyseq = nil
    end
    if func_name =~ /"(.*)"/
      func = parse_keyseq($1)
    else
      func = func_name.tr(?-, ?_).to_sym # It must be macro.
    end
    [keyseq, func]
  end

  def key_notation_to_code(notation)
    case notation
    when /\\(?:C|Control)-([A-Za-z_])/
      (1 + $1.downcase.ord - ?a.ord)
    when /\\(?:M|Meta)-([0-9A-Za-z_])/
      modified_key = $1
      case $1
      when /[0-9]/
        ?\M-0.bytes.first + (modified_key.ord - ?0.ord)
      when /[A-Z]/
        ?\M-A.bytes.first + (modified_key.ord - ?A.ord)
      when /[a-z]/
        ?\M-a.bytes.first + (modified_key.ord - ?a.ord)
      end
    when /\\(?:C|Control)-(?:M|Meta)-[A-Za-z_]/, /\\(?:M|Meta)-(?:C|Control)-[A-Za-z_]/
    # 129 M-^A
    when /\\(\d{1,3})/ then $1.to_i(8) # octal
    when /\\x(\h{1,2})/ then $1.to_i(16) # hexadecimal
    when "\\e" then ?\e.ord
    when "\\\\" then ?\\.ord
    when "\\\"" then ?".ord
    when "\\'" then ?'.ord
    when "\\a" then ?\a.ord
    when "\\b" then ?\b.ord
    when "\\d" then ?\d.ord
    when "\\f" then ?\f.ord
    when "\\n" then ?\n.ord
    when "\\r" then ?\r.ord
    when "\\t" then ?\t.ord
    when "\\v" then ?\v.ord
    else notation.ord
    end
  end

  def parse_keyseq(str)
    ret = []
    str.scan(KEYSEQ_PATTERN) do
      ret << key_notation_to_code($&)
    end
    ret
  end

  private def seven_bit_encoding?(encoding)
    encoding == Encoding::US_ASCII
  end
end
PK"}$[�[��55ruby/reline/terminfo.rbnu�[���begin
  require 'fiddle'
  require 'fiddle/import'
rescue LoadError
  module Reline::Terminfo
    def self.curses_dl
      false
    end
  end
end

module Reline::Terminfo
  extend Fiddle::Importer

  class TerminfoError < StandardError; end

  def self.curses_dl_files
    case RUBY_PLATFORM
    when /mingw/, /mswin/
      # aren't supported
      []
    when /cygwin/
      %w[cygncursesw-10.dll cygncurses-10.dll]
    when /darwin/
      %w[libncursesw.dylib libcursesw.dylib libncurses.dylib libcurses.dylib]
    else
      %w[libncursesw.so libcursesw.so libncurses.so libcurses.so]
    end
  end

  @curses_dl = false
  def self.curses_dl
    return @curses_dl unless @curses_dl == false
    if RUBY_VERSION >= '3.0.0'
      # Gem module isn't defined in test-all of the Ruby repository, and
      # Fiddle in Ruby 3.0.0 or later supports Fiddle::TYPE_VARIADIC.
      fiddle_supports_variadic = true
    elsif Fiddle.const_defined?(:VERSION) and Gem::Version.create(Fiddle::VERSION) >= Gem::Version.create('1.0.1')
      # Fiddle::TYPE_VARIADIC is supported from Fiddle 1.0.1.
      fiddle_supports_variadic = true
    else
      fiddle_supports_variadic = false
    end
    if fiddle_supports_variadic and not Fiddle.const_defined?(:TYPE_VARIADIC)
      # If the libffi version is not 3.0.5 or higher, there isn't TYPE_VARIADIC.
      fiddle_supports_variadic = false
    end
    if fiddle_supports_variadic
      curses_dl_files.each do |curses_name|
        result = Fiddle::Handle.new(curses_name)
      rescue Fiddle::DLError
        next
      else
        @curses_dl = result
        break
      end
    end
    @curses_dl = nil if @curses_dl == false
    @curses_dl
  end
end if not Reline.const_defined?(:Terminfo) or not Reline::Terminfo.respond_to?(:curses_dl)

module Reline::Terminfo
  dlload curses_dl
  #extern 'int setupterm(char *term, int fildes, int *errret)'
  @setupterm = Fiddle::Function.new(curses_dl['setupterm'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT, Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
  #extern 'char *tigetstr(char *capname)'
  @tigetstr = Fiddle::Function.new(curses_dl['tigetstr'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOIDP)
  begin
    #extern 'char *tiparm(const char *str, ...)'
    @tiparm = Fiddle::Function.new(curses_dl['tiparm'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VARIADIC], Fiddle::TYPE_VOIDP)
  rescue Fiddle::DLError
    # OpenBSD lacks tiparm
    #extern 'char *tparm(const char *str, ...)'
    @tiparm = Fiddle::Function.new(curses_dl['tparm'], [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VARIADIC], Fiddle::TYPE_VOIDP)
  end
  begin
    #extern 'int tigetflag(char *str)'
    @tigetflag = Fiddle::Function.new(curses_dl['tigetflag'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
  rescue Fiddle::DLError
    # OpenBSD lacks tigetflag
    #extern 'int tgetflag(char *str)'
    @tigetflag = Fiddle::Function.new(curses_dl['tgetflag'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
  end
  begin
    #extern 'int tigetnum(char *str)'
    @tigetnum = Fiddle::Function.new(curses_dl['tigetnum'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
  rescue Fiddle::DLError
    # OpenBSD lacks tigetnum
    #extern 'int tgetnum(char *str)'
    @tigetnum = Fiddle::Function.new(curses_dl['tgetnum'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_INT)
  end

  def self.setupterm(term, fildes)
    errret_int = String.new("\x00" * 8, encoding: 'ASCII-8BIT')
    ret = @setupterm.(term, fildes, errret_int)
    errret = errret_int.unpack1('i')
    case ret
    when 0 # OK
      0
    when -1 # ERR
      case errret
      when 1
        raise TerminfoError.new('The terminal is hardcopy, cannot be used for curses applications.')
      when 0
        raise TerminfoError.new('The terminal could not be found, or that it is a generic type, having too little information for curses applications to run.')
      when -1
        raise TerminfoError.new('The terminfo database could not be found.')
      else # unknown
        -1
      end
    else # unknown
      -2
    end
  end

  class StringWithTiparm < String
    def tiparm(*args) # for method chain
      Reline::Terminfo.tiparm(self, *args)
    end
  end

  def self.tigetstr(capname)
    capability = @tigetstr.(capname)
    case capability.to_i
    when 0, -1
      raise TerminfoError, "can't find capability: #{capname}"
    end
    StringWithTiparm.new(capability.to_s)
  end

  def self.tiparm(str, *args)
    new_args = []
    args.each do |a|
      new_args << Fiddle::TYPE_INT << a
    end
    @tiparm.(str, *new_args).to_s
  end

  def self.tigetflag(capname)
    flag = @tigetflag.(capname).to_i
    case flag
    when -1
      raise TerminfoError, "not boolean capability: #{capname}"
    when 0
      raise TerminfoError, "can't find capability: #{capname}"
    end
    flag
  end

  def self.tigetnum(capname)
    num = @tigetnum.(capname).to_i
    case num
    when -2
      raise TerminfoError, "not numeric capability: #{capname}"
    when -1
      raise TerminfoError, "can't find capability: #{capname}"
    end
    num
  end

  def self.enabled?
    true
  end
end if Reline::Terminfo.curses_dl

module Reline::Terminfo
  def self.enabled?
    false
  end
end unless Reline::Terminfo.curses_dl
PK#}$[�ʣ�?;?;ruby/racc/grammarfileparser.rbnu�[���#--
#
#
#
# Copyright (c) 1999-2006 Minero Aoki
#
# This program is free software.
# You can distribute/modify this program under the same terms of ruby.
# see the file "COPYING".
#
#++

require 'racc'
require 'racc/compat'
require 'racc/grammar'
require 'racc/parserfilegenerator'
require 'racc/sourcetext'
require 'stringio'

module Racc

  grammar = Grammar.define {
    g = self

    g.class = seq(:CLASS, :cname, many(:param), :RULE, :rules, option(:END))

    g.cname       = seq(:rubyconst) {|name|
                      @result.params.classname = name
                    }\
                  | seq(:rubyconst, "<", :rubyconst) {|c, _, s|
                      @result.params.classname = c
                      @result.params.superclass = s
                    }

    g.rubyconst   = separated_by1(:colon2, :SYMBOL) {|syms|
                      syms.map {|s| s.to_s }.join('::')
                    }

    g.colon2 = seq(':', ':')

    g.param       = seq(:CONV, many1(:convdef), :END) {|*|
                      #@grammar.end_convert_block   # FIXME
                    }\
                  | seq(:PRECHIGH, many1(:precdef), :PRECLOW) {|*|
                      @grammar.end_precedence_declaration true
                    }\
                  | seq(:PRECLOW, many1(:precdef), :PRECHIGH) {|*|
                      @grammar.end_precedence_declaration false
                    }\
                  | seq(:START, :symbol) {|_, sym|
                      @grammar.start_symbol = sym
                    }\
                  | seq(:TOKEN, :symbols) {|_, syms|
                      syms.each do |s|
                        s.should_terminal
                      end
                    }\
                  | seq(:OPTION, :options) {|_, syms|
                      syms.each do |opt|
                        case opt
                        when 'result_var'
                          @result.params.result_var = true
                        when 'no_result_var'
                          @result.params.result_var = false
                        when 'omit_action_call'
                          @result.params.omit_action_call = true
                        when 'no_omit_action_call'
                          @result.params.omit_action_call = false
                        else
                          raise CompileError, "unknown option: #{opt}"
                        end
                      end
                    }\
                  | seq(:EXPECT, :DIGIT) {|_, num|
                      if @grammar.n_expected_srconflicts
                        raise CompileError, "`expect' seen twice"
                      end
                      @grammar.n_expected_srconflicts = num
                    }

    g.convdef     = seq(:symbol, :STRING) {|sym, code|
                      sym.serialized = code
                    }

    g.precdef     = seq(:LEFT, :symbols) {|_, syms|
                      @grammar.declare_precedence :Left, syms
                    }\
                  | seq(:RIGHT, :symbols) {|_, syms|
                      @grammar.declare_precedence :Right, syms
                    }\
                  | seq(:NONASSOC, :symbols) {|_, syms|
                      @grammar.declare_precedence :Nonassoc, syms
                    }

    g.symbols     = seq(:symbol) {|sym|
                      [sym]
                    }\
                  | seq(:symbols, :symbol) {|list, sym|
                      list.push sym
                      list
                    }\
                  | seq(:symbols, "|")

    g.symbol      = seq(:SYMBOL) {|sym| @grammar.intern(sym) }\
                  | seq(:STRING) {|str| @grammar.intern(str) }

    g.options     = many(:SYMBOL) {|syms| syms.map {|s| s.to_s } }

    g.rules       = option(:rules_core) {|list|
                      add_rule_block list  unless list.empty?
                      nil
                    }

    g.rules_core  = seq(:symbol) {|sym|
                      [sym]
                    }\
                  | seq(:rules_core, :rule_item) {|list, i|
                      list.push i
                      list
                    }\
                  | seq(:rules_core, ';') {|list, *|
                      add_rule_block list  unless list.empty?
                      list.clear
                      list
                    }\
                  | seq(:rules_core, ':') {|list, *|
                      next_target = list.pop
                      add_rule_block list  unless list.empty?
                      [next_target]
                    }

    g.rule_item   = seq(:symbol)\
                  | seq("|") {|*|
                      OrMark.new(@scanner.lineno)
                    }\
                  | seq("=", :symbol) {|_, sym|
                      Prec.new(sym, @scanner.lineno)
                    }\
                  | seq(:ACTION) {|src|
                      UserAction.source_text(src)
                    }
  }

  GrammarFileParser = grammar.parser_class

  if grammar.states.srconflict_exist?
    raise 'Racc boot script fatal: S/R conflict in build'
  end
  if grammar.states.rrconflict_exist?
    raise 'Racc boot script fatal: R/R conflict in build'
  end

  class GrammarFileParser   # reopen

    class Result
      def initialize(grammar)
        @grammar = grammar
        @params = ParserFileGenerator::Params.new
      end

      attr_reader :grammar
      attr_reader :params
    end

    def GrammarFileParser.parse_file(filename)
      parse(File.read(filename), filename, 1)
    end

    def GrammarFileParser.parse(src, filename = '-', lineno = 1)
      new().parse(src, filename, lineno)
    end

    def initialize(debug_flags = DebugFlags.new)
      @yydebug = debug_flags.parse
    end

    def parse(src, filename = '-', lineno = 1)
      @filename = filename
      @lineno = lineno
      @scanner = GrammarFileScanner.new(src, @filename)
      @scanner.debug = @yydebug
      @grammar = Grammar.new
      @result = Result.new(@grammar)
      @embedded_action_seq = 0
      yyparse @scanner, :yylex
      parse_user_code
      @result.grammar.init
      @result
    end

    private

    def next_token
      @scanner.scan
    end

    def on_error(tok, val, _values)
      if val.respond_to?(:id2name)
        v = val.id2name
      elsif val.kind_of?(String)
        v = val
      else
        v = val.inspect
      end
      raise CompileError, "#{location()}: unexpected token '#{v}'"
    end

    def location
      "#{@filename}:#{@lineno - 1 + @scanner.lineno}"
    end

    def add_rule_block(list)
      sprec = nil
      target = list.shift
      case target
      when OrMark, UserAction, Prec
        raise CompileError, "#{target.lineno}: unexpected symbol #{target.name}"
      end
      curr = []
      list.each do |i|
        case i
        when OrMark
          add_rule target, curr, sprec
          curr = []
          sprec = nil
        when Prec
          raise CompileError, "'=<prec>' used twice in one rule" if sprec
          sprec = i.symbol
        else
          curr.push i
        end
      end
      add_rule target, curr, sprec
    end

    def add_rule(target, list, sprec)
      if list.last.kind_of?(UserAction)
        act = list.pop
      else
        act = UserAction.empty
      end
      list.map! {|s| s.kind_of?(UserAction) ? embedded_action(s) : s }
      rule = Rule.new(target, list, act)
      rule.specified_prec = sprec
      @grammar.add rule
    end

    def embedded_action(act)
      sym = @grammar.intern("@#{@embedded_action_seq += 1}".intern, true)
      @grammar.add Rule.new(sym, [], act)
      sym
    end

    #
    # User Code Block
    #

    def parse_user_code
      line = @scanner.lineno
      _, *blocks = *@scanner.epilogue.split(/^----/)
      blocks.each do |block|
        header, *body = block.lines.to_a
        label0, paths = *header.sub(/\A-+/, '').split('=', 2)
        label = canonical_label(label0)
        (paths ? paths.strip.split(' ') : []).each do |path|
          add_user_code label, SourceText.new(File.read(path), path, 1)
        end
        add_user_code label, SourceText.new(body.join(''), @filename, line + 1)
        line += (1 + body.size)
      end
    end

    USER_CODE_LABELS = {
      'header'  => :header,
      'prepare' => :header,   # obsolete
      'inner'   => :inner,
      'footer'  => :footer,
      'driver'  => :footer    # obsolete
    }

    def canonical_label(src)
      label = src.to_s.strip.downcase.slice(/\w+/)
      unless USER_CODE_LABELS.key?(label)
        raise CompileError, "unknown user code type: #{label.inspect}"
      end
      label
    end

    def add_user_code(label, src)
      @result.params.public_send(USER_CODE_LABELS[label]).push src
    end

  end


  class GrammarFileScanner

    def initialize(str, filename = '-')
      @lines  = str.b.split(/\n|\r\n|\r/)
      @filename = filename
      @lineno = -1
      @line_head   = true
      @in_rule_blk = false
      @in_conv_blk = false
      @in_block = nil
      @epilogue = ''
      @debug = false
      next_line
    end

    attr_reader :epilogue

    def lineno
      @lineno + 1
    end

    attr_accessor :debug

    def yylex(&block)
      unless @debug
        yylex0(&block)
      else
        yylex0 do |sym, tok|
          $stderr.printf "%7d %-10s %s\n", lineno(), sym.inspect, tok.inspect
          yield [sym, tok]
        end
      end
    end

    private

    def yylex0
      begin
        until @line.empty?
          @line.sub!(/\A\s+/, '')
          if /\A\#/ =~ @line
            break
          elsif /\A\/\*/ =~ @line
            skip_comment
          elsif s = reads(/\A[a-zA-Z_]\w*/)
            yield [atom_symbol(s), s.intern]
          elsif s = reads(/\A\d+/)
            yield [:DIGIT, s.to_i]
          elsif ch = reads(/\A./)
            case ch
            when '"', "'"
              yield [:STRING, eval(scan_quoted(ch))]
            when '{'
              lineno = lineno()
              yield [:ACTION, SourceText.new(scan_action(), @filename, lineno)]
            else
              if ch == '|'
                @line_head = false
              end
              yield [ch, ch]
            end
          else
          end
        end
      end while next_line()
      yield nil
    end

    def next_line
      @lineno += 1
      @line = @lines[@lineno]
      if not @line or /\A----/ =~ @line
        @epilogue = @lines.join("\n")
        @lines.clear
        @line = nil
        if @in_block
          @lineno -= 1
          scan_error! sprintf('unterminated %s', @in_block)
        end
        false
      else
        @line.sub!(/(?:\n|\r\n|\r)\z/, '')
        @line_head = true
        true
      end
    end

    ReservedWord = {
      'right'    => :RIGHT,
      'left'     => :LEFT,
      'nonassoc' => :NONASSOC,
      'preclow'  => :PRECLOW,
      'prechigh' => :PRECHIGH,
      'token'    => :TOKEN,
      'convert'  => :CONV,
      'options'  => :OPTION,
      'start'    => :START,
      'expect'   => :EXPECT,
      'class'    => :CLASS,
      'rule'     => :RULE,
      'end'      => :END
    }

    def atom_symbol(token)
      if token == 'end'
        symbol = :END
        @in_conv_blk = false
        @in_rule_blk = false
      else
        if @line_head and not @in_conv_blk and not @in_rule_blk
          symbol = ReservedWord[token] || :SYMBOL
        else
          symbol = :SYMBOL
        end
        case symbol
        when :RULE then @in_rule_blk = true
        when :CONV then @in_conv_blk = true
        end
      end
      @line_head = false
      symbol
    end

    def skip_comment
      @in_block = 'comment'
      until m = /\*\//.match(@line)
        next_line
      end
      @line = m.post_match
      @in_block = nil
    end

    $raccs_print_type = false

    def scan_action
      buf = String.new
      nest = 1
      pre = nil
      @in_block = 'action'
      begin
        pre = nil
        if s = reads(/\A\s+/)
          # does not set 'pre'
          buf << s
        end
        until @line.empty?
          if s = reads(/\A[^'"`{}%#\/\$]+/)
            buf << (pre = s)
            next
          end
          case ch = read(1)
          when '{'
            nest += 1
            buf << (pre = ch)
          when '}'
            nest -= 1
            if nest == 0
              @in_block = nil
              buf.sub!(/[ \t\f]+\z/, '')
              return buf
            end
            buf << (pre = ch)
          when '#'   # comment
            buf << ch << @line
            break
          when "'", '"', '`'
            buf << (pre = scan_quoted(ch))
          when '%'
            if literal_head? pre, @line
              # % string, regexp, array
              buf << ch
              case ch = read(1)
              when /[qQx]/n
                buf << ch << (pre = scan_quoted(read(1), '%string'))
              when /wW/n
                buf << ch << (pre = scan_quoted(read(1), '%array'))
              when /s/n
                buf << ch << (pre = scan_quoted(read(1), '%symbol'))
              when /r/n
                buf << ch << (pre = scan_quoted(read(1), '%regexp'))
              when /[a-zA-Z0-9= ]/n   # does not include "_"
                scan_error! "unknown type of % literal '%#{ch}'"
              else
                buf << (pre = scan_quoted(ch, '%string'))
              end
            else
              # operator
              buf << '||op->' if $raccs_print_type
              buf << (pre = ch)
            end
          when '/'
            if literal_head? pre, @line
              # regexp
              buf << (pre = scan_quoted(ch, 'regexp'))
            else
              # operator
              buf << '||op->' if $raccs_print_type
              buf << (pre = ch)
            end
          when '$'   # gvar
            buf << ch << (pre = read(1))
          else
            raise 'racc: fatal: must not happen'
          end
        end
        buf << "\n"
      end while next_line()
      raise 'racc: fatal: scan finished before parser finished'
    end

    def literal_head?(pre, post)
      (!pre || /[a-zA-Z_0-9]/n !~ pre[-1,1]) &&
          !post.empty? && /\A[\s\=]/n !~ post
    end

    def read(len)
      s = @line[0, len]
      @line = @line[len .. -1]
      s
    end

    def reads(re)
      m = re.match(@line) or return nil
      @line = m.post_match
      m[0]
    end

    def scan_quoted(left, tag = 'string')
      buf = left.dup
      buf = "||#{tag}->" + buf if $raccs_print_type
      re = get_quoted_re(left)
      sv, @in_block = @in_block, tag
      begin
        if s = reads(re)
          buf << s
          break
        else
          buf << @line
        end
      end while next_line()
      @in_block = sv
      buf << "<-#{tag}||" if $raccs_print_type
      buf
    end

    LEFT_TO_RIGHT = {
      '(' => ')',
      '{' => '}',
      '[' => ']',
      '<' => '>'
    }

    CACHE = {}

    def get_quoted_re(left)
      term = Regexp.quote(LEFT_TO_RIGHT[left] || left)
      CACHE[left] ||= /\A[^#{term}\\]*(?:\\.[^\\#{term}]*)*#{term}/
    end

    def scan_error!(msg)
      raise CompileError, "#{lineno()}: #{msg}"
    end

  end

end   # module Racc
PK#}$[0�p�ruby/racc/sourcetext.rbnu�[���#--
#
#
#
# Copyright (c) 1999-2006 Minero Aoki
#
# This program is free software.
# You can distribute/modify this program under the same terms of ruby.
# see the file "COPYING".
#
#++

module Racc

  class SourceText
    def initialize(text, filename, lineno)
      @text = text
      @filename = filename
      @lineno = lineno
    end

    attr_reader :text
    attr_reader :filename
    attr_reader :lineno

    def to_s
      "#<SourceText #{location()}>"
    end

    def location
      "#{@filename}:#{@lineno}"
    end
  end

end
PK#}$[5uq�ruby/racc/exception.rbnu�[���#--
#
#
#
# Copyright (c) 1999-2006 Minero Aoki
#
# This program is free software.
# You can distribute/modify this program under the same terms of ruby.
# see the file "COPYING".
#
#++

module Racc
  class Error < StandardError; end
  class CompileError < Error; end
end
PK#}$[����--ruby/racc/logfilegenerator.rbnu�[���#--
#
#
#
# Copyright (c) 1999-2006 Minero Aoki
#
# This program is free software.
# You can distribute/modify this program under the same terms of ruby.
# see the file "COPYING".
#
#++

module Racc

  class LogFileGenerator

    def initialize(states, debug_flags = DebugFlags.new)
      @states = states
      @grammar = states.grammar
      @debug_flags = debug_flags
    end

    def output(out)
      output_conflict out; out.puts
      output_useless  out; out.puts
      output_rule     out; out.puts
      output_token    out; out.puts
      output_state    out
    end

    #
    # Warnings
    #

    def output_conflict(out)
      @states.each do |state|
        if state.srconf
          out.printf "state %d contains %d shift/reduce conflicts\n",
                     state.stateid, state.srconf.size
        end
        if state.rrconf
          out.printf "state %d contains %d reduce/reduce conflicts\n",
                     state.stateid, state.rrconf.size
        end
      end
    end

    def output_useless(out)
      @grammar.each do |rl|
        if rl.useless?
          out.printf "rule %d (%s) never reduced\n",
                     rl.ident, rl.target.to_s
        end
      end
      @grammar.each_nonterminal do |t|
        if t.useless?
          out.printf "useless nonterminal %s\n", t.to_s
        end
      end
    end

    #
    # States
    #

    def output_state(out)
      out << "--------- State ---------\n"

      showall = @debug_flags.la || @debug_flags.state
      @states.each do |state|
        out << "\nstate #{state.ident}\n\n"

        (showall ? state.closure : state.core).each do |ptr|
          pointer_out(out, ptr) if ptr.rule.ident != 0 or showall
        end
        out << "\n"

        action_out out, state
      end
    end

    def pointer_out(out, ptr)
      buf = sprintf("%4d) %s :", ptr.rule.ident, ptr.rule.target.to_s)
      ptr.rule.symbols.each_with_index do |tok, idx|
        buf << ' _' if idx == ptr.index
        buf << ' ' << tok.to_s
      end
      buf << ' _' if ptr.reduce?
      out.puts buf
    end

    def action_out(f, state)
      sr = state.srconf && state.srconf.dup
      rr = state.rrconf && state.rrconf.dup
      acts = state.action
      keys = acts.keys
      keys.sort! {|a,b| a.ident <=> b.ident }

      [ Shift, Reduce, Error, Accept ].each do |klass|
        keys.delete_if do |tok|
          act = acts[tok]
          if act.kind_of?(klass)
            outact f, tok, act
            if sr and c = sr.delete(tok)
              outsrconf f, c
            end
            if rr and c = rr.delete(tok)
              outrrconf f, c
            end

            true
          else
            false
          end
        end
      end
      sr.each {|tok, c| outsrconf f, c } if sr
      rr.each {|tok, c| outrrconf f, c } if rr

      act = state.defact
      if not act.kind_of?(Error) or @debug_flags.any?
        outact f, '$default', act
      end

      f.puts
      state.goto_table.each do |t, st|
        if t.nonterminal?
          f.printf "  %-12s  go to state %d\n", t.to_s, st.ident
        end
      end
    end

    def outact(f, t, act)
      case act
      when Shift
        f.printf "  %-12s  shift, and go to state %d\n",
                 t.to_s, act.goto_id
      when Reduce
        f.printf "  %-12s  reduce using rule %d (%s)\n",
                 t.to_s, act.ruleid, act.rule.target.to_s
      when Accept
        f.printf "  %-12s  accept\n", t.to_s
      when Error
        f.printf "  %-12s  error\n", t.to_s
      else
        raise "racc: fatal: wrong act for outact: act=#{act}(#{act.class})"
      end
    end

    def outsrconf(f, confs)
      confs.each do |c|
        r = c.reduce
        f.printf "  %-12s  [reduce using rule %d (%s)]\n",
                 c.shift.to_s, r.ident, r.target.to_s
      end
    end

    def outrrconf(f, confs)
      confs.each do |c|
        r = c.low_prec
        f.printf "  %-12s  [reduce using rule %d (%s)]\n",
                 c.token.to_s, r.ident, r.target.to_s
      end
    end

    #
    # Rules
    #

    def output_rule(out)
      out.print "-------- Grammar --------\n\n"
      @grammar.each do |rl|
        if @debug_flags.any? or rl.ident != 0
          out.printf "rule %d %s: %s\n",
                     rl.ident, rl.target.to_s, rl.symbols.join(' ')
        end
      end
    end

    #
    # Tokens
    #

    def output_token(out)
      out.print "------- Symbols -------\n\n"

      out.print "**Nonterminals, with rules where they appear\n\n"
      @grammar.each_nonterminal do |t|
        tmp = <<SRC
  %s (%d)
    on right: %s
    on left : %s
SRC
        out.printf tmp, t.to_s, t.ident,
                   symbol_locations(t.locate).join(' '),
                   symbol_locations(t.heads).join(' ')
      end

      out.print "\n**Terminals, with rules where they appear\n\n"
      @grammar.each_terminal do |t|
        out.printf "  %s (%d) %s\n",
                   t.to_s, t.ident, symbol_locations(t.locate).join(' ')
      end
    end

    def symbol_locations(locs)
      locs.map {|loc| loc.rule.ident }.reject {|n| n == 0 }.uniq
    end

  end

end   # module Racc
PK#}$[D�&2��ruby/racc/iset.rbnu�[���#--
#
#
#
# Copyright (c) 1999-2006 Minero Aoki
#
# This program is free software.
# You can distribute/modify this program under the same terms of ruby.
# see the file "COPYING".
#
#++

module Racc

  # An "indexed" set.  All items must respond to :ident.
  class ISet

    def initialize(a = [])
      @set = a
    end

    attr_reader :set

    def add(i)
      @set[i.ident] = i
    end

    def [](key)
      @set[key.ident]
    end

    def []=(key, val)
      @set[key.ident] = val
    end

    alias include? []
    alias key? []

    def update(other)
      s = @set
      o = other.set
      o.each_index do |idx|
        if t = o[idx]
          s[idx] = t
        end
      end
    end

    def update_a(a)
      s = @set
      a.each {|i| s[i.ident] = i }
    end

    def delete(key)
      i = @set[key.ident]
      @set[key.ident] = nil
      i
    end

    def each(&block)
      @set.compact.each(&block)
    end

    def to_a
      @set.compact
    end

    def to_s
      "[#{@set.compact.join(' ')}]"
    end

    alias inspect to_s

    def size
      @set.nitems
    end

    def empty?
      @set.nitems == 0
    end

    def clear
      @set.clear
    end

    def dup
      ISet.new(@set.dup)
    end

  end   # class ISet

end   # module Racc
PK#}$[��B))ruby/racc/info.rbnu�[���#--
#
#
#
# Copyright (c) 1999-2006 Minero Aoki
#
# This program is free software.
# You can distribute/modify this program under the same terms of ruby.
# see the file "COPYING".
#
#++

module Racc
  VERSION   = '1.6.0'
  Version = VERSION
  Copyright = 'Copyright (c) 1999-2006 Minero Aoki'
end
PK#}$[���BB!ruby/racc/statetransitiontable.rbnu�[���#--
#
#
#
# Copyright (c) 1999-2006 Minero Aoki
#
# This program is free software.
# You can distribute/modify this program under the same terms of ruby.
# see the file "COPYING".
#
#++

require 'racc/parser'

module Racc

  StateTransitionTable = Struct.new(:action_table,
                                    :action_check,
                                    :action_default,
                                    :action_pointer,
                                    :goto_table,
                                    :goto_check,
                                    :goto_default,
                                    :goto_pointer,
                                    :token_table,
                                    :reduce_table,
                                    :reduce_n,
                                    :shift_n,
                                    :nt_base,
                                    :token_to_s_table,
                                    :use_result_var,
                                    :debug_parser)
  class StateTransitionTable   # reopen
    def StateTransitionTable.generate(states)
      StateTransitionTableGenerator.new(states).generate
    end

    def initialize(states)
      super()
      @states = states
      @grammar = states.grammar
      self.use_result_var = true
      self.debug_parser = true
    end

    attr_reader :states
    attr_reader :grammar

    def parser_class
      ParserClassGenerator.new(@states).generate
    end

    def token_value_table
      h = {}
      token_table().each do |sym, i|
        h[sym.value] = i
      end
      h
    end
  end


  class StateTransitionTableGenerator

    def initialize(states)
      @states = states
      @grammar = states.grammar
    end

    def generate
      t = StateTransitionTable.new(@states)
      gen_action_tables t, @states
      gen_goto_tables t, @grammar
      t.token_table = token_table(@grammar)
      t.reduce_table = reduce_table(@grammar)
      t.reduce_n = @states.reduce_n
      t.shift_n = @states.shift_n
      t.nt_base = @grammar.nonterminal_base
      t.token_to_s_table = @grammar.symbols.map {|sym| sym.to_s }
      t
    end

    def reduce_table(grammar)
      t = [0, 0, :racc_error]
      grammar.each_with_index do |rule, idx|
        next if idx == 0
        t.push rule.size
        t.push rule.target.ident
        t.push(if rule.action.empty?   # and @params.omit_action_call?
               then :_reduce_none
               else "_reduce_#{idx}".intern
               end)
      end
      t
    end

    def token_table(grammar)
      h = {}
      grammar.symboltable.terminals.each do |t|
        h[t] = t.ident
      end
      h
    end

    def gen_action_tables(t, states)
      t.action_table = yytable  = []
      t.action_check = yycheck  = []
      t.action_default = yydefact = []
      t.action_pointer = yypact   = []
      e1 = []
      e2 = []
      states.each do |state|
        yydefact.push act2actid(state.defact)
        if state.action.empty?
          yypact.push nil
          next
        end
        vector = []
        state.action.each do |tok, act|
          vector[tok.ident] = act2actid(act)
        end
        addent e1, vector, state.ident, yypact
      end
      set_table e1, e2, yytable, yycheck, yypact
    end

    def gen_goto_tables(t, grammar)
      t.goto_table   = yytable2  = []
      t.goto_check   = yycheck2  = []
      t.goto_pointer = yypgoto   = []
      t.goto_default = yydefgoto = []
      e1 = []
      e2 = []
      grammar.each_nonterminal do |tok|
        tmp = []

        # decide default
        freq = Array.new(@states.size, 0)
        @states.each do |state|
          st = state.goto_table[tok]
          if st
            st = st.ident
            freq[st] += 1
          end
          tmp[state.ident] = st
        end
        max = freq.max
        if max > 1
          default = freq.index(max)
          tmp.map! {|i| default == i ? nil : i }
        else
          default = nil
        end
        yydefgoto.push default

        # delete default value
        tmp.pop until tmp.last or tmp.empty?
        if tmp.compact.empty?
          # only default
          yypgoto.push nil
          next
        end

        addent e1, tmp, (tok.ident - grammar.nonterminal_base), yypgoto
      end
      set_table e1, e2, yytable2, yycheck2, yypgoto
    end

    def addent(all, arr, chkval, ptr)
      max = arr.size
      min = nil
      arr.each_with_index do |item, idx|
        if item
          min ||= idx
        end
      end
      ptr.push(-7777)    # mark
      arr = arr[min...max]
      all.push [arr, chkval, mkmapexp(arr), min, ptr.size - 1]
    end

    n = 2 ** 16
    begin
      Regexp.compile("a{#{n}}")
      RE_DUP_MAX = n
    rescue RegexpError
      n /= 2
      retry
    end

    def mkmapexp(arr)
      i = ii = 0
      as = arr.size
      map = String.new
      maxdup = RE_DUP_MAX
      curr = nil
      while i < as
        ii = i + 1
        if arr[i]
          ii += 1 while ii < as and arr[ii]
          curr = '-'
        else
          ii += 1 while ii < as and not arr[ii]
          curr = '.'
        end

        offset = ii - i
        if offset == 1
          map << curr
        else
          while offset > maxdup
            map << "#{curr}{#{maxdup}}"
            offset -= maxdup
          end
          map << "#{curr}{#{offset}}" if offset > 1
        end
        i = ii
      end
      Regexp.compile(map, 'n')
    end

    def set_table(entries, dummy, tbl, chk, ptr)
      upper = 0
      map = '-' * 10240

      # sort long to short
      entries.sort_by!.with_index {|a,i| [-a[0].size, i] }

      entries.each do |arr, chkval, expr, min, ptri|
        if upper + arr.size > map.size
          map << '-' * (arr.size + 1024)
        end
        idx = map.index(expr)
        ptr[ptri] = idx - min
        arr.each_with_index do |item, i|
          if item
            i += idx
            tbl[i] = item
            chk[i] = chkval
            map[i] = ?o
          end
        end
        upper = idx + arr.size
      end
    end

    def act2actid(act)
      case act
      when Shift  then act.goto_id
      when Reduce then -act.ruleid
      when Accept then @states.shift_n
      when Error  then @states.reduce_n * -1
      else
        raise "racc: fatal: wrong act type #{act.class} in action table"
      end
    end

  end


  class ParserClassGenerator

    def initialize(states)
      @states = states
      @grammar = states.grammar
    end

    def generate
      table = @states.state_transition_table
      c = Class.new(::Racc::Parser)
      c.const_set :Racc_arg, [table.action_table,
                              table.action_check,
                              table.action_default,
                              table.action_pointer,
                              table.goto_table,
                              table.goto_check,
                              table.goto_default,
                              table.goto_pointer,
                              table.nt_base,
                              table.reduce_table,
                              table.token_value_table,
                              table.shift_n,
                              table.reduce_n,
                              false]
      c.const_set :Racc_token_to_s_table, table.token_to_s_table
      c.const_set :Racc_debug_parser, true
      define_actions c
      c
    end

    private

    def define_actions(c)
      c.module_eval "def _reduce_none(vals, vstack) vals[0] end"
      @grammar.each do |rule|
        if rule.action.empty?
          c.alias_method("_reduce_#{rule.ident}", :_reduce_none)
        else
          c.define_method("_racc_action_#{rule.ident}", &rule.action.proc)
          c.module_eval(<<-End, __FILE__, __LINE__ + 1)
            def _reduce_#{rule.ident}(vals, vstack)
              _racc_action_#{rule.ident}(*vals)
            end
          End
        end
      end
    end

  end

end   # module Racc
PK#}$[���--ruby/racc/debugflags.rbnu�[���#--
#
#
#
# Copyright (c) 1999-2006 Minero Aoki
#
# This program is free software.
# You can distribute/modify this program under the same terms of ruby.
# see the file "COPYING".
#
#++

module Racc

  class DebugFlags
    def DebugFlags.parse_option_string(s)
      parse = rule = token = state = la = prec = conf = false
      s.split(//).each do |ch|
        case ch
        when 'p' then parse = true
        when 'r' then rule = true
        when 't' then token = true
        when 's' then state = true
        when 'l' then la = true
        when 'c' then prec = true
        when 'o' then conf = true
        else
          raise "unknown debug flag char: #{ch.inspect}"
        end
      end
      new(parse, rule, token, state, la, prec, conf)
    end

    def initialize(parse = false, rule = false, token = false, state = false,
                   la = false, prec = false, conf = false)
      @parse = parse
      @rule = rule
      @token = token
      @state = state
      @la = la
      @prec = prec
      @any = (parse || rule || token || state || la || prec)
      @status_logging = conf
    end

    attr_reader :parse
    attr_reader :rule
    attr_reader :token
    attr_reader :state
    attr_reader :la
    attr_reader :prec

    def any?
      @any
    end

    attr_reader :status_logging
  end

end
PK#}$[?�ﱉ�ruby/racc/static.rbnu�[���require 'racc'
require 'racc/parser'
require 'racc/grammarfileparser'
require 'racc/parserfilegenerator'
require 'racc/logfilegenerator'
PK#}$[U(��T*T* ruby/racc/parserfilegenerator.rbnu�[���#--
#
#
#
# Copyright (c) 1999-2006 Minero Aoki
#
# This program is free software.
# You can distribute/modify this program under the same terms of ruby.
# see the file "COPYING".
#
#++

require 'racc/compat'
require 'racc/sourcetext'
require 'racc/parser-text'
require 'rbconfig'

module Racc

  class ParserFileGenerator

    class Params
      def self.bool_attr(name)
        module_eval(<<-End)
          def #{name}?
            @#{name}
          end

          def #{name}=(b)
            @#{name} = b
          end
        End
      end

      attr_accessor :filename
      attr_accessor :classname
      attr_accessor :superclass
      bool_attr :omit_action_call
      bool_attr :result_var
      attr_accessor :header
      attr_accessor :inner
      attr_accessor :footer

      bool_attr :debug_parser
      bool_attr :convert_line
      bool_attr :convert_line_all
      bool_attr :embed_runtime
      bool_attr :make_executable
      attr_accessor :interpreter

      def initialize
        # Parameters derived from parser
        self.filename = nil
        self.classname = nil
        self.superclass = 'Racc::Parser'
        self.omit_action_call = true
        self.result_var = true
        self.header = []
        self.inner  = []
        self.footer = []

        # Parameters derived from command line options
        self.debug_parser = false
        self.convert_line = true
        self.convert_line_all = false
        self.embed_runtime = false
        self.make_executable = false
        self.interpreter = nil
      end
    end

    def initialize(states, params)
      @states = states
      @grammar = states.grammar
      @params = params
    end

    def generate_parser
      string_io = StringIO.new

      init_line_conversion_system
      @f = string_io
      parser_file

      string_io.rewind
      string_io.read
    end

    def generate_parser_file(destpath)
      init_line_conversion_system
      File.open(destpath, 'w') {|f|
        @f = f
        parser_file
      }
      File.chmod 0755, destpath if @params.make_executable?
    end

    private

    def parser_file
      shebang @params.interpreter if @params.make_executable?
      notice
      line
      if @params.embed_runtime?
        embed_library runtime_source()
      else
        require 'racc/parser.rb'
      end
      header
      parser_class(@params.classname, @params.superclass) {
        inner
        state_transition_table
      }
      footer
    end

    c = ::RbConfig::CONFIG
    RUBY_PATH = "#{c['bindir']}/#{c['ruby_install_name']}#{c['EXEEXT']}"

    def shebang(path)
      line '#!' + (path == 'ruby' ? RUBY_PATH : path)
    end

    def notice
      line %q[#]
      line %q[# DO NOT MODIFY!!!!]
      line %Q[# This file is automatically generated by Racc #{Racc::Version}]
      line %Q[# from Racc grammar file "#{@params.filename}".]
      line %q[#]
    end

    def runtime_source
      SourceText.new(::Racc::PARSER_TEXT, 'racc/parser.rb', 1)
    end

    def embed_library(src)
      line %[###### #{src.filename} begin]
      line %[unless $".index '#{src.filename}']
      line %[$".push '#{src.filename}']
      put src, @params.convert_line?
      line %[end]
      line %[###### #{src.filename} end]
    end

    def require(feature)
      line "require '#{feature}'"
    end

    def parser_class(classname, superclass)
      mods = classname.split('::')
      classid = mods.pop
      mods.each do |mod|
        indent; line "module #{mod}"
        cref_push mod
      end
      indent; line "class #{classid} < #{superclass}"
      cref_push classid
      yield
      cref_pop
      indent; line "end   \# class #{classid}"
      mods.reverse_each do |mod|
        cref_pop
        indent; line "end   \# module #{mod}"
      end
    end

    def header
      @params.header.each do |src|
        line
        put src, @params.convert_line_all?
      end
    end

    def inner
      @params.inner.each do |src|
        line
        put src, @params.convert_line?
      end
    end

    def footer
      @params.footer.each do |src|
        line
        put src, @params.convert_line_all?
      end
    end

    # Low Level Routines

    def put(src, convert_line = false)
      if convert_line
        replace_location(src) {
          @f.puts src.text
        }
      else
        @f.puts src.text
      end
    end

    def line(str = '')
      @f.puts str
    end

    def init_line_conversion_system
      @cref = []
      @used_separator = {}
    end

    def cref_push(name)
      @cref.push name
    end

    def cref_pop
      @cref.pop
    end

    def indent
      @f.print '  ' * @cref.size
    end

    def toplevel?
      @cref.empty?
    end

    def replace_location(src)
      sep = make_separator(src)
      @f.print 'self.class.' if toplevel?
      @f.puts "module_eval(<<'#{sep}', '#{src.filename}', #{src.lineno})"
      yield
      @f.puts sep
    end

    def make_separator(src)
      sep = unique_separator(src.filename)
      sep *= 2 while src.text.index(sep)
      sep
    end

    def unique_separator(id)
      sep = String.new "...end #{id}/module_eval..."
      while @used_separator.key?(sep)
        sep.concat sprintf('%02x', rand(255))
      end
      @used_separator[sep] = true
      sep
    end

    #
    # State Transition Table Serialization
    #

    public

    def put_state_transition_table(f)
      @f = f
      state_transition_table
    end

    private

    def state_transition_table
      table = @states.state_transition_table
      table.use_result_var = @params.result_var?
      table.debug_parser = @params.debug_parser?

      line "##### State transition tables begin ###"
      line
      integer_list 'racc_action_table', table.action_table
      line
      integer_list 'racc_action_check', table.action_check
      line
      integer_list 'racc_action_pointer', table.action_pointer
      line
      integer_list 'racc_action_default', table.action_default
      line
      integer_list 'racc_goto_table', table.goto_table
      line
      integer_list 'racc_goto_check', table.goto_check
      line
      integer_list 'racc_goto_pointer', table.goto_pointer
      line
      integer_list 'racc_goto_default', table.goto_default
      line
      i_i_sym_list 'racc_reduce_table', table.reduce_table
      line
      line "racc_reduce_n = #{table.reduce_n}"
      line
      line "racc_shift_n = #{table.shift_n}"
      line
      sym_int_hash 'racc_token_table', table.token_table
      line
      line "racc_nt_base = #{table.nt_base}"
      line
      line "racc_use_result_var = #{table.use_result_var}"
      line
      @f.print(unindent_auto(<<-End))
        Racc_arg = [
          racc_action_table,
          racc_action_check,
          racc_action_default,
          racc_action_pointer,
          racc_goto_table,
          racc_goto_check,
          racc_goto_default,
          racc_goto_pointer,
          racc_nt_base,
          racc_reduce_table,
          racc_token_table,
          racc_shift_n,
          racc_reduce_n,
          racc_use_result_var ]
      End
      line
      string_list 'Racc_token_to_s_table', table.token_to_s_table
      line
      line "Racc_debug_parser = #{table.debug_parser}"
      line
      line '##### State transition tables end #####'
      actions
    end

    def integer_list(name, table)
      sep = ''
      line "#{name} = ["
      table.each_slice(10) do |ns|
        @f.print sep; sep = ",\n"
        @f.print ns.map {|n| sprintf('%6s', n ? n.to_s : 'nil') }.join(',')
      end
      line ' ]'
    end

    def i_i_sym_list(name, table)
      sep = ''
      line "#{name} = ["
      table.each_slice(3) do |len, target, mid|
        @f.print sep; sep = ",\n"
        @f.printf '  %d, %d, %s', len, target, mid.inspect
      end
      line " ]"
    end

    def sym_int_hash(name, h)
      sep = "\n"
      @f.print "#{name} = {"
      h.to_a.sort_by {|sym, i| i }.each do |sym, i|
        @f.print sep; sep = ",\n"
        @f.printf "  %s => %d", sym.serialize, i
      end
      line " }"
    end

    def string_list(name, list)
      sep = "  "
      line "#{name} = ["
      list.each do |s|
        @f.print sep; sep = ",\n  "
        @f.print s.dump
      end
      line ' ]'
    end

    def actions
      @grammar.each do |rule|
        unless rule.action.source?
          raise "racc: fatal: cannot generate parser file when any action is a Proc"
        end
      end

      if @params.result_var?
        decl = ', result'
        retval = "\n    result"
        default_body = ''
      else
        decl = ''
        retval = ''
        default_body = 'val[0]'
      end
      @grammar.each do |rule|
        line
        if rule.action.empty? and @params.omit_action_call?
          line "# reduce #{rule.ident} omitted"
        else
          src0 = rule.action.source || SourceText.new(default_body, __FILE__, 0)
          if @params.convert_line?
            src = remove_blank_lines(src0)
            delim = make_delimiter(src.text)
            @f.printf unindent_auto(<<-End),
              module_eval(<<'%s', '%s', %d)
                def _reduce_%d(val, _values%s)
                  %s%s
                end
              %s
            End
                      delim, src.filename, src.lineno - 1,
                        rule.ident, decl,
                        src.text, retval,
                      delim
          else
            src = remove_blank_lines(src0)
            @f.printf unindent_auto(<<-End),
              def _reduce_%d(val, _values%s)
              %s%s
              end
            End
                      rule.ident, decl,
                      src.text, retval
          end
        end
      end
      line
      @f.printf unindent_auto(<<-'End'), decl
        def _reduce_none(val, _values%s)
          val[0]
        end
      End
      line
    end

    def remove_blank_lines(src)
      body = src.text.dup
      line = src.lineno
      while body.slice!(/\A[ \t\f]*(?:\n|\r\n|\r)/)
        line += 1
      end
      SourceText.new(body, src.filename, line)
    end

    def make_delimiter(body)
      delim = '.,.,'
      while body.index(delim)
        delim *= 2
      end
      delim
    end

    def unindent_auto(str)
      lines = str.lines.to_a
      n = minimum_indent(lines)
      lines.map {|line| detab(line).sub(indent_re(n), '').rstrip + "\n" }.join('')
    end

    def minimum_indent(lines)
      lines.map {|line| n_indent(line) }.min
    end

    def n_indent(line)
      line.slice(/\A\s+/).size
    end

    RE_CACHE = {}

    def indent_re(n)
      RE_CACHE[n] ||= /\A {#{n}}/
    end

    def detab(str, ts = 8)
      add = 0
      len = nil
      str.gsub(/\t/) {
        len = ts - ($`.size + add) % ts
        add += len - 1
        ' ' * len
      }
    end

  end

end
PK#}$[��Kruby/racc/compat.rbnu�[���#--
#
#
#
# Copyright (c) 1999-2006 Minero Aoki
#
# This program is free software.
# You can distribute/modify this program under the same terms of ruby.
# see the file "COPYING".
#
#++

unless Object.method_defined?(:__send)
  class Object
    alias __send __send__
  end
end

unless Object.method_defined?(:__send!)
  class Object
    alias __send! __send__
  end
end

unless Array.method_defined?(:map!)
  class Array
    if Array.method_defined?(:collect!)
      alias map! collect!
    else
      alias map! filter
    end
  end
end
PK#}$[�|f��X�Xruby/racc/grammar.rbnu�[���#--
#
#
#
# Copyright (c) 1999-2006 Minero Aoki
#
# This program is free software.
# You can distribute/modify this program under the same terms of ruby.
# see the file "COPYING".
#
#++

require 'racc/compat'
require 'racc/iset'
require 'racc/sourcetext'
require 'racc/logfilegenerator'
require 'racc/exception'
require 'forwardable'

module Racc

  class Grammar

    def initialize(debug_flags = DebugFlags.new)
      @symboltable = SymbolTable.new
      @debug_symbol = debug_flags.token
      @rules   = []  # :: [Rule]
      @start   = nil
      @n_expected_srconflicts = nil
      @prec_table = []
      @prec_table_closed = false
      @closed = false
      @states = nil
    end

    attr_reader :start
    attr_reader :symboltable
    attr_accessor :n_expected_srconflicts

    def [](x)
      @rules[x]
    end

    def each_rule(&block)
      @rules.each(&block)
    end

    alias each each_rule

    def each_index(&block)
      @rules.each_index(&block)
    end

    def each_with_index(&block)
      @rules.each_with_index(&block)
    end

    def size
      @rules.size
    end

    def to_s
      "<Racc::Grammar>"
    end

    extend Forwardable

    def_delegator "@symboltable", :each, :each_symbol
    def_delegator "@symboltable", :each_terminal
    def_delegator "@symboltable", :each_nonterminal

    def intern(value, dummy = false)
      @symboltable.intern(value, dummy)
    end

    def symbols
      @symboltable.symbols
    end

    def nonterminal_base
      @symboltable.nt_base
    end

    def useless_nonterminal_exist?
      n_useless_nonterminals() != 0
    end

    def n_useless_nonterminals
      @n_useless_nonterminals ||= each_useless_nonterminal.count
    end

    def each_useless_nonterminal
      return to_enum __method__ unless block_given?

      @symboltable.each_nonterminal do |sym|
        yield sym if sym.useless?
      end
    end

    def useless_rule_exist?
      n_useless_rules() != 0
    end

    def n_useless_rules
      @n_useless_rules ||= each_useless_rule.count
    end

    def each_useless_rule
      return to_enum __method__ unless block_given?

      each do |r|
        yield r if r.useless?
      end
    end

    def nfa
      (@states ||= States.new(self)).nfa
    end

    def dfa
      (@states ||= States.new(self)).dfa
    end

    alias states dfa

    def state_transition_table
      states().state_transition_table
    end

    def parser_class
      states = states()   # cache
      if $DEBUG
        srcfilename = caller(1).first.slice(/\A(.*?):/, 1)
        begin
          write_log srcfilename + ".output"
        rescue SystemCallError
        end
        report = lambda {|s| $stderr.puts "racc: #{srcfilename}: #{s}" }
        if states.should_report_srconflict?
          report["#{states.n_srconflicts} shift/reduce conflicts"]
        end
        if states.rrconflict_exist?
          report["#{states.n_rrconflicts} reduce/reduce conflicts"]
        end
        g = states.grammar
        if g.useless_nonterminal_exist?
          report["#{g.n_useless_nonterminals} useless nonterminals"]
        end
        if g.useless_rule_exist?
          report["#{g.n_useless_rules} useless rules"]
        end
      end
      states.state_transition_table.parser_class
    end

    def write_log(path)
      File.open(path, 'w') {|f|
        LogFileGenerator.new(states()).output f
      }
    end

    #
    # Grammar Definition Interface
    #

    def add(rule)
      raise ArgumentError, "rule added after the Grammar closed" if @closed
      @rules.push rule
    end

    def added?(sym)
      @rules.detect {|r| r.target == sym }
    end

    def start_symbol=(s)
      raise CompileError, "start symbol set twice'" if @start
      @start = s
    end

    def declare_precedence(assoc, syms)
      raise CompileError, "precedence table defined twice" if @prec_table_closed
      @prec_table.push [assoc, syms]
    end

    def end_precedence_declaration(reverse)
      @prec_table_closed = true
      return if @prec_table.empty?
      table = reverse ? @prec_table.reverse : @prec_table
      table.each_with_index do |(assoc, syms), idx|
        syms.each do |sym|
          sym.assoc = assoc
          sym.precedence = idx
        end
      end
    end

    #
    # Dynamic Generation Interface
    #

    def Grammar.define(&block)
      env = DefinitionEnv.new
      env.instance_eval(&block)
      env.grammar
    end

    class DefinitionEnv
      def initialize
        @grammar = Grammar.new
        @seqs = Hash.new(0)
        @delayed = []
      end

      def grammar
        flush_delayed
        @grammar.each do |rule|
          if rule.specified_prec
            rule.specified_prec = @grammar.intern(rule.specified_prec)
          end
        end
        @grammar.init
        @grammar
      end

      def precedence_table(&block)
        env = PrecedenceDefinitionEnv.new(@grammar)
        env.instance_eval(&block)
        @grammar.end_precedence_declaration env.reverse
      end

      def method_missing(mid, *args, &block)
        unless mid.to_s[-1,1] == '='
          super   # raises NoMethodError
        end
        target = @grammar.intern(mid.to_s.chop.intern)
        unless args.size == 1
          raise ArgumentError, "too many arguments for #{mid} (#{args.size} for 1)"
        end
        _add target, args.first
      end

      def _add(target, x)
        case x
        when Sym
          @delayed.each do |rule|
            rule.replace x, target if rule.target == x
          end
          @grammar.symboltable.delete x
        else
          x.each_rule do |r|
            r.target = target
            @grammar.add r
          end
        end
        flush_delayed
      end

      def _delayed_add(rule)
        @delayed.push rule
      end

      def _added?(sym)
        @grammar.added?(sym) or @delayed.detect {|r| r.target == sym }
      end

      def flush_delayed
        return if @delayed.empty?
        @delayed.each do |rule|
          @grammar.add rule
        end
        @delayed.clear
      end

      def seq(*list, &block)
        Rule.new(nil, list.map {|x| _intern(x) }, UserAction.proc(block))
      end

      def null(&block)
        seq(&block)
      end

      def action(&block)
        id = "@#{@seqs["action"] += 1}".intern
        _delayed_add Rule.new(@grammar.intern(id), [], UserAction.proc(block))
        id
      end

      alias _ action

      def option(sym, default = nil, &block)
        _defmetasyntax("option", _intern(sym), block) {|target|
          seq() { default } | seq(sym)
        }
      end

      def many(sym, &block)
        _defmetasyntax("many", _intern(sym), block) {|target|
            seq() { [] }\
          | seq(target, sym) {|list, x| list.push x; list }
        }
      end

      def many1(sym, &block)
        _defmetasyntax("many1", _intern(sym), block) {|target|
            seq(sym) {|x| [x] }\
          | seq(target, sym) {|list, x| list.push x; list }
        }
      end

      def separated_by(sep, sym, &block)
        option(separated_by1(sep, sym), [], &block)
      end

      def separated_by1(sep, sym, &block)
        _defmetasyntax("separated_by1", _intern(sym), block) {|target|
            seq(sym) {|x| [x] }\
          | seq(target, sep, sym) {|list, _, x| list.push x; list }
        }
      end

      def _intern(x)
        case x
        when Symbol, String
          @grammar.intern(x)
        when Racc::Sym
          x
        else
          raise TypeError, "wrong type #{x.class} (expected Symbol/String/Racc::Sym)"
        end
      end

      private

      def _defmetasyntax(type, id, action, &block)
        if action
          idbase = "#{type}@#{id}-#{@seqs[type] += 1}"
          target = _wrap(idbase, "#{idbase}-core", action)
          _register("#{idbase}-core", &block)
        else
          target = _register("#{type}@#{id}", &block)
        end
        @grammar.intern(target)
      end

      def _register(target_name)
        target = target_name.intern
        unless _added?(@grammar.intern(target))
          yield(target).each_rule do |rule|
            rule.target = @grammar.intern(target)
            _delayed_add rule
          end
        end
        target
      end

      def _wrap(target_name, sym, block)
        target = target_name.intern
        _delayed_add Rule.new(@grammar.intern(target),
                              [@grammar.intern(sym.intern)],
                              UserAction.proc(block))
        target
      end
    end

    class PrecedenceDefinitionEnv
      def initialize(g)
        @grammar = g
        @prechigh_seen = false
        @preclow_seen = false
        @reverse = false
      end

      attr_reader :reverse

      def higher
        if @prechigh_seen
          raise CompileError, "prechigh used twice"
        end
        @prechigh_seen = true
      end

      def lower
        if @preclow_seen
          raise CompileError, "preclow used twice"
        end
        if @prechigh_seen
          @reverse = true
        end
        @preclow_seen = true
      end

      def left(*syms)
        @grammar.declare_precedence :Left, syms.map {|s| @grammar.intern(s) }
      end

      def right(*syms)
        @grammar.declare_precedence :Right, syms.map {|s| @grammar.intern(s) }
      end

      def nonassoc(*syms)
        @grammar.declare_precedence :Nonassoc, syms.map {|s| @grammar.intern(s)}
      end
    end

    #
    # Computation
    #

    def init
      return if @closed
      @closed = true
      @start ||= @rules.map {|r| r.target }.detect {|sym| not sym.dummy? }
      raise CompileError, 'no rule in input' if @rules.empty?
      add_start_rule
      @rules.freeze
      fix_ident
      compute_hash
      compute_heads
      determine_terminals
      compute_nullable_0
      @symboltable.fix
      compute_locate
      @symboltable.each_nonterminal {|t| compute_expand t }
      compute_nullable
      compute_useless
    end

    private

    def add_start_rule
      r = Rule.new(@symboltable.dummy,
                   [@start, @symboltable.anchor, @symboltable.anchor],
                   UserAction.empty)
      r.ident = 0
      r.hash = 0
      r.precedence = nil
      @rules.unshift r
    end

    # Rule#ident
    # LocationPointer#ident
    def fix_ident
      @rules.each_with_index do |rule, idx|
        rule.ident = idx
      end
    end

    # Rule#hash
    def compute_hash
      hash = 4   # size of dummy rule
      @rules.each do |rule|
        rule.hash = hash
        hash += (rule.size + 1)
      end
    end

    # Sym#heads
    def compute_heads
      @rules.each do |rule|
        rule.target.heads.push rule.ptrs[0]
      end
    end

    # Sym#terminal?
    def determine_terminals
      @symboltable.each do |s|
        s.term = s.heads.empty?
      end
    end

    # Sym#self_null?
    def compute_nullable_0
      @symboltable.each do |s|
        if s.terminal?
          s.snull = false
        else
          s.snull = s.heads.any? {|loc| loc.reduce? }
        end
      end
    end

    # Sym#locate
    def compute_locate
      @rules.each do |rule|
        t = nil
        rule.ptrs.each do |ptr|
          unless ptr.reduce?
            tok = ptr.dereference
            tok.locate.push ptr
            t = tok if tok.terminal?
          end
        end
        rule.precedence = t
      end
    end

    # Sym#expand
    def compute_expand(t)
      puts "expand> #{t.to_s}" if @debug_symbol
      t.expand = _compute_expand(t, ISet.new, [])
      puts "expand< #{t.to_s}: #{t.expand.to_s}" if @debug_symbol
    end

    def _compute_expand(t, set, lock)
      if tmp = t.expand
        set.update tmp
        return set
      end
      tok = nil
      set.update_a t.heads
      t.heads.each do |ptr|
        tok = ptr.dereference
        if tok and tok.nonterminal?
          unless lock[tok.ident]
            lock[tok.ident] = true
            _compute_expand tok, set, lock
          end
        end
      end
      set
    end

    # Sym#nullable?, Rule#nullable?
    def compute_nullable
      @rules.each       {|r| r.null = false }
      @symboltable.each {|t| t.null = false }
      r = @rules.dup
      s = @symboltable.nonterminals
      begin
        rs = r.size
        ss = s.size
        check_rules_nullable r
        check_symbols_nullable s
      end until rs == r.size and ss == s.size
    end

    def check_rules_nullable(rules)
      rules.delete_if do |rule|
        rule.null = true
        rule.symbols.each do |t|
          unless t.nullable?
            rule.null = false
            break
          end
        end
        rule.nullable?
      end
    end

    def check_symbols_nullable(symbols)
      symbols.delete_if do |sym|
        sym.heads.each do |ptr|
          if ptr.rule.nullable?
            sym.null = true
            break
          end
        end
        sym.nullable?
      end
    end

    # Sym#useless?, Rule#useless?
    # FIXME: what means "useless"?
    def compute_useless
      @symboltable.each_terminal {|sym| sym.useless = false }
      @symboltable.each_nonterminal {|sym| sym.useless = true }
      @rules.each {|rule| rule.useless = true }
      r = @rules.dup
      s = @symboltable.nonterminals
      begin
        rs = r.size
        ss = s.size
        check_rules_useless r
        check_symbols_useless s
      end until r.size == rs and s.size == ss
    end

    def check_rules_useless(rules)
      rules.delete_if do |rule|
        rule.useless = false
        rule.symbols.each do |sym|
          if sym.useless?
            rule.useless = true
            break
          end
        end
        not rule.useless?
      end
    end

    def check_symbols_useless(s)
      s.delete_if do |t|
        t.heads.each do |ptr|
          unless ptr.rule.useless?
            t.useless = false
            break
          end
        end
        not t.useless?
      end
    end

  end   # class Grammar


  class Rule

    def initialize(target, syms, act)
      @target = target
      @symbols = syms
      @action = act
      @alternatives = []

      @ident = nil
      @hash = nil
      @ptrs = nil
      @precedence = nil
      @specified_prec = nil
      @null = nil
      @useless = nil
    end

    attr_accessor :target
    attr_reader :symbols
    attr_reader :action

    def |(x)
      @alternatives.push x.rule
      self
    end

    def rule
      self
    end

    def each_rule(&block)
      yield self
      @alternatives.each(&block)
    end

    attr_accessor :ident

    attr_reader :hash
    attr_reader :ptrs

    def hash=(n)
      @hash = n
      ptrs = []
      @symbols.each_with_index do |sym, idx|
        ptrs.push LocationPointer.new(self, idx, sym)
      end
      ptrs.push LocationPointer.new(self, @symbols.size, nil)
      @ptrs = ptrs
    end

    def precedence
      @specified_prec || @precedence
    end

    def precedence=(sym)
      @precedence ||= sym
    end

    def prec(sym, &block)
      @specified_prec = sym
      if block
        unless @action.empty?
          raise CompileError, 'both of rule action block and prec block given'
        end
        @action = UserAction.proc(block)
      end
      self
    end

    attr_accessor :specified_prec

    def nullable?() @null end
    def null=(n)    @null = n end

    def useless?()  @useless end
    def useless=(u) @useless = u end

    def inspect
      "#<Racc::Rule id=#{@ident} (#{@target})>"
    end

    def ==(other)
      other.kind_of?(Rule) and @ident == other.ident
    end

    def [](idx)
      @symbols[idx]
    end

    def size
      @symbols.size
    end

    def empty?
      @symbols.empty?
    end

    def to_s
      "#<rule#{@ident}>"
    end

    def accept?
      if tok = @symbols[-1]
        tok.anchor?
      else
        false
      end
    end

    def each(&block)
      @symbols.each(&block)
    end

    def replace(src, dest)
      @target = dest
      @symbols = @symbols.map {|s| s == src ? dest : s }
    end

  end   # class Rule


  class UserAction

    def UserAction.source_text(src)
      new(src, nil)
    end

    def UserAction.proc(pr = nil, &block)
      if pr and block
        raise ArgumentError, "both of argument and block given"
      end
      new(nil, pr || block)
    end

    def UserAction.empty
      new(nil, nil)
    end

    private_class_method :new

    def initialize(src, proc)
      @source = src
      @proc = proc
    end

    attr_reader :source
    attr_reader :proc

    def source?
      not @proc
    end

    def proc?
      not @source
    end

    def empty?
      not @proc and not @source
    end

    def name
      "{action type=#{@source || @proc || 'nil'}}"
    end

    alias inspect name

  end


  class OrMark
    def initialize(lineno)
      @lineno = lineno
    end

    def name
      '|'
    end

    alias inspect name

    attr_reader :lineno
  end


  class Prec
    def initialize(symbol, lineno)
      @symbol = symbol
      @lineno = lineno
    end

    def name
      "=#{@symbol}"
    end

    alias inspect name

    attr_reader :symbol
    attr_reader :lineno
  end


  #
  # A set of rule and position in it's RHS.
  # Note that the number of pointers is more than rule's RHS array,
  # because pointer points right edge of the final symbol when reducing.
  #
  class LocationPointer

    def initialize(rule, i, sym)
      @rule   = rule
      @index  = i
      @symbol = sym
      @ident  = @rule.hash + i
      @reduce = sym.nil?
    end

    attr_reader :rule
    attr_reader :index
    attr_reader :symbol

    alias dereference symbol

    attr_reader :ident
    alias hash ident
    attr_reader :reduce
    alias reduce? reduce

    def to_s
      sprintf('(%d,%d %s)',
              @rule.ident, @index, (reduce?() ? '#' : @symbol.to_s))
    end

    alias inspect to_s

    def eql?(ot)
      @hash == ot.hash
    end

    alias == eql?

    def head?
      @index == 0
    end

    def next
      @rule.ptrs[@index + 1] or ptr_bug!
    end

    alias increment next

    def before(len)
      @rule.ptrs[@index - len] or ptr_bug!
    end

    private

    def ptr_bug!
      raise "racc: fatal: pointer not exist: self: #{to_s}"
    end

  end   # class LocationPointer


  class SymbolTable

    include Enumerable

    def initialize
      @symbols = []   # :: [Racc::Sym]
      @cache   = {}   # :: {(String|Symbol) => Racc::Sym}
      @dummy  = intern(:$start, true)
      @anchor = intern(false, true)     # Symbol ID = 0
      @error  = intern(:error, false)   # Symbol ID = 1
    end

    attr_reader :dummy
    attr_reader :anchor
    attr_reader :error

    def [](id)
      @symbols[id]
    end

    def intern(val, dummy = false)
      @cache[val] ||=
          begin
            sym = Sym.new(val, dummy)
            @symbols.push sym
            sym
          end
    end

    attr_reader :symbols
    alias to_a symbols

    def delete(sym)
      @symbols.delete sym
      @cache.delete sym.value
    end

    attr_reader :nt_base

    def nt_max
      @symbols.size
    end

    def each(&block)
      @symbols.each(&block)
    end

    def terminals(&block)
      @symbols[0, @nt_base]
    end

    def each_terminal(&block)
      @terms.each(&block)
    end

    def nonterminals
      @symbols[@nt_base, @symbols.size - @nt_base]
    end

    def each_nonterminal(&block)
      @nterms.each(&block)
    end

    def fix
      terms, nterms = @symbols.partition {|s| s.terminal? }
      @symbols = terms + nterms
      @terms = terms
      @nterms = nterms
      @nt_base = terms.size
      fix_ident
      check_terminals
    end

    private

    def fix_ident
      @symbols.each_with_index do |t, i|
        t.ident = i
      end
    end

    def check_terminals
      return unless @symbols.any? {|s| s.should_terminal? }
      @anchor.should_terminal
      @error.should_terminal
      each_terminal do |t|
        t.should_terminal if t.string_symbol?
      end
      each do |s|
        s.should_terminal if s.assoc
      end
      terminals().reject {|t| t.should_terminal? }.each do |t|
        raise CompileError, "terminal #{t} not declared as terminal"
      end
      nonterminals().select {|n| n.should_terminal? }.each do |n|
        raise CompileError, "symbol #{n} declared as terminal but is not terminal"
      end
    end

  end   # class SymbolTable


  # Stands terminal and nonterminal symbols.
  class Sym

    def initialize(value, dummyp)
      @ident = nil
      @value = value
      @dummyp = dummyp

      @term  = nil
      @nterm = nil
      @should_terminal = false
      @precedence = nil
      case value
      when Symbol
        @to_s = value.to_s
        @serialized = value.inspect
        @string = false
      when String
        @to_s = value.inspect
        @serialized = value.dump
        @string = true
      when false
        @to_s = '$end'
        @serialized = 'false'
        @string = false
      when ErrorSymbolValue
        @to_s = 'error'
        @serialized = 'Object.new'
        @string = false
      else
        raise ArgumentError, "unknown symbol value: #{value.class}"
      end

      @heads    = []
      @locate   = []
      @snull    = nil
      @null     = nil
      @expand   = nil
      @useless  = nil
    end

    class << self
      def once_writer(nm)
        nm = nm.id2name
        module_eval(<<-EOS)
          def #{nm}=(v)
            raise 'racc: fatal: @#{nm} != nil' unless @#{nm}.nil?
            @#{nm} = v
          end
        EOS
      end
    end

    once_writer :ident
    attr_reader :ident

    alias hash ident

    attr_reader :value

    def dummy?
      @dummyp
    end

    def terminal?
      @term
    end

    def nonterminal?
      @nterm
    end

    def term=(t)
      raise 'racc: fatal: term= called twice' unless @term.nil?
      @term = t
      @nterm = !t
    end

    def should_terminal
      @should_terminal = true
    end

    def should_terminal?
      @should_terminal
    end

    def string_symbol?
      @string
    end

    def serialize
      @serialized
    end

    attr_writer :serialized

    attr_accessor :precedence
    attr_accessor :assoc

    def to_s
      @to_s.dup
    end

    alias inspect to_s

    def |(x)
      rule() | x.rule
    end

    def rule
      Rule.new(nil, [self], UserAction.empty)
    end

    #
    # cache
    #

    attr_reader :heads
    attr_reader :locate

    def self_null?
      @snull
    end

    once_writer :snull

    def nullable?
      @null
    end

    def null=(n)
      @null = n
    end

    attr_reader :expand
    once_writer :expand

    def useless?
      @useless
    end

    def useless=(f)
      @useless = f
    end

  end   # class Sym

end   # module Racc
PK#}$["�Qk�G�Gruby/racc/parser-text.rbnu�[���module Racc
  PARSER_TEXT = <<'__end_of_file__'
# frozen_string_literal: false
#--
# Copyright (c) 1999-2006 Minero Aoki
#
# This program is free software.
# You can distribute/modify this program under the same terms of ruby.
#
# As a special exception, when this code is copied by Racc
# into a Racc output file, you may use that output file
# without restriction.
#++

require 'racc/info'

unless defined?(NotImplementedError)
  NotImplementedError = NotImplementError # :nodoc:
end

module Racc
  class ParseError < StandardError; end
end
unless defined?(::ParseError)
  ParseError = Racc::ParseError
end

# Racc is a LALR(1) parser generator.
# It is written in Ruby itself, and generates Ruby programs.
#
# == Command-line Reference
#
#     racc [-o<var>filename</var>] [--output-file=<var>filename</var>]
#          [-e<var>rubypath</var>] [--executable=<var>rubypath</var>]
#          [-v] [--verbose]
#          [-O<var>filename</var>] [--log-file=<var>filename</var>]
#          [-g] [--debug]
#          [-E] [--embedded]
#          [-l] [--no-line-convert]
#          [-c] [--line-convert-all]
#          [-a] [--no-omit-actions]
#          [-C] [--check-only]
#          [-S] [--output-status]
#          [--version] [--copyright] [--help] <var>grammarfile</var>
#
# [+grammarfile+]
#   Racc grammar file. Any extension is permitted.
# [-o+outfile+, --output-file=+outfile+]
#   A filename for output. default is <+filename+>.tab.rb
# [-O+filename+, --log-file=+filename+]
#   Place logging output in file +filename+.
#   Default log file name is <+filename+>.output.
# [-e+rubypath+, --executable=+rubypath+]
#   output executable file(mode 755). where +path+ is the Ruby interpreter.
# [-v, --verbose]
#   verbose mode. create +filename+.output file, like yacc's y.output file.
# [-g, --debug]
#   add debug code to parser class. To display debuggin information,
#   use this '-g' option and set @yydebug true in parser class.
# [-E, --embedded]
#   Output parser which doesn't need runtime files (racc/parser.rb).
# [-C, --check-only]
#   Check syntax of racc grammar file and quit.
# [-S, --output-status]
#   Print messages time to time while compiling.
# [-l, --no-line-convert]
#   turns off line number converting.
# [-c, --line-convert-all]
#   Convert line number of actions, inner, header and footer.
# [-a, --no-omit-actions]
#   Call all actions, even if an action is empty.
# [--version]
#   print Racc version and quit.
# [--copyright]
#   Print copyright and quit.
# [--help]
#   Print usage and quit.
#
# == Generating Parser Using Racc
#
# To compile Racc grammar file, simply type:
#
#   $ racc parse.y
#
# This creates Ruby script file "parse.tab.y". The -o option can change the output filename.
#
# == Writing A Racc Grammar File
#
# If you want your own parser, you have to write a grammar file.
# A grammar file contains the name of your parser class, grammar for the parser,
# user code, and anything else.
# When writing a grammar file, yacc's knowledge is helpful.
# If you have not used yacc before, Racc is not too difficult.
#
# Here's an example Racc grammar file.
#
#   class Calcparser
#   rule
#     target: exp { print val[0] }
#
#     exp: exp '+' exp
#        | exp '*' exp
#        | '(' exp ')'
#        | NUMBER
#   end
#
# Racc grammar files resemble yacc files.
# But (of course), this is Ruby code.
# yacc's $$ is the 'result', $0, $1... is
# an array called 'val', and $-1, $-2... is an array called '_values'.
#
# See the {Grammar File Reference}[rdoc-ref:lib/racc/rdoc/grammar.en.rdoc] for
# more information on grammar files.
#
# == Parser
#
# Then you must prepare the parse entry method. There are two types of
# parse methods in Racc, Racc::Parser#do_parse and Racc::Parser#yyparse
#
# Racc::Parser#do_parse is simple.
#
# It's yyparse() of yacc, and Racc::Parser#next_token is yylex().
# This method must returns an array like [TOKENSYMBOL, ITS_VALUE].
# EOF is [false, false].
# (TOKENSYMBOL is a Ruby symbol (taken from String#intern) by default.
# If you want to change this, see the grammar reference.
#
# Racc::Parser#yyparse is little complicated, but useful.
# It does not use Racc::Parser#next_token, instead it gets tokens from any iterator.
#
# For example, <code>yyparse(obj, :scan)</code> causes
# calling +obj#scan+, and you can return tokens by yielding them from +obj#scan+.
#
# == Debugging
#
# When debugging, "-v" or/and the "-g" option is helpful.
#
# "-v" creates verbose log file (.output).
# "-g" creates a "Verbose Parser".
# Verbose Parser prints the internal status when parsing.
# But it's _not_ automatic.
# You must use -g option and set +@yydebug+ to +true+ in order to get output.
# -g option only creates the verbose parser.
#
# === Racc reported syntax error.
#
# Isn't there too many "end"?
# grammar of racc file is changed in v0.10.
#
# Racc does not use '%' mark, while yacc uses huge number of '%' marks..
#
# === Racc reported "XXXX conflicts".
#
# Try "racc -v xxxx.y".
# It causes producing racc's internal log file, xxxx.output.
#
# === Generated parsers does not work correctly
#
# Try "racc -g xxxx.y".
# This command let racc generate "debugging parser".
# Then set @yydebug=true in your parser.
# It produces a working log of your parser.
#
# == Re-distributing Racc runtime
#
# A parser, which is created by Racc, requires the Racc runtime module;
# racc/parser.rb.
#
# Ruby 1.8.x comes with Racc runtime module,
# you need NOT distribute Racc runtime files.
#
# If you want to include the Racc runtime module with your parser.
# This can be done by using '-E' option:
#
#   $ racc -E -omyparser.rb myparser.y
#
# This command creates myparser.rb which `includes' Racc runtime.
# Only you must do is to distribute your parser file (myparser.rb).
#
# Note: parser.rb is ruby license, but your parser is not.
# Your own parser is completely yours.
module Racc

  unless defined?(Racc_No_Extensions)
    Racc_No_Extensions = false # :nodoc:
  end

  class Parser

    Racc_Runtime_Version = ::Racc::VERSION
    Racc_Runtime_Core_Version_R = ::Racc::VERSION

    begin
      if Object.const_defined?(:RUBY_ENGINE) and RUBY_ENGINE == 'jruby'
        require 'jruby'
        require 'racc/cparse-jruby.jar'
        com.headius.racc.Cparse.new.load(JRuby.runtime, false)
      else
        require 'racc/cparse'
      end

      unless new.respond_to?(:_racc_do_parse_c, true)
        raise LoadError, 'old cparse.so'
      end
      if Racc_No_Extensions
        raise LoadError, 'selecting ruby version of racc runtime core'
      end

      Racc_Main_Parsing_Routine    = :_racc_do_parse_c # :nodoc:
      Racc_YY_Parse_Method         = :_racc_yyparse_c # :nodoc:
      Racc_Runtime_Core_Version    = Racc_Runtime_Core_Version_C # :nodoc:
      Racc_Runtime_Type            = 'c' # :nodoc:
    rescue LoadError
      Racc_Main_Parsing_Routine    = :_racc_do_parse_rb
      Racc_YY_Parse_Method         = :_racc_yyparse_rb
      Racc_Runtime_Core_Version    = Racc_Runtime_Core_Version_R
      Racc_Runtime_Type            = 'ruby'
    end

    def Parser.racc_runtime_type # :nodoc:
      Racc_Runtime_Type
    end

    def _racc_setup
      @yydebug = false unless self.class::Racc_debug_parser
      @yydebug = false unless defined?(@yydebug)
      if @yydebug
        @racc_debug_out = $stderr unless defined?(@racc_debug_out)
        @racc_debug_out ||= $stderr
      end
      arg = self.class::Racc_arg
      arg[13] = true if arg.size < 14
      arg
    end

    def _racc_init_sysvars
      @racc_state  = [0]
      @racc_tstack = []
      @racc_vstack = []

      @racc_t = nil
      @racc_val = nil

      @racc_read_next = true

      @racc_user_yyerror = false
      @racc_error_status = 0
    end

    # The entry point of the parser. This method is used with #next_token.
    # If Racc wants to get token (and its value), calls next_token.
    #
    # Example:
    #     def parse
    #       @q = [[1,1],
    #             [2,2],
    #             [3,3],
    #             [false, '$']]
    #       do_parse
    #     end
    #
    #     def next_token
    #       @q.shift
    #     end
    class_eval %{
    def do_parse
      #{Racc_Main_Parsing_Routine}(_racc_setup(), false)
    end
    }

    # The method to fetch next token.
    # If you use #do_parse method, you must implement #next_token.
    #
    # The format of return value is [TOKEN_SYMBOL, VALUE].
    # +token-symbol+ is represented by Ruby's symbol by default, e.g. :IDENT
    # for 'IDENT'.  ";" (String) for ';'.
    #
    # The final symbol (End of file) must be false.
    def next_token
      raise NotImplementedError, "#{self.class}\#next_token is not defined"
    end

    def _racc_do_parse_rb(arg, in_debug)
      action_table, action_check, action_default, action_pointer,
      _,            _,            _,              _,
      _,            _,            token_table,    * = arg

      _racc_init_sysvars
      tok = act = i = nil

      catch(:racc_end_parse) {
        while true
          if i = action_pointer[@racc_state[-1]]
            if @racc_read_next
              if @racc_t != 0   # not EOF
                tok, @racc_val = next_token()
                unless tok      # EOF
                  @racc_t = 0
                else
                  @racc_t = (token_table[tok] or 1)   # error token
                end
                racc_read_token(@racc_t, tok, @racc_val) if @yydebug
                @racc_read_next = false
              end
            end
            i += @racc_t
            unless i >= 0 and
                   act = action_table[i] and
                   action_check[i] == @racc_state[-1]
              act = action_default[@racc_state[-1]]
            end
          else
            act = action_default[@racc_state[-1]]
          end
          while act = _racc_evalact(act, arg)
            ;
          end
        end
      }
    end

    # Another entry point for the parser.
    # If you use this method, you must implement RECEIVER#METHOD_ID method.
    #
    # RECEIVER#METHOD_ID is a method to get next token.
    # It must 'yield' the token, which format is [TOKEN-SYMBOL, VALUE].
    class_eval %{
    def yyparse(recv, mid)
      #{Racc_YY_Parse_Method}(recv, mid, _racc_setup(), false)
    end
    }

    def _racc_yyparse_rb(recv, mid, arg, c_debug)
      action_table, action_check, action_default, action_pointer,
      _,            _,            _,              _,
      _,            _,            token_table,    * = arg

      _racc_init_sysvars

      catch(:racc_end_parse) {
        until i = action_pointer[@racc_state[-1]]
          while act = _racc_evalact(action_default[@racc_state[-1]], arg)
            ;
          end
        end
        recv.__send__(mid) do |tok, val|
          unless tok
            @racc_t = 0
          else
            @racc_t = (token_table[tok] or 1)   # error token
          end
          @racc_val = val
          @racc_read_next = false

          i += @racc_t
          unless i >= 0 and
                 act = action_table[i] and
                 action_check[i] == @racc_state[-1]
            act = action_default[@racc_state[-1]]
          end
          while act = _racc_evalact(act, arg)
            ;
          end

          while !(i = action_pointer[@racc_state[-1]]) ||
                ! @racc_read_next ||
                @racc_t == 0  # $
            unless i and i += @racc_t and
                   i >= 0 and
                   act = action_table[i] and
                   action_check[i] == @racc_state[-1]
              act = action_default[@racc_state[-1]]
            end
            while act = _racc_evalact(act, arg)
              ;
            end
          end
        end
      }
    end

    ###
    ### common
    ###

    def _racc_evalact(act, arg)
      action_table, action_check, _, action_pointer,
      _,            _,            _, _,
      _,            _,            _, shift_n,
      reduce_n,     * = arg
      nerr = 0   # tmp

      if act > 0 and act < shift_n
        #
        # shift
        #
        if @racc_error_status > 0
          @racc_error_status -= 1 unless @racc_t <= 1 # error token or EOF
        end
        @racc_vstack.push @racc_val
        @racc_state.push act
        @racc_read_next = true
        if @yydebug
          @racc_tstack.push @racc_t
          racc_shift @racc_t, @racc_tstack, @racc_vstack
        end

      elsif act < 0 and act > -reduce_n
        #
        # reduce
        #
        code = catch(:racc_jump) {
          @racc_state.push _racc_do_reduce(arg, act)
          false
        }
        if code
          case code
          when 1 # yyerror
            @racc_user_yyerror = true   # user_yyerror
            return -reduce_n
          when 2 # yyaccept
            return shift_n
          else
            raise '[Racc Bug] unknown jump code'
          end
        end

      elsif act == shift_n
        #
        # accept
        #
        racc_accept if @yydebug
        throw :racc_end_parse, @racc_vstack[0]

      elsif act == -reduce_n
        #
        # error
        #
        case @racc_error_status
        when 0
          unless arg[21]    # user_yyerror
            nerr += 1
            on_error @racc_t, @racc_val, @racc_vstack
          end
        when 3
          if @racc_t == 0   # is $
            # We're at EOF, and another error occurred immediately after
            # attempting auto-recovery
            throw :racc_end_parse, nil
          end
          @racc_read_next = true
        end
        @racc_user_yyerror = false
        @racc_error_status = 3
        while true
          if i = action_pointer[@racc_state[-1]]
            i += 1   # error token
            if  i >= 0 and
                (act = action_table[i]) and
                action_check[i] == @racc_state[-1]
              break
            end
          end
          throw :racc_end_parse, nil if @racc_state.size <= 1
          @racc_state.pop
          @racc_vstack.pop
          if @yydebug
            @racc_tstack.pop
            racc_e_pop @racc_state, @racc_tstack, @racc_vstack
          end
        end
        return act

      else
        raise "[Racc Bug] unknown action #{act.inspect}"
      end

      racc_next_state(@racc_state[-1], @racc_state) if @yydebug

      nil
    end

    def _racc_do_reduce(arg, act)
      _,          _,            _,            _,
      goto_table, goto_check,   goto_default, goto_pointer,
      nt_base,    reduce_table, _,            _,
      _,          use_result,   * = arg

      state = @racc_state
      vstack = @racc_vstack
      tstack = @racc_tstack

      i = act * -3
      len       = reduce_table[i]
      reduce_to = reduce_table[i+1]
      method_id = reduce_table[i+2]
      void_array = []

      tmp_t = tstack[-len, len] if @yydebug
      tmp_v = vstack[-len, len]
      tstack[-len, len] = void_array if @yydebug
      vstack[-len, len] = void_array
      state[-len, len]  = void_array

      # tstack must be updated AFTER method call
      if use_result
        vstack.push __send__(method_id, tmp_v, vstack, tmp_v[0])
      else
        vstack.push __send__(method_id, tmp_v, vstack)
      end
      tstack.push reduce_to

      racc_reduce(tmp_t, reduce_to, tstack, vstack) if @yydebug

      k1 = reduce_to - nt_base
      if i = goto_pointer[k1]
        i += state[-1]
        if i >= 0 and (curstate = goto_table[i]) and goto_check[i] == k1
          return curstate
        end
      end
      goto_default[k1]
    end

    # This method is called when a parse error is found.
    #
    # ERROR_TOKEN_ID is an internal ID of token which caused error.
    # You can get string representation of this ID by calling
    # #token_to_str.
    #
    # ERROR_VALUE is a value of error token.
    #
    # value_stack is a stack of symbol values.
    # DO NOT MODIFY this object.
    #
    # This method raises ParseError by default.
    #
    # If this method returns, parsers enter "error recovering mode".
    def on_error(t, val, vstack)
      raise ParseError, sprintf("\nparse error on value %s (%s)",
                                val.inspect, token_to_str(t) || '?')
    end

    # Enter error recovering mode.
    # This method does not call #on_error.
    def yyerror
      throw :racc_jump, 1
    end

    # Exit parser.
    # Return value is +Symbol_Value_Stack[0]+.
    def yyaccept
      throw :racc_jump, 2
    end

    # Leave error recovering mode.
    def yyerrok
      @racc_error_status = 0
    end

    # For debugging output
    def racc_read_token(t, tok, val)
      @racc_debug_out.print 'read    '
      @racc_debug_out.print tok.inspect, '(', racc_token2str(t), ') '
      @racc_debug_out.puts val.inspect
      @racc_debug_out.puts
    end

    def racc_shift(tok, tstack, vstack)
      @racc_debug_out.puts "shift   #{racc_token2str tok}"
      racc_print_stacks tstack, vstack
      @racc_debug_out.puts
    end

    def racc_reduce(toks, sim, tstack, vstack)
      out = @racc_debug_out
      out.print 'reduce '
      if toks.empty?
        out.print ' <none>'
      else
        toks.each {|t| out.print ' ', racc_token2str(t) }
      end
      out.puts " --> #{racc_token2str(sim)}"
      racc_print_stacks tstack, vstack
      @racc_debug_out.puts
    end

    def racc_accept
      @racc_debug_out.puts 'accept'
      @racc_debug_out.puts
    end

    def racc_e_pop(state, tstack, vstack)
      @racc_debug_out.puts 'error recovering mode: pop token'
      racc_print_states state
      racc_print_stacks tstack, vstack
      @racc_debug_out.puts
    end

    def racc_next_state(curstate, state)
      @racc_debug_out.puts  "goto    #{curstate}"
      racc_print_states state
      @racc_debug_out.puts
    end

    def racc_print_stacks(t, v)
      out = @racc_debug_out
      out.print '        ['
      t.each_index do |i|
        out.print ' (', racc_token2str(t[i]), ' ', v[i].inspect, ')'
      end
      out.puts ' ]'
    end

    def racc_print_states(s)
      out = @racc_debug_out
      out.print '        ['
      s.each {|st| out.print ' ', st }
      out.puts ' ]'
    end

    def racc_token2str(tok)
      self.class::Racc_token_to_s_table[tok] or
          raise "[Racc Bug] can't convert token #{tok} to string"
    end

    # Convert internal ID of token symbol to the string.
    def token_to_str(t)
      self.class::Racc_token_to_s_table[t]
    end

  end

end

__end_of_file__
end
PK#}$[��#�9O9Oruby/racc/state.rbnu�[���#--
#
#
#
# Copyright (c) 1999-2006 Minero Aoki
#
# This program is free software.
# You can distribute/modify this program under the same terms of ruby.
# see the file "COPYING".
#
#++

require 'racc/iset'
require 'racc/statetransitiontable'
require 'racc/exception'
require 'forwardable'

module Racc

  # A table of LALR states.
  class States

    include Enumerable

    def initialize(grammar, debug_flags = DebugFlags.new)
      @grammar = grammar
      @symboltable = grammar.symboltable
      @d_state = debug_flags.state
      @d_la    = debug_flags.la
      @d_prec  = debug_flags.prec
      @states = []
      @statecache = {}
      @actions = ActionTable.new(@grammar, self)
      @nfa_computed = false
      @dfa_computed = false
    end

    attr_reader :grammar
    attr_reader :actions

    def size
      @states.size
    end

    def inspect
      '#<state table>'
    end

    alias to_s inspect

    def [](i)
      @states[i]
    end

    def each_state(&block)
      @states.each(&block)
    end

    alias each each_state

    def each_index(&block)
      @states.each_index(&block)
    end

    extend Forwardable

    def_delegator "@actions", :shift_n
    def_delegator "@actions", :reduce_n
    def_delegator "@actions", :nt_base

    def should_report_srconflict?
      srconflict_exist? and
          (n_srconflicts() != @grammar.n_expected_srconflicts)
    end

    def srconflict_exist?
      n_srconflicts() != 0
    end

    def n_srconflicts
      @n_srconflicts ||= inject(0) {|sum, st| sum + st.n_srconflicts }
    end

    def rrconflict_exist?
      n_rrconflicts() != 0
    end

    def n_rrconflicts
      @n_rrconflicts ||= inject(0) {|sum, st| sum + st.n_rrconflicts }
    end

    def state_transition_table
      @state_transition_table ||= StateTransitionTable.generate(self.dfa)
    end

    #
    # NFA (Non-deterministic Finite Automaton) Computation
    #

    public

    def nfa
      return self if @nfa_computed
      compute_nfa
      @nfa_computed = true
      self
    end

    private

    def compute_nfa
      @grammar.init
      # add state 0
      core_to_state  [ @grammar[0].ptrs[0] ]
      # generate LALR states
      cur = 0
      @gotos = []
      while cur < @states.size
        generate_states @states[cur]   # state is added here
        cur += 1
      end
      @actions.init
    end

    def generate_states(state)
      puts "dstate: #{state}" if @d_state

      table = {}
      state.closure.each do |ptr|
        if sym = ptr.dereference
          addsym table, sym, ptr.next
        end
      end
      table.each do |sym, core|
        puts "dstate: sym=#{sym} ncore=#{core}" if @d_state

        dest = core_to_state(core.to_a)
        state.goto_table[sym] = dest
        id = sym.nonterminal?() ? @gotos.size : nil
        g = Goto.new(id, sym, state, dest)
        @gotos.push g if sym.nonterminal?
        state.gotos[sym] = g
        puts "dstate: #{state.ident} --#{sym}--> #{dest.ident}" if @d_state

        # check infinite recursion
        if state.ident == dest.ident and state.closure.size == 1
          raise CompileError,
              sprintf("Infinite recursion: state %d, with rule %d",
                      state.ident, state.ptrs[0].rule.ident)
        end
      end
    end

    def addsym(table, sym, ptr)
      unless s = table[sym]
        table[sym] = s = ISet.new
      end
      s.add ptr
    end

    def core_to_state(core)
      #
      # convert CORE to a State object.
      # If matching state does not exist, create it and add to the table.
      #

      k = fingerprint(core)
      unless dest = @statecache[k]
        # not registered yet
        dest = State.new(@states.size, core)
        @states.push dest

        @statecache[k] = dest

        puts "core_to_state: create state   ID #{dest.ident}" if @d_state
      else
        if @d_state
          puts "core_to_state: dest is cached ID #{dest.ident}"
          puts "core_to_state: dest core #{dest.core.join(' ')}"
        end
      end

      dest
    end

    def fingerprint(arr)
      arr.map {|i| i.ident }.pack('L*')
    end

    #
    # DFA (Deterministic Finite Automaton) Generation
    #

    public

    def dfa
      return self if @dfa_computed
      nfa
      compute_dfa
      @dfa_computed = true
      self
    end

    private

    def compute_dfa
      la = lookahead()
      @states.each do |state|
        state.la = la
        resolve state
      end
      set_accept
      @states.each do |state|
        pack state
      end
      check_useless
    end

    def lookahead
      #
      # lookahead algorithm ver.3 -- from bison 1.26
      #

      gotos = @gotos
      if @d_la
        puts "\n--- goto ---"
        gotos.each_with_index {|g, i| print i, ' '; p g }
      end

      ### initialize_LA()
      ### set_goto_map()
      la_rules = []
      @states.each do |state|
        state.check_la la_rules
      end

      ### initialize_F()
      f     = create_tmap(gotos.size)
      reads = []
      edge  = []
      gotos.each do |goto|
        goto.to_state.goto_table.each do |t, st|
          if t.terminal?
            f[goto.ident] |= (1 << t.ident)
          elsif t.nullable?
            edge.push goto.to_state.gotos[t].ident
          end
        end
        if edge.empty?
          reads.push nil
        else
          reads.push edge
          edge = []
        end
      end
      digraph f, reads
      if @d_la
        puts "\n--- F1 (reads) ---"
        print_tab gotos, reads, f
      end

      ### build_relations()
      ### compute_FOLLOWS
      path = nil
      edge = []
      lookback = Array.new(la_rules.size, nil)
      includes = []
      gotos.each do |goto|
        goto.symbol.heads.each do |ptr|
          path = record_path(goto.from_state, ptr.rule)
          lastgoto = path.last
          st = lastgoto ? lastgoto.to_state : goto.from_state
          if st.conflict?
            addrel lookback, st.rruleid(ptr.rule), goto
          end
          path.reverse_each do |g|
            break if     g.symbol.terminal?
            edge.push    g.ident
            break unless g.symbol.nullable?
          end
        end
        if edge.empty?
          includes.push nil
        else
          includes.push edge
          edge = []
        end
      end
      includes = transpose(includes)
      digraph f, includes
      if @d_la
        puts "\n--- F2 (includes) ---"
        print_tab gotos, includes, f
      end

      ### compute_lookaheads
      la = create_tmap(la_rules.size)
      lookback.each_with_index do |arr, i|
        if arr
          arr.each do |g|
            la[i] |= f[g.ident]
          end
        end
      end
      if @d_la
        puts "\n--- LA (lookback) ---"
        print_tab la_rules, lookback, la
      end

      la
    end

    def create_tmap(size)
      Array.new(size, 0)   # use Integer as bitmap
    end

    def addrel(tbl, i, item)
      if a = tbl[i]
        a.push item
      else
        tbl[i] = [item]
      end
    end

    def record_path(begst, rule)
      st = begst
      path = []
      rule.symbols.each do |t|
        goto = st.gotos[t]
        path.push goto
        st = goto.to_state
      end
      path
    end

    def transpose(rel)
      new = Array.new(rel.size, nil)
      rel.each_with_index do |arr, idx|
        if arr
          arr.each do |i|
            addrel new, i, idx
          end
        end
      end
      new
    end

    def digraph(map, relation)
      n = relation.size
      index    = Array.new(n, nil)
      vertices = []
      @infinity = n + 2

      index.each_index do |i|
        if not index[i] and relation[i]
          traverse i, index, vertices, map, relation
        end
      end
    end

    def traverse(i, index, vertices, map, relation)
      vertices.push i
      index[i] = height = vertices.size

      if rp = relation[i]
        rp.each do |proci|
          unless index[proci]
            traverse proci, index, vertices, map, relation
          end
          if index[i] > index[proci]
            # circulative recursion !!!
            index[i] = index[proci]
          end
          map[i] |= map[proci]
        end
      end

      if index[i] == height
        while true
          proci = vertices.pop
          index[proci] = @infinity
          break if i == proci

          map[proci] |= map[i]
        end
      end
    end

    # for debug
    def print_atab(idx, tab)
      tab.each_with_index do |i,ii|
        printf '%-20s', idx[ii].inspect
        p i
      end
    end

    def print_tab(idx, rel, tab)
      tab.each_with_index do |bin,i|
        print i, ' ', idx[i].inspect, ' << '; p rel[i]
        print '  '
        each_t(@symboltable, bin) {|t| print ' ', t }
        puts
      end
    end

    # for debug
    def print_tab_i(idx, rel, tab, i)
      bin = tab[i]
      print i, ' ', idx[i].inspect, ' << '; p rel[i]
      print '  '
      each_t(@symboltable, bin) {|t| print ' ', t }
    end

    # for debug
    def printb(i)
      each_t(@symboltable, i) do |t|
        print t, ' '
      end
      puts
    end

    def each_t(tbl, set)
      0.upto( set.size ) do |i|
        (0..7).each do |ii|
          if set[idx = i * 8 + ii] == 1
            yield tbl[idx]
          end
        end
      end
    end

    #
    # resolve
    #

    def resolve(state)
      if state.conflict?
        resolve_rr state, state.ritems
        resolve_sr state, state.stokens
      else
        if state.rrules.empty?
          # shift
          state.stokens.each do |t|
            state.action[t] = @actions.shift(state.goto_table[t])
          end
        else
          # reduce
          state.defact = @actions.reduce(state.rrules[0])
        end
      end
    end

    def resolve_rr(state, r)
      r.each do |item|
        item.each_la(@symboltable) do |t|
          act = state.action[t]
          if act
            unless act.kind_of?(Reduce)
              raise "racc: fatal: #{act.class} in action table"
            end
            # Cannot resolve R/R conflict (on t).
            # Reduce with upper rule as default.
            state.rr_conflict act.rule, item.rule, t
          else
            # No conflict.
            state.action[t] = @actions.reduce(item.rule)
          end
        end
      end
    end

    def resolve_sr(state, s)
      s.each do |stok|
        goto = state.goto_table[stok]
        act = state.action[stok]

        unless act
          # no conflict
          state.action[stok] = @actions.shift(goto)
        else
          unless act.kind_of?(Reduce)
            puts 'DEBUG -------------------------------'
            p stok
            p act
            state.action.each do |k,v|
              print k.inspect, ' ', v.inspect, "\n"
            end
            raise "racc: fatal: #{act.class} in action table"
          end

          # conflict on stok

          rtok = act.rule.precedence
          case do_resolve_sr(stok, rtok)
          when :Reduce
            # action is already set

          when :Shift
            # overwrite
            act.decref
            state.action[stok] = @actions.shift(goto)

          when :Error
            act.decref
            state.action[stok] = @actions.error

          when :CantResolve
            # shift as default
            act.decref
            state.action[stok] = @actions.shift(goto)
            state.sr_conflict stok, act.rule
          end
        end
      end
    end

    ASSOC = {
      :Left     => :Reduce,
      :Right    => :Shift,
      :Nonassoc => :Error
    }

    def do_resolve_sr(stok, rtok)
      puts "resolve_sr: s/r conflict: rtok=#{rtok}, stok=#{stok}" if @d_prec

      unless rtok and rtok.precedence
        puts "resolve_sr: no prec for #{rtok}(R)" if @d_prec
        return :CantResolve
      end
      rprec = rtok.precedence

      unless stok and stok.precedence
        puts "resolve_sr: no prec for #{stok}(S)" if @d_prec
        return :CantResolve
      end
      sprec = stok.precedence

      ret = if rprec == sprec
              ASSOC[rtok.assoc] or
                  raise "racc: fatal: #{rtok}.assoc is not Left/Right/Nonassoc"
            else
              (rprec > sprec) ? (:Reduce) : (:Shift)
            end

      puts "resolve_sr: resolved as #{ret.id2name}" if @d_prec
      ret
    end

    #
    # complete
    #

    def set_accept
      anch = @symboltable.anchor
      init_state = @states[0].goto_table[@grammar.start]
      targ_state = init_state.action[anch].goto_state
      acc_state  = targ_state.action[anch].goto_state

      acc_state.action.clear
      acc_state.goto_table.clear
      acc_state.defact = @actions.accept
    end

    def pack(state)
      ### find most frequently used reduce rule
      act = state.action
      arr = Array.new(@grammar.size, 0)
      act.each do |t, a|
        arr[a.ruleid] += 1  if a.kind_of?(Reduce)
      end
      i = arr.max
      s = (i > 0) ? arr.index(i) : nil

      ### set & delete default action
      if s
        r = @actions.reduce(s)
        if not state.defact or state.defact == r
          act.delete_if {|t, a| a == r }
          state.defact = r
        end
      else
        state.defact ||= @actions.error
      end
    end

    def check_useless
      used = []
      @actions.each_reduce do |act|
        if not act or act.refn == 0
          act.rule.useless = true
        else
          t = act.rule.target
          used[t.ident] = t
        end
      end
      @symboltable.nt_base.upto(@symboltable.nt_max - 1) do |n|
        unless used[n]
          @symboltable[n].useless = true
        end
      end
    end

  end   # class StateTable


  # A LALR state.
  class State

    def initialize(ident, core)
      @ident = ident
      @core = core
      @goto_table = {}
      @gotos = {}
      @stokens = nil
      @ritems = nil
      @action = {}
      @defact = nil
      @rrconf = nil
      @srconf = nil

      @closure = make_closure(@core)
    end

    attr_reader :ident
    alias stateid ident
    alias hash ident

    attr_reader :core
    attr_reader :closure

    attr_reader :goto_table
    attr_reader :gotos

    attr_reader :stokens
    attr_reader :ritems
    attr_reader :rrules

    attr_reader :action
    attr_accessor :defact   # default action

    attr_reader :rrconf
    attr_reader :srconf

    def inspect
      "<state #{@ident}>"
    end

    alias to_s inspect

    def ==(oth)
      @ident == oth.ident
    end

    alias eql? ==

    def make_closure(core)
      set = ISet.new
      core.each do |ptr|
        set.add ptr
        if t = ptr.dereference and t.nonterminal?
          set.update_a t.expand
        end
      end
      set.to_a
    end

    def check_la(la_rules)
      @conflict = false
      s = []
      r = []
      @closure.each do |ptr|
        if t = ptr.dereference
          if t.terminal?
            s[t.ident] = t
            if t.ident == 1    # $error
              @conflict = true
            end
          end
        else
          r.push ptr.rule
        end
      end
      unless r.empty?
        if not s.empty? or r.size > 1
          @conflict = true
        end
      end
      s.compact!
      @stokens  = s
      @rrules = r

      if @conflict
        @la_rules_i = la_rules.size
        @la_rules = r.map {|i| i.ident }
        la_rules.concat r
      else
        @la_rules_i = @la_rules = nil
      end
    end

    def conflict?
      @conflict
    end

    def rruleid(rule)
      if i = @la_rules.index(rule.ident)
        @la_rules_i + i
      else
        puts '/// rruleid'
        p self
        p rule
        p @rrules
        p @la_rules_i
        raise 'racc: fatal: cannot get reduce rule id'
      end
    end

    def la=(la)
      return unless @conflict
      i = @la_rules_i
      @ritems = r = []
      @rrules.each do |rule|
        r.push Item.new(rule, la[i])
        i += 1
      end
    end

    def rr_conflict(high, low, ctok)
      c = RRconflict.new(@ident, high, low, ctok)

      @rrconf ||= {}
      if a = @rrconf[ctok]
        a.push c
      else
        @rrconf[ctok] = [c]
      end
    end

    def sr_conflict(shift, reduce)
      c = SRconflict.new(@ident, shift, reduce)

      @srconf ||= {}
      if a = @srconf[shift]
        a.push c
      else
        @srconf[shift] = [c]
      end
    end

    def n_srconflicts
      @srconf ? @srconf.size : 0
    end

    def n_rrconflicts
      @rrconf ? @rrconf.size : 0
    end

  end   # class State


  #
  # Represents a transition on the grammar.
  # "Real goto" means a transition by nonterminal,
  # but this class treats also terminal's.
  # If one is a terminal transition, .ident returns nil.
  #
  class Goto
    def initialize(ident, sym, from, to)
      @ident      = ident
      @symbol     = sym
      @from_state = from
      @to_state   = to
    end

    attr_reader :ident
    attr_reader :symbol
    attr_reader :from_state
    attr_reader :to_state

    def inspect
      "(#{@from_state.ident}-#{@symbol}->#{@to_state.ident})"
    end
  end


  # LALR item.  A set of rule and its lookahead tokens.
  class Item
    def initialize(rule, la)
      @rule = rule
      @la  = la
    end

    attr_reader :rule
    attr_reader :la

    def each_la(tbl)
      la = @la
      0.upto(la.size - 1) do |i|
        (0..7).each do |ii|
          if la[idx = i * 8 + ii] == 1
            yield tbl[idx]
          end
        end
      end
    end
  end


  # The table of LALR actions. Actions are either of
  # Shift, Reduce, Accept and Error.
  class ActionTable

    def initialize(rt, st)
      @grammar = rt
      @statetable = st

      @reduce = []
      @shift = []
      @accept = nil
      @error = nil
    end

    def init
      @grammar.each do |rule|
        @reduce.push Reduce.new(rule)
      end
      @statetable.each do |state|
        @shift.push Shift.new(state)
      end
      @accept = Accept.new
      @error = Error.new
    end

    def reduce_n
      @reduce.size
    end

    def reduce(i)
      case i
      when Rule    then i = i.ident
      when Integer then ;
      else
        raise "racc: fatal: wrong class #{i.class} for reduce"
      end

      r = @reduce[i] or raise "racc: fatal: reduce action #{i.inspect} not exist"
      r.incref
      r
    end

    def each_reduce(&block)
      @reduce.each(&block)
    end

    def shift_n
      @shift.size
    end

    def shift(i)
      case i
      when State   then i = i.ident
      when Integer then ;
      else
        raise "racc: fatal: wrong class #{i.class} for shift"
      end

      @shift[i] or raise "racc: fatal: shift action #{i} does not exist"
    end

    def each_shift(&block)
      @shift.each(&block)
    end

    attr_reader :accept
    attr_reader :error

  end


  class Shift
    def initialize(goto)
      @goto_state = goto
    end

    attr_reader :goto_state

    def goto_id
      @goto_state.ident
    end

    def inspect
      "<shift #{@goto_state.ident}>"
    end
  end


  class Reduce
    def initialize(rule)
      @rule = rule
      @refn = 0
    end

    attr_reader :rule
    attr_reader :refn

    def ruleid
      @rule.ident
    end

    def inspect
      "<reduce #{@rule.ident}>"
    end

    def incref
      @refn += 1
    end

    def decref
      @refn -= 1
      raise 'racc: fatal: act.refn < 0' if @refn < 0
    end
  end

  class Accept
    def inspect
      "<accept>"
    end
  end

  class Error
    def inspect
      "<error>"
    end
  end

  class SRconflict
    def initialize(sid, shift, reduce)
      @stateid = sid
      @shift   = shift
      @reduce  = reduce
    end

    attr_reader :stateid
    attr_reader :shift
    attr_reader :reduce

    def to_s
      sprintf('state %d: S/R conflict rule %d reduce and shift %s',
              @stateid, @reduce.ruleid, @shift.to_s)
    end
  end

  class RRconflict
    def initialize(sid, high, low, tok)
      @stateid   = sid
      @high_prec = high
      @low_prec  = low
      @token     = tok
    end

    attr_reader :stateid
    attr_reader :high_prec
    attr_reader :low_prec
    attr_reader :token

    def to_s
      sprintf('state %d: R/R conflict with rule %d and %d on %s',
              @stateid, @high_prec.ident, @low_prec.ident, @token.to_s)
    end
  end

end
PK#}$[�7X��G�Gruby/racc/parser.rbnu�[���# frozen_string_literal: false
#--
# Copyright (c) 1999-2006 Minero Aoki
#
# This program is free software.
# You can distribute/modify this program under the same terms of ruby.
#
# As a special exception, when this code is copied by Racc
# into a Racc output file, you may use that output file
# without restriction.
#++

require 'racc/info'

unless defined?(NotImplementedError)
  NotImplementedError = NotImplementError # :nodoc:
end

module Racc
  class ParseError < StandardError; end
end
unless defined?(::ParseError)
  ParseError = Racc::ParseError
end

# Racc is a LALR(1) parser generator.
# It is written in Ruby itself, and generates Ruby programs.
#
# == Command-line Reference
#
#     racc [-o<var>filename</var>] [--output-file=<var>filename</var>]
#          [-e<var>rubypath</var>] [--executable=<var>rubypath</var>]
#          [-v] [--verbose]
#          [-O<var>filename</var>] [--log-file=<var>filename</var>]
#          [-g] [--debug]
#          [-E] [--embedded]
#          [-l] [--no-line-convert]
#          [-c] [--line-convert-all]
#          [-a] [--no-omit-actions]
#          [-C] [--check-only]
#          [-S] [--output-status]
#          [--version] [--copyright] [--help] <var>grammarfile</var>
#
# [+grammarfile+]
#   Racc grammar file. Any extension is permitted.
# [-o+outfile+, --output-file=+outfile+]
#   A filename for output. default is <+filename+>.tab.rb
# [-O+filename+, --log-file=+filename+]
#   Place logging output in file +filename+.
#   Default log file name is <+filename+>.output.
# [-e+rubypath+, --executable=+rubypath+]
#   output executable file(mode 755). where +path+ is the Ruby interpreter.
# [-v, --verbose]
#   verbose mode. create +filename+.output file, like yacc's y.output file.
# [-g, --debug]
#   add debug code to parser class. To display debuggin information,
#   use this '-g' option and set @yydebug true in parser class.
# [-E, --embedded]
#   Output parser which doesn't need runtime files (racc/parser.rb).
# [-C, --check-only]
#   Check syntax of racc grammar file and quit.
# [-S, --output-status]
#   Print messages time to time while compiling.
# [-l, --no-line-convert]
#   turns off line number converting.
# [-c, --line-convert-all]
#   Convert line number of actions, inner, header and footer.
# [-a, --no-omit-actions]
#   Call all actions, even if an action is empty.
# [--version]
#   print Racc version and quit.
# [--copyright]
#   Print copyright and quit.
# [--help]
#   Print usage and quit.
#
# == Generating Parser Using Racc
#
# To compile Racc grammar file, simply type:
#
#   $ racc parse.y
#
# This creates Ruby script file "parse.tab.y". The -o option can change the output filename.
#
# == Writing A Racc Grammar File
#
# If you want your own parser, you have to write a grammar file.
# A grammar file contains the name of your parser class, grammar for the parser,
# user code, and anything else.
# When writing a grammar file, yacc's knowledge is helpful.
# If you have not used yacc before, Racc is not too difficult.
#
# Here's an example Racc grammar file.
#
#   class Calcparser
#   rule
#     target: exp { print val[0] }
#
#     exp: exp '+' exp
#        | exp '*' exp
#        | '(' exp ')'
#        | NUMBER
#   end
#
# Racc grammar files resemble yacc files.
# But (of course), this is Ruby code.
# yacc's $$ is the 'result', $0, $1... is
# an array called 'val', and $-1, $-2... is an array called '_values'.
#
# See the {Grammar File Reference}[rdoc-ref:lib/racc/rdoc/grammar.en.rdoc] for
# more information on grammar files.
#
# == Parser
#
# Then you must prepare the parse entry method. There are two types of
# parse methods in Racc, Racc::Parser#do_parse and Racc::Parser#yyparse
#
# Racc::Parser#do_parse is simple.
#
# It's yyparse() of yacc, and Racc::Parser#next_token is yylex().
# This method must returns an array like [TOKENSYMBOL, ITS_VALUE].
# EOF is [false, false].
# (TOKENSYMBOL is a Ruby symbol (taken from String#intern) by default.
# If you want to change this, see the grammar reference.
#
# Racc::Parser#yyparse is little complicated, but useful.
# It does not use Racc::Parser#next_token, instead it gets tokens from any iterator.
#
# For example, <code>yyparse(obj, :scan)</code> causes
# calling +obj#scan+, and you can return tokens by yielding them from +obj#scan+.
#
# == Debugging
#
# When debugging, "-v" or/and the "-g" option is helpful.
#
# "-v" creates verbose log file (.output).
# "-g" creates a "Verbose Parser".
# Verbose Parser prints the internal status when parsing.
# But it's _not_ automatic.
# You must use -g option and set +@yydebug+ to +true+ in order to get output.
# -g option only creates the verbose parser.
#
# === Racc reported syntax error.
#
# Isn't there too many "end"?
# grammar of racc file is changed in v0.10.
#
# Racc does not use '%' mark, while yacc uses huge number of '%' marks..
#
# === Racc reported "XXXX conflicts".
#
# Try "racc -v xxxx.y".
# It causes producing racc's internal log file, xxxx.output.
#
# === Generated parsers does not work correctly
#
# Try "racc -g xxxx.y".
# This command let racc generate "debugging parser".
# Then set @yydebug=true in your parser.
# It produces a working log of your parser.
#
# == Re-distributing Racc runtime
#
# A parser, which is created by Racc, requires the Racc runtime module;
# racc/parser.rb.
#
# Ruby 1.8.x comes with Racc runtime module,
# you need NOT distribute Racc runtime files.
#
# If you want to include the Racc runtime module with your parser.
# This can be done by using '-E' option:
#
#   $ racc -E -omyparser.rb myparser.y
#
# This command creates myparser.rb which `includes' Racc runtime.
# Only you must do is to distribute your parser file (myparser.rb).
#
# Note: parser.rb is ruby license, but your parser is not.
# Your own parser is completely yours.
module Racc

  unless defined?(Racc_No_Extensions)
    Racc_No_Extensions = false # :nodoc:
  end

  class Parser

    Racc_Runtime_Version = ::Racc::VERSION
    Racc_Runtime_Core_Version_R = ::Racc::VERSION

    begin
      if Object.const_defined?(:RUBY_ENGINE) and RUBY_ENGINE == 'jruby'
        require 'jruby'
        require 'racc/cparse-jruby.jar'
        com.headius.racc.Cparse.new.load(JRuby.runtime, false)
      else
        require 'racc/cparse'
      end

      unless new.respond_to?(:_racc_do_parse_c, true)
        raise LoadError, 'old cparse.so'
      end
      if Racc_No_Extensions
        raise LoadError, 'selecting ruby version of racc runtime core'
      end

      Racc_Main_Parsing_Routine    = :_racc_do_parse_c # :nodoc:
      Racc_YY_Parse_Method         = :_racc_yyparse_c # :nodoc:
      Racc_Runtime_Core_Version    = Racc_Runtime_Core_Version_C # :nodoc:
      Racc_Runtime_Type            = 'c' # :nodoc:
    rescue LoadError
      Racc_Main_Parsing_Routine    = :_racc_do_parse_rb
      Racc_YY_Parse_Method         = :_racc_yyparse_rb
      Racc_Runtime_Core_Version    = Racc_Runtime_Core_Version_R
      Racc_Runtime_Type            = 'ruby'
    end

    def Parser.racc_runtime_type # :nodoc:
      Racc_Runtime_Type
    end

    def _racc_setup
      @yydebug = false unless self.class::Racc_debug_parser
      @yydebug = false unless defined?(@yydebug)
      if @yydebug
        @racc_debug_out = $stderr unless defined?(@racc_debug_out)
        @racc_debug_out ||= $stderr
      end
      arg = self.class::Racc_arg
      arg[13] = true if arg.size < 14
      arg
    end

    def _racc_init_sysvars
      @racc_state  = [0]
      @racc_tstack = []
      @racc_vstack = []

      @racc_t = nil
      @racc_val = nil

      @racc_read_next = true

      @racc_user_yyerror = false
      @racc_error_status = 0
    end

    # The entry point of the parser. This method is used with #next_token.
    # If Racc wants to get token (and its value), calls next_token.
    #
    # Example:
    #     def parse
    #       @q = [[1,1],
    #             [2,2],
    #             [3,3],
    #             [false, '$']]
    #       do_parse
    #     end
    #
    #     def next_token
    #       @q.shift
    #     end
    class_eval %{
    def do_parse
      #{Racc_Main_Parsing_Routine}(_racc_setup(), false)
    end
    }

    # The method to fetch next token.
    # If you use #do_parse method, you must implement #next_token.
    #
    # The format of return value is [TOKEN_SYMBOL, VALUE].
    # +token-symbol+ is represented by Ruby's symbol by default, e.g. :IDENT
    # for 'IDENT'.  ";" (String) for ';'.
    #
    # The final symbol (End of file) must be false.
    def next_token
      raise NotImplementedError, "#{self.class}\#next_token is not defined"
    end

    def _racc_do_parse_rb(arg, in_debug)
      action_table, action_check, action_default, action_pointer,
      _,            _,            _,              _,
      _,            _,            token_table,    * = arg

      _racc_init_sysvars
      tok = act = i = nil

      catch(:racc_end_parse) {
        while true
          if i = action_pointer[@racc_state[-1]]
            if @racc_read_next
              if @racc_t != 0   # not EOF
                tok, @racc_val = next_token()
                unless tok      # EOF
                  @racc_t = 0
                else
                  @racc_t = (token_table[tok] or 1)   # error token
                end
                racc_read_token(@racc_t, tok, @racc_val) if @yydebug
                @racc_read_next = false
              end
            end
            i += @racc_t
            unless i >= 0 and
                   act = action_table[i] and
                   action_check[i] == @racc_state[-1]
              act = action_default[@racc_state[-1]]
            end
          else
            act = action_default[@racc_state[-1]]
          end
          while act = _racc_evalact(act, arg)
            ;
          end
        end
      }
    end

    # Another entry point for the parser.
    # If you use this method, you must implement RECEIVER#METHOD_ID method.
    #
    # RECEIVER#METHOD_ID is a method to get next token.
    # It must 'yield' the token, which format is [TOKEN-SYMBOL, VALUE].
    class_eval %{
    def yyparse(recv, mid)
      #{Racc_YY_Parse_Method}(recv, mid, _racc_setup(), false)
    end
    }

    def _racc_yyparse_rb(recv, mid, arg, c_debug)
      action_table, action_check, action_default, action_pointer,
      _,            _,            _,              _,
      _,            _,            token_table,    * = arg

      _racc_init_sysvars

      catch(:racc_end_parse) {
        until i = action_pointer[@racc_state[-1]]
          while act = _racc_evalact(action_default[@racc_state[-1]], arg)
            ;
          end
        end
        recv.__send__(mid) do |tok, val|
          unless tok
            @racc_t = 0
          else
            @racc_t = (token_table[tok] or 1)   # error token
          end
          @racc_val = val
          @racc_read_next = false

          i += @racc_t
          unless i >= 0 and
                 act = action_table[i] and
                 action_check[i] == @racc_state[-1]
            act = action_default[@racc_state[-1]]
          end
          while act = _racc_evalact(act, arg)
            ;
          end

          while !(i = action_pointer[@racc_state[-1]]) ||
                ! @racc_read_next ||
                @racc_t == 0  # $
            unless i and i += @racc_t and
                   i >= 0 and
                   act = action_table[i] and
                   action_check[i] == @racc_state[-1]
              act = action_default[@racc_state[-1]]
            end
            while act = _racc_evalact(act, arg)
              ;
            end
          end
        end
      }
    end

    ###
    ### common
    ###

    def _racc_evalact(act, arg)
      action_table, action_check, _, action_pointer,
      _,            _,            _, _,
      _,            _,            _, shift_n,
      reduce_n,     * = arg
      nerr = 0   # tmp

      if act > 0 and act < shift_n
        #
        # shift
        #
        if @racc_error_status > 0
          @racc_error_status -= 1 unless @racc_t <= 1 # error token or EOF
        end
        @racc_vstack.push @racc_val
        @racc_state.push act
        @racc_read_next = true
        if @yydebug
          @racc_tstack.push @racc_t
          racc_shift @racc_t, @racc_tstack, @racc_vstack
        end

      elsif act < 0 and act > -reduce_n
        #
        # reduce
        #
        code = catch(:racc_jump) {
          @racc_state.push _racc_do_reduce(arg, act)
          false
        }
        if code
          case code
          when 1 # yyerror
            @racc_user_yyerror = true   # user_yyerror
            return -reduce_n
          when 2 # yyaccept
            return shift_n
          else
            raise '[Racc Bug] unknown jump code'
          end
        end

      elsif act == shift_n
        #
        # accept
        #
        racc_accept if @yydebug
        throw :racc_end_parse, @racc_vstack[0]

      elsif act == -reduce_n
        #
        # error
        #
        case @racc_error_status
        when 0
          unless arg[21]    # user_yyerror
            nerr += 1
            on_error @racc_t, @racc_val, @racc_vstack
          end
        when 3
          if @racc_t == 0   # is $
            # We're at EOF, and another error occurred immediately after
            # attempting auto-recovery
            throw :racc_end_parse, nil
          end
          @racc_read_next = true
        end
        @racc_user_yyerror = false
        @racc_error_status = 3
        while true
          if i = action_pointer[@racc_state[-1]]
            i += 1   # error token
            if  i >= 0 and
                (act = action_table[i]) and
                action_check[i] == @racc_state[-1]
              break
            end
          end
          throw :racc_end_parse, nil if @racc_state.size <= 1
          @racc_state.pop
          @racc_vstack.pop
          if @yydebug
            @racc_tstack.pop
            racc_e_pop @racc_state, @racc_tstack, @racc_vstack
          end
        end
        return act

      else
        raise "[Racc Bug] unknown action #{act.inspect}"
      end

      racc_next_state(@racc_state[-1], @racc_state) if @yydebug

      nil
    end

    def _racc_do_reduce(arg, act)
      _,          _,            _,            _,
      goto_table, goto_check,   goto_default, goto_pointer,
      nt_base,    reduce_table, _,            _,
      _,          use_result,   * = arg

      state = @racc_state
      vstack = @racc_vstack
      tstack = @racc_tstack

      i = act * -3
      len       = reduce_table[i]
      reduce_to = reduce_table[i+1]
      method_id = reduce_table[i+2]
      void_array = []

      tmp_t = tstack[-len, len] if @yydebug
      tmp_v = vstack[-len, len]
      tstack[-len, len] = void_array if @yydebug
      vstack[-len, len] = void_array
      state[-len, len]  = void_array

      # tstack must be updated AFTER method call
      if use_result
        vstack.push __send__(method_id, tmp_v, vstack, tmp_v[0])
      else
        vstack.push __send__(method_id, tmp_v, vstack)
      end
      tstack.push reduce_to

      racc_reduce(tmp_t, reduce_to, tstack, vstack) if @yydebug

      k1 = reduce_to - nt_base
      if i = goto_pointer[k1]
        i += state[-1]
        if i >= 0 and (curstate = goto_table[i]) and goto_check[i] == k1
          return curstate
        end
      end
      goto_default[k1]
    end

    # This method is called when a parse error is found.
    #
    # ERROR_TOKEN_ID is an internal ID of token which caused error.
    # You can get string representation of this ID by calling
    # #token_to_str.
    #
    # ERROR_VALUE is a value of error token.
    #
    # value_stack is a stack of symbol values.
    # DO NOT MODIFY this object.
    #
    # This method raises ParseError by default.
    #
    # If this method returns, parsers enter "error recovering mode".
    def on_error(t, val, vstack)
      raise ParseError, sprintf("\nparse error on value %s (%s)",
                                val.inspect, token_to_str(t) || '?')
    end

    # Enter error recovering mode.
    # This method does not call #on_error.
    def yyerror
      throw :racc_jump, 1
    end

    # Exit parser.
    # Return value is +Symbol_Value_Stack[0]+.
    def yyaccept
      throw :racc_jump, 2
    end

    # Leave error recovering mode.
    def yyerrok
      @racc_error_status = 0
    end

    # For debugging output
    def racc_read_token(t, tok, val)
      @racc_debug_out.print 'read    '
      @racc_debug_out.print tok.inspect, '(', racc_token2str(t), ') '
      @racc_debug_out.puts val.inspect
      @racc_debug_out.puts
    end

    def racc_shift(tok, tstack, vstack)
      @racc_debug_out.puts "shift   #{racc_token2str tok}"
      racc_print_stacks tstack, vstack
      @racc_debug_out.puts
    end

    def racc_reduce(toks, sim, tstack, vstack)
      out = @racc_debug_out
      out.print 'reduce '
      if toks.empty?
        out.print ' <none>'
      else
        toks.each {|t| out.print ' ', racc_token2str(t) }
      end
      out.puts " --> #{racc_token2str(sim)}"
      racc_print_stacks tstack, vstack
      @racc_debug_out.puts
    end

    def racc_accept
      @racc_debug_out.puts 'accept'
      @racc_debug_out.puts
    end

    def racc_e_pop(state, tstack, vstack)
      @racc_debug_out.puts 'error recovering mode: pop token'
      racc_print_states state
      racc_print_stacks tstack, vstack
      @racc_debug_out.puts
    end

    def racc_next_state(curstate, state)
      @racc_debug_out.puts  "goto    #{curstate}"
      racc_print_states state
      @racc_debug_out.puts
    end

    def racc_print_stacks(t, v)
      out = @racc_debug_out
      out.print '        ['
      t.each_index do |i|
        out.print ' (', racc_token2str(t[i]), ' ', v[i].inspect, ')'
      end
      out.puts ' ]'
    end

    def racc_print_states(s)
      out = @racc_debug_out
      out.print '        ['
      s.each {|st| out.print ' ', st }
      out.puts ' ]'
    end

    def racc_token2str(tok)
      self.class::Racc_token_to_s_table[tok] or
          raise "[Racc Bug] can't convert token #{tok} to string"
    end

    # Convert internal ID of token symbol to the string.
    def token_to_str(t)
      self.class::Racc_token_to_s_table[t]
    end

  end

end
PK#}$[�s���ruby/observer.rbnu�[���# frozen_string_literal: true
#
# Implementation of the _Observer_ object-oriented design pattern.  The
# following documentation is copied, with modifications, from "Programming
# Ruby", by Hunt and Thomas; http://www.ruby-doc.org/docs/ProgrammingRuby/html/lib_patterns.html.
#
# See Observable for more info.

# The Observer pattern (also known as publish/subscribe) provides a simple
# mechanism for one object to inform a set of interested third-party objects
# when its state changes.
#
# == Mechanism
#
# The notifying class mixes in the +Observable+
# module, which provides the methods for managing the associated observer
# objects.
#
# The observable object must:
# * assert that it has +#changed+
# * call +#notify_observers+
#
# An observer subscribes to updates using Observable#add_observer, which also
# specifies the method called via #notify_observers. The default method for
# #notify_observers is #update.
#
# === Example
#
# The following example demonstrates this nicely.  A +Ticker+, when run,
# continually receives the stock +Price+ for its <tt>@symbol</tt>.  A +Warner+
# is a general observer of the price, and two warners are demonstrated, a
# +WarnLow+ and a +WarnHigh+, which print a warning if the price is below or
# above their set limits, respectively.
#
# The +update+ callback allows the warners to run without being explicitly
# called.  The system is set up with the +Ticker+ and several observers, and the
# observers do their duty without the top-level code having to interfere.
#
# Note that the contract between publisher and subscriber (observable and
# observer) is not declared or enforced.  The +Ticker+ publishes a time and a
# price, and the warners receive that.  But if you don't ensure that your
# contracts are correct, nothing else can warn you.
#
#   require "observer"
#
#   class Ticker          ### Periodically fetch a stock price.
#     include Observable
#
#     def initialize(symbol)
#       @symbol = symbol
#     end
#
#     def run
#       last_price = nil
#       loop do
#         price = Price.fetch(@symbol)
#         print "Current price: #{price}\n"
#         if price != last_price
#           changed                 # notify observers
#           last_price = price
#           notify_observers(Time.now, price)
#         end
#         sleep 1
#       end
#     end
#   end
#
#   class Price           ### A mock class to fetch a stock price (60 - 140).
#     def self.fetch(symbol)
#       60 + rand(80)
#     end
#   end
#
#   class Warner          ### An abstract observer of Ticker objects.
#     def initialize(ticker, limit)
#       @limit = limit
#       ticker.add_observer(self)
#     end
#   end
#
#   class WarnLow < Warner
#     def update(time, price)       # callback for observer
#       if price < @limit
#         print "--- #{time.to_s}: Price below #@limit: #{price}\n"
#       end
#     end
#   end
#
#   class WarnHigh < Warner
#     def update(time, price)       # callback for observer
#       if price > @limit
#         print "+++ #{time.to_s}: Price above #@limit: #{price}\n"
#       end
#     end
#   end
#
#   ticker = Ticker.new("MSFT")
#   WarnLow.new(ticker, 80)
#   WarnHigh.new(ticker, 120)
#   ticker.run
#
# Produces:
#
#   Current price: 83
#   Current price: 75
#   --- Sun Jun 09 00:10:25 CDT 2002: Price below 80: 75
#   Current price: 90
#   Current price: 134
#   +++ Sun Jun 09 00:10:25 CDT 2002: Price above 120: 134
#   Current price: 134
#   Current price: 112
#   Current price: 79
#   --- Sun Jun 09 00:10:25 CDT 2002: Price below 80: 79
#
# === Usage with procs
#
# The +#notify_observers+ method can also be used with +proc+s by using
# the +:call+ as +func+ parameter.
#
# The following example illustrates the use of a lambda:
#
#   require 'observer'
#
#   class Ticker
#     include Observable
#
#     def run
#       # logic to retrieve the price (here 77.0)
#       changed
#       notify_observers(77.0)
#     end
#   end
#
#   ticker = Ticker.new
#   warner = ->(price) { puts "New price received: #{price}" }
#   ticker.add_observer(warner, :call)
#   ticker.run
module Observable
  VERSION = "0.1.1"

  #
  # Add +observer+ as an observer on this object. So that it will receive
  # notifications.
  #
  # +observer+:: the object that will be notified of changes.
  # +func+:: Symbol naming the method that will be called when this Observable
  #          has changes.
  #
  #          This method must return true for +observer.respond_to?+ and will
  #          receive <tt>*arg</tt> when #notify_observers is called, where
  #          <tt>*arg</tt> is the value passed to #notify_observers by this
  #          Observable
  def add_observer(observer, func=:update)
    @observer_peers = {} unless defined? @observer_peers
    unless observer.respond_to? func
      raise NoMethodError, "observer does not respond to `#{func}'"
    end
    @observer_peers[observer] = func
  end

  #
  # Remove +observer+ as an observer on this object so that it will no longer
  # receive notifications.
  #
  # +observer+:: An observer of this Observable
  def delete_observer(observer)
    @observer_peers.delete observer if defined? @observer_peers
  end

  #
  # Remove all observers associated with this object.
  #
  def delete_observers
    @observer_peers.clear if defined? @observer_peers
  end

  #
  # Return the number of observers associated with this object.
  #
  def count_observers
    if defined? @observer_peers
      @observer_peers.size
    else
      0
    end
  end

  #
  # Set the changed state of this object.  Notifications will be sent only if
  # the changed +state+ is +true+.
  #
  # +state+:: Boolean indicating the changed state of this Observable.
  #
  def changed(state=true)
    @observer_state = state
  end

  #
  # Returns true if this object's state has been changed since the last
  # #notify_observers call.
  #
  def changed?
    if defined? @observer_state and @observer_state
      true
    else
      false
    end
  end

  #
  # Notify observers of a change in state *if* this object's changed state is
  # +true+.
  #
  # This will invoke the method named in #add_observer, passing <tt>*arg</tt>.
  # The changed state is then set to +false+.
  #
  # <tt>*arg</tt>:: Any arguments to pass to the observers.
  def notify_observers(*arg)
    if defined? @observer_state and @observer_state
      if defined? @observer_peers
        @observer_peers.each do |k, v|
          k.__send__(v, *arg)
        end
      end
      @observer_state = false
    end
  end

end
PK#}$[�Y(��c�cruby/open-uri.rbnu�[���# frozen_string_literal: true
require 'uri'
require 'stringio'
require 'time'

module URI
  # Allows the opening of various resources including URIs.
  #
  # If the first argument responds to the 'open' method, 'open' is called on
  # it with the rest of the arguments.
  #
  # If the first argument is a string that begins with <code>(protocol)://<code>, it is parsed by
  # URI.parse.  If the parsed object responds to the 'open' method,
  # 'open' is called on it with the rest of the arguments.
  #
  # Otherwise, Kernel#open is called.
  #
  # OpenURI::OpenRead#open provides URI::HTTP#open, URI::HTTPS#open and
  # URI::FTP#open, Kernel#open.
  #
  # We can accept URIs and strings that begin with http://, https:// and
  # ftp://. In these cases, the opened file object is extended by OpenURI::Meta.
  def self.open(name, *rest, &block)
    if name.respond_to?(:open)
      name.open(*rest, &block)
    elsif name.respond_to?(:to_str) &&
          %r{\A[A-Za-z][A-Za-z0-9+\-\.]*://} =~ name &&
          (uri = URI.parse(name)).respond_to?(:open)
      uri.open(*rest, &block)
    else
      super
    end
  end
end

# OpenURI is an easy-to-use wrapper for Net::HTTP, Net::HTTPS and Net::FTP.
#
# == Example
#
# It is possible to open an http, https or ftp URL as though it were a file:
#
#   URI.open("http://www.ruby-lang.org/") {|f|
#     f.each_line {|line| p line}
#   }
#
# The opened file has several getter methods for its meta-information, as
# follows, since it is extended by OpenURI::Meta.
#
#   URI.open("http://www.ruby-lang.org/en") {|f|
#     f.each_line {|line| p line}
#     p f.base_uri         # <URI::HTTP:0x40e6ef2 URL:http://www.ruby-lang.org/en/>
#     p f.content_type     # "text/html"
#     p f.charset          # "iso-8859-1"
#     p f.content_encoding # []
#     p f.last_modified    # Thu Dec 05 02:45:02 UTC 2002
#   }
#
# Additional header fields can be specified by an optional hash argument.
#
#   URI.open("http://www.ruby-lang.org/en/",
#     "User-Agent" => "Ruby/#{RUBY_VERSION}",
#     "From" => "foo@bar.invalid",
#     "Referer" => "http://www.ruby-lang.org/") {|f|
#     # ...
#   }
#
# The environment variables such as http_proxy, https_proxy and ftp_proxy
# are in effect by default. Here we disable proxy:
#
#   URI.open("http://www.ruby-lang.org/en/", :proxy => nil) {|f|
#     # ...
#   }
#
# See OpenURI::OpenRead.open and URI.open for more on available options.
#
# URI objects can be opened in a similar way.
#
#   uri = URI.parse("http://www.ruby-lang.org/en/")
#   uri.open {|f|
#     # ...
#   }
#
# URI objects can be read directly. The returned string is also extended by
# OpenURI::Meta.
#
#   str = uri.read
#   p str.base_uri
#
# Author:: Tanaka Akira <akr@m17n.org>

module OpenURI
  Options = {
    :proxy => true,
    :proxy_http_basic_authentication => true,
    :progress_proc => true,
    :content_length_proc => true,
    :http_basic_authentication => true,
    :read_timeout => true,
    :open_timeout => true,
    :ssl_ca_cert => nil,
    :ssl_verify_mode => nil,
    :ftp_active_mode => false,
    :redirect => true,
    :encoding => nil,
  }

  def OpenURI.check_options(options) # :nodoc:
    options.each {|k, v|
      next unless Symbol === k
      unless Options.include? k
        raise ArgumentError, "unrecognized option: #{k}"
      end
    }
  end

  def OpenURI.scan_open_optional_arguments(*rest) # :nodoc:
    if !rest.empty? && (String === rest.first || Integer === rest.first)
      mode = rest.shift
      if !rest.empty? && Integer === rest.first
        perm = rest.shift
      end
    end
    return mode, perm, rest
  end

  def OpenURI.open_uri(name, *rest) # :nodoc:
    uri = URI::Generic === name ? name : URI.parse(name)
    mode, _, rest = OpenURI.scan_open_optional_arguments(*rest)
    options = rest.shift if !rest.empty? && Hash === rest.first
    raise ArgumentError.new("extra arguments") if !rest.empty?
    options ||= {}
    OpenURI.check_options(options)

    if /\Arb?(?:\Z|:([^:]+))/ =~ mode
      encoding, = $1,Encoding.find($1) if $1
      mode = nil
    end
    if options.has_key? :encoding
      if !encoding.nil?
        raise ArgumentError, "encoding specified twice"
      end
      encoding = Encoding.find(options[:encoding])
    end

    unless mode == nil ||
           mode == 'r' || mode == 'rb' ||
           mode == File::RDONLY
      raise ArgumentError.new("invalid access mode #{mode} (#{uri.class} resource is read only.)")
    end

    io = open_loop(uri, options)
    io.set_encoding(encoding) if encoding
    if block_given?
      begin
        yield io
      ensure
        if io.respond_to? :close!
          io.close! # Tempfile
        else
          io.close if !io.closed?
        end
      end
    else
      io
    end
  end

  def OpenURI.open_loop(uri, options) # :nodoc:
    proxy_opts = []
    proxy_opts << :proxy_http_basic_authentication if options.include? :proxy_http_basic_authentication
    proxy_opts << :proxy if options.include? :proxy
    proxy_opts.compact!
    if 1 < proxy_opts.length
      raise ArgumentError, "multiple proxy options specified"
    end
    case proxy_opts.first
    when :proxy_http_basic_authentication
      opt_proxy, proxy_user, proxy_pass = options.fetch(:proxy_http_basic_authentication)
      proxy_user = proxy_user.to_str
      proxy_pass = proxy_pass.to_str
      if opt_proxy == true
        raise ArgumentError.new("Invalid authenticated proxy option: #{options[:proxy_http_basic_authentication].inspect}")
      end
    when :proxy
      opt_proxy = options.fetch(:proxy)
      proxy_user = nil
      proxy_pass = nil
    when nil
      opt_proxy = true
      proxy_user = nil
      proxy_pass = nil
    end
    case opt_proxy
    when true
      find_proxy = lambda {|u| pxy = u.find_proxy; pxy ? [pxy, nil, nil] : nil}
    when nil, false
      find_proxy = lambda {|u| nil}
    when String
      opt_proxy = URI.parse(opt_proxy)
      find_proxy = lambda {|u| [opt_proxy, proxy_user, proxy_pass]}
    when URI::Generic
      find_proxy = lambda {|u| [opt_proxy, proxy_user, proxy_pass]}
    else
      raise ArgumentError.new("Invalid proxy option: #{opt_proxy}")
    end

    uri_set = {}
    buf = nil
    while true
      redirect = catch(:open_uri_redirect) {
        buf = Buffer.new
        uri.buffer_open(buf, find_proxy.call(uri), options)
        nil
      }
      if redirect
        if redirect.relative?
          # Although it violates RFC2616, Location: field may have relative
          # URI.  It is converted to absolute URI using uri as a base URI.
          redirect = uri + redirect
        end
        if !options.fetch(:redirect, true)
          raise HTTPRedirect.new(buf.io.status.join(' '), buf.io, redirect)
        end
        unless OpenURI.redirectable?(uri, redirect)
          raise "redirection forbidden: #{uri} -> #{redirect}"
        end
        if options.include? :http_basic_authentication
          # send authentication only for the URI directly specified.
          options = options.dup
          options.delete :http_basic_authentication
        end
        uri = redirect
        raise "HTTP redirection loop: #{uri}" if uri_set.include? uri.to_s
        uri_set[uri.to_s] = true
      else
        break
      end
    end
    io = buf.io
    io.base_uri = uri
    io
  end

  def OpenURI.redirectable?(uri1, uri2) # :nodoc:
    # This test is intended to forbid a redirection from http://... to
    # file:///etc/passwd, file:///dev/zero, etc.  CVE-2011-1521
    # https to http redirect is also forbidden intentionally.
    # It avoids sending secure cookie or referer by non-secure HTTP protocol.
    # (RFC 2109 4.3.1, RFC 2965 3.3, RFC 2616 15.1.3)
    # However this is ad hoc.  It should be extensible/configurable.
    uri1.scheme.downcase == uri2.scheme.downcase ||
    (/\A(?:http|ftp)\z/i =~ uri1.scheme && /\A(?:https?|ftp)\z/i =~ uri2.scheme)
  end

  def OpenURI.open_http(buf, target, proxy, options) # :nodoc:
    if proxy
      proxy_uri, proxy_user, proxy_pass = proxy
      raise "Non-HTTP proxy URI: #{proxy_uri}" if proxy_uri.class != URI::HTTP
    end

    if target.userinfo
      raise ArgumentError, "userinfo not supported.  [RFC3986]"
    end

    header = {}
    options.each {|k, v| header[k] = v if String === k }

    require 'net/http'
    klass = Net::HTTP
    if URI::HTTP === target
      # HTTP or HTTPS
      if proxy
        unless proxy_user && proxy_pass
          proxy_user, proxy_pass = proxy_uri.userinfo.split(':') if proxy_uri.userinfo
        end
        if proxy_user && proxy_pass
          klass = Net::HTTP::Proxy(proxy_uri.hostname, proxy_uri.port, proxy_user, proxy_pass)
        else
          klass = Net::HTTP::Proxy(proxy_uri.hostname, proxy_uri.port)
        end
      end
      target_host = target.hostname
      target_port = target.port
      request_uri = target.request_uri
    else
      # FTP over HTTP proxy
      target_host = proxy_uri.hostname
      target_port = proxy_uri.port
      request_uri = target.to_s
      if proxy_user && proxy_pass
        header["Proxy-Authorization"] =
                        'Basic ' + ["#{proxy_user}:#{proxy_pass}"].pack('m0')
      end
    end

    http = proxy ? klass.new(target_host, target_port) : klass.new(target_host, target_port, nil)
    if target.class == URI::HTTPS
      require 'net/https'
      http.use_ssl = true
      http.verify_mode = options[:ssl_verify_mode] || OpenSSL::SSL::VERIFY_PEER
      store = OpenSSL::X509::Store.new
      if options[:ssl_ca_cert]
        Array(options[:ssl_ca_cert]).each do |cert|
          if File.directory? cert
            store.add_path cert
          else
            store.add_file cert
          end
        end
      else
        store.set_default_paths
      end
      http.cert_store = store
    end
    if options.include? :read_timeout
      http.read_timeout = options[:read_timeout]
    end
    if options.include? :open_timeout
      http.open_timeout = options[:open_timeout]
    end

    resp = nil
    http.start {
      req = Net::HTTP::Get.new(request_uri, header)
      if options.include? :http_basic_authentication
        user, pass = options[:http_basic_authentication]
        req.basic_auth user, pass
      end
      http.request(req) {|response|
        resp = response
        if options[:content_length_proc] && Net::HTTPSuccess === resp
          if resp.key?('Content-Length')
            options[:content_length_proc].call(resp['Content-Length'].to_i)
          else
            options[:content_length_proc].call(nil)
          end
        end
        resp.read_body {|str|
          buf << str
          if options[:progress_proc] && Net::HTTPSuccess === resp
            options[:progress_proc].call(buf.size)
          end
          str.clear
        }
      }
    }
    io = buf.io
    io.rewind
    io.status = [resp.code, resp.message]
    resp.each_name {|name| buf.io.meta_add_field2 name, resp.get_fields(name) }
    case resp
    when Net::HTTPSuccess
    when Net::HTTPMovedPermanently, # 301
         Net::HTTPFound, # 302
         Net::HTTPSeeOther, # 303
         Net::HTTPTemporaryRedirect # 307
      begin
        loc_uri = URI.parse(resp['location'])
      rescue URI::InvalidURIError
        raise OpenURI::HTTPError.new(io.status.join(' ') + ' (Invalid Location URI)', io)
      end
      throw :open_uri_redirect, loc_uri
    else
      raise OpenURI::HTTPError.new(io.status.join(' '), io)
    end
  end

  class HTTPError < StandardError
    def initialize(message, io)
      super(message)
      @io = io
    end
    attr_reader :io
  end

  # Raised on redirection,
  # only occurs when +redirect+ option for HTTP is +false+.
  class HTTPRedirect < HTTPError
    def initialize(message, io, uri)
      super(message, io)
      @uri = uri
    end
    attr_reader :uri
  end

  class Buffer # :nodoc: all
    def initialize
      @io = StringIO.new
      @size = 0
    end
    attr_reader :size

    StringMax = 10240
    def <<(str)
      @io << str
      @size += str.length
      if StringIO === @io && StringMax < @size
        require 'tempfile'
        io = Tempfile.new('open-uri')
        io.binmode
        Meta.init io, @io if Meta === @io
        io << @io.string
        @io = io
      end
    end

    def io
      Meta.init @io unless Meta === @io
      @io
    end
  end

  # Mixin for holding meta-information.
  module Meta
    def Meta.init(obj, src=nil) # :nodoc:
      obj.extend Meta
      obj.instance_eval {
        @base_uri = nil
        @meta = {} # name to string.  legacy.
        @metas = {} # name to array of strings.
      }
      if src
        obj.status = src.status
        obj.base_uri = src.base_uri
        src.metas.each {|name, values|
          obj.meta_add_field2(name, values)
        }
      end
    end

    # returns an Array that consists of status code and message.
    attr_accessor :status

    # returns a URI that is the base of relative URIs in the data.
    # It may differ from the URI supplied by a user due to redirection.
    attr_accessor :base_uri

    # returns a Hash that represents header fields.
    # The Hash keys are downcased for canonicalization.
    # The Hash values are a field body.
    # If there are multiple field with same field name,
    # the field values are concatenated with a comma.
    attr_reader :meta

    # returns a Hash that represents header fields.
    # The Hash keys are downcased for canonicalization.
    # The Hash value are an array of field values.
    attr_reader :metas

    def meta_setup_encoding # :nodoc:
      charset = self.charset
      enc = nil
      if charset
        begin
          enc = Encoding.find(charset)
        rescue ArgumentError
        end
      end
      enc = Encoding::ASCII_8BIT unless enc
      if self.respond_to? :force_encoding
        self.force_encoding(enc)
      elsif self.respond_to? :string
        self.string.force_encoding(enc)
      else # Tempfile
        self.set_encoding enc
      end
    end

    def meta_add_field2(name, values) # :nodoc:
      name = name.downcase
      @metas[name] = values
      @meta[name] = values.join(', ')
      meta_setup_encoding if name == 'content-type'
    end

    def meta_add_field(name, value) # :nodoc:
      meta_add_field2(name, [value])
    end

    # returns a Time that represents the Last-Modified field.
    def last_modified
      if vs = @metas['last-modified']
        v = vs.join(', ')
        Time.httpdate(v)
      else
        nil
      end
    end

    # :stopdoc:
    RE_LWS = /[\r\n\t ]+/n
    RE_TOKEN = %r{[^\x00- ()<>@,;:\\"/\[\]?={}\x7f]+}n
    RE_QUOTED_STRING = %r{"(?:[\r\n\t !#-\[\]-~\x80-\xff]|\\[\x00-\x7f])*"}n
    RE_PARAMETERS = %r{(?:;#{RE_LWS}?#{RE_TOKEN}#{RE_LWS}?=#{RE_LWS}?(?:#{RE_TOKEN}|#{RE_QUOTED_STRING})#{RE_LWS}?)*}n
    # :startdoc:

    def content_type_parse # :nodoc:
      vs = @metas['content-type']
      # The last (?:;#{RE_LWS}?)? matches extra ";" which violates RFC2045.
      if vs && %r{\A#{RE_LWS}?(#{RE_TOKEN})#{RE_LWS}?/(#{RE_TOKEN})#{RE_LWS}?(#{RE_PARAMETERS})(?:;#{RE_LWS}?)?\z}no =~ vs.join(', ')
        type = $1.downcase
        subtype = $2.downcase
        parameters = []
        $3.scan(/;#{RE_LWS}?(#{RE_TOKEN})#{RE_LWS}?=#{RE_LWS}?(?:(#{RE_TOKEN})|(#{RE_QUOTED_STRING}))/no) {|att, val, qval|
          if qval
            val = qval[1...-1].gsub(/[\r\n\t !#-\[\]-~\x80-\xff]+|(\\[\x00-\x7f])/n) { $1 ? $1[1,1] : $& }
          end
          parameters << [att.downcase, val]
        }
        ["#{type}/#{subtype}", *parameters]
      else
        nil
      end
    end

    # returns "type/subtype" which is MIME Content-Type.
    # It is downcased for canonicalization.
    # Content-Type parameters are stripped.
    def content_type
      type, *_ = content_type_parse
      type || 'application/octet-stream'
    end

    # returns a charset parameter in Content-Type field.
    # It is downcased for canonicalization.
    #
    # If charset parameter is not given but a block is given,
    # the block is called and its result is returned.
    # It can be used to guess charset.
    #
    # If charset parameter and block is not given,
    # nil is returned except text type.
    # In that case, "utf-8" is returned as defined by RFC6838 4.2.1
    def charset
      type, *parameters = content_type_parse
      if pair = parameters.assoc('charset')
        pair.last.downcase
      elsif block_given?
        yield
      elsif type && %r{\Atext/} =~ type
        "utf-8" # RFC6838 4.2.1
      else
        nil
      end
    end

    # Returns a list of encodings in Content-Encoding field as an array of
    # strings.
    #
    # The encodings are downcased for canonicalization.
    def content_encoding
      vs = @metas['content-encoding']
      if vs && %r{\A#{RE_LWS}?#{RE_TOKEN}#{RE_LWS}?(?:,#{RE_LWS}?#{RE_TOKEN}#{RE_LWS}?)*}o =~ (v = vs.join(', '))
        v.scan(RE_TOKEN).map {|content_coding| content_coding.downcase}
      else
        []
      end
    end
  end

  # Mixin for HTTP and FTP URIs.
  module OpenRead
    # OpenURI::OpenRead#open provides `open' for URI::HTTP and URI::FTP.
    #
    # OpenURI::OpenRead#open takes optional 3 arguments as:
    #
    #   OpenURI::OpenRead#open([mode [, perm]] [, options]) [{|io| ... }]
    #
    # OpenURI::OpenRead#open returns an IO-like object if block is not given.
    # Otherwise it yields the IO object and return the value of the block.
    # The IO object is extended with OpenURI::Meta.
    #
    # +mode+ and +perm+ are the same as Kernel#open.
    #
    # However, +mode+ must be read mode because OpenURI::OpenRead#open doesn't
    # support write mode (yet).
    # Also +perm+ is ignored because it is meaningful only for file creation.
    #
    # +options+ must be a hash.
    #
    # Each option with a string key specifies an extra header field for HTTP.
    # I.e., it is ignored for FTP without HTTP proxy.
    #
    # The hash may include other options, where keys are symbols:
    #
    # [:proxy]
    #  Synopsis:
    #    :proxy => "http://proxy.foo.com:8000/"
    #    :proxy => URI.parse("http://proxy.foo.com:8000/")
    #    :proxy => true
    #    :proxy => false
    #    :proxy => nil
    #
    #  If :proxy option is specified, the value should be String, URI,
    #  boolean or nil.
    #
    #  When String or URI is given, it is treated as proxy URI.
    #
    #  When true is given or the option itself is not specified,
    #  environment variable `scheme_proxy' is examined.
    #  `scheme' is replaced by `http', `https' or `ftp'.
    #
    #  When false or nil is given, the environment variables are ignored and
    #  connection will be made to a server directly.
    #
    # [:proxy_http_basic_authentication]
    #  Synopsis:
    #    :proxy_http_basic_authentication =>
    #      ["http://proxy.foo.com:8000/", "proxy-user", "proxy-password"]
    #    :proxy_http_basic_authentication =>
    #      [URI.parse("http://proxy.foo.com:8000/"),
    #       "proxy-user", "proxy-password"]
    #
    #  If :proxy option is specified, the value should be an Array with 3
    #  elements.  It should contain a proxy URI, a proxy user name and a proxy
    #  password.  The proxy URI should be a String, an URI or nil.  The proxy
    #  user name and password should be a String.
    #
    #  If nil is given for the proxy URI, this option is just ignored.
    #
    #  If :proxy and :proxy_http_basic_authentication is specified,
    #  ArgumentError is raised.
    #
    # [:http_basic_authentication]
    #  Synopsis:
    #    :http_basic_authentication=>[user, password]
    #
    #  If :http_basic_authentication is specified,
    #  the value should be an array which contains 2 strings:
    #  username and password.
    #  It is used for HTTP Basic authentication defined by RFC 2617.
    #
    # [:content_length_proc]
    #  Synopsis:
    #    :content_length_proc => lambda {|content_length| ... }
    #
    #  If :content_length_proc option is specified, the option value procedure
    #  is called before actual transfer is started.
    #  It takes one argument, which is expected content length in bytes.
    #
    #  If two or more transfers are performed by HTTP redirection, the
    #  procedure is called only once for the last transfer.
    #
    #  When expected content length is unknown, the procedure is called with
    #  nil.  This happens when the HTTP response has no Content-Length header.
    #
    # [:progress_proc]
    #  Synopsis:
    #    :progress_proc => lambda {|size| ...}
    #
    #  If :progress_proc option is specified, the proc is called with one
    #  argument each time when `open' gets content fragment from network.
    #  The argument +size+ is the accumulated transferred size in bytes.
    #
    #  If two or more transfer is done by HTTP redirection, the procedure
    #  is called only one for a last transfer.
    #
    #  :progress_proc and :content_length_proc are intended to be used for
    #  progress bar.
    #  For example, it can be implemented as follows using Ruby/ProgressBar.
    #
    #    pbar = nil
    #    open("http://...",
    #      :content_length_proc => lambda {|t|
    #        if t && 0 < t
    #          pbar = ProgressBar.new("...", t)
    #          pbar.file_transfer_mode
    #        end
    #      },
    #      :progress_proc => lambda {|s|
    #        pbar.set s if pbar
    #      }) {|f| ... }
    #
    # [:read_timeout]
    #  Synopsis:
    #    :read_timeout=>nil     (no timeout)
    #    :read_timeout=>10      (10 second)
    #
    #  :read_timeout option specifies a timeout of read for http connections.
    #
    # [:open_timeout]
    #  Synopsis:
    #    :open_timeout=>nil     (no timeout)
    #    :open_timeout=>10      (10 second)
    #
    #  :open_timeout option specifies a timeout of open for http connections.
    #
    # [:ssl_ca_cert]
    #  Synopsis:
    #    :ssl_ca_cert=>filename or an Array of filenames
    #
    #  :ssl_ca_cert is used to specify CA certificate for SSL.
    #  If it is given, default certificates are not used.
    #
    # [:ssl_verify_mode]
    #  Synopsis:
    #    :ssl_verify_mode=>mode
    #
    #  :ssl_verify_mode is used to specify openssl verify mode.
    #
    # [:ftp_active_mode]
    #  Synopsis:
    #    :ftp_active_mode=>bool
    #
    #  <tt>:ftp_active_mode => true</tt> is used to make ftp active mode.
    #  Ruby 1.9 uses passive mode by default.
    #  Note that the active mode is default in Ruby 1.8 or prior.
    #
    # [:redirect]
    #  Synopsis:
    #    :redirect=>bool
    #
    #  +:redirect+ is true by default.  <tt>:redirect => false</tt> is used to
    #  disable all HTTP redirects.
    #
    #  OpenURI::HTTPRedirect exception raised on redirection.
    #  Using +true+ also means that redirections between http and ftp are
    #  permitted.
    #
    def open(*rest, &block)
      OpenURI.open_uri(self, *rest, &block)
    end

    # OpenURI::OpenRead#read([ options ]) reads a content referenced by self and
    # returns the content as string.
    # The string is extended with OpenURI::Meta.
    # The argument +options+ is same as OpenURI::OpenRead#open.
    def read(options={})
      self.open(options) {|f|
        str = f.read
        Meta.init str, f
        str
      }
    end
  end
end

module URI
  class HTTP
    def buffer_open(buf, proxy, options) # :nodoc:
      OpenURI.open_http(buf, self, proxy, options)
    end

    include OpenURI::OpenRead
  end

  class FTP
    def buffer_open(buf, proxy, options) # :nodoc:
      if proxy
        OpenURI.open_http(buf, self, proxy, options)
        return
      end

      begin
        require 'net/ftp'
      rescue LoadError
        abort "net/ftp is not found. You may need to `gem install net-ftp` to install net/ftp."
      end

      path = self.path
      path = path.sub(%r{\A/}, '%2F') # re-encode the beginning slash because uri library decodes it.
      directories = path.split(%r{/}, -1)
      directories.each {|d|
        d.gsub!(/%([0-9A-Fa-f][0-9A-Fa-f])/) { [$1].pack("H2") }
      }
      unless filename = directories.pop
        raise ArgumentError, "no filename: #{self.inspect}"
      end
      directories.each {|d|
        if /[\r\n]/ =~ d
          raise ArgumentError, "invalid directory: #{d.inspect}"
        end
      }
      if /[\r\n]/ =~ filename
        raise ArgumentError, "invalid filename: #{filename.inspect}"
      end
      typecode = self.typecode
      if typecode && /\A[aid]\z/ !~ typecode
        raise ArgumentError, "invalid typecode: #{typecode.inspect}"
      end

      # The access sequence is defined by RFC 1738
      ftp = Net::FTP.new
      ftp.connect(self.hostname, self.port)
      ftp.passive = !options[:ftp_active_mode]
      # todo: extract user/passwd from .netrc.
      user = 'anonymous'
      passwd = nil
      user, passwd = self.userinfo.split(/:/) if self.userinfo
      ftp.login(user, passwd)
      directories.each {|cwd|
        ftp.voidcmd("CWD #{cwd}")
      }
      if typecode
        # xxx: typecode D is not handled.
        ftp.voidcmd("TYPE #{typecode.upcase}")
      end
      if options[:content_length_proc]
        options[:content_length_proc].call(ftp.size(filename))
      end
      ftp.retrbinary("RETR #{filename}", 4096) { |str|
        buf << str
        options[:progress_proc].call(buf.size) if options[:progress_proc]
      }
      ftp.close
      buf.io.rewind
    end

    include OpenURI::OpenRead
  end
end
PK#}$[���GGruby/benchmark/version.rbnu�[���# frozen_string_literal: true
module Benchmark
  VERSION = "0.2.0"
end
PK#}$[c�}���ruby/racc.rbnu�[���require 'racc/compat'
require 'racc/debugflags'
require 'racc/grammar'
require 'racc/state'
require 'racc/exception'
require 'racc/info'
PK#}$[#2�"7"7ruby/ostruct.rbnu�[���# frozen_string_literal: true
#
# = ostruct.rb: OpenStruct implementation
#
# Author:: Yukihiro Matsumoto
# Documentation:: Gavin Sinclair
#
# OpenStruct allows the creation of data objects with arbitrary attributes.
# See OpenStruct for an example.
#

#
# An OpenStruct is a data structure, similar to a Hash, that allows the
# definition of arbitrary attributes with their accompanying values. This is
# accomplished by using Ruby's metaprogramming to define methods on the class
# itself.
#
# == Examples
#
#   require "ostruct"
#
#   person = OpenStruct.new
#   person.name = "John Smith"
#   person.age  = 70
#
#   person.name      # => "John Smith"
#   person.age       # => 70
#   person.address   # => nil
#
# An OpenStruct employs a Hash internally to store the attributes and values
# and can even be initialized with one:
#
#   australia = OpenStruct.new(:country => "Australia", :capital => "Canberra")
#     # => #<OpenStruct country="Australia", capital="Canberra">
#
# Hash keys with spaces or characters that could normally not be used for
# method calls (e.g. <code>()[]*</code>) will not be immediately available
# on the OpenStruct object as a method for retrieval or assignment, but can
# still be reached through the Object#send method or using [].
#
#   measurements = OpenStruct.new("length (in inches)" => 24)
#   measurements[:"length (in inches)"]       # => 24
#   measurements.send("length (in inches)")   # => 24
#
#   message = OpenStruct.new(:queued? => true)
#   message.queued?                           # => true
#   message.send("queued?=", false)
#   message.queued?                           # => false
#
# Removing the presence of an attribute requires the execution of the
# delete_field method as setting the property value to +nil+ will not
# remove the attribute.
#
#   first_pet  = OpenStruct.new(:name => "Rowdy", :owner => "John Smith")
#   second_pet = OpenStruct.new(:name => "Rowdy")
#
#   first_pet.owner = nil
#   first_pet                 # => #<OpenStruct name="Rowdy", owner=nil>
#   first_pet == second_pet   # => false
#
#   first_pet.delete_field(:owner)
#   first_pet                 # => #<OpenStruct name="Rowdy">
#   first_pet == second_pet   # => true
#
# Ractor compatibility: A frozen OpenStruct with shareable values is itself shareable.
#
# == Caveats
#
# An OpenStruct utilizes Ruby's method lookup structure to find and define the
# necessary methods for properties. This is accomplished through the methods
# method_missing and define_singleton_method.
#
# This should be a consideration if there is a concern about the performance of
# the objects that are created, as there is much more overhead in the setting
# of these properties compared to using a Hash or a Struct.
# Creating an open struct from a small Hash and accessing a few of the
# entries can be 200 times slower than accessing the hash directly.
#
# This is a potential security issue; building OpenStruct from untrusted user data
# (e.g. JSON web request) may be susceptible to a "symbol denial of service" attack
# since the keys create methods and names of methods are never garbage collected.
#
# This may also be the source of incompatibilities between Ruby versions:
#
#   o = OpenStruct.new
#   o.then # => nil in Ruby < 2.6, enumerator for Ruby >= 2.6
#
# Builtin methods may be overwritten this way, which may be a source of bugs
# or security issues:
#
#   o = OpenStruct.new
#   o.methods # => [:to_h, :marshal_load, :marshal_dump, :each_pair, ...
#   o.methods = [:foo, :bar]
#   o.methods # => [:foo, :bar]
#
# To help remedy clashes, OpenStruct uses only protected/private methods ending with <code>!</code>
# and defines aliases for builtin public methods by adding a <code>!</code>:
#
#   o = OpenStruct.new(make: 'Bentley', class: :luxury)
#   o.class # => :luxury
#   o.class! # => OpenStruct
#
# It is recommended (but not enforced) to not use fields ending in <code>!</code>;
# Note that a subclass' methods may not be overwritten, nor can OpenStruct's own methods
# ending with <code>!</code>.
#
# For all these reasons, consider not using OpenStruct at all.
#
class OpenStruct
  VERSION = "0.5.2"

  #
  # Creates a new OpenStruct object.  By default, the resulting OpenStruct
  # object will have no attributes.
  #
  # The optional +hash+, if given, will generate attributes and values
  # (can be a Hash, an OpenStruct or a Struct).
  # For example:
  #
  #   require "ostruct"
  #   hash = { "country" => "Australia", :capital => "Canberra" }
  #   data = OpenStruct.new(hash)
  #
  #   data   # => #<OpenStruct country="Australia", capital="Canberra">
  #
  def initialize(hash=nil)
    if hash
      update_to_values!(hash)
    else
      @table = {}
    end
  end

  # Duplicates an OpenStruct object's Hash table.
  private def initialize_clone(orig) # :nodoc:
    super # clones the singleton class for us
    @table = @table.dup unless @table.frozen?
  end

  private def initialize_dup(orig) # :nodoc:
    super
    update_to_values!(@table)
  end

  private def update_to_values!(hash) # :nodoc:
    @table = {}
    hash.each_pair do |k, v|
      set_ostruct_member_value!(k, v)
    end
  end

  #
  # call-seq:
  #   ostruct.to_h                        -> hash
  #   ostruct.to_h {|name, value| block } -> hash
  #
  # Converts the OpenStruct to a hash with keys representing
  # each attribute (as symbols) and their corresponding values.
  #
  # If a block is given, the results of the block on each pair of
  # the receiver will be used as pairs.
  #
  #   require "ostruct"
  #   data = OpenStruct.new("country" => "Australia", :capital => "Canberra")
  #   data.to_h   # => {:country => "Australia", :capital => "Canberra" }
  #   data.to_h {|name, value| [name.to_s, value.upcase] }
  #               # => {"country" => "AUSTRALIA", "capital" => "CANBERRA" }
  #
  if {test: :to_h}.to_h{ [:works, true] }[:works] # RUBY_VERSION < 2.6 compatibility
    def to_h(&block)
      if block
        @table.to_h(&block)
      else
        @table.dup
      end
    end
  else
    def to_h(&block)
      if block
        @table.map(&block).to_h
      else
        @table.dup
      end
    end
  end

  #
  # :call-seq:
  #   ostruct.each_pair {|name, value| block }  -> ostruct
  #   ostruct.each_pair                         -> Enumerator
  #
  # Yields all attributes (as symbols) along with the corresponding values
  # or returns an enumerator if no block is given.
  #
  #   require "ostruct"
  #   data = OpenStruct.new("country" => "Australia", :capital => "Canberra")
  #   data.each_pair.to_a   # => [[:country, "Australia"], [:capital, "Canberra"]]
  #
  def each_pair
    return to_enum(__method__) { @table.size } unless block_given!
    @table.each_pair{|p| yield p}
    self
  end

  #
  # Provides marshalling support for use by the Marshal library.
  #
  def marshal_dump # :nodoc:
    @table
  end

  #
  # Provides marshalling support for use by the Marshal library.
  #
  alias_method :marshal_load, :update_to_values! # :nodoc:

  #
  # Used internally to defined properties on the
  # OpenStruct. It does this by using the metaprogramming function
  # define_singleton_method for both the getter method and the setter method.
  #
  def new_ostruct_member!(name) # :nodoc:
    unless @table.key?(name) || is_method_protected!(name)
      if defined?(::Ractor)
        getter_proc = nil.instance_eval{ Proc.new { @table[name] } }
        setter_proc = nil.instance_eval{ Proc.new {|x| @table[name] = x} }
        ::Ractor.make_shareable(getter_proc)
        ::Ractor.make_shareable(setter_proc)
      else
        getter_proc = Proc.new { @table[name] }
        setter_proc = Proc.new {|x| @table[name] = x}
      end
      define_singleton_method!(name, &getter_proc)
      define_singleton_method!("#{name}=", &setter_proc)
    end
  end
  private :new_ostruct_member!

  private def is_method_protected!(name) # :nodoc:
    if !respond_to?(name, true)
      false
    elsif name.match?(/!$/)
      true
    else
      owner = method!(name).owner
      if owner.class == ::Class
        owner < ::OpenStruct
      else
        self.class.ancestors.any? do |mod|
          return false if mod == ::OpenStruct
          mod == owner
        end
      end
    end
  end

  def freeze
    @table.freeze
    super
  end

  private def method_missing(mid, *args) # :nodoc:
    len = args.length
    if mname = mid[/.*(?==\z)/m]
      if len != 1
        raise! ArgumentError, "wrong number of arguments (given #{len}, expected 1)", caller(1)
      end
      set_ostruct_member_value!(mname, args[0])
    elsif len == 0
      @table[mid]
    else
      begin
        super
      rescue NoMethodError => err
        err.backtrace.shift
        raise!
      end
    end
  end

  #
  # :call-seq:
  #   ostruct[name]  -> object
  #
  # Returns the value of an attribute, or +nil+ if there is no such attribute.
  #
  #   require "ostruct"
  #   person = OpenStruct.new("name" => "John Smith", "age" => 70)
  #   person[:age]   # => 70, same as person.age
  #
  def [](name)
    @table[name.to_sym]
  end

  #
  # :call-seq:
  #   ostruct[name] = obj  -> obj
  #
  # Sets the value of an attribute.
  #
  #   require "ostruct"
  #   person = OpenStruct.new("name" => "John Smith", "age" => 70)
  #   person[:age] = 42   # equivalent to person.age = 42
  #   person.age          # => 42
  #
  def []=(name, value)
    name = name.to_sym
    new_ostruct_member!(name)
    @table[name] = value
  end
  alias_method :set_ostruct_member_value!, :[]=
  private :set_ostruct_member_value!

  # :call-seq:
  #   ostruct.dig(name, *identifiers) -> object
  #
  # Finds and returns the object in nested objects
  # that is specified by +name+ and +identifiers+.
  # The nested objects may be instances of various classes.
  # See {Dig Methods}[rdoc-ref:dig_methods.rdoc].
  #
  # Examples:
  #   require "ostruct"
  #   address = OpenStruct.new("city" => "Anytown NC", "zip" => 12345)
  #   person  = OpenStruct.new("name" => "John Smith", "address" => address)
  #   person.dig(:address, "zip") # => 12345
  #   person.dig(:business_address, "zip") # => nil
  def dig(name, *names)
    begin
      name = name.to_sym
    rescue NoMethodError
      raise! TypeError, "#{name} is not a symbol nor a string"
    end
    @table.dig(name, *names)
  end

  #
  # Removes the named field from the object and returns the value the field
  # contained if it was defined. You may optionally provide a block.
  # If the field is not defined, the result of the block is returned,
  # or a NameError is raised if no block was given.
  #
  #   require "ostruct"
  #
  #   person = OpenStruct.new(name: "John", age: 70, pension: 300)
  #
  #   person.delete_field!("age")  # => 70
  #   person                       # => #<OpenStruct name="John", pension=300>
  #
  # Setting the value to +nil+ will not remove the attribute:
  #
  #   person.pension = nil
  #   person                 # => #<OpenStruct name="John", pension=nil>
  #
  #   person.delete_field('number')  # => NameError
  #
  #   person.delete_field('number') { 8675_309 } # => 8675309
  #
  def delete_field(name)
    sym = name.to_sym
    begin
      singleton_class.remove_method(sym, "#{sym}=")
    rescue NameError
    end
    @table.delete(sym) do
      return yield if block_given!
      raise! NameError.new("no field `#{sym}' in #{self}", sym)
    end
  end

  InspectKey = :__inspect_key__ # :nodoc:

  #
  # Returns a string containing a detailed summary of the keys and values.
  #
  def inspect
    ids = (Thread.current[InspectKey] ||= [])
    if ids.include?(object_id)
      detail = ' ...'
    else
      ids << object_id
      begin
        detail = @table.map do |key, value|
          " #{key}=#{value.inspect}"
        end.join(',')
      ensure
        ids.pop
      end
    end
    ['#<', self.class!, detail, '>'].join
  end
  alias :to_s :inspect

  attr_reader :table # :nodoc:
  alias table! table
  protected :table!

  #
  # Compares this object and +other+ for equality.  An OpenStruct is equal to
  # +other+ when +other+ is an OpenStruct and the two objects' Hash tables are
  # equal.
  #
  #   require "ostruct"
  #   first_pet  = OpenStruct.new("name" => "Rowdy")
  #   second_pet = OpenStruct.new(:name  => "Rowdy")
  #   third_pet  = OpenStruct.new("name" => "Rowdy", :age => nil)
  #
  #   first_pet == second_pet   # => true
  #   first_pet == third_pet    # => false
  #
  def ==(other)
    return false unless other.kind_of?(OpenStruct)
    @table == other.table!
  end

  #
  # Compares this object and +other+ for equality.  An OpenStruct is eql? to
  # +other+ when +other+ is an OpenStruct and the two objects' Hash tables are
  # eql?.
  #
  def eql?(other)
    return false unless other.kind_of?(OpenStruct)
    @table.eql?(other.table!)
  end

  # Computes a hash code for this OpenStruct.
  def hash # :nodoc:
    @table.hash
  end

  #
  # Provides marshalling support for use by the YAML library.
  #
  def encode_with(coder) # :nodoc:
    @table.each_pair do |key, value|
      coder[key.to_s] = value
    end
    if @table.size == 1 && @table.key?(:table) # support for legacy format
      # in the very unlikely case of a single entry called 'table'
      coder['legacy_support!'] = true # add a bogus second entry
    end
  end

  #
  # Provides marshalling support for use by the YAML library.
  #
  def init_with(coder) # :nodoc:
    h = coder.map
    if h.size == 1 # support for legacy format
      key, val = h.first
      if key == 'table'
        h = val
      end
    end
    update_to_values!(h)
  end

  # Make all public methods (builtin or our own) accessible with <code>!</code>:
  give_access = instance_methods
  # See https://github.com/ruby/ostruct/issues/30
  give_access -= %i[instance_exec instance_eval eval] if RUBY_ENGINE == 'jruby'
  give_access.each do |method|
    next if method.match(/\W$/)

    new_name = "#{method}!"
    alias_method new_name, method
  end
  # Other builtin private methods we use:
  alias_method :raise!, :raise
  alias_method :block_given!, :block_given?
  private :raise!, :block_given!
end
PK#}$[��k
k
ruby/base64.rbnu�[���# frozen_string_literal: true
#
# = base64.rb: methods for base64-encoding and -decoding strings
#

# The Base64 module provides for the encoding (#encode64, #strict_encode64,
# #urlsafe_encode64) and decoding (#decode64, #strict_decode64,
# #urlsafe_decode64) of binary data using a Base64 representation.
#
# == Example
#
# A simple encoding and decoding.
#
#     require "base64"
#
#     enc   = Base64.encode64('Send reinforcements')
#                         # -> "U2VuZCByZWluZm9yY2VtZW50cw==\n"
#     plain = Base64.decode64(enc)
#                         # -> "Send reinforcements"
#
# The purpose of using base64 to encode data is that it translates any
# binary data into purely printable characters.

module Base64
  module_function

  # Returns the Base64-encoded version of +bin+.
  # This method complies with RFC 2045.
  # Line feeds are added to every 60 encoded characters.
  #
  #    require 'base64'
  #    Base64.encode64("Now is the time for all good coders\nto learn Ruby")
  #
  # <i>Generates:</i>
  #
  #    Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4g
  #    UnVieQ==
  def encode64(bin)
    [bin].pack("m")
  end

  # Returns the Base64-decoded version of +str+.
  # This method complies with RFC 2045.
  # Characters outside the base alphabet are ignored.
  #
  #   require 'base64'
  #   str = 'VGhpcyBpcyBsaW5lIG9uZQpUaGlzIG' +
  #         'lzIGxpbmUgdHdvClRoaXMgaXMgbGlu' +
  #         'ZSB0aHJlZQpBbmQgc28gb24uLi4K'
  #   puts Base64.decode64(str)
  #
  # <i>Generates:</i>
  #
  #    This is line one
  #    This is line two
  #    This is line three
  #    And so on...
  def decode64(str)
    str.unpack1("m")
  end

  # Returns the Base64-encoded version of +bin+.
  # This method complies with RFC 4648.
  # No line feeds are added.
  def strict_encode64(bin)
    [bin].pack("m0")
  end

  # Returns the Base64-decoded version of +str+.
  # This method complies with RFC 4648.
  # ArgumentError is raised if +str+ is incorrectly padded or contains
  # non-alphabet characters.  Note that CR or LF are also rejected.
  def strict_decode64(str)
    str.unpack1("m0")
  end

  # Returns the Base64-encoded version of +bin+.
  # This method complies with ``Base 64 Encoding with URL and Filename Safe
  # Alphabet'' in RFC 4648.
  # The alphabet uses '-' instead of '+' and '_' instead of '/'.
  # Note that the result can still contain '='.
  # You can remove the padding by setting +padding+ as false.
  def urlsafe_encode64(bin, padding: true)
    str = strict_encode64(bin)
    str.chomp!("==") or str.chomp!("=") unless padding
    str.tr!("+/", "-_")
    str
  end

  # Returns the Base64-decoded version of +str+.
  # This method complies with ``Base 64 Encoding with URL and Filename Safe
  # Alphabet'' in RFC 4648.
  # The alphabet uses '-' instead of '+' and '_' instead of '/'.
  #
  # The padding character is optional.
  # This method accepts both correctly-padded and unpadded input.
  # Note that it still rejects incorrectly-padded input.
  def urlsafe_decode64(str)
    # NOTE: RFC 4648 does say nothing about unpadded input, but says that
    # "the excess pad characters MAY also be ignored", so it is inferred that
    # unpadded input is also acceptable.
    if !str.end_with?("=") && str.length % 4 != 0
      str = str.ljust((str.length + 3) & ~3, "=")
      str.tr!("-_", "+/")
    else
      str = str.tr("-_", "+/")
    end
    strict_decode64(str)
  end
end
PK#}$[�6g  ruby/syslog/logger.rbnu�[���# frozen_string_literal: false
require 'syslog'
require 'logger'

##
# Syslog::Logger is a Logger work-alike that logs via syslog instead of to a
# file.  You can use Syslog::Logger to aggregate logs between multiple
# machines.
#
# By default, Syslog::Logger uses the program name 'ruby', but this can be
# changed via the first argument to Syslog::Logger.new.
#
# NOTE! You can only set the Syslog::Logger program name when you initialize
# Syslog::Logger for the first time.  This is a limitation of the way
# Syslog::Logger uses syslog (and in some ways, a limitation of the way
# syslog(3) works).  Attempts to change Syslog::Logger's program name after
# the first initialization will be ignored.
#
# === Example
#
# The following will log to syslogd on your local machine:
#
#   require 'syslog/logger'
#
#   log = Syslog::Logger.new 'my_program'
#   log.info 'this line will be logged via syslog(3)'
#
# Also the facility may be set to specify the facility level which will be used:
#
#   log.info 'this line will be logged using Syslog default facility level'
#
#   log_local1 = Syslog::Logger.new 'my_program', Syslog::LOG_LOCAL1
#   log_local1.info 'this line will be logged using local1 facility level'
#
#
# You may need to perform some syslog.conf setup first.  For a BSD machine add
# the following lines to /etc/syslog.conf:
#
#  !my_program
#  *.*                                             /var/log/my_program.log
#
# Then touch /var/log/my_program.log and signal syslogd with a HUP
# (killall -HUP syslogd, on FreeBSD).
#
# If you wish to have logs automatically roll over and archive, see the
# newsyslog.conf(5) and newsyslog(8) man pages.

class Syslog::Logger
  # Default formatter for log messages.
  class Formatter
    def call severity, time, progname, msg
      clean msg
    end

    private

    ##
    # Clean up messages so they're nice and pretty.

    def clean message
      message = message.to_s.strip
      message.gsub!(/\e\[[0-9;]*m/, '') # remove useless ansi color codes
      return message
    end
  end

  ##
  # The version of Syslog::Logger you are using.

  VERSION = '2.1.0'

  ##
  # Maps Logger warning types to syslog(3) warning types.
  #
  # Messages from Ruby applications are not considered as critical as messages
  # from other system daemons using syslog(3), so most messages are reduced by
  # one level.  For example, a fatal message for Ruby's Logger is considered
  # an error for syslog(3).

  LEVEL_MAP = {
    ::Logger::UNKNOWN => Syslog::LOG_ALERT,
    ::Logger::FATAL   => Syslog::LOG_ERR,
    ::Logger::ERROR   => Syslog::LOG_WARNING,
    ::Logger::WARN    => Syslog::LOG_NOTICE,
    ::Logger::INFO    => Syslog::LOG_INFO,
    ::Logger::DEBUG   => Syslog::LOG_DEBUG,
  }

  ##
  # Returns the internal Syslog object that is initialized when the
  # first instance is created.

  def self.syslog
    @@syslog
  end

  ##
  # Specifies the internal Syslog object to be used.

  def self.syslog= syslog
    @@syslog = syslog
  end

  ##
  # Builds a methods for level +meth+.

  def self.make_methods meth
    level = ::Logger.const_get(meth.upcase)
    eval <<-EOM, nil, __FILE__, __LINE__ + 1
      def #{meth}(message = nil, &block)
        add(#{level}, message, &block)
      end

      def #{meth}?
        level <= #{level}
      end
    EOM
  end

  ##
  # :method: unknown
  #
  # Logs a +message+ at the unknown (syslog alert) log level, or logs the
  # message returned from the block.

  ##
  # :method: fatal
  #
  # Logs a +message+ at the fatal (syslog err) log level, or logs the message
  # returned from the block.

  ##
  # :method: error
  #
  # Logs a +message+ at the error (syslog warning) log level, or logs the
  # message returned from the block.

  ##
  # :method: warn
  #
  # Logs a +message+ at the warn (syslog notice) log level, or logs the
  # message returned from the block.

  ##
  # :method: info
  #
  # Logs a +message+ at the info (syslog info) log level, or logs the message
  # returned from the block.

  ##
  # :method: debug
  #
  # Logs a +message+ at the debug (syslog debug) log level, or logs the
  # message returned from the block.

  Logger::Severity::constants.each do |severity|
    make_methods severity.downcase
  end

  ##
  # Log level for Logger compatibility.

  attr_accessor :level

  # Logging formatter, as a +Proc+ that will take four arguments and
  # return the formatted message. The arguments are:
  #
  # +severity+:: The Severity of the log message.
  # +time+:: A Time instance representing when the message was logged.
  # +progname+:: The #progname configured, or passed to the logger method.
  # +msg+:: The _Object_ the user passed to the log message; not necessarily a
  #         String.
  #
  # The block should return an Object that can be written to the logging
  # device via +write+.  The default formatter is used when no formatter is
  # set.
  attr_accessor :formatter

  ##
  # The facility argument is used to specify what type of program is logging the message.

  attr_accessor :facility

  ##
  # Fills in variables for Logger compatibility.  If this is the first
  # instance of Syslog::Logger, +program_name+ may be set to change the logged
  # program name. The +facility+ may be set to specify the facility level which will be used.
  #
  # Due to the way syslog works, only one program name may be chosen.

  def initialize program_name = 'ruby', facility = nil
    @level = ::Logger::DEBUG
    @formatter = Formatter.new

    @@syslog ||= Syslog.open(program_name)

    @facility = (facility || @@syslog.facility)
  end

  ##
  # Almost duplicates Logger#add.  +progname+ is ignored.

  def add severity, message = nil, progname = nil, &block
    severity ||= ::Logger::UNKNOWN
    level <= severity and
      @@syslog.log( (LEVEL_MAP[severity] | @facility), '%s', formatter.call(severity, Time.now, progname, (message || block.call)) )
    true
  end
end
PK��$[zރ��man/man3/pcrestack.3nu�[���.TH PCRESTACK 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH "PCRE DISCUSSION OF STACK USAGE"
.rs
.sp
When you call \fBpcre_exec()\fP, it makes use of an internal function called
\fBmatch()\fP. This calls itself recursively at branch points in the pattern,
in order to remember the state of the match so that it can back up and try a
different alternative if the first one fails. As matching proceeds deeper and
deeper into the tree of possibilities, the recursion depth increases.
.P
Not all calls of \fBmatch()\fP increase the recursion depth; for an item such
as a* it may be called several times at the same level, after matching
different numbers of a's. Furthermore, in a number of cases where the result of
the recursive call would immediately be passed back as the result of the
current call (a "tail recursion"), the function is just restarted instead.
.P
The \fBpcre_dfa_exec()\fP function operates in an entirely different way, and
uses recursion only when there is a regular expression recursion or subroutine
call in the pattern. This includes the processing of assertion and "once-only"
subpatterns, which are handled like subroutine calls. Normally, these are never
very deep, and the limit on the complexity of \fBpcre_dfa_exec()\fP is
controlled by the amount of workspace it is given. However, it is possible to
write patterns with runaway infinite recursions; such patterns will cause
\fBpcre_dfa_exec()\fP to run out of stack. At present, there is no protection
against this.
.P
The comments that follow do NOT apply to \fBpcre_dfa_exec()\fP; they are
relevant only for \fBpcre_exec()\fP.
.
.
.SS "Reducing \fBpcre_exec()\fP's stack usage"
.rs
.sp
Each time that \fBmatch()\fP is actually called recursively, it uses memory
from the process stack. For certain kinds of pattern and data, very large
amounts of stack may be needed, despite the recognition of "tail recursion".
You can often reduce the amount of recursion, and therefore the amount of stack
used, by modifying the pattern that is being matched. Consider, for example,
this pattern:
.sp
  ([^<]|<(?!inet))+
.sp
It matches from wherever it starts until it encounters "<inet" or the end of
the data, and is the kind of pattern that might be used when processing an XML
file. Each iteration of the outer parentheses matches either one character that
is not "<" or a "<" that is not followed by "inet". However, each time a
parenthesis is processed, a recursion occurs, so this formulation uses a stack
frame for each matched character. For a long string, a lot of stack is
required. Consider now this rewritten pattern, which matches exactly the same
strings:
.sp
  ([^<]++|<(?!inet))+
.sp
This uses very much less stack, because runs of characters that do not contain
"<" are "swallowed" in one item inside the parentheses. Recursion happens only
when a "<" character that is not followed by "inet" is encountered (and we
assume this is relatively rare). A possessive quantifier is used to stop any
backtracking into the runs of non-"<" characters, but that is not related to
stack usage.
.P
This example shows that one way of avoiding stack problems when matching long
subject strings is to write repeated parenthesized subpatterns to match more
than one character whenever possible.
.
.
.SS "Compiling PCRE to use heap instead of stack for \fBpcre_exec()\fP"
.rs
.sp
In environments where stack memory is constrained, you might want to compile
PCRE to use heap memory instead of stack for remembering back-up points when
\fBpcre_exec()\fP is running. This makes it run a lot more slowly, however.
Details of how to do this are given in the
.\" HREF
\fBpcrebuild\fP
.\"
documentation. When built in this way, instead of using the stack, PCRE obtains
and frees memory by calling the functions that are pointed to by the
\fBpcre_stack_malloc\fP and \fBpcre_stack_free\fP variables. By default, these
point to \fBmalloc()\fP and \fBfree()\fP, but you can replace the pointers to
cause PCRE to use your own functions. Since the block sizes are always the
same, and are always freed in reverse order, it may be possible to implement
customized memory handlers that are more efficient than the standard functions.
.
.
.SS "Limiting \fBpcre_exec()\fP's stack usage"
.rs
.sp
You can set limits on the number of times that \fBmatch()\fP is called, both in
total and recursively. If a limit is exceeded, \fBpcre_exec()\fP returns an
error code. Setting suitable limits should prevent it from running out of
stack. The default values of the limits are very large, and unlikely ever to
operate. They can be changed when PCRE is built, and they can also be set when
\fBpcre_exec()\fP is called. For details of these interfaces, see the
.\" HREF
\fBpcrebuild\fP
.\"
documentation and the
.\" HTML <a href="pcreapi.html#extradata">
.\" </a>
section on extra data for \fBpcre_exec()\fP
.\"
in the
.\" HREF
\fBpcreapi\fP
.\"
documentation.
.P
As a very rough rule of thumb, you should reckon on about 500 bytes per
recursion. Thus, if you want to limit your stack usage to 8Mb, you
should set the limit at 16000 recursions. A 64Mb stack, on the other hand, can
support around 128000 recursions.
.P
In Unix-like environments, the \fBpcretest\fP test program has a command line
option (\fB-S\fP) that can be used to increase the size of its stack. As long
as the stack is large enough, another option (\fB-M\fP) can be used to find the
smallest limits that allow a particular pattern to match a given subject
string. This is done by calling \fBpcre_exec()\fP repeatedly with different
limits.
.
.
.SS "Changing stack size in Unix-like systems"
.rs
.sp
In Unix-like environments, there is not often a problem with the stack unless
very long strings are involved, though the default limit on stack size varies
from system to system. Values from 8Mb to 64Mb are common. You can find your
default limit by running the command:
.sp
  ulimit -s
.sp
Unfortunately, the effect of running out of stack is often SIGSEGV, though
sometimes a more explicit error message is given. You can normally increase the
limit on stack size by code such as this:
.sp
  struct rlimit rlim;
  getrlimit(RLIMIT_STACK, &rlim);
  rlim.rlim_cur = 100*1024*1024;
  setrlimit(RLIMIT_STACK, &rlim);
.sp
This reads the current limits (soft and hard) using \fBgetrlimit()\fP, then
attempts to increase the soft limit to 100Mb using \fBsetrlimit()\fP. You must
do this before calling \fBpcre_exec()\fP.
.
.
.SS "Changing stack size in Mac OS X"
.rs
.sp
Using \fBsetrlimit()\fP, as described above, should also work on Mac OS X. It
is also possible to set a stack size when linking a program. There is a
discussion about stack sizes in Mac OS X at this web site:
.\" HTML <a href="http://developer.apple.com/qa/qa2005/qa1419.html">
.\" </a>
http://developer.apple.com/qa/qa2005/qa1419.html.
.\"
.
.
.SH AUTHOR
.rs
.sp
.nf
Philip Hazel
University Computing Service
Cambridge CB2 3QH, England.
.fi
.
.
.SH REVISION
.rs
.sp
.nf
Last updated: 03 January 2010
Copyright (c) 1997-2010 University of Cambridge.
.fi
PK��$[��xx'man/man3/pcre_get_stringtable_entries.3nu�[���.TH PCRE_GET_STRINGTABLE_ENTRIES 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B int pcre_get_stringtable_entries(const pcre *\fIcode\fP,
.ti +5n
.B const char *\fIname\fP, char **\fIfirst\fP, char **\fIlast\fP);
.
.SH DESCRIPTION
.rs
.sp
This convenience function finds, for a compiled pattern, the first and last
entries for a given name in the table that translates capturing parenthesis
names into numbers. When names are required to be unique (PCRE_DUPNAMES is
\fInot\fP set), it is usually easier to use \fBpcre_get_stringnumber()\fP
instead.
.sp
  \fIcode\fP    Compiled regular expression
  \fIname\fP    Name whose entries required
  \fIfirst\fP   Where to return a pointer to the first entry
  \fIlast\fP    Where to return a pointer to the last entry
.sp
The yield of the function is the length of each entry, or
PCRE_ERROR_NOSUBSTRING if none are found.
.P
There is a complete description of the PCRE native API, including the format of
the table entries, in the
.\" HREF
\fBpcreapi\fP
.\"
page, and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fP
.\"
page.
PK��$[���man/man3/pcre_refcount.3nu�[���.TH PCRE_REFCOUNT 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B int pcre_refcount(pcre *\fIcode\fP, int \fIadjust\fP);
.
.SH DESCRIPTION
.rs
.sp
This function is used to maintain a reference count inside a data block that
contains a compiled pattern. Its arguments are:
.sp
  \fIcode\fP                      Compiled regular expression
  \fIadjust\fP                    Adjustment to reference value
.sp
The yield of the function is the adjusted reference value, which is constrained
to lie between 0 and 65535.
.P
There is a complete description of the PCRE native API in the
.\" HREF
\fBpcreapi\fP
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fP
.\"
page.
PK��$[2�Y��man/man3/pcre_maketables.3nu�[���.TH PCRE_MAKETABLES 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B const unsigned char *pcre_maketables(void);
.
.SH DESCRIPTION
.rs
.sp
This function builds a set of character tables for character values less than
256. These can be passed to \fBpcre_compile()\fP to override PCRE's internal,
built-in tables (which were made by \fBpcre_maketables()\fP when PCRE was
compiled). You might want to do this if you are using a non-standard locale.
The function yields a pointer to the tables.
.P
There is a complete description of the PCRE native API in the
.\" HREF
\fBpcreapi\fP
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fP
.\"
page.
PK��$[��>��man/man3/pcre_compile.3nu�[���.TH PCRE_COMPILE 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B pcre *pcre_compile(const char *\fIpattern\fP, int \fIoptions\fP,
.ti +5n
.B const char **\fIerrptr\fP, int *\fIerroffset\fP,
.ti +5n
.B const unsigned char *\fItableptr\fP);
.
.SH DESCRIPTION
.rs
.sp
This function compiles a regular expression into an internal form. It is the
same as \fBpcre_compile2()\fP, except for the absence of the \fIerrorcodeptr\fP
argument. Its arguments are:
.sp
  \fIpattern\fR       A zero-terminated string containing the
                  regular expression to be compiled
  \fIoptions\fR       Zero or more option bits
  \fIerrptr\fR        Where to put an error message
  \fIerroffset\fR     Offset in pattern where error was found
  \fItableptr\fR      Pointer to character tables, or NULL to
                  use the built-in default
.sp
The option bits are:
.sp
  PCRE_ANCHORED           Force pattern anchoring
  PCRE_AUTO_CALLOUT       Compile automatic callouts
  PCRE_BSR_ANYCRLF        \eR matches only CR, LF, or CRLF
  PCRE_BSR_UNICODE        \eR matches all Unicode line endings
  PCRE_CASELESS           Do caseless matching
  PCRE_DOLLAR_ENDONLY     $ not to match newline at end
  PCRE_DOTALL             . matches anything including NL
  PCRE_DUPNAMES           Allow duplicate names for subpatterns
  PCRE_EXTENDED           Ignore whitespace and # comments
  PCRE_EXTRA              PCRE extra features
                            (not much use currently)
  PCRE_FIRSTLINE          Force matching to be before newline
  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility
  PCRE_MULTILINE          ^ and $ match newlines within data
  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence
  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline
                            sequences
  PCRE_NEWLINE_CR         Set CR as the newline sequence
  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence
  PCRE_NEWLINE_LF         Set LF as the newline sequence
  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-
                            theses (named ones available)
  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8
                            validity (only relevant if
                            PCRE_UTF8 is set)
  PCRE_UNGREEDY           Invert greediness of quantifiers
  PCRE_UTF8               Run in UTF-8 mode
.sp
PCRE must be built with UTF-8 support in order to use PCRE_UTF8 and
PCRE_NO_UTF8_CHECK.
.P
The yield of the function is a pointer to a private data structure that
contains the compiled pattern, or NULL if an error was detected. Note that
compiling regular expressions with one version of PCRE for use with a different
version is not guaranteed to work and may cause crashes.
.P
There is a complete description of the PCRE native API in the
.\" HREF
\fBpcreapi\fR
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fR
.\"
page.
PK��$[�
�:��$man/man3/pcre_copy_named_substring.3nu�[���.TH PCRE_COPY_NAMED_SUBSTRING 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B int pcre_copy_named_substring(const pcre *\fIcode\fP,
.ti +5n
.B const char *\fIsubject\fP, int *\fIovector\fP,
.ti +5n
.B int \fIstringcount\fP, const char *\fIstringname\fP,
.ti +5n
.B char *\fIbuffer\fP, int \fIbuffersize\fP);
.
.SH DESCRIPTION
.rs
.sp
This is a convenience function for extracting a captured substring, identified
by name, into a given buffer. The arguments are:
.sp
  \fIcode\fP          Pattern that was successfully matched
  \fIsubject\fP       Subject that has been successfully matched
  \fIovector\fP       Offset vector that \fBpcre_exec()\fP used
  \fIstringcount\fP   Value returned by \fBpcre_exec()\fP
  \fIstringname\fP    Name of the required substring
  \fIbuffer\fP        Buffer to receive the string
  \fIbuffersize\fP    Size of buffer
.sp
The yield is the length of the substring, PCRE_ERROR_NOMEMORY if the buffer was
too small, or PCRE_ERROR_NOSUBSTRING if the string name is invalid.
.P
There is a complete description of the PCRE native API in the
.\" HREF
\fBpcreapi\fP
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fP
.\"
page.
PK��$[���llman/man3/pcre_study.3nu�[���.TH PCRE_STUDY 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B pcre_extra *pcre_study(const pcre *\fIcode\fP, int \fIoptions\fP,
.ti +5n
.B const char **\fIerrptr\fP);
.
.SH DESCRIPTION
.rs
.sp
This function studies a compiled pattern, to see if additional information can
be extracted that might speed up matching. Its arguments are:
.sp
  \fIcode\fP       A compiled regular expression
  \fIoptions\fP    Options for \fBpcre_study()\fP
  \fIerrptr\fP     Where to put an error message
.sp
If the function succeeds, it returns a value that can be passed to
\fBpcre_exec()\fP via its \fIextra\fP argument.
.P
If the function returns NULL, either it could not find any additional
information, or there was an error. You can tell the difference by looking at
the error value. It is NULL in first case.
.P
There are currently no options defined; the value of the second argument should
always be zero.
.P
There is a complete description of the PCRE native API in the
.\" HREF
\fBpcreapi\fP
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fP
.\"
page.
PK��$[�#�*��man/man3/pcre_get_substring.3nu�[���.TH PCRE_GET_SUBSTRING 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B int pcre_get_substring(const char *\fIsubject\fP, int *\fIovector\fP,
.ti +5n
.B int \fIstringcount\fP, int \fIstringnumber\fP,
.ti +5n
.B const char **\fIstringptr\fP);
.
.SH DESCRIPTION
.rs
.sp
This is a convenience function for extracting a captured substring. The
arguments are:
.sp
  \fIsubject\fP       Subject that has been successfully matched
  \fIovector\fP       Offset vector that \fBpcre_exec()\fP used
  \fIstringcount\fP   Value returned by \fBpcre_exec()\fP
  \fIstringnumber\fP  Number of the required substring
  \fIstringptr\fP     Where to put the string pointer
.sp
The memory in which the substring is placed is obtained by calling
\fBpcre_malloc()\fP. The convenience function \fBpcre_free_substring()\fP can
be used to free it when it is no longer needed. The yield of the function is
the length of the substring, PCRE_ERROR_NOMEMORY if sufficient memory could not
be obtained, or PCRE_ERROR_NOSUBSTRING if the string number is invalid.
.P
There is a complete description of the PCRE native API in the
.\" HREF
\fBpcreapi\fP
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fP
.\"
page.
PK��$['������man/man3/pcrepattern.3nu�[���.TH PCREPATTERN 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH "PCRE REGULAR EXPRESSION DETAILS"
.rs
.sp
The syntax and semantics of the regular expressions that are supported by PCRE
are described in detail below. There is a quick-reference syntax summary in the
.\" HREF
\fBpcresyntax\fP
.\"
page. PCRE tries to match Perl syntax and semantics as closely as it can. PCRE
also supports some alternative regular expression syntax (which does not
conflict with the Perl syntax) in order to provide some compatibility with
regular expressions in Python, .NET, and Oniguruma.
.P
Perl's regular expressions are described in its own documentation, and
regular expressions in general are covered in a number of books, some of which
have copious examples. Jeffrey Friedl's "Mastering Regular Expressions",
published by O'Reilly, covers regular expressions in great detail. This
description of PCRE's regular expressions is intended as reference material.
.P
The original operation of PCRE was on strings of one-byte characters. However,
there is now also support for UTF-8 character strings. To use this,
PCRE must be built to include UTF-8 support, and you must call
\fBpcre_compile()\fP or \fBpcre_compile2()\fP with the PCRE_UTF8 option. There
is also a special sequence that can be given at the start of a pattern:
.sp
  (*UTF8)
.sp
Starting a pattern with this sequence is equivalent to setting the PCRE_UTF8
option. This feature is not Perl-compatible. How setting UTF-8 mode affects
pattern matching is mentioned in several places below. There is also a summary
of UTF-8 features in the
.\" HTML <a href="pcre.html#utf8support">
.\" </a>
section on UTF-8 support
.\"
in the main
.\" HREF
\fBpcre\fP
.\"
page.
.P
The remainder of this document discusses the patterns that are supported by
PCRE when its main matching function, \fBpcre_exec()\fP, is used.
From release 6.0, PCRE offers a second matching function,
\fBpcre_dfa_exec()\fP, which matches using a different algorithm that is not
Perl-compatible. Some of the features discussed below are not available when
\fBpcre_dfa_exec()\fP is used. The advantages and disadvantages of the
alternative function, and how it differs from the normal function, are
discussed in the
.\" HREF
\fBpcrematching\fP
.\"
page.
.
.
.SH "NEWLINE CONVENTIONS"
.rs
.sp
PCRE supports five different conventions for indicating line breaks in
strings: a single CR (carriage return) character, a single LF (linefeed)
character, the two-character sequence CRLF, any of the three preceding, or any
Unicode newline sequence. The
.\" HREF
\fBpcreapi\fP
.\"
page has
.\" HTML <a href="pcreapi.html#newlines">
.\" </a>
further discussion
.\"
about newlines, and shows how to set the newline convention in the
\fIoptions\fP arguments for the compiling and matching functions.
.P
It is also possible to specify a newline convention by starting a pattern
string with one of the following five sequences:
.sp
  (*CR)        carriage return
  (*LF)        linefeed
  (*CRLF)      carriage return, followed by linefeed
  (*ANYCRLF)   any of the three above
  (*ANY)       all Unicode newline sequences
.sp
These override the default and the options given to \fBpcre_compile()\fP or
\fBpcre_compile2()\fP. For example, on a Unix system where LF is the default
newline sequence, the pattern
.sp
  (*CR)a.b
.sp
changes the convention to CR. That pattern matches "a\enb" because LF is no
longer a newline. Note that these special settings, which are not
Perl-compatible, are recognized only at the very start of a pattern, and that
they must be in upper case. If more than one of them is present, the last one
is used.
.P
The newline convention does not affect what the \eR escape sequence matches. By
default, this is any Unicode newline sequence, for Perl compatibility. However,
this can be changed; see the description of \eR in the section entitled
.\" HTML <a href="#newlineseq">
.\" </a>
"Newline sequences"
.\"
below. A change of \eR setting can be combined with a change of newline
convention.
.
.
.SH "CHARACTERS AND METACHARACTERS"
.rs
.sp
A regular expression is a pattern that is matched against a subject string from
left to right. Most characters stand for themselves in a pattern, and match the
corresponding characters in the subject. As a trivial example, the pattern
.sp
  The quick brown fox
.sp
matches a portion of a subject string that is identical to itself. When
caseless matching is specified (the PCRE_CASELESS option), letters are matched
independently of case. In UTF-8 mode, PCRE always understands the concept of
case for characters whose values are less than 128, so caseless matching is
always possible. For characters with higher values, the concept of case is
supported if PCRE is compiled with Unicode property support, but not otherwise.
If you want to use caseless matching for characters 128 and above, you must
ensure that PCRE is compiled with Unicode property support as well as with
UTF-8 support.
.P
The power of regular expressions comes from the ability to include alternatives
and repetitions in the pattern. These are encoded in the pattern by the use of
\fImetacharacters\fP, which do not stand for themselves but instead are
interpreted in some special way.
.P
There are two different sets of metacharacters: those that are recognized
anywhere in the pattern except within square brackets, and those that are
recognized within square brackets. Outside square brackets, the metacharacters
are as follows:
.sp
  \e      general escape character with several uses
  ^      assert start of string (or line, in multiline mode)
  $      assert end of string (or line, in multiline mode)
  .      match any character except newline (by default)
  [      start character class definition
  |      start of alternative branch
  (      start subpattern
  )      end subpattern
  ?      extends the meaning of (
         also 0 or 1 quantifier
         also quantifier minimizer
  *      0 or more quantifier
  +      1 or more quantifier
         also "possessive quantifier"
  {      start min/max quantifier
.sp
Part of a pattern that is in square brackets is called a "character class". In
a character class the only metacharacters are:
.sp
  \e      general escape character
  ^      negate the class, but only if the first character
  -      indicates character range
.\" JOIN
  [      POSIX character class (only if followed by POSIX
           syntax)
  ]      terminates the character class
.sp
The following sections describe the use of each of the metacharacters.
.
.
.SH BACKSLASH
.rs
.sp
The backslash character has several uses. Firstly, if it is followed by a
non-alphanumeric character, it takes away any special meaning that character
may have. This use of backslash as an escape character applies both inside and
outside character classes.
.P
For example, if you want to match a * character, you write \e* in the pattern.
This escaping action applies whether or not the following character would
otherwise be interpreted as a metacharacter, so it is always safe to precede a
non-alphanumeric with backslash to specify that it stands for itself. In
particular, if you want to match a backslash, you write \e\e.
.P
If a pattern is compiled with the PCRE_EXTENDED option, whitespace in the
pattern (other than in a character class) and characters between a # outside
a character class and the next newline are ignored. An escaping backslash can
be used to include a whitespace or # character as part of the pattern.
.P
If you want to remove the special meaning from a sequence of characters, you
can do so by putting them between \eQ and \eE. This is different from Perl in
that $ and @ are handled as literals in \eQ...\eE sequences in PCRE, whereas in
Perl, $ and @ cause variable interpolation. Note the following examples:
.sp
  Pattern            PCRE matches   Perl matches
.sp
.\" JOIN
  \eQabc$xyz\eE        abc$xyz        abc followed by the
                                      contents of $xyz
  \eQabc\e$xyz\eE       abc\e$xyz       abc\e$xyz
  \eQabc\eE\e$\eQxyz\eE   abc$xyz        abc$xyz
.sp
The \eQ...\eE sequence is recognized both inside and outside character classes.
.
.
.\" HTML <a name="digitsafterbackslash"></a>
.SS "Non-printing characters"
.rs
.sp
A second use of backslash provides a way of encoding non-printing characters
in patterns in a visible manner. There is no restriction on the appearance of
non-printing characters, apart from the binary zero that terminates a pattern,
but when a pattern is being prepared by text editing, it is often easier to use
one of the following escape sequences than the binary character it represents:
.sp
  \ea        alarm, that is, the BEL character (hex 07)
  \ecx       "control-x", where x is any character
  \ee        escape (hex 1B)
  \ef        formfeed (hex 0C)
  \en        linefeed (hex 0A)
  \er        carriage return (hex 0D)
  \et        tab (hex 09)
  \eddd      character with octal code ddd, or back reference
  \exhh      character with hex code hh
  \ex{hhh..} character with hex code hhh..
.sp
The precise effect of \ecx is as follows: if x is a lower case letter, it
is converted to upper case. Then bit 6 of the character (hex 40) is inverted.
Thus \ecz becomes hex 1A, but \ec{ becomes hex 3B, while \ec; becomes hex
7B.
.P
After \ex, from zero to two hexadecimal digits are read (letters can be in
upper or lower case). Any number of hexadecimal digits may appear between \ex{
and }, but the value of the character code must be less than 256 in non-UTF-8
mode, and less than 2**31 in UTF-8 mode. That is, the maximum value in
hexadecimal is 7FFFFFFF. Note that this is bigger than the largest Unicode code
point, which is 10FFFF.
.P
If characters other than hexadecimal digits appear between \ex{ and }, or if
there is no terminating }, this form of escape is not recognized. Instead, the
initial \ex will be interpreted as a basic hexadecimal escape, with no
following digits, giving a character whose value is zero.
.P
Characters whose value is less than 256 can be defined by either of the two
syntaxes for \ex. There is no difference in the way they are handled. For
example, \exdc is exactly the same as \ex{dc}.
.P
After \e0 up to two further octal digits are read. If there are fewer than two
digits, just those that are present are used. Thus the sequence \e0\ex\e07
specifies two binary zeros followed by a BEL character (code value 7). Make
sure you supply two digits after the initial zero if the pattern character that
follows is itself an octal digit.
.P
The handling of a backslash followed by a digit other than 0 is complicated.
Outside a character class, PCRE reads it and any following digits as a decimal
number. If the number is less than 10, or if there have been at least that many
previous capturing left parentheses in the expression, the entire sequence is
taken as a \fIback reference\fP. A description of how this works is given
.\" HTML <a href="#backreferences">
.\" </a>
later,
.\"
following the discussion of
.\" HTML <a href="#subpattern">
.\" </a>
parenthesized subpatterns.
.\"
.P
Inside a character class, or if the decimal number is greater than 9 and there
have not been that many capturing subpatterns, PCRE re-reads up to three octal
digits following the backslash, and uses them to generate a data character. Any
subsequent digits stand for themselves. In non-UTF-8 mode, the value of a
character specified in octal must be less than \e400. In UTF-8 mode, values up
to \e777 are permitted. For example:
.sp
  \e040   is another way of writing a space
.\" JOIN
  \e40    is the same, provided there are fewer than 40
            previous capturing subpatterns
  \e7     is always a back reference
.\" JOIN
  \e11    might be a back reference, or another way of
            writing a tab
  \e011   is always a tab
  \e0113  is a tab followed by the character "3"
.\" JOIN
  \e113   might be a back reference, otherwise the
            character with octal code 113
.\" JOIN
  \e377   might be a back reference, otherwise
            the byte consisting entirely of 1 bits
.\" JOIN
  \e81    is either a back reference, or a binary zero
            followed by the two characters "8" and "1"
.sp
Note that octal values of 100 or greater must not be introduced by a leading
zero, because no more than three octal digits are ever read.
.P
All the sequences that define a single character value can be used both inside
and outside character classes. In addition, inside a character class, the
sequence \eb is interpreted as the backspace character (hex 08), and the
sequences \eR and \eX are interpreted as the characters "R" and "X",
respectively. Outside a character class, these sequences have different
meanings
.\" HTML <a href="#uniextseq">
.\" </a>
(see below).
.\"
.
.
.SS "Absolute and relative back references"
.rs
.sp
The sequence \eg followed by an unsigned or a negative number, optionally
enclosed in braces, is an absolute or relative back reference. A named back
reference can be coded as \eg{name}. Back references are discussed
.\" HTML <a href="#backreferences">
.\" </a>
later,
.\"
following the discussion of
.\" HTML <a href="#subpattern">
.\" </a>
parenthesized subpatterns.
.\"
.
.
.SS "Absolute and relative subroutine calls"
.rs
.sp
For compatibility with Oniguruma, the non-Perl syntax \eg followed by a name or
a number enclosed either in angle brackets or single quotes, is an alternative
syntax for referencing a subpattern as a "subroutine". Details are discussed
.\" HTML <a href="#onigurumasubroutines">
.\" </a>
later.
.\"
Note that \eg{...} (Perl syntax) and \eg<...> (Oniguruma syntax) are \fInot\fP
synonymous. The former is a back reference; the latter is a
.\" HTML <a href="#subpatternsassubroutines">
.\" </a>
subroutine
.\"
call.
.
.
.SS "Generic character types"
.rs
.sp
Another use of backslash is for specifying generic character types. The
following are always recognized:
.sp
  \ed     any decimal digit
  \eD     any character that is not a decimal digit
  \eh     any horizontal whitespace character
  \eH     any character that is not a horizontal whitespace character
  \es     any whitespace character
  \eS     any character that is not a whitespace character
  \ev     any vertical whitespace character
  \eV     any character that is not a vertical whitespace character
  \ew     any "word" character
  \eW     any "non-word" character
.sp
Each pair of escape sequences partitions the complete set of characters into
two disjoint sets. Any given character matches one, and only one, of each pair.
.P
These character type sequences can appear both inside and outside character
classes. They each match one character of the appropriate type. If the current
matching point is at the end of the subject string, all of them fail, since
there is no character to match.
.P
For compatibility with Perl, \es does not match the VT character (code 11).
This makes it different from the the POSIX "space" class. The \es characters
are HT (9), LF (10), FF (12), CR (13), and space (32). If "use locale;" is
included in a Perl script, \es may match the VT character. In PCRE, it never
does.
.P
In UTF-8 mode, characters with values greater than 128 never match \ed, \es, or
\ew, and always match \eD, \eS, and \eW. This is true even when Unicode
character property support is available. These sequences retain their original
meanings from before UTF-8 support was available, mainly for efficiency
reasons. Note that this also affects \eb, because it is defined in terms of \ew
and \eW.
.P
The sequences \eh, \eH, \ev, and \eV are Perl 5.10 features. In contrast to the
other sequences, these do match certain high-valued codepoints in UTF-8 mode.
The horizontal space characters are:
.sp
  U+0009     Horizontal tab
  U+0020     Space
  U+00A0     Non-break space
  U+1680     Ogham space mark
  U+180E     Mongolian vowel separator
  U+2000     En quad
  U+2001     Em quad
  U+2002     En space
  U+2003     Em space
  U+2004     Three-per-em space
  U+2005     Four-per-em space
  U+2006     Six-per-em space
  U+2007     Figure space
  U+2008     Punctuation space
  U+2009     Thin space
  U+200A     Hair space
  U+202F     Narrow no-break space
  U+205F     Medium mathematical space
  U+3000     Ideographic space
.sp
The vertical space characters are:
.sp
  U+000A     Linefeed
  U+000B     Vertical tab
  U+000C     Formfeed
  U+000D     Carriage return
  U+0085     Next line
  U+2028     Line separator
  U+2029     Paragraph separator
.P
A "word" character is an underscore or any character less than 256 that is a
letter or digit. The definition of letters and digits is controlled by PCRE's
low-valued character tables, and may vary if locale-specific matching is taking
place (see
.\" HTML <a href="pcreapi.html#localesupport">
.\" </a>
"Locale support"
.\"
in the
.\" HREF
\fBpcreapi\fP
.\"
page). For example, in a French locale such as "fr_FR" in Unix-like systems,
or "french" in Windows, some character codes greater than 128 are used for
accented letters, and these are matched by \ew. The use of locales with Unicode
is discouraged.
.
.
.\" HTML <a name="newlineseq"></a>
.SS "Newline sequences"
.rs
.sp
Outside a character class, by default, the escape sequence \eR matches any
Unicode newline sequence. This is a Perl 5.10 feature. In non-UTF-8 mode \eR is
equivalent to the following:
.sp
  (?>\er\en|\en|\ex0b|\ef|\er|\ex85)
.sp
This is an example of an "atomic group", details of which are given
.\" HTML <a href="#atomicgroup">
.\" </a>
below.
.\"
This particular group matches either the two-character sequence CR followed by
LF, or one of the single characters LF (linefeed, U+000A), VT (vertical tab,
U+000B), FF (formfeed, U+000C), CR (carriage return, U+000D), or NEL (next
line, U+0085). The two-character sequence is treated as a single unit that
cannot be split.
.P
In UTF-8 mode, two additional characters whose codepoints are greater than 255
are added: LS (line separator, U+2028) and PS (paragraph separator, U+2029).
Unicode character property support is not needed for these characters to be
recognized.
.P
It is possible to restrict \eR to match only CR, LF, or CRLF (instead of the
complete set of Unicode line endings) by setting the option PCRE_BSR_ANYCRLF
either at compile time or when the pattern is matched. (BSR is an abbrevation
for "backslash R".) This can be made the default when PCRE is built; if this is
the case, the other behaviour can be requested via the PCRE_BSR_UNICODE option.
It is also possible to specify these settings by starting a pattern string with
one of the following sequences:
.sp
  (*BSR_ANYCRLF)   CR, LF, or CRLF only
  (*BSR_UNICODE)   any Unicode newline sequence
.sp
These override the default and the options given to \fBpcre_compile()\fP or
\fBpcre_compile2()\fP, but they can be overridden by options given to
\fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. Note that these special settings,
which are not Perl-compatible, are recognized only at the very start of a
pattern, and that they must be in upper case. If more than one of them is
present, the last one is used. They can be combined with a change of newline
convention, for example, a pattern can start with:
.sp
  (*ANY)(*BSR_ANYCRLF)
.sp
Inside a character class, \eR matches the letter "R".
.
.
.\" HTML <a name="uniextseq"></a>
.SS Unicode character properties
.rs
.sp
When PCRE is built with Unicode character property support, three additional
escape sequences that match characters with specific properties are available.
When not in UTF-8 mode, these sequences are of course limited to testing
characters whose codepoints are less than 256, but they do work in this mode.
The extra escape sequences are:
.sp
  \ep{\fIxx\fP}   a character with the \fIxx\fP property
  \eP{\fIxx\fP}   a character without the \fIxx\fP property
  \eX       an extended Unicode sequence
.sp
The property names represented by \fIxx\fP above are limited to the Unicode
script names, the general category properties, and "Any", which matches any
character (including newline). Other properties such as "InMusicalSymbols" are
not currently supported by PCRE. Note that \eP{Any} does not match any
characters, so always causes a match failure.
.P
Sets of Unicode characters are defined as belonging to certain scripts. A
character from one of these sets can be matched using a script name. For
example:
.sp
  \ep{Greek}
  \eP{Han}
.sp
Those that are not part of an identified script are lumped together as
"Common". The current list of scripts is:
.P
Arabic,
Armenian,
Avestan,
Balinese,
Bamum,
Bengali,
Bopomofo,
Braille,
Buginese,
Buhid,
Canadian_Aboriginal,
Carian,
Cham,
Cherokee,
Common,
Coptic,
Cuneiform,
Cypriot,
Cyrillic,
Deseret,
Devanagari,
Egyptian_Hieroglyphs,
Ethiopic,
Georgian,
Glagolitic,
Gothic,
Greek,
Gujarati,
Gurmukhi,
Han,
Hangul,
Hanunoo,
Hebrew,
Hiragana,
Imperial_Aramaic,
Inherited,
Inscriptional_Pahlavi,
Inscriptional_Parthian,
Javanese,
Kaithi,
Kannada,
Katakana,
Kayah_Li,
Kharoshthi,
Khmer,
Lao,
Latin,
Lepcha,
Limbu,
Linear_B,
Lisu,
Lycian,
Lydian,
Malayalam,
Meetei_Mayek,
Mongolian,
Myanmar,
New_Tai_Lue,
Nko,
Ogham,
Old_Italic,
Old_Persian,
Old_South_Arabian,
Old_Turkic,
Ol_Chiki,
Oriya,
Osmanya,
Phags_Pa,
Phoenician,
Rejang,
Runic,
Samaritan,
Saurashtra,
Shavian,
Sinhala,
Sundanese,
Syloti_Nagri,
Syriac,
Tagalog,
Tagbanwa,
Tai_Le,
Tai_Tham,
Tai_Viet,
Tamil,
Telugu,
Thaana,
Thai,
Tibetan,
Tifinagh,
Ugaritic,
Vai,
Yi.
.P
Each character has exactly one general category property, specified by a
two-letter abbreviation. For compatibility with Perl, negation can be specified
by including a circumflex between the opening brace and the property name. For
example, \ep{^Lu} is the same as \eP{Lu}.
.P
If only one letter is specified with \ep or \eP, it includes all the general
category properties that start with that letter. In this case, in the absence
of negation, the curly brackets in the escape sequence are optional; these two
examples have the same effect:
.sp
  \ep{L}
  \epL
.sp
The following general category property codes are supported:
.sp
  C     Other
  Cc    Control
  Cf    Format
  Cn    Unassigned
  Co    Private use
  Cs    Surrogate
.sp
  L     Letter
  Ll    Lower case letter
  Lm    Modifier letter
  Lo    Other letter
  Lt    Title case letter
  Lu    Upper case letter
.sp
  M     Mark
  Mc    Spacing mark
  Me    Enclosing mark
  Mn    Non-spacing mark
.sp
  N     Number
  Nd    Decimal number
  Nl    Letter number
  No    Other number
.sp
  P     Punctuation
  Pc    Connector punctuation
  Pd    Dash punctuation
  Pe    Close punctuation
  Pf    Final punctuation
  Pi    Initial punctuation
  Po    Other punctuation
  Ps    Open punctuation
.sp
  S     Symbol
  Sc    Currency symbol
  Sk    Modifier symbol
  Sm    Mathematical symbol
  So    Other symbol
.sp
  Z     Separator
  Zl    Line separator
  Zp    Paragraph separator
  Zs    Space separator
.sp
The special property L& is also supported: it matches a character that has
the Lu, Ll, or Lt property, in other words, a letter that is not classified as
a modifier or "other".
.P
The Cs (Surrogate) property applies only to characters in the range U+D800 to
U+DFFF. Such characters are not valid in UTF-8 strings (see RFC 3629) and so
cannot be tested by PCRE, unless UTF-8 validity checking has been turned off
(see the discussion of PCRE_NO_UTF8_CHECK in the
.\" HREF
\fBpcreapi\fP
.\"
page). Perl does not support the Cs property.
.P
The long synonyms for property names that Perl supports (such as \ep{Letter})
are not supported by PCRE, nor is it permitted to prefix any of these
properties with "Is".
.P
No character that is in the Unicode table has the Cn (unassigned) property.
Instead, this property is assumed for any code point that is not in the
Unicode table.
.P
Specifying caseless matching does not affect these escape sequences. For
example, \ep{Lu} always matches only upper case letters.
.P
The \eX escape matches any number of Unicode characters that form an extended
Unicode sequence. \eX is equivalent to
.sp
  (?>\ePM\epM*)
.sp
That is, it matches a character without the "mark" property, followed by zero
or more characters with the "mark" property, and treats the sequence as an
atomic group
.\" HTML <a href="#atomicgroup">
.\" </a>
(see below).
.\"
Characters with the "mark" property are typically accents that affect the
preceding character. None of them have codepoints less than 256, so in
non-UTF-8 mode \eX matches any one character.
.P
Matching characters by Unicode property is not fast, because PCRE has to search
a structure that contains data for over fifteen thousand characters. That is
why the traditional escape sequences such as \ed and \ew do not use Unicode
properties in PCRE.
.
.
.\" HTML <a name="resetmatchstart"></a>
.SS "Resetting the match start"
.rs
.sp
The escape sequence \eK, which is a Perl 5.10 feature, causes any previously
matched characters not to be included in the final matched sequence. For
example, the pattern:
.sp
  foo\eKbar
.sp
matches "foobar", but reports that it has matched "bar". This feature is
similar to a lookbehind assertion
.\" HTML <a href="#lookbehind">
.\" </a>
(described below).
.\"
However, in this case, the part of the subject before the real match does not
have to be of fixed length, as lookbehind assertions do. The use of \eK does
not interfere with the setting of
.\" HTML <a href="#subpattern">
.\" </a>
captured substrings.
.\"
For example, when the pattern
.sp
  (foo)\eKbar
.sp
matches "foobar", the first substring is still set to "foo".
.P
Perl documents that the use of \eK within assertions is "not well defined". In
PCRE, \eK is acted upon when it occurs inside positive assertions, but is
ignored in negative assertions.
.
.
.\" HTML <a name="smallassertions"></a>
.SS "Simple assertions"
.rs
.sp
The final use of backslash is for certain simple assertions. An assertion
specifies a condition that has to be met at a particular point in a match,
without consuming any characters from the subject string. The use of
subpatterns for more complicated assertions is described
.\" HTML <a href="#bigassertions">
.\" </a>
below.
.\"
The backslashed assertions are:
.sp
  \eb     matches at a word boundary
  \eB     matches when not at a word boundary
  \eA     matches at the start of the subject
  \eZ     matches at the end of the subject
          also matches before a newline at the end of the subject
  \ez     matches only at the end of the subject
  \eG     matches at the first matching position in the subject
.sp
These assertions may not appear in character classes (but note that \eb has a
different meaning, namely the backspace character, inside a character class).
.P
A word boundary is a position in the subject string where the current character
and the previous character do not both match \ew or \eW (i.e. one matches
\ew and the other matches \eW), or the start or end of the string if the
first or last character matches \ew, respectively. Neither PCRE nor Perl has a
separte "start of word" or "end of word" metasequence. However, whatever
follows \eb normally determines which it is. For example, the fragment
\eba matches "a" at the start of a word.
.P
The \eA, \eZ, and \ez assertions differ from the traditional circumflex and
dollar (described in the next section) in that they only ever match at the very
start and end of the subject string, whatever options are set. Thus, they are
independent of multiline mode. These three assertions are not affected by the
PCRE_NOTBOL or PCRE_NOTEOL options, which affect only the behaviour of the
circumflex and dollar metacharacters. However, if the \fIstartoffset\fP
argument of \fBpcre_exec()\fP is non-zero, indicating that matching is to start
at a point other than the beginning of the subject, \eA can never match. The
difference between \eZ and \ez is that \eZ matches before a newline at the end
of the string as well as at the very end, whereas \ez matches only at the end.
.P
The \eG assertion is true only when the current matching position is at the
start point of the match, as specified by the \fIstartoffset\fP argument of
\fBpcre_exec()\fP. It differs from \eA when the value of \fIstartoffset\fP is
non-zero. By calling \fBpcre_exec()\fP multiple times with appropriate
arguments, you can mimic Perl's /g option, and it is in this kind of
implementation where \eG can be useful.
.P
Note, however, that PCRE's interpretation of \eG, as the start of the current
match, is subtly different from Perl's, which defines it as the end of the
previous match. In Perl, these can be different when the previously matched
string was empty. Because PCRE does just one match at a time, it cannot
reproduce this behaviour.
.P
If all the alternatives of a pattern begin with \eG, the expression is anchored
to the starting match position, and the "anchored" flag is set in the compiled
regular expression.
.
.
.SH "CIRCUMFLEX AND DOLLAR"
.rs
.sp
Outside a character class, in the default matching mode, the circumflex
character is an assertion that is true only if the current matching point is
at the start of the subject string. If the \fIstartoffset\fP argument of
\fBpcre_exec()\fP is non-zero, circumflex can never match if the PCRE_MULTILINE
option is unset. Inside a character class, circumflex has an entirely different
meaning
.\" HTML <a href="#characterclass">
.\" </a>
(see below).
.\"
.P
Circumflex need not be the first character of the pattern if a number of
alternatives are involved, but it should be the first thing in each alternative
in which it appears if the pattern is ever to match that branch. If all
possible alternatives start with a circumflex, that is, if the pattern is
constrained to match only at the start of the subject, it is said to be an
"anchored" pattern. (There are also other constructs that can cause a pattern
to be anchored.)
.P
A dollar character is an assertion that is true only if the current matching
point is at the end of the subject string, or immediately before a newline
at the end of the string (by default). Dollar need not be the last character of
the pattern if a number of alternatives are involved, but it should be the last
item in any branch in which it appears. Dollar has no special meaning in a
character class.
.P
The meaning of dollar can be changed so that it matches only at the very end of
the string, by setting the PCRE_DOLLAR_ENDONLY option at compile time. This
does not affect the \eZ assertion.
.P
The meanings of the circumflex and dollar characters are changed if the
PCRE_MULTILINE option is set. When this is the case, a circumflex matches
immediately after internal newlines as well as at the start of the subject
string. It does not match after a newline that ends the string. A dollar
matches before any newlines in the string, as well as at the very end, when
PCRE_MULTILINE is set. When newline is specified as the two-character
sequence CRLF, isolated CR and LF characters do not indicate newlines.
.P
For example, the pattern /^abc$/ matches the subject string "def\enabc" (where
\en represents a newline) in multiline mode, but not otherwise. Consequently,
patterns that are anchored in single line mode because all branches start with
^ are not anchored in multiline mode, and a match for circumflex is possible
when the \fIstartoffset\fP argument of \fBpcre_exec()\fP is non-zero. The
PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set.
.P
Note that the sequences \eA, \eZ, and \ez can be used to match the start and
end of the subject in both modes, and if all branches of a pattern start with
\eA it is always anchored, whether or not PCRE_MULTILINE is set.
.
.
.SH "FULL STOP (PERIOD, DOT)"
.rs
.sp
Outside a character class, a dot in the pattern matches any one character in
the subject string except (by default) a character that signifies the end of a
line. In UTF-8 mode, the matched character may be more than one byte long.
.P
When a line ending is defined as a single character, dot never matches that
character; when the two-character sequence CRLF is used, dot does not match CR
if it is immediately followed by LF, but otherwise it matches all characters
(including isolated CRs and LFs). When any Unicode line endings are being
recognized, dot does not match CR or LF or any of the other line ending
characters.
.P
The behaviour of dot with regard to newlines can be changed. If the PCRE_DOTALL
option is set, a dot matches any one character, without exception. If the
two-character sequence CRLF is present in the subject string, it takes two dots
to match it.
.P
The handling of dot is entirely independent of the handling of circumflex and
dollar, the only relationship being that they both involve newlines. Dot has no
special meaning in a character class.
.
.
.SH "MATCHING A SINGLE BYTE"
.rs
.sp
Outside a character class, the escape sequence \eC matches any one byte, both
in and out of UTF-8 mode. Unlike a dot, it always matches any line-ending
characters. The feature is provided in Perl in order to match individual bytes
in UTF-8 mode. Because it breaks up UTF-8 characters into individual bytes,
what remains in the string may be a malformed UTF-8 string. For this reason,
the \eC escape sequence is best avoided.
.P
PCRE does not allow \eC to appear in lookbehind assertions
.\" HTML <a href="#lookbehind">
.\" </a>
(described below),
.\"
because in UTF-8 mode this would make it impossible to calculate the length of
the lookbehind.
.
.
.\" HTML <a name="characterclass"></a>
.SH "SQUARE BRACKETS AND CHARACTER CLASSES"
.rs
.sp
An opening square bracket introduces a character class, terminated by a closing
square bracket. A closing square bracket on its own is not special by default.
However, if the PCRE_JAVASCRIPT_COMPAT option is set, a lone closing square
bracket causes a compile-time error. If a closing square bracket is required as
a member of the class, it should be the first data character in the class
(after an initial circumflex, if present) or escaped with a backslash.
.P
A character class matches a single character in the subject. In UTF-8 mode, the
character may be more than one byte long. A matched character must be in the
set of characters defined by the class, unless the first character in the class
definition is a circumflex, in which case the subject character must not be in
the set defined by the class. If a circumflex is actually required as a member
of the class, ensure it is not the first character, or escape it with a
backslash.
.P
For example, the character class [aeiou] matches any lower case vowel, while
[^aeiou] matches any character that is not a lower case vowel. Note that a
circumflex is just a convenient notation for specifying the characters that
are in the class by enumerating those that are not. A class that starts with a
circumflex is not an assertion; it still consumes a character from the subject
string, and therefore it fails if the current pointer is at the end of the
string.
.P
In UTF-8 mode, characters with values greater than 255 can be included in a
class as a literal string of bytes, or by using the \ex{ escaping mechanism.
.P
When caseless matching is set, any letters in a class represent both their
upper case and lower case versions, so for example, a caseless [aeiou] matches
"A" as well as "a", and a caseless [^aeiou] does not match "A", whereas a
caseful version would. In UTF-8 mode, PCRE always understands the concept of
case for characters whose values are less than 128, so caseless matching is
always possible. For characters with higher values, the concept of case is
supported if PCRE is compiled with Unicode property support, but not otherwise.
If you want to use caseless matching in UTF8-mode for characters 128 and above,
you must ensure that PCRE is compiled with Unicode property support as well as
with UTF-8 support.
.P
Characters that might indicate line breaks are never treated in any special way
when matching character classes, whatever line-ending sequence is in use, and
whatever setting of the PCRE_DOTALL and PCRE_MULTILINE options is used. A class
such as [^a] always matches one of these characters.
.P
The minus (hyphen) character can be used to specify a range of characters in a
character class. For example, [d-m] matches any letter between d and m,
inclusive. If a minus character is required in a class, it must be escaped with
a backslash or appear in a position where it cannot be interpreted as
indicating a range, typically as the first or last character in the class.
.P
It is not possible to have the literal character "]" as the end character of a
range. A pattern such as [W-]46] is interpreted as a class of two characters
("W" and "-") followed by a literal string "46]", so it would match "W46]" or
"-46]". However, if the "]" is escaped with a backslash it is interpreted as
the end of range, so [W-\e]46] is interpreted as a class containing a range
followed by two other characters. The octal or hexadecimal representation of
"]" can also be used to end a range.
.P
Ranges operate in the collating sequence of character values. They can also be
used for characters specified numerically, for example [\e000-\e037]. In UTF-8
mode, ranges can include characters whose values are greater than 255, for
example [\ex{100}-\ex{2ff}].
.P
If a range that includes letters is used when caseless matching is set, it
matches the letters in either case. For example, [W-c] is equivalent to
[][\e\e^_`wxyzabc], matched caselessly, and in non-UTF-8 mode, if character
tables for a French locale are in use, [\exc8-\excb] matches accented E
characters in both cases. In UTF-8 mode, PCRE supports the concept of case for
characters with values greater than 128 only when it is compiled with Unicode
property support.
.P
The character types \ed, \eD, \ep, \eP, \es, \eS, \ew, and \eW may also appear
in a character class, and add the characters that they match to the class. For
example, [\edABCDEF] matches any hexadecimal digit. A circumflex can
conveniently be used with the upper case character types to specify a more
restricted set of characters than the matching lower case type. For example,
the class [^\eW_] matches any letter or digit, but not underscore.
.P
The only metacharacters that are recognized in character classes are backslash,
hyphen (only where it can be interpreted as specifying a range), circumflex
(only at the start), opening square bracket (only when it can be interpreted as
introducing a POSIX class name - see the next section), and the terminating
closing square bracket. However, escaping other non-alphanumeric characters
does no harm.
.
.
.SH "POSIX CHARACTER CLASSES"
.rs
.sp
Perl supports the POSIX notation for character classes. This uses names
enclosed by [: and :] within the enclosing square brackets. PCRE also supports
this notation. For example,
.sp
  [01[:alpha:]%]
.sp
matches "0", "1", any alphabetic character, or "%". The supported class names
are
.sp
  alnum    letters and digits
  alpha    letters
  ascii    character codes 0 - 127
  blank    space or tab only
  cntrl    control characters
  digit    decimal digits (same as \ed)
  graph    printing characters, excluding space
  lower    lower case letters
  print    printing characters, including space
  punct    printing characters, excluding letters and digits
  space    white space (not quite the same as \es)
  upper    upper case letters
  word     "word" characters (same as \ew)
  xdigit   hexadecimal digits
.sp
The "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13), and
space (32). Notice that this list includes the VT character (code 11). This
makes "space" different to \es, which does not include VT (for Perl
compatibility).
.P
The name "word" is a Perl extension, and "blank" is a GNU extension from Perl
5.8. Another Perl extension is negation, which is indicated by a ^ character
after the colon. For example,
.sp
  [12[:^digit:]]
.sp
matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the POSIX
syntax [.ch.] and [=ch=] where "ch" is a "collating element", but these are not
supported, and an error is given if they are encountered.
.P
In UTF-8 mode, characters with values greater than 128 do not match any of
the POSIX character classes.
.
.
.SH "VERTICAL BAR"
.rs
.sp
Vertical bar characters are used to separate alternative patterns. For example,
the pattern
.sp
  gilbert|sullivan
.sp
matches either "gilbert" or "sullivan". Any number of alternatives may appear,
and an empty alternative is permitted (matching the empty string). The matching
process tries each alternative in turn, from left to right, and the first one
that succeeds is used. If the alternatives are within a subpattern
.\" HTML <a href="#subpattern">
.\" </a>
(defined below),
.\"
"succeeds" means matching the rest of the main pattern as well as the
alternative in the subpattern.
.
.
.SH "INTERNAL OPTION SETTING"
.rs
.sp
The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and
PCRE_EXTENDED options (which are Perl-compatible) can be changed from within
the pattern by a sequence of Perl option letters enclosed between "(?" and ")".
The option letters are
.sp
  i  for PCRE_CASELESS
  m  for PCRE_MULTILINE
  s  for PCRE_DOTALL
  x  for PCRE_EXTENDED
.sp
For example, (?im) sets caseless, multiline matching. It is also possible to
unset these options by preceding the letter with a hyphen, and a combined
setting and unsetting such as (?im-sx), which sets PCRE_CASELESS and
PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also
permitted. If a letter appears both before and after the hyphen, the option is
unset.
.P
The PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA can be
changed in the same way as the Perl-compatible options by using the characters
J, U and X respectively.
.P
When one of these option changes occurs at top level (that is, not inside
subpattern parentheses), the change applies to the remainder of the pattern
that follows. If the change is placed right at the start of a pattern, PCRE
extracts it into the global options (and it will therefore show up in data
extracted by the \fBpcre_fullinfo()\fP function).
.P
An option change within a subpattern (see below for a description of
subpatterns) affects only that part of the current pattern that follows it, so
.sp
  (a(?i)b)c
.sp
matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used).
By this means, options can be made to have different settings in different
parts of the pattern. Any changes made in one alternative do carry on
into subsequent branches within the same subpattern. For example,
.sp
  (a(?i)b|c)
.sp
matches "ab", "aB", "c", and "C", even though when matching "C" the first
branch is abandoned before the option setting. This is because the effects of
option settings happen at compile time. There would be some very weird
behaviour otherwise.
.P
\fBNote:\fP There are other PCRE-specific options that can be set by the
application when the compile or match functions are called. In some cases the
pattern can contain special leading sequences such as (*CRLF) to override what
the application has set or what has been defaulted. Details are given in the
section entitled
.\" HTML <a href="#newlineseq">
.\" </a>
"Newline sequences"
.\"
above. There is also the (*UTF8) leading sequence that can be used to set UTF-8
mode; this is equivalent to setting the PCRE_UTF8 option.
.
.
.\" HTML <a name="subpattern"></a>
.SH SUBPATTERNS
.rs
.sp
Subpatterns are delimited by parentheses (round brackets), which can be nested.
Turning part of a pattern into a subpattern does two things:
.sp
1. It localizes a set of alternatives. For example, the pattern
.sp
  cat(aract|erpillar|)
.sp
matches one of the words "cat", "cataract", or "caterpillar". Without the
parentheses, it would match "cataract", "erpillar" or an empty string.
.sp
2. It sets up the subpattern as a capturing subpattern. This means that, when
the whole pattern matches, that portion of the subject string that matched the
subpattern is passed back to the caller via the \fIovector\fP argument of
\fBpcre_exec()\fP. Opening parentheses are counted from left to right (starting
from 1) to obtain numbers for the capturing subpatterns.
.P
For example, if the string "the red king" is matched against the pattern
.sp
  the ((red|white) (king|queen))
.sp
the captured substrings are "red king", "red", and "king", and are numbered 1,
2, and 3, respectively.
.P
The fact that plain parentheses fulfil two functions is not always helpful.
There are often times when a grouping subpattern is required without a
capturing requirement. If an opening parenthesis is followed by a question mark
and a colon, the subpattern does not do any capturing, and is not counted when
computing the number of any subsequent capturing subpatterns. For example, if
the string "the white queen" is matched against the pattern
.sp
  the ((?:red|white) (king|queen))
.sp
the captured substrings are "white queen" and "queen", and are numbered 1 and
2. The maximum number of capturing subpatterns is 65535.
.P
As a convenient shorthand, if any option settings are required at the start of
a non-capturing subpattern, the option letters may appear between the "?" and
the ":". Thus the two patterns
.sp
  (?i:saturday|sunday)
  (?:(?i)saturday|sunday)
.sp
match exactly the same set of strings. Because alternative branches are tried
from left to right, and options are not reset until the end of the subpattern
is reached, an option setting in one branch does affect subsequent branches, so
the above patterns match "SUNDAY" as well as "Saturday".
.
.
.\" HTML <a name="dupsubpatternnumber"></a>
.SH "DUPLICATE SUBPATTERN NUMBERS"
.rs
.sp
Perl 5.10 introduced a feature whereby each alternative in a subpattern uses
the same numbers for its capturing parentheses. Such a subpattern starts with
(?| and is itself a non-capturing subpattern. For example, consider this
pattern:
.sp
  (?|(Sat)ur|(Sun))day
.sp
Because the two alternatives are inside a (?| group, both sets of capturing
parentheses are numbered one. Thus, when the pattern matches, you can look
at captured substring number one, whichever alternative matched. This construct
is useful when you want to capture part, but not all, of one of a number of
alternatives. Inside a (?| group, parentheses are numbered as usual, but the
number is reset at the start of each branch. The numbers of any capturing
buffers that follow the subpattern start after the highest number used in any
branch. The following example is taken from the Perl documentation.
The numbers underneath show in which buffer the captured content will be
stored.
.sp
  # before  ---------------branch-reset----------- after
  / ( a )  (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x
  # 1            2         2  3        2     3     4
.sp
A back reference to a numbered subpattern uses the most recent value that is
set for that number by any subpattern. The following pattern matches "abcabc"
or "defdef":
.sp
  /(?|(abc)|(def))\e1/
.sp
In contrast, a recursive or "subroutine" call to a numbered subpattern always
refers to the first one in the pattern with the given number. The following
pattern matches "abcabc" or "defabc":
.sp
  /(?|(abc)|(def))(?1)/
.sp
If a
.\" HTML <a href="#conditions">
.\" </a>
condition test
.\"
for a subpattern's having matched refers to a non-unique number, the test is
true if any of the subpatterns of that number have matched.
.P
An alternative approach to using this "branch reset" feature is to use
duplicate named subpatterns, as described in the next section.
.
.
.SH "NAMED SUBPATTERNS"
.rs
.sp
Identifying capturing parentheses by number is simple, but it can be very hard
to keep track of the numbers in complicated regular expressions. Furthermore,
if an expression is modified, the numbers may change. To help with this
difficulty, PCRE supports the naming of subpatterns. This feature was not
added to Perl until release 5.10. Python had the feature earlier, and PCRE
introduced it at release 4.0, using the Python syntax. PCRE now supports both
the Perl and the Python syntax. Perl allows identically numbered subpatterns to
have different names, but PCRE does not.
.P
In PCRE, a subpattern can be named in one of three ways: (?<name>...) or
(?'name'...) as in Perl, or (?P<name>...) as in Python. References to capturing
parentheses from other parts of the pattern, such as
.\" HTML <a href="#backreferences">
.\" </a>
back references,
.\"
.\" HTML <a href="#recursion">
.\" </a>
recursion,
.\"
and
.\" HTML <a href="#conditions">
.\" </a>
conditions,
.\"
can be made by name as well as by number.
.P
Names consist of up to 32 alphanumeric characters and underscores. Named
capturing parentheses are still allocated numbers as well as names, exactly as
if the names were not present. The PCRE API provides function calls for
extracting the name-to-number translation table from a compiled pattern. There
is also a convenience function for extracting a captured substring by name.
.P
By default, a name must be unique within a pattern, but it is possible to relax
this constraint by setting the PCRE_DUPNAMES option at compile time. (Duplicate
names are also always permitted for subpatterns with the same number, set up as
described in the previous section.) Duplicate names can be useful for patterns
where only one instance of the named parentheses can match. Suppose you want to
match the name of a weekday, either as a 3-letter abbreviation or as the full
name, and in both cases you want to extract the abbreviation. This pattern
(ignoring the line breaks) does the job:
.sp
  (?<DN>Mon|Fri|Sun)(?:day)?|
  (?<DN>Tue)(?:sday)?|
  (?<DN>Wed)(?:nesday)?|
  (?<DN>Thu)(?:rsday)?|
  (?<DN>Sat)(?:urday)?
.sp
There are five capturing substrings, but only one is ever set after a match.
(An alternative way of solving this problem is to use a "branch reset"
subpattern, as described in the previous section.)
.P
The convenience function for extracting the data by name returns the substring
for the first (and in this example, the only) subpattern of that name that
matched. This saves searching to find which numbered subpattern it was.
.P
If you make a back reference to a non-unique named subpattern from elsewhere in
the pattern, the one that corresponds to the first occurrence of the name is
used. In the absence of duplicate numbers (see the previous section) this is
the one with the lowest number. If you use a named reference in a condition
test (see the
.\"
.\" HTML <a href="#conditions">
.\" </a>
section about conditions
.\"
below), either to check whether a subpattern has matched, or to check for
recursion, all subpatterns with the same name are tested. If the condition is
true for any one of them, the overall condition is true. This is the same
behaviour as testing by number. For further details of the interfaces for
handling named subpatterns, see the
.\" HREF
\fBpcreapi\fP
.\"
documentation.
.P
\fBWarning:\fP You cannot use different names to distinguish between two
subpatterns with the same number because PCRE uses only the numbers when
matching. For this reason, an error is given at compile time if different names
are given to subpatterns with the same number. However, you can give the same
name to subpatterns with the same number, even when PCRE_DUPNAMES is not set.
.
.
.SH REPETITION
.rs
.sp
Repetition is specified by quantifiers, which can follow any of the following
items:
.sp
  a literal data character
  the dot metacharacter
  the \eC escape sequence
  the \eX escape sequence (in UTF-8 mode with Unicode properties)
  the \eR escape sequence
  an escape such as \ed that matches a single character
  a character class
  a back reference (see next section)
  a parenthesized subpattern (unless it is an assertion)
  a recursive or "subroutine" call to a subpattern
.sp
The general repetition quantifier specifies a minimum and maximum number of
permitted matches, by giving the two numbers in curly brackets (braces),
separated by a comma. The numbers must be less than 65536, and the first must
be less than or equal to the second. For example:
.sp
  z{2,4}
.sp
matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special
character. If the second number is omitted, but the comma is present, there is
no upper limit; if the second number and the comma are both omitted, the
quantifier specifies an exact number of required matches. Thus
.sp
  [aeiou]{3,}
.sp
matches at least 3 successive vowels, but may match many more, while
.sp
  \ed{8}
.sp
matches exactly 8 digits. An opening curly bracket that appears in a position
where a quantifier is not allowed, or one that does not match the syntax of a
quantifier, is taken as a literal character. For example, {,6} is not a
quantifier, but a literal string of four characters.
.P
In UTF-8 mode, quantifiers apply to UTF-8 characters rather than to individual
bytes. Thus, for example, \ex{100}{2} matches two UTF-8 characters, each of
which is represented by a two-byte sequence. Similarly, when Unicode property
support is available, \eX{3} matches three Unicode extended sequences, each of
which may be several bytes long (and they may be of different lengths).
.P
The quantifier {0} is permitted, causing the expression to behave as if the
previous item and the quantifier were not present. This may be useful for
subpatterns that are referenced as
.\" HTML <a href="#subpatternsassubroutines">
.\" </a>
subroutines
.\"
from elsewhere in the pattern. Items other than subpatterns that have a {0}
quantifier are omitted from the compiled pattern.
.P
For convenience, the three most common quantifiers have single-character
abbreviations:
.sp
  *    is equivalent to {0,}
  +    is equivalent to {1,}
  ?    is equivalent to {0,1}
.sp
It is possible to construct infinite loops by following a subpattern that can
match no characters with a quantifier that has no upper limit, for example:
.sp
  (a?)*
.sp
Earlier versions of Perl and PCRE used to give an error at compile time for
such patterns. However, because there are cases where this can be useful, such
patterns are now accepted, but if any repetition of the subpattern does in fact
match no characters, the loop is forcibly broken.
.P
By default, the quantifiers are "greedy", that is, they match as much as
possible (up to the maximum number of permitted times), without causing the
rest of the pattern to fail. The classic example of where this gives problems
is in trying to match comments in C programs. These appear between /* and */
and within the comment, individual * and / characters may appear. An attempt to
match C comments by applying the pattern
.sp
  /\e*.*\e*/
.sp
to the string
.sp
  /* first comment */  not comment  /* second comment */
.sp
fails, because it matches the entire string owing to the greediness of the .*
item.
.P
However, if a quantifier is followed by a question mark, it ceases to be
greedy, and instead matches the minimum number of times possible, so the
pattern
.sp
  /\e*.*?\e*/
.sp
does the right thing with the C comments. The meaning of the various
quantifiers is not otherwise changed, just the preferred number of matches.
Do not confuse this use of question mark with its use as a quantifier in its
own right. Because it has two uses, it can sometimes appear doubled, as in
.sp
  \ed??\ed
.sp
which matches one digit by preference, but can match two if that is the only
way the rest of the pattern matches.
.P
If the PCRE_UNGREEDY option is set (an option that is not available in Perl),
the quantifiers are not greedy by default, but individual ones can be made
greedy by following them with a question mark. In other words, it inverts the
default behaviour.
.P
When a parenthesized subpattern is quantified with a minimum repeat count that
is greater than 1 or with a limited maximum, more memory is required for the
compiled pattern, in proportion to the size of the minimum or maximum.
.P
If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent
to Perl's /s) is set, thus allowing the dot to match newlines, the pattern is
implicitly anchored, because whatever follows will be tried against every
character position in the subject string, so there is no point in retrying the
overall match at any position after the first. PCRE normally treats such a
pattern as though it were preceded by \eA.
.P
In cases where it is known that the subject string contains no newlines, it is
worth setting PCRE_DOTALL in order to obtain this optimization, or
alternatively using ^ to indicate anchoring explicitly.
.P
However, there is one situation where the optimization cannot be used. When .*
is inside capturing parentheses that are the subject of a back reference
elsewhere in the pattern, a match at the start may fail where a later one
succeeds. Consider, for example:
.sp
  (.*)abc\e1
.sp
If the subject is "xyz123abc123" the match point is the fourth character. For
this reason, such a pattern is not implicitly anchored.
.P
When a capturing subpattern is repeated, the value captured is the substring
that matched the final iteration. For example, after
.sp
  (tweedle[dume]{3}\es*)+
.sp
has matched "tweedledum tweedledee" the value of the captured substring is
"tweedledee". However, if there are nested capturing subpatterns, the
corresponding captured values may have been set in previous iterations. For
example, after
.sp
  /(a|(b))+/
.sp
matches "aba" the value of the second captured substring is "b".
.
.
.\" HTML <a name="atomicgroup"></a>
.SH "ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS"
.rs
.sp
With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy")
repetition, failure of what follows normally causes the repeated item to be
re-evaluated to see if a different number of repeats allows the rest of the
pattern to match. Sometimes it is useful to prevent this, either to change the
nature of the match, or to cause it fail earlier than it otherwise might, when
the author of the pattern knows there is no point in carrying on.
.P
Consider, for example, the pattern \ed+foo when applied to the subject line
.sp
  123456bar
.sp
After matching all 6 digits and then failing to match "foo", the normal
action of the matcher is to try again with only 5 digits matching the \ed+
item, and then with 4, and so on, before ultimately failing. "Atomic grouping"
(a term taken from Jeffrey Friedl's book) provides the means for specifying
that once a subpattern has matched, it is not to be re-evaluated in this way.
.P
If we use atomic grouping for the previous example, the matcher gives up
immediately on failing to match "foo" the first time. The notation is a kind of
special parenthesis, starting with (?> as in this example:
.sp
  (?>\ed+)foo
.sp
This kind of parenthesis "locks up" the  part of the pattern it contains once
it has matched, and a failure further into the pattern is prevented from
backtracking into it. Backtracking past it to previous items, however, works as
normal.
.P
An alternative description is that a subpattern of this type matches the string
of characters that an identical standalone pattern would match, if anchored at
the current point in the subject string.
.P
Atomic grouping subpatterns are not capturing subpatterns. Simple cases such as
the above example can be thought of as a maximizing repeat that must swallow
everything it can. So, while both \ed+ and \ed+? are prepared to adjust the
number of digits they match in order to make the rest of the pattern match,
(?>\ed+) can only match an entire sequence of digits.
.P
Atomic groups in general can of course contain arbitrarily complicated
subpatterns, and can be nested. However, when the subpattern for an atomic
group is just a single repeated item, as in the example above, a simpler
notation, called a "possessive quantifier" can be used. This consists of an
additional + character following a quantifier. Using this notation, the
previous example can be rewritten as
.sp
  \ed++foo
.sp
Note that a possessive quantifier can be used with an entire group, for
example:
.sp
  (abc|xyz){2,3}+
.sp
Possessive quantifiers are always greedy; the setting of the PCRE_UNGREEDY
option is ignored. They are a convenient notation for the simpler forms of
atomic group. However, there is no difference in the meaning of a possessive
quantifier and the equivalent atomic group, though there may be a performance
difference; possessive quantifiers should be slightly faster.
.P
The possessive quantifier syntax is an extension to the Perl 5.8 syntax.
Jeffrey Friedl originated the idea (and the name) in the first edition of his
book. Mike McCloskey liked it, so implemented it when he built Sun's Java
package, and PCRE copied it from there. It ultimately found its way into Perl
at release 5.10.
.P
PCRE has an optimization that automatically "possessifies" certain simple
pattern constructs. For example, the sequence A+B is treated as A++B because
there is no point in backtracking into a sequence of A's when B must follow.
.P
When a pattern contains an unlimited repeat inside a subpattern that can itself
be repeated an unlimited number of times, the use of an atomic group is the
only way to avoid some failing matches taking a very long time indeed. The
pattern
.sp
  (\eD+|<\ed+>)*[!?]
.sp
matches an unlimited number of substrings that either consist of non-digits, or
digits enclosed in <>, followed by either ! or ?. When it matches, it runs
quickly. However, if it is applied to
.sp
  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
.sp
it takes a long time before reporting failure. This is because the string can
be divided between the internal \eD+ repeat and the external * repeat in a
large number of ways, and all have to be tried. (The example uses [!?] rather
than a single character at the end, because both PCRE and Perl have an
optimization that allows for fast failure when a single character is used. They
remember the last single character that is required for a match, and fail early
if it is not present in the string.) If the pattern is changed so that it uses
an atomic group, like this:
.sp
  ((?>\eD+)|<\ed+>)*[!?]
.sp
sequences of non-digits cannot be broken, and failure happens quickly.
.
.
.\" HTML <a name="backreferences"></a>
.SH "BACK REFERENCES"
.rs
.sp
Outside a character class, a backslash followed by a digit greater than 0 (and
possibly further digits) is a back reference to a capturing subpattern earlier
(that is, to its left) in the pattern, provided there have been that many
previous capturing left parentheses.
.P
However, if the decimal number following the backslash is less than 10, it is
always taken as a back reference, and causes an error only if there are not
that many capturing left parentheses in the entire pattern. In other words, the
parentheses that are referenced need not be to the left of the reference for
numbers less than 10. A "forward back reference" of this type can make sense
when a repetition is involved and the subpattern to the right has participated
in an earlier iteration.
.P
It is not possible to have a numerical "forward back reference" to a subpattern
whose number is 10 or more using this syntax because a sequence such as \e50 is
interpreted as a character defined in octal. See the subsection entitled
"Non-printing characters"
.\" HTML <a href="#digitsafterbackslash">
.\" </a>
above
.\"
for further details of the handling of digits following a backslash. There is
no such problem when named parentheses are used. A back reference to any
subpattern is possible using named parentheses (see below).
.P
Another way of avoiding the ambiguity inherent in the use of digits following a
backslash is to use the \eg escape sequence, which is a feature introduced in
Perl 5.10. This escape must be followed by an unsigned number or a negative
number, optionally enclosed in braces. These examples are all identical:
.sp
  (ring), \e1
  (ring), \eg1
  (ring), \eg{1}
.sp
An unsigned number specifies an absolute reference without the ambiguity that
is present in the older syntax. It is also useful when literal digits follow
the reference. A negative number is a relative reference. Consider this
example:
.sp
  (abc(def)ghi)\eg{-1}
.sp
The sequence \eg{-1} is a reference to the most recently started capturing
subpattern before \eg, that is, is it equivalent to \e2. Similarly, \eg{-2}
would be equivalent to \e1. The use of relative references can be helpful in
long patterns, and also in patterns that are created by joining together
fragments that contain references within themselves.
.P
A back reference matches whatever actually matched the capturing subpattern in
the current subject string, rather than anything matching the subpattern
itself (see
.\" HTML <a href="#subpatternsassubroutines">
.\" </a>
"Subpatterns as subroutines"
.\"
below for a way of doing that). So the pattern
.sp
  (sens|respons)e and \e1ibility
.sp
matches "sense and sensibility" and "response and responsibility", but not
"sense and responsibility". If caseful matching is in force at the time of the
back reference, the case of letters is relevant. For example,
.sp
  ((?i)rah)\es+\e1
.sp
matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original
capturing subpattern is matched caselessly.
.P
There are several different ways of writing back references to named
subpatterns. The .NET syntax \ek{name} and the Perl syntax \ek<name> or
\ek'name' are supported, as is the Python syntax (?P=name). Perl 5.10's unified
back reference syntax, in which \eg can be used for both numeric and named
references, is also supported. We could rewrite the above example in any of
the following ways:
.sp
  (?<p1>(?i)rah)\es+\ek<p1>
  (?'p1'(?i)rah)\es+\ek{p1}
  (?P<p1>(?i)rah)\es+(?P=p1)
  (?<p1>(?i)rah)\es+\eg{p1}
.sp
A subpattern that is referenced by name may appear in the pattern before or
after the reference.
.P
There may be more than one back reference to the same subpattern. If a
subpattern has not actually been used in a particular match, any back
references to it always fail by default. For example, the pattern
.sp
  (a|(bc))\e2
.sp
always fails if it starts to match "a" rather than "bc". However, if the
PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back reference to an
unset value matches an empty string.
.P
Because there may be many capturing parentheses in a pattern, all digits
following a backslash are taken as part of a potential back reference number.
If the pattern continues with a digit character, some delimiter must be used to
terminate the back reference. If the PCRE_EXTENDED option is set, this can be
whitespace. Otherwise, the \eg{ syntax or an empty comment (see
.\" HTML <a href="#comments">
.\" </a>
"Comments"
.\"
below) can be used.
.
.SS "Recursive back references"
.rs
.sp
A back reference that occurs inside the parentheses to which it refers fails
when the subpattern is first used, so, for example, (a\e1) never matches.
However, such references can be useful inside repeated subpatterns. For
example, the pattern
.sp
  (a|b\e1)+
.sp
matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration of
the subpattern, the back reference matches the character string corresponding
to the previous iteration. In order for this to work, the pattern must be such
that the first iteration does not need to match the back reference. This can be
done using alternation, as in the example above, or by a quantifier with a
minimum of zero.
.P
Back references of this type cause the group that they reference to be treated
as an
.\" HTML <a href="#atomicgroup">
.\" </a>
atomic group.
.\"
Once the whole group has been matched, a subsequent matching failure cannot
cause backtracking into the middle of the group.
.
.
.\" HTML <a name="bigassertions"></a>
.SH ASSERTIONS
.rs
.sp
An assertion is a test on the characters following or preceding the current
matching point that does not actually consume any characters. The simple
assertions coded as \eb, \eB, \eA, \eG, \eZ, \ez, ^ and $ are described
.\" HTML <a href="#smallassertions">
.\" </a>
above.
.\"
.P
More complicated assertions are coded as subpatterns. There are two kinds:
those that look ahead of the current position in the subject string, and those
that look behind it. An assertion subpattern is matched in the normal way,
except that it does not cause the current matching position to be changed.
.P
Assertion subpatterns are not capturing subpatterns, and may not be repeated,
because it makes no sense to assert the same thing several times. If any kind
of assertion contains capturing subpatterns within it, these are counted for
the purposes of numbering the capturing subpatterns in the whole pattern.
However, substring capturing is carried out only for positive assertions,
because it does not make sense for negative assertions.
.
.
.SS "Lookahead assertions"
.rs
.sp
Lookahead assertions start with (?= for positive assertions and (?! for
negative assertions. For example,
.sp
  \ew+(?=;)
.sp
matches a word followed by a semicolon, but does not include the semicolon in
the match, and
.sp
  foo(?!bar)
.sp
matches any occurrence of "foo" that is not followed by "bar". Note that the
apparently similar pattern
.sp
  (?!foo)bar
.sp
does not find an occurrence of "bar" that is preceded by something other than
"foo"; it finds any occurrence of "bar" whatsoever, because the assertion
(?!foo) is always true when the next three characters are "bar". A
lookbehind assertion is needed to achieve the other effect.
.P
If you want to force a matching failure at some point in a pattern, the most
convenient way to do it is with (?!) because an empty string always matches, so
an assertion that requires there not to be an empty string must always fail.
The Perl 5.10 backtracking control verb (*FAIL) or (*F) is essentially a
synonym for (?!).
.
.
.\" HTML <a name="lookbehind"></a>
.SS "Lookbehind assertions"
.rs
.sp
Lookbehind assertions start with (?<= for positive assertions and (?<! for
negative assertions. For example,
.sp
  (?<!foo)bar
.sp
does find an occurrence of "bar" that is not preceded by "foo". The contents of
a lookbehind assertion are restricted such that all the strings it matches must
have a fixed length. However, if there are several top-level alternatives, they
do not all have to have the same fixed length. Thus
.sp
  (?<=bullock|donkey)
.sp
is permitted, but
.sp
  (?<!dogs?|cats?)
.sp
causes an error at compile time. Branches that match different length strings
are permitted only at the top level of a lookbehind assertion. This is an
extension compared with Perl (5.8 and 5.10), which requires all branches to
match the same length of string. An assertion such as
.sp
  (?<=ab(c|de))
.sp
is not permitted, because its single top-level branch can match two different
lengths, but it is acceptable to PCRE if rewritten to use two top-level
branches:
.sp
  (?<=abc|abde)
.sp
In some cases, the Perl 5.10 escape sequence \eK
.\" HTML <a href="#resetmatchstart">
.\" </a>
(see above)
.\"
can be used instead of a lookbehind assertion to get round the fixed-length
restriction.
.P
The implementation of lookbehind assertions is, for each alternative, to
temporarily move the current position back by the fixed length and then try to
match. If there are insufficient characters before the current position, the
assertion fails.
.P
PCRE does not allow the \eC escape (which matches a single byte in UTF-8 mode)
to appear in lookbehind assertions, because it makes it impossible to calculate
the length of the lookbehind. The \eX and \eR escapes, which can match
different numbers of bytes, are also not permitted.
.P
.\" HTML <a href="#subpatternsassubroutines">
.\" </a>
"Subroutine"
.\"
calls (see below) such as (?2) or (?&X) are permitted in lookbehinds, as long
as the subpattern matches a fixed-length string.
.\" HTML <a href="#recursion">
.\" </a>
Recursion,
.\"
however, is not supported.
.P
Possessive quantifiers can be used in conjunction with lookbehind assertions to
specify efficient matching of fixed-length strings at the end of subject
strings. Consider a simple pattern such as
.sp
  abcd$
.sp
when applied to a long string that does not match. Because matching proceeds
from left to right, PCRE will look for each "a" in the subject and then see if
what follows matches the rest of the pattern. If the pattern is specified as
.sp
  ^.*abcd$
.sp
the initial .* matches the entire string at first, but when this fails (because
there is no following "a"), it backtracks to match all but the last character,
then all but the last two characters, and so on. Once again the search for "a"
covers the entire string, from right to left, so we are no better off. However,
if the pattern is written as
.sp
  ^.*+(?<=abcd)
.sp
there can be no backtracking for the .*+ item; it can match only the entire
string. The subsequent lookbehind assertion does a single test on the last four
characters. If it fails, the match fails immediately. For long strings, this
approach makes a significant difference to the processing time.
.
.
.SS "Using multiple assertions"
.rs
.sp
Several assertions (of any sort) may occur in succession. For example,
.sp
  (?<=\ed{3})(?<!999)foo
.sp
matches "foo" preceded by three digits that are not "999". Notice that each of
the assertions is applied independently at the same point in the subject
string. First there is a check that the previous three characters are all
digits, and then there is a check that the same three characters are not "999".
This pattern does \fInot\fP match "foo" preceded by six characters, the first
of which are digits and the last three of which are not "999". For example, it
doesn't match "123abcfoo". A pattern to do that is
.sp
  (?<=\ed{3}...)(?<!999)foo
.sp
This time the first assertion looks at the preceding six characters, checking
that the first three are digits, and then the second assertion checks that the
preceding three characters are not "999".
.P
Assertions can be nested in any combination. For example,
.sp
  (?<=(?<!foo)bar)baz
.sp
matches an occurrence of "baz" that is preceded by "bar" which in turn is not
preceded by "foo", while
.sp
  (?<=\ed{3}(?!999)...)foo
.sp
is another pattern that matches "foo" preceded by three digits and any three
characters that are not "999".
.
.
.\" HTML <a name="conditions"></a>
.SH "CONDITIONAL SUBPATTERNS"
.rs
.sp
It is possible to cause the matching process to obey a subpattern
conditionally or to choose between two alternative subpatterns, depending on
the result of an assertion, or whether a specific capturing subpattern has
already been matched. The two possible forms of conditional subpattern are:
.sp
  (?(condition)yes-pattern)
  (?(condition)yes-pattern|no-pattern)
.sp
If the condition is satisfied, the yes-pattern is used; otherwise the
no-pattern (if present) is used. If there are more than two alternatives in the
subpattern, a compile-time error occurs.
.P
There are four kinds of condition: references to subpatterns, references to
recursion, a pseudo-condition called DEFINE, and assertions.
.
.SS "Checking for a used subpattern by number"
.rs
.sp
If the text between the parentheses consists of a sequence of digits, the
condition is true if a capturing subpattern of that number has previously
matched. If there is more than one capturing subpattern with the same number
(see the earlier
.\"
.\" HTML <a href="#recursion">
.\" </a>
section about duplicate subpattern numbers),
.\"
the condition is true if any of them have been set. An alternative notation is
to precede the digits with a plus or minus sign. In this case, the subpattern
number is relative rather than absolute. The most recently opened parentheses
can be referenced by (?(-1), the next most recent by (?(-2), and so on. In
looping constructs it can also make sense to refer to subsequent groups with
constructs such as (?(+2).
.P
Consider the following pattern, which contains non-significant white space to
make it more readable (assume the PCRE_EXTENDED option) and to divide it into
three parts for ease of discussion:
.sp
  ( \e( )?    [^()]+    (?(1) \e) )
.sp
The first part matches an optional opening parenthesis, and if that
character is present, sets it as the first captured substring. The second part
matches one or more characters that are not parentheses. The third part is a
conditional subpattern that tests whether the first set of parentheses matched
or not. If they did, that is, if subject started with an opening parenthesis,
the condition is true, and so the yes-pattern is executed and a closing
parenthesis is required. Otherwise, since no-pattern is not present, the
subpattern matches nothing. In other words, this pattern matches a sequence of
non-parentheses, optionally enclosed in parentheses.
.P
If you were embedding this pattern in a larger one, you could use a relative
reference:
.sp
  ...other stuff... ( \e( )?    [^()]+    (?(-1) \e) ) ...
.sp
This makes the fragment independent of the parentheses in the larger pattern.
.
.SS "Checking for a used subpattern by name"
.rs
.sp
Perl uses the syntax (?(<name>)...) or (?('name')...) to test for a used
subpattern by name. For compatibility with earlier versions of PCRE, which had
this facility before Perl, the syntax (?(name)...) is also recognized. However,
there is a possible ambiguity with this syntax, because subpattern names may
consist entirely of digits. PCRE looks first for a named subpattern; if it
cannot find one and the name consists entirely of digits, PCRE looks for a
subpattern of that number, which must be greater than zero. Using subpattern
names that consist entirely of digits is not recommended.
.P
Rewriting the above example to use a named subpattern gives this:
.sp
  (?<OPEN> \e( )?    [^()]+    (?(<OPEN>) \e) )
.sp
If the name used in a condition of this kind is a duplicate, the test is
applied to all subpatterns of the same name, and is true if any one of them has
matched.
.
.SS "Checking for pattern recursion"
.rs
.sp
If the condition is the string (R), and there is no subpattern with the name R,
the condition is true if a recursive call to the whole pattern or any
subpattern has been made. If digits or a name preceded by ampersand follow the
letter R, for example:
.sp
  (?(R3)...) or (?(R&name)...)
.sp
the condition is true if the most recent recursion is into a subpattern whose
number or name is given. This condition does not check the entire recursion
stack. If the name used in a condition of this kind is a duplicate, the test is
applied to all subpatterns of the same name, and is true if any one of them is
the most recent recursion.
.P
At "top level", all these recursion test conditions are false.
.\" HTML <a href="#recursion">
.\" </a>
The syntax for recursive patterns
.\"
is described below.
.
.SS "Defining subpatterns for use by reference only"
.rs
.sp
If the condition is the string (DEFINE), and there is no subpattern with the
name DEFINE, the condition is always false. In this case, there may be only one
alternative in the subpattern. It is always skipped if control reaches this
point in the pattern; the idea of DEFINE is that it can be used to define
"subroutines" that can be referenced from elsewhere. (The use of
.\" HTML <a href="#subpatternsassubroutines">
.\" </a>
"subroutines"
.\"
is described below.) For example, a pattern to match an IPv4 address could be
written like this (ignore whitespace and line breaks):
.sp
  (?(DEFINE) (?<byte> 2[0-4]\ed | 25[0-5] | 1\ed\ed | [1-9]?\ed) )
  \eb (?&byte) (\e.(?&byte)){3} \eb
.sp
The first part of the pattern is a DEFINE group inside which a another group
named "byte" is defined. This matches an individual component of an IPv4
address (a number less than 256). When matching takes place, this part of the
pattern is skipped because DEFINE acts like a false condition. The rest of the
pattern uses references to the named group to match the four dot-separated
components of an IPv4 address, insisting on a word boundary at each end.
.
.SS "Assertion conditions"
.rs
.sp
If the condition is not in any of the above formats, it must be an assertion.
This may be a positive or negative lookahead or lookbehind assertion. Consider
this pattern, again containing non-significant white space, and with the two
alternatives on the second line:
.sp
  (?(?=[^a-z]*[a-z])
  \ed{2}-[a-z]{3}-\ed{2}  |  \ed{2}-\ed{2}-\ed{2} )
.sp
The condition is a positive lookahead assertion that matches an optional
sequence of non-letters followed by a letter. In other words, it tests for the
presence of at least one letter in the subject. If a letter is found, the
subject is matched against the first alternative; otherwise it is matched
against the second. This pattern matches strings in one of the two forms
dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits.
.
.
.\" HTML <a name="comments"></a>
.SH COMMENTS
.rs
.sp
The sequence (?# marks the start of a comment that continues up to the next
closing parenthesis. Nested parentheses are not permitted. The characters
that make up a comment play no part in the pattern matching at all.
.P
If the PCRE_EXTENDED option is set, an unescaped # character outside a
character class introduces a comment that continues to immediately after the
next newline in the pattern.
.
.
.\" HTML <a name="recursion"></a>
.SH "RECURSIVE PATTERNS"
.rs
.sp
Consider the problem of matching a string in parentheses, allowing for
unlimited nested parentheses. Without the use of recursion, the best that can
be done is to use a pattern that matches up to some fixed depth of nesting. It
is not possible to handle an arbitrary nesting depth.
.P
For some time, Perl has provided a facility that allows regular expressions to
recurse (amongst other things). It does this by interpolating Perl code in the
expression at run time, and the code can refer to the expression itself. A Perl
pattern using code interpolation to solve the parentheses problem can be
created like this:
.sp
  $re = qr{\e( (?: (?>[^()]+) | (?p{$re}) )* \e)}x;
.sp
The (?p{...}) item interpolates Perl code at run time, and in this case refers
recursively to the pattern in which it appears.
.P
Obviously, PCRE cannot support the interpolation of Perl code. Instead, it
supports special syntax for recursion of the entire pattern, and also for
individual subpattern recursion. After its introduction in PCRE and Python,
this kind of recursion was subsequently introduced into Perl at release 5.10.
.P
A special item that consists of (? followed by a number greater than zero and a
closing parenthesis is a recursive call of the subpattern of the given number,
provided that it occurs inside that subpattern. (If not, it is a
.\" HTML <a href="#subpatternsassubroutines">
.\" </a>
"subroutine"
.\"
call, which is described in the next section.) The special item (?R) or (?0) is
a recursive call of the entire regular expression.
.P
This PCRE pattern solves the nested parentheses problem (assume the
PCRE_EXTENDED option is set so that white space is ignored):
.sp
  \e( ( [^()]++ | (?R) )* \e)
.sp
First it matches an opening parenthesis. Then it matches any number of
substrings which can either be a sequence of non-parentheses, or a recursive
match of the pattern itself (that is, a correctly parenthesized substring).
Finally there is a closing parenthesis. Note the use of a possessive quantifier
to avoid backtracking into sequences of non-parentheses.
.P
If this were part of a larger pattern, you would not want to recurse the entire
pattern, so instead you could use this:
.sp
  ( \e( ( [^()]++ | (?1) )* \e) )
.sp
We have put the pattern into parentheses, and caused the recursion to refer to
them instead of the whole pattern.
.P
In a larger pattern, keeping track of parenthesis numbers can be tricky. This
is made easier by the use of relative references (a Perl 5.10 feature).
Instead of (?1) in the pattern above you can write (?-2) to refer to the second
most recently opened parentheses preceding the recursion. In other words, a
negative number counts capturing parentheses leftwards from the point at which
it is encountered.
.P
It is also possible to refer to subsequently opened parentheses, by writing
references such as (?+2). However, these cannot be recursive because the
reference is not inside the parentheses that are referenced. They are always
.\" HTML <a href="#subpatternsassubroutines">
.\" </a>
"subroutine"
.\"
calls, as described in the next section.
.P
An alternative approach is to use named parentheses instead. The Perl syntax
for this is (?&name); PCRE's earlier syntax (?P>name) is also supported. We
could rewrite the above example as follows:
.sp
  (?<pn> \e( ( [^()]++ | (?&pn) )* \e) )
.sp
If there is more than one subpattern with the same name, the earliest one is
used.
.P
This particular example pattern that we have been looking at contains nested
unlimited repeats, and so the use of a possessive quantifier for matching
strings of non-parentheses is important when applying the pattern to strings
that do not match. For example, when this pattern is applied to
.sp
  (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
.sp
it yields "no match" quickly. However, if a possessive quantifier is not used,
the match runs for a very long time indeed because there are so many different
ways the + and * repeats can carve up the subject, and all have to be tested
before failure can be reported.
.P
At the end of a match, the values of capturing parentheses are those from
the outermost level. If you want to obtain intermediate values, a callout
function can be used (see below and the
.\" HREF
\fBpcrecallout\fP
.\"
documentation). If the pattern above is matched against
.sp
  (ab(cd)ef)
.sp
the value for the inner capturing parentheses (numbered 2) is "ef", which is
the last value taken on at the top level. If a capturing subpattern is not
matched at the top level, its final value is unset, even if it is (temporarily)
set at a deeper level.
.P
If there are more than 15 capturing parentheses in a pattern, PCRE has to
obtain extra memory to store data during a recursion, which it does by using
\fBpcre_malloc\fP, freeing it via \fBpcre_free\fP afterwards. If no memory can
be obtained, the match fails with the PCRE_ERROR_NOMEMORY error.
.P
Do not confuse the (?R) item with the condition (R), which tests for recursion.
Consider this pattern, which matches text in angle brackets, allowing for
arbitrary nesting. Only digits are allowed in nested brackets (that is, when
recursing), whereas any characters are permitted at the outer level.
.sp
  < (?: (?(R) \ed++  | [^<>]*+) | (?R)) * >
.sp
In this pattern, (?(R) is the start of a conditional subpattern, with two
different alternatives for the recursive and non-recursive cases. The (?R) item
is the actual recursive call.
.
.
.\" HTML <a name="recursiondifference"></a>
.SS "Recursion difference from Perl"
.rs
.sp
In PCRE (like Python, but unlike Perl), a recursive subpattern call is always
treated as an atomic group. That is, once it has matched some of the subject
string, it is never re-entered, even if it contains untried alternatives and
there is a subsequent matching failure. This can be illustrated by the
following pattern, which purports to match a palindromic string that contains
an odd number of characters (for example, "a", "aba", "abcba", "abcdcba"):
.sp
  ^(.|(.)(?1)\e2)$
.sp
The idea is that it either matches a single character, or two identical
characters surrounding a sub-palindrome. In Perl, this pattern works; in PCRE
it does not if the pattern is longer than three characters. Consider the
subject string "abcba":
.P
At the top level, the first character is matched, but as it is not at the end
of the string, the first alternative fails; the second alternative is taken
and the recursion kicks in. The recursive call to subpattern 1 successfully
matches the next character ("b"). (Note that the beginning and end of line
tests are not part of the recursion).
.P
Back at the top level, the next character ("c") is compared with what
subpattern 2 matched, which was "a". This fails. Because the recursion is
treated as an atomic group, there are now no backtracking points, and so the
entire match fails. (Perl is able, at this point, to re-enter the recursion and
try the second alternative.) However, if the pattern is written with the
alternatives in the other order, things are different:
.sp
  ^((.)(?1)\e2|.)$
.sp
This time, the recursing alternative is tried first, and continues to recurse
until it runs out of characters, at which point the recursion fails. But this
time we do have another alternative to try at the higher level. That is the big
difference: in the previous case the remaining alternative is at a deeper
recursion level, which PCRE cannot use.
.P
To change the pattern so that matches all palindromic strings, not just those
with an odd number of characters, it is tempting to change the pattern to this:
.sp
  ^((.)(?1)\e2|.?)$
.sp
Again, this works in Perl, but not in PCRE, and for the same reason. When a
deeper recursion has matched a single character, it cannot be entered again in
order to match an empty string. The solution is to separate the two cases, and
write out the odd and even cases as alternatives at the higher level:
.sp
  ^(?:((.)(?1)\e2|)|((.)(?3)\e4|.))
.sp
If you want to match typical palindromic phrases, the pattern has to ignore all
non-word characters, which can be done like this:
.sp
  ^\eW*+(?:((.)\eW*+(?1)\eW*+\e2|)|((.)\eW*+(?3)\eW*+\e4|\eW*+.\eW*+))\eW*+$
.sp
If run with the PCRE_CASELESS option, this pattern matches phrases such as "A
man, a plan, a canal: Panama!" and it works well in both PCRE and Perl. Note
the use of the possessive quantifier *+ to avoid backtracking into sequences of
non-word characters. Without this, PCRE takes a great deal longer (ten times or
more) to match typical phrases, and Perl takes so long that you think it has
gone into a loop.
.P
\fBWARNING\fP: The palindrome-matching patterns above work only if the subject
string does not start with a palindrome that is shorter than the entire string.
For example, although "abcba" is correctly matched, if the subject is "ababa",
PCRE finds the palindrome "aba" at the start, then fails at top level because
the end of the string does not follow. Once again, it cannot jump back into the
recursion to try other alternatives, so the entire match fails.
.
.
.\" HTML <a name="subpatternsassubroutines"></a>
.SH "SUBPATTERNS AS SUBROUTINES"
.rs
.sp
If the syntax for a recursive subpattern reference (either by number or by
name) is used outside the parentheses to which it refers, it operates like a
subroutine in a programming language. The "called" subpattern may be defined
before or after the reference. A numbered reference can be absolute or
relative, as in these examples:
.sp
  (...(absolute)...)...(?2)...
  (...(relative)...)...(?-1)...
  (...(?+1)...(relative)...
.sp
An earlier example pointed out that the pattern
.sp
  (sens|respons)e and \e1ibility
.sp
matches "sense and sensibility" and "response and responsibility", but not
"sense and responsibility". If instead the pattern
.sp
  (sens|respons)e and (?1)ibility
.sp
is used, it does match "sense and responsibility" as well as the other two
strings. Another example is given in the discussion of DEFINE above.
.P
Like recursive subpatterns, a subroutine call is always treated as an atomic
group. That is, once it has matched some of the subject string, it is never
re-entered, even if it contains untried alternatives and there is a subsequent
matching failure. Any capturing parentheses that are set during the subroutine
call revert to their previous values afterwards.
.P
When a subpattern is used as a subroutine, processing options such as
case-independence are fixed when the subpattern is defined. They cannot be
changed for different calls. For example, consider this pattern:
.sp
  (abc)(?i:(?-1))
.sp
It matches "abcabc". It does not match "abcABC" because the change of
processing option does not affect the called subpattern.
.
.
.\" HTML <a name="onigurumasubroutines"></a>
.SH "ONIGURUMA SUBROUTINE SYNTAX"
.rs
.sp
For compatibility with Oniguruma, the non-Perl syntax \eg followed by a name or
a number enclosed either in angle brackets or single quotes, is an alternative
syntax for referencing a subpattern as a subroutine, possibly recursively. Here
are two of the examples used above, rewritten using this syntax:
.sp
  (?<pn> \e( ( (?>[^()]+) | \eg<pn> )* \e) )
  (sens|respons)e and \eg'1'ibility
.sp
PCRE supports an extension to Oniguruma: if a number is preceded by a
plus or a minus sign it is taken as a relative reference. For example:
.sp
  (abc)(?i:\eg<-1>)
.sp
Note that \eg{...} (Perl syntax) and \eg<...> (Oniguruma syntax) are \fInot\fP
synonymous. The former is a back reference; the latter is a subroutine call.
.
.
.SH CALLOUTS
.rs
.sp
Perl has a feature whereby using the sequence (?{...}) causes arbitrary Perl
code to be obeyed in the middle of matching a regular expression. This makes it
possible, amongst other things, to extract different substrings that match the
same pair of parentheses when there is a repetition.
.P
PCRE provides a similar feature, but of course it cannot obey arbitrary Perl
code. The feature is called "callout". The caller of PCRE provides an external
function by putting its entry point in the global variable \fIpcre_callout\fP.
By default, this variable contains NULL, which disables all calling out.
.P
Within a regular expression, (?C) indicates the points at which the external
function is to be called. If you want to identify different callout points, you
can put a number less than 256 after the letter C. The default value is zero.
For example, this pattern has two callout points:
.sp
  (?C1)abc(?C2)def
.sp
If the PCRE_AUTO_CALLOUT flag is passed to \fBpcre_compile()\fP, callouts are
automatically installed before each item in the pattern. They are all numbered
255.
.P
During matching, when PCRE reaches a callout point (and \fIpcre_callout\fP is
set), the external function is called. It is provided with the number of the
callout, the position in the pattern, and, optionally, one item of data
originally supplied by the caller of \fBpcre_exec()\fP. The callout function
may cause matching to proceed, to backtrack, or to fail altogether. A complete
description of the interface to the callout function is given in the
.\" HREF
\fBpcrecallout\fP
.\"
documentation.
.
.
.SH "BACKTRACKING CONTROL"
.rs
.sp
Perl 5.10 introduced a number of "Special Backtracking Control Verbs", which
are described in the Perl documentation as "experimental and subject to change
or removal in a future version of Perl". It goes on to say: "Their usage in
production code should be noted to avoid problems during upgrades." The same
remarks apply to the PCRE features described in this section.
.P
Since these verbs are specifically related to backtracking, most of them can be
used only when the pattern is to be matched using \fBpcre_exec()\fP, which uses
a backtracking algorithm. With the exception of (*FAIL), which behaves like a
failing negative assertion, they cause an error if encountered by
\fBpcre_dfa_exec()\fP.
.P
If any of these verbs are used in an assertion or subroutine subpattern
(including recursive subpatterns), their effect is confined to that subpattern;
it does not extend to the surrounding pattern. Note that such subpatterns are
processed as anchored at the point where they are tested.
.P
The new verbs make use of what was previously invalid syntax: an opening
parenthesis followed by an asterisk. In Perl, they are generally of the form
(*VERB:ARG) but PCRE does not support the use of arguments, so its general
form is just (*VERB). Any number of these verbs may occur in a pattern. There
are two kinds:
.
.SS "Verbs that act immediately"
.rs
.sp
The following verbs act as soon as they are encountered:
.sp
   (*ACCEPT)
.sp
This verb causes the match to end successfully, skipping the remainder of the
pattern. When inside a recursion, only the innermost pattern is ended
immediately. If (*ACCEPT) is inside capturing parentheses, the data so far is
captured. (This feature was added to PCRE at release 8.00.) For example:
.sp
  A((?:A|B(*ACCEPT)|C)D)
.sp
This matches "AB", "AAD", or "ACD"; when it matches "AB", "B" is captured by
the outer parentheses.
.sp
  (*FAIL) or (*F)
.sp
This verb causes the match to fail, forcing backtracking to occur. It is
equivalent to (?!) but easier to read. The Perl documentation notes that it is
probably useful only when combined with (?{}) or (??{}). Those are, of course,
Perl features that are not present in PCRE. The nearest equivalent is the
callout feature, as for example in this pattern:
.sp
  a+(?C)(*FAIL)
.sp
A match with the string "aaaa" always fails, but the callout is taken before
each backtrack happens (in this example, 10 times).
.
.SS "Verbs that act after backtracking"
.rs
.sp
The following verbs do nothing when they are encountered. Matching continues
with what follows, but if there is no subsequent match, a failure is forced.
The verbs differ in exactly what kind of failure occurs.
.sp
  (*COMMIT)
.sp
This verb causes the whole match to fail outright if the rest of the pattern
does not match. Even if the pattern is unanchored, no further attempts to find
a match by advancing the starting point take place. Once (*COMMIT) has been
passed, \fBpcre_exec()\fP is committed to finding a match at the current
starting point, or not at all. For example:
.sp
  a+(*COMMIT)b
.sp
This matches "xxaab" but not "aacaab". It can be thought of as a kind of
dynamic anchor, or "I've started, so I must finish."
.sp
  (*PRUNE)
.sp
This verb causes the match to fail at the current position if the rest of the
pattern does not match. If the pattern is unanchored, the normal "bumpalong"
advance to the next starting character then happens. Backtracking can occur as
usual to the left of (*PRUNE), or when matching to the right of (*PRUNE), but
if there is no match to the right, backtracking cannot cross (*PRUNE).
In simple cases, the use of (*PRUNE) is just an alternative to an atomic
group or possessive quantifier, but there are some uses of (*PRUNE) that cannot
be expressed in any other way.
.sp
  (*SKIP)
.sp
This verb is like (*PRUNE), except that if the pattern is unanchored, the
"bumpalong" advance is not to the next character, but to the position in the
subject where (*SKIP) was encountered. (*SKIP) signifies that whatever text
was matched leading up to it cannot be part of a successful match. Consider:
.sp
  a+(*SKIP)b
.sp
If the subject is "aaaac...", after the first match attempt fails (starting at
the first character in the string), the starting point skips on to start the
next attempt at "c". Note that a possessive quantifer does not have the same
effect as this example; although it would suppress backtracking during the
first match attempt, the second attempt would start at the second character
instead of skipping on to "c".
.sp
  (*THEN)
.sp
This verb causes a skip to the next alternation if the rest of the pattern does
not match. That is, it cancels pending backtracking, but only within the
current alternation. Its name comes from the observation that it can be used
for a pattern-based if-then-else block:
.sp
  ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ...
.sp
If the COND1 pattern matches, FOO is tried (and possibly further items after
the end of the group if FOO succeeds); on failure the matcher skips to the
second alternative and tries COND2, without backtracking into COND1. If (*THEN)
is used outside of any alternation, it acts exactly like (*PRUNE).
.
.
.SH "SEE ALSO"
.rs
.sp
\fBpcreapi\fP(3), \fBpcrecallout\fP(3), \fBpcrematching\fP(3),
\fBpcresyntax\fP(3), \fBpcre\fP(3).
.
.
.SH AUTHOR
.rs
.sp
.nf
Philip Hazel
University Computing Service
Cambridge CB2 3QH, England.
.fi
.
.
.SH REVISION
.rs
.sp
.nf
Last updated: 06 March 2010
Copyright (c) 1997-2010 University of Cambridge.
.fi
PK��$[�@� � man/man3/pcrematching.3nu�[���.TH PCREMATCHING 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH "PCRE MATCHING ALGORITHMS"
.rs
.sp
This document describes the two different algorithms that are available in PCRE
for matching a compiled regular expression against a given subject string. The
"standard" algorithm is the one provided by the \fBpcre_exec()\fP function.
This works in the same was as Perl's matching function, and provides a
Perl-compatible matching operation.
.P
An alternative algorithm is provided by the \fBpcre_dfa_exec()\fP function;
this operates in a different way, and is not Perl-compatible. It has advantages
and disadvantages compared with the standard algorithm, and these are described
below.
.P
When there is only one possible way in which a given subject string can match a
pattern, the two algorithms give the same answer. A difference arises, however,
when there are multiple possibilities. For example, if the pattern
.sp
  ^<.*>
.sp
is matched against the string
.sp
  <something> <something else> <something further>
.sp
there are three possible answers. The standard algorithm finds only one of
them, whereas the alternative algorithm finds all three.
.
.SH "REGULAR EXPRESSIONS AS TREES"
.rs
.sp
The set of strings that are matched by a regular expression can be represented
as a tree structure. An unlimited repetition in the pattern makes the tree of
infinite size, but it is still a tree. Matching the pattern to a given subject
string (from a given starting point) can be thought of as a search of the tree.
There are two ways to search a tree: depth-first and breadth-first, and these
correspond to the two matching algorithms provided by PCRE.
.
.SH "THE STANDARD MATCHING ALGORITHM"
.rs
.sp
In the terminology of Jeffrey Friedl's book "Mastering Regular
Expressions", the standard algorithm is an "NFA algorithm". It conducts a
depth-first search of the pattern tree. That is, it proceeds along a single
path through the tree, checking that the subject matches what is required. When
there is a mismatch, the algorithm tries any alternatives at the current point,
and if they all fail, it backs up to the previous branch point in the tree, and
tries the next alternative branch at that level. This often involves backing up
(moving to the left) in the subject string as well. The order in which
repetition branches are tried is controlled by the greedy or ungreedy nature of
the quantifier.
.P
If a leaf node is reached, a matching string has been found, and at that point
the algorithm stops. Thus, if there is more than one possible match, this
algorithm returns the first one that it finds. Whether this is the shortest,
the longest, or some intermediate length depends on the way the greedy and
ungreedy repetition quantifiers are specified in the pattern.
.P
Because it ends up with a single path through the tree, it is relatively
straightforward for this algorithm to keep track of the substrings that are
matched by portions of the pattern in parentheses. This provides support for
capturing parentheses and back references.
.
.SH "THE ALTERNATIVE MATCHING ALGORITHM"
.rs
.sp
This algorithm conducts a breadth-first search of the tree. Starting from the
first matching point in the subject, it scans the subject string from left to
right, once, character by character, and as it does this, it remembers all the
paths through the tree that represent valid matches. In Friedl's terminology,
this is a kind of "DFA algorithm", though it is not implemented as a
traditional finite state machine (it keeps multiple states active
simultaneously).
.P
Although the general principle of this matching algorithm is that it scans the
subject string only once, without backtracking, there is one exception: when a
lookaround assertion is encountered, the characters following or preceding the
current point have to be independently inspected.
.P
The scan continues until either the end of the subject is reached, or there are
no more unterminated paths. At this point, terminated paths represent the
different matching possibilities (if there are none, the match has failed).
Thus, if there is more than one possible match, this algorithm finds all of
them, and in particular, it finds the longest. There is an option to stop the
algorithm after the first match (which is necessarily the shortest) is found.
.P
Note that all the matches that are found start at the same point in the
subject. If the pattern
.sp
  cat(er(pillar)?)
.sp
is matched against the string "the caterpillar catchment", the result will be
the three strings "cat", "cater", and "caterpillar" that start at the fourth
character of the subject. The algorithm does not automatically move on to find
matches that start at later positions.
.P
There are a number of features of PCRE regular expressions that are not
supported by the alternative matching algorithm. They are as follows:
.P
1. Because the algorithm finds all possible matches, the greedy or ungreedy
nature of repetition quantifiers is not relevant. Greedy and ungreedy
quantifiers are treated in exactly the same way. However, possessive
quantifiers can make a difference when what follows could also match what is
quantified, for example in a pattern like this:
.sp
  ^a++\ew!
.sp
This pattern matches "aaab!" but not "aaa!", which would be matched by a
non-possessive quantifier. Similarly, if an atomic group is present, it is
matched as if it were a standalone pattern at the current point, and the
longest match is then "locked in" for the rest of the overall pattern.
.P
2. When dealing with multiple paths through the tree simultaneously, it is not
straightforward to keep track of captured substrings for the different matching
possibilities, and PCRE's implementation of this algorithm does not attempt to
do this. This means that no captured substrings are available.
.P
3. Because no substrings are captured, back references within the pattern are
not supported, and cause errors if encountered.
.P
4. For the same reason, conditional expressions that use a backreference as the
condition or test for a specific group recursion are not supported.
.P
5. Because many paths through the tree may be active, the \eK escape sequence,
which resets the start of the match when encountered (but may be on some paths
and not on others), is not supported. It causes an error if encountered.
.P
6. Callouts are supported, but the value of the \fIcapture_top\fP field is
always 1, and the value of the \fIcapture_last\fP field is always -1.
.P
7. The \eC escape sequence, which (in the standard algorithm) matches a single
byte, even in UTF-8 mode, is not supported because the alternative algorithm
moves through the subject string one character at a time, for all active paths
through the tree.
.P
8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) are not
supported. (*FAIL) is supported, and behaves like a failing negative assertion.
.
.SH "ADVANTAGES OF THE ALTERNATIVE ALGORITHM"
.rs
.sp
Using the alternative matching algorithm provides the following advantages:
.P
1. All possible matches (at a single point in the subject) are automatically
found, and in particular, the longest match is found. To find more than one
match using the standard algorithm, you have to do kludgy things with
callouts.
.P
2. Because the alternative algorithm scans the subject string just once, and
never needs to backtrack, it is possible to pass very long subject strings to
the matching function in several pieces, checking for partial matching each
time. The
.\" HREF
\fBpcrepartial\fP
.\"
documentation gives details of partial matching.
.
.
.SH "DISADVANTAGES OF THE ALTERNATIVE ALGORITHM"
.rs
.sp
The alternative algorithm suffers from a number of disadvantages:
.P
1. It is substantially slower than the standard algorithm. This is partly
because it has to search for all possible matches, but is also because it is
less susceptible to optimization.
.P
2. Capturing parentheses and back references are not supported.
.P
3. Although atomic groups are supported, their use does not provide the
performance advantage that it does for the standard algorithm.
.
.
.SH AUTHOR
.rs
.sp
.nf
Philip Hazel
University Computing Service
Cambridge CB2 3QH, England.
.fi
.
.
.SH REVISION
.rs
.sp
.nf
Last updated: 29 September 2009
Copyright (c) 1997-2009 University of Cambridge.
.fi
PK��$[@FU���man/man3/pcre_exec.3nu�[���.TH PCRE_EXEC 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B int pcre_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
.ti +5n
.B "const char *\fIsubject\fP," int \fIlength\fP, int \fIstartoffset\fP,
.ti +5n
.B int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);
.
.SH DESCRIPTION
.rs
.sp
This function matches a compiled regular expression against a given subject
string, using a matching algorithm that is similar to Perl's. It returns
offsets to captured substrings. Its arguments are:
.sp
  \fIcode\fP         Points to the compiled pattern
  \fIextra\fP        Points to an associated \fBpcre_extra\fP structure,
                 or is NULL
  \fIsubject\fP      Points to the subject string
  \fIlength\fP       Length of the subject string, in bytes
  \fIstartoffset\fP  Offset in bytes in the subject at which to
                 start matching
  \fIoptions\fP      Option bits
  \fIovector\fP      Points to a vector of ints for result offsets
  \fIovecsize\fP     Number of elements in the vector (a multiple of 3)
.sp
The options are:
.sp
  PCRE_ANCHORED          Match only at the first position
  PCRE_BSR_ANYCRLF       \eR matches only CR, LF, or CRLF
  PCRE_BSR_UNICODE       \eR matches all Unicode line endings
  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence
  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences
  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence
  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence
  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence
  PCRE_NOTBOL            Subject string is not the beginning of a line
  PCRE_NOTEOL            Subject string is not the end of a line
  PCRE_NOTEMPTY          An empty string is not a valid match
  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
                           is not a valid match
  PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations
  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
                           validity (only relevant if PCRE_UTF8
                           was set at compile time)
  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
  PCRE_PARTIAL_SOFT      )   match if no full matches are found
  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
                           even if there is a full match as well
.sp
For details of partial matching, see the
.\" HREF
\fBpcrepartial\fP
.\"
page. A \fBpcre_extra\fP structure contains the following fields:
.sp
  \fIflags\fP        Bits indicating which fields are set
  \fIstudy_data\fP   Opaque data from \fBpcre_study()\fP
  \fImatch_limit\fP  Limit on internal resource use
  \fImatch_limit_recursion\fP  Limit on internal recursion depth
  \fIcallout_data\fP Opaque data passed back to callouts
  \fItables\fP       Points to character tables or is NULL
.sp
The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT,
PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, and
PCRE_EXTRA_TABLES.
.P
There is a complete description of the PCRE native API in the
.\" HREF
\fBpcreapi\fP
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fP
.\"
page.
PK��$[/Z��AA#man/man3/pcre_free_substring_list.3nu�[���.TH PCRE_FREE_SUBSTRING_LIST 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B void pcre_free_substring_list(const char **\fIstringptr\fP);
.
.SH DESCRIPTION
.rs
.sp
This is a convenience function for freeing the store obtained by a previous
call to \fBpcre_get_substring_list()\fP. Its only argument is a pointer to the
list of string pointers.
.P
There is a complete description of the PCRE native API in the
.\" HREF
\fBpcreapi\fP
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fP
.\"
page.
PK��$[}�C���man/man3/pcre_config.3nu�[���.TH PCRE_CONFIG 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B int pcre_config(int \fIwhat\fP, void *\fIwhere\fP);
.
.SH DESCRIPTION
.rs
.sp
This function makes it possible for a client program to find out which optional
features are available in the version of the PCRE library it is using. Its
arguments are as follows:
.sp
  \fIwhat\fR     A code specifying what information is required
  \fIwhere\fR    Points to where to put the data
.sp
The available codes are:
.sp
  PCRE_CONFIG_LINK_SIZE     Internal link size: 2, 3, or 4
  PCRE_CONFIG_MATCH_LIMIT   Internal resource limit
  PCRE_CONFIG_MATCH_LIMIT_RECURSION
                            Internal recursion depth limit
  PCRE_CONFIG_NEWLINE       Value of the default newline sequence:
                                13 (0x000d)    for CR
                                10 (0x000a)    for LF
                              3338 (0x0d0a)    for CRLF
                                -2             for ANYCRLF
                                -1             for ANY
  PCRE_CONFIG_BSR           Indicates what \eR matches by default:
                                 0             all Unicode line endings
                                 1             CR, LF, or CRLF only
  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
                            Threshold of return slots, above
                              which \fBmalloc()\fR is used by
                              the POSIX API
  PCRE_CONFIG_STACKRECURSE  Recursion implementation (1=stack 0=heap)
  PCRE_CONFIG_UTF8          Availability of UTF-8 support (1=yes 0=no)
  PCRE_CONFIG_UNICODE_PROPERTIES
                            Availability of Unicode property support
                              (1=yes 0=no)
.sp
The function yields 0 on success or PCRE_ERROR_BADOPTION otherwise.
.P
There is a complete description of the PCRE native API in the
.\" HREF
\fBpcreapi\fR
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fR
.\"
page.
PK��$[W��_�_man/man3/pcreapi.3nu�[���.TH PCREAPI 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH "PCRE NATIVE API"
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B pcre *pcre_compile(const char *\fIpattern\fP, int \fIoptions\fP,
.ti +5n
.B const char **\fIerrptr\fP, int *\fIerroffset\fP,
.ti +5n
.B const unsigned char *\fItableptr\fP);
.PP
.B pcre *pcre_compile2(const char *\fIpattern\fP, int \fIoptions\fP,
.ti +5n
.B int *\fIerrorcodeptr\fP,
.ti +5n
.B const char **\fIerrptr\fP, int *\fIerroffset\fP,
.ti +5n
.B const unsigned char *\fItableptr\fP);
.PP
.B pcre_extra *pcre_study(const pcre *\fIcode\fP, int \fIoptions\fP,
.ti +5n
.B const char **\fIerrptr\fP);
.PP
.B int pcre_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
.ti +5n
.B "const char *\fIsubject\fP," int \fIlength\fP, int \fIstartoffset\fP,
.ti +5n
.B int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);
.PP
.B int pcre_dfa_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
.ti +5n
.B "const char *\fIsubject\fP," int \fIlength\fP, int \fIstartoffset\fP,
.ti +5n
.B int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP,
.ti +5n
.B int *\fIworkspace\fP, int \fIwscount\fP);
.PP
.B int pcre_copy_named_substring(const pcre *\fIcode\fP,
.ti +5n
.B const char *\fIsubject\fP, int *\fIovector\fP,
.ti +5n
.B int \fIstringcount\fP, const char *\fIstringname\fP,
.ti +5n
.B char *\fIbuffer\fP, int \fIbuffersize\fP);
.PP
.B int pcre_copy_substring(const char *\fIsubject\fP, int *\fIovector\fP,
.ti +5n
.B int \fIstringcount\fP, int \fIstringnumber\fP, char *\fIbuffer\fP,
.ti +5n
.B int \fIbuffersize\fP);
.PP
.B int pcre_get_named_substring(const pcre *\fIcode\fP,
.ti +5n
.B const char *\fIsubject\fP, int *\fIovector\fP,
.ti +5n
.B int \fIstringcount\fP, const char *\fIstringname\fP,
.ti +5n
.B const char **\fIstringptr\fP);
.PP
.B int pcre_get_stringnumber(const pcre *\fIcode\fP,
.ti +5n
.B const char *\fIname\fP);
.PP
.B int pcre_get_stringtable_entries(const pcre *\fIcode\fP,
.ti +5n
.B const char *\fIname\fP, char **\fIfirst\fP, char **\fIlast\fP);
.PP
.B int pcre_get_substring(const char *\fIsubject\fP, int *\fIovector\fP,
.ti +5n
.B int \fIstringcount\fP, int \fIstringnumber\fP,
.ti +5n
.B const char **\fIstringptr\fP);
.PP
.B int pcre_get_substring_list(const char *\fIsubject\fP,
.ti +5n
.B int *\fIovector\fP, int \fIstringcount\fP, "const char ***\fIlistptr\fP);"
.PP
.B void pcre_free_substring(const char *\fIstringptr\fP);
.PP
.B void pcre_free_substring_list(const char **\fIstringptr\fP);
.PP
.B const unsigned char *pcre_maketables(void);
.PP
.B int pcre_fullinfo(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
.ti +5n
.B int \fIwhat\fP, void *\fIwhere\fP);
.PP
.B int pcre_info(const pcre *\fIcode\fP, int *\fIoptptr\fP, int
.B *\fIfirstcharptr\fP);
.PP
.B int pcre_refcount(pcre *\fIcode\fP, int \fIadjust\fP);
.PP
.B int pcre_config(int \fIwhat\fP, void *\fIwhere\fP);
.PP
.B char *pcre_version(void);
.PP
.B void *(*pcre_malloc)(size_t);
.PP
.B void (*pcre_free)(void *);
.PP
.B void *(*pcre_stack_malloc)(size_t);
.PP
.B void (*pcre_stack_free)(void *);
.PP
.B int (*pcre_callout)(pcre_callout_block *);
.
.
.SH "PCRE API OVERVIEW"
.rs
.sp
PCRE has its own native API, which is described in this document. There are
also some wrapper functions that correspond to the POSIX regular expression
API. These are described in the
.\" HREF
\fBpcreposix\fP
.\"
documentation. Both of these APIs define a set of C function calls. A C++
wrapper is distributed with PCRE. It is documented in the
.\" HREF
\fBpcrecpp\fP
.\"
page.
.P
The native API C function prototypes are defined in the header file
\fBpcre.h\fP, and on Unix systems the library itself is called \fBlibpcre\fP.
It can normally be accessed by adding \fB-lpcre\fP to the command for linking
an application that uses PCRE. The header file defines the macros PCRE_MAJOR
and PCRE_MINOR to contain the major and minor release numbers for the library.
Applications can use these to include support for different releases of PCRE.
.P
The functions \fBpcre_compile()\fP, \fBpcre_compile2()\fP, \fBpcre_study()\fP,
and \fBpcre_exec()\fP are used for compiling and matching regular expressions
in a Perl-compatible manner. A sample program that demonstrates the simplest
way of using them is provided in the file called \fIpcredemo.c\fP in the PCRE
source distribution. A listing of this program is given in the
.\" HREF
\fBpcredemo\fP
.\"
documentation, and the
.\" HREF
\fBpcresample\fP
.\"
documentation describes how to compile and run it.
.P
A second matching function, \fBpcre_dfa_exec()\fP, which is not
Perl-compatible, is also provided. This uses a different algorithm for the
matching. The alternative algorithm finds all possible matches (at a given
point in the subject), and scans the subject just once (unless there are
lookbehind assertions). However, this algorithm does not return captured
substrings. A description of the two matching algorithms and their advantages
and disadvantages is given in the
.\" HREF
\fBpcrematching\fP
.\"
documentation.
.P
In addition to the main compiling and matching functions, there are convenience
functions for extracting captured substrings from a subject string that is
matched by \fBpcre_exec()\fP. They are:
.sp
  \fBpcre_copy_substring()\fP
  \fBpcre_copy_named_substring()\fP
  \fBpcre_get_substring()\fP
  \fBpcre_get_named_substring()\fP
  \fBpcre_get_substring_list()\fP
  \fBpcre_get_stringnumber()\fP
  \fBpcre_get_stringtable_entries()\fP
.sp
\fBpcre_free_substring()\fP and \fBpcre_free_substring_list()\fP are also
provided, to free the memory used for extracted strings.
.P
The function \fBpcre_maketables()\fP is used to build a set of character tables
in the current locale for passing to \fBpcre_compile()\fP, \fBpcre_exec()\fP,
or \fBpcre_dfa_exec()\fP. This is an optional facility that is provided for
specialist use. Most commonly, no special tables are passed, in which case
internal tables that are generated when PCRE is built are used.
.P
The function \fBpcre_fullinfo()\fP is used to find out information about a
compiled pattern; \fBpcre_info()\fP is an obsolete version that returns only
some of the available information, but is retained for backwards compatibility.
The function \fBpcre_version()\fP returns a pointer to a string containing the
version of PCRE and its date of release.
.P
The function \fBpcre_refcount()\fP maintains a reference count in a data block
containing a compiled pattern. This is provided for the benefit of
object-oriented applications.
.P
The global variables \fBpcre_malloc\fP and \fBpcre_free\fP initially contain
the entry points of the standard \fBmalloc()\fP and \fBfree()\fP functions,
respectively. PCRE calls the memory management functions via these variables,
so a calling program can replace them if it wishes to intercept the calls. This
should be done before calling any PCRE functions.
.P
The global variables \fBpcre_stack_malloc\fP and \fBpcre_stack_free\fP are also
indirections to memory management functions. These special functions are used
only when PCRE is compiled to use the heap for remembering data, instead of
recursive function calls, when running the \fBpcre_exec()\fP function. See the
.\" HREF
\fBpcrebuild\fP
.\"
documentation for details of how to do this. It is a non-standard way of
building PCRE, for use in environments that have limited stacks. Because of the
greater use of memory management, it runs more slowly. Separate functions are
provided so that special-purpose external code can be used for this case. When
used, these functions are always called in a stack-like manner (last obtained,
first freed), and always for memory blocks of the same size. There is a
discussion about PCRE's stack usage in the
.\" HREF
\fBpcrestack\fP
.\"
documentation.
.P
The global variable \fBpcre_callout\fP initially contains NULL. It can be set
by the caller to a "callout" function, which PCRE will then call at specified
points during a matching operation. Details are given in the
.\" HREF
\fBpcrecallout\fP
.\"
documentation.
.
.
.\" HTML <a name="newlines"></a>
.SH NEWLINES
.rs
.sp
PCRE supports five different conventions for indicating line breaks in
strings: a single CR (carriage return) character, a single LF (linefeed)
character, the two-character sequence CRLF, any of the three preceding, or any
Unicode newline sequence. The Unicode newline sequences are the three just
mentioned, plus the single characters VT (vertical tab, U+000B), FF (formfeed,
U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS
(paragraph separator, U+2029).
.P
Each of the first three conventions is used by at least one operating system as
its standard newline sequence. When PCRE is built, a default can be specified.
The default default is LF, which is the Unix standard. When PCRE is run, the
default can be overridden, either when a pattern is compiled, or when it is
matched.
.P
At compile time, the newline convention can be specified by the \fIoptions\fP
argument of \fBpcre_compile()\fP, or it can be specified by special text at the
start of the pattern itself; this overrides any other settings. See the
.\" HREF
\fBpcrepattern\fP
.\"
page for details of the special character sequences.
.P
In the PCRE documentation the word "newline" is used to mean "the character or
pair of characters that indicate a line break". The choice of newline
convention affects the handling of the dot, circumflex, and dollar
metacharacters, the handling of #-comments in /x mode, and, when CRLF is a
recognized line ending sequence, the match position advancement for a
non-anchored pattern. There is more detail about this in the
.\" HTML <a href="#execoptions">
.\" </a>
section on \fBpcre_exec()\fP options
.\"
below.
.P
The choice of newline convention does not affect the interpretation of
the \en or \er escape sequences, nor does it affect what \eR matches, which is
controlled in a similar way, but by separate options.
.
.
.SH MULTITHREADING
.rs
.sp
The PCRE functions can be used in multi-threading applications, with the
proviso that the memory management functions pointed to by \fBpcre_malloc\fP,
\fBpcre_free\fP, \fBpcre_stack_malloc\fP, and \fBpcre_stack_free\fP, and the
callout function pointed to by \fBpcre_callout\fP, are shared by all threads.
.P
The compiled form of a regular expression is not altered during matching, so
the same compiled pattern can safely be used by several threads at once.
.
.
.SH "SAVING PRECOMPILED PATTERNS FOR LATER USE"
.rs
.sp
The compiled form of a regular expression can be saved and re-used at a later
time, possibly by a different program, and even on a host other than the one on
which it was compiled. Details are given in the
.\" HREF
\fBpcreprecompile\fP
.\"
documentation. However, compiling a regular expression with one version of PCRE
for use with a different version is not guaranteed to work and may cause
crashes.
.
.
.SH "CHECKING BUILD-TIME OPTIONS"
.rs
.sp
.B int pcre_config(int \fIwhat\fP, void *\fIwhere\fP);
.PP
The function \fBpcre_config()\fP makes it possible for a PCRE client to
discover which optional features have been compiled into the PCRE library. The
.\" HREF
\fBpcrebuild\fP
.\"
documentation has more details about these optional features.
.P
The first argument for \fBpcre_config()\fP is an integer, specifying which
information is required; the second argument is a pointer to a variable into
which the information is placed. The following information is available:
.sp
  PCRE_CONFIG_UTF8
.sp
The output is an integer that is set to one if UTF-8 support is available;
otherwise it is set to zero.
.sp
  PCRE_CONFIG_UNICODE_PROPERTIES
.sp
The output is an integer that is set to one if support for Unicode character
properties is available; otherwise it is set to zero.
.sp
  PCRE_CONFIG_NEWLINE
.sp
The output is an integer whose value specifies the default character sequence
that is recognized as meaning "newline". The four values that are supported
are: 10 for LF, 13 for CR, 3338 for CRLF, -2 for ANYCRLF, and -1 for ANY.
Though they are derived from ASCII, the same values are returned in EBCDIC
environments. The default should normally correspond to the standard sequence
for your operating system.
.sp
  PCRE_CONFIG_BSR
.sp
The output is an integer whose value indicates what character sequences the \eR
escape sequence matches by default. A value of 0 means that \eR matches any
Unicode line ending sequence; a value of 1 means that \eR matches only CR, LF,
or CRLF. The default can be overridden when a pattern is compiled or matched.
.sp
  PCRE_CONFIG_LINK_SIZE
.sp
The output is an integer that contains the number of bytes used for internal
linkage in compiled regular expressions. The value is 2, 3, or 4. Larger values
allow larger regular expressions to be compiled, at the expense of slower
matching. The default value of 2 is sufficient for all but the most massive
patterns, since it allows the compiled pattern to be up to 64K in size.
.sp
  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
.sp
The output is an integer that contains the threshold above which the POSIX
interface uses \fBmalloc()\fP for output vectors. Further details are given in
the
.\" HREF
\fBpcreposix\fP
.\"
documentation.
.sp
  PCRE_CONFIG_MATCH_LIMIT
.sp
The output is a long integer that gives the default limit for the number of
internal matching function calls in a \fBpcre_exec()\fP execution. Further
details are given with \fBpcre_exec()\fP below.
.sp
  PCRE_CONFIG_MATCH_LIMIT_RECURSION
.sp
The output is a long integer that gives the default limit for the depth of
recursion when calling the internal matching function in a \fBpcre_exec()\fP
execution. Further details are given with \fBpcre_exec()\fP below.
.sp
  PCRE_CONFIG_STACKRECURSE
.sp
The output is an integer that is set to one if internal recursion when running
\fBpcre_exec()\fP is implemented by recursive function calls that use the stack
to remember their state. This is the usual way that PCRE is compiled. The
output is zero if PCRE was compiled to use blocks of data on the heap instead
of recursive function calls. In this case, \fBpcre_stack_malloc\fP and
\fBpcre_stack_free\fP are called to manage memory blocks on the heap, thus
avoiding the use of the stack.
.
.
.SH "COMPILING A PATTERN"
.rs
.sp
.B pcre *pcre_compile(const char *\fIpattern\fP, int \fIoptions\fP,
.ti +5n
.B const char **\fIerrptr\fP, int *\fIerroffset\fP,
.ti +5n
.B const unsigned char *\fItableptr\fP);
.sp
.B pcre *pcre_compile2(const char *\fIpattern\fP, int \fIoptions\fP,
.ti +5n
.B int *\fIerrorcodeptr\fP,
.ti +5n
.B const char **\fIerrptr\fP, int *\fIerroffset\fP,
.ti +5n
.B const unsigned char *\fItableptr\fP);
.P
Either of the functions \fBpcre_compile()\fP or \fBpcre_compile2()\fP can be
called to compile a pattern into an internal form. The only difference between
the two interfaces is that \fBpcre_compile2()\fP has an additional argument,
\fIerrorcodeptr\fP, via which a numerical error code can be returned. To avoid
too much repetition, we refer just to \fBpcre_compile()\fP below, but the
information applies equally to \fBpcre_compile2()\fP.
.P
The pattern is a C string terminated by a binary zero, and is passed in the
\fIpattern\fP argument. A pointer to a single block of memory that is obtained
via \fBpcre_malloc\fP is returned. This contains the compiled code and related
data. The \fBpcre\fP type is defined for the returned block; this is a typedef
for a structure whose contents are not externally defined. It is up to the
caller to free the memory (via \fBpcre_free\fP) when it is no longer required.
.P
Although the compiled code of a PCRE regex is relocatable, that is, it does not
depend on memory location, the complete \fBpcre\fP data block is not
fully relocatable, because it may contain a copy of the \fItableptr\fP
argument, which is an address (see below).
.P
The \fIoptions\fP argument contains various bit settings that affect the
compilation. It should be zero if no options are required. The available
options are described below. Some of them (in particular, those that are
compatible with Perl, but some others as well) can also be set and unset from
within the pattern (see the detailed description in the
.\" HREF
\fBpcrepattern\fP
.\"
documentation). For those options that can be different in different parts of
the pattern, the contents of the \fIoptions\fP argument specifies their
settings at the start of compilation and execution. The PCRE_ANCHORED,
PCRE_BSR_\fIxxx\fP, and PCRE_NEWLINE_\fIxxx\fP options can be set at the time
of matching as well as at compile time.
.P
If \fIerrptr\fP is NULL, \fBpcre_compile()\fP returns NULL immediately.
Otherwise, if compilation of a pattern fails, \fBpcre_compile()\fP returns
NULL, and sets the variable pointed to by \fIerrptr\fP to point to a textual
error message. This is a static string that is part of the library. You must
not try to free it. The byte offset from the start of the pattern to the
character that was being processed when the error was discovered is placed in
the variable pointed to by \fIerroffset\fP, which must not be NULL. If it is,
an immediate error is given. Some errors are not detected until checks are
carried out when the whole pattern has been scanned; in this case the offset is
set to the end of the pattern.
.P
If \fBpcre_compile2()\fP is used instead of \fBpcre_compile()\fP, and the
\fIerrorcodeptr\fP argument is not NULL, a non-zero error code number is
returned via this argument in the event of an error. This is in addition to the
textual error message. Error codes and messages are listed below.
.P
If the final argument, \fItableptr\fP, is NULL, PCRE uses a default set of
character tables that are built when PCRE is compiled, using the default C
locale. Otherwise, \fItableptr\fP must be an address that is the result of a
call to \fBpcre_maketables()\fP. This value is stored with the compiled
pattern, and used again by \fBpcre_exec()\fP, unless another table pointer is
passed to it. For more discussion, see the section on locale support below.
.P
This code fragment shows a typical straightforward call to \fBpcre_compile()\fP:
.sp
  pcre *re;
  const char *error;
  int erroffset;
  re = pcre_compile(
    "^A.*Z",          /* the pattern */
    0,                /* default options */
    &error,           /* for error message */
    &erroffset,       /* for error offset */
    NULL);            /* use default character tables */
.sp
The following names for option bits are defined in the \fBpcre.h\fP header
file:
.sp
  PCRE_ANCHORED
.sp
If this bit is set, the pattern is forced to be "anchored", that is, it is
constrained to match only at the first matching point in the string that is
being searched (the "subject string"). This effect can also be achieved by
appropriate constructs in the pattern itself, which is the only way to do it in
Perl.
.sp
  PCRE_AUTO_CALLOUT
.sp
If this bit is set, \fBpcre_compile()\fP automatically inserts callout items,
all with number 255, before each pattern item. For discussion of the callout
facility, see the
.\" HREF
\fBpcrecallout\fP
.\"
documentation.
.sp
  PCRE_BSR_ANYCRLF
  PCRE_BSR_UNICODE
.sp
These options (which are mutually exclusive) control what the \eR escape
sequence matches. The choice is either to match only CR, LF, or CRLF, or to
match any Unicode newline sequence. The default is specified when PCRE is
built. It can be overridden from within the pattern, or by setting an option
when a compiled pattern is matched.
.sp
  PCRE_CASELESS
.sp
If this bit is set, letters in the pattern match both upper and lower case
letters. It is equivalent to Perl's /i option, and it can be changed within a
pattern by a (?i) option setting. In UTF-8 mode, PCRE always understands the
concept of case for characters whose values are less than 128, so caseless
matching is always possible. For characters with higher values, the concept of
case is supported if PCRE is compiled with Unicode property support, but not
otherwise. If you want to use caseless matching for characters 128 and above,
you must ensure that PCRE is compiled with Unicode property support as well as
with UTF-8 support.
.sp
  PCRE_DOLLAR_ENDONLY
.sp
If this bit is set, a dollar metacharacter in the pattern matches only at the
end of the subject string. Without this option, a dollar also matches
immediately before a newline at the end of the string (but not before any other
newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set.
There is no equivalent to this option in Perl, and no way to set it within a
pattern.
.sp
  PCRE_DOTALL
.sp
If this bit is set, a dot metacharater in the pattern matches all characters,
including those that indicate newline. Without it, a dot does not match when
the current position is at a newline. This option is equivalent to Perl's /s
option, and it can be changed within a pattern by a (?s) option setting. A
negative class such as [^a] always matches newline characters, independent of
the setting of this option.
.sp
  PCRE_DUPNAMES
.sp
If this bit is set, names used to identify capturing subpatterns need not be
unique. This can be helpful for certain types of pattern when it is known that
only one instance of the named subpattern can ever be matched. There are more
details of named subpatterns below; see also the
.\" HREF
\fBpcrepattern\fP
.\"
documentation.
.sp
  PCRE_EXTENDED
.sp
If this bit is set, whitespace data characters in the pattern are totally
ignored except when escaped or inside a character class. Whitespace does not
include the VT character (code 11). In addition, characters between an
unescaped # outside a character class and the next newline, inclusive, are also
ignored. This is equivalent to Perl's /x option, and it can be changed within a
pattern by a (?x) option setting.
.P
This option makes it possible to include comments inside complicated patterns.
Note, however, that this applies only to data characters. Whitespace characters
may never appear within special character sequences in a pattern, for example
within the sequence (?( which introduces a conditional subpattern.
.sp
  PCRE_EXTRA
.sp
This option was invented in order to turn on additional functionality of PCRE
that is incompatible with Perl, but it is currently of very little use. When
set, any backslash in a pattern that is followed by a letter that has no
special meaning causes an error, thus reserving these combinations for future
expansion. By default, as in Perl, a backslash followed by a letter with no
special meaning is treated as a literal. (Perl can, however, be persuaded to
give a warning for this.) There are at present no other features controlled by
this option. It can also be set by a (?X) option setting within a pattern.
.sp
  PCRE_FIRSTLINE
.sp
If this option is set, an unanchored pattern is required to match before or at
the first newline in the subject string, though the matched text may continue
over the newline.
.sp
  PCRE_JAVASCRIPT_COMPAT
.sp
If this option is set, PCRE's behaviour is changed in some ways so that it is
compatible with JavaScript rather than Perl. The changes are as follows:
.P
(1) A lone closing square bracket in a pattern causes a compile-time error,
because this is illegal in JavaScript (by default it is treated as a data
character). Thus, the pattern AB]CD becomes illegal when this option is set.
.P
(2) At run time, a back reference to an unset subpattern group matches an empty
string (by default this causes the current matching alternative to fail). A
pattern such as (\e1)(a) succeeds when this option is set (assuming it can find
an "a" in the subject), whereas it fails by default, for Perl compatibility.
.sp
  PCRE_MULTILINE
.sp
By default, PCRE treats the subject string as consisting of a single line of
characters (even if it actually contains newlines). The "start of line"
metacharacter (^) matches only at the start of the string, while the "end of
line" metacharacter ($) matches only at the end of the string, or before a
terminating newline (unless PCRE_DOLLAR_ENDONLY is set). This is the same as
Perl.
.P
When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs
match immediately following or immediately before internal newlines in the
subject string, respectively, as well as at the very start and end. This is
equivalent to Perl's /m option, and it can be changed within a pattern by a
(?m) option setting. If there are no newlines in a subject string, or no
occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no effect.
.sp
  PCRE_NEWLINE_CR
  PCRE_NEWLINE_LF
  PCRE_NEWLINE_CRLF
  PCRE_NEWLINE_ANYCRLF
  PCRE_NEWLINE_ANY
.sp
These options override the default newline definition that was chosen when PCRE
was built. Setting the first or the second specifies that a newline is
indicated by a single character (CR or LF, respectively). Setting
PCRE_NEWLINE_CRLF specifies that a newline is indicated by the two-character
CRLF sequence. Setting PCRE_NEWLINE_ANYCRLF specifies that any of the three
preceding sequences should be recognized. Setting PCRE_NEWLINE_ANY specifies
that any Unicode newline sequence should be recognized. The Unicode newline
sequences are the three just mentioned, plus the single characters VT (vertical
tab, U+000B), FF (formfeed, U+000C), NEL (next line, U+0085), LS (line
separator, U+2028), and PS (paragraph separator, U+2029). The last two are
recognized only in UTF-8 mode.
.P
The newline setting in the options word uses three bits that are treated
as a number, giving eight possibilities. Currently only six are used (default
plus the five values above). This means that if you set more than one newline
option, the combination may or may not be sensible. For example,
PCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to PCRE_NEWLINE_CRLF, but
other combinations may yield unused numbers and cause an error.
.P
The only time that a line break is specially recognized when compiling a
pattern is if PCRE_EXTENDED is set, and an unescaped # outside a character
class is encountered. This indicates a comment that lasts until after the next
line break sequence. In other circumstances, line break sequences are treated
as literal data, except that in PCRE_EXTENDED mode, both CR and LF are treated
as whitespace characters and are therefore ignored.
.P
The newline option that is set at compile time becomes the default that is used
for \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP, but it can be overridden.
.sp
  PCRE_NO_AUTO_CAPTURE
.sp
If this option is set, it disables the use of numbered capturing parentheses in
the pattern. Any opening parenthesis that is not followed by ? behaves as if it
were followed by ?: but named parentheses can still be used for capturing (and
they acquire numbers in the usual way). There is no equivalent of this option
in Perl.
.sp
  PCRE_UNGREEDY
.sp
This option inverts the "greediness" of the quantifiers so that they are not
greedy by default, but become greedy if followed by "?". It is not compatible
with Perl. It can also be set by a (?U) option setting within the pattern.
.sp
  PCRE_UTF8
.sp
This option causes PCRE to regard both the pattern and the subject as strings
of UTF-8 characters instead of single-byte character strings. However, it is
available only when PCRE is built to include UTF-8 support. If not, the use
of this option provokes an error. Details of how this option changes the
behaviour of PCRE are given in the
.\" HTML <a href="pcre.html#utf8support">
.\" </a>
section on UTF-8 support
.\"
in the main
.\" HREF
\fBpcre\fP
.\"
page.
.sp
  PCRE_NO_UTF8_CHECK
.sp
When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is
automatically checked. There is a discussion about the
.\" HTML <a href="pcre.html#utf8strings">
.\" </a>
validity of UTF-8 strings
.\"
in the main
.\" HREF
\fBpcre\fP
.\"
page. If an invalid UTF-8 sequence of bytes is found, \fBpcre_compile()\fP
returns an error. If you already know that your pattern is valid, and you want
to skip this check for performance reasons, you can set the PCRE_NO_UTF8_CHECK
option. When it is set, the effect of passing an invalid UTF-8 string as a
pattern is undefined. It may cause your program to crash. Note that this option
can also be passed to \fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP, to suppress
the UTF-8 validity checking of subject strings.
.
.
.SH "COMPILATION ERROR CODES"
.rs
.sp
The following table lists the error codes than may be returned by
\fBpcre_compile2()\fP, along with the error messages that may be returned by
both compiling functions. As PCRE has developed, some error codes have fallen
out of use. To avoid confusion, they have not been re-used.
.sp
   0  no error
   1  \e at end of pattern
   2  \ec at end of pattern
   3  unrecognized character follows \e
   4  numbers out of order in {} quantifier
   5  number too big in {} quantifier
   6  missing terminating ] for character class
   7  invalid escape sequence in character class
   8  range out of order in character class
   9  nothing to repeat
  10  [this code is not in use]
  11  internal error: unexpected repeat
  12  unrecognized character after (? or (?-
  13  POSIX named classes are supported only within a class
  14  missing )
  15  reference to non-existent subpattern
  16  erroffset passed as NULL
  17  unknown option bit(s) set
  18  missing ) after comment
  19  [this code is not in use]
  20  regular expression is too large
  21  failed to get memory
  22  unmatched parentheses
  23  internal error: code overflow
  24  unrecognized character after (?<
  25  lookbehind assertion is not fixed length
  26  malformed number or name after (?(
  27  conditional group contains more than two branches
  28  assertion expected after (?(
  29  (?R or (?[+-]digits must be followed by )
  30  unknown POSIX class name
  31  POSIX collating elements are not supported
  32  this version of PCRE is not compiled with PCRE_UTF8 support
  33  [this code is not in use]
  34  character value in \ex{...} sequence is too large
  35  invalid condition (?(0)
  36  \eC not allowed in lookbehind assertion
  37  PCRE does not support \eL, \el, \eN, \eU, or \eu
  38  number after (?C is > 255
  39  closing ) for (?C expected
  40  recursive call could loop indefinitely
  41  unrecognized character after (?P
  42  syntax error in subpattern name (missing terminator)
  43  two named subpatterns have the same name
  44  invalid UTF-8 string
  45  support for \eP, \ep, and \eX has not been compiled
  46  malformed \eP or \ep sequence
  47  unknown property name after \eP or \ep
  48  subpattern name is too long (maximum 32 characters)
  49  too many named subpatterns (maximum 10000)
  50  [this code is not in use]
  51  octal value is greater than \e377 (not in UTF-8 mode)
  52  internal error: overran compiling workspace
  53  internal error: previously-checked referenced subpattern not found
  54  DEFINE group contains more than one branch
  55  repeating a DEFINE group is not allowed
  56  inconsistent NEWLINE options
  57  \eg is not followed by a braced, angle-bracketed, or quoted
        name/number or by a plain number
  58  a numbered reference must not be zero
  59  (*VERB) with an argument is not supported
  60  (*VERB) not recognized
  61  number is too big
  62  subpattern name expected
  63  digit expected after (?+
  64  ] is an invalid data character in JavaScript compatibility mode
.sp
The numbers 32 and 10000 in errors 48 and 49 are defaults; different values may
be used if the limits were changed when PCRE was built.
.
.
.SH "STUDYING A PATTERN"
.rs
.sp
.B pcre_extra *pcre_study(const pcre *\fIcode\fP, int \fIoptions\fP
.ti +5n
.B const char **\fIerrptr\fP);
.PP
If a compiled pattern is going to be used several times, it is worth spending
more time analyzing it in order to speed up the time taken for matching. The
function \fBpcre_study()\fP takes a pointer to a compiled pattern as its first
argument. If studying the pattern produces additional information that will
help speed up matching, \fBpcre_study()\fP returns a pointer to a
\fBpcre_extra\fP block, in which the \fIstudy_data\fP field points to the
results of the study.
.P
The returned value from \fBpcre_study()\fP can be passed directly to
\fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. However, a \fBpcre_extra\fP block
also contains other fields that can be set by the caller before the block is
passed; these are described
.\" HTML <a href="#extradata">
.\" </a>
below
.\"
in the section on matching a pattern.
.P
If studying the pattern does not produce any useful information,
\fBpcre_study()\fP returns NULL. In that circumstance, if the calling program
wants to pass any of the other fields to \fBpcre_exec()\fP or
\fBpcre_dfa_exec()\fP, it must set up its own \fBpcre_extra\fP block.
.P
The second argument of \fBpcre_study()\fP contains option bits. At present, no
options are defined, and this argument should always be zero.
.P
The third argument for \fBpcre_study()\fP is a pointer for an error message. If
studying succeeds (even if no data is returned), the variable it points to is
set to NULL. Otherwise it is set to point to a textual error message. This is a
static string that is part of the library. You must not try to free it. You
should test the error pointer for NULL after calling \fBpcre_study()\fP, to be
sure that it has run successfully.
.P
This is a typical call to \fBpcre_study\fP():
.sp
  pcre_extra *pe;
  pe = pcre_study(
    re,             /* result of pcre_compile() */
    0,              /* no options exist */
    &error);        /* set to NULL or points to a message */
.sp
Studying a pattern does two things: first, a lower bound for the length of
subject string that is needed to match the pattern is computed. This does not
mean that there are any strings of that length that match, but it does
guarantee that no shorter strings match. The value is used by
\fBpcre_exec()\fP and \fBpcre_dfa_exec()\fP to avoid wasting time by trying to
match strings that are shorter than the lower bound. You can find out the value
in a calling program via the \fBpcre_fullinfo()\fP function.
.P
Studying a pattern is also useful for non-anchored patterns that do not have a
single fixed starting character. A bitmap of possible starting bytes is
created. This speeds up finding a position in the subject at which to start
matching.
.
.
.\" HTML <a name="localesupport"></a>
.SH "LOCALE SUPPORT"
.rs
.sp
PCRE handles caseless matching, and determines whether characters are letters,
digits, or whatever, by reference to a set of tables, indexed by character
value. When running in UTF-8 mode, this applies only to characters with codes
less than 128. Higher-valued codes never match escapes such as \ew or \ed, but
can be tested with \ep if PCRE is built with Unicode character property
support. The use of locales with Unicode is discouraged. If you are handling
characters with codes greater than 128, you should either use UTF-8 and
Unicode, or use locales, but not try to mix the two.
.P
PCRE contains an internal set of tables that are used when the final argument
of \fBpcre_compile()\fP is NULL. These are sufficient for many applications.
Normally, the internal tables recognize only ASCII characters. However, when
PCRE is built, it is possible to cause the internal tables to be rebuilt in the
default "C" locale of the local system, which may cause them to be different.
.P
The internal tables can always be overridden by tables supplied by the
application that calls PCRE. These may be created in a different locale from
the default. As more and more applications change to using Unicode, the need
for this locale support is expected to die away.
.P
External tables are built by calling the \fBpcre_maketables()\fP function,
which has no arguments, in the relevant locale. The result can then be passed
to \fBpcre_compile()\fP or \fBpcre_exec()\fP as often as necessary. For
example, to build and use tables that are appropriate for the French locale
(where accented characters with values greater than 128 are treated as letters),
the following code could be used:
.sp
  setlocale(LC_CTYPE, "fr_FR");
  tables = pcre_maketables();
  re = pcre_compile(..., tables);
.sp
The locale name "fr_FR" is used on Linux and other Unix-like systems; if you
are using Windows, the name for the French locale is "french".
.P
When \fBpcre_maketables()\fP runs, the tables are built in memory that is
obtained via \fBpcre_malloc\fP. It is the caller's responsibility to ensure
that the memory containing the tables remains available for as long as it is
needed.
.P
The pointer that is passed to \fBpcre_compile()\fP is saved with the compiled
pattern, and the same tables are used via this pointer by \fBpcre_study()\fP
and normally also by \fBpcre_exec()\fP. Thus, by default, for any single
pattern, compilation, studying and matching all happen in the same locale, but
different patterns can be compiled in different locales.
.P
It is possible to pass a table pointer or NULL (indicating the use of the
internal tables) to \fBpcre_exec()\fP. Although not intended for this purpose,
this facility could be used to match a pattern in a different locale from the
one in which it was compiled. Passing table pointers at run time is discussed
below in the section on matching a pattern.
.
.
.SH "INFORMATION ABOUT A PATTERN"
.rs
.sp
.B int pcre_fullinfo(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
.ti +5n
.B int \fIwhat\fP, void *\fIwhere\fP);
.PP
The \fBpcre_fullinfo()\fP function returns information about a compiled
pattern. It replaces the obsolete \fBpcre_info()\fP function, which is
nevertheless retained for backwards compability (and is documented below).
.P
The first argument for \fBpcre_fullinfo()\fP is a pointer to the compiled
pattern. The second argument is the result of \fBpcre_study()\fP, or NULL if
the pattern was not studied. The third argument specifies which piece of
information is required, and the fourth argument is a pointer to a variable
to receive the data. The yield of the function is zero for success, or one of
the following negative numbers:
.sp
  PCRE_ERROR_NULL       the argument \fIcode\fP was NULL
                        the argument \fIwhere\fP was NULL
  PCRE_ERROR_BADMAGIC   the "magic number" was not found
  PCRE_ERROR_BADOPTION  the value of \fIwhat\fP was invalid
.sp
The "magic number" is placed at the start of each compiled pattern as an simple
check against passing an arbitrary memory pointer. Here is a typical call of
\fBpcre_fullinfo()\fP, to obtain the length of the compiled pattern:
.sp
  int rc;
  size_t length;
  rc = pcre_fullinfo(
    re,               /* result of pcre_compile() */
    pe,               /* result of pcre_study(), or NULL */
    PCRE_INFO_SIZE,   /* what is required */
    &length);         /* where to put the data */
.sp
The possible values for the third argument are defined in \fBpcre.h\fP, and are
as follows:
.sp
  PCRE_INFO_BACKREFMAX
.sp
Return the number of the highest back reference in the pattern. The fourth
argument should point to an \fBint\fP variable. Zero is returned if there are
no back references.
.sp
  PCRE_INFO_CAPTURECOUNT
.sp
Return the number of capturing subpatterns in the pattern. The fourth argument
should point to an \fBint\fP variable.
.sp
  PCRE_INFO_DEFAULT_TABLES
.sp
Return a pointer to the internal default character tables within PCRE. The
fourth argument should point to an \fBunsigned char *\fP variable. This
information call is provided for internal use by the \fBpcre_study()\fP
function. External callers can cause PCRE to use its internal tables by passing
a NULL table pointer.
.sp
  PCRE_INFO_FIRSTBYTE
.sp
Return information about the first byte of any matched string, for a
non-anchored pattern. The fourth argument should point to an \fBint\fP
variable. (This option used to be called PCRE_INFO_FIRSTCHAR; the old name is
still recognized for backwards compatibility.)
.P
If there is a fixed first byte, for example, from a pattern such as
(cat|cow|coyote), its value is returned. Otherwise, if either
.sp
(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch
starts with "^", or
.sp
(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set
(if it were set, the pattern would be anchored),
.sp
-1 is returned, indicating that the pattern matches only at the start of a
subject string or after any newline within the string. Otherwise -2 is
returned. For anchored patterns, -2 is returned.
.sp
  PCRE_INFO_FIRSTTABLE
.sp
If the pattern was studied, and this resulted in the construction of a 256-bit
table indicating a fixed set of bytes for the first byte in any matching
string, a pointer to the table is returned. Otherwise NULL is returned. The
fourth argument should point to an \fBunsigned char *\fP variable.
.sp
  PCRE_INFO_HASCRORLF
.sp
Return 1 if the pattern contains any explicit matches for CR or LF characters,
otherwise 0. The fourth argument should point to an \fBint\fP variable. An
explicit match is either a literal CR or LF character, or \er or \en.
.sp
  PCRE_INFO_JCHANGED
.sp
Return 1 if the (?J) or (?-J) option setting is used in the pattern, otherwise
0. The fourth argument should point to an \fBint\fP variable. (?J) and
(?-J) set and unset the local PCRE_DUPNAMES option, respectively.
.sp
  PCRE_INFO_LASTLITERAL
.sp
Return the value of the rightmost literal byte that must exist in any matched
string, other than at its start, if such a byte has been recorded. The fourth
argument should point to an \fBint\fP variable. If there is no such byte, -1 is
returned. For anchored patterns, a last literal byte is recorded only if it
follows something of variable length. For example, for the pattern
/^a\ed+z\ed+/ the returned value is "z", but for /^a\edz\ed/ the returned value
is -1.
.sp
  PCRE_INFO_MINLENGTH
.sp
If the pattern was studied and a minimum length for matching subject strings
was computed, its value is returned. Otherwise the returned value is -1. The
value is a number of characters, not bytes (this may be relevant in UTF-8
mode). The fourth argument should point to an \fBint\fP variable. A
non-negative value is a lower bound to the length of any matching string. There
may not be any strings of that length that do actually match, but every string
that does match is at least that long.
.sp
  PCRE_INFO_NAMECOUNT
  PCRE_INFO_NAMEENTRYSIZE
  PCRE_INFO_NAMETABLE
.sp
PCRE supports the use of named as well as numbered capturing parentheses. The
names are just an additional way of identifying the parentheses, which still
acquire numbers. Several convenience functions such as
\fBpcre_get_named_substring()\fP are provided for extracting captured
substrings by name. It is also possible to extract the data directly, by first
converting the name to a number in order to access the correct pointers in the
output vector (described with \fBpcre_exec()\fP below). To do the conversion,
you need to use the name-to-number map, which is described by these three
values.
.P
The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT gives
the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size of each
entry; both of these return an \fBint\fP value. The entry size depends on the
length of the longest name. PCRE_INFO_NAMETABLE returns a pointer to the first
entry of the table (a pointer to \fBchar\fP). The first two bytes of each entry
are the number of the capturing parenthesis, most significant byte first. The
rest of the entry is the corresponding name, zero terminated.
.P
The names are in alphabetical order. Duplicate names may appear if (?| is used
to create multiple groups with the same number, as described in the
.\" HTML <a href="pcrepattern.html#dupsubpatternnumber">
.\" </a>
section on duplicate subpattern numbers
.\"
in the
.\" HREF
\fBpcrepattern\fP
.\"
page. Duplicate names for subpatterns with different numbers are permitted only
if PCRE_DUPNAMES is set. In all cases of duplicate names, they appear in the
table in the order in which they were found in the pattern. In the absence of
(?| this is the order of increasing number; when (?| is used this is not
necessarily the case because later subpatterns may have lower numbers.
.P
As a simple example of the name/number table, consider the following pattern
(assume PCRE_EXTENDED is set, so white space - including newlines - is
ignored):
.sp
.\" JOIN
  (?<date> (?<year>(\ed\ed)?\ed\ed) -
  (?<month>\ed\ed) - (?<day>\ed\ed) )
.sp
There are four named subpatterns, so the table has four entries, and each entry
in the table is eight bytes long. The table is as follows, with non-printing
bytes shows in hexadecimal, and undefined bytes shown as ??:
.sp
  00 01 d  a  t  e  00 ??
  00 05 d  a  y  00 ?? ??
  00 04 m  o  n  t  h  00
  00 02 y  e  a  r  00 ??
.sp
When writing code to extract data from named subpatterns using the
name-to-number map, remember that the length of the entries is likely to be
different for each compiled pattern.
.sp
  PCRE_INFO_OKPARTIAL
.sp
Return 1 if the pattern can be used for partial matching with
\fBpcre_exec()\fP, otherwise 0. The fourth argument should point to an
\fBint\fP variable. From release 8.00, this always returns 1, because the
restrictions that previously applied to partial matching have been lifted. The
.\" HREF
\fBpcrepartial\fP
.\"
documentation gives details of partial matching.
.sp
  PCRE_INFO_OPTIONS
.sp
Return a copy of the options with which the pattern was compiled. The fourth
argument should point to an \fBunsigned long int\fP variable. These option bits
are those specified in the call to \fBpcre_compile()\fP, modified by any
top-level option settings at the start of the pattern itself. In other words,
they are the options that will be in force when matching starts. For example,
if the pattern /(?im)abc(?-i)d/ is compiled with the PCRE_EXTENDED option, the
result is PCRE_CASELESS, PCRE_MULTILINE, and PCRE_EXTENDED.
.P
A pattern is automatically anchored by PCRE if all of its top-level
alternatives begin with one of the following:
.sp
  ^     unless PCRE_MULTILINE is set
  \eA    always
  \eG    always
.\" JOIN
  .*    if PCRE_DOTALL is set and there are no back
          references to the subpattern in which .* appears
.sp
For such patterns, the PCRE_ANCHORED bit is set in the options returned by
\fBpcre_fullinfo()\fP.
.sp
  PCRE_INFO_SIZE
.sp
Return the size of the compiled pattern, that is, the value that was passed as
the argument to \fBpcre_malloc()\fP when PCRE was getting memory in which to
place the compiled data. The fourth argument should point to a \fBsize_t\fP
variable.
.sp
  PCRE_INFO_STUDYSIZE
.sp
Return the size of the data block pointed to by the \fIstudy_data\fP field in
a \fBpcre_extra\fP block. That is, it is the value that was passed to
\fBpcre_malloc()\fP when PCRE was getting memory into which to place the data
created by \fBpcre_study()\fP. If \fBpcre_extra\fP is NULL, or there is no
study data, zero is returned. The fourth argument should point to a
\fBsize_t\fP variable.
.
.
.SH "OBSOLETE INFO FUNCTION"
.rs
.sp
.B int pcre_info(const pcre *\fIcode\fP, int *\fIoptptr\fP, int
.B *\fIfirstcharptr\fP);
.PP
The \fBpcre_info()\fP function is now obsolete because its interface is too
restrictive to return all the available data about a compiled pattern. New
programs should use \fBpcre_fullinfo()\fP instead. The yield of
\fBpcre_info()\fP is the number of capturing subpatterns, or one of the
following negative numbers:
.sp
  PCRE_ERROR_NULL       the argument \fIcode\fP was NULL
  PCRE_ERROR_BADMAGIC   the "magic number" was not found
.sp
If the \fIoptptr\fP argument is not NULL, a copy of the options with which the
pattern was compiled is placed in the integer it points to (see
PCRE_INFO_OPTIONS above).
.P
If the pattern is not anchored and the \fIfirstcharptr\fP argument is not NULL,
it is used to pass back information about the first character of any matched
string (see PCRE_INFO_FIRSTBYTE above).
.
.
.SH "REFERENCE COUNTS"
.rs
.sp
.B int pcre_refcount(pcre *\fIcode\fP, int \fIadjust\fP);
.PP
The \fBpcre_refcount()\fP function is used to maintain a reference count in the
data block that contains a compiled pattern. It is provided for the benefit of
applications that operate in an object-oriented manner, where different parts
of the application may be using the same compiled pattern, but you want to free
the block when they are all done.
.P
When a pattern is compiled, the reference count field is initialized to zero.
It is changed only by calling this function, whose action is to add the
\fIadjust\fP value (which may be positive or negative) to it. The yield of the
function is the new value. However, the value of the count is constrained to
lie between 0 and 65535, inclusive. If the new value is outside these limits,
it is forced to the appropriate limit value.
.P
Except when it is zero, the reference count is not correctly preserved if a
pattern is compiled on one host and then transferred to a host whose byte-order
is different. (This seems a highly unlikely scenario.)
.
.
.SH "MATCHING A PATTERN: THE TRADITIONAL FUNCTION"
.rs
.sp
.B int pcre_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
.ti +5n
.B "const char *\fIsubject\fP," int \fIlength\fP, int \fIstartoffset\fP,
.ti +5n
.B int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP);
.P
The function \fBpcre_exec()\fP is called to match a subject string against a
compiled pattern, which is passed in the \fIcode\fP argument. If the
pattern was studied, the result of the study should be passed in the
\fIextra\fP argument. This function is the main matching facility of the
library, and it operates in a Perl-like manner. For specialist use there is
also an alternative matching function, which is described
.\" HTML <a href="#dfamatch">
.\" </a>
below
.\"
in the section about the \fBpcre_dfa_exec()\fP function.
.P
In most applications, the pattern will have been compiled (and optionally
studied) in the same process that calls \fBpcre_exec()\fP. However, it is
possible to save compiled patterns and study data, and then use them later
in different processes, possibly even on different hosts. For a discussion
about this, see the
.\" HREF
\fBpcreprecompile\fP
.\"
documentation.
.P
Here is an example of a simple call to \fBpcre_exec()\fP:
.sp
  int rc;
  int ovector[30];
  rc = pcre_exec(
    re,             /* result of pcre_compile() */
    NULL,           /* we didn't study the pattern */
    "some string",  /* the subject string */
    11,             /* the length of the subject string */
    0,              /* start at offset 0 in the subject */
    0,              /* default options */
    ovector,        /* vector of integers for substring information */
    30);            /* number of elements (NOT size in bytes) */
.
.\" HTML <a name="extradata"></a>
.SS "Extra data for \fBpcre_exec()\fR"
.rs
.sp
If the \fIextra\fP argument is not NULL, it must point to a \fBpcre_extra\fP
data block. The \fBpcre_study()\fP function returns such a block (when it
doesn't return NULL), but you can also create one for yourself, and pass
additional information in it. The \fBpcre_extra\fP block contains the following
fields (not necessarily in this order):
.sp
  unsigned long int \fIflags\fP;
  void *\fIstudy_data\fP;
  unsigned long int \fImatch_limit\fP;
  unsigned long int \fImatch_limit_recursion\fP;
  void *\fIcallout_data\fP;
  const unsigned char *\fItables\fP;
.sp
The \fIflags\fP field is a bitmap that specifies which of the other fields
are set. The flag bits are:
.sp
  PCRE_EXTRA_STUDY_DATA
  PCRE_EXTRA_MATCH_LIMIT
  PCRE_EXTRA_MATCH_LIMIT_RECURSION
  PCRE_EXTRA_CALLOUT_DATA
  PCRE_EXTRA_TABLES
.sp
Other flag bits should be set to zero. The \fIstudy_data\fP field is set in the
\fBpcre_extra\fP block that is returned by \fBpcre_study()\fP, together with
the appropriate flag bit. You should not set this yourself, but you may add to
the block by setting the other fields and their corresponding flag bits.
.P
The \fImatch_limit\fP field provides a means of preventing PCRE from using up a
vast amount of resources when running patterns that are not going to match,
but which have a very large number of possibilities in their search trees. The
classic example is a pattern that uses nested unlimited repeats.
.P
Internally, PCRE uses a function called \fBmatch()\fP which it calls repeatedly
(sometimes recursively). The limit set by \fImatch_limit\fP is imposed on the
number of times this function is called during a match, which has the effect of
limiting the amount of backtracking that can take place. For patterns that are
not anchored, the count restarts from zero for each position in the subject
string.
.P
The default value for the limit can be set when PCRE is built; the default
default is 10 million, which handles all but the most extreme cases. You can
override the default by suppling \fBpcre_exec()\fP with a \fBpcre_extra\fP
block in which \fImatch_limit\fP is set, and PCRE_EXTRA_MATCH_LIMIT is set in
the \fIflags\fP field. If the limit is exceeded, \fBpcre_exec()\fP returns
PCRE_ERROR_MATCHLIMIT.
.P
The \fImatch_limit_recursion\fP field is similar to \fImatch_limit\fP, but
instead of limiting the total number of times that \fBmatch()\fP is called, it
limits the depth of recursion. The recursion depth is a smaller number than the
total number of calls, because not all calls to \fBmatch()\fP are recursive.
This limit is of use only if it is set smaller than \fImatch_limit\fP.
.P
Limiting the recursion depth limits the amount of stack that can be used, or,
when PCRE has been compiled to use memory on the heap instead of the stack, the
amount of heap memory that can be used.
.P
The default value for \fImatch_limit_recursion\fP can be set when PCRE is
built; the default default is the same value as the default for
\fImatch_limit\fP. You can override the default by suppling \fBpcre_exec()\fP
with a \fBpcre_extra\fP block in which \fImatch_limit_recursion\fP is set, and
PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the \fIflags\fP field. If the limit
is exceeded, \fBpcre_exec()\fP returns PCRE_ERROR_RECURSIONLIMIT.
.P
The \fIcallout_data\fP field is used in conjunction with the "callout" feature,
and is described in the
.\" HREF
\fBpcrecallout\fP
.\"
documentation.
.P
The \fItables\fP field is used to pass a character tables pointer to
\fBpcre_exec()\fP; this overrides the value that is stored with the compiled
pattern. A non-NULL value is stored with the compiled pattern only if custom
tables were supplied to \fBpcre_compile()\fP via its \fItableptr\fP argument.
If NULL is passed to \fBpcre_exec()\fP using this mechanism, it forces PCRE's
internal tables to be used. This facility is helpful when re-using patterns
that have been saved after compiling with an external set of tables, because
the external tables might be at a different address when \fBpcre_exec()\fP is
called. See the
.\" HREF
\fBpcreprecompile\fP
.\"
documentation for a discussion of saving compiled patterns for later use.
.
.\" HTML <a name="execoptions"></a>
.SS "Option bits for \fBpcre_exec()\fP"
.rs
.sp
The unused bits of the \fIoptions\fP argument for \fBpcre_exec()\fP must be
zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_\fIxxx\fP,
PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART,
PCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_SOFT, and
PCRE_PARTIAL_HARD.
.sp
  PCRE_ANCHORED
.sp
The PCRE_ANCHORED option limits \fBpcre_exec()\fP to matching at the first
matching position. If a pattern was compiled with PCRE_ANCHORED, or turned out
to be anchored by virtue of its contents, it cannot be made unachored at
matching time.
.sp
  PCRE_BSR_ANYCRLF
  PCRE_BSR_UNICODE
.sp
These options (which are mutually exclusive) control what the \eR escape
sequence matches. The choice is either to match only CR, LF, or CRLF, or to
match any Unicode newline sequence. These options override the choice that was
made or defaulted when the pattern was compiled.
.sp
  PCRE_NEWLINE_CR
  PCRE_NEWLINE_LF
  PCRE_NEWLINE_CRLF
  PCRE_NEWLINE_ANYCRLF
  PCRE_NEWLINE_ANY
.sp
These options override the newline definition that was chosen or defaulted when
the pattern was compiled. For details, see the description of
\fBpcre_compile()\fP above. During matching, the newline choice affects the
behaviour of the dot, circumflex, and dollar metacharacters. It may also alter
the way the match position is advanced after a match failure for an unanchored
pattern.
.P
When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is set, and a
match attempt for an unanchored pattern fails when the current position is at a
CRLF sequence, and the pattern contains no explicit matches for CR or LF
characters, the match position is advanced by two characters instead of one, in
other words, to after the CRLF.
.P
The above rule is a compromise that makes the most common cases work as
expected. For example, if the pattern is .+A (and the PCRE_DOTALL option is not
set), it does not match the string "\er\enA" because, after failing at the
start, it skips both the CR and the LF before retrying. However, the pattern
[\er\en]A does match that string, because it contains an explicit CR or LF
reference, and so advances only by one character after the first failure.
.P
An explicit match for CR of LF is either a literal appearance of one of those
characters, or one of the \er or \en escape sequences. Implicit matches such as
[^X] do not count, nor does \es (which includes CR and LF in the characters
that it matches).
.P
Notwithstanding the above, anomalous effects may still occur when CRLF is a
valid newline sequence and explicit \er or \en escapes appear in the pattern.
.sp
  PCRE_NOTBOL
.sp
This option specifies that first character of the subject string is not the
beginning of a line, so the circumflex metacharacter should not match before
it. Setting this without PCRE_MULTILINE (at compile time) causes circumflex
never to match. This option affects only the behaviour of the circumflex
metacharacter. It does not affect \eA.
.sp
  PCRE_NOTEOL
.sp
This option specifies that the end of the subject string is not the end of a
line, so the dollar metacharacter should not match it nor (except in multiline
mode) a newline immediately before it. Setting this without PCRE_MULTILINE (at
compile time) causes dollar never to match. This option affects only the
behaviour of the dollar metacharacter. It does not affect \eZ or \ez.
.sp
  PCRE_NOTEMPTY
.sp
An empty string is not considered to be a valid match if this option is set. If
there are alternatives in the pattern, they are tried. If all the alternatives
match the empty string, the entire match fails. For example, if the pattern
.sp
  a?b?
.sp
is applied to a string not beginning with "a" or "b", it matches an empty
string at the start of the subject. With PCRE_NOTEMPTY set, this match is not
valid, so PCRE searches further into the string for occurrences of "a" or "b".
.sp
  PCRE_NOTEMPTY_ATSTART
.sp
This is like PCRE_NOTEMPTY, except that an empty string match that is not at
the start of the subject is permitted. If the pattern is anchored, such a match
can occur only if the pattern contains \eK.
.P
Perl has no direct equivalent of PCRE_NOTEMPTY or PCRE_NOTEMPTY_ATSTART, but it
does make a special case of a pattern match of the empty string within its
\fBsplit()\fP function, and when using the /g modifier. It is possible to
emulate Perl's behaviour after matching a null string by first trying the match
again at the same offset with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then
if that fails, by advancing the starting offset (see below) and trying an
ordinary match again. There is some code that demonstrates how to do this in
the
.\" HREF
\fBpcredemo\fP
.\"
sample program.
.sp
  PCRE_NO_START_OPTIMIZE
.sp
There are a number of optimizations that \fBpcre_exec()\fP uses at the start of
a match, in order to speed up the process. For example, if it is known that a
match must start with a specific character, it searches the subject for that
character, and fails immediately if it cannot find it, without actually running
the main matching function. When callouts are in use, these optimizations can
cause them to be skipped. This option disables the "start-up" optimizations,
causing performance to suffer, but ensuring that the callouts do occur.
.sp
  PCRE_NO_UTF8_CHECK
.sp
When PCRE_UTF8 is set at compile time, the validity of the subject as a UTF-8
string is automatically checked when \fBpcre_exec()\fP is subsequently called.
The value of \fIstartoffset\fP is also checked to ensure that it points to the
start of a UTF-8 character. There is a discussion about the validity of UTF-8
strings in the
.\" HTML <a href="pcre.html#utf8strings">
.\" </a>
section on UTF-8 support
.\"
in the main
.\" HREF
\fBpcre\fP
.\"
page. If an invalid UTF-8 sequence of bytes is found, \fBpcre_exec()\fP returns
the error PCRE_ERROR_BADUTF8. If \fIstartoffset\fP contains an invalid value,
PCRE_ERROR_BADUTF8_OFFSET is returned.
.P
If you already know that your subject is valid, and you want to skip these
checks for performance reasons, you can set the PCRE_NO_UTF8_CHECK option when
calling \fBpcre_exec()\fP. You might want to do this for the second and
subsequent calls to \fBpcre_exec()\fP if you are making repeated calls to find
all the matches in a single subject string. However, you should be sure that
the value of \fIstartoffset\fP points to the start of a UTF-8 character. When
PCRE_NO_UTF8_CHECK is set, the effect of passing an invalid UTF-8 string as a
subject, or a value of \fIstartoffset\fP that does not point to the start of a
UTF-8 character, is undefined. Your program may crash.
.sp
  PCRE_PARTIAL_HARD
  PCRE_PARTIAL_SOFT
.sp
These options turn on the partial matching feature. For backwards
compatibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial match
occurs if the end of the subject string is reached successfully, but there are
not enough subject characters to complete the match. If this happens when
PCRE_PARTIAL_HARD is set, \fBpcre_exec()\fP immediately returns
PCRE_ERROR_PARTIAL. Otherwise, if PCRE_PARTIAL_SOFT is set, matching continues
by testing any other alternatives. Only if they all fail is PCRE_ERROR_PARTIAL
returned (instead of PCRE_ERROR_NOMATCH). The portion of the string that
was inspected when the partial match was found is set as the first matching
string. There is a more detailed discussion in the
.\" HREF
\fBpcrepartial\fP
.\"
documentation.
.
.SS "The string to be matched by \fBpcre_exec()\fP"
.rs
.sp
The subject string is passed to \fBpcre_exec()\fP as a pointer in
\fIsubject\fP, a length (in bytes) in \fIlength\fP, and a starting byte offset
in \fIstartoffset\fP. In UTF-8 mode, the byte offset must point to the start of
a UTF-8 character. Unlike the pattern string, the subject may contain binary
zero bytes. When the starting offset is zero, the search for a match starts at
the beginning of the subject, and this is by far the most common case.
.P
A non-zero starting offset is useful when searching for another match in the
same subject by calling \fBpcre_exec()\fP again after a previous success.
Setting \fIstartoffset\fP differs from just passing over a shortened string and
setting PCRE_NOTBOL in the case of a pattern that begins with any kind of
lookbehind. For example, consider the pattern
.sp
  \eBiss\eB
.sp
which finds occurrences of "iss" in the middle of words. (\eB matches only if
the current position in the subject is not a word boundary.) When applied to
the string "Mississipi" the first call to \fBpcre_exec()\fP finds the first
occurrence. If \fBpcre_exec()\fP is called again with just the remainder of the
subject, namely "issipi", it does not match, because \eB is always false at the
start of the subject, which is deemed to be a word boundary. However, if
\fBpcre_exec()\fP is passed the entire string again, but with \fIstartoffset\fP
set to 4, it finds the second occurrence of "iss" because it is able to look
behind the starting point to discover that it is preceded by a letter.
.P
If a non-zero starting offset is passed when the pattern is anchored, one
attempt to match at the given offset is made. This can only succeed if the
pattern does not require the match to be at the start of the subject.
.
.SS "How \fBpcre_exec()\fP returns captured substrings"
.rs
.sp
In general, a pattern matches a certain portion of the subject, and in
addition, further substrings from the subject may be picked out by parts of the
pattern. Following the usage in Jeffrey Friedl's book, this is called
"capturing" in what follows, and the phrase "capturing subpattern" is used for
a fragment of a pattern that picks out a substring. PCRE supports several other
kinds of parenthesized subpattern that do not cause substrings to be captured.
.P
Captured substrings are returned to the caller via a vector of integers whose
address is passed in \fIovector\fP. The number of elements in the vector is
passed in \fIovecsize\fP, which must be a non-negative number. \fBNote\fP: this
argument is NOT the size of \fIovector\fP in bytes.
.P
The first two-thirds of the vector is used to pass back captured substrings,
each substring using a pair of integers. The remaining third of the vector is
used as workspace by \fBpcre_exec()\fP while matching capturing subpatterns,
and is not available for passing back information. The number passed in
\fIovecsize\fP should always be a multiple of three. If it is not, it is
rounded down.
.P
When a match is successful, information about captured substrings is returned
in pairs of integers, starting at the beginning of \fIovector\fP, and
continuing up to two-thirds of its length at the most. The first element of
each pair is set to the byte offset of the first character in a substring, and
the second is set to the byte offset of the first character after the end of a
substring. \fBNote\fP: these values are always byte offsets, even in UTF-8
mode. They are not character counts.
.P
The first pair of integers, \fIovector[0]\fP and \fIovector[1]\fP, identify the
portion of the subject string matched by the entire pattern. The next pair is
used for the first capturing subpattern, and so on. The value returned by
\fBpcre_exec()\fP is one more than the highest numbered pair that has been set.
For example, if two substrings have been captured, the returned value is 3. If
there are no capturing subpatterns, the return value from a successful match is
1, indicating that just the first pair of offsets has been set.
.P
If a capturing subpattern is matched repeatedly, it is the last portion of the
string that it matched that is returned.
.P
If the vector is too small to hold all the captured substring offsets, it is
used as far as possible (up to two-thirds of its length), and the function
returns a value of zero. If the substring offsets are not of interest,
\fBpcre_exec()\fP may be called with \fIovector\fP passed as NULL and
\fIovecsize\fP as zero. However, if the pattern contains back references and
the \fIovector\fP is not big enough to remember the related substrings, PCRE
has to get additional memory for use during matching. Thus it is usually
advisable to supply an \fIovector\fP.
.P
The \fBpcre_fullinfo()\fP function can be used to find out how many capturing
subpatterns there are in a compiled pattern. The smallest size for
\fIovector\fP that will allow for \fIn\fP captured substrings, in addition to
the offsets of the substring matched by the whole pattern, is (\fIn\fP+1)*3.
.P
It is possible for capturing subpattern number \fIn+1\fP to match some part of
the subject when subpattern \fIn\fP has not been used at all. For example, if
the string "abc" is matched against the pattern (a|(z))(bc) the return from the
function is 4, and subpatterns 1 and 3 are matched, but 2 is not. When this
happens, both values in the offset pairs corresponding to unused subpatterns
are set to -1.
.P
Offset values that correspond to unused subpatterns at the end of the
expression are also set to -1. For example, if the string "abc" is matched
against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not matched. The
return from the function is 2, because the highest used capturing subpattern
number is 1. However, you can refer to the offsets for the second and third
capturing subpatterns if you wish (assuming the vector is large enough, of
course).
.P
Some convenience functions are provided for extracting the captured substrings
as separate strings. These are described below.
.
.\" HTML <a name="errorlist"></a>
.SS "Error return values from \fBpcre_exec()\fP"
.rs
.sp
If \fBpcre_exec()\fP fails, it returns a negative number. The following are
defined in the header file:
.sp
  PCRE_ERROR_NOMATCH        (-1)
.sp
The subject string did not match the pattern.
.sp
  PCRE_ERROR_NULL           (-2)
.sp
Either \fIcode\fP or \fIsubject\fP was passed as NULL, or \fIovector\fP was
NULL and \fIovecsize\fP was not zero.
.sp
  PCRE_ERROR_BADOPTION      (-3)
.sp
An unrecognized bit was set in the \fIoptions\fP argument.
.sp
  PCRE_ERROR_BADMAGIC       (-4)
.sp
PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch
the case when it is passed a junk pointer and to detect when a pattern that was
compiled in an environment of one endianness is run in an environment with the
other endianness. This is the error that PCRE gives when the magic number is
not present.
.sp
  PCRE_ERROR_UNKNOWN_OPCODE (-5)
.sp
While running the pattern match, an unknown item was encountered in the
compiled pattern. This error could be caused by a bug in PCRE or by overwriting
of the compiled pattern.
.sp
  PCRE_ERROR_NOMEMORY       (-6)
.sp
If a pattern contains back references, but the \fIovector\fP that is passed to
\fBpcre_exec()\fP is not big enough to remember the referenced substrings, PCRE
gets a block of memory at the start of matching to use for this purpose. If the
call via \fBpcre_malloc()\fP fails, this error is given. The memory is
automatically freed at the end of matching.
.sp
  PCRE_ERROR_NOSUBSTRING    (-7)
.sp
This error is used by the \fBpcre_copy_substring()\fP,
\fBpcre_get_substring()\fP, and \fBpcre_get_substring_list()\fP functions (see
below). It is never returned by \fBpcre_exec()\fP.
.sp
  PCRE_ERROR_MATCHLIMIT     (-8)
.sp
The backtracking limit, as specified by the \fImatch_limit\fP field in a
\fBpcre_extra\fP structure (or defaulted) was reached. See the description
above.
.sp
  PCRE_ERROR_CALLOUT        (-9)
.sp
This error is never generated by \fBpcre_exec()\fP itself. It is provided for
use by callout functions that want to yield a distinctive error code. See the
.\" HREF
\fBpcrecallout\fP
.\"
documentation for details.
.sp
  PCRE_ERROR_BADUTF8        (-10)
.sp
A string that contains an invalid UTF-8 byte sequence was passed as a subject.
.sp
  PCRE_ERROR_BADUTF8_OFFSET (-11)
.sp
The UTF-8 byte sequence that was passed as a subject was valid, but the value
of \fIstartoffset\fP did not point to the beginning of a UTF-8 character.
.sp
  PCRE_ERROR_PARTIAL        (-12)
.sp
The subject string did not match, but it did match partially. See the
.\" HREF
\fBpcrepartial\fP
.\"
documentation for details of partial matching.
.sp
  PCRE_ERROR_BADPARTIAL     (-13)
.sp
This code is no longer in use. It was formerly returned when the PCRE_PARTIAL
option was used with a compiled pattern containing items that were not
supported for partial matching. From release 8.00 onwards, there are no
restrictions on partial matching.
.sp
  PCRE_ERROR_INTERNAL       (-14)
.sp
An unexpected internal error has occurred. This error could be caused by a bug
in PCRE or by overwriting of the compiled pattern.
.sp
  PCRE_ERROR_BADCOUNT       (-15)
.sp
This error is given if the value of the \fIovecsize\fP argument is negative.
.sp
  PCRE_ERROR_RECURSIONLIMIT (-21)
.sp
The internal recursion limit, as specified by the \fImatch_limit_recursion\fP
field in a \fBpcre_extra\fP structure (or defaulted) was reached. See the
description above.
.sp
  PCRE_ERROR_BADNEWLINE     (-23)
.sp
An invalid combination of PCRE_NEWLINE_\fIxxx\fP options was given.
.P
Error numbers -16 to -20 and -22 are not used by \fBpcre_exec()\fP.
.
.
.SH "EXTRACTING CAPTURED SUBSTRINGS BY NUMBER"
.rs
.sp
.B int pcre_copy_substring(const char *\fIsubject\fP, int *\fIovector\fP,
.ti +5n
.B int \fIstringcount\fP, int \fIstringnumber\fP, char *\fIbuffer\fP,
.ti +5n
.B int \fIbuffersize\fP);
.PP
.B int pcre_get_substring(const char *\fIsubject\fP, int *\fIovector\fP,
.ti +5n
.B int \fIstringcount\fP, int \fIstringnumber\fP,
.ti +5n
.B const char **\fIstringptr\fP);
.PP
.B int pcre_get_substring_list(const char *\fIsubject\fP,
.ti +5n
.B int *\fIovector\fP, int \fIstringcount\fP, "const char ***\fIlistptr\fP);"
.PP
Captured substrings can be accessed directly by using the offsets returned by
\fBpcre_exec()\fP in \fIovector\fP. For convenience, the functions
\fBpcre_copy_substring()\fP, \fBpcre_get_substring()\fP, and
\fBpcre_get_substring_list()\fP are provided for extracting captured substrings
as new, separate, zero-terminated strings. These functions identify substrings
by number. The next section describes functions for extracting named
substrings.
.P
A substring that contains a binary zero is correctly extracted and has a
further zero added on the end, but the result is not, of course, a C string.
However, you can process such a string by referring to the length that is
returned by \fBpcre_copy_substring()\fP and \fBpcre_get_substring()\fP.
Unfortunately, the interface to \fBpcre_get_substring_list()\fP is not adequate
for handling strings containing binary zeros, because the end of the final
string is not independently indicated.
.P
The first three arguments are the same for all three of these functions:
\fIsubject\fP is the subject string that has just been successfully matched,
\fIovector\fP is a pointer to the vector of integer offsets that was passed to
\fBpcre_exec()\fP, and \fIstringcount\fP is the number of substrings that were
captured by the match, including the substring that matched the entire regular
expression. This is the value returned by \fBpcre_exec()\fP if it is greater
than zero. If \fBpcre_exec()\fP returned zero, indicating that it ran out of
space in \fIovector\fP, the value passed as \fIstringcount\fP should be the
number of elements in the vector divided by three.
.P
The functions \fBpcre_copy_substring()\fP and \fBpcre_get_substring()\fP
extract a single substring, whose number is given as \fIstringnumber\fP. A
value of zero extracts the substring that matched the entire pattern, whereas
higher values extract the captured substrings. For \fBpcre_copy_substring()\fP,
the string is placed in \fIbuffer\fP, whose length is given by
\fIbuffersize\fP, while for \fBpcre_get_substring()\fP a new block of memory is
obtained via \fBpcre_malloc\fP, and its address is returned via
\fIstringptr\fP. The yield of the function is the length of the string, not
including the terminating zero, or one of these error codes:
.sp
  PCRE_ERROR_NOMEMORY       (-6)
.sp
The buffer was too small for \fBpcre_copy_substring()\fP, or the attempt to get
memory failed for \fBpcre_get_substring()\fP.
.sp
  PCRE_ERROR_NOSUBSTRING    (-7)
.sp
There is no substring whose number is \fIstringnumber\fP.
.P
The \fBpcre_get_substring_list()\fP function extracts all available substrings
and builds a list of pointers to them. All this is done in a single block of
memory that is obtained via \fBpcre_malloc\fP. The address of the memory block
is returned via \fIlistptr\fP, which is also the start of the list of string
pointers. The end of the list is marked by a NULL pointer. The yield of the
function is zero if all went well, or the error code
.sp
  PCRE_ERROR_NOMEMORY       (-6)
.sp
if the attempt to get the memory block failed.
.P
When any of these functions encounter a substring that is unset, which can
happen when capturing subpattern number \fIn+1\fP matches some part of the
subject, but subpattern \fIn\fP has not been used at all, they return an empty
string. This can be distinguished from a genuine zero-length substring by
inspecting the appropriate offset in \fIovector\fP, which is negative for unset
substrings.
.P
The two convenience functions \fBpcre_free_substring()\fP and
\fBpcre_free_substring_list()\fP can be used to free the memory returned by
a previous call of \fBpcre_get_substring()\fP or
\fBpcre_get_substring_list()\fP, respectively. They do nothing more than call
the function pointed to by \fBpcre_free\fP, which of course could be called
directly from a C program. However, PCRE is used in some situations where it is
linked via a special interface to another programming language that cannot use
\fBpcre_free\fP directly; it is for these cases that the functions are
provided.
.
.
.SH "EXTRACTING CAPTURED SUBSTRINGS BY NAME"
.rs
.sp
.B int pcre_get_stringnumber(const pcre *\fIcode\fP,
.ti +5n
.B const char *\fIname\fP);
.PP
.B int pcre_copy_named_substring(const pcre *\fIcode\fP,
.ti +5n
.B const char *\fIsubject\fP, int *\fIovector\fP,
.ti +5n
.B int \fIstringcount\fP, const char *\fIstringname\fP,
.ti +5n
.B char *\fIbuffer\fP, int \fIbuffersize\fP);
.PP
.B int pcre_get_named_substring(const pcre *\fIcode\fP,
.ti +5n
.B const char *\fIsubject\fP, int *\fIovector\fP,
.ti +5n
.B int \fIstringcount\fP, const char *\fIstringname\fP,
.ti +5n
.B const char **\fIstringptr\fP);
.PP
To extract a substring by name, you first have to find associated number.
For example, for this pattern
.sp
  (a+)b(?<xxx>\ed+)...
.sp
the number of the subpattern called "xxx" is 2. If the name is known to be
unique (PCRE_DUPNAMES was not set), you can find the number from the name by
calling \fBpcre_get_stringnumber()\fP. The first argument is the compiled
pattern, and the second is the name. The yield of the function is the
subpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if there is no subpattern of
that name.
.P
Given the number, you can extract the substring directly, or use one of the
functions described in the previous section. For convenience, there are also
two functions that do the whole job.
.P
Most of the arguments of \fBpcre_copy_named_substring()\fP and
\fBpcre_get_named_substring()\fP are the same as those for the similarly named
functions that extract by number. As these are described in the previous
section, they are not re-described here. There are just two differences:
.P
First, instead of a substring number, a substring name is given. Second, there
is an extra argument, given at the start, which is a pointer to the compiled
pattern. This is needed in order to gain access to the name-to-number
translation table.
.P
These functions call \fBpcre_get_stringnumber()\fP, and if it succeeds, they
then call \fBpcre_copy_substring()\fP or \fBpcre_get_substring()\fP, as
appropriate. \fBNOTE:\fP If PCRE_DUPNAMES is set and there are duplicate names,
the behaviour may not be what you want (see the next section).
.P
\fBWarning:\fP If the pattern uses the (?| feature to set up multiple
subpatterns with the same number, as described in the
.\" HTML <a href="pcrepattern.html#dupsubpatternnumber">
.\" </a>
section on duplicate subpattern numbers
.\"
in the
.\" HREF
\fBpcrepattern\fP
.\"
page, you cannot use names to distinguish the different subpatterns, because
names are not included in the compiled code. The matching process uses only
numbers. For this reason, the use of different names for subpatterns of the
same number causes an error at compile time.
.
.SH "DUPLICATE SUBPATTERN NAMES"
.rs
.sp
.B int pcre_get_stringtable_entries(const pcre *\fIcode\fP,
.ti +5n
.B const char *\fIname\fP, char **\fIfirst\fP, char **\fIlast\fP);
.PP
When a pattern is compiled with the PCRE_DUPNAMES option, names for subpatterns
are not required to be unique. (Duplicate names are always allowed for
subpatterns with the same number, created by using the (?| feature. Indeed, if
such subpatterns are named, they are required to use the same names.)
.P
Normally, patterns with duplicate names are such that in any one match, only
one of the named subpatterns participates. An example is shown in the
.\" HREF
\fBpcrepattern\fP
.\"
documentation.
.P
When duplicates are present, \fBpcre_copy_named_substring()\fP and
\fBpcre_get_named_substring()\fP return the first substring corresponding to
the given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING (-7) is
returned; no data is returned. The \fBpcre_get_stringnumber()\fP function
returns one of the numbers that are associated with the name, but it is not
defined which it is.
.P
If you want to get full details of all captured substrings for a given name,
you must use the \fBpcre_get_stringtable_entries()\fP function. The first
argument is the compiled pattern, and the second is the name. The third and
fourth are pointers to variables which are updated by the function. After it
has run, they point to the first and last entries in the name-to-number table
for the given name. The function itself returns the length of each entry, or
PCRE_ERROR_NOSUBSTRING (-7) if there are none. The format of the table is
described above in the section entitled \fIInformation about a pattern\fP.
Given all the relevant entries for the name, you can extract each of their
numbers, and hence the captured data, if any.
.
.
.SH "FINDING ALL POSSIBLE MATCHES"
.rs
.sp
The traditional matching function uses a similar algorithm to Perl, which stops
when it finds the first match, starting at a given point in the subject. If you
want to find all possible matches, or the longest possible match, consider
using the alternative matching function (see below) instead. If you cannot use
the alternative function, but still need to find all possible matches, you
can kludge it up by making use of the callout facility, which is described in
the
.\" HREF
\fBpcrecallout\fP
.\"
documentation.
.P
What you have to do is to insert a callout right at the end of the pattern.
When your callout function is called, extract and save the current matched
substring. Then return 1, which forces \fBpcre_exec()\fP to backtrack and try
other alternatives. Ultimately, when it runs out of matches, \fBpcre_exec()\fP
will yield PCRE_ERROR_NOMATCH.
.
.
.\" HTML <a name="dfamatch"></a>
.SH "MATCHING A PATTERN: THE ALTERNATIVE FUNCTION"
.rs
.sp
.B int pcre_dfa_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
.ti +5n
.B "const char *\fIsubject\fP," int \fIlength\fP, int \fIstartoffset\fP,
.ti +5n
.B int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP,
.ti +5n
.B int *\fIworkspace\fP, int \fIwscount\fP);
.P
The function \fBpcre_dfa_exec()\fP is called to match a subject string against
a compiled pattern, using a matching algorithm that scans the subject string
just once, and does not backtrack. This has different characteristics to the
normal algorithm, and is not compatible with Perl. Some of the features of PCRE
patterns are not supported. Nevertheless, there are times when this kind of
matching can be useful. For a discussion of the two matching algorithms, and a
list of features that \fBpcre_dfa_exec()\fP does not support, see the
.\" HREF
\fBpcrematching\fP
.\"
documentation.
.P
The arguments for the \fBpcre_dfa_exec()\fP function are the same as for
\fBpcre_exec()\fP, plus two extras. The \fIovector\fP argument is used in a
different way, and this is described below. The other common arguments are used
in the same way as for \fBpcre_exec()\fP, so their description is not repeated
here.
.P
The two additional arguments provide workspace for the function. The workspace
vector should contain at least 20 elements. It is used for keeping track of
multiple paths through the pattern tree. More workspace will be needed for
patterns and subjects where there are a lot of potential matches.
.P
Here is an example of a simple call to \fBpcre_dfa_exec()\fP:
.sp
  int rc;
  int ovector[10];
  int wspace[20];
  rc = pcre_dfa_exec(
    re,             /* result of pcre_compile() */
    NULL,           /* we didn't study the pattern */
    "some string",  /* the subject string */
    11,             /* the length of the subject string */
    0,              /* start at offset 0 in the subject */
    0,              /* default options */
    ovector,        /* vector of integers for substring information */
    10,             /* number of elements (NOT size in bytes) */
    wspace,         /* working space vector */
    20);            /* number of elements (NOT size in bytes) */
.
.SS "Option bits for \fBpcre_dfa_exec()\fP"
.rs
.sp
The unused bits of the \fIoptions\fP argument for \fBpcre_dfa_exec()\fP must be
zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_\fIxxx\fP,
PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART,
PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, PCRE_PARTIAL_SOFT, PCRE_DFA_SHORTEST,
and PCRE_DFA_RESTART. All but the last four of these are exactly the same as
for \fBpcre_exec()\fP, so their description is not repeated here.
.sp
  PCRE_PARTIAL_HARD
  PCRE_PARTIAL_SOFT
.sp
These have the same general effect as they do for \fBpcre_exec()\fP, but the
details are slightly different. When PCRE_PARTIAL_HARD is set for
\fBpcre_dfa_exec()\fP, it returns PCRE_ERROR_PARTIAL if the end of the subject
is reached and there is still at least one matching possibility that requires
additional characters. This happens even if some complete matches have also
been found. When PCRE_PARTIAL_SOFT is set, the return code PCRE_ERROR_NOMATCH
is converted into PCRE_ERROR_PARTIAL if the end of the subject is reached,
there have been no complete matches, but there is still at least one matching
possibility. The portion of the string that was inspected when the longest
partial match was found is set as the first matching string in both cases.
.sp
  PCRE_DFA_SHORTEST
.sp
Setting the PCRE_DFA_SHORTEST option causes the matching algorithm to stop as
soon as it has found one match. Because of the way the alternative algorithm
works, this is necessarily the shortest possible match at the first possible
matching point in the subject string.
.sp
  PCRE_DFA_RESTART
.sp
When \fBpcre_dfa_exec()\fP returns a partial match, it is possible to call it
again, with additional subject characters, and have it continue with the same
match. The PCRE_DFA_RESTART option requests this action; when it is set, the
\fIworkspace\fP and \fIwscount\fP options must reference the same vector as
before because data about the match so far is left in them after a partial
match. There is more discussion of this facility in the
.\" HREF
\fBpcrepartial\fP
.\"
documentation.
.
.SS "Successful returns from \fBpcre_dfa_exec()\fP"
.rs
.sp
When \fBpcre_dfa_exec()\fP succeeds, it may have matched more than one
substring in the subject. Note, however, that all the matches from one run of
the function start at the same point in the subject. The shorter matches are
all initial substrings of the longer matches. For example, if the pattern
.sp
  <.*>
.sp
is matched against the string
.sp
  This is <something> <something else> <something further> no more
.sp
the three matched strings are
.sp
  <something>
  <something> <something else>
  <something> <something else> <something further>
.sp
On success, the yield of the function is a number greater than zero, which is
the number of matched substrings. The substrings themselves are returned in
\fIovector\fP. Each string uses two elements; the first is the offset to the
start, and the second is the offset to the end. In fact, all the strings have
the same start offset. (Space could have been saved by giving this only once,
but it was decided to retain some compatibility with the way \fBpcre_exec()\fP
returns data, even though the meaning of the strings is different.)
.P
The strings are returned in reverse order of length; that is, the longest
matching string is given first. If there were too many matches to fit into
\fIovector\fP, the yield of the function is zero, and the vector is filled with
the longest matches.
.
.SS "Error returns from \fBpcre_dfa_exec()\fP"
.rs
.sp
The \fBpcre_dfa_exec()\fP function returns a negative number when it fails.
Many of the errors are the same as for \fBpcre_exec()\fP, and these are
described
.\" HTML <a href="#errorlist">
.\" </a>
above.
.\"
There are in addition the following errors that are specific to
\fBpcre_dfa_exec()\fP:
.sp
  PCRE_ERROR_DFA_UITEM      (-16)
.sp
This return is given if \fBpcre_dfa_exec()\fP encounters an item in the pattern
that it does not support, for instance, the use of \eC or a back reference.
.sp
  PCRE_ERROR_DFA_UCOND      (-17)
.sp
This return is given if \fBpcre_dfa_exec()\fP encounters a condition item that
uses a back reference for the condition, or a test for recursion in a specific
group. These are not supported.
.sp
  PCRE_ERROR_DFA_UMLIMIT    (-18)
.sp
This return is given if \fBpcre_dfa_exec()\fP is called with an \fIextra\fP
block that contains a setting of the \fImatch_limit\fP field. This is not
supported (it is meaningless).
.sp
  PCRE_ERROR_DFA_WSSIZE     (-19)
.sp
This return is given if \fBpcre_dfa_exec()\fP runs out of space in the
\fIworkspace\fP vector.
.sp
  PCRE_ERROR_DFA_RECURSE    (-20)
.sp
When a recursive subpattern is processed, the matching function calls itself
recursively, using private vectors for \fIovector\fP and \fIworkspace\fP. This
error is given if the output vector is not large enough. This should be
extremely rare, as a vector of size 1000 is used.
.
.
.SH "SEE ALSO"
.rs
.sp
\fBpcrebuild\fP(3), \fBpcrecallout\fP(3), \fBpcrecpp(3)\fP(3),
\fBpcrematching\fP(3), \fBpcrepartial\fP(3), \fBpcreposix\fP(3),
\fBpcreprecompile\fP(3), \fBpcresample\fP(3), \fBpcrestack\fP(3).
.
.
.SH AUTHOR
.rs
.sp
.nf
Philip Hazel
University Computing Service
Cambridge CB2 3QH, England.
.fi
.
.
.SH REVISION
.rs
.sp
.nf
Last updated: 03 October 2009
Copyright (c) 1997-2009 University of Cambridge.
.fi
PK��$[ȅ%��*�*man/man3/pcresyntax.3nu�[���.TH PCRESYNTAX 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH "PCRE REGULAR EXPRESSION SYNTAX SUMMARY"
.rs
.sp
The full syntax and semantics of the regular expressions that are supported by
PCRE are described in the
.\" HREF
\fBpcrepattern\fP
.\"
documentation. This document contains just a quick-reference summary of the
syntax.
.
.
.SH "QUOTING"
.rs
.sp
  \ex         where x is non-alphanumeric is a literal x
  \eQ...\eE    treat enclosed characters as literal
.
.
.SH "CHARACTERS"
.rs
.sp
  \ea         alarm, that is, the BEL character (hex 07)
  \ecx        "control-x", where x is any character
  \ee         escape (hex 1B)
  \ef         formfeed (hex 0C)
  \en         newline (hex 0A)
  \er         carriage return (hex 0D)
  \et         tab (hex 09)
  \eddd       character with octal code ddd, or backreference
  \exhh       character with hex code hh
  \ex{hhh..}  character with hex code hhh..
.
.
.SH "CHARACTER TYPES"
.rs
.sp
  .          any character except newline;
               in dotall mode, any character whatsoever
  \eC         one byte, even in UTF-8 mode (best avoided)
  \ed         a decimal digit
  \eD         a character that is not a decimal digit
  \eh         a horizontal whitespace character
  \eH         a character that is not a horizontal whitespace character
  \ep{\fIxx\fP}     a character with the \fIxx\fP property
  \eP{\fIxx\fP}     a character without the \fIxx\fP property
  \eR         a newline sequence
  \es         a whitespace character
  \eS         a character that is not a whitespace character
  \ev         a vertical whitespace character
  \eV         a character that is not a vertical whitespace character
  \ew         a "word" character
  \eW         a "non-word" character
  \eX         an extended Unicode sequence
.sp
In PCRE, \ed, \eD, \es, \eS, \ew, and \eW recognize only ASCII characters.
.
.
.SH "GENERAL CATEGORY PROPERTY CODES FOR \ep and \eP"
.rs
.sp
  C          Other
  Cc         Control
  Cf         Format
  Cn         Unassigned
  Co         Private use
  Cs         Surrogate
.sp
  L          Letter
  Ll         Lower case letter
  Lm         Modifier letter
  Lo         Other letter
  Lt         Title case letter
  Lu         Upper case letter
  L&         Ll, Lu, or Lt
.sp
  M          Mark
  Mc         Spacing mark
  Me         Enclosing mark
  Mn         Non-spacing mark
.sp
  N          Number
  Nd         Decimal number
  Nl         Letter number
  No         Other number
.sp
  P          Punctuation
  Pc         Connector punctuation
  Pd         Dash punctuation
  Pe         Close punctuation
  Pf         Final punctuation
  Pi         Initial punctuation
  Po         Other punctuation
  Ps         Open punctuation
.sp
  S          Symbol
  Sc         Currency symbol
  Sk         Modifier symbol
  Sm         Mathematical symbol
  So         Other symbol
.sp
  Z          Separator
  Zl         Line separator
  Zp         Paragraph separator
  Zs         Space separator
.
.
.SH "SCRIPT NAMES FOR \ep AND \eP"
.rs
.sp
Arabic,
Armenian,
Avestan,
Balinese,
Bamum,
Bengali,
Bopomofo,
Braille,
Buginese,
Buhid,
Canadian_Aboriginal,
Carian,
Cham,
Cherokee,
Common,
Coptic,
Cuneiform,
Cypriot,
Cyrillic,
Deseret,
Devanagari,
Egyptian_Hieroglyphs,
Ethiopic,
Georgian,
Glagolitic,
Gothic,
Greek,
Gujarati,
Gurmukhi,
Han,
Hangul,
Hanunoo,
Hebrew,
Hiragana,
Imperial_Aramaic,
Inherited,
Inscriptional_Pahlavi,
Inscriptional_Parthian,
Javanese,
Kaithi,
Kannada,
Katakana,
Kayah_Li,
Kharoshthi,
Khmer,
Lao,
Latin,
Lepcha,
Limbu,
Linear_B,
Lisu,
Lycian,
Lydian,
Malayalam,
Meetei_Mayek,
Mongolian,
Myanmar,
New_Tai_Lue,
Nko,
Ogham,
Old_Italic,
Old_Persian,
Old_South_Arabian,
Old_Turkic,
Ol_Chiki,
Oriya,
Osmanya,
Phags_Pa,
Phoenician,
Rejang,
Runic,
Samaritan,
Saurashtra,
Shavian,
Sinhala,
Sundanese,
Syloti_Nagri,
Syriac,
Tagalog,
Tagbanwa,
Tai_Le,
Tai_Tham,
Tai_Viet,
Tamil,
Telugu,
Thaana,
Thai,
Tibetan,
Tifinagh,
Ugaritic,
Vai,
Yi.
.
.
.SH "CHARACTER CLASSES"
.rs
.sp
  [...]       positive character class
  [^...]      negative character class
  [x-y]       range (can be used for hex characters)
  [[:xxx:]]   positive POSIX named set
  [[:^xxx:]]  negative POSIX named set
.sp
  alnum       alphanumeric
  alpha       alphabetic
  ascii       0-127
  blank       space or tab
  cntrl       control character
  digit       decimal digit
  graph       printing, excluding space
  lower       lower case letter
  print       printing, including space
  punct       printing, excluding alphanumeric
  space       whitespace
  upper       upper case letter
  word        same as \ew
  xdigit      hexadecimal digit
.sp
In PCRE, POSIX character set names recognize only ASCII characters. You can use
\eQ...\eE inside a character class.
.
.
.SH "QUANTIFIERS"
.rs
.sp
  ?           0 or 1, greedy
  ?+          0 or 1, possessive
  ??          0 or 1, lazy
  *           0 or more, greedy
  *+          0 or more, possessive
  *?          0 or more, lazy
  +           1 or more, greedy
  ++          1 or more, possessive
  +?          1 or more, lazy
  {n}         exactly n
  {n,m}       at least n, no more than m, greedy
  {n,m}+      at least n, no more than m, possessive
  {n,m}?      at least n, no more than m, lazy
  {n,}        n or more, greedy
  {n,}+       n or more, possessive
  {n,}?       n or more, lazy
.
.
.SH "ANCHORS AND SIMPLE ASSERTIONS"
.rs
.sp
  \eb          word boundary (only ASCII letters recognized)
  \eB          not a word boundary
  ^           start of subject
               also after internal newline in multiline mode
  \eA          start of subject
  $           end of subject
               also before newline at end of subject
               also before internal newline in multiline mode
  \eZ          end of subject
               also before newline at end of subject
  \ez          end of subject
  \eG          first matching position in subject
.
.
.SH "MATCH POINT RESET"
.rs
.sp
  \eK          reset start of match
.
.
.SH "ALTERNATION"
.rs
.sp
  expr|expr|expr...
.
.
.SH "CAPTURING"
.rs
.sp
  (...)           capturing group
  (?<name>...)    named capturing group (Perl)
  (?'name'...)    named capturing group (Perl)
  (?P<name>...)   named capturing group (Python)
  (?:...)         non-capturing group
  (?|...)         non-capturing group; reset group numbers for
                   capturing groups in each alternative
.
.
.SH "ATOMIC GROUPS"
.rs
.sp
  (?>...)         atomic, non-capturing group
.
.
.
.
.SH "COMMENT"
.rs
.sp
  (?#....)        comment (not nestable)
.
.
.SH "OPTION SETTING"
.rs
.sp
  (?i)            caseless
  (?J)            allow duplicate names
  (?m)            multiline
  (?s)            single line (dotall)
  (?U)            default ungreedy (lazy)
  (?x)            extended (ignore white space)
  (?-...)         unset option(s)
.sp
The following is recognized only at the start of a pattern or after one of the
newline-setting options with similar syntax:
.sp
  (*UTF8)         set UTF-8 mode
.
.
.SH "LOOKAHEAD AND LOOKBEHIND ASSERTIONS"
.rs
.sp
  (?=...)         positive look ahead
  (?!...)         negative look ahead
  (?<=...)        positive look behind
  (?<!...)        negative look behind
.sp
Each top-level branch of a look behind must be of a fixed length.
.
.
.SH "BACKREFERENCES"
.rs
.sp
  \en              reference by number (can be ambiguous)
  \egn             reference by number
  \eg{n}           reference by number
  \eg{-n}          relative reference by number
  \ek<name>        reference by name (Perl)
  \ek'name'        reference by name (Perl)
  \eg{name}        reference by name (Perl)
  \ek{name}        reference by name (.NET)
  (?P=name)       reference by name (Python)
.
.
.SH "SUBROUTINE REFERENCES (POSSIBLY RECURSIVE)"
.rs
.sp
  (?R)            recurse whole pattern
  (?n)            call subpattern by absolute number
  (?+n)           call subpattern by relative number
  (?-n)           call subpattern by relative number
  (?&name)        call subpattern by name (Perl)
  (?P>name)       call subpattern by name (Python)
  \eg<name>        call subpattern by name (Oniguruma)
  \eg'name'        call subpattern by name (Oniguruma)
  \eg<n>           call subpattern by absolute number (Oniguruma)
  \eg'n'           call subpattern by absolute number (Oniguruma)
  \eg<+n>          call subpattern by relative number (PCRE extension)
  \eg'+n'          call subpattern by relative number (PCRE extension)
  \eg<-n>          call subpattern by relative number (PCRE extension)
  \eg'-n'          call subpattern by relative number (PCRE extension)
.
.
.SH "CONDITIONAL PATTERNS"
.rs
.sp
  (?(condition)yes-pattern)
  (?(condition)yes-pattern|no-pattern)
.sp
  (?(n)...        absolute reference condition
  (?(+n)...       relative reference condition
  (?(-n)...       relative reference condition
  (?(<name>)...   named reference condition (Perl)
  (?('name')...   named reference condition (Perl)
  (?(name)...     named reference condition (PCRE)
  (?(R)...        overall recursion condition
  (?(Rn)...       specific group recursion condition
  (?(R&name)...   specific recursion condition
  (?(DEFINE)...   define subpattern for reference
  (?(assert)...   assertion condition
.
.
.SH "BACKTRACKING CONTROL"
.rs
.sp
The following act immediately they are reached:
.sp
  (*ACCEPT)       force successful match
  (*FAIL)         force backtrack; synonym (*F)
.sp
The following act only when a subsequent match failure causes a backtrack to
reach them. They all force a match failure, but they differ in what happens
afterwards. Those that advance the start-of-match point do so only if the
pattern is not anchored.
.sp
  (*COMMIT)       overall failure, no advance of starting point
  (*PRUNE)        advance to next starting character
  (*SKIP)         advance start to current matching position
  (*THEN)         local failure, backtrack to next alternation
.
.
.SH "NEWLINE CONVENTIONS"
.rs
.sp
These are recognized only at the very start of the pattern or after a
(*BSR_...) or (*UTF8) option.
.sp
  (*CR)           carriage return only
  (*LF)           linefeed only
  (*CRLF)         carriage return followed by linefeed
  (*ANYCRLF)      all three of the above
  (*ANY)          any Unicode newline sequence
.
.
.SH "WHAT \eR MATCHES"
.rs
.sp
These are recognized only at the very start of the pattern or after a
(*...) option that sets the newline convention or UTF-8 mode.
.sp
  (*BSR_ANYCRLF)  CR, LF, or CRLF
  (*BSR_UNICODE)  any Unicode newline sequence
.
.
.SH "CALLOUTS"
.rs
.sp
  (?C)      callout
  (?Cn)     callout with data n
.
.
.SH "SEE ALSO"
.rs
.sp
\fBpcrepattern\fP(3), \fBpcreapi\fP(3), \fBpcrecallout\fP(3),
\fBpcrematching\fP(3), \fBpcre\fP(3).
.
.
.SH AUTHOR
.rs
.sp
.nf
Philip Hazel
University Computing Service
Cambridge CB2 3QH, England.
.fi
.
.
.SH REVISION
.rs
.sp
.nf
Last updated: 01 March 2010
Copyright (c) 1997-2010 University of Cambridge.
.fi
PK��$[)��5//man/man3/pcrecompat.3nu�[���.TH PCRECOMPAT 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH "DIFFERENCES BETWEEN PCRE AND PERL"
.rs
.sp
This document describes the differences in the ways that PCRE and Perl handle
regular expressions. The differences described here are with respect to Perl
5.10.
.P
1. PCRE has only a subset of Perl's UTF-8 and Unicode support. Details of what
it does have are given in the
.\" HTML <a href="pcre.html#utf8support">
.\" </a>
section on UTF-8 support
.\"
in the main
.\" HREF
\fBpcre\fP
.\"
page.
.P
2. PCRE does not allow repeat quantifiers on lookahead assertions. Perl permits
them, but they do not mean what you might think. For example, (?!a){3} does
not assert that the next three characters are not "a". It just asserts that the
next character is not "a" three times.
.P
3. Capturing subpatterns that occur inside negative lookahead assertions are
counted, but their entries in the offsets vector are never set. Perl sets its
numerical variables from any such patterns that are matched before the
assertion fails to match something (thereby succeeding), but only if the
negative lookahead assertion contains just one branch.
.P
4. Though binary zero characters are supported in the subject string, they are
not allowed in a pattern string because it is passed as a normal C string,
terminated by zero. The escape sequence \e0 can be used in the pattern to
represent a binary zero.
.P
5. The following Perl escape sequences are not supported: \el, \eu, \eL,
\eU, and \eN. In fact these are implemented by Perl's general string-handling
and are not part of its pattern matching engine. If any of these are
encountered by PCRE, an error is generated.
.P
6. The Perl escape sequences \ep, \eP, and \eX are supported only if PCRE is
built with Unicode character property support. The properties that can be
tested with \ep and \eP are limited to the general category properties such as
Lu and Nd, script names such as Greek or Han, and the derived properties Any
and L&. PCRE does support the Cs (surrogate) property, which Perl does not; the
Perl documentation says "Because Perl hides the need for the user to understand
the internal representation of Unicode characters, there is no need to
implement the somewhat messy concept of surrogates."
.P
7. PCRE does support the \eQ...\eE escape for quoting substrings. Characters in
between are treated as literals. This is slightly different from Perl in that $
and @ are also handled as literals inside the quotes. In Perl, they cause
variable interpolation (but of course PCRE does not have variables). Note the
following examples:
.sp
    Pattern            PCRE matches      Perl matches
.sp
.\" JOIN
    \eQabc$xyz\eE        abc$xyz           abc followed by the
                                           contents of $xyz
    \eQabc\e$xyz\eE       abc\e$xyz          abc\e$xyz
    \eQabc\eE\e$\eQxyz\eE   abc$xyz           abc$xyz
.sp
The \eQ...\eE sequence is recognized both inside and outside character classes.
.P
8. Fairly obviously, PCRE does not support the (?{code}) and (??{code})
constructions. However, there is support for recursive patterns. This is not
available in Perl 5.8, but it is in Perl 5.10. Also, the PCRE "callout"
feature allows an external function to be called during pattern matching. See
the
.\" HREF
\fBpcrecallout\fP
.\"
documentation for details.
.P
9. Subpatterns that are called recursively or as "subroutines" are always
treated as atomic groups in PCRE. This is like Python, but unlike Perl. There
is a discussion of an example that explains this in more detail in the
.\" HTML <a href="pcrepattern.html#recursiondifference">
.\" </a>
section on recursion differences from Perl
.\"
in the
.\" HREF
\fBpcrepattern\fP
.\"
page.
.P
10. There are some differences that are concerned with the settings of captured
strings when part of a pattern is repeated. For example, matching "aba" against
the pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE it is set to "b".
.P
11. PCRE does support Perl 5.10's backtracking verbs (*ACCEPT), (*FAIL), (*F),
(*COMMIT), (*PRUNE), (*SKIP), and (*THEN), but only in the forms without an
argument. PCRE does not support (*MARK).
.P
12. PCRE's handling of duplicate subpattern numbers and duplicate subpattern
names is not as general as Perl's. This is a consequence of the fact the PCRE
works internally just with numbers, using an external table to translate
between numbers and names. In particular, a pattern such as (?|(?<a>A)|(?<b)B),
where the two capturing parentheses have the same number but different names,
is not supported, and causes an error at compile time. If it were allowed, it
would not be possible to distinguish which parentheses matched, because both
names map to capturing subpattern number 1. To avoid this confusing situation,
an error is given at compile time.
.P
13. PCRE provides some extensions to the Perl regular expression facilities.
Perl 5.10 includes new features that are not in earlier versions of Perl, some
of which (such as named parentheses) have been in PCRE for some time. This list
is with respect to Perl 5.10:
.sp
(a) Although lookbehind assertions in PCRE must match fixed length strings,
each alternative branch of a lookbehind assertion can match a different length
of string. Perl requires them all to have the same length.
.sp
(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $
meta-character matches only at the very end of the string.
.sp
(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special
meaning is faulted. Otherwise, like Perl, the backslash is quietly ignored.
(Perl can be made to issue a warning.)
.sp
(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is
inverted, that is, by default they are not greedy, but if followed by a
question mark they are.
.sp
(e) PCRE_ANCHORED can be used at matching time to force a pattern to be tried
only at the first matching position in the subject string.
.sp
(f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, and
PCRE_NO_AUTO_CAPTURE options for \fBpcre_exec()\fP have no Perl equivalents.
.sp
(g) The \eR escape sequence can be restricted to match only CR, LF, or CRLF
by the PCRE_BSR_ANYCRLF option.
.sp
(h) The callout facility is PCRE-specific.
.sp
(i) The partial matching facility is PCRE-specific.
.sp
(j) Patterns compiled by PCRE can be saved and re-used at a later time, even on
different hosts that have the other endianness.
.sp
(k) The alternative matching function (\fBpcre_dfa_exec()\fP) matches in a
different way and is not Perl-compatible.
.sp
(l) PCRE recognizes some special sequences such as (*CR) at the start of
a pattern that set overall options that cannot be changed within the pattern.
.
.
.SH AUTHOR
.rs
.sp
.nf
Philip Hazel
University Computing Service
Cambridge CB2 3QH, England.
.fi
.
.
.SH REVISION
.rs
.sp
.nf
Last updated: 04 October 2009
Copyright (c) 1997-2009 University of Cambridge.
.fi
PK��$[H�yDDman/man3/pcre_free_substring.3nu�[���.TH PCRE_FREE_SUBSTRING 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B void pcre_free_substring(const char *\fIstringptr\fP);
.
.SH DESCRIPTION
.rs
.sp
This is a convenience function for freeing the store obtained by a previous
call to \fBpcre_get_substring()\fP or \fBpcre_get_named_substring()\fP. Its
only argument is a pointer to the string.
.P
There is a complete description of the PCRE native API in the
.\" HREF
\fBpcreapi\fP
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fP
.\"
page.
PK��$[.���man/man3/pcre_compile2.3nu�[���.TH PCRE_COMPILE2 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B pcre *pcre_compile2(const char *\fIpattern\fP, int \fIoptions\fP,
.ti +5n
.B int *\fIerrorcodeptr\fP,
.ti +5n
.B const char **\fIerrptr\fP, int *\fIerroffset\fP,
.ti +5n
.B const unsigned char *\fItableptr\fP);
.
.SH DESCRIPTION
.rs
.sp
This function compiles a regular expression into an internal form. It is the
same as \fBpcre_compile()\fP, except for the addition of the \fIerrorcodeptr\fP
argument. The arguments are:

.sp
  \fIpattern\fR       A zero-terminated string containing the
                  regular expression to be compiled
  \fIoptions\fR       Zero or more option bits
  \fIerrorcodeptr\fP  Where to put an error code
  \fIerrptr\fR        Where to put an error message
  \fIerroffset\fR     Offset in pattern where error was found
  \fItableptr\fR      Pointer to character tables, or NULL to
                  use the built-in default
.sp
The option bits are:
.sp
  PCRE_ANCHORED           Force pattern anchoring
  PCRE_AUTO_CALLOUT       Compile automatic callouts
  PCRE_BSR_ANYCRLF        \eR matches only CR, LF, or CRLF
  PCRE_BSR_UNICODE        \eR matches all Unicode line endings
  PCRE_CASELESS           Do caseless matching
  PCRE_DOLLAR_ENDONLY     $ not to match newline at end
  PCRE_DOTALL             . matches anything including NL
  PCRE_DUPNAMES           Allow duplicate names for subpatterns
  PCRE_EXTENDED           Ignore whitespace and # comments
  PCRE_EXTRA              PCRE extra features
                            (not much use currently)
  PCRE_FIRSTLINE          Force matching to be before newline
  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility
  PCRE_MULTILINE          ^ and $ match newlines within data
  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence
  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline
                            sequences
  PCRE_NEWLINE_CR         Set CR as the newline sequence
  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence
  PCRE_NEWLINE_LF         Set LF as the newline sequence
  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-
                            theses (named ones available)
  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8
                            validity (only relevant if
                            PCRE_UTF8 is set)
  PCRE_UNGREEDY           Invert greediness of quantifiers
  PCRE_UTF8               Run in UTF-8 mode
.sp
PCRE must be built with UTF-8 support in order to use PCRE_UTF8 and
PCRE_NO_UTF8_CHECK.
.P
The yield of the function is a pointer to a private data structure that
contains the compiled pattern, or NULL if an error was detected. Note that
compiling regular expressions with one version of PCRE for use with a different
version is not guaranteed to work and may cause crashes.
.P
There is a complete description of the PCRE native API in the
.\" HREF
\fBpcreapi\fR
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fR
.\"
page.
PK��$[����iiman/man3/pcre_dfa_exec.3nu�[���.TH PCRE_DFA_EXEC 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B int pcre_dfa_exec(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
.ti +5n
.B "const char *\fIsubject\fP," int \fIlength\fP, int \fIstartoffset\fP,
.ti +5n
.B int \fIoptions\fP, int *\fIovector\fP, int \fIovecsize\fP,
.ti +5n
.B int *\fIworkspace\fP, int \fIwscount\fP);
.
.SH DESCRIPTION
.rs
.sp
This function matches a compiled regular expression against a given subject
string, using an alternative matching algorithm that scans the subject string
just once (\fInot\fP Perl-compatible). Note that the main, Perl-compatible,
matching function is \fBpcre_exec()\fP. The arguments for this function are:
.sp
  \fIcode\fP         Points to the compiled pattern
  \fIextra\fP        Points to an associated \fBpcre_extra\fP structure,
                 or is NULL
  \fIsubject\fP      Points to the subject string
  \fIlength\fP       Length of the subject string, in bytes
  \fIstartoffset\fP  Offset in bytes in the subject at which to
                 start matching
  \fIoptions\fP      Option bits
  \fIovector\fP      Points to a vector of ints for result offsets
  \fIovecsize\fP     Number of elements in the vector
  \fIworkspace\fP    Points to a vector of ints used as working space
  \fIwscount\fP      Number of elements in the vector
.sp
The options are:
.sp
  PCRE_ANCHORED          Match only at the first position
  PCRE_BSR_ANYCRLF       \eR matches only CR, LF, or CRLF
  PCRE_BSR_UNICODE       \eR matches all Unicode line endings
  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence
  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences
  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence
  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence
  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence
  PCRE_NOTBOL            Subject is not the beginning of a line
  PCRE_NOTEOL            Subject is not the end of a line
  PCRE_NOTEMPTY          An empty string is not a valid match
  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
                           is not a valid match
  PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations
  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
                           validity (only relevant if PCRE_UTF8
                           was set at compile time)
  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
  PCRE_PARTIAL_SOFT      )   match if no full matches are found
  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
                           even if there is a full match as well
  PCRE_DFA_SHORTEST      Return only the shortest match
  PCRE_DFA_RESTART       Restart after a partial match
.sp
There are restrictions on what may appear in a pattern when using this matching
function. Details are given in the
.\" HREF
\fBpcrematching\fP
.\"
documentation. For details of partial matching, see the
.\" HREF
\fBpcrepartial\fP
.\"
page.
.P
A \fBpcre_extra\fP structure contains the following fields:
.sp
  \fIflags\fP        Bits indicating which fields are set
  \fIstudy_data\fP   Opaque data from \fBpcre_study()\fP
  \fImatch_limit\fP  Limit on internal resource use
  \fImatch_limit_recursion\fP  Limit on internal recursion depth
  \fIcallout_data\fP Opaque data passed back to callouts
  \fItables\fP       Points to character tables or is NULL
.sp
The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT,
PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, and
PCRE_EXTRA_TABLES. For this matching function, the \fImatch_limit\fP and
\fImatch_limit_recursion\fP fields are not used, and must not be set.
.P
There is a complete description of the PCRE native API in the
.\" HREF
\fBpcreapi\fP
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fP
.\"
page.
PK��$[[}G�� man/man3/pcre_get_stringnumber.3nu�[���.TH PCRE_GET_STRINGNUMBER 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B int pcre_get_stringnumber(const pcre *\fIcode\fP,
.ti +5n
.B const char *\fIname\fP);
.
.SH DESCRIPTION
.rs
.sp
This convenience function finds the number of a named substring capturing
parenthesis in a compiled pattern. Its arguments are:
.sp
  \fIcode\fP    Compiled regular expression
  \fIname\fP    Name whose number is required
.sp
The yield of the function is the number of the parenthesis if the name is
found, or PCRE_ERROR_NOSUBSTRING otherwise. When duplicate names are allowed
(PCRE_DUPNAMES is set), it is not defined which of the numbers is returned by
\fBpcre_get_stringnumber()\fP. You can obtain the complete list by calling
\fBpcre_get_stringtable_entries()\fP.
.P
There is a complete description of the PCRE native API in the
.\" HREF
\fBpcreapi\fP
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fP
.\"
page.
PK��$[����man/man3/pcrecallout.3nu�[���.TH PCRECALLOUT 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH "PCRE CALLOUTS"
.rs
.sp
.B int (*pcre_callout)(pcre_callout_block *);
.PP
PCRE provides a feature called "callout", which is a means of temporarily
passing control to the caller of PCRE in the middle of pattern matching. The
caller of PCRE provides an external function by putting its entry point in the
global variable \fIpcre_callout\fP. By default, this variable contains NULL,
which disables all calling out.
.P
Within a regular expression, (?C) indicates the points at which the external
function is to be called. Different callout points can be identified by putting
a number less than 256 after the letter C. The default value is zero.
For example, this pattern has two callout points:
.sp
  (?C1)abc(?C2)def
.sp
If the PCRE_AUTO_CALLOUT option bit is set when \fBpcre_compile()\fP or
\fBpcre_compile2()\fP is called, PCRE automatically inserts callouts, all with
number 255, before each item in the pattern. For example, if PCRE_AUTO_CALLOUT
is used with the pattern
.sp
  A(\ed{2}|--)
.sp
it is processed as if it were
.sp
(?C255)A(?C255)((?C255)\ed{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255)
.sp
Notice that there is a callout before and after each parenthesis and
alternation bar. Automatic callouts can be used for tracking the progress of
pattern matching. The
.\" HREF
\fBpcretest\fP
.\"
command has an option that sets automatic callouts; when it is used, the output
indicates how the pattern is matched. This is useful information when you are
trying to optimize the performance of a particular pattern.
.
.
.SH "MISSING CALLOUTS"
.rs
.sp
You should be aware that, because of optimizations in the way PCRE matches
patterns by default, callouts sometimes do not happen. For example, if the
pattern is
.sp
  ab(?C4)cd
.sp
PCRE knows that any matching string must contain the letter "d". If the subject
string is "abyz", the lack of "d" means that matching doesn't ever start, and
the callout is never reached. However, with "abyd", though the result is still
no match, the callout is obeyed.
.P
If the pattern is studied, PCRE knows the minimum length of a matching string,
and will immediately give a "no match" return without actually running a match
if the subject is not long enough, or, for unanchored patterns, if it has
been scanned far enough.
.P
You can disable these optimizations by passing the PCRE_NO_START_OPTIMIZE
option to \fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. This slows down the
matching process, but does ensure that callouts such as the example above are
obeyed.
.
.
.SH "THE CALLOUT INTERFACE"
.rs
.sp
During matching, when PCRE reaches a callout point, the external function
defined by \fIpcre_callout\fP is called (if it is set). This applies to both
the \fBpcre_exec()\fP and the \fBpcre_dfa_exec()\fP matching functions. The
only argument to the callout function is a pointer to a \fBpcre_callout\fP
block. This structure contains the following fields:
.sp
  int          \fIversion\fP;
  int          \fIcallout_number\fP;
  int         *\fIoffset_vector\fP;
  const char  *\fIsubject\fP;
  int          \fIsubject_length\fP;
  int          \fIstart_match\fP;
  int          \fIcurrent_position\fP;
  int          \fIcapture_top\fP;
  int          \fIcapture_last\fP;
  void        *\fIcallout_data\fP;
  int          \fIpattern_position\fP;
  int          \fInext_item_length\fP;
.sp
The \fIversion\fP field is an integer containing the version number of the
block format. The initial version was 0; the current version is 1. The version
number will change again in future if additional fields are added, but the
intention is never to remove any of the existing fields.
.P
The \fIcallout_number\fP field contains the number of the callout, as compiled
into the pattern (that is, the number after ?C for manual callouts, and 255 for
automatically generated callouts).
.P
The \fIoffset_vector\fP field is a pointer to the vector of offsets that was
passed by the caller to \fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP. When
\fBpcre_exec()\fP is used, the contents can be inspected in order to extract
substrings that have been matched so far, in the same way as for extracting
substrings after a match has completed. For \fBpcre_dfa_exec()\fP this field is
not useful.
.P
The \fIsubject\fP and \fIsubject_length\fP fields contain copies of the values
that were passed to \fBpcre_exec()\fP.
.P
The \fIstart_match\fP field normally contains the offset within the subject at
which the current match attempt started. However, if the escape sequence \eK
has been encountered, this value is changed to reflect the modified starting
point. If the pattern is not anchored, the callout function may be called
several times from the same point in the pattern for different starting points
in the subject.
.P
The \fIcurrent_position\fP field contains the offset within the subject of the
current match pointer.
.P
When the \fBpcre_exec()\fP function is used, the \fIcapture_top\fP field
contains one more than the number of the highest numbered captured substring so
far. If no substrings have been captured, the value of \fIcapture_top\fP is
one. This is always the case when \fBpcre_dfa_exec()\fP is used, because it
does not support captured substrings.
.P
The \fIcapture_last\fP field contains the number of the most recently captured
substring. If no substrings have been captured, its value is -1. This is always
the case when \fBpcre_dfa_exec()\fP is used.
.P
The \fIcallout_data\fP field contains a value that is passed to
\fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP specifically so that it can be
passed back in callouts. It is passed in the \fIpcre_callout\fP field of the
\fBpcre_extra\fP data structure. If no such data was passed, the value of
\fIcallout_data\fP in a \fBpcre_callout\fP block is NULL. There is a
description of the \fBpcre_extra\fP structure in the
.\" HREF
\fBpcreapi\fP
.\"
documentation.
.P
The \fIpattern_position\fP field is present from version 1 of the
\fIpcre_callout\fP structure. It contains the offset to the next item to be
matched in the pattern string.
.P
The \fInext_item_length\fP field is present from version 1 of the
\fIpcre_callout\fP structure. It contains the length of the next item to be
matched in the pattern string. When the callout immediately precedes an
alternation bar, a closing parenthesis, or the end of the pattern, the length
is zero. When the callout precedes an opening parenthesis, the length is that
of the entire subpattern.
.P
The \fIpattern_position\fP and \fInext_item_length\fP fields are intended to
help in distinguishing between different automatic callouts, which all have the
same callout number. However, they are set for all callouts.
.
.
.SH "RETURN VALUES"
.rs
.sp
The external callout function returns an integer to PCRE. If the value is zero,
matching proceeds as normal. If the value is greater than zero, matching fails
at the current point, but the testing of other matching possibilities goes
ahead, just as if a lookahead assertion had failed. If the value is less than
zero, the match is abandoned, and \fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP
returns the negative value.
.P
Negative values should normally be chosen from the set of PCRE_ERROR_xxx
values. In particular, PCRE_ERROR_NOMATCH forces a standard "no match" failure.
The error number PCRE_ERROR_CALLOUT is reserved for use by callout functions;
it will never be used by PCRE itself.
.
.
.SH AUTHOR
.rs
.sp
.nf
Philip Hazel
University Computing Service
Cambridge CB2 3QH, England.
.fi
.
.
.SH REVISION
.rs
.sp
.nf
Last updated: 29 September 2009
Copyright (c) 1997-2009 University of Cambridge.
.fi
PK��$[�/M�[[#man/man3/pcre_get_named_substring.3nu�[���.TH PCRE_GET_NAMED_SUBSTRING 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B int pcre_get_named_substring(const pcre *\fIcode\fP,
.ti +5n
.B const char *\fIsubject\fP, int *\fIovector\fP,
.ti +5n
.B int \fIstringcount\fP, const char *\fIstringname\fP,
.ti +5n
.B const char **\fIstringptr\fP);
.
.SH DESCRIPTION
.rs
.sp
This is a convenience function for extracting a captured substring by name. The
arguments are:
.sp
  \fIcode\fP          Compiled pattern
  \fIsubject\fP       Subject that has been successfully matched
  \fIovector\fP       Offset vector that \fBpcre_exec()\fP used
  \fIstringcount\fP   Value returned by \fBpcre_exec()\fP
  \fIstringname\fP    Name of the required substring
  \fIstringptr\fP     Where to put the string pointer
.sp
The memory in which the substring is placed is obtained by calling
\fBpcre_malloc()\fP. The convenience function \fBpcre_free_substring()\fP can
be used to free it when it is no longer needed. The yield of the function is
the length of the extracted substring, PCRE_ERROR_NOMEMORY if sufficient memory
could not be obtained, or PCRE_ERROR_NOSUBSTRING if the string name is invalid.
.P
There is a complete description of the PCRE native API in the
.\" HREF
\fBpcreapi\fP
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fP
.\"
page.
PK��$[l���RRman/man3/pcreprecompile.3nu�[���.TH PCREPRECOMPILE 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH "SAVING AND RE-USING PRECOMPILED PCRE PATTERNS"
.rs
.sp
If you are running an application that uses a large number of regular
expression patterns, it may be useful to store them in a precompiled form
instead of having to compile them every time the application is run.
If you are not using any private character tables (see the
.\" HREF
\fBpcre_maketables()\fP
.\"
documentation), this is relatively straightforward. If you are using private
tables, it is a little bit more complicated.
.P
If you save compiled patterns to a file, you can copy them to a different host
and run them there. This works even if the new host has the opposite endianness
to the one on which the patterns were compiled. There may be a small
performance penalty, but it should be insignificant. However, compiling regular
expressions with one version of PCRE for use with a different version is not
guaranteed to work and may cause crashes.
.
.
.SH "SAVING A COMPILED PATTERN"
.rs
.sh
The value returned by \fBpcre_compile()\fP points to a single block of memory
that holds the compiled pattern and associated data. You can find the length of
this block in bytes by calling \fBpcre_fullinfo()\fP with an argument of
PCRE_INFO_SIZE. You can then save the data in any appropriate manner. Here is
sample code that compiles a pattern and writes it to a file. It assumes that
the variable \fIfd\fP refers to a file that is open for output:
.sp
  int erroroffset, rc, size;
  char *error;
  pcre *re;
.sp
  re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL);
  if (re == NULL) { ... handle errors ... }
  rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size);
  if (rc < 0) { ... handle errors ... }
  rc = fwrite(re, 1, size, fd);
  if (rc != size) { ... handle errors ... }
.sp
In this example, the bytes that comprise the compiled pattern are copied
exactly. Note that this is binary data that may contain any of the 256 possible
byte values. On systems that make a distinction between binary and non-binary
data, be sure that the file is opened for binary output.
.P
If you want to write more than one pattern to a file, you will have to devise a
way of separating them. For binary data, preceding each pattern with its length
is probably the most straightforward approach. Another possibility is to write
out the data in hexadecimal instead of binary, one pattern to a line.
.P
Saving compiled patterns in a file is only one possible way of storing them for
later use. They could equally well be saved in a database, or in the memory of
some daemon process that passes them via sockets to the processes that want
them.
.P
If the pattern has been studied, it is also possible to save the study data in
a similar way to the compiled pattern itself. When studying generates
additional information, \fBpcre_study()\fP returns a pointer to a
\fBpcre_extra\fP data block. Its format is defined in the
.\" HTML <a href="pcreapi.html#extradata">
.\" </a>
section on matching a pattern
.\"
in the
.\" HREF
\fBpcreapi\fP
.\"
documentation. The \fIstudy_data\fP field points to the binary study data, and
this is what you must save (not the \fBpcre_extra\fP block itself). The length
of the study data can be obtained by calling \fBpcre_fullinfo()\fP with an
argument of PCRE_INFO_STUDYSIZE. Remember to check that \fBpcre_study()\fP did
return a non-NULL value before trying to save the study data.
.
.
.SH "RE-USING A PRECOMPILED PATTERN"
.rs
.sp
Re-using a precompiled pattern is straightforward. Having reloaded it into main
memory, you pass its pointer to \fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP in
the usual way. This should work even on another host, and even if that host has
the opposite endianness to the one where the pattern was compiled.
.P
However, if you passed a pointer to custom character tables when the pattern
was compiled (the \fItableptr\fP argument of \fBpcre_compile()\fP), you must
now pass a similar pointer to \fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP,
because the value saved with the compiled pattern will obviously be nonsense. A
field in a \fBpcre_extra()\fP block is used to pass this data, as described in
the
.\" HTML <a href="pcreapi.html#extradata">
.\" </a>
section on matching a pattern
.\"
in the
.\" HREF
\fBpcreapi\fP
.\"
documentation.
.P
If you did not provide custom character tables when the pattern was compiled,
the pointer in the compiled pattern is NULL, which causes \fBpcre_exec()\fP to
use PCRE's internal tables. Thus, you do not need to take any special action at
run time in this case.
.P
If you saved study data with the compiled pattern, you need to create your own
\fBpcre_extra\fP data block and set the \fIstudy_data\fP field to point to the
reloaded study data. You must also set the PCRE_EXTRA_STUDY_DATA bit in the
\fIflags\fP field to indicate that study data is present. Then pass the
\fBpcre_extra\fP block to \fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP in the
usual way.
.
.
.SH "COMPATIBILITY WITH DIFFERENT PCRE RELEASES"
.rs
.sp
In general, it is safest to recompile all saved patterns when you update to a
new PCRE release, though not all updates actually require this. Recompiling is
definitely needed for release 7.2.
.
.
.
.SH AUTHOR
.rs
.sp
.nf
Philip Hazel
University Computing Service
Cambridge CB2 3QH, England.
.fi
.
.
.SH REVISION
.rs
.sp
.nf
Last updated: 13 June 2007
Copyright (c) 1997-2007 University of Cambridge.
.fi
PK��$[1Vm���man/man3/pcre_version.3nu�[���.TH PCRE_VERSION 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B char *pcre_version(void);
.
.SH DESCRIPTION
.rs
.sp
This function returns a character string that gives the version number of the
PCRE library and the date of its release.
.P
There is a complete description of the PCRE native API in the
.\" HREF
\fBpcreapi\fP
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fP
.\"
page.
PK��$[�9ӣ@(@(man/man3/pcreposix.3nu�[���.TH PCREPOSIX 3
.SH NAME
PCRE - Perl-compatible regular expressions.
.SH "SYNOPSIS OF POSIX API"
.rs
.sp
.B #include <pcreposix.h>
.PP
.SM
.B int regcomp(regex_t *\fIpreg\fP, const char *\fIpattern\fP,
.ti +5n
.B int \fIcflags\fP);
.PP
.B int regexec(regex_t *\fIpreg\fP, const char *\fIstring\fP,
.ti +5n
.B size_t \fInmatch\fP, regmatch_t \fIpmatch\fP[], int \fIeflags\fP);
.PP
.B size_t regerror(int \fIerrcode\fP, const regex_t *\fIpreg\fP,
.ti +5n
.B char *\fIerrbuf\fP, size_t \fIerrbuf_size\fP);
.PP
.B void regfree(regex_t *\fIpreg\fP);
.
.SH DESCRIPTION
.rs
.sp
This set of functions provides a POSIX-style API to the PCRE regular expression
package. See the
.\" HREF
\fBpcreapi\fP
.\"
documentation for a description of PCRE's native API, which contains much
additional functionality.
.P
The functions described here are just wrapper functions that ultimately call
the PCRE native API. Their prototypes are defined in the \fBpcreposix.h\fP
header file, and on Unix systems the library itself is called
\fBpcreposix.a\fP, so can be accessed by adding \fB-lpcreposix\fP to the
command for linking an application that uses them. Because the POSIX functions
call the native ones, it is also necessary to add \fB-lpcre\fP.
.P
I have implemented only those POSIX option bits that can be reasonably mapped
to PCRE native options. In addition, the option REG_EXTENDED is defined with
the value zero. This has no effect, but since programs that are written to the
POSIX interface often use it, this makes it easier to slot in PCRE as a
replacement library. Other POSIX options are not even defined.
.P
There are also some other options that are not defined by POSIX. These have
been added at the request of users who want to make use of certain
PCRE-specific features via the POSIX calling interface.
.P
When PCRE is called via these functions, it is only the API that is POSIX-like
in style. The syntax and semantics of the regular expressions themselves are
still those of Perl, subject to the setting of various PCRE options, as
described below. "POSIX-like in style" means that the API approximates to the
POSIX definition; it is not fully POSIX-compatible, and in multi-byte encoding
domains it is probably even less compatible.
.P
The header for these functions is supplied as \fBpcreposix.h\fP to avoid any
potential clash with other POSIX libraries. It can, of course, be renamed or
aliased as \fBregex.h\fP, which is the "correct" name. It provides two
structure types, \fIregex_t\fP for compiled internal forms, and
\fIregmatch_t\fP for returning captured substrings. It also defines some
constants whose names start with "REG_"; these are used for setting options and
identifying error codes.
.P
.SH "COMPILING A PATTERN"
.rs
.sp
The function \fBregcomp()\fP is called to compile a pattern into an
internal form. The pattern is a C string terminated by a binary zero, and
is passed in the argument \fIpattern\fP. The \fIpreg\fP argument is a pointer
to a \fBregex_t\fP structure that is used as a base for storing information
about the compiled regular expression.
.P
The argument \fIcflags\fP is either zero, or contains one or more of the bits
defined by the following macros:
.sp
  REG_DOTALL
.sp
The PCRE_DOTALL option is set when the regular expression is passed for
compilation to the native function. Note that REG_DOTALL is not part of the
POSIX standard.
.sp
  REG_ICASE
.sp
The PCRE_CASELESS option is set when the regular expression is passed for
compilation to the native function.
.sp
  REG_NEWLINE
.sp
The PCRE_MULTILINE option is set when the regular expression is passed for
compilation to the native function. Note that this does \fInot\fP mimic the
defined POSIX behaviour for REG_NEWLINE (see the following section).
.sp
  REG_NOSUB
.sp
The PCRE_NO_AUTO_CAPTURE option is set when the regular expression is passed
for compilation to the native function. In addition, when a pattern that is
compiled with this flag is passed to \fBregexec()\fP for matching, the
\fInmatch\fP and \fIpmatch\fP arguments are ignored, and no captured strings
are returned.
.sp
  REG_UNGREEDY
.sp
The PCRE_UNGREEDY option is set when the regular expression is passed for
compilation to the native function. Note that REG_UNGREEDY is not part of the
POSIX standard.
.sp
  REG_UTF8
.sp
The PCRE_UTF8 option is set when the regular expression is passed for
compilation to the native function. This causes the pattern itself and all data
strings used for matching it to be treated as UTF-8 strings. Note that REG_UTF8
is not part of the POSIX standard.
.P
In the absence of these flags, no options are passed to the native function.
This means the the regex is compiled with PCRE default semantics. In
particular, the way it handles newline characters in the subject string is the
Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only
\fIsome\fP of the effects specified for REG_NEWLINE. It does not affect the way
newlines are matched by . (they are not) or by a negative class such as [^a]
(they are).
.P
The yield of \fBregcomp()\fP is zero on success, and non-zero otherwise. The
\fIpreg\fP structure is filled in on success, and one member of the structure
is public: \fIre_nsub\fP contains the number of capturing subpatterns in
the regular expression. Various error codes are defined in the header file.
.P
NOTE: If the yield of \fBregcomp()\fP is non-zero, you must not attempt to
use the contents of the \fIpreg\fP structure. If, for example, you pass it to
\fBregexec()\fP, the result is undefined and your program is likely to crash.
.
.
.SH "MATCHING NEWLINE CHARACTERS"
.rs
.sp
This area is not simple, because POSIX and Perl take different views of things.
It is not possible to get PCRE to obey POSIX semantics, but then PCRE was never
intended to be a POSIX engine. The following table lists the different
possibilities for matching newline characters in PCRE:
.sp
                          Default   Change with
.sp
  . matches newline          no     PCRE_DOTALL
  newline matches [^a]       yes    not changeable
  $ matches \en at end        yes    PCRE_DOLLARENDONLY
  $ matches \en in middle     no     PCRE_MULTILINE
  ^ matches \en in middle     no     PCRE_MULTILINE
.sp
This is the equivalent table for POSIX:
.sp
                          Default   Change with
.sp
  . matches newline          yes    REG_NEWLINE
  newline matches [^a]       yes    REG_NEWLINE
  $ matches \en at end        no     REG_NEWLINE
  $ matches \en in middle     no     REG_NEWLINE
  ^ matches \en in middle     no     REG_NEWLINE
.sp
PCRE's behaviour is the same as Perl's, except that there is no equivalent for
PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is no way to stop
newline from matching [^a].
.P
The default POSIX newline handling can be obtained by setting PCRE_DOTALL and
PCRE_DOLLAR_ENDONLY, but there is no way to make PCRE behave exactly as for the
REG_NEWLINE action.
.
.
.SH "MATCHING A PATTERN"
.rs
.sp
The function \fBregexec()\fP is called to match a compiled pattern \fIpreg\fP
against a given \fIstring\fP, which is by default terminated by a zero byte
(but see REG_STARTEND below), subject to the options in \fIeflags\fP. These can
be:
.sp
  REG_NOTBOL
.sp
The PCRE_NOTBOL option is set when calling the underlying PCRE matching
function.
.sp
  REG_NOTEMPTY
.sp
The PCRE_NOTEMPTY option is set when calling the underlying PCRE matching
function. Note that REG_NOTEMPTY is not part of the POSIX standard. However,
setting this option can give more POSIX-like behaviour in some situations.
.sp
  REG_NOTEOL
.sp
The PCRE_NOTEOL option is set when calling the underlying PCRE matching
function.
.sp
  REG_STARTEND
.sp
The string is considered to start at \fIstring\fP + \fIpmatch[0].rm_so\fP and
to have a terminating NUL located at \fIstring\fP + \fIpmatch[0].rm_eo\fP
(there need not actually be a NUL at that location), regardless of the value of
\fInmatch\fP. This is a BSD extension, compatible with but not specified by
IEEE Standard 1003.2 (POSIX.2), and should be used with caution in software
intended to be portable to other systems. Note that a non-zero \fIrm_so\fP does
not imply REG_NOTBOL; REG_STARTEND affects only the location of the string, not
how it is matched.
.P
If the pattern was compiled with the REG_NOSUB flag, no data about any matched
strings is returned. The \fInmatch\fP and \fIpmatch\fP arguments of
\fBregexec()\fP are ignored.
.P
If the value of \fInmatch\fP is zero, or if the value \fIpmatch\fP is NULL,
no data about any matched strings is returned.
.P
Otherwise,the portion of the string that was matched, and also any captured
substrings, are returned via the \fIpmatch\fP argument, which points to an
array of \fInmatch\fP structures of type \fIregmatch_t\fP, containing the
members \fIrm_so\fP and \fIrm_eo\fP. These contain the offset to the first
character of each substring and the offset to the first character after the end
of each substring, respectively. The 0th element of the vector relates to the
entire portion of \fIstring\fP that was matched; subsequent elements relate to
the capturing subpatterns of the regular expression. Unused entries in the
array have both structure members set to -1.
.P
A successful match yields a zero return; various error codes are defined in the
header file, of which REG_NOMATCH is the "expected" failure code.
.
.
.SH "ERROR MESSAGES"
.rs
.sp
The \fBregerror()\fP function maps a non-zero errorcode from either
\fBregcomp()\fP or \fBregexec()\fP to a printable message. If \fIpreg\fP is not
NULL, the error should have arisen from the use of that structure. A message
terminated by a binary zero is placed in \fIerrbuf\fP. The length of the
message, including the zero, is limited to \fIerrbuf_size\fP. The yield of the
function is the size of buffer needed to hold the whole message.
.
.
.SH MEMORY USAGE
.rs
.sp
Compiling a regular expression causes memory to be allocated and associated
with the \fIpreg\fP structure. The function \fBregfree()\fP frees all such
memory, after which \fIpreg\fP may no longer be used as a compiled expression.
.
.
.SH AUTHOR
.rs
.sp
.nf
Philip Hazel
University Computing Service
Cambridge CB2 3QH, England.
.fi
.
.
.SH REVISION
.rs
.sp
.nf
Last updated: 02 September 2009
Copyright (c) 1997-2009 University of Cambridge.
.fi
PK��$[�O��11man/man3/pcrecpp.3nu�[���.TH PCRECPP 3
.SH NAME
PCRE - Perl-compatible regular expressions.
.SH "SYNOPSIS OF C++ WRAPPER"
.rs
.sp
.B #include <pcrecpp.h>
.
.SH DESCRIPTION
.rs
.sp
The C++ wrapper for PCRE was provided by Google Inc. Some additional
functionality was added by Giuseppe Maxia. This brief man page was constructed
from the notes in the \fIpcrecpp.h\fP file, which should be consulted for
further details.
.
.
.SH "MATCHING INTERFACE"
.rs
.sp
The "FullMatch" operation checks that supplied text matches a supplied pattern
exactly. If pointer arguments are supplied, it copies matched sub-strings that
match sub-patterns into them.
.sp
  Example: successful match
     pcrecpp::RE re("h.*o");
     re.FullMatch("hello");
.sp
  Example: unsuccessful match (requires full match):
     pcrecpp::RE re("e");
     !re.FullMatch("hello");
.sp
  Example: creating a temporary RE object:
     pcrecpp::RE("h.*o").FullMatch("hello");
.sp
You can pass in a "const char*" or a "string" for "text". The examples below
tend to use a const char*. You can, as in the different examples above, store
the RE object explicitly in a variable or use a temporary RE object. The
examples below use one mode or the other arbitrarily. Either could correctly be
used for any of these examples.
.P
You must supply extra pointer arguments to extract matched subpieces.
.sp
  Example: extracts "ruby" into "s" and 1234 into "i"
     int i;
     string s;
     pcrecpp::RE re("(\e\ew+):(\e\ed+)");
     re.FullMatch("ruby:1234", &s, &i);
.sp
  Example: does not try to extract any extra sub-patterns
     re.FullMatch("ruby:1234", &s);
.sp
  Example: does not try to extract into NULL
     re.FullMatch("ruby:1234", NULL, &i);
.sp
  Example: integer overflow causes failure
     !re.FullMatch("ruby:1234567891234", NULL, &i);
.sp
  Example: fails because there aren't enough sub-patterns:
     !pcrecpp::RE("\e\ew+:\e\ed+").FullMatch("ruby:1234", &s);
.sp
  Example: fails because string cannot be stored in integer
     !pcrecpp::RE("(.*)").FullMatch("ruby", &i);
.sp
The provided pointer arguments can be pointers to any scalar numeric
type, or one of:
.sp
   string        (matched piece is copied to string)
   StringPiece   (StringPiece is mutated to point to matched piece)
   T             (where "bool T::ParseFrom(const char*, int)" exists)
   NULL          (the corresponding matched sub-pattern is not copied)
.sp
The function returns true iff all of the following conditions are satisfied:
.sp
  a. "text" matches "pattern" exactly;
.sp
  b. The number of matched sub-patterns is >= number of supplied
     pointers;
.sp
  c. The "i"th argument has a suitable type for holding the
     string captured as the "i"th sub-pattern. If you pass in
     void * NULL for the "i"th argument, or a non-void * NULL
     of the correct type, or pass fewer arguments than the
     number of sub-patterns, "i"th captured sub-pattern is
     ignored.
.sp
CAVEAT: An optional sub-pattern that does not exist in the matched
string is assigned the empty string. Therefore, the following will
return false (because the empty string is not a valid number):
.sp
   int number;
   pcrecpp::RE::FullMatch("abc", "[a-z]+(\e\ed+)?", &number);
.sp
The matching interface supports at most 16 arguments per call.
If you need more, consider using the more general interface
\fBpcrecpp::RE::DoMatch\fP. See \fBpcrecpp.h\fP for the signature for
\fBDoMatch\fP.
.P
NOTE: Do not use \fBno_arg\fP, which is used internally to mark the end of a
list of optional arguments, as a placeholder for missing arguments, as this can
lead to segfaults.
.
.
.SH "QUOTING METACHARACTERS"
.rs
.sp
You can use the "QuoteMeta" operation to insert backslashes before all
potentially meaningful characters in a string. The returned string, used as a
regular expression, will exactly match the original string.
.sp
  Example:
     string quoted = RE::QuoteMeta(unquoted);
.sp
Note that it's legal to escape a character even if it has no special meaning in
a regular expression -- so this function does that. (This also makes it
identical to the perl function of the same name; see "perldoc -f quotemeta".)
For example, "1.5-2.0?" becomes "1\e.5\e-2\e.0\e?".
.
.SH "PARTIAL MATCHES"
.rs
.sp
You can use the "PartialMatch" operation when you want the pattern
to match any substring of the text.
.sp
  Example: simple search for a string:
     pcrecpp::RE("ell").PartialMatch("hello");
.sp
  Example: find first number in a string:
     int number;
     pcrecpp::RE re("(\e\ed+)");
     re.PartialMatch("x*100 + 20", &number);
     assert(number == 100);
.
.
.SH "UTF-8 AND THE MATCHING INTERFACE"
.rs
.sp
By default, pattern and text are plain text, one byte per character. The UTF8
flag, passed to the constructor, causes both pattern and string to be treated
as UTF-8 text, still a byte stream but potentially multiple bytes per
character. In practice, the text is likelier to be UTF-8 than the pattern, but
the match returned may depend on the UTF8 flag, so always use it when matching
UTF8 text. For example, "." will match one byte normally but with UTF8 set may
match up to three bytes of a multi-byte character.
.sp
  Example:
     pcrecpp::RE_Options options;
     options.set_utf8();
     pcrecpp::RE re(utf8_pattern, options);
     re.FullMatch(utf8_string);
.sp
  Example: using the convenience function UTF8():
     pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8());
     re.FullMatch(utf8_string);
.sp
NOTE: The UTF8 flag is ignored if pcre was not configured with the
      --enable-utf8 flag.
.
.
.SH "PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE"
.rs
.sp
PCRE defines some modifiers to change the behavior of the regular expression
engine. The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle to
pass such modifiers to a RE class. Currently, the following modifiers are
supported:
.sp
   modifier              description               Perl corresponding
.sp
   PCRE_CASELESS         case insensitive match      /i
   PCRE_MULTILINE        multiple lines match        /m
   PCRE_DOTALL           dot matches newlines        /s
   PCRE_DOLLAR_ENDONLY   $ matches only at end       N/A
   PCRE_EXTRA            strict escape parsing       N/A
   PCRE_EXTENDED         ignore whitespaces          /x
   PCRE_UTF8             handles UTF8 chars          built-in
   PCRE_UNGREEDY         reverses * and *?           N/A
   PCRE_NO_AUTO_CAPTURE  disables capturing parens   N/A (*)
.sp
(*) Both Perl and PCRE allow non capturing parentheses by means of the
"?:" modifier within the pattern itself. e.g. (?:ab|cd) does not
capture, while (ab|cd) does.
.P
For a full account on how each modifier works, please check the
PCRE API reference page.
.P
For each modifier, there are two member functions whose name is made
out of the modifier in lowercase, without the "PCRE_" prefix. For
instance, PCRE_CASELESS is handled by
.sp
  bool caseless()
.sp
which returns true if the modifier is set, and
.sp
  RE_Options & set_caseless(bool)
.sp
which sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can be
accessed through the \fBset_match_limit()\fR and \fBmatch_limit()\fR member
functions. Setting \fImatch_limit\fR to a non-zero value will limit the
execution of pcre to keep it from doing bad things like blowing the stack or
taking an eternity to return a result. A value of 5000 is good enough to stop
stack blowup in a 2MB thread stack. Setting \fImatch_limit\fR to zero disables
match limiting. Alternatively, you can call \fBmatch_limit_recursion()\fP
which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much PCRE
recurses. \fBmatch_limit()\fP limits the number of matches PCRE does;
\fBmatch_limit_recursion()\fP limits the depth of internal recursion, and
therefore the amount of stack that is used.
.P
Normally, to pass one or more modifiers to a RE class, you declare
a \fIRE_Options\fR object, set the appropriate options, and pass this
object to a RE constructor. Example:
.sp
   RE_options opt;
   opt.set_caseless(true);
   if (RE("HELLO", opt).PartialMatch("hello world")) ...
.sp
RE_options has two constructors. The default constructor takes no arguments and
creates a set of flags that are off by default. The optional parameter
\fIoption_flags\fR is to facilitate transfer of legacy code from C programs.
This lets you do
.sp
   RE(pattern,
     RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str);
.sp
However, new code is better off doing
.sp
   RE(pattern,
     RE_Options().set_caseless(true).set_multiline(true))
       .PartialMatch(str);
.sp
If you are going to pass one of the most used modifiers, there are some
convenience functions that return a RE_Options class with the
appropriate modifier already set: \fBCASELESS()\fR, \fBUTF8()\fR,
\fBMULTILINE()\fR, \fBDOTALL\fR(), and \fBEXTENDED()\fR.
.P
If you need to set several options at once, and you don't want to go through
the pains of declaring a RE_Options object and setting several options, there
is a parallel method that give you such ability on the fly. You can concatenate
several \fBset_xxxxx()\fR member functions, since each of them returns a
reference to its class object. For example, to pass PCRE_CASELESS,
PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one statement, you may write:
.sp
   RE(" ^ xyz \e\es+ .* blah$",
     RE_Options()
       .set_caseless(true)
       .set_extended(true)
       .set_multiline(true)).PartialMatch(sometext);
.sp
.
.
.SH "SCANNING TEXT INCREMENTALLY"
.rs
.sp
The "Consume" operation may be useful if you want to repeatedly
match regular expressions at the front of a string and skip over
them as they match. This requires use of the "StringPiece" type,
which represents a sub-range of a real string. Like RE, StringPiece
is defined in the pcrecpp namespace.
.sp
  Example: read lines of the form "var = value" from a string.
     string contents = ...;                 // Fill string somehow
     pcrecpp::StringPiece input(contents);  // Wrap in a StringPiece

     string var;
     int value;
     pcrecpp::RE re("(\e\ew+) = (\e\ed+)\en");
     while (re.Consume(&input, &var, &value)) {
       ...;
     }
.sp
Each successful call to "Consume" will set "var/value", and also
advance "input" so it points past the matched text.
.P
The "FindAndConsume" operation is similar to "Consume" but does not
anchor your match at the beginning of the string. For example, you
could extract all words from a string by repeatedly calling
.sp
  pcrecpp::RE("(\e\ew+)").FindAndConsume(&input, &word)
.
.
.SH "PARSING HEX/OCTAL/C-RADIX NUMBERS"
.rs
.sp
By default, if you pass a pointer to a numeric value, the
corresponding text is interpreted as a base-10 number. You can
instead wrap the pointer with a call to one of the operators Hex(),
Octal(), or CRadix() to interpret the text in another base. The
CRadix operator interprets C-style "0" (base-8) and "0x" (base-16)
prefixes, but defaults to base-10.
.sp
  Example:
    int a, b, c, d;
    pcrecpp::RE re("(.*) (.*) (.*) (.*)");
    re.FullMatch("100 40 0100 0x40",
                 pcrecpp::Octal(&a), pcrecpp::Hex(&b),
                 pcrecpp::CRadix(&c), pcrecpp::CRadix(&d));
.sp
will leave 64 in a, b, c, and d.
.
.
.SH "REPLACING PARTS OF STRINGS"
.rs
.sp
You can replace the first match of "pattern" in "str" with "rewrite".
Within "rewrite", backslash-escaped digits (\e1 to \e9) can be
used to insert text matching corresponding parenthesized group
from the pattern. \e0 in "rewrite" refers to the entire matching
text. For example:
.sp
  string s = "yabba dabba doo";
  pcrecpp::RE("b+").Replace("d", &s);
.sp
will leave "s" containing "yada dabba doo". The result is true if the pattern
matches and a replacement occurs, false otherwise.
.P
\fBGlobalReplace\fP is like \fBReplace\fP except that it replaces all
occurrences of the pattern in the string with the rewrite. Replacements are
not subject to re-matching. For example:
.sp
  string s = "yabba dabba doo";
  pcrecpp::RE("b+").GlobalReplace("d", &s);
.sp
will leave "s" containing "yada dada doo". It returns the number of
replacements made.
.P
\fBExtract\fP is like \fBReplace\fP, except that if the pattern matches,
"rewrite" is copied into "out" (an additional argument) with substitutions.
The non-matching portions of "text" are ignored. Returns true iff a match
occurred and the extraction happened successfully;  if no match occurs, the
string is left unaffected.
.
.
.SH AUTHOR
.rs
.sp
.nf
The C++ wrapper was contributed by Google Inc.
Copyright (c) 2007 Google Inc.
.fi
.
.
.SH REVISION
.rs
.sp
.nf
Last updated: 17 March 2009
.fi
PK��$[g���man/man3/pcre_info.3nu�[���.TH PCRE_INFO 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B int pcre_info(const pcre *\fIcode\fP, int *\fIoptptr\fP, int
.B *\fIfirstcharptr\fP);
.
.SH DESCRIPTION
.rs
.sp
This function is obsolete. You should be using \fBpcre_fullinfo()\fP instead.
.P
There is a complete description of the PCRE native API in the
.\" HREF
\fBpcreapi\fP
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fP
.\"
page.
PK��$[�!�l�?�?man/man3/pcrepartial.3nu�[���.TH PCREPARTIAL 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH "PARTIAL MATCHING IN PCRE"
.rs
.sp
In normal use of PCRE, if the subject string that is passed to
\fBpcre_exec()\fP or \fBpcre_dfa_exec()\fP matches as far as it goes, but is
too short to match the entire pattern, PCRE_ERROR_NOMATCH is returned. There
are circumstances where it might be helpful to distinguish this case from other
cases in which there is no match.
.P
Consider, for example, an application where a human is required to type in data
for a field with specific formatting requirements. An example might be a date
in the form \fIddmmmyy\fP, defined by this pattern:
.sp
  ^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$
.sp
If the application sees the user's keystrokes one by one, and can check that
what has been typed so far is potentially valid, it is able to raise an error
as soon as a mistake is made, by beeping and not reflecting the character that
has been typed, for example. This immediate feedback is likely to be a better
user interface than a check that is delayed until the entire string has been
entered. Partial matching can also sometimes be useful when the subject string
is very long and is not all available at once.
.P
PCRE supports partial matching by means of the PCRE_PARTIAL_SOFT and
PCRE_PARTIAL_HARD options, which can be set when calling \fBpcre_exec()\fP or
\fBpcre_dfa_exec()\fP. For backwards compatibility, PCRE_PARTIAL is a synonym
for PCRE_PARTIAL_SOFT. The essential difference between the two options is
whether or not a partial match is preferred to an alternative complete match,
though the details differ between the two matching functions. If both options
are set, PCRE_PARTIAL_HARD takes precedence.
.P
Setting a partial matching option disables two of PCRE's optimizations. PCRE
remembers the last literal byte in a pattern, and abandons matching immediately
if such a byte is not present in the subject string. This optimization cannot
be used for a subject string that might match only partially. If the pattern
was studied, PCRE knows the minimum length of a matching string, and does not
bother to run the matching function on shorter strings. This optimization is
also disabled for partial matching.
.
.
.SH "PARTIAL MATCHING USING pcre_exec()"
.rs
.sp
A partial match occurs during a call to \fBpcre_exec()\fP whenever the end of
the subject string is reached successfully, but matching cannot continue
because more characters are needed. However, at least one character must have
been matched. (In other words, a partial match can never be an empty string.)
.P
If PCRE_PARTIAL_SOFT is set, the partial match is remembered, but matching
continues as normal, and other alternatives in the pattern are tried. If no
complete match can be found, \fBpcre_exec()\fP returns PCRE_ERROR_PARTIAL
instead of PCRE_ERROR_NOMATCH. If there are at least two slots in the offsets
vector, the first of them is set to the offset of the earliest character that
was inspected when the partial match was found. For convenience, the second
offset points to the end of the string so that a substring can easily be
identified.
.P
For the majority of patterns, the first offset identifies the start of the
partially matched string. However, for patterns that contain lookbehind
assertions, or \eK, or begin with \eb or \eB, earlier characters have been
inspected while carrying out the match. For example:
.sp
  /(?<=abc)123/
.sp
This pattern matches "123", but only if it is preceded by "abc". If the subject
string is "xyzabc12", the offsets after a partial match are for the substring
"abc12", because all these characters are needed if another match is tried
with extra characters added.
.P
If there is more than one partial match, the first one that was found provides
the data that is returned. Consider this pattern:
.sp
  /123\ew+X|dogY/
.sp
If this is matched against the subject string "abc123dog", both
alternatives fail to match, but the end of the subject is reached during
matching, so PCRE_ERROR_PARTIAL is returned instead of PCRE_ERROR_NOMATCH. The
offsets are set to 3 and 9, identifying "123dog" as the first partial match
that was found. (In this example, there are two partial matches, because "dog"
on its own partially matches the second alternative.)
.P
If PCRE_PARTIAL_HARD is set for \fBpcre_exec()\fP, it returns
PCRE_ERROR_PARTIAL as soon as a partial match is found, without continuing to
search for possible complete matches. The difference between the two options
can be illustrated by a pattern such as:
.sp
  /dog(sbody)?/
.sp
This matches either "dog" or "dogsbody", greedily (that is, it prefers the
longer string if possible). If it is matched against the string "dog" with
PCRE_PARTIAL_SOFT, it yields a complete match for "dog". However, if
PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL. On the other hand,
if the pattern is made ungreedy the result is different:
.sp
  /dog(sbody)??/
.sp
In this case the result is always a complete match because \fBpcre_exec()\fP
finds that first, and it never continues after finding a match. It might be
easier to follow this explanation by thinking of the two patterns like this:
.sp
  /dog(sbody)?/    is the same as  /dogsbody|dog/
  /dog(sbody)??/   is the same as  /dog|dogsbody/
.sp
The second pattern will never match "dogsbody" when \fBpcre_exec()\fP is
used, because it will always find the shorter match first.
.
.
.SH "PARTIAL MATCHING USING pcre_dfa_exec()"
.rs
.sp
The \fBpcre_dfa_exec()\fP function moves along the subject string character by
character, without backtracking, searching for all possible matches
simultaneously. If the end of the subject is reached before the end of the
pattern, there is the possibility of a partial match, again provided that at
least one character has matched.
.P
When PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if there
have been no complete matches. Otherwise, the complete matches are returned.
However, if PCRE_PARTIAL_HARD is set, a partial match takes precedence over any
complete matches. The portion of the string that was inspected when the longest
partial match was found is set as the first matching string, provided there are
at least two slots in the offsets vector.
.P
Because \fBpcre_dfa_exec()\fP always searches for all possible matches, and
there is no difference between greedy and ungreedy repetition, its behaviour is
different from \fBpcre_exec\fP when PCRE_PARTIAL_HARD is set. Consider the
string "dog" matched against the ungreedy pattern shown above:
.sp
  /dog(sbody)??/
.sp
Whereas \fBpcre_exec()\fP stops as soon as it finds the complete match for
"dog", \fBpcre_dfa_exec()\fP also finds the partial match for "dogsbody", and
so returns that when PCRE_PARTIAL_HARD is set.
.
.
.SH "PARTIAL MATCHING AND WORD BOUNDARIES"
.rs
.sp
If a pattern ends with one of sequences \eb or \eB, which test for word
boundaries, partial matching with PCRE_PARTIAL_SOFT can give counter-intuitive
results. Consider this pattern:
.sp
  /\ebcat\eb/
.sp
This matches "cat", provided there is a word boundary at either end. If the
subject string is "the cat", the comparison of the final "t" with a following
character cannot take place, so a partial match is found. However,
\fBpcre_exec()\fP carries on with normal matching, which matches \eb at the end
of the subject when the last character is a letter, thus finding a complete
match. The result, therefore, is \fInot\fP PCRE_ERROR_PARTIAL. The same thing
happens with \fBpcre_dfa_exec()\fP, because it also finds the complete match.
.P
Using PCRE_PARTIAL_HARD in this case does yield PCRE_ERROR_PARTIAL, because
then the partial match takes precedence.
.
.
.SH "FORMERLY RESTRICTED PATTERNS"
.rs
.sp
For releases of PCRE prior to 8.00, because of the way certain internal
optimizations were implemented in the \fBpcre_exec()\fP function, the
PCRE_PARTIAL option (predecessor of PCRE_PARTIAL_SOFT) could not be used with
all patterns. From release 8.00 onwards, the restrictions no longer apply, and
partial matching with \fBpcre_exec()\fP can be requested for any pattern.
.P
Items that were formerly restricted were repeated single characters and
repeated metasequences. If PCRE_PARTIAL was set for a pattern that did not
conform to the restrictions, \fBpcre_exec()\fP returned the error code
PCRE_ERROR_BADPARTIAL (-13). This error code is no longer in use. The
PCRE_INFO_OKPARTIAL call to \fBpcre_fullinfo()\fP to find out if a compiled
pattern can be used for partial matching now always returns 1.
.
.
.SH "EXAMPLE OF PARTIAL MATCHING USING PCRETEST"
.rs
.sp
If the escape sequence \eP is present in a \fBpcretest\fP data line, the
PCRE_PARTIAL_SOFT option is used for the match. Here is a run of \fBpcretest\fP
that uses the date example quoted above:
.sp
    re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/
  data> 25jun04\eP
   0: 25jun04
   1: jun
  data> 25dec3\eP
  Partial match: 23dec3
  data> 3ju\eP
  Partial match: 3ju
  data> 3juj\eP
  No match
  data> j\eP
  No match
.sp
The first data string is matched completely, so \fBpcretest\fP shows the
matched substrings. The remaining four strings do not match the complete
pattern, but the first two are partial matches. Similar output is obtained
when \fBpcre_dfa_exec()\fP is used.
.P
If the escape sequence \eP is present more than once in a \fBpcretest\fP data
line, the PCRE_PARTIAL_HARD option is set for the match.
.
.
.SH "MULTI-SEGMENT MATCHING WITH pcre_dfa_exec()"
.rs
.sp
When a partial match has been found using \fBpcre_dfa_exec()\fP, it is possible
to continue the match by providing additional subject data and calling
\fBpcre_dfa_exec()\fP again with the same compiled regular expression, this
time setting the PCRE_DFA_RESTART option. You must pass the same working
space as before, because this is where details of the previous partial match
are stored. Here is an example using \fBpcretest\fP, using the \eR escape
sequence to set the PCRE_DFA_RESTART option (\eD specifies the use of
\fBpcre_dfa_exec()\fP):
.sp
    re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/
  data> 23ja\eP\eD
  Partial match: 23ja
  data> n05\eR\eD
   0: n05
.sp
The first call has "23ja" as the subject, and requests partial matching; the
second call has "n05" as the subject for the continued (restarted) match.
Notice that when the match is complete, only the last part is shown; PCRE does
not retain the previously partially-matched string. It is up to the calling
program to do that if it needs to.
.P
You can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with
PCRE_DFA_RESTART to continue partial matching over multiple segments. This
facility can be used to pass very long subject strings to
\fBpcre_dfa_exec()\fP.
.
.
.SH "MULTI-SEGMENT MATCHING WITH pcre_exec()"
.rs
.sp
From release 8.00, \fBpcre_exec()\fP can also be used to do multi-segment
matching. Unlike \fBpcre_dfa_exec()\fP, it is not possible to restart the
previous match with a new segment of data. Instead, new data must be added to
the previous subject string, and the entire match re-run, starting from the
point where the partial match occurred. Earlier data can be discarded.
Consider an unanchored pattern that matches dates:
.sp
    re> /\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed/
  data> The date is 23ja\eP
  Partial match: 23ja
.sp
At this stage, an application could discard the text preceding "23ja", add on
text from the next segment, and call \fBpcre_exec()\fP again. Unlike
\fBpcre_dfa_exec()\fP, the entire matching string must always be available, and
the complete matching process occurs for each call, so more memory and more
processing time is needed.
.P
\fBNote:\fP If the pattern contains lookbehind assertions, or \eK, or starts
with \eb or \eB, the string that is returned for a partial match will include
characters that precede the partially matched string itself, because these must
be retained when adding on more characters for a subsequent matching attempt.
.
.
.SH "ISSUES WITH MULTI-SEGMENT MATCHING"
.rs
.sp
Certain types of pattern may give problems with multi-segment matching,
whichever matching function is used.
.P
1. If the pattern contains tests for the beginning or end of a line, you need
to pass the PCRE_NOTBOL or PCRE_NOTEOL options, as appropriate, when the
subject string for any call does not contain the beginning or end of a line.
.P
2. Lookbehind assertions at the start of a pattern are catered for in the
offsets that are returned for a partial match. However, in theory, a lookbehind
assertion later in the pattern could require even earlier characters to be
inspected, and it might not have been reached when a partial match occurs. This
is probably an extremely unlikely case; you could guard against it to a certain
extent by always including extra characters at the start.
.P
3. Matching a subject string that is split into multiple segments may not
always produce exactly the same result as matching over one single long string,
especially when PCRE_PARTIAL_SOFT is used. The section "Partial Matching and
Word Boundaries" above describes an issue that arises if the pattern ends with
\eb or \eB. Another kind of difference may occur when there are multiple
matching possibilities, because a partial match result is given only when there
are no completed matches. This means that as soon as the shortest match has
been found, continuation to a new subject segment is no longer possible.
Consider again this \fBpcretest\fP example:
.sp
    re> /dog(sbody)?/
  data> dogsb\eP
   0: dog
  data> do\eP\eD
  Partial match: do
  data> gsb\eR\eP\eD
   0: g
  data> dogsbody\eD
   0: dogsbody
   1: dog
.sp
The first data line passes the string "dogsb" to \fBpcre_exec()\fP, setting the
PCRE_PARTIAL_SOFT option. Although the string is a partial match for
"dogsbody", the result is not PCRE_ERROR_PARTIAL, because the shorter string
"dog" is a complete match. Similarly, when the subject is presented to
\fBpcre_dfa_exec()\fP in several parts ("do" and "gsb" being the first two) the
match stops when "dog" has been found, and it is not possible to continue. On
the other hand, if "dogsbody" is presented as a single string,
\fBpcre_dfa_exec()\fP finds both matches.
.P
Because of these problems, it is probably best to use PCRE_PARTIAL_HARD when
matching multi-segment data. The example above then behaves differently:
.sp
    re> /dog(sbody)?/
  data> dogsb\eP\eP
  Partial match: dogsb
  data> do\eP\eD
  Partial match: do
  data> gsb\eR\eP\eP\eD
  Partial match: gsb
.sp
.P
4. Patterns that contain alternatives at the top level which do not all
start with the same pattern item may not work as expected when
PCRE_DFA_RESTART is used with \fBpcre_dfa_exec()\fP. For example, consider this
pattern:
.sp
  1234|3789
.sp
If the first part of the subject is "ABC123", a partial match of the first
alternative is found at offset 3. There is no partial match for the second
alternative, because such a match does not start at the same point in the
subject string. Attempting to continue with the string "7890" does not yield a
match because only those alternatives that match at one point in the subject
are remembered. The problem arises because the start of the second alternative
matches within the first alternative. There is no problem with anchored
patterns or patterns such as:
.sp
  1234|ABCD
.sp
where no string can be a partial match for both alternatives. This is not a
problem if \fBpcre_exec()\fP is used, because the entire match has to be rerun
each time:
.sp
    re> /1234|3789/
  data> ABC123\eP
  Partial match: 123
  data> 1237890
   0: 3789
.sp
Of course, instead of using PCRE_DFA_PARTIAL, the same technique of re-running
the entire match can also be used with \fBpcre_dfa_exec()\fP. Another
possibility is to work with two buffers. If a partial match at offset \fIn\fP
in the first buffer is followed by "no match" when PCRE_DFA_RESTART is used on
the second buffer, you can then try a new match starting at offset \fIn+1\fP in
the first buffer.
.
.
.SH AUTHOR
.rs
.sp
.nf
Philip Hazel
University Computing Service
Cambridge CB2 3QH, England.
.fi
.
.
.SH REVISION
.rs
.sp
.nf
Last updated: 19 October 2009
Copyright (c) 1997-2009 University of Cambridge.
.fi
PK��$[�ɡ�L2L2man/man3/pcrebuild.3nu�[���.TH PCREBUILD 3
.SH NAME
PCRE - Perl-compatible regular expressions
.
.
.SH "PCRE BUILD-TIME OPTIONS"
.rs
.sp
This document describes the optional features of PCRE that can be selected when
the library is compiled. It assumes use of the \fBconfigure\fP script, where
the optional features are selected or deselected by providing options to
\fBconfigure\fP before running the \fBmake\fP command. However, the same
options can be selected in both Unix-like and non-Unix-like environments using
the GUI facility of \fBcmake-gui\fP if you are using \fBCMake\fP instead of
\fBconfigure\fP to build PCRE.
.P
There is a lot more information about building PCRE in non-Unix-like
environments in the file called \fINON_UNIX_USE\fP, which is part of the PCRE
distribution. You should consult this file as well as the \fIREADME\fP file if
you are building in a non-Unix-like environment.
.P
The complete list of options for \fBconfigure\fP (which includes the standard
ones such as the selection of the installation directory) can be obtained by
running
.sp
  ./configure --help
.sp
The following sections include descriptions of options whose names begin with
--enable or --disable. These settings specify changes to the defaults for the
\fBconfigure\fP command. Because of the way that \fBconfigure\fP works,
--enable and --disable always come in pairs, so the complementary option always
exists as well, but as it specifies the default, it is not described.
.
.
.SH "C++ SUPPORT"
.rs
.sp
By default, the \fBconfigure\fP script will search for a C++ compiler and C++
header files. If it finds them, it automatically builds the C++ wrapper library
for PCRE. You can disable this by adding
.sp
  --disable-cpp
.sp
to the \fBconfigure\fP command.
.
.
.SH "UTF-8 SUPPORT"
.rs
.sp
To build PCRE with support for UTF-8 Unicode character strings, add
.sp
  --enable-utf8
.sp
to the \fBconfigure\fP command. Of itself, this does not make PCRE treat
strings as UTF-8. As well as compiling PCRE with this option, you also have
have to set the PCRE_UTF8 option when you call the \fBpcre_compile()\fP
or \fBpcre_compile2()\fP functions.
.P
If you set --enable-utf8 when compiling in an EBCDIC environment, PCRE expects
its input to be either ASCII or UTF-8 (depending on the runtime option). It is
not possible to support both EBCDIC and UTF-8 codes in the same version of the
library. Consequently, --enable-utf8 and --enable-ebcdic are mutually
exclusive.
.
.
.SH "UNICODE CHARACTER PROPERTY SUPPORT"
.rs
.sp
UTF-8 support allows PCRE to process character values greater than 255 in the
strings that it handles. On its own, however, it does not provide any
facilities for accessing the properties of such characters. If you want to be
able to use the pattern escapes \eP, \ep, and \eX, which refer to Unicode
character properties, you must add
.sp
  --enable-unicode-properties
.sp
to the \fBconfigure\fP command. This implies UTF-8 support, even if you have
not explicitly requested it.
.P
Including Unicode property support adds around 30K of tables to the PCRE
library. Only the general category properties such as \fILu\fP and \fINd\fP are
supported. Details are given in the
.\" HREF
\fBpcrepattern\fP
.\"
documentation.
.
.
.SH "CODE VALUE OF NEWLINE"
.rs
.sp
By default, PCRE interprets the linefeed (LF) character as indicating the end
of a line. This is the normal newline character on Unix-like systems. You can
compile PCRE to use carriage return (CR) instead, by adding
.sp
  --enable-newline-is-cr
.sp
to the \fBconfigure\fP command. There is also a --enable-newline-is-lf option,
which explicitly specifies linefeed as the newline character.
.sp
Alternatively, you can specify that line endings are to be indicated by the two
character sequence CRLF. If you want this, add
.sp
  --enable-newline-is-crlf
.sp
to the \fBconfigure\fP command. There is a fourth option, specified by
.sp
  --enable-newline-is-anycrlf
.sp
which causes PCRE to recognize any of the three sequences CR, LF, or CRLF as
indicating a line ending. Finally, a fifth option, specified by
.sp
  --enable-newline-is-any
.sp
causes PCRE to recognize any Unicode newline sequence.
.P
Whatever line ending convention is selected when PCRE is built can be
overridden when the library functions are called. At build time it is
conventional to use the standard for your operating system.
.
.
.SH "WHAT \eR MATCHES"
.rs
.sp
By default, the sequence \eR in a pattern matches any Unicode newline sequence,
whatever has been selected as the line ending sequence. If you specify
.sp
  --enable-bsr-anycrlf
.sp
the default is changed so that \eR matches only CR, LF, or CRLF. Whatever is
selected when PCRE is built can be overridden when the library functions are
called.
.
.
.SH "BUILDING SHARED AND STATIC LIBRARIES"
.rs
.sp
The PCRE building process uses \fBlibtool\fP to build both shared and static
Unix libraries by default. You can suppress one of these by adding one of
.sp
  --disable-shared
  --disable-static
.sp
to the \fBconfigure\fP command, as required.
.
.
.SH "POSIX MALLOC USAGE"
.rs
.sp
When PCRE is called through the POSIX interface (see the
.\" HREF
\fBpcreposix\fP
.\"
documentation), additional working storage is required for holding the pointers
to capturing substrings, because PCRE requires three integers per substring,
whereas the POSIX interface provides only two. If the number of expected
substrings is small, the wrapper function uses space on the stack, because this
is faster than using \fBmalloc()\fP for each call. The default threshold above
which the stack is no longer used is 10; it can be changed by adding a setting
such as
.sp
  --with-posix-malloc-threshold=20
.sp
to the \fBconfigure\fP command.
.
.
.SH "HANDLING VERY LARGE PATTERNS"
.rs
.sp
Within a compiled pattern, offset values are used to point from one part to
another (for example, from an opening parenthesis to an alternation
metacharacter). By default, two-byte values are used for these offsets, leading
to a maximum size for a compiled pattern of around 64K. This is sufficient to
handle all but the most gigantic patterns. Nevertheless, some people do want to
process truyl enormous patterns, so it is possible to compile PCRE to use
three-byte or four-byte offsets by adding a setting such as
.sp
  --with-link-size=3
.sp
to the \fBconfigure\fP command. The value given must be 2, 3, or 4. Using
longer offsets slows down the operation of PCRE because it has to load
additional bytes when handling them.
.
.
.SH "AVOIDING EXCESSIVE STACK USAGE"
.rs
.sp
When matching with the \fBpcre_exec()\fP function, PCRE implements backtracking
by making recursive calls to an internal function called \fBmatch()\fP. In
environments where the size of the stack is limited, this can severely limit
PCRE's operation. (The Unix environment does not usually suffer from this
problem, but it may sometimes be necessary to increase the maximum stack size.
There is a discussion in the
.\" HREF
\fBpcrestack\fP
.\"
documentation.) An alternative approach to recursion that uses memory from the
heap to remember data, instead of using recursive function calls, has been
implemented to work round the problem of limited stack size. If you want to
build a version of PCRE that works this way, add
.sp
  --disable-stack-for-recursion
.sp
to the \fBconfigure\fP command. With this configuration, PCRE will use the
\fBpcre_stack_malloc\fP and \fBpcre_stack_free\fP variables to call memory
management functions. By default these point to \fBmalloc()\fP and
\fBfree()\fP, but you can replace the pointers so that your own functions are
used instead.
.P
Separate functions are provided rather than using \fBpcre_malloc\fP and
\fBpcre_free\fP because the usage is very predictable: the block sizes
requested are always the same, and the blocks are always freed in reverse
order. A calling program might be able to implement optimized functions that
perform better than \fBmalloc()\fP and \fBfree()\fP. PCRE runs noticeably more
slowly when built in this way. This option affects only the \fBpcre_exec()\fP
function; it is not relevant for \fBpcre_dfa_exec()\fP.
.
.
.SH "LIMITING PCRE RESOURCE USAGE"
.rs
.sp
Internally, PCRE has a function called \fBmatch()\fP, which it calls repeatedly
(sometimes recursively) when matching a pattern with the \fBpcre_exec()\fP
function. By controlling the maximum number of times this function may be
called during a single matching operation, a limit can be placed on the
resources used by a single call to \fBpcre_exec()\fP. The limit can be changed
at run time, as described in the
.\" HREF
\fBpcreapi\fP
.\"
documentation. The default is 10 million, but this can be changed by adding a
setting such as
.sp
  --with-match-limit=500000
.sp
to the \fBconfigure\fP command. This setting has no effect on the
\fBpcre_dfa_exec()\fP matching function.
.P
In some environments it is desirable to limit the depth of recursive calls of
\fBmatch()\fP more strictly than the total number of calls, in order to
restrict the maximum amount of stack (or heap, if --disable-stack-for-recursion
is specified) that is used. A second limit controls this; it defaults to the
value that is set for --with-match-limit, which imposes no additional
constraints. However, you can set a lower limit by adding, for example,
.sp
  --with-match-limit-recursion=10000
.sp
to the \fBconfigure\fP command. This value can also be overridden at run time.
.
.
.SH "CREATING CHARACTER TABLES AT BUILD TIME"
.rs
.sp
PCRE uses fixed tables for processing characters whose code values are less
than 256. By default, PCRE is built with a set of tables that are distributed
in the file \fIpcre_chartables.c.dist\fP. These tables are for ASCII codes
only. If you add
.sp
  --enable-rebuild-chartables
.sp
to the \fBconfigure\fP command, the distributed tables are no longer used.
Instead, a program called \fBdftables\fP is compiled and run. This outputs the
source for new set of tables, created in the default locale of your C runtime
system. (This method of replacing the tables does not work if you are cross
compiling, because \fBdftables\fP is run on the local host. If you need to
create alternative tables when cross compiling, you will have to do so "by
hand".)
.
.
.SH "USING EBCDIC CODE"
.rs
.sp
PCRE assumes by default that it will run in an environment where the character
code is ASCII (or Unicode, which is a superset of ASCII). This is the case for
most computer operating systems. PCRE can, however, be compiled to run in an
EBCDIC environment by adding
.sp
  --enable-ebcdic
.sp
to the \fBconfigure\fP command. This setting implies
--enable-rebuild-chartables. You should only use it if you know that you are in
an EBCDIC environment (for example, an IBM mainframe operating system). The
--enable-ebcdic option is incompatible with --enable-utf8.
.
.
.SH "PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT"
.rs
.sp
By default, \fBpcregrep\fP reads all files as plain text. You can build it so
that it recognizes files whose names end in \fB.gz\fP or \fB.bz2\fP, and reads
them with \fBlibz\fP or \fBlibbz2\fP, respectively, by adding one or both of
.sp
  --enable-pcregrep-libz
  --enable-pcregrep-libbz2
.sp
to the \fBconfigure\fP command. These options naturally require that the
relevant libraries are installed on your system. Configuration will fail if
they are not.
.
.
.SH "PCRETEST OPTION FOR LIBREADLINE SUPPORT"
.rs
.sp
If you add
.sp
  --enable-pcretest-libreadline
.sp
to the \fBconfigure\fP command, \fBpcretest\fP is linked with the
\fBlibreadline\fP library, and when its input is from a terminal, it reads it
using the \fBreadline()\fP function. This provides line-editing and history
facilities. Note that \fBlibreadline\fP is GPL-licensed, so if you distribute a
binary of \fBpcretest\fP linked in this way, there may be licensing issues.
.P
Setting this option causes the \fB-lreadline\fP option to be added to the
\fBpcretest\fP build. In many operating environments with a sytem-installed
\fBlibreadline\fP this is sufficient. However, in some environments (e.g.
if an unmodified distribution version of readline is in use), some extra
configuration may be necessary. The INSTALL file for \fBlibreadline\fP says
this:
.sp
  "Readline uses the termcap functions, but does not link with the
  termcap or curses library itself, allowing applications which link
  with readline the to choose an appropriate library."
.sp
If your environment has not been set up so that an appropriate library is
automatically included, you may need to add something like
.sp
  LIBS="-ncurses"
.sp
immediately before the \fBconfigure\fP command.
.
.
.SH "SEE ALSO"
.rs
.sp
\fBpcreapi\fP(3), \fBpcre_config\fP(3).
.
.
.SH AUTHOR
.rs
.sp
.nf
Philip Hazel
University Computing Service
Cambridge CB2 3QH, England.
.fi
.
.
.SH REVISION
.rs
.sp
.nf
Last updated: 29 September 2009
Copyright (c) 1997-2009 University of Cambridge.
.fi
PK��$[���"man/man3/pcre_get_substring_list.3nu�[���.TH PCRE_GET_SUBSTRING_LIST 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B int pcre_get_substring_list(const char *\fIsubject\fP,
.ti +5n
.B int *\fIovector\fP, int \fIstringcount\fP, "const char ***\fIlistptr\fP);"
.
.SH DESCRIPTION
.rs
.sp
This is a convenience function for extracting a list of all the captured
substrings. The arguments are:
.sp
  \fIsubject\fP       Subject that has been successfully matched
  \fIovector\fP       Offset vector that \fBpcre_exec\fP used
  \fIstringcount\fP   Value returned by \fBpcre_exec\fP
  \fIlistptr\fP       Where to put a pointer to the list
.sp
The memory in which the substrings and the list are placed is obtained by
calling \fBpcre_malloc()\fP. The convenience function
\fBpcre_free_substring_list()\fP can be used to free it when it is no longer
needed. A pointer to a list of pointers is put in the variable whose address is
in \fIlistptr\fP. The list is terminated by a NULL pointer. The yield of the
function is zero on success or PCRE_ERROR_NOMEMORY if sufficient memory could
not be obtained.
.P
There is a complete description of the PCRE native API in the
.\" HREF
\fBpcreapi\fP
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fP
.\"
page.
PK��$[�w��i1i1man/man3/pcre.3nu�[���.TH PCRE 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH INTRODUCTION
.rs
.sp
The PCRE library is a set of functions that implement regular expression
pattern matching using the same syntax and semantics as Perl, with just a few
differences. Some features that appeared in Python and PCRE before they
appeared in Perl are also available using the Python syntax, there is some
support for one or two .NET and Oniguruma syntax items, and there is an option
for requesting some minor changes that give better JavaScript compatibility.
.P
The current implementation of PCRE corresponds approximately with Perl 5.10,
including support for UTF-8 encoded strings and Unicode general category
properties. However, UTF-8 and Unicode support has to be explicitly enabled; it
is not the default. The Unicode tables correspond to Unicode release 5.2.0.
.P
In addition to the Perl-compatible matching function, PCRE contains an
alternative function that matches the same compiled patterns in a different
way. In certain circumstances, the alternative function has some advantages.
For a discussion of the two matching algorithms, see the
.\" HREF
\fBpcrematching\fP
.\"
page.
.P
PCRE is written in C and released as a C library. A number of people have
written wrappers and interfaces of various kinds. In particular, Google Inc.
have provided a comprehensive C++ wrapper. This is now included as part of the
PCRE distribution. The
.\" HREF
\fBpcrecpp\fP
.\"
page has details of this interface. Other people's contributions can be found
in the \fIContrib\fR directory at the primary FTP site, which is:
.sp
.\" HTML <a href="ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre">
.\" </a>
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre
.P
Details of exactly which Perl regular expression features are and are not
supported by PCRE are given in separate documents. See the
.\" HREF
\fBpcrepattern\fR
.\"
and
.\" HREF
\fBpcrecompat\fR
.\"
pages. There is a syntax summary in the
.\" HREF
\fBpcresyntax\fR
.\"
page.
.P
Some features of PCRE can be included, excluded, or changed when the library is
built. The
.\" HREF
\fBpcre_config()\fR
.\"
function makes it possible for a client to discover which features are
available. The features themselves are described in the
.\" HREF
\fBpcrebuild\fP
.\"
page. Documentation about building PCRE for various operating systems can be
found in the \fBREADME\fP and \fBNON-UNIX-USE\fP files in the source
distribution.
.P
The library contains a number of undocumented internal functions and data
tables that are used by more than one of the exported external functions, but
which are not intended for use by external callers. Their names all begin with
"_pcre_", which hopefully will not provoke any name clashes. In some
environments, it is possible to control which external symbols are exported
when a shared library is built, and in these cases the undocumented symbols are
not exported.
.
.
.SH "USER DOCUMENTATION"
.rs
.sp
The user documentation for PCRE comprises a number of different sections. In
the "man" format, each of these is a separate "man page". In the HTML format,
each is a separate page, linked from the index page. In the plain text format,
all the sections, except the \fBpcredemo\fP section, are concatenated, for ease
of searching. The sections are as follows:
.sp
  pcre              this document
  pcre-config       show PCRE installation configuration information
  pcreapi           details of PCRE's native C API
  pcrebuild         options for building PCRE
  pcrecallout       details of the callout feature
  pcrecompat        discussion of Perl compatibility
  pcrecpp           details of the C++ wrapper
  pcredemo          a demonstration C program that uses PCRE
  pcregrep          description of the \fBpcregrep\fP command
  pcrematching      discussion of the two matching algorithms
  pcrepartial       details of the partial matching facility
.\" JOIN
  pcrepattern       syntax and semantics of supported
                      regular expressions
  pcreperform       discussion of performance issues
  pcreposix         the POSIX-compatible C API
  pcreprecompile    details of saving and re-using precompiled patterns
  pcresample        discussion of the pcredemo program
  pcrestack         discussion of stack usage
  pcresyntax        quick syntax reference
  pcretest          description of the \fBpcretest\fP testing command
.sp
In addition, in the "man" and HTML formats, there is a short page for each
C library function, listing its arguments and results.
.
.
.SH LIMITATIONS
.rs
.sp
There are some size limitations in PCRE but it is hoped that they will never in
practice be relevant.
.P
The maximum length of a compiled pattern is 65539 (sic) bytes if PCRE is
compiled with the default internal linkage size of 2. If you want to process
regular expressions that are truly enormous, you can compile PCRE with an
internal linkage size of 3 or 4 (see the \fBREADME\fP file in the source
distribution and the
.\" HREF
\fBpcrebuild\fP
.\"
documentation for details). In these cases the limit is substantially larger.
However, the speed of execution is slower.
.P
All values in repeating quantifiers must be less than 65536.
.P
There is no limit to the number of parenthesized subpatterns, but there can be
no more than 65535 capturing subpatterns.
.P
The maximum length of name for a named subpattern is 32 characters, and the
maximum number of named subpatterns is 10000.
.P
The maximum length of a subject string is the largest positive number that an
integer variable can hold. However, when using the traditional matching
function, PCRE uses recursion to handle subpatterns and indefinite repetition.
This means that the available stack space may limit the size of a subject
string that can be processed by certain patterns. For a discussion of stack
issues, see the
.\" HREF
\fBpcrestack\fP
.\"
documentation.
.
.
.\" HTML <a name="utf8support"></a>
.
.SH "UTF-8 AND UNICODE PROPERTY SUPPORT"
.rs
.sp
From release 3.3, PCRE has had some support for character strings encoded in
the UTF-8 format. For release 4.0 this was greatly extended to cover most
common requirements, and in release 5.0 additional support for Unicode general
category properties was added.
.P
In order process UTF-8 strings, you must build PCRE to include UTF-8 support in
the code, and, in addition, you must call
.\" HREF
\fBpcre_compile()\fP
.\"
with the PCRE_UTF8 option flag, or the pattern must start with the sequence
(*UTF8). When either of these is the case, both the pattern and any subject
strings that are matched against it are treated as UTF-8 strings instead of
strings of 1-byte characters.
.P
If you compile PCRE with UTF-8 support, but do not use it at run time, the
library will be a bit bigger, but the additional run time overhead is limited
to testing the PCRE_UTF8 flag occasionally, so should not be very big.
.P
If PCRE is built with Unicode character property support (which implies UTF-8
support), the escape sequences \ep{..}, \eP{..}, and \eX are supported.
The available properties that can be tested are limited to the general
category properties such as Lu for an upper case letter or Nd for a decimal
number, the Unicode script names such as Arabic or Han, and the derived
properties Any and L&. A full list is given in the
.\" HREF
\fBpcrepattern\fP
.\"
documentation. Only the short names for properties are supported. For example,
\ep{L} matches a letter. Its Perl synonym, \ep{Letter}, is not supported.
Furthermore, in Perl, many properties may optionally be prefixed by "Is", for
compatibility with Perl 5.6. PCRE does not support this.
.
.
.\" HTML <a name="utf8strings"></a>
.
.SS "Validity of UTF-8 strings"
.rs
.sp
When you set the PCRE_UTF8 flag, the strings passed as patterns and subjects
are (by default) checked for validity on entry to the relevant functions. From
release 7.3 of PCRE, the check is according the rules of RFC 3629, which are
themselves derived from the Unicode specification. Earlier releases of PCRE
followed the rules of RFC 2279, which allows the full range of 31-bit values (0
to 0x7FFFFFFF). The current check allows only values in the range U+0 to
U+10FFFF, excluding U+D800 to U+DFFF.
.P
The excluded code points are the "Low Surrogate Area" of Unicode, of which the
Unicode Standard says this: "The Low Surrogate Area does not contain any
character assignments, consequently no character code charts or namelists are
provided for this area. Surrogates are reserved for use with UTF-16 and then
must be used in pairs." The code points that are encoded by UTF-16 pairs are
available as independent code points in the UTF-8 encoding. (In other words,
the whole surrogate thing is a fudge for UTF-16 which unfortunately messes up
UTF-8.)
.P
If an invalid UTF-8 string is passed to PCRE, an error return
(PCRE_ERROR_BADUTF8) is given. In some situations, you may already know that
your strings are valid, and therefore want to skip these checks in order to
improve performance. If you set the PCRE_NO_UTF8_CHECK flag at compile time or
at run time, PCRE assumes that the pattern or subject it is given
(respectively) contains only valid UTF-8 codes. In this case, it does not
diagnose an invalid UTF-8 string.
.P
If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, what
happens depends on why the string is invalid. If the string conforms to the
"old" definition of UTF-8 (RFC 2279), it is processed as a string of characters
in the range 0 to 0x7FFFFFFF. In other words, apart from the initial validity
test, PCRE (when in UTF-8 mode) handles strings according to the more liberal
rules of RFC 2279. However, if the string does not even conform to RFC 2279,
the result is undefined. Your program may crash.
.P
If you want to process strings of values in the full range 0 to 0x7FFFFFFF,
encoded in a UTF-8-like manner as per the old RFC, you can set
PCRE_NO_UTF8_CHECK to bypass the more restrictive test. However, in this
situation, you will have to apply your own validity check.
.
.SS "General comments about UTF-8 mode"
.rs
.sp
1. An unbraced hexadecimal escape sequence (such as \exb3) matches a two-byte
UTF-8 character if the value is greater than 127.
.P
2. Octal numbers up to \e777 are recognized, and match two-byte UTF-8
characters for values greater than \e177.
.P
3. Repeat quantifiers apply to complete UTF-8 characters, not to individual
bytes, for example: \ex{100}{3}.
.P
4. The dot metacharacter matches one UTF-8 character instead of a single byte.
.P
5. The escape sequence \eC can be used to match a single byte in UTF-8 mode,
but its use can lead to some strange effects. This facility is not available in
the alternative matching function, \fBpcre_dfa_exec()\fP.
.P
6. The character escapes \eb, \eB, \ed, \eD, \es, \eS, \ew, and \eW correctly
test characters of any code value, but the characters that PCRE recognizes as
digits, spaces, or word characters remain the same set as before, all with
values less than 256. This remains true even when PCRE includes Unicode
property support, because to do otherwise would slow down PCRE in many common
cases. If you really want to test for a wider sense of, say, "digit", you
must use Unicode property tests such as \ep{Nd}. Note that this also applies to
\eb, because it is defined in terms of \ew and \eW.
.P
7. Similarly, characters that match the POSIX named character classes are all
low-valued characters.
.P
8. However, the Perl 5.10 horizontal and vertical whitespace matching escapes
(\eh, \eH, \ev, and \eV) do match all the appropriate Unicode characters.
.P
9. Case-insensitive matching applies only to characters whose values are less
than 128, unless PCRE is built with Unicode property support. Even when Unicode
property support is available, PCRE still uses its own character tables when
checking the case of low-valued characters, so as not to degrade performance.
The Unicode property information is used only for characters with higher
values. Even when Unicode property support is available, PCRE supports
case-insensitive matching only when there is a one-to-one mapping between a
letter's cases. There are a small number of many-to-one mappings in Unicode;
these are not supported by PCRE.
.
.
.SH AUTHOR
.rs
.sp
.nf
Philip Hazel
University Computing Service
Cambridge CB2 3QH, England.
.fi
.P
Putting an actual email address here seems to have been a spam magnet, so I've
taken it away. If you want to email me, use my two initials, followed by the
two digits 10, at the domain cam.ac.uk.
.
.
.SH REVISION
.rs
.sp
.nf
Last updated: 01 March 2010
Copyright (c) 1997-2010 University of Cambridge.
.fi
PK��$[}t��((man/man3/pcreperform.3nu�[���.TH PCREPERFORM 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH "PCRE PERFORMANCE"
.rs
.sp
Two aspects of performance are discussed below: memory usage and processing
time. The way you express your pattern as a regular expression can affect both
of them.
.
.SH "COMPILED PATTERN MEMORY USAGE"
.rs
.sp
Patterns are compiled by PCRE into a reasonably efficient byte code, so that
most simple patterns do not use much memory. However, there is one case where
the memory usage of a compiled pattern can be unexpectedly large. If a
parenthesized subpattern has a quantifier with a minimum greater than 1 and/or
a limited maximum, the whole subpattern is repeated in the compiled code. For
example, the pattern
.sp
  (abc|def){2,4}
.sp
is compiled as if it were
.sp
  (abc|def)(abc|def)((abc|def)(abc|def)?)?
.sp
(Technical aside: It is done this way so that backtrack points within each of
the repetitions can be independently maintained.)
.P
For regular expressions whose quantifiers use only small numbers, this is not
usually a problem. However, if the numbers are large, and particularly if such
repetitions are nested, the memory usage can become an embarrassment. For
example, the very simple pattern
.sp
  ((ab){1,1000}c){1,3}
.sp
uses 51K bytes when compiled. When PCRE is compiled with its default internal
pointer size of two bytes, the size limit on a compiled pattern is 64K, and
this is reached with the above pattern if the outer repetition is increased
from 3 to 4. PCRE can be compiled to use larger internal pointers and thus
handle larger compiled patterns, but it is better to try to rewrite your
pattern to use less memory if you can.
.P
One way of reducing the memory usage for such patterns is to make use of PCRE's
.\" HTML <a href="pcrepattern.html#subpatternsassubroutines">
.\" </a>
"subroutine"
.\"
facility. Re-writing the above pattern as
.sp
  ((ab)(?2){0,999}c)(?1){0,2}
.sp
reduces the memory requirements to 18K, and indeed it remains under 20K even
with the outer repetition increased to 100. However, this pattern is not
exactly equivalent, because the "subroutine" calls are treated as
.\" HTML <a href="pcrepattern.html#atomicgroup">
.\" </a>
atomic groups
.\"
into which there can be no backtracking if there is a subsequent matching
failure. Therefore, PCRE cannot do this kind of rewriting automatically.
Furthermore, there is a noticeable loss of speed when executing the modified
pattern. Nevertheless, if the atomic grouping is not a problem and the loss of
speed is acceptable, this kind of rewriting will allow you to process patterns
that PCRE cannot otherwise handle.
.
.
.SH "STACK USAGE AT RUN TIME"
.rs
.sp
When \fBpcre_exec()\fP is used for matching, certain kinds of pattern can cause
it to use large amounts of the process stack. In some environments the default
process stack is quite small, and if it runs out the result is often SIGSEGV.
This issue is probably the most frequently raised problem with PCRE. Rewriting
your pattern can often help. The
.\" HREF
\fBpcrestack\fP
.\"
documentation discusses this issue in detail.
.
.
.SH "PROCESSING TIME"
.rs
.sp
Certain items in regular expression patterns are processed more efficiently
than others. It is more efficient to use a character class like [aeiou] than a
set of single-character alternatives such as (a|e|i|o|u). In general, the
simplest construction that provides the required behaviour is usually the most
efficient. Jeffrey Friedl's book contains a lot of useful general discussion
about optimizing regular expressions for efficient performance. This document
contains a few observations about PCRE.
.P
Using Unicode character properties (the \ep, \eP, and \eX escapes) is slow,
because PCRE has to scan a structure that contains data for over fifteen
thousand characters whenever it needs a character's property. If you can find
an alternative pattern that does not use character properties, it will probably
be faster.
.P
When a pattern begins with .* not in parentheses, or in parentheses that are
not the subject of a backreference, and the PCRE_DOTALL option is set, the
pattern is implicitly anchored by PCRE, since it can match only at the start of
a subject string. However, if PCRE_DOTALL is not set, PCRE cannot make this
optimization, because the . metacharacter does not then match a newline, and if
the subject string contains newlines, the pattern may match from the character
immediately following one of them instead of from the very start. For example,
the pattern
.sp
  .*second
.sp
matches the subject "first\enand second" (where \en stands for a newline
character), with the match starting at the seventh character. In order to do
this, PCRE has to retry the match starting after every newline in the subject.
.P
If you are using such a pattern with subject strings that do not contain
newlines, the best performance is obtained by setting PCRE_DOTALL, or starting
the pattern with ^.* or ^.*? to indicate explicit anchoring. That saves PCRE
from having to scan along the subject looking for a newline to restart at.
.P
Beware of patterns that contain nested indefinite repeats. These can take a
long time to run when applied to a string that does not match. Consider the
pattern fragment
.sp
  ^(a+)*
.sp
This can match "aaaa" in 16 different ways, and this number increases very
rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4
times, and for each of those cases other than 0 or 4, the + repeats can match
different numbers of times.) When the remainder of the pattern is such that the
entire match is going to fail, PCRE has in principle to try every possible
variation, and this can take an extremely long time, even for relatively short
strings.
.P
An optimization catches some of the more simple cases such as
.sp
  (a+)*b
.sp
where a literal character follows. Before embarking on the standard matching
procedure, PCRE checks that there is a "b" later in the subject string, and if
there is not, it fails the match immediately. However, when there is no
following literal this optimization cannot be used. You can see the difference
by comparing the behaviour of
.sp
  (a+)*\ed
.sp
with the pattern above. The former gives a failure almost instantly when
applied to a whole line of "a" characters, whereas the latter takes an
appreciable time with strings longer than about 20 characters.
.P
In many cases, the solution to this kind of performance issue is to use an
atomic group or a possessive quantifier.
.
.
.SH AUTHOR
.rs
.sp
.nf
Philip Hazel
University Computing Service
Cambridge CB2 3QH, England.
.fi
.
.
.SH REVISION
.rs
.sp
.nf
Last updated: 07 March 2010
Copyright (c) 1997-2010 University of Cambridge.
.fi
PK��$[�p�k�
�
man/man3/pcresample.3nu�[���.TH PCRESAMPLE 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH "PCRE SAMPLE PROGRAM"
.rs
.sp
A simple, complete demonstration program, to get you started with using PCRE,
is supplied in the file \fIpcredemo.c\fP in the PCRE distribution. A listing of
this program is given in the
.\" HREF
\fBpcredemo\fP
.\"
documentation. If you do not have a copy of the PCRE distribution, you can save
this listing to re-create \fIpcredemo.c\fP.
.P
The program compiles the regular expression that is its first argument, and
matches it against the subject string in its second argument. No PCRE options
are set, and default character tables are used. If matching succeeds, the
program outputs the portion of the subject that matched, together with the
contents of any captured substrings.
.P
If the -g option is given on the command line, the program then goes on to
check for further matches of the same regular expression in the same subject
string. The logic is a little bit tricky because of the possibility of matching
an empty string. Comments in the code explain what is going on.
.P
If PCRE is installed in the standard include and library directories for your
operating system, you should be able to compile the demonstration program using
this command:
.sp
  gcc -o pcredemo pcredemo.c -lpcre
.sp
If PCRE is installed elsewhere, you may need to add additional options to the
command line. For example, on a Unix-like system that has PCRE installed in
\fI/usr/local\fP, you can compile the demonstration program using a command
like this:
.sp
.\" JOINSH
  gcc -o pcredemo -I/usr/local/include pcredemo.c \e
      -L/usr/local/lib -lpcre
.sp
Once you have compiled the demonstration program, you can run simple tests like
this:
.sp
  ./pcredemo 'cat|dog' 'the cat sat on the mat'
  ./pcredemo -g 'cat|dog' 'the dog sat on the cat'
.sp
Note that there is a much more comprehensive test program, called
.\" HREF
\fBpcretest\fP,
.\"
which supports many more facilities for testing regular expressions and the
PCRE library. The
.\" HREF
\fBpcredemo\fP
.\"
program is provided as a simple coding example.
.P
When you try to run
.\" HREF
\fBpcredemo\fP
.\"
when PCRE is not installed in the standard library directory, you may get an
error like this on some operating systems (e.g. Solaris):
.sp
  ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or directory
.sp
This is caused by the way shared library support works on those systems. You
need to add
.sp
  -R/usr/local/lib
.sp
(for example) to the compile command to get round this problem.
.
.
.SH AUTHOR
.rs
.sp
.nf
Philip Hazel
University Computing Service
Cambridge CB2 3QH, England.
.fi
.
.
.SH REVISION
.rs
.sp
.nf
Last updated: 30 September 2009
Copyright (c) 1997-2009 University of Cambridge.
.fi
PK��$[l߅�RRman/man3/pcre_copy_substring.3nu�[���.TH PCRE_COPY_SUBSTRING 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B int pcre_copy_substring(const char *\fIsubject\fP, int *\fIovector\fP,
.ti +5n
.B int \fIstringcount\fP, int \fIstringnumber\fP, char *\fIbuffer\fP,
.ti +5n
.B int \fIbuffersize\fP);
.
.SH DESCRIPTION
.rs
.sp
This is a convenience function for extracting a captured substring into a given
buffer. The arguments are:
.sp
  \fIsubject\fP       Subject that has been successfully matched
  \fIovector\fP       Offset vector that \fBpcre_exec()\fP used
  \fIstringcount\fP   Value returned by \fBpcre_exec()\fP
  \fIstringnumber\fP  Number of the required substring
  \fIbuffer\fP        Buffer to receive the string
  \fIbuffersize\fP    Size of buffer
.sp
The yield is the length of the string, PCRE_ERROR_NOMEMORY if the buffer was
too small, or PCRE_ERROR_NOSUBSTRING if the string number is invalid.
.P
There is a complete description of the PCRE native API in the
.\" HREF
\fBpcreapi\fP
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fP
.\"
page.
PK��$[�mN��man/man3/pcre_fullinfo.3nu�[���.TH PCRE_FULLINFO 3
.SH NAME
PCRE - Perl-compatible regular expressions
.SH SYNOPSIS
.rs
.sp
.B #include <pcre.h>
.PP
.SM
.B int pcre_fullinfo(const pcre *\fIcode\fP, "const pcre_extra *\fIextra\fP,"
.ti +5n
.B int \fIwhat\fP, void *\fIwhere\fP);
.
.SH DESCRIPTION
.rs
.sp
This function returns information about a compiled pattern. Its arguments are:
.sp
  \fIcode\fP                      Compiled regular expression
  \fIextra\fP                     Result of \fBpcre_study()\fP or NULL
  \fIwhat\fP                      What information is required
  \fIwhere\fP                     Where to put the information
.sp
The following information is available:
.sp
  PCRE_INFO_BACKREFMAX      Number of highest back reference
  PCRE_INFO_CAPTURECOUNT    Number of capturing subpatterns
  PCRE_INFO_DEFAULT_TABLES  Pointer to default tables
  PCRE_INFO_FIRSTBYTE       Fixed first byte for a match, or
                              -1 for start of string
                                 or after newline, or
                              -2 otherwise
  PCRE_INFO_FIRSTTABLE      Table of first bytes (after studying)
  PCRE_INFO_JCHANGED        Return 1 if (?J) or (?-J) was used
  PCRE_INFO_LASTLITERAL     Literal last byte required
  PCRE_INFO_MINLENGTH       Lower bound length of matching strings
  PCRE_INFO_NAMECOUNT       Number of named subpatterns
  PCRE_INFO_NAMEENTRYSIZE   Size of name table entry
  PCRE_INFO_NAMETABLE       Pointer to name table
  PCRE_INFO_OKPARTIAL       Return 1 if partial matching can be tried
                              (always returns 1 after release 8.00)
  PCRE_INFO_OPTIONS         Option bits used for compilation
  PCRE_INFO_SIZE            Size of compiled pattern
  PCRE_INFO_STUDYSIZE       Size of study data
.sp
The yield of the function is zero on success or:
.sp
  PCRE_ERROR_NULL           the argument \fIcode\fP was NULL
                            the argument \fIwhere\fP was NULL
  PCRE_ERROR_BADMAGIC       the "magic number" was not found
  PCRE_ERROR_BADOPTION      the value of \fIwhat\fP was invalid
.P
There is a complete description of the PCRE native API in the
.\" HREF
\fBpcreapi\fP
.\"
page and a description of the POSIX API in the
.\" HREF
\fBpcreposix\fP
.\"
page.
PK��$[<��z�z�man/man1/pcregrep.1nu�[���.TH PCREGREP 1 "03 April 2014" "PCRE 8.35"
.SH NAME
pcregrep - a grep with Perl-compatible regular expressions.
.SH SYNOPSIS
.B pcregrep [options] [long options] [pattern] [path1 path2 ...]
.
.SH DESCRIPTION
.rs
.sp
\fBpcregrep\fP searches files for character patterns, in the same way as other
grep commands do, but it uses the PCRE regular expression library to support
patterns that are compatible with the regular expressions of Perl 5. See
.\" HREF
\fBpcresyntax\fP(3)
.\"
for a quick-reference summary of pattern syntax, or
.\" HREF
\fBpcrepattern\fP(3)
.\"
for a full description of the syntax and semantics of the regular expressions
that PCRE supports.
.P
Patterns, whether supplied on the command line or in a separate file, are given
without delimiters. For example:
.sp
  pcregrep Thursday /etc/motd
.sp
If you attempt to use delimiters (for example, by surrounding a pattern with
slashes, as is common in Perl scripts), they are interpreted as part of the
pattern. Quotes can of course be used to delimit patterns on the command line
because they are interpreted by the shell, and indeed quotes are required if a
pattern contains white space or shell metacharacters.
.P
The first argument that follows any option settings is treated as the single
pattern to be matched when neither \fB-e\fP nor \fB-f\fP is present.
Conversely, when one or both of these options are used to specify patterns, all
arguments are treated as path names. At least one of \fB-e\fP, \fB-f\fP, or an
argument pattern must be provided.
.P
If no files are specified, \fBpcregrep\fP reads the standard input. The
standard input can also be referenced by a name consisting of a single hyphen.
For example:
.sp
  pcregrep some-pattern /file1 - /file3
.sp
By default, each line that matches a pattern is copied to the standard
output, and if there is more than one file, the file name is output at the
start of each line, followed by a colon. However, there are options that can
change how \fBpcregrep\fP behaves. In particular, the \fB-M\fP option makes it
possible to search for patterns that span line boundaries. What defines a line
boundary is controlled by the \fB-N\fP (\fB--newline\fP) option.
.P
The amount of memory used for buffering files that are being scanned is
controlled by a parameter that can be set by the \fB--buffer-size\fP option.
The default value for this parameter is specified when \fBpcregrep\fP is built,
with the default default being 20K. A block of memory three times this size is
used (to allow for buffering "before" and "after" lines). An error occurs if a
line overflows the buffer.
.P
Patterns can be no longer than 8K or BUFSIZ bytes, whichever is the greater.
BUFSIZ is defined in \fB<stdio.h>\fP. When there is more than one pattern
(specified by the use of \fB-e\fP and/or \fB-f\fP), each pattern is applied to
each line in the order in which they are defined, except that all the \fB-e\fP
patterns are tried before the \fB-f\fP patterns.
.P
By default, as soon as one pattern matches a line, no further patterns are
considered. However, if \fB--colour\fP (or \fB--color\fP) is used to colour the
matching substrings, or if \fB--only-matching\fP, \fB--file-offsets\fP, or
\fB--line-offsets\fP is used to output only the part of the line that matched
(either shown literally, or as an offset), scanning resumes immediately
following the match, so that further matches on the same line can be found. If
there are multiple patterns, they are all tried on the remainder of the line,
but patterns that follow the one that matched are not tried on the earlier part
of the line.
.P
This behaviour means that the order in which multiple patterns are specified
can affect the output when one of the above options is used. This is no longer
the same behaviour as GNU grep, which now manages to display earlier matches
for later patterns (as long as there is no overlap).
.P
Patterns that can match an empty string are accepted, but empty string
matches are never recognized. An example is the pattern "(super)?(man)?", in
which all components are optional. This pattern finds all occurrences of both
"super" and "man"; the output differs from matching with "super|man" when only
the matching substrings are being shown.
.P
If the \fBLC_ALL\fP or \fBLC_CTYPE\fP environment variable is set,
\fBpcregrep\fP uses the value to set a locale when calling the PCRE library.
The \fB--locale\fP option can be used to override this.
.
.
.SH "SUPPORT FOR COMPRESSED FILES"
.rs
.sp
It is possible to compile \fBpcregrep\fP so that it uses \fBlibz\fP or
\fBlibbz2\fP to read files whose names end in \fB.gz\fP or \fB.bz2\fP,
respectively. You can find out whether your binary has support for one or both
of these file types by running it with the \fB--help\fP option. If the
appropriate support is not present, files are treated as plain text. The
standard input is always so treated.
.
.
.SH "BINARY FILES"
.rs
.sp
By default, a file that contains a binary zero byte within the first 1024 bytes
is identified as a binary file, and is processed specially. (GNU grep also
identifies binary files in this manner.) See the \fB--binary-files\fP option
for a means of changing the way binary files are handled.
.
.
.SH OPTIONS
.rs
.sp
The order in which some of the options appear can affect the output. For
example, both the \fB-h\fP and \fB-l\fP options affect the printing of file
names. Whichever comes later in the command line will be the one that takes
effect. Similarly, except where noted below, if an option is given twice, the
later setting is used. Numerical values for options may be followed by K or M,
to signify multiplication by 1024 or 1024*1024 respectively.
.TP 10
\fB--\fP
This terminates the list of options. It is useful if the next item on the
command line starts with a hyphen but is not an option. This allows for the
processing of patterns and filenames that start with hyphens.
.TP
\fB-A\fP \fInumber\fP, \fB--after-context=\fP\fInumber\fP
Output \fInumber\fP lines of context after each matching line. If filenames
and/or line numbers are being output, a hyphen separator is used instead of a
colon for the context lines. A line containing "--" is output between each
group of lines, unless they are in fact contiguous in the input file. The value
of \fInumber\fP is expected to be relatively small. However, \fBpcregrep\fP
guarantees to have up to 8K of following text available for context output.
.TP
\fB-a\fP, \fB--text\fP
Treat binary files as text. This is equivalent to
\fB--binary-files\fP=\fItext\fP.
.TP
\fB-B\fP \fInumber\fP, \fB--before-context=\fP\fInumber\fP
Output \fInumber\fP lines of context before each matching line. If filenames
and/or line numbers are being output, a hyphen separator is used instead of a
colon for the context lines. A line containing "--" is output between each
group of lines, unless they are in fact contiguous in the input file. The value
of \fInumber\fP is expected to be relatively small. However, \fBpcregrep\fP
guarantees to have up to 8K of preceding text available for context output.
.TP
\fB--binary-files=\fP\fIword\fP
Specify how binary files are to be processed. If the word is "binary" (the
default), pattern matching is performed on binary files, but the only output is
"Binary file <name> matches" when a match succeeds. If the word is "text",
which is equivalent to the \fB-a\fP or \fB--text\fP option, binary files are
processed in the same way as any other file. In this case, when a match
succeeds, the output may be binary garbage, which can have nasty effects if
sent to a terminal. If the word is "without-match", which is equivalent to the
\fB-I\fP option, binary files are not processed at all; they are assumed not to
be of interest.
.TP
\fB--buffer-size=\fP\fInumber\fP
Set the parameter that controls how much memory is used for buffering files
that are being scanned.
.TP
\fB-C\fP \fInumber\fP, \fB--context=\fP\fInumber\fP
Output \fInumber\fP lines of context both before and after each matching line.
This is equivalent to setting both \fB-A\fP and \fB-B\fP to the same value.
.TP
\fB-c\fP, \fB--count\fP
Do not output individual lines from the files that are being scanned; instead
output the number of lines that would otherwise have been shown. If no lines
are selected, the number zero is output. If several files are are being
scanned, a count is output for each of them. However, if the
\fB--files-with-matches\fP option is also used, only those files whose counts
are greater than zero are listed. When \fB-c\fP is used, the \fB-A\fP,
\fB-B\fP, and \fB-C\fP options are ignored.
.TP
\fB--colour\fP, \fB--color\fP
If this option is given without any data, it is equivalent to "--colour=auto".
If data is required, it must be given in the same shell item, separated by an
equals sign.
.TP
\fB--colour=\fP\fIvalue\fP, \fB--color=\fP\fIvalue\fP
This option specifies under what circumstances the parts of a line that matched
a pattern should be coloured in the output. By default, the output is not
coloured. The value (which is optional, see above) may be "never", "always", or
"auto". In the latter case, colouring happens only if the standard output is
connected to a terminal. More resources are used when colouring is enabled,
because \fBpcregrep\fP has to search for all possible matches in a line, not
just one, in order to colour them all.
.sp
The colour that is used can be specified by setting the environment variable
PCREGREP_COLOUR or PCREGREP_COLOR. The value of this variable should be a
string of two numbers, separated by a semicolon. They are copied directly into
the control string for setting colour on a terminal, so it is your
responsibility to ensure that they make sense. If neither of the environment
variables is set, the default is "1;31", which gives red.
.TP
\fB-D\fP \fIaction\fP, \fB--devices=\fP\fIaction\fP
If an input path is not a regular file or a directory, "action" specifies how
it is to be processed. Valid values are "read" (the default) or "skip"
(silently skip the path).
.TP
\fB-d\fP \fIaction\fP, \fB--directories=\fP\fIaction\fP
If an input path is a directory, "action" specifies how it is to be processed.
Valid values are "read" (the default in non-Windows environments, for
compatibility with GNU grep), "recurse" (equivalent to the \fB-r\fP option), or
"skip" (silently skip the path, the default in Windows environments). In the
"read" case, directories are read as if they were ordinary files. In some
operating systems the effect of reading a directory like this is an immediate
end-of-file; in others it may provoke an error.
.TP
\fB-e\fP \fIpattern\fP, \fB--regex=\fP\fIpattern\fP, \fB--regexp=\fP\fIpattern\fP
Specify a pattern to be matched. This option can be used multiple times in
order to specify several patterns. It can also be used as a way of specifying a
single pattern that starts with a hyphen. When \fB-e\fP is used, no argument
pattern is taken from the command line; all arguments are treated as file
names. There is no limit to the number of patterns. They are applied to each
line in the order in which they are defined until one matches.
.sp
If \fB-f\fP is used with \fB-e\fP, the command line patterns are matched first,
followed by the patterns from the file(s), independent of the order in which
these options are specified. Note that multiple use of \fB-e\fP is not the same
as a single pattern with alternatives. For example, X|Y finds the first
character in a line that is X or Y, whereas if the two patterns are given
separately, with X first, \fBpcregrep\fP finds X if it is present, even if it
follows Y in the line. It finds Y only if there is no X in the line. This
matters only if you are using \fB-o\fP or \fB--colo(u)r\fP to show the part(s)
of the line that matched.
.TP
\fB--exclude\fP=\fIpattern\fP
Files (but not directories) whose names match the pattern are skipped without
being processed. This applies to all files, whether listed on the command line,
obtained from \fB--file-list\fP, or by scanning a directory. The pattern is a
PCRE regular expression, and is matched against the final component of the file
name, not the entire path. The \fB-F\fP, \fB-w\fP, and \fB-x\fP options do not
apply to this pattern. The option may be given any number of times in order to
specify multiple patterns. If a file name matches both an \fB--include\fP
and an \fB--exclude\fP pattern, it is excluded. There is no short form for this
option.
.TP
\fB--exclude-from=\fP\fIfilename\fP
Treat each non-empty line of the file as the data for an \fB--exclude\fP
option. What constitutes a newline when reading the file is the operating
system's default. The \fB--newline\fP option has no effect on this option. This
option may be given more than once in order to specify a number of files to
read.
.TP
\fB--exclude-dir\fP=\fIpattern\fP
Directories whose names match the pattern are skipped without being processed,
whatever the setting of the \fB--recursive\fP option. This applies to all
directories, whether listed on the command line, obtained from
\fB--file-list\fP, or by scanning a parent directory. The pattern is a PCRE
regular expression, and is matched against the final component of the directory
name, not the entire path. The \fB-F\fP, \fB-w\fP, and \fB-x\fP options do not
apply to this pattern. The option may be given any number of times in order to
specify more than one pattern. If a directory matches both \fB--include-dir\fP
and \fB--exclude-dir\fP, it is excluded. There is no short form for this
option.
.TP
\fB-F\fP, \fB--fixed-strings\fP
Interpret each data-matching pattern as a list of fixed strings, separated by
newlines, instead of as a regular expression. What constitutes a newline for
this purpose is controlled by the \fB--newline\fP option. The \fB-w\fP (match
as a word) and \fB-x\fP (match whole line) options can be used with \fB-F\fP.
They apply to each of the fixed strings. A line is selected if any of the fixed
strings are found in it (subject to \fB-w\fP or \fB-x\fP, if present). This
option applies only to the patterns that are matched against the contents of
files; it does not apply to patterns specified by any of the \fB--include\fP or
\fB--exclude\fP options.
.TP
\fB-f\fP \fIfilename\fP, \fB--file=\fP\fIfilename\fP
Read patterns from the file, one per line, and match them against
each line of input. What constitutes a newline when reading the file is the
operating system's default. The \fB--newline\fP option has no effect on this
option. Trailing white space is removed from each line, and blank lines are
ignored. An empty file contains no patterns and therefore matches nothing. See
also the comments about multiple patterns versus a single pattern with
alternatives in the description of \fB-e\fP above.
.sp
If this option is given more than once, all the specified files are
read. A data line is output if any of the patterns match it. A filename can
be given as "-" to refer to the standard input. When \fB-f\fP is used, patterns
specified on the command line using \fB-e\fP may also be present; they are
tested before the file's patterns. However, no other pattern is taken from the
command line; all arguments are treated as the names of paths to be searched.
.TP
\fB--file-list\fP=\fIfilename\fP
Read a list of files and/or directories that are to be scanned from the given
file, one per line. Trailing white space is removed from each line, and blank
lines are ignored. These paths are processed before any that are listed on the
command line. The filename can be given as "-" to refer to the standard input.
If \fB--file\fP and \fB--file-list\fP are both specified as "-", patterns are
read first. This is useful only when the standard input is a terminal, from
which further lines (the list of files) can be read after an end-of-file
indication. If this option is given more than once, all the specified files are
read.
.TP
\fB--file-offsets\fP
Instead of showing lines or parts of lines that match, show each match as an
offset from the start of the file and a length, separated by a comma. In this
mode, no context is shown. That is, the \fB-A\fP, \fB-B\fP, and \fB-C\fP
options are ignored. If there is more than one match in a line, each of them is
shown separately. This option is mutually exclusive with \fB--line-offsets\fP
and \fB--only-matching\fP.
.TP
\fB-H\fP, \fB--with-filename\fP
Force the inclusion of the filename at the start of output lines when searching
a single file. By default, the filename is not shown in this case. For matching
lines, the filename is followed by a colon; for context lines, a hyphen
separator is used. If a line number is also being output, it follows the file
name.
.TP
\fB-h\fP, \fB--no-filename\fP
Suppress the output filenames when searching multiple files. By default,
filenames are shown when multiple files are searched. For matching lines, the
filename is followed by a colon; for context lines, a hyphen separator is used.
If a line number is also being output, it follows the file name.
.TP
\fB--help\fP
Output a help message, giving brief details of the command options and file
type support, and then exit. Anything else on the command line is
ignored.
.TP
\fB-I\fP
Treat binary files as never matching. This is equivalent to
\fB--binary-files\fP=\fIwithout-match\fP.
.TP
\fB-i\fP, \fB--ignore-case\fP
Ignore upper/lower case distinctions during comparisons.
.TP
\fB--include\fP=\fIpattern\fP
If any \fB--include\fP patterns are specified, the only files that are
processed are those that match one of the patterns (and do not match an
\fB--exclude\fP pattern). This option does not affect directories, but it
applies to all files, whether listed on the command line, obtained from
\fB--file-list\fP, or by scanning a directory. The pattern is a PCRE regular
expression, and is matched against the final component of the file name, not
the entire path. The \fB-F\fP, \fB-w\fP, and \fB-x\fP options do not apply to
this pattern. The option may be given any number of times. If a file name
matches both an \fB--include\fP and an \fB--exclude\fP pattern, it is excluded.
There is no short form for this option.
.TP
\fB--include-from=\fP\fIfilename\fP
Treat each non-empty line of the file as the data for an \fB--include\fP
option. What constitutes a newline for this purpose is the operating system's
default. The \fB--newline\fP option has no effect on this option. This option
may be given any number of times; all the files are read.
.TP
\fB--include-dir\fP=\fIpattern\fP
If any \fB--include-dir\fP patterns are specified, the only directories that
are processed are those that match one of the patterns (and do not match an
\fB--exclude-dir\fP pattern). This applies to all directories, whether listed
on the command line, obtained from \fB--file-list\fP, or by scanning a parent
directory. The pattern is a PCRE regular expression, and is matched against the
final component of the directory name, not the entire path. The \fB-F\fP,
\fB-w\fP, and \fB-x\fP options do not apply to this pattern. The option may be
given any number of times. If a directory matches both \fB--include-dir\fP and
\fB--exclude-dir\fP, it is excluded. There is no short form for this option.
.TP
\fB-L\fP, \fB--files-without-match\fP
Instead of outputting lines from the files, just output the names of the files
that do not contain any lines that would have been output. Each file name is
output once, on a separate line.
.TP
\fB-l\fP, \fB--files-with-matches\fP
Instead of outputting lines from the files, just output the names of the files
containing lines that would have been output. Each file name is output
once, on a separate line. Searching normally stops as soon as a matching line
is found in a file. However, if the \fB-c\fP (count) option is also used,
matching continues in order to obtain the correct count, and those files that
have at least one match are listed along with their counts. Using this option
with \fB-c\fP is a way of suppressing the listing of files with no matches.
.TP
\fB--label\fP=\fIname\fP
This option supplies a name to be used for the standard input when file names
are being output. If not supplied, "(standard input)" is used. There is no
short form for this option.
.TP
\fB--line-buffered\fP
When this option is given, input is read and processed line by line, and the
output is flushed after each write. By default, input is read in large chunks,
unless \fBpcregrep\fP can determine that it is reading from a terminal (which
is currently possible only in Unix-like environments). Output to terminal is
normally automatically flushed by the operating system. This option can be
useful when the input or output is attached to a pipe and you do not want
\fBpcregrep\fP to buffer up large amounts of data. However, its use will affect
performance, and the \fB-M\fP (multiline) option ceases to work.
.TP
\fB--line-offsets\fP
Instead of showing lines or parts of lines that match, show each match as a
line number, the offset from the start of the line, and a length. The line
number is terminated by a colon (as usual; see the \fB-n\fP option), and the
offset and length are separated by a comma. In this mode, no context is shown.
That is, the \fB-A\fP, \fB-B\fP, and \fB-C\fP options are ignored. If there is
more than one match in a line, each of them is shown separately. This option is
mutually exclusive with \fB--file-offsets\fP and \fB--only-matching\fP.
.TP
\fB--locale\fP=\fIlocale-name\fP
This option specifies a locale to be used for pattern matching. It overrides
the value in the \fBLC_ALL\fP or \fBLC_CTYPE\fP environment variables. If no
locale is specified, the PCRE library's default (usually the "C" locale) is
used. There is no short form for this option.
.TP
\fB--match-limit\fP=\fInumber\fP
Processing some regular expression patterns can require a very large amount of
memory, leading in some cases to a program crash if not enough is available.
Other patterns may take a very long time to search for all possible matching
strings. The \fBpcre_exec()\fP function that is called by \fBpcregrep\fP to do
the matching has two parameters that can limit the resources that it uses.
.sp
The \fB--match-limit\fP option provides a means of limiting resource usage
when processing patterns that are not going to match, but which have a very
large number of possibilities in their search trees. The classic example is a
pattern that uses nested unlimited repeats. Internally, PCRE uses a function
called \fBmatch()\fP which it calls repeatedly (sometimes recursively). The
limit set by \fB--match-limit\fP is imposed on the number of times this
function is called during a match, which has the effect of limiting the amount
of backtracking that can take place.
.sp
The \fB--recursion-limit\fP option is similar to \fB--match-limit\fP, but
instead of limiting the total number of times that \fBmatch()\fP is called, it
limits the depth of recursive calls, which in turn limits the amount of memory
that can be used. The recursion depth is a smaller number than the total number
of calls, because not all calls to \fBmatch()\fP are recursive. This limit is
of use only if it is set smaller than \fB--match-limit\fP.
.sp
There are no short forms for these options. The default settings are specified
when the PCRE library is compiled, with the default default being 10 million.
.TP
\fB-M\fP, \fB--multiline\fP
Allow patterns to match more than one line. When this option is given, patterns
may usefully contain literal newline characters and internal occurrences of ^
and $ characters. The output for a successful match may consist of more than
one line, the last of which is the one in which the match ended. If the matched
string ends with a newline sequence the output ends at the end of that line.
.sp
When this option is set, the PCRE library is called in "multiline" mode.
There is a limit to the number of lines that can be matched, imposed by the way
that \fBpcregrep\fP buffers the input file as it scans it. However,
\fBpcregrep\fP ensures that at least 8K characters or the rest of the document
(whichever is the shorter) are available for forward matching, and similarly
the previous 8K characters (or all the previous characters, if fewer than 8K)
are guaranteed to be available for lookbehind assertions. This option does not
work when input is read line by line (see \fP--line-buffered\fP.)
.TP
\fB-N\fP \fInewline-type\fP, \fB--newline\fP=\fInewline-type\fP
The PCRE library supports five different conventions for indicating
the ends of lines. They are the single-character sequences CR (carriage return)
and LF (linefeed), the two-character sequence CRLF, an "anycrlf" convention,
which recognizes any of the preceding three types, and an "any" convention, in
which any Unicode line ending sequence is assumed to end a line. The Unicode
sequences are the three just mentioned, plus VT (vertical tab, U+000B), FF
(form feed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and
PS (paragraph separator, U+2029).
.sp
When the PCRE library is built, a default line-ending sequence is specified.
This is normally the standard sequence for the operating system. Unless
otherwise specified by this option, \fBpcregrep\fP uses the library's default.
The possible values for this option are CR, LF, CRLF, ANYCRLF, or ANY. This
makes it possible to use \fBpcregrep\fP to scan files that have come from other
environments without having to modify their line endings. If the data that is
being scanned does not agree with the convention set by this option,
\fBpcregrep\fP may behave in strange ways. Note that this option does not
apply to files specified by the \fB-f\fP, \fB--exclude-from\fP, or
\fB--include-from\fP options, which are expected to use the operating system's
standard newline sequence.
.TP
\fB-n\fP, \fB--line-number\fP
Precede each output line by its line number in the file, followed by a colon
for matching lines or a hyphen for context lines. If the filename is also being
output, it precedes the line number. This option is forced if
\fB--line-offsets\fP is used.
.TP
\fB--no-jit\fP
If the PCRE library is built with support for just-in-time compiling (which
speeds up matching), \fBpcregrep\fP automatically makes use of this, unless it
was explicitly disabled at build time. This option can be used to disable the
use of JIT at run time. It is provided for testing and working round problems.
It should never be needed in normal use.
.TP
\fB-o\fP, \fB--only-matching\fP
Show only the part of the line that matched a pattern instead of the whole
line. In this mode, no context is shown. That is, the \fB-A\fP, \fB-B\fP, and
\fB-C\fP options are ignored. If there is more than one match in a line, each
of them is shown separately. If \fB-o\fP is combined with \fB-v\fP (invert the
sense of the match to find non-matching lines), no output is generated, but the
return code is set appropriately. If the matched portion of the line is empty,
nothing is output unless the file name or line number are being printed, in
which case they are shown on an otherwise empty line. This option is mutually
exclusive with \fB--file-offsets\fP and \fB--line-offsets\fP.
.TP
\fB-o\fP\fInumber\fP, \fB--only-matching\fP=\fInumber\fP
Show only the part of the line that matched the capturing parentheses of the
given number. Up to 32 capturing parentheses are supported, and -o0 is
equivalent to \fB-o\fP without a number. Because these options can be given
without an argument (see above), if an argument is present, it must be given in
the same shell item, for example, -o3 or --only-matching=2. The comments given
for the non-argument case above also apply to this case. If the specified
capturing parentheses do not exist in the pattern, or were not set in the
match, nothing is output unless the file name or line number are being printed.
.sp
If this option is given multiple times, multiple substrings are output, in the
order the options are given. For example, -o3 -o1 -o3 causes the substrings
matched by capturing parentheses 3 and 1 and then 3 again to be output. By
default, there is no separator (but see the next option).
.TP
\fB--om-separator\fP=\fItext\fP
Specify a separating string for multiple occurrences of \fB-o\fP. The default
is an empty string. Separating strings are never coloured.
.TP
\fB-q\fP, \fB--quiet\fP
Work quietly, that is, display nothing except error messages. The exit
status indicates whether or not any matches were found.
.TP
\fB-r\fP, \fB--recursive\fP
If any given path is a directory, recursively scan the files it contains,
taking note of any \fB--include\fP and \fB--exclude\fP settings. By default, a
directory is read as a normal file; in some operating systems this gives an
immediate end-of-file. This option is a shorthand for setting the \fB-d\fP
option to "recurse".
.TP
\fB--recursion-limit\fP=\fInumber\fP
See \fB--match-limit\fP above.
.TP
\fB-s\fP, \fB--no-messages\fP
Suppress error messages about non-existent or unreadable files. Such files are
quietly skipped. However, the return code is still 2, even if matches were
found in other files.
.TP
\fB-u\fP, \fB--utf-8\fP
Operate in UTF-8 mode. This option is available only if PCRE has been compiled
with UTF-8 support. All patterns (including those for any \fB--exclude\fP and
\fB--include\fP options) and all subject lines that are scanned must be valid
strings of UTF-8 characters.
.TP
\fB-V\fP, \fB--version\fP
Write the version numbers of \fBpcregrep\fP and the PCRE library to the
standard output and then exit. Anything else on the command line is
ignored.
.TP
\fB-v\fP, \fB--invert-match\fP
Invert the sense of the match, so that lines which do \fInot\fP match any of
the patterns are the ones that are found.
.TP
\fB-w\fP, \fB--word-regex\fP, \fB--word-regexp\fP
Force the patterns to match only whole words. This is equivalent to having \eb
at the start and end of the pattern. This option applies only to the patterns
that are matched against the contents of files; it does not apply to patterns
specified by any of the \fB--include\fP or \fB--exclude\fP options.
.TP
\fB-x\fP, \fB--line-regex\fP, \fB--line-regexp\fP
Force the patterns to be anchored (each must start matching at the beginning of
a line) and in addition, require them to match entire lines. This is equivalent
to having ^ and $ characters at the start and end of each alternative branch in
every pattern. This option applies only to the patterns that are matched
against the contents of files; it does not apply to patterns specified by any
of the \fB--include\fP or \fB--exclude\fP options.
.
.
.SH "ENVIRONMENT VARIABLES"
.rs
.sp
The environment variables \fBLC_ALL\fP and \fBLC_CTYPE\fP are examined, in that
order, for a locale. The first one that is set is used. This can be overridden
by the \fB--locale\fP option. If no locale is set, the PCRE library's default
(usually the "C" locale) is used.
.
.
.SH "NEWLINES"
.rs
.sp
The \fB-N\fP (\fB--newline\fP) option allows \fBpcregrep\fP to scan files with
different newline conventions from the default. Any parts of the input files
that are written to the standard output are copied identically, with whatever
newline sequences they have in the input. However, the setting of this option
does not affect the interpretation of files specified by the \fB-f\fP,
\fB--exclude-from\fP, or \fB--include-from\fP options, which are assumed to use
the operating system's standard newline sequence, nor does it affect the way in
which \fBpcregrep\fP writes informational messages to the standard error and
output streams. For these it uses the string "\en" to indicate newlines,
relying on the C I/O library to convert this to an appropriate sequence.
.
.
.SH "OPTIONS COMPATIBILITY"
.rs
.sp
Many of the short and long forms of \fBpcregrep\fP's options are the same
as in the GNU \fBgrep\fP program. Any long option of the form
\fB--xxx-regexp\fP (GNU terminology) is also available as \fB--xxx-regex\fP
(PCRE terminology). However, the \fB--file-list\fP, \fB--file-offsets\fP,
\fB--include-dir\fP, \fB--line-offsets\fP, \fB--locale\fP, \fB--match-limit\fP,
\fB-M\fP, \fB--multiline\fP, \fB-N\fP, \fB--newline\fP, \fB--om-separator\fP,
\fB--recursion-limit\fP, \fB-u\fP, and \fB--utf-8\fP options are specific to
\fBpcregrep\fP, as is the use of the \fB--only-matching\fP option with a
capturing parentheses number.
.P
Although most of the common options work the same way, a few are different in
\fBpcregrep\fP. For example, the \fB--include\fP option's argument is a glob
for GNU \fBgrep\fP, but a regular expression for \fBpcregrep\fP. If both the
\fB-c\fP and \fB-l\fP options are given, GNU grep lists only file names,
without counts, but \fBpcregrep\fP gives the counts.
.
.
.SH "OPTIONS WITH DATA"
.rs
.sp
There are four different ways in which an option with data can be specified.
If a short form option is used, the data may follow immediately, or (with one
exception) in the next command line item. For example:
.sp
  -f/some/file
  -f /some/file
.sp
The exception is the \fB-o\fP option, which may appear with or without data.
Because of this, if data is present, it must follow immediately in the same
item, for example -o3.
.P
If a long form option is used, the data may appear in the same command line
item, separated by an equals character, or (with two exceptions) it may appear
in the next command line item. For example:
.sp
  --file=/some/file
  --file /some/file
.sp
Note, however, that if you want to supply a file name beginning with ~ as data
in a shell command, and have the shell expand ~ to a home directory, you must
separate the file name from the option, because the shell does not treat ~
specially unless it is at the start of an item.
.P
The exceptions to the above are the \fB--colour\fP (or \fB--color\fP) and
\fB--only-matching\fP options, for which the data is optional. If one of these
options does have data, it must be given in the first form, using an equals
character. Otherwise \fBpcregrep\fP will assume that it has no data.
.
.
.SH "MATCHING ERRORS"
.rs
.sp
It is possible to supply a regular expression that takes a very long time to
fail to match certain lines. Such patterns normally involve nested indefinite
repeats, for example: (a+)*\ed when matched against a line of a's with no final
digit. The PCRE matching function has a resource limit that causes it to abort
in these circumstances. If this happens, \fBpcregrep\fP outputs an error
message and the line that caused the problem to the standard error stream. If
there are more than 20 such errors, \fBpcregrep\fP gives up.
.P
The \fB--match-limit\fP option of \fBpcregrep\fP can be used to set the overall
resource limit; there is a second option called \fB--recursion-limit\fP that
sets a limit on the amount of memory (usually stack) that is used (see the
discussion of these options above).
.
.
.SH DIAGNOSTICS
.rs
.sp
Exit status is 0 if any matches were found, 1 if no matches were found, and 2
for syntax errors, overlong lines, non-existent or inaccessible files (even if
matches were found in other files) or too many matching errors. Using the
\fB-s\fP option to suppress error messages about inaccessible files does not
affect the return code.
.
.
.SH "SEE ALSO"
.rs
.sp
\fBpcrepattern\fP(3), \fBpcresyntax\fP(3), \fBpcretest\fP(1).
.
.
.SH AUTHOR
.rs
.sp
.nf
Philip Hazel
University Computing Service
Cambridge CB2 3QH, England.
.fi
.
.
.SH REVISION
.rs
.sp
.nf
Last updated: 03 April 2014
Copyright (c) 1997-2014 University of Cambridge.
.fi
PK��$[��0�0�man/man1/pcretest.1nu�[���.TH PCRETEST 1 "23 February 2017" "PCRE 8.41"
.SH NAME
pcretest - a program for testing Perl-compatible regular expressions.
.SH SYNOPSIS
.rs
.sp
.B pcretest "[options] [input file [output file]]"
.sp
\fBpcretest\fP was written as a test program for the PCRE regular expression
library itself, but it can also be used for experimenting with regular
expressions. This document describes the features of the test program; for
details of the regular expressions themselves, see the
.\" HREF
\fBpcrepattern\fP
.\"
documentation. For details of the PCRE library function calls and their
options, see the
.\" HREF
\fBpcreapi\fP
.\"
,
.\" HREF
\fBpcre16\fP
and
.\" HREF
\fBpcre32\fP
.\"
documentation.
.P
The input for \fBpcretest\fP is a sequence of regular expression patterns and
strings to be matched, as described below. The output shows the result of each
match. Options on the command line and the patterns control PCRE options and
exactly what is output.
.P
As PCRE has evolved, it has acquired many different features, and as a result,
\fBpcretest\fP now has rather a lot of obscure options for testing every
possible feature. Some of these options are specifically designed for use in
conjunction with the test script and data files that are distributed as part of
PCRE, and are unlikely to be of use otherwise. They are all documented here,
but without much justification.
.
.
.SH "INPUT DATA FORMAT"
.rs
.sp
Input to \fBpcretest\fP is processed line by line, either by calling the C
library's \fBfgets()\fP function, or via the \fBlibreadline\fP library (see
below). In Unix-like environments, \fBfgets()\fP treats any bytes other than
newline as data characters. However, in some Windows environments character 26
(hex 1A) causes an immediate end of file, and no further data is read. For
maximum portability, therefore, it is safest to use only ASCII characters in
\fBpcretest\fP input files.
.P
The input is processed using using C's string functions, so must not
contain binary zeroes, even though in Unix-like environments, \fBfgets()\fP
treats any bytes other than newline as data characters.
.
.
.SH "PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES"
.rs
.sp
From release 8.30, two separate PCRE libraries can be built. The original one
supports 8-bit character strings, whereas the newer 16-bit library supports
character strings encoded in 16-bit units. From release 8.32, a third library
can be built, supporting character strings encoded in 32-bit units. The
\fBpcretest\fP program can be used to test all three libraries. However, it is
itself still an 8-bit program, reading 8-bit input and writing 8-bit output.
When testing the 16-bit or 32-bit library, the patterns and data strings are
converted to 16- or 32-bit format before being passed to the PCRE library
functions. Results are converted to 8-bit for output.
.P
References to functions and structures of the form \fBpcre[16|32]_xx\fP below
mean "\fBpcre_xx\fP when using the 8-bit library, \fBpcre16_xx\fP when using
the 16-bit library, or \fBpcre32_xx\fP when using the 32-bit library".
.
.
.SH "COMMAND LINE OPTIONS"
.rs
.TP 10
\fB-8\fP
If both the 8-bit library has been built, this option causes the 8-bit library
to be used (which is the default); if the 8-bit library has not been built,
this option causes an error.
.TP 10
\fB-16\fP
If both the 8-bit or the 32-bit, and the 16-bit libraries have been built, this
option causes the 16-bit library to be used. If only the 16-bit library has been
built, this is the default (so has no effect). If only the 8-bit or the 32-bit
library has been built, this option causes an error.
.TP 10
\fB-32\fP
If both the 8-bit or the 16-bit, and the 32-bit libraries have been built, this
option causes the 32-bit library to be used. If only the 32-bit library has been
built, this is the default (so has no effect). If only the 8-bit or the 16-bit
library has been built, this option causes an error.
.TP 10
\fB-b\fP
Behave as if each pattern has the \fB/B\fP (show byte code) modifier; the
internal form is output after compilation.
.TP 10
\fB-C\fP
Output the version number of the PCRE library, and all available information
about the optional features that are included, and then exit with zero exit
code. All other options are ignored.
.TP 10
\fB-C\fP \fIoption\fP
Output information about a specific build-time option, then exit. This
functionality is intended for use in scripts such as \fBRunTest\fP. The
following options output the value and set the exit code as indicated:
.sp
  ebcdic-nl  the code for LF (= NL) in an EBCDIC environment:
               0x15 or 0x25
               0 if used in an ASCII environment
               exit code is always 0
  linksize   the configured internal link size (2, 3, or 4)
               exit code is set to the link size
  newline    the default newline setting:
               CR, LF, CRLF, ANYCRLF, or ANY
               exit code is always 0
  bsr        the default setting for what \eR matches:
               ANYCRLF or ANY
               exit code is always 0
.sp
The following options output 1 for true or 0 for false, and set the exit code
to the same value:
.sp
  ebcdic     compiled for an EBCDIC environment
  jit        just-in-time support is available
  pcre16     the 16-bit library was built
  pcre32     the 32-bit library was built
  pcre8      the 8-bit library was built
  ucp        Unicode property support is available
  utf        UTF-8 and/or UTF-16 and/or UTF-32 support
               is available
.sp
If an unknown option is given, an error message is output; the exit code is 0.
.TP 10
\fB-d\fP
Behave as if each pattern has the \fB/D\fP (debug) modifier; the internal
form and information about the compiled pattern is output after compilation;
\fB-d\fP is equivalent to \fB-b -i\fP.
.TP 10
\fB-dfa\fP
Behave as if each data line contains the \eD escape sequence; this causes the
alternative matching function, \fBpcre[16|32]_dfa_exec()\fP, to be used instead
of the standard \fBpcre[16|32]_exec()\fP function (more detail is given below).
.TP 10
\fB-help\fP
Output a brief summary these options and then exit.
.TP 10
\fB-i\fP
Behave as if each pattern has the \fB/I\fP modifier; information about the
compiled pattern is given after compilation.
.TP 10
\fB-M\fP
Behave as if each data line contains the \eM escape sequence; this causes
PCRE to discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings by
calling \fBpcre[16|32]_exec()\fP repeatedly with different limits.
.TP 10
\fB-m\fP
Output the size of each compiled pattern after it has been compiled. This is
equivalent to adding \fB/M\fP to each regular expression. The size is given in
bytes for both libraries.
.TP 10
\fB-O\fP
Behave as if each pattern has the \fB/O\fP modifier, that is disable
auto-possessification for all patterns.
.TP 10
\fB-o\fP \fIosize\fP
Set the number of elements in the output vector that is used when calling
\fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP to be \fIosize\fP. The
default value is 45, which is enough for 14 capturing subexpressions for
\fBpcre[16|32]_exec()\fP or 22 different matches for
\fBpcre[16|32]_dfa_exec()\fP.
The vector size can be changed for individual matching calls by including \eO
in the data line (see below).
.TP 10
\fB-p\fP
Behave as if each pattern has the \fB/P\fP modifier; the POSIX wrapper API is
used to call PCRE. None of the other options has any effect when \fB-p\fP is
set. This option can be used only with the 8-bit library.
.TP 10
\fB-q\fP
Do not output the version number of \fBpcretest\fP at the start of execution.
.TP 10
\fB-S\fP \fIsize\fP
On Unix-like systems, set the size of the run-time stack to \fIsize\fP
megabytes.
.TP 10
\fB-s\fP or \fB-s+\fP
Behave as if each pattern has the \fB/S\fP modifier; in other words, force each
pattern to be studied. If \fB-s+\fP is used, all the JIT compile options are
passed to \fBpcre[16|32]_study()\fP, causing just-in-time optimization to be set
up if it is available, for both full and partial matching. Specific JIT compile
options can be selected by following \fB-s+\fP with a digit in the range 1 to
7, which selects the JIT compile modes as follows:
.sp
  1  normal match only
  2  soft partial match only
  3  normal match and soft partial match
  4  hard partial match only
  6  soft and hard partial match
  7  all three modes (default)
.sp
If \fB-s++\fP is used instead of \fB-s+\fP (with or without a following digit),
the text "(JIT)" is added to the first output line after a match or no match
when JIT-compiled code was actually used.
.sp
Note that there are pattern options that can override \fB-s\fP, either
specifying no studying at all, or suppressing JIT compilation.
.sp
If the \fB/I\fP or \fB/D\fP option is present on a pattern (requesting output
about the compiled pattern), information about the result of studying is not
included when studying is caused only by \fB-s\fP and neither \fB-i\fP nor
\fB-d\fP is present on the command line. This behaviour means that the output
from tests that are run with and without \fB-s\fP should be identical, except
when options that output information about the actual running of a match are
set.
.sp
The \fB-M\fP, \fB-t\fP, and \fB-tm\fP options, which give information about
resources used, are likely to produce different output with and without
\fB-s\fP. Output may also differ if the \fB/C\fP option is present on an
individual pattern. This uses callouts to trace the the matching process, and
this may be different between studied and non-studied patterns. If the pattern
contains (*MARK) items there may also be differences, for the same reason. The
\fB-s\fP command line option can be overridden for specific patterns that
should never be studied (see the \fB/S\fP pattern modifier below).
.TP 10
\fB-t\fP
Run each compile, study, and match many times with a timer, and output the
resulting times per compile, study, or match (in milliseconds). Do not set
\fB-m\fP with \fB-t\fP, because you will then get the size output a zillion
times, and the timing will be distorted. You can control the number of
iterations that are used for timing by following \fB-t\fP with a number (as a
separate item on the command line). For example, "-t 1000" iterates 1000 times.
The default is to iterate 500000 times.
.TP 10
\fB-tm\fP
This is like \fB-t\fP except that it times only the matching phase, not the
compile or study phases.
.TP 10
\fB-T\fP \fB-TM\fP
These behave like \fB-t\fP and \fB-tm\fP, but in addition, at the end of a run,
the total times for all compiles, studies, and matches are output.
.
.
.SH DESCRIPTION
.rs
.sp
If \fBpcretest\fP is given two filename arguments, it reads from the first and
writes to the second. If it is given only one filename argument, it reads from
that file and writes to stdout. Otherwise, it reads from stdin and writes to
stdout, and prompts for each line of input, using "re>" to prompt for regular
expressions, and "data>" to prompt for data lines.
.P
When \fBpcretest\fP is built, a configuration option can specify that it should
be linked with the \fBlibreadline\fP library. When this is done, if the input
is from a terminal, it is read using the \fBreadline()\fP function. This
provides line-editing and history facilities. The output from the \fB-help\fP
option states whether or not \fBreadline()\fP will be used.
.P
The program handles any number of sets of input on a single input file. Each
set starts with a regular expression, and continues with any number of data
lines to be matched against that pattern.
.P
Each data line is matched separately and independently. If you want to do
multi-line matches, you have to use the \en escape sequence (or \er or \er\en,
etc., depending on the newline setting) in a single line of input to encode the
newline sequences. There is no limit on the length of data lines; the input
buffer is automatically extended if it is too small.
.P
An empty line signals the end of the data lines, at which point a new regular
expression is read. The regular expressions are given enclosed in any
non-alphanumeric delimiters other than backslash, for example:
.sp
  /(a|bc)x+yz/
.sp
White space before the initial delimiter is ignored. A regular expression may
be continued over several input lines, in which case the newline characters are
included within it. It is possible to include the delimiter within the pattern
by escaping it, for example
.sp
  /abc\e/def/
.sp
If you do so, the escape and the delimiter form part of the pattern, but since
delimiters are always non-alphanumeric, this does not affect its interpretation.
If the terminating delimiter is immediately followed by a backslash, for
example,
.sp
  /abc/\e
.sp
then a backslash is added to the end of the pattern. This is done to provide a
way of testing the error condition that arises if a pattern finishes with a
backslash, because
.sp
  /abc\e/
.sp
is interpreted as the first line of a pattern that starts with "abc/", causing
pcretest to read the next line as a continuation of the regular expression.
.
.
.SH "PATTERN MODIFIERS"
.rs
.sp
A pattern may be followed by any number of modifiers, which are mostly single
characters, though some of these can be qualified by further characters.
Following Perl usage, these are referred to below as, for example, "the
\fB/i\fP modifier", even though the delimiter of the pattern need not always be
a slash, and no slash is used when writing modifiers. White space may appear
between the final pattern delimiter and the first modifier, and between the
modifiers themselves. For reference, here is a complete list of modifiers. They
fall into several groups that are described in detail in the following
sections.
.sp
  \fB/8\fP              set UTF mode
  \fB/9\fP              set PCRE_NEVER_UTF (locks out UTF mode)
  \fB/?\fP              disable UTF validity check
  \fB/+\fP              show remainder of subject after match
  \fB/=\fP              show all captures (not just those that are set)
.sp
  \fB/A\fP              set PCRE_ANCHORED
  \fB/B\fP              show compiled code
  \fB/C\fP              set PCRE_AUTO_CALLOUT
  \fB/D\fP              same as \fB/B\fP plus \fB/I\fP
  \fB/E\fP              set PCRE_DOLLAR_ENDONLY
  \fB/F\fP              flip byte order in compiled pattern
  \fB/f\fP              set PCRE_FIRSTLINE
  \fB/G\fP              find all matches (shorten string)
  \fB/g\fP              find all matches (use startoffset)
  \fB/I\fP              show information about pattern
  \fB/i\fP              set PCRE_CASELESS
  \fB/J\fP              set PCRE_DUPNAMES
  \fB/K\fP              show backtracking control names
  \fB/L\fP              set locale
  \fB/M\fP              show compiled memory size
  \fB/m\fP              set PCRE_MULTILINE
  \fB/N\fP              set PCRE_NO_AUTO_CAPTURE
  \fB/O\fP              set PCRE_NO_AUTO_POSSESS
  \fB/P\fP              use the POSIX wrapper
  \fB/Q\fP              test external stack check function
  \fB/S\fP              study the pattern after compilation
  \fB/s\fP              set PCRE_DOTALL
  \fB/T\fP              select character tables
  \fB/U\fP              set PCRE_UNGREEDY
  \fB/W\fP              set PCRE_UCP
  \fB/X\fP              set PCRE_EXTRA
  \fB/x\fP              set PCRE_EXTENDED
  \fB/Y\fP              set PCRE_NO_START_OPTIMIZE
  \fB/Z\fP              don't show lengths in \fB/B\fP output
.sp
  \fB/<any>\fP          set PCRE_NEWLINE_ANY
  \fB/<anycrlf>\fP      set PCRE_NEWLINE_ANYCRLF
  \fB/<cr>\fP           set PCRE_NEWLINE_CR
  \fB/<crlf>\fP         set PCRE_NEWLINE_CRLF
  \fB/<lf>\fP           set PCRE_NEWLINE_LF
  \fB/<bsr_anycrlf>\fP  set PCRE_BSR_ANYCRLF
  \fB/<bsr_unicode>\fP  set PCRE_BSR_UNICODE
  \fB/<JS>\fP           set PCRE_JAVASCRIPT_COMPAT
.sp
.
.
.SS "Perl-compatible modifiers"
.rs
.sp
The \fB/i\fP, \fB/m\fP, \fB/s\fP, and \fB/x\fP modifiers set the PCRE_CASELESS,
PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when
\fBpcre[16|32]_compile()\fP is called. These four modifier letters have the same
effect as they do in Perl. For example:
.sp
  /caseless/i
.sp
.
.
.SS "Modifiers for other PCRE options"
.rs
.sp
The following table shows additional modifiers for setting PCRE compile-time
options that do not correspond to anything in Perl:
.sp
  \fB/8\fP              PCRE_UTF8           ) when using the 8-bit
  \fB/?\fP              PCRE_NO_UTF8_CHECK  )   library
.sp
  \fB/8\fP              PCRE_UTF16          ) when using the 16-bit
  \fB/?\fP              PCRE_NO_UTF16_CHECK )   library
.sp
  \fB/8\fP              PCRE_UTF32          ) when using the 32-bit
  \fB/?\fP              PCRE_NO_UTF32_CHECK )   library
.sp
  \fB/9\fP              PCRE_NEVER_UTF
  \fB/A\fP              PCRE_ANCHORED
  \fB/C\fP              PCRE_AUTO_CALLOUT
  \fB/E\fP              PCRE_DOLLAR_ENDONLY
  \fB/f\fP              PCRE_FIRSTLINE
  \fB/J\fP              PCRE_DUPNAMES
  \fB/N\fP              PCRE_NO_AUTO_CAPTURE
  \fB/O\fP              PCRE_NO_AUTO_POSSESS
  \fB/U\fP              PCRE_UNGREEDY
  \fB/W\fP              PCRE_UCP
  \fB/X\fP              PCRE_EXTRA
  \fB/Y\fP              PCRE_NO_START_OPTIMIZE
  \fB/<any>\fP          PCRE_NEWLINE_ANY
  \fB/<anycrlf>\fP      PCRE_NEWLINE_ANYCRLF
  \fB/<cr>\fP           PCRE_NEWLINE_CR
  \fB/<crlf>\fP         PCRE_NEWLINE_CRLF
  \fB/<lf>\fP           PCRE_NEWLINE_LF
  \fB/<bsr_anycrlf>\fP  PCRE_BSR_ANYCRLF
  \fB/<bsr_unicode>\fP  PCRE_BSR_UNICODE
  \fB/<JS>\fP           PCRE_JAVASCRIPT_COMPAT
.sp
The modifiers that are enclosed in angle brackets are literal strings as shown,
including the angle brackets, but the letters within can be in either case.
This example sets multiline matching with CRLF as the line ending sequence:
.sp
  /^abc/m<CRLF>
.sp
As well as turning on the PCRE_UTF8/16/32 option, the \fB/8\fP modifier causes
all non-printing characters in output strings to be printed using the
\ex{hh...} notation. Otherwise, those less than 0x100 are output in hex without
the curly brackets.
.P
Full details of the PCRE options are given in the
.\" HREF
\fBpcreapi\fP
.\"
documentation.
.
.
.SS "Finding all matches in a string"
.rs
.sp
Searching for all possible matches within each subject string can be requested
by the \fB/g\fP or \fB/G\fP modifier. After finding a match, PCRE is called
again to search the remainder of the subject string. The difference between
\fB/g\fP and \fB/G\fP is that the former uses the \fIstartoffset\fP argument to
\fBpcre[16|32]_exec()\fP to start searching at a new point within the entire
string (which is in effect what Perl does), whereas the latter passes over a
shortened substring. This makes a difference to the matching process if the
pattern begins with a lookbehind assertion (including \eb or \eB).
.P
If any call to \fBpcre[16|32]_exec()\fP in a \fB/g\fP or \fB/G\fP sequence matches
an empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and
PCRE_ANCHORED flags set in order to search for another, non-empty, match at the
same point. If this second match fails, the start offset is advanced, and the
normal match is retried. This imitates the way Perl handles such cases when
using the \fB/g\fP modifier or the \fBsplit()\fP function. Normally, the start
offset is advanced by one character, but if the newline convention recognizes
CRLF as a newline, and the current character is CR followed by LF, an advance
of two is used.
.
.
.SS "Other modifiers"
.rs
.sp
There are yet more modifiers for controlling the way \fBpcretest\fP
operates.
.P
The \fB/+\fP modifier requests that as well as outputting the substring that
matched the entire pattern, \fBpcretest\fP should in addition output the
remainder of the subject string. This is useful for tests where the subject
contains multiple copies of the same substring. If the \fB+\fP modifier appears
twice, the same action is taken for captured substrings. In each case the
remainder is output on the following line with a plus character following the
capture number. Note that this modifier must not immediately follow the /S
modifier because /S+ and /S++ have other meanings.
.P
The \fB/=\fP modifier requests that the values of all potential captured
parentheses be output after a match. By default, only those up to the highest
one actually used in the match are output (corresponding to the return code
from \fBpcre[16|32]_exec()\fP). Values in the offsets vector corresponding to
higher numbers should be set to -1, and these are output as "<unset>". This
modifier gives a way of checking that this is happening.
.P
The \fB/B\fP modifier is a debugging feature. It requests that \fBpcretest\fP
output a representation of the compiled code after compilation. Normally this
information contains length and offset values; however, if \fB/Z\fP is also
present, this data is replaced by spaces. This is a special feature for use in
the automatic test scripts; it ensures that the same output is generated for
different internal link sizes.
.P
The \fB/D\fP modifier is a PCRE debugging feature, and is equivalent to
\fB/BI\fP, that is, both the \fB/B\fP and the \fB/I\fP modifiers.
.P
The \fB/F\fP modifier causes \fBpcretest\fP to flip the byte order of the
2-byte and 4-byte fields in the compiled pattern. This facility is for testing
the feature in PCRE that allows it to execute patterns that were compiled on a
host with a different endianness. This feature is not available when the POSIX
interface to PCRE is being used, that is, when the \fB/P\fP pattern modifier is
specified. See also the section about saving and reloading compiled patterns
below.
.P
The \fB/I\fP modifier requests that \fBpcretest\fP output information about the
compiled pattern (whether it is anchored, has a fixed first character, and
so on). It does this by calling \fBpcre[16|32]_fullinfo()\fP after compiling a
pattern. If the pattern is studied, the results of that are also output. In
this output, the word "char" means a non-UTF character, that is, the value of a
single data item (8-bit, 16-bit, or 32-bit, depending on the library that is
being tested).
.P
The \fB/K\fP modifier requests \fBpcretest\fP to show names from backtracking
control verbs that are returned from calls to \fBpcre[16|32]_exec()\fP. It causes
\fBpcretest\fP to create a \fBpcre[16|32]_extra\fP block if one has not already
been created by a call to \fBpcre[16|32]_study()\fP, and to set the
PCRE_EXTRA_MARK flag and the \fBmark\fP field within it, every time that
\fBpcre[16|32]_exec()\fP is called. If the variable that the \fBmark\fP field
points to is non-NULL for a match, non-match, or partial match, \fBpcretest\fP
prints the string to which it points. For a match, this is shown on a line by
itself, tagged with "MK:". For a non-match it is added to the message.
.P
The \fB/L\fP modifier must be followed directly by the name of a locale, for
example,
.sp
  /pattern/Lfr_FR
.sp
For this reason, it must be the last modifier. The given locale is set,
\fBpcre[16|32]_maketables()\fP is called to build a set of character tables for
the locale, and this is then passed to \fBpcre[16|32]_compile()\fP when compiling
the regular expression. Without an \fB/L\fP (or \fB/T\fP) modifier, NULL is
passed as the tables pointer; that is, \fB/L\fP applies only to the expression
on which it appears.
.P
The \fB/M\fP modifier causes the size in bytes of the memory block used to hold
the compiled pattern to be output. This does not include the size of the
\fBpcre[16|32]\fP block; it is just the actual compiled data. If the pattern is
successfully studied with the PCRE_STUDY_JIT_COMPILE option, the size of the
JIT compiled code is also output.
.P
The \fB/Q\fP modifier is used to test the use of \fBpcre_stack_guard\fP. It
must be followed by '0' or '1', specifying the return code to be given from an
external function that is passed to PCRE and used for stack checking during
compilation (see the
.\" HREF
\fBpcreapi\fP
.\"
documentation for details).
.P
The \fB/S\fP modifier causes \fBpcre[16|32]_study()\fP to be called after the
expression has been compiled, and the results used when the expression is
matched. There are a number of qualifying characters that may follow \fB/S\fP.
They may appear in any order.
.P
If \fB/S\fP is followed by an exclamation mark, \fBpcre[16|32]_study()\fP is
called with the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a
\fBpcre_extra\fP block, even when studying discovers no useful information.
.P
If \fB/S\fP is followed by a second S character, it suppresses studying, even
if it was requested externally by the \fB-s\fP command line option. This makes
it possible to specify that certain patterns are always studied, and others are
never studied, independently of \fB-s\fP. This feature is used in the test
files in a few cases where the output is different when the pattern is studied.
.P
If the \fB/S\fP modifier is followed by a + character, the call to
\fBpcre[16|32]_study()\fP is made with all the JIT study options, requesting
just-in-time optimization support if it is available, for both normal and
partial matching. If you want to restrict the JIT compiling modes, you can
follow \fB/S+\fP with a digit in the range 1 to 7:
.sp
  1  normal match only
  2  soft partial match only
  3  normal match and soft partial match
  4  hard partial match only
  6  soft and hard partial match
  7  all three modes (default)
.sp
If \fB/S++\fP is used instead of \fB/S+\fP (with or without a following digit),
the text "(JIT)" is added to the first output line after a match or no match
when JIT-compiled code was actually used.
.P
Note that there is also an independent \fB/+\fP modifier; it must not be given
immediately after \fB/S\fP or \fB/S+\fP because this will be misinterpreted.
.P
If JIT studying is successful, the compiled JIT code will automatically be used
when \fBpcre[16|32]_exec()\fP is run, except when incompatible run-time options
are specified. For more details, see the
.\" HREF
\fBpcrejit\fP
.\"
documentation. See also the \fB\eJ\fP escape sequence below for a way of
setting the size of the JIT stack.
.P
Finally, if \fB/S\fP is followed by a minus character, JIT compilation is
suppressed, even if it was requested externally by the \fB-s\fP command line
option. This makes it possible to specify that JIT is never to be used for
certain patterns.
.P
The \fB/T\fP modifier must be followed by a single digit. It causes a specific
set of built-in character tables to be passed to \fBpcre[16|32]_compile()\fP. It
is used in the standard PCRE tests to check behaviour with different character
tables. The digit specifies the tables as follows:
.sp
  0   the default ASCII tables, as distributed in
        pcre_chartables.c.dist
  1   a set of tables defining ISO 8859 characters
.sp
In table 1, some characters whose codes are greater than 128 are identified as
letters, digits, spaces, etc.
.
.
.SS "Using the POSIX wrapper API"
.rs
.sp
The \fB/P\fP modifier causes \fBpcretest\fP to call PCRE via the POSIX wrapper
API rather than its native API. This supports only the 8-bit library. When
\fB/P\fP is set, the following modifiers set options for the \fBregcomp()\fP
function:
.sp
  /i    REG_ICASE
  /m    REG_NEWLINE
  /N    REG_NOSUB
  /s    REG_DOTALL     )
  /U    REG_UNGREEDY   ) These options are not part of
  /W    REG_UCP        )   the POSIX standard
  /8    REG_UTF8       )
.sp
The \fB/+\fP modifier works as described above. All other modifiers are
ignored.
.
.
.SS "Locking out certain modifiers"
.rs
.sp
PCRE can be compiled with or without support for certain features such as
UTF-8/16/32 or Unicode properties. Accordingly, the standard tests are split up
into a number of different files that are selected for running depending on
which features are available. When updating the tests, it is all too easy to
put a new test into the wrong file by mistake; for example, to put a test that
requires UTF support into a file that is used when it is not available. To help
detect such mistakes as early as possible, there is a facility for locking out
specific modifiers. If an input line for \fBpcretest\fP starts with the string
"< forbid " the following sequence of characters is taken as a list of
forbidden modifiers. For example, in the test files that must not use UTF or
Unicode property support, this line appears:
.sp
  < forbid 8W
.sp
This locks out the /8 and /W modifiers. An immediate error is given if they are
subsequently encountered. If the character string contains < but not >, all the
multi-character modifiers that begin with < are locked out. Otherwise, such
modifiers must be explicitly listed, for example:
.sp
  < forbid <JS><cr>
.sp
There must be a single space between < and "forbid" for this feature to be
recognised. If there is not, the line is interpreted either as a request to
re-load a pre-compiled pattern (see "SAVING AND RELOADING COMPILED PATTERNS"
below) or, if there is a another < character, as a pattern that uses < as its
delimiter.
.
.
.SH "DATA LINES"
.rs
.sp
Before each data line is passed to \fBpcre[16|32]_exec()\fP, leading and trailing
white space is removed, and it is then scanned for \e escapes. Some of these
are pretty esoteric features, intended for checking out some of the more
complicated features of PCRE. If you are just testing "ordinary" regular
expressions, you probably don't need any of these. The following escapes are
recognized:
.sp
  \ea         alarm (BEL, \ex07)
  \eb         backspace (\ex08)
  \ee         escape (\ex27)
  \ef         form feed (\ex0c)
  \en         newline (\ex0a)
.\" JOIN
  \eqdd       set the PCRE_MATCH_LIMIT limit to dd
               (any number of digits)
  \er         carriage return (\ex0d)
  \et         tab (\ex09)
  \ev         vertical tab (\ex0b)
  \ennn       octal character (up to 3 octal digits); always
               a byte unless > 255 in UTF-8 or 16-bit or 32-bit mode
  \eo{dd...}  octal character (any number of octal digits}
  \exhh       hexadecimal byte (up to 2 hex digits)
  \ex{hh...}  hexadecimal character (any number of hex digits)
.\" JOIN
  \eA         pass the PCRE_ANCHORED option to \fBpcre[16|32]_exec()\fP
               or \fBpcre[16|32]_dfa_exec()\fP
.\" JOIN
  \eB         pass the PCRE_NOTBOL option to \fBpcre[16|32]_exec()\fP
               or \fBpcre[16|32]_dfa_exec()\fP
.\" JOIN
  \eCdd       call pcre[16|32]_copy_substring() for substring dd
               after a successful match (number less than 32)
.\" JOIN
  \eCname     call pcre[16|32]_copy_named_substring() for substring
               "name" after a successful match (name terminated
               by next non alphanumeric character)
.\" JOIN
  \eC+        show the current captured substrings at callout
               time
  \eC-        do not supply a callout function
.\" JOIN
  \eC!n       return 1 instead of 0 when callout number n is
               reached
.\" JOIN
  \eC!n!m     return 1 instead of 0 when callout number n is
               reached for the nth time
.\" JOIN
  \eC*n       pass the number n (may be negative) as callout
               data; this is used as the callout return value
  \eD         use the \fBpcre[16|32]_dfa_exec()\fP match function
  \eF         only shortest match for \fBpcre[16|32]_dfa_exec()\fP
.\" JOIN
  \eGdd       call pcre[16|32]_get_substring() for substring dd
               after a successful match (number less than 32)
.\" JOIN
  \eGname     call pcre[16|32]_get_named_substring() for substring
               "name" after a successful match (name terminated
               by next non-alphanumeric character)
.\" JOIN
  \eJdd       set up a JIT stack of dd kilobytes maximum (any
               number of digits)
.\" JOIN
  \eL         call pcre[16|32]_get_substringlist() after a
               successful match
.\" JOIN
  \eM         discover the minimum MATCH_LIMIT and
               MATCH_LIMIT_RECURSION settings
.\" JOIN
  \eN         pass the PCRE_NOTEMPTY option to \fBpcre[16|32]_exec()\fP
               or \fBpcre[16|32]_dfa_exec()\fP; if used twice, pass the
               PCRE_NOTEMPTY_ATSTART option
.\" JOIN
  \eOdd       set the size of the output vector passed to
               \fBpcre[16|32]_exec()\fP to dd (any number of digits)
.\" JOIN
  \eP         pass the PCRE_PARTIAL_SOFT option to \fBpcre[16|32]_exec()\fP
               or \fBpcre[16|32]_dfa_exec()\fP; if used twice, pass the
               PCRE_PARTIAL_HARD option
.\" JOIN
  \eQdd       set the PCRE_MATCH_LIMIT_RECURSION limit to dd
               (any number of digits)
  \eR         pass the PCRE_DFA_RESTART option to \fBpcre[16|32]_dfa_exec()\fP
  \eS         output details of memory get/free calls during matching
.\" JOIN
  \eY         pass the PCRE_NO_START_OPTIMIZE option to \fBpcre[16|32]_exec()\fP
               or \fBpcre[16|32]_dfa_exec()\fP
.\" JOIN
  \eZ         pass the PCRE_NOTEOL option to \fBpcre[16|32]_exec()\fP
               or \fBpcre[16|32]_dfa_exec()\fP
.\" JOIN
  \e?         pass the PCRE_NO_UTF[8|16|32]_CHECK option to
               \fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP
.\" JOIN
  \e>dd       start the match at offset dd (optional "-"; then
               any number of digits); this sets the \fIstartoffset\fP
               argument for \fBpcre[16|32]_exec()\fP or \fBpcre[16|32]_dfa_exec()\fP
.\" JOIN
  \e<cr>      pass the PCRE_NEWLINE_CR option to \fBpcre[16|32]_exec()\fP
               or \fBpcre[16|32]_dfa_exec()\fP
.\" JOIN
  \e<lf>      pass the PCRE_NEWLINE_LF option to \fBpcre[16|32]_exec()\fP
               or \fBpcre[16|32]_dfa_exec()\fP
.\" JOIN
  \e<crlf>    pass the PCRE_NEWLINE_CRLF option to \fBpcre[16|32]_exec()\fP
               or \fBpcre[16|32]_dfa_exec()\fP
.\" JOIN
  \e<anycrlf> pass the PCRE_NEWLINE_ANYCRLF option to \fBpcre[16|32]_exec()\fP
               or \fBpcre[16|32]_dfa_exec()\fP
.\" JOIN
  \e<any>     pass the PCRE_NEWLINE_ANY option to \fBpcre[16|32]_exec()\fP
               or \fBpcre[16|32]_dfa_exec()\fP
.sp
The use of \ex{hh...} is not dependent on the use of the \fB/8\fP modifier on
the pattern. It is recognized always. There may be any number of hexadecimal
digits inside the braces; invalid values provoke error messages.
.P
Note that \exhh specifies one byte rather than one character in UTF-8 mode;
this makes it possible to construct invalid UTF-8 sequences for testing
purposes. On the other hand, \ex{hh} is interpreted as a UTF-8 character in
UTF-8 mode, generating more than one byte if the value is greater than 127.
When testing the 8-bit library not in UTF-8 mode, \ex{hh} generates one byte
for values less than 256, and causes an error for greater values.
.P
In UTF-16 mode, all 4-digit \ex{hhhh} values are accepted. This makes it
possible to construct invalid UTF-16 sequences for testing purposes.
.P
In UTF-32 mode, all 4- to 8-digit \ex{...} values are accepted. This makes it
possible to construct invalid UTF-32 sequences for testing purposes.
.P
The escapes that specify line ending sequences are literal strings, exactly as
shown. No more than one newline setting should be present in any data line.
.P
A backslash followed by anything else just escapes the anything else. If
the very last character is a backslash, it is ignored. This gives a way of
passing an empty line as data, since a real empty line terminates the data
input.
.P
The \fB\eJ\fP escape provides a way of setting the maximum stack size that is
used by the just-in-time optimization code. It is ignored if JIT optimization
is not being used. Providing a stack that is larger than the default 32K is
necessary only for very complicated patterns.
.P
If \eM is present, \fBpcretest\fP calls \fBpcre[16|32]_exec()\fP several times,
with different values in the \fImatch_limit\fP and \fImatch_limit_recursion\fP
fields of the \fBpcre[16|32]_extra\fP data structure, until it finds the minimum
numbers for each parameter that allow \fBpcre[16|32]_exec()\fP to complete without
error. Because this is testing a specific feature of the normal interpretive
\fBpcre[16|32]_exec()\fP execution, the use of any JIT optimization that might
have been set up by the \fB/S+\fP qualifier of \fB-s+\fP option is disabled.
.P
The \fImatch_limit\fP number is a measure of the amount of backtracking
that takes place, and checking it out can be instructive. For most simple
matches, the number is quite small, but for patterns with very large numbers of
matching possibilities, it can become large very quickly with increasing length
of subject string. The \fImatch_limit_recursion\fP number is a measure of how
much stack (or, if PCRE is compiled with NO_RECURSE, how much heap) memory is
needed to complete the match attempt.
.P
When \eO is used, the value specified may be higher or lower than the size set
by the \fB-O\fP command line option (or defaulted to 45); \eO applies only to
the call of \fBpcre[16|32]_exec()\fP for the line in which it appears.
.P
If the \fB/P\fP modifier was present on the pattern, causing the POSIX wrapper
API to be used, the only option-setting sequences that have any effect are \eB,
\eN, and \eZ, causing REG_NOTBOL, REG_NOTEMPTY, and REG_NOTEOL, respectively,
to be passed to \fBregexec()\fP.
.
.
.SH "THE ALTERNATIVE MATCHING FUNCTION"
.rs
.sp
By default, \fBpcretest\fP uses the standard PCRE matching function,
\fBpcre[16|32]_exec()\fP to match each data line. PCRE also supports an
alternative matching function, \fBpcre[16|32]_dfa_test()\fP, which operates in a
different way, and has some restrictions. The differences between the two
functions are described in the
.\" HREF
\fBpcrematching\fP
.\"
documentation.
.P
If a data line contains the \eD escape sequence, or if the command line
contains the \fB-dfa\fP option, the alternative matching function is used.
This function finds all possible matches at a given point. If, however, the \eF
escape sequence is present in the data line, it stops after the first match is
found. This is always the shortest possible match.
.
.
.SH "DEFAULT OUTPUT FROM PCRETEST"
.rs
.sp
This section describes the output when the normal matching function,
\fBpcre[16|32]_exec()\fP, is being used.
.P
When a match succeeds, \fBpcretest\fP outputs the list of captured substrings
that \fBpcre[16|32]_exec()\fP returns, starting with number 0 for the string that
matched the whole pattern. Otherwise, it outputs "No match" when the return is
PCRE_ERROR_NOMATCH, and "Partial match:" followed by the partially matching
substring when \fBpcre[16|32]_exec()\fP returns PCRE_ERROR_PARTIAL. (Note that
this is the entire substring that was inspected during the partial match; it
may include characters before the actual match start if a lookbehind assertion,
\eK, \eb, or \eB was involved.) For any other return, \fBpcretest\fP outputs
the PCRE negative error number and a short descriptive phrase. If the error is
a failed UTF string check, the offset of the start of the failing character and
the reason code are also output, provided that the size of the output vector is
at least two. Here is an example of an interactive \fBpcretest\fP run.
.sp
  $ pcretest
  PCRE version 8.13 2011-04-30
.sp
    re> /^abc(\ed+)/
  data> abc123
   0: abc123
   1: 123
  data> xyz
  No match
.sp
Unset capturing substrings that are not followed by one that is set are not
returned by \fBpcre[16|32]_exec()\fP, and are not shown by \fBpcretest\fP. In the
following example, there are two capturing substrings, but when the first data
line is matched, the second, unset substring is not shown. An "internal" unset
substring is shown as "<unset>", as for the second data line.
.sp
    re> /(a)|(b)/
  data> a
   0: a
   1: a
  data> b
   0: b
   1: <unset>
   2: b
.sp
If the strings contain any non-printing characters, they are output as \exhh
escapes if the value is less than 256 and UTF mode is not set. Otherwise they
are output as \ex{hh...} escapes. See below for the definition of non-printing
characters. If the pattern has the \fB/+\fP modifier, the output for substring
0 is followed by the the rest of the subject string, identified by "0+" like
this:
.sp
    re> /cat/+
  data> cataract
   0: cat
   0+ aract
.sp
If the pattern has the \fB/g\fP or \fB/G\fP modifier, the results of successive
matching attempts are output in sequence, like this:
.sp
    re> /\eBi(\ew\ew)/g
  data> Mississippi
   0: iss
   1: ss
   0: iss
   1: ss
   0: ipp
   1: pp
.sp
"No match" is output only if the first match attempt fails. Here is an example
of a failure message (the offset 4 that is specified by \e>4 is past the end of
the subject string):
.sp
    re> /xyz/
  data> xyz\e>4
  Error -24 (bad offset value)
.P
If any of the sequences \fB\eC\fP, \fB\eG\fP, or \fB\eL\fP are present in a
data line that is successfully matched, the substrings extracted by the
convenience functions are output with C, G, or L after the string number
instead of a colon. This is in addition to the normal full list. The string
length (that is, the return from the extraction function) is given in
parentheses after each string for \fB\eC\fP and \fB\eG\fP.
.P
Note that whereas patterns can be continued over several lines (a plain ">"
prompt is used for continuations), data lines may not. However newlines can be
included in data by means of the \en escape (or \er, \er\en, etc., depending on
the newline sequence setting).
.
.
.
.SH "OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION"
.rs
.sp
When the alternative matching function, \fBpcre[16|32]_dfa_exec()\fP, is used (by
means of the \eD escape sequence or the \fB-dfa\fP command line option), the
output consists of a list of all the matches that start at the first point in
the subject where there is at least one match. For example:
.sp
    re> /(tang|tangerine|tan)/
  data> yellow tangerine\eD
   0: tangerine
   1: tang
   2: tan
.sp
(Using the normal matching function on this data finds only "tang".) The
longest matching string is always given first (and numbered zero). After a
PCRE_ERROR_PARTIAL return, the output is "Partial match:", followed by the
partially matching substring. (Note that this is the entire substring that was
inspected during the partial match; it may include characters before the actual
match start if a lookbehind assertion, \eK, \eb, or \eB was involved.)
.P
If \fB/g\fP is present on the pattern, the search for further matches resumes
at the end of the longest match. For example:
.sp
    re> /(tang|tangerine|tan)/g
  data> yellow tangerine and tangy sultana\eD
   0: tangerine
   1: tang
   2: tan
   0: tang
   1: tan
   0: tan
.sp
Since the matching function does not support substring capture, the escape
sequences that are concerned with captured substrings are not relevant.
.
.
.SH "RESTARTING AFTER A PARTIAL MATCH"
.rs
.sp
When the alternative matching function has given the PCRE_ERROR_PARTIAL return,
indicating that the subject partially matched the pattern, you can restart the
match with additional subject data by means of the \eR escape sequence. For
example:
.sp
    re> /^\ed?\ed(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\ed\ed$/
  data> 23ja\eP\eD
  Partial match: 23ja
  data> n05\eR\eD
   0: n05
.sp
For further information about partial matching, see the
.\" HREF
\fBpcrepartial\fP
.\"
documentation.
.
.
.SH CALLOUTS
.rs
.sp
If the pattern contains any callout requests, \fBpcretest\fP's callout function
is called during matching. This works with both matching functions. By default,
the called function displays the callout number, the start and current
positions in the text at the callout time, and the next pattern item to be
tested. For example:
.sp
  --->pqrabcdef
    0    ^  ^     \ed
.sp
This output indicates that callout number 0 occurred for a match attempt
starting at the fourth character of the subject string, when the pointer was at
the seventh character of the data, and when the next pattern item was \ed. Just
one circumflex is output if the start and current positions are the same.
.P
Callouts numbered 255 are assumed to be automatic callouts, inserted as a
result of the \fB/C\fP pattern modifier. In this case, instead of showing the
callout number, the offset in the pattern, preceded by a plus, is output. For
example:
.sp
    re> /\ed?[A-E]\e*/C
  data> E*
  --->E*
   +0 ^      \ed?
   +3 ^      [A-E]
   +8 ^^     \e*
  +10 ^ ^
   0: E*
.sp
If a pattern contains (*MARK) items, an additional line is output whenever
a change of latest mark is passed to the callout function. For example:
.sp
    re> /a(*MARK:X)bc/C
  data> abc
  --->abc
   +0 ^       a
   +1 ^^      (*MARK:X)
  +10 ^^      b
  Latest Mark: X
  +11 ^ ^     c
  +12 ^  ^
   0: abc
.sp
The mark changes between matching "a" and "b", but stays the same for the rest
of the match, so nothing more is output. If, as a result of backtracking, the
mark reverts to being unset, the text "<unset>" is output.
.P
The callout function in \fBpcretest\fP returns zero (carry on matching) by
default, but you can use a \eC item in a data line (as described above) to
change this and other parameters of the callout.
.P
Inserting callouts can be helpful when using \fBpcretest\fP to check
complicated regular expressions. For further information about callouts, see
the
.\" HREF
\fBpcrecallout\fP
.\"
documentation.
.
.
.
.SH "NON-PRINTING CHARACTERS"
.rs
.sp
When \fBpcretest\fP is outputting text in the compiled version of a pattern,
bytes other than 32-126 are always treated as non-printing characters are are
therefore shown as hex escapes.
.P
When \fBpcretest\fP is outputting text that is a matched part of a subject
string, it behaves in the same way, unless a different locale has been set for
the pattern (using the \fB/L\fP modifier). In this case, the \fBisprint()\fP
function to distinguish printing and non-printing characters.
.
.
.
.SH "SAVING AND RELOADING COMPILED PATTERNS"
.rs
.sp
The facilities described in this section are not available when the POSIX
interface to PCRE is being used, that is, when the \fB/P\fP pattern modifier is
specified.
.P
When the POSIX interface is not in use, you can cause \fBpcretest\fP to write a
compiled pattern to a file, by following the modifiers with > and a file name.
For example:
.sp
  /pattern/im >/some/file
.sp
See the
.\" HREF
\fBpcreprecompile\fP
.\"
documentation for a discussion about saving and re-using compiled patterns.
Note that if the pattern was successfully studied with JIT optimization, the
JIT data cannot be saved.
.P
The data that is written is binary. The first eight bytes are the length of the
compiled pattern data followed by the length of the optional study data, each
written as four bytes in big-endian order (most significant byte first). If
there is no study data (either the pattern was not studied, or studying did not
return any data), the second length is zero. The lengths are followed by an
exact copy of the compiled pattern. If there is additional study data, this
(excluding any JIT data) follows immediately after the compiled pattern. After
writing the file, \fBpcretest\fP expects to read a new pattern.
.P
A saved pattern can be reloaded into \fBpcretest\fP by specifying < and a file
name instead of a pattern. There must be no space between < and the file name,
which must not contain a < character, as otherwise \fBpcretest\fP will
interpret the line as a pattern delimited by < characters. For example:
.sp
   re> </some/file
  Compiled pattern loaded from /some/file
  No study data
.sp
If the pattern was previously studied with the JIT optimization, the JIT
information cannot be saved and restored, and so is lost. When the pattern has
been loaded, \fBpcretest\fP proceeds to read data lines in the usual way.
.P
You can copy a file written by \fBpcretest\fP to a different host and reload it
there, even if the new host has opposite endianness to the one on which the
pattern was compiled. For example, you can compile on an i86 machine and run on
a SPARC machine. When a pattern is reloaded on a host with different
endianness, the confirmation message is changed to:
.sp
  Compiled pattern (byte-inverted) loaded from /some/file
.sp
The test suite contains some saved pre-compiled patterns with different
endianness. These are reloaded using "<!" instead of just "<". This suppresses
the "(byte-inverted)" text so that the output is the same on all hosts. It also
forces debugging output once the pattern has been reloaded.
.P
File names for saving and reloading can be absolute or relative, but note that
the shell facility of expanding a file name that starts with a tilde (~) is not
available.
.P
The ability to save and reload files in \fBpcretest\fP is intended for testing
and experimentation. It is not intended for production use because only a
single pattern can be written to a file. Furthermore, there is no facility for
supplying custom character tables for use with a reloaded pattern. If the
original pattern was compiled with custom tables, an attempt to match a subject
string using a reloaded pattern is likely to cause \fBpcretest\fP to crash.
Finally, if you attempt to load a file that is not in the correct format, the
result is undefined.
.
.
.SH "SEE ALSO"
.rs
.sp
\fBpcre\fP(3), \fBpcre16\fP(3), \fBpcre32\fP(3), \fBpcreapi\fP(3),
\fBpcrecallout\fP(3),
\fBpcrejit\fP, \fBpcrematching\fP(3), \fBpcrepartial\fP(d),
\fBpcrepattern\fP(3), \fBpcreprecompile\fP(3).
.
.
.SH AUTHOR
.rs
.sp
.nf
Philip Hazel
University Computing Service
Cambridge CB2 3QH, England.
.fi
.
.
.SH REVISION
.rs
.sp
.nf
Last updated: 23 February 2017
Copyright (c) 1997-2017 University of Cambridge.
.fi
PK��$[1ⱐ�
�
man/man1/pcre-config.1nu�[���.TH PCRE-CONFIG 1 "01 January 2012" "PCRE 8.30"
.SH NAME
pcre-config - program to return PCRE configuration
.SH SYNOPSIS
.rs
.sp
.nf
.B pcre-config  [--prefix] [--exec-prefix] [--version] [--libs]
.B "            [--libs16] [--libs32] [--libs-cpp] [--libs-posix]"
.B "            [--cflags] [--cflags-posix]"
.fi
.
.
.SH DESCRIPTION
.rs
.sp
\fBpcre-config\fP returns the configuration of the installed PCRE
libraries and the options required to compile a program to use them. Some of
the options apply only to the 8-bit, or 16-bit, or 32-bit libraries,
respectively, and are
not available if only one of those libraries has been built. If an unavailable
option is encountered, the "usage" information is output.
.
.
.SH OPTIONS
.rs
.TP 10
\fB--prefix\fP
Writes the directory prefix used in the PCRE installation for architecture
independent files (\fI/usr\fP on many systems, \fI/usr/local\fP on some
systems) to the standard output.
.TP 10
\fB--exec-prefix\fP
Writes the directory prefix used in the PCRE installation for architecture
dependent files (normally the same as \fB--prefix\fP) to the standard output.
.TP 10
\fB--version\fP
Writes the version number of the installed PCRE libraries to the standard
output.
.TP 10
\fB--libs\fP
Writes to the standard output the command line options required to link
with the 8-bit PCRE library (\fB-lpcre\fP on many systems).
.TP 10
\fB--libs16\fP
Writes to the standard output the command line options required to link
with the 16-bit PCRE library (\fB-lpcre16\fP on many systems).
.TP 10
\fB--libs32\fP
Writes to the standard output the command line options required to link
with the 32-bit PCRE library (\fB-lpcre32\fP on many systems).
.TP 10
\fB--libs-cpp\fP
Writes to the standard output the command line options required to link with
PCRE's C++ wrapper library (\fB-lpcrecpp\fP \fB-lpcre\fP on many
systems).
.TP 10
\fB--libs-posix\fP
Writes to the standard output the command line options required to link with
PCRE's POSIX API wrapper library (\fB-lpcreposix\fP \fB-lpcre\fP on many
systems).
.TP 10
\fB--cflags\fP
Writes to the standard output the command line options required to compile
files that use PCRE (this may include some \fB-I\fP options, but is blank on
many systems).
.TP 10
\fB--cflags-posix\fP
Writes to the standard output the command line options required to compile
files that use PCRE's POSIX API wrapper library (this may include some \fB-I\fP
options, but is blank on many systems).
.
.
.SH "SEE ALSO"
.rs
.sp
\fBpcre(3)\fP
.
.
.SH AUTHOR
.rs
.sp
This manual page was originally written by Mark Baker for the Debian GNU/Linux
system. It has been subsequently revised as a generic PCRE man page.
.
.
.SH REVISION
.rs
.sp
.nf
Last updated: 24 June 2012
.fi
PK��$[fu�9����doc/alt-pcre802/ChangeLognu�[���ChangeLog for PCRE
------------------

Version 8.02 19-Mar-2010
------------------------

1.  The Unicode data tables have been updated to Unicode 5.2.0.

2.  Added the option --libs-cpp to pcre-config, but only when C++ support is
    configured.

3.  Updated the licensing terms in the pcregexp.pas file, as agreed with the
    original author of that file, following a query about its status.

4.  On systems that do not have stdint.h (e.g. Solaris), check for and include
    inttypes.h instead. This fixes a bug that was introduced by change 8.01/8.

5.  A pattern such as (?&t)*+(?(DEFINE)(?<t>.)) which has a possessive
    quantifier applied to a forward-referencing subroutine call, could compile
    incorrect code or give the error "internal error: previously-checked
    referenced subpattern not found".

6.  Both MS Visual Studio and Symbian OS have problems with initializing
    variables to point to external functions. For these systems, therefore,
    pcre_malloc etc. are now initialized to local functions that call the
    relevant global functions.

7.  There were two entries missing in the vectors called coptable and poptable
    in pcre_dfa_exec.c. This could lead to memory accesses outsize the vectors.
    I've fixed the data, and added a kludgy way of testing at compile time that
    the lengths are correct (equal to the number of opcodes).

8.  Following on from 7, I added a similar kludge to check the length of the
    eint vector in pcreposix.c.

9.  Error texts for pcre_compile() are held as one long string to avoid too
    much relocation at load time. To find a text, the string is searched,
    counting zeros. There was no check for running off the end of the string,
    which could happen if a new error number was added without updating the
    string.

10. \K gave a compile-time error if it appeared in a lookbehind assersion.

11. \K was not working if it appeared in an atomic group or in a group that
    was called as a "subroutine", or in an assertion. Perl 5.11 documents that
    \K is "not well defined" if used in an assertion. PCRE now accepts it if
    the assertion is positive, but not if it is negative.

12. Change 11 fortuitously reduced the size of the stack frame used in the
    "match()" function of pcre_exec.c by one pointer. Forthcoming
    implementation of support for (*MARK) will need an extra pointer on the
    stack; I have reserved it now, so that the stack frame size does not
    decrease.

13. A pattern such as (?P<L1>(?P<L2>0)|(?P>L2)(?P>L1)) in which the only other
    item in branch that calls a recursion is a subroutine call - as in the
    second branch in the above example - was incorrectly given the compile-
    time error "recursive call could loop indefinitely" because pcre_compile()
    was not correctly checking the subroutine for matching a non-empty string.

14. The checks for overrunning compiling workspace could trigger after an
    overrun had occurred. This is a "should never occur" error, but it can be
    triggered by pathological patterns such as hundreds of nested parentheses.
    The checks now trigger 100 bytes before the end of the workspace.

15. Fix typo in configure.ac: "srtoq" should be "strtoq".


Version 8.01 19-Jan-2010
------------------------

1.  If a pattern contained a conditional subpattern with only one branch (in
    particular, this includes all (*DEFINE) patterns), a call to pcre_study()
    computed the wrong minimum data length (which is of course zero for such
    subpatterns). This could cause incorrect "no match" results.

2.  For patterns such as (?i)a(?-i)b|c where an option setting at the start of
    the pattern is reset in the first branch, pcre_compile() failed with
    "internal error: code overflow at offset...". This happened only when
    the reset was to the original external option setting. (An optimization
    abstracts leading options settings into an external setting, which was the
    cause of this.)

3.  A pattern such as ^(?!a(*SKIP)b) where a negative assertion contained one
    of the verbs SKIP, PRUNE, or COMMIT, did not work correctly. When the
    assertion pattern did not match (meaning that the assertion was true), it
    was incorrectly treated as false if the SKIP had been reached during the
    matching. This also applied to assertions used as conditions.

4.  If an item that is not supported by pcre_dfa_exec() was encountered in an
    assertion subpattern, including such a pattern used as a condition,
    unpredictable results occurred, instead of the error return
    PCRE_ERROR_DFA_UITEM.

5.  The C++ GlobalReplace function was not working like Perl for the special
    situation when an empty string is matched. It now does the fancy magic
    stuff that is necessary.

6.  In pcre_internal.h, obsolete includes to setjmp.h and stdarg.h have been
    removed. (These were left over from very, very early versions of PCRE.)

7.  Some cosmetic changes to the code to make life easier when compiling it
    as part of something else:

    (a) Change DEBUG to PCRE_DEBUG.

    (b) In pcre_compile(), rename the member of the "branch_chain" structure
        called "current" as "current_branch", to prevent a collision with the
        Linux macro when compiled as a kernel module.

    (c) In pcre_study(), rename the function set_bit() as set_table_bit(), to
        prevent a collision with the Linux macro when compiled as a kernel
        module.

8.  In pcre_compile() there are some checks for integer overflows that used to
    cast potentially large values to (double). This has been changed to that
    when building, a check for int64_t is made, and if it is found, it is used
    instead, thus avoiding the use of floating point arithmetic. (There is no
    other use of FP in PCRE.) If int64_t is not found, the fallback is to
    double.

9.  Added two casts to avoid signed/unsigned warnings from VS Studio Express
    2005 (difference between two addresses compared to an unsigned value).

10. Change the standard AC_CHECK_LIB test for libbz2 in configure.ac to a
    custom one, because of the following reported problem in Windows:

      - libbz2 uses the Pascal calling convention (WINAPI) for the functions
          under Win32.
      - The standard autoconf AC_CHECK_LIB fails to include "bzlib.h",
          therefore missing the function definition.
      - The compiler thus generates a "C" signature for the test function.
      - The linker fails to find the "C" function.
      - PCRE fails to configure if asked to do so against libbz2.

11. When running libtoolize from libtool-2.2.6b as part of autogen.sh, these
    messages were output:

      Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and
      rerunning libtoolize, to keep the correct libtool macros in-tree.
      Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am.

    I have done both of these things.

12. Although pcre_dfa_exec() does not use nearly as much stack as pcre_exec()
    most of the time, it *can* run out if it is given a pattern that contains a
    runaway infinite recursion. I updated the discussion in the pcrestack man
    page.

13. Now that we have gone to the x.xx style of version numbers, the minor
    version may start with zero. Using 08 or 09 is a bad idea because users
    might check the value of PCRE_MINOR in their code, and 08 or 09 may be
    interpreted as invalid octal numbers. I've updated the previous comment in
    configure.ac, and also added a check that gives an error if 08 or 09 are
    used.

14. Change 8.00/11 was not quite complete: code had been accidentally omitted,
    causing partial matching to fail when the end of the subject matched \W
    in a UTF-8 pattern where \W was quantified with a minimum of 3.

15. There were some discrepancies between the declarations in pcre_internal.h
    of _pcre_is_newline(), _pcre_was_newline(), and _pcre_valid_utf8() and
    their definitions. The declarations used "const uschar *" and the
    definitions used USPTR. Even though USPTR is normally defined as "const
    unsigned char *" (and uschar is typedeffed as "unsigned char"), it was
    reported that: "This difference in casting confuses some C++ compilers, for
    example, SunCC recognizes above declarations as different functions and
    generates broken code for hbpcre." I have changed the declarations to use
    USPTR.

16. GNU libtool is named differently on some systems. The autogen.sh script now
    tries several variants such as glibtoolize (MacOSX) and libtoolize1x
    (FreeBSD).

17. Applied Craig's patch that fixes an HP aCC compile error in pcre 8.00
    (strtoXX undefined when compiling pcrecpp.cc). The patch contains this
    comment: "Figure out how to create a longlong from a string: strtoll and
    equivalent. It's not enough to call AC_CHECK_FUNCS: hpux has a strtoll, for
    instance, but it only takes 2 args instead of 3!"

18. A subtle bug concerned with back references has been fixed by a change of
    specification, with a corresponding code fix. A pattern such as
    ^(xa|=?\1a)+$ which contains a back reference inside the group to which it
    refers, was giving matches when it shouldn't. For example, xa=xaaa would
    match that pattern. Interestingly, Perl (at least up to 5.11.3) has the
    same bug. Such groups have to be quantified to be useful, or contained
    inside another quantified group. (If there's no repetition, the reference
    can never match.) The problem arises because, having left the group and
    moved on to the rest of the pattern, a later failure that backtracks into
    the group uses the captured value from the final iteration of the group
    rather than the correct earlier one. I have fixed this in PCRE by forcing
    any group that contains a reference to itself to be an atomic group; that
    is, there cannot be any backtracking into it once it has completed. This is
    similar to recursive and subroutine calls.


Version 8.00 19-Oct-09
----------------------

1.  The table for translating pcre_compile() error codes into POSIX error codes
    was out-of-date, and there was no check on the pcre_compile() error code
    being within the table. This could lead to an OK return being given in
    error.

2.  Changed the call to open a subject file in pcregrep from fopen(pathname,
    "r") to fopen(pathname, "rb"), which fixed a problem with some of the tests
    in a Windows environment.

3.  The pcregrep --count option prints the count for each file even when it is
    zero, as does GNU grep. However, pcregrep was also printing all files when
    --files-with-matches was added. Now, when both options are given, it prints
    counts only for those files that have at least one match. (GNU grep just
    prints the file name in this circumstance, but including the count seems
    more useful - otherwise, why use --count?) Also ensured that the
    combination -clh just lists non-zero counts, with no names.

4.  The long form of the pcregrep -F option was incorrectly implemented as
    --fixed_strings instead of --fixed-strings. This is an incompatible change,
    but it seems right to fix it, and I didn't think it was worth preserving
    the old behaviour.

5.  The command line items --regex=pattern and --regexp=pattern were not
    recognized by pcregrep, which required --regex pattern or --regexp pattern
    (with a space rather than an '='). The man page documented the '=' forms,
    which are compatible with GNU grep; these now work.

6.  No libpcreposix.pc file was created for pkg-config; there was just
    libpcre.pc and libpcrecpp.pc. The omission has been rectified.

7.  Added #ifndef SUPPORT_UCP into the pcre_ucd.c module, to reduce its size
    when UCP support is not needed, by modifying the Python script that
    generates it from Unicode data files. This should not matter if the module
    is correctly used as a library, but I received one complaint about 50K of
    unwanted data. My guess is that the person linked everything into his
    program rather than using a library. Anyway, it does no harm.

8.  A pattern such as /\x{123}{2,2}+/8 was incorrectly compiled; the trigger
    was a minimum greater than 1 for a wide character in a possessive
    repetition. The same bug could also affect patterns like /(\x{ff}{0,2})*/8
    which had an unlimited repeat of a nested, fixed maximum repeat of a wide
    character. Chaos in the form of incorrect output or a compiling loop could
    result.

9.  The restrictions on what a pattern can contain when partial matching is
    requested for pcre_exec() have been removed. All patterns can now be
    partially matched by this function. In addition, if there are at least two
    slots in the offset vector, the offset of the earliest inspected character
    for the match and the offset of the end of the subject are set in them when
    PCRE_ERROR_PARTIAL is returned.

10. Partial matching has been split into two forms: PCRE_PARTIAL_SOFT, which is
    synonymous with PCRE_PARTIAL, for backwards compatibility, and
    PCRE_PARTIAL_HARD, which causes a partial match to supersede a full match,
    and may be more useful for multi-segment matching.

11. Partial matching with pcre_exec() is now more intuitive. A partial match
    used to be given if ever the end of the subject was reached; now it is
    given only if matching could not proceed because another character was
    needed. This makes a difference in some odd cases such as Z(*FAIL) with the
    string "Z", which now yields "no match" instead of "partial match". In the
    case of pcre_dfa_exec(), "no match" is given if every matching path for the
    final character ended with (*FAIL).

12. Restarting a match using pcre_dfa_exec() after a partial match did not work
    if the pattern had a "must contain" character that was already found in the
    earlier partial match, unless partial matching was again requested. For
    example, with the pattern /dog.(body)?/, the "must contain" character is
    "g". If the first part-match was for the string "dog", restarting with
    "sbody" failed. This bug has been fixed.

13. The string returned by pcre_dfa_exec() after a partial match has been
    changed so that it starts at the first inspected character rather than the
    first character of the match. This makes a difference only if the pattern
    starts with a lookbehind assertion or \b or \B (\K is not supported by
    pcre_dfa_exec()). It's an incompatible change, but it makes the two
    matching functions compatible, and I think it's the right thing to do.

14. Added a pcredemo man page, created automatically from the pcredemo.c file,
    so that the demonstration program is easily available in environments where
    PCRE has not been installed from source.

15. Arranged to add -DPCRE_STATIC to cflags in libpcre.pc, libpcreposix.cp,
    libpcrecpp.pc and pcre-config when PCRE is not compiled as a shared
    library.

16. Added REG_UNGREEDY to the pcreposix interface, at the request of a user.
    It maps to PCRE_UNGREEDY. It is not, of course, POSIX-compatible, but it
    is not the first non-POSIX option to be added. Clearly some people find
    these options useful.

17. If a caller to the POSIX matching function regexec() passes a non-zero
    value for nmatch with a NULL value for pmatch, the value of
    nmatch is forced to zero.

18. RunGrepTest did not have a test for the availability of the -u option of
    the diff command, as RunTest does. It now checks in the same way as
    RunTest, and also checks for the -b option.

19. If an odd number of negated classes containing just a single character
    interposed, within parentheses, between a forward reference to a named
    subpattern and the definition of the subpattern, compilation crashed with
    an internal error, complaining that it could not find the referenced
    subpattern. An example of a crashing pattern is /(?&A)(([^m])(?<A>))/.
    [The bug was that it was starting one character too far in when skipping
    over the character class, thus treating the ] as data rather than
    terminating the class. This meant it could skip too much.]

20. Added PCRE_NOTEMPTY_ATSTART in order to be able to correctly implement the
    /g option in pcretest when the pattern contains \K, which makes it possible
    to have an empty string match not at the start, even when the pattern is
    anchored. Updated pcretest and pcredemo to use this option.

21. If the maximum number of capturing subpatterns in a recursion was greater
    than the maximum at the outer level, the higher number was returned, but
    with unset values at the outer level. The correct (outer level) value is
    now given.

22. If (*ACCEPT) appeared inside capturing parentheses, previous releases of
    PCRE did not set those parentheses (unlike Perl). I have now found a way to
    make it do so. The string so far is captured, making this feature
    compatible with Perl.

23. The tests have been re-organized, adding tests 11 and 12, to make it
    possible to check the Perl 5.10 features against Perl 5.10.

24. Perl 5.10 allows subroutine calls in lookbehinds, as long as the subroutine
    pattern matches a fixed length string. PCRE did not allow this; now it
    does. Neither allows recursion.

25. I finally figured out how to implement a request to provide the minimum
    length of subject string that was needed in order to match a given pattern.
    (It was back references and recursion that I had previously got hung up
    on.) This code has now been added to pcre_study(); it finds a lower bound
    to the length of subject needed. It is not necessarily the greatest lower
    bound, but using it to avoid searching strings that are too short does give
    some useful speed-ups. The value is available to calling programs via
    pcre_fullinfo().

26. While implementing 25, I discovered to my embarrassment that pcretest had
    not been passing the result of pcre_study() to pcre_dfa_exec(), so the
    study optimizations had never been tested with that matching function.
    Oops. What is worse, even when it was passed study data, there was a bug in
    pcre_dfa_exec() that meant it never actually used it. Double oops. There
    were also very few tests of studied patterns with pcre_dfa_exec().

27. If (?| is used to create subpatterns with duplicate numbers, they are now
    allowed to have the same name, even if PCRE_DUPNAMES is not set. However,
    on the other side of the coin, they are no longer allowed to have different
    names, because these cannot be distinguished in PCRE, and this has caused
    confusion. (This is a difference from Perl.)

28. When duplicate subpattern names are present (necessarily with different
    numbers, as required by 27 above), and a test is made by name in a
    conditional pattern, either for a subpattern having been matched, or for
    recursion in such a pattern, all the associated numbered subpatterns are
    tested, and the overall condition is true if the condition is true for any
    one of them. This is the way Perl works, and is also more like the way
    testing by number works.


Version 7.9 11-Apr-09
---------------------

1.  When building with support for bzlib/zlib (pcregrep) and/or readline
    (pcretest), all targets were linked against these libraries. This included
    libpcre, libpcreposix, and libpcrecpp, even though they do not use these
    libraries. This caused unwanted dependencies to be created. This problem
    has been fixed, and now only pcregrep is linked with bzlib/zlib and only
    pcretest is linked with readline.

2.  The "typedef int BOOL" in pcre_internal.h that was included inside the
    "#ifndef FALSE" condition by an earlier change (probably 7.8/18) has been
    moved outside it again, because FALSE and TRUE are already defined in AIX,
    but BOOL is not.

3.  The pcre_config() function was treating the PCRE_MATCH_LIMIT and
    PCRE_MATCH_LIMIT_RECURSION values as ints, when they should be long ints.

4.  The pcregrep documentation said spaces were inserted as well as colons (or
    hyphens) following file names and line numbers when outputting matching
    lines. This is not true; no spaces are inserted. I have also clarified the
    wording for the --colour (or --color) option.

5.  In pcregrep, when --colour was used with -o, the list of matching strings
    was not coloured; this is different to GNU grep, so I have changed it to be
    the same.

6.  When --colo(u)r was used in pcregrep, only the first matching substring in
    each matching line was coloured. Now it goes on to look for further matches
    of any of the test patterns, which is the same behaviour as GNU grep.

7.  A pattern that could match an empty string could cause pcregrep to loop; it
    doesn't make sense to accept an empty string match in pcregrep, so I have
    locked it out (using PCRE's PCRE_NOTEMPTY option). By experiment, this
    seems to be how GNU grep behaves.

8.  The pattern (?(?=.*b)b|^) was incorrectly compiled as "match must be at
    start or after a newline", because the conditional assertion was not being
    correctly handled. The rule now is that both the assertion and what follows
    in the first alternative must satisfy the test.

9.  If auto-callout was enabled in a pattern with a conditional group whose
    condition was an assertion, PCRE could crash during matching, both with
    pcre_exec() and pcre_dfa_exec().

10. The PCRE_DOLLAR_ENDONLY option was not working when pcre_dfa_exec() was
    used for matching.

11. Unicode property support in character classes was not working for
    characters (bytes) greater than 127 when not in UTF-8 mode.

12. Added the -M command line option to pcretest.

14. Added the non-standard REG_NOTEMPTY option to the POSIX interface.

15. Added the PCRE_NO_START_OPTIMIZE match-time option.

16. Added comments and documentation about mis-use of no_arg in the C++
    wrapper.

17. Implemented support for UTF-8 encoding in EBCDIC environments, a patch
    from Martin Jerabek that uses macro names for all relevant character and
    string constants.

18. Added to pcre_internal.h two configuration checks: (a) If both EBCDIC and
    SUPPORT_UTF8 are set, give an error; (b) If SUPPORT_UCP is set without
    SUPPORT_UTF8, define SUPPORT_UTF8. The "configure" script handles both of
    these, but not everybody uses configure.

19. A conditional group that had only one branch was not being correctly
    recognized as an item that could match an empty string. This meant that an
    enclosing group might also not be so recognized, causing infinite looping
    (and probably a segfault) for patterns such as ^"((?(?=[a])[^"])|b)*"$
    with the subject "ab", where knowledge that the repeated group can match
    nothing is needed in order to break the loop.

20. If a pattern that was compiled with callouts was matched using pcre_dfa_
    exec(), but without supplying a callout function, matching went wrong.

21. If PCRE_ERROR_MATCHLIMIT occurred during a recursion, there was a memory
    leak if the size of the offset vector was greater than 30. When the vector
    is smaller, the saved offsets during recursion go onto a local stack
    vector, but for larger vectors malloc() is used. It was failing to free
    when the recursion yielded PCRE_ERROR_MATCH_LIMIT (or any other "abnormal"
    error, in fact).

22. There was a missing #ifdef SUPPORT_UTF8 round one of the variables in the
    heapframe that is used only when UTF-8 support is enabled. This caused no
    problem, but was untidy.

23. Steven Van Ingelgem's patch to CMakeLists.txt to change the name
    CMAKE_BINARY_DIR to PROJECT_BINARY_DIR so that it works when PCRE is
    included within another project.

24. Steven Van Ingelgem's patches to add more options to the CMake support,
    slightly modified by me:

      (a) PCRE_BUILD_TESTS can be set OFF not to build the tests, including
          not building pcregrep.

      (b) PCRE_BUILD_PCREGREP can be see OFF not to build pcregrep, but only
          if PCRE_BUILD_TESTS is also set OFF, because the tests use pcregrep.

25. Forward references, both numeric and by name, in patterns that made use of
    duplicate group numbers, could behave incorrectly or give incorrect errors,
    because when scanning forward to find the reference group, PCRE was not
    taking into account the duplicate group numbers. A pattern such as
    ^X(?3)(a)(?|(b)|(q))(Y) is an example.

26. Changed a few more instances of "const unsigned char *" to USPTR, making
    the feature of a custom pointer more persuasive (as requested by a user).

27. Wrapped the definitions of fileno and isatty for Windows, which appear in
    pcretest.c, inside #ifndefs, because it seems they are sometimes already
    pre-defined.

28. Added support for (*UTF8) at the start of a pattern.

29. Arrange for flags added by the "release type" setting in CMake to be shown
    in the configuration summary.


Version 7.8 05-Sep-08
---------------------

1.  Replaced UCP searching code with optimized version as implemented for Ad
    Muncher (http://www.admuncher.com/) by Peter Kankowski. This uses a two-
    stage table and inline lookup instead of a function, giving speed ups of 2
    to 5 times on some simple patterns that I tested. Permission was given to
    distribute the MultiStage2.py script that generates the tables (it's not in
    the tarball, but is in the Subversion repository).

2.  Updated the Unicode datatables to Unicode 5.1.0. This adds yet more
    scripts.

3.  Change 12 for 7.7 introduced a bug in pcre_study() when a pattern contained
    a group with a zero qualifier. The result of the study could be incorrect,
    or the function might crash, depending on the pattern.

4.  Caseless matching was not working for non-ASCII characters in back
    references. For example, /(\x{de})\1/8i was not matching \x{de}\x{fe}.
    It now works when Unicode Property Support is available.

5.  In pcretest, an escape such as \x{de} in the data was always generating
    a UTF-8 string, even in non-UTF-8 mode. Now it generates a single byte in
    non-UTF-8 mode. If the value is greater than 255, it gives a warning about
    truncation.

6.  Minor bugfix in pcrecpp.cc (change "" == ... to NULL == ...).

7.  Added two (int) casts to pcregrep when printing the difference of two
    pointers, in case they are 64-bit values.

8.  Added comments about Mac OS X stack usage to the pcrestack man page and to
    test 2 if it fails.

9.  Added PCRE_CALL_CONVENTION just before the names of all exported functions,
    and a #define of that name to empty if it is not externally set. This is to
    allow users of MSVC to set it if necessary.

10. The PCRE_EXP_DEFN macro which precedes exported functions was missing from
    the convenience functions in the pcre_get.c source file.

11. An option change at the start of a pattern that had top-level alternatives
    could cause overwriting and/or a crash. This command provoked a crash in
    some environments:

      printf "/(?i)[\xc3\xa9\xc3\xbd]|[\xc3\xa9\xc3\xbdA]/8\n" | pcretest

    This potential security problem was recorded as CVE-2008-2371.

12. For a pattern where the match had to start at the beginning or immediately
    after a newline (e.g /.*anything/ without the DOTALL flag), pcre_exec() and
    pcre_dfa_exec() could read past the end of the passed subject if there was
    no match. To help with detecting such bugs (e.g. with valgrind), I modified
    pcretest so that it places the subject at the end of its malloc-ed buffer.

13. The change to pcretest in 12 above threw up a couple more cases when pcre_
    exec() might read past the end of the data buffer in UTF-8 mode.

14. A similar bug to 7.3/2 existed when the PCRE_FIRSTLINE option was set and
    the data contained the byte 0x85 as part of a UTF-8 character within its
    first line. This applied both to normal and DFA matching.

15. Lazy qualifiers were not working in some cases in UTF-8 mode. For example,
    /^[^d]*?$/8 failed to match "abc".

16. Added a missing copyright notice to pcrecpp_internal.h.

17. Make it more clear in the documentation that values returned from
    pcre_exec() in ovector are byte offsets, not character counts.

18. Tidied a few places to stop certain compilers from issuing warnings.

19. Updated the Virtual Pascal + BCC files to compile the latest v7.7, as
    supplied by Stefan Weber. I made a further small update for 7.8 because
    there is a change of source arrangements: the pcre_searchfuncs.c module is
    replaced by pcre_ucd.c.


Version 7.7 07-May-08
---------------------

1.  Applied Craig's patch to sort out a long long problem: "If we can't convert
    a string to a long long, pretend we don't even have a long long." This is
    done by checking for the strtoq, strtoll, and _strtoi64 functions.

2.  Applied Craig's patch to pcrecpp.cc to restore ABI compatibility with
    pre-7.6 versions, which defined a global no_arg variable instead of putting
    it in the RE class. (See also #8 below.)

3.  Remove a line of dead code, identified by coverity and reported by Nuno
    Lopes.

4.  Fixed two related pcregrep bugs involving -r with --include or --exclude:

    (1) The include/exclude patterns were being applied to the whole pathnames
        of files, instead of just to the final components.

    (2) If there was more than one level of directory, the subdirectories were
        skipped unless they satisfied the include/exclude conditions. This is
        inconsistent with GNU grep (and could even be seen as contrary to the
        pcregrep specification - which I improved to make it absolutely clear).
        The action now is always to scan all levels of directory, and just
        apply the include/exclude patterns to regular files.

5.  Added the --include_dir and --exclude_dir patterns to pcregrep, and used
    --exclude_dir in the tests to avoid scanning .svn directories.

6.  Applied Craig's patch to the QuoteMeta function so that it escapes the
    NUL character as backslash + 0 rather than backslash + NUL, because PCRE
    doesn't support NULs in patterns.

7.  Added some missing "const"s to declarations of static tables in
    pcre_compile.c and pcre_dfa_exec.c.

8.  Applied Craig's patch to pcrecpp.cc to fix a problem in OS X that was
    caused by fix #2  above. (Subsequently also a second patch to fix the
    first patch. And a third patch - this was a messy problem.)

9.  Applied Craig's patch to remove the use of push_back().

10. Applied Alan Lehotsky's patch to add REG_STARTEND support to the POSIX
    matching function regexec().

11. Added support for the Oniguruma syntax \g<name>, \g<n>, \g'name', \g'n',
    which, however, unlike Perl's \g{...}, are subroutine calls, not back
    references. PCRE supports relative numbers with this syntax (I don't think
    Oniguruma does).

12. Previously, a group with a zero repeat such as (...){0} was completely
    omitted from the compiled regex. However, this means that if the group
    was called as a subroutine from elsewhere in the pattern, things went wrong
    (an internal error was given). Such groups are now left in the compiled
    pattern, with a new opcode that causes them to be skipped at execution
    time.

13. Added the PCRE_JAVASCRIPT_COMPAT option. This makes the following changes
    to the way PCRE behaves:

    (a) A lone ] character is dis-allowed (Perl treats it as data).

    (b) A back reference to an unmatched subpattern matches an empty string
        (Perl fails the current match path).

    (c) A data ] in a character class must be notated as \] because if the
        first data character in a class is ], it defines an empty class. (In
        Perl it is not possible to have an empty class.) The empty class []
        never matches; it forces failure and is equivalent to (*FAIL) or (?!).
        The negative empty class [^] matches any one character, independently
        of the DOTALL setting.

14. A pattern such as /(?2)[]a()b](abc)/ which had a forward reference to a
    non-existent subpattern following a character class starting with ']' and
    containing () gave an internal compiling error instead of "reference to
    non-existent subpattern". Fortunately, when the pattern did exist, the
    compiled code was correct. (When scanning forwards to check for the
    existencd of the subpattern, it was treating the data ']' as terminating
    the class, so got the count wrong. When actually compiling, the reference
    was subsequently set up correctly.)

15. The "always fail" assertion (?!) is optimzed to (*FAIL) by pcre_compile;
    it was being rejected as not supported by pcre_dfa_exec(), even though
    other assertions are supported. I have made pcre_dfa_exec() support
    (*FAIL).

16. The implementation of 13c above involved the invention of a new opcode,
    OP_ALLANY, which is like OP_ANY but doesn't check the /s flag. Since /s
    cannot be changed at match time, I realized I could make a small
    improvement to matching performance by compiling OP_ALLANY instead of
    OP_ANY for "." when DOTALL was set, and then removing the runtime tests
    on the OP_ANY path.

17. Compiling pcretest on Windows with readline support failed without the
    following two fixes: (1) Make the unistd.h include conditional on
    HAVE_UNISTD_H; (2) #define isatty and fileno as _isatty and _fileno.

18. Changed CMakeLists.txt and cmake/FindReadline.cmake to arrange for the
    ncurses library to be included for pcretest when ReadLine support is
    requested, but also to allow for it to be overridden. This patch came from
    Daniel Bergström.

19. There was a typo in the file ucpinternal.h where f0_rangeflag was defined
    as 0x00f00000 instead of 0x00800000. Luckily, this would not have caused
    any errors with the current Unicode tables. Thanks to Peter Kankowski for
    spotting this.


Version 7.6 28-Jan-08
---------------------

1.  A character class containing a very large number of characters with
    codepoints greater than 255 (in UTF-8 mode, of course) caused a buffer
    overflow.

2.  Patch to cut out the "long long" test in pcrecpp_unittest when
    HAVE_LONG_LONG is not defined.

3.  Applied Christian Ehrlicher's patch to update the CMake build files to
    bring them up to date and include new features. This patch includes:

    - Fixed PH's badly added libz and libbz2 support.
    - Fixed a problem with static linking.
    - Added pcredemo. [But later removed - see 7 below.]
    - Fixed dftables problem and added an option.
    - Added a number of HAVE_XXX tests, including HAVE_WINDOWS_H and
        HAVE_LONG_LONG.
    - Added readline support for pcretest.
    - Added an listing of the option settings after cmake has run.

4.  A user submitted a patch to Makefile that makes it easy to create
    "pcre.dll" under mingw when using Configure/Make. I added stuff to
    Makefile.am that cause it to include this special target, without
    affecting anything else. Note that the same mingw target plus all
    the other distribution libraries and programs are now supported
    when configuring with CMake (see 6 below) instead of with
    Configure/Make.

5.  Applied Craig's patch that moves no_arg into the RE class in the C++ code.
    This is an attempt to solve the reported problem "pcrecpp::no_arg is not
    exported in the Windows port". It has not yet been confirmed that the patch
    solves the problem, but it does no harm.

6.  Applied Sheri's patch to CMakeLists.txt to add NON_STANDARD_LIB_PREFIX and
    NON_STANDARD_LIB_SUFFIX for dll names built with mingw when configured
    with CMake, and also correct the comment about stack recursion.

7.  Remove the automatic building of pcredemo from the ./configure system and
    from CMakeLists.txt. The whole idea of pcredemo.c is that it is an example
    of a program that users should build themselves after PCRE is installed, so
    building it automatically is not really right. What is more, it gave
    trouble in some build environments.

8.  Further tidies to CMakeLists.txt from Sheri and Christian.


Version 7.5 10-Jan-08
---------------------

1.  Applied a patch from Craig: "This patch makes it possible to 'ignore'
    values in parens when parsing an RE using the C++ wrapper."

2.  Negative specials like \S did not work in character classes in UTF-8 mode.
    Characters greater than 255 were excluded from the class instead of being
    included.

3.  The same bug as (2) above applied to negated POSIX classes such as
    [:^space:].

4.  PCRECPP_STATIC was referenced in pcrecpp_internal.h, but nowhere was it
    defined or documented. It seems to have been a typo for PCRE_STATIC, so
    I have changed it.

5.  The construct (?&) was not diagnosed as a syntax error (it referenced the
    first named subpattern) and a construct such as (?&a) would reference the
    first named subpattern whose name started with "a" (in other words, the
    length check was missing). Both these problems are fixed. "Subpattern name
    expected" is now given for (?&) (a zero-length name), and this patch also
    makes it give the same error for \k'' (previously it complained that that
    was a reference to a non-existent subpattern).

6.  The erroneous patterns (?+-a) and (?-+a) give different error messages;
    this is right because (?- can be followed by option settings as well as by
    digits. I have, however, made the messages clearer.

7.  Patterns such as (?(1)a|b) (a pattern that contains fewer subpatterns
    than the number used in the conditional) now cause a compile-time error.
    This is actually not compatible with Perl, which accepts such patterns, but
    treats the conditional as always being FALSE (as PCRE used to), but it
    seems to me that giving a diagnostic is better.

8.  Change "alphameric" to the more common word "alphanumeric" in comments
    and messages.

9.  Fix two occurrences of "backslash" in comments that should have been
    "backspace".

10. Remove two redundant lines of code that can never be obeyed (their function
    was moved elsewhere).

11. The program that makes PCRE's Unicode character property table had a bug
    which caused it to generate incorrect table entries for sequences of
    characters that have the same character type, but are in different scripts.
    It amalgamated them into a single range, with the script of the first of
    them. In other words, some characters were in the wrong script. There were
    thirteen such cases, affecting characters in the following ranges:

      U+002b0 - U+002c1
      U+0060c - U+0060d
      U+0061e - U+00612
      U+0064b - U+0065e
      U+0074d - U+0076d
      U+01800 - U+01805
      U+01d00 - U+01d77
      U+01d9b - U+01dbf
      U+0200b - U+0200f
      U+030fc - U+030fe
      U+03260 - U+0327f
      U+0fb46 - U+0fbb1
      U+10450 - U+1049d

12. The -o option (show only the matching part of a line) for pcregrep was not
    compatible with GNU grep in that, if there was more than one match in a
    line, it showed only the first of them. It now behaves in the same way as
    GNU grep.

13. If the -o and -v options were combined for pcregrep, it printed a blank
    line for every non-matching line. GNU grep prints nothing, and pcregrep now
    does the same. The return code can be used to tell if there were any
    non-matching lines.

14. Added --file-offsets and --line-offsets to pcregrep.

15. The pattern (?=something)(?R) was not being diagnosed as a potentially
    infinitely looping recursion. The bug was that positive lookaheads were not
    being skipped when checking for a possible empty match (negative lookaheads
    and both kinds of lookbehind were skipped).

16. Fixed two typos in the Windows-only code in pcregrep.c, and moved the
    inclusion of <windows.h> to before rather than after the definition of
    INVALID_FILE_ATTRIBUTES (patch from David Byron).

17. Specifying a possessive quantifier with a specific limit for a Unicode
    character property caused pcre_compile() to compile bad code, which led at
    runtime to PCRE_ERROR_INTERNAL (-14). Examples of patterns that caused this
    are: /\p{Zl}{2,3}+/8 and /\p{Cc}{2}+/8. It was the possessive "+" that
    caused the error; without that there was no problem.

18. Added --enable-pcregrep-libz and --enable-pcregrep-libbz2.

19. Added --enable-pcretest-libreadline.

20. In pcrecpp.cc, the variable 'count' was incremented twice in
    RE::GlobalReplace(). As a result, the number of replacements returned was
    double what it should be. I removed one of the increments, but Craig sent a
    later patch that removed the other one (the right fix) and added unit tests
    that check the return values (which was not done before).

21. Several CMake things:

    (1) Arranged that, when cmake is used on Unix, the libraries end up with
        the names libpcre and libpcreposix, not just pcre and pcreposix.

    (2) The above change means that pcretest and pcregrep are now correctly
        linked with the newly-built libraries, not previously installed ones.

    (3) Added PCRE_SUPPORT_LIBREADLINE, PCRE_SUPPORT_LIBZ, PCRE_SUPPORT_LIBBZ2.

22. In UTF-8 mode, with newline set to "any", a pattern such as .*a.*=.b.*
    crashed when matching a string such as a\x{2029}b (note that \x{2029} is a
    UTF-8 newline character). The key issue is that the pattern starts .*;
    this means that the match must be either at the beginning, or after a
    newline. The bug was in the code for advancing after a failed match and
    checking that the new position followed a newline. It was not taking
    account of UTF-8 characters correctly.

23. PCRE was behaving differently from Perl in the way it recognized POSIX
    character classes. PCRE was not treating the sequence [:...:] as a
    character class unless the ... were all letters. Perl, however, seems to
    allow any characters between [: and :], though of course it rejects as
    unknown any "names" that contain non-letters, because all the known class
    names consist only of letters. Thus, Perl gives an error for [[:1234:]],
    for example, whereas PCRE did not - it did not recognize a POSIX character
    class. This seemed a bit dangerous, so the code has been changed to be
    closer to Perl. The behaviour is not identical to Perl, because PCRE will
    diagnose an unknown class for, for example, [[:l\ower:]] where Perl will
    treat it as [[:lower:]]. However, PCRE does now give "unknown" errors where
    Perl does, and where it didn't before.

24. Rewrite so as to remove the single use of %n from pcregrep because in some
    Windows environments %n is disabled by default.


Version 7.4 21-Sep-07
---------------------

1.  Change 7.3/28 was implemented for classes by looking at the bitmap. This
    means that a class such as [\s] counted as "explicit reference to CR or
    LF". That isn't really right - the whole point of the change was to try to
    help when there was an actual mention of one of the two characters. So now
    the change happens only if \r or \n (or a literal CR or LF) character is
    encountered.

2.  The 32-bit options word was also used for 6 internal flags, but the numbers
    of both had grown to the point where there were only 3 bits left.
    Fortunately, there was spare space in the data structure, and so I have
    moved the internal flags into a new 16-bit field to free up more option
    bits.

3.  The appearance of (?J) at the start of a pattern set the DUPNAMES option,
    but did not set the internal JCHANGED flag - either of these is enough to
    control the way the "get" function works - but the PCRE_INFO_JCHANGED
    facility is supposed to tell if (?J) was ever used, so now (?J) at the
    start sets both bits.

4.  Added options (at build time, compile time, exec time) to change \R from
    matching any Unicode line ending sequence to just matching CR, LF, or CRLF.

5.  doc/pcresyntax.html was missing from the distribution.

6.  Put back the definition of PCRE_ERROR_NULLWSLIMIT, for backward
    compatibility, even though it is no longer used.

7.  Added macro for snprintf to pcrecpp_unittest.cc and also for strtoll and
    strtoull to pcrecpp.cc to select the available functions in WIN32 when the
    windows.h file is present (where different names are used). [This was
    reversed later after testing - see 16 below.]

8.  Changed all #include <config.h> to #include "config.h". There were also
    some further <pcre.h> cases that I changed to "pcre.h".

9.  When pcregrep was used with the --colour option, it missed the line ending
    sequence off the lines that it output.

10. It was pointed out to me that arrays of string pointers cause lots of
    relocations when a shared library is dynamically loaded. A technique of
    using a single long string with a table of offsets can drastically reduce
    these. I have refactored PCRE in four places to do this. The result is
    dramatic:

      Originally:                          290
      After changing UCP table:            187
      After changing error message table:   43
      After changing table of "verbs"       36
      After changing table of Posix names   22

    Thanks to the folks working on Gregex for glib for this insight.

11. --disable-stack-for-recursion caused compiling to fail unless -enable-
    unicode-properties was also set.

12. Updated the tests so that they work when \R is defaulted to ANYCRLF.

13. Added checks for ANY and ANYCRLF to pcrecpp.cc where it previously
    checked only for CRLF.

14. Added casts to pcretest.c to avoid compiler warnings.

15. Added Craig's patch to various pcrecpp modules to avoid compiler warnings.

16. Added Craig's patch to remove the WINDOWS_H tests, that were not working,
    and instead check for _strtoi64 explicitly, and avoid the use of snprintf()
    entirely. This removes changes made in 7 above.

17. The CMake files have been updated, and there is now more information about
    building with CMake in the NON-UNIX-USE document.


Version 7.3 28-Aug-07
---------------------

 1. In the rejigging of the build system that eventually resulted in 7.1, the
    line "#include <pcre.h>" was included in pcre_internal.h. The use of angle
    brackets there is not right, since it causes compilers to look for an
    installed pcre.h, not the version that is in the source that is being
    compiled (which of course may be different). I have changed it back to:

      #include "pcre.h"

    I have a vague recollection that the change was concerned with compiling in
    different directories, but in the new build system, that is taken care of
    by the VPATH setting the Makefile.

 2. The pattern .*$ when run in not-DOTALL UTF-8 mode with newline=any failed
    when the subject happened to end in the byte 0x85 (e.g. if the last
    character was \x{1ec5}). *Character* 0x85 is one of the "any" newline
    characters but of course it shouldn't be taken as a newline when it is part
    of another character. The bug was that, for an unlimited repeat of . in
    not-DOTALL UTF-8 mode, PCRE was advancing by bytes rather than by
    characters when looking for a newline.

 3. A small performance improvement in the DOTALL UTF-8 mode .* case.

 4. Debugging: adjusted the names of opcodes for different kinds of parentheses
    in debug output.

 5. Arrange to use "%I64d" instead of "%lld" and "%I64u" instead of "%llu" for
    long printing in the pcrecpp unittest when running under MinGW.

 6. ESC_K was left out of the EBCDIC table.

 7. Change 7.0/38 introduced a new limit on the number of nested non-capturing
    parentheses; I made it 1000, which seemed large enough. Unfortunately, the
    limit also applies to "virtual nesting" when a pattern is recursive, and in
    this case 1000 isn't so big. I have been able to remove this limit at the
    expense of backing off one optimization in certain circumstances. Normally,
    when pcre_exec() would call its internal match() function recursively and
    immediately return the result unconditionally, it uses a "tail recursion"
    feature to save stack. However, when a subpattern that can match an empty
    string has an unlimited repetition quantifier, it no longer makes this
    optimization. That gives it a stack frame in which to save the data for
    checking that an empty string has been matched. Previously this was taken
    from the 1000-entry workspace that had been reserved. So now there is no
    explicit limit, but more stack is used.

 8. Applied Daniel's patches to solve problems with the import/export magic
    syntax that is required for Windows, and which was going wrong for the
    pcreposix and pcrecpp parts of the library. These were overlooked when this
    problem was solved for the main library.

 9. There were some crude static tests to avoid integer overflow when computing
    the size of patterns that contain repeated groups with explicit upper
    limits. As the maximum quantifier is 65535, the maximum group length was
    set at 30,000 so that the product of these two numbers did not overflow a
    32-bit integer. However, it turns out that people want to use groups that
    are longer than 30,000 bytes (though not repeat them that many times).
    Change 7.0/17 (the refactoring of the way the pattern size is computed) has
    made it possible to implement the integer overflow checks in a much more
    dynamic way, which I have now done. The artificial limitation on group
    length has been removed - we now have only the limit on the total length of
    the compiled pattern, which depends on the LINK_SIZE setting.

10. Fixed a bug in the documentation for get/copy named substring when
    duplicate names are permitted. If none of the named substrings are set, the
    functions return PCRE_ERROR_NOSUBSTRING (7); the doc said they returned an
    empty string.

11. Because Perl interprets \Q...\E at a high level, and ignores orphan \E
    instances, patterns such as [\Q\E] or [\E] or even [^\E] cause an error,
    because the ] is interpreted as the first data character and the
    terminating ] is not found. PCRE has been made compatible with Perl in this
    regard. Previously, it interpreted [\Q\E] as an empty class, and [\E] could
    cause memory overwriting.

10. Like Perl, PCRE automatically breaks an unlimited repeat after an empty
    string has been matched (to stop an infinite loop). It was not recognizing
    a conditional subpattern that could match an empty string if that
    subpattern was within another subpattern. For example, it looped when
    trying to match  (((?(1)X|))*)  but it was OK with  ((?(1)X|)*)  where the
    condition was not nested. This bug has been fixed.

12. A pattern like \X?\d or \P{L}?\d in non-UTF-8 mode could cause a backtrack
    past the start of the subject in the presence of bytes with the top bit
    set, for example "\x8aBCD".

13. Added Perl 5.10 experimental backtracking controls (*FAIL), (*F), (*PRUNE),
    (*SKIP), (*THEN), (*COMMIT), and (*ACCEPT).

14. Optimized (?!) to (*FAIL).

15. Updated the test for a valid UTF-8 string to conform to the later RFC 3629.
    This restricts code points to be within the range 0 to 0x10FFFF, excluding
    the "low surrogate" sequence 0xD800 to 0xDFFF. Previously, PCRE allowed the
    full range 0 to 0x7FFFFFFF, as defined by RFC 2279. Internally, it still
    does: it's just the validity check that is more restrictive.

16. Inserted checks for integer overflows during escape sequence (backslash)
    processing, and also fixed erroneous offset values for syntax errors during
    backslash processing.

17. Fixed another case of looking too far back in non-UTF-8 mode (cf 12 above)
    for patterns like [\PPP\x8a]{1,}\x80 with the subject "A\x80".

18. An unterminated class in a pattern like (?1)\c[ with a "forward reference"
    caused an overrun.

19. A pattern like (?:[\PPa*]*){8,} which had an "extended class" (one with
    something other than just ASCII characters) inside a group that had an
    unlimited repeat caused a loop at compile time (while checking to see
    whether the group could match an empty string).

20. Debugging a pattern containing \p or \P could cause a crash. For example,
    [\P{Any}] did so. (Error in the code for printing property names.)

21. An orphan \E inside a character class could cause a crash.

22. A repeated capturing bracket such as (A)? could cause a wild memory
    reference during compilation.

23. There are several functions in pcre_compile() that scan along a compiled
    expression for various reasons (e.g. to see if it's fixed length for look
    behind). There were bugs in these functions when a repeated \p or \P was
    present in the pattern. These operators have additional parameters compared
    with \d, etc, and these were not being taken into account when moving along
    the compiled data. Specifically:

    (a) A item such as \p{Yi}{3} in a lookbehind was not treated as fixed
        length.

    (b) An item such as \pL+ within a repeated group could cause crashes or
        loops.

    (c) A pattern such as \p{Yi}+(\P{Yi}+)(?1) could give an incorrect
        "reference to non-existent subpattern" error.

    (d) A pattern like (\P{Yi}{2}\277)? could loop at compile time.

24. A repeated \S or \W in UTF-8 mode could give wrong answers when multibyte
    characters were involved (for example /\S{2}/8g with "A\x{a3}BC").

25. Using pcregrep in multiline, inverted mode (-Mv) caused it to loop.

26. Patterns such as [\P{Yi}A] which include \p or \P and just one other
    character were causing crashes (broken optimization).

27. Patterns such as (\P{Yi}*\277)* (group with possible zero repeat containing
    \p or \P) caused a compile-time loop.

28. More problems have arisen in unanchored patterns when CRLF is a valid line
    break. For example, the unstudied pattern [\r\n]A does not match the string
    "\r\nA" because change 7.0/46 below moves the current point on by two
    characters after failing to match at the start. However, the pattern \nA
    *does* match, because it doesn't start till \n, and if [\r\n]A is studied,
    the same is true. There doesn't seem any very clean way out of this, but
    what I have chosen to do makes the common cases work: PCRE now takes note
    of whether there can be an explicit match for \r or \n anywhere in the
    pattern, and if so, 7.0/46 no longer applies. As part of this change,
    there's a new PCRE_INFO_HASCRORLF option for finding out whether a compiled
    pattern has explicit CR or LF references.

29. Added (*CR) etc for changing newline setting at start of pattern.


Version 7.2 19-Jun-07
---------------------

 1. If the fr_FR locale cannot be found for test 3, try the "french" locale,
    which is apparently normally available under Windows.

 2. Re-jig the pcregrep tests with different newline settings in an attempt
    to make them independent of the local environment's newline setting.

 3. Add code to configure.ac to remove -g from the CFLAGS default settings.

 4. Some of the "internals" tests were previously cut out when the link size
    was not 2, because the output contained actual offsets. The recent new
    "Z" feature of pcretest means that these can be cut out, making the tests
    usable with all link sizes.

 5. Implemented Stan Switzer's goto replacement for longjmp() when not using
    stack recursion. This gives a massive performance boost under BSD, but just
    a small improvement under Linux. However, it saves one field in the frame
    in all cases.

 6. Added more features from the forthcoming Perl 5.10:

    (a) (?-n) (where n is a string of digits) is a relative subroutine or
        recursion call. It refers to the nth most recently opened parentheses.

    (b) (?+n) is also a relative subroutine call; it refers to the nth next
        to be opened parentheses.

    (c) Conditions that refer to capturing parentheses can be specified
        relatively, for example, (?(-2)... or (?(+3)...

    (d) \K resets the start of the current match so that everything before
        is not part of it.

    (e) \k{name} is synonymous with \k<name> and \k'name' (.NET compatible).

    (f) \g{name} is another synonym - part of Perl 5.10's unification of
        reference syntax.

    (g) (?| introduces a group in which the numbering of parentheses in each
        alternative starts with the same number.

    (h) \h, \H, \v, and \V match horizontal and vertical whitespace.

 7. Added two new calls to pcre_fullinfo(): PCRE_INFO_OKPARTIAL and
    PCRE_INFO_JCHANGED.

 8. A pattern such as  (.*(.)?)*  caused pcre_exec() to fail by either not
    terminating or by crashing. Diagnosed by Viktor Griph; it was in the code
    for detecting groups that can match an empty string.

 9. A pattern with a very large number of alternatives (more than several
    hundred) was running out of internal workspace during the pre-compile
    phase, where pcre_compile() figures out how much memory will be needed. A
    bit of new cunning has reduced the workspace needed for groups with
    alternatives. The 1000-alternative test pattern now uses 12 bytes of
    workspace instead of running out of the 4096 that are available.

10. Inserted some missing (unsigned int) casts to get rid of compiler warnings.

11. Applied patch from Google to remove an optimization that didn't quite work.
    The report of the bug said:

      pcrecpp::RE("a*").FullMatch("aaa") matches, while
      pcrecpp::RE("a*?").FullMatch("aaa") does not, and
      pcrecpp::RE("a*?\\z").FullMatch("aaa") does again.

12. If \p or \P was used in non-UTF-8 mode on a character greater than 127
    it matched the wrong number of bytes.


Version 7.1 24-Apr-07
---------------------

 1. Applied Bob Rossi and Daniel G's patches to convert the build system to one
    that is more "standard", making use of automake and other Autotools. There
    is some re-arrangement of the files and adjustment of comments consequent
    on this.

 2. Part of the patch fixed a problem with the pcregrep tests. The test of -r
    for recursive directory scanning broke on some systems because the files
    are not scanned in any specific order and on different systems the order
    was different. A call to "sort" has been inserted into RunGrepTest for the
    approprate test as a short-term fix. In the longer term there may be an
    alternative.

 3. I had an email from Eric Raymond about problems translating some of PCRE's
    man pages to HTML (despite the fact that I distribute HTML pages, some
    people do their own conversions for various reasons). The problems
    concerned the use of low-level troff macros .br and .in. I have therefore
    removed all such uses from the man pages (some were redundant, some could
    be replaced by .nf/.fi pairs). The 132html script that I use to generate
    HTML has been updated to handle .nf/.fi and to complain if it encounters
    .br or .in.

 4. Updated comments in configure.ac that get placed in config.h.in and also
    arranged for config.h to be included in the distribution, with the name
    config.h.generic, for the benefit of those who have to compile without
    Autotools (compare pcre.h, which is now distributed as pcre.h.generic).

 5. Updated the support (such as it is) for Virtual Pascal, thanks to Stefan
    Weber: (1) pcre_internal.h was missing some function renames; (2) updated
    makevp.bat for the current PCRE, using the additional files
    makevp_c.txt, makevp_l.txt, and pcregexp.pas.

 6. A Windows user reported a minor discrepancy with test 2, which turned out
    to be caused by a trailing space on an input line that had got lost in his
    copy. The trailing space was an accident, so I've just removed it.

 7. Add -Wl,-R... flags in pcre-config.in for *BSD* systems, as I'm told
    that is needed.

 8. Mark ucp_table (in ucptable.h) and ucp_gentype (in pcre_ucp_searchfuncs.c)
    as "const" (a) because they are and (b) because it helps the PHP
    maintainers who have recently made a script to detect big data structures
    in the php code that should be moved to the .rodata section. I remembered
    to update Builducptable as well, so it won't revert if ucptable.h is ever
    re-created.

 9. Added some extra #ifdef SUPPORT_UTF8 conditionals into pcretest.c,
    pcre_printint.src, pcre_compile.c, pcre_study.c, and pcre_tables.c, in
    order to be able to cut out the UTF-8 tables in the latter when UTF-8
    support is not required. This saves 1.5-2K of code, which is important in
    some applications.

    Later: more #ifdefs are needed in pcre_ord2utf8.c and pcre_valid_utf8.c
    so as not to refer to the tables, even though these functions will never be
    called when UTF-8 support is disabled. Otherwise there are problems with a
    shared library.

10. Fixed two bugs in the emulated memmove() function in pcre_internal.h:

    (a) It was defining its arguments as char * instead of void *.

    (b) It was assuming that all moves were upwards in memory; this was true
        a long time ago when I wrote it, but is no longer the case.

    The emulated memove() is provided for those environments that have neither
    memmove() nor bcopy(). I didn't think anyone used it these days, but that
    is clearly not the case, as these two bugs were recently reported.

11. The script PrepareRelease is now distributed: it calls 132html, CleanTxt,
    and Detrail to create the HTML documentation, the .txt form of the man
    pages, and it removes trailing spaces from listed files. It also creates
    pcre.h.generic and config.h.generic from pcre.h and config.h. In the latter
    case, it wraps all the #defines with #ifndefs. This script should be run
    before "make dist".

12. Fixed two fairly obscure bugs concerned with quantified caseless matching
    with Unicode property support.

    (a) For a maximizing quantifier, if the two different cases of the
        character were of different lengths in their UTF-8 codings (there are
        some cases like this - I found 11), and the matching function had to
        back up over a mixture of the two cases, it incorrectly assumed they
        were both the same length.

    (b) When PCRE was configured to use the heap rather than the stack for
        recursion during matching, it was not correctly preserving the data for
        the other case of a UTF-8 character when checking ahead for a match
        while processing a minimizing repeat. If the check also involved
        matching a wide character, but failed, corruption could cause an
        erroneous result when trying to check for a repeat of the original
        character.

13. Some tidying changes to the testing mechanism:

    (a) The RunTest script now detects the internal link size and whether there
        is UTF-8 and UCP support by running ./pcretest -C instead of relying on
        values substituted by "configure". (The RunGrepTest script already did
        this for UTF-8.) The configure.ac script no longer substitutes the
        relevant variables.

    (b) The debugging options /B and /D in pcretest show the compiled bytecode
        with length and offset values. This means that the output is different
        for different internal link sizes. Test 2 is skipped for link sizes
        other than 2 because of this, bypassing the problem. Unfortunately,
        there was also a test in test 3 (the locale tests) that used /B and
        failed for link sizes other than 2. Rather than cut the whole test out,
        I have added a new /Z option to pcretest that replaces the length and
        offset values with spaces. This is now used to make test 3 independent
        of link size. (Test 2 will be tidied up later.)

14. If erroroffset was passed as NULL to pcre_compile, it provoked a
    segmentation fault instead of returning the appropriate error message.

15. In multiline mode when the newline sequence was set to "any", the pattern
    ^$ would give a match between the \r and \n of a subject such as "A\r\nB".
    This doesn't seem right; it now treats the CRLF combination as the line
    ending, and so does not match in that case. It's only a pattern such as ^$
    that would hit this one: something like ^ABC$ would have failed after \r
    and then tried again after \r\n.

16. Changed the comparison command for RunGrepTest from "diff -u" to "diff -ub"
    in an attempt to make files that differ only in their line terminators
    compare equal. This works on Linux.

17. Under certain error circumstances pcregrep might try to free random memory
    as it exited. This is now fixed, thanks to valgrind.

19. In pcretest, if the pattern /(?m)^$/g<any> was matched against the string
    "abc\r\n\r\n", it found an unwanted second match after the second \r. This
    was because its rules for how to advance for /g after matching an empty
    string at the end of a line did not allow for this case. They now check for
    it specially.

20. pcretest is supposed to handle patterns and data of any length, by
    extending its buffers when necessary. It was getting this wrong when the
    buffer for a data line had to be extended.

21. Added PCRE_NEWLINE_ANYCRLF which is like ANY, but matches only CR, LF, or
    CRLF as a newline sequence.

22. Code for handling Unicode properties in pcre_dfa_exec() wasn't being cut
    out by #ifdef SUPPORT_UCP. This did no harm, as it could never be used, but
    I have nevertheless tidied it up.

23. Added some casts to kill warnings from HP-UX ia64 compiler.

24. Added a man page for pcre-config.


Version 7.0 19-Dec-06
---------------------

 1. Fixed a signed/unsigned compiler warning in pcre_compile.c, shown up by
    moving to gcc 4.1.1.

 2. The -S option for pcretest uses setrlimit(); I had omitted to #include
    sys/time.h, which is documented as needed for this function. It doesn't
    seem to matter on Linux, but it showed up on some releases of OS X.

 3. It seems that there are systems where bytes whose values are greater than
    127 match isprint() in the "C" locale. The "C" locale should be the
    default when a C program starts up. In most systems, only ASCII printing
    characters match isprint(). This difference caused the output from pcretest
    to vary, making some of the tests fail. I have changed pcretest so that:

    (a) When it is outputting text in the compiled version of a pattern, bytes
        other than 32-126 are always shown as hex escapes.

    (b) When it is outputting text that is a matched part of a subject string,
        it does the same, unless a different locale has been set for the match
        (using the /L modifier). In this case, it uses isprint() to decide.

 4. Fixed a major bug that caused incorrect computation of the amount of memory
    required for a compiled pattern when options that changed within the
    pattern affected the logic of the preliminary scan that determines the
    length. The relevant options are -x, and -i in UTF-8 mode. The result was
    that the computed length was too small. The symptoms of this bug were
    either the PCRE error "internal error: code overflow" from pcre_compile(),
    or a glibc crash with a message such as "pcretest: free(): invalid next
    size (fast)". Examples of patterns that provoked this bug (shown in
    pcretest format) are:

      /(?-x: )/x
      /(?x)(?-x: \s*#\s*)/
      /((?i)[\x{c0}])/8
      /(?i:[\x{c0}])/8

    HOWEVER: Change 17 below makes this fix obsolete as the memory computation
    is now done differently.

 5. Applied patches from Google to: (a) add a QuoteMeta function to the C++
    wrapper classes; (b) implement a new function in the C++ scanner that is
    more efficient than the old way of doing things because it avoids levels of
    recursion in the regex matching; (c) add a paragraph to the documentation
    for the FullMatch() function.

 6. The escape sequence \n was being treated as whatever was defined as
    "newline". Not only was this contrary to the documentation, which states
    that \n is character 10 (hex 0A), but it also went horribly wrong when
    "newline" was defined as CRLF. This has been fixed.

 7. In pcre_dfa_exec.c the value of an unsigned integer (the variable called c)
    was being set to -1 for the "end of line" case (supposedly a value that no
    character can have). Though this value is never used (the check for end of
    line is "zero bytes in current character"), it caused compiler complaints.
    I've changed it to 0xffffffff.

 8. In pcre_version.c, the version string was being built by a sequence of
    C macros that, in the event of PCRE_PRERELEASE being defined as an empty
    string (as it is for production releases) called a macro with an empty
    argument. The C standard says the result of this is undefined. The gcc
    compiler treats it as an empty string (which was what was wanted) but it is
    reported that Visual C gives an error. The source has been hacked around to
    avoid this problem.

 9. On the advice of a Windows user, included <io.h> and <fcntl.h> in Windows
    builds of pcretest, and changed the call to _setmode() to use _O_BINARY
    instead of 0x8000. Made all the #ifdefs test both _WIN32 and WIN32 (not all
    of them did).

10. Originally, pcretest opened its input and output without "b"; then I was
    told that "b" was needed in some environments, so it was added for release
    5.0 to both the input and output. (It makes no difference on Unix-like
    systems.) Later I was told that it is wrong for the input on Windows. I've
    now abstracted the modes into two macros, to make it easier to fiddle with
    them, and removed "b" from the input mode under Windows.

11. Added pkgconfig support for the C++ wrapper library, libpcrecpp.

12. Added -help and --help to pcretest as an official way of being reminded
    of the options.

13. Removed some redundant semicolons after macro calls in pcrecpparg.h.in
    and pcrecpp.cc because they annoy compilers at high warning levels.

14. A bit of tidying/refactoring in pcre_exec.c in the main bumpalong loop.

15. Fixed an occurrence of == in configure.ac that should have been = (shell
    scripts are not C programs :-) and which was not noticed because it works
    on Linux.

16. pcretest is supposed to handle any length of pattern and data line (as one
    line or as a continued sequence of lines) by extending its input buffer if
    necessary. This feature was broken for very long pattern lines, leading to
    a string of junk being passed to pcre_compile() if the pattern was longer
    than about 50K.

17. I have done a major re-factoring of the way pcre_compile() computes the
    amount of memory needed for a compiled pattern. Previously, there was code
    that made a preliminary scan of the pattern in order to do this. That was
    OK when PCRE was new, but as the facilities have expanded, it has become
    harder and harder to keep it in step with the real compile phase, and there
    have been a number of bugs (see for example, 4 above). I have now found a
    cunning way of running the real compile function in a "fake" mode that
    enables it to compute how much memory it would need, while actually only
    ever using a few hundred bytes of working memory and without too many
    tests of the mode. This should make future maintenance and development
    easier. A side effect of this work is that the limit of 200 on the nesting
    depth of parentheses has been removed (though this was never a serious
    limitation, I suspect). However, there is a downside: pcre_compile() now
    runs more slowly than before (30% or more, depending on the pattern). I
    hope this isn't a big issue. There is no effect on runtime performance.

18. Fixed a minor bug in pcretest: if a pattern line was not terminated by a
    newline (only possible for the last line of a file) and it was a
    pattern that set a locale (followed by /Lsomething), pcretest crashed.

19. Added additional timing features to pcretest. (1) The -tm option now times
    matching only, not compiling. (2) Both -t and -tm can be followed, as a
    separate command line item, by a number that specifies the number of
    repeats to use when timing. The default is 50000; this gives better
    precision, but takes uncomfortably long for very large patterns.

20. Extended pcre_study() to be more clever in cases where a branch of a
    subpattern has no definite first character. For example, (a*|b*)[cd] would
    previously give no result from pcre_study(). Now it recognizes that the
    first character must be a, b, c, or d.

21. There was an incorrect error "recursive call could loop indefinitely" if
    a subpattern (or the entire pattern) that was being tested for matching an
    empty string contained only one non-empty item after a nested subpattern.
    For example, the pattern (?>\x{100}*)\d(?R) provoked this error
    incorrectly, because the \d was being skipped in the check.

22. The pcretest program now has a new pattern option /B and a command line
    option -b, which is equivalent to adding /B to every pattern. This causes
    it to show the compiled bytecode, without the additional information that
    -d shows. The effect of -d is now the same as -b with -i (and similarly, /D
    is the same as /B/I).

23. A new optimization is now able automatically to treat some sequences such
    as a*b as a*+b. More specifically, if something simple (such as a character
    or a simple class like \d) has an unlimited quantifier, and is followed by
    something that cannot possibly match the quantified thing, the quantifier
    is automatically "possessified".

24. A recursive reference to a subpattern whose number was greater than 39
    went wrong under certain circumstances in UTF-8 mode. This bug could also
    have affected the operation of pcre_study().

25. Realized that a little bit of performance could be had by replacing
    (c & 0xc0) == 0xc0 with c >= 0xc0 when processing UTF-8 characters.

26. Timing data from pcretest is now shown to 4 decimal places instead of 3.

27. Possessive quantifiers such as a++ were previously implemented by turning
    them into atomic groups such as ($>a+). Now they have their own opcodes,
    which improves performance. This includes the automatically created ones
    from 23 above.

28. A pattern such as (?=(\w+))\1: which simulates an atomic group using a
    lookahead was broken if it was not anchored. PCRE was mistakenly expecting
    the first matched character to be a colon. This applied both to named and
    numbered groups.

29. The ucpinternal.h header file was missing its idempotency #ifdef.

30. I was sent a "project" file called libpcre.a.dev which I understand makes
    building PCRE on Windows easier, so I have included it in the distribution.

31. There is now a check in pcretest against a ridiculously large number being
    returned by pcre_exec() or pcre_dfa_exec(). If this happens in a /g or /G
    loop, the loop is abandoned.

32. Forward references to subpatterns in conditions such as (?(2)...) where
    subpattern 2 is defined later cause pcre_compile() to search forwards in
    the pattern for the relevant set of parentheses. This search went wrong
    when there were unescaped parentheses in a character class, parentheses
    escaped with \Q...\E, or parentheses in a #-comment in /x mode.

33. "Subroutine" calls and backreferences were previously restricted to
    referencing subpatterns earlier in the regex. This restriction has now
    been removed.

34. Added a number of extra features that are going to be in Perl 5.10. On the
    whole, these are just syntactic alternatives for features that PCRE had
    previously implemented using the Python syntax or my own invention. The
    other formats are all retained for compatibility.

    (a) Named groups can now be defined as (?<name>...) or (?'name'...) as well
        as (?P<name>...). The new forms, as well as being in Perl 5.10, are
        also .NET compatible.

    (b) A recursion or subroutine call to a named group can now be defined as
        (?&name) as well as (?P>name).

    (c) A backreference to a named group can now be defined as \k<name> or
        \k'name' as well as (?P=name). The new forms, as well as being in Perl
        5.10, are also .NET compatible.

    (d) A conditional reference to a named group can now use the syntax
        (?(<name>) or (?('name') as well as (?(name).

    (e) A "conditional group" of the form (?(DEFINE)...) can be used to define
        groups (named and numbered) that are never evaluated inline, but can be
        called as "subroutines" from elsewhere. In effect, the DEFINE condition
        is always false. There may be only one alternative in such a group.

    (f) A test for recursion can be given as (?(R1).. or (?(R&name)... as well
        as the simple (?(R). The condition is true only if the most recent
        recursion is that of the given number or name. It does not search out
        through the entire recursion stack.

    (g) The escape \gN or \g{N} has been added, where N is a positive or
        negative number, specifying an absolute or relative reference.

35. Tidied to get rid of some further signed/unsigned compiler warnings and
    some "unreachable code" warnings.

36. Updated the Unicode property tables to Unicode version 5.0.0. Amongst other
    things, this adds five new scripts.

37. Perl ignores orphaned \E escapes completely. PCRE now does the same.
    There were also incompatibilities regarding the handling of \Q..\E inside
    character classes, for example with patterns like [\Qa\E-\Qz\E] where the
    hyphen was adjacent to \Q or \E. I hope I've cleared all this up now.

38. Like Perl, PCRE detects when an indefinitely repeated parenthesized group
    matches an empty string, and forcibly breaks the loop. There were bugs in
    this code in non-simple cases. For a pattern such as  ^(a()*)*  matched
    against  aaaa  the result was just "a" rather than "aaaa", for example. Two
    separate and independent bugs (that affected different cases) have been
    fixed.

39. Refactored the code to abolish the use of different opcodes for small
    capturing bracket numbers. This is a tidy that I avoided doing when I
    removed the limit on the number of capturing brackets for 3.5 back in 2001.
    The new approach is not only tidier, it makes it possible to reduce the
    memory needed to fix the previous bug (38).

40. Implemented PCRE_NEWLINE_ANY to recognize any of the Unicode newline
    sequences (http://unicode.org/unicode/reports/tr18/) as "newline" when
    processing dot, circumflex, or dollar metacharacters, or #-comments in /x
    mode.

41. Add \R to match any Unicode newline sequence, as suggested in the Unicode
    report.

42. Applied patch, originally from Ari Pollak, modified by Google, to allow
    copy construction and assignment in the C++ wrapper.

43. Updated pcregrep to support "--newline=any". In the process, I fixed a
    couple of bugs that could have given wrong results in the "--newline=crlf"
    case.

44. Added a number of casts and did some reorganization of signed/unsigned int
    variables following suggestions from Dair Grant. Also renamed the variable
    "this" as "item" because it is a C++ keyword.

45. Arranged for dftables to add

      #include "pcre_internal.h"

    to pcre_chartables.c because without it, gcc 4.x may remove the array
    definition from the final binary if PCRE is built into a static library and
    dead code stripping is activated.

46. For an unanchored pattern, if a match attempt fails at the start of a
    newline sequence, and the newline setting is CRLF or ANY, and the next two
    characters are CRLF, advance by two characters instead of one.


Version 6.7 04-Jul-06
---------------------

 1. In order to handle tests when input lines are enormously long, pcretest has
    been re-factored so that it automatically extends its buffers when
    necessary. The code is crude, but this _is_ just a test program. The
    default size has been increased from 32K to 50K.

 2. The code in pcre_study() was using the value of the re argument before
    testing it for NULL. (Of course, in any sensible call of the function, it
    won't be NULL.)

 3. The memmove() emulation function in pcre_internal.h, which is used on
    systems that lack both memmove() and bcopy() - that is, hardly ever -
    was missing a "static" storage class specifier.

 4. When UTF-8 mode was not set, PCRE looped when compiling certain patterns
    containing an extended class (one that cannot be represented by a bitmap
    because it contains high-valued characters or Unicode property items, e.g.
    [\pZ]). Almost always one would set UTF-8 mode when processing such a
    pattern, but PCRE should not loop if you do not (it no longer does).
    [Detail: two cases were found: (a) a repeated subpattern containing an
    extended class; (b) a recursive reference to a subpattern that followed a
    previous extended class. It wasn't skipping over the extended class
    correctly when UTF-8 mode was not set.]

 5. A negated single-character class was not being recognized as fixed-length
    in lookbehind assertions such as (?<=[^f]), leading to an incorrect
    compile error "lookbehind assertion is not fixed length".

 6. The RunPerlTest auxiliary script was showing an unexpected difference
    between PCRE and Perl for UTF-8 tests. It turns out that it is hard to
    write a Perl script that can interpret lines of an input file either as
    byte characters or as UTF-8, which is what "perltest" was being required to
    do for the non-UTF-8 and UTF-8 tests, respectively. Essentially what you
    can't do is switch easily at run time between having the "use utf8;" pragma
    or not. In the end, I fudged it by using the RunPerlTest script to insert
    "use utf8;" explicitly for the UTF-8 tests.

 7. In multiline (/m) mode, PCRE was matching ^ after a terminating newline at
    the end of the subject string, contrary to the documentation and to what
    Perl does. This was true of both matching functions. Now it matches only at
    the start of the subject and immediately after *internal* newlines.

 8. A call of pcre_fullinfo() from pcretest to get the option bits was passing
    a pointer to an int instead of a pointer to an unsigned long int. This
    caused problems on 64-bit systems.

 9. Applied a patch from the folks at Google to pcrecpp.cc, to fix "another
    instance of the 'standard' template library not being so standard".

10. There was no check on the number of named subpatterns nor the maximum
    length of a subpattern name. The product of these values is used to compute
    the size of the memory block for a compiled pattern. By supplying a very
    long subpattern name and a large number of named subpatterns, the size
    computation could be caused to overflow. This is now prevented by limiting
    the length of names to 32 characters, and the number of named subpatterns
    to 10,000.

11. Subpatterns that are repeated with specific counts have to be replicated in
    the compiled pattern. The size of memory for this was computed from the
    length of the subpattern and the repeat count. The latter is limited to
    65535, but there was no limit on the former, meaning that integer overflow
    could in principle occur. The compiled length of a repeated subpattern is
    now limited to 30,000 bytes in order to prevent this.

12. Added the optional facility to have named substrings with the same name.

13. Added the ability to use a named substring as a condition, using the
    Python syntax: (?(name)yes|no). This overloads (?(R)... and names that
    are numbers (not recommended). Forward references are permitted.

14. Added forward references in named backreferences (if you see what I mean).

15. In UTF-8 mode, with the PCRE_DOTALL option set, a quantified dot in the
    pattern could run off the end of the subject. For example, the pattern
    "(?s)(.{1,5})"8 did this with the subject "ab".

16. If PCRE_DOTALL or PCRE_MULTILINE were set, pcre_dfa_exec() behaved as if
    PCRE_CASELESS was set when matching characters that were quantified with ?
    or *.

17. A character class other than a single negated character that had a minimum
    but no maximum quantifier - for example [ab]{6,} - was not handled
    correctly by pce_dfa_exec(). It would match only one character.

18. A valid (though odd) pattern that looked like a POSIX character
    class but used an invalid character after [ (for example [[,abc,]]) caused
    pcre_compile() to give the error "Failed: internal error: code overflow" or
    in some cases to crash with a glibc free() error. This could even happen if
    the pattern terminated after [[ but there just happened to be a sequence of
    letters, a binary zero, and a closing ] in the memory that followed.

19. Perl's treatment of octal escapes in the range \400 to \777 has changed
    over the years. Originally (before any Unicode support), just the bottom 8
    bits were taken. Thus, for example, \500 really meant \100. Nowadays the
    output from "man perlunicode" includes this:

      The regular expression compiler produces polymorphic opcodes.  That
      is, the pattern adapts to the data and automatically switches to
      the Unicode character scheme when presented with Unicode data--or
      instead uses a traditional byte scheme when presented with byte
      data.

    Sadly, a wide octal escape does not cause a switch, and in a string with
    no other multibyte characters, these octal escapes are treated as before.
    Thus, in Perl, the pattern  /\500/ actually matches \100 but the pattern
    /\500|\x{1ff}/ matches \500 or \777 because the whole thing is treated as a
    Unicode string.

    I have not perpetrated such confusion in PCRE. Up till now, it took just
    the bottom 8 bits, as in old Perl. I have now made octal escapes with
    values greater than \377 illegal in non-UTF-8 mode. In UTF-8 mode they
    translate to the appropriate multibyte character.

29. Applied some refactoring to reduce the number of warnings from Microsoft
    and Borland compilers. This has included removing the fudge introduced
    seven years ago for the OS/2 compiler (see 2.02/2 below) because it caused
    a warning about an unused variable.

21. PCRE has not included VT (character 0x0b) in the set of whitespace
    characters since release 4.0, because Perl (from release 5.004) does not.
    [Or at least, is documented not to: some releases seem to be in conflict
    with the documentation.] However, when a pattern was studied with
    pcre_study() and all its branches started with \s, PCRE still included VT
    as a possible starting character. Of course, this did no harm; it just
    caused an unnecessary match attempt.

22. Removed a now-redundant internal flag bit that recorded the fact that case
    dependency changed within the pattern. This was once needed for "required
    byte" processing, but is no longer used. This recovers a now-scarce options
    bit. Also moved the least significant internal flag bit to the most-
    significant bit of the word, which was not previously used (hangover from
    the days when it was an int rather than a uint) to free up another bit for
    the future.

23. Added support for CRLF line endings as well as CR and LF. As well as the
    default being selectable at build time, it can now be changed at runtime
    via the PCRE_NEWLINE_xxx flags. There are now options for pcregrep to
    specify that it is scanning data with non-default line endings.

24. Changed the definition of CXXLINK to make it agree with the definition of
    LINK in the Makefile, by replacing LDFLAGS to CXXFLAGS.

25. Applied Ian Taylor's patches to avoid using another stack frame for tail
    recursions. This makes a big different to stack usage for some patterns.

26. If a subpattern containing a named recursion or subroutine reference such
    as (?P>B) was quantified, for example (xxx(?P>B)){3}, the calculation of
    the space required for the compiled pattern went wrong and gave too small a
    value. Depending on the environment, this could lead to "Failed: internal
    error: code overflow at offset 49" or "glibc detected double free or
    corruption" errors.

27. Applied patches from Google (a) to support the new newline modes and (b) to
    advance over multibyte UTF-8 characters in GlobalReplace.

28. Change free() to pcre_free() in pcredemo.c. Apparently this makes a
    difference for some implementation of PCRE in some Windows version.

29. Added some extra testing facilities to pcretest:

    \q<number>   in a data line sets the "match limit" value
    \Q<number>   in a data line sets the "match recursion limt" value
    -S <number>  sets the stack size, where <number> is in megabytes

    The -S option isn't available for Windows.


Version 6.6 06-Feb-06
---------------------

 1. Change 16(a) for 6.5 broke things, because PCRE_DATA_SCOPE was not defined
    in pcreposix.h. I have copied the definition from pcre.h.

 2. Change 25 for 6.5 broke compilation in a build directory out-of-tree
    because pcre.h is no longer a built file.

 3. Added Jeff Friedl's additional debugging patches to pcregrep. These are
    not normally included in the compiled code.


Version 6.5 01-Feb-06
---------------------

 1. When using the partial match feature with pcre_dfa_exec(), it was not
    anchoring the second and subsequent partial matches at the new starting
    point. This could lead to incorrect results. For example, with the pattern
    /1234/, partially matching against "123" and then "a4" gave a match.

 2. Changes to pcregrep:

    (a) All non-match returns from pcre_exec() were being treated as failures
        to match the line. Now, unless the error is PCRE_ERROR_NOMATCH, an
        error message is output. Some extra information is given for the
        PCRE_ERROR_MATCHLIMIT and PCRE_ERROR_RECURSIONLIMIT errors, which are
        probably the only errors that are likely to be caused by users (by
        specifying a regex that has nested indefinite repeats, for instance).
        If there are more than 20 of these errors, pcregrep is abandoned.

    (b) A binary zero was treated as data while matching, but terminated the
        output line if it was written out. This has been fixed: binary zeroes
        are now no different to any other data bytes.

    (c) Whichever of the LC_ALL or LC_CTYPE environment variables is set is
        used to set a locale for matching. The --locale=xxxx long option has
        been added (no short equivalent) to specify a locale explicitly on the
        pcregrep command, overriding the environment variables.

    (d) When -B was used with -n, some line numbers in the output were one less
        than they should have been.

    (e) Added the -o (--only-matching) option.

    (f) If -A or -C was used with -c (count only), some lines of context were
        accidentally printed for the final match.

    (g) Added the -H (--with-filename) option.

    (h) The combination of options -rh failed to suppress file names for files
        that were found from directory arguments.

    (i) Added the -D (--devices) and -d (--directories) options.

    (j) Added the -F (--fixed-strings) option.

    (k) Allow "-" to be used as a file name for -f as well as for a data file.

    (l) Added the --colo(u)r option.

    (m) Added Jeffrey Friedl's -S testing option, but within #ifdefs so that it
        is not present by default.

 3. A nasty bug was discovered in the handling of recursive patterns, that is,
    items such as (?R) or (?1), when the recursion could match a number of
    alternatives. If it matched one of the alternatives, but subsequently,
    outside the recursion, there was a failure, the code tried to back up into
    the recursion. However, because of the way PCRE is implemented, this is not
    possible, and the result was an incorrect result from the match.

    In order to prevent this happening, the specification of recursion has
    been changed so that all such subpatterns are automatically treated as
    atomic groups. Thus, for example, (?R) is treated as if it were (?>(?R)).

 4. I had overlooked the fact that, in some locales, there are characters for
    which isalpha() is true but neither isupper() nor islower() are true. In
    the fr_FR locale, for instance, the \xAA and \xBA characters (ordmasculine
    and ordfeminine) are like this. This affected the treatment of \w and \W
    when they appeared in character classes, but not when they appeared outside
    a character class. The bit map for "word" characters is now created
    separately from the results of isalnum() instead of just taking it from the
    upper, lower, and digit maps. (Plus the underscore character, of course.)

 5. The above bug also affected the handling of POSIX character classes such as
    [[:alpha:]] and [[:alnum:]]. These do not have their own bit maps in PCRE's
    permanent tables. Instead, the bit maps for such a class were previously
    created as the appropriate unions of the upper, lower, and digit bitmaps.
    Now they are created by subtraction from the [[:word:]] class, which has
    its own bitmap.

 6. The [[:blank:]] character class matches horizontal, but not vertical space.
    It is created by subtracting the vertical space characters (\x09, \x0a,
    \x0b, \x0c) from the [[:space:]] bitmap. Previously, however, the
    subtraction was done in the overall bitmap for a character class, meaning
    that a class such as [\x0c[:blank:]] was incorrect because \x0c would not
    be recognized. This bug has been fixed.

 7. Patches from the folks at Google:

      (a) pcrecpp.cc: "to handle a corner case that may or may not happen in
      real life, but is still worth protecting against".

      (b) pcrecpp.cc: "corrects a bug when negative radixes are used with
      regular expressions".

      (c) pcre_scanner.cc: avoid use of std::count() because not all systems
      have it.

      (d) Split off pcrecpparg.h from pcrecpp.h and had the former built by
      "configure" and the latter not, in order to fix a problem somebody had
      with compiling the Arg class on HP-UX.

      (e) Improve the error-handling of the C++ wrapper a little bit.

      (f) New tests for checking recursion limiting.

 8. The pcre_memmove() function, which is used only if the environment does not
    have a standard memmove() function (and is therefore rarely compiled),
    contained two bugs: (a) use of int instead of size_t, and (b) it was not
    returning a result (though PCRE never actually uses the result).

 9. In the POSIX regexec() interface, if nmatch is specified as a ridiculously
    large number - greater than INT_MAX/(3*sizeof(int)) - REG_ESPACE is
    returned instead of calling malloc() with an overflowing number that would
    most likely cause subsequent chaos.

10. The debugging option of pcretest was not showing the NO_AUTO_CAPTURE flag.

11. The POSIX flag REG_NOSUB is now supported. When a pattern that was compiled
    with this option is matched, the nmatch and pmatch options of regexec() are
    ignored.

12. Added REG_UTF8 to the POSIX interface. This is not defined by POSIX, but is
    provided in case anyone wants to the the POSIX interface with UTF-8
    strings.

13. Added CXXLDFLAGS to the Makefile parameters to provide settings only on the
    C++ linking (needed for some HP-UX environments).

14. Avoid compiler warnings in get_ucpname() when compiled without UCP support
    (unused parameter) and in the pcre_printint() function (omitted "default"
    switch label when the default is to do nothing).

15. Added some code to make it possible, when PCRE is compiled as a C++
    library, to replace subject pointers for pcre_exec() with a smart pointer
    class, thus making it possible to process discontinuous strings.

16. The two macros PCRE_EXPORT and PCRE_DATA_SCOPE are confusing, and perform
    much the same function. They were added by different people who were trying
    to make PCRE easy to compile on non-Unix systems. It has been suggested
    that PCRE_EXPORT be abolished now that there is more automatic apparatus
    for compiling on Windows systems. I have therefore replaced it with
    PCRE_DATA_SCOPE. This is set automatically for Windows; if not set it
    defaults to "extern" for C or "extern C" for C++, which works fine on
    Unix-like systems. It is now possible to override the value of PCRE_DATA_
    SCOPE with something explicit in config.h. In addition:

    (a) pcreposix.h still had just "extern" instead of either of these macros;
        I have replaced it with PCRE_DATA_SCOPE.

    (b) Functions such as _pcre_xclass(), which are internal to the library,
        but external in the C sense, all had PCRE_EXPORT in their definitions.
        This is apparently wrong for the Windows case, so I have removed it.
        (It makes no difference on Unix-like systems.)

17. Added a new limit, MATCH_LIMIT_RECURSION, which limits the depth of nesting
    of recursive calls to match(). This is different to MATCH_LIMIT because
    that limits the total number of calls to match(), not all of which increase
    the depth of recursion. Limiting the recursion depth limits the amount of
    stack (or heap if NO_RECURSE is set) that is used. The default can be set
    when PCRE is compiled, and changed at run time. A patch from Google adds
    this functionality to the C++ interface.

18. Changes to the handling of Unicode character properties:

    (a) Updated the table to Unicode 4.1.0.

    (b) Recognize characters that are not in the table as "Cn" (undefined).

    (c) I revised the way the table is implemented to a much improved format
        which includes recognition of ranges. It now supports the ranges that
        are defined in UnicodeData.txt, and it also amalgamates other
        characters into ranges. This has reduced the number of entries in the
        table from around 16,000 to around 3,000, thus reducing its size
        considerably. I realized I did not need to use a tree structure after
        all - a binary chop search is just as efficient. Having reduced the
        number of entries, I extended their size from 6 bytes to 8 bytes to
        allow for more data.

    (d) Added support for Unicode script names via properties such as \p{Han}.

19. In UTF-8 mode, a backslash followed by a non-Ascii character was not
    matching that character.

20. When matching a repeated Unicode property with a minimum greater than zero,
    (for example \pL{2,}), PCRE could look past the end of the subject if it
    reached it while seeking the minimum number of characters. This could
    happen only if some of the characters were more than one byte long, because
    there is a check for at least the minimum number of bytes.

21. Refactored the implementation of \p and \P so as to be more general, to
    allow for more different types of property in future. This has changed the
    compiled form incompatibly. Anybody with saved compiled patterns that use
    \p or \P will have to recompile them.

22. Added "Any" and "L&" to the supported property types.

23. Recognize \x{...} as a code point specifier, even when not in UTF-8 mode,
    but give a compile time error if the value is greater than 0xff.

24. The man pages for pcrepartial, pcreprecompile, and pcre_compile2 were
    accidentally not being installed or uninstalled.

25. The pcre.h file was built from pcre.h.in, but the only changes that were
    made were to insert the current release number. This seemed silly, because
    it made things harder for people building PCRE on systems that don't run
    "configure". I have turned pcre.h into a distributed file, no longer built
    by "configure", with the version identification directly included. There is
    no longer a pcre.h.in file.

    However, this change necessitated a change to the pcre-config script as
    well. It is built from pcre-config.in, and one of the substitutions was the
    release number. I have updated configure.ac so that ./configure now finds
    the release number by grepping pcre.h.

26. Added the ability to run the tests under valgrind.


Version 6.4 05-Sep-05
---------------------

 1. Change 6.0/10/(l) to pcregrep introduced a bug that caused separator lines
    "--" to be printed when multiple files were scanned, even when none of the
    -A, -B, or -C options were used. This is not compatible with Gnu grep, so I
    consider it to be a bug, and have restored the previous behaviour.

 2. A couple of code tidies to get rid of compiler warnings.

 3. The pcretest program used to cheat by referring to symbols in the library
    whose names begin with _pcre_. These are internal symbols that are not
    really supposed to be visible externally, and in some environments it is
    possible to suppress them. The cheating is now confined to including
    certain files from the library's source, which is a bit cleaner.

 4. Renamed pcre.in as pcre.h.in to go with pcrecpp.h.in; it also makes the
    file's purpose clearer.

 5. Reorganized pcre_ucp_findchar().


Version 6.3 15-Aug-05
---------------------

 1. The file libpcre.pc.in did not have general read permission in the tarball.

 2. There were some problems when building without C++ support:

    (a) If C++ support was not built, "make install" and "make test" still
        tried to test it.

    (b) There were problems when the value of CXX was explicitly set. Some
        changes have been made to try to fix these, and ...

    (c) --disable-cpp can now be used to explicitly disable C++ support.

    (d) The use of @CPP_OBJ@ directly caused a blank line preceded by a
        backslash in a target when C++ was disabled. This confuses some
        versions of "make", apparently. Using an intermediate variable solves
        this. (Same for CPP_LOBJ.)

 3. $(LINK_FOR_BUILD) now includes $(CFLAGS_FOR_BUILD) and $(LINK)
    (non-Windows) now includes $(CFLAGS) because these flags are sometimes
    necessary on certain architectures.

 4. Added a setting of -export-symbols-regex to the link command to remove
    those symbols that are exported in the C sense, but actually are local
    within the library, and not documented. Their names all begin with
    "_pcre_". This is not a perfect job, because (a) we have to except some
    symbols that pcretest ("illegally") uses, and (b) the facility isn't always
    available (and never for static libraries). I have made a note to try to
    find a way round (a) in the future.


Version 6.2 01-Aug-05
---------------------

 1. There was no test for integer overflow of quantifier values. A construction
    such as {1111111111111111} would give undefined results. What is worse, if
    a minimum quantifier for a parenthesized subpattern overflowed and became
    negative, the calculation of the memory size went wrong. This could have
    led to memory overwriting.

 2. Building PCRE using VPATH was broken. Hopefully it is now fixed.

 3. Added "b" to the 2nd argument of fopen() in dftables.c, for non-Unix-like
    operating environments where this matters.

 4. Applied Giuseppe Maxia's patch to add additional features for controlling
    PCRE options from within the C++ wrapper.

 5. Named capturing subpatterns were not being correctly counted when a pattern
    was compiled. This caused two problems: (a) If there were more than 100
    such subpatterns, the calculation of the memory needed for the whole
    compiled pattern went wrong, leading to an overflow error. (b) Numerical
    back references of the form \12, where the number was greater than 9, were
    not recognized as back references, even though there were sufficient
    previous subpatterns.

 6. Two minor patches to pcrecpp.cc in order to allow it to compile on older
    versions of gcc, e.g. 2.95.4.


Version 6.1 21-Jun-05
---------------------

 1. There was one reference to the variable "posix" in pcretest.c that was not
    surrounded by "#if !defined NOPOSIX".

 2. Make it possible to compile pcretest without DFA support, UTF8 support, or
    the cross-check on the old pcre_info() function, for the benefit of the
    cut-down version of PCRE that is currently imported into Exim.

 3. A (silly) pattern starting with (?i)(?-i) caused an internal space
    allocation error. I've done the easy fix, which wastes 2 bytes for sensible
    patterns that start (?i) but I don't think that matters. The use of (?i) is
    just an example; this all applies to the other options as well.

 4. Since libtool seems to echo the compile commands it is issuing, the output
    from "make" can be reduced a bit by putting "@" in front of each libtool
    compile command.

 5. Patch from the folks at Google for configure.in to be a bit more thorough
    in checking for a suitable C++ installation before trying to compile the
    C++ stuff. This should fix a reported problem when a compiler was present,
    but no suitable headers.

 6. The man pages all had just "PCRE" as their title. I have changed them to
    be the relevant file name. I have also arranged that these names are
    retained in the file doc/pcre.txt, which is a concatenation in text format
    of all the man pages except the little individual ones for each function.

 7. The NON-UNIX-USE file had not been updated for the different set of source
    files that come with release 6. I also added a few comments about the C++
    wrapper.


Version 6.0 07-Jun-05
---------------------

 1. Some minor internal re-organization to help with my DFA experiments.

 2. Some missing #ifdef SUPPORT_UCP conditionals in pcretest and printint that
    didn't matter for the library itself when fully configured, but did matter
    when compiling without UCP support, or within Exim, where the ucp files are
    not imported.

 3. Refactoring of the library code to split up the various functions into
    different source modules. The addition of the new DFA matching code (see
    below) to a single monolithic source would have made it really too
    unwieldy, quite apart from causing all the code to be include in a
    statically linked application, when only some functions are used. This is
    relevant even without the DFA addition now that patterns can be compiled in
    one application and matched in another.

    The downside of splitting up is that there have to be some external
    functions and data tables that are used internally in different modules of
    the library but which are not part of the API. These have all had their
    names changed to start with "_pcre_" so that they are unlikely to clash
    with other external names.

 4. Added an alternate matching function, pcre_dfa_exec(), which matches using
    a different (DFA) algorithm. Although it is slower than the original
    function, it does have some advantages for certain types of matching
    problem.

 5. Upgrades to pcretest in order to test the features of pcre_dfa_exec(),
    including restarting after a partial match.

 6. A patch for pcregrep that defines INVALID_FILE_ATTRIBUTES if it is not
    defined when compiling for Windows was sent to me. I have put it into the
    code, though I have no means of testing or verifying it.

 7. Added the pcre_refcount() auxiliary function.

 8. Added the PCRE_FIRSTLINE option. This constrains an unanchored pattern to
    match before or at the first newline in the subject string. In pcretest,
    the /f option on a pattern can be used to set this.

 9. A repeated \w when used in UTF-8 mode with characters greater than 256
    would behave wrongly. This has been present in PCRE since release 4.0.

10. A number of changes to the pcregrep command:

    (a) Refactored how -x works; insert ^(...)$ instead of setting
        PCRE_ANCHORED and checking the length, in preparation for adding
        something similar for -w.

    (b) Added the -w (match as a word) option.

    (c) Refactored the way lines are read and buffered so as to have more
        than one at a time available.

    (d) Implemented a pcregrep test script.

    (e) Added the -M (multiline match) option. This allows patterns to match
        over several lines of the subject. The buffering ensures that at least
        8K, or the rest of the document (whichever is the shorter) is available
        for matching (and similarly the previous 8K for lookbehind assertions).

    (f) Changed the --help output so that it now says

          -w, --word-regex(p)

        instead of two lines, one with "regex" and the other with "regexp"
        because that confused at least one person since the short forms are the
        same. (This required a bit of code, as the output is generated
        automatically from a table. It wasn't just a text change.)

    (g) -- can be used to terminate pcregrep options if the next thing isn't an
        option but starts with a hyphen. Could be a pattern or a path name
        starting with a hyphen, for instance.

    (h) "-" can be given as a file name to represent stdin.

    (i) When file names are being printed, "(standard input)" is used for
        the standard input, for compatibility with GNU grep. Previously
        "<stdin>" was used.

    (j) The option --label=xxx can be used to supply a name to be used for
        stdin when file names are being printed. There is no short form.

    (k) Re-factored the options decoding logic because we are going to add
        two more options that take data. Such options can now be given in four
        different ways, e.g. "-fname", "-f name", "--file=name", "--file name".

    (l) Added the -A, -B, and -C options for requesting that lines of context
        around matches be printed.

    (m) Added the -L option to print the names of files that do not contain
        any matching lines, that is, the complement of -l.

    (n) The return code is 2 if any file cannot be opened, but pcregrep does
        continue to scan other files.

    (o) The -s option was incorrectly implemented. For compatibility with other
        greps, it now suppresses the error message for a non-existent or non-
        accessible file (but not the return code). There is a new option called
        -q that suppresses the output of matching lines, which was what -s was
        previously doing.

    (p) Added --include and --exclude options to specify files for inclusion
        and exclusion when recursing.

11. The Makefile was not using the Autoconf-supported LDFLAGS macro properly.
    Hopefully, it now does.

12. Missing cast in pcre_study().

13. Added an "uninstall" target to the makefile.

14. Replaced "extern" in the function prototypes in Makefile.in with
    "PCRE_DATA_SCOPE", which defaults to 'extern' or 'extern "C"' in the Unix
    world, but is set differently for Windows.

15. Added a second compiling function called pcre_compile2(). The only
    difference is that it has an extra argument, which is a pointer to an
    integer error code. When there is a compile-time failure, this is set
    non-zero, in addition to the error test pointer being set to point to an
    error message. The new argument may be NULL if no error number is required
    (but then you may as well call pcre_compile(), which is now just a
    wrapper). This facility is provided because some applications need a
    numeric error indication, but it has also enabled me to tidy up the way
    compile-time errors are handled in the POSIX wrapper.

16. Added VPATH=.libs to the makefile; this should help when building with one
    prefix path and installing with another. (Or so I'm told by someone who
    knows more about this stuff than I do.)

17. Added a new option, REG_DOTALL, to the POSIX function regcomp(). This
    passes PCRE_DOTALL to the pcre_compile() function, making the "." character
    match everything, including newlines. This is not POSIX-compatible, but
    somebody wanted the feature. From pcretest it can be activated by using
    both the P and the s flags.

18. AC_PROG_LIBTOOL appeared twice in Makefile.in. Removed one.

19. libpcre.pc was being incorrectly installed as executable.

20. A couple of places in pcretest check for end-of-line by looking for '\n';
    it now also looks for '\r' so that it will work unmodified on Windows.

21. Added Google's contributed C++ wrapper to the distribution.

22. Added some untidy missing memory free() calls in pcretest, to keep
    Electric Fence happy when testing.



Version 5.0 13-Sep-04
---------------------

 1. Internal change: literal characters are no longer packed up into items
    containing multiple characters in a single byte-string. Each character
    is now matched using a separate opcode. However, there may be more than one
    byte in the character in UTF-8 mode.

 2. The pcre_callout_block structure has two new fields: pattern_position and
    next_item_length. These contain the offset in the pattern to the next match
    item, and its length, respectively.

 3. The PCRE_AUTO_CALLOUT option for pcre_compile() requests the automatic
    insertion of callouts before each pattern item. Added the /C option to
    pcretest to make use of this.

 4. On the advice of a Windows user, the lines

      #if defined(_WIN32) || defined(WIN32)
      _setmode( _fileno( stdout ), 0x8000 );
      #endif  /* defined(_WIN32) || defined(WIN32) */

    have been added to the source of pcretest. This apparently does useful
    magic in relation to line terminators.

 5. Changed "r" and "w" in the calls to fopen() in pcretest to "rb" and "wb"
    for the benefit of those environments where the "b" makes a difference.

 6. The icc compiler has the same options as gcc, but "configure" doesn't seem
    to know about it. I have put a hack into configure.in that adds in code
    to set GCC=yes if CC=icc. This seems to end up at a point in the
    generated configure script that is early enough to affect the setting of
    compiler options, which is what is needed, but I have no means of testing
    whether it really works. (The user who reported this had patched the
    generated configure script, which of course I cannot do.)

    LATER: After change 22 below (new libtool files), the configure script
    seems to know about icc (and also ecc). Therefore, I have commented out
    this hack in configure.in.

 7. Added support for pkg-config (2 patches were sent in).

 8. Negated POSIX character classes that used a combination of internal tables
    were completely broken. These were [[:^alpha:]], [[:^alnum:]], and
    [[:^ascii]]. Typically, they would match almost any characters. The other
    POSIX classes were not broken in this way.

 9. Matching the pattern "\b.*?" against "ab cd", starting at offset 1, failed
    to find the match, as PCRE was deluded into thinking that the match had to
    start at the start point or following a newline. The same bug applied to
    patterns with negative forward assertions or any backward assertions
    preceding ".*" at the start, unless the pattern required a fixed first
    character. This was a failing pattern: "(?!.bcd).*". The bug is now fixed.

10. In UTF-8 mode, when moving forwards in the subject after a failed match
    starting at the last subject character, bytes beyond the end of the subject
    string were read.

11. Renamed the variable "class" as "classbits" to make life easier for C++
    users. (Previously there was a macro definition, but it apparently wasn't
    enough.)

12. Added the new field "tables" to the extra data so that tables can be passed
    in at exec time, or the internal tables can be re-selected. This allows
    a compiled regex to be saved and re-used at a later time by a different
    program that might have everything at different addresses.

13. Modified the pcre-config script so that, when run on Solaris, it shows a
    -R library as well as a -L library.

14. The debugging options of pcretest (-d on the command line or D on a
    pattern) showed incorrect output for anything following an extended class
    that contained multibyte characters and which was followed by a quantifier.

15. Added optional support for general category Unicode character properties
    via the \p, \P, and \X escapes. Unicode property support implies UTF-8
    support. It adds about 90K to the size of the library. The meanings of the
    inbuilt class escapes such as \d and \s have NOT been changed.

16. Updated pcredemo.c to include calls to free() to release the memory for the
    compiled pattern.

17. The generated file chartables.c was being created in the source directory
    instead of in the building directory. This caused the build to fail if the
    source directory was different from the building directory, and was
    read-only.

18. Added some sample Win commands from Mark Tetrode into the NON-UNIX-USE
    file. No doubt somebody will tell me if they don't make sense... Also added
    Dan Mooney's comments about building on OpenVMS.

19. Added support for partial matching via the PCRE_PARTIAL option for
    pcre_exec() and the \P data escape in pcretest.

20. Extended pcretest with 3 new pattern features:

    (i)   A pattern option of the form ">rest-of-line" causes pcretest to
          write the compiled pattern to the file whose name is "rest-of-line".
          This is a straight binary dump of the data, with the saved pointer to
          the character tables forced to be NULL. The study data, if any, is
          written too. After writing, pcretest reads a new pattern.

    (ii)  If, instead of a pattern, "<rest-of-line" is given, pcretest reads a
          compiled pattern from the given file. There must not be any
          occurrences of "<" in the file name (pretty unlikely); if there are,
          pcretest will instead treat the initial "<" as a pattern delimiter.
          After reading in the pattern, pcretest goes on to read data lines as
          usual.

    (iii) The F pattern option causes pcretest to flip the bytes in the 32-bit
          and 16-bit fields in a compiled pattern, to simulate a pattern that
          was compiled on a host of opposite endianness.

21. The pcre-exec() function can now cope with patterns that were compiled on
    hosts of opposite endianness, with this restriction:

      As for any compiled expression that is saved and used later, the tables
      pointer field cannot be preserved; the extra_data field in the arguments
      to pcre_exec() should be used to pass in a tables address if a value
      other than the default internal tables were used at compile time.

22. Calling pcre_exec() with a negative value of the "ovecsize" parameter is
    now diagnosed as an error. Previously, most of the time, a negative number
    would have been treated as zero, but if in addition "ovector" was passed as
    NULL, a crash could occur.

23. Updated the files ltmain.sh, config.sub, config.guess, and aclocal.m4 with
    new versions from the libtool 1.5 distribution (the last one is a copy of
    a file called libtool.m4). This seems to have fixed the need to patch
    "configure" to support Darwin 1.3 (which I used to do). However, I still
    had to patch ltmain.sh to ensure that ${SED} is set (it isn't on my
    workstation).

24. Changed the PCRE licence to be the more standard "BSD" licence.


Version 4.5 01-Dec-03
---------------------

 1. There has been some re-arrangement of the code for the match() function so
    that it can be compiled in a version that does not call itself recursively.
    Instead, it keeps those local variables that need separate instances for
    each "recursion" in a frame on the heap, and gets/frees frames whenever it
    needs to "recurse". Keeping track of where control must go is done by means
    of setjmp/longjmp. The whole thing is implemented by a set of macros that
    hide most of the details from the main code, and operates only if
    NO_RECURSE is defined while compiling pcre.c. If PCRE is built using the
    "configure" mechanism, "--disable-stack-for-recursion" turns on this way of
    operating.

    To make it easier for callers to provide specially tailored get/free
    functions for this usage, two new functions, pcre_stack_malloc, and
    pcre_stack_free, are used. They are always called in strict stacking order,
    and the size of block requested is always the same.

    The PCRE_CONFIG_STACKRECURSE info parameter can be used to find out whether
    PCRE has been compiled to use the stack or the heap for recursion. The
    -C option of pcretest uses this to show which version is compiled.

    A new data escape \S, is added to pcretest; it causes the amounts of store
    obtained and freed by both kinds of malloc/free at match time to be added
    to the output.

 2. Changed the locale test to use "fr_FR" instead of "fr" because that's
    what's available on my current Linux desktop machine.

 3. When matching a UTF-8 string, the test for a valid string at the start has
    been extended. If start_offset is not zero, PCRE now checks that it points
    to a byte that is the start of a UTF-8 character. If not, it returns
    PCRE_ERROR_BADUTF8_OFFSET (-11). Note: the whole string is still checked;
    this is necessary because there may be backward assertions in the pattern.
    When matching the same subject several times, it may save resources to use
    PCRE_NO_UTF8_CHECK on all but the first call if the string is long.

 4. The code for checking the validity of UTF-8 strings has been tightened so
    that it rejects (a) strings containing 0xfe or 0xff bytes and (b) strings
    containing "overlong sequences".

 5. Fixed a bug (appearing twice) that I could not find any way of exploiting!
    I had written "if ((digitab[*p++] && chtab_digit) == 0)" where the "&&"
    should have been "&", but it just so happened that all the cases this let
    through by mistake were picked up later in the function.

 6. I had used a variable called "isblank" - this is a C99 function, causing
    some compilers to warn. To avoid this, I renamed it (as "blankclass").

 7. Cosmetic: (a) only output another newline at the end of pcretest if it is
    prompting; (b) run "./pcretest /dev/null" at the start of the test script
    so the version is shown; (c) stop "make test" echoing "./RunTest".

 8. Added patches from David Burgess to enable PCRE to run on EBCDIC systems.

 9. The prototype for memmove() for systems that don't have it was using
    size_t, but the inclusion of the header that defines size_t was later. I've
    moved the #includes for the C headers earlier to avoid this.

10. Added some adjustments to the code to make it easier to compiler on certain
    special systems:

      (a) Some "const" qualifiers were missing.
      (b) Added the macro EXPORT before all exported functions; by default this
          is defined to be empty.
      (c) Changed the dftables auxiliary program (that builds chartables.c) so
          that it reads its output file name as an argument instead of writing
          to the standard output and assuming this can be redirected.

11. In UTF-8 mode, if a recursive reference (e.g. (?1)) followed a character
    class containing characters with values greater than 255, PCRE compilation
    went into a loop.

12. A recursive reference to a subpattern that was within another subpattern
    that had a minimum quantifier of zero caused PCRE to crash. For example,
    (x(y(?2))z)? provoked this bug with a subject that got as far as the
    recursion. If the recursively-called subpattern itself had a zero repeat,
    that was OK.

13. In pcretest, the buffer for reading a data line was set at 30K, but the
    buffer into which it was copied (for escape processing) was still set at
    1024, so long lines caused crashes.

14. A pattern such as /[ab]{1,3}+/ failed to compile, giving the error
    "internal error: code overflow...". This applied to any character class
    that was followed by a possessive quantifier.

15. Modified the Makefile to add libpcre.la as a prerequisite for
    libpcreposix.la because I was told this is needed for a parallel build to
    work.

16. If a pattern that contained .* following optional items at the start was
    studied, the wrong optimizing data was generated, leading to matching
    errors. For example, studying /[ab]*.*c/ concluded, erroneously, that any
    matching string must start with a or b or c. The correct conclusion for
    this pattern is that a match can start with any character.


Version 4.4 13-Aug-03
---------------------

 1. In UTF-8 mode, a character class containing characters with values between
    127 and 255 was not handled correctly if the compiled pattern was studied.
    In fixing this, I have also improved the studying algorithm for such
    classes (slightly).

 2. Three internal functions had redundant arguments passed to them. Removal
    might give a very teeny performance improvement.

 3. Documentation bug: the value of the capture_top field in a callout is *one
    more than* the number of the hightest numbered captured substring.

 4. The Makefile linked pcretest and pcregrep with -lpcre, which could result
    in incorrectly linking with a previously installed version. They now link
    explicitly with libpcre.la.

 5. configure.in no longer needs to recognize Cygwin specially.

 6. A problem in pcre.in for Windows platforms is fixed.

 7. If a pattern was successfully studied, and the -d (or /D) flag was given to
    pcretest, it used to include the size of the study block as part of its
    output. Unfortunately, the structure contains a field that has a different
    size on different hardware architectures. This meant that the tests that
    showed this size failed. As the block is currently always of a fixed size,
    this information isn't actually particularly useful in pcretest output, so
    I have just removed it.

 8. Three pre-processor statements accidentally did not start in column 1.
    Sadly, there are *still* compilers around that complain, even though
    standard C has not required this for well over a decade. Sigh.

 9. In pcretest, the code for checking callouts passed small integers in the
    callout_data field, which is a void * field. However, some picky compilers
    complained about the casts involved for this on 64-bit systems. Now
    pcretest passes the address of the small integer instead, which should get
    rid of the warnings.

10. By default, when in UTF-8 mode, PCRE now checks for valid UTF-8 strings at
    both compile and run time, and gives an error if an invalid UTF-8 sequence
    is found. There is a option for disabling this check in cases where the
    string is known to be correct and/or the maximum performance is wanted.

11. In response to a bug report, I changed one line in Makefile.in from

        -Wl,--out-implib,.libs/lib@WIN_PREFIX@pcreposix.dll.a \
    to
        -Wl,--out-implib,.libs/@WIN_PREFIX@libpcreposix.dll.a \

    to look similar to other lines, but I have no way of telling whether this
    is the right thing to do, as I do not use Windows. No doubt I'll get told
    if it's wrong...


Version 4.3 21-May-03
---------------------

1. Two instances of @WIN_PREFIX@ omitted from the Windows targets in the
   Makefile.

2. Some refactoring to improve the quality of the code:

   (i)   The utf8_table... variables are now declared "const".

   (ii)  The code for \cx, which used the "case flipping" table to upper case
         lower case letters, now just substracts 32. This is ASCII-specific,
         but the whole concept of \cx is ASCII-specific, so it seems
         reasonable.

   (iii) PCRE was using its character types table to recognize decimal and
         hexadecimal digits in the pattern. This is silly, because it handles
         only 0-9, a-f, and A-F, but the character types table is locale-
         specific, which means strange things might happen. A private
         table is now used for this - though it costs 256 bytes, a table is
         much faster than multiple explicit tests. Of course, the standard
         character types table is still used for matching digits in subject
         strings against \d.

   (iv)  Strictly, the identifier ESC_t is reserved by POSIX (all identifiers
         ending in _t are). So I've renamed it as ESC_tee.

3. The first argument for regexec() in the POSIX wrapper should have been
   defined as "const".

4. Changed pcretest to use malloc() for its buffers so that they can be
   Electric Fenced for debugging.

5. There were several places in the code where, in UTF-8 mode, PCRE would try
   to read one or more bytes before the start of the subject string. Often this
   had no effect on PCRE's behaviour, but in some circumstances it could
   provoke a segmentation fault.

6. A lookbehind at the start of a pattern in UTF-8 mode could also cause PCRE
   to try to read one or more bytes before the start of the subject string.

7. A lookbehind in a pattern matched in non-UTF-8 mode on a PCRE compiled with
   UTF-8 support could misbehave in various ways if the subject string
   contained bytes with the 0x80 bit set and the 0x40 bit unset in a lookbehind
   area. (PCRE was not checking for the UTF-8 mode flag, and trying to move
   back over UTF-8 characters.)


Version 4.2 14-Apr-03
---------------------

1. Typo "#if SUPPORT_UTF8" instead of "#ifdef SUPPORT_UTF8" fixed.

2. Changes to the building process, supplied by Ronald Landheer-Cieslak
     [ON_WINDOWS]: new variable, "#" on non-Windows platforms
     [NOT_ON_WINDOWS]: new variable, "#" on Windows platforms
     [WIN_PREFIX]: new variable, "cyg" for Cygwin
     * Makefile.in: use autoconf substitution for OBJEXT, EXEEXT, BUILD_OBJEXT
       and BUILD_EXEEXT
     Note: automatic setting of the BUILD variables is not yet working
     set CPPFLAGS and BUILD_CPPFLAGS (but don't use yet) - should be used at
       compile-time but not at link-time
     [LINK]: use for linking executables only
     make different versions for Windows and non-Windows
     [LINKLIB]: new variable, copy of UNIX-style LINK, used for linking
       libraries
     [LINK_FOR_BUILD]: new variable
     [OBJEXT]: use throughout
     [EXEEXT]: use throughout
     <winshared>: new target
     <wininstall>: new target
     <dftables.o>: use native compiler
     <dftables>: use native linker
     <install>: handle Windows platform correctly
     <clean>: ditto
     <check>: ditto
     copy DLL to top builddir before testing

   As part of these changes, -no-undefined was removed again. This was reported
   to give trouble on HP-UX 11.0, so getting rid of it seems like a good idea
   in any case.

3. Some tidies to get rid of compiler warnings:

   . In the match_data structure, match_limit was an unsigned long int, whereas
     match_call_count was an int. I've made them both unsigned long ints.

   . In pcretest the fact that a const uschar * doesn't automatically cast to
     a void * provoked a warning.

   . Turning on some more compiler warnings threw up some "shadow" variables
     and a few more missing casts.

4. If PCRE was complied with UTF-8 support, but called without the PCRE_UTF8
   option, a class that contained a single character with a value between 128
   and 255 (e.g. /[\xFF]/) caused PCRE to crash.

5. If PCRE was compiled with UTF-8 support, but called without the PCRE_UTF8
   option, a class that contained several characters, but with at least one
   whose value was between 128 and 255 caused PCRE to crash.


Version 4.1 12-Mar-03
---------------------

1. Compiling with gcc -pedantic found a couple of places where casts were
needed, and a string in dftables.c that was longer than standard compilers are
required to support.

2. Compiling with Sun's compiler found a few more places where the code could
be tidied up in order to avoid warnings.

3. The variables for cross-compiling were called HOST_CC and HOST_CFLAGS; the
first of these names is deprecated in the latest Autoconf in favour of the name
CC_FOR_BUILD, because "host" is typically used to mean the system on which the
compiled code will be run. I can't find a reference for HOST_CFLAGS, but by
analogy I have changed it to CFLAGS_FOR_BUILD.

4. Added -no-undefined to the linking command in the Makefile, because this is
apparently helpful for Windows. To make it work, also added "-L. -lpcre" to the
linking step for the pcreposix library.

5. PCRE was failing to diagnose the case of two named groups with the same
name.

6. A problem with one of PCRE's optimizations was discovered. PCRE remembers a
literal character that is needed in the subject for a match, and scans along to
ensure that it is present before embarking on the full matching process. This
saves time in cases of nested unlimited repeats that are never going to match.
Problem: the scan can take a lot of time if the subject is very long (e.g.
megabytes), thus penalizing straightforward matches. It is now done only if the
amount of subject to be scanned is less than 1000 bytes.

7. A lesser problem with the same optimization is that it was recording the
first character of an anchored pattern as "needed", thus provoking a search
right along the subject, even when the first match of the pattern was going to
fail. The "needed" character is now not set for anchored patterns, unless it
follows something in the pattern that is of non-fixed length. Thus, it still
fulfils its original purpose of finding quick non-matches in cases of nested
unlimited repeats, but isn't used for simple anchored patterns such as /^abc/.


Version 4.0 17-Feb-03
---------------------

1. If a comment in an extended regex that started immediately after a meta-item
extended to the end of string, PCRE compiled incorrect data. This could lead to
all kinds of weird effects. Example: /#/ was bad; /()#/ was bad; /a#/ was not.

2. Moved to autoconf 2.53 and libtool 1.4.2.

3. Perl 5.8 no longer needs "use utf8" for doing UTF-8 things. Consequently,
the special perltest8 script is no longer needed - all the tests can be run
from a single perltest script.

4. From 5.004, Perl has not included the VT character (0x0b) in the set defined
by \s. It has now been removed in PCRE. This means it isn't recognized as
whitespace in /x regexes too, which is the same as Perl. Note that the POSIX
class [:space:] *does* include VT, thereby creating a mess.

5. Added the class [:blank:] (a GNU extension from Perl 5.8) to match only
space and tab.

6. Perl 5.005 was a long time ago. It's time to amalgamate the tests that use
its new features into the main test script, reducing the number of scripts.

7. Perl 5.8 has changed the meaning of patterns like /a(?i)b/. Earlier versions
were backward compatible, and made the (?i) apply to the whole pattern, as if
/i were given. Now it behaves more logically, and applies the option setting
only to what follows. PCRE has been changed to follow suit. However, if it
finds options settings right at the start of the pattern, it extracts them into
the global options, as before. Thus, they show up in the info data.

8. Added support for the \Q...\E escape sequence. Characters in between are
treated as literals. This is slightly different from Perl in that $ and @ are
also handled as literals inside the quotes. In Perl, they will cause variable
interpolation. Note the following examples:

    Pattern            PCRE matches      Perl matches

    \Qabc$xyz\E        abc$xyz           abc followed by the contents of $xyz
    \Qabc\$xyz\E       abc\$xyz          abc\$xyz
    \Qabc\E\$\Qxyz\E   abc$xyz           abc$xyz

For compatibility with Perl, \Q...\E sequences are recognized inside character
classes as well as outside them.

9. Re-organized 3 code statements in pcretest to avoid "overflow in
floating-point constant arithmetic" warnings from a Microsoft compiler. Added a
(size_t) cast to one statement in pcretest and one in pcreposix to avoid
signed/unsigned warnings.

10. SunOS4 doesn't have strtoul(). This was used only for unpicking the -o
option for pcretest, so I've replaced it by a simple function that does just
that job.

11. pcregrep was ending with code 0 instead of 2 for the commands "pcregrep" or
"pcregrep -".

12. Added "possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's
Java package. This provides some syntactic sugar for simple cases of what my
documentation calls "once-only subpatterns". A pattern such as x*+ is the same
as (?>x*). In other words, if what is inside (?>...) is just a single repeated
item, you can use this simplified notation. Note that only makes sense with
greedy quantifiers. Consequently, the use of the possessive quantifier forces
greediness, whatever the setting of the PCRE_UNGREEDY option.

13. A change of greediness default within a pattern was not taking effect at
the current level for patterns like /(b+(?U)a+)/. It did apply to parenthesized
subpatterns that followed. Patterns like /b+(?U)a+/ worked because the option
was abstracted outside.

14. PCRE now supports the \G assertion. It is true when the current matching
position is at the start point of the match. This differs from \A when the
starting offset is non-zero. Used with the /g option of pcretest (or similar
code), it works in the same way as it does for Perl's /g option. If all
alternatives of a regex begin with \G, the expression is anchored to the start
match position, and the "anchored" flag is set in the compiled expression.

15. Some bugs concerning the handling of certain option changes within patterns
have been fixed. These applied to options other than (?ims). For example,
"a(?x: b c )d" did not match "XabcdY" but did match "Xa b c dY". It should have
been the other way round. Some of this was related to change 7 above.

16. PCRE now gives errors for /[.x.]/ and /[=x=]/ as unsupported POSIX
features, as Perl does. Previously, PCRE gave the warnings only for /[[.x.]]/
and /[[=x=]]/. PCRE now also gives an error for /[:name:]/ because it supports
POSIX classes only within a class (e.g. /[[:alpha:]]/).

17. Added support for Perl's \C escape. This matches one byte, even in UTF8
mode. Unlike ".", it always matches newline, whatever the setting of
PCRE_DOTALL. However, PCRE does not permit \C to appear in lookbehind
assertions. Perl allows it, but it doesn't (in general) work because it can't
calculate the length of the lookbehind. At least, that's the case for Perl
5.8.0 - I've been told they are going to document that it doesn't work in
future.

18. Added an error diagnosis for escapes that PCRE does not support: these are
\L, \l, \N, \P, \p, \U, \u, and \X.

19. Although correctly diagnosing a missing ']' in a character class, PCRE was
reading past the end of the pattern in cases such as /[abcd/.

20. PCRE was getting more memory than necessary for patterns with classes that
contained both POSIX named classes and other characters, e.g. /[[:space:]abc/.

21. Added some code, conditional on #ifdef VPCOMPAT, to make life easier for
compiling PCRE for use with Virtual Pascal.

22. Small fix to the Makefile to make it work properly if the build is done
outside the source tree.

23. Added a new extension: a condition to go with recursion. If a conditional
subpattern starts with (?(R) the "true" branch is used if recursion has
happened, whereas the "false" branch is used only at the top level.

24. When there was a very long string of literal characters (over 255 bytes
without UTF support, over 250 bytes with UTF support), the computation of how
much memory was required could be incorrect, leading to segfaults or other
strange effects.

25. PCRE was incorrectly assuming anchoring (either to start of subject or to
start of line for a non-DOTALL pattern) when a pattern started with (.*) and
there was a subsequent back reference to those brackets. This meant that, for
example, /(.*)\d+\1/ failed to match "abc123bc". Unfortunately, it isn't
possible to check for precisely this case. All we can do is abandon the
optimization if .* occurs inside capturing brackets when there are any back
references whatsoever. (See below for a better fix that came later.)

26. The handling of the optimization for finding the first character of a
non-anchored pattern, and for finding a character that is required later in the
match were failing in some cases. This didn't break the matching; it just
failed to optimize when it could. The way this is done has been re-implemented.

27. Fixed typo in error message for invalid (?R item (it said "(?p").

28. Added a new feature that provides some of the functionality that Perl
provides with (?{...}). The facility is termed a "callout". The way it is done
in PCRE is for the caller to provide an optional function, by setting
pcre_callout to its entry point. Like pcre_malloc and pcre_free, this is a
global variable. By default it is unset, which disables all calling out. To get
the function called, the regex must include (?C) at appropriate points. This
is, in fact, equivalent to (?C0), and any number <= 255 may be given with (?C).
This provides a means of identifying different callout points. When PCRE
reaches such a point in the regex, if pcre_callout has been set, the external
function is called. It is provided with data in a structure called
pcre_callout_block, which is defined in pcre.h. If the function returns 0,
matching continues; if it returns a non-zero value, the match at the current
point fails. However, backtracking will occur if possible. [This was changed
later and other features added - see item 49 below.]

29. pcretest is upgraded to test the callout functionality. It provides a
callout function that displays information. By default, it shows the start of
the match and the current position in the text. There are some new data escapes
to vary what happens:

    \C+         in addition, show current contents of captured substrings
    \C-         do not supply a callout function
    \C!n        return 1 when callout number n is reached
    \C!n!m      return 1 when callout number n is reached for the mth time

30. If pcregrep was called with the -l option and just a single file name, it
output "<stdin>" if a match was found, instead of the file name.

31. Improve the efficiency of the POSIX API to PCRE. If the number of capturing
slots is less than POSIX_MALLOC_THRESHOLD, use a block on the stack to pass to
pcre_exec(). This saves a malloc/free per call. The default value of
POSIX_MALLOC_THRESHOLD is 10; it can be changed by --with-posix-malloc-threshold
when configuring.

32. The default maximum size of a compiled pattern is 64K. There have been a
few cases of people hitting this limit. The code now uses macros to handle the
storing of links as offsets within the compiled pattern. It defaults to 2-byte
links, but this can be changed to 3 or 4 bytes by --with-link-size when
configuring. Tests 2 and 5 work only with 2-byte links because they output
debugging information about compiled patterns.

33. Internal code re-arrangements:

(a) Moved the debugging function for printing out a compiled regex into
    its own source file (printint.c) and used #include to pull it into
    pcretest.c and, when DEBUG is defined, into pcre.c, instead of having two
    separate copies.

(b) Defined the list of op-code names for debugging as a macro in
    internal.h so that it is next to the definition of the opcodes.

(c) Defined a table of op-code lengths for simpler skipping along compiled
    code. This is again a macro in internal.h so that it is next to the
    definition of the opcodes.

34. Added support for recursive calls to individual subpatterns, along the
lines of Robin Houston's patch (but implemented somewhat differently).

35. Further mods to the Makefile to help Win32. Also, added code to pcregrep to
allow it to read and process whole directories in Win32. This code was
contributed by Lionel Fourquaux; it has not been tested by me.

36. Added support for named subpatterns. The Python syntax (?P<name>...) is
used to name a group. Names consist of alphanumerics and underscores, and must
be unique. Back references use the syntax (?P=name) and recursive calls use
(?P>name) which is a PCRE extension to the Python extension. Groups still have
numbers. The function pcre_fullinfo() can be used after compilation to extract
a name/number map. There are three relevant calls:

  PCRE_INFO_NAMEENTRYSIZE        yields the size of each entry in the map
  PCRE_INFO_NAMECOUNT            yields the number of entries
  PCRE_INFO_NAMETABLE            yields a pointer to the map.

The map is a vector of fixed-size entries. The size of each entry depends on
the length of the longest name used. The first two bytes of each entry are the
group number, most significant byte first. There follows the corresponding
name, zero terminated. The names are in alphabetical order.

37. Make the maximum literal string in the compiled code 250 for the non-UTF-8
case instead of 255. Making it the same both with and without UTF-8 support
means that the same test output works with both.

38. There was a case of malloc(0) in the POSIX testing code in pcretest. Avoid
calling malloc() with a zero argument.

39. Change 25 above had to resort to a heavy-handed test for the .* anchoring
optimization. I've improved things by keeping a bitmap of backreferences with
numbers 1-31 so that if .* occurs inside capturing brackets that are not in
fact referenced, the optimization can be applied. It is unlikely that a
relevant occurrence of .* (i.e. one which might indicate anchoring or forcing
the match to follow \n) will appear inside brackets with a number greater than
31, but if it does, any back reference > 31 suppresses the optimization.

40. Added a new compile-time option PCRE_NO_AUTO_CAPTURE. This has the effect
of disabling numbered capturing parentheses. Any opening parenthesis that is
not followed by ? behaves as if it were followed by ?: but named parentheses
can still be used for capturing (and they will acquire numbers in the usual
way).

41. Redesigned the return codes from the match() function into yes/no/error so
that errors can be passed back from deep inside the nested calls. A malloc
failure while inside a recursive subpattern call now causes the
PCRE_ERROR_NOMEMORY return instead of quietly going wrong.

42. It is now possible to set a limit on the number of times the match()
function is called in a call to pcre_exec(). This facility makes it possible to
limit the amount of recursion and backtracking, though not in a directly
obvious way, because the match() function is used in a number of different
circumstances. The count starts from zero for each position in the subject
string (for non-anchored patterns). The default limit is, for compatibility, a
large number, namely 10 000 000. You can change this in two ways:

(a) When configuring PCRE before making, you can use --with-match-limit=n
    to set a default value for the compiled library.

(b) For each call to pcre_exec(), you can pass a pcre_extra block in which
    a different value is set. See 45 below.

If the limit is exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT.

43. Added a new function pcre_config(int, void *) to enable run-time extraction
of things that can be changed at compile time. The first argument specifies
what is wanted and the second points to where the information is to be placed.
The current list of available information is:

  PCRE_CONFIG_UTF8

The output is an integer that is set to one if UTF-8 support is available;
otherwise it is set to zero.

  PCRE_CONFIG_NEWLINE

The output is an integer that it set to the value of the code that is used for
newline. It is either LF (10) or CR (13).

  PCRE_CONFIG_LINK_SIZE

The output is an integer that contains the number of bytes used for internal
linkage in compiled expressions. The value is 2, 3, or 4. See item 32 above.

  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD

The output is an integer that contains the threshold above which the POSIX
interface uses malloc() for output vectors. See item 31 above.

  PCRE_CONFIG_MATCH_LIMIT

The output is an unsigned integer that contains the default limit of the number
of match() calls in a pcre_exec() execution. See 42 above.

44. pcretest has been upgraded by the addition of the -C option. This causes it
to extract all the available output from the new pcre_config() function, and to
output it. The program then exits immediately.

45. A need has arisen to pass over additional data with calls to pcre_exec() in
order to support additional features. One way would have been to define
pcre_exec2() (for example) with extra arguments, but this would not have been
extensible, and would also have required all calls to the original function to
be mapped to the new one. Instead, I have chosen to extend the mechanism that
is used for passing in "extra" data from pcre_study().

The pcre_extra structure is now exposed and defined in pcre.h. It currently
contains the following fields:

  flags         a bitmap indicating which of the following fields are set
  study_data    opaque data from pcre_study()
  match_limit   a way of specifying a limit on match() calls for a specific
                  call to pcre_exec()
  callout_data  data for callouts (see 49 below)

The flag bits are also defined in pcre.h, and are

  PCRE_EXTRA_STUDY_DATA
  PCRE_EXTRA_MATCH_LIMIT
  PCRE_EXTRA_CALLOUT_DATA

The pcre_study() function now returns one of these new pcre_extra blocks, with
the actual study data pointed to by the study_data field, and the
PCRE_EXTRA_STUDY_DATA flag set. This can be passed directly to pcre_exec() as
before. That is, this change is entirely upwards-compatible and requires no
change to existing code.

If you want to pass in additional data to pcre_exec(), you can either place it
in a pcre_extra block provided by pcre_study(), or create your own pcre_extra
block.

46. pcretest has been extended to test the PCRE_EXTRA_MATCH_LIMIT feature. If a
data string contains the escape sequence \M, pcretest calls pcre_exec() several
times with different match limits, until it finds the minimum value needed for
pcre_exec() to complete. The value is then output. This can be instructive; for
most simple matches the number is quite small, but for pathological cases it
gets very large very quickly.

47. There's a new option for pcre_fullinfo() called PCRE_INFO_STUDYSIZE. It
returns the size of the data block pointed to by the study_data field in a
pcre_extra block, that is, the value that was passed as the argument to
pcre_malloc() when PCRE was getting memory in which to place the information
created by pcre_study(). The fourth argument should point to a size_t variable.
pcretest has been extended so that this information is shown after a successful
pcre_study() call when information about the compiled regex is being displayed.

48. Cosmetic change to Makefile: there's no need to have / after $(DESTDIR)
because what follows is always an absolute path. (Later: it turns out that this
is more than cosmetic for MinGW, because it doesn't like empty path
components.)

49. Some changes have been made to the callout feature (see 28 above):

(i)  A callout function now has three choices for what it returns:

       0  =>  success, carry on matching
     > 0  =>  failure at this point, but backtrack if possible
     < 0  =>  serious error, return this value from pcre_exec()

     Negative values should normally be chosen from the set of PCRE_ERROR_xxx
     values. In particular, returning PCRE_ERROR_NOMATCH forces a standard
     "match failed" error. The error number PCRE_ERROR_CALLOUT is reserved for
     use by callout functions. It will never be used by PCRE itself.

(ii) The pcre_extra structure (see 45 above) has a void * field called
     callout_data, with corresponding flag bit PCRE_EXTRA_CALLOUT_DATA. The
     pcre_callout_block structure has a field of the same name. The contents of
     the field passed in the pcre_extra structure are passed to the callout
     function in the corresponding field in the callout block. This makes it
     easier to use the same callout-containing regex from multiple threads. For
     testing, the pcretest program has a new data escape

       \C*n        pass the number n (may be negative) as callout_data

     If the callout function in pcretest receives a non-zero value as
     callout_data, it returns that value.

50. Makefile wasn't handling CFLAGS properly when compiling dftables. Also,
there were some redundant $(CFLAGS) in commands that are now specified as
$(LINK), which already includes $(CFLAGS).

51. Extensions to UTF-8 support are listed below. These all apply when (a) PCRE
has been compiled with UTF-8 support *and* pcre_compile() has been compiled
with the PCRE_UTF8 flag. Patterns that are compiled without that flag assume
one-byte characters throughout. Note that case-insensitive matching applies
only to characters whose values are less than 256. PCRE doesn't support the
notion of cases for higher-valued characters.

(i)   A character class whose characters are all within 0-255 is handled as
      a bit map, and the map is inverted for negative classes. Previously, a
      character > 255 always failed to match such a class; however it should
      match if the class was a negative one (e.g. [^ab]). This has been fixed.

(ii)  A negated character class with a single character < 255 is coded as
      "not this character" (OP_NOT). This wasn't working properly when the test
      character was multibyte, either singly or repeated.

(iii) Repeats of multibyte characters are now handled correctly in UTF-8
      mode, for example: \x{100}{2,3}.

(iv)  The character escapes \b, \B, \d, \D, \s, \S, \w, and \W (either
      singly or repeated) now correctly test multibyte characters. However,
      PCRE doesn't recognize any characters with values greater than 255 as
      digits, spaces, or word characters. Such characters always match \D, \S,
      and \W, and never match \d, \s, or \w.

(v)   Classes may now contain characters and character ranges with values
      greater than 255. For example: [ab\x{100}-\x{400}].

(vi)  pcregrep now has a --utf-8 option (synonym -u) which makes it call
      PCRE in UTF-8 mode.

52. The info request value PCRE_INFO_FIRSTCHAR has been renamed
PCRE_INFO_FIRSTBYTE because it is a byte value. However, the old name is
retained for backwards compatibility. (Note that LASTLITERAL is also a byte
value.)

53. The single man page has become too large. I have therefore split it up into
a number of separate man pages. These also give rise to individual HTML pages;
these are now put in a separate directory, and there is an index.html page that
lists them all. Some hyperlinking between the pages has been installed.

54. Added convenience functions for handling named capturing parentheses.

55. Unknown escapes inside character classes (e.g. [\M]) and escapes that
aren't interpreted therein (e.g. [\C]) are literals in Perl. This is now also
true in PCRE, except when the PCRE_EXTENDED option is set, in which case they
are faulted.

56. Introduced HOST_CC and HOST_CFLAGS which can be set in the environment when
calling configure. These values are used when compiling the dftables.c program
which is run to generate the source of the default character tables. They
default to the values of CC and CFLAGS. If you are cross-compiling PCRE,
you will need to set these values.

57. Updated the building process for Windows DLL, as provided by Fred Cox.


Version 3.9 02-Jan-02
---------------------

1. A bit of extraneous text had somehow crept into the pcregrep documentation.

2. If --disable-static was given, the building process failed when trying to
build pcretest and pcregrep. (For some reason it was using libtool to compile
them, which is not right, as they aren't part of the library.)


Version 3.8 18-Dec-01
---------------------

1. The experimental UTF-8 code was completely screwed up. It was packing the
bytes in the wrong order. How dumb can you get?


Version 3.7 29-Oct-01
---------------------

1. In updating pcretest to check change 1 of version 3.6, I screwed up.
This caused pcretest, when used on the test data, to segfault. Unfortunately,
this didn't happen under Solaris 8, where I normally test things.

2. The Makefile had to be changed to make it work on BSD systems, where 'make'
doesn't seem to recognize that ./xxx and xxx are the same file. (This entry
isn't in ChangeLog distributed with 3.7 because I forgot when I hastily made
this fix an hour or so after the initial 3.7 release.)


Version 3.6 23-Oct-01
---------------------

1. Crashed with /(sens|respons)e and \1ibility/ and "sense and sensibility" if
offsets passed as NULL with zero offset count.

2. The config.guess and config.sub files had not been updated when I moved to
the latest autoconf.


Version 3.5 15-Aug-01
---------------------

1. Added some missing #if !defined NOPOSIX conditionals in pcretest.c that
had been forgotten.

2. By using declared but undefined structures, we can avoid using "void"
definitions in pcre.h while keeping the internal definitions of the structures
private.

3. The distribution is now built using autoconf 2.50 and libtool 1.4. From a
user point of view, this means that both static and shared libraries are built
by default, but this can be individually controlled. More of the work of
handling this static/shared cases is now inside libtool instead of PCRE's make
file.

4. The pcretest utility is now installed along with pcregrep because it is
useful for users (to test regexs) and by doing this, it automatically gets
relinked by libtool. The documentation has been turned into a man page, so
there are now .1, .txt, and .html versions in /doc.

5. Upgrades to pcregrep:
   (i)   Added long-form option names like gnu grep.
   (ii)  Added --help to list all options with an explanatory phrase.
   (iii) Added -r, --recursive to recurse into sub-directories.
   (iv)  Added -f, --file to read patterns from a file.

6. pcre_exec() was referring to its "code" argument before testing that
argument for NULL (and giving an error if it was NULL).

7. Upgraded Makefile.in to allow for compiling in a different directory from
the source directory.

8. Tiny buglet in pcretest: when pcre_fullinfo() was called to retrieve the
options bits, the pointer it was passed was to an int instead of to an unsigned
long int. This mattered only on 64-bit systems.

9. Fixed typo (3.4/1) in pcre.h again. Sigh. I had changed pcre.h (which is
generated) instead of pcre.in, which it its source. Also made the same change
in several of the .c files.

10. A new release of gcc defines printf() as a macro, which broke pcretest
because it had an ifdef in the middle of a string argument for printf(). Fixed
by using separate calls to printf().

11. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure
script, to force use of CR or LF instead of \n in the source. On non-Unix
systems, the value can be set in config.h.

12. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an
absolute limit. Changed the text of the error message to make this clear, and
likewise updated the man page.

13. The limit of 99 on the number of capturing subpatterns has been removed.
The new limit is 65535, which I hope will not be a "real" limit.


Version 3.4 22-Aug-00
---------------------

1. Fixed typo in pcre.h: unsigned const char * changed to const unsigned char *.

2. Diagnose condition (?(0) as an error instead of crashing on matching.


Version 3.3 01-Aug-00
---------------------

1. If an octal character was given, but the value was greater than \377, it
was not getting masked to the least significant bits, as documented. This could
lead to crashes in some systems.

2. Perl 5.6 (if not earlier versions) accepts classes like [a-\d] and treats
the hyphen as a literal. PCRE used to give an error; it now behaves like Perl.

3. Added the functions pcre_free_substring() and pcre_free_substring_list().
These just pass their arguments on to (pcre_free)(), but they are provided
because some uses of PCRE bind it to non-C systems that can call its functions,
but cannot call free() or pcre_free() directly.

4. Add "make test" as a synonym for "make check". Corrected some comments in
the Makefile.

5. Add $(DESTDIR)/ in front of all the paths in the "install" target in the
Makefile.

6. Changed the name of pgrep to pcregrep, because Solaris has introduced a
command called pgrep for grepping around the active processes.

7. Added the beginnings of support for UTF-8 character strings.

8. Arranged for the Makefile to pass over the settings of CC, CFLAGS, and
RANLIB to ./ltconfig so that they are used by libtool. I think these are all
the relevant ones. (AR is not passed because ./ltconfig does its own figuring
out for the ar command.)


Version 3.2 12-May-00
---------------------

This is purely a bug fixing release.

1. If the pattern /((Z)+|A)*/ was matched agained ZABCDEFG it matched Z instead
of ZA. This was just one example of several cases that could provoke this bug,
which was introduced by change 9 of version 2.00. The code for breaking
infinite loops after an iteration that matches an empty string was't working
correctly.

2. The pcretest program was not imitating Perl correctly for the pattern /a*/g
when matched against abbab (for example). After matching an empty string, it
wasn't forcing anchoring when setting PCRE_NOTEMPTY for the next attempt; this
caused it to match further down the string than it should.

3. The code contained an inclusion of sys/types.h. It isn't clear why this
was there because it doesn't seem to be needed, and it causes trouble on some
systems, as it is not a Standard C header. It has been removed.

4. Made 4 silly changes to the source to avoid stupid compiler warnings that
were reported on the Macintosh. The changes were from

  while ((c = *(++ptr)) != 0 && c != '\n');
to
  while ((c = *(++ptr)) != 0 && c != '\n') ;

Totally extraordinary, but if that's what it takes...

5. PCRE is being used in one environment where neither memmove() nor bcopy() is
available. Added HAVE_BCOPY and an autoconf test for it; if neither
HAVE_MEMMOVE nor HAVE_BCOPY is set, use a built-in emulation function which
assumes the way PCRE uses memmove() (always moving upwards).

6. PCRE is being used in one environment where strchr() is not available. There
was only one use in pcre.c, and writing it out to avoid strchr() probably gives
faster code anyway.


Version 3.1 09-Feb-00
---------------------

The only change in this release is the fixing of some bugs in Makefile.in for
the "install" target:

(1) It was failing to install pcreposix.h.

(2) It was overwriting the pcre.3 man page with the pcreposix.3 man page.


Version 3.0 01-Feb-00
---------------------

1. Add support for the /+ modifier to perltest (to output $` like it does in
pcretest).

2. Add support for the /g modifier to perltest.

3. Fix pcretest so that it behaves even more like Perl for /g when the pattern
matches null strings.

4. Fix perltest so that it doesn't do unwanted things when fed an empty
pattern. Perl treats empty patterns specially - it reuses the most recent
pattern, which is not what we want. Replace // by /(?#)/ in order to avoid this
effect.

5. The POSIX interface was broken in that it was just handing over the POSIX
captured string vector to pcre_exec(), but (since release 2.00) PCRE has
required a bigger vector, with some working space on the end. This means that
the POSIX wrapper now has to get and free some memory, and copy the results.

6. Added some simple autoconf support, placing the test data and the
documentation in separate directories, re-organizing some of the
information files, and making it build pcre-config (a GNU standard). Also added
libtool support for building PCRE as a shared library, which is now the
default.

7. Got rid of the leading zero in the definition of PCRE_MINOR because 08 and
09 are not valid octal constants. Single digits will be used for minor values
less than 10.

8. Defined REG_EXTENDED and REG_NOSUB as zero in the POSIX header, so that
existing programs that set these in the POSIX interface can use PCRE without
modification.

9. Added a new function, pcre_fullinfo() with an extensible interface. It can
return all that pcre_info() returns, plus additional data. The pcre_info()
function is retained for compatibility, but is considered to be obsolete.

10. Added experimental recursion feature (?R) to handle one common case that
Perl 5.6 will be able to do with (?p{...}).

11. Added support for POSIX character classes like [:alpha:], which Perl is
adopting.


Version 2.08 31-Aug-99
----------------------

1. When startoffset was not zero and the pattern began with ".*", PCRE was not
trying to match at the startoffset position, but instead was moving forward to
the next newline as if a previous match had failed.

2. pcretest was not making use of PCRE_NOTEMPTY when repeating for /g and /G,
and could get into a loop if a null string was matched other than at the start
of the subject.

3. Added definitions of PCRE_MAJOR and PCRE_MINOR to pcre.h so the version can
be distinguished at compile time, and for completeness also added PCRE_DATE.

5. Added Paul Sokolovsky's minor changes to make it easy to compile a Win32 DLL
in GnuWin32 environments.


Version 2.07 29-Jul-99
----------------------

1. The documentation is now supplied in plain text form and HTML as well as in
the form of man page sources.

2. C++ compilers don't like assigning (void *) values to other pointer types.
In particular this affects malloc(). Although there is no problem in Standard
C, I've put in casts to keep C++ compilers happy.

3. Typo on pcretest.c; a cast of (unsigned char *) in the POSIX regexec() call
should be (const char *).

4. If NOPOSIX is defined, pcretest.c compiles without POSIX support. This may
be useful for non-Unix systems who don't want to bother with the POSIX stuff.
However, I haven't made this a standard facility. The documentation doesn't
mention it, and the Makefile doesn't support it.

5. The Makefile now contains an "install" target, with editable destinations at
the top of the file. The pcretest program is not installed.

6. pgrep -V now gives the PCRE version number and date.

7. Fixed bug: a zero repetition after a literal string (e.g. /abcde{0}/) was
causing the entire string to be ignored, instead of just the last character.

8. If a pattern like /"([^\\"]+|\\.)*"/ is applied in the normal way to a
non-matching string, it can take a very, very long time, even for strings of
quite modest length, because of the nested recursion. PCRE now does better in
some of these cases. It does this by remembering the last required literal
character in the pattern, and pre-searching the subject to ensure it is present
before running the real match. In other words, it applies a heuristic to detect
some types of certain failure quickly, and in the above example, if presented
with a string that has no trailing " it gives "no match" very quickly.

9. A new runtime option PCRE_NOTEMPTY causes null string matches to be ignored;
other alternatives are tried instead.


Version 2.06 09-Jun-99
----------------------

1. Change pcretest's output for amount of store used to show just the code
space, because the remainder (the data block) varies in size between 32-bit and
64-bit systems.

2. Added an extra argument to pcre_exec() to supply an offset in the subject to
start matching at. This allows lookbehinds to work when searching for multiple
occurrences in a string.

3. Added additional options to pcretest for testing multiple occurrences:

   /+   outputs the rest of the string that follows a match
   /g   loops for multiple occurrences, using the new startoffset argument
   /G   loops for multiple occurrences by passing an incremented pointer

4. PCRE wasn't doing the "first character" optimization for patterns starting
with \b or \B, though it was doing it for other lookbehind assertions. That is,
it wasn't noticing that a match for a pattern such as /\bxyz/ has to start with
the letter 'x'. On long subject strings, this gives a significant speed-up.


Version 2.05 21-Apr-99
----------------------

1. Changed the type of magic_number from int to long int so that it works
properly on 16-bit systems.

2. Fixed a bug which caused patterns starting with .* not to work correctly
when the subject string contained newline characters. PCRE was assuming
anchoring for such patterns in all cases, which is not correct because .* will
not pass a newline unless PCRE_DOTALL is set. It now assumes anchoring only if
DOTALL is set at top level; otherwise it knows that patterns starting with .*
must be retried after every newline in the subject.


Version 2.04 18-Feb-99
----------------------

1. For parenthesized subpatterns with repeats whose minimum was zero, the
computation of the store needed to hold the pattern was incorrect (too large).
If such patterns were nested a few deep, this could multiply and become a real
problem.

2. Added /M option to pcretest to show the memory requirement of a specific
pattern. Made -m a synonym of -s (which does this globally) for compatibility.

3. Subpatterns of the form (regex){n,m} (i.e. limited maximum) were being
compiled in such a way that the backtracking after subsequent failure was
pessimal. Something like (a){0,3} was compiled as (a)?(a)?(a)? instead of
((a)((a)(a)?)?)? with disastrous performance if the maximum was of any size.


Version 2.03 02-Feb-99
----------------------

1. Fixed typo and small mistake in man page.

2. Added 4th condition (GPL supersedes if conflict) and created separate
LICENCE file containing the conditions.

3. Updated pcretest so that patterns such as /abc\/def/ work like they do in
Perl, that is the internal \ allows the delimiter to be included in the
pattern. Locked out the use of \ as a delimiter. If \ immediately follows
the final delimiter, add \ to the end of the pattern (to test the error).

4. Added the convenience functions for extracting substrings after a successful
match. Updated pcretest to make it able to test these functions.


Version 2.02 14-Jan-99
----------------------

1. Initialized the working variables associated with each extraction so that
their saving and restoring doesn't refer to uninitialized store.

2. Put dummy code into study.c in order to trick the optimizer of the IBM C
compiler for OS/2 into generating correct code. Apparently IBM isn't going to
fix the problem.

3. Pcretest: the timing code wasn't using LOOPREPEAT for timing execution
calls, and wasn't printing the correct value for compiling calls. Increased the
default value of LOOPREPEAT, and the number of significant figures in the
times.

4. Changed "/bin/rm" in the Makefile to "-rm" so it works on Windows NT.

5. Renamed "deftables" as "dftables" to get it down to 8 characters, to avoid
a building problem on Windows NT with a FAT file system.


Version 2.01 21-Oct-98
----------------------

1. Changed the API for pcre_compile() to allow for the provision of a pointer
to character tables built by pcre_maketables() in the current locale. If NULL
is passed, the default tables are used.


Version 2.00 24-Sep-98
----------------------

1. Since the (>?) facility is in Perl 5.005, don't require PCRE_EXTRA to enable
it any more.

2. Allow quantification of (?>) groups, and make it work correctly.

3. The first character computation wasn't working for (?>) groups.

4. Correct the implementation of \Z (it is permitted to match on the \n at the
end of the subject) and add 5.005's \z, which really does match only at the
very end of the subject.

5. Remove the \X "cut" facility; Perl doesn't have it, and (?> is neater.

6. Remove the ability to specify CASELESS, MULTILINE, DOTALL, and
DOLLAR_END_ONLY at runtime, to make it possible to implement the Perl 5.005
localized options. All options to pcre_study() were also removed.

7. Add other new features from 5.005:

   $(?<=           positive lookbehind
   $(?<!           negative lookbehind
   (?imsx-imsx)    added the unsetting capability
                   such a setting is global if at outer level; local otherwise
   (?imsx-imsx:)   non-capturing groups with option setting
   (?(cond)re|re)  conditional pattern matching

   A backreference to itself in a repeated group matches the previous
   captured string.

8. General tidying up of studying (both automatic and via "study")
consequential on the addition of new assertions.

9. As in 5.005, unlimited repeated groups that could match an empty substring
are no longer faulted at compile time. Instead, the loop is forcibly broken at
runtime if any iteration does actually match an empty substring.

10. Include the RunTest script in the distribution.

11. Added tests from the Perl 5.005_02 distribution. This showed up a few
discrepancies, some of which were old and were also with respect to 5.004. They
have now been fixed.


Version 1.09 28-Apr-98
----------------------

1. A negated single character class followed by a quantifier with a minimum
value of one (e.g.  [^x]{1,6}  ) was not compiled correctly. This could lead to
program crashes, or just wrong answers. This did not apply to negated classes
containing more than one character, or to minima other than one.


Version 1.08 27-Mar-98
----------------------

1. Add PCRE_UNGREEDY to invert the greediness of quantifiers.

2. Add (?U) and (?X) to set PCRE_UNGREEDY and PCRE_EXTRA respectively. The
latter must appear before anything that relies on it in the pattern.


Version 1.07 16-Feb-98
----------------------

1. A pattern such as /((a)*)*/ was not being diagnosed as in error (unlimited
repeat of a potentially empty string).


Version 1.06 23-Jan-98
----------------------

1. Added Markus Oberhumer's little patches for C++.

2. Literal strings longer than 255 characters were broken.


Version 1.05 23-Dec-97
----------------------

1. Negated character classes containing more than one character were failing if
PCRE_CASELESS was set at run time.


Version 1.04 19-Dec-97
----------------------

1. Corrected the man page, where some "const" qualifiers had been omitted.

2. Made debugging output print "{0,xxx}" instead of just "{,xxx}" to agree with
input syntax.

3. Fixed memory leak which occurred when a regex with back references was
matched with an offsets vector that wasn't big enough. The temporary memory
that is used in this case wasn't being freed if the match failed.

4. Tidied pcretest to ensure it frees memory that it gets.

5. Temporary memory was being obtained in the case where the passed offsets
vector was exactly big enough.

6. Corrected definition of offsetof() from change 5 below.

7. I had screwed up change 6 below and broken the rules for the use of
setjmp(). Now fixed.


Version 1.03 18-Dec-97
----------------------

1. A erroneous regex with a missing opening parenthesis was correctly
diagnosed, but PCRE attempted to access brastack[-1], which could cause crashes
on some systems.

2. Replaced offsetof(real_pcre, code) by offsetof(real_pcre, code[0]) because
it was reported that one broken compiler failed on the former because "code" is
also an independent variable.

3. The erroneous regex a[]b caused an array overrun reference.

4. A regex ending with a one-character negative class (e.g. /[^k]$/) did not
fail on data ending with that character. (It was going on too far, and checking
the next character, typically a binary zero.) This was specific to the
optimized code for single-character negative classes.

5. Added a contributed patch from the TIN world which does the following:

  + Add an undef for memmove, in case the the system defines a macro for it.

  + Add a definition of offsetof(), in case there isn't one. (I don't know
    the reason behind this - offsetof() is part of the ANSI standard - but
    it does no harm).

  + Reduce the ifdef's in pcre.c using macro DPRINTF, thereby eliminating
    most of the places where whitespace preceded '#'. I have given up and
    allowed the remaining 2 cases to be at the margin.

  + Rename some variables in pcre to eliminate shadowing. This seems very
    pedantic, but does no harm, of course.

6. Moved the call to setjmp() into its own function, to get rid of warnings
from gcc -Wall, and avoided calling it at all unless PCRE_EXTRA is used.

7. Constructs such as \d{8,} were compiling into the equivalent of
\d{8}\d{0,65527} instead of \d{8}\d* which didn't make much difference to the
outcome, but in this particular case used more store than had been allocated,
which caused the bug to be discovered because it threw up an internal error.

8. The debugging code in both pcre and pcretest for outputting the compiled
form of a regex was going wrong in the case of back references followed by
curly-bracketed repeats.


Version 1.02 12-Dec-97
----------------------

1. Typos in pcre.3 and comments in the source fixed.

2. Applied a contributed patch to get rid of places where it used to remove
'const' from variables, and fixed some signed/unsigned and uninitialized
variable warnings.

3. Added the "runtest" target to Makefile.

4. Set default compiler flag to -O2 rather than just -O.


Version 1.01 19-Nov-97
----------------------

1. PCRE was failing to diagnose unlimited repeat of empty string for patterns
like /([ab]*)*/, that is, for classes with more than one character in them.

2. Likewise, it wasn't diagnosing patterns with "once-only" subpatterns, such
as /((?>a*))*/ (a PCRE_EXTRA facility).


Version 1.00 18-Nov-97
----------------------

1. Added compile-time macros to support systems such as SunOS4 which don't have
memmove() or strerror() but have other things that can be used instead.

2. Arranged that "make clean" removes the executables.


Version 0.99 27-Oct-97
----------------------

1. Fixed bug in code for optimizing classes with only one character. It was
initializing a 32-byte map regardless, which could cause it to run off the end
of the memory it had got.

2. Added, conditional on PCRE_EXTRA, the proposed (?>REGEX) construction.


Version 0.98 22-Oct-97
----------------------

1. Fixed bug in code for handling temporary memory usage when there are more
back references than supplied space in the ovector. This could cause segfaults.


Version 0.97 21-Oct-97
----------------------

1. Added the \X "cut" facility, conditional on PCRE_EXTRA.

2. Optimized negated single characters not to use a bit map.

3. Brought error texts together as macro definitions; clarified some of them;
fixed one that was wrong - it said "range out of order" when it meant "invalid
escape sequence".

4. Changed some char * arguments to const char *.

5. Added PCRE_NOTBOL and PCRE_NOTEOL (from POSIX).

6. Added the POSIX-style API wrapper in pcreposix.a and testing facilities in
pcretest.


Version 0.96 16-Oct-97
----------------------

1. Added a simple "pgrep" utility to the distribution.

2. Fixed an incompatibility with Perl: "{" is now treated as a normal character
unless it appears in one of the precise forms "{ddd}", "{ddd,}", or "{ddd,ddd}"
where "ddd" means "one or more decimal digits".

3. Fixed serious bug. If a pattern had a back reference, but the call to
pcre_exec() didn't supply a large enough ovector to record the related
identifying subpattern, the match always failed. PCRE now remembers the number
of the largest back reference, and gets some temporary memory in which to save
the offsets during matching if necessary, in order to ensure that
backreferences always work.

4. Increased the compatibility with Perl in a number of ways:

  (a) . no longer matches \n by default; an option PCRE_DOTALL is provided
      to request this handling. The option can be set at compile or exec time.

  (b) $ matches before a terminating newline by default; an option
      PCRE_DOLLAR_ENDONLY is provided to override this (but not in multiline
      mode). The option can be set at compile or exec time.

  (c) The handling of \ followed by a digit other than 0 is now supposed to be
      the same as Perl's. If the decimal number it represents is less than 10
      or there aren't that many previous left capturing parentheses, an octal
      escape is read. Inside a character class, it's always an octal escape,
      even if it is a single digit.

  (d) An escaped but undefined alphabetic character is taken as a literal,
      unless PCRE_EXTRA is set. Currently this just reserves the remaining
      escapes.

  (e) {0} is now permitted. (The previous item is removed from the compiled
      pattern).

5. Changed all the names of code files so that the basic parts are no longer
than 10 characters, and abolished the teeny "globals.c" file.

6. Changed the handling of character classes; they are now done with a 32-byte
bit map always.

7. Added the -d and /D options to pcretest to make it possible to look at the
internals of compilation without having to recompile pcre.


Version 0.95 23-Sep-97
----------------------

1. Fixed bug in pre-pass concerning escaped "normal" characters such as \x5c or
\x20 at the start of a run of normal characters. These were being treated as
real characters, instead of the source characters being re-checked.


Version 0.94 18-Sep-97
----------------------

1. The functions are now thread-safe, with the caveat that the global variables
containing pointers to malloc() and free() or alternative functions are the
same for all threads.

2. Get pcre_study() to generate a bitmap of initial characters for non-
anchored patterns when this is possible, and use it if passed to pcre_exec().


Version 0.93 15-Sep-97
----------------------

1. /(b)|(:+)/ was computing an incorrect first character.

2. Add pcre_study() to the API and the passing of pcre_extra to pcre_exec(),
but not actually doing anything yet.

3. Treat "-" characters in classes that cannot be part of ranges as literals,
as Perl does (e.g. [-az] or [az-]).

4. Set the anchored flag if a branch starts with .* or .*? because that tests
all possible positions.

5. Split up into different modules to avoid including unneeded functions in a
compiled binary. However, compile and exec are still in one module. The "study"
function is split off.

6. The character tables are now in a separate module whose source is generated
by an auxiliary program - but can then be edited by hand if required. There are
now no calls to isalnum(), isspace(), isdigit(), isxdigit(), tolower() or
toupper() in the code.

7. Turn the malloc/free funtions variables into pcre_malloc and pcre_free and
make them global. Abolish the function for setting them, as the caller can now
set them directly.


Version 0.92 11-Sep-97
----------------------

1. A repeat with a fixed maximum and a minimum of 1 for an ordinary character
(e.g. /a{1,3}/) was broken (I mis-optimized it).

2. Caseless matching was not working in character classes if the characters in
the pattern were in upper case.

3. Make ranges like [W-c] work in the same way as Perl for caseless matching.

4. Make PCRE_ANCHORED public and accept as a compile option.

5. Add an options word to pcre_exec() and accept PCRE_ANCHORED and
PCRE_CASELESS at run time. Add escapes \A and \I to pcretest to cause it to
pass them.

6. Give an error if bad option bits passed at compile or run time.

7. Add PCRE_MULTILINE at compile and exec time, and (?m) as well. Add \M to
pcretest to cause it to pass that flag.

8. Add pcre_info(), to get the number of identifying subpatterns, the stored
options, and the first character, if set.

9. Recognize C+ or C{n,m} where n >= 1 as providing a fixed starting character.


Version 0.91 10-Sep-97
----------------------

1. PCRE was failing to diagnose unlimited repeats of subpatterns that could
match the empty string as in /(a*)*/. It was looping and ultimately crashing.

2. PCRE was looping on encountering an indefinitely repeated back reference to
a subpattern that had matched an empty string, e.g. /(a|)\1*/. It now does what
Perl does - treats the match as successful.

****
PK��$[��U�G�Gdoc/alt-pcre802/NEWSnu�[���News about PCRE releases
------------------------

Release 8.02 19-Mar-2010
------------------------

Another bug-fix release.


Release 8.01 19-Jan-2010
------------------------

This is a bug-fix release. Several bugs in the code itself and some bugs and
infelicities in the build system have been fixed.


Release 8.00 19-Oct-09
----------------------

Bugs have been fixed in the library and in pcregrep. There are also some
enhancements. Restrictions on patterns used for partial matching have been
removed, extra information is given for partial matches, the partial matching
process has been improved, and an option to make a partial match override a
full match is available. The "study" process has been enhanced by finding a
lower bound matching length. Groups with duplicate numbers may now have
duplicated names without the use of PCRE_DUPNAMES. However, they may not have
different names. The documentation has been revised to reflect these changes.
The version number has been expanded to 3 digits as it is clear that the rate
of change is not slowing down.


Release 7.9 11-Apr-09
---------------------

Mostly bugfixes and tidies with just a couple of minor functional additions.


Release 7.8 05-Sep-08
---------------------

More bug fixes, plus a performance improvement in Unicode character property
lookup.


Release 7.7 07-May-08
---------------------

This is once again mainly a bug-fix release, but there are a couple of new
features.


Release 7.6 28-Jan-08
---------------------

The main reason for having this release so soon after 7.5 is because it fixes a
potential buffer overflow problem in pcre_compile() when run in UTF-8 mode. In
addition, the CMake configuration files have been brought up to date.


Release 7.5 10-Jan-08
---------------------

This is mainly a bug-fix release. However the ability to link pcregrep with
libz or libbz2 and the ability to link pcretest with libreadline have been
added. Also the --line-offsets and --file-offsets options were added to
pcregrep.


Release 7.4 21-Sep-07
---------------------

The only change of specification is the addition of options to control whether
\R matches any Unicode line ending (the default) or just CR, LF, and CRLF.
Otherwise, the changes are bug fixes and a refactoring to reduce the number of
relocations needed in a shared library. There have also been some documentation
updates, in particular, some more information about using CMake to build PCRE
has been added to the NON-UNIX-USE file.


Release 7.3 28-Aug-07
---------------------

Most changes are bug fixes. Some that are not:

1. There is some support for Perl 5.10's experimental "backtracking control
   verbs" such as (*PRUNE).

2. UTF-8 checking is now as per RFC 3629 instead of RFC 2279; this is more
   restrictive in the strings it accepts.

3. Checking for potential integer overflow has been made more dynamic, and as a
   consequence there is no longer a hard limit on the size of a subpattern that
   has a limited repeat count.

4. When CRLF is a valid line-ending sequence, pcre_exec() and pcre_dfa_exec()
   no longer advance by two characters instead of one when an unanchored match
   fails at CRLF if there are explicit CR or LF matches within the pattern.
   This gets rid of some anomalous effects that previously occurred.

5. Some PCRE-specific settings for varying the newline options at the start of
   a pattern have been added.


Release 7.2 19-Jun-07
---------------------

WARNING: saved patterns that were compiled by earlier versions of PCRE must be
recompiled for use with 7.2 (necessitated by the addition of \K, \h, \H, \v,
and \V).

Correction to the notes for 7.1: the note about shared libraries for Windows is
wrong. Previously, three libraries were built, but each could function
independently. For example, the pcreposix library also included all the
functions from the basic pcre library. The change is that the three libraries
are no longer independent. They are like the Unix libraries. To use the
pcreposix functions, for example, you need to link with both the pcreposix and
the basic pcre library.

Some more features from Perl 5.10 have been added:

  (?-n) and (?+n) relative references for recursion and subroutines.

  (?(-n) and (?(+n) relative references as conditions.

  \k{name} and \g{name} are synonyms for \k<name>.

  \K to reset the start of the matched string; for example, (foo)\Kbar
  matches bar preceded by foo, but only sets bar as the matched string.

  (?| introduces a group where the capturing parentheses in each alternative
  start from the same number; for example, (?|(abc)|(xyz)) sets capturing
  parentheses number 1 in both cases.

  \h, \H, \v, \V match horizontal and vertical whitespace, respectively.


Release 7.1 24-Apr-07
---------------------

There is only one new feature in this release: a linebreak setting of
PCRE_NEWLINE_ANYCRLF. It is a cut-down version of PCRE_NEWLINE_ANY, which
recognizes only CRLF, CR, and LF as linebreaks.

A few bugs are fixed (see ChangeLog for details), but the major change is a
complete re-implementation of the build system. This now has full Autotools
support and so is now "standard" in some sense. It should help with compiling
PCRE in a wide variety of environments.

NOTE: when building shared libraries for Windows, three dlls are now built,
called libpcre, libpcreposix, and libpcrecpp. Previously, everything was
included in a single dll.

Another important change is that the dftables auxiliary program is no longer
compiled and run at "make" time by default. Instead, a default set of character
tables (assuming ASCII coding) is used. If you want to use dftables to generate
the character tables as previously, add --enable-rebuild-chartables to the
"configure" command. You must do this if you are compiling PCRE to run on a
system that uses EBCDIC code.

There is a discussion about character tables in the README file. The default is
not to use dftables so that that there is no problem when cross-compiling.


Release 7.0 19-Dec-06
---------------------

This release has a new major number because there have been some internal
upheavals to facilitate the addition of new optimizations and other facilities,
and to make subsequent maintenance and extension easier. Compilation is likely
to be a bit slower, but there should be no major effect on runtime performance.
Previously compiled patterns are NOT upwards compatible with this release. If
you have saved compiled patterns from a previous release, you will have to
re-compile them. Important changes that are visible to users are:

1. The Unicode property tables have been updated to Unicode 5.0.0, which adds
   some more scripts.

2. The option PCRE_NEWLINE_ANY causes PCRE to recognize any Unicode newline
   sequence as a newline.

3. The \R escape matches a single Unicode newline sequence as a single unit.

4. New features that will appear in Perl 5.10 are now in PCRE. These include
   alternative Perl syntax for named parentheses, and Perl syntax for
   recursion.

5. The C++ wrapper interface has been extended by the addition of a
   QuoteMeta function and the ability to allow copy construction and
   assignment.

For a complete list of changes, see the ChangeLog file.


Release 6.7 04-Jul-06
---------------------

The main additions to this release are the ability to use the same name for
multiple sets of parentheses, and support for CRLF line endings in both the
library and pcregrep (and in pcretest for testing).

Thanks to Ian Taylor, the stack usage for many kinds of pattern has been
significantly reduced for certain subject strings.


Release 6.5 01-Feb-06
---------------------

Important changes in this release:

1. A number of new features have been added to pcregrep.

2. The Unicode property tables have been updated to Unicode 4.1.0, and the
   supported properties have been extended with script names such as "Arabic",
   and the derived properties "Any" and "L&". This has necessitated a change to
   the interal format of compiled patterns. Any saved compiled patterns that
   use \p or \P must be recompiled.

3. The specification of recursion in patterns has been changed so that all
   recursive subpatterns are automatically treated as atomic groups. Thus, for
   example, (?R) is treated as if it were (?>(?R)). This is necessary because
   otherwise there are situations where recursion does not work.

See the ChangeLog for a complete list of changes, which include a number of bug
fixes and tidies.


Release 6.0 07-Jun-05
---------------------

The release number has been increased to 6.0 because of the addition of several
major new pieces of functionality.

A new function, pcre_dfa_exec(), which implements pattern matching using a DFA
algorithm, has been added. This has a number of advantages for certain cases,
though it does run more slowly, and lacks the ability to capture substrings. On
the other hand, it does find all matches, not just the first, and it works
better for partial matching. The pcrematching man page discusses the
differences.

The pcretest program has been enhanced so that it can make use of the new
pcre_dfa_exec() matching function and the extra features it provides.

The distribution now includes a C++ wrapper library. This is built
automatically if a C++ compiler is found. The pcrecpp man page discusses this
interface.

The code itself has been re-organized into many more files, one for each
function, so it no longer requires everything to be linked in when static
linkage is used. As a consequence, some internal functions have had to have
their names exposed. These functions all have names starting with _pcre_. They
are undocumented, and are not intended for use by outside callers.

The pcregrep program has been enhanced with new functionality such as
multiline-matching and options for output more matching context. See the
ChangeLog for a complete list of changes to the library and the utility
programs.


Release 5.0 13-Sep-04
---------------------

The licence under which PCRE is released has been changed to the more
conventional "BSD" licence.

In the code, some bugs have been fixed, and there are also some major changes
in this release (which is why I've increased the number to 5.0). Some changes
are internal rearrangements, and some provide a number of new facilities. The
new features are:

1. There's an "automatic callout" feature that inserts callouts before every
   item in the regex, and there's a new callout field that gives the position
   in the pattern - useful for debugging and tracing.

2. The extra_data structure can now be used to pass in a set of character
   tables at exec time. This is useful if compiled regex are saved and re-used
   at a later time when the tables may not be at the same address. If the
   default internal tables are used, the pointer saved with the compiled
   pattern is now set to NULL, which means that you don't need to do anything
   special unless you are using custom tables.

3. It is possible, with some restrictions on the content of the regex, to
   request "partial" matching. A special return code is given if all of the
   subject string matched part of the regex. This could be useful for testing
   an input field as it is being typed.

4. There is now some optional support for Unicode character properties, which
   means that the patterns items such as \p{Lu} and \X can now be used. Only
   the general category properties are supported. If PCRE is compiled with this
   support, an additional 90K data structure is include, which increases the
   size of the library dramatically.

5. There is support for saving compiled patterns and re-using them later.

6. There is support for running regular expressions that were compiled on a
   different host with the opposite endianness.

7. The pcretest program has been extended to accommodate the new features.

The main internal rearrangement is that sequences of literal characters are no
longer handled as strings. Instead, each character is handled on its own. This
makes some UTF-8 handling easier, and makes the support of partial matching
possible. Compiled patterns containing long literal strings will be larger as a
result of this change; I hope that performance will not be much affected.


Release 4.5 01-Dec-03
---------------------

Again mainly a bug-fix and tidying release, with only a couple of new features:

1. It's possible now to compile PCRE so that it does not use recursive
function calls when matching. Instead it gets memory from the heap. This slows
things down, but may be necessary on systems with limited stacks.

2. UTF-8 string checking has been tightened to reject overlong sequences and to
check that a starting offset points to the start of a character. Failure of the
latter returns a new error code: PCRE_ERROR_BADUTF8_OFFSET.

3. PCRE can now be compiled for systems that use EBCDIC code.


Release 4.4 21-Aug-03
---------------------

This is mainly a bug-fix and tidying release. The only new feature is that PCRE
checks UTF-8 strings for validity by default. There is an option to suppress
this, just in case anybody wants that teeny extra bit of performance.


Releases 4.1 - 4.3
------------------

Sorry, I forgot about updating the NEWS file for these releases. Please take a
look at ChangeLog.


Release 4.0 17-Feb-03
---------------------

There have been a lot of changes for the 4.0 release, adding additional
functionality and mending bugs. Below is a list of the highlights of the new
functionality. For full details of these features, please consult the
documentation. For a complete list of changes, see the ChangeLog file.

1. Support for Perl's \Q...\E escapes.

2. "Possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's Java
package. They provide some syntactic sugar for simple cases of "atomic
grouping".

3. Support for the \G assertion. It is true when the current matching position
is at the start point of the match.

4. A new feature that provides some of the functionality that Perl provides
with (?{...}). The facility is termed a "callout". The way it is done in PCRE
is for the caller to provide an optional function, by setting pcre_callout to
its entry point. To get the function called, the regex must include (?C) at
appropriate points.

5. Support for recursive calls to individual subpatterns. This makes it really
easy to get totally confused.

6. Support for named subpatterns. The Python syntax (?P<name>...) is used to
name a group.

7. Several extensions to UTF-8 support; it is now fairly complete. There is an
option for pcregrep to make it operate in UTF-8 mode.

8. The single man page has been split into a number of separate man pages.
These also give rise to individual HTML pages which are put in a separate
directory. There is an index.html page that lists them all. Some hyperlinking
between the pages has been installed.


Release 3.5 15-Aug-01
---------------------

1. The configuring system has been upgraded to use later versions of autoconf
and libtool. By default it builds both a shared and a static library if the OS
supports it. You can use --disable-shared or --disable-static on the configure
command if you want only one of them.

2. The pcretest utility is now installed along with pcregrep because it is
useful for users (to test regexs) and by doing this, it automatically gets
relinked by libtool. The documentation has been turned into a man page, so
there are now .1, .txt, and .html versions in /doc.

3. Upgrades to pcregrep:
   (i)   Added long-form option names like gnu grep.
   (ii)  Added --help to list all options with an explanatory phrase.
   (iii) Added -r, --recursive to recurse into sub-directories.
   (iv)  Added -f, --file to read patterns from a file.

4. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure
script, to force use of CR or LF instead of \n in the source. On non-Unix
systems, the value can be set in config.h.

5. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an
absolute limit. Changed the text of the error message to make this clear, and
likewise updated the man page.

6. The limit of 99 on the number of capturing subpatterns has been removed.
The new limit is 65535, which I hope will not be a "real" limit.


Release 3.3 01-Aug-00
---------------------

There is some support for UTF-8 character strings. This is incomplete and
experimental. The documentation describes what is and what is not implemented.
Otherwise, this is just a bug-fixing release.


Release 3.0 01-Feb-00
---------------------

1. A "configure" script is now used to configure PCRE for Unix systems. It
builds a Makefile, a config.h file, and the pcre-config script.

2. PCRE is built as a shared library by default.

3. There is support for POSIX classes such as [:alpha:].

5. There is an experimental recursion feature.

----------------------------------------------------------------------------
          IMPORTANT FOR THOSE UPGRADING FROM VERSIONS BEFORE 2.00

Please note that there has been a change in the API such that a larger
ovector is required at matching time, to provide some additional workspace.
The new man page has details. This change was necessary in order to support
some of the new functionality in Perl 5.005.

          IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.00

Another (I hope this is the last!) change has been made to the API for the
pcre_compile() function. An additional argument has been added to make it
possible to pass over a pointer to character tables built in the current
locale by pcre_maketables(). To use the default tables, this new arguement
should be passed as NULL.

          IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.05

Yet another (and again I hope this really is the last) change has been made
to the API for the pcre_exec() function. An additional argument has been
added to make it possible to start the match other than at the start of the
subject string. This is important if there are lookbehinds. The new man
page has the details, but you just want to convert existing programs, all
you need to do is to stick in a new fifth argument to pcre_exec(), with a
value of zero. For example, change

  pcre_exec(pattern, extra, subject, length, options, ovec, ovecsize)
to
  pcre_exec(pattern, extra, subject, length, 0, options, ovec, ovecsize)

****
PK��$[/���doc/alt-pcre802/AUTHORSnu�[���THE MAIN PCRE LIBRARY
---------------------

Written by:       Philip Hazel
Email local part: ph10
Email domain:     cam.ac.uk

University of Cambridge Computing Service,
Cambridge, England.

Copyright (c) 1997-2010 University of Cambridge
All rights reserved


THE C++ WRAPPER LIBRARY
-----------------------

Written by:       Google Inc.

Copyright (c) 2007-2010 Google Inc
All rights reserved

####
PK��$[!���__doc/alt-pcre802/COPYINGnu�[���PCRE LICENCE

Please see the file LICENCE in the PCRE distribution for licensing details.

End
PK��$[�Q8�	�	doc/alt-pcre802/LICENCEnu�[���PCRE LICENCE
------------

PCRE is a library of functions to support regular expressions whose syntax
and semantics are as close as possible to those of the Perl 5 language.

Release 8 of PCRE is distributed under the terms of the "BSD" licence, as
specified below. The documentation for PCRE, supplied in the "doc"
directory, is distributed under the same terms as the software itself.

The basic library functions are written in C and are freestanding. Also
included in the distribution is a set of C++ wrapper functions.


THE BASIC LIBRARY FUNCTIONS
---------------------------

Written by:       Philip Hazel
Email local part: ph10
Email domain:     cam.ac.uk

University of Cambridge Computing Service,
Cambridge, England.

Copyright (c) 1997-2010 University of Cambridge
All rights reserved.


THE C++ WRAPPER FUNCTIONS
-------------------------

Contributed by:   Google Inc.

Copyright (c) 2007-2010, Google Inc.
All rights reserved.


THE "BSD" LICENCE
-----------------

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 University of Cambridge nor the name of Google
      Inc. nor the names of their 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.

End
PK��$[gf������doc/alt-pcre802/READMEnu�[���README file for PCRE (Perl-compatible regular expression library)
-----------------------------------------------------------------

The latest release of PCRE is always available in three alternative formats
from:

  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz
  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.bz2
  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.zip

There is a mailing list for discussion about the development of PCRE at

  pcre-dev@exim.org

Please read the NEWS file if you are upgrading from a previous release.
The contents of this README file are:

  The PCRE APIs
  Documentation for PCRE
  Contributions by users of PCRE
  Building PCRE on non-Unix systems
  Building PCRE on Unix-like systems
  Retrieving configuration information on Unix-like systems
  Shared libraries on Unix-like systems
  Cross-compiling on Unix-like systems
  Using HP's ANSI C++ compiler (aCC)
  Using PCRE from MySQL
  Making new tarballs
  Testing PCRE
  Character tables
  File manifest


The PCRE APIs
-------------

PCRE is written in C, and it has its own API. The distribution also includes a
set of C++ wrapper functions (see the pcrecpp man page for details), courtesy
of Google Inc.

In addition, there is a set of C wrapper functions that are based on the POSIX
regular expression API (see the pcreposix man page). These end up in the
library called libpcreposix. Note that this just provides a POSIX calling
interface to PCRE; the regular expressions themselves still follow Perl syntax
and semantics. The POSIX API is restricted, and does not give full access to
all of PCRE's facilities.

The header file for the POSIX-style functions is called pcreposix.h. The
official POSIX name is regex.h, but I did not want to risk possible problems
with existing files of that name by distributing it that way. To use PCRE with
an existing program that uses the POSIX API, pcreposix.h will have to be
renamed or pointed at by a link.

If you are using the POSIX interface to PCRE and there is already a POSIX regex
library installed on your system, as well as worrying about the regex.h header
file (as mentioned above), you must also take care when linking programs to
ensure that they link with PCRE's libpcreposix library. Otherwise they may pick
up the POSIX functions of the same name from the other library.

One way of avoiding this confusion is to compile PCRE with the addition of
-Dregcomp=PCREregcomp (and similarly for the other POSIX functions) to the
compiler flags (CFLAGS if you are using "configure" -- see below). This has the
effect of renaming the functions so that the names no longer clash. Of course,
you have to do the same thing for your applications, or write them using the
new names.


Documentation for PCRE
----------------------

If you install PCRE in the normal way on a Unix-like system, you will end up
with a set of man pages whose names all start with "pcre". The one that is just
called "pcre" lists all the others. In addition to these man pages, the PCRE
documentation is supplied in two other forms:

  1. There are files called doc/pcre.txt, doc/pcregrep.txt, and
     doc/pcretest.txt in the source distribution. The first of these is a
     concatenation of the text forms of all the section 3 man pages except
     those that summarize individual functions. The other two are the text
     forms of the section 1 man pages for the pcregrep and pcretest commands.
     These text forms are provided for ease of scanning with text editors or
     similar tools. They are installed in <prefix>/share/doc/pcre, where
     <prefix> is the installation prefix (defaulting to /usr/local).

  2. A set of files containing all the documentation in HTML form, hyperlinked
     in various ways, and rooted in a file called index.html, is distributed in
     doc/html and installed in <prefix>/share/doc/pcre/html.

Users of PCRE have contributed files containing the documentation for various
releases in CHM format. These can be found in the Contrib directory of the FTP
site (see next section).


Contributions by users of PCRE
------------------------------

You can find contributions from PCRE users in the directory

  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib

There is a README file giving brief descriptions of what they are. Some are
complete in themselves; others are pointers to URLs containing relevant files.
Some of this material is likely to be well out-of-date. Several of the earlier
contributions provided support for compiling PCRE on various flavours of
Windows (I myself do not use Windows). Nowadays there is more Windows support
in the standard distribution, so these contibutions have been archived.


Building PCRE on non-Unix systems
---------------------------------

For a non-Unix system, please read the comments in the file NON-UNIX-USE,
though if your system supports the use of "configure" and "make" you may be
able to build PCRE in the same way as for Unix-like systems. PCRE can also be
configured in many platform environments using the GUI facility provided by
CMake's cmake-gui command. This creates Makefiles, solution files, etc.

PCRE has been compiled on many different operating systems. It should be
straightforward to build PCRE on any system that has a Standard C compiler and
library, because it uses only Standard C functions.


Building PCRE on Unix-like systems
----------------------------------

If you are using HP's ANSI C++ compiler (aCC), please see the special note
in the section entitled "Using HP's ANSI C++ compiler (aCC)" below.

The following instructions assume the use of the widely used "configure, make,
make install" process. There is also support for CMake in the PCRE
distribution; there are some comments about using CMake in the NON-UNIX-USE
file, though it can also be used in Unix-like systems.

To build PCRE on a Unix-like system, first run the "configure" command from the
PCRE distribution directory, with your current directory set to the directory
where you want the files to be created. This command is a standard GNU
"autoconf" configuration script, for which generic instructions are supplied in
the file INSTALL.

Most commonly, people build PCRE within its own distribution directory, and in
this case, on many systems, just running "./configure" is sufficient. However,
the usual methods of changing standard defaults are available. For example:

CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local

specifies that the C compiler should be run with the flags '-O2 -Wall' instead
of the default, and that "make install" should install PCRE under /opt/local
instead of the default /usr/local.

If you want to build in a different directory, just run "configure" with that
directory as current. For example, suppose you have unpacked the PCRE source
into /source/pcre/pcre-xxx, but you want to build it in /build/pcre/pcre-xxx:

cd /build/pcre/pcre-xxx
/source/pcre/pcre-xxx/configure

PCRE is written in C and is normally compiled as a C library. However, it is
possible to build it as a C++ library, though the provided building apparatus
does not have any features to support this.

There are some optional features that can be included or omitted from the PCRE
library. You can read more about them in the pcrebuild man page.

. If you want to suppress the building of the C++ wrapper library, you can add
  --disable-cpp to the "configure" command. Otherwise, when "configure" is run,
  it will try to find a C++ compiler and C++ header files, and if it succeeds,
  it will try to build the C++ wrapper.

. If you want to make use of the support for UTF-8 Unicode character strings in
  PCRE, you must add --enable-utf8 to the "configure" command. Without it, the
  code for handling UTF-8 is not included in the library. Even when included,
  it still has to be enabled by an option at run time. When PCRE is compiled
  with this option, its input can only either be ASCII or UTF-8, even when
  running on EBCDIC platforms. It is not possible to use both --enable-utf8 and
  --enable-ebcdic at the same time.

. If, in addition to support for UTF-8 character strings, you want to include
  support for the \P, \p, and \X sequences that recognize Unicode character
  properties, you must add --enable-unicode-properties to the "configure"
  command. This adds about 30K to the size of the library (in the form of a
  property table); only the basic two-letter properties such as Lu are
  supported.

. You can build PCRE to recognize either CR or LF or the sequence CRLF or any
  of the preceding, or any of the Unicode newline sequences as indicating the
  end of a line. Whatever you specify at build time is the default; the caller
  of PCRE can change the selection at run time. The default newline indicator
  is a single LF character (the Unix standard). You can specify the default
  newline indicator by adding --enable-newline-is-cr or --enable-newline-is-lf
  or --enable-newline-is-crlf or --enable-newline-is-anycrlf or
  --enable-newline-is-any to the "configure" command, respectively.

  If you specify --enable-newline-is-cr or --enable-newline-is-crlf, some of
  the standard tests will fail, because the lines in the test files end with
  LF. Even if the files are edited to change the line endings, there are likely
  to be some failures. With --enable-newline-is-anycrlf or
  --enable-newline-is-any, many tests should succeed, but there may be some
  failures.

. By default, the sequence \R in a pattern matches any Unicode line ending
  sequence. This is independent of the option specifying what PCRE considers to
  be the end of a line (see above). However, the caller of PCRE can restrict \R
  to match only CR, LF, or CRLF. You can make this the default by adding
  --enable-bsr-anycrlf to the "configure" command (bsr = "backslash R").

. When called via the POSIX interface, PCRE uses malloc() to get additional
  storage for processing capturing parentheses if there are more than 10 of
  them in a pattern. You can increase this threshold by setting, for example,

  --with-posix-malloc-threshold=20

  on the "configure" command.

. PCRE has a counter that can be set to limit the amount of resources it uses.
  If the limit is exceeded during a match, the match fails. The default is ten
  million. You can change the default by setting, for example,

  --with-match-limit=500000

  on the "configure" command. This is just the default; individual calls to
  pcre_exec() can supply their own value. There is more discussion on the
  pcreapi man page.

. There is a separate counter that limits the depth of recursive function calls
  during a matching process. This also has a default of ten million, which is
  essentially "unlimited". You can change the default by setting, for example,

  --with-match-limit-recursion=500000

  Recursive function calls use up the runtime stack; running out of stack can
  cause programs to crash in strange ways. There is a discussion about stack
  sizes in the pcrestack man page.

. The default maximum compiled pattern size is around 64K. You can increase
  this by adding --with-link-size=3 to the "configure" command. You can
  increase it even more by setting --with-link-size=4, but this is unlikely
  ever to be necessary. Increasing the internal link size will reduce
  performance.

. You can build PCRE so that its internal match() function that is called from
  pcre_exec() does not call itself recursively. Instead, it uses memory blocks
  obtained from the heap via the special functions pcre_stack_malloc() and
  pcre_stack_free() to save data that would otherwise be saved on the stack. To
  build PCRE like this, use

  --disable-stack-for-recursion

  on the "configure" command. PCRE runs more slowly in this mode, but it may be
  necessary in environments with limited stack sizes. This applies only to the
  pcre_exec() function; it does not apply to pcre_dfa_exec(), which does not
  use deeply nested recursion. There is a discussion about stack sizes in the
  pcrestack man page.

. For speed, PCRE uses four tables for manipulating and identifying characters
  whose code point values are less than 256. By default, it uses a set of
  tables for ASCII encoding that is part of the distribution. If you specify

  --enable-rebuild-chartables

  a program called dftables is compiled and run in the default C locale when
  you obey "make". It builds a source file called pcre_chartables.c. If you do
  not specify this option, pcre_chartables.c is created as a copy of
  pcre_chartables.c.dist. See "Character tables" below for further information.

. It is possible to compile PCRE for use on systems that use EBCDIC as their
  character code (as opposed to ASCII) by specifying

  --enable-ebcdic

  This automatically implies --enable-rebuild-chartables (see above). However,
  when PCRE is built this way, it always operates in EBCDIC. It cannot support
  both EBCDIC and UTF-8.

. It is possible to compile pcregrep to use libz and/or libbz2, in order to
  read .gz and .bz2 files (respectively), by specifying one or both of

  --enable-pcregrep-libz
  --enable-pcregrep-libbz2

  Of course, the relevant libraries must be installed on your system.

. It is possible to compile pcretest so that it links with the libreadline
  library, by specifying

  --enable-pcretest-libreadline

  If this is done, when pcretest's input is from a terminal, it reads it using
  the readline() function. This provides line-editing and history facilities.
  Note that libreadline is GPL-licenced, so if you distribute a binary of
  pcretest linked in this way, there may be licensing issues.

  Setting this option causes the -lreadline option to be added to the pcretest
  build. In many operating environments with a sytem-installed readline
  library this is sufficient. However, in some environments (e.g. if an
  unmodified distribution version of readline is in use), it may be necessary
  to specify something like LIBS="-lncurses" as well. This is because, to quote
  the readline INSTALL, "Readline uses the termcap functions, but does not link
  with the termcap or curses library itself, allowing applications which link
  with readline the to choose an appropriate library." If you get error
  messages about missing functions tgetstr, tgetent, tputs, tgetflag, or tgoto,
  this is the problem, and linking with the ncurses library should fix it.

The "configure" script builds the following files for the basic C library:

. Makefile is the makefile that builds the library
. config.h contains build-time configuration options for the library
. pcre.h is the public PCRE header file
. pcre-config is a script that shows the settings of "configure" options
. libpcre.pc is data for the pkg-config command
. libtool is a script that builds shared and/or static libraries
. RunTest is a script for running tests on the basic C library
. RunGrepTest is a script for running tests on the pcregrep command

Versions of config.h and pcre.h are distributed in the PCRE tarballs under the
names config.h.generic and pcre.h.generic. These are provided for those who
have to built PCRE without using "configure" or CMake. If you use "configure"
or CMake, the .generic versions are not used.

If a C++ compiler is found, the following files are also built:

. libpcrecpp.pc is data for the pkg-config command
. pcrecpparg.h is a header file for programs that call PCRE via the C++ wrapper
. pcre_stringpiece.h is the header for the C++ "stringpiece" functions

The "configure" script also creates config.status, which is an executable
script that can be run to recreate the configuration, and config.log, which
contains compiler output from tests that "configure" runs.

Once "configure" has run, you can run "make". It builds two libraries, called
libpcre and libpcreposix, a test program called pcretest, and the pcregrep
command. If a C++ compiler was found on your system, "make" also builds the C++
wrapper library, which is called libpcrecpp, and some test programs called
pcrecpp_unittest, pcre_scanner_unittest, and pcre_stringpiece_unittest.
Building the C++ wrapper can be disabled by adding --disable-cpp to the
"configure" command.

The command "make check" runs all the appropriate tests. Details of the PCRE
tests are given below in a separate section of this document.

You can use "make install" to install PCRE into live directories on your
system. The following are installed (file names are all relative to the
<prefix> that is set when "configure" is run):

  Commands (bin):
    pcretest
    pcregrep
    pcre-config

  Libraries (lib):
    libpcre
    libpcreposix
    libpcrecpp (if C++ support is enabled)

  Configuration information (lib/pkgconfig):
    libpcre.pc
    libpcrecpp.pc (if C++ support is enabled)

  Header files (include):
    pcre.h
    pcreposix.h
    pcre_scanner.h      )
    pcre_stringpiece.h  ) if C++ support is enabled
    pcrecpp.h           )
    pcrecpparg.h        )

  Man pages (share/man/man{1,3}):
    pcregrep.1
    pcretest.1
    pcre.3
    pcre*.3 (lots more pages, all starting "pcre")

  HTML documentation (share/doc/pcre/html):
    index.html
    *.html (lots more pages, hyperlinked from index.html)

  Text file documentation (share/doc/pcre):
    AUTHORS
    COPYING
    ChangeLog
    LICENCE
    NEWS
    README
    pcre.txt       (a concatenation of the man(3) pages)
    pcretest.txt   the pcretest man page
    pcregrep.txt   the pcregrep man page

If you want to remove PCRE from your system, you can run "make uninstall".
This removes all the files that "make install" installed. However, it does not
remove any directories, because these are often shared with other programs.


Retrieving configuration information on Unix-like systems
---------------------------------------------------------

Running "make install" installs the command pcre-config, which can be used to
recall information about the PCRE configuration and installation. For example:

  pcre-config --version

prints the version number, and

  pcre-config --libs

outputs information about where the library is installed. This command can be
included in makefiles for programs that use PCRE, saving the programmer from
having to remember too many details.

The pkg-config command is another system for saving and retrieving information
about installed libraries. Instead of separate commands for each library, a
single command is used. For example:

  pkg-config --cflags pcre

The data is held in *.pc files that are installed in a directory called
<prefix>/lib/pkgconfig.


Shared libraries on Unix-like systems
-------------------------------------

The default distribution builds PCRE as shared libraries and static libraries,
as long as the operating system supports shared libraries. Shared library
support relies on the "libtool" script which is built as part of the
"configure" process.

The libtool script is used to compile and link both shared and static
libraries. They are placed in a subdirectory called .libs when they are newly
built. The programs pcretest and pcregrep are built to use these uninstalled
libraries (by means of wrapper scripts in the case of shared libraries). When
you use "make install" to install shared libraries, pcregrep and pcretest are
automatically re-built to use the newly installed shared libraries before being
installed themselves. However, the versions left in the build directory still
use the uninstalled libraries.

To build PCRE using static libraries only you must use --disable-shared when
configuring it. For example:

./configure --prefix=/usr/gnu --disable-shared

Then run "make" in the usual way. Similarly, you can use --disable-static to
build only shared libraries.


Cross-compiling on Unix-like systems
------------------------------------

You can specify CC and CFLAGS in the normal way to the "configure" command, in
order to cross-compile PCRE for some other host. However, you should NOT
specify --enable-rebuild-chartables, because if you do, the dftables.c source
file is compiled and run on the local host, in order to generate the inbuilt
character tables (the pcre_chartables.c file). This will probably not work,
because dftables.c needs to be compiled with the local compiler, not the cross
compiler.

When --enable-rebuild-chartables is not specified, pcre_chartables.c is created
by making a copy of pcre_chartables.c.dist, which is a default set of tables
that assumes ASCII code. Cross-compiling with the default tables should not be
a problem.

If you need to modify the character tables when cross-compiling, you should
move pcre_chartables.c.dist out of the way, then compile dftables.c by hand and
run it on the local host to make a new version of pcre_chartables.c.dist.
Then when you cross-compile PCRE this new version of the tables will be used.


Using HP's ANSI C++ compiler (aCC)
----------------------------------

Unless C++ support is disabled by specifying the "--disable-cpp" option of the
"configure" script, you must include the "-AA" option in the CXXFLAGS
environment variable in order for the C++ components to compile correctly.

Also, note that the aCC compiler on PA-RISC platforms may have a defect whereby
needed libraries fail to get included when specifying the "-AA" compiler
option. If you experience unresolved symbols when linking the C++ programs,
use the workaround of specifying the following environment variable prior to
running the "configure" script:

  CXXLDFLAGS="-lstd_v2 -lCsup_v2"


Using Sun's compilers for Solaris
---------------------------------

A user reports that the following configurations work on Solaris 9 sparcv9 and
Solaris 9 x86 (32-bit):

  Solaris 9 sparcv9: ./configure --disable-cpp CC=/bin/cc CFLAGS="-m64 -g"
  Solaris 9 x86:     ./configure --disable-cpp CC=/bin/cc CFLAGS="-g"


Using PCRE from MySQL
---------------------

On systems where both PCRE and MySQL are installed, it is possible to make use
of PCRE from within MySQL, as an alternative to the built-in pattern matching.
There is a web page that tells you how to do this:

  http://www.mysqludf.org/lib_mysqludf_preg/index.php


Making new tarballs
-------------------

The command "make dist" creates three PCRE tarballs, in tar.gz, tar.bz2, and
zip formats. The command "make distcheck" does the same, but then does a trial
build of the new distribution to ensure that it works.

If you have modified any of the man page sources in the doc directory, you
should first run the PrepareRelease script before making a distribution. This
script creates the .txt and HTML forms of the documentation from the man pages.


Testing PCRE
------------

To test the basic PCRE library on a Unix system, run the RunTest script that is
created by the configuring process. There is also a script called RunGrepTest
that tests the options of the pcregrep command. If the C++ wrapper library is
built, three test programs called pcrecpp_unittest, pcre_scanner_unittest, and
pcre_stringpiece_unittest are also built.

Both the scripts and all the program tests are run if you obey "make check" or
"make test". For other systems, see the instructions in NON-UNIX-USE.

The RunTest script runs the pcretest test program (which is documented in its
own man page) on each of the testinput files in the testdata directory in
turn, and compares the output with the contents of the corresponding testoutput
files. A file called testtry is used to hold the main output from pcretest
(testsavedregex is also used as a working file). To run pcretest on just one of
the test files, give its number as an argument to RunTest, for example:

  RunTest 2

The first test file can also be fed directly into the perltest.pl script to
check that Perl gives the same results. The only difference you should see is
in the first few lines, where the Perl version is given instead of the PCRE
version.

The second set of tests check pcre_fullinfo(), pcre_info(), pcre_study(),
pcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error
detection, and run-time flags that are specific to PCRE, as well as the POSIX
wrapper API. It also uses the debugging flags to check some of the internals of
pcre_compile().

If you build PCRE with a locale setting that is not the standard C locale, the
character tables may be different (see next paragraph). In some cases, this may
cause failures in the second set of tests. For example, in a locale where the
isprint() function yields TRUE for characters in the range 128-255, the use of
[:isascii:] inside a character class defines a different set of characters, and
this shows up in this test as a difference in the compiled code, which is being
listed for checking. Where the comparison test output contains [\x00-\x7f] the
test will contain [\x00-\xff], and similarly in some other cases. This is not a
bug in PCRE.

The third set of tests checks pcre_maketables(), the facility for building a
set of character tables for a specific locale and using them instead of the
default tables. The tests make use of the "fr_FR" (French) locale. Before
running the test, the script checks for the presence of this locale by running
the "locale" command. If that command fails, or if it doesn't include "fr_FR"
in the list of available locales, the third test cannot be run, and a comment
is output to say why. If running this test produces instances of the error

  ** Failed to set locale "fr_FR"

in the comparison output, it means that locale is not available on your system,
despite being listed by "locale". This does not mean that PCRE is broken.

[If you are trying to run this test on Windows, you may be able to get it to
work by changing "fr_FR" to "french" everywhere it occurs. Alternatively, use
RunTest.bat. The version of RunTest.bat included with PCRE 7.4 and above uses
Windows versions of test 2. More info on using RunTest.bat is included in the
document entitled NON-UNIX-USE.]

The fourth test checks the UTF-8 support. It is not run automatically unless
PCRE is built with UTF-8 support. To do this you must set --enable-utf8 when
running "configure". This file can be also fed directly to the perltest.pl
script, provided you are running Perl 5.8 or higher.

The fifth test checks error handling with UTF-8 encoding, and internal UTF-8
features of PCRE that are not relevant to Perl.

The sixth test (which is Perl-5.10 compatible) checks the support for Unicode
character properties. It it not run automatically unless PCRE is built with
Unicode property support. To to this you must set --enable-unicode-properties
when running "configure".

The seventh, eighth, and ninth tests check the pcre_dfa_exec() alternative
matching function, in non-UTF-8 mode, UTF-8 mode, and UTF-8 mode with Unicode
property support, respectively. The eighth and ninth tests are not run
automatically unless PCRE is build with the relevant support.

The tenth test checks some internal offsets and code size features; it is run
only when the default "link size" of 2 is set (in other cases the sizes
change).

The eleventh test checks out features that are new in Perl 5.10, and the
twelfth test checks a number internals and non-Perl features concerned with
Unicode property support. It it not run automatically unless PCRE is built with
Unicode property support. To to this you must set --enable-unicode-properties
when running "configure".


Character tables
----------------

For speed, PCRE uses four tables for manipulating and identifying characters
whose code point values are less than 256. The final argument of the
pcre_compile() function is a pointer to a block of memory containing the
concatenated tables. A call to pcre_maketables() can be used to generate a set
of tables in the current locale. If the final argument for pcre_compile() is
passed as NULL, a set of default tables that is built into the binary is used.

The source file called pcre_chartables.c contains the default set of tables. By
default, this is created as a copy of pcre_chartables.c.dist, which contains
tables for ASCII coding. However, if --enable-rebuild-chartables is specified
for ./configure, a different version of pcre_chartables.c is built by the
program dftables (compiled from dftables.c), which uses the ANSI C character
handling functions such as isalnum(), isalpha(), isupper(), islower(), etc. to
build the table sources. This means that the default C locale which is set for
your system will control the contents of these default tables. You can change
the default tables by editing pcre_chartables.c and then re-building PCRE. If
you do this, you should take care to ensure that the file does not get
automatically re-generated. The best way to do this is to move
pcre_chartables.c.dist out of the way and replace it with your customized
tables.

When the dftables program is run as a result of --enable-rebuild-chartables,
it uses the default C locale that is set on your system. It does not pay
attention to the LC_xxx environment variables. In other words, it uses the
system's default locale rather than whatever the compiling user happens to have
set. If you really do want to build a source set of character tables in a
locale that is specified by the LC_xxx variables, you can run the dftables
program by hand with the -L option. For example:

  ./dftables -L pcre_chartables.c.special

The first two 256-byte tables provide lower casing and case flipping functions,
respectively. The next table consists of three 32-byte bit maps which identify
digits, "word" characters, and white space, respectively. These are used when
building 32-byte bit maps that represent character classes for code points less
than 256.

The final 256-byte table has bits indicating various character types, as
follows:

    1   white space character
    2   letter
    4   decimal digit
    8   hexadecimal digit
   16   alphanumeric or '_'
  128   regular expression metacharacter or binary zero

You should not alter the set of characters that contain the 128 bit, as that
will cause PCRE to malfunction.


File manifest
-------------

The distribution should contain the following files:

(A) Source files of the PCRE library functions and their headers:

  dftables.c              auxiliary program for building pcre_chartables.c
                            when --enable-rebuild-chartables is specified

  pcre_chartables.c.dist  a default set of character tables that assume ASCII
                            coding; used, unless --enable-rebuild-chartables is
                            specified, by copying to pcre_chartables.c

  pcreposix.c             )
  pcre_compile.c          )
  pcre_config.c           )
  pcre_dfa_exec.c         )
  pcre_exec.c             )
  pcre_fullinfo.c         )
  pcre_get.c              ) sources for the functions in the library,
  pcre_globals.c          )   and some internal functions that they use
  pcre_info.c             )
  pcre_maketables.c       )
  pcre_newline.c          )
  pcre_ord2utf8.c         )
  pcre_refcount.c         )
  pcre_study.c            )
  pcre_tables.c           )
  pcre_try_flipped.c      )
  pcre_ucd.c              )
  pcre_valid_utf8.c       )
  pcre_version.c          )
  pcre_xclass.c           )
  pcre_printint.src       ) debugging function that is #included in pcretest,
                          )   and can also be #included in pcre_compile()
  pcre.h.in               template for pcre.h when built by "configure"
  pcreposix.h             header for the external POSIX wrapper API
  pcre_internal.h         header for internal use
  ucp.h                   header for Unicode property handling

  config.h.in             template for config.h, which is built by "configure"

  pcrecpp.h               public header file for the C++ wrapper
  pcrecpparg.h.in         template for another C++ header file
  pcre_scanner.h          public header file for C++ scanner functions
  pcrecpp.cc              )
  pcre_scanner.cc         ) source for the C++ wrapper library

  pcre_stringpiece.h.in   template for pcre_stringpiece.h, the header for the
                            C++ stringpiece functions
  pcre_stringpiece.cc     source for the C++ stringpiece functions

(B) Source files for programs that use PCRE:

  pcredemo.c              simple demonstration of coding calls to PCRE
  pcregrep.c              source of a grep utility that uses PCRE
  pcretest.c              comprehensive test program

(C) Auxiliary files:

  132html                 script to turn "man" pages into HTML
  AUTHORS                 information about the author of PCRE
  ChangeLog               log of changes to the code
  CleanTxt                script to clean nroff output for txt man pages
  Detrail                 script to remove trailing spaces
  HACKING                 some notes about the internals of PCRE
  INSTALL                 generic installation instructions
  LICENCE                 conditions for the use of PCRE
  COPYING                 the same, using GNU's standard name
  Makefile.in             ) template for Unix Makefile, which is built by
                          )   "configure"
  Makefile.am             ) the automake input that was used to create
                          )   Makefile.in
  NEWS                    important changes in this release
  NON-UNIX-USE            notes on building PCRE on non-Unix systems
  PrepareRelease          script to make preparations for "make dist"
  README                  this file
  RunTest                 a Unix shell script for running tests
  RunGrepTest             a Unix shell script for pcregrep tests
  aclocal.m4              m4 macros (generated by "aclocal")
  config.guess            ) files used by libtool,
  config.sub              )   used only when building a shared library
  configure               a configuring shell script (built by autoconf)
  configure.ac            ) the autoconf input that was used to build
                          )   "configure" and config.h
  depcomp                 ) script to find program dependencies, generated by
                          )   automake
  doc/*.3                 man page sources for PCRE
  doc/*.1                 man page sources for pcregrep and pcretest
  doc/index.html.src      the base HTML page
  doc/html/*              HTML documentation
  doc/pcre.txt            plain text version of the man pages
  doc/pcretest.txt        plain text documentation of test program
  doc/perltest.txt        plain text documentation of Perl test program
  install-sh              a shell script for installing files
  libpcre.pc.in           template for libpcre.pc for pkg-config
  libpcreposix.pc.in      template for libpcreposix.pc for pkg-config
  libpcrecpp.pc.in        template for libpcrecpp.pc for pkg-config
  ltmain.sh               file used to build a libtool script
  missing                 ) common stub for a few missing GNU programs while
                          )   installing, generated by automake
  mkinstalldirs           script for making install directories
  perltest.pl             Perl test program
  pcre-config.in          source of script which retains PCRE information
  pcrecpp_unittest.cc          )
  pcre_scanner_unittest.cc     ) test programs for the C++ wrapper
  pcre_stringpiece_unittest.cc )
  testdata/testinput*     test data for main library tests
  testdata/testoutput*    expected test results
  testdata/grep*          input and output for pcregrep tests

(D) Auxiliary files for cmake support

  cmake/COPYING-CMAKE-SCRIPTS
  cmake/FindPackageHandleStandardArgs.cmake
  cmake/FindReadline.cmake
  CMakeLists.txt
  config-cmake.h.in

(E) Auxiliary files for VPASCAL

  makevp.bat
  makevp_c.txt
  makevp_l.txt
  pcregexp.pas

(F) Auxiliary files for building PCRE "by hand"

  pcre.h.generic          ) a version of the public PCRE header file
                          )   for use in non-"configure" environments
  config.h.generic        ) a version of config.h for use in non-"configure"
                          )   environments

(F) Miscellaneous

  RunTest.bat            a script for running tests under Windows

Philip Hazel
Email local part: ph10
Email domain: cam.ac.uk
Last updated: 19 January 2010
PK��$[w~U�zz%doc/alt-pcre802-devel/pcre-config.txtnu�[���PCRE-CONFIG(1)                                                  PCRE-CONFIG(1)



NAME
       pcre-config - program to return PCRE configuration

SYNOPSIS

       pcre-config [--prefix] [--exec-prefix] [--version] [--libs]
            [--libs-posix] [--cflags] [--cflags-posix]


DESCRIPTION

       pcre-config  returns  the configuration of the installed PCRE libraries
       and the options required to compile a program to use them.


OPTIONS

       --prefix  Writes the directory prefix used in the PCRE installation for
                 architecture   independent   files  (/usr  on  many  systems,
                 /usr/local on some systems) to the standard output.

       --exec-prefix
                 Writes the directory prefix used in the PCRE installation for
                 architecture  dependent files (normally the same as --prefix)
                 to the standard output.

       --version Writes the version number of the installed PCRE libraries  to
                 the standard output.

       --libs    Writes  to  the  standard  output  the  command  line options
                 required to link with PCRE (-lpcre on many systems).

       --libs-posix
                 Writes to  the  standard  output  the  command  line  options
                 required  to  link  with  the  PCRE  posix  emulation library
                 (-lpcreposix -lpcre on many systems).

       --cflags  Writes to  the  standard  output  the  command  line  options
                 required  to  compile  files  that use PCRE (this may include
                 some -I options, but is blank on many systems).

       --cflags-posix
                 Writes to  the  standard  output  the  command  line  options
                 required  to  compile files that use the PCRE posix emulation
                 library (this may include some -I options, but  is  blank  on
                 many systems).


SEE ALSO

       pcre(3)


AUTHOR

       This  manual  page  was originally written by Mark Baker for the Debian
       GNU/Linux system. It has been slightly revised as a  generic  PCRE  man
       page.


REVISION

       Last updated: 18 April 2007
PK��$[a�Y=�p�p"doc/alt-pcre802-devel/pcregrep.txtnu�[���PCREGREP(1)                                                        PCREGREP(1)


NAME
       pcregrep - a grep with Perl-compatible regular expressions.


SYNOPSIS
       pcregrep [options] [long options] [pattern] [path1 path2 ...]


DESCRIPTION

       pcregrep  searches  files  for  character  patterns, in the same way as
       other grep commands do, but it uses the PCRE regular expression library
       to support patterns that are compatible with the regular expressions of
       Perl 5. See pcrepattern(3) for a full description of syntax and  seman-
       tics of the regular expressions that PCRE supports.

       Patterns,  whether  supplied on the command line or in a separate file,
       are given without delimiters. For example:

         pcregrep Thursday /etc/motd

       If you attempt to use delimiters (for example, by surrounding a pattern
       with  slashes,  as  is common in Perl scripts), they are interpreted as
       part of the pattern. Quotes can of course be used to  delimit  patterns
       on  the  command  line  because  they are interpreted by the shell, and
       indeed they are required if a pattern contains  white  space  or  shell
       metacharacters.

       The  first  argument that follows any option settings is treated as the
       single pattern to be matched when neither -e nor -f is  present.   Con-
       versely,  when  one  or  both of these options are used to specify pat-
       terns, all arguments are treated as path names. At least one of -e, -f,
       or an argument pattern must be provided.

       If no files are specified, pcregrep reads the standard input. The stan-
       dard input can also be referenced by a  name  consisting  of  a  single
       hyphen.  For example:

         pcregrep some-pattern /file1 - /file3

       By  default, each line that matches a pattern is copied to the standard
       output, and if there is more than one file, the file name is output  at
       the start of each line, followed by a colon. However, there are options
       that can change how pcregrep behaves.  In  particular,  the  -M  option
       makes  it  possible  to  search for patterns that span line boundaries.
       What defines a line  boundary  is  controlled  by  the  -N  (--newline)
       option.

       Patterns  are  limited  to  8K  or  BUFSIZ characters, whichever is the
       greater.  BUFSIZ is defined in <stdio.h>. When there is more  than  one
       pattern (specified by the use of -e and/or -f), each pattern is applied
       to each line in the order in which they are defined,  except  that  all
       the -e patterns are tried before the -f patterns.

       By  default,  as soon as one pattern matches (or fails to match when -v
       is used), no further patterns are considered. However, if --colour  (or
       --color) is used to colour the matching substrings, or if --only-match-
       ing, --file-offsets, or --line-offsets is used to output only the  part
       of  the  line  that  matched (either shown literally, or as an offset),
       scanning resumes immediately  following  the  match,  so  that  further
       matches  on the same line can be found. If there are multiple patterns,
       they are all tried on the remainder of the line, but patterns that fol-
       low the one that matched are not tried on the earlier part of the line.

       This is the same behaviour as GNU grep, but it does mean that the order
       in which multiple patterns are specified can affect the output when one
       of the above options is used.

       Patterns  that can match an empty string are accepted, but empty string
       matches   are   never   recognized.   An   example   is   the   pattern
       "(super)?(man)?",  in  which  all components are optional. This pattern
       finds all occurrences of both "super" and  "man";  the  output  differs
       from  matching  with  "super|man" when only the matching substrings are
       being shown.

       If the LC_ALL or LC_CTYPE environment variable is  set,  pcregrep  uses
       the  value to set a locale when calling the PCRE library.  The --locale
       option can be used to override this.


SUPPORT FOR COMPRESSED FILES

       It is possible to compile pcregrep so that it uses libz  or  libbz2  to
       read  files  whose names end in .gz or .bz2, respectively. You can find
       out whether your binary has support for one or both of these file types
       by running it with the --help option. If the appropriate support is not
       present, files are treated as plain text. The standard input is  always
       so treated.


OPTIONS

       The  order  in  which some of the options appear can affect the output.
       For example, both the -h and -l options affect  the  printing  of  file
       names.  Whichever  comes later in the command line will be the one that
       takes effect.

       --        This terminate the list of options. It is useful if the  next
                 item  on  the command line starts with a hyphen but is not an
                 option. This allows for the processing of patterns and  file-
                 names that start with hyphens.

       -A number, --after-context=number
                 Output  number  lines of context after each matching line. If
                 filenames and/or line numbers are being output, a hyphen sep-
                 arator  is  used  instead of a colon for the context lines. A
                 line containing "--" is output between each group  of  lines,
                 unless  they  are  in  fact contiguous in the input file. The
                 value of number is expected to be relatively small.  However,
                 pcregrep guarantees to have up to 8K of following text avail-
                 able for context output.

       -B number, --before-context=number
                 Output number lines of context before each matching line.  If
                 filenames and/or line numbers are being output, a hyphen sep-
                 arator is used instead of a colon for the  context  lines.  A
                 line  containing  "--" is output between each group of lines,
                 unless they are in fact contiguous in  the  input  file.  The
                 value  of number is expected to be relatively small. However,
                 pcregrep guarantees to have up to 8K of preceding text avail-
                 able for context output.

       -C number, --context=number
                 Output  number  lines  of  context both before and after each
                 matching line.  This is equivalent to setting both -A and  -B
                 to the same value.

       -c, --count
                 Do  not output individual lines from the files that are being
                 scanned; instead output the number of lines that would other-
                 wise  have  been  shown. If no lines are selected, the number
                 zero is output. If several files are  are  being  scanned,  a
                 count  is  output  for each of them. However, if the --files-
                 with-matches option is also  used,  only  those  files  whose
                 counts are greater than zero are listed. When -c is used, the
                 -A, -B, and -C options are ignored.

       --colour, --color
                 If this option is given without any data, it is equivalent to
                 "--colour=auto".   If  data  is required, it must be given in
                 the same shell item, separated by an equals sign.

       --colour=value, --color=value
                 This option specifies under what circumstances the parts of a
                 line that matched a pattern should be coloured in the output.
                 By default, the output is not coloured. The value  (which  is
                 optional,  see above) may be "never", "always", or "auto". In
                 the latter case, colouring happens only if the standard  out-
                 put  is connected to a terminal. More resources are used when
                 colouring is enabled, because pcregrep has to search for  all
                 possible  matches in a line, not just one, in order to colour
                 them all.

                 The colour that is used can be specified by setting the envi-
                 ronment variable PCREGREP_COLOUR or PCREGREP_COLOR. The value
                 of this variable should be a string of two numbers, separated
                 by  a  semicolon.  They  are copied directly into the control
                 string for setting colour  on  a  terminal,  so  it  is  your
                 responsibility  to ensure that they make sense. If neither of
                 the environment variables is  set,  the  default  is  "1;31",
                 which gives red.

       -D action, --devices=action
                 If  an  input  path  is  not  a  regular file or a directory,
                 "action" specifies how it is to be  processed.  Valid  values
                 are "read" (the default) or "skip" (silently skip the path).

       -d action, --directories=action
                 If an input path is a directory, "action" specifies how it is
                 to be processed.  Valid  values  are  "read"  (the  default),
                 "recurse"  (equivalent to the -r option), or "skip" (silently
                 skip the path). In the default case, directories are read  as
                 if  they  were  ordinary files. In some operating systems the
                 effect of reading a directory like this is an immediate  end-
                 of-file.

       -e pattern, --regex=pattern, --regexp=pattern
                 Specify a pattern to be matched. This option can be used mul-
                 tiple times in order to specify several patterns. It can also
                 be  used  as a way of specifying a single pattern that starts
                 with a hyphen. When -e is used, no argument pattern is  taken
                 from  the  command  line;  all  arguments are treated as file
                 names. There is an overall maximum of 100 patterns. They  are
                 applied  to  each line in the order in which they are defined
                 until one matches (or fails to match if -v is used). If -f is
                 used  with  -e,  the command line patterns are matched first,
                 followed by the patterns from the file,  independent  of  the
                 order  in which these options are specified. Note that multi-
                 ple use of -e is not the same as a single pattern with alter-
                 natives. For example, X|Y finds the first character in a line
                 that is X or Y, whereas if the two patterns are  given  sepa-
                 rately, pcregrep finds X if it is present, even if it follows
                 Y in the line. It finds Y only if there is no X in the  line.
                 This  really  matters  only  if  you are using -o to show the
                 part(s) of the line that matched.

       --exclude=pattern
                 When pcregrep is searching the files in a directory as a con-
                 sequence  of  the  -r  (recursive search) option, any regular
                 files whose names match the pattern are excluded. Subdirecto-
                 ries  are  not  excluded  by  this  option; they are searched
                 recursively, subject to the --exclude_dir  and  --include_dir
                 options.  The  pattern  is  a PCRE regular expression, and is
                 matched against the final component of the file name (not the
                 entire  path).  If  a  file  name  matches both --include and
                 --exclude, it is excluded.  There is no short form  for  this
                 option.

       --exclude_dir=pattern
                 When  pcregrep  is searching the contents of a directory as a
                 consequence of the -r (recursive search) option,  any  subdi-
                 rectories  whose  names match the pattern are excluded. (Note
                 that the --exclude option does  not  affect  subdirectories.)
                 The  pattern  is  a  PCRE  regular expression, and is matched
                 against the final component  of  the  name  (not  the  entire
                 path).  If a subdirectory name matches both --include_dir and
                 --exclude_dir, it is excluded. There is  no  short  form  for
                 this option.

       -F, --fixed-strings
                 Interpret  each pattern as a list of fixed strings, separated
                 by newlines, instead of  as  a  regular  expression.  The  -w
                 (match  as  a  word) and -x (match whole line) options can be
                 used with -F. They apply to each of the fixed strings. A line
                 is selected if any of the fixed strings are found in it (sub-
                 ject to -w or -x, if present).

       -f filename, --file=filename
                 Read a number of patterns from the file, one  per  line,  and
                 match  them against each line of input. A data line is output
                 if any of the patterns match it. The filename can be given as
                 "-" to refer to the standard input. When -f is used, patterns
                 specified on the command line using -e may also  be  present;
                 they are tested before the file's patterns. However, no other
                 pattern is taken from the command  line;  all  arguments  are
                 treated  as  file  names.  There is an overall maximum of 100
                 patterns. Trailing white space is removed from each line, and
                 blank  lines  are ignored. An empty file contains no patterns
                 and therefore matches nothing. See also  the  comments  about
                 multiple  patterns  versus a single pattern with alternatives
                 in the description of -e above.

       --file-offsets
                 Instead of showing lines or parts of lines that  match,  show
                 each  match  as  an  offset  from the start of the file and a
                 length, separated by a comma. In this  mode,  no  context  is
                 shown.  That  is,  the -A, -B, and -C options are ignored. If
                 there is more than one match in a line, each of them is shown
                 separately.  This  option  is mutually exclusive with --line-
                 offsets and --only-matching.

       -H, --with-filename
                 Force the inclusion of the filename at the  start  of  output
                 lines  when searching a single file. By default, the filename
                 is not shown in this case. For matching lines,  the  filename
                 is followed by a colon; for context lines, a hyphen separator
                 is used. If a line number is also being  output,  it  follows
                 the file name.

       -h, --no-filename
                 Suppress  the output filenames when searching multiple files.
                 By default, filenames  are  shown  when  multiple  files  are
                 searched.  For  matching lines, the filename is followed by a
                 colon; for context lines, a hyphen separator is used.   If  a
                 line number is also being output, it follows the file name.

       --help    Output  a  help  message, giving brief details of the command
                 options and file type support, and then exit.

       -i, --ignore-case
                 Ignore upper/lower case distinctions during comparisons.

       --include=pattern
                 When pcregrep is searching the files in a directory as a con-
                 sequence of the -r (recursive search) option, only those reg-
                 ular files whose names match the pattern are included. Subdi-
                 rectories  are always included and searched recursively, sub-
                 ject to the --include_dir and --exclude_dir options. The pat-
                 tern is a PCRE regular expression, and is matched against the
                 final component of the file name (not the entire path). If  a
                 file  name  matches  both  --include  and  --exclude,  it  is
                 excluded. There is no short form for this option.

       --include_dir=pattern
                 When pcregrep is searching the contents of a directory  as  a
                 consequence  of  the -r (recursive search) option, only those
                 subdirectories whose names match the  pattern  are  included.
                 (Note  that  the --include option does not affect subdirecto-
                 ries.) The pattern is  a  PCRE  regular  expression,  and  is
                 matched  against  the  final  component  of the name (not the
                 entire  path).  If   a   subdirectory   name   matches   both
                 --include_dir  and --exclude_dir, it is excluded. There is no
                 short form for this option.

       -L, --files-without-match
                 Instead of outputting lines from the files, just  output  the
                 names  of  the files that do not contain any lines that would
                 have been output. Each file name is output once, on  a  sepa-
                 rate line.

       -l, --files-with-matches
                 Instead  of  outputting lines from the files, just output the
                 names of the files containing lines that would have been out-
                 put.  Each  file  name  is  output  once, on a separate line.
                 Searching normally stops as soon as a matching line is  found
                 in  a  file.  However, if the -c (count) option is also used,
                 matching continues in order to obtain the correct count,  and
                 those  files  that  have  at least one match are listed along
                 with their counts. Using this option with -c is a way of sup-
                 pressing the listing of files with no matches.

       --label=name
                 This option supplies a name to be used for the standard input
                 when file names are being output. If not supplied, "(standard
                 input)" is used. There is no short form for this option.

       --line-offsets
                 Instead  of  showing lines or parts of lines that match, show
                 each match as a line number, the offset from the start of the
                 line,  and a length. The line number is terminated by a colon
                 (as usual; see the -n option), and the offset and length  are
                 separated  by  a  comma.  In  this mode, no context is shown.
                 That is, the -A, -B, and -C options are ignored. If there  is
                 more  than  one  match in a line, each of them is shown sepa-
                 rately. This option is mutually exclusive with --file-offsets
                 and --only-matching.

       --locale=locale-name
                 This  option specifies a locale to be used for pattern match-
                 ing. It overrides the value in the LC_ALL or  LC_CTYPE  envi-
                 ronment  variables.  If  no  locale  is  specified,  the PCRE
                 library's default (usually the "C" locale) is used. There  is
                 no short form for this option.

       -M, --multiline
                 Allow  patterns to match more than one line. When this option
                 is given, patterns may usefully contain literal newline char-
                 acters  and  internal  occurrences of ^ and $ characters. The
                 output for any one match may consist of more than  one  line.
                 When  this option is set, the PCRE library is called in "mul-
                 tiline" mode.  There is a limit to the number of  lines  that
                 can  be matched, imposed by the way that pcregrep buffers the
                 input file as it scans it. However, pcregrep ensures that  at
                 least 8K characters or the rest of the document (whichever is
                 the shorter) are available for forward  matching,  and  simi-
                 larly the previous 8K characters (or all the previous charac-
                 ters, if fewer than 8K) are guaranteed to  be  available  for
                 lookbehind assertions.

       -N newline-type, --newline=newline-type
                 The  PCRE  library  supports  five  different conventions for
                 indicating the ends of lines. They are  the  single-character
                 sequences  CR  (carriage  return) and LF (linefeed), the two-
                 character sequence CRLF, an "anycrlf" convention, which  rec-
                 ognizes  any  of the preceding three types, and an "any" con-
                 vention, in which any Unicode line ending sequence is assumed
                 to  end a line. The Unicode sequences are the three just men-
                 tioned,  plus  VT  (vertical  tab,  U+000B),  FF   (formfeed,
                 U+000C),   NEL  (next  line,  U+0085),  LS  (line  separator,
                 U+2028), and PS (paragraph separator, U+2029).

                 When  the  PCRE  library  is  built,  a  default  line-ending
                 sequence   is  specified.   This  is  normally  the  standard
                 sequence for the operating system. Unless otherwise specified
                 by  this  option,  pcregrep  uses the library's default.  The
                 possible values for this option are CR, LF, CRLF, ANYCRLF, or
                 ANY.  This  makes  it  possible to use pcregrep on files that
                 have come from other environments without  having  to  modify
                 their  line  endings.  If the data that is being scanned does
                 not agree with the convention set by  this  option,  pcregrep
                 may behave in strange ways.

       -n, --line-number
                 Precede each output line by its line number in the file, fol-
                 lowed by a colon for matching lines or a hyphen  for  context
                 lines.  If the filename is also being output, it precedes the
                 line number. This option is forced if --line-offsets is used.

       -o, --only-matching
                 Show only the part of the line that  matched  a  pattern.  In
                 this  mode,  no context is shown. That is, the -A, -B, and -C
                 options are ignored. If there is more than  one  match  in  a
                 line,  each  of  them  is shown separately. If -o is combined
                 with -v (invert the sense of the match to  find  non-matching
                 lines),  no  output  is generated, but the return code is set
                 appropriately. This option is mutually exclusive with --file-
                 offsets and --line-offsets.

       -q, --quiet
                 Work quietly, that is, display nothing except error messages.
                 The exit status indicates whether or  not  any  matches  were
                 found.

       -r, --recursive
                 If  any given path is a directory, recursively scan the files
                 it contains, taking note of any --include and --exclude  set-
                 tings.  By  default, a directory is read as a normal file; in
                 some operating systems this gives an  immediate  end-of-file.
                 This  option  is  a  shorthand  for  setting the -d option to
                 "recurse".

       -s, --no-messages
                 Suppress error  messages  about  non-existent  or  unreadable
                 files.  Such  files  are quietly skipped. However, the return
                 code is still 2, even if matches were found in other files.

       -u, --utf-8
                 Operate in UTF-8 mode. This option is available only if  PCRE
                 has  been compiled with UTF-8 support. Both patterns and sub-
                 ject lines must be valid strings of UTF-8 characters.

       -V, --version
                 Write the version numbers of pcregrep and  the  PCRE  library
                 that is being used to the standard error stream.

       -v, --invert-match
                 Invert  the  sense  of  the match, so that lines which do not
                 match any of the patterns are the ones that are found.

       -w, --word-regex, --word-regexp
                 Force the patterns to match only whole words. This is equiva-
                 lent to having \b at the start and end of the pattern.

       -x, --line-regex, --line-regexp
                 Force  the  patterns to be anchored (each must start matching
                 at the beginning of a line) and in addition, require them  to
                 match  entire  lines.  This  is  equivalent to having ^ and $
                 characters at the start and end of each alternative branch in
                 every pattern.


ENVIRONMENT VARIABLES

       The  environment  variables  LC_ALL  and LC_CTYPE are examined, in that
       order, for a locale. The first one that is set is  used.  This  can  be
       overridden  by  the  --locale  option.  If  no  locale is set, the PCRE
       library's default (usually the "C" locale) is used.


NEWLINES

       The -N (--newline) option allows pcregrep to scan files with  different
       newline  conventions  from  the  default.  However, the setting of this
       option does not affect the way in which pcregrep writes information  to
       the  standard  error  and  output streams. It uses the string "\n" in C
       printf() calls to indicate newlines, relying on the C  I/O  library  to
       convert  this  to  an  appropriate  sequence if the output is sent to a
       file.


OPTIONS COMPATIBILITY

       The majority of short and long forms of pcregrep's options are the same
       as  in  the  GNU grep program. Any long option of the form --xxx-regexp
       (GNU terminology) is also available as --xxx-regex (PCRE  terminology).
       However,  the  --locale,  -M,  --multiline, -u, and --utf-8 options are
       specific to pcregrep. If both the -c and -l options are given, GNU grep
       lists only file names, without counts, but pcregrep gives the counts.


OPTIONS WITH DATA

       There are four different ways in which an option with data can be spec-
       ified.  If a short form option is used, the  data  may  follow  immedi-
       ately, or in the next command line item. For example:

         -f/some/file
         -f /some/file

       If  a long form option is used, the data may appear in the same command
       line item, separated by an equals character, or (with one exception) it
       may appear in the next command line item. For example:

         --file=/some/file
         --file /some/file

       Note,  however, that if you want to supply a file name beginning with ~
       as data in a shell command, and have the  shell  expand  ~  to  a  home
       directory, you must separate the file name from the option, because the
       shell does not treat ~ specially unless it is at the start of an item.

       The exception to the above is the --colour  (or  --color)  option,  for
       which  the  data is optional. If this option does have data, it must be
       given in the first form, using an equals character. Otherwise  it  will
       be assumed that it has no data.


MATCHING ERRORS

       It  is  possible  to supply a regular expression that takes a very long
       time to fail to match certain lines.  Such  patterns  normally  involve
       nested  indefinite repeats, for example: (a+)*\d when matched against a
       line of a's with no final digit.  The  PCRE  matching  function  has  a
       resource  limit that causes it to abort in these circumstances. If this
       happens, pcregrep outputs an error message and the line that caused the
       problem  to  the  standard error stream. If there are more than 20 such
       errors, pcregrep gives up.


DIAGNOSTICS

       Exit status is 0 if any matches were found, 1 if no matches were found,
       and  2 for syntax errors and non-existent or inacessible files (even if
       matches were found in other files) or too many matching  errors.  Using
       the  -s  option to suppress error messages about inaccessble files does
       not affect the return code.


SEE ALSO

       pcrepattern(3), pcretest(1).


AUTHOR

       Philip Hazel
       University Computing Service
       Cambridge CB2 3QH, England.


REVISION

       Last updated: 13 September 2009
       Copyright (c) 1997-2009 University of Cambridge.
PK��$[#����5doc/alt-pcre802-devel/html/pcre_get_stringnumber.htmlnu�[���<html>
<head>
<title>pcre_get_stringnumber specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_get_stringnumber man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>int pcre_get_stringnumber(const pcre *<i>code</i>,</b>
<b>const char *<i>name</i>);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This convenience function finds the number of a named substring capturing
parenthesis in a compiled pattern. Its arguments are:
<pre>
  <i>code</i>    Compiled regular expression
  <i>name</i>    Name whose number is required
</pre>
The yield of the function is the number of the parenthesis if the name is
found, or PCRE_ERROR_NOSUBSTRING otherwise. When duplicate names are allowed
(PCRE_DUPNAMES is set), it is not defined which of the numbers is returned by
<b>pcre_get_stringnumber()</b>. You can obtain the complete list by calling
<b>pcre_get_stringtable_entries()</b>.
</P>
<P>
There is a complete description of the PCRE native API in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[�iD

*doc/alt-pcre802-devel/html/pcresample.htmlnu�[���<html>
<head>
<title>pcresample specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcresample man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
PCRE SAMPLE PROGRAM
</b><br>
<P>
A simple, complete demonstration program, to get you started with using PCRE,
is supplied in the file <i>pcredemo.c</i> in the PCRE distribution. A listing of
this program is given in the
<a href="pcredemo.html"><b>pcredemo</b></a>
documentation. If you do not have a copy of the PCRE distribution, you can save
this listing to re-create <i>pcredemo.c</i>.
</P>
<P>
The program compiles the regular expression that is its first argument, and
matches it against the subject string in its second argument. No PCRE options
are set, and default character tables are used. If matching succeeds, the
program outputs the portion of the subject that matched, together with the
contents of any captured substrings.
</P>
<P>
If the -g option is given on the command line, the program then goes on to
check for further matches of the same regular expression in the same subject
string. The logic is a little bit tricky because of the possibility of matching
an empty string. Comments in the code explain what is going on.
</P>
<P>
If PCRE is installed in the standard include and library directories for your
operating system, you should be able to compile the demonstration program using
this command:
<pre>
  gcc -o pcredemo pcredemo.c -lpcre
</pre>
If PCRE is installed elsewhere, you may need to add additional options to the
command line. For example, on a Unix-like system that has PCRE installed in
<i>/usr/local</i>, you can compile the demonstration program using a command
like this:
<pre>
  gcc -o pcredemo -I/usr/local/include pcredemo.c -L/usr/local/lib -lpcre
</pre>
Once you have compiled the demonstration program, you can run simple tests like
this:
<pre>
  ./pcredemo 'cat|dog' 'the cat sat on the mat'
  ./pcredemo -g 'cat|dog' 'the dog sat on the cat'
</pre>
Note that there is a much more comprehensive test program, called
<a href="pcretest.html"><b>pcretest</b>,</a>
which supports many more facilities for testing regular expressions and the
PCRE library. The
<a href="pcredemo.html"><b>pcredemo</b></a>
program is provided as a simple coding example.
</P>
<P>
When you try to run
<a href="pcredemo.html"><b>pcredemo</b></a>
when PCRE is not installed in the standard library directory, you may get an
error like this on some operating systems (e.g. Solaris):
<pre>
  ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or directory
</pre>
This is caused by the way shared library support works on those systems. You
need to add
<pre>
  -R/usr/local/lib
</pre>
(for example) to the compile command to get round this problem.
</P>
<br><b>
AUTHOR
</b><br>
<P>
Philip Hazel
<br>
University Computing Service
<br>
Cambridge CB2 3QH, England.
<br>
</P>
<br><b>
REVISION
</b><br>
<P>
Last updated: 30 September 2009
<br>
Copyright &copy; 1997-2009 University of Cambridge.
<br>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[���R1&1&,doc/alt-pcre802-devel/html/pcrematching.htmlnu�[���<html>
<head>
<title>pcrematching specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcrematching man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<ul>
<li><a name="TOC1" href="#SEC1">PCRE MATCHING ALGORITHMS</a>
<li><a name="TOC2" href="#SEC2">REGULAR EXPRESSIONS AS TREES</a>
<li><a name="TOC3" href="#SEC3">THE STANDARD MATCHING ALGORITHM</a>
<li><a name="TOC4" href="#SEC4">THE ALTERNATIVE MATCHING ALGORITHM</a>
<li><a name="TOC5" href="#SEC5">ADVANTAGES OF THE ALTERNATIVE ALGORITHM</a>
<li><a name="TOC6" href="#SEC6">DISADVANTAGES OF THE ALTERNATIVE ALGORITHM</a>
<li><a name="TOC7" href="#SEC7">AUTHOR</a>
<li><a name="TOC8" href="#SEC8">REVISION</a>
</ul>
<br><a name="SEC1" href="#TOC1">PCRE MATCHING ALGORITHMS</a><br>
<P>
This document describes the two different algorithms that are available in PCRE
for matching a compiled regular expression against a given subject string. The
"standard" algorithm is the one provided by the <b>pcre_exec()</b> function.
This works in the same was as Perl's matching function, and provides a
Perl-compatible matching operation.
</P>
<P>
An alternative algorithm is provided by the <b>pcre_dfa_exec()</b> function;
this operates in a different way, and is not Perl-compatible. It has advantages
and disadvantages compared with the standard algorithm, and these are described
below.
</P>
<P>
When there is only one possible way in which a given subject string can match a
pattern, the two algorithms give the same answer. A difference arises, however,
when there are multiple possibilities. For example, if the pattern
<pre>
  ^&#60;.*&#62;
</pre>
is matched against the string
<pre>
  &#60;something&#62; &#60;something else&#62; &#60;something further&#62;
</pre>
there are three possible answers. The standard algorithm finds only one of
them, whereas the alternative algorithm finds all three.
</P>
<br><a name="SEC2" href="#TOC1">REGULAR EXPRESSIONS AS TREES</a><br>
<P>
The set of strings that are matched by a regular expression can be represented
as a tree structure. An unlimited repetition in the pattern makes the tree of
infinite size, but it is still a tree. Matching the pattern to a given subject
string (from a given starting point) can be thought of as a search of the tree.
There are two ways to search a tree: depth-first and breadth-first, and these
correspond to the two matching algorithms provided by PCRE.
</P>
<br><a name="SEC3" href="#TOC1">THE STANDARD MATCHING ALGORITHM</a><br>
<P>
In the terminology of Jeffrey Friedl's book "Mastering Regular
Expressions", the standard algorithm is an "NFA algorithm". It conducts a
depth-first search of the pattern tree. That is, it proceeds along a single
path through the tree, checking that the subject matches what is required. When
there is a mismatch, the algorithm tries any alternatives at the current point,
and if they all fail, it backs up to the previous branch point in the tree, and
tries the next alternative branch at that level. This often involves backing up
(moving to the left) in the subject string as well. The order in which
repetition branches are tried is controlled by the greedy or ungreedy nature of
the quantifier.
</P>
<P>
If a leaf node is reached, a matching string has been found, and at that point
the algorithm stops. Thus, if there is more than one possible match, this
algorithm returns the first one that it finds. Whether this is the shortest,
the longest, or some intermediate length depends on the way the greedy and
ungreedy repetition quantifiers are specified in the pattern.
</P>
<P>
Because it ends up with a single path through the tree, it is relatively
straightforward for this algorithm to keep track of the substrings that are
matched by portions of the pattern in parentheses. This provides support for
capturing parentheses and back references.
</P>
<br><a name="SEC4" href="#TOC1">THE ALTERNATIVE MATCHING ALGORITHM</a><br>
<P>
This algorithm conducts a breadth-first search of the tree. Starting from the
first matching point in the subject, it scans the subject string from left to
right, once, character by character, and as it does this, it remembers all the
paths through the tree that represent valid matches. In Friedl's terminology,
this is a kind of "DFA algorithm", though it is not implemented as a
traditional finite state machine (it keeps multiple states active
simultaneously).
</P>
<P>
Although the general principle of this matching algorithm is that it scans the
subject string only once, without backtracking, there is one exception: when a
lookaround assertion is encountered, the characters following or preceding the
current point have to be independently inspected.
</P>
<P>
The scan continues until either the end of the subject is reached, or there are
no more unterminated paths. At this point, terminated paths represent the
different matching possibilities (if there are none, the match has failed).
Thus, if there is more than one possible match, this algorithm finds all of
them, and in particular, it finds the longest. There is an option to stop the
algorithm after the first match (which is necessarily the shortest) is found.
</P>
<P>
Note that all the matches that are found start at the same point in the
subject. If the pattern
<pre>
  cat(er(pillar)?)
</pre>
is matched against the string "the caterpillar catchment", the result will be
the three strings "cat", "cater", and "caterpillar" that start at the fourth
character of the subject. The algorithm does not automatically move on to find
matches that start at later positions.
</P>
<P>
There are a number of features of PCRE regular expressions that are not
supported by the alternative matching algorithm. They are as follows:
</P>
<P>
1. Because the algorithm finds all possible matches, the greedy or ungreedy
nature of repetition quantifiers is not relevant. Greedy and ungreedy
quantifiers are treated in exactly the same way. However, possessive
quantifiers can make a difference when what follows could also match what is
quantified, for example in a pattern like this:
<pre>
  ^a++\w!
</pre>
This pattern matches "aaab!" but not "aaa!", which would be matched by a
non-possessive quantifier. Similarly, if an atomic group is present, it is
matched as if it were a standalone pattern at the current point, and the
longest match is then "locked in" for the rest of the overall pattern.
</P>
<P>
2. When dealing with multiple paths through the tree simultaneously, it is not
straightforward to keep track of captured substrings for the different matching
possibilities, and PCRE's implementation of this algorithm does not attempt to
do this. This means that no captured substrings are available.
</P>
<P>
3. Because no substrings are captured, back references within the pattern are
not supported, and cause errors if encountered.
</P>
<P>
4. For the same reason, conditional expressions that use a backreference as the
condition or test for a specific group recursion are not supported.
</P>
<P>
5. Because many paths through the tree may be active, the \K escape sequence,
which resets the start of the match when encountered (but may be on some paths
and not on others), is not supported. It causes an error if encountered.
</P>
<P>
6. Callouts are supported, but the value of the <i>capture_top</i> field is
always 1, and the value of the <i>capture_last</i> field is always -1.
</P>
<P>
7. The \C escape sequence, which (in the standard algorithm) matches a single
byte, even in UTF-8 mode, is not supported because the alternative algorithm
moves through the subject string one character at a time, for all active paths
through the tree.
</P>
<P>
8. Except for (*FAIL), the backtracking control verbs such as (*PRUNE) are not
supported. (*FAIL) is supported, and behaves like a failing negative assertion.
</P>
<br><a name="SEC5" href="#TOC1">ADVANTAGES OF THE ALTERNATIVE ALGORITHM</a><br>
<P>
Using the alternative matching algorithm provides the following advantages:
</P>
<P>
1. All possible matches (at a single point in the subject) are automatically
found, and in particular, the longest match is found. To find more than one
match using the standard algorithm, you have to do kludgy things with
callouts.
</P>
<P>
2. Because the alternative algorithm scans the subject string just once, and
never needs to backtrack, it is possible to pass very long subject strings to
the matching function in several pieces, checking for partial matching each
time. The
<a href="pcrepartial.html"><b>pcrepartial</b></a>
documentation gives details of partial matching.
</P>
<br><a name="SEC6" href="#TOC1">DISADVANTAGES OF THE ALTERNATIVE ALGORITHM</a><br>
<P>
The alternative algorithm suffers from a number of disadvantages:
</P>
<P>
1. It is substantially slower than the standard algorithm. This is partly
because it has to search for all possible matches, but is also because it is
less susceptible to optimization.
</P>
<P>
2. Capturing parentheses and back references are not supported.
</P>
<P>
3. Although atomic groups are supported, their use does not provide the
performance advantage that it does for the standard algorithm.
</P>
<br><a name="SEC7" href="#TOC1">AUTHOR</a><br>
<P>
Philip Hazel
<br>
University Computing Service
<br>
Cambridge CB2 3QH, England.
<br>
</P>
<br><a name="SEC8" href="#TOC1">REVISION</a><br>
<P>
Last updated: 29 September 2009
<br>
Copyright &copy; 1997-2009 University of Cambridge.
<br>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[�13��,doc/alt-pcre802-devel/html/pcre_version.htmlnu�[���<html>
<head>
<title>pcre_version specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_version man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>char *pcre_version(void);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This function returns a character string that gives the version number of the
PCRE library and the date of its release.
</P>
<P>
There is a complete description of the PCRE native API in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[x�!!)doc/alt-pcre802-devel/html/pcrestack.htmlnu�[���<html>
<head>
<title>pcrestack specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcrestack man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
PCRE DISCUSSION OF STACK USAGE
</b><br>
<P>
When you call <b>pcre_exec()</b>, it makes use of an internal function called
<b>match()</b>. This calls itself recursively at branch points in the pattern,
in order to remember the state of the match so that it can back up and try a
different alternative if the first one fails. As matching proceeds deeper and
deeper into the tree of possibilities, the recursion depth increases.
</P>
<P>
Not all calls of <b>match()</b> increase the recursion depth; for an item such
as a* it may be called several times at the same level, after matching
different numbers of a's. Furthermore, in a number of cases where the result of
the recursive call would immediately be passed back as the result of the
current call (a "tail recursion"), the function is just restarted instead.
</P>
<P>
The <b>pcre_dfa_exec()</b> function operates in an entirely different way, and
uses recursion only when there is a regular expression recursion or subroutine
call in the pattern. This includes the processing of assertion and "once-only"
subpatterns, which are handled like subroutine calls. Normally, these are never
very deep, and the limit on the complexity of <b>pcre_dfa_exec()</b> is
controlled by the amount of workspace it is given. However, it is possible to
write patterns with runaway infinite recursions; such patterns will cause
<b>pcre_dfa_exec()</b> to run out of stack. At present, there is no protection
against this.
</P>
<P>
The comments that follow do NOT apply to <b>pcre_dfa_exec()</b>; they are
relevant only for <b>pcre_exec()</b>.
</P>
<br><b>
Reducing <b>pcre_exec()</b>'s stack usage
</b><br>
<P>
Each time that <b>match()</b> is actually called recursively, it uses memory
from the process stack. For certain kinds of pattern and data, very large
amounts of stack may be needed, despite the recognition of "tail recursion".
You can often reduce the amount of recursion, and therefore the amount of stack
used, by modifying the pattern that is being matched. Consider, for example,
this pattern:
<pre>
  ([^&#60;]|&#60;(?!inet))+
</pre>
It matches from wherever it starts until it encounters "&#60;inet" or the end of
the data, and is the kind of pattern that might be used when processing an XML
file. Each iteration of the outer parentheses matches either one character that
is not "&#60;" or a "&#60;" that is not followed by "inet". However, each time a
parenthesis is processed, a recursion occurs, so this formulation uses a stack
frame for each matched character. For a long string, a lot of stack is
required. Consider now this rewritten pattern, which matches exactly the same
strings:
<pre>
  ([^&#60;]++|&#60;(?!inet))+
</pre>
This uses very much less stack, because runs of characters that do not contain
"&#60;" are "swallowed" in one item inside the parentheses. Recursion happens only
when a "&#60;" character that is not followed by "inet" is encountered (and we
assume this is relatively rare). A possessive quantifier is used to stop any
backtracking into the runs of non-"&#60;" characters, but that is not related to
stack usage.
</P>
<P>
This example shows that one way of avoiding stack problems when matching long
subject strings is to write repeated parenthesized subpatterns to match more
than one character whenever possible.
</P>
<br><b>
Compiling PCRE to use heap instead of stack for <b>pcre_exec()</b>
</b><br>
<P>
In environments where stack memory is constrained, you might want to compile
PCRE to use heap memory instead of stack for remembering back-up points when
<b>pcre_exec()</b> is running. This makes it run a lot more slowly, however.
Details of how to do this are given in the
<a href="pcrebuild.html"><b>pcrebuild</b></a>
documentation. When built in this way, instead of using the stack, PCRE obtains
and frees memory by calling the functions that are pointed to by the
<b>pcre_stack_malloc</b> and <b>pcre_stack_free</b> variables. By default, these
point to <b>malloc()</b> and <b>free()</b>, but you can replace the pointers to
cause PCRE to use your own functions. Since the block sizes are always the
same, and are always freed in reverse order, it may be possible to implement
customized memory handlers that are more efficient than the standard functions.
</P>
<br><b>
Limiting <b>pcre_exec()</b>'s stack usage
</b><br>
<P>
You can set limits on the number of times that <b>match()</b> is called, both in
total and recursively. If a limit is exceeded, <b>pcre_exec()</b> returns an
error code. Setting suitable limits should prevent it from running out of
stack. The default values of the limits are very large, and unlikely ever to
operate. They can be changed when PCRE is built, and they can also be set when
<b>pcre_exec()</b> is called. For details of these interfaces, see the
<a href="pcrebuild.html"><b>pcrebuild</b></a>
documentation and the
<a href="pcreapi.html#extradata">section on extra data for <b>pcre_exec()</b></a>
in the
<a href="pcreapi.html"><b>pcreapi</b></a>
documentation.
</P>
<P>
As a very rough rule of thumb, you should reckon on about 500 bytes per
recursion. Thus, if you want to limit your stack usage to 8Mb, you
should set the limit at 16000 recursions. A 64Mb stack, on the other hand, can
support around 128000 recursions.
</P>
<P>
In Unix-like environments, the <b>pcretest</b> test program has a command line
option (<b>-S</b>) that can be used to increase the size of its stack. As long
as the stack is large enough, another option (<b>-M</b>) can be used to find the
smallest limits that allow a particular pattern to match a given subject
string. This is done by calling <b>pcre_exec()</b> repeatedly with different
limits.
</P>
<br><b>
Changing stack size in Unix-like systems
</b><br>
<P>
In Unix-like environments, there is not often a problem with the stack unless
very long strings are involved, though the default limit on stack size varies
from system to system. Values from 8Mb to 64Mb are common. You can find your
default limit by running the command:
<pre>
  ulimit -s
</pre>
Unfortunately, the effect of running out of stack is often SIGSEGV, though
sometimes a more explicit error message is given. You can normally increase the
limit on stack size by code such as this:
<pre>
  struct rlimit rlim;
  getrlimit(RLIMIT_STACK, &rlim);
  rlim.rlim_cur = 100*1024*1024;
  setrlimit(RLIMIT_STACK, &rlim);
</pre>
This reads the current limits (soft and hard) using <b>getrlimit()</b>, then
attempts to increase the soft limit to 100Mb using <b>setrlimit()</b>. You must
do this before calling <b>pcre_exec()</b>.
</P>
<br><b>
Changing stack size in Mac OS X
</b><br>
<P>
Using <b>setrlimit()</b>, as described above, should also work on Mac OS X. It
is also possible to set a stack size when linking a program. There is a
discussion about stack sizes in Mac OS X at this web site:
<a href="http://developer.apple.com/qa/qa2005/qa1419.html">http://developer.apple.com/qa/qa2005/qa1419.html.</a>
</P>
<br><b>
AUTHOR
</b><br>
<P>
Philip Hazel
<br>
University Computing Service
<br>
Cambridge CB2 3QH, England.
<br>
</P>
<br><b>
REVISION
</b><br>
<P>
Last updated: 03 January 2010
<br>
Copyright &copy; 1997-2010 University of Cambridge.
<br>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[/~����+doc/alt-pcre802-devel/html/pcrepattern.htmlnu�[���<html>
<head>
<title>pcrepattern specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcrepattern man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<ul>
<li><a name="TOC1" href="#SEC1">PCRE REGULAR EXPRESSION DETAILS</a>
<li><a name="TOC2" href="#SEC2">NEWLINE CONVENTIONS</a>
<li><a name="TOC3" href="#SEC3">CHARACTERS AND METACHARACTERS</a>
<li><a name="TOC4" href="#SEC4">BACKSLASH</a>
<li><a name="TOC5" href="#SEC5">CIRCUMFLEX AND DOLLAR</a>
<li><a name="TOC6" href="#SEC6">FULL STOP (PERIOD, DOT)</a>
<li><a name="TOC7" href="#SEC7">MATCHING A SINGLE BYTE</a>
<li><a name="TOC8" href="#SEC8">SQUARE BRACKETS AND CHARACTER CLASSES</a>
<li><a name="TOC9" href="#SEC9">POSIX CHARACTER CLASSES</a>
<li><a name="TOC10" href="#SEC10">VERTICAL BAR</a>
<li><a name="TOC11" href="#SEC11">INTERNAL OPTION SETTING</a>
<li><a name="TOC12" href="#SEC12">SUBPATTERNS</a>
<li><a name="TOC13" href="#SEC13">DUPLICATE SUBPATTERN NUMBERS</a>
<li><a name="TOC14" href="#SEC14">NAMED SUBPATTERNS</a>
<li><a name="TOC15" href="#SEC15">REPETITION</a>
<li><a name="TOC16" href="#SEC16">ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS</a>
<li><a name="TOC17" href="#SEC17">BACK REFERENCES</a>
<li><a name="TOC18" href="#SEC18">ASSERTIONS</a>
<li><a name="TOC19" href="#SEC19">CONDITIONAL SUBPATTERNS</a>
<li><a name="TOC20" href="#SEC20">COMMENTS</a>
<li><a name="TOC21" href="#SEC21">RECURSIVE PATTERNS</a>
<li><a name="TOC22" href="#SEC22">SUBPATTERNS AS SUBROUTINES</a>
<li><a name="TOC23" href="#SEC23">ONIGURUMA SUBROUTINE SYNTAX</a>
<li><a name="TOC24" href="#SEC24">CALLOUTS</a>
<li><a name="TOC25" href="#SEC25">BACKTRACKING CONTROL</a>
<li><a name="TOC26" href="#SEC26">SEE ALSO</a>
<li><a name="TOC27" href="#SEC27">AUTHOR</a>
<li><a name="TOC28" href="#SEC28">REVISION</a>
</ul>
<br><a name="SEC1" href="#TOC1">PCRE REGULAR EXPRESSION DETAILS</a><br>
<P>
The syntax and semantics of the regular expressions that are supported by PCRE
are described in detail below. There is a quick-reference syntax summary in the
<a href="pcresyntax.html"><b>pcresyntax</b></a>
page. PCRE tries to match Perl syntax and semantics as closely as it can. PCRE
also supports some alternative regular expression syntax (which does not
conflict with the Perl syntax) in order to provide some compatibility with
regular expressions in Python, .NET, and Oniguruma.
</P>
<P>
Perl's regular expressions are described in its own documentation, and
regular expressions in general are covered in a number of books, some of which
have copious examples. Jeffrey Friedl's "Mastering Regular Expressions",
published by O'Reilly, covers regular expressions in great detail. This
description of PCRE's regular expressions is intended as reference material.
</P>
<P>
The original operation of PCRE was on strings of one-byte characters. However,
there is now also support for UTF-8 character strings. To use this,
PCRE must be built to include UTF-8 support, and you must call
<b>pcre_compile()</b> or <b>pcre_compile2()</b> with the PCRE_UTF8 option. There
is also a special sequence that can be given at the start of a pattern:
<pre>
  (*UTF8)
</pre>
Starting a pattern with this sequence is equivalent to setting the PCRE_UTF8
option. This feature is not Perl-compatible. How setting UTF-8 mode affects
pattern matching is mentioned in several places below. There is also a summary
of UTF-8 features in the
<a href="pcre.html#utf8support">section on UTF-8 support</a>
in the main
<a href="pcre.html"><b>pcre</b></a>
page.
</P>
<P>
The remainder of this document discusses the patterns that are supported by
PCRE when its main matching function, <b>pcre_exec()</b>, is used.
From release 6.0, PCRE offers a second matching function,
<b>pcre_dfa_exec()</b>, which matches using a different algorithm that is not
Perl-compatible. Some of the features discussed below are not available when
<b>pcre_dfa_exec()</b> is used. The advantages and disadvantages of the
alternative function, and how it differs from the normal function, are
discussed in the
<a href="pcrematching.html"><b>pcrematching</b></a>
page.
</P>
<br><a name="SEC2" href="#TOC1">NEWLINE CONVENTIONS</a><br>
<P>
PCRE supports five different conventions for indicating line breaks in
strings: a single CR (carriage return) character, a single LF (linefeed)
character, the two-character sequence CRLF, any of the three preceding, or any
Unicode newline sequence. The
<a href="pcreapi.html"><b>pcreapi</b></a>
page has
<a href="pcreapi.html#newlines">further discussion</a>
about newlines, and shows how to set the newline convention in the
<i>options</i> arguments for the compiling and matching functions.
</P>
<P>
It is also possible to specify a newline convention by starting a pattern
string with one of the following five sequences:
<pre>
  (*CR)        carriage return
  (*LF)        linefeed
  (*CRLF)      carriage return, followed by linefeed
  (*ANYCRLF)   any of the three above
  (*ANY)       all Unicode newline sequences
</pre>
These override the default and the options given to <b>pcre_compile()</b> or
<b>pcre_compile2()</b>. For example, on a Unix system where LF is the default
newline sequence, the pattern
<pre>
  (*CR)a.b
</pre>
changes the convention to CR. That pattern matches "a\nb" because LF is no
longer a newline. Note that these special settings, which are not
Perl-compatible, are recognized only at the very start of a pattern, and that
they must be in upper case. If more than one of them is present, the last one
is used.
</P>
<P>
The newline convention does not affect what the \R escape sequence matches. By
default, this is any Unicode newline sequence, for Perl compatibility. However,
this can be changed; see the description of \R in the section entitled
<a href="#newlineseq">"Newline sequences"</a>
below. A change of \R setting can be combined with a change of newline
convention.
</P>
<br><a name="SEC3" href="#TOC1">CHARACTERS AND METACHARACTERS</a><br>
<P>
A regular expression is a pattern that is matched against a subject string from
left to right. Most characters stand for themselves in a pattern, and match the
corresponding characters in the subject. As a trivial example, the pattern
<pre>
  The quick brown fox
</pre>
matches a portion of a subject string that is identical to itself. When
caseless matching is specified (the PCRE_CASELESS option), letters are matched
independently of case. In UTF-8 mode, PCRE always understands the concept of
case for characters whose values are less than 128, so caseless matching is
always possible. For characters with higher values, the concept of case is
supported if PCRE is compiled with Unicode property support, but not otherwise.
If you want to use caseless matching for characters 128 and above, you must
ensure that PCRE is compiled with Unicode property support as well as with
UTF-8 support.
</P>
<P>
The power of regular expressions comes from the ability to include alternatives
and repetitions in the pattern. These are encoded in the pattern by the use of
<i>metacharacters</i>, which do not stand for themselves but instead are
interpreted in some special way.
</P>
<P>
There are two different sets of metacharacters: those that are recognized
anywhere in the pattern except within square brackets, and those that are
recognized within square brackets. Outside square brackets, the metacharacters
are as follows:
<pre>
  \      general escape character with several uses
  ^      assert start of string (or line, in multiline mode)
  $      assert end of string (or line, in multiline mode)
  .      match any character except newline (by default)
  [      start character class definition
  |      start of alternative branch
  (      start subpattern
  )      end subpattern
  ?      extends the meaning of (
         also 0 or 1 quantifier
         also quantifier minimizer
  *      0 or more quantifier
  +      1 or more quantifier
         also "possessive quantifier"
  {      start min/max quantifier
</pre>
Part of a pattern that is in square brackets is called a "character class". In
a character class the only metacharacters are:
<pre>
  \      general escape character
  ^      negate the class, but only if the first character
  -      indicates character range
  [      POSIX character class (only if followed by POSIX syntax)
  ]      terminates the character class
</pre>
The following sections describe the use of each of the metacharacters.
</P>
<br><a name="SEC4" href="#TOC1">BACKSLASH</a><br>
<P>
The backslash character has several uses. Firstly, if it is followed by a
non-alphanumeric character, it takes away any special meaning that character
may have. This use of backslash as an escape character applies both inside and
outside character classes.
</P>
<P>
For example, if you want to match a * character, you write \* in the pattern.
This escaping action applies whether or not the following character would
otherwise be interpreted as a metacharacter, so it is always safe to precede a
non-alphanumeric with backslash to specify that it stands for itself. In
particular, if you want to match a backslash, you write \\.
</P>
<P>
If a pattern is compiled with the PCRE_EXTENDED option, whitespace in the
pattern (other than in a character class) and characters between a # outside
a character class and the next newline are ignored. An escaping backslash can
be used to include a whitespace or # character as part of the pattern.
</P>
<P>
If you want to remove the special meaning from a sequence of characters, you
can do so by putting them between \Q and \E. This is different from Perl in
that $ and @ are handled as literals in \Q...\E sequences in PCRE, whereas in
Perl, $ and @ cause variable interpolation. Note the following examples:
<pre>
  Pattern            PCRE matches   Perl matches

  \Qabc$xyz\E        abc$xyz        abc followed by the contents of $xyz
  \Qabc\$xyz\E       abc\$xyz       abc\$xyz
  \Qabc\E\$\Qxyz\E   abc$xyz        abc$xyz
</pre>
The \Q...\E sequence is recognized both inside and outside character classes.
<a name="digitsafterbackslash"></a></P>
<br><b>
Non-printing characters
</b><br>
<P>
A second use of backslash provides a way of encoding non-printing characters
in patterns in a visible manner. There is no restriction on the appearance of
non-printing characters, apart from the binary zero that terminates a pattern,
but when a pattern is being prepared by text editing, it is often easier to use
one of the following escape sequences than the binary character it represents:
<pre>
  \a        alarm, that is, the BEL character (hex 07)
  \cx       "control-x", where x is any character
  \e        escape (hex 1B)
  \f        formfeed (hex 0C)
  \n        linefeed (hex 0A)
  \r        carriage return (hex 0D)
  \t        tab (hex 09)
  \ddd      character with octal code ddd, or back reference
  \xhh      character with hex code hh
  \x{hhh..} character with hex code hhh..
</pre>
The precise effect of \cx is as follows: if x is a lower case letter, it
is converted to upper case. Then bit 6 of the character (hex 40) is inverted.
Thus \cz becomes hex 1A, but \c{ becomes hex 3B, while \c; becomes hex
7B.
</P>
<P>
After \x, from zero to two hexadecimal digits are read (letters can be in
upper or lower case). Any number of hexadecimal digits may appear between \x{
and }, but the value of the character code must be less than 256 in non-UTF-8
mode, and less than 2**31 in UTF-8 mode. That is, the maximum value in
hexadecimal is 7FFFFFFF. Note that this is bigger than the largest Unicode code
point, which is 10FFFF.
</P>
<P>
If characters other than hexadecimal digits appear between \x{ and }, or if
there is no terminating }, this form of escape is not recognized. Instead, the
initial \x will be interpreted as a basic hexadecimal escape, with no
following digits, giving a character whose value is zero.
</P>
<P>
Characters whose value is less than 256 can be defined by either of the two
syntaxes for \x. There is no difference in the way they are handled. For
example, \xdc is exactly the same as \x{dc}.
</P>
<P>
After \0 up to two further octal digits are read. If there are fewer than two
digits, just those that are present are used. Thus the sequence \0\x\07
specifies two binary zeros followed by a BEL character (code value 7). Make
sure you supply two digits after the initial zero if the pattern character that
follows is itself an octal digit.
</P>
<P>
The handling of a backslash followed by a digit other than 0 is complicated.
Outside a character class, PCRE reads it and any following digits as a decimal
number. If the number is less than 10, or if there have been at least that many
previous capturing left parentheses in the expression, the entire sequence is
taken as a <i>back reference</i>. A description of how this works is given
<a href="#backreferences">later,</a>
following the discussion of
<a href="#subpattern">parenthesized subpatterns.</a>
</P>
<P>
Inside a character class, or if the decimal number is greater than 9 and there
have not been that many capturing subpatterns, PCRE re-reads up to three octal
digits following the backslash, and uses them to generate a data character. Any
subsequent digits stand for themselves. In non-UTF-8 mode, the value of a
character specified in octal must be less than \400. In UTF-8 mode, values up
to \777 are permitted. For example:
<pre>
  \040   is another way of writing a space
  \40    is the same, provided there are fewer than 40 previous capturing subpatterns
  \7     is always a back reference
  \11    might be a back reference, or another way of writing a tab
  \011   is always a tab
  \0113  is a tab followed by the character "3"
  \113   might be a back reference, otherwise the character with octal code 113
  \377   might be a back reference, otherwise the byte consisting entirely of 1 bits
  \81    is either a back reference, or a binary zero followed by the two characters "8" and "1"
</pre>
Note that octal values of 100 or greater must not be introduced by a leading
zero, because no more than three octal digits are ever read.
</P>
<P>
All the sequences that define a single character value can be used both inside
and outside character classes. In addition, inside a character class, the
sequence \b is interpreted as the backspace character (hex 08), and the
sequences \R and \X are interpreted as the characters "R" and "X",
respectively. Outside a character class, these sequences have different
meanings
<a href="#uniextseq">(see below).</a>
</P>
<br><b>
Absolute and relative back references
</b><br>
<P>
The sequence \g followed by an unsigned or a negative number, optionally
enclosed in braces, is an absolute or relative back reference. A named back
reference can be coded as \g{name}. Back references are discussed
<a href="#backreferences">later,</a>
following the discussion of
<a href="#subpattern">parenthesized subpatterns.</a>
</P>
<br><b>
Absolute and relative subroutine calls
</b><br>
<P>
For compatibility with Oniguruma, the non-Perl syntax \g followed by a name or
a number enclosed either in angle brackets or single quotes, is an alternative
syntax for referencing a subpattern as a "subroutine". Details are discussed
<a href="#onigurumasubroutines">later.</a>
Note that \g{...} (Perl syntax) and \g&#60;...&#62; (Oniguruma syntax) are <i>not</i>
synonymous. The former is a back reference; the latter is a
<a href="#subpatternsassubroutines">subroutine</a>
call.
</P>
<br><b>
Generic character types
</b><br>
<P>
Another use of backslash is for specifying generic character types. The
following are always recognized:
<pre>
  \d     any decimal digit
  \D     any character that is not a decimal digit
  \h     any horizontal whitespace character
  \H     any character that is not a horizontal whitespace character
  \s     any whitespace character
  \S     any character that is not a whitespace character
  \v     any vertical whitespace character
  \V     any character that is not a vertical whitespace character
  \w     any "word" character
  \W     any "non-word" character
</pre>
Each pair of escape sequences partitions the complete set of characters into
two disjoint sets. Any given character matches one, and only one, of each pair.
</P>
<P>
These character type sequences can appear both inside and outside character
classes. They each match one character of the appropriate type. If the current
matching point is at the end of the subject string, all of them fail, since
there is no character to match.
</P>
<P>
For compatibility with Perl, \s does not match the VT character (code 11).
This makes it different from the the POSIX "space" class. The \s characters
are HT (9), LF (10), FF (12), CR (13), and space (32). If "use locale;" is
included in a Perl script, \s may match the VT character. In PCRE, it never
does.
</P>
<P>
In UTF-8 mode, characters with values greater than 128 never match \d, \s, or
\w, and always match \D, \S, and \W. This is true even when Unicode
character property support is available. These sequences retain their original
meanings from before UTF-8 support was available, mainly for efficiency
reasons. Note that this also affects \b, because it is defined in terms of \w
and \W.
</P>
<P>
The sequences \h, \H, \v, and \V are Perl 5.10 features. In contrast to the
other sequences, these do match certain high-valued codepoints in UTF-8 mode.
The horizontal space characters are:
<pre>
  U+0009     Horizontal tab
  U+0020     Space
  U+00A0     Non-break space
  U+1680     Ogham space mark
  U+180E     Mongolian vowel separator
  U+2000     En quad
  U+2001     Em quad
  U+2002     En space
  U+2003     Em space
  U+2004     Three-per-em space
  U+2005     Four-per-em space
  U+2006     Six-per-em space
  U+2007     Figure space
  U+2008     Punctuation space
  U+2009     Thin space
  U+200A     Hair space
  U+202F     Narrow no-break space
  U+205F     Medium mathematical space
  U+3000     Ideographic space
</pre>
The vertical space characters are:
<pre>
  U+000A     Linefeed
  U+000B     Vertical tab
  U+000C     Formfeed
  U+000D     Carriage return
  U+0085     Next line
  U+2028     Line separator
  U+2029     Paragraph separator
</PRE>
</P>
<P>
A "word" character is an underscore or any character less than 256 that is a
letter or digit. The definition of letters and digits is controlled by PCRE's
low-valued character tables, and may vary if locale-specific matching is taking
place (see
<a href="pcreapi.html#localesupport">"Locale support"</a>
in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page). For example, in a French locale such as "fr_FR" in Unix-like systems,
or "french" in Windows, some character codes greater than 128 are used for
accented letters, and these are matched by \w. The use of locales with Unicode
is discouraged.
<a name="newlineseq"></a></P>
<br><b>
Newline sequences
</b><br>
<P>
Outside a character class, by default, the escape sequence \R matches any
Unicode newline sequence. This is a Perl 5.10 feature. In non-UTF-8 mode \R is
equivalent to the following:
<pre>
  (?&#62;\r\n|\n|\x0b|\f|\r|\x85)
</pre>
This is an example of an "atomic group", details of which are given
<a href="#atomicgroup">below.</a>
This particular group matches either the two-character sequence CR followed by
LF, or one of the single characters LF (linefeed, U+000A), VT (vertical tab,
U+000B), FF (formfeed, U+000C), CR (carriage return, U+000D), or NEL (next
line, U+0085). The two-character sequence is treated as a single unit that
cannot be split.
</P>
<P>
In UTF-8 mode, two additional characters whose codepoints are greater than 255
are added: LS (line separator, U+2028) and PS (paragraph separator, U+2029).
Unicode character property support is not needed for these characters to be
recognized.
</P>
<P>
It is possible to restrict \R to match only CR, LF, or CRLF (instead of the
complete set of Unicode line endings) by setting the option PCRE_BSR_ANYCRLF
either at compile time or when the pattern is matched. (BSR is an abbrevation
for "backslash R".) This can be made the default when PCRE is built; if this is
the case, the other behaviour can be requested via the PCRE_BSR_UNICODE option.
It is also possible to specify these settings by starting a pattern string with
one of the following sequences:
<pre>
  (*BSR_ANYCRLF)   CR, LF, or CRLF only
  (*BSR_UNICODE)   any Unicode newline sequence
</pre>
These override the default and the options given to <b>pcre_compile()</b> or
<b>pcre_compile2()</b>, but they can be overridden by options given to
<b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>. Note that these special settings,
which are not Perl-compatible, are recognized only at the very start of a
pattern, and that they must be in upper case. If more than one of them is
present, the last one is used. They can be combined with a change of newline
convention, for example, a pattern can start with:
<pre>
  (*ANY)(*BSR_ANYCRLF)
</pre>
Inside a character class, \R matches the letter "R".
<a name="uniextseq"></a></P>
<br><b>
Unicode character properties
</b><br>
<P>
When PCRE is built with Unicode character property support, three additional
escape sequences that match characters with specific properties are available.
When not in UTF-8 mode, these sequences are of course limited to testing
characters whose codepoints are less than 256, but they do work in this mode.
The extra escape sequences are:
<pre>
  \p{<i>xx</i>}   a character with the <i>xx</i> property
  \P{<i>xx</i>}   a character without the <i>xx</i> property
  \X       an extended Unicode sequence
</pre>
The property names represented by <i>xx</i> above are limited to the Unicode
script names, the general category properties, and "Any", which matches any
character (including newline). Other properties such as "InMusicalSymbols" are
not currently supported by PCRE. Note that \P{Any} does not match any
characters, so always causes a match failure.
</P>
<P>
Sets of Unicode characters are defined as belonging to certain scripts. A
character from one of these sets can be matched using a script name. For
example:
<pre>
  \p{Greek}
  \P{Han}
</pre>
Those that are not part of an identified script are lumped together as
"Common". The current list of scripts is:
</P>
<P>
Arabic,
Armenian,
Avestan,
Balinese,
Bamum,
Bengali,
Bopomofo,
Braille,
Buginese,
Buhid,
Canadian_Aboriginal,
Carian,
Cham,
Cherokee,
Common,
Coptic,
Cuneiform,
Cypriot,
Cyrillic,
Deseret,
Devanagari,
Egyptian_Hieroglyphs,
Ethiopic,
Georgian,
Glagolitic,
Gothic,
Greek,
Gujarati,
Gurmukhi,
Han,
Hangul,
Hanunoo,
Hebrew,
Hiragana,
Imperial_Aramaic,
Inherited,
Inscriptional_Pahlavi,
Inscriptional_Parthian,
Javanese,
Kaithi,
Kannada,
Katakana,
Kayah_Li,
Kharoshthi,
Khmer,
Lao,
Latin,
Lepcha,
Limbu,
Linear_B,
Lisu,
Lycian,
Lydian,
Malayalam,
Meetei_Mayek,
Mongolian,
Myanmar,
New_Tai_Lue,
Nko,
Ogham,
Old_Italic,
Old_Persian,
Old_South_Arabian,
Old_Turkic,
Ol_Chiki,
Oriya,
Osmanya,
Phags_Pa,
Phoenician,
Rejang,
Runic,
Samaritan,
Saurashtra,
Shavian,
Sinhala,
Sundanese,
Syloti_Nagri,
Syriac,
Tagalog,
Tagbanwa,
Tai_Le,
Tai_Tham,
Tai_Viet,
Tamil,
Telugu,
Thaana,
Thai,
Tibetan,
Tifinagh,
Ugaritic,
Vai,
Yi.
</P>
<P>
Each character has exactly one general category property, specified by a
two-letter abbreviation. For compatibility with Perl, negation can be specified
by including a circumflex between the opening brace and the property name. For
example, \p{^Lu} is the same as \P{Lu}.
</P>
<P>
If only one letter is specified with \p or \P, it includes all the general
category properties that start with that letter. In this case, in the absence
of negation, the curly brackets in the escape sequence are optional; these two
examples have the same effect:
<pre>
  \p{L}
  \pL
</pre>
The following general category property codes are supported:
<pre>
  C     Other
  Cc    Control
  Cf    Format
  Cn    Unassigned
  Co    Private use
  Cs    Surrogate

  L     Letter
  Ll    Lower case letter
  Lm    Modifier letter
  Lo    Other letter
  Lt    Title case letter
  Lu    Upper case letter

  M     Mark
  Mc    Spacing mark
  Me    Enclosing mark
  Mn    Non-spacing mark

  N     Number
  Nd    Decimal number
  Nl    Letter number
  No    Other number

  P     Punctuation
  Pc    Connector punctuation
  Pd    Dash punctuation
  Pe    Close punctuation
  Pf    Final punctuation
  Pi    Initial punctuation
  Po    Other punctuation
  Ps    Open punctuation

  S     Symbol
  Sc    Currency symbol
  Sk    Modifier symbol
  Sm    Mathematical symbol
  So    Other symbol

  Z     Separator
  Zl    Line separator
  Zp    Paragraph separator
  Zs    Space separator
</pre>
The special property L& is also supported: it matches a character that has
the Lu, Ll, or Lt property, in other words, a letter that is not classified as
a modifier or "other".
</P>
<P>
The Cs (Surrogate) property applies only to characters in the range U+D800 to
U+DFFF. Such characters are not valid in UTF-8 strings (see RFC 3629) and so
cannot be tested by PCRE, unless UTF-8 validity checking has been turned off
(see the discussion of PCRE_NO_UTF8_CHECK in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page). Perl does not support the Cs property.
</P>
<P>
The long synonyms for property names that Perl supports (such as \p{Letter})
are not supported by PCRE, nor is it permitted to prefix any of these
properties with "Is".
</P>
<P>
No character that is in the Unicode table has the Cn (unassigned) property.
Instead, this property is assumed for any code point that is not in the
Unicode table.
</P>
<P>
Specifying caseless matching does not affect these escape sequences. For
example, \p{Lu} always matches only upper case letters.
</P>
<P>
The \X escape matches any number of Unicode characters that form an extended
Unicode sequence. \X is equivalent to
<pre>
  (?&#62;\PM\pM*)
</pre>
That is, it matches a character without the "mark" property, followed by zero
or more characters with the "mark" property, and treats the sequence as an
atomic group
<a href="#atomicgroup">(see below).</a>
Characters with the "mark" property are typically accents that affect the
preceding character. None of them have codepoints less than 256, so in
non-UTF-8 mode \X matches any one character.
</P>
<P>
Matching characters by Unicode property is not fast, because PCRE has to search
a structure that contains data for over fifteen thousand characters. That is
why the traditional escape sequences such as \d and \w do not use Unicode
properties in PCRE.
<a name="resetmatchstart"></a></P>
<br><b>
Resetting the match start
</b><br>
<P>
The escape sequence \K, which is a Perl 5.10 feature, causes any previously
matched characters not to be included in the final matched sequence. For
example, the pattern:
<pre>
  foo\Kbar
</pre>
matches "foobar", but reports that it has matched "bar". This feature is
similar to a lookbehind assertion
<a href="#lookbehind">(described below).</a>
However, in this case, the part of the subject before the real match does not
have to be of fixed length, as lookbehind assertions do. The use of \K does
not interfere with the setting of
<a href="#subpattern">captured substrings.</a>
For example, when the pattern
<pre>
  (foo)\Kbar
</pre>
matches "foobar", the first substring is still set to "foo".
</P>
<P>
Perl documents that the use of \K within assertions is "not well defined". In
PCRE, \K is acted upon when it occurs inside positive assertions, but is
ignored in negative assertions.
<a name="smallassertions"></a></P>
<br><b>
Simple assertions
</b><br>
<P>
The final use of backslash is for certain simple assertions. An assertion
specifies a condition that has to be met at a particular point in a match,
without consuming any characters from the subject string. The use of
subpatterns for more complicated assertions is described
<a href="#bigassertions">below.</a>
The backslashed assertions are:
<pre>
  \b     matches at a word boundary
  \B     matches when not at a word boundary
  \A     matches at the start of the subject
  \Z     matches at the end of the subject
          also matches before a newline at the end of the subject
  \z     matches only at the end of the subject
  \G     matches at the first matching position in the subject
</pre>
These assertions may not appear in character classes (but note that \b has a
different meaning, namely the backspace character, inside a character class).
</P>
<P>
A word boundary is a position in the subject string where the current character
and the previous character do not both match \w or \W (i.e. one matches
\w and the other matches \W), or the start or end of the string if the
first or last character matches \w, respectively. Neither PCRE nor Perl has a
separte "start of word" or "end of word" metasequence. However, whatever
follows \b normally determines which it is. For example, the fragment
\ba matches "a" at the start of a word.
</P>
<P>
The \A, \Z, and \z assertions differ from the traditional circumflex and
dollar (described in the next section) in that they only ever match at the very
start and end of the subject string, whatever options are set. Thus, they are
independent of multiline mode. These three assertions are not affected by the
PCRE_NOTBOL or PCRE_NOTEOL options, which affect only the behaviour of the
circumflex and dollar metacharacters. However, if the <i>startoffset</i>
argument of <b>pcre_exec()</b> is non-zero, indicating that matching is to start
at a point other than the beginning of the subject, \A can never match. The
difference between \Z and \z is that \Z matches before a newline at the end
of the string as well as at the very end, whereas \z matches only at the end.
</P>
<P>
The \G assertion is true only when the current matching position is at the
start point of the match, as specified by the <i>startoffset</i> argument of
<b>pcre_exec()</b>. It differs from \A when the value of <i>startoffset</i> is
non-zero. By calling <b>pcre_exec()</b> multiple times with appropriate
arguments, you can mimic Perl's /g option, and it is in this kind of
implementation where \G can be useful.
</P>
<P>
Note, however, that PCRE's interpretation of \G, as the start of the current
match, is subtly different from Perl's, which defines it as the end of the
previous match. In Perl, these can be different when the previously matched
string was empty. Because PCRE does just one match at a time, it cannot
reproduce this behaviour.
</P>
<P>
If all the alternatives of a pattern begin with \G, the expression is anchored
to the starting match position, and the "anchored" flag is set in the compiled
regular expression.
</P>
<br><a name="SEC5" href="#TOC1">CIRCUMFLEX AND DOLLAR</a><br>
<P>
Outside a character class, in the default matching mode, the circumflex
character is an assertion that is true only if the current matching point is
at the start of the subject string. If the <i>startoffset</i> argument of
<b>pcre_exec()</b> is non-zero, circumflex can never match if the PCRE_MULTILINE
option is unset. Inside a character class, circumflex has an entirely different
meaning
<a href="#characterclass">(see below).</a>
</P>
<P>
Circumflex need not be the first character of the pattern if a number of
alternatives are involved, but it should be the first thing in each alternative
in which it appears if the pattern is ever to match that branch. If all
possible alternatives start with a circumflex, that is, if the pattern is
constrained to match only at the start of the subject, it is said to be an
"anchored" pattern. (There are also other constructs that can cause a pattern
to be anchored.)
</P>
<P>
A dollar character is an assertion that is true only if the current matching
point is at the end of the subject string, or immediately before a newline
at the end of the string (by default). Dollar need not be the last character of
the pattern if a number of alternatives are involved, but it should be the last
item in any branch in which it appears. Dollar has no special meaning in a
character class.
</P>
<P>
The meaning of dollar can be changed so that it matches only at the very end of
the string, by setting the PCRE_DOLLAR_ENDONLY option at compile time. This
does not affect the \Z assertion.
</P>
<P>
The meanings of the circumflex and dollar characters are changed if the
PCRE_MULTILINE option is set. When this is the case, a circumflex matches
immediately after internal newlines as well as at the start of the subject
string. It does not match after a newline that ends the string. A dollar
matches before any newlines in the string, as well as at the very end, when
PCRE_MULTILINE is set. When newline is specified as the two-character
sequence CRLF, isolated CR and LF characters do not indicate newlines.
</P>
<P>
For example, the pattern /^abc$/ matches the subject string "def\nabc" (where
\n represents a newline) in multiline mode, but not otherwise. Consequently,
patterns that are anchored in single line mode because all branches start with
^ are not anchored in multiline mode, and a match for circumflex is possible
when the <i>startoffset</i> argument of <b>pcre_exec()</b> is non-zero. The
PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set.
</P>
<P>
Note that the sequences \A, \Z, and \z can be used to match the start and
end of the subject in both modes, and if all branches of a pattern start with
\A it is always anchored, whether or not PCRE_MULTILINE is set.
</P>
<br><a name="SEC6" href="#TOC1">FULL STOP (PERIOD, DOT)</a><br>
<P>
Outside a character class, a dot in the pattern matches any one character in
the subject string except (by default) a character that signifies the end of a
line. In UTF-8 mode, the matched character may be more than one byte long.
</P>
<P>
When a line ending is defined as a single character, dot never matches that
character; when the two-character sequence CRLF is used, dot does not match CR
if it is immediately followed by LF, but otherwise it matches all characters
(including isolated CRs and LFs). When any Unicode line endings are being
recognized, dot does not match CR or LF or any of the other line ending
characters.
</P>
<P>
The behaviour of dot with regard to newlines can be changed. If the PCRE_DOTALL
option is set, a dot matches any one character, without exception. If the
two-character sequence CRLF is present in the subject string, it takes two dots
to match it.
</P>
<P>
The handling of dot is entirely independent of the handling of circumflex and
dollar, the only relationship being that they both involve newlines. Dot has no
special meaning in a character class.
</P>
<br><a name="SEC7" href="#TOC1">MATCHING A SINGLE BYTE</a><br>
<P>
Outside a character class, the escape sequence \C matches any one byte, both
in and out of UTF-8 mode. Unlike a dot, it always matches any line-ending
characters. The feature is provided in Perl in order to match individual bytes
in UTF-8 mode. Because it breaks up UTF-8 characters into individual bytes,
what remains in the string may be a malformed UTF-8 string. For this reason,
the \C escape sequence is best avoided.
</P>
<P>
PCRE does not allow \C to appear in lookbehind assertions
<a href="#lookbehind">(described below),</a>
because in UTF-8 mode this would make it impossible to calculate the length of
the lookbehind.
<a name="characterclass"></a></P>
<br><a name="SEC8" href="#TOC1">SQUARE BRACKETS AND CHARACTER CLASSES</a><br>
<P>
An opening square bracket introduces a character class, terminated by a closing
square bracket. A closing square bracket on its own is not special by default.
However, if the PCRE_JAVASCRIPT_COMPAT option is set, a lone closing square
bracket causes a compile-time error. If a closing square bracket is required as
a member of the class, it should be the first data character in the class
(after an initial circumflex, if present) or escaped with a backslash.
</P>
<P>
A character class matches a single character in the subject. In UTF-8 mode, the
character may be more than one byte long. A matched character must be in the
set of characters defined by the class, unless the first character in the class
definition is a circumflex, in which case the subject character must not be in
the set defined by the class. If a circumflex is actually required as a member
of the class, ensure it is not the first character, or escape it with a
backslash.
</P>
<P>
For example, the character class [aeiou] matches any lower case vowel, while
[^aeiou] matches any character that is not a lower case vowel. Note that a
circumflex is just a convenient notation for specifying the characters that
are in the class by enumerating those that are not. A class that starts with a
circumflex is not an assertion; it still consumes a character from the subject
string, and therefore it fails if the current pointer is at the end of the
string.
</P>
<P>
In UTF-8 mode, characters with values greater than 255 can be included in a
class as a literal string of bytes, or by using the \x{ escaping mechanism.
</P>
<P>
When caseless matching is set, any letters in a class represent both their
upper case and lower case versions, so for example, a caseless [aeiou] matches
"A" as well as "a", and a caseless [^aeiou] does not match "A", whereas a
caseful version would. In UTF-8 mode, PCRE always understands the concept of
case for characters whose values are less than 128, so caseless matching is
always possible. For characters with higher values, the concept of case is
supported if PCRE is compiled with Unicode property support, but not otherwise.
If you want to use caseless matching in UTF8-mode for characters 128 and above,
you must ensure that PCRE is compiled with Unicode property support as well as
with UTF-8 support.
</P>
<P>
Characters that might indicate line breaks are never treated in any special way
when matching character classes, whatever line-ending sequence is in use, and
whatever setting of the PCRE_DOTALL and PCRE_MULTILINE options is used. A class
such as [^a] always matches one of these characters.
</P>
<P>
The minus (hyphen) character can be used to specify a range of characters in a
character class. For example, [d-m] matches any letter between d and m,
inclusive. If a minus character is required in a class, it must be escaped with
a backslash or appear in a position where it cannot be interpreted as
indicating a range, typically as the first or last character in the class.
</P>
<P>
It is not possible to have the literal character "]" as the end character of a
range. A pattern such as [W-]46] is interpreted as a class of two characters
("W" and "-") followed by a literal string "46]", so it would match "W46]" or
"-46]". However, if the "]" is escaped with a backslash it is interpreted as
the end of range, so [W-\]46] is interpreted as a class containing a range
followed by two other characters. The octal or hexadecimal representation of
"]" can also be used to end a range.
</P>
<P>
Ranges operate in the collating sequence of character values. They can also be
used for characters specified numerically, for example [\000-\037]. In UTF-8
mode, ranges can include characters whose values are greater than 255, for
example [\x{100}-\x{2ff}].
</P>
<P>
If a range that includes letters is used when caseless matching is set, it
matches the letters in either case. For example, [W-c] is equivalent to
[][\\^_`wxyzabc], matched caselessly, and in non-UTF-8 mode, if character
tables for a French locale are in use, [\xc8-\xcb] matches accented E
characters in both cases. In UTF-8 mode, PCRE supports the concept of case for
characters with values greater than 128 only when it is compiled with Unicode
property support.
</P>
<P>
The character types \d, \D, \p, \P, \s, \S, \w, and \W may also appear
in a character class, and add the characters that they match to the class. For
example, [\dABCDEF] matches any hexadecimal digit. A circumflex can
conveniently be used with the upper case character types to specify a more
restricted set of characters than the matching lower case type. For example,
the class [^\W_] matches any letter or digit, but not underscore.
</P>
<P>
The only metacharacters that are recognized in character classes are backslash,
hyphen (only where it can be interpreted as specifying a range), circumflex
(only at the start), opening square bracket (only when it can be interpreted as
introducing a POSIX class name - see the next section), and the terminating
closing square bracket. However, escaping other non-alphanumeric characters
does no harm.
</P>
<br><a name="SEC9" href="#TOC1">POSIX CHARACTER CLASSES</a><br>
<P>
Perl supports the POSIX notation for character classes. This uses names
enclosed by [: and :] within the enclosing square brackets. PCRE also supports
this notation. For example,
<pre>
  [01[:alpha:]%]
</pre>
matches "0", "1", any alphabetic character, or "%". The supported class names
are
<pre>
  alnum    letters and digits
  alpha    letters
  ascii    character codes 0 - 127
  blank    space or tab only
  cntrl    control characters
  digit    decimal digits (same as \d)
  graph    printing characters, excluding space
  lower    lower case letters
  print    printing characters, including space
  punct    printing characters, excluding letters and digits
  space    white space (not quite the same as \s)
  upper    upper case letters
  word     "word" characters (same as \w)
  xdigit   hexadecimal digits
</pre>
The "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13), and
space (32). Notice that this list includes the VT character (code 11). This
makes "space" different to \s, which does not include VT (for Perl
compatibility).
</P>
<P>
The name "word" is a Perl extension, and "blank" is a GNU extension from Perl
5.8. Another Perl extension is negation, which is indicated by a ^ character
after the colon. For example,
<pre>
  [12[:^digit:]]
</pre>
matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the POSIX
syntax [.ch.] and [=ch=] where "ch" is a "collating element", but these are not
supported, and an error is given if they are encountered.
</P>
<P>
In UTF-8 mode, characters with values greater than 128 do not match any of
the POSIX character classes.
</P>
<br><a name="SEC10" href="#TOC1">VERTICAL BAR</a><br>
<P>
Vertical bar characters are used to separate alternative patterns. For example,
the pattern
<pre>
  gilbert|sullivan
</pre>
matches either "gilbert" or "sullivan". Any number of alternatives may appear,
and an empty alternative is permitted (matching the empty string). The matching
process tries each alternative in turn, from left to right, and the first one
that succeeds is used. If the alternatives are within a subpattern
<a href="#subpattern">(defined below),</a>
"succeeds" means matching the rest of the main pattern as well as the
alternative in the subpattern.
</P>
<br><a name="SEC11" href="#TOC1">INTERNAL OPTION SETTING</a><br>
<P>
The settings of the PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and
PCRE_EXTENDED options (which are Perl-compatible) can be changed from within
the pattern by a sequence of Perl option letters enclosed between "(?" and ")".
The option letters are
<pre>
  i  for PCRE_CASELESS
  m  for PCRE_MULTILINE
  s  for PCRE_DOTALL
  x  for PCRE_EXTENDED
</pre>
For example, (?im) sets caseless, multiline matching. It is also possible to
unset these options by preceding the letter with a hyphen, and a combined
setting and unsetting such as (?im-sx), which sets PCRE_CASELESS and
PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also
permitted. If a letter appears both before and after the hyphen, the option is
unset.
</P>
<P>
The PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and PCRE_EXTRA can be
changed in the same way as the Perl-compatible options by using the characters
J, U and X respectively.
</P>
<P>
When one of these option changes occurs at top level (that is, not inside
subpattern parentheses), the change applies to the remainder of the pattern
that follows. If the change is placed right at the start of a pattern, PCRE
extracts it into the global options (and it will therefore show up in data
extracted by the <b>pcre_fullinfo()</b> function).
</P>
<P>
An option change within a subpattern (see below for a description of
subpatterns) affects only that part of the current pattern that follows it, so
<pre>
  (a(?i)b)c
</pre>
matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used).
By this means, options can be made to have different settings in different
parts of the pattern. Any changes made in one alternative do carry on
into subsequent branches within the same subpattern. For example,
<pre>
  (a(?i)b|c)
</pre>
matches "ab", "aB", "c", and "C", even though when matching "C" the first
branch is abandoned before the option setting. This is because the effects of
option settings happen at compile time. There would be some very weird
behaviour otherwise.
</P>
<P>
<b>Note:</b> There are other PCRE-specific options that can be set by the
application when the compile or match functions are called. In some cases the
pattern can contain special leading sequences such as (*CRLF) to override what
the application has set or what has been defaulted. Details are given in the
section entitled
<a href="#newlineseq">"Newline sequences"</a>
above. There is also the (*UTF8) leading sequence that can be used to set UTF-8
mode; this is equivalent to setting the PCRE_UTF8 option.
<a name="subpattern"></a></P>
<br><a name="SEC12" href="#TOC1">SUBPATTERNS</a><br>
<P>
Subpatterns are delimited by parentheses (round brackets), which can be nested.
Turning part of a pattern into a subpattern does two things:
<br>
<br>
1. It localizes a set of alternatives. For example, the pattern
<pre>
  cat(aract|erpillar|)
</pre>
matches one of the words "cat", "cataract", or "caterpillar". Without the
parentheses, it would match "cataract", "erpillar" or an empty string.
<br>
<br>
2. It sets up the subpattern as a capturing subpattern. This means that, when
the whole pattern matches, that portion of the subject string that matched the
subpattern is passed back to the caller via the <i>ovector</i> argument of
<b>pcre_exec()</b>. Opening parentheses are counted from left to right (starting
from 1) to obtain numbers for the capturing subpatterns.
</P>
<P>
For example, if the string "the red king" is matched against the pattern
<pre>
  the ((red|white) (king|queen))
</pre>
the captured substrings are "red king", "red", and "king", and are numbered 1,
2, and 3, respectively.
</P>
<P>
The fact that plain parentheses fulfil two functions is not always helpful.
There are often times when a grouping subpattern is required without a
capturing requirement. If an opening parenthesis is followed by a question mark
and a colon, the subpattern does not do any capturing, and is not counted when
computing the number of any subsequent capturing subpatterns. For example, if
the string "the white queen" is matched against the pattern
<pre>
  the ((?:red|white) (king|queen))
</pre>
the captured substrings are "white queen" and "queen", and are numbered 1 and
2. The maximum number of capturing subpatterns is 65535.
</P>
<P>
As a convenient shorthand, if any option settings are required at the start of
a non-capturing subpattern, the option letters may appear between the "?" and
the ":". Thus the two patterns
<pre>
  (?i:saturday|sunday)
  (?:(?i)saturday|sunday)
</pre>
match exactly the same set of strings. Because alternative branches are tried
from left to right, and options are not reset until the end of the subpattern
is reached, an option setting in one branch does affect subsequent branches, so
the above patterns match "SUNDAY" as well as "Saturday".
<a name="dupsubpatternnumber"></a></P>
<br><a name="SEC13" href="#TOC1">DUPLICATE SUBPATTERN NUMBERS</a><br>
<P>
Perl 5.10 introduced a feature whereby each alternative in a subpattern uses
the same numbers for its capturing parentheses. Such a subpattern starts with
(?| and is itself a non-capturing subpattern. For example, consider this
pattern:
<pre>
  (?|(Sat)ur|(Sun))day
</pre>
Because the two alternatives are inside a (?| group, both sets of capturing
parentheses are numbered one. Thus, when the pattern matches, you can look
at captured substring number one, whichever alternative matched. This construct
is useful when you want to capture part, but not all, of one of a number of
alternatives. Inside a (?| group, parentheses are numbered as usual, but the
number is reset at the start of each branch. The numbers of any capturing
buffers that follow the subpattern start after the highest number used in any
branch. The following example is taken from the Perl documentation.
The numbers underneath show in which buffer the captured content will be
stored.
<pre>
  # before  ---------------branch-reset----------- after
  / ( a )  (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x
  # 1            2         2  3        2     3     4
</pre>
A back reference to a numbered subpattern uses the most recent value that is
set for that number by any subpattern. The following pattern matches "abcabc"
or "defdef":
<pre>
  /(?|(abc)|(def))\1/
</pre>
In contrast, a recursive or "subroutine" call to a numbered subpattern always
refers to the first one in the pattern with the given number. The following
pattern matches "abcabc" or "defabc":
<pre>
  /(?|(abc)|(def))(?1)/
</pre>
If a
<a href="#conditions">condition test</a>
for a subpattern's having matched refers to a non-unique number, the test is
true if any of the subpatterns of that number have matched.
</P>
<P>
An alternative approach to using this "branch reset" feature is to use
duplicate named subpatterns, as described in the next section.
</P>
<br><a name="SEC14" href="#TOC1">NAMED SUBPATTERNS</a><br>
<P>
Identifying capturing parentheses by number is simple, but it can be very hard
to keep track of the numbers in complicated regular expressions. Furthermore,
if an expression is modified, the numbers may change. To help with this
difficulty, PCRE supports the naming of subpatterns. This feature was not
added to Perl until release 5.10. Python had the feature earlier, and PCRE
introduced it at release 4.0, using the Python syntax. PCRE now supports both
the Perl and the Python syntax. Perl allows identically numbered subpatterns to
have different names, but PCRE does not.
</P>
<P>
In PCRE, a subpattern can be named in one of three ways: (?&#60;name&#62;...) or
(?'name'...) as in Perl, or (?P&#60;name&#62;...) as in Python. References to capturing
parentheses from other parts of the pattern, such as
<a href="#backreferences">back references,</a>
<a href="#recursion">recursion,</a>
and
<a href="#conditions">conditions,</a>
can be made by name as well as by number.
</P>
<P>
Names consist of up to 32 alphanumeric characters and underscores. Named
capturing parentheses are still allocated numbers as well as names, exactly as
if the names were not present. The PCRE API provides function calls for
extracting the name-to-number translation table from a compiled pattern. There
is also a convenience function for extracting a captured substring by name.
</P>
<P>
By default, a name must be unique within a pattern, but it is possible to relax
this constraint by setting the PCRE_DUPNAMES option at compile time. (Duplicate
names are also always permitted for subpatterns with the same number, set up as
described in the previous section.) Duplicate names can be useful for patterns
where only one instance of the named parentheses can match. Suppose you want to
match the name of a weekday, either as a 3-letter abbreviation or as the full
name, and in both cases you want to extract the abbreviation. This pattern
(ignoring the line breaks) does the job:
<pre>
  (?&#60;DN&#62;Mon|Fri|Sun)(?:day)?|
  (?&#60;DN&#62;Tue)(?:sday)?|
  (?&#60;DN&#62;Wed)(?:nesday)?|
  (?&#60;DN&#62;Thu)(?:rsday)?|
  (?&#60;DN&#62;Sat)(?:urday)?
</pre>
There are five capturing substrings, but only one is ever set after a match.
(An alternative way of solving this problem is to use a "branch reset"
subpattern, as described in the previous section.)
</P>
<P>
The convenience function for extracting the data by name returns the substring
for the first (and in this example, the only) subpattern of that name that
matched. This saves searching to find which numbered subpattern it was.
</P>
<P>
If you make a back reference to a non-unique named subpattern from elsewhere in
the pattern, the one that corresponds to the first occurrence of the name is
used. In the absence of duplicate numbers (see the previous section) this is
the one with the lowest number. If you use a named reference in a condition
test (see the
<a href="#conditions">section about conditions</a>
below), either to check whether a subpattern has matched, or to check for
recursion, all subpatterns with the same name are tested. If the condition is
true for any one of them, the overall condition is true. This is the same
behaviour as testing by number. For further details of the interfaces for
handling named subpatterns, see the
<a href="pcreapi.html"><b>pcreapi</b></a>
documentation.
</P>
<P>
<b>Warning:</b> You cannot use different names to distinguish between two
subpatterns with the same number because PCRE uses only the numbers when
matching. For this reason, an error is given at compile time if different names
are given to subpatterns with the same number. However, you can give the same
name to subpatterns with the same number, even when PCRE_DUPNAMES is not set.
</P>
<br><a name="SEC15" href="#TOC1">REPETITION</a><br>
<P>
Repetition is specified by quantifiers, which can follow any of the following
items:
<pre>
  a literal data character
  the dot metacharacter
  the \C escape sequence
  the \X escape sequence (in UTF-8 mode with Unicode properties)
  the \R escape sequence
  an escape such as \d that matches a single character
  a character class
  a back reference (see next section)
  a parenthesized subpattern (unless it is an assertion)
  a recursive or "subroutine" call to a subpattern
</pre>
The general repetition quantifier specifies a minimum and maximum number of
permitted matches, by giving the two numbers in curly brackets (braces),
separated by a comma. The numbers must be less than 65536, and the first must
be less than or equal to the second. For example:
<pre>
  z{2,4}
</pre>
matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special
character. If the second number is omitted, but the comma is present, there is
no upper limit; if the second number and the comma are both omitted, the
quantifier specifies an exact number of required matches. Thus
<pre>
  [aeiou]{3,}
</pre>
matches at least 3 successive vowels, but may match many more, while
<pre>
  \d{8}
</pre>
matches exactly 8 digits. An opening curly bracket that appears in a position
where a quantifier is not allowed, or one that does not match the syntax of a
quantifier, is taken as a literal character. For example, {,6} is not a
quantifier, but a literal string of four characters.
</P>
<P>
In UTF-8 mode, quantifiers apply to UTF-8 characters rather than to individual
bytes. Thus, for example, \x{100}{2} matches two UTF-8 characters, each of
which is represented by a two-byte sequence. Similarly, when Unicode property
support is available, \X{3} matches three Unicode extended sequences, each of
which may be several bytes long (and they may be of different lengths).
</P>
<P>
The quantifier {0} is permitted, causing the expression to behave as if the
previous item and the quantifier were not present. This may be useful for
subpatterns that are referenced as
<a href="#subpatternsassubroutines">subroutines</a>
from elsewhere in the pattern. Items other than subpatterns that have a {0}
quantifier are omitted from the compiled pattern.
</P>
<P>
For convenience, the three most common quantifiers have single-character
abbreviations:
<pre>
  *    is equivalent to {0,}
  +    is equivalent to {1,}
  ?    is equivalent to {0,1}
</pre>
It is possible to construct infinite loops by following a subpattern that can
match no characters with a quantifier that has no upper limit, for example:
<pre>
  (a?)*
</pre>
Earlier versions of Perl and PCRE used to give an error at compile time for
such patterns. However, because there are cases where this can be useful, such
patterns are now accepted, but if any repetition of the subpattern does in fact
match no characters, the loop is forcibly broken.
</P>
<P>
By default, the quantifiers are "greedy", that is, they match as much as
possible (up to the maximum number of permitted times), without causing the
rest of the pattern to fail. The classic example of where this gives problems
is in trying to match comments in C programs. These appear between /* and */
and within the comment, individual * and / characters may appear. An attempt to
match C comments by applying the pattern
<pre>
  /\*.*\*/
</pre>
to the string
<pre>
  /* first comment */  not comment  /* second comment */
</pre>
fails, because it matches the entire string owing to the greediness of the .*
item.
</P>
<P>
However, if a quantifier is followed by a question mark, it ceases to be
greedy, and instead matches the minimum number of times possible, so the
pattern
<pre>
  /\*.*?\*/
</pre>
does the right thing with the C comments. The meaning of the various
quantifiers is not otherwise changed, just the preferred number of matches.
Do not confuse this use of question mark with its use as a quantifier in its
own right. Because it has two uses, it can sometimes appear doubled, as in
<pre>
  \d??\d
</pre>
which matches one digit by preference, but can match two if that is the only
way the rest of the pattern matches.
</P>
<P>
If the PCRE_UNGREEDY option is set (an option that is not available in Perl),
the quantifiers are not greedy by default, but individual ones can be made
greedy by following them with a question mark. In other words, it inverts the
default behaviour.
</P>
<P>
When a parenthesized subpattern is quantified with a minimum repeat count that
is greater than 1 or with a limited maximum, more memory is required for the
compiled pattern, in proportion to the size of the minimum or maximum.
</P>
<P>
If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent
to Perl's /s) is set, thus allowing the dot to match newlines, the pattern is
implicitly anchored, because whatever follows will be tried against every
character position in the subject string, so there is no point in retrying the
overall match at any position after the first. PCRE normally treats such a
pattern as though it were preceded by \A.
</P>
<P>
In cases where it is known that the subject string contains no newlines, it is
worth setting PCRE_DOTALL in order to obtain this optimization, or
alternatively using ^ to indicate anchoring explicitly.
</P>
<P>
However, there is one situation where the optimization cannot be used. When .*
is inside capturing parentheses that are the subject of a back reference
elsewhere in the pattern, a match at the start may fail where a later one
succeeds. Consider, for example:
<pre>
  (.*)abc\1
</pre>
If the subject is "xyz123abc123" the match point is the fourth character. For
this reason, such a pattern is not implicitly anchored.
</P>
<P>
When a capturing subpattern is repeated, the value captured is the substring
that matched the final iteration. For example, after
<pre>
  (tweedle[dume]{3}\s*)+
</pre>
has matched "tweedledum tweedledee" the value of the captured substring is
"tweedledee". However, if there are nested capturing subpatterns, the
corresponding captured values may have been set in previous iterations. For
example, after
<pre>
  /(a|(b))+/
</pre>
matches "aba" the value of the second captured substring is "b".
<a name="atomicgroup"></a></P>
<br><a name="SEC16" href="#TOC1">ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS</a><br>
<P>
With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy")
repetition, failure of what follows normally causes the repeated item to be
re-evaluated to see if a different number of repeats allows the rest of the
pattern to match. Sometimes it is useful to prevent this, either to change the
nature of the match, or to cause it fail earlier than it otherwise might, when
the author of the pattern knows there is no point in carrying on.
</P>
<P>
Consider, for example, the pattern \d+foo when applied to the subject line
<pre>
  123456bar
</pre>
After matching all 6 digits and then failing to match "foo", the normal
action of the matcher is to try again with only 5 digits matching the \d+
item, and then with 4, and so on, before ultimately failing. "Atomic grouping"
(a term taken from Jeffrey Friedl's book) provides the means for specifying
that once a subpattern has matched, it is not to be re-evaluated in this way.
</P>
<P>
If we use atomic grouping for the previous example, the matcher gives up
immediately on failing to match "foo" the first time. The notation is a kind of
special parenthesis, starting with (?&#62; as in this example:
<pre>
  (?&#62;\d+)foo
</pre>
This kind of parenthesis "locks up" the  part of the pattern it contains once
it has matched, and a failure further into the pattern is prevented from
backtracking into it. Backtracking past it to previous items, however, works as
normal.
</P>
<P>
An alternative description is that a subpattern of this type matches the string
of characters that an identical standalone pattern would match, if anchored at
the current point in the subject string.
</P>
<P>
Atomic grouping subpatterns are not capturing subpatterns. Simple cases such as
the above example can be thought of as a maximizing repeat that must swallow
everything it can. So, while both \d+ and \d+? are prepared to adjust the
number of digits they match in order to make the rest of the pattern match,
(?&#62;\d+) can only match an entire sequence of digits.
</P>
<P>
Atomic groups in general can of course contain arbitrarily complicated
subpatterns, and can be nested. However, when the subpattern for an atomic
group is just a single repeated item, as in the example above, a simpler
notation, called a "possessive quantifier" can be used. This consists of an
additional + character following a quantifier. Using this notation, the
previous example can be rewritten as
<pre>
  \d++foo
</pre>
Note that a possessive quantifier can be used with an entire group, for
example:
<pre>
  (abc|xyz){2,3}+
</pre>
Possessive quantifiers are always greedy; the setting of the PCRE_UNGREEDY
option is ignored. They are a convenient notation for the simpler forms of
atomic group. However, there is no difference in the meaning of a possessive
quantifier and the equivalent atomic group, though there may be a performance
difference; possessive quantifiers should be slightly faster.
</P>
<P>
The possessive quantifier syntax is an extension to the Perl 5.8 syntax.
Jeffrey Friedl originated the idea (and the name) in the first edition of his
book. Mike McCloskey liked it, so implemented it when he built Sun's Java
package, and PCRE copied it from there. It ultimately found its way into Perl
at release 5.10.
</P>
<P>
PCRE has an optimization that automatically "possessifies" certain simple
pattern constructs. For example, the sequence A+B is treated as A++B because
there is no point in backtracking into a sequence of A's when B must follow.
</P>
<P>
When a pattern contains an unlimited repeat inside a subpattern that can itself
be repeated an unlimited number of times, the use of an atomic group is the
only way to avoid some failing matches taking a very long time indeed. The
pattern
<pre>
  (\D+|&#60;\d+&#62;)*[!?]
</pre>
matches an unlimited number of substrings that either consist of non-digits, or
digits enclosed in &#60;&#62;, followed by either ! or ?. When it matches, it runs
quickly. However, if it is applied to
<pre>
  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
</pre>
it takes a long time before reporting failure. This is because the string can
be divided between the internal \D+ repeat and the external * repeat in a
large number of ways, and all have to be tried. (The example uses [!?] rather
than a single character at the end, because both PCRE and Perl have an
optimization that allows for fast failure when a single character is used. They
remember the last single character that is required for a match, and fail early
if it is not present in the string.) If the pattern is changed so that it uses
an atomic group, like this:
<pre>
  ((?&#62;\D+)|&#60;\d+&#62;)*[!?]
</pre>
sequences of non-digits cannot be broken, and failure happens quickly.
<a name="backreferences"></a></P>
<br><a name="SEC17" href="#TOC1">BACK REFERENCES</a><br>
<P>
Outside a character class, a backslash followed by a digit greater than 0 (and
possibly further digits) is a back reference to a capturing subpattern earlier
(that is, to its left) in the pattern, provided there have been that many
previous capturing left parentheses.
</P>
<P>
However, if the decimal number following the backslash is less than 10, it is
always taken as a back reference, and causes an error only if there are not
that many capturing left parentheses in the entire pattern. In other words, the
parentheses that are referenced need not be to the left of the reference for
numbers less than 10. A "forward back reference" of this type can make sense
when a repetition is involved and the subpattern to the right has participated
in an earlier iteration.
</P>
<P>
It is not possible to have a numerical "forward back reference" to a subpattern
whose number is 10 or more using this syntax because a sequence such as \50 is
interpreted as a character defined in octal. See the subsection entitled
"Non-printing characters"
<a href="#digitsafterbackslash">above</a>
for further details of the handling of digits following a backslash. There is
no such problem when named parentheses are used. A back reference to any
subpattern is possible using named parentheses (see below).
</P>
<P>
Another way of avoiding the ambiguity inherent in the use of digits following a
backslash is to use the \g escape sequence, which is a feature introduced in
Perl 5.10. This escape must be followed by an unsigned number or a negative
number, optionally enclosed in braces. These examples are all identical:
<pre>
  (ring), \1
  (ring), \g1
  (ring), \g{1}
</pre>
An unsigned number specifies an absolute reference without the ambiguity that
is present in the older syntax. It is also useful when literal digits follow
the reference. A negative number is a relative reference. Consider this
example:
<pre>
  (abc(def)ghi)\g{-1}
</pre>
The sequence \g{-1} is a reference to the most recently started capturing
subpattern before \g, that is, is it equivalent to \2. Similarly, \g{-2}
would be equivalent to \1. The use of relative references can be helpful in
long patterns, and also in patterns that are created by joining together
fragments that contain references within themselves.
</P>
<P>
A back reference matches whatever actually matched the capturing subpattern in
the current subject string, rather than anything matching the subpattern
itself (see
<a href="#subpatternsassubroutines">"Subpatterns as subroutines"</a>
below for a way of doing that). So the pattern
<pre>
  (sens|respons)e and \1ibility
</pre>
matches "sense and sensibility" and "response and responsibility", but not
"sense and responsibility". If caseful matching is in force at the time of the
back reference, the case of letters is relevant. For example,
<pre>
  ((?i)rah)\s+\1
</pre>
matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original
capturing subpattern is matched caselessly.
</P>
<P>
There are several different ways of writing back references to named
subpatterns. The .NET syntax \k{name} and the Perl syntax \k&#60;name&#62; or
\k'name' are supported, as is the Python syntax (?P=name). Perl 5.10's unified
back reference syntax, in which \g can be used for both numeric and named
references, is also supported. We could rewrite the above example in any of
the following ways:
<pre>
  (?&#60;p1&#62;(?i)rah)\s+\k&#60;p1&#62;
  (?'p1'(?i)rah)\s+\k{p1}
  (?P&#60;p1&#62;(?i)rah)\s+(?P=p1)
  (?&#60;p1&#62;(?i)rah)\s+\g{p1}
</pre>
A subpattern that is referenced by name may appear in the pattern before or
after the reference.
</P>
<P>
There may be more than one back reference to the same subpattern. If a
subpattern has not actually been used in a particular match, any back
references to it always fail by default. For example, the pattern
<pre>
  (a|(bc))\2
</pre>
always fails if it starts to match "a" rather than "bc". However, if the
PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back reference to an
unset value matches an empty string.
</P>
<P>
Because there may be many capturing parentheses in a pattern, all digits
following a backslash are taken as part of a potential back reference number.
If the pattern continues with a digit character, some delimiter must be used to
terminate the back reference. If the PCRE_EXTENDED option is set, this can be
whitespace. Otherwise, the \g{ syntax or an empty comment (see
<a href="#comments">"Comments"</a>
below) can be used.
</P>
<br><b>
Recursive back references
</b><br>
<P>
A back reference that occurs inside the parentheses to which it refers fails
when the subpattern is first used, so, for example, (a\1) never matches.
However, such references can be useful inside repeated subpatterns. For
example, the pattern
<pre>
  (a|b\1)+
</pre>
matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration of
the subpattern, the back reference matches the character string corresponding
to the previous iteration. In order for this to work, the pattern must be such
that the first iteration does not need to match the back reference. This can be
done using alternation, as in the example above, or by a quantifier with a
minimum of zero.
</P>
<P>
Back references of this type cause the group that they reference to be treated
as an
<a href="#atomicgroup">atomic group.</a>
Once the whole group has been matched, a subsequent matching failure cannot
cause backtracking into the middle of the group.
<a name="bigassertions"></a></P>
<br><a name="SEC18" href="#TOC1">ASSERTIONS</a><br>
<P>
An assertion is a test on the characters following or preceding the current
matching point that does not actually consume any characters. The simple
assertions coded as \b, \B, \A, \G, \Z, \z, ^ and $ are described
<a href="#smallassertions">above.</a>
</P>
<P>
More complicated assertions are coded as subpatterns. There are two kinds:
those that look ahead of the current position in the subject string, and those
that look behind it. An assertion subpattern is matched in the normal way,
except that it does not cause the current matching position to be changed.
</P>
<P>
Assertion subpatterns are not capturing subpatterns, and may not be repeated,
because it makes no sense to assert the same thing several times. If any kind
of assertion contains capturing subpatterns within it, these are counted for
the purposes of numbering the capturing subpatterns in the whole pattern.
However, substring capturing is carried out only for positive assertions,
because it does not make sense for negative assertions.
</P>
<br><b>
Lookahead assertions
</b><br>
<P>
Lookahead assertions start with (?= for positive assertions and (?! for
negative assertions. For example,
<pre>
  \w+(?=;)
</pre>
matches a word followed by a semicolon, but does not include the semicolon in
the match, and
<pre>
  foo(?!bar)
</pre>
matches any occurrence of "foo" that is not followed by "bar". Note that the
apparently similar pattern
<pre>
  (?!foo)bar
</pre>
does not find an occurrence of "bar" that is preceded by something other than
"foo"; it finds any occurrence of "bar" whatsoever, because the assertion
(?!foo) is always true when the next three characters are "bar". A
lookbehind assertion is needed to achieve the other effect.
</P>
<P>
If you want to force a matching failure at some point in a pattern, the most
convenient way to do it is with (?!) because an empty string always matches, so
an assertion that requires there not to be an empty string must always fail.
The Perl 5.10 backtracking control verb (*FAIL) or (*F) is essentially a
synonym for (?!).
<a name="lookbehind"></a></P>
<br><b>
Lookbehind assertions
</b><br>
<P>
Lookbehind assertions start with (?&#60;= for positive assertions and (?&#60;! for
negative assertions. For example,
<pre>
  (?&#60;!foo)bar
</pre>
does find an occurrence of "bar" that is not preceded by "foo". The contents of
a lookbehind assertion are restricted such that all the strings it matches must
have a fixed length. However, if there are several top-level alternatives, they
do not all have to have the same fixed length. Thus
<pre>
  (?&#60;=bullock|donkey)
</pre>
is permitted, but
<pre>
  (?&#60;!dogs?|cats?)
</pre>
causes an error at compile time. Branches that match different length strings
are permitted only at the top level of a lookbehind assertion. This is an
extension compared with Perl (5.8 and 5.10), which requires all branches to
match the same length of string. An assertion such as
<pre>
  (?&#60;=ab(c|de))
</pre>
is not permitted, because its single top-level branch can match two different
lengths, but it is acceptable to PCRE if rewritten to use two top-level
branches:
<pre>
  (?&#60;=abc|abde)
</pre>
In some cases, the Perl 5.10 escape sequence \K
<a href="#resetmatchstart">(see above)</a>
can be used instead of a lookbehind assertion to get round the fixed-length
restriction.
</P>
<P>
The implementation of lookbehind assertions is, for each alternative, to
temporarily move the current position back by the fixed length and then try to
match. If there are insufficient characters before the current position, the
assertion fails.
</P>
<P>
PCRE does not allow the \C escape (which matches a single byte in UTF-8 mode)
to appear in lookbehind assertions, because it makes it impossible to calculate
the length of the lookbehind. The \X and \R escapes, which can match
different numbers of bytes, are also not permitted.
</P>
<P>
<a href="#subpatternsassubroutines">"Subroutine"</a>
calls (see below) such as (?2) or (?&X) are permitted in lookbehinds, as long
as the subpattern matches a fixed-length string.
<a href="#recursion">Recursion,</a>
however, is not supported.
</P>
<P>
Possessive quantifiers can be used in conjunction with lookbehind assertions to
specify efficient matching of fixed-length strings at the end of subject
strings. Consider a simple pattern such as
<pre>
  abcd$
</pre>
when applied to a long string that does not match. Because matching proceeds
from left to right, PCRE will look for each "a" in the subject and then see if
what follows matches the rest of the pattern. If the pattern is specified as
<pre>
  ^.*abcd$
</pre>
the initial .* matches the entire string at first, but when this fails (because
there is no following "a"), it backtracks to match all but the last character,
then all but the last two characters, and so on. Once again the search for "a"
covers the entire string, from right to left, so we are no better off. However,
if the pattern is written as
<pre>
  ^.*+(?&#60;=abcd)
</pre>
there can be no backtracking for the .*+ item; it can match only the entire
string. The subsequent lookbehind assertion does a single test on the last four
characters. If it fails, the match fails immediately. For long strings, this
approach makes a significant difference to the processing time.
</P>
<br><b>
Using multiple assertions
</b><br>
<P>
Several assertions (of any sort) may occur in succession. For example,
<pre>
  (?&#60;=\d{3})(?&#60;!999)foo
</pre>
matches "foo" preceded by three digits that are not "999". Notice that each of
the assertions is applied independently at the same point in the subject
string. First there is a check that the previous three characters are all
digits, and then there is a check that the same three characters are not "999".
This pattern does <i>not</i> match "foo" preceded by six characters, the first
of which are digits and the last three of which are not "999". For example, it
doesn't match "123abcfoo". A pattern to do that is
<pre>
  (?&#60;=\d{3}...)(?&#60;!999)foo
</pre>
This time the first assertion looks at the preceding six characters, checking
that the first three are digits, and then the second assertion checks that the
preceding three characters are not "999".
</P>
<P>
Assertions can be nested in any combination. For example,
<pre>
  (?&#60;=(?&#60;!foo)bar)baz
</pre>
matches an occurrence of "baz" that is preceded by "bar" which in turn is not
preceded by "foo", while
<pre>
  (?&#60;=\d{3}(?!999)...)foo
</pre>
is another pattern that matches "foo" preceded by three digits and any three
characters that are not "999".
<a name="conditions"></a></P>
<br><a name="SEC19" href="#TOC1">CONDITIONAL SUBPATTERNS</a><br>
<P>
It is possible to cause the matching process to obey a subpattern
conditionally or to choose between two alternative subpatterns, depending on
the result of an assertion, or whether a specific capturing subpattern has
already been matched. The two possible forms of conditional subpattern are:
<pre>
  (?(condition)yes-pattern)
  (?(condition)yes-pattern|no-pattern)
</pre>
If the condition is satisfied, the yes-pattern is used; otherwise the
no-pattern (if present) is used. If there are more than two alternatives in the
subpattern, a compile-time error occurs.
</P>
<P>
There are four kinds of condition: references to subpatterns, references to
recursion, a pseudo-condition called DEFINE, and assertions.
</P>
<br><b>
Checking for a used subpattern by number
</b><br>
<P>
If the text between the parentheses consists of a sequence of digits, the
condition is true if a capturing subpattern of that number has previously
matched. If there is more than one capturing subpattern with the same number
(see the earlier
<a href="#recursion">section about duplicate subpattern numbers),</a>
the condition is true if any of them have been set. An alternative notation is
to precede the digits with a plus or minus sign. In this case, the subpattern
number is relative rather than absolute. The most recently opened parentheses
can be referenced by (?(-1), the next most recent by (?(-2), and so on. In
looping constructs it can also make sense to refer to subsequent groups with
constructs such as (?(+2).
</P>
<P>
Consider the following pattern, which contains non-significant white space to
make it more readable (assume the PCRE_EXTENDED option) and to divide it into
three parts for ease of discussion:
<pre>
  ( \( )?    [^()]+    (?(1) \) )
</pre>
The first part matches an optional opening parenthesis, and if that
character is present, sets it as the first captured substring. The second part
matches one or more characters that are not parentheses. The third part is a
conditional subpattern that tests whether the first set of parentheses matched
or not. If they did, that is, if subject started with an opening parenthesis,
the condition is true, and so the yes-pattern is executed and a closing
parenthesis is required. Otherwise, since no-pattern is not present, the
subpattern matches nothing. In other words, this pattern matches a sequence of
non-parentheses, optionally enclosed in parentheses.
</P>
<P>
If you were embedding this pattern in a larger one, you could use a relative
reference:
<pre>
  ...other stuff... ( \( )?    [^()]+    (?(-1) \) ) ...
</pre>
This makes the fragment independent of the parentheses in the larger pattern.
</P>
<br><b>
Checking for a used subpattern by name
</b><br>
<P>
Perl uses the syntax (?(&#60;name&#62;)...) or (?('name')...) to test for a used
subpattern by name. For compatibility with earlier versions of PCRE, which had
this facility before Perl, the syntax (?(name)...) is also recognized. However,
there is a possible ambiguity with this syntax, because subpattern names may
consist entirely of digits. PCRE looks first for a named subpattern; if it
cannot find one and the name consists entirely of digits, PCRE looks for a
subpattern of that number, which must be greater than zero. Using subpattern
names that consist entirely of digits is not recommended.
</P>
<P>
Rewriting the above example to use a named subpattern gives this:
<pre>
  (?&#60;OPEN&#62; \( )?    [^()]+    (?(&#60;OPEN&#62;) \) )
</pre>
If the name used in a condition of this kind is a duplicate, the test is
applied to all subpatterns of the same name, and is true if any one of them has
matched.
</P>
<br><b>
Checking for pattern recursion
</b><br>
<P>
If the condition is the string (R), and there is no subpattern with the name R,
the condition is true if a recursive call to the whole pattern or any
subpattern has been made. If digits or a name preceded by ampersand follow the
letter R, for example:
<pre>
  (?(R3)...) or (?(R&name)...)
</pre>
the condition is true if the most recent recursion is into a subpattern whose
number or name is given. This condition does not check the entire recursion
stack. If the name used in a condition of this kind is a duplicate, the test is
applied to all subpatterns of the same name, and is true if any one of them is
the most recent recursion.
</P>
<P>
At "top level", all these recursion test conditions are false.
<a href="#recursion">The syntax for recursive patterns</a>
is described below.
</P>
<br><b>
Defining subpatterns for use by reference only
</b><br>
<P>
If the condition is the string (DEFINE), and there is no subpattern with the
name DEFINE, the condition is always false. In this case, there may be only one
alternative in the subpattern. It is always skipped if control reaches this
point in the pattern; the idea of DEFINE is that it can be used to define
"subroutines" that can be referenced from elsewhere. (The use of
<a href="#subpatternsassubroutines">"subroutines"</a>
is described below.) For example, a pattern to match an IPv4 address could be
written like this (ignore whitespace and line breaks):
<pre>
  (?(DEFINE) (?&#60;byte&#62; 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) )
  \b (?&byte) (\.(?&byte)){3} \b
</pre>
The first part of the pattern is a DEFINE group inside which a another group
named "byte" is defined. This matches an individual component of an IPv4
address (a number less than 256). When matching takes place, this part of the
pattern is skipped because DEFINE acts like a false condition. The rest of the
pattern uses references to the named group to match the four dot-separated
components of an IPv4 address, insisting on a word boundary at each end.
</P>
<br><b>
Assertion conditions
</b><br>
<P>
If the condition is not in any of the above formats, it must be an assertion.
This may be a positive or negative lookahead or lookbehind assertion. Consider
this pattern, again containing non-significant white space, and with the two
alternatives on the second line:
<pre>
  (?(?=[^a-z]*[a-z])
  \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )
</pre>
The condition is a positive lookahead assertion that matches an optional
sequence of non-letters followed by a letter. In other words, it tests for the
presence of at least one letter in the subject. If a letter is found, the
subject is matched against the first alternative; otherwise it is matched
against the second. This pattern matches strings in one of the two forms
dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits.
<a name="comments"></a></P>
<br><a name="SEC20" href="#TOC1">COMMENTS</a><br>
<P>
The sequence (?# marks the start of a comment that continues up to the next
closing parenthesis. Nested parentheses are not permitted. The characters
that make up a comment play no part in the pattern matching at all.
</P>
<P>
If the PCRE_EXTENDED option is set, an unescaped # character outside a
character class introduces a comment that continues to immediately after the
next newline in the pattern.
<a name="recursion"></a></P>
<br><a name="SEC21" href="#TOC1">RECURSIVE PATTERNS</a><br>
<P>
Consider the problem of matching a string in parentheses, allowing for
unlimited nested parentheses. Without the use of recursion, the best that can
be done is to use a pattern that matches up to some fixed depth of nesting. It
is not possible to handle an arbitrary nesting depth.
</P>
<P>
For some time, Perl has provided a facility that allows regular expressions to
recurse (amongst other things). It does this by interpolating Perl code in the
expression at run time, and the code can refer to the expression itself. A Perl
pattern using code interpolation to solve the parentheses problem can be
created like this:
<pre>
  $re = qr{\( (?: (?&#62;[^()]+) | (?p{$re}) )* \)}x;
</pre>
The (?p{...}) item interpolates Perl code at run time, and in this case refers
recursively to the pattern in which it appears.
</P>
<P>
Obviously, PCRE cannot support the interpolation of Perl code. Instead, it
supports special syntax for recursion of the entire pattern, and also for
individual subpattern recursion. After its introduction in PCRE and Python,
this kind of recursion was subsequently introduced into Perl at release 5.10.
</P>
<P>
A special item that consists of (? followed by a number greater than zero and a
closing parenthesis is a recursive call of the subpattern of the given number,
provided that it occurs inside that subpattern. (If not, it is a
<a href="#subpatternsassubroutines">"subroutine"</a>
call, which is described in the next section.) The special item (?R) or (?0) is
a recursive call of the entire regular expression.
</P>
<P>
This PCRE pattern solves the nested parentheses problem (assume the
PCRE_EXTENDED option is set so that white space is ignored):
<pre>
  \( ( [^()]++ | (?R) )* \)
</pre>
First it matches an opening parenthesis. Then it matches any number of
substrings which can either be a sequence of non-parentheses, or a recursive
match of the pattern itself (that is, a correctly parenthesized substring).
Finally there is a closing parenthesis. Note the use of a possessive quantifier
to avoid backtracking into sequences of non-parentheses.
</P>
<P>
If this were part of a larger pattern, you would not want to recurse the entire
pattern, so instead you could use this:
<pre>
  ( \( ( [^()]++ | (?1) )* \) )
</pre>
We have put the pattern into parentheses, and caused the recursion to refer to
them instead of the whole pattern.
</P>
<P>
In a larger pattern, keeping track of parenthesis numbers can be tricky. This
is made easier by the use of relative references (a Perl 5.10 feature).
Instead of (?1) in the pattern above you can write (?-2) to refer to the second
most recently opened parentheses preceding the recursion. In other words, a
negative number counts capturing parentheses leftwards from the point at which
it is encountered.
</P>
<P>
It is also possible to refer to subsequently opened parentheses, by writing
references such as (?+2). However, these cannot be recursive because the
reference is not inside the parentheses that are referenced. They are always
<a href="#subpatternsassubroutines">"subroutine"</a>
calls, as described in the next section.
</P>
<P>
An alternative approach is to use named parentheses instead. The Perl syntax
for this is (?&name); PCRE's earlier syntax (?P&#62;name) is also supported. We
could rewrite the above example as follows:
<pre>
  (?&#60;pn&#62; \( ( [^()]++ | (?&pn) )* \) )
</pre>
If there is more than one subpattern with the same name, the earliest one is
used.
</P>
<P>
This particular example pattern that we have been looking at contains nested
unlimited repeats, and so the use of a possessive quantifier for matching
strings of non-parentheses is important when applying the pattern to strings
that do not match. For example, when this pattern is applied to
<pre>
  (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
</pre>
it yields "no match" quickly. However, if a possessive quantifier is not used,
the match runs for a very long time indeed because there are so many different
ways the + and * repeats can carve up the subject, and all have to be tested
before failure can be reported.
</P>
<P>
At the end of a match, the values of capturing parentheses are those from
the outermost level. If you want to obtain intermediate values, a callout
function can be used (see below and the
<a href="pcrecallout.html"><b>pcrecallout</b></a>
documentation). If the pattern above is matched against
<pre>
  (ab(cd)ef)
</pre>
the value for the inner capturing parentheses (numbered 2) is "ef", which is
the last value taken on at the top level. If a capturing subpattern is not
matched at the top level, its final value is unset, even if it is (temporarily)
set at a deeper level.
</P>
<P>
If there are more than 15 capturing parentheses in a pattern, PCRE has to
obtain extra memory to store data during a recursion, which it does by using
<b>pcre_malloc</b>, freeing it via <b>pcre_free</b> afterwards. If no memory can
be obtained, the match fails with the PCRE_ERROR_NOMEMORY error.
</P>
<P>
Do not confuse the (?R) item with the condition (R), which tests for recursion.
Consider this pattern, which matches text in angle brackets, allowing for
arbitrary nesting. Only digits are allowed in nested brackets (that is, when
recursing), whereas any characters are permitted at the outer level.
<pre>
  &#60; (?: (?(R) \d++  | [^&#60;&#62;]*+) | (?R)) * &#62;
</pre>
In this pattern, (?(R) is the start of a conditional subpattern, with two
different alternatives for the recursive and non-recursive cases. The (?R) item
is the actual recursive call.
<a name="recursiondifference"></a></P>
<br><b>
Recursion difference from Perl
</b><br>
<P>
In PCRE (like Python, but unlike Perl), a recursive subpattern call is always
treated as an atomic group. That is, once it has matched some of the subject
string, it is never re-entered, even if it contains untried alternatives and
there is a subsequent matching failure. This can be illustrated by the
following pattern, which purports to match a palindromic string that contains
an odd number of characters (for example, "a", "aba", "abcba", "abcdcba"):
<pre>
  ^(.|(.)(?1)\2)$
</pre>
The idea is that it either matches a single character, or two identical
characters surrounding a sub-palindrome. In Perl, this pattern works; in PCRE
it does not if the pattern is longer than three characters. Consider the
subject string "abcba":
</P>
<P>
At the top level, the first character is matched, but as it is not at the end
of the string, the first alternative fails; the second alternative is taken
and the recursion kicks in. The recursive call to subpattern 1 successfully
matches the next character ("b"). (Note that the beginning and end of line
tests are not part of the recursion).
</P>
<P>
Back at the top level, the next character ("c") is compared with what
subpattern 2 matched, which was "a". This fails. Because the recursion is
treated as an atomic group, there are now no backtracking points, and so the
entire match fails. (Perl is able, at this point, to re-enter the recursion and
try the second alternative.) However, if the pattern is written with the
alternatives in the other order, things are different:
<pre>
  ^((.)(?1)\2|.)$
</pre>
This time, the recursing alternative is tried first, and continues to recurse
until it runs out of characters, at which point the recursion fails. But this
time we do have another alternative to try at the higher level. That is the big
difference: in the previous case the remaining alternative is at a deeper
recursion level, which PCRE cannot use.
</P>
<P>
To change the pattern so that matches all palindromic strings, not just those
with an odd number of characters, it is tempting to change the pattern to this:
<pre>
  ^((.)(?1)\2|.?)$
</pre>
Again, this works in Perl, but not in PCRE, and for the same reason. When a
deeper recursion has matched a single character, it cannot be entered again in
order to match an empty string. The solution is to separate the two cases, and
write out the odd and even cases as alternatives at the higher level:
<pre>
  ^(?:((.)(?1)\2|)|((.)(?3)\4|.))
</pre>
If you want to match typical palindromic phrases, the pattern has to ignore all
non-word characters, which can be done like this:
<pre>
  ^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$
</pre>
If run with the PCRE_CASELESS option, this pattern matches phrases such as "A
man, a plan, a canal: Panama!" and it works well in both PCRE and Perl. Note
the use of the possessive quantifier *+ to avoid backtracking into sequences of
non-word characters. Without this, PCRE takes a great deal longer (ten times or
more) to match typical phrases, and Perl takes so long that you think it has
gone into a loop.
</P>
<P>
<b>WARNING</b>: The palindrome-matching patterns above work only if the subject
string does not start with a palindrome that is shorter than the entire string.
For example, although "abcba" is correctly matched, if the subject is "ababa",
PCRE finds the palindrome "aba" at the start, then fails at top level because
the end of the string does not follow. Once again, it cannot jump back into the
recursion to try other alternatives, so the entire match fails.
<a name="subpatternsassubroutines"></a></P>
<br><a name="SEC22" href="#TOC1">SUBPATTERNS AS SUBROUTINES</a><br>
<P>
If the syntax for a recursive subpattern reference (either by number or by
name) is used outside the parentheses to which it refers, it operates like a
subroutine in a programming language. The "called" subpattern may be defined
before or after the reference. A numbered reference can be absolute or
relative, as in these examples:
<pre>
  (...(absolute)...)...(?2)...
  (...(relative)...)...(?-1)...
  (...(?+1)...(relative)...
</pre>
An earlier example pointed out that the pattern
<pre>
  (sens|respons)e and \1ibility
</pre>
matches "sense and sensibility" and "response and responsibility", but not
"sense and responsibility". If instead the pattern
<pre>
  (sens|respons)e and (?1)ibility
</pre>
is used, it does match "sense and responsibility" as well as the other two
strings. Another example is given in the discussion of DEFINE above.
</P>
<P>
Like recursive subpatterns, a subroutine call is always treated as an atomic
group. That is, once it has matched some of the subject string, it is never
re-entered, even if it contains untried alternatives and there is a subsequent
matching failure. Any capturing parentheses that are set during the subroutine
call revert to their previous values afterwards.
</P>
<P>
When a subpattern is used as a subroutine, processing options such as
case-independence are fixed when the subpattern is defined. They cannot be
changed for different calls. For example, consider this pattern:
<pre>
  (abc)(?i:(?-1))
</pre>
It matches "abcabc". It does not match "abcABC" because the change of
processing option does not affect the called subpattern.
<a name="onigurumasubroutines"></a></P>
<br><a name="SEC23" href="#TOC1">ONIGURUMA SUBROUTINE SYNTAX</a><br>
<P>
For compatibility with Oniguruma, the non-Perl syntax \g followed by a name or
a number enclosed either in angle brackets or single quotes, is an alternative
syntax for referencing a subpattern as a subroutine, possibly recursively. Here
are two of the examples used above, rewritten using this syntax:
<pre>
  (?&#60;pn&#62; \( ( (?&#62;[^()]+) | \g&#60;pn&#62; )* \) )
  (sens|respons)e and \g'1'ibility
</pre>
PCRE supports an extension to Oniguruma: if a number is preceded by a
plus or a minus sign it is taken as a relative reference. For example:
<pre>
  (abc)(?i:\g&#60;-1&#62;)
</pre>
Note that \g{...} (Perl syntax) and \g&#60;...&#62; (Oniguruma syntax) are <i>not</i>
synonymous. The former is a back reference; the latter is a subroutine call.
</P>
<br><a name="SEC24" href="#TOC1">CALLOUTS</a><br>
<P>
Perl has a feature whereby using the sequence (?{...}) causes arbitrary Perl
code to be obeyed in the middle of matching a regular expression. This makes it
possible, amongst other things, to extract different substrings that match the
same pair of parentheses when there is a repetition.
</P>
<P>
PCRE provides a similar feature, but of course it cannot obey arbitrary Perl
code. The feature is called "callout". The caller of PCRE provides an external
function by putting its entry point in the global variable <i>pcre_callout</i>.
By default, this variable contains NULL, which disables all calling out.
</P>
<P>
Within a regular expression, (?C) indicates the points at which the external
function is to be called. If you want to identify different callout points, you
can put a number less than 256 after the letter C. The default value is zero.
For example, this pattern has two callout points:
<pre>
  (?C1)abc(?C2)def
</pre>
If the PCRE_AUTO_CALLOUT flag is passed to <b>pcre_compile()</b>, callouts are
automatically installed before each item in the pattern. They are all numbered
255.
</P>
<P>
During matching, when PCRE reaches a callout point (and <i>pcre_callout</i> is
set), the external function is called. It is provided with the number of the
callout, the position in the pattern, and, optionally, one item of data
originally supplied by the caller of <b>pcre_exec()</b>. The callout function
may cause matching to proceed, to backtrack, or to fail altogether. A complete
description of the interface to the callout function is given in the
<a href="pcrecallout.html"><b>pcrecallout</b></a>
documentation.
</P>
<br><a name="SEC25" href="#TOC1">BACKTRACKING CONTROL</a><br>
<P>
Perl 5.10 introduced a number of "Special Backtracking Control Verbs", which
are described in the Perl documentation as "experimental and subject to change
or removal in a future version of Perl". It goes on to say: "Their usage in
production code should be noted to avoid problems during upgrades." The same
remarks apply to the PCRE features described in this section.
</P>
<P>
Since these verbs are specifically related to backtracking, most of them can be
used only when the pattern is to be matched using <b>pcre_exec()</b>, which uses
a backtracking algorithm. With the exception of (*FAIL), which behaves like a
failing negative assertion, they cause an error if encountered by
<b>pcre_dfa_exec()</b>.
</P>
<P>
If any of these verbs are used in an assertion or subroutine subpattern
(including recursive subpatterns), their effect is confined to that subpattern;
it does not extend to the surrounding pattern. Note that such subpatterns are
processed as anchored at the point where they are tested.
</P>
<P>
The new verbs make use of what was previously invalid syntax: an opening
parenthesis followed by an asterisk. In Perl, they are generally of the form
(*VERB:ARG) but PCRE does not support the use of arguments, so its general
form is just (*VERB). Any number of these verbs may occur in a pattern. There
are two kinds:
</P>
<br><b>
Verbs that act immediately
</b><br>
<P>
The following verbs act as soon as they are encountered:
<pre>
   (*ACCEPT)
</pre>
This verb causes the match to end successfully, skipping the remainder of the
pattern. When inside a recursion, only the innermost pattern is ended
immediately. If (*ACCEPT) is inside capturing parentheses, the data so far is
captured. (This feature was added to PCRE at release 8.00.) For example:
<pre>
  A((?:A|B(*ACCEPT)|C)D)
</pre>
This matches "AB", "AAD", or "ACD"; when it matches "AB", "B" is captured by
the outer parentheses.
<pre>
  (*FAIL) or (*F)
</pre>
This verb causes the match to fail, forcing backtracking to occur. It is
equivalent to (?!) but easier to read. The Perl documentation notes that it is
probably useful only when combined with (?{}) or (??{}). Those are, of course,
Perl features that are not present in PCRE. The nearest equivalent is the
callout feature, as for example in this pattern:
<pre>
  a+(?C)(*FAIL)
</pre>
A match with the string "aaaa" always fails, but the callout is taken before
each backtrack happens (in this example, 10 times).
</P>
<br><b>
Verbs that act after backtracking
</b><br>
<P>
The following verbs do nothing when they are encountered. Matching continues
with what follows, but if there is no subsequent match, a failure is forced.
The verbs differ in exactly what kind of failure occurs.
<pre>
  (*COMMIT)
</pre>
This verb causes the whole match to fail outright if the rest of the pattern
does not match. Even if the pattern is unanchored, no further attempts to find
a match by advancing the starting point take place. Once (*COMMIT) has been
passed, <b>pcre_exec()</b> is committed to finding a match at the current
starting point, or not at all. For example:
<pre>
  a+(*COMMIT)b
</pre>
This matches "xxaab" but not "aacaab". It can be thought of as a kind of
dynamic anchor, or "I've started, so I must finish."
<pre>
  (*PRUNE)
</pre>
This verb causes the match to fail at the current position if the rest of the
pattern does not match. If the pattern is unanchored, the normal "bumpalong"
advance to the next starting character then happens. Backtracking can occur as
usual to the left of (*PRUNE), or when matching to the right of (*PRUNE), but
if there is no match to the right, backtracking cannot cross (*PRUNE).
In simple cases, the use of (*PRUNE) is just an alternative to an atomic
group or possessive quantifier, but there are some uses of (*PRUNE) that cannot
be expressed in any other way.
<pre>
  (*SKIP)
</pre>
This verb is like (*PRUNE), except that if the pattern is unanchored, the
"bumpalong" advance is not to the next character, but to the position in the
subject where (*SKIP) was encountered. (*SKIP) signifies that whatever text
was matched leading up to it cannot be part of a successful match. Consider:
<pre>
  a+(*SKIP)b
</pre>
If the subject is "aaaac...", after the first match attempt fails (starting at
the first character in the string), the starting point skips on to start the
next attempt at "c". Note that a possessive quantifer does not have the same
effect as this example; although it would suppress backtracking during the
first match attempt, the second attempt would start at the second character
instead of skipping on to "c".
<pre>
  (*THEN)
</pre>
This verb causes a skip to the next alternation if the rest of the pattern does
not match. That is, it cancels pending backtracking, but only within the
current alternation. Its name comes from the observation that it can be used
for a pattern-based if-then-else block:
<pre>
  ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ...
</pre>
If the COND1 pattern matches, FOO is tried (and possibly further items after
the end of the group if FOO succeeds); on failure the matcher skips to the
second alternative and tries COND2, without backtracking into COND1. If (*THEN)
is used outside of any alternation, it acts exactly like (*PRUNE).
</P>
<br><a name="SEC26" href="#TOC1">SEE ALSO</a><br>
<P>
<b>pcreapi</b>(3), <b>pcrecallout</b>(3), <b>pcrematching</b>(3),
<b>pcresyntax</b>(3), <b>pcre</b>(3).
</P>
<br><a name="SEC27" href="#TOC1">AUTHOR</a><br>
<P>
Philip Hazel
<br>
University Computing Service
<br>
Cambridge CB2 3QH, England.
<br>
</P>
<br><a name="SEC28" href="#TOC1">REVISION</a><br>
<P>
Last updated: 06 March 2010
<br>
Copyright &copy; 1997-2010 University of Cambridge.
<br>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[.�mm+doc/alt-pcre802-devel/html/pcreperform.htmlnu�[���<html>
<head>
<title>pcreperform specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcreperform man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
PCRE PERFORMANCE
</b><br>
<P>
Two aspects of performance are discussed below: memory usage and processing
time. The way you express your pattern as a regular expression can affect both
of them.
</P>
<br><b>
COMPILED PATTERN MEMORY USAGE
</b><br>
<P>
Patterns are compiled by PCRE into a reasonably efficient byte code, so that
most simple patterns do not use much memory. However, there is one case where
the memory usage of a compiled pattern can be unexpectedly large. If a
parenthesized subpattern has a quantifier with a minimum greater than 1 and/or
a limited maximum, the whole subpattern is repeated in the compiled code. For
example, the pattern
<pre>
  (abc|def){2,4}
</pre>
is compiled as if it were
<pre>
  (abc|def)(abc|def)((abc|def)(abc|def)?)?
</pre>
(Technical aside: It is done this way so that backtrack points within each of
the repetitions can be independently maintained.)
</P>
<P>
For regular expressions whose quantifiers use only small numbers, this is not
usually a problem. However, if the numbers are large, and particularly if such
repetitions are nested, the memory usage can become an embarrassment. For
example, the very simple pattern
<pre>
  ((ab){1,1000}c){1,3}
</pre>
uses 51K bytes when compiled. When PCRE is compiled with its default internal
pointer size of two bytes, the size limit on a compiled pattern is 64K, and
this is reached with the above pattern if the outer repetition is increased
from 3 to 4. PCRE can be compiled to use larger internal pointers and thus
handle larger compiled patterns, but it is better to try to rewrite your
pattern to use less memory if you can.
</P>
<P>
One way of reducing the memory usage for such patterns is to make use of PCRE's
<a href="pcrepattern.html#subpatternsassubroutines">"subroutine"</a>
facility. Re-writing the above pattern as
<pre>
  ((ab)(?2){0,999}c)(?1){0,2}
</pre>
reduces the memory requirements to 18K, and indeed it remains under 20K even
with the outer repetition increased to 100. However, this pattern is not
exactly equivalent, because the "subroutine" calls are treated as
<a href="pcrepattern.html#atomicgroup">atomic groups</a>
into which there can be no backtracking if there is a subsequent matching
failure. Therefore, PCRE cannot do this kind of rewriting automatically.
Furthermore, there is a noticeable loss of speed when executing the modified
pattern. Nevertheless, if the atomic grouping is not a problem and the loss of
speed is acceptable, this kind of rewriting will allow you to process patterns
that PCRE cannot otherwise handle.
</P>
<br><b>
STACK USAGE AT RUN TIME
</b><br>
<P>
When <b>pcre_exec()</b> is used for matching, certain kinds of pattern can cause
it to use large amounts of the process stack. In some environments the default
process stack is quite small, and if it runs out the result is often SIGSEGV.
This issue is probably the most frequently raised problem with PCRE. Rewriting
your pattern can often help. The
<a href="pcrestack.html"><b>pcrestack</b></a>
documentation discusses this issue in detail.
</P>
<br><b>
PROCESSING TIME
</b><br>
<P>
Certain items in regular expression patterns are processed more efficiently
than others. It is more efficient to use a character class like [aeiou] than a
set of single-character alternatives such as (a|e|i|o|u). In general, the
simplest construction that provides the required behaviour is usually the most
efficient. Jeffrey Friedl's book contains a lot of useful general discussion
about optimizing regular expressions for efficient performance. This document
contains a few observations about PCRE.
</P>
<P>
Using Unicode character properties (the \p, \P, and \X escapes) is slow,
because PCRE has to scan a structure that contains data for over fifteen
thousand characters whenever it needs a character's property. If you can find
an alternative pattern that does not use character properties, it will probably
be faster.
</P>
<P>
When a pattern begins with .* not in parentheses, or in parentheses that are
not the subject of a backreference, and the PCRE_DOTALL option is set, the
pattern is implicitly anchored by PCRE, since it can match only at the start of
a subject string. However, if PCRE_DOTALL is not set, PCRE cannot make this
optimization, because the . metacharacter does not then match a newline, and if
the subject string contains newlines, the pattern may match from the character
immediately following one of them instead of from the very start. For example,
the pattern
<pre>
  .*second
</pre>
matches the subject "first\nand second" (where \n stands for a newline
character), with the match starting at the seventh character. In order to do
this, PCRE has to retry the match starting after every newline in the subject.
</P>
<P>
If you are using such a pattern with subject strings that do not contain
newlines, the best performance is obtained by setting PCRE_DOTALL, or starting
the pattern with ^.* or ^.*? to indicate explicit anchoring. That saves PCRE
from having to scan along the subject looking for a newline to restart at.
</P>
<P>
Beware of patterns that contain nested indefinite repeats. These can take a
long time to run when applied to a string that does not match. Consider the
pattern fragment
<pre>
  ^(a+)*
</pre>
This can match "aaaa" in 16 different ways, and this number increases very
rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4
times, and for each of those cases other than 0 or 4, the + repeats can match
different numbers of times.) When the remainder of the pattern is such that the
entire match is going to fail, PCRE has in principle to try every possible
variation, and this can take an extremely long time, even for relatively short
strings.
</P>
<P>
An optimization catches some of the more simple cases such as
<pre>
  (a+)*b
</pre>
where a literal character follows. Before embarking on the standard matching
procedure, PCRE checks that there is a "b" later in the subject string, and if
there is not, it fails the match immediately. However, when there is no
following literal this optimization cannot be used. You can see the difference
by comparing the behaviour of
<pre>
  (a+)*\d
</pre>
with the pattern above. The former gives a failure almost instantly when
applied to a whole line of "a" characters, whereas the latter takes an
appreciable time with strings longer than about 20 characters.
</P>
<P>
In many cases, the solution to this kind of performance issue is to use an
atomic group or a possessive quantifier.
</P>
<br><b>
AUTHOR
</b><br>
<P>
Philip Hazel
<br>
University Computing Service
<br>
Cambridge CB2 3QH, England.
<br>
</P>
<br><b>
REVISION
</b><br>
<P>
Last updated: 07 March 2010
<br>
Copyright &copy; 1997-2010 University of Cambridge.
<br>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[P�T�+doc/alt-pcre802-devel/html/pcre-config.htmlnu�[���<html>
<head>
<title>pcre-config specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre-config man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<ul>
<li><a name="TOC1" href="#SEC1">SYNOPSIS</a>
<li><a name="TOC2" href="#SEC2">DESCRIPTION</a>
<li><a name="TOC3" href="#SEC3">OPTIONS</a>
<li><a name="TOC4" href="#SEC4">SEE ALSO</a>
<li><a name="TOC5" href="#SEC5">AUTHOR</a>
<li><a name="TOC6" href="#SEC6">REVISION</a>
</ul>
<br><a name="SEC1" href="#TOC1">SYNOPSIS</a><br>
<P>
<b>pcre-config  [--prefix] [--exec-prefix] [--version] [--libs]</b>
<b>[--libs-posix] [--cflags] [--cflags-posix]</b>
</P>
<br><a name="SEC2" href="#TOC1">DESCRIPTION</a><br>
<P>
<b>pcre-config</b> returns the configuration of the installed PCRE
libraries and the options required to compile a program to use them.
</P>
<br><a name="SEC3" href="#TOC1">OPTIONS</a><br>
<P>
<b>--prefix</b>
Writes the directory prefix used in the PCRE installation for architecture
independent files (<i>/usr</i> on many systems, <i>/usr/local</i> on some
systems) to the standard output.
</P>
<P>
<b>--exec-prefix</b>
Writes the directory prefix used in the PCRE installation for architecture
dependent files (normally the same as <b>--prefix</b>) to the standard output.
</P>
<P>
<b>--version</b>
Writes the version number of the installed PCRE libraries to the standard
output.
</P>
<P>
<b>--libs</b>
Writes to the standard output the command line options required to link
with PCRE (<b>-lpcre</b> on many systems).
</P>
<P>
<b>--libs-posix</b>
Writes to the standard output the command line options required to link with
the PCRE posix emulation library (<b>-lpcreposix</b> <b>-lpcre</b> on many
systems).
</P>
<P>
<b>--cflags</b>
Writes to the standard output the command line options required to compile
files that use PCRE (this may include some <b>-I</b> options, but is blank on
many systems).
</P>
<P>
<b>--cflags-posix</b>
Writes to the standard output the command line options required to compile
files that use the PCRE posix emulation library (this may include some <b>-I</b>
options, but is blank on many systems).
</P>
<br><a name="SEC4" href="#TOC1">SEE ALSO</a><br>
<P>
<b>pcre(3)</b>
</P>
<br><a name="SEC5" href="#TOC1">AUTHOR</a><br>
<P>
This manual page was originally written by Mark Baker for the Debian GNU/Linux
system. It has been slightly revised as a generic PCRE man page.
</P>
<br><a name="SEC6" href="#TOC1">REVISION</a><br>
<P>
Last updated: 18 April 2007
<br>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[�&��.doc/alt-pcre802-devel/html/pcreprecompile.htmlnu�[���<html>
<head>
<title>pcreprecompile specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcreprecompile man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<ul>
<li><a name="TOC1" href="#SEC1">SAVING AND RE-USING PRECOMPILED PCRE PATTERNS</a>
<li><a name="TOC2" href="#SEC2">SAVING A COMPILED PATTERN</a>
<li><a name="TOC3" href="#SEC3">RE-USING A PRECOMPILED PATTERN</a>
<li><a name="TOC4" href="#SEC4">COMPATIBILITY WITH DIFFERENT PCRE RELEASES</a>
<li><a name="TOC5" href="#SEC5">AUTHOR</a>
<li><a name="TOC6" href="#SEC6">REVISION</a>
</ul>
<br><a name="SEC1" href="#TOC1">SAVING AND RE-USING PRECOMPILED PCRE PATTERNS</a><br>
<P>
If you are running an application that uses a large number of regular
expression patterns, it may be useful to store them in a precompiled form
instead of having to compile them every time the application is run.
If you are not using any private character tables (see the
<a href="pcre_maketables.html"><b>pcre_maketables()</b></a>
documentation), this is relatively straightforward. If you are using private
tables, it is a little bit more complicated.
</P>
<P>
If you save compiled patterns to a file, you can copy them to a different host
and run them there. This works even if the new host has the opposite endianness
to the one on which the patterns were compiled. There may be a small
performance penalty, but it should be insignificant. However, compiling regular
expressions with one version of PCRE for use with a different version is not
guaranteed to work and may cause crashes.
</P>
<br><a name="SEC2" href="#TOC1">SAVING A COMPILED PATTERN</a><br>
<P>
The value returned by <b>pcre_compile()</b> points to a single block of memory
that holds the compiled pattern and associated data. You can find the length of
this block in bytes by calling <b>pcre_fullinfo()</b> with an argument of
PCRE_INFO_SIZE. You can then save the data in any appropriate manner. Here is
sample code that compiles a pattern and writes it to a file. It assumes that
the variable <i>fd</i> refers to a file that is open for output:
<pre>
  int erroroffset, rc, size;
  char *error;
  pcre *re;

  re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL);
  if (re == NULL) { ... handle errors ... }
  rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size);
  if (rc &#60; 0) { ... handle errors ... }
  rc = fwrite(re, 1, size, fd);
  if (rc != size) { ... handle errors ... }
</pre>
In this example, the bytes that comprise the compiled pattern are copied
exactly. Note that this is binary data that may contain any of the 256 possible
byte values. On systems that make a distinction between binary and non-binary
data, be sure that the file is opened for binary output.
</P>
<P>
If you want to write more than one pattern to a file, you will have to devise a
way of separating them. For binary data, preceding each pattern with its length
is probably the most straightforward approach. Another possibility is to write
out the data in hexadecimal instead of binary, one pattern to a line.
</P>
<P>
Saving compiled patterns in a file is only one possible way of storing them for
later use. They could equally well be saved in a database, or in the memory of
some daemon process that passes them via sockets to the processes that want
them.
</P>
<P>
If the pattern has been studied, it is also possible to save the study data in
a similar way to the compiled pattern itself. When studying generates
additional information, <b>pcre_study()</b> returns a pointer to a
<b>pcre_extra</b> data block. Its format is defined in the
<a href="pcreapi.html#extradata">section on matching a pattern</a>
in the
<a href="pcreapi.html"><b>pcreapi</b></a>
documentation. The <i>study_data</i> field points to the binary study data, and
this is what you must save (not the <b>pcre_extra</b> block itself). The length
of the study data can be obtained by calling <b>pcre_fullinfo()</b> with an
argument of PCRE_INFO_STUDYSIZE. Remember to check that <b>pcre_study()</b> did
return a non-NULL value before trying to save the study data.
</P>
<br><a name="SEC3" href="#TOC1">RE-USING A PRECOMPILED PATTERN</a><br>
<P>
Re-using a precompiled pattern is straightforward. Having reloaded it into main
memory, you pass its pointer to <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b> in
the usual way. This should work even on another host, and even if that host has
the opposite endianness to the one where the pattern was compiled.
</P>
<P>
However, if you passed a pointer to custom character tables when the pattern
was compiled (the <i>tableptr</i> argument of <b>pcre_compile()</b>), you must
now pass a similar pointer to <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>,
because the value saved with the compiled pattern will obviously be nonsense. A
field in a <b>pcre_extra()</b> block is used to pass this data, as described in
the
<a href="pcreapi.html#extradata">section on matching a pattern</a>
in the
<a href="pcreapi.html"><b>pcreapi</b></a>
documentation.
</P>
<P>
If you did not provide custom character tables when the pattern was compiled,
the pointer in the compiled pattern is NULL, which causes <b>pcre_exec()</b> to
use PCRE's internal tables. Thus, you do not need to take any special action at
run time in this case.
</P>
<P>
If you saved study data with the compiled pattern, you need to create your own
<b>pcre_extra</b> data block and set the <i>study_data</i> field to point to the
reloaded study data. You must also set the PCRE_EXTRA_STUDY_DATA bit in the
<i>flags</i> field to indicate that study data is present. Then pass the
<b>pcre_extra</b> block to <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b> in the
usual way.
</P>
<br><a name="SEC4" href="#TOC1">COMPATIBILITY WITH DIFFERENT PCRE RELEASES</a><br>
<P>
In general, it is safest to recompile all saved patterns when you update to a
new PCRE release, though not all updates actually require this. Recompiling is
definitely needed for release 7.2.
</P>
<br><a name="SEC5" href="#TOC1">AUTHOR</a><br>
<P>
Philip Hazel
<br>
University Computing Service
<br>
Cambridge CB2 3QH, England.
<br>
</P>
<br><a name="SEC6" href="#TOC1">REVISION</a><br>
<P>
Last updated: 13 June 2007
<br>
Copyright &copy; 1997-2007 University of Cambridge.
<br>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[��((%doc/alt-pcre802-devel/html/index.htmlnu�[���<html>
<!-- This is a manually maintained file that is the root of the HTML version of
     the PCRE documentation. When the HTML documents are built from the man
     page versions, the entire doc/html directory is emptied, this file is then
     copied into doc/html/index.html, and the remaining files therein are
     created by the 132html script.
-->
<head>
<title>PCRE specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>Perl-compatible Regular Expressions (PCRE)</h1>
<p>
The HTML documentation for PCRE comprises the following pages:
</p>

<table>
<tr><td><a href="pcre.html">pcre</a></td>
    <td>&nbsp;&nbsp;Introductory page</td></tr>

<tr><td><a href="pcre-config.html">pcre-config</a></td>
    <td>&nbsp;&nbsp;Information about the installation configuration</td></tr>

<tr><td><a href="pcreapi.html">pcreapi</a></td>
    <td>&nbsp;&nbsp;PCRE's native API</td></tr>

<tr><td><a href="pcrebuild.html">pcrebuild</a></td>
    <td>&nbsp;&nbsp;Options for building PCRE</td></tr>

<tr><td><a href="pcrecallout.html">pcrecallout</a></td>
    <td>&nbsp;&nbsp;The <i>callout</i> facility</td></tr>

<tr><td><a href="pcrecompat.html">pcrecompat</a></td>
    <td>&nbsp;&nbsp;Compability with Perl</td></tr>

<tr><td><a href="pcrecpp.html">pcrecpp</a></td>
    <td>&nbsp;&nbsp;The C++ wrapper for the PCRE library</td></tr>

<tr><td><a href="pcredemo.html">pcredemo</a></td>
    <td>&nbsp;&nbsp;A demonstration C program that uses the PCRE library</td></tr>

<tr><td><a href="pcregrep.html">pcregrep</a></td>
    <td>&nbsp;&nbsp;The <b>pcregrep</b> command</td></tr>

<tr><td><a href="pcrematching.html">pcrematching</a></td>
    <td>&nbsp;&nbsp;Discussion of the two matching algorithms</td></tr>

<tr><td><a href="pcrepartial.html">pcrepartial</a></td>
    <td>&nbsp;&nbsp;Using PCRE for partial matching</td></tr>

<tr><td><a href="pcrepattern.html">pcrepattern</a></td>
    <td>&nbsp;&nbsp;Specification of the regular expressions supported by PCRE</td></tr>

<tr><td><a href="pcreperform.html">pcreperform</a></td>
    <td>&nbsp;&nbsp;Some comments on performance</td></tr>

<tr><td><a href="pcreposix.html">pcreposix</a></td>
    <td>&nbsp;&nbsp;The POSIX API to the PCRE library</td></tr>

<tr><td><a href="pcreprecompile.html">pcreprecompile</a></td>
    <td>&nbsp;&nbsp;How to save and re-use compiled patterns</td></tr>

<tr><td><a href="pcresample.html">pcresample</a></td>
    <td>&nbsp;&nbsp;Discussion of the pcredemo program</td></tr>

<tr><td><a href="pcrestack.html">pcrestack</a></td>
    <td>&nbsp;&nbsp;Discussion of PCRE's stack usage</td></tr>

<tr><td><a href="pcresyntax.html">pcresyntax</a></td>
    <td>&nbsp;&nbsp;Syntax quick-reference summary</td></tr>

<tr><td><a href="pcretest.html">pcretest</a></td>
    <td>&nbsp;&nbsp;The <b>pcretest</b> command for testing PCRE</td></tr>
</table>

<p>
There are also individual pages that summarize the interface for each function
in the library:
</p>

<table>

<tr><td><a href="pcre_compile.html">pcre_compile</a></td>
    <td>&nbsp;&nbsp;Compile a regular expression</td></tr>

<tr><td><a href="pcre_compile2.html">pcre_compile2</a></td>
    <td>&nbsp;&nbsp;Compile a regular expression (alternate interface)</td></tr>

<tr><td><a href="pcre_config.html">pcre_config</a></td>
    <td>&nbsp;&nbsp;Show build-time configuration options</td></tr>

<tr><td><a href="pcre_copy_named_substring.html">pcre_copy_named_substring</a></td>
    <td>&nbsp;&nbsp;Extract named substring into given buffer</td></tr>

<tr><td><a href="pcre_copy_substring.html">pcre_copy_substring</a></td>
    <td>&nbsp;&nbsp;Extract numbered substring into given buffer</td></tr>

<tr><td><a href="pcre_dfa_exec.html">pcre_dfa_exec</a></td>
    <td>&nbsp;&nbsp;Match a compiled pattern to a subject string
    (DFA algorithm; <i>not</i> Perl compatible)</td></tr>

<tr><td><a href="pcre_exec.html">pcre_exec</a></td>
    <td>&nbsp;&nbsp;Match a compiled pattern to a subject string
    (Perl compatible)</td></tr>

<tr><td><a href="pcre_free_substring.html">pcre_free_substring</a></td>
    <td>&nbsp;&nbsp;Free extracted substring</td></tr>

<tr><td><a href="pcre_free_substring_list.html">pcre_free_substring_list</a></td>
    <td>&nbsp;&nbsp;Free list of extracted substrings</td></tr>

<tr><td><a href="pcre_fullinfo.html">pcre_fullinfo</a></td>
    <td>&nbsp;&nbsp;Extract information about a pattern</td></tr>

<tr><td><a href="pcre_get_named_substring.html">pcre_get_named_substring</a></td>
    <td>&nbsp;&nbsp;Extract named substring into new memory</td></tr>

<tr><td><a href="pcre_get_stringnumber.html">pcre_get_stringnumber</a></td>
    <td>&nbsp;&nbsp;Convert captured string name to number</td></tr>

<tr><td><a href="pcre_get_substring.html">pcre_get_substring</a></td>
    <td>&nbsp;&nbsp;Extract numbered substring into new memory</td></tr>

<tr><td><a href="pcre_get_substring_list.html">pcre_get_substring_list</a></td>
    <td>&nbsp;&nbsp;Extract all substrings into new memory</td></tr>

<tr><td><a href="pcre_info.html">pcre_info</a></td>
    <td>&nbsp;&nbsp;Obsolete information extraction function</td></tr>

<tr><td><a href="pcre_maketables.html">pcre_maketables</a></td>
    <td>&nbsp;&nbsp;Build character tables in current locale</td></tr>

<tr><td><a href="pcre_refcount.html">pcre_refcount</a></td>
    <td>&nbsp;&nbsp;Maintain reference count in compiled pattern</td></tr>

<tr><td><a href="pcre_study.html">pcre_study</a></td>
    <td>&nbsp;&nbsp;Study a compiled pattern</td></tr>

<tr><td><a href="pcre_version.html">pcre_version</a></td>
    <td>&nbsp;&nbsp;Return PCRE version and release date</td></tr>
</table>

</html>
PK��$[��u��7�7'doc/alt-pcre802-devel/html/pcrecpp.htmlnu�[���<html>
<head>
<title>pcrecpp specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcrecpp man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<ul>
<li><a name="TOC1" href="#SEC1">SYNOPSIS OF C++ WRAPPER</a>
<li><a name="TOC2" href="#SEC2">DESCRIPTION</a>
<li><a name="TOC3" href="#SEC3">MATCHING INTERFACE</a>
<li><a name="TOC4" href="#SEC4">QUOTING METACHARACTERS</a>
<li><a name="TOC5" href="#SEC5">PARTIAL MATCHES</a>
<li><a name="TOC6" href="#SEC6">UTF-8 AND THE MATCHING INTERFACE</a>
<li><a name="TOC7" href="#SEC7">PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE</a>
<li><a name="TOC8" href="#SEC8">SCANNING TEXT INCREMENTALLY</a>
<li><a name="TOC9" href="#SEC9">PARSING HEX/OCTAL/C-RADIX NUMBERS</a>
<li><a name="TOC10" href="#SEC10">REPLACING PARTS OF STRINGS</a>
<li><a name="TOC11" href="#SEC11">AUTHOR</a>
<li><a name="TOC12" href="#SEC12">REVISION</a>
</ul>
<br><a name="SEC1" href="#TOC1">SYNOPSIS OF C++ WRAPPER</a><br>
<P>
<b>#include &#60;pcrecpp.h&#62;</b>
</P>
<br><a name="SEC2" href="#TOC1">DESCRIPTION</a><br>
<P>
The C++ wrapper for PCRE was provided by Google Inc. Some additional
functionality was added by Giuseppe Maxia. This brief man page was constructed
from the notes in the <i>pcrecpp.h</i> file, which should be consulted for
further details.
</P>
<br><a name="SEC3" href="#TOC1">MATCHING INTERFACE</a><br>
<P>
The "FullMatch" operation checks that supplied text matches a supplied pattern
exactly. If pointer arguments are supplied, it copies matched sub-strings that
match sub-patterns into them.
<pre>
  Example: successful match
     pcrecpp::RE re("h.*o");
     re.FullMatch("hello");

  Example: unsuccessful match (requires full match):
     pcrecpp::RE re("e");
     !re.FullMatch("hello");

  Example: creating a temporary RE object:
     pcrecpp::RE("h.*o").FullMatch("hello");
</pre>
You can pass in a "const char*" or a "string" for "text". The examples below
tend to use a const char*. You can, as in the different examples above, store
the RE object explicitly in a variable or use a temporary RE object. The
examples below use one mode or the other arbitrarily. Either could correctly be
used for any of these examples.
</P>
<P>
You must supply extra pointer arguments to extract matched subpieces.
<pre>
  Example: extracts "ruby" into "s" and 1234 into "i"
     int i;
     string s;
     pcrecpp::RE re("(\\w+):(\\d+)");
     re.FullMatch("ruby:1234", &s, &i);

  Example: does not try to extract any extra sub-patterns
     re.FullMatch("ruby:1234", &s);

  Example: does not try to extract into NULL
     re.FullMatch("ruby:1234", NULL, &i);

  Example: integer overflow causes failure
     !re.FullMatch("ruby:1234567891234", NULL, &i);

  Example: fails because there aren't enough sub-patterns:
     !pcrecpp::RE("\\w+:\\d+").FullMatch("ruby:1234", &s);

  Example: fails because string cannot be stored in integer
     !pcrecpp::RE("(.*)").FullMatch("ruby", &i);
</pre>
The provided pointer arguments can be pointers to any scalar numeric
type, or one of:
<pre>
   string        (matched piece is copied to string)
   StringPiece   (StringPiece is mutated to point to matched piece)
   T             (where "bool T::ParseFrom(const char*, int)" exists)
   NULL          (the corresponding matched sub-pattern is not copied)
</pre>
The function returns true iff all of the following conditions are satisfied:
<pre>
  a. "text" matches "pattern" exactly;

  b. The number of matched sub-patterns is &#62;= number of supplied
     pointers;

  c. The "i"th argument has a suitable type for holding the
     string captured as the "i"th sub-pattern. If you pass in
     void * NULL for the "i"th argument, or a non-void * NULL
     of the correct type, or pass fewer arguments than the
     number of sub-patterns, "i"th captured sub-pattern is
     ignored.
</pre>
CAVEAT: An optional sub-pattern that does not exist in the matched
string is assigned the empty string. Therefore, the following will
return false (because the empty string is not a valid number):
<pre>
   int number;
   pcrecpp::RE::FullMatch("abc", "[a-z]+(\\d+)?", &number);
</pre>
The matching interface supports at most 16 arguments per call.
If you need more, consider using the more general interface
<b>pcrecpp::RE::DoMatch</b>. See <b>pcrecpp.h</b> for the signature for
<b>DoMatch</b>.
</P>
<P>
NOTE: Do not use <b>no_arg</b>, which is used internally to mark the end of a
list of optional arguments, as a placeholder for missing arguments, as this can
lead to segfaults.
</P>
<br><a name="SEC4" href="#TOC1">QUOTING METACHARACTERS</a><br>
<P>
You can use the "QuoteMeta" operation to insert backslashes before all
potentially meaningful characters in a string. The returned string, used as a
regular expression, will exactly match the original string.
<pre>
  Example:
     string quoted = RE::QuoteMeta(unquoted);
</pre>
Note that it's legal to escape a character even if it has no special meaning in
a regular expression -- so this function does that. (This also makes it
identical to the perl function of the same name; see "perldoc -f quotemeta".)
For example, "1.5-2.0?" becomes "1\.5\-2\.0\?".
</P>
<br><a name="SEC5" href="#TOC1">PARTIAL MATCHES</a><br>
<P>
You can use the "PartialMatch" operation when you want the pattern
to match any substring of the text.
<pre>
  Example: simple search for a string:
     pcrecpp::RE("ell").PartialMatch("hello");

  Example: find first number in a string:
     int number;
     pcrecpp::RE re("(\\d+)");
     re.PartialMatch("x*100 + 20", &number);
     assert(number == 100);
</PRE>
</P>
<br><a name="SEC6" href="#TOC1">UTF-8 AND THE MATCHING INTERFACE</a><br>
<P>
By default, pattern and text are plain text, one byte per character. The UTF8
flag, passed to the constructor, causes both pattern and string to be treated
as UTF-8 text, still a byte stream but potentially multiple bytes per
character. In practice, the text is likelier to be UTF-8 than the pattern, but
the match returned may depend on the UTF8 flag, so always use it when matching
UTF8 text. For example, "." will match one byte normally but with UTF8 set may
match up to three bytes of a multi-byte character.
<pre>
  Example:
     pcrecpp::RE_Options options;
     options.set_utf8();
     pcrecpp::RE re(utf8_pattern, options);
     re.FullMatch(utf8_string);

  Example: using the convenience function UTF8():
     pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8());
     re.FullMatch(utf8_string);
</pre>
NOTE: The UTF8 flag is ignored if pcre was not configured with the
<pre>
      --enable-utf8 flag.
</PRE>
</P>
<br><a name="SEC7" href="#TOC1">PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE</a><br>
<P>
PCRE defines some modifiers to change the behavior of the regular expression
engine. The C++ wrapper defines an auxiliary class, RE_Options, as a vehicle to
pass such modifiers to a RE class. Currently, the following modifiers are
supported:
<pre>
   modifier              description               Perl corresponding

   PCRE_CASELESS         case insensitive match      /i
   PCRE_MULTILINE        multiple lines match        /m
   PCRE_DOTALL           dot matches newlines        /s
   PCRE_DOLLAR_ENDONLY   $ matches only at end       N/A
   PCRE_EXTRA            strict escape parsing       N/A
   PCRE_EXTENDED         ignore whitespaces          /x
   PCRE_UTF8             handles UTF8 chars          built-in
   PCRE_UNGREEDY         reverses * and *?           N/A
   PCRE_NO_AUTO_CAPTURE  disables capturing parens   N/A (*)
</pre>
(*) Both Perl and PCRE allow non capturing parentheses by means of the
"?:" modifier within the pattern itself. e.g. (?:ab|cd) does not
capture, while (ab|cd) does.
</P>
<P>
For a full account on how each modifier works, please check the
PCRE API reference page.
</P>
<P>
For each modifier, there are two member functions whose name is made
out of the modifier in lowercase, without the "PCRE_" prefix. For
instance, PCRE_CASELESS is handled by
<pre>
  bool caseless()
</pre>
which returns true if the modifier is set, and
<pre>
  RE_Options & set_caseless(bool)
</pre>
which sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can be
accessed through the <b>set_match_limit()</b> and <b>match_limit()</b> member
functions. Setting <i>match_limit</i> to a non-zero value will limit the
execution of pcre to keep it from doing bad things like blowing the stack or
taking an eternity to return a result. A value of 5000 is good enough to stop
stack blowup in a 2MB thread stack. Setting <i>match_limit</i> to zero disables
match limiting. Alternatively, you can call <b>match_limit_recursion()</b>
which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to limit how much PCRE
recurses. <b>match_limit()</b> limits the number of matches PCRE does;
<b>match_limit_recursion()</b> limits the depth of internal recursion, and
therefore the amount of stack that is used.
</P>
<P>
Normally, to pass one or more modifiers to a RE class, you declare
a <i>RE_Options</i> object, set the appropriate options, and pass this
object to a RE constructor. Example:
<pre>
   RE_options opt;
   opt.set_caseless(true);
   if (RE("HELLO", opt).PartialMatch("hello world")) ...
</pre>
RE_options has two constructors. The default constructor takes no arguments and
creates a set of flags that are off by default. The optional parameter
<i>option_flags</i> is to facilitate transfer of legacy code from C programs.
This lets you do
<pre>
   RE(pattern,
     RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str);
</pre>
However, new code is better off doing
<pre>
   RE(pattern,
     RE_Options().set_caseless(true).set_multiline(true))
       .PartialMatch(str);
</pre>
If you are going to pass one of the most used modifiers, there are some
convenience functions that return a RE_Options class with the
appropriate modifier already set: <b>CASELESS()</b>, <b>UTF8()</b>,
<b>MULTILINE()</b>, <b>DOTALL</b>(), and <b>EXTENDED()</b>.
</P>
<P>
If you need to set several options at once, and you don't want to go through
the pains of declaring a RE_Options object and setting several options, there
is a parallel method that give you such ability on the fly. You can concatenate
several <b>set_xxxxx()</b> member functions, since each of them returns a
reference to its class object. For example, to pass PCRE_CASELESS,
PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one statement, you may write:
<pre>
   RE(" ^ xyz \\s+ .* blah$",
     RE_Options()
       .set_caseless(true)
       .set_extended(true)
       .set_multiline(true)).PartialMatch(sometext);

</PRE>
</P>
<br><a name="SEC8" href="#TOC1">SCANNING TEXT INCREMENTALLY</a><br>
<P>
The "Consume" operation may be useful if you want to repeatedly
match regular expressions at the front of a string and skip over
them as they match. This requires use of the "StringPiece" type,
which represents a sub-range of a real string. Like RE, StringPiece
is defined in the pcrecpp namespace.
<pre>
  Example: read lines of the form "var = value" from a string.
     string contents = ...;                 // Fill string somehow
     pcrecpp::StringPiece input(contents);  // Wrap in a StringPiece
</PRE>
</P>
<P>
<pre>
     string var;
     int value;
     pcrecpp::RE re("(\\w+) = (\\d+)\n");
     while (re.Consume(&input, &var, &value)) {
       ...;
     }
</pre>
Each successful call to "Consume" will set "var/value", and also
advance "input" so it points past the matched text.
</P>
<P>
The "FindAndConsume" operation is similar to "Consume" but does not
anchor your match at the beginning of the string. For example, you
could extract all words from a string by repeatedly calling
<pre>
  pcrecpp::RE("(\\w+)").FindAndConsume(&input, &word)
</PRE>
</P>
<br><a name="SEC9" href="#TOC1">PARSING HEX/OCTAL/C-RADIX NUMBERS</a><br>
<P>
By default, if you pass a pointer to a numeric value, the
corresponding text is interpreted as a base-10 number. You can
instead wrap the pointer with a call to one of the operators Hex(),
Octal(), or CRadix() to interpret the text in another base. The
CRadix operator interprets C-style "0" (base-8) and "0x" (base-16)
prefixes, but defaults to base-10.
<pre>
  Example:
    int a, b, c, d;
    pcrecpp::RE re("(.*) (.*) (.*) (.*)");
    re.FullMatch("100 40 0100 0x40",
                 pcrecpp::Octal(&a), pcrecpp::Hex(&b),
                 pcrecpp::CRadix(&c), pcrecpp::CRadix(&d));
</pre>
will leave 64 in a, b, c, and d.
</P>
<br><a name="SEC10" href="#TOC1">REPLACING PARTS OF STRINGS</a><br>
<P>
You can replace the first match of "pattern" in "str" with "rewrite".
Within "rewrite", backslash-escaped digits (\1 to \9) can be
used to insert text matching corresponding parenthesized group
from the pattern. \0 in "rewrite" refers to the entire matching
text. For example:
<pre>
  string s = "yabba dabba doo";
  pcrecpp::RE("b+").Replace("d", &s);
</pre>
will leave "s" containing "yada dabba doo". The result is true if the pattern
matches and a replacement occurs, false otherwise.
</P>
<P>
<b>GlobalReplace</b> is like <b>Replace</b> except that it replaces all
occurrences of the pattern in the string with the rewrite. Replacements are
not subject to re-matching. For example:
<pre>
  string s = "yabba dabba doo";
  pcrecpp::RE("b+").GlobalReplace("d", &s);
</pre>
will leave "s" containing "yada dada doo". It returns the number of
replacements made.
</P>
<P>
<b>Extract</b> is like <b>Replace</b>, except that if the pattern matches,
"rewrite" is copied into "out" (an additional argument) with substitutions.
The non-matching portions of "text" are ignored. Returns true iff a match
occurred and the extraction happened successfully;  if no match occurs, the
string is left unaffected.
</P>
<br><a name="SEC11" href="#TOC1">AUTHOR</a><br>
<P>
The C++ wrapper was contributed by Google Inc.
<br>
Copyright &copy; 2007 Google Inc.
<br>
</P>
<br><a name="SEC12" href="#TOC1">REVISION</a><br>
<P>
Last updated: 17 March 2009
<br>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[%�%	)doc/alt-pcre802-devel/html/pcre_exec.htmlnu�[���<html>
<head>
<title>pcre_exec specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_exec man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>int pcre_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
<b>const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
<b>int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This function matches a compiled regular expression against a given subject
string, using a matching algorithm that is similar to Perl's. It returns
offsets to captured substrings. Its arguments are:
<pre>
  <i>code</i>         Points to the compiled pattern
  <i>extra</i>        Points to an associated <b>pcre_extra</b> structure,
                 or is NULL
  <i>subject</i>      Points to the subject string
  <i>length</i>       Length of the subject string, in bytes
  <i>startoffset</i>  Offset in bytes in the subject at which to
                 start matching
  <i>options</i>      Option bits
  <i>ovector</i>      Points to a vector of ints for result offsets
  <i>ovecsize</i>     Number of elements in the vector (a multiple of 3)
</pre>
The options are:
<pre>
  PCRE_ANCHORED          Match only at the first position
  PCRE_BSR_ANYCRLF       \R matches only CR, LF, or CRLF
  PCRE_BSR_UNICODE       \R matches all Unicode line endings
  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence
  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences
  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence
  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence
  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence
  PCRE_NOTBOL            Subject string is not the beginning of a line
  PCRE_NOTEOL            Subject string is not the end of a line
  PCRE_NOTEMPTY          An empty string is not a valid match
  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
                           is not a valid match
  PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations
  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
                           validity (only relevant if PCRE_UTF8
                           was set at compile time)
  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
  PCRE_PARTIAL_SOFT      )   match if no full matches are found
  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
                           even if there is a full match as well
</pre>
For details of partial matching, see the
<a href="pcrepartial.html"><b>pcrepartial</b></a>
page. A <b>pcre_extra</b> structure contains the following fields:
<pre>
  <i>flags</i>        Bits indicating which fields are set
  <i>study_data</i>   Opaque data from <b>pcre_study()</b>
  <i>match_limit</i>  Limit on internal resource use
  <i>match_limit_recursion</i>  Limit on internal recursion depth
  <i>callout_data</i> Opaque data passed back to callouts
  <i>tables</i>       Points to character tables or is NULL
</pre>
The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT,
PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, and
PCRE_EXTRA_TABLES.
</P>
<P>
There is a complete description of the PCRE native API in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[=-�E2doc/alt-pcre802-devel/html/pcre_get_substring.htmlnu�[���<html>
<head>
<title>pcre_get_substring specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_get_substring man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>int pcre_get_substring(const char *<i>subject</i>, int *<i>ovector</i>,</b>
<b>int <i>stringcount</i>, int <i>stringnumber</i>,</b>
<b>const char **<i>stringptr</i>);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This is a convenience function for extracting a captured substring. The
arguments are:
<pre>
  <i>subject</i>       Subject that has been successfully matched
  <i>ovector</i>       Offset vector that <b>pcre_exec()</b> used
  <i>stringcount</i>   Value returned by <b>pcre_exec()</b>
  <i>stringnumber</i>  Number of the required substring
  <i>stringptr</i>     Where to put the string pointer
</pre>
The memory in which the substring is placed is obtained by calling
<b>pcre_malloc()</b>. The convenience function <b>pcre_free_substring()</b> can
be used to free it when it is no longer needed. The yield of the function is
the length of the substring, PCRE_ERROR_NOMEMORY if sufficient memory could not
be obtained, or PCRE_ERROR_NOSUBSTRING if the string number is invalid.
</P>
<P>
There is a complete description of the PCRE native API in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[o�tNbb8doc/alt-pcre802-devel/html/pcre_free_substring_list.htmlnu�[���<html>
<head>
<title>pcre_free_substring_list specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_free_substring_list man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>void pcre_free_substring_list(const char **<i>stringptr</i>);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This is a convenience function for freeing the store obtained by a previous
call to <b>pcre_get_substring_list()</b>. Its only argument is a pointer to the
list of string pointers.
</P>
<P>
There is a complete description of the PCRE native API in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[�}ET�;�;)doc/alt-pcre802-devel/html/pcrebuild.htmlnu�[���<html>
<head>
<title>pcrebuild specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcrebuild man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<ul>
<li><a name="TOC1" href="#SEC1">PCRE BUILD-TIME OPTIONS</a>
<li><a name="TOC2" href="#SEC2">C++ SUPPORT</a>
<li><a name="TOC3" href="#SEC3">UTF-8 SUPPORT</a>
<li><a name="TOC4" href="#SEC4">UNICODE CHARACTER PROPERTY SUPPORT</a>
<li><a name="TOC5" href="#SEC5">CODE VALUE OF NEWLINE</a>
<li><a name="TOC6" href="#SEC6">WHAT \R MATCHES</a>
<li><a name="TOC7" href="#SEC7">BUILDING SHARED AND STATIC LIBRARIES</a>
<li><a name="TOC8" href="#SEC8">POSIX MALLOC USAGE</a>
<li><a name="TOC9" href="#SEC9">HANDLING VERY LARGE PATTERNS</a>
<li><a name="TOC10" href="#SEC10">AVOIDING EXCESSIVE STACK USAGE</a>
<li><a name="TOC11" href="#SEC11">LIMITING PCRE RESOURCE USAGE</a>
<li><a name="TOC12" href="#SEC12">CREATING CHARACTER TABLES AT BUILD TIME</a>
<li><a name="TOC13" href="#SEC13">USING EBCDIC CODE</a>
<li><a name="TOC14" href="#SEC14">PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT</a>
<li><a name="TOC15" href="#SEC15">PCRETEST OPTION FOR LIBREADLINE SUPPORT</a>
<li><a name="TOC16" href="#SEC16">SEE ALSO</a>
<li><a name="TOC17" href="#SEC17">AUTHOR</a>
<li><a name="TOC18" href="#SEC18">REVISION</a>
</ul>
<br><a name="SEC1" href="#TOC1">PCRE BUILD-TIME OPTIONS</a><br>
<P>
This document describes the optional features of PCRE that can be selected when
the library is compiled. It assumes use of the <b>configure</b> script, where
the optional features are selected or deselected by providing options to
<b>configure</b> before running the <b>make</b> command. However, the same
options can be selected in both Unix-like and non-Unix-like environments using
the GUI facility of <b>cmake-gui</b> if you are using <b>CMake</b> instead of
<b>configure</b> to build PCRE.
</P>
<P>
There is a lot more information about building PCRE in non-Unix-like
environments in the file called <i>NON_UNIX_USE</i>, which is part of the PCRE
distribution. You should consult this file as well as the <i>README</i> file if
you are building in a non-Unix-like environment.
</P>
<P>
The complete list of options for <b>configure</b> (which includes the standard
ones such as the selection of the installation directory) can be obtained by
running
<pre>
  ./configure --help
</pre>
The following sections include descriptions of options whose names begin with
--enable or --disable. These settings specify changes to the defaults for the
<b>configure</b> command. Because of the way that <b>configure</b> works,
--enable and --disable always come in pairs, so the complementary option always
exists as well, but as it specifies the default, it is not described.
</P>
<br><a name="SEC2" href="#TOC1">C++ SUPPORT</a><br>
<P>
By default, the <b>configure</b> script will search for a C++ compiler and C++
header files. If it finds them, it automatically builds the C++ wrapper library
for PCRE. You can disable this by adding
<pre>
  --disable-cpp
</pre>
to the <b>configure</b> command.
</P>
<br><a name="SEC3" href="#TOC1">UTF-8 SUPPORT</a><br>
<P>
To build PCRE with support for UTF-8 Unicode character strings, add
<pre>
  --enable-utf8
</pre>
to the <b>configure</b> command. Of itself, this does not make PCRE treat
strings as UTF-8. As well as compiling PCRE with this option, you also have
have to set the PCRE_UTF8 option when you call the <b>pcre_compile()</b>
or <b>pcre_compile2()</b> functions.
</P>
<P>
If you set --enable-utf8 when compiling in an EBCDIC environment, PCRE expects
its input to be either ASCII or UTF-8 (depending on the runtime option). It is
not possible to support both EBCDIC and UTF-8 codes in the same version of the
library. Consequently, --enable-utf8 and --enable-ebcdic are mutually
exclusive.
</P>
<br><a name="SEC4" href="#TOC1">UNICODE CHARACTER PROPERTY SUPPORT</a><br>
<P>
UTF-8 support allows PCRE to process character values greater than 255 in the
strings that it handles. On its own, however, it does not provide any
facilities for accessing the properties of such characters. If you want to be
able to use the pattern escapes \P, \p, and \X, which refer to Unicode
character properties, you must add
<pre>
  --enable-unicode-properties
</pre>
to the <b>configure</b> command. This implies UTF-8 support, even if you have
not explicitly requested it.
</P>
<P>
Including Unicode property support adds around 30K of tables to the PCRE
library. Only the general category properties such as <i>Lu</i> and <i>Nd</i> are
supported. Details are given in the
<a href="pcrepattern.html"><b>pcrepattern</b></a>
documentation.
</P>
<br><a name="SEC5" href="#TOC1">CODE VALUE OF NEWLINE</a><br>
<P>
By default, PCRE interprets the linefeed (LF) character as indicating the end
of a line. This is the normal newline character on Unix-like systems. You can
compile PCRE to use carriage return (CR) instead, by adding
<pre>
  --enable-newline-is-cr
</pre>
to the <b>configure</b> command. There is also a --enable-newline-is-lf option,
which explicitly specifies linefeed as the newline character.
<br>
<br>
Alternatively, you can specify that line endings are to be indicated by the two
character sequence CRLF. If you want this, add
<pre>
  --enable-newline-is-crlf
</pre>
to the <b>configure</b> command. There is a fourth option, specified by
<pre>
  --enable-newline-is-anycrlf
</pre>
which causes PCRE to recognize any of the three sequences CR, LF, or CRLF as
indicating a line ending. Finally, a fifth option, specified by
<pre>
  --enable-newline-is-any
</pre>
causes PCRE to recognize any Unicode newline sequence.
</P>
<P>
Whatever line ending convention is selected when PCRE is built can be
overridden when the library functions are called. At build time it is
conventional to use the standard for your operating system.
</P>
<br><a name="SEC6" href="#TOC1">WHAT \R MATCHES</a><br>
<P>
By default, the sequence \R in a pattern matches any Unicode newline sequence,
whatever has been selected as the line ending sequence. If you specify
<pre>
  --enable-bsr-anycrlf
</pre>
the default is changed so that \R matches only CR, LF, or CRLF. Whatever is
selected when PCRE is built can be overridden when the library functions are
called.
</P>
<br><a name="SEC7" href="#TOC1">BUILDING SHARED AND STATIC LIBRARIES</a><br>
<P>
The PCRE building process uses <b>libtool</b> to build both shared and static
Unix libraries by default. You can suppress one of these by adding one of
<pre>
  --disable-shared
  --disable-static
</pre>
to the <b>configure</b> command, as required.
</P>
<br><a name="SEC8" href="#TOC1">POSIX MALLOC USAGE</a><br>
<P>
When PCRE is called through the POSIX interface (see the
<a href="pcreposix.html"><b>pcreposix</b></a>
documentation), additional working storage is required for holding the pointers
to capturing substrings, because PCRE requires three integers per substring,
whereas the POSIX interface provides only two. If the number of expected
substrings is small, the wrapper function uses space on the stack, because this
is faster than using <b>malloc()</b> for each call. The default threshold above
which the stack is no longer used is 10; it can be changed by adding a setting
such as
<pre>
  --with-posix-malloc-threshold=20
</pre>
to the <b>configure</b> command.
</P>
<br><a name="SEC9" href="#TOC1">HANDLING VERY LARGE PATTERNS</a><br>
<P>
Within a compiled pattern, offset values are used to point from one part to
another (for example, from an opening parenthesis to an alternation
metacharacter). By default, two-byte values are used for these offsets, leading
to a maximum size for a compiled pattern of around 64K. This is sufficient to
handle all but the most gigantic patterns. Nevertheless, some people do want to
process truyl enormous patterns, so it is possible to compile PCRE to use
three-byte or four-byte offsets by adding a setting such as
<pre>
  --with-link-size=3
</pre>
to the <b>configure</b> command. The value given must be 2, 3, or 4. Using
longer offsets slows down the operation of PCRE because it has to load
additional bytes when handling them.
</P>
<br><a name="SEC10" href="#TOC1">AVOIDING EXCESSIVE STACK USAGE</a><br>
<P>
When matching with the <b>pcre_exec()</b> function, PCRE implements backtracking
by making recursive calls to an internal function called <b>match()</b>. In
environments where the size of the stack is limited, this can severely limit
PCRE's operation. (The Unix environment does not usually suffer from this
problem, but it may sometimes be necessary to increase the maximum stack size.
There is a discussion in the
<a href="pcrestack.html"><b>pcrestack</b></a>
documentation.) An alternative approach to recursion that uses memory from the
heap to remember data, instead of using recursive function calls, has been
implemented to work round the problem of limited stack size. If you want to
build a version of PCRE that works this way, add
<pre>
  --disable-stack-for-recursion
</pre>
to the <b>configure</b> command. With this configuration, PCRE will use the
<b>pcre_stack_malloc</b> and <b>pcre_stack_free</b> variables to call memory
management functions. By default these point to <b>malloc()</b> and
<b>free()</b>, but you can replace the pointers so that your own functions are
used instead.
</P>
<P>
Separate functions are provided rather than using <b>pcre_malloc</b> and
<b>pcre_free</b> because the usage is very predictable: the block sizes
requested are always the same, and the blocks are always freed in reverse
order. A calling program might be able to implement optimized functions that
perform better than <b>malloc()</b> and <b>free()</b>. PCRE runs noticeably more
slowly when built in this way. This option affects only the <b>pcre_exec()</b>
function; it is not relevant for <b>pcre_dfa_exec()</b>.
</P>
<br><a name="SEC11" href="#TOC1">LIMITING PCRE RESOURCE USAGE</a><br>
<P>
Internally, PCRE has a function called <b>match()</b>, which it calls repeatedly
(sometimes recursively) when matching a pattern with the <b>pcre_exec()</b>
function. By controlling the maximum number of times this function may be
called during a single matching operation, a limit can be placed on the
resources used by a single call to <b>pcre_exec()</b>. The limit can be changed
at run time, as described in the
<a href="pcreapi.html"><b>pcreapi</b></a>
documentation. The default is 10 million, but this can be changed by adding a
setting such as
<pre>
  --with-match-limit=500000
</pre>
to the <b>configure</b> command. This setting has no effect on the
<b>pcre_dfa_exec()</b> matching function.
</P>
<P>
In some environments it is desirable to limit the depth of recursive calls of
<b>match()</b> more strictly than the total number of calls, in order to
restrict the maximum amount of stack (or heap, if --disable-stack-for-recursion
is specified) that is used. A second limit controls this; it defaults to the
value that is set for --with-match-limit, which imposes no additional
constraints. However, you can set a lower limit by adding, for example,
<pre>
  --with-match-limit-recursion=10000
</pre>
to the <b>configure</b> command. This value can also be overridden at run time.
</P>
<br><a name="SEC12" href="#TOC1">CREATING CHARACTER TABLES AT BUILD TIME</a><br>
<P>
PCRE uses fixed tables for processing characters whose code values are less
than 256. By default, PCRE is built with a set of tables that are distributed
in the file <i>pcre_chartables.c.dist</i>. These tables are for ASCII codes
only. If you add
<pre>
  --enable-rebuild-chartables
</pre>
to the <b>configure</b> command, the distributed tables are no longer used.
Instead, a program called <b>dftables</b> is compiled and run. This outputs the
source for new set of tables, created in the default locale of your C runtime
system. (This method of replacing the tables does not work if you are cross
compiling, because <b>dftables</b> is run on the local host. If you need to
create alternative tables when cross compiling, you will have to do so "by
hand".)
</P>
<br><a name="SEC13" href="#TOC1">USING EBCDIC CODE</a><br>
<P>
PCRE assumes by default that it will run in an environment where the character
code is ASCII (or Unicode, which is a superset of ASCII). This is the case for
most computer operating systems. PCRE can, however, be compiled to run in an
EBCDIC environment by adding
<pre>
  --enable-ebcdic
</pre>
to the <b>configure</b> command. This setting implies
--enable-rebuild-chartables. You should only use it if you know that you are in
an EBCDIC environment (for example, an IBM mainframe operating system). The
--enable-ebcdic option is incompatible with --enable-utf8.
</P>
<br><a name="SEC14" href="#TOC1">PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT</a><br>
<P>
By default, <b>pcregrep</b> reads all files as plain text. You can build it so
that it recognizes files whose names end in <b>.gz</b> or <b>.bz2</b>, and reads
them with <b>libz</b> or <b>libbz2</b>, respectively, by adding one or both of
<pre>
  --enable-pcregrep-libz
  --enable-pcregrep-libbz2
</pre>
to the <b>configure</b> command. These options naturally require that the
relevant libraries are installed on your system. Configuration will fail if
they are not.
</P>
<br><a name="SEC15" href="#TOC1">PCRETEST OPTION FOR LIBREADLINE SUPPORT</a><br>
<P>
If you add
<pre>
  --enable-pcretest-libreadline
</pre>
to the <b>configure</b> command, <b>pcretest</b> is linked with the
<b>libreadline</b> library, and when its input is from a terminal, it reads it
using the <b>readline()</b> function. This provides line-editing and history
facilities. Note that <b>libreadline</b> is GPL-licensed, so if you distribute a
binary of <b>pcretest</b> linked in this way, there may be licensing issues.
</P>
<P>
Setting this option causes the <b>-lreadline</b> option to be added to the
<b>pcretest</b> build. In many operating environments with a sytem-installed
<b>libreadline</b> this is sufficient. However, in some environments (e.g.
if an unmodified distribution version of readline is in use), some extra
configuration may be necessary. The INSTALL file for <b>libreadline</b> says
this:
<pre>
  "Readline uses the termcap functions, but does not link with the
  termcap or curses library itself, allowing applications which link
  with readline the to choose an appropriate library."
</pre>
If your environment has not been set up so that an appropriate library is
automatically included, you may need to add something like
<pre>
  LIBS="-ncurses"
</pre>
immediately before the <b>configure</b> command.
</P>
<br><a name="SEC16" href="#TOC1">SEE ALSO</a><br>
<P>
<b>pcreapi</b>(3), <b>pcre_config</b>(3).
</P>
<br><a name="SEC17" href="#TOC1">AUTHOR</a><br>
<P>
Philip Hazel
<br>
University Computing Service
<br>
Cambridge CB2 3QH, England.
<br>
</P>
<br><a name="SEC18" href="#TOC1">REVISION</a><br>
<P>
Last updated: 29 September 2009
<br>
Copyright &copy; 1997-2009 University of Cambridge.
<br>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[��f�
�
,doc/alt-pcre802-devel/html/pcre_compile.htmlnu�[���<html>
<head>
<title>pcre_compile specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_compile man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>pcre *pcre_compile(const char *<i>pattern</i>, int <i>options</i>,</b>
<b>const char **<i>errptr</i>, int *<i>erroffset</i>,</b>
<b>const unsigned char *<i>tableptr</i>);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This function compiles a regular expression into an internal form. It is the
same as <b>pcre_compile2()</b>, except for the absence of the <i>errorcodeptr</i>
argument. Its arguments are:
<pre>
  <i>pattern</i>       A zero-terminated string containing the
                  regular expression to be compiled
  <i>options</i>       Zero or more option bits
  <i>errptr</i>        Where to put an error message
  <i>erroffset</i>     Offset in pattern where error was found
  <i>tableptr</i>      Pointer to character tables, or NULL to
                  use the built-in default
</pre>
The option bits are:
<pre>
  PCRE_ANCHORED           Force pattern anchoring
  PCRE_AUTO_CALLOUT       Compile automatic callouts
  PCRE_BSR_ANYCRLF        \R matches only CR, LF, or CRLF
  PCRE_BSR_UNICODE        \R matches all Unicode line endings
  PCRE_CASELESS           Do caseless matching
  PCRE_DOLLAR_ENDONLY     $ not to match newline at end
  PCRE_DOTALL             . matches anything including NL
  PCRE_DUPNAMES           Allow duplicate names for subpatterns
  PCRE_EXTENDED           Ignore whitespace and # comments
  PCRE_EXTRA              PCRE extra features
                            (not much use currently)
  PCRE_FIRSTLINE          Force matching to be before newline
  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility
  PCRE_MULTILINE          ^ and $ match newlines within data
  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence
  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline
                            sequences
  PCRE_NEWLINE_CR         Set CR as the newline sequence
  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence
  PCRE_NEWLINE_LF         Set LF as the newline sequence
  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-
                            theses (named ones available)
  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8
                            validity (only relevant if
                            PCRE_UTF8 is set)
  PCRE_UNGREEDY           Invert greediness of quantifiers
  PCRE_UTF8               Run in UTF-8 mode
</pre>
PCRE must be built with UTF-8 support in order to use PCRE_UTF8 and
PCRE_NO_UTF8_CHECK.
</P>
<P>
The yield of the function is a pointer to a private data structure that
contains the compiled pattern, or NULL if an error was detected. Note that
compiling regular expressions with one version of PCRE for use with a different
version is not guaranteed to work and may cause crashes.
</P>
<P>
There is a complete description of the PCRE native API in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[��`Ygggg(doc/alt-pcre802-devel/html/pcregrep.htmlnu�[���<html>
<head>
<title>pcregrep specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcregrep man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<ul>
<li><a name="TOC1" href="#SEC1">SYNOPSIS</a>
<li><a name="TOC2" href="#SEC2">DESCRIPTION</a>
<li><a name="TOC3" href="#SEC3">SUPPORT FOR COMPRESSED FILES</a>
<li><a name="TOC4" href="#SEC4">OPTIONS</a>
<li><a name="TOC5" href="#SEC5">ENVIRONMENT VARIABLES</a>
<li><a name="TOC6" href="#SEC6">NEWLINES</a>
<li><a name="TOC7" href="#SEC7">OPTIONS COMPATIBILITY</a>
<li><a name="TOC8" href="#SEC8">OPTIONS WITH DATA</a>
<li><a name="TOC9" href="#SEC9">MATCHING ERRORS</a>
<li><a name="TOC10" href="#SEC10">DIAGNOSTICS</a>
<li><a name="TOC11" href="#SEC11">SEE ALSO</a>
<li><a name="TOC12" href="#SEC12">AUTHOR</a>
<li><a name="TOC13" href="#SEC13">REVISION</a>
</ul>
<br><a name="SEC1" href="#TOC1">SYNOPSIS</a><br>
<P>
<b>pcregrep [options] [long options] [pattern] [path1 path2 ...]</b>
</P>
<br><a name="SEC2" href="#TOC1">DESCRIPTION</a><br>
<P>
<b>pcregrep</b> searches files for character patterns, in the same way as other
grep commands do, but it uses the PCRE regular expression library to support
patterns that are compatible with the regular expressions of Perl 5. See
<a href="pcrepattern.html"><b>pcrepattern</b>(3)</a>
for a full description of syntax and semantics of the regular expressions
that PCRE supports.
</P>
<P>
Patterns, whether supplied on the command line or in a separate file, are given
without delimiters. For example:
<pre>
  pcregrep Thursday /etc/motd
</pre>
If you attempt to use delimiters (for example, by surrounding a pattern with
slashes, as is common in Perl scripts), they are interpreted as part of the
pattern. Quotes can of course be used to delimit patterns on the command line
because they are interpreted by the shell, and indeed they are required if a
pattern contains white space or shell metacharacters.
</P>
<P>
The first argument that follows any option settings is treated as the single
pattern to be matched when neither <b>-e</b> nor <b>-f</b> is present.
Conversely, when one or both of these options are used to specify patterns, all
arguments are treated as path names. At least one of <b>-e</b>, <b>-f</b>, or an
argument pattern must be provided.
</P>
<P>
If no files are specified, <b>pcregrep</b> reads the standard input. The
standard input can also be referenced by a name consisting of a single hyphen.
For example:
<pre>
  pcregrep some-pattern /file1 - /file3
</pre>
By default, each line that matches a pattern is copied to the standard
output, and if there is more than one file, the file name is output at the
start of each line, followed by a colon. However, there are options that can
change how <b>pcregrep</b> behaves. In particular, the <b>-M</b> option makes it
possible to search for patterns that span line boundaries. What defines a line
boundary is controlled by the <b>-N</b> (<b>--newline</b>) option.
</P>
<P>
Patterns are limited to 8K or BUFSIZ characters, whichever is the greater.
BUFSIZ is defined in <b>&#60;stdio.h&#62;</b>. When there is more than one pattern
(specified by the use of <b>-e</b> and/or <b>-f</b>), each pattern is applied to
each line in the order in which they are defined, except that all the <b>-e</b>
patterns are tried before the <b>-f</b> patterns.
</P>
<P>
By default, as soon as one pattern matches (or fails to match when <b>-v</b> is
used), no further patterns are considered. However, if <b>--colour</b> (or
<b>--color</b>) is used to colour the matching substrings, or if
<b>--only-matching</b>, <b>--file-offsets</b>, or <b>--line-offsets</b> is used to
output only the part of the line that matched (either shown literally, or as an
offset), scanning resumes immediately following the match, so that further
matches on the same line can be found. If there are multiple patterns, they are
all tried on the remainder of the line, but patterns that follow the one that
matched are not tried on the earlier part of the line.
</P>
<P>
This is the same behaviour as GNU grep, but it does mean that the order in
which multiple patterns are specified can affect the output when one of the
above options is used.
</P>
<P>
Patterns that can match an empty string are accepted, but empty string
matches are never recognized. An example is the pattern "(super)?(man)?", in
which all components are optional. This pattern finds all occurrences of both
"super" and "man"; the output differs from matching with "super|man" when only
the matching substrings are being shown.
</P>
<P>
If the <b>LC_ALL</b> or <b>LC_CTYPE</b> environment variable is set,
<b>pcregrep</b> uses the value to set a locale when calling the PCRE library.
The <b>--locale</b> option can be used to override this.
</P>
<br><a name="SEC3" href="#TOC1">SUPPORT FOR COMPRESSED FILES</a><br>
<P>
It is possible to compile <b>pcregrep</b> so that it uses <b>libz</b> or
<b>libbz2</b> to read files whose names end in <b>.gz</b> or <b>.bz2</b>,
respectively. You can find out whether your binary has support for one or both
of these file types by running it with the <b>--help</b> option. If the
appropriate support is not present, files are treated as plain text. The
standard input is always so treated.
</P>
<br><a name="SEC4" href="#TOC1">OPTIONS</a><br>
<P>
The order in which some of the options appear can affect the output. For
example, both the <b>-h</b> and <b>-l</b> options affect the printing of file
names. Whichever comes later in the command line will be the one that takes
effect.
</P>
<P>
<b>--</b>
This terminate the list of options. It is useful if the next item on the
command line starts with a hyphen but is not an option. This allows for the
processing of patterns and filenames that start with hyphens.
</P>
<P>
<b>-A</b> <i>number</i>, <b>--after-context=</b><i>number</i>
Output <i>number</i> lines of context after each matching line. If filenames
and/or line numbers are being output, a hyphen separator is used instead of a
colon for the context lines. A line containing "--" is output between each
group of lines, unless they are in fact contiguous in the input file. The value
of <i>number</i> is expected to be relatively small. However, <b>pcregrep</b>
guarantees to have up to 8K of following text available for context output.
</P>
<P>
<b>-B</b> <i>number</i>, <b>--before-context=</b><i>number</i>
Output <i>number</i> lines of context before each matching line. If filenames
and/or line numbers are being output, a hyphen separator is used instead of a
colon for the context lines. A line containing "--" is output between each
group of lines, unless they are in fact contiguous in the input file. The value
of <i>number</i> is expected to be relatively small. However, <b>pcregrep</b>
guarantees to have up to 8K of preceding text available for context output.
</P>
<P>
<b>-C</b> <i>number</i>, <b>--context=</b><i>number</i>
Output <i>number</i> lines of context both before and after each matching line.
This is equivalent to setting both <b>-A</b> and <b>-B</b> to the same value.
</P>
<P>
<b>-c</b>, <b>--count</b>
Do not output individual lines from the files that are being scanned; instead
output the number of lines that would otherwise have been shown. If no lines
are selected, the number zero is output. If several files are are being
scanned, a count is output for each of them. However, if the
<b>--files-with-matches</b> option is also used, only those files whose counts
are greater than zero are listed. When <b>-c</b> is used, the <b>-A</b>,
<b>-B</b>, and <b>-C</b> options are ignored.
</P>
<P>
<b>--colour</b>, <b>--color</b>
If this option is given without any data, it is equivalent to "--colour=auto".
If data is required, it must be given in the same shell item, separated by an
equals sign.
</P>
<P>
<b>--colour=</b><i>value</i>, <b>--color=</b><i>value</i>
This option specifies under what circumstances the parts of a line that matched
a pattern should be coloured in the output. By default, the output is not
coloured. The value (which is optional, see above) may be "never", "always", or
"auto". In the latter case, colouring happens only if the standard output is
connected to a terminal. More resources are used when colouring is enabled,
because <b>pcregrep</b> has to search for all possible matches in a line, not
just one, in order to colour them all.
</P>
<P>
The colour that is used can be specified by setting the environment variable
PCREGREP_COLOUR or PCREGREP_COLOR. The value of this variable should be a
string of two numbers, separated by a semicolon. They are copied directly into
the control string for setting colour on a terminal, so it is your
responsibility to ensure that they make sense. If neither of the environment
variables is set, the default is "1;31", which gives red.
</P>
<P>
<b>-D</b> <i>action</i>, <b>--devices=</b><i>action</i>
If an input path is not a regular file or a directory, "action" specifies how
it is to be processed. Valid values are "read" (the default) or "skip"
(silently skip the path).
</P>
<P>
<b>-d</b> <i>action</i>, <b>--directories=</b><i>action</i>
If an input path is a directory, "action" specifies how it is to be processed.
Valid values are "read" (the default), "recurse" (equivalent to the <b>-r</b>
option), or "skip" (silently skip the path). In the default case, directories
are read as if they were ordinary files. In some operating systems the effect
of reading a directory like this is an immediate end-of-file.
</P>
<P>
<b>-e</b> <i>pattern</i>, <b>--regex=</b><i>pattern</i>, <b>--regexp=</b><i>pattern</i>
Specify a pattern to be matched. This option can be used multiple times in
order to specify several patterns. It can also be used as a way of specifying a
single pattern that starts with a hyphen. When <b>-e</b> is used, no argument
pattern is taken from the command line; all arguments are treated as file
names. There is an overall maximum of 100 patterns. They are applied to each
line in the order in which they are defined until one matches (or fails to
match if <b>-v</b> is used). If <b>-f</b> is used with <b>-e</b>, the command line
patterns are matched first, followed by the patterns from the file, independent
of the order in which these options are specified. Note that multiple use of
<b>-e</b> is not the same as a single pattern with alternatives. For example,
X|Y finds the first character in a line that is X or Y, whereas if the two
patterns are given separately, <b>pcregrep</b> finds X if it is present, even if
it follows Y in the line. It finds Y only if there is no X in the line. This
really matters only if you are using <b>-o</b> to show the part(s) of the line
that matched.
</P>
<P>
<b>--exclude</b>=<i>pattern</i>
When <b>pcregrep</b> is searching the files in a directory as a consequence of
the <b>-r</b> (recursive search) option, any regular files whose names match the
pattern are excluded. Subdirectories are not excluded by this option; they are
searched recursively, subject to the <b>--exclude_dir</b> and
<b>--include_dir</b> options. The pattern is a PCRE regular expression, and is
matched against the final component of the file name (not the entire path). If
a file name matches both <b>--include</b> and <b>--exclude</b>, it is excluded.
There is no short form for this option.
</P>
<P>
<b>--exclude_dir</b>=<i>pattern</i>
When <b>pcregrep</b> is searching the contents of a directory as a consequence
of the <b>-r</b> (recursive search) option, any subdirectories whose names match
the pattern are excluded. (Note that the \fP--exclude\fP option does not affect
subdirectories.) The pattern is a PCRE regular expression, and is matched
against the final component of the name (not the entire path). If a
subdirectory name matches both <b>--include_dir</b> and <b>--exclude_dir</b>, it
is excluded. There is no short form for this option.
</P>
<P>
<b>-F</b>, <b>--fixed-strings</b>
Interpret each pattern as a list of fixed strings, separated by newlines,
instead of as a regular expression. The <b>-w</b> (match as a word) and <b>-x</b>
(match whole line) options can be used with <b>-F</b>. They apply to each of the
fixed strings. A line is selected if any of the fixed strings are found in it
(subject to <b>-w</b> or <b>-x</b>, if present).
</P>
<P>
<b>-f</b> <i>filename</i>, <b>--file=</b><i>filename</i>
Read a number of patterns from the file, one per line, and match them against
each line of input. A data line is output if any of the patterns match it. The
filename can be given as "-" to refer to the standard input. When <b>-f</b> is
used, patterns specified on the command line using <b>-e</b> may also be
present; they are tested before the file's patterns. However, no other pattern
is taken from the command line; all arguments are treated as file names. There
is an overall maximum of 100 patterns. Trailing white space is removed from
each line, and blank lines are ignored. An empty file contains no patterns and
therefore matches nothing. See also the comments about multiple patterns versus
a single pattern with alternatives in the description of <b>-e</b> above.
</P>
<P>
<b>--file-offsets</b>
Instead of showing lines or parts of lines that match, show each match as an
offset from the start of the file and a length, separated by a comma. In this
mode, no context is shown. That is, the <b>-A</b>, <b>-B</b>, and <b>-C</b>
options are ignored. If there is more than one match in a line, each of them is
shown separately. This option is mutually exclusive with <b>--line-offsets</b>
and <b>--only-matching</b>.
</P>
<P>
<b>-H</b>, <b>--with-filename</b>
Force the inclusion of the filename at the start of output lines when searching
a single file. By default, the filename is not shown in this case. For matching
lines, the filename is followed by a colon; for context lines, a hyphen
separator is used. If a line number is also being output, it follows the file
name.
</P>
<P>
<b>-h</b>, <b>--no-filename</b>
Suppress the output filenames when searching multiple files. By default,
filenames are shown when multiple files are searched. For matching lines, the
filename is followed by a colon; for context lines, a hyphen separator is used.
If a line number is also being output, it follows the file name.
</P>
<P>
<b>--help</b>
Output a help message, giving brief details of the command options and file
type support, and then exit.
</P>
<P>
<b>-i</b>, <b>--ignore-case</b>
Ignore upper/lower case distinctions during comparisons.
</P>
<P>
<b>--include</b>=<i>pattern</i>
When <b>pcregrep</b> is searching the files in a directory as a consequence of
the <b>-r</b> (recursive search) option, only those regular files whose names
match the pattern are included. Subdirectories are always included and searched
recursively, subject to the \fP--include_dir\fP and <b>--exclude_dir</b>
options. The pattern is a PCRE regular expression, and is matched against the
final component of the file name (not the entire path). If a file name matches
both <b>--include</b> and <b>--exclude</b>, it is excluded. There is no short
form for this option.
</P>
<P>
<b>--include_dir</b>=<i>pattern</i>
When <b>pcregrep</b> is searching the contents of a directory as a consequence
of the <b>-r</b> (recursive search) option, only those subdirectories whose
names match the pattern are included. (Note that the <b>--include</b> option
does not affect subdirectories.) The pattern is a PCRE regular expression, and
is matched against the final component of the name (not the entire path). If a
subdirectory name matches both <b>--include_dir</b> and <b>--exclude_dir</b>, it
is excluded. There is no short form for this option.
</P>
<P>
<b>-L</b>, <b>--files-without-match</b>
Instead of outputting lines from the files, just output the names of the files
that do not contain any lines that would have been output. Each file name is
output once, on a separate line.
</P>
<P>
<b>-l</b>, <b>--files-with-matches</b>
Instead of outputting lines from the files, just output the names of the files
containing lines that would have been output. Each file name is output
once, on a separate line. Searching normally stops as soon as a matching line
is found in a file. However, if the <b>-c</b> (count) option is also used,
matching continues in order to obtain the correct count, and those files that
have at least one match are listed along with their counts. Using this option
with <b>-c</b> is a way of suppressing the listing of files with no matches.
</P>
<P>
<b>--label</b>=<i>name</i>
This option supplies a name to be used for the standard input when file names
are being output. If not supplied, "(standard input)" is used. There is no
short form for this option.
</P>
<P>
<b>--line-offsets</b>
Instead of showing lines or parts of lines that match, show each match as a
line number, the offset from the start of the line, and a length. The line
number is terminated by a colon (as usual; see the <b>-n</b> option), and the
offset and length are separated by a comma. In this mode, no context is shown.
That is, the <b>-A</b>, <b>-B</b>, and <b>-C</b> options are ignored. If there is
more than one match in a line, each of them is shown separately. This option is
mutually exclusive with <b>--file-offsets</b> and <b>--only-matching</b>.
</P>
<P>
<b>--locale</b>=<i>locale-name</i>
This option specifies a locale to be used for pattern matching. It overrides
the value in the <b>LC_ALL</b> or <b>LC_CTYPE</b> environment variables. If no
locale is specified, the PCRE library's default (usually the "C" locale) is
used. There is no short form for this option.
</P>
<P>
<b>-M</b>, <b>--multiline</b>
Allow patterns to match more than one line. When this option is given, patterns
may usefully contain literal newline characters and internal occurrences of ^
and $ characters. The output for any one match may consist of more than one
line. When this option is set, the PCRE library is called in "multiline" mode.
There is a limit to the number of lines that can be matched, imposed by the way
that <b>pcregrep</b> buffers the input file as it scans it. However,
<b>pcregrep</b> ensures that at least 8K characters or the rest of the document
(whichever is the shorter) are available for forward matching, and similarly
the previous 8K characters (or all the previous characters, if fewer than 8K)
are guaranteed to be available for lookbehind assertions.
</P>
<P>
<b>-N</b> <i>newline-type</i>, <b>--newline=</b><i>newline-type</i>
The PCRE library supports five different conventions for indicating
the ends of lines. They are the single-character sequences CR (carriage return)
and LF (linefeed), the two-character sequence CRLF, an "anycrlf" convention,
which recognizes any of the preceding three types, and an "any" convention, in
which any Unicode line ending sequence is assumed to end a line. The Unicode
sequences are the three just mentioned, plus VT (vertical tab, U+000B), FF
(formfeed, U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and
PS (paragraph separator, U+2029).
<br>
<br>
When the PCRE library is built, a default line-ending sequence is specified.
This is normally the standard sequence for the operating system. Unless
otherwise specified by this option, <b>pcregrep</b> uses the library's default.
The possible values for this option are CR, LF, CRLF, ANYCRLF, or ANY. This
makes it possible to use <b>pcregrep</b> on files that have come from other
environments without having to modify their line endings. If the data that is
being scanned does not agree with the convention set by this option,
<b>pcregrep</b> may behave in strange ways.
</P>
<P>
<b>-n</b>, <b>--line-number</b>
Precede each output line by its line number in the file, followed by a colon
for matching lines or a hyphen for context lines. If the filename is also being
output, it precedes the line number. This option is forced if
<b>--line-offsets</b> is used.
</P>
<P>
<b>-o</b>, <b>--only-matching</b>
Show only the part of the line that matched a pattern. In this mode, no
context is shown. That is, the <b>-A</b>, <b>-B</b>, and <b>-C</b> options are
ignored. If there is more than one match in a line, each of them is shown
separately. If <b>-o</b> is combined with <b>-v</b> (invert the sense of the
match to find non-matching lines), no output is generated, but the return code
is set appropriately. This option is mutually exclusive with
<b>--file-offsets</b> and <b>--line-offsets</b>.
</P>
<P>
<b>-q</b>, <b>--quiet</b>
Work quietly, that is, display nothing except error messages. The exit
status indicates whether or not any matches were found.
</P>
<P>
<b>-r</b>, <b>--recursive</b>
If any given path is a directory, recursively scan the files it contains,
taking note of any <b>--include</b> and <b>--exclude</b> settings. By default, a
directory is read as a normal file; in some operating systems this gives an
immediate end-of-file. This option is a shorthand for setting the <b>-d</b>
option to "recurse".
</P>
<P>
<b>-s</b>, <b>--no-messages</b>
Suppress error messages about non-existent or unreadable files. Such files are
quietly skipped. However, the return code is still 2, even if matches were
found in other files.
</P>
<P>
<b>-u</b>, <b>--utf-8</b>
Operate in UTF-8 mode. This option is available only if PCRE has been compiled
with UTF-8 support. Both patterns and subject lines must be valid strings of
UTF-8 characters.
</P>
<P>
<b>-V</b>, <b>--version</b>
Write the version numbers of <b>pcregrep</b> and the PCRE library that is being
used to the standard error stream.
</P>
<P>
<b>-v</b>, <b>--invert-match</b>
Invert the sense of the match, so that lines which do <i>not</i> match any of
the patterns are the ones that are found.
</P>
<P>
<b>-w</b>, <b>--word-regex</b>, <b>--word-regexp</b>
Force the patterns to match only whole words. This is equivalent to having \b
at the start and end of the pattern.
</P>
<P>
<b>-x</b>, <b>--line-regex</b>, <b>--line-regexp</b>
Force the patterns to be anchored (each must start matching at the beginning of
a line) and in addition, require them to match entire lines. This is
equivalent to having ^ and $ characters at the start and end of each
alternative branch in every pattern.
</P>
<br><a name="SEC5" href="#TOC1">ENVIRONMENT VARIABLES</a><br>
<P>
The environment variables <b>LC_ALL</b> and <b>LC_CTYPE</b> are examined, in that
order, for a locale. The first one that is set is used. This can be overridden
by the <b>--locale</b> option. If no locale is set, the PCRE library's default
(usually the "C" locale) is used.
</P>
<br><a name="SEC6" href="#TOC1">NEWLINES</a><br>
<P>
The <b>-N</b> (<b>--newline</b>) option allows <b>pcregrep</b> to scan files with
different newline conventions from the default. However, the setting of this
option does not affect the way in which <b>pcregrep</b> writes information to
the standard error and output streams. It uses the string "\n" in C
<b>printf()</b> calls to indicate newlines, relying on the C I/O library to
convert this to an appropriate sequence if the output is sent to a file.
</P>
<br><a name="SEC7" href="#TOC1">OPTIONS COMPATIBILITY</a><br>
<P>
The majority of short and long forms of <b>pcregrep</b>'s options are the same
as in the GNU <b>grep</b> program. Any long option of the form
<b>--xxx-regexp</b> (GNU terminology) is also available as <b>--xxx-regex</b>
(PCRE terminology). However, the <b>--locale</b>, <b>-M</b>, <b>--multiline</b>,
<b>-u</b>, and <b>--utf-8</b> options are specific to <b>pcregrep</b>. If both the
<b>-c</b> and <b>-l</b> options are given, GNU grep lists only file names,
without counts, but <b>pcregrep</b> gives the counts.
</P>
<br><a name="SEC8" href="#TOC1">OPTIONS WITH DATA</a><br>
<P>
There are four different ways in which an option with data can be specified.
If a short form option is used, the data may follow immediately, or in the next
command line item. For example:
<pre>
  -f/some/file
  -f /some/file
</pre>
If a long form option is used, the data may appear in the same command line
item, separated by an equals character, or (with one exception) it may appear
in the next command line item. For example:
<pre>
  --file=/some/file
  --file /some/file
</pre>
Note, however, that if you want to supply a file name beginning with ~ as data
in a shell command, and have the shell expand ~ to a home directory, you must
separate the file name from the option, because the shell does not treat ~
specially unless it is at the start of an item.
</P>
<P>
The exception to the above is the <b>--colour</b> (or <b>--color</b>) option,
for which the data is optional. If this option does have data, it must be given
in the first form, using an equals character. Otherwise it will be assumed that
it has no data.
</P>
<br><a name="SEC9" href="#TOC1">MATCHING ERRORS</a><br>
<P>
It is possible to supply a regular expression that takes a very long time to
fail to match certain lines. Such patterns normally involve nested indefinite
repeats, for example: (a+)*\d when matched against a line of a's with no final
digit. The PCRE matching function has a resource limit that causes it to abort
in these circumstances. If this happens, <b>pcregrep</b> outputs an error
message and the line that caused the problem to the standard error stream. If
there are more than 20 such errors, <b>pcregrep</b> gives up.
</P>
<br><a name="SEC10" href="#TOC1">DIAGNOSTICS</a><br>
<P>
Exit status is 0 if any matches were found, 1 if no matches were found, and 2
for syntax errors and non-existent or inacessible files (even if matches were
found in other files) or too many matching errors. Using the <b>-s</b> option to
suppress error messages about inaccessble files does not affect the return
code.
</P>
<br><a name="SEC11" href="#TOC1">SEE ALSO</a><br>
<P>
<b>pcrepattern</b>(3), <b>pcretest</b>(1).
</P>
<br><a name="SEC12" href="#TOC1">AUTHOR</a><br>
<P>
Philip Hazel
<br>
University Computing Service
<br>
Cambridge CB2 3QH, England.
<br>
</P>
<br><a name="SEC13" href="#TOC1">REVISION</a><br>
<P>
Last updated: 13 September 2009
<br>
Copyright &copy; 1997-2009 University of Cambridge.
<br>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[�˞a//7doc/alt-pcre802-devel/html/pcre_get_substring_list.htmlnu�[���<html>
<head>
<title>pcre_get_substring_list specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_get_substring_list man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>int pcre_get_substring_list(const char *<i>subject</i>,</b>
<b>int *<i>ovector</i>, int <i>stringcount</i>, const char ***<i>listptr</i>);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This is a convenience function for extracting a list of all the captured
substrings. The arguments are:
<pre>
  <i>subject</i>       Subject that has been successfully matched
  <i>ovector</i>       Offset vector that <b>pcre_exec</b> used
  <i>stringcount</i>   Value returned by <b>pcre_exec</b>
  <i>listptr</i>       Where to put a pointer to the list
</pre>
The memory in which the substrings and the list are placed is obtained by
calling <b>pcre_malloc()</b>. The convenience function
<b>pcre_free_substring_list()</b> can be used to free it when it is no longer
needed. A pointer to a list of pointers is put in the variable whose address is
in <i>listptr</i>. The list is terminated by a NULL pointer. The yield of the
function is zero on success or PCRE_ERROR_NOMEMORY if sufficient memory could
not be obtained.
</P>
<P>
There is a complete description of the PCRE native API in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[:�9doc/alt-pcre802-devel/html/pcre_copy_named_substring.htmlnu�[���<html>
<head>
<title>pcre_copy_named_substring specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_copy_named_substring man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>int pcre_copy_named_substring(const pcre *<i>code</i>,</b>
<b>const char *<i>subject</i>, int *<i>ovector</i>,</b>
<b>int <i>stringcount</i>, const char *<i>stringname</i>,</b>
<b>char *<i>buffer</i>, int <i>buffersize</i>);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This is a convenience function for extracting a captured substring, identified
by name, into a given buffer. The arguments are:
<pre>
  <i>code</i>          Pattern that was successfully matched
  <i>subject</i>       Subject that has been successfully matched
  <i>ovector</i>       Offset vector that <b>pcre_exec()</b> used
  <i>stringcount</i>   Value returned by <b>pcre_exec()</b>
  <i>stringname</i>    Name of the required substring
  <i>buffer</i>        Buffer to receive the string
  <i>buffersize</i>    Size of buffer
</pre>
The yield is the length of the substring, PCRE_ERROR_NOMEMORY if the buffer was
too small, or PCRE_ERROR_NOSUBSTRING if the string name is invalid.
</P>
<P>
There is a complete description of the PCRE native API in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[N3����-doc/alt-pcre802-devel/html/pcre_dfa_exec.htmlnu�[���<html>
<head>
<title>pcre_dfa_exec specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_dfa_exec man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>int pcre_dfa_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
<b>const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
<b>int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>
<b>int *<i>workspace</i>, int <i>wscount</i>);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This function matches a compiled regular expression against a given subject
string, using an alternative matching algorithm that scans the subject string
just once (<i>not</i> Perl-compatible). Note that the main, Perl-compatible,
matching function is <b>pcre_exec()</b>. The arguments for this function are:
<pre>
  <i>code</i>         Points to the compiled pattern
  <i>extra</i>        Points to an associated <b>pcre_extra</b> structure,
                 or is NULL
  <i>subject</i>      Points to the subject string
  <i>length</i>       Length of the subject string, in bytes
  <i>startoffset</i>  Offset in bytes in the subject at which to
                 start matching
  <i>options</i>      Option bits
  <i>ovector</i>      Points to a vector of ints for result offsets
  <i>ovecsize</i>     Number of elements in the vector
  <i>workspace</i>    Points to a vector of ints used as working space
  <i>wscount</i>      Number of elements in the vector
</pre>
The options are:
<pre>
  PCRE_ANCHORED          Match only at the first position
  PCRE_BSR_ANYCRLF       \R matches only CR, LF, or CRLF
  PCRE_BSR_UNICODE       \R matches all Unicode line endings
  PCRE_NEWLINE_ANY       Recognize any Unicode newline sequence
  PCRE_NEWLINE_ANYCRLF   Recognize CR, LF, & CRLF as newline sequences
  PCRE_NEWLINE_CR        Recognize CR as the only newline sequence
  PCRE_NEWLINE_CRLF      Recognize CRLF as the only newline sequence
  PCRE_NEWLINE_LF        Recognize LF as the only newline sequence
  PCRE_NOTBOL            Subject is not the beginning of a line
  PCRE_NOTEOL            Subject is not the end of a line
  PCRE_NOTEMPTY          An empty string is not a valid match
  PCRE_NOTEMPTY_ATSTART  An empty string at the start of the subject
                           is not a valid match
  PCRE_NO_START_OPTIMIZE Do not do "start-match" optimizations
  PCRE_NO_UTF8_CHECK     Do not check the subject for UTF-8
                           validity (only relevant if PCRE_UTF8
                           was set at compile time)
  PCRE_PARTIAL           ) Return PCRE_ERROR_PARTIAL for a partial
  PCRE_PARTIAL_SOFT      )   match if no full matches are found
  PCRE_PARTIAL_HARD      Return PCRE_ERROR_PARTIAL for a partial match
                           even if there is a full match as well
  PCRE_DFA_SHORTEST      Return only the shortest match
  PCRE_DFA_RESTART       Restart after a partial match
</pre>
There are restrictions on what may appear in a pattern when using this matching
function. Details are given in the
<a href="pcrematching.html"><b>pcrematching</b></a>
documentation. For details of partial matching, see the
<a href="pcrepartial.html"><b>pcrepartial</b></a>
page.
</P>
<P>
A <b>pcre_extra</b> structure contains the following fields:
<pre>
  <i>flags</i>        Bits indicating which fields are set
  <i>study_data</i>   Opaque data from <b>pcre_study()</b>
  <i>match_limit</i>  Limit on internal resource use
  <i>match_limit_recursion</i>  Limit on internal recursion depth
  <i>callout_data</i> Opaque data passed back to callouts
  <i>tables</i>       Points to character tables or is NULL
</pre>
The flag bits are PCRE_EXTRA_STUDY_DATA, PCRE_EXTRA_MATCH_LIMIT,
PCRE_EXTRA_MATCH_LIMIT_RECURSION, PCRE_EXTRA_CALLOUT_DATA, and
PCRE_EXTRA_TABLES. For this matching function, the <i>match_limit</i> and
<i>match_limit_recursion</i> fields are not used, and must not be set.
</P>
<P>
There is a complete description of the PCRE native API in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[�^�[6[6$doc/alt-pcre802-devel/html/pcre.htmlnu�[���<html>
<head>
<title>pcre specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<ul>
<li><a name="TOC1" href="#SEC1">INTRODUCTION</a>
<li><a name="TOC2" href="#SEC2">USER DOCUMENTATION</a>
<li><a name="TOC3" href="#SEC3">LIMITATIONS</a>
<li><a name="TOC4" href="#SEC4">UTF-8 AND UNICODE PROPERTY SUPPORT</a>
<li><a name="TOC5" href="#SEC5">AUTHOR</a>
<li><a name="TOC6" href="#SEC6">REVISION</a>
</ul>
<br><a name="SEC1" href="#TOC1">INTRODUCTION</a><br>
<P>
The PCRE library is a set of functions that implement regular expression
pattern matching using the same syntax and semantics as Perl, with just a few
differences. Some features that appeared in Python and PCRE before they
appeared in Perl are also available using the Python syntax, there is some
support for one or two .NET and Oniguruma syntax items, and there is an option
for requesting some minor changes that give better JavaScript compatibility.
</P>
<P>
The current implementation of PCRE corresponds approximately with Perl 5.10,
including support for UTF-8 encoded strings and Unicode general category
properties. However, UTF-8 and Unicode support has to be explicitly enabled; it
is not the default. The Unicode tables correspond to Unicode release 5.2.0.
</P>
<P>
In addition to the Perl-compatible matching function, PCRE contains an
alternative function that matches the same compiled patterns in a different
way. In certain circumstances, the alternative function has some advantages.
For a discussion of the two matching algorithms, see the
<a href="pcrematching.html"><b>pcrematching</b></a>
page.
</P>
<P>
PCRE is written in C and released as a C library. A number of people have
written wrappers and interfaces of various kinds. In particular, Google Inc.
have provided a comprehensive C++ wrapper. This is now included as part of the
PCRE distribution. The
<a href="pcrecpp.html"><b>pcrecpp</b></a>
page has details of this interface. Other people's contributions can be found
in the <i>Contrib</i> directory at the primary FTP site, which is:
<a href="ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre">ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre</a>
</P>
<P>
Details of exactly which Perl regular expression features are and are not
supported by PCRE are given in separate documents. See the
<a href="pcrepattern.html"><b>pcrepattern</b></a>
and
<a href="pcrecompat.html"><b>pcrecompat</b></a>
pages. There is a syntax summary in the
<a href="pcresyntax.html"><b>pcresyntax</b></a>
page.
</P>
<P>
Some features of PCRE can be included, excluded, or changed when the library is
built. The
<a href="pcre_config.html"><b>pcre_config()</b></a>
function makes it possible for a client to discover which features are
available. The features themselves are described in the
<a href="pcrebuild.html"><b>pcrebuild</b></a>
page. Documentation about building PCRE for various operating systems can be
found in the <b>README</b> and <b>NON-UNIX-USE</b> files in the source
distribution.
</P>
<P>
The library contains a number of undocumented internal functions and data
tables that are used by more than one of the exported external functions, but
which are not intended for use by external callers. Their names all begin with
"_pcre_", which hopefully will not provoke any name clashes. In some
environments, it is possible to control which external symbols are exported
when a shared library is built, and in these cases the undocumented symbols are
not exported.
</P>
<br><a name="SEC2" href="#TOC1">USER DOCUMENTATION</a><br>
<P>
The user documentation for PCRE comprises a number of different sections. In
the "man" format, each of these is a separate "man page". In the HTML format,
each is a separate page, linked from the index page. In the plain text format,
all the sections, except the <b>pcredemo</b> section, are concatenated, for ease
of searching. The sections are as follows:
<pre>
  pcre              this document
  pcre-config       show PCRE installation configuration information
  pcreapi           details of PCRE's native C API
  pcrebuild         options for building PCRE
  pcrecallout       details of the callout feature
  pcrecompat        discussion of Perl compatibility
  pcrecpp           details of the C++ wrapper
  pcredemo          a demonstration C program that uses PCRE
  pcregrep          description of the <b>pcregrep</b> command
  pcrematching      discussion of the two matching algorithms
  pcrepartial       details of the partial matching facility
  pcrepattern       syntax and semantics of supported regular expressions
  pcreperform       discussion of performance issues
  pcreposix         the POSIX-compatible C API
  pcreprecompile    details of saving and re-using precompiled patterns
  pcresample        discussion of the pcredemo program
  pcrestack         discussion of stack usage
  pcresyntax        quick syntax reference
  pcretest          description of the <b>pcretest</b> testing command
</pre>
In addition, in the "man" and HTML formats, there is a short page for each
C library function, listing its arguments and results.
</P>
<br><a name="SEC3" href="#TOC1">LIMITATIONS</a><br>
<P>
There are some size limitations in PCRE but it is hoped that they will never in
practice be relevant.
</P>
<P>
The maximum length of a compiled pattern is 65539 (sic) bytes if PCRE is
compiled with the default internal linkage size of 2. If you want to process
regular expressions that are truly enormous, you can compile PCRE with an
internal linkage size of 3 or 4 (see the <b>README</b> file in the source
distribution and the
<a href="pcrebuild.html"><b>pcrebuild</b></a>
documentation for details). In these cases the limit is substantially larger.
However, the speed of execution is slower.
</P>
<P>
All values in repeating quantifiers must be less than 65536.
</P>
<P>
There is no limit to the number of parenthesized subpatterns, but there can be
no more than 65535 capturing subpatterns.
</P>
<P>
The maximum length of name for a named subpattern is 32 characters, and the
maximum number of named subpatterns is 10000.
</P>
<P>
The maximum length of a subject string is the largest positive number that an
integer variable can hold. However, when using the traditional matching
function, PCRE uses recursion to handle subpatterns and indefinite repetition.
This means that the available stack space may limit the size of a subject
string that can be processed by certain patterns. For a discussion of stack
issues, see the
<a href="pcrestack.html"><b>pcrestack</b></a>
documentation.
<a name="utf8support"></a></P>
<br><a name="SEC4" href="#TOC1">UTF-8 AND UNICODE PROPERTY SUPPORT</a><br>
<P>
From release 3.3, PCRE has had some support for character strings encoded in
the UTF-8 format. For release 4.0 this was greatly extended to cover most
common requirements, and in release 5.0 additional support for Unicode general
category properties was added.
</P>
<P>
In order process UTF-8 strings, you must build PCRE to include UTF-8 support in
the code, and, in addition, you must call
<a href="pcre_compile.html"><b>pcre_compile()</b></a>
with the PCRE_UTF8 option flag, or the pattern must start with the sequence
(*UTF8). When either of these is the case, both the pattern and any subject
strings that are matched against it are treated as UTF-8 strings instead of
strings of 1-byte characters.
</P>
<P>
If you compile PCRE with UTF-8 support, but do not use it at run time, the
library will be a bit bigger, but the additional run time overhead is limited
to testing the PCRE_UTF8 flag occasionally, so should not be very big.
</P>
<P>
If PCRE is built with Unicode character property support (which implies UTF-8
support), the escape sequences \p{..}, \P{..}, and \X are supported.
The available properties that can be tested are limited to the general
category properties such as Lu for an upper case letter or Nd for a decimal
number, the Unicode script names such as Arabic or Han, and the derived
properties Any and L&. A full list is given in the
<a href="pcrepattern.html"><b>pcrepattern</b></a>
documentation. Only the short names for properties are supported. For example,
\p{L} matches a letter. Its Perl synonym, \p{Letter}, is not supported.
Furthermore, in Perl, many properties may optionally be prefixed by "Is", for
compatibility with Perl 5.6. PCRE does not support this.
<a name="utf8strings"></a></P>
<br><b>
Validity of UTF-8 strings
</b><br>
<P>
When you set the PCRE_UTF8 flag, the strings passed as patterns and subjects
are (by default) checked for validity on entry to the relevant functions. From
release 7.3 of PCRE, the check is according the rules of RFC 3629, which are
themselves derived from the Unicode specification. Earlier releases of PCRE
followed the rules of RFC 2279, which allows the full range of 31-bit values (0
to 0x7FFFFFFF). The current check allows only values in the range U+0 to
U+10FFFF, excluding U+D800 to U+DFFF.
</P>
<P>
The excluded code points are the "Low Surrogate Area" of Unicode, of which the
Unicode Standard says this: "The Low Surrogate Area does not contain any
character assignments, consequently no character code charts or namelists are
provided for this area. Surrogates are reserved for use with UTF-16 and then
must be used in pairs." The code points that are encoded by UTF-16 pairs are
available as independent code points in the UTF-8 encoding. (In other words,
the whole surrogate thing is a fudge for UTF-16 which unfortunately messes up
UTF-8.)
</P>
<P>
If an invalid UTF-8 string is passed to PCRE, an error return
(PCRE_ERROR_BADUTF8) is given. In some situations, you may already know that
your strings are valid, and therefore want to skip these checks in order to
improve performance. If you set the PCRE_NO_UTF8_CHECK flag at compile time or
at run time, PCRE assumes that the pattern or subject it is given
(respectively) contains only valid UTF-8 codes. In this case, it does not
diagnose an invalid UTF-8 string.
</P>
<P>
If you pass an invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set, what
happens depends on why the string is invalid. If the string conforms to the
"old" definition of UTF-8 (RFC 2279), it is processed as a string of characters
in the range 0 to 0x7FFFFFFF. In other words, apart from the initial validity
test, PCRE (when in UTF-8 mode) handles strings according to the more liberal
rules of RFC 2279. However, if the string does not even conform to RFC 2279,
the result is undefined. Your program may crash.
</P>
<P>
If you want to process strings of values in the full range 0 to 0x7FFFFFFF,
encoded in a UTF-8-like manner as per the old RFC, you can set
PCRE_NO_UTF8_CHECK to bypass the more restrictive test. However, in this
situation, you will have to apply your own validity check.
</P>
<br><b>
General comments about UTF-8 mode
</b><br>
<P>
1. An unbraced hexadecimal escape sequence (such as \xb3) matches a two-byte
UTF-8 character if the value is greater than 127.
</P>
<P>
2. Octal numbers up to \777 are recognized, and match two-byte UTF-8
characters for values greater than \177.
</P>
<P>
3. Repeat quantifiers apply to complete UTF-8 characters, not to individual
bytes, for example: \x{100}{3}.
</P>
<P>
4. The dot metacharacter matches one UTF-8 character instead of a single byte.
</P>
<P>
5. The escape sequence \C can be used to match a single byte in UTF-8 mode,
but its use can lead to some strange effects. This facility is not available in
the alternative matching function, <b>pcre_dfa_exec()</b>.
</P>
<P>
6. The character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly
test characters of any code value, but the characters that PCRE recognizes as
digits, spaces, or word characters remain the same set as before, all with
values less than 256. This remains true even when PCRE includes Unicode
property support, because to do otherwise would slow down PCRE in many common
cases. If you really want to test for a wider sense of, say, "digit", you
must use Unicode property tests such as \p{Nd}. Note that this also applies to
\b, because it is defined in terms of \w and \W.
</P>
<P>
7. Similarly, characters that match the POSIX named character classes are all
low-valued characters.
</P>
<P>
8. However, the Perl 5.10 horizontal and vertical whitespace matching escapes
(\h, \H, \v, and \V) do match all the appropriate Unicode characters.
</P>
<P>
9. Case-insensitive matching applies only to characters whose values are less
than 128, unless PCRE is built with Unicode property support. Even when Unicode
property support is available, PCRE still uses its own character tables when
checking the case of low-valued characters, so as not to degrade performance.
The Unicode property information is used only for characters with higher
values. Even when Unicode property support is available, PCRE supports
case-insensitive matching only when there is a one-to-one mapping between a
letter's cases. There are a small number of many-to-one mappings in Unicode;
these are not supported by PCRE.
</P>
<br><a name="SEC5" href="#TOC1">AUTHOR</a><br>
<P>
Philip Hazel
<br>
University Computing Service
<br>
Cambridge CB2 3QH, England.
<br>
</P>
<P>
Putting an actual email address here seems to have been a spam magnet, so I've
taken it away. If you want to email me, use my two initials, followed by the
two digits 10, at the domain cam.ac.uk.
</P>
<br><a name="SEC6" href="#TOC1">REVISION</a><br>
<P>
Last updated: 01 March 2010
<br>
Copyright &copy; 1997-2010 University of Cambridge.
<br>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[�9r9r'doc/alt-pcre802-devel/html/pcreapi.htmlnu�[���<html>
<head>
<title>pcreapi specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcreapi man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<ul>
<li><a name="TOC1" href="#SEC1">PCRE NATIVE API</a>
<li><a name="TOC2" href="#SEC2">PCRE API OVERVIEW</a>
<li><a name="TOC3" href="#SEC3">NEWLINES</a>
<li><a name="TOC4" href="#SEC4">MULTITHREADING</a>
<li><a name="TOC5" href="#SEC5">SAVING PRECOMPILED PATTERNS FOR LATER USE</a>
<li><a name="TOC6" href="#SEC6">CHECKING BUILD-TIME OPTIONS</a>
<li><a name="TOC7" href="#SEC7">COMPILING A PATTERN</a>
<li><a name="TOC8" href="#SEC8">COMPILATION ERROR CODES</a>
<li><a name="TOC9" href="#SEC9">STUDYING A PATTERN</a>
<li><a name="TOC10" href="#SEC10">LOCALE SUPPORT</a>
<li><a name="TOC11" href="#SEC11">INFORMATION ABOUT A PATTERN</a>
<li><a name="TOC12" href="#SEC12">OBSOLETE INFO FUNCTION</a>
<li><a name="TOC13" href="#SEC13">REFERENCE COUNTS</a>
<li><a name="TOC14" href="#SEC14">MATCHING A PATTERN: THE TRADITIONAL FUNCTION</a>
<li><a name="TOC15" href="#SEC15">EXTRACTING CAPTURED SUBSTRINGS BY NUMBER</a>
<li><a name="TOC16" href="#SEC16">EXTRACTING CAPTURED SUBSTRINGS BY NAME</a>
<li><a name="TOC17" href="#SEC17">DUPLICATE SUBPATTERN NAMES</a>
<li><a name="TOC18" href="#SEC18">FINDING ALL POSSIBLE MATCHES</a>
<li><a name="TOC19" href="#SEC19">MATCHING A PATTERN: THE ALTERNATIVE FUNCTION</a>
<li><a name="TOC20" href="#SEC20">SEE ALSO</a>
<li><a name="TOC21" href="#SEC21">AUTHOR</a>
<li><a name="TOC22" href="#SEC22">REVISION</a>
</ul>
<br><a name="SEC1" href="#TOC1">PCRE NATIVE API</a><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>pcre *pcre_compile(const char *<i>pattern</i>, int <i>options</i>,</b>
<b>const char **<i>errptr</i>, int *<i>erroffset</i>,</b>
<b>const unsigned char *<i>tableptr</i>);</b>
</P>
<P>
<b>pcre *pcre_compile2(const char *<i>pattern</i>, int <i>options</i>,</b>
<b>int *<i>errorcodeptr</i>,</b>
<b>const char **<i>errptr</i>, int *<i>erroffset</i>,</b>
<b>const unsigned char *<i>tableptr</i>);</b>
</P>
<P>
<b>pcre_extra *pcre_study(const pcre *<i>code</i>, int <i>options</i>,</b>
<b>const char **<i>errptr</i>);</b>
</P>
<P>
<b>int pcre_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
<b>const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
<b>int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>);</b>
</P>
<P>
<b>int pcre_dfa_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
<b>const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
<b>int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>
<b>int *<i>workspace</i>, int <i>wscount</i>);</b>
</P>
<P>
<b>int pcre_copy_named_substring(const pcre *<i>code</i>,</b>
<b>const char *<i>subject</i>, int *<i>ovector</i>,</b>
<b>int <i>stringcount</i>, const char *<i>stringname</i>,</b>
<b>char *<i>buffer</i>, int <i>buffersize</i>);</b>
</P>
<P>
<b>int pcre_copy_substring(const char *<i>subject</i>, int *<i>ovector</i>,</b>
<b>int <i>stringcount</i>, int <i>stringnumber</i>, char *<i>buffer</i>,</b>
<b>int <i>buffersize</i>);</b>
</P>
<P>
<b>int pcre_get_named_substring(const pcre *<i>code</i>,</b>
<b>const char *<i>subject</i>, int *<i>ovector</i>,</b>
<b>int <i>stringcount</i>, const char *<i>stringname</i>,</b>
<b>const char **<i>stringptr</i>);</b>
</P>
<P>
<b>int pcre_get_stringnumber(const pcre *<i>code</i>,</b>
<b>const char *<i>name</i>);</b>
</P>
<P>
<b>int pcre_get_stringtable_entries(const pcre *<i>code</i>,</b>
<b>const char *<i>name</i>, char **<i>first</i>, char **<i>last</i>);</b>
</P>
<P>
<b>int pcre_get_substring(const char *<i>subject</i>, int *<i>ovector</i>,</b>
<b>int <i>stringcount</i>, int <i>stringnumber</i>,</b>
<b>const char **<i>stringptr</i>);</b>
</P>
<P>
<b>int pcre_get_substring_list(const char *<i>subject</i>,</b>
<b>int *<i>ovector</i>, int <i>stringcount</i>, const char ***<i>listptr</i>);</b>
</P>
<P>
<b>void pcre_free_substring(const char *<i>stringptr</i>);</b>
</P>
<P>
<b>void pcre_free_substring_list(const char **<i>stringptr</i>);</b>
</P>
<P>
<b>const unsigned char *pcre_maketables(void);</b>
</P>
<P>
<b>int pcre_fullinfo(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
<b>int <i>what</i>, void *<i>where</i>);</b>
</P>
<P>
<b>int pcre_info(const pcre *<i>code</i>, int *<i>optptr</i>, int</b>
<b>*<i>firstcharptr</i>);</b>
</P>
<P>
<b>int pcre_refcount(pcre *<i>code</i>, int <i>adjust</i>);</b>
</P>
<P>
<b>int pcre_config(int <i>what</i>, void *<i>where</i>);</b>
</P>
<P>
<b>char *pcre_version(void);</b>
</P>
<P>
<b>void *(*pcre_malloc)(size_t);</b>
</P>
<P>
<b>void (*pcre_free)(void *);</b>
</P>
<P>
<b>void *(*pcre_stack_malloc)(size_t);</b>
</P>
<P>
<b>void (*pcre_stack_free)(void *);</b>
</P>
<P>
<b>int (*pcre_callout)(pcre_callout_block *);</b>
</P>
<br><a name="SEC2" href="#TOC1">PCRE API OVERVIEW</a><br>
<P>
PCRE has its own native API, which is described in this document. There are
also some wrapper functions that correspond to the POSIX regular expression
API. These are described in the
<a href="pcreposix.html"><b>pcreposix</b></a>
documentation. Both of these APIs define a set of C function calls. A C++
wrapper is distributed with PCRE. It is documented in the
<a href="pcrecpp.html"><b>pcrecpp</b></a>
page.
</P>
<P>
The native API C function prototypes are defined in the header file
<b>pcre.h</b>, and on Unix systems the library itself is called <b>libpcre</b>.
It can normally be accessed by adding <b>-lpcre</b> to the command for linking
an application that uses PCRE. The header file defines the macros PCRE_MAJOR
and PCRE_MINOR to contain the major and minor release numbers for the library.
Applications can use these to include support for different releases of PCRE.
</P>
<P>
The functions <b>pcre_compile()</b>, <b>pcre_compile2()</b>, <b>pcre_study()</b>,
and <b>pcre_exec()</b> are used for compiling and matching regular expressions
in a Perl-compatible manner. A sample program that demonstrates the simplest
way of using them is provided in the file called <i>pcredemo.c</i> in the PCRE
source distribution. A listing of this program is given in the
<a href="pcredemo.html"><b>pcredemo</b></a>
documentation, and the
<a href="pcresample.html"><b>pcresample</b></a>
documentation describes how to compile and run it.
</P>
<P>
A second matching function, <b>pcre_dfa_exec()</b>, which is not
Perl-compatible, is also provided. This uses a different algorithm for the
matching. The alternative algorithm finds all possible matches (at a given
point in the subject), and scans the subject just once (unless there are
lookbehind assertions). However, this algorithm does not return captured
substrings. A description of the two matching algorithms and their advantages
and disadvantages is given in the
<a href="pcrematching.html"><b>pcrematching</b></a>
documentation.
</P>
<P>
In addition to the main compiling and matching functions, there are convenience
functions for extracting captured substrings from a subject string that is
matched by <b>pcre_exec()</b>. They are:
<pre>
  <b>pcre_copy_substring()</b>
  <b>pcre_copy_named_substring()</b>
  <b>pcre_get_substring()</b>
  <b>pcre_get_named_substring()</b>
  <b>pcre_get_substring_list()</b>
  <b>pcre_get_stringnumber()</b>
  <b>pcre_get_stringtable_entries()</b>
</pre>
<b>pcre_free_substring()</b> and <b>pcre_free_substring_list()</b> are also
provided, to free the memory used for extracted strings.
</P>
<P>
The function <b>pcre_maketables()</b> is used to build a set of character tables
in the current locale for passing to <b>pcre_compile()</b>, <b>pcre_exec()</b>,
or <b>pcre_dfa_exec()</b>. This is an optional facility that is provided for
specialist use. Most commonly, no special tables are passed, in which case
internal tables that are generated when PCRE is built are used.
</P>
<P>
The function <b>pcre_fullinfo()</b> is used to find out information about a
compiled pattern; <b>pcre_info()</b> is an obsolete version that returns only
some of the available information, but is retained for backwards compatibility.
The function <b>pcre_version()</b> returns a pointer to a string containing the
version of PCRE and its date of release.
</P>
<P>
The function <b>pcre_refcount()</b> maintains a reference count in a data block
containing a compiled pattern. This is provided for the benefit of
object-oriented applications.
</P>
<P>
The global variables <b>pcre_malloc</b> and <b>pcre_free</b> initially contain
the entry points of the standard <b>malloc()</b> and <b>free()</b> functions,
respectively. PCRE calls the memory management functions via these variables,
so a calling program can replace them if it wishes to intercept the calls. This
should be done before calling any PCRE functions.
</P>
<P>
The global variables <b>pcre_stack_malloc</b> and <b>pcre_stack_free</b> are also
indirections to memory management functions. These special functions are used
only when PCRE is compiled to use the heap for remembering data, instead of
recursive function calls, when running the <b>pcre_exec()</b> function. See the
<a href="pcrebuild.html"><b>pcrebuild</b></a>
documentation for details of how to do this. It is a non-standard way of
building PCRE, for use in environments that have limited stacks. Because of the
greater use of memory management, it runs more slowly. Separate functions are
provided so that special-purpose external code can be used for this case. When
used, these functions are always called in a stack-like manner (last obtained,
first freed), and always for memory blocks of the same size. There is a
discussion about PCRE's stack usage in the
<a href="pcrestack.html"><b>pcrestack</b></a>
documentation.
</P>
<P>
The global variable <b>pcre_callout</b> initially contains NULL. It can be set
by the caller to a "callout" function, which PCRE will then call at specified
points during a matching operation. Details are given in the
<a href="pcrecallout.html"><b>pcrecallout</b></a>
documentation.
<a name="newlines"></a></P>
<br><a name="SEC3" href="#TOC1">NEWLINES</a><br>
<P>
PCRE supports five different conventions for indicating line breaks in
strings: a single CR (carriage return) character, a single LF (linefeed)
character, the two-character sequence CRLF, any of the three preceding, or any
Unicode newline sequence. The Unicode newline sequences are the three just
mentioned, plus the single characters VT (vertical tab, U+000B), FF (formfeed,
U+000C), NEL (next line, U+0085), LS (line separator, U+2028), and PS
(paragraph separator, U+2029).
</P>
<P>
Each of the first three conventions is used by at least one operating system as
its standard newline sequence. When PCRE is built, a default can be specified.
The default default is LF, which is the Unix standard. When PCRE is run, the
default can be overridden, either when a pattern is compiled, or when it is
matched.
</P>
<P>
At compile time, the newline convention can be specified by the <i>options</i>
argument of <b>pcre_compile()</b>, or it can be specified by special text at the
start of the pattern itself; this overrides any other settings. See the
<a href="pcrepattern.html"><b>pcrepattern</b></a>
page for details of the special character sequences.
</P>
<P>
In the PCRE documentation the word "newline" is used to mean "the character or
pair of characters that indicate a line break". The choice of newline
convention affects the handling of the dot, circumflex, and dollar
metacharacters, the handling of #-comments in /x mode, and, when CRLF is a
recognized line ending sequence, the match position advancement for a
non-anchored pattern. There is more detail about this in the
<a href="#execoptions">section on <b>pcre_exec()</b> options</a>
below.
</P>
<P>
The choice of newline convention does not affect the interpretation of
the \n or \r escape sequences, nor does it affect what \R matches, which is
controlled in a similar way, but by separate options.
</P>
<br><a name="SEC4" href="#TOC1">MULTITHREADING</a><br>
<P>
The PCRE functions can be used in multi-threading applications, with the
proviso that the memory management functions pointed to by <b>pcre_malloc</b>,
<b>pcre_free</b>, <b>pcre_stack_malloc</b>, and <b>pcre_stack_free</b>, and the
callout function pointed to by <b>pcre_callout</b>, are shared by all threads.
</P>
<P>
The compiled form of a regular expression is not altered during matching, so
the same compiled pattern can safely be used by several threads at once.
</P>
<br><a name="SEC5" href="#TOC1">SAVING PRECOMPILED PATTERNS FOR LATER USE</a><br>
<P>
The compiled form of a regular expression can be saved and re-used at a later
time, possibly by a different program, and even on a host other than the one on
which it was compiled. Details are given in the
<a href="pcreprecompile.html"><b>pcreprecompile</b></a>
documentation. However, compiling a regular expression with one version of PCRE
for use with a different version is not guaranteed to work and may cause
crashes.
</P>
<br><a name="SEC6" href="#TOC1">CHECKING BUILD-TIME OPTIONS</a><br>
<P>
<b>int pcre_config(int <i>what</i>, void *<i>where</i>);</b>
</P>
<P>
The function <b>pcre_config()</b> makes it possible for a PCRE client to
discover which optional features have been compiled into the PCRE library. The
<a href="pcrebuild.html"><b>pcrebuild</b></a>
documentation has more details about these optional features.
</P>
<P>
The first argument for <b>pcre_config()</b> is an integer, specifying which
information is required; the second argument is a pointer to a variable into
which the information is placed. The following information is available:
<pre>
  PCRE_CONFIG_UTF8
</pre>
The output is an integer that is set to one if UTF-8 support is available;
otherwise it is set to zero.
<pre>
  PCRE_CONFIG_UNICODE_PROPERTIES
</pre>
The output is an integer that is set to one if support for Unicode character
properties is available; otherwise it is set to zero.
<pre>
  PCRE_CONFIG_NEWLINE
</pre>
The output is an integer whose value specifies the default character sequence
that is recognized as meaning "newline". The four values that are supported
are: 10 for LF, 13 for CR, 3338 for CRLF, -2 for ANYCRLF, and -1 for ANY.
Though they are derived from ASCII, the same values are returned in EBCDIC
environments. The default should normally correspond to the standard sequence
for your operating system.
<pre>
  PCRE_CONFIG_BSR
</pre>
The output is an integer whose value indicates what character sequences the \R
escape sequence matches by default. A value of 0 means that \R matches any
Unicode line ending sequence; a value of 1 means that \R matches only CR, LF,
or CRLF. The default can be overridden when a pattern is compiled or matched.
<pre>
  PCRE_CONFIG_LINK_SIZE
</pre>
The output is an integer that contains the number of bytes used for internal
linkage in compiled regular expressions. The value is 2, 3, or 4. Larger values
allow larger regular expressions to be compiled, at the expense of slower
matching. The default value of 2 is sufficient for all but the most massive
patterns, since it allows the compiled pattern to be up to 64K in size.
<pre>
  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
</pre>
The output is an integer that contains the threshold above which the POSIX
interface uses <b>malloc()</b> for output vectors. Further details are given in
the
<a href="pcreposix.html"><b>pcreposix</b></a>
documentation.
<pre>
  PCRE_CONFIG_MATCH_LIMIT
</pre>
The output is a long integer that gives the default limit for the number of
internal matching function calls in a <b>pcre_exec()</b> execution. Further
details are given with <b>pcre_exec()</b> below.
<pre>
  PCRE_CONFIG_MATCH_LIMIT_RECURSION
</pre>
The output is a long integer that gives the default limit for the depth of
recursion when calling the internal matching function in a <b>pcre_exec()</b>
execution. Further details are given with <b>pcre_exec()</b> below.
<pre>
  PCRE_CONFIG_STACKRECURSE
</pre>
The output is an integer that is set to one if internal recursion when running
<b>pcre_exec()</b> is implemented by recursive function calls that use the stack
to remember their state. This is the usual way that PCRE is compiled. The
output is zero if PCRE was compiled to use blocks of data on the heap instead
of recursive function calls. In this case, <b>pcre_stack_malloc</b> and
<b>pcre_stack_free</b> are called to manage memory blocks on the heap, thus
avoiding the use of the stack.
</P>
<br><a name="SEC7" href="#TOC1">COMPILING A PATTERN</a><br>
<P>
<b>pcre *pcre_compile(const char *<i>pattern</i>, int <i>options</i>,</b>
<b>const char **<i>errptr</i>, int *<i>erroffset</i>,</b>
<b>const unsigned char *<i>tableptr</i>);</b>
<b>pcre *pcre_compile2(const char *<i>pattern</i>, int <i>options</i>,</b>
<b>int *<i>errorcodeptr</i>,</b>
<b>const char **<i>errptr</i>, int *<i>erroffset</i>,</b>
<b>const unsigned char *<i>tableptr</i>);</b>
</P>
<P>
Either of the functions <b>pcre_compile()</b> or <b>pcre_compile2()</b> can be
called to compile a pattern into an internal form. The only difference between
the two interfaces is that <b>pcre_compile2()</b> has an additional argument,
<i>errorcodeptr</i>, via which a numerical error code can be returned. To avoid
too much repetition, we refer just to <b>pcre_compile()</b> below, but the
information applies equally to <b>pcre_compile2()</b>.
</P>
<P>
The pattern is a C string terminated by a binary zero, and is passed in the
<i>pattern</i> argument. A pointer to a single block of memory that is obtained
via <b>pcre_malloc</b> is returned. This contains the compiled code and related
data. The <b>pcre</b> type is defined for the returned block; this is a typedef
for a structure whose contents are not externally defined. It is up to the
caller to free the memory (via <b>pcre_free</b>) when it is no longer required.
</P>
<P>
Although the compiled code of a PCRE regex is relocatable, that is, it does not
depend on memory location, the complete <b>pcre</b> data block is not
fully relocatable, because it may contain a copy of the <i>tableptr</i>
argument, which is an address (see below).
</P>
<P>
The <i>options</i> argument contains various bit settings that affect the
compilation. It should be zero if no options are required. The available
options are described below. Some of them (in particular, those that are
compatible with Perl, but some others as well) can also be set and unset from
within the pattern (see the detailed description in the
<a href="pcrepattern.html"><b>pcrepattern</b></a>
documentation). For those options that can be different in different parts of
the pattern, the contents of the <i>options</i> argument specifies their
settings at the start of compilation and execution. The PCRE_ANCHORED,
PCRE_BSR_<i>xxx</i>, and PCRE_NEWLINE_<i>xxx</i> options can be set at the time
of matching as well as at compile time.
</P>
<P>
If <i>errptr</i> is NULL, <b>pcre_compile()</b> returns NULL immediately.
Otherwise, if compilation of a pattern fails, <b>pcre_compile()</b> returns
NULL, and sets the variable pointed to by <i>errptr</i> to point to a textual
error message. This is a static string that is part of the library. You must
not try to free it. The byte offset from the start of the pattern to the
character that was being processed when the error was discovered is placed in
the variable pointed to by <i>erroffset</i>, which must not be NULL. If it is,
an immediate error is given. Some errors are not detected until checks are
carried out when the whole pattern has been scanned; in this case the offset is
set to the end of the pattern.
</P>
<P>
If <b>pcre_compile2()</b> is used instead of <b>pcre_compile()</b>, and the
<i>errorcodeptr</i> argument is not NULL, a non-zero error code number is
returned via this argument in the event of an error. This is in addition to the
textual error message. Error codes and messages are listed below.
</P>
<P>
If the final argument, <i>tableptr</i>, is NULL, PCRE uses a default set of
character tables that are built when PCRE is compiled, using the default C
locale. Otherwise, <i>tableptr</i> must be an address that is the result of a
call to <b>pcre_maketables()</b>. This value is stored with the compiled
pattern, and used again by <b>pcre_exec()</b>, unless another table pointer is
passed to it. For more discussion, see the section on locale support below.
</P>
<P>
This code fragment shows a typical straightforward call to <b>pcre_compile()</b>:
<pre>
  pcre *re;
  const char *error;
  int erroffset;
  re = pcre_compile(
    "^A.*Z",          /* the pattern */
    0,                /* default options */
    &error,           /* for error message */
    &erroffset,       /* for error offset */
    NULL);            /* use default character tables */
</pre>
The following names for option bits are defined in the <b>pcre.h</b> header
file:
<pre>
  PCRE_ANCHORED
</pre>
If this bit is set, the pattern is forced to be "anchored", that is, it is
constrained to match only at the first matching point in the string that is
being searched (the "subject string"). This effect can also be achieved by
appropriate constructs in the pattern itself, which is the only way to do it in
Perl.
<pre>
  PCRE_AUTO_CALLOUT
</pre>
If this bit is set, <b>pcre_compile()</b> automatically inserts callout items,
all with number 255, before each pattern item. For discussion of the callout
facility, see the
<a href="pcrecallout.html"><b>pcrecallout</b></a>
documentation.
<pre>
  PCRE_BSR_ANYCRLF
  PCRE_BSR_UNICODE
</pre>
These options (which are mutually exclusive) control what the \R escape
sequence matches. The choice is either to match only CR, LF, or CRLF, or to
match any Unicode newline sequence. The default is specified when PCRE is
built. It can be overridden from within the pattern, or by setting an option
when a compiled pattern is matched.
<pre>
  PCRE_CASELESS
</pre>
If this bit is set, letters in the pattern match both upper and lower case
letters. It is equivalent to Perl's /i option, and it can be changed within a
pattern by a (?i) option setting. In UTF-8 mode, PCRE always understands the
concept of case for characters whose values are less than 128, so caseless
matching is always possible. For characters with higher values, the concept of
case is supported if PCRE is compiled with Unicode property support, but not
otherwise. If you want to use caseless matching for characters 128 and above,
you must ensure that PCRE is compiled with Unicode property support as well as
with UTF-8 support.
<pre>
  PCRE_DOLLAR_ENDONLY
</pre>
If this bit is set, a dollar metacharacter in the pattern matches only at the
end of the subject string. Without this option, a dollar also matches
immediately before a newline at the end of the string (but not before any other
newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is set.
There is no equivalent to this option in Perl, and no way to set it within a
pattern.
<pre>
  PCRE_DOTALL
</pre>
If this bit is set, a dot metacharater in the pattern matches all characters,
including those that indicate newline. Without it, a dot does not match when
the current position is at a newline. This option is equivalent to Perl's /s
option, and it can be changed within a pattern by a (?s) option setting. A
negative class such as [^a] always matches newline characters, independent of
the setting of this option.
<pre>
  PCRE_DUPNAMES
</pre>
If this bit is set, names used to identify capturing subpatterns need not be
unique. This can be helpful for certain types of pattern when it is known that
only one instance of the named subpattern can ever be matched. There are more
details of named subpatterns below; see also the
<a href="pcrepattern.html"><b>pcrepattern</b></a>
documentation.
<pre>
  PCRE_EXTENDED
</pre>
If this bit is set, whitespace data characters in the pattern are totally
ignored except when escaped or inside a character class. Whitespace does not
include the VT character (code 11). In addition, characters between an
unescaped # outside a character class and the next newline, inclusive, are also
ignored. This is equivalent to Perl's /x option, and it can be changed within a
pattern by a (?x) option setting.
</P>
<P>
This option makes it possible to include comments inside complicated patterns.
Note, however, that this applies only to data characters. Whitespace characters
may never appear within special character sequences in a pattern, for example
within the sequence (?( which introduces a conditional subpattern.
<pre>
  PCRE_EXTRA
</pre>
This option was invented in order to turn on additional functionality of PCRE
that is incompatible with Perl, but it is currently of very little use. When
set, any backslash in a pattern that is followed by a letter that has no
special meaning causes an error, thus reserving these combinations for future
expansion. By default, as in Perl, a backslash followed by a letter with no
special meaning is treated as a literal. (Perl can, however, be persuaded to
give a warning for this.) There are at present no other features controlled by
this option. It can also be set by a (?X) option setting within a pattern.
<pre>
  PCRE_FIRSTLINE
</pre>
If this option is set, an unanchored pattern is required to match before or at
the first newline in the subject string, though the matched text may continue
over the newline.
<pre>
  PCRE_JAVASCRIPT_COMPAT
</pre>
If this option is set, PCRE's behaviour is changed in some ways so that it is
compatible with JavaScript rather than Perl. The changes are as follows:
</P>
<P>
(1) A lone closing square bracket in a pattern causes a compile-time error,
because this is illegal in JavaScript (by default it is treated as a data
character). Thus, the pattern AB]CD becomes illegal when this option is set.
</P>
<P>
(2) At run time, a back reference to an unset subpattern group matches an empty
string (by default this causes the current matching alternative to fail). A
pattern such as (\1)(a) succeeds when this option is set (assuming it can find
an "a" in the subject), whereas it fails by default, for Perl compatibility.
<pre>
  PCRE_MULTILINE
</pre>
By default, PCRE treats the subject string as consisting of a single line of
characters (even if it actually contains newlines). The "start of line"
metacharacter (^) matches only at the start of the string, while the "end of
line" metacharacter ($) matches only at the end of the string, or before a
terminating newline (unless PCRE_DOLLAR_ENDONLY is set). This is the same as
Perl.
</P>
<P>
When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs
match immediately following or immediately before internal newlines in the
subject string, respectively, as well as at the very start and end. This is
equivalent to Perl's /m option, and it can be changed within a pattern by a
(?m) option setting. If there are no newlines in a subject string, or no
occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no effect.
<pre>
  PCRE_NEWLINE_CR
  PCRE_NEWLINE_LF
  PCRE_NEWLINE_CRLF
  PCRE_NEWLINE_ANYCRLF
  PCRE_NEWLINE_ANY
</pre>
These options override the default newline definition that was chosen when PCRE
was built. Setting the first or the second specifies that a newline is
indicated by a single character (CR or LF, respectively). Setting
PCRE_NEWLINE_CRLF specifies that a newline is indicated by the two-character
CRLF sequence. Setting PCRE_NEWLINE_ANYCRLF specifies that any of the three
preceding sequences should be recognized. Setting PCRE_NEWLINE_ANY specifies
that any Unicode newline sequence should be recognized. The Unicode newline
sequences are the three just mentioned, plus the single characters VT (vertical
tab, U+000B), FF (formfeed, U+000C), NEL (next line, U+0085), LS (line
separator, U+2028), and PS (paragraph separator, U+2029). The last two are
recognized only in UTF-8 mode.
</P>
<P>
The newline setting in the options word uses three bits that are treated
as a number, giving eight possibilities. Currently only six are used (default
plus the five values above). This means that if you set more than one newline
option, the combination may or may not be sensible. For example,
PCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to PCRE_NEWLINE_CRLF, but
other combinations may yield unused numbers and cause an error.
</P>
<P>
The only time that a line break is specially recognized when compiling a
pattern is if PCRE_EXTENDED is set, and an unescaped # outside a character
class is encountered. This indicates a comment that lasts until after the next
line break sequence. In other circumstances, line break sequences are treated
as literal data, except that in PCRE_EXTENDED mode, both CR and LF are treated
as whitespace characters and are therefore ignored.
</P>
<P>
The newline option that is set at compile time becomes the default that is used
for <b>pcre_exec()</b> and <b>pcre_dfa_exec()</b>, but it can be overridden.
<pre>
  PCRE_NO_AUTO_CAPTURE
</pre>
If this option is set, it disables the use of numbered capturing parentheses in
the pattern. Any opening parenthesis that is not followed by ? behaves as if it
were followed by ?: but named parentheses can still be used for capturing (and
they acquire numbers in the usual way). There is no equivalent of this option
in Perl.
<pre>
  PCRE_UNGREEDY
</pre>
This option inverts the "greediness" of the quantifiers so that they are not
greedy by default, but become greedy if followed by "?". It is not compatible
with Perl. It can also be set by a (?U) option setting within the pattern.
<pre>
  PCRE_UTF8
</pre>
This option causes PCRE to regard both the pattern and the subject as strings
of UTF-8 characters instead of single-byte character strings. However, it is
available only when PCRE is built to include UTF-8 support. If not, the use
of this option provokes an error. Details of how this option changes the
behaviour of PCRE are given in the
<a href="pcre.html#utf8support">section on UTF-8 support</a>
in the main
<a href="pcre.html"><b>pcre</b></a>
page.
<pre>
  PCRE_NO_UTF8_CHECK
</pre>
When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is
automatically checked. There is a discussion about the
<a href="pcre.html#utf8strings">validity of UTF-8 strings</a>
in the main
<a href="pcre.html"><b>pcre</b></a>
page. If an invalid UTF-8 sequence of bytes is found, <b>pcre_compile()</b>
returns an error. If you already know that your pattern is valid, and you want
to skip this check for performance reasons, you can set the PCRE_NO_UTF8_CHECK
option. When it is set, the effect of passing an invalid UTF-8 string as a
pattern is undefined. It may cause your program to crash. Note that this option
can also be passed to <b>pcre_exec()</b> and <b>pcre_dfa_exec()</b>, to suppress
the UTF-8 validity checking of subject strings.
</P>
<br><a name="SEC8" href="#TOC1">COMPILATION ERROR CODES</a><br>
<P>
The following table lists the error codes than may be returned by
<b>pcre_compile2()</b>, along with the error messages that may be returned by
both compiling functions. As PCRE has developed, some error codes have fallen
out of use. To avoid confusion, they have not been re-used.
<pre>
   0  no error
   1  \ at end of pattern
   2  \c at end of pattern
   3  unrecognized character follows \
   4  numbers out of order in {} quantifier
   5  number too big in {} quantifier
   6  missing terminating ] for character class
   7  invalid escape sequence in character class
   8  range out of order in character class
   9  nothing to repeat
  10  [this code is not in use]
  11  internal error: unexpected repeat
  12  unrecognized character after (? or (?-
  13  POSIX named classes are supported only within a class
  14  missing )
  15  reference to non-existent subpattern
  16  erroffset passed as NULL
  17  unknown option bit(s) set
  18  missing ) after comment
  19  [this code is not in use]
  20  regular expression is too large
  21  failed to get memory
  22  unmatched parentheses
  23  internal error: code overflow
  24  unrecognized character after (?&#60;
  25  lookbehind assertion is not fixed length
  26  malformed number or name after (?(
  27  conditional group contains more than two branches
  28  assertion expected after (?(
  29  (?R or (?[+-]digits must be followed by )
  30  unknown POSIX class name
  31  POSIX collating elements are not supported
  32  this version of PCRE is not compiled with PCRE_UTF8 support
  33  [this code is not in use]
  34  character value in \x{...} sequence is too large
  35  invalid condition (?(0)
  36  \C not allowed in lookbehind assertion
  37  PCRE does not support \L, \l, \N, \U, or \u
  38  number after (?C is &#62; 255
  39  closing ) for (?C expected
  40  recursive call could loop indefinitely
  41  unrecognized character after (?P
  42  syntax error in subpattern name (missing terminator)
  43  two named subpatterns have the same name
  44  invalid UTF-8 string
  45  support for \P, \p, and \X has not been compiled
  46  malformed \P or \p sequence
  47  unknown property name after \P or \p
  48  subpattern name is too long (maximum 32 characters)
  49  too many named subpatterns (maximum 10000)
  50  [this code is not in use]
  51  octal value is greater than \377 (not in UTF-8 mode)
  52  internal error: overran compiling workspace
  53  internal error: previously-checked referenced subpattern not found
  54  DEFINE group contains more than one branch
  55  repeating a DEFINE group is not allowed
  56  inconsistent NEWLINE options
  57  \g is not followed by a braced, angle-bracketed, or quoted
        name/number or by a plain number
  58  a numbered reference must not be zero
  59  (*VERB) with an argument is not supported
  60  (*VERB) not recognized
  61  number is too big
  62  subpattern name expected
  63  digit expected after (?+
  64  ] is an invalid data character in JavaScript compatibility mode
</pre>
The numbers 32 and 10000 in errors 48 and 49 are defaults; different values may
be used if the limits were changed when PCRE was built.
</P>
<br><a name="SEC9" href="#TOC1">STUDYING A PATTERN</a><br>
<P>
<b>pcre_extra *pcre_study(const pcre *<i>code</i>, int <i>options</i></b>
<b>const char **<i>errptr</i>);</b>
</P>
<P>
If a compiled pattern is going to be used several times, it is worth spending
more time analyzing it in order to speed up the time taken for matching. The
function <b>pcre_study()</b> takes a pointer to a compiled pattern as its first
argument. If studying the pattern produces additional information that will
help speed up matching, <b>pcre_study()</b> returns a pointer to a
<b>pcre_extra</b> block, in which the <i>study_data</i> field points to the
results of the study.
</P>
<P>
The returned value from <b>pcre_study()</b> can be passed directly to
<b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>. However, a <b>pcre_extra</b> block
also contains other fields that can be set by the caller before the block is
passed; these are described
<a href="#extradata">below</a>
in the section on matching a pattern.
</P>
<P>
If studying the pattern does not produce any useful information,
<b>pcre_study()</b> returns NULL. In that circumstance, if the calling program
wants to pass any of the other fields to <b>pcre_exec()</b> or
<b>pcre_dfa_exec()</b>, it must set up its own <b>pcre_extra</b> block.
</P>
<P>
The second argument of <b>pcre_study()</b> contains option bits. At present, no
options are defined, and this argument should always be zero.
</P>
<P>
The third argument for <b>pcre_study()</b> is a pointer for an error message. If
studying succeeds (even if no data is returned), the variable it points to is
set to NULL. Otherwise it is set to point to a textual error message. This is a
static string that is part of the library. You must not try to free it. You
should test the error pointer for NULL after calling <b>pcre_study()</b>, to be
sure that it has run successfully.
</P>
<P>
This is a typical call to <b>pcre_study</b>():
<pre>
  pcre_extra *pe;
  pe = pcre_study(
    re,             /* result of pcre_compile() */
    0,              /* no options exist */
    &error);        /* set to NULL or points to a message */
</pre>
Studying a pattern does two things: first, a lower bound for the length of
subject string that is needed to match the pattern is computed. This does not
mean that there are any strings of that length that match, but it does
guarantee that no shorter strings match. The value is used by
<b>pcre_exec()</b> and <b>pcre_dfa_exec()</b> to avoid wasting time by trying to
match strings that are shorter than the lower bound. You can find out the value
in a calling program via the <b>pcre_fullinfo()</b> function.
</P>
<P>
Studying a pattern is also useful for non-anchored patterns that do not have a
single fixed starting character. A bitmap of possible starting bytes is
created. This speeds up finding a position in the subject at which to start
matching.
<a name="localesupport"></a></P>
<br><a name="SEC10" href="#TOC1">LOCALE SUPPORT</a><br>
<P>
PCRE handles caseless matching, and determines whether characters are letters,
digits, or whatever, by reference to a set of tables, indexed by character
value. When running in UTF-8 mode, this applies only to characters with codes
less than 128. Higher-valued codes never match escapes such as \w or \d, but
can be tested with \p if PCRE is built with Unicode character property
support. The use of locales with Unicode is discouraged. If you are handling
characters with codes greater than 128, you should either use UTF-8 and
Unicode, or use locales, but not try to mix the two.
</P>
<P>
PCRE contains an internal set of tables that are used when the final argument
of <b>pcre_compile()</b> is NULL. These are sufficient for many applications.
Normally, the internal tables recognize only ASCII characters. However, when
PCRE is built, it is possible to cause the internal tables to be rebuilt in the
default "C" locale of the local system, which may cause them to be different.
</P>
<P>
The internal tables can always be overridden by tables supplied by the
application that calls PCRE. These may be created in a different locale from
the default. As more and more applications change to using Unicode, the need
for this locale support is expected to die away.
</P>
<P>
External tables are built by calling the <b>pcre_maketables()</b> function,
which has no arguments, in the relevant locale. The result can then be passed
to <b>pcre_compile()</b> or <b>pcre_exec()</b> as often as necessary. For
example, to build and use tables that are appropriate for the French locale
(where accented characters with values greater than 128 are treated as letters),
the following code could be used:
<pre>
  setlocale(LC_CTYPE, "fr_FR");
  tables = pcre_maketables();
  re = pcre_compile(..., tables);
</pre>
The locale name "fr_FR" is used on Linux and other Unix-like systems; if you
are using Windows, the name for the French locale is "french".
</P>
<P>
When <b>pcre_maketables()</b> runs, the tables are built in memory that is
obtained via <b>pcre_malloc</b>. It is the caller's responsibility to ensure
that the memory containing the tables remains available for as long as it is
needed.
</P>
<P>
The pointer that is passed to <b>pcre_compile()</b> is saved with the compiled
pattern, and the same tables are used via this pointer by <b>pcre_study()</b>
and normally also by <b>pcre_exec()</b>. Thus, by default, for any single
pattern, compilation, studying and matching all happen in the same locale, but
different patterns can be compiled in different locales.
</P>
<P>
It is possible to pass a table pointer or NULL (indicating the use of the
internal tables) to <b>pcre_exec()</b>. Although not intended for this purpose,
this facility could be used to match a pattern in a different locale from the
one in which it was compiled. Passing table pointers at run time is discussed
below in the section on matching a pattern.
</P>
<br><a name="SEC11" href="#TOC1">INFORMATION ABOUT A PATTERN</a><br>
<P>
<b>int pcre_fullinfo(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
<b>int <i>what</i>, void *<i>where</i>);</b>
</P>
<P>
The <b>pcre_fullinfo()</b> function returns information about a compiled
pattern. It replaces the obsolete <b>pcre_info()</b> function, which is
nevertheless retained for backwards compability (and is documented below).
</P>
<P>
The first argument for <b>pcre_fullinfo()</b> is a pointer to the compiled
pattern. The second argument is the result of <b>pcre_study()</b>, or NULL if
the pattern was not studied. The third argument specifies which piece of
information is required, and the fourth argument is a pointer to a variable
to receive the data. The yield of the function is zero for success, or one of
the following negative numbers:
<pre>
  PCRE_ERROR_NULL       the argument <i>code</i> was NULL
                        the argument <i>where</i> was NULL
  PCRE_ERROR_BADMAGIC   the "magic number" was not found
  PCRE_ERROR_BADOPTION  the value of <i>what</i> was invalid
</pre>
The "magic number" is placed at the start of each compiled pattern as an simple
check against passing an arbitrary memory pointer. Here is a typical call of
<b>pcre_fullinfo()</b>, to obtain the length of the compiled pattern:
<pre>
  int rc;
  size_t length;
  rc = pcre_fullinfo(
    re,               /* result of pcre_compile() */
    pe,               /* result of pcre_study(), or NULL */
    PCRE_INFO_SIZE,   /* what is required */
    &length);         /* where to put the data */
</pre>
The possible values for the third argument are defined in <b>pcre.h</b>, and are
as follows:
<pre>
  PCRE_INFO_BACKREFMAX
</pre>
Return the number of the highest back reference in the pattern. The fourth
argument should point to an <b>int</b> variable. Zero is returned if there are
no back references.
<pre>
  PCRE_INFO_CAPTURECOUNT
</pre>
Return the number of capturing subpatterns in the pattern. The fourth argument
should point to an <b>int</b> variable.
<pre>
  PCRE_INFO_DEFAULT_TABLES
</pre>
Return a pointer to the internal default character tables within PCRE. The
fourth argument should point to an <b>unsigned char *</b> variable. This
information call is provided for internal use by the <b>pcre_study()</b>
function. External callers can cause PCRE to use its internal tables by passing
a NULL table pointer.
<pre>
  PCRE_INFO_FIRSTBYTE
</pre>
Return information about the first byte of any matched string, for a
non-anchored pattern. The fourth argument should point to an <b>int</b>
variable. (This option used to be called PCRE_INFO_FIRSTCHAR; the old name is
still recognized for backwards compatibility.)
</P>
<P>
If there is a fixed first byte, for example, from a pattern such as
(cat|cow|coyote), its value is returned. Otherwise, if either
<br>
<br>
(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch
starts with "^", or
<br>
<br>
(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set
(if it were set, the pattern would be anchored),
<br>
<br>
-1 is returned, indicating that the pattern matches only at the start of a
subject string or after any newline within the string. Otherwise -2 is
returned. For anchored patterns, -2 is returned.
<pre>
  PCRE_INFO_FIRSTTABLE
</pre>
If the pattern was studied, and this resulted in the construction of a 256-bit
table indicating a fixed set of bytes for the first byte in any matching
string, a pointer to the table is returned. Otherwise NULL is returned. The
fourth argument should point to an <b>unsigned char *</b> variable.
<pre>
  PCRE_INFO_HASCRORLF
</pre>
Return 1 if the pattern contains any explicit matches for CR or LF characters,
otherwise 0. The fourth argument should point to an <b>int</b> variable. An
explicit match is either a literal CR or LF character, or \r or \n.
<pre>
  PCRE_INFO_JCHANGED
</pre>
Return 1 if the (?J) or (?-J) option setting is used in the pattern, otherwise
0. The fourth argument should point to an <b>int</b> variable. (?J) and
(?-J) set and unset the local PCRE_DUPNAMES option, respectively.
<pre>
  PCRE_INFO_LASTLITERAL
</pre>
Return the value of the rightmost literal byte that must exist in any matched
string, other than at its start, if such a byte has been recorded. The fourth
argument should point to an <b>int</b> variable. If there is no such byte, -1 is
returned. For anchored patterns, a last literal byte is recorded only if it
follows something of variable length. For example, for the pattern
/^a\d+z\d+/ the returned value is "z", but for /^a\dz\d/ the returned value
is -1.
<pre>
  PCRE_INFO_MINLENGTH
</pre>
If the pattern was studied and a minimum length for matching subject strings
was computed, its value is returned. Otherwise the returned value is -1. The
value is a number of characters, not bytes (this may be relevant in UTF-8
mode). The fourth argument should point to an <b>int</b> variable. A
non-negative value is a lower bound to the length of any matching string. There
may not be any strings of that length that do actually match, but every string
that does match is at least that long.
<pre>
  PCRE_INFO_NAMECOUNT
  PCRE_INFO_NAMEENTRYSIZE
  PCRE_INFO_NAMETABLE
</pre>
PCRE supports the use of named as well as numbered capturing parentheses. The
names are just an additional way of identifying the parentheses, which still
acquire numbers. Several convenience functions such as
<b>pcre_get_named_substring()</b> are provided for extracting captured
substrings by name. It is also possible to extract the data directly, by first
converting the name to a number in order to access the correct pointers in the
output vector (described with <b>pcre_exec()</b> below). To do the conversion,
you need to use the name-to-number map, which is described by these three
values.
</P>
<P>
The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT gives
the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size of each
entry; both of these return an <b>int</b> value. The entry size depends on the
length of the longest name. PCRE_INFO_NAMETABLE returns a pointer to the first
entry of the table (a pointer to <b>char</b>). The first two bytes of each entry
are the number of the capturing parenthesis, most significant byte first. The
rest of the entry is the corresponding name, zero terminated.
</P>
<P>
The names are in alphabetical order. Duplicate names may appear if (?| is used
to create multiple groups with the same number, as described in the
<a href="pcrepattern.html#dupsubpatternnumber">section on duplicate subpattern numbers</a>
in the
<a href="pcrepattern.html"><b>pcrepattern</b></a>
page. Duplicate names for subpatterns with different numbers are permitted only
if PCRE_DUPNAMES is set. In all cases of duplicate names, they appear in the
table in the order in which they were found in the pattern. In the absence of
(?| this is the order of increasing number; when (?| is used this is not
necessarily the case because later subpatterns may have lower numbers.
</P>
<P>
As a simple example of the name/number table, consider the following pattern
(assume PCRE_EXTENDED is set, so white space - including newlines - is
ignored):
<pre>
  (?&#60;date&#62; (?&#60;year&#62;(\d\d)?\d\d) - (?&#60;month&#62;\d\d) - (?&#60;day&#62;\d\d) )
</pre>
There are four named subpatterns, so the table has four entries, and each entry
in the table is eight bytes long. The table is as follows, with non-printing
bytes shows in hexadecimal, and undefined bytes shown as ??:
<pre>
  00 01 d  a  t  e  00 ??
  00 05 d  a  y  00 ?? ??
  00 04 m  o  n  t  h  00
  00 02 y  e  a  r  00 ??
</pre>
When writing code to extract data from named subpatterns using the
name-to-number map, remember that the length of the entries is likely to be
different for each compiled pattern.
<pre>
  PCRE_INFO_OKPARTIAL
</pre>
Return 1 if the pattern can be used for partial matching with
<b>pcre_exec()</b>, otherwise 0. The fourth argument should point to an
<b>int</b> variable. From release 8.00, this always returns 1, because the
restrictions that previously applied to partial matching have been lifted. The
<a href="pcrepartial.html"><b>pcrepartial</b></a>
documentation gives details of partial matching.
<pre>
  PCRE_INFO_OPTIONS
</pre>
Return a copy of the options with which the pattern was compiled. The fourth
argument should point to an <b>unsigned long int</b> variable. These option bits
are those specified in the call to <b>pcre_compile()</b>, modified by any
top-level option settings at the start of the pattern itself. In other words,
they are the options that will be in force when matching starts. For example,
if the pattern /(?im)abc(?-i)d/ is compiled with the PCRE_EXTENDED option, the
result is PCRE_CASELESS, PCRE_MULTILINE, and PCRE_EXTENDED.
</P>
<P>
A pattern is automatically anchored by PCRE if all of its top-level
alternatives begin with one of the following:
<pre>
  ^     unless PCRE_MULTILINE is set
  \A    always
  \G    always
  .*    if PCRE_DOTALL is set and there are no back references to the subpattern in which .* appears
</pre>
For such patterns, the PCRE_ANCHORED bit is set in the options returned by
<b>pcre_fullinfo()</b>.
<pre>
  PCRE_INFO_SIZE
</pre>
Return the size of the compiled pattern, that is, the value that was passed as
the argument to <b>pcre_malloc()</b> when PCRE was getting memory in which to
place the compiled data. The fourth argument should point to a <b>size_t</b>
variable.
<pre>
  PCRE_INFO_STUDYSIZE
</pre>
Return the size of the data block pointed to by the <i>study_data</i> field in
a <b>pcre_extra</b> block. That is, it is the value that was passed to
<b>pcre_malloc()</b> when PCRE was getting memory into which to place the data
created by <b>pcre_study()</b>. If <b>pcre_extra</b> is NULL, or there is no
study data, zero is returned. The fourth argument should point to a
<b>size_t</b> variable.
</P>
<br><a name="SEC12" href="#TOC1">OBSOLETE INFO FUNCTION</a><br>
<P>
<b>int pcre_info(const pcre *<i>code</i>, int *<i>optptr</i>, int</b>
<b>*<i>firstcharptr</i>);</b>
</P>
<P>
The <b>pcre_info()</b> function is now obsolete because its interface is too
restrictive to return all the available data about a compiled pattern. New
programs should use <b>pcre_fullinfo()</b> instead. The yield of
<b>pcre_info()</b> is the number of capturing subpatterns, or one of the
following negative numbers:
<pre>
  PCRE_ERROR_NULL       the argument <i>code</i> was NULL
  PCRE_ERROR_BADMAGIC   the "magic number" was not found
</pre>
If the <i>optptr</i> argument is not NULL, a copy of the options with which the
pattern was compiled is placed in the integer it points to (see
PCRE_INFO_OPTIONS above).
</P>
<P>
If the pattern is not anchored and the <i>firstcharptr</i> argument is not NULL,
it is used to pass back information about the first character of any matched
string (see PCRE_INFO_FIRSTBYTE above).
</P>
<br><a name="SEC13" href="#TOC1">REFERENCE COUNTS</a><br>
<P>
<b>int pcre_refcount(pcre *<i>code</i>, int <i>adjust</i>);</b>
</P>
<P>
The <b>pcre_refcount()</b> function is used to maintain a reference count in the
data block that contains a compiled pattern. It is provided for the benefit of
applications that operate in an object-oriented manner, where different parts
of the application may be using the same compiled pattern, but you want to free
the block when they are all done.
</P>
<P>
When a pattern is compiled, the reference count field is initialized to zero.
It is changed only by calling this function, whose action is to add the
<i>adjust</i> value (which may be positive or negative) to it. The yield of the
function is the new value. However, the value of the count is constrained to
lie between 0 and 65535, inclusive. If the new value is outside these limits,
it is forced to the appropriate limit value.
</P>
<P>
Except when it is zero, the reference count is not correctly preserved if a
pattern is compiled on one host and then transferred to a host whose byte-order
is different. (This seems a highly unlikely scenario.)
</P>
<br><a name="SEC14" href="#TOC1">MATCHING A PATTERN: THE TRADITIONAL FUNCTION</a><br>
<P>
<b>int pcre_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
<b>const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
<b>int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>);</b>
</P>
<P>
The function <b>pcre_exec()</b> is called to match a subject string against a
compiled pattern, which is passed in the <i>code</i> argument. If the
pattern was studied, the result of the study should be passed in the
<i>extra</i> argument. This function is the main matching facility of the
library, and it operates in a Perl-like manner. For specialist use there is
also an alternative matching function, which is described
<a href="#dfamatch">below</a>
in the section about the <b>pcre_dfa_exec()</b> function.
</P>
<P>
In most applications, the pattern will have been compiled (and optionally
studied) in the same process that calls <b>pcre_exec()</b>. However, it is
possible to save compiled patterns and study data, and then use them later
in different processes, possibly even on different hosts. For a discussion
about this, see the
<a href="pcreprecompile.html"><b>pcreprecompile</b></a>
documentation.
</P>
<P>
Here is an example of a simple call to <b>pcre_exec()</b>:
<pre>
  int rc;
  int ovector[30];
  rc = pcre_exec(
    re,             /* result of pcre_compile() */
    NULL,           /* we didn't study the pattern */
    "some string",  /* the subject string */
    11,             /* the length of the subject string */
    0,              /* start at offset 0 in the subject */
    0,              /* default options */
    ovector,        /* vector of integers for substring information */
    30);            /* number of elements (NOT size in bytes) */
<a name="extradata"></a></PRE>
</P>
<br><b>
Extra data for <b>pcre_exec()</b>
</b><br>
<P>
If the <i>extra</i> argument is not NULL, it must point to a <b>pcre_extra</b>
data block. The <b>pcre_study()</b> function returns such a block (when it
doesn't return NULL), but you can also create one for yourself, and pass
additional information in it. The <b>pcre_extra</b> block contains the following
fields (not necessarily in this order):
<pre>
  unsigned long int <i>flags</i>;
  void *<i>study_data</i>;
  unsigned long int <i>match_limit</i>;
  unsigned long int <i>match_limit_recursion</i>;
  void *<i>callout_data</i>;
  const unsigned char *<i>tables</i>;
</pre>
The <i>flags</i> field is a bitmap that specifies which of the other fields
are set. The flag bits are:
<pre>
  PCRE_EXTRA_STUDY_DATA
  PCRE_EXTRA_MATCH_LIMIT
  PCRE_EXTRA_MATCH_LIMIT_RECURSION
  PCRE_EXTRA_CALLOUT_DATA
  PCRE_EXTRA_TABLES
</pre>
Other flag bits should be set to zero. The <i>study_data</i> field is set in the
<b>pcre_extra</b> block that is returned by <b>pcre_study()</b>, together with
the appropriate flag bit. You should not set this yourself, but you may add to
the block by setting the other fields and their corresponding flag bits.
</P>
<P>
The <i>match_limit</i> field provides a means of preventing PCRE from using up a
vast amount of resources when running patterns that are not going to match,
but which have a very large number of possibilities in their search trees. The
classic example is a pattern that uses nested unlimited repeats.
</P>
<P>
Internally, PCRE uses a function called <b>match()</b> which it calls repeatedly
(sometimes recursively). The limit set by <i>match_limit</i> is imposed on the
number of times this function is called during a match, which has the effect of
limiting the amount of backtracking that can take place. For patterns that are
not anchored, the count restarts from zero for each position in the subject
string.
</P>
<P>
The default value for the limit can be set when PCRE is built; the default
default is 10 million, which handles all but the most extreme cases. You can
override the default by suppling <b>pcre_exec()</b> with a <b>pcre_extra</b>
block in which <i>match_limit</i> is set, and PCRE_EXTRA_MATCH_LIMIT is set in
the <i>flags</i> field. If the limit is exceeded, <b>pcre_exec()</b> returns
PCRE_ERROR_MATCHLIMIT.
</P>
<P>
The <i>match_limit_recursion</i> field is similar to <i>match_limit</i>, but
instead of limiting the total number of times that <b>match()</b> is called, it
limits the depth of recursion. The recursion depth is a smaller number than the
total number of calls, because not all calls to <b>match()</b> are recursive.
This limit is of use only if it is set smaller than <i>match_limit</i>.
</P>
<P>
Limiting the recursion depth limits the amount of stack that can be used, or,
when PCRE has been compiled to use memory on the heap instead of the stack, the
amount of heap memory that can be used.
</P>
<P>
The default value for <i>match_limit_recursion</i> can be set when PCRE is
built; the default default is the same value as the default for
<i>match_limit</i>. You can override the default by suppling <b>pcre_exec()</b>
with a <b>pcre_extra</b> block in which <i>match_limit_recursion</i> is set, and
PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the <i>flags</i> field. If the limit
is exceeded, <b>pcre_exec()</b> returns PCRE_ERROR_RECURSIONLIMIT.
</P>
<P>
The <i>callout_data</i> field is used in conjunction with the "callout" feature,
and is described in the
<a href="pcrecallout.html"><b>pcrecallout</b></a>
documentation.
</P>
<P>
The <i>tables</i> field is used to pass a character tables pointer to
<b>pcre_exec()</b>; this overrides the value that is stored with the compiled
pattern. A non-NULL value is stored with the compiled pattern only if custom
tables were supplied to <b>pcre_compile()</b> via its <i>tableptr</i> argument.
If NULL is passed to <b>pcre_exec()</b> using this mechanism, it forces PCRE's
internal tables to be used. This facility is helpful when re-using patterns
that have been saved after compiling with an external set of tables, because
the external tables might be at a different address when <b>pcre_exec()</b> is
called. See the
<a href="pcreprecompile.html"><b>pcreprecompile</b></a>
documentation for a discussion of saving compiled patterns for later use.
<a name="execoptions"></a></P>
<br><b>
Option bits for <b>pcre_exec()</b>
</b><br>
<P>
The unused bits of the <i>options</i> argument for <b>pcre_exec()</b> must be
zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_<i>xxx</i>,
PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART,
PCRE_NO_START_OPTIMIZE, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_SOFT, and
PCRE_PARTIAL_HARD.
<pre>
  PCRE_ANCHORED
</pre>
The PCRE_ANCHORED option limits <b>pcre_exec()</b> to matching at the first
matching position. If a pattern was compiled with PCRE_ANCHORED, or turned out
to be anchored by virtue of its contents, it cannot be made unachored at
matching time.
<pre>
  PCRE_BSR_ANYCRLF
  PCRE_BSR_UNICODE
</pre>
These options (which are mutually exclusive) control what the \R escape
sequence matches. The choice is either to match only CR, LF, or CRLF, or to
match any Unicode newline sequence. These options override the choice that was
made or defaulted when the pattern was compiled.
<pre>
  PCRE_NEWLINE_CR
  PCRE_NEWLINE_LF
  PCRE_NEWLINE_CRLF
  PCRE_NEWLINE_ANYCRLF
  PCRE_NEWLINE_ANY
</pre>
These options override the newline definition that was chosen or defaulted when
the pattern was compiled. For details, see the description of
<b>pcre_compile()</b> above. During matching, the newline choice affects the
behaviour of the dot, circumflex, and dollar metacharacters. It may also alter
the way the match position is advanced after a match failure for an unanchored
pattern.
</P>
<P>
When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF, or PCRE_NEWLINE_ANY is set, and a
match attempt for an unanchored pattern fails when the current position is at a
CRLF sequence, and the pattern contains no explicit matches for CR or LF
characters, the match position is advanced by two characters instead of one, in
other words, to after the CRLF.
</P>
<P>
The above rule is a compromise that makes the most common cases work as
expected. For example, if the pattern is .+A (and the PCRE_DOTALL option is not
set), it does not match the string "\r\nA" because, after failing at the
start, it skips both the CR and the LF before retrying. However, the pattern
[\r\n]A does match that string, because it contains an explicit CR or LF
reference, and so advances only by one character after the first failure.
</P>
<P>
An explicit match for CR of LF is either a literal appearance of one of those
characters, or one of the \r or \n escape sequences. Implicit matches such as
[^X] do not count, nor does \s (which includes CR and LF in the characters
that it matches).
</P>
<P>
Notwithstanding the above, anomalous effects may still occur when CRLF is a
valid newline sequence and explicit \r or \n escapes appear in the pattern.
<pre>
  PCRE_NOTBOL
</pre>
This option specifies that first character of the subject string is not the
beginning of a line, so the circumflex metacharacter should not match before
it. Setting this without PCRE_MULTILINE (at compile time) causes circumflex
never to match. This option affects only the behaviour of the circumflex
metacharacter. It does not affect \A.
<pre>
  PCRE_NOTEOL
</pre>
This option specifies that the end of the subject string is not the end of a
line, so the dollar metacharacter should not match it nor (except in multiline
mode) a newline immediately before it. Setting this without PCRE_MULTILINE (at
compile time) causes dollar never to match. This option affects only the
behaviour of the dollar metacharacter. It does not affect \Z or \z.
<pre>
  PCRE_NOTEMPTY
</pre>
An empty string is not considered to be a valid match if this option is set. If
there are alternatives in the pattern, they are tried. If all the alternatives
match the empty string, the entire match fails. For example, if the pattern
<pre>
  a?b?
</pre>
is applied to a string not beginning with "a" or "b", it matches an empty
string at the start of the subject. With PCRE_NOTEMPTY set, this match is not
valid, so PCRE searches further into the string for occurrences of "a" or "b".
<pre>
  PCRE_NOTEMPTY_ATSTART
</pre>
This is like PCRE_NOTEMPTY, except that an empty string match that is not at
the start of the subject is permitted. If the pattern is anchored, such a match
can occur only if the pattern contains \K.
</P>
<P>
Perl has no direct equivalent of PCRE_NOTEMPTY or PCRE_NOTEMPTY_ATSTART, but it
does make a special case of a pattern match of the empty string within its
<b>split()</b> function, and when using the /g modifier. It is possible to
emulate Perl's behaviour after matching a null string by first trying the match
again at the same offset with PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED, and then
if that fails, by advancing the starting offset (see below) and trying an
ordinary match again. There is some code that demonstrates how to do this in
the
<a href="pcredemo.html"><b>pcredemo</b></a>
sample program.
<pre>
  PCRE_NO_START_OPTIMIZE
</pre>
There are a number of optimizations that <b>pcre_exec()</b> uses at the start of
a match, in order to speed up the process. For example, if it is known that a
match must start with a specific character, it searches the subject for that
character, and fails immediately if it cannot find it, without actually running
the main matching function. When callouts are in use, these optimizations can
cause them to be skipped. This option disables the "start-up" optimizations,
causing performance to suffer, but ensuring that the callouts do occur.
<pre>
  PCRE_NO_UTF8_CHECK
</pre>
When PCRE_UTF8 is set at compile time, the validity of the subject as a UTF-8
string is automatically checked when <b>pcre_exec()</b> is subsequently called.
The value of <i>startoffset</i> is also checked to ensure that it points to the
start of a UTF-8 character. There is a discussion about the validity of UTF-8
strings in the
<a href="pcre.html#utf8strings">section on UTF-8 support</a>
in the main
<a href="pcre.html"><b>pcre</b></a>
page. If an invalid UTF-8 sequence of bytes is found, <b>pcre_exec()</b> returns
the error PCRE_ERROR_BADUTF8. If <i>startoffset</i> contains an invalid value,
PCRE_ERROR_BADUTF8_OFFSET is returned.
</P>
<P>
If you already know that your subject is valid, and you want to skip these
checks for performance reasons, you can set the PCRE_NO_UTF8_CHECK option when
calling <b>pcre_exec()</b>. You might want to do this for the second and
subsequent calls to <b>pcre_exec()</b> if you are making repeated calls to find
all the matches in a single subject string. However, you should be sure that
the value of <i>startoffset</i> points to the start of a UTF-8 character. When
PCRE_NO_UTF8_CHECK is set, the effect of passing an invalid UTF-8 string as a
subject, or a value of <i>startoffset</i> that does not point to the start of a
UTF-8 character, is undefined. Your program may crash.
<pre>
  PCRE_PARTIAL_HARD
  PCRE_PARTIAL_SOFT
</pre>
These options turn on the partial matching feature. For backwards
compatibility, PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial match
occurs if the end of the subject string is reached successfully, but there are
not enough subject characters to complete the match. If this happens when
PCRE_PARTIAL_HARD is set, <b>pcre_exec()</b> immediately returns
PCRE_ERROR_PARTIAL. Otherwise, if PCRE_PARTIAL_SOFT is set, matching continues
by testing any other alternatives. Only if they all fail is PCRE_ERROR_PARTIAL
returned (instead of PCRE_ERROR_NOMATCH). The portion of the string that
was inspected when the partial match was found is set as the first matching
string. There is a more detailed discussion in the
<a href="pcrepartial.html"><b>pcrepartial</b></a>
documentation.
</P>
<br><b>
The string to be matched by <b>pcre_exec()</b>
</b><br>
<P>
The subject string is passed to <b>pcre_exec()</b> as a pointer in
<i>subject</i>, a length (in bytes) in <i>length</i>, and a starting byte offset
in <i>startoffset</i>. In UTF-8 mode, the byte offset must point to the start of
a UTF-8 character. Unlike the pattern string, the subject may contain binary
zero bytes. When the starting offset is zero, the search for a match starts at
the beginning of the subject, and this is by far the most common case.
</P>
<P>
A non-zero starting offset is useful when searching for another match in the
same subject by calling <b>pcre_exec()</b> again after a previous success.
Setting <i>startoffset</i> differs from just passing over a shortened string and
setting PCRE_NOTBOL in the case of a pattern that begins with any kind of
lookbehind. For example, consider the pattern
<pre>
  \Biss\B
</pre>
which finds occurrences of "iss" in the middle of words. (\B matches only if
the current position in the subject is not a word boundary.) When applied to
the string "Mississipi" the first call to <b>pcre_exec()</b> finds the first
occurrence. If <b>pcre_exec()</b> is called again with just the remainder of the
subject, namely "issipi", it does not match, because \B is always false at the
start of the subject, which is deemed to be a word boundary. However, if
<b>pcre_exec()</b> is passed the entire string again, but with <i>startoffset</i>
set to 4, it finds the second occurrence of "iss" because it is able to look
behind the starting point to discover that it is preceded by a letter.
</P>
<P>
If a non-zero starting offset is passed when the pattern is anchored, one
attempt to match at the given offset is made. This can only succeed if the
pattern does not require the match to be at the start of the subject.
</P>
<br><b>
How <b>pcre_exec()</b> returns captured substrings
</b><br>
<P>
In general, a pattern matches a certain portion of the subject, and in
addition, further substrings from the subject may be picked out by parts of the
pattern. Following the usage in Jeffrey Friedl's book, this is called
"capturing" in what follows, and the phrase "capturing subpattern" is used for
a fragment of a pattern that picks out a substring. PCRE supports several other
kinds of parenthesized subpattern that do not cause substrings to be captured.
</P>
<P>
Captured substrings are returned to the caller via a vector of integers whose
address is passed in <i>ovector</i>. The number of elements in the vector is
passed in <i>ovecsize</i>, which must be a non-negative number. <b>Note</b>: this
argument is NOT the size of <i>ovector</i> in bytes.
</P>
<P>
The first two-thirds of the vector is used to pass back captured substrings,
each substring using a pair of integers. The remaining third of the vector is
used as workspace by <b>pcre_exec()</b> while matching capturing subpatterns,
and is not available for passing back information. The number passed in
<i>ovecsize</i> should always be a multiple of three. If it is not, it is
rounded down.
</P>
<P>
When a match is successful, information about captured substrings is returned
in pairs of integers, starting at the beginning of <i>ovector</i>, and
continuing up to two-thirds of its length at the most. The first element of
each pair is set to the byte offset of the first character in a substring, and
the second is set to the byte offset of the first character after the end of a
substring. <b>Note</b>: these values are always byte offsets, even in UTF-8
mode. They are not character counts.
</P>
<P>
The first pair of integers, <i>ovector[0]</i> and <i>ovector[1]</i>, identify the
portion of the subject string matched by the entire pattern. The next pair is
used for the first capturing subpattern, and so on. The value returned by
<b>pcre_exec()</b> is one more than the highest numbered pair that has been set.
For example, if two substrings have been captured, the returned value is 3. If
there are no capturing subpatterns, the return value from a successful match is
1, indicating that just the first pair of offsets has been set.
</P>
<P>
If a capturing subpattern is matched repeatedly, it is the last portion of the
string that it matched that is returned.
</P>
<P>
If the vector is too small to hold all the captured substring offsets, it is
used as far as possible (up to two-thirds of its length), and the function
returns a value of zero. If the substring offsets are not of interest,
<b>pcre_exec()</b> may be called with <i>ovector</i> passed as NULL and
<i>ovecsize</i> as zero. However, if the pattern contains back references and
the <i>ovector</i> is not big enough to remember the related substrings, PCRE
has to get additional memory for use during matching. Thus it is usually
advisable to supply an <i>ovector</i>.
</P>
<P>
The <b>pcre_fullinfo()</b> function can be used to find out how many capturing
subpatterns there are in a compiled pattern. The smallest size for
<i>ovector</i> that will allow for <i>n</i> captured substrings, in addition to
the offsets of the substring matched by the whole pattern, is (<i>n</i>+1)*3.
</P>
<P>
It is possible for capturing subpattern number <i>n+1</i> to match some part of
the subject when subpattern <i>n</i> has not been used at all. For example, if
the string "abc" is matched against the pattern (a|(z))(bc) the return from the
function is 4, and subpatterns 1 and 3 are matched, but 2 is not. When this
happens, both values in the offset pairs corresponding to unused subpatterns
are set to -1.
</P>
<P>
Offset values that correspond to unused subpatterns at the end of the
expression are also set to -1. For example, if the string "abc" is matched
against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not matched. The
return from the function is 2, because the highest used capturing subpattern
number is 1. However, you can refer to the offsets for the second and third
capturing subpatterns if you wish (assuming the vector is large enough, of
course).
</P>
<P>
Some convenience functions are provided for extracting the captured substrings
as separate strings. These are described below.
<a name="errorlist"></a></P>
<br><b>
Error return values from <b>pcre_exec()</b>
</b><br>
<P>
If <b>pcre_exec()</b> fails, it returns a negative number. The following are
defined in the header file:
<pre>
  PCRE_ERROR_NOMATCH        (-1)
</pre>
The subject string did not match the pattern.
<pre>
  PCRE_ERROR_NULL           (-2)
</pre>
Either <i>code</i> or <i>subject</i> was passed as NULL, or <i>ovector</i> was
NULL and <i>ovecsize</i> was not zero.
<pre>
  PCRE_ERROR_BADOPTION      (-3)
</pre>
An unrecognized bit was set in the <i>options</i> argument.
<pre>
  PCRE_ERROR_BADMAGIC       (-4)
</pre>
PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch
the case when it is passed a junk pointer and to detect when a pattern that was
compiled in an environment of one endianness is run in an environment with the
other endianness. This is the error that PCRE gives when the magic number is
not present.
<pre>
  PCRE_ERROR_UNKNOWN_OPCODE (-5)
</pre>
While running the pattern match, an unknown item was encountered in the
compiled pattern. This error could be caused by a bug in PCRE or by overwriting
of the compiled pattern.
<pre>
  PCRE_ERROR_NOMEMORY       (-6)
</pre>
If a pattern contains back references, but the <i>ovector</i> that is passed to
<b>pcre_exec()</b> is not big enough to remember the referenced substrings, PCRE
gets a block of memory at the start of matching to use for this purpose. If the
call via <b>pcre_malloc()</b> fails, this error is given. The memory is
automatically freed at the end of matching.
<pre>
  PCRE_ERROR_NOSUBSTRING    (-7)
</pre>
This error is used by the <b>pcre_copy_substring()</b>,
<b>pcre_get_substring()</b>, and <b>pcre_get_substring_list()</b> functions (see
below). It is never returned by <b>pcre_exec()</b>.
<pre>
  PCRE_ERROR_MATCHLIMIT     (-8)
</pre>
The backtracking limit, as specified by the <i>match_limit</i> field in a
<b>pcre_extra</b> structure (or defaulted) was reached. See the description
above.
<pre>
  PCRE_ERROR_CALLOUT        (-9)
</pre>
This error is never generated by <b>pcre_exec()</b> itself. It is provided for
use by callout functions that want to yield a distinctive error code. See the
<a href="pcrecallout.html"><b>pcrecallout</b></a>
documentation for details.
<pre>
  PCRE_ERROR_BADUTF8        (-10)
</pre>
A string that contains an invalid UTF-8 byte sequence was passed as a subject.
<pre>
  PCRE_ERROR_BADUTF8_OFFSET (-11)
</pre>
The UTF-8 byte sequence that was passed as a subject was valid, but the value
of <i>startoffset</i> did not point to the beginning of a UTF-8 character.
<pre>
  PCRE_ERROR_PARTIAL        (-12)
</pre>
The subject string did not match, but it did match partially. See the
<a href="pcrepartial.html"><b>pcrepartial</b></a>
documentation for details of partial matching.
<pre>
  PCRE_ERROR_BADPARTIAL     (-13)
</pre>
This code is no longer in use. It was formerly returned when the PCRE_PARTIAL
option was used with a compiled pattern containing items that were not
supported for partial matching. From release 8.00 onwards, there are no
restrictions on partial matching.
<pre>
  PCRE_ERROR_INTERNAL       (-14)
</pre>
An unexpected internal error has occurred. This error could be caused by a bug
in PCRE or by overwriting of the compiled pattern.
<pre>
  PCRE_ERROR_BADCOUNT       (-15)
</pre>
This error is given if the value of the <i>ovecsize</i> argument is negative.
<pre>
  PCRE_ERROR_RECURSIONLIMIT (-21)
</pre>
The internal recursion limit, as specified by the <i>match_limit_recursion</i>
field in a <b>pcre_extra</b> structure (or defaulted) was reached. See the
description above.
<pre>
  PCRE_ERROR_BADNEWLINE     (-23)
</pre>
An invalid combination of PCRE_NEWLINE_<i>xxx</i> options was given.
</P>
<P>
Error numbers -16 to -20 and -22 are not used by <b>pcre_exec()</b>.
</P>
<br><a name="SEC15" href="#TOC1">EXTRACTING CAPTURED SUBSTRINGS BY NUMBER</a><br>
<P>
<b>int pcre_copy_substring(const char *<i>subject</i>, int *<i>ovector</i>,</b>
<b>int <i>stringcount</i>, int <i>stringnumber</i>, char *<i>buffer</i>,</b>
<b>int <i>buffersize</i>);</b>
</P>
<P>
<b>int pcre_get_substring(const char *<i>subject</i>, int *<i>ovector</i>,</b>
<b>int <i>stringcount</i>, int <i>stringnumber</i>,</b>
<b>const char **<i>stringptr</i>);</b>
</P>
<P>
<b>int pcre_get_substring_list(const char *<i>subject</i>,</b>
<b>int *<i>ovector</i>, int <i>stringcount</i>, const char ***<i>listptr</i>);</b>
</P>
<P>
Captured substrings can be accessed directly by using the offsets returned by
<b>pcre_exec()</b> in <i>ovector</i>. For convenience, the functions
<b>pcre_copy_substring()</b>, <b>pcre_get_substring()</b>, and
<b>pcre_get_substring_list()</b> are provided for extracting captured substrings
as new, separate, zero-terminated strings. These functions identify substrings
by number. The next section describes functions for extracting named
substrings.
</P>
<P>
A substring that contains a binary zero is correctly extracted and has a
further zero added on the end, but the result is not, of course, a C string.
However, you can process such a string by referring to the length that is
returned by <b>pcre_copy_substring()</b> and <b>pcre_get_substring()</b>.
Unfortunately, the interface to <b>pcre_get_substring_list()</b> is not adequate
for handling strings containing binary zeros, because the end of the final
string is not independently indicated.
</P>
<P>
The first three arguments are the same for all three of these functions:
<i>subject</i> is the subject string that has just been successfully matched,
<i>ovector</i> is a pointer to the vector of integer offsets that was passed to
<b>pcre_exec()</b>, and <i>stringcount</i> is the number of substrings that were
captured by the match, including the substring that matched the entire regular
expression. This is the value returned by <b>pcre_exec()</b> if it is greater
than zero. If <b>pcre_exec()</b> returned zero, indicating that it ran out of
space in <i>ovector</i>, the value passed as <i>stringcount</i> should be the
number of elements in the vector divided by three.
</P>
<P>
The functions <b>pcre_copy_substring()</b> and <b>pcre_get_substring()</b>
extract a single substring, whose number is given as <i>stringnumber</i>. A
value of zero extracts the substring that matched the entire pattern, whereas
higher values extract the captured substrings. For <b>pcre_copy_substring()</b>,
the string is placed in <i>buffer</i>, whose length is given by
<i>buffersize</i>, while for <b>pcre_get_substring()</b> a new block of memory is
obtained via <b>pcre_malloc</b>, and its address is returned via
<i>stringptr</i>. The yield of the function is the length of the string, not
including the terminating zero, or one of these error codes:
<pre>
  PCRE_ERROR_NOMEMORY       (-6)
</pre>
The buffer was too small for <b>pcre_copy_substring()</b>, or the attempt to get
memory failed for <b>pcre_get_substring()</b>.
<pre>
  PCRE_ERROR_NOSUBSTRING    (-7)
</pre>
There is no substring whose number is <i>stringnumber</i>.
</P>
<P>
The <b>pcre_get_substring_list()</b> function extracts all available substrings
and builds a list of pointers to them. All this is done in a single block of
memory that is obtained via <b>pcre_malloc</b>. The address of the memory block
is returned via <i>listptr</i>, which is also the start of the list of string
pointers. The end of the list is marked by a NULL pointer. The yield of the
function is zero if all went well, or the error code
<pre>
  PCRE_ERROR_NOMEMORY       (-6)
</pre>
if the attempt to get the memory block failed.
</P>
<P>
When any of these functions encounter a substring that is unset, which can
happen when capturing subpattern number <i>n+1</i> matches some part of the
subject, but subpattern <i>n</i> has not been used at all, they return an empty
string. This can be distinguished from a genuine zero-length substring by
inspecting the appropriate offset in <i>ovector</i>, which is negative for unset
substrings.
</P>
<P>
The two convenience functions <b>pcre_free_substring()</b> and
<b>pcre_free_substring_list()</b> can be used to free the memory returned by
a previous call of <b>pcre_get_substring()</b> or
<b>pcre_get_substring_list()</b>, respectively. They do nothing more than call
the function pointed to by <b>pcre_free</b>, which of course could be called
directly from a C program. However, PCRE is used in some situations where it is
linked via a special interface to another programming language that cannot use
<b>pcre_free</b> directly; it is for these cases that the functions are
provided.
</P>
<br><a name="SEC16" href="#TOC1">EXTRACTING CAPTURED SUBSTRINGS BY NAME</a><br>
<P>
<b>int pcre_get_stringnumber(const pcre *<i>code</i>,</b>
<b>const char *<i>name</i>);</b>
</P>
<P>
<b>int pcre_copy_named_substring(const pcre *<i>code</i>,</b>
<b>const char *<i>subject</i>, int *<i>ovector</i>,</b>
<b>int <i>stringcount</i>, const char *<i>stringname</i>,</b>
<b>char *<i>buffer</i>, int <i>buffersize</i>);</b>
</P>
<P>
<b>int pcre_get_named_substring(const pcre *<i>code</i>,</b>
<b>const char *<i>subject</i>, int *<i>ovector</i>,</b>
<b>int <i>stringcount</i>, const char *<i>stringname</i>,</b>
<b>const char **<i>stringptr</i>);</b>
</P>
<P>
To extract a substring by name, you first have to find associated number.
For example, for this pattern
<pre>
  (a+)b(?&#60;xxx&#62;\d+)...
</pre>
the number of the subpattern called "xxx" is 2. If the name is known to be
unique (PCRE_DUPNAMES was not set), you can find the number from the name by
calling <b>pcre_get_stringnumber()</b>. The first argument is the compiled
pattern, and the second is the name. The yield of the function is the
subpattern number, or PCRE_ERROR_NOSUBSTRING (-7) if there is no subpattern of
that name.
</P>
<P>
Given the number, you can extract the substring directly, or use one of the
functions described in the previous section. For convenience, there are also
two functions that do the whole job.
</P>
<P>
Most of the arguments of <b>pcre_copy_named_substring()</b> and
<b>pcre_get_named_substring()</b> are the same as those for the similarly named
functions that extract by number. As these are described in the previous
section, they are not re-described here. There are just two differences:
</P>
<P>
First, instead of a substring number, a substring name is given. Second, there
is an extra argument, given at the start, which is a pointer to the compiled
pattern. This is needed in order to gain access to the name-to-number
translation table.
</P>
<P>
These functions call <b>pcre_get_stringnumber()</b>, and if it succeeds, they
then call <b>pcre_copy_substring()</b> or <b>pcre_get_substring()</b>, as
appropriate. <b>NOTE:</b> If PCRE_DUPNAMES is set and there are duplicate names,
the behaviour may not be what you want (see the next section).
</P>
<P>
<b>Warning:</b> If the pattern uses the (?| feature to set up multiple
subpatterns with the same number, as described in the
<a href="pcrepattern.html#dupsubpatternnumber">section on duplicate subpattern numbers</a>
in the
<a href="pcrepattern.html"><b>pcrepattern</b></a>
page, you cannot use names to distinguish the different subpatterns, because
names are not included in the compiled code. The matching process uses only
numbers. For this reason, the use of different names for subpatterns of the
same number causes an error at compile time.
</P>
<br><a name="SEC17" href="#TOC1">DUPLICATE SUBPATTERN NAMES</a><br>
<P>
<b>int pcre_get_stringtable_entries(const pcre *<i>code</i>,</b>
<b>const char *<i>name</i>, char **<i>first</i>, char **<i>last</i>);</b>
</P>
<P>
When a pattern is compiled with the PCRE_DUPNAMES option, names for subpatterns
are not required to be unique. (Duplicate names are always allowed for
subpatterns with the same number, created by using the (?| feature. Indeed, if
such subpatterns are named, they are required to use the same names.)
</P>
<P>
Normally, patterns with duplicate names are such that in any one match, only
one of the named subpatterns participates. An example is shown in the
<a href="pcrepattern.html"><b>pcrepattern</b></a>
documentation.
</P>
<P>
When duplicates are present, <b>pcre_copy_named_substring()</b> and
<b>pcre_get_named_substring()</b> return the first substring corresponding to
the given name that is set. If none are set, PCRE_ERROR_NOSUBSTRING (-7) is
returned; no data is returned. The <b>pcre_get_stringnumber()</b> function
returns one of the numbers that are associated with the name, but it is not
defined which it is.
</P>
<P>
If you want to get full details of all captured substrings for a given name,
you must use the <b>pcre_get_stringtable_entries()</b> function. The first
argument is the compiled pattern, and the second is the name. The third and
fourth are pointers to variables which are updated by the function. After it
has run, they point to the first and last entries in the name-to-number table
for the given name. The function itself returns the length of each entry, or
PCRE_ERROR_NOSUBSTRING (-7) if there are none. The format of the table is
described above in the section entitled <i>Information about a pattern</i>.
Given all the relevant entries for the name, you can extract each of their
numbers, and hence the captured data, if any.
</P>
<br><a name="SEC18" href="#TOC1">FINDING ALL POSSIBLE MATCHES</a><br>
<P>
The traditional matching function uses a similar algorithm to Perl, which stops
when it finds the first match, starting at a given point in the subject. If you
want to find all possible matches, or the longest possible match, consider
using the alternative matching function (see below) instead. If you cannot use
the alternative function, but still need to find all possible matches, you
can kludge it up by making use of the callout facility, which is described in
the
<a href="pcrecallout.html"><b>pcrecallout</b></a>
documentation.
</P>
<P>
What you have to do is to insert a callout right at the end of the pattern.
When your callout function is called, extract and save the current matched
substring. Then return 1, which forces <b>pcre_exec()</b> to backtrack and try
other alternatives. Ultimately, when it runs out of matches, <b>pcre_exec()</b>
will yield PCRE_ERROR_NOMATCH.
<a name="dfamatch"></a></P>
<br><a name="SEC19" href="#TOC1">MATCHING A PATTERN: THE ALTERNATIVE FUNCTION</a><br>
<P>
<b>int pcre_dfa_exec(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
<b>const char *<i>subject</i>, int <i>length</i>, int <i>startoffset</i>,</b>
<b>int <i>options</i>, int *<i>ovector</i>, int <i>ovecsize</i>,</b>
<b>int *<i>workspace</i>, int <i>wscount</i>);</b>
</P>
<P>
The function <b>pcre_dfa_exec()</b> is called to match a subject string against
a compiled pattern, using a matching algorithm that scans the subject string
just once, and does not backtrack. This has different characteristics to the
normal algorithm, and is not compatible with Perl. Some of the features of PCRE
patterns are not supported. Nevertheless, there are times when this kind of
matching can be useful. For a discussion of the two matching algorithms, and a
list of features that <b>pcre_dfa_exec()</b> does not support, see the
<a href="pcrematching.html"><b>pcrematching</b></a>
documentation.
</P>
<P>
The arguments for the <b>pcre_dfa_exec()</b> function are the same as for
<b>pcre_exec()</b>, plus two extras. The <i>ovector</i> argument is used in a
different way, and this is described below. The other common arguments are used
in the same way as for <b>pcre_exec()</b>, so their description is not repeated
here.
</P>
<P>
The two additional arguments provide workspace for the function. The workspace
vector should contain at least 20 elements. It is used for keeping track of
multiple paths through the pattern tree. More workspace will be needed for
patterns and subjects where there are a lot of potential matches.
</P>
<P>
Here is an example of a simple call to <b>pcre_dfa_exec()</b>:
<pre>
  int rc;
  int ovector[10];
  int wspace[20];
  rc = pcre_dfa_exec(
    re,             /* result of pcre_compile() */
    NULL,           /* we didn't study the pattern */
    "some string",  /* the subject string */
    11,             /* the length of the subject string */
    0,              /* start at offset 0 in the subject */
    0,              /* default options */
    ovector,        /* vector of integers for substring information */
    10,             /* number of elements (NOT size in bytes) */
    wspace,         /* working space vector */
    20);            /* number of elements (NOT size in bytes) */
</PRE>
</P>
<br><b>
Option bits for <b>pcre_dfa_exec()</b>
</b><br>
<P>
The unused bits of the <i>options</i> argument for <b>pcre_dfa_exec()</b> must be
zero. The only bits that may be set are PCRE_ANCHORED, PCRE_NEWLINE_<i>xxx</i>,
PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART,
PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, PCRE_PARTIAL_SOFT, PCRE_DFA_SHORTEST,
and PCRE_DFA_RESTART. All but the last four of these are exactly the same as
for <b>pcre_exec()</b>, so their description is not repeated here.
<pre>
  PCRE_PARTIAL_HARD
  PCRE_PARTIAL_SOFT
</pre>
These have the same general effect as they do for <b>pcre_exec()</b>, but the
details are slightly different. When PCRE_PARTIAL_HARD is set for
<b>pcre_dfa_exec()</b>, it returns PCRE_ERROR_PARTIAL if the end of the subject
is reached and there is still at least one matching possibility that requires
additional characters. This happens even if some complete matches have also
been found. When PCRE_PARTIAL_SOFT is set, the return code PCRE_ERROR_NOMATCH
is converted into PCRE_ERROR_PARTIAL if the end of the subject is reached,
there have been no complete matches, but there is still at least one matching
possibility. The portion of the string that was inspected when the longest
partial match was found is set as the first matching string in both cases.
<pre>
  PCRE_DFA_SHORTEST
</pre>
Setting the PCRE_DFA_SHORTEST option causes the matching algorithm to stop as
soon as it has found one match. Because of the way the alternative algorithm
works, this is necessarily the shortest possible match at the first possible
matching point in the subject string.
<pre>
  PCRE_DFA_RESTART
</pre>
When <b>pcre_dfa_exec()</b> returns a partial match, it is possible to call it
again, with additional subject characters, and have it continue with the same
match. The PCRE_DFA_RESTART option requests this action; when it is set, the
<i>workspace</i> and <i>wscount</i> options must reference the same vector as
before because data about the match so far is left in them after a partial
match. There is more discussion of this facility in the
<a href="pcrepartial.html"><b>pcrepartial</b></a>
documentation.
</P>
<br><b>
Successful returns from <b>pcre_dfa_exec()</b>
</b><br>
<P>
When <b>pcre_dfa_exec()</b> succeeds, it may have matched more than one
substring in the subject. Note, however, that all the matches from one run of
the function start at the same point in the subject. The shorter matches are
all initial substrings of the longer matches. For example, if the pattern
<pre>
  &#60;.*&#62;
</pre>
is matched against the string
<pre>
  This is &#60;something&#62; &#60;something else&#62; &#60;something further&#62; no more
</pre>
the three matched strings are
<pre>
  &#60;something&#62;
  &#60;something&#62; &#60;something else&#62;
  &#60;something&#62; &#60;something else&#62; &#60;something further&#62;
</pre>
On success, the yield of the function is a number greater than zero, which is
the number of matched substrings. The substrings themselves are returned in
<i>ovector</i>. Each string uses two elements; the first is the offset to the
start, and the second is the offset to the end. In fact, all the strings have
the same start offset. (Space could have been saved by giving this only once,
but it was decided to retain some compatibility with the way <b>pcre_exec()</b>
returns data, even though the meaning of the strings is different.)
</P>
<P>
The strings are returned in reverse order of length; that is, the longest
matching string is given first. If there were too many matches to fit into
<i>ovector</i>, the yield of the function is zero, and the vector is filled with
the longest matches.
</P>
<br><b>
Error returns from <b>pcre_dfa_exec()</b>
</b><br>
<P>
The <b>pcre_dfa_exec()</b> function returns a negative number when it fails.
Many of the errors are the same as for <b>pcre_exec()</b>, and these are
described
<a href="#errorlist">above.</a>
There are in addition the following errors that are specific to
<b>pcre_dfa_exec()</b>:
<pre>
  PCRE_ERROR_DFA_UITEM      (-16)
</pre>
This return is given if <b>pcre_dfa_exec()</b> encounters an item in the pattern
that it does not support, for instance, the use of \C or a back reference.
<pre>
  PCRE_ERROR_DFA_UCOND      (-17)
</pre>
This return is given if <b>pcre_dfa_exec()</b> encounters a condition item that
uses a back reference for the condition, or a test for recursion in a specific
group. These are not supported.
<pre>
  PCRE_ERROR_DFA_UMLIMIT    (-18)
</pre>
This return is given if <b>pcre_dfa_exec()</b> is called with an <i>extra</i>
block that contains a setting of the <i>match_limit</i> field. This is not
supported (it is meaningless).
<pre>
  PCRE_ERROR_DFA_WSSIZE     (-19)
</pre>
This return is given if <b>pcre_dfa_exec()</b> runs out of space in the
<i>workspace</i> vector.
<pre>
  PCRE_ERROR_DFA_RECURSE    (-20)
</pre>
When a recursive subpattern is processed, the matching function calls itself
recursively, using private vectors for <i>ovector</i> and <i>workspace</i>. This
error is given if the output vector is not large enough. This should be
extremely rare, as a vector of size 1000 is used.
</P>
<br><a name="SEC20" href="#TOC1">SEE ALSO</a><br>
<P>
<b>pcrebuild</b>(3), <b>pcrecallout</b>(3), <b>pcrecpp(3)</b>(3),
<b>pcrematching</b>(3), <b>pcrepartial</b>(3), <b>pcreposix</b>(3),
<b>pcreprecompile</b>(3), <b>pcresample</b>(3), <b>pcrestack</b>(3).
</P>
<br><a name="SEC21" href="#TOC1">AUTHOR</a><br>
<P>
Philip Hazel
<br>
University Computing Service
<br>
Cambridge CB2 3QH, England.
<br>
</P>
<br><a name="SEC22" href="#TOC1">REVISION</a><br>
<P>
Last updated: 03 October 2009
<br>
Copyright &copy; 1997-2009 University of Cambridge.
<br>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[-��ww3doc/alt-pcre802-devel/html/pcre_copy_substring.htmlnu�[���<html>
<head>
<title>pcre_copy_substring specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_copy_substring man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>int pcre_copy_substring(const char *<i>subject</i>, int *<i>ovector</i>,</b>
<b>int <i>stringcount</i>, int <i>stringnumber</i>, char *<i>buffer</i>,</b>
<b>int <i>buffersize</i>);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This is a convenience function for extracting a captured substring into a given
buffer. The arguments are:
<pre>
  <i>subject</i>       Subject that has been successfully matched
  <i>ovector</i>       Offset vector that <b>pcre_exec()</b> used
  <i>stringcount</i>   Value returned by <b>pcre_exec()</b>
  <i>stringnumber</i>  Number of the required substring
  <i>buffer</i>        Buffer to receive the string
  <i>buffersize</i>    Size of buffer
</pre>
The yield is the length of the string, PCRE_ERROR_NOMEMORY if the buffer was
too small, or PCRE_ERROR_NOSUBSTRING if the string number is invalid.
</P>
<P>
There is a complete description of the PCRE native API in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[H��K}}*doc/alt-pcre802-devel/html/pcrecompat.htmlnu�[���<html>
<head>
<title>pcrecompat specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcrecompat man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
DIFFERENCES BETWEEN PCRE AND PERL
</b><br>
<P>
This document describes the differences in the ways that PCRE and Perl handle
regular expressions. The differences described here are with respect to Perl
5.10.
</P>
<P>
1. PCRE has only a subset of Perl's UTF-8 and Unicode support. Details of what
it does have are given in the
<a href="pcre.html#utf8support">section on UTF-8 support</a>
in the main
<a href="pcre.html"><b>pcre</b></a>
page.
</P>
<P>
2. PCRE does not allow repeat quantifiers on lookahead assertions. Perl permits
them, but they do not mean what you might think. For example, (?!a){3} does
not assert that the next three characters are not "a". It just asserts that the
next character is not "a" three times.
</P>
<P>
3. Capturing subpatterns that occur inside negative lookahead assertions are
counted, but their entries in the offsets vector are never set. Perl sets its
numerical variables from any such patterns that are matched before the
assertion fails to match something (thereby succeeding), but only if the
negative lookahead assertion contains just one branch.
</P>
<P>
4. Though binary zero characters are supported in the subject string, they are
not allowed in a pattern string because it is passed as a normal C string,
terminated by zero. The escape sequence \0 can be used in the pattern to
represent a binary zero.
</P>
<P>
5. The following Perl escape sequences are not supported: \l, \u, \L,
\U, and \N. In fact these are implemented by Perl's general string-handling
and are not part of its pattern matching engine. If any of these are
encountered by PCRE, an error is generated.
</P>
<P>
6. The Perl escape sequences \p, \P, and \X are supported only if PCRE is
built with Unicode character property support. The properties that can be
tested with \p and \P are limited to the general category properties such as
Lu and Nd, script names such as Greek or Han, and the derived properties Any
and L&. PCRE does support the Cs (surrogate) property, which Perl does not; the
Perl documentation says "Because Perl hides the need for the user to understand
the internal representation of Unicode characters, there is no need to
implement the somewhat messy concept of surrogates."
</P>
<P>
7. PCRE does support the \Q...\E escape for quoting substrings. Characters in
between are treated as literals. This is slightly different from Perl in that $
and @ are also handled as literals inside the quotes. In Perl, they cause
variable interpolation (but of course PCRE does not have variables). Note the
following examples:
<pre>
    Pattern            PCRE matches      Perl matches

    \Qabc$xyz\E        abc$xyz           abc followed by the contents of $xyz
    \Qabc\$xyz\E       abc\$xyz          abc\$xyz
    \Qabc\E\$\Qxyz\E   abc$xyz           abc$xyz
</pre>
The \Q...\E sequence is recognized both inside and outside character classes.
</P>
<P>
8. Fairly obviously, PCRE does not support the (?{code}) and (??{code})
constructions. However, there is support for recursive patterns. This is not
available in Perl 5.8, but it is in Perl 5.10. Also, the PCRE "callout"
feature allows an external function to be called during pattern matching. See
the
<a href="pcrecallout.html"><b>pcrecallout</b></a>
documentation for details.
</P>
<P>
9. Subpatterns that are called recursively or as "subroutines" are always
treated as atomic groups in PCRE. This is like Python, but unlike Perl. There
is a discussion of an example that explains this in more detail in the
<a href="pcrepattern.html#recursiondifference">section on recursion differences from Perl</a>
in the
<a href="pcrepattern.html"><b>pcrepattern</b></a>
page.
</P>
<P>
10. There are some differences that are concerned with the settings of captured
strings when part of a pattern is repeated. For example, matching "aba" against
the pattern /^(a(b)?)+$/ in Perl leaves $2 unset, but in PCRE it is set to "b".
</P>
<P>
11. PCRE does support Perl 5.10's backtracking verbs (*ACCEPT), (*FAIL), (*F),
(*COMMIT), (*PRUNE), (*SKIP), and (*THEN), but only in the forms without an
argument. PCRE does not support (*MARK).
</P>
<P>
12. PCRE's handling of duplicate subpattern numbers and duplicate subpattern
names is not as general as Perl's. This is a consequence of the fact the PCRE
works internally just with numbers, using an external table to translate
between numbers and names. In particular, a pattern such as (?|(?&#60;a&#62;A)|(?&#60;b)B),
where the two capturing parentheses have the same number but different names,
is not supported, and causes an error at compile time. If it were allowed, it
would not be possible to distinguish which parentheses matched, because both
names map to capturing subpattern number 1. To avoid this confusing situation,
an error is given at compile time.
</P>
<P>
13. PCRE provides some extensions to the Perl regular expression facilities.
Perl 5.10 includes new features that are not in earlier versions of Perl, some
of which (such as named parentheses) have been in PCRE for some time. This list
is with respect to Perl 5.10:
<br>
<br>
(a) Although lookbehind assertions in PCRE must match fixed length strings,
each alternative branch of a lookbehind assertion can match a different length
of string. Perl requires them all to have the same length.
<br>
<br>
(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $
meta-character matches only at the very end of the string.
<br>
<br>
(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special
meaning is faulted. Otherwise, like Perl, the backslash is quietly ignored.
(Perl can be made to issue a warning.)
<br>
<br>
(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is
inverted, that is, by default they are not greedy, but if followed by a
question mark they are.
<br>
<br>
(e) PCRE_ANCHORED can be used at matching time to force a pattern to be tried
only at the first matching position in the subject string.
<br>
<br>
(f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART, and
PCRE_NO_AUTO_CAPTURE options for <b>pcre_exec()</b> have no Perl equivalents.
<br>
<br>
(g) The \R escape sequence can be restricted to match only CR, LF, or CRLF
by the PCRE_BSR_ANYCRLF option.
<br>
<br>
(h) The callout facility is PCRE-specific.
<br>
<br>
(i) The partial matching facility is PCRE-specific.
<br>
<br>
(j) Patterns compiled by PCRE can be saved and re-used at a later time, even on
different hosts that have the other endianness.
<br>
<br>
(k) The alternative matching function (<b>pcre_dfa_exec()</b>) matches in a
different way and is not Perl-compatible.
<br>
<br>
(l) PCRE recognizes some special sequences such as (*CR) at the start of
a pattern that set overall options that cannot be changed within the pattern.
</P>
<br><b>
AUTHOR
</b><br>
<P>
Philip Hazel
<br>
University Computing Service
<br>
Cambridge CB2 3QH, England.
<br>
</P>
<br><b>
REVISION
</b><br>
<P>
Last updated: 04 October 2009
<br>
Copyright &copy; 1997-2009 University of Cambridge.
<br>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[����3�3(doc/alt-pcre802-devel/html/pcredemo.htmlnu�[���<html>
<head>
<title>pcredemo specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcredemo man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<ul>
</ul>
<PRE>
/*************************************************
*           PCRE DEMONSTRATION PROGRAM           *
*************************************************/

/* This is a demonstration program to illustrate the most straightforward ways
of calling the PCRE regular expression library from a C program. See the
pcresample documentation for a short discussion ("man pcresample" if you have
the PCRE man pages installed).

In Unix-like environments, if PCRE is installed in your standard system
libraries, you should be able to compile this program using this command:

gcc -Wall pcredemo.c -lpcre -o pcredemo

If PCRE is not installed in a standard place, it is likely to be installed with
support for the pkg-config mechanism. If you have pkg-config, you can compile
this program using this command:

gcc -Wall pcredemo.c `pkg-config --cflags --libs libpcre` -o pcredemo

If you do not have pkg-config, you may have to use this:

gcc -Wall pcredemo.c -I/usr/local/include -L/usr/local/lib \
  -R/usr/local/lib -lpcre -o pcredemo

Replace "/usr/local/include" and "/usr/local/lib" with wherever the include and
library files for PCRE are installed on your system. Only some operating
systems (e.g. Solaris) use the -R option.

Building under Windows:

If you want to statically link this program against a non-dll .a file, you must
define PCRE_STATIC before including pcre.h, otherwise the pcre_malloc() and
pcre_free() exported functions will be declared __declspec(dllimport), with
unwanted results. So in this environment, uncomment the following line. */

/* #define PCRE_STATIC */

#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;pcre.h&gt;

#define OVECCOUNT 30    /* should be a multiple of 3 */


int main(int argc, char **argv)
{
pcre *re;
const char *error;
char *pattern;
char *subject;
unsigned char *name_table;
int erroffset;
int find_all;
int namecount;
int name_entry_size;
int ovector[OVECCOUNT];
int subject_length;
int rc, i;


/**************************************************************************
* First, sort out the command line. There is only one possible option at  *
* the moment, "-g" to request repeated matching to find all occurrences,  *
* like Perl's /g option. We set the variable find_all to a non-zero value *
* if the -g option is present. Apart from that, there must be exactly two *
* arguments.                                                              *
**************************************************************************/

find_all = 0;
for (i = 1; i &lt; argc; i++)
  {
  if (strcmp(argv[i], "-g") == 0) find_all = 1;
    else break;
  }

/* After the options, we require exactly two arguments, which are the pattern,
and the subject string. */

if (argc - i != 2)
  {
  printf("Two arguments required: a regex and a subject string\n");
  return 1;
  }

pattern = argv[i];
subject = argv[i+1];
subject_length = (int)strlen(subject);


/*************************************************************************
* Now we are going to compile the regular expression pattern, and handle *
* and errors that are detected.                                          *
*************************************************************************/

re = pcre_compile(
  pattern,              /* the pattern */
  0,                    /* default options */
  &amp;error,               /* for error message */
  &amp;erroffset,           /* for error offset */
  NULL);                /* use default character tables */

/* Compilation failed: print the error message and exit */

if (re == NULL)
  {
  printf("PCRE compilation failed at offset %d: %s\n", erroffset, error);
  return 1;
  }


/*************************************************************************
* If the compilation succeeded, we call PCRE again, in order to do a     *
* pattern match against the subject string. This does just ONE match. If *
* further matching is needed, it will be done below.                     *
*************************************************************************/

rc = pcre_exec(
  re,                   /* the compiled pattern */
  NULL,                 /* no extra data - we didn't study the pattern */
  subject,              /* the subject string */
  subject_length,       /* the length of the subject */
  0,                    /* start at offset 0 in the subject */
  0,                    /* default options */
  ovector,              /* output vector for substring information */
  OVECCOUNT);           /* number of elements in the output vector */

/* Matching failed: handle error cases */

if (rc &lt; 0)
  {
  switch(rc)
    {
    case PCRE_ERROR_NOMATCH: printf("No match\n"); break;
    /*
    Handle other special cases if you like
    */
    default: printf("Matching error %d\n", rc); break;
    }
  pcre_free(re);     /* Release memory used for the compiled pattern */
  return 1;
  }

/* Match succeded */

printf("\nMatch succeeded at offset %d\n", ovector[0]);


/*************************************************************************
* We have found the first match within the subject string. If the output *
* vector wasn't big enough, say so. Then output any substrings that were *
* captured.                                                              *
*************************************************************************/

/* The output vector wasn't big enough */

if (rc == 0)
  {
  rc = OVECCOUNT/3;
  printf("ovector only has room for %d captured substrings\n", rc - 1);
  }

/* Show substrings stored in the output vector by number. Obviously, in a real
application you might want to do things other than print them. */

for (i = 0; i &lt; rc; i++)
  {
  char *substring_start = subject + ovector[2*i];
  int substring_length = ovector[2*i+1] - ovector[2*i];
  printf("%2d: %.*s\n", i, substring_length, substring_start);
  }


/**************************************************************************
* That concludes the basic part of this demonstration program. We have    *
* compiled a pattern, and performed a single match. The code that follows *
* shows first how to access named substrings, and then how to code for    *
* repeated matches on the same subject.                                   *
**************************************************************************/

/* See if there are any named substrings, and if so, show them by name. First
we have to extract the count of named parentheses from the pattern. */

(void)pcre_fullinfo(
  re,                   /* the compiled pattern */
  NULL,                 /* no extra data - we didn't study the pattern */
  PCRE_INFO_NAMECOUNT,  /* number of named substrings */
  &amp;namecount);          /* where to put the answer */

if (namecount &lt;= 0) printf("No named substrings\n"); else
  {
  unsigned char *tabptr;
  printf("Named substrings\n");

  /* Before we can access the substrings, we must extract the table for
  translating names to numbers, and the size of each entry in the table. */

  (void)pcre_fullinfo(
    re,                       /* the compiled pattern */
    NULL,                     /* no extra data - we didn't study the pattern */
    PCRE_INFO_NAMETABLE,      /* address of the table */
    &amp;name_table);             /* where to put the answer */

  (void)pcre_fullinfo(
    re,                       /* the compiled pattern */
    NULL,                     /* no extra data - we didn't study the pattern */
    PCRE_INFO_NAMEENTRYSIZE,  /* size of each entry in the table */
    &amp;name_entry_size);        /* where to put the answer */

  /* Now we can scan the table and, for each entry, print the number, the name,
  and the substring itself. */

  tabptr = name_table;
  for (i = 0; i &lt; namecount; i++)
    {
    int n = (tabptr[0] &lt;&lt; 8) | tabptr[1];
    printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
      ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);
    tabptr += name_entry_size;
    }
  }


/*************************************************************************
* If the "-g" option was given on the command line, we want to continue  *
* to search for additional matches in the subject string, in a similar   *
* way to the /g option in Perl. This turns out to be trickier than you   *
* might think because of the possibility of matching an empty string.    *
* What happens is as follows:                                            *
*                                                                        *
* If the previous match was NOT for an empty string, we can just start   *
* the next match at the end of the previous one.                         *
*                                                                        *
* If the previous match WAS for an empty string, we can't do that, as it *
* would lead to an infinite loop. Instead, a special call of pcre_exec() *
* is made with the PCRE_NOTEMPTY_ATSTART and PCRE_ANCHORED flags set.    *
* The first of these tells PCRE that an empty string at the start of the *
* subject is not a valid match; other possibilities must be tried. The   *
* second flag restricts PCRE to one match attempt at the initial string  *
* position. If this match succeeds, an alternative to the empty string   *
* match has been found, and we can proceed round the loop.               *
*************************************************************************/

if (!find_all)
  {
  pcre_free(re);   /* Release the memory used for the compiled pattern */
  return 0;        /* Finish unless -g was given */
  }

/* Loop for second and subsequent matches */

for (;;)
  {
  int options = 0;                 /* Normally no options */
  int start_offset = ovector[1];   /* Start at end of previous match */

  /* If the previous match was for an empty string, we are finished if we are
  at the end of the subject. Otherwise, arrange to run another match at the
  same point to see if a non-empty match can be found. */

  if (ovector[0] == ovector[1])
    {
    if (ovector[0] == subject_length) break;
    options = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED;
    }

  /* Run the next matching operation */

  rc = pcre_exec(
    re,                   /* the compiled pattern */
    NULL,                 /* no extra data - we didn't study the pattern */
    subject,              /* the subject string */
    subject_length,       /* the length of the subject */
    start_offset,         /* starting offset in the subject */
    options,              /* options */
    ovector,              /* output vector for substring information */
    OVECCOUNT);           /* number of elements in the output vector */

  /* This time, a result of NOMATCH isn't an error. If the value in "options"
  is zero, it just means we have found all possible matches, so the loop ends.
  Otherwise, it means we have failed to find a non-empty-string match at a
  point where there was a previous empty-string match. In this case, we do what
  Perl does: advance the matching position by one, and continue. We do this by
  setting the "end of previous match" offset, because that is picked up at the
  top of the loop as the point at which to start again. */

  if (rc == PCRE_ERROR_NOMATCH)
    {
    if (options == 0) break;
    ovector[1] = start_offset + 1;
    continue;    /* Go round the loop again */
    }

  /* Other matching errors are not recoverable. */

  if (rc &lt; 0)
    {
    printf("Matching error %d\n", rc);
    pcre_free(re);    /* Release memory used for the compiled pattern */
    return 1;
    }

  /* Match succeded */

  printf("\nMatch succeeded again at offset %d\n", ovector[0]);

  /* The match succeeded, but the output vector wasn't big enough. */

  if (rc == 0)
    {
    rc = OVECCOUNT/3;
    printf("ovector only has room for %d captured substrings\n", rc - 1);
    }

  /* As before, show substrings stored in the output vector by number, and then
  also any named substrings. */

  for (i = 0; i &lt; rc; i++)
    {
    char *substring_start = subject + ovector[2*i];
    int substring_length = ovector[2*i+1] - ovector[2*i];
    printf("%2d: %.*s\n", i, substring_length, substring_start);
    }

  if (namecount &lt;= 0) printf("No named substrings\n"); else
    {
    unsigned char *tabptr = name_table;
    printf("Named substrings\n");
    for (i = 0; i &lt; namecount; i++)
      {
      int n = (tabptr[0] &lt;&lt; 8) | tabptr[1];
      printf("(%d) %*s: %.*s\n", n, name_entry_size - 3, tabptr + 2,
        ovector[2*n+1] - ovector[2*n], subject + ovector[2*n]);
      tabptr += name_entry_size;
      }
    }
  }      /* End of loop to find second and subsequent matches */

printf("\n");
pcre_free(re);       /* Release memory used for the compiled pattern */
return 0;
}

/* End of pcredemo.c */
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[&! �6�6*doc/alt-pcre802-devel/html/pcresyntax.htmlnu�[���<html>
<head>
<title>pcresyntax specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcresyntax man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<ul>
<li><a name="TOC1" href="#SEC1">PCRE REGULAR EXPRESSION SYNTAX SUMMARY</a>
<li><a name="TOC2" href="#SEC2">QUOTING</a>
<li><a name="TOC3" href="#SEC3">CHARACTERS</a>
<li><a name="TOC4" href="#SEC4">CHARACTER TYPES</a>
<li><a name="TOC5" href="#SEC5">GENERAL CATEGORY PROPERTY CODES FOR \p and \P</a>
<li><a name="TOC6" href="#SEC6">SCRIPT NAMES FOR \p AND \P</a>
<li><a name="TOC7" href="#SEC7">CHARACTER CLASSES</a>
<li><a name="TOC8" href="#SEC8">QUANTIFIERS</a>
<li><a name="TOC9" href="#SEC9">ANCHORS AND SIMPLE ASSERTIONS</a>
<li><a name="TOC10" href="#SEC10">MATCH POINT RESET</a>
<li><a name="TOC11" href="#SEC11">ALTERNATION</a>
<li><a name="TOC12" href="#SEC12">CAPTURING</a>
<li><a name="TOC13" href="#SEC13">ATOMIC GROUPS</a>
<li><a name="TOC14" href="#SEC14">COMMENT</a>
<li><a name="TOC15" href="#SEC15">OPTION SETTING</a>
<li><a name="TOC16" href="#SEC16">LOOKAHEAD AND LOOKBEHIND ASSERTIONS</a>
<li><a name="TOC17" href="#SEC17">BACKREFERENCES</a>
<li><a name="TOC18" href="#SEC18">SUBROUTINE REFERENCES (POSSIBLY RECURSIVE)</a>
<li><a name="TOC19" href="#SEC19">CONDITIONAL PATTERNS</a>
<li><a name="TOC20" href="#SEC20">BACKTRACKING CONTROL</a>
<li><a name="TOC21" href="#SEC21">NEWLINE CONVENTIONS</a>
<li><a name="TOC22" href="#SEC22">WHAT \R MATCHES</a>
<li><a name="TOC23" href="#SEC23">CALLOUTS</a>
<li><a name="TOC24" href="#SEC24">SEE ALSO</a>
<li><a name="TOC25" href="#SEC25">AUTHOR</a>
<li><a name="TOC26" href="#SEC26">REVISION</a>
</ul>
<br><a name="SEC1" href="#TOC1">PCRE REGULAR EXPRESSION SYNTAX SUMMARY</a><br>
<P>
The full syntax and semantics of the regular expressions that are supported by
PCRE are described in the
<a href="pcrepattern.html"><b>pcrepattern</b></a>
documentation. This document contains just a quick-reference summary of the
syntax.
</P>
<br><a name="SEC2" href="#TOC1">QUOTING</a><br>
<P>
<pre>
  \x         where x is non-alphanumeric is a literal x
  \Q...\E    treat enclosed characters as literal
</PRE>
</P>
<br><a name="SEC3" href="#TOC1">CHARACTERS</a><br>
<P>
<pre>
  \a         alarm, that is, the BEL character (hex 07)
  \cx        "control-x", where x is any character
  \e         escape (hex 1B)
  \f         formfeed (hex 0C)
  \n         newline (hex 0A)
  \r         carriage return (hex 0D)
  \t         tab (hex 09)
  \ddd       character with octal code ddd, or backreference
  \xhh       character with hex code hh
  \x{hhh..}  character with hex code hhh..
</PRE>
</P>
<br><a name="SEC4" href="#TOC1">CHARACTER TYPES</a><br>
<P>
<pre>
  .          any character except newline;
               in dotall mode, any character whatsoever
  \C         one byte, even in UTF-8 mode (best avoided)
  \d         a decimal digit
  \D         a character that is not a decimal digit
  \h         a horizontal whitespace character
  \H         a character that is not a horizontal whitespace character
  \p{<i>xx</i>}     a character with the <i>xx</i> property
  \P{<i>xx</i>}     a character without the <i>xx</i> property
  \R         a newline sequence
  \s         a whitespace character
  \S         a character that is not a whitespace character
  \v         a vertical whitespace character
  \V         a character that is not a vertical whitespace character
  \w         a "word" character
  \W         a "non-word" character
  \X         an extended Unicode sequence
</pre>
In PCRE, \d, \D, \s, \S, \w, and \W recognize only ASCII characters.
</P>
<br><a name="SEC5" href="#TOC1">GENERAL CATEGORY PROPERTY CODES FOR \p and \P</a><br>
<P>
<pre>
  C          Other
  Cc         Control
  Cf         Format
  Cn         Unassigned
  Co         Private use
  Cs         Surrogate

  L          Letter
  Ll         Lower case letter
  Lm         Modifier letter
  Lo         Other letter
  Lt         Title case letter
  Lu         Upper case letter
  L&         Ll, Lu, or Lt

  M          Mark
  Mc         Spacing mark
  Me         Enclosing mark
  Mn         Non-spacing mark

  N          Number
  Nd         Decimal number
  Nl         Letter number
  No         Other number

  P          Punctuation
  Pc         Connector punctuation
  Pd         Dash punctuation
  Pe         Close punctuation
  Pf         Final punctuation
  Pi         Initial punctuation
  Po         Other punctuation
  Ps         Open punctuation

  S          Symbol
  Sc         Currency symbol
  Sk         Modifier symbol
  Sm         Mathematical symbol
  So         Other symbol

  Z          Separator
  Zl         Line separator
  Zp         Paragraph separator
  Zs         Space separator
</PRE>
</P>
<br><a name="SEC6" href="#TOC1">SCRIPT NAMES FOR \p AND \P</a><br>
<P>
Arabic,
Armenian,
Avestan,
Balinese,
Bamum,
Bengali,
Bopomofo,
Braille,
Buginese,
Buhid,
Canadian_Aboriginal,
Carian,
Cham,
Cherokee,
Common,
Coptic,
Cuneiform,
Cypriot,
Cyrillic,
Deseret,
Devanagari,
Egyptian_Hieroglyphs,
Ethiopic,
Georgian,
Glagolitic,
Gothic,
Greek,
Gujarati,
Gurmukhi,
Han,
Hangul,
Hanunoo,
Hebrew,
Hiragana,
Imperial_Aramaic,
Inherited,
Inscriptional_Pahlavi,
Inscriptional_Parthian,
Javanese,
Kaithi,
Kannada,
Katakana,
Kayah_Li,
Kharoshthi,
Khmer,
Lao,
Latin,
Lepcha,
Limbu,
Linear_B,
Lisu,
Lycian,
Lydian,
Malayalam,
Meetei_Mayek,
Mongolian,
Myanmar,
New_Tai_Lue,
Nko,
Ogham,
Old_Italic,
Old_Persian,
Old_South_Arabian,
Old_Turkic,
Ol_Chiki,
Oriya,
Osmanya,
Phags_Pa,
Phoenician,
Rejang,
Runic,
Samaritan,
Saurashtra,
Shavian,
Sinhala,
Sundanese,
Syloti_Nagri,
Syriac,
Tagalog,
Tagbanwa,
Tai_Le,
Tai_Tham,
Tai_Viet,
Tamil,
Telugu,
Thaana,
Thai,
Tibetan,
Tifinagh,
Ugaritic,
Vai,
Yi.
</P>
<br><a name="SEC7" href="#TOC1">CHARACTER CLASSES</a><br>
<P>
<pre>
  [...]       positive character class
  [^...]      negative character class
  [x-y]       range (can be used for hex characters)
  [[:xxx:]]   positive POSIX named set
  [[:^xxx:]]  negative POSIX named set

  alnum       alphanumeric
  alpha       alphabetic
  ascii       0-127
  blank       space or tab
  cntrl       control character
  digit       decimal digit
  graph       printing, excluding space
  lower       lower case letter
  print       printing, including space
  punct       printing, excluding alphanumeric
  space       whitespace
  upper       upper case letter
  word        same as \w
  xdigit      hexadecimal digit
</pre>
In PCRE, POSIX character set names recognize only ASCII characters. You can use
\Q...\E inside a character class.
</P>
<br><a name="SEC8" href="#TOC1">QUANTIFIERS</a><br>
<P>
<pre>
  ?           0 or 1, greedy
  ?+          0 or 1, possessive
  ??          0 or 1, lazy
  *           0 or more, greedy
  *+          0 or more, possessive
  *?          0 or more, lazy
  +           1 or more, greedy
  ++          1 or more, possessive
  +?          1 or more, lazy
  {n}         exactly n
  {n,m}       at least n, no more than m, greedy
  {n,m}+      at least n, no more than m, possessive
  {n,m}?      at least n, no more than m, lazy
  {n,}        n or more, greedy
  {n,}+       n or more, possessive
  {n,}?       n or more, lazy
</PRE>
</P>
<br><a name="SEC9" href="#TOC1">ANCHORS AND SIMPLE ASSERTIONS</a><br>
<P>
<pre>
  \b          word boundary (only ASCII letters recognized)
  \B          not a word boundary
  ^           start of subject
               also after internal newline in multiline mode
  \A          start of subject
  $           end of subject
               also before newline at end of subject
               also before internal newline in multiline mode
  \Z          end of subject
               also before newline at end of subject
  \z          end of subject
  \G          first matching position in subject
</PRE>
</P>
<br><a name="SEC10" href="#TOC1">MATCH POINT RESET</a><br>
<P>
<pre>
  \K          reset start of match
</PRE>
</P>
<br><a name="SEC11" href="#TOC1">ALTERNATION</a><br>
<P>
<pre>
  expr|expr|expr...
</PRE>
</P>
<br><a name="SEC12" href="#TOC1">CAPTURING</a><br>
<P>
<pre>
  (...)           capturing group
  (?&#60;name&#62;...)    named capturing group (Perl)
  (?'name'...)    named capturing group (Perl)
  (?P&#60;name&#62;...)   named capturing group (Python)
  (?:...)         non-capturing group
  (?|...)         non-capturing group; reset group numbers for
                   capturing groups in each alternative
</PRE>
</P>
<br><a name="SEC13" href="#TOC1">ATOMIC GROUPS</a><br>
<P>
<pre>
  (?&#62;...)         atomic, non-capturing group
</PRE>
</P>
<br><a name="SEC14" href="#TOC1">COMMENT</a><br>
<P>
<pre>
  (?#....)        comment (not nestable)
</PRE>
</P>
<br><a name="SEC15" href="#TOC1">OPTION SETTING</a><br>
<P>
<pre>
  (?i)            caseless
  (?J)            allow duplicate names
  (?m)            multiline
  (?s)            single line (dotall)
  (?U)            default ungreedy (lazy)
  (?x)            extended (ignore white space)
  (?-...)         unset option(s)
</pre>
The following is recognized only at the start of a pattern or after one of the
newline-setting options with similar syntax:
<pre>
  (*UTF8)         set UTF-8 mode
</PRE>
</P>
<br><a name="SEC16" href="#TOC1">LOOKAHEAD AND LOOKBEHIND ASSERTIONS</a><br>
<P>
<pre>
  (?=...)         positive look ahead
  (?!...)         negative look ahead
  (?&#60;=...)        positive look behind
  (?&#60;!...)        negative look behind
</pre>
Each top-level branch of a look behind must be of a fixed length.
</P>
<br><a name="SEC17" href="#TOC1">BACKREFERENCES</a><br>
<P>
<pre>
  \n              reference by number (can be ambiguous)
  \gn             reference by number
  \g{n}           reference by number
  \g{-n}          relative reference by number
  \k&#60;name&#62;        reference by name (Perl)
  \k'name'        reference by name (Perl)
  \g{name}        reference by name (Perl)
  \k{name}        reference by name (.NET)
  (?P=name)       reference by name (Python)
</PRE>
</P>
<br><a name="SEC18" href="#TOC1">SUBROUTINE REFERENCES (POSSIBLY RECURSIVE)</a><br>
<P>
<pre>
  (?R)            recurse whole pattern
  (?n)            call subpattern by absolute number
  (?+n)           call subpattern by relative number
  (?-n)           call subpattern by relative number
  (?&name)        call subpattern by name (Perl)
  (?P&#62;name)       call subpattern by name (Python)
  \g&#60;name&#62;        call subpattern by name (Oniguruma)
  \g'name'        call subpattern by name (Oniguruma)
  \g&#60;n&#62;           call subpattern by absolute number (Oniguruma)
  \g'n'           call subpattern by absolute number (Oniguruma)
  \g&#60;+n&#62;          call subpattern by relative number (PCRE extension)
  \g'+n'          call subpattern by relative number (PCRE extension)
  \g&#60;-n&#62;          call subpattern by relative number (PCRE extension)
  \g'-n'          call subpattern by relative number (PCRE extension)
</PRE>
</P>
<br><a name="SEC19" href="#TOC1">CONDITIONAL PATTERNS</a><br>
<P>
<pre>
  (?(condition)yes-pattern)
  (?(condition)yes-pattern|no-pattern)

  (?(n)...        absolute reference condition
  (?(+n)...       relative reference condition
  (?(-n)...       relative reference condition
  (?(&#60;name&#62;)...   named reference condition (Perl)
  (?('name')...   named reference condition (Perl)
  (?(name)...     named reference condition (PCRE)
  (?(R)...        overall recursion condition
  (?(Rn)...       specific group recursion condition
  (?(R&name)...   specific recursion condition
  (?(DEFINE)...   define subpattern for reference
  (?(assert)...   assertion condition
</PRE>
</P>
<br><a name="SEC20" href="#TOC1">BACKTRACKING CONTROL</a><br>
<P>
The following act immediately they are reached:
<pre>
  (*ACCEPT)       force successful match
  (*FAIL)         force backtrack; synonym (*F)
</pre>
The following act only when a subsequent match failure causes a backtrack to
reach them. They all force a match failure, but they differ in what happens
afterwards. Those that advance the start-of-match point do so only if the
pattern is not anchored.
<pre>
  (*COMMIT)       overall failure, no advance of starting point
  (*PRUNE)        advance to next starting character
  (*SKIP)         advance start to current matching position
  (*THEN)         local failure, backtrack to next alternation
</PRE>
</P>
<br><a name="SEC21" href="#TOC1">NEWLINE CONVENTIONS</a><br>
<P>
These are recognized only at the very start of the pattern or after a
(*BSR_...) or (*UTF8) option.
<pre>
  (*CR)           carriage return only
  (*LF)           linefeed only
  (*CRLF)         carriage return followed by linefeed
  (*ANYCRLF)      all three of the above
  (*ANY)          any Unicode newline sequence
</PRE>
</P>
<br><a name="SEC22" href="#TOC1">WHAT \R MATCHES</a><br>
<P>
These are recognized only at the very start of the pattern or after a
(*...) option that sets the newline convention or UTF-8 mode.
<pre>
  (*BSR_ANYCRLF)  CR, LF, or CRLF
  (*BSR_UNICODE)  any Unicode newline sequence
</PRE>
</P>
<br><a name="SEC23" href="#TOC1">CALLOUTS</a><br>
<P>
<pre>
  (?C)      callout
  (?Cn)     callout with data n
</PRE>
</P>
<br><a name="SEC24" href="#TOC1">SEE ALSO</a><br>
<P>
<b>pcrepattern</b>(3), <b>pcreapi</b>(3), <b>pcrecallout</b>(3),
<b>pcrematching</b>(3), <b>pcre</b>(3).
</P>
<br><a name="SEC25" href="#TOC1">AUTHOR</a><br>
<P>
Philip Hazel
<br>
University Computing Service
<br>
Cambridge CB2 3QH, England.
<br>
</P>
<br><a name="SEC26" href="#TOC1">REVISION</a><br>
<P>
Last updated: 01 March 2010
<br>
Copyright &copy; 1997-2010 University of Cambridge.
<br>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[r
���
�
-doc/alt-pcre802-devel/html/pcre_fullinfo.htmlnu�[���<html>
<head>
<title>pcre_fullinfo specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_fullinfo man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>int pcre_fullinfo(const pcre *<i>code</i>, const pcre_extra *<i>extra</i>,</b>
<b>int <i>what</i>, void *<i>where</i>);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This function returns information about a compiled pattern. Its arguments are:
<pre>
  <i>code</i>                      Compiled regular expression
  <i>extra</i>                     Result of <b>pcre_study()</b> or NULL
  <i>what</i>                      What information is required
  <i>where</i>                     Where to put the information
</pre>
The following information is available:
<pre>
  PCRE_INFO_BACKREFMAX      Number of highest back reference
  PCRE_INFO_CAPTURECOUNT    Number of capturing subpatterns
  PCRE_INFO_DEFAULT_TABLES  Pointer to default tables
  PCRE_INFO_FIRSTBYTE       Fixed first byte for a match, or
                              -1 for start of string
                                 or after newline, or
                              -2 otherwise
  PCRE_INFO_FIRSTTABLE      Table of first bytes (after studying)
  PCRE_INFO_JCHANGED        Return 1 if (?J) or (?-J) was used
  PCRE_INFO_LASTLITERAL     Literal last byte required
  PCRE_INFO_MINLENGTH       Lower bound length of matching strings
  PCRE_INFO_NAMECOUNT       Number of named subpatterns
  PCRE_INFO_NAMEENTRYSIZE   Size of name table entry
  PCRE_INFO_NAMETABLE       Pointer to name table
  PCRE_INFO_OKPARTIAL       Return 1 if partial matching can be tried
                              (always returns 1 after release 8.00)
  PCRE_INFO_OPTIONS         Option bits used for compilation
  PCRE_INFO_SIZE            Size of compiled pattern
  PCRE_INFO_STUDYSIZE       Size of study data
</pre>
The yield of the function is zero on success or:
<pre>
  PCRE_ERROR_NULL           the argument <i>code</i> was NULL
                            the argument <i>where</i> was NULL
  PCRE_ERROR_BADMAGIC       the "magic number" was not found
  PCRE_ERROR_BADOPTION      the value of <i>what</i> was invalid
</PRE>
</P>
<P>
There is a complete description of the PCRE native API in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[`%,W��8doc/alt-pcre802-devel/html/pcre_get_named_substring.htmlnu�[���<html>
<head>
<title>pcre_get_named_substring specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_get_named_substring man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>int pcre_get_named_substring(const pcre *<i>code</i>,</b>
<b>const char *<i>subject</i>, int *<i>ovector</i>,</b>
<b>int <i>stringcount</i>, const char *<i>stringname</i>,</b>
<b>const char **<i>stringptr</i>);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This is a convenience function for extracting a captured substring by name. The
arguments are:
<pre>
  <i>code</i>          Compiled pattern
  <i>subject</i>       Subject that has been successfully matched
  <i>ovector</i>       Offset vector that <b>pcre_exec()</b> used
  <i>stringcount</i>   Value returned by <b>pcre_exec()</b>
  <i>stringname</i>    Name of the required substring
  <i>stringptr</i>     Where to put the string pointer
</pre>
The memory in which the substring is placed is obtained by calling
<b>pcre_malloc()</b>. The convenience function <b>pcre_free_substring()</b> can
be used to free it when it is no longer needed. The yield of the function is
the length of the extracted substring, PCRE_ERROR_NOMEMORY if sufficient memory
could not be obtained, or PCRE_ERROR_NOSUBSTRING if the string name is invalid.
</P>
<P>
There is a complete description of the PCRE native API in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[9��F�F+doc/alt-pcre802-devel/html/pcrepartial.htmlnu�[���<html>
<head>
<title>pcrepartial specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcrepartial man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<ul>
<li><a name="TOC1" href="#SEC1">PARTIAL MATCHING IN PCRE</a>
<li><a name="TOC2" href="#SEC2">PARTIAL MATCHING USING pcre_exec()</a>
<li><a name="TOC3" href="#SEC3">PARTIAL MATCHING USING pcre_dfa_exec()</a>
<li><a name="TOC4" href="#SEC4">PARTIAL MATCHING AND WORD BOUNDARIES</a>
<li><a name="TOC5" href="#SEC5">FORMERLY RESTRICTED PATTERNS</a>
<li><a name="TOC6" href="#SEC6">EXAMPLE OF PARTIAL MATCHING USING PCRETEST</a>
<li><a name="TOC7" href="#SEC7">MULTI-SEGMENT MATCHING WITH pcre_dfa_exec()</a>
<li><a name="TOC8" href="#SEC8">MULTI-SEGMENT MATCHING WITH pcre_exec()</a>
<li><a name="TOC9" href="#SEC9">ISSUES WITH MULTI-SEGMENT MATCHING</a>
<li><a name="TOC10" href="#SEC10">AUTHOR</a>
<li><a name="TOC11" href="#SEC11">REVISION</a>
</ul>
<br><a name="SEC1" href="#TOC1">PARTIAL MATCHING IN PCRE</a><br>
<P>
In normal use of PCRE, if the subject string that is passed to
<b>pcre_exec()</b> or <b>pcre_dfa_exec()</b> matches as far as it goes, but is
too short to match the entire pattern, PCRE_ERROR_NOMATCH is returned. There
are circumstances where it might be helpful to distinguish this case from other
cases in which there is no match.
</P>
<P>
Consider, for example, an application where a human is required to type in data
for a field with specific formatting requirements. An example might be a date
in the form <i>ddmmmyy</i>, defined by this pattern:
<pre>
  ^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$
</pre>
If the application sees the user's keystrokes one by one, and can check that
what has been typed so far is potentially valid, it is able to raise an error
as soon as a mistake is made, by beeping and not reflecting the character that
has been typed, for example. This immediate feedback is likely to be a better
user interface than a check that is delayed until the entire string has been
entered. Partial matching can also sometimes be useful when the subject string
is very long and is not all available at once.
</P>
<P>
PCRE supports partial matching by means of the PCRE_PARTIAL_SOFT and
PCRE_PARTIAL_HARD options, which can be set when calling <b>pcre_exec()</b> or
<b>pcre_dfa_exec()</b>. For backwards compatibility, PCRE_PARTIAL is a synonym
for PCRE_PARTIAL_SOFT. The essential difference between the two options is
whether or not a partial match is preferred to an alternative complete match,
though the details differ between the two matching functions. If both options
are set, PCRE_PARTIAL_HARD takes precedence.
</P>
<P>
Setting a partial matching option disables two of PCRE's optimizations. PCRE
remembers the last literal byte in a pattern, and abandons matching immediately
if such a byte is not present in the subject string. This optimization cannot
be used for a subject string that might match only partially. If the pattern
was studied, PCRE knows the minimum length of a matching string, and does not
bother to run the matching function on shorter strings. This optimization is
also disabled for partial matching.
</P>
<br><a name="SEC2" href="#TOC1">PARTIAL MATCHING USING pcre_exec()</a><br>
<P>
A partial match occurs during a call to <b>pcre_exec()</b> whenever the end of
the subject string is reached successfully, but matching cannot continue
because more characters are needed. However, at least one character must have
been matched. (In other words, a partial match can never be an empty string.)
</P>
<P>
If PCRE_PARTIAL_SOFT is set, the partial match is remembered, but matching
continues as normal, and other alternatives in the pattern are tried. If no
complete match can be found, <b>pcre_exec()</b> returns PCRE_ERROR_PARTIAL
instead of PCRE_ERROR_NOMATCH. If there are at least two slots in the offsets
vector, the first of them is set to the offset of the earliest character that
was inspected when the partial match was found. For convenience, the second
offset points to the end of the string so that a substring can easily be
identified.
</P>
<P>
For the majority of patterns, the first offset identifies the start of the
partially matched string. However, for patterns that contain lookbehind
assertions, or \K, or begin with \b or \B, earlier characters have been
inspected while carrying out the match. For example:
<pre>
  /(?&#60;=abc)123/
</pre>
This pattern matches "123", but only if it is preceded by "abc". If the subject
string is "xyzabc12", the offsets after a partial match are for the substring
"abc12", because all these characters are needed if another match is tried
with extra characters added.
</P>
<P>
If there is more than one partial match, the first one that was found provides
the data that is returned. Consider this pattern:
<pre>
  /123\w+X|dogY/
</pre>
If this is matched against the subject string "abc123dog", both
alternatives fail to match, but the end of the subject is reached during
matching, so PCRE_ERROR_PARTIAL is returned instead of PCRE_ERROR_NOMATCH. The
offsets are set to 3 and 9, identifying "123dog" as the first partial match
that was found. (In this example, there are two partial matches, because "dog"
on its own partially matches the second alternative.)
</P>
<P>
If PCRE_PARTIAL_HARD is set for <b>pcre_exec()</b>, it returns
PCRE_ERROR_PARTIAL as soon as a partial match is found, without continuing to
search for possible complete matches. The difference between the two options
can be illustrated by a pattern such as:
<pre>
  /dog(sbody)?/
</pre>
This matches either "dog" or "dogsbody", greedily (that is, it prefers the
longer string if possible). If it is matched against the string "dog" with
PCRE_PARTIAL_SOFT, it yields a complete match for "dog". However, if
PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL. On the other hand,
if the pattern is made ungreedy the result is different:
<pre>
  /dog(sbody)??/
</pre>
In this case the result is always a complete match because <b>pcre_exec()</b>
finds that first, and it never continues after finding a match. It might be
easier to follow this explanation by thinking of the two patterns like this:
<pre>
  /dog(sbody)?/    is the same as  /dogsbody|dog/
  /dog(sbody)??/   is the same as  /dog|dogsbody/
</pre>
The second pattern will never match "dogsbody" when <b>pcre_exec()</b> is
used, because it will always find the shorter match first.
</P>
<br><a name="SEC3" href="#TOC1">PARTIAL MATCHING USING pcre_dfa_exec()</a><br>
<P>
The <b>pcre_dfa_exec()</b> function moves along the subject string character by
character, without backtracking, searching for all possible matches
simultaneously. If the end of the subject is reached before the end of the
pattern, there is the possibility of a partial match, again provided that at
least one character has matched.
</P>
<P>
When PCRE_PARTIAL_SOFT is set, PCRE_ERROR_PARTIAL is returned only if there
have been no complete matches. Otherwise, the complete matches are returned.
However, if PCRE_PARTIAL_HARD is set, a partial match takes precedence over any
complete matches. The portion of the string that was inspected when the longest
partial match was found is set as the first matching string, provided there are
at least two slots in the offsets vector.
</P>
<P>
Because <b>pcre_dfa_exec()</b> always searches for all possible matches, and
there is no difference between greedy and ungreedy repetition, its behaviour is
different from <b>pcre_exec</b> when PCRE_PARTIAL_HARD is set. Consider the
string "dog" matched against the ungreedy pattern shown above:
<pre>
  /dog(sbody)??/
</pre>
Whereas <b>pcre_exec()</b> stops as soon as it finds the complete match for
"dog", <b>pcre_dfa_exec()</b> also finds the partial match for "dogsbody", and
so returns that when PCRE_PARTIAL_HARD is set.
</P>
<br><a name="SEC4" href="#TOC1">PARTIAL MATCHING AND WORD BOUNDARIES</a><br>
<P>
If a pattern ends with one of sequences \b or \B, which test for word
boundaries, partial matching with PCRE_PARTIAL_SOFT can give counter-intuitive
results. Consider this pattern:
<pre>
  /\bcat\b/
</pre>
This matches "cat", provided there is a word boundary at either end. If the
subject string is "the cat", the comparison of the final "t" with a following
character cannot take place, so a partial match is found. However,
<b>pcre_exec()</b> carries on with normal matching, which matches \b at the end
of the subject when the last character is a letter, thus finding a complete
match. The result, therefore, is <i>not</i> PCRE_ERROR_PARTIAL. The same thing
happens with <b>pcre_dfa_exec()</b>, because it also finds the complete match.
</P>
<P>
Using PCRE_PARTIAL_HARD in this case does yield PCRE_ERROR_PARTIAL, because
then the partial match takes precedence.
</P>
<br><a name="SEC5" href="#TOC1">FORMERLY RESTRICTED PATTERNS</a><br>
<P>
For releases of PCRE prior to 8.00, because of the way certain internal
optimizations were implemented in the <b>pcre_exec()</b> function, the
PCRE_PARTIAL option (predecessor of PCRE_PARTIAL_SOFT) could not be used with
all patterns. From release 8.00 onwards, the restrictions no longer apply, and
partial matching with <b>pcre_exec()</b> can be requested for any pattern.
</P>
<P>
Items that were formerly restricted were repeated single characters and
repeated metasequences. If PCRE_PARTIAL was set for a pattern that did not
conform to the restrictions, <b>pcre_exec()</b> returned the error code
PCRE_ERROR_BADPARTIAL (-13). This error code is no longer in use. The
PCRE_INFO_OKPARTIAL call to <b>pcre_fullinfo()</b> to find out if a compiled
pattern can be used for partial matching now always returns 1.
</P>
<br><a name="SEC6" href="#TOC1">EXAMPLE OF PARTIAL MATCHING USING PCRETEST</a><br>
<P>
If the escape sequence \P is present in a <b>pcretest</b> data line, the
PCRE_PARTIAL_SOFT option is used for the match. Here is a run of <b>pcretest</b>
that uses the date example quoted above:
<pre>
    re&#62; /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
  data&#62; 25jun04\P
   0: 25jun04
   1: jun
  data&#62; 25dec3\P
  Partial match: 23dec3
  data&#62; 3ju\P
  Partial match: 3ju
  data&#62; 3juj\P
  No match
  data&#62; j\P
  No match
</pre>
The first data string is matched completely, so <b>pcretest</b> shows the
matched substrings. The remaining four strings do not match the complete
pattern, but the first two are partial matches. Similar output is obtained
when <b>pcre_dfa_exec()</b> is used.
</P>
<P>
If the escape sequence \P is present more than once in a <b>pcretest</b> data
line, the PCRE_PARTIAL_HARD option is set for the match.
</P>
<br><a name="SEC7" href="#TOC1">MULTI-SEGMENT MATCHING WITH pcre_dfa_exec()</a><br>
<P>
When a partial match has been found using <b>pcre_dfa_exec()</b>, it is possible
to continue the match by providing additional subject data and calling
<b>pcre_dfa_exec()</b> again with the same compiled regular expression, this
time setting the PCRE_DFA_RESTART option. You must pass the same working
space as before, because this is where details of the previous partial match
are stored. Here is an example using <b>pcretest</b>, using the \R escape
sequence to set the PCRE_DFA_RESTART option (\D specifies the use of
<b>pcre_dfa_exec()</b>):
<pre>
    re&#62; /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
  data&#62; 23ja\P\D
  Partial match: 23ja
  data&#62; n05\R\D
   0: n05
</pre>
The first call has "23ja" as the subject, and requests partial matching; the
second call has "n05" as the subject for the continued (restarted) match.
Notice that when the match is complete, only the last part is shown; PCRE does
not retain the previously partially-matched string. It is up to the calling
program to do that if it needs to.
</P>
<P>
You can set the PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with
PCRE_DFA_RESTART to continue partial matching over multiple segments. This
facility can be used to pass very long subject strings to
<b>pcre_dfa_exec()</b>.
</P>
<br><a name="SEC8" href="#TOC1">MULTI-SEGMENT MATCHING WITH pcre_exec()</a><br>
<P>
From release 8.00, <b>pcre_exec()</b> can also be used to do multi-segment
matching. Unlike <b>pcre_dfa_exec()</b>, it is not possible to restart the
previous match with a new segment of data. Instead, new data must be added to
the previous subject string, and the entire match re-run, starting from the
point where the partial match occurred. Earlier data can be discarded.
Consider an unanchored pattern that matches dates:
<pre>
    re&#62; /\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d/
  data&#62; The date is 23ja\P
  Partial match: 23ja
</pre>
At this stage, an application could discard the text preceding "23ja", add on
text from the next segment, and call <b>pcre_exec()</b> again. Unlike
<b>pcre_dfa_exec()</b>, the entire matching string must always be available, and
the complete matching process occurs for each call, so more memory and more
processing time is needed.
</P>
<P>
<b>Note:</b> If the pattern contains lookbehind assertions, or \K, or starts
with \b or \B, the string that is returned for a partial match will include
characters that precede the partially matched string itself, because these must
be retained when adding on more characters for a subsequent matching attempt.
</P>
<br><a name="SEC9" href="#TOC1">ISSUES WITH MULTI-SEGMENT MATCHING</a><br>
<P>
Certain types of pattern may give problems with multi-segment matching,
whichever matching function is used.
</P>
<P>
1. If the pattern contains tests for the beginning or end of a line, you need
to pass the PCRE_NOTBOL or PCRE_NOTEOL options, as appropriate, when the
subject string for any call does not contain the beginning or end of a line.
</P>
<P>
2. Lookbehind assertions at the start of a pattern are catered for in the
offsets that are returned for a partial match. However, in theory, a lookbehind
assertion later in the pattern could require even earlier characters to be
inspected, and it might not have been reached when a partial match occurs. This
is probably an extremely unlikely case; you could guard against it to a certain
extent by always including extra characters at the start.
</P>
<P>
3. Matching a subject string that is split into multiple segments may not
always produce exactly the same result as matching over one single long string,
especially when PCRE_PARTIAL_SOFT is used. The section "Partial Matching and
Word Boundaries" above describes an issue that arises if the pattern ends with
\b or \B. Another kind of difference may occur when there are multiple
matching possibilities, because a partial match result is given only when there
are no completed matches. This means that as soon as the shortest match has
been found, continuation to a new subject segment is no longer possible.
Consider again this <b>pcretest</b> example:
<pre>
    re&#62; /dog(sbody)?/
  data&#62; dogsb\P
   0: dog
  data&#62; do\P\D
  Partial match: do
  data&#62; gsb\R\P\D
   0: g
  data&#62; dogsbody\D
   0: dogsbody
   1: dog
</pre>
The first data line passes the string "dogsb" to <b>pcre_exec()</b>, setting the
PCRE_PARTIAL_SOFT option. Although the string is a partial match for
"dogsbody", the result is not PCRE_ERROR_PARTIAL, because the shorter string
"dog" is a complete match. Similarly, when the subject is presented to
<b>pcre_dfa_exec()</b> in several parts ("do" and "gsb" being the first two) the
match stops when "dog" has been found, and it is not possible to continue. On
the other hand, if "dogsbody" is presented as a single string,
<b>pcre_dfa_exec()</b> finds both matches.
</P>
<P>
Because of these problems, it is probably best to use PCRE_PARTIAL_HARD when
matching multi-segment data. The example above then behaves differently:
<pre>
    re&#62; /dog(sbody)?/
  data&#62; dogsb\P\P
  Partial match: dogsb
  data&#62; do\P\D
  Partial match: do
  data&#62; gsb\R\P\P\D
  Partial match: gsb

</PRE>
</P>
<P>
4. Patterns that contain alternatives at the top level which do not all
start with the same pattern item may not work as expected when
PCRE_DFA_RESTART is used with <b>pcre_dfa_exec()</b>. For example, consider this
pattern:
<pre>
  1234|3789
</pre>
If the first part of the subject is "ABC123", a partial match of the first
alternative is found at offset 3. There is no partial match for the second
alternative, because such a match does not start at the same point in the
subject string. Attempting to continue with the string "7890" does not yield a
match because only those alternatives that match at one point in the subject
are remembered. The problem arises because the start of the second alternative
matches within the first alternative. There is no problem with anchored
patterns or patterns such as:
<pre>
  1234|ABCD
</pre>
where no string can be a partial match for both alternatives. This is not a
problem if <b>pcre_exec()</b> is used, because the entire match has to be rerun
each time:
<pre>
    re&#62; /1234|3789/
  data&#62; ABC123\P
  Partial match: 123
  data&#62; 1237890
   0: 3789
</pre>
Of course, instead of using PCRE_DFA_PARTIAL, the same technique of re-running
the entire match can also be used with <b>pcre_dfa_exec()</b>. Another
possibility is to work with two buffers. If a partial match at offset <i>n</i>
in the first buffer is followed by "no match" when PCRE_DFA_RESTART is used on
the second buffer, you can then try a new match starting at offset <i>n+1</i> in
the first buffer.
</P>
<br><a name="SEC10" href="#TOC1">AUTHOR</a><br>
<P>
Philip Hazel
<br>
University Computing Service
<br>
Cambridge CB2 3QH, England.
<br>
</P>
<br><a name="SEC11" href="#TOC1">REVISION</a><br>
<P>
Last updated: 19 October 2009
<br>
Copyright &copy; 1997-2009 University of Cambridge.
<br>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[M05��*doc/alt-pcre802-devel/html/pcre_study.htmlnu�[���<html>
<head>
<title>pcre_study specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_study man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>pcre_extra *pcre_study(const pcre *<i>code</i>, int <i>options</i>,</b>
<b>const char **<i>errptr</i>);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This function studies a compiled pattern, to see if additional information can
be extracted that might speed up matching. Its arguments are:
<pre>
  <i>code</i>       A compiled regular expression
  <i>options</i>    Options for <b>pcre_study()</b>
  <i>errptr</i>     Where to put an error message
</pre>
If the function succeeds, it returns a value that can be passed to
<b>pcre_exec()</b> via its <i>extra</i> argument.
</P>
<P>
If the function returns NULL, either it could not find any additional
information, or there was an error. You can tell the difference by looking at
the error value. It is NULL in first case.
</P>
<P>
There are currently no options defined; the value of the second argument should
always be zero.
</P>
<P>
There is a complete description of the PCRE native API in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[������/doc/alt-pcre802-devel/html/pcre_maketables.htmlnu�[���<html>
<head>
<title>pcre_maketables specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_maketables man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>const unsigned char *pcre_maketables(void);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This function builds a set of character tables for character values less than
256. These can be passed to <b>pcre_compile()</b> to override PCRE's internal,
built-in tables (which were made by <b>pcre_maketables()</b> when PCRE was
compiled). You might want to do this if you are using a non-standard locale.
The function yields a pointer to the tables.
</P>
<P>
There is a complete description of the PCRE native API in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[ջ��<doc/alt-pcre802-devel/html/pcre_get_stringtable_entries.htmlnu�[���<html>
<head>
<title>pcre_get_stringtable_entries specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_get_stringtable_entries man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>int pcre_get_stringtable_entries(const pcre *<i>code</i>,</b>
<b>const char *<i>name</i>, char **<i>first</i>, char **<i>last</i>);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This convenience function finds, for a compiled pattern, the first and last
entries for a given name in the table that translates capturing parenthesis
names into numbers. When names are required to be unique (PCRE_DUPNAMES is
<i>not</i> set), it is usually easier to use <b>pcre_get_stringnumber()</b>
instead.
<pre>
  <i>code</i>    Compiled regular expression
  <i>name</i>    Name whose entries required
  <i>first</i>   Where to return a pointer to the first entry
  <i>last</i>    Where to return a pointer to the last entry
</pre>
The yield of the function is the length of each entry, or
PCRE_ERROR_NOSUBSTRING if none are found.
</P>
<P>
There is a complete description of the PCRE native API, including the format of
the table entries, in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page, and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[٭�z



+doc/alt-pcre802-devel/html/pcre_config.htmlnu�[���<html>
<head>
<title>pcre_config specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_config man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>int pcre_config(int <i>what</i>, void *<i>where</i>);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This function makes it possible for a client program to find out which optional
features are available in the version of the PCRE library it is using. Its
arguments are as follows:
<pre>
  <i>what</i>     A code specifying what information is required
  <i>where</i>    Points to where to put the data
</pre>
The available codes are:
<pre>
  PCRE_CONFIG_LINK_SIZE     Internal link size: 2, 3, or 4
  PCRE_CONFIG_MATCH_LIMIT   Internal resource limit
  PCRE_CONFIG_MATCH_LIMIT_RECURSION
                            Internal recursion depth limit
  PCRE_CONFIG_NEWLINE       Value of the default newline sequence:
                                13 (0x000d)    for CR
                                10 (0x000a)    for LF
                              3338 (0x0d0a)    for CRLF
                                -2             for ANYCRLF
                                -1             for ANY
  PCRE_CONFIG_BSR           Indicates what \R matches by default:
                                 0             all Unicode line endings
                                 1             CR, LF, or CRLF only
  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD
                            Threshold of return slots, above
                              which <b>malloc()</b> is used by
                              the POSIX API
  PCRE_CONFIG_STACKRECURSE  Recursion implementation (1=stack 0=heap)
  PCRE_CONFIG_UTF8          Availability of UTF-8 support (1=yes 0=no)
  PCRE_CONFIG_UNICODE_PROPERTIES
                            Availability of Unicode property support
                              (1=yes 0=no)
</pre>
The function yields 0 on success or PCRE_ERROR_BADOPTION otherwise.
</P>
<P>
There is a complete description of the PCRE native API in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[cO�ք"�"+doc/alt-pcre802-devel/html/pcrecallout.htmlnu�[���<html>
<head>
<title>pcrecallout specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcrecallout man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<ul>
<li><a name="TOC1" href="#SEC1">PCRE CALLOUTS</a>
<li><a name="TOC2" href="#SEC2">MISSING CALLOUTS</a>
<li><a name="TOC3" href="#SEC3">THE CALLOUT INTERFACE</a>
<li><a name="TOC4" href="#SEC4">RETURN VALUES</a>
<li><a name="TOC5" href="#SEC5">AUTHOR</a>
<li><a name="TOC6" href="#SEC6">REVISION</a>
</ul>
<br><a name="SEC1" href="#TOC1">PCRE CALLOUTS</a><br>
<P>
<b>int (*pcre_callout)(pcre_callout_block *);</b>
</P>
<P>
PCRE provides a feature called "callout", which is a means of temporarily
passing control to the caller of PCRE in the middle of pattern matching. The
caller of PCRE provides an external function by putting its entry point in the
global variable <i>pcre_callout</i>. By default, this variable contains NULL,
which disables all calling out.
</P>
<P>
Within a regular expression, (?C) indicates the points at which the external
function is to be called. Different callout points can be identified by putting
a number less than 256 after the letter C. The default value is zero.
For example, this pattern has two callout points:
<pre>
  (?C1)abc(?C2)def
</pre>
If the PCRE_AUTO_CALLOUT option bit is set when <b>pcre_compile()</b> or
<b>pcre_compile2()</b> is called, PCRE automatically inserts callouts, all with
number 255, before each item in the pattern. For example, if PCRE_AUTO_CALLOUT
is used with the pattern
<pre>
  A(\d{2}|--)
</pre>
it is processed as if it were
<br>
<br>
(?C255)A(?C255)((?C255)\d{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255)
<br>
<br>
Notice that there is a callout before and after each parenthesis and
alternation bar. Automatic callouts can be used for tracking the progress of
pattern matching. The
<a href="pcretest.html"><b>pcretest</b></a>
command has an option that sets automatic callouts; when it is used, the output
indicates how the pattern is matched. This is useful information when you are
trying to optimize the performance of a particular pattern.
</P>
<br><a name="SEC2" href="#TOC1">MISSING CALLOUTS</a><br>
<P>
You should be aware that, because of optimizations in the way PCRE matches
patterns by default, callouts sometimes do not happen. For example, if the
pattern is
<pre>
  ab(?C4)cd
</pre>
PCRE knows that any matching string must contain the letter "d". If the subject
string is "abyz", the lack of "d" means that matching doesn't ever start, and
the callout is never reached. However, with "abyd", though the result is still
no match, the callout is obeyed.
</P>
<P>
If the pattern is studied, PCRE knows the minimum length of a matching string,
and will immediately give a "no match" return without actually running a match
if the subject is not long enough, or, for unanchored patterns, if it has
been scanned far enough.
</P>
<P>
You can disable these optimizations by passing the PCRE_NO_START_OPTIMIZE
option to <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>. This slows down the
matching process, but does ensure that callouts such as the example above are
obeyed.
</P>
<br><a name="SEC3" href="#TOC1">THE CALLOUT INTERFACE</a><br>
<P>
During matching, when PCRE reaches a callout point, the external function
defined by <i>pcre_callout</i> is called (if it is set). This applies to both
the <b>pcre_exec()</b> and the <b>pcre_dfa_exec()</b> matching functions. The
only argument to the callout function is a pointer to a <b>pcre_callout</b>
block. This structure contains the following fields:
<pre>
  int          <i>version</i>;
  int          <i>callout_number</i>;
  int         *<i>offset_vector</i>;
  const char  *<i>subject</i>;
  int          <i>subject_length</i>;
  int          <i>start_match</i>;
  int          <i>current_position</i>;
  int          <i>capture_top</i>;
  int          <i>capture_last</i>;
  void        *<i>callout_data</i>;
  int          <i>pattern_position</i>;
  int          <i>next_item_length</i>;
</pre>
The <i>version</i> field is an integer containing the version number of the
block format. The initial version was 0; the current version is 1. The version
number will change again in future if additional fields are added, but the
intention is never to remove any of the existing fields.
</P>
<P>
The <i>callout_number</i> field contains the number of the callout, as compiled
into the pattern (that is, the number after ?C for manual callouts, and 255 for
automatically generated callouts).
</P>
<P>
The <i>offset_vector</i> field is a pointer to the vector of offsets that was
passed by the caller to <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>. When
<b>pcre_exec()</b> is used, the contents can be inspected in order to extract
substrings that have been matched so far, in the same way as for extracting
substrings after a match has completed. For <b>pcre_dfa_exec()</b> this field is
not useful.
</P>
<P>
The <i>subject</i> and <i>subject_length</i> fields contain copies of the values
that were passed to <b>pcre_exec()</b>.
</P>
<P>
The <i>start_match</i> field normally contains the offset within the subject at
which the current match attempt started. However, if the escape sequence \K
has been encountered, this value is changed to reflect the modified starting
point. If the pattern is not anchored, the callout function may be called
several times from the same point in the pattern for different starting points
in the subject.
</P>
<P>
The <i>current_position</i> field contains the offset within the subject of the
current match pointer.
</P>
<P>
When the <b>pcre_exec()</b> function is used, the <i>capture_top</i> field
contains one more than the number of the highest numbered captured substring so
far. If no substrings have been captured, the value of <i>capture_top</i> is
one. This is always the case when <b>pcre_dfa_exec()</b> is used, because it
does not support captured substrings.
</P>
<P>
The <i>capture_last</i> field contains the number of the most recently captured
substring. If no substrings have been captured, its value is -1. This is always
the case when <b>pcre_dfa_exec()</b> is used.
</P>
<P>
The <i>callout_data</i> field contains a value that is passed to
<b>pcre_exec()</b> or <b>pcre_dfa_exec()</b> specifically so that it can be
passed back in callouts. It is passed in the <i>pcre_callout</i> field of the
<b>pcre_extra</b> data structure. If no such data was passed, the value of
<i>callout_data</i> in a <b>pcre_callout</b> block is NULL. There is a
description of the <b>pcre_extra</b> structure in the
<a href="pcreapi.html"><b>pcreapi</b></a>
documentation.
</P>
<P>
The <i>pattern_position</i> field is present from version 1 of the
<i>pcre_callout</i> structure. It contains the offset to the next item to be
matched in the pattern string.
</P>
<P>
The <i>next_item_length</i> field is present from version 1 of the
<i>pcre_callout</i> structure. It contains the length of the next item to be
matched in the pattern string. When the callout immediately precedes an
alternation bar, a closing parenthesis, or the end of the pattern, the length
is zero. When the callout precedes an opening parenthesis, the length is that
of the entire subpattern.
</P>
<P>
The <i>pattern_position</i> and <i>next_item_length</i> fields are intended to
help in distinguishing between different automatic callouts, which all have the
same callout number. However, they are set for all callouts.
</P>
<br><a name="SEC4" href="#TOC1">RETURN VALUES</a><br>
<P>
The external callout function returns an integer to PCRE. If the value is zero,
matching proceeds as normal. If the value is greater than zero, matching fails
at the current point, but the testing of other matching possibilities goes
ahead, just as if a lookahead assertion had failed. If the value is less than
zero, the match is abandoned, and <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>
returns the negative value.
</P>
<P>
Negative values should normally be chosen from the set of PCRE_ERROR_xxx
values. In particular, PCRE_ERROR_NOMATCH forces a standard "no match" failure.
The error number PCRE_ERROR_CALLOUT is reserved for use by callout functions;
it will never be used by PCRE itself.
</P>
<br><a name="SEC5" href="#TOC1">AUTHOR</a><br>
<P>
Philip Hazel
<br>
University Computing Service
<br>
Cambridge CB2 3QH, England.
<br>
</P>
<br><a name="SEC6" href="#TOC1">REVISION</a><br>
<P>
Last updated: 29 September 2009
<br>
Copyright &copy; 1997-2009 University of Cambridge.
<br>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[dd0))-doc/alt-pcre802-devel/html/pcre_compile2.htmlnu�[���<html>
<head>
<title>pcre_compile2 specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_compile2 man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>pcre *pcre_compile2(const char *<i>pattern</i>, int <i>options</i>,</b>
<b>int *<i>errorcodeptr</i>,</b>
<b>const char **<i>errptr</i>, int *<i>erroffset</i>,</b>
<b>const unsigned char *<i>tableptr</i>);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This function compiles a regular expression into an internal form. It is the
same as <b>pcre_compile()</b>, except for the addition of the <i>errorcodeptr</i>
argument. The arguments are:
</P>
<P>
<pre>
  <i>pattern</i>       A zero-terminated string containing the
                  regular expression to be compiled
  <i>options</i>       Zero or more option bits
  <i>errorcodeptr</i>  Where to put an error code
  <i>errptr</i>        Where to put an error message
  <i>erroffset</i>     Offset in pattern where error was found
  <i>tableptr</i>      Pointer to character tables, or NULL to
                  use the built-in default
</pre>
The option bits are:
<pre>
  PCRE_ANCHORED           Force pattern anchoring
  PCRE_AUTO_CALLOUT       Compile automatic callouts
  PCRE_BSR_ANYCRLF        \R matches only CR, LF, or CRLF
  PCRE_BSR_UNICODE        \R matches all Unicode line endings
  PCRE_CASELESS           Do caseless matching
  PCRE_DOLLAR_ENDONLY     $ not to match newline at end
  PCRE_DOTALL             . matches anything including NL
  PCRE_DUPNAMES           Allow duplicate names for subpatterns
  PCRE_EXTENDED           Ignore whitespace and # comments
  PCRE_EXTRA              PCRE extra features
                            (not much use currently)
  PCRE_FIRSTLINE          Force matching to be before newline
  PCRE_JAVASCRIPT_COMPAT  JavaScript compatibility
  PCRE_MULTILINE          ^ and $ match newlines within data
  PCRE_NEWLINE_ANY        Recognize any Unicode newline sequence
  PCRE_NEWLINE_ANYCRLF    Recognize CR, LF, and CRLF as newline
                            sequences
  PCRE_NEWLINE_CR         Set CR as the newline sequence
  PCRE_NEWLINE_CRLF       Set CRLF as the newline sequence
  PCRE_NEWLINE_LF         Set LF as the newline sequence
  PCRE_NO_AUTO_CAPTURE    Disable numbered capturing paren-
                            theses (named ones available)
  PCRE_NO_UTF8_CHECK      Do not check the pattern for UTF-8
                            validity (only relevant if
                            PCRE_UTF8 is set)
  PCRE_UNGREEDY           Invert greediness of quantifiers
  PCRE_UTF8               Run in UTF-8 mode
</pre>
PCRE must be built with UTF-8 support in order to use PCRE_UTF8 and
PCRE_NO_UTF8_CHECK.
</P>
<P>
The yield of the function is a pointer to a private data structure that
contains the compiled pattern, or NULL if an error was detected. Note that
compiling regular expressions with one version of PCRE for use with a different
version is not guaranteed to work and may cause crashes.
</P>
<P>
There is a complete description of the PCRE native API in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[eW���)doc/alt-pcre802-devel/html/pcre_info.htmlnu�[���<html>
<head>
<title>pcre_info specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_info man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>int pcre_info(const pcre *<i>code</i>, int *<i>optptr</i>, int</b>
<b>*<i>firstcharptr</i>);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This function is obsolete. You should be using <b>pcre_fullinfo()</b> instead.
</P>
<P>
There is a complete description of the PCRE native API in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[����<y<y(doc/alt-pcre802-devel/html/pcretest.htmlnu�[���<html>
<head>
<title>pcretest specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcretest man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<ul>
<li><a name="TOC1" href="#SEC1">SYNOPSIS</a>
<li><a name="TOC2" href="#SEC2">OPTIONS</a>
<li><a name="TOC3" href="#SEC3">DESCRIPTION</a>
<li><a name="TOC4" href="#SEC4">PATTERN MODIFIERS</a>
<li><a name="TOC5" href="#SEC5">DATA LINES</a>
<li><a name="TOC6" href="#SEC6">THE ALTERNATIVE MATCHING FUNCTION</a>
<li><a name="TOC7" href="#SEC7">DEFAULT OUTPUT FROM PCRETEST</a>
<li><a name="TOC8" href="#SEC8">OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION</a>
<li><a name="TOC9" href="#SEC9">RESTARTING AFTER A PARTIAL MATCH</a>
<li><a name="TOC10" href="#SEC10">CALLOUTS</a>
<li><a name="TOC11" href="#SEC11">NON-PRINTING CHARACTERS</a>
<li><a name="TOC12" href="#SEC12">SAVING AND RELOADING COMPILED PATTERNS</a>
<li><a name="TOC13" href="#SEC13">SEE ALSO</a>
<li><a name="TOC14" href="#SEC14">AUTHOR</a>
<li><a name="TOC15" href="#SEC15">REVISION</a>
</ul>
<br><a name="SEC1" href="#TOC1">SYNOPSIS</a><br>
<P>
<b>pcretest [options] [source] [destination]</b>
<br>
<br>
<b>pcretest</b> was written as a test program for the PCRE regular expression
library itself, but it can also be used for experimenting with regular
expressions. This document describes the features of the test program; for
details of the regular expressions themselves, see the
<a href="pcrepattern.html"><b>pcrepattern</b></a>
documentation. For details of the PCRE library function calls and their
options, see the
<a href="pcreapi.html"><b>pcreapi</b></a>
documentation.
</P>
<br><a name="SEC2" href="#TOC1">OPTIONS</a><br>
<P>
<b>-b</b>
Behave as if each regex has the <b>/B</b> (show bytecode) modifier; the internal
form is output after compilation.
</P>
<P>
<b>-C</b>
Output the version number of the PCRE library, and all available information
about the optional features that are included, and then exit.
</P>
<P>
<b>-d</b>
Behave as if each regex has the <b>/D</b> (debug) modifier; the internal
form and information about the compiled pattern is output after compilation;
<b>-d</b> is equivalent to <b>-b -i</b>.
</P>
<P>
<b>-dfa</b>
Behave as if each data line contains the \D escape sequence; this causes the
alternative matching function, <b>pcre_dfa_exec()</b>, to be used instead of the
standard <b>pcre_exec()</b> function (more detail is given below).
</P>
<P>
<b>-help</b>
Output a brief summary these options and then exit.
</P>
<P>
<b>-i</b>
Behave as if each regex has the <b>/I</b> modifier; information about the
compiled pattern is given after compilation.
</P>
<P>
<b>-M</b>
Behave as if each data line contains the \M escape sequence; this causes
PCRE to discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings by
calling <b>pcre_exec()</b> repeatedly with different limits.
</P>
<P>
<b>-m</b>
Output the size of each compiled pattern after it has been compiled. This is
equivalent to adding <b>/M</b> to each regular expression. For compatibility
with earlier versions of pcretest, <b>-s</b> is a synonym for <b>-m</b>.
</P>
<P>
<b>-o</b> <i>osize</i>
Set the number of elements in the output vector that is used when calling
<b>pcre_exec()</b> or <b>pcre_dfa_exec()</b> to be <i>osize</i>. The default value
is 45, which is enough for 14 capturing subexpressions for <b>pcre_exec()</b> or
22 different matches for <b>pcre_dfa_exec()</b>. The vector size can be
changed for individual matching calls by including \O in the data line (see
below).
</P>
<P>
<b>-p</b>
Behave as if each regex has the <b>/P</b> modifier; the POSIX wrapper API is
used to call PCRE. None of the other options has any effect when <b>-p</b> is
set.
</P>
<P>
<b>-q</b>
Do not output the version number of <b>pcretest</b> at the start of execution.
</P>
<P>
<b>-S</b> <i>size</i>
On Unix-like systems, set the size of the runtime stack to <i>size</i>
megabytes.
</P>
<P>
<b>-t</b>
Run each compile, study, and match many times with a timer, and output
resulting time per compile or match (in milliseconds). Do not set <b>-m</b> with
<b>-t</b>, because you will then get the size output a zillion times, and the
timing will be distorted. You can control the number of iterations that are
used for timing by following <b>-t</b> with a number (as a separate item on the
command line). For example, "-t 1000" would iterate 1000 times. The default is
to iterate 500000 times.
</P>
<P>
<b>-tm</b>
This is like <b>-t</b> except that it times only the matching phase, not the
compile or study phases.
</P>
<br><a name="SEC3" href="#TOC1">DESCRIPTION</a><br>
<P>
If <b>pcretest</b> is given two filename arguments, it reads from the first and
writes to the second. If it is given only one filename argument, it reads from
that file and writes to stdout. Otherwise, it reads from stdin and writes to
stdout, and prompts for each line of input, using "re&#62;" to prompt for regular
expressions, and "data&#62;" to prompt for data lines.
</P>
<P>
When <b>pcretest</b> is built, a configuration option can specify that it should
be linked with the <b>libreadline</b> library. When this is done, if the input
is from a terminal, it is read using the <b>readline()</b> function. This
provides line-editing and history facilities. The output from the <b>-help</b>
option states whether or not <b>readline()</b> will be used.
</P>
<P>
The program handles any number of sets of input on a single input file. Each
set starts with a regular expression, and continues with any number of data
lines to be matched against the pattern.
</P>
<P>
Each data line is matched separately and independently. If you want to do
multi-line matches, you have to use the \n escape sequence (or \r or \r\n,
etc., depending on the newline setting) in a single line of input to encode the
newline sequences. There is no limit on the length of data lines; the input
buffer is automatically extended if it is too small.
</P>
<P>
An empty line signals the end of the data lines, at which point a new regular
expression is read. The regular expressions are given enclosed in any
non-alphanumeric delimiters other than backslash, for example:
<pre>
  /(a|bc)x+yz/
</pre>
White space before the initial delimiter is ignored. A regular expression may
be continued over several input lines, in which case the newline characters are
included within it. It is possible to include the delimiter within the pattern
by escaping it, for example
<pre>
  /abc\/def/
</pre>
If you do so, the escape and the delimiter form part of the pattern, but since
delimiters are always non-alphanumeric, this does not affect its interpretation.
If the terminating delimiter is immediately followed by a backslash, for
example,
<pre>
  /abc/\
</pre>
then a backslash is added to the end of the pattern. This is done to provide a
way of testing the error condition that arises if a pattern finishes with a
backslash, because
<pre>
  /abc\/
</pre>
is interpreted as the first line of a pattern that starts with "abc/", causing
pcretest to read the next line as a continuation of the regular expression.
</P>
<br><a name="SEC4" href="#TOC1">PATTERN MODIFIERS</a><br>
<P>
A pattern may be followed by any number of modifiers, which are mostly single
characters. Following Perl usage, these are referred to below as, for example,
"the <b>/i</b> modifier", even though the delimiter of the pattern need not
always be a slash, and no slash is used when writing modifiers. Whitespace may
appear between the final pattern delimiter and the first modifier, and between
the modifiers themselves.
</P>
<P>
The <b>/i</b>, <b>/m</b>, <b>/s</b>, and <b>/x</b> modifiers set the PCRE_CASELESS,
PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when
<b>pcre_compile()</b> is called. These four modifier letters have the same
effect as they do in Perl. For example:
<pre>
  /caseless/i
</pre>
The following table shows additional modifiers for setting PCRE options that do
not correspond to anything in Perl:
<pre>
  <b>/A</b>              PCRE_ANCHORED
  <b>/C</b>              PCRE_AUTO_CALLOUT
  <b>/E</b>              PCRE_DOLLAR_ENDONLY
  <b>/f</b>              PCRE_FIRSTLINE
  <b>/J</b>              PCRE_DUPNAMES
  <b>/N</b>              PCRE_NO_AUTO_CAPTURE
  <b>/U</b>              PCRE_UNGREEDY
  <b>/X</b>              PCRE_EXTRA
  <b>/&#60;JS&#62;</b>           PCRE_JAVASCRIPT_COMPAT
  <b>/&#60;cr&#62;</b>           PCRE_NEWLINE_CR
  <b>/&#60;lf&#62;</b>           PCRE_NEWLINE_LF
  <b>/&#60;crlf&#62;</b>         PCRE_NEWLINE_CRLF
  <b>/&#60;anycrlf&#62;</b>      PCRE_NEWLINE_ANYCRLF
  <b>/&#60;any&#62;</b>          PCRE_NEWLINE_ANY
  <b>/&#60;bsr_anycrlf&#62;</b>  PCRE_BSR_ANYCRLF
  <b>/&#60;bsr_unicode&#62;</b>  PCRE_BSR_UNICODE
</pre>
Those specifying line ending sequences are literal strings as shown, but the
letters can be in either case. This example sets multiline matching with CRLF
as the line ending sequence:
<pre>
  /^abc/m&#60;crlf&#62;
</pre>
Details of the meanings of these PCRE options are given in the
<a href="pcreapi.html"><b>pcreapi</b></a>
documentation.
</P>
<br><b>
Finding all matches in a string
</b><br>
<P>
Searching for all possible matches within each subject string can be requested
by the <b>/g</b> or <b>/G</b> modifier. After finding a match, PCRE is called
again to search the remainder of the subject string. The difference between
<b>/g</b> and <b>/G</b> is that the former uses the <i>startoffset</i> argument to
<b>pcre_exec()</b> to start searching at a new point within the entire string
(which is in effect what Perl does), whereas the latter passes over a shortened
substring. This makes a difference to the matching process if the pattern
begins with a lookbehind assertion (including \b or \B).
</P>
<P>
If any call to <b>pcre_exec()</b> in a <b>/g</b> or <b>/G</b> sequence matches an
empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and
PCRE_ANCHORED flags set in order to search for another, non-empty, match at the
same point. If this second match fails, the start offset is advanced by one
character, and the normal match is retried. This imitates the way Perl handles
such cases when using the <b>/g</b> modifier or the <b>split()</b> function.
</P>
<br><b>
Other modifiers
</b><br>
<P>
There are yet more modifiers for controlling the way <b>pcretest</b>
operates.
</P>
<P>
The <b>/+</b> modifier requests that as well as outputting the substring that
matched the entire pattern, pcretest should in addition output the remainder of
the subject string. This is useful for tests where the subject contains
multiple copies of the same substring.
</P>
<P>
The <b>/B</b> modifier is a debugging feature. It requests that <b>pcretest</b>
output a representation of the compiled byte code after compilation. Normally
this information contains length and offset values; however, if <b>/Z</b> is
also present, this data is replaced by spaces. This is a special feature for
use in the automatic test scripts; it ensures that the same output is generated
for different internal link sizes.
</P>
<P>
The <b>/L</b> modifier must be followed directly by the name of a locale, for
example,
<pre>
  /pattern/Lfr_FR
</pre>
For this reason, it must be the last modifier. The given locale is set,
<b>pcre_maketables()</b> is called to build a set of character tables for the
locale, and this is then passed to <b>pcre_compile()</b> when compiling the
regular expression. Without an <b>/L</b> modifier, NULL is passed as the tables
pointer; that is, <b>/L</b> applies only to the expression on which it appears.
</P>
<P>
The <b>/I</b> modifier requests that <b>pcretest</b> output information about the
compiled pattern (whether it is anchored, has a fixed first character, and
so on). It does this by calling <b>pcre_fullinfo()</b> after compiling a
pattern. If the pattern is studied, the results of that are also output.
</P>
<P>
The <b>/D</b> modifier is a PCRE debugging feature, and is equivalent to
<b>/BI</b>, that is, both the <b>/B</b> and the <b>/I</b> modifiers.
</P>
<P>
The <b>/F</b> modifier causes <b>pcretest</b> to flip the byte order of the
fields in the compiled pattern that contain 2-byte and 4-byte numbers. This
facility is for testing the feature in PCRE that allows it to execute patterns
that were compiled on a host with a different endianness. This feature is not
available when the POSIX interface to PCRE is being used, that is, when the
<b>/P</b> pattern modifier is specified. See also the section about saving and
reloading compiled patterns below.
</P>
<P>
The <b>/S</b> modifier causes <b>pcre_study()</b> to be called after the
expression has been compiled, and the results used when the expression is
matched.
</P>
<P>
The <b>/M</b> modifier causes the size of memory block used to hold the compiled
pattern to be output.
</P>
<P>
The <b>/P</b> modifier causes <b>pcretest</b> to call PCRE via the POSIX wrapper
API rather than its native API. When this is done, all other modifiers except
<b>/i</b>, <b>/m</b>, and <b>/+</b> are ignored. REG_ICASE is set if <b>/i</b> is
present, and REG_NEWLINE is set if <b>/m</b> is present. The wrapper functions
force PCRE_DOLLAR_ENDONLY always, and PCRE_DOTALL unless REG_NEWLINE is set.
</P>
<P>
The <b>/8</b> modifier causes <b>pcretest</b> to call PCRE with the PCRE_UTF8
option set. This turns on support for UTF-8 character handling in PCRE,
provided that it was compiled with this support enabled. This modifier also
causes any non-printing characters in output strings to be printed using the
\x{hh...} notation if they are valid UTF-8 sequences.
</P>
<P>
If the <b>/?</b> modifier is used with <b>/8</b>, it causes <b>pcretest</b> to
call <b>pcre_compile()</b> with the PCRE_NO_UTF8_CHECK option, to suppress the
checking of the string for UTF-8 validity.
</P>
<br><a name="SEC5" href="#TOC1">DATA LINES</a><br>
<P>
Before each data line is passed to <b>pcre_exec()</b>, leading and trailing
whitespace is removed, and it is then scanned for \ escapes. Some of these are
pretty esoteric features, intended for checking out some of the more
complicated features of PCRE. If you are just testing "ordinary" regular
expressions, you probably don't need any of these. The following escapes are
recognized:
<pre>
  \a         alarm (BEL, \x07)
  \b         backspace (\x08)
  \e         escape (\x27)
  \f         formfeed (\x0c)
  \n         newline (\x0a)
  \qdd       set the PCRE_MATCH_LIMIT limit to dd (any number of digits)
  \r         carriage return (\x0d)
  \t         tab (\x09)
  \v         vertical tab (\x0b)
  \nnn       octal character (up to 3 octal digits)
  \xhh       hexadecimal character (up to 2 hex digits)
  \x{hh...}  hexadecimal character, any number of digits in UTF-8 mode
  \A         pass the PCRE_ANCHORED option to <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>
  \B         pass the PCRE_NOTBOL option to <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>
  \Cdd       call pcre_copy_substring() for substring dd after a successful match (number less than 32)
  \Cname     call pcre_copy_named_substring() for substring "name" after a successful match (name termin-
               ated by next non alphanumeric character)
  \C+        show the current captured substrings at callout time
  \C-        do not supply a callout function
  \C!n       return 1 instead of 0 when callout number n is reached
  \C!n!m     return 1 instead of 0 when callout number n is reached for the nth time
  \C*n       pass the number n (may be negative) as callout data; this is used as the callout return value
  \D         use the <b>pcre_dfa_exec()</b> match function
  \F         only shortest match for <b>pcre_dfa_exec()</b>
  \Gdd       call pcre_get_substring() for substring dd after a successful match (number less than 32)
  \Gname     call pcre_get_named_substring() for substring "name" after a successful match (name termin-
               ated by next non-alphanumeric character)
  \L         call pcre_get_substringlist() after a successful match
  \M         discover the minimum MATCH_LIMIT and MATCH_LIMIT_RECURSION settings
  \N         pass the PCRE_NOTEMPTY option to <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>; if used twice, pass the
               PCRE_NOTEMPTY_ATSTART option
  \Odd       set the size of the output vector passed to <b>pcre_exec()</b> to dd (any number of digits)
  \P         pass the PCRE_PARTIAL_SOFT option to <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>; if used twice, pass the
               PCRE_PARTIAL_HARD option
  \Qdd       set the PCRE_MATCH_LIMIT_RECURSION limit to dd (any number of digits)
  \R         pass the PCRE_DFA_RESTART option to <b>pcre_dfa_exec()</b>
  \S         output details of memory get/free calls during matching
  \Y         pass the PCRE_NO_START_OPTIMIZE option to <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>
  \Z         pass the PCRE_NOTEOL option to <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>
  \?         pass the PCRE_NO_UTF8_CHECK option to <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>
  \&#62;dd       start the match at offset dd (any number of digits);
               this sets the <i>startoffset</i> argument for <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>
  \&#60;cr&#62;      pass the PCRE_NEWLINE_CR option to <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>
  \&#60;lf&#62;      pass the PCRE_NEWLINE_LF option to <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>
  \&#60;crlf&#62;    pass the PCRE_NEWLINE_CRLF option to <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>
  \&#60;anycrlf&#62; pass the PCRE_NEWLINE_ANYCRLF option to <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>
  \&#60;any&#62;     pass the PCRE_NEWLINE_ANY option to <b>pcre_exec()</b> or <b>pcre_dfa_exec()</b>
</pre>
The escapes that specify line ending sequences are literal strings, exactly as
shown. No more than one newline setting should be present in any data line.
</P>
<P>
A backslash followed by anything else just escapes the anything else. If
the very last character is a backslash, it is ignored. This gives a way of
passing an empty line as data, since a real empty line terminates the data
input.
</P>
<P>
If \M is present, <b>pcretest</b> calls <b>pcre_exec()</b> several times, with
different values in the <i>match_limit</i> and <i>match_limit_recursion</i>
fields of the <b>pcre_extra</b> data structure, until it finds the minimum
numbers for each parameter that allow <b>pcre_exec()</b> to complete. The
<i>match_limit</i> number is a measure of the amount of backtracking that takes
place, and checking it out can be instructive. For most simple matches, the
number is quite small, but for patterns with very large numbers of matching
possibilities, it can become large very quickly with increasing length of
subject string. The <i>match_limit_recursion</i> number is a measure of how much
stack (or, if PCRE is compiled with NO_RECURSE, how much heap) memory is needed
to complete the match attempt.
</P>
<P>
When \O is used, the value specified may be higher or lower than the size set
by the <b>-O</b> command line option (or defaulted to 45); \O applies only to
the call of <b>pcre_exec()</b> for the line in which it appears.
</P>
<P>
If the <b>/P</b> modifier was present on the pattern, causing the POSIX wrapper
API to be used, the only option-setting sequences that have any effect are \B
and \Z, causing REG_NOTBOL and REG_NOTEOL, respectively, to be passed to
<b>regexec()</b>.
</P>
<P>
The use of \x{hh...} to represent UTF-8 characters is not dependent on the use
of the <b>/8</b> modifier on the pattern. It is recognized always. There may be
any number of hexadecimal digits inside the braces. The result is from one to
six bytes, encoded according to the original UTF-8 rules of RFC 2279. This
allows for values in the range 0 to 0x7FFFFFFF. Note that not all of those are
valid Unicode code points, or indeed valid UTF-8 characters according to the
later rules in RFC 3629.
</P>
<br><a name="SEC6" href="#TOC1">THE ALTERNATIVE MATCHING FUNCTION</a><br>
<P>
By default, <b>pcretest</b> uses the standard PCRE matching function,
<b>pcre_exec()</b> to match each data line. From release 6.0, PCRE supports an
alternative matching function, <b>pcre_dfa_test()</b>, which operates in a
different way, and has some restrictions. The differences between the two
functions are described in the
<a href="pcrematching.html"><b>pcrematching</b></a>
documentation.
</P>
<P>
If a data line contains the \D escape sequence, or if the command line
contains the <b>-dfa</b> option, the alternative matching function is called.
This function finds all possible matches at a given point. If, however, the \F
escape sequence is present in the data line, it stops after the first match is
found. This is always the shortest possible match.
</P>
<br><a name="SEC7" href="#TOC1">DEFAULT OUTPUT FROM PCRETEST</a><br>
<P>
This section describes the output when the normal matching function,
<b>pcre_exec()</b>, is being used.
</P>
<P>
When a match succeeds, pcretest outputs the list of captured substrings that
<b>pcre_exec()</b> returns, starting with number 0 for the string that matched
the whole pattern. Otherwise, it outputs "No match" when the return is
PCRE_ERROR_NOMATCH, and "Partial match:" followed by the partially matching
substring when <b>pcre_exec()</b> returns PCRE_ERROR_PARTIAL. For any other
returns, it outputs the PCRE negative error number. Here is an example of an
interactive <b>pcretest</b> run.
<pre>
  $ pcretest
  PCRE version 7.0 30-Nov-2006

    re&#62; /^abc(\d+)/
  data&#62; abc123
   0: abc123
   1: 123
  data&#62; xyz
  No match
</pre>
Note that unset capturing substrings that are not followed by one that is set
are not returned by <b>pcre_exec()</b>, and are not shown by <b>pcretest</b>. In
the following example, there are two capturing substrings, but when the first
data line is matched, the second, unset substring is not shown. An "internal"
unset substring is shown as "&#60;unset&#62;", as for the second data line.
<pre>
    re&#62; /(a)|(b)/
  data&#62; a
   0: a
   1: a
  data&#62; b
   0: b
   1: &#60;unset&#62;
   2: b
</pre>
If the strings contain any non-printing characters, they are output as \0x
escapes, or as \x{...} escapes if the <b>/8</b> modifier was present on the
pattern. See below for the definition of non-printing characters. If the
pattern has the <b>/+</b> modifier, the output for substring 0 is followed by
the the rest of the subject string, identified by "0+" like this:
<pre>
    re&#62; /cat/+
  data&#62; cataract
   0: cat
   0+ aract
</pre>
If the pattern has the <b>/g</b> or <b>/G</b> modifier, the results of successive
matching attempts are output in sequence, like this:
<pre>
    re&#62; /\Bi(\w\w)/g
  data&#62; Mississippi
   0: iss
   1: ss
   0: iss
   1: ss
   0: ipp
   1: pp
</pre>
"No match" is output only if the first match attempt fails.
</P>
<P>
If any of the sequences <b>\C</b>, <b>\G</b>, or <b>\L</b> are present in a
data line that is successfully matched, the substrings extracted by the
convenience functions are output with C, G, or L after the string number
instead of a colon. This is in addition to the normal full list. The string
length (that is, the return from the extraction function) is given in
parentheses after each string for <b>\C</b> and <b>\G</b>.
</P>
<P>
Note that whereas patterns can be continued over several lines (a plain "&#62;"
prompt is used for continuations), data lines may not. However newlines can be
included in data by means of the \n escape (or \r, \r\n, etc., depending on
the newline sequence setting).
</P>
<br><a name="SEC8" href="#TOC1">OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION</a><br>
<P>
When the alternative matching function, <b>pcre_dfa_exec()</b>, is used (by
means of the \D escape sequence or the <b>-dfa</b> command line option), the
output consists of a list of all the matches that start at the first point in
the subject where there is at least one match. For example:
<pre>
    re&#62; /(tang|tangerine|tan)/
  data&#62; yellow tangerine\D
   0: tangerine
   1: tang
   2: tan
</pre>
(Using the normal matching function on this data finds only "tang".) The
longest matching string is always given first (and numbered zero). After a
PCRE_ERROR_PARTIAL return, the output is "Partial match:", followed by the
partially matching substring.
</P>
<P>
If <b>/g</b> is present on the pattern, the search for further matches resumes
at the end of the longest match. For example:
<pre>
    re&#62; /(tang|tangerine|tan)/g
  data&#62; yellow tangerine and tangy sultana\D
   0: tangerine
   1: tang
   2: tan
   0: tang
   1: tan
   0: tan
</pre>
Since the matching function does not support substring capture, the escape
sequences that are concerned with captured substrings are not relevant.
</P>
<br><a name="SEC9" href="#TOC1">RESTARTING AFTER A PARTIAL MATCH</a><br>
<P>
When the alternative matching function has given the PCRE_ERROR_PARTIAL return,
indicating that the subject partially matched the pattern, you can restart the
match with additional subject data by means of the \R escape sequence. For
example:
<pre>
    re&#62; /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
  data&#62; 23ja\P\D
  Partial match: 23ja
  data&#62; n05\R\D
   0: n05
</pre>
For further information about partial matching, see the
<a href="pcrepartial.html"><b>pcrepartial</b></a>
documentation.
</P>
<br><a name="SEC10" href="#TOC1">CALLOUTS</a><br>
<P>
If the pattern contains any callout requests, <b>pcretest</b>'s callout function
is called during matching. This works with both matching functions. By default,
the called function displays the callout number, the start and current
positions in the text at the callout time, and the next pattern item to be
tested. For example, the output
<pre>
  ---&#62;pqrabcdef
    0    ^  ^     \d
</pre>
indicates that callout number 0 occurred for a match attempt starting at the
fourth character of the subject string, when the pointer was at the seventh
character of the data, and when the next pattern item was \d. Just one
circumflex is output if the start and current positions are the same.
</P>
<P>
Callouts numbered 255 are assumed to be automatic callouts, inserted as a
result of the <b>/C</b> pattern modifier. In this case, instead of showing the
callout number, the offset in the pattern, preceded by a plus, is output. For
example:
<pre>
    re&#62; /\d?[A-E]\*/C
  data&#62; E*
  ---&#62;E*
   +0 ^      \d?
   +3 ^      [A-E]
   +8 ^^     \*
  +10 ^ ^
   0: E*
</pre>
The callout function in <b>pcretest</b> returns zero (carry on matching) by
default, but you can use a \C item in a data line (as described above) to
change this.
</P>
<P>
Inserting callouts can be helpful when using <b>pcretest</b> to check
complicated regular expressions. For further information about callouts, see
the
<a href="pcrecallout.html"><b>pcrecallout</b></a>
documentation.
</P>
<br><a name="SEC11" href="#TOC1">NON-PRINTING CHARACTERS</a><br>
<P>
When <b>pcretest</b> is outputting text in the compiled version of a pattern,
bytes other than 32-126 are always treated as non-printing characters are are
therefore shown as hex escapes.
</P>
<P>
When <b>pcretest</b> is outputting text that is a matched part of a subject
string, it behaves in the same way, unless a different locale has been set for
the pattern (using the <b>/L</b> modifier). In this case, the <b>isprint()</b>
function to distinguish printing and non-printing characters.
</P>
<br><a name="SEC12" href="#TOC1">SAVING AND RELOADING COMPILED PATTERNS</a><br>
<P>
The facilities described in this section are not available when the POSIX
inteface to PCRE is being used, that is, when the <b>/P</b> pattern modifier is
specified.
</P>
<P>
When the POSIX interface is not in use, you can cause <b>pcretest</b> to write a
compiled pattern to a file, by following the modifiers with &#62; and a file name.
For example:
<pre>
  /pattern/im &#62;/some/file
</pre>
See the
<a href="pcreprecompile.html"><b>pcreprecompile</b></a>
documentation for a discussion about saving and re-using compiled patterns.
</P>
<P>
The data that is written is binary. The first eight bytes are the length of the
compiled pattern data followed by the length of the optional study data, each
written as four bytes in big-endian order (most significant byte first). If
there is no study data (either the pattern was not studied, or studying did not
return any data), the second length is zero. The lengths are followed by an
exact copy of the compiled pattern. If there is additional study data, this
follows immediately after the compiled pattern. After writing the file,
<b>pcretest</b> expects to read a new pattern.
</P>
<P>
A saved pattern can be reloaded into <b>pcretest</b> by specifing &#60; and a file
name instead of a pattern. The name of the file must not contain a &#60; character,
as otherwise <b>pcretest</b> will interpret the line as a pattern delimited by &#60;
characters.
For example:
<pre>
   re&#62; &#60;/some/file
  Compiled regex loaded from /some/file
  No study data
</pre>
When the pattern has been loaded, <b>pcretest</b> proceeds to read data lines in
the usual way.
</P>
<P>
You can copy a file written by <b>pcretest</b> to a different host and reload it
there, even if the new host has opposite endianness to the one on which the
pattern was compiled. For example, you can compile on an i86 machine and run on
a SPARC machine.
</P>
<P>
File names for saving and reloading can be absolute or relative, but note that
the shell facility of expanding a file name that starts with a tilde (~) is not
available.
</P>
<P>
The ability to save and reload files in <b>pcretest</b> is intended for testing
and experimentation. It is not intended for production use because only a
single pattern can be written to a file. Furthermore, there is no facility for
supplying custom character tables for use with a reloaded pattern. If the
original pattern was compiled with custom tables, an attempt to match a subject
string using a reloaded pattern is likely to cause <b>pcretest</b> to crash.
Finally, if you attempt to load a file that is not in the correct format, the
result is undefined.
</P>
<br><a name="SEC13" href="#TOC1">SEE ALSO</a><br>
<P>
<b>pcre</b>(3), <b>pcreapi</b>(3), <b>pcrecallout</b>(3), <b>pcrematching</b>(3),
<b>pcrepartial</b>(d), <b>pcrepattern</b>(3), <b>pcreprecompile</b>(3).
</P>
<br><a name="SEC14" href="#TOC1">AUTHOR</a><br>
<P>
Philip Hazel
<br>
University Computing Service
<br>
Cambridge CB2 3QH, England.
<br>
</P>
<br><a name="SEC15" href="#TOC1">REVISION</a><br>
<P>
Last updated: 26 September 2009
<br>
Copyright &copy; 1997-2009 University of Cambridge.
<br>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[���9aa3doc/alt-pcre802-devel/html/pcre_free_substring.htmlnu�[���<html>
<head>
<title>pcre_free_substring specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_free_substring man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>void pcre_free_substring(const char *<i>stringptr</i>);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This is a convenience function for freeing the store obtained by a previous
call to <b>pcre_get_substring()</b> or <b>pcre_get_named_substring()</b>. Its
only argument is a pointer to the string.
</P>
<P>
There is a complete description of the PCRE native API in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[�6�s..)doc/alt-pcre802-devel/html/pcreposix.htmlnu�[���<html>
<head>
<title>pcreposix specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcreposix man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<ul>
<li><a name="TOC1" href="#SEC1">SYNOPSIS OF POSIX API</a>
<li><a name="TOC2" href="#SEC2">DESCRIPTION</a>
<li><a name="TOC3" href="#SEC3">COMPILING A PATTERN</a>
<li><a name="TOC4" href="#SEC4">MATCHING NEWLINE CHARACTERS</a>
<li><a name="TOC5" href="#SEC5">MATCHING A PATTERN</a>
<li><a name="TOC6" href="#SEC6">ERROR MESSAGES</a>
<li><a name="TOC7" href="#SEC7">MEMORY USAGE</a>
<li><a name="TOC8" href="#SEC8">AUTHOR</a>
<li><a name="TOC9" href="#SEC9">REVISION</a>
</ul>
<br><a name="SEC1" href="#TOC1">SYNOPSIS OF POSIX API</a><br>
<P>
<b>#include &#60;pcreposix.h&#62;</b>
</P>
<P>
<b>int regcomp(regex_t *<i>preg</i>, const char *<i>pattern</i>,</b>
<b>int <i>cflags</i>);</b>
</P>
<P>
<b>int regexec(regex_t *<i>preg</i>, const char *<i>string</i>,</b>
<b>size_t <i>nmatch</i>, regmatch_t <i>pmatch</i>[], int <i>eflags</i>);</b>
</P>
<P>
<b>size_t regerror(int <i>errcode</i>, const regex_t *<i>preg</i>,</b>
<b>char *<i>errbuf</i>, size_t <i>errbuf_size</i>);</b>
</P>
<P>
<b>void regfree(regex_t *<i>preg</i>);</b>
</P>
<br><a name="SEC2" href="#TOC1">DESCRIPTION</a><br>
<P>
This set of functions provides a POSIX-style API to the PCRE regular expression
package. See the
<a href="pcreapi.html"><b>pcreapi</b></a>
documentation for a description of PCRE's native API, which contains much
additional functionality.
</P>
<P>
The functions described here are just wrapper functions that ultimately call
the PCRE native API. Their prototypes are defined in the <b>pcreposix.h</b>
header file, and on Unix systems the library itself is called
<b>pcreposix.a</b>, so can be accessed by adding <b>-lpcreposix</b> to the
command for linking an application that uses them. Because the POSIX functions
call the native ones, it is also necessary to add <b>-lpcre</b>.
</P>
<P>
I have implemented only those POSIX option bits that can be reasonably mapped
to PCRE native options. In addition, the option REG_EXTENDED is defined with
the value zero. This has no effect, but since programs that are written to the
POSIX interface often use it, this makes it easier to slot in PCRE as a
replacement library. Other POSIX options are not even defined.
</P>
<P>
There are also some other options that are not defined by POSIX. These have
been added at the request of users who want to make use of certain
PCRE-specific features via the POSIX calling interface.
</P>
<P>
When PCRE is called via these functions, it is only the API that is POSIX-like
in style. The syntax and semantics of the regular expressions themselves are
still those of Perl, subject to the setting of various PCRE options, as
described below. "POSIX-like in style" means that the API approximates to the
POSIX definition; it is not fully POSIX-compatible, and in multi-byte encoding
domains it is probably even less compatible.
</P>
<P>
The header for these functions is supplied as <b>pcreposix.h</b> to avoid any
potential clash with other POSIX libraries. It can, of course, be renamed or
aliased as <b>regex.h</b>, which is the "correct" name. It provides two
structure types, <i>regex_t</i> for compiled internal forms, and
<i>regmatch_t</i> for returning captured substrings. It also defines some
constants whose names start with "REG_"; these are used for setting options and
identifying error codes.
</P>
<P>
</P>
<br><a name="SEC3" href="#TOC1">COMPILING A PATTERN</a><br>
<P>
The function <b>regcomp()</b> is called to compile a pattern into an
internal form. The pattern is a C string terminated by a binary zero, and
is passed in the argument <i>pattern</i>. The <i>preg</i> argument is a pointer
to a <b>regex_t</b> structure that is used as a base for storing information
about the compiled regular expression.
</P>
<P>
The argument <i>cflags</i> is either zero, or contains one or more of the bits
defined by the following macros:
<pre>
  REG_DOTALL
</pre>
The PCRE_DOTALL option is set when the regular expression is passed for
compilation to the native function. Note that REG_DOTALL is not part of the
POSIX standard.
<pre>
  REG_ICASE
</pre>
The PCRE_CASELESS option is set when the regular expression is passed for
compilation to the native function.
<pre>
  REG_NEWLINE
</pre>
The PCRE_MULTILINE option is set when the regular expression is passed for
compilation to the native function. Note that this does <i>not</i> mimic the
defined POSIX behaviour for REG_NEWLINE (see the following section).
<pre>
  REG_NOSUB
</pre>
The PCRE_NO_AUTO_CAPTURE option is set when the regular expression is passed
for compilation to the native function. In addition, when a pattern that is
compiled with this flag is passed to <b>regexec()</b> for matching, the
<i>nmatch</i> and <i>pmatch</i> arguments are ignored, and no captured strings
are returned.
<pre>
  REG_UNGREEDY
</pre>
The PCRE_UNGREEDY option is set when the regular expression is passed for
compilation to the native function. Note that REG_UNGREEDY is not part of the
POSIX standard.
<pre>
  REG_UTF8
</pre>
The PCRE_UTF8 option is set when the regular expression is passed for
compilation to the native function. This causes the pattern itself and all data
strings used for matching it to be treated as UTF-8 strings. Note that REG_UTF8
is not part of the POSIX standard.
</P>
<P>
In the absence of these flags, no options are passed to the native function.
This means the the regex is compiled with PCRE default semantics. In
particular, the way it handles newline characters in the subject string is the
Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only
<i>some</i> of the effects specified for REG_NEWLINE. It does not affect the way
newlines are matched by . (they are not) or by a negative class such as [^a]
(they are).
</P>
<P>
The yield of <b>regcomp()</b> is zero on success, and non-zero otherwise. The
<i>preg</i> structure is filled in on success, and one member of the structure
is public: <i>re_nsub</i> contains the number of capturing subpatterns in
the regular expression. Various error codes are defined in the header file.
</P>
<P>
NOTE: If the yield of <b>regcomp()</b> is non-zero, you must not attempt to
use the contents of the <i>preg</i> structure. If, for example, you pass it to
<b>regexec()</b>, the result is undefined and your program is likely to crash.
</P>
<br><a name="SEC4" href="#TOC1">MATCHING NEWLINE CHARACTERS</a><br>
<P>
This area is not simple, because POSIX and Perl take different views of things.
It is not possible to get PCRE to obey POSIX semantics, but then PCRE was never
intended to be a POSIX engine. The following table lists the different
possibilities for matching newline characters in PCRE:
<pre>
                          Default   Change with

  . matches newline          no     PCRE_DOTALL
  newline matches [^a]       yes    not changeable
  $ matches \n at end        yes    PCRE_DOLLARENDONLY
  $ matches \n in middle     no     PCRE_MULTILINE
  ^ matches \n in middle     no     PCRE_MULTILINE
</pre>
This is the equivalent table for POSIX:
<pre>
                          Default   Change with

  . matches newline          yes    REG_NEWLINE
  newline matches [^a]       yes    REG_NEWLINE
  $ matches \n at end        no     REG_NEWLINE
  $ matches \n in middle     no     REG_NEWLINE
  ^ matches \n in middle     no     REG_NEWLINE
</pre>
PCRE's behaviour is the same as Perl's, except that there is no equivalent for
PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is no way to stop
newline from matching [^a].
</P>
<P>
The default POSIX newline handling can be obtained by setting PCRE_DOTALL and
PCRE_DOLLAR_ENDONLY, but there is no way to make PCRE behave exactly as for the
REG_NEWLINE action.
</P>
<br><a name="SEC5" href="#TOC1">MATCHING A PATTERN</a><br>
<P>
The function <b>regexec()</b> is called to match a compiled pattern <i>preg</i>
against a given <i>string</i>, which is by default terminated by a zero byte
(but see REG_STARTEND below), subject to the options in <i>eflags</i>. These can
be:
<pre>
  REG_NOTBOL
</pre>
The PCRE_NOTBOL option is set when calling the underlying PCRE matching
function.
<pre>
  REG_NOTEMPTY
</pre>
The PCRE_NOTEMPTY option is set when calling the underlying PCRE matching
function. Note that REG_NOTEMPTY is not part of the POSIX standard. However,
setting this option can give more POSIX-like behaviour in some situations.
<pre>
  REG_NOTEOL
</pre>
The PCRE_NOTEOL option is set when calling the underlying PCRE matching
function.
<pre>
  REG_STARTEND
</pre>
The string is considered to start at <i>string</i> + <i>pmatch[0].rm_so</i> and
to have a terminating NUL located at <i>string</i> + <i>pmatch[0].rm_eo</i>
(there need not actually be a NUL at that location), regardless of the value of
<i>nmatch</i>. This is a BSD extension, compatible with but not specified by
IEEE Standard 1003.2 (POSIX.2), and should be used with caution in software
intended to be portable to other systems. Note that a non-zero <i>rm_so</i> does
not imply REG_NOTBOL; REG_STARTEND affects only the location of the string, not
how it is matched.
</P>
<P>
If the pattern was compiled with the REG_NOSUB flag, no data about any matched
strings is returned. The <i>nmatch</i> and <i>pmatch</i> arguments of
<b>regexec()</b> are ignored.
</P>
<P>
If the value of <i>nmatch</i> is zero, or if the value <i>pmatch</i> is NULL,
no data about any matched strings is returned.
</P>
<P>
Otherwise,the portion of the string that was matched, and also any captured
substrings, are returned via the <i>pmatch</i> argument, which points to an
array of <i>nmatch</i> structures of type <i>regmatch_t</i>, containing the
members <i>rm_so</i> and <i>rm_eo</i>. These contain the offset to the first
character of each substring and the offset to the first character after the end
of each substring, respectively. The 0th element of the vector relates to the
entire portion of <i>string</i> that was matched; subsequent elements relate to
the capturing subpatterns of the regular expression. Unused entries in the
array have both structure members set to -1.
</P>
<P>
A successful match yields a zero return; various error codes are defined in the
header file, of which REG_NOMATCH is the "expected" failure code.
</P>
<br><a name="SEC6" href="#TOC1">ERROR MESSAGES</a><br>
<P>
The <b>regerror()</b> function maps a non-zero errorcode from either
<b>regcomp()</b> or <b>regexec()</b> to a printable message. If <i>preg</i> is not
NULL, the error should have arisen from the use of that structure. A message
terminated by a binary zero is placed in <i>errbuf</i>. The length of the
message, including the zero, is limited to <i>errbuf_size</i>. The yield of the
function is the size of buffer needed to hold the whole message.
</P>
<br><a name="SEC7" href="#TOC1">MEMORY USAGE</a><br>
<P>
Compiling a regular expression causes memory to be allocated and associated
with the <i>preg</i> structure. The function <b>regfree()</b> frees all such
memory, after which <i>preg</i> may no longer be used as a compiled expression.
</P>
<br><a name="SEC8" href="#TOC1">AUTHOR</a><br>
<P>
Philip Hazel
<br>
University Computing Service
<br>
Cambridge CB2 3QH, England.
<br>
</P>
<br><a name="SEC9" href="#TOC1">REVISION</a><br>
<P>
Last updated: 02 September 2009
<br>
Copyright &copy; 1997-2009 University of Cambridge.
<br>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[��D�-doc/alt-pcre802-devel/html/pcre_refcount.htmlnu�[���<html>
<head>
<title>pcre_refcount specification</title>
</head>
<body bgcolor="#FFFFFF" text="#00005A" link="#0066FF" alink="#3399FF" vlink="#2222BB">
<h1>pcre_refcount man page</h1>
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
<p>
This page is part of the PCRE HTML documentation. It was generated automatically
from the original man page. If there is any nonsense in it, please consult the
man page, in case the conversion went wrong.
<br>
<br><b>
SYNOPSIS
</b><br>
<P>
<b>#include &#60;pcre.h&#62;</b>
</P>
<P>
<b>int pcre_refcount(pcre *<i>code</i>, int <i>adjust</i>);</b>
</P>
<br><b>
DESCRIPTION
</b><br>
<P>
This function is used to maintain a reference count inside a data block that
contains a compiled pattern. Its arguments are:
<pre>
  <i>code</i>                      Compiled regular expression
  <i>adjust</i>                    Adjustment to reference value
</pre>
The yield of the function is the adjusted reference value, which is constrained
to lie between 0 and 65535.
</P>
<P>
There is a complete description of the PCRE native API in the
<a href="pcreapi.html"><b>pcreapi</b></a>
page and a description of the POSIX API in the
<a href="pcreposix.html"><b>pcreposix</b></a>
page.
<p>
Return to the <a href="index.html">PCRE index page</a>.
</p>
PK��$[��	wRGRGdoc/alt-pcre802-devel/HACKINGnu�[���Technical Notes about PCRE
--------------------------

These are very rough technical notes that record potentially useful information 
about PCRE internals.

Historical note 1
-----------------

Many years ago I implemented some regular expression functions to an algorithm
suggested by Martin Richards. These were not Unix-like in form, and were quite
restricted in what they could do by comparison with Perl. The interesting part
about the algorithm was that the amount of space required to hold the compiled
form of an expression was known in advance. The code to apply an expression did
not operate by backtracking, as the original Henry Spencer code and current
Perl code does, but instead checked all possibilities simultaneously by keeping
a list of current states and checking all of them as it advanced through the
subject string. In the terminology of Jeffrey Friedl's book, it was a "DFA
algorithm", though it was not a traditional Finite State Machine (FSM). When
the pattern was all used up, all remaining states were possible matches, and
the one matching the longest subset of the subject string was chosen. This did
not necessarily maximize the individual wild portions of the pattern, as is
expected in Unix and Perl-style regular expressions.

Historical note 2
-----------------

By contrast, the code originally written by Henry Spencer (which was
subsequently heavily modified for Perl) compiles the expression twice: once in
a dummy mode in order to find out how much store will be needed, and then for
real. (The Perl version probably doesn't do this any more; I'm talking about
the original library.) The execution function operates by backtracking and
maximizing (or, optionally, minimizing in Perl) the amount of the subject that
matches individual wild portions of the pattern. This is an "NFA algorithm" in
Friedl's terminology.

OK, here's the real stuff
-------------------------

For the set of functions that form the "basic" PCRE library (which are
unrelated to those mentioned above), I tried at first to invent an algorithm
that used an amount of store bounded by a multiple of the number of characters
in the pattern, to save on compiling time. However, because of the greater
complexity in Perl regular expressions, I couldn't do this. In any case, a
first pass through the pattern is helpful for other reasons. 

Computing the memory requirement: how it was
--------------------------------------------

Up to and including release 6.7, PCRE worked by running a very degenerate first
pass to calculate a maximum store size, and then a second pass to do the real
compile - which might use a bit less than the predicted amount of memory. The
idea was that this would turn out faster than the Henry Spencer code because
the first pass is degenerate and the second pass can just store stuff straight
into the vector, which it knows is big enough.

Computing the memory requirement: how it is
-------------------------------------------

By the time I was working on a potential 6.8 release, the degenerate first pass
had become very complicated and hard to maintain. Indeed one of the early
things I did for 6.8 was to fix Yet Another Bug in the memory computation. Then
I had a flash of inspiration as to how I could run the real compile function in
a "fake" mode that enables it to compute how much memory it would need, while
actually only ever using a few hundred bytes of working memory, and without too
many tests of the mode that might slow it down. So I re-factored the compiling
functions to work this way. This got rid of about 600 lines of source. It
should make future maintenance and development easier. As this was such a major 
change, I never released 6.8, instead upping the number to 7.0 (other quite 
major changes were also present in the 7.0 release).

A side effect of this work was that the previous limit of 200 on the nesting
depth of parentheses was removed. However, there is a downside: pcre_compile()
runs more slowly than before (30% or more, depending on the pattern) because it
is doing a full analysis of the pattern. My hope was that this would not be a
big issue, and in the event, nobody has commented on it.

Traditional matching function
-----------------------------

The "traditional", and original, matching function is called pcre_exec(), and 
it implements an NFA algorithm, similar to the original Henry Spencer algorithm 
and the way that Perl works. This is not surprising, since it is intended to be
as compatible with Perl as possible. This is the function most users of PCRE
will use most of the time.

Supplementary matching function
-------------------------------

From PCRE 6.0, there is also a supplementary matching function called 
pcre_dfa_exec(). This implements a DFA matching algorithm that searches 
simultaneously for all possible matches that start at one point in the subject 
string. (Going back to my roots: see Historical Note 1 above.) This function 
intreprets the same compiled pattern data as pcre_exec(); however, not all the 
facilities are available, and those that are do not always work in quite the 
same way. See the user documentation for details.

The algorithm that is used for pcre_dfa_exec() is not a traditional FSM, 
because it may have a number of states active at one time. More work would be 
needed at compile time to produce a traditional FSM where only one state is 
ever active at once. I believe some other regex matchers work this way.


Format of compiled patterns
---------------------------

The compiled form of a pattern is a vector of bytes, containing items of
variable length. The first byte in an item is an opcode, and the length of the
item is either implicit in the opcode or contained in the data bytes that
follow it. 

In many cases below LINK_SIZE data values are specified for offsets within the 
compiled pattern. The default value for LINK_SIZE is 2, but PCRE can be
compiled to use 3-byte or 4-byte values for these offsets (impairing the
performance). This is necessary only when patterns whose compiled length is
greater than 64K are going to be processed. In this description, we assume the
"normal" compilation options. Data values that are counts (e.g. for
quantifiers) are always just two bytes long.

A list of the opcodes follows:


Opcodes with no following data
------------------------------

These items are all just one byte long

  OP_END                 end of pattern
  OP_ANY                 match any one character other than newline
  OP_ALLANY              match any one character, including newline
  OP_ANYBYTE             match any single byte, even in UTF-8 mode
  OP_SOD                 match start of data: \A
  OP_SOM,                start of match (subject + offset): \G
  OP_SET_SOM,            set start of match (\K) 
  OP_CIRC                ^ (start of data, or after \n in multiline)
  OP_NOT_WORD_BOUNDARY   \W
  OP_WORD_BOUNDARY       \w
  OP_NOT_DIGIT           \D
  OP_DIGIT               \d
  OP_NOT_HSPACE          \H
  OP_HSPACE              \h  
  OP_NOT_WHITESPACE      \S
  OP_WHITESPACE          \s
  OP_NOT_VSPACE          \V
  OP_VSPACE              \v  
  OP_NOT_WORDCHAR        \W
  OP_WORDCHAR            \w
  OP_EODN                match end of data or \n at end: \Z
  OP_EOD                 match end of data: \z
  OP_DOLL                $ (end of data, or before \n in multiline)
  OP_EXTUNI              match an extended Unicode character 
  OP_ANYNL               match any Unicode newline sequence 
  
  OP_ACCEPT              ) These are Perl 5.10's "backtracking    
  OP_COMMIT              ) control verbs". If OP_ACCEPT is inside
  OP_FAIL                ) capturing parentheses, it may be preceded 
  OP_PRUNE               ) by one or more OP_CLOSE, followed by a 2-byte 
  OP_SKIP                ) number, indicating which parentheses must be
  OP_THEN                ) closed.
  

Repeating single characters
---------------------------

The common repeats (*, +, ?) when applied to a single character use the
following opcodes:

  OP_STAR
  OP_MINSTAR
  OP_POSSTAR 
  OP_PLUS
  OP_MINPLUS
  OP_POSPLUS 
  OP_QUERY
  OP_MINQUERY
  OP_POSQUERY 

In ASCII mode, these are two-byte items; in UTF-8 mode, the length is variable.
Those with "MIN" in their name are the minimizing versions. Those with "POS" in 
their names are possessive versions. Each is followed by the character that is
to be repeated. Other repeats make use of

  OP_UPTO
  OP_MINUPTO
  OP_POSUPTO 
  OP_EXACT

which are followed by a two-byte count (most significant first) and the
repeated character. OP_UPTO matches from 0 to the given number. A repeat with a
non-zero minimum and a fixed maximum is coded as an OP_EXACT followed by an
OP_UPTO (or OP_MINUPTO or OPT_POSUPTO).


Repeating character types
-------------------------

Repeats of things like \d are done exactly as for single characters, except
that instead of a character, the opcode for the type is stored in the data
byte. The opcodes are:

  OP_TYPESTAR
  OP_TYPEMINSTAR
  OP_TYPEPOSSTAR 
  OP_TYPEPLUS
  OP_TYPEMINPLUS
  OP_TYPEPOSPLUS 
  OP_TYPEQUERY
  OP_TYPEMINQUERY
  OP_TYPEPOSQUERY 
  OP_TYPEUPTO
  OP_TYPEMINUPTO
  OP_TYPEPOSUPTO 
  OP_TYPEEXACT


Match by Unicode property
-------------------------

OP_PROP and OP_NOTPROP are used for positive and negative matches of a 
character by testing its Unicode property (the \p and \P escape sequences).
Each is followed by two bytes that encode the desired property as a type and a 
value.

Repeats of these items use the OP_TYPESTAR etc. set of opcodes, followed by 
three bytes: OP_PROP or OP_NOTPROP and then the desired property type and 
value.


Matching literal characters
---------------------------

The OP_CHAR opcode is followed by a single character that is to be matched 
casefully. For caseless matching, OP_CHARNC is used. In UTF-8 mode, the 
character may be more than one byte long. (Earlier versions of PCRE used 
multi-character strings, but this was changed to allow some new features to be 
added.)


Character classes
-----------------

If there is only one character, OP_CHAR or OP_CHARNC is used for a positive
class, and OP_NOT for a negative one (that is, for something like [^a]).
However, in UTF-8 mode, the use of OP_NOT applies only to characters with
values < 128, because OP_NOT is confined to single bytes.

Another set of repeating opcodes (OP_NOTSTAR etc.) are used for a repeated,
negated, single-character class. The normal ones (OP_STAR etc.) are used for a
repeated positive single-character class.

When there's more than one character in a class and all the characters are less
than 256, OP_CLASS is used for a positive class, and OP_NCLASS for a negative
one. In either case, the opcode is followed by a 32-byte bit map containing a 1
bit for every character that is acceptable. The bits are counted from the least
significant end of each byte.

The reason for having both OP_CLASS and OP_NCLASS is so that, in UTF-8 mode,
subject characters with values greater than 256 can be handled correctly. For
OP_CLASS they don't match, whereas for OP_NCLASS they do.

For classes containing characters with values > 255, OP_XCLASS is used. It
optionally uses a bit map (if any characters lie within it), followed by a list
of pairs and single characters. There is a flag character than indicates
whether it's a positive or a negative class.


Back references
---------------

OP_REF is followed by two bytes containing the reference number.


Repeating character classes and back references
-----------------------------------------------

Single-character classes are handled specially (see above). This section
applies to OP_CLASS and OP_REF. In both cases, the repeat information follows
the base item. The matching code looks at the following opcode to see if it is
one of

  OP_CRSTAR
  OP_CRMINSTAR
  OP_CRPLUS
  OP_CRMINPLUS
  OP_CRQUERY
  OP_CRMINQUERY
  OP_CRRANGE
  OP_CRMINRANGE

All but the last two are just single-byte items. The others are followed by
four bytes of data, comprising the minimum and maximum repeat counts. There are 
no special possessive opcodes for these repeats; a possessive repeat is 
compiled into an atomic group.


Brackets and alternation
------------------------

A pair of non-capturing (round) brackets is wrapped round each expression at
compile time, so alternation always happens in the context of brackets.

[Note for North Americans: "bracket" to some English speakers, including
myself, can be round, square, curly, or pointy. Hence this usage.]

Non-capturing brackets use the opcode OP_BRA. Originally PCRE was limited to 99
capturing brackets and it used a different opcode for each one. From release
3.5, the limit was removed by putting the bracket number into the data for
higher-numbered brackets. From release 7.0 all capturing brackets are handled
this way, using the single opcode OP_CBRA.

A bracket opcode is followed by LINK_SIZE bytes which give the offset to the
next alternative OP_ALT or, if there aren't any branches, to the matching
OP_KET opcode. Each OP_ALT is followed by LINK_SIZE bytes giving the offset to
the next one, or to the OP_KET opcode. For capturing brackets, the bracket 
number immediately follows the offset, always as a 2-byte item.

OP_KET is used for subpatterns that do not repeat indefinitely, while
OP_KETRMIN and OP_KETRMAX are used for indefinite repetitions, minimally or
maximally respectively. All three are followed by LINK_SIZE bytes giving (as a
positive number) the offset back to the matching bracket opcode.

If a subpattern is quantified such that it is permitted to match zero times, it
is preceded by one of OP_BRAZERO, OP_BRAMINZERO, or OP_SKIPZERO. These are
single-byte opcodes that tell the matcher that skipping the following
subpattern entirely is a valid branch. In the case of the first two, not 
skipping the pattern is also valid (greedy and non-greedy). The third is used 
when a pattern has the quantifier {0,0}. It cannot be entirely discarded, 
because it may be called as a subroutine from elsewhere in the regex.

A subpattern with an indefinite maximum repetition is replicated in the
compiled data its minimum number of times (or once with OP_BRAZERO if the
minimum is zero), with the final copy terminating with OP_KETRMIN or OP_KETRMAX
as appropriate.

A subpattern with a bounded maximum repetition is replicated in a nested
fashion up to the maximum number of times, with OP_BRAZERO or OP_BRAMINZERO
before each replication after the minimum, so that, for example, (abc){2,5} is
compiled as (abc)(abc)((abc)((abc)(abc)?)?)?, except that each bracketed group 
has the same number.

When a repeated subpattern has an unbounded upper limit, it is checked to see 
whether it could match an empty string. If this is the case, the opcode in the 
final replication is changed to OP_SBRA or OP_SCBRA. This tells the matcher
that it needs to check for matching an empty string when it hits OP_KETRMIN or
OP_KETRMAX, and if so, to break the loop.


Assertions
----------

Forward assertions are just like other subpatterns, but starting with one of
the opcodes OP_ASSERT or OP_ASSERT_NOT. Backward assertions use the opcodes
OP_ASSERTBACK and OP_ASSERTBACK_NOT, and the first opcode inside the assertion
is OP_REVERSE, followed by a two byte count of the number of characters to move
back the pointer in the subject string. When operating in UTF-8 mode, the count
is a character count rather than a byte count. A separate count is present in
each alternative of a lookbehind assertion, allowing them to have different
fixed lengths.


Once-only (atomic) subpatterns
------------------------------

These are also just like other subpatterns, but they start with the opcode
OP_ONCE. The check for matching an empty string in an unbounded repeat is 
handled entirely at runtime, so there is just this one opcode.


Conditional subpatterns
-----------------------

These are like other subpatterns, but they start with the opcode OP_COND, or
OP_SCOND for one that might match an empty string in an unbounded repeat. If
the condition is a back reference, this is stored at the start of the
subpattern using the opcode OP_CREF followed by two bytes containing the
reference number. OP_NCREF is used instead if the reference was generated by 
name (so that the runtime code knows to check for duplicate names).

If the condition is "in recursion" (coded as "(?(R)"), or "in recursion of
group x" (coded as "(?(Rx)"), the group number is stored at the start of the
subpattern using the opcode OP_RREF or OP_NRREF (cf OP_NCREF), and a value of
zero for "the whole pattern". For a DEFINE condition, just the single byte
OP_DEF is used (it has no associated data). Otherwise, a conditional subpattern
always starts with one of the assertions.


Recursion
---------

Recursion either matches the current regex, or some subexpression. The opcode
OP_RECURSE is followed by an value which is the offset to the starting bracket
from the start of the whole pattern. From release 6.5, OP_RECURSE is 
automatically wrapped inside OP_ONCE brackets (because otherwise some patterns 
broke it). OP_RECURSE is also used for "subroutine" calls, even though they 
are not strictly a recursion.


Callout
-------

OP_CALLOUT is followed by one byte of data that holds a callout number in the
range 0 to 254 for manual callouts, or 255 for an automatic callout. In both 
cases there follows a two-byte value giving the offset in the pattern to the
start of the following item, and another two-byte item giving the length of the
next item.


Changing options
----------------

If any of the /i, /m, or /s options are changed within a pattern, an OP_OPT
opcode is compiled, followed by one byte containing the new settings of these
flags. If there are several alternatives, there is an occurrence of OP_OPT at
the start of all those following the first options change, to set appropriate
options for the start of the alternative. Immediately after the end of the
group there is another such item to reset the flags to their previous values. A
change of flag right at the very start of the pattern can be handled entirely
at compile time, and so does not cause anything to be put into the compiled
data.

Philip Hazel
October 2009
PK��$[�;�gQ+Q+doc/alt-pcre802-devel/pcre.txtnu�[���-----------------------------------------------------------------------------
This file contains a concatenation of the PCRE man pages, converted to plain
text format for ease of searching with a text editor, or for use on systems
that do not have a man page processor. The small individual files that give
synopses of each function in the library have not been included. Neither has
the pcredemo program. There are separate text files for the pcregrep and
pcretest commands.
-----------------------------------------------------------------------------


PCRE(3)                                                                PCRE(3)


NAME
       PCRE - Perl-compatible regular expressions


INTRODUCTION

       The  PCRE  library is a set of functions that implement regular expres-
       sion pattern matching using the same syntax and semantics as Perl, with
       just  a few differences. Some features that appeared in Python and PCRE
       before they appeared in Perl are also available using the  Python  syn-
       tax,  there  is  some  support for one or two .NET and Oniguruma syntax
       items, and there is an option for requesting some  minor  changes  that
       give better JavaScript compatibility.

       The  current implementation of PCRE corresponds approximately with Perl
       5.10, including support for UTF-8 encoded strings and  Unicode  general
       category  properties.  However,  UTF-8  and  Unicode  support has to be
       explicitly enabled; it is not the default. The  Unicode  tables  corre-
       spond to Unicode release 5.2.0.

       In  addition to the Perl-compatible matching function, PCRE contains an
       alternative function that matches the same compiled patterns in a  dif-
       ferent way. In certain circumstances, the alternative function has some
       advantages.  For a discussion of the two matching algorithms,  see  the
       pcrematching page.

       PCRE  is  written  in C and released as a C library. A number of people
       have written wrappers and interfaces of various kinds.  In  particular,
       Google  Inc.   have  provided  a comprehensive C++ wrapper. This is now
       included as part of the PCRE distribution. The pcrecpp page has details
       of  this  interface.  Other  people's contributions can be found in the
       Contrib directory at the primary FTP site, which is:

       ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre

       Details of exactly which Perl regular expression features are  and  are
       not supported by PCRE are given in separate documents. See the pcrepat-
       tern and pcrecompat pages. There is a syntax summary in the  pcresyntax
       page.

       Some  features  of  PCRE can be included, excluded, or changed when the
       library is built. The pcre_config() function makes it  possible  for  a
       client  to  discover  which  features are available. The features them-
       selves are described in the pcrebuild page. Documentation about  build-
       ing  PCRE  for various operating systems can be found in the README and
       NON-UNIX-USE files in the source distribution.

       The library contains a number of undocumented  internal  functions  and
       data  tables  that  are  used by more than one of the exported external
       functions, but which are not intended  for  use  by  external  callers.
       Their  names  all begin with "_pcre_", which hopefully will not provoke
       any name clashes. In some environments, it is possible to control which
       external  symbols  are  exported when a shared library is built, and in
       these cases the undocumented symbols are not exported.


USER DOCUMENTATION

       The user documentation for PCRE comprises a number  of  different  sec-
       tions.  In the "man" format, each of these is a separate "man page". In
       the HTML format, each is a separate page, linked from the  index  page.
       In  the  plain  text format, all the sections, except the pcredemo sec-
       tion, are concatenated, for ease of searching. The sections are as fol-
       lows:

         pcre              this document
         pcre-config       show PCRE installation configuration information
         pcreapi           details of PCRE's native C API
         pcrebuild         options for building PCRE
         pcrecallout       details of the callout feature
         pcrecompat        discussion of Perl compatibility
         pcrecpp           details of the C++ wrapper
         pcredemo          a demonstration C program that uses PCRE
         pcregrep          description of the pcregrep command
         pcrematching      discussion of the two matching algorithms
         pcrepartial       details of the partial matching facility
         pcrepattern       syntax and semantics of supported
                             regular expressions
         pcreperform       discussion of performance issues
         pcreposix         the POSIX-compatible C API
         pcreprecompile    details of saving and re-using precompiled patterns
         pcresample        discussion of the pcredemo program
         pcrestack         discussion of stack usage
         pcresyntax        quick syntax reference
         pcretest          description of the pcretest testing command

       In  addition,  in the "man" and HTML formats, there is a short page for
       each C library function, listing its arguments and results.


LIMITATIONS

       There are some size limitations in PCRE but it is hoped that they  will
       never in practice be relevant.

       The  maximum  length of a compiled pattern is 65539 (sic) bytes if PCRE
       is compiled with the default internal linkage size of 2. If you want to
       process  regular  expressions  that are truly enormous, you can compile
       PCRE with an internal linkage size of 3 or 4 (see the  README  file  in
       the  source  distribution and the pcrebuild documentation for details).
       In these cases the limit is substantially larger.  However,  the  speed
       of execution is slower.

       All values in repeating quantifiers must be less than 65536.

       There is no limit to the number of parenthesized subpatterns, but there
       can be no more than 65535 capturing subpatterns.

       The maximum length of name for a named subpattern is 32 characters, and
       the maximum number of named subpatterns is 10000.

       The  maximum  length of a subject string is the largest positive number
       that an integer variable can hold. However, when using the  traditional
       matching function, PCRE uses recursion to handle subpatterns and indef-
       inite repetition.  This means that the available stack space may  limit
       the size of a subject string that can be processed by certain patterns.
       For a discussion of stack issues, see the pcrestack documentation.


UTF-8 AND UNICODE PROPERTY SUPPORT

       From release 3.3, PCRE has  had  some  support  for  character  strings
       encoded  in the UTF-8 format. For release 4.0 this was greatly extended
       to cover most common requirements, and in release 5.0  additional  sup-
       port for Unicode general category properties was added.

       In  order  process  UTF-8 strings, you must build PCRE to include UTF-8
       support in the code, and, in addition,  you  must  call  pcre_compile()
       with  the  PCRE_UTF8  option  flag,  or the pattern must start with the
       sequence (*UTF8). When either of these is the case,  both  the  pattern
       and  any  subject  strings  that  are matched against it are treated as
       UTF-8 strings instead of strings of 1-byte characters.

       If you compile PCRE with UTF-8 support, but do not use it at run  time,
       the  library will be a bit bigger, but the additional run time overhead
       is limited to testing the PCRE_UTF8 flag occasionally, so should not be
       very big.

       If PCRE is built with Unicode character property support (which implies
       UTF-8 support), the escape sequences \p{..}, \P{..}, and  \X  are  sup-
       ported.  The available properties that can be tested are limited to the
       general category properties such as Lu for an upper case letter  or  Nd
       for  a  decimal number, the Unicode script names such as Arabic or Han,
       and the derived properties Any and L&. A full  list  is  given  in  the
       pcrepattern documentation. Only the short names for properties are sup-
       ported. For example, \p{L} matches a letter. Its Perl synonym,  \p{Let-
       ter},  is  not  supported.   Furthermore,  in Perl, many properties may
       optionally be prefixed by "Is", for compatibility with Perl  5.6.  PCRE
       does not support this.

   Validity of UTF-8 strings

       When  you  set  the  PCRE_UTF8 flag, the strings passed as patterns and
       subjects are (by default) checked for validity on entry to the relevant
       functions.  From  release 7.3 of PCRE, the check is according the rules
       of RFC 3629, which are themselves derived from the  Unicode  specifica-
       tion.  Earlier  releases  of PCRE followed the rules of RFC 2279, which
       allows the full range of 31-bit values (0 to 0x7FFFFFFF).  The  current
       check allows only values in the range U+0 to U+10FFFF, excluding U+D800
       to U+DFFF.

       The excluded code points are the "Low Surrogate Area"  of  Unicode,  of
       which  the Unicode Standard says this: "The Low Surrogate Area does not
       contain any  character  assignments,  consequently  no  character  code
       charts or namelists are provided for this area. Surrogates are reserved
       for use with UTF-16 and then must be used in pairs."  The  code  points
       that  are  encoded  by  UTF-16  pairs are available as independent code
       points in the UTF-8 encoding. (In  other  words,  the  whole  surrogate
       thing is a fudge for UTF-16 which unfortunately messes up UTF-8.)

       If  an  invalid  UTF-8  string  is  passed  to  PCRE,  an  error return
       (PCRE_ERROR_BADUTF8) is given. In some situations, you may already know
       that your strings are valid, and therefore want to skip these checks in
       order to improve performance. If you set the PCRE_NO_UTF8_CHECK flag at
       compile  time  or at run time, PCRE assumes that the pattern or subject
       it is given (respectively) contains only valid  UTF-8  codes.  In  this
       case, it does not diagnose an invalid UTF-8 string.

       If  you  pass  an  invalid UTF-8 string when PCRE_NO_UTF8_CHECK is set,
       what happens depends on why the string is invalid. If the  string  con-
       forms to the "old" definition of UTF-8 (RFC 2279), it is processed as a
       string of characters in the range 0  to  0x7FFFFFFF.  In  other  words,
       apart from the initial validity test, PCRE (when in UTF-8 mode) handles
       strings according to the more liberal rules of RFC  2279.  However,  if
       the  string does not even conform to RFC 2279, the result is undefined.
       Your program may crash.

       If you want to process strings  of  values  in  the  full  range  0  to
       0x7FFFFFFF,  encoded in a UTF-8-like manner as per the old RFC, you can
       set PCRE_NO_UTF8_CHECK to bypass the more restrictive test. However, in
       this situation, you will have to apply your own validity check.

   General comments about UTF-8 mode

       1.  An  unbraced  hexadecimal  escape sequence (such as \xb3) matches a
       two-byte UTF-8 character if the value is greater than 127.

       2. Octal numbers up to \777 are recognized, and  match  two-byte  UTF-8
       characters for values greater than \177.

       3.  Repeat quantifiers apply to complete UTF-8 characters, not to indi-
       vidual bytes, for example: \x{100}{3}.

       4. The dot metacharacter matches one UTF-8 character instead of a  sin-
       gle byte.

       5.  The  escape sequence \C can be used to match a single byte in UTF-8
       mode, but its use can lead to some strange effects.  This  facility  is
       not available in the alternative matching function, pcre_dfa_exec().

       6.  The  character escapes \b, \B, \d, \D, \s, \S, \w, and \W correctly
       test characters of any code value, but the characters that PCRE  recog-
       nizes  as  digits,  spaces,  or  word characters remain the same set as
       before, all with values less than 256. This remains true even when PCRE
       includes  Unicode  property support, because to do otherwise would slow
       down PCRE in many common cases. If you really want to test for a  wider
       sense  of,  say,  "digit",  you must use Unicode property tests such as
       \p{Nd}. Note that this also applies to \b, because  it  is  defined  in
       terms of \w and \W.

       7.  Similarly,  characters that match the POSIX named character classes
       are all low-valued characters.

       8. However, the Perl 5.10 horizontal and vertical  whitespace  matching
       escapes (\h, \H, \v, and \V) do match all the appropriate Unicode char-
       acters.

       9. Case-insensitive matching applies only to  characters  whose  values
       are  less than 128, unless PCRE is built with Unicode property support.
       Even when Unicode property support is available, PCRE  still  uses  its
       own  character  tables when checking the case of low-valued characters,
       so as not to degrade performance.  The Unicode property information  is
       used only for characters with higher values. Even when Unicode property
       support is available, PCRE supports case-insensitive matching only when
       there  is  a  one-to-one  mapping between a letter's cases. There are a
       small number of many-to-one mappings in Unicode;  these  are  not  sup-
       ported by PCRE.


AUTHOR

       Philip Hazel
       University Computing Service
       Cambridge CB2 3QH, England.

       Putting  an actual email address here seems to have been a spam magnet,
       so I've taken it away. If you want to email me, use  my  two  initials,
       followed by the two digits 10, at the domain cam.ac.uk.


REVISION

       Last updated: 01 March 2010
       Copyright (c) 1997-2010 University of Cambridge.
------------------------------------------------------------------------------


PCREBUILD(3)                                                      PCREBUILD(3)


NAME
       PCRE - Perl-compatible regular expressions


PCRE BUILD-TIME OPTIONS

       This  document  describes  the  optional  features  of PCRE that can be
       selected when the library is compiled. It assumes use of the  configure
       script,  where the optional features are selected or deselected by pro-
       viding options to configure before running the make  command.  However,
       the  same  options  can be selected in both Unix-like and non-Unix-like
       environments using the GUI facility of cmake-gui if you are using CMake
       instead of configure to build PCRE.

       There  is  a  lot more information about building PCRE in non-Unix-like
       environments in the file called NON_UNIX_USE, which is part of the PCRE
       distribution.  You  should consult this file as well as the README file
       if you are building in a non-Unix-like environment.

       The complete list of options for configure (which includes the standard
       ones  such  as  the  selection  of  the  installation directory) can be
       obtained by running

         ./configure --help

       The following sections include  descriptions  of  options  whose  names
       begin with --enable or --disable. These settings specify changes to the
       defaults for the configure command. Because of the way  that  configure
       works,  --enable  and --disable always come in pairs, so the complemen-
       tary option always exists as well, but as it specifies the default,  it
       is not described.


C++ SUPPORT

       By default, the configure script will search for a C++ compiler and C++
       header files. If it finds them, it automatically builds the C++ wrapper
       library for PCRE. You can disable this by adding

         --disable-cpp

       to the configure command.


UTF-8 SUPPORT

       To build PCRE with support for UTF-8 Unicode character strings, add

         --enable-utf8

       to  the  configure  command.  Of  itself, this does not make PCRE treat
       strings as UTF-8. As well as compiling PCRE with this option, you  also
       have  have to set the PCRE_UTF8 option when you call the pcre_compile()
       or pcre_compile2() functions.

       If you set --enable-utf8 when compiling in an EBCDIC environment,  PCRE
       expects its input to be either ASCII or UTF-8 (depending on the runtime
       option). It is not possible to support both EBCDIC and UTF-8  codes  in
       the  same  version  of  the  library.  Consequently,  --enable-utf8 and
       --enable-ebcdic are mutually exclusive.


UNICODE CHARACTER PROPERTY SUPPORT

       UTF-8 support allows PCRE to process character values greater than  255
       in  the  strings that it handles. On its own, however, it does not pro-
       vide any facilities for accessing the properties of such characters. If
       you  want  to  be able to use the pattern escapes \P, \p, and \X, which
       refer to Unicode character properties, you must add

         --enable-unicode-properties

       to the configure command. This implies UTF-8 support, even if you  have
       not explicitly requested it.

       Including  Unicode  property  support  adds around 30K of tables to the
       PCRE library. Only the general category properties such as  Lu  and  Nd
       are supported. Details are given in the pcrepattern documentation.


CODE VALUE OF NEWLINE

       By  default,  PCRE interprets the linefeed (LF) character as indicating
       the end of a line. This is the normal newline  character  on  Unix-like
       systems.  You  can compile PCRE to use carriage return (CR) instead, by
       adding

         --enable-newline-is-cr

       to the  configure  command.  There  is  also  a  --enable-newline-is-lf
       option, which explicitly specifies linefeed as the newline character.

       Alternatively, you can specify that line endings are to be indicated by
       the two character sequence CRLF. If you want this, add

         --enable-newline-is-crlf

       to the configure command. There is a fourth option, specified by

         --enable-newline-is-anycrlf

       which causes PCRE to recognize any of the three sequences  CR,  LF,  or
       CRLF as indicating a line ending. Finally, a fifth option, specified by

         --enable-newline-is-any

       causes PCRE to recognize any Unicode newline sequence.

       Whatever  line  ending convention is selected when PCRE is built can be
       overridden when the library functions are called. At build time  it  is
       conventional to use the standard for your operating system.


WHAT \R MATCHES

       By  default,  the  sequence \R in a pattern matches any Unicode newline
       sequence, whatever has been selected as the line  ending  sequence.  If
       you specify

         --enable-bsr-anycrlf

       the  default  is changed so that \R matches only CR, LF, or CRLF. What-
       ever is selected when PCRE is built can be overridden when the  library
       functions are called.


BUILDING SHARED AND STATIC LIBRARIES

       The  PCRE building process uses libtool to build both shared and static
       Unix libraries by default. You can suppress one of these by adding  one
       of

         --disable-shared
         --disable-static

       to the configure command, as required.


POSIX MALLOC USAGE

       When PCRE is called through the POSIX interface (see the pcreposix doc-
       umentation), additional working storage is  required  for  holding  the
       pointers  to capturing substrings, because PCRE requires three integers
       per substring, whereas the POSIX interface provides only  two.  If  the
       number of expected substrings is small, the wrapper function uses space
       on the stack, because this is faster than using malloc() for each call.
       The default threshold above which the stack is no longer used is 10; it
       can be changed by adding a setting such as

         --with-posix-malloc-threshold=20

       to the configure command.


HANDLING VERY LARGE PATTERNS

       Within a compiled pattern, offset values are used  to  point  from  one
       part  to another (for example, from an opening parenthesis to an alter-
       nation metacharacter). By default, two-byte values are used  for  these
       offsets,  leading  to  a  maximum size for a compiled pattern of around
       64K. This is sufficient to handle all but the most  gigantic  patterns.
       Nevertheless,  some  people do want to process truyl enormous patterns,
       so it is possible to compile PCRE to use three-byte or  four-byte  off-
       sets by adding a setting such as

         --with-link-size=3

       to  the  configure  command.  The value given must be 2, 3, or 4. Using
       longer offsets slows down the operation of PCRE because it has to  load
       additional bytes when handling them.


AVOIDING EXCESSIVE STACK USAGE

       When matching with the pcre_exec() function, PCRE implements backtrack-
       ing by making recursive calls to an internal function  called  match().
       In  environments  where  the size of the stack is limited, this can se-
       verely limit PCRE's operation. (The Unix environment does  not  usually
       suffer from this problem, but it may sometimes be necessary to increase
       the maximum stack size.  There is a discussion in the  pcrestack  docu-
       mentation.)  An alternative approach to recursion that uses memory from
       the heap to remember data, instead of using recursive  function  calls,
       has  been  implemented to work round the problem of limited stack size.
       If you want to build a version of PCRE that works this way, add

         --disable-stack-for-recursion

       to the configure command. With this configuration, PCRE  will  use  the
       pcre_stack_malloc  and pcre_stack_free variables to call memory manage-
       ment functions. By default these point to malloc() and free(), but  you
       can replace the pointers so that your own functions are used instead.

       Separate  functions  are  provided  rather  than  using pcre_malloc and
       pcre_free because the  usage  is  very  predictable:  the  block  sizes
       requested  are  always  the  same,  and  the blocks are always freed in
       reverse order. A calling program might be able to  implement  optimized
       functions  that  perform  better  than  malloc()  and free(). PCRE runs
       noticeably more slowly when built in this way. This option affects only
       the pcre_exec() function; it is not relevant for pcre_dfa_exec().


LIMITING PCRE RESOURCE USAGE

       Internally,  PCRE has a function called match(), which it calls repeat-
       edly  (sometimes  recursively)  when  matching  a  pattern   with   the
       pcre_exec()  function.  By controlling the maximum number of times this
       function may be called during a single matching operation, a limit  can
       be  placed  on  the resources used by a single call to pcre_exec(). The
       limit can be changed at run time, as described in the pcreapi  documen-
       tation.  The default is 10 million, but this can be changed by adding a
       setting such as

         --with-match-limit=500000

       to  the  configure  command.  This  setting  has  no  effect   on   the
       pcre_dfa_exec() matching function.

       In  some  environments  it is desirable to limit the depth of recursive
       calls of match() more strictly than the total number of calls, in order
       to  restrict  the maximum amount of stack (or heap, if --disable-stack-
       for-recursion is specified) that is used. A second limit controls this;
       it  defaults  to  the  value  that is set for --with-match-limit, which
       imposes no additional constraints. However, you can set a  lower  limit
       by adding, for example,

         --with-match-limit-recursion=10000

       to  the  configure  command.  This  value can also be overridden at run
       time.


CREATING CHARACTER TABLES AT BUILD TIME

       PCRE uses fixed tables for processing characters whose code values  are
       less  than 256. By default, PCRE is built with a set of tables that are
       distributed in the file pcre_chartables.c.dist. These  tables  are  for
       ASCII codes only. If you add

         --enable-rebuild-chartables

       to  the  configure  command, the distributed tables are no longer used.
       Instead, a program called dftables is compiled and  run.  This  outputs
       the source for new set of tables, created in the default locale of your
       C runtime system. (This method of replacing the tables does not work if
       you  are cross compiling, because dftables is run on the local host. If
       you need to create alternative tables when cross  compiling,  you  will
       have to do so "by hand".)


USING EBCDIC CODE

       PCRE  assumes  by  default that it will run in an environment where the
       character code is ASCII (or Unicode, which is  a  superset  of  ASCII).
       This  is  the  case for most computer operating systems. PCRE can, how-
       ever, be compiled to run in an EBCDIC environment by adding

         --enable-ebcdic

       to the configure command. This setting implies --enable-rebuild-charta-
       bles.  You  should  only  use  it if you know that you are in an EBCDIC
       environment (for example,  an  IBM  mainframe  operating  system).  The
       --enable-ebcdic option is incompatible with --enable-utf8.


PCREGREP OPTIONS FOR COMPRESSED FILE SUPPORT

       By default, pcregrep reads all files as plain text. You can build it so
       that it recognizes files whose names end in .gz or .bz2, and reads them
       with libz or libbz2, respectively, by adding one or both of

         --enable-pcregrep-libz
         --enable-pcregrep-libbz2

       to the configure command. These options naturally require that the rel-
       evant libraries are installed on your system. Configuration  will  fail
       if they are not.


PCRETEST OPTION FOR LIBREADLINE SUPPORT

       If you add

         --enable-pcretest-libreadline

       to  the  configure  command,  pcretest  is  linked with the libreadline
       library, and when its input is from a terminal, it reads it  using  the
       readline() function. This provides line-editing and history facilities.
       Note that libreadline is GPL-licensed, so if you distribute a binary of
       pcretest linked in this way, there may be licensing issues.

       Setting  this  option  causes  the -lreadline option to be added to the
       pcretest build. In many operating environments with  a  sytem-installed
       libreadline this is sufficient. However, in some environments (e.g.  if
       an unmodified distribution version of readline is in use),  some  extra
       configuration  may  be necessary. The INSTALL file for libreadline says
       this:

         "Readline uses the termcap functions, but does not link with the
         termcap or curses library itself, allowing applications which link
         with readline the to choose an appropriate library."

       If your environment has not been set up so that an appropriate  library
       is automatically included, you may need to add something like

         LIBS="-ncurses"

       immediately before the configure command.


SEE ALSO

       pcreapi(3), pcre_config(3).


AUTHOR

       Philip Hazel
       University Computing Service
       Cambridge CB2 3QH, England.


REVISION

       Last updated: 29 September 2009
       Copyright (c) 1997-2009 University of Cambridge.
------------------------------------------------------------------------------


PCREMATCHING(3)                                                PCREMATCHING(3)


NAME
       PCRE - Perl-compatible regular expressions


PCRE MATCHING ALGORITHMS

       This document describes the two different algorithms that are available
       in PCRE for matching a compiled regular expression against a given sub-
       ject  string.  The  "standard"  algorithm  is  the  one provided by the
       pcre_exec() function.  This works in the same was  as  Perl's  matching
       function, and provides a Perl-compatible matching operation.

       An  alternative  algorithm is provided by the pcre_dfa_exec() function;
       this operates in a different way, and is not  Perl-compatible.  It  has
       advantages  and disadvantages compared with the standard algorithm, and
       these are described below.

       When there is only one possible way in which a given subject string can
       match  a pattern, the two algorithms give the same answer. A difference
       arises, however, when there are multiple possibilities. For example, if
       the pattern

         ^<.*>

       is matched against the string

         <something> <something else> <something further>

       there are three possible answers. The standard algorithm finds only one
       of them, whereas the alternative algorithm finds all three.


REGULAR EXPRESSIONS AS TREES

       The set of strings that are matched by a regular expression can be rep-
       resented  as  a  tree structure. An unlimited repetition in the pattern
       makes the tree of infinite size, but it is still a tree.  Matching  the
       pattern  to a given subject string (from a given starting point) can be
       thought of as a search of the tree.  There are two  ways  to  search  a
       tree:  depth-first  and  breadth-first, and these correspond to the two
       matching algorithms provided by PCRE.


THE STANDARD MATCHING ALGORITHM

       In the terminology of Jeffrey Friedl's book "Mastering Regular  Expres-
       sions",  the  standard  algorithm  is an "NFA algorithm". It conducts a
       depth-first search of the pattern tree. That is, it  proceeds  along  a
       single path through the tree, checking that the subject matches what is
       required. When there is a mismatch, the algorithm  tries  any  alterna-
       tives  at  the  current point, and if they all fail, it backs up to the
       previous branch point in the  tree,  and  tries  the  next  alternative
       branch  at  that  level.  This often involves backing up (moving to the
       left) in the subject string as well.  The  order  in  which  repetition
       branches  are  tried  is controlled by the greedy or ungreedy nature of
       the quantifier.

       If a leaf node is reached, a matching string has  been  found,  and  at
       that  point the algorithm stops. Thus, if there is more than one possi-
       ble match, this algorithm returns the first one that it finds.  Whether
       this  is the shortest, the longest, or some intermediate length depends
       on the way the greedy and ungreedy repetition quantifiers are specified
       in the pattern.

       Because  it  ends  up  with a single path through the tree, it is rela-
       tively straightforward for this algorithm to keep  track  of  the  sub-
       strings  that  are  matched  by portions of the pattern in parentheses.
       This provides support for capturing parentheses and back references.


THE ALTERNATIVE MATCHING ALGORITHM

       This algorithm conducts a breadth-first search of  the  tree.  Starting
       from  the  first  matching  point  in the subject, it scans the subject
       string from left to right, once, character by character, and as it does
       this,  it remembers all the paths through the tree that represent valid
       matches. In Friedl's terminology, this is a kind  of  "DFA  algorithm",
       though  it is not implemented as a traditional finite state machine (it
       keeps multiple states active simultaneously).

       Although the general principle of this matching algorithm  is  that  it
       scans  the subject string only once, without backtracking, there is one
       exception: when a lookaround assertion is encountered,  the  characters
       following  or  preceding  the  current  point  have to be independently
       inspected.

       The scan continues until either the end of the subject is  reached,  or
       there  are  no more unterminated paths. At this point, terminated paths
       represent the different matching possibilities (if there are none,  the
       match  has  failed).   Thus,  if there is more than one possible match,
       this algorithm finds all of them, and in particular, it finds the long-
       est.  There  is  an  option to stop the algorithm after the first match
       (which is necessarily the shortest) is found.

       Note that all the matches that are found start at the same point in the
       subject. If the pattern

         cat(er(pillar)?)

       is  matched  against the string "the caterpillar catchment", the result
       will be the three strings "cat", "cater", and "caterpillar" that  start
       at the fourth character of the subject. The algorithm does not automat-
       ically move on to find matches that start at later positions.

       There are a number of features of PCRE regular expressions that are not
       supported by the alternative matching algorithm. They are as follows:

       1.  Because  the  algorithm  finds  all possible matches, the greedy or
       ungreedy nature of repetition quantifiers is not relevant.  Greedy  and
       ungreedy quantifiers are treated in exactly the same way. However, pos-
       sessive quantifiers can make a difference when what follows could  also
       match what is quantified, for example in a pattern like this:

         ^a++\w!

       This  pattern matches "aaab!" but not "aaa!", which would be matched by
       a non-possessive quantifier. Similarly, if an atomic group is  present,
       it  is matched as if it were a standalone pattern at the current point,
       and the longest match is then "locked in" for the rest of  the  overall
       pattern.

       2. When dealing with multiple paths through the tree simultaneously, it
       is not straightforward to keep track of  captured  substrings  for  the
       different  matching  possibilities,  and  PCRE's implementation of this
       algorithm does not attempt to do this. This means that no captured sub-
       strings are available.

       3.  Because no substrings are captured, back references within the pat-
       tern are not supported, and cause errors if encountered.

       4. For the same reason, conditional expressions that use  a  backrefer-
       ence  as  the  condition or test for a specific group recursion are not
       supported.

       5. Because many paths through the tree may be  active,  the  \K  escape
       sequence, which resets the start of the match when encountered (but may
       be on some paths and not on others), is not  supported.  It  causes  an
       error if encountered.

       6.  Callouts  are  supported, but the value of the capture_top field is
       always 1, and the value of the capture_last field is always -1.

       7. The \C escape sequence, which (in the standard algorithm) matches  a
       single  byte, even in UTF-8 mode, is not supported because the alterna-
       tive algorithm moves through the subject  string  one  character  at  a
       time, for all active paths through the tree.

       8.  Except for (*FAIL), the backtracking control verbs such as (*PRUNE)
       are not supported. (*FAIL) is supported, and  behaves  like  a  failing
       negative assertion.


ADVANTAGES OF THE ALTERNATIVE ALGORITHM

       Using  the alternative matching algorithm provides the following advan-
       tages:

       1. All possible matches (at a single point in the subject) are automat-
       ically  found,  and  in particular, the longest match is found. To find
       more than one match using the standard algorithm, you have to do kludgy
       things with callouts.

       2.  Because  the  alternative  algorithm  scans the subject string just
       once, and never needs to backtrack, it is possible to  pass  very  long
       subject  strings  to  the matching function in several pieces, checking
       for partial matching each time.  The  pcrepartial  documentation  gives
       details of partial matching.


DISADVANTAGES OF THE ALTERNATIVE ALGORITHM

       The alternative algorithm suffers from a number of disadvantages:

       1.  It  is  substantially  slower  than the standard algorithm. This is
       partly because it has to search for all possible matches, but  is  also
       because it is less susceptible to optimization.

       2. Capturing parentheses and back references are not supported.

       3. Although atomic groups are supported, their use does not provide the
       performance advantage that it does for the standard algorithm.


AUTHOR

       Philip Hazel
       University Computing Service
       Cambridge CB2 3QH, England.


REVISION

       Last updated: 29 September 2009
       Copyright (c) 1997-2009 University of Cambridge.
------------------------------------------------------------------------------


PCREAPI(3)                                                          PCREAPI(3)


NAME
       PCRE - Perl-compatible regular expressions


PCRE NATIVE API

       #include <pcre.h>

       pcre *pcre_compile(const char *pattern, int options,
            const char **errptr, int *erroffset,
            const unsigned char *tableptr);

       pcre *pcre_compile2(const char *pattern, int options,
            int *errorcodeptr,
            const char **errptr, int *erroffset,
            const unsigned char *tableptr);

       pcre_extra *pcre_study(const pcre *code, int options,
            const char **errptr);

       int pcre_exec(const pcre *code, const pcre_extra *extra,
            const char *subject, int length, int startoffset,
            int options, int *ovector, int ovecsize);

       int pcre_dfa_exec(const pcre *code, const pcre_extra *extra,
            const char *subject, int length, int startoffset,
            int options, int *ovector, int ovecsize,
            int *workspace, int wscount);

       int pcre_copy_named_substring(const pcre *code,
            const char *subject, int *ovector,
            int stringcount, const char *stringname,
            char *buffer, int buffersize);

       int pcre_copy_substring(const char *subject, int *ovector,
            int stringcount, int stringnumber, char *buffer,
            int buffersize);

       int pcre_get_named_substring(const pcre *code,
            const char *subject, int *ovector,
            int stringcount, const char *stringname,
            const char **stringptr);

       int pcre_get_stringnumber(const pcre *code,
            const char *name);

       int pcre_get_stringtable_entries(const pcre *code,
            const char *name, char **first, char **last);

       int pcre_get_substring(const char *subject, int *ovector,
            int stringcount, int stringnumber,
            const char **stringptr);

       int pcre_get_substring_list(const char *subject,
            int *ovector, int stringcount, const char ***listptr);

       void pcre_free_substring(const char *stringptr);

       void pcre_free_substring_list(const char **stringptr);

       const unsigned char *pcre_maketables(void);

       int pcre_fullinfo(const pcre *code, const pcre_extra *extra,
            int what, void *where);

       int pcre_info(const pcre *code, int *optptr, int *firstcharptr);

       int pcre_refcount(pcre *code, int adjust);

       int pcre_config(int what, void *where);

       char *pcre_version(void);

       void *(*pcre_malloc)(size_t);

       void (*pcre_free)(void *);

       void *(*pcre_stack_malloc)(size_t);

       void (*pcre_stack_free)(void *);

       int (*pcre_callout)(pcre_callout_block *);


PCRE API OVERVIEW

       PCRE has its own native API, which is described in this document. There
       are also some wrapper functions that correspond to  the  POSIX  regular
       expression  API.  These  are  described in the pcreposix documentation.
       Both of these APIs define a set of C function calls. A C++  wrapper  is
       distributed with PCRE. It is documented in the pcrecpp page.

       The  native  API  C  function prototypes are defined in the header file
       pcre.h, and on Unix systems the library itself is called  libpcre.   It
       can normally be accessed by adding -lpcre to the command for linking an
       application  that  uses  PCRE.  The  header  file  defines  the  macros
       PCRE_MAJOR  and  PCRE_MINOR to contain the major and minor release num-
       bers for the library.  Applications can use these  to  include  support
       for different releases of PCRE.

       The   functions   pcre_compile(),  pcre_compile2(),  pcre_study(),  and
       pcre_exec() are used for compiling and matching regular expressions  in
       a  Perl-compatible  manner. A sample program that demonstrates the sim-
       plest way of using them is provided in the file  called  pcredemo.c  in
       the PCRE source distribution. A listing of this program is given in the
       pcredemo documentation, and the pcresample documentation describes  how
       to compile and run it.

       A second matching function, pcre_dfa_exec(), which is not Perl-compati-
       ble, is also provided. This uses a different algorithm for  the  match-
       ing.  The  alternative algorithm finds all possible matches (at a given
       point in the subject), and scans the subject just  once  (unless  there
       are  lookbehind  assertions).  However,  this algorithm does not return
       captured substrings. A description of the two matching  algorithms  and
       their  advantages  and disadvantages is given in the pcrematching docu-
       mentation.

       In addition to the main compiling and  matching  functions,  there  are
       convenience functions for extracting captured substrings from a subject
       string that is matched by pcre_exec(). They are:

         pcre_copy_substring()
         pcre_copy_named_substring()
         pcre_get_substring()
         pcre_get_named_substring()
         pcre_get_substring_list()
         pcre_get_stringnumber()
         pcre_get_stringtable_entries()

       pcre_free_substring() and pcre_free_substring_list() are also provided,
       to free the memory used for extracted strings.

       The  function  pcre_maketables()  is  used  to build a set of character
       tables  in  the  current  locale   for   passing   to   pcre_compile(),
       pcre_exec(),  or  pcre_dfa_exec(). This is an optional facility that is
       provided for specialist use.  Most  commonly,  no  special  tables  are
       passed,  in  which case internal tables that are generated when PCRE is
       built are used.

       The function pcre_fullinfo() is used to find out  information  about  a
       compiled  pattern; pcre_info() is an obsolete version that returns only
       some of the available information, but is retained for  backwards  com-
       patibility.   The function pcre_version() returns a pointer to a string
       containing the version of PCRE and its date of release.

       The function pcre_refcount() maintains a  reference  count  in  a  data
       block  containing  a compiled pattern. This is provided for the benefit
       of object-oriented applications.

       The global variables pcre_malloc and pcre_free  initially  contain  the
       entry  points  of  the  standard malloc() and free() functions, respec-
       tively. PCRE calls the memory management functions via these variables,
       so  a  calling  program  can replace them if it wishes to intercept the
       calls. This should be done before calling any PCRE functions.

       The global variables pcre_stack_malloc  and  pcre_stack_free  are  also
       indirections  to  memory  management functions. These special functions
       are used only when PCRE is compiled to use  the  heap  for  remembering
       data, instead of recursive function calls, when running the pcre_exec()
       function. See the pcrebuild documentation for  details  of  how  to  do
       this.  It  is  a non-standard way of building PCRE, for use in environ-
       ments that have limited stacks. Because of the greater  use  of  memory
       management,  it  runs  more  slowly. Separate functions are provided so
       that special-purpose external code can be  used  for  this  case.  When
       used,  these  functions  are always called in a stack-like manner (last
       obtained, first freed), and always for memory blocks of the same  size.
       There  is  a discussion about PCRE's stack usage in the pcrestack docu-
       mentation.

       The global variable pcre_callout initially contains NULL. It can be set
       by  the  caller  to  a "callout" function, which PCRE will then call at
       specified points during a matching operation. Details are given in  the
       pcrecallout documentation.


NEWLINES

       PCRE  supports five different conventions for indicating line breaks in
       strings: a single CR (carriage return) character, a  single  LF  (line-
       feed) character, the two-character sequence CRLF, any of the three pre-
       ceding, or any Unicode newline sequence. The Unicode newline  sequences
       are  the  three just mentioned, plus the single characters VT (vertical
       tab, U+000B), FF (formfeed, U+000C), NEL (next line, U+0085), LS  (line
       separator, U+2028), and PS (paragraph separator, U+2029).

       Each  of  the first three conventions is used by at least one operating
       system as its standard newline sequence. When PCRE is built, a  default
       can  be  specified.  The default default is LF, which is the Unix stan-
       dard. When PCRE is run, the default can be overridden,  either  when  a
       pattern is compiled, or when it is matched.

       At compile time, the newline convention can be specified by the options
       argument of pcre_compile(), or it can be specified by special  text  at
       the start of the pattern itself; this overrides any other settings. See
       the pcrepattern page for details of the special character sequences.

       In the PCRE documentation the word "newline" is used to mean "the char-
       acter  or pair of characters that indicate a line break". The choice of
       newline convention affects the handling of  the  dot,  circumflex,  and
       dollar metacharacters, the handling of #-comments in /x mode, and, when
       CRLF is a recognized line ending sequence, the match position  advance-
       ment for a non-anchored pattern. There is more detail about this in the
       section on pcre_exec() options below.

       The choice of newline convention does not affect the interpretation  of
       the  \n  or  \r  escape  sequences, nor does it affect what \R matches,
       which is controlled in a similar way, but by separate options.


MULTITHREADING

       The PCRE functions can be used in  multi-threading  applications,  with
       the  proviso  that  the  memory  management  functions  pointed  to  by
       pcre_malloc, pcre_free, pcre_stack_malloc, and pcre_stack_free, and the
       callout function pointed to by pcre_callout, are shared by all threads.

       The  compiled form of a regular expression is not altered during match-
       ing, so the same compiled pattern can safely be used by several threads
       at once.


SAVING PRECOMPILED PATTERNS FOR LATER USE

       The compiled form of a regular expression can be saved and re-used at a
       later time, possibly by a different program, and even on a  host  other
       than  the  one  on  which  it  was  compiled.  Details are given in the
       pcreprecompile documentation. However, compiling a  regular  expression
       with  one version of PCRE for use with a different version is not guar-
       anteed to work and may cause crashes.


CHECKING BUILD-TIME OPTIONS

       int pcre_config(int what, void *where);

       The function pcre_config() makes it possible for a PCRE client to  dis-
       cover which optional features have been compiled into the PCRE library.
       The pcrebuild documentation has more details about these optional  fea-
       tures.

       The  first  argument  for pcre_config() is an integer, specifying which
       information is required; the second argument is a pointer to a variable
       into  which  the  information  is  placed. The following information is
       available:

         PCRE_CONFIG_UTF8

       The output is an integer that is set to one if UTF-8 support is  avail-
       able; otherwise it is set to zero.

         PCRE_CONFIG_UNICODE_PROPERTIES

       The  output  is  an  integer  that is set to one if support for Unicode
       character properties is available; otherwise it is set to zero.

         PCRE_CONFIG_NEWLINE

       The output is an integer whose value specifies  the  default  character
       sequence  that is recognized as meaning "newline". The four values that
       are supported are: 10 for LF, 13 for CR, 3338 for CRLF, -2 for ANYCRLF,
       and  -1  for  ANY.  Though they are derived from ASCII, the same values
       are returned in EBCDIC environments. The default should normally corre-
       spond to the standard sequence for your operating system.

         PCRE_CONFIG_BSR

       The output is an integer whose value indicates what character sequences
       the \R escape sequence matches by default. A value of 0 means  that  \R
       matches  any  Unicode  line ending sequence; a value of 1 means that \R
       matches only CR, LF, or CRLF. The default can be overridden when a pat-
       tern is compiled or matched.

         PCRE_CONFIG_LINK_SIZE

       The  output  is  an  integer that contains the number of bytes used for
       internal linkage in compiled regular expressions. The value is 2, 3, or
       4.  Larger  values  allow larger regular expressions to be compiled, at
       the expense of slower matching. The default value of  2  is  sufficient
       for  all  but  the  most massive patterns, since it allows the compiled
       pattern to be up to 64K in size.

         PCRE_CONFIG_POSIX_MALLOC_THRESHOLD

       The output is an integer that contains the threshold  above  which  the
       POSIX  interface  uses malloc() for output vectors. Further details are
       given in the pcreposix documentation.

         PCRE_CONFIG_MATCH_LIMIT

       The output is a long integer that gives the default limit for the  num-
       ber  of  internal  matching  function calls in a pcre_exec() execution.
       Further details are given with pcre_exec() below.

         PCRE_CONFIG_MATCH_LIMIT_RECURSION

       The output is a long integer that gives the default limit for the depth
       of   recursion  when  calling  the  internal  matching  function  in  a
       pcre_exec() execution.  Further  details  are  given  with  pcre_exec()
       below.

         PCRE_CONFIG_STACKRECURSE

       The  output is an integer that is set to one if internal recursion when
       running pcre_exec() is implemented by recursive function calls that use
       the  stack  to remember their state. This is the usual way that PCRE is
       compiled. The output is zero if PCRE was compiled to use blocks of data
       on  the  heap  instead  of  recursive  function  calls.  In  this case,
       pcre_stack_malloc and  pcre_stack_free  are  called  to  manage  memory
       blocks on the heap, thus avoiding the use of the stack.


COMPILING A PATTERN

       pcre *pcre_compile(const char *pattern, int options,
            const char **errptr, int *erroffset,
            const unsigned char *tableptr);

       pcre *pcre_compile2(const char *pattern, int options,
            int *errorcodeptr,
            const char **errptr, int *erroffset,
            const unsigned char *tableptr);

       Either of the functions pcre_compile() or pcre_compile2() can be called
       to compile a pattern into an internal form. The only difference between
       the  two interfaces is that pcre_compile2() has an additional argument,
       errorcodeptr, via which a numerical error  code  can  be  returned.  To
       avoid  too  much repetition, we refer just to pcre_compile() below, but
       the information applies equally to pcre_compile2().

       The pattern is a C string terminated by a binary zero, and is passed in
       the  pattern  argument.  A  pointer to a single block of memory that is
       obtained via pcre_malloc is returned. This contains the  compiled  code
       and related data. The pcre type is defined for the returned block; this
       is a typedef for a structure whose contents are not externally defined.
       It is up to the caller to free the memory (via pcre_free) when it is no
       longer required.

       Although the compiled code of a PCRE regex is relocatable, that is,  it
       does not depend on memory location, the complete pcre data block is not
       fully relocatable, because it may contain a copy of the tableptr  argu-
       ment, which is an address (see below).

       The options argument contains various bit settings that affect the com-
       pilation. It should be zero if no options are required.  The  available
       options  are  described  below. Some of them (in particular, those that
       are compatible with Perl, but some others as well) can also be set  and
       unset  from  within  the  pattern  (see the detailed description in the
       pcrepattern documentation). For those options that can be different  in
       different  parts  of  the pattern, the contents of the options argument
       specifies their settings at the start of compilation and execution. The
       PCRE_ANCHORED, PCRE_BSR_xxx, and PCRE_NEWLINE_xxx options can be set at
       the time of matching as well as at compile time.

       If errptr is NULL, pcre_compile() returns NULL immediately.  Otherwise,
       if  compilation  of  a  pattern fails, pcre_compile() returns NULL, and
       sets the variable pointed to by errptr to point to a textual error mes-
       sage. This is a static string that is part of the library. You must not
       try to free it. The byte offset from the start of the  pattern  to  the
       character  that  was  being  processed when the error was discovered is
       placed in the variable pointed to by erroffset, which must not be NULL.
       If  it  is,  an  immediate error is given. Some errors are not detected
       until checks are carried out when the whole pattern has  been  scanned;
       in this case the offset is set to the end of the pattern.

       If  pcre_compile2()  is  used instead of pcre_compile(), and the error-
       codeptr argument is not NULL, a non-zero error code number is  returned
       via  this argument in the event of an error. This is in addition to the
       textual error message. Error codes and messages are listed below.

       If the final argument, tableptr, is NULL, PCRE uses a  default  set  of
       character  tables  that  are  built  when  PCRE  is compiled, using the
       default C locale. Otherwise, tableptr must be an address  that  is  the
       result  of  a  call to pcre_maketables(). This value is stored with the
       compiled pattern, and used again by pcre_exec(), unless  another  table
       pointer is passed to it. For more discussion, see the section on locale
       support below.

       This code fragment shows a typical straightforward  call  to  pcre_com-
       pile():

         pcre *re;
         const char *error;
         int erroffset;
         re = pcre_compile(
           "^A.*Z",          /* the pattern */
           0,                /* default options */
           &error,           /* for error message */
           &erroffset,       /* for error offset */
           NULL);            /* use default character tables */

       The  following  names  for option bits are defined in the pcre.h header
       file:

         PCRE_ANCHORED

       If this bit is set, the pattern is forced to be "anchored", that is, it
       is  constrained to match only at the first matching point in the string
       that is being searched (the "subject string"). This effect can also  be
       achieved  by appropriate constructs in the pattern itself, which is the
       only way to do it in Perl.

         PCRE_AUTO_CALLOUT

       If this bit is set, pcre_compile() automatically inserts callout items,
       all  with  number  255, before each pattern item. For discussion of the
       callout facility, see the pcrecallout documentation.

         PCRE_BSR_ANYCRLF
         PCRE_BSR_UNICODE

       These options (which are mutually exclusive) control what the \R escape
       sequence  matches.  The choice is either to match only CR, LF, or CRLF,
       or to match any Unicode newline sequence. The default is specified when
       PCRE is built. It can be overridden from within the pattern, or by set-
       ting an option when a compiled pattern is matched.

         PCRE_CASELESS

       If this bit is set, letters in the pattern match both upper  and  lower
       case  letters.  It  is  equivalent  to  Perl's /i option, and it can be
       changed within a pattern by a (?i) option setting. In UTF-8 mode,  PCRE
       always  understands the concept of case for characters whose values are
       less than 128, so caseless matching is always possible. For  characters
       with  higher  values,  the concept of case is supported if PCRE is com-
       piled with Unicode property support, but not otherwise. If you want  to
       use  caseless  matching  for  characters 128 and above, you must ensure
       that PCRE is compiled with Unicode property support  as  well  as  with
       UTF-8 support.

         PCRE_DOLLAR_ENDONLY

       If  this bit is set, a dollar metacharacter in the pattern matches only
       at the end of the subject string. Without this option,  a  dollar  also
       matches  immediately before a newline at the end of the string (but not
       before any other newlines). The PCRE_DOLLAR_ENDONLY option  is  ignored
       if  PCRE_MULTILINE  is  set.   There is no equivalent to this option in
       Perl, and no way to set it within a pattern.

         PCRE_DOTALL

       If this bit is set, a dot metacharater in the pattern matches all char-
       acters,  including  those that indicate newline. Without it, a dot does
       not match when the current position is at a  newline.  This  option  is
       equivalent  to Perl's /s option, and it can be changed within a pattern
       by a (?s) option setting. A negative class such as [^a] always  matches
       newline characters, independent of the setting of this option.

         PCRE_DUPNAMES

       If  this  bit is set, names used to identify capturing subpatterns need
       not be unique. This can be helpful for certain types of pattern when it
       is  known  that  only  one instance of the named subpattern can ever be
       matched. There are more details of named subpatterns  below;  see  also
       the pcrepattern documentation.

         PCRE_EXTENDED

       If  this  bit  is  set,  whitespace  data characters in the pattern are
       totally ignored except when escaped or inside a character class. White-
       space does not include the VT character (code 11). In addition, charac-
       ters between an unescaped # outside a character class and the next new-
       line,  inclusive,  are  also  ignored.  This is equivalent to Perl's /x
       option, and it can be changed within a pattern by a  (?x)  option  set-
       ting.

       This  option  makes  it possible to include comments inside complicated
       patterns.  Note, however, that this applies only  to  data  characters.
       Whitespace   characters  may  never  appear  within  special  character
       sequences in a pattern, for  example  within  the  sequence  (?(  which
       introduces a conditional subpattern.

         PCRE_EXTRA

       This  option  was invented in order to turn on additional functionality
       of PCRE that is incompatible with Perl, but it  is  currently  of  very
       little  use. When set, any backslash in a pattern that is followed by a
       letter that has no special meaning  causes  an  error,  thus  reserving
       these  combinations  for  future  expansion.  By default, as in Perl, a
       backslash followed by a letter with no special meaning is treated as  a
       literal.  (Perl can, however, be persuaded to give a warning for this.)
       There are at present no other features controlled by  this  option.  It
       can also be set by a (?X) option setting within a pattern.

         PCRE_FIRSTLINE

       If  this  option  is  set,  an  unanchored pattern is required to match
       before or at the first  newline  in  the  subject  string,  though  the
       matched text may continue over the newline.

         PCRE_JAVASCRIPT_COMPAT

       If this option is set, PCRE's behaviour is changed in some ways so that
       it is compatible with JavaScript rather than Perl. The changes  are  as
       follows:

       (1)  A  lone  closing square bracket in a pattern causes a compile-time
       error, because this is illegal in JavaScript (by default it is  treated
       as a data character). Thus, the pattern AB]CD becomes illegal when this
       option is set.

       (2) At run time, a back reference to an unset subpattern group  matches
       an  empty  string (by default this causes the current matching alterna-
       tive to fail). A pattern such as (\1)(a) succeeds when this  option  is
       set  (assuming  it can find an "a" in the subject), whereas it fails by
       default, for Perl compatibility.

         PCRE_MULTILINE

       By default, PCRE treats the subject string as consisting  of  a  single
       line  of characters (even if it actually contains newlines). The "start
       of line" metacharacter (^) matches only at the  start  of  the  string,
       while  the  "end  of line" metacharacter ($) matches only at the end of
       the string, or before a terminating newline (unless PCRE_DOLLAR_ENDONLY
       is set). This is the same as Perl.

       When  PCRE_MULTILINE  it  is set, the "start of line" and "end of line"
       constructs match immediately following or immediately  before  internal
       newlines  in  the  subject string, respectively, as well as at the very
       start and end. This is equivalent to Perl's /m option, and  it  can  be
       changed within a pattern by a (?m) option setting. If there are no new-
       lines in a subject string, or no occurrences of ^ or $  in  a  pattern,
       setting PCRE_MULTILINE has no effect.

         PCRE_NEWLINE_CR
         PCRE_NEWLINE_LF
         PCRE_NEWLINE_CRLF
         PCRE_NEWLINE_ANYCRLF
         PCRE_NEWLINE_ANY

       These  options  override the default newline definition that was chosen
       when PCRE was built. Setting the first or the second specifies  that  a
       newline  is  indicated  by a single character (CR or LF, respectively).
       Setting PCRE_NEWLINE_CRLF specifies that a newline is indicated by  the
       two-character  CRLF  sequence.  Setting  PCRE_NEWLINE_ANYCRLF specifies
       that any of the three preceding sequences should be recognized. Setting
       PCRE_NEWLINE_ANY  specifies that any Unicode newline sequence should be
       recognized. The Unicode newline sequences are the three just mentioned,
       plus  the  single  characters  VT (vertical tab, U+000B), FF (formfeed,
       U+000C), NEL (next line, U+0085), LS (line separator, U+2028),  and  PS
       (paragraph  separator,  U+2029).  The  last  two are recognized only in
       UTF-8 mode.

       The newline setting in the  options  word  uses  three  bits  that  are
       treated as a number, giving eight possibilities. Currently only six are
       used (default plus the five values above). This means that if  you  set
       more  than one newline option, the combination may or may not be sensi-
       ble. For example, PCRE_NEWLINE_CR with PCRE_NEWLINE_LF is equivalent to
       PCRE_NEWLINE_CRLF,  but other combinations may yield unused numbers and
       cause an error.

       The only time that a line break is specially recognized when  compiling
       a  pattern  is  if  PCRE_EXTENDED  is set, and an unescaped # outside a
       character class is encountered. This indicates  a  comment  that  lasts
       until  after the next line break sequence. In other circumstances, line
       break  sequences  are  treated  as  literal  data,   except   that   in
       PCRE_EXTENDED mode, both CR and LF are treated as whitespace characters
       and are therefore ignored.

       The newline option that is set at compile time becomes the default that
       is used for pcre_exec() and pcre_dfa_exec(), but it can be overridden.

         PCRE_NO_AUTO_CAPTURE

       If this option is set, it disables the use of numbered capturing paren-
       theses in the pattern. Any opening parenthesis that is not followed  by
       ?  behaves as if it were followed by ?: but named parentheses can still
       be used for capturing (and they acquire  numbers  in  the  usual  way).
       There is no equivalent of this option in Perl.

         PCRE_UNGREEDY

       This  option  inverts  the "greediness" of the quantifiers so that they
       are not greedy by default, but become greedy if followed by "?". It  is
       not  compatible  with Perl. It can also be set by a (?U) option setting
       within the pattern.

         PCRE_UTF8

       This option causes PCRE to regard both the pattern and the  subject  as
       strings  of  UTF-8 characters instead of single-byte character strings.
       However, it is available only when PCRE is built to include UTF-8  sup-
       port.  If not, the use of this option provokes an error. Details of how
       this option changes the behaviour of PCRE are given in the  section  on
       UTF-8 support in the main pcre page.

         PCRE_NO_UTF8_CHECK

       When PCRE_UTF8 is set, the validity of the pattern as a UTF-8 string is
       automatically checked. There is a  discussion  about  the  validity  of
       UTF-8  strings  in  the main pcre page. If an invalid UTF-8 sequence of
       bytes is found, pcre_compile() returns an error. If  you  already  know
       that your pattern is valid, and you want to skip this check for perfor-
       mance reasons, you can set the PCRE_NO_UTF8_CHECK option.  When  it  is
       set,  the  effect  of  passing  an invalid UTF-8 string as a pattern is
       undefined. It may cause your program to crash. Note  that  this  option
       can  also be passed to pcre_exec() and pcre_dfa_exec(), to suppress the
       UTF-8 validity checking of subject strings.


COMPILATION ERROR CODES

       The following table lists the error  codes  than  may  be  returned  by
       pcre_compile2(),  along with the error messages that may be returned by
       both compiling functions. As PCRE has developed, some error codes  have
       fallen out of use. To avoid confusion, they have not been re-used.

          0  no error
          1  \ at end of pattern
          2  \c at end of pattern
          3  unrecognized character follows \
          4  numbers out of order in {} quantifier
          5  number too big in {} quantifier
          6  missing terminating ] for character class
          7  invalid escape sequence in character class
          8  range out of order in character class
          9  nothing to repeat
         10  [this code is not in use]
         11  internal error: unexpected repeat
         12  unrecognized character after (? or (?-
         13  POSIX named classes are supported only within a class
         14  missing )
         15  reference to non-existent subpattern
         16  erroffset passed as NULL
         17  unknown option bit(s) set
         18  missing ) after comment
         19  [this code is not in use]
         20  regular expression is too large
         21  failed to get memory
         22  unmatched parentheses
         23  internal error: code overflow
         24  unrecognized character after (?<
         25  lookbehind assertion is not fixed length
         26  malformed number or name after (?(
         27  conditional group contains more than two branches
         28  assertion expected after (?(
         29  (?R or (?[+-]digits must be followed by )
         30  unknown POSIX class name
         31  POSIX collating elements are not supported
         32  this version of PCRE is not compiled with PCRE_UTF8 support
         33  [this code is not in use]
         34  character value in \x{...} sequence is too large
         35  invalid condition (?(0)
         36  \C not allowed in lookbehind assertion
         37  PCRE does not support \L, \l, \N, \U, or \u
         38  number after (?C is > 255
         39  closing ) for (?C expected
         40  recursive call could loop indefinitely
         41  unrecognized character after (?P
         42  syntax error in subpattern name (missing terminator)
         43  two named subpatterns have the same name
         44  invalid UTF-8 string
         45  support for \P, \p, and \X has not been compiled
         46  malformed \P or \p sequence
         47  unknown property name after \P or \p
         48  subpattern name is too long (maximum 32 characters)
         49  too many named subpatterns (maximum 10000)
         50  [this code is not in use]
         51  octal value is greater than \377 (not in UTF-8 mode)
         52  internal error: overran compiling workspace
         53   internal  error:  previously-checked  referenced  subpattern not
       found
         54  DEFINE group contains more than one branch
         55  repeating a DEFINE group is not allowed
         56  inconsistent NEWLINE options
         57  \g is not followed by a braced, angle-bracketed, or quoted
               name/number or by a plain number
         58  a numbered reference must not be zero
         59  (*VERB) with an argument is not supported
         60  (*VERB) not recognized
         61  number is too big
         62  subpattern name expected
         63  digit expected after (?+
         64  ] is an invalid data character in JavaScript compatibility mode

       The numbers 32 and 10000 in errors 48 and 49  are  defaults;  different
       values may be used if the limits were changed when PCRE was built.


STUDYING A PATTERN

       pcre_extra *pcre_study(const pcre *code, int options
            const char **errptr);

       If  a  compiled  pattern is going to be used several times, it is worth
       spending more time analyzing it in order to speed up the time taken for
       matching.  The function pcre_study() takes a pointer to a compiled pat-
       tern as its first argument. If studying the pattern produces additional
       information  that  will  help speed up matching, pcre_study() returns a
       pointer to a pcre_extra block, in which the study_data field points  to
       the results of the study.

       The  returned  value  from  pcre_study()  can  be  passed  directly  to
       pcre_exec() or pcre_dfa_exec(). However, a pcre_extra block  also  con-
       tains  other  fields  that can be set by the caller before the block is
       passed; these are described below in the section on matching a pattern.

       If studying the  pattern  does  not  produce  any  useful  information,
       pcre_study() returns NULL. In that circumstance, if the calling program
       wants  to  pass  any  of   the   other   fields   to   pcre_exec()   or
       pcre_dfa_exec(), it must set up its own pcre_extra block.

       The  second  argument of pcre_study() contains option bits. At present,
       no options are defined, and this argument should always be zero.

       The third argument for pcre_study() is a pointer for an error  message.
       If  studying  succeeds  (even  if no data is returned), the variable it
       points to is set to NULL. Otherwise it is set to  point  to  a  textual
       error message. This is a static string that is part of the library. You
       must not try to free it. You should test the  error  pointer  for  NULL
       after calling pcre_study(), to be sure that it has run successfully.

       This is a typical call to pcre_study():

         pcre_extra *pe;
         pe = pcre_study(
           re,             /* result of pcre_compile() */
           0,              /* no options exist */
           &error);        /* set to NULL or points to a message */

       Studying a pattern does two things: first, a lower bound for the length
       of subject string that is needed to match the pattern is computed. This
       does not mean that there are any strings of that length that match, but
       it does guarantee that no shorter strings match. The value is  used  by
       pcre_exec()  and  pcre_dfa_exec()  to  avoid  wasting time by trying to
       match strings that are shorter than the lower bound. You can  find  out
       the value in a calling program via the pcre_fullinfo() function.

       Studying a pattern is also useful for non-anchored patterns that do not
       have a single fixed starting character. A bitmap of  possible  starting
       bytes  is  created. This speeds up finding a position in the subject at
       which to start matching.


LOCALE SUPPORT

       PCRE handles caseless matching, and determines whether  characters  are
       letters,  digits, or whatever, by reference to a set of tables, indexed
       by character value. When running in UTF-8 mode, this  applies  only  to
       characters  with  codes  less than 128. Higher-valued codes never match
       escapes such as \w or \d, but can be tested with \p if  PCRE  is  built
       with  Unicode  character property support. The use of locales with Uni-
       code is discouraged. If you are handling characters with codes  greater
       than  128, you should either use UTF-8 and Unicode, or use locales, but
       not try to mix the two.

       PCRE contains an internal set of tables that are used  when  the  final
       argument  of  pcre_compile()  is  NULL.  These  are sufficient for many
       applications.  Normally, the internal tables recognize only ASCII char-
       acters. However, when PCRE is built, it is possible to cause the inter-
       nal tables to be rebuilt in the default "C" locale of the local system,
       which may cause them to be different.

       The  internal tables can always be overridden by tables supplied by the
       application that calls PCRE. These may be created in a different locale
       from  the  default.  As more and more applications change to using Uni-
       code, the need for this locale support is expected to die away.

       External tables are built by calling  the  pcre_maketables()  function,
       which  has no arguments, in the relevant locale. The result can then be
       passed to pcre_compile() or pcre_exec()  as  often  as  necessary.  For
       example,  to  build  and use tables that are appropriate for the French
       locale (where accented characters with  values  greater  than  128  are
       treated as letters), the following code could be used:

         setlocale(LC_CTYPE, "fr_FR");
         tables = pcre_maketables();
         re = pcre_compile(..., tables);

       The  locale  name "fr_FR" is used on Linux and other Unix-like systems;
       if you are using Windows, the name for the French locale is "french".

       When pcre_maketables() runs, the tables are built  in  memory  that  is
       obtained  via  pcre_malloc. It is the caller's responsibility to ensure
       that the memory containing the tables remains available for as long  as
       it is needed.

       The pointer that is passed to pcre_compile() is saved with the compiled
       pattern, and the same tables are used via this pointer by  pcre_study()
       and normally also by pcre_exec(). Thus, by default, for any single pat-
       tern, compilation, studying and matching all happen in the same locale,
       but different patterns can be compiled in different locales.

       It  is  possible to pass a table pointer or NULL (indicating the use of
       the internal tables) to pcre_exec(). Although  not  intended  for  this
       purpose,  this facility could be used to match a pattern in a different
       locale from the one in which it was compiled. Passing table pointers at
       run time is discussed below in the section on matching a pattern.


INFORMATION ABOUT A PATTERN

       int pcre_fullinfo(const pcre *code, const pcre_extra *extra,
            int what, void *where);

       The  pcre_fullinfo() function returns information about a compiled pat-
       tern. It replaces the obsolete pcre_info() function, which is neverthe-
       less retained for backwards compability (and is documented below).

       The  first  argument  for  pcre_fullinfo() is a pointer to the compiled
       pattern. The second argument is the result of pcre_study(), or NULL  if
       the  pattern  was not studied. The third argument specifies which piece
       of information is required, and the fourth argument is a pointer  to  a
       variable  to  receive  the  data. The yield of the function is zero for
       success, or one of the following negative numbers:

         PCRE_ERROR_NULL       the argument code was NULL
                               the argument where was NULL
         PCRE_ERROR_BADMAGIC   the "magic number" was not found
         PCRE_ERROR_BADOPTION  the value of what was invalid

       The "magic number" is placed at the start of each compiled  pattern  as
       an  simple check against passing an arbitrary memory pointer. Here is a
       typical call of pcre_fullinfo(), to obtain the length of  the  compiled
       pattern:

         int rc;
         size_t length;
         rc = pcre_fullinfo(
           re,               /* result of pcre_compile() */
           pe,               /* result of pcre_study(), or NULL */
           PCRE_INFO_SIZE,   /* what is required */
           &length);         /* where to put the data */

       The  possible  values for the third argument are defined in pcre.h, and
       are as follows:

         PCRE_INFO_BACKREFMAX

       Return the number of the highest back reference  in  the  pattern.  The
       fourth  argument  should  point to an int variable. Zero is returned if
       there are no back references.

         PCRE_INFO_CAPTURECOUNT

       Return the number of capturing subpatterns in the pattern.  The  fourth
       argument should point to an int variable.

         PCRE_INFO_DEFAULT_TABLES

       Return  a pointer to the internal default character tables within PCRE.
       The fourth argument should point to an unsigned char *  variable.  This
       information call is provided for internal use by the pcre_study() func-
       tion. External callers can cause PCRE to use  its  internal  tables  by
       passing a NULL table pointer.

         PCRE_INFO_FIRSTBYTE

       Return  information  about  the first byte of any matched string, for a
       non-anchored pattern. The fourth argument should point to an int  vari-
       able.  (This option used to be called PCRE_INFO_FIRSTCHAR; the old name
       is still recognized for backwards compatibility.)

       If there is a fixed first byte, for example, from  a  pattern  such  as
       (cat|cow|coyote), its value is returned. Otherwise, if either

       (a)  the pattern was compiled with the PCRE_MULTILINE option, and every
       branch starts with "^", or

       (b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not
       set (if it were set, the pattern would be anchored),

       -1  is  returned, indicating that the pattern matches only at the start
       of a subject string or after any newline within the  string.  Otherwise
       -2 is returned. For anchored patterns, -2 is returned.

         PCRE_INFO_FIRSTTABLE

       If  the pattern was studied, and this resulted in the construction of a
       256-bit table indicating a fixed set of bytes for the first byte in any
       matching  string, a pointer to the table is returned. Otherwise NULL is
       returned. The fourth argument should point to an unsigned char *  vari-
       able.

         PCRE_INFO_HASCRORLF

       Return  1  if  the  pattern  contains any explicit matches for CR or LF
       characters, otherwise 0. The fourth argument should  point  to  an  int
       variable.  An explicit match is either a literal CR or LF character, or
       \r or \n.

         PCRE_INFO_JCHANGED

       Return 1 if the (?J) or (?-J) option setting is used  in  the  pattern,
       otherwise  0. The fourth argument should point to an int variable. (?J)
       and (?-J) set and unset the local PCRE_DUPNAMES option, respectively.

         PCRE_INFO_LASTLITERAL

       Return the value of the rightmost literal byte that must exist  in  any
       matched  string,  other  than  at  its  start,  if such a byte has been
       recorded. The fourth argument should point to an int variable. If there
       is  no such byte, -1 is returned. For anchored patterns, a last literal
       byte is recorded only if it follows something of variable  length.  For
       example, for the pattern /^a\d+z\d+/ the returned value is "z", but for
       /^a\dz\d/ the returned value is -1.

         PCRE_INFO_MINLENGTH

       If the pattern was studied and a minimum length  for  matching  subject
       strings  was  computed,  its  value is returned. Otherwise the returned
       value is -1. The value is a number of characters, not bytes  (this  may
       be  relevant in UTF-8 mode). The fourth argument should point to an int
       variable. A non-negative value is a lower bound to the  length  of  any
       matching  string.  There  may not be any strings of that length that do
       actually match, but every string that does match is at least that long.

         PCRE_INFO_NAMECOUNT
         PCRE_INFO_NAMEENTRYSIZE
         PCRE_INFO_NAMETABLE

       PCRE supports the use of named as well as numbered capturing  parenthe-
       ses.  The names are just an additional way of identifying the parenthe-
       ses, which still acquire numbers. Several convenience functions such as
       pcre_get_named_substring()  are  provided  for extracting captured sub-
       strings by name. It is also possible to extract the data  directly,  by
       first  converting  the  name to a number in order to access the correct
       pointers in the output vector (described with pcre_exec() below). To do
       the  conversion,  you  need  to  use  the  name-to-number map, which is
       described by these three values.

       The map consists of a number of fixed-size entries. PCRE_INFO_NAMECOUNT
       gives the number of entries, and PCRE_INFO_NAMEENTRYSIZE gives the size
       of each entry; both of these  return  an  int  value.  The  entry  size
       depends  on the length of the longest name. PCRE_INFO_NAMETABLE returns
       a pointer to the first entry of the table  (a  pointer  to  char).  The
       first two bytes of each entry are the number of the capturing parenthe-
       sis, most significant byte first. The rest of the entry is  the  corre-
       sponding name, zero terminated.

       The  names are in alphabetical order. Duplicate names may appear if (?|
       is used to create multiple groups with the same number, as described in
       the  section  on  duplicate subpattern numbers in the pcrepattern page.
       Duplicate names for subpatterns with different  numbers  are  permitted
       only  if  PCRE_DUPNAMES  is  set. In all cases of duplicate names, they
       appear in the table in the order in which they were found in  the  pat-
       tern.  In  the  absence  of (?| this is the order of increasing number;
       when (?| is used this is not necessarily the case because later subpat-
       terns may have lower numbers.

       As  a  simple  example of the name/number table, consider the following
       pattern (assume PCRE_EXTENDED is set, so white space -  including  new-
       lines - is ignored):

         (?<date> (?<year>(\d\d)?\d\d) -
         (?<month>\d\d) - (?<day>\d\d) )

       There  are  four  named subpatterns, so the table has four entries, and
       each entry in the table is eight bytes long. The table is  as  follows,
       with non-printing bytes shows in hexadecimal, and undefined bytes shown
       as ??:

         00 01 d  a  t  e  00 ??
         00 05 d  a  y  00 ?? ??
         00 04 m  o  n  t  h  00
         00 02 y  e  a  r  00 ??

       When writing code to extract data  from  named  subpatterns  using  the
       name-to-number  map,  remember that the length of the entries is likely
       to be different for each compiled pattern.

         PCRE_INFO_OKPARTIAL

       Return 1  if  the  pattern  can  be  used  for  partial  matching  with
       pcre_exec(),  otherwise  0.  The fourth argument should point to an int
       variable. From  release  8.00,  this  always  returns  1,  because  the
       restrictions  that  previously  applied  to  partial matching have been
       lifted. The pcrepartial documentation gives details of  partial  match-
       ing.

         PCRE_INFO_OPTIONS

       Return  a  copy of the options with which the pattern was compiled. The
       fourth argument should point to an unsigned long  int  variable.  These
       option bits are those specified in the call to pcre_compile(), modified
       by any top-level option settings at the start of the pattern itself. In
       other  words,  they are the options that will be in force when matching
       starts. For example, if the pattern /(?im)abc(?-i)d/ is  compiled  with
       the  PCRE_EXTENDED option, the result is PCRE_CASELESS, PCRE_MULTILINE,
       and PCRE_EXTENDED.

       A pattern is automatically anchored by PCRE if  all  of  its  top-level
       alternatives begin with one of the following:

         ^     unless PCRE_MULTILINE is set
         \A    always
         \G    always
         .*    if PCRE_DOTALL is set and there are no back
                 references to the subpattern in which .* appears

       For such patterns, the PCRE_ANCHORED bit is set in the options returned
       by pcre_fullinfo().

         PCRE_INFO_SIZE

       Return the size of the compiled pattern, that is, the  value  that  was
       passed as the argument to pcre_malloc() when PCRE was getting memory in
       which to place the compiled data. The fourth argument should point to a
       size_t variable.

         PCRE_INFO_STUDYSIZE

       Return the size of the data block pointed to by the study_data field in
       a pcre_extra block. That is,  it  is  the  value  that  was  passed  to
       pcre_malloc() when PCRE was getting memory into which to place the data
       created by pcre_study(). If pcre_extra is NULL, or there  is  no  study
       data,  zero  is  returned. The fourth argument should point to a size_t
       variable.


OBSOLETE INFO FUNCTION

       int pcre_info(const pcre *code, int *optptr, int *firstcharptr);

       The pcre_info() function is now obsolete because its interface  is  too
       restrictive  to return all the available data about a compiled pattern.
       New  programs  should  use  pcre_fullinfo()  instead.  The   yield   of
       pcre_info()  is the number of capturing subpatterns, or one of the fol-
       lowing negative numbers:

         PCRE_ERROR_NULL       the argument code was NULL
         PCRE_ERROR_BADMAGIC   the "magic number" was not found

       If the optptr argument is not NULL, a copy of the  options  with  which
       the  pattern  was  compiled  is placed in the integer it points to (see
       PCRE_INFO_OPTIONS above).

       If the pattern is not anchored and the  firstcharptr  argument  is  not
       NULL,  it is used to pass back information about the first character of
       any matched string (see PCRE_INFO_FIRSTBYTE above).


REFERENCE COUNTS

       int pcre_refcount(pcre *code, int adjust);

       The pcre_refcount() function is used to maintain a reference  count  in
       the data block that contains a compiled pattern. It is provided for the
       benefit of applications that  operate  in  an  object-oriented  manner,
       where different parts of the application may be using the same compiled
       pattern, but you want to free the block when they are all done.

       When a pattern is compiled, the reference count field is initialized to
       zero.   It is changed only by calling this function, whose action is to
       add the adjust value (which may be positive or  negative)  to  it.  The
       yield of the function is the new value. However, the value of the count
       is constrained to lie between 0 and 65535, inclusive. If the new  value
       is outside these limits, it is forced to the appropriate limit value.

       Except  when it is zero, the reference count is not correctly preserved
       if a pattern is compiled on one host and then  transferred  to  a  host
       whose byte-order is different. (This seems a highly unlikely scenario.)


MATCHING A PATTERN: THE TRADITIONAL FUNCTION

       int pcre_exec(const pcre *code, const pcre_extra *extra,
            const char *subject, int length, int startoffset,
            int options, int *ovector, int ovecsize);

       The  function pcre_exec() is called to match a subject string against a
       compiled pattern, which is passed in the code argument. If the  pattern
       was  studied,  the  result  of  the study should be passed in the extra
       argument. This function is the main matching facility of  the  library,
       and it operates in a Perl-like manner. For specialist use there is also
       an alternative matching function, which is described below in the  sec-
       tion about the pcre_dfa_exec() function.

       In  most applications, the pattern will have been compiled (and option-
       ally studied) in the same process that calls pcre_exec().  However,  it
       is possible to save compiled patterns and study data, and then use them
       later in different processes, possibly even on different hosts.  For  a
       discussion about this, see the pcreprecompile documentation.

       Here is an example of a simple call to pcre_exec():

         int rc;
         int ovector[30];
         rc = pcre_exec(
           re,             /* result of pcre_compile() */
           NULL,           /* we didn't study the pattern */
           "some string",  /* the subject string */
           11,             /* the length of the subject string */
           0,              /* start at offset 0 in the subject */
           0,              /* default options */
           ovector,        /* vector of integers for substring information */
           30);            /* number of elements (NOT size in bytes) */

   Extra data for pcre_exec()

       If  the  extra argument is not NULL, it must point to a pcre_extra data
       block. The pcre_study() function returns such a block (when it  doesn't
       return  NULL), but you can also create one for yourself, and pass addi-
       tional information in it. The pcre_extra block contains  the  following
       fields (not necessarily in this order):

         unsigned long int flags;
         void *study_data;
         unsigned long int match_limit;
         unsigned long int match_limit_recursion;
         void *callout_data;
         const unsigned char *tables;

       The  flags  field  is a bitmap that specifies which of the other fields
       are set. The flag bits are:

         PCRE_EXTRA_STUDY_DATA
         PCRE_EXTRA_MATCH_LIMIT
         PCRE_EXTRA_MATCH_LIMIT_RECURSION
         PCRE_EXTRA_CALLOUT_DATA
         PCRE_EXTRA_TABLES

       Other flag bits should be set to zero. The study_data field is  set  in
       the  pcre_extra  block  that is returned by pcre_study(), together with
       the appropriate flag bit. You should not set this yourself, but you may
       add  to  the  block by setting the other fields and their corresponding
       flag bits.

       The match_limit field provides a means of preventing PCRE from using up
       a  vast amount of resources when running patterns that are not going to
       match, but which have a very large number  of  possibilities  in  their
       search  trees. The classic example is a pattern that uses nested unlim-
       ited repeats.

       Internally, PCRE uses a function called match() which it calls  repeat-
       edly  (sometimes  recursively). The limit set by match_limit is imposed
       on the number of times this function is called during  a  match,  which
       has  the  effect  of  limiting the amount of backtracking that can take
       place. For patterns that are not anchored, the count restarts from zero
       for each position in the subject string.

       The  default  value  for  the  limit can be set when PCRE is built; the
       default default is 10 million, which handles all but the  most  extreme
       cases.  You  can  override  the  default by suppling pcre_exec() with a
       pcre_extra    block    in    which    match_limit    is    set,     and
       PCRE_EXTRA_MATCH_LIMIT  is  set  in  the  flags  field. If the limit is
       exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT.

       The match_limit_recursion field is similar to match_limit, but  instead
       of limiting the total number of times that match() is called, it limits
       the depth of recursion. The recursion depth is a  smaller  number  than
       the  total number of calls, because not all calls to match() are recur-
       sive.  This limit is of use only if it is set smaller than match_limit.

       Limiting the recursion depth limits the amount of  stack  that  can  be
       used, or, when PCRE has been compiled to use memory on the heap instead
       of the stack, the amount of heap memory that can be used.

       The default value for match_limit_recursion can be  set  when  PCRE  is
       built;  the  default  default  is  the  same  value  as the default for
       match_limit. You can override the default by suppling pcre_exec()  with
       a   pcre_extra   block  in  which  match_limit_recursion  is  set,  and
       PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in  the  flags  field.  If  the
       limit is exceeded, pcre_exec() returns PCRE_ERROR_RECURSIONLIMIT.

       The  callout_data  field is used in conjunction with the "callout" fea-
       ture, and is described in the pcrecallout documentation.

       The tables field  is  used  to  pass  a  character  tables  pointer  to
       pcre_exec();  this overrides the value that is stored with the compiled
       pattern. A non-NULL value is stored with the compiled pattern  only  if
       custom  tables  were  supplied to pcre_compile() via its tableptr argu-
       ment.  If NULL is passed to pcre_exec() using this mechanism, it forces
       PCRE's  internal  tables  to be used. This facility is helpful when re-
       using patterns that have been saved after compiling  with  an  external
       set  of  tables,  because  the  external tables might be at a different
       address when pcre_exec() is called. See the  pcreprecompile  documenta-
       tion for a discussion of saving compiled patterns for later use.

   Option bits for pcre_exec()

       The  unused  bits of the options argument for pcre_exec() must be zero.
       The only bits that may  be  set  are  PCRE_ANCHORED,  PCRE_NEWLINE_xxx,
       PCRE_NOTBOL,    PCRE_NOTEOL,    PCRE_NOTEMPTY,   PCRE_NOTEMPTY_ATSTART,
       PCRE_NO_START_OPTIMIZE,  PCRE_NO_UTF8_CHECK,   PCRE_PARTIAL_SOFT,   and
       PCRE_PARTIAL_HARD.

         PCRE_ANCHORED

       The  PCRE_ANCHORED  option  limits pcre_exec() to matching at the first
       matching position. If a pattern was  compiled  with  PCRE_ANCHORED,  or
       turned  out to be anchored by virtue of its contents, it cannot be made
       unachored at matching time.

         PCRE_BSR_ANYCRLF
         PCRE_BSR_UNICODE

       These options (which are mutually exclusive) control what the \R escape
       sequence  matches.  The choice is either to match only CR, LF, or CRLF,
       or to match any Unicode newline sequence. These  options  override  the
       choice that was made or defaulted when the pattern was compiled.

         PCRE_NEWLINE_CR
         PCRE_NEWLINE_LF
         PCRE_NEWLINE_CRLF
         PCRE_NEWLINE_ANYCRLF
         PCRE_NEWLINE_ANY

       These  options  override  the  newline  definition  that  was chosen or
       defaulted when the pattern was compiled. For details, see the  descrip-
       tion  of  pcre_compile()  above.  During  matching,  the newline choice
       affects the behaviour of the dot, circumflex,  and  dollar  metacharac-
       ters.  It may also alter the way the match position is advanced after a
       match failure for an unanchored pattern.

       When PCRE_NEWLINE_CRLF, PCRE_NEWLINE_ANYCRLF,  or  PCRE_NEWLINE_ANY  is
       set,  and a match attempt for an unanchored pattern fails when the cur-
       rent position is at a  CRLF  sequence,  and  the  pattern  contains  no
       explicit  matches  for  CR  or  LF  characters,  the  match position is
       advanced by two characters instead of one, in other words, to after the
       CRLF.

       The above rule is a compromise that makes the most common cases work as
       expected. For example, if the  pattern  is  .+A  (and  the  PCRE_DOTALL
       option is not set), it does not match the string "\r\nA" because, after
       failing at the start, it skips both the CR and the LF before  retrying.
       However,  the  pattern  [\r\n]A does match that string, because it con-
       tains an explicit CR or LF reference, and so advances only by one char-
       acter after the first failure.

       An explicit match for CR of LF is either a literal appearance of one of
       those characters, or one of the \r or  \n  escape  sequences.  Implicit
       matches  such  as [^X] do not count, nor does \s (which includes CR and
       LF in the characters that it matches).

       Notwithstanding the above, anomalous effects may still occur when  CRLF
       is a valid newline sequence and explicit \r or \n escapes appear in the
       pattern.

         PCRE_NOTBOL

       This option specifies that first character of the subject string is not
       the  beginning  of  a  line, so the circumflex metacharacter should not
       match before it. Setting this without PCRE_MULTILINE (at compile  time)
       causes  circumflex  never to match. This option affects only the behav-
       iour of the circumflex metacharacter. It does not affect \A.

         PCRE_NOTEOL

       This option specifies that the end of the subject string is not the end
       of  a line, so the dollar metacharacter should not match it nor (except
       in multiline mode) a newline immediately before it. Setting this  with-
       out PCRE_MULTILINE (at compile time) causes dollar never to match. This
       option affects only the behaviour of the dollar metacharacter. It  does
       not affect \Z or \z.

         PCRE_NOTEMPTY

       An empty string is not considered to be a valid match if this option is
       set. If there are alternatives in the pattern, they are tried.  If  all
       the  alternatives  match  the empty string, the entire match fails. For
       example, if the pattern

         a?b?

       is applied to a string not beginning with "a" or  "b",  it  matches  an
       empty  string at the start of the subject. With PCRE_NOTEMPTY set, this
       match is not valid, so PCRE searches further into the string for occur-
       rences of "a" or "b".

         PCRE_NOTEMPTY_ATSTART

       This  is  like PCRE_NOTEMPTY, except that an empty string match that is
       not at the start of  the  subject  is  permitted.  If  the  pattern  is
       anchored, such a match can occur only if the pattern contains \K.

       Perl     has    no    direct    equivalent    of    PCRE_NOTEMPTY    or
       PCRE_NOTEMPTY_ATSTART, but it does make a special  case  of  a  pattern
       match  of  the empty string within its split() function, and when using
       the /g modifier. It is  possible  to  emulate  Perl's  behaviour  after
       matching a null string by first trying the match again at the same off-
       set with PCRE_NOTEMPTY_ATSTART and  PCRE_ANCHORED,  and  then  if  that
       fails, by advancing the starting offset (see below) and trying an ordi-
       nary match again. There is some code that demonstrates how to  do  this
       in the pcredemo sample program.

         PCRE_NO_START_OPTIMIZE

       There  are a number of optimizations that pcre_exec() uses at the start
       of a match, in order to speed up the process. For  example,  if  it  is
       known  that  a  match must start with a specific character, it searches
       the subject for that character, and fails immediately if it cannot find
       it,  without actually running the main matching function. When callouts
       are in use, these optimizations can cause  them  to  be  skipped.  This
       option  disables  the  "start-up" optimizations, causing performance to
       suffer, but ensuring that the callouts do occur.

         PCRE_NO_UTF8_CHECK

       When PCRE_UTF8 is set at compile time, the validity of the subject as a
       UTF-8  string is automatically checked when pcre_exec() is subsequently
       called.  The value of startoffset is also checked  to  ensure  that  it
       points  to  the start of a UTF-8 character. There is a discussion about
       the validity of UTF-8 strings in the section on UTF-8  support  in  the
       main  pcre  page.  If  an  invalid  UTF-8  sequence  of bytes is found,
       pcre_exec() returns the error PCRE_ERROR_BADUTF8. If  startoffset  con-
       tains an invalid value, PCRE_ERROR_BADUTF8_OFFSET is returned.

       If  you  already  know that your subject is valid, and you want to skip
       these   checks   for   performance   reasons,   you   can    set    the
       PCRE_NO_UTF8_CHECK  option  when calling pcre_exec(). You might want to
       do this for the second and subsequent calls to pcre_exec() if  you  are
       making  repeated  calls  to  find  all  the matches in a single subject
       string. However, you should be  sure  that  the  value  of  startoffset
       points  to  the  start of a UTF-8 character. When PCRE_NO_UTF8_CHECK is
       set, the effect of passing an invalid UTF-8 string as a subject,  or  a
       value  of startoffset that does not point to the start of a UTF-8 char-
       acter, is undefined. Your program may crash.

         PCRE_PARTIAL_HARD
         PCRE_PARTIAL_SOFT

       These options turn on the partial matching feature. For backwards  com-
       patibility,  PCRE_PARTIAL is a synonym for PCRE_PARTIAL_SOFT. A partial
       match occurs if the end of the subject string is reached  successfully,
       but  there  are not enough subject characters to complete the match. If
       this happens when PCRE_PARTIAL_HARD  is  set,  pcre_exec()  immediately
       returns  PCRE_ERROR_PARTIAL.  Otherwise,  if  PCRE_PARTIAL_SOFT is set,
       matching continues by testing any other alternatives. Only if they  all
       fail  is  PCRE_ERROR_PARTIAL  returned (instead of PCRE_ERROR_NOMATCH).
       The portion of the string that was inspected when the partial match was
       found  is  set  as  the first matching string. There is a more detailed
       discussion in the pcrepartial documentation.

   The string to be matched by pcre_exec()

       The subject string is passed to pcre_exec() as a pointer in subject,  a
       length (in bytes) in length, and a starting byte offset in startoffset.
       In UTF-8 mode, the byte offset must point to the start of a UTF-8 char-
       acter.  Unlike  the pattern string, the subject may contain binary zero
       bytes. When the starting offset is zero, the search for a match  starts
       at  the  beginning  of  the subject, and this is by far the most common
       case.

       A non-zero starting offset is useful when searching for  another  match
       in  the same subject by calling pcre_exec() again after a previous suc-
       cess.  Setting startoffset differs from just passing over  a  shortened
       string  and  setting  PCRE_NOTBOL  in the case of a pattern that begins
       with any kind of lookbehind. For example, consider the pattern

         \Biss\B

       which finds occurrences of "iss" in the middle of  words.  (\B  matches
       only  if  the  current position in the subject is not a word boundary.)
       When applied to the string "Mississipi" the first call  to  pcre_exec()
       finds  the  first  occurrence. If pcre_exec() is called again with just
       the remainder of the subject,  namely  "issipi",  it  does  not  match,
       because \B is always false at the start of the subject, which is deemed
       to be a word boundary. However, if pcre_exec()  is  passed  the  entire
       string again, but with startoffset set to 4, it finds the second occur-
       rence of "iss" because it is able to look behind the starting point  to
       discover that it is preceded by a letter.

       If  a  non-zero starting offset is passed when the pattern is anchored,
       one attempt to match at the given offset is made. This can only succeed
       if  the  pattern  does  not require the match to be at the start of the
       subject.

   How pcre_exec() returns captured substrings

       In general, a pattern matches a certain portion of the subject, and  in
       addition,  further  substrings  from  the  subject may be picked out by
       parts of the pattern. Following the usage  in  Jeffrey  Friedl's  book,
       this  is  called "capturing" in what follows, and the phrase "capturing
       subpattern" is used for a fragment of a pattern that picks out  a  sub-
       string.  PCRE  supports several other kinds of parenthesized subpattern
       that do not cause substrings to be captured.

       Captured substrings are returned to the caller via a vector of integers
       whose  address is passed in ovector. The number of elements in the vec-
       tor is passed in ovecsize, which must be a non-negative  number.  Note:
       this argument is NOT the size of ovector in bytes.

       The  first  two-thirds of the vector is used to pass back captured sub-
       strings, each substring using a pair of integers. The  remaining  third
       of  the  vector is used as workspace by pcre_exec() while matching cap-
       turing subpatterns, and is not available for passing back  information.
       The  number passed in ovecsize should always be a multiple of three. If
       it is not, it is rounded down.

       When a match is successful, information about  captured  substrings  is
       returned  in  pairs  of integers, starting at the beginning of ovector,
       and continuing up to two-thirds of its length at the  most.  The  first
       element  of  each pair is set to the byte offset of the first character
       in a substring, and the second is set to the byte offset of  the  first
       character  after  the end of a substring. Note: these values are always
       byte offsets, even in UTF-8 mode. They are not character counts.

       The first pair of integers, ovector[0]  and  ovector[1],  identify  the
       portion  of  the subject string matched by the entire pattern. The next
       pair is used for the first capturing subpattern, and so on.  The  value
       returned by pcre_exec() is one more than the highest numbered pair that
       has been set.  For example, if two substrings have been  captured,  the
       returned  value is 3. If there are no capturing subpatterns, the return
       value from a successful match is 1, indicating that just the first pair
       of offsets has been set.

       If a capturing subpattern is matched repeatedly, it is the last portion
       of the string that it matched that is returned.

       If the vector is too small to hold all the captured substring  offsets,
       it is used as far as possible (up to two-thirds of its length), and the
       function returns a value of zero. If the substring offsets are  not  of
       interest,  pcre_exec()  may  be  called with ovector passed as NULL and
       ovecsize as zero. However, if the pattern contains back references  and
       the  ovector is not big enough to remember the related substrings, PCRE
       has to get additional memory for use during matching. Thus it  is  usu-
       ally advisable to supply an ovector.

       The pcre_fullinfo() function can be used to find out how many capturing
       subpatterns there are in a compiled  pattern.  The  smallest  size  for
       ovector  that  will allow for n captured substrings, in addition to the
       offsets of the substring matched by the whole pattern, is (n+1)*3.

       It is possible for capturing subpattern number n+1 to match  some  part
       of the subject when subpattern n has not been used at all. For example,
       if the string "abc" is matched  against  the  pattern  (a|(z))(bc)  the
       return from the function is 4, and subpatterns 1 and 3 are matched, but
       2 is not. When this happens, both values in  the  offset  pairs  corre-
       sponding to unused subpatterns are set to -1.

       Offset  values  that correspond to unused subpatterns at the end of the
       expression are also set to -1. For example,  if  the  string  "abc"  is
       matched  against the pattern (abc)(x(yz)?)? subpatterns 2 and 3 are not
       matched. The return from the function is 2, because  the  highest  used
       capturing subpattern number is 1. However, you can refer to the offsets
       for the second and third capturing subpatterns if  you  wish  (assuming
       the vector is large enough, of course).

       Some  convenience  functions  are  provided for extracting the captured
       substrings as separate strings. These are described below.

   Error return values from pcre_exec()

       If pcre_exec() fails, it returns a negative number. The  following  are
       defined in the header file:

         PCRE_ERROR_NOMATCH        (-1)

       The subject string did not match the pattern.

         PCRE_ERROR_NULL           (-2)

       Either  code  or  subject  was  passed as NULL, or ovector was NULL and
       ovecsize was not zero.

         PCRE_ERROR_BADOPTION      (-3)

       An unrecognized bit was set in the options argument.

         PCRE_ERROR_BADMAGIC       (-4)

       PCRE stores a 4-byte "magic number" at the start of the compiled  code,
       to catch the case when it is passed a junk pointer and to detect when a
       pattern that was compiled in an environment of one endianness is run in
       an  environment  with the other endianness. This is the error that PCRE
       gives when the magic number is not present.

         PCRE_ERROR_UNKNOWN_OPCODE (-5)

       While running the pattern match, an unknown item was encountered in the
       compiled  pattern.  This  error  could be caused by a bug in PCRE or by
       overwriting of the compiled pattern.

         PCRE_ERROR_NOMEMORY       (-6)

       If a pattern contains back references, but the ovector that  is  passed
       to pcre_exec() is not big enough to remember the referenced substrings,
       PCRE gets a block of memory at the start of matching to  use  for  this
       purpose.  If the call via pcre_malloc() fails, this error is given. The
       memory is automatically freed at the end of matching.

         PCRE_ERROR_NOSUBSTRING    (-7)

       This error is used by the pcre_copy_substring(),  pcre_get_substring(),
       and  pcre_get_substring_list()  functions  (see  below).  It  is  never
       returned by pcre_exec().

         PCRE_ERROR_MATCHLIMIT     (-8)

       The backtracking limit, as specified by  the  match_limit  field  in  a
       pcre_extra  structure  (or  defaulted) was reached. See the description
       above.

         PCRE_ERROR_CALLOUT        (-9)

       This error is never generated by pcre_exec() itself. It is provided for
       use  by  callout functions that want to yield a distinctive error code.
       See the pcrecallout documentation for details.

         PCRE_ERROR_BADUTF8        (-10)

       A string that contains an invalid UTF-8 byte sequence was passed  as  a
       subject.

         PCRE_ERROR_BADUTF8_OFFSET (-11)

       The UTF-8 byte sequence that was passed as a subject was valid, but the
       value of startoffset did not point to the beginning of a UTF-8  charac-
       ter.

         PCRE_ERROR_PARTIAL        (-12)

       The  subject  string did not match, but it did match partially. See the
       pcrepartial documentation for details of partial matching.

         PCRE_ERROR_BADPARTIAL     (-13)

       This code is no longer in  use.  It  was  formerly  returned  when  the
       PCRE_PARTIAL  option  was used with a compiled pattern containing items
       that were  not  supported  for  partial  matching.  From  release  8.00
       onwards, there are no restrictions on partial matching.

         PCRE_ERROR_INTERNAL       (-14)

       An  unexpected  internal error has occurred. This error could be caused
       by a bug in PCRE or by overwriting of the compiled pattern.

         PCRE_ERROR_BADCOUNT       (-15)

       This error is given if the value of the ovecsize argument is negative.

         PCRE_ERROR_RECURSIONLIMIT (-21)

       The internal recursion limit, as specified by the match_limit_recursion
       field  in  a  pcre_extra  structure (or defaulted) was reached. See the
       description above.

         PCRE_ERROR_BADNEWLINE     (-23)

       An invalid combination of PCRE_NEWLINE_xxx options was given.

       Error numbers -16 to -20 and -22 are not used by pcre_exec().


EXTRACTING CAPTURED SUBSTRINGS BY NUMBER

       int pcre_copy_substring(const char *subject, int *ovector,
            int stringcount, int stringnumber, char *buffer,
            int buffersize);

       int pcre_get_substring(const char *subject, int *ovector,
            int stringcount, int stringnumber,
            const char **stringptr);

       int pcre_get_substring_list(const char *subject,
            int *ovector, int stringcount, const char ***listptr);

       Captured substrings can be  accessed  directly  by  using  the  offsets
       returned  by  pcre_exec()  in  ovector.  For convenience, the functions
       pcre_copy_substring(),    pcre_get_substring(),    and    pcre_get_sub-
       string_list()  are  provided for extracting captured substrings as new,
       separate, zero-terminated strings. These functions identify  substrings
       by  number.  The  next section describes functions for extracting named
       substrings.

       A substring that contains a binary zero is correctly extracted and  has
       a  further zero added on the end, but the result is not, of course, a C
       string.  However, you can process such a string  by  referring  to  the
       length  that  is  returned  by  pcre_copy_substring() and pcre_get_sub-
       string().  Unfortunately, the interface to pcre_get_substring_list() is
       not  adequate for handling strings containing binary zeros, because the
       end of the final string is not independently indicated.

       The first three arguments are the same for all  three  of  these  func-
       tions:  subject  is  the subject string that has just been successfully
       matched, ovector is a pointer to the vector of integer offsets that was
       passed to pcre_exec(), and stringcount is the number of substrings that
       were captured by the match, including the substring  that  matched  the
       entire regular expression. This is the value returned by pcre_exec() if
       it is greater than zero. If pcre_exec() returned zero, indicating  that
       it  ran out of space in ovector, the value passed as stringcount should
       be the number of elements in the vector divided by three.

       The functions pcre_copy_substring() and pcre_get_substring() extract  a
       single  substring,  whose  number  is given as stringnumber. A value of
       zero extracts the substring that matched the  entire  pattern,  whereas
       higher  values  extract  the  captured  substrings.  For pcre_copy_sub-
       string(), the string is placed in buffer,  whose  length  is  given  by
       buffersize,  while  for  pcre_get_substring()  a new block of memory is
       obtained via pcre_malloc, and its address is  returned  via  stringptr.
       The  yield  of  the function is the length of the string, not including
       the terminating zero, or one of these error codes:

         PCRE_ERROR_NOMEMORY       (-6)

       The buffer was too small for pcre_copy_substring(), or the  attempt  to
       get memory failed for pcre_get_substring().

         PCRE_ERROR_NOSUBSTRING    (-7)

       There is no substring whose number is stringnumber.

       The  pcre_get_substring_list()  function  extracts  all  available sub-
       strings and builds a list of pointers to them. All this is  done  in  a
       single block of memory that is obtained via pcre_malloc. The address of
       the memory block is returned via listptr, which is also  the  start  of
       the  list  of  string pointers. The end of the list is marked by a NULL
       pointer. The yield of the function is zero if all  went  well,  or  the
       error code

         PCRE_ERROR_NOMEMORY       (-6)

       if the attempt to get the memory block failed.

       When  any of these functions encounter a substring that is unset, which
       can happen when capturing subpattern number n+1 matches  some  part  of
       the  subject, but subpattern n has not been used at all, they return an
       empty string. This can be distinguished from a genuine zero-length sub-
       string  by inspecting the appropriate offset in ovector, which is nega-
       tive for unset substrings.

       The two convenience functions pcre_free_substring() and  pcre_free_sub-
       string_list()  can  be  used  to free the memory returned by a previous
       call  of  pcre_get_substring()  or  pcre_get_substring_list(),  respec-
       tively.  They  do  nothing  more  than  call the function pointed to by
       pcre_free, which of course could be called directly from a  C  program.
       However,  PCRE is used in some situations where it is linked via a spe-
       cial  interface  to  another  programming  language  that  cannot   use
       pcre_free  directly;  it is for these cases that the functions are pro-
       vided.


EXTRACTING CAPTURED SUBSTRINGS BY NAME

       int pcre_get_stringnumber(const pcre *code,
            const char *name);

       int pcre_copy_named_substring(const pcre *code,
            const char *subject, int *ovector,
            int stringcount, const char *stringname,
            char *buffer, int buffersize);

       int pcre_get_named_substring(const pcre *code,
            const char *subject, int *ovector,
            int stringcount, const char *stringname,
            const char **stringptr);

       To extract a substring by name, you first have to find associated  num-
       ber.  For example, for this pattern

         (a+)b(?<xxx>\d+)...

       the number of the subpattern called "xxx" is 2. If the name is known to
       be unique (PCRE_DUPNAMES was not set), you can find the number from the
       name by calling pcre_get_stringnumber(). The first argument is the com-
       piled pattern, and the second is the name. The yield of the function is
       the  subpattern  number,  or PCRE_ERROR_NOSUBSTRING (-7) if there is no
       subpattern of that name.

       Given the number, you can extract the substring directly, or use one of
       the functions described in the previous section. For convenience, there
       are also two functions that do the whole job.

       Most   of   the   arguments    of    pcre_copy_named_substring()    and
       pcre_get_named_substring()  are  the  same  as  those for the similarly
       named functions that extract by number. As these are described  in  the
       previous  section,  they  are not re-described here. There are just two
       differences:

       First, instead of a substring number, a substring name is  given.  Sec-
       ond, there is an extra argument, given at the start, which is a pointer
       to the compiled pattern. This is needed in order to gain access to  the
       name-to-number translation table.

       These  functions call pcre_get_stringnumber(), and if it succeeds, they
       then call pcre_copy_substring() or pcre_get_substring(),  as  appropri-
       ate.  NOTE:  If PCRE_DUPNAMES is set and there are duplicate names, the
       behaviour may not be what you want (see the next section).

       Warning: If the pattern uses the (?| feature to set up multiple subpat-
       terns  with  the  same number, as described in the section on duplicate
       subpattern numbers in the pcrepattern page, you  cannot  use  names  to
       distinguish  the  different subpatterns, because names are not included
       in the compiled code. The matching process uses only numbers. For  this
       reason,  the  use of different names for subpatterns of the same number
       causes an error at compile time.


DUPLICATE SUBPATTERN NAMES

       int pcre_get_stringtable_entries(const pcre *code,
            const char *name, char **first, char **last);

       When a pattern is compiled with the  PCRE_DUPNAMES  option,  names  for
       subpatterns  are not required to be unique. (Duplicate names are always
       allowed for subpatterns with the same number, created by using the  (?|
       feature.  Indeed,  if  such subpatterns are named, they are required to
       use the same names.)

       Normally, patterns with duplicate names are such that in any one match,
       only  one of the named subpatterns participates. An example is shown in
       the pcrepattern documentation.

       When   duplicates   are   present,   pcre_copy_named_substring()    and
       pcre_get_named_substring()  return the first substring corresponding to
       the given name that is set. If  none  are  set,  PCRE_ERROR_NOSUBSTRING
       (-7)  is  returned;  no  data  is returned. The pcre_get_stringnumber()
       function returns one of the numbers that are associated with the  name,
       but it is not defined which it is.

       If  you want to get full details of all captured substrings for a given
       name, you must use  the  pcre_get_stringtable_entries()  function.  The
       first argument is the compiled pattern, and the second is the name. The
       third and fourth are pointers to variables which  are  updated  by  the
       function. After it has run, they point to the first and last entries in
       the name-to-number table  for  the  given  name.  The  function  itself
       returns  the  length  of  each entry, or PCRE_ERROR_NOSUBSTRING (-7) if
       there are none. The format of the table is described above in the  sec-
       tion  entitled  Information  about  a  pattern.  Given all the relevant
       entries for the name, you can extract each of their numbers, and  hence
       the captured data, if any.


FINDING ALL POSSIBLE MATCHES

       The  traditional  matching  function  uses a similar algorithm to Perl,
       which stops when it finds the first match, starting at a given point in
       the  subject.  If you want to find all possible matches, or the longest
       possible match, consider using the alternative matching  function  (see
       below)  instead.  If you cannot use the alternative function, but still
       need to find all possible matches, you can kludge it up by  making  use
       of the callout facility, which is described in the pcrecallout documen-
       tation.

       What you have to do is to insert a callout right at the end of the pat-
       tern.   When your callout function is called, extract and save the cur-
       rent matched substring. Then return  1,  which  forces  pcre_exec()  to
       backtrack  and  try other alternatives. Ultimately, when it runs out of
       matches, pcre_exec() will yield PCRE_ERROR_NOMATCH.


MATCHING A PATTERN: THE ALTERNATIVE FUNCTION

       int pcre_dfa_exec(const pcre *code, const pcre_extra *extra,
            const char *subject, int length, int startoffset,
            int options, int *ovector, int ovecsize,
            int *workspace, int wscount);

       The function pcre_dfa_exec()  is  called  to  match  a  subject  string
       against  a  compiled pattern, using a matching algorithm that scans the
       subject string just once, and does not backtrack.  This  has  different
       characteristics  to  the  normal  algorithm, and is not compatible with
       Perl. Some of the features of PCRE patterns are not  supported.  Never-
       theless,  there are times when this kind of matching can be useful. For
       a discussion of the two matching algorithms, and  a  list  of  features
       that  pcre_dfa_exec() does not support, see the pcrematching documenta-
       tion.

       The arguments for the pcre_dfa_exec() function  are  the  same  as  for
       pcre_exec(), plus two extras. The ovector argument is used in a differ-
       ent way, and this is described below. The other  common  arguments  are
       used  in  the  same way as for pcre_exec(), so their description is not
       repeated here.

       The two additional arguments provide workspace for  the  function.  The
       workspace  vector  should  contain at least 20 elements. It is used for
       keeping  track  of  multiple  paths  through  the  pattern  tree.  More
       workspace  will  be  needed for patterns and subjects where there are a
       lot of potential matches.

       Here is an example of a simple call to pcre_dfa_exec():

         int rc;
         int ovector[10];
         int wspace[20];
         rc = pcre_dfa_exec(
           re,             /* result of pcre_compile() */
           NULL,           /* we didn't study the pattern */
           "some string",  /* the subject string */
           11,             /* the length of the subject string */
           0,              /* start at offset 0 in the subject */
           0,              /* default options */
           ovector,        /* vector of integers for substring information */
           10,             /* number of elements (NOT size in bytes) */
           wspace,         /* working space vector */
           20);            /* number of elements (NOT size in bytes) */

   Option bits for pcre_dfa_exec()

       The unused bits of the options argument  for  pcre_dfa_exec()  must  be
       zero.  The  only  bits  that  may  be  set are PCRE_ANCHORED, PCRE_NEW-
       LINE_xxx,        PCRE_NOTBOL,        PCRE_NOTEOL,        PCRE_NOTEMPTY,
       PCRE_NOTEMPTY_ATSTART, PCRE_NO_UTF8_CHECK, PCRE_PARTIAL_HARD, PCRE_PAR-
       TIAL_SOFT, PCRE_DFA_SHORTEST, and PCRE_DFA_RESTART. All  but  the  last
       four  of  these  are  exactly  the  same  as  for pcre_exec(), so their
       description is not repeated here.

         PCRE_PARTIAL_HARD
         PCRE_PARTIAL_SOFT

       These have the same general effect as they do for pcre_exec(), but  the
       details  are  slightly  different.  When  PCRE_PARTIAL_HARD  is set for
       pcre_dfa_exec(), it returns PCRE_ERROR_PARTIAL if the end of  the  sub-
       ject  is  reached  and there is still at least one matching possibility
       that requires additional characters. This happens even if some complete
       matches have also been found. When PCRE_PARTIAL_SOFT is set, the return
       code PCRE_ERROR_NOMATCH is converted into PCRE_ERROR_PARTIAL if the end
       of  the  subject  is  reached, there have been no complete matches, but
       there is still at least one matching possibility. The  portion  of  the
       string  that  was inspected when the longest partial match was found is
       set as the first matching string in both cases.

         PCRE_DFA_SHORTEST

       Setting the PCRE_DFA_SHORTEST option causes the matching  algorithm  to
       stop as soon as it has found one match. Because of the way the alterna-
       tive algorithm works, this is necessarily the shortest  possible  match
       at the first possible matching point in the subject string.

         PCRE_DFA_RESTART

       When pcre_dfa_exec() returns a partial match, it is possible to call it
       again, with additional subject characters, and have  it  continue  with
       the  same match. The PCRE_DFA_RESTART option requests this action; when
       it is set, the workspace and wscount options must  reference  the  same
       vector  as  before  because data about the match so far is left in them
       after a partial match. There is more discussion of this facility in the
       pcrepartial documentation.

   Successful returns from pcre_dfa_exec()

       When  pcre_dfa_exec()  succeeds, it may have matched more than one sub-
       string in the subject. Note, however, that all the matches from one run
       of  the  function  start  at the same point in the subject. The shorter
       matches are all initial substrings of the longer matches. For  example,
       if the pattern

         <.*>

       is matched against the string

         This is <something> <something else> <something further> no more

       the three matched strings are

         <something>
         <something> <something else>
         <something> <something else> <something further>

       On  success,  the  yield of the function is a number greater than zero,
       which is the number of matched substrings.  The  substrings  themselves
       are  returned  in  ovector. Each string uses two elements; the first is
       the offset to the start, and the second is the offset to  the  end.  In
       fact,  all  the  strings  have the same start offset. (Space could have
       been saved by giving this only once, but it was decided to retain  some
       compatibility  with  the  way pcre_exec() returns data, even though the
       meaning of the strings is different.)

       The strings are returned in reverse order of length; that is, the long-
       est  matching  string is given first. If there were too many matches to
       fit into ovector, the yield of the function is zero, and the vector  is
       filled with the longest matches.

   Error returns from pcre_dfa_exec()

       The  pcre_dfa_exec()  function returns a negative number when it fails.
       Many of the errors are the same  as  for  pcre_exec(),  and  these  are
       described  above.   There are in addition the following errors that are
       specific to pcre_dfa_exec():

         PCRE_ERROR_DFA_UITEM      (-16)

       This return is given if pcre_dfa_exec() encounters an item in the  pat-
       tern  that  it  does not support, for instance, the use of \C or a back
       reference.

         PCRE_ERROR_DFA_UCOND      (-17)

       This return is given if pcre_dfa_exec()  encounters  a  condition  item
       that  uses  a back reference for the condition, or a test for recursion
       in a specific group. These are not supported.

         PCRE_ERROR_DFA_UMLIMIT    (-18)

       This return is given if pcre_dfa_exec() is called with an  extra  block
       that contains a setting of the match_limit field. This is not supported
       (it is meaningless).

         PCRE_ERROR_DFA_WSSIZE     (-19)

       This return is given if  pcre_dfa_exec()  runs  out  of  space  in  the
       workspace vector.

         PCRE_ERROR_DFA_RECURSE    (-20)

       When  a  recursive subpattern is processed, the matching function calls
       itself recursively, using private vectors for  ovector  and  workspace.
       This  error  is  given  if  the output vector is not large enough. This
       should be extremely rare, as a vector of size 1000 is used.


SEE ALSO

       pcrebuild(3), pcrecallout(3), pcrecpp(3)(3), pcrematching(3),  pcrepar-
       tial(3), pcreposix(3), pcreprecompile(3), pcresample(3), pcrestack(3).


AUTHOR

       Philip Hazel
       University Computing Service
       Cambridge CB2 3QH, England.


REVISION

       Last updated: 03 October 2009
       Copyright (c) 1997-2009 University of Cambridge.
------------------------------------------------------------------------------


PCRECALLOUT(3)                                                  PCRECALLOUT(3)


NAME
       PCRE - Perl-compatible regular expressions


PCRE CALLOUTS

       int (*pcre_callout)(pcre_callout_block *);

       PCRE provides a feature called "callout", which is a means of temporar-
       ily passing control to the caller of PCRE  in  the  middle  of  pattern
       matching.  The  caller of PCRE provides an external function by putting
       its entry point in the global variable pcre_callout. By  default,  this
       variable contains NULL, which disables all calling out.

       Within  a  regular  expression,  (?C) indicates the points at which the
       external function is to be called.  Different  callout  points  can  be
       identified  by  putting  a number less than 256 after the letter C. The
       default value is zero.  For  example,  this  pattern  has  two  callout
       points:

         (?C1)abc(?C2)def

       If  the  PCRE_AUTO_CALLOUT  option  bit  is  set when pcre_compile() or
       pcre_compile2() is called, PCRE  automatically  inserts  callouts,  all
       with  number  255,  before  each  item  in the pattern. For example, if
       PCRE_AUTO_CALLOUT is used with the pattern

         A(\d{2}|--)

       it is processed as if it were

       (?C255)A(?C255)((?C255)\d{2}(?C255)|(?C255)-(?C255)-(?C255))(?C255)

       Notice that there is a callout before and after  each  parenthesis  and
       alternation  bar.  Automatic  callouts  can  be  used  for tracking the
       progress of pattern matching. The pcretest command has an  option  that
       sets  automatic callouts; when it is used, the output indicates how the
       pattern is matched. This is useful information when you are  trying  to
       optimize the performance of a particular pattern.


MISSING CALLOUTS

       You  should  be  aware  that,  because of optimizations in the way PCRE
       matches patterns by default, callouts  sometimes  do  not  happen.  For
       example, if the pattern is

         ab(?C4)cd

       PCRE knows that any matching string must contain the letter "d". If the
       subject string is "abyz", the lack of "d" means that  matching  doesn't
       ever  start,  and  the  callout is never reached. However, with "abyd",
       though the result is still no match, the callout is obeyed.

       If the pattern is studied, PCRE knows the minimum length of a  matching
       string,  and will immediately give a "no match" return without actually
       running a match if the subject is not long enough, or,  for  unanchored
       patterns, if it has been scanned far enough.

       You  can disable these optimizations by passing the PCRE_NO_START_OPTI-
       MIZE option to pcre_exec() or  pcre_dfa_exec().  This  slows  down  the
       matching  process,  but  does  ensure that callouts such as the example
       above are obeyed.


THE CALLOUT INTERFACE

       During matching, when PCRE reaches a callout point, the external  func-
       tion  defined by pcre_callout is called (if it is set). This applies to
       both the pcre_exec() and the pcre_dfa_exec()  matching  functions.  The
       only  argument  to  the callout function is a pointer to a pcre_callout
       block. This structure contains the following fields:

         int          version;
         int          callout_number;
         int         *offset_vector;
         const char  *subject;
         int          subject_length;
         int          start_match;
         int          current_position;
         int          capture_top;
         int          capture_last;
         void        *callout_data;
         int          pattern_position;
         int          next_item_length;

       The version field is an integer containing the version  number  of  the
       block  format. The initial version was 0; the current version is 1. The
       version number will change again in future  if  additional  fields  are
       added, but the intention is never to remove any of the existing fields.

       The  callout_number  field  contains the number of the callout, as com-
       piled into the pattern (that is, the number after ?C for  manual  call-
       outs, and 255 for automatically generated callouts).

       The  offset_vector field is a pointer to the vector of offsets that was
       passed  by  the  caller  to  pcre_exec()   or   pcre_dfa_exec().   When
       pcre_exec()  is used, the contents can be inspected in order to extract
       substrings that have been matched so  far,  in  the  same  way  as  for
       extracting  substrings after a match has completed. For pcre_dfa_exec()
       this field is not useful.

       The subject and subject_length fields contain copies of the values that
       were passed to pcre_exec().

       The  start_match  field normally contains the offset within the subject
       at which the current match attempt  started.  However,  if  the  escape
       sequence  \K has been encountered, this value is changed to reflect the
       modified starting point. If the pattern is not  anchored,  the  callout
       function may be called several times from the same point in the pattern
       for different starting points in the subject.

       The current_position field contains the offset within  the  subject  of
       the current match pointer.

       When  the  pcre_exec() function is used, the capture_top field contains
       one more than the number of the highest numbered captured substring  so
       far.  If  no substrings have been captured, the value of capture_top is
       one. This is always the case when pcre_dfa_exec() is used,  because  it
       does not support captured substrings.

       The  capture_last  field  contains the number of the most recently cap-
       tured substring. If no substrings have been captured, its value is  -1.
       This is always the case when pcre_dfa_exec() is used.

       The  callout_data  field contains a value that is passed to pcre_exec()
       or pcre_dfa_exec() specifically so that it can be passed back in  call-
       outs.  It  is  passed  in the pcre_callout field of the pcre_extra data
       structure. If no such data was passed, the value of callout_data  in  a
       pcre_callout  block  is  NULL. There is a description of the pcre_extra
       structure in the pcreapi documentation.

       The pattern_position field is present from version 1 of the  pcre_call-
       out structure. It contains the offset to the next item to be matched in
       the pattern string.

       The next_item_length field is present from version 1 of the  pcre_call-
       out structure. It contains the length of the next item to be matched in
       the pattern string. When the callout immediately precedes  an  alterna-
       tion  bar, a closing parenthesis, or the end of the pattern, the length
       is zero. When the callout precedes an opening parenthesis,  the  length
       is that of the entire subpattern.

       The  pattern_position  and next_item_length fields are intended to help
       in distinguishing between different automatic callouts, which all  have
       the same callout number. However, they are set for all callouts.


RETURN VALUES

       The  external callout function returns an integer to PCRE. If the value
       is zero, matching proceeds as normal. If  the  value  is  greater  than
       zero,  matching  fails  at  the current point, but the testing of other
       matching possibilities goes ahead, just as if a lookahead assertion had
       failed.  If  the  value  is less than zero, the match is abandoned, and
       pcre_exec() or pcre_dfa_exec() returns the negative value.

       Negative  values  should  normally  be   chosen   from   the   set   of
       PCRE_ERROR_xxx values. In particular, PCRE_ERROR_NOMATCH forces a stan-
       dard "no  match"  failure.   The  error  number  PCRE_ERROR_CALLOUT  is
       reserved  for  use  by callout functions; it will never be used by PCRE
       itself.


AUTHOR

       Philip Hazel
       University Computing Service
       Cambridge CB2 3QH, England.


REVISION

       Last updated: 29 September 2009
       Copyright (c) 1997-2009 University of Cambridge.
------------------------------------------------------------------------------


PCRECOMPAT(3)                                                    PCRECOMPAT(3)


NAME
       PCRE - Perl-compatible regular expressions


DIFFERENCES BETWEEN PCRE AND PERL

       This  document describes the differences in the ways that PCRE and Perl
       handle regular expressions. The differences  described  here  are  with
       respect to Perl 5.10.

       1.  PCRE has only a subset of Perl's UTF-8 and Unicode support. Details
       of what it does have are given in the section on UTF-8 support  in  the
       main pcre page.

       2. PCRE does not allow repeat quantifiers on lookahead assertions. Perl
       permits them, but they do not mean what you might think.  For  example,
       (?!a){3} does not assert that the next three characters are not "a". It
       just asserts that the next character is not "a" three times.

       3. Capturing subpatterns that occur inside  negative  lookahead  asser-
       tions  are  counted,  but their entries in the offsets vector are never
       set. Perl sets its numerical variables from any such patterns that  are
       matched before the assertion fails to match something (thereby succeed-
       ing), but only if the negative lookahead assertion  contains  just  one
       branch.

       4.  Though  binary zero characters are supported in the subject string,
       they are not allowed in a pattern string because it is passed as a nor-
       mal C string, terminated by zero. The escape sequence \0 can be used in
       the pattern to represent a binary zero.

       5. The following Perl escape sequences are not supported: \l,  \u,  \L,
       \U, and \N. In fact these are implemented by Perl's general string-han-
       dling and are not part of its pattern matching engine. If any of  these
       are encountered by PCRE, an error is generated.

       6.  The Perl escape sequences \p, \P, and \X are supported only if PCRE
       is built with Unicode character property support. The  properties  that
       can  be tested with \p and \P are limited to the general category prop-
       erties such as Lu and Nd, script names such as Greek or  Han,  and  the
       derived  properties  Any  and  L&. PCRE does support the Cs (surrogate)
       property, which Perl does not; the  Perl  documentation  says  "Because
       Perl hides the need for the user to understand the internal representa-
       tion of Unicode characters, there is no need to implement the  somewhat
       messy concept of surrogates."

       7. PCRE does support the \Q...\E escape for quoting substrings. Charac-
       ters in between are treated as literals.  This  is  slightly  different
       from  Perl  in  that  $  and  @ are also handled as literals inside the
       quotes. In Perl, they cause variable interpolation (but of course  PCRE
       does not have variables). Note the following examples:

           Pattern            PCRE matches      Perl matches

           \Qabc$xyz\E        abc$xyz           abc followed by the
                                                  contents of $xyz
           \Qabc\$xyz\E       abc\$xyz          abc\$xyz
           \Qabc\E\$\Qxyz\E   abc$xyz           abc$xyz

       The  \Q...\E  sequence  is recognized both inside and outside character
       classes.

       8. Fairly obviously, PCRE does not support the (?{code}) and (??{code})
       constructions.  However,  there is support for recursive patterns. This
       is not available in Perl 5.8, but it is in Perl 5.10.  Also,  the  PCRE
       "callout"  feature allows an external function to be called during pat-
       tern matching. See the pcrecallout documentation for details.

       9. Subpatterns that are called  recursively  or  as  "subroutines"  are
       always  treated  as  atomic  groups  in  PCRE. This is like Python, but
       unlike Perl. There is a discussion of an example that explains this  in
       more  detail  in  the section on recursion differences from Perl in the
       pcrepattern page.

       10. There are some differences that are concerned with the settings  of
       captured  strings  when  part  of  a  pattern is repeated. For example,
       matching "aba" against the  pattern  /^(a(b)?)+$/  in  Perl  leaves  $2
       unset, but in PCRE it is set to "b".

       11.  PCRE  does  support  Perl  5.10's  backtracking  verbs  (*ACCEPT),
       (*FAIL), (*F), (*COMMIT), (*PRUNE), (*SKIP), and (*THEN), but  only  in
       the forms without an argument. PCRE does not support (*MARK).

       12.  PCRE's handling of duplicate subpattern numbers and duplicate sub-
       pattern names is not as general as Perl's. This is a consequence of the
       fact the PCRE works internally just with numbers, using an external ta-
       ble to translate between numbers and names. In  particular,  a  pattern
       such  as  (?|(?<a>A)|(?<b)B),  where the two capturing parentheses have
       the same number but different names, is not supported,  and  causes  an
       error  at compile time. If it were allowed, it would not be possible to
       distinguish which parentheses matched, because both names map  to  cap-
       turing subpattern number 1. To avoid this confusing situation, an error
       is given at compile time.

       13. PCRE provides some extensions to the Perl regular expression facil-
       ities.   Perl  5.10  includes new features that are not in earlier ver-
       sions of Perl, some of which (such as named parentheses) have  been  in
       PCRE for some time. This list is with respect to Perl 5.10:

       (a)  Although  lookbehind  assertions  in  PCRE must match fixed length
       strings, each alternative branch of a lookbehind assertion can match  a
       different  length  of  string.  Perl requires them all to have the same
       length.

       (b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the  $
       meta-character matches only at the very end of the string.

       (c) If PCRE_EXTRA is set, a backslash followed by a letter with no spe-
       cial meaning is faulted. Otherwise, like Perl, the backslash is quietly
       ignored.  (Perl can be made to issue a warning.)

       (d)  If  PCRE_UNGREEDY is set, the greediness of the repetition quanti-
       fiers is inverted, that is, by default they are not greedy, but if fol-
       lowed by a question mark they are.

       (e) PCRE_ANCHORED can be used at matching time to force a pattern to be
       tried only at the first matching position in the subject string.

       (f) The PCRE_NOTBOL, PCRE_NOTEOL, PCRE_NOTEMPTY, PCRE_NOTEMPTY_ATSTART,
       and  PCRE_NO_AUTO_CAPTURE  options for pcre_exec() have no Perl equiva-
       lents.

       (g) The \R escape sequence can be restricted to match only CR,  LF,  or
       CRLF by the PCRE_BSR_ANYCRLF option.

       (h) The callout facility is PCRE-specific.

       (i) The partial matching facility is PCRE-specific.

       (j) Patterns compiled by PCRE can be saved and re-used at a later time,
       even on different hosts that have the other endianness.

       (k) The alternative matching function (pcre_dfa_exec())  matches  in  a
       different way and is not Perl-compatible.

       (l)  PCRE  recognizes some special sequences such as (*CR) at the start
       of a pattern that set overall options that cannot be changed within the
       pattern.


AUTHOR

       Philip Hazel
       University Computing Service
       Cambridge CB2 3QH, England.


REVISION

       Last updated: 04 October 2009
       Copyright (c) 1997-2009 University of Cambridge.
------------------------------------------------------------------------------


PCREPATTERN(3)                                                  PCREPATTERN(3)


NAME
       PCRE - Perl-compatible regular expressions


PCRE REGULAR EXPRESSION DETAILS

       The  syntax and semantics of the regular expressions that are supported
       by PCRE are described in detail below. There is a quick-reference  syn-
       tax summary in the pcresyntax page. PCRE tries to match Perl syntax and
       semantics as closely as it can. PCRE  also  supports  some  alternative
       regular  expression  syntax (which does not conflict with the Perl syn-
       tax) in order to provide some compatibility with regular expressions in
       Python, .NET, and Oniguruma.

       Perl's  regular expressions are described in its own documentation, and
       regular expressions in general are covered in a number of  books,  some
       of  which  have  copious  examples. Jeffrey Friedl's "Mastering Regular
       Expressions", published by  O'Reilly,  covers  regular  expressions  in
       great  detail.  This  description  of  PCRE's  regular  expressions  is
       intended as reference material.

       The original operation of PCRE was on strings of  one-byte  characters.
       However,  there is now also support for UTF-8 character strings. To use
       this, PCRE must be built to include UTF-8 support, and  you  must  call
       pcre_compile()  or  pcre_compile2() with the PCRE_UTF8 option. There is
       also a special sequence that can be given at the start of a pattern:

         (*UTF8)

       Starting a pattern with this sequence  is  equivalent  to  setting  the
       PCRE_UTF8  option.  This  feature  is  not Perl-compatible. How setting
       UTF-8 mode affects pattern matching  is  mentioned  in  several  places
       below.  There  is  also  a  summary of UTF-8 features in the section on
       UTF-8 support in the main pcre page.

       The remainder of this document discusses the  patterns  that  are  sup-
       ported  by  PCRE when its main matching function, pcre_exec(), is used.
       From  release  6.0,   PCRE   offers   a   second   matching   function,
       pcre_dfa_exec(),  which matches using a different algorithm that is not
       Perl-compatible. Some of the features discussed below are not available
       when  pcre_dfa_exec()  is used. The advantages and disadvantages of the
       alternative function, and how it differs from the normal function,  are
       discussed in the pcrematching page.


NEWLINE CONVENTIONS

       PCRE  supports five different conventions for indicating line breaks in
       strings: a single CR (carriage return) character, a  single  LF  (line-
       feed) character, the two-character sequence CRLF, any of the three pre-
       ceding, or any Unicode newline sequence. The pcreapi page  has  further
       discussion  about newlines, and shows how to set the newline convention
       in the options arguments for the compiling and matching functions.

       It is also possible to specify a newline convention by starting a  pat-
       tern string with one of the following five sequences:

         (*CR)        carriage return
         (*LF)        linefeed
         (*CRLF)      carriage return, followed by linefeed
         (*ANYCRLF)   any of the three above
         (*ANY)       all Unicode newline sequences

       These  override  the default and the options given to pcre_compile() or
       pcre_compile2(). For example, on a Unix system where LF is the  default
       newline sequence, the pattern

         (*CR)a.b

       changes the convention to CR. That pattern matches "a\nb" because LF is
       no longer a newline. Note that these special settings,  which  are  not
       Perl-compatible,  are  recognized  only at the very start of a pattern,
       and that they must be in upper case.  If  more  than  one  of  them  is
       present, the last one is used.

       The  newline  convention  does  not  affect what the \R escape sequence
       matches. By default, this is any Unicode  newline  sequence,  for  Perl
       compatibility.  However, this can be changed; see the description of \R
       in the section entitled "Newline sequences" below. A change of \R  set-
       ting can be combined with a change of newline convention.


CHARACTERS AND METACHARACTERS

       A  regular  expression  is  a pattern that is matched against a subject
       string from left to right. Most characters stand for  themselves  in  a
       pattern,  and  match  the corresponding characters in the subject. As a
       trivial example, the pattern

         The quick brown fox

       matches a portion of a subject string that is identical to itself. When
       caseless  matching is specified (the PCRE_CASELESS option), letters are
       matched independently of case. In UTF-8 mode, PCRE  always  understands
       the  concept  of case for characters whose values are less than 128, so
       caseless matching is always possible. For characters with  higher  val-
       ues,  the concept of case is supported if PCRE is compiled with Unicode
       property support, but not otherwise.   If  you  want  to  use  caseless
       matching  for  characters  128  and above, you must ensure that PCRE is
       compiled with Unicode property support as well as with UTF-8 support.

       The power of regular expressions comes  from  the  ability  to  include
       alternatives  and  repetitions in the pattern. These are encoded in the
       pattern by the use of metacharacters, which do not stand for themselves
       but instead are interpreted in some special way.

       There  are  two different sets of metacharacters: those that are recog-
       nized anywhere in the pattern except within square brackets, and  those
       that  are  recognized  within square brackets. Outside square brackets,
       the metacharacters are as follows:

         \      general escape character with several uses
         ^      assert start of string (or line, in multiline mode)
         $      assert end of string (or line, in multiline mode)
         .      match any character except newline (by default)
         [      start character class definition
         |      start of alternative branch
         (      start subpattern
         )      end subpattern
         ?      extends the meaning of (
                also 0 or 1 quantifier
                also quantifier minimizer
         *      0 or more quantifier
         +      1 or more quantifier
                also "possessive quantifier"
         {      start min/max quantifier

       Part of a pattern that is in square brackets  is  called  a  "character
       class". In a character class the only metacharacters are:

         \      general escape character
         ^      negate the class, but only if the first character
         -      indicates character range
         [      POSIX character class (only if followed by POSIX
                  syntax)
         ]      terminates the character class

       The following sections describe the use of each of the metacharacters.


BACKSLASH

       The backslash character has several uses. Firstly, if it is followed by
       a non-alphanumeric character, it takes away any  special  meaning  that
       character  may  have.  This  use  of  backslash  as an escape character
       applies both inside and outside character classes.

       For example, if you want to match a * character, you write  \*  in  the
       pattern.   This  escaping  action  applies whether or not the following
       character would otherwise be interpreted as a metacharacter, so  it  is
       always  safe  to  precede  a non-alphanumeric with backslash to specify
       that it stands for itself. In particular, if you want to match a  back-
       slash, you write \\.

       If  a  pattern is compiled with the PCRE_EXTENDED option, whitespace in
       the pattern (other than in a character class) and characters between  a
       # outside a character class and the next newline are ignored. An escap-
       ing backslash can be used to include a whitespace  or  #  character  as
       part of the pattern.

       If  you  want  to remove the special meaning from a sequence of charac-
       ters, you can do so by putting them between \Q and \E. This is  differ-
       ent  from  Perl  in  that  $  and  @ are handled as literals in \Q...\E
       sequences in PCRE, whereas in Perl, $ and @ cause  variable  interpola-
       tion. Note the following examples:

         Pattern            PCRE matches   Perl matches

         \Qabc$xyz\E        abc$xyz        abc followed by the
                                             contents of $xyz
         \Qabc\$xyz\E       abc\$xyz       abc\$xyz
         \Qabc\E\$\Qxyz\E   abc$xyz        abc$xyz

       The  \Q...\E  sequence  is recognized both inside and outside character
       classes.

   Non-printing characters

       A second use of backslash provides a way of encoding non-printing char-
       acters  in patterns in a visible manner. There is no restriction on the
       appearance of non-printing characters, apart from the binary zero  that
       terminates  a  pattern,  but  when  a pattern is being prepared by text
       editing, it is  often  easier  to  use  one  of  the  following  escape
       sequences than the binary character it represents:

         \a        alarm, that is, the BEL character (hex 07)
         \cx       "control-x", where x is any character
         \e        escape (hex 1B)
         \f        formfeed (hex 0C)
         \n        linefeed (hex 0A)
         \r        carriage return (hex 0D)
         \t        tab (hex 09)
         \ddd      character with octal code ddd, or back reference
         \xhh      character with hex code hh
         \x{hhh..} character with hex code hhh..

       The  precise  effect of \cx is as follows: if x is a lower case letter,
       it is converted to upper case. Then bit 6 of the character (hex 40)  is
       inverted.   Thus  \cz becomes hex 1A, but \c{ becomes hex 3B, while \c;
       becomes hex 7B.

       After \x, from zero to two hexadecimal digits are read (letters can  be
       in  upper  or  lower case). Any number of hexadecimal digits may appear
       between \x{ and }, but the value of the character  code  must  be  less
       than 256 in non-UTF-8 mode, and less than 2**31 in UTF-8 mode. That is,
       the maximum value in hexadecimal is 7FFFFFFF. Note that this is  bigger
       than the largest Unicode code point, which is 10FFFF.

       If  characters  other than hexadecimal digits appear between \x{ and },
       or if there is no terminating }, this form of escape is not recognized.
       Instead,  the  initial  \x  will  be interpreted as a basic hexadecimal
       escape, with no following digits, giving a  character  whose  value  is
       zero.

       Characters whose value is less than 256 can be defined by either of the
       two syntaxes for \x. There is no difference in the way  they  are  han-
       dled. For example, \xdc is exactly the same as \x{dc}.

       After  \0  up  to two further octal digits are read. If there are fewer
       than two digits, just  those  that  are  present  are  used.  Thus  the
       sequence \0\x\07 specifies two binary zeros followed by a BEL character
       (code value 7). Make sure you supply two digits after the initial  zero
       if the pattern character that follows is itself an octal digit.

       The handling of a backslash followed by a digit other than 0 is compli-
       cated.  Outside a character class, PCRE reads it and any following dig-
       its  as  a  decimal  number. If the number is less than 10, or if there
       have been at least that many previous capturing left parentheses in the
       expression,  the  entire  sequence  is  taken  as  a  back reference. A
       description of how this works is given later, following the  discussion
       of parenthesized subpatterns.

       Inside  a  character  class, or if the decimal number is greater than 9
       and there have not been that many capturing subpatterns, PCRE  re-reads
       up to three octal digits following the backslash, and uses them to gen-
       erate a data character. Any subsequent digits stand for themselves.  In
       non-UTF-8  mode,  the  value  of a character specified in octal must be
       less than \400. In UTF-8 mode, values up to  \777  are  permitted.  For
       example:

         \040   is another way of writing a space
         \40    is the same, provided there are fewer than 40
                   previous capturing subpatterns
         \7     is always a back reference
         \11    might be a back reference, or another way of
                   writing a tab
         \011   is always a tab
         \0113  is a tab followed by the character "3"
         \113   might be a back reference, otherwise the
                   character with octal code 113
         \377   might be a back reference, otherwise
                   the byte consisting entirely of 1 bits
         \81    is either a back reference, or a binary zero
                   followed by the two characters "8" and "1"

       Note  that  octal  values of 100 or greater must not be introduced by a
       leading zero, because no more than three octal digits are ever read.

       All the sequences that define a single character value can be used both
       inside  and  outside character classes. In addition, inside a character
       class, the sequence \b is interpreted as the backspace  character  (hex
       08),  and the sequences \R and \X are interpreted as the characters "R"
       and "X", respectively. Outside a character class, these sequences  have
       different meanings (see below).

   Absolute and relative back references

       The  sequence  \g followed by an unsigned or a negative number, option-
       ally enclosed in braces, is an absolute or relative back  reference.  A
       named back reference can be coded as \g{name}. Back references are dis-
       cussed later, following the discussion of parenthesized subpatterns.

   Absolute and relative subroutine calls

       For compatibility with Oniguruma, the non-Perl syntax \g followed by  a
       name or a number enclosed either in angle brackets or single quotes, is
       an alternative syntax for referencing a subpattern as  a  "subroutine".
       Details  are  discussed  later.   Note  that  \g{...} (Perl syntax) and
       \g<...> (Oniguruma syntax) are not synonymous. The  former  is  a  back
       reference; the latter is a subroutine call.

   Generic character types

       Another use of backslash is for specifying generic character types. The
       following are always recognized:

         \d     any decimal digit
         \D     any character that is not a decimal digit
         \h     any horizontal whitespace character
         \H     any character that is not a horizontal whitespace character
         \s     any whitespace character
         \S     any character that is not a whitespace character
         \v     any vertical whitespace character
         \V     any character that is not a vertical whitespace character
         \w     any "word" character
         \W     any "non-word" character

       Each pair of escape sequences partitions the complete set of characters
       into  two disjoint sets. Any given character matches one, and only one,
       of each pair.

       These character type sequences can appear both inside and outside char-
       acter  classes.  They each match one character of the appropriate type.
       If the current matching point is at the end of the subject string,  all
       of them fail, since there is no character to match.

       For  compatibility  with Perl, \s does not match the VT character (code
       11).  This makes it different from the the POSIX "space" class. The  \s
       characters  are  HT  (9), LF (10), FF (12), CR (13), and space (32). If
       "use locale;" is included in a Perl script, \s may match the VT charac-
       ter. In PCRE, it never does.

       In  UTF-8 mode, characters with values greater than 128 never match \d,
       \s, or \w, and always match \D, \S, and \W. This is true even when Uni-
       code  character  property  support is available. These sequences retain
       their original meanings from before UTF-8 support was available, mainly
       for  efficiency  reasons. Note that this also affects \b, because it is
       defined in terms of \w and \W.

       The sequences \h, \H, \v, and \V are Perl 5.10 features. In contrast to
       the  other  sequences, these do match certain high-valued codepoints in
       UTF-8 mode.  The horizontal space characters are:

         U+0009     Horizontal tab
         U+0020     Space
         U+00A0     Non-break space
         U+1680     Ogham space mark
         U+180E     Mongolian vowel separator
         U+2000     En quad
         U+2001     Em quad
         U+2002     En space
         U+2003     Em space
         U+2004     Three-per-em space
         U+2005     Four-per-em space
         U+2006     Six-per-em space
         U+2007     Figure space
         U+2008     Punctuation space
         U+2009     Thin space
         U+200A     Hair space
         U+202F     Narrow no-break space
         U+205F     Medium mathematical space
         U+3000     Ideographic space

       The vertical space characters are:

         U+000A     Linefeed
         U+000B     Vertical tab
         U+000C     Formfeed
         U+000D     Carriage return
         U+0085     Next line
         U+2028     Line separator
         U+2029     Paragraph separator

       A "word" character is an underscore or any character less than 256 that
       is  a  letter  or  digit.  The definition of letters and digits is con-
       trolled by PCRE's low-valued character tables, and may vary if  locale-
       specific  matching is taking place (see "Locale support" in the pcreapi
       page). For example, in a French locale such  as  "fr_FR"  in  Unix-like
       systems,  or "french" in Windows, some character codes greater than 128
       are used for accented letters, and these are matched by \w. The use  of
       locales with Unicode is discouraged.

   Newline sequences

       Outside  a  character class, by default, the escape sequence \R matches
       any Unicode newline sequence. This is a Perl 5.10 feature. In non-UTF-8
       mode \R is equivalent to the following:

         (?>\r\n|\n|\x0b|\f|\r|\x85)

       This  is  an  example  of an "atomic group", details of which are given
       below.  This particular group matches either the two-character sequence
       CR  followed  by  LF,  or  one  of  the single characters LF (linefeed,
       U+000A), VT (vertical tab, U+000B), FF (formfeed, U+000C), CR (carriage
       return, U+000D), or NEL (next line, U+0085). The two-character sequence
       is treated as a single unit that cannot be split.

       In UTF-8 mode, two additional characters whose codepoints  are  greater
       than 255 are added: LS (line separator, U+2028) and PS (paragraph sepa-
       rator, U+2029).  Unicode character property support is not  needed  for
       these characters to be recognized.

       It is possible to restrict \R to match only CR, LF, or CRLF (instead of
       the complete set  of  Unicode  line  endings)  by  setting  the  option
       PCRE_BSR_ANYCRLF either at compile time or when the pattern is matched.
       (BSR is an abbrevation for "backslash R".) This can be made the default
       when  PCRE  is  built;  if this is the case, the other behaviour can be
       requested via the PCRE_BSR_UNICODE option.   It  is  also  possible  to
       specify  these  settings  by  starting a pattern string with one of the
       following sequences:

         (*BSR_ANYCRLF)   CR, LF, or CRLF only
         (*BSR_UNICODE)   any Unicode newline sequence

       These override the default and the options given to  pcre_compile()  or
       pcre_compile2(),  but  they  can  be  overridden  by  options  given to
       pcre_exec() or pcre_dfa_exec(). Note that these special settings, which
       are  not  Perl-compatible,  are  recognized only at the very start of a
       pattern, and that they must be in upper case. If more than one of  them
       is present, the last one is used. They can be combined with a change of
       newline convention, for example, a pattern can start with:

         (*ANY)(*BSR_ANYCRLF)

       Inside a character class, \R matches the letter "R".

   Unicode character properties

       When PCRE is built with Unicode character property support, three addi-
       tional  escape sequences that match characters with specific properties
       are available.  When not in UTF-8 mode, these sequences are  of  course
       limited  to  testing characters whose codepoints are less than 256, but
       they do work in this mode.  The extra escape sequences are:

         \p{xx}   a character with the xx property
         \P{xx}   a character without the xx property
         \X       an extended Unicode sequence

       The property names represented by xx above are limited to  the  Unicode
       script names, the general category properties, and "Any", which matches
       any character (including newline). Other properties such as "InMusical-
       Symbols"  are  not  currently supported by PCRE. Note that \P{Any} does
       not match any characters, so always causes a match failure.

       Sets of Unicode characters are defined as belonging to certain scripts.
       A  character from one of these sets can be matched using a script name.
       For example:

         \p{Greek}
         \P{Han}

       Those that are not part of an identified script are lumped together  as
       "Common". The current list of scripts is:

       Arabic, Armenian, Avestan, Balinese, Bamum, Bengali, Bopomofo, Braille,
       Buginese, Buhid, Canadian_Aboriginal, Carian, Cham,  Cherokee,  Common,
       Coptic,   Cuneiform,  Cypriot,  Cyrillic,  Deseret,  Devanagari,  Egyp-
       tian_Hieroglyphs,  Ethiopic,  Georgian,  Glagolitic,   Gothic,   Greek,
       Gujarati,  Gurmukhi,  Han,  Hangul,  Hanunoo,  Hebrew,  Hiragana, Impe-
       rial_Aramaic, Inherited, Inscriptional_Pahlavi, Inscriptional_Parthian,
       Javanese,  Kaithi, Kannada, Katakana, Kayah_Li, Kharoshthi, Khmer, Lao,
       Latin,  Lepcha,  Limbu,  Linear_B,  Lisu,  Lycian,  Lydian,  Malayalam,
       Meetei_Mayek,  Mongolian, Myanmar, New_Tai_Lue, Nko, Ogham, Old_Italic,
       Old_Persian, Old_South_Arabian, Old_Turkic, Ol_Chiki,  Oriya,  Osmanya,
       Phags_Pa,  Phoenician,  Rejang,  Runic, Samaritan, Saurashtra, Shavian,
       Sinhala, Sundanese, Syloti_Nagri, Syriac,  Tagalog,  Tagbanwa,  Tai_Le,
       Tai_Tham,  Tai_Viet,  Tamil,  Telugu,  Thaana, Thai, Tibetan, Tifinagh,
       Ugaritic, Vai, Yi.

       Each character has exactly one general category property, specified  by
       a two-letter abbreviation. For compatibility with Perl, negation can be
       specified by including a circumflex between the opening brace  and  the
       property name. For example, \p{^Lu} is the same as \P{Lu}.

       If only one letter is specified with \p or \P, it includes all the gen-
       eral category properties that start with that letter. In this case,  in
       the  absence of negation, the curly brackets in the escape sequence are
       optional; these two examples have the same effect:

         \p{L}
         \pL

       The following general category property codes are supported:

         C     Other
         Cc    Control
         Cf    Format
         Cn    Unassigned
         Co    Private use
         Cs    Surrogate

         L     Letter
         Ll    Lower case letter
         Lm    Modifier letter
         Lo    Other letter
         Lt    Title case letter
         Lu    Upper case letter

         M     Mark
         Mc    Spacing mark
         Me    Enclosing mark
         Mn    Non-spacing mark

         N     Number
         Nd    Decimal number
         Nl    Letter number
         No    Other number

         P     Punctuation
         Pc    Connector punctuation
         Pd    Dash punctuation
         Pe    Close punctuation
         Pf    Final punctuation
         Pi    Initial punctuation
         Po    Other punctuation
         Ps    Open punctuation

         S     Symbol
         Sc    Currency symbol
         Sk    Modifier symbol
         Sm    Mathematical symbol
         So    Other symbol

         Z     Separator
         Zl    Line separator
         Zp    Paragraph separator
         Zs    Space separator

       The special property L& is also supported: it matches a character  that
       has  the  Lu,  Ll, or Lt property, in other words, a letter that is not
       classified as a modifier or "other".

       The Cs (Surrogate) property applies only to  characters  in  the  range
       U+D800  to  U+DFFF. Such characters are not valid in UTF-8 strings (see
       RFC 3629) and so cannot be tested by PCRE, unless UTF-8 validity check-
       ing  has  been  turned off (see the discussion of PCRE_NO_UTF8_CHECK in
       the pcreapi page). Perl does not support the Cs property.

       The long synonyms for  property  names  that  Perl  supports  (such  as
       \p{Letter})  are  not  supported by PCRE, nor is it permitted to prefix
       any of these properties with "Is".

       No character that is in the Unicode table has the Cn (unassigned) prop-
       erty.  Instead, this property is assumed for any code point that is not
       in the Unicode table.

       Specifying caseless matching does not affect  these  escape  sequences.
       For example, \p{Lu} always matches only upper case letters.

       The  \X  escape  matches  any number of Unicode characters that form an
       extended Unicode sequence. \X is equivalent to

         (?>\PM\pM*)

       That is, it matches a character without the "mark"  property,  followed
       by  zero  or  more  characters with the "mark" property, and treats the
       sequence as an atomic group (see below).  Characters  with  the  "mark"
       property  are  typically  accents  that affect the preceding character.
       None of them have codepoints less than 256, so  in  non-UTF-8  mode  \X
       matches any one character.

       Matching  characters  by Unicode property is not fast, because PCRE has
       to search a structure that contains  data  for  over  fifteen  thousand
       characters. That is why the traditional escape sequences such as \d and
       \w do not use Unicode properties in PCRE.

   Resetting the match start

       The escape sequence \K, which is a Perl 5.10 feature, causes any previ-
       ously  matched  characters  not  to  be  included  in the final matched
       sequence. For example, the pattern:

         foo\Kbar

       matches "foobar", but reports that it has matched "bar".  This  feature
       is  similar  to  a lookbehind assertion (described below).  However, in
       this case, the part of the subject before the real match does not  have
       to  be of fixed length, as lookbehind assertions do. The use of \K does
       not interfere with the setting of captured  substrings.   For  example,
       when the pattern

         (foo)\Kbar

       matches "foobar", the first substring is still set to "foo".

       Perl  documents  that  the  use  of  \K  within assertions is "not well
       defined". In PCRE, \K is acted upon  when  it  occurs  inside  positive
       assertions, but is ignored in negative assertions.

   Simple assertions

       The  final use of backslash is for certain simple assertions. An asser-
       tion specifies a condition that has to be met at a particular point  in
       a  match, without consuming any characters from the subject string. The
       use of subpatterns for more complicated assertions is described  below.
       The backslashed assertions are:

         \b     matches at a word boundary
         \B     matches when not at a word boundary
         \A     matches at the start of the subject
         \Z     matches at the end of the subject
                 also matches before a newline at the end of the subject
         \z     matches only at the end of the subject
         \G     matches at the first matching position in the subject

       These  assertions may not appear in character classes (but note that \b
       has a different meaning, namely the backspace character, inside a char-
       acter class).

       A  word  boundary is a position in the subject string where the current
       character and the previous character do not both match \w or  \W  (i.e.
       one  matches  \w  and the other matches \W), or the start or end of the
       string if the first or last character matches \w, respectively. Neither
       PCRE  nor  Perl  has a separte "start of word" or "end of word" metase-
       quence. However, whatever follows \b normally determines which  it  is.
       For example, the fragment \ba matches "a" at the start of a word.

       The  \A,  \Z,  and \z assertions differ from the traditional circumflex
       and dollar (described in the next section) in that they only ever match
       at  the  very start and end of the subject string, whatever options are
       set. Thus, they are independent of multiline mode. These  three  asser-
       tions are not affected by the PCRE_NOTBOL or PCRE_NOTEOL options, which
       affect only the behaviour of the circumflex and dollar  metacharacters.
       However,  if the startoffset argument of pcre_exec() is non-zero, indi-
       cating that matching is to start at a point other than the beginning of
       the  subject,  \A  can never match. The difference between \Z and \z is
       that \Z matches before a newline at the end of the string as well as at
       the very end, whereas \z matches only at the end.

       The  \G assertion is true only when the current matching position is at
       the start point of the match, as specified by the startoffset  argument
       of  pcre_exec().  It  differs  from \A when the value of startoffset is
       non-zero. By calling pcre_exec() multiple times with appropriate  argu-
       ments, you can mimic Perl's /g option, and it is in this kind of imple-
       mentation where \G can be useful.

       Note, however, that PCRE's interpretation of \G, as the  start  of  the
       current match, is subtly different from Perl's, which defines it as the
       end of the previous match. In Perl, these can  be  different  when  the
       previously  matched  string was empty. Because PCRE does just one match
       at a time, it cannot reproduce this behaviour.

       If all the alternatives of a pattern begin with \G, the  expression  is
       anchored to the starting match position, and the "anchored" flag is set
       in the compiled regular expression.


CIRCUMFLEX AND DOLLAR

       Outside a character class, in the default matching mode, the circumflex
       character  is  an  assertion  that is true only if the current matching
       point is at the start of the subject string. If the  startoffset  argu-
       ment  of  pcre_exec()  is  non-zero,  circumflex can never match if the
       PCRE_MULTILINE option is unset. Inside a  character  class,  circumflex
       has an entirely different meaning (see below).

       Circumflex  need  not be the first character of the pattern if a number
       of alternatives are involved, but it should be the first thing in  each
       alternative  in  which  it appears if the pattern is ever to match that
       branch. If all possible alternatives start with a circumflex, that  is,
       if  the  pattern  is constrained to match only at the start of the sub-
       ject, it is said to be an "anchored" pattern.  (There  are  also  other
       constructs that can cause a pattern to be anchored.)

       A  dollar  character  is  an assertion that is true only if the current
       matching point is at the end of  the  subject  string,  or  immediately
       before a newline at the end of the string (by default). Dollar need not
       be the last character of the pattern if a number  of  alternatives  are
       involved,  but  it  should  be  the last item in any branch in which it
       appears. Dollar has no special meaning in a character class.

       The meaning of dollar can be changed so that it  matches  only  at  the
       very  end  of  the string, by setting the PCRE_DOLLAR_ENDONLY option at
       compile time. This does not affect the \Z assertion.

       The meanings of the circumflex and dollar characters are changed if the
       PCRE_MULTILINE  option  is  set.  When  this  is the case, a circumflex
       matches immediately after internal newlines as well as at the start  of
       the  subject  string.  It  does not match after a newline that ends the
       string. A dollar matches before any newlines in the string, as well  as
       at  the very end, when PCRE_MULTILINE is set. When newline is specified
       as the two-character sequence CRLF, isolated CR and  LF  characters  do
       not indicate newlines.

       For  example, the pattern /^abc$/ matches the subject string "def\nabc"
       (where \n represents a newline) in multiline mode, but  not  otherwise.
       Consequently,  patterns  that  are anchored in single line mode because
       all branches start with ^ are not anchored in  multiline  mode,  and  a
       match  for  circumflex  is  possible  when  the startoffset argument of
       pcre_exec() is non-zero. The PCRE_DOLLAR_ENDONLY option is  ignored  if
       PCRE_MULTILINE is set.

       Note  that  the sequences \A, \Z, and \z can be used to match the start
       and end of the subject in both modes, and if all branches of a  pattern
       start  with  \A it is always anchored, whether or not PCRE_MULTILINE is
       set.


FULL STOP (PERIOD, DOT)

       Outside a character class, a dot in the pattern matches any one charac-
       ter  in  the subject string except (by default) a character that signi-
       fies the end of a line. In UTF-8 mode, the  matched  character  may  be
       more than one byte long.

       When  a line ending is defined as a single character, dot never matches
       that character; when the two-character sequence CRLF is used, dot  does
       not  match  CR  if  it  is immediately followed by LF, but otherwise it
       matches all characters (including isolated CRs and LFs). When any  Uni-
       code  line endings are being recognized, dot does not match CR or LF or
       any of the other line ending characters.

       The behaviour of dot with regard to newlines can  be  changed.  If  the
       PCRE_DOTALL  option  is  set,  a dot matches any one character, without
       exception. If the two-character sequence CRLF is present in the subject
       string, it takes two dots to match it.

       The  handling of dot is entirely independent of the handling of circum-
       flex and dollar, the only relationship being  that  they  both  involve
       newlines. Dot has no special meaning in a character class.


MATCHING A SINGLE BYTE

       Outside a character class, the escape sequence \C matches any one byte,
       both in and out of UTF-8 mode. Unlike a  dot,  it  always  matches  any
       line-ending  characters.  The  feature  is provided in Perl in order to
       match individual bytes in UTF-8 mode. Because it breaks up UTF-8  char-
       acters  into individual bytes, what remains in the string may be a mal-
       formed UTF-8 string. For this reason, the \C escape  sequence  is  best
       avoided.

       PCRE  does  not  allow \C to appear in lookbehind assertions (described
       below), because in UTF-8 mode this would make it impossible  to  calcu-
       late the length of the lookbehind.


SQUARE BRACKETS AND CHARACTER CLASSES

       An opening square bracket introduces a character class, terminated by a
       closing square bracket. A closing square bracket on its own is not spe-
       cial by default.  However, if the PCRE_JAVASCRIPT_COMPAT option is set,
       a lone closing square bracket causes a compile-time error. If a closing
       square  bracket  is required as a member of the class, it should be the
       first data character in the class  (after  an  initial  circumflex,  if
       present) or escaped with a backslash.

       A  character  class matches a single character in the subject. In UTF-8
       mode, the character may be more than one byte long. A matched character
       must be in the set of characters defined by the class, unless the first
       character in the class definition is a circumflex, in  which  case  the
       subject  character  must  not  be in the set defined by the class. If a
       circumflex is actually required as a member of the class, ensure it  is
       not the first character, or escape it with a backslash.

       For  example, the character class [aeiou] matches any lower case vowel,
       while [^aeiou] matches any character that is not a  lower  case  vowel.
       Note that a circumflex is just a convenient notation for specifying the
       characters that are in the class by enumerating those that are  not.  A
       class  that starts with a circumflex is not an assertion; it still con-
       sumes a character from the subject string, and therefore  it  fails  if
       the current pointer is at the end of the string.

       In  UTF-8 mode, characters with values greater than 255 can be included
       in a class as a literal string of bytes, or by using the  \x{  escaping
       mechanism.

       When  caseless  matching  is set, any letters in a class represent both
       their upper case and lower case versions, so for  example,  a  caseless
       [aeiou]  matches  "A"  as well as "a", and a caseless [^aeiou] does not
       match "A", whereas a caseful version would. In UTF-8 mode, PCRE  always
       understands  the  concept  of case for characters whose values are less
       than 128, so caseless matching is always possible. For characters  with
       higher  values,  the  concept  of case is supported if PCRE is compiled
       with Unicode property support, but not otherwise.  If you want  to  use
       caseless  matching  in UTF8-mode for characters 128 and above, you must
       ensure that PCRE is compiled with Unicode property support as  well  as
       with UTF-8 support.

       Characters  that  might  indicate  line breaks are never treated in any
       special way  when  matching  character  classes,  whatever  line-ending
       sequence  is  in  use,  and  whatever  setting  of  the PCRE_DOTALL and
       PCRE_MULTILINE options is used. A class such as [^a] always matches one
       of these characters.

       The  minus (hyphen) character can be used to specify a range of charac-
       ters in a character  class.  For  example,  [d-m]  matches  any  letter
       between  d  and  m,  inclusive.  If  a minus character is required in a
       class, it must be escaped with a backslash  or  appear  in  a  position
       where  it cannot be interpreted as indicating a range, typically as the
       first or last character in the class.

       It is not possible to have the literal character "]" as the end charac-
       ter  of a range. A pattern such as [W-]46] is interpreted as a class of
       two characters ("W" and "-") followed by a literal string "46]", so  it
       would  match  "W46]"  or  "-46]". However, if the "]" is escaped with a
       backslash it is interpreted as the end of range, so [W-\]46] is  inter-
       preted  as a class containing a range followed by two other characters.
       The octal or hexadecimal representation of "]" can also be used to  end
       a range.

       Ranges  operate in the collating sequence of character values. They can
       also  be  used  for  characters  specified  numerically,  for   example
       [\000-\037].  In UTF-8 mode, ranges can include characters whose values
       are greater than 255, for example [\x{100}-\x{2ff}].

       If a range that includes letters is used when caseless matching is set,
       it matches the letters in either case. For example, [W-c] is equivalent
       to [][\\^_`wxyzabc], matched caselessly,  and  in  non-UTF-8  mode,  if
       character  tables  for  a French locale are in use, [\xc8-\xcb] matches
       accented E characters in both cases. In UTF-8 mode, PCRE  supports  the
       concept  of  case for characters with values greater than 128 only when
       it is compiled with Unicode property support.

       The character types \d, \D, \p, \P, \s, \S, \w, and \W may also  appear
       in  a  character  class,  and add the characters that they match to the
       class. For example, [\dABCDEF] matches any hexadecimal digit. A circum-
       flex  can  conveniently  be used with the upper case character types to
       specify a more restricted set of characters  than  the  matching  lower
       case  type.  For example, the class [^\W_] matches any letter or digit,
       but not underscore.

       The only metacharacters that are recognized in  character  classes  are
       backslash,  hyphen  (only  where  it can be interpreted as specifying a
       range), circumflex (only at the start), opening  square  bracket  (only
       when  it can be interpreted as introducing a POSIX class name - see the
       next section), and the terminating  closing  square  bracket.  However,
       escaping other non-alphanumeric characters does no harm.


POSIX CHARACTER CLASSES

       Perl supports the POSIX notation for character classes. This uses names
       enclosed by [: and :] within the enclosing square brackets.  PCRE  also
       supports this notation. For example,

         [01[:alpha:]%]

       matches "0", "1", any alphabetic character, or "%". The supported class
       names are

         alnum    letters and digits
         alpha    letters
         ascii    character codes 0 - 127
         blank    space or tab only
         cntrl    control characters
         digit    decimal digits (same as \d)
         graph    printing characters, excluding space
         lower    lower case letters
         print    printing characters, including space
         punct    printing characters, excluding letters and digits
         space    white space (not quite the same as \s)
         upper    upper case letters
         word     "word" characters (same as \w)
         xdigit   hexadecimal digits

       The "space" characters are HT (9), LF (10), VT (11), FF (12), CR  (13),
       and  space  (32). Notice that this list includes the VT character (code
       11). This makes "space" different to \s, which does not include VT (for
       Perl compatibility).

       The  name  "word"  is  a Perl extension, and "blank" is a GNU extension
       from Perl 5.8. Another Perl extension is negation, which  is  indicated
       by a ^ character after the colon. For example,

         [12[:^digit:]]

       matches  "1", "2", or any non-digit. PCRE (and Perl) also recognize the
       POSIX syntax [.ch.] and [=ch=] where "ch" is a "collating element", but
       these are not supported, and an error is given if they are encountered.

       In UTF-8 mode, characters with values greater than 128 do not match any
       of the POSIX character classes.


VERTICAL BAR

       Vertical bar characters are used to separate alternative patterns.  For
       example, the pattern

         gilbert|sullivan

       matches  either "gilbert" or "sullivan". Any number of alternatives may
       appear, and an empty  alternative  is  permitted  (matching  the  empty
       string). The matching process tries each alternative in turn, from left
       to right, and the first one that succeeds is used. If the  alternatives
       are  within a subpattern (defined below), "succeeds" means matching the
       rest of the main pattern as well as the alternative in the subpattern.


INTERNAL OPTION SETTING

       The settings of the  PCRE_CASELESS,  PCRE_MULTILINE,  PCRE_DOTALL,  and
       PCRE_EXTENDED  options  (which are Perl-compatible) can be changed from
       within the pattern by  a  sequence  of  Perl  option  letters  enclosed
       between "(?" and ")".  The option letters are

         i  for PCRE_CASELESS
         m  for PCRE_MULTILINE
         s  for PCRE_DOTALL
         x  for PCRE_EXTENDED

       For example, (?im) sets caseless, multiline matching. It is also possi-
       ble to unset these options by preceding the letter with a hyphen, and a
       combined  setting and unsetting such as (?im-sx), which sets PCRE_CASE-
       LESS and PCRE_MULTILINE while unsetting PCRE_DOTALL and  PCRE_EXTENDED,
       is  also  permitted.  If  a  letter  appears  both before and after the
       hyphen, the option is unset.

       The PCRE-specific options PCRE_DUPNAMES, PCRE_UNGREEDY, and  PCRE_EXTRA
       can  be changed in the same way as the Perl-compatible options by using
       the characters J, U and X respectively.

       When one of these option changes occurs at  top  level  (that  is,  not
       inside  subpattern parentheses), the change applies to the remainder of
       the pattern that follows. If the change is placed right at the start of
       a pattern, PCRE extracts it into the global options (and it will there-
       fore show up in data extracted by the pcre_fullinfo() function).

       An option change within a subpattern (see below for  a  description  of
       subpatterns) affects only that part of the current pattern that follows
       it, so

         (a(?i)b)c

       matches abc and aBc and no other strings (assuming PCRE_CASELESS is not
       used).   By  this means, options can be made to have different settings
       in different parts of the pattern. Any changes made in one  alternative
       do  carry  on  into subsequent branches within the same subpattern. For
       example,

         (a(?i)b|c)

       matches "ab", "aB", "c", and "C", even though  when  matching  "C"  the
       first  branch  is  abandoned before the option setting. This is because
       the effects of option settings happen at compile time. There  would  be
       some very weird behaviour otherwise.

       Note:  There  are  other  PCRE-specific  options that can be set by the
       application when the compile or match functions  are  called.  In  some
       cases the pattern can contain special leading sequences such as (*CRLF)
       to override what the application has set or what  has  been  defaulted.
       Details  are  given  in the section entitled "Newline sequences" above.
       There is also the (*UTF8) leading sequence that  can  be  used  to  set
       UTF-8 mode; this is equivalent to setting the PCRE_UTF8 option.


SUBPATTERNS

       Subpatterns are delimited by parentheses (round brackets), which can be
       nested.  Turning part of a pattern into a subpattern does two things:

       1. It localizes a set of alternatives. For example, the pattern

         cat(aract|erpillar|)

       matches one of the words "cat", "cataract", or  "caterpillar".  Without
       the  parentheses,  it  would  match  "cataract", "erpillar" or an empty
       string.

       2. It sets up the subpattern as  a  capturing  subpattern.  This  means
       that,  when  the  whole  pattern  matches,  that portion of the subject
       string that matched the subpattern is passed back to the caller via the
       ovector  argument  of pcre_exec(). Opening parentheses are counted from
       left to right (starting from 1) to obtain  numbers  for  the  capturing
       subpatterns.

       For  example,  if the string "the red king" is matched against the pat-
       tern

         the ((red|white) (king|queen))

       the captured substrings are "red king", "red", and "king", and are num-
       bered 1, 2, and 3, respectively.

       The  fact  that  plain  parentheses  fulfil two functions is not always
       helpful.  There are often times when a grouping subpattern is  required
       without  a capturing requirement. If an opening parenthesis is followed
       by a question mark and a colon, the subpattern does not do any  captur-
       ing,  and  is  not  counted when computing the number of any subsequent
       capturing subpatterns. For example, if the string "the white queen"  is
       matched against the pattern

         the ((?:red|white) (king|queen))

       the captured substrings are "white queen" and "queen", and are numbered
       1 and 2. The maximum number of capturing subpatterns is 65535.

       As a convenient shorthand, if any option settings are required  at  the
       start  of  a  non-capturing  subpattern,  the option letters may appear
       between the "?" and the ":". Thus the two patterns

         (?i:saturday|sunday)
         (?:(?i)saturday|sunday)

       match exactly the same set of strings. Because alternative branches are
       tried  from  left  to right, and options are not reset until the end of
       the subpattern is reached, an option setting in one branch does  affect
       subsequent  branches,  so  the above patterns match "SUNDAY" as well as
       "Saturday".


DUPLICATE SUBPATTERN NUMBERS

       Perl 5.10 introduced a feature whereby each alternative in a subpattern
       uses  the same numbers for its capturing parentheses. Such a subpattern
       starts with (?| and is itself a non-capturing subpattern. For  example,
       consider this pattern:

         (?|(Sat)ur|(Sun))day

       Because  the two alternatives are inside a (?| group, both sets of cap-
       turing parentheses are numbered one. Thus, when  the  pattern  matches,
       you  can  look  at captured substring number one, whichever alternative
       matched. This construct is useful when you want to  capture  part,  but
       not all, of one of a number of alternatives. Inside a (?| group, paren-
       theses are numbered as usual, but the number is reset at the  start  of
       each  branch. The numbers of any capturing buffers that follow the sub-
       pattern start after the highest number used in any branch. The  follow-
       ing  example  is taken from the Perl documentation.  The numbers under-
       neath show in which buffer the captured content will be stored.

         # before  ---------------branch-reset----------- after
         / ( a )  (?| x ( y ) z | (p (q) r) | (t) u (v) ) ( z ) /x
         # 1            2         2  3        2     3     4

       A back reference to a numbered subpattern uses the  most  recent  value
       that  is  set  for that number by any subpattern. The following pattern
       matches "abcabc" or "defdef":

         /(?|(abc)|(def))\1/

       In contrast, a recursive or "subroutine" call to a numbered  subpattern
       always  refers  to  the first one in the pattern with the given number.
       The following pattern matches "abcabc" or "defabc":

         /(?|(abc)|(def))(?1)/

       If a condition test for a subpattern's having matched refers to a  non-
       unique  number, the test is true if any of the subpatterns of that num-
       ber have matched.

       An alternative approach to using this "branch reset" feature is to  use
       duplicate named subpatterns, as described in the next section.


NAMED SUBPATTERNS

       Identifying  capturing  parentheses  by number is simple, but it can be
       very hard to keep track of the numbers in complicated  regular  expres-
       sions.  Furthermore,  if  an  expression  is  modified, the numbers may
       change. To help with this difficulty, PCRE supports the naming of  sub-
       patterns. This feature was not added to Perl until release 5.10. Python
       had the feature earlier, and PCRE introduced it at release  4.0,  using
       the  Python syntax. PCRE now supports both the Perl and the Python syn-
       tax. Perl allows identically numbered  subpatterns  to  have  different
       names, but PCRE does not.

       In  PCRE,  a subpattern can be named in one of three ways: (?<name>...)
       or (?'name'...) as in Perl, or (?P<name>...) as in  Python.  References
       to  capturing parentheses from other parts of the pattern, such as back
       references, recursion, and conditions, can be made by name as  well  as
       by number.

       Names  consist  of  up  to  32 alphanumeric characters and underscores.
       Named capturing parentheses are still  allocated  numbers  as  well  as
       names,  exactly as if the names were not present. The PCRE API provides
       function calls for extracting the name-to-number translation table from
       a compiled pattern. There is also a convenience function for extracting
       a captured substring by name.

       By default, a name must be unique within a pattern, but it is  possible
       to relax this constraint by setting the PCRE_DUPNAMES option at compile
       time. (Duplicate names are also always permitted for  subpatterns  with
       the  same  number, set up as described in the previous section.) Dupli-
       cate names can be useful for patterns where only one  instance  of  the
       named  parentheses  can  match. Suppose you want to match the name of a
       weekday, either as a 3-letter abbreviation or as the full name, and  in
       both cases you want to extract the abbreviation. This pattern (ignoring
       the line breaks) does the job:

         (?<DN>Mon|Fri|Sun)(?:day)?|
         (?<DN>Tue)(?:sday)?|
         (?<DN>Wed)(?:nesday)?|
         (?<DN>Thu)(?:rsday)?|
         (?<DN>Sat)(?:urday)?

       There are five capturing substrings, but only one is ever set  after  a
       match.  (An alternative way of solving this problem is to use a "branch
       reset" subpattern, as described in the previous section.)

       The convenience function for extracting the data by  name  returns  the
       substring  for  the first (and in this example, the only) subpattern of
       that name that matched. This saves searching  to  find  which  numbered
       subpattern it was.

       If  you  make  a  back  reference to a non-unique named subpattern from
       elsewhere in the pattern, the one that corresponds to the first  occur-
       rence of the name is used. In the absence of duplicate numbers (see the
       previous section) this is the one with the lowest number. If you use  a
       named  reference  in a condition test (see the section about conditions
       below), either to check whether a subpattern has matched, or  to  check
       for  recursion,  all  subpatterns with the same name are tested. If the
       condition is true for any one of them, the overall condition  is  true.
       This is the same behaviour as testing by number. For further details of
       the interfaces for handling named subpatterns, see the pcreapi documen-
       tation.

       Warning: You cannot use different names to distinguish between two sub-
       patterns with the same number because PCRE uses only the  numbers  when
       matching. For this reason, an error is given at compile time if differ-
       ent names are given to subpatterns with the same number.  However,  you
       can  give  the same name to subpatterns with the same number, even when
       PCRE_DUPNAMES is not set.


REPETITION

       Repetition is specified by quantifiers, which can  follow  any  of  the
       following items:

         a literal data character
         the dot metacharacter
         the \C escape sequence
         the \X escape sequence (in UTF-8 mode with Unicode properties)
         the \R escape sequence
         an escape such as \d that matches a single character
         a character class
         a back reference (see next section)
         a parenthesized subpattern (unless it is an assertion)
         a recursive or "subroutine" call to a subpattern

       The  general repetition quantifier specifies a minimum and maximum num-
       ber of permitted matches, by giving the two numbers in  curly  brackets
       (braces),  separated  by  a comma. The numbers must be less than 65536,
       and the first must be less than or equal to the second. For example:

         z{2,4}

       matches "zz", "zzz", or "zzzz". A closing brace on its  own  is  not  a
       special  character.  If  the second number is omitted, but the comma is
       present, there is no upper limit; if the second number  and  the  comma
       are  both omitted, the quantifier specifies an exact number of required
       matches. Thus

         [aeiou]{3,}

       matches at least 3 successive vowels, but may match many more, while

         \d{8}

       matches exactly 8 digits. An opening curly bracket that  appears  in  a
       position  where a quantifier is not allowed, or one that does not match
       the syntax of a quantifier, is taken as a literal character. For  exam-
       ple, {,6} is not a quantifier, but a literal string of four characters.

       In  UTF-8  mode,  quantifiers  apply to UTF-8 characters rather than to
       individual bytes. Thus, for example, \x{100}{2} matches two UTF-8 char-
       acters, each of which is represented by a two-byte sequence. Similarly,
       when Unicode property support is available, \X{3} matches three Unicode
       extended  sequences,  each of which may be several bytes long (and they
       may be of different lengths).

       The quantifier {0} is permitted, causing the expression to behave as if
       the previous item and the quantifier were not present. This may be use-
       ful for subpatterns that are referenced as subroutines  from  elsewhere
       in the pattern. Items other than subpatterns that have a {0} quantifier
       are omitted from the compiled pattern.

       For convenience, the three most common quantifiers have  single-charac-
       ter abbreviations:

         *    is equivalent to {0,}
         +    is equivalent to {1,}
         ?    is equivalent to {0,1}

       It  is  possible  to construct infinite loops by following a subpattern
       that can match no characters with a quantifier that has no upper limit,
       for example:

         (a?)*

       Earlier versions of Perl and PCRE used to give an error at compile time
       for such patterns. However, because there are cases where this  can  be
       useful,  such  patterns  are now accepted, but if any repetition of the
       subpattern does in fact match no characters, the loop is forcibly  bro-
       ken.

       By  default,  the quantifiers are "greedy", that is, they match as much
       as possible (up to the maximum  number  of  permitted  times),  without
       causing  the  rest of the pattern to fail. The classic example of where
       this gives problems is in trying to match comments in C programs. These
       appear  between  /*  and  */ and within the comment, individual * and /
       characters may appear. An attempt to match C comments by  applying  the
       pattern

         /\*.*\*/

       to the string

         /* first comment */  not comment  /* second comment */

       fails,  because it matches the entire string owing to the greediness of
       the .*  item.

       However, if a quantifier is followed by a question mark, it  ceases  to
       be greedy, and instead matches the minimum number of times possible, so
       the pattern

         /\*.*?\*/

       does the right thing with the C comments. The meaning  of  the  various
       quantifiers  is  not  otherwise  changed,  just the preferred number of
       matches.  Do not confuse this use of question mark with its  use  as  a
       quantifier  in its own right. Because it has two uses, it can sometimes
       appear doubled, as in

         \d??\d

       which matches one digit by preference, but can match two if that is the
       only way the rest of the pattern matches.

       If  the PCRE_UNGREEDY option is set (an option that is not available in
       Perl), the quantifiers are not greedy by default, but  individual  ones
       can  be  made  greedy  by following them with a question mark. In other
       words, it inverts the default behaviour.

       When a parenthesized subpattern is quantified  with  a  minimum  repeat
       count  that is greater than 1 or with a limited maximum, more memory is
       required for the compiled pattern, in proportion to  the  size  of  the
       minimum or maximum.

       If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equiv-
       alent to Perl's /s) is set, thus allowing the dot  to  match  newlines,
       the  pattern  is  implicitly anchored, because whatever follows will be
       tried against every character position in the subject string, so  there
       is  no  point  in  retrying the overall match at any position after the
       first. PCRE normally treats such a pattern as though it  were  preceded
       by \A.

       In  cases  where  it  is known that the subject string contains no new-
       lines, it is worth setting PCRE_DOTALL in order to  obtain  this  opti-
       mization, or alternatively using ^ to indicate anchoring explicitly.

       However,  there is one situation where the optimization cannot be used.
       When .*  is inside capturing parentheses that are the subject of a back
       reference elsewhere in the pattern, a match at the start may fail where
       a later one succeeds. Consider, for example:

         (.*)abc\1

       If the subject is "xyz123abc123" the match point is the fourth  charac-
       ter. For this reason, such a pattern is not implicitly anchored.

       When a capturing subpattern is repeated, the value captured is the sub-
       string that matched the final iteration. For example, after

         (tweedle[dume]{3}\s*)+

       has matched "tweedledum tweedledee" the value of the captured substring
       is  "tweedledee".  However,  if there are nested capturing subpatterns,
       the corresponding captured values may have been set in previous  itera-
       tions. For example, after

         /(a|(b))+/

       matches "aba" the value of the second captured substring is "b".


ATOMIC GROUPING AND POSSESSIVE QUANTIFIERS

       With  both  maximizing ("greedy") and minimizing ("ungreedy" or "lazy")
       repetition, failure of what follows normally causes the  repeated  item
       to  be  re-evaluated to see if a different number of repeats allows the
       rest of the pattern to match. Sometimes it is useful to  prevent  this,
       either  to  change the nature of the match, or to cause it fail earlier
       than it otherwise might, when the author of the pattern knows there  is
       no point in carrying on.

       Consider,  for  example, the pattern \d+foo when applied to the subject
       line

         123456bar

       After matching all 6 digits and then failing to match "foo", the normal
       action  of  the matcher is to try again with only 5 digits matching the
       \d+ item, and then with  4,  and  so  on,  before  ultimately  failing.
       "Atomic  grouping"  (a  term taken from Jeffrey Friedl's book) provides
       the means for specifying that once a subpattern has matched, it is  not
       to be re-evaluated in this way.

       If  we  use atomic grouping for the previous example, the matcher gives
       up immediately on failing to match "foo" the first time.  The  notation
       is a kind of special parenthesis, starting with (?> as in this example:

         (?>\d+)foo

       This  kind  of  parenthesis "locks up" the  part of the pattern it con-
       tains once it has matched, and a failure further into  the  pattern  is
       prevented  from  backtracking into it. Backtracking past it to previous
       items, however, works as normal.

       An alternative description is that a subpattern of  this  type  matches
       the  string  of  characters  that an identical standalone pattern would
       match, if anchored at the current point in the subject string.

       Atomic grouping subpatterns are not capturing subpatterns. Simple cases
       such as the above example can be thought of as a maximizing repeat that
       must swallow everything it can. So, while both \d+ and  \d+?  are  pre-
       pared  to  adjust  the number of digits they match in order to make the
       rest of the pattern match, (?>\d+) can only match an entire sequence of
       digits.

       Atomic  groups in general can of course contain arbitrarily complicated
       subpatterns, and can be nested. However, when  the  subpattern  for  an
       atomic group is just a single repeated item, as in the example above, a
       simpler notation, called a "possessive quantifier" can  be  used.  This
       consists  of  an  additional  + character following a quantifier. Using
       this notation, the previous example can be rewritten as

         \d++foo

       Note that a possessive quantifier can be used with an entire group, for
       example:

         (abc|xyz){2,3}+

       Possessive   quantifiers   are   always  greedy;  the  setting  of  the
       PCRE_UNGREEDY option is ignored. They are a convenient notation for the
       simpler  forms  of atomic group. However, there is no difference in the
       meaning of a possessive quantifier and  the  equivalent  atomic  group,
       though  there  may  be a performance difference; possessive quantifiers
       should be slightly faster.

       The possessive quantifier syntax is an extension to the Perl  5.8  syn-
       tax.   Jeffrey  Friedl  originated the idea (and the name) in the first
       edition of his book. Mike McCloskey liked it, so implemented it when he
       built  Sun's Java package, and PCRE copied it from there. It ultimately
       found its way into Perl at release 5.10.

       PCRE has an optimization that automatically "possessifies" certain sim-
       ple  pattern  constructs.  For  example, the sequence A+B is treated as
       A++B because there is no point in backtracking into a sequence  of  A's
       when B must follow.

       When  a  pattern  contains an unlimited repeat inside a subpattern that
       can itself be repeated an unlimited number of  times,  the  use  of  an
       atomic  group  is  the  only way to avoid some failing matches taking a
       very long time indeed. The pattern

         (\D+|<\d+>)*[!?]

       matches an unlimited number of substrings that either consist  of  non-
       digits,  or  digits  enclosed in <>, followed by either ! or ?. When it
       matches, it runs quickly. However, if it is applied to

         aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

       it takes a long time before reporting  failure.  This  is  because  the
       string  can be divided between the internal \D+ repeat and the external
       * repeat in a large number of ways, and all  have  to  be  tried.  (The
       example  uses  [!?]  rather than a single character at the end, because
       both PCRE and Perl have an optimization that allows  for  fast  failure
       when  a single character is used. They remember the last single charac-
       ter that is required for a match, and fail early if it is  not  present
       in  the  string.)  If  the pattern is changed so that it uses an atomic
       group, like this:

         ((?>\D+)|<\d+>)*[!?]

       sequences of non-digits cannot be broken, and failure happens quickly.


BACK REFERENCES

       Outside a character class, a backslash followed by a digit greater than
       0 (and possibly further digits) is a back reference to a capturing sub-
       pattern earlier (that is, to its left) in the pattern,  provided  there
       have been that many previous capturing left parentheses.

       However, if the decimal number following the backslash is less than 10,
       it is always taken as a back reference, and causes  an  error  only  if
       there  are  not that many capturing left parentheses in the entire pat-
       tern. In other words, the parentheses that are referenced need  not  be
       to  the left of the reference for numbers less than 10. A "forward back
       reference" of this type can make sense when a  repetition  is  involved
       and  the  subpattern to the right has participated in an earlier itera-
       tion.

       It is not possible to have a numerical "forward back  reference"  to  a
       subpattern  whose  number  is  10  or  more using this syntax because a
       sequence such as \50 is interpreted as a character  defined  in  octal.
       See the subsection entitled "Non-printing characters" above for further
       details of the handling of digits following a backslash.  There  is  no
       such  problem  when named parentheses are used. A back reference to any
       subpattern is possible using named parentheses (see below).

       Another way of avoiding the ambiguity inherent in  the  use  of  digits
       following a backslash is to use the \g escape sequence, which is a fea-
       ture introduced in Perl 5.10.  This  escape  must  be  followed  by  an
       unsigned  number  or  a negative number, optionally enclosed in braces.
       These examples are all identical:

         (ring), \1
         (ring), \g1
         (ring), \g{1}

       An unsigned number specifies an absolute reference without the  ambigu-
       ity that is present in the older syntax. It is also useful when literal
       digits follow the reference. A negative number is a relative reference.
       Consider this example:

         (abc(def)ghi)\g{-1}

       The sequence \g{-1} is a reference to the most recently started captur-
       ing subpattern before \g, that is, is it equivalent to  \2.  Similarly,
       \g{-2} would be equivalent to \1. The use of relative references can be
       helpful in long patterns, and also in  patterns  that  are  created  by
       joining together fragments that contain references within themselves.

       A  back  reference matches whatever actually matched the capturing sub-
       pattern in the current subject string, rather  than  anything  matching
       the subpattern itself (see "Subpatterns as subroutines" below for a way
       of doing that). So the pattern

         (sens|respons)e and \1ibility

       matches "sense and sensibility" and "response and responsibility",  but
       not  "sense and responsibility". If caseful matching is in force at the
       time of the back reference, the case of letters is relevant. For  exam-
       ple,

         ((?i)rah)\s+\1

       matches  "rah  rah"  and  "RAH RAH", but not "RAH rah", even though the
       original capturing subpattern is matched caselessly.

       There are several different ways of writing back  references  to  named
       subpatterns.  The  .NET syntax \k{name} and the Perl syntax \k<name> or
       \k'name' are supported, as is the Python syntax (?P=name). Perl  5.10's
       unified back reference syntax, in which \g can be used for both numeric
       and named references, is also supported. We  could  rewrite  the  above
       example in any of the following ways:

         (?<p1>(?i)rah)\s+\k<p1>
         (?'p1'(?i)rah)\s+\k{p1}
         (?P<p1>(?i)rah)\s+(?P=p1)
         (?<p1>(?i)rah)\s+\g{p1}

       A  subpattern  that  is  referenced  by  name may appear in the pattern
       before or after the reference.

       There may be more than one back reference to the same subpattern. If  a
       subpattern  has  not actually been used in a particular match, any back
       references to it always fail by default. For example, the pattern

         (a|(bc))\2

       always fails if it starts to match "a" rather than  "bc".  However,  if
       the PCRE_JAVASCRIPT_COMPAT option is set at compile time, a back refer-
       ence to an unset value matches an empty string.

       Because there may be many capturing parentheses in a pattern, all  dig-
       its  following a backslash are taken as part of a potential back refer-
       ence number.  If the pattern continues with  a  digit  character,  some
       delimiter  must  be  used  to  terminate  the  back  reference.  If the
       PCRE_EXTENDED option is set, this can be whitespace. Otherwise, the \g{
       syntax or an empty comment (see "Comments" below) can be used.

   Recursive back references

       A  back reference that occurs inside the parentheses to which it refers
       fails when the subpattern is first used, so, for example,  (a\1)  never
       matches.   However,  such references can be useful inside repeated sub-
       patterns. For example, the pattern

         (a|b\1)+

       matches any number of "a"s and also "aba", "ababbaa" etc. At each iter-
       ation  of  the  subpattern,  the  back  reference matches the character
       string corresponding to the previous iteration. In order  for  this  to
       work,  the  pattern must be such that the first iteration does not need
       to match the back reference. This can be done using alternation, as  in
       the example above, or by a quantifier with a minimum of zero.

       Back  references of this type cause the group that they reference to be
       treated as an atomic group.  Once the whole group has been  matched,  a
       subsequent  matching  failure cannot cause backtracking into the middle
       of the group.


ASSERTIONS

       An assertion is a test on the characters  following  or  preceding  the
       current  matching  point that does not actually consume any characters.
       The simple assertions coded as \b, \B, \A, \G, \Z,  \z,  ^  and  $  are
       described above.

       More  complicated  assertions  are  coded as subpatterns. There are two
       kinds: those that look ahead of the current  position  in  the  subject
       string,  and  those  that  look  behind  it. An assertion subpattern is
       matched in the normal way, except that it does not  cause  the  current
       matching position to be changed.

       Assertion  subpatterns  are  not  capturing subpatterns, and may not be
       repeated, because it makes no sense to assert the  same  thing  several
       times.  If  any kind of assertion contains capturing subpatterns within
       it, these are counted for the purposes of numbering the capturing  sub-
       patterns in the whole pattern.  However, substring capturing is carried
       out only for positive assertions, because it does not  make  sense  for
       negative assertions.

   Lookahead assertions

       Lookahead assertions start with (?= for positive assertions and (?! for
       negative assertions. For example,

         \w+(?=;)

       matches a word followed by a semicolon, but does not include the  semi-
       colon in the match, and

         foo(?!bar)

       matches  any  occurrence  of  "foo" that is not followed by "bar". Note
       that the apparently similar pattern

         (?!foo)bar

       does not find an occurrence of "bar"  that  is  preceded  by  something
       other  than "foo"; it finds any occurrence of "bar" whatsoever, because
       the assertion (?!foo) is always true when the next three characters are
       "bar". A lookbehind assertion is needed to achieve the other effect.

       If you want to force a matching failure at some point in a pattern, the
       most convenient way to do it is  with  (?!)  because  an  empty  string
       always  matches, so an assertion that requires there not to be an empty
       string must always fail.   The  Perl  5.10  backtracking  control  verb
       (*FAIL) or (*F) is essentially a synonym for (?!).

   Lookbehind assertions

       Lookbehind  assertions start with (?<= for positive assertions and (?<!
       for negative assertions. For example,

         (?<!foo)bar

       does find an occurrence of "bar" that is not  preceded  by  "foo".  The
       contents  of  a  lookbehind  assertion are restricted such that all the
       strings it matches must have a fixed length. However, if there are sev-
       eral  top-level  alternatives,  they  do  not all have to have the same
       fixed length. Thus

         (?<=bullock|donkey)

       is permitted, but

         (?<!dogs?|cats?)

       causes an error at compile time. Branches that match  different  length
       strings  are permitted only at the top level of a lookbehind assertion.
       This is an extension compared with Perl (5.8 and 5.10), which  requires
       all branches to match the same length of string. An assertion such as

         (?<=ab(c|de))

       is  not  permitted,  because  its single top-level branch can match two
       different lengths, but it is acceptable to PCRE if rewritten to use two
       top-level branches:

         (?<=abc|abde)

       In some cases, the Perl 5.10 escape sequence \K (see above) can be used
       instead of  a  lookbehind  assertion  to  get  round  the  fixed-length
       restriction.

       The  implementation  of lookbehind assertions is, for each alternative,
       to temporarily move the current position back by the fixed  length  and
       then try to match. If there are insufficient characters before the cur-
       rent position, the assertion fails.

       PCRE does not allow the \C escape (which matches a single byte in UTF-8
       mode)  to appear in lookbehind assertions, because it makes it impossi-
       ble to calculate the length of the lookbehind. The \X and  \R  escapes,
       which can match different numbers of bytes, are also not permitted.

       "Subroutine"  calls  (see below) such as (?2) or (?&X) are permitted in
       lookbehinds, as long as the subpattern matches a  fixed-length  string.
       Recursion, however, is not supported.

       Possessive  quantifiers  can  be  used  in  conjunction with lookbehind
       assertions to specify efficient matching of fixed-length strings at the
       end of subject strings. Consider a simple pattern such as

         abcd$

       when  applied  to  a  long string that does not match. Because matching
       proceeds from left to right, PCRE will look for each "a" in the subject
       and  then  see  if what follows matches the rest of the pattern. If the
       pattern is specified as

         ^.*abcd$

       the initial .* matches the entire string at first, but when this  fails
       (because there is no following "a"), it backtracks to match all but the
       last character, then all but the last two characters, and so  on.  Once
       again  the search for "a" covers the entire string, from right to left,
       so we are no better off. However, if the pattern is written as

         ^.*+(?<=abcd)

       there can be no backtracking for the .*+ item; it can  match  only  the
       entire  string.  The subsequent lookbehind assertion does a single test
       on the last four characters. If it fails, the match fails  immediately.
       For  long  strings, this approach makes a significant difference to the
       processing time.

   Using multiple assertions

       Several assertions (of any sort) may occur in succession. For example,

         (?<=\d{3})(?<!999)foo

       matches "foo" preceded by three digits that are not "999". Notice  that
       each  of  the  assertions is applied independently at the same point in
       the subject string. First there is a  check  that  the  previous  three
       characters  are  all  digits,  and  then there is a check that the same
       three characters are not "999".  This pattern does not match "foo" pre-
       ceded  by  six  characters,  the first of which are digits and the last
       three of which are not "999". For example, it  doesn't  match  "123abc-
       foo". A pattern to do that is

         (?<=\d{3}...)(?<!999)foo

       This  time  the  first assertion looks at the preceding six characters,
       checking that the first three are digits, and then the second assertion
       checks that the preceding three characters are not "999".

       Assertions can be nested in any combination. For example,

         (?<=(?<!foo)bar)baz

       matches  an occurrence of "baz" that is preceded by "bar" which in turn
       is not preceded by "foo", while

         (?<=\d{3}(?!999)...)foo

       is another pattern that matches "foo" preceded by three digits and  any
       three characters that are not "999".


CONDITIONAL SUBPATTERNS

       It  is possible to cause the matching process to obey a subpattern con-
       ditionally or to choose between two alternative subpatterns,  depending
       on  the result of an assertion, or whether a specific capturing subpat-
       tern has already been matched. The two possible  forms  of  conditional
       subpattern are:

         (?(condition)yes-pattern)
         (?(condition)yes-pattern|no-pattern)

       If  the  condition is satisfied, the yes-pattern is used; otherwise the
       no-pattern (if present) is used. If there are more  than  two  alterna-
       tives in the subpattern, a compile-time error occurs.

       There  are  four  kinds of condition: references to subpatterns, refer-
       ences to recursion, a pseudo-condition called DEFINE, and assertions.

   Checking for a used subpattern by number

       If the text between the parentheses consists of a sequence  of  digits,
       the condition is true if a capturing subpattern of that number has pre-
       viously matched. If there is more than one  capturing  subpattern  with
       the  same  number  (see  the earlier section about duplicate subpattern
       numbers), the condition is true if any of them have been set. An alter-
       native  notation is to precede the digits with a plus or minus sign. In
       this case, the subpattern number is relative rather than absolute.  The
       most  recently opened parentheses can be referenced by (?(-1), the next
       most recent by (?(-2), and so on. In looping  constructs  it  can  also
       make  sense  to  refer  to  subsequent  groups  with constructs such as
       (?(+2).

       Consider the following pattern, which  contains  non-significant  white
       space to make it more readable (assume the PCRE_EXTENDED option) and to
       divide it into three parts for ease of discussion:

         ( \( )?    [^()]+    (?(1) \) )

       The first part matches an optional opening  parenthesis,  and  if  that
       character is present, sets it as the first captured substring. The sec-
       ond part matches one or more characters that are not  parentheses.  The
       third part is a conditional subpattern that tests whether the first set
       of parentheses matched or not. If they did, that is, if subject started
       with an opening parenthesis, the condition is true, and so the yes-pat-
       tern is executed and a  closing  parenthesis  is  required.  Otherwise,
       since  no-pattern  is  not  present, the subpattern matches nothing. In
       other words,  this  pattern  matches  a  sequence  of  non-parentheses,
       optionally enclosed in parentheses.

       If  you  were  embedding  this pattern in a larger one, you could use a
       relative reference:

         ...other stuff... ( \( )?    [^()]+    (?(-1) \) ) ...

       This makes the fragment independent of the parentheses  in  the  larger
       pattern.

   Checking for a used subpattern by name

       Perl  uses  the  syntax  (?(<name>)...) or (?('name')...) to test for a
       used subpattern by name. For compatibility  with  earlier  versions  of
       PCRE,  which  had this facility before Perl, the syntax (?(name)...) is
       also recognized. However, there is a possible ambiguity with this  syn-
       tax,  because  subpattern  names  may  consist entirely of digits. PCRE
       looks first for a named subpattern; if it cannot find one and the  name
       consists  entirely  of digits, PCRE looks for a subpattern of that num-
       ber, which must be greater than zero. Using subpattern names that  con-
       sist entirely of digits is not recommended.

       Rewriting the above example to use a named subpattern gives this:

         (?<OPEN> \( )?    [^()]+    (?(<OPEN>) \) )

       If  the  name used in a condition of this kind is a duplicate, the test
       is applied to all subpatterns of the same name, and is true if any  one
       of them has matched.

   Checking for pattern recursion

       If the condition is the string (R), and there is no subpattern with the
       name R, the condition is true if a recursive call to the whole  pattern
       or any subpattern has been made. If digits or a name preceded by amper-
       sand follow the letter R, for example:

         (?(R3)...) or (?(R&name)...)

       the condition is true if the most recent recursion is into a subpattern
       whose number or name is given. This condition does not check the entire
       recursion stack. If the name used in a condition  of  this  kind  is  a
       duplicate, the test is applied to all subpatterns of the same name, and
       is true if any one of them is the most recent recursion.

       At "top level", all these recursion test  conditions  are  false.   The
       syntax for recursive patterns is described below.

   Defining subpatterns for use by reference only

       If  the  condition  is  the string (DEFINE), and there is no subpattern
       with the name DEFINE, the condition is  always  false.  In  this  case,
       there  may  be  only  one  alternative  in the subpattern. It is always
       skipped if control reaches this point  in  the  pattern;  the  idea  of
       DEFINE  is that it can be used to define "subroutines" that can be ref-
       erenced from elsewhere. (The use of "subroutines" is described  below.)
       For  example,  a pattern to match an IPv4 address could be written like
       this (ignore whitespace and line breaks):

         (?(DEFINE) (?<byte> 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) )
         \b (?&byte) (\.(?&byte)){3} \b

       The first part of the pattern is a DEFINE group inside which a  another
       group  named "byte" is defined. This matches an individual component of
       an IPv4 address (a number less than 256). When  matching  takes  place,
       this  part  of  the pattern is skipped because DEFINE acts like a false
       condition. The rest of the pattern uses references to the  named  group
       to  match the four dot-separated components of an IPv4 address, insist-
       ing on a word boundary at each end.

   Assertion conditions

       If the condition is not in any of the above  formats,  it  must  be  an
       assertion.   This may be a positive or negative lookahead or lookbehind
       assertion. Consider  this  pattern,  again  containing  non-significant
       white space, and with the two alternatives on the second line:

         (?(?=[^a-z]*[a-z])
         \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )

       The  condition  is  a  positive  lookahead  assertion  that  matches an
       optional sequence of non-letters followed by a letter. In other  words,
       it  tests  for the presence of at least one letter in the subject. If a
       letter is found, the subject is matched against the first  alternative;
       otherwise  it  is  matched  against  the  second.  This pattern matches
       strings in one of the two forms dd-aaa-dd or dd-dd-dd,  where  aaa  are
       letters and dd are digits.


COMMENTS

       The  sequence (?# marks the start of a comment that continues up to the
       next closing parenthesis. Nested parentheses  are  not  permitted.  The
       characters  that make up a comment play no part in the pattern matching
       at all.

       If the PCRE_EXTENDED option is set, an unescaped # character outside  a
       character  class  introduces  a  comment  that continues to immediately
       after the next newline in the pattern.


RECURSIVE PATTERNS

       Consider the problem of matching a string in parentheses, allowing  for
       unlimited  nested  parentheses.  Without the use of recursion, the best
       that can be done is to use a pattern that  matches  up  to  some  fixed
       depth  of  nesting.  It  is not possible to handle an arbitrary nesting
       depth.

       For some time, Perl has provided a facility that allows regular expres-
       sions  to recurse (amongst other things). It does this by interpolating
       Perl code in the expression at run time, and the code can refer to  the
       expression itself. A Perl pattern using code interpolation to solve the
       parentheses problem can be created like this:

         $re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x;

       The (?p{...}) item interpolates Perl code at run time, and in this case
       refers recursively to the pattern in which it appears.

       Obviously, PCRE cannot support the interpolation of Perl code. Instead,
       it supports special syntax for recursion of  the  entire  pattern,  and
       also  for  individual  subpattern  recursion. After its introduction in
       PCRE and Python, this kind of  recursion  was  subsequently  introduced
       into Perl at release 5.10.

       A  special  item  that consists of (? followed by a number greater than
       zero and a closing parenthesis is a recursive call of the subpattern of
       the  given  number, provided that it occurs inside that subpattern. (If
       not, it is a "subroutine" call, which is described  in  the  next  sec-
       tion.)  The special item (?R) or (?0) is a recursive call of the entire
       regular expression.

       This PCRE pattern solves the nested  parentheses  problem  (assume  the
       PCRE_EXTENDED option is set so that white space is ignored):

         \( ( [^()]++ | (?R) )* \)

       First  it matches an opening parenthesis. Then it matches any number of
       substrings which can either be a  sequence  of  non-parentheses,  or  a
       recursive  match  of the pattern itself (that is, a correctly parenthe-
       sized substring).  Finally there is a closing parenthesis. Note the use
       of a possessive quantifier to avoid backtracking into sequences of non-
       parentheses.

       If this were part of a larger pattern, you would not  want  to  recurse
       the entire pattern, so instead you could use this:

         ( \( ( [^()]++ | (?1) )* \) )

       We  have  put the pattern into parentheses, and caused the recursion to
       refer to them instead of the whole pattern.

       In a larger pattern,  keeping  track  of  parenthesis  numbers  can  be
       tricky.  This  is made easier by the use of relative references (a Perl
       5.10 feature).  Instead of (?1) in the  pattern  above  you  can  write
       (?-2) to refer to the second most recently opened parentheses preceding
       the recursion. In other  words,  a  negative  number  counts  capturing
       parentheses leftwards from the point at which it is encountered.

       It  is  also  possible  to refer to subsequently opened parentheses, by
       writing references such as (?+2). However, these  cannot  be  recursive
       because  the  reference  is  not inside the parentheses that are refer-
       enced. They are always "subroutine" calls, as  described  in  the  next
       section.

       An  alternative  approach is to use named parentheses instead. The Perl
       syntax for this is (?&name); PCRE's earlier syntax  (?P>name)  is  also
       supported. We could rewrite the above example as follows:

         (?<pn> \( ( [^()]++ | (?&pn) )* \) )

       If  there  is more than one subpattern with the same name, the earliest
       one is used.

       This particular example pattern that we have been looking  at  contains
       nested unlimited repeats, and so the use of a possessive quantifier for
       matching strings of non-parentheses is important when applying the pat-
       tern  to  strings  that do not match. For example, when this pattern is
       applied to

         (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()

       it yields "no match" quickly. However, if a  possessive  quantifier  is
       not  used, the match runs for a very long time indeed because there are
       so many different ways the + and * repeats can carve  up  the  subject,
       and all have to be tested before failure can be reported.

       At  the  end  of a match, the values of capturing parentheses are those
       from the outermost level. If you want to obtain intermediate values,  a
       callout  function can be used (see below and the pcrecallout documenta-
       tion). If the pattern above is matched against

         (ab(cd)ef)

       the value for the inner capturing parentheses  (numbered  2)  is  "ef",
       which  is the last value taken on at the top level. If a capturing sub-
       pattern is not matched at the top level, its final value is unset, even
       if it is (temporarily) set at a deeper level.

       If  there are more than 15 capturing parentheses in a pattern, PCRE has
       to obtain extra memory to store data during a recursion, which it  does
       by using pcre_malloc, freeing it via pcre_free afterwards. If no memory
       can be obtained, the match fails with the PCRE_ERROR_NOMEMORY error.

       Do not confuse the (?R) item with the condition (R),  which  tests  for
       recursion.   Consider  this pattern, which matches text in angle brack-
       ets, allowing for arbitrary nesting. Only digits are allowed in  nested
       brackets  (that is, when recursing), whereas any characters are permit-
       ted at the outer level.

         < (?: (?(R) \d++  | [^<>]*+) | (?R)) * >

       In this pattern, (?(R) is the start of a conditional  subpattern,  with
       two  different  alternatives for the recursive and non-recursive cases.
       The (?R) item is the actual recursive call.

   Recursion difference from Perl

       In PCRE (like Python, but unlike Perl), a recursive subpattern call  is
       always treated as an atomic group. That is, once it has matched some of
       the subject string, it is never re-entered, even if it contains untried
       alternatives  and  there  is a subsequent matching failure. This can be
       illustrated by the following pattern, which purports to match a  palin-
       dromic  string  that contains an odd number of characters (for example,
       "a", "aba", "abcba", "abcdcba"):

         ^(.|(.)(?1)\2)$

       The idea is that it either matches a single character, or two identical
       characters  surrounding  a sub-palindrome. In Perl, this pattern works;
       in PCRE it does not if the pattern is  longer  than  three  characters.
       Consider the subject string "abcba":

       At  the  top level, the first character is matched, but as it is not at
       the end of the string, the first alternative fails; the second alterna-
       tive is taken and the recursion kicks in. The recursive call to subpat-
       tern 1 successfully matches the next character ("b").  (Note  that  the
       beginning and end of line tests are not part of the recursion).

       Back  at  the top level, the next character ("c") is compared with what
       subpattern 2 matched, which was "a". This fails. Because the  recursion
       is  treated  as  an atomic group, there are now no backtracking points,
       and so the entire match fails. (Perl is able, at  this  point,  to  re-
       enter  the  recursion  and try the second alternative.) However, if the
       pattern is written with the alternatives in the other order, things are
       different:

         ^((.)(?1)\2|.)$

       This  time,  the recursing alternative is tried first, and continues to
       recurse until it runs out of characters, at which point  the  recursion
       fails.  But  this  time  we  do  have another alternative to try at the
       higher level. That is the big difference:  in  the  previous  case  the
       remaining alternative is at a deeper recursion level, which PCRE cannot
       use.

       To change the pattern so that matches all palindromic strings, not just
       those  with  an  odd number of characters, it is tempting to change the
       pattern to this:

         ^((.)(?1)\2|.?)$

       Again, this works in Perl, but not in PCRE, and for  the  same  reason.
       When  a  deeper  recursion has matched a single character, it cannot be
       entered again in order to match an empty string.  The  solution  is  to
       separate  the two cases, and write out the odd and even cases as alter-
       natives at the higher level:

         ^(?:((.)(?1)\2|)|((.)(?3)\4|.))

       If you want to match typical palindromic phrases, the  pattern  has  to
       ignore all non-word characters, which can be done like this:

         ^\W*+(?:((.)\W*+(?1)\W*+\2|)|((.)\W*+(?3)\W*+\4|\W*+.\W*+))\W*+$

       If run with the PCRE_CASELESS option, this pattern matches phrases such
       as "A man, a plan, a canal: Panama!" and it works well in both PCRE and
       Perl.  Note the use of the possessive quantifier *+ to avoid backtrack-
       ing into sequences of non-word characters. Without this, PCRE  takes  a
       great  deal  longer  (ten  times or more) to match typical phrases, and
       Perl takes so long that you think it has gone into a loop.

       WARNING: The palindrome-matching patterns above work only if  the  sub-
       ject  string  does not start with a palindrome that is shorter than the
       entire string.  For example, although "abcba" is correctly matched,  if
       the  subject  is "ababa", PCRE finds the palindrome "aba" at the start,
       then fails at top level because the end of the string does not  follow.
       Once  again, it cannot jump back into the recursion to try other alter-
       natives, so the entire match fails.


SUBPATTERNS AS SUBROUTINES

       If the syntax for a recursive subpattern reference (either by number or
       by  name)  is used outside the parentheses to which it refers, it oper-
       ates like a subroutine in a programming language. The "called"  subpat-
       tern may be defined before or after the reference. A numbered reference
       can be absolute or relative, as in these examples:

         (...(absolute)...)...(?2)...
         (...(relative)...)...(?-1)...
         (...(?+1)...(relative)...

       An earlier example pointed out that the pattern

         (sens|respons)e and \1ibility

       matches "sense and sensibility" and "response and responsibility",  but
       not "sense and responsibility". If instead the pattern

         (sens|respons)e and (?1)ibility

       is  used, it does match "sense and responsibility" as well as the other
       two strings. Another example is  given  in  the  discussion  of  DEFINE
       above.

       Like  recursive  subpatterns, a subroutine call is always treated as an
       atomic group. That is, once it has matched some of the subject  string,
       it  is  never  re-entered, even if it contains untried alternatives and
       there is a subsequent matching failure. Any capturing parentheses  that
       are  set  during  the  subroutine  call revert to their previous values
       afterwards.

       When a subpattern is used as a subroutine, processing options  such  as
       case-independence are fixed when the subpattern is defined. They cannot
       be changed for different calls. For example, consider this pattern:

         (abc)(?i:(?-1))

       It matches "abcabc". It does not match "abcABC" because the  change  of
       processing option does not affect the called subpattern.


ONIGURUMA SUBROUTINE SYNTAX

       For  compatibility with Oniguruma, the non-Perl syntax \g followed by a
       name or a number enclosed either in angle brackets or single quotes, is
       an  alternative  syntax  for  referencing a subpattern as a subroutine,
       possibly recursively. Here are two of the examples used above,  rewrit-
       ten using this syntax:

         (?<pn> \( ( (?>[^()]+) | \g<pn> )* \) )
         (sens|respons)e and \g'1'ibility

       PCRE  supports  an extension to Oniguruma: if a number is preceded by a
       plus or a minus sign it is taken as a relative reference. For example:

         (abc)(?i:\g<-1>)

       Note that \g{...} (Perl syntax) and \g<...> (Oniguruma syntax) are  not
       synonymous.  The former is a back reference; the latter is a subroutine
       call.


CALLOUTS

       Perl has a feature whereby using the sequence (?{...}) causes arbitrary
       Perl  code to be obeyed in the middle of matching a regular expression.
       This makes it possible, amongst other things, to extract different sub-
       strings that match the same pair of parentheses when there is a repeti-
       tion.

       PCRE provides a similar feature, but of course it cannot obey arbitrary
       Perl code. The feature is called "callout". The caller of PCRE provides
       an external function by putting its entry point in the global  variable
       pcre_callout.   By default, this variable contains NULL, which disables
       all calling out.

       Within a regular expression, (?C) indicates the  points  at  which  the
       external  function  is  to be called. If you want to identify different
       callout points, you can put a number less than 256 after the letter  C.
       The  default  value is zero.  For example, this pattern has two callout
       points:

         (?C1)abc(?C2)def

       If the PCRE_AUTO_CALLOUT flag is passed to pcre_compile(), callouts are
       automatically  installed  before each item in the pattern. They are all
       numbered 255.

       During matching, when PCRE reaches a callout point (and pcre_callout is
       set),  the  external function is called. It is provided with the number
       of the callout, the position in the pattern, and, optionally, one  item
       of  data  originally supplied by the caller of pcre_exec(). The callout
       function may cause matching to proceed, to backtrack, or to fail  alto-
       gether. A complete description of the interface to the callout function
       is given in the pcrecallout documentation.


BACKTRACKING CONTROL

       Perl 5.10 introduced a number of "Special Backtracking Control  Verbs",
       which are described in the Perl documentation as "experimental and sub-
       ject to change or removal in a future version of Perl". It goes  on  to
       say:  "Their usage in production code should be noted to avoid problems
       during upgrades." The same remarks apply to the PCRE features described
       in this section.

       Since  these  verbs  are  specifically related to backtracking, most of
       them can be  used  only  when  the  pattern  is  to  be  matched  using
       pcre_exec(), which uses a backtracking algorithm. With the exception of
       (*FAIL), which behaves like a failing negative assertion, they cause an
       error if encountered by pcre_dfa_exec().

       If any of these verbs are used in an assertion or subroutine subpattern
       (including recursive subpatterns), their effect  is  confined  to  that
       subpattern;  it  does  not extend to the surrounding pattern. Note that
       such subpatterns are processed as anchored at the point where they  are
       tested.

       The  new verbs make use of what was previously invalid syntax: an open-
       ing parenthesis followed by an asterisk. In Perl, they are generally of
       the form (*VERB:ARG) but PCRE does not support the use of arguments, so
       its general form is just (*VERB). Any number of these verbs  may  occur
       in a pattern. There are two kinds:

   Verbs that act immediately

       The following verbs act as soon as they are encountered:

          (*ACCEPT)

       This  verb causes the match to end successfully, skipping the remainder
       of the pattern. When inside a recursion, only the innermost pattern  is
       ended  immediately.  If  (*ACCEPT) is inside capturing parentheses, the
       data so far is captured. (This feature was added  to  PCRE  at  release
       8.00.) For example:

         A((?:A|B(*ACCEPT)|C)D)

       This  matches  "AB", "AAD", or "ACD"; when it matches "AB", "B" is cap-
       tured by the outer parentheses.

         (*FAIL) or (*F)

       This verb causes the match to fail, forcing backtracking to  occur.  It
       is  equivalent to (?!) but easier to read. The Perl documentation notes
       that it is probably useful only when combined  with  (?{})  or  (??{}).
       Those  are,  of course, Perl features that are not present in PCRE. The
       nearest equivalent is the callout feature, as for example in this  pat-
       tern:

         a+(?C)(*FAIL)

       A  match  with the string "aaaa" always fails, but the callout is taken
       before each backtrack happens (in this example, 10 times).

   Verbs that act after backtracking

       The following verbs do nothing when they are encountered. Matching con-
       tinues  with what follows, but if there is no subsequent match, a fail-
       ure is forced.  The verbs  differ  in  exactly  what  kind  of  failure
       occurs.

         (*COMMIT)

       This  verb  causes  the whole match to fail outright if the rest of the
       pattern does not match. Even if the pattern is unanchored,  no  further
       attempts  to  find  a match by advancing the starting point take place.
       Once (*COMMIT) has been passed, pcre_exec() is committed to  finding  a
       match at the current starting point, or not at all. For example:

         a+(*COMMIT)b

       This  matches  "xxaab" but not "aacaab". It can be thought of as a kind
       of dynamic anchor, or "I've started, so I must finish."

         (*PRUNE)

       This verb causes the match to fail at the current position if the  rest
       of the pattern does not match. If the pattern is unanchored, the normal
       "bumpalong" advance to the next starting character then happens.  Back-
       tracking  can  occur as usual to the left of (*PRUNE), or when matching
       to the right of (*PRUNE), but if there is no match to the right,  back-
       tracking  cannot  cross (*PRUNE).  In simple cases, the use of (*PRUNE)
       is just an alternative to an atomic group or possessive quantifier, but
       there  are  some uses of (*PRUNE) that cannot be expressed in any other
       way.

         (*SKIP)

       This verb is like (*PRUNE), except that if the pattern  is  unanchored,
       the  "bumpalong" advance is not to the next character, but to the posi-
       tion in the subject where (*SKIP) was  encountered.  (*SKIP)  signifies
       that  whatever  text  was  matched leading up to it cannot be part of a
       successful match. Consider:

         a+(*SKIP)b

       If the subject is "aaaac...",  after  the  first  match  attempt  fails
       (starting  at  the  first  character in the string), the starting point
       skips on to start the next attempt at "c". Note that a possessive quan-
       tifer  does not have the same effect as this example; although it would
       suppress backtracking  during  the  first  match  attempt,  the  second
       attempt  would  start at the second character instead of skipping on to
       "c".

         (*THEN)

       This verb causes a skip to the next alternation if the rest of the pat-
       tern does not match. That is, it cancels pending backtracking, but only
       within the current alternation. Its name  comes  from  the  observation
       that it can be used for a pattern-based if-then-else block:

         ( COND1 (*THEN) FOO | COND2 (*THEN) BAR | COND3 (*THEN) BAZ ) ...

       If  the COND1 pattern matches, FOO is tried (and possibly further items
       after the end of the group if FOO succeeds);  on  failure  the  matcher
       skips  to  the second alternative and tries COND2, without backtracking
       into COND1. If (*THEN) is used outside  of  any  alternation,  it  acts
       exactly like (*PRUNE).


SEE ALSO

       pcreapi(3), pcrecallout(3), pcrematching(3), pcresyntax(3), pcre(3).


AUTHOR

       Philip Hazel
       University Computing Service
       Cambridge CB2 3QH, England.


REVISION

       Last updated: 06 March 2010
       Copyright (c) 1997-2010 University of Cambridge.
------------------------------------------------------------------------------


PCRESYNTAX(3)                                                    PCRESYNTAX(3)


NAME
       PCRE - Perl-compatible regular expressions


PCRE REGULAR EXPRESSION SYNTAX SUMMARY

       The  full syntax and semantics of the regular expressions that are sup-
       ported by PCRE are described in  the  pcrepattern  documentation.  This
       document contains just a quick-reference summary of the syntax.


QUOTING

         \x         where x is non-alphanumeric is a literal x
         \Q...\E    treat enclosed characters as literal


CHARACTERS

         \a         alarm, that is, the BEL character (hex 07)
         \cx        "control-x", where x is any character
         \e         escape (hex 1B)
         \f         formfeed (hex 0C)
         \n         newline (hex 0A)
         \r         carriage return (hex 0D)
         \t         tab (hex 09)
         \ddd       character with octal code ddd, or backreference
         \xhh       character with hex code hh
         \x{hhh..}  character with hex code hhh..


CHARACTER TYPES

         .          any character except newline;
                      in dotall mode, any character whatsoever
         \C         one byte, even in UTF-8 mode (best avoided)
         \d         a decimal digit
         \D         a character that is not a decimal digit
         \h         a horizontal whitespace character
         \H         a character that is not a horizontal whitespace character
         \p{xx}     a character with the xx property
         \P{xx}     a character without the xx property
         \R         a newline sequence
         \s         a whitespace character
         \S         a character that is not a whitespace character
         \v         a vertical whitespace character
         \V         a character that is not a vertical whitespace character
         \w         a "word" character
         \W         a "non-word" character
         \X         an extended Unicode sequence

       In PCRE, \d, \D, \s, \S, \w, and \W recognize only ASCII characters.


GENERAL CATEGORY PROPERTY CODES FOR \p and \P

         C          Other
         Cc         Control
         Cf         Format
         Cn         Unassigned
         Co         Private use
         Cs         Surrogate

         L          Letter
         Ll         Lower case letter
         Lm         Modifier letter
         Lo         Other letter
         Lt         Title case letter
         Lu         Upper case letter
         L&         Ll, Lu, or Lt

         M          Mark
         Mc         Spacing mark
         Me         Enclosing mark
         Mn         Non-spacing mark

         N          Number
         Nd         Decimal number
         Nl         Letter number
         No         Other number

         P          Punctuation
         Pc         Connector punctuation
         Pd         Dash punctuation
         Pe         Close punctuation
         Pf         Final punctuation
         Pi         Initial punctuation
         Po         Other punctuation
         Ps         Open punctuation

         S          Symbol
         Sc         Currency symbol
         Sk         Modifier symbol
         Sm         Mathematical symbol
         So         Other symbol

         Z          Separator
         Zl         Line separator
         Zp         Paragraph separator
         Zs         Space separator


SCRIPT NAMES FOR \p AND \P

       Arabic, Armenian, Avestan, Balinese, Bamum, Bengali, Bopomofo, Braille,
       Buginese, Buhid, Canadian_Aboriginal, Carian, Cham,  Cherokee,  Common,
       Coptic,   Cuneiform,  Cypriot,  Cyrillic,  Deseret,  Devanagari,  Egyp-
       tian_Hieroglyphs,  Ethiopic,  Georgian,  Glagolitic,   Gothic,   Greek,
       Gujarati,  Gurmukhi,  Han,  Hangul,  Hanunoo,  Hebrew,  Hiragana, Impe-
       rial_Aramaic, Inherited, Inscriptional_Pahlavi, Inscriptional_Parthian,
       Javanese,  Kaithi, Kannada, Katakana, Kayah_Li, Kharoshthi, Khmer, Lao,
       Latin,  Lepcha,  Limbu,  Linear_B,  Lisu,  Lycian,  Lydian,  Malayalam,
       Meetei_Mayek,  Mongolian, Myanmar, New_Tai_Lue, Nko, Ogham, Old_Italic,
       Old_Persian, Old_South_Arabian, Old_Turkic, Ol_Chiki,  Oriya,  Osmanya,
       Phags_Pa,  Phoenician,  Rejang,  Runic, Samaritan, Saurashtra, Shavian,
       Sinhala, Sundanese, Syloti_Nagri, Syriac,  Tagalog,  Tagbanwa,  Tai_Le,
       Tai_Tham,  Tai_Viet,  Tamil,  Telugu,  Thaana, Thai, Tibetan, Tifinagh,
       Ugaritic, Vai, Yi.


CHARACTER CLASSES

         [...]       positive character class
         [^...]      negative character class
         [x-y]       range (can be used for hex characters)
         [[:xxx:]]   positive POSIX named set
         [[:^xxx:]]  negative POSIX named set

         alnum       alphanumeric
         alpha       alphabetic
         ascii       0-127
         blank       space or tab
         cntrl       control character
         digit       decimal digit
         graph       printing, excluding space
         lower       lower case letter
         print       printing, including space
         punct       printing, excluding alphanumeric
         space       whitespace
         upper       upper case letter
         word        same as \w
         xdigit      hexadecimal digit

       In PCRE, POSIX character set names recognize only ASCII characters. You
       can use \Q...\E inside a character class.


QUANTIFIERS

         ?           0 or 1, greedy
         ?+          0 or 1, possessive
         ??          0 or 1, lazy
         *           0 or more, greedy
         *+          0 or more, possessive
         *?          0 or more, lazy
         +           1 or more, greedy
         ++          1 or more, possessive
         +?          1 or more, lazy
         {n}         exactly n
         {n,m}       at least n, no more than m, greedy
         {n,m}+      at least n, no more than m, possessive
         {n,m}?      at least n, no more than m, lazy
         {n,}        n or more, greedy
         {n,}+       n or more, possessive
         {n,}?       n or more, lazy


ANCHORS AND SIMPLE ASSERTIONS

         \b          word boundary (only ASCII letters recognized)
         \B          not a word boundary
         ^           start of subject
                      also after internal newline in multiline mode
         \A          start of subject
         $           end of subject
                      also before newline at end of subject
                      also before internal newline in multiline mode
         \Z          end of subject
                      also before newline at end of subject
         \z          end of subject
         \G          first matching position in subject


MATCH POINT RESET

         \K          reset start of match


ALTERNATION

         expr|expr|expr...


CAPTURING

         (...)           capturing group
         (?<name>...)    named capturing group (Perl)
         (?'name'...)    named capturing group (Perl)
         (?P<name>...)   named capturing group (Python)
         (?:...)         non-capturing group
         (?|...)         non-capturing group; reset group numbers for
                          capturing groups in each alternative


ATOMIC GROUPS

         (?>...)         atomic, non-capturing group


COMMENT

         (?#....)        comment (not nestable)


OPTION SETTING

         (?i)            caseless
         (?J)            allow duplicate names
         (?m)            multiline
         (?s)            single line (dotall)
         (?U)            default ungreedy (lazy)
         (?x)            extended (ignore white space)
         (?-...)         unset option(s)

       The following is recognized only at the start of a pattern or after one
       of the newline-setting options with similar syntax:

         (*UTF8)         set UTF-8 mode


LOOKAHEAD AND LOOKBEHIND ASSERTIONS

         (?=...)         positive look ahead
         (?!...)         negative look ahead
         (?<=...)        positive look behind
         (?<!...)        negative look behind

       Each top-level branch of a look behind must be of a fixed length.


BACKREFERENCES

         \n              reference by number (can be ambiguous)
         \gn             reference by number
         \g{n}           reference by number
         \g{-n}          relative reference by number
         \k<name>        reference by name (Perl)
         \k'name'        reference by name (Perl)
         \g{name}        reference by name (Perl)
         \k{name}        reference by name (.NET)
         (?P=name)       reference by name (Python)


SUBROUTINE REFERENCES (POSSIBLY RECURSIVE)

         (?R)            recurse whole pattern
         (?n)            call subpattern by absolute number
         (?+n)           call subpattern by relative number
         (?-n)           call subpattern by relative number
         (?&name)        call subpattern by name (Perl)
         (?P>name)       call subpattern by name (Python)
         \g<name>        call subpattern by name (Oniguruma)
         \g'name'        call subpattern by name (Oniguruma)
         \g<n>           call subpattern by absolute number (Oniguruma)
         \g'n'           call subpattern by absolute number (Oniguruma)
         \g<+n>          call subpattern by relative number (PCRE extension)
         \g'+n'          call subpattern by relative number (PCRE extension)
         \g<-n>          call subpattern by relative number (PCRE extension)
         \g'-n'          call subpattern by relative number (PCRE extension)


CONDITIONAL PATTERNS

         (?(condition)yes-pattern)
         (?(condition)yes-pattern|no-pattern)

         (?(n)...        absolute reference condition
         (?(+n)...       relative reference condition
         (?(-n)...       relative reference condition
         (?(<name>)...   named reference condition (Perl)
         (?('name')...   named reference condition (Perl)
         (?(name)...     named reference condition (PCRE)
         (?(R)...        overall recursion condition
         (?(Rn)...       specific group recursion condition
         (?(R&name)...   specific recursion condition
         (?(DEFINE)...   define subpattern for reference
         (?(assert)...   assertion condition


BACKTRACKING CONTROL

       The following act immediately they are reached:

         (*ACCEPT)       force successful match
         (*FAIL)         force backtrack; synonym (*F)

       The following act only when a subsequent match failure causes  a  back-
       track to reach them. They all force a match failure, but they differ in
       what happens afterwards. Those that advance the start-of-match point do
       so only if the pattern is not anchored.

         (*COMMIT)       overall failure, no advance of starting point
         (*PRUNE)        advance to next starting character
         (*SKIP)         advance start to current matching position
         (*THEN)         local failure, backtrack to next alternation


NEWLINE CONVENTIONS

       These  are  recognized only at the very start of the pattern or after a
       (*BSR_...) or (*UTF8) option.

         (*CR)           carriage return only
         (*LF)           linefeed only
         (*CRLF)         carriage return followed by linefeed
         (*ANYCRLF)      all three of the above
         (*ANY)          any Unicode newline sequence


WHAT \R MATCHES

       These are recognized only at the very start of the pattern or  after  a
       (*...) option that sets the newline convention or UTF-8 mode.

         (*BSR_ANYCRLF)  CR, LF, or CRLF
         (*BSR_UNICODE)  any Unicode newline sequence


CALLOUTS

         (?C)      callout
         (?Cn)     callout with data n


SEE ALSO

       pcrepattern(3), pcreapi(3), pcrecallout(3), pcrematching(3), pcre(3).


AUTHOR

       Philip Hazel
       University Computing Service
       Cambridge CB2 3QH, England.


REVISION

       Last updated: 01 March 2010
       Copyright (c) 1997-2010 University of Cambridge.
------------------------------------------------------------------------------


PCREPARTIAL(3)                                                  PCREPARTIAL(3)


NAME
       PCRE - Perl-compatible regular expressions


PARTIAL MATCHING IN PCRE

       In  normal  use  of  PCRE,  if  the  subject  string  that is passed to
       pcre_exec() or pcre_dfa_exec() matches as far as it goes,  but  is  too
       short  to  match  the  entire  pattern, PCRE_ERROR_NOMATCH is returned.
       There are circumstances where it might be helpful to  distinguish  this
       case from other cases in which there is no match.

       Consider, for example, an application where a human is required to type
       in data for a field with specific formatting requirements.  An  example
       might be a date in the form ddmmmyy, defined by this pattern:

         ^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$

       If the application sees the user's keystrokes one by one, and can check
       that what has been typed so far is potentially valid,  it  is  able  to
       raise  an  error  as  soon  as  a  mistake  is made, by beeping and not
       reflecting the character that has been typed, for example. This immedi-
       ate  feedback is likely to be a better user interface than a check that
       is delayed until the entire string has been entered.  Partial  matching
       can  also  sometimes be useful when the subject string is very long and
       is not all available at once.

       PCRE supports partial matching by means of  the  PCRE_PARTIAL_SOFT  and
       PCRE_PARTIAL_HARD options, which can be set when calling pcre_exec() or
       pcre_dfa_exec(). For backwards compatibility, PCRE_PARTIAL is a synonym
       for PCRE_PARTIAL_SOFT. The essential difference between the two options
       is whether or not a partial match is preferred to an  alternative  com-
       plete  match,  though the details differ between the two matching func-
       tions. If both options are set, PCRE_PARTIAL_HARD takes precedence.

       Setting a partial matching option disables two of PCRE's optimizations.
       PCRE  remembers the last literal byte in a pattern, and abandons match-
       ing immediately if such a byte is not present in  the  subject  string.
       This  optimization cannot be used for a subject string that might match
       only partially. If the pattern was  studied,  PCRE  knows  the  minimum
       length  of  a  matching string, and does not bother to run the matching
       function on shorter strings. This optimization  is  also  disabled  for
       partial matching.


PARTIAL MATCHING USING pcre_exec()

       A partial match occurs during a call to pcre_exec() whenever the end of
       the subject string is reached successfully, but  matching  cannot  con-
       tinue because more characters are needed. However, at least one charac-
       ter must have been matched. (In other words, a partial match can  never
       be an empty string.)

       If  PCRE_PARTIAL_SOFT  is  set,  the  partial  match is remembered, but
       matching continues as normal, and other alternatives in the pattern are
       tried.   If  no  complete  match  can  be  found,  pcre_exec()  returns
       PCRE_ERROR_PARTIAL instead of PCRE_ERROR_NOMATCH. If there are at least
       two slots in the offsets vector, the first of them is set to the offset
       of the earliest character that was inspected when the partial match was
       found.  For  convenience,  the  second  offset points to the end of the
       string so that a substring can easily be identified.

       For the majority of patterns, the first offset identifies the start  of
       the  partially matched string. However, for patterns that contain look-
       behind assertions, or \K, or begin with \b or  \B,  earlier  characters
       have been inspected while carrying out the match. For example:

         /(?<=abc)123/

       This pattern matches "123", but only if it is preceded by "abc". If the
       subject string is "xyzabc12", the offsets after a partial match are for
       the  substring  "abc12",  because  all  these  characters are needed if
       another match is tried with extra characters added.

       If there is more than one partial match, the first one that  was  found
       provides the data that is returned. Consider this pattern:

         /123\w+X|dogY/

       If  this is matched against the subject string "abc123dog", both alter-
       natives fail to match, but the end of the  subject  is  reached  during
       matching,    so    PCRE_ERROR_PARTIAL    is    returned    instead   of
       PCRE_ERROR_NOMATCH. The  offsets  are  set  to  3  and  9,  identifying
       "123dog"  as  the first partial match that was found. (In this example,
       there are two partial matches,  because  "dog"  on  its  own  partially
       matches the second alternative.)

       If PCRE_PARTIAL_HARD is set for pcre_exec(), it returns PCRE_ERROR_PAR-
       TIAL as soon as a partial match is found, without continuing to  search
       for  possible  complete matches. The difference between the two options
       can be illustrated by a pattern such as:

         /dog(sbody)?/

       This matches either "dog" or "dogsbody", greedily (that is, it  prefers
       the  longer  string  if  possible). If it is matched against the string
       "dog" with PCRE_PARTIAL_SOFT, it yields a  complete  match  for  "dog".
       However, if PCRE_PARTIAL_HARD is set, the result is PCRE_ERROR_PARTIAL.
       On the other hand, if the pattern is made ungreedy the result  is  dif-
       ferent:

         /dog(sbody)??/

       In  this case the result is always a complete match because pcre_exec()
       finds that first, and it never continues  after  finding  a  match.  It
       might  be easier to follow this explanation by thinking of the two pat-
       terns like this:

         /dog(sbody)?/    is the same as  /dogsbody|dog/
         /dog(sbody)??/   is the same as  /dog|dogsbody/

       The second pattern will never  match  "dogsbody"  when  pcre_exec()  is
       used, because it will always find the shorter match first.


PARTIAL MATCHING USING pcre_dfa_exec()

       The  pcre_dfa_exec()  function moves along the subject string character
       by character, without backtracking, searching for all possible  matches
       simultaneously.  If the end of the subject is reached before the end of
       the pattern, there is the possibility of a partial  match,  again  pro-
       vided that at least one character has matched.

       When  PCRE_PARTIAL_SOFT  is set, PCRE_ERROR_PARTIAL is returned only if
       there have been no complete matches. Otherwise,  the  complete  matches
       are  returned.   However,  if PCRE_PARTIAL_HARD is set, a partial match
       takes precedence over any complete matches. The portion of  the  string
       that  was  inspected when the longest partial match was found is set as
       the first matching string, provided there are at least two slots in the
       offsets vector.

       Because  pcre_dfa_exec()  always searches for all possible matches, and
       there is no difference between greedy and ungreedy repetition, its  be-
       haviour is different from pcre_exec when PCRE_PARTIAL_HARD is set. Con-
       sider the string "dog"  matched  against  the  ungreedy  pattern  shown
       above:

         /dog(sbody)??/

       Whereas  pcre_exec()  stops  as soon as it finds the complete match for
       "dog", pcre_dfa_exec() also finds the partial match for "dogsbody", and
       so returns that when PCRE_PARTIAL_HARD is set.


PARTIAL MATCHING AND WORD BOUNDARIES

       If  a  pattern ends with one of sequences \b or \B, which test for word
       boundaries, partial matching with PCRE_PARTIAL_SOFT can  give  counter-
       intuitive results. Consider this pattern:

         /\bcat\b/

       This matches "cat", provided there is a word boundary at either end. If
       the subject string is "the cat", the comparison of the final "t" with a
       following  character  cannot  take  place, so a partial match is found.
       However, pcre_exec() carries on with normal matching, which matches  \b
       at  the  end  of  the subject when the last character is a letter, thus
       finding a complete match. The result, therefore, is not PCRE_ERROR_PAR-
       TIAL.  The  same  thing  happens  with pcre_dfa_exec(), because it also
       finds the complete match.

       Using PCRE_PARTIAL_HARD in this  case  does  yield  PCRE_ERROR_PARTIAL,
       because then the partial match takes precedence.


FORMERLY RESTRICTED PATTERNS

       For releases of PCRE prior to 8.00, because of the way certain internal
       optimizations  were  implemented  in  the  pcre_exec()  function,   the
       PCRE_PARTIAL  option  (predecessor  of  PCRE_PARTIAL_SOFT) could not be
       used with all patterns. From release 8.00 onwards, the restrictions  no
       longer  apply,  and  partial matching with pcre_exec() can be requested
       for any pattern.

       Items that were formerly restricted were repeated single characters and
       repeated  metasequences. If PCRE_PARTIAL was set for a pattern that did
       not conform to the restrictions, pcre_exec() returned  the  error  code
       PCRE_ERROR_BADPARTIAL  (-13).  This error code is no longer in use. The
       PCRE_INFO_OKPARTIAL call to pcre_fullinfo() to find out if  a  compiled
       pattern can be used for partial matching now always returns 1.


EXAMPLE OF PARTIAL MATCHING USING PCRETEST

       If  the  escape  sequence  \P  is  present in a pcretest data line, the
       PCRE_PARTIAL_SOFT option is used for  the  match.  Here  is  a  run  of
       pcretest that uses the date example quoted above:

           re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
         data> 25jun04\P
          0: 25jun04
          1: jun
         data> 25dec3\P
         Partial match: 23dec3
         data> 3ju\P
         Partial match: 3ju
         data> 3juj\P
         No match
         data> j\P
         No match

       The  first  data  string  is  matched completely, so pcretest shows the
       matched substrings. The remaining four strings do not  match  the  com-
       plete pattern, but the first two are partial matches. Similar output is
       obtained when pcre_dfa_exec() is used.

       If the escape sequence \P is present more than once in a pcretest  data
       line, the PCRE_PARTIAL_HARD option is set for the match.


MULTI-SEGMENT MATCHING WITH pcre_dfa_exec()

       When a partial match has been found using pcre_dfa_exec(), it is possi-
       ble to continue the match by  providing  additional  subject  data  and
       calling  pcre_dfa_exec()  again  with the same compiled regular expres-
       sion, this time setting the PCRE_DFA_RESTART option. You must pass  the
       same working space as before, because this is where details of the pre-
       vious partial match are stored. Here  is  an  example  using  pcretest,
       using  the  \R  escape  sequence to set the PCRE_DFA_RESTART option (\D
       specifies the use of pcre_dfa_exec()):

           re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
         data> 23ja\P\D
         Partial match: 23ja
         data> n05\R\D
          0: n05

       The first call has "23ja" as the subject, and requests  partial  match-
       ing;  the  second  call  has  "n05"  as  the  subject for the continued
       (restarted) match.  Notice that when the match is  complete,  only  the
       last  part  is  shown;  PCRE  does not retain the previously partially-
       matched string. It is up to the calling program to do that if it  needs
       to.

       You  can  set  the  PCRE_PARTIAL_SOFT or PCRE_PARTIAL_HARD options with
       PCRE_DFA_RESTART to continue partial matching over  multiple  segments.
       This  facility  can  be  used  to  pass  very  long  subject strings to
       pcre_dfa_exec().


MULTI-SEGMENT MATCHING WITH pcre_exec()

       From release 8.00, pcre_exec() can also be  used  to  do  multi-segment
       matching.  Unlike  pcre_dfa_exec(),  it  is not possible to restart the
       previous match with a new segment of data. Instead, new  data  must  be
       added  to  the  previous  subject  string, and the entire match re-run,
       starting from the point where the partial match occurred. Earlier  data
       can be discarded.  Consider an unanchored pattern that matches dates:

           re> /\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d/
         data> The date is 23ja\P
         Partial match: 23ja

       At  this stage, an application could discard the text preceding "23ja",
       add on text from the next segment, and call pcre_exec()  again.  Unlike
       pcre_dfa_exec(),  the  entire matching string must always be available,
       and the complete matching process occurs for each call, so more  memory
       and more processing time is needed.

       Note:  If  the pattern contains lookbehind assertions, or \K, or starts
       with \b or \B, the string that is returned for  a  partial  match  will
       include  characters  that  precede the partially matched string itself,
       because these must be retained when adding on  more  characters  for  a
       subsequent matching attempt.


ISSUES WITH MULTI-SEGMENT MATCHING

       Certain types of pattern may give problems with multi-segment matching,
       whichever matching function is used.

       1. If the pattern contains tests for the beginning or end  of  a  line,
       you  need  to pass the PCRE_NOTBOL or PCRE_NOTEOL options, as appropri-
       ate, when the subject string for any call does not contain  the  begin-
       ning or end of a line.

       2.  Lookbehind  assertions at the start of a pattern are catered for in
       the offsets that are returned for a partial match. However, in  theory,
       a  lookbehind assertion later in the pattern could require even earlier
       characters to be inspected, and it might not have been reached  when  a
       partial  match occurs. This is probably an extremely unlikely case; you
       could guard against it to a certain extent by  always  including  extra
       characters at the start.

       3.  Matching  a subject string that is split into multiple segments may
       not always produce exactly the same result as matching over one  single
       long  string,  especially  when  PCRE_PARTIAL_SOFT is used. The section
       "Partial Matching and Word Boundaries" above describes  an  issue  that
       arises  if  the  pattern ends with \b or \B. Another kind of difference
       may occur when there are multiple  matching  possibilities,  because  a
       partial match result is given only when there are no completed matches.
       This means that as soon as the shortest match has been found, continua-
       tion  to  a  new subject segment is no longer possible.  Consider again
       this pcretest example:

           re> /dog(sbody)?/
         data> dogsb\P
          0: dog
         data> do\P\D
         Partial match: do
         data> gsb\R\P\D
          0: g
         data> dogsbody\D
          0: dogsbody
          1: dog

       The first data line passes the string "dogsb" to  pcre_exec(),  setting
       the  PCRE_PARTIAL_SOFT  option.  Although the string is a partial match
       for "dogsbody", the  result  is  not  PCRE_ERROR_PARTIAL,  because  the
       shorter  string  "dog" is a complete match. Similarly, when the subject
       is presented to pcre_dfa_exec() in several parts ("do" and "gsb"  being
       the first two) the match stops when "dog" has been found, and it is not
       possible to continue. On the other hand, if "dogsbody" is presented  as
       a single string, pcre_dfa_exec() finds both matches.

       Because of these problems, it is probably best to use PCRE_PARTIAL_HARD
       when matching multi-segment data. The example above then  behaves  dif-
       ferently:

           re> /dog(sbody)?/
         data> dogsb\P\P
         Partial match: dogsb
         data> do\P\D
         Partial match: do
         data> gsb\R\P\P\D
         Partial match: gsb


       4. Patterns that contain alternatives at the top level which do not all
       start with the  same  pattern  item  may  not  work  as  expected  when
       PCRE_DFA_RESTART  is  used  with pcre_dfa_exec(). For example, consider
       this pattern:

         1234|3789

       If the first part of the subject is "ABC123", a partial  match  of  the
       first  alternative  is found at offset 3. There is no partial match for
       the second alternative, because such a match does not start at the same
       point  in  the  subject  string. Attempting to continue with the string
       "7890" does not yield a match  because  only  those  alternatives  that
       match  at  one  point in the subject are remembered. The problem arises
       because the start of the second alternative matches  within  the  first
       alternative.  There  is  no  problem with anchored patterns or patterns
       such as:

         1234|ABCD

       where no string can be a partial match for both alternatives.  This  is
       not  a  problem if pcre_exec() is used, because the entire match has to
       be rerun each time:

           re> /1234|3789/
         data> ABC123\P
         Partial match: 123
         data> 1237890
          0: 3789

       Of course, instead of using PCRE_DFA_PARTIAL, the same technique of re-
       running the entire match can also be used with pcre_dfa_exec(). Another
       possibility is to work with two buffers. If a partial match at offset n
       in  the first buffer is followed by "no match" when PCRE_DFA_RESTART is
       used on the second buffer, you can then try a  new  match  starting  at
       offset n+1 in the first buffer.


AUTHOR

       Philip Hazel
       University Computing Service
       Cambridge CB2 3QH, England.


REVISION

       Last updated: 19 October 2009
       Copyright (c) 1997-2009 University of Cambridge.
------------------------------------------------------------------------------


PCREPRECOMPILE(3)                                            PCREPRECOMPILE(3)


NAME
       PCRE - Perl-compatible regular expressions


SAVING AND RE-USING PRECOMPILED PCRE PATTERNS

       If  you  are running an application that uses a large number of regular
       expression patterns, it may be useful to store them  in  a  precompiled
       form  instead  of  having to compile them every time the application is
       run.  If you are not  using  any  private  character  tables  (see  the
       pcre_maketables()  documentation),  this is relatively straightforward.
       If you are using private tables, it is a little bit more complicated.

       If you save compiled patterns to a file, you can copy them to a differ-
       ent  host  and  run them there. This works even if the new host has the
       opposite endianness to the one on which  the  patterns  were  compiled.
       There  may  be a small performance penalty, but it should be insignifi-
       cant. However, compiling regular expressions with one version  of  PCRE
       for  use  with  a  different  version is not guaranteed to work and may
       cause crashes.


SAVING A COMPILED PATTERN
       The value returned by pcre_compile() points to a single block of memory
       that  holds  the compiled pattern and associated data. You can find the
       length of this block in bytes by calling pcre_fullinfo() with an  argu-
       ment  of  PCRE_INFO_SIZE. You can then save the data in any appropriate
       manner. Here is sample code that compiles a pattern and writes it to  a
       file. It assumes that the variable fd refers to a file that is open for
       output:

         int erroroffset, rc, size;
         char *error;
         pcre *re;

         re = pcre_compile("my pattern", 0, &error, &erroroffset, NULL);
         if (re == NULL) { ... handle errors ... }
         rc = pcre_fullinfo(re, NULL, PCRE_INFO_SIZE, &size);
         if (rc < 0) { ... handle errors ... }
         rc = fwrite(re, 1, size, fd);
         if (rc != size) { ... handle errors ... }

       In this example, the bytes  that  comprise  the  compiled  pattern  are
       copied  exactly.  Note that this is binary data that may contain any of
       the 256 possible byte  values.  On  systems  that  make  a  distinction
       between binary and non-binary data, be sure that the file is opened for
       binary output.

       If you want to write more than one pattern to a file, you will have  to
       devise  a  way of separating them. For binary data, preceding each pat-
       tern with its length is probably  the  most  straightforward  approach.
       Another  possibility is to write out the data in hexadecimal instead of
       binary, one pattern to a line.

       Saving compiled patterns in a file is only one possible way of  storing
       them  for later use. They could equally well be saved in a database, or
       in the memory of some daemon process that passes them  via  sockets  to
       the processes that want them.

       If  the pattern has been studied, it is also possible to save the study
       data in a similar way to the compiled  pattern  itself.  When  studying
       generates  additional  information, pcre_study() returns a pointer to a
       pcre_extra data block. Its format is defined in the section on matching
       a  pattern in the pcreapi documentation. The study_data field points to
       the binary study data,  and  this  is  what  you  must  save  (not  the
       pcre_extra  block itself). The length of the study data can be obtained
       by calling pcre_fullinfo() with  an  argument  of  PCRE_INFO_STUDYSIZE.
       Remember  to check that pcre_study() did return a non-NULL value before
       trying to save the study data.


RE-USING A PRECOMPILED PATTERN

       Re-using a precompiled pattern is straightforward. Having  reloaded  it
       into   main   memory,   you   pass   its   pointer  to  pcre_exec()  or
       pcre_dfa_exec() in the usual way. This  should  work  even  on  another
       host,  and  even  if  that  host has the opposite endianness to the one
       where the pattern was compiled.

       However, if you passed a pointer to custom character  tables  when  the
       pattern  was  compiled  (the  tableptr argument of pcre_compile()), you
       must now pass a similar  pointer  to  pcre_exec()  or  pcre_dfa_exec(),
       because  the  value  saved  with the compiled pattern will obviously be
       nonsense. A field in a pcre_extra() block is used to pass this data, as
       described  in the section on matching a pattern in the pcreapi documen-
       tation.

       If you did not provide custom character tables  when  the  pattern  was
       compiled,  the  pointer  in  the compiled pattern is NULL, which causes
       pcre_exec() to use PCRE's internal tables. Thus, you  do  not  need  to
       take any special action at run time in this case.

       If  you  saved study data with the compiled pattern, you need to create
       your own pcre_extra data block and set the study_data field to point to
       the  reloaded  study  data. You must also set the PCRE_EXTRA_STUDY_DATA
       bit in the flags field to indicate that study  data  is  present.  Then
       pass  the  pcre_extra  block  to  pcre_exec() or pcre_dfa_exec() in the
       usual way.


COMPATIBILITY WITH DIFFERENT PCRE RELEASES

       In general, it is safest to  recompile  all  saved  patterns  when  you
       update  to  a new PCRE release, though not all updates actually require
       this. Recompiling is definitely needed for release 7.2.


AUTHOR

       Philip Hazel
       University Computing Service
       Cambridge CB2 3QH, England.


REVISION

       Last updated: 13 June 2007
       Copyright (c) 1997-2007 University of Cambridge.
------------------------------------------------------------------------------


PCREPERFORM(3)                                                  PCREPERFORM(3)


NAME
       PCRE - Perl-compatible regular expressions


PCRE PERFORMANCE

       Two  aspects  of performance are discussed below: memory usage and pro-
       cessing time. The way you express your pattern as a regular  expression
       can affect both of them.


COMPILED PATTERN MEMORY USAGE

       Patterns are compiled by PCRE into a reasonably efficient byte code, so
       that most simple patterns do not use much memory. However, there is one
       case  where  the memory usage of a compiled pattern can be unexpectedly
       large. If a parenthesized subpattern has a quantifier  with  a  minimum
       greater  than  1  and/or  a  limited  maximum,  the whole subpattern is
       repeated in the compiled code. For example, the pattern

         (abc|def){2,4}

       is compiled as if it were

         (abc|def)(abc|def)((abc|def)(abc|def)?)?

       (Technical aside: It is done this way so that backtrack  points  within
       each of the repetitions can be independently maintained.)

       For  regular expressions whose quantifiers use only small numbers, this
       is not usually a problem. However, if the numbers are large,  and  par-
       ticularly  if  such repetitions are nested, the memory usage can become
       an embarrassment. For example, the very simple pattern

         ((ab){1,1000}c){1,3}

       uses 51K bytes when compiled. When PCRE is compiled  with  its  default
       internal  pointer  size of two bytes, the size limit on a compiled pat-
       tern is 64K, and this is reached with the above pattern  if  the  outer
       repetition is increased from 3 to 4. PCRE can be compiled to use larger
       internal pointers and thus handle larger compiled patterns, but  it  is
       better to try to rewrite your pattern to use less memory if you can.

       One  way  of reducing the memory usage for such patterns is to make use
       of PCRE's "subroutine" facility. Re-writing the above pattern as

         ((ab)(?2){0,999}c)(?1){0,2}

       reduces the memory requirements to 18K, and indeed it remains under 20K
       even  with the outer repetition increased to 100. However, this pattern
       is not exactly equivalent, because the "subroutine" calls  are  treated
       as  atomic groups into which there can be no backtracking if there is a
       subsequent matching failure. Therefore, PCRE cannot  do  this  kind  of
       rewriting  automatically.   Furthermore,  there is a noticeable loss of
       speed when executing the modified pattern. Nevertheless, if the  atomic
       grouping  is  not  a  problem and the loss of speed is acceptable, this
       kind of rewriting will allow you to process patterns that  PCRE  cannot
       otherwise handle.


STACK USAGE AT RUN TIME

       When  pcre_exec()  is  used  for matching, certain kinds of pattern can
       cause it to use large amounts of the process stack.  In  some  environ-
       ments  the default process stack is quite small, and if it runs out the
       result is often SIGSEGV.  This issue is probably  the  most  frequently
       raised  problem  with  PCRE. Rewriting your pattern can often help. The
       pcrestack documentation discusses this issue in detail.


PROCESSING TIME

       Certain items in regular expression patterns are processed  more  effi-
       ciently than others. It is more efficient to use a character class like
       [aeiou]  than  a  set  of   single-character   alternatives   such   as
       (a|e|i|o|u).  In  general,  the simplest construction that provides the
       required behaviour is usually the most efficient. Jeffrey Friedl's book
       contains  a  lot  of useful general discussion about optimizing regular
       expressions for efficient performance. This  document  contains  a  few
       observations about PCRE.

       Using  Unicode  character  properties  (the  \p, \P, and \X escapes) is
       slow, because PCRE has to scan a structure that contains data for  over
       fifteen  thousand  characters whenever it needs a character's property.
       If you can find an alternative pattern  that  does  not  use  character
       properties, it will probably be faster.

       When  a  pattern  begins  with .* not in parentheses, or in parentheses
       that are not the subject of a backreference, and the PCRE_DOTALL option
       is  set, the pattern is implicitly anchored by PCRE, since it can match
       only at the start of a subject string. However, if PCRE_DOTALL  is  not
       set,  PCRE  cannot  make this optimization, because the . metacharacter
       does not then match a newline, and if the subject string contains  new-
       lines,  the  pattern may match from the character immediately following
       one of them instead of from the very start. For example, the pattern

         .*second

       matches the subject "first\nand second" (where \n stands for a  newline
       character),  with the match starting at the seventh character. In order
       to do this, PCRE has to retry the match starting after every newline in
       the subject.

       If  you  are using such a pattern with subject strings that do not con-
       tain newlines, the best performance is obtained by setting PCRE_DOTALL,
       or  starting  the pattern with ^.* or ^.*? to indicate explicit anchor-
       ing. That saves PCRE from having to scan along the subject looking  for
       a newline to restart at.

       Beware  of  patterns  that contain nested indefinite repeats. These can
       take a long time to run when applied to a string that does  not  match.
       Consider the pattern fragment

         ^(a+)*

       This  can  match "aaaa" in 16 different ways, and this number increases
       very rapidly as the string gets longer. (The * repeat can match  0,  1,
       2,  3, or 4 times, and for each of those cases other than 0 or 4, the +
       repeats can match different numbers of times.) When  the  remainder  of
       the pattern is such that the entire match is going to fail, PCRE has in
       principle to try  every  possible  variation,  and  this  can  take  an
       extremely long time, even for relatively short strings.

       An optimization catches some of the more simple cases such as

         (a+)*b

       where  a  literal  character  follows. Before embarking on the standard
       matching procedure, PCRE checks that there is a "b" later in  the  sub-
       ject  string, and if there is not, it fails the match immediately. How-
       ever, when there is no following literal this  optimization  cannot  be
       used. You can see the difference by comparing the behaviour of

         (a+)*\d

       with  the  pattern  above.  The former gives a failure almost instantly
       when applied to a whole line of  "a"  characters,  whereas  the  latter
       takes an appreciable time with strings longer than about 20 characters.

       In many cases, the solution to this kind of performance issue is to use
       an atomic group or a possessive quantifier.


AUTHOR

       Philip Hazel
       University Computing Service
       Cambridge CB2 3QH, England.


REVISION

       Last updated: 07 March 2010
       Copyright (c) 1997-2010 University of Cambridge.
------------------------------------------------------------------------------


PCREPOSIX(3)                                                      PCREPOSIX(3)


NAME
       PCRE - Perl-compatible regular expressions.


SYNOPSIS OF POSIX API

       #include <pcreposix.h>

       int regcomp(regex_t *preg, const char *pattern,
            int cflags);

       int regexec(regex_t *preg, const char *string,
            size_t nmatch, regmatch_t pmatch[], int eflags);

       size_t regerror(int errcode, const regex_t *preg,
            char *errbuf, size_t errbuf_size);

       void regfree(regex_t *preg);


DESCRIPTION

       This  set  of  functions provides a POSIX-style API to the PCRE regular
       expression package. See the pcreapi documentation for a description  of
       PCRE's native API, which contains much additional functionality.

       The functions described here are just wrapper functions that ultimately
       call  the  PCRE  native  API.  Their  prototypes  are  defined  in  the
       pcreposix.h  header  file,  and  on  Unix systems the library itself is
       called pcreposix.a, so can be accessed by  adding  -lpcreposix  to  the
       command  for  linking  an application that uses them. Because the POSIX
       functions call the native ones, it is also necessary to add -lpcre.

       I have implemented only those POSIX option bits that can be  reasonably
       mapped  to PCRE native options. In addition, the option REG_EXTENDED is
       defined with the value zero. This has no  effect,  but  since  programs
       that  are  written  to  the POSIX interface often use it, this makes it
       easier to slot in PCRE as a replacement library.  Other  POSIX  options
       are not even defined.

       There  are also some other options that are not defined by POSIX. These
       have been added at the request of users who want to make use of certain
       PCRE-specific features via the POSIX calling interface.

       When  PCRE  is  called  via these functions, it is only the API that is
       POSIX-like in style. The syntax and semantics of  the  regular  expres-
       sions  themselves  are  still  those of Perl, subject to the setting of
       various PCRE options, as described below. "POSIX-like in  style"  means
       that  the  API  approximates  to  the POSIX definition; it is not fully
       POSIX-compatible, and in multi-byte encoding  domains  it  is  probably
       even less compatible.

       The  header for these functions is supplied as pcreposix.h to avoid any
       potential clash with other POSIX  libraries.  It  can,  of  course,  be
       renamed or aliased as regex.h, which is the "correct" name. It provides
       two structure types, regex_t for  compiled  internal  forms,  and  reg-
       match_t  for  returning  captured substrings. It also defines some con-
       stants whose names start  with  "REG_";  these  are  used  for  setting
       options and identifying error codes.


COMPILING A PATTERN

       The  function regcomp() is called to compile a pattern into an internal
       form. The pattern is a C string terminated by a  binary  zero,  and  is
       passed  in  the  argument  pattern. The preg argument is a pointer to a
       regex_t structure that is used as a base for storing information  about
       the compiled regular expression.

       The argument cflags is either zero, or contains one or more of the bits
       defined by the following macros:

         REG_DOTALL

       The PCRE_DOTALL option is set when the regular expression is passed for
       compilation to the native function. Note that REG_DOTALL is not part of
       the POSIX standard.

         REG_ICASE

       The PCRE_CASELESS option is set when the regular expression  is  passed
       for compilation to the native function.

         REG_NEWLINE

       The  PCRE_MULTILINE option is set when the regular expression is passed
       for compilation to the native function. Note that this does  not  mimic
       the  defined  POSIX  behaviour  for REG_NEWLINE (see the following sec-
       tion).

         REG_NOSUB

       The PCRE_NO_AUTO_CAPTURE option is set when the regular  expression  is
       passed for compilation to the native function. In addition, when a pat-
       tern that is compiled with this flag is passed to regexec() for  match-
       ing,  the  nmatch  and  pmatch  arguments  are ignored, and no captured
       strings are returned.

         REG_UNGREEDY

       The PCRE_UNGREEDY option is set when the regular expression  is  passed
       for  compilation  to the native function. Note that REG_UNGREEDY is not
       part of the POSIX standard.

         REG_UTF8

       The PCRE_UTF8 option is set when the regular expression is  passed  for
       compilation  to the native function. This causes the pattern itself and
       all data strings used for matching it to be treated as  UTF-8  strings.
       Note that REG_UTF8 is not part of the POSIX standard.

       In  the  absence  of  these  flags, no options are passed to the native
       function.  This means the the  regex  is  compiled  with  PCRE  default
       semantics.  In particular, the way it handles newline characters in the
       subject string is the Perl way, not the POSIX way.  Note  that  setting
       PCRE_MULTILINE  has only some of the effects specified for REG_NEWLINE.
       It does not affect the way newlines are matched by . (they are not)  or
       by a negative class such as [^a] (they are).

       The  yield of regcomp() is zero on success, and non-zero otherwise. The
       preg structure is filled in on success, and one member of the structure
       is  public: re_nsub contains the number of capturing subpatterns in the
       regular expression. Various error codes are defined in the header file.

       NOTE: If the yield of regcomp() is non-zero, you must  not  attempt  to
       use the contents of the preg structure. If, for example, you pass it to
       regexec(), the result is undefined and your program is likely to crash.


MATCHING NEWLINE CHARACTERS

       This area is not simple, because POSIX and Perl take different views of
       things.   It  is  not possible to get PCRE to obey POSIX semantics, but
       then PCRE was never intended to be a POSIX engine. The following  table
       lists  the  different  possibilities for matching newline characters in
       PCRE:

                                 Default   Change with

         . matches newline          no     PCRE_DOTALL
         newline matches [^a]       yes    not changeable
         $ matches \n at end        yes    PCRE_DOLLARENDONLY
         $ matches \n in middle     no     PCRE_MULTILINE
         ^ matches \n in middle     no     PCRE_MULTILINE

       This is the equivalent table for POSIX:

                                 Default   Change with

         . matches newline          yes    REG_NEWLINE
         newline matches [^a]       yes    REG_NEWLINE
         $ matches \n at end        no     REG_NEWLINE
         $ matches \n in middle     no     REG_NEWLINE
         ^ matches \n in middle     no     REG_NEWLINE

       PCRE's behaviour is the same as Perl's, except that there is no equiva-
       lent  for  PCRE_DOLLAR_ENDONLY in Perl. In both PCRE and Perl, there is
       no way to stop newline from matching [^a].

       The  default  POSIX  newline  handling  can  be  obtained  by   setting
       PCRE_DOTALL  and  PCRE_DOLLAR_ENDONLY, but there is no way to make PCRE
       behave exactly as for the REG_NEWLINE action.


MATCHING A PATTERN

       The function regexec() is called  to  match  a  compiled  pattern  preg
       against  a  given string, which is by default terminated by a zero byte
       (but see REG_STARTEND below), subject to the options in  eflags.  These
       can be:

         REG_NOTBOL

       The PCRE_NOTBOL option is set when calling the underlying PCRE matching
       function.

         REG_NOTEMPTY

       The PCRE_NOTEMPTY option is set when calling the underlying PCRE match-
       ing function. Note that REG_NOTEMPTY is not part of the POSIX standard.
       However, setting this option can give more POSIX-like behaviour in some
       situations.

         REG_NOTEOL

       The PCRE_NOTEOL option is set when calling the underlying PCRE matching
       function.

         REG_STARTEND

       The string is considered to start at string +  pmatch[0].rm_so  and  to
       have  a terminating NUL located at string + pmatch[0].rm_eo (there need
       not actually be a NUL at that location), regardless  of  the  value  of
       nmatch.  This  is a BSD extension, compatible with but not specified by
       IEEE Standard 1003.2 (POSIX.2), and should  be  used  with  caution  in
       software intended to be portable to other systems. Note that a non-zero
       rm_so does not imply REG_NOTBOL; REG_STARTEND affects only the location
       of the string, not how it is matched.

       If  the pattern was compiled with the REG_NOSUB flag, no data about any
       matched strings  is  returned.  The  nmatch  and  pmatch  arguments  of
       regexec() are ignored.

       If the value of nmatch is zero, or if the value pmatch is NULL, no data
       about any matched strings is returned.

       Otherwise,the portion of the string that was matched, and also any cap-
       tured substrings, are returned via the pmatch argument, which points to
       an array of nmatch structures of type regmatch_t, containing  the  mem-
       bers  rm_so  and rm_eo. These contain the offset to the first character
       of each substring and the offset to the first character after  the  end
       of  each substring, respectively. The 0th element of the vector relates
       to the entire portion of string that was matched;  subsequent  elements
       relate  to  the capturing subpatterns of the regular expression. Unused
       entries in the array have both structure members set to -1.

       A successful match yields  a  zero  return;  various  error  codes  are
       defined  in  the  header  file,  of which REG_NOMATCH is the "expected"
       failure code.


ERROR MESSAGES

       The regerror() function maps a non-zero errorcode from either regcomp()
       or  regexec()  to  a  printable message. If preg is not NULL, the error
       should have arisen from the use of that structure. A message terminated
       by  a  binary  zero  is  placed  in  errbuf. The length of the message,
       including the zero, is limited to errbuf_size. The yield of  the  func-
       tion is the size of buffer needed to hold the whole message.


MEMORY USAGE

       Compiling  a regular expression causes memory to be allocated and asso-
       ciated with the preg structure. The function regfree() frees  all  such
       memory,  after  which  preg may no longer be used as a compiled expres-
       sion.


AUTHOR

       Philip Hazel
       University Computing Service
       Cambridge CB2 3QH, England.


REVISION

       Last updated: 02 September 2009
       Copyright (c) 1997-2009 University of Cambridge.
------------------------------------------------------------------------------


PCRECPP(3)                                                          PCRECPP(3)


NAME
       PCRE - Perl-compatible regular expressions.


SYNOPSIS OF C++ WRAPPER

       #include <pcrecpp.h>


DESCRIPTION

       The  C++  wrapper  for PCRE was provided by Google Inc. Some additional
       functionality was added by Giuseppe Maxia. This brief man page was con-
       structed  from  the  notes  in the pcrecpp.h file, which should be con-
       sulted for further details.


MATCHING INTERFACE

       The "FullMatch" operation checks that supplied text matches a  supplied
       pattern  exactly.  If pointer arguments are supplied, it copies matched
       sub-strings that match sub-patterns into them.

         Example: successful match
            pcrecpp::RE re("h.*o");
            re.FullMatch("hello");

         Example: unsuccessful match (requires full match):
            pcrecpp::RE re("e");
            !re.FullMatch("hello");

         Example: creating a temporary RE object:
            pcrecpp::RE("h.*o").FullMatch("hello");

       You can pass in a "const char*" or a "string" for "text". The  examples
       below  tend to use a const char*. You can, as in the different examples
       above, store the RE object explicitly in a variable or use a  temporary
       RE  object.  The  examples below use one mode or the other arbitrarily.
       Either could correctly be used for any of these examples.

       You must supply extra pointer arguments to extract matched subpieces.

         Example: extracts "ruby" into "s" and 1234 into "i"
            int i;
            string s;
            pcrecpp::RE re("(\\w+):(\\d+)");
            re.FullMatch("ruby:1234", &s, &i);

         Example: does not try to extract any extra sub-patterns
            re.FullMatch("ruby:1234", &s);

         Example: does not try to extract into NULL
            re.FullMatch("ruby:1234", NULL, &i);

         Example: integer overflow causes failure
            !re.FullMatch("ruby:1234567891234", NULL, &i);

         Example: fails because there aren't enough sub-patterns:
            !pcrecpp::RE("\\w+:\\d+").FullMatch("ruby:1234", &s);

         Example: fails because string cannot be stored in integer
            !pcrecpp::RE("(.*)").FullMatch("ruby", &i);

       The provided pointer arguments can be pointers to  any  scalar  numeric
       type, or one of:

          string        (matched piece is copied to string)
          StringPiece   (StringPiece is mutated to point to matched piece)
          T             (where "bool T::ParseFrom(const char*, int)" exists)
          NULL          (the corresponding matched sub-pattern is not copied)

       The  function returns true iff all of the following conditions are sat-
       isfied:

         a. "text" matches "pattern" exactly;

         b. The number of matched sub-patterns is >= number of supplied
            pointers;

         c. The "i"th argument has a suitable type for holding the
            string captured as the "i"th sub-pattern. If you pass in
            void * NULL for the "i"th argument, or a non-void * NULL
            of the correct type, or pass fewer arguments than the
            number of sub-patterns, "i"th captured sub-pattern is
            ignored.

       CAVEAT: An optional sub-pattern that does  not  exist  in  the  matched
       string  is  assigned  the  empty  string. Therefore, the following will
       return false (because the empty string is not a valid number):

          int number;
          pcrecpp::RE::FullMatch("abc", "[a-z]+(\\d+)?", &number);

       The matching interface supports at most 16 arguments per call.  If  you
       need    more,    consider    using    the    more   general   interface
       pcrecpp::RE::DoMatch. See pcrecpp.h for the signature for DoMatch.

       NOTE: Do not use no_arg, which is used internally to mark the end of  a
       list  of optional arguments, as a placeholder for missing arguments, as
       this can lead to segfaults.


QUOTING METACHARACTERS

       You can use the "QuoteMeta" operation to insert backslashes before  all
       potentially  meaningful  characters  in  a string. The returned string,
       used as a regular expression, will exactly match the original string.

         Example:
            string quoted = RE::QuoteMeta(unquoted);

       Note that it's legal to escape a character even if it  has  no  special
       meaning  in  a  regular expression -- so this function does that. (This
       also makes it identical to the perl function  of  the  same  name;  see
       "perldoc    -f    quotemeta".)    For   example,   "1.5-2.0?"   becomes
       "1\.5\-2\.0\?".


PARTIAL MATCHES

       You can use the "PartialMatch" operation when you want the  pattern  to
       match any substring of the text.

         Example: simple search for a string:
            pcrecpp::RE("ell").PartialMatch("hello");

         Example: find first number in a string:
            int number;
            pcrecpp::RE re("(\\d+)");
            re.PartialMatch("x*100 + 20", &number);
            assert(number == 100);


UTF-8 AND THE MATCHING INTERFACE

       By  default,  pattern  and text are plain text, one byte per character.
       The UTF8 flag, passed to  the  constructor,  causes  both  pattern  and
       string to be treated as UTF-8 text, still a byte stream but potentially
       multiple bytes per character. In practice, the text is likelier  to  be
       UTF-8  than  the pattern, but the match returned may depend on the UTF8
       flag, so always use it when matching UTF8 text. For example,  "."  will
       match  one  byte normally but with UTF8 set may match up to three bytes
       of a multi-byte character.

         Example:
            pcrecpp::RE_Options options;
            options.set_utf8();
            pcrecpp::RE re(utf8_pattern, options);
            re.FullMatch(utf8_string);

         Example: using the convenience function UTF8():
            pcrecpp::RE re(utf8_pattern, pcrecpp::UTF8());
            re.FullMatch(utf8_string);

       NOTE: The UTF8 flag is ignored if pcre was not configured with the
             --enable-utf8 flag.


PASSING MODIFIERS TO THE REGULAR EXPRESSION ENGINE

       PCRE defines some modifiers to  change  the  behavior  of  the  regular
       expression   engine.  The  C++  wrapper  defines  an  auxiliary  class,
       RE_Options, as a vehicle to pass such modifiers to  a  RE  class.  Cur-
       rently, the following modifiers are supported:

          modifier              description               Perl corresponding

          PCRE_CASELESS         case insensitive match      /i
          PCRE_MULTILINE        multiple lines match        /m
          PCRE_DOTALL           dot matches newlines        /s
          PCRE_DOLLAR_ENDONLY   $ matches only at end       N/A
          PCRE_EXTRA            strict escape parsing       N/A
          PCRE_EXTENDED         ignore whitespaces          /x
          PCRE_UTF8             handles UTF8 chars          built-in
          PCRE_UNGREEDY         reverses * and *?           N/A
          PCRE_NO_AUTO_CAPTURE  disables capturing parens   N/A (*)

       (*)  Both Perl and PCRE allow non capturing parentheses by means of the
       "?:" modifier within the pattern itself. e.g. (?:ab|cd) does  not  cap-
       ture, while (ab|cd) does.

       For  a  full  account on how each modifier works, please check the PCRE
       API reference page.

       For each modifier, there are two member functions whose  name  is  made
       out  of  the  modifier  in  lowercase,  without the "PCRE_" prefix. For
       instance, PCRE_CASELESS is handled by

         bool caseless()

       which returns true if the modifier is set, and

         RE_Options & set_caseless(bool)

       which sets or unsets the modifier. Moreover, PCRE_EXTRA_MATCH_LIMIT can
       be  accessed  through  the  set_match_limit()  and match_limit() member
       functions. Setting match_limit to a non-zero value will limit the  exe-
       cution  of pcre to keep it from doing bad things like blowing the stack
       or taking an eternity to return a result.  A  value  of  5000  is  good
       enough  to stop stack blowup in a 2MB thread stack. Setting match_limit
       to  zero  disables  match  limiting.  Alternatively,   you   can   call
       match_limit_recursion()  which uses PCRE_EXTRA_MATCH_LIMIT_RECURSION to
       limit how much  PCRE  recurses.  match_limit()  limits  the  number  of
       matches PCRE does; match_limit_recursion() limits the depth of internal
       recursion, and therefore the amount of stack that is used.

       Normally, to pass one or more modifiers to a RE class,  you  declare  a
       RE_Options object, set the appropriate options, and pass this object to
       a RE constructor. Example:

          RE_options opt;
          opt.set_caseless(true);
          if (RE("HELLO", opt).PartialMatch("hello world")) ...

       RE_options has two constructors. The default constructor takes no argu-
       ments  and creates a set of flags that are off by default. The optional
       parameter option_flags is to facilitate transfer of legacy code from  C
       programs.  This lets you do

          RE(pattern,
            RE_Options(PCRE_CASELESS|PCRE_MULTILINE)).PartialMatch(str);

       However, new code is better off doing

          RE(pattern,
            RE_Options().set_caseless(true).set_multiline(true))
              .PartialMatch(str);

       If you are going to pass one of the most used modifiers, there are some
       convenience functions that return a RE_Options class with the appropri-
       ate  modifier  already  set: CASELESS(), UTF8(), MULTILINE(), DOTALL(),
       and EXTENDED().

       If you need to set several options at once, and you don't  want  to  go
       through  the pains of declaring a RE_Options object and setting several
       options, there is a parallel method that give you such ability  on  the
       fly.  You  can  concatenate several set_xxxxx() member functions, since
       each of them returns a reference to its class object. For  example,  to
       pass  PCRE_CASELESS, PCRE_EXTENDED, and PCRE_MULTILINE to a RE with one
       statement, you may write:

          RE(" ^ xyz \\s+ .* blah$",
            RE_Options()
              .set_caseless(true)
              .set_extended(true)
              .set_multiline(true)).PartialMatch(sometext);


SCANNING TEXT INCREMENTALLY

       The "Consume" operation may be useful if you want to  repeatedly  match
       regular expressions at the front of a string and skip over them as they
       match. This requires use of the "StringPiece" type, which represents  a
       sub-range  of  a  real  string.  Like RE, StringPiece is defined in the
       pcrecpp namespace.

         Example: read lines of the form "var = value" from a string.
            string contents = ...;                 // Fill string somehow
            pcrecpp::StringPiece input(contents);  // Wrap in a StringPiece

            string var;
            int value;
            pcrecpp::RE re("(\\w+) = (\\d+)\n");
            while (re.Consume(&input, &var, &value)) {
              ...;
            }

       Each successful call  to  "Consume"  will  set  "var/value",  and  also
       advance "input" so it points past the matched text.

       The  "FindAndConsume"  operation  is  similar to "Consume" but does not
       anchor your match at the beginning of  the  string.  For  example,  you
       could extract all words from a string by repeatedly calling

         pcrecpp::RE("(\\w+)").FindAndConsume(&input, &word)


PARSING HEX/OCTAL/C-RADIX NUMBERS

       By default, if you pass a pointer to a numeric value, the corresponding
       text is interpreted as a base-10  number.  You  can  instead  wrap  the
       pointer with a call to one of the operators Hex(), Octal(), or CRadix()
       to interpret the text in another base. The CRadix  operator  interprets
       C-style  "0"  (base-8)  and  "0x"  (base-16)  prefixes, but defaults to
       base-10.

         Example:
           int a, b, c, d;
           pcrecpp::RE re("(.*) (.*) (.*) (.*)");
           re.FullMatch("100 40 0100 0x40",
                        pcrecpp::Octal(&a), pcrecpp::Hex(&b),
                        pcrecpp::CRadix(&c), pcrecpp::CRadix(&d));

       will leave 64 in a, b, c, and d.


REPLACING PARTS OF STRINGS

       You can replace the first match of "pattern" in "str"  with  "rewrite".
       Within  "rewrite",  backslash-escaped  digits (\1 to \9) can be used to
       insert text matching corresponding parenthesized group  from  the  pat-
       tern. \0 in "rewrite" refers to the entire matching text. For example:

         string s = "yabba dabba doo";
         pcrecpp::RE("b+").Replace("d", &s);

       will  leave  "s" containing "yada dabba doo". The result is true if the
       pattern matches and a replacement occurs, false otherwise.

       GlobalReplace is like Replace except that it replaces  all  occurrences
       of  the  pattern  in  the string with the rewrite. Replacements are not
       subject to re-matching. For example:

         string s = "yabba dabba doo";
         pcrecpp::RE("b+").GlobalReplace("d", &s);

       will leave "s" containing "yada dada doo". It  returns  the  number  of
       replacements made.

       Extract  is like Replace, except that if the pattern matches, "rewrite"
       is copied into "out" (an additional argument) with substitutions.   The
       non-matching  portions  of "text" are ignored. Returns true iff a match
       occurred and the extraction happened successfully;  if no match occurs,
       the string is left unaffected.


AUTHOR

       The C++ wrapper was contributed by Google Inc.
       Copyright (c) 2007 Google Inc.


REVISION

       Last updated: 17 March 2009
------------------------------------------------------------------------------


PCRESAMPLE(3)                                                    PCRESAMPLE(3)


NAME
       PCRE - Perl-compatible regular expressions


PCRE SAMPLE PROGRAM

       A simple, complete demonstration program, to get you started with using
       PCRE, is supplied in the file pcredemo.c in the  PCRE  distribution.  A
       listing  of this program is given in the pcredemo documentation. If you
       do not have a copy of the PCRE distribution, you can save this  listing
       to re-create pcredemo.c.

       The program compiles the regular expression that is its first argument,
       and matches it against the subject string in its  second  argument.  No
       PCRE  options are set, and default character tables are used. If match-
       ing succeeds, the program outputs  the  portion  of  the  subject  that
       matched, together with the contents of any captured substrings.

       If the -g option is given on the command line, the program then goes on
       to check for further matches of the same regular expression in the same
       subject  string. The logic is a little bit tricky because of the possi-
       bility of matching an empty string. Comments in the code  explain  what
       is going on.

       If  PCRE  is  installed in the standard include and library directories
       for your operating system, you should be able to compile the demonstra-
       tion program using this command:

         gcc -o pcredemo pcredemo.c -lpcre

       If  PCRE is installed elsewhere, you may need to add additional options
       to the command line. For example, on a Unix-like system that  has  PCRE
       installed  in  /usr/local,  you  can  compile the demonstration program
       using a command like this:

         gcc -o pcredemo -I/usr/local/include pcredemo.c \
             -L/usr/local/lib -lpcre

       Once you have compiled the demonstration program, you  can  run  simple
       tests like this:

         ./pcredemo 'cat|dog' 'the cat sat on the mat'
         ./pcredemo -g 'cat|dog' 'the dog sat on the cat'

       Note  that  there  is  a  much  more comprehensive test program, called
       pcretest, which supports  many  more  facilities  for  testing  regular
       expressions and the PCRE library. The pcredemo program is provided as a
       simple coding example.

       When you try to run pcredemo when PCRE is not installed in the standard
       library  directory,  you  may  get an error like this on some operating
       systems (e.g. Solaris):

         ld.so.1: a.out: fatal: libpcre.so.0: open failed:  No  such  file  or
       directory

       This  is  caused  by the way shared library support works on those sys-
       tems. You need to add

         -R/usr/local/lib

       (for example) to the compile command to get round this problem.


AUTHOR

       Philip Hazel
       University Computing Service
       Cambridge CB2 3QH, England.


REVISION

       Last updated: 30 September 2009
       Copyright (c) 1997-2009 University of Cambridge.
------------------------------------------------------------------------------
PCRESTACK(3)                                                      PCRESTACK(3)


NAME
       PCRE - Perl-compatible regular expressions


PCRE DISCUSSION OF STACK USAGE

       When  you call pcre_exec(), it makes use of an internal function called
       match(). This calls itself recursively at branch points in the pattern,
       in  order to remember the state of the match so that it can back up and
       try a different alternative if the first one fails.  As  matching  pro-
       ceeds  deeper  and deeper into the tree of possibilities, the recursion
       depth increases.

       Not all calls of match() increase the recursion depth; for an item such
       as  a* it may be called several times at the same level, after matching
       different numbers of a's. Furthermore, in a number of cases  where  the
       result  of  the  recursive call would immediately be passed back as the
       result of the current call (a "tail recursion"), the function  is  just
       restarted instead.

       The pcre_dfa_exec() function operates in an entirely different way, and
       uses recursion only when there is a  regular  expression  recursion  or
       subroutine  call in the pattern. This includes the processing of asser-
       tion and "once-only" subpatterns, which  are  handled  like  subroutine
       calls.  Normally,  these are never very deep, and the limit on the com-
       plexity of pcre_dfa_exec() is controlled by the amount of workspace  it
       is  given. However, it is possible to write patterns with runaway infi-
       nite recursions; such patterns will cause pcre_dfa_exec() to run out of
       stack. At present, there is no protection against this.

       The comments that follow do NOT apply to pcre_dfa_exec(); they are rel-
       evant only for pcre_exec().

   Reducing pcre_exec()'s stack usage

       Each time that match() is actually called recursively, it  uses  memory
       from  the  process  stack.  For certain kinds of pattern and data, very
       large amounts of stack may be needed, despite the recognition of  "tail
       recursion".   You  can often reduce the amount of recursion, and there-
       fore the amount of stack used, by modifying the pattern that  is  being
       matched. Consider, for example, this pattern:

         ([^<]|<(?!inet))+

       It  matches  from wherever it starts until it encounters "<inet" or the
       end of the data, and is the kind of pattern that  might  be  used  when
       processing an XML file. Each iteration of the outer parentheses matches
       either one character that is not "<" or a "<" that is not  followed  by
       "inet".  However,  each  time  a  parenthesis is processed, a recursion
       occurs, so this formulation uses a stack frame for each matched charac-
       ter.  For  a long string, a lot of stack is required. Consider now this
       rewritten pattern, which matches exactly the same strings:

         ([^<]++|<(?!inet))+

       This uses very much less stack, because runs of characters that do  not
       contain  "<" are "swallowed" in one item inside the parentheses. Recur-
       sion happens only when a "<" character that is not followed  by  "inet"
       is  encountered  (and  we assume this is relatively rare). A possessive
       quantifier is used to stop any backtracking into the  runs  of  non-"<"
       characters, but that is not related to stack usage.

       This  example shows that one way of avoiding stack problems when match-
       ing long subject strings is to write repeated parenthesized subpatterns
       to match more than one character whenever possible.

   Compiling PCRE to use heap instead of stack for pcre_exec()

       In  environments  where  stack memory is constrained, you might want to
       compile PCRE to use heap memory instead of stack for remembering  back-
       up  points  when  pcre_exec()  is running. This makes it run a lot more
       slowly, however.  Details of how to do this are given in the  pcrebuild
       documentation. When built in this way, instead of using the stack, PCRE
       obtains and frees memory by calling the functions that are  pointed  to
       by  the  pcre_stack_malloc  and  pcre_stack_free variables. By default,
       these point to malloc() and free(), but you can replace the pointers to
       cause  PCRE to use your own functions. Since the block sizes are always
       the same, and are always freed in reverse order, it may be possible  to
       implement  customized  memory handlers that are more efficient than the
       standard functions.

   Limiting pcre_exec()'s stack usage

       You can set limits on the number of times that match() is called,  both
       in  total  and recursively. If a limit is exceeded, pcre_exec() returns
       an error code. Setting suitable limits should prevent it  from  running
       out  of  stack.  The  default  values of the limits are very large, and
       unlikely ever to operate. They can be changed when PCRE is  built,  and
       they  can  also be set when pcre_exec() is called. For details of these
       interfaces, see the pcrebuild documentation and the  section  on  extra
       data for pcre_exec() in the pcreapi documentation.

       As a very rough rule of thumb, you should reckon on about 500 bytes per
       recursion. Thus, if you want to limit your  stack  usage  to  8Mb,  you
       should  set  the  limit at 16000 recursions. A 64Mb stack, on the other
       hand, can support around 128000 recursions.

       In Unix-like environments, the pcretest test program has a command line
       option (-S) that can be used to increase the size of its stack. As long
       as the stack is large enough, another option (-M) can be used  to  find
       the  smallest  limits  that allow a particular pattern to match a given
       subject string. This is done by  calling  pcre_exec()  repeatedly  with
       different limits.

   Changing stack size in Unix-like systems

       In  Unix-like environments, there is not often a problem with the stack
       unless very long strings are involved,  though  the  default  limit  on
       stack  size  varies  from system to system. Values from 8Mb to 64Mb are
       common. You can find your default limit by running the command:

         ulimit -s

       Unfortunately, the effect of running out of  stack  is  often  SIGSEGV,
       though  sometimes  a more explicit error message is given. You can nor-
       mally increase the limit on stack size by code such as this:

         struct rlimit rlim;
         getrlimit(RLIMIT_STACK, &rlim);
         rlim.rlim_cur = 100*1024*1024;
         setrlimit(RLIMIT_STACK, &rlim);

       This reads the current limits (soft and hard) using  getrlimit(),  then
       attempts  to  increase  the  soft limit to 100Mb using setrlimit(). You
       must do this before calling pcre_exec().

   Changing stack size in Mac OS X

       Using setrlimit(), as described above, should also work on Mac OS X. It
       is also possible to set a stack size when linking a program. There is a
       discussion  about  stack  sizes  in  Mac  OS  X  at  this   web   site:
       http://developer.apple.com/qa/qa2005/qa1419.html.


AUTHOR

       Philip Hazel
       University Computing Service
       Cambridge CB2 3QH, England.


REVISION

       Last updated: 03 January 2010
       Copyright (c) 1997-2010 University of Cambridge.
------------------------------------------------------------------------------


PK��$[��.�z�z"doc/alt-pcre802-devel/pcretest.txtnu�[���PCRETEST(1)                                                        PCRETEST(1)


NAME
       pcretest - a program for testing Perl-compatible regular expressions.


SYNOPSIS

       pcretest [options] [source] [destination]

       pcretest  was written as a test program for the PCRE regular expression
       library itself, but it can also be used for experimenting with  regular
       expressions.  This document describes the features of the test program;
       for details of the regular expressions themselves, see the  pcrepattern
       documentation. For details of the PCRE library function calls and their
       options, see the pcreapi documentation.


OPTIONS

       -b        Behave as if each regex has the /B (show bytecode)  modifier;
                 the internal form is output after compilation.

       -C        Output the version number of the PCRE library, and all avail-
                 able  information  about  the  optional  features  that   are
                 included, and then exit.

       -d        Behave  as  if  each  regex  has the /D (debug) modifier; the
                 internal form and information about the compiled  pattern  is
                 output after compilation; -d is equivalent to -b -i.

       -dfa      Behave  as if each data line contains the \D escape sequence;
                 this    causes    the    alternative    matching    function,
                 pcre_dfa_exec(),   to   be   used  instead  of  the  standard
                 pcre_exec() function (more detail is given below).

       -help     Output a brief summary these options and then exit.

       -i        Behave as if each regex  has  the  /I  modifier;  information
                 about the compiled pattern is given after compilation.

       -M        Behave  as if each data line contains the \M escape sequence;
                 this causes PCRE to  discover  the  minimum  MATCH_LIMIT  and
                 MATCH_LIMIT_RECURSION settings by calling pcre_exec() repeat-
                 edly with different limits.

       -m        Output the size of each compiled pattern after  it  has  been
                 compiled.  This  is  equivalent  to adding /M to each regular
                 expression.  For  compatibility  with  earlier  versions   of
                 pcretest, -s is a synonym for -m.

       -o osize  Set  the number of elements in the output vector that is used
                 when calling pcre_exec() or pcre_dfa_exec() to be osize.  The
                 default  value is 45, which is enough for 14 capturing subex-
                 pressions  for  pcre_exec()  or  22  different  matches   for
                 pcre_dfa_exec().  The vector size can be changed for individ-
                 ual matching calls by including \O  in  the  data  line  (see
                 below).

       -p        Behave  as if each regex has the /P modifier; the POSIX wrap-
                 per API is used to call PCRE. None of the other  options  has
                 any effect when -p is set.

       -q        Do  not output the version number of pcretest at the start of
                 execution.

       -S size   On Unix-like systems, set the size of the  runtime  stack  to
                 size megabytes.

       -t        Run  each  compile, study, and match many times with a timer,
                 and output resulting time per compile or match (in  millisec-
                 onds).  Do  not set -m with -t, because you will then get the
                 size output a zillion times, and  the  timing  will  be  dis-
                 torted.  You  can  control  the number of iterations that are
                 used for timing by following -t with a number (as a  separate
                 item on the command line). For example, "-t 1000" would iter-
                 ate 1000 times. The default is to iterate 500000 times.

       -tm       This is like -t except that it times only the matching phase,
                 not the compile or study phases.


DESCRIPTION

       If  pcretest  is  given two filename arguments, it reads from the first
       and writes to the second. If it is given only one filename argument, it
       reads  from  that  file  and writes to stdout. Otherwise, it reads from
       stdin and writes to stdout, and prompts for each line of  input,  using
       "re>" to prompt for regular expressions, and "data>" to prompt for data
       lines.

       When pcretest is built, a configuration  option  can  specify  that  it
       should  be  linked  with the libreadline library. When this is done, if
       the input is from a terminal, it is read using the readline() function.
       This  provides line-editing and history facilities. The output from the
       -help option states whether or not readline() will be used.

       The program handles any number of sets of input on a single input file.
       Each  set starts with a regular expression, and continues with any num-
       ber of data lines to be matched against the pattern.

       Each data line is matched separately and independently. If you want  to
       do multi-line matches, you have to use the \n escape sequence (or \r or
       \r\n, etc., depending on the newline setting) in a single line of input
       to  encode  the  newline  sequences. There is no limit on the length of
       data lines; the input buffer is automatically extended  if  it  is  too
       small.

       An  empty  line signals the end of the data lines, at which point a new
       regular expression is read. The regular expressions are given  enclosed
       in any non-alphanumeric delimiters other than backslash, for example:

         /(a|bc)x+yz/

       White  space before the initial delimiter is ignored. A regular expres-
       sion may be continued over several input lines, in which case the  new-
       line  characters  are included within it. It is possible to include the
       delimiter within the pattern by escaping it, for example

         /abc\/def/

       If you do so, the escape and the delimiter form part  of  the  pattern,
       but  since delimiters are always non-alphanumeric, this does not affect
       its interpretation.  If the terminating delimiter is  immediately  fol-
       lowed by a backslash, for example,

         /abc/\

       then  a  backslash  is added to the end of the pattern. This is done to
       provide a way of testing the error condition that arises if  a  pattern
       finishes with a backslash, because

         /abc\/

       is  interpreted as the first line of a pattern that starts with "abc/",
       causing pcretest to read the next line as a continuation of the regular
       expression.


PATTERN MODIFIERS

       A  pattern may be followed by any number of modifiers, which are mostly
       single characters. Following Perl usage, these are  referred  to  below
       as,  for  example,  "the /i modifier", even though the delimiter of the
       pattern need not always be a slash, and no slash is used  when  writing
       modifiers.  Whitespace  may  appear between the final pattern delimiter
       and the first modifier, and between the modifiers themselves.

       The /i, /m, /s, and /x modifiers set the PCRE_CASELESS, PCRE_MULTILINE,
       PCRE_DOTALL,  or  PCRE_EXTENDED  options,  respectively, when pcre_com-
       pile() is called. These four modifier letters have the same  effect  as
       they do in Perl. For example:

         /caseless/i

       The following table shows additional modifiers for setting PCRE options
       that do not correspond to anything in Perl:

         /A              PCRE_ANCHORED
         /C              PCRE_AUTO_CALLOUT
         /E              PCRE_DOLLAR_ENDONLY
         /f              PCRE_FIRSTLINE
         /J              PCRE_DUPNAMES
         /N              PCRE_NO_AUTO_CAPTURE
         /U              PCRE_UNGREEDY
         /X              PCRE_EXTRA
         /<JS>           PCRE_JAVASCRIPT_COMPAT
         /<cr>           PCRE_NEWLINE_CR
         /<lf>           PCRE_NEWLINE_LF
         /<crlf>         PCRE_NEWLINE_CRLF
         /<anycrlf>      PCRE_NEWLINE_ANYCRLF
         /<any>          PCRE_NEWLINE_ANY
         /<bsr_anycrlf>  PCRE_BSR_ANYCRLF
         /<bsr_unicode>  PCRE_BSR_UNICODE

       Those specifying line ending sequences are literal  strings  as  shown,
       but  the  letters  can  be  in either case. This example sets multiline
       matching with CRLF as the line ending sequence:

         /^abc/m<crlf>

       Details of the meanings of these PCRE options are given in the  pcreapi
       documentation.

   Finding all matches in a string

       Searching  for  all  possible matches within each subject string can be
       requested by the /g or /G modifier. After  finding  a  match,  PCRE  is
       called again to search the remainder of the subject string. The differ-
       ence between /g and /G is that the former uses the startoffset argument
       to  pcre_exec()  to  start  searching  at a new point within the entire
       string (which is in effect what Perl does), whereas the  latter  passes
       over  a  shortened  substring.  This makes a difference to the matching
       process if the pattern begins with a lookbehind assertion (including \b
       or \B).

       If  any  call  to  pcre_exec()  in a /g or /G sequence matches an empty
       string, the next  call  is  done  with  the  PCRE_NOTEMPTY_ATSTART  and
       PCRE_ANCHORED  flags  set  in  order  to search for another, non-empty,
       match at the same point. If this second match fails, the  start  offset
       is  advanced  by  one  character, and the normal match is retried. This
       imitates the way Perl handles such cases when using the /g modifier  or
       the split() function.

   Other modifiers

       There are yet more modifiers for controlling the way pcretest operates.

       The  /+ modifier requests that as well as outputting the substring that
       matched the entire pattern, pcretest  should  in  addition  output  the
       remainder  of  the  subject  string. This is useful for tests where the
       subject contains multiple copies of the same substring.

       The /B modifier is a debugging feature. It requests that pcretest  out-
       put  a representation of the compiled byte code after compilation. Nor-
       mally this information contains length and offset values;  however,  if
       /Z  is also present, this data is replaced by spaces. This is a special
       feature for use in the automatic test scripts; it ensures that the same
       output is generated for different internal link sizes.

       The  /L modifier must be followed directly by the name of a locale, for
       example,

         /pattern/Lfr_FR

       For this reason, it must be the last modifier. The given locale is set,
       pcre_maketables()  is called to build a set of character tables for the
       locale, and this is then passed to pcre_compile()  when  compiling  the
       regular  expression.  Without  an  /L  modifier,  NULL is passed as the
       tables pointer; that is, /L applies only to the expression on which  it
       appears.

       The  /I  modifier  requests  that pcretest output information about the
       compiled pattern (whether it is anchored, has a fixed first  character,
       and  so  on). It does this by calling pcre_fullinfo() after compiling a
       pattern. If the pattern is studied, the results of that are  also  out-
       put.

       The  /D modifier is a PCRE debugging feature, and is equivalent to /BI,
       that is, both the /B and the /I modifiers.

       The /F modifier causes pcretest to flip the byte order of the fields in
       the  compiled  pattern  that  contain  2-byte  and 4-byte numbers. This
       facility is for testing the feature in PCRE that allows it  to  execute
       patterns that were compiled on a host with a different endianness. This
       feature is not available when the POSIX  interface  to  PCRE  is  being
       used,  that is, when the /P pattern modifier is specified. See also the
       section about saving and reloading compiled patterns below.

       The /S modifier causes pcre_study() to be called after  the  expression
       has been compiled, and the results used when the expression is matched.

       The  /M  modifier causes the size of memory block used to hold the com-
       piled pattern to be output.

       The /P modifier causes pcretest to call PCRE via the POSIX wrapper  API
       rather  than  its  native  API.  When this is done, all other modifiers
       except /i, /m, and /+ are ignored. REG_ICASE is set if /i  is  present,
       and  REG_NEWLINE  is  set if /m is present. The wrapper functions force
       PCRE_DOLLAR_ENDONLY always, and PCRE_DOTALL unless REG_NEWLINE is set.

       The /8 modifier causes pcretest to call PCRE with the PCRE_UTF8  option
       set.  This  turns on support for UTF-8 character handling in PCRE, pro-
       vided that it was compiled with this  support  enabled.  This  modifier
       also causes any non-printing characters in output strings to be printed
       using the \x{hh...} notation if they are valid UTF-8 sequences.

       If the /? modifier  is  used  with  /8,  it  causes  pcretest  to  call
       pcre_compile()  with  the  PCRE_NO_UTF8_CHECK  option,  to suppress the
       checking of the string for UTF-8 validity.


DATA LINES

       Before each data line is passed to pcre_exec(),  leading  and  trailing
       whitespace  is  removed,  and it is then scanned for \ escapes. Some of
       these are pretty esoteric features, intended for checking out  some  of
       the  more  complicated features of PCRE. If you are just testing "ordi-
       nary" regular expressions, you probably don't need any  of  these.  The
       following escapes are recognized:

         \a         alarm (BEL, \x07)
         \b         backspace (\x08)
         \e         escape (\x27)
         \f         formfeed (\x0c)
         \n         newline (\x0a)
         \qdd       set the PCRE_MATCH_LIMIT limit to dd
                      (any number of digits)
         \r         carriage return (\x0d)
         \t         tab (\x09)
         \v         vertical tab (\x0b)
         \nnn       octal character (up to 3 octal digits)
         \xhh       hexadecimal character (up to 2 hex digits)
         \x{hh...}  hexadecimal character, any number of digits
                      in UTF-8 mode
         \A         pass the PCRE_ANCHORED option to pcre_exec()
                      or pcre_dfa_exec()
         \B         pass the PCRE_NOTBOL option to pcre_exec()
                      or pcre_dfa_exec()
         \Cdd       call pcre_copy_substring() for substring dd
                      after a successful match (number less than 32)
         \Cname     call pcre_copy_named_substring() for substring
                      "name" after a successful match (name termin-
                      ated by next non alphanumeric character)
         \C+        show the current captured substrings at callout
                      time
         \C-        do not supply a callout function
         \C!n       return 1 instead of 0 when callout number n is
                      reached
         \C!n!m     return 1 instead of 0 when callout number n is
                      reached for the nth time
         \C*n       pass the number n (may be negative) as callout
                      data; this is used as the callout return value
         \D         use the pcre_dfa_exec() match function
         \F         only shortest match for pcre_dfa_exec()
         \Gdd       call pcre_get_substring() for substring dd
                      after a successful match (number less than 32)
         \Gname     call pcre_get_named_substring() for substring
                      "name" after a successful match (name termin-
                      ated by next non-alphanumeric character)
         \L         call pcre_get_substringlist() after a
                      successful match
         \M         discover the minimum MATCH_LIMIT and
                      MATCH_LIMIT_RECURSION settings
         \N         pass the PCRE_NOTEMPTY option to pcre_exec()
                      or pcre_dfa_exec(); if used twice, pass the
                      PCRE_NOTEMPTY_ATSTART option
         \Odd       set the size of the output vector passed to
                      pcre_exec() to dd (any number of digits)
         \P         pass the PCRE_PARTIAL_SOFT option to pcre_exec()
                      or pcre_dfa_exec(); if used twice, pass the
                      PCRE_PARTIAL_HARD option
         \Qdd       set the PCRE_MATCH_LIMIT_RECURSION limit to dd
                      (any number of digits)
         \R         pass the PCRE_DFA_RESTART option to pcre_dfa_exec()
         \S         output details of memory get/free calls during matching
         \Y         pass the PCRE_NO_START_OPTIMIZE option to pcre_exec()
                      or pcre_dfa_exec()
         \Z         pass the PCRE_NOTEOL option to pcre_exec()
                      or pcre_dfa_exec()
         \?         pass the PCRE_NO_UTF8_CHECK option to
                      pcre_exec() or pcre_dfa_exec()
         \>dd       start the match at offset dd (any number of digits);
                      this sets the startoffset argument for pcre_exec()
                      or pcre_dfa_exec()
         \<cr>      pass the PCRE_NEWLINE_CR option to pcre_exec()
                      or pcre_dfa_exec()
         \<lf>      pass the PCRE_NEWLINE_LF option to pcre_exec()
                      or pcre_dfa_exec()
         \<crlf>    pass the PCRE_NEWLINE_CRLF option to pcre_exec()
                      or pcre_dfa_exec()
         \<anycrlf> pass the PCRE_NEWLINE_ANYCRLF option to pcre_exec()
                      or pcre_dfa_exec()
         \<any>     pass the PCRE_NEWLINE_ANY option to pcre_exec()
                      or pcre_dfa_exec()

       The  escapes  that  specify  line ending sequences are literal strings,
       exactly as shown. No more than one newline setting should be present in
       any data line.

       A  backslash  followed by anything else just escapes the anything else.
       If the very last character is a backslash, it is ignored. This gives  a
       way  of  passing  an empty line as data, since a real empty line termi-
       nates the data input.

       If \M is present, pcretest calls pcre_exec() several times,  with  dif-
       ferent  values  in  the match_limit and match_limit_recursion fields of
       the pcre_extra data structure, until it finds the minimum  numbers  for
       each parameter that allow pcre_exec() to complete. The match_limit num-
       ber is a measure of the amount of backtracking that  takes  place,  and
       checking it out can be instructive. For most simple matches, the number
       is quite small, but for patterns with very large  numbers  of  matching
       possibilities,  it can become large very quickly with increasing length
       of subject string. The match_limit_recursion number is a measure of how
       much  stack  (or,  if  PCRE is compiled with NO_RECURSE, how much heap)
       memory is needed to complete the match attempt.

       When \O is used, the value specified may be higher or  lower  than  the
       size set by the -O command line option (or defaulted to 45); \O applies
       only to the call of pcre_exec() for the line in which it appears.

       If the /P modifier was present on the pattern, causing the POSIX  wrap-
       per  API  to  be  used, the only option-setting sequences that have any
       effect are \B and \Z, causing REG_NOTBOL and REG_NOTEOL,  respectively,
       to be passed to regexec().

       The  use of \x{hh...} to represent UTF-8 characters is not dependent on
       the use of the /8 modifier on the pattern.  It  is  recognized  always.
       There  may  be  any number of hexadecimal digits inside the braces. The
       result is from one to six bytes,  encoded  according  to  the  original
       UTF-8  rules  of  RFC  2279.  This  allows for values in the range 0 to
       0x7FFFFFFF. Note that not all of those are valid Unicode  code  points,
       or  indeed  valid  UTF-8 characters according to the later rules in RFC
       3629.


THE ALTERNATIVE MATCHING FUNCTION

       By  default,  pcretest  uses  the  standard  PCRE  matching   function,
       pcre_exec() to match each data line. From release 6.0, PCRE supports an
       alternative matching function, pcre_dfa_test(),  which  operates  in  a
       different  way,  and has some restrictions. The differences between the
       two functions are described in the pcrematching documentation.

       If a data line contains the \D escape sequence, or if the command  line
       contains  the -dfa option, the alternative matching function is called.
       This function finds all possible matches at a given point. If, however,
       the  \F escape sequence is present in the data line, it stops after the
       first match is found. This is always the shortest possible match.


DEFAULT OUTPUT FROM PCRETEST

       This section describes the output when the  normal  matching  function,
       pcre_exec(), is being used.

       When a match succeeds, pcretest outputs the list of captured substrings
       that pcre_exec() returns, starting with number 0 for  the  string  that
       matched  the  whole  pattern. Otherwise, it outputs "No match" when the
       return is PCRE_ERROR_NOMATCH, and "Partial match:" followed by the par-
       tially  matching substring when pcre_exec() returns PCRE_ERROR_PARTIAL.
       For any other returns, it outputs the PCRE negative error number.  Here
       is an example of an interactive pcretest run.

         $ pcretest
         PCRE version 7.0 30-Nov-2006

           re> /^abc(\d+)/
         data> abc123
          0: abc123
          1: 123
         data> xyz
         No match

       Note  that unset capturing substrings that are not followed by one that
       is set are not returned by pcre_exec(), and are not shown by  pcretest.
       In  the following example, there are two capturing substrings, but when
       the first data line is matched, the  second,  unset  substring  is  not
       shown.  An "internal" unset substring is shown as "<unset>", as for the
       second data line.

           re> /(a)|(b)/
         data> a
          0: a
          1: a
         data> b
          0: b
          1: <unset>
          2: b

       If the strings contain any non-printing characters, they are output  as
       \0x  escapes,  or  as \x{...} escapes if the /8 modifier was present on
       the pattern. See below for the definition of  non-printing  characters.
       If  the pattern has the /+ modifier, the output for substring 0 is fol-
       lowed by the the rest of the subject string, identified  by  "0+"  like
       this:

           re> /cat/+
         data> cataract
          0: cat
          0+ aract

       If  the  pattern  has  the /g or /G modifier, the results of successive
       matching attempts are output in sequence, like this:

           re> /\Bi(\w\w)/g
         data> Mississippi
          0: iss
          1: ss
          0: iss
          1: ss
          0: ipp
          1: pp

       "No match" is output only if the first match attempt fails.

       If any of the sequences \C, \G, or \L are present in a data  line  that
       is  successfully  matched,  the substrings extracted by the convenience
       functions are output with C, G, or L after the string number instead of
       a colon. This is in addition to the normal full list. The string length
       (that is, the return from the extraction function) is given  in  paren-
       theses after each string for \C and \G.

       Note that whereas patterns can be continued over several lines (a plain
       ">" prompt is used for continuations), data lines may not. However new-
       lines  can  be included in data by means of the \n escape (or \r, \r\n,
       etc., depending on the newline sequence setting).


OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION

       When the alternative matching function, pcre_dfa_exec(),  is  used  (by
       means  of  the \D escape sequence or the -dfa command line option), the
       output consists of a list of all the matches that start  at  the  first
       point in the subject where there is at least one match. For example:

           re> /(tang|tangerine|tan)/
         data> yellow tangerine\D
          0: tangerine
          1: tang
          2: tan

       (Using  the  normal  matching function on this data finds only "tang".)
       The longest matching string is always given first (and numbered  zero).
       After a PCRE_ERROR_PARTIAL return, the output is "Partial match:", fol-
       lowed by the partially matching substring.

       If /g is present on the pattern, the search for further matches resumes
       at the end of the longest match. For example:

           re> /(tang|tangerine|tan)/g
         data> yellow tangerine and tangy sultana\D
          0: tangerine
          1: tang
          2: tan
          0: tang
          1: tan
          0: tan

       Since  the  matching  function  does not support substring capture, the
       escape sequences that are concerned with captured  substrings  are  not
       relevant.


RESTARTING AFTER A PARTIAL MATCH

       When the alternative matching function has given the PCRE_ERROR_PARTIAL
       return, indicating that the subject partially matched the pattern,  you
       can  restart  the match with additional subject data by means of the \R
       escape sequence. For example:

           re> /^\d?\d(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d\d$/
         data> 23ja\P\D
         Partial match: 23ja
         data> n05\R\D
          0: n05

       For further information about partial  matching,  see  the  pcrepartial
       documentation.


CALLOUTS

       If  the pattern contains any callout requests, pcretest's callout func-
       tion is called during matching. This works  with  both  matching  func-
       tions. By default, the called function displays the callout number, the
       start and current positions in the text at the callout  time,  and  the
       next pattern item to be tested. For example, the output

         --->pqrabcdef
           0    ^  ^     \d

       indicates  that  callout number 0 occurred for a match attempt starting
       at the fourth character of the subject string, when the pointer was  at
       the  seventh  character of the data, and when the next pattern item was
       \d. Just one circumflex is output if the start  and  current  positions
       are the same.

       Callouts numbered 255 are assumed to be automatic callouts, inserted as
       a result of the /C pattern modifier. In this case, instead  of  showing
       the  callout  number, the offset in the pattern, preceded by a plus, is
       output. For example:

           re> /\d?[A-E]\*/C
         data> E*
         --->E*
          +0 ^      \d?
          +3 ^      [A-E]
          +8 ^^     \*
         +10 ^ ^
          0: E*

       The callout function in pcretest returns zero (carry  on  matching)  by
       default,  but you can use a \C item in a data line (as described above)
       to change this.

       Inserting callouts can be helpful when using pcretest to check  compli-
       cated  regular expressions. For further information about callouts, see
       the pcrecallout documentation.


NON-PRINTING CHARACTERS

       When pcretest is outputting text in the compiled version of a  pattern,
       bytes  other  than 32-126 are always treated as non-printing characters
       are are therefore shown as hex escapes.

       When pcretest is outputting text that is a matched part  of  a  subject
       string,  it behaves in the same way, unless a different locale has been
       set for the  pattern  (using  the  /L  modifier).  In  this  case,  the
       isprint() function to distinguish printing and non-printing characters.


SAVING AND RELOADING COMPILED PATTERNS

       The  facilities  described  in  this section are not available when the
       POSIX inteface to PCRE is being used, that is, when the /P pattern mod-
       ifier is specified.

       When the POSIX interface is not in use, you can cause pcretest to write
       a compiled pattern to a file, by following the modifiers with >  and  a
       file name.  For example:

         /pattern/im >/some/file

       See  the pcreprecompile documentation for a discussion about saving and
       re-using compiled patterns.

       The data that is written is binary.  The  first  eight  bytes  are  the
       length  of  the  compiled  pattern  data  followed by the length of the
       optional study data, each written as four  bytes  in  big-endian  order
       (most  significant  byte  first). If there is no study data (either the
       pattern was not studied, or studying did not return any data), the sec-
       ond  length  is  zero. The lengths are followed by an exact copy of the
       compiled pattern. If there is additional study data, this follows imme-
       diately  after  the  compiled pattern. After writing the file, pcretest
       expects to read a new pattern.

       A saved pattern can be reloaded into pcretest by specifing < and a file
       name  instead  of  a pattern. The name of the file must not contain a <
       character, as otherwise pcretest will interpret the line as  a  pattern
       delimited by < characters.  For example:

          re> </some/file
         Compiled regex loaded from /some/file
         No study data

       When  the pattern has been loaded, pcretest proceeds to read data lines
       in the usual way.

       You can copy a file written by pcretest to a different host and  reload
       it  there,  even  if the new host has opposite endianness to the one on
       which the pattern was compiled. For example, you can compile on an  i86
       machine and run on a SPARC machine.

       File  names  for  saving and reloading can be absolute or relative, but
       note that the shell facility of expanding a file name that starts  with
       a tilde (~) is not available.

       The  ability to save and reload files in pcretest is intended for test-
       ing and experimentation. It is not intended for production use  because
       only  a  single pattern can be written to a file. Furthermore, there is
       no facility for supplying  custom  character  tables  for  use  with  a
       reloaded  pattern.  If  the  original  pattern was compiled with custom
       tables, an attempt to match a subject string using a  reloaded  pattern
       is  likely to cause pcretest to crash.  Finally, if you attempt to load
       a file that is not in the correct format, the result is undefined.


SEE ALSO

       pcre(3), pcreapi(3), pcrecallout(3),  pcrematching(3),  pcrepartial(d),
       pcrepattern(3), pcreprecompile(3).


AUTHOR

       Philip Hazel
       University Computing Service
       Cambridge CB2 3QH, England.


REVISION

       Last updated: 26 September 2009
       Copyright (c) 1997-2009 University of Cambridge.
PK��$[2g��DD"doc/alt-pcre802-devel/perltest.txtnu�[���The perltest program
--------------------

The perltest.pl script tests Perl's regular expressions; it has the same
specification as pcretest, and so can be given identical input, except that
input patterns can be followed only by Perl's lower case modifiers and /+ (as
used by pcretest), which is recognized and handled by the program.

The data lines are processed as Perl double-quoted strings, so if they contain
" $ or @ characters, these have to be escaped. For this reason, all such
characters in testinput1, testinput4, testinput6, and testinput11 are escaped
so that they can be used for perltest as well as for pcretest. The special
upper case pattern modifiers such as /A that pcretest recognizes, and its
special data line escapes, are not used in these files. The output should be
identical, apart from the initial identifying banner.

The perltest.pl script can also test UTF-8 features. It recognizes the special
modifier /8 that pcretest uses to invoke UTF-8 functionality. The testinput4
and testinput6 files can be fed to perltest to run compatible UTF-8 tests.
However, it is necessary to add "use utf8;" to the script to make this work
correctly.

The testinput11 file contains tests that use features of Perl 5.10, so does not
work with Perl 5.8.

The other testinput files are not suitable for feeding to perltest.pl, since
they make use of the special upper case modifiers and escapes that pcretest
uses to test some features of PCRE. Some of these files also contains malformed
regular expressions, in order to check that PCRE diagnoses them correctly.

Philip Hazel
October 2009
PK�%[1���..aclocal/find_apr.m4nu�[���dnl -------------------------------------------------------- -*- autoconf -*-
dnl Licensed to the Apache Software Foundation (ASF) under one or more
dnl contributor license agreements.  See the NOTICE file distributed with
dnl this work for additional information regarding copyright ownership.
dnl The ASF licenses this file to You under the Apache License, Version 2.0
dnl (the "License"); you may not use this file except in compliance with
dnl the License.  You may obtain a copy of the License at
dnl
dnl     http://www.apache.org/licenses/LICENSE-2.0
dnl
dnl Unless required by applicable law or agreed to in writing, software
dnl distributed under the License is distributed on an "AS IS" BASIS,
dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dnl See the License for the specific language governing permissions and
dnl limitations under the License.

dnl
dnl find_apr.m4 : locate the APR include files and libraries
dnl
dnl This macro file can be used by applications to find and use the APR
dnl library. It provides a standardized mechanism for using APR. It supports
dnl embedding APR into the application source, or locating an installed
dnl copy of APR.
dnl
dnl APR_FIND_APR(srcdir, builddir, implicit-install-check, acceptable-majors,
dnl              detailed-check)
dnl
dnl   where srcdir is the location of the bundled APR source directory, or
dnl   empty if source is not bundled.
dnl
dnl   where builddir is the location where the bundled APR will will be built,
dnl   or empty if the build will occur in the srcdir.
dnl
dnl   where implicit-install-check set to 1 indicates if there is no
dnl   --with-apr option specified, we will look for installed copies.
dnl
dnl   where acceptable-majors is a space separated list of acceptable major
dnl   version numbers. Often only a single major version will be acceptable.
dnl   If multiple versions are specified, and --with-apr=PREFIX or the
dnl   implicit installed search are used, then the first (leftmost) version
dnl   in the list that is found will be used.  Currently defaults to [0 1].
dnl
dnl   where detailed-check is an M4 macro which sets the apr_acceptable to
dnl   either "yes" or "no". The macro will be invoked for each installed
dnl   copy of APR found, with the apr_config variable set appropriately.
dnl   Only installed copies of APR which are considered acceptable by
dnl   this macro will be considered found. If no installed copies are
dnl   considered acceptable by this macro, apr_found will be set to either
dnl   either "no" or "reconfig".
dnl
dnl Sets the following variables on exit:
dnl
dnl   apr_found : "yes", "no", "reconfig"
dnl
dnl   apr_config : If the apr-config tool exists, this refers to it. If
dnl                apr_found is "reconfig", then the bundled directory
dnl                should be reconfigured *before* using apr_config.
dnl
dnl Note: this macro file assumes that apr-config has been installed; it
dnl       is normally considered a required part of an APR installation.
dnl
dnl If a bundled source directory is available and needs to be (re)configured,
dnl then apr_found is set to "reconfig". The caller should reconfigure the
dnl (passed-in) source directory, placing the result in the build directory,
dnl as appropriate.
dnl
dnl If apr_found is "yes" or "reconfig", then the caller should use the
dnl value of apr_config to fetch any necessary build/link information.
dnl

AC_DEFUN([APR_FIND_APR], [
  apr_found="no"

  if test "$target_os" = "os2-emx"; then
    # Scripts don't pass test -x on OS/2
    TEST_X="test -f"
  else
    TEST_X="test -x"
  fi

  ifelse([$4], [], [
         ifdef(AC_WARNING,AC_WARNING([$0: missing argument 4 (acceptable-majors): Defaulting to APR 0.x then APR 1.x]))
         acceptable_majors="0 1"],
         [acceptable_majors="$4"])

  apr_temp_acceptable_apr_config=""
  for apr_temp_major in $acceptable_majors
  do
    case $apr_temp_major in
      0)
      apr_temp_acceptable_apr_config="$apr_temp_acceptable_apr_config apr-config"
      ;;
      *)
      apr_temp_acceptable_apr_config="$apr_temp_acceptable_apr_config apr-$apr_temp_major-config"
      ;;
    esac
  done

  AC_MSG_CHECKING(for APR)
  AC_ARG_WITH(apr,
  [  --with-apr=PATH         prefix for installed APR or the full path to 
                             apr-config],
  [
    if test "$withval" = "no" || test "$withval" = "yes"; then
      AC_MSG_ERROR([--with-apr requires a directory or file to be provided])
    fi

    for apr_temp_apr_config_file in $apr_temp_acceptable_apr_config
    do
      for lookdir in "$withval/bin" "$withval"
      do
        if $TEST_X "$lookdir/$apr_temp_apr_config_file"; then
          apr_config="$lookdir/$apr_temp_apr_config_file"
          ifelse([$5], [], [], [
          apr_acceptable="yes"
          $5
          if test "$apr_acceptable" != "yes"; then
            AC_MSG_WARN([Found APR in $apr_config, but we think it is considered unacceptable])
            continue
          fi])
          apr_found="yes"
          break 2
        fi
      done
    done

    if test "$apr_found" != "yes" && $TEST_X "$withval" && $withval --help > /dev/null 2>&1 ; then
      apr_config="$withval"
      ifelse([$5], [], [apr_found="yes"], [
          apr_acceptable="yes"
          $5
          if test "$apr_acceptable" = "yes"; then
                apr_found="yes"
          fi])
    fi

    dnl if --with-apr is used, it is a fatal error for its argument
    dnl to be invalid
    if test "$apr_found" != "yes"; then
      AC_MSG_ERROR([the --with-apr parameter is incorrect. It must specify an install prefix, a build directory, or an apr-config file.])
    fi
  ],[
    dnl If we allow installed copies, check those before using bundled copy.
    if test -n "$3" && test "$3" = "1"; then
      for apr_temp_apr_config_file in $apr_temp_acceptable_apr_config
      do
        if $apr_temp_apr_config_file --help > /dev/null 2>&1 ; then
          apr_config="$apr_temp_apr_config_file"
          ifelse([$5], [], [], [
          apr_acceptable="yes"
          $5
          if test "$apr_acceptable" != "yes"; then
            AC_MSG_WARN([skipped APR at $apr_config, version not acceptable])
            continue
          fi])
          apr_found="yes"
          break
        else
          dnl look in some standard places
          for lookdir in /usr /usr/local /usr/local/apr /opt/apr; do
            if $TEST_X "$lookdir/bin/$apr_temp_apr_config_file"; then
              apr_config="$lookdir/bin/$apr_temp_apr_config_file"
              ifelse([$5], [], [], [
              apr_acceptable="yes"
              $5
              if test "$apr_acceptable" != "yes"; then
                AC_MSG_WARN([skipped APR at $apr_config, version not acceptable])
                continue
              fi])
              apr_found="yes"
              break 2
            fi
          done
        fi
      done
    fi
    dnl if we have not found anything yet and have bundled source, use that
    if test "$apr_found" = "no" && test -d "$1"; then
      apr_temp_abs_srcdir="`cd \"$1\" && pwd`"
      apr_found="reconfig"
      apr_bundled_major="`sed -n '/#define.*APR_MAJOR_VERSION/s/^[^0-9]*\([0-9]*\).*$/\1/p' \"$1/include/apr_version.h\"`"
      case $apr_bundled_major in
        "")
          AC_MSG_ERROR([failed to find major version of bundled APR])
        ;;
        0)
          apr_temp_apr_config_file="apr-config"
        ;;
        *)
          apr_temp_apr_config_file="apr-$apr_bundled_major-config"
        ;;
      esac
      if test -n "$2"; then
        apr_config="$2/$apr_temp_apr_config_file"
      else
        apr_config="$1/$apr_temp_apr_config_file"
      fi
    fi
  ])

  AC_MSG_RESULT($apr_found)
])
PK% %[0����man/man1/nghttp.1nu�[���.\" Man page generated from reStructuredText.
.
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.TH "NGHTTP" "1" "Jun 17, 2025" "1.66.0" "nghttp2"
.SH NAME
nghttp \- HTTP/2 client
.SH SYNOPSIS
.sp
\fBnghttp\fP [OPTIONS]... <URI>...
.SH DESCRIPTION
.sp
HTTP/2 client
.INDENT 0.0
.TP
.B <URI>
Specify URI to access.
.UNINDENT
.SH OPTIONS
.INDENT 0.0
.TP
.B \-v, \-\-verbose
Print   debug   information   such  as   reception   and
transmission of frames and name/value pairs.  Specifying
this option multiple times increases verbosity.
.UNINDENT
.INDENT 0.0
.TP
.B \-n, \-\-null\-out
Discard downloaded data.
.UNINDENT
.INDENT 0.0
.TP
.B \-O, \-\-remote\-name
Save  download  data  in  the  current  directory.   The
filename is  derived from  URI.  If  URI ends  with \(aq\fI/\fP\(aq,
\(aqindex.html\(aq  is used  as a  filename.  Not  implemented
yet.
.UNINDENT
.INDENT 0.0
.TP
.B \-t, \-\-timeout=<DURATION>
Timeout each request after <DURATION>.  Set 0 to disable
timeout.
.UNINDENT
.INDENT 0.0
.TP
.B \-w, \-\-window\-bits=<N>
Sets the stream level initial window size to 2**<N>\-1.
.UNINDENT
.INDENT 0.0
.TP
.B \-W, \-\-connection\-window\-bits=<N>
Sets  the  connection  level   initial  window  size  to
2**<N>\-1.
.UNINDENT
.INDENT 0.0
.TP
.B \-a, \-\-get\-assets
Download assets  such as stylesheets, images  and script
files linked  from the downloaded resource.   Only links
whose  origins are  the same  with the  linking resource
will be downloaded.   nghttp prioritizes resources using
HTTP/2 dependency  based priority.  The  priority order,
from highest to lowest,  is html itself, css, javascript
and images.
.UNINDENT
.INDENT 0.0
.TP
.B \-s, \-\-stat
Print statistics.
.UNINDENT
.INDENT 0.0
.TP
.B \-H, \-\-header=<HEADER>
Add a header to the requests.  Example: \fI\%\-H\fP\(aq:method: PUT\(aq
.UNINDENT
.INDENT 0.0
.TP
.B \-\-trailer=<HEADER>
Add a trailer header to the requests.  <HEADER> must not
include pseudo header field  (header field name starting
with \(aq:\(aq).  To  send trailer, one must use  \fI\%\-d\fP option to
send request body.  Example: \fI\%\-\-trailer\fP \(aqfoo: bar\(aq.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-cert=<CERT>
Use  the specified  client certificate  file.  The  file
must be in PEM format.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-key=<KEY>
Use the  client private key  file.  The file must  be in
PEM format.
.UNINDENT
.INDENT 0.0
.TP
.B \-d, \-\-data=<PATH>
Post FILE to server. If \(aq\-\(aq  is given, data will be read
from stdin.
.UNINDENT
.INDENT 0.0
.TP
.B \-m, \-\-multiply=<N>
Request each URI <N> times.  By default, same URI is not
requested twice.  This option disables it too.
.UNINDENT
.INDENT 0.0
.TP
.B \-u, \-\-upgrade
Perform HTTP Upgrade for HTTP/2.  This option is ignored
if the request URI has https scheme.  If \fI\%\-d\fP is used, the
HTTP upgrade request is performed with OPTIONS method.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-extpri=<PRI>
Sets RFC 9218 priority of  given URI.  <PRI> must be the
wire format  of priority  header field  (e.g., \(dqu=3,i\(dq).
This  option  can  be  used  multiple  times,  and  N\-th
\fI\%\-\-extpri\fP option sets priority of N\-th URI in the command
line.  If  the number  of this option  is less  than the
number of  URI, the last  option value is  repeated.  If
there  is   no  \fI\%\-\-extpri\fP  option,  urgency   is  3,  and
incremental is false.
.UNINDENT
.INDENT 0.0
.TP
.B \-M, \-\-peer\-max\-concurrent\-streams=<N>
Use  <N>  as  SETTINGS_MAX_CONCURRENT_STREAMS  value  of
remote endpoint as if it  is received in SETTINGS frame.
.sp
Default: \fB100\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-c, \-\-header\-table\-size=<SIZE>
Specify decoder  header table  size.  If this  option is
used  multiple times,  and the  minimum value  among the
given values except  for last one is  strictly less than
the last  value, that minimum  value is set  in SETTINGS
frame  payload  before  the   last  value,  to  simulate
multiple header table size change.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-encoder\-header\-table\-size=<SIZE>
Specify encoder header table size.  The decoder (server)
specifies  the maximum  dynamic table  size it  accepts.
Then the negotiated dynamic table size is the minimum of
this option value and the value which server specified.
.UNINDENT
.INDENT 0.0
.TP
.B \-b, \-\-padding=<N>
Add at  most <N>  bytes to a  frame payload  as padding.
Specify 0 to disable padding.
.UNINDENT
.INDENT 0.0
.TP
.B \-r, \-\-har=<PATH>
Output HTTP  transactions <PATH> in HAR  format.  If \(aq\-\(aq
is given, data is written to stdout.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-color
Force colored log output.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-continuation
Send large header to test CONTINUATION.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-content\-length
Don\(aqt send content\-length header field.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-hexdump
Display the  incoming traffic in  hexadecimal (Canonical
hex+ASCII display).  If SSL/TLS  is used, decrypted data
are used.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-push
Disable server push.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-max\-concurrent\-streams=<N>
The  number of  concurrent  pushed  streams this  client
accepts.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-expect\-continue
Perform an Expect/Continue handshake:  wait to send DATA
(up to  a short  timeout)  until the server sends  a 100
Continue interim response. This option is ignored unless
combined with the \fI\%\-d\fP option.
.UNINDENT
.INDENT 0.0
.TP
.B \-y, \-\-no\-verify\-peer
Suppress  warning  on  server  certificate  verification
failure.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-ktls
Enable ktls.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-version
Display version information and exit.
.UNINDENT
.INDENT 0.0
.TP
.B \-h, \-\-help
Display this help and exit.
.UNINDENT
.sp
The <SIZE> argument is an integer and an optional unit (e.g., 10K is
10 * 1024).  Units are K, M and G (powers of 1024).
.sp
The <DURATION> argument is an integer and an optional unit (e.g., 1s
is 1 second and 500ms is 500 milliseconds).  Units are h, m, s or ms
(hours, minutes, seconds and milliseconds, respectively).  If a unit
is omitted, a second is used as unit.
.SH SEE ALSO
.sp
\fBnghttpd(1)\fP, \fBnghttpx(1)\fP, \fBh2load(1)\fP
.SH AUTHOR
Tatsuhiro Tsujikawa
.SH COPYRIGHT
2012, 2015, 2016, Tatsuhiro Tsujikawa
.\" Generated by docutils manpage writer.
.
PK% %[��t��c�cman/man1/nghttpx.1nu�[���.\" Man page generated from reStructuredText.
.
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.TH "NGHTTPX" "1" "Jun 17, 2025" "1.66.0" "nghttp2"
.SH NAME
nghttpx \- HTTP/2 proxy
.SH SYNOPSIS
.sp
\fBnghttpx\fP [OPTIONS]... [<PRIVATE_KEY> <CERT>]
.SH DESCRIPTION
.sp
A reverse proxy for HTTP/3, HTTP/2, and HTTP/1.
.INDENT 0.0
.TP
.B <PRIVATE_KEY>
Set  path  to  server\(aqs private  key.   Required  unless
\(dqno\-tls\(dq parameter is used in \fI\%\-\-frontend\fP option.
.UNINDENT
.INDENT 0.0
.TP
.B <CERT>
Set  path  to  server\(aqs  certificate.   Required  unless
\(dqno\-tls\(dq  parameter is  used in  \fI\%\-\-frontend\fP option.
.UNINDENT
.SH OPTIONS
.sp
The options are categorized into several groups.
.SS Connections
.INDENT 0.0
.TP
.B \-b, \-\-backend=(<HOST>,<PORT>|unix:<PATH>)[;[<PATTERN>[:...]][[;<PARAM>]...]
Set  backend  host  and   port.   The  multiple  backend
addresses are  accepted by repeating this  option.  UNIX
domain socket  can be  specified by prefixing  path name
with \(dqunix:\(dq (e.g., unix:/var/run/backend.sock).
.sp
Optionally, if <PATTERN>s are given, the backend address
is  only  used  if  request matches  the  pattern.   The
pattern  matching is  closely  designed  to ServeMux  in
net/http package of  Go programming language.  <PATTERN>
consists of  path, host +  path or just host.   The path
must start  with \(dq\fI/\fP\(dq.  If  it ends with \(dq\fI/\fP\(dq,  it matches
all  request path  in  its subtree.   To  deal with  the
request  to the  directory without  trailing slash,  the
path which ends  with \(dq\fI/\fP\(dq also matches  the request path
which  only  lacks  trailing  \(aq\fI/\fP\(aq  (e.g.,  path  \(dq\fI/foo/\fP\(dq
matches request path  \(dq\fI/foo\fP\(dq).  If it does  not end with
\(dq\fI/\fP\(dq, it  performs exact match against  the request path.
If  host  is given,  it  performs  a match  against  the
request host.   For a  request received on  the frontend
listener with  \(dqsni\-fwd\(dq parameter enabled, SNI  host is
used instead of a request host.  If host alone is given,
\(dq\fI/\fP\(dq is  appended to it,  so that it matches  all request
paths  under the  host  (e.g., specifying  \(dqnghttp2.org\(dq
equals  to \(dqnghttp2.org/\(dq).   CONNECT method  is treated
specially.  It  does not have  path, and we  don\(aqt allow
empty path.  To workaround  this, we assume that CONNECT
method has \(dq\fI/\fP\(dq as path.
.sp
Patterns with  host take  precedence over  patterns with
just path.   Then, longer patterns take  precedence over
shorter ones.
.sp
Host  can  include \(dq*\(dq  in  the  left most  position  to
indicate  wildcard match  (only suffix  match is  done).
The \(dq*\(dq must match at least one character.  For example,
host    pattern    \(dq*.nghttp2.org\(dq    matches    against
\(dqwww.nghttp2.org\(dq  and  \(dqgit.ngttp2.org\(dq, but  does  not
match  against  \(dqnghttp2.org\(dq.   The exact  hosts  match
takes precedence over the wildcard hosts match.
.sp
If path  part ends with  \(dq*\(dq, it is treated  as wildcard
path.  The  wildcard path  behaves differently  from the
normal path.  For normal path,  match is made around the
boundary of path component  separator,\(dq\fI/\fP\(dq.  On the other
hand, the wildcard  path does not take  into account the
path component  separator.  All paths which  include the
wildcard  path  without  last  \(dq*\(dq as  prefix,  and  are
strictly longer than wildcard  path without last \(dq*\(dq are
matched.  \(dq*\(dq  must match  at least one  character.  For
example,  the   pattern  \(dq\fI/foo*\fP\(dq  matches   \(dq\fI/foo/\fP\(dq  and
\(dq\fI/foobar\fP\(dq.  But it does not match \(dq\fI/foo\fP\(dq, or \(dq\fI/fo\fP\(dq.
.sp
If <PATTERN> is omitted or  empty string, \(dq\fI/\fP\(dq is used as
pattern,  which  matches  all request  paths  (catch\-all
pattern).  The catch\-all backend must be given.
.sp
When doing  a match, nghttpx made  some normalization to
pattern, request host and path.  For host part, they are
converted to lower case.  For path part, percent\-encoded
unreserved characters  defined in RFC 3986  are decoded,
and any  dot\-segments (\(dq..\(dq  and \(dq.\(dq)   are resolved and
removed.
.sp
For   example,   \fI\%\-b\fP\(aq127.0.0.1,8080;nghttp2.org/httpbin/\(aq
matches the  request host \(dqnghttp2.org\(dq and  the request
path \(dq\fI/httpbin/get\fP\(dq, but does not match the request host
\(dqnghttp2.org\(dq and the request path \(dq\fI/index.html\fP\(dq.
.sp
The  multiple <PATTERN>s  can  be specified,  delimiting
them            by           \(dq:\(dq.             Specifying
\fI\%\-b\fP\(aq127.0.0.1,8080;nghttp2.org:www.nghttp2.org\(aq  has  the
same  effect  to specify  \fI\%\-b\fP\(aq127.0.0.1,8080;nghttp2.org\(aq
and \fI\%\-b\fP\(aq127.0.0.1,8080;www.nghttp2.org\(aq.
.sp
The backend addresses sharing same <PATTERN> are grouped
together forming  load balancing  group.
.sp
Several parameters <PARAM> are accepted after <PATTERN>.
The  parameters are  delimited  by  \(dq;\(dq.  The  available
parameters       are:      \(dqproto=<PROTO>\(dq,       \(dqtls\(dq,
\(dqsni=<SNI_HOST>\(dq,         \(dqfall=<N>\(dq,        \(dqrise=<N>\(dq,
\(dqaffinity=<METHOD>\(dq,    \(dqdns\(dq,    \(dqredirect\-if\-not\-tls\(dq,
\(dqupgrade\-scheme\(dq,                        \(dqmruby=<PATH>\(dq,
\(dqread\-timeout=<DURATION>\(dq,   \(dqwrite\-timeout=<DURATION>\(dq,
\(dqgroup=<GROUP>\(dq,  \(dqgroup\-weight=<N>\(dq, \(dqweight=<N>\(dq,  and
\(dqdnf\(dq.    The  parameter   consists   of  keyword,   and
optionally followed by \(dq=\(dq  and value.  For example, the
parameter \(dqproto=h2\(dq consists of the keyword \(dqproto\(dq and
value \(dqh2\(dq.  The parameter \(dqtls\(dq consists of the keyword
\(dqtls\(dq  without value.   Each parameter  is described  as
follows.
.sp
The backend application protocol  can be specified using
optional  \(dqproto\(dq   parameter,  and   in  the   form  of
\(dqproto=<PROTO>\(dq.  <PROTO> should be one of the following
list  without  quotes:  \(dqh2\(dq, \(dqhttp/1.1\(dq.   The  default
value of <PROTO> is  \(dqhttp/1.1\(dq.  Note that usually \(dqh2\(dq
refers to HTTP/2  over TLS.  But in this  option, it may
mean HTTP/2  over cleartext TCP unless  \(dqtls\(dq keyword is
used (see below).
.sp
TLS  can   be  enabled  by  specifying   optional  \(dqtls\(dq
parameter.  TLS is not enabled by default.
.sp
With \(dqsni=<SNI_HOST>\(dq parameter, it can override the TLS
SNI  field  value  with  given  <SNI_HOST>.   This  will
default to the backend <HOST> name
.sp
The  feature  to detect  whether  backend  is online  or
offline can be enabled  using optional \(dqfall\(dq and \(dqrise\(dq
parameters.   Using  \(dqfall=<N>\(dq  parameter,  if  nghttpx
cannot connect  to a  this backend <N>  times in  a row,
this  backend  is  assumed  to be  offline,  and  it  is
excluded from load balancing.  If <N> is 0, this backend
never  be excluded  from load  balancing whatever  times
nghttpx cannot connect  to it, and this  is the default.
There is  also \(dqrise=<N>\(dq parameter.  After  backend was
excluded from load balancing group, nghttpx periodically
attempts to make a connection to the failed backend, and
if the  connection is made  successfully <N> times  in a
row, the backend is assumed to  be online, and it is now
eligible  for load  balancing target.   If <N>  is 0,  a
backend  is permanently  offline, once  it goes  in that
state, and this is the default behaviour.
.sp
The     session     affinity    is     enabled     using
\(dqaffinity=<METHOD>\(dq  parameter.   If  \(dqip\(dq is  given  in
<METHOD>, client  IP based session affinity  is enabled.
If \(dqcookie\(dq  is given in <METHOD>,  cookie based session
affinity is  enabled.  If  \(dqnone\(dq is given  in <METHOD>,
session affinity  is disabled, and this  is the default.
The session  affinity is  enabled per <PATTERN>.   If at
least  one backend  has  \(dqaffinity\(dq  parameter, and  its
<METHOD> is not \(dqnone\(dq,  session affinity is enabled for
all backend  servers sharing the same  <PATTERN>.  It is
advised  to  set  \(dqaffinity\(dq parameter  to  all  backend
explicitly if session affinity  is desired.  The session
affinity  may   break  if   one  of  the   backend  gets
unreachable,  or   backend  settings  are   reloaded  or
replaced by API.
.sp
If   \(dqaffinity=cookie\(dq    is   used,    the   additional
configuration                is                required.
\(dqaffinity\-cookie\-name=<NAME>\(dq must be  used to specify a
name     of     cookie      to     use.      Optionally,
\(dqaffinity\-cookie\-path=<PATH>\(dq can  be used to  specify a
path   which   cookie    is   applied.    The   optional
\(dqaffinity\-cookie\-secure=<SECURE>\(dq  controls  the  Secure
attribute of a cookie.  The default value is \(dqauto\(dq, and
the Secure attribute is  determined by a request scheme.
If a request scheme is \(dqhttps\(dq, then Secure attribute is
set.  Otherwise, it  is not set.  If  <SECURE> is \(dqyes\(dq,
the  Secure attribute  is  always set.   If <SECURE>  is
\(dqno\(dq,   the   Secure   attribute  is   always   omitted.
\(dqaffinity\-cookie\-stickiness=<STICKINESS>\(dq       controls
stickiness  of   this  affinity.   If   <STICKINESS>  is
\(dqloose\(dq, removing or adding a backend server might break
the affinity  and the  request might  be forwarded  to a
different backend server.   If <STICKINESS> is \(dqstrict\(dq,
removing the designated  backend server breaks affinity,
but adding  new backend server does  not cause breakage.
If  the designated  backend server  becomes unavailable,
new backend server is chosen  as if the request does not
have  an  affinity  cookie.   <STICKINESS>  defaults  to
\(dqloose\(dq.
.sp
By default, name resolution of backend host name is done
at  start  up,  or reloading  configuration.   If  \(dqdns\(dq
parameter   is  given,   name  resolution   takes  place
dynamically.  This is useful  if backend address changes
frequently.   If  \(dqdns\(dq  is given,  name  resolution  of
backend   host   name   at  start   up,   or   reloading
configuration is skipped.
.sp
If \(dqredirect\-if\-not\-tls\(dq parameter  is used, the matched
backend  requires   that  frontend  connection   is  TLS
encrypted.  If it isn\(aqt, nghttpx responds to the request
with 308  status code, and  https URI the  client should
use instead  is included in Location  header field.  The
port number in  redirect URI is 443 by  default, and can
be  changed using  \fI\%\-\-redirect\-https\-port\fP option.   If at
least one  backend has  \(dqredirect\-if\-not\-tls\(dq parameter,
this feature is enabled  for all backend servers sharing
the   same   <PATTERN>.    It    is   advised   to   set
\(dqredirect\-if\-no\-tls\(dq    parameter   to    all   backends
explicitly if this feature is desired.
.sp
If \(dqupgrade\-scheme\(dq  parameter is used along  with \(dqtls\(dq
parameter, HTTP/2 :scheme pseudo header field is changed
to \(dqhttps\(dq from \(dqhttp\(dq when forwarding a request to this
particular backend.  This is  a workaround for a backend
server  which  requires  \(dqhttps\(dq :scheme  pseudo  header
field on TLS encrypted connection.
.sp
\(dqmruby=<PATH>\(dq  parameter  specifies  a  path  to  mruby
script  file  which  is  invoked when  this  pattern  is
matched.  All backends which share the same pattern must
have the same mruby path.
.sp
\(dqread\-timeout=<DURATION>\(dq and \(dqwrite\-timeout=<DURATION>\(dq
parameters  specify the  read and  write timeout  of the
backend connection  when this  pattern is  matched.  All
backends which share the same pattern must have the same
timeouts.  If these timeouts  are entirely omitted for a
pattern,            \fI\%\-\-backend\-read\-timeout\fP           and
\fI\%\-\-backend\-write\-timeout\fP are used.
.sp
\(dqgroup=<GROUP>\(dq  parameter specifies  the name  of group
this backend address belongs to.  By default, it belongs
to  the unnamed  default group.   The name  of group  is
unique   per   pattern.   \(dqgroup\-weight=<N>\(dq   parameter
specifies the  weight of  the group.  The  higher weight
gets  more frequently  selected  by  the load  balancing
algorithm.  <N> must be  [1, 256] inclusive.  The weight
8 has 4 times more weight  than 2.  <N> must be the same
for  all addresses  which  share the  same <GROUP>.   If
\(dqgroup\-weight\(dq is  omitted in an address,  but the other
address  which  belongs  to  the  same  group  specifies
\(dqgroup\-weight\(dq,   its    weight   is   used.     If   no
\(dqgroup\-weight\(dq  is  specified  for  all  addresses,  the
weight of a group becomes 1.  \(dqgroup\(dq and \(dqgroup\-weight\(dq
are ignored if session affinity is enabled.
.sp
\(dqweight=<N>\(dq  parameter  specifies  the  weight  of  the
backend  address  inside  a  group  which  this  address
belongs  to.  The  higher  weight  gets more  frequently
selected by  the load balancing algorithm.   <N> must be
[1,  256] inclusive.   The  weight 8  has  4 times  more
weight  than weight  2.  If  this parameter  is omitted,
weight  becomes  1.   \(dqweight\(dq  is  ignored  if  session
affinity is enabled.
.sp
If \(dqdnf\(dq parameter is  specified, an incoming request is
not forwarded to a backend  and just consumed along with
the  request body  (actually a  backend server  never be
contacted).  It  is expected  that the HTTP  response is
generated by mruby  script (see \(dqmruby=<PATH>\(dq parameter
above).  \(dqdnf\(dq is an abbreviation of \(dqdo not forward\(dq.
.sp
Since \(dq;\(dq and \(dq:\(dq are  used as delimiter, <PATTERN> must
not contain  these characters.  In order  to include \(dq:\(dq
in  <PATTERN>,  one  has  to  specify  \(dq%3A\(dq  (which  is
percent\-encoded  from of  \(dq:\(dq) instead.   Since \(dq;\(dq  has
special  meaning  in shell,  the  option  value must  be
quoted.
.sp
Default: \fB127.0.0.1,80\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-f, \-\-frontend=(<HOST>,<PORT>|unix:<PATH>)[[;<PARAM>]...]
Set  frontend  host and  port.   If  <HOST> is  \(aq*\(aq,  it
assumes  all addresses  including  both  IPv4 and  IPv6.
UNIX domain  socket can  be specified by  prefixing path
name  with  \(dqunix:\(dq (e.g.,  unix:/var/run/nghttpx.sock).
This  option can  be used  multiple times  to listen  to
multiple addresses.
.sp
This option  can take  0 or  more parameters,  which are
described  below.   Note   that  \(dqapi\(dq  and  \(dqhealthmon\(dq
parameters are mutually exclusive.
.sp
Optionally, TLS  can be disabled by  specifying \(dqno\-tls\(dq
parameter.  TLS is enabled by default.
.sp
If \(dqsni\-fwd\(dq parameter is  used, when performing a match
to select a backend server,  SNI host name received from
the client  is used  instead of  the request  host.  See
\fI\%\-\-backend\fP option about the pattern match.
.sp
To  make this  frontend as  API endpoint,  specify \(dqapi\(dq
parameter.   This   is  disabled  by  default.    It  is
important  to  limit the  access  to  the API  frontend.
Otherwise, someone  may change  the backend  server, and
break your services,  or expose confidential information
to the outside the world.
.sp
To  make  this  frontend  as  health  monitor  endpoint,
specify  \(dqhealthmon\(dq  parameter.   This is  disabled  by
default.  Any  requests which come through  this address
are replied with 200 HTTP status, without no body.
.sp
To accept  PROXY protocol  version 1  and 2  on frontend
connection,  specify  \(dqproxyproto\(dq parameter.   This  is
disabled by default.
.sp
To  receive   HTTP/3  (QUIC)  traffic,   specify  \(dqquic\(dq
parameter.  It  makes nghttpx listen on  UDP port rather
than  TCP   port.   UNIX   domain  socket,   \(dqapi\(dq,  and
\(dqhealthmon\(dq  parameters  cannot   be  used  with  \(dqquic\(dq
parameter.
.sp
Default: \fB*,3000\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backlog=<N>
Set listen backlog size.
.sp
Default: \fB65536\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backend\-address\-family=(auto|IPv4|IPv6)
Specify  address  family  of  backend  connections.   If
\(dqauto\(dq is given, both IPv4  and IPv6 are considered.  If
\(dqIPv4\(dq is  given, only  IPv4 address is  considered.  If
\(dqIPv6\(dq is given, only IPv6 address is considered.
.sp
Default: \fBauto\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backend\-http\-proxy\-uri=<URI>
Specify      proxy       URI      in       the      form
\X'tty: link http:/'\fI\%http:/\fP\X'tty: link'/[<USER>:<PASS>@]<PROXY>:<PORT>.    If   a   proxy
requires  authentication,  specify  <USER>  and  <PASS>.
Note that  they must be properly  percent\-encoded.  This
proxy  is used  when the  backend connection  is HTTP/2.
First,  make  a CONNECT  request  to  the proxy  and  it
connects  to the  backend  on behalf  of nghttpx.   This
forms  tunnel.   After  that, nghttpx  performs  SSL/TLS
handshake with  the downstream through the  tunnel.  The
timeouts when connecting and  making CONNECT request can
be     specified    by     \fI\%\-\-backend\-read\-timeout\fP    and
\fI\%\-\-backend\-write\-timeout\fP options.
.UNINDENT
.SS Performance
.INDENT 0.0
.TP
.B \-n, \-\-workers=<N>
Set the number of worker threads.
.sp
Default: \fB1\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-single\-thread
Run everything in one  thread inside the worker process.
This   feature   is   provided  for   better   debugging
experience,  or  for  the platforms  which  lack  thread
support.   If  threading  is disabled,  this  option  is
always enabled.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-read\-rate=<SIZE>
Set maximum  average read  rate on  frontend connection.
Setting 0 to this option means read rate is unlimited.
.sp
Default: \fB0\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-read\-burst=<SIZE>
Set  maximum read  burst  size  on frontend  connection.
Setting  0  to this  option  means  read burst  size  is
unlimited.
.sp
Default: \fB0\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-write\-rate=<SIZE>
Set maximum  average write rate on  frontend connection.
Setting 0 to this option means write rate is unlimited.
.sp
Default: \fB0\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-write\-burst=<SIZE>
Set  maximum write  burst size  on frontend  connection.
Setting  0 to  this  option means  write  burst size  is
unlimited.
.sp
Default: \fB0\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-worker\-read\-rate=<SIZE>
Set maximum average read rate on frontend connection per
worker.  Setting  0 to  this option  means read  rate is
unlimited.  Not implemented yet.
.sp
Default: \fB0\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-worker\-read\-burst=<SIZE>
Set maximum  read burst size on  frontend connection per
worker.  Setting 0 to this  option means read burst size
is unlimited.  Not implemented yet.
.sp
Default: \fB0\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-worker\-write\-rate=<SIZE>
Set maximum  average write  rate on  frontend connection
per worker.  Setting  0 to this option  means write rate
is unlimited.  Not implemented yet.
.sp
Default: \fB0\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-worker\-write\-burst=<SIZE>
Set maximum write burst  size on frontend connection per
worker.  Setting 0 to this option means write burst size
is unlimited.  Not implemented yet.
.sp
Default: \fB0\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-worker\-frontend\-connections=<N>
Set maximum number  of simultaneous connections frontend
accepts.  Setting 0 means unlimited.
.sp
Default: \fB0\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backend\-connections\-per\-host=<N>
Set  maximum number  of  backend concurrent  connections
(and/or  streams in  case  of HTTP/2)  per origin  host.
This option  is meaningful when \fI\%\-\-http2\-proxy\fP  option is
used.   The  origin  host  is  determined  by  authority
portion of  request URI (or :authority  header field for
HTTP/2).   To  limit  the   number  of  connections  per
frontend        for       default        mode,       use
\fI\%\-\-backend\-connections\-per\-frontend\fP\&.
.sp
Default: \fB8\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backend\-connections\-per\-frontend=<N>
Set  maximum number  of  backend concurrent  connections
(and/or streams  in case of HTTP/2)  per frontend.  This
option  is   only  used  for  default   mode.   0  means
unlimited.  To limit the  number of connections per host
with          \fI\%\-\-http2\-proxy\fP         option,          use
\fI\%\-\-backend\-connections\-per\-host\fP\&.
.sp
Default: \fB0\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-rlimit\-nofile=<N>
Set maximum number of open files (RLIMIT_NOFILE) to <N>.
If 0 is given, nghttpx does not set the limit.
.sp
Default: \fB0\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-rlimit\-memlock=<N>
Set maximum number of bytes of memory that may be locked
into  RAM.  If  0 is  given,  nghttpx does  not set  the
limit.
.sp
Default: \fB0\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backend\-request\-buffer=<SIZE>
Set buffer size used to store backend request.
.sp
Default: \fB16K\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backend\-response\-buffer=<SIZE>
Set buffer size used to store backend response.
.sp
Default: \fB128K\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-fastopen=<N>
Enables  \(dqTCP Fast  Open\(dq for  the listening  socket and
limits the  maximum length for the  queue of connections
that have not yet completed the three\-way handshake.  If
value is 0 then fast open is disabled.
.sp
Default: \fB0\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-kqueue
Don\(aqt use  kqueue.  This  option is only  applicable for
the platforms  which have kqueue.  For  other platforms,
this option will be simply ignored.
.UNINDENT
.SS Timeout
.INDENT 0.0
.TP
.B \-\-frontend\-http2\-idle\-timeout=<DURATION>
Specify idle timeout for HTTP/2 frontend connection.  If
no active streams exist for this duration, connection is
closed.
.sp
Default: \fB3m\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http3\-idle\-timeout=<DURATION>
Specify idle timeout for HTTP/3 frontend connection.  If
no active streams exist for this duration, connection is
closed.
.sp
Default: \fB3m\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-write\-timeout=<DURATION>
Specify write timeout for all frontend connections.
.sp
Default: \fB30s\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-keep\-alive\-timeout=<DURATION>
Specify   keep\-alive   timeout   for   frontend   HTTP/1
connection.
.sp
Default: \fB1m\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-header\-timeout=<DURATION>
Specify  duration  that the  server  waits  for an  HTTP
request  header fields  to be  received completely.   On
timeout, HTTP/1 and HTTP/2  connections are closed.  For
HTTP/3,  the  stream  is shutdown,  and  the  connection
itself is left intact.
.sp
Default: \fB1m\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-stream\-read\-timeout=<DURATION>
Specify  read timeout  for HTTP/2  streams.  0  means no
timeout.
.sp
Default: \fB0\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-stream\-write\-timeout=<DURATION>
Specify write  timeout for  HTTP/2 streams.  0  means no
timeout.
.sp
Default: \fB1m\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backend\-read\-timeout=<DURATION>
Specify read timeout for backend connection.
.sp
Default: \fB1m\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backend\-write\-timeout=<DURATION>
Specify write timeout for backend connection.
.sp
Default: \fB30s\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backend\-connect\-timeout=<DURATION>
Specify  timeout before  establishing TCP  connection to
backend.
.sp
Default: \fB30s\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backend\-keep\-alive\-timeout=<DURATION>
Specify   keep\-alive   timeout    for   backend   HTTP/1
connection.
.sp
Default: \fB2s\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-listener\-disable\-timeout=<DURATION>
After accepting  connection failed,  connection listener
is disabled  for a given  amount of time.   Specifying 0
disables this feature.
.sp
Default: \fB30s\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http2\-setting\-timeout=<DURATION>
Specify  timeout before  SETTINGS ACK  is received  from
client.
.sp
Default: \fB10s\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backend\-http2\-settings\-timeout=<DURATION>
Specify  timeout before  SETTINGS ACK  is received  from
backend server.
.sp
Default: \fB10s\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backend\-max\-backoff=<DURATION>
Specify  maximum backoff  interval.  This  is used  when
doing health  check against offline backend  (see \(dqfail\(dq
parameter  in \fI\%\-\-backend\fP  option).   It is  also used  to
limit  the  maximum   interval  to  temporarily  disable
backend  when nghttpx  failed to  connect to  it.  These
intervals are calculated  using exponential backoff, and
consecutive failed attempts increase the interval.  This
option caps its maximum value.
.sp
Default: \fB2m\fP
.UNINDENT
.SS SSL/TLS
.INDENT 0.0
.TP
.B \-\-ciphers=<SUITE>
Set allowed  cipher list  for frontend  connection.  The
format of the string is described in OpenSSL ciphers(1).
This option  sets cipher suites for  TLSv1.2 or earlier.
Use \fI\%\-\-tls13\-ciphers\fP for TLSv1.3.
.sp
Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:DHE\-RSA\-AES128\-GCM\-SHA256:DHE\-RSA\-AES256\-GCM\-SHA384\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls13\-ciphers=<SUITE>
Set allowed  cipher list  for frontend  connection.  The
format of the string is described in OpenSSL ciphers(1).
This  option  sets  cipher   suites  for  TLSv1.3.   Use
\fI\%\-\-ciphers\fP for TLSv1.2 or earlier.
.sp
Default: \fBTLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-client\-ciphers=<SUITE>
Set  allowed cipher  list for  backend connection.   The
format of the string is described in OpenSSL ciphers(1).
This option  sets cipher suites for  TLSv1.2 or earlier.
Use \fI\%\-\-tls13\-client\-ciphers\fP for TLSv1.3.
.sp
Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:DHE\-RSA\-AES128\-GCM\-SHA256:DHE\-RSA\-AES256\-GCM\-SHA384\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls13\-client\-ciphers=<SUITE>
Set  allowed cipher  list for  backend connection.   The
format of the string is described in OpenSSL ciphers(1).
This  option  sets  cipher   suites  for  TLSv1.3.   Use
\fI\%\-\-tls13\-client\-ciphers\fP for TLSv1.2 or earlier.
.sp
Default: \fBTLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-ecdh\-curves=<LIST>
Set  supported  curve  list  for  frontend  connections.
<LIST> is a  colon separated list of curve  NID or names
in the preference order.  The supported curves depend on
the  linked  OpenSSL  library.  This  function  requires
OpenSSL >= 1.0.2.
.sp
Default: \fBX25519:P\-256:P\-384:P\-521\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-k, \-\-insecure
Don\(aqt  verify backend  server\(aqs  certificate  if TLS  is
enabled for backend connections.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-cacert=<PATH>
Set path to trusted CA  certificate file.  It is used in
backend  TLS connections  to verify  peer\(aqs certificate.
The file must be in PEM format.  It can contain multiple
certificates.  If  the linked  OpenSSL is  configured to
load  system  wide  certificates,  they  are  loaded  at
startup regardless of this option.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-private\-key\-passwd\-file=<PATH>
Path  to file  that contains  password for  the server\(aqs
private key.   If none is  given and the private  key is
password protected it\(aqll be requested interactively.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-subcert=<KEYPATH>:<CERTPATH>[[;<PARAM>]...]
Specify  additional certificate  and  private key  file.
nghttpx will  choose certificates based on  the hostname
indicated by client using TLS SNI extension.  If nghttpx
is  built with  OpenSSL  >= 1.0.2,  the shared  elliptic
curves (e.g., P\-256) between  client and server are also
taken into  consideration.  This allows nghttpx  to send
ECDSA certificate  to modern clients, while  sending RSA
based certificate to older  clients.  This option can be
used  multiple  times.
.sp
Additional parameter  can be specified in  <PARAM>.  The
available <PARAM> is \(dqsct\-dir=<DIR>\(dq.
.sp
\(dqsct\-dir=<DIR>\(dq  specifies the  path to  directory which
contains        *.sct        files        for        TLS
signed_certificate_timestamp extension (RFC 6962).  This
feature   requires   OpenSSL   >=   1.0.2.    See   also
\fI\%\-\-tls\-sct\-dir\fP option.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-dh\-param\-file=<PATH>
Path to file that contains  DH parameters in PEM format.
Without  this   option,  DHE   cipher  suites   are  not
available.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-alpn\-list=<LIST>
Comma delimited list of  ALPN protocol identifier sorted
in the  order of preference.  That  means most desirable
protocol comes  first.  The parameter must  be delimited
by a single comma only  and any white spaces are treated
as a part of protocol string.
.sp
Default: \fBh2,http/1.1\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-verify\-client
Require and verify client certificate.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-verify\-client\-cacert=<PATH>
Path  to file  that contains  CA certificates  to verify
client certificate.  The file must be in PEM format.  It
can contain multiple certificates.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-verify\-client\-tolerate\-expired
Accept  expired  client  certificate.   Operator  should
handle  the expired  client  certificate  by some  means
(e.g.,  mruby  script).   Otherwise, this  option  might
cause a security risk.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-client\-private\-key\-file=<PATH>
Path to  file that contains  client private key  used in
backend client authentication.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-client\-cert\-file=<PATH>
Path to  file that  contains client certificate  used in
backend client authentication.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-min\-proto\-version=<VER>
Specify minimum SSL/TLS protocol.   The name matching is
done in  case\-insensitive manner.  The  versions between
\fI\%\-\-tls\-min\-proto\-version\fP and  \fI\%\-\-tls\-max\-proto\-version\fP are
enabled.  If the protocol list advertised by client does
not  overlap  this range,  you  will  receive the  error
message \(dqunknown protocol\(dq.  If a protocol version lower
than TLSv1.2 is specified, make sure that the compatible
ciphers are  included in \fI\%\-\-ciphers\fP option.   The default
cipher  list  only   includes  ciphers  compatible  with
TLSv1.2 or above.  The available versions are:
TLSv1.3, TLSv1.2, TLSv1.1, and TLSv1.0
.sp
Default: \fBTLSv1.2\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-max\-proto\-version=<VER>
Specify maximum SSL/TLS protocol.   The name matching is
done in  case\-insensitive manner.  The  versions between
\fI\%\-\-tls\-min\-proto\-version\fP and  \fI\%\-\-tls\-max\-proto\-version\fP are
enabled.  If the protocol list advertised by client does
not  overlap  this range,  you  will  receive the  error
message \(dqunknown protocol\(dq.  The available versions are:
TLSv1.3, TLSv1.2, TLSv1.1, and TLSv1.0
.sp
Default: \fBTLSv1.3\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-ticket\-key\-file=<PATH>
Path to file that contains  random data to construct TLS
session ticket  parameters.  If aes\-128\-cbc is  given in
\fI\%\-\-tls\-ticket\-key\-cipher\fP, the  file must  contain exactly
48    bytes.     If     aes\-256\-cbc    is    given    in
\fI\%\-\-tls\-ticket\-key\-cipher\fP, the  file must  contain exactly
80  bytes.   This  options  can be  used  repeatedly  to
specify  multiple ticket  parameters.  If  several files
are given,  only the  first key is  used to  encrypt TLS
session  tickets.  Other  keys are  accepted but  server
will  issue new  session  ticket with  first key.   This
allows  session  key  rotation.  Please  note  that  key
rotation  does  not  occur automatically.   User  should
rearrange  files or  change options  values and  restart
nghttpx gracefully.   If opening  or reading  given file
fails, all loaded  keys are discarded and  it is treated
as if none  of this option is given.  If  this option is
not given or an error  occurred while opening or reading
a file,  key is  generated every  1 hour  internally and
they are  valid for  12 hours.   This is  recommended if
ticket  key sharing  between  nghttpx  instances is  not
required.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-ticket\-key\-memcached=<HOST>,<PORT>[;tls]
Specify address  of memcached  server to get  TLS ticket
keys for  session resumption.   This enables  shared TLS
ticket key between  multiple nghttpx instances.  nghttpx
does not set TLS ticket  key to memcached.  The external
ticket key generator is required.  nghttpx just gets TLS
ticket  keys  from  memcached, and  use  them,  possibly
replacing current set  of keys.  It is up  to extern TLS
ticket  key generator  to rotate  keys frequently.   See
\(dqTLS SESSION  TICKET RESUMPTION\(dq section in  manual page
to know the data format in memcached entry.  Optionally,
memcached  connection  can  be  encrypted  with  TLS  by
specifying \(dqtls\(dq parameter.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-ticket\-key\-memcached\-address\-family=(auto|IPv4|IPv6)
Specify address  family of memcached connections  to get
TLS ticket keys.  If \(dqauto\(dq is given, both IPv4 and IPv6
are considered.   If \(dqIPv4\(dq is given,  only IPv4 address
is considered.  If \(dqIPv6\(dq is given, only IPv6 address is
considered.
.sp
Default: \fBauto\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-ticket\-key\-memcached\-interval=<DURATION>
Set interval to get TLS ticket keys from memcached.
.sp
Default: \fB10m\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-ticket\-key\-memcached\-max\-retry=<N>
Set  maximum   number  of  consecutive   retries  before
abandoning TLS ticket key  retrieval.  If this number is
reached,  the  attempt  is considered  as  failure,  and
\(dqfailure\(dq count  is incremented by 1,  which contributed
to            the            value            controlled
\fI\%\-\-tls\-ticket\-key\-memcached\-max\-fail\fP option.
.sp
Default: \fB3\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-ticket\-key\-memcached\-max\-fail=<N>
Set  maximum   number  of  consecutive   failure  before
disabling TLS ticket until next scheduled key retrieval.
.sp
Default: \fB2\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-ticket\-key\-cipher=<CIPHER>
Specify cipher  to encrypt TLS session  ticket.  Specify
either   aes\-128\-cbc   or  aes\-256\-cbc.    By   default,
aes\-128\-cbc is used.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-ticket\-key\-memcached\-cert\-file=<PATH>
Path to client certificate  for memcached connections to
get TLS ticket keys.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-ticket\-key\-memcached\-private\-key\-file=<PATH>
Path to client private  key for memcached connections to
get TLS ticket keys.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-dyn\-rec\-warmup\-threshold=<SIZE>
Specify the  threshold size for TLS  dynamic record size
behaviour.  During  a TLS  session, after  the threshold
number of bytes  have been written, the  TLS record size
will be increased to the maximum allowed (16K).  The max
record size will  continue to be used on  the active TLS
session.  After  \fI\%\-\-tls\-dyn\-rec\-idle\-timeout\fP has elapsed,
the record size is reduced  to 1300 bytes.  Specify 0 to
always use  the maximum record size,  regardless of idle
period.   This  behaviour  applies   to  all  TLS  based
frontends, and TLS HTTP/2 backends.
.sp
Default: \fB1M\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-dyn\-rec\-idle\-timeout=<DURATION>
Specify TLS dynamic record  size behaviour timeout.  See
\fI\%\-\-tls\-dyn\-rec\-warmup\-threshold\fP  for   more  information.
This behaviour  applies to all TLS  based frontends, and
TLS HTTP/2 backends.
.sp
Default: \fB1s\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-http2\-cipher\-block\-list
Allow  block  listed  cipher suite  on  frontend  HTTP/2
connection.                                          See
\X'tty: link https://tools.ietf.org/html/rfc7540#appendix-A'\fI\%https://tools.ietf.org/html/rfc7540#appendix\-A\fP\X'tty: link'  for  the
complete HTTP/2 cipher suites block list.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-client\-no\-http2\-cipher\-block\-list
Allow  block  listed  cipher  suite  on  backend  HTTP/2
connection.                                          See
\X'tty: link https://tools.ietf.org/html/rfc7540#appendix-A'\fI\%https://tools.ietf.org/html/rfc7540#appendix\-A\fP\X'tty: link'  for  the
complete HTTP/2 cipher suites block list.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-sct\-dir=<DIR>
Specifies the  directory where  *.sct files  exist.  All
*.sct   files   in  <DIR>   are   read,   and  sent   as
extension_data of  TLS signed_certificate_timestamp (RFC
6962)  to  client.   These   *.sct  files  are  for  the
certificate   specified   in   positional   command\-line
argument <CERT>, or  certificate option in configuration
file.   For   additional  certificates,   use  \fI\%\-\-subcert\fP
option.  This option requires OpenSSL >= 1.0.2.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-psk\-secrets=<PATH>
Read list of PSK identity and secrets from <PATH>.  This
is used for frontend connection.  The each line of input
file  is  formatted  as  <identity>:<hex\-secret>,  where
<identity> is  PSK identity, and <hex\-secret>  is secret
in hex.  An  empty line, and line which  starts with \(aq#\(aq
are skipped.  The default  enabled cipher list might not
contain any PSK cipher suite.  In that case, desired PSK
cipher suites  must be  enabled using  \fI\%\-\-ciphers\fP option.
The  desired PSK  cipher suite  may be  block listed  by
HTTP/2.   To  use  those   cipher  suites  with  HTTP/2,
consider  to  use  \fI\%\-\-no\-http2\-cipher\-block\-list\fP  option.
But be aware its implications.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-client\-psk\-secrets=<PATH>
Read PSK identity and secrets from <PATH>.  This is used
for backend connection.  The each  line of input file is
formatted  as <identity>:<hex\-secret>,  where <identity>
is PSK identity, and <hex\-secret>  is secret in hex.  An
empty line, and line which  starts with \(aq#\(aq are skipped.
The first identity and  secret pair encountered is used.
The default  enabled cipher  list might not  contain any
PSK  cipher suite.   In  that case,  desired PSK  cipher
suites  must be  enabled using  \fI\%\-\-client\-ciphers\fP option.
The  desired PSK  cipher suite  may be  block listed  by
HTTP/2.   To  use  those   cipher  suites  with  HTTP/2,
consider   to  use   \fI\%\-\-client\-no\-http2\-cipher\-block\-list\fP
option.  But be aware its implications.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-no\-postpone\-early\-data
By  default,   except  for  QUIC   connections,  nghttpx
postpones forwarding  HTTP requests sent in  early data,
including  those  sent in  partially  in  it, until  TLS
handshake  finishes.  If  all backend  server recognizes
\(dqEarly\-Data\(dq  header  field,  using  this  option  makes
nghttpx  not postpone  forwarding request  and get  full
potential of 0\-RTT data.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-max\-early\-data=<SIZE>
Sets  the  maximum  amount  of 0\-RTT  data  that  server
accepts.
.sp
Default: \fB16K\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls\-ktls
Enable ktls.
.UNINDENT
.SS HTTP/2
.INDENT 0.0
.TP
.B \-c, \-\-frontend\-http2\-max\-concurrent\-streams=<N>
Set the maximum number of  the concurrent streams in one
frontend HTTP/2 session.
.sp
Default: \fB100\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backend\-http2\-max\-concurrent\-streams=<N>
Set the maximum number of  the concurrent streams in one
backend  HTTP/2 session.   This sets  maximum number  of
concurrent opened pushed streams.  The maximum number of
concurrent requests are set by a remote server.
.sp
Default: \fB100\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http2\-window\-size=<SIZE>
Sets  the  per\-stream  initial  window  size  of  HTTP/2
frontend connection.
.sp
Default: \fB65535\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http2\-connection\-window\-size=<SIZE>
Sets the  per\-connection window size of  HTTP/2 frontend
connection.
.sp
Default: \fB65535\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backend\-http2\-window\-size=<SIZE>
Sets  the   initial  window   size  of   HTTP/2  backend
connection.
.sp
Default: \fB65535\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backend\-http2\-connection\-window\-size=<SIZE>
Sets the  per\-connection window  size of  HTTP/2 backend
connection.
.sp
Default: \fB2147483647\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-http2\-no\-cookie\-crumbling
Don\(aqt crumble cookie header field.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-padding=<N>
Add  at most  <N> bytes  to  a HTTP/2  frame payload  as
padding.  Specify 0 to  disable padding.  This option is
meant for debugging purpose  and not intended to enhance
protocol security.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-server\-push
Disable HTTP/2 server push.  Server push is supported by
default mode and HTTP/2  frontend via Link header field.
It is  also supported if  both frontend and  backend are
HTTP/2 in default mode.  In  this case, server push from
backend session is relayed  to frontend, and server push
via Link header field is also supported.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http2\-optimize\-write\-buffer\-size
(Experimental) Enable write  buffer size optimization in
frontend HTTP/2 TLS  connection.  This optimization aims
to reduce  write buffer  size so  that it  only contains
bytes  which can  send immediately.   This makes  server
more responsive to prioritized HTTP/2 stream because the
buffering  of lower  priority stream  is reduced.   This
option is only effective on recent Linux platform.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http2\-optimize\-window\-size
(Experimental)   Automatically  tune   connection  level
window size of frontend  HTTP/2 TLS connection.  If this
feature is  enabled, connection window size  starts with
the   default  window   size,   65535  bytes.    nghttpx
automatically  adjusts connection  window size  based on
TCP receiving  window size.  The maximum  window size is
capped      by      the     value      specified      by
\fI\%\-\-frontend\-http2\-connection\-window\-size\fP\&.     Since   the
stream is subject to stream level window size, it should
be adjusted using \fI\%\-\-frontend\-http2\-window\-size\fP option as
well.   This option  is only  effective on  recent Linux
platform.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http2\-encoder\-dynamic\-table\-size=<SIZE>
Specify the maximum dynamic  table size of HPACK encoder
in the frontend HTTP/2 connection.  The decoder (client)
specifies  the maximum  dynamic table  size it  accepts.
Then the negotiated dynamic table size is the minimum of
this option value and the value which client specified.
.sp
Default: \fB4K\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http2\-decoder\-dynamic\-table\-size=<SIZE>
Specify the maximum dynamic  table size of HPACK decoder
in the frontend HTTP/2 connection.
.sp
Default: \fB4K\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backend\-http2\-encoder\-dynamic\-table\-size=<SIZE>
Specify the maximum dynamic  table size of HPACK encoder
in the backend HTTP/2 connection.  The decoder (backend)
specifies  the maximum  dynamic table  size it  accepts.
Then the negotiated dynamic table size is the minimum of
this option value and the value which backend specified.
.sp
Default: \fB4K\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-backend\-http2\-decoder\-dynamic\-table\-size=<SIZE>
Specify the maximum dynamic  table size of HPACK decoder
in the backend HTTP/2 connection.
.sp
Default: \fB4K\fP
.UNINDENT
.SS Mode
.INDENT 0.0
.TP
.B (default mode)
Accept  HTTP/2,  and  HTTP/1.1 over  SSL/TLS.   \(dqno\-tls\(dq
parameter is  used in  \fI\%\-\-frontend\fP option,  accept HTTP/2
and HTTP/1.1 over cleartext  TCP.  The incoming HTTP/1.1
connection  can  be  upgraded  to  HTTP/2  through  HTTP
Upgrade.
.UNINDENT
.INDENT 0.0
.TP
.B \-s, \-\-http2\-proxy
Like default mode, but enable forward proxy.  This is so
called HTTP/2 proxy mode.
.UNINDENT
.SS Logging
.INDENT 0.0
.TP
.B \-L, \-\-log\-level=<LEVEL>
Set the severity  level of log output.   <LEVEL> must be
one of INFO, NOTICE, WARN, ERROR and FATAL.
.sp
Default: \fBNOTICE\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-accesslog\-file=<PATH>
Set path to write access log.  To reopen file, send USR1
signal to nghttpx.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-accesslog\-syslog
Send  access log  to syslog.   If this  option is  used,
\fI\%\-\-accesslog\-file\fP option is ignored.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-accesslog\-format=<FORMAT>
Specify  format  string  for access  log.   The  default
format is combined format.   The following variables are
available:
.INDENT 7.0
.IP \(bu 2
$remote_addr: client IP address.
.IP \(bu 2
$time_local: local time in Common Log format.
.IP \(bu 2
$time_iso8601: local time in ISO 8601 format.
.IP \(bu 2
$request: HTTP request line.
.IP \(bu 2
$status: HTTP response status code.
.IP \(bu 2
$body_bytes_sent: the  number of bytes sent  to client
as response body.
.IP \(bu 2
$http_<VAR>: value of HTTP  request header <VAR> where
\(aq_\(aq in <VAR> is replaced with \(aq\-\(aq.
.IP \(bu 2
$remote_port: client  port.
.IP \(bu 2
$server_port: server port.
.IP \(bu 2
$request_time: request processing time in seconds with
milliseconds resolution.
.IP \(bu 2
$pid: PID of the running process.
.IP \(bu 2
$alpn: ALPN identifier of the protocol which generates
the response.   For HTTP/1,  ALPN is  always http/1.1,
regardless of minor version.
.IP \(bu 2
$tls_cipher: cipher used for SSL/TLS connection.
.IP \(bu 2
$tls_client_fingerprint_sha256: SHA\-256 fingerprint of
client certificate.
.IP \(bu 2
$tls_client_fingerprint_sha1:  SHA\-1   fingerprint  of
client certificate.
.IP \(bu 2
$tls_client_subject_name:   subject  name   in  client
certificate.
.IP \(bu 2
$tls_client_issuer_name:   issuer   name   in   client
certificate.
.IP \(bu 2
$tls_client_serial:    serial    number   in    client
certificate.
.IP \(bu 2
$tls_protocol: protocol for SSL/TLS connection.
.IP \(bu 2
$tls_session_id: session ID for SSL/TLS connection.
.IP \(bu 2
$tls_session_reused:  \(dqr\(dq   if  SSL/TLS   session  was
reused.  Otherwise, \(dq.\(dq
.IP \(bu 2
$tls_sni: SNI server name for SSL/TLS connection.
.IP \(bu 2
$backend_host:  backend  host   used  to  fulfill  the
request.  \(dq\-\(dq if backend host is not available.
.IP \(bu 2
$backend_port:  backend  port   used  to  fulfill  the
request.  \(dq\-\(dq if backend host is not available.
.IP \(bu 2
$method: HTTP method
.IP \(bu 2
$path:  Request  path  including query.   For  CONNECT
request, authority is recorded.
.IP \(bu 2
$path_without_query:  $path   up  to  the   first  \(aq?\(aq
character.    For   CONNECT  request,   authority   is
recorded.
.IP \(bu 2
$protocol_version:   HTTP  version   (e.g.,  HTTP/1.1,
HTTP/2)
.UNINDENT
.sp
The  variable  can  be  enclosed  by  \(dq{\(dq  and  \(dq}\(dq  for
disambiguation (e.g., ${remote_addr}).
.sp
Default: \fB$remote_addr \- \- [$time_local] \(dq$request\(dq $status $body_bytes_sent \(dq$http_referer\(dq \(dq$http_user_agent\(dq\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-accesslog\-write\-early
Write  access  log  when   response  header  fields  are
received   from  backend   rather   than  when   request
transaction finishes.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-errorlog\-file=<PATH>
Set path to write error  log.  To reopen file, send USR1
signal  to nghttpx.   stderr will  be redirected  to the
error log file unless \fI\%\-\-errorlog\-syslog\fP is used.
.sp
Default: \fB/dev/stderr\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-errorlog\-syslog
Send  error log  to  syslog.  If  this  option is  used,
\fI\%\-\-errorlog\-file\fP option is ignored.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-syslog\-facility=<FACILITY>
Set syslog facility to <FACILITY>.
.sp
Default: \fBdaemon\fP
.UNINDENT
.SS HTTP
.INDENT 0.0
.TP
.B \-\-add\-x\-forwarded\-for
Append  X\-Forwarded\-For header  field to  the downstream
request.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-strip\-incoming\-x\-forwarded\-for
Strip X\-Forwarded\-For  header field from  inbound client
requests.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-add\-x\-forwarded\-proto
Don\(aqt append  additional X\-Forwarded\-Proto  header field
to  the   backend  request.   If  inbound   client  sets
X\-Forwarded\-Proto,                                   and
\fI\%\-\-no\-strip\-incoming\-x\-forwarded\-proto\fP  option  is  used,
they are passed to the backend.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-strip\-incoming\-x\-forwarded\-proto
Don\(aqt strip X\-Forwarded\-Proto  header field from inbound
client requests.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-add\-forwarded=<LIST>
Append RFC  7239 Forwarded header field  with parameters
specified in comma delimited list <LIST>.  The supported
parameters  are \(dqby\(dq,  \(dqfor\(dq, \(dqhost\(dq,  and \(dqproto\(dq.   By
default,  the value  of  \(dqby\(dq and  \(dqfor\(dq parameters  are
obfuscated     string.     See     \fI\%\-\-forwarded\-by\fP    and
\fI\%\-\-forwarded\-for\fP options respectively.  Note that nghttpx
does  not  translate non\-standard  X\-Forwarded\-*  header
fields into Forwarded header field, and vice versa.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-strip\-incoming\-forwarded
Strip  Forwarded   header  field  from   inbound  client
requests.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-forwarded\-by=(obfuscated|ip|<VALUE>)
Specify the parameter value sent out with \(dqby\(dq parameter
of Forwarded  header field.   If \(dqobfuscated\(dq  is given,
the string is randomly generated at startup.  If \(dqip\(dq is
given,   the  interface   address  of   the  connection,
including port number, is  sent with \(dqby\(dq parameter.  In
case of UNIX domain  socket, \(dqlocalhost\(dq is used instead
of address and  port.  User can also  specify the static
obfuscated string.  The limitation is that it must start
with   \(dq_\(dq,  and   only   consists   of  character   set
[A\-Za\-z0\-9._\-], as described in RFC 7239.
.sp
Default: \fBobfuscated\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-forwarded\-for=(obfuscated|ip)
Specify  the   parameter  value  sent  out   with  \(dqfor\(dq
parameter of Forwarded header field.  If \(dqobfuscated\(dq is
given, the string is  randomly generated for each client
connection.  If \(dqip\(dq is given, the remote client address
of  the connection,  without port  number, is  sent with
\(dqfor\(dq  parameter.   In  case   of  UNIX  domain  socket,
\(dqlocalhost\(dq is used instead of address.
.sp
Default: \fBobfuscated\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-via
Don\(aqt append to  Via header field.  If  Via header field
is received, it is left unaltered.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-strip\-incoming\-early\-data
Don\(aqt strip Early\-Data header  field from inbound client
requests.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-location\-rewrite
Don\(aqt  rewrite location  header field  in default  mode.
When \fI\%\-\-http2\-proxy\fP  is used, location header  field will
not be altered regardless of this option.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-host\-rewrite
Rewrite  host and  :authority header  fields in  default
mode.  When  \fI\%\-\-http2\-proxy\fP is  used, these  headers will
not be altered regardless of this option.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-altsvc=<PROTOID,PORT[,HOST,[ORIGIN[,PARAMS]]]>
Specify   protocol  ID,   port,  host   and  origin   of
alternative service.  <HOST>,  <ORIGIN> and <PARAMS> are
optional.   Empty <HOST>  and <ORIGIN>  are allowed  and
they  are treated  as  nothing is  specified.  They  are
advertised  in alt\-svc  header  field  only in  HTTP/1.1
frontend.   This option  can be  used multiple  times to
specify multiple alternative services.
Example: \fI\%\-\-altsvc\fP=\(dqh2,443,,,ma=3600; persist=1\(dq
.UNINDENT
.INDENT 0.0
.TP
.B \-\-http2\-altsvc=<PROTOID,PORT[,HOST,[ORIGIN[,PARAMS]]]>
Just like \fI\%\-\-altsvc\fP option, but  this altsvc is only sent
in HTTP/2 frontend.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-add\-request\-header=<HEADER>
Specify additional header field to add to request header
set.   The field  name must  be lowercase.   This option
just  appends header  field and  won\(aqt replace  anything
already set.  This  option can be used  several times to
specify multiple header fields.
Example: \fI\%\-\-add\-request\-header\fP=\(dqfoo: bar\(dq
.UNINDENT
.INDENT 0.0
.TP
.B \-\-add\-response\-header=<HEADER>
Specify  additional  header  field to  add  to  response
header  set.  The  field name  must be  lowercase.  This
option  just  appends  header field  and  won\(aqt  replace
anything already  set.  This option can  be used several
times to specify multiple header fields.
Example: \fI\%\-\-add\-response\-header\fP=\(dqfoo: bar\(dq
.UNINDENT
.INDENT 0.0
.TP
.B \-\-request\-header\-field\-buffer=<SIZE>
Set maximum buffer size for incoming HTTP request header
field list.  This is the sum of header name and value in
bytes.   If  trailer  fields  exist,  they  are  counted
towards this number.
.sp
Default: \fB64K\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-max\-request\-header\-fields=<N>
Set  maximum  number  of incoming  HTTP  request  header
fields.   If  trailer  fields exist,  they  are  counted
towards this number.
.sp
Default: \fB100\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-response\-header\-field\-buffer=<SIZE>
Set  maximum  buffer  size for  incoming  HTTP  response
header field list.   This is the sum of  header name and
value  in  bytes.  If  trailer  fields  exist, they  are
counted towards this number.
.sp
Default: \fB64K\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-max\-response\-header\-fields=<N>
Set  maximum number  of  incoming  HTTP response  header
fields.   If  trailer  fields exist,  they  are  counted
towards this number.
.sp
Default: \fB500\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-error\-page=(<CODE>|*)=<PATH>
Set file path  to custom error page  served when nghttpx
originally  generates  HTTP  error status  code  <CODE>.
<CODE> must be greater than or equal to 400, and at most
599.  If \(dq*\(dq  is used instead of <CODE>,  it matches all
HTTP  status  code.  If  error  status  code comes  from
backend server, the custom error pages are not used.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-server\-name=<NAME>
Change server response header field value to <NAME>.
.sp
Default: \fBnghttpx\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-server\-rewrite
Don\(aqt rewrite server header field in default mode.  When
\fI\%\-\-http2\-proxy\fP is used, these headers will not be altered
regardless of this option.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-redirect\-https\-port=<PORT>
Specify the port number which appears in Location header
field  when  redirect  to  HTTPS  URI  is  made  due  to
\(dqredirect\-if\-not\-tls\(dq parameter in \fI\%\-\-backend\fP option.
.sp
Default: \fB443\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-require\-http\-scheme
Always require http or https scheme in HTTP request.  It
also  requires that  https scheme  must be  used for  an
encrypted  connection.  Otherwise,  http scheme  must be
used.   This   option  is   recommended  for   a  server
deployment which directly faces clients and the services
it provides only require http or https scheme.
.UNINDENT
.SS API
.INDENT 0.0
.TP
.B \-\-api\-max\-request\-body=<SIZE>
Set the maximum size of request body for API request.
.sp
Default: \fB32M\fP
.UNINDENT
.SS DNS
.INDENT 0.0
.TP
.B \-\-dns\-cache\-timeout=<DURATION>
Set duration that cached DNS results remain valid.  Note
that nghttpx caches the unsuccessful results as well.
.sp
Default: \fB10s\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-dns\-lookup\-timeout=<DURATION>
Set timeout that  DNS server is given to  respond to the
initial  DNS  query.  For  the  2nd  and later  queries,
server is  given time based  on this timeout, and  it is
scaled linearly.
.sp
Default: \fB250ms\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-dns\-max\-try=<N>
Set the number of DNS query before nghttpx gives up name
lookup.
.sp
Default: \fB3\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-max\-requests=<N>
The number  of requests that single  frontend connection
can process.  For HTTP/2, this  is the number of streams
in  one  HTTP/2 connection.   For  HTTP/1,  this is  the
number of keep alive requests.  This is hint to nghttpx,
and it  may allow additional few  requests.  The default
value is unlimited.
.UNINDENT
.SS Debug
.INDENT 0.0
.TP
.B \-\-frontend\-http2\-dump\-request\-header=<PATH>
Dumps request headers received by HTTP/2 frontend to the
file denoted  in <PATH>.  The  output is done  in HTTP/1
header field format and each header block is followed by
an empty line.  This option  is not thread safe and MUST
NOT be used with option \fI\%\-n\fP<N>, where <N> >= 2.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http2\-dump\-response\-header=<PATH>
Dumps response headers sent  from HTTP/2 frontend to the
file denoted  in <PATH>.  The  output is done  in HTTP/1
header field format and each header block is followed by
an empty line.  This option  is not thread safe and MUST
NOT be used with option \fI\%\-n\fP<N>, where <N> >= 2.
.UNINDENT
.INDENT 0.0
.TP
.B \-o, \-\-frontend\-frame\-debug
Print HTTP/2 frames in  frontend to stderr.  This option
is  not thread  safe and  MUST NOT  be used  with option
\fI\%\-n\fP=N, where N >= 2.
.UNINDENT
.SS Process
.INDENT 0.0
.TP
.B \-D, \-\-daemon
Run in a background.  If \fI\%\-D\fP is used, the current working
directory is changed to \(aq\fI/\fP\(aq.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-pid\-file=<PATH>
Set path to save PID of this program.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-user=<USER>
Run this program as <USER>.   This option is intended to
be used to drop root privileges.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-single\-process
Run this program in a  single process mode for debugging
purpose.  Without this option,  nghttpx creates at least
2 processes: main and  worker processes.  If this option
is  used, main  and  worker are  unified  into a  single
process.   nghttpx still  spawns  additional process  if
neverbleed  is used.   In the  single process  mode, the
signal handling feature is disabled.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-max\-worker\-processes=<N>
The maximum number of  worker processes.  nghttpx spawns
new worker  process when  it reloads  its configuration.
The previous worker  process enters graceful termination
period and will terminate  when it finishes handling the
existing    connections.     However,    if    reloading
configurations  happen   very  frequently,   the  worker
processes might be piled up if they take a bit long time
to finish  the existing connections.  With  this option,
if  the number  of  worker processes  exceeds the  given
value,   the  oldest   worker   process  is   terminated
immediately.  Specifying 0 means no  limit and it is the
default behaviour.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-worker\-process\-grace\-shutdown\-period=<DURATION>
Maximum  period  for  a   worker  process  to  terminate
gracefully.  When  a worker  process enters  in graceful
shutdown   period  (e.g.,   when  nghttpx   reloads  its
configuration)  and  it  does not  finish  handling  the
existing connections in the given  period of time, it is
immediately terminated.  Specifying 0 means no limit and
it is the default behaviour.
.UNINDENT
.SS Scripting
.INDENT 0.0
.TP
.B \-\-mruby\-file=<PATH>
Set mruby script file
.UNINDENT
.INDENT 0.0
.TP
.B \-\-ignore\-per\-pattern\-mruby\-error
Ignore mruby compile error  for per\-pattern mruby script
file.  If error  occurred, it is treated as  if no mruby
file were specified for the pattern.
.UNINDENT
.SS HTTP/3 and QUIC
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-idle\-timeout=<DURATION>
Specify an idle timeout for QUIC connection.
.sp
Default: \fB30s\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-debug\-log
Output QUIC debug log to \fI/dev/stderr.\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-quic\-bpf\-program\-file=<PATH>
Specify a path to  eBPF program file reuseport_kern.o to
direct  an  incoming  QUIC  UDP datagram  to  a  correct
socket.
.sp
Default: \fB/usr/local/lib/nghttp2/reuseport_kern.o\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-early\-data
Enable early data on frontend QUIC connections.  nghttpx
sends \(dqEarly\-Data\(dq header field to a backend server if a
request is received in early  data and handshake has not
finished.  All backend servers should deal with possibly
replayed requests.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-qlog\-dir=<DIR>
Specify a  directory where  a qlog  file is  written for
frontend QUIC  connections.  A qlog file  is created per
each QUIC  connection.  The  file name is  ISO8601 basic
format, followed by \(dq\-\(dq, server Source Connection ID and
\(dq.sqlog\(dq.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-require\-token
Require an address validation  token for a frontend QUIC
connection.   Server sends  a token  in Retry  packet or
NEW_TOKEN frame in the previous connection.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-congestion\-controller=<CC>
Specify a congestion controller algorithm for a frontend
QUIC  connection.   <CC>  should be  either  \(dqcubic\(dq  or
\(dqbbr\(dq.
.sp
Default: \fBcubic\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-secret\-file=<PATH>
Path to file that contains secure random data to be used
as QUIC keying materials.  It is used to derive keys for
encrypting tokens and Connection IDs.  It is not used to
encrypt  QUIC  packets.  Each  line  of  this file  must
contain  exactly  136  bytes  hex\-encoded  string  (when
decoded the byte string is  68 bytes long).  The first 3
bits of  decoded byte  string are  used to  identify the
keying material.  An  empty line or a  line which starts
\(aq#\(aq  is ignored.   The file  can contain  more than  one
keying materials.  Because the  identifier is 3 bits, at
most 8 keying materials are  read and the remaining data
is discarded.  The first keying  material in the file is
primarily  used for  encryption and  decryption for  new
connection.  The other ones are used to decrypt data for
the  existing connections.   Specifying multiple  keying
materials enables  key rotation.   Please note  that key
rotation  does  not  occur automatically.   User  should
update  files  or  change  options  values  and  restart
nghttpx gracefully.   If opening  or reading  given file
fails, all loaded keying  materials are discarded and it
is treated as if none of  this option is given.  If this
option is not  given or an error  occurred while opening
or  reading  a  file,  a keying  material  is  generated
internally on startup and reload.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-quic\-server\-id=<HEXSTRING>
Specify server  ID encoded in Connection  ID to identify
this  particular  server  instance.   Connection  ID  is
encrypted and  this part is  not visible in  public.  It
must be 4  bytes long and must be encoded  in hex string
(which is 8  bytes long).  If this option  is omitted, a
random   server  ID   is   generated   on  startup   and
configuration reload.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-quic\-initial\-rtt=<DURATION>
Specify the initial RTT of the frontend QUIC connection.
.sp
Default: \fB333ms\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-quic\-bpf
Disable eBPF.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http3\-window\-size=<SIZE>
Sets  the  per\-stream  initial  window  size  of  HTTP/3
frontend connection.
.sp
Default: \fB256K\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http3\-connection\-window\-size=<SIZE>
Sets the  per\-connection window size of  HTTP/3 frontend
connection.
.sp
Default: \fB1M\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http3\-max\-window\-size=<SIZE>
Sets  the  maximum  per\-stream  window  size  of  HTTP/3
frontend connection.  The window  size is adjusted based
on the receiving rate of stream data.  The initial value
is the  value specified  by \fI\%\-\-frontend\-http3\-window\-size\fP
and the window size grows up to <SIZE> bytes.
.sp
Default: \fB6M\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http3\-max\-connection\-window\-size=<SIZE>
Sets the  maximum per\-connection  window size  of HTTP/3
frontend connection.  The window  size is adjusted based
on the receiving rate of stream data.  The initial value
is         the         value        specified         by
\fI\%\-\-frontend\-http3\-connection\-window\-size\fP  and the  window
size grows up to <SIZE> bytes.
.sp
Default: \fB8M\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-frontend\-http3\-max\-concurrent\-streams=<N>
Set the maximum number of  the concurrent streams in one
frontend HTTP/3 connection.
.sp
Default: \fB100\fP
.UNINDENT
.SS Misc
.INDENT 0.0
.TP
.B \-\-conf=<PATH>
Load  configuration  from   <PATH>.   Please  note  that
nghttpx always  tries to read the  default configuration
file if \fI\%\-\-conf\fP is not given.
.sp
Default: \fB/etc/nghttpx/nghttpx.conf\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-include=<PATH>
Load additional configurations from <PATH>.  File <PATH>
is  read  when  configuration  parser  encountered  this
option.  This option can be used multiple times, or even
recursively.
.UNINDENT
.INDENT 0.0
.TP
.B \-v, \-\-version
Print version and exit.
.UNINDENT
.INDENT 0.0
.TP
.B \-h, \-\-help
Print this help and exit.
.UNINDENT
.sp
The <SIZE> argument is an integer and an optional unit (e.g., 10K is
10 * 1024).  Units are K, M and G (powers of 1024).
.sp
The <DURATION> argument is an integer and an optional unit (e.g., 1s
is 1 second and 500ms is 500 milliseconds).  Units are h, m, s or ms
(hours, minutes, seconds and milliseconds, respectively).  If a unit
is omitted, a second is used as unit.
.SH FILES
.INDENT 0.0
.TP
.B \fI/etc/nghttpx/nghttpx.conf\fP
The default configuration file path nghttpx searches at startup.
The configuration file path can be changed using \fI\%\-\-conf\fP
option.
.sp
Those lines which are staring \fB#\fP are treated as comment.
.sp
The option name in the configuration file is the long command\-line
option name with leading \fB\-\-\fP stripped (e.g., \fBfrontend\fP).  Put
\fB=\fP between option name and value.  Don\(aqt put extra leading or
trailing spaces.
.sp
When specifying arguments including characters which have special
meaning to a shell, we usually use quotes so that shell does not
interpret them.  When writing this configuration file, quotes for
this purpose must not be used.  For example, specify additional
request header field, do this:
.INDENT 7.0
.INDENT 3.5
.sp
.EX
add\-request\-header=foo: bar
.EE
.UNINDENT
.UNINDENT
.sp
instead of:
.INDENT 7.0
.INDENT 3.5
.sp
.EX
add\-request\-header=\(dqfoo: bar\(dq
.EE
.UNINDENT
.UNINDENT
.sp
The options which do not take argument in the command\-line \fItake\fP
argument in the configuration file.  Specify \fByes\fP as an argument
(e.g., \fBhttp2\-proxy=yes\fP).  If other string is given, it is
ignored.
.sp
To specify private key and certificate file which are given as
positional arguments in command\-line, use \fBprivate\-key\-file\fP and
\fBcertificate\-file\fP\&.
.sp
\fI\%\-\-conf\fP option cannot be used in the configuration file and
will be ignored if specified.
.TP
.B Error log
Error log is written to stderr by default.  It can be configured
using \fI\%\-\-errorlog\-file\fP\&.  The format of log message is as
follows:
.sp
<datetime> <main\-pid> <current\-pid> <thread\-id> <level> (<filename>:<line>) <msg>
.INDENT 7.0
.TP
.B <datetime>
It is a combination of date and time when the log is written.  It
is in ISO 8601 format.
.TP
.B <main\-pid>
It is a main process ID.
.TP
.B <current\-pid>
It is a process ID which writes this log.
.TP
.B <thread\-id>
It is a thread ID which writes this log.  It would be unique
within <current\-pid>.
.TP
.B <filename> and <line>
They are source file name, and line number which produce this log.
.TP
.B <msg>
It is a log message body.
.UNINDENT
.UNINDENT
.SH SIGNALS
.INDENT 0.0
.TP
.B SIGQUIT
Shutdown gracefully.  First accept pending connections and stop
accepting connection.  After all connections are handled, nghttpx
exits.
.TP
.B SIGHUP
Reload configuration file given in \fI\%\-\-conf\fP\&.
.TP
.B SIGUSR1
Reopen log files.
.UNINDENT
.sp
SIGUSR2
.INDENT 0.0
.INDENT 3.5
Fork and execute nghttpx.  It will execute the binary in the same
path with same command\-line arguments and environment variables.  As
of nghttpx version 1.20.0, the new main process sends SIGQUIT to the
original main process when it is ready to serve requests.  For the
earlier versions of nghttpx, user has to send SIGQUIT to the
original main process.
.sp
The difference between SIGUSR2 (+ SIGQUIT) and SIGHUP is that former
is usually used to execute new binary, and the main process is newly
spawned.  On the other hand, the latter just reloads configuration
file, and the same main process continues to exist.
.UNINDENT
.UNINDENT
.sp
\fBNOTE:\fP
.INDENT 0.0
.INDENT 3.5
nghttpx consists of multiple processes: one process for processing
these signals, and another one for processing requests.  The former
spawns the latter.  The former is called main process, and the
latter is called worker process.  If neverbleed is enabled, the
worker process spawns neverbleed daemon process which does RSA key
processing.  The above signal must be sent to the main process.  If
the other processes received one of them, it is ignored.  This
behaviour of these processes may change in the future release.  In
other words, in the future release, the processes other than main
process may terminate upon the reception of these signals.
Therefore these signals should not be sent to the processes other
than main process.
.UNINDENT
.UNINDENT
.SH SERVER PUSH
.sp
nghttpx supports HTTP/2 server push in default mode with Link header
field.  nghttpx looks for Link header field (\X'tty: link http://tools.ietf.org/html/rfc5988'\fI\%RFC 5988\fP\X'tty: link') in response headers from
backend server and extracts URI\-reference with parameter
\fBrel=preload\fP (see \X'tty: link http://w3c.github.io/preload/#interoperability-with-http-link-header'\fI\%preload\fP\X'tty: link')
and pushes those URIs to the frontend client. Here is a sample Link
header field to initiate server push:
.INDENT 0.0
.INDENT 3.5
.sp
.EX
Link: </fonts/font.woff>; rel=preload
Link: </css/theme.css>; rel=preload
.EE
.UNINDENT
.UNINDENT
.sp
Currently, the following restriction is applied for server push:
.INDENT 0.0
.IP 1. 3
The associated stream must have method \(dqGET\(dq or \(dqPOST\(dq.  The
associated stream\(aqs status code must be 200.
.UNINDENT
.sp
This limitation may be loosened in the future release.
.sp
nghttpx also supports server push if both frontend and backend are
HTTP/2 in default mode.  In this case, in addition to server push via
Link header field, server push from backend is forwarded to frontend
HTTP/2 session.
.sp
HTTP/2 server push will be disabled if \fI\%\-\-http2\-proxy\fP is
used.
.SH UNIX DOMAIN SOCKET
.sp
nghttpx supports UNIX domain socket with a filename for both frontend
and backend connections.
.sp
Please note that current nghttpx implementation does not delete a
socket with a filename.  And on start up, if nghttpx detects that the
specified socket already exists in the file system, nghttpx first
deletes it.  However, if SIGUSR2 is used to execute new binary and
both old and new configurations use same filename, new binary does not
delete the socket and continues to use it.
.SH TLS SESSION RESUMPTION
.sp
nghttpx supports TLS session resumption through both session ID and
session ticket.
.SS SESSION ID RESUMPTION
.sp
By default, session ID is shared by all worker threads.
.SS TLS SESSION TICKET RESUMPTION
.sp
By default, session ticket is shared by all worker threads.  The
automatic key rotation is also enabled by default.  Every an hour, new
encryption key is generated, and previous encryption key becomes
decryption only key.  We set session timeout to 12 hours, and thus we
keep at most 12 keys.
.sp
If \fI\%\-\-tls\-ticket\-key\-memcached\fP is given, encryption keys are
retrieved from memcached.  nghttpx just reads keys from memcached; one
has to deploy key generator program to update keys frequently (e.g.,
every 1 hour).  The example key generator tlsticketupdate.go is
available under contrib directory in nghttp2 archive.  The memcached
entry key is \fBnghttpx:tls\-ticket\-key\fP\&.  The data format stored in
memcached is the binary format described below:
.INDENT 0.0
.INDENT 3.5
.sp
.EX
+\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
| VERSION (4)  |LEN (2)|KEY(48 or 80) ...
+\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
               ^                        |
               |                        |
               +\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
               (LEN, KEY) pair can be repeated
.EE
.UNINDENT
.UNINDENT
.sp
All numbers in the above figure is bytes.  All integer fields are
network byte order.
.sp
First 4 bytes integer VERSION field, which must be 1.  The 2 bytes
integer LEN field gives the length of following KEY field, which
contains key.  If \fI\%\-\-tls\-ticket\-key\-cipher\fP=aes\-128\-cbc is
used, LEN must be 48.  If
\fI\%\-\-tls\-ticket\-key\-cipher\fP=aes\-256\-cbc is used, LEN must be
80.  LEN and KEY pair can be repeated multiple times to store multiple
keys.  The key appeared first is used as encryption key.  All the
remaining keys are used as decryption only.
.sp
By default, connections to memcached server are not encrypted.  To
enable encryption, use \fBtls\fP keyword in
\fI\%\-\-tls\-ticket\-key\-memcached\fP option.
.sp
If \fI\%\-\-tls\-ticket\-key\-file\fP is given, encryption key is read
from the given file.  In this case, nghttpx does not rotate key
automatically.  To rotate key, one has to restart nghttpx (see
SIGNALS).
.SH CERTIFICATE TRANSPARENCY
.sp
nghttpx supports TLS \fBsigned_certificate_timestamp\fP extension (\X'tty: link https://tools.ietf.org/html/rfc6962'\fI\%RFC
6962\fP\X'tty: link').  The relevant options
are \fI\%\-\-tls\-sct\-dir\fP and \fBsct\-dir\fP parameter in
\fI\%\-\-subcert\fP\&.  They takes a directory, and nghttpx reads all
files whose extension is \fB\&.sct\fP under the directory.  The \fB*.sct\fP
files are encoded as \fBSignedCertificateTimestamp\fP struct described
in \X'tty: link https://tools.ietf.org/html/rfc6962#section-3.2'\fI\%section 3.2 of RFC 69662\fP\X'tty: link'\&.  This format is
the same one used by \X'tty: link https://github.com/grahamedgecombe/nginx-ct'\fI\%nginx\-ct\fP\X'tty: link' and \X'tty: link https://httpd.apache.org/docs/trunk/mod/mod_ssl_ct.html'\fI\%mod_ssl_ct\fP\X'tty: link'\&.
\X'tty: link https://github.com/grahamedgecombe/ct-submit'\fI\%ct\-submit\fP\X'tty: link' can be
used to submit certificates to log servers, and obtain the
\fBSignedCertificateTimestamp\fP struct which can be used with nghttpx.
.SH MRUBY SCRIPTING
.sp
\fBWARNING:\fP
.INDENT 0.0
.INDENT 3.5
The current mruby extension API is experimental and not frozen.  The
API is subject to change in the future release.
.UNINDENT
.UNINDENT
.sp
\fBWARNING:\fP
.INDENT 0.0
.INDENT 3.5
Almost all string value returned from method, or attribute is a
fresh new mruby string, which involves memory allocation, and
copies.  Therefore, it is strongly recommended to store a return
value in a local variable, and use it, instead of calling method or
accessing attribute repeatedly.
.UNINDENT
.UNINDENT
.sp
nghttpx allows users to extend its capability using mruby scripts.
nghttpx has 2 hook points to execute mruby script: request phase and
response phase.  The request phase hook is invoked after all request
header fields are received from client.  The response phase hook is
invoked after all response header fields are received from backend
server.  These hooks allows users to modify header fields, or common
HTTP variables, like authority or request path, and even return custom
response without forwarding request to backend servers.
.sp
There are 2 levels of mruby script invocations: global and
per\-pattern.  The global mruby script is set by \fI\%\-\-mruby\-file\fP
option and is called for all requests.  The per\-pattern mruby script
is set by \(dqmruby\(dq parameter in \fI\%\-b\fP option.  It is invoked for
a request which matches the particular pattern.  The order of hook
invocation is: global request phase hook, per\-pattern request phase
hook, per\-pattern response phase hook, and finally global response
phase hook.  If a hook returns a response, any later hooks are not
invoked.  The global request hook is invoked before the pattern
matching is made and changing request path may affect the pattern
matching.
.sp
Please note that request and response hooks of per\-pattern mruby
script for a single request might not come from the same script.  This
might happen after a request hook is executed, backend failed for some
reason, and at the same time, backend configuration is replaced by API
request, and then the request uses new configuration on retry.  The
response hook from new configuration, if it is specified, will be
invoked.
.sp
The all mruby script will be evaluated once per thread on startup, and
it must instantiate object and evaluate it as the return value (e.g.,
\fBApp.new\fP).  This object is called app object.  If app object
defines \fBon_req\fP method, it is called with \fI\%Nghttpx::Env\fP
object on request hook.  Similarly, if app object defines \fBon_resp\fP
method, it is called with \fI\%Nghttpx::Env\fP object on response
hook.  For each method invocation, user can can access
\fI\%Nghttpx::Request\fP and \fI\%Nghttpx::Response\fP objects
via \fI\%Nghttpx::Env#req\fP and \fI\%Nghttpx::Env#resp\fP
respectively.
.INDENT 0.0
.TP
.B Nghttpx::REQUEST_PHASE
Constant to represent request phase.
.UNINDENT
.INDENT 0.0
.TP
.B Nghttpx::RESPONSE_PHASE
Constant to represent response phase.
.UNINDENT
.INDENT 0.0
.TP
.B class Nghttpx::Env
Object to represent current request specific context.
.INDENT 7.0
.TP
.B attribute [R] req
Return \fI\%Request\fP object.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] resp
Return \fI\%Response\fP object.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] ctx
Return Ruby hash object.  It persists until request finishes.
So values set in request phase hook can be retrieved in
response phase hook.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] phase
Return the current phase.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] remote_addr
Return IP address of a remote client.  If connection is made
via UNIX domain socket, this returns the string \(dqlocalhost\(dq.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] server_addr
Return address of server that accepted the connection.  This
is a string which specified in \fI\%\-\-frontend\fP option,
excluding port number, and not a resolved IP address.  For
UNIX domain socket, this is a path to UNIX domain socket.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] server_port
Return port number of the server frontend which accepted the
connection from client.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] tls_used
Return true if TLS is used on the connection.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] tls_sni
Return the TLS SNI value which client sent in this connection.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] tls_client_fingerprint_sha256
Return the SHA\-256 fingerprint of a client certificate.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] tls_client_fingerprint_sha1
Return the SHA\-1 fingerprint of a client certificate.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] tls_client_issuer_name
Return the issuer name of a client certificate.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] tls_client_subject_name
Return the subject name of a client certificate.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] tls_client_serial
Return the serial number of a client certificate.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] tls_client_not_before
Return the start date of a client certificate in seconds since
the epoch.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] tls_client_not_after
Return the end date of a client certificate in seconds since
the epoch.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] tls_cipher
Return a TLS cipher negotiated in this connection.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] tls_protocol
Return a TLS protocol version negotiated in this connection.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] tls_session_id
Return a session ID for this connection in hex string.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] tls_session_reused
Return true if, and only if a SSL/TLS session is reused.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] alpn
Return ALPN identifier negotiated in this connection.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] tls_handshake_finished
Return true if SSL/TLS handshake has finished.  If it returns
false in the request phase hook, the request is received in
TLSv1.3 early data (0\-RTT) and might be vulnerable to the
replay attack.  nghttpx will send Early\-Data header field to
backend servers to indicate this.
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B class Nghttpx::Request
Object to represent request from client.  The modification to
Request object is allowed only in request phase hook.
.INDENT 7.0
.TP
.B attribute [R] http_version_major
Return HTTP major version.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] http_version_minor
Return HTTP minor version.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R/W] method
HTTP method.  On assignment, copy of given value is assigned.
We don\(aqt accept arbitrary method name.  We will document them
later, but well known methods, like GET, PUT and POST, are all
supported.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R/W] authority
Authority (i.e., example.org), including optional port
component .  On assignment, copy of given value is assigned.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R/W] scheme
Scheme (i.e., http, https).  On assignment, copy of given
value is assigned.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R/W] path
Request path, including query component (i.e., /index.html).
On assignment, copy of given value is assigned.  The path does
not include authority component of URI.  This may include
query component.  nghttpx makes certain normalization for
path.  It decodes percent\-encoding for unreserved characters
(see \X'tty: link https://tools.ietf.org/html/rfc3986#section-2.3'\fI\%https://tools.ietf.org/html/rfc3986#section\-2.3\fP\X'tty: link'), and
resolves \(dq..\(dq and \(dq.\(dq.  But it may leave characters which
should be percent\-encoded as is. So be careful when comparing
path against desired string.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] headers
Return Ruby hash containing copy of request header fields.
Changing values in returned hash does not change request
header fields actually used in request processing.  Use
\fI\%Nghttpx::Request#add_header\fP or
\fI\%Nghttpx::Request#set_header\fP to change request
header fields.
.UNINDENT
.INDENT 7.0
.TP
.B add_header(key, value)
Add header entry associated with key.  The value can be single
string or array of string.  It does not replace any existing
values associated with key.
.UNINDENT
.INDENT 7.0
.TP
.B set_header(key, value)
Set header entry associated with key.  The value can be single
string or array of string.  It replaces any existing values
associated with key.
.UNINDENT
.INDENT 7.0
.TP
.B clear_headers()
Clear all existing request header fields.
.UNINDENT
.INDENT 7.0
.TP
.B push(uri)
Initiate to push resource identified by \fIuri\fP\&.  Only HTTP/2
protocol supports this feature.  For the other protocols, this
method is noop.  \fIuri\fP can be absolute URI, absolute path or
relative path to the current request.  For absolute or
relative path, scheme and authority are inherited from the
current request.  Currently, method is always GET.  nghttpx
will issue request to backend servers to fulfill this request.
The request and response phase hooks will be called for pushed
resource as well.
.UNINDENT
.UNINDENT
.INDENT 0.0
.TP
.B class Nghttpx::Response
Object to represent response from backend server.
.INDENT 7.0
.TP
.B attribute [R] http_version_major
Return HTTP major version.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] http_version_minor
Return HTTP minor version.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R/W] status
HTTP status code.  It must be in the range [200, 999],
inclusive.  The non\-final status code is not supported in
mruby scripting at the moment.
.UNINDENT
.INDENT 7.0
.TP
.B attribute [R] headers
Return Ruby hash containing copy of response header fields.
Changing values in returned hash does not change response
header fields actually used in response processing.  Use
\fI\%Nghttpx::Response#add_header\fP or
\fI\%Nghttpx::Response#set_header\fP to change response
header fields.
.UNINDENT
.INDENT 7.0
.TP
.B add_header(key, value)
Add header entry associated with key.  The value can be single
string or array of string.  It does not replace any existing
values associated with key.
.UNINDENT
.INDENT 7.0
.TP
.B set_header(key, value)
Set header entry associated with key.  The value can be single
string or array of string.  It replaces any existing values
associated with key.
.UNINDENT
.INDENT 7.0
.TP
.B clear_headers()
Clear all existing response header fields.
.UNINDENT
.INDENT 7.0
.TP
.B return(body)
Return custom response \fIbody\fP to a client.  When this method
is called in request phase hook, the request is not forwarded
to the backend, and response phase hook for this request will
not be invoked.  When this method is called in response phase
hook, response from backend server is canceled and discarded.
The status code and response header fields should be set
before using this method.  To set status code, use
\fI\%Nghttpx::Response#status\fP\&.  If status code is not
set, 200 is used.  To set response header fields,
\fI\%Nghttpx::Response#add_header\fP and
\fI\%Nghttpx::Response#set_header\fP\&.  When this method is
invoked in response phase hook, the response headers are
filled with the ones received from backend server.  To send
completely custom header fields, first call
\fI\%Nghttpx::Response#clear_headers\fP to erase all
existing header fields, and then add required header fields.
It is an error to call this method twice for a given request.
.UNINDENT
.INDENT 7.0
.TP
.B send_info(status, headers)
Send non\-final (informational) response to a client.  \fIstatus\fP
must be in the range [100, 199], inclusive.  \fIheaders\fP is a
hash containing response header fields.  Its key must be a
string, and the associated value must be either string or
array of strings.  Since this is not a final response, even if
this method is invoked, request is still forwarded to a
backend unless \fI\%Nghttpx::Response#return\fP is called.
This method can be called multiple times.  It cannot be called
after \fI\%Nghttpx::Response#return\fP is called.
.UNINDENT
.UNINDENT
.SS MRUBY EXAMPLES
.sp
Modify request path:
.INDENT 0.0
.INDENT 3.5
.sp
.EX
class App
  def on_req(env)
    env.req.path = \(dq/apps#{env.req.path}\(dq
  end
end

App.new
.EE
.UNINDENT
.UNINDENT
.sp
Don\(aqt forget to instantiate and evaluate object at the last line.
.sp
Restrict permission of viewing a content to a specific client
addresses:
.INDENT 0.0
.INDENT 3.5
.sp
.EX
class App
  def on_req(env)
    allowed_clients = [\(dq127.0.0.1\(dq, \(dq::1\(dq]

    if env.req.path.start_with?(\(dq/log/\(dq) &&
       !allowed_clients.include?(env.remote_addr) then
      env.resp.status = 404
      env.resp.return \(dqpermission denied\(dq
    end
  end
end

App.new
.EE
.UNINDENT
.UNINDENT
.SH API ENDPOINTS
.sp
nghttpx exposes API endpoints to manipulate it via HTTP based API.  By
default, API endpoint is disabled.  To enable it, add a dedicated
frontend for API using \fI\%\-\-frontend\fP option with \(dqapi\(dq
parameter.  All requests which come from this frontend address, will
be treated as API request.
.sp
The response is normally JSON dictionary, and at least includes the
following keys:
.INDENT 0.0
.TP
.B status
The status of the request processing.  The following values are
defined:
.INDENT 7.0
.TP
.B Success
The request was successful.
.TP
.B Failure
The request was failed.  No change has been made.
.UNINDENT
.TP
.B code
HTTP status code
.UNINDENT
.sp
Additionally, depending on the API endpoint, \fBdata\fP key may be
present, and its value contains the API endpoint specific data.
.sp
We wrote \(dqnormally\(dq, since nghttpx may return ordinal HTML response in
some cases where the error has occurred before reaching API endpoint
(e.g., header field is too large).
.sp
The following section describes available API endpoints.
.SS POST /api/v1beta1/backendconfig
.sp
This API replaces the current backend server settings with the
requested ones.  The request method should be POST, but PUT is also
acceptable.  The request body must be nghttpx configuration file
format.  For configuration file format, see \fI\%FILES\fP section.  The
line separator inside the request body must be single LF (0x0A).
Currently, only \fI\%backend\fP option is parsed, the
others are simply ignored.  The semantics of this API is replace the
current backend with the backend options in request body.  Describe
the desired set of backend severs, and nghttpx makes it happen.  If
there is no \fI\%backend\fP option is found in request
body, the current set of backend is replaced with the \fI\%backend\fP option\(aqs default value, which is \fB127.0.0.1,80\fP\&.
.sp
The replacement is done instantly without breaking existing
connections or requests.  It also avoids any process creation as is
the case with hot swapping with signals.
.sp
The one limitation is that only numeric IP address is allowed in
\fI\%backend\fP in request body unless \(dqdns\(dq parameter
is used while non numeric hostname is allowed in command\-line or
configuration file is read using \fI\%\-\-conf\fP\&.
.SS GET /api/v1beta1/configrevision
.sp
This API returns configuration revision of the current nghttpx.  The
configuration revision is opaque string, and it changes after each
reloading by SIGHUP.  With this API, an external application knows
that whether nghttpx has finished reloading its configuration by
comparing the configuration revisions between before and after
reloading.  It is recommended to disable persistent (keep\-alive)
connection for this purpose in order to avoid to send a request using
the reused connection which may bound to an old process.
.sp
This API returns response including \fBdata\fP key.  Its value is JSON
object, and it contains at least the following key:
.INDENT 0.0
.TP
.B configRevision
The configuration revision of the current nghttpx
.UNINDENT
.SH SEE ALSO
.sp
\fBnghttp(1)\fP, \fBnghttpd(1)\fP, \fBh2load(1)\fP
.SH AUTHOR
Tatsuhiro Tsujikawa
.SH COPYRIGHT
2012, 2015, 2016, Tatsuhiro Tsujikawa
.\" Generated by docutils manpage writer.
.
PK% %[)Z'c�=�=man/man1/h2load.1nu�[���.\" Man page generated from reStructuredText.
.
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.TH "H2LOAD" "1" "Jun 17, 2025" "1.66.0" "nghttp2"
.SH NAME
h2load \- HTTP/2 benchmarking tool
.SH SYNOPSIS
.sp
\fBh2load\fP [OPTIONS]... [URI]...
.SH DESCRIPTION
.sp
benchmarking tool for HTTP/2 server
.INDENT 0.0
.TP
.B <URI>
Specify URI to access.   Multiple URIs can be specified.
URIs are used  in this order for each  client.  All URIs
are used, then  first URI is used and then  2nd URI, and
so  on.  The  scheme, host  and port  in the  subsequent
URIs, if present,  are ignored.  Those in  the first URI
are used solely.  Definition of a base URI overrides all
scheme, host or port values.
.UNINDENT
.SH OPTIONS
.INDENT 0.0
.TP
.B \-n, \-\-requests=<N>
Number of  requests across all  clients.  If it  is used
with \fI\%\-\-timing\-script\-file\fP option,  this option specifies
the number of requests  each client performs rather than
the number of requests  across all clients.  This option
is ignored if timing\-based  benchmarking is enabled (see
\fI\%\-\-duration\fP option).
.sp
Default: \fB1\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-c, \-\-clients=<N>
Number  of concurrent  clients.   With  \fI\%\-r\fP option,  this
specifies the maximum number of connections to be made.
.sp
Default: \fB1\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-t, \-\-threads=<N>
Number of native threads.
.sp
Default: \fB1\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-i, \-\-input\-file=<PATH>
Path of a file with multiple URIs are separated by EOLs.
This option will disable URIs getting from command\-line.
If \(aq\-\(aq is given as <PATH>, URIs will be read from stdin.
URIs are used  in this order for each  client.  All URIs
are used, then  first URI is used and then  2nd URI, and
so  on.  The  scheme, host  and port  in the  subsequent
URIs, if present,  are ignored.  Those in  the first URI
are used solely.  Definition of a base URI overrides all
scheme, host or port values.
.UNINDENT
.INDENT 0.0
.TP
.B \-m, \-\-max\-concurrent\-streams=<N>
Max  concurrent  streams  to issue  per  session.   When
http/1.1  is used,  this  specifies the  number of  HTTP
pipelining requests in\-flight.
.sp
Default: \fB1\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-f, \-\-max\-frame\-size=<SIZE>
Maximum frame size that the local endpoint is willing to
receive.
.sp
Default: \fB16K\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-w, \-\-window\-bits=<N>
Sets the stream level initial window size to (2**<N>)\-1.
For QUIC, <N> is capped to 26 (roughly 64MiB).
.sp
Default: \fB30\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-W, \-\-connection\-window\-bits=<N>
Sets  the  connection  level   initial  window  size  to
(2**<N>)\-1.
.sp
Default: \fB30\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-H, \-\-header=<HEADER>
Add/Override a header to the requests.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-ciphers=<SUITE>
Set  allowed cipher  list  for TLSv1.2  or earlier.   The
format of the string is described in OpenSSL ciphers(1).
.sp
Default: \fBECDHE\-ECDSA\-AES128\-GCM\-SHA256:ECDHE\-RSA\-AES128\-GCM\-SHA256:ECDHE\-ECDSA\-AES256\-GCM\-SHA384:ECDHE\-RSA\-AES256\-GCM\-SHA384:ECDHE\-ECDSA\-CHACHA20\-POLY1305:ECDHE\-RSA\-CHACHA20\-POLY1305:DHE\-RSA\-AES128\-GCM\-SHA256:DHE\-RSA\-AES256\-GCM\-SHA384\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-tls13\-ciphers=<SUITE>
Set allowed cipher list for  TLSv1.3.  The format of the
string is described in OpenSSL ciphers(1).
.sp
Default: \fBTLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_CCM_SHA256\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-p, \-\-no\-tls\-proto=<PROTOID>
Specify ALPN identifier of the  protocol to be used when
accessing http URI without SSL/TLS.
Available protocols: h2c and http/1.1
.sp
Default: \fBh2c\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-d, \-\-data=<PATH>
Post FILE to  server.  The request method  is changed to
POST.   For  http/1.1 connection,  if  \fI\%\-d\fP  is used,  the
maximum number of in\-flight pipelined requests is set to
1.
.UNINDENT
.INDENT 0.0
.TP
.B \-r, \-\-rate=<N>
Specifies  the  fixed  rate  at  which  connections  are
created.   The   rate  must   be  a   positive  integer,
representing the  number of  connections to be  made per
rate period.   The maximum  number of connections  to be
made  is  given  in  \fI\%\-c\fP   option.   This  rate  will  be
distributed among  threads as  evenly as  possible.  For
example,  with   \fI\%\-t\fP2  and   \fI\%\-r\fP4,  each  thread   gets  2
connections per period.  When the rate is 0, the program
will run  as it  normally does, creating  connections at
whatever variable rate it  wants.  The default value for
this option is 0.  \fI\%\-r\fP and \fI\%\-D\fP are mutually exclusive.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-rate\-period=<DURATION>
Specifies the time  period between creating connections.
The period  must be a positive  number, representing the
length of the period in time.  This option is ignored if
the rate option is not used.  The default value for this
option is 1s.
.UNINDENT
.INDENT 0.0
.TP
.B \-D, \-\-duration=<DURATION>
Specifies the main duration for the measurements in case
of timing\-based  benchmarking.  \fI\%\-D\fP  and \fI\%\-r\fP  are mutually
exclusive.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-warm\-up\-time=<DURATION>
Specifies the  time  period  before  starting the actual
measurements, in  case  of  timing\-based benchmarking.
Needs to provided along with \fI\%\-D\fP option.
.UNINDENT
.INDENT 0.0
.TP
.B \-T, \-\-connection\-active\-timeout=<DURATION>
Specifies  the maximum  time that  h2load is  willing to
keep a  connection open,  regardless of the  activity on
said connection.  <DURATION> must be a positive integer,
specifying the amount of time  to wait.  When no timeout
value is  set (either  active or inactive),  h2load will
keep  a  connection  open indefinitely,  waiting  for  a
response.
.UNINDENT
.INDENT 0.0
.TP
.B \-N, \-\-connection\-inactivity\-timeout=<DURATION>
Specifies the amount  of time that h2load  is willing to
wait to see activity  on a given connection.  <DURATION>
must  be a  positive integer,  specifying the  amount of
time  to wait.   When no  timeout value  is set  (either
active or inactive), h2load  will keep a connection open
indefinitely, waiting for a response.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-timing\-script\-file=<PATH>
Path of a file containing one or more lines separated by
EOLs.  Each script line is composed of two tab\-separated
fields.  The first field represents the time offset from
the start of execution, expressed as a positive value of
milliseconds  with microsecond  resolution.  The  second
field represents the URI.  This option will disable URIs
getting from  command\-line.  If \(aq\-\(aq is  given as <PATH>,
script lines will be read  from stdin.  Script lines are
used in order for each client.   If \fI\%\-n\fP is given, it must
be less  than or  equal to the  number of  script lines,
larger values are clamped to the number of script lines.
If \fI\%\-n\fP is not given,  the number of requests will default
to the  number of  script lines.   The scheme,  host and
port defined in  the first URI are  used solely.  Values
contained  in  other  URIs,  if  present,  are  ignored.
Definition of a  base URI overrides all  scheme, host or
port   values.   \fI\%\-\-timing\-script\-file\fP   and  \fI\%\-\-rps\fP   are
mutually exclusive.
.UNINDENT
.INDENT 0.0
.TP
.B \-B, \-\-base\-uri=(<URI>|unix:<PATH>)
Specify URI from which the scheme, host and port will be
used  for  all requests.   The  base  URI overrides  all
values  defined either  at  the command  line or  inside
input files.  If argument  starts with \(dqunix:\(dq, then the
rest  of the  argument will  be treated  as UNIX  domain
socket path.   The connection is made  through that path
instead of TCP.   In this case, scheme  is inferred from
the first  URI appeared  in the  command line  or inside
input files as usual.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-alpn\-list=<LIST>
Comma delimited list of  ALPN protocol identifier sorted
in the  order of preference.  That  means most desirable
protocol comes  first.  The parameter must  be delimited
by a single comma only  and any white spaces are treated
as a part of protocol string.
.sp
Default: \fBh2,http/1.1\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-h1
Short        hand        for        \fI\%\-\-alpn\-list\fP=http/1.1
\fI\%\-\-no\-tls\-proto\fP=http/1.1,    which   effectively    force
http/1.1 for both http and https URI.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-header\-table\-size=<SIZE>
Specify decoder header table size.
.sp
Default: \fB4K\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-encoder\-header\-table\-size=<SIZE>
Specify encoder header table size.  The decoder (server)
specifies  the maximum  dynamic table  size it  accepts.
Then the negotiated dynamic table size is the minimum of
this option value and the value which server specified.
.sp
Default: \fB4K\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-log\-file=<PATH>
Write per\-request information to a file as tab\-separated
columns: start  time as  microseconds since  epoch; HTTP
status code;  microseconds until end of  response.  More
columns may be added later.  Rows are ordered by end\-of\-
response  time when  using  one worker  thread, but  may
appear slightly  out of order with  multiple threads due
to buffering.  Status code is \-1 for failed streams.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-qlog\-file\-base=<PATH>
Enable qlog output and specify base file name for qlogs.
Qlog is emitted  for each connection.  For  a given base
name   \(dqbase\(dq,    each   output   file    name   becomes
\(dqbase.M.N.sqlog\(dq where M is worker ID and N is client ID
(e.g. \(dqbase.0.3.sqlog\(dq).  Only effective in QUIC runs.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-connect\-to=<HOST>[:<PORT>]
Host and port to connect  instead of using the authority
in <URI>.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-rps=<N>
Specify request  per second for each  client.  \fI\%\-\-rps\fP and
\fI\%\-\-timing\-script\-file\fP are mutually exclusive.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-groups=<GROUPS>
Specify the supported groups.
.sp
Default: \fBX25519:P\-256:P\-384:P\-521\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-udp\-gso
Disable UDP GSO.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-max\-udp\-payload\-size=<SIZE>
Specify the maximum outgoing UDP datagram payload size.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-ktls
Enable ktls.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-sni=<DNSNAME>
Send  <DNSNAME> in  TLS  SNI, overriding  the host  name
specified in URI.
.UNINDENT
.INDENT 0.0
.TP
.B \-v, \-\-verbose
Output debug information.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-version
Display version information and exit.
.UNINDENT
.INDENT 0.0
.TP
.B \-h, \-\-help
Display this help and exit.
.UNINDENT
.sp
The <SIZE> argument is an integer and an optional unit (e.g., 10K is
10 * 1024).  Units are K, M and G (powers of 1024).
.sp
The <DURATION> argument is an integer and an optional unit (e.g., 1s
is 1 second and 500ms is 500 milliseconds).  Units are h, m, s or ms
(hours, minutes, seconds and milliseconds, respectively).  If a unit
is omitted, a second is used as unit.
.SH OUTPUT
.INDENT 0.0
.TP
.B requests
.INDENT 7.0
.TP
.B total
The number of requests h2load was instructed to make.
.TP
.B started
The number of requests h2load has started.
.TP
.B done
The number of requests completed.
.TP
.B succeeded
The number of requests completed successfully.  Only HTTP status
code 2xx or3xx are considered as success.
.TP
.B failed
The number of requests failed, including HTTP level failures
(non\-successful HTTP status code).
.TP
.B errored
The number of requests failed, except for HTTP level failures.
This is the subset of the number reported in \fBfailed\fP and most
likely the network level failures or stream was reset by
RST_STREAM.
.TP
.B timeout
The number of requests whose connection timed out before they were
completed.   This  is  the  subset   of  the  number  reported  in
\fBerrored\fP\&.
.UNINDENT
.TP
.B status codes
The number of status code h2load received.
.TP
.B traffic
.INDENT 7.0
.TP
.B total
The number of bytes received from the server \(dqon the wire\(dq.  If
requests were made via TLS, this value is the number of decrypted
bytes.
.TP
.B headers
The  number  of response  header  bytes  from the  server  without
decompression.  The  \fBspace savings\fP shows efficiency  of header
compression.  Let \fBdecompressed(headers)\fP to the number of bytes
used for header fields after decompression.  The \fBspace savings\fP
is calculated  by (1 \- \fBheaders\fP  / \fBdecompressed(headers)\fP) *
100.  For HTTP/1.1, this is usually  0.00%, since it does not have
header compression.  For HTTP/2, it shows some insightful numbers.
.TP
.B data
The number of response body bytes received from the server.
.UNINDENT
.TP
.B time for request
.INDENT 7.0
.TP
.B min
The minimum time taken for request and response.
.TP
.B max
The maximum time taken for request and response.
.TP
.B mean
The mean time taken for request and response.
.TP
.B sd
The standard deviation of the time taken for request and response.
.TP
.B +/\- sd
The fraction of the number of requests within standard deviation
range (mean +/\- sd) against total number of successful requests.
.UNINDENT
.TP
.B time for connect
.INDENT 7.0
.TP
.B min
The minimum time taken to connect to a server including TLS
handshake.
.TP
.B max
The maximum time taken to connect to a server including TLS
handshake.
.TP
.B mean
The mean time taken to connect to a server including TLS
handshake.
.TP
.B sd
The standard deviation of the time taken to connect to a server.
.TP
.B +/\- sd
The  fraction  of  the   number  of  connections  within  standard
deviation range (mean  +/\- sd) against total  number of successful
connections.
.UNINDENT
.TP
.B time for 1st byte (of (decrypted in case of TLS) application data)
.INDENT 7.0
.TP
.B min
The minimum time taken to get 1st byte from a server.
.TP
.B max
The maximum time taken to get 1st byte from a server.
.TP
.B mean
The mean time taken to get 1st byte from a server.
.TP
.B sd
The standard deviation of the time taken to get 1st byte from a
server.
.TP
.B +/\- sd
The fraction of the number of connections within standard
deviation range (mean +/\- sd) against total number of successful
connections.
.UNINDENT
.TP
.B req/s
.INDENT 7.0
.TP
.B min
The minimum request per second among all clients.
.TP
.B max
The maximum request per second among all clients.
.TP
.B mean
The mean request per second among all clients.
.TP
.B sd
The standard deviation of request per second among all clients.
server.
.TP
.B +/\- sd
The fraction of the number of connections within standard
deviation range (mean +/\- sd) against total number of successful
connections.
.UNINDENT
.UNINDENT
.SH FLOW CONTROL
.sp
h2load sets large flow control window by default, and effectively
disables flow control to avoid under utilization of server
performance.  To set smaller flow control window, use \fI\%\-w\fP and
\fI\%\-W\fP options.  For example, use \fB\-w16 \-W16\fP to set default
window size described in HTTP/2 protocol specification.
.SH SEE ALSO
.sp
\fBnghttp(1)\fP, \fBnghttpd(1)\fP, \fBnghttpx(1)\fP
.SH AUTHOR
Tatsuhiro Tsujikawa
.SH COPYRIGHT
2012, 2015, 2016, Tatsuhiro Tsujikawa
.\" Generated by docutils manpage writer.
.
PK% %[�c�IIman/man1/nghttpd.1nu�[���.\" Man page generated from reStructuredText.
.
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.TH "NGHTTPD" "1" "Jun 17, 2025" "1.66.0" "nghttp2"
.SH NAME
nghttpd \- HTTP/2 server
.SH SYNOPSIS
.sp
\fBnghttpd\fP [OPTION]... <PORT> [<PRIVATE_KEY> <CERT>]
.SH DESCRIPTION
.sp
HTTP/2 server
.INDENT 0.0
.TP
.B <PORT>
Specify listening port number.
.UNINDENT
.INDENT 0.0
.TP
.B <PRIVATE_KEY>
Set  path  to  server\(aqs private  key.   Required  unless
\fI\%\-\-no\-tls\fP is specified.
.UNINDENT
.INDENT 0.0
.TP
.B <CERT>
Set  path  to  server\(aqs  certificate.   Required  unless
\fI\%\-\-no\-tls\fP is specified.
.UNINDENT
.SH OPTIONS
.INDENT 0.0
.TP
.B \-a, \-\-address=<ADDR>
The address to bind to.  If not specified the default IP
address determined by getaddrinfo is used.
.UNINDENT
.INDENT 0.0
.TP
.B \-D, \-\-daemon
Run in a background.  If \fI\%\-D\fP is used, the current working
directory is  changed to \(aq\fI/\fP\(aq.  Therefore  if this option
is used, \fI\%\-d\fP option must be specified.
.UNINDENT
.INDENT 0.0
.TP
.B \-V, \-\-verify\-client
The server  sends a client certificate  request.  If the
client did  not return  a certificate, the  handshake is
terminated.   Currently,  this  option just  requests  a
client certificate and does not verify it.
.UNINDENT
.INDENT 0.0
.TP
.B \-d, \-\-htdocs=<PATH>
Specify document root.  If this option is not specified,
the document root is the current working directory.
.UNINDENT
.INDENT 0.0
.TP
.B \-v, \-\-verbose
Print debug information  such as reception/ transmission
of frames and name/value pairs.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-tls
Disable SSL/TLS.
.UNINDENT
.INDENT 0.0
.TP
.B \-c, \-\-header\-table\-size=<SIZE>
Specify decoder header table size.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-encoder\-header\-table\-size=<SIZE>
Specify encoder header table size.  The decoder (client)
specifies  the maximum  dynamic table  size it  accepts.
Then the negotiated dynamic table size is the minimum of
this option value and the value which client specified.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-color
Force colored log output.
.UNINDENT
.INDENT 0.0
.TP
.B \-p, \-\-push=<PATH>=<PUSH_PATH,...>
Push  resources <PUSH_PATH>s  when <PATH>  is requested.
This option  can be used repeatedly  to specify multiple
push  configurations.    <PATH>  and   <PUSH_PATH>s  are
relative  to   document  root.   See   \fI\%\-\-htdocs\fP  option.
Example: \fI\%\-p\fP/=/foo.png \fI\%\-p\fP/doc=/bar.css
.UNINDENT
.INDENT 0.0
.TP
.B \-b, \-\-padding=<N>
Add at  most <N>  bytes to a  frame payload  as padding.
Specify 0 to disable padding.
.UNINDENT
.INDENT 0.0
.TP
.B \-m, \-\-max\-concurrent\-streams=<N>
Set the maximum number of  the concurrent streams in one
HTTP/2 session.
.sp
Default: \fB100\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-n, \-\-workers=<N>
Set the number of worker threads.
.sp
Default: \fB1\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-e, \-\-error\-gzip
Make error response gzipped.
.UNINDENT
.INDENT 0.0
.TP
.B \-w, \-\-window\-bits=<N>
Sets the stream level initial window size to 2**<N>\-1.
.UNINDENT
.INDENT 0.0
.TP
.B \-W, \-\-connection\-window\-bits=<N>
Sets  the  connection  level   initial  window  size  to
2**<N>\-1.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-dh\-param\-file=<PATH>
Path to file that contains  DH parameters in PEM format.
Without  this   option,  DHE   cipher  suites   are  not
available.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-early\-response
Start sending response when request HEADERS is received,
rather than complete request is received.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-trailer=<HEADER>
Add a trailer  header to a response.   <HEADER> must not
include pseudo header field  (header field name starting
with \(aq:\(aq).  The  trailer is sent only if  a response has
body part.  Example: \fI\%\-\-trailer\fP \(aqfoo: bar\(aq.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-hexdump
Display the  incoming traffic in  hexadecimal (Canonical
hex+ASCII display).  If SSL/TLS  is used, decrypted data
are used.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-echo\-upload
Send back uploaded content if method is POST or PUT.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-mime\-types\-file=<PATH>
Path  to file  that contains  MIME media  types and  the
extensions that represent them.
.sp
Default: \fB/etc/mime.types\fP
.UNINDENT
.INDENT 0.0
.TP
.B \-\-no\-content\-length
Don\(aqt send content\-length header field.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-ktls
Enable ktls.
.UNINDENT
.INDENT 0.0
.TP
.B \-\-version
Display version information and exit.
.UNINDENT
.INDENT 0.0
.TP
.B \-h, \-\-help
Display this help and exit.
.UNINDENT
.sp
The <SIZE> argument is an integer and an optional unit (e.g., 10K is
10 * 1024).  Units are K, M and G (powers of 1024).
.SH SEE ALSO
.sp
\fBnghttp(1)\fP, \fBnghttpx(1)\fP, \fBh2load(1)\fP
.SH AUTHOR
Tatsuhiro Tsujikawa
.SH COPYRIGHT
2012, 2015, 2016, Tatsuhiro Tsujikawa
.\" Generated by docutils manpage writer.
.
PK% %[�������doc/nghttp2/README.rstnu�[���nghttp2 - HTTP/2 C Library
==========================

This is an implementation of the Hypertext Transfer Protocol version 2
in C.

The framing layer of HTTP/2 is implemented as a reusable C library.
On top of that, we have implemented an HTTP/2 client, server and
proxy.  We have also developed load test and benchmarking tools for
HTTP/2.

An HPACK encoder and decoder are available as a public API.

Development Status
------------------

nghttp2 was originally developed based on `RFC 7540
<https://tools.ietf.org/html/rfc7540>`_ HTTP/2 and `RFC 7541
<https://tools.ietf.org/html/rfc7541>`_ HPACK - Header Compression for
HTTP/2.  Now we are updating our code to implement `RFC 9113
<https://datatracker.ietf.org/doc/html/rfc9113>`_.

The nghttp2 code base was forked from the spdylay
(https://github.com/tatsuhiro-t/spdylay) project.

Public Test Server
------------------

The following endpoints are available to try out our nghttp2
implementation.

* https://nghttp2.org/ (TLS + ALPN and HTTP/3)

  This endpoint supports ``h2`` and ``http/1.1`` via ALPN and requires
  TLSv1.2 for HTTP/2 connection.

  It also supports HTTP/3.

* http://nghttp2.org/ (HTTP Upgrade and HTTP/2 Direct)

  ``h2c`` and ``http/1.1``.

Requirements
------------

The following package is required to build the libnghttp2 library:

* pkg-config >= 0.20

To build the documentation, you need to install:

* sphinx (http://sphinx-doc.org/)

If you need libnghttp2 (C library) only, then the above packages are
all you need.  Use ``--enable-lib-only`` to ensure that only
libnghttp2 is built.  This avoids potential build error related to
building bundled applications.

To build and run the application programs (``nghttp``, ``nghttpd``,
``nghttpx`` and ``h2load``) in the ``src`` directory, the following packages
are required:

* OpenSSL >= 1.1.1; or wolfSSL >= 5.7.0; or LibreSSL >= 3.8.1; or
  aws-lc >= 1.19.0; or BoringSSL
* libev >= 4.11
* zlib >= 1.2.3
* libc-ares >= 1.7.5

To enable ``-a`` option (getting linked assets from the downloaded
resource) in ``nghttp``, the following package is required:

* libxml2 >= 2.6.26

To enable systemd support in nghttpx, the following package is
required:

* libsystemd-dev >= 209

The HPACK tools require the following package:

* jansson >= 2.5

To build sources under the examples directory, libevent is required:

* libevent-openssl >= 2.0.8

To mitigate heap fragmentation in long running server programs
(``nghttpd`` and ``nghttpx``), jemalloc is recommended:

* jemalloc

  .. note::

     Alpine Linux currently does not support malloc replacement
     due to musl limitations. See details in issue `#762 <https://github.com/nghttp2/nghttp2/issues/762>`_.

For BoringSSL or aws-lc build, to enable :rfc:`8879` TLS Certificate
Compression in applications, the following library is required:

* libbrotli-dev >= 1.0.9

To enable mruby support for nghttpx, `mruby
<https://github.com/mruby/mruby>`_ is required.  We need to build
mruby with C++ ABI explicitly turned on, and probably need other
mrgems, mruby is managed by git submodule under third-party/mruby
directory.  Currently, mruby support for nghttpx is disabled by
default.  To enable mruby support, use ``--with-mruby`` configure
option.  Note that at the time of this writing, libmruby-dev and mruby
packages in Debian/Ubuntu are not usable for nghttp2, since they do
not enable C++ ABI.  To build mruby, the following packages are
required:

* ruby
* bison

nghttpx supports `neverbleed <https://github.com/h2o/neverbleed>`_,
privilege separation engine for OpenSSL.  In short, it minimizes the
risk of private key leakage when serious bug like Heartbleed is
exploited.  The neverbleed is disabled by default.  To enable it, use
``--with-neverbleed`` configure option.

To enable the experimental HTTP/3 support for h2load and nghttpx, the
following libraries are required:

* `quictls
  <https://github.com/quictls/openssl/tree/OpenSSL_1_1_1w+quic>`_; or
  wolfSSL; or LibreSSL (does not support 0RTT); or aws-lc; or
  `BoringSSL <https://boringssl.googlesource.com/boringssl/>`_ (commit
  9295969e1dad2c31d0d99481734c1c68dcbc6403); or OpenSSL >= 3.5.0
* `ngtcp2 <https://github.com/ngtcp2/ngtcp2>`_ >= 1.12.0
* `nghttp3 <https://github.com/ngtcp2/nghttp3>`_ >= 1.1.0

Use ``--enable-http3`` configure option to enable HTTP/3 feature for
h2load and nghttpx.

In order to build optional eBPF program to direct an incoming QUIC UDP
datagram to a correct socket for nghttpx, the following libraries are
required:

* libbpf-dev >= 0.7.0

Use ``--with-libbpf`` configure option to build eBPF program.
libelf-dev is needed to build libbpf.

For Ubuntu 20.04, you can build libbpf from `the source code
<https://github.com/libbpf/libbpf/releases>`_.  nghttpx requires eBPF
program for reloading its configuration and hot swapping its
executable.

Compiling libnghttp2 C source code requires a C99 compiler.  gcc 4.8
is known to be adequate.  In order to compile the C++ source code,
C++20 compliant compiler is required.  At least g++ >= 12 and
clang++ >= 18 are known to work.

.. note::

   To enable mruby support in nghttpx, and use ``--with-mruby``
   configure option.

.. note::

   Mac OS X users may need the ``--disable-threads`` configure option to
   disable multi-threading in nghttpd, nghttpx and h2load to prevent
   them from crashing. A patch is welcome to make multi threading work
   on Mac OS X platform.

.. note::

   To compile the associated applications (nghttp, nghttpd, nghttpx
   and h2load), you must use the ``--enable-app`` configure option and
   ensure that the specified requirements above are met.  Normally,
   configure script checks required dependencies to build these
   applications, and enable ``--enable-app`` automatically, so you
   don't have to use it explicitly.  But if you found that
   applications were not built, then using ``--enable-app`` may find
   that cause, such as the missing dependency.

.. note::

   In order to detect third party libraries, pkg-config is used
   (however we don't use pkg-config for some libraries (e.g., libev)).
   By default, pkg-config searches ``*.pc`` file in the standard
   locations (e.g., /usr/lib/pkgconfig).  If it is necessary to use
   ``*.pc`` file in the custom location, specify paths to
   ``PKG_CONFIG_PATH`` environment variable, and pass it to configure
   script, like so:

   .. code-block:: text

       $ ./configure PKG_CONFIG_PATH=/path/to/pkgconfig

   For pkg-config managed libraries, ``*_CFLAG`` and ``*_LIBS``
   environment variables are defined (e.g., ``OPENSSL_CFLAGS``,
   ``OPENSSL_LIBS``).  Specifying non-empty string to these variables
   completely overrides pkg-config.  In other words, if they are
   specified, pkg-config is not used for detection, and user is
   responsible to specify the correct values to these variables.  For
   complete list of these variables, run ``./configure -h``.

If you are using Ubuntu 22.04 LTS, run the following to install the
required packages:

.. code-block:: text

    sudo apt-get install g++ clang make binutils autoconf automake \
      autotools-dev libtool pkg-config \
      zlib1g-dev libssl-dev libxml2-dev libev-dev \
      libevent-dev libjansson-dev \
      libc-ares-dev libjemalloc-dev libsystemd-dev \
      ruby-dev bison libelf-dev

Building nghttp2 from release tar archive
-----------------------------------------

The nghttp2 project regularly releases tar archives which includes
nghttp2 source code, and generated build files.  They can be
downloaded from `Releases
<https://github.com/nghttp2/nghttp2/releases>`_ page.

Building nghttp2 from git requires autotools development packages.
Building from tar archives does not require them, and thus it is much
easier.  The usual build step is as follows:

.. code-block:: text

    $ tar xf nghttp2-X.Y.Z.tar.bz2
    $ cd nghttp2-X.Y.Z
    $ ./configure
    $ make

Building from git
-----------------

Building from git is easy, but please be sure that at least autoconf 2.68 is
used:

.. code-block:: text

    $ git submodule update --init
    $ autoreconf -i
    $ automake
    $ autoconf
    $ ./configure
    $ make

Notes for building on Windows (MSVC)
------------------------------------

The easiest way to build native Windows nghttp2 dll is use `cmake
<https://cmake.org/>`_.  The free version of `Visual C++ Build Tools
<http://landinghub.visualstudio.com/visual-cpp-build-tools>`_ works
fine.

1. Install cmake for windows
2. Open "Visual C++ ... Native Build Tool Command Prompt", and inside
   nghttp2 directly, run ``cmake``.
3. Then run ``cmake --build`` to build library.
4. nghttp2.dll, nghttp2.lib, nghttp2.exp are placed under lib directory.

Note that the above steps most likely produce nghttp2 library only.
No bundled applications are compiled.

Notes for building on Windows (Mingw/Cygwin)
--------------------------------------------

Under Mingw environment, you can only compile the library, it's
``libnghttp2-X.dll`` and ``libnghttp2.a``.

If you want to compile the applications(``h2load``, ``nghttp``,
``nghttpx``, ``nghttpd``), you need to use the Cygwin environment.

Under Cygwin environment, to compile the applications you need to
compile and install the libev first.

Secondly, you need to undefine the macro ``__STRICT_ANSI__``, if you
not, the functions ``fdopen``, ``fileno`` and ``strptime`` will not
available.

the sample command like this:

.. code-block:: text

    $ export CFLAGS="-U__STRICT_ANSI__ -I$libev_PREFIX/include -L$libev_PREFIX/lib"
    $ export CXXFLAGS=$CFLAGS
    $ ./configure
    $ make

If you want to compile the applications under ``examples/``, you need
to remove or rename the ``event.h`` from libev's installation, because
it conflicts with libevent's installation.

Notes for installation on Linux systems
--------------------------------------------
After installing nghttp2 tool suite with ``make install`` one might experience a similar error:

.. code-block:: text

    nghttpx: error while loading shared libraries: libnghttp2.so.14: cannot open shared object file: No such file or directory

This means that the tool is unable to locate the ``libnghttp2.so`` shared library.

To update the shared library cache run ``sudo ldconfig``.

Building the documentation
--------------------------

.. note::

   Documentation is still incomplete.

To build the documentation, run:

.. code-block:: text

    $ make html

The documents will be generated under ``doc/manual/html/``.

The generated documents will not be installed with ``make install``.

The online documentation is available at
https://nghttp2.org/documentation/

Build HTTP/3 enabled h2load and nghttpx
---------------------------------------

To build h2load and nghttpx with HTTP/3 feature enabled, run the
configure script with ``--enable-http3``.

For nghttpx to reload configurations and swapping its executable while
gracefully terminating old worker processes, eBPF is required.  Run
the configure script with ``--enable-http3 --with-libbpf`` to build
eBPF program.  The QUIC keying material must be set with
``--frontend-quic-secret-file`` in order to keep the existing
connections alive during reload.

The detailed steps to build HTTP/3 enabled h2load and nghttpx follow.

Build aws-lc:

.. code-block:: text

   $ git clone --depth 1 -b v1.52.0 https://github.com/aws/aws-lc
   $ cd aws-lc
   $ cmake -B build -DDISABLE_GO=ON --install-prefix=$PWD/opt
   $ make -j$(nproc) -C build
   $ cmake --install build
   $ cd ..

Build nghttp3:

.. code-block:: text

   $ git clone --depth 1 -b v1.9.0 https://github.com/ngtcp2/nghttp3
   $ cd nghttp3
   $ git submodule update --init --depth 1
   $ autoreconf -i
   $ ./configure --prefix=$PWD/build --enable-lib-only
   $ make -j$(nproc)
   $ make install
   $ cd ..

Build ngtcp2:

.. code-block:: text

   $ git clone --depth 1 -b v1.12.0 https://github.com/ngtcp2/ngtcp2
   $ cd ngtcp2
   $ git submodule update --init --depth 1
   $ autoreconf -i
   $ ./configure --prefix=$PWD/build --enable-lib-only --with-boringssl \
         BORINGSSL_CFLAGS="-I$PWD/../aws-lc/opt/include" \
         BORINGSSL_LIBS="-L$PWD/../aws-lc/opt/lib -lssl -lcrypto"
   $ make -j$(nproc)
   $ make install
   $ cd ..

If your Linux distribution does not have libbpf-dev >= 0.7.0, build
from source:

.. code-block:: text

   $ git clone --depth 1 -b v1.5.1 https://github.com/libbpf/libbpf
   $ cd libbpf
   $ PREFIX=$PWD/build make -C src install
   $ cd ..

Build nghttp2:

.. code-block:: text

   $ git clone https://github.com/nghttp2/nghttp2
   $ cd nghttp2
   $ git submodule update --init
   $ autoreconf -i
   $ ./configure --with-mruby --enable-http3 --with-libbpf \
         CC=clang-18 CXX=clang++-18 \
         PKG_CONFIG_PATH="$PWD/../aws-lc/opt/lib/pkgconfig:$PWD/../nghttp3/build/lib/pkgconfig:$PWD/../ngtcp2/build/lib/pkgconfig:$PWD/../libbpf/build/lib64/pkgconfig" \
         LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/../aws-lc/opt/lib -Wl,-rpath,$PWD/../libbpf/build/lib64"
   $ make -j$(nproc)

The eBPF program ``reuseport_kern.o`` should be found under bpf
directory.  Pass ``--quic-bpf-program-file=bpf/reuseport_kern.o``
option to nghttpx to load it.  See also `HTTP/3 section in nghttpx -
HTTP/2 proxy - HOW-TO
<https://nghttp2.org/documentation/nghttpx-howto.html#http-3>`_.

Unit tests
----------

Unit tests are done by simply running ``make check``.

Integration tests
-----------------

We have the integration tests for the nghttpx proxy server.  The tests are
written in the `Go programming language <http://golang.org/>`_ and uses
its testing framework.  We depend on the following libraries:

* golang.org/x/net/http2
* golang.org/x/net/websocket
* https://github.com/tatsuhiro-t/go-nghttp2

Go modules will download these dependencies automatically.

To run the tests, run the following command under
``integration-tests`` directory:

.. code-block:: text

    $ make it

Inside the tests, we use port 3009 to run the test subject server.

Migration from v0.7.15 or earlier
---------------------------------

nghttp2 v1.0.0 introduced several backward incompatible changes.  In
this section, we describe these changes and how to migrate to v1.0.0.

ALPN protocol ID is now ``h2`` and ``h2c``
++++++++++++++++++++++++++++++++++++++++++

Previously we announced ``h2-14`` and ``h2c-14``.  v1.0.0 implements
final protocol version, and we changed ALPN ID to ``h2`` and ``h2c``.
The macros ``NGHTTP2_PROTO_VERSION_ID``,
``NGHTTP2_PROTO_VERSION_ID_LEN``,
``NGHTTP2_CLEARTEXT_PROTO_VERSION_ID``, and
``NGHTTP2_CLEARTEXT_PROTO_VERSION_ID_LEN`` have been updated to
reflect this change.

Basically, existing applications do not have to do anything, just
recompiling is enough for this change.

Use word "client magic" where we use "client connection preface"
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

We use "client connection preface" to mean first 24 bytes of client
connection preface.  This is technically not correct, since client
connection preface is composed of 24 bytes client magic byte string
followed by SETTINGS frame.  For clarification, we call "client magic"
for this 24 bytes byte string and updated API.

* ``NGHTTP2_CLIENT_CONNECTION_PREFACE`` was replaced with
  ``NGHTTP2_CLIENT_MAGIC``.
* ``NGHTTP2_CLIENT_CONNECTION_PREFACE_LEN`` was replaced with
  ``NGHTTP2_CLIENT_MAGIC_LEN``.
* ``NGHTTP2_BAD_PREFACE`` was renamed as ``NGHTTP2_BAD_CLIENT_MAGIC``

The already deprecated ``NGHTTP2_CLIENT_CONNECTION_HEADER`` and
``NGHTTP2_CLIENT_CONNECTION_HEADER_LEN`` were removed.

If application uses these macros, just replace old ones with new ones.
Since v1.0.0, client magic is sent by library (see next subsection),
so client application may just remove these macro use.

Client magic is sent by library
+++++++++++++++++++++++++++++++

Previously nghttp2 library did not send client magic, which is first
24 bytes byte string of client connection preface, and client
applications have to send it by themselves.  Since v1.0.0, client
magic is sent by library via first call of ``nghttp2_session_send()``
or ``nghttp2_session_mem_send2()``.

The client applications which send client magic must remove the
relevant code.

Remove HTTP Alternative Services (Alt-Svc) related code
+++++++++++++++++++++++++++++++++++++++++++++++++++++++

Alt-Svc specification is not finalized yet.  To make our API stable,
we have decided to remove all Alt-Svc related API from nghttp2.

* ``NGHTTP2_EXT_ALTSVC`` was removed.
* ``nghttp2_ext_altsvc`` was removed.

We have already removed the functionality of Alt-Svc in v0.7 series
and they have been essentially noop.  The application using these
macro and struct, remove those lines.

Use nghttp2_error in nghttp2_on_invalid_frame_recv_callback
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Previously ``nghttp2_on_invalid_frame_recv_cb_called`` took the
``error_code``, defined in ``nghttp2_error_code``, as parameter.  But
they are not detailed enough to debug.  Therefore, we decided to use
more detailed ``nghttp2_error`` values instead.

The application using this callback should update the callback
signature.  If it treats ``error_code`` as HTTP/2 error code, update
the code so that it is treated as ``nghttp2_error``.

Receive client magic by default
+++++++++++++++++++++++++++++++

Previously nghttp2 did not process client magic (24 bytes byte
string).  To make it deal with it, we had to use
``nghttp2_option_set_recv_client_preface()``.  Since v1.0.0, nghttp2
processes client magic by default and
``nghttp2_option_set_recv_client_preface()`` was removed.

Some application may want to disable this behaviour, so we added
``nghttp2_option_set_no_recv_client_magic()`` to achieve this.

The application using ``nghttp2_option_set_recv_client_preface()``
with nonzero value, just remove it.

The application using ``nghttp2_option_set_recv_client_preface()``
with zero value or not using it must use
``nghttp2_option_set_no_recv_client_magic()`` with nonzero value.

Client, Server and Proxy programs
---------------------------------

The ``src`` directory contains the HTTP/2 client, server and proxy programs.

nghttp - client
+++++++++++++++

``nghttp`` is a HTTP/2 client.  It can connect to the HTTP/2 server
with prior knowledge, HTTP Upgrade and ALPN TLS extension.

It has verbose output mode for framing information.  Here is sample
output from ``nghttp`` client:

.. code-block:: text

    $ nghttp -nv https://nghttp2.org
    [  0.190] Connected
    The negotiated protocol: h2
    [  0.212] recv SETTINGS frame <length=12, flags=0x00, stream_id=0>
	      (niv=2)
	      [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
	      [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
    [  0.212] send SETTINGS frame <length=12, flags=0x00, stream_id=0>
	      (niv=2)
	      [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
	      [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
    [  0.212] send SETTINGS frame <length=0, flags=0x01, stream_id=0>
	      ; ACK
	      (niv=0)
    [  0.212] send PRIORITY frame <length=5, flags=0x00, stream_id=3>
	      (dep_stream_id=0, weight=201, exclusive=0)
    [  0.212] send PRIORITY frame <length=5, flags=0x00, stream_id=5>
	      (dep_stream_id=0, weight=101, exclusive=0)
    [  0.212] send PRIORITY frame <length=5, flags=0x00, stream_id=7>
	      (dep_stream_id=0, weight=1, exclusive=0)
    [  0.212] send PRIORITY frame <length=5, flags=0x00, stream_id=9>
	      (dep_stream_id=7, weight=1, exclusive=0)
    [  0.212] send PRIORITY frame <length=5, flags=0x00, stream_id=11>
	      (dep_stream_id=3, weight=1, exclusive=0)
    [  0.212] send HEADERS frame <length=39, flags=0x25, stream_id=13>
	      ; END_STREAM | END_HEADERS | PRIORITY
	      (padlen=0, dep_stream_id=11, weight=16, exclusive=0)
	      ; Open new stream
	      :method: GET
	      :path: /
	      :scheme: https
	      :authority: nghttp2.org
	      accept: */*
	      accept-encoding: gzip, deflate
	      user-agent: nghttp2/1.0.1-DEV
    [  0.221] recv SETTINGS frame <length=0, flags=0x01, stream_id=0>
	      ; ACK
	      (niv=0)
    [  0.221] recv (stream_id=13) :method: GET
    [  0.221] recv (stream_id=13) :scheme: https
    [  0.221] recv (stream_id=13) :path: /stylesheets/screen.css
    [  0.221] recv (stream_id=13) :authority: nghttp2.org
    [  0.221] recv (stream_id=13) accept-encoding: gzip, deflate
    [  0.222] recv (stream_id=13) user-agent: nghttp2/1.0.1-DEV
    [  0.222] recv PUSH_PROMISE frame <length=50, flags=0x04, stream_id=13>
	      ; END_HEADERS
	      (padlen=0, promised_stream_id=2)
    [  0.222] recv (stream_id=13) :status: 200
    [  0.222] recv (stream_id=13) date: Thu, 21 May 2015 16:38:14 GMT
    [  0.222] recv (stream_id=13) content-type: text/html
    [  0.222] recv (stream_id=13) last-modified: Fri, 15 May 2015 15:38:06 GMT
    [  0.222] recv (stream_id=13) etag: W/"555612de-19f6"
    [  0.222] recv (stream_id=13) link: </stylesheets/screen.css>; rel=preload; as=stylesheet
    [  0.222] recv (stream_id=13) content-encoding: gzip
    [  0.222] recv (stream_id=13) server: nghttpx nghttp2/1.0.1-DEV
    [  0.222] recv (stream_id=13) via: 1.1 nghttpx
    [  0.222] recv (stream_id=13) strict-transport-security: max-age=31536000
    [  0.222] recv HEADERS frame <length=166, flags=0x04, stream_id=13>
	      ; END_HEADERS
	      (padlen=0)
	      ; First response header
    [  0.222] recv DATA frame <length=2601, flags=0x01, stream_id=13>
	      ; END_STREAM
    [  0.222] recv (stream_id=2) :status: 200
    [  0.222] recv (stream_id=2) date: Thu, 21 May 2015 16:38:14 GMT
    [  0.222] recv (stream_id=2) content-type: text/css
    [  0.222] recv (stream_id=2) last-modified: Fri, 15 May 2015 15:38:06 GMT
    [  0.222] recv (stream_id=2) etag: W/"555612de-9845"
    [  0.222] recv (stream_id=2) content-encoding: gzip
    [  0.222] recv (stream_id=2) server: nghttpx nghttp2/1.0.1-DEV
    [  0.222] recv (stream_id=2) via: 1.1 nghttpx
    [  0.222] recv (stream_id=2) strict-transport-security: max-age=31536000
    [  0.222] recv HEADERS frame <length=32, flags=0x04, stream_id=2>
	      ; END_HEADERS
	      (padlen=0)
	      ; First push response header
    [  0.228] recv DATA frame <length=8715, flags=0x01, stream_id=2>
	      ; END_STREAM
    [  0.228] send GOAWAY frame <length=8, flags=0x00, stream_id=0>
	      (last_stream_id=2, error_code=NO_ERROR(0x00), opaque_data(0)=[])

The HTTP Upgrade is performed like so:

.. code-block:: text

    $ nghttp -nvu http://nghttp2.org
    [  0.011] Connected
    [  0.011] HTTP Upgrade request
    GET / HTTP/1.1
    Host: nghttp2.org
    Connection: Upgrade, HTTP2-Settings
    Upgrade: h2c
    HTTP2-Settings: AAMAAABkAAQAAP__
    Accept: */*
    User-Agent: nghttp2/1.0.1-DEV


    [  0.018] HTTP Upgrade response
    HTTP/1.1 101 Switching Protocols
    Connection: Upgrade
    Upgrade: h2c


    [  0.018] HTTP Upgrade success
    [  0.018] recv SETTINGS frame <length=12, flags=0x00, stream_id=0>
	      (niv=2)
	      [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
	      [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
    [  0.018] send SETTINGS frame <length=12, flags=0x00, stream_id=0>
	      (niv=2)
	      [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
	      [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
    [  0.018] send SETTINGS frame <length=0, flags=0x01, stream_id=0>
	      ; ACK
	      (niv=0)
    [  0.018] send PRIORITY frame <length=5, flags=0x00, stream_id=3>
	      (dep_stream_id=0, weight=201, exclusive=0)
    [  0.018] send PRIORITY frame <length=5, flags=0x00, stream_id=5>
	      (dep_stream_id=0, weight=101, exclusive=0)
    [  0.018] send PRIORITY frame <length=5, flags=0x00, stream_id=7>
	      (dep_stream_id=0, weight=1, exclusive=0)
    [  0.018] send PRIORITY frame <length=5, flags=0x00, stream_id=9>
	      (dep_stream_id=7, weight=1, exclusive=0)
    [  0.018] send PRIORITY frame <length=5, flags=0x00, stream_id=11>
	      (dep_stream_id=3, weight=1, exclusive=0)
    [  0.018] send PRIORITY frame <length=5, flags=0x00, stream_id=1>
	      (dep_stream_id=11, weight=16, exclusive=0)
    [  0.019] recv (stream_id=1) :method: GET
    [  0.019] recv (stream_id=1) :scheme: http
    [  0.019] recv (stream_id=1) :path: /stylesheets/screen.css
    [  0.019] recv (stream_id=1) host: nghttp2.org
    [  0.019] recv (stream_id=1) user-agent: nghttp2/1.0.1-DEV
    [  0.019] recv PUSH_PROMISE frame <length=49, flags=0x04, stream_id=1>
	      ; END_HEADERS
	      (padlen=0, promised_stream_id=2)
    [  0.019] recv (stream_id=1) :status: 200
    [  0.019] recv (stream_id=1) date: Thu, 21 May 2015 16:39:16 GMT
    [  0.019] recv (stream_id=1) content-type: text/html
    [  0.019] recv (stream_id=1) content-length: 6646
    [  0.019] recv (stream_id=1) last-modified: Fri, 15 May 2015 15:38:06 GMT
    [  0.019] recv (stream_id=1) etag: "555612de-19f6"
    [  0.019] recv (stream_id=1) link: </stylesheets/screen.css>; rel=preload; as=stylesheet
    [  0.019] recv (stream_id=1) accept-ranges: bytes
    [  0.019] recv (stream_id=1) server: nghttpx nghttp2/1.0.1-DEV
    [  0.019] recv (stream_id=1) via: 1.1 nghttpx
    [  0.019] recv HEADERS frame <length=157, flags=0x04, stream_id=1>
	      ; END_HEADERS
	      (padlen=0)
	      ; First response header
    [  0.019] recv DATA frame <length=6646, flags=0x01, stream_id=1>
	      ; END_STREAM
    [  0.019] recv (stream_id=2) :status: 200
    [  0.019] recv (stream_id=2) date: Thu, 21 May 2015 16:39:16 GMT
    [  0.019] recv (stream_id=2) content-type: text/css
    [  0.019] recv (stream_id=2) content-length: 38981
    [  0.019] recv (stream_id=2) last-modified: Fri, 15 May 2015 15:38:06 GMT
    [  0.019] recv (stream_id=2) etag: "555612de-9845"
    [  0.019] recv (stream_id=2) accept-ranges: bytes
    [  0.019] recv (stream_id=2) server: nghttpx nghttp2/1.0.1-DEV
    [  0.019] recv (stream_id=2) via: 1.1 nghttpx
    [  0.019] recv HEADERS frame <length=36, flags=0x04, stream_id=2>
	      ; END_HEADERS
	      (padlen=0)
	      ; First push response header
    [  0.026] recv DATA frame <length=16384, flags=0x00, stream_id=2>
    [  0.027] recv DATA frame <length=7952, flags=0x00, stream_id=2>
    [  0.027] send WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=0>
	      (window_size_increment=33343)
    [  0.032] send WINDOW_UPDATE frame <length=4, flags=0x00, stream_id=2>
	      (window_size_increment=33707)
    [  0.032] recv DATA frame <length=14645, flags=0x01, stream_id=2>
	      ; END_STREAM
    [  0.032] recv SETTINGS frame <length=0, flags=0x01, stream_id=0>
	      ; ACK
	      (niv=0)
    [  0.032] send GOAWAY frame <length=8, flags=0x00, stream_id=0>
	      (last_stream_id=2, error_code=NO_ERROR(0x00), opaque_data(0)=[])

Using the ``-s`` option, ``nghttp`` prints out some timing information for
requests, sorted by completion time:

.. code-block:: text

    $ nghttp -nas https://nghttp2.org/
    ***** Statistics *****

    Request timing:
      responseEnd: the  time  when  last  byte of  response  was  received
                   relative to connectEnd
     requestStart: the time  just before  first byte  of request  was sent
                   relative  to connectEnd.   If  '*' is  shown, this  was
                   pushed by server.
          process: responseEnd - requestStart
             code: HTTP status code
             size: number  of  bytes  received as  response  body  without
                   inflation.
              URI: request URI

    see http://www.w3.org/TR/resource-timing/#processing-model

    sorted by 'complete'

    id  responseEnd requestStart  process code size request path
     13    +37.19ms       +280us  36.91ms  200   2K /
      2    +72.65ms *   +36.38ms  36.26ms  200   8K /stylesheets/screen.css
     17    +77.43ms     +38.67ms  38.75ms  200   3K /javascripts/octopress.js
     15    +78.12ms     +38.66ms  39.46ms  200   3K /javascripts/modernizr-2.0.js

Using the ``-r`` option, ``nghttp`` writes more detailed timing data to
the given file in HAR format.

nghttpd - server
++++++++++++++++

``nghttpd`` is a multi-threaded static web server.

By default, it uses SSL/TLS connection.  Use ``--no-tls`` option to
disable it.

``nghttpd`` only accepts HTTP/2 connections via ALPN or direct HTTP/2
connections.  No HTTP Upgrade is supported.

The ``-p`` option allows users to configure server push.

Just like ``nghttp``, it has a verbose output mode for framing
information.  Here is sample output from ``nghttpd``:

.. code-block:: text

    $ nghttpd --no-tls -v 8080
    IPv4: listen 0.0.0.0:8080
    IPv6: listen :::8080
    [id=1] [  1.521] send SETTINGS frame <length=6, flags=0x00, stream_id=0>
              (niv=1)
              [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
    [id=1] [  1.521] recv SETTINGS frame <length=12, flags=0x00, stream_id=0>
              (niv=2)
              [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
              [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
    [id=1] [  1.521] recv SETTINGS frame <length=0, flags=0x01, stream_id=0>
              ; ACK
              (niv=0)
    [id=1] [  1.521] recv PRIORITY frame <length=5, flags=0x00, stream_id=3>
              (dep_stream_id=0, weight=201, exclusive=0)
    [id=1] [  1.521] recv PRIORITY frame <length=5, flags=0x00, stream_id=5>
              (dep_stream_id=0, weight=101, exclusive=0)
    [id=1] [  1.521] recv PRIORITY frame <length=5, flags=0x00, stream_id=7>
              (dep_stream_id=0, weight=1, exclusive=0)
    [id=1] [  1.521] recv PRIORITY frame <length=5, flags=0x00, stream_id=9>
              (dep_stream_id=7, weight=1, exclusive=0)
    [id=1] [  1.521] recv PRIORITY frame <length=5, flags=0x00, stream_id=11>
              (dep_stream_id=3, weight=1, exclusive=0)
    [id=1] [  1.521] recv (stream_id=13) :method: GET
    [id=1] [  1.521] recv (stream_id=13) :path: /
    [id=1] [  1.521] recv (stream_id=13) :scheme: http
    [id=1] [  1.521] recv (stream_id=13) :authority: localhost:8080
    [id=1] [  1.521] recv (stream_id=13) accept: */*
    [id=1] [  1.521] recv (stream_id=13) accept-encoding: gzip, deflate
    [id=1] [  1.521] recv (stream_id=13) user-agent: nghttp2/1.0.0-DEV
    [id=1] [  1.521] recv HEADERS frame <length=41, flags=0x25, stream_id=13>
              ; END_STREAM | END_HEADERS | PRIORITY
              (padlen=0, dep_stream_id=11, weight=16, exclusive=0)
              ; Open new stream
    [id=1] [  1.521] send SETTINGS frame <length=0, flags=0x01, stream_id=0>
              ; ACK
              (niv=0)
    [id=1] [  1.521] send HEADERS frame <length=86, flags=0x04, stream_id=13>
              ; END_HEADERS
              (padlen=0)
              ; First response header
              :status: 200
              server: nghttpd nghttp2/1.0.0-DEV
              content-length: 10
              cache-control: max-age=3600
              date: Fri, 15 May 2015 14:49:04 GMT
              last-modified: Tue, 30 Sep 2014 12:40:52 GMT
    [id=1] [  1.522] send DATA frame <length=10, flags=0x01, stream_id=13>
              ; END_STREAM
    [id=1] [  1.522] stream_id=13 closed
    [id=1] [  1.522] recv GOAWAY frame <length=8, flags=0x00, stream_id=0>
              (last_stream_id=0, error_code=NO_ERROR(0x00), opaque_data(0)=[])
    [id=1] [  1.522] closed

nghttpx - proxy
+++++++++++++++

``nghttpx`` is a multi-threaded reverse proxy for HTTP/3, HTTP/2, and
HTTP/1.1, and powers http://nghttp2.org and supports HTTP/2 server
push.

We reworked ``nghttpx`` command-line interface, and as a result, there
are several incompatibles from 1.8.0 or earlier.  This is necessary to
extend its capability, and secure the further feature enhancements in
the future release.  Please read `Migration from nghttpx v1.8.0 or
earlier
<https://nghttp2.org/documentation/nghttpx-howto.html#migration-from-nghttpx-v1-8-0-or-earlier>`_
to know how to migrate from earlier releases.

``nghttpx`` implements `important performance-oriented features
<https://istlsfastyet.com/#server-performance>`_ in TLS, such as
session IDs, session tickets (with automatic key rotation), dynamic
record sizing, ALPN, forward secrecy and HTTP/2.  ``nghttpx`` also
offers the functionality to share ticket keys among multiple
``nghttpx`` instances via memcached.

``nghttpx`` has 2 operation modes:

================== ======================== ================ =============
Mode option        Frontend                 Backend          Note
================== ======================== ================ =============
default mode       HTTP/3, HTTP/2, HTTP/1.1 HTTP/1.1, HTTP/2 Reverse proxy
``--http2-proxy``  HTTP/3, HTTP/2, HTTP/1.1 HTTP/1.1, HTTP/2 Forward proxy
================== ======================== ================ =============

The interesting mode at the moment is the default mode.  It works like
a reverse proxy and listens for HTTP/3, HTTP/2, and HTTP/1.1 and can
be deployed as a SSL/TLS terminator for existing web server.

In all modes, the frontend connections are encrypted by SSL/TLS by
default.  To disable encryption, use the ``no-tls`` keyword in
``--frontend`` option.  If encryption is disabled, incoming HTTP/1.1
connections can be upgraded to HTTP/2 through HTTP Upgrade.  On the
other hard, backend connections are not encrypted by default.  To
encrypt backend connections, use ``tls`` keyword in ``--backend``
option.

``nghttpx`` supports a configuration file.  See the ``--conf`` option and
sample configuration file ``nghttpx.conf.sample``.

In the default mode, ``nghttpx`` works as reverse proxy to the backend
server:

.. code-block:: text

    Client <-- (HTTP/3, HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1, HTTP/2) --> Web Server
                                            [reverse proxy]

With the ``--http2-proxy`` option, it works as forward proxy, and it
is so called secure HTTP/2 proxy:

.. code-block:: text

    Client <-- (HTTP/3, HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/1.1) --> Proxy
                                             [secure proxy]          (e.g., Squid, ATS)

The ``Client`` in the above example needs to be configured to use
``nghttpx`` as secure proxy.

At the time of this writing, both Chrome and Firefox support secure
HTTP/2 proxy.  One way to configure Chrome to use a secure proxy is to
create a proxy.pac script like this:

.. code-block:: javascript

    function FindProxyForURL(url, host) {
        return "HTTPS SERVERADDR:PORT";
    }

``SERVERADDR`` and ``PORT`` is the hostname/address and port of the
machine nghttpx is running on.  Please note that Chrome requires a valid
certificate for secure proxy.

Then run Chrome with the following arguments:

.. code-block:: text

    $ google-chrome --proxy-pac-url=file:///path/to/proxy.pac --use-npn

The backend HTTP/2 connections can be tunneled through an HTTP proxy.
The proxy is specified using ``--backend-http-proxy-uri``.  The
following figure illustrates how nghttpx talks to the outside HTTP/2
proxy through an HTTP proxy:

.. code-block:: text

    Client <-- (HTTP/3, HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/2) --

            --===================---> HTTP/2 Proxy
              (HTTP proxy tunnel)     (e.g., nghttpx -s)

Benchmarking tool
-----------------

The ``h2load`` program is a benchmarking tool for HTTP/3, HTTP/2, and
HTTP/1.1.  The UI of ``h2load`` is heavily inspired by ``weighttp``
(https://github.com/lighttpd/weighttp).  The typical usage is as
follows:

.. code-block:: text

    $ h2load -n100000 -c100 -m100 https://localhost:8443/
    starting benchmark...
    spawning thread #0: 100 concurrent clients, 100000 total requests
    Protocol: TLSv1.2
    Cipher: ECDHE-RSA-AES128-GCM-SHA256
    Server Temp Key: ECDH P-256 256 bits
    progress: 10% done
    progress: 20% done
    progress: 30% done
    progress: 40% done
    progress: 50% done
    progress: 60% done
    progress: 70% done
    progress: 80% done
    progress: 90% done
    progress: 100% done

    finished in 771.26ms, 129658 req/s, 4.71MB/s
    requests: 100000 total, 100000 started, 100000 done, 100000 succeeded, 0 failed, 0 errored
    status codes: 100000 2xx, 0 3xx, 0 4xx, 0 5xx
    traffic: 3812300 bytes total, 1009900 bytes headers, 1000000 bytes data
                         min         max         mean         sd        +/- sd
    time for request:    25.12ms    124.55ms     51.07ms     15.36ms    84.87%
    time for connect:   208.94ms    254.67ms    241.38ms      7.95ms    63.00%
    time to 1st byte:   209.11ms    254.80ms    241.51ms      7.94ms    63.00%

The above example issued total 100,000 requests, using 100 concurrent
clients (in other words, 100 HTTP/2 sessions), and a maximum of 100 streams
per client.  With the ``-t`` option, ``h2load`` will use multiple native
threads to avoid saturating a single core on client side.

.. warning::

   **Don't use this tool against publicly available servers.** That is
   considered a DOS attack.  Please only use it against your private
   servers.

If the experimental HTTP/3 is enabled, h2load can send requests to
HTTP/3 server.  To do this, specify ``h3`` to ``--alpn-list`` option
like so:

.. code-block:: text

    $ h2load --alpn-list h3 https://127.0.0.1:4433

For nghttp2 v1.58 or earlier, use ``--npn-list`` instead of
``--alpn-list``.

HPACK tools
-----------

The ``src`` directory contains the HPACK tools.  The ``deflatehd`` program is a
command-line header compression tool.  The ``inflatehd`` program is a
command-line header decompression tool.  Both tools read input from
stdin and write output to stdout.  Errors are written to stderr.
They take JSON as input and output.  We  (mostly) use the same JSON data
format described at https://github.com/http2jp/hpack-test-case.

deflatehd - header compressor
+++++++++++++++++++++++++++++

The ``deflatehd`` program reads JSON data or HTTP/1-style header fields from
stdin and outputs compressed header block in JSON.

For the JSON input, the root JSON object must include a ``cases`` key.
Its value has to include the sequence of input header set.  They share
the same compression context and are processed in the order they
appear.  Each item in the sequence is a JSON object and it must
include a ``headers`` key.  Its value is an array of JSON objects,
which includes exactly one name/value pair.

Example:

.. code-block:: json

    {
      "cases":
      [
        {
          "headers": [
            { ":method": "GET" },
            { ":path": "/" }
          ]
        },
        {
          "headers": [
            { ":method": "POST" },
            { ":path": "/" }
          ]
        }
      ]
    }


With the ``-t`` option, the program can accept more familiar HTTP/1 style
header field blocks.  Each header set is delimited by an empty line:

Example:

.. code-block:: text

    :method: GET
    :scheme: https
    :path: /

    :method: POST
    user-agent: nghttp2

The output is in JSON object.  It should include a ``cases`` key and its
value is an array of JSON objects, which has at least the following keys:

seq
    The index of header set in the input.

input_length
    The sum of the length of the name/value pairs in the input.

output_length
    The length of the compressed header block.

percentage_of_original_size
    ``output_length`` / ``input_length`` * 100

wire
    The compressed header block as a hex string.

headers
    The input header set.

header_table_size
    The header table size adjusted before deflating the header set.

Examples:

.. code-block:: json

    {
      "cases":
      [
        {
          "seq": 0,
          "input_length": 66,
          "output_length": 20,
          "percentage_of_original_size": 30.303030303030305,
          "wire": "01881f3468e5891afcbf83868a3d856659c62e3f",
          "headers": [
            {
              ":authority": "example.org"
            },
            {
              ":method": "GET"
            },
            {
              ":path": "/"
            },
            {
              ":scheme": "https"
            },
            {
              "user-agent": "nghttp2"
            }
          ],
          "header_table_size": 4096
        }
        ,
        {
          "seq": 1,
          "input_length": 74,
          "output_length": 10,
          "percentage_of_original_size": 13.513513513513514,
          "wire": "88448504252dd5918485",
          "headers": [
            {
              ":authority": "example.org"
            },
            {
              ":method": "POST"
            },
            {
              ":path": "/account"
            },
            {
              ":scheme": "https"
            },
            {
              "user-agent": "nghttp2"
            }
          ],
          "header_table_size": 4096
        }
      ]
    }


The output can be used as the input for ``inflatehd`` and
``deflatehd``.

With the ``-d`` option, the extra ``header_table`` key is added and its
associated value includes the state of dynamic header table after the
corresponding header set was processed.  The value includes at least
the following keys:

entries
    The entry in the header table.  If ``referenced`` is ``true``, it
    is in the reference set.  The ``size`` includes the overhead (32
    bytes).  The ``index`` corresponds to the index of header table.
    The ``name`` is the header field name and the ``value`` is the
    header field value.

size
    The sum of the spaces entries occupied, this includes the
    entry overhead.

max_size
    The maximum header table size.

deflate_size
    The sum of the spaces entries occupied within
    ``max_deflate_size``.

max_deflate_size
    The maximum header table size the encoder uses.  This can be smaller
    than ``max_size``.  In this case, the encoder only uses up to first
    ``max_deflate_size`` buffer.  Since the header table size is still
    ``max_size``, the encoder has to keep track of entries outside the
    ``max_deflate_size`` but inside the ``max_size`` and make sure
    that they are no longer referenced.

Example:

.. code-block:: json

    {
      "cases":
      [
        {
          "seq": 0,
          "input_length": 66,
          "output_length": 20,
          "percentage_of_original_size": 30.303030303030305,
          "wire": "01881f3468e5891afcbf83868a3d856659c62e3f",
          "headers": [
            {
              ":authority": "example.org"
            },
            {
              ":method": "GET"
            },
            {
              ":path": "/"
            },
            {
              ":scheme": "https"
            },
            {
              "user-agent": "nghttp2"
            }
          ],
          "header_table_size": 4096,
          "header_table": {
            "entries": [
              {
                "index": 1,
                "name": "user-agent",
                "value": "nghttp2",
                "referenced": true,
                "size": 49
              },
              {
                "index": 2,
                "name": ":scheme",
                "value": "https",
                "referenced": true,
                "size": 44
              },
              {
                "index": 3,
                "name": ":path",
                "value": "/",
                "referenced": true,
                "size": 38
              },
              {
                "index": 4,
                "name": ":method",
                "value": "GET",
                "referenced": true,
                "size": 42
              },
              {
                "index": 5,
                "name": ":authority",
                "value": "example.org",
                "referenced": true,
                "size": 53
              }
            ],
            "size": 226,
            "max_size": 4096,
            "deflate_size": 226,
            "max_deflate_size": 4096
          }
        }
        ,
        {
          "seq": 1,
          "input_length": 74,
          "output_length": 10,
          "percentage_of_original_size": 13.513513513513514,
          "wire": "88448504252dd5918485",
          "headers": [
            {
              ":authority": "example.org"
            },
            {
              ":method": "POST"
            },
            {
              ":path": "/account"
            },
            {
              ":scheme": "https"
            },
            {
              "user-agent": "nghttp2"
            }
          ],
          "header_table_size": 4096,
          "header_table": {
            "entries": [
              {
                "index": 1,
                "name": ":method",
                "value": "POST",
                "referenced": true,
                "size": 43
              },
              {
                "index": 2,
                "name": "user-agent",
                "value": "nghttp2",
                "referenced": true,
                "size": 49
              },
              {
                "index": 3,
                "name": ":scheme",
                "value": "https",
                "referenced": true,
                "size": 44
              },
              {
                "index": 4,
                "name": ":path",
                "value": "/",
                "referenced": false,
                "size": 38
              },
              {
                "index": 5,
                "name": ":method",
                "value": "GET",
                "referenced": false,
                "size": 42
              },
              {
                "index": 6,
                "name": ":authority",
                "value": "example.org",
                "referenced": true,
                "size": 53
              }
            ],
            "size": 269,
            "max_size": 4096,
            "deflate_size": 269,
            "max_deflate_size": 4096
          }
        }
      ]
    }

inflatehd - header decompressor
+++++++++++++++++++++++++++++++

The ``inflatehd`` program reads JSON data from stdin and outputs decompressed
name/value pairs in JSON.

The root JSON object must include the ``cases`` key.  Its value has to
include the sequence of compressed header blocks.  They share the same
compression context and are processed in the order they appear.  Each
item in the sequence is a JSON object and it must have at least a
``wire`` key.  Its value is a compressed header block as a hex string.

Example:

.. code-block:: json

    {
      "cases":
      [
        { "wire": "8285" },
        { "wire": "8583" }
      ]
    }

The output is a JSON object.  It should include a ``cases`` key and its
value is an array of JSON objects, which has at least following keys:

seq
    The index of the header set in the input.

headers
    A JSON array that includes decompressed name/value pairs.

wire
    The compressed header block as a hex string.

header_table_size
    The header table size adjusted before inflating compressed header
    block.

Example:

.. code-block:: json

    {
      "cases":
      [
        {
          "seq": 0,
          "wire": "01881f3468e5891afcbf83868a3d856659c62e3f",
          "headers": [
            {
              ":authority": "example.org"
            },
            {
              ":method": "GET"
            },
            {
              ":path": "/"
            },
            {
              ":scheme": "https"
            },
            {
              "user-agent": "nghttp2"
            }
          ],
          "header_table_size": 4096
        }
        ,
        {
          "seq": 1,
          "wire": "88448504252dd5918485",
          "headers": [
            {
              ":method": "POST"
            },
            {
              ":path": "/account"
            },
            {
              "user-agent": "nghttp2"
            },
            {
              ":scheme": "https"
            },
            {
              ":authority": "example.org"
            }
          ],
          "header_table_size": 4096
        }
      ]
    }

The output can be used as the input for ``deflatehd`` and
``inflatehd``.

With the ``-d`` option, the extra ``header_table`` key is added and its
associated value includes the state of the dynamic header table after the
corresponding header set was processed.  The format is the same as
``deflatehd``.

Contribution
------------

[This text was composed based on 1.2. License section of curl/libcurl
project.]

When contributing with code, you agree to put your changes and new
code under the same license nghttp2 is already using unless stated and
agreed otherwise.

When changing existing source code, do not alter the copyright of
the original file(s).  The copyright will still be owned by the
original creator(s) or those who have been assigned copyright by the
original author(s).

By submitting a patch to the nghttp2 project, you (or your employer, as
the case may be) agree to assign the copyright of your submission to us.
.. the above really needs to be reworded to pass legal muster.
We will credit you for your
changes as far as possible, to give credit but also to keep a trace
back to who made what changes.  Please always provide us with your
full real name when contributing!

See `Contribution Guidelines
<https://nghttp2.org/documentation/contribute.html>`_ for more
details.

Versioning
----------

In general, we follow `Semantic Versioning <http://semver.org/>`_.

We may release PATCH releases between the regular releases, mainly for
severe security bug fixes.

We have no plan to break API compatibility changes involving soname
bump, so MAJOR version will stay 1 for the foreseeable future.

License
-------

The MIT License
PKMP%[�*��z�zdoc/alt-pcre/ChangeLognu�[���ChangeLog for PCRE
------------------

Note that the PCRE 8.xx series (PCRE1) is now in a bugfix-only state. All
development is happening in the PCRE2 10.xx series.

Version 8.41 05-July-2017
-------------------------

1.  Fixed typo in CMakeLists.txt (wrong number of arguments for
PCRE_STATIC_RUNTIME (affects MSVC only).

2.  Issue 1 for 8.40 below was not correctly fixed. If pcregrep in multiline
mode with --only-matching matched several lines, it restarted scanning at the
next line instead of moving on to the end of the matched string, which can be
several lines after the start.

3.  Fix a missing else in the JIT compiler reported by 'idaifish'.

4.  A (?# style comment is now ignored between a basic quantifier and a
following '+' or '?' (example: /X+(?#comment)?Y/.

5.  Avoid use of a potentially overflowing buffer in pcregrep (patch by Petr
Pisar).

6.  Fuzzers have reported issues in pcretest. These are NOT serious (it is,
after all, just a test program). However, to stop the reports, some easy ones
are fixed:

    (a) Check for values < 256 when calling isprint() in pcretest.
    (b) Give an error for too big a number after \O.

7.  In the 32-bit library in non-UTF mode, an attempt to find a Unicode
property for a character with a code point greater than 0x10ffff (the Unicode
maximum) caused a crash.

8. The alternative matching function, pcre_dfa_exec() misbehaved if it
encountered a character class with a possessive repeat, for example [a-f]{3}+.

9. When pcretest called pcre_copy_substring() in 32-bit mode, it set the buffer
length incorrectly, which could result in buffer overflow.

10. Remove redundant line of code (accidentally left in ages ago).

11. Applied C++ patch from Irfan Adilovic to guard 'using std::' directives
with namespace pcrecpp (Bugzilla #2084).

12. Remove a duplication typo in pcre_tables.c.

13. Fix returned offsets from regexec() when REG_STARTEND is used with a
starting offset greater than zero.


Version 8.40 11-January-2017
----------------------------

1.  Using -o with -M in pcregrep could cause unnecessary repeated output when
    the match extended over a line boundary.

2.  Applied Chris Wilson's second patch (Bugzilla #1681) to CMakeLists.txt for
    MSVC static compilation, putting the first patch under a new option.

3.  Fix register overwite in JIT when SSE2 acceleration is enabled.

4.  Ignore "show all captures" (/=) for DFA matching.

5.  Fix JIT unaligned accesses on x86. Patch by Marc Mutz.

6.  In any wide-character mode (8-bit UTF or any 16-bit or 32-bit mode),
    without PCRE_UCP set, a negative character type such as \D in a positive
    class should cause all characters greater than 255 to match, whatever else
    is in the class. There was a bug that caused this not to happen if a
    Unicode property item was added to such a class, for example [\D\P{Nd}] or
    [\W\pL].

7.  When pcretest was outputing information from a callout, the caret indicator
    for the current position in the subject line was incorrect if it was after
    an escape sequence for a character whose code point was greater than
    \x{ff}.

8.  A pattern such as (?<RA>abc)(?(R)xyz) was incorrectly compiled such that
    the conditional was interpreted as a reference to capturing group 1 instead
    of a test for recursion. Any group whose name began with R was
    misinterpreted in this way. (The reference interpretation should only
    happen if the group's name is precisely "R".)

9.  A number of bugs have been mended relating to match start-up optimizations
    when the first thing in a pattern is a positive lookahead. These all
    applied only when PCRE_NO_START_OPTIMIZE was *not* set:

    (a) A pattern such as (?=.*X)X$ was incorrectly optimized as if it needed
        both an initial 'X' and a following 'X'.
    (b) Some patterns starting with an assertion that started with .* were
        incorrectly optimized as having to match at the start of the subject or
        after a newline. There are cases where this is not true, for example,
        (?=.*[A-Z])(?=.{8,16})(?!.*[\s]) matches after the start in lines that
        start with spaces. Starting .* in an assertion is no longer taken as an
        indication of matching at the start (or after a newline).


Version 8.39 14-June-2016
-------------------------

1.  If PCRE_AUTO_CALLOUT was set on a pattern that had a (?# comment between
    an item and its qualifier (for example, A(?#comment)?B) pcre_compile()
    misbehaved. This bug was found by the LLVM fuzzer.

2.  Similar to the above, if an isolated \E was present between an item and its
    qualifier when PCRE_AUTO_CALLOUT was set, pcre_compile() misbehaved. This
    bug was found by the LLVM fuzzer.

3.  Further to 8.38/46, negated classes such as [^[:^ascii:]\d] were also not
    working correctly in UCP mode.

4.  The POSIX wrapper function regexec() crashed if the option REG_STARTEND
    was set when the pmatch argument was NULL. It now returns REG_INVARG.

5.  Allow for up to 32-bit numbers in the ordin() function in pcregrep.

6.  An empty \Q\E sequence between an item and its qualifier caused
    pcre_compile() to misbehave when auto callouts were enabled. This bug was
    found by the LLVM fuzzer.

7.  If a pattern that was compiled with PCRE_EXTENDED started with white
    space or a #-type comment that was followed by (?-x), which turns off
    PCRE_EXTENDED, and there was no subsequent (?x) to turn it on again,
    pcre_compile() assumed that (?-x) applied to the whole pattern and
    consequently mis-compiled it. This bug was found by the LLVM fuzzer.

8.  A call of pcre_copy_named_substring() for a named substring whose number
    was greater than the space in the ovector could cause a crash.

9.  Yet another buffer overflow bug involved duplicate named groups with a
    group that reset capture numbers (compare 8.38/7 below). Once again, I have
    just allowed for more memory, even if not needed. (A proper fix is
    implemented in PCRE2, but it involves a lot of refactoring.)

10. pcre_get_substring_list() crashed if the use of \K in a match caused the
    start of the match to be earlier than the end.

11. Migrating appropriate PCRE2 JIT improvements to PCRE.

12. A pattern such as /(?<=((?C)0))/, which has a callout inside a lookbehind
    assertion, caused pcretest to generate incorrect output, and also to read
    uninitialized memory (detected by ASAN or valgrind).

13. A pattern that included (*ACCEPT) in the middle of a sufficiently deeply
    nested set of parentheses of sufficient size caused an overflow of the
    compiling workspace (which was diagnosed, but of course is not desirable).

14. And yet another buffer overflow bug involving duplicate named groups, this
    time nested, with a nested back reference. Yet again, I have just allowed
    for more memory, because anything more needs all the refactoring that has
    been done for PCRE2. An example pattern that provoked this bug is:
    /((?J)(?'R'(?'R'(?'R'(?'R'(?'R'(?|(\k'R'))))))))/ and the bug was
    registered as CVE-2016-1283.

15. pcretest went into a loop if global matching was requested with an ovector
    size less than 2. It now gives an error message. This bug was found by
    afl-fuzz.

16. An invalid pattern fragment such as (?(?C)0 was not diagnosing an error
    ("assertion expected") when (?(?C) was not followed by an opening
    parenthesis.

17. Fixed typo ("&&" for "&") in pcre_study(). Fortunately, this could not
    actually affect anything, by sheer luck.

18. Applied Chris Wilson's patch (Bugzilla #1681) to CMakeLists.txt for MSVC
    static compilation.

19. Modified the RunTest script to incorporate a valgrind suppressions file so
    that certain errors, provoked by the SSE2 instruction set when JIT is used,
    are ignored.

20. A racing condition is fixed in JIT reported by Mozilla.

21. Minor code refactor to avoid "array subscript is below array bounds"
    compiler warning.

22. Minor code refactor to avoid "left shift of negative number" warning.

23. Fix typo causing compile error when 16- or 32-bit JIT is compiled without
    UCP support.

24. Refactor to avoid compiler warnings in pcrecpp.cc.

25. Refactor to fix a typo in pcre_jit_test.c

26. Patch to support compiling pcrecpp.cc with Intel compiler.


Version 8.38 23-November-2015
-----------------------------

1.  If a group that contained a recursive back reference also contained a
    forward reference subroutine call followed by a non-forward-reference
    subroutine call, for example /.((?2)(?R)\1)()/, pcre_compile() failed to
    compile correct code, leading to undefined behaviour or an internally
    detected error. This bug was discovered by the LLVM fuzzer.

2.  Quantification of certain items (e.g. atomic back references) could cause
    incorrect code to be compiled when recursive forward references were
    involved. For example, in this pattern: /(?1)()((((((\1++))\x85)+)|))/.
    This bug was discovered by the LLVM fuzzer.

3.  A repeated conditional group whose condition was a reference by name caused
    a buffer overflow if there was more than one group with the given name.
    This bug was discovered by the LLVM fuzzer.

4.  A recursive back reference by name within a group that had the same name as
    another group caused a buffer overflow. For example:
    /(?J)(?'d'(?'d'\g{d}))/. This bug was discovered by the LLVM fuzzer.

5.  A forward reference by name to a group whose number is the same as the
    current group, for example in this pattern: /(?|(\k'Pm')|(?'Pm'))/, caused
    a buffer overflow at compile time. This bug was discovered by the LLVM
    fuzzer.

6.  A lookbehind assertion within a set of mutually recursive subpatterns could
    provoke a buffer overflow. This bug was discovered by the LLVM fuzzer.

7.  Another buffer overflow bug involved duplicate named groups with a
    reference between their definition, with a group that reset capture
    numbers, for example: /(?J:(?|(?'R')(\k'R')|((?'R'))))/. This has been
    fixed by always allowing for more memory, even if not needed. (A proper fix
    is implemented in PCRE2, but it involves more refactoring.)

8.  There was no check for integer overflow in subroutine calls such as (?123).

9.  The table entry for \l in EBCDIC environments was incorrect, leading to its
    being treated as a literal 'l' instead of causing an error.

10. There was a buffer overflow if pcre_exec() was called with an ovector of
    size 1. This bug was found by american fuzzy lop.

11. If a non-capturing group containing a conditional group that could match
    an empty string was repeated, it was not identified as matching an empty
    string itself. For example: /^(?:(?(1)x|)+)+$()/.

12. In an EBCDIC environment, pcretest was mishandling the escape sequences
    \a and \e in test subject lines.

13. In an EBCDIC environment, \a in a pattern was converted to the ASCII
    instead of the EBCDIC value.

14. The handling of \c in an EBCDIC environment has been revised so that it is
    now compatible with the specification in Perl's perlebcdic page.

15. The EBCDIC character 0x41 is a non-breaking space, equivalent to 0xa0 in
    ASCII/Unicode. This has now been added to the list of characters that are
    recognized as white space in EBCDIC.

16. When PCRE was compiled without UCP support, the use of \p and \P gave an
    error (correctly) when used outside a class, but did not give an error
    within a class.

17. \h within a class was incorrectly compiled in EBCDIC environments.

18. A pattern with an unmatched closing parenthesis that contained a backward
    assertion which itself contained a forward reference caused buffer
    overflow. And example pattern is: /(?=di(?<=(?1))|(?=(.))))/.

19. JIT should return with error when the compiled pattern requires more stack
    space than the maximum.

20. A possessively repeated conditional group that could match an empty string,
    for example, /(?(R))*+/, was incorrectly compiled.

21. Fix infinite recursion in the JIT compiler when certain patterns such as
    /(?:|a|){100}x/ are analysed.

22. Some patterns with character classes involving [: and \\ were incorrectly
    compiled and could cause reading from uninitialized memory or an incorrect
    error diagnosis.

23. Pathological patterns containing many nested occurrences of [: caused
    pcre_compile() to run for a very long time.

24. A conditional group with only one branch has an implicit empty alternative
    branch and must therefore be treated as potentially matching an empty
    string.

25. If (?R was followed by - or + incorrect behaviour happened instead of a
    diagnostic.

26. Arrange to give up on finding the minimum matching length for overly
    complex patterns.

27. Similar to (4) above: in a pattern with duplicated named groups and an
    occurrence of (?| it is possible for an apparently non-recursive back
    reference to become recursive if a later named group with the relevant
    number is encountered. This could lead to a buffer overflow. Wen Guanxing
    from Venustech ADLAB discovered this bug.

28. If pcregrep was given the -q option with -c or -l, or when handling a
    binary file, it incorrectly wrote output to stdout.

29. The JIT compiler did not restore the control verb head in case of *THEN
    control verbs. This issue was found by Karl Skomski with a custom LLVM
    fuzzer.

30. Error messages for syntax errors following \g and \k were giving inaccurate
    offsets in the pattern.

31. Added a check for integer overflow in conditions (?(<digits>) and
    (?(R<digits>). This omission was discovered by Karl Skomski with the LLVM
    fuzzer.

32. Handling recursive references such as (?2) when the reference is to a group
    later in the pattern uses code that is very hacked about and error-prone.
    It has been re-written for PCRE2. Here in PCRE1, a check has been added to
    give an internal error if it is obvious that compiling has gone wrong.

33. The JIT compiler should not check repeats after a {0,1} repeat byte code.
    This issue was found by Karl Skomski with a custom LLVM fuzzer.

34. The JIT compiler should restore the control chain for empty possessive
    repeats. This issue was found by Karl Skomski with a custom LLVM fuzzer.

35. Match limit check added to JIT recursion. This issue was found by Karl
    Skomski with a custom LLVM fuzzer.

36. Yet another case similar to 27 above has been circumvented by an
    unconditional allocation of extra memory. This issue is fixed "properly" in
    PCRE2 by refactoring the way references are handled. Wen Guanxing
    from Venustech ADLAB discovered this bug.

37. Fix two assertion fails in JIT. These issues were found by Karl Skomski
    with a custom LLVM fuzzer.

38. Fixed a corner case of range optimization in JIT.

39. An incorrect error "overran compiling workspace" was given if there were
    exactly enough group forward references such that the last one extended
    into the workspace safety margin. The next one would have expanded the
    workspace. The test for overflow was not including the safety margin.

40. A match limit issue is fixed in JIT which was found by Karl Skomski
    with a custom LLVM fuzzer.

41. Remove the use of /dev/null in testdata/testinput2, because it doesn't
    work under Windows. (Why has it taken so long for anyone to notice?)

42. In a character class such as [\W\p{Any}] where both a negative-type escape
    ("not a word character") and a property escape were present, the property
    escape was being ignored.

43. Fix crash caused by very long (*MARK) or (*THEN) names.

44. A sequence such as [[:punct:]b] that is, a POSIX character class followed
    by a single ASCII character in a class item, was incorrectly compiled in
    UCP mode. The POSIX class got lost, but only if the single character
    followed it.

45. [:punct:] in UCP mode was matching some characters in the range 128-255
    that should not have been matched.

46. If [:^ascii:] or [:^xdigit:] or [:^cntrl:] are present in a non-negated
    class, all characters with code points greater than 255 are in the class.
    When a Unicode property was also in the class (if PCRE_UCP is set, escapes
    such as \w are turned into Unicode properties), wide characters were not
    correctly handled, and could fail to match.


Version 8.37 28-April-2015
--------------------------

1.  When an (*ACCEPT) is triggered inside capturing parentheses, it arranges
    for those parentheses to be closed with whatever has been captured so far.
    However, it was failing to mark any other groups between the hightest
    capture so far and the currrent group as "unset". Thus, the ovector for
    those groups contained whatever was previously there. An example is the
    pattern /(x)|((*ACCEPT))/ when matched against "abcd".

2.  If an assertion condition was quantified with a minimum of zero (an odd
    thing to do, but it happened), SIGSEGV or other misbehaviour could occur.

3.  If a pattern in pcretest input had the P (POSIX) modifier followed by an
    unrecognized modifier, a crash could occur.

4.  An attempt to do global matching in pcretest with a zero-length ovector
    caused a crash.

5.  Fixed a memory leak during matching that could occur for a subpattern
    subroutine call (recursive or otherwise) if the number of captured groups
    that had to be saved was greater than ten.

6.  Catch a bad opcode during auto-possessification after compiling a bad UTF
    string with NO_UTF_CHECK. This is a tidyup, not a bug fix, as passing bad
    UTF with NO_UTF_CHECK is documented as having an undefined outcome.

7.  A UTF pattern containing a "not" match of a non-ASCII character and a
    subroutine reference could loop at compile time. Example: /[^\xff]((?1))/.

8. When a pattern is compiled, it remembers the highest back reference so that
   when matching, if the ovector is too small, extra memory can be obtained to
   use instead. A conditional subpattern whose condition is a check on a
   capture having happened, such as, for example in the pattern
   /^(?:(a)|b)(?(1)A|B)/, is another kind of back reference, but it was not
   setting the highest backreference number. This mattered only if pcre_exec()
   was called with an ovector that was too small to hold the capture, and there
   was no other kind of back reference (a situation which is probably quite
   rare). The effect of the bug was that the condition was always treated as
   FALSE when the capture could not be consulted, leading to a incorrect
   behaviour by pcre_exec(). This bug has been fixed.

9. A reference to a duplicated named group (either a back reference or a test
   for being set in a conditional) that occurred in a part of the pattern where
   PCRE_DUPNAMES was not set caused the amount of memory needed for the pattern
   to be incorrectly calculated, leading to overwriting.

10. A mutually recursive set of back references such as (\2)(\1) caused a
    segfault at study time (while trying to find the minimum matching length).
    The infinite loop is now broken (with the minimum length unset, that is,
    zero).

11. If an assertion that was used as a condition was quantified with a minimum
    of zero, matching went wrong. In particular, if the whole group had
    unlimited repetition and could match an empty string, a segfault was
    likely. The pattern (?(?=0)?)+ is an example that caused this. Perl allows
    assertions to be quantified, but not if they are being used as conditions,
    so the above pattern is faulted by Perl. PCRE has now been changed so that
    it also rejects such patterns.

12. A possessive capturing group such as (a)*+ with a minimum repeat of zero
    failed to allow the zero-repeat case if pcre2_exec() was called with an
    ovector too small to capture the group.

13. Fixed two bugs in pcretest that were discovered by fuzzing and reported by
    Red Hat Product Security:

    (a) A crash if /K and /F were both set with the option to save the compiled
    pattern.

    (b) Another crash if the option to print captured substrings in a callout
    was combined with setting a null ovector, for example \O\C+ as a subject
    string.

14. A pattern such as "((?2){0,1999}())?", which has a group containing a
    forward reference repeated a large (but limited) number of times within a
    repeated outer group that has a zero minimum quantifier, caused incorrect
    code to be compiled, leading to the error "internal error:
    previously-checked referenced subpattern not found" when an incorrect
    memory address was read. This bug was reported as "heap overflow",
    discovered by Kai Lu of Fortinet's FortiGuard Labs and given the CVE number
    CVE-2015-2325.

23. A pattern such as "((?+1)(\1))/" containing a forward reference subroutine
    call within a group that also contained a recursive back reference caused
    incorrect code to be compiled. This bug was reported as "heap overflow",
    discovered by Kai Lu of Fortinet's FortiGuard Labs, and given the CVE
    number CVE-2015-2326.

24. Computing the size of the JIT read-only data in advance has been a source
    of various issues, and new ones are still appear unfortunately. To fix
    existing and future issues, size computation is eliminated from the code,
    and replaced by on-demand memory allocation.

25. A pattern such as /(?i)[A-`]/, where characters in the other case are
    adjacent to the end of the range, and the range contained characters with
    more than one other case, caused incorrect behaviour when compiled in UTF
    mode. In that example, the range a-j was left out of the class.

26. Fix JIT compilation of conditional blocks, which assertion
    is converted to (*FAIL). E.g: /(?(?!))/.

27. The pattern /(?(?!)^)/ caused references to random memory. This bug was
    discovered by the LLVM fuzzer.

28. The assertion (?!) is optimized to (*FAIL). This was not handled correctly
    when this assertion was used as a condition, for example (?(?!)a|b). In
    pcre2_match() it worked by luck; in pcre2_dfa_match() it gave an incorrect
    error about an unsupported item.

29. For some types of pattern, for example /Z*(|d*){216}/, the auto-
    possessification code could take exponential time to complete. A recursion
    depth limit of 1000 has been imposed to limit the resources used by this
    optimization.

30. A pattern such as /(*UTF)[\S\V\H]/, which contains a negated special class
    such as \S in non-UCP mode, explicit wide characters (> 255) can be ignored
    because \S ensures they are all in the class. The code for doing this was
    interacting badly with the code for computing the amount of space needed to
    compile the pattern, leading to a buffer overflow. This bug was discovered
    by the LLVM fuzzer.

31. A pattern such as /((?2)+)((?1))/ which has mutual recursion nested inside
    other kinds of group caused stack overflow at compile time. This bug was
    discovered by the LLVM fuzzer.

32. A pattern such as /(?1)(?#?'){8}(a)/ which had a parenthesized comment
    between a subroutine call and its quantifier was incorrectly compiled,
    leading to buffer overflow or other errors. This bug was discovered by the
    LLVM fuzzer.

33. The illegal pattern /(?(?<E>.*!.*)?)/ was not being diagnosed as missing an
    assertion after (?(. The code was failing to check the character after
    (?(?< for the ! or = that would indicate a lookbehind assertion. This bug
    was discovered by the LLVM fuzzer.

34. A pattern such as /X((?2)()*+){2}+/ which has a possessive quantifier with
    a fixed maximum following a group that contains a subroutine reference was
    incorrectly compiled and could trigger buffer overflow. This bug was
    discovered by the LLVM fuzzer.

35. A mutual recursion within a lookbehind assertion such as (?<=((?2))((?1)))
    caused a stack overflow instead of the diagnosis of a non-fixed length
    lookbehind assertion. This bug was discovered by the LLVM fuzzer.

36. The use of \K in a positive lookbehind assertion in a non-anchored pattern
    (e.g. /(?<=\Ka)/) could make pcregrep loop.

37. There was a similar problem to 36 in pcretest for global matches.

38. If a greedy quantified \X was preceded by \C in UTF mode (e.g. \C\X*),
    and a subsequent item in the pattern caused a non-match, backtracking over
    the repeated \X did not stop, but carried on past the start of the subject,
    causing reference to random memory and/or a segfault. There were also some
    other cases where backtracking after \C could crash. This set of bugs was
    discovered by the LLVM fuzzer.

39. The function for finding the minimum length of a matching string could take
    a very long time if mutual recursion was present many times in a pattern,
    for example, /((?2){73}(?2))((?1))/. A better mutual recursion detection
    method has been implemented. This infelicity was discovered by the LLVM
    fuzzer.

40. Static linking against the PCRE library using the pkg-config module was
    failing on missing pthread symbols.


Version 8.36 26-September-2014
------------------------------

1.  Got rid of some compiler warnings in the C++ modules that were shown up by
    -Wmissing-field-initializers and -Wunused-parameter.

2.  The tests for quantifiers being too big (greater than 65535) were being
    applied after reading the number, and stupidly assuming that integer
    overflow would give a negative number. The tests are now applied as the
    numbers are read.

3.  Tidy code in pcre_exec.c where two branches that used to be different are
    now the same.

4.  The JIT compiler did not generate match limit checks for certain
    bracketed expressions with quantifiers. This may lead to exponential
    backtracking, instead of returning with PCRE_ERROR_MATCHLIMIT. This
    issue should be resolved now.

5.  Fixed an issue, which occures when nested alternatives are optimized
    with table jumps.

6.  Inserted two casts and changed some ints to size_t in the light of some
    reported 64-bit compiler warnings (Bugzilla 1477).

7.  Fixed a bug concerned with zero-minimum possessive groups that could match
    an empty string, which sometimes were behaving incorrectly in the
    interpreter (though correctly in the JIT matcher). This pcretest input is
    an example:

      '\A(?:[^"]++|"(?:[^"]*+|"")*+")++'
      NON QUOTED "QUOT""ED" AFTER "NOT MATCHED

    the interpreter was reporting a match of 'NON QUOTED ' only, whereas the
    JIT matcher and Perl both matched 'NON QUOTED "QUOT""ED" AFTER '. The test
    for an empty string was breaking the inner loop and carrying on at a lower
    level, when possessive repeated groups should always return to a higher
    level as they have no backtrack points in them. The empty string test now
    occurs at the outer level.

8.  Fixed a bug that was incorrectly auto-possessifying \w+ in the pattern
    ^\w+(?>\s*)(?<=\w) which caused it not to match "test test".

9.  Give a compile-time error for \o{} (as Perl does) and for \x{} (which Perl
    doesn't).

10. Change 8.34/15 introduced a bug that caused the amount of memory needed
    to hold a pattern to be incorrectly computed (too small) when there were
    named back references to duplicated names. This could cause "internal
    error: code overflow" or "double free or corruption" or other memory
    handling errors.

11. When named subpatterns had the same prefixes, back references could be
    confused. For example, in this pattern:

      /(?P<Name>a)?(?P<Name2>b)?(?(<Name>)c|d)*l/

    the reference to 'Name' was incorrectly treated as a reference to a
    duplicate name.

12. A pattern such as /^s?c/mi8 where the optional character has more than
    one "other case" was incorrectly compiled such that it would only try to
    match starting at "c".

13. When a pattern starting with \s was studied, VT was not included in the
    list of possible starting characters; this should have been part of the
    8.34/18 patch.

14. If a character class started [\Qx]... where x is any character, the class
    was incorrectly terminated at the ].

15. If a pattern that started with a caseless match for a character with more
    than one "other case" was studied, PCRE did not set up the starting code
    unit bit map for the list of possible characters. Now it does. This is an
    optimization improvement, not a bug fix.

16. The Unicode data tables have been updated to Unicode 7.0.0.

17. Fixed a number of memory leaks in pcregrep.

18. Avoid a compiler warning (from some compilers) for a function call with
    a cast that removes "const" from an lvalue by using an intermediate
    variable (to which the compiler does not object).

19. Incorrect code was compiled if a group that contained an internal recursive
    back reference was optional (had quantifier with a minimum of zero). This
    example compiled incorrect code: /(((a\2)|(a*)\g<-1>))*/ and other examples
    caused segmentation faults because of stack overflows at compile time.

20. A pattern such as /((?(R)a|(?1)))+/, which contains a recursion within a
    group that is quantified with an indefinite repeat, caused a compile-time
    loop which used up all the system stack and provoked a segmentation fault.
    This was not the same bug as 19 above.

21. Add PCRECPP_EXP_DECL declaration to operator<< in pcre_stringpiece.h.
    Patch by Mike Frysinger.


Version 8.35 04-April-2014
--------------------------

1.  A new flag is set, when property checks are present in an XCLASS.
    When this flag is not set, PCRE can perform certain optimizations
    such as studying these XCLASS-es.

2.  The auto-possessification of character sets were improved: a normal
    and an extended character set can be compared now. Furthermore
    the JIT compiler optimizes more character set checks.

3.  Got rid of some compiler warnings for potentially uninitialized variables
    that show up only when compiled with -O2.

4.  A pattern such as (?=ab\K) that uses \K in an assertion can set the start
    of a match later then the end of the match. The pcretest program was not
    handling the case sensibly - it was outputting from the start to the next
    binary zero. It now reports this situation in a message, and outputs the
    text from the end to the start.

5.  Fast forward search is improved in JIT. Instead of the first three
    characters, any three characters with fixed position can be searched.
    Search order: first, last, middle.

6.  Improve character range checks in JIT. Characters are read by an inprecise
    function now, which returns with an unknown value if the character code is
    above a certain threshold (e.g: 256). The only limitation is that the value
    must be bigger than the threshold as well. This function is useful when
    the characters above the threshold are handled in the same way.

7.  The macros whose names start with RAWUCHAR are placeholders for a future
    mode in which only the bottom 21 bits of 32-bit data items are used. To
    make this more memorable for those maintaining the code, the names have
    been changed to start with UCHAR21, and an extensive comment has been added
    to their definition.

8.  Add missing (new) files sljitNativeTILEGX.c and sljitNativeTILEGX-encoder.c
    to the export list in Makefile.am (they were accidentally omitted from the
    8.34 tarball).

9.  The informational output from pcretest used the phrase "starting byte set"
    which is inappropriate for the 16-bit and 32-bit libraries. As the output
    for "first char" and "need char" really means "non-UTF-char", I've changed
    "byte" to "char", and slightly reworded the output. The documentation about
    these values has also been (I hope) clarified.

10. Another JIT related optimization: use table jumps for selecting the correct
    backtracking path, when more than four alternatives are present inside a
    bracket.

11. Empty match is not possible, when the minimum length is greater than zero,
    and there is no \K in the pattern. JIT should avoid empty match checks in
    such cases.

12. In a caseless character class with UCP support, when a character with more
    than one alternative case was not the first character of a range, not all
    the alternative cases were added to the class. For example, s and \x{17f}
    are both alternative cases for S: the class [RST] was handled correctly,
    but [R-T] was not.

13. The configure.ac file always checked for pthread support when JIT was
    enabled. This is not used in Windows, so I have put this test inside a
    check for the presence of windows.h (which was already tested for).

14. Improve pattern prefix search by a simplified Boyer-Moore algorithm in JIT.
    The algorithm provides a way to skip certain starting offsets, and usually
    faster than linear prefix searches.

15. Change 13 for 8.20 updated RunTest to check for the 'fr' locale as well
    as for 'fr_FR' and 'french'. For some reason, however, it then used the
    Windows-specific input and output files, which have 'french' screwed in.
    So this could never have worked. One of the problems with locales is that
    they aren't always the same. I have now updated RunTest so that it checks
    the output of the locale test (test 3) against three different output
    files, and it allows the test to pass if any one of them matches. With luck
    this should make the test pass on some versions of Solaris where it was
    failing. Because of the uncertainty, the script did not used to stop if
    test 3 failed; it now does. If further versions of a French locale ever
    come to light, they can now easily be added.

16. If --with-pcregrep-bufsize was given a non-integer value such as "50K",
    there was a message during ./configure, but it did not stop. This now
    provokes an error. The invalid example in README has been corrected.
    If a value less than the minimum is given, the minimum value has always
    been used, but now a warning is given.

17. If --enable-bsr-anycrlf was set, the special 16/32-bit test failed. This
    was a bug in the test system, which is now fixed. Also, the list of various
    configurations that are tested for each release did not have one with both
    16/32 bits and --enable-bar-anycrlf. It now does.

18. pcretest was missing "-C bsr" for displaying the \R default setting.

19. Little endian PowerPC systems are supported now by the JIT compiler.

20. The fast forward newline mechanism could enter to an infinite loop on
    certain invalid UTF-8 input. Although we don't support these cases
    this issue can be fixed by a performance optimization.

21. Change 33 of 8.34 is not sufficient to ensure stack safety because it does
    not take account if existing stack usage. There is now a new global
    variable called pcre_stack_guard that can be set to point to an external
    function to check stack availability. It is called at the start of
    processing every parenthesized group.

22. A typo in the code meant that in ungreedy mode the max/min qualifier
    behaved like a min-possessive qualifier, and, for example, /a{1,3}b/U did
    not match "ab".

23. When UTF was disabled, the JIT program reported some incorrect compile
    errors. These messages are silenced now.

24. Experimental support for ARM-64 and MIPS-64 has been added to the JIT
    compiler.

25. Change all the temporary files used in RunGrepTest to be different to those
    used by RunTest so that the tests can be run simultaneously, for example by
    "make -j check".


Version 8.34 15-December-2013
-----------------------------

1.  Add pcre[16|32]_jit_free_unused_memory to forcibly free unused JIT
    executable memory. Patch inspired by Carsten Klein.

2.  ./configure --enable-coverage defined SUPPORT_GCOV in config.h, although
    this macro is never tested and has no effect, because the work to support
    coverage involves only compiling and linking options and special targets in
    the Makefile. The comment in config.h implied that defining the macro would
    enable coverage support, which is totally false. There was also support for
    setting this macro in the CMake files (my fault, I just copied it from
    configure). SUPPORT_GCOV has now been removed.

3.  Make a small performance improvement in strlen16() and strlen32() in
    pcretest.

4.  Change 36 for 8.33 left some unreachable statements in pcre_exec.c,
    detected by the Solaris compiler (gcc doesn't seem to be able to diagnose
    these cases). There was also one in pcretest.c.

5.  Cleaned up a "may be uninitialized" compiler warning in pcre_exec.c.

6.  In UTF mode, the code for checking whether a group could match an empty
    string (which is used for indefinitely repeated groups to allow for
    breaking an infinite loop) was broken when the group contained a repeated
    negated single-character class with a character that occupied more than one
    data item and had a minimum repetition of zero (for example, [^\x{100}]* in
    UTF-8 mode). The effect was undefined: the group might or might not be
    deemed as matching an empty string, or the program might have crashed.

7.  The code for checking whether a group could match an empty string was not
    recognizing that \h, \H, \v, \V, and \R must match a character.

8.  Implemented PCRE_INFO_MATCH_EMPTY, which yields 1 if the pattern can match
    an empty string. If it can, pcretest shows this in its information output.

9.  Fixed two related bugs that applied to Unicode extended grapheme clusters
    that were repeated with a maximizing qualifier (e.g. \X* or \X{2,5}) when
    matched by pcre_exec() without using JIT:

    (a) If the rest of the pattern did not match after a maximal run of
        grapheme clusters, the code for backing up to try with fewer of them
        did not always back up over a full grapheme when characters that do not
        have the modifier quality were involved, e.g. Hangul syllables.

    (b) If the match point in a subject started with modifier character, and
        there was no match, the code could incorrectly back up beyond the match
        point, and potentially beyond the first character in the subject,
        leading to a segfault or an incorrect match result.

10. A conditional group with an assertion condition could lead to PCRE
    recording an incorrect first data item for a match if no other first data
    item was recorded. For example, the pattern (?(?=ab)ab) recorded "a" as a
    first data item, and therefore matched "ca" after "c" instead of at the
    start.

11. Change 40 for 8.33 (allowing pcregrep to find empty strings) showed up a
    bug that caused the command "echo a | ./pcregrep -M '|a'" to loop.

12. The source of pcregrep now includes z/OS-specific code so that it can be
    compiled for z/OS as part of the special z/OS distribution.

13. Added the -T and -TM options to pcretest.

14. The code in pcre_compile.c for creating the table of named capturing groups
    has been refactored. Instead of creating the table dynamically during the
    actual compiling pass, the information is remembered during the pre-compile
    pass (on the stack unless there are more than 20 named groups, in which
    case malloc() is used) and the whole table is created before the actual
    compile happens. This has simplified the code (it is now nearly 150 lines
    shorter) and prepared the way for better handling of references to groups
    with duplicate names.

15. A back reference to a named subpattern when there is more than one of the
    same name now checks them in the order in which they appear in the pattern.
    The first one that is set is used for the reference. Previously only the
    first one was inspected. This change makes PCRE more compatible with Perl.

16. Unicode character properties were updated from Unicode 6.3.0.

17. The compile-time code for auto-possessification has been refactored, based
    on a patch by Zoltan Herczeg. It now happens after instead of during
    compilation. The code is cleaner, and more cases are handled. The option
    PCRE_NO_AUTO_POSSESS is added for testing purposes, and the -O and /O
    options in pcretest are provided to set it. It can also be set by
    (*NO_AUTO_POSSESS) at the start of a pattern.

18. The character VT has been added to the default ("C" locale) set of
    characters that match \s and are generally treated as white space,
    following this same change in Perl 5.18. There is now no difference between
    "Perl space" and "POSIX space". Whether VT is treated as white space in
    other locales depends on the locale.

19. The code for checking named groups as conditions, either for being set or
    for being recursed, has been refactored (this is related to 14 and 15
    above). Processing unduplicated named groups should now be as fast at
    numerical groups, and processing duplicated groups should be faster than
    before.

20. Two patches to the CMake build system, by Alexander Barkov:

      (1) Replace the "source" command by "." in CMakeLists.txt because
          "source" is a bash-ism.

      (2) Add missing HAVE_STDINT_H and HAVE_INTTYPES_H to config-cmake.h.in;
          without these the CMake build does not work on Solaris.

21. Perl has changed its handling of \8 and \9. If there is no previously
    encountered capturing group of those numbers, they are treated as the
    literal characters 8 and 9 instead of a binary zero followed by the
    literals. PCRE now does the same.

22. Following Perl, added \o{} to specify codepoints in octal, making it
    possible to specify values greater than 0777 and also making them
    unambiguous.

23. Perl now gives an error for missing closing braces after \x{... instead of
    treating the string as literal. PCRE now does the same.

24. RunTest used to grumble if an inappropriate test was selected explicitly,
    but just skip it when running all tests. This make it awkward to run ranges
    of tests when one of them was inappropriate. Now it just skips any
    inappropriate tests, as it always did when running all tests.

25. If PCRE_AUTO_CALLOUT and PCRE_UCP were set for a pattern that contained
    character types such as \d or \w, too many callouts were inserted, and the
    data that they returned was rubbish.

26. In UCP mode, \s was not matching two of the characters that Perl matches,
    namely NEL (U+0085) and MONGOLIAN VOWEL SEPARATOR (U+180E), though they
    were matched by \h. The code has now been refactored so that the lists of
    the horizontal and vertical whitespace characters used for \h and \v (which
    are defined only in one place) are now also used for \s.

27. Add JIT support for the 64 bit TileGX architecture.
    Patch by Jiong Wang (Tilera Corporation).

28. Possessive quantifiers for classes (both explicit and automatically
    generated) now use special opcodes instead of wrapping in ONCE brackets.

29. Whereas an item such as A{4}+ ignored the possessivenes of the quantifier
    (because it's meaningless), this was not happening when PCRE_CASELESS was
    set. Not wrong, but inefficient.

30. Updated perltest.pl to add /u (force Unicode mode) when /W (use Unicode
    properties for \w, \d, etc) is present in a test regex. Otherwise if the
    test contains no characters greater than 255, Perl doesn't realise it
    should be using Unicode semantics.

31. Upgraded the handling of the POSIX classes [:graph:], [:print:], and
    [:punct:] when PCRE_UCP is set so as to include the same characters as Perl
    does in Unicode mode.

32. Added the "forbid" facility to pcretest so that putting tests into the
    wrong test files can sometimes be quickly detected.

33. There is now a limit (default 250) on the depth of nesting of parentheses.
    This limit is imposed to control the amount of system stack used at compile
    time. It can be changed at build time by --with-parens-nest-limit=xxx or
    the equivalent in CMake.

34. Character classes such as [A-\d] or [a-[:digit:]] now cause compile-time
    errors. Perl warns for these when in warning mode, but PCRE has no facility
    for giving warnings.

35. Change 34 for 8.13 allowed quantifiers on assertions, because Perl does.
    However, this was not working for (?!) because it is optimized to (*FAIL),
    for which PCRE does not allow quantifiers. The optimization is now disabled
    when a quantifier follows (?!). I can't see any use for this, but it makes
    things uniform.

36. Perl no longer allows group names to start with digits, so I have made this
    change also in PCRE. It simplifies the code a bit.

37. In extended mode, Perl ignores spaces before a + that indicates a
    possessive quantifier. PCRE allowed a space before the quantifier, but not
    before the possessive +. It now does.

38. The use of \K (reset reported match start) within a repeated possessive
    group such as (a\Kb)*+ was not working.

40. Document that the same character tables must be used at compile time and
    run time, and that the facility to pass tables to pcre_exec() and
    pcre_dfa_exec() is for use only with saved/restored patterns.

41. Applied Jeff Trawick's patch CMakeLists.txt, which "provides two new
    features for Builds with MSVC:

    1. Support pcre.rc and/or pcreposix.rc (as is already done for MinGW
       builds). The .rc files can be used to set FileDescription and many other
       attributes.

    2. Add an option (-DINSTALL_MSVC_PDB) to enable installation of .pdb files.
       This allows higher-level build scripts which want .pdb files to avoid
       hard-coding the exact files needed."

42. Added support for [[:<:]] and [[:>:]] as used in the BSD POSIX library to
    mean "start of word" and "end of word", respectively, as a transition aid.

43. A minimizing repeat of a class containing codepoints greater than 255 in
    non-UTF 16-bit or 32-bit modes caused an internal error when PCRE was
    compiled to use the heap for recursion.

44. Got rid of some compiler warnings for unused variables when UTF but not UCP
    is configured.


Version 8.33 28-May-2013
------------------------

1.  Added 'U' to some constants that are compared to unsigned integers, to
    avoid compiler signed/unsigned warnings. Added (int) casts to unsigned
    variables that are added to signed variables, to ensure the result is
    signed and can be negated.

2.  Applied patch by Daniel Richard G for quashing MSVC warnings to the
    CMake config files.

3.  Revise the creation of config.h.generic so that all boolean macros are
    #undefined, whereas non-boolean macros are #ifndef/#endif-ed. This makes
    overriding via -D on the command line possible.

4.  Changing the definition of the variable "op" in pcre_exec.c from pcre_uchar
    to unsigned int is reported to make a quite noticeable speed difference in
    a specific Windows environment. Testing on Linux did also appear to show
    some benefit (and it is clearly not harmful). Also fixed the definition of
    Xop which should be unsigned.

5.  Related to (4), changing the definition of the intermediate variable cc
    in repeated character loops from pcre_uchar to pcre_uint32 also gave speed
    improvements.

6.  Fix forward search in JIT when link size is 3 or greater. Also removed some
    unnecessary spaces.

7.  Adjust autogen.sh and configure.ac to lose warnings given by automake 1.12
    and later.

8.  Fix two buffer over read issues in 16 and 32 bit modes. Affects JIT only.

9.  Optimizing fast_forward_start_bits in JIT.

10. Adding support for callouts in JIT, and fixing some issues revealed
    during this work. Namely:

    (a) Unoptimized capturing brackets incorrectly reset on backtrack.

    (b) Minimum length was not checked before the matching is started.

11. The value of capture_last that is passed to callouts was incorrect in some
    cases when there was a capture on one path that was subsequently abandoned
    after a backtrack. Also, the capture_last value is now reset after a
    recursion, since all captures are also reset in this case.

12. The interpreter no longer returns the "too many substrings" error in the
    case when an overflowing capture is in a branch that is subsequently
    abandoned after a backtrack.

13. In the pathological case when an offset vector of size 2 is used, pcretest
    now prints out the matched string after a yield of 0 or 1.

14. Inlining subpatterns in recursions, when certain conditions are fulfilled.
    Only supported by the JIT compiler at the moment.

15. JIT compiler now supports 32 bit Macs thanks to Lawrence Velazquez.

16. Partial matches now set offsets[2] to the "bumpalong" value, that is, the
    offset of the starting point of the matching process, provided the offsets
    vector is large enough.

17. The \A escape now records a lookbehind value of 1, though its execution
    does not actually inspect the previous character. This is to ensure that,
    in partial multi-segment matching, at least one character from the old
    segment is retained when a new segment is processed. Otherwise, if there
    are no lookbehinds in the pattern, \A might match incorrectly at the start
    of a new segment.

18. Added some #ifdef __VMS code into pcretest.c to help VMS implementations.

19. Redefined some pcre_uchar variables in pcre_exec.c as pcre_uint32; this
    gives some modest performance improvement in 8-bit mode.

20. Added the PCRE-specific property \p{Xuc} for matching characters that can
    be expressed in certain programming languages using Universal Character
    Names.

21. Unicode validation has been updated in the light of Unicode Corrigendum #9,
    which points out that "non characters" are not "characters that may not
    appear in Unicode strings" but rather "characters that are reserved for
    internal use and have only local meaning".

22. When a pattern was compiled with automatic callouts (PCRE_AUTO_CALLOUT) and
    there was a conditional group that depended on an assertion, if the
    assertion was false, the callout that immediately followed the alternation
    in the condition was skipped when pcre_exec() was used for matching.

23. Allow an explicit callout to be inserted before an assertion that is the
    condition for a conditional group, for compatibility with automatic
    callouts, which always insert a callout at this point.

24. In 8.31, (*COMMIT) was confined to within a recursive subpattern. Perl also
    confines (*SKIP) and (*PRUNE) in the same way, and this has now been done.

25. (*PRUNE) is now supported by the JIT compiler.

26. Fix infinite loop when /(?<=(*SKIP)ac)a/ is matched against aa.

27. Fix the case where there are two or more SKIPs with arguments that may be
    ignored.

28. (*SKIP) is now supported by the JIT compiler.

29. (*THEN) is now supported by the JIT compiler.

30. Update RunTest with additional test selector options.

31. The way PCRE handles backtracking verbs has been changed in two ways.

    (1) Previously, in something like (*COMMIT)(*SKIP), COMMIT would override
    SKIP. Now, PCRE acts on whichever backtracking verb is reached first by
    backtracking. In some cases this makes it more Perl-compatible, but Perl's
    rather obscure rules do not always do the same thing.

    (2) Previously, backtracking verbs were confined within assertions. This is
    no longer the case for positive assertions, except for (*ACCEPT). Again,
    this sometimes improves Perl compatibility, and sometimes does not.

32. A number of tests that were in test 2 because Perl did things differently
    have been moved to test 1, because either Perl or PCRE has changed, and
    these tests are now compatible.

32. Backtracking control verbs are now handled in the same way in JIT and
    interpreter.

33. An opening parenthesis in a MARK/PRUNE/SKIP/THEN name in a pattern that
    contained a forward subroutine reference caused a compile error.

34. Auto-detect and optimize limited repetitions in JIT.

35. Implement PCRE_NEVER_UTF to lock out the use of UTF, in particular,
    blocking (*UTF) etc.

36. In the interpreter, maximizing pattern repetitions for characters and
    character types now use tail recursion, which reduces stack usage.

37. The value of the max lookbehind was not correctly preserved if a compiled
    and saved regex was reloaded on a host of different endianness.

38. Implemented (*LIMIT_MATCH) and (*LIMIT_RECURSION). As part of the extension
    of the compiled pattern block, expand the flags field from 16 to 32 bits
    because it was almost full.

39. Try madvise first before posix_madvise.

40. Change 7 for PCRE 7.9 made it impossible for pcregrep to find empty lines
    with a pattern such as ^$. It has taken 4 years for anybody to notice! The
    original change locked out all matches of empty strings. This has been
    changed so that one match of an empty string per line is recognized.
    Subsequent searches on the same line (for colouring or for --only-matching,
    for example) do not recognize empty strings.

41. Applied a user patch to fix a number of spelling mistakes in comments.

42. Data lines longer than 65536 caused pcretest to crash.

43. Clarified the data type for length and startoffset arguments for pcre_exec
    and pcre_dfa_exec in the function-specific man pages, where they were
    explicitly stated to be in bytes, never having been updated. I also added
    some clarification to the pcreapi man page.

44. A call to pcre_dfa_exec() with an output vector size less than 2 caused
    a segmentation fault.


Version 8.32 30-November-2012
-----------------------------

1.  Improved JIT compiler optimizations for first character search and single
    character iterators.

2.  Supporting IBM XL C compilers for PPC architectures in the JIT compiler.
    Patch by Daniel Richard G.

3.  Single character iterator optimizations in the JIT compiler.

4.  Improved JIT compiler optimizations for character ranges.

5.  Rename the "leave" variable names to "quit" to improve WinCE compatibility.
    Reported by Giuseppe D'Angelo.

6.  The PCRE_STARTLINE bit, indicating that a match can occur only at the start
    of a line, was being set incorrectly in cases where .* appeared inside
    atomic brackets at the start of a pattern, or where there was a subsequent
    *PRUNE or *SKIP.

7.  Improved instruction cache flush for POWER/PowerPC.
    Patch by Daniel Richard G.

8.  Fixed a number of issues in pcregrep, making it more compatible with GNU
    grep:

    (a) There is now no limit to the number of patterns to be matched.

    (b) An error is given if a pattern is too long.

    (c) Multiple uses of --exclude, --exclude-dir, --include, and --include-dir
        are now supported.

    (d) --exclude-from and --include-from (multiple use) have been added.

    (e) Exclusions and inclusions now apply to all files and directories, not
        just to those obtained from scanning a directory recursively.

    (f) Multiple uses of -f and --file-list are now supported.

    (g) In a Windows environment, the default for -d has been changed from
        "read" (the GNU grep default) to "skip", because otherwise the presence
        of a directory in the file list provokes an error.

    (h) The documentation has been revised and clarified in places.

9.  Improve the matching speed of capturing brackets.

10. Changed the meaning of \X so that it now matches a Unicode extended
    grapheme cluster.

11. Patch by Daniel Richard G to the autoconf files to add a macro for sorting
    out POSIX threads when JIT support is configured.

12. Added support for PCRE_STUDY_EXTRA_NEEDED.

13. In the POSIX wrapper regcomp() function, setting re_nsub field in the preg
    structure could go wrong in environments where size_t is not the same size
    as int.

14. Applied user-supplied patch to pcrecpp.cc to allow PCRE_NO_UTF8_CHECK to be
    set.

15. The EBCDIC support had decayed; later updates to the code had included
    explicit references to (e.g.) \x0a instead of CHAR_LF. There has been a
    general tidy up of EBCDIC-related issues, and the documentation was also
    not quite right. There is now a test that can be run on ASCII systems to
    check some of the EBCDIC-related things (but is it not a full test).

16. The new PCRE_STUDY_EXTRA_NEEDED option is now used by pcregrep, resulting
    in a small tidy to the code.

17. Fix JIT tests when UTF is disabled and both 8 and 16 bit mode are enabled.

18. If the --only-matching (-o) option in pcregrep is specified multiple
    times, each one causes appropriate output. For example, -o1 -o2 outputs the
    substrings matched by the 1st and 2nd capturing parentheses. A separating
    string can be specified by --om-separator (default empty).

19. Improving the first n character searches.

20. Turn case lists for horizontal and vertical white space into macros so that
    they are defined only once.

21. This set of changes together give more compatible Unicode case-folding
    behaviour for characters that have more than one other case when UCP
    support is available.

    (a) The Unicode property table now has offsets into a new table of sets of
        three or more characters that are case-equivalent. The MultiStage2.py
        script that generates these tables (the pcre_ucd.c file) now scans
        CaseFolding.txt instead of UnicodeData.txt for character case
        information.

    (b) The code for adding characters or ranges of characters to a character
        class has been abstracted into a generalized function that also handles
        case-independence. In UTF-mode with UCP support, this uses the new data
        to handle characters with more than one other case.

    (c) A bug that is fixed as a result of (b) is that codepoints less than 256
        whose other case is greater than 256 are now correctly matched
        caselessly. Previously, the high codepoint matched the low one, but not
        vice versa.

    (d) The processing of \h, \H, \v, and \ in character classes now makes use
        of the new class addition function, using character lists defined as
        macros alongside the case definitions of 20 above.

    (e) Caseless back references now work with characters that have more than
        one other case.

    (f) General caseless matching of characters with more than one other case
        is supported.

22. Unicode character properties were updated from Unicode 6.2.0

23. Improved CMake support under Windows. Patch by Daniel Richard G.

24. Add support for 32-bit character strings, and UTF-32

25. Major JIT compiler update (code refactoring and bugfixing).
    Experimental Sparc 32 support is added.

26. Applied a modified version of Daniel Richard G's patch to create
    pcre.h.generic and config.h.generic by "make" instead of in the
    PrepareRelease script.

27. Added a definition for CHAR_NULL (helpful for the z/OS port), and use it in
    pcre_compile.c when checking for a zero character.

28. Introducing a native interface for JIT. Through this interface, the compiled
    machine code can be directly executed. The purpose of this interface is to
    provide fast pattern matching, so several sanity checks are not performed.
    However, feature tests are still performed. The new interface provides
    1.4x speedup compared to the old one.

29. If pcre_exec() or pcre_dfa_exec() was called with a negative value for
    the subject string length, the error given was PCRE_ERROR_BADOFFSET, which
    was confusing. There is now a new error PCRE_ERROR_BADLENGTH for this case.

30. In 8-bit UTF-8 mode, pcretest failed to give an error for data codepoints
    greater than 0x7fffffff (which cannot be represented in UTF-8, even under
    the "old" RFC 2279). Instead, it ended up passing a negative length to
    pcre_exec().

31. Add support for GCC's visibility feature to hide internal functions.

32. Running "pcretest -C pcre8" or "pcretest -C pcre16" gave a spurious error
    "unknown -C option" after outputting 0 or 1.

33. There is now support for generating a code coverage report for the test
    suite in environments where gcc is the compiler and lcov is installed. This
    is mainly for the benefit of the developers.

34. If PCRE is built with --enable-valgrind, certain memory regions are marked
    unaddressable using valgrind annotations, allowing valgrind to detect
    invalid memory accesses. This is mainly for the benefit of the developers.

25. (*UTF) can now be used to start a pattern in any of the three libraries.

26. Give configure error if --enable-cpp but no C++ compiler found.


Version 8.31 06-July-2012
-------------------------

1.  Fixing a wrong JIT test case and some compiler warnings.

2.  Removed a bashism from the RunTest script.

3.  Add a cast to pcre_exec.c to fix the warning "unary minus operator applied
    to unsigned type, result still unsigned" that was given by an MS compiler
    on encountering the code "-sizeof(xxx)".

4.  Partial matching support is added to the JIT compiler.

5.  Fixed several bugs concerned with partial matching of items that consist
    of more than one character:

    (a) /^(..)\1/ did not partially match "aba" because checking references was
        done on an "all or nothing" basis. This also applied to repeated
        references.

    (b) \R did not give a hard partial match if \r was found at the end of the
        subject.

    (c) \X did not give a hard partial match after matching one or more
        characters at the end of the subject.

    (d) When newline was set to CRLF, a pattern such as /a$/ did not recognize
        a partial match for the string "\r".

    (e) When newline was set to CRLF, the metacharacter "." did not recognize
        a partial match for a CR character at the end of the subject string.

6.  If JIT is requested using /S++ or -s++ (instead of just /S+ or -s+) when
    running pcretest, the text "(JIT)" added to the output whenever JIT is
    actually used to run the match.

7.  Individual JIT compile options can be set in pcretest by following -s+[+]
    or /S+[+] with a digit between 1 and 7.

8.  OP_NOT now supports any UTF character not just single-byte ones.

9.  (*MARK) control verb is now supported by the JIT compiler.

10. The command "./RunTest list" lists the available tests without actually
    running any of them. (Because I keep forgetting what they all are.)

11. Add PCRE_INFO_MAXLOOKBEHIND.

12. Applied a (slightly modified) user-supplied patch that improves performance
    when the heap is used for recursion (compiled with --disable-stack-for-
    recursion). Instead of malloc and free for each heap frame each time a
    logical recursion happens, frames are retained on a chain and re-used where
    possible. This sometimes gives as much as 30% improvement.

13. As documented, (*COMMIT) is now confined to within a recursive subpattern
    call.

14. As documented, (*COMMIT) is now confined to within a positive assertion.

15. It is now possible to link pcretest with libedit as an alternative to
    libreadline.

16. (*COMMIT) control verb is now supported by the JIT compiler.

17. The Unicode data tables have been updated to Unicode 6.1.0.

18. Added --file-list option to pcregrep.

19. Added binary file support to pcregrep, including the -a, --binary-files,
    -I, and --text options.

20. The madvise function is renamed for posix_madvise for QNX compatibility
    reasons. Fixed by Giuseppe D'Angelo.

21. Fixed a bug for backward assertions with REVERSE 0 in the JIT compiler.

22. Changed the option for creating symbolic links for 16-bit man pages from
    -s to -sf so that re-installing does not cause issues.

23. Support PCRE_NO_START_OPTIMIZE in JIT as (*MARK) support requires it.

24. Fixed a very old bug in pcretest that caused errors with restarted DFA
    matches in certain environments (the workspace was not being correctly
    retained). Also added to pcre_dfa_exec() a simple plausibility check on
    some of the workspace data at the beginning of a restart.

25. \s*\R was auto-possessifying the \s* when it should not, whereas \S*\R
    was not doing so when it should - probably a typo introduced by SVN 528
    (change 8.10/14).

26. When PCRE_UCP was not set, \w+\x{c4} was incorrectly auto-possessifying the
    \w+ when the character tables indicated that \x{c4} was a word character.
    There were several related cases, all because the tests for doing a table
    lookup were testing for characters less than 127 instead of 255.

27. If a pattern contains capturing parentheses that are not used in a match,
    their slots in the ovector are set to -1. For those that are higher than
    any matched groups, this happens at the end of processing. In the case when
    there were back references that the ovector was too small to contain
    (causing temporary malloc'd memory to be used during matching), and the
    highest capturing number was not used, memory off the end of the ovector
    was incorrectly being set to -1. (It was using the size of the temporary
    memory instead of the true size.)

28. To catch bugs like 27 using valgrind, when pcretest is asked to specify an
    ovector size, it uses memory at the end of the block that it has got.

29. Check for an overlong MARK name and give an error at compile time. The
    limit is 255 for the 8-bit library and 65535 for the 16-bit library.

30. JIT compiler update.

31. JIT is now supported on jailbroken iOS devices. Thanks for Ruiger
    Rill for the patch.

32. Put spaces around SLJIT_PRINT_D in the JIT compiler. Required by CXX11.

33. Variable renamings in the PCRE-JIT compiler. No functionality change.

34. Fixed typos in pcregrep: in two places there was SUPPORT_LIBZ2 instead of
    SUPPORT_LIBBZ2. This caused a build problem when bzip2 but not gzip (zlib)
    was enabled.

35. Improve JIT code generation for greedy plus quantifier.

36. When /((?:a?)*)*c/ or /((?>a?)*)*c/ was matched against "aac", it set group
    1 to "aa" instead of to an empty string. The bug affected repeated groups
    that could potentially match an empty string.

37. Optimizing single character iterators in JIT.

38. Wide characters specified with \uxxxx in JavaScript mode are now subject to
    the same checks as \x{...} characters in non-JavaScript mode. Specifically,
    codepoints that are too big for the mode are faulted, and in a UTF mode,
    disallowed codepoints are also faulted.

39. If PCRE was compiled with UTF support, in three places in the DFA
    matcher there was code that should only have been obeyed in UTF mode, but
    was being obeyed unconditionally. In 8-bit mode this could cause incorrect
    processing when bytes with values greater than 127 were present. In 16-bit
    mode the bug would be provoked by values in the range 0xfc00 to 0xdc00. In
    both cases the values are those that cannot be the first data item in a UTF
    character. The three items that might have provoked this were recursions,
    possessively repeated groups, and atomic groups.

40. Ensure that libpcre is explicitly listed in the link commands for pcretest
    and pcregrep, because some OS require shared objects to be explicitly
    passed to ld, causing the link step to fail if they are not.

41. There were two incorrect #ifdefs in pcre_study.c, meaning that, in 16-bit
    mode, patterns that started with \h* or \R* might be incorrectly matched.


Version 8.30 04-February-2012
-----------------------------

1.  Renamed "isnumber" as "is_a_number" because in some Mac environments this
    name is defined in ctype.h.

2.  Fixed a bug in fixed-length calculation for lookbehinds that would show up
    only in quite long subpatterns.

3.  Removed the function pcre_info(), which has been obsolete and deprecated
    since it was replaced by pcre_fullinfo() in February 2000.

4.  For a non-anchored pattern, if (*SKIP) was given with a name that did not
    match a (*MARK), and the match failed at the start of the subject, a
    reference to memory before the start of the subject could occur. This bug
    was introduced by fix 17 of release 8.21.

5.  A reference to an unset group with zero minimum repetition was giving
    totally wrong answers (in non-JavaScript-compatibility mode). For example,
    /(another)?(\1?)test/ matched against "hello world test". This bug was
    introduced in release 8.13.

6.  Add support for 16-bit character strings (a large amount of work involving
    many changes and refactorings).

7.  RunGrepTest failed on msys because \r\n was replaced by whitespace when the
    command "pattern=`printf 'xxx\r\njkl'`" was run. The pattern is now taken
    from a file.

8.  Ovector size of 2 is also supported by JIT based pcre_exec (the ovector size
    rounding is not applied in this particular case).

9.  The invalid Unicode surrogate codepoints U+D800 to U+DFFF are now rejected
    if they appear, or are escaped, in patterns.

10. Get rid of a number of -Wunused-but-set-variable warnings.

11. The pattern /(?=(*:x))(q|)/ matches an empty string, and returns the mark
    "x". The similar pattern /(?=(*:x))((*:y)q|)/ did not return a mark at all.
    Oddly, Perl behaves the same way. PCRE has been fixed so that this pattern
    also returns the mark "x". This bug applied to capturing parentheses,
    non-capturing parentheses, and atomic parentheses. It also applied to some
    assertions.

12. Stephen Kelly's patch to CMakeLists.txt allows it to parse the version
    information out of configure.ac instead of relying on pcre.h.generic, which
    is not stored in the repository.

13. Applied Dmitry V. Levin's patch for a more portable method for linking with
    -lreadline.

14. ZH added PCRE_CONFIG_JITTARGET; added its output to pcretest -C.

15. Applied Graycode's patch to put the top-level frame on the stack rather
    than the heap when not using the stack for recursion. This gives a
    performance improvement in many cases when recursion is not deep.

16. Experimental code added to "pcretest -C" to output the stack frame size.


Version 8.21 12-Dec-2011
------------------------

1.  Updating the JIT compiler.

2.  JIT compiler now supports OP_NCREF, OP_RREF and OP_NRREF. New test cases
    are added as well.

3.  Fix cache-flush issue on PowerPC (It is still an experimental JIT port).
    PCRE_EXTRA_TABLES is not suported by JIT, and should be checked before
    calling _pcre_jit_exec. Some extra comments are added.

4.  (*MARK) settings inside atomic groups that do not contain any capturing
    parentheses, for example, (?>a(*:m)), were not being passed out. This bug
    was introduced by change 18 for 8.20.

5.  Supporting of \x, \U and \u in JavaScript compatibility mode based on the
    ECMA-262 standard.

6.  Lookbehinds such as (?<=a{2}b) that contained a fixed repetition were
    erroneously being rejected as "not fixed length" if PCRE_CASELESS was set.
    This bug was probably introduced by change 9 of 8.13.

7.  While fixing 6 above, I noticed that a number of other items were being
    incorrectly rejected as "not fixed length". This arose partly because newer
    opcodes had not been added to the fixed-length checking code. I have (a)
    corrected the bug and added tests for these items, and (b) arranged for an
    error to occur if an unknown opcode is encountered while checking for fixed
    length instead of just assuming "not fixed length". The items that were
    rejected were: (*ACCEPT), (*COMMIT), (*FAIL), (*MARK), (*PRUNE), (*SKIP),
    (*THEN), \h, \H, \v, \V, and single character negative classes with fixed
    repetitions, e.g. [^a]{3}, with and without PCRE_CASELESS.

8.  A possessively repeated conditional subpattern such as (?(?=c)c|d)++ was
    being incorrectly compiled and would have given unpredicatble results.

9.  A possessively repeated subpattern with minimum repeat count greater than
    one behaved incorrectly. For example, (A){2,}+ behaved as if it was
    (A)(A)++ which meant that, after a subsequent mismatch, backtracking into
    the first (A) could occur when it should not.

10. Add a cast and remove a redundant test from the code.

11. JIT should use pcre_malloc/pcre_free for allocation.

12. Updated pcre-config so that it no longer shows -L/usr/lib, which seems
    best practice nowadays, and helps with cross-compiling. (If the exec_prefix
    is anything other than /usr, -L is still shown).

13. In non-UTF-8 mode, \C is now supported in lookbehinds and DFA matching.

14. Perl does not support \N without a following name in a [] class; PCRE now
    also gives an error.

15. If a forward reference was repeated with an upper limit of around 2000,
    it caused the error "internal error: overran compiling workspace". The
    maximum number of forward references (including repeats) was limited by the
    internal workspace, and dependent on the LINK_SIZE. The code has been
    rewritten so that the workspace expands (via pcre_malloc) if necessary, and
    the default depends on LINK_SIZE. There is a new upper limit (for safety)
    of around 200,000 forward references. While doing this, I also speeded up
    the filling in of repeated forward references.

16. A repeated forward reference in a pattern such as (a)(?2){2}(.) was
    incorrectly expecting the subject to contain another "a" after the start.

17. When (*SKIP:name) is activated without a corresponding (*MARK:name) earlier
    in the match, the SKIP should be ignored. This was not happening; instead
    the SKIP was being treated as NOMATCH. For patterns such as
    /A(*MARK:A)A+(*SKIP:B)Z|AAC/ this meant that the AAC branch was never
    tested.

18. The behaviour of (*MARK), (*PRUNE), and (*THEN) has been reworked and is
    now much more compatible with Perl, in particular in cases where the result
    is a non-match for a non-anchored pattern. For example, if
    /b(*:m)f|a(*:n)w/ is matched against "abc", the non-match returns the name
    "m", where previously it did not return a name. A side effect of this
    change is that for partial matches, the last encountered mark name is
    returned, as for non matches. A number of tests that were previously not
    Perl-compatible have been moved into the Perl-compatible test files. The
    refactoring has had the pleasing side effect of removing one argument from
    the match() function, thus reducing its stack requirements.

19. If the /S+ option was used in pcretest to study a pattern using JIT,
    subsequent uses of /S (without +) incorrectly behaved like /S+.

21. Retrieve executable code size support for the JIT compiler and fixing
    some warnings.

22. A caseless match of a UTF-8 character whose other case uses fewer bytes did
    not work when the shorter character appeared right at the end of the
    subject string.

23. Added some (int) casts to non-JIT modules to reduce warnings on 64-bit
    systems.

24. Added PCRE_INFO_JITSIZE to pass on the value from (21) above, and also
    output it when the /M option is used in pcretest.

25. The CheckMan script was not being included in the distribution. Also, added
    an explicit "perl" to run Perl scripts from the PrepareRelease script
    because this is reportedly needed in Windows.

26. If study data was being save in a file and studying had not found a set of
    "starts with" bytes for the pattern, the data written to the file (though
    never used) was taken from uninitialized memory and so caused valgrind to
    complain.

27. Updated RunTest.bat as provided by Sheri Pierce.

28. Fixed a possible uninitialized memory bug in pcre_jit_compile.c.

29. Computation of memory usage for the table of capturing group names was
    giving an unnecessarily large value.


Version 8.20 21-Oct-2011
------------------------

1.  Change 37 of 8.13 broke patterns like [:a]...[b:] because it thought it had
    a POSIX class. After further experiments with Perl, which convinced me that
    Perl has bugs and confusions, a closing square bracket is no longer allowed
    in a POSIX name. This bug also affected patterns with classes that started
    with full stops.

2.  If a pattern such as /(a)b|ac/ is matched against "ac", there is no
    captured substring, but while checking the failing first alternative,
    substring 1 is temporarily captured. If the output vector supplied to
    pcre_exec() was not big enough for this capture, the yield of the function
    was still zero ("insufficient space for captured substrings"). This cannot
    be totally fixed without adding another stack variable, which seems a lot
    of expense for a edge case. However, I have improved the situation in cases
    such as /(a)(b)x|abc/ matched against "abc", where the return code
    indicates that fewer than the maximum number of slots in the ovector have
    been set.

3.  Related to (2) above: when there are more back references in a pattern than
    slots in the output vector, pcre_exec() uses temporary memory during
    matching, and copies in the captures as far as possible afterwards. It was
    using the entire output vector, but this conflicts with the specification
    that only 2/3 is used for passing back captured substrings. Now it uses
    only the first 2/3, for compatibility. This is, of course, another edge
    case.

4.  Zoltan Herczeg's just-in-time compiler support has been integrated into the
    main code base, and can be used by building with --enable-jit. When this is
    done, pcregrep automatically uses it unless --disable-pcregrep-jit or the
    runtime --no-jit option is given.

5.  When the number of matches in a pcre_dfa_exec() run exactly filled the
    ovector, the return from the function was zero, implying that there were
    other matches that did not fit. The correct "exactly full" value is now
    returned.

6.  If a subpattern that was called recursively or as a subroutine contained
    (*PRUNE) or any other control that caused it to give a non-standard return,
    invalid errors such as "Error -26 (nested recursion at the same subject
    position)" or even infinite loops could occur.

7.  If a pattern such as /a(*SKIP)c|b(*ACCEPT)|/ was studied, it stopped
    computing the minimum length on reaching *ACCEPT, and so ended up with the
    wrong value of 1 rather than 0. Further investigation indicates that
    computing a minimum subject length in the presence of *ACCEPT is difficult
    (think back references, subroutine calls), and so I have changed the code
    so that no minimum is registered for a pattern that contains *ACCEPT.

8.  If (*THEN) was present in the first (true) branch of a conditional group,
    it was not handled as intended. [But see 16 below.]

9.  Replaced RunTest.bat and CMakeLists.txt with improved versions provided by
    Sheri Pierce.

10. A pathological pattern such as /(*ACCEPT)a/ was miscompiled, thinking that
    the first byte in a match must be "a".

11. Change 17 for 8.13 increased the recursion depth for patterns like
    /a(?:.)*?a/ drastically. I've improved things by remembering whether a
    pattern contains any instances of (*THEN). If it does not, the old
    optimizations are restored. It would be nice to do this on a per-group
    basis, but at the moment that is not feasible.

12. In some environments, the output of pcretest -C is CRLF terminated. This
    broke RunTest's code that checks for the link size. A single white space
    character after the value is now allowed for.

13. RunTest now checks for the "fr" locale as well as for "fr_FR" and "french".
    For "fr", it uses the Windows-specific input and output files.

14. If (*THEN) appeared in a group that was called recursively or as a
    subroutine, it did not work as intended. [But see next item.]

15. Consider the pattern /A (B(*THEN)C) | D/ where A, B, C, and D are complex
    pattern fragments (but not containing any | characters). If A and B are
    matched, but there is a failure in C so that it backtracks to (*THEN), PCRE
    was behaving differently to Perl. PCRE backtracked into A, but Perl goes to
    D. In other words, Perl considers parentheses that do not contain any |
    characters to be part of a surrounding alternative, whereas PCRE was
    treading (B(*THEN)C) the same as (B(*THEN)C|(*FAIL)) -- which Perl handles
    differently. PCRE now behaves in the same way as Perl, except in the case
    of subroutine/recursion calls such as (?1) which have in any case always
    been different (but PCRE had them first :-).

16. Related to 15 above: Perl does not treat the | in a conditional group as
    creating alternatives. Such a group is treated in the same way as an
    ordinary group without any | characters when processing (*THEN). PCRE has
    been changed to match Perl's behaviour.

17. If a user had set PCREGREP_COLO(U)R to something other than 1:31, the
    RunGrepTest script failed.

18. Change 22 for version 13 caused atomic groups to use more stack. This is
    inevitable for groups that contain captures, but it can lead to a lot of
    stack use in large patterns. The old behaviour has been restored for atomic
    groups that do not contain any capturing parentheses.

19. If the PCRE_NO_START_OPTIMIZE option was set for pcre_compile(), it did not
    suppress the check for a minimum subject length at run time. (If it was
    given to pcre_exec() or pcre_dfa_exec() it did work.)

20. Fixed an ASCII-dependent infelicity in pcretest that would have made it
    fail to work when decoding hex characters in data strings in EBCDIC
    environments.

21. It appears that in at least one Mac OS environment, the isxdigit() function
    is implemented as a macro that evaluates to its argument more than once,
    contravening the C 90 Standard (I haven't checked a later standard). There
    was an instance in pcretest which caused it to go wrong when processing
    \x{...} escapes in subject strings. The has been rewritten to avoid using
    things like p++ in the argument of isxdigit().


Version 8.13 16-Aug-2011
------------------------

1.  The Unicode data tables have been updated to Unicode 6.0.0.

2.  Two minor typos in pcre_internal.h have been fixed.

3.  Added #include <string.h> to pcre_scanner_unittest.cc, pcrecpp.cc, and
    pcrecpp_unittest.cc. They are needed for strcmp(), memset(), and strchr()
    in some environments (e.g. Solaris 10/SPARC using Sun Studio 12U2).

4.  There were a number of related bugs in the code for matching backrefences
    caselessly in UTF-8 mode when codes for the characters concerned were
    different numbers of bytes. For example, U+023A and U+2C65 are an upper
    and lower case pair, using 2 and 3 bytes, respectively. The main bugs were:
    (a) A reference to 3 copies of a 2-byte code matched only 2 of a 3-byte
    code. (b) A reference to 2 copies of a 3-byte code would not match 2 of a
    2-byte code at the end of the subject (it thought there wasn't enough data
    left).

5.  Comprehensive information about what went wrong is now returned by
    pcre_exec() and pcre_dfa_exec() when the UTF-8 string check fails, as long
    as the output vector has at least 2 elements. The offset of the start of
    the failing character and a reason code are placed in the vector.

6.  When the UTF-8 string check fails for pcre_compile(), the offset that is
    now returned is for the first byte of the failing character, instead of the
    last byte inspected. This is an incompatible change, but I hope it is small
    enough not to be a problem. It makes the returned offset consistent with
    pcre_exec() and pcre_dfa_exec().

7.  pcretest now gives a text phrase as well as the error number when
    pcre_exec() or pcre_dfa_exec() fails; if the error is a UTF-8 check
    failure, the offset and reason code are output.

8.  When \R was used with a maximizing quantifier it failed to skip backwards
    over a \r\n pair if the subsequent match failed. Instead, it just skipped
    back over a single character (\n). This seems wrong (because it treated the
    two characters as a single entity when going forwards), conflicts with the
    documentation that \R is equivalent to (?>\r\n|\n|...etc), and makes the
    behaviour of \R* different to (\R)*, which also seems wrong. The behaviour
    has been changed.

9.  Some internal refactoring has changed the processing so that the handling
    of the PCRE_CASELESS and PCRE_MULTILINE options is done entirely at compile
    time (the PCRE_DOTALL option was changed this way some time ago: version
    7.7 change 16). This has made it possible to abolish the OP_OPT op code,
    which was always a bit of a fudge. It also means that there is one less
    argument for the match() function, which reduces its stack requirements
    slightly. This change also fixes an incompatibility with Perl: the pattern
    (?i:([^b]))(?1) should not match "ab", but previously PCRE gave a match.

10. More internal refactoring has drastically reduced the number of recursive
    calls to match() for possessively repeated groups such as (abc)++ when
    using pcre_exec().

11. While implementing 10, a number of bugs in the handling of groups were
    discovered and fixed:

    (?<=(a)+) was not diagnosed as invalid (non-fixed-length lookbehind).
    (a|)*(?1) gave a compile-time internal error.
    ((a|)+)+  did not notice that the outer group could match an empty string.
    (^a|^)+   was not marked as anchored.
    (.*a|.*)+ was not marked as matching at start or after a newline.

12. Yet more internal refactoring has removed another argument from the match()
    function. Special calls to this function are now indicated by setting a
    value in a variable in the "match data" data block.

13. Be more explicit in pcre_study() instead of relying on "default" for
    opcodes that mean there is no starting character; this means that when new
    ones are added and accidentally left out of pcre_study(), testing should
    pick them up.

14. The -s option of pcretest has been documented for ages as being an old
    synonym of -m (show memory usage). I have changed it to mean "force study
    for every regex", that is, assume /S for every regex. This is similar to -i
    and -d etc. It's slightly incompatible, but I'm hoping nobody is still
    using it. It makes it easier to run collections of tests with and without
    study enabled, and thereby test pcre_study() more easily. All the standard
    tests are now run with and without -s (but some patterns can be marked as
    "never study" - see 20 below).

15. When (*ACCEPT) was used in a subpattern that was called recursively, the
    restoration of the capturing data to the outer values was not happening
    correctly.

16. If a recursively called subpattern ended with (*ACCEPT) and matched an
    empty string, and PCRE_NOTEMPTY was set, pcre_exec() thought the whole
    pattern had matched an empty string, and so incorrectly returned a no
    match.

17. There was optimizing code for the last branch of non-capturing parentheses,
    and also for the obeyed branch of a conditional subexpression, which used
    tail recursion to cut down on stack usage. Unfortunately, now that there is
    the possibility of (*THEN) occurring in these branches, tail recursion is
    no longer possible because the return has to be checked for (*THEN). These
    two optimizations have therefore been removed. [But see 8.20/11 above.]

18. If a pattern containing \R was studied, it was assumed that \R always
    matched two bytes, thus causing the minimum subject length to be
    incorrectly computed because \R can also match just one byte.

19. If a pattern containing (*ACCEPT) was studied, the minimum subject length
    was incorrectly computed.

20. If /S is present twice on a test pattern in pcretest input, it now
    *disables* studying, thereby overriding the use of -s on the command line
    (see 14 above). This is necessary for one or two tests to keep the output
    identical in both cases.

21. When (*ACCEPT) was used in an assertion that matched an empty string and
    PCRE_NOTEMPTY was set, PCRE applied the non-empty test to the assertion.

22. When an atomic group that contained a capturing parenthesis was
    successfully matched, but the branch in which it appeared failed, the
    capturing was not being forgotten if a higher numbered group was later
    captured. For example, /(?>(a))b|(a)c/ when matching "ac" set capturing
    group 1 to "a", when in fact it should be unset. This applied to multi-
    branched capturing and non-capturing groups, repeated or not, and also to
    positive assertions (capturing in negative assertions does not happen
    in PCRE) and also to nested atomic groups.

23. Add the ++ qualifier feature to pcretest, to show the remainder of the
    subject after a captured substring, to make it easier to tell which of a
    number of identical substrings has been captured.

24. The way atomic groups are processed by pcre_exec() has been changed so that
    if they are repeated, backtracking one repetition now resets captured
    values correctly. For example, if ((?>(a+)b)+aabab) is matched against
    "aaaabaaabaabab" the value of captured group 2 is now correctly recorded as
    "aaa". Previously, it would have been "a". As part of this code
    refactoring, the way recursive calls are handled has also been changed.

25. If an assertion condition captured any substrings, they were not passed
    back unless some other capturing happened later. For example, if
    (?(?=(a))a) was matched against "a", no capturing was returned.

26. When studying a pattern that contained subroutine calls or assertions,
    the code for finding the minimum length of a possible match was handling
    direct recursions such as (xxx(?1)|yyy) but not mutual recursions (where
    group 1 called group 2 while simultaneously a separate group 2 called group
    1). A stack overflow occurred in this case. I have fixed this by limiting
    the recursion depth to 10.

27. Updated RunTest.bat in the distribution to the version supplied by Tom
    Fortmann. This supports explicit test numbers on the command line, and has
    argument validation and error reporting.

28. An instance of \X with an unlimited repeat could fail if at any point the
    first character it looked at was a mark character.

29. Some minor code refactoring concerning Unicode properties and scripts
    should reduce the stack requirement of match() slightly.

30. Added the '=' option to pcretest to check the setting of unused capturing
    slots at the end of the pattern, which are documented as being -1, but are
    not included in the return count.

31. If \k was not followed by a braced, angle-bracketed, or quoted name, PCRE
    compiled something random. Now it gives a compile-time error (as does
    Perl).

32. A *MARK encountered during the processing of a positive assertion is now
    recorded and passed back (compatible with Perl).

33. If --only-matching or --colour was set on a pcregrep call whose pattern
    had alternative anchored branches, the search for a second match in a line
    was done as if at the line start. Thus, for example, /^01|^02/ incorrectly
    matched the line "0102" twice. The same bug affected patterns that started
    with a backwards assertion. For example /\b01|\b02/ also matched "0102"
    twice.

34. Previously, PCRE did not allow quantification of assertions. However, Perl
    does, and because of capturing effects, quantifying parenthesized
    assertions may at times be useful. Quantifiers are now allowed for
    parenthesized assertions.

35. A minor code tidy in pcre_compile() when checking options for \R usage.

36. \g was being checked for fancy things in a character class, when it should
    just be a literal "g".

37. PCRE was rejecting [:a[:digit:]] whereas Perl was not. It seems that the
    appearance of a nested POSIX class supersedes an apparent external class.
    For example, [:a[:digit:]b:] matches "a", "b", ":", or a digit. Also,
    unescaped square brackets may also appear as part of class names. For
    example, [:a[:abc]b:] gives unknown class "[:abc]b:]". PCRE now behaves
    more like Perl. (But see 8.20/1 above.)

38. PCRE was giving an error for \N with a braced quantifier such as {1,} (this
    was because it thought it was \N{name}, which is not supported).

39. Add minix to OS list not supporting the -S option in pcretest.

40. PCRE tries to detect cases of infinite recursion at compile time, but it
    cannot analyze patterns in sufficient detail to catch mutual recursions
    such as ((?1))((?2)). There is now a runtime test that gives an error if a
    subgroup is called recursively as a subpattern for a second time at the
    same position in the subject string. In previous releases this might have
    been caught by the recursion limit, or it might have run out of stack.

41. A pattern such as /(?(R)a+|(?R)b)/ is quite safe, as the recursion can
    happen only once. PCRE was, however incorrectly giving a compile time error
    "recursive call could loop indefinitely" because it cannot analyze the
    pattern in sufficient detail. The compile time test no longer happens when
    PCRE is compiling a conditional subpattern, but actual runaway loops are
    now caught at runtime (see 40 above).

42. It seems that Perl allows any characters other than a closing parenthesis
    to be part of the NAME in (*MARK:NAME) and other backtracking verbs. PCRE
    has been changed to be the same.

43. Updated configure.ac to put in more quoting round AC_LANG_PROGRAM etc. so
    as not to get warnings when autogen.sh is called. Also changed
    AC_PROG_LIBTOOL (deprecated) to LT_INIT (the current macro).

44. To help people who use pcregrep to scan files containing exceedingly long
    lines, the following changes have been made:

    (a) The default value of the buffer size parameter has been increased from
        8K to 20K. (The actual buffer used is three times this size.)

    (b) The default can be changed by ./configure --with-pcregrep-bufsize when
        PCRE is built.

    (c) A --buffer-size=n option has been added to pcregrep, to allow the size
        to be set at run time.

    (d) Numerical values in pcregrep options can be followed by K or M, for
        example --buffer-size=50K.

    (e) If a line being scanned overflows pcregrep's buffer, an error is now
        given and the return code is set to 2.

45. Add a pointer to the latest mark to the callout data block.

46. The pattern /.(*F)/, when applied to "abc" with PCRE_PARTIAL_HARD, gave a
    partial match of an empty string instead of no match. This was specific to
    the use of ".".

47. The pattern /f.*/8s, when applied to "for" with PCRE_PARTIAL_HARD, gave a
    complete match instead of a partial match. This bug was dependent on both
    the PCRE_UTF8 and PCRE_DOTALL options being set.

48. For a pattern such as /\babc|\bdef/ pcre_study() was failing to set up the
    starting byte set, because \b was not being ignored.


Version 8.12 15-Jan-2011
------------------------

1.  Fixed some typos in the markup of the man pages, and wrote a script that
    checks for such things as part of the documentation building process.

2.  On a big-endian 64-bit system, pcregrep did not correctly process the
    --match-limit and --recursion-limit options (added for 8.11). In
    particular, this made one of the standard tests fail. (The integer value
    went into the wrong half of a long int.)

3.  If the --colour option was given to pcregrep with -v (invert match), it
    did strange things, either producing crazy output, or crashing. It should,
    of course, ignore a request for colour when reporting lines that do not
    match.

4.  Another pcregrep bug caused similar problems if --colour was specified with
    -M (multiline) and the pattern match finished with a line ending.

5.  In pcregrep, when a pattern that ended with a literal newline sequence was
    matched in multiline mode, the following line was shown as part of the
    match. This seems wrong, so I have changed it.

6.  Another pcregrep bug in multiline mode, when --colour was specified, caused
    the check for further matches in the same line (so they could be coloured)
    to overrun the end of the current line. If another match was found, it was
    incorrectly shown (and then shown again when found in the next line).

7.  If pcregrep was compiled under Windows, there was a reference to the
    function pcregrep_exit() before it was defined. I am assuming this was
    the cause of the "error C2371: 'pcregrep_exit' : redefinition;" that was
    reported by a user. I've moved the definition above the reference.


Version 8.11 10-Dec-2010
------------------------

1.  (*THEN) was not working properly if there were untried alternatives prior
    to it in the current branch. For example, in ((a|b)(*THEN)(*F)|c..) it
    backtracked to try for "b" instead of moving to the next alternative branch
    at the same level (in this case, to look for "c"). The Perl documentation
    is clear that when (*THEN) is backtracked onto, it goes to the "next
    alternative in the innermost enclosing group".

2.  (*COMMIT) was not overriding (*THEN), as it does in Perl. In a pattern
    such as   (A(*COMMIT)B(*THEN)C|D)  any failure after matching A should
    result in overall failure. Similarly, (*COMMIT) now overrides (*PRUNE) and
    (*SKIP), (*SKIP) overrides (*PRUNE) and (*THEN), and (*PRUNE) overrides
    (*THEN).

3.  If \s appeared in a character class, it removed the VT character from
    the class, even if it had been included by some previous item, for example
    in [\x00-\xff\s]. (This was a bug related to the fact that VT is not part
    of \s, but is part of the POSIX "space" class.)

4.  A partial match never returns an empty string (because you can always
    match an empty string at the end of the subject); however the checking for
    an empty string was starting at the "start of match" point. This has been
    changed to the "earliest inspected character" point, because the returned
    data for a partial match starts at this character. This means that, for
    example, /(?<=abc)def/ gives a partial match for the subject "abc"
    (previously it gave "no match").

5.  Changes have been made to the way PCRE_PARTIAL_HARD affects the matching
    of $, \z, \Z, \b, and \B. If the match point is at the end of the string,
    previously a full match would be given. However, setting PCRE_PARTIAL_HARD
    has an implication that the given string is incomplete (because a partial
    match is preferred over a full match). For this reason, these items now
    give a partial match in this situation. [Aside: previously, the one case
    /t\b/ matched against "cat" with PCRE_PARTIAL_HARD set did return a partial
    match rather than a full match, which was wrong by the old rules, but is
    now correct.]

6.  There was a bug in the handling of #-introduced comments, recognized when
    PCRE_EXTENDED is set, when PCRE_NEWLINE_ANY and PCRE_UTF8 were also set.
    If a UTF-8 multi-byte character included the byte 0x85 (e.g. +U0445, whose
    UTF-8 encoding is 0xd1,0x85), this was misinterpreted as a newline when
    scanning for the end of the comment. (*Character* 0x85 is an "any" newline,
    but *byte* 0x85 is not, in UTF-8 mode). This bug was present in several
    places in pcre_compile().

7.  Related to (6) above, when pcre_compile() was skipping #-introduced
    comments when looking ahead for named forward references to subpatterns,
    the only newline sequence it recognized was NL. It now handles newlines
    according to the set newline convention.

8.  SunOS4 doesn't have strerror() or strtoul(); pcregrep dealt with the
    former, but used strtoul(), whereas pcretest avoided strtoul() but did not
    cater for a lack of strerror(). These oversights have been fixed.

9.  Added --match-limit and --recursion-limit to pcregrep.

10. Added two casts needed to build with Visual Studio when NO_RECURSE is set.

11. When the -o option was used, pcregrep was setting a return code of 1, even
    when matches were found, and --line-buffered was not being honoured.

12. Added an optional parentheses number to the -o and --only-matching options
    of pcregrep.

13. Imitating Perl's /g action for multiple matches is tricky when the pattern
    can match an empty string. The code to do it in pcretest and pcredemo
    needed fixing:

    (a) When the newline convention was "crlf", pcretest got it wrong, skipping
        only one byte after an empty string match just before CRLF (this case
        just got forgotten; "any" and "anycrlf" were OK).

    (b) The pcretest code also had a bug, causing it to loop forever in UTF-8
        mode when an empty string match preceded an ASCII character followed by
        a non-ASCII character. (The code for advancing by one character rather
        than one byte was nonsense.)

    (c) The pcredemo.c sample program did not have any code at all to handle
        the cases when CRLF is a valid newline sequence.

14. Neither pcre_exec() nor pcre_dfa_exec() was checking that the value given
    as a starting offset was within the subject string. There is now a new
    error, PCRE_ERROR_BADOFFSET, which is returned if the starting offset is
    negative or greater than the length of the string. In order to test this,
    pcretest is extended to allow the setting of negative starting offsets.

15. In both pcre_exec() and pcre_dfa_exec() the code for checking that the
    starting offset points to the beginning of a UTF-8 character was
    unnecessarily clumsy. I tidied it up.

16. Added PCRE_ERROR_SHORTUTF8 to make it possible to distinguish between a
    bad UTF-8 sequence and one that is incomplete when using PCRE_PARTIAL_HARD.

17. Nobody had reported that the --include_dir option, which was added in
    release 7.7 should have been called --include-dir (hyphen, not underscore)
    for compatibility with GNU grep. I have changed it to --include-dir, but
    left --include_dir as an undocumented synonym, and the same for
    --exclude-dir, though that is not available in GNU grep, at least as of
    release 2.5.4.

18. At a user's suggestion, the macros GETCHAR and friends (which pick up UTF-8
    characters from a string of bytes) have been redefined so as not to use
    loops, in order to improve performance in some environments. At the same
    time, I abstracted some of the common code into auxiliary macros to save
    repetition (this should not affect the compiled code).

19. If \c was followed by a multibyte UTF-8 character, bad things happened. A
    compile-time error is now given if \c is not followed by an ASCII
    character, that is, a byte less than 128. (In EBCDIC mode, the code is
    different, and any byte value is allowed.)

20. Recognize (*NO_START_OPT) at the start of a pattern to set the PCRE_NO_
    START_OPTIMIZE option, which is now allowed at compile time - but just
    passed through to pcre_exec() or pcre_dfa_exec(). This makes it available
    to pcregrep and other applications that have no direct access to PCRE
    options. The new /Y option in pcretest sets this option when calling
    pcre_compile().

21. Change 18 of release 8.01 broke the use of named subpatterns for recursive
    back references. Groups containing recursive back references were forced to
    be atomic by that change, but in the case of named groups, the amount of
    memory required was incorrectly computed, leading to "Failed: internal
    error: code overflow". This has been fixed.

22. Some patches to pcre_stringpiece.h, pcre_stringpiece_unittest.cc, and
    pcretest.c, to avoid build problems in some Borland environments.


Version 8.10 25-Jun-2010
------------------------

1.  Added support for (*MARK:ARG) and for ARG additions to PRUNE, SKIP, and
    THEN.

2.  (*ACCEPT) was not working when inside an atomic group.

3.  Inside a character class, \B is treated as a literal by default, but
    faulted if PCRE_EXTRA is set. This mimics Perl's behaviour (the -w option
    causes the error). The code is unchanged, but I tidied the documentation.

4.  Inside a character class, PCRE always treated \R and \X as literals,
    whereas Perl faults them if its -w option is set. I have changed PCRE so
    that it faults them when PCRE_EXTRA is set.

5.  Added support for \N, which always matches any character other than
    newline. (It is the same as "." when PCRE_DOTALL is not set.)

6.  When compiling pcregrep with newer versions of gcc which may have
    FORTIFY_SOURCE set, several warnings "ignoring return value of 'fwrite',
    declared with attribute warn_unused_result" were given. Just casting the
    result to (void) does not stop the warnings; a more elaborate fudge is
    needed. I've used a macro to implement this.

7.  Minor change to pcretest.c to avoid a compiler warning.

8.  Added four artifical Unicode properties to help with an option to make
    \s etc use properties (see next item). The new properties are: Xan
    (alphanumeric), Xsp (Perl space), Xps (POSIX space), and Xwd (word).

9.  Added PCRE_UCP to make \b, \d, \s, \w, and certain POSIX character classes
    use Unicode properties. (*UCP) at the start of a pattern can be used to set
    this option. Modified pcretest to add /W to test this facility. Added
    REG_UCP to make it available via the POSIX interface.

10. Added --line-buffered to pcregrep.

11. In UTF-8 mode, if a pattern that was compiled with PCRE_CASELESS was
    studied, and the match started with a letter with a code point greater than
    127 whose first byte was different to the first byte of the other case of
    the letter, the other case of this starting letter was not recognized
    (#976).

12. If a pattern that was studied started with a repeated Unicode property
    test, for example, \p{Nd}+, there was the theoretical possibility of
    setting up an incorrect bitmap of starting bytes, but fortunately it could
    not have actually happened in practice until change 8 above was made (it
    added property types that matched character-matching opcodes).

13. pcre_study() now recognizes \h, \v, and \R when constructing a bit map of
    possible starting bytes for non-anchored patterns.

14. Extended the "auto-possessify" feature of pcre_compile(). It now recognizes
    \R, and also a number of cases that involve Unicode properties, both
    explicit and implicit when PCRE_UCP is set.

15. If a repeated Unicode property match (e.g. \p{Lu}*) was used with non-UTF-8
    input, it could crash or give wrong results if characters with values
    greater than 0xc0 were present in the subject string. (Detail: it assumed
    UTF-8 input when processing these items.)

16. Added a lot of (int) casts to avoid compiler warnings in systems where
    size_t is 64-bit (#991).

17. Added a check for running out of memory when PCRE is compiled with
    --disable-stack-for-recursion (#990).

18. If the last data line in a file for pcretest does not have a newline on
    the end, a newline was missing in the output.

19. The default pcre_chartables.c file recognizes only ASCII characters (values
    less than 128) in its various bitmaps. However, there is a facility for
    generating tables according to the current locale when PCRE is compiled. It
    turns out that in some environments, 0x85 and 0xa0, which are Unicode space
    characters, are recognized by isspace() and therefore were getting set in
    these tables, and indeed these tables seem to approximate to ISO 8859. This
    caused a problem in UTF-8 mode when pcre_study() was used to create a list
    of bytes that can start a match. For \s, it was including 0x85 and 0xa0,
    which of course cannot start UTF-8 characters. I have changed the code so
    that only real ASCII characters (less than 128) and the correct starting
    bytes for UTF-8 encodings are set for characters greater than 127 when in
    UTF-8 mode. (When PCRE_UCP is set - see 9 above - the code is different
    altogether.)

20. Added the /T option to pcretest so as to be able to run tests with non-
    standard character tables, thus making it possible to include the tests
    used for 19 above in the standard set of tests.

21. A pattern such as (?&t)(?#()(?(DEFINE)(?<t>a)) which has a forward
    reference to a subpattern the other side of a comment that contains an
    opening parenthesis caused either an internal compiling error, or a
    reference to the wrong subpattern.


Version 8.02 19-Mar-2010
------------------------

1.  The Unicode data tables have been updated to Unicode 5.2.0.

2.  Added the option --libs-cpp to pcre-config, but only when C++ support is
    configured.

3.  Updated the licensing terms in the pcregexp.pas file, as agreed with the
    original author of that file, following a query about its status.

4.  On systems that do not have stdint.h (e.g. Solaris), check for and include
    inttypes.h instead. This fixes a bug that was introduced by change 8.01/8.

5.  A pattern such as (?&t)*+(?(DEFINE)(?<t>.)) which has a possessive
    quantifier applied to a forward-referencing subroutine call, could compile
    incorrect code or give the error "internal error: previously-checked
    referenced subpattern not found".

6.  Both MS Visual Studio and Symbian OS have problems with initializing
    variables to point to external functions. For these systems, therefore,
    pcre_malloc etc. are now initialized to local functions that call the
    relevant global functions.

7.  There were two entries missing in the vectors called coptable and poptable
    in pcre_dfa_exec.c. This could lead to memory accesses outsize the vectors.
    I've fixed the data, and added a kludgy way of testing at compile time that
    the lengths are correct (equal to the number of opcodes).

8.  Following on from 7, I added a similar kludge to check the length of the
    eint vector in pcreposix.c.

9.  Error texts for pcre_compile() are held as one long string to avoid too
    much relocation at load time. To find a text, the string is searched,
    counting zeros. There was no check for running off the end of the string,
    which could happen if a new error number was added without updating the
    string.

10. \K gave a compile-time error if it appeared in a lookbehind assersion.

11. \K was not working if it appeared in an atomic group or in a group that
    was called as a "subroutine", or in an assertion. Perl 5.11 documents that
    \K is "not well defined" if used in an assertion. PCRE now accepts it if
    the assertion is positive, but not if it is negative.

12. Change 11 fortuitously reduced the size of the stack frame used in the
    "match()" function of pcre_exec.c by one pointer. Forthcoming
    implementation of support for (*MARK) will need an extra pointer on the
    stack; I have reserved it now, so that the stack frame size does not
    decrease.

13. A pattern such as (?P<L1>(?P<L2>0)|(?P>L2)(?P>L1)) in which the only other
    item in branch that calls a recursion is a subroutine call - as in the
    second branch in the above example - was incorrectly given the compile-
    time error "recursive call could loop indefinitely" because pcre_compile()
    was not correctly checking the subroutine for matching a non-empty string.

14. The checks for overrunning compiling workspace could trigger after an
    overrun had occurred. This is a "should never occur" error, but it can be
    triggered by pathological patterns such as hundreds of nested parentheses.
    The checks now trigger 100 bytes before the end of the workspace.

15. Fix typo in configure.ac: "srtoq" should be "strtoq".


Version 8.01 19-Jan-2010
------------------------

1.  If a pattern contained a conditional subpattern with only one branch (in
    particular, this includes all (*DEFINE) patterns), a call to pcre_study()
    computed the wrong minimum data length (which is of course zero for such
    subpatterns). This could cause incorrect "no match" results.

2.  For patterns such as (?i)a(?-i)b|c where an option setting at the start of
    the pattern is reset in the first branch, pcre_compile() failed with
    "internal error: code overflow at offset...". This happened only when
    the reset was to the original external option setting. (An optimization
    abstracts leading options settings into an external setting, which was the
    cause of this.)

3.  A pattern such as ^(?!a(*SKIP)b) where a negative assertion contained one
    of the verbs SKIP, PRUNE, or COMMIT, did not work correctly. When the
    assertion pattern did not match (meaning that the assertion was true), it
    was incorrectly treated as false if the SKIP had been reached during the
    matching. This also applied to assertions used as conditions.

4.  If an item that is not supported by pcre_dfa_exec() was encountered in an
    assertion subpattern, including such a pattern used as a condition,
    unpredictable results occurred, instead of the error return
    PCRE_ERROR_DFA_UITEM.

5.  The C++ GlobalReplace function was not working like Perl for the special
    situation when an empty string is matched. It now does the fancy magic
    stuff that is necessary.

6.  In pcre_internal.h, obsolete includes to setjmp.h and stdarg.h have been
    removed. (These were left over from very, very early versions of PCRE.)

7.  Some cosmetic changes to the code to make life easier when compiling it
    as part of something else:

    (a) Change DEBUG to PCRE_DEBUG.

    (b) In pcre_compile(), rename the member of the "branch_chain" structure
        called "current" as "current_branch", to prevent a collision with the
        Linux macro when compiled as a kernel module.

    (c) In pcre_study(), rename the function set_bit() as set_table_bit(), to
        prevent a collision with the Linux macro when compiled as a kernel
        module.

8.  In pcre_compile() there are some checks for integer overflows that used to
    cast potentially large values to (double). This has been changed to that
    when building, a check for int64_t is made, and if it is found, it is used
    instead, thus avoiding the use of floating point arithmetic. (There is no
    other use of FP in PCRE.) If int64_t is not found, the fallback is to
    double.

9.  Added two casts to avoid signed/unsigned warnings from VS Studio Express
    2005 (difference between two addresses compared to an unsigned value).

10. Change the standard AC_CHECK_LIB test for libbz2 in configure.ac to a
    custom one, because of the following reported problem in Windows:

      - libbz2 uses the Pascal calling convention (WINAPI) for the functions
          under Win32.
      - The standard autoconf AC_CHECK_LIB fails to include "bzlib.h",
          therefore missing the function definition.
      - The compiler thus generates a "C" signature for the test function.
      - The linker fails to find the "C" function.
      - PCRE fails to configure if asked to do so against libbz2.

11. When running libtoolize from libtool-2.2.6b as part of autogen.sh, these
    messages were output:

      Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and
      rerunning libtoolize, to keep the correct libtool macros in-tree.
      Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am.

    I have done both of these things.

12. Although pcre_dfa_exec() does not use nearly as much stack as pcre_exec()
    most of the time, it *can* run out if it is given a pattern that contains a
    runaway infinite recursion. I updated the discussion in the pcrestack man
    page.

13. Now that we have gone to the x.xx style of version numbers, the minor
    version may start with zero. Using 08 or 09 is a bad idea because users
    might check the value of PCRE_MINOR in their code, and 08 or 09 may be
    interpreted as invalid octal numbers. I've updated the previous comment in
    configure.ac, and also added a check that gives an error if 08 or 09 are
    used.

14. Change 8.00/11 was not quite complete: code had been accidentally omitted,
    causing partial matching to fail when the end of the subject matched \W
    in a UTF-8 pattern where \W was quantified with a minimum of 3.

15. There were some discrepancies between the declarations in pcre_internal.h
    of _pcre_is_newline(), _pcre_was_newline(), and _pcre_valid_utf8() and
    their definitions. The declarations used "const uschar *" and the
    definitions used USPTR. Even though USPTR is normally defined as "const
    unsigned char *" (and uschar is typedeffed as "unsigned char"), it was
    reported that: "This difference in casting confuses some C++ compilers, for
    example, SunCC recognizes above declarations as different functions and
    generates broken code for hbpcre." I have changed the declarations to use
    USPTR.

16. GNU libtool is named differently on some systems. The autogen.sh script now
    tries several variants such as glibtoolize (MacOSX) and libtoolize1x
    (FreeBSD).

17. Applied Craig's patch that fixes an HP aCC compile error in pcre 8.00
    (strtoXX undefined when compiling pcrecpp.cc). The patch contains this
    comment: "Figure out how to create a longlong from a string: strtoll and
    equivalent. It's not enough to call AC_CHECK_FUNCS: hpux has a strtoll, for
    instance, but it only takes 2 args instead of 3!"

18. A subtle bug concerned with back references has been fixed by a change of
    specification, with a corresponding code fix. A pattern such as
    ^(xa|=?\1a)+$ which contains a back reference inside the group to which it
    refers, was giving matches when it shouldn't. For example, xa=xaaa would
    match that pattern. Interestingly, Perl (at least up to 5.11.3) has the
    same bug. Such groups have to be quantified to be useful, or contained
    inside another quantified group. (If there's no repetition, the reference
    can never match.) The problem arises because, having left the group and
    moved on to the rest of the pattern, a later failure that backtracks into
    the group uses the captured value from the final iteration of the group
    rather than the correct earlier one. I have fixed this in PCRE by forcing
    any group that contains a reference to itself to be an atomic group; that
    is, there cannot be any backtracking into it once it has completed. This is
    similar to recursive and subroutine calls.


Version 8.00 19-Oct-09
----------------------

1.  The table for translating pcre_compile() error codes into POSIX error codes
    was out-of-date, and there was no check on the pcre_compile() error code
    being within the table. This could lead to an OK return being given in
    error.

2.  Changed the call to open a subject file in pcregrep from fopen(pathname,
    "r") to fopen(pathname, "rb"), which fixed a problem with some of the tests
    in a Windows environment.

3.  The pcregrep --count option prints the count for each file even when it is
    zero, as does GNU grep. However, pcregrep was also printing all files when
    --files-with-matches was added. Now, when both options are given, it prints
    counts only for those files that have at least one match. (GNU grep just
    prints the file name in this circumstance, but including the count seems
    more useful - otherwise, why use --count?) Also ensured that the
    combination -clh just lists non-zero counts, with no names.

4.  The long form of the pcregrep -F option was incorrectly implemented as
    --fixed_strings instead of --fixed-strings. This is an incompatible change,
    but it seems right to fix it, and I didn't think it was worth preserving
    the old behaviour.

5.  The command line items --regex=pattern and --regexp=pattern were not
    recognized by pcregrep, which required --regex pattern or --regexp pattern
    (with a space rather than an '='). The man page documented the '=' forms,
    which are compatible with GNU grep; these now work.

6.  No libpcreposix.pc file was created for pkg-config; there was just
    libpcre.pc and libpcrecpp.pc. The omission has been rectified.

7.  Added #ifndef SUPPORT_UCP into the pcre_ucd.c module, to reduce its size
    when UCP support is not needed, by modifying the Python script that
    generates it from Unicode data files. This should not matter if the module
    is correctly used as a library, but I received one complaint about 50K of
    unwanted data. My guess is that the person linked everything into his
    program rather than using a library. Anyway, it does no harm.

8.  A pattern such as /\x{123}{2,2}+/8 was incorrectly compiled; the trigger
    was a minimum greater than 1 for a wide character in a possessive
    repetition. The same bug could also affect patterns like /(\x{ff}{0,2})*/8
    which had an unlimited repeat of a nested, fixed maximum repeat of a wide
    character. Chaos in the form of incorrect output or a compiling loop could
    result.

9.  The restrictions on what a pattern can contain when partial matching is
    requested for pcre_exec() have been removed. All patterns can now be
    partially matched by this function. In addition, if there are at least two
    slots in the offset vector, the offset of the earliest inspected character
    for the match and the offset of the end of the subject are set in them when
    PCRE_ERROR_PARTIAL is returned.

10. Partial matching has been split into two forms: PCRE_PARTIAL_SOFT, which is
    synonymous with PCRE_PARTIAL, for backwards compatibility, and
    PCRE_PARTIAL_HARD, which causes a partial match to supersede a full match,
    and may be more useful for multi-segment matching.

11. Partial matching with pcre_exec() is now more intuitive. A partial match
    used to be given if ever the end of the subject was reached; now it is
    given only if matching could not proceed because another character was
    needed. This makes a difference in some odd cases such as Z(*FAIL) with the
    string "Z", which now yields "no match" instead of "partial match". In the
    case of pcre_dfa_exec(), "no match" is given if every matching path for the
    final character ended with (*FAIL).

12. Restarting a match using pcre_dfa_exec() after a partial match did not work
    if the pattern had a "must contain" character that was already found in the
    earlier partial match, unless partial matching was again requested. For
    example, with the pattern /dog.(body)?/, the "must contain" character is
    "g". If the first part-match was for the string "dog", restarting with
    "sbody" failed. This bug has been fixed.

13. The string returned by pcre_dfa_exec() after a partial match has been
    changed so that it starts at the first inspected character rather than the
    first character of the match. This makes a difference only if the pattern
    starts with a lookbehind assertion or \b or \B (\K is not supported by
    pcre_dfa_exec()). It's an incompatible change, but it makes the two
    matching functions compatible, and I think it's the right thing to do.

14. Added a pcredemo man page, created automatically from the pcredemo.c file,
    so that the demonstration program is easily available in environments where
    PCRE has not been installed from source.

15. Arranged to add -DPCRE_STATIC to cflags in libpcre.pc, libpcreposix.cp,
    libpcrecpp.pc and pcre-config when PCRE is not compiled as a shared
    library.

16. Added REG_UNGREEDY to the pcreposix interface, at the request of a user.
    It maps to PCRE_UNGREEDY. It is not, of course, POSIX-compatible, but it
    is not the first non-POSIX option to be added. Clearly some people find
    these options useful.

17. If a caller to the POSIX matching function regexec() passes a non-zero
    value for nmatch with a NULL value for pmatch, the value of
    nmatch is forced to zero.

18. RunGrepTest did not have a test for the availability of the -u option of
    the diff command, as RunTest does. It now checks in the same way as
    RunTest, and also checks for the -b option.

19. If an odd number of negated classes containing just a single character
    interposed, within parentheses, between a forward reference to a named
    subpattern and the definition of the subpattern, compilation crashed with
    an internal error, complaining that it could not find the referenced
    subpattern. An example of a crashing pattern is /(?&A)(([^m])(?<A>))/.
    [The bug was that it was starting one character too far in when skipping
    over the character class, thus treating the ] as data rather than
    terminating the class. This meant it could skip too much.]

20. Added PCRE_NOTEMPTY_ATSTART in order to be able to correctly implement the
    /g option in pcretest when the pattern contains \K, which makes it possible
    to have an empty string match not at the start, even when the pattern is
    anchored. Updated pcretest and pcredemo to use this option.

21. If the maximum number of capturing subpatterns in a recursion was greater
    than the maximum at the outer level, the higher number was returned, but
    with unset values at the outer level. The correct (outer level) value is
    now given.

22. If (*ACCEPT) appeared inside capturing parentheses, previous releases of
    PCRE did not set those parentheses (unlike Perl). I have now found a way to
    make it do so. The string so far is captured, making this feature
    compatible with Perl.

23. The tests have been re-organized, adding tests 11 and 12, to make it
    possible to check the Perl 5.10 features against Perl 5.10.

24. Perl 5.10 allows subroutine calls in lookbehinds, as long as the subroutine
    pattern matches a fixed length string. PCRE did not allow this; now it
    does. Neither allows recursion.

25. I finally figured out how to implement a request to provide the minimum
    length of subject string that was needed in order to match a given pattern.
    (It was back references and recursion that I had previously got hung up
    on.) This code has now been added to pcre_study(); it finds a lower bound
    to the length of subject needed. It is not necessarily the greatest lower
    bound, but using it to avoid searching strings that are too short does give
    some useful speed-ups. The value is available to calling programs via
    pcre_fullinfo().

26. While implementing 25, I discovered to my embarrassment that pcretest had
    not been passing the result of pcre_study() to pcre_dfa_exec(), so the
    study optimizations had never been tested with that matching function.
    Oops. What is worse, even when it was passed study data, there was a bug in
    pcre_dfa_exec() that meant it never actually used it. Double oops. There
    were also very few tests of studied patterns with pcre_dfa_exec().

27. If (?| is used to create subpatterns with duplicate numbers, they are now
    allowed to have the same name, even if PCRE_DUPNAMES is not set. However,
    on the other side of the coin, they are no longer allowed to have different
    names, because these cannot be distinguished in PCRE, and this has caused
    confusion. (This is a difference from Perl.)

28. When duplicate subpattern names are present (necessarily with different
    numbers, as required by 27 above), and a test is made by name in a
    conditional pattern, either for a subpattern having been matched, or for
    recursion in such a pattern, all the associated numbered subpatterns are
    tested, and the overall condition is true if the condition is true for any
    one of them. This is the way Perl works, and is also more like the way
    testing by number works.


Version 7.9 11-Apr-09
---------------------

1.  When building with support for bzlib/zlib (pcregrep) and/or readline
    (pcretest), all targets were linked against these libraries. This included
    libpcre, libpcreposix, and libpcrecpp, even though they do not use these
    libraries. This caused unwanted dependencies to be created. This problem
    has been fixed, and now only pcregrep is linked with bzlib/zlib and only
    pcretest is linked with readline.

2.  The "typedef int BOOL" in pcre_internal.h that was included inside the
    "#ifndef FALSE" condition by an earlier change (probably 7.8/18) has been
    moved outside it again, because FALSE and TRUE are already defined in AIX,
    but BOOL is not.

3.  The pcre_config() function was treating the PCRE_MATCH_LIMIT and
    PCRE_MATCH_LIMIT_RECURSION values as ints, when they should be long ints.

4.  The pcregrep documentation said spaces were inserted as well as colons (or
    hyphens) following file names and line numbers when outputting matching
    lines. This is not true; no spaces are inserted. I have also clarified the
    wording for the --colour (or --color) option.

5.  In pcregrep, when --colour was used with -o, the list of matching strings
    was not coloured; this is different to GNU grep, so I have changed it to be
    the same.

6.  When --colo(u)r was used in pcregrep, only the first matching substring in
    each matching line was coloured. Now it goes on to look for further matches
    of any of the test patterns, which is the same behaviour as GNU grep.

7.  A pattern that could match an empty string could cause pcregrep to loop; it
    doesn't make sense to accept an empty string match in pcregrep, so I have
    locked it out (using PCRE's PCRE_NOTEMPTY option). By experiment, this
    seems to be how GNU grep behaves. [But see later change 40 for release
    8.33.]

8.  The pattern (?(?=.*b)b|^) was incorrectly compiled as "match must be at
    start or after a newline", because the conditional assertion was not being
    correctly handled. The rule now is that both the assertion and what follows
    in the first alternative must satisfy the test.

9.  If auto-callout was enabled in a pattern with a conditional group whose
    condition was an assertion, PCRE could crash during matching, both with
    pcre_exec() and pcre_dfa_exec().

10. The PCRE_DOLLAR_ENDONLY option was not working when pcre_dfa_exec() was
    used for matching.

11. Unicode property support in character classes was not working for
    characters (bytes) greater than 127 when not in UTF-8 mode.

12. Added the -M command line option to pcretest.

14. Added the non-standard REG_NOTEMPTY option to the POSIX interface.

15. Added the PCRE_NO_START_OPTIMIZE match-time option.

16. Added comments and documentation about mis-use of no_arg in the C++
    wrapper.

17. Implemented support for UTF-8 encoding in EBCDIC environments, a patch
    from Martin Jerabek that uses macro names for all relevant character and
    string constants.

18. Added to pcre_internal.h two configuration checks: (a) If both EBCDIC and
    SUPPORT_UTF8 are set, give an error; (b) If SUPPORT_UCP is set without
    SUPPORT_UTF8, define SUPPORT_UTF8. The "configure" script handles both of
    these, but not everybody uses configure.

19. A conditional group that had only one branch was not being correctly
    recognized as an item that could match an empty string. This meant that an
    enclosing group might also not be so recognized, causing infinite looping
    (and probably a segfault) for patterns such as ^"((?(?=[a])[^"])|b)*"$
    with the subject "ab", where knowledge that the repeated group can match
    nothing is needed in order to break the loop.

20. If a pattern that was compiled with callouts was matched using pcre_dfa_
    exec(), but without supplying a callout function, matching went wrong.

21. If PCRE_ERROR_MATCHLIMIT occurred during a recursion, there was a memory
    leak if the size of the offset vector was greater than 30. When the vector
    is smaller, the saved offsets during recursion go onto a local stack
    vector, but for larger vectors malloc() is used. It was failing to free
    when the recursion yielded PCRE_ERROR_MATCH_LIMIT (or any other "abnormal"
    error, in fact).

22. There was a missing #ifdef SUPPORT_UTF8 round one of the variables in the
    heapframe that is used only when UTF-8 support is enabled. This caused no
    problem, but was untidy.

23. Steven Van Ingelgem's patch to CMakeLists.txt to change the name
    CMAKE_BINARY_DIR to PROJECT_BINARY_DIR so that it works when PCRE is
    included within another project.

24. Steven Van Ingelgem's patches to add more options to the CMake support,
    slightly modified by me:

      (a) PCRE_BUILD_TESTS can be set OFF not to build the tests, including
          not building pcregrep.

      (b) PCRE_BUILD_PCREGREP can be see OFF not to build pcregrep, but only
          if PCRE_BUILD_TESTS is also set OFF, because the tests use pcregrep.

25. Forward references, both numeric and by name, in patterns that made use of
    duplicate group numbers, could behave incorrectly or give incorrect errors,
    because when scanning forward to find the reference group, PCRE was not
    taking into account the duplicate group numbers. A pattern such as
    ^X(?3)(a)(?|(b)|(q))(Y) is an example.

26. Changed a few more instances of "const unsigned char *" to USPTR, making
    the feature of a custom pointer more persuasive (as requested by a user).

27. Wrapped the definitions of fileno and isatty for Windows, which appear in
    pcretest.c, inside #ifndefs, because it seems they are sometimes already
    pre-defined.

28. Added support for (*UTF8) at the start of a pattern.

29. Arrange for flags added by the "release type" setting in CMake to be shown
    in the configuration summary.


Version 7.8 05-Sep-08
---------------------

1.  Replaced UCP searching code with optimized version as implemented for Ad
    Muncher (http://www.admuncher.com/) by Peter Kankowski. This uses a two-
    stage table and inline lookup instead of a function, giving speed ups of 2
    to 5 times on some simple patterns that I tested. Permission was given to
    distribute the MultiStage2.py script that generates the tables (it's not in
    the tarball, but is in the Subversion repository).

2.  Updated the Unicode datatables to Unicode 5.1.0. This adds yet more
    scripts.

3.  Change 12 for 7.7 introduced a bug in pcre_study() when a pattern contained
    a group with a zero qualifier. The result of the study could be incorrect,
    or the function might crash, depending on the pattern.

4.  Caseless matching was not working for non-ASCII characters in back
    references. For example, /(\x{de})\1/8i was not matching \x{de}\x{fe}.
    It now works when Unicode Property Support is available.

5.  In pcretest, an escape such as \x{de} in the data was always generating
    a UTF-8 string, even in non-UTF-8 mode. Now it generates a single byte in
    non-UTF-8 mode. If the value is greater than 255, it gives a warning about
    truncation.

6.  Minor bugfix in pcrecpp.cc (change "" == ... to NULL == ...).

7.  Added two (int) casts to pcregrep when printing the difference of two
    pointers, in case they are 64-bit values.

8.  Added comments about Mac OS X stack usage to the pcrestack man page and to
    test 2 if it fails.

9.  Added PCRE_CALL_CONVENTION just before the names of all exported functions,
    and a #define of that name to empty if it is not externally set. This is to
    allow users of MSVC to set it if necessary.

10. The PCRE_EXP_DEFN macro which precedes exported functions was missing from
    the convenience functions in the pcre_get.c source file.

11. An option change at the start of a pattern that had top-level alternatives
    could cause overwriting and/or a crash. This command provoked a crash in
    some environments:

      printf "/(?i)[\xc3\xa9\xc3\xbd]|[\xc3\xa9\xc3\xbdA]/8\n" | pcretest

    This potential security problem was recorded as CVE-2008-2371.

12. For a pattern where the match had to start at the beginning or immediately
    after a newline (e.g /.*anything/ without the DOTALL flag), pcre_exec() and
    pcre_dfa_exec() could read past the end of the passed subject if there was
    no match. To help with detecting such bugs (e.g. with valgrind), I modified
    pcretest so that it places the subject at the end of its malloc-ed buffer.

13. The change to pcretest in 12 above threw up a couple more cases when pcre_
    exec() might read past the end of the data buffer in UTF-8 mode.

14. A similar bug to 7.3/2 existed when the PCRE_FIRSTLINE option was set and
    the data contained the byte 0x85 as part of a UTF-8 character within its
    first line. This applied both to normal and DFA matching.

15. Lazy qualifiers were not working in some cases in UTF-8 mode. For example,
    /^[^d]*?$/8 failed to match "abc".

16. Added a missing copyright notice to pcrecpp_internal.h.

17. Make it more clear in the documentation that values returned from
    pcre_exec() in ovector are byte offsets, not character counts.

18. Tidied a few places to stop certain compilers from issuing warnings.

19. Updated the Virtual Pascal + BCC files to compile the latest v7.7, as
    supplied by Stefan Weber. I made a further small update for 7.8 because
    there is a change of source arrangements: the pcre_searchfuncs.c module is
    replaced by pcre_ucd.c.


Version 7.7 07-May-08
---------------------

1.  Applied Craig's patch to sort out a long long problem: "If we can't convert
    a string to a long long, pretend we don't even have a long long." This is
    done by checking for the strtoq, strtoll, and _strtoi64 functions.

2.  Applied Craig's patch to pcrecpp.cc to restore ABI compatibility with
    pre-7.6 versions, which defined a global no_arg variable instead of putting
    it in the RE class. (See also #8 below.)

3.  Remove a line of dead code, identified by coverity and reported by Nuno
    Lopes.

4.  Fixed two related pcregrep bugs involving -r with --include or --exclude:

    (1) The include/exclude patterns were being applied to the whole pathnames
        of files, instead of just to the final components.

    (2) If there was more than one level of directory, the subdirectories were
        skipped unless they satisfied the include/exclude conditions. This is
        inconsistent with GNU grep (and could even be seen as contrary to the
        pcregrep specification - which I improved to make it absolutely clear).
        The action now is always to scan all levels of directory, and just
        apply the include/exclude patterns to regular files.

5.  Added the --include_dir and --exclude_dir patterns to pcregrep, and used
    --exclude_dir in the tests to avoid scanning .svn directories.

6.  Applied Craig's patch to the QuoteMeta function so that it escapes the
    NUL character as backslash + 0 rather than backslash + NUL, because PCRE
    doesn't support NULs in patterns.

7.  Added some missing "const"s to declarations of static tables in
    pcre_compile.c and pcre_dfa_exec.c.

8.  Applied Craig's patch to pcrecpp.cc to fix a problem in OS X that was
    caused by fix #2  above. (Subsequently also a second patch to fix the
    first patch. And a third patch - this was a messy problem.)

9.  Applied Craig's patch to remove the use of push_back().

10. Applied Alan Lehotsky's patch to add REG_STARTEND support to the POSIX
    matching function regexec().

11. Added support for the Oniguruma syntax \g<name>, \g<n>, \g'name', \g'n',
    which, however, unlike Perl's \g{...}, are subroutine calls, not back
    references. PCRE supports relative numbers with this syntax (I don't think
    Oniguruma does).

12. Previously, a group with a zero repeat such as (...){0} was completely
    omitted from the compiled regex. However, this means that if the group
    was called as a subroutine from elsewhere in the pattern, things went wrong
    (an internal error was given). Such groups are now left in the compiled
    pattern, with a new opcode that causes them to be skipped at execution
    time.

13. Added the PCRE_JAVASCRIPT_COMPAT option. This makes the following changes
    to the way PCRE behaves:

    (a) A lone ] character is dis-allowed (Perl treats it as data).

    (b) A back reference to an unmatched subpattern matches an empty string
        (Perl fails the current match path).

    (c) A data ] in a character class must be notated as \] because if the
        first data character in a class is ], it defines an empty class. (In
        Perl it is not possible to have an empty class.) The empty class []
        never matches; it forces failure and is equivalent to (*FAIL) or (?!).
        The negative empty class [^] matches any one character, independently
        of the DOTALL setting.

14. A pattern such as /(?2)[]a()b](abc)/ which had a forward reference to a
    non-existent subpattern following a character class starting with ']' and
    containing () gave an internal compiling error instead of "reference to
    non-existent subpattern". Fortunately, when the pattern did exist, the
    compiled code was correct. (When scanning forwards to check for the
    existence of the subpattern, it was treating the data ']' as terminating
    the class, so got the count wrong. When actually compiling, the reference
    was subsequently set up correctly.)

15. The "always fail" assertion (?!) is optimzed to (*FAIL) by pcre_compile;
    it was being rejected as not supported by pcre_dfa_exec(), even though
    other assertions are supported. I have made pcre_dfa_exec() support
    (*FAIL).

16. The implementation of 13c above involved the invention of a new opcode,
    OP_ALLANY, which is like OP_ANY but doesn't check the /s flag. Since /s
    cannot be changed at match time, I realized I could make a small
    improvement to matching performance by compiling OP_ALLANY instead of
    OP_ANY for "." when DOTALL was set, and then removing the runtime tests
    on the OP_ANY path.

17. Compiling pcretest on Windows with readline support failed without the
    following two fixes: (1) Make the unistd.h include conditional on
    HAVE_UNISTD_H; (2) #define isatty and fileno as _isatty and _fileno.

18. Changed CMakeLists.txt and cmake/FindReadline.cmake to arrange for the
    ncurses library to be included for pcretest when ReadLine support is
    requested, but also to allow for it to be overridden. This patch came from
    Daniel Bergström.

19. There was a typo in the file ucpinternal.h where f0_rangeflag was defined
    as 0x00f00000 instead of 0x00800000. Luckily, this would not have caused
    any errors with the current Unicode tables. Thanks to Peter Kankowski for
    spotting this.


Version 7.6 28-Jan-08
---------------------

1.  A character class containing a very large number of characters with
    codepoints greater than 255 (in UTF-8 mode, of course) caused a buffer
    overflow.

2.  Patch to cut out the "long long" test in pcrecpp_unittest when
    HAVE_LONG_LONG is not defined.

3.  Applied Christian Ehrlicher's patch to update the CMake build files to
    bring them up to date and include new features. This patch includes:

    - Fixed PH's badly added libz and libbz2 support.
    - Fixed a problem with static linking.
    - Added pcredemo. [But later removed - see 7 below.]
    - Fixed dftables problem and added an option.
    - Added a number of HAVE_XXX tests, including HAVE_WINDOWS_H and
        HAVE_LONG_LONG.
    - Added readline support for pcretest.
    - Added an listing of the option settings after cmake has run.

4.  A user submitted a patch to Makefile that makes it easy to create
    "pcre.dll" under mingw when using Configure/Make. I added stuff to
    Makefile.am that cause it to include this special target, without
    affecting anything else. Note that the same mingw target plus all
    the other distribution libraries and programs are now supported
    when configuring with CMake (see 6 below) instead of with
    Configure/Make.

5.  Applied Craig's patch that moves no_arg into the RE class in the C++ code.
    This is an attempt to solve the reported problem "pcrecpp::no_arg is not
    exported in the Windows port". It has not yet been confirmed that the patch
    solves the problem, but it does no harm.

6.  Applied Sheri's patch to CMakeLists.txt to add NON_STANDARD_LIB_PREFIX and
    NON_STANDARD_LIB_SUFFIX for dll names built with mingw when configured
    with CMake, and also correct the comment about stack recursion.

7.  Remove the automatic building of pcredemo from the ./configure system and
    from CMakeLists.txt. The whole idea of pcredemo.c is that it is an example
    of a program that users should build themselves after PCRE is installed, so
    building it automatically is not really right. What is more, it gave
    trouble in some build environments.

8.  Further tidies to CMakeLists.txt from Sheri and Christian.


Version 7.5 10-Jan-08
---------------------

1.  Applied a patch from Craig: "This patch makes it possible to 'ignore'
    values in parens when parsing an RE using the C++ wrapper."

2.  Negative specials like \S did not work in character classes in UTF-8 mode.
    Characters greater than 255 were excluded from the class instead of being
    included.

3.  The same bug as (2) above applied to negated POSIX classes such as
    [:^space:].

4.  PCRECPP_STATIC was referenced in pcrecpp_internal.h, but nowhere was it
    defined or documented. It seems to have been a typo for PCRE_STATIC, so
    I have changed it.

5.  The construct (?&) was not diagnosed as a syntax error (it referenced the
    first named subpattern) and a construct such as (?&a) would reference the
    first named subpattern whose name started with "a" (in other words, the
    length check was missing). Both these problems are fixed. "Subpattern name
    expected" is now given for (?&) (a zero-length name), and this patch also
    makes it give the same error for \k'' (previously it complained that that
    was a reference to a non-existent subpattern).

6.  The erroneous patterns (?+-a) and (?-+a) give different error messages;
    this is right because (?- can be followed by option settings as well as by
    digits. I have, however, made the messages clearer.

7.  Patterns such as (?(1)a|b) (a pattern that contains fewer subpatterns
    than the number used in the conditional) now cause a compile-time error.
    This is actually not compatible with Perl, which accepts such patterns, but
    treats the conditional as always being FALSE (as PCRE used to), but it
    seems to me that giving a diagnostic is better.

8.  Change "alphameric" to the more common word "alphanumeric" in comments
    and messages.

9.  Fix two occurrences of "backslash" in comments that should have been
    "backspace".

10. Remove two redundant lines of code that can never be obeyed (their function
    was moved elsewhere).

11. The program that makes PCRE's Unicode character property table had a bug
    which caused it to generate incorrect table entries for sequences of
    characters that have the same character type, but are in different scripts.
    It amalgamated them into a single range, with the script of the first of
    them. In other words, some characters were in the wrong script. There were
    thirteen such cases, affecting characters in the following ranges:

      U+002b0 - U+002c1
      U+0060c - U+0060d
      U+0061e - U+00612
      U+0064b - U+0065e
      U+0074d - U+0076d
      U+01800 - U+01805
      U+01d00 - U+01d77
      U+01d9b - U+01dbf
      U+0200b - U+0200f
      U+030fc - U+030fe
      U+03260 - U+0327f
      U+0fb46 - U+0fbb1
      U+10450 - U+1049d

12. The -o option (show only the matching part of a line) for pcregrep was not
    compatible with GNU grep in that, if there was more than one match in a
    line, it showed only the first of them. It now behaves in the same way as
    GNU grep.

13. If the -o and -v options were combined for pcregrep, it printed a blank
    line for every non-matching line. GNU grep prints nothing, and pcregrep now
    does the same. The return code can be used to tell if there were any
    non-matching lines.

14. Added --file-offsets and --line-offsets to pcregrep.

15. The pattern (?=something)(?R) was not being diagnosed as a potentially
    infinitely looping recursion. The bug was that positive lookaheads were not
    being skipped when checking for a possible empty match (negative lookaheads
    and both kinds of lookbehind were skipped).

16. Fixed two typos in the Windows-only code in pcregrep.c, and moved the
    inclusion of <windows.h> to before rather than after the definition of
    INVALID_FILE_ATTRIBUTES (patch from David Byron).

17. Specifying a possessive quantifier with a specific limit for a Unicode
    character property caused pcre_compile() to compile bad code, which led at
    runtime to PCRE_ERROR_INTERNAL (-14). Examples of patterns that caused this
    are: /\p{Zl}{2,3}+/8 and /\p{Cc}{2}+/8. It was the possessive "+" that
    caused the error; without that there was no problem.

18. Added --enable-pcregrep-libz and --enable-pcregrep-libbz2.

19. Added --enable-pcretest-libreadline.

20. In pcrecpp.cc, the variable 'count' was incremented twice in
    RE::GlobalReplace(). As a result, the number of replacements returned was
    double what it should be. I removed one of the increments, but Craig sent a
    later patch that removed the other one (the right fix) and added unit tests
    that check the return values (which was not done before).

21. Several CMake things:

    (1) Arranged that, when cmake is used on Unix, the libraries end up with
        the names libpcre and libpcreposix, not just pcre and pcreposix.

    (2) The above change means that pcretest and pcregrep are now correctly
        linked with the newly-built libraries, not previously installed ones.

    (3) Added PCRE_SUPPORT_LIBREADLINE, PCRE_SUPPORT_LIBZ, PCRE_SUPPORT_LIBBZ2.

22. In UTF-8 mode, with newline set to "any", a pattern such as .*a.*=.b.*
    crashed when matching a string such as a\x{2029}b (note that \x{2029} is a
    UTF-8 newline character). The key issue is that the pattern starts .*;
    this means that the match must be either at the beginning, or after a
    newline. The bug was in the code for advancing after a failed match and
    checking that the new position followed a newline. It was not taking
    account of UTF-8 characters correctly.

23. PCRE was behaving differently from Perl in the way it recognized POSIX
    character classes. PCRE was not treating the sequence [:...:] as a
    character class unless the ... were all letters. Perl, however, seems to
    allow any characters between [: and :], though of course it rejects as
    unknown any "names" that contain non-letters, because all the known class
    names consist only of letters. Thus, Perl gives an error for [[:1234:]],
    for example, whereas PCRE did not - it did not recognize a POSIX character
    class. This seemed a bit dangerous, so the code has been changed to be
    closer to Perl. The behaviour is not identical to Perl, because PCRE will
    diagnose an unknown class for, for example, [[:l\ower:]] where Perl will
    treat it as [[:lower:]]. However, PCRE does now give "unknown" errors where
    Perl does, and where it didn't before.

24. Rewrite so as to remove the single use of %n from pcregrep because in some
    Windows environments %n is disabled by default.


Version 7.4 21-Sep-07
---------------------

1.  Change 7.3/28 was implemented for classes by looking at the bitmap. This
    means that a class such as [\s] counted as "explicit reference to CR or
    LF". That isn't really right - the whole point of the change was to try to
    help when there was an actual mention of one of the two characters. So now
    the change happens only if \r or \n (or a literal CR or LF) character is
    encountered.

2.  The 32-bit options word was also used for 6 internal flags, but the numbers
    of both had grown to the point where there were only 3 bits left.
    Fortunately, there was spare space in the data structure, and so I have
    moved the internal flags into a new 16-bit field to free up more option
    bits.

3.  The appearance of (?J) at the start of a pattern set the DUPNAMES option,
    but did not set the internal JCHANGED flag - either of these is enough to
    control the way the "get" function works - but the PCRE_INFO_JCHANGED
    facility is supposed to tell if (?J) was ever used, so now (?J) at the
    start sets both bits.

4.  Added options (at build time, compile time, exec time) to change \R from
    matching any Unicode line ending sequence to just matching CR, LF, or CRLF.

5.  doc/pcresyntax.html was missing from the distribution.

6.  Put back the definition of PCRE_ERROR_NULLWSLIMIT, for backward
    compatibility, even though it is no longer used.

7.  Added macro for snprintf to pcrecpp_unittest.cc and also for strtoll and
    strtoull to pcrecpp.cc to select the available functions in WIN32 when the
    windows.h file is present (where different names are used). [This was
    reversed later after testing - see 16 below.]

8.  Changed all #include <config.h> to #include "config.h". There were also
    some further <pcre.h> cases that I changed to "pcre.h".

9.  When pcregrep was used with the --colour option, it missed the line ending
    sequence off the lines that it output.

10. It was pointed out to me that arrays of string pointers cause lots of
    relocations when a shared library is dynamically loaded. A technique of
    using a single long string with a table of offsets can drastically reduce
    these. I have refactored PCRE in four places to do this. The result is
    dramatic:

      Originally:                          290
      After changing UCP table:            187
      After changing error message table:   43
      After changing table of "verbs"       36
      After changing table of Posix names   22

    Thanks to the folks working on Gregex for glib for this insight.

11. --disable-stack-for-recursion caused compiling to fail unless -enable-
    unicode-properties was also set.

12. Updated the tests so that they work when \R is defaulted to ANYCRLF.

13. Added checks for ANY and ANYCRLF to pcrecpp.cc where it previously
    checked only for CRLF.

14. Added casts to pcretest.c to avoid compiler warnings.

15. Added Craig's patch to various pcrecpp modules to avoid compiler warnings.

16. Added Craig's patch to remove the WINDOWS_H tests, that were not working,
    and instead check for _strtoi64 explicitly, and avoid the use of snprintf()
    entirely. This removes changes made in 7 above.

17. The CMake files have been updated, and there is now more information about
    building with CMake in the NON-UNIX-USE document.


Version 7.3 28-Aug-07
---------------------

 1. In the rejigging of the build system that eventually resulted in 7.1, the
    line "#include <pcre.h>" was included in pcre_internal.h. The use of angle
    brackets there is not right, since it causes compilers to look for an
    installed pcre.h, not the version that is in the source that is being
    compiled (which of course may be different). I have changed it back to:

      #include "pcre.h"

    I have a vague recollection that the change was concerned with compiling in
    different directories, but in the new build system, that is taken care of
    by the VPATH setting the Makefile.

 2. The pattern .*$ when run in not-DOTALL UTF-8 mode with newline=any failed
    when the subject happened to end in the byte 0x85 (e.g. if the last
    character was \x{1ec5}). *Character* 0x85 is one of the "any" newline
    characters but of course it shouldn't be taken as a newline when it is part
    of another character. The bug was that, for an unlimited repeat of . in
    not-DOTALL UTF-8 mode, PCRE was advancing by bytes rather than by
    characters when looking for a newline.

 3. A small performance improvement in the DOTALL UTF-8 mode .* case.

 4. Debugging: adjusted the names of opcodes for different kinds of parentheses
    in debug output.

 5. Arrange to use "%I64d" instead of "%lld" and "%I64u" instead of "%llu" for
    long printing in the pcrecpp unittest when running under MinGW.

 6. ESC_K was left out of the EBCDIC table.

 7. Change 7.0/38 introduced a new limit on the number of nested non-capturing
    parentheses; I made it 1000, which seemed large enough. Unfortunately, the
    limit also applies to "virtual nesting" when a pattern is recursive, and in
    this case 1000 isn't so big. I have been able to remove this limit at the
    expense of backing off one optimization in certain circumstances. Normally,
    when pcre_exec() would call its internal match() function recursively and
    immediately return the result unconditionally, it uses a "tail recursion"
    feature to save stack. However, when a subpattern that can match an empty
    string has an unlimited repetition quantifier, it no longer makes this
    optimization. That gives it a stack frame in which to save the data for
    checking that an empty string has been matched. Previously this was taken
    from the 1000-entry workspace that had been reserved. So now there is no
    explicit limit, but more stack is used.

 8. Applied Daniel's patches to solve problems with the import/export magic
    syntax that is required for Windows, and which was going wrong for the
    pcreposix and pcrecpp parts of the library. These were overlooked when this
    problem was solved for the main library.

 9. There were some crude static tests to avoid integer overflow when computing
    the size of patterns that contain repeated groups with explicit upper
    limits. As the maximum quantifier is 65535, the maximum group length was
    set at 30,000 so that the product of these two numbers did not overflow a
    32-bit integer. However, it turns out that people want to use groups that
    are longer than 30,000 bytes (though not repeat them that many times).
    Change 7.0/17 (the refactoring of the way the pattern size is computed) has
    made it possible to implement the integer overflow checks in a much more
    dynamic way, which I have now done. The artificial limitation on group
    length has been removed - we now have only the limit on the total length of
    the compiled pattern, which depends on the LINK_SIZE setting.

10. Fixed a bug in the documentation for get/copy named substring when
    duplicate names are permitted. If none of the named substrings are set, the
    functions return PCRE_ERROR_NOSUBSTRING (7); the doc said they returned an
    empty string.

11. Because Perl interprets \Q...\E at a high level, and ignores orphan \E
    instances, patterns such as [\Q\E] or [\E] or even [^\E] cause an error,
    because the ] is interpreted as the first data character and the
    terminating ] is not found. PCRE has been made compatible with Perl in this
    regard. Previously, it interpreted [\Q\E] as an empty class, and [\E] could
    cause memory overwriting.

10. Like Perl, PCRE automatically breaks an unlimited repeat after an empty
    string has been matched (to stop an infinite loop). It was not recognizing
    a conditional subpattern that could match an empty string if that
    subpattern was within another subpattern. For example, it looped when
    trying to match  (((?(1)X|))*)  but it was OK with  ((?(1)X|)*)  where the
    condition was not nested. This bug has been fixed.

12. A pattern like \X?\d or \P{L}?\d in non-UTF-8 mode could cause a backtrack
    past the start of the subject in the presence of bytes with the top bit
    set, for example "\x8aBCD".

13. Added Perl 5.10 experimental backtracking controls (*FAIL), (*F), (*PRUNE),
    (*SKIP), (*THEN), (*COMMIT), and (*ACCEPT).

14. Optimized (?!) to (*FAIL).

15. Updated the test for a valid UTF-8 string to conform to the later RFC 3629.
    This restricts code points to be within the range 0 to 0x10FFFF, excluding
    the "low surrogate" sequence 0xD800 to 0xDFFF. Previously, PCRE allowed the
    full range 0 to 0x7FFFFFFF, as defined by RFC 2279. Internally, it still
    does: it's just the validity check that is more restrictive.

16. Inserted checks for integer overflows during escape sequence (backslash)
    processing, and also fixed erroneous offset values for syntax errors during
    backslash processing.

17. Fixed another case of looking too far back in non-UTF-8 mode (cf 12 above)
    for patterns like [\PPP\x8a]{1,}\x80 with the subject "A\x80".

18. An unterminated class in a pattern like (?1)\c[ with a "forward reference"
    caused an overrun.

19. A pattern like (?:[\PPa*]*){8,} which had an "extended class" (one with
    something other than just ASCII characters) inside a group that had an
    unlimited repeat caused a loop at compile time (while checking to see
    whether the group could match an empty string).

20. Debugging a pattern containing \p or \P could cause a crash. For example,
    [\P{Any}] did so. (Error in the code for printing property names.)

21. An orphan \E inside a character class could cause a crash.

22. A repeated capturing bracket such as (A)? could cause a wild memory
    reference during compilation.

23. There are several functions in pcre_compile() that scan along a compiled
    expression for various reasons (e.g. to see if it's fixed length for look
    behind). There were bugs in these functions when a repeated \p or \P was
    present in the pattern. These operators have additional parameters compared
    with \d, etc, and these were not being taken into account when moving along
    the compiled data. Specifically:

    (a) A item such as \p{Yi}{3} in a lookbehind was not treated as fixed
        length.

    (b) An item such as \pL+ within a repeated group could cause crashes or
        loops.

    (c) A pattern such as \p{Yi}+(\P{Yi}+)(?1) could give an incorrect
        "reference to non-existent subpattern" error.

    (d) A pattern like (\P{Yi}{2}\277)? could loop at compile time.

24. A repeated \S or \W in UTF-8 mode could give wrong answers when multibyte
    characters were involved (for example /\S{2}/8g with "A\x{a3}BC").

25. Using pcregrep in multiline, inverted mode (-Mv) caused it to loop.

26. Patterns such as [\P{Yi}A] which include \p or \P and just one other
    character were causing crashes (broken optimization).

27. Patterns such as (\P{Yi}*\277)* (group with possible zero repeat containing
    \p or \P) caused a compile-time loop.

28. More problems have arisen in unanchored patterns when CRLF is a valid line
    break. For example, the unstudied pattern [\r\n]A does not match the string
    "\r\nA" because change 7.0/46 below moves the current point on by two
    characters after failing to match at the start. However, the pattern \nA
    *does* match, because it doesn't start till \n, and if [\r\n]A is studied,
    the same is true. There doesn't seem any very clean way out of this, but
    what I have chosen to do makes the common cases work: PCRE now takes note
    of whether there can be an explicit match for \r or \n anywhere in the
    pattern, and if so, 7.0/46 no longer applies. As part of this change,
    there's a new PCRE_INFO_HASCRORLF option for finding out whether a compiled
    pattern has explicit CR or LF references.

29. Added (*CR) etc for changing newline setting at start of pattern.


Version 7.2 19-Jun-07
---------------------

 1. If the fr_FR locale cannot be found for test 3, try the "french" locale,
    which is apparently normally available under Windows.

 2. Re-jig the pcregrep tests with different newline settings in an attempt
    to make them independent of the local environment's newline setting.

 3. Add code to configure.ac to remove -g from the CFLAGS default settings.

 4. Some of the "internals" tests were previously cut out when the link size
    was not 2, because the output contained actual offsets. The recent new
    "Z" feature of pcretest means that these can be cut out, making the tests
    usable with all link sizes.

 5. Implemented Stan Switzer's goto replacement for longjmp() when not using
    stack recursion. This gives a massive performance boost under BSD, but just
    a small improvement under Linux. However, it saves one field in the frame
    in all cases.

 6. Added more features from the forthcoming Perl 5.10:

    (a) (?-n) (where n is a string of digits) is a relative subroutine or
        recursion call. It refers to the nth most recently opened parentheses.

    (b) (?+n) is also a relative subroutine call; it refers to the nth next
        to be opened parentheses.

    (c) Conditions that refer to capturing parentheses can be specified
        relatively, for example, (?(-2)... or (?(+3)...

    (d) \K resets the start of the current match so that everything before
        is not part of it.

    (e) \k{name} is synonymous with \k<name> and \k'name' (.NET compatible).

    (f) \g{name} is another synonym - part of Perl 5.10's unification of
        reference syntax.

    (g) (?| introduces a group in which the numbering of parentheses in each
        alternative starts with the same number.

    (h) \h, \H, \v, and \V match horizontal and vertical whitespace.

 7. Added two new calls to pcre_fullinfo(): PCRE_INFO_OKPARTIAL and
    PCRE_INFO_JCHANGED.

 8. A pattern such as  (.*(.)?)*  caused pcre_exec() to fail by either not
    terminating or by crashing. Diagnosed by Viktor Griph; it was in the code
    for detecting groups that can match an empty string.

 9. A pattern with a very large number of alternatives (more than several
    hundred) was running out of internal workspace during the pre-compile
    phase, where pcre_compile() figures out how much memory will be needed. A
    bit of new cunning has reduced the workspace needed for groups with
    alternatives. The 1000-alternative test pattern now uses 12 bytes of
    workspace instead of running out of the 4096 that are available.

10. Inserted some missing (unsigned int) casts to get rid of compiler warnings.

11. Applied patch from Google to remove an optimization that didn't quite work.
    The report of the bug said:

      pcrecpp::RE("a*").FullMatch("aaa") matches, while
      pcrecpp::RE("a*?").FullMatch("aaa") does not, and
      pcrecpp::RE("a*?\\z").FullMatch("aaa") does again.

12. If \p or \P was used in non-UTF-8 mode on a character greater than 127
    it matched the wrong number of bytes.


Version 7.1 24-Apr-07
---------------------

 1. Applied Bob Rossi and Daniel G's patches to convert the build system to one
    that is more "standard", making use of automake and other Autotools. There
    is some re-arrangement of the files and adjustment of comments consequent
    on this.

 2. Part of the patch fixed a problem with the pcregrep tests. The test of -r
    for recursive directory scanning broke on some systems because the files
    are not scanned in any specific order and on different systems the order
    was different. A call to "sort" has been inserted into RunGrepTest for the
    approprate test as a short-term fix. In the longer term there may be an
    alternative.

 3. I had an email from Eric Raymond about problems translating some of PCRE's
    man pages to HTML (despite the fact that I distribute HTML pages, some
    people do their own conversions for various reasons). The problems
    concerned the use of low-level troff macros .br and .in. I have therefore
    removed all such uses from the man pages (some were redundant, some could
    be replaced by .nf/.fi pairs). The 132html script that I use to generate
    HTML has been updated to handle .nf/.fi and to complain if it encounters
    .br or .in.

 4. Updated comments in configure.ac that get placed in config.h.in and also
    arranged for config.h to be included in the distribution, with the name
    config.h.generic, for the benefit of those who have to compile without
    Autotools (compare pcre.h, which is now distributed as pcre.h.generic).

 5. Updated the support (such as it is) for Virtual Pascal, thanks to Stefan
    Weber: (1) pcre_internal.h was missing some function renames; (2) updated
    makevp.bat for the current PCRE, using the additional files
    makevp_c.txt, makevp_l.txt, and pcregexp.pas.

 6. A Windows user reported a minor discrepancy with test 2, which turned out
    to be caused by a trailing space on an input line that had got lost in his
    copy. The trailing space was an accident, so I've just removed it.

 7. Add -Wl,-R... flags in pcre-config.in for *BSD* systems, as I'm told
    that is needed.

 8. Mark ucp_table (in ucptable.h) and ucp_gentype (in pcre_ucp_searchfuncs.c)
    as "const" (a) because they are and (b) because it helps the PHP
    maintainers who have recently made a script to detect big data structures
    in the php code that should be moved to the .rodata section. I remembered
    to update Builducptable as well, so it won't revert if ucptable.h is ever
    re-created.

 9. Added some extra #ifdef SUPPORT_UTF8 conditionals into pcretest.c,
    pcre_printint.src, pcre_compile.c, pcre_study.c, and pcre_tables.c, in
    order to be able to cut out the UTF-8 tables in the latter when UTF-8
    support is not required. This saves 1.5-2K of code, which is important in
    some applications.

    Later: more #ifdefs are needed in pcre_ord2utf8.c and pcre_valid_utf8.c
    so as not to refer to the tables, even though these functions will never be
    called when UTF-8 support is disabled. Otherwise there are problems with a
    shared library.

10. Fixed two bugs in the emulated memmove() function in pcre_internal.h:

    (a) It was defining its arguments as char * instead of void *.

    (b) It was assuming that all moves were upwards in memory; this was true
        a long time ago when I wrote it, but is no longer the case.

    The emulated memove() is provided for those environments that have neither
    memmove() nor bcopy(). I didn't think anyone used it these days, but that
    is clearly not the case, as these two bugs were recently reported.

11. The script PrepareRelease is now distributed: it calls 132html, CleanTxt,
    and Detrail to create the HTML documentation, the .txt form of the man
    pages, and it removes trailing spaces from listed files. It also creates
    pcre.h.generic and config.h.generic from pcre.h and config.h. In the latter
    case, it wraps all the #defines with #ifndefs. This script should be run
    before "make dist".

12. Fixed two fairly obscure bugs concerned with quantified caseless matching
    with Unicode property support.

    (a) For a maximizing quantifier, if the two different cases of the
        character were of different lengths in their UTF-8 codings (there are
        some cases like this - I found 11), and the matching function had to
        back up over a mixture of the two cases, it incorrectly assumed they
        were both the same length.

    (b) When PCRE was configured to use the heap rather than the stack for
        recursion during matching, it was not correctly preserving the data for
        the other case of a UTF-8 character when checking ahead for a match
        while processing a minimizing repeat. If the check also involved
        matching a wide character, but failed, corruption could cause an
        erroneous result when trying to check for a repeat of the original
        character.

13. Some tidying changes to the testing mechanism:

    (a) The RunTest script now detects the internal link size and whether there
        is UTF-8 and UCP support by running ./pcretest -C instead of relying on
        values substituted by "configure". (The RunGrepTest script already did
        this for UTF-8.) The configure.ac script no longer substitutes the
        relevant variables.

    (b) The debugging options /B and /D in pcretest show the compiled bytecode
        with length and offset values. This means that the output is different
        for different internal link sizes. Test 2 is skipped for link sizes
        other than 2 because of this, bypassing the problem. Unfortunately,
        there was also a test in test 3 (the locale tests) that used /B and
        failed for link sizes other than 2. Rather than cut the whole test out,
        I have added a new /Z option to pcretest that replaces the length and
        offset values with spaces. This is now used to make test 3 independent
        of link size. (Test 2 will be tidied up later.)

14. If erroroffset was passed as NULL to pcre_compile, it provoked a
    segmentation fault instead of returning the appropriate error message.

15. In multiline mode when the newline sequence was set to "any", the pattern
    ^$ would give a match between the \r and \n of a subject such as "A\r\nB".
    This doesn't seem right; it now treats the CRLF combination as the line
    ending, and so does not match in that case. It's only a pattern such as ^$
    that would hit this one: something like ^ABC$ would have failed after \r
    and then tried again after \r\n.

16. Changed the comparison command for RunGrepTest from "diff -u" to "diff -ub"
    in an attempt to make files that differ only in their line terminators
    compare equal. This works on Linux.

17. Under certain error circumstances pcregrep might try to free random memory
    as it exited. This is now fixed, thanks to valgrind.

19. In pcretest, if the pattern /(?m)^$/g<any> was matched against the string
    "abc\r\n\r\n", it found an unwanted second match after the second \r. This
    was because its rules for how to advance for /g after matching an empty
    string at the end of a line did not allow for this case. They now check for
    it specially.

20. pcretest is supposed to handle patterns and data of any length, by
    extending its buffers when necessary. It was getting this wrong when the
    buffer for a data line had to be extended.

21. Added PCRE_NEWLINE_ANYCRLF which is like ANY, but matches only CR, LF, or
    CRLF as a newline sequence.

22. Code for handling Unicode properties in pcre_dfa_exec() wasn't being cut
    out by #ifdef SUPPORT_UCP. This did no harm, as it could never be used, but
    I have nevertheless tidied it up.

23. Added some casts to kill warnings from HP-UX ia64 compiler.

24. Added a man page for pcre-config.


Version 7.0 19-Dec-06
---------------------

 1. Fixed a signed/unsigned compiler warning in pcre_compile.c, shown up by
    moving to gcc 4.1.1.

 2. The -S option for pcretest uses setrlimit(); I had omitted to #include
    sys/time.h, which is documented as needed for this function. It doesn't
    seem to matter on Linux, but it showed up on some releases of OS X.

 3. It seems that there are systems where bytes whose values are greater than
    127 match isprint() in the "C" locale. The "C" locale should be the
    default when a C program starts up. In most systems, only ASCII printing
    characters match isprint(). This difference caused the output from pcretest
    to vary, making some of the tests fail. I have changed pcretest so that:

    (a) When it is outputting text in the compiled version of a pattern, bytes
        other than 32-126 are always shown as hex escapes.

    (b) When it is outputting text that is a matched part of a subject string,
        it does the same, unless a different locale has been set for the match
        (using the /L modifier). In this case, it uses isprint() to decide.

 4. Fixed a major bug that caused incorrect computation of the amount of memory
    required for a compiled pattern when options that changed within the
    pattern affected the logic of the preliminary scan that determines the
    length. The relevant options are -x, and -i in UTF-8 mode. The result was
    that the computed length was too small. The symptoms of this bug were
    either the PCRE error "internal error: code overflow" from pcre_compile(),
    or a glibc crash with a message such as "pcretest: free(): invalid next
    size (fast)". Examples of patterns that provoked this bug (shown in
    pcretest format) are:

      /(?-x: )/x
      /(?x)(?-x: \s*#\s*)/
      /((?i)[\x{c0}])/8
      /(?i:[\x{c0}])/8

    HOWEVER: Change 17 below makes this fix obsolete as the memory computation
    is now done differently.

 5. Applied patches from Google to: (a) add a QuoteMeta function to the C++
    wrapper classes; (b) implement a new function in the C++ scanner that is
    more efficient than the old way of doing things because it avoids levels of
    recursion in the regex matching; (c) add a paragraph to the documentation
    for the FullMatch() function.

 6. The escape sequence \n was being treated as whatever was defined as
    "newline". Not only was this contrary to the documentation, which states
    that \n is character 10 (hex 0A), but it also went horribly wrong when
    "newline" was defined as CRLF. This has been fixed.

 7. In pcre_dfa_exec.c the value of an unsigned integer (the variable called c)
    was being set to -1 for the "end of line" case (supposedly a value that no
    character can have). Though this value is never used (the check for end of
    line is "zero bytes in current character"), it caused compiler complaints.
    I've changed it to 0xffffffff.

 8. In pcre_version.c, the version string was being built by a sequence of
    C macros that, in the event of PCRE_PRERELEASE being defined as an empty
    string (as it is for production releases) called a macro with an empty
    argument. The C standard says the result of this is undefined. The gcc
    compiler treats it as an empty string (which was what was wanted) but it is
    reported that Visual C gives an error. The source has been hacked around to
    avoid this problem.

 9. On the advice of a Windows user, included <io.h> and <fcntl.h> in Windows
    builds of pcretest, and changed the call to _setmode() to use _O_BINARY
    instead of 0x8000. Made all the #ifdefs test both _WIN32 and WIN32 (not all
    of them did).

10. Originally, pcretest opened its input and output without "b"; then I was
    told that "b" was needed in some environments, so it was added for release
    5.0 to both the input and output. (It makes no difference on Unix-like
    systems.) Later I was told that it is wrong for the input on Windows. I've
    now abstracted the modes into two macros, to make it easier to fiddle with
    them, and removed "b" from the input mode under Windows.

11. Added pkgconfig support for the C++ wrapper library, libpcrecpp.

12. Added -help and --help to pcretest as an official way of being reminded
    of the options.

13. Removed some redundant semicolons after macro calls in pcrecpparg.h.in
    and pcrecpp.cc because they annoy compilers at high warning levels.

14. A bit of tidying/refactoring in pcre_exec.c in the main bumpalong loop.

15. Fixed an occurrence of == in configure.ac that should have been = (shell
    scripts are not C programs :-) and which was not noticed because it works
    on Linux.

16. pcretest is supposed to handle any length of pattern and data line (as one
    line or as a continued sequence of lines) by extending its input buffer if
    necessary. This feature was broken for very long pattern lines, leading to
    a string of junk being passed to pcre_compile() if the pattern was longer
    than about 50K.

17. I have done a major re-factoring of the way pcre_compile() computes the
    amount of memory needed for a compiled pattern. Previously, there was code
    that made a preliminary scan of the pattern in order to do this. That was
    OK when PCRE was new, but as the facilities have expanded, it has become
    harder and harder to keep it in step with the real compile phase, and there
    have been a number of bugs (see for example, 4 above). I have now found a
    cunning way of running the real compile function in a "fake" mode that
    enables it to compute how much memory it would need, while actually only
    ever using a few hundred bytes of working memory and without too many
    tests of the mode. This should make future maintenance and development
    easier. A side effect of this work is that the limit of 200 on the nesting
    depth of parentheses has been removed (though this was never a serious
    limitation, I suspect). However, there is a downside: pcre_compile() now
    runs more slowly than before (30% or more, depending on the pattern). I
    hope this isn't a big issue. There is no effect on runtime performance.

18. Fixed a minor bug in pcretest: if a pattern line was not terminated by a
    newline (only possible for the last line of a file) and it was a
    pattern that set a locale (followed by /Lsomething), pcretest crashed.

19. Added additional timing features to pcretest. (1) The -tm option now times
    matching only, not compiling. (2) Both -t and -tm can be followed, as a
    separate command line item, by a number that specifies the number of
    repeats to use when timing. The default is 50000; this gives better
    precision, but takes uncomfortably long for very large patterns.

20. Extended pcre_study() to be more clever in cases where a branch of a
    subpattern has no definite first character. For example, (a*|b*)[cd] would
    previously give no result from pcre_study(). Now it recognizes that the
    first character must be a, b, c, or d.

21. There was an incorrect error "recursive call could loop indefinitely" if
    a subpattern (or the entire pattern) that was being tested for matching an
    empty string contained only one non-empty item after a nested subpattern.
    For example, the pattern (?>\x{100}*)\d(?R) provoked this error
    incorrectly, because the \d was being skipped in the check.

22. The pcretest program now has a new pattern option /B and a command line
    option -b, which is equivalent to adding /B to every pattern. This causes
    it to show the compiled bytecode, without the additional information that
    -d shows. The effect of -d is now the same as -b with -i (and similarly, /D
    is the same as /B/I).

23. A new optimization is now able automatically to treat some sequences such
    as a*b as a*+b. More specifically, if something simple (such as a character
    or a simple class like \d) has an unlimited quantifier, and is followed by
    something that cannot possibly match the quantified thing, the quantifier
    is automatically "possessified".

24. A recursive reference to a subpattern whose number was greater than 39
    went wrong under certain circumstances in UTF-8 mode. This bug could also
    have affected the operation of pcre_study().

25. Realized that a little bit of performance could be had by replacing
    (c & 0xc0) == 0xc0 with c >= 0xc0 when processing UTF-8 characters.

26. Timing data from pcretest is now shown to 4 decimal places instead of 3.

27. Possessive quantifiers such as a++ were previously implemented by turning
    them into atomic groups such as ($>a+). Now they have their own opcodes,
    which improves performance. This includes the automatically created ones
    from 23 above.

28. A pattern such as (?=(\w+))\1: which simulates an atomic group using a
    lookahead was broken if it was not anchored. PCRE was mistakenly expecting
    the first matched character to be a colon. This applied both to named and
    numbered groups.

29. The ucpinternal.h header file was missing its idempotency #ifdef.

30. I was sent a "project" file called libpcre.a.dev which I understand makes
    building PCRE on Windows easier, so I have included it in the distribution.

31. There is now a check in pcretest against a ridiculously large number being
    returned by pcre_exec() or pcre_dfa_exec(). If this happens in a /g or /G
    loop, the loop is abandoned.

32. Forward references to subpatterns in conditions such as (?(2)...) where
    subpattern 2 is defined later cause pcre_compile() to search forwards in
    the pattern for the relevant set of parentheses. This search went wrong
    when there were unescaped parentheses in a character class, parentheses
    escaped with \Q...\E, or parentheses in a #-comment in /x mode.

33. "Subroutine" calls and backreferences were previously restricted to
    referencing subpatterns earlier in the regex. This restriction has now
    been removed.

34. Added a number of extra features that are going to be in Perl 5.10. On the
    whole, these are just syntactic alternatives for features that PCRE had
    previously implemented using the Python syntax or my own invention. The
    other formats are all retained for compatibility.

    (a) Named groups can now be defined as (?<name>...) or (?'name'...) as well
        as (?P<name>...). The new forms, as well as being in Perl 5.10, are
        also .NET compatible.

    (b) A recursion or subroutine call to a named group can now be defined as
        (?&name) as well as (?P>name).

    (c) A backreference to a named group can now be defined as \k<name> or
        \k'name' as well as (?P=name). The new forms, as well as being in Perl
        5.10, are also .NET compatible.

    (d) A conditional reference to a named group can now use the syntax
        (?(<name>) or (?('name') as well as (?(name).

    (e) A "conditional group" of the form (?(DEFINE)...) can be used to define
        groups (named and numbered) that are never evaluated inline, but can be
        called as "subroutines" from elsewhere. In effect, the DEFINE condition
        is always false. There may be only one alternative in such a group.

    (f) A test for recursion can be given as (?(R1).. or (?(R&name)... as well
        as the simple (?(R). The condition is true only if the most recent
        recursion is that of the given number or name. It does not search out
        through the entire recursion stack.

    (g) The escape \gN or \g{N} has been added, where N is a positive or
        negative number, specifying an absolute or relative reference.

35. Tidied to get rid of some further signed/unsigned compiler warnings and
    some "unreachable code" warnings.

36. Updated the Unicode property tables to Unicode version 5.0.0. Amongst other
    things, this adds five new scripts.

37. Perl ignores orphaned \E escapes completely. PCRE now does the same.
    There were also incompatibilities regarding the handling of \Q..\E inside
    character classes, for example with patterns like [\Qa\E-\Qz\E] where the
    hyphen was adjacent to \Q or \E. I hope I've cleared all this up now.

38. Like Perl, PCRE detects when an indefinitely repeated parenthesized group
    matches an empty string, and forcibly breaks the loop. There were bugs in
    this code in non-simple cases. For a pattern such as  ^(a()*)*  matched
    against  aaaa  the result was just "a" rather than "aaaa", for example. Two
    separate and independent bugs (that affected different cases) have been
    fixed.

39. Refactored the code to abolish the use of different opcodes for small
    capturing bracket numbers. This is a tidy that I avoided doing when I
    removed the limit on the number of capturing brackets for 3.5 back in 2001.
    The new approach is not only tidier, it makes it possible to reduce the
    memory needed to fix the previous bug (38).

40. Implemented PCRE_NEWLINE_ANY to recognize any of the Unicode newline
    sequences (http://unicode.org/unicode/reports/tr18/) as "newline" when
    processing dot, circumflex, or dollar metacharacters, or #-comments in /x
    mode.

41. Add \R to match any Unicode newline sequence, as suggested in the Unicode
    report.

42. Applied patch, originally from Ari Pollak, modified by Google, to allow
    copy construction and assignment in the C++ wrapper.

43. Updated pcregrep to support "--newline=any". In the process, I fixed a
    couple of bugs that could have given wrong results in the "--newline=crlf"
    case.

44. Added a number of casts and did some reorganization of signed/unsigned int
    variables following suggestions from Dair Grant. Also renamed the variable
    "this" as "item" because it is a C++ keyword.

45. Arranged for dftables to add

      #include "pcre_internal.h"

    to pcre_chartables.c because without it, gcc 4.x may remove the array
    definition from the final binary if PCRE is built into a static library and
    dead code stripping is activated.

46. For an unanchored pattern, if a match attempt fails at the start of a
    newline sequence, and the newline setting is CRLF or ANY, and the next two
    characters are CRLF, advance by two characters instead of one.


Version 6.7 04-Jul-06
---------------------

 1. In order to handle tests when input lines are enormously long, pcretest has
    been re-factored so that it automatically extends its buffers when
    necessary. The code is crude, but this _is_ just a test program. The
    default size has been increased from 32K to 50K.

 2. The code in pcre_study() was using the value of the re argument before
    testing it for NULL. (Of course, in any sensible call of the function, it
    won't be NULL.)

 3. The memmove() emulation function in pcre_internal.h, which is used on
    systems that lack both memmove() and bcopy() - that is, hardly ever -
    was missing a "static" storage class specifier.

 4. When UTF-8 mode was not set, PCRE looped when compiling certain patterns
    containing an extended class (one that cannot be represented by a bitmap
    because it contains high-valued characters or Unicode property items, e.g.
    [\pZ]). Almost always one would set UTF-8 mode when processing such a
    pattern, but PCRE should not loop if you do not (it no longer does).
    [Detail: two cases were found: (a) a repeated subpattern containing an
    extended class; (b) a recursive reference to a subpattern that followed a
    previous extended class. It wasn't skipping over the extended class
    correctly when UTF-8 mode was not set.]

 5. A negated single-character class was not being recognized as fixed-length
    in lookbehind assertions such as (?<=[^f]), leading to an incorrect
    compile error "lookbehind assertion is not fixed length".

 6. The RunPerlTest auxiliary script was showing an unexpected difference
    between PCRE and Perl for UTF-8 tests. It turns out that it is hard to
    write a Perl script that can interpret lines of an input file either as
    byte characters or as UTF-8, which is what "perltest" was being required to
    do for the non-UTF-8 and UTF-8 tests, respectively. Essentially what you
    can't do is switch easily at run time between having the "use utf8;" pragma
    or not. In the end, I fudged it by using the RunPerlTest script to insert
    "use utf8;" explicitly for the UTF-8 tests.

 7. In multiline (/m) mode, PCRE was matching ^ after a terminating newline at
    the end of the subject string, contrary to the documentation and to what
    Perl does. This was true of both matching functions. Now it matches only at
    the start of the subject and immediately after *internal* newlines.

 8. A call of pcre_fullinfo() from pcretest to get the option bits was passing
    a pointer to an int instead of a pointer to an unsigned long int. This
    caused problems on 64-bit systems.

 9. Applied a patch from the folks at Google to pcrecpp.cc, to fix "another
    instance of the 'standard' template library not being so standard".

10. There was no check on the number of named subpatterns nor the maximum
    length of a subpattern name. The product of these values is used to compute
    the size of the memory block for a compiled pattern. By supplying a very
    long subpattern name and a large number of named subpatterns, the size
    computation could be caused to overflow. This is now prevented by limiting
    the length of names to 32 characters, and the number of named subpatterns
    to 10,000.

11. Subpatterns that are repeated with specific counts have to be replicated in
    the compiled pattern. The size of memory for this was computed from the
    length of the subpattern and the repeat count. The latter is limited to
    65535, but there was no limit on the former, meaning that integer overflow
    could in principle occur. The compiled length of a repeated subpattern is
    now limited to 30,000 bytes in order to prevent this.

12. Added the optional facility to have named substrings with the same name.

13. Added the ability to use a named substring as a condition, using the
    Python syntax: (?(name)yes|no). This overloads (?(R)... and names that
    are numbers (not recommended). Forward references are permitted.

14. Added forward references in named backreferences (if you see what I mean).

15. In UTF-8 mode, with the PCRE_DOTALL option set, a quantified dot in the
    pattern could run off the end of the subject. For example, the pattern
    "(?s)(.{1,5})"8 did this with the subject "ab".

16. If PCRE_DOTALL or PCRE_MULTILINE were set, pcre_dfa_exec() behaved as if
    PCRE_CASELESS was set when matching characters that were quantified with ?
    or *.

17. A character class other than a single negated character that had a minimum
    but no maximum quantifier - for example [ab]{6,} - was not handled
    correctly by pce_dfa_exec(). It would match only one character.

18. A valid (though odd) pattern that looked like a POSIX character
    class but used an invalid character after [ (for example [[,abc,]]) caused
    pcre_compile() to give the error "Failed: internal error: code overflow" or
    in some cases to crash with a glibc free() error. This could even happen if
    the pattern terminated after [[ but there just happened to be a sequence of
    letters, a binary zero, and a closing ] in the memory that followed.

19. Perl's treatment of octal escapes in the range \400 to \777 has changed
    over the years. Originally (before any Unicode support), just the bottom 8
    bits were taken. Thus, for example, \500 really meant \100. Nowadays the
    output from "man perlunicode" includes this:

      The regular expression compiler produces polymorphic opcodes.  That
      is, the pattern adapts to the data and automatically switches to
      the Unicode character scheme when presented with Unicode data--or
      instead uses a traditional byte scheme when presented with byte
      data.

    Sadly, a wide octal escape does not cause a switch, and in a string with
    no other multibyte characters, these octal escapes are treated as before.
    Thus, in Perl, the pattern  /\500/ actually matches \100 but the pattern
    /\500|\x{1ff}/ matches \500 or \777 because the whole thing is treated as a
    Unicode string.

    I have not perpetrated such confusion in PCRE. Up till now, it took just
    the bottom 8 bits, as in old Perl. I have now made octal escapes with
    values greater than \377 illegal in non-UTF-8 mode. In UTF-8 mode they
    translate to the appropriate multibyte character.

29. Applied some refactoring to reduce the number of warnings from Microsoft
    and Borland compilers. This has included removing the fudge introduced
    seven years ago for the OS/2 compiler (see 2.02/2 below) because it caused
    a warning about an unused variable.

21. PCRE has not included VT (character 0x0b) in the set of whitespace
    characters since release 4.0, because Perl (from release 5.004) does not.
    [Or at least, is documented not to: some releases seem to be in conflict
    with the documentation.] However, when a pattern was studied with
    pcre_study() and all its branches started with \s, PCRE still included VT
    as a possible starting character. Of course, this did no harm; it just
    caused an unnecessary match attempt.

22. Removed a now-redundant internal flag bit that recorded the fact that case
    dependency changed within the pattern. This was once needed for "required
    byte" processing, but is no longer used. This recovers a now-scarce options
    bit. Also moved the least significant internal flag bit to the most-
    significant bit of the word, which was not previously used (hangover from
    the days when it was an int rather than a uint) to free up another bit for
    the future.

23. Added support for CRLF line endings as well as CR and LF. As well as the
    default being selectable at build time, it can now be changed at runtime
    via the PCRE_NEWLINE_xxx flags. There are now options for pcregrep to
    specify that it is scanning data with non-default line endings.

24. Changed the definition of CXXLINK to make it agree with the definition of
    LINK in the Makefile, by replacing LDFLAGS to CXXFLAGS.

25. Applied Ian Taylor's patches to avoid using another stack frame for tail
    recursions. This makes a big different to stack usage for some patterns.

26. If a subpattern containing a named recursion or subroutine reference such
    as (?P>B) was quantified, for example (xxx(?P>B)){3}, the calculation of
    the space required for the compiled pattern went wrong and gave too small a
    value. Depending on the environment, this could lead to "Failed: internal
    error: code overflow at offset 49" or "glibc detected double free or
    corruption" errors.

27. Applied patches from Google (a) to support the new newline modes and (b) to
    advance over multibyte UTF-8 characters in GlobalReplace.

28. Change free() to pcre_free() in pcredemo.c. Apparently this makes a
    difference for some implementation of PCRE in some Windows version.

29. Added some extra testing facilities to pcretest:

    \q<number>   in a data line sets the "match limit" value
    \Q<number>   in a data line sets the "match recursion limt" value
    -S <number>  sets the stack size, where <number> is in megabytes

    The -S option isn't available for Windows.


Version 6.6 06-Feb-06
---------------------

 1. Change 16(a) for 6.5 broke things, because PCRE_DATA_SCOPE was not defined
    in pcreposix.h. I have copied the definition from pcre.h.

 2. Change 25 for 6.5 broke compilation in a build directory out-of-tree
    because pcre.h is no longer a built file.

 3. Added Jeff Friedl's additional debugging patches to pcregrep. These are
    not normally included in the compiled code.


Version 6.5 01-Feb-06
---------------------

 1. When using the partial match feature with pcre_dfa_exec(), it was not
    anchoring the second and subsequent partial matches at the new starting
    point. This could lead to incorrect results. For example, with the pattern
    /1234/, partially matching against "123" and then "a4" gave a match.

 2. Changes to pcregrep:

    (a) All non-match returns from pcre_exec() were being treated as failures
        to match the line. Now, unless the error is PCRE_ERROR_NOMATCH, an
        error message is output. Some extra information is given for the
        PCRE_ERROR_MATCHLIMIT and PCRE_ERROR_RECURSIONLIMIT errors, which are
        probably the only errors that are likely to be caused by users (by
        specifying a regex that has nested indefinite repeats, for instance).
        If there are more than 20 of these errors, pcregrep is abandoned.

    (b) A binary zero was treated as data while matching, but terminated the
        output line if it was written out. This has been fixed: binary zeroes
        are now no different to any other data bytes.

    (c) Whichever of the LC_ALL or LC_CTYPE environment variables is set is
        used to set a locale for matching. The --locale=xxxx long option has
        been added (no short equivalent) to specify a locale explicitly on the
        pcregrep command, overriding the environment variables.

    (d) When -B was used with -n, some line numbers in the output were one less
        than they should have been.

    (e) Added the -o (--only-matching) option.

    (f) If -A or -C was used with -c (count only), some lines of context were
        accidentally printed for the final match.

    (g) Added the -H (--with-filename) option.

    (h) The combination of options -rh failed to suppress file names for files
        that were found from directory arguments.

    (i) Added the -D (--devices) and -d (--directories) options.

    (j) Added the -F (--fixed-strings) option.

    (k) Allow "-" to be used as a file name for -f as well as for a data file.

    (l) Added the --colo(u)r option.

    (m) Added Jeffrey Friedl's -S testing option, but within #ifdefs so that it
        is not present by default.

 3. A nasty bug was discovered in the handling of recursive patterns, that is,
    items such as (?R) or (?1), when the recursion could match a number of
    alternatives. If it matched one of the alternatives, but subsequently,
    outside the recursion, there was a failure, the code tried to back up into
    the recursion. However, because of the way PCRE is implemented, this is not
    possible, and the result was an incorrect result from the match.

    In order to prevent this happening, the specification of recursion has
    been changed so that all such subpatterns are automatically treated as
    atomic groups. Thus, for example, (?R) is treated as if it were (?>(?R)).

 4. I had overlooked the fact that, in some locales, there are characters for
    which isalpha() is true but neither isupper() nor islower() are true. In
    the fr_FR locale, for instance, the \xAA and \xBA characters (ordmasculine
    and ordfeminine) are like this. This affected the treatment of \w and \W
    when they appeared in character classes, but not when they appeared outside
    a character class. The bit map for "word" characters is now created
    separately from the results of isalnum() instead of just taking it from the
    upper, lower, and digit maps. (Plus the underscore character, of course.)

 5. The above bug also affected the handling of POSIX character classes such as
    [[:alpha:]] and [[:alnum:]]. These do not have their own bit maps in PCRE's
    permanent tables. Instead, the bit maps for such a class were previously
    created as the appropriate unions of the upper, lower, and digit bitmaps.
    Now they are created by subtraction from the [[:word:]] class, which has
    its own bitmap.

 6. The [[:blank:]] character class matches horizontal, but not vertical space.
    It is created by subtracting the vertical space characters (\x09, \x0a,
    \x0b, \x0c) from the [[:space:]] bitmap. Previously, however, the
    subtraction was done in the overall bitmap for a character class, meaning
    that a class such as [\x0c[:blank:]] was incorrect because \x0c would not
    be recognized. This bug has been fixed.

 7. Patches from the folks at Google:

      (a) pcrecpp.cc: "to handle a corner case that may or may not happen in
      real life, but is still worth protecting against".

      (b) pcrecpp.cc: "corrects a bug when negative radixes are used with
      regular expressions".

      (c) pcre_scanner.cc: avoid use of std::count() because not all systems
      have it.

      (d) Split off pcrecpparg.h from pcrecpp.h and had the former built by
      "configure" and the latter not, in order to fix a problem somebody had
      with compiling the Arg class on HP-UX.

      (e) Improve the error-handling of the C++ wrapper a little bit.

      (f) New tests for checking recursion limiting.

 8. The pcre_memmove() function, which is used only if the environment does not
    have a standard memmove() function (and is therefore rarely compiled),
    contained two bugs: (a) use of int instead of size_t, and (b) it was not
    returning a result (though PCRE never actually uses the result).

 9. In the POSIX regexec() interface, if nmatch is specified as a ridiculously
    large number - greater than INT_MAX/(3*sizeof(int)) - REG_ESPACE is
    returned instead of calling malloc() with an overflowing number that would
    most likely cause subsequent chaos.

10. The debugging option of pcretest was not showing the NO_AUTO_CAPTURE flag.

11. The POSIX flag REG_NOSUB is now supported. When a pattern that was compiled
    with this option is matched, the nmatch and pmatch options of regexec() are
    ignored.

12. Added REG_UTF8 to the POSIX interface. This is not defined by POSIX, but is
    provided in case anyone wants to the the POSIX interface with UTF-8
    strings.

13. Added CXXLDFLAGS to the Makefile parameters to provide settings only on the
    C++ linking (needed for some HP-UX environments).

14. Avoid compiler warnings in get_ucpname() when compiled without UCP support
    (unused parameter) and in the pcre_printint() function (omitted "default"
    switch label when the default is to do nothing).

15. Added some code to make it possible, when PCRE is compiled as a C++
    library, to replace subject pointers for pcre_exec() with a smart pointer
    class, thus making it possible to process discontinuous strings.

16. The two macros PCRE_EXPORT and PCRE_DATA_SCOPE are confusing, and perform
    much the same function. They were added by different people who were trying
    to make PCRE easy to compile on non-Unix systems. It has been suggested
    that PCRE_EXPORT be abolished now that there is more automatic apparatus
    for compiling on Windows systems. I have therefore replaced it with
    PCRE_DATA_SCOPE. This is set automatically for Windows; if not set it
    defaults to "extern" for C or "extern C" for C++, which works fine on
    Unix-like systems. It is now possible to override the value of PCRE_DATA_
    SCOPE with something explicit in config.h. In addition:

    (a) pcreposix.h still had just "extern" instead of either of these macros;
        I have replaced it with PCRE_DATA_SCOPE.

    (b) Functions such as _pcre_xclass(), which are internal to the library,
        but external in the C sense, all had PCRE_EXPORT in their definitions.
        This is apparently wrong for the Windows case, so I have removed it.
        (It makes no difference on Unix-like systems.)

17. Added a new limit, MATCH_LIMIT_RECURSION, which limits the depth of nesting
    of recursive calls to match(). This is different to MATCH_LIMIT because
    that limits the total number of calls to match(), not all of which increase
    the depth of recursion. Limiting the recursion depth limits the amount of
    stack (or heap if NO_RECURSE is set) that is used. The default can be set
    when PCRE is compiled, and changed at run time. A patch from Google adds
    this functionality to the C++ interface.

18. Changes to the handling of Unicode character properties:

    (a) Updated the table to Unicode 4.1.0.

    (b) Recognize characters that are not in the table as "Cn" (undefined).

    (c) I revised the way the table is implemented to a much improved format
        which includes recognition of ranges. It now supports the ranges that
        are defined in UnicodeData.txt, and it also amalgamates other
        characters into ranges. This has reduced the number of entries in the
        table from around 16,000 to around 3,000, thus reducing its size
        considerably. I realized I did not need to use a tree structure after
        all - a binary chop search is just as efficient. Having reduced the
        number of entries, I extended their size from 6 bytes to 8 bytes to
        allow for more data.

    (d) Added support for Unicode script names via properties such as \p{Han}.

19. In UTF-8 mode, a backslash followed by a non-Ascii character was not
    matching that character.

20. When matching a repeated Unicode property with a minimum greater than zero,
    (for example \pL{2,}), PCRE could look past the end of the subject if it
    reached it while seeking the minimum number of characters. This could
    happen only if some of the characters were more than one byte long, because
    there is a check for at least the minimum number of bytes.

21. Refactored the implementation of \p and \P so as to be more general, to
    allow for more different types of property in future. This has changed the
    compiled form incompatibly. Anybody with saved compiled patterns that use
    \p or \P will have to recompile them.

22. Added "Any" and "L&" to the supported property types.

23. Recognize \x{...} as a code point specifier, even when not in UTF-8 mode,
    but give a compile time error if the value is greater than 0xff.

24. The man pages for pcrepartial, pcreprecompile, and pcre_compile2 were
    accidentally not being installed or uninstalled.

25. The pcre.h file was built from pcre.h.in, but the only changes that were
    made were to insert the current release number. This seemed silly, because
    it made things harder for people building PCRE on systems that don't run
    "configure". I have turned pcre.h into a distributed file, no longer built
    by "configure", with the version identification directly included. There is
    no longer a pcre.h.in file.

    However, this change necessitated a change to the pcre-config script as
    well. It is built from pcre-config.in, and one of the substitutions was the
    release number. I have updated configure.ac so that ./configure now finds
    the release number by grepping pcre.h.

26. Added the ability to run the tests under valgrind.


Version 6.4 05-Sep-05
---------------------

 1. Change 6.0/10/(l) to pcregrep introduced a bug that caused separator lines
    "--" to be printed when multiple files were scanned, even when none of the
    -A, -B, or -C options were used. This is not compatible with Gnu grep, so I
    consider it to be a bug, and have restored the previous behaviour.

 2. A couple of code tidies to get rid of compiler warnings.

 3. The pcretest program used to cheat by referring to symbols in the library
    whose names begin with _pcre_. These are internal symbols that are not
    really supposed to be visible externally, and in some environments it is
    possible to suppress them. The cheating is now confined to including
    certain files from the library's source, which is a bit cleaner.

 4. Renamed pcre.in as pcre.h.in to go with pcrecpp.h.in; it also makes the
    file's purpose clearer.

 5. Reorganized pcre_ucp_findchar().


Version 6.3 15-Aug-05
---------------------

 1. The file libpcre.pc.in did not have general read permission in the tarball.

 2. There were some problems when building without C++ support:

    (a) If C++ support was not built, "make install" and "make test" still
        tried to test it.

    (b) There were problems when the value of CXX was explicitly set. Some
        changes have been made to try to fix these, and ...

    (c) --disable-cpp can now be used to explicitly disable C++ support.

    (d) The use of @CPP_OBJ@ directly caused a blank line preceded by a
        backslash in a target when C++ was disabled. This confuses some
        versions of "make", apparently. Using an intermediate variable solves
        this. (Same for CPP_LOBJ.)

 3. $(LINK_FOR_BUILD) now includes $(CFLAGS_FOR_BUILD) and $(LINK)
    (non-Windows) now includes $(CFLAGS) because these flags are sometimes
    necessary on certain architectures.

 4. Added a setting of -export-symbols-regex to the link command to remove
    those symbols that are exported in the C sense, but actually are local
    within the library, and not documented. Their names all begin with
    "_pcre_". This is not a perfect job, because (a) we have to except some
    symbols that pcretest ("illegally") uses, and (b) the facility isn't always
    available (and never for static libraries). I have made a note to try to
    find a way round (a) in the future.


Version 6.2 01-Aug-05
---------------------

 1. There was no test for integer overflow of quantifier values. A construction
    such as {1111111111111111} would give undefined results. What is worse, if
    a minimum quantifier for a parenthesized subpattern overflowed and became
    negative, the calculation of the memory size went wrong. This could have
    led to memory overwriting.

 2. Building PCRE using VPATH was broken. Hopefully it is now fixed.

 3. Added "b" to the 2nd argument of fopen() in dftables.c, for non-Unix-like
    operating environments where this matters.

 4. Applied Giuseppe Maxia's patch to add additional features for controlling
    PCRE options from within the C++ wrapper.

 5. Named capturing subpatterns were not being correctly counted when a pattern
    was compiled. This caused two problems: (a) If there were more than 100
    such subpatterns, the calculation of the memory needed for the whole
    compiled pattern went wrong, leading to an overflow error. (b) Numerical
    back references of the form \12, where the number was greater than 9, were
    not recognized as back references, even though there were sufficient
    previous subpatterns.

 6. Two minor patches to pcrecpp.cc in order to allow it to compile on older
    versions of gcc, e.g. 2.95.4.


Version 6.1 21-Jun-05
---------------------

 1. There was one reference to the variable "posix" in pcretest.c that was not
    surrounded by "#if !defined NOPOSIX".

 2. Make it possible to compile pcretest without DFA support, UTF8 support, or
    the cross-check on the old pcre_info() function, for the benefit of the
    cut-down version of PCRE that is currently imported into Exim.

 3. A (silly) pattern starting with (?i)(?-i) caused an internal space
    allocation error. I've done the easy fix, which wastes 2 bytes for sensible
    patterns that start (?i) but I don't think that matters. The use of (?i) is
    just an example; this all applies to the other options as well.

 4. Since libtool seems to echo the compile commands it is issuing, the output
    from "make" can be reduced a bit by putting "@" in front of each libtool
    compile command.

 5. Patch from the folks at Google for configure.in to be a bit more thorough
    in checking for a suitable C++ installation before trying to compile the
    C++ stuff. This should fix a reported problem when a compiler was present,
    but no suitable headers.

 6. The man pages all had just "PCRE" as their title. I have changed them to
    be the relevant file name. I have also arranged that these names are
    retained in the file doc/pcre.txt, which is a concatenation in text format
    of all the man pages except the little individual ones for each function.

 7. The NON-UNIX-USE file had not been updated for the different set of source
    files that come with release 6. I also added a few comments about the C++
    wrapper.


Version 6.0 07-Jun-05
---------------------

 1. Some minor internal re-organization to help with my DFA experiments.

 2. Some missing #ifdef SUPPORT_UCP conditionals in pcretest and printint that
    didn't matter for the library itself when fully configured, but did matter
    when compiling without UCP support, or within Exim, where the ucp files are
    not imported.

 3. Refactoring of the library code to split up the various functions into
    different source modules. The addition of the new DFA matching code (see
    below) to a single monolithic source would have made it really too
    unwieldy, quite apart from causing all the code to be include in a
    statically linked application, when only some functions are used. This is
    relevant even without the DFA addition now that patterns can be compiled in
    one application and matched in another.

    The downside of splitting up is that there have to be some external
    functions and data tables that are used internally in different modules of
    the library but which are not part of the API. These have all had their
    names changed to start with "_pcre_" so that they are unlikely to clash
    with other external names.

 4. Added an alternate matching function, pcre_dfa_exec(), which matches using
    a different (DFA) algorithm. Although it is slower than the original
    function, it does have some advantages for certain types of matching
    problem.

 5. Upgrades to pcretest in order to test the features of pcre_dfa_exec(),
    including restarting after a partial match.

 6. A patch for pcregrep that defines INVALID_FILE_ATTRIBUTES if it is not
    defined when compiling for Windows was sent to me. I have put it into the
    code, though I have no means of testing or verifying it.

 7. Added the pcre_refcount() auxiliary function.

 8. Added the PCRE_FIRSTLINE option. This constrains an unanchored pattern to
    match before or at the first newline in the subject string. In pcretest,
    the /f option on a pattern can be used to set this.

 9. A repeated \w when used in UTF-8 mode with characters greater than 256
    would behave wrongly. This has been present in PCRE since release 4.0.

10. A number of changes to the pcregrep command:

    (a) Refactored how -x works; insert ^(...)$ instead of setting
        PCRE_ANCHORED and checking the length, in preparation for adding
        something similar for -w.

    (b) Added the -w (match as a word) option.

    (c) Refactored the way lines are read and buffered so as to have more
        than one at a time available.

    (d) Implemented a pcregrep test script.

    (e) Added the -M (multiline match) option. This allows patterns to match
        over several lines of the subject. The buffering ensures that at least
        8K, or the rest of the document (whichever is the shorter) is available
        for matching (and similarly the previous 8K for lookbehind assertions).

    (f) Changed the --help output so that it now says

          -w, --word-regex(p)

        instead of two lines, one with "regex" and the other with "regexp"
        because that confused at least one person since the short forms are the
        same. (This required a bit of code, as the output is generated
        automatically from a table. It wasn't just a text change.)

    (g) -- can be used to terminate pcregrep options if the next thing isn't an
        option but starts with a hyphen. Could be a pattern or a path name
        starting with a hyphen, for instance.

    (h) "-" can be given as a file name to represent stdin.

    (i) When file names are being printed, "(standard input)" is used for
        the standard input, for compatibility with GNU grep. Previously
        "<stdin>" was used.

    (j) The option --label=xxx can be used to supply a name to be used for
        stdin when file names are being printed. There is no short form.

    (k) Re-factored the options decoding logic because we are going to add
        two more options that take data. Such options can now be given in four
        different ways, e.g. "-fname", "-f name", "--file=name", "--file name".

    (l) Added the -A, -B, and -C options for requesting that lines of context
        around matches be printed.

    (m) Added the -L option to print the names of files that do not contain
        any matching lines, that is, the complement of -l.

    (n) The return code is 2 if any file cannot be opened, but pcregrep does
        continue to scan other files.

    (o) The -s option was incorrectly implemented. For compatibility with other
        greps, it now suppresses the error message for a non-existent or non-
        accessible file (but not the return code). There is a new option called
        -q that suppresses the output of matching lines, which was what -s was
        previously doing.

    (p) Added --include and --exclude options to specify files for inclusion
        and exclusion when recursing.

11. The Makefile was not using the Autoconf-supported LDFLAGS macro properly.
    Hopefully, it now does.

12. Missing cast in pcre_study().

13. Added an "uninstall" target to the makefile.

14. Replaced "extern" in the function prototypes in Makefile.in with
    "PCRE_DATA_SCOPE", which defaults to 'extern' or 'extern "C"' in the Unix
    world, but is set differently for Windows.

15. Added a second compiling function called pcre_compile2(). The only
    difference is that it has an extra argument, which is a pointer to an
    integer error code. When there is a compile-time failure, this is set
    non-zero, in addition to the error test pointer being set to point to an
    error message. The new argument may be NULL if no error number is required
    (but then you may as well call pcre_compile(), which is now just a
    wrapper). This facility is provided because some applications need a
    numeric error indication, but it has also enabled me to tidy up the way
    compile-time errors are handled in the POSIX wrapper.

16. Added VPATH=.libs to the makefile; this should help when building with one
    prefix path and installing with another. (Or so I'm told by someone who
    knows more about this stuff than I do.)

17. Added a new option, REG_DOTALL, to the POSIX function regcomp(). This
    passes PCRE_DOTALL to the pcre_compile() function, making the "." character
    match everything, including newlines. This is not POSIX-compatible, but
    somebody wanted the feature. From pcretest it can be activated by using
    both the P and the s flags.

18. AC_PROG_LIBTOOL appeared twice in Makefile.in. Removed one.

19. libpcre.pc was being incorrectly installed as executable.

20. A couple of places in pcretest check for end-of-line by looking for '\n';
    it now also looks for '\r' so that it will work unmodified on Windows.

21. Added Google's contributed C++ wrapper to the distribution.

22. Added some untidy missing memory free() calls in pcretest, to keep
    Electric Fence happy when testing.



Version 5.0 13-Sep-04
---------------------

 1. Internal change: literal characters are no longer packed up into items
    containing multiple characters in a single byte-string. Each character
    is now matched using a separate opcode. However, there may be more than one
    byte in the character in UTF-8 mode.

 2. The pcre_callout_block structure has two new fields: pattern_position and
    next_item_length. These contain the offset in the pattern to the next match
    item, and its length, respectively.

 3. The PCRE_AUTO_CALLOUT option for pcre_compile() requests the automatic
    insertion of callouts before each pattern item. Added the /C option to
    pcretest to make use of this.

 4. On the advice of a Windows user, the lines

      #if defined(_WIN32) || defined(WIN32)
      _setmode( _fileno( stdout ), 0x8000 );
      #endif  /* defined(_WIN32) || defined(WIN32) */

    have been added to the source of pcretest. This apparently does useful
    magic in relation to line terminators.

 5. Changed "r" and "w" in the calls to fopen() in pcretest to "rb" and "wb"
    for the benefit of those environments where the "b" makes a difference.

 6. The icc compiler has the same options as gcc, but "configure" doesn't seem
    to know about it. I have put a hack into configure.in that adds in code
    to set GCC=yes if CC=icc. This seems to end up at a point in the
    generated configure script that is early enough to affect the setting of
    compiler options, which is what is needed, but I have no means of testing
    whether it really works. (The user who reported this had patched the
    generated configure script, which of course I cannot do.)

    LATER: After change 22 below (new libtool files), the configure script
    seems to know about icc (and also ecc). Therefore, I have commented out
    this hack in configure.in.

 7. Added support for pkg-config (2 patches were sent in).

 8. Negated POSIX character classes that used a combination of internal tables
    were completely broken. These were [[:^alpha:]], [[:^alnum:]], and
    [[:^ascii]]. Typically, they would match almost any characters. The other
    POSIX classes were not broken in this way.

 9. Matching the pattern "\b.*?" against "ab cd", starting at offset 1, failed
    to find the match, as PCRE was deluded into thinking that the match had to
    start at the start point or following a newline. The same bug applied to
    patterns with negative forward assertions or any backward assertions
    preceding ".*" at the start, unless the pattern required a fixed first
    character. This was a failing pattern: "(?!.bcd).*". The bug is now fixed.

10. In UTF-8 mode, when moving forwards in the subject after a failed match
    starting at the last subject character, bytes beyond the end of the subject
    string were read.

11. Renamed the variable "class" as "classbits" to make life easier for C++
    users. (Previously there was a macro definition, but it apparently wasn't
    enough.)

12. Added the new field "tables" to the extra data so that tables can be passed
    in at exec time, or the internal tables can be re-selected. This allows
    a compiled regex to be saved and re-used at a later time by a different
    program that might have everything at different addresses.

13. Modified the pcre-config script so that, when run on Solaris, it shows a
    -R library as well as a -L library.

14. The debugging options of pcretest (-d on the command line or D on a
    pattern) showed incorrect output for anything following an extended class
    that contained multibyte characters and which was followed by a quantifier.

15. Added optional support for general category Unicode character properties
    via the \p, \P, and \X escapes. Unicode property support implies UTF-8
    support. It adds about 90K to the size of the library. The meanings of the
    inbuilt class escapes such as \d and \s have NOT been changed.

16. Updated pcredemo.c to include calls to free() to release the memory for the
    compiled pattern.

17. The generated file chartables.c was being created in the source directory
    instead of in the building directory. This caused the build to fail if the
    source directory was different from the building directory, and was
    read-only.

18. Added some sample Win commands from Mark Tetrode into the NON-UNIX-USE
    file. No doubt somebody will tell me if they don't make sense... Also added
    Dan Mooney's comments about building on OpenVMS.

19. Added support for partial matching via the PCRE_PARTIAL option for
    pcre_exec() and the \P data escape in pcretest.

20. Extended pcretest with 3 new pattern features:

    (i)   A pattern option of the form ">rest-of-line" causes pcretest to
          write the compiled pattern to the file whose name is "rest-of-line".
          This is a straight binary dump of the data, with the saved pointer to
          the character tables forced to be NULL. The study data, if any, is
          written too. After writing, pcretest reads a new pattern.

    (ii)  If, instead of a pattern, "<rest-of-line" is given, pcretest reads a
          compiled pattern from the given file. There must not be any
          occurrences of "<" in the file name (pretty unlikely); if there are,
          pcretest will instead treat the initial "<" as a pattern delimiter.
          After reading in the pattern, pcretest goes on to read data lines as
          usual.

    (iii) The F pattern option causes pcretest to flip the bytes in the 32-bit
          and 16-bit fields in a compiled pattern, to simulate a pattern that
          was compiled on a host of opposite endianness.

21. The pcre-exec() function can now cope with patterns that were compiled on
    hosts of opposite endianness, with this restriction:

      As for any compiled expression that is saved and used later, the tables
      pointer field cannot be preserved; the extra_data field in the arguments
      to pcre_exec() should be used to pass in a tables address if a value
      other than the default internal tables were used at compile time.

22. Calling pcre_exec() with a negative value of the "ovecsize" parameter is
    now diagnosed as an error. Previously, most of the time, a negative number
    would have been treated as zero, but if in addition "ovector" was passed as
    NULL, a crash could occur.

23. Updated the files ltmain.sh, config.sub, config.guess, and aclocal.m4 with
    new versions from the libtool 1.5 distribution (the last one is a copy of
    a file called libtool.m4). This seems to have fixed the need to patch
    "configure" to support Darwin 1.3 (which I used to do). However, I still
    had to patch ltmain.sh to ensure that ${SED} is set (it isn't on my
    workstation).

24. Changed the PCRE licence to be the more standard "BSD" licence.


Version 4.5 01-Dec-03
---------------------

 1. There has been some re-arrangement of the code for the match() function so
    that it can be compiled in a version that does not call itself recursively.
    Instead, it keeps those local variables that need separate instances for
    each "recursion" in a frame on the heap, and gets/frees frames whenever it
    needs to "recurse". Keeping track of where control must go is done by means
    of setjmp/longjmp. The whole thing is implemented by a set of macros that
    hide most of the details from the main code, and operates only if
    NO_RECURSE is defined while compiling pcre.c. If PCRE is built using the
    "configure" mechanism, "--disable-stack-for-recursion" turns on this way of
    operating.

    To make it easier for callers to provide specially tailored get/free
    functions for this usage, two new functions, pcre_stack_malloc, and
    pcre_stack_free, are used. They are always called in strict stacking order,
    and the size of block requested is always the same.

    The PCRE_CONFIG_STACKRECURSE info parameter can be used to find out whether
    PCRE has been compiled to use the stack or the heap for recursion. The
    -C option of pcretest uses this to show which version is compiled.

    A new data escape \S, is added to pcretest; it causes the amounts of store
    obtained and freed by both kinds of malloc/free at match time to be added
    to the output.

 2. Changed the locale test to use "fr_FR" instead of "fr" because that's
    what's available on my current Linux desktop machine.

 3. When matching a UTF-8 string, the test for a valid string at the start has
    been extended. If start_offset is not zero, PCRE now checks that it points
    to a byte that is the start of a UTF-8 character. If not, it returns
    PCRE_ERROR_BADUTF8_OFFSET (-11). Note: the whole string is still checked;
    this is necessary because there may be backward assertions in the pattern.
    When matching the same subject several times, it may save resources to use
    PCRE_NO_UTF8_CHECK on all but the first call if the string is long.

 4. The code for checking the validity of UTF-8 strings has been tightened so
    that it rejects (a) strings containing 0xfe or 0xff bytes and (b) strings
    containing "overlong sequences".

 5. Fixed a bug (appearing twice) that I could not find any way of exploiting!
    I had written "if ((digitab[*p++] && chtab_digit) == 0)" where the "&&"
    should have been "&", but it just so happened that all the cases this let
    through by mistake were picked up later in the function.

 6. I had used a variable called "isblank" - this is a C99 function, causing
    some compilers to warn. To avoid this, I renamed it (as "blankclass").

 7. Cosmetic: (a) only output another newline at the end of pcretest if it is
    prompting; (b) run "./pcretest /dev/null" at the start of the test script
    so the version is shown; (c) stop "make test" echoing "./RunTest".

 8. Added patches from David Burgess to enable PCRE to run on EBCDIC systems.

 9. The prototype for memmove() for systems that don't have it was using
    size_t, but the inclusion of the header that defines size_t was later. I've
    moved the #includes for the C headers earlier to avoid this.

10. Added some adjustments to the code to make it easier to compiler on certain
    special systems:

      (a) Some "const" qualifiers were missing.
      (b) Added the macro EXPORT before all exported functions; by default this
          is defined to be empty.
      (c) Changed the dftables auxiliary program (that builds chartables.c) so
          that it reads its output file name as an argument instead of writing
          to the standard output and assuming this can be redirected.

11. In UTF-8 mode, if a recursive reference (e.g. (?1)) followed a character
    class containing characters with values greater than 255, PCRE compilation
    went into a loop.

12. A recursive reference to a subpattern that was within another subpattern
    that had a minimum quantifier of zero caused PCRE to crash. For example,
    (x(y(?2))z)? provoked this bug with a subject that got as far as the
    recursion. If the recursively-called subpattern itself had a zero repeat,
    that was OK.

13. In pcretest, the buffer for reading a data line was set at 30K, but the
    buffer into which it was copied (for escape processing) was still set at
    1024, so long lines caused crashes.

14. A pattern such as /[ab]{1,3}+/ failed to compile, giving the error
    "internal error: code overflow...". This applied to any character class
    that was followed by a possessive quantifier.

15. Modified the Makefile to add libpcre.la as a prerequisite for
    libpcreposix.la because I was told this is needed for a parallel build to
    work.

16. If a pattern that contained .* following optional items at the start was
    studied, the wrong optimizing data was generated, leading to matching
    errors. For example, studying /[ab]*.*c/ concluded, erroneously, that any
    matching string must start with a or b or c. The correct conclusion for
    this pattern is that a match can start with any character.


Version 4.4 13-Aug-03
---------------------

 1. In UTF-8 mode, a character class containing characters with values between
    127 and 255 was not handled correctly if the compiled pattern was studied.
    In fixing this, I have also improved the studying algorithm for such
    classes (slightly).

 2. Three internal functions had redundant arguments passed to them. Removal
    might give a very teeny performance improvement.

 3. Documentation bug: the value of the capture_top field in a callout is *one
    more than* the number of the hightest numbered captured substring.

 4. The Makefile linked pcretest and pcregrep with -lpcre, which could result
    in incorrectly linking with a previously installed version. They now link
    explicitly with libpcre.la.

 5. configure.in no longer needs to recognize Cygwin specially.

 6. A problem in pcre.in for Windows platforms is fixed.

 7. If a pattern was successfully studied, and the -d (or /D) flag was given to
    pcretest, it used to include the size of the study block as part of its
    output. Unfortunately, the structure contains a field that has a different
    size on different hardware architectures. This meant that the tests that
    showed this size failed. As the block is currently always of a fixed size,
    this information isn't actually particularly useful in pcretest output, so
    I have just removed it.

 8. Three pre-processor statements accidentally did not start in column 1.
    Sadly, there are *still* compilers around that complain, even though
    standard C has not required this for well over a decade. Sigh.

 9. In pcretest, the code for checking callouts passed small integers in the
    callout_data field, which is a void * field. However, some picky compilers
    complained about the casts involved for this on 64-bit systems. Now
    pcretest passes the address of the small integer instead, which should get
    rid of the warnings.

10. By default, when in UTF-8 mode, PCRE now checks for valid UTF-8 strings at
    both compile and run time, and gives an error if an invalid UTF-8 sequence
    is found. There is a option for disabling this check in cases where the
    string is known to be correct and/or the maximum performance is wanted.

11. In response to a bug report, I changed one line in Makefile.in from

        -Wl,--out-implib,.libs/lib@WIN_PREFIX@pcreposix.dll.a \
    to
        -Wl,--out-implib,.libs/@WIN_PREFIX@libpcreposix.dll.a \

    to look similar to other lines, but I have no way of telling whether this
    is the right thing to do, as I do not use Windows. No doubt I'll get told
    if it's wrong...


Version 4.3 21-May-03
---------------------

1. Two instances of @WIN_PREFIX@ omitted from the Windows targets in the
   Makefile.

2. Some refactoring to improve the quality of the code:

   (i)   The utf8_table... variables are now declared "const".

   (ii)  The code for \cx, which used the "case flipping" table to upper case
         lower case letters, now just substracts 32. This is ASCII-specific,
         but the whole concept of \cx is ASCII-specific, so it seems
         reasonable.

   (iii) PCRE was using its character types table to recognize decimal and
         hexadecimal digits in the pattern. This is silly, because it handles
         only 0-9, a-f, and A-F, but the character types table is locale-
         specific, which means strange things might happen. A private
         table is now used for this - though it costs 256 bytes, a table is
         much faster than multiple explicit tests. Of course, the standard
         character types table is still used for matching digits in subject
         strings against \d.

   (iv)  Strictly, the identifier ESC_t is reserved by POSIX (all identifiers
         ending in _t are). So I've renamed it as ESC_tee.

3. The first argument for regexec() in the POSIX wrapper should have been
   defined as "const".

4. Changed pcretest to use malloc() for its buffers so that they can be
   Electric Fenced for debugging.

5. There were several places in the code where, in UTF-8 mode, PCRE would try
   to read one or more bytes before the start of the subject string. Often this
   had no effect on PCRE's behaviour, but in some circumstances it could
   provoke a segmentation fault.

6. A lookbehind at the start of a pattern in UTF-8 mode could also cause PCRE
   to try to read one or more bytes before the start of the subject string.

7. A lookbehind in a pattern matched in non-UTF-8 mode on a PCRE compiled with
   UTF-8 support could misbehave in various ways if the subject string
   contained bytes with the 0x80 bit set and the 0x40 bit unset in a lookbehind
   area. (PCRE was not checking for the UTF-8 mode flag, and trying to move
   back over UTF-8 characters.)


Version 4.2 14-Apr-03
---------------------

1. Typo "#if SUPPORT_UTF8" instead of "#ifdef SUPPORT_UTF8" fixed.

2. Changes to the building process, supplied by Ronald Landheer-Cieslak
     [ON_WINDOWS]: new variable, "#" on non-Windows platforms
     [NOT_ON_WINDOWS]: new variable, "#" on Windows platforms
     [WIN_PREFIX]: new variable, "cyg" for Cygwin
     * Makefile.in: use autoconf substitution for OBJEXT, EXEEXT, BUILD_OBJEXT
       and BUILD_EXEEXT
     Note: automatic setting of the BUILD variables is not yet working
     set CPPFLAGS and BUILD_CPPFLAGS (but don't use yet) - should be used at
       compile-time but not at link-time
     [LINK]: use for linking executables only
     make different versions for Windows and non-Windows
     [LINKLIB]: new variable, copy of UNIX-style LINK, used for linking
       libraries
     [LINK_FOR_BUILD]: new variable
     [OBJEXT]: use throughout
     [EXEEXT]: use throughout
     <winshared>: new target
     <wininstall>: new target
     <dftables.o>: use native compiler
     <dftables>: use native linker
     <install>: handle Windows platform correctly
     <clean>: ditto
     <check>: ditto
     copy DLL to top builddir before testing

   As part of these changes, -no-undefined was removed again. This was reported
   to give trouble on HP-UX 11.0, so getting rid of it seems like a good idea
   in any case.

3. Some tidies to get rid of compiler warnings:

   . In the match_data structure, match_limit was an unsigned long int, whereas
     match_call_count was an int. I've made them both unsigned long ints.

   . In pcretest the fact that a const uschar * doesn't automatically cast to
     a void * provoked a warning.

   . Turning on some more compiler warnings threw up some "shadow" variables
     and a few more missing casts.

4. If PCRE was complied with UTF-8 support, but called without the PCRE_UTF8
   option, a class that contained a single character with a value between 128
   and 255 (e.g. /[\xFF]/) caused PCRE to crash.

5. If PCRE was compiled with UTF-8 support, but called without the PCRE_UTF8
   option, a class that contained several characters, but with at least one
   whose value was between 128 and 255 caused PCRE to crash.


Version 4.1 12-Mar-03
---------------------

1. Compiling with gcc -pedantic found a couple of places where casts were
needed, and a string in dftables.c that was longer than standard compilers are
required to support.

2. Compiling with Sun's compiler found a few more places where the code could
be tidied up in order to avoid warnings.

3. The variables for cross-compiling were called HOST_CC and HOST_CFLAGS; the
first of these names is deprecated in the latest Autoconf in favour of the name
CC_FOR_BUILD, because "host" is typically used to mean the system on which the
compiled code will be run. I can't find a reference for HOST_CFLAGS, but by
analogy I have changed it to CFLAGS_FOR_BUILD.

4. Added -no-undefined to the linking command in the Makefile, because this is
apparently helpful for Windows. To make it work, also added "-L. -lpcre" to the
linking step for the pcreposix library.

5. PCRE was failing to diagnose the case of two named groups with the same
name.

6. A problem with one of PCRE's optimizations was discovered. PCRE remembers a
literal character that is needed in the subject for a match, and scans along to
ensure that it is present before embarking on the full matching process. This
saves time in cases of nested unlimited repeats that are never going to match.
Problem: the scan can take a lot of time if the subject is very long (e.g.
megabytes), thus penalizing straightforward matches. It is now done only if the
amount of subject to be scanned is less than 1000 bytes.

7. A lesser problem with the same optimization is that it was recording the
first character of an anchored pattern as "needed", thus provoking a search
right along the subject, even when the first match of the pattern was going to
fail. The "needed" character is now not set for anchored patterns, unless it
follows something in the pattern that is of non-fixed length. Thus, it still
fulfils its original purpose of finding quick non-matches in cases of nested
unlimited repeats, but isn't used for simple anchored patterns such as /^abc/.


Version 4.0 17-Feb-03
---------------------

1. If a comment in an extended regex that started immediately after a meta-item
extended to the end of string, PCRE compiled incorrect data. This could lead to
all kinds of weird effects. Example: /#/ was bad; /()#/ was bad; /a#/ was not.

2. Moved to autoconf 2.53 and libtool 1.4.2.

3. Perl 5.8 no longer needs "use utf8" for doing UTF-8 things. Consequently,
the special perltest8 script is no longer needed - all the tests can be run
from a single perltest script.

4. From 5.004, Perl has not included the VT character (0x0b) in the set defined
by \s. It has now been removed in PCRE. This means it isn't recognized as
whitespace in /x regexes too, which is the same as Perl. Note that the POSIX
class [:space:] *does* include VT, thereby creating a mess.

5. Added the class [:blank:] (a GNU extension from Perl 5.8) to match only
space and tab.

6. Perl 5.005 was a long time ago. It's time to amalgamate the tests that use
its new features into the main test script, reducing the number of scripts.

7. Perl 5.8 has changed the meaning of patterns like /a(?i)b/. Earlier versions
were backward compatible, and made the (?i) apply to the whole pattern, as if
/i were given. Now it behaves more logically, and applies the option setting
only to what follows. PCRE has been changed to follow suit. However, if it
finds options settings right at the start of the pattern, it extracts them into
the global options, as before. Thus, they show up in the info data.

8. Added support for the \Q...\E escape sequence. Characters in between are
treated as literals. This is slightly different from Perl in that $ and @ are
also handled as literals inside the quotes. In Perl, they will cause variable
interpolation. Note the following examples:

    Pattern            PCRE matches      Perl matches

    \Qabc$xyz\E        abc$xyz           abc followed by the contents of $xyz
    \Qabc\$xyz\E       abc\$xyz          abc\$xyz
    \Qabc\E\$\Qxyz\E   abc$xyz           abc$xyz

For compatibility with Perl, \Q...\E sequences are recognized inside character
classes as well as outside them.

9. Re-organized 3 code statements in pcretest to avoid "overflow in
floating-point constant arithmetic" warnings from a Microsoft compiler. Added a
(size_t) cast to one statement in pcretest and one in pcreposix to avoid
signed/unsigned warnings.

10. SunOS4 doesn't have strtoul(). This was used only for unpicking the -o
option for pcretest, so I've replaced it by a simple function that does just
that job.

11. pcregrep was ending with code 0 instead of 2 for the commands "pcregrep" or
"pcregrep -".

12. Added "possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's
Java package. This provides some syntactic sugar for simple cases of what my
documentation calls "once-only subpatterns". A pattern such as x*+ is the same
as (?>x*). In other words, if what is inside (?>...) is just a single repeated
item, you can use this simplified notation. Note that only makes sense with
greedy quantifiers. Consequently, the use of the possessive quantifier forces
greediness, whatever the setting of the PCRE_UNGREEDY option.

13. A change of greediness default within a pattern was not taking effect at
the current level for patterns like /(b+(?U)a+)/. It did apply to parenthesized
subpatterns that followed. Patterns like /b+(?U)a+/ worked because the option
was abstracted outside.

14. PCRE now supports the \G assertion. It is true when the current matching
position is at the start point of the match. This differs from \A when the
starting offset is non-zero. Used with the /g option of pcretest (or similar
code), it works in the same way as it does for Perl's /g option. If all
alternatives of a regex begin with \G, the expression is anchored to the start
match position, and the "anchored" flag is set in the compiled expression.

15. Some bugs concerning the handling of certain option changes within patterns
have been fixed. These applied to options other than (?ims). For example,
"a(?x: b c )d" did not match "XabcdY" but did match "Xa b c dY". It should have
been the other way round. Some of this was related to change 7 above.

16. PCRE now gives errors for /[.x.]/ and /[=x=]/ as unsupported POSIX
features, as Perl does. Previously, PCRE gave the warnings only for /[[.x.]]/
and /[[=x=]]/. PCRE now also gives an error for /[:name:]/ because it supports
POSIX classes only within a class (e.g. /[[:alpha:]]/).

17. Added support for Perl's \C escape. This matches one byte, even in UTF8
mode. Unlike ".", it always matches newline, whatever the setting of
PCRE_DOTALL. However, PCRE does not permit \C to appear in lookbehind
assertions. Perl allows it, but it doesn't (in general) work because it can't
calculate the length of the lookbehind. At least, that's the case for Perl
5.8.0 - I've been told they are going to document that it doesn't work in
future.

18. Added an error diagnosis for escapes that PCRE does not support: these are
\L, \l, \N, \P, \p, \U, \u, and \X.

19. Although correctly diagnosing a missing ']' in a character class, PCRE was
reading past the end of the pattern in cases such as /[abcd/.

20. PCRE was getting more memory than necessary for patterns with classes that
contained both POSIX named classes and other characters, e.g. /[[:space:]abc/.

21. Added some code, conditional on #ifdef VPCOMPAT, to make life easier for
compiling PCRE for use with Virtual Pascal.

22. Small fix to the Makefile to make it work properly if the build is done
outside the source tree.

23. Added a new extension: a condition to go with recursion. If a conditional
subpattern starts with (?(R) the "true" branch is used if recursion has
happened, whereas the "false" branch is used only at the top level.

24. When there was a very long string of literal characters (over 255 bytes
without UTF support, over 250 bytes with UTF support), the computation of how
much memory was required could be incorrect, leading to segfaults or other
strange effects.

25. PCRE was incorrectly assuming anchoring (either to start of subject or to
start of line for a non-DOTALL pattern) when a pattern started with (.*) and
there was a subsequent back reference to those brackets. This meant that, for
example, /(.*)\d+\1/ failed to match "abc123bc". Unfortunately, it isn't
possible to check for precisely this case. All we can do is abandon the
optimization if .* occurs inside capturing brackets when there are any back
references whatsoever. (See below for a better fix that came later.)

26. The handling of the optimization for finding the first character of a
non-anchored pattern, and for finding a character that is required later in the
match were failing in some cases. This didn't break the matching; it just
failed to optimize when it could. The way this is done has been re-implemented.

27. Fixed typo in error message for invalid (?R item (it said "(?p").

28. Added a new feature that provides some of the functionality that Perl
provides with (?{...}). The facility is termed a "callout". The way it is done
in PCRE is for the caller to provide an optional function, by setting
pcre_callout to its entry point. Like pcre_malloc and pcre_free, this is a
global variable. By default it is unset, which disables all calling out. To get
the function called, the regex must include (?C) at appropriate points. This
is, in fact, equivalent to (?C0), and any number <= 255 may be given with (?C).
This provides a means of identifying different callout points. When PCRE
reaches such a point in the regex, if pcre_callout has been set, the external
function is called. It is provided with data in a structure called
pcre_callout_block, which is defined in pcre.h. If the function returns 0,
matching continues; if it returns a non-zero value, the match at the current
point fails. However, backtracking will occur if possible. [This was changed
later and other features added - see item 49 below.]

29. pcretest is upgraded to test the callout functionality. It provides a
callout function that displays information. By default, it shows the start of
the match and the current position in the text. There are some new data escapes
to vary what happens:

    \C+         in addition, show current contents of captured substrings
    \C-         do not supply a callout function
    \C!n        return 1 when callout number n is reached
    \C!n!m      return 1 when callout number n is reached for the mth time

30. If pcregrep was called with the -l option and just a single file name, it
output "<stdin>" if a match was found, instead of the file name.

31. Improve the efficiency of the POSIX API to PCRE. If the number of capturing
slots is less than POSIX_MALLOC_THRESHOLD, use a block on the stack to pass to
pcre_exec(). This saves a malloc/free per call. The default value of
POSIX_MALLOC_THRESHOLD is 10; it can be changed by --with-posix-malloc-threshold
when configuring.

32. The default maximum size of a compiled pattern is 64K. There have been a
few cases of people hitting this limit. The code now uses macros to handle the
storing of links as offsets within the compiled pattern. It defaults to 2-byte
links, but this can be changed to 3 or 4 bytes by --with-link-size when
configuring. Tests 2 and 5 work only with 2-byte links because they output
debugging information about compiled patterns.

33. Internal code re-arrangements:

(a) Moved the debugging function for printing out a compiled regex into
    its own source file (printint.c) and used #include to pull it into
    pcretest.c and, when DEBUG is defined, into pcre.c, instead of having two
    separate copies.

(b) Defined the list of op-code names for debugging as a macro in
    internal.h so that it is next to the definition of the opcodes.

(c) Defined a table of op-code lengths for simpler skipping along compiled
    code. This is again a macro in internal.h so that it is next to the
    definition of the opcodes.

34. Added support for recursive calls to individual subpatterns, along the
lines of Robin Houston's patch (but implemented somewhat differently).

35. Further mods to the Makefile to help Win32. Also, added code to pcregrep to
allow it to read and process whole directories in Win32. This code was
contributed by Lionel Fourquaux; it has not been tested by me.

36. Added support for named subpatterns. The Python syntax (?P<name>...) is
used to name a group. Names consist of alphanumerics and underscores, and must
be unique. Back references use the syntax (?P=name) and recursive calls use
(?P>name) which is a PCRE extension to the Python extension. Groups still have
numbers. The function pcre_fullinfo() can be used after compilation to extract
a name/number map. There are three relevant calls:

  PCRE_INFO_NAMEENTRYSIZE        yields the size of each entry in the map
  PCRE_INFO_NAMECOUNT            yields the number of entries
  PCRE_INFO_NAMETABLE            yields a pointer to the map.

The map is a vector of fixed-size entries. The size of each entry depends on
the length of the longest name used. The first two bytes of each entry are the
group number, most significant byte first. There follows the corresponding
name, zero terminated. The names are in alphabetical order.

37. Make the maximum literal string in the compiled code 250 for the non-UTF-8
case instead of 255. Making it the same both with and without UTF-8 support
means that the same test output works with both.

38. There was a case of malloc(0) in the POSIX testing code in pcretest. Avoid
calling malloc() with a zero argument.

39. Change 25 above had to resort to a heavy-handed test for the .* anchoring
optimization. I've improved things by keeping a bitmap of backreferences with
numbers 1-31 so that if .* occurs inside capturing brackets that are not in
fact referenced, the optimization can be applied. It is unlikely that a
relevant occurrence of .* (i.e. one which might indicate anchoring or forcing
the match to follow \n) will appear inside brackets with a number greater than
31, but if it does, any back reference > 31 suppresses the optimization.

40. Added a new compile-time option PCRE_NO_AUTO_CAPTURE. This has the effect
of disabling numbered capturing parentheses. Any opening parenthesis that is
not followed by ? behaves as if it were followed by ?: but named parentheses
can still be used for capturing (and they will acquire numbers in the usual
way).

41. Redesigned the return codes from the match() function into yes/no/error so
that errors can be passed back from deep inside the nested calls. A malloc
failure while inside a recursive subpattern call now causes the
PCRE_ERROR_NOMEMORY return instead of quietly going wrong.

42. It is now possible to set a limit on the number of times the match()
function is called in a call to pcre_exec(). This facility makes it possible to
limit the amount of recursion and backtracking, though not in a directly
obvious way, because the match() function is used in a number of different
circumstances. The count starts from zero for each position in the subject
string (for non-anchored patterns). The default limit is, for compatibility, a
large number, namely 10 000 000. You can change this in two ways:

(a) When configuring PCRE before making, you can use --with-match-limit=n
    to set a default value for the compiled library.

(b) For each call to pcre_exec(), you can pass a pcre_extra block in which
    a different value is set. See 45 below.

If the limit is exceeded, pcre_exec() returns PCRE_ERROR_MATCHLIMIT.

43. Added a new function pcre_config(int, void *) to enable run-time extraction
of things that can be changed at compile time. The first argument specifies
what is wanted and the second points to where the information is to be placed.
The current list of available information is:

  PCRE_CONFIG_UTF8

The output is an integer that is set to one if UTF-8 support is available;
otherwise it is set to zero.

  PCRE_CONFIG_NEWLINE

The output is an integer that it set to the value of the code that is used for
newline. It is either LF (10) or CR (13).

  PCRE_CONFIG_LINK_SIZE

The output is an integer that contains the number of bytes used for internal
linkage in compiled expressions. The value is 2, 3, or 4. See item 32 above.

  PCRE_CONFIG_POSIX_MALLOC_THRESHOLD

The output is an integer that contains the threshold above which the POSIX
interface uses malloc() for output vectors. See item 31 above.

  PCRE_CONFIG_MATCH_LIMIT

The output is an unsigned integer that contains the default limit of the number
of match() calls in a pcre_exec() execution. See 42 above.

44. pcretest has been upgraded by the addition of the -C option. This causes it
to extract all the available output from the new pcre_config() function, and to
output it. The program then exits immediately.

45. A need has arisen to pass over additional data with calls to pcre_exec() in
order to support additional features. One way would have been to define
pcre_exec2() (for example) with extra arguments, but this would not have been
extensible, and would also have required all calls to the original function to
be mapped to the new one. Instead, I have chosen to extend the mechanism that
is used for passing in "extra" data from pcre_study().

The pcre_extra structure is now exposed and defined in pcre.h. It currently
contains the following fields:

  flags         a bitmap indicating which of the following fields are set
  study_data    opaque data from pcre_study()
  match_limit   a way of specifying a limit on match() calls for a specific
                  call to pcre_exec()
  callout_data  data for callouts (see 49 below)

The flag bits are also defined in pcre.h, and are

  PCRE_EXTRA_STUDY_DATA
  PCRE_EXTRA_MATCH_LIMIT
  PCRE_EXTRA_CALLOUT_DATA

The pcre_study() function now returns one of these new pcre_extra blocks, with
the actual study data pointed to by the study_data field, and the
PCRE_EXTRA_STUDY_DATA flag set. This can be passed directly to pcre_exec() as
before. That is, this change is entirely upwards-compatible and requires no
change to existing code.

If you want to pass in additional data to pcre_exec(), you can either place it
in a pcre_extra block provided by pcre_study(), or create your own pcre_extra
block.

46. pcretest has been extended to test the PCRE_EXTRA_MATCH_LIMIT feature. If a
data string contains the escape sequence \M, pcretest calls pcre_exec() several
times with different match limits, until it finds the minimum value needed for
pcre_exec() to complete. The value is then output. This can be instructive; for
most simple matches the number is quite small, but for pathological cases it
gets very large very quickly.

47. There's a new option for pcre_fullinfo() called PCRE_INFO_STUDYSIZE. It
returns the size of the data block pointed to by the study_data field in a
pcre_extra block, that is, the value that was passed as the argument to
pcre_malloc() when PCRE was getting memory in which to place the information
created by pcre_study(). The fourth argument should point to a size_t variable.
pcretest has been extended so that this information is shown after a successful
pcre_study() call when information about the compiled regex is being displayed.

48. Cosmetic change to Makefile: there's no need to have / after $(DESTDIR)
because what follows is always an absolute path. (Later: it turns out that this
is more than cosmetic for MinGW, because it doesn't like empty path
components.)

49. Some changes have been made to the callout feature (see 28 above):

(i)  A callout function now has three choices for what it returns:

       0  =>  success, carry on matching
     > 0  =>  failure at this point, but backtrack if possible
     < 0  =>  serious error, return this value from pcre_exec()

     Negative values should normally be chosen from the set of PCRE_ERROR_xxx
     values. In particular, returning PCRE_ERROR_NOMATCH forces a standard
     "match failed" error. The error number PCRE_ERROR_CALLOUT is reserved for
     use by callout functions. It will never be used by PCRE itself.

(ii) The pcre_extra structure (see 45 above) has a void * field called
     callout_data, with corresponding flag bit PCRE_EXTRA_CALLOUT_DATA. The
     pcre_callout_block structure has a field of the same name. The contents of
     the field passed in the pcre_extra structure are passed to the callout
     function in the corresponding field in the callout block. This makes it
     easier to use the same callout-containing regex from multiple threads. For
     testing, the pcretest program has a new data escape

       \C*n        pass the number n (may be negative) as callout_data

     If the callout function in pcretest receives a non-zero value as
     callout_data, it returns that value.

50. Makefile wasn't handling CFLAGS properly when compiling dftables. Also,
there were some redundant $(CFLAGS) in commands that are now specified as
$(LINK), which already includes $(CFLAGS).

51. Extensions to UTF-8 support are listed below. These all apply when (a) PCRE
has been compiled with UTF-8 support *and* pcre_compile() has been compiled
with the PCRE_UTF8 flag. Patterns that are compiled without that flag assume
one-byte characters throughout. Note that case-insensitive matching applies
only to characters whose values are less than 256. PCRE doesn't support the
notion of cases for higher-valued characters.

(i)   A character class whose characters are all within 0-255 is handled as
      a bit map, and the map is inverted for negative classes. Previously, a
      character > 255 always failed to match such a class; however it should
      match if the class was a negative one (e.g. [^ab]). This has been fixed.

(ii)  A negated character class with a single character < 255 is coded as
      "not this character" (OP_NOT). This wasn't working properly when the test
      character was multibyte, either singly or repeated.

(iii) Repeats of multibyte characters are now handled correctly in UTF-8
      mode, for example: \x{100}{2,3}.

(iv)  The character escapes \b, \B, \d, \D, \s, \S, \w, and \W (either
      singly or repeated) now correctly test multibyte characters. However,
      PCRE doesn't recognize any characters with values greater than 255 as
      digits, spaces, or word characters. Such characters always match \D, \S,
      and \W, and never match \d, \s, or \w.

(v)   Classes may now contain characters and character ranges with values
      greater than 255. For example: [ab\x{100}-\x{400}].

(vi)  pcregrep now has a --utf-8 option (synonym -u) which makes it call
      PCRE in UTF-8 mode.

52. The info request value PCRE_INFO_FIRSTCHAR has been renamed
PCRE_INFO_FIRSTBYTE because it is a byte value. However, the old name is
retained for backwards compatibility. (Note that LASTLITERAL is also a byte
value.)

53. The single man page has become too large. I have therefore split it up into
a number of separate man pages. These also give rise to individual HTML pages;
these are now put in a separate directory, and there is an index.html page that
lists them all. Some hyperlinking between the pages has been installed.

54. Added convenience functions for handling named capturing parentheses.

55. Unknown escapes inside character classes (e.g. [\M]) and escapes that
aren't interpreted therein (e.g. [\C]) are literals in Perl. This is now also
true in PCRE, except when the PCRE_EXTENDED option is set, in which case they
are faulted.

56. Introduced HOST_CC and HOST_CFLAGS which can be set in the environment when
calling configure. These values are used when compiling the dftables.c program
which is run to generate the source of the default character tables. They
default to the values of CC and CFLAGS. If you are cross-compiling PCRE,
you will need to set these values.

57. Updated the building process for Windows DLL, as provided by Fred Cox.


Version 3.9 02-Jan-02
---------------------

1. A bit of extraneous text had somehow crept into the pcregrep documentation.

2. If --disable-static was given, the building process failed when trying to
build pcretest and pcregrep. (For some reason it was using libtool to compile
them, which is not right, as they aren't part of the library.)


Version 3.8 18-Dec-01
---------------------

1. The experimental UTF-8 code was completely screwed up. It was packing the
bytes in the wrong order. How dumb can you get?


Version 3.7 29-Oct-01
---------------------

1. In updating pcretest to check change 1 of version 3.6, I screwed up.
This caused pcretest, when used on the test data, to segfault. Unfortunately,
this didn't happen under Solaris 8, where I normally test things.

2. The Makefile had to be changed to make it work on BSD systems, where 'make'
doesn't seem to recognize that ./xxx and xxx are the same file. (This entry
isn't in ChangeLog distributed with 3.7 because I forgot when I hastily made
this fix an hour or so after the initial 3.7 release.)


Version 3.6 23-Oct-01
---------------------

1. Crashed with /(sens|respons)e and \1ibility/ and "sense and sensibility" if
offsets passed as NULL with zero offset count.

2. The config.guess and config.sub files had not been updated when I moved to
the latest autoconf.


Version 3.5 15-Aug-01
---------------------

1. Added some missing #if !defined NOPOSIX conditionals in pcretest.c that
had been forgotten.

2. By using declared but undefined structures, we can avoid using "void"
definitions in pcre.h while keeping the internal definitions of the structures
private.

3. The distribution is now built using autoconf 2.50 and libtool 1.4. From a
user point of view, this means that both static and shared libraries are built
by default, but this can be individually controlled. More of the work of
handling this static/shared cases is now inside libtool instead of PCRE's make
file.

4. The pcretest utility is now installed along with pcregrep because it is
useful for users (to test regexs) and by doing this, it automatically gets
relinked by libtool. The documentation has been turned into a man page, so
there are now .1, .txt, and .html versions in /doc.

5. Upgrades to pcregrep:
   (i)   Added long-form option names like gnu grep.
   (ii)  Added --help to list all options with an explanatory phrase.
   (iii) Added -r, --recursive to recurse into sub-directories.
   (iv)  Added -f, --file to read patterns from a file.

6. pcre_exec() was referring to its "code" argument before testing that
argument for NULL (and giving an error if it was NULL).

7. Upgraded Makefile.in to allow for compiling in a different directory from
the source directory.

8. Tiny buglet in pcretest: when pcre_fullinfo() was called to retrieve the
options bits, the pointer it was passed was to an int instead of to an unsigned
long int. This mattered only on 64-bit systems.

9. Fixed typo (3.4/1) in pcre.h again. Sigh. I had changed pcre.h (which is
generated) instead of pcre.in, which it its source. Also made the same change
in several of the .c files.

10. A new release of gcc defines printf() as a macro, which broke pcretest
because it had an ifdef in the middle of a string argument for printf(). Fixed
by using separate calls to printf().

11. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure
script, to force use of CR or LF instead of \n in the source. On non-Unix
systems, the value can be set in config.h.

12. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an
absolute limit. Changed the text of the error message to make this clear, and
likewise updated the man page.

13. The limit of 99 on the number of capturing subpatterns has been removed.
The new limit is 65535, which I hope will not be a "real" limit.


Version 3.4 22-Aug-00
---------------------

1. Fixed typo in pcre.h: unsigned const char * changed to const unsigned char *.

2. Diagnose condition (?(0) as an error instead of crashing on matching.


Version 3.3 01-Aug-00
---------------------

1. If an octal character was given, but the value was greater than \377, it
was not getting masked to the least significant bits, as documented. This could
lead to crashes in some systems.

2. Perl 5.6 (if not earlier versions) accepts classes like [a-\d] and treats
the hyphen as a literal. PCRE used to give an error; it now behaves like Perl.

3. Added the functions pcre_free_substring() and pcre_free_substring_list().
These just pass their arguments on to (pcre_free)(), but they are provided
because some uses of PCRE bind it to non-C systems that can call its functions,
but cannot call free() or pcre_free() directly.

4. Add "make test" as a synonym for "make check". Corrected some comments in
the Makefile.

5. Add $(DESTDIR)/ in front of all the paths in the "install" target in the
Makefile.

6. Changed the name of pgrep to pcregrep, because Solaris has introduced a
command called pgrep for grepping around the active processes.

7. Added the beginnings of support for UTF-8 character strings.

8. Arranged for the Makefile to pass over the settings of CC, CFLAGS, and
RANLIB to ./ltconfig so that they are used by libtool. I think these are all
the relevant ones. (AR is not passed because ./ltconfig does its own figuring
out for the ar command.)


Version 3.2 12-May-00
---------------------

This is purely a bug fixing release.

1. If the pattern /((Z)+|A)*/ was matched agained ZABCDEFG it matched Z instead
of ZA. This was just one example of several cases that could provoke this bug,
which was introduced by change 9 of version 2.00. The code for breaking
infinite loops after an iteration that matches an empty string was't working
correctly.

2. The pcretest program was not imitating Perl correctly for the pattern /a*/g
when matched against abbab (for example). After matching an empty string, it
wasn't forcing anchoring when setting PCRE_NOTEMPTY for the next attempt; this
caused it to match further down the string than it should.

3. The code contained an inclusion of sys/types.h. It isn't clear why this
was there because it doesn't seem to be needed, and it causes trouble on some
systems, as it is not a Standard C header. It has been removed.

4. Made 4 silly changes to the source to avoid stupid compiler warnings that
were reported on the Macintosh. The changes were from

  while ((c = *(++ptr)) != 0 && c != '\n');
to
  while ((c = *(++ptr)) != 0 && c != '\n') ;

Totally extraordinary, but if that's what it takes...

5. PCRE is being used in one environment where neither memmove() nor bcopy() is
available. Added HAVE_BCOPY and an autoconf test for it; if neither
HAVE_MEMMOVE nor HAVE_BCOPY is set, use a built-in emulation function which
assumes the way PCRE uses memmove() (always moving upwards).

6. PCRE is being used in one environment where strchr() is not available. There
was only one use in pcre.c, and writing it out to avoid strchr() probably gives
faster code anyway.


Version 3.1 09-Feb-00
---------------------

The only change in this release is the fixing of some bugs in Makefile.in for
the "install" target:

(1) It was failing to install pcreposix.h.

(2) It was overwriting the pcre.3 man page with the pcreposix.3 man page.


Version 3.0 01-Feb-00
---------------------

1. Add support for the /+ modifier to perltest (to output $` like it does in
pcretest).

2. Add support for the /g modifier to perltest.

3. Fix pcretest so that it behaves even more like Perl for /g when the pattern
matches null strings.

4. Fix perltest so that it doesn't do unwanted things when fed an empty
pattern. Perl treats empty patterns specially - it reuses the most recent
pattern, which is not what we want. Replace // by /(?#)/ in order to avoid this
effect.

5. The POSIX interface was broken in that it was just handing over the POSIX
captured string vector to pcre_exec(), but (since release 2.00) PCRE has
required a bigger vector, with some working space on the end. This means that
the POSIX wrapper now has to get and free some memory, and copy the results.

6. Added some simple autoconf support, placing the test data and the
documentation in separate directories, re-organizing some of the
information files, and making it build pcre-config (a GNU standard). Also added
libtool support for building PCRE as a shared library, which is now the
default.

7. Got rid of the leading zero in the definition of PCRE_MINOR because 08 and
09 are not valid octal constants. Single digits will be used for minor values
less than 10.

8. Defined REG_EXTENDED and REG_NOSUB as zero in the POSIX header, so that
existing programs that set these in the POSIX interface can use PCRE without
modification.

9. Added a new function, pcre_fullinfo() with an extensible interface. It can
return all that pcre_info() returns, plus additional data. The pcre_info()
function is retained for compatibility, but is considered to be obsolete.

10. Added experimental recursion feature (?R) to handle one common case that
Perl 5.6 will be able to do with (?p{...}).

11. Added support for POSIX character classes like [:alpha:], which Perl is
adopting.


Version 2.08 31-Aug-99
----------------------

1. When startoffset was not zero and the pattern began with ".*", PCRE was not
trying to match at the startoffset position, but instead was moving forward to
the next newline as if a previous match had failed.

2. pcretest was not making use of PCRE_NOTEMPTY when repeating for /g and /G,
and could get into a loop if a null string was matched other than at the start
of the subject.

3. Added definitions of PCRE_MAJOR and PCRE_MINOR to pcre.h so the version can
be distinguished at compile time, and for completeness also added PCRE_DATE.

5. Added Paul Sokolovsky's minor changes to make it easy to compile a Win32 DLL
in GnuWin32 environments.


Version 2.07 29-Jul-99
----------------------

1. The documentation is now supplied in plain text form and HTML as well as in
the form of man page sources.

2. C++ compilers don't like assigning (void *) values to other pointer types.
In particular this affects malloc(). Although there is no problem in Standard
C, I've put in casts to keep C++ compilers happy.

3. Typo on pcretest.c; a cast of (unsigned char *) in the POSIX regexec() call
should be (const char *).

4. If NOPOSIX is defined, pcretest.c compiles without POSIX support. This may
be useful for non-Unix systems who don't want to bother with the POSIX stuff.
However, I haven't made this a standard facility. The documentation doesn't
mention it, and the Makefile doesn't support it.

5. The Makefile now contains an "install" target, with editable destinations at
the top of the file. The pcretest program is not installed.

6. pgrep -V now gives the PCRE version number and date.

7. Fixed bug: a zero repetition after a literal string (e.g. /abcde{0}/) was
causing the entire string to be ignored, instead of just the last character.

8. If a pattern like /"([^\\"]+|\\.)*"/ is applied in the normal way to a
non-matching string, it can take a very, very long time, even for strings of
quite modest length, because of the nested recursion. PCRE now does better in
some of these cases. It does this by remembering the last required literal
character in the pattern, and pre-searching the subject to ensure it is present
before running the real match. In other words, it applies a heuristic to detect
some types of certain failure quickly, and in the above example, if presented
with a string that has no trailing " it gives "no match" very quickly.

9. A new runtime option PCRE_NOTEMPTY causes null string matches to be ignored;
other alternatives are tried instead.


Version 2.06 09-Jun-99
----------------------

1. Change pcretest's output for amount of store used to show just the code
space, because the remainder (the data block) varies in size between 32-bit and
64-bit systems.

2. Added an extra argument to pcre_exec() to supply an offset in the subject to
start matching at. This allows lookbehinds to work when searching for multiple
occurrences in a string.

3. Added additional options to pcretest for testing multiple occurrences:

   /+   outputs the rest of the string that follows a match
   /g   loops for multiple occurrences, using the new startoffset argument
   /G   loops for multiple occurrences by passing an incremented pointer

4. PCRE wasn't doing the "first character" optimization for patterns starting
with \b or \B, though it was doing it for other lookbehind assertions. That is,
it wasn't noticing that a match for a pattern such as /\bxyz/ has to start with
the letter 'x'. On long subject strings, this gives a significant speed-up.


Version 2.05 21-Apr-99
----------------------

1. Changed the type of magic_number from int to long int so that it works
properly on 16-bit systems.

2. Fixed a bug which caused patterns starting with .* not to work correctly
when the subject string contained newline characters. PCRE was assuming
anchoring for such patterns in all cases, which is not correct because .* will
not pass a newline unless PCRE_DOTALL is set. It now assumes anchoring only if
DOTALL is set at top level; otherwise it knows that patterns starting with .*
must be retried after every newline in the subject.


Version 2.04 18-Feb-99
----------------------

1. For parenthesized subpatterns with repeats whose minimum was zero, the
computation of the store needed to hold the pattern was incorrect (too large).
If such patterns were nested a few deep, this could multiply and become a real
problem.

2. Added /M option to pcretest to show the memory requirement of a specific
pattern. Made -m a synonym of -s (which does this globally) for compatibility.

3. Subpatterns of the form (regex){n,m} (i.e. limited maximum) were being
compiled in such a way that the backtracking after subsequent failure was
pessimal. Something like (a){0,3} was compiled as (a)?(a)?(a)? instead of
((a)((a)(a)?)?)? with disastrous performance if the maximum was of any size.


Version 2.03 02-Feb-99
----------------------

1. Fixed typo and small mistake in man page.

2. Added 4th condition (GPL supersedes if conflict) and created separate
LICENCE file containing the conditions.

3. Updated pcretest so that patterns such as /abc\/def/ work like they do in
Perl, that is the internal \ allows the delimiter to be included in the
pattern. Locked out the use of \ as a delimiter. If \ immediately follows
the final delimiter, add \ to the end of the pattern (to test the error).

4. Added the convenience functions for extracting substrings after a successful
match. Updated pcretest to make it able to test these functions.


Version 2.02 14-Jan-99
----------------------

1. Initialized the working variables associated with each extraction so that
their saving and restoring doesn't refer to uninitialized store.

2. Put dummy code into study.c in order to trick the optimizer of the IBM C
compiler for OS/2 into generating correct code. Apparently IBM isn't going to
fix the problem.

3. Pcretest: the timing code wasn't using LOOPREPEAT for timing execution
calls, and wasn't printing the correct value for compiling calls. Increased the
default value of LOOPREPEAT, and the number of significant figures in the
times.

4. Changed "/bin/rm" in the Makefile to "-rm" so it works on Windows NT.

5. Renamed "deftables" as "dftables" to get it down to 8 characters, to avoid
a building problem on Windows NT with a FAT file system.


Version 2.01 21-Oct-98
----------------------

1. Changed the API for pcre_compile() to allow for the provision of a pointer
to character tables built by pcre_maketables() in the current locale. If NULL
is passed, the default tables are used.


Version 2.00 24-Sep-98
----------------------

1. Since the (>?) facility is in Perl 5.005, don't require PCRE_EXTRA to enable
it any more.

2. Allow quantification of (?>) groups, and make it work correctly.

3. The first character computation wasn't working for (?>) groups.

4. Correct the implementation of \Z (it is permitted to match on the \n at the
end of the subject) and add 5.005's \z, which really does match only at the
very end of the subject.

5. Remove the \X "cut" facility; Perl doesn't have it, and (?> is neater.

6. Remove the ability to specify CASELESS, MULTILINE, DOTALL, and
DOLLAR_END_ONLY at runtime, to make it possible to implement the Perl 5.005
localized options. All options to pcre_study() were also removed.

7. Add other new features from 5.005:

   $(?<=           positive lookbehind
   $(?<!           negative lookbehind
   (?imsx-imsx)    added the unsetting capability
                   such a setting is global if at outer level; local otherwise
   (?imsx-imsx:)   non-capturing groups with option setting
   (?(cond)re|re)  conditional pattern matching

   A backreference to itself in a repeated group matches the previous
   captured string.

8. General tidying up of studying (both automatic and via "study")
consequential on the addition of new assertions.

9. As in 5.005, unlimited repeated groups that could match an empty substring
are no longer faulted at compile time. Instead, the loop is forcibly broken at
runtime if any iteration does actually match an empty substring.

10. Include the RunTest script in the distribution.

11. Added tests from the Perl 5.005_02 distribution. This showed up a few
discrepancies, some of which were old and were also with respect to 5.004. They
have now been fixed.


Version 1.09 28-Apr-98
----------------------

1. A negated single character class followed by a quantifier with a minimum
value of one (e.g.  [^x]{1,6}  ) was not compiled correctly. This could lead to
program crashes, or just wrong answers. This did not apply to negated classes
containing more than one character, or to minima other than one.


Version 1.08 27-Mar-98
----------------------

1. Add PCRE_UNGREEDY to invert the greediness of quantifiers.

2. Add (?U) and (?X) to set PCRE_UNGREEDY and PCRE_EXTRA respectively. The
latter must appear before anything that relies on it in the pattern.


Version 1.07 16-Feb-98
----------------------

1. A pattern such as /((a)*)*/ was not being diagnosed as in error (unlimited
repeat of a potentially empty string).


Version 1.06 23-Jan-98
----------------------

1. Added Markus Oberhumer's little patches for C++.

2. Literal strings longer than 255 characters were broken.


Version 1.05 23-Dec-97
----------------------

1. Negated character classes containing more than one character were failing if
PCRE_CASELESS was set at run time.


Version 1.04 19-Dec-97
----------------------

1. Corrected the man page, where some "const" qualifiers had been omitted.

2. Made debugging output print "{0,xxx}" instead of just "{,xxx}" to agree with
input syntax.

3. Fixed memory leak which occurred when a regex with back references was
matched with an offsets vector that wasn't big enough. The temporary memory
that is used in this case wasn't being freed if the match failed.

4. Tidied pcretest to ensure it frees memory that it gets.

5. Temporary memory was being obtained in the case where the passed offsets
vector was exactly big enough.

6. Corrected definition of offsetof() from change 5 below.

7. I had screwed up change 6 below and broken the rules for the use of
setjmp(). Now fixed.


Version 1.03 18-Dec-97
----------------------

1. A erroneous regex with a missing opening parenthesis was correctly
diagnosed, but PCRE attempted to access brastack[-1], which could cause crashes
on some systems.

2. Replaced offsetof(real_pcre, code) by offsetof(real_pcre, code[0]) because
it was reported that one broken compiler failed on the former because "code" is
also an independent variable.

3. The erroneous regex a[]b caused an array overrun reference.

4. A regex ending with a one-character negative class (e.g. /[^k]$/) did not
fail on data ending with that character. (It was going on too far, and checking
the next character, typically a binary zero.) This was specific to the
optimized code for single-character negative classes.

5. Added a contributed patch from the TIN world which does the following:

  + Add an undef for memmove, in case the the system defines a macro for it.

  + Add a definition of offsetof(), in case there isn't one. (I don't know
    the reason behind this - offsetof() is part of the ANSI standard - but
    it does no harm).

  + Reduce the ifdef's in pcre.c using macro DPRINTF, thereby eliminating
    most of the places where whitespace preceded '#'. I have given up and
    allowed the remaining 2 cases to be at the margin.

  + Rename some variables in pcre to eliminate shadowing. This seems very
    pedantic, but does no harm, of course.

6. Moved the call to setjmp() into its own function, to get rid of warnings
from gcc -Wall, and avoided calling it at all unless PCRE_EXTRA is used.

7. Constructs such as \d{8,} were compiling into the equivalent of
\d{8}\d{0,65527} instead of \d{8}\d* which didn't make much difference to the
outcome, but in this particular case used more store than had been allocated,
which caused the bug to be discovered because it threw up an internal error.

8. The debugging code in both pcre and pcretest for outputting the compiled
form of a regex was going wrong in the case of back references followed by
curly-bracketed repeats.


Version 1.02 12-Dec-97
----------------------

1. Typos in pcre.3 and comments in the source fixed.

2. Applied a contributed patch to get rid of places where it used to remove
'const' from variables, and fixed some signed/unsigned and uninitialized
variable warnings.

3. Added the "runtest" target to Makefile.

4. Set default compiler flag to -O2 rather than just -O.


Version 1.01 19-Nov-97
----------------------

1. PCRE was failing to diagnose unlimited repeat of empty string for patterns
like /([ab]*)*/, that is, for classes with more than one character in them.

2. Likewise, it wasn't diagnosing patterns with "once-only" subpatterns, such
as /((?>a*))*/ (a PCRE_EXTRA facility).


Version 1.00 18-Nov-97
----------------------

1. Added compile-time macros to support systems such as SunOS4 which don't have
memmove() or strerror() but have other things that can be used instead.

2. Arranged that "make clean" removes the executables.


Version 0.99 27-Oct-97
----------------------

1. Fixed bug in code for optimizing classes with only one character. It was
initializing a 32-byte map regardless, which could cause it to run off the end
of the memory it had got.

2. Added, conditional on PCRE_EXTRA, the proposed (?>REGEX) construction.


Version 0.98 22-Oct-97
----------------------

1. Fixed bug in code for handling temporary memory usage when there are more
back references than supplied space in the ovector. This could cause segfaults.


Version 0.97 21-Oct-97
----------------------

1. Added the \X "cut" facility, conditional on PCRE_EXTRA.

2. Optimized negated single characters not to use a bit map.

3. Brought error texts together as macro definitions; clarified some of them;
fixed one that was wrong - it said "range out of order" when it meant "invalid
escape sequence".

4. Changed some char * arguments to const char *.

5. Added PCRE_NOTBOL and PCRE_NOTEOL (from POSIX).

6. Added the POSIX-style API wrapper in pcreposix.a and testing facilities in
pcretest.


Version 0.96 16-Oct-97
----------------------

1. Added a simple "pgrep" utility to the distribution.

2. Fixed an incompatibility with Perl: "{" is now treated as a normal character
unless it appears in one of the precise forms "{ddd}", "{ddd,}", or "{ddd,ddd}"
where "ddd" means "one or more decimal digits".

3. Fixed serious bug. If a pattern had a back reference, but the call to
pcre_exec() didn't supply a large enough ovector to record the related
identifying subpattern, the match always failed. PCRE now remembers the number
of the largest back reference, and gets some temporary memory in which to save
the offsets during matching if necessary, in order to ensure that
backreferences always work.

4. Increased the compatibility with Perl in a number of ways:

  (a) . no longer matches \n by default; an option PCRE_DOTALL is provided
      to request this handling. The option can be set at compile or exec time.

  (b) $ matches before a terminating newline by default; an option
      PCRE_DOLLAR_ENDONLY is provided to override this (but not in multiline
      mode). The option can be set at compile or exec time.

  (c) The handling of \ followed by a digit other than 0 is now supposed to be
      the same as Perl's. If the decimal number it represents is less than 10
      or there aren't that many previous left capturing parentheses, an octal
      escape is read. Inside a character class, it's always an octal escape,
      even if it is a single digit.

  (d) An escaped but undefined alphabetic character is taken as a literal,
      unless PCRE_EXTRA is set. Currently this just reserves the remaining
      escapes.

  (e) {0} is now permitted. (The previous item is removed from the compiled
      pattern).

5. Changed all the names of code files so that the basic parts are no longer
than 10 characters, and abolished the teeny "globals.c" file.

6. Changed the handling of character classes; they are now done with a 32-byte
bit map always.

7. Added the -d and /D options to pcretest to make it possible to look at the
internals of compilation without having to recompile pcre.


Version 0.95 23-Sep-97
----------------------

1. Fixed bug in pre-pass concerning escaped "normal" characters such as \x5c or
\x20 at the start of a run of normal characters. These were being treated as
real characters, instead of the source characters being re-checked.


Version 0.94 18-Sep-97
----------------------

1. The functions are now thread-safe, with the caveat that the global variables
containing pointers to malloc() and free() or alternative functions are the
same for all threads.

2. Get pcre_study() to generate a bitmap of initial characters for non-
anchored patterns when this is possible, and use it if passed to pcre_exec().


Version 0.93 15-Sep-97
----------------------

1. /(b)|(:+)/ was computing an incorrect first character.

2. Add pcre_study() to the API and the passing of pcre_extra to pcre_exec(),
but not actually doing anything yet.

3. Treat "-" characters in classes that cannot be part of ranges as literals,
as Perl does (e.g. [-az] or [az-]).

4. Set the anchored flag if a branch starts with .* or .*? because that tests
all possible positions.

5. Split up into different modules to avoid including unneeded functions in a
compiled binary. However, compile and exec are still in one module. The "study"
function is split off.

6. The character tables are now in a separate module whose source is generated
by an auxiliary program - but can then be edited by hand if required. There are
now no calls to isalnum(), isspace(), isdigit(), isxdigit(), tolower() or
toupper() in the code.

7. Turn the malloc/free funtions variables into pcre_malloc and pcre_free and
make them global. Abolish the function for setting them, as the caller can now
set them directly.


Version 0.92 11-Sep-97
----------------------

1. A repeat with a fixed maximum and a minimum of 1 for an ordinary character
(e.g. /a{1,3}/) was broken (I mis-optimized it).

2. Caseless matching was not working in character classes if the characters in
the pattern were in upper case.

3. Make ranges like [W-c] work in the same way as Perl for caseless matching.

4. Make PCRE_ANCHORED public and accept as a compile option.

5. Add an options word to pcre_exec() and accept PCRE_ANCHORED and
PCRE_CASELESS at run time. Add escapes \A and \I to pcretest to cause it to
pass them.

6. Give an error if bad option bits passed at compile or run time.

7. Add PCRE_MULTILINE at compile and exec time, and (?m) as well. Add \M to
pcretest to cause it to pass that flag.

8. Add pcre_info(), to get the number of identifying subpatterns, the stored
options, and the first character, if set.

9. Recognize C+ or C{n,m} where n >= 1 as providing a fixed starting character.


Version 0.91 10-Sep-97
----------------------

1. PCRE was failing to diagnose unlimited repeats of subpatterns that could
match the empty string as in /(a*)*/. It was looping and ultimately crashing.

2. PCRE was looping on encountering an indefinitely repeated back reference to
a subpattern that had matched an empty string, e.g. /(a|)\1*/. It now does what
Perl does - treats the match as successful.

****
PKMP%[�m^�qqdoc/alt-pcre/NEWSnu�[���News about PCRE releases
------------------------

Release 8.41 13-June-2017
-------------------------

This is a bug-fix release.


Release 8.40 11-January-2017
----------------------------

This is a bug-fix release.


Release 8.39 14-June-2016
-------------------------

Some appropriate PCRE2 JIT improvements have been retro-fitted to PCRE1. Apart
from that, this is another bug-fix release. Note that this library (now called
PCRE1) is now being maintained for bug fixes only. New projects are advised to
use the new PCRE2 libraries.


Release 8.38 23-November-2015
-----------------------------

This is bug-fix release. Note that this library (now called PCRE1) is now being
maintained for bug fixes only. New projects are advised to use the new PCRE2
libraries.


Release 8.37 28-April-2015
--------------------------

This is bug-fix release. Note that this library (now called PCRE1) is now being
maintained for bug fixes only. New projects are advised to use the new PCRE2
libraries.


Release 8.36 26-September-2014
------------------------------

This is primarily a bug-fix release. However, in addition, the Unicode data
tables have been updated to Unicode 7.0.0.


Release 8.35 04-April-2014
--------------------------

There have been performance improvements for classes containing non-ASCII
characters and the "auto-possessification" feature has been extended. Other
minor improvements have been implemented and bugs fixed. There is a new callout
feature to enable applications to do detailed stack checks at compile time, to
avoid running out of stack for deeply nested parentheses. The JIT compiler has
been extended with experimental support for ARM-64, MIPS-64, and PPC-LE.


Release 8.34 15-December-2013
-----------------------------

As well as fixing the inevitable bugs, performance has been improved by
refactoring and extending the amount of "auto-possessification" that PCRE does.
Other notable changes:

.  Implemented PCRE_INFO_MATCH_EMPTY, which yields 1 if the pattern can match
   an empty string. If it can, pcretest shows this in its information output.

.  A back reference to a named subpattern when there is more than one of the
   same name now checks them in the order in which they appear in the pattern.
   The first one that is set is used for the reference. Previously only the
   first one was inspected. This change makes PCRE more compatible with Perl.

.  Unicode character properties were updated from Unicode 6.3.0.

.  The character VT has been added to the set of characters that match \s and
   are generally treated as white space, following this same change in Perl
   5.18. There is now no difference between "Perl space" and "POSIX space".

.  Perl has changed its handling of \8 and \9. If there is no previously
   encountered capturing group of those numbers, they are treated as the
   literal characters 8 and 9 instead of a binary zero followed by the
   literals. PCRE now does the same.

.  Following Perl, added \o{} to specify codepoints in octal, making it
   possible to specify values greater than 0777 and also making them
   unambiguous.

.  In UCP mode, \s was not matching two of the characters that Perl matches,
   namely NEL (U+0085) and MONGOLIAN VOWEL SEPARATOR (U+180E), though they
   were matched by \h.

.  Add JIT support for the 64 bit TileGX architecture.

.  Upgraded the handling of the POSIX classes [:graph:], [:print:], and
   [:punct:] when PCRE_UCP is set so as to include the same characters as Perl
   does in Unicode mode.

.  Perl no longer allows group names to start with digits, so I have made this
   change also in PCRE.

.  Added support for [[:<:]] and [[:>:]] as used in the BSD POSIX library to
   mean "start of word" and "end of word", respectively, as a transition aid.


Release 8.33 28-May-2013
--------------------------

A number of bugs are fixed, and some performance improvements have been made.
There are also some new features, of which these are the most important:

.  The behaviour of the backtracking verbs has been rationalized and
   documented in more detail.

.  JIT now supports callouts and all of the backtracking verbs.

.  Unicode validation has been updated in the light of Unicode Corrigendum #9,
   which points out that "non characters" are not "characters that may not
   appear in Unicode strings" but rather "characters that are reserved for
   internal use and have only local meaning".

.  (*LIMIT_MATCH=d) and (*LIMIT_RECURSION=d) have been added so that the
   creator of a pattern can specify lower (but not higher) limits for the
   matching process.

.  The PCRE_NEVER_UTF option is available to prevent pattern-writers from using
   the (*UTF) feature, as this could be a security issue.


Release 8.32 30-November-2012
-----------------------------

This release fixes a number of bugs, but also has some new features. These are
the highlights:

.  There is now support for 32-bit character strings and UTF-32. Like the
   16-bit support, this is done by compiling a separate 32-bit library.

.  \X now matches a Unicode extended grapheme cluster.

.  Case-independent matching of Unicode characters that have more than one
   "other case" now makes all three (or more) characters equivalent. This
   applies, for example, to Greek Sigma, which has two lowercase versions.

.  Unicode character properties are updated to Unicode 6.2.0.

.  The EBCDIC support, which had decayed, has had a spring clean.

.  A number of JIT optimizations have been added, which give faster JIT
   execution speed. In addition, a new direct interface to JIT execution is
   available. This bypasses some of the sanity checks of pcre_exec() to give a
   noticeable speed-up.

.  A number of issues in pcregrep have been fixed, making it more compatible
   with GNU grep. In particular, --exclude and --include (and variants) apply
   to all files now, not just those obtained from scanning a directory
   recursively. In Windows environments, the default action for directories is
   now "skip" instead of "read" (which provokes an error).

.  If the --only-matching (-o) option in pcregrep is specified multiple
   times, each one causes appropriate output. For example, -o1 -o2 outputs the
   substrings matched by the 1st and 2nd capturing parentheses. A separating
   string can be specified by --om-separator (default empty).

.  When PCRE is built via Autotools using a version of gcc that has the
   "visibility" feature, it is used to hide internal library functions that are
   not part of the public API.


Release 8.31 06-July-2012
-------------------------

This is mainly a bug-fixing release, with a small number of developments:

. The JIT compiler now supports partial matching and the (*MARK) and
  (*COMMIT) verbs.

. PCRE_INFO_MAXLOOKBEHIND can be used to find the longest lookbehind in a
  pattern.

. There should be a performance improvement when using the heap instead of the
  stack for recursion.

. pcregrep can now be linked with libedit as an alternative to libreadline.

. pcregrep now has a --file-list option where the list of files to scan is
  given as a file.

. pcregrep now recognizes binary files and there are related options.

. The Unicode tables have been updated to 6.1.0.

As always, the full list of changes is in the ChangeLog file.


Release 8.30 04-February-2012
-----------------------------

Release 8.30 introduces a major new feature: support for 16-bit character
strings, compiled as a separate library. There are a few changes to the
8-bit library, in addition to some bug fixes.

. The pcre_info() function, which has been obsolete for over 10 years, has
  been removed.

. When a compiled pattern was saved to a file and later reloaded on a host
  with different endianness, PCRE used automatically to swap the bytes in some
  of the data fields. With the advent of the 16-bit library, where more of this
  swapping is needed, it is no longer done automatically. Instead, the bad
  endianness is detected and a specific error is given. The user can then call
  a new function called pcre_pattern_to_host_byte_order() (or an equivalent
  16-bit function) to do the swap.

. In UTF-8 mode, the values 0xd800 to 0xdfff are not legal Unicode
  code points and are now faulted. (They are the so-called "surrogates"
  that are reserved for coding high values in UTF-16.)


Release 8.21 12-Dec-2011
------------------------

This is almost entirely a bug-fix release. The only new feature is the ability
to obtain the size of the memory used by the JIT compiler.


Release 8.20 21-Oct-2011
------------------------

The main change in this release is the inclusion of Zoltan Herczeg's
just-in-time compiler support, which can be accessed by building PCRE with
--enable-jit. Large performance benefits can be had in many situations. 8.20
also fixes an unfortunate bug that was introduced in 8.13 as well as tidying up
a number of infelicities and differences from Perl.


Release 8.13 16-Aug-2011
------------------------

This is mainly a bug-fix release. There has been a lot of internal refactoring.
The Unicode tables have been updated. The only new feature in the library is
the passing of *MARK information to callouts. Some additions have been made to
pcretest to make testing easier and more comprehensive. There is a new option
for pcregrep to adjust its internal buffer size.


Release 8.12 15-Jan-2011
------------------------

This release fixes some bugs in pcregrep, one of which caused the tests to fail
on 64-bit big-endian systems. There are no changes to the code of the library.


Release 8.11 10-Dec-2010
------------------------

A number of bugs in the library and in pcregrep have been fixed. As always, see
ChangeLog for details. The following are the non-bug-fix changes:

. Added --match-limit and --recursion-limit to pcregrep.

. Added an optional parentheses number to the -o and --only-matching options
  of pcregrep.

. Changed the way PCRE_PARTIAL_HARD affects the matching of $, \z, \Z, \b, and
  \B.

. Added PCRE_ERROR_SHORTUTF8 to make it possible to distinguish between a
  bad UTF-8 sequence and one that is incomplete when using PCRE_PARTIAL_HARD.

. Recognize (*NO_START_OPT) at the start of a pattern to set the PCRE_NO_
  START_OPTIMIZE option, which is now allowed at compile time


Release 8.10 25-Jun-2010
------------------------

There are two major additions: support for (*MARK) and friends, and the option
PCRE_UCP, which changes the behaviour of \b, \d, \s, and \w (and their
opposites) so that they make use of Unicode properties. There are also a number
of lesser new features, and several bugs have been fixed. A new option,
--line-buffered, has been added to pcregrep, for use when it is connected to
pipes.


Release 8.02 19-Mar-2010
------------------------

Another bug-fix release.


Release 8.01 19-Jan-2010
------------------------

This is a bug-fix release. Several bugs in the code itself and some bugs and
infelicities in the build system have been fixed.


Release 8.00 19-Oct-09
----------------------

Bugs have been fixed in the library and in pcregrep. There are also some
enhancements. Restrictions on patterns used for partial matching have been
removed, extra information is given for partial matches, the partial matching
process has been improved, and an option to make a partial match override a
full match is available. The "study" process has been enhanced by finding a
lower bound matching length. Groups with duplicate numbers may now have
duplicated names without the use of PCRE_DUPNAMES. However, they may not have
different names. The documentation has been revised to reflect these changes.
The version number has been expanded to 3 digits as it is clear that the rate
of change is not slowing down.


Release 7.9 11-Apr-09
---------------------

Mostly bugfixes and tidies with just a couple of minor functional additions.


Release 7.8 05-Sep-08
---------------------

More bug fixes, plus a performance improvement in Unicode character property
lookup.


Release 7.7 07-May-08
---------------------

This is once again mainly a bug-fix release, but there are a couple of new
features.


Release 7.6 28-Jan-08
---------------------

The main reason for having this release so soon after 7.5 is because it fixes a
potential buffer overflow problem in pcre_compile() when run in UTF-8 mode. In
addition, the CMake configuration files have been brought up to date.


Release 7.5 10-Jan-08
---------------------

This is mainly a bug-fix release. However the ability to link pcregrep with
libz or libbz2 and the ability to link pcretest with libreadline have been
added. Also the --line-offsets and --file-offsets options were added to
pcregrep.


Release 7.4 21-Sep-07
---------------------

The only change of specification is the addition of options to control whether
\R matches any Unicode line ending (the default) or just CR, LF, and CRLF.
Otherwise, the changes are bug fixes and a refactoring to reduce the number of
relocations needed in a shared library. There have also been some documentation
updates, in particular, some more information about using CMake to build PCRE
has been added to the NON-UNIX-USE file.


Release 7.3 28-Aug-07
---------------------

Most changes are bug fixes. Some that are not:

1. There is some support for Perl 5.10's experimental "backtracking control
   verbs" such as (*PRUNE).

2. UTF-8 checking is now as per RFC 3629 instead of RFC 2279; this is more
   restrictive in the strings it accepts.

3. Checking for potential integer overflow has been made more dynamic, and as a
   consequence there is no longer a hard limit on the size of a subpattern that
   has a limited repeat count.

4. When CRLF is a valid line-ending sequence, pcre_exec() and pcre_dfa_exec()
   no longer advance by two characters instead of one when an unanchored match
   fails at CRLF if there are explicit CR or LF matches within the pattern.
   This gets rid of some anomalous effects that previously occurred.

5. Some PCRE-specific settings for varying the newline options at the start of
   a pattern have been added.


Release 7.2 19-Jun-07
---------------------

WARNING: saved patterns that were compiled by earlier versions of PCRE must be
recompiled for use with 7.2 (necessitated by the addition of \K, \h, \H, \v,
and \V).

Correction to the notes for 7.1: the note about shared libraries for Windows is
wrong. Previously, three libraries were built, but each could function
independently. For example, the pcreposix library also included all the
functions from the basic pcre library. The change is that the three libraries
are no longer independent. They are like the Unix libraries. To use the
pcreposix functions, for example, you need to link with both the pcreposix and
the basic pcre library.

Some more features from Perl 5.10 have been added:

  (?-n) and (?+n) relative references for recursion and subroutines.

  (?(-n) and (?(+n) relative references as conditions.

  \k{name} and \g{name} are synonyms for \k<name>.

  \K to reset the start of the matched string; for example, (foo)\Kbar
  matches bar preceded by foo, but only sets bar as the matched string.

  (?| introduces a group where the capturing parentheses in each alternative
  start from the same number; for example, (?|(abc)|(xyz)) sets capturing
  parentheses number 1 in both cases.

  \h, \H, \v, \V match horizontal and vertical whitespace, respectively.


Release 7.1 24-Apr-07
---------------------

There is only one new feature in this release: a linebreak setting of
PCRE_NEWLINE_ANYCRLF. It is a cut-down version of PCRE_NEWLINE_ANY, which
recognizes only CRLF, CR, and LF as linebreaks.

A few bugs are fixed (see ChangeLog for details), but the major change is a
complete re-implementation of the build system. This now has full Autotools
support and so is now "standard" in some sense. It should help with compiling
PCRE in a wide variety of environments.

NOTE: when building shared libraries for Windows, three dlls are now built,
called libpcre, libpcreposix, and libpcrecpp. Previously, everything was
included in a single dll.

Another important change is that the dftables auxiliary program is no longer
compiled and run at "make" time by default. Instead, a default set of character
tables (assuming ASCII coding) is used. If you want to use dftables to generate
the character tables as previously, add --enable-rebuild-chartables to the
"configure" command. You must do this if you are compiling PCRE to run on a
system that uses EBCDIC code.

There is a discussion about character tables in the README file. The default is
not to use dftables so that that there is no problem when cross-compiling.


Release 7.0 19-Dec-06
---------------------

This release has a new major number because there have been some internal
upheavals to facilitate the addition of new optimizations and other facilities,
and to make subsequent maintenance and extension easier. Compilation is likely
to be a bit slower, but there should be no major effect on runtime performance.
Previously compiled patterns are NOT upwards compatible with this release. If
you have saved compiled patterns from a previous release, you will have to
re-compile them. Important changes that are visible to users are:

1. The Unicode property tables have been updated to Unicode 5.0.0, which adds
   some more scripts.

2. The option PCRE_NEWLINE_ANY causes PCRE to recognize any Unicode newline
   sequence as a newline.

3. The \R escape matches a single Unicode newline sequence as a single unit.

4. New features that will appear in Perl 5.10 are now in PCRE. These include
   alternative Perl syntax for named parentheses, and Perl syntax for
   recursion.

5. The C++ wrapper interface has been extended by the addition of a
   QuoteMeta function and the ability to allow copy construction and
   assignment.

For a complete list of changes, see the ChangeLog file.


Release 6.7 04-Jul-06
---------------------

The main additions to this release are the ability to use the same name for
multiple sets of parentheses, and support for CRLF line endings in both the
library and pcregrep (and in pcretest for testing).

Thanks to Ian Taylor, the stack usage for many kinds of pattern has been
significantly reduced for certain subject strings.


Release 6.5 01-Feb-06
---------------------

Important changes in this release:

1. A number of new features have been added to pcregrep.

2. The Unicode property tables have been updated to Unicode 4.1.0, and the
   supported properties have been extended with script names such as "Arabic",
   and the derived properties "Any" and "L&". This has necessitated a change to
   the interal format of compiled patterns. Any saved compiled patterns that
   use \p or \P must be recompiled.

3. The specification of recursion in patterns has been changed so that all
   recursive subpatterns are automatically treated as atomic groups. Thus, for
   example, (?R) is treated as if it were (?>(?R)). This is necessary because
   otherwise there are situations where recursion does not work.

See the ChangeLog for a complete list of changes, which include a number of bug
fixes and tidies.


Release 6.0 07-Jun-05
---------------------

The release number has been increased to 6.0 because of the addition of several
major new pieces of functionality.

A new function, pcre_dfa_exec(), which implements pattern matching using a DFA
algorithm, has been added. This has a number of advantages for certain cases,
though it does run more slowly, and lacks the ability to capture substrings. On
the other hand, it does find all matches, not just the first, and it works
better for partial matching. The pcrematching man page discusses the
differences.

The pcretest program has been enhanced so that it can make use of the new
pcre_dfa_exec() matching function and the extra features it provides.

The distribution now includes a C++ wrapper library. This is built
automatically if a C++ compiler is found. The pcrecpp man page discusses this
interface.

The code itself has been re-organized into many more files, one for each
function, so it no longer requires everything to be linked in when static
linkage is used. As a consequence, some internal functions have had to have
their names exposed. These functions all have names starting with _pcre_. They
are undocumented, and are not intended for use by outside callers.

The pcregrep program has been enhanced with new functionality such as
multiline-matching and options for output more matching context. See the
ChangeLog for a complete list of changes to the library and the utility
programs.


Release 5.0 13-Sep-04
---------------------

The licence under which PCRE is released has been changed to the more
conventional "BSD" licence.

In the code, some bugs have been fixed, and there are also some major changes
in this release (which is why I've increased the number to 5.0). Some changes
are internal rearrangements, and some provide a number of new facilities. The
new features are:

1. There's an "automatic callout" feature that inserts callouts before every
   item in the regex, and there's a new callout field that gives the position
   in the pattern - useful for debugging and tracing.

2. The extra_data structure can now be used to pass in a set of character
   tables at exec time. This is useful if compiled regex are saved and re-used
   at a later time when the tables may not be at the same address. If the
   default internal tables are used, the pointer saved with the compiled
   pattern is now set to NULL, which means that you don't need to do anything
   special unless you are using custom tables.

3. It is possible, with some restrictions on the content of the regex, to
   request "partial" matching. A special return code is given if all of the
   subject string matched part of the regex. This could be useful for testing
   an input field as it is being typed.

4. There is now some optional support for Unicode character properties, which
   means that the patterns items such as \p{Lu} and \X can now be used. Only
   the general category properties are supported. If PCRE is compiled with this
   support, an additional 90K data structure is include, which increases the
   size of the library dramatically.

5. There is support for saving compiled patterns and re-using them later.

6. There is support for running regular expressions that were compiled on a
   different host with the opposite endianness.

7. The pcretest program has been extended to accommodate the new features.

The main internal rearrangement is that sequences of literal characters are no
longer handled as strings. Instead, each character is handled on its own. This
makes some UTF-8 handling easier, and makes the support of partial matching
possible. Compiled patterns containing long literal strings will be larger as a
result of this change; I hope that performance will not be much affected.


Release 4.5 01-Dec-03
---------------------

Again mainly a bug-fix and tidying release, with only a couple of new features:

1. It's possible now to compile PCRE so that it does not use recursive
function calls when matching. Instead it gets memory from the heap. This slows
things down, but may be necessary on systems with limited stacks.

2. UTF-8 string checking has been tightened to reject overlong sequences and to
check that a starting offset points to the start of a character. Failure of the
latter returns a new error code: PCRE_ERROR_BADUTF8_OFFSET.

3. PCRE can now be compiled for systems that use EBCDIC code.


Release 4.4 21-Aug-03
---------------------

This is mainly a bug-fix and tidying release. The only new feature is that PCRE
checks UTF-8 strings for validity by default. There is an option to suppress
this, just in case anybody wants that teeny extra bit of performance.


Releases 4.1 - 4.3
------------------

Sorry, I forgot about updating the NEWS file for these releases. Please take a
look at ChangeLog.


Release 4.0 17-Feb-03
---------------------

There have been a lot of changes for the 4.0 release, adding additional
functionality and mending bugs. Below is a list of the highlights of the new
functionality. For full details of these features, please consult the
documentation. For a complete list of changes, see the ChangeLog file.

1. Support for Perl's \Q...\E escapes.

2. "Possessive quantifiers" ?+, *+, ++, and {,}+ which come from Sun's Java
package. They provide some syntactic sugar for simple cases of "atomic
grouping".

3. Support for the \G assertion. It is true when the current matching position
is at the start point of the match.

4. A new feature that provides some of the functionality that Perl provides
with (?{...}). The facility is termed a "callout". The way it is done in PCRE
is for the caller to provide an optional function, by setting pcre_callout to
its entry point. To get the function called, the regex must include (?C) at
appropriate points.

5. Support for recursive calls to individual subpatterns. This makes it really
easy to get totally confused.

6. Support for named subpatterns. The Python syntax (?P<name>...) is used to
name a group.

7. Several extensions to UTF-8 support; it is now fairly complete. There is an
option for pcregrep to make it operate in UTF-8 mode.

8. The single man page has been split into a number of separate man pages.
These also give rise to individual HTML pages which are put in a separate
directory. There is an index.html page that lists them all. Some hyperlinking
between the pages has been installed.


Release 3.5 15-Aug-01
---------------------

1. The configuring system has been upgraded to use later versions of autoconf
and libtool. By default it builds both a shared and a static library if the OS
supports it. You can use --disable-shared or --disable-static on the configure
command if you want only one of them.

2. The pcretest utility is now installed along with pcregrep because it is
useful for users (to test regexs) and by doing this, it automatically gets
relinked by libtool. The documentation has been turned into a man page, so
there are now .1, .txt, and .html versions in /doc.

3. Upgrades to pcregrep:
   (i)   Added long-form option names like gnu grep.
   (ii)  Added --help to list all options with an explanatory phrase.
   (iii) Added -r, --recursive to recurse into sub-directories.
   (iv)  Added -f, --file to read patterns from a file.

4. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure
script, to force use of CR or LF instead of \n in the source. On non-Unix
systems, the value can be set in config.h.

5. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an
absolute limit. Changed the text of the error message to make this clear, and
likewise updated the man page.

6. The limit of 99 on the number of capturing subpatterns has been removed.
The new limit is 65535, which I hope will not be a "real" limit.


Release 3.3 01-Aug-00
---------------------

There is some support for UTF-8 character strings. This is incomplete and
experimental. The documentation describes what is and what is not implemented.
Otherwise, this is just a bug-fixing release.


Release 3.0 01-Feb-00
---------------------

1. A "configure" script is now used to configure PCRE for Unix systems. It
builds a Makefile, a config.h file, and the pcre-config script.

2. PCRE is built as a shared library by default.

3. There is support for POSIX classes such as [:alpha:].

5. There is an experimental recursion feature.

----------------------------------------------------------------------------
          IMPORTANT FOR THOSE UPGRADING FROM VERSIONS BEFORE 2.00

Please note that there has been a change in the API such that a larger
ovector is required at matching time, to provide some additional workspace.
The new man page has details. This change was necessary in order to support
some of the new functionality in Perl 5.005.

          IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.00

Another (I hope this is the last!) change has been made to the API for the
pcre_compile() function. An additional argument has been added to make it
possible to pass over a pointer to character tables built in the current
locale by pcre_maketables(). To use the default tables, this new argument
should be passed as NULL.

          IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.05

Yet another (and again I hope this really is the last) change has been made
to the API for the pcre_exec() function. An additional argument has been
added to make it possible to start the match other than at the start of the
subject string. This is important if there are lookbehinds. The new man
page has the details, but you just want to convert existing programs, all
you need to do is to stick in a new fifth argument to pcre_exec(), with a
value of zero. For example, change

  pcre_exec(pattern, extra, subject, length, options, ovec, ovecsize)
to
  pcre_exec(pattern, extra, subject, length, 0, options, ovec, ovecsize)

****
PKMP%[ʿ��SSdoc/alt-pcre/AUTHORSnu�[���THE MAIN PCRE LIBRARY
---------------------

Written by:       Philip Hazel
Email local part: ph10
Email domain:     cam.ac.uk

University of Cambridge Computing Service,
Cambridge, England.

Copyright (c) 1997-2017 University of Cambridge
All rights reserved


PCRE JUST-IN-TIME COMPILATION SUPPORT
-------------------------------------

Written by:       Zoltan Herczeg
Email local part: hzmester
Emain domain:     freemail.hu

Copyright(c) 2010-2017 Zoltan Herczeg
All rights reserved.


STACK-LESS JUST-IN-TIME COMPILER
--------------------------------

Written by:       Zoltan Herczeg
Email local part: hzmester
Emain domain:     freemail.hu

Copyright(c) 2009-2017 Zoltan Herczeg
All rights reserved.


THE C++ WRAPPER LIBRARY
-----------------------

Written by:       Google Inc.

Copyright (c) 2007-2012 Google Inc
All rights reserved

####
PKMP%[!���__doc/alt-pcre/COPYINGnu�[���PCRE LICENCE

Please see the file LICENCE in the PCRE distribution for licensing details.

End
PKMP%[�_Nvnndoc/alt-pcre/LICENCEnu�[���PCRE LICENCE
------------

PCRE is a library of functions to support regular expressions whose syntax
and semantics are as close as possible to those of the Perl 5 language.

Release 8 of PCRE is distributed under the terms of the "BSD" licence, as
specified below. The documentation for PCRE, supplied in the "doc"
directory, is distributed under the same terms as the software itself. The data
in the testdata directory is not copyrighted and is in the public domain.

The basic library functions are written in C and are freestanding. Also
included in the distribution is a set of C++ wrapper functions, and a
just-in-time compiler that can be used to optimize pattern matching. These
are both optional features that can be omitted when the library is built.


THE BASIC LIBRARY FUNCTIONS
---------------------------

Written by:       Philip Hazel
Email local part: ph10
Email domain:     cam.ac.uk

University of Cambridge Computing Service,
Cambridge, England.

Copyright (c) 1997-2017 University of Cambridge
All rights reserved.


PCRE JUST-IN-TIME COMPILATION SUPPORT
-------------------------------------

Written by:       Zoltan Herczeg
Email local part: hzmester
Emain domain:     freemail.hu

Copyright(c) 2010-2017 Zoltan Herczeg
All rights reserved.


STACK-LESS JUST-IN-TIME COMPILER
--------------------------------

Written by:       Zoltan Herczeg
Email local part: hzmester
Emain domain:     freemail.hu

Copyright(c) 2009-2017 Zoltan Herczeg
All rights reserved.


THE C++ WRAPPER FUNCTIONS
-------------------------

Contributed by:   Google Inc.

Copyright (c) 2007-2012, Google Inc.
All rights reserved.


THE "BSD" LICENCE
-----------------

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 University of Cambridge nor the name of Google
      Inc. nor the names of their 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.

End
PKMP%[�al��doc/alt-pcre/READMEnu�[���README file for PCRE (Perl-compatible regular expression library)
-----------------------------------------------------------------

NOTE: This set of files relates to PCRE releases that use the original API,
with library names libpcre, libpcre16, and libpcre32. January 2015 saw the
first release of a new API, known as PCRE2, with release numbers starting at
10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old
libraries (now called PCRE1) are still being maintained for bug fixes, but
there will be no new development. New projects are advised to use the new PCRE2
libraries.


The latest release of PCRE1 is always available in three alternative formats
from:

  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz
  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.bz2
  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.zip

There is a mailing list for discussion about the development of PCRE at
pcre-dev@exim.org. You can access the archives and subscribe or manage your
subscription here:

   https://lists.exim.org/mailman/listinfo/pcre-dev

Please read the NEWS file if you are upgrading from a previous release.
The contents of this README file are:

  The PCRE APIs
  Documentation for PCRE
  Contributions by users of PCRE
  Building PCRE on non-Unix-like systems
  Building PCRE without using autotools
  Building PCRE using autotools
  Retrieving configuration information
  Shared libraries
  Cross-compiling using autotools
  Using HP's ANSI C++ compiler (aCC)
  Compiling in Tru64 using native compilers
  Using Sun's compilers for Solaris
  Using PCRE from MySQL
  Making new tarballs
  Testing PCRE
  Character tables
  File manifest


The PCRE APIs
-------------

PCRE is written in C, and it has its own API. There are three sets of
functions, one for the 8-bit library, which processes strings of bytes, one for
the 16-bit library, which processes strings of 16-bit values, and one for the
32-bit library, which processes strings of 32-bit values. The distribution also
includes a set of C++ wrapper functions (see the pcrecpp man page for details),
courtesy of Google Inc., which can be used to call the 8-bit PCRE library from
C++. Other C++ wrappers have been created from time to time. See, for example:
https://github.com/YasserAsmi/regexp, which aims to be simple and similar in
style to the C API.

The distribution also contains a set of C wrapper functions (again, just for
the 8-bit library) that are based on the POSIX regular expression API (see the
pcreposix man page). These end up in the library called libpcreposix. Note that
this just provides a POSIX calling interface to PCRE; the regular expressions
themselves still follow Perl syntax and semantics. The POSIX API is restricted,
and does not give full access to all of PCRE's facilities.

The header file for the POSIX-style functions is called pcreposix.h. The
official POSIX name is regex.h, but I did not want to risk possible problems
with existing files of that name by distributing it that way. To use PCRE with
an existing program that uses the POSIX API, pcreposix.h will have to be
renamed or pointed at by a link.

If you are using the POSIX interface to PCRE and there is already a POSIX regex
library installed on your system, as well as worrying about the regex.h header
file (as mentioned above), you must also take care when linking programs to
ensure that they link with PCRE's libpcreposix library. Otherwise they may pick
up the POSIX functions of the same name from the other library.

One way of avoiding this confusion is to compile PCRE with the addition of
-Dregcomp=PCREregcomp (and similarly for the other POSIX functions) to the
compiler flags (CFLAGS if you are using "configure" -- see below). This has the
effect of renaming the functions so that the names no longer clash. Of course,
you have to do the same thing for your applications, or write them using the
new names.


Documentation for PCRE
----------------------

If you install PCRE in the normal way on a Unix-like system, you will end up
with a set of man pages whose names all start with "pcre". The one that is just
called "pcre" lists all the others. In addition to these man pages, the PCRE
documentation is supplied in two other forms:

  1. There are files called doc/pcre.txt, doc/pcregrep.txt, and
     doc/pcretest.txt in the source distribution. The first of these is a
     concatenation of the text forms of all the section 3 man pages except
     the listing of pcredemo.c and those that summarize individual functions.
     The other two are the text forms of the section 1 man pages for the
     pcregrep and pcretest commands. These text forms are provided for ease of
     scanning with text editors or similar tools. They are installed in
     <prefix>/share/doc/pcre, where <prefix> is the installation prefix
     (defaulting to /usr/local).

  2. A set of files containing all the documentation in HTML form, hyperlinked
     in various ways, and rooted in a file called index.html, is distributed in
     doc/html and installed in <prefix>/share/doc/pcre/html.

Users of PCRE have contributed files containing the documentation for various
releases in CHM format. These can be found in the Contrib directory of the FTP
site (see next section).


Contributions by users of PCRE
------------------------------

You can find contributions from PCRE users in the directory

  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib

There is a README file giving brief descriptions of what they are. Some are
complete in themselves; others are pointers to URLs containing relevant files.
Some of this material is likely to be well out-of-date. Several of the earlier
contributions provided support for compiling PCRE on various flavours of
Windows (I myself do not use Windows). Nowadays there is more Windows support
in the standard distribution, so these contibutions have been archived.

A PCRE user maintains downloadable Windows binaries of the pcregrep and
pcretest programs here:

  http://www.rexegg.com/pcregrep-pcretest.html


Building PCRE on non-Unix-like systems
--------------------------------------

For a non-Unix-like system, please read the comments in the file
NON-AUTOTOOLS-BUILD, though if your system supports the use of "configure" and
"make" you may be able to build PCRE using autotools in the same way as for
many Unix-like systems.

PCRE can also be configured using the GUI facility provided by CMake's
cmake-gui command. This creates Makefiles, solution files, etc. The file
NON-AUTOTOOLS-BUILD has information about CMake.

PCRE has been compiled on many different operating systems. It should be
straightforward to build PCRE on any system that has a Standard C compiler and
library, because it uses only Standard C functions.


Building PCRE without using autotools
-------------------------------------

The use of autotools (in particular, libtool) is problematic in some
environments, even some that are Unix or Unix-like. See the NON-AUTOTOOLS-BUILD
file for ways of building PCRE without using autotools.


Building PCRE using autotools
-----------------------------

If you are using HP's ANSI C++ compiler (aCC), please see the special note
in the section entitled "Using HP's ANSI C++ compiler (aCC)" below.

The following instructions assume the use of the widely used "configure; make;
make install" (autotools) process.

To build PCRE on system that supports autotools, first run the "configure"
command from the PCRE distribution directory, with your current directory set
to the directory where you want the files to be created. This command is a
standard GNU "autoconf" configuration script, for which generic instructions
are supplied in the file INSTALL.

Most commonly, people build PCRE within its own distribution directory, and in
this case, on many systems, just running "./configure" is sufficient. However,
the usual methods of changing standard defaults are available. For example:

CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local

This command specifies that the C compiler should be run with the flags '-O2
-Wall' instead of the default, and that "make install" should install PCRE
under /opt/local instead of the default /usr/local.

If you want to build in a different directory, just run "configure" with that
directory as current. For example, suppose you have unpacked the PCRE source
into /source/pcre/pcre-xxx, but you want to build it in /build/pcre/pcre-xxx:

cd /build/pcre/pcre-xxx
/source/pcre/pcre-xxx/configure

PCRE is written in C and is normally compiled as a C library. However, it is
possible to build it as a C++ library, though the provided building apparatus
does not have any features to support this.

There are some optional features that can be included or omitted from the PCRE
library. They are also documented in the pcrebuild man page.

. By default, both shared and static libraries are built. You can change this
  by adding one of these options to the "configure" command:

  --disable-shared
  --disable-static

  (See also "Shared libraries on Unix-like systems" below.)

. By default, only the 8-bit library is built. If you add --enable-pcre16 to
  the "configure" command, the 16-bit library is also built. If you add
  --enable-pcre32 to the "configure" command, the 32-bit library is also built.
  If you want only the 16-bit or 32-bit library, use --disable-pcre8 to disable
  building the 8-bit library.

. If you are building the 8-bit library and want to suppress the building of
  the C++ wrapper library, you can add --disable-cpp to the "configure"
  command. Otherwise, when "configure" is run without --disable-pcre8, it will
  try to find a C++ compiler and C++ header files, and if it succeeds, it will
  try to build the C++ wrapper.

. If you want to include support for just-in-time compiling, which can give
  large performance improvements on certain platforms, add --enable-jit to the
  "configure" command. This support is available only for certain hardware
  architectures. If you try to enable it on an unsupported architecture, there
  will be a compile time error.

. When JIT support is enabled, pcregrep automatically makes use of it, unless
  you add --disable-pcregrep-jit to the "configure" command.

. If you want to make use of the support for UTF-8 Unicode character strings in
  the 8-bit library, or UTF-16 Unicode character strings in the 16-bit library,
  or UTF-32 Unicode character strings in the 32-bit library, you must add
  --enable-utf to the "configure" command. Without it, the code for handling
  UTF-8, UTF-16 and UTF-8 is not included in the relevant library. Even
  when --enable-utf is included, the use of a UTF encoding still has to be
  enabled by an option at run time. When PCRE is compiled with this option, its
  input can only either be ASCII or UTF-8/16/32, even when running on EBCDIC
  platforms. It is not possible to use both --enable-utf and --enable-ebcdic at
  the same time.

. There are no separate options for enabling UTF-8, UTF-16 and UTF-32
  independently because that would allow ridiculous settings such as requesting
  UTF-16 support while building only the 8-bit library. However, the option
  --enable-utf8 is retained for backwards compatibility with earlier releases
  that did not support 16-bit or 32-bit character strings. It is synonymous with
  --enable-utf. It is not possible to configure one library with UTF support
  and the other without in the same configuration.

. If, in addition to support for UTF-8/16/32 character strings, you want to
  include support for the \P, \p, and \X sequences that recognize Unicode
  character properties, you must add --enable-unicode-properties to the
  "configure" command. This adds about 30K to the size of the library (in the
  form of a property table); only the basic two-letter properties such as Lu
  are supported.

. You can build PCRE to recognize either CR or LF or the sequence CRLF or any
  of the preceding, or any of the Unicode newline sequences as indicating the
  end of a line. Whatever you specify at build time is the default; the caller
  of PCRE can change the selection at run time. The default newline indicator
  is a single LF character (the Unix standard). You can specify the default
  newline indicator by adding --enable-newline-is-cr or --enable-newline-is-lf
  or --enable-newline-is-crlf or --enable-newline-is-anycrlf or
  --enable-newline-is-any to the "configure" command, respectively.

  If you specify --enable-newline-is-cr or --enable-newline-is-crlf, some of
  the standard tests will fail, because the lines in the test files end with
  LF. Even if the files are edited to change the line endings, there are likely
  to be some failures. With --enable-newline-is-anycrlf or
  --enable-newline-is-any, many tests should succeed, but there may be some
  failures.

. By default, the sequence \R in a pattern matches any Unicode line ending
  sequence. This is independent of the option specifying what PCRE considers to
  be the end of a line (see above). However, the caller of PCRE can restrict \R
  to match only CR, LF, or CRLF. You can make this the default by adding
  --enable-bsr-anycrlf to the "configure" command (bsr = "backslash R").

. When called via the POSIX interface, PCRE uses malloc() to get additional
  storage for processing capturing parentheses if there are more than 10 of
  them in a pattern. You can increase this threshold by setting, for example,

  --with-posix-malloc-threshold=20

  on the "configure" command.

. PCRE has a counter that limits the depth of nesting of parentheses in a
  pattern. This limits the amount of system stack that a pattern uses when it
  is compiled. The default is 250, but you can change it by setting, for
  example,

  --with-parens-nest-limit=500

. PCRE has a counter that can be set to limit the amount of resources it uses
  when matching a pattern. If the limit is exceeded during a match, the match
  fails. The default is ten million. You can change the default by setting, for
  example,

  --with-match-limit=500000

  on the "configure" command. This is just the default; individual calls to
  pcre_exec() can supply their own value. There is more discussion on the
  pcreapi man page.

. There is a separate counter that limits the depth of recursive function calls
  during a matching process. This also has a default of ten million, which is
  essentially "unlimited". You can change the default by setting, for example,

  --with-match-limit-recursion=500000

  Recursive function calls use up the runtime stack; running out of stack can
  cause programs to crash in strange ways. There is a discussion about stack
  sizes in the pcrestack man page.

. The default maximum compiled pattern size is around 64K. You can increase
  this by adding --with-link-size=3 to the "configure" command. In the 8-bit
  library, PCRE then uses three bytes instead of two for offsets to different
  parts of the compiled pattern. In the 16-bit library, --with-link-size=3 is
  the same as --with-link-size=4, which (in both libraries) uses four-byte
  offsets. Increasing the internal link size reduces performance. In the 32-bit
  library, the only supported link size is 4.

. You can build PCRE so that its internal match() function that is called from
  pcre_exec() does not call itself recursively. Instead, it uses memory blocks
  obtained from the heap via the special functions pcre_stack_malloc() and
  pcre_stack_free() to save data that would otherwise be saved on the stack. To
  build PCRE like this, use

  --disable-stack-for-recursion

  on the "configure" command. PCRE runs more slowly in this mode, but it may be
  necessary in environments with limited stack sizes. This applies only to the
  normal execution of the pcre_exec() function; if JIT support is being
  successfully used, it is not relevant. Equally, it does not apply to
  pcre_dfa_exec(), which does not use deeply nested recursion. There is a
  discussion about stack sizes in the pcrestack man page.

. For speed, PCRE uses four tables for manipulating and identifying characters
  whose code point values are less than 256. By default, it uses a set of
  tables for ASCII encoding that is part of the distribution. If you specify

  --enable-rebuild-chartables

  a program called dftables is compiled and run in the default C locale when
  you obey "make". It builds a source file called pcre_chartables.c. If you do
  not specify this option, pcre_chartables.c is created as a copy of
  pcre_chartables.c.dist. See "Character tables" below for further information.

. It is possible to compile PCRE for use on systems that use EBCDIC as their
  character code (as opposed to ASCII/Unicode) by specifying

  --enable-ebcdic

  This automatically implies --enable-rebuild-chartables (see above). However,
  when PCRE is built this way, it always operates in EBCDIC. It cannot support
  both EBCDIC and UTF-8/16/32. There is a second option, --enable-ebcdic-nl25,
  which specifies that the code value for the EBCDIC NL character is 0x25
  instead of the default 0x15.

. In environments where valgrind is installed, if you specify

  --enable-valgrind

  PCRE will use valgrind annotations to mark certain memory regions as
  unaddressable. This allows it to detect invalid memory accesses, and is
  mostly useful for debugging PCRE itself.

. In environments where the gcc compiler is used and lcov version 1.6 or above
  is installed, if you specify

  --enable-coverage

  the build process implements a code coverage report for the test suite. The
  report is generated by running "make coverage". If ccache is installed on
  your system, it must be disabled when building PCRE for coverage reporting.
  You can do this by setting the environment variable CCACHE_DISABLE=1 before
  running "make" to build PCRE. There is more information about coverage
  reporting in the "pcrebuild" documentation.

. The pcregrep program currently supports only 8-bit data files, and so
  requires the 8-bit PCRE library. It is possible to compile pcregrep to use
  libz and/or libbz2, in order to read .gz and .bz2 files (respectively), by
  specifying one or both of

  --enable-pcregrep-libz
  --enable-pcregrep-libbz2

  Of course, the relevant libraries must be installed on your system.

. The default size (in bytes) of the internal buffer used by pcregrep can be
  set by, for example:

  --with-pcregrep-bufsize=51200

  The value must be a plain integer. The default is 20480.

. It is possible to compile pcretest so that it links with the libreadline
  or libedit libraries, by specifying, respectively,

  --enable-pcretest-libreadline or --enable-pcretest-libedit

  If this is done, when pcretest's input is from a terminal, it reads it using
  the readline() function. This provides line-editing and history facilities.
  Note that libreadline is GPL-licenced, so if you distribute a binary of
  pcretest linked in this way, there may be licensing issues. These can be
  avoided by linking with libedit (which has a BSD licence) instead.

  Enabling libreadline causes the -lreadline option to be added to the pcretest
  build. In many operating environments with a sytem-installed readline
  library this is sufficient. However, in some environments (e.g. if an
  unmodified distribution version of readline is in use), it may be necessary
  to specify something like LIBS="-lncurses" as well. This is because, to quote
  the readline INSTALL, "Readline uses the termcap functions, but does not link
  with the termcap or curses library itself, allowing applications which link
  with readline the to choose an appropriate library." If you get error
  messages about missing functions tgetstr, tgetent, tputs, tgetflag, or tgoto,
  this is the problem, and linking with the ncurses library should fix it.

The "configure" script builds the following files for the basic C library:

. Makefile             the makefile that builds the library
. config.h             build-time configuration options for the library
. pcre.h               the public PCRE header file
. pcre-config          script that shows the building settings such as CFLAGS
                         that were set for "configure"
. libpcre.pc         ) data for the pkg-config command
. libpcre16.pc       )
. libpcre32.pc       )
. libpcreposix.pc    )
. libtool              script that builds shared and/or static libraries

Versions of config.h and pcre.h are distributed in the PCRE tarballs under the
names config.h.generic and pcre.h.generic. These are provided for those who
have to built PCRE without using "configure" or CMake. If you use "configure"
or CMake, the .generic versions are not used.

When building the 8-bit library, if a C++ compiler is found, the following
files are also built:

. libpcrecpp.pc        data for the pkg-config command
. pcrecpparg.h         header file for calling PCRE via the C++ wrapper
. pcre_stringpiece.h   header for the C++ "stringpiece" functions

The "configure" script also creates config.status, which is an executable
script that can be run to recreate the configuration, and config.log, which
contains compiler output from tests that "configure" runs.

Once "configure" has run, you can run "make". This builds the the libraries
libpcre, libpcre16 and/or libpcre32, and a test program called pcretest. If you
enabled JIT support with --enable-jit, a test program called pcre_jit_test is
built as well.

If the 8-bit library is built, libpcreposix and the pcregrep command are also
built, and if a C++ compiler was found on your system, and you did not disable
it with --disable-cpp, "make" builds the C++ wrapper library, which is called
libpcrecpp, as well as some test programs called pcrecpp_unittest,
pcre_scanner_unittest, and pcre_stringpiece_unittest.

The command "make check" runs all the appropriate tests. Details of the PCRE
tests are given below in a separate section of this document.

You can use "make install" to install PCRE into live directories on your
system. The following are installed (file names are all relative to the
<prefix> that is set when "configure" is run):

  Commands (bin):
    pcretest
    pcregrep (if 8-bit support is enabled)
    pcre-config

  Libraries (lib):
    libpcre16     (if 16-bit support is enabled)
    libpcre32     (if 32-bit support is enabled)
    libpcre       (if 8-bit support is enabled)
    libpcreposix  (if 8-bit support is enabled)
    libpcrecpp    (if 8-bit and C++ support is enabled)

  Configuration information (lib/pkgconfig):
    libpcre16.pc
    libpcre32.pc
    libpcre.pc
    libpcreposix.pc
    libpcrecpp.pc (if C++ support is enabled)

  Header files (include):
    pcre.h
    pcreposix.h
    pcre_scanner.h      )
    pcre_stringpiece.h  ) if C++ support is enabled
    pcrecpp.h           )
    pcrecpparg.h        )

  Man pages (share/man/man{1,3}):
    pcregrep.1
    pcretest.1
    pcre-config.1
    pcre.3
    pcre*.3 (lots more pages, all starting "pcre")

  HTML documentation (share/doc/pcre/html):
    index.html
    *.html (lots more pages, hyperlinked from index.html)

  Text file documentation (share/doc/pcre):
    AUTHORS
    COPYING
    ChangeLog
    LICENCE
    NEWS
    README
    pcre.txt         (a concatenation of the man(3) pages)
    pcretest.txt     the pcretest man page
    pcregrep.txt     the pcregrep man page
    pcre-config.txt  the pcre-config man page

If you want to remove PCRE from your system, you can run "make uninstall".
This removes all the files that "make install" installed. However, it does not
remove any directories, because these are often shared with other programs.


Retrieving configuration information
------------------------------------

Running "make install" installs the command pcre-config, which can be used to
recall information about the PCRE configuration and installation. For example:

  pcre-config --version

prints the version number, and

  pcre-config --libs

outputs information about where the library is installed. This command can be
included in makefiles for programs that use PCRE, saving the programmer from
having to remember too many details.

The pkg-config command is another system for saving and retrieving information
about installed libraries. Instead of separate commands for each library, a
single command is used. For example:

  pkg-config --cflags pcre

The data is held in *.pc files that are installed in a directory called
<prefix>/lib/pkgconfig.


Shared libraries
----------------

The default distribution builds PCRE as shared libraries and static libraries,
as long as the operating system supports shared libraries. Shared library
support relies on the "libtool" script which is built as part of the
"configure" process.

The libtool script is used to compile and link both shared and static
libraries. They are placed in a subdirectory called .libs when they are newly
built. The programs pcretest and pcregrep are built to use these uninstalled
libraries (by means of wrapper scripts in the case of shared libraries). When
you use "make install" to install shared libraries, pcregrep and pcretest are
automatically re-built to use the newly installed shared libraries before being
installed themselves. However, the versions left in the build directory still
use the uninstalled libraries.

To build PCRE using static libraries only you must use --disable-shared when
configuring it. For example:

./configure --prefix=/usr/gnu --disable-shared

Then run "make" in the usual way. Similarly, you can use --disable-static to
build only shared libraries.


Cross-compiling using autotools
-------------------------------

You can specify CC and CFLAGS in the normal way to the "configure" command, in
order to cross-compile PCRE for some other host. However, you should NOT
specify --enable-rebuild-chartables, because if you do, the dftables.c source
file is compiled and run on the local host, in order to generate the inbuilt
character tables (the pcre_chartables.c file). This will probably not work,
because dftables.c needs to be compiled with the local compiler, not the cross
compiler.

When --enable-rebuild-chartables is not specified, pcre_chartables.c is created
by making a copy of pcre_chartables.c.dist, which is a default set of tables
that assumes ASCII code. Cross-compiling with the default tables should not be
a problem.

If you need to modify the character tables when cross-compiling, you should
move pcre_chartables.c.dist out of the way, then compile dftables.c by hand and
run it on the local host to make a new version of pcre_chartables.c.dist.
Then when you cross-compile PCRE this new version of the tables will be used.


Using HP's ANSI C++ compiler (aCC)
----------------------------------

Unless C++ support is disabled by specifying the "--disable-cpp" option of the
"configure" script, you must include the "-AA" option in the CXXFLAGS
environment variable in order for the C++ components to compile correctly.

Also, note that the aCC compiler on PA-RISC platforms may have a defect whereby
needed libraries fail to get included when specifying the "-AA" compiler
option. If you experience unresolved symbols when linking the C++ programs,
use the workaround of specifying the following environment variable prior to
running the "configure" script:

  CXXLDFLAGS="-lstd_v2 -lCsup_v2"


Compiling in Tru64 using native compilers
-----------------------------------------

The following error may occur when compiling with native compilers in the Tru64
operating system:

  CXX    libpcrecpp_la-pcrecpp.lo
cxx: Error: /usr/lib/cmplrs/cxx/V7.1-006/include/cxx/iosfwd, line 58: #error
          directive: "cannot include iosfwd -- define __USE_STD_IOSTREAM to
          override default - see section 7.1.2 of the C++ Using Guide"
#error "cannot include iosfwd -- define __USE_STD_IOSTREAM to override default
- see section 7.1.2 of the C++ Using Guide"

This may be followed by other errors, complaining that 'namespace "std" has no
member'. The solution to this is to add the line

#define __USE_STD_IOSTREAM 1

to the config.h file.


Using Sun's compilers for Solaris
---------------------------------

A user reports that the following configurations work on Solaris 9 sparcv9 and
Solaris 9 x86 (32-bit):

  Solaris 9 sparcv9: ./configure --disable-cpp CC=/bin/cc CFLAGS="-m64 -g"
  Solaris 9 x86:     ./configure --disable-cpp CC=/bin/cc CFLAGS="-g"


Using PCRE from MySQL
---------------------

On systems where both PCRE and MySQL are installed, it is possible to make use
of PCRE from within MySQL, as an alternative to the built-in pattern matching.
There is a web page that tells you how to do this:

  http://www.mysqludf.org/lib_mysqludf_preg/index.php


Making new tarballs
-------------------

The command "make dist" creates three PCRE tarballs, in tar.gz, tar.bz2, and
zip formats. The command "make distcheck" does the same, but then does a trial
build of the new distribution to ensure that it works.

If you have modified any of the man page sources in the doc directory, you
should first run the PrepareRelease script before making a distribution. This
script creates the .txt and HTML forms of the documentation from the man pages.


Testing PCRE
------------

To test the basic PCRE library on a Unix-like system, run the RunTest script.
There is another script called RunGrepTest that tests the options of the
pcregrep command. If the C++ wrapper library is built, three test programs
called pcrecpp_unittest, pcre_scanner_unittest, and pcre_stringpiece_unittest
are also built. When JIT support is enabled, another test program called
pcre_jit_test is built.

Both the scripts and all the program tests are run if you obey "make check" or
"make test". For other environments, see the instructions in
NON-AUTOTOOLS-BUILD.

The RunTest script runs the pcretest test program (which is documented in its
own man page) on each of the relevant testinput files in the testdata
directory, and compares the output with the contents of the corresponding
testoutput files. RunTest uses a file called testtry to hold the main output
from pcretest. Other files whose names begin with "test" are used as working
files in some tests.

Some tests are relevant only when certain build-time options were selected. For
example, the tests for UTF-8/16/32 support are run only if --enable-utf was
used. RunTest outputs a comment when it skips a test.

Many of the tests that are not skipped are run up to three times. The second
run forces pcre_study() to be called for all patterns except for a few in some
tests that are marked "never study" (see the pcretest program for how this is
done). If JIT support is available, the non-DFA tests are run a third time,
this time with a forced pcre_study() with the PCRE_STUDY_JIT_COMPILE option.
This testing can be suppressed by putting "nojit" on the RunTest command line.

The entire set of tests is run once for each of the 8-bit, 16-bit and 32-bit
libraries that are enabled. If you want to run just one set of tests, call
RunTest with either the -8, -16 or -32 option.

If valgrind is installed, you can run the tests under it by putting "valgrind"
on the RunTest command line. To run pcretest on just one or more specific test
files, give their numbers as arguments to RunTest, for example:

  RunTest 2 7 11

You can also specify ranges of tests such as 3-6 or 3- (meaning 3 to the
end), or a number preceded by ~ to exclude a test. For example:

  Runtest 3-15 ~10

This runs tests 3 to 15, excluding test 10, and just ~13 runs all the tests
except test 13. Whatever order the arguments are in, the tests are always run
in numerical order.

You can also call RunTest with the single argument "list" to cause it to output
a list of tests.

The first test file can be fed directly into the perltest.pl script to check
that Perl gives the same results. The only difference you should see is in the
first few lines, where the Perl version is given instead of the PCRE version.

The second set of tests check pcre_fullinfo(), pcre_study(),
pcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error
detection, and run-time flags that are specific to PCRE, as well as the POSIX
wrapper API. It also uses the debugging flags to check some of the internals of
pcre_compile().

If you build PCRE with a locale setting that is not the standard C locale, the
character tables may be different (see next paragraph). In some cases, this may
cause failures in the second set of tests. For example, in a locale where the
isprint() function yields TRUE for characters in the range 128-255, the use of
[:isascii:] inside a character class defines a different set of characters, and
this shows up in this test as a difference in the compiled code, which is being
listed for checking. Where the comparison test output contains [\x00-\x7f] the
test will contain [\x00-\xff], and similarly in some other cases. This is not a
bug in PCRE.

The third set of tests checks pcre_maketables(), the facility for building a
set of character tables for a specific locale and using them instead of the
default tables. The tests make use of the "fr_FR" (French) locale. Before
running the test, the script checks for the presence of this locale by running
the "locale" command. If that command fails, or if it doesn't include "fr_FR"
in the list of available locales, the third test cannot be run, and a comment
is output to say why. If running this test produces instances of the error

  ** Failed to set locale "fr_FR"

in the comparison output, it means that locale is not available on your system,
despite being listed by "locale". This does not mean that PCRE is broken.

[If you are trying to run this test on Windows, you may be able to get it to
work by changing "fr_FR" to "french" everywhere it occurs. Alternatively, use
RunTest.bat. The version of RunTest.bat included with PCRE 7.4 and above uses
Windows versions of test 2. More info on using RunTest.bat is included in the
document entitled NON-UNIX-USE.]

The fourth and fifth tests check the UTF-8/16/32 support and error handling and
internal UTF features of PCRE that are not relevant to Perl, respectively. The
sixth and seventh tests do the same for Unicode character properties support.

The eighth, ninth, and tenth tests check the pcre_dfa_exec() alternative
matching function, in non-UTF-8/16/32 mode, UTF-8/16/32 mode, and UTF-8/16/32
mode with Unicode property support, respectively.

The eleventh test checks some internal offsets and code size features; it is
run only when the default "link size" of 2 is set (in other cases the sizes
change) and when Unicode property support is enabled.

The twelfth test is run only when JIT support is available, and the thirteenth
test is run only when JIT support is not available. They test some JIT-specific
features such as information output from pcretest about JIT compilation.

The fourteenth, fifteenth, and sixteenth tests are run only in 8-bit mode, and
the seventeenth, eighteenth, and nineteenth tests are run only in 16/32-bit
mode. These are tests that generate different output in the two modes. They are
for general cases, UTF-8/16/32 support, and Unicode property support,
respectively.

The twentieth test is run only in 16/32-bit mode. It tests some specific
16/32-bit features of the DFA matching engine.

The twenty-first and twenty-second tests are run only in 16/32-bit mode, when
the link size is set to 2 for the 16-bit library. They test reloading
pre-compiled patterns.

The twenty-third and twenty-fourth tests are run only in 16-bit mode. They are
for general cases, and UTF-16 support, respectively.

The twenty-fifth and twenty-sixth tests are run only in 32-bit mode. They are
for general cases, and UTF-32 support, respectively.


Character tables
----------------

For speed, PCRE uses four tables for manipulating and identifying characters
whose code point values are less than 256. The final argument of the
pcre_compile() function is a pointer to a block of memory containing the
concatenated tables. A call to pcre_maketables() can be used to generate a set
of tables in the current locale. If the final argument for pcre_compile() is
passed as NULL, a set of default tables that is built into the binary is used.

The source file called pcre_chartables.c contains the default set of tables. By
default, this is created as a copy of pcre_chartables.c.dist, which contains
tables for ASCII coding. However, if --enable-rebuild-chartables is specified
for ./configure, a different version of pcre_chartables.c is built by the
program dftables (compiled from dftables.c), which uses the ANSI C character
handling functions such as isalnum(), isalpha(), isupper(), islower(), etc. to
build the table sources. This means that the default C locale which is set for
your system will control the contents of these default tables. You can change
the default tables by editing pcre_chartables.c and then re-building PCRE. If
you do this, you should take care to ensure that the file does not get
automatically re-generated. The best way to do this is to move
pcre_chartables.c.dist out of the way and replace it with your customized
tables.

When the dftables program is run as a result of --enable-rebuild-chartables,
it uses the default C locale that is set on your system. It does not pay
attention to the LC_xxx environment variables. In other words, it uses the
system's default locale rather than whatever the compiling user happens to have
set. If you really do want to build a source set of character tables in a
locale that is specified by the LC_xxx variables, you can run the dftables
program by hand with the -L option. For example:

  ./dftables -L pcre_chartables.c.special

The first two 256-byte tables provide lower casing and case flipping functions,
respectively. The next table consists of three 32-byte bit maps which identify
digits, "word" characters, and white space, respectively. These are used when
building 32-byte bit maps that represent character classes for code points less
than 256.

The final 256-byte table has bits indicating various character types, as
follows:

    1   white space character
    2   letter
    4   decimal digit
    8   hexadecimal digit
   16   alphanumeric or '_'
  128   regular expression metacharacter or binary zero

You should not alter the set of characters that contain the 128 bit, as that
will cause PCRE to malfunction.


File manifest
-------------

The distribution should contain the files listed below. Where a file name is
given as pcre[16|32]_xxx it means that there are three files, one with the name
pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx.

(A) Source files of the PCRE library functions and their headers:

  dftables.c              auxiliary program for building pcre_chartables.c
                          when --enable-rebuild-chartables is specified

  pcre_chartables.c.dist  a default set of character tables that assume ASCII
                          coding; used, unless --enable-rebuild-chartables is
                          specified, by copying to pcre[16]_chartables.c

  pcreposix.c                )
  pcre[16|32]_byte_order.c   )
  pcre[16|32]_compile.c      )
  pcre[16|32]_config.c       )
  pcre[16|32]_dfa_exec.c     )
  pcre[16|32]_exec.c         )
  pcre[16|32]_fullinfo.c     )
  pcre[16|32]_get.c          ) sources for the functions in the library,
  pcre[16|32]_globals.c      )   and some internal functions that they use
  pcre[16|32]_jit_compile.c  )
  pcre[16|32]_maketables.c   )
  pcre[16|32]_newline.c      )
  pcre[16|32]_refcount.c     )
  pcre[16|32]_string_utils.c )
  pcre[16|32]_study.c        )
  pcre[16|32]_tables.c       )
  pcre[16|32]_ucd.c          )
  pcre[16|32]_version.c      )
  pcre[16|32]_xclass.c       )
  pcre_ord2utf8.c            )
  pcre_valid_utf8.c          )
  pcre16_ord2utf16.c         )
  pcre16_utf16_utils.c       )
  pcre16_valid_utf16.c       )
  pcre32_utf32_utils.c       )
  pcre32_valid_utf32.c       )

  pcre[16|32]_printint.c     ) debugging function that is used by pcretest,
                             )   and can also be #included in pcre_compile()

  pcre.h.in               template for pcre.h when built by "configure"
  pcreposix.h             header for the external POSIX wrapper API
  pcre_internal.h         header for internal use
  sljit/*                 16 files that make up the JIT compiler
  ucp.h                   header for Unicode property handling

  config.h.in             template for config.h, which is built by "configure"

  pcrecpp.h               public header file for the C++ wrapper
  pcrecpparg.h.in         template for another C++ header file
  pcre_scanner.h          public header file for C++ scanner functions
  pcrecpp.cc              )
  pcre_scanner.cc         ) source for the C++ wrapper library

  pcre_stringpiece.h.in   template for pcre_stringpiece.h, the header for the
                            C++ stringpiece functions
  pcre_stringpiece.cc     source for the C++ stringpiece functions

(B) Source files for programs that use PCRE:

  pcredemo.c              simple demonstration of coding calls to PCRE
  pcregrep.c              source of a grep utility that uses PCRE
  pcretest.c              comprehensive test program

(C) Auxiliary files:

  132html                 script to turn "man" pages into HTML
  AUTHORS                 information about the author of PCRE
  ChangeLog               log of changes to the code
  CleanTxt                script to clean nroff output for txt man pages
  Detrail                 script to remove trailing spaces
  HACKING                 some notes about the internals of PCRE
  INSTALL                 generic installation instructions
  LICENCE                 conditions for the use of PCRE
  COPYING                 the same, using GNU's standard name
  Makefile.in             ) template for Unix Makefile, which is built by
                          )   "configure"
  Makefile.am             ) the automake input that was used to create
                          )   Makefile.in
  NEWS                    important changes in this release
  NON-UNIX-USE            the previous name for NON-AUTOTOOLS-BUILD
  NON-AUTOTOOLS-BUILD     notes on building PCRE without using autotools
  PrepareRelease          script to make preparations for "make dist"
  README                  this file
  RunTest                 a Unix shell script for running tests
  RunGrepTest             a Unix shell script for pcregrep tests
  aclocal.m4              m4 macros (generated by "aclocal")
  config.guess            ) files used by libtool,
  config.sub              )   used only when building a shared library
  configure               a configuring shell script (built by autoconf)
  configure.ac            ) the autoconf input that was used to build
                          )   "configure" and config.h
  depcomp                 ) script to find program dependencies, generated by
                          )   automake
  doc/*.3                 man page sources for PCRE
  doc/*.1                 man page sources for pcregrep and pcretest
  doc/index.html.src      the base HTML page
  doc/html/*              HTML documentation
  doc/pcre.txt            plain text version of the man pages
  doc/pcretest.txt        plain text documentation of test program
  doc/perltest.txt        plain text documentation of Perl test program
  install-sh              a shell script for installing files
  libpcre16.pc.in         template for libpcre16.pc for pkg-config
  libpcre32.pc.in         template for libpcre32.pc for pkg-config
  libpcre.pc.in           template for libpcre.pc for pkg-config
  libpcreposix.pc.in      template for libpcreposix.pc for pkg-config
  libpcrecpp.pc.in        template for libpcrecpp.pc for pkg-config
  ltmain.sh               file used to build a libtool script
  missing                 ) common stub for a few missing GNU programs while
                          )   installing, generated by automake
  mkinstalldirs           script for making install directories
  perltest.pl             Perl test program
  pcre-config.in          source of script which retains PCRE information
  pcre_jit_test.c         test program for the JIT compiler
  pcrecpp_unittest.cc          )
  pcre_scanner_unittest.cc     ) test programs for the C++ wrapper
  pcre_stringpiece_unittest.cc )
  testdata/testinput*     test data for main library tests
  testdata/testoutput*    expected test results
  testdata/grep*          input and output for pcregrep tests
  testdata/*              other supporting test files

(D) Auxiliary files for cmake support

  cmake/COPYING-CMAKE-SCRIPTS
  cmake/FindPackageHandleStandardArgs.cmake
  cmake/FindEditline.cmake
  cmake/FindReadline.cmake
  CMakeLists.txt
  config-cmake.h.in

(E) Auxiliary files for VPASCAL

  makevp.bat
  makevp_c.txt
  makevp_l.txt
  pcregexp.pas

(F) Auxiliary files for building PCRE "by hand"

  pcre.h.generic          ) a version of the public PCRE header file
                          )   for use in non-"configure" environments
  config.h.generic        ) a version of config.h for use in non-"configure"
                          )   environments

(F) Miscellaneous

  RunTest.bat            a script for running tests under Windows

Philip Hazel
Email local part: ph10
Email domain: cam.ac.uk
Last updated: 10 February 2015
PK�Y%[&�����doc/alt-libzip/LICENSEnu�[���Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner

The authors can be contacted at <info@libzip.org>

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 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 AUTHORS ``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 AUTHORS 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%[%[i]�Ɂ� doc/alt-libgd/ChangeLog.historicnu�[���4d29684 CVE-2015-8874
fe199ed release gd-2.2.0
6556574 ChangeLog: update for gd-2.2 branching
c6c52b3 dist: drop bzip2 tarball
7932944 libtool: set revision based on package version
119b38e travis: switch to the local bootstrap script
f79d0a8 m4: use an older openmp macro
e6bf771 docs: clean up a bit and support `NaturalDocs`
c9a4a85 libimagequant: fix integration
6e054c4 gdlib-config: mark it as deprecated #140
b64c996 build: fix GDLIB_REVISION collision
10a4915 tests: rework handling of temp output files
1239832 configure/cmake: unify header checks and config.h generation
32c5072 bootstrap: switch to autoreconf
f7471f2 tests: add missing gdimagesetpixel tests
e59a0e8 tests: add missing test files to dist
2733b62 tga: cleanup/simplify a bit
96d5687 tga: fix two memory corruption bugs #159
8f50777 tests: get working under lsan (leak sanitizer)
e530663 png: fix some memory leaks w/invalid images
82b80dc gif: avoid out-of-bound reads of masks array #209
4dc1a2d xbm: avoid stack overflow (read) with large names #211
b083ec1 cmake: update build files to match autotools more
2db153a webpng: rewrite & cleanup to use getopt
b12f217 configure: enable -Werror by default when available
75c38f6 fix various gcc/clang warnings found with -Wall
8bdfede cmake: document the common build/install steps #179
6f3552d travis: drop multiarch settings
d549193 travis: drop nasm apt install
cd15d9b drop unused make_drone.io
b32324d travis: enable the clang compiler
05d70f6 tests: fix leaks in test code
4e61c9b tiff: fix leak in gdImageCreateFromTiffCtx()
658f168 gd2: fix double free when processing invalid headers
0315e44 tests: gd2: add general read test helpers #208
3c47bb4 tests: do not build libgdtest.a all the time
09d2d01 webp: fix double free
cd1d964 libgd: update & sort cmake installed headers #164
161ac24 travis: rework & improve main script logic
613e8c9 tests: split up makefile entries
92c3209 tests: fix distclean errors
3768c9e travis: switch to non-sudo mode
adc8598 tests: unify cmake test code into a single macro
ef9b000 build: handle renamed README file
e16310b libgd: update & sort source lists
a44e1ba tests: gdimageline: add missing -lm linkage
3b0eabf tests: add missing cmake files gdimagefile/gdimagefilter
4c6a07b gitignore: split up test entries
6455304 tests: drop EXTRA_PROGRAMS
982d488 revert... unneeded
a5b5c27 Fix memory leak
2bb97f4 gd2: handle corrupt images better (CVE-2016-3074)
fc14a8c README: document supported image formats
5277b6f Merge pull request #199 from mattbo/tiff_dpi_support
4e53ed7 Added support for reading and writing TIFFTAG_XRESOLUTION and TIFFTAG_YRESOLUTION.  Includes a unit test.
6913dd3 bmp: use double variant of ceil func
f29f7db Merge pull request #198 from sherif-elmetainy/master
e87ec88 :fix and unit test for crash issue in gdImageFillTiled
258dbf2 README: link to the CONTRIBUTORS file
6895576 README: reformat in markdown for better github display
73ab7c7 Merge pull request #182 from leoyanggit/fix_build_static
e08acb0 Merge pull request #153 from davidchappelle/master
78dad44 circletexttest: check image creation return value
a9346dd travis: build/check in parallel
e5d1e9d Fail Travis builds if make check fails
b6211d9 tests: fix build failures when jpeg/freetype are disabled
3667974 Merge pull request #193 from vapier/master
f732d74 Merge pull request #194 from jasonwilliams200OK/master
859bcf7 git,repo: Ignore build spew.
10a8761 Merge pull request #192 from jasonwilliams200OK/master
8f69034 code: Adds missing methods for absent libz case.
a4f5d5d configure: unify library tests
a9205e5 configure: require autoconf-2.64/automake-1.11
2e04a67 win: Use an external snprintf hook.
9104bba configure: use AS_HELP_STRING everywhere
1dc5280 Merge pull request #191 from jitendarKumar/patch-8
dd48286 Logical Operation && has no Impact on expression result .
52dad8b Update git ignore file to exclude cmake build directory
9ea3097 Prevent duplicate macro definition errors/warnings
40f42c0 Fix compiler warnings when checking interpolation_id
7147b64 Make BUILD_SHARED_LIBS configurable
4751b60 gdImageScaleTwoPass memory leak fix
4e1ce66 Merge pull request #166 from jitendarKumar/patch-5
1219113 Merge pull request #155 from jitendarKumar/patch-2
38e016f Merge pull request #156 from jitendarKumar/patch-3
4e70131 Merge pull request #157 from jitendarKumar/patch-4
895be03 Indentation corrected.
7b6261c Dereference null return value in gdtest.c
7297c94 Merge pull request #163 from wangkun611/webp_cmake
917fa11 fix CMake error when ENABLE_WEBP
7ec030c add gdImageCreateFromWebpPtr impl
eaca20f Remove Deadcode in gd.c
312b020 Update gd_topal.c
18bbbfa Merge pull request #148 from smcdow/master
f2712a6 Remove Deadcode in gd_nnquant.c
4f99667 Merge pull request #154 from jitendarKumar/patch-1
4cf5307 Missing nullcheck in gd_topal.c
d403501 Dereference null return value in gdfx.c
ac527e6 delete webpimg.c references
c9dac2d Fix segfault in gdImageFlipVertical() for non-TrueColor images.
a9f3a83 Merge pull request #146 from dmelani/rotation_fix
4e833d3 Added missing zero.
b12712e Merge pull request #143 from vapier/master
2618996 missing file in archive, need for autoreconf
6bdfa68 ignore new tests
1c33d94 tests: fix header inclusion
e0aafd0 Add Debian/Ubuntu M-A specific configure options
3a72f64 lint.travis-ci.org doesn't know version and description in Coverity addon
87804f6 Comment-out Coverity encrypted token
2b8bfd4 Don't fail when make check fails; Add coverity configuration for coverity_scan branch
10a92e7 Even more missing semicolons
09783e4 Add missing semicolons to .travis.yml
25cfac5 Replace <TAB> with 8*<SPACE>
2be44f0 Don't upgrade build environment now
5edbc3f Use autotools on linux to build libgd
9201900 Change issue tracker URL to github
ba081d9 Merge branch 'GD-2.1'
1481c41 fix #140, versions placeholder not replaced in gdlib-config
88fb8fc typo
4ef5903 fix some leaks on error
824a3aa remove remaining libvpx related code
a79232c fix #129, drop VPX usage in favor of libwebp
9a205a1 Merge branch 'GD-2.1'
511160e fix #82, fix 1 bit tiff support
7a567db Merge branch 'GD-2.1'
aa1d71c fix #135, fix logic in gdkanji
58990de Merge branch 'master' of https://bitbucket.org/libgd/gd-libgd
2f85291 fix #139, patch by Peter Breitenlohner
255a9e4 fix visibility test
358950c remove this test, too big
5c48b49 fix #91, actually add tests, bug already fixed
f680978 fix #94, HAVE_VISIBILITY may be defined but set to 0
b126726 fix #89, fix leaks on tiff read
acdebc8 fix #84, double free and overrun due to wrong alloc type, uint8_t instead of int
490bc3e free palette on error
289c829 port fix for saner boolean usage from https://reviews.facebook.net/D31695
2b3130e fix #90, actually copy src to dst
b1f4313 add tests for #111
3d7c3f5 fix #111, invalid quantization
ac1ff44 update results to match modern freetype builds
c7e5dc6  fix #111, invalid default quantization
81d341c fix #113, NULL deref in gdfx
2f40d52 Fix #138, VS 2010 build error due to double semi column
0e9c4e0 master is now 2.2.0-dev
06b2e4f back to dev
PK%[%[�z��doc/alt-libgd/README.TXTnu�[���For documentation, browse index.html.

Quick install guide:

If the sources have been fetched from git, run bootstrap.sh [options].

From a released source, use:
1. Type './configure'
2. Type 'make install'

Generic configuration instructions are in the file INSTALL.

The following 3rd-party libraries will be used by gd if found by configure.
While gd will compile and install even without these, we suggest that at
least zlib and libpng are installed, and recommend that freetype and jpeg
are installed as well:

1. zlib, available from http://www.gzip.org/zlib/
   Data compression library

2. libpng, available from http://www.libpng.org/pub/png/
   Portable Network Graphics library; requires zlib

3. FreeType 2.x, available from http://www.freetype.org/
   Free, high-quality, and portable font engine

4. JPEG library, available from http://www.ijg.org/
   Portable JPEG compression/decompression library
   jpeg-turbo is our recommended choise. version 2.x is required. It may build with earlier version however we do not support it (in case quality or other bugs could be seen).
   LibJpeg 6.2 required. It may compile with earlier version but we do not support it.

5. XPM, available from http://koala.ilog.fr/lehors/xpm.html
   X Pixmap library

If any of these libraries are installed, but not detected by configure,
you can use the following command line options:

--with-png=DIR

  Without the DIR argument, configure will check for png header files and
  libraries in a default location. To switch off png support, use
  --without-png, or --with-png=no.

  If the DIR argument is specified, configure tries to find the png header
  files in DIR/include, and the libraries in DIR/lib. To accommodate
  OpenBSD ports, DIR/include/libpng is also checked if necessary.

--with-freetype=DIR

  Dto. for freetype 2.x library. The search path for include files is
  DIR/include/freetype2.

--with-jpeg=DIR

  Dto. for jpeg library.

--with-xpm=DIR

  Dto. for xpm library.

 --with-tiff=DIR

Dto. for TIFF library.
PK%[%[�Y�$��doc/alt-libgd/COPYINGnu�[���Title: License
Credits and license terms:

In order to resolve any possible confusion regarding the authorship of
gd, the following copyright statement covers all of the authors who
have required such a statement. If you are aware of any oversights in
this copyright notice, please contact Pierre-A. Joye who will be
pleased to correct them.

* Portions copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
  2002, 2003, 2004 by Cold Spring Harbor Laboratory. Funded under
  Grant P41-RR02188 by the National Institutes of Health.

* Portions copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
  2004 by Boutell.Com, Inc.

* Portions relating to GD2 format copyright 1999, 2000, 2001, 2002,
  2003, 2004 Philip Warner.

* Portions relating to PNG copyright 1999, 2000, 2001, 2002, 2003,
  2004 Greg Roelofs.

* Portions relating to gdttf.c copyright 1999, 2000, 2001, 2002,
  2003, 2004 John Ellson (ellson@graphviz.org).

* Portions relating to gdft.c copyright 2001, 2002, 2003, 2004 John
  Ellson (ellson@graphviz.org).

* Portions copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
  2008 Pierre-Alain Joye (pierre@libgd.org).

* Portions relating to JPEG and to color quantization copyright
  2000, 2001, 2002, 2003, 2004, Doug Becker and copyright (C) 1994,
  1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Thomas
  G. Lane. This software is based in part on the work of the
  Independent JPEG Group. See the file README-JPEG.TXT for more
  information.

* Portions relating to GIF compression copyright 1989 by Jef
  Poskanzer and David Rowley, with modifications for thread safety
  by Thomas Boutell.

* Portions relating to GIF decompression copyright 1990, 1991, 1993
  by David Koblas, with modifications for thread safety by Thomas
  Boutell.

* Portions relating to WBMP copyright 2000, 2001, 2002, 2003, 2004
  Maurice Szmurlo and Johan Van den Brande.

* Portions relating to GIF animations copyright 2004 Jaakko Hyvätti
  (jaakko.hyvatti@iki.fi)

Permission has been granted to copy, distribute and modify gd in
any context without fee, including a commercial application,
provided that this notice is present in user-accessible supporting
documentation.

This does not affect your ownership of the derived work itself,
and the intent is to assure proper credit for the authors of gd,
not to interfere with your productive use of gd. If you have
questions, ask. "Derived works" includes all programs that utilize
the library. Credit must be given in user-accessible
documentation.

This software is provided "AS IS." The copyright holders disclaim
all warranties, either express or implied, including but not
limited to implied warranties of merchantability and fitness for a
particular purpose, with respect to this code and accompanying
documentation.

Although their code does not appear in the current release, the
authors wish to thank David Koblas, David Rowley, and Hutchison
Avenue Software Corporation for their prior contributions.
PK%[%[�XH��doc/alt-libgd/CONTRIBUTORSnu�[���Ben Morss (morsssss)
chapg
Chen Pingping (Wilson)
Chris Reuter
Christoph M. Becker
Colin Watson
Dimitar Dobrev
edink
Gilles Espinasse
guenter
Kornel Lesiński
kshepherd
lhecking
Marcin Wojdyr
Martin Reboredo (YakoYakoYokuYoku)
mattias
Mike Frysinger
Mateusz Loskot (mloskot)
Nathanael Jones
nlopess
Ondřej Surý
Pierre Joye
pornel
Remi Collet
scottmac
tabe
Takeshi Abe
Tim Toohey
tostercx
Vincent Bernat
PK�j%[��U�*'*'doc/alt-vips/README.mdnu�[���# libvips: an image processing library

[![CI](https://github.com/libvips/libvips/workflows/CI/badge.svg)](https://github.com/libvips/libvips/actions)
[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/libvips.svg)](https://issues.oss-fuzz.com/issues?q=is:open%20project:libvips)
[![Coverity Status](https://scan.coverity.com/projects/6503/badge.svg)](https://scan.coverity.com/projects/jcupitt-libvips)
[![Gitter](https://badges.gitter.im/libvips/devchat.svg)](https://gitter.im/libvips/devchat?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)

# Introduction

libvips is a [demand-driven, horizontally
threaded](https://github.com/libvips/libvips/wiki/Why-is-libvips-quick)
image processing library. Compared to similar
libraries, [libvips runs quickly and uses little
memory](https://github.com/libvips/libvips/wiki/Speed-and-memory-use).
libvips is licensed under the [LGPL-2.1-or-later](
https://spdx.org/licenses/LGPL-2.1-or-later).

It has around [300
operations](https://libvips.github.io/libvips/API/current/func-list.html)
covering arithmetic, histograms, convolution, morphological
operations, frequency filtering, colour, resampling,
statistics and others. It supports a large range of [numeric
types](https://libvips.github.io/libvips/API/current/VipsImage.html#VipsBandFormat),
from 8-bit int to 128-bit complex. Images can have any number of bands.
It supports a good range of image formats, including JPEG, JPEG 2000, JPEG XL,
TIFF, PNG, WebP, HEIC, AVIF, FITS, Matlab, OpenEXR, PDF, SVG, HDR, PPM / PGM /
PFM, CSV, GIF, Analyze, NIfTI, DeepZoom, and OpenSlide. It can also load
images via ImageMagick or GraphicsMagick, letting it work with formats
like DICOM.

It comes with bindings for
[C](https://libvips.github.io/libvips/API/current/using-from-c.html),
[C++](https://libvips.github.io/libvips/API/current/libvips-from-C++.html),
and the
[command-line](https://libvips.github.io/libvips/API/current/using-cli.html).
Full bindings are available for :

| Language | Binding |
|---|---|
| Ruby | [ruby-vips](https://rubygems.org/gems/ruby-vips) |
| Python | [pyvips](https://pypi.python.org/pypi/pyvips) |
| PHP | [php-vips](https://github.com/libvips/php-vips) |
| C# / .NET | [NetVips](https://www.nuget.org/packages/NetVips) |
| Go | [govips](https://github.com/davidbyttow/govips) |
| Lua | [lua-vips](https://github.com/libvips/lua-vips) |
| Crystal | [crystal-vips](https://github.com/naqvis/crystal-vips) |
| Elixir | [vix](https://github.com/akash-akya/vix) |
| JVM | [vips-ffm](https://github.com/lopcode/vips-ffm) |

libvips is used as an image processing engine by:

| |
|---|
| [sharp (on node.js)](https://www.npmjs.org/package/sharp) |
| [imgproxy](https://github.com/imgproxy/imgproxy) |
| [bimg](https://github.com/h2non/bimg) |
| [sharp for Go](https://github.com/DAddYE/vips) |
| [Ruby on Rails](https://edgeguides.rubyonrails.org/active_storage_overview.html) |
| [carrierwave-vips](https://github.com/eltiare/carrierwave-vips) |
| [mediawiki](https://www.mediawiki.org/wiki/Extension:VipsScaler) |
| [PhotoFlow](https://github.com/aferrero2707/PhotoFlow) |
| [JVips](https://github.com/criteo/JVips) |

and others. The official libvips GUI is
[nip2](https://github.com/libvips/nip2), a strange combination of a
spreadsheet and a photo editor.

# Install

There are packages for most Unix-like operating systems, including
macOS. Check your package manager.

There are binaries for Windows in
[releases](https://github.com/libvips/libvips/releases).

The [libvips website](https://libvips.github.io/libvips) has [detailed
install notes](https://libvips.github.io/libvips/install.html).

# Building from source

libvips uses the [Meson build system](https://mesonbuild.com), version 0.56
or later. Meson can use [`ninja`](https://ninja-build.org), Visual Studio or
XCode as a backend, so you'll also need one of them.

libvips must have `build-essential`, `pkg-config`, `libglib2.0-dev`,
`libexpat1-dev`.  See the **Dependencies** section below for a full list
of the libvips optional dependencies.

There are basic bash completions in `completions/`, see the README in there.

## Cheatsheet

```
cd libvips-x.y.x
meson setup build --prefix /my/install/prefix
cd build
meson compile
meson test
meson install
```

Check the output of `meson setup` carefully and make sure it found everything
you wanted it to find.  Add arguments to `meson setup` to change the build
configuration.

- Add flags like `-Dnsgif=false` to turn libvips options on and off, see
  `meson_options.txt` for a list of all the build options libvips supports.

- Add flags like `-Dmagick=disabled` to turn libvips dependencies on and off,
  see `meson_options.txt` and the list below for a summary of all the libvips
  dependencies.

- You might need to add `--libdir lib` on Debian if you don't want the arch
  name in the library path.

- Add `--default-library static` for a static build.

- Use e.g. `CC=clang CXX=clang++ meson setup ...` to change compiler.

- You can have an alternative build directory, pick whatever names you like,
  for example one for release and one for debug.

There's a more comprehensive test suite you can run once libvips has been
installed. Use `pytest` in the libvips base directory.

## Optional dependencies

If suitable versions are found, libvips will add support for the following
libraries automatically. Packages are generally found with `pkg-config`,
so make sure that is working.

### libjpeg

Anything that is compatible with the IJG JPEG library. Use `mozjpeg` if you
can. Another option is `libjpeg-turbo`.

### libexif

If available, libvips adds support for EXIF metadata in JPEG files.

### librsvg

The usual SVG loader. If this is not present, vips will try to load SVGs
via imagemagick instead.

### PDFium

If present, libvips will attempt to load PDFs with PDFium. Download the
prebuilt pdfium binary from:

    https://github.com/bblanchon/pdfium-binaries

Untar to the libvips install prefix, for example:

    cd ~/vips
    tar xf ~/pdfium-linux.tgz

Create a `pdfium.pc` like this (update the version number):

    VIPSHOME=/home/john/vips
    cat > $VIPSHOME/lib/pkgconfig/pdfium.pc << EOF
         prefix=$VIPSHOME
         exec_prefix=\${prefix}
         libdir=\${exec_prefix}/lib
         includedir=\${prefix}/include
         Name: pdfium
         Description: pdfium
         Version: 4290
         Requires:
         Libs: -L\${libdir} -lpdfium
         Cflags: -I\${includedir}
    EOF

If PDFium is not detected, libvips will look for `poppler-glib` instead.

### poppler-glib

The Poppler PDF renderer, with a glib API. If this is not present, vips
will try to load PDFs via imagemagick.

### cgif

If available, libvips will save GIFs with
[cgif](https://github.com/dloebl/cgif). If this is not present, vips will
try to save gifs via imagemagick instead.

### libarchive

If available, libvips adds support for creating image pyramids with `dzsave`.

### libtiff

The TIFF library. It needs to be built with support for JPEG and
ZIP compression. 3.4b037 and later are known to be OK.

### fftw3

If libvips finds this library, it uses it for fourier transforms.

### lcms2

If present, `vips_icc_import()`, `vips_icc_export()` and `vips_icc_transform()`
can be used to manipulate images with ICC profiles.

### libspng

If present, libvips will load and save PNG files using libspng. If not, it
will look for the standard libpng package.

### libimagequant, quantizr

If one of these quantisation packages is present, libvips can write 8-bit
palette-ised PNGs and GIFs.

### ImageMagick, or optionally GraphicsMagick

If available, libvips adds support for loading and saving all
libMagick-supported image file types. You can enable and disable load and save
separately.

Imagemagick 6.9+ needs to have been built with `--with-modules`. Most packaged
IMs are, I think.

If you are going to be using libvips with untrusted images, perhaps in a
web server, for example, you should consider the security implications of
enabling a package with such a large attack surface.

### pangocairo

If available, libvips adds support for text rendering. You need the
package pangocairo in `pkg-config --list-all`.

### highway

If present, libvips will accelerate some operations with SIMD. If not, it
will look for the orc-0.4 package.

### matio

If available, vips can load images from Matlab save files.

### cfitsio

If available, vips can load FITS images.

### libwebp

If available, vips can load and save WebP images.

### libniftiio

If available, vips can load and save NIfTI images.

### OpenEXR

If available, libvips will directly read (but not write, sadly)
OpenEXR images.

### OpenJPEG

If available, libvips will read and write JPEG2000 images.

### libjxl

If available, libvips will read and write JPEG-XL images.

### OpenSlide

If available, libvips can load OpenSlide-supported virtual slide
files: Aperio, Hamamatsu, Leica, MIRAX, Sakura, Trestle, and Ventana.

### libheif

If available, libvips can load and save HEIC and AVIF images. Your libheif (in
turn) needs to be built with the correct decoders and encoders. You can check
with eg.:

```console
$ heif-convert --list-decoders
HEIC decoders:
- libde265 = libde265 HEVC decoder, version 1.0.9
AVIF decoders:
- dav1d = dav1d v6.6.0
- aom = AOMedia Project AV1 Decoder v3.5.0
$ heif-enc --list-encoders
HEIC encoders:
- x265 = x265 HEVC encoder (3.5+1-f0c1022b6) [default]
AVIF encoders:
- aom = AOMedia Project AV1 Encoder v3.5.0 [default]
- svt = SVT-AV1 encoder v1.1.0
- rav1e = Rav1e encoder
```

# Contributors

### Code Contributors

This project exists thanks to all the people who contribute.

<a href="https://github.com/libvips/libvips/graphs/contributors"><img src="https://opencollective.com/libvips/contributors.svg?width=890&button=false" /></a>

### Organizations

We've had generous financial support from our sponsors. Thank you very much!

<img src="https://opencollective.com/libvips/sponsors.svg?width=890&button=false" />
PK�j%[2��h�hdoc/alt-vips/ChangeLognu�[���8.16.1

- support multipage JXL
- fix PFM byte order on big-endian machines [agoode]
- morph: fix erode Highway path [kleisauke]
- morph: fix C-paths with masks containing zero [kleisauke]
- fix `--vips-info` CLI flag with GLib >= 2.80 [kleisauke]
- make `subsample-mode=on` and `lossless=true` mutually exclusive [kleisauke]
- fix SZI write with openslide4 [goran-hc]
- heifsave: prevent use of AV1 intra block copy feature [lovell]
- threadpool: improve cooperative downsizing [kleisauke]
- fix alpha shift during colourspace conversions [frederikrosenberg]
- heifsave: set image orientation using irot and imir transformations [lovell]
- XYZ2Yxy: guard against divide by zero
- fix MSVC compile error [na-trium-144]
- exif: ensure enumerated entries can be converted to string values [lovell]
- gifsave: add support for eval callback, ensure correct return code [lovell]
- tiffsave: honor disc threshold during pyramid save [kleisauke]
- fill_nearest: fix a leak
- colour: use suggested rendering intent as fallback [kleisauke]
- morph: fix Orc path with large masks [kleisauke]
- invertlut: fix final value in some cases
- matrixload: fix file format detect for some matrix types
- radload: improve sanity check of colour-related headers [lovell]
- heifsave: reject multiband images [lovell]
- heifload: prevent possible int overflow for large images [kleisauke]
- tiffload: add missing read loop [kleisauke]
- prevent possible use-after-free when debugging via `--vips-leak` flag [lovell]
- avoid possible overflow when multiplication result is cast up [lovell]

10/10/24 8.16.0

- allow small offsets for the PDF magic string [project0]
- add support for OJPEG tiffs [DarthSim]
- add "palette" metadata item to flag palette images [DarthSim]
- jxl load and save now support exif, xmp, animation [DarthSim]
- improved configure output
- add a filetype blocker for imagemagick
- add basic g_auto support
- support for long EXIF values [MarcosAndre]
- better system error messages on windows [kleisauke]
- add configurable max coordinate and vips_max_coord_get()
- improve kill handling
- PFM save and load now uses scRGB (ie. linear 0-1) [NiHoel]
- turn vips_addalpha() into a VipsOperation [RiskoZoSlovenska]
- add vips_rawsave_target(), vips_rawsave_buffer() [akash-akya]
- vipsheader supports multiple "-f field" arguments [sergeevabc]
- add "target_size" to webpsave [john-parton]
- add "passes" to webpsave [john-parton]
- revise sRGB -> B_W coefficients [daniellovera]
- add vips_sdf(), vips_clamp(), vips_maxpair(), vips_minpair()
- more const for the C++ API [Julianiolo]
- deprecate "cache" (use tilecache instead)
- add tests for tokenisation
- add "unpack_complex" option to vips_getpoint()
- add deflate compression level setting to tiffsave [ruven]
- add "smart_deblock" to webpsave [goodusername123]

4/10/24 8.15.5

- version bump, revise C++ soname

3/10/24 8.15.4

- fix an off-by-one error in vips__token_get()
- heifsave: fix crash when passing an invalid bitdepth [kleisauke]
- webpsave: fix memory leak on error [dloebl]
- heifsave: ensure NCLX profile is freed in lossless mode [kleisauke]
- threadpool: fix a race condition in error handling [kleisauke]
- disable GLib cast checks and asserts for plain builds [kleisauke]
- fix jpeg in tiff for high Q [nahilsobh]
- threadset: fix a race condition during thread exit [kleisauke]
- fix compatibility with MSVC [Julianiolo]

11/8/24 8.15.3

- fix dzsave of >8-bit images to JPEG
- jpegsave: fix chrominance subsampling mode with jpegli [kleisauke]
- pngload: disable ADLER32/CRC checking in non-fail mode [kleisauke]
- improve target_clones support check [kleisauke]
- fix pipe read limit
- fix a rare crash on Windows in highly threaded applications [Julianiolo]
- vipssave: fix infinite loop on Windows with large images [pdbourke]
- conva: fix a crash with {u,}{short,int} images [erdmann]
- fix vips_image_get_string
- heifsave: fix lossless mode [kleisauke]
- composite: fix dest-atop blend mode [kleisauke]
- fix vips_source_map for zero-length sources [kleisauke]

12/3/24 8.15.2

- fix deflate compression of tiff pyramids [manthey]
- thumbnail always writes 8-bit thumbnails [turtletowerz]
- lower min scale factor to 0.0 in svgload and pdfload [lovell]
- heifload: don't warn on images with nclx profiles [kleisauke]
- ppmload: ensure multi-line comments are skipped [lovell]
- fix arrayjoin with some pipelines [TheEssem]
- fix high Q mono JPEG TIFF write with mozjpeg [cavenel]
- tiffsave: ensure large file support (>2GB) on MSVC [kleisauke]
- check linker for target_clones support [lovell]

18/12/23 8.15.1

- reduceh: fix Highway path on SSE2 [DarthSim]
- fix JPEG in TIFF colourspace for Q >= 90 [heman1-test]
- fix build with upcoming libjxl 0.9 [kleisauke]
- jxlsave: lower min effort value to 1 [DarthSim]
- fix build without libjpeg [ionenwks]
- fix vips7 plugin load [jcupitt]
- allow ".jfif" as a suffix for jpegsave [casperbrike]
- don't let the magick sniffer hijack TIFF [kleisauke]
- ignore BLOCKED classes in foreign map [jcupitt]
- add locks to fftw3 calls [akash-akya]

11/11/23 8.15.0

- add support for target_clones attribute [lovell]
	* use with (un)premultiply for ~10% perf gain on AVX CPUs
	* use with XYZ to LAB colourspace conversion for ~10% perf gain on AVX CPUs
- add fast path to extract_band and bandjoin for uchar images [lovell]
- reduce `vips_sharpen` max `sigma` to 10 [lovell]
- inline scRGB to XYZ colourspace conversion, ~2x faster [lovell]
- set "interlaced=1" for interlaced GIF images [kleisauke]
- add @line_art to find_trim [miltoncandelero]
- improve C++ binding [MathemanFlo]
	* add `inplace()` / `VImage::new_from_memory_copy()`
	* add overloads for `draw_*()` / `VImage::thumbnail_buffer()`
- allow negative line spacing in text [donghuikugou]
- add VIPS_META_BITS_PER_SAMPLE metadata, deprecate the
  "palette-bit-depth" and "heif-bitdepth" meta fields [MathemanFlo]
- add "revalidate" to foreign loaders [jcupitt]
- add `premultiplied` option to smartcrop [lovell]
- add "prewitt" and "scharr" edge detectors, "sobel" is more accurate for
  non-uchar formats [jcupitt]
- add support for forms in pdfium loader [kleisauke]
- swap built-in profiles with ICC v4 variants [kleisauke]
- remove libgsf dependency in favor of libarchive [kleisauke]
- better chunking for small shrinks [jcupitt]
- use alpha range of 0.0 - 1.0 for scRGB images [DarthSim]
- add support for 16-bit float TIFFs [DarthSim]
- add direct mode to dzsave [jcupitt]
- require C++11 as a minimum standard [kleisauke]
- add support for SIMD via Highway [kleisauke]
- threaded write in tiffsave for tiled JPEG and JPEG2000 [jcupitt]
- add vips_thread_execute() to the public API [jcupitt]
- add "keep" flag to foreign savers, deprecate "strip" [a3mar]
- improve scRGB handling [jcupitt]

18/9/23 8.14.5

- fix a crash with alpha plus icc_import and icc_export [jcupitt]
- fix a crash in jxlsave [jcupitt]

15/8/23 8.14.4

- fix null-pointer dereference during svgload [kleisauke]
- heif{load,save}: guard against NULL strings [kleisauke]
- pdfiumload: fix rendering of pages with different sizes [DarthSim]

20/7/23 8.14.3

- fix ICC handling of greyscale images with a incompatible profile [kleisauke]
- fix use-after-free during tiff pyramid save [kleisauke]
- fix vips7 PNG load and save when using libspng [jcupitt]
- tiffload: slightly relax tile size sanity check [lovell]
- heifsave: limit dimensions to a maximum edge of 16384 [lovell]
- colourspace: ensure CMYK conversion uses the embedded ICC profile [kleisauke]
- ensure chromatic adaptation during icc_{im,ex}port() [kleisauke]
- improve ICC compatibility check for CMYK images [kleisauke]

21/3/23 8.14.2

- use a private fontmap in vips_text() [jcupitt]
- increase sanity checks on TIFF tile dimensions [lovell]
- ensure compatibility with libheif > 1.14.2 [kleisauke]
- minor doc fixes [jcupitt]
- sanitise dimensions in JPEG-compressed TIFF images [lovell]
- fix target pnm write [ewelot]
- dedupe FITS header write [ewelot]
- fix `strip` parameter in webpsave [jcupitt]
- earlier abort of webpsave on kill [dloebl]
- fix thumbnail of CMYK images with an embedded ICC profile [kleisauke]
- fix ICC handling of RGB images with a monochrome profile [kleisauke]
- ensure ICC transforms keep all precision [kleisauke]
- fix openslideload associated=XXX load [jcupitt]
- fix compatibility with MSVC [SpaceIm]

9/1/23 8.14.1

- add vips_thread_isworker() compatibility function [remicollet]
- add vips_semaphore_down_timeout() [kleisauke]
- idle threads are removed after 15s [kleisauke]
- fix version number in gtk-doc index [kleisauke]
- save mono fits images as NAXIS=2 [ewelot]
- fix jpeg `autorotate` for orientation 3 [zhifengzhuang]

22/12/22 8.14.0

- remove autotools
- remove various obsolete scripts
- remove benchmark
- `jp2ksave` defaults to chroma subsample off, and jp2 write
- don't minimise `vips_sink_screen()` input after expose ... improves
  caching during interactive use
- require libjxl 0.6+
- add `interlace` option to GIF save [dloebl]
- magick load sets `magick-format` metadata [aksdb]
- add `.pnm` save [ewelot]
- threaded tiff jp2k and jpeg decompress
- improve speed and efficiency of animated WebP write [dloebl]
- add `rgb` mode to openslideload
- new thread recycler
- threadpools size dynamically with load
- operations can hint threadpool size
- faster `dzsave`
- support for N-colour ICC profiles
- add bash completions for `vips`
- fits load and allows many more bands
- fits write doesn't duplicate header fields
- add `wrap` to `vips_text()`
- GIF load supports truncated frames [tlsa]
- EXIF support for PNG load and save
- expose location of interest when using attention based cropping [ejoebstl]
- deprecate gifsave `reoptimise`, add `reuse`
- add `encoder` to heifsave [dloebl]
- add `cplusplus` meson build option [jcupitt]
- make arrayjoin much faster with large arrays

9/11/22 started 8.13.4
- missing include in mosaic_fuzzer [ServOKio]
- emit "finish" at the end of targetcustom write [lucaskanashiro]

11/10/22 started 8.13.3
- improve rules for 16-bit heifsave [johntrunc]
- improve libspng palette write [kleisauke]
- improve libspng palette sort [DarthSim]
- ensure EXIF has prefix before parsing [lovell]
- fix low bit depth palette spng save [DarthSim]
- fix thumbnail of non-sRGB images with an export profile [kleisauke]

5/9/22 started 8.13.2
- in dzsave, add add missing include directive for errno/EEXIST [kleisauke]
- fix 8 bit palette PNG save [lovell]
- fix null string in buffer print [pclewis]
- revise caching of seq mode loaders [jcupitt]
- reduce latency on dzsave kill [kleisauke]
- improve text too large check [kleisauke]
- fix subifd writing for small images [ruven]
- name ICC profiles in spngsave [lovell]

24/7/22 started 8.13.1
- fix im7 feature detection in meson
- add a summary table at the end of configure in meson
- fix libpng fallback when spng is disabled in meson
- add "unlimited" to jpegload
- better 0 detection in unpremultiply
- fix low bitdepth spng save [jeffska]
- fix PNG low bitdepth save of high bitdepth images
- add support for libjxl 0.7 [kleisauke]
- improve compatibility with older libgsf versions [kleisauke]

21/11/21 started 8.13
- configure fails for requested but unmet dependencies [remicollet]
- add support for another quantiser [DarthSim]
- add "extend", "background" and "premultiplied" to vips_mapim() to fix edge
  antialiasing [GavinJoyce]
- add support for HDR HEIC and AVIF images
- add vips_spngsave()
- jpeg2000 load left-justifies bitdepth
- add "password" option to pdfload, fix byte ordering of "background"
- add vips_operation_block_set(), vips_block_untrusted_set()
- improve the pixel rng
- new meson build system [tintou]
- improve introspection annotations [tintou]
- add "unlimited" to heifload [lovell]
- add support for regions in C++ API [shado23]
- add "maxerror" to gifsave [dloebl]
- update libnsgif API [tlsa]
- deprecate "properties" option to dzsave (now always on)
- add vips_dzsave_buffer()
- always set the min stack size for pthreads, if we can
- add "fail-on" to thumbnail
- add "gap" option to vips_reduce[hv]() and vips_resize() [kleisauke]
- add "ceil" option to vips_shrink() [kleisauke]
- quality improvements for image resizing [kleisauke]
- add vips_source_new_from_target()
- add vips_target_seek(), vips_target_read(), vips_target_new_temp()
- add vips_tiffsave_target()
- add vips_target_end(), deprecate vips_target_finish()
- add "mixed" to webpsave [dloebl]
- add support for ICC profiles and linear encoding to JXL load and save [f1ac]
- add "reoptimise" to gifsave [dloebl]
- add "bitdepth" to magicksave [dloebl]
- change default PNG filter to "none" [lovell]

26/11/21 started 8.12.3
- better arg checking for vips_hist_find_ndim() [travisbell]
- fix thumbnail with CMYK output [AdamGaskins]
- fix size_t / ssize_t confusion [flga]
- fix jxl compatibility break [lovell]

26/11/21 started 8.12.2
- make exif resuint optional and default to inch
- win: don't set create time on inappropriate file descriptors [lovell]
- fall back to magicksave for gif if cgif is not present [erik-frontify]
- fix a crash with 0 length vectors
- change default frame delay for GIFs from 1s to 0.1s
- remove stray trailing comma from iiif3 dirnames [whalehub]
- fix TTF load [chregu]
- revise GIF save alpha threshold [jfcalvo]
- raise libpng pixel size limit from 1m to 10m pixels [jskrzypek]
- fix gif save change detector [TheEssem]
- fix load from pipe with variable size reads

21/11/21 started 8.12.1
- fix insert [chregu]

14/6/21 started 8.12
- all tools support `--version`
- add vips_svgload_string() convenience function
- fix thumbnail with small image plus crop plus no upsize [Andrewsville]
- rename speed / reduction-effort / etc. params as "effort"
- add gifsave [lovell]
- arrayjoin minimises inputs during sequential processing, saving a lot of
  memory and file descriptors
- add vips_image_get_format_max()
- flatten handles out of range alpha and max_alpha correctly
- don't use atexit for cleanup, it's too unreliable
- tiff writer loops for the whole image rather than per page [LionelArn2]
- fix VipsSource with named pipes [vibbix]
- added restart_interval option to jpegsave [manthey]
- add IIIF3 support to dzsave [martimpassos]
- add atan2 to math2 [indus]
- improve buffer and target save file format selection
- added VipsForeignPpmFormat, format arg to ppm savers
- add fail-on to give better control over loader error sensitivity
- add hyperbolic functions sinh, cosh, tanh, asinh, acosh, atanh [hroskes]
- add untiled jp2k load
- "insert" will minimise in seq mode
- better EXIF string handling [lovell]

16/8/21 started 8.11.4
- fix off-by-one error in new rank fast path
- add "unlimited" flag to png load [joshuamsager]
- improve filtering of .v enums [lovell]
- better logic to prevent shrink to nothing in thumbnail [kleisauke]

14/7/21 started 8.11.3
- build threadpool later [kleisauke]
- add jxlsave prototypes [adil-benameur]
- limit text chunks in PNGs [randy408]

15/6/20 started 8.11.2
- better libdir guessing [remi]
- fix tiff pyramid creation with jp2k compression (was broken by 8.11.1)
- don't load modules if we're built without modules

18/6/21 started 8.11.1
- add more example code to C docs
- update libtool support in configure.ac
- more startup info if VIPS_INFO is set
- command-line programs set glib prgname (no longer set for you by VIPS_INIT)
- enable strip chopping for TIFF read [DavidStorm]
- disable modules by default for static builds [kleisauke]
- fix jpeg tiff pyramid save

14/8/20 started 8.11
- add vips_jpegload_source() and vips_svgload_source() to public C API
- integrate doxygen in build system to generate C++ API docs
- improve C++ API doc comments
- add VipsInterpolate and guint64 support to C++ API
- add VImage::new_from_memory_steal [Zeranoe]
- vipsthumbnail supports stdin / stdout thumbnailing
- have a lock just for pdfium [DarthSim]
- get pdfium load building again [Projkt-James]
- add _source load support for pdfium
- add "seed" param to perlin, worley and gaussnoise
- add vips_source_g_input_stream_new() to load images from a GInputStream
- add openslideload_source(), vipsload_source(), vipssave_target()
- add hist path to rank for large windows on uchar images
- better 8/16-bit choice for pngsave
- avoid NaN in mapim [afontenot]
- hist_find outputs a double histogram for large images [erdmann]
- fix ref leaks in mosaicing package
- run libvips leak test in CI
- add vips_fitsload_source(), vips_niftiload_source()
- png and gif load note background colour as metadata [781545872]
- add vips_image_[set|get]_array_double()
- add GIF load with libnsgif
- add jp2kload, jp2ksave
- add jp2k compression to tiff load and save
- add JPEG-XL load and save
- add black_point_compensation flag for icc transforms
- add "rgba" flag to vips_text() to enable full colour text rendering
- move openslide, libheif, poppler and magick to loadable modules [kleisauke]
- better detection of invalid ICC profiles, better fallback paths
- add "premultiply" flag to tiffsave
- new threading model has a single threadpool shared by all
  pipelines [kleisauke]

30/4/21 start 8.10.7
- better vips7 PNG load compatibility [SkyDiverCool]
- fix load of large PPM images from a pipe [ewelot]

22/12/20 start 8.10.6
- don't seek on bad file descriptors [kleisauke]
- check for null memory sources [kleisauke]
- improve ppmload, fixing a couple of small bugs
- improve EOF detection in jpegload [bozaro]
- improve error detection in spngload [randy408]
- fix includes of glib headers in C++ [lovell]
- fix build with more modern librsvg [lovell]
- fix a possible segv with very wide images [f1ac]
- fix issue thumbnailing RGBA images in linear mode [jjonesrs]
- improve vipsthumbnail profile handling
- fix tiff deflate predictor setting [Adios]
- fix vector path for composite on i386 [kleisauke]

18/12/20 started 8.10.5
- fix potential /0 in animated webp load [lovell]

14/12/20 started 8.10.4
- fix spng detection

18/10/20 started 8.10.3
- relax heic is_a rules [hisham]
- fix vips7 webp load [barryspearce]
- fix out of bounds exif read in heifload
- fix out of bounds read in tiffload
- fix tiffsave region shrink mode [imgifty]
- add missing flushes on write to target [harukizaemon]
- hide info messages you could get with some older glibs [kleisauke]
- fix --no-strip on dzsave with icc-profiles [altert]
- better GraphicsMagick image write [bfriesen]
- add missing read loops to spng, heif, giflib and ppm load [kleisauke]
- block zero width or height images from imagemagick load [Koen1999]
- check for overflow in gifload height [lovell]
- fix msb_first default in ppm load and save [ewelot]
- force binary mode on win for connection read / write [Alreiber]
- better testing for output to target [barryspearce]
- ppmload_source was missing is_a [ewelot]
- improve webpload rounding and blending behaviour [lovell]
- fix range clip in int32 -> unsigned casts [ewelot]
- fix precision error in clip of float -> int casts [ewelot]
- fix load of HEIC images with 0 length metadata [ddennedy-gpsw]
- revise rounding in reduce [kleisauke]

6/9/20 started 8.10.2
- update magicksave/load profile handling [kelilevi]
- better demand hint rules [kaas3000]
- fix tiff thumbnail from buffer and source [vansante]
- in jpegsave, don't set JFIF resolution if we set EXIF resolution
- bump minimum libheif version to 1.3 [lovell]
- dzsave in iiif mode could set info.json dimensions off by one [Linden6]
- pdfload allows dpi and scale to both be set [le0daniel]
- allow gaussblur sigma zero, meaning no blur
- better heif signature detection [lovell]
- fix vips_fractsurf() typo [kleisauke]
- better heif EOF detection [lovell]
- fix gir build with g-o-i 1.66+ [László]
- improve seek behaviour on pipes
- add "speed" param to heifsave [lovell]
- fix regression in C path for dilate / erode [kleisauke]
- fix build with libheif save but no load [estepnv]

9/8/20 started 8.10.1
- fix markdown -> xml conversion in doc generation
- remove typedef redefinitions to please old gccs
- fix regression in tiff pyramid thumbnailing [tand826]
- stop 0-length buffer being passed to imagemagick [lovell]
- convert no-profile CMYK to RGB on save [augustocdias]
- ensure SVG loader skips input with chars outside x09-x7F range [lovell]
- better mask sizing in gaussmat [johntrunc]
- fix tiffsave "squash" handling [barryspearce]
- fix jpegload autorotate [chregu]
- only start the background render thread on first use

24/1/20 started 8.10.0
- more conformat IIIF output from dzsave [regisrob]
- add @id to dzsave to set IIIF id property [regisrob]
- add max and min to region shrink [rgluskin]
- allow \ as an escape character in vips_break_token() [akemrir]
- tiffsave has a "depth" param to set max pyr depth
- libtiff LOGLUV images load and save as libvips XYZ
- add gifload_source, csvload_source, csvsave_target, matrixload_source,
  matrixsave_source, pdfload_source, heifload_source, heifsave_target,
  ppmload_source, ppmsave_target
- revise vipsthumbnail flags
- add VIPS_LEAK env var
- add vips_pipe_read_limit_set(), --vips-pipe-read-limit,
  VIPS_PIPE_READ_LIMIT
- revise gifload to fix BACKGROUND and PREVIOUS dispose [alon-ne]
- add subsample_mode, deprecate no_subsample in jpegsave [Elad-Laufer]
- add vips_isdirf()
- add PAGENUMBER support to tiff write [jclavoie-jive]
- add "all" mode to smartcrop
- flood fill could stop half-way for some very complex shapes
- better handling of unaligned reads in multipage tiffs [petoor]
- mark old --delete option to vipsthumbnail as deprecated [UweOhse]
- png save with a bad ICC profile just gives a warning
- add "premultipled" option to vips_affine(), clarified vips_resize()
  behaviour with alpha channels
- improve bioformats support with read and write of tiff subifd pyramids
- thumbnail exploits subifd pyramids
- handle all EXIF orientation cases, deprecate
  vips_autorot_get_angle() [Elad-Laufer]
- load PNGs with libspng, if possible
- deprecate heifload autorotate -- it's now always on
- revised resize improves accuracy [kleisauke]
- add --vips-config flag to show configuration info
- add "bitdepth" param to tiff save, deprecate "squash" [MathemanFlo]
- tiff load and save now supports 2 and 4 bit data [MathemanFlo]
- pngsave @bitdepth parameter lets you write 1, 2 and 4 bit PNGs
- ppmsave also uses "bitdepth" now, for consistency
- reduce operation cache max to 100
- rework the final bits of vips7 for vips8 [kleisauke]
- --disable-deprecated now works [kleisauke]
- vipsheader allows "stdin" as a filename
- gifload allows gifs with images outside the canvas
- wasm compatibility patches [kleisauke]
- webpsave has a @profile param

24/4/20 started 8.9.3
- better iiif tile naming [IllyaMoskvin]

31/1/19 started 8.9.2
- fix a deadlock with --vips-leak [DarthSim]
- better gifload behaviour for DISPOSAL_UNSPECIFIED [DarthSim]
- ban ppm max_value < 0
- add fuzz corpus to dist
- detect read errors correctly in source_sniff
- fix regression in autorot [malomalo]
- thumbnail on HEIC images could select the thumbnail incorrectly under some
  size modes [ZorinArsenij]

20/6/19 started 8.9.1
- don't use the new source loaders for new_from_file or new_from_buffer, it
  will break the loader priority system
- fix thumbnail autorot [janko]
- fix a warning with magicksave with no delay array [chregu]
- fix a race in tiled tiff load [kleisauke]
- better imagemagick init [LebronCurry]
- lock for metadata changes [jcupitt]

20/6/19 started 8.9.0
- add vips_image_get/set_array_int()
- disable webp alpha output if all frame fill the canvas and are solid
- support arrays of delays for animated images [deftomat]
- add "unlimited" flag to svgload
- disable webp alpha output if all frames fill the canvas and are solid
- add "compression" option to heifsave [lovell]
- support webp and zstd compression in tiff
- loaders use "minimise" to close input files earlier
- integrate support for oss-fuzz [omira-sch]
- add vips_switch() / vips_case() ... fast many-way ifthenelse
- better const handling for arithmetic operators fixes comparisons against out
  of range values
- sharpen restores input colourspace
- handle alpha in heifload / heifsave [meyermarcel]
- add @interpretation and @format to rawload
- nifti load/save uses double for all floating point metadata
- add vips_error_buffer_copy()
- add VipsSource and VipsTarget: a universal IO class for loaders and savers
- jpeg, png, tiff (though not tiffsave), rad, svg, ppm and webp use the
  new IO class
- rewritten ppm load/save is faster and uses less memory
- add @no_strip option to dzsave [kalozka1]
- add iiif layout to dzsave
- fix use of resolution-unit metadata on tiff save [kayarre]
- support TIFF CIELAB images with alpha [angelmixu]
- support TIFF with premultiplied alpha in any band
- block metadata changes on shared images [pvdz]
- RGB and sRGB are synonmous

17/9/19 started 8.8.4
- improve compatibility with older imagemagick versions
- remove realpath, since it can fail on systems with grsec

31/8/19 started 8.8.3
- revert sharpen restoring the input colourspace
- xres/yres tiffsave params were in pixels/cm [f--f]

9/7/19 started 8.8.2
- better early shutdown in readers
- don't attempt to save large XMP to jpeg [tnextday]
- always fetch HEIC metadata from the main image [zhoux2016]
- fix loop in malformed ppm [Kyle-Kyle]
- better support for PNGs with long comment names
- fix build with GM
- add locks for pdfium load
- fix build with MSVC
- fix a problem with shinkv tail processing [angelmixu]
- fix a read one byte beyond buffer bug in jpegload
- make GIF parsing less strict
- better feof() handling in GIF load
- clip coding and interpretation on vips image read
- check image bounds for GIF load
- prevent over-pre-shrink in thumbnail [kleisauke]
- fix sharpen with sigma 0.5 [2h4dl]
- sharpen restores input colourspace
- verify bands/format for coded images
- improve data_length handling for jpeg metadata

24/5/19 started 8.8.1
- improve realpath() use on older libc
- better magickload error messages
- more consistent behaviour for page-height metadata
- fix for composite with many small images and some combinations of blend modes
- fix memleak in tiff pyr save to memory [scossu]
- istiff attempts to read the first directory rather than just testing the
  magic number [przemyslawpluta]
- much faster ismagick() [jcupitt]
- better behaviour for vips_region_fetch() if request lies partly outside image
- remove 256 band limit in arithmetic.c [erdmann]
- disable Orc if building with CET [lovell]
- fix vipsthumbnail with pyr tiff [kleisauke]
- text autofit could occasionally terminate early [levmorozov]
- fewer warnings on tiffload [chregu]
- vips_resize() breaks aspect ratio and limits shrink to prevent <1px
  dimensions [lovell]

21/9/18 started 8.8.0
- much faster smartcrop [lovell]
- add low/high to smartcrop [jcupitt]
- add XMP support to png read/write [jcupitt]
- deprecate thumbnail auto_rotate, add no_rotate [jcupitt]
- implement thumbnail shrink-on-load for openslide images [jcupitt]
- add animated webp support [jcupitt]
- revise vips_cast() to improve behaviour with uint images [erdmann]
- add bandand()/or()/eor() to cplusplus binding [clcaalu]
- implement shrink-on-load for tiff pyramids [jcupitt]
- added vips_image_set_blob_copy() [jcupitt]
- don't stop composite on first non-transparent image [felixbuenemann, GDmac]
- add vips_rect_overlapsrect()
- composite is much faster at positioning subimages
- stop tiff pyr layers if width or height drop to 1 [gvincke]
- dzsave has a new skip_blanks option
- add vips_CMYK2XYZ() and vips_XYZ2CMYK(), plus associated routes
- include cmyk and srgb fallback profiles
- add vips_profile_load() and use it everywhere
- fix race in temp filename creation [lhecker]
- add @reduction_effort param to webpsave [lovell]
- add @option_string param to thumbnail_buffer [kleisauke]
- add XMP, IPCT, ICC, EXIF etc. support to magickload/magicksave
- much lower memuse for gifload
- tilecache speedups
- add vips_heifload(), vips_heifsave()
- add heif thumbnail support to vips_thumbnail()
- free threadpool earlier, reducing mem growth for some long-running
  processes [jtorresfabra]
- add vips_region_fetch() / _width() / _height() for language bindings
- vips_text() supports justification
- move vips_image_set_kill() and iskilled() to the public API
- dzsave to szi sets suffix correctly [martinweihrauch]
- dzsave szi writes "scan-properties.xml"
- add vips_image_(get|set)_image()
- add openslideload option to attach all associated images as metadata
- dzsave to szi will write all associated images
- remove old c++ and python interfaces
- vipsthumbnail can thumbnail animated and multipage images
- deprecate webpload @shrink, use @scale instead

31/3/19 started 8.7.5
- better buffer sizing in tiff reader [omira-sch]

4/1/19 started 8.7.4
- magickload with magick6 API did not chain exceptions correctly causing a
  memory leak under some conditions [kleisauke]
- zero memory on allocate to prevent write of uninitialized memory under some
  error conditions [Balint Varga-Perke]

21/11/18 started 8.7.3
- fix infinite loop for autofit with non-scaleable font
- mapim was not offsetting by window offset [erdmann]
- better rounding for scale [kleisauke]
- fix a memleak in magick6load [kleisauke]

21/11/18 started 8.7.2
- more info output for temp files to help diagnose problems
- vips_text() could set the wrong DPI
- vips_text() leaked in autofit mode

23/9/18 started 8.7.1
- update function list in docs [janko-m]
- test for g_str_to_ascii() [jcupitt]
- fix temp file open on Windows and fallback on linux [lovell]

23/12/17 started 8.7.0
- add magicksave, save image with libMagick [dlemstra]
- remove jpeg thumbnail from EXIF if "jpeg-thumbnail-data" has been removed by
  user
- hough_line scales width to 0 - 180, not 0 - 360
- hough_line is 4x faster
- hough_circle is 2x faster
- add vips_sobel() and vips_canny() edge detectors
- add vips_rotate() ... a convenience method for vips_similarity()
- svgload was missing is_a [lovell]
- better header sniffing for small files
- drop incompatible ICC profiles before save
- better hasalpha rules
- create funcs always make MULTIBAND (ie. no alpha)
- use O_TMPFILE, if available [Alexander--]
- set "interlaced=1" for interlaced JPG and PNG images
- add PDFium PDF loader
- jpegload adds a jpeg-chroma-subsample field with eg. 4:4:4 for no
  chrominance subsampling.
- tiffload, pdfload, magickload set VIPS_META_N_PAGES "n-pages" metadata item
- add fontfile option to vips_text() [fangqiao]
- add vips_transpose3d() -- swap major dimensions in a volumetric image
- remove vips7 stuff from default API ... you must now #include it explicitly
- added vips_argument_get_id() to fix derived classes on win32 [angelmixu]
- fix compile with MSVC 2017 [angelmixu]
- pdfload has a option for background
- vips7 C++ interface defaults off
- make members, getters and operators "const" in cpp API
- composite has params for x/y position of sub-images [medakk]
- add Mitchell kernel
- pyramid builders have a choice of 2x2 shrinkers [harukizaemon]
- add `palette` option to pngsave [felixbuenemann]
- add basic nifti load/save support
- support writing string-valued fields via libexif
- paste in the test suite from pyvips
- get EXIF tag names from tag plus ifd [@Nan619]
- escape ASCII control characters in XML
- magickload now sniffs some file types itself
- update radiance load from upstream
- add region_shrink to tiffsave
- mapim could fail for float index images with coordinates out of int range
- scale openexr alpha to 0 - 255
- close input earlier, when we can [kleisauke]
- add vips_object_get_args() for language bindings [kleisauke]

12/3/18 started 8.6.4
- better fitting of fonts with overhanging edges [Adrià]
- revise C++ example [fangqiao]
- strict round down on jpeg shrink on load [davidwood]
- configure test for g++ 7.2 and composite.cpp
- don't Ping in magickload, too unreliable
- ensure WebP can add metadata when compiled with libwebpmux [lovell]
- improve accuracy of vector path convolution [felixbuenemann]

12/2/18 started 8.6.3
- use pkg-config to find libjpeg, if we can
- better clean of output image in vips_image_write() fixes a crash
  writing twice to memory
- better rounding behaviour in convolution means we hit the vector path more
  often
- fix a crash if a delayed load failed [gsharpsh00ter]
- icc_import attaches the fallback profile if it used it

5/1/18 started 8.6.2
- vips_sink_screen() keeps a ref to the input image ... stops a rare race
- fix a minor accidental ABI break in 8.6.0 -> 8.6.1 [remicollet]
- fix read of plane-separate TIFFs with large strips [remicollet]
- fix a C++ warning in composite.cpp [lovell]
- remove number of images limit in composite
- composite allows 1 mode ... reused for all joins
- fix race in vips_sink() for seq read

10/12/17 started 8.6.1
- fix mmap window new/free cycling
- fix some compiler warnings
- remove the 64-image limit on bandary operations
- better version date [bmwiedemann]
- bump wrapper script version [bgilbert]
- fix a memleak on error during jpeg buffer write [lovell]
- fix misspelling of IPTC as IPCT [lovell]
- seq could be set on small images opened in random-access mode [aferrero2707]
- fix small memleak in dzsave [lovell]
- small speedup for rgb->g [lovell]

15/4/17 started 8.6.0
- supports fits images with leading non-image HDUs, thanks benepo
- add vips_image_new_from_image() and vips_image_new_from_image1() ... make a
  constant image
- add new_from_image() to Python as well
- slight change to cpp new_from_image() to match py/C behaviour
- vips_conv(), vips_compass(), vips_convsep() default to FLOAT precision
- add FORCE resize mode to break aspect ratio
- add vips_thumbnail_image()
- better prefix guessing on Windows, thanks tumagonx
- savers support a "page_height" option for multipage save
- rename 'disc' as 'memory' and default off
- add vips_find_trim(), search for non-background areas
- remove lcms1 support, it had bitrotted
- `join` tagged as seq
- support tiffsave_buffer for pyramids, thanks bubba
- thumbnail and vipsthumbnail have an option for rendering intent, thanks
  kleisauke
- set file create time on Windows, thanks dlong500
- remove python tests ... moved to pyvips test suite
- vips7 and vips8 python bindings default to off ... use the new pyvips
  binding instead
- better svgload: larger output, handle missing width/height, thanks lovell
- add vips_gravity() ... embed, but with direction rather than position
- vips_text() can autofit text to a box, thanks gargsms
- add vips_composite() / vips_composite2(): merge a set of images with
  a set of blend modes
- better gobject-introspection annotations, thanks astavale
- vips_image_write() severs all links between images, when it can ... thanks
  Warren and Nakilon
- vector path for convolution is more accurate and can handle larger masks
- linear and cubic kernels for reduce are higher quality
- added vips_value_set_blob_free()
- "--size Nx" to vipsthumbnail was broken, thanks jrochkind
- fix build with gcc 7
- add vips_fill_nearest() ... fill pixels with nearest colour
- add VIPS_COMBINE_MIN, a new combining mode for vips_compass()
- vips_hist_find_indexed() now has a @combine parameter
- vips_affine() and vips_similarity() have a "background" parameter
- fix nasty jaggies on the edges of affine output, thanks chregu
- add gif-delay, gif-comment and gif-loop metadata
- add dispose handling to gifload
- dzsave outputs extra right and bottom overlap-only tiles, for closer spec
  adherence
- deprecate the "centre" option for vips_resize(): it's now always on
- setting the EXIF data block automatically sets other image tags
- add "extend" option to affine; resize uses it to stop black edges

29/8/17 started 8.5.9
- make --fail stop jpeg read on any libjpeg warning, thanks @mceachen
- don't build enumtypes so often, removing perl as a compile dependency
- fix a crash with heavy use of draw operations from language bindings,
  thanks @Nakilon

2/8/17 started 8.5.8
- fix transparency detection in merge, thanks Haida
- define env var VIPS_WARNING to hide warning messages
- shut down dzsave output earlier to help mark-sweep bindings
- fix webp thumbnail upscale, thanks Kleis

9/6/17 started 8.5.7
- better smartcrop
- transform cmyk->rgb automatically on write if there's an embedded profile
  and the saver does not support cmyk
- fix DPI mixup in svgload ... we were writing images about 20% too large,
  thanks Fosk

19/5/17 started 8.5.6
- tiff read with start page > 0 could break edge tiles or strips
- raise b64 limit to allow for huge profiles (thanks jaume)
- fix error return in blob save (thanks jaume)
- tag vipsprofile as py2 (thanks ioquatix)
- don't cache thumbnail (thanks tomasc)

23/4/17 started 8.5.5
- doc polishing
- more improvements for truncated PNG files, thanks juyunsang
- improve corrupted jpg handling, thanks juyunsang
- fix small test suite issues on os x

23/4/17 started 8.5.4
- don't depend on image width when setting n_lines, thanks kleisauke

7/4/17 started 8.5.3
- more link fixing in docs
- revise cache sizing again to help out of order errors under heavy load, thanks
  kleisauke

25/3/17 started 8.5.2
- better behaviour for truncated PNG files, thanks Yury
- missing proto for vips_tiffsave_buffer(), thanks greut
- move some docs from the wiki and blog into core libvips docs
- add support for markdown in docs

25/3/17 started 8.5.1
- init more classes earlier, thanks David

13/10/16 started 8.5.0
- rewritten buffer system is safer and frees memory earlier
- added tiff save to buffer
- added dzsave save to buffer (zip only)
- revise header get/set functions
- better vipsheader behaviour with complex field types
- added vips_image_hasalpha()
- added vips_thumbnail() / vips_thumbnail_buffer()
- webpload/webpsave read and write icc, xmp, exif metadata
- better >4gb detect for zip dzsave output [Felix Bünemann]
- all loaders have a @fail option, meaning fail on first warning, though it
  only does anything for jpg and csv
- add vips_image_get_fields() to help bindings
- add tiff multi-page read/write
- add VIPS_META_PAGE_HEIGHT metadata
- IM6/IM7 magickload supports page/n/page-height, all_frames deprecated
- gifload supports n/page-height
- added #defines for VIPS_SONAME, VIPS_LIBRARY_CURRENT, VIPS_LIBRARY_REVISION,
  VIPS_LIBRARY_AGE
- better support for bscale / bzero in fits images
- deprecate vips_warn() / vips_info(); use g_warning() / g_info() instead
- vipsthumbnail supports much fancier geometry strings, thanks tomasc
- vips_thumbnail() has new @size option
- fix --vips-cache-max etc.
- add compute reordering, plus some new API to support it:
  vips_reorder_margin_hint() and vips_reorder_prepare_many(), thanks
  aferrero2707
- kick load operations from cache on read error, thanks gaillard
- fix return from C++ assignment operator overloads (+=, -= etc)
- add @max_slope to vips_hist_local() to implement CLAHE, thanks hunter-87
- vips_gaussnoise() pixels are reproducible on recalc, thanks MvGulik
- max/min sort values by y and x coordinate
- tiff read uses libtiff scanline API if rows-per-strip is large
- vips_region_shrink() knows about alpha, helps dzsave and tiffsave
- use expat, not libxml, for XML load ... removes a required dependency, since
  we get expat as part of glib
- new sequential mode infrastructure is faster and more flexible
- add vips_smartcrop(), based on sharp's smartcropper
- vipsthumbnail has a --smartcrop option
- added vips_rot90() etc. convenience functions
- fix vips_resize() bug when hscale and vscale were very different

8/12/16 started 8.4.5
- allow libgsf-1.14.26 to help centos, thanks tdiprima

11/11/16 started 8.4.4
- fix crash in vips.exe arg parsing on Windows, thanks Yury

18/10/16 started 8.4.3
- fix error detection in gif_close, thanks aaron42net
- fix tiny threading memleak
- improve compatibility with very old glib, see #548

27/9/16 started 8.4.2
- small doc improvements
- fix error message for metadata fetch type mismatch
- resolve a race condition in thread shutdown, thanks Lovell

1/5/16 started 8.4
- many more wepsave options [Felix Bünemann]
- added quant_table option to wepsave [Felix Bünemann]
- added @n option to pdfload, thanks andris
- dzsave won't write empty tiles in google mode, thanks bverem, perog,
  felixbuenemann
- allow nested [] in CLI args
- restore BandFmt on unpremultiply in vipsthumbnail
- better python detection and build [Felix Bünemann]
- max-alpha defaults to 65535 for RGB16/GREY16
- added radsave_buffer [Henri Chain]
- support tiff orientation tag
- autorotate option for tiff load
- tiffsave converts for jpg if jpg compression is turned on
- tiffsave supports --strip
- conversions to GREY16 could lock
- free pixel buffers on image close as well as thread exit ... stops main
  thread buffers clogging up the system
- dzsave can write compressed zips [Felix Bünemann]
- vips_image_write() only refs the input when it has to ... makes it easier to
  combine many images in bounded memory
- VImage::write() implementation was missing
- VImage::write() return value changed from void to VImage to help chaining
- added C++ arithmetic assignment overloads, += etc.
- VImage::ifthenelse() with double args was missing =0 on options
- better accuracy for reducev with smarter multiplication
- better quality for vips_resize() with linear/cubic kernels
- pyvips8 can create new metadata
- better upsizing with vips_resize()
- add imagemagick v7 support, thanks sachinwalia2k8
- added vips_worley(), vips_perlin() noise generators
- added vips_convf(), vips_convi(), vips_convasep(), vips_conva() ...
  im_conv*() functions rewritten as classes
- vips_convsep() calls vips_convasep() for the approximate case
- new fixed-point vector path for convi is up to about 2x faster
- gif loader can make 1, 2, 3, or 4 bands depending on file contents
- support --strip for pngsave
- add svgz support [Felix Bünemann]
- rename bootstrap.sh -> autogen.sh to help snapcraft
- support unicode filenames on Windows
- added VIPS_ROUND as well as VIPS_RINT
- resize/reduce*/shrink*/affine now round output size to nearest rather than
  rounding down, thanks ioquatix
- better support for tile overlaps in google maps mode in dzsave
- dzsave puts vips-properties.xml in the main dir for gm and zoomify layouts
- resize and reduce have @centre option for centre convention downsampling
- vipsthumbnail uses centre convention to better match imagemagick
_ add vips_foreign_get_suffixes()

19/8/16 started 8.3.4
- better transparency handling in gifload, thanks diegocsandrim

30/7/16 started 8.3.3
- fix performance regression in 8.3.2, thanks Lovell
- yet more robust vips file reading

18/5/16 started 8.3.2
- more robust vips image reading
- more robust tiff read [Matt Richards]

15/4/16 started 8.3.1
- rename vips wrapper script, it was still vips-8.2, thanks Benjamin
- export C++ operator overloads for MSVC linking [Lovell]
- fix magickload @page with GraphicsMagick
- add giflib5 support
- allow resize >1 on one axis, <1 on the other
- vips_resize has an optional @kernel argument
- fix giflib4 detection [felixbuenemann]

29/1/16 started 8.3
- add vips_reduce*() ... a fast path for affine downsize
- vips_resize() uses vips_reduce() with lanczos3
- bicubic is better on 32-bit int images
- add pdfload, svgload, gifload for PDF, SVG and GIF rendering
- vipsthumbnail knows about pdfload and svgload
- added @page param to magickload
- matload is more specific (thanks bithive)
- lower mem use for progressive jpg decode
- sharpen has a new @sigma param, @radius is deprecated
- sharpen allows a much greater range of parameters
- sharpen defaults now suitable for screen output
- better handling of deprecated args in python
- much better handling of arrayimage command-line args
- faster hist_find (Lovell Fuller)
- webpload has a @shrink parameter for shrink-on-load
- vipsthumbnail knows about webp shrink-on-load
- better behaviour for vips_cast() shift of non-int types (thanks apacheark)
- python .bandrank() now works like .bandjoin()
- vipsthumbnail --interpolator and --sharpen switches are deprecated
- switches to disable PPM, Rad and Analyze support
- added VIPS_COUNT_PIXELS(), overcomputation tracking
- @out_format in vips_system() can contain [options]
- webpsave_buffer no longer ignores @lossless, thanks aaron42net
- float tiff tagged as scRGB to match photoshop convention, thanks Murat
- better jpeg autorot, thanks otto

24/3/16 started 8.2.4
- fix nohalo and vsqbs interpolators, thanks Rafael

27/1/16 started 8.2.3
- fix a crash with SPARC byte-order labq vips images
- fix parsing of filenames containing brackets, thanks shilpi230
- fix hist_entropy (lovell)
- small fixes to radiance load

12/1/16 started 8.2.2
- changes to ease compiling C++ binding with MSVC [Lovell Fuller]
- reorder file tests to put slow loaders last
- ifthenelse needs less C stack during eval
- better rounding in bilinear interpolator
- fix to "make check" in non-C locales [felixbuenemann]
- use compiler builtins isnan, isinf, fabs, fmin, fmax, ceil, floor when
  possible [Lovell Fuller]
- tune vips_shrinkh(), 30% faster [Lovell Fuller]
- remove SEQ hint from vips_subsample(), fixes cli performance [erdmann]
- fix double free on attach ICC profile from file in tiff write [erdmann]
- use g_assert_not_reached()
- better vips-from-C docs
- remove Duff from im_conv() / im_conv_f() for a 25% speedup [Lovell Fuller]

1/1/16 started 8.2.1
- add a compat stub [Benjamin Gilbert]
- python bandjoin is now just an instance function
- small doc improvements
- small vips7 C++ improvement
- remove exception specifications from vips8 C++ interface [Lovell Fuller]
- VImage::get_typeof() now returns GType

7/10/15 started 8.2.0
- added im_bufmagick2vips(), a vips7 wrapper for magick load from buffer
- fetch unset property now returns default value rather than warning
- many more const declarations to help gobject-introspection
- rewritten vips_shrink() is 2x faster, much lower memuse, now handles complex
- only allow [] for filename options
- add memory.h to Python API .. makes tracked highwater visible
- added bandjoin_const to add constant bands to an image
- better alpha handling for tiff write, thanks sadaqatullahn
- better cache sizing for vips_resize()
- sizealike / formatalike / bandsalike elide completely if they can for
  a x2 saving in C stack use in many cases
- added vips_mapim() ... resample with an index image, plus test
- try to improve vips_resize() quality a little more
- vips_resize() can do non-square resizes
- dzsave removes tile metadata by default, thanks Benjamin
- jpeg strip option removes a little more, thanks Benjamin
- added vips_image_new_from_memory_copy()
- improve vips_sink_screen() stability under heavy load
- added vips_arrayjoin()
- Python x.bandjoin(y) is now x.ibandjoin(y), sorry
- faster and lower-mem TIFF read
- faster bilinear interpolator
- TIFF loads and saves IMAGEDESCRIPTION
- add --properties flag to tiffsave
- dzsave defaults changed: now writes 256x256 jpegs for non-edge tiles, thanks
  Daniel

7/5/15 started 8.1.1
- oop, vips-8.0 wrapper script should be vips-8.1, thanks Danilo
- fix vips7 pathname parsing on windows, thanks Lovell

7/5/15 starteld 8.1.0
- add vips_premultiply(), vips_unpremultiply()
- change the alpha range rules for vips_flatten() to match vips_premultiply()
- vipsthumbnail uses vips_resize() rather than its own code
- vipsthumbnail uses vips_premultiply() for better alpha quality
- added bandand() bandor() bandeor() convenience funcs to Python
- oops, base64 encode could pad by up to two zero bytes
- added VipsRefString as a thing that gi bindings can unpack
- support "with Vips.Image as i:" in Python
- try to support DOS CSV and PPM files on linux
- add vips_byteswap(), remove byteswap option from vips_copy()
- add vips_bandfold()/vips_bandunfold()
- dzsave supports zip output > 4gb, thanks benjamin
- add support for HSV colourspace [Jonas Øgaard]
- skip oversized markers in jpeg write
- jpeg exif tags saved as name rather than title
- can now set any jpeg exif tag, not just modify existing tags
- add vips_hist_entropy()
- vips_log(), vips_log10() are zero-avoiding
- better overlap handling for dzsave, thanks robclouth
- add @spacing option to vips_text()
- tiff loads and saves IPCT and Photoshop data

7/5/15 started 8.0.3
- dzsave and tif pyr write could fail for some image dimensions, thanks Jonas

4/5/15 started 8.0.2
- fix a refcount error in C++ wrapper, thanks huskier
- better C++ api test
- test suite improvements
- remove a couple of stray header decls, thanks benjamin

25/4/15 started 8.0.1
- fix some compiler warnings
- work around a glib bug that can cause segv under load
- add some notes on threading to the docs
- better leak reporting

11/2/15 started 8.0
- remove old doc stuff, lots of doc improvements
- add fliphor(), flipver(), rot90(), rot180(), rot270(), median(), dilate(),
  erode() convenience methods to Python and C++
- python: use [] to index and slice image bands, use () to get a point
- c++: use [] to band index, () returns a vector<double>
- add shift option to cast
- sRGB2scRGB and scRGB2sRGB scale 16-bit alpha to and from 8-bit
- add magickload_buffer() [mcuelenaere]
- add vips_foreign_is_a_buffer() [mcuelenaere]
- added test_foreign.py, plus more test images
- added vips_region_shrink(), fast x2 shrinker
- rewritten tiff writer is about 3 - 4x faster at making pyramids
- jpg, magick, png, tiff readers now use only 1 fd per input image
- added vips_info_set(), vips_progress_set(), vips_profile_set() ... bindings
  can now support all the vips command-line options if they wish
- better conversion to greyscale, thanks bkw
- add vips_image_copy_memory(), improves stability with heavy threading
- jpegsave supports new mozjpeg features [lovell]
- add vips_vipsload(), vips_vipssave() ... why not

26/3/15 started 7.42.4
- im_maxpos_avg() avoids NaN
- small tiffsave doc improvements
- better thresholding for tiffsave "squash" mode
- add @miniswhite mode to tiffsave

6/2/15 started 7.42.3
- bump version for back-compat ABI change
- added vips_image_memory(), an alias for vips_image_new_memory()
- improvements to configure for python
- remove --disable-cxx configure flag
- python imageize preserves interpretation
- fix dzsave as a target format

30/12/14 started 7.42.2
- C++ required output params were broken, thanks Lovell
- remove VImage::scale() to get scale from header, it clashed with the
  VipsScale operator, thanks Lovell
- allow c++ set enum from string
- display param default and range in usage
- better docs
- more tests
- renamed VIPS_FOREIGN_DZ_DEPTH_1 as VIPS_FOREIGN_DZ_DEPTH_ONE etc. to help
  bindings
- vipsthumbnail will return an error code if one or more conversions failed
- disable chroma subsample in jpeg-tiff if Q >= 90
- try to handle tiffs with old-style 8-bit colormaps
- rename vipsthumbnail -o as -f, -o stays as a hidden flag
- fix some small leaks
- faster openslide load, thanks Benjamin
- add VInterpolate class to cplusplus binding, thanks Lovell
- add lower-level operation cache access
- turn on leak testing in test suite
- don't use isnormal() to test for crazy FP numbers, thanks Murat
- much faster RGB16 -> sRGB path

24/12/14 started 7.42.1
- add gobject-2.0 to Requires: in vips and vips-cpp .pc files
- bump soname
- fix VipsBlob read
- remove "future" dependency, thanks bgilbert

4/11/14 started 7.42.0
- better default resolution for png load
- better pbm (one bit) load, better pfm (float) load/save
- added pbm (one bit) save
- changed vips_gaussblur() parameters, sorry
- add .szi as a dzsave zip synonym
- support tiff XMP metadata
- support @density arg to magickload [Lovell]
- support python3.4 and python2.7 in new python binding
- vips_gaussmat() and vips_logmat() are now int by default, to match
  vips_conv(), and use @precision, not @integer
- added --disable-pyvips8 switch to turn off new py binding
- "vips thing" exit status can now be used to test for optional components

25/7/14 started 7.41.0
- start working on --disable-deprecated
- fix pngload with libpng >1.6.1
- add vips_resize()
- return of vips_init(), but just for bindings
- revised type.c to make it more binding-friendly
- add @background arg to save: the colour to flatten against
- add VIPS_ARGUMENT_MODIFY flag ... used for draw_circle etc, meaning an op
  which modifies its argument
- rename VIPS_OPERATION_RELATIONAL_NOTEQUAL as VIPS_OPERATION_RELATIONAL_NOTEQ
  for consistency
- python vips8 binding
- python vips8 test suite: test_arithmetic.py, test_colour.py,
  test_conversion.py
- move zoomify ImageProperties file, now a better match to the official tool
- rename VIPS_ANGLE_180 as VIPS_ANGLE_D180 etc. to help python
- remove cimg support, we have a gmic plugin now instead
- add support for vips8 plugins
- added "autorotate" option to jpeg load
- added autorot operator
- added @filter option to pngsave (Lovell)
- C++ vips8 binding

27/10/14 started 7.40.12
- better tiff detection (Lovell)
- fix memleak in sharpen (Lovell)
- fix profile handling in XYZ2scRGB, thanks Lovell

8/10/14 started 7.40.11
- rework extra band handling for colour functions
- set interpretation of matlut output more carefully

8/9/14 started 7.40.10
- icc_import and icc_transform checks the input profile for compatibility
  with the image, thanks James
- try to make vips_thread_shutdown() optional

8/9/14 started 7.40.9
- support jfif resunit "none"
- support GRAY as an input and output ICC space
- fix a read loop with setjmp() in png read, if the png file is broken
- fix vipsthumbnail with both input cmyk and output rgb profiles specified
- vipsthumbnail retries with specified input profile if embedded profile is
  broken
- add @profile option to pngsave, matching tiff and jpeg
- fix a race in the operation cache [Lovell]

8/9/14 started 7.40.8
- fix configure on rhel6 [Lovell]
- mono <-> rgb converters were not handling extra bands, thanks James
- support jpeg resunit "none"

21/8/14 started 7.40.7
- width and height were swapped in matlab load
- set interpretation more carefully on matlab load
- fix memleak in tilecache [Lovell]
- fix memleak in VipsArray [Lovell]
- fix memleak in webp load from buffer [Lovell]
- fix memleak in png save to buffer [Lovell]
- make out of order read in png and jpg a fatal error
- add thread_shutdown() to C++ (and thereby to python)

12/8/14 started 7.40.6
- more doc fixes
- fix similarity rotate+scale, thanks Topochicho
- fix 16-bit PNG save, thanks John
- fix dzsave date on Windows, thanks John
- fix vipsthumbnail on many-core systems, thanks James

25/7/14 started 7.40.5
- fix a race in im_maxpos_avg()
- limit n_thr on tiny images
- don't exit() on memleak detected, just warn
- add "autocrop" option to openslide load
- argh fix affine, again, there were sometimes black bars with nohalo and the
  vips8 interface
- pngsave in interlaced mode makes a copy of the image, so it's always seq
- vipsthumbnail shrinks to 1/2 window_size
- vipsthumbnail has an anti-alias filter between shrink and affine
- vipsthumbnail defaults to bicubic
- better rounding behaviour for fixed-point bicubic reduces noise
- fix pngload with libpng >=1.6.11
- fix colour for openslide read associated

4/7/14 started 7.40.4
- fix vips_rawsave_fd(), thanks aferrero2707
- fix im_point()
- vips_scale() now does round to nearest to avoid rounding errors
- improve im_openout() compat macro
- more vips7 compatibility fixes, thanks steve
- more robust vips_system()
- add webp support to vips7

30/6/14 started 7.40.3
- fix interlaced thumbnails in vipsthumbnail, thanks lovell
- fix use of "header" in benchmark/, thanks David
- fits save now caches the image before write, so it's top-to-bottom
- add --properties argument to dzsave, thanks bgilbert, jhenriksen

25/6/14 started 7.40.2
- dzsave write to zip stops at 4gb, thanks bgilbert
- improve short option name handling, thanks bgilbert
- added --enable-docs configure option to help freebsd
- removed a bash-ism from configure to help freebsd
- don't assume GType fits in an int to help freebsd

24/6/14 started 7.40.1
- revise man.1 pages
- fix vips_guess_prefix()

23/6/14 started 7.40.0
- version bump
- renamed "header" as "vipsheader" and "edvips" as "vipsedit"

21/1/14 started 7.39.0
- auto-decode for (almost) all operations, see vips_image_decode()
- background render thread cleans up and quits neatly
- colourspace has a source_space option
- operations can be tagged as "deprecated"
- redo im_draw_circle(), im_draw_flood(), im_draw_line(), im_draw_mask(),
  im_draw_image(), im_draw_rect(), im_draw_point(), im_read_point(),
  im_draw_smudge(), im_label_regions() as classes
- better rounding in vips_flatten()
- VipsStatistic operations are sequential
- vipsthumbnail has --rotate auto-rotate option
- removed embedded thumbnail reader from vipsthumbnail: embedded thumbnails
  are too unlike the main image
- fix to vipsthumbnail --crop, thanks Alessandro
- add vips_sum()
- add vips_hough base class and vips_hough_line()
- add "mode" param to vips_draw_image()
- add vips_hough_circle()
- reduce default cache size to 1,000 operations
- added "postbuild" signal
- vips_system() now supports many input images and you can change image
  argument order
- support 16-bit palette TIFFs, plus palette TIFFs can have an alpha
- libgsf-1 is now an optional dependency
- dzsave can directly write a ZIP file
- add ".vips" as an alternative suffix for vips files
- added vips_tiffload_buffer()
- added vips_image_new_from_buffer(), vips_image_write_to_buffer()
- added vips_object_set_from_string()
- added @container option to dzsave
- support 1/2/4 bit palette tiff images with alpha
- vips_system() now uses g_spawn_command_line_sync()
- added im_tile_cache_random() to help nip2
- added hough_circle() to vips7 C++ API
- added Travis CI config, thanks Lovell
- im_*merge(), im_*mosaic(), im_match*(), im_global_balance*(), im_remosaic(),
  im_*mosaic1(), im_*merge1() redone as classes
- better filename tracking for globalbalance
- revised vips8 image load/save API, now simpler and more logical
- operations emit "invalidate" if any of their input images invalidate
- operation cache drops ops on invalidate
- skipahead is back, thanks to a new threadpool tweak

6/3/14 started 7.38.6
- grey ramp minimum was wrong
- vipsthumbnail --crop could fail for very non-square images, thanks
  Alessandro
- fix a crash in vips_rawsave(), thanks Andrea
- updated German translation, thanks Chris
- fix coordinate error in affine, thanks ferryfax

24/2/14 started 7.38.5
- jpeg load from buffer could write to input, thanks Lovell
- fix webpload from buffer, thanks Lovell
- vips_sequential() could fail under heavy load
- remove support for seq mode read for operations like extract

13/2/14 started 7.38.4
- --sharpen=none option to vipsthumbnail was broken, thanks ferryfax
- more locking on property create and lookup to help very-threaded systems,
  thanks Nick

22/1/14 started 7.38.3
- undeprecate VIPS_MASK_IDEAL_HIGHPASS and friends, ruby-vips was using them,
  thanks ahacking

22/1/14 started 7.38.2
- auto RAD decode for affine
- falsecolour was not working for some image types
- foreign memory buffer images did not have the right dhint, broke
  command-line falsecolour on sequential images
- support many Radiance readers active at once
- add secret "rgbjpeg" flag to vips_tiffsave() to help IIP

19/1/14 started 7.38.1
- bump soname, thanks benjamin
- better conversion to and from scrgb/xyz for rad (hdr)
- fix --interpolate flag to vipsthumbnail, thanks Lovell

18/1/14 started 7.38.0
- version bump

19/10/13 started 7.37.0
- redone im_rotate_*mask45(), im_gauss_*mask*(), im_log_*mask(), im_dilate(),
  im_erode(), im_rank_image(), im_compass(), im_linedet(), im_gradient(),
  im_convsep(), im_convsep_f(), im_fastcor(), im_spcor(), im_sharpen()
  as classes
- im_gradcor() deprecated
- vips_init() now does some ABI compat checking, though this change requires
  an ABI break
- add "interlace" option to vips_jpegsave()
- remove vips_image_copy_fields() and vips_demand_hint() and add
  vips_image_pipeline() to do both jobs
- vipsthumbnail allows non-square bounding boxes, thanks seth
- add vips_matrixprint()
- add @point subsample mode to vips_subsample()
- im_contrast_surface() deprecated: it was slower than calling conv a few
  times
- radiance load supports sequential read
- rewritten radiance decode is much faster
- add vips_crop(), a synonym for vips_extract_area()
- rename vips_gammacorrect() as vips_gamma(), now takes 1 / exp
- vips_gamma() works for any format
- add --linear mode to vipsthumbnail
- support XYZ as a PCS for vips_icc_import() and vips_icc_export()
- add --strip option to jpegsave
- added vips_gaussblur() convenience function
- added --vips-profile, records and dumps thread timing and memory use info
- added vipsprofile, visualises --vips-profile output
- auto-vectorization-friendly inner loops
- added vips::init() and vips::shutdown() to C++ API
- reuse pixel buffers on sharing to reduce mem cycling
- conv is SMALLTILE, huge mem use saving on wide images
- vipsthumbnail has a --crop option
- remove video4linux1 code, it was useless on all modern linuxes
- redone freq filter builders as classes
- redone im_fwfft(), im_invfft(), im_freqflt(), im_disp_ps(), im_fractsurf(),
  im_phasecor() as classes
- vips_colourspace() allows B_W, GREY16, RGB16 as source / target
- added vips_thread_shutdown(), thanks Lovell
- vips_linear() has a uchar output mode
- redone im_cntlines(), im_rank() as classes
- move im_zerox() to deprecated, it wasm't very useful

9/1/14 started 7.36.6
- fix some clang compiler warnings

20/11/13 started 7.36.5
- better cache sizing in unbuffered sequential mode
- allow larger tile_size in dzsave
- remove use of PATH_MAX to help gnu hurd
- fix vips_hist_match()

15/11/13 started 7.36.4
- improve compat with im_init_world()

18/10/13 started 7.36.3
- fix compiler warnings in ubuntu 13.10
- reverse similarity rotation direction to match the convention used
  elsewhere in vips
- fix blocked caching of sequential load operations
- fix cache flags
- fix --delete option to vipsthumbnail

10/10/13	started 7.36.2
- better jpeg startup
- rename jpeg bool type to reduce confusion between libraries

3/10/13	started 7.36.1
- fix to help OS X build

3/10/13	started 7.36.0
- version bump

1/7/13 started 7.35.0
- added vips_matrixload() and vips_matrixsave(), load and save vips mat format
- rename image arrays as image matrices ... INTERPRETATION_ARRAY ->
  INTERPRETATION_MATRIX etc.
- rewrite im_buildlut(), im_identity*(), im_maplut(), im_falsecolour(),
  im_gammacorrect(), im_histgr(), im_histcum(), im_histnorm(), im_heq(),
  im_histnD(), im_histindexed(), im_histspec(), im_invertlut(), im_lhisteq(),
  im_stdif(), im_project(), im_profile(), im_tone_build*(), im_mpercent*(),
  im_ismonotonic() as classes
- vips_hist_local(), vips_stdif() do any number of bands
- thin vips8 wrapper for im_histplot()
- added vips_error_freeze() / vips_error_thaw()
- used freeze() / thaw() to stop file format sniffers logging spurious errors
- vipsthumbnail uses embedded jpg thumbnails if it can
- rename vips_diag() as vips_info(), add --vips-info flag
- deprecate im_hsp()
- added vips_webpload(), vips_webpload_buffer(), vips_webpsave(),
  vips_webpsave_buffer(), vips_webpsave_mime()
- tiff reader allows separate planes for strip read
- tiff reader and writer allow many more formats, eg. 32-bit int, complex, etc.
- tiff reader and writer allow any number of bands
- added vips_image_new_matrixv()
- dzsave basename param now called filename, so you can use .dz as a
  destination (basename is still there but deprecated)
- new _UNBUFFERED sequential mode saves memory in some important cases
- vips_conv() is a simple wrapper over the old convolution functions
- new optimize_coding param for jpeg write produces optimal Huffman tables,
  thanks Lovell
- im_tone_map() and im_tone_analyse() deprecated
- new --band arg to vips_maplut() replaces im_tone_map() functionality
- added vips_similarity(), simple wrapper for vips_affine() that lets you
  give a scale and rotate

3/7/13 started 7.34.2
- lower priority for Matlab load to reduce segvs from Mat_Open(), thanks
  Michael
- null-terminate libexif strings, thanks Mike
- openslide always outputs solid pixels

28/6/13 started 7.34.1
- fix morphological operators on non-uchar images
- remove any ICC profile when we use vips to go to srgb

7/6/13 started 7.34.0
- version bump
- oops, VImage.PIL_mode_from_vips() failed for CMYK, thanks Alessandro
- fix no-pango build
- add im_vips2dz(): run the deepzoom writer from vips7
- vips_magickload() has an option to read all images in a sequence
- redo im_make_xy(), im_*eye(), im_zone*(), im_sines() as classes
- added vips_pngload_buffer()
- faster --centre option to dzsave, thanks Kacey

12/3/13 started 7.33.0
- vipsthumbnail lets you specify the sharpening mask
- turn off caching for im_copy()/vips_copy(), we use copy to stop sharing, and
  it's cheap so caching doesn't help anyway
- auto rshift down to 8 bits on save, if necessary
- im_gaussnoise(), im_copy_file(), im_grid(), im_scale(), im_scaleps(),
  im_wrap(), im_rotquad(), im_zoom(), im_subsample(), im_msb(), im_text(),
  im_system(), im_system_image()
  redone as classes
- add --angle option to dzsave
- another vips_shrink() fix argh

14/5/13 started 7.32.4
- icc import and export could segv on very wide images
- fix centos 5 build, thanks re-boot

16/4/13 started 7.32.3
- rename GETTEXT_PACKAGE as vips7.32 to help Debian (thanks Jay)
- added "persistent" option to tilecache

12/3/13 started 7.32.2
- removed some left-over debugging code from configure.ac
- better handling of args without values, thanks Ruven
- better error messages from vips.c
- fix demand hints so "vips shrink" works again, thanks Jan
- im_jpeg2vips.c builds without jpeglib.h, thanks Alessandro

6/2/13 started 7.32.1
- fix --without-lcms, thanks speckins
- updates to licence, thanks Benjamin
- remove "fred" from dist
- better bootstrap on OS X

22/1/13 started 7.32.0
- tilecache in threaded mode could deadlock if the downstream pixel source
  raised an error (thanks Todd)
- fix another dzsave corner-case (thanks Martin)
- neater output for "header"
- added VIPS_META_LOADER: record the loader name
= header displays this loader hint
- vipsthumbnail is better at cache sizing

31/8/12 started 7.31.0
- redone im_Lab2XYZ(), im_XYZ2Lab(), im_Lab2LCh(), im_LCh2Lab(), im_UCS2LCh,
  im_LCh2UCS(), im_XYZ2Yxy(), im_Yxy2XYZ(), im_float2rad(), im_rad2float(),
  im_Lab2LabQ(), im_LabQ2Lab(), im_Lab2LabS(), im_LabS2Lab(), im_LabQ2LabS(),
  im_LabS2LabQ(), im_LabQ2disp(), im_XYZ2disp(), im_disp2XYZ(),
  im_icc_import*(), im_icc_export*(), im_icc_transform*(), im_dE_fromLab(),
  im_dECMC_fromLab(), im_dE00_from_Lab(), im_icc_ac2rc() as classes
- added vips_colourspace(), vips_colourspace_issupported(), replaces all
  derived conversions
- faster and more accurate sRGB <-> XYZ conversion
- support 16-bit sRGB import and export
- rename UCS colourspace as CMC
- dzsave can write zoomify and google maps layout as well
- tilecache supports threaded access, so openslide read now threads
- openslide2vips gets underlying tile size from openslide
- embed has 'background' option
- dzsave --layout google has a @background option
- dzsave has a --depth option
- update for new glib threading API
- remove no threads option, glib no longer support it
- better --help output for vips driver prog
- vipsthumbnail -o allows absolute file names
- much better exif handling for jpg images (thanks Gary)
- preserve jpeg app13 (photoshop ipct)
- vips_max() / _min() track the top n maxima / minima
- deprecate im_maxpos_avg(): too specialised to be worth maintaining
- deprecate im_linreg(): easily done by combining other operators
- deprecate im_point(): easily done by combining other operators
- add binary complex operations, with cross_phase as the only one so far
- added vips_bandbool(), with vips_bandand(), _bandor(), _bandeor() as
  convenience functions
- added scRGB colourspace, linear light float space with sRGB primaries
- all interpolators use corner convention ... we had round-to-nearest in
  several of them before, causing a range of annoying problems
- redone im_affine*() as a class
- added input space displacement to affine
- VipsArea is threadsafe
- dzsave has a --centre option

31/12/12 started 7.30.8
- png icc profile write was broken

31/12/12 started 7.30.7
- better option parsing for "vips", thanks Haida
- small fixes to help OS X
- backported threaded tile cache from next version, im_tile_cache() now
  uses it to prevent a deadlock, see comment there

14/11/12 started 7.30.6
- capture tiff warnings earlier

14/11/12 started 7.30.5
- fix libtool version mess up (thanks Benjamin)

2/10/12 started 7.30.4
- remove options from format string in .dzi (thanks Martin)
- vipsCC.pc required the wrong version of vips (thanks Alessandro)
- larger max tile size for dzsave
- linecache is 50% larger to leave some slop room

13/9/12 started 7.30.3
- linecache sized itself too large
- fix a compile failure if libtiff was not found (thanks Martin)
- dzsave did not work for images with an odd number of scanlines
  (thanks Martin)

4/9/12 started 7.30.2
- sequential stops all threads on error
- sequential delays ahead threads rather than blocking them completely

6/8/12 started 7.30.1
- fixes to dzsave: shrink down to a 1x1 pixel tile, round image size up on
  shrink, write a .dzi file with the pyramid params, default tile size and
  overlap now matches the openslide writer
- wrap VipsInterpolate for C++
- so affinei and affinei_all appear in Python
- be more cautious enabling YCbCr mode in tiff write
- add "DEPRECATED" flag to arguments
- jpeg load/save note and use the preferred resolution unit
- better error msgs for enum args
- fix compiler warnings in production build (thanks Dmitry)
- fix spurious warnings about exif updates
- VipsSequential has an integrated cache and stalls out of order threads
- add a line cache ... sizes up dynamically with request size
- tilecache / linecache use a hash table not a linear list

20/7/12 started 7.30.0
- support "rs" mode in vips7
- add --vips-version cmdline arg
- fix --without-tiff / exr / jpeg / png / magick
- add --vips-fatal flag

19/3/12 started 7.29.0
- sanity-check PNG read geometry
- nearest-neighbor interpolation rounds coordinates to nearest instead of
  rounding down (thanks Nicolas)
- add dzsave, save in deep zoom format
- rework im_shrink() as a class
- remove im_rightshift_size(), just a convenience function now
- vipsthumbnail no longer removes profiles by default
- much more gentle sharpening in thumbnails
- added "minimise" signal, used by tilecache to drop
- add :seq support to im_tiff2vips(), im_jpeg2vips() ... helps ruby-vips
- better thread safety for vips8 operation dispatch
- better thread safety for upstream / downstream image linking
- added "rs" open mode, removed "rd"
- added vips_operation_get_flags() ... system for attaching sets of flags to
  operations
- added VIPS_OPERATION_SEQUENTIAL flag
- vips8 command-line interface uses this to turn sequential mode on
  automatically when possible
- better handling of input files in vips7 command-line interface
- sequential can skip ahead, so extract / insert are now seq

16/7/12 started 7.28.10
- wopconst was broken
- vips_sign() was broken
- png save compression range was wrong
- more/moreeq was wrong
- vips7 ppm save with options was broken
- don't cache write operations

18/6/12 started 7.28.9
- slightly more memory debugging output
- remove references to the static bicubic interpolator from the docs
- fix temp file handling on Windows --- was breaking for non-vips files
  over 100mb
- better support for using images from multiple threads

18/6/12 started 7.28.8
- fixes for centos5 portability

18/6/12 started 7.28.7
- add vips_flatten() -- flatten RGBA to RGB
- better alpha handling in PNG load
- don't save RGBA PNG as CMYK JPG (thanks Tobsn)
- fix a crash with malformed jpg files (thanks Grigoriy)
- vipsthumbnail enables sequential mode more and caches lines better

19/4/12 started 7.28.6
- better resolution unit handling in deprecated im_vips2tiff()
- use TIFF_CFLAGS output from pkg-config (thanks Jay)
- much faster vips_argument_map()
- make jpeg pyramids work with tiff4
- tiff loader always offers THINSTRIP (thanks Diuming)
- add "nocache" operation flag, set for sequential load (thanks Diuming)
- fix a crash in the tiff reader for huge values of RowsPerStrip (thanks
  Nicolas)
- remove use of G_DEFINE_BOXED_TYPE() to help compat (thanks Jake)

19/4/12 started 7.28.5
- ifthenelse blend mode was broken
- small blend speedup
- default to libtiff-4

17/4/12 started 7.28.4
- up max buffer size for vipsbuf

6/4/12 started 7.28.3
- vips_divide() failed for int arguments
- fix warning for unused vips7 gvalue argument
- fix openslide read: always return png-style rgba, im_argb2rgba() becomes a
  NOP
- cast to unsigned int now removes <0 values
- vips7 interface to openslide now supports :,level,associated options (thanks
  Benjamin)
- make vips8 cache smaller
- more accurate progress reporting

13/3/12 started 7.28.2
- xres/yres tiffsave args were broken

13/3/12 started 7.28.1
- add ICC profile read/write for png files

30/1/12 started 7.28.0
- version bump
- added vips_foreign_find_save_options()/vips_foreign_find_load_options()
- delayed write to foreign via a "w" image was not working
- support operations with many returns in Python
- sequential read mode
- better im_shrink()
- added vips_sequential()
- new vips_sink_memory() keeps read ordering
- tiff, jpeg, png readers support sequential read
- max/min avoid NaN
- oop, histnorm was broken by the new vipsstats
- never use IM ping to get a header, fixes BMP load
- set @filename for non-vips formats in vips7 compat layer
- make Xres/Yres double
- completely disable debug by default in production builds

20/8/11 started 7.27.0
- version bump for new dev cycle
- im_subtract(), im_avg(), im_min(), im_minpos(), im_copy(), im_embed(),
  im_flophor(), im_flipver(), im_insert(), im_insert_noexpand(), im_lrjoin(),
  im_tbjoin(), im_extract_area(), im_extract_bands(), im_extract_areabands(),
  im_replicate(), im_clip2fmt(), im_gbandjoin(), im_bandjoin(), im_invert(),
  im_lintra(), im_lintra_vec(), im_black(), im_rot90, im_rot180(), im_rot270()
  im_sintra(), im_costra(), im_tantra(), im_asintra(), im_acostra(),
  im_atantra(), im_exptra(), im_exp10tra(), im_logtra(), im_log10tra(),
  im_abs(), im_sign(), im_max(), im_maxpos(), im_deviate(), im_divide(),
  im_multiply(), im_stats(), im_measure(), im_recomb(), im_floor(), im_ceil(),
  im_rint(), im_equal*(), im_notequal*(), im_less*(), im_lesseq*(), im_more*(),
  im_moreeq*(), im_remainder*(), im_and*(), im_or*(), im_eor*(), im_shift*(),
  im_pow*(), im_exp*(), im_ifthenelse(), im_blend(), im_c2amph(), im_c2rect(),
  im_bandmean(), im_c2real(), im_c2imag(), im_ri2c(), im_jpeg*2vips(),
  im_vips2jpeg*(), im_tiff2vips(), im_vips2tiff(), im_exr2vips(),
  im_fits2vips(), im_vips2fits(), im_analyze2vips(), im_raw2vips(),
  im_vips2raw(), im_magick2vips(), im_png2vips(), im_png2*(), im_ppm2vips(),
  im_vips2ppm(), im_mat2vips(), im_rad2vips(), im_vips2rad()
  redone as classes
- added argument priorities to help control arg ordering
- generate has a 'stop' param to signal successful early termination
- added optional output args, eg. x/y for min
- CLI supports optional output args
- in im_vips2tiff, enable YCbCr compression for jpeg write
- VipsMin stops search early if it can
- C API supports optional output args
- switch back to int-valued operations
- add the operation cache, various --vips-cache-* flags
- fallback vips_init()
- vips_tracked_malloc() tracks allocation size and can report total mem usage
- cache limits, drop, init, flush plus command-line controls
- remove dmalloc support, was never used and valgrind is better
- im_csv2vips() allows quoted strings, including escaped quotes
- added vips_shutdown()
- added --vips-leak flag
- more VipsImage props
- added vips_image_write(), old one becomes vips_image_write_to_file()
- added vips_region_paint_pel()
- added VipsArea as a public struct
- added array members and arguments
- added nary
- remove VipsPool, vips_object_local_array() is much better
- cache.c now drops if you have too many open files
- CLI args to change max files
- new format for handling exif tags
- switch SMALLTILE to 128, 512 was just too big
- oop mode "rd" was not always being used for images
- added ARRAY interpretation for images
- VipsStats tracks minpos/maxpos as well
- moved mask/ to deprecated
- use atexit() to call vips_shutdown()
- set _O_TEMPORARY on delete-on-close temp images if possible
- unlink temps on rewind on *nix, less likely to leave temps on a crash
- added complex conj as a basic operation
- rect/polar/conj work on any format, not just complex
- new VipsFile system for load/save in image formats
- options now introspectable, try "vips jpegsave"
- copy swap uses glib byteswap macros, about 2x faster
- edvips can change vips header byte ordering
- "header" is terse by default
- "header" outputs filenames if working on many files
- added openslide support (Benjamin Gilbert)
- allow new-style load/save options in filenames to
  vips_image_new_from_file() etc.
- VipsFormat is deprecated
- remove outchecks from documented API
- support gobject-introspection
- new Python binding based on gobject-introspection
- only spot options at the end of arg strings
- add vips_cache() as a vips8 operator
- remove the old fft fallback
- remove fftw2 support
- much faster im_draw_smudge()

14/1/12 started 7.26.8
- interpolate CLI args were broken (thanks speckins)

5/12/11 started 7.26.7
- lazy read from tiled tiff from layers other than 0 was broken
- optional args to vips_call*() do not work, disabled (fixed correctly in
  master)
- address calculations in files over 4gb were broken on 32-bit platforms
  (broken since March 2011, oops)

12/10/11 started 7.26.6
- NOCACHE was not being set correctly on OS X causing performance
  problems with large files
- update Orientation exif tag on jpeg write

12/10/11 started 7.26.5
- jpeg read/write copies over XMP data
- handle offset correctly in separable convolutions (thanks Nicolas)
- macros for class arg boilerplate
- class arg order set by new 'priority' param
- VipsExtend, VipsDirection enums added

12/9/11 started 7.26.4
- fallback vips_init()
- im_openout() compat stub was wrong, breaking ruby-vips
- vips_class_map_concrete_all() needed a compat macro too
- vips_class_map_all() was broken

10/8/11 started 7.26.3
- don't use G_VALUE_COLLECT_INIT(), many platforms do not have a glib this
  recent
- don't leave image->kill set when we detect termination
- test for a working C++ compiler, disable C++ parts of none found

10/8/11 started 7.26.2
- oops, im_benchmark.c had some stuff turned off
- configure option --without-cfitsio was broken (thanks Mike)

26/7/11 started 7.26.1
- doc fixups
- oops, ==0 missing from a strcmp() in vips7compat
- fixed a race in im_XYZ2Lab() table build
- added im_concurrency_get() to operation db
- better benchmarkn.sh runs for the correct number of CPUs automatically, runs
  three times for each one, and just reports the fastest

26/7/11 started 7.26.0
- version bunp for 7.26
- various fixes to get win32 and OS X building

6/12/10 started 7.25.0
- attach the jpeg thumbnail and multiscan fields (thanks Mike)
- faster tiff read for some common cases
- faster im_tile_cache()
- if we use C++ in libvips, add -lstdc++ to vips-7.xx.pc
- im_vips2png() / im_png2vips() set / get png resolution (thanks Zhiyu Wu)
- updated README
- don't use tables for bilinear on float data for a small speedup (thanks
  Nicolas Robidoux)
- no tables for uchar either, about a 15% speedup (thanks Nicolas)
- dmask write was broken
- lr/tbmerge() cast images to match, like im_insert()
- lr/tbmosaic() work for any mix of image formats / bands
- removed ancient balance stuff from im_lr/tbmosaic()
- gtk-doc for mosaicing
- add im_fits2vips() to the operation database
- im_fits2vips() is lazy and much faster
- im__file_open_write() / _read() has a flag for text_mode, get rid of all the
  remaining fopen()s
- move cooc_* and glds_* to deprecated
- move im_dif_std() to almostdeprecated
- move im_simcontr() to almostdeprecated
- add im_sines() to operation db
- move im_spatres() to almostdeprecated
- done gtk-doc for other
- --vips-progress tells you about nthreads, tile size, nlines
- gtk-doc for interpolate
- move im_stretch3() to deprecated
- move im_clamp() to deprecated
- gtk-doc for video ... all operators done! amazing argh
- set MAP_NOCACHE on OS X, otherwise performance dives off a cliff with
  files larger than memory
- removed man pages, we are all gtk-doc now
- im_jpeg2vips() ignores weird APP1 chunks
- im_add() for int/uint was broken
- im_ri2c() was broken
- added VIPS_FORMAT_BIGENDIAN format flag
- moved IMAGE and REGION to VipsImage and VipsRegion, classes over VipsObject
- Rect -> VipsRect
- libpng-1.5 supported
- better png read for 1-bit and palette images
- fits write
- better fits metadata support
- renamed all header fields, old names still supported, hopefully
- all of iofuncs moved to vips_ namespace
- lots of old iofuncs API moved to deprecated
- added VipsOperation, an abstract base class for all vips operations
- added VipsAdd, the first operation object
- im_tiff2vips() int/uint mixup for rows_per_strip, thanks Bubba
- removed the links feature, won't work with vips8
- got rid of the tools/ subdirs
- added im_bufjpeg2vips()
- tiff reader can do 1, 2, 4, 8 bit palette images
- tiff palette read can do mono images
- im_bufjpeg2vips() has a "header_only" parameter
- added vips_image_get_data()
- updated German translation (thanks Chris)
- fixed typo in im_conv() overflow estimation which could cause errors
- vips.c has new action syntax, knows about vips8 operations
- add now has sizealike
- vips7 binops all do sizealike too, also gbandjoin and ifthenelse
- new API is now functional
- vips.c generates GOption flags for vips8 operations
- added im_gauss_dmask_sep()
- laplacian generator lost -ve lobes for large sigma
- added im_aconv(), approximate convolution
- bumped smalltile to 512x512 for testing
- added VipsPool, got rid of floating refs again, argh
- VIPS_EXEEXT is now part of the exported API
- im_blend() also does sizealike, oops
- jpeg write was not inverting CMYK, thanks Ole
- im_falsecolour() converts to mono 8-bit for you
- im_icc_import*/export*() cast inputs for you
- im_vips2tiff() uses im__temp_name() for intermediates
- added vips_wrap7 ... wrap up vips7 operations as vips8 classes
- man pages are back for commands

30/11/10 started 7.24.0
- bump for new stable
- added im_dmask2imask(), im_imask2dmask()
- im_rotate_*mask90() can do masks of any size (thanks Adam Turcotte)

18/7/10 started 7.23.0
- im_vips2bufjpeg() writes to a linked list, so it will work for any size
  image and header
- added im_vips2bufpng()
- use GetTempPath() to pick a temp dir on Windows
- added "rd" mode to im_open()
- vipsthumbnail and vips use "rd"
- im_divide spots /0
- remove liboil dependency, we will use Orc instead
- various small cleanups (thanks Tim)
- add lcms2 support
- VImage(filename) defaults to "rd" mode
- revise window_offset / window_size, again
- fix a mixup with ANY hints that caused performance problems on the main
  benchmark
- rewritten im_circle as im_draw_circle, im_circle moved to almostdeprecated
- added IM_TYPE_RW args for inplace ops --- nip2 uses this to wrap inplace ops
  automatically
- special-case 3x3 masks in im_conv() for a 20% speedup
- add IM_TYPE_RW flag for im__rw_image, helps nip2 auto-wrap inplace ops
- im_insertplace() casts and bandalikes
- copy iconv.m4 and friends in bootstrap, thanks Mike
- moved the stupid _copy() versions of the inplace ops to deprecated, since
  nip2 can call inplace ops directly now
- added im_draw_rect(), moved im_paintrect() to deprecated
- added im_draw_image(), moved im_insertplace() to deprecated
- added im_draw_line(), now clips, moved im_fastline() to deprecated
- added im_draw_line_user(), now clips, moved im_fastlineuser() to deprecated
- added im_draw_mask(), now wrappable, moved im_plotmask() to deprecated
- added im_draw_point(), moved im_plotpoint() to deprecated
- added im_read_point(), now partial, moved im_readpoint() to deprecated
- added im_draw_smudge(), moved im_smudge() / im_smear() to deprecated
- convolution functions support complex images
- im_blend() can have any format condition image and it's converted to uchar
- security fix for vips-7.23 wrapper script (thanks Jay)
- im_affine() has a larger safety margin
- fix gtk-doc warnings
- small mask load/save improvements
- mask gtk-doc done
- add cfitsio dependency
- add FITS reader
- land the vector branch and the orc dependency ... we have SSE
  erode/dilate/add/conv
- add IM_SWAP
- dilate/erode do (!=0) on non-uchar images
- add multipass Orc to im_conv(), 3.5x faster for 5x5 mask
- im_profile() works for any image format, any number of bands
- im_rank_image() works for mix of formats, bands
- morph gtk-doc done
- oops, missing braces in debug.h and util.h, thanks Laurence
- update C++/Python binding
- oop, bool constants are always (int) now, so (^-1) works for unsigned types,
  thanks Nicolas Robidoux
- much lower memuse for im_cache() in complex pipelines
- im_scale_dmask() normalises to 20, not 100 ... we hit the fast
  conv path more often

12/5/10 started 7.22.2
- the conditional image of ifthenelse can be any format, a (!=0) is added if
  necessary
- oops vipsthumbnail sharpening was turning off for integer shrinks,
  thanks Nicolas Robidoux
- im_vips2jpeg() could fail for very small images (thanks Tim)
- threadpool wasn't stopping on allocate errors (thanks Tim)
- vips_sink_disc() could block if allocate failed (thanks Tim)

12/5/10 started 7.22.1
- fix a problem with tiff pyramid write and >1cpu, thanks Ruven
- constant ops clip to target range
- oops, moreconst and moreeqconst were the same
- better buffer handling in sinkdisc for single-line images
- less chatty errors from "vips"
- oops, don't rename "copy_set" as "copy_", thanks Ole

12/5/10 started 7.22.0
- bump and rename
- vipsthumbnail has a manualpage and sharpens correctly
- more interpolator work
- fixes to --disable-cxx mode (thanks Mike)
- added German translation, thanks Chris Leick
- fixed typos in some messages, thanks Chris Leick
- fix gettext startup
- all "colour" in messages changed to "color", have a proper en_GB
  translation file
- vipsthumbnail delete profile failed if there was a profile
- interpolate cli unref was broken
- more accurate, slightly faster bilinear and bicubic (thanks Nicolas Robidoux)

21/3/10 started 7.21.3
- added progress feedback to threadpool
- --vips-wbuffer2 switch does all wbuffer use now
- im_wbuffer2() renamed as vips_discsink(), some cleanups
- im_gammacorrect() can do 16-bit images too
- im_histplot() could fail for signed int histograms
- im_fwfft() and im_invfft() could free their output image too early
- added im_local_imask(), im_local_dmask()
- added im_mpercent_hist()
- im_maplut() casts the index image to one of the uint types
- fixed a couple of /0 problems with scale == 0 masks
- set G_LOG_DOMAIN to VIPS so we can use g_warning etc.
- added VIPS_DEBUG_MSG() macro
- --vips-wbuffer2 turns on threadpool for im_iterate as well
- im_vips2tiff() uses vips_sink() instead of threadgroup
- strip out threadgroup
- add --enable-debug=xxx flag
- im_iterate() -> vips_sink()
- better number-of-bands detection for im_magick2vips()
- added im_get_argv0()
- added PFM read / write

16/1/10 started 7.21.2
- "invalidate" is careful to keep images alive, so invalidate callbacks can do
  im_close()
- flood_blob could loop if start point == ink
- added im_meta_remove()
- added remove profile option to vipsthumbnail
- added vips_bandfmt_iscomplex() and friends, im_iscomplex() and friends
  deprecated
- im_bandjoin()/im_gbandjoin() work with images of varying formats
- added im_copy_native(), deprecated im_copy_from() and friends
- im_check*() name rationalisation
- finally removed old flood stuff
- im_insert*() bandalike and formatalike
- im_*join() bandalike and formatalike
- im_ri2c() bandalike
- im_vips2png() saves 16-bit PNGs, if necessary
- vipsthumbnail has selectable interpolators, optional sharpen
- moved a lot of stuff (eg. im_iscomplex()) from deprecated to
  almostdeprecated to avoid breakage
- im_csv2vips(): allow lines that end with EOF rather than \n
- im_vips2tiff has a bigtiff option
- oops, im_lineset() needs to ask for WIO of mask and ink
- move cache invalidation to REGION, fixes a race
- don't im_invalidate() after paint, it can cause horrible performance
  problems ... for example, im_plotmask() used as the action operator for
  im_fastlineuser() is terrible
- instead, users of the inplace operations need to call im_invalidate() at the
  end of a set of paint actions to trigger an update
- parent/child renamed as upstream/downstream in DAG
- set VIPS_ICC_DIR in configure
- ICC profiles are looked for in VIPS_ICC_DIR as a fallback
- im_render() mask image generation no longer triggers image calc
- threadgroups scale output buffers with number of threads for smalltile ...
  improves SMP scaling for narrow images on many-way machines
- default to max number of processors (--vips-concurrency and IM_CONCURRENCY
  set >0 can override) on linux and win32
- better nprocs guesser
- im_render() fixes to help the paintbox, some speedups too
- added im_wbuffer2(), a new distributed threading system, and --vips-wbuffer2
  to enable it, thank you Christian

15/1/10 started 7.21.1
- added "written" callbacks, used to implement write to non-vips formats

26/11/09 started 7.21.0
- branch for new dev cycle
- argh, missing init from colour.c (thanks Peter)
- argh, im_measure() was not looping over bands correctly (thanks Peter)
- removed mmap_limit, we now always use windows ... reduces VM use hugely,
  because mmap windows are freed when their regions are freed, while images
  are only unmapped when they are closed
- have a min bytes for mmap windows as well, so we don't make too many tiny
  windows
- im_disp2Lab() was broken
- deprecated.h is now defined in terms of current functionality, rather than
  repeating stuff
- im_flood() and friends rewritten, typically 4x faster
- removed --with-cimg option, added --disable-cxx
- added im_system_image() (thanks Roland)
- added postclose callbacks
- added vipsthumbnail
- oops, generate C++/Python wrappers for deprecated operations by default
- read TIFF images strip-wise, not scanline-wise
- better TIFF YCbCr reading (thanks Ole)
- isanalyze generates fewer silly error messages

26/11/09 started 7.20.3
- updated en_GB.po translation
- file_length is gint64 to avoid win32 breakage

23/11/09 started 7.20.2
- GETTEXT_PACKAGE now includes lib version number (thanks Jay)

11/11/09 started 7.20.1
- oop, im_clip2fmt() was missing PTOP flag, should get a small speedup
- im_conv() / im_convf() didn't like all-zero masks
- small updates to im_convf() from im_conv()
- im_read_imask() produced an incorrect error message if passed a doublemask
- rename im_convf(), im_convsepf() as _f()
- vips.c drops _f suffix when overloading
- regenerate C++ binding, don't make deprecated package

9/11/09 started 7.20.0
- removed vips-7.x.spec.in, shouldn't really have this in SVN
- bumped version to 7.20
- fixes to get "make dist" working again

3/4/09 started 7.19.0
- version bump
- tiny conv speedup
- catch lcms error messages
- fix includes for gtk+-3.0
- report virtual memory too in im__print_all()
- cosmetic changes to nohalo
- im_magick2vips() needs to invert alpha
- now (more or less) passes -Wextra
- added "fail" option to im_jpeg2vips: fail with an error on any warning
  (thank you Ole)
- started gtk-doc changes
- renamed im_meta_get_type() and im_header_get_type() as
  im_meta_get_typeof() and im_header_get_typeof() to prevent confusion with
  GObject type definers (was breaking gtkdoc object scan)
- revised more names, limited documented API
- im_buildlut() could segv for non-zero based tables (thanks Jack)
- VIPS_BUF_STATIC() does not take length arg
- check for SetImageOption() so we work with GraphicsMagick too
- "header" sets a non-zero exit code if anything failed
- add and use im_check_uncoded() and friends
- matlab load handles column-major and plane-separated images (thanks Mikhail)
- JPEG save allows "none" for profile, meaning don't attach a profile
- saner, simpler, faster typecasting for im_add(), im_subtract(),
  im_multiply(), im_divide(), im_remainder()
- im_remainder() has a float result for float types
- im_measure() allows sel == NULL, meaning all patches
- added "deprecated" package
- faster, simpler, better im_max(), im_min, im_avg(), im_deviate()
- im_max() returns true modulus, not square of modulus, for complex images
- im_avg() works for complex, returning average modulus
- im_system() fix (thanks Roland)
- im_system() rewrite
- im_maxpos()/im_minpos() are partial and work for complex
- im_max()/im_min() are now convenience functions
- im_maxpos_avg() handles complex and multi-band images
- added im_point(), rewrite im_point_bilinear() in terms of this
- close callbacks now happen *after* images have closed resources (such as
  open files) ... this lets them delete temps and stuff. Expect breakage :(
- added vips_interpolate_get_window_offset()
- boolean revised: smaller, more general, faster
- im_remainderconst_vec() renamed to im_remainder_vec() for consistency
- added im_shift*_vec()
- renamed im_eor_vec() as im_eorimage_vec() for consistency, also and, or
- renamed im_eorconst() as im_eorimage_const() for consistency, also and, or
- relational revised: smaller, more general, faster
- im_blend()/im_ifthenelse() allows many-band conditional, 1-band then/else
- im_blend()/im_ifthenelse() allows band and format to differ between then
  and else parts
- better im_check() functions
- added im_flood_other() as start of simple segmentation operator
- added im_label_regions()
- im_printlines(), im_debugim() deprecated (use im_vips2csv() instead)
- meta, header, callback, error, region, check, generate, memory gtkdocs
- removed printlines tool, vips2csv is much better
- removed other useless tools as well: debugim, binfile
- fix up addr calcs on 64-bit machines with >2gb images and inplace ops
  (thanks Christoph)
- im_generate() checks that im_demand_hint() has been called for this image
- im_jpeg2vips.c, set scale_num on shrink (thanks Guido)
- heh argh reading history always stopped after the first line (thanks Haida)
- added im_histindexed
- new im_iterate() calls start and stop functions from workers so resources
  they make are owned by the worker thread ... this makes it possible to have
  start functions which create multiple regions and therefore allows
  im_iterate() to scan more than one image at once
- threadgroup no longer has any default action, you must attach a work
  function
- added im_copy_file()
- added im_insertset()
- im_insertplace() allows small to be outside big
- added im__colour_difference(), colour ops now work on any image format
- added im_col_display_get_table(), so display tables are now shared by name
- added im__colour_unary()
- drop "set" postfix from names, so "insert" can now take a vector of positions
- deprecate all the "_raw" variants, not really necessary now
- removed "contrib", not very useful anymore
- added im_header_as_string()
- im_malloc()/im_free() now call g_try_malloc()/g_free() ... removes confusion
  over whether to use im_free() or g_free() for things like im_header_string()
- added im_history_get(), im_getexp(), im_printdesc() as wrapped functions ...
  so you no longer need the "header" program
- image vectors from Python work, woo

25/3/09 started 7.18.0
- revised version numbers
- updated vipsmanual
- revised manpages
- removed name and "changed" from vipsobject since we don't use them yet
- explicitly link with stdc++ for nohalo etc. stuff
- wrap im_gauss_imask_sep in C++/Python

6/3/09 started 7.17.3
- revised nohalo
- remove fading stuff from im_render() -- cleaner and simpler
- configure spots support for "restrict"
- reset dcm:display-range on magick read to help DICOM
- saner im_buildlut() behaviour
- added im_gauss_imask_sep()
- allow open and view of truncated images (thanks Joe & Rachel)
- revising rounding on im_affine*() coordinate transforms to make them more
  stable
- added Radiance write
- added im_float2rad()
- added IM_CODING_RAD, support where it makes sense (extract, flip, rotate,
  etc.)
- IM_PROGRESS env var
- docs for rad2float and IM_CODING_RAD

3/3/09 started 7.17.2
- im_magick2vips.c: allow funky bit depths, like 14 (thanks Mikkel)
- isradiance was returning TRUE too often
- radiance loader now loads packed RGBE/XYZE instead of unpacking to float
- added im_rad2float()

11/10/08 started 7.17.0
- merge vips-7.16 branch back into trunk
- bumped version number to 7.17.0
- re-added type.[hc]
- added vipsinterpolate and im_affinei
- added yafrsmooth interpolation
- added yafrtest
- added yafrnohalo
- ubuntu 8.10 changes
- interpolators get an output pointer, not region
- tuning for bicubic
- revised transform / clip code, we now do corner not centre
- yafr-smooth reworked along the lines of bicubic
- cleanups after yafr hacking
- added affinei_all
- don't set im_error() on failed callback
- moved im_format_t to VipsFormat, now sits over VipsObject
- IM_FORMAT_FLAG_PARTIAL -> VIPS_FORMAT_PARTIAL
- updated docs
- interpolators use type introspection
- added vips --list classes, does formats too
- include sys/param.h to get PATH_MAX in more places
- added vips_format_get_flags()
- oop, forgot to check for cancel during tiled tiff write
- don't use mmap for tiff read: no performance advantage, chews up VM
- VIPS_INTERPOLATE_SHIFT bumped to 12, we need the extra precision for u16 gel
  data
- added string->double transform for cmdline args
- merged class-params branch back into trunk
- IM_FREE() can do "const char*" variables
- im_buf_t renamed as VipsBuf
- added vips_object_to_string()
- added "nickname" and "description" properties to VipsObject
- shift/and/or/eor ops were broken for non-int types
- added nohalo interpolator
- updated format docs
- IM_INPUT_INTERPOLATE() now used by affinei and affinei_all
- added vips_object_new
- resamplers/interpolators now in a resample package
- removed yafrnohalo.c
- added matio as a dependency
- added Matlab save file read
- added Radiance file read
- better file-not-found messages

11/9/08 started 7.16.3
- oop typo in manpage for im_project()
- doc fixes
- returning non-zero from eval callbacks was not always stopping computation

11/9/08 started 7.16.2
- added --without-v4l option
- added -no-undefined to libsrcCC build, so we get a libvipsCC.dll
- removed the swig dependency: we include the generated bindings in the
  distribution tarball

6/9/08 started 7.16.1
- trigger eval callbacks on tiled tiff write
- added vips as an im_format_t
- added im_format_write()/_read() convenience functions
- more cleanups for the format API, argh
- removed win32/ directory now mingw finally makes DLLs correctly
- removed the windowed spcor for now, it has some edge effects

24/8/08 branch for 7.16
- renames and version numbers
- load plgs from libdir as well as libdir/vips-x.x for compat
- complex -> complex conversion was broken
- refstring <-> gstring transforms
- better behaviour with Magick non-presence
- added --enable-links switch to configure ... we no longer make the bin/im_*
  links by default
- started a 'format' section in the docs
- configure fails if no gettext found
- revised po/
- released as 7.16.0!

25/5/08 fork for loadable image format branch
- image load/save in non-vips format code moved to own dir
- simple format searching added
- some cleanups for vips load
- im_open() simplified
- add im_format_flags
- only consider formats with a save method in im_format_for_name()
- oops, format sort order was reversed
- im_filename_suffix() includes "." in suffix
- merge back into trunk for 7.15.1
- remove im_ispng(), im_png2vips_header() etc. & friends
- add "vips --list formats"
- rename VBuf as im_buf_t for consistency
- add type.[hc], start of new type system
- removed man pages for IM_MIN, MAX and RINT to avoid case confusion on
  OS X / win

7/3/08 started 7.15.0
- MAGIC constants should be tagged as unsigned
- write MAGIC correctly on sparc/powerpc machines (thanks Joe)
- oop, we were still making fade threads even when not fading
- tiny cond jump fixes for valgrind in colour.c
- remove -lstdc++ from libs, except on windows
- push Magick cflags earlier in the include order to make it easier to pick
  GraphicsMagick over ImageMagick (thanks Mikhail)
- fix the en_GB translation
- use meta to preserve resunit between tiff load and save
- small doc improvements
- read and write CMYKA tiff (thanks Doron)
- performance improvements for morphology ops, esp. when zooming out
- oop, im_render() was broken for mask == NULL
- better support for multiple Python installs (thanks Jay)
- better IM_SETSTR() stops some warnings
- im_histcum() works for signed histograms
- better rounding for im_conv(), im_convsep()
- tiny speedup for im_conv()
- better /0 test for remainderconst
- revise i18n configure, get rid of intltool
- command-line IMAGVEC input could segv with non-vips image output
- added .tobuffer()/.frombuffer(), .tostring()/.fromstring() to Python binding
- add PIL_mode_from_vips () and vips_from_PIL_mode () utility functions
- update docs for new Python stuff
- FIND_ macros no longer search for stuff, you have to specify prefixes if the
  packages are not on the default path (or in $prefix). This avoids some
  accidents on some platforms
- configure prints a summary of optional packages found at the end
- im_lhisteq() checks for window too small
- added invalidate callbacks
- now tests for MagickWand before ImageMagick (thanks Adam Turcotte)
- added "-rotate" option to vips2dj
- added man page for im_resize_linear
- better jpeg-in-tiff YCbCr read (thanks Ole)
- oops, invalidatefns were not being freed on im__close()
- VMask() can init from std::vector, so Python can init from []
- added IM_LIBDIR, im_guess_libdir()
- load plugins from libdir/vips-x.x on startup
- added meta get/set int/double/string/area/blob/GValue to C++ API
- include time_t in vips.h, thanks Nicolas Robidoux
- lock global image list (thanks lee)

25/1/08 started 7.14.0
- bump all version numbers for new stable
- better CMYK JPEG read (thanks Ole)
- add __str__ to VError in Python (thanks Ole)
- revert the dynamic wrapping for Python :-( next version!
- added VImage::convert2disc (thanks Ole)
- you can now set the jpeg quality factor for tiff pyramids (thanks Joe)
- you can now shrink jpegs during read, see "man im_jpeg2vips"
- added CMYK JPEG write
- optionally use GraphicsMagick (thanks Bob Friesenhahn)
- look for MAGICKCORE_HDRI_SUPPORT (thanks Marcel)
- set icc profiles in tiff pyramids explicitly (thanks Joe)
- add --without-cimg configure option
- add im_maxpos_subpel
- make im_abs compile without liboil
- add im_align_bands
- fix type overflow in complex division
- fix im_cross_phase and im_addgnoise (Tom)
- updated docs, C++ and python
- header no longer stops on error
- C++ dummy2.cpp helps OS X linking

12/12/07 started 7.13.3
- added "include <cstring>" to VImage.cc to help gcc 4.3
- started moving the python binding to dynamic wrapping
- added im_wrap(), im_wraptwo(), im_phasecor_fft(), im_cross_phase() (Tom)
- memleak plugged in im_save_string_setf()
- bugfix in and docs for im_gradcor() (Tom)
- use Glib macros to make im_msb work on big-endian platforms (Tom)
- use Glib macros to get rid of needless compile warnings (Tom)
- fix type overflow in im_c2ps/im_abs (Tom)

31/10/07 started 7.13.2
- build cimg on windows fixes
- various include cleanups, updated man pages
- break im_wbuffer() out to a separate API
- use im_wbuffer() to make im_vips2jpeg() compress in the background
- also im_vips2png(), im_vips2tiff(), im_vips2ppm()
- revised evaluation progress system
- new evalstart/evalend/preclose callbacks fix over/underflow reporting
- but the meaning of evalend has changed in a non-backwards-compatible way :(
  use preclose instead ito get the old behaviour
- added "--vips-progress" flag to turn on a simple eval progress tracker
- make im_spcor[12] static, im_spcor is wrapper (Tom)

28/9/07 started 7.13.1
- vips2dj can print RGB images
- oop, include <stdexcept> missing
- add protos for generate/iterate function args, fix warnings
- add cimg package, we now have C++ source inside VIPS, sigh
- added OUTPUT_DOUBLEVEC and OUTPUT_INTVEC, use for im_maxpos_vec() and friends

29/8/07 started 7.13.0
- we now have a trunk and the version is 7.13.x, woo!
- move manpages into a separate man/ dir ... speeds up builds a lot on windows
- don't install malkovich
- don't fail on unknown args for python (thanks Simon)

1/8/07 started 7.12.5
- im_embed() is more general ... x and y can be negative
- predicate.c is smaller and cleaner
- libsrcCC link improvement from Pablo
- support 32/64-bit ImageMagick as well (thanks Marcel)
- better im_magick2vips() for Q8 ImageMagick
- split repository to trunk/branches ready for a stable 7.12.x branch

27/7/07 started 7.12.4
- proto.h had vars called small, breaking on win32
- more python fixing, we now have working matrices too

17/7/07 started 7.12.3
- fix to VImage.i for gcc 4.2 (thanks Damir)
- eek, off by 1 for more than 1 band hists
- needed a slightly larger worst-case buffer in im__b64_encode()
- tiny cleanup for make_hI() prevents cond jump on ui in valgrind
- --disable-threads was broken again
- remove .svn dirs from dist
- now passes distcheck again

17/7/07 started 7.12.2
- added im_bandmean()
- added support for TIFFTAG_PREDICTOR (Andrey Kiselev)
- fix TIFFOpen() mode snafu (Andrey Kiselev)

11/5/07 started 7.12.1
- memory.c abort()s with DEBUG
- oops, im_bits_of_fmt() manpage was not being installed
- im_histcum() can do all image types
- updated NEWS
- added im_csv2vips_header()
- command-line csv read was broken (thanks Tom)
- removed length limit on argument vectors (Tom)
- added IM_PREFIX, configure-time install prefix
- oop, turned off memory.c DEBUG
- fix some bogus gcc 4.1 warnings with im_open_local_array()
- better vips usage message
- oops, IM_ANY missing from im_demand_hint() manpage (thanks Shahid)
- just warn if plugins fail to load in im_init_world()
- expose Vargv and make refblock public rather than private so that
  subclasses of VImage can add vips-style member operations (thanks Pablo)
- oops, im_initdesc() needed to have bbits set correctly (thanks Shahid)
- make VError derive from std::exception more officially
- woo, got exceptions working in SWIG
- soname version bumped to 12.x.x
- oops, added vector ops to Python
- check for overflow of int in return of strtol in dispatch system (Tom)
- add im_[di]mask_[xy]size to dispatch system (Tom)
- add im_gradcor(), im_grad_[xy] (Tom)

26/3/07 started 7.11.21
- ooo, added %include "std_except.i" & friends to VError.i, VImage.i
- im_init_world() is more lenient about recursive invocation
- im_gbandjoin() falls back to im_copy() for 1 input image
- race condition fixed in im_render.c (thanks Simon)
- bump for 7.12!!!

26/1/07 started 7.11.20
- another fix to im_region_image() (thanks Mikkel)
- tiny speed up to im_rect_includesrect()
- avoid recursive invocation in im_init_world() (thanks Christian)
- fix to extract_prefix (thanks Christian)
- buffer cache is now per thread
- combine buffer unref and ref in a single operation to reduce malloc/free
  cycles
- new internal API for passing regions between threads means we can remove
  buffer locks
- more buffer/region sanity checks, plus a memory barrier
- lock around error buffer changes
- im_vips2mask() was wrong for nx1 m-band images
- liboil back to "test"
- add buffer_cache_list to avoid GHashTable _insert()s
- oop, --vips-concurrency was broken
- renamed (in dispatch layer) im_and/or/eor_const -> im_and/or/eorimageconst
  for consistency
- C++ API wraps IMAGEVEC, DOUBLEVEC, INTVEC arguments
- oop, IMAGE % vector<double> was broken

21/12/06 started 7.11.19
- added im_linreg() (Tom)
- various C++ API polishes, plus a bugfix (Dennis Lubert)
- vips.spec split to devel and python too (Dennis Lubert)
- be more explicit about sizeof(magic)
- init magic to native order by default (thanks Dennis)
- Hist becomes im_history_get()
- new history mechanism is faster, uses much less memory, and removes
  duplicate lines
- added im_get_option_group()
- added official im_concurrency_set()/_get()()
- don't read bbits from vips files ... set ourselves from bandfmt
- oops add RGB16 and GREY16 to C++ header
- --list packages option to vips.c
- updated docs to 7.12
- oops, im_region_image() snafu was causing a lot of recomputation
- make im_mpercent() suck a little less
- EXIF save was a bit bOrked ... cause of mac crashes?
- im_histgr(), im_heq(), im_hist() all number bands from zero now
- fix stride in liboil calls
- set RGB16 on 16-bit RGB ICC export

29/11/06 started 7.11.18
- added im_buffer_t so regions can share calculated pixels: 2-3x speedup on
  the benchmark
- im_region_local() -> im_region_buffer()
- im_sharpen() order change to help sharing
- im_invalidate() clears buffer caches
- add sentinel attributes
- add some missing im_demand_hint()s
- paint ops invalidate the output image
- fix nothread eval
- raise threads limit to 1024 (thanks Christian)
- manual redone
- vipsCC python init() hooks
- add liboil dependency
- use liboil for im_abs(), im_add(), im_divide(), im_floor(), im_multiply(),
  im_subtract(), im_lintra(), im_avg(),im_deviate()
- quiet libtoolize test (thanks Tom)
- im_benchmarkn now regrows image each time
- strip meta from sample2.v ... saves a lot of mem (esp. Hist)
- added im_isscalar() (Tom)
- added IM_REGION_ADDR_TOPLEFT() (Tom)
- reduce size of im_rightshift_size.c to help compile (Tom)
- make im_stop_many(NULL) safe (Tom)

24/11/06 started 7.11.17
1;5Q
- better benchmark script makes graphing easier
- double-buffer image file writes
- reuse write threads
- clean up threadgroup / iterate / generate
- added im_benchmarkn to make it easier to make a CPU-bound op on large
  machines
- im_cache() failed for cpus > 1

1/11/06 started 7.11.16
- moved im__convert_saveable() into im_copy() (thanks Christian)
- missing gobject dependency (thanks Christian)
- --enable-threads was broken (thanks Christian)
- eval without theads was broken (thanks Christian)
- LIBADD libvips.la to libvipsCC.la (thanks Simon)
- benchmark.sh is now plain sh, not bash
- set ORIENTATION_TOPLEFT in im_vips2tiff (thanks Josef)
- oops, im_vips2csv() output separator was broken
- added im_benchmark2
- move XYZ2Lab LUT build outside the eval thread

30/10/06 started 7.11.15
- print leaked windows
- oops, race condition in im_window_unref()
- integrated im_region_window() into im_region_image(), tiny speed up

6/10/06 started 7.11.14
- ifthenelse and affine dhints revised
- buildlut no longer outputs x cods
- configure asks for glib >= 2.6 (we need GOption)
- configure uses AC_TOOL_CHECK to find tool names to help cross-compiling.
- better configure test for libexif
- add </libexif/ prefix if required
- test for glibtoolize during bootstrap to help OS X
- add --version to vips main prog
- don't set Type in im_scale, want to be able to scale hists, for example
- im_vips2mask() allows multiband hists as well
- im_vips2csv() lets you specify an output separator
- vips.c cleanups in arg handling
- removed python binding to C layer, too hard to get it working right
- leak test python test program
- added throw() decls to C++ to help SWIG
- no longer derive VError from std::exception, can't get it to work with SWIG
- added mmap window manager to share windows between regions ... big reduction
  in VM use for large workspaces and for SMP
- add im_spcor2 (with sliding window) (Tom)

15/9/06 started 7.11.12
- python vips wrapper hooks into init to start vips
- oop, python detect was broken again
- im_file_length() error return was wrong (thanks Christian)
- im_csv2vips() isnored last column if there was no trailing
  whitespace/quoting
- test for NULL filename/mode, common if you forget to check argc
  (thanks Bruno)
- im_break_token() returns NULL on trailing whitespace ... helps read_dmask
  work with trailing whitespace on matrix headers
- added im_buildlut(3)
- removed extra im_free() in im_copy() fallback in im_msb()
- added GValue input/output args
- various C++ binding improvements (thanks Dennis): namespace support,
  VError inherits from std::exception, small fixups
- remove im_msb() warning on fallback to copy for uchar ... not very serious,
  happens a lot in nip2
- added <vips/vips> C++ include ... include in a namespace
- added im_benchmark / SMP benchmark script
- add im_maxpos_avg() and im_point_bilinear() (Tom)
- make im_region_free(NULL) safe (Tom)
- link in manpages for im_contrast_surface (Tom)

8/9/06 started 7.11.11
- add im_norm_dmask()
- removed old code for gradient and lindetect
- internal decls split from proto.h to help SWIG
- test for python and SWIG during configure
- added python dir for the binding
- python binding done!
- oops, --without-python was broken (thanks Tom)
- added python/test
- add im_lu_decomp() im_lu_solve(), rewrite NR type functions in terms of these (Tom)

23/6/06 started 7.11.10
- still more im_affine() rounding/clipping tweaks
- ignore "--" arguments to vips.c
- im_init_world() also sets g_*_prgname() and loads plugins
- add manpage for im_init_world() (oops)
- error_exit() prints prgname
- various cygwin fixes
- fix cache thread assert failure (thanks Joe)
- "header" now uses GOption, slightly different args, will loop over args
- fixed assert() overenthusiasm in im_prepare()
- im_csv2vips() now has separate whitespace / separator tables
- add im_rightshift_size() (Tom)
- add im_maxpos_vec(), im_minpos_vec() (Tom)
- add im_norm_dmask() (Tom)
- make im_free_[di]mask(NULL) safe (Tom)

23/6/06 started 7.11.9
- back on sourceforge CVS again
- require openexr 1.2.2 or greater
- range check xy on im_insert*() for sanity
- VMask::invertlut decl removed (thanks Jean)
- added \"all\" option to vips.c

17/5/06 started 7.11.8
- debrokened openexr read
- added im_tile_cache()
- added tiled read to im_exr2vips()
- im_tiff2vips() now uses im_tile_cache() rather than its own cache ...
  faster in some cases, less RAM use in some cases, saves 200+ lines
- removed 'broken' read option from im_tiff2vips()
- read/write doubles with g_ascii_strtod() and friends where appropriate
- add a "thread" member to region to help sanity check region ownership
- saner threadgroup fixes a race problem on gcc 4.0.3 / amd64
- added im_vips2csv()
- im_open() now does CSV read/write too
- oops, broke vips main prog for function name in argv1 case

22/4/06 started 7.11.7
- split vips_png.c to im_vips2png.c and im_png2vips.c
- added OpenEXR dependency
- added im_exr2vips(), im_exr2vips_header()
- added im_isexr(), im_open() knows about OpenEXR
- added im_contrast_surface(), im_contrast_surface_raw() (Tom)
- added im_msb(), im_msb_band() (Tom)
- im_scale() sets Type on output
- added RGB16, GREY16 types
- im_*2vips() set these types if appropriate
- configure fixes for mac
- vips main prog uses GOption
- im_icc_* locks around calls to cmsDoTransform() to avoid corruption on SMP
  machines
- add im_prepare_many() (Tom)

10/3/06 started 7.11.6
- typo in manpage and header for im_rect_dup() (Tom)
- don't abort image load if XML read fails
- added im_video_test() ... test video source
- oops, lcms .pc finder was not working
- clipping problem in im_affine() fixed (thanks Clare)
- test for attr support in libmagick
- im_text() returns an error for empty string
- im_falsecolour() scale reversed
- im_remosaic() could crash on bad mosaics
- configure changes to fix --without-magick, lcms and fftw (but sadly we now
  require .pc files for these libs)
- im_vips2jpeg() automatically converts to 1 or 3 band sRGB uchar for write
- also im_vips2png()
- added im_project()

20/2/06 started 7.11.5
- added im_csv2vips()
- commas in filename options can be escaped with a '\'
- raise tile buffer limit (thanks Ruven)
- im_spcor() and im_fastcor() have prettier borders
- im_fastcor() returns sum of squares of differences, not sum of abs of
  differences

18/11/05 started 7.11.4
- small win32 fixes, thanks Juan
- added im_flood_blob_copy() ... a temporary hack
- much faster im_histplot()
- read RGBA palette-ized PNG images more robustly (thanks Tom)
- turn on -ms-bitfields automatically for mingw

26/9/05 started 7.11.3
- better error recovery for im_binfile() file too large
- all raw files now use mmap windows, so (eg.) ppm and analyze reads can go
  >2GB
- remove DISABLE_COMPAT ... you now have to define IM_ENABLE_DEPRECATED to get
  broken #defines
- fix to build without exif, thanks Chas
- use native win32 API for seek()/truncate() to work with large files
- use attribute to check printf-style args with gcc
- fix gcc4 warnings
- removed ebuild, since it's in gentoo now
- im_magick2vips() sets meta from attributes (good for dicom)
- im_magick2vips() writes many-frame images as tall thin VIPS images
- im_histcum() was broken for vertical histograms
- im_histnorm() is neater
- simpler and faster inner loop for im_conv() and im_convf() avoids gcc4 bug
- appendc() was reading past the end of the buffer on MSB machines

13/6/05 started 7.11.2
- im_copy_set() was messed up in 7.11.1
- put into CVS, phew
- fixed a rounding bug in im_affine() ... should no longer get black edges on
  image resize
- if TIFF open fails in im_open(), try going through libmagick
- merge requires all bands == 0 for transparency (used to just check 1st
  band)
- 16 bit LAB TIFF read/write was wrong
- new GType for refstring makes it visible from im_header_map()
- jpeg loader attaches exif data (and human-readable meta fields)
- jpeg saver writes any exif data
- meta not wiped by im_*incheck() in a "w" image
- meta keeps traverse order
- now require glib >= 2.4
- require libxml-2.0 for meta save and new history mechanism
- no more .desc files, history saved in XML after pixel data
- i/s/d meta fields saved there too
- added base64 encode/decode
- added blob header write
- added a save string type: types which define transforms to and from the
  save format get serialized
- GValue meta API now exposed, since we can serialise anything
- jpeg loader loads ICC profiles
- jpeg saver saves ICC profiles from the VIPS header
- src/header.c knows about meta system
- added im_analyze2vips(), im_grid(), im_raw2vips()
- extract/grid/replicate/zoom were not setting TRANSFORM flag
- better falsecolour LUT
- less stupid + more portable read/write of VIPS header
- better im_updatehist()
- jpeg load sets vips xres/yres from exif, if possible
- jpeg save sets exif xres/yres from vips, if possible
- icc_export and icc_transform  attach profiles and intents to output images
- added im_icc_import_embedded() to import with an embedded profile
- split vips_jpeg.c into two, it was getting too big
- added im_cp_descv(), im_cp_desc_array(), funcs use them
- removed im_append_Hist() from API
- fixed meta copy bug
- better history copy, removed nonsense about 1st line of Hist being special
- tiff read/write now reads/writes ICC profile from meta
- edvips rewritten to remove stupidness, and can now set xml
- header can now print xml extension block
- IM_ prefix for colour temp names

1/6/05 started 7.11
- added im_copy_morph()
- im_region_region() allows Bands and BandFmt to differ, provided
  sizeof( pel ) is the same ... makes im_copy_morph() work
- added im_meta*() functions (MW)
- im_header_*() rewritten for meta
- added im_header_exists(), im_header_map()
- use pkg-config to find libpng and ImageMagick
- added im_lineset()
- added im_extract_areabands() (JF)
- added im_copy_from() (JF)

15/4/05 started 7.10.12
- im_ifthenelse just evals left/right for region all zero/all one
- also im_blend
- swap g_setenv() back to plain setenv() so we work with glib 2.2

9/4/05 JC started 7.10.11
- docs no longer have broken links
- fixed memleak in im_text()

8/4/05
- one bit tiff read was sometimes reading a byte too far in each scanline

14/1/05 started 7.10.9
- im_filename_split() will now usually work for filenames containing ':'
  characters
- added im_render_fade() for fancier nip2 image repaint
- added "ccittfax4" as a TIFF compression option
- fix all 64-bit compiler warnings
- "," allowed as column separator in mask read
- better at spotting singular matrices
- small im_render() tidies
- glib dependency reduced to just 2.0, but untested ... helps people building
  on older systems who aren't interested in nip2
- removing leading spaces from IMAGEVEC arguments
- load non-interlaced PNGs more efficiently
- 1 point mosaic functions work on more image types
- better memory allocation debugging info
- local memory on regions can shrink as well as grow
- shut down threadgroups on render if no dirty tiles
- limit number of simultaneous renders
- higher mmap window threshold
- allow max == -1 for unlimited render cache
- 'priority' marks non-suspendable renders
- im_embed() mode == 4 paints white pels
- im_tiff2vips() was broken with --disable-threads
- oops, im_errormsg() compat macros were GCC only
- larger default tile size and strip height
- tiff write sets PHOTOMETRIC_CIELAB for vips TYPE_LAB images ... so we can
  write float LAB as well as float RGB (thanks Ruven)
- also 16 bit LAB TIFF write
- im_render() rewritten

20/11/04 started 7.10.8
- im_sharpen() is ~15% faster
- more quoting for MAGICK finder
- im_XYZ2Lab() uses a LUT rather than cbrt(), 5x faster
- --disable-threads removes gthread dependency completely (thanks Simon)
- intercept TIFF warnings as well as errors ... stops occasional libMagick
  exceptions
- add im_init_world() to im_init() as well to help backwards compat (thanks
  Simon)
- im_icc_present() function description was broken, thanks Jay
- oops, libtool library versioning was wrong, thanks Jay
- can now make TIFF pyramids of any non-complex image type (was uchar and LAB
  only), thanks Ruven
- 1st order mosaic code now works for LABQ too
- build system changes to make "make distcheck" work
- RPM .spec files fixed up and updated by configure (thanks Simon)
- tiny cleanups for vdump
- use g_setenv()/g_getenv()
- tiny improvements to IM_FREE*()
- tiny VImage debug print fixes (thanks Jay)
- swap off_t for gint64 to fix LARGEFILE support on win32
- computation feedback now uses gint64 for number of pels, so we give feedback
  correctly on images with >2**31 pels
- other small fixes for >2**31 pels in an image

10/11/04 started 7.10.7
- im_histnD() was not checking BandFmt (thanks Kirk)
- improvements to threading system speed up non-vips output in some cases
- use cbrt(x) where we can ... 10x faster than pow(x,1.0/3) on win32
- typeo in im_text() when built without PANGOFT2 (thanks Stefan)

1/11/04 styarted 7.10.6
- tiny doc fixes
- scripts now only depend on 'vips' program
- im_open( "r" ) is now lazier ... for non-VIPS formats, we delay read until
  the first ->generate()
- so im_open_header() now deprecated since im_open("r") is identical
- now looks for fftw3 as well as fftw2 ... slightly faster ffts

19/10/04 started 7.10.5
- fix to light_correct (thanks Jay)
- edvips knows about xoffset/yoffset
- better vips enum<->char conversions

4/10/04 started 7.10.4
- man page fixes (thanks Jay)
- removed last csh scripts (thanks Jay)
- scripts default VIPSHOME to $prefix (thanks Jay)
- doc build system tidies
- im_rank() edge padding was wrong
- im_vips2tiff() can now embed ICC profiles

22/9/04 started 7.10.3
- mildly better im_vips2tiff()
- *, -, +, /, % between two images now work for mixed number of bands
- im_free() was missing a man page
- revised documentation

1/9/04 started 7.10.2
- C++ .pc files were still set for 7.9, grr
- im_insertplace() didn't check compatibility of images (thanks Matt)

27/7/04 started 7.10.1
- set default stack size explicitly to help platforms with a very low default
- 16 bit RGB tiff read was broken (bug introduced in 7.9.5, thanks Haida)
- !pangoft2 was broken, thanks Kenneth
- win32 build fixes

12/7/04 renamed as 7.10.0
- added NOCACHE function flag ... stops nip memoising video & paint ops
- added im_extract_bands() ... takes out many bands from an image
- im_vips2tiff() scanline write speed up for area pipelines

10/6/04 started 7.9.6
- tiny polishing of im_ppm2vips()
- im_blend() can now work on labq
- boolean ops all work on float/complex images (by casting to int)
- im_maplut() was broken for 1 band image + many band lut + >8 bit output
- im_lintra_vec() now handles 1 band image and many band vector to make many
  band image
- oops, im_lintra_vec() was missing a man page
- im_measure() can work on labq
- im_lhisteq() uses new embed mode, _raw() version is one pixel smaller, sets
  Xoffset/Yoffset for new origin scheme
- generalised im_tone_build() to any image type to make im_tone_build_range()

20/5/04 started 7.9.5
- tiff output res can be a single number too
- added im_text() to make a bitmap from a string with pango
- im_tiff2vips() does 16 bit RGBA
- im_binfile() was broken since 7.9.2 due to im_mapfile() change
- im_ppm2vips() now works for 16 bit images
- added im_copy_swap() ... copies, reversing byte order
- im_resize_linear() was broken for some images, thanks Javi

8/3/04 started 7.9.4
- oops, config.h include missing in a few places
- im_vips2tiff() can now write 1 bit images
- im__find_lr/tboverlap() now exported to nip
- better edge tile handling for tiff read/write (thanks Ruven)
- added extend-pixels-from-edge mode to im_embed()
- im_conv*(), im_rank(), im_stdif(), im_dilate(), im_erode() all use it to
  expand their input, so their output now has guess borders, not black borders
- im_fastcor() now does an im_embed( 1 ) on the output ... the zero borders
  were very annoying before, since you would usually be searching for the
  minimum point
- no change to im_spcor(), since you will usually be searching for the maximum
- better im_render() cache behaviour under heavy loads
- im_affine() revised
	* clip, resample and transform is now pixel-perfect for all
	  inputs (I hope)
	* uses the new embed to make sure there are no black borders
	  from edge interpolation
	* about 20 - 30% faster
- policy change: Xoffset and Yoffset are now set by all operations to record
  the position of the input origin in the output
- im_replicate() is much faster for some cases
- added tile and mirror flags to im_embed()
- added im_cache() convenience function
- better ETA for image calculation
- im_tiff2vips() now has a "broken" option so it can read tiled tiffs made
  with earlier versions of vips
- on convert float to int format, now does floor() not rint() ... more
  'mathematical'
- added im_rint()
- im_sharpen() now uses a gaussian mask
- im_convsep() more resistant to int overflow problems
- added im_make_xy(), avoids rounding problems with the old float-based thing
- im_profile() now makes vertical images for a vertical profile
- added im_vips2tiff() option to set the resolution in inches not cm (thanks
  Andrey)
- im_binfile() is now exported

6/2/04 started 7.9.3
- added an im_init_world() to im_open(), to help old progs
- renamed VSemaphore as im_semaphore_t
- started using libtool library versioning
- now uses g_module_*() in place of dlopen()
- now uses pkg-config instead of vips-config (thanks Simon)
- fixes to vips.h for _ADDR() with DEBUG on (thanks Konrad)

10/12/03 started 7.9.2
- patches for freebsd, thanks Lev Serebryakov
- vips2dj knows about my colour laser printer
- added i18n support, glib/gmodule/gthread dependency
- im_error*() API revised to be more i18n friendly
- List type removed, now uses g_slist
- VBuf added, some more utility funcs pushed down from nip
- im_thread stuff removed, now uses g_thread
- im_lock stuff removed, now uses g_mutex
- im_semaphore_t renamed to VSemaphore, not sure this is a good idea
- build with --disable-threads to turn off threaded render
- #include <vips/vips.h> now pulls in most of the public API, you shouldn't
  need other vips includes very often
- im_close() is better at cleaning up if there's an error
- inverse FFTs could fail for wider-than-high images with fftw
- better im_icc_transform error messages
- bug fix in im_render with large caches
- im_binfile() now has an offset parameter
- im_mapfile()/im_unmapfile() now work on IMAGE and record the length of the
  file they mapped ... this lets VIPS successfully unmap a file if it changes
  size while it's open

20/10/03 started 7.9.1
- threadgroups now have their own kill flag
- im_plotmask() now does anti-aliasing
- im_iterate() fix for operations on mmap window images (thanks Clare)
- im_writeline() stops on kill
- fix for im_fwfft() segv for wider-than-high real images (thanks Andrey)
- fix for im_fwfft() to work for non-square real images (thanks Andrey)
- can now read and write 32-bit IEEE float TIFF (Andrey Kiselev)
- clean-ups for colour.c (Andrey Kiselev)
- no longer lets you make an image with width|height|bands == 0 (thanks Joe)
- im_vips2tiff(), im_vips2*jpeg*(), im_vips2png(), im_vips2ppm() could
  sometimes fail for mmap window input images (thanks David)
- added IM_RECT_HCENTRE(), IM_RECT_VCENTRE() macros

20/8/03 JC
- started 7.9.0
- added im_rank_image() ... im_maxvalue() a special case of this
- im_subtract() goes up to int earlier for better value preserving, thanks
  Haida
- im_rank() much faster for large windows, correct result on all platforms
  (dratted memcpy() was causing problems before)
- fixed problem with libMagick config if installed somewhere strange
- fixed problem with include order in library compile
- added --without-magick configure option
- added im_render(), threaded background image paint
- added im_replicate(), replicate an image horizontally and vertically

31/5/03 JC
- started 7.8.11
- fixed a problem with relational operators and some combinations of input
  types (bug introduced in 7.8.9), thanks Haida
- vips-7.8 script overrides VIPSHOME environment variable
- better im_guess_prefix
- stupid light_correct script no longer uses /pics/tmp
- added batch_crop script

22/5/03
- started 7.8.10
- the JPEG writer can embed ICC profiles in output images ... although I've
  yet to see it make any difference :-( test this carefully at some point
- fixed a possible coredumper in jpeg write
- jpeg read now spots truncated files
- im_invertlut() now makes an image, not a mask ... sorry :-(
- im_histnD() makes an n-dimensional histogram from an n-band image
- im_col_pythagoras() patch
- IM_NUMBER() now returns int not size_t
- new win32 build system from Juan and friends, based on tmake
- sample project files for MSVC added, thanks Juan
- win32/ subdir now has the win32 build systems
- spec/ subdir now has the spec files for building RPMs
- dist now includes formatted documentation
- license change: VIPS is now LGPL, nip stays GPL ... this means proprietary
  programs can link against the vips library
- had a report of a working VIPS build on a 64 bit system (!)
- im_log_dmask() now includes all of the negative lobe, thanks matt
- vips-7.8 start script now auto-relocates
- im_spcor_raw(), im_fastcor_raw() now exported

29/4/03
- started 7.8.9
- changes to build to help MSVC
- oops, makedef.pl missed out function names with an initial cap, and
  error_exit()
- im_min() and im_max() gave random wrong results for >1 thread on >1 CPU
  machines (bug introduced in 7.7.20), thanks Joe
- vips.c no longer generates C++ wrappers for functions with no image argument
  (thanks Haida)
- im_invertlut() now wrapped by hand in VMask.cc
- C++ docs updated
- added im_open_header(), returns an IMAGE with just width/height/etc and no
  data
- ... so now "header" will print useful stuff even on truncated files
- tiff writer knows about alpha (thanks Jenny)

7/2/03
- started 7.8.8
- build failed with lcms turned off
- im_spcor() could segv for 16bit images (thanks Joe)
- im_tiff2vips() read resolution expressed as pixels/cm incorrectly
- im_vips2tiff() tries not to write mad resolutions
- header and im_open file type tests reordered for slight speedup
- im_copy_set() had a broken dispatch function for xres/yres
- im_fwfft() exploits libfftw real -> complex transform if possible for a 2x
  speed-up (thanks Matt)
- im_invfftr() added for complex -> real inverse transform for 2x speed-up
  (thanks Matt)
- im_freqflt() now uses im_invfftr() for real result and speedup
- im_flipver() could segv on some inputs, thanks Clare
- relational operators now work on complex
- relational rewritten ... now fractionally slower, but 1/3 the size
- vips2dj -1:1 produced incorrect height
- better overlap-too-small detection in mosaicing code
- im_system() can have NULL output
- global balance ignores overlaps with only transparent pixels

3/1/03
- started 7.8.7
- worked in patch from Hans Breuer (thanks!)
	- png read/write with im_png2vips(), im_png2vips_header(),
	  im_vips2png(), im_ispng()
	- im_errorstring() and im_col_displays() are now functions not externs
	  (helps DLLs)
	- many include fixes to help native win32 build
- added libMagick support, 78 file formats now loadable with
  im_magick2vips(), im_magick2vips_header() and im_ismagick(), w00t
- now installs vips.m4 to $prefix/share/aclocal
- added im_icc_export_depth() ... export to device space with a specified bit
  depth (8 or 16)
- vips.def now rebuilt with custom rule in libsrc/Makefile.am
- removed externs im_Type, im_BandFmt, im_Coding, im_Compression to simplify
  DLL build
- im_mmap() -> im__mmap(), since it's supposed to be an internal function
- new vips-7.8.x/proj directory holds unsupported sample makefiles and
  config.h for building with the MSC toolchain
- new scripts batch_image_convert and batch_rubber_sheet (thanks Joe)
- added the RPM .spec files to the main distribution
- InitializeMagic() now passed "" rather than NULL to avoid assert() problems
  on some libMagic versions

2/12/02
- started 7.8.6
- now reads 8-bit RGBA tiff
- C++ build guide fixes (thanks fsicre)
- im_Type2char array text slightly messed up
- global_balance is safer for complex mixed mosaics
- removed im_lintra() fallback to im_copy() for scale == 1, offset == 0 ...
  too confusing
- im_tiff2vips() now reads 16-bit LAB
- added im_Lab2LabS() and im_LabS2Lab()

5/11/02
- started 7.8.5
- fix for mmap window of local region ... caused im_iterate() to break
  sometimes for large images, in turn occasionally breaking
  im_max()/im_min()/etc. (thanks Joe)
- tiny speed up for im_rot90()/270()
- on install on win32, add .exe suffix for links
- vips.c knows to remove .exe suffix for linked commands
- added im_errormsg_system() ... decode win32 error codes too
- pagesize calcs for roving mmap windows were messed up on win32 (thanks Kirk)
- some TODO cleanups
- global balance broke horribly if you had filenames with spaces in (thanks
  Clare)

31/10/02
- started 7.8.4
- im_unmapfile() includes mixed up on mac os x
- libtool patched for mac os x
- vips.c sets numeric locale to "C"

27/10/02
- started 7.8.3
- configure fixes help mac os x
- im_guess_prefix() adds ".exe" suffix on w32 if not there
- changed im_measure() error messages to number bands from 1
- added func descriptor for im_read_dmask() to help nip, updated C++ API, docs

21/10/02 JC
- started 7.8.2
- tries rand() if random() is not available
- tries mktemp() if mkstemp() is not available
- turns off realpath() if not available
- added IM_DIR_SEP/IM_DIR_SEP_STR directory separator character/string
- added IM_PATH_SEP/IM_PATH_SEP_STR path separator character/string
- added im_path_is_absolute()
- vips.c knows to link to vips.exe on win32
- spot mingw* and set BINARY_OPEN
- open images in binary too (since we now read() the header)

10/10/02 JC
- im_lintra() and im_lintra_vec() were broken for complex images :-( thanks
  matt
- renamed im_and() as im_andimage(), im_eor() as im_eorimage() and im_or() as
  im_orimage() ... avoids breakage in the C++ layer
- added im_dE00_fromLab()
- limited release as vips-7.8.0

2/10/02
- renamed as vips-7.8, woohoo
- revised documentation

19/9/02 JC
- started sorting out VIPS #defines ... there are now a sensible set of new
  names (eg. NOCODING becomes IM_CODING_NONE, LAB becomes IM_TYPE_LAB)
- define IM_NO_VIPS7_COMPAT to turn off the old names
- added im_mmap()/im_munmap() layer for windows portability
- removed the contents of history.h .. obsolete
- added IM_IMAGE_ADDR() macro

10/9/02 JC
- handle errors from TIFF lib correctly
- configure fixes for cygwin
- CMYK TIFF write fixed
- configure fixes for mingw

5/9/02 JC
- im_cp_desc() now copies Xoffset/Yoffset

21/8/02 JC
- started 7.7.24
- reads CMYK TIFF
- reads dpi from TIFFs
- better float Xres/Yres

14/8/02 JC
- new header fields Xoffset and Yoffset ... used by functions to hint
  the position of the origin in output images
- support added to c++ api and to header
- im__lrmerge(), im__tbmerge(), im__affine(), im_insert(),
  set Xoffset/Yoffset
- now uses <lcms.h>, not <lcms/lcms.h> for better suse w0rkage
- better configure for fftw (uses libdfftw name if libfftw not found)

8/8/02 JC
- large file support with mmap() windows ... had to change
  im_prepare_inplace() to im_prepare_to()

  benchmark:

  - system

	hardware: 2 x 2.5GHz P4, 1GB RAM, 15k SCSI, ReiserFS
	os: suse 8 (kernel 2.4.18)
	compiler: gcc 2.95.3, -O2, threads turned on
	images: fred.v, fred2.v; both 4k by 4k LABPACK (64MB)
	images: jim.v, jim2.v; both 15k by 15k LABPACK (900MB)
	time: smallest real of 5 runs, system idle
	vips: 7.7.23, debug on in im_openin.c, window limit set with an
	  environment variable

  - benchmarks

	cpu-bound: im_sharpen fred.v fred3.v 11 1.5 20 50 1 2
	io-bound: im_insert fred.v fred2.v fred3.v 4000 0
	worst-case: im_rot90 fred.v fred3.v

  - results

	desktop:

			no mmap windows		mmap windows

	cpu-bound	real    0m3.712s	real    0m3.970s
			user    0m6.010s	user    0m6.390s
			sys     0m0.900s 	sys     0m1.110s

	io-bound	real    0m1.813s	real    0m1.865s
			user    0m0.900s	user    0m0.990s
			sys     0m1.720s 	sys     0m1.520s

	worst-case	real    0m1.344s	real    0m3.039s
			user    0m1.270s	user    0m2.230s
			sys     0m0.850s	sys     0m3.050s

  not quite sure why sharpen is a little slower (4%?) ... IO speed is about
  the same though ... worst-case is having to constantly move windows about
  (500,000 page faults, vs 10,000 for no windows)

  again, with an image larger than RAM

  			no mmap windows		mmap windows

	io-bound 	real    2m52.759s	real    2m11.172s
			user    0m14.940s	user    0m14.890s
			sys     0m29.940s	sys     0m26.560s

	worst-case	real    3m35.391s	real    3m50.760s
			user    0m19.850s	user    0m26.600s
			sys     0m12.650s 	sys     0m43.130s

  mmap windows actually slightly faster in this case ... plus they stress the
  OS less

31/7/02 JC
- added -lm for better lcms detect
- README notes for fftw on suse8
- im_profile() sets HISTOGRAM for output image
- im_copy()/im_copy_set() function descriptor no longer sets PTOP ... helps
  avoid LUT problems
- im_subsample()/im_zoom() fall back to im_copy() for shrink/grow == 1
- im_lintra() falls back to im_copy() for scale == 1, offset == 0
- no longer use Type == LUT ... all just Type == HISTOGRAM now
- im_blend() was messed up for > 1 band images :(

16/7/02 JC
- started 7.7.23
- im_XYZ2sRGB() wasn't setting Type = sRGB
- im_icc_import() was broken for rgb
- im_header_string() had wrong return type in function database

13/7/02 JC
- added im_flood_blob()
- added im_open_local_array() ... C API convenience function
- oop, im_flood() was missing a man page
- Type == FOURIER added to help visualisation
- released as 7.7.22

30/6/02 JC
- JPEG, TIFF and PPM import all now set sRGB Type for RGB import
- im_header_int(), im_header_double() and im_header_string() added to aid
  UIs
- now uses gettimeofday(), not time()
- for consistency with other trig functions, im_c2amph() now returns degrees
  not radians (ouch)
- added im_c2rect() ... turn (amp, phase) to rectangular
- added im_sign() ... unit vector in direction of value
- better im_scaleps() ... old code was terrible
- rewritten im_rotquad() ... now partial
- im_icc_export()/_import() now do ABSOLUTE correctly
- added im_icc_ac2rc() ... converts absolute to relative colorimetry

25/6/02 JC
- added im_copy_set(3) ... like im_copy(), but set informational header fields

20/6/02 JC
- added im_ceil(), im_floor()
- im_Lab2LabQ was not clipping a/b range correctly
- im_icc_export(), own ABSOLUTE mode
- released as 7.7.21

28/5/02 JC
- im_remainderconst_vec broken for float/double
- added Yxy colourspace

16/05/02 JC
- auug, libtool was all messed up ... redone all the autotools stuff
- uses libtool convenience libraries to build vips in sections
- uses config subdir for temp files and .m4 things
- patched stupid suse config.guess
- vips2dj patched for better raw cmyk
- released as 7.7.20

12/5/02 JC
- im_vips2jpeg*() and im_vips2ppm() now both partial
- started updating the C++ guide
- had to change the location of the C++ headers :-( all C++ progs should now
  have:

	#include <vips/vipscpp.h>

  this is so things can work on systems which do not have case sensitive
  file systems

- changes for Mac OS X
  * im_system() TRUE/FALSE removed
  * searches /*/[lib|include] to get fink libs for tiff and jpeg

30/4/02 JC
- several functions were missing IM_FN_PIO in their descriptor ... this was
  harmless for nip/ip/C, but broke the ref counting in the C++ layer
- im_system() now defaults "/tmp" for temp files
- STRING input and output args were broken for C++ :-(
- threads exit more quickly on error
- im_min()/im_max() now partial (at last)
- im_remainderconst()/im_remainderconst_vec() added
- --with-dmalloc configure switch
- vips2dj does CMYK and mono too
- im_vips2tiff() allows any number of bands (but not the right way to
  write CMYK, see TODO)

26/4/02 JC
- old ICC profile reader removed
- little cms wrapped ... configure spots it, im_icc_transform() uses it to map
  between two images
- also im_icc_import() and im_icc_export() so you can see PCS images
- im_icc_present() to test for existence of lib
- README fixes

4/4/02 JC
- TODO changes
- oops, DEBUG left on in im_invertlut()

2/4/02 JC
- im_fwfft.c/im_invfft.c now use libfftw if available ... about 5x speed up
  and double precision
- added FIND_FFTW autoconf macro
- include/vips/proto.h changes

26/3/02 JC
- started 7.7.19

25/3/02 JC
- im_log_dmask() was broken (thanks matt)
- casts between VDMask and VIMask were broken (thanks matt)
- various error msgs improvements and tiny man page fixes

13/3/02 JC
- tb/lr merge first/last cache moved to per-call state for better sharing
- im_remosaic() bails out faster on error and makes better error messages

13/3/02 ruven
- im_vips2tiff() pyramids stop at tilesize, not 64x64

25/02/02 JC
- im_remosaic() is smarter, and works better with im_global_balance()
- im_affine() 2x faster

14/2/02 JC
- started 7.7.18
- vips.m4 and libsrc/Makefile.am fixes for IRIX

11/02/02 JC
- vips/thread.h and vips/threadgroup.h were missing extern "C" for C++
- VImage::write() now tracks dependencies, so you can write() to a partial
  safely ... although it's not a very useful thing to do (thanks Mike)
- new VImage::print() function for debugging
- added im_print()

22/01/02 JC
- started 7.7.17

15/01/02 JC
- im_rect_unionrect() and im_rect_intersectrect() safer for repeated args
- im_video_v4l() no longer perror()s on ioctl fail for less spam

03/01/02 JC
- started 7.7.16
- im_version_string() really does return the date as well now

12/12/01 JC
- im_guess_prefix() extra smartness for relative path names
- VImage() no longer uses tmpnam() (thanks Paul)

11/12/01 JC
- renamed im_fexists() as im_existsf()

7/12/01 JC
- ppm man pages added (doh)

28/11/01 JC
- warnings on g++ 2.96 fixed

22/11/01 JC
- started 7.7.15
- im_video_v4l() failed to compile on non-linux platforms

7/11/01 JC
- im_remosaic() added
- im_*merge() are more intelligent about transparency in bizarre overlaps
- grr! putenv() semantics change on more recent clibs ... should be safer
  now

19/10/01 JC
- VDisplay( "display name" ) segved on unknown display :-( thanks mike

26/9/01 JC
- contrib tools get data files from share/vips/xxx area now
- im_vipshome() renamed as im_guess_prefix(), reworked for new package layout
- doc/ build sorted out
- ... but of course, docs still need updating for 7.8

20/9/01 JC
- fix to im_vipshome()
- ip2 renamed as nip
- split to library only ... separate ip and nip packages
- new VIPS_VERSION_* macros set from configure.in in vips/version.h.in
- vips.m4 VIPS finder
- reworked README, doc/README and TODO
- now installs to /usr/local/ by default
- fmask4th.c was including varargs.h ... d'oh
- include area reorganised: everything inside <vips/..> now ... hopefully the
  only user-visible change is that all plain C progs need to change:

	#include <vips.h>

  to:

	#include <vips/vips.h>

  the C++ API should be unaltered

21/8/01 ruven
- im_setupout() was missing some #includes

20/8/01 JC
- started 7.7.14

15/8/01 JC
- added libxml dependency for ip2

27/7/01 JC
- im_conv(), im_convf(), im_convsep(), im_convsepf() now reject masks with
  scale == 0

26/7/01 JC
- started 7.7.12

25/7/01 JC
- started 7.7.11
- oop, im_histeq() and im_tonemap() also missed
- better error messages from im_run_command()

23/7/01 JC
- started 7.7.10
- im_sharpen() failed due to change in im_band_extract() offset

20/7/01 JC
- started 7.7.9

4/7/01 JC
- im_open(,"w") open() delayed until im_setupout(), very slightly safer
- updated im_open() man page
- im_tiff2vips() now embeds index in filename ... and it's page number (from
  0), not subsample factor
- finally bit the bullet ... im_extract()/im_extract_band() now number from
  zero (sorry!)
- and im_lrmosaic()/im_tbmosaic() bandno param too

29/6/01 JC
- im_region_free() now frees immediately

27/6/01 JC
- im_vips2tiff() man page updated for deflate, 2 years late

22/6/01 JC
- oops, limit wrong on im_rank()

21/6/01 JC
- better post_install for --prefix outside VIPS's tree
- -ltiff needs -lm in acinclude.m4 ... fixes configure on redhat 7.x

13/6/01 JC
- started 7.7.8

6/6/01 JC
- im_invertlut() added

31/5/01 JC
- im_colour_temperature, im_XYZ2Lab_temp, im_Lab2XYZ_temp added
- ... colour temp stuff needs sorting out properly

25/5/01 JC
- added vips-config script, cf. gtk-config
- --without-threads option added
- did a bit of work on the C++ API docs

24/5/01 JC
- added im_tiff2vips_header(), im_jpeg2vips_header() and im_ppm2vips_header()
- header uses these to print fields quickly
- switched to config.h
- configure.in rewritten ... much nicer, fewer options, more automatic

17/5/01 JC
- im_matinv() didn't free stuff correctly on singular matrix

16/5/01 JC
- vips2dj now knows about 5000ps printers
- allow RW mode for non-native VIPS image files, for 8 bit images

2/5/01 JC
- started 7.7.7

1/5/01 JC
- im_addgnoise() did not work for >1 band images

23/4/01 JC
- configure options to remove support for JPEG and TIFF ... helpful for a no-
  dependencies build

20/4/01 JC
- im_(v)snprintf() added
- all sprintf()s removed

15/4/01 JC
- im_affine() had a rounding problem

11/4/01 JC
- tiny mosaicing bug fixed in im__lrcalcon
- started 7.7.6

21/3/01 JC
- new iblend code in im_tbmerge() was typo-d
- mosaic1 was broken by affine too

20/3/01 JC
- im_image() failed for FMTUCHAR

12/3/01 JC
- started 7.7.5
- im_sharpen() uses separable convolution for big speed up
- new "Print" menu

11/3/01 JC
- REALVEC renamed as DOUBLEVEC
- added IMAGEVEC
- added IM_INPUT_IMAGEVEC
- gbandjoin now has function description
- new function im_maxvalue()
- im_compass()/im_lindetect() reimplemented with im_conv()/im_maxvalue(),
  about 15% faster, works for any type, partial
- im_gradient() reimplemented with im_conv()/im_abs()/im_add(), about 30%
  slower, works for any type, partial

10/3/01 JC
- new function, im_clip2fmt() converts between any image formats ...
  slightly faster than the old im_clip()
- legacy im_clip2us() etc. functions now just call this

9/3/01 JC
- im_conv() rewritten, simpler, about 10% faster
- im_convsep() rewritten, now does any non-complex type, partial, 20% faster
- new functions: im_convf(), im_convsepf() for DOUBLEMASK
- raw versions of each
- legacy convolvers (eg. im_convbi()) removed

8/3/01 JC
- new function im_blend()
- new function im_lab_morph()
- speed up to im_ifthenelse()
- speed up to im_*merge() (uses integer arithmetic for integer blends)

4/3/01 JC
- tiny speed ups to im_histgr()
- speed ups to im_maplut()

3/3/01 JC
- new functions: im_histnorm(), im_histcum()
- im_histeq() more general
- im_vipshome() --- better behaviour for relative paths

2/3/01 JC
- new video package
- im_video_v4l1() (video for linux) added
- configure.in switches to turn v4l1 on and off

1/3/01 JC
- new im_histspec() implementation ... more general, bugs removed

14/2/01 JC
- better vips2dj usage message

13/2/01 JC
- im_image_sanity() added, called in various places in iofuncs

9/2/01 JC
- added 'check' and 'name' class member stuff to ip from ip_gtk2
- new "Plot" menu
- new "Overlay" menu
- more stuff in _stdenv/_list ... curried forms of head/tail etc.

7/2/01 JC
- started 7.7.4
- vips2dj and vdump now use im_vipshome()

5/2/01 JC
- new im_vipshome() function
- min()/max() macros renamed as MIN()/MAX()
- new im_load_plugins() function
- vips.exe and ip now load $VIPSHOME/lib plugins at startup

2/2/01 JC
- mosaicing functions now have an extra max blend width parameter

30/1/01 JC
- fixed tbmerge no overlap detect

13/12/00 JC
- started 7.7.3

30/12/00 JC
- vips.h fixes for cygwin/wingdi conflict

27/11/00 JC
- added im_vips2ppm(), im_open() imports and exports it
- fixed nasty implicit output conversion problem for PIO dispatch() calls

21/11/00 JC
- added im_ppm2vips()

16/11/00 JC
- configure.in fixes ... jpeg found correctly now
- searches for libz as well

16/11/00 JC
- started 7.7.2

5/11/00 JC
- speed up to lab2labq

19/10/00 JC
- started 7.7.1

13/1/00 JC
- oops, im_open() was missing an 'else' in jpeg/tiff load

5/8/00 JC
- im_vips2tiff() now has mode string embedded in output filename
- im_vips2jpeg() now has qfac in output filename
- im_open() understands this

11/7/00 JC
- new im_image() function ... wraps a VIPS image around a memory buffer
- C++ layer changes:
	* now use #include <vips/Vips.h>
	* error renamed as VError
	* new VMask() constructors
	* new VImage() constructor
	* new VImage::data() access member
	* more operator equivalences: <, >, <=, >=, ==, !=, &, |, ^, %

17/6/00 JC
- more consts added to vips protos

10/5/00 JC
- minor configure.in changes to help solaris
- removed _TIFFmalloc() and _TIFFfree() calls

9/3/00 JC
- fixed rounding problem in generate grid

8/3/00 JC
- fixup to im_system() temp dir

7/3/00 JC
- added im_system()
- small tidies

1/3/00 JC
- better plugin test in configure.in

26/2/00 JC
- fixes to Makefile.am in ip/src* and configure.in, to help ip find the right
  gtk includes on systems with more than one gtk-xxx installed

21/2/00 JC
- now builds ip and ip_gtk2

16/2/00 JC
- configure.in fixes for xil and some TIFF/JPEG strangeness

15/2/00 JC
- im_global_balancef() was broken! d'oh
- note in README about enabling video cards

10/2/00 JC
- configure now searches for xil ... FIND_XIL macro
- im_zoom() spots integer overflow
- better shape set on region drag end in ip
- better zoom-too-far handling in ip

13/1/00 JC
- fixes to configure etc. to help cygwin
- jpeg is now searched for too ... FIND_JPEG macro

10/1/00 JC
- global_balance() now uses new affine() atuff

27/12/99 JC
- mosaic1 stuff now uses new affine() funcs

21/12/99 JC
- added Joe's docs
- im_LabS2LabQ() rounding on a/b slightly broken for a/b == 0

20/12/99 JC
- new function: im_affine()
- similarity*() now in terms of affine()
- tests for error return in reduce.c from maplut
- small clean-ups

15/12/99
- im_version() added, new iofuncs package for it
- ip did not call zero-input-arg vips functions
- vips.c did not like zero-input-arg functions

6/12/99 JC
- Sobel filter was a bit broken

3/12/99 JC
- menu reorganisation
- generate gauss mask dialog

2/12/99 JC
- reworked text file IO, better error messages

1/12/99 JC
- reworked .iprc filename stuff, cleaner

30/11/99 JC
- better menu set switcher in calc preferences
- ip now thinks it's 7.7
- did a spellcheck on the ip guide

29/11/99 JC
- 7.7 started!
- srgb D65->D50 converter
- Negate added to arith
- find similar pixel value dialog
- find similar colour dialog
- paste into background dialog

19/11/99 JC
- adjust labq was missing
- shrink image defaulted to /2 not /1
- sharpdropshadow broken
- Rotate.* broken
- vips-7.6.3 release

18/11/99 JC
- ip didn't report space free on >2GB filesystems correctly
- ip did not link statically against libXpm on solaris7

17/11/99 JC
- im_histplot() failed for all 0's histogram
- new profile_image dialog
- man pages for im_sRGB2XYZ/im_XYZ2sRGB were broken
- new colourize image dialog
- new shrink image image dialog
- new expand image image dialog
- better doc Makefiles

16/11/99 JC
- more menu reorganising
- new image_to_mask/mask_to_image buttons
- new match_two_images dialog
- new measure_colour_chart dialog

15/11/99 JC
- new custom LABQ sharpen in Image menu
- configure support for SGI video (thanks Ruven)
- menu fiddling in ip
- new "resize canvas" menu item
- im_insert_noexpand() added, no docs tho'

11/11/99 JC
- new ip menu item: Image=>Adjust white/black/saturation of LabQ
- fixed bug in decompose complex number
- browse-icons now ignores errors
- better error msg for "12 12" etc cases

10/11/99 JC
- open hi-res gives proper error msg if no file found
- made file-select boxes a bit more compact and clearer
- updated configure.in for vips-examples-7.6

9/11/99 JC
- new column start point moved
- vdump now defaults to subsample 1, portrait
- navigation boxes were broken
- no longer shrink-to-fit if loading as high res
- better positioning of zoom windows
- removed some old cruft

8/11/99 JC
- ooops, im_remainder() got lost somehow
- refguide converted to latex and updated
- cppguide updated

5/11/99 JC
- libguide converted to latex and updated

4/11/99 JC
- ip guide now latex2htmls cleanly ... still needs updating tho'
- cpp/app guide latex2html redone

2/11/99 JC
- configure no longer adds -32 to IRIX builds for you
- some more stuff in README
- simple DEBUGM malloc tracking, made libsrc/iofuncs/memory.c
- changed im_malloc() to return void *
- removed duplicate im_malloc() proto from util.h
- changed all malloc/free to go through im_malloc()/im_free()

23/10/99 JC
- double-click on error image now pops a load browser and an error dialog
- add-new-column no longer scrolls to right edge of workspace
- better scroll-to-bottom on item add
- load ws twice does not cause 'already open' errors
- memorise directory button in fsb

18/10/99 JC
- new FIND_TIFF/FIND_MOTIF macros for acinclude.m4
- new ./configure switches, see ./configure --help
- enabled static libs

8/10/99
- broke action_proc_bop() into smaller functions, stops bad code gen on
  gcc2.95.1 (and others, prolly)
- restored old Makefiles in doc/src/ipguide
- vips7.6 script renamed as vips-7.6

5/10/99
- replace image was broken
- some menu reorganisation
- 'reload all menus' button

4/10/99
- computed regions in ip were broken
- updated system.iprc defaults
- new menu item: adjust white/black points

2/10/99
- browse icons was broken
- greyscale 16-bit tiled tiff was broken
- extra mutex locks for TIFF*() in im_tiff2vips()

1/10/99
- some automake probs fixed
- squished two ip bugs

30/9/99
- fixed problem with pthreads, now works on suse6.2 as well
- new API stuff for threaded evaluation with im_threadgroup_t
- new public interface provide platform independent threads/locks/semaphores
- no error box if you zoom out too far now

26/9/99
- lr/tb merge blend was not quite right ... should be smoother now
- histplot broken for float images

24/9/99
- better mono->labq converter
- more portable ispoweroftwo detect for freq filter stuff

23/9/99
- better graphics expose handling

17/9/99
- >/< stuff in ip was a bit mixed up
- ink preview fixed for mono images
- help popup fixed

15/9/99
- linedetect and sobel filters for ip, thnx Kirk

14/9/99
- Find_histogram was broken
- im_profile() man pages was broken
- ooops, ip had old set of macros

10/9/99
- im_and/im_or/im_eor now work for any integer type

Summer hols: (2nd half August '99)
- initial heap block larger to avoid start gcs
- def slicer fixed
- larger max heap
- toolkits with initial '_' hidden by default
- custom recomb
- dialog.def removed
- ... other menu fixes
- generate grid menu
- im_remainder() added
- new cursor change code, hglass rotates during comp!
- dialog.c handles cursor changes better
- rubber band in paintbox displays
- mag widget stays on right!
- undo/redo single pixel paint ops
- heap size control from prefs
- cancel for reductions as well as for image calc
- browse stuff reworked, no more .icon.v files
- save stops you overwriting open .v files
- better animate_countdown() handling
- better resize behaviour for bars added to images
- better code generation, bug fixed in state tracking
- auto recover from crash
PK�j%[>X"V�g�gdoc/alt-vips/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!
PK�j%[�x&��$locale/en_GB/LC_MESSAGES/vips8.16.monu�[������xy"�����0L)a$�%���##<`
t������*%@&f��

	Destination color spaceNeither global nor local color mapSource color spacebad colormapcalculate color differencechange color codingcolor operationscolor space transformationsconvert to a new colorspacefalse-color an imagemeasure a set of patches on a color chartunimplemented input color space 0x%xunimplemented output color space 0x%xunsupported color typeunsupported colorspace %dProject-Id-Version: vips 8.5
Report-Msgid-Bugs-To: 
POT-Creation-Date: 2017-02-22 13:13+0000
PO-Revision-Date: 
Last-Translator: John Cupitt <jcupitt@gmail.com>
Language-Team: 
Language: en_GB
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Destination colour spaceNeither global nor local colour mapSource colour spacebad colourmapcalculate colour differencechange colour codingcolour operationscolour space transformationsconvert to a new colourspacefalse-colour an imagemeasure a set of patches on a colour chartunimplemented input colour space 0x%xunimplemented output colour space 0x%xunsupported colour typeunsupported colourspace %dPK�j%[���|�|�!locale/de/LC_MESSAGES/vips8.16.monu�[�����,<0X@"Y@|@�@�@
�@.�@'A4A'JA#rA,�A�A8�A�AB2BMBRBqB�B�B�B�B�B�BCCC%C0+C\CbCxC�C
�C%�C
�C�C�C�C#�CD$D*;DfD�D�D�D-�D'�DEE)E0EFEREeEE	�E�E�E�E	�E�E�E�E
�E-	F
7FBF(IFrF�F�F�F�F�F�F�F�F�FG$G*G>GMGTGfGiG�G�G�G�G�G"�G H>HSH`HoH�H
�H�H�H�H�H	�H�H�HI&I)I.I?IDI^I{I�I�I�I�I�I�IJJ*J-J2JCJ	]J gJ�J�J�J�J�J�J�JK3K"PK	sK}K	�K�K�K�K�K�K�K�K�K�KL!L6LLLfL%�L�L�L�L�L,�L&M'M"<M_M#tM!�M�M�M�M�M�MNN	+N5N
JNUNjN�N�N�N�N�N�N�N-�NO1OHOOOkO	tO#~O�O1�O�O"�O�O
P!P&P2P
HPSPhPlP�P�P�P�P�PM�PAQ[QxQ �Q
�Q�Q�Q�Q�Q
RRR'R,R.R6R5;RqR�R'�R*�R�R�R!S'S6STSoS�S!�S!�S�STT,T.TDTXT
aToT
|T	�T
�T�T�T�T/�T�TU!U
;U	IU
SUaU yU�U�U�U�U�U�UV%V-VCVPV-aV
�V�V�V �V�VW
'W5WDWQWfW	oWyW �W�W
�W"�W�W
X%X6XIXOXQX`X�X�X*�X�X
�X,Y'5Y+]Y�Y�Y�Y
�Y�YZ!Z6Z&KZrZ�Z�Z�Z
�Z �Z�Z[!*[L[a[y[�[�[�[�[!�[\	\)$\N\^\(p\�\�\�\�\ �\
]$] 3]T](q]�]�]�]�]^^&^#D^!h^�^"�^�^�^�^_$_;_Y_t_�_�_ �_�_�_
`"`=`J`V`i`|`�`-�`
�`)�`%a,a Lama�a$�a�a�a�ab6b&Kbrb�b�b�b%�b�b!�b!c#?cccc6�c+�c5�c)d?dUdod#�d�d�d�d"�d"e6eIe]ene�e�e!�e-�e%f ,f)MfEwf�f#�f�f�fgg g2gMg!mg�g�g�g�g�ga�g\Rh�h�h�h�hii0i@iWimi>�i$�i�i �i5j$Qjvj�j�j!�j�j�j�j	kk7k	PkZkpk�k�k�k�k�k�k�kl!!lJCl#�l�l�l�l�l�lm*,m%Wm}m5�m�mC�m!n5nOnQnen
xn�n�n�n
�n�n�n	ooM5o�o�o�o�o�o�opp*8p
cpnp
�p�p�p�p�p�pq& qGqaqvq1�q+�q�qrr,rFrdr#�r'�r#�r$�r3sMscs's'�s"�s=�s"0tStftut	�tQ�t
�t�t
�tuu8u#Ku(ou�u �u.�u9�u;8v.tv"�v�v�v�vw+w/;wkw-�w�w
�w�wxx/xIxaxyx�x�x�x�x�x	yyy#-yQy`y.{y�y�y&�yzz'1z Yzzz!�z�z!�z�z{"{>{&T{{{�{�{ �{�{�{|$4|"Y|#||2�|�| �| })}?}^}p}�}�}�}�}�}�}�}
~&~>~X~k~�~�~�~�~�~ 0Qf#u�����#�$>�$c�����/À� �/(�X�w�������ʁ*݁��0�E�]�w� ������܂��$�9�L�%d�!����
��̃����.�D�[�j�~�%����5ф��5�N�e�����"��"ԅ(�� �:�0O�*��*��ֆ݆��!�8�Q�i�#x�������Ӈ���
.�&<�:c�����"ƈ�����	��+�:�<�O�k����$.�(S�|�%����4ˋ%�&�%>�)d�.����>�����2�N�"S�v�����Í(Ս2��*1�\�b�h�
y�C��Ȏώ���'�E�Q�V�m�,u�����7���#�&C�>j�7�����	��
+�9�N�m�	����
����ȑ1ё�
��2"�
U�`�El���ْ̒	���0�	I�+S�-�����ɓ��&���  �A�G�!g�!��!��(͔0��'�A�
N�\�u���������͕����>�M�P�W�j�'p�&��&������,�L�l� n�������%��ї@�"�(�?�^�z� �� ��%Ř(�$�
9�G�X�d�l�����������!��ۙ���!:�\�*z�!��ǚКҚ=ۚ6�P�#g�!����˛����!� 6�W�`�t�|�������˜��� �0�
F�0T�����	��$ȝ	���5�6�8B�{�"~�(��	ʞԞ۞���+�'0�&X�&�
����ȟ`�I�i���&��Р٠ ��%�B�a�c�k�p�r�z�6���͡1ϡ0�2�A�*]���'��$Ȣ!��(+�*T�.���̣�!�
�'�9�P�f�x�������Τ@�"�@�![�}�������'ڥ��3�G�*X�������Ȧ���7�J�/`�/��0���	�!�4�F�W�r�����>��+��<"�_�u�+~���ũʩ̩#�,�8�/O�%���J��5
�J@�+��.��1��+�I�`�}�0��̬$��!!�C�#U�1y�%��4ѭ"�')�&Q�x���
�� ®8��3�9<�v���+��ǯ2��%+�)Q�{���1��0Ͱ5��4�"R�)u� ����ѱ&�.�2F�!y�&��$²(��(�$?�&d�����ɳ�$�+�F�b�#w�
������̴��5�O�4a�B��&ٵ"�#�C�.a���#��Ѷ�6��9.�h���'��ɷ7�
�&%�%L�r�����Iø@
�WN�����׹�R
�1`���#��%Ѻ���"�8�G�`�{�4��Dͻ+�*>�/i�N��$�2
�@�C�G�K�c�~�%��$��!��6�E�[�ln�e۾A�Q�j�!�����տ�	�(�RF�@���&��;�@Z�
������'����&�F�Z�v�
�������������'�<�W�h�(��W��-�4� G�h�y�����4��1��,�-C�q�M����!����-�C�S�g�|�����)�����X0��� ����$��"��
!�/�E�.d�
��&����2���:�*B�m���+��#����!�?0�4p�����!����#�%3�)Y�5��4��.��9�W�!c�)��)��$��L��$K�p�����
��W����
#�.�"H�k�(��+������/
�<=�;z�(��$���� 2�'S�{�:��&��9��%'�M� f�����!������ �<�X�%t�������
����,�1�"F�>i�#��#��<��#-�#Q�=u�'����&�� �(:�#c�������.���!)�!K�!m���$����2��)�1D�Av���,��#��"�";�^�r�����������(��%�$2� W�"x�$��(��!��*�'6�'^�/��(��.��%�4�/L�"|�#��"��.��.�2D�2w�6��)��0�@<�"}�2��>��2�!E�'g� ���� ��=�� )�J�$e�(��,����(���+4�,`�"��*������*�%A�g�����"��"�����'�A�V�p�#����<�� �)� G�"h�#���� ��*��*�0C�t�!��8��2��2"�U�!]��$��������/�
>�L�Y�s�1��������8��A'�i���*������������3�5�H�f�l�]%�hHn�1�7/��	$ic
����������F�a@��D��a�����}�_��8��}��C��0�����3'�
��cBJ���6�y ��s]&�dyTb�8��{`�g�av���ttS2��'�Y�D����k5r�3w2xn����Nex�?k���@�:h�kf�pqLm���C+�.G��Q�bhA#*���%��Y�jB����z9�|������M�����+�g�l�=E���u����M�z����X|)pEH[����x��������!U��*=!/�:�~^��m]��b�e)���ZK>�
�V4���>���������,�����
9�oT���[9���0����?�-�$Vw��df-;��!��Q�q<��������0��(��?��
|��/w�����J��tZl"H�p%�`���~��W�����8B�#�D\����������jO23W5���Y_�.i�d1���L����O,"�(������)<�'CI(.�	W:
,���1���������R�7yI�s��n�Z��R&����7��V<�} ���@_�U����\�����u�g*�	��PR{O�M�SE�o^�� ��{�;Q��qF�+�������X��j4���v��P�A�&���uc^���so��eJ"����6��>N#T�G����=��`r��4�X�5F���L�������z;����NrS��6����\�f�~v�K�AU������i��K�G[�P�$-mI� %s, %d band, %s %s, %d bands, %s bins out of range [1,%d]"%s" is not a VIPS image"%s" is not a known file format"%s" too long%d bits per sample palette image not supported%d overflows and %d underflows detected%d overflows detected%d underflows and %d overflows detected%d-dimensional images not supported%dx%d %s, %d band, %s%dx%d %s, %d bands, %s%s%s %s: %d threads, %d x %d tiles, groups of %d scanlines%s %s: %d%% complete%s %s: done in %ds          
%s is longer than expected%s: '%s' is not a positive integer- print image header- thumbnail generator1 to 5 bands only10^pel of image3 or 4 bands RGB TIFF only3-band uncoded float only4 or 5 bands CMYK TIFF onlyASCIIAcrossAdd thisAlignAlign on the low, centre or high coordinate edgeAngleAngle to rotate imageArray of constantsArray of input imagesAssociatedB-Splines with antialiasing smoothingBackgroundBandBand to extractBandsBicubic interpolation (Catmull-Rom)BigtiffBilinear interpolationBlend smoothly between then and else partsBlock evaluation on this imageBufferBuffer to load fromBuffer to save toCMYK input profile needs a 4 band input imageCMYK profile needs a 4 band input imageClass descriptionClass nicknameCodingColour for new pixelsCompressionCompression factorCompression for this fileCompression predictionConditionCondition input imageDemand styleDescriptionDirectionDirection to flip imageDiscDownEXR error: %sEdge sharpening resampler with halo reductionElse imageExpandExpand output to hold all of both inputsExpected access patternExtendFORMATFailFail on first warningFile descriptorFile descriptor to write toFilenameFilename to load fromFilename to save toFirst input imageFlagsFlags for this fileForeign bufferFormatFormat to cast toGBH not in range [-30,+30]HeightHeight of extract areaHorizontal offset of originHorizontal position of maximumHorizontal position of minimumHorizontal resolution in pixels/mmHow to generate the extra pixelsICC profile to embedINTERPOLATORImage filenameImage height in pixelsImage to measureImage to saveImage width in pixelsInputInput imageInput image argumentInterlaceInterlace imageInterpretationJoin left-right or up-downKBKillLABQ coding onlyLeftLeft edge of extract areaLeft edge of input in outputLeft edge of sub in mainLeft-hand image argumentLevelLinesLoad this associated imageLoad this level from the fileLoad this page from the fileMM not in range [-30,+30]MBMainMain input imageMat_VarReadDataAll failedMax tilesMaximum number of tiles to cacheModeMultiply by thisNearest-neighbour interpolationNeed more than one imageNicknameNumber of bands in imageNumber of bands to extractNumber of patches across chartNumber of patches down chartOffset in bytes from start of fileOpen modeOpen to discOperationOutputOutput array of statisticsOutput imageOutput valuePLUGINPROFILEPagePh not in range [0.0,1.0]Pixel codingPixel format in imagePixel interpretationPixels between imagesPm not in range [0.0,1.0]Pointer to foreign pixelsPreferred demand style for this imagePs not in range [0.0,1.0]PyramidQQ factorRGB input profile needs a 3 band input imageRGB profile needs a 3 band input imageRadiance coding onlyRead this many lines from the fileReduced halo bicubicRepeat this many times horizontallyRepeat this many times verticallyResolution unitRightRight-hand image argumentRound operationS not in range [-30,+30]SIZESecond input imageSeparatorSeparator charactersSequentialSequential read onlySet of separator charactersSet of whitespace charactersShimShow VIPS optionsShrinkShrink factor on loadSize of headerSkipSkip this many lines at the start of the fileSource for FALSE pixelsSource for TRUE pixelsSquashSquash images down to 1 bitStrategySub-imageSub-image to insert into main imageSwapSwap bytes in image between little and big-endianTBTIFF file does not contain page %dTIFF write tile failedThen imageTileTile heightTile height in pixelsTile widthTile width in pixelsTopTop edge of extract areaTop edge of input in outputTop edge of sub in mainVIPS OptionsVIPS interpolatorsVIPS statistic operationsVIPS_FOREIGN_PARTIAL and VIPS_FOREIGN_SEQUENTIAL both set -- using SEQUENTIALVertical offset of originVertical position of maximumVertical position of minimumVertical resolution in pixels/mmWhitespaceWidthWidth of extract areaWrite a bigtiff imageWrite a pyramidal tiffWrite a tiled tiffXXoffsetXresYYoffsetYres[ACTION] [OPTIONS] [PARAMETERS] - VIPS driver program[x,y,z]^pel of imageaa boolean operation on a pair of imagesa relational operation on a pair of imagesabsolute valueabsolute value of an imageacos of image (result in degrees)add two imagesallocation failure in mergeupallow at most N open filesargument `%s' has no instancearithmetic operationsasin of image (result in degrees)atan of image (result in degrees)auto-rewind for %s failedaverage image bandsaverage value of imagebbad Lb, Lw parametersbad area parametersbad argsbad args (ac)bad args (f)bad argumentsbad bandsbad coding %sbad colormapbad dimensionsbad display typebad endian-ness %s, should be 'big' or 'little'bad extract areabad extract bandbad file name format '%s'bad file typebad floatbad format %sbad greyscale mask sizebad greyscale mask value, row %dbad grid geometrybad image descriptorbad image sizebad image typebad in_max, out_max parametersbad input matrixbad input matrix sizebad intbad interpretation %sbad lut_sizebad magic numberbad mask element (%d should be 0, 128 or 255)bad mode "%s"bad number of args in copy linebad number of args in join linebad number of args in join1 linebad number of axis %dbad page number %dbad parameterbad parametersbad positionbad shrink factor %dbad sizebad sizesband-wise averagebands in must equal matrix widthbandwise join a set of imagesbase classbinary >8 bit images must be floatbinary operationsblendboolean operations against a constantboolean to performbytesccache an imagecache at most N bytes in memorycache at most N operationscalculate (a * in + b)calculate a*in + b -> out, a and b vectorscalculate a*in + b = outfilecalloc failedcan only pyramid LABQ and non-complex imagescan't have 1-bit JPEG -- disabling JPEGcan't have strip pyramid -- enabling tilingcannot get video capabilitycannot open video device "%s"card cannot capture to memorycast an imagechannel not between 0 and %dcircularity detectedclass "%s" not foundcommand failed: "%s"compiled without im_video_v4l1 supportcomplex to performcompress should be in [0,9]conversion operationscoords outside imagecopy an imagecos of image (angles in degrees)could not get ext datacould not open image %scould not read VIPS header for %scould not seek on %scould not set extensioncould not write to %sdatatype %d not supporteddemand hint not setdest too smalldimension should be in (2,3)dimensions above 3 must be size 1dir not 0 or 1directiondisable vectorised versions of operationsdisplay unknowndivide two imagesdon't delete profile from exported imagedon't sharpen thumbnaildump operation cache on exite^pel of imageelement out of range [0,1]embed an image in a larger imageempty lineempty overlap!end of file while skipping startenum '%s' has no member '%s'error parsing number, line %d, column %derror reading XML: %serror reading from file "%s"error reading radiance headererror reading resolutionerror requestederror saving EXIFerror setting JPEG resolutionerror transforming from save formaterror transforming to save formaterror writing outputevaluate with N concurrent threadsexecute named vips operationexpect 1xN or Nx1 input maskexpected %s, saw %sexport with PROFILEextra tokens after ')'extract an area from an imageextract band from an imagefactor should be in [1,0)factors should both be >= 1failure opening slidefield "%s" is of type %s, not %sfield "%s" not foundfile "%s" not foundfile has been truncatedfile is less than 64 bytesfile loadersfile saversfind image averagefind image maximumfind image minimumflag not -1 or 1flag should be 0 (horizontal) or 1 (vertical)flip an imageform a complex image from two real imagesfound %d tie-points, need at least %dgenerate bodies for C++ bindinggenerate headers for C++ bindinggenerate links for vips/bingenerate() called twiceget a component from a complex imagegetting dimensions: %sheader file size incorrectheader size incorrecthelp!histograms must have not have more than 65536 elementshistograms must have width or height 1ifthenelse an imageim_invmat failedimage "%s" used twice as outputimage already writtenimage and band_fmt must match in signimage classimage coding must be NONE or LABQimage dimensions overflow intimage does not have that many bandsimage has shrunk to nothingimage must be %simage must be 8- or 16-bit integer, signed or unsignedimage must be 8- or 16-bit unsigned integerimage must be 8- or 16-bit unsigned integer, or floatimage must be compleximage must be integerimage must be non-compleximage must be uncodedimage must be unsigned int or floatimage must be unsigned integerimage must have %d bandsimage must have 1 or %d bandsimage must have one or three bandsimage must one bandimage not readableimage not writeableimage too narrowimage too small for maskimage too small for windowimages do not matchimages do not match in pixel sizeimages larger than N are decompressed to discimages must have the same band formatimages must have the same codingimages must have the same number of bandsimages must have the same number of bands, or one must be single-bandimages must match in sizeimport untagged images with PROFILEinin1in2inappropriate region typeincomplete headerincorrect namespace in XMLindex should be in range 0 - %dink image does not match in imageink image not 1x1 pixelsinputinput not 3-band uncoded charinputs incompatibleinsert an imageintent %d (%s) not supported by profile "%s"; falling back to default intent (usually PERCEPTUAL)intent %d (%s) not supported by profile; falling back to default intent (usually PERCEPTUAL)internal errorinternal error #9876345invalid argumentinvalid associated image nameinvalid markup in textinvalid slide levelinvert an imageioctl(0x%x) failed: %sjoin a pair of imageskilled for image "%s"layer buffer exhausted -- try making TIFF output tiles smallerlcms library not linked to this VIPSleak-check on exitlinear recombination with matrixlist classes|packages|all|package-name|operation-namelmcs library not linked to this VIPSln of imageload PLUGINload a FITS imageload a Radiance image from a fileload an Analyze6 imageload an OpenEXR imageload and save image filesload csv from fileload file with ImageMagickload file with OpenSlideload jpegload jpeg from bufferload jpeg from fileload mat from fileload png from fileload ppm from fileload raw data from a fileload tiff from fileload vips from filelog10 of imagemake a black imagemany image statistics in one passmap failed (%s), running very low on system resources, expect a crash soonmask image not 1 band 8 bit uncodedmask must be 1Dmask sizes power of 2 onlymask too complexmath to performmatrix of coefficientsmaximum value of imagemeasure a set of patches on a colour chartmeasure averages of a grid of patchesminimum value of imagemore than a 10 megabytes of XML? sufferin' succotash!more than one rootmosaic root not found in desc file
is this really a mosaiced image?multiply two imagesmwidth must be -1 or >= 0nno embedded profileno file descriptorno image datano input imagesno matching '>'no matrix variables in "%s"no overlapno package or function "%s"no pixel data on attached imageno points to averageno property named `%s'no resolution information for TIFF image "%s" -- defaulting to 1 pixel per mmno text to renderno vips argument named `%s'nonsense mask parametersnot , or ) after parameternot 1-band uchar imagenot a RAD imagenot a regular filenot one band or %d bandsnot whitespace before start of binary dataoperationsoperations on image bandsout of memoryout of memory --- size == %dMBout of range [0,255]outputoutput coordinates out of rangeoverlap too smalloverlap too small for searchoverlap too small for your search sizepangoft2 support disabledparameter %s not setparameters out of rangeparameters would result in zero size output imagepatch %d x %d, band %d: avg = %g, sdev = %gpel^[x,y,z] of imagepel^x of imageper-thread state for renderper-thread state for sinkper-thread state for sinkdiscper-thread state for sinkmemoryper-thread state for vipsthreadpoolperform a complex operation on an imageperform a math function on an imageperform a round function on an imagephase of cross power spectrum of two complex imagesphotographic negativepixelwise linear regressionposition and value of n maxima of imageposition and value of n minima of imageposition of maximum value of imageposition of maximum value of image, averaging in case of drawposition of minimum value of imagepossible actions:
pow( @in, @c )pow( left, right)predictorprint value of FIELD ("getext" reads extension block, "Hist" reads image history)print versionprofileread errorread gave %ld warningsreading associated image: %sreading region: %sref not smaller than or equal to inrelational operations against a constantrelational to performremainder after integer divisionremainder after integer division by a constantremainder after integer division by a vector of constantsremainder after integer division of an image and a constantremainder after integer division of two imagesreplace extension block with stdinreplicate an imagerequired field %d missingrequired field %d=%d, not %dresample with INTERPOLATORrotate an imageround to largest integer value not greater thanround to nearest integer valueround to smallest integer value not less thanrounding operation to performsave as asciisave image to Radiance filesave image to csv filesave image to fits filesave image to jpeg buffersave image to jpeg filesave image to jpeg mimesave image to png buffersave image to png filesave image to ppm filesave image to raw filesave image to tiff filesave image to vips filesave jpegsave pngscalar images onlyset BandFmt to F (eg. uchar, float)set Bands to Nset Coding to C (eg. labq)set Type to T (deprecated, use interpretation)set Xoffset to N pixelsset Xres to R pixels/mmset Xsize to N (deprecated, use width)set Yoffset to N pixelsset Yres to R pixels/mmset Ysize to N (deprecated, use height)set fatstrip height to N (DEBUG)set height to N pixelsset interpretation to I (eg. xyz)set output to FORMATset thinstrip height to N (DEBUG)set thumbnail size to SIZEset tile height to N (DEBUG)set tile width to N (DEBUG)set width to N pixelsshift by zero: falling back to im_copyshow all fieldsshow progress feedbackshrink factors should be >= 1sin of image (angles in degrees)single band images onlysize must be even and positivestandard deviation of imagestart function failed for image "%s"start function failed for image %sstop function failed for image "%s"substitute image "%s" is not the same size as "%s"subtract two imagestag file as big or little-endiantan of image (angles in degrees)threads clipped to %dtile size not a multiple of 16too few argumentstoo little datatoo many argumentstoo many imagestoo many input imagestoo many itemstoo much overlaptrace operation cacheuchar or ushort input onlyunable to CreateFileMappingunable to MapViewOfFileunable to UnmapViewOfFileunable to close fdunable to create profilesunable to create threadunable to create transform planunable to get file statsunable to get file statusunable to get media white pointunable to input from a %s imageunable to make temporary file %sunable to map memoryunable to mmapunable to mmap "%s" to same addressunable to mmap: "%s" - %sunable to munmap fileunable to open "%s"unable to open "%s" for inputunable to open "%s" for outputunable to open "%s", file too shortunable to open file "%s" for readingunable to open file "%s" for writingunable to open profile "%s"unable to output to a %s imageunable to ping file "%s"
libMagick error: %s %sunable to read dataunable to read data for "%s", %sunable to read file "%s"
libMagick error: %s %sunable to read header for "%s"unable to read historyunable to read pixelsunable to read profileunable to seekunable to set '%s'unable to set property "%s" to value "%s".unable to start VIPSunable to truncateunable to write "%s"unable to write to "%s"unable to write to bufferunary operationsunary operations with a constantuncoded images onlyunexpected EOF, line %d col %dunexpected EOL, line %d col %dunexpected end of stringunimplemented input color space 0x%xunimplemented maskunimplemented mask typeunimplemented output color space 0x%xunit vector in direction of valueunit vector of pixelunix errorunknown Coding typeunknown EXIF resolution unitunknown JFIF resolution unitunknown action "%s"unknown argument '%s'unknown band format %dunknown codingunknown coding typeunknown image codingunknown photometric interpretation %dunknown resolution unitunsigned 8-bit int, 16-bit int, and 32-bit float onlyunsupported BandFmt %d
unsupported bit depthunsupported bit depth %dunsupported bitpix %d
unsupported class type %d
unsupported color typeunsupported colorspace %dunsupported depth %d for LAB imageunsupported depth %d for RGB imageunsupported depth %d for greyscale imageunsupported image type %dunsupported rank %d
unsupported sample format %d for greyscale imageunsupported sample format %d for lab imageunsupported sample format %d for rgb imageusage:usage: %s [OPTION...] vipsfile
valid clipped to nothingvector must have 1 or %d elementsvectors not equal lengthvectors not same lengthverbose outputvips configured without FFT supportvips diagnosticvips warningvips_free: too many freesvips_free: too much freevipsfile - edit vipsfile headerwindow too largewindow too smallwindows errorwould result in zero size output imagewrite error (%zd out of %zd blocks written) ... disc full?write error ... disc full?write failedwrite raw image to file descriptorwrong sizesxx range too smallx value not an intx^pel of imagexml save erroryzero input images!zoom factors should be >= 0zoom factors too largeProject-Id-Version: libvips-doc 7.36.5-1
Report-Msgid-Bugs-To: VIPSIP@JISCMAIL.AC.UK
POT-Creation-Date: 2012-03-08 21:02+0000
PO-Revision-Date: 2014-03-12 21:58+0100
Last-Translator: Chris Leick <c.leick@vollbio.de>
Language-Team: Debian German <debian-l10n-german@lists.debian.org>
Language: de
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Plural-Forms: nplurals=2; plural=n != 1;
 %s, %d band, %s %s, %d Bänder, %s »bins« außerhalb des Bereichs [1,%d]»%s« ist kein VIPS-Bild»%s« ist kein bekanntes Dateiformat»%s« zu lang%d Bit pro Musterfarbpalettenbild nicht unterstützt%d Über- und %d Unterläufe entdeckt%d Überläufe entdeckt%d Unter- und %d Überläufe entdeckt%d-dimensionale Bilder nicht unterstützt%dx%d %s, %d Band, %s%dx%d %s, %d Bänder, %s%s%s %s: %d Threads, %d x %d Kacheln, Gruppen von %d Scan-Zeilen%s %s: %d%% komplett%s %s: Erledigt in %ds      
%s ist länger als erwartet%s: »%s« ist keine positive Ganzzahl- Bild-Kopfzeilen ausgeben- Miniaturansichten-Generatornur 1 bis 5 Bänder10^pel des Bildesnur RGB-TIFF mit drei oder vier Bändernnur unkodierte Fließkommazahlen mit drei Bändernnur CMYK-TIFF mit vier oder fünf BändernASCIIüberdies hinzufügenausrichtenam Rand der unteren, mittleren oder höchsten Koordinate ausrichtenWinkelWinkel zum Drehen eines BildesFeld aus KonstantenFeld von EingabebilderndazugehörigB-Splines mit KantenglättungHintergrundBandzu extrahierendes BandBänderdoppelt kubische Interpolation (Catmull-Rom)BigTIFFBilineare Interpolationnahtlos zwischen »dann«- und »sonst«-Teilen mischenBlockauswertung dieses BildesPufferPuffer, aus dem geladen werden sollPuffer, in den gespeichert werden sollCMYK-Eingabeprofil benötigt ein Eingabebild mit vier BändernCMYK-Profil benötigt ein Eingabebild mit vier BändernKlassenbeschreibungKlassen-NicknameKodierungFarbe für neue BildpunkteKomprimierungKomprimierungsfaktorKomprimierung für diese DateiPrognose der KomprimierungBedingungBedingung des EingabebildsNachfragestilBeschreibungRichtungRichtung, nach der das Bild umgedreht werden sollPlattehinunterEXR-Fehler: %sneues Kantenschärfungsmuster mit Halo-Reduzierungsonst BildexpandierenAusgabe so expandieren, dass sie beide Eingaben vollständig enthälterwartetes ZugriffsmustervergrößernFORMATscheiternscheitert bei erster WarnungDatei-DeskriptorDatei-Deskriptor, in den geschrieben werden sollDateinameName der Datei, aus der geladen werden sollName der Datei in die gespeichert werden sollerstes EingabebildSchalterSchalter für diese DateiFremdpufferFormatFormat, in das umgewandelt werden sollGB»H« nicht im Bereich [-30,+30]HöheHöhe des extrahierten Bereichshorizontaler Versatz vom Ursprunghorizontale Position des Maximumshorizontale Position des Minimumshorizontale Auflösung in Bildpunkten/mmWie werden die zusätzlichen Bildpunkte erzeugt?einzubettendes ICC-ProfilINTERPOLATORBilddateinameBildhöhe in Bildpunktenzu vermessendes Bildzu speicherndes BildBildbreite in BildpunktenEingabeEingabebildEingabebildargumentZeilensprungZeilensprungbildInterpretationvon links nach rechts oder von oben nach unten zusammenführenKBtötenNur LABQ-Kodierunglinkslinke Kante eines extrahierten Bereichslinker Rand der Eingabe in der Ausgabelinker Rand des Teilbilds im Hauptbildlinksseitiges BildargumentEbeneZeilendieses zugehörige Bild ladendiese Ebene aus der Datei ladendiese Seite aus der Datei ladenM»M« nicht im Bereich [-30,+30]MBprimärHaupteingabebild»Mat_VarReadDataAll« fehlgeschlagenKacheln maximalmaximale Anzahl von Kacheln, die zwischengespeichert werden sollModushiermit multiplizierenNächste-Nachbar-InterpolationMehr als ein Bild benötigtNicknameAnzahl der Bänder in einem BildAnzahl zu extrahierender BänderAnzahl der Patches über ein DiagrammAnzahl der Patches ein Diagramm hinunterVersatz in Byte vom Anfang der DateiÖffnen-Modusoffen zur PlatteTransaktionAusgabeAusgabefeld von StatistikenAusgabebildAusgabewertERWEITERUNGPROFILSeite»Ph« nicht im Bereich [0.0,1.0]BildpunktkodierungBildpunktformat im BildBildpunktinterpretationBildpunkte zwischen Bildern»Pm« nicht im Bereich [0.0,1.0]Puffer für fremde Bildpunktefür dieses Bild bevorzugter Nachfragestil»Ps« nicht im Bereich [0.0,1.0]PyramideQQ-FaktorRGB-Eingabeprofil benötigt ein Eingabebild mit drei BändernRGB-Profil benötigt ein Eingabebild mit drei BändernNur Radiance-Kodierungso viele Zeilen aus der Datei lesendoppelt kubische Halo-Reduzierunghorizontal so oft wiederholenvertikal so oft wiederholenEinheit der Auflösungrechtsrechtsseitiges BildargumentRundungstransakktion»S« nicht im Bereich [-30,+30]GRÖẞEzweites EingabebildTrennerTrennzeichensequenziellsequenziell nur mit LesezugriffSatz von TrennzeichenSatz von LeerraumzeichenScheibeVIPS-Optionen anzeigenverkleinernfalscher Verkleinerungsfaktor %dGröße der Kopfdatenüberspringenso viele Zeilen ab dem Dateianfang überspringenQuelle für FALSE-BildpunkteQuelle für TRUE-BildpunktequetschenBilder auf ein Bit zusammenquetschenStrategieTeilbildTeilbild, das in das Hauptbild eingefügt werden sollaustauschenByte im Bild zwischen Little- und Big-Endian austauschenTBTIFF-Datei enthält nicht Seite %dSchreiben des TIFF-Bildes fehlgeschlagendann BildKachelKachelhöheKachelhöhe in BildpunktenKachelbreiteKachelbreite in Bildpunktenobenobere Kante eines extrahierten Bereichsoberer Rand der Eingabe in der Ausgabeoberer Rand des Teilbilds im HauptbildVIPS-OptionenVIPS-Interpolatorenstatistische VIPS-Transaktionensowohl VIPS_FOREIGN_PARTIAL als auch VIPS_FOREIGN_SEQUENTIAL setzen – verwenden Sie SEQUENTIALvertikaler Versatz vom Ursprungvertikale Position des Maximumsvertikale Position des Minimumsvertikale Auflösung in Bildpunkten/mmLeerraumBreiteBreite des extrahierten Bereichsein BigTIFF-Bild schreibenein pyramidenförmiges TIFF schreibenein gekacheltes TIFF schreibenXXoffsetXresYYoffsetYres[AKTION] [OPTIONEN] [PARAMETER] - VIPS-Treiberprogramm[x,y,z]^pel des Bildesaeine Wahr-/Falsch-Transaktion für ein Bilderpaareine relationale Transaktion für ein Bilderpaarabsoluter Wertabsoluter Wert eines BildesArkuskosinus des Bildes (Ergebnis in Grad)zwei Bilder hinzufügenReservierung in »mergeup« gescheiterthöchstens N offene Dateien erlaubenArgument »%s« hat keine Instanzarithmetische TransaktionenArkussinus des Bildes (Ergebnis in Grad)Arkustangens des Bildes (Ergebnis in Grad)automatischer Rücklauf für %s fehlgeschlagendurchschnittliche BildbänderDurchschnittswert des Bildesbfalsche »Lb«-, »Lw«-Parameterfalsche Bereichsparameterfalsche Argumentefalsche Argumente (ac)falsche Argumente (f)falsche Argumentefalsche Bänderfalsche Kodierung %sfalsche Farbzusammenstellungfalsche Abmessungenfalsche Anzeigetypfalsche Byte-Reihenfolge %s, sollte »big« oder »little« seinfalscher extrahierter Bereichschlecht extrahiertes Bandfalsches Dateinamensformat »%s«falscher Dateitypfalsche Fließkommazahlfalsches Format %sfalsche Grauskala-Maskengrößefalscher Grauskala-Maskenwert, Reihe %dfalsche Gittergeometriefalscher Bild-Deskriptorfalsche Bildgrößefalscher Bildtypfalsche »in_max«-, »out_max«-Parameterfalsche Eingabematrixfalsche Eingabematrix-Größefalsche Ganzzahlfalsche Interpretation »%s« falsche »lut_size«falsche magische Zahlfalsches Maskenelement (%d sollte 0, 128 oder 255 sein)falscher Modus »%s«falsche Anzahl von Argumenten in »copy«-Zeilefalsche Anzahl von Argumenten in »join«-Zeilefalsche Anzahl von Argumenten in »join1«-Zeilefalsche Achsenanzahl %dfalsche Seitennummer %dfalscher Parameterfalsche Parameterfalsche Positionfalscher Schrumpffaktor %dfalsche Größefalsche Größenbandweiser Durchschnitt»in«-Bänder müssen die gleiche Breite wie die Matrix habeneinen Satz Bilder bandweise zusammenführenBasisklassebinäre Bilder >8 Bit müssen aus Fließkommazahlen bestehenbinäre TransaktionenMischungboolesche Transaktionen mit einer KonstanteBoolesch zur DurchführungBytecein Bild zwischenspeichernhöchstens N Byte zwischenspeichernhöchstens N Transaktionen zwischenspeichern(a * in + b) berechnenBerechnen von a*in + b -> out, a und b VektorenBerechnen von a*in + b = Ausgabedatei»calloc« fehlgeschlagennur LABQ und nicht-komplexe Bilder können pyramidenartig verwendet werden1-Bit-JPEG nicht möglich – JPEG wird ausgeschaltetnicht ummantelte Pyramide nicht möglich – Zerteilung wird eingeschaltetVideofähigkeit kann nicht abgefragt werdenVideogerät »%s« kann nicht geöffnet werdenKarte kann nicht in Speicher digitalisiert werdenein Bild umwandelnKanal nicht zwischen 0 und %dZirkularität entdecktKlasse »%s« nicht gefundenBefehl fehlgeschlagen: »%s«ohne »im_video_v4l1«-Unterstützung kompiliertkomplex durchzuführenKomprimierung sollte in [0,9] liegenUmwandlungstransaktionenKoordinaten außerhalb des Bildesein Bild kopierenKosinus des Bildes (Winkel in Grad)zusätzliche Daten konnten nicht abgefragt werdenBild %s konnte nicht geöffnet werdenVIPS-Kopfzeilen für %s konnten nicht gelesen werdenauf %s konnte nicht gesucht werdenErweiterung konnte nicht gesetzt werdenauf %s konnte nicht geschrieben werdenDatentyp %d nicht unterstütztHinweisanfrage nicht gesetztZiel zu kleinDimension sollte in (2,3) liegenDimensionen größer drei müssen die Größe eins haben»dir« nicht 0 oder 1Richtungvektorgesteuerte Versionen von Transaktionen deaktivierenAnzeige unbekanntzwei Bilder teilenProfil aus exportiertem Bild nicht löschenMiniaturansicht nicht schärfenTransaktionszwischenspeicher beim Beenden ausgebene^pel des BildesElement außerhalb des Bereichs [0,1]ein Bild in ein größeres Bild einbettenleere Zeileleere Überlappung!Dateiende während des Überspringens des StartesAufzählung »%s« hat keinen Bestandteil »%s«Fehler beim Auswerten von Nummer, Zeile %d, Spalte %dFehler beim Lesen von XML: %sFehler beim Lesen von Datei »%s«Fehler beim Lesen der Radiance-KopfzeilenFehler beim Lesen der AuflösungFehler abgefragtFehler beim Speichern von EXIFFehler beim Setzen der JPEG-AuflösungFehler beim Umwandeln vom gespeicherten FormatFehler beim Umwandeln in das zu speichernde FormatFehler beim Schreiben der Ausgabemit N gleichzeitigen Threads auswertengenannte VIPS-Transaktion ausführen1xN- oder Nx1-Eingabemaske wird erwartet%s erwartet, %s gesehenmit PROFIL exportierenkeine zusätzlichen Token nach »)«einen Bereich eines Bildes extrahierenBand aus einem Bild extrahierenFaktor sollte in [0,1) liegenbeide Faktoren sollten >=1 seinFehler beim Öffnen des DiasFeld »%s« ist vom Typ %s, nicht %sFeld »%s« nicht gefundenDatei »%s« nicht gefundenDatei wurde gekürztDatei ist weniger als 64 Byte großDateiladerDateispeichererBildmittelwert findenMaximum des Bildes findenMinimum des Bildes findenSchalter nicht -1 oder 1Schalter sollte 0 (horizontal) oder 1 (vertikal) seinein Bild umdrehenein komplexes Bild aus zwei echten Bildern erstellenes wurden %d Verbindungspunkte gefunden, mindestens %d sind nötigRumpfdaten für C++-Anbindung erzeugenHeader für C++-Anbindung erzeugenVerweise für VIPS/Bin erzeugengenerate() zweimal aufgerufeneinen Bestandteil eines komplexen Bildes holenAbfragen der Abmessungen: %sKopfdatendateigröße nicht korrektKopfdatengröße nicht korrektHilfe!Histogramm dürfen nicht mehr als 65536 Elemente habenHistogramme müssen eine Breite oder Höhe von eins habenfallsdannsonst eines Bildes»im_invmat« fehlgeschlagenBild »%s« zweimal als Ausgabe benutztBild bereits geschriebenBild und Band-Fmt müssen im Kennzeichen zusammenpassenBildklasseBildkodierung muss NONE oder LABQ seinÜberlaufganzzahl der BildabmessungenBild hat nicht so viele BänderBild ist zu nichts geschrumpftBild muss %s seinBild muss aus 8- oder 16-Bit Ganzzahlen mit oder ohne Vorzeichen bestehenBild muss aus 8- oder 16-Bit vorzeichenlosen Ganzzahlen bestehenBild muss aus 8- oder 16-Bit vorzeichenlosen Ganzzahlen oder Fließkommazahlen bestehenBild muss komplex seinBild muss ganzzahlig seinBild muss nicht-komplex seinBild muss unkodiert seinBild muss aus 8- oder 16-Bit vorzeichenlosen Ganz- oder Fließkommazahlen bestehenBild muss aus vorzeichenlosen Ganzzahlen bestehenBild muss %d Bänder habenBild muss ein oder %d Bänder habenBild muss ein oder drei Bänder habenBild muss ein Band habenBild nicht lesbarBild nicht schreibbarBild zu schmalBild zu klein für MaskeBild zu klein für FensterBilder passen nicht zusammenBilder passen in der Bildpunktgröße nicht zusammenBilder, die größer als N sind, werden auf die Platte dekomprimiertBilder müssen das gleiche Bandformat habenBilder müssen die gleiche Kodierung habenBilder müssen die gleiche Anzahl Bänder habenBilder müssen die gleiche Anzahl Bänder haben oder eines muss ein Band habenBilder müssen in der Größe passennicht gekennzeichnetes Bild mit PROFIL importiereninin1in2Ungeeigneter Regionstypunvollständige Kopfzeilenfalscher Namensraum in XMLIndex sollte im Bereich 0 - %d liegen»ink«-Bild passt nicht in das Bild»ink«-Bild nicht 1x1 BildpunkteEingabeEingabe ist kein unkodiertes Zeichen mit drei BändernEingaben inkompatibelein Bild einfügenZiel-%d (%s) nicht von Profil »%s« unterstützt; Rückfall auf Standardabsicht (normalerweise WAHRNEHMUNG)Ziel-%d (%s) nicht vom Profil unterstützt; Rückfall auf Standardabsicht (normalerweise WAHRNEHMUNG)interner Fehlerinterner Fehler #9876345ungültiges Argumentungültiger zugehöriger Bildnameungültige Auszeichnung im Textungültige Diastufeein Bild invertierenioctl(0x%x) fehlgeschlagen: %sein Bilderpaar zusammenführenfür Bild »%s« abgeschossenEbenenpuffer aufgebraucht – versuchen Sie die TIFF-Ausgabekacheln zu verkleinerngegen die »lcms«-Bibliothek wird in diesem VIPS nicht verlinktLückenprüfung beim Beendenlineare Neukombinierung mit der Matrixclasses|packages|all|package-name|operation-name aufführengegen die »lmcs«-Bibliothek wird in diesem VIPS nicht verlinktln des BildesERWEITERUNG ladenein FITS-Bild ladenein Radiance-Bild aus einer Datei ladenein Analyze6-Bild ladenein OpenEXR-Bild ladenBilddateien laden und speichernCSV aus Datei ladenDatei mit ImageMagick ladenDatei mit OpenSlide ladenJPEG ladenJPEG aus Puffer ladenJPEG aus Datei ladenMat aus Datei ladenPNG-Datei aus Datei ladenPPM aus Datei ladenRohdaten aus einer Datei ladenTIFF aus Datei ladenVips aus einer Datei ladenlog10 des Bildesein schwarzes Bild erstellenviele Bildstatistiken in einem Durchgang»map« fehlgeschlagen (%s), die Systemressourcen werden knapp, ein Absturz steht bevorMaskenbild nicht 8-Bit-kodiert mit einem BandMaske muss 1D seinMaskengröße nur Potenzen von 2Maske zu komplexdurchzuführende BerechnungMatrix der KoeffizientenMaximalwert des Bildesmessen eines Satzes von Patches auf ein FarbdiagrammDurchschnittsmaße eine Gitters aus FlickstückenMinimalwert des Bildesmehr als 10 Megabyte XML? Leidende Succotash!mehr als eine WurzelMosaik-Wurzel nicht in Beschreibungsdatei gefunden
ist das wirklich ein Bild?zwei Bilder multiplizieren»mwidth« muss -1 oder >= 0 seinnkein eingebettetes Profilkein Datei-Deskriptorkeine Bilddatenkeine Eingabebilderkein passendes »>«keine Matrixvariablen in »%s«kein Überlappenkein Paket oder Funktion »%s«keine Bildpunktdaten in angehängtem Bildkeine Punkte zum Mittelnkeine Eigenschaft namens »%s«Keine Auflösungsinformationen für TIFF-Bild »%s« – Standard auf 1 Bildpunkt pro mmkein Text zu rendernkein VIPS-Argument namens »%s«unsinnige Maskenparameterkein »,« oder »)« nach Parameterkein »uchar«-Bild mit einem Bandkein RAD-Bildkeine reguläre Dateinicht ein Band oder %d Bänderkein Leerraum vor dem Start der binären DatenTransaktionenTransaktionen für Bänder von BildernHauptspeicher reicht nicht ausHauptspeicher reicht nicht aus – Größe == %dMBaußerhalb des Bereichs [0,255]AusgabeAusgabekoordinaten außerhalb des BereichsÜberlappen zu schmalÜberlappen zu klein für SucheÜberlappen zu schmal für Ihre SuchgrößePangoft2-Unterstützung deaktiviertParameter %s nicht gesetztParameter außerhalb des BereichsParameter würden zu einem Ausgabebild der Größe Null führenFlicken %d x %d, Band %d: Durchschn. = %g, sdev = %gpel^[x,y,z] des Bildespel^x des BildesStatus pro Thread für »render«Status pro Thread für »sink«Status pro Thread für »sinkdisc«Status pro Thread für »sinkmemory«Status pro Thread für »vipsthreadpool«eine komplexe Transaktion mit einem Bild durchführeneine mathematische Funktion für ein Bild ausführeneine Rundungsfunktion für ein Bild ausführenPhase des Kreuzleistungsspektrums zweier komplexer BilderFotonegativbildpunktweise lineare RegressionPosition und Wert von n Maxima des BildesPosition und Wert von n Minima des BildesPosition des Maximalwerts des BildesPosition des Maximalwerts des Bildes, durchschnittlich im Fall des ZeichnensPosition des Minimalwerts des Bildesmögliche Aktionen:
pow( @in, @c )pow( links, rechts)PrädiktorWert von FELD ausgeben (»getext« liest Erweiterungsblock, »Hist« liest Bildchronik)Version ausgebenProfilLesefehlerLesen ergab %ld Warnungenzugehöriges Bild wird gelesen: %sRegion wird gelesen: %s»ref« nicht kleiner oder gleich »in«relationale Transaktion für eine Konstanterelational durchzuführenRest nach GanzzahldivisionRest nach Ganzzahldivision durch eine KonstanteRest nach Ganzzahldivision durch einen Vektor von KonstantenRest nach Ganzzahldivision eines Bildes und einer KonstanteRest nach Ganzzahldivision zweier BilderErweiterungsblock mit STDIN ersetzenein Bild nachmachenbenötigtes Feld %d fehltbenötigtes Feld %d=%d, nicht %dneues Muster mit INTERPOLATOR erstellenein Bild drehenauf größten ganzzahligen Wert runden, nicht größer alsauf nächsten ganzzahligen Wert rundenauf kleinsten ganzzahligen Wert runden, nicht weniger alsdurchzuführende RundungstransakktionBild als ASCII speichernBild in Radiance-Datei speichernBild in CSV-Datei speichernBild in FITS-Datei speichernBild in den JPEG-Puffer speichernBild in JPEG-Datei speichernBild in JPEG-MIME speichernBild in den PNG-Puffer speichernBild in PNG-Datei speichernBild in PPM-Datei speichernBild in Rohdatenformatdatei speichernBild in TIFF-Datei speichernBild in Vips-Datei speichernJPEG speichernPNG speichernnur skalare Bilder»BandFmt« auf F setzen (z.B. uchar, float)Bänder auf N setzenKodierung auf C setzen (z.B. labq)Typ auf N setzen (missbilligt, benutzen Sie »interpretation«»Xoffset« auf N Bildpunkte setzen»Xres« auf R Bildpunkte/mm setzen»Xsize« auf N setzen (missbilligt, benutzen Sie »width«)»Yoffset« auf N Bildpunkte setzen»Yres« auf R Bildpunkte/mm setzen»Ysize« auf N setzen (missbilligt, benutzen Sie »height«)»fatstrip«-Höhe auf N setzen (DEBUG)Höhe auf N Bildpunkte setzenInterpretation aif I setzen (z.B. xyz)Ausgabe auf FORMAT setzen»thinstrip«-Höhe auf N setzen (DEBUG)Miniaturansicht auf GRÖẞE setzenBildhöhe auf N setzen (DEBUG)Bildbreite auf N setzen (DEBUG)Breite auf N Bildpunkte setzenverschieben um Null: Rückfall auf »im_copy«alle Felder anzeigenFortschrittsrückmeldung anzeigenSchrumpffaktoren sollten >=1 seinSinus des Bildes (Winkel in Grad)nur EinzelbandbilderGröße muss gerade und positiv seinStandardabweichung des Bildes»start«-Funktion für Bild »%s« fehlgeschlagenStartfunktion für Bild %s fehlgeschlagen»stop«-Funktion für Bild »%s« fehlgeschlagenBild zum Ersetzen »%s« hat nicht die gleiche Größe wie »%s«zwei Bilder subtrahierenKennzeichendatei als Big- oder Little-EndianTangens des Bildes (Winkel in Grad)Threads an %d angeheftetBildgröße kein Vielfaches von 16zu wenige Argumentezu wenige Datenzu viele Argumentezu viele Bilderzu viele Eingabebilderzu viele Elementezu viel ÜberlappungTransaktionszwischenspeicher aufzeichnennur »uchar« oder »ushort«-Eingabe»CreateFileMapping« nicht möglich»MapViewOfFile« nicht möglich»UnmapViewOfFile« nicht möglich»fd« kann nicht geschlossen werdenes können keine Profile erstellt werdenThread kann nicht erstellt werdenUmwandlungsplan kann nicht erstellt werdenDateistatus kann nicht abgefragt werdenDateistatus kann nicht abgefragt werdenweißer Medienpunkt kann nicht abgefragt werdenEingabe von einem %s-Bild nicht möglichtemporäre Datei %s kann nicht erstellt werdenSpeicher kann nicht abgebildet werden»mmap« nicht möglich»mmap %s« zur gleichen Adresse nicht möglich»mmap« nicht möglich: "%s" - %s»munmap« der Datei nicht möglich»%s« kann nicht geöffnet werden»%s« kann nicht zur Eingabe geöffnet werden»%s« kann nicht zur Ausgabe geöffnet werden»%s« kann nicht geöffnet werden, Datei zu kleinDatei »%s« kann nicht zum Lesen geöffnet werdenDatei »%s« kann nicht zum Schreiben geöffnet werdenProfil »%s« kann nicht geöffnet werdenes kann nicht zu einem %s-Bild ausgegeben werdenDatei »%s« kann nicht angepingt werden
libMagick-Fehler: %s %sDaten können nicht gelesen werdenDaten für »%s« können nicht gelesen werden, %sDatei »%s« kann nicht gelesen werden
libMagick-Fehler: %s %sKopfdaten für »%s« können nicht gelesen werdenVerlauf kann nicht gelesen werdenBildpunkte können nicht gelesen werdenProfil kann nicht gelesen werdenkann nicht gesucht werden»%s« kann nicht gesetzt werdenEigenschaft »%s« kann nicht auf Wert »%s« gesetzt werden.VIPS kann nicht gestartet werdenkann nicht gekürzt werden»%s« kann nicht geschrieben werdenauf »%s« kann nicht geschrieben werdenIn den Puffer kann nicht geschrieben werden.unäre Transaktionenunäre Transaktionen mit einer Konstantenur unkodierte Bilderunerwartetes Dateiende, Zeile %d, Spalte %dunerwartetes Zeilenende, Zeile %d, Spalte %dUnerwartetes Ende der Zeichenkettenicht implementierter Eingabefarbraum 0x%xnicht implementierte Maskenicht implementierter Maskentypnicht implementierter Ausgabefarbraum 0x%xEinheitsvektor in Richtung des WertesEinheitsvektor von BildpunktenUnix-Fehlerunbekannter Kodierungstypunbekannte EXIF-Auflösungseinheitunbekannte JFIF-Auflösungseinheitunbekannte Aktion »%s«unbekanntes Argument »%s«unbekanntes Bandformat %dunbekannte Kodierungunbekannter Kodierungstypunbekannte Bildkodierungunbekannte fotometrische Deutung %dunbekannte Auflösungseinheitnur vorzeichenlose 8-Bit-Ganzzahl und 32-Bit-Fließkommazahlnicht unterstütztes BandFmt %d
nicht unterstützte Bit-Tiefenicht unterstützte Bit-Tiefe %dnicht unterstützte »bitpix« %d
nicht unterstützter Klassentyp %d
nicht unterstützter Farbtypnicht unterstützter Farbraum %dnicht unterstützte Tiefe %d für LAB-Bildnicht unterstützte Tiefe %d für RGB-Bildnicht unterstützte Tiefe %d für Graustufenbildnicht unterstützter Bildtyp %dnicht unterstützte Rangstufe %d
nicht unterstütztes Musterformat %d für Graustufenbildnicht unterstütztes Musterformat %d für LAB-Bildnicht unterstütztes Musterformat %d für RGB-BildAufruf:Aufruf: %s [OPTION …] vipsfile
gültig an nichts angeklammertVektor muss 1 oder %d Elemente habenVektoren ungleicher LängeVektoren ungleicher Längedetaillierte AusgabeVIPS wurde ohne FFT-Unterstützung konfiguriertVips-DiagnoseVips-Warnungvips_free: zu viele Freesvips_free: zu viel frei»vipsfile« - »vipsfile«-Kopfzeilen bearbeitenFenster zu großFenster zu kleinWindows-Fehlerwürde in einem Ausgabebild der Größe Null resultierenSchreibfehler (%zd aus %zd Blöcken geschrieben) … Platte voll?Schreibfehler … Platte voll?Schreiben fehlgeschlagenRohdatenbild in Datei-Deskriptor schreibenfalsche Größenxx-Bereich zu kleinx-Wert keine Ganzzahlx^pel des BildesXML-Fehler beim Speichernynull EingabebilderZoomfaktoren sollten >=0 seinZoomfaktoren zu großPK�^���man/man1/php-cgi.1nu�[���PK�^[�ga�X
X
Qman/man1/phpdbg.1nu�[���PK�^^�����
man/man1/phpize.1nu�[���PK�^[�Dߛ��man/man1/php-config.1nu�[���PK�^[�j�*�*1man/man1/phar.1nu�[���PK�^[��@�&�&Aman/man1/php.1nu�[���PK�^\u-�gman/man1/phar.phar.1nu�[���PK�^[󍖁��Dhman/man8/php-fpm.8nu�[���PK�^[��{008}pecl/vld/Changelognu�[���PK�^A��??��pecl/vld/CREDITSnu�[���PK�^[�"�**x�pecl/vld/README.rstnu�[���PK�^[�l��licenses/alt-php84-vld/LICENSEnu�[���PK�^[p���(N�licenses/alt-php84-snuffleupagus/LICENSEnu�[���PK�^[
��pear/.locknu�[���PK�^yv���pear/Structures/Graph.phpnu�[���PK�^[�C� + ++�pear/Structures/Graph/Node.phpnu�[���PK�^[9����1�pear/Structures/Graph/Manipulator/AcyclicTest.phpnu�[���PK�^[~(�htt7{0pear/Structures/Graph/Manipulator/TopologicalSorter.phpnu�[���PK�^[�T�,�,VLpear/OS/Guess.phpnu�[���PK�^[�����ypear/PEAR/Config.phpnu�[���PK�^[�`�eEAEA��pear/PEAR/REST.phpnu�[���PK�^[��ym6m6}�pear/PEAR/Exception.phpnu�[���PK�^"����1pear/PEAR/ChannelFile.phpnu�[���PK�^[��gk�U�U�pear/PEAR/Validate.phpnu�[���PK�^֣S��Qpear/PEAR/Command/Pickle.xmlnu�[���PK�^[�z��k<k<8"pear/PEAR/Command/Config.phpnu�[���PK�^[݄<ii�^pear/PEAR/Command/Mirror.xmlnu�[���PK�^[,��t"u"u�apear/PEAR/Command/Remote.phpnu�[���PK�^[
�\����pear/PEAR/Command/Remote.xmlnu�[���PK�^���!�!M�pear/PEAR/Command/Install.xmlnu�[���PK�^[�%q�����pear/PEAR/Command/Channels.phpnu�[���PK�^mi?;�;���pear/PEAR/Command/Install.phpnu�[���PK�^[�X�

Qpear/PEAR/Command/Auth.phpnu�[���PK�^[���s6
6
][pear/PEAR/Command/Config.xmlnu�[���PK�^[�%Fii�hpear/PEAR/Command/Test.xmlnu�[���PK�^ h66�opear/PEAR/Command/Package.xmlnu�[���PK�^[�w��zz�pear/PEAR/Command/Channels.xmlnu�[���PK�^[+9ҜҜݜpear/PEAR/Command/Package.phpnu�[���PK�^[
u����9pear/PEAR/Command/Build.xmlnu�[���PK�^[������;pear/PEAR/Command/Mirror.phpnu�[���PK�^[,_�h/h/�Mpear/PEAR/Command/Test.phpnu�[���PK�^[�%sp  g}pear/PEAR/Command/Common.phpnu�[���PK�^[0(;rʹʹɝpear/PEAR/Command/Registry.phpnu�[���PK�^[�4�{���Rpear/PEAR/Command/Auth.xmlnu�[���PK�^[��#S
S
�Wpear/PEAR/Command/Build.phpnu�[���PK�^[���u���bpear/PEAR/Command/Registry.xmlnu�[���PK�^[�P>>�ipear/PEAR/Command/Pickle.phpnu�[���PK�^[��T�I�IG�pear/PEAR/Builder.phpnu�[���PK�^[[
�W����pear/PEAR/XMLParser.phpnu�[���PK�^(e����
	pear/PEAR/Downloader.phpnu�[���PK�^[�b�����
pear/PEAR/ErrorStack.phpnu�[���PK�^[(Pz���B�
pear/PEAR/Proxy.phpnu�[���PK�^[��'����o�
pear/PEAR/RunTest.phpnu�[���PK�^�y99N8pear/PEAR/Validator/PECL.phpnu�[���PK�^������@pear/PEAR/Dependency2.phpnu�[���PK�^[��wv@@*pear/PEAR/PackageFile/v2.phpnu�[���PK�^�8�L�L&�
pear/PEAR/PackageFile/v2/Validator.phpnu�[���PK�^[���=_�_��dpear/PEAR/PackageFile/v2/rw.phpnu�[���PK�^[�5������:[pear/PEAR/PackageFile/v1.phpnu�[���PK�^[�ɁɁ&9!pear/PEAR/PackageFile/Generator/v2.phpnu�[���PK�^[`�=����&X�pear/PEAR/PackageFile/Generator/v1.phpnu�[���PK�^[��OWHH#_hpear/PEAR/PackageFile/Parser/v2.phpnu�[���PK�^[�_=�@�@#�tpear/PEAR/PackageFile/Parser/v1.phpnu�[���PK�^��__Եpear/PEAR/DependencyDB.phpnu�[���PK�^[�@P�� pear/PEAR/ChannelFile/Parser.phpnu�[���PK�^[��_�0�0pear/PEAR/Command.phpnu�[���PK�^[�ٲ�=�=�Lpear/PEAR/PackageFile.phpnu�[���PK�^[�JD���pear/PEAR/Task/Replace.phpnu�[���PK�^[&%75)) ]�pear/PEAR/Task/Windowseol/rw.phpnu�[���PK�^[�3}֫pear/PEAR/Task/Replace/rw.phpnu�[���PK�^[&
i.':�pear/PEAR/Task/Postinstallscript/rw.phpnu�[���PK�^[�-!��pear/PEAR/Task/Common.phpnu�[���PK�^[D$����pear/PEAR/Task/Windowseol.phpnu�[���PK�^�E�x9x9$U�pear/PEAR/Task/Postinstallscript.phpnu�[���PK�^[\k��!&pear/PEAR/Task/Unixeol/rw.phpnu�[���PK�^[������+pear/PEAR/Task/Unixeol.phpnu�[���PK�^[�W�f���4pear/PEAR/REST/10.phpnu�[���PK�^[��Y�;;��pear/PEAR/REST/13.phpnu�[���PK�^[,#y��+�+�pear/PEAR/REST/11.phpnu�[���PK�^[��U  3pear/PEAR/Packager.phpnu�[���PK�^[Z�bgbg�:pear/PEAR/Common.phpnu�[���PK�^[$���(�(?�pear/PEAR/Registry.phpnu�[���PK�^[��	MdMd=�pear/PEAR/Frontend/CLI.phpnu�[���PK�^[��

 �/pear/PEAR/Installer/Role/Doc.phpnu�[���PK�^[��/�� 13pear/PEAR/Installer/Role/Cfg.xmlnu�[���PK�^[>1H��� &5pear/PEAR/Installer/Role/Www.xmlnu�[���PK�^[�?m

 7pear/PEAR/Installer/Role/Php.phpnu�[���PK�^[*Y|	%% w:pear/PEAR/Installer/Role/Man.phpnu�[���PK�^[���BB �=pear/PEAR/Installer/Role/Ext.xmlnu�[���PK�^��"" ~?pear/PEAR/Installer/Role/Src.xmlnu�[���PK�^&P*�� �@pear/PEAR/Installer/Role/Doc.xmlnu�[���PK�^[B] ��!�Bpear/PEAR/Installer/Role/Test.xmlnu�[���PK�^�q��� �Dpear/PEAR/Installer/Role/Php.xmlnu�[���PK�^[	��
!�Fpear/PEAR/Installer/Role/Data.phpnu�[���PK�^[�0�c�� Jpear/PEAR/Installer/Role/Man.xmlnu�[���PK�^[��K

 Lpear/PEAR/Installer/Role/Ext.phpnu�[���PK�^���!cOpear/PEAR/Installer/Role/Test.phpnu�[���PK�^[@v�а�#�Rpear/PEAR/Installer/Role/Script.xmlnu�[���PK�^�sz��!�Tpear/PEAR/Installer/Role/Data.xmlnu�[���PK�^[?���GG#�Vpear/PEAR/Installer/Role/Common.phpnu�[���PK�^[�^D{		 Copear/PEAR/Installer/Role/Www.phpnu�[���PK�^[�Ƥ �rpear/PEAR/Installer/Role/Cfg.phpnu�[���PK�^[��[�#k�pear/PEAR/Installer/Role/Script.phpnu�[���PK�^[��srr хpear/PEAR/Installer/Role/Src.phpnu�[���PK�^�Z�����pear/PEAR/Installer/Role.phpnu�[���PK�^[�{�	�)�) ��pear/PEAR/Downloader/Package.phpnu�[���PK�^[.�4�����pear/PEAR/Frontend.phpnu�[���PK�^[،�w����pear/PEAR/Installer.phpnu�[���PK�^[���=YY�pear/Archive/Tar.phpnu�[���PK�^[��W8j#j#36Xpear/test/Structures_Graph/tests/BasicGraphTest.phpnu�[���PK�^[6��:UU:|pear/test/Structures_Graph/tests/TopologicalSorterTest.phpnu�[���PK�^[�V���-ƒpear/test/Structures_Graph/tests/AllTests.phpnu�[���PK�^[���4ۅpear/test/Structures_Graph/tests/AcyclicTestTest.phpnu�[���PK�^[�-�ii+[�pear/test/Structures_Graph/tests/helper.incnu�[���PK�^[����.�pear/test/Console_Getopt/tests/001-getopt.phptnu�[���PK�^[��,K�pear/test/Console_Getopt/tests/bug11068.phptnu�[���PK�^[���,��pear/test/Console_Getopt/tests/bug10557.phptnu�[���PK�^[��|EE,
�pear/test/Console_Getopt/tests/bug13140.phptnu�[���PK�^[.��
��'��pear/test/XML_RPC/tests/extra-lines.phpnu�[���PK�^[|�E.˦pear/test/XML_RPC/tests/empty-value-struct.phpnu�[���PK�^[�3l�**%4�pear/test/XML_RPC/tests/protoport.phpnu�[���PK�^[�B�"��pear/test/XML_RPC/tests/allgot.incnu�[���PK�^[��̢�	�	!��pear/test/XML_RPC/tests/types.phpnu�[���PK�^����"*�pear/test/XML_RPC/tests/encode.phpnu�[���PK�^[���XX%M�pear/test/XML_RPC/tests/test_Dump.phpnu�[���PK�^[$]���'��pear/test/XML_RPC/tests/empty-value.phpnu�[���PK�^��)))*Jpear/test/XML_RPC/tests/actual-request.phpnu�[���PK�^�>��4�44�pear/test/XML_Util/tests/CreateTagFromArrayTests.phpnu�[���PK�^[�C���1�=pear/test/XML_Util/tests/ReplaceEntitiesTests.phpnu�[���PK�^[یu���,'Opear/test/XML_Util/tests/ApiVersionTests.phpnu�[���PK�^[�Gs���)`Ppear/test/XML_Util/tests/Bug5392Tests.phpnu�[���PK�^��jj4�Spear/test/XML_Util/tests/CreateCDataSectionTests.phpnu�[���PK�^[|�\53�Upear/test/XML_Util/tests/CollapseEmptyTagsTests.phpnu�[���PK�^[��GG4�fpear/test/XML_Util/tests/SplitQualifiedNameTests.phpnu�[���PK�^q���*�jpear/test/XML_Util/tests/Bug21184Tests.phpnu�[���PK�^[>�M���)�lpear/test/XML_Util/tests/Bug4950Tests.phpnu�[���PK�^[�YR�""4�opear/test/XML_Util/tests/CreateStartElementTests.phpnu�[���PK�^[ܬ$���7i�pear/test/XML_Util/tests/GetDocTypeDeclarationTests.phpnu�[���PK�^[��G*Ìpear/test/XML_Util/tests/Bug21177Tests.phpnu�[���PK�^[��۩��*;�pear/test/XML_Util/tests/Bug18343Tests.phpnu�[���PK�^��t��1c�pear/test/XML_Util/tests/ReverseEntitiesTests.phpnu�[���PK�^[~�$[ee2��pear/test/XML_Util/tests/CreateEndElementTests.phpnu�[���PK�^[���!��.a�pear/test/XML_Util/tests/AbstractUnitTests.phpnu�[���PK�^[�m4�**+g�pear/test/XML_Util/tests/CreateTagTests.phpnu�[���PK�^f:��3��pear/test/XML_Util/tests/GetXmlDeclarationTests.phpnu�[���PK�^�t�4��pear/test/XML_Util/tests/AttributesToStringTests.phpnu�[���PK�^[ݑh���-U�pear/test/XML_Util/tests/IsValidNameTests.phpnu�[���PK�^[���TT/q�pear/test/XML_Util/tests/CreateCommentTests.phpnu�[���PK�^[�rv��,$�pear/test/XML_Util/tests/RaiseErrorTests.phpnu�[���PK�^[�'7,����
@�pear/PEAR.phpnu�[���PK�^[�o�P�P�pear/System.phpnu�[���PK�^[.�Occ&�pear/peclcmd.phpnu�[���PK�^[ũ�

��pear/data/PEAR/package.dtdnu�[���PK�^[�������pear/data/PEAR/template.specnu�[���PK�^[�Z��aa
8�pear/.filemapnu�[���PK�^[���pear/.channels/__uri.regnu�[���PK�^q�++)pear/.channels/pecl.php.net.regnu�[���PK�^[�o/�!�pear/.channels/.alias/phpdocs.txtnu�[���PK�^[� ���pear/.channels/.alias/pear.txtnu�[���PK�^i<�Ypear/.channels/.alias/pecl.txtnu�[���PK�^[)�ȣ�pear/.channels/doc.php.net.regnu�[���PK�^[d�X((pear/.channels/pear.php.net.regnu�[���PK�^[��0AC5C5�pear/Console/Getopt.phpnu�[���PK�^[�7�p�K�KSpear/.pkgxml/XML_Util.xmlnu�[���PK�^[/N�uvuv�pear/.registry/xml_util.regnu�[���PK�^[�a�W�W�pear/.registry/archive_tar.regnu�[���PK�^[�W�)�)!�mpear/.registry/console_getopt.regnu�[���PK�^[�U��D�D���pear/.registry/pear.regnu�[���PK�^C9�++#J# pear/.registry/structures_graph.regnu�[���PK�^[�1oO1{1{�N pear/.registry/xml_rpc.regnu�[���PK�^�J�W�W5� pear/XML/RPC/Server.phpnu�[���PK�^oK��."!pear/XML/RPC/Dump.phpnu�[���PK�^[�/=�����E7!pear/XML/RPC.phpnu�[���PK�^[c���}�}T!"pear/XML/Util.phpnu�[���PK�^[��&��:�:E�"pear/pearcmd.phpnu�[���PK�^��^0,0,+�"doc/alt-php84-ioncube-loader/USER-GUIDE.txtnu�[���PK�^[}��6�6�+�#doc/alt-php84-ioncube-loader/USER-GUIDE.pdfnu�[���PK�^[&�**(4�#doc/alt-php84-ioncube-loader/LICENSE.txtnu�[���PK�^[�_Y@����.��#doc/alt-php84-ioncube-loader/loader-wizard.phpnu�[���PK�^�$���'�&doc/alt-php84-ioncube-loader/README.txtnu�[���PK�^G�e��! �&doc/pear/Structures_Graph/LICENSEnu�[���PK�^� ���NF�&doc/pear/Structures_Graph/docs/tutorials/Structures_Graph/Structures_Graph.pkgnu�[���PK�^[���xx��&doc/pear/PEAR/INSTALLnu�[���PK�^[�E���M�&doc/pear/PEAR/README.rstnu�[���PK�^[�u����w�&doc/pear/PEAR/LICENSEnu�[���PK�^[�r¦J�J)��&doc/pear/Archive_Tar/docs/Archive_Tar.txtnu�[���PK�^[�f��'�2'doc/pear/XML_Util/examples/example2.phpnu�[���PK�^��#�#&�E'doc/pear/XML_Util/examples/example.phpnu�[���PK�^[$�u���%�i'doc/alt-php84-snuffleupagus/README.mdnu�[���PK�^[�E#/&&+�'doc/alt-php84-snuffleupagus/CONTRIBUTING.mdnu�[���PK�^[9Ύ*M*Mm�'fpm/status.htmlnu�[���PKN![,�C�I�I��'man/man1/python3.10.1nu�[���PKN![U_c�%% 	2(bash-completion/completions/pip3nu�[���PKN![&d@f�f�)~3(python-wheels/pip-21.3.1-py3-none-any.whlnuȯ��PKN![KW�#_	_	0=�:python-wheels/setuptools-58.3.0-py3-none-any.whlnuȯ��PKN![��"�BB&�Dlicenses/alt-python310-pip/LICENSE.txtnu�[���PKN![��"�BB,�Dlicenses/alt-python310-pip-wheel/LICENSE.txtnu�[���PKN![��N�'�'2Ddoc/alt-python310/README.rstnu�[���PKN![�̈��'>Ddoc/alt-python310-devel/README.valgrindnu�[���PKO![���3{"{",QDdoc/alt-python310-devel/valgrind-python.suppnu�[���PKO![蘪zcc�sDdoc/alt-python310-devel/gdbinitnu�[���PKO![��N�'�'!��Ddoc/alt-python310-libs/README.rstnu�[���PKO![���� ��Ddoc/alt-python310-pip/README.rstnu�[���PKO![�Yď*��Ddoc/alt-python310-setuptools-wheel/LICENSEnu�[���PKO![_��$�Ddoc/alt-python310-setuptools/zpl.txtnu�[���PKO![SoD �1�1%��Ddoc/alt-python310-setuptools/psfl.txtnu�[���PKO![�Yď$��Ddoc/alt-python310-setuptools/LICENSEnu�[���PKO![�S��
�
5"�Ddoc/alt-python310-setuptools/docs/python 2 sunset.rstnu�[���PKO![�'��ss0Y
Edoc/alt-python310-setuptools/docs/build_meta.rstnu�[���PKO![�rE��:,Edoc/alt-python310-setuptools/docs/development/releases.rstnu�[���PKO![�
���A# Edoc/alt-python310-setuptools/docs/development/developer-guide.rstnu�[���PKO![$dگ�7.2Edoc/alt-python310-setuptools/docs/development/index.rstnu�[���PKP![���@�j�j8D8Edoc/alt-python310-setuptools/docs/userguide/commands.rstnu�[���PKP![��f�n)n)B��Edoc/alt-python310-setuptools/docs/userguide/declarative_config.rstnu�[���PKP!['��*VVG|�Edoc/alt-python310-setuptools/docs/userguide/functionalities_rewrite.rstnu�[���PKP![���@�
�
@I�Edoc/alt-python310-setuptools/docs/userguide/development_mode.rstnu�[���PKP![\��ى�;��Edoc/alt-python310-setuptools/docs/userguide/entry_point.rstnu�[���PKP![�!�**9��Edoc/alt-python310-setuptools/docs/userguide/extension.rstnu�[���PKP![��cߑ�A'Fdoc/alt-python310-setuptools/docs/userguide/package_discovery.rstnu�[���PKP![C���"�"8)6Fdoc/alt-python310-setuptools/docs/userguide/keywords.rstnu�[���PKP![G��N��:kYFdoc/alt-python310-setuptools/docs/userguide/quickstart.rstnu�[���PKP![Ѩ���1�1<�yFdoc/alt-python310-setuptools/docs/userguide/distribution.rstnu�[���PKP![P��d��9��Fdoc/alt-python310-setuptools/docs/userguide/datafiles.rstnu�[���PKP![ƺ4�{{5 �Fdoc/alt-python310-setuptools/docs/userguide/index.rstnu�[���PKP![��`''=�Fdoc/alt-python310-setuptools/docs/userguide/miscellaneous.rstnu�[���PKP![4/o�*�*E��Fdoc/alt-python310-setuptools/docs/userguide/dependency_management.rstnu�[���PKP![c�g���-�Gdoc/alt-python310-setuptools/docs/roadmap.rstnu�[���PKP![4W�pppp3�Gdoc/alt-python310-setuptools/docs/pkg_resources.rstnu�[���PKP![
`�nPP)��Hdoc/alt-python310-setuptools/docs/conf.pynu�[���PKP![�0�7�79>�Hdoc/alt-python310-setuptools/docs/references/keywords.rstnu�[���PKQ![��s���0r�Hdoc/alt-python310-setuptools/docs/setuptools.rstnu�[���PKQ![�&5pp-��Hdoc/alt-python310-setuptools/docs/history.rstnu�[���PKQ![���+q�Hdoc/alt-python310-setuptools/docs/index.rstnu�[���PKQ![I��xzxzA��Hdoc/alt-python310-setuptools/docs/deprecated/distutils/apiref.rstnu�[���PKQ![f�m�(�(C�pJdoc/alt-python310-setuptools/docs/deprecated/distutils/examples.rstnu�[���PKQ![:X���D��Jdoc/alt-python310-setuptools/docs/deprecated/distutils/uploading.rstnu�[���PKQ![I���G�Jdoc/alt-python310-setuptools/docs/deprecated/distutils/packageindex.rstnu�[���PKQ![�Y�
&
&E"�Jdoc/alt-python310-setuptools/docs/deprecated/distutils/sourcedist.rstnu�[���PKQ![.<��ZZD��Jdoc/alt-python310-setuptools/docs/deprecated/distutils/builtdist.rstnu�[���PKQ![�ׁ���E)Kdoc/alt-python310-setuptools/docs/deprecated/distutils/configfile.rstnu�[���PKQ![R����DB6Kdoc/alt-python310-setuptools/docs/deprecated/distutils/extending.rstnu�[���PKQ![�W��E�HKdoc/alt-python310-setuptools/docs/deprecated/distutils/commandref.rstnu�[���PKQ![>�yq�!�!G8[Kdoc/alt-python310-setuptools/docs/deprecated/distutils/introduction.rstnu�[���PKR![@�G���@6}Kdoc/alt-python310-setuptools/docs/deprecated/distutils/index.rstnu�[���PKR![n�O���Q��Kdoc/alt-python310-setuptools/docs/deprecated/distutils/_setuptools_disclaimer.rstnu�[���PKR![U��)�z�zF�Kdoc/alt-python310-setuptools/docs/deprecated/distutils/setupscript.rstnu�[���PKR![eO<�x�x<��Kdoc/alt-python310-setuptools/docs/deprecated/python_eggs.rstnu�[���PKR![2�����AFxLdoc/alt-python310-setuptools/docs/deprecated/distutils-legacy.rstnu�[���PKR![�Ӹ�69~Ldoc/alt-python310-setuptools/docs/deprecated/index.rstnu�[���PKR![��Uê���=��Ldoc/alt-python310-setuptools/docs/deprecated/easy_install.rstnu�[���PKR![�j'��@�MMdoc/alt-python310-setuptools/docs/deprecated/functionalities.rstnu�[���PK�![�ٝ�rara�SMman/man1/python3.13.1nu�[���PK�![��F�����0��Mpython-wheels/setuptools-69.0.2-py3-none-any.whlnuȯ��PK�![�h��u�u)�nYpython-wheels/pip-23.3.1-py3-none-any.whlnuȯ��PK�![�V+EE,��qlicenses/alt-python313-pip-wheel/LICENSE.txtnu�[���PK�![�V+EE&��qlicenses/alt-python313-pip/LICENSE.txtnu�[���PK�![�o�E""!�qdoc/alt-python313-libs/README.rstnu�[���PK�![�o�E""�rdoc/alt-python313/README.rstnu�[���PK�![_��$�3rdoc/alt-python313-setuptools/zpl.txtnu�[���PK�![SoD �1�1% <rdoc/alt-python313-setuptools/psfl.txtnu�[���PK�![SE���$Tnrdoc/alt-python313-setuptools/LICENSEnu�[���PK�![�S��
�
5�rrdoc/alt-python313-setuptools/docs/python 2 sunset.rstnu�[���PK�![���$CC-ހrdoc/alt-python313-setuptools/docs/artwork.rstnu�[���PK�![�u,�0~�rdoc/alt-python313-setuptools/docs/build_meta.rstnu�[���PK�![�rE��:�rdoc/alt-python313-setuptools/docs/development/releases.rstnu�[���PK�![������A�rdoc/alt-python313-setuptools/docs/development/developer-guide.rstnu�[���PK�![$dگ�7@�rdoc/alt-python313-setuptools/docs/development/index.rstnu�[���PK�![�0�C9C9@V�rdoc/alt-python313-setuptools/docs/userguide/pyproject_config.rstnu�[���PK�![L���P5P5B	sdoc/alt-python313-setuptools/docs/userguide/declarative_config.rstnu�[���PK�![��A�/�/@�<sdoc/alt-python313-setuptools/docs/userguide/development_mode.rstnu�[���PK�![@SRϻG�G;/msdoc/alt-python313-setuptools/docs/userguide/entry_point.rstnu�[���PK�![��s"�3�39U�sdoc/alt-python313-setuptools/docs/userguide/extension.rstnu�[���PK�![
���sGsGA��sdoc/alt-python313-setuptools/docs/userguide/package_discovery.rstnu�[���PK�![���Xp?p?:�1tdoc/alt-python313-setuptools/docs/userguide/quickstart.rstnu�[���PK�![��j�J(J(<nqtdoc/alt-python313-setuptools/docs/userguide/distribution.rstnu�[���PK�![�8F�M�M9$�tdoc/alt-python313-setuptools/docs/userguide/datafiles.rstnu�[���PK�![�)�FF;W�tdoc/alt-python313-setuptools/docs/userguide/ext_modules.rstnu�[���PK�![���ee5udoc/alt-python313-setuptools/docs/userguide/index.rstnu�[���PK�![��"Fa%a%=�udoc/alt-python313-setuptools/docs/userguide/miscellaneous.rstnu�[���PK�![�=��I-I-E�1udoc/alt-python313-setuptools/docs/userguide/dependency_management.rstnu�[���PK�![c�g���-^_udoc/alt-python313-setuptools/docs/roadmap.rstnu�[���PK�![�ye?`p`p3\`udoc/alt-python313-setuptools/docs/pkg_resources.rstnu�[���PK�![f4&�g#g#)�vdoc/alt-python313-setuptools/docs/conf.pynu�[���PK�![J�ٞMM9��vdoc/alt-python313-setuptools/docs/references/keywords.rstnu�[���PK�![V�UZ660IBwdoc/alt-python313-setuptools/docs/setuptools.rstnu�[���PK�![{8��mm-�\wdoc/alt-python313-setuptools/docs/history.rstnu�[���PK�![��jKYY+�dwdoc/alt-python313-setuptools/docs/index.rstnu�[���PK�![�vM��s�s9]hwdoc/alt-python313-setuptools/docs/deprecated/commands.rstnu�[���PK�![�9���D��wdoc/alt-python313-setuptools/docs/deprecated/resource_extraction.rstnu�[���PK�![�$�AA9�wdoc/alt-python313-setuptools/docs/deprecated/zip_safe.rstnu�[���PK�![9�΁�A��wdoc/alt-python313-setuptools/docs/deprecated/changed_keywords.rstnu�[���PK�![�} $v$vA�xdoc/alt-python313-setuptools/docs/deprecated/distutils/apiref.rstnu�[���PK�![f�`�((C<wydoc/alt-python313-setuptools/docs/deprecated/distutils/examples.rstnu�[���PK�![���A��D��ydoc/alt-python313-setuptools/docs/deprecated/distutils/uploading.rstnu�[���PK�![�{��G'�ydoc/alt-python313-setuptools/docs/deprecated/distutils/packageindex.rstnu�[���PK�![�Y�
&
&EM�ydoc/alt-python313-setuptools/docs/deprecated/distutils/sourcedist.rstnu�[���PK�![���e�K�KD��ydoc/alt-python313-setuptools/docs/deprecated/distutils/builtdist.rstnu�[���PK�![σ�744E�zdoc/alt-python313-setuptools/docs/deprecated/distutils/configfile.rstnu�[���PK�![t����D�-zdoc/alt-python313-setuptools/docs/deprecated/distutils/extending.rstnu�[���PK�![�^I\��E�?zdoc/alt-python313-setuptools/docs/deprecated/distutils/commandref.rstnu�[���PK�![�G3���G?Rzdoc/alt-python313-setuptools/docs/deprecated/distutils/introduction.rstnu�[���PK�![@�G���@<rzdoc/alt-python313-setuptools/docs/deprecated/distutils/index.rstnu�[���PK�![��[��Q�wzdoc/alt-python313-setuptools/docs/deprecated/distutils/_setuptools_disclaimer.rstnu�[���PK�![����fzfzFyzdoc/alt-python313-setuptools/docs/deprecated/distutils/setupscript.rstnu�[���PK�![3wF++A��zdoc/alt-python313-setuptools/docs/deprecated/dependency_links.rstnu�[���PK�![eO<�x�x<x�zdoc/alt-python313-setuptools/docs/deprecated/python_eggs.rstnu�[���PK�![*t),�	�	A�x{doc/alt-python313-setuptools/docs/deprecated/distutils-legacy.rstnu�[���PK�![ƖH__6��{doc/alt-python313-setuptools/docs/deprecated/index.rstnu�[���PK�![V��*�*�=z�{doc/alt-python313-setuptools/docs/deprecated/easy_install.rstnu�[���PK�![n��[��@R|doc/alt-python313-setuptools/docs/deprecated/functionalities.rstnu�[���PK�![SE���*,X|doc/alt-python313-setuptools-wheel/LICENSEnu�[���PK�![�̈��'�\|doc/alt-python313-devel/README.valgrindnu�[���PK�![�L$�9$9$,�o|doc/alt-python313-devel/valgrind-python.suppnu�[���PK�![UvF���  �|doc/alt-python313-pip/README.rstnu�[���PK�![�5��8O8OZ�|man/man1/python3.11.1nu�[���PK�![ĩ��]r
]r
0��|python-wheels/setuptools-65.6.3-py3-none-any.whlnuȯ��PK�![��"�BB&�_�licenses/alt-python311-pip/LICENSE.txtnu�[���PK�![��"�BB,,d�licenses/alt-python311-pip-wheel/LICENSE.txtnu�[���PK�![���� �h�doc/alt-python311-pip/README.rstnu�[���PK�![3�$�""!�t�doc/alt-python311-libs/README.rstnu�[���PK�![�Yď*3��doc/alt-python311-setuptools-wheel/LICENSEnu�[���PK�![3�$�""���doc/alt-python311/README.rstnu�[���PK�![_��$�doc/alt-python311-setuptools/zpl.txtnu�[���PK�![SoD �1�1%]Ɗdoc/alt-python311-setuptools/psfl.txtnu�[���PK�![�Yď$���doc/alt-python311-setuptools/LICENSEnu�[���PK�![�S��
�
5���doc/alt-python311-setuptools/docs/python 2 sunset.rstnu�[���PK�![�D��}}-6�doc/alt-python311-setuptools/docs/artwork.rstnu�[���PK�![��l��0�doc/alt-python311-setuptools/docs/build_meta.rstnu�[���PK�![�rE��:9�doc/alt-python311-setuptools/docs/development/releases.rstnu�[���PK�![��c���A?�doc/alt-python311-setuptools/docs/development/developer-guide.rstnu�[���PK�![$dگ�7iQ�doc/alt-python311-setuptools/docs/development/index.rstnu�[���PK�![�c,_�-�-@W�doc/alt-python311-setuptools/docs/userguide/pyproject_config.rstnu�[���PK�![6�m��1�1B���doc/alt-python311-setuptools/docs/userguide/declarative_config.rstnu�[���PK�![?׷Y/Y/@׷�doc/alt-python311-setuptools/docs/userguide/development_mode.rstnu�[���PK�![����G�G;��doc/alt-python311-setuptools/docs/userguide/entry_point.rstnu�[���PK�![��pU�3�39�/�doc/alt-python311-setuptools/docs/userguide/extension.rstnu�[���PK�![WR�gIgIA,d�doc/alt-python311-setuptools/docs/userguide/package_discovery.rstnu�[���PK�![{�)?)?:��doc/alt-python311-setuptools/docs/userguide/quickstart.rstnu�[���PK�![0v&3K(K(<��doc/alt-python311-setuptools/docs/userguide/distribution.rstnu�[���PK�![�'�G�G9N�doc/alt-python311-setuptools/docs/userguide/datafiles.rstnu�[���PK�![Z���77;�^�doc/alt-python311-setuptools/docs/userguide/ext_modules.rstnu�[���PK�![���ee5J{�doc/alt-python311-setuptools/docs/userguide/index.rstnu�[���PK�![~q�4��=��doc/alt-python311-setuptools/docs/userguide/miscellaneous.rstnu�[���PK�![��Бn-n-Es��doc/alt-python311-setuptools/docs/userguide/dependency_management.rstnu�[���PK�![c�g���-V��doc/alt-python311-setuptools/docs/roadmap.rstnu�[���PK�![�
SpSp3Tdoc/alt-python311-setuptools/docs/pkg_resources.rstnu�[���PK�![U�'�L"L")
3�doc/alt-python311-setuptools/docs/conf.pynu�[���PK�![�OBJLL9�U�doc/alt-python311-setuptools/docs/references/keywords.rstnu�[���PK�![�]i��07��doc/alt-python311-setuptools/docs/setuptools.rstnu�[���PK�![�&5pp-4��doc/alt-python311-setuptools/docs/history.rstnu�[���PK�![ꁓ�00+ŏdoc/alt-python311-setuptools/docs/index.rstnu�[���PK�![)#���s�s9�ȏdoc/alt-python311-setuptools/docs/deprecated/commands.rstnu�[���PK�![�9���D�<�doc/alt-python311-setuptools/docs/deprecated/resource_extraction.rstnu�[���PK�![��h�FF9;I�doc/alt-python311-setuptools/docs/deprecated/zip_safe.rstnu�[���PK�![9�΁�A�W�doc/alt-python311-setuptools/docs/deprecated/changed_keywords.rstnu�[���PK�![�} $v$vA�`�doc/alt-python311-setuptools/docs/deprecated/distutils/apiref.rstnu�[���PK�![f�`�((Cqבdoc/alt-python311-setuptools/docs/deprecated/distutils/examples.rstnu�[���PK�![:X���D�doc/alt-python311-setuptools/docs/deprecated/distutils/uploading.rstnu�[���PK�![I���GH�doc/alt-python311-setuptools/docs/deprecated/distutils/packageindex.rstnu�[���PK�![�Y�
&
&E�doc/alt-python311-setuptools/docs/deprecated/distutils/sourcedist.rstnu�[���PK�![���e�K�KD*�doc/alt-python311-setuptools/docs/deprecated/distutils/builtdist.rstnu�[���PK�![������E	v�doc/alt-python311-setuptools/docs/deprecated/distutils/configfile.rstnu�[���PK�![t����Dl��doc/alt-python311-setuptools/docs/deprecated/distutils/extending.rstnu�[���PK�![�^I\��EΠ�doc/alt-python311-setuptools/docs/deprecated/distutils/commandref.rstnu�[���PK�![�G3���G+��doc/alt-python311-setuptools/docs/deprecated/distutils/introduction.rstnu�[���PK�![@�G���@(Ӓdoc/alt-python311-setuptools/docs/deprecated/distutils/index.rstnu�[���PK�![��[��Q�ؒdoc/alt-python311-setuptools/docs/deprecated/distutils/_setuptools_disclaimer.rstnu�[���PK�![����fzfzF�ْdoc/alt-python311-setuptools/docs/deprecated/distutils/setupscript.rstnu�[���PK�![3wF++A�T�doc/alt-python311-setuptools/docs/deprecated/dependency_links.rstnu�[���PK�![eO<�x�x<d`�doc/alt-python311-setuptools/docs/deprecated/python_eggs.rstnu�[���PK�![5�B	B	A�ٓdoc/alt-python311-setuptools/docs/deprecated/distutils-legacy.rstnu�[���PK�![ƖH__6b�doc/alt-python311-setuptools/docs/deprecated/index.rstnu�[���PK�![�{�a�a�='�doc/alt-python311-setuptools/docs/deprecated/easy_install.rstnu�[���PK�![n��[��@���doc/alt-python311-setuptools/docs/deprecated/functionalities.rstnu�[���PK�![�̈��'��doc/alt-python311-devel/README.valgrindnu�[���PK�![���3{"{",̔doc/alt-python311-devel/valgrind-python.suppnu�[���PK�![蘪zcc��doc/alt-python311-devel/gdbinitnu�[���PK"[���N�N��man/man1/python3.12.1nu�[���PK"[�V+EE,�Q�licenses/alt-python312-pip-wheel/LICENSE.txtnu�[���PK"[�V+EE&!V�licenses/alt-python312-pip/LICENSE.txtnu�[���PK"[UvF��� �Z�doc/alt-python312-pip/README.rstnu�[���PK"[_��$�c�doc/alt-python312-setuptools/zpl.txtnu�[���PK"[SoD �1�1%`l�doc/alt-python312-setuptools/psfl.txtnu�[���PK"[SE���$���doc/alt-python312-setuptools/LICENSEnu�[���PK"[�S��
�
5碕doc/alt-python312-setuptools/docs/python 2 sunset.rstnu�[���PK"[���$CC-��doc/alt-python312-setuptools/docs/artwork.rstnu�[���PK"[�u,�0�Õdoc/alt-python312-setuptools/docs/build_meta.rstnu�[���PK"[�rE��:0ߕdoc/alt-python312-setuptools/docs/development/releases.rstnu�[���PK"[������A'�doc/alt-python312-setuptools/docs/development/developer-guide.rstnu�[���PK"[$dگ�7���doc/alt-python312-setuptools/docs/development/index.rstnu�[���PK"[�0�C9C9@���doc/alt-python312-setuptools/docs/userguide/pyproject_config.rstnu�[���PK"[L���P5P5BI7�doc/alt-python312-setuptools/docs/userguide/declarative_config.rstnu�[���PK"[��A�/�/@m�doc/alt-python312-setuptools/docs/userguide/development_mode.rstnu�[���PK"[@SRϻG�G;o��doc/alt-python312-setuptools/docs/userguide/entry_point.rstnu�[���PK"[��s"�3�39��doc/alt-python312-setuptools/docs/userguide/extension.rstnu�[���PK"[
���sGsGA��doc/alt-python312-setuptools/docs/userguide/package_discovery.rstnu�[���PK"[���Xp?p?:�a�doc/alt-python312-setuptools/docs/userguide/quickstart.rstnu�[���PK"[��j�J(J(<���doc/alt-python312-setuptools/docs/userguide/distribution.rstnu�[���PK"[�8F�M�M9dʗdoc/alt-python312-setuptools/docs/userguide/datafiles.rstnu�[���PK"[�)�FF;��doc/alt-python312-setuptools/docs/userguide/ext_modules.rstnu�[���PK"[���ee5H5�doc/alt-python312-setuptools/docs/userguide/index.rstnu�[���PK"[��"Fa%a%=<�doc/alt-python312-setuptools/docs/userguide/miscellaneous.rstnu�[���PK"[�=��I-I-E�a�doc/alt-python312-setuptools/docs/userguide/dependency_management.rstnu�[���PK"[c�g���-���doc/alt-python312-setuptools/docs/roadmap.rstnu�[���PK"[�ye?`p`p3���doc/alt-python312-setuptools/docs/pkg_resources.rstnu�[���PK"[f4&�g#g#)_�doc/alt-python312-setuptools/docs/conf.pynu�[���PK"[J�ٞMM9%�doc/alt-python312-setuptools/docs/references/keywords.rstnu�[���PK"[V�UZ660�r�doc/alt-python312-setuptools/docs/setuptools.rstnu�[���PK"[{8��mm-��doc/alt-python312-setuptools/docs/history.rstnu�[���PK"[��jKYY+锚doc/alt-python312-setuptools/docs/index.rstnu�[���PK"[�vM��s�s9���doc/alt-python312-setuptools/docs/deprecated/commands.rstnu�[���PK"[�9���D��doc/alt-python312-setuptools/docs/deprecated/resource_extraction.rstnu�[���PK"[�$�AA9K�doc/alt-python312-setuptools/docs/deprecated/zip_safe.rstnu�[���PK"[9�΁�A�'�doc/alt-python312-setuptools/docs/deprecated/changed_keywords.rstnu�[���PK"[�} $v$vA�0�doc/alt-python312-setuptools/docs/deprecated/distutils/apiref.rstnu�[���PK"[f�`�((C|��doc/alt-python312-setuptools/docs/deprecated/distutils/examples.rstnu�[���PK"[���A��D�Ϝdoc/alt-python312-setuptools/docs/deprecated/distutils/uploading.rstnu�[���PK"[�{��Ggќdoc/alt-python312-setuptools/docs/deprecated/distutils/packageindex.rstnu�[���PK"[�Y�
&
&E�Ӝdoc/alt-python312-setuptools/docs/deprecated/distutils/sourcedist.rstnu�[���PK"[���e�K�KD��doc/alt-python312-setuptools/docs/deprecated/distutils/builtdist.rstnu�[���PK"[σ�744EF�doc/alt-python312-setuptools/docs/deprecated/distutils/configfile.rstnu�[���PK"[t����D�]�doc/alt-python312-setuptools/docs/deprecated/distutils/extending.rstnu�[���PK"[�^I\��E"p�doc/alt-python312-setuptools/docs/deprecated/distutils/commandref.rstnu�[���PK"[�G3���G��doc/alt-python312-setuptools/docs/deprecated/distutils/introduction.rstnu�[���PK"[@�G���@|��doc/alt-python312-setuptools/docs/deprecated/distutils/index.rstnu�[���PK"[��[��Qק�doc/alt-python312-setuptools/docs/deprecated/distutils/_setuptools_disclaimer.rstnu�[���PK"[����fzfzF@��doc/alt-python312-setuptools/docs/deprecated/distutils/setupscript.rstnu�[���PK"[3wF++A$�doc/alt-python312-setuptools/docs/deprecated/dependency_links.rstnu�[���PK"[eO<�x�x<�/�doc/alt-python312-setuptools/docs/deprecated/python_eggs.rstnu�[���PK"[*t),�	�	A��doc/alt-python312-setuptools/docs/deprecated/distutils-legacy.rstnu�[���PK"[ƖH__6���doc/alt-python312-setuptools/docs/deprecated/index.rstnu�[���PK"[V��*�*�=���doc/alt-python312-setuptools/docs/deprecated/easy_install.rstnu�[���PK"[n��[��@Q��doc/alt-python312-setuptools/docs/deprecated/functionalities.rstnu�[���PK"[E�&�!�!!l��doc/alt-python312-libs/README.rstnu�[���PK"[�̈��'���doc/alt-python312-devel/README.valgrindnu�[���PK"[7X�$�$,½�doc/alt-python312-devel/valgrind-python.suppnu�[���PK"[E�&�!�!�doc/alt-python312/README.rstnu�[���PK"[SE���*N�doc/alt-python312-setuptools-wheel/LICENSEnu�[���PK�*[��^���	�man/man3/sasl_errdetail.3nu�[���PK�*[������man/man3/sasl_auxprop_getctx.3nu�[���PK�*[��K�{{��man/man3/sasl.3nu�[���PK�*[�tQ.

�'�man/man3/sasl_user_exists.3nu�[���PK�*[�4���)�1�man/man3/sasl_server_userdb_checkpass_t.3nu�[���PK�*[��6��''>�man/man3/sasl_server_userdb_setpass_t.3nu�[���PK�*[V�8NK�man/man3/sasl_checkapop.3nu�[���PK�*[����BB�V�man/man3/sasl_global_listmech.3nu�[���PK�*[;����
�
:_�man/man3/sasl_auxprop_request.3nu�[���PK�*[��mmuj�man/man3/sasl_getopt_t.3nu�[���PK�*[{���ZZ*w�man/man3/sasl_client_step.3nu�[���PK�*[�z���χ�man/man3/sasl_log_t.3nu�[���PK�*[�W��~
~
���man/man3/sasl_checkpass.3nu�[���PK�*[�,��_��man/man3/sasl_setpass.3nu�[���PK�*[��:���.��man/man3/sasl_canon_user_t.3nu�[���PK�*[�s�M�
�
f��man/man3/sasl_chalprompt_t.3nu�[���PK�*[��T"�	�	���man/man3/sasl_authorize_t.3nu�[���PK�*[�		ʠman/man3/sasl_getconfpath_t.3nu�[���PK�*[��j�$$�Ӡman/man3/sasl_getrealm_t.3nu�[���PK�*[�[�##Yߠman/man3/sasl_errors.3nu�[���PK�*[���Q		��man/man3/sasl_getpath_t.3nu�[���PK�*[�c�,O
O
��man/man3/sasl_getsecret_t.3nu�[���PK�*[>��8:
:
��man/man3/sasl_client_init.3nu�[���PK�*["	����8�man/man3/sasl_setprop.3nu�[���PK�*[���**N�man/man3/sasl_getprop.3nu�[���PK�*[PVH����)�man/man3/sasl_client_start.3nu�[���PK�*[c��j66�:�man/man3/sasl_server_new.3nu�[���PK�*[��<���zL�man/man3/sasl_decode.3nu�[���PK�*[߱�4�X�man/man3/sasl_encodev.3nu�[���PK�*[�
��#g�man/man3/sasl_errstring.3nu�[���PK�*[E��ePP�r�man/man3/sasl_idle.3nu�[���PK�*[�-H��
�
{�man/man3/sasl_listmech.3nu�[���PK�*[���558��man/man3/sasl_callbacks.3nu�[���PK�*[
�xx���man/man3/sasl_verifyfile_t.3nu�[���PK�*[@ؾ���z��man/man3/sasl_client_new.3nu�[���PK�*[�(L�		���man/man3/sasl_dispose.3nu�[���PK�*[A�ʟSSman/man3/sasl_server_step.3nu�[���PK�*[�]�K���̡man/man3/sasl_server_start.3nu�[���PK�*[#��-((tۡman/man3/sasl_auxprop.3nu�[���PK�*[�"���man/man3/sasl_encode.3nu�[���PK�*[�2qrr%�man/man3/sasl_server_init.3nu�[���PK�*[^AEE��man/man3/sasl_getsimple_t.3nu�[���PK�*[���oor)�man/man3/sasl_done.3nu�[���PK�*[-�	�	%1�man/man8/sasldblistusers2.8nu�[���PK�*[ήiWW*;�man/man8/pluginviewer.8nu�[���PK�*[�KKpp�J�man/man8/saslpasswd2.8nu�[���PK�*[S
�Ƌ�~W�man/man8/testsaslauthd.8nu�[���PK�*[�ƞ�A A QZ�man/man8/saslauthd.8nu�[���PK�*[�V�]EE#�z�licenses/alt-cyrus-sasl-lib/COPYINGnu�[���PK�*[�R �ÿÿ%n��doc/alt-cyrus-sasl-lib/developer.htmlnu�[���PK�*[.�	��$�B�doc/alt-cyrus-sasl-lib/packager.htmlnu�[���PK�*[Z��T����!��doc/alt-cyrus-sasl-lib/index.htmlnu�[���PK�*[�7ll��#ɤdoc/alt-cyrus-sasl-lib/getsasl.htmlnu�[���PK�*[���4�4�#�r�doc/alt-cyrus-sasl-lib/support.htmlnu�[���PK�*[vu,��$�doc/alt-cyrus-sasl-lib/genindex.htmlnu�[���PK�*[H{���34�doc/alt-cyrus-sasl-lib/AUTHORSnu�[���PK�*[c����!K=�doc/alt-cyrus-sasl-lib/setup.htmlnu�[���PK�*[ �r�r�&|��doc/alt-cyrus-sasl-lib/operations.htmlnu�[���PK�*[K�6���$D�doc/alt-cyrus-sasl-lib/download.htmlnu�[���PK�*[�|8�8�"���doc/alt-cyrus-sasl-lib/search.htmlnu�[���PK�*[5��߸$�$!:Q�doc/alt-cyrus-sasl/LDAP_SASLAUTHDnu�[���PK�N[�l�Cv�licenses/alt-php82-vld/LICENSEnu�[���PK�N[p���(�{�licenses/alt-php82-snuffleupagus/LICENSEnu�[���PK�N[Pi��癪pear/.depdbnu�[���PK�N[�{��۪�pear/Mail/null.phpnu�[���PK�N[E@�%>>���pear/Mail/sendmail.phpnu�[���PK�N[��A~�{�{�ժpear/Mail/RFC822.phpnu�[���PK�N[�+V����VQ�pear/Mail/mime.phpnu�[���PK�N[x�ع���D(�pear/Mail/mimeDecode.phpnu�[���PK�N[B�_Ǭ=�=E¬pear/Mail/smtp.phpnu�[���PK�N[wԐE;E;3�pear/Mail/smtpmx.phpnu�[���PK�N[�؛�J�J��;�pear/Mail/mimePart.phpnu�[���PK�N[B��shhL�pear/Mail/mock.phpnu�[���PK�N[@iE�\\��pear/Mail/mail.phpnu�[���PK�N[�*�z%-%-%��pear/Structures/LinkedList/Double.phpnu�[���PK�N[����p:p:%M�pear/Structures/LinkedList/Single.phpnu�[���PK�N[�J�}
}
Ӈ�pear/Auth/SASL/Anonymous.phpnu�[���PK�N[P(~�T
T
���pear/Auth/SASL/CramMD5.phpnu�[���PK�N[����==:��pear/Auth/SASL/Plain.phpnu�[���PK�N[�<� OO���pear/Auth/SASL/Login.phpnu�[���PK�N[%ׅtg!g!V��pear/Auth/SASL/DigestMD5.phpnu�[���PK�N[�T�	ޮpear/Auth/SASL/Common.phpnu�[���PK�N[vR�r,,h�pear/Auth/SASL/External.phpnu�[���PK�N[ќ��0�0��pear/Auth/SASL/SCRAM.phpnu�[���PK�N[2r����"-�pear/Auth/SASL.phpnu�[���PK�N[��
����9B�pear/Net/IDNA2.phpnu�[���PK�N[���S66(ٰpear/Net/IDNA2/Exception.phpnu�[���PK�N[&��#rr%�ٰpear/Net/IDNA2/Exception/Nameprep.phpnu�[���PK�N[����Z�Z�qڰpear/Net/Sieve.phpnu�[���PK�N[z��|����
��pear/Net/SMTP.phpnu�[���PK�N[���NFUFU�O�pear/Net/Socket.phpnu�[���PK�N[W��pear/.depdblocknu�[���PK�N[�/f�����pear/File/MARCBASE.phpnu�[���PK�N[5F	'�"�"i��pear/File/MARCXML.phpnu�[���PK�N[Sbw�{7{7Dܲpear/File/MARC.phpnu�[���PK�N[�9g4xUxU�pear/File/MARC/Record.phpnu�[���PK�N[(#�~���i�pear/File/MARC/Exception.phpnu�[���PK�N[�S��hh���pear/File/MARC/List.phpnu�[���PK�N[�+����C��pear/File/MARC/Field.phpnu�[���PK�N[�IC�(A(A W��pear/File/MARC/Lint/CodeData.phpnu�[���PK�N[R��A;A;��pear/File/MARC/Data_Field.phpnu�[���PK�N[lz�` ]:�pear/File/MARC/Control_Field.phpnu�[���PK�N[Ɍ5��9�9�L�pear/File/MARC/Lint.phpnu�[���PK�N[7�*c��ֆ�pear/File/MARC/Subfield.phpnu�[���PK�N[�1����:㝶pear/test/Structures_LinkedList/tests/single_link_007.phptnu�[���PK�N[�Z�x��:��pear/test/Structures_LinkedList/tests/single_link_002.phptnu�[���PK�N[(��  3)��pear/test/Structures_LinkedList/tests/link_004.phptnu�[���PK�N[���|��:���pear/test/Structures_LinkedList/tests/SingleLinkTester.phpnu�[���PK�N[髂[��:䪶pear/test/Structures_LinkedList/tests/single_link_006.phptnu�[���PK�N[s��DHH3:��pear/test/Structures_LinkedList/tests/link_007.phptnu�[���PK�N[�����3崶pear/test/Structures_LinkedList/tests/link_005.phptnu�[���PK�N[�#,E��:#��pear/test/Structures_LinkedList/tests/single_link_005.phptnu�[���PK�N[����4o��pear/test/Structures_LinkedList/tests/LinkTester.phpnu�[���PK�N[� ���3���pear/test/Structures_LinkedList/tests/link_001.phptnu�[���PK�N[骗���3�Ŷpear/test/Structures_LinkedList/tests/link_006.phptnu�[���PK�N[��)��3?ʶpear/test/Structures_LinkedList/tests/link_002.phptnu�[���PK�N[�4����:EͶpear/test/Structures_LinkedList/tests/single_link_001.phptnu�[���PK�N[)�y--:�Ѷpear/test/Structures_LinkedList/tests/single_link_004.phptnu�[���PK�N[�K��:.Զpear/test/Structures_LinkedList/tests/single_link_003.phptnu�[���PK�N[�o���3�ضpear/test/Structures_LinkedList/tests/link_003.phptnu�[���PK�N[�x`(��"�ܶpear/test/Mail/tests/bug17317.phptnu�[���PK�N[��q/���޶pear/test/Mail/tests/13659.phptnu�[���PK�N[�ó��� ��pear/test/Mail/tests/9137_2.phptnu�[���PK�N[w�����$��pear/test/Mail/tests/smtp_error.phptnu�[���PK�N[)f$�!! �pear/test/Mail/tests/rfc822.phptnu�[���PK�N[8x����"y��pear/test/Mail/tests/bug17178.phptnu�[���PK�N[*�������pear/test/Mail/tests/9137.phptnu�[���PK�N[?7��EE>�pear/test/Net_IDNA2/tests/draft-josefsson-idn-test-vectors.phpnu�[���PK�N[E��mm+k@�pear/test/Net_IDNA2/tests/Net_IDNA2Test.phpnu�[���PK�N[<ȸB!!"3I�pear/test/Net_SMTP/tests/auth.phptnu�[���PK�N[�߁Q��'�K�pear/test/Net_SMTP/tests/quotedata.phptnu�[���PK�N[�*�W��#�S�pear/test/Net_SMTP/tests/basic.phptnu�[���PK�N[�6����(�W�pear/test/Net_SMTP/tests/config.php.distnu�[���PK�N[����)�Y�pear/test/Net_Sieve/tests/largescript.sivnu�[���PK�N[�g��-�-'x�pear/test/Net_Sieve/tests/SieveTest.phpnu�[���PK�N[�Y�npp)��pear/test/Net_Sieve/tests/config.php.distnu�[���PK�N[ҵ3��C妺pear/test/Mail_mimeDecode/tests/semicolon_content_type_bug1724.phptnu�[���PK�N[s��%��7�pear/test/Mail_mimeDecode/tests/parse_header_value.phptnu�[���PK�N[;�{��,첺pear/test/Mail_Mime/tests/test_Bug_GH19.phptnu�[���PK�N[�E�oo--��pear/test/Mail_Mime/tests/test_Bug_13962.phptnu�[���PK�N[Ԣ��``-���pear/test/Mail_Mime/tests/test_Bug_21255.phptnu�[���PK�N[i;���.���pear/test/Mail_Mime/tests/test_Bug_7561_1.phptnu�[���PK�N[e;�I-���pear/test/Mail_Mime/tests/test_Bug_21205.phptnu�[���PK�N[Y�����,úpear/test/Mail_Mime/tests/test_Bug_GH26.phptnu�[���PK�N[��RoUU-cƺpear/test/Mail_Mime/tests/test_Bug_20226.phptnu�[���PK�N[g��+��-Ⱥpear/test/Mail_Mime/tests/test_Bug_13444.phptnu�[���PK�N[%��BB,˺pear/test/Mail_Mime/tests/test_Bug_GH16.phptnu�[���PK�N[�-7c77.�Ѻpear/test/Mail_Mime/tests/test_Bug_3513_2.phptnu�[���PK�N[�(V,��-CԺpear/test/Mail_Mime/tests/test_Bug_12411.phptnu�[���PK�N[��qS��/)׺pear/test/Mail_Mime/tests/test_Bug_10999_1.phptnu�[���PK�N[29r���,sٺpear/test/Mail_Mime/tests/encoding_case.phptnu�[���PK�N[M�-\��-�ںpear/test/Mail_Mime/tests/test_Bug_17175.phptnu�[���PK�N[ّB�
�
/�ݺpear/test/Mail_Mime/tests/qp_encoding_test.phptnu�[���PK�N[)#��pp-�pear/test/Mail_Mime/tests/test_Bug_18772.phptnu�[���PK�N[2!�B��1��pear/test/Mail_Mime/tests/test_linebreak_dot.phptnu�[���PK�N[B&���-�pear/test/Mail_Mime/tests/test_Bug_12466.phptnu�[���PK�N[�M�U..-���pear/test/Mail_Mime/tests/test_Bug_20273.phptnu�[���PK�N[[��b��8���pear/test/Mail_Mime/tests/content_transfer_encoding.phptnu�[���PK�N[�k�0-���pear/test/Mail_Mime/tests/test_Bug_20564.phptnu�[���PK�N[�a�[��-���pear/test/Mail_Mime/tests/class-filename.phptnu�[���PK�N[���o		-D�pear/test/Mail_Mime/tests/test_Bug_14529.phptnu�[���PK�N[Cz2�}}-��pear/test/Mail_Mime/tests/test_Bug_12165.phptnu�[���PK�N[Ya�k!!=��pear/test/Mail_Mime/tests/sleep_wakeup_EOL-bug3488-part1.phptnu�[���PK�N[@�/�NN-�pear/test/Mail_Mime/tests/test_Bug_21206.phptnu�[���PK�N[�8��.�
�pear/test/Mail_Mime/tests/test_Bug_3513_1.phptnu�[���PK�N[5����-��pear/test/Mail_Mime/tests/test_Bug_21098.phptnu�[���PK�N[���v��.��pear/test/Mail_Mime/tests/test_Bug_8541_1.phptnu�[���PK�N[Ui�E!E!7*�pear/test/Mail_Mime/tests/headers_without_mbstring.phptnu�[���PK�N[��-�2�pear/test/Mail_Mime/tests/test_Bug_21027.phptnu�[���PK�N[`�~@/�O�pear/test/Mail_Mime/tests/test_Bug_12385_1.phptnu�[���PK�N[�zŬ�-,R�pear/test/Mail_Mime/tests/test_Bug_11731.phptnu�[���PK�N[X��b��-5U�pear/test/Mail_Mime/tests/test_Bug_14779.phptnu�[���PK�N[�I�zz-{W�pear/test/Mail_Mime/tests/test_Bug_20563.phptnu�[���PK�N[ZX�Hww.RY�pear/test/Mail_Mime/tests/test_Bug_3513_3.phptnu�[���PK�N[������-'\�pear/test/Mail_Mime/tests/test_Bug_15320.phptnu�[���PK�N[�-b2-R^�pear/test/Mail_Mime/tests/test_Bug_13032.phptnu�[���PK�N[%+2PP-�`�pear/test/Mail_Mime/tests/test_Bug_18083.phptnu�[���PK�N[Qi�"---wc�pear/test/Mail_Mime/tests/test_Bug_11381.phptnu�[���PK�N[�X�##-f�pear/test/Mail_Mime/tests/test_Bug_19497.phptnu�[���PK�N[�'�''.�h�pear/test/Mail_Mime/tests/test_Bug_8386_1.phptnu�[���PK�N[��1d��-k�pear/test/Mail_Mime/tests/test_Bug_17025.phptnu�[���PK�N[e�@Q__-�l�pear/test/Mail_Mime/tests/test_Bug_14780.phptnu�[���PK�N[�
Ǟ		7�n�pear/test/Mail_Mime/tests/test_linebreak_larger_76.phptnu�[���PK�N[ܶg�hh.%x�pear/test/Mail_Mime/tests/test_Bug_9722_1.phptnu�[���PK�N[�YcLYY-�y�pear/test/Mail_Mime/tests/test_Bug_16539.phptnu�[���PK�N[��((/���pear/test/Mail_Mime/tests/test_Bug_10596_1.phptnu�[���PK�N[9��::/(��pear/test/Mail_Mime/tests/test_Bug_10816_1.phptnu�[���PK�N[��᠗"�"4���pear/test/Mail_Mime/tests/headers_with_mbstring.phptnu�[���PK�N[���|JJ=���pear/test/Mail_Mime/tests/sleep_wakeup_EOL-bug3488-part2.phptnu�[���PK�N[�{�	�	/s��pear/test/File_MARC/tests/marc_xml_rsinger.phptnu�[���PK�N[a!���'�˻pear/test/File_MARC/tests/namespace.xmlnu�[���PK�N[44�-��-��pear/test/File_MARC/tests/marc_field_003.phptnu�[���PK�N[�c����-��pear/test/File_MARC/tests/marc_xml_16642.phptnu�[���PK�N[�è{{'���pear/test/File_MARC/tests/marc_020.phptnu�[���PK�N[Ҕ��	�	)_�pear/test/File_MARC/tests/marc_16783.phptnu�[���PK�N[F�-//-r�pear/test/File_MARC/tests/marc_field_002.phptnu�[���PK�N[��	\��,��pear/test/File_MARC/tests/marc_lint_001.phptnu�[���PK�N[rP��+�$�pear/test/File_MARC/tests/marc_xml_004.phptnu�[���PK�N[�0�S��0h0�pear/test/File_MARC/tests/marc_subfield_001.phptnu�[���PK�N[x;��##'�3�pear/test/File_MARC/tests/marc_006.phptnu�[���PK�N[}&�
GG,9�pear/test/File_MARC/tests/marc_lint_004.phptnu�[���PK�N[�cܯ�+�M�pear/test/File_MARC/tests/marc_xml_006.phptnu�[���PK�N[���
��-�S�pear/test/File_MARC/tests/marc_field_005.phptnu�[���PK�N[��%Hhh' X�pear/test/File_MARC/tests/marc_003.phptnu�[���PK�N[(���NN#�]�pear/test/File_MARC/tests/camel.mrcnu�[���PK�N[�p�޸�'�y�pear/test/File_MARC/tests/marc_007.phptnu�[���PK�N[����1�1+�~�pear/test/File_MARC/tests/marc_xml_008.phptnu�[���PK�N[)�]�
�
'l��pear/test/File_MARC/tests/marc_005.phptnu�[���PK�N[	V�U,,/r��pear/test/File_MARC/tests/marc_field_21246.phptnu�[���PK�N[�_|6	6	,���pear/test/File_MARC/tests/marc_lint_002.phptnu�[���PK�N[�=O	
	
&�˼pear/test/File_MARC/tests/sandburg.xmlnu�[���PK�N[�s}���8�ؼpear/test/File_MARC/tests/marc_xml_namespace_prefix.phptnu�[���PK�N[!Ņ\��+ܼpear/test/File_MARC/tests/marc_xml_001.phptnu�[���PK�N[F;�Re%e%'I��pear/test/File_MARC/tests/marc_004.phptnu�[���PK�N[�jS�' �pear/test/File_MARC/tests/marc_015.phptnu�[���PK�N[7�'h3�pear/test/File_MARC/tests/marc_009.phptnu�[���PK�N[(Y����'�9�pear/test/File_MARC/tests/xmlescape.mrcnu�[���PK�N[�2�.ii'�<�pear/test/File_MARC/tests/marc_018.phptnu�[���PK�N[8��11.�I�pear/test/File_MARC/tests/marc_record_001.phptnu�[���PK�N[2���$CL�pear/test/File_MARC/tests/skipif.incnu�[���PK�N[\.i�vv&HM�pear/test/File_MARC/tests/sandburg.mrcnu�[���PK�N[#c����'R�pear/test/File_MARC/tests/onerecord.xmlnu�[���PK�N[�_X���-W_�pear/test/File_MARC/tests/marc_field_004.phptnu�[���PK�N[.%�``']c�pear/test/File_MARC/tests/marc_010.phptnu�[���PK�N[B�1��
�
,v�pear/test/File_MARC/tests/marc_lint_005.phptnu�[���PK�N[ye@��+�pear/test/File_MARC/tests/marc_xml_007.phptnu�[���PK�N[�����')��pear/test/File_MARC/tests/marc_008.phptnu�[���PK�N[+W��
�
(^��pear/test/File_MARC/tests/bigarchive.xmlnu�[���PK�N[��ԛ�
�
'p��pear/test/File_MARC/tests/marc_014.phptnu�[���PK�N[�����1���pear/test/File_MARC/tests/marc_xml_namespace.phptnu�[���PK�N[f��~-립pear/test/File_MARC/tests/marc_field_001.phptnu�[���PK�N[���YY+Ǫ�pear/test/File_MARC/tests/marc_xml_009.phptnu�[���PK�N[~N0�::%{��pear/test/File_MARC/tests/example.mrcnu�[���PK�N[}۶\pp)
��pear/test/File_MARC/tests/bad_example.xmlnu�[���PK�N[9�DD'�ӽpear/test/File_MARC/tests/marc_017.phptnu�[���PK�N[�&��cc'n�pear/test/File_MARC/tests/marc_002.phptnu�[���PK�N[�����+(��pear/test/File_MARC/tests/marc_xml_005.phptnu�[���PK�N[�5;�-�-#n��pear/test/File_MARC/tests/music.xmlnu�[���PK�N[��`��'F+�pear/test/File_MARC/tests/marc_012.phptnu�[���PK�N[�S3'�2�pear/test/File_MARC/tests/marc_021.phptnu�[���PK�N[<��--0�E�pear/test/File_MARC/tests/marc_subfield_002.phptnu�[���PK�N[�f==)�J�pear/test/File_MARC/tests/bad_example.mrcnu�[���PK�N[�kP�'R�pear/test/File_MARC/tests/marc_023.phptnu�[���PK�N[W��))'�T�pear/test/File_MARC/tests/marc_019.phptnu�[���PK�N[�泮�#e�pear/test/File_MARC/tests/music.mrcnu�[���PK�N[E4kL�	�	'v�pear/test/File_MARC/tests/marc_001.phptnu�[���PK�N[�#"�
)
)'3��pear/test/File_MARC/tests/marc_022.phptnu�[���PK�N[�p̎u1u1'���pear/test/File_MARC/tests/marc_016.phptnu�[���PK�N[O~iK!K!'`۾pear/test/File_MARC/tests/marc_013.phptnu�[���PK�N[e����
�
'��pear/test/File_MARC/tests/marc_011.phptnu�[���PK�N[�>���+�pear/test/File_MARC/tests/marc_xml_003.phptnu�[���PK�N[N���&&+P�pear/test/File_MARC/tests/marc_xml_002.phptnu�[���PK�N[y���
�
,��pear/test/File_MARC/tests/marc_lint_003.phptnu�[���PK�N[6E�WW#(�pear/data/Mail_mimeDecode/xmail.xslnu�[���PK�N[�
$v66#�0�pear/data/Mail_mimeDecode/xmail.dtdnu�[���PK�N[P'hB�&�&
K3�pear/Mail.phpnu�[���PK�N[ȗ��&Z�pear/.pkgxml/Pear_Net_Socket-1.2.2.xmlnu�[���PK�N[�/�h����'|b�pear/.pkgxml/Pear_Mail_Mime-1.10.11.xmlnu�[���PK�N[%ONO��+���pear/.pkgxml/Pear_Mail_mimeDecode-1.5.6.xmlnu�[���PK�N[�0$�--%��pear/.pkgxml/Pear_File_MARC-1.4.1.xmlnu�[���PK�N[#�r�

%@�pear/.pkgxml/Pear_Net_SMTP-1.10.0.xmlnu�[���PK�N[�Q���?�?%mJ�pear/.pkgxml/Pear_Net_Sieve-1.4.5.xmlnu�[���PK�N[��c���%t��pear/.pkgxml/Pear_Auth_SASL-1.1.0.xmlnu�[���PK�N[z�WzDD%���pear/.pkgxml/Pear_Net_IDNA2-0.2.0.xmlnu�[���PK�N[����G��pear/.pkgxml/Pear.listnu�[���PK�N[�3�--1���pear/.pkgxml/Pear_Structures_LinkedList-0.2.2.xmlnu�[���PK�N[Z2�iHH ��pear/.pkgxml/Pear_Mail-1.4.1.xmlnu�[���PK�N[	�_[S)S)��pear/.registry/mail.regnu�[���PK�N[�f�$ENEN@��pear/.registry/net_sieve.regnu�[���PK�N[�%Sh(�(��H�pear/.registry/file_marc.regnu�[���PK�N[<8:+:+"E�pear/.registry/mail_mimedecode.regnu�[���PK�N[���9II��pear/.registry/net_smtp.regnu�[���PK�N[�e-�pear/.registry/net_idna2.regnu�[���PK�N[�,{�.�.��F�pear/.registry/mail_mime.regnu�[���PK�N[��$,6,6(6+�pear/.registry/structures_linkedlist.regnu�[���PK�N[��3����a�pear/.registry/net_socket.regnu�[���PK�N[��|&|&�r�pear/.registry/auth_sasl.regnu�[���PK�N[g�R��(���doc/pear/Structures_LinkedList/CHANGELOGnu�[���PK�N[���
�
?ϝ�doc/pear/Structures_LinkedList/examples/single_link_example.phpnu�[���PK�N[p��||?���doc/pear/Structures_LinkedList/examples/double_link_example.phpnu�[���PK�N[���^,^,&��doc/pear/Structures_LinkedList/LICENSEnu�[���PK�N[�������doc/pear/Mail/LICENSEnu�[���PK�N[y˿������doc/pear/Net_Socket/README.mdnu�[���PK�N[W]H������doc/pear/Net_Socket/LICENSEnu�[���PK�N[TkU�$6��doc/pear/Net_SMTP/examples/basic.phpnu�[���PK�N[�SOܪ%�%���doc/pear/Net_SMTP/README.rstnu�[���PK�N[����((��doc/pear/Net_SMTP/LICENSEnu�[���PK�N[���!!	!�doc/pear/File_MARC/CHANGELOGnu�[���PK�N[��~���$v8�doc/pear/File_MARC/examples/read.phpnu�[���PK�N[���)�=�doc/pear/File_MARC/examples/subfields.phpnu�[���PK�N[cV����(�B�doc/pear/File_MARC/examples/marc_yaz.phpnu�[���PK�N[~N0�::'H�doc/pear/File_MARC/examples/example.mrcnu�[���PK�N[���DgDg�O�doc/pear/File_MARC/LICENSEnu�[���PK�N[c��^0,0,++��doc/alt-php82-ioncube-loader/USER-GUIDE.txtnu�[���PK�N[}��6�6�+���doc/alt-php82-ioncube-loader/USER-GUIDE.pdfnu�[���PK�N[&�**(G�doc/alt-php82-ioncube-loader/LICENSE.txtnu�[���PK�N[�_Y@����.���doc/alt-php82-ioncube-loader/loader-wizard.phpnu�[���PK�N[P�$���'�m�doc/alt-php82-ioncube-loader/README.txtnu�[���PK�N[$�u���%3~�doc/alt-php82-snuffleupagus/README.mdnu�[���PK�N[�E#/&&+?��doc/alt-php82-snuffleupagus/CONTRIBUTING.mdnu�[���PKAb[p���(���licenses/alt-php83-snuffleupagus/LICENSEnu�[���PK[b[$�u���%���doc/alt-php83-snuffleupagus/README.mdnu�[���PK[b[�E#/&&+��doc/alt-php83-snuffleupagus/CONTRIBUTING.mdnu�[���PK[b[c��^0,0,+���doc/alt-php83-ioncube-loader/USER-GUIDE.txtnu�[���PK\b[}��6�6�+*�doc/alt-php83-ioncube-loader/USER-GUIDE.pdfnu�[���PK\b[&�**(���doc/alt-php83-ioncube-loader/LICENSE.txtnu�[���PK]b[�_Y@����.��doc/alt-php83-ioncube-loader/loader-wizard.phpnu�[���PK]b[P�$���'P��doc/alt-php83-ioncube-loader/README.txtnu�[���PK�f[p���(���licenses/alt-php81-snuffleupagus/LICENSEnu�[���PK�f[�l����licenses/alt-php81-vld/LICENSEnu�[���PK�f[$�u���%4��doc/alt-php81-snuffleupagus/README.mdnu�[���PK�f[�E#/&&+@�doc/alt-php81-snuffleupagus/CONTRIBUTING.mdnu�[���PK�f[c��^0,0,+��doc/alt-php81-ioncube-loader/USER-GUIDE.txtnu�[���PK�f[}��6�6�+LE�doc/alt-php81-ioncube-loader/USER-GUIDE.pdfnu�[���PK�f[&�**(���doc/alt-php81-ioncube-loader/LICENSE.txtnu�[���PK�f[�_Y@����.E�doc/alt-php81-ioncube-loader/loader-wizard.phpnu�[���PK�f[P�$���'���doc/alt-php81-ioncube-loader/README.txtnu�[���PK�f[�L�{���man/man1/zts-phpdbg.1nu�[���PK�f[G���&��man/man1/zts-php-cgi.1nu�[���PK�f[Z�?N��{��man/man1/zts-php-config.1nu�[���PK�f[E�4%%���man/man1/zts-php.1nu�[���PK�f[5����man/man1/zts-phpize.1nu�[���PK�f[p���(J�licenses/alt-php72-snuffleupagus/LICENSEnu�[���PK�f[�l��:�licenses/alt-php72-vld/LICENSEnu�[���PK�f[$�u���%�?�doc/alt-php72-snuffleupagus/README.mdnu�[���PK�f[�E#/&&+�Y�doc/alt-php72-snuffleupagus/CONTRIBUTING.mdnu�[���PK�f[c��^0,0,+{p�doc/alt-php72-ioncube-loader/USER-GUIDE.txtnu�[���PK�f[}��6�6�+��doc/alt-php72-ioncube-loader/USER-GUIDE.pdfnu�[���PK�f[&�**(�8�doc/alt-php72-ioncube-loader/LICENSE.txtnu�[���PK�f[�_Y@����.�b�doc/alt-php72-ioncube-loader/loader-wizard.phpnu�[���PK�f[P�$���'C'�doc/alt-php72-ioncube-loader/README.txtnu�[���PKh[p���(�7�licenses/alt-php80-snuffleupagus/LICENSEnu�[���PKh[�l��U�licenses/alt-php80-vld/LICENSEnu�[���PK!h[$�u���%'[�doc/alt-php80-snuffleupagus/README.mdnu�[���PK!h[�E#/&&+3u�doc/alt-php80-snuffleupagus/CONTRIBUTING.mdnu�[���PK*|[��z����man/man1/ruby.1.gznu�[���PK*|[�_��	�	#��doc/alt-ruby18-rubygems/LICENSE.txtnu�[���PK+|[oM~@@���doc/alt-ruby18-rubygems/MIT.txtnu�[���PK+|[�W;��#���doc/alt-ruby18-rubygems/README.rdocnu�[���PK+|[�����#���doc/alt-ruby18-rubygems/History.txtnu�[���PK,|[?� �����doc/alt-ruby18/README.janu�[���PK,|[	�h
h
̪�doc/alt-ruby18/ChangeLognu�[���PK,|[�R�2�6�6|��doc/alt-ruby18/NEWSnu�[���PK,|[R�Z$--m��doc/alt-ruby18/COPYING.janu�[���PK-|[�W�4~4~��doc/alt-ruby18/README.EXTnu�[���PK-|[#6��ODOD`��doc/alt-ruby18/LEGALnu�[���PK-|[ڻ��5�5����doc/alt-ruby18/README.EXT.janu�[���PK-|[�¦��	�	tR�doc/alt-ruby18/COPYINGnu�[���PK-|[��)8���\�doc/alt-ruby18/READMEnu�[���PK-|[�2��>g>gYi�doc/alt-ruby18/LGPLnu�[���PK.|[	R0�YFYF���doc/alt-ruby18/GPLnu�[���PK.|[c�x�� u�ri/1.8/system/Fixnum/size-i.yamlnu�[���PK.|[�#�QQ"��ri/1.8/system/Fixnum/rpower-i.yamlnu�[���PK.|[��f3"#�ri/1.8/system/Fixnum/odd%3f-i.yamlnu�[���PK.|[�CBbb��ri/1.8/system/Fixnum/%25-i.yamlnu�[���PK.|[�1j�WW"@�ri/1.8/system/Fixnum/%5b%5d-i.yamlnu�[���PK/|[�A�s�� � �ri/1.8/system/Fixnum/fdiv-i.yamlnu�[���PK/|[>E��"#�ri/1.8/system/Fixnum/%2a%2a-i.yamlnu�[���PK/|[��Z��%L$�ri/1.8/system/Fixnum/%3c%3d%3e-i.yamlnu�[���PK/|[��.���=&�ri/1.8/system/Fixnum/%2f-i.yamlnu�[���PK/|[��B���_'�ri/1.8/system/Fixnum/%7c-i.yamlnu�[���PK/|[���		"�(�ri/1.8/system/Fixnum/divmod-i.yamlnu�[���PK0|[�S����)�ri/1.8/system/Fixnum/%26-i.yamlnu�[���PK0|[Z�-�22/+�ri/1.8/system/Fixnum/quo-i.yamlnu�[���PK0|[��;;�-�ri/1.8/system/Fixnum/%3c-i.yamlnu�[���PK0|[Y�DRII":/�ri/1.8/system/Fixnum/%3c%3d-i.yamlnu�[���PK0|[|�5���#�0�ri/1.8/system/Fixnum/id2name-i.yamlnu�[���PK0|[�jʧkk�3�ri/1.8/system/Fixnum/abs-i.yamlnu�[���PK0|[#��OO"�5�ri/1.8/system/Fixnum/%3e%3d-i.yamlnu�[���PK0|['>��qqP7�ri/1.8/system/Fixnum/%2a-i.yamlnu�[���PK0|[+ך`��$9�ri/1.8/system/Fixnum/power%21-i.yamlnu�[���PK1|[��Yt@:�ri/1.8/system/Fixnum/%7e-i.yamlnu�[���PK1|[�&��� �;�ri/1.8/system/Fixnum/rdiv-i.yamlnu�[���PK1|[��ó��"�<�ri/1.8/system/Fixnum/to_sym-i.yamlnu�[���PK1|[GD�!;;"�>�ri/1.8/system/Fixnum/%3e%3e-i.yamlnu�[���PK1|[����KK&v@�ri/1.8/system/Fixnum/cdesc-Fixnum.yamlnu�[���PK1|[���N#L�ri/1.8/system/Fixnum/zero%3f-i.yamlnu�[���PK1|[s8q6ii�M�ri/1.8/system/Fixnum/%2b-i.yamlnu�[���PK1|[4��;;"9O�ri/1.8/system/Fixnum/%3c%3c-i.yamlnu�[���PK1|[�S>#�P�ri/1.8/system/Fixnum/even%3f-i.yamlnu�[���PK2|[	���� 7R�ri/1.8/system/Fixnum/to_s-i.yamlnu�[���PK2|[rҨ@@U�ri/1.8/system/Fixnum/%3e-i.yamlnu�[���PK2|[
w�zz"�V�ri/1.8/system/Fixnum/%3d%3d-i.yamlnu�[���PK2|[���aqq(tX�ri/1.8/system/Fixnum/induced_from-c.yamlnu�[���PK2|[[�9"=Z�ri/1.8/system/Fixnum/%2d%40-i.yamlnu�[���PK2|[�#����[�ri/1.8/system/Fixnum/div-i.yamlnu�[���PK2|[Xha���]�ri/1.8/system/Fixnum/%5e-i.yamlnu�[���PK2|[�wþ��"�^�ri/1.8/system/Fixnum/dclone-i.yamlnu�[���PK2|[�" �_�ri/1.8/system/Fixnum/to_f-i.yamlnu�[���PK3|[���jj"a�ri/1.8/system/Fixnum/modulo-i.yamlnu�[���PK3|[tv�`nn�b�ri/1.8/system/Fixnum/%2d-i.yamlnu�[���PK3|[�_�.�d�ri/1.8/system/GetoptLong/cdesc-GetoptLong.yamlnu�[���PK3|[DA

+�s�ri/1.8/system/GetoptLong/ordering%3d-i.yamlnu�[���PK3|[q�L��)[~�ri/1.8/system/GetoptLong/terminate-i.yamlnu�[���PK3|[<]��$��ri/1.8/system/GetoptLong/each-i.yamlnu�[���PK3|[k9"<��+���ri/1.8/system/GetoptLong/each_option-i.yamlnu�[���PK3|[,#5�AA-���ri/1.8/system/GetoptLong/error_message-i.yamlnu�[���PK3|[�%�~~+���ri/1.8/system/GetoptLong/set_options-i.yamlnu�[���PK3|[l�A���?v��ri/1.8/system/GetoptLong/InvalidOption/cdesc-InvalidOption.yamlnu�[���PK3|[]�q-���ri/1.8/system/GetoptLong/terminated%3f-i.yamlnu�[���PK3|[�����//��ri/1.8/system/GetoptLong/Error/cdesc-Error.yamlnu�[���PK3|[��K���*���ri/1.8/system/GetoptLong/get_option-i.yamlnu�[���PK3|[e؉���#ʌ�ri/1.8/system/GetoptLong/get-i.yamlnu�[���PK4|[F��!��C���ri/1.8/system/GetoptLong/MissingArgument/cdesc-MissingArgument.yamlnu�[���PK4|[���k��)��ri/1.8/system/GetoptLong/set_error-i.yamlnu�[���PK4|[�I4  #G��ri/1.8/system/GetoptLong/new-c.yamlnu�[���PK4|[�����A���ri/1.8/system/GetoptLong/AmbigousOption/cdesc-AmbigousOption.yamlnu�[���PK4|[̺q���E���ri/1.8/system/GetoptLong/NeedlessArgument/cdesc-NeedlessArgument.yamlnu�[���PK4|[�`���&L��ri/1.8/system/RubyLex/set_input-i.yamlnu�[���PK5|[dK���-���ri/1.8/system/RubyLex/identify_comment-i.yamlnu�[���PK5|[rјū�%���ri/1.8/system/RubyLex/lex_init-i.yamlnu�[���PK5|[�����/���ri/1.8/system/RubyLex/identify_quotation-i.yamlnu�[���PK5|[�'�è�!ɝ�ri/1.8/system/RubyLex/peek-i.yamlnu�[���PK5|[�i���-ž�ri/1.8/system/RubyLex/initialize_input-i.yamlnu�[���PK6|[q�O��&ڟ�ri/1.8/system/RubyLex/buf_input-i.yamlnu�[���PK6|[���s��#ޠ�ri/1.8/system/RubyLex/prompt-i.yamlnu�[���PK6|[�����%ء�ri/1.8/system/RubyLex/debug%3f-c.yamlnu�[���PK6|[z�c���'Ԣ�ri/1.8/system/RubyLex/set_prompt-i.yamlnu�[���PK6|[<�I���$��ri/1.8/system/RubyLex/line_no-i.yamlnu�[���PK6|[VɃ���(��ri/1.8/system/RubyLex/read_escape-i.yamlnu�[���PK6|[׌J8��# ��ri/1.8/system/RubyLex/ungetc-i.yamlnu�[���PK6|[w����*!��ri/1.8/system/RubyLex/identify_gvar-i.yamlnu�[���PK6|[-��20��ri/1.8/system/RubyLex/skip_inner_expression-i.yamlnu�[���PK6|[�Ľ��� W��ri/1.8/system/RubyLex/new-c.yamlnu�[���PK6|[Ύ)���,O��ri/1.8/system/RubyLex/identify_number-i.yamlnu�[���PK6|[`�/��'i��ri/1.8/system/RubyLex/get_readed-i.yamlnu�[���PK6|[�@��%o��ri/1.8/system/RubyLex/get_read-i.yamlnu�[���PK6|[Kf>���*o��ri/1.8/system/RubyLex/peek_match%3f-i.yamlnu�[���PK6|[�����3���ri/1.8/system/RubyLex/identify_here_document-i.yamlnu�[���PK6|[ZV���=���ri/1.8/system/RubyLex/BufferedReader/getc_already_read-i.yamlnu�[���PK6|[k�D���2��ri/1.8/system/RubyLex/BufferedReader/column-i.yamlnu�[���PK6|[��E��<���ri/1.8/system/RubyLex/BufferedReader/divert_read_from-i.yamlnu�[���PK6|[;�Y���0;��ri/1.8/system/RubyLex/BufferedReader/peek-i.yamlnu�[���PK6|[�o���2P��ri/1.8/system/RubyLex/BufferedReader/ungetc-i.yamlnu�[���PK6|[ފ�T��/k��ri/1.8/system/RubyLex/BufferedReader/new-c.yamlnu�[���PK6|[��7���4���ri/1.8/system/RubyLex/BufferedReader/get_read-i.yamlnu�[���PK6|[�C_��0���ri/1.8/system/RubyLex/BufferedReader/getc-i.yamlnu�[���PK6|[0t%WW>���ri/1.8/system/RubyLex/BufferedReader/cdesc-BufferedReader.yamlnu�[���PK6|[:��6y��ri/1.8/system/RubyLex/BufferedReader/peek_equal-i.yamlnu�[���PK6|[��?���!���ri/1.8/system/RubyLex/gets-i.yamlnu�[���PK6|[V�����#���ri/1.8/system/RubyLex/eof%3f-i.yamlnu�[���PK6|[��[��*���ri/1.8/system/RubyLex/getc_of_rests-i.yamlnu�[���PK6|[�e�ȴ�*���ri/1.8/system/RubyLex/peek_equal%3f-i.yamlnu�[���PK7|[2���!���ri/1.8/system/RubyLex/getc-i.yamlnu�[���PK7|[����� ���ri/1.8/system/RubyLex/lex-i.yamlnu�[���PK7|[���!��"���ri/1.8/system/RubyLex/token-i.yamlnu�[���PK7|[~��%���ri/1.8/system/RubyLex/lex_int2-i.yamlnu�[���PK7|[x����,���ri/1.8/system/RubyLex/identify_string-i.yamlnu�[���PK7|[�t���5���ri/1.8/system/RubyLex/each_top_level_statement-i.yamlnu�[���PK7|[AL$��$��ri/1.8/system/RubyLex/char_no-i.yamlnu�[���PK7|[�l�N��0��ri/1.8/system/RubyLex/identify_identifier-i.yamlnu�[���PK7|[�P�WW(-��ri/1.8/system/RubyLex/cdesc-RubyLex.yamlnu�[���PK7|[��U�CC+���ri/1.8/system/StringScanner/restsize-i.yamlnu�[���PK7|[����*z��ri/1.8/system/StringScanner/matched-i.yamlnu�[���PK7|[!�>VV-l��ri/1.8/system/StringScanner/post_match-i.yamlnu�[���PK7|[r���44)��ri/1.8/system/StringScanner/%5b%5d-i.yamlnu�[���PK7|[�jv���+���ri/1.8/system/StringScanner/exist%3f-i.yamlnu�[���PK7|[78x+���ri/1.8/system/StringScanner/empty%3f-i.yamlnu�[���PK7|[<��22,
��ri/1.8/system/StringScanner/terminate-i.yamlnu�[���PK7|[�o��+���ri/1.8/system/StringScanner/get_byte-i.yamlnu�[���PK7|[�Zh���)���ri/1.8/system/StringScanner/string-i.yamlnu�[���PK7|[�>P���)��ri/1.8/system/StringScanner/eos%3f-i.yamlnu�[���PK7|[����4<��ri/1.8/system/StringScanner/cdesc-StringScanner.yamlnu�[���PK7|[ՠ#�BB/E�ri/1.8/system/StringScanner/matched_size-i.yamlnu�[���PK7|[z�T���-��ri/1.8/system/StringScanner/scan_until-i.yamlnu�[���PK7|[jϗ���'!�ri/1.8/system/StringScanner/peek-i.yamlnu�[���PK7|[p��\\)X#�ri/1.8/system/StringScanner/concat-i.yamlnu�[���PK7|[\�Ȋ�-
&�ri/1.8/system/StringScanner/skip_until-i.yamlnu�[���PK7|[��DD+�)�ri/1.8/system/StringScanner/match%3f-i.yamlnu�[���PK7|[̘�P2�,�ri/1.8/system/StringScanner/Error/cdesc-Error.yamlnu�[���PK7|[�
�^ii,B�ri/1.8/system/StringScanner/scan_full-i.yamlnu�[���PK7|[!��##(�D�ri/1.8/system/StringScanner/check-i.yamlnu�[���PK7|[�/�;;.SH�ri/1.8/system/StringScanner/search_full-i.yamlnu�[���PK7|[9� *�J�ri/1.8/system/StringScanner/getbyte-i.yamlnu�[���PK7|[n�**dL�ri/1.8/system/StringScanner/pointer-i.yamlnu�[���PK7|[���-�O�ri/1.8/system/StringScanner/pointer%3d-i.yamlnu�[���PK7|[�˹č�*�Q�ri/1.8/system/StringScanner/inspect-i.yamlnu�[���PK7|[�XB���.�U�ri/1.8/system/StringScanner/check_until-i.yamlnu�[���PK7|[肆��'�X�ri/1.8/system/StringScanner/scan-i.yamlnu�[���PK7|[�;-'\�ri/1.8/system/StringScanner/peep-i.yamlnu�[���PK7|[+l�oKK7�]�ri/1.8/system/StringScanner/beginning_of_line%3f-i.yamlnu�[���PK7|[���ss&4`�ri/1.8/system/StringScanner/new-c.yamlnu�[���PK7|[MW,;2�a�ri/1.8/system/StringScanner/initialize_copy-i.yamlnu�[���PK7|[�...sc�ri/1.8/system/StringScanner/matchedsize-i.yamlnu�[���PK7|[r�VV)�d�ri/1.8/system/StringScanner/%3c%3c-i.yamlnu�[���PK7|[������&�g�ri/1.8/system/StringScanner/pos-i.yamlnu�[���PK7|[t�7�SS,k�ri/1.8/system/StringScanner/pre_match-i.yamlnu�[���PK7|["�
b'�m�ri/1.8/system/StringScanner/skip-i.yamlnu�[���PK7|[~��/,'q�ri/1.8/system/StringScanner/rest_size-i.yamlnu�[���PK7|[:�N���(�r�ri/1.8/system/StringScanner/getch-i.yamlnu�[���PK7|[
��Q331�u�ri/1.8/system/StringScanner/must_C_version-c.yamlnu�[���PK7|[��6.		(Cw�ri/1.8/system/StringScanner/reset-i.yamlnu�[���PK7|[�MR���-�x�ri/1.8/system/StringScanner/matched%3f-i.yamlnu�[���PK7|[��'��)�z�ri/1.8/system/StringScanner/pos%3d-i.yamlnu�[���PK7|[�J� (�|�ri/1.8/system/StringScanner/clear-i.yamlnu�[���PK7|[�D�sAA,R~�ri/1.8/system/StringScanner/string%3d-i.yamlnu�[���PK7|[ԏ�>��)��ri/1.8/system/StringScanner/unscan-i.yamlnu�[���PK7|[�
S���*т�ri/1.8/system/StringScanner/rest%3f-i.yamlnu�[���PK7|[4��ll'��ri/1.8/system/StringScanner/rest-i.yamlnu�[���PK7|[TpHD~~,Ɔ�ri/1.8/system/Interrupt/cdesc-Interrupt.yamlnu�[���PK8|[�Ƭ������ri/1.8/system/Find/find-i.yamlnu�[���PK8|[7a#��"���ri/1.8/system/Find/cdesc-Find.yamlnu�[���PK8|[�$����ri/1.8/system/Find/prune-i.yamlnu�[���PK8|[���#��ri/1.8/system/Shell/Cat/each-i.yamlnu�[���PK8|[��Ҳ�"��ri/1.8/system/Shell/Cat/new-c.yamlnu�[���PK8|[N\�&��ri/1.8/system/Shell/Cat/cdesc-Cat.yamlnu�[���PK9|[p�[�-���ri/1.8/system/Shell/def_system_command-c.yamlnu�[���PK9|[������*��ri/1.8/system/Shell/Filter/input%3d-i.yamlnu�[���PK9|[��ܼ�&���ri/1.8/system/Shell/Filter/each-i.yamlnu�[���PK9|[���ө�&
��ri/1.8/system/Shell/Filter/to_a-i.yamlnu�[���PK9|[q�a��%��ri/1.8/system/Shell/Filter/%7c-i.yamlnu�[���PK9|[5m6Ɵ�,��ri/1.8/system/Shell/Filter/cdesc-Filter.yamlnu�[���PK9|[!�Z~��%��ri/1.8/system/Shell/Filter/%3c-i.yamlnu�[���PK9|[3~=ǯ�)��ri/1.8/system/Shell/Filter/inspect-i.yamlnu�[���PK9|[��<��%
��ri/1.8/system/Shell/Filter/new-c.yamlnu�[���PK9|[�XC��(��ri/1.8/system/Shell/Filter/%3e%3e-i.yamlnu�[���PK9|[���ީ�%	��ri/1.8/system/Shell/Filter/%2b-i.yamlnu�[���PK9|[��
\��&��ri/1.8/system/Shell/Filter/to_s-i.yamlnu�[���PK9|[�~���%��ri/1.8/system/Shell/Filter/%3e-i.yamlnu�[���PK9|[�n�C����ri/1.8/system/Shell/cd-c.yamlnu�[���PK9|[z�E9��!��ri/1.8/system/Shell/notify-c.yamlnu�[���PK9|[��e��3��ri/1.8/system/Shell/default_record_separator-c.yamlnu�[���PK:|[b����$H��ri/1.8/system/Shell/Echo/each-i.yamlnu�[���PK:|[W�fٱ�#d��ri/1.8/system/Shell/Echo/new-c.yamlnu�[���PK:|[l���(h��ri/1.8/system/Shell/Echo/cdesc-Echo.yamlnu�[���PK:|[��p[��#۬�ri/1.8/system/Shell/Tee/each-i.yamlnu�[���PK:|[�E	��"��ri/1.8/system/Shell/Tee/new-c.yamlnu�[���PK:|[%��&��ri/1.8/system/Shell/Tee/cdesc-Tee.yamlnu�[���PK:|[]&����(X��ri/1.8/system/Shell/alias_command-c.yamlnu�[���PK:|[囮w��&~��ri/1.8/system/Shell/Concat/each-i.yamlnu�[���PK;|[}��',���ri/1.8/system/Shell/Concat/cdesc-Concat.yamlnu�[���PK;|[��偰�%��ri/1.8/system/Shell/Concat/new-c.yamlnu�[���PK;|[}d���*��ri/1.8/system/Shell/Error/cdesc-Error.yamlnu�[���PK;|[�'����"��ri/1.8/system/Shell/jobs-i.yamlnu�[���PK;|[uci�:I��ri/1.8/system/Shell/ProcessController/terminate_job-i.yamlnu�[���PK;|[jj~���?���ri/1.8/system/Shell/ProcessController/each_active_object-c.yamlnu�[���PK;|[�+�eD��ri/1.8/system/Shell/ProcessController/wait_all_jobs_execution-i.yamlnu�[���PK<|[j#O��5���ri/1.8/system/Shell/ProcessController/kill_job-i.yamlnu�[���PK<|[�I�j��9��ri/1.8/system/Shell/ProcessController/waiting_jobs-i.yamlnu�[���PK<|["�Ӵ�1��ri/1.8/system/Shell/ProcessController/jobs-i.yamlnu�[���PK<|[�/y��81��ri/1.8/system/Shell/ProcessController/active_jobs-i.yamlnu�[���PK<|[����5[��ri/1.8/system/Shell/ProcessController/activate-c.yamlnu�[���PK<|[}�W9~��ri/1.8/system/Shell/ProcessController/add_schedule-i.yamlnu�[���PK<|[�����;���ri/1.8/system/Shell/ProcessController/waiting_job%3f-i.yamlnu�[���PK<|[�_��0��ri/1.8/system/Shell/ProcessController/new-c.yamlnu�[���PK=|[eg�`��62��ri/1.8/system/Shell/ProcessController/start_job-i.yamlnu�[���PK=|[�����J���ri/1.8/system/Shell/ProcessController/process_controllers_exclusive-c.yamlnu�[���PK=|[C5P���B���ri/1.8/system/Shell/ProcessController/waiting_jobs_exist%3f-i.yamlnu�[���PK=|[~�`���7B��ri/1.8/system/Shell/ProcessController/inactivate-c.yamlnu�[���PK=|[QXO���:k��ri/1.8/system/Shell/ProcessController/active_job%3f-i.yamlnu�[���PK=|[Ş�/��B���ri/1.8/system/Shell/ProcessController/cdesc-ProcessController.yamlnu�[���PK=|[L�9w��:���ri/1.8/system/Shell/ProcessController/jobs_exist%3f-i.yamlnu�[���PK=|[��}��A%��ri/1.8/system/Shell/ProcessController/active_jobs_exist%3f-i.yamlnu�[���PK=|[�Bx2f��ri/1.8/system/Shell/ProcessController/sfork-i.yamlnu�[���PK=|[}x^6��2���ri/1.8/system/Shell/install_system_commands-c.yamlnu�[���PK=|[����55$���ri/1.8/system/Shell/cdesc-Shell.yamlnu�[���PK=|[�¢��&���ri/1.8/system/Shell/expand_path-i.yamlnu�[���PK=|[ɕI�����ri/1.8/system/Shell/kill-i.yamlnu�[���PK=|[L5�i��/���ri/1.8/system/Shell/undef_system_command-c.yamlnu�[���PK=|[��S�� ���ri/1.8/system/Shell/pushd-i.yamlnu�[���PK=|[�S�b�����ri/1.8/system/Shell/cd-i.yamlnu�[���PK=|[���1��ri/1.8/system/Shell/default_system_path%3d-c.yamlnu�[���PK=|[R���*9��ri/1.8/system/Shell/unalias_command-c.yamlnu�[���PK=|[pxժ�"M��ri/1.8/system/Shell/inspect-i.yamlnu�[���PK=|[5��.��I��ri/1.8/system/Shell/new-c.yamlnu�[���PK=|[�@nW��)6��ri/1.8/system/Shell/system_path%3d-i.yamlnu�[���PK=|[�b ��6D��ri/1.8/system/Shell/default_record_separator%3d-c.yamlnu�[���PK=|[��#��#w��ri/1.8/system/Shell/debug%3d-c.yamlnu�[���PK=|[�b�+��$r��ri/1.8/system/Shell/Glob/each-i.yamlnu�[���PK=|[�W���#���ri/1.8/system/Shell/Glob/new-c.yamlnu�[���PK=|[S�[(���ri/1.8/system/Shell/Glob/cdesc-Glob.yamlnu�[���PK@|[����.���ri/1.8/system/Shell/SystemCommand/flush-i.yamlnu�[���PK@|[�_l���0��ri/1.8/system/Shell/SystemCommand/wait%3f-i.yamlnu�[���PK@|[��QF��1��ri/1.8/system/Shell/SystemCommand/input%3d-i.yamlnu�[���PK@|[AHbw��56��ri/1.8/system/Shell/SystemCommand/start_export-i.yamlnu�[���PK@|[z�����2[��ri/1.8/system/Shell/SystemCommand/terminate-i.yamlnu�[���PK@|[M�^}��-w��ri/1.8/system/Shell/SystemCommand/each-i.yamlnu�[���PK@|[
��)��-���ri/1.8/system/Shell/SystemCommand/kill-i.yamlnu�[���PK@|[�+���2���ri/1.8/system/Shell/SystemCommand/active%3f-i.yamlnu�[���PK@|[ω8���,���ri/1.8/system/Shell/SystemCommand/new-c.yamlnu�[���PK@|[�N��/��ri/1.8/system/Shell/SystemCommand/notify-i.yamlnu�[���PK@|[�O]���.B��ri/1.8/system/Shell/SystemCommand/start-i.yamlnu�[���PK@|[a��
��5R��ri/1.8/system/Shell/SystemCommand/start_import-i.yamlnu�[���PK@|[!�8CYY:w�ri/1.8/system/Shell/SystemCommand/cdesc-SystemCommand.yamlnu�[���PK@|[���#��.:�ri/1.8/system/Shell/default_system_path-c.yamlnu�[���PK@|[�����,W�ri/1.8/system/Shell/AppendIO/input%3d-i.yamlnu�[���PKA|[�0h�__0h�ri/1.8/system/Shell/AppendIO/cdesc-AppendIO.yamlnu�[���PKA|[��4��''	�ri/1.8/system/Shell/AppendIO/new-c.yamlnu�[���PKA|[����5
�ri/1.8/system/Shell/popd-i.yamlnu�[���PKA|[�'��.]�ri/1.8/system/Shell/AppendFile/input%3d-i.yamlnu�[���PKA|[
�
##4r�ri/1.8/system/Shell/AppendFile/cdesc-AppendFile.yamlnu�[���PKA|[d�3��)�
�ri/1.8/system/Shell/AppendFile/new-c.yamlnu�[���PKA|[���c��/�ri/1.8/system/Shell/CommandProcessor/tee-i.yamlnu�[���PKA|[�]�[&&2(�ri/1.8/system/Shell/CommandProcessor/system-i.yamlnu�[���PKA|[`q���>��ri/1.8/system/Shell/CommandProcessor/def_system_command-c.yamlnu�[���PKA|[:^8��/��ri/1.8/system/Shell/CommandProcessor/out-i.yamlnu�[���PKA|[�)����65�ri/1.8/system/Shell/CommandProcessor/run_config-c.yamlnu�[���PKA|[Q���2��ri/1.8/system/Shell/CommandProcessor/%5b%5d-i.yamlnu�[���PKA|[�k��cc0��ri/1.8/system/Shell/CommandProcessor/glob-i.yamlnu�[���PKA|[� �OO1��ri/1.8/system/Shell/CommandProcessor/rmdir-i.yamlnu�[���PKA|[z�b�8e�ri/1.8/system/Shell/CommandProcessor/effect_umask-i.yamlnu�[���PKA|[��U���I��ri/1.8/system/Shell/CommandProcessor/add_delegate_command_to_shell-c.yamlnu�[���PKA|[� ���92�ri/1.8/system/Shell/CommandProcessor/alias_command-c.yamlnu�[���PKA|[B�2U��2{ �ri/1.8/system/Shell/CommandProcessor/unlink-i.yamlnu�[���PKA|[�G]U��/_"�ri/1.8/system/Shell/CommandProcessor/cat-i.yamlnu�[���PKA|[�೗007y#�ri/1.8/system/Shell/CommandProcessor/check_point-i.yamlnu�[���PKA|[�MG��2%�ri/1.8/system/Shell/CommandProcessor/concat-i.yamlnu�[���PKA|[����882.&�ri/1.8/system/Shell/CommandProcessor/rehash-i.yamlnu�[���PKA|[���?;�'�ri/1.8/system/Shell/CommandProcessor/finish_all_jobs-i.yamlnu�[���PKA|[�����69)�ri/1.8/system/Shell/CommandProcessor/initialize-c.yamlnu�[���PKA|[=ν��3^*�ri/1.8/system/Shell/CommandProcessor/foreach-i.yamlnu�[���PKA|[;窽�5X-�ri/1.8/system/Shell/CommandProcessor/alias_map-c.yamlnu�[���PKA|[����Cz.�ri/1.8/system/Shell/CommandProcessor/install_system_commands-c.yamlnu�[���PKA|[E�ݷ��7�1�ri/1.8/system/Shell/CommandProcessor/expand_path-i.yamlnu�[���PKA|[���?��@�3�ri/1.8/system/Shell/CommandProcessor/undef_system_command-c.yamlnu�[���PKA|[��u��05�ri/1.8/system/Shell/CommandProcessor/open-i.yamlnu�[���PKA|[D:=���;k7�ri/1.8/system/Shell/CommandProcessor/unalias_command-c.yamlnu�[���PKA|[���..1�8�ri/1.8/system/Shell/CommandProcessor/mkdir-i.yamlnu�[���PKA|[�—		@1:�ri/1.8/system/Shell/CommandProcessor/cdesc-CommandProcessor.yamlnu�[���PKB|[
Vo��/�C�ri/1.8/system/Shell/CommandProcessor/new-c.yamlnu�[���PKB|[I�Ӎ))2�D�ri/1.8/system/Shell/CommandProcessor/notify-i.yamlnu�[���PKB|[�\X��2EF�ri/1.8/system/Shell/CommandProcessor/append-i.yamlnu�[���PKB|[�!罻�0hG�ri/1.8/system/Shell/CommandProcessor/echo-i.yamlnu�[���PKB|[�G���?�H�ri/1.8/system/Shell/CommandProcessor/find_system_command-i.yamlnu�[���PKB|[�|����8�I�ri/1.8/system/Shell/CommandProcessor/method_added-c.yamlnu�[���PKB|[�Y�D�J�ri/1.8/system/Shell/CommandProcessor/install_builtin_commands-c.yamlnu�[���PKB|[\y����0�L�ri/1.8/system/Shell/CommandProcessor/test-i.yamlnu�[���PKB|[y��

@�M�ri/1.8/system/Shell/CommandProcessor/def_builtin_commands-c.yamlnu�[���PKC|[<��V��4XQ�ri/1.8/system/Shell/CommandProcessor/transact-i.yamlnu�[���PKC|[Ϳ2*��#}R�ri/1.8/system/Shell/debug%3d-i.yamlnu�[���PKC|[�G;�PP xS�ri/1.8/system/Shell/chdir-i.yamlnu�[���PKC|[.����!U�ri/1.8/system/Shell/popdir-i.yamlnu�[���PKC|[ʺ����"6V�ri/1.8/system/Shell/pushdir-i.yamlnu�[���PKC|[Ob���1mW�ri/1.8/system/Shell/BuiltInCommand/wait%3f-i.yamlnu�[���PKC|[��//<�X�ri/1.8/system/Shell/BuiltInCommand/cdesc-BuiltInCommand.yamlnu�[���PKC|[��˷�3Z�ri/1.8/system/Shell/BuiltInCommand/active%3f-i.yamlnu�[���PKC|[�#�~~06[�ri/1.8/system/SyntaxError/cdesc-SyntaxError.yamlnu�[���PKC|[�2>͔�$^�ri/1.8/system/Kconv/cdesc-Kconv.yamlnu�[���PKC|[�I���"�l�ri/1.8/system/Kconv/toutf16-i.yamlnu�[���PKC|[K� n��!o�ri/1.8/system/Kconv/tosjis-i.yamlnu�[���PKC|[�)�r!! 3q�ri/1.8/system/Kconv/kconv-i.yamlnu�[���PKD|[!��xzz!�s�ri/1.8/system/Kconv/isutf8-i.yamlnu�[���PKD|[�;�5�� ou�ri/1.8/system/Kconv/tojis-i.yamlnu�[���PKE|[�j,�~~!�w�ri/1.8/system/Kconv/issjis-i.yamlnu�[���PKE|[%����!Vy�ri/1.8/system/Kconv/toutf8-i.yamlnu�[���PKE|[.����� l{�ri/1.8/system/Kconv/toeuc-i.yamlnu�[���PKF|[߅�$}�ri/1.8/system/Kconv/guess_old-i.yamlnu�[���PKF|['��

 �~�ri/1.8/system/Kconv/guess-i.yamlnu�[���PKF|[n�r�xx C��ri/1.8/system/Kconv/iseuc-i.yamlnu�[���PKF|["��l228��ri/1.8/system/InvalidArgument/cdesc-InvalidArgument.yamlnu�[���PKF|[�d,���<���ri/1.8/system/TimeExtentionTest/cdesc-TimeExtentionTest.yamlnu�[���PKG|[�FF ��ri/1.8/system/Kernel/fail-i.yamlnu�[���PKG|[��uf��"���ri/1.8/system/Kernel/system-i.yamlnu�[���PKG|[��c�� ���ri/1.8/system/Kernel/exec-i.yamlnu�[���PKG|[���c((��ri/1.8/system/Kernel/URI-i.yamlnu�[���PKH|[��S$b��ri/1.8/system/Kernel/autoload-i.yamlnu�[���PKH|[	�	(��!ŕ�ri/1.8/system/Kernel/print-i.yamlnu�[���PKH|[���"���ri/1.8/system/Kernel/printf-i.yamlnu�[���PKH|[�� ��#��ri/1.8/system/Kernel/binding-i.yamlnu�[���PKI|[���77$
��ri/1.8/system/Kernel/Pathname-i.yamlnu�[���PKI|[��00*���ri/1.8/system/Kernel/method_missing-i.yamlnu�[���PKI|[��&2"��ri/1.8/system/Kernel/open_uri_original_open-i.yamlnu�[���PKI|[�+o<< ���ri/1.8/system/Kernel/gsub-i.yamlnu�[���PKI|[�3���*��ri/1.8/system/Kernel/block_given%3f-i.yamlnu�[���PKJ|[F��YGG"M��ri/1.8/system/Kernel/select-i.yamlnu�[���PKJ|[���!��ri/1.8/system/Kernel/scanf-i.yamlnu�[���PKJ|[���!��ri/1.8/system/Kernel/abort-i.yamlnu�[���PKJ|[��������ri/1.8/system/Kernel/%60-i.yamlnu�[���PKJ|[�]�W��"���ri/1.8/system/Kernel/String-i.yamlnu�[���PKK|[�ci��!ߵ�ri/1.8/system/Kernel/chomp-i.yamlnu�[���PKK|[C�\<��"ĸ�ri/1.8/system/Kernel/lambda-i.yamlnu�[���PKK|[�H<<#���ri/1.8/system/Kernel/gsub%21-i.yamlnu�[���PKL|[N�J�ZZ$-��ri/1.8/system/Kernel/readline-i.yamlnu�[���PKL|[RQ�!'۾�ri/1.8/system/Kernel/autoload%3f-i.yamlnu�[���PKL|[D_XjHH!C��ri/1.8/system/Kernel/raise-i.yamlnu�[���PKL|[Qtt ���ri/1.8/system/Kernel/eval-i.yamlnu�[���PKM|[>�_/�� ���ri/1.8/system/Kernel/load-i.yamlnu�[���PKM|[���(�� ���ri/1.8/system/Kernel/proc-i.yamlnu�[���PKM|[4����ri/1.8/system/Kernel/pp-i.yamlnu�[���PKN|[�8؄@@$���ri/1.8/system/Kernel/chomp%21-i.yamlnu�[���PKN|[U�g__&���ri/1.8/system/Kernel/__method__-i.yamlnu�[���PKN|[$*\/*=��ri/1.8/system/Kernel/pretty_inspect-i.yamlnu�[���PKN|[#X5��� ���ri/1.8/system/Kernel/open-i.yamlnu�[���PKO|[D=_�tt#���ri/1.8/system/Kernel/sprintf-i.yamlnu�[���PKO|[��U#\��ri/1.8/system/Kernel/at_exit-i.yamlnu�[���PKO|[�3pOO"��ri/1.8/system/Kernel/sub%21-i.yamlnu�[���PKP|[d���� d��ri/1.8/system/Kernel/loop-i.yamlnu�[���PKP|[aL��[[ ���ri/1.8/system/Kernel/scan-i.yamlnu�[���PKP|[͈���#Q��ri/1.8/system/Kernel/require-i.yamlnu�[���PKP|[Qi�-- ?�ri/1.8/system/Kernel/fork-i.yamlnu�[���PKQ|[+��$dd ��ri/1.8/system/Kernel/exit-i.yamlnu�[���PKQ|[TRL-!!p�ri/1.8/system/Kernel/y-i.yamlnu�[���PKQ|[�F��!�
�ri/1.8/system/Kernel/srand-i.yamlnu�[���PKR|[�"����#�ri/1.8/system/Kernel/exit%21-i.yamlnu�[���PKR|[�eh�OO!�ri/1.8/system/Kernel/split-i.yamlnu�[���PKR|[/�r�**!��ri/1.8/system/Kernel/sleep-i.yamlnu�[���PKS|[%�Ad!!�ri/1.8/system/Kernel/catch-i.yamlnu�[���PKS|[)�&���*��ri/1.8/system/Kernel/set_trace_func-i.yamlnu�[���PKS|[����!�#�ri/1.8/system/Kernel/Array-i.yamlnu�[���PKT|[�4���,9&�ri/1.8/system/Kernel/global_variables-i.yamlnu�[���PKT|[E�]0��"W(�ri/1.8/system/Kernel/callcc-i.yamlnu�[���PKT|[B�j'��#o+�ri/1.8/system/Kernel/syscall-i.yamlnu�[���PKT|[E�EH��+K/�ri/1.8/system/Kernel/local_variables-i.yamlnu�[���PKT|[��|�qqp1�ri/1.8/system/Kernel/p-i.yamlnu�[���PKU|[�b>��'.4�ri/1.8/system/Kernel/iterator%3f-i.yamlnu�[���PKU|[;V����"b7�ri/1.8/system/Kernel/caller-i.yamlnu�[���PKU|[�=�{

 |;�ri/1.8/system/Kernel/gets-i.yamlnu�[���PKV|[��2��&�@�ri/1.8/system/Kernel/cdesc-Kernel.yamlnu�[���PKV|[@Xh5rr"�R�ri/1.8/system/Kernel/format-i.yamlnu�[���PKV|[1Y
22#�k�ri/1.8/system/Kernel/chop%21-i.yamlnu�[���PKV|[EHJ� ,n�ri/1.8/system/Kernel/rand-i.yamlnu�[���PKW|[{B�� �r�ri/1.8/system/Kernel/getc-i.yamlnu�[���PKW|[#����%�s�ri/1.8/system/Kernel/trace_var-i.yamlnu�[���PKW|[`/L33!�w�ri/1.8/system/Kernel/throw-i.yamlnu�[���PKW|[)j��++ Qz�ri/1.8/system/Kernel/putc-i.yamlnu�[���PKX|[J�&&!�{�ri/1.8/system/Kernel/Float-i.yamlnu�[���PKX|[�;�zzC~�ri/1.8/system/Kernel/sub-i.yamlnu�[���PKY|[k���#��ri/1.8/system/Kernel/Integer-i.yamlnu�[���PKY|[�!���'q��ri/1.8/system/Kernel/untrace_var-i.yamlnu�[���PKZ|[is�0�� ���ri/1.8/system/Kernel/chop-i.yamlnu�[���PKZ|[��Upp%���ri/1.8/system/Kernel/readlines-i.yamlnu�[���PKZ|[m�'�55 F��ri/1.8/system/Kernel/puts-i.yamlnu�[���PK[|[89�n^^ ˋ�ri/1.8/system/Kernel/warn-i.yamlnu�[���PK[|[<��RR y��ri/1.8/system/Kernel/test-i.yamlnu�[���PK\|[��!�rr ��ri/1.8/system/Kernel/trap-i.yamlnu�[���PK\|[�l�h��%ݞ�ri/1.8/system/YAML/Set/cdesc-Set.yamlnu�[���PK]|[�w?:/,��ri/1.8/system/YAML/BaseEmitter/node_text-i.yamlnu�[���PK]|[yG���3���ri/1.8/system/YAML/BaseEmitter/binary_base64-i.yamlnu�[���PK]|[`����,���ri/1.8/system/YAML/BaseEmitter/simple-i.yamlnu�[���PK`|[��0��,O��ri/1.8/system/YAML/BaseEmitter/single-i.yamlnu�[���PK`|[�s��0���ri/1.8/system/YAML/BaseEmitter/options%3d-i.yamlnu�[���PK`|[�t�((1���ri/1.8/system/YAML/BaseEmitter/indent_text-i.yamlnu�[���PKa|[*[��,D��ri/1.8/system/YAML/BaseEmitter/indent-i.yamlnu�[���PKa|[K\�K��*���ri/1.8/system/YAML/BaseEmitter/fold-i.yamlnu�[���PKa|[�����6��ri/1.8/system/YAML/BaseEmitter/seq_map_shortcut-i.yamlnu�[���PKa|[�j���)��ri/1.8/system/YAML/BaseEmitter/map-i.yamlnu�[���PKa|[Kl��-W��ri/1.8/system/YAML/BaseEmitter/options-i.yamlnu�[���PKa|[p���/r��ri/1.8/system/YAML/BaseEmitter/indent%21-i.yamlnu�[���PKa|[������5���ri/1.8/system/YAML/BaseEmitter/cdesc-BaseEmitter.yamlnu�[���PKb|[��6��,���ri/1.8/system/YAML/BaseEmitter/double-i.yamlnu�[���PKb|[�����)���ri/1.8/system/YAML/BaseEmitter/seq-i.yamlnu�[���PKb|[�bZ���-<��ri/1.8/system/YAML/PrivateType/to_yaml-i.yamlnu�[���PKb|[f�ԑ��5W��ri/1.8/system/YAML/PrivateType/cdesc-PrivateType.yamlnu�[���PKc|[�E#��)R��ri/1.8/system/YAML/PrivateType/new-c.yamlnu�[���PKc|[׺���7a��ri/1.8/system/YAML/PrivateType/tag_subclasses%3f-c.yamlnu�[���PKc|[8_|��&���ri/1.8/system/YAML/object_maker-c.yamlnu�[���PKc|[�M����"ۼ�ri/1.8/system/YAML/unescape-c.yamlnu�[���PKd|[k	���%��ri/1.8/system/YAML/dump_stream-c.yamlnu�[���PKd|[S�	(/��ri/1.8/system/YAML/tagged_classes-c.yamlnu�[���PKd|[`�b���$���ri/1.8/system/YAML/parse_file-c.yamlnu�[���PKd|[.���� {��ri/1.8/system/YAML/parser-c.yamlnu�[���PKd|[��RSNN)���ri/1.8/system/YAML/read_type_class-c.yamlnu�[���PKe|[�w"�RR%W��ri/1.8/system/YAML/load_stream-c.yamlnu�[���PKe|[��&ͦ&�&"���ri/1.8/system/YAML/cdesc-YAML.yamlnu�[���PKe|[¡��*���ri/1.8/system/YAML/add_builtin_type-c.yamlnu�[���PKe|[�`�+��&o��ri/1.8/system/YAML/Sequence/add-i.yamlnu�[���PKf|[����/p��ri/1.8/system/YAML/Sequence/cdesc-Sequence.yamlnu�[���PKf|[���	��%���ri/1.8/system/YAML/make_stream-c.yamlnu�[���PKf|[?rˮ��%	��ri/1.8/system/YAML/Omap/%5b%5d-i.yamlnu�[���PKf|[�``'��ri/1.8/system/YAML/Omap/cdesc-Omap.yamlnu�[���PKg|[���:��&���ri/1.8/system/YAML/Omap/to_yaml-i.yamlnu�[���PKg|[�B��.��ri/1.8/system/YAML/Omap/yaml_initialize-i.yamlnu�[���PKg|[m�y���1��ri/1.8/system/YAML/Omap/is_complex_yaml%3f-i.yamlnu�[���PKg|[��Of��(��ri/1.8/system/YAML/Omap/%5b%5d%3d-i.yamlnu�[���PKg|[��)[��%��ri/1.8/system/YAML/Omap/%5b%5d-c.yamlnu�[���PKh|[�.��)�ri/1.8/system/YAML/Omap/has_key%3f-i.yamlnu�[���PKh|[��>G��)�ri/1.8/system/YAML/Error/cdesc-Error.yamlnu�[���PKh|[�N���r�ri/1.8/system/YAML/parse-c.yamlnu�[���PKi|[�m ��"��ri/1.8/system/YAML/resolver-c.yamlnu�[���PKi|[ڼ���)��ri/1.8/system/YAML/YPath/cdesc-YPath.yamlnu�[���PKi|[�L�>��#�ri/1.8/system/YAML/YPath/new-c.yamlnu�[���PKi|[0�9l��)�ri/1.8/system/YAML/YPath/each_path-c.yamlnu�[���PKj|[�����)K
�ri/1.8/system/YAML/detect_implicit-c.yamlnu�[���PKj|[O�z�'��ri/1.8/system/YAML/add_ruby_type-c.yamlnu�[���PKj|[�m���%
�ri/1.8/system/YAML/Mapping/add-i.yamlnu�[���PKj|[�Jl&&-�ri/1.8/system/YAML/Mapping/cdesc-Mapping.yamlnu�[���PKj|[��h.$��ri/1.8/system/YAML/quick_emit-c.yamlnu�[���PKk|[�i���#��ri/1.8/system/YAML/load_file-c.yamlnu�[���PKk|[�Dz&��(��ri/1.8/system/YAML/generic_parser-c.yamlnu�[���PKk|[�0F��!�ri/1.8/system/YAML/emitter-c.yamlnu�[���PKk|[�x)K)P�ri/1.8/system/YAML/BaseNode/%5b%5d-i.yamlnu�[���PKl|[sDZ$,��ri/1.8/system/YAML/BaseNode/select%21-i.yamlnu�[���PKl|[FPx[)�ri/1.8/system/YAML/BaseNode/select-i.yamlnu�[���PKl|[��d9��%��ri/1.8/system/YAML/BaseNode/at-i.yamlnu�[���PKl|[���0��ri/1.8/system/YAML/BaseNode/match_segment-i.yamlnu�[���PKl|[9��Ҳ�+��ri/1.8/system/YAML/BaseNode/children-i.yamlnu�[���PKl|[�Y�5��' �ri/1.8/system/YAML/BaseNode/emit-i.yamlnu�[���PKm|[$.w���6!�ri/1.8/system/YAML/BaseNode/children_with_index-i.yamlnu�[���PKm|[��M��/6"�ri/1.8/system/YAML/BaseNode/cdesc-BaseNode.yamlnu�[���PKm|[(f�)�%�ri/1.8/system/YAML/BaseNode/search-i.yamlnu�[���PKm|[s�
-'�ri/1.8/system/YAML/BaseNode/match_path-i.yamlnu�[���PKn|[�
�(p(�ri/1.8/system/YAML/load_documents-c.yamlnu�[���PKn|[]�s�#�*�ri/1.8/system/YAML/tag_class-c.yamlnu�[���PKn|[��K��U0�ri/1.8/system/YAML/dump-c.yamlnu�[���PKn|[5yA���3/3�ri/1.8/system/YAML/ParseError/cdesc-ParseError.yamlnu�[���PKn|[S����1X4�ri/1.8/system/YAML/TypeError/cdesc-TypeError.yamlnu�[���PKo|[t�y��&�5�ri/1.8/system/YAML/Pairs/%5b%5d-i.yamlnu�[���PKo|[���׸�'�6�ri/1.8/system/YAML/Pairs/to_yaml-i.yamlnu�[���PKo|[ؼ���/�7�ri/1.8/system/YAML/Pairs/yaml_initialize-i.yamlnu�[���PKo|[��w��2�8�ri/1.8/system/YAML/Pairs/is_complex_yaml%3f-i.yamlnu�[���PKo|[9����)�9�ri/1.8/system/YAML/Pairs/%5b%5d%3d-i.yamlnu�[���PKp|[ 3�A��&�:�ri/1.8/system/YAML/Pairs/%5b%5d-c.yamlnu�[���PKp|[���cc)�;�ri/1.8/system/YAML/Pairs/cdesc-Pairs.yamlnu�[���PKp|[?X���*�>�ri/1.8/system/YAML/Pairs/has_key%3f-i.yamlnu�[���PKp|[j���88#�?�ri/1.8/system/YAML/each_node-c.yamlnu�[���PKq|[�F�N��$6B�ri/1.8/system/YAML/DBM/update-i.yamlnu�[���PKq|[h,k���$8C�ri/1.8/system/YAML/DBM/invert-i.yamlnu�[���PKq|[Ru�ި�$5D�ri/1.8/system/YAML/DBM/%5b%5d-i.yamlnu�[���PKq|[a�vk��"1E�ri/1.8/system/YAML/DBM/each-i.yamlnu�[���PKq|[��v��$cF�ri/1.8/system/YAML/DBM/select-i.yamlnu�[���PKq|[i�b��"xG�ri/1.8/system/YAML/DBM/to_a-i.yamlnu�[���PKr|[J,��#oH�ri/1.8/system/YAML/DBM/store-i.yamlnu�[���PKr|[L�����'sI�ri/1.8/system/YAML/DBM/values_at-i.yamlnu�[���PKr|[�k����$�J�ri/1.8/system/YAML/DBM/delete-i.yamlnu�[���PKr|[���د�#�K�ri/1.8/system/YAML/DBM/index-i.yamlnu�[���PKs|[硟��'�L�ri/1.8/system/YAML/DBM/delete_if-i.yamlnu�[���PKs|[D����(�M�ri/1.8/system/YAML/DBM/each_value-i.yamlnu�[���PKs|[[)ǰ�%�N�ri/1.8/system/YAML/DBM/replace-i.yamlnu�[���PKs|[<pT��$�O�ri/1.8/system/YAML/DBM/reject-i.yamlnu�[���PKt|[{Y�h��$�P�ri/1.8/system/YAML/DBM/values-i.yamlnu�[���PKt|[(����%�Q�ri/1.8/system/YAML/DBM/to_hash-i.yamlnu�[���PKu|[�J���#�R�ri/1.8/system/YAML/DBM/shift-i.yamlnu�[���PKu|[�C�a��'�S�ri/1.8/system/YAML/DBM/%5b%5d%3d-i.yamlnu�[���PKv|[ƥ�
��'�T�ri/1.8/system/YAML/DBM/each_pair-i.yamlnu�[���PKv|[M
gX��*KV�ri/1.8/system/YAML/DBM/has_value%3f-i.yamlnu�[���PKw|[X*b
��#[W�ri/1.8/system/YAML/DBM/fetch-i.yamlnu�[���PKw|[��


%�X�ri/1.8/system/YAML/DBM/cdesc-DBM.yamlnu�[���PKw|[vqr�55�]�ri/1.8/system/YAML/load-c.yamlnu�[���PKw|[�}A���'e`�ri/1.8/system/YAML/Stream/%5b%5d-i.yamlnu�[���PKx|[(⼶�%ea�ri/1.8/system/YAML/Stream/edit-i.yamlnu�[���PKx|[l�D��$pb�ri/1.8/system/YAML/Stream/add-i.yamlnu�[���PKx|[Ԇww+oc�ri/1.8/system/YAML/Stream/cdesc-Stream.yamlnu�[���PKx|[�5�8��$Af�ri/1.8/system/YAML/Stream/new-c.yamlnu�[���PKy|[
��4��%Fg�ri/1.8/system/YAML/Stream/emit-i.yamlnu�[���PKy|[:�o{��$Mh�ri/1.8/system/YAML/Store/load-i.yamlnu�[���PKy|[�²��#Oi�ri/1.8/system/YAML/Store/new-c.yamlnu�[���PKy|[5�����)Kj�ri/1.8/system/YAML/Store/cdesc-Store.yamlnu�[���PKy|[}Y����2�m�ri/1.8/system/YAML/Store/empty_marshal_data-i.yamlnu�[���PKy|[.�'���I�n�ri/1.8/system/YAML/Store/marshal_dump_supports_canonical_option%3f-i.yamlnu�[���PKz|[�$���6p�ri/1.8/system/YAML/Store/empty_marshal_checksum-i.yamlnu�[���PKz|[k��'��$Bq�ri/1.8/system/YAML/Store/dump-i.yamlnu�[���PKz|[��h'99,Br�ri/1.8/system/YAML/Syck/Node/cdesc-Node.yamlnu�[���PK{|[�����'�s�ri/1.8/system/YAML/Syck/cdesc-Syck.yamlnu�[���PK{|[�G�kJJ)�t�ri/1.8/system/YAML/parse_documents-c.yamlnu�[���PK{|[��gȹ�(�w�ri/1.8/system/YAML/Object/to_yaml-i.yamlnu�[���PK{|[�w��\\+�x�ri/1.8/system/YAML/Object/cdesc-Object.yamlnu�[���PK{|[���˾�2Nz�ri/1.8/system/YAML/Object/tag_subclasses%3f-c.yamlnu�[���PK||[�-Xw&n{�ri/1.8/system/YAML/try_implicit-c.yamlnu�[���PK||[�
�*�|�ri/1.8/system/YAML/add_private_type-c.yamlnu�[���PK}|[�%-!+2~�ri/1.8/system/YAML/Loader/cdesc-Loader.yamlnu�[���PK}|[�����"���ri/1.8/system/YAML/tagurize-c.yamlnu�[���PK}|[��) ��ri/1.8/system/YAML/escape-c.yamlnu�[���PK}|[��)))=��ri/1.8/system/YAML/add_domain_type-c.yamlnu�[���PK}|[r@�ߔ�/���ri/1.8/system/YAML/YamlNode/cdesc-YamlNode.yamlnu�[���PK}|[�
��,���ri/1.8/system/YAML/YamlNode/transform-i.yamlnu�[���PK}|[�+@���&��ri/1.8/system/YAML/YamlNode/new-c.yamlnu�[���PK�|[�s� ��,��ri/1.8/system/YAML/SpecialHash/update-i.yamlnu�[���PK�|[d�'4!!5'��ri/1.8/system/YAML/SpecialHash/cdesc-SpecialHash.yamlnu�[���PK�|[���ؾ�-���ri/1.8/system/YAML/SpecialHash/to_yaml-i.yamlnu�[���PK�|[��,���-Ȏ�ri/1.8/system/YAML/SpecialHash/inspect-i.yamlnu�[���PK�|[�%Q���*؏�ri/1.8/system/YAML/SpecialHash/to_s-i.yamlnu�[���PK�|[;�jA"ߐ�ri/1.8/system/YAML/transfer-c.yamlnu�[���PK�|[�
Iֽ�,4��ri/1.8/system/YAML/DomainType/to_yaml-i.yamlnu�[���PK�|[��P���(M��ri/1.8/system/YAML/DomainType/new-c.yamlnu�[���PK�|[i{�̓�3b��ri/1.8/system/YAML/DomainType/cdesc-DomainType.yamlnu�[���PK�|[�|J���6X��ri/1.8/system/YAML/DomainType/tag_subclasses%3f-c.yamlnu�[���PK�|[���'���ri/1.8/system/YAML/each_document-c.yamlnu�[���PK�|[��\�__&��ri/1.8/system/Abbrev/cdesc-Abbrev.yamlnu�[���PK�|[5@yss"���ri/1.8/system/Abbrev/abbrev-i.yamlnu�[���PK�|[^��<< j��ri/1.8/system/Mail/%5b%5d-i.yamlnu�[���PK�|[�
������ri/1.8/system/Mail/body-i.yamlnu�[���PK�|[I����� 5��ri/1.8/system/Mail/header-i.yamlnu�[���PK�|[���DDk��ri/1.8/system/Mail/new-c.yamlnu�[���PK�|[,�>��"���ri/1.8/system/Mail/cdesc-Mail.yamlnu�[���PK�|[�ԯ��,C��ri/1.8/system/TailGroup/cdesc-TailGroup.yamlnu�[���PK�|[�V'�tt#l��ri/1.8/system/FalseClass/%7c-i.yamlnu�[���PK�|[m ~���#3��ri/1.8/system/FalseClass/%26-i.yamlnu�[���PK�|[�E"��'��ri/1.8/system/FalseClass/to_yaml-i.yamlnu�[���PK�|[�*����.'��ri/1.8/system/FalseClass/cdesc-FalseClass.yamlnu�[���PK�|[���t��$G��ri/1.8/system/FalseClass/to_s-i.yamlnu�[���PK�|[}@2���#���ri/1.8/system/FalseClass/%5e-i.yamlnu�[���PK�|[����

f��ri/1.8/system/Set/size-i.yamlnu�[���PK�|[���u"" ���ri/1.8/system/Set/flatten-i.yamlnu�[���PK�|[�K2��!2��ri/1.8/system/Set/empty%3f-i.yamlnu�[���PK�|[��\�x��ri/1.8/system/Set/merge-i.yamlnu�[���PK�|[P�;z��߻�ri/1.8/system/Set/union-i.yamlnu�[���PK�|[��6�VV��ri/1.8/system/Set/each-i.yamlnu�[���PK�|[�2���ri/1.8/system/Set/to_a-i.yamlnu�[���PK�|[��3�$���ri/1.8/system/Set/superset%3f-i.yamlnu�[���PK�|[��LppV��ri/1.8/system/Set/%7c-i.yamlnu�[���PK�|[����LL��ri/1.8/system/Set/%26-i.yamlnu�[���PK�|[OED�����ri/1.8/system/Set/divide-i.yamlnu�[���PK�|[Է׶77���ri/1.8/system/Set/delete-i.yamlnu�[���PK�|[���##!
��ri/1.8/system/Set/subtract-i.yamlnu�[���PK�|[����"~��ri/1.8/system/Set/member%3f-i.yamlnu�[���PK�|[SƱ"���ri/1.8/system/Set/reject%21-i.yamlnu�[���PK�|[^�$00"��ri/1.8/system/Set/delete_if-i.yamlnu�[���PK�|[��ryQQ���ri/1.8/system/Set/add-i.yamlnu�[���PK�|[t���II =��ri/1.8/system/Set/inspect-i.yamlnu�[���PK�|[n-))���ri/1.8/system/Set/add%3f-i.yamlnu�[���PK�|[H߁+N��ri/1.8/system/Set/proper_superset%3f-i.yamlnu�[���PK�|[x��**#���ri/1.8/system/Set/include%3f-i.yamlnu�[���PK�|[�yL��C��ri/1.8/system/Set/new-c.yamlnu�[���PK�|[����%"��ri/1.8/system/Set/intersection-i.yamlnu�[���PK�|[�	�"a��ri/1.8/system/Set/subset%3f-i.yamlnu�[���PK�|[�@~�EE#���ri/1.8/system/Set/flatten%21-i.yamlnu�[���PK�|[��a11 M��ri/1.8/system/Set/replace-i.yamlnu�[���PK�|[�[w��(���ri/1.8/system/Set/initialize_copy-i.yamlnu�[���PK�|[�"!>��&��ri/1.8/system/Set/flatten_merge-i.yamlnu�[���PK�|[K�N�__!4��ri/1.8/system/Set/classify-i.yamlnu�[���PK�|[��$1�����ri/1.8/system/Set/length-i.yamlnu�[���PK�|[�aU�����ri/1.8/system/Set/%2b-i.yamlnu�[���PK�|[��3���(��ri/1.8/system/Set/%3c%3c-i.yamlnu�[���PK�|[a��33J��ri/1.8/system/Set/%3d%3d-i.yamlnu�[���PK�|[��������ri/1.8/system/Set/map%21-i.yamlnu�[���PK�|[�
�� ���ri/1.8/system/Set/cdesc-Set.yamlnu�[���PK�|[
�x�00"��ri/1.8/system/Set/delete%3f-i.yamlnu�[���PK�|[<H�gcc]��ri/1.8/system/Set/%5e-i.yamlnu�[���PK�|[9�����#��ri/1.8/system/Set/difference-i.yamlnu�[���PK�|[1U®��A��ri/1.8/system/Set/%5b%5d-c.yamlnu�[���PK�|[X�������ri/1.8/system/Set/clear-i.yamlnu�[���PK�|[�ݥX)��ri/1.8/system/Set/proper_subset%3f-i.yamlnu�[���PK�|[�M��ee/�ri/1.8/system/Set/%2d-i.yamlnu�[���PK�|[�%�#��ri/1.8/system/Set/collect%21-i.yamlnu�[���PK�|[<�5�� O�ri/1.8/system/Complex/%25-i.yamlnu�[���PK�|[�0�#��ri/1.8/system/Complex/new%21-c.yamlnu�[���PK�|[���z

#�ri/1.8/system/Complex/%2a%2a-i.yamlnu�[���PK�|[�����&]	�ri/1.8/system/Complex/%3c%3d%3e-i.yamlnu�[���PK�|[Qbv�#�
�ri/1.8/system/Complex/coerce-i.yamlnu�[���PK�|[��[�� �ri/1.8/system/Complex/%2f-i.yamlnu�[���PK�|[�{�p��&B
�ri/1.8/system/Complex/numerator-i.yamlnu�[���PK�|[�f<a�� o�ri/1.8/system/Complex/quo-i.yamlnu�[���PK�|[,w�S��!e�ri/1.8/system/Complex/abs2-i.yamlnu�[���PK�|[����!��ri/1.8/system/Complex/hash-i.yamlnu�[���PK�|[�w� ��ri/1.8/system/Complex/abs-i.yamlnu�[���PK�|[�w�~��"G�ri/1.8/system/Complex/angle-i.yamlnu�[���PK�|[X~���� s�ri/1.8/system/Complex/%2a-i.yamlnu�[���PK�|[d�y�//"��ri/1.8/system/Complex/polar-c.yamlnu�[���PK�|[AJ%�$8�ri/1.8/system/Complex/inspect-i.yamlnu�[���PK�|[��	�� ��ri/1.8/system/Complex/new-c.yamlnu�[���PK�|[�Dž8��(��ri/1.8/system/Complex/denominator-i.yamlnu�[���PK�|[p3.��� ��ri/1.8/system/Complex/%2b-i.yamlnu�[���PK�|[:�T��"�ri/1.8/system/Complex/polar-i.yamlnu�[���PK�|[��_L��!S�ri/1.8/system/Complex/conj-i.yamlnu�[���PK�|[4����!��ri/1.8/system/Complex/to_s-i.yamlnu�[���PK�|[���#��ri/1.8/system/Complex/%3d%3d-i.yamlnu�[���PK�|[�ө���((!�ri/1.8/system/Complex/cdesc-Complex.yamlnu�[���PK�|[�	J44&S)�ri/1.8/system/Complex/conjugate-i.yamlnu�[���PK�|[�/γ   �*�ri/1.8/system/Complex/arg-i.yamlnu�[���PK�|[�.`��� M,�ri/1.8/system/Complex/%2d-i.yamlnu�[���PK�|[�͇~~.�-�ri/1.8/system/IndexError/cdesc-IndexError.yamlnu�[���PK�|[ʶ��''*j0�ri/1.8/system/OpenURI/Meta/cdesc-Meta.yamlnu�[���PK�|[�<ff.�6�ri/1.8/system/OpenURI/Meta/content_type-i.yamlnu�[���PK�|[<���dd2�8�ri/1.8/system/OpenURI/Meta/content_encoding-i.yamlnu�[���PK�|[J����)u:�ri/1.8/system/OpenURI/Meta/charset-i.yamlnu�[���PK�|[Ba�3/{=�ri/1.8/system/OpenURI/Meta/last_modified-i.yamlnu�[���PK�|[�U���*�>�ri/1.8/system/OpenURI/OpenRead/read-i.yamlnu�[���PK�|[@7�0*�@�ri/1.8/system/OpenURI/OpenRead/open-i.yamlnu�[���PK�|[�V�\\2UR�ri/1.8/system/OpenURI/OpenRead/cdesc-OpenRead.yamlnu�[���PK�|[�~��444T�ri/1.8/system/OpenURI/HTTPError/cdesc-HTTPError.yamlnu�[���PK�|[���f��*�U�ri/1.8/system/OpenURI/HTTPError/new-c.yamlnu�[���PK�|[�Ag���.�V�ri/1.8/system/OpenURI/Buffer/cdesc-Buffer.yamlnu�[���PK�|[�.�	xx(�W�ri/1.8/system/OpenURI/cdesc-OpenURI.yamlnu�[���PK�|[��7&�`�ri/1.8/system/Signal/cdesc-Signal.yamlnu�[���PK�|[1�跔� g�ri/1.8/system/Signal/list-c.yamlnu�[���PK�|[-�?rr �k�ri/1.8/system/Signal/trap-c.yamlnu�[���PK�|[t�U��'�q�ri/1.8/system/XSD/XSDBoolean/new-c.yamlnu�[���PK�|[�Տ�2�r�ri/1.8/system/XSD/XSDBoolean/cdesc-XSDBoolean.yamlnu�[���PK�|[��7���/�t�ri/1.8/system/XSD/XSDBoolean/screen_data-i.yamlnu�[���PK�|[�����+�u�ri/1.8/system/XSD/NamedElements/size-i.yamlnu�[���PK�|[�V)��-�v�ri/1.8/system/XSD/NamedElements/%5b%5d-i.yamlnu�[���PK�|[�{�>��/�w�ri/1.8/system/XSD/NamedElements/empty%3f-i.yamlnu�[���PK�|[4�mQ��+�x�ri/1.8/system/XSD/NamedElements/each-i.yamlnu�[���PK�|[M�Q��2z�ri/1.8/system/XSD/NamedElements/elements%3d-i.yamlnu�[���PK�|[1�H��06{�ri/1.8/system/XSD/NamedElements/find_name-i.yamlnu�[���PK�|[myڬ�*R|�ri/1.8/system/XSD/NamedElements/dup-i.yamlnu�[���PK�|[8��s��-X}�ri/1.8/system/XSD/NamedElements/concat-i.yamlnu�[���PK�|[`���-j~�ri/1.8/system/XSD/NamedElements/delete-i.yamlnu�[���PK�|[�K��*|�ri/1.8/system/XSD/NamedElements/new-c.yamlnu�[���PK�|[n+��*���ri/1.8/system/XSD/NamedElements/%2b-i.yamlnu�[���PK�|[F=E��-���ri/1.8/system/XSD/NamedElements/%3c%3c-i.yamlnu�[���PK�|[��@��+���ri/1.8/system/XSD/NamedElements/keys-i.yamlnu�[���PK�|[���!!8���ri/1.8/system/XSD/NamedElements/cdesc-NamedElements.yamlnu�[���PK�|[��ײ�-%��ri/1.8/system/XSD/NamedElements/freeze-i.yamlnu�[���PK�|[ap���/4��ri/1.8/system/XSD/NamedElements/elements-i.yamlnu�[���PK�|[X��߸�+L��ri/1.8/system/XSD/XSDUnsignedInt/new-c.yamlnu�[���PK�|[$/���4_��ri/1.8/system/XSD/XSDUnsignedInt/mininclusive-i.yamlnu�[���PK�|[�����:���ri/1.8/system/XSD/XSDUnsignedInt/cdesc-XSDUnsignedInt.yamlnu�[���PK�|[�]l��4���ri/1.8/system/XSD/XSDUnsignedInt/maxinclusive-i.yamlnu�[���PK�|[�	s���#��ri/1.8/system/XSD/XSDNil/new-c.yamlnu�[���PK�|[+⏙�*��ri/1.8/system/XSD/XSDNil/cdesc-XSDNil.yamlnu�[���PK�|[����>ْ�ri/1.8/system/XSD/XMLParser/XMLScanner/scanner_kcode%3d-i.yamlnu�[���PK�|[�8�c��5��ri/1.8/system/XSD/XMLParser/XMLScanner/on_etag-i.yamlnu�[���PK�|[�yQ��?x��ri/1.8/system/XSD/XMLParser/XMLScanner/on_attr_entityref-i.yamlnu�[���PK�|[�V�6��5���ri/1.8/system/XSD/XMLParser/XMLScanner/warning-i.yamlnu�[���PK�|[V�����;ޗ�ri/1.8/system/XSD/XMLParser/XMLScanner/on_attr_value-i.yamlnu�[���PK�|[�e���9��ri/1.8/system/XSD/XMLParser/XMLScanner/parse_error-i.yamlnu�[���PK�|[/�;�?D��ri/1.8/system/XSD/XMLParser/XMLScanner/on_stag_end_empty-i.yamlnu�[���PK�|[E���=˛�ri/1.8/system/XSD/XMLParser/XMLScanner/on_attr_charref-i.yamlnu�[���PK�|[��Aa��>��ri/1.8/system/XSD/XMLParser/XMLScanner/wellformed_error-i.yamlnu�[���PK�|[W����6G��ri/1.8/system/XSD/XMLParser/XMLScanner/do_parse-i.yamlnu�[���PK�|[��	���8}��ri/1.8/system/XSD/XMLParser/XMLScanner/on_charref-i.yamlnu�[���PK�|[&^���A���ri/1.8/system/XSD/XMLParser/XMLScanner/on_xmldecl_encoding-i.yamlnu�[���PK�|[K�QQ<��ri/1.8/system/XSD/XMLParser/XMLScanner/cdesc-XMLScanner.yamlnu�[���PK�|[{���:���ri/1.8/system/XSD/XMLParser/XMLScanner/on_attribute-i.yamlnu�[���PK�|[�`"c��5��ri/1.8/system/XSD/XMLParser/XMLScanner/on_stag-i.yamlnu�[���PK�|[|Hu���9F��ri/1.8/system/XSD/XMLParser/XMLScanner/valid_error-i.yamlnu�[���PK�|[���+��Av��ri/1.8/system/XSD/XMLParser/XMLScanner/on_attr_charref_hex-i.yamlnu�[���PK�|[��^D9���ri/1.8/system/XSD/XMLParser/XMLScanner/on_chardata-i.yamlnu�[���PK�|[s�qB��9.��ri/1.8/system/XSD/XMLParser/XMLScanner/on_stag_end-i.yamlnu�[���PK�|[F�a)

@_��ri/1.8/system/XSD/XMLParser/XMLScanner/on_xmldecl_version-i.yamlnu�[���PK�|[ &��<ܱ�ri/1.8/system/XSD/XMLParser/XMLScanner/on_charref_hex-i.yamlnu�[���PK�|[�E!���:��ri/1.8/system/XSD/XMLParser/XMLScanner/on_entityref-i.yamlnu�[���PK�|[@%�JBI��ri/1.8/system/XSD/XMLParser/XMLParser/Listener/cdesc-Listener.yamlnu�[���PK�|[�S$��5ѵ�ri/1.8/system/XSD/XMLParser/XMLParser/do_parse-i.yamlnu�[���PK�|[�T:��ri/1.8/system/XSD/XMLParser/XMLParser/cdesc-XMLParser.yamlnu�[���PK�|[C���0~��ri/1.8/system/XSD/XMLParser/create_parser-i.yamlnu�[���PK�|[�#>��6���ri/1.8/system/XSD/XMLParser/REXMLParser/tag_end-i.yamlnu�[���PK�|[c)��6ʺ�ri/1.8/system/XSD/XMLParser/REXMLParser/xmldecl-i.yamlnu�[���PK�|[Y�����7
��ri/1.8/system/XSD/XMLParser/REXMLParser/do_parse-i.yamlnu�[���PK�|[�j�aKK>B��ri/1.8/system/XSD/XMLParser/REXMLParser/cdesc-REXMLParser.yamlnu�[���PK�|[O���7���ri/1.8/system/XSD/XMLParser/REXMLParser/epilogue-i.yamlnu�[���PK�|[-��]��3!��ri/1.8/system/XSD/XMLParser/REXMLParser/text-i.yamlnu�[���PK�|[�W���8?��ri/1.8/system/XSD/XMLParser/REXMLParser/tag_start-i.yamlnu�[���PK�|[��#���,s��ri/1.8/system/XSD/XMLParser/filter_ns-i.yamlnu�[���PK�|[9�y}��0���ri/1.8/system/XSD/XMLParser/cdesc-XMLParser.yamlnu�[���PK�|[�N�(��2���ri/1.8/system/XSD/XMLParser/Parser/prologue-i.yamlnu�[���PK�|[{�k��Q���ri/1.8/system/XSD/XMLParser/Parser/FormatDecodeError/cdesc-FormatDecodeError.yamlnu�[���PK�|[U%��Y6��ri/1.8/system/XSD/XMLParser/Parser/UnknownAttributeError/cdesc-UnknownAttributeError.yamlnu�[���PK�|[��p���/���ri/1.8/system/XSD/XMLParser/Parser/parse-i.yamlnu�[���PK�|[�M
��U���ri/1.8/system/XSD/XMLParser/Parser/UnknownElementError/cdesc-UnknownElementError.yamlnu�[���PK�|[�*,��[Y��ri/1.8/system/XSD/XMLParser/Parser/ElementConstraintError/cdesc-ElementConstraintError.yamlnu�[���PK�|[�HTo��2���ri/1.8/system/XSD/XMLParser/Parser/do_parse-i.yamlnu�[���PK�|[��yy4��ri/1.8/system/XSD/XMLParser/Parser/cdesc-Parser.yamlnu�[���PK�|[$����-���ri/1.8/system/XSD/XMLParser/Parser/new-c.yamlnu�[���PK�|[�0�A��5��ri/1.8/system/XSD/XMLParser/Parser/end_element-i.yamlnu�[���PK�|[-	p���71��ri/1.8/system/XSD/XMLParser/Parser/start_element-i.yamlnu�[���PK�|[� �
��Ch��ri/1.8/system/XSD/XMLParser/Parser/ParseError/cdesc-ParseError.yamlnu�[���PK�|[�;���2���ri/1.8/system/XSD/XMLParser/Parser/epilogue-i.yamlnu�[���PK�|[�����4���ri/1.8/system/XSD/XMLParser/Parser/characters-i.yamlnu�[���PK�|[6k���5���ri/1.8/system/XSD/XMLParser/Parser/add_factory-c.yamlnu�[���PK�|[��D���[#��ri/1.8/system/XSD/XMLParser/Parser/UnexpectedElementError/cdesc-UnexpectedElementError.yamlnu�[���PK�|[!����=���ri/1.8/system/XSD/XMLParser/Parser/xmldecl_encoding%3d-i.yamlnu�[���PK�|[��� ��7���ri/1.8/system/XSD/XMLParser/Parser/create_parser-c.yamlnu�[���PK�|[��=��1$��ri/1.8/system/XSD/XMLParser/Parser/factory-c.yamlnu�[���PK�|[J�?���/=��ri/1.8/system/XSD/XSDAnySimpleType/_to_s-i.yamlnu�[���PK�|[2�J޽�.P��ri/1.8/system/XSD/XSDAnySimpleType/init-i.yamlnu�[���PK�|[�ۣ$jj-k��ri/1.8/system/XSD/XSDAnySimpleType/set-i.yamlnu�[���PK�|[ZC���-2��ri/1.8/system/XSD/XSDAnySimpleType/new-c.yamlnu�[���PK�|[���^5I��ri/1.8/system/XSD/XSDAnySimpleType/screen_data-i.yamlnu�[���PK�|[�r�2ff>���ri/1.8/system/XSD/XSDAnySimpleType/cdesc-XSDAnySimpleType.yamlnu�[���PK�|[�8�>���ri/1.8/system/XSD/XSDAnySimpleType/check_lexical_format-i.yamlnu�[���PK�|[�u*((.��ri/1.8/system/XSD/XSDAnySimpleType/to_s-i.yamlnu�[���PK�|[Z>�A��.���ri/1.8/system/XSD/XSDAnySimpleType/_set-i.yamlnu�[���PK�|[��P��,���ri/1.8/system/XSD/XSDHexBinary/string-i.yamlnu�[���PK�|[+�x��1���ri/1.8/system/XSD/XSDHexBinary/set_encoded-i.yamlnu�[���PK�|[�L��)���ri/1.8/system/XSD/XSDHexBinary/new-c.yamlnu�[���PK�|[����1&��ri/1.8/system/XSD/XSDHexBinary/screen_data-i.yamlnu�[���PK�|[/�c���6H��ri/1.8/system/XSD/XSDHexBinary/cdesc-XSDHexBinary.yamlnu�[���PK�|[@).�ZZ.���ri/1.8/system/XSD/XSDFloat/cdesc-XSDFloat.yamlnu�[���PK�|[laku��-b��ri/1.8/system/XSD/XSDFloat/positive%3f-c.yamlnu�[���PK�|['���'x��ri/1.8/system/XSD/XSDFloat/_to_s-i.yamlnu�[���PK�|[�M!��%{��ri/1.8/system/XSD/XSDFloat/new-c.yamlnu�[���PK�|[#i㈽�-���ri/1.8/system/XSD/XSDFloat/screen_data-i.yamlnu�[���PK�|[Yp�z-���ri/1.8/system/XSD/XSDFloat/narrow32bit-i.yamlnu�[���PK�|[)�Pƌ�0�ri/1.8/system/XSD/XSDAnyURI/cdesc-XSDAnyURI.yamlnu�[���PK�|[���&��ri/1.8/system/XSD/XSDAnyURI/new-c.yamlnu�[���PK�|[)����.�ri/1.8/system/XSD/XSDAnyURI/screen_data-i.yamlnu�[���PK�|[/�!�--4 �ri/1.8/system/XSD/XSDDateTime/cdesc-XSDDateTime.yamlnu�[���PK�|[�"_���*��ri/1.8/system/XSD/XSDDateTime/_to_s-i.yamlnu�[���PK�|[E�l���(��ri/1.8/system/XSD/XSDDateTime/new-c.yamlnu�[���PK�|[`Ѵ���4��ri/1.8/system/XSD/XSDDateTime/screen_data_str-i.yamlnu�[���PK�|[;f���)�	�ri/1.8/system/XSD/XSDDateTime/_set-i.yamlnu�[���PK�|[&}���8�
�ri/1.8/system/XSD/CodeGen/CommentDef/dump_comment-i.yamlnu�[���PK�|[�vN�pp:&�ri/1.8/system/XSD/CodeGen/CommentDef/cdesc-CommentDef.yamlnu�[���PK�|[n�V���8�ri/1.8/system/XSD/CodeGen/GenSupport/uncapitalize-i.yamlnu�[���PK�|[#�4���12�ri/1.8/system/XSD/CodeGen/GenSupport/untab-i.yamlnu�[���PK�|[ ����7V�ri/1.8/system/XSD/CodeGen/GenSupport/trim_indent-i.yamlnu�[���PK�|[��$��:��ri/1.8/system/XSD/CodeGen/GenSupport/safevarname%3f-i.yamlnu�[���PK�|[g�G��7��ri/1.8/system/XSD/CodeGen/GenSupport/safevarname-i.yamlnu�[���PK�|[�#[���6��ri/1.8/system/XSD/CodeGen/GenSupport/capitalize-i.yamlnu�[���PK�|[�,�)��9�ri/1.8/system/XSD/CodeGen/GenSupport/safeconstname-i.yamlnu�[���PK�|[��Y��:A�ri/1.8/system/XSD/CodeGen/GenSupport/safemethodname-i.yamlnu�[���PK�|[
ό*��=w�ri/1.8/system/XSD/CodeGen/GenSupport/safemethodname%3f-i.yamlnu�[���PK�|[`�����2��ri/1.8/system/XSD/CodeGen/GenSupport/format-i.yamlnu�[���PK�|[�ݜB��:��ri/1.8/system/XSD/CodeGen/GenSupport/dump_emptyline-i.yamlnu�[���PK�|[���:��:�ri/1.8/system/XSD/CodeGen/GenSupport/cdesc-GenSupport.yamlnu�[���PK�|[��X��63�ri/1.8/system/XSD/CodeGen/GenSupport/keyword%3f-i.yamlnu�[���PK�|[֧1���<Y �ri/1.8/system/XSD/CodeGen/GenSupport/safeconstname%3f-i.yamlnu�[���PK�|[�,���4�!�ri/1.8/system/XSD/CodeGen/GenSupport/trim_eol-i.yamlnu�[���PK�|[�8��GG,�"�ri/1.8/system/XSD/CodeGen/cdesc-CodeGen.yamlnu�[���PK�|[P��Z��8X$�ri/1.8/system/XSD/CodeGen/ClassDef/dump_class_def-i.yamlnu�[���PK�|[��&��7�%�ri/1.8/system/XSD/CodeGen/ClassDef/dump_accessor-i.yamlnu�[���PK�|[�����7�&�ri/1.8/system/XSD/CodeGen/ClassDef/dump_classvar-i.yamlnu�[���PK�|[�4d���-�'�ri/1.8/system/XSD/CodeGen/ClassDef/new-c.yamlnu�[���PK�|[
g�|��6)�ri/1.8/system/XSD/CodeGen/ClassDef/def_classvar-i.yamlnu�[���PK�|[�9M?6E*�ri/1.8/system/XSD/CodeGen/ClassDef/cdesc-ClassDef.yamlnu�[���PK�|[9�3��<�-�ri/1.8/system/XSD/CodeGen/ClassDef/dump_class_def_end-i.yamlnu�[���PK�|[�<����9/�ri/1.8/system/XSD/CodeGen/ClassDef/dump_attributes-i.yamlnu�[���PK�|[��1��230�ri/1.8/system/XSD/CodeGen/ClassDef/def_attr-i.yamlnu�[���PK�|[,�	��.w1�ri/1.8/system/XSD/CodeGen/ClassDef/dump-i.yamlnu�[���PK�|[�һ���8�2�ri/1.8/system/XSD/CodeGen/ClassDef/dump_attribute-i.yamlnu�[���PK�|[Ӯ����;�3�ri/1.8/system/XSD/CodeGen/ModuleDef/dump_package_def-i.yamlnu�[���PK�|[���45�ri/1.8/system/XSD/CodeGen/ModuleDef/def_const-i.yamlnu�[���PK�|[ܘBG��5<6�ri/1.8/system/XSD/CodeGen/ModuleDef/dump_const-i.yamlnu�[���PK�|[Q��8��4a7�ri/1.8/system/XSD/CodeGen/ModuleDef/dump_code-i.yamlnu�[���PK�|[UԿ��?�8�ri/1.8/system/XSD/CodeGen/ModuleDef/dump_package_def_end-i.yamlnu�[���PK�|[ZZ���>�9�ri/1.8/system/XSD/CodeGen/ModuleDef/dump_module_def_end-i.yamlnu�[���PK�|[LӴ�;
;�ri/1.8/system/XSD/CodeGen/ModuleDef/def_publicmethod-i.yamlnu�[���PK�|[�ҕ�<�<�ri/1.8/system/XSD/CodeGen/ModuleDef/def_privatemethod-i.yamlnu�[���PK�|[lQ����6�=�ri/1.8/system/XSD/CodeGen/ModuleDef/def_require-i.yamlnu�[���PK�|[\~��8$?�ri/1.8/system/XSD/CodeGen/ModuleDef/cdesc-ModuleDef.yamlnu�[���PK�|[9��5
E�ri/1.8/system/XSD/CodeGen/ModuleDef/dump_value-i.yamlnu�[���PK�|[��Y''57F�ri/1.8/system/XSD/CodeGen/ModuleDef/def_method-i.yamlnu�[���PK�|[����.�G�ri/1.8/system/XSD/CodeGen/ModuleDef/new-c.yamlnu�[���PK�|[CS��>�H�ri/1.8/system/XSD/CodeGen/ModuleDef/def_protectedmethod-i.yamlnu�[���PK�|[�����6IJ�ri/1.8/system/XSD/CodeGen/ModuleDef/dump_static-i.yamlnu�[���PK�|[�c\��7tK�ri/1.8/system/XSD/CodeGen/ModuleDef/dump_methods-i.yamlnu�[���PK�|[�^i��;�L�ri/1.8/system/XSD/CodeGen/ModuleDef/dump_requirepath-i.yamlnu�[���PK�|[w�H���3�M�ri/1.8/system/XSD/CodeGen/ModuleDef/def_code-i.yamlnu�[���PK�|[�k.߳�/�N�ri/1.8/system/XSD/CodeGen/ModuleDef/dump-i.yamlnu�[���PK�|[f�v��:
P�ri/1.8/system/XSD/CodeGen/ModuleDef/dump_module_def-i.yamlnu�[���PK�|[��T��5>Q�ri/1.8/system/XSD/CodeGen/ModuleDef/add_method-i.yamlnu�[���PK�|[H�����>yR�ri/1.8/system/XSD/CodeGen/MethodDef/dump_method_def_end-i.yamlnu�[���PK�|[|�J��.�S�ri/1.8/system/XSD/CodeGen/MethodDef/new-c.yamlnu�[���PK�|[^�2?��:�T�ri/1.8/system/XSD/CodeGen/MethodDef/dump_definition-i.yamlnu�[���PK�|[��Wt��80V�ri/1.8/system/XSD/CodeGen/MethodDef/cdesc-MethodDef.yamlnu�[���PK�|[��v��/Y�ri/1.8/system/XSD/CodeGen/MethodDef/dump-i.yamlnu�[���PK�|[Oq1$��:,Z�ri/1.8/system/XSD/CodeGen/MethodDef/dump_method_def-i.yamlnu�[���PK�|[���f��/`[�ri/1.8/system/XSD/XSDNegativeInteger/new-c.yamlnu�[���PK�|[P
����8{\�ri/1.8/system/XSD/XSDNegativeInteger/mininclusive-i.yamlnu�[���PK�|[0����B�]�ri/1.8/system/XSD/XSDNegativeInteger/cdesc-XSDNegativeInteger.yamlnu�[���PK�|[�x;���8�_�ri/1.8/system/XSD/XSDNegativeInteger/maxinclusive-i.yamlnu�[���PK�|[�tsө�%)a�ri/1.8/system/XSD/QName/eql%3f-i.yamlnu�[���PK�|[A(}�55('b�ri/1.8/system/XSD/QName/cdesc-QName.yamlnu�[���PK�|[���;��'�f�ri/1.8/system/XSD/QName/dup_name-i.yamlnu�[���PK�|[�H!O��#�g�ri/1.8/system/XSD/QName/hash-i.yamlnu�[���PK�|[�'ު��$�h�ri/1.8/system/XSD/QName/parse-i.yamlnu�[���PK�|[='�߫�$�i�ri/1.8/system/XSD/QName/match-i.yamlnu�[���PK�|[�d|+��&�j�ri/1.8/system/XSD/QName/inspect-i.yamlnu�[���PK�|[��-���"�k�ri/1.8/system/XSD/QName/new-c.yamlnu�[���PK�|[J�w���(�l�ri/1.8/system/XSD/QName/%3d%3d%3d-i.yamlnu�[���PK�|[�t{��#�m�ri/1.8/system/XSD/QName/to_s-i.yamlnu�[���PK�|[?#���%�n�ri/1.8/system/XSD/QName/%3d%3d-i.yamlnu�[���PK�|[_Asߦ�#�o�ri/1.8/system/XSD/QName/dump-i.yamlnu�[���PK�|[�Mdh��&�p�ri/1.8/system/XSD/XSDGDay/_to_s-i.yamlnu�[���PK�|[.��G��,�q�ri/1.8/system/XSD/XSDGDay/cdesc-XSDGDay.yamlnu�[���PK�|[�����$t�ri/1.8/system/XSD/XSDGDay/new-c.yamlnu�[���PK�|[+��.��0u�ri/1.8/system/XSD/XSDGDay/screen_data_str-i.yamlnu�[���PK�|[�7Y���D&v�ri/1.8/system/XSD/XSDNormalizedString/cdesc-XSDNormalizedString.yamlnu�[���PK�|[`2j*��0ox�ri/1.8/system/XSD/XSDNormalizedString/new-c.yamlnu�[���PK�|[�Ё}��8�y�ri/1.8/system/XSD/XSDNormalizedString/screen_data-i.yamlnu�[���PK�|[�,|��$�z�ri/1.8/system/XSD/XSDLong/new-c.yamlnu�[���PK�|[���,�{�ri/1.8/system/XSD/XSDLong/cdesc-XSDLong.yamlnu�[���PK�|[���H��-�}�ri/1.8/system/XSD/XSDLong/mininclusive-i.yamlnu�[���PK�|[Z�X^��-�~�ri/1.8/system/XSD/XSDLong/maxinclusive-i.yamlnu�[���PK�|[~����#��ri/1.8/system/XSD/NS/compare-i.yamlnu�[���PK�|[a�c���'
��ri/1.8/system/XSD/NS/assigner%3d-i.yamlnu�[���PK�|[����(��ri/1.8/system/XSD/NS/Assigner/new-c.yamlnu�[���PK�|[p�ó�+��ri/1.8/system/XSD/NS/Assigner/assign-i.yamlnu�[���PK�|[�w��1*��ri/1.8/system/XSD/NS/Assigner/cdesc-Assigner.yamlnu�[���PK�|[#�|��"���ri/1.8/system/XSD/NS/cdesc-NS.yamlnu�[���PK�|[8��+Ɖ�ri/1.8/system/XSD/NS/assigned_tag%3f-i.yamlnu�[���PK�|[G��ʯ�'ي�ri/1.8/system/XSD/NS/assigned%3f-i.yamlnu�[���PK�|[X1��!ߋ�ri/1.8/system/XSD/NS/parse-i.yamlnu�[���PK�|[x�%���$��ri/1.8/system/XSD/NS/clone_ns-i.yamlnu�[���PK�|[	�>��7��ri/1.8/system/XSD/NS/FormatError/cdesc-FormatError.yamlnu�[���PK�|[1�������ri/1.8/system/XSD/NS/new-c.yamlnu�[���PK�|[���"��ri/1.8/system/XSD/NS/assign-i.yamlnu�[���PK�|[%<�:��'��ri/1.8/system/XSD/NS/parse_local-i.yamlnu�[���PK�|[�8h��#��ri/1.8/system/XSD/NS/each_ns-i.yamlnu�[���PK�|[ʫ�֧� 3��ri/1.8/system/XSD/NS/name-i.yamlnu�[���PK�|[�D����(*��ri/1.8/system/XSD/Error/cdesc-Error.yamlnu�[���PK�|[������<E��ri/1.8/system/XSD/XSDUnsignedLong/cdesc-XSDUnsignedLong.yamlnu�[���PK�|[�a�ܹ�,���ri/1.8/system/XSD/XSDUnsignedLong/new-c.yamlnu�[���PK�|[
-�'��5���ri/1.8/system/XSD/XSDUnsignedLong/mininclusive-i.yamlnu�[���PK�|[�_]1��5ǚ�ri/1.8/system/XSD/XSDUnsignedLong/maxinclusive-i.yamlnu�[���PK�|[���&��ri/1.8/system/XSD/XSDDate/_to_s-i.yamlnu�[���PK�|[����$��ri/1.8/system/XSD/XSDDate/new-c.yamlnu�[���PK�|[�ƩQ��0��ri/1.8/system/XSD/XSDDate/screen_data_str-i.yamlnu�[���PK�|[����,��ri/1.8/system/XSD/XSDDate/cdesc-XSDDate.yamlnu�[���PK�|[�w����,a��ri/1.8/system/XSD/XSDByte/cdesc-XSDByte.yamlnu�[���PK�|[q��a��$s��ri/1.8/system/XSD/XSDByte/new-c.yamlnu�[���PK�|[?�߹�-x��ri/1.8/system/XSD/XSDByte/mininclusive-i.yamlnu�[���PK�|[�hɹ�-���ri/1.8/system/XSD/XSDByte/maxinclusive-i.yamlnu�[���PK�|[{]��<���ri/1.8/system/XSD/XSDBase64Binary/cdesc-XSDBase64Binary.yamlnu�[���PK�|[�����/��ri/1.8/system/XSD/XSDBase64Binary/string-i.yamlnu�[���PK�|[��w��4(��ri/1.8/system/XSD/XSDBase64Binary/set_encoded-i.yamlnu�[���PK�|[��"���,O��ri/1.8/system/XSD/XSDBase64Binary/new-c.yamlnu�[���PK�|[{����4���ri/1.8/system/XSD/XSDBase64Binary/screen_data-i.yamlnu�[���PK�|[��T��0ҭ�ri/1.8/system/XSD/XSDGMonth/cdesc-XSDGMonth.yamlnu�[���PK�|[:Rq߭�(*��ri/1.8/system/XSD/XSDGMonth/_to_s-i.yamlnu�[���PK�|[�dz��&/��ri/1.8/system/XSD/XSDGMonth/new-c.yamlnu�[���PK�|[o����28��ri/1.8/system/XSD/XSDGMonth/screen_data_str-i.yamlnu�[���PK�|[#n���-\��ri/1.8/system/XSD/XSDUnsignedShort/new-c.yamlnu�[���PK�|[(�@��>s��ri/1.8/system/XSD/XSDUnsignedShort/cdesc-XSDUnsignedShort.yamlnu�[���PK�|[ژ��6���ri/1.8/system/XSD/XSDUnsignedShort/mininclusive-i.yamlnu�[���PK�|[:���6��ri/1.8/system/XSD/XSDUnsignedShort/maxinclusive-i.yamlnu�[���PK�|[|����(��ri/1.8/system/XSD/Mapping/obj2xml-c.yamlnu�[���PK�|[W�����(*��ri/1.8/system/XSD/Mapping/xml2obj-c.yamlnu�[���PK�|[)K�,6��ri/1.8/system/XSD/Mapping/cdesc-Mapping.yamlnu�[���PK�|[^
�y�� ���ri/1.8/system/XSD/cdesc-XSD.yamlnu�[���PK�|[è���%}��ri/1.8/system/XSD/NSDBase/init-i.yamlnu�[���PK�|[n��$~��ri/1.8/system/XSD/NSDBase/new-c.yamlnu�[���PK�|[���,x��ri/1.8/system/XSD/NSDBase/cdesc-NSDBase.yamlnu�[���PK�|[\s���&���ri/1.8/system/XSD/NSDBase/types-c.yamlnu�[���PK�|[Z~G	��*���ri/1.8/system/XSD/NSDBase/inherited-c.yamlnu�[���PK�|[$&T��<���ri/1.8/system/XSD/XSDDateTimeImpl/cdesc-XSDDateTimeImpl.yamlnu�[���PK�|[h�匾�4���ri/1.8/system/XSD/XSDDateTimeImpl/to_datetime-i.yamlnu�[���PK�|[D���. ��ri/1.8/system/XSD/XSDDateTimeImpl/of2tz-i.yamlnu�[���PK�|[�Z:���/6��ri/1.8/system/XSD/XSDDateTimeImpl/add_tz-i.yamlnu�[���PK�|[�4���0J��ri/1.8/system/XSD/XSDDateTimeImpl/to_time-i.yamlnu�[���PK�|[�H�w��/`��ri/1.8/system/XSD/XSDDateTimeImpl/to_obj-i.yamlnu�[���PK�|[�b���0x��ri/1.8/system/XSD/XSDDateTimeImpl/to_date-i.yamlnu�[���PK�|[�E�ӿ�4���ri/1.8/system/XSD/XSDDateTimeImpl/screen_data-i.yamlnu�[���PK�|[xL���.���ri/1.8/system/XSD/XSDDateTimeImpl/tz2of-i.yamlnu�[���PK�|[ipU��2���ri/1.8/system/XSD/XSDNonNegativeInteger/new-c.yamlnu�[���PK�|[���\��H���ri/1.8/system/XSD/XSDNonNegativeInteger/cdesc-XSDNonNegativeInteger.yamlnu�[���PK�|[CY���;?��ri/1.8/system/XSD/XSDNonNegativeInteger/mininclusive-i.yamlnu�[���PK�|[�1����;q��ri/1.8/system/XSD/XSDNonNegativeInteger/maxinclusive-i.yamlnu�[���PK�|[�/���2���ri/1.8/system/XSD/XSDNonPositiveInteger/new-c.yamlnu�[���PK�|[�U,u��;���ri/1.8/system/XSD/XSDNonPositiveInteger/mininclusive-i.yamlnu�[���PK�|['�c��;���ri/1.8/system/XSD/XSDNonPositiveInteger/maxinclusive-i.yamlnu�[���PK�|[f����H(��ri/1.8/system/XSD/XSDNonPositiveInteger/cdesc-XSDNonPositiveInteger.yamlnu�[���PK�|[�����0���ri/1.8/system/XSD/XSDString/cdesc-XSDString.yamlnu�[���PK�|[fR3���&���ri/1.8/system/XSD/XSDString/new-c.yamlnu�[���PK�|[Y-^Y��.���ri/1.8/system/XSD/XSDString/screen_data-i.yamlnu�[���PK�|[�y8��<���ri/1.8/system/XSD/ValueSpaceError/cdesc-ValueSpaceError.yamlnu�[���PK�|[�腑��%��ri/1.8/system/XSD/Charset/init-c.yamlnu�[���PK�|[?��!��,��ri/1.8/system/XSD/Charset/encoding%3d-c.yamlnu�[���PK�|[�\}V��,��ri/1.8/system/XSD/Charset/cdesc-Charset.yamlnu�[���PK�|[V1d���R_��ri/1.8/system/XSD/Charset/CharsetConversionError/cdesc-CharsetConversionError.yamlnu�[���PK�|[@�1���(��ri/1.8/system/XSD/Charset/is_sjis-c.yamlnu�[���PK�|[�=���,��ri/1.8/system/XSD/Charset/is_us_ascii-c.yamlnu�[���PK�|[a����.��ri/1.8/system/XSD/Charset/charset_label-c.yamlnu�[���PK�|[7`���'�ri/1.8/system/XSD/Charset/is_euc-c.yamlnu�[���PK�|[�*$��.�ri/1.8/system/XSD/Charset/encoding_conv-c.yamlnu�[���PK�|[�CZ9��'?�ri/1.8/system/XSD/Charset/is_ces-c.yamlnu�[���PK�|[�oVG��6T�ri/1.8/system/XSD/Charset/XSDError/cdesc-XSDError.yamlnu�[���PK�|[��k���0��ri/1.8/system/XSD/Charset/encoding_to_xml-c.yamlnu�[���PK�|[=L��,��ri/1.8/system/XSD/Charset/charset_str-c.yamlnu�[���PK�|[{���L��ri/1.8/system/XSD/Charset/UnknownCharsetError/cdesc-UnknownCharsetError.yamlnu�[���PK�|[/�A��(0	�ri/1.8/system/XSD/Charset/is_utf8-c.yamlnu�[���PK�|[J�Pj��>9
�ri/1.8/system/XSD/Charset/CharsetError/cdesc-CharsetError.yamlnu�[���PK�|[������3|�ri/1.8/system/XSD/Charset/xml_encoding_label-c.yamlnu�[���PK�|[ѡ����2��ri/1.8/system/XSD/Charset/encoding_from_xml-c.yamlnu�[���PK�|[�4���)�
�ri/1.8/system/XSD/Charset/encoding-c.yamlnu�[���PK�|[A@�m��.	�ri/1.8/system/XSD/XSDGYear/cdesc-XSDGYear.yamlnu�[���PK�|[#]H���'\�ri/1.8/system/XSD/XSDGYear/_to_s-i.yamlnu�[���PK�|[n�vG��%_�ri/1.8/system/XSD/XSDGYear/new-c.yamlnu�[���PK�|[��_��1f�ri/1.8/system/XSD/XSDGYear/screen_data_str-i.yamlnu�[���PK�|[#U®�)��ri/1.8/system/XSD/XSDInteger/_to_s-i.yamlnu�[���PK�|[
�����,��ri/1.8/system/XSD/XSDInteger/positive-i.yamlnu�[���PK�|[$z�+��'��ri/1.8/system/XSD/XSDInteger/new-c.yamlnu�[���PK�|[�c�Q��3��ri/1.8/system/XSD/XSDInteger/screen_data_str-i.yamlnu�[���PK�|[z$=���,��ri/1.8/system/XSD/XSDInteger/validate-i.yamlnu�[���PK�|[�#��0��ri/1.8/system/XSD/XSDInteger/mininclusive-i.yamlnu�[���PK�|[�����0�ri/1.8/system/XSD/XSDInteger/maxinclusive-i.yamlnu�[���PK�|[ ��P2�ri/1.8/system/XSD/XSDInteger/cdesc-XSDInteger.yamlnu�[���PK�|[������(��ri/1.8/system/XSD/XSDInteger/_set-i.yamlnu�[���PK�|[O�^&��.� �ri/1.8/system/XSD/XSDShort/cdesc-XSDShort.yamlnu�[���PK�|[�1�=��%�"�ri/1.8/system/XSD/XSDShort/new-c.yamlnu�[���PK�|[�.ú�.�#�ri/1.8/system/XSD/XSDShort/mininclusive-i.yamlnu�[���PK�|[H\�պ�.�$�ri/1.8/system/XSD/XSDShort/maxinclusive-i.yamlnu�[���PK�|[�F���*�%�ri/1.8/system/XSD/XSDDuration/_to_s-i.yamlnu�[���PK�|[�p���4�&�ri/1.8/system/XSD/XSDDuration/cdesc-XSDDuration.yamlnu�[���PK�|[^�f��(�*�ri/1.8/system/XSD/XSDDuration/new-c.yamlnu�[���PK�|[\NT���0,�ri/1.8/system/XSD/XSDDuration/screen_data-i.yamlnu�[���PK�|[�w�i��),-�ri/1.8/system/XSD/XSDDuration/_set-i.yamlnu�[���PK�|[)r����B6.�ri/1.8/system/XSD/XSDPositiveInteger/cdesc-XSDPositiveInteger.yamlnu�[���PK�|[X�����/�0�ri/1.8/system/XSD/XSDPositiveInteger/new-c.yamlnu�[���PK�|[��D��8�1�ri/1.8/system/XSD/XSDPositiveInteger/mininclusive-i.yamlnu�[���PK�|[RnNR��8�2�ri/1.8/system/XSD/XSDPositiveInteger/maxinclusive-i.yamlnu�[���PK�|[�IR��&�3�ri/1.8/system/XSD/XSDTime/_to_s-i.yamlnu�[���PK�|[o�P�!!,5�ri/1.8/system/XSD/XSDTime/cdesc-XSDTime.yamlnu�[���PK�|[����$}7�ri/1.8/system/XSD/XSDTime/new-c.yamlnu�[���PK�|[C�����0�8�ri/1.8/system/XSD/XSDTime/screen_data_str-i.yamlnu�[���PK�|[E����%�9�ri/1.8/system/XSD/XSDTime/_set-i.yamlnu�[���PK�|[��(��6�:�ri/1.8/system/XSD/IconvCharset/cdesc-IconvCharset.yamlnu�[���PK�|[<�;+��0<�ri/1.8/system/XSD/IconvCharset/safe_iconv-c.yamlnu�[���PK�|[�c�+��*,=�ri/1.8/system/XSD/XSDInt/cdesc-XSDInt.yamlnu�[���PK�|[�
7
��#8?�ri/1.8/system/XSD/XSDInt/new-c.yamlnu�[���PK�|[�~Nz��,;@�ri/1.8/system/XSD/XSDInt/mininclusive-i.yamlnu�[���PK�|[�l��,OA�ri/1.8/system/XSD/XSDInt/maxinclusive-i.yamlnu�[���PK�|[�9��,cB�ri/1.8/system/XSD/XSDGYearMonth/_to_s-i.yamlnu�[���PK�|[��-ҷ�*pC�ri/1.8/system/XSD/XSDGYearMonth/new-c.yamlnu�[���PK�|[�+8�D�ri/1.8/system/XSD/XSDGYearMonth/cdesc-XSDGYearMonth.yamlnu�[���PK�|[N�����6�F�ri/1.8/system/XSD/XSDGYearMonth/screen_data_str-i.yamlnu�[���PK�|[އ���)H�ri/1.8/system/XSD/XSDDecimal/_to_s-i.yamlnu�[���PK�|[��P�[[2XI�ri/1.8/system/XSD/XSDDecimal/cdesc-XSDDecimal.yamlnu�[���PK�|[ؚKS��.L�ri/1.8/system/XSD/XSDDecimal/nonzero%3f-i.yamlnu�[���PK�|[>@�F��'&M�ri/1.8/system/XSD/XSDDecimal/new-c.yamlnu�[���PK�|[Ec��/1N�ri/1.8/system/XSD/XSDDecimal/screen_data-i.yamlnu�[���PK�|[���z��3KO�ri/1.8/system/XSD/XSDDecimal/screen_data_str-i.yamlnu�[���PK�|[�3���(sP�ri/1.8/system/XSD/XSDDecimal/_set-i.yamlnu�[���PK�|[�����+{Q�ri/1.8/system/XSD/XSDGMonthDay/_to_s-i.yamlnu�[���PK�|[:ü���)�R�ri/1.8/system/XSD/XSDGMonthDay/new-c.yamlnu�[���PK�|[D:JD��5�S�ri/1.8/system/XSD/XSDGMonthDay/screen_data_str-i.yamlnu�[���PK�|[MT��6�T�ri/1.8/system/XSD/XSDGMonthDay/cdesc-XSDGMonthDay.yamlnu�[���PK�|[�u���'&W�ri/1.8/system/XSD/XSDQName/_to_s-i.yamlnu�[���PK�|[�lc��%)X�ri/1.8/system/XSD/XSDQName/new-c.yamlnu�[���PK�|[�q�`��-0Y�ri/1.8/system/XSD/XSDQName/screen_data-i.yamlnu�[���PK�|[,��p��.JZ�ri/1.8/system/XSD/XSDQName/cdesc-XSDQName.yamlnu�[���PK�|[����&�\�ri/1.8/system/XSD/XSDQName/_set-i.yamlnu�[���PK�|[�qP��,�]�ri/1.8/system/XSD/XSDUnsignedByte/new-c.yamlnu�[���PK�|[$k���<�^�ri/1.8/system/XSD/XSDUnsignedByte/cdesc-XSDUnsignedByte.yamlnu�[���PK�|[�䢰��5�`�ri/1.8/system/XSD/XSDUnsignedByte/mininclusive-i.yamlnu�[���PK�|[o�	���5b�ri/1.8/system/XSD/XSDUnsignedByte/maxinclusive-i.yamlnu�[���PK�|[/���:7c�ri/1.8/system/XSD/FloatConstants/cdesc-FloatConstants.yamlnu�[���PK�|[
6W@��(Zf�ri/1.8/system/XSD/XSDDouble/_to_s-i.yamlnu�[���PK�|[�ۺa��&_g�ri/1.8/system/XSD/XSDDouble/new-c.yamlnu�[���PK�|[�8����.hh�ri/1.8/system/XSD/XSDDouble/screen_data-i.yamlnu�[���PK�|[�c�UU0�i�ri/1.8/system/XSD/XSDDouble/cdesc-XSDDouble.yamlnu�[���PK�|[~�k:;;.9l�ri/1.8/system/Profiler__/cdesc-Profiler__.yamlnu�[���PK�|[ (]66�m�ri/1.8/system/CGI/out-i.yamlnu�[���PK�|[)C2b<2<2 Tv�ri/1.8/system/CGI/cdesc-CGI.yamlnu�[���PK�|[�T	����ri/1.8/system/CGI/print-i.yamlnu�[���PK�|[��J}��!���ri/1.8/system/CGI/unescape-c.yamlnu�[���PK�|[f�(��ri/1.8/system/CGI/Html3/cdesc-Html3.yamlnu�[���PK�|[�8����S��ri/1.8/system/CGI/error-c.yamlnu�[���PK�|[��H�(���ri/1.8/system/CGI/unescapeElement-c.yamlnu�[���PK�|[��������ri/1.8/system/CGI/header-c.yamlnu�[���PK�|[u!�Y,(��ri/1.8/system/CGI/Html4Tr/cdesc-Html4Tr.yamlnu�[���PK�|[�
u,���ri/1.8/system/CGI/Html4Fr/cdesc-Html4Fr.yamlnu�[���PK�|[ՅÈ��%��ri/1.8/system/CGI/rfc1123_date-c.yamlnu�[���PK�|[xז�]��ri/1.8/system/CGI/parse-c.yamlnu�[���PK�|[�\�(���ri/1.8/system/CGI/Html4/cdesc-Html4.yamlnu�[���PK�|[������*��ri/1.8/system/CGI/Cookie/cdesc-Cookie.yamlnu�[���PK�|[J*g��%S��ri/1.8/system/CGI/Cookie/parse-c.yamlnu�[���PK�|[F�A��(���ri/1.8/system/CGI/Cookie/value%3d-i.yamlnu�[���PK�|[Lz�KJJ)���ri/1.8/system/CGI/Cookie/secure%3d-i.yamlnu�[���PK�|[�6���#)��ri/1.8/system/CGI/Cookie/new-c.yamlnu�[���PK�|[��A��$��ri/1.8/system/CGI/Cookie/to_s-i.yamlnu�[���PK�|[�e�ooc��ri/1.8/system/CGI/header-i.yamlnu�[���PK�|[�H�*!��ri/1.8/system/CGI/read_from_cmdline-i.yamlnu�[���PK�|[iI������ri/1.8/system/CGI/cookie-c.yamlnu�[���PK�|[:n��%���ri/1.8/system/CGI/unescapeHTML-c.yamlnu�[���PK�|[b��cc���ri/1.8/system/CGI/tag-c.yamlnu�[���PK�|[�Q#�00���ri/1.8/system/CGI/new-c.yamlnu�[���PK�|[�a�*��.��ri/1.8/system/CGI/QueryExtension/%5b%5d-i.yamlnu�[���PK�|[�'�D��1
��ri/1.8/system/CGI/QueryExtension/params%3d-i.yamlnu�[���PK�|[6��*%%9c��ri/1.8/system/CGI/QueryExtension/read_from_cmdline-i.yamlnu�[���PK�|[ eVc��7���ri/1.8/system/CGI/QueryExtension/Value/cdesc-Value.yamlnu�[���PK�|[%��KK:��ri/1.8/system/CGI/QueryExtension/cdesc-QueryExtension.yamlnu�[���PK�|[f;����2��ri/1.8/system/CGI/QueryExtension/include%3f-i.yamlnu�[���PK�|[V*�`2+�ri/1.8/system/CGI/QueryExtension/raw_cookie-i.yamlnu�[���PK�|[�`Kڻ�4��ri/1.8/system/CGI/QueryExtension/multipart%3f-i.yamlnu�[���PK�|[TQrR��8��ri/1.8/system/CGI/QueryExtension/initialize_query-i.yamlnu�[���PK�|[1�2���,��ri/1.8/system/CGI/QueryExtension/keys-i.yamlnu�[���PK�|[�s�7��65�ri/1.8/system/CGI/QueryExtension/read_multipart-i.yamlnu�[���PK�|[��;;

3w�ri/1.8/system/CGI/QueryExtension/raw_cookie2-i.yamlnu�[���PK�|[Q�E���.��ri/1.8/system/CGI/QueryExtension/key%3f-i.yamlnu�[���PK�|[�rr20
�ri/1.8/system/CGI/QueryExtension/has_key%3f-i.yamlnu�[���PK�|[s�R�##'�ri/1.8/system/CGI/Session/update-i.yamlnu�[���PK�|[�ķ  3~
�ri/1.8/system/CGI/Session/MemoryStore/update-i.yamlnu�[���PK�|[���<�ri/1.8/system/CGI/Session/MemoryStore/cdesc-MemoryStore.yamlnu�[���PK�|[I�c��3�ri/1.8/system/CGI/Session/MemoryStore/delete-i.yamlnu�[���PK�|[u�>�::4v�ri/1.8/system/CGI/Session/MemoryStore/restore-i.yamlnu�[���PK�|[����0�ri/1.8/system/CGI/Session/MemoryStore/new-c.yamlnu�[���PK�|[�uT�2;�ri/1.8/system/CGI/Session/MemoryStore/close-i.yamlnu�[���PK�|[�Ue���'��ri/1.8/system/CGI/Session/%5b%5d-i.yamlnu�[���PK�|[�7{�22,�ri/1.8/system/CGI/Session/cdesc-Session.yamlnu�[���PK�|[�����'�4�ri/1.8/system/CGI/Session/delete-i.yamlnu�[���PK�|[��
1�6�ri/1.8/system/CGI/Session/FileStore/update-i.yamlnu�[���PK�|[��

1�7�ri/1.8/system/CGI/Session/FileStore/delete-i.yamlnu�[���PK�|[�f�__2\9�ri/1.8/system/CGI/Session/FileStore/restore-i.yamlnu�[���PK�|[$X���.;�ri/1.8/system/CGI/Session/FileStore/new-c.yamlnu�[���PK�|[.7<0oA�ri/1.8/system/CGI/Session/FileStore/close-i.yamlnu�[���PK�|[��i�8�B�ri/1.8/system/CGI/Session/FileStore/cdesc-FileStore.yamlnu�[���PK�|[�a�*
*
$JF�ri/1.8/system/CGI/Session/new-c.yamlnu�[���PK�|[�R��.�S�ri/1.8/system/CGI/Session/create_new_id-i.yamlnu�[���PK�|[9п??&�U�ri/1.8/system/CGI/Session/close-i.yamlnu�[���PK�|[rև��8{W�ri/1.8/system/CGI/Session/NoSession/cdesc-NoSession.yamlnu�[���PK�|[乤T��*�X�ri/1.8/system/CGI/Session/%5b%5d%3d-i.yamlnu�[���PK�|[��^�NN&Z�ri/1.8/system/CGI/escapeElement-c.yamlnu�[���PK�|[��I��.�^�ri/1.8/system/CGI/TagMaker/cdesc-TagMaker.yamlnu�[���PK�|[�����`�ri/1.8/system/CGI/escape-c.yamlnu�[���PK�|[���� �a�ri/1.8/system/CGI/message-c.yamlnu�[���PK�|[���YBB3.c�ri/1.8/system/CGI/HtmlExtension/image_button-i.yamlnu�[���PK�|[�����1�g�ri/1.8/system/CGI/HtmlExtension/text_field-i.yamlnu�[���PK�|[�8��RR8n�ri/1.8/system/CGI/HtmlExtension/cdesc-HtmlExtension.yamlnu�[���PK�|[%&�-�u�ri/1.8/system/CGI/HtmlExtension/hidden-i.yamlnu�[���PK�|[���Thh/;z�ri/1.8/system/CGI/HtmlExtension/checkbox-i.yamlnu�[���PK�|[m^��++5�ri/1.8/system/CGI/HtmlExtension/checkbox_group-i.yamlnu�[���PK�|[��U:ZZ1���ri/1.8/system/CGI/HtmlExtension/file_field-i.yamlnu�[���PK�|[����jj2M��ri/1.8/system/CGI/HtmlExtension/radio_group-i.yamlnu�[���PK�|[����/��ri/1.8/system/CGI/HtmlExtension/textarea-i.yamlnu�[���PK�|[#����3`��ri/1.8/system/CGI/HtmlExtension/radio_button-i.yamlnu�[���PK�|[ED,,+i��ri/1.8/system/CGI/HtmlExtension/form-i.yamlnu�[���PK�|[G�Jgaa1��ri/1.8/system/CGI/HtmlExtension/blockquote-i.yamlnu�[���PK�|[QA�A5���ri/1.8/system/CGI/HtmlExtension/scrolling_list-i.yamlnu�[���PK�|[ ��}@@-'��ri/1.8/system/CGI/HtmlExtension/submit-i.yamlnu�[���PK�|[��m-!!1IJ�ri/1.8/system/CGI/HtmlExtension/popup_menu-i.yamlnu�[���PK�|[�;�ɾ�+F��ri/1.8/system/CGI/HtmlExtension/base-i.yamlnu�[���PK�|[���885_��ri/1.8/system/CGI/HtmlExtension/multipart_form-i.yamlnu�[���PK�|[)����(���ri/1.8/system/CGI/HtmlExtension/a-i.yamlnu�[���PK�|[�C���,A��ri/1.8/system/CGI/HtmlExtension/reset-i.yamlnu�[���PK�|[r=�Y.J��ri/1.8/system/CGI/HtmlExtension/caption-i.yamlnu�[���PK�|[���xx5���ri/1.8/system/CGI/HtmlExtension/password_field-i.yamlnu�[���PK�|[˒#*���ri/1.8/system/CGI/HtmlExtension/img-i.yamlnu�[���PK�|[���2		+��ri/1.8/system/CGI/HtmlExtension/html-i.yamlnu�[���PK�|[���mv��ri/1.8/system/CGI/print-c.yamlnu�[���PK�|[�ت�"���ri/1.8/system/CGI/stdoutput-i.yamlnu�[���PK�|[ՋϪ�"���ri/1.8/system/CGI/env_table-i.yamlnu�[���PK�|[�>���#���ri/1.8/system/CGI/escapeHTML-c.yamlnu�[���PK�|[е�ۨ�!���ri/1.8/system/CGI/stdinput-i.yamlnu�[���PK�|[�m^�77���ri/1.8/system/CGI/pretty-c.yamlnu�[���PK�|[ї�m��(`��ri/1.8/system/Continuation/%5b%5d-i.yamlnu�[���PK�|[�l����&���ri/1.8/system/Continuation/call-i.yamlnu�[���PK�|[���K��2��ri/1.8/system/Continuation/cdesc-Continuation.yamlnu�[���PK�|[�j60;;-��ri/1.8/system/WeakRef/weakref_alive%3f-i.yamlnu�[���PK�|[	'"442g��ri/1.8/system/WeakRef/RefError/cdesc-RefError.yamlnu�[���PK�|[hx
�pp(���ri/1.8/system/WeakRef/cdesc-WeakRef.yamlnu�[���PK�|[v�Ӫ��'��ri/1.8/system/WeakRef/__getobj__-i.yamlnu�[���PK�|[�|7�� ��ri/1.8/system/WeakRef/new-c.yamlnu�[���PK�|[�*���'��ri/1.8/system/WeakRef/__setobj__-i.yamlnu�[���PK�|[/�MSMM(��ri/1.8/system/WEBrick/CGI/cdesc-CGI.yamlnu�[���PK�|[��\��'��ri/1.8/system/WEBrick/CGI/%5b%5d-i.yamlnu�[���PK�|[l�RQ��(��ri/1.8/system/WEBrick/CGI/service-i.yamlnu�[���PK�|[����$�
�ri/1.8/system/WEBrick/CGI/new-c.yamlnu�[���PK�|[g{���&��ri/1.8/system/WEBrick/CGI/start-i.yamlnu�[���PK�|[��t
��,��ri/1.8/system/WEBrick/CGI/Socket/cert-i.yamlnu�[���PK�|[�D��,��ri/1.8/system/WEBrick/CGI/Socket/each-i.yamlnu�[���PK�|[goi��,��ri/1.8/system/WEBrick/CGI/Socket/read-i.yamlnu�[���PK�|[r/�%��1�ri/1.8/system/WEBrick/CGI/Socket/peer_cert-i.yamlnu�[���PK�|[S;�,��.'�ri/1.8/system/WEBrick/CGI/Socket/cipher-i.yamlnu�[���PK�|[�Rb���29�ri/1.8/system/WEBrick/CGI/Socket/add_header-i.yamlnu�[���PK�|[�����7h�ri/1.8/system/WEBrick/CGI/Socket/peer_cert_chain-i.yamlnu�[���PK�|[#b���+��ri/1.8/system/WEBrick/CGI/Socket/new-c.yamlnu�[���PK�|[1�-���0��ri/1.8/system/WEBrick/CGI/Socket/peeraddr-i.yamlnu�[���PK�|[ZI���2��ri/1.8/system/WEBrick/CGI/Socket/cdesc-Socket.yamlnu�[���PK�|[��j��,�ri/1.8/system/WEBrick/CGI/Socket/addr-i.yamlnu�[���PK�|[�'32��,�ri/1.8/system/WEBrick/CGI/Socket/gets-i.yamlnu�[���PK�|[�]|ڲ�.1 �ri/1.8/system/WEBrick/CGI/Socket/%3c%3c-i.yamlnu�[���PK�|[8��f��-A!�ri/1.8/system/WEBrick/CGI/Socket/input-i.yamlnu�[���PK�|["�=��4Q"�ri/1.8/system/WEBrick/CGI/Socket/setup_header-i.yamlnu�[���PK�|[3�hv��4v#�ri/1.8/system/WEBrick/CGI/Socket/request_line-i.yamlnu�[���PK�|[Xde���4�$�ri/1.8/system/WEBrick/HTTPUtils/unescape_form-i.yamlnu�[���PK�|[��34�%�ri/1.8/system/WEBrick/HTTPUtils/cdesc-HTTPUtils.yamlnu�[���PK�|[�ꉿ�2;6�ri/1.8/system/WEBrick/HTTPUtils/_make_regex-i.yamlnu�[���PK�|[A=BH��0\7�ri/1.8/system/WEBrick/HTTPUtils/_unescape-i.yamlnu�[���PK�|[��l̺�6~8�ri/1.8/system/WEBrick/HTTPUtils/FormData/%5b%5d-i.yamlnu�[���PK�|[�҄Z��9�9�ri/1.8/system/WEBrick/HTTPUtils/FormData/each_data-i.yamlnu�[���PK�|[�a���6�:�ri/1.8/system/WEBrick/HTTPUtils/FormData/to_ary-i.yamlnu�[���PK�|[-���32<�ri/1.8/system/WEBrick/HTTPUtils/FormData/new-c.yamlnu�[���PK�|[�V���6P=�ri/1.8/system/WEBrick/HTTPUtils/FormData/%3c%3c-i.yamlnu�[���PK�|[1���4o>�ri/1.8/system/WEBrick/HTTPUtils/FormData/to_s-i.yamlnu�[���PK�|[u���4�?�ri/1.8/system/WEBrick/HTTPUtils/FormData/list-i.yamlnu�[���PK�|[����;�@�ri/1.8/system/WEBrick/HTTPUtils/FormData/append_data-i.yamlnu�[���PK�|[�F,��<B�ri/1.8/system/WEBrick/HTTPUtils/FormData/cdesc-FormData.yamlnu�[���PK�|[0|Z��5/F�ri/1.8/system/WEBrick/HTTPUtils/_make_regex%21-i.yamlnu�[���PK�|[
� ���0UG�ri/1.8/system/WEBrick/HTTPUtils/mime_type-i.yamlnu�[���PK�|[�����.H�ri/1.8/system/WEBrick/HTTPUtils/dequote-i.yamlnu�[���PK�|[c���6�I�ri/1.8/system/WEBrick/HTTPUtils/parse_form_data-i.yamlnu�[���PK�|[��S>��5�J�ri/1.8/system/WEBrick/HTTPUtils/normalize_path-i.yamlnu�[���PK�|[|1�Y��2�K�ri/1.8/system/WEBrick/HTTPUtils/escape_path-i.yamlnu�[���PK�|[�/Lo��1M�ri/1.8/system/WEBrick/HTTPUtils/escape8bit-i.yamlnu�[���PK�|[qv����/7N�ri/1.8/system/WEBrick/HTTPUtils/unescape-i.yamlnu�[���PK�|[��6���2OO�ri/1.8/system/WEBrick/HTTPUtils/escape_form-i.yamlnu�[���PK�|[���-pP�ri/1.8/system/WEBrick/HTTPUtils/escape-i.yamlnu�[���PK�|[hM{��3�Q�ri/1.8/system/WEBrick/HTTPUtils/parse_header-i.yamlnu�[���PK�|[�t��9�R�ri/1.8/system/WEBrick/HTTPUtils/split_header_value-i.yamlnu�[���PK�|[6X1
��,�S�ri/1.8/system/WEBrick/HTTPUtils/quote-i.yamlnu�[���PK�|[A��I6�T�ri/1.8/system/WEBrick/HTTPUtils/load_mime_types-i.yamlnu�[���PK�|[I�=3��9hV�ri/1.8/system/WEBrick/HTTPUtils/parse_range_header-i.yamlnu�[���PK�|[�yu���2�W�ri/1.8/system/WEBrick/HTTPUtils/parse_query-i.yamlnu�[���PK�|[������4�X�ri/1.8/system/WEBrick/HTTPUtils/parse_qvalues-i.yamlnu�[���PK�|[7��.�Y�ri/1.8/system/WEBrick/HTTPUtils/_escape-i.yamlnu�[���PK�|[�D���([�ri/1.8/system/WEBrick/cdesc-WEBrick.yamlnu�[���PK�|[��zh��/_�ri/1.8/system/WEBrick/SimpleServer/start-c.yamlnu�[���PK�|[b.���:(`�ri/1.8/system/WEBrick/SimpleServer/cdesc-SimpleServer.yamlnu�[���PK�|[��7���-�a�ri/1.8/system/WEBrick/HTMLUtils/escape-i.yamlnu�[���PK�|[�p����4�b�ri/1.8/system/WEBrick/HTMLUtils/cdesc-HTMLUtils.yamlnu�[���PK�|[T�F��$�c�ri/1.8/system/WEBrick/Log/log-i.yamlnu�[���PK�|[�l5���$�d�ri/1.8/system/WEBrick/Log/new-c.yamlnu�[���PK�|[�?Q��(f�ri/1.8/system/WEBrick/Log/cdesc-Log.yamlnu�[���PK�|[��n��&�g�ri/1.8/system/WEBrick/Log/debug-i.yamlnu�[���PK�|[��Q��*i�ri/1.8/system/WEBrick/BasicLog/info-i.yamlnu�[���PK�|[;5�h��-
j�ri/1.8/system/WEBrick/BasicLog/info%3f-i.yamlnu�[���PK�|[��[��+k�ri/1.8/system/WEBrick/BasicLog/error-i.yamlnu�[���PK�|[4e��.#l�ri/1.8/system/WEBrick/BasicLog/fatal%3f-i.yamlnu�[���PK�|[����+2m�ri/1.8/system/WEBrick/BasicLog/fatal-i.yamlnu�[���PK�|[�U�i��)?n�ri/1.8/system/WEBrick/BasicLog/log-i.yamlnu�[���PK�|[IW(���)No�ri/1.8/system/WEBrick/BasicLog/new-c.yamlnu�[���PK�|[Թ�Q��,ip�ri/1.8/system/WEBrick/BasicLog/format-i.yamlnu�[���PK�|[�Ż'��,zq�ri/1.8/system/WEBrick/BasicLog/%3c%3c-i.yamlnu�[���PK�|[��h��+�r�ri/1.8/system/WEBrick/BasicLog/close-i.yamlnu�[���PK�|[kB���.�s�ri/1.8/system/WEBrick/BasicLog/debug%3f-i.yamlnu�[���PK�|[�Ѝ2�t�ri/1.8/system/WEBrick/BasicLog/cdesc-BasicLog.yamlnu�[���PK�|[d�_���.y�ri/1.8/system/WEBrick/BasicLog/error%3f-i.yamlnu�[���PK�|[����-$z�ri/1.8/system/WEBrick/BasicLog/warn%3f-i.yamlnu�[���PK�|[��]D��+0{�ri/1.8/system/WEBrick/BasicLog/debug-i.yamlnu�[���PK�|[,U���*=|�ri/1.8/system/WEBrick/BasicLog/warn-i.yamlnu�[���PK�|[I�r��0G}�ri/1.8/system/WEBrick/Utils/getservername-i.yamlnu�[���PK�|[9D���0c~�ri/1.8/system/WEBrick/Utils/random_string-i.yamlnu�[���PK�|[���_��3��ri/1.8/system/WEBrick/Utils/set_non_blocking-i.yamlnu�[���PK�|[RAc��,���ri/1.8/system/WEBrick/Utils/cdesc-Utils.yamlnu�[���PK�|[,
�m��3��ri/1.8/system/WEBrick/Utils/create_listeners-i.yamlnu�[���PK�|[�����:B��ri/1.8/system/WEBrick/Utils/create_self_signed_cert-i.yamlnu�[���PK�|[�����%���ri/1.8/system/WEBrick/Utils/su-i.yamlnu�[���PK�|[
Xp[��4���ri/1.8/system/WEBrick/Utils/set_close_on_exec-i.yamlnu�[���PK�|[
p���.���ri/1.8/system/WEBrick/Cookie/expires%3d-i.yamlnu�[���PK�|[��uF��5ȉ�ri/1.8/system/WEBrick/Cookie/parse_set_cookies-c.yamlnu�[���PK�|[���n//.���ri/1.8/system/WEBrick/Cookie/cdesc-Cookie.yamlnu�[���PK�|[����BB)���ri/1.8/system/WEBrick/Cookie/parse-c.yamlnu�[���PK�|[m�"'��ri/1.8/system/WEBrick/Cookie/new-c.yamlnu�[���PK�|[u�m���+x��ri/1.8/system/WEBrick/Cookie/expires-i.yamlnu�[���PK�|[�t��(���ri/1.8/system/WEBrick/Cookie/to_s-i.yamlnu�[���PK�|[�9���4���ri/1.8/system/WEBrick/Cookie/parse_set_cookie-c.yamlnu�[���PK�|[�y"���H���ri/1.8/system/WEBrick/AccessLog/AccessLogError/cdesc-AccessLogError.yamlnu�[���PK�|[߰���4
��ri/1.8/system/WEBrick/AccessLog/cdesc-AccessLog.yamlnu�[���PK�|[^Q�϶�-7��ri/1.8/system/WEBrick/AccessLog/escape-i.yamlnu�[���PK�|[�����-J��ri/1.8/system/WEBrick/AccessLog/format-i.yamlnu�[���PK�|[�n���3n��ri/1.8/system/WEBrick/AccessLog/setup_params-i.yamlnu�[���PK�|[�w�:��4p��ri/1.8/system/WEBrick/HTTPResponse/chunked%3d-i.yamlnu�[���PK�|[�����5���ri/1.8/system/WEBrick/HTTPResponse/status_line-i.yamlnu�[���PK�|[�J�q��0���ri/1.8/system/WEBrick/HTTPResponse/%5b%5d-i.yamlnu�[���PK�|[�M<v��.Ȣ�ri/1.8/system/WEBrick/HTTPResponse/each-i.yamlnu�[���PK�|[LBN7��5��ri/1.8/system/WEBrick/HTTPResponse/_write_data-i.yamlnu�[���PK�|[n�k8��6��ri/1.8/system/WEBrick/HTTPResponse/set_redirect-i.yamlnu�[���PK�|[�FoU��;M��ri/1.8/system/WEBrick/HTTPResponse/content_length%3d-i.yamlnu�[���PK�|[��z��9���ri/1.8/system/WEBrick/HTTPResponse/content_type%3d-i.yamlnu�[���PK�|[9����3���ri/1.8/system/WEBrick/HTTPResponse/set_error-i.yamlnu�[���PK�|[�M��6��ri/1.8/system/WEBrick/HTTPResponse/content_type-i.yamlnu�[���PK�|[5��.��-
��ri/1.8/system/WEBrick/HTTPResponse/new-c.yamlnu�[���PK�|[�<��4��ri/1.8/system/WEBrick/HTTPResponse/_send_file-i.yamlnu�[���PK�|[a�'���8Y��ri/1.8/system/WEBrick/HTTPResponse/content_length-i.yamlnu�[���PK�|[]O���7���ri/1.8/system/WEBrick/HTTPResponse/send_response-i.yamlnu�[���PK�|[M�5��3���ri/1.8/system/WEBrick/HTTPResponse/send_body-i.yamlnu�[���PK�|[Ӈ��3ڰ�ri/1.8/system/WEBrick/HTTPResponse/status%3d-i.yamlnu�[���PK�|[����:���ri/1.8/system/WEBrick/HTTPResponse/send_body_string-i.yamlnu�[���PK�|[a\W%��.4��ri/1.8/system/WEBrick/HTTPResponse/to_s-i.yamlnu�[���PK�|[�?����5C��ri/1.8/system/WEBrick/HTTPResponse/send_header-i.yamlnu�[���PK�|[�\HD��7m��ri/1.8/system/WEBrick/HTTPResponse/keep_alive%3f-i.yamlnu�[���PK�|[�DM�	�	:���ri/1.8/system/WEBrick/HTTPResponse/cdesc-HTTPResponse.yamlnu�[���PK�|['[ʫ��6~��ri/1.8/system/WEBrick/HTTPResponse/setup_header-i.yamlnu�[���PK�|[\�x���6���ri/1.8/system/WEBrick/HTTPResponse/send_body_io-i.yamlnu�[���PK�|[c_f��3���ri/1.8/system/WEBrick/HTTPResponse/%5b%5d%3d-i.yamlnu�[���PK�|[f���4���ri/1.8/system/WEBrick/HTTPResponse/chunked%3f-i.yamlnu�[���PK�|[�M��@��ri/1.8/system/WEBrick/HTTPServerError/cdesc-HTTPServerError.yamlnu�[���PK�|[�G7ɳ�1Y��ri/1.8/system/WEBrick/GenericServer/%5b%5d-i.yamlnu�[���PK�|[W���6m��ri/1.8/system/WEBrick/GenericServer/ssl_context-i.yamlnu�[���PK�|[�ᓺ�3���ri/1.8/system/WEBrick/GenericServer/shutdown-i.yamlnu�[���PK�|[/��ݲ�/���ri/1.8/system/WEBrick/GenericServer/stop-i.yamlnu�[���PK�|[�'���7���ri/1.8/system/WEBrick/GenericServer/start_thread-i.yamlnu�[���PK�|[��t��<���ri/1.8/system/WEBrick/GenericServer/setup_ssl_context-i.yamlnu�[���PK�|[�b���.5��ri/1.8/system/WEBrick/GenericServer/new-c.yamlnu�[���PK�|[DB��<e��ri/1.8/system/WEBrick/GenericServer/cdesc-GenericServer.yamlnu�[���PK�|[�o�Ѻ�0x��ri/1.8/system/WEBrick/GenericServer/start-i.yamlnu�[���PK�|[I�6���8���ri/1.8/system/WEBrick/GenericServer/call_callback-i.yamlnu�[���PK�|[Q�	B��1���ri/1.8/system/WEBrick/GenericServer/listen-i.yamlnu�[���PK�|[u2 ��.���ri/1.8/system/WEBrick/GenericServer/run-i.yamlnu�[���PK�|[��<���8	��ri/1.8/system/WEBrick/GenericServer/accept_client-i.yamlnu�[���PK�|[�P���.9��ri/1.8/system/WEBrick/HTTPServer/umount-i.yamlnu�[���PK�|[����5���ri/1.8/system/WEBrick/HTTPServer/lookup_server-i.yamlnu�[���PK�|[Ua����-���ri/1.8/system/WEBrick/HTTPServer/mount-i.yamlnu�[���PK�|[?��U��2���ri/1.8/system/WEBrick/HTTPServer/do_OPTIONS-i.yamlnu�[���PK�|[���h��/���ri/1.8/system/WEBrick/HTTPServer/service-i.yamlnu�[���PK�|[l�}&��2��ri/1.8/system/WEBrick/HTTPServer/mount_proc-i.yamlnu�[���PK�|[�v"��+F��ri/1.8/system/WEBrick/HTTPServer/new-c.yamlnu�[���PK�|[��,��6m��ri/1.8/system/WEBrick/HTTPServer/search_servlet-i.yamlnu�[���PK�|[��l��9���ri/1.8/system/WEBrick/HTTPServer/MountTable/%5b%5d-i.yamlnu�[���PK�|[8fo��:���ri/1.8/system/WEBrick/HTTPServer/MountTable/compile-i.yamlnu�[���PK�|[m5���9���ri/1.8/system/WEBrick/HTTPServer/MountTable/delete-i.yamlnu�[���PK�|[O΄a��<��ri/1.8/system/WEBrick/HTTPServer/MountTable/normalize-i.yamlnu�[���PK�|[��'Z��7K��ri/1.8/system/WEBrick/HTTPServer/MountTable/scan-i.yamlnu�[���PK�|[�vz(��6q��ri/1.8/system/WEBrick/HTTPServer/MountTable/new-c.yamlnu�[���PK�|[4ҫ##A���ri/1.8/system/WEBrick/HTTPServer/MountTable/cdesc-MountTable.yamlnu�[���PK�|[F�]���<$��ri/1.8/system/WEBrick/HTTPServer/MountTable/%5b%5d%3d-i.yamlnu�[���PK�|[�����/S��ri/1.8/system/WEBrick/HTTPServer/unmount-i.yamlnu�[���PK�|[���#��2���ri/1.8/system/WEBrick/HTTPServer/access_log-i.yamlnu�[���PK�|[��ڱ�+���ri/1.8/system/WEBrick/HTTPServer/run-i.yamlnu�[���PK�|[��,��4���ri/1.8/system/WEBrick/HTTPServer/virtual_host-i.yamlnu�[���PK�|[1&��@@6���ri/1.8/system/WEBrick/HTTPServer/cdesc-HTTPServer.yamlnu�[���PK�|[�����2���ri/1.8/system/WEBrick/HTTPVersion/%3c%3d%3e-i.yamlnu�[���PK�|[:�R���0���ri/1.8/system/WEBrick/HTTPVersion/convert-c.yamlnu�[���PK�|[�[G�558��ri/1.8/system/WEBrick/HTTPVersion/cdesc-HTTPVersion.yamlnu�[���PK�|[A}����,k��ri/1.8/system/WEBrick/HTTPVersion/new-c.yamlnu�[���PK�|[��A��-|��ri/1.8/system/WEBrick/HTTPVersion/to_s-i.yamlnu�[���PK�|[�^���4���ri/1.8/system/WEBrick/HTTPAuth/Htdigest/flush-i.yamlnu�[���PK�|[B�=s��3���ri/1.8/system/WEBrick/HTTPAuth/Htdigest/each-i.yamlnu�[���PK�|[�64ջ�5��ri/1.8/system/WEBrick/HTTPAuth/Htdigest/reload-i.yamlnu�[���PK�|[b�#��9'�ri/1.8/system/WEBrick/HTTPAuth/Htdigest/get_passwd-i.yamlnu�[���PK�|[-��YY;i�ri/1.8/system/WEBrick/HTTPAuth/Htdigest/cdesc-Htdigest.yamlnu�[���PK�|[�՟��2-�ri/1.8/system/WEBrick/HTTPAuth/Htdigest/new-c.yamlnu�[���PK�|[�
����9H�ri/1.8/system/WEBrick/HTTPAuth/Htdigest/set_passwd-i.yamlnu�[���PK�|[�Y����<��ri/1.8/system/WEBrick/HTTPAuth/Htdigest/delete_passwd-i.yamlnu�[���PK�|[jXdP��4��ri/1.8/system/WEBrick/HTTPAuth/Htpasswd/flush-i.yamlnu�[���PK�|[���R��3��ri/1.8/system/WEBrick/HTTPAuth/Htpasswd/each-i.yamlnu�[���PK�|[�D����5;
�ri/1.8/system/WEBrick/HTTPAuth/Htpasswd/reload-i.yamlnu�[���PK�|[��aU��9[�ri/1.8/system/WEBrick/HTTPAuth/Htpasswd/get_passwd-i.yamlnu�[���PK�|[}����2��ri/1.8/system/WEBrick/HTTPAuth/Htpasswd/new-c.yamlnu�[���PK�|[�E2��9�
�ri/1.8/system/WEBrick/HTTPAuth/Htpasswd/set_passwd-i.yamlnu�[���PK�|[�Ji��<��ri/1.8/system/WEBrick/HTTPAuth/Htpasswd/delete_passwd-i.yamlnu�[���PK�|[g
<DYY;5�ri/1.8/system/WEBrick/HTTPAuth/Htpasswd/cdesc-Htpasswd.yamlnu�[���PK�|[�A�S��0��ri/1.8/system/WEBrick/HTTPAuth/basic_auth-i.yamlnu�[���PK�|[ݤ�1cc2)�ri/1.8/system/WEBrick/HTTPAuth/cdesc-HTTPAuth.yamlnu�[���PK�|[�WR	��3��ri/1.8/system/WEBrick/HTTPAuth/Htgroup/flush-i.yamlnu�[���PK�|[�wb��9�ri/1.8/system/WEBrick/HTTPAuth/Htgroup/cdesc-Htgroup.yamlnu�[���PK�|[P�����43�ri/1.8/system/WEBrick/HTTPAuth/Htgroup/reload-i.yamlnu�[���PK�|[��%}��1Q�ri/1.8/system/WEBrick/HTTPAuth/Htgroup/add-i.yamlnu�[���PK�|[�^VH��1t�ri/1.8/system/WEBrick/HTTPAuth/Htgroup/new-c.yamlnu�[���PK�|[+���5��ri/1.8/system/WEBrick/HTTPAuth/Htgroup/members-i.yamlnu�[���PK�|[�p��1��ri/1.8/system/WEBrick/HTTPAuth/_basic_auth-i.yamlnu�[���PK�|[4�"]��<�ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/check_nonce-i.yamlnu�[���PK�|[
V('��=F �ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/check_opaque-i.yamlnu�[���PK�|[x�-��@�!�ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/generate_opaque-i.yamlnu�[���PK�|[(O���:�"�ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/challenge-i.yamlnu�[���PK�|[R���:$�ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/hexdigest-i.yamlnu�[���PK�|[�@���<Q%�ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/make_passwd-c.yamlnu�[���PK�|[5?����B�&�ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/split_param_value-i.yamlnu�[���PK�|[�^����4�'�ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/new-c.yamlnu�[���PK�|[�q��?)�ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/cdesc-DigestAuth.yamlnu�[���PK�|[yA����D#/�ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/generate_next_nonce-i.yamlnu�[���PK�|[]����=r0�ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/authenticate-i.yamlnu�[���PK�|[ �d��:�1�ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/check_uri-i.yamlnu�[���PK�|[O����>�2�ri/1.8/system/WEBrick/HTTPAuth/DigestAuth/_authenticate-i.yamlnu�[���PK�|[�?8��6-4�ri/1.8/system/WEBrick/HTTPAuth/proxy_basic_auth-i.yamlnu�[���PK�|[��& qqOo5�ri/1.8/system/WEBrick/HTTPAuth/ProxyAuthenticator/cdesc-ProxyAuthenticator.yamlnu�[���PK�|[<��RG_8�ri/1.8/system/WEBrick/HTTPAuth/ProxyBasicAuth/cdesc-ProxyBasicAuth.yamlnu�[���PK�|[�c3���8�9�ri/1.8/system/WEBrick/HTTPAuth/Authenticator/info-i.yamlnu�[���PK�|[���>;�ri/1.8/system/WEBrick/HTTPAuth/Authenticator/check_init-i.yamlnu�[���PK�|[ӥ���@\<�ri/1.8/system/WEBrick/HTTPAuth/Authenticator/check_scheme-i.yamlnu�[���PK�|[K0�a��9�=�ri/1.8/system/WEBrick/HTTPAuth/Authenticator/error-i.yamlnu�[���PK�|[H�g��7�>�ri/1.8/system/WEBrick/HTTPAuth/Authenticator/log-i.yamlnu�[���PK�|[޷l*PPE@�ri/1.8/system/WEBrick/HTTPAuth/Authenticator/cdesc-Authenticator.yamlnu�[���PK�|[���1NNI�D�ri/1.8/system/WEBrick/HTTPAuth/ProxyDigestAuth/cdesc-ProxyDigestAuth.yamlnu�[���PK�|[�y!��?�F�ri/1.8/system/WEBrick/HTTPAuth/ProxyDigestAuth/check_uri-i.yamlnu�[���PK�|[�=B���9�G�ri/1.8/system/WEBrick/HTTPAuth/BasicAuth/challenge-i.yamlnu�[���PK�|[P;'��;I�ri/1.8/system/WEBrick/HTTPAuth/BasicAuth/make_passwd-c.yamlnu�[���PK�|[8mU��3EJ�ri/1.8/system/WEBrick/HTTPAuth/BasicAuth/new-c.yamlnu�[���PK�|[�5���<K�ri/1.8/system/WEBrick/HTTPAuth/BasicAuth/authenticate-i.yamlnu�[���PK�|[�TW��=�L�ri/1.8/system/WEBrick/HTTPAuth/BasicAuth/cdesc-BasicAuth.yamlnu�[���PK�|[Jﮥ�7P�ri/1.8/system/WEBrick/HTTPAuth/UserDB/cdesc-UserDB.yamlnu�[���PK�|[��L��7R�ri/1.8/system/WEBrick/HTTPAuth/UserDB/get_passwd-i.yamlnu�[���PK�|[2���8VS�ri/1.8/system/WEBrick/HTTPAuth/UserDB/make_passwd-i.yamlnu�[���PK�|[�@���7�T�ri/1.8/system/WEBrick/HTTPAuth/UserDB/set_passwd-i.yamlnu�[���PK�|[CѴ���8�U�ri/1.8/system/WEBrick/ServerError/cdesc-ServerError.yamlnu�[���PK�|[ɂ���8W�ri/1.8/system/WEBrick/HTTPRequest/cdesc-HTTPRequest.yamlnu�[���PK�|[�:���/g�ri/1.8/system/WEBrick/HTTPRequest/%5b%5d-i.yamlnu�[���PK�|[z�L-.h�ri/1.8/system/WEBrick/HTTPRequest/each-i.yamlnu�[���PK�|[��A}��-�i�ri/1.8/system/WEBrick/HTTPRequest/body-i.yamlnu�[���PK�|[*�ۼ�.�j�ri/1.8/system/WEBrick/HTTPRequest/parse-i.yamlnu�[���PK�|[�k}���4�k�ri/1.8/system/WEBrick/HTTPRequest/read_header-i.yamlnu�[���PK�|[#�Z��5�l�ri/1.8/system/WEBrick/HTTPRequest/content_type-i.yamlnu�[���PK�|[�x���2n�ri/1.8/system/WEBrick/HTTPRequest/parse_uri-i.yamlnu�[���PK�|[��w&��,Ho�ri/1.8/system/WEBrick/HTTPRequest/new-c.yamlnu�[���PK�|[1~�^��5Xp�ri/1.8/system/WEBrick/HTTPRequest/read_chunked-i.yamlnu�[���PK�|[
ĕw��:�q�ri/1.8/system/WEBrick/HTTPRequest/read_request_line-i.yamlnu�[���PK�|[
�7���7�r�ri/1.8/system/WEBrick/HTTPRequest/content_length-i.yamlnu�[���PK�|["Vط��2�s�ri/1.8/system/WEBrick/HTTPRequest/read_body-i.yamlnu�[���PK�|[��Z8��4u�ri/1.8/system/WEBrick/HTTPRequest/parse_query-i.yamlnu�[���PK�|[D�����->v�ri/1.8/system/WEBrick/HTTPRequest/to_s-i.yamlnu�[���PK�|[�͕��3Kw�ri/1.8/system/WEBrick/HTTPRequest/_read_data-i.yamlnu�[���PK�|[��G��6zx�ri/1.8/system/WEBrick/HTTPRequest/keep_alive%3f-i.yamlnu�[���PK�|[y7vѲ�.�y�ri/1.8/system/WEBrick/HTTPRequest/fixup-i.yamlnu�[���PK�|[�q��2�z�ri/1.8/system/WEBrick/HTTPRequest/read_data-i.yamlnu�[���PK�|[=JO��.�{�ri/1.8/system/WEBrick/HTTPRequest/query-i.yamlnu�[���PK�|[	4n��8�|�ri/1.8/system/WEBrick/HTTPRequest/read_chunk_size-i.yamlnu�[���PK�|[�ͣV��2~�ri/1.8/system/WEBrick/HTTPRequest/meta_vars-i.yamlnu�[���PK�|[a�D���24�ri/1.8/system/WEBrick/HTTPRequest/read_line-i.yamlnu�[���PK�|["�z��.S��ri/1.8/system/WEBrick/Daemon/cdesc-Daemon.yamlnu�[���PK�|[�Ih��)���ri/1.8/system/WEBrick/Daemon/start-c.yamlnu�[���PK�|[²Ϡ"".͂�ri/1.8/system/WEBrick/Config/cdesc-Config.yamlnu�[���PK�|[L�0r��:M��ri/1.8/system/WEBrick/HTTPProxyServer/proxy_service-i.yamlnu�[���PK�|[5����6���ri/1.8/system/WEBrick/HTTPProxyServer/proxy_uri-i.yamlnu�[���PK�|[�����7���ri/1.8/system/WEBrick/HTTPProxyServer/do_OPTIONS-i.yamlnu�[���PK�|[dP���4��ri/1.8/system/WEBrick/HTTPProxyServer/service-i.yamlnu�[���PK�|[���u��@��ri/1.8/system/WEBrick/HTTPProxyServer/cdesc-HTTPProxyServer.yamlnu�[���PK�|[N�/��8��ri/1.8/system/WEBrick/HTTPProxyServer/split_field-i.yamlnu�[���PK�|[/;�a��0:��ri/1.8/system/WEBrick/HTTPProxyServer/new-c.yamlnu�[���PK�|[����887R��ri/1.8/system/WEBrick/HTTPProxyServer/set_cookie-i.yamlnu�[���PK�|[\z����7��ri/1.8/system/WEBrick/HTTPProxyServer/proxy_auth-i.yamlnu�[���PK�|[@NP��: ��ri/1.8/system/WEBrick/HTTPProxyServer/choose_header-i.yamlnu�[���PK�|[�uc
��:X��ri/1.8/system/WEBrick/HTTPProxyServer/proxy_connect-i.yamlnu�[���PK�|[����4���ri/1.8/system/WEBrick/HTTPProxyServer/set_via-i.yamlnu�[���PK�|[`��D���ri/1.8/system/WEBrick/HTTPServlet/FileHandler/shift_path_info-i.yamlnu�[���PK�|[�p����A��ri/1.8/system/WEBrick/HTTPServlet/FileHandler/exec_handler-i.yamlnu�[���PK�|[��Q���F[��ri/1.8/system/WEBrick/HTTPServlet/FileHandler/search_index_file-i.yamlnu�[���PK�|['�Q��C���ri/1.8/system/WEBrick/HTTPServlet/FileHandler/check_filename-i.yamlnu�[���PK�|[��%��<��ri/1.8/system/WEBrick/HTTPServlet/FileHandler/do_POST-i.yamlnu�[���PK�|[+>���@;��ri/1.8/system/WEBrick/HTTPServlet/FileHandler/add_handler-c.yamlnu�[���PK�|[��4?��;���ri/1.8/system/WEBrick/HTTPServlet/FileHandler/do_GET-i.yamlnu�[���PK�|[����A���ri/1.8/system/WEBrick/HTTPServlet/FileHandler/set_dir_list-i.yamlnu�[���PK�|[����?��ri/1.8/system/WEBrick/HTTPServlet/FileHandler/do_OPTIONS-i.yamlnu�[���PK�|[c����<@��ri/1.8/system/WEBrick/HTTPServlet/FileHandler/service-i.yamlnu�[���PK�|[&y����Cw��ri/1.8/system/WEBrick/HTTPServlet/FileHandler/remove_handler-c.yamlnu�[���PK�|[�wY���8���ri/1.8/system/WEBrick/HTTPServlet/FileHandler/new-c.yamlnu�[���PK�|[�/����J��ri/1.8/system/WEBrick/HTTPServlet/FileHandler/nondisclosure_name%3f-i.yamlnu�[���PK�|[	_�%��Bs��ri/1.8/system/WEBrick/HTTPServlet/FileHandler/call_callback-i.yamlnu�[���PK�|[�s�/

H̷�ri/1.8/system/WEBrick/HTTPServlet/FileHandler/trailing_pathsep%3f-i.yamlnu�[���PK�|[E�`���@N��ri/1.8/system/WEBrick/HTTPServlet/FileHandler/search_file-i.yamlnu�[���PK�|[���=��A���ri/1.8/system/WEBrick/HTTPServlet/FileHandler/set_filename-i.yamlnu�[���PK�|[�s����P��ri/1.8/system/WEBrick/HTTPServlet/FileHandler/prevent_directory_traversal-i.yamlnu�[���PK�|[�{���NW��ri/1.8/system/WEBrick/HTTPServlet/FileHandler/windows_ambiguous_name%3f-i.yamlnu�[���PK�|[�K_A��D���ri/1.8/system/WEBrick/HTTPServlet/FileHandler/cdesc-FileHandler.yamlnu�[���PK�|[�����@���ri/1.8/system/WEBrick/HTTPServlet/FileHandler/get_handler-i.yamlnu�[���PK�|[��>Z��<���ri/1.8/system/WEBrick/HTTPServlet/ERBHandler/evaluate-i.yamlnu�[���PK�|[_wP�;V��ri/1.8/system/WEBrick/HTTPServlet/ERBHandler/do_POST-i.yamlnu�[���PK�|[t����:���ri/1.8/system/WEBrick/HTTPServlet/ERBHandler/do_GET-i.yamlnu�[���PK�|[�k���7 ��ri/1.8/system/WEBrick/HTTPServlet/ERBHandler/new-c.yamlnu�[���PK�|[0�$���BM��ri/1.8/system/WEBrick/HTTPServlet/ERBHandler/cdesc-ERBHandler.yamlnu�[���PK�|[/͉E��8]��ri/1.8/system/WEBrick/HTTPServlet/cdesc-HTTPServlet.yamlnu�[���PK�|[cqS;���ri/1.8/system/WEBrick/HTTPServlet/CGIHandler/do_POST-i.yamlnu�[���PK�|[A�6O��B���ri/1.8/system/WEBrick/HTTPServlet/CGIHandler/cdesc-CGIHandler.yamlnu�[���PK�|[�#���:��ri/1.8/system/WEBrick/HTTPServlet/CGIHandler/do_GET-i.yamlnu�[���PK�|[��F��7b��ri/1.8/system/WEBrick/HTTPServlet/CGIHandler/new-c.yamlnu�[���PK�|[2<����B���ri/1.8/system/WEBrick/HTTPServlet/DefaultFileHandler/do_GET-i.yamlnu�[���PK�|[�u�P���ri/1.8/system/WEBrick/HTTPServlet/DefaultFileHandler/make_partial_content-i.yamlnu�[���PK�|[Q�G���IQ��ri/1.8/system/WEBrick/HTTPServlet/DefaultFileHandler/prepare_range-i.yamlnu�[���PK�|[��ۨ��R���ri/1.8/system/WEBrick/HTTPServlet/DefaultFileHandler/cdesc-DefaultFileHandler.yamlnu�[���PK�|[0�z���?)��ri/1.8/system/WEBrick/HTTPServlet/DefaultFileHandler/new-c.yamlnu�[���PK�|[�v����Kl��ri/1.8/system/WEBrick/HTTPServlet/DefaultFileHandler/not_modified%3f-i.yamlnu�[���PK�|[s��C<���ri/1.8/system/WEBrick/HTTPServlet/ProcHandler/do_POST-i.yamlnu�[���PK�|[R����;J��ri/1.8/system/WEBrick/HTTPServlet/ProcHandler/do_GET-i.yamlnu�[���PK�|[��I(��8���ri/1.8/system/WEBrick/HTTPServlet/ProcHandler/new-c.yamlnu�[���PK�|[������A���ri/1.8/system/WEBrick/HTTPServlet/ProcHandler/get_instance-i.yamlnu�[���PK�|[�YT���D'��ri/1.8/system/WEBrick/HTTPServlet/ProcHandler/cdesc-ProcHandler.yamlnu�[���PK�|[1�O��N?��ri/1.8/system/WEBrick/HTTPServlet/HTTPServletError/cdesc-HTTPServletError.yamlnu�[���PK�|[s‘Z��E���ri/1.8/system/WEBrick/HTTPServlet/AbstractServlet/get_instance-c.yamlnu�[���PK�|[�KV���?���ri/1.8/system/WEBrick/HTTPServlet/AbstractServlet/do_GET-i.yamlnu�[���PK�|[�T*��C9��ri/1.8/system/WEBrick/HTTPServlet/AbstractServlet/do_OPTIONS-i.yamlnu�[���PK�|[��Q���@���ri/1.8/system/WEBrick/HTTPServlet/AbstractServlet/service-i.yamlnu�[���PK�|[�-���R���ri/1.8/system/WEBrick/HTTPServlet/AbstractServlet/redirect_to_directory_uri-i.yamlnu�[���PK�|[i�v�NNL6��ri/1.8/system/WEBrick/HTTPServlet/AbstractServlet/cdesc-AbstractServlet.yamlnu�[���PK�|[\>%��<��ri/1.8/system/WEBrick/HTTPServlet/AbstractServlet/new-c.yamlnu�[���PK�|[�W���@;��ri/1.8/system/WEBrick/HTTPServlet/AbstractServlet/do_HEAD-i.yamlnu�[���PK�|[�a���7z��ri/1.8/system/WEBrick/HTTPStatus/client_error%3f-i.yamlnu�[���PK�|[,����C���ri/1.8/system/WEBrick/HTTPStatus/ClientError/cdesc-ClientError.yamlnu�[���PK�|[���4��=��ri/1.8/system/WEBrick/HTTPStatus/EOFError/cdesc-EOFError.yamlnu�[���PK�|[�����56��ri/1.8/system/WEBrick/HTTPStatus/Info/cdesc-Info.yamlnu�[���PK�|[N����7e��ri/1.8/system/WEBrick/HTTPStatus/Error/cdesc-Error.yamlnu�[���PK�|[��$���/���ri/1.8/system/WEBrick/HTTPStatus/info%3f-i.yamlnu�[���PK�|[*wۏ��;���ri/1.8/system/WEBrick/HTTPStatus/Success/cdesc-Success.yamlnu�[���PK�|[��Ž�3��ri/1.8/system/WEBrick/HTTPStatus/redirect%3f-i.yamlnu�[���PK�|[R����C��ri/1.8/system/WEBrick/HTTPStatus/ServerError/cdesc-ServerError.yamlnu�[���PK�|[�IԚ��3Q��ri/1.8/system/WEBrick/HTTPStatus/Status/to_i-i.yamlnu�[���PK�|[��9��ri/1.8/system/WEBrick/HTTPStatus/Status/cdesc-Status.yamlnu�[���PK�|[��Y��3!�ri/1.8/system/WEBrick/HTTPStatus/Status/code-i.yamlnu�[���PK�|[�d�պ�2c�ri/1.8/system/WEBrick/HTTPStatus/Status/new-c.yamlnu�[���PK�|[�Dj��<�ri/1.8/system/WEBrick/HTTPStatus/Status/reason_phrase-i.yamlnu�[���PK�|[�J��=��ri/1.8/system/WEBrick/HTTPStatus/Redirect/cdesc-Redirect.yamlnu�[���PK�|[�ݻ�2��ri/1.8/system/WEBrick/HTTPStatus/success%3f-i.yamlnu�[���PK�|[���x��5	�ri/1.8/system/WEBrick/HTTPStatus/reason_phrase-i.yamlnu�[���PK�|[/A���7:
�ri/1.8/system/WEBrick/HTTPStatus/server_error%3f-i.yamlnu�[���PK�|[I�{��0f�ri/1.8/system/WEBrick/HTTPStatus/error%3f-i.yamlnu�[���PK�|[.����.}�ri/1.8/system/WEBrick/HTTPStatus/%5b%5d-c.yamlnu�[���PK�|[���k��6�
�ri/1.8/system/WEBrick/HTTPStatus/cdesc-HTTPStatus.yamlnu�[���PK�|[J��m��"��ri/1.8/system/TCPSocket/new-c.yamlnu�[���PK�|[�[�b��,��ri/1.8/system/TCPSocket/cdesc-TCPSocket.yamlnu�[���PK�|[4n�EE,�ri/1.8/system/TCPSocket/gethostbyname-c.yamlnu�[���PK�|[��\�zz2�.�ri/1.8/system/NameError/message/cdesc-message.yamlnu�[���PK�|[~���"�1�ri/1.8/system/NameError/new-c.yamlnu�[���PK�|[����--#m3�ri/1.8/system/NameError/to_s-i.yamlnu�[���PK�|[ݲ�^,�4�ri/1.8/system/NameError/cdesc-NameError.yamlnu�[���PK�|[�f��**#K8�ri/1.8/system/NameError/name-i.yamlnu�[���PK�|[�oenn0�9�ri/1.8/system/Acceptables/cdesc-Acceptables.yamlnu�[���PK�|[�׊T��,�;�ri/1.8/system/Finalizer/cdesc-Finalizer.yamlnu�[���PK�|[4Y//0�H�ri/1.8/system/Finalizer/delete_dependency-c.yamlnu�[���PK�|[=��'QJ�ri/1.8/system/Finalizer/final_of-c.yamlnu�[���PK�|[5I,�4�K�ri/1.8/system/Finalizer/delete_all_dependency-c.yamlnu�[���PK�|[�w�60M�ri/1.8/system/Finalizer/delete_all_by_dependant-c.yamlnu�[���PK�|[�3cOO4�N�ri/1.8/system/Finalizer/finalize_by_dependant-c.yamlnu�[���PK�|[�q	8AA6eP�ri/1.8/system/Finalizer/finalize_all_dependency-c.yamlnu�[���PK�|[s��)--2R�ri/1.8/system/Finalizer/delete_by_dependant-c.yamlnu�[���PK�|[����+�S�ri/1.8/system/Finalizer/finalize_all-c.yamlnu�[���PK�|[Ol??8U�ri/1.8/system/Finalizer/finalize_all_by_dependant-c.yamlnu�[���PK�|[.�aQQ2�V�ri/1.8/system/Finalizer/finalize_dependency-c.yamlnu�[���PK�|[e���#^X�ri/1.8/system/Finalizer/safe-c.yamlnu�[���PK�|[�W�T---�Y�ri/1.8/system/Finalizer/add_dependency-c.yamlnu�[���PK�|[��[���41[�ri/1.8/system/SecurityError/cdesc-SecurityError.yamlnu�[���PK�|[���>> ^�ri/1.8/system/Logger/info-i.yamlnu�[���PK�|[ʺ@#�b�ri/1.8/system/Logger/unknown-i.yamlnu�[���PK�|[������.yd�ri/1.8/system/Logger/Application/log%3d-i.yamlnu�[���PK�|[�ܴ60�e�ri/1.8/system/Logger/Application/level%3d-i.yamlnu�[���PK�|[�ޚ--+g�ri/1.8/system/Logger/Application/log-i.yamlnu�[���PK�|[וu���7�h�ri/1.8/system/Logger/Application/cdesc-Application.yamlnu�[���PK�|[��D��+�o�ri/1.8/system/Logger/Application/new-c.yamlnu�[���PK�|[c�hh/�r�ri/1.8/system/Logger/Application/set_log-i.yamlnu�[���PK�|[X�-�t�ri/1.8/system/Logger/Application/start-i.yamlnu�[���PK�|[����+v�ri/1.8/system/Logger/Application/run-i.yamlnu�[���PK�|[����;w�ri/1.8/system/Logger/ShiftingError/cdesc-ShiftingError.yamlnu�[���PK�|[�\c��+Jx�ri/1.8/system/Logger/Error/cdesc-Error.yamlnu�[���PK�|[�y�00#jy�ri/1.8/system/Logger/info%3f-i.yamlnu�[���PK�|[��CC!�z�ri/1.8/system/Logger/error-i.yamlnu�[���PK�|[�ײ�	�	�|�ri/1.8/system/Logger/add-i.yamlnu�[���PK�|[���Y(Y(&���ri/1.8/system/Logger/cdesc-Logger.yamlnu�[���PK�|[�Ւ�33$g��ri/1.8/system/Logger/fatal%3f-i.yamlnu�[���PK�|[Cݴ���+��ri/1.8/system/Logger/datetime_format-i.yamlnu�[���PK�|[a�9BB!��ri/1.8/system/Logger/fatal-i.yamlnu�[���PK�|[�K�����ri/1.8/system/Logger/log-i.yamlnu�[���PK�|[Wb qq��ri/1.8/system/Logger/new-c.yamlnu�[���PK�|[��o��4���ri/1.8/system/Logger/LogDevice/create_logfile-i.yamlnu�[���PK�|[z�6/��2պ�ri/1.8/system/Logger/LogDevice/open_logfile-i.yamlnu�[���PK�|[��ٔG���ri/1.8/system/Logger/LogDevice/LogDeviceMutex/cdesc-LogDeviceMutex.yamlnu�[���PK�|[91���3���ri/1.8/system/Logger/LogDevice/cdesc-LogDevice.yamlnu�[���PK�|[�n���)���ri/1.8/system/Logger/LogDevice/eod-i.yamlnu�[���PK�|[-)k���)���ri/1.8/system/Logger/LogDevice/new-c.yamlnu�[���PK�|[�:���5���ri/1.8/system/Logger/LogDevice/check_shift_log-i.yamlnu�[���PK�|[�]���3��ri/1.8/system/Logger/LogDevice/shift_log_age-i.yamlnu�[���PK�|[ȅ���+(��ri/1.8/system/Logger/LogDevice/write-i.yamlnu�[���PK�|[tF�q��69��ri/1.8/system/Logger/LogDevice/shift_log_period-i.yamlnu�[���PK�|[����4h��ri/1.8/system/Logger/LogDevice/add_log_header-i.yamlnu�[���PK�|[\W�ͯ�+���ri/1.8/system/Logger/LogDevice/close-i.yamlnu�[���PK�|[�q(���9���ri/1.8/system/Logger/LogDevice/previous_period_end-i.yamlnu�[���PK�|[��'��*���ri/1.8/system/Logger/Formatter/call-i.yamlnu�[���PK�|[ځ�8��-���ri/1.8/system/Logger/Formatter/msg2str-i.yamlnu�[���PK�|[�����)��ri/1.8/system/Logger/Formatter/new-c.yamlnu�[���PK�|[Hk�333��ri/1.8/system/Logger/Formatter/cdesc-Formatter.yamlnu�[���PK�|[�����5���ri/1.8/system/Logger/Formatter/format_datetime-i.yamlnu�[���PK�|[%��22"���ri/1.8/system/Logger/%3c%3c-i.yamlnu�[���PK�|[����+W��ri/1.8/system/Logger/format_severity-i.yamlnu�[���PK�|[�{���*s��ri/1.8/system/Logger/format_message-i.yamlnu�[���PK�|[:,,.���ri/1.8/system/Logger/datetime_format%3d-i.yamlnu�[���PK�|[������!/��ri/1.8/system/Logger/close-i.yamlnu�[���PK�|[�➕33$b��ri/1.8/system/Logger/debug%3f-i.yamlnu�[���PK�|[n�
33$���ri/1.8/system/Logger/error%3f-i.yamlnu�[���PK�|[h�00#p��ri/1.8/system/Logger/warn%3f-i.yamlnu�[���PK�|[I�5��1���ri/1.8/system/Logger/Severity/cdesc-Severity.yamlnu�[���PK�|[���BB!���ri/1.8/system/Logger/debug-i.yamlnu�[���PK�|[k�%�?? q��ri/1.8/system/Logger/warn-i.yamlnu�[���PK�|[�EE!��ri/1.8/system/Rational/%25-i.yamlnu�[���PK�|[�yvv$���ri/1.8/system/Rational/new%21-c.yamlnu�[���PK�|[D			$`��ri/1.8/system/Rational/%2a%2a-i.yamlnu�[���PK�|[h��'���ri/1.8/system/Rational/%3c%3d%3e-i.yamlnu�[���PK�|[2�u���$���ri/1.8/system/Rational/coerce-i.yamlnu�[���PK�|[e��=��"���ri/1.8/system/Rational/to_i-i.yamlnu�[���PK�|[��|���!.��ri/1.8/system/Rational/%2f-i.yamlnu�[���PK�|[�TA���$O��ri/1.8/system/Rational/divmod-i.yamlnu�[���PK�|[����"d��ri/1.8/system/Rational/hash-i.yamlnu�[���PK�|[ �r���!���ri/1.8/system/Rational/abs-i.yamlnu�[���PK�|[�
�//!���ri/1.8/system/Rational/%2a-i.yamlnu�[���PK�|[�Kkk%U��ri/1.8/system/Rational/inspect-i.yamlnu�[���PK�|[���ä�"��ri/1.8/system/Rational/ceil-i.yamlnu�[���PK�|[�����!��ri/1.8/system/Rational/new-c.yamlnu�[���PK�|[��v��$K��ri/1.8/system/Rational/power2-i.yamlnu�[���PK�|[S�i���*L��ri/1.8/system/Rational/cdesc-Rational.yamlnu�[���PK�|[��$���!r�ri/1.8/system/Rational/%2b-i.yamlnu�[���PK�|[�f���&�
�ri/1.8/system/Rational/truncate-i.yamlnu�[���PK�|[e5H���"��ri/1.8/system/Rational/to_s-i.yamlnu�[���PK�|[�k��$�
�ri/1.8/system/Rational/%3d%3d-i.yamlnu�[���PK�|[�����"D�ri/1.8/system/Rational/to_r-i.yamlnu�[���PK�|[�h.��!u�ri/1.8/system/Rational/div-i.yamlnu�[���PK�|[�^W��#m�ri/1.8/system/Rational/round-i.yamlnu�[���PK�|[�)=���#f�ri/1.8/system/Rational/floor-i.yamlnu�[���PK�|[GwK���"��ri/1.8/system/Rational/to_f-i.yamlnu�[���PK�|[;p_033$��ri/1.8/system/Rational/reduce-c.yamlnu�[���PK�|[0H�H��!P�ri/1.8/system/Rational/%2d-i.yamlnu�[���PK�|[�s""��ri/1.8/system/Pathname/stat-i.yamlnu�[���PK�|[�G�)��ri/1.8/system/Pathname/split_names-i.yamlnu�[���PK�|[���44;�ri/1.8/system/Pathname/add_trailing_separator-i.yamlnu�[���PK�|[?��T��,��ri/1.8/system/Pathname/prepend_prefix-i.yamlnu�[���PK�|[$
����"� �ri/1.8/system/Pathname/size-i.yamlnu�[���PK�|[�����$"�ri/1.8/system/Pathname/eql%3f-i.yamlnu�[���PK�|[�^�#C#�ri/1.8/system/Pathname/ctime-i.yamlnu�[���PK�|[}��l&�$�ri/1.8/system/Pathname/basename-i.yamlnu�[���PK�|[%IX+&�ri/1.8/system/Pathname/chop_basename-i.yamlnu�[���PK�|[�}�\��'�'�ri/1.8/system/Pathname/socket%3f-i.yamlnu�[���PK�|[��K4��)�(�ri/1.8/system/Pathname/readable%3f-i.yamlnu�[���PK�|[�D����%"*�ri/1.8/system/Pathname/descend-i.yamlnu�[���PK�|[��7��&.�ri/1.8/system/Pathname/exist%3f-i.yamlnu�[���PK�|[��8�(()\/�ri/1.8/system/Pathname/foreachline-i.yamlnu�[���PK�|[�/H���(�0�ri/1.8/system/Pathname/chardev%3f-i.yamlnu�[���PK�|[�w�8==$%2�ri/1.8/system/Pathname/mkpath-i.yamlnu�[���PK�|[|�nm��#�3�ri/1.8/system/Pathname/chmod-i.yamlnu�[���PK�|[�eH��'5�ri/1.8/system/Pathname/%3c%3d%3e-i.yamlnu�[���PK�|[�n�@$$+[6�ri/1.8/system/Pathname/mountpoint%3f-i.yamlnu�[���PK�|[{��#�7�ri/1.8/system/Pathname/rmdir-i.yamlnu�[���PK�|[,��))%09�ri/1.8/system/Pathname/entries-i.yamlnu�[���PK�|['F4}��"�:�ri/1.8/system/Pathname/find-i.yamlnu�[���PK�|[��;"�=�ri/1.8/system/Pathname/glob-c.yamlnu�[���PK�|[���'�>�ri/1.8/system/Pathname/cleanpath-i.yamlnu�[���PK�|[f�:�.."�A�ri/1.8/system/Pathname/read-i.yamlnu�[���PK�|[^�{
��%`C�ri/1.8/system/Pathname/TO_PATH-i.yamlnu�[���PK�|[��X~��#�D�ri/1.8/system/Pathname/lstat-i.yamlnu�[���PK�|[�//SS$�E�ri/1.8/system/Pathname/unlink-i.yamlnu�[���PK�|[�_{��'rG�ri/1.8/system/Pathname/each_line-i.yamlnu�[���PK�|[���_/TI�ri/1.8/system/Pathname/world_readable%3f-i.yamlnu�[���PK�|[�M���)�J�ri/1.8/system/Pathname/writable%3f-i.yamlnu�[���PK�|[R�y���(L�ri/1.8/system/Pathname/each_entry-i.yamlnu�[���PK�|[�KN
0�M�ri/1.8/system/Pathname/executable_real%3f-i.yamlnu�[���PK�|[�y;f&&%_O�ri/1.8/system/Pathname/foreach-i.yamlnu�[���PK�|[������$�P�ri/1.8/system/Pathname/lchmod-i.yamlnu�[���PK�|[$��4��4R�ri/1.8/system/Pathname/cleanpath_conservative-i.yamlnu�[���PK�|[�����$ES�ri/1.8/system/Pathname/delete-i.yamlnu�[���PK�|[�i���)yT�ri/1.8/system/Pathname/expand_path-i.yamlnu�[���PK�|[����)�U�ri/1.8/system/Pathname/dir_foreach-i.yamlnu�[���PK�|[2r���$;W�ri/1.8/system/Pathname/rename-i.yamlnu�[���PK�|[�]�"�X�ri/1.8/system/Pathname/open-i.yamlnu�[���PK�|[C2~'�Y�ri/1.8/system/Pathname/make_link-i.yamlnu�[���PK�|[�'Ñ#P[�ri/1.8/system/Pathname/mkdir-i.yamlnu�[���PK�|[��%�\�ri/1.8/system/Pathname/dirname-i.yamlnu�[���PK�|[l'��II)^�ri/1.8/system/Pathname/absolute%3f-i.yamlnu�[���PK�|[�nYgg!�_�ri/1.8/system/Pathname/new-c.yamlnu�[���PK�|[8���)sa�ri/1.8/system/Pathname/grpowned%3f-i.yamlnu�[���PK�|[z�֠II"�b�ri/1.8/system/Pathname/link-i.yamlnu�[���PK�|[/j��&Zd�ri/1.8/system/Pathname/readlink-i.yamlnu�[���PK�|[�Ǎ�#�e�ri/1.8/system/Pathname/split-i.yamlnu�[���PK�|[Ci����4g�ri/1.8/system/Pathname/del_trailing_separator-i.yamlnu�[���PK�|[��\#Mh�ri/1.8/system/Pathname/mtime-i.yamlnu�[���PK�|[c"�1��&�i�ri/1.8/system/Pathname/children-i.yamlnu�[���PK�|[�����+�n�ri/1.8/system/Pathname/each_filename-i.yamlnu�[���PK�|[W��~��'�p�ri/1.8/system/Pathname/%3d%3d%3d-i.yamlnu�[���PK�|[#�)$r�ri/1.8/system/Pathname/rmtree-i.yamlnu�[���PK�|[�
3�#gs�ri/1.8/system/Pathname/getwd-c.yamlnu�[���PK�|[��=J��$�t�ri/1.8/system/Pathname/lchown-i.yamlnu�[���PK�|[�6V���%v�ri/1.8/system/Pathname/zero%3f-i.yamlnu�[���PK�|[)����'Sw�ri/1.8/system/Pathname/sticky%3f-i.yamlnu�[���PK�|[���zz!�x�ri/1.8/system/Pathname/%2b-i.yamlnu�[���PK�|[m!�\&b{�ri/1.8/system/Pathname/truncate-i.yamlnu�[���PK�|[���c.�|�ri/1.8/system/Pathname/readable_real%3f-i.yamlnu�[���PK�|[��+�#6~�ri/1.8/system/Pathname/utime-i.yamlnu�[���PK�|[�E�ll"��ri/1.8/system/Pathname/join-i.yamlnu�[���PK�|[,�xj*`��ri/1.8/system/Pathname/make_symlink-i.yamlnu�[���PK�|[+H����#ɂ�ri/1.8/system/Pathname/taint-i.yamlnu�[���PK�|[-P�/ƒ�ri/1.8/system/Pathname/world_writable%3f-i.yamlnu�[���PK�|[,�a��*&��ri/1.8/system/Pathname/realpath_rec-i.yamlnu�[���PK�|[š䂨�$J��ri/1.8/system/Pathname/freeze-i.yamlnu�[���PK�|[��&�"F��ri/1.8/system/Pathname/to_s-i.yamlnu�[���PK�|[����*���ri/1.8/system/Pathname/directory%3f-i.yamlnu�[���PK�|[�~	)��(���ri/1.8/system/Pathname/symlink%3f-i.yamlnu�[���PK�|[N����$@��ri/1.8/system/Pathname/%3d%3d-i.yamlnu�[���PK�|[�"�77%b��ri/1.8/system/Pathname/fnmatch-i.yamlnu�[���PK�|[V�g�>>*��ri/1.8/system/Pathname/cdesc-Pathname.yamlnu�[���PK�|[�XVc��'T��ri/1.8/system/Pathname/setgid%3f-i.yamlnu�[���PK�|[��ff2���ri/1.8/system/Pathname/cleanpath_aggressive-i.yamlnu�[���PK�|[�ŭ���'`��ri/1.8/system/Pathname/setuid%3f-i.yamlnu�[���PK�|[G*�&7���ri/1.8/system/Pathname/has_trailing_separator%3f-i.yamlnu�[���PK�|[1f'��$'��ri/1.8/system/Pathname/chroot-i.yamlnu�[���PK�|[~����#u��ri/1.8/system/Pathname/atime-i.yamlnu�[���PK�|[|�S%''!���ri/1.8/system/Pathname/sub-i.yamlnu�[���PK�|[�C��$=��ri/1.8/system/Pathname/ascend-i.yamlnu�[���PK�|[���^��#7��ri/1.8/system/Pathname/chdir-i.yamlnu�[���PK�|[#*����)���ri/1.8/system/Pathname/blockdev%3f-i.yamlnu�[���PK�|[|e�%���ri/1.8/system/Pathname/extname-i.yamlnu�[���PK�|[X��(/��ri/1.8/system/Pathname/fnmatch%3f-i.yamlnu�[���PK�|[za_��%���ri/1.8/system/Pathname/pipe%3f-i.yamlnu�[���PK�|[�$T��"���ri/1.8/system/Pathname/plus-i.yamlnu�[���PK�|[��\44#���ri/1.8/system/Pathname/ftype-i.yamlnu�[���PK�|[Δ��.\��ri/1.8/system/Pathname/writable_real%3f-i.yamlnu�[���PK�|[╌$'���ri/1.8/system/Pathname/readlines-i.yamlnu�[���PK�|[�-��%*��ri/1.8/system/Pathname/opendir-i.yamlnu�[���PK�|[i����%s��ri/1.8/system/Pathname/untaint-i.yamlnu�[���PK�|[�~1���%r��ri/1.8/system/Pathname/root%3f-i.yamlnu�[���PK�|[4���0���ri/1.8/system/Pathname/relative_path_from-i.yamlnu�[���PK�|[�E!���&���ri/1.8/system/Pathname/realpath-i.yamlnu�[���PK�|[9=RR%��ri/1.8/system/Pathname/symlink-i.yamlnu�[���PK�|[�>_��%���ri/1.8/system/Pathname/sysopen-i.yamlnu�[���PK�|[�U���%���ri/1.8/system/Pathname/file%3f-i.yamlnu�[���PK�|[�{Y=��+7��ri/1.8/system/Pathname/executable%3f-i.yamlnu�[���PK�|[U��#���ri/1.8/system/Pathname/chown-i.yamlnu�[���PK�|[<�����)��ri/1.8/system/Pathname/relative%3f-i.yamlnu�[���PK�|['o�<��&5��ri/1.8/system/Pathname/owned%3f-i.yamlnu�[���PK�|[IH8��%u��ri/1.8/system/Pathname/size%3f-i.yamlnu�[���PK�|[O,Y9>>$���ri/1.8/system/Pathname/parent-i.yamlnu�[���PK�|[V|�H��$C��ri/1.8/system/Mutex/cdesc-Mutex.yamlnu�[���PK�|[ֵn�11#��ri/1.8/system/Mutex/try_lock-i.yamlnu�[���PK�|[j]٤OO+�ri/1.8/system/Mutex/exclusive_unlock-i.yamlnu�[���PK�|[�)�KK&��ri/1.8/system/Mutex/synchronize-i.yamlnu�[���PK�|[���7!^�ri/1.8/system/Mutex/unlock-i.yamlnu�[���PK�|[�EW�$��ri/1.8/system/Mutex/locked%3f-i.yamlnu�[���PK�|[�k���	�ri/1.8/system/Mutex/new-c.yamlnu�[���PK�|[��8�?
�ri/1.8/system/Mutex/lock-i.yamlnu�[���PK�|[�$Md��(��ri/1.8/system/RiError/cdesc-RiError.yamlnu�[���PK�|[}K�0��@��ri/1.8/system/StrictPrettyExample/cdesc-StrictPrettyExample.yamlnu�[���PK�|[H1���/�
�ri/1.8/system/Struct/yaml_tag_class_name-c.yamlnu�[���PK�|[[��� �ri/1.8/system/Struct/size-i.yamlnu�[���PK�|[�|G���"^�ri/1.8/system/Struct/eql%3f-i.yamlnu�[���PK�|[;��VRR"l�ri/1.8/system/Struct/%5b%5d-i.yamlnu�[���PK�|[f9���� �ri/1.8/system/Struct/each-i.yamlnu�[���PK�|[V�ixuu"�ri/1.8/system/Struct/select-i.yamlnu�[���PK�|[�� ��ri/1.8/system/Struct/to_a-i.yamlnu�[���PK�|[B�f��/;�ri/1.8/system/Struct/yaml_tag_read_class-c.yamlnu�[���PK�|[_ ��#` �ri/1.8/system/Struct/to_yaml-i.yamlnu�[���PK�|[�T� f!�ri/1.8/system/Struct/hash-i.yamlnu�[���PK�|[4���yy%�"�ri/1.8/system/Struct/values_at-i.yamlnu�[���PK�|[�I떻�$�%�ri/1.8/system/Struct/yaml_new-c.yamlnu�[���PK�|[Q��;88#�&�ri/1.8/system/Struct/inspect-i.yamlnu�[���PK�|[+��`��3(�ri/1.8/system/Struct/new-c.yamlnu�[���PK�|[Gy�R��(()�ri/1.8/system/Struct/pretty_print-i.yamlnu�[���PK�|[L��<<#3*�ri/1.8/system/Struct/members-i.yamlnu�[���PK�|[�^���"�,�ri/1.8/system/Struct/length-i.yamlnu�[���PK�|[Y��ff&/�ri/1.8/system/Struct/cdesc-Struct.yamlnu�[���PK�|[%&�p22 �7�ri/1.8/system/Struct/to_s-i.yamlnu�[���PK�|[w�a��"M9�ri/1.8/system/Struct/%3d%3d-i.yamlnu�[���PK�|[0^R2  "%=�ri/1.8/system/Struct/values-i.yamlnu�[���PK�|[�{O��.�?�ri/1.8/system/Struct/pretty_print_cycle-i.yamlnu�[���PK�|[ȫ�hh%�@�ri/1.8/system/Struct/%5b%5d%3d-i.yamlnu�[���PK�|[�\�y,,%qD�ri/1.8/system/Struct/each_pair-i.yamlnu�[���PK�|[��jy��5�G�ri/1.8/system/RI/AnsiFormatter/display_heading-i.yamlnu�[���PK�|[�$a��7-I�ri/1.8/system/RI/AnsiFormatter/cdesc-AnsiFormatter.yamlnu�[���PK�|[7���:XM�ri/1.8/system/RI/AnsiFormatter/write_attribute_text-i.yamlnu�[���PK�|[Րх��)�N�ri/1.8/system/RI/AnsiFormatter/new-c.yamlnu�[���PK�|[a����7�O�ri/1.8/system/RI/AnsiFormatter/update_attributes-i.yamlnu�[���PK�|[�⫼�0�P�ri/1.8/system/RI/AnsiFormatter/bold_print-i.yamlnu�[���PK�|[�#|��4�Q�ri/1.8/system/RI/TextFormatter/raw_print_line-i.yamlnu�[���PK�|[(ztt6S�ri/1.8/system/RI/TextFormatter/break_to_newline-i.yamlnu�[���PK�|[�����6�T�ri/1.8/system/RI/TextFormatter/strip_attributes-i.yamlnu�[���PK�|[n��̭�*&V�ri/1.8/system/RI/TextFormatter/list-c.yamlnu�[���PK�|[��
��5-W�ri/1.8/system/RI/TextFormatter/display_heading-i.yamlnu�[���PK�|[�����@kX�ri/1.8/system/RI/TextFormatter/display_verbatim_flow_item-i.yamlnu�[���PK�|[�Q�/�Y�ri/1.8/system/RI/TextFormatter/conv_html-i.yamlnu�[���PK�|[��]���7,[�ri/1.8/system/RI/TextFormatter/cdesc-TextFormatter.yamlnu�[���PK�|[��	���7�a�ri/1.8/system/RI/TextFormatter/display_flow_item-i.yamlnu�[���PK�|[��$ӯ�)�b�ri/1.8/system/RI/TextFormatter/for-c.yamlnu�[���PK�|[�c.d��)�c�ri/1.8/system/RI/TextFormatter/new-c.yamlnu�[���PK�|[pg���/�d�ri/1.8/system/RI/TextFormatter/draw_line-i.yamlnu�[���PK�|[$Ȅ���/f�ri/1.8/system/RI/TextFormatter/blankline-i.yamlnu�[���PK�|[i4ر��*g�ri/1.8/system/RI/TextFormatter/wrap-i.yamlnu�[���PK�|[�s� ��2Lh�ri/1.8/system/RI/TextFormatter/display_flow-i.yamlnu�[���PK�|[�$�V��0oi�ri/1.8/system/RI/TextFormatter/bold_print-i.yamlnu�[���PK�|[{f���2�j�ri/1.8/system/RI/TextFormatter/display_list-i.yamlnu�[���PK�|[DT��1�k�ri/1.8/system/RI/TextFormatter/conv_markup-i.yamlnu�[���PK�|[lX~���m�ri/1.8/system/RI/cdesc-RI.yamlnu�[���PK�|[~�m:��$�n�ri/1.8/system/RI/Constant/new-c.yamlnu�[���PK�|[��1oo-
p�ri/1.8/system/RI/Constant/cdesc-Constant.yamlnu�[���PK�|[�����9�q�ri/1.8/system/RI/IncludedModule/cdesc-IncludedModule.yamlnu�[���PK�|[3����6s�ri/1.8/system/RI/HtmlFormatter/break_to_newline-i.yamlnu�[���PK�|[���0��5>t�ri/1.8/system/RI/HtmlFormatter/display_heading-i.yamlnu�[���PK�|[�7�*��@yu�ri/1.8/system/RI/HtmlFormatter/display_verbatim_flow_item-i.yamlnu�[���PK�|[�|B���:�v�ri/1.8/system/RI/HtmlFormatter/write_attribute_text-i.yamlnu�[���PK�|[�TTM��)x�ri/1.8/system/RI/HtmlFormatter/new-c.yamlnu�[���PK�|[R#L[��/"y�ri/1.8/system/RI/HtmlFormatter/draw_line-i.yamlnu�[���PK�|[+h�ʷ�/Az�ri/1.8/system/RI/HtmlFormatter/blankline-i.yamlnu�[���PK�|[�$���,W{�ri/1.8/system/RI/HtmlFormatter/escape-i.yamlnu�[���PK�|[g8q��7h|�ri/1.8/system/RI/HtmlFormatter/update_attributes-i.yamlnu�[���PK�|[��r��0�}�ri/1.8/system/RI/HtmlFormatter/bold_print-i.yamlnu�[���PK�|[>���2�~�ri/1.8/system/RI/HtmlFormatter/display_list-i.yamlnu�[���PK�|[J��9��)��ri/1.8/system/RI/HtmlFormatter/tag-i.yamlnu�[���PK�|[���117���ri/1.8/system/RI/HtmlFormatter/cdesc-HtmlFormatter.yamlnu�[���PK�|[�=����#���ri/1.8/system/RI/RiCache/new-c.yamlnu�[���PK�|[�&oO��+���ri/1.8/system/RI/RiCache/cdesc-RiCache.yamlnu�[���PK�|[��Z|;���ri/1.8/system/RI/SimpleFormatter/cdesc-SimpleFormatter.yamlnu�[���PK�|[kz$007���ri/1.8/system/RI/SimpleFormatter/display_heading-i.yamlnu�[���PK�|[�1g1���ri/1.8/system/RI/SimpleFormatter/draw_line-i.yamlnu�[���PK�|[�;����1���ri/1.8/system/RI/SimpleFormatter/blankline-i.yamlnu�[���PK�|[,����(H��ri/1.8/system/RI/Options/raw_path-i.yamlnu�[���PK�|[t)]��$O��ri/1.8/system/RI/Options/path-i.yamlnu�[���PK�|[{Mx���,���ri/1.8/system/RI/Options/show_version-i.yamlnu�[���PK�|[��tb��%��ri/1.8/system/RI/Options/parse-i.yamlnu�[���PK�|[�,���00��ri/1.8/system/RI/Options/OptionList/usage-c.yamlnu�[���PK�|[��I���0���ri/1.8/system/RI/Options/OptionList/error-c.yamlnu�[���PK�|[M-����2��ri/1.8/system/RI/Options/OptionList/options-c.yamlnu�[���PK�|[e�Ѭoo9���ri/1.8/system/RI/Options/OptionList/cdesc-OptionList.yamlnu�[���PK�|[L2ٰ��7Ӡ�ri/1.8/system/RI/Options/OptionList/strip_output-c.yamlnu�[���PK�|[p����)��ri/1.8/system/RI/Options/displayer-i.yamlnu�[���PK�|[\��D��#��ri/1.8/system/RI/Options/new-c.yamlnu�[���PK�|[����+��ri/1.8/system/RI/Options/cdesc-Options.yamlnu�[���PK�|[v�C��)��ri/1.8/system/RI/MethodSummary/new-c.yamlnu�[���PK�|[K(���7���ri/1.8/system/RI/MethodSummary/cdesc-MethodSummary.yamlnu�[���PK�|[�Pd��?X��ri/1.8/system/RI/MethodDescription/cdesc-MethodDescription.yamlnu�[���PK�|[2ʩ���,���ri/1.8/system/RI/ClassEntry/full_name-i.yamlnu�[���PK�|[��t��6ӱ�ri/1.8/system/RI/ClassEntry/classes_and_modules-i.yamlnu�[���PK�|[�ǐ��9��ri/1.8/system/RI/ClassEntry/local_methods_matching-i.yamlnu�[���PK�|[�r	�8;��ri/1.8/system/RI/ClassEntry/contained_class_named-i.yamlnu�[���PK�|[�8'\3¶�ri/1.8/system/RI/ClassEntry/all_method_names-i.yamlnu�[���PK�|[��s��31��ri/1.8/system/RI/ClassEntry/methods_matching-i.yamlnu�[���PK�|[����&��ri/1.8/system/RI/ClassEntry/new-c.yamlnu�[���PK�|[�A?�$$+3��ri/1.8/system/RI/ClassEntry/add_path-i.yamlnu�[���PK�|[�BeeD���ri/1.8/system/RI/ClassEntry/recursively_find_methods_matching-i.yamlnu�[���PK�|[�<�.��,���ri/1.8/system/RI/ClassEntry/load_from-i.yamlnu�[���PK�|[��PP=���ri/1.8/system/RI/ClassEntry/contained_modules_matching-i.yamlnu�[���PK�|[-.���1Y��ri/1.8/system/RI/ClassEntry/cdesc-ClassEntry.yamlnu�[���PK�|[�aG��=���ri/1.8/system/RI/ClassDescription/cdesc-ClassDescription.yamlnu�[���PK�|[y�k��5���ri/1.8/system/RI/ClassDescription/display_name-i.yamlnu�[���PK�|[S�q���:���ri/1.8/system/RI/ClassDescription/superclass_string-i.yamlnu�[���PK�|[�=B��-���ri/1.8/system/RI/RiReader/find_methods-i.yamlnu�[���PK�|[�����4��ri/1.8/system/RI/RiReader/top_level_namespace-i.yamlnu�[���PK�|[�#�
��0>��ri/1.8/system/RI/RiReader/find_classes_in-i.yamlnu�[���PK�|[�A���4���ri/1.8/system/RI/RiReader/lookup_namespace_in-i.yamlnu�[���PK�|[�|N�##-���ri/1.8/system/RI/RiReader/cdesc-RiReader.yamlnu�[���PK�|[٣@	1M��ri/1.8/system/RI/RiReader/full_class_names-i.yamlnu�[���PK�|[�9�î�$���ri/1.8/system/RI/RiReader/new-c.yamlnu�[���PK�|[צ�:		*���ri/1.8/system/RI/RiReader/all_names-i.yamlnu�[���PK�|[�v33+#��ri/1.8/system/RI/RiReader/get_method-i.yamlnu�[���PK�|[
];���*���ri/1.8/system/RI/RiReader/get_class-i.yamlnu�[���PK�|[,�����.��ri/1.8/system/RI/RiReader/find_names_in-i.yamlnu�[���PK�|[��fZ��3*��ri/1.8/system/RI/RiReader/find_class_by_name-i.yamlnu�[���PK�|[z`��nn/Z��ri/1.8/system/RI/Attribute/cdesc-Attribute.yamlnu�[���PK�|[%�5��%'��ri/1.8/system/RI/Attribute/new-c.yamlnu�[���PK�|[�2�/4��ri/1.8/system/RI/AliasName/cdesc-AliasName.yamlnu�[���PK�|[���00A���ri/1.8/system/RI/AttributeFormatter/cdesc-AttributeFormatter.yamlnu�[���PK�|[����CH��ri/1.8/system/RI/AttributeFormatter/AttributeString/empty%3f-i.yamlnu�[���PK�|[BI
��N���ri/1.8/system/RI/AttributeFormatter/AttributeString/cdesc-AttributeString.yamlnu�[���PK�|[$5�AD���ri/1.8/system/RI/AttributeFormatter/AttributeString/next_word-i.yamlnu�[���PK�|[t]�Z��>k��ri/1.8/system/RI/AttributeFormatter/AttributeString/new-c.yamlnu�[���PK�|[��g��A���ri/1.8/system/RI/AttributeFormatter/AttributeString/%3c%3c-i.yamlnu�[���PK�|[�d�V''?���ri/1.8/system/RI/AttributeFormatter/write_attribute_text-i.yamlnu�[���PK�|[/���/f��ri/1.8/system/RI/AttributeFormatter/wrap-i.yamlnu�[���PK�|[��;��<Q��ri/1.8/system/RI/AttributeFormatter/add_attributes_to-i.yamlnu�[���PK�|[2�hN��5���ri/1.8/system/RI/AttributeFormatter/bold_print-i.yamlnu�[���PK�|[��6���7���ri/1.8/system/RI/AttributeFormatter/AttrChar/new-c.yamlnu�[���PK�|[r�t��@��ri/1.8/system/RI/AttributeFormatter/AttrChar/cdesc-AttrChar.yamlnu�[���PK�|[@�c@��)6��ri/1.8/system/RI/NamedThing/eql%3f-i.yamlnu�[���PK�|[�5c��,>��ri/1.8/system/RI/NamedThing/%3c%3d%3e-i.yamlnu�[���PK�|[U�֣��'G��ri/1.8/system/RI/NamedThing/hash-i.yamlnu�[���PK�|[jkA���&H��ri/1.8/system/RI/NamedThing/new-c.yamlnu�[���PK�|[6���1J��ri/1.8/system/RI/NamedThing/cdesc-NamedThing.yamlnu�[���PK�|[��L��*`��ri/1.8/system/RI/RiWriter/add_class-i.yamlnu�[���PK�|[�D�V

5v��ri/1.8/system/RI/RiWriter/external_to_internal-c.yamlnu�[���PK�|[��5��,��ri/1.8/system/RI/RiWriter/path_to_dir-i.yamlnu�[���PK�|[s��ff5�ri/1.8/system/RI/RiWriter/internal_to_external-c.yamlnu�[���PK�|[��bT��0��ri/1.8/system/RI/RiWriter/class_desc_path-c.yamlnu�[���PK�|[�i��$��ri/1.8/system/RI/RiWriter/new-c.yamlnu�[���PK�|[Q��ww-��ri/1.8/system/RI/RiWriter/cdesc-RiWriter.yamlnu�[���PK�|[U����-��ri/1.8/system/RI/RiWriter/remove_class-i.yamlnu�[���PK�|[�Q9���+��ri/1.8/system/RI/RiWriter/add_method-i.yamlnu�[���PK�|[�ՠt'	�ri/1.8/system/RI/Paths/cdesc-Paths.yamlnu�[���PK�|[Q�~®�-��ri/1.8/system/RI/Description/%3c%3d%3e-i.yamlnu�[���PK�|[ѵK+��-��ri/1.8/system/RI/Description/serialize-i.yamlnu�[���PK�|[UՂ3��ri/1.8/system/RI/Description/cdesc-Description.yamlnu�[���PK�|[�� ��/$�ri/1.8/system/RI/Description/deserialize-c.yamlnu�[���PK�|[�����/@�ri/1.8/system/RI/ModuleDescription/merge-i.yamlnu�[���PK�|[g�`m��6]�ri/1.8/system/RI/ModuleDescription/display_name-i.yamlnu�[���PK�|[|�b2��ri/1.8/system/RI/ModuleDescription/merge_in-i.yamlnu�[���PK�|[�(?��ri/1.8/system/RI/ModuleDescription/cdesc-ModuleDescription.yamlnu�[���PK�|[c��a@@;s�ri/1.8/system/RI/ModuleDescription/superclass_string-i.yamlnu�[���PK�|[ ��Q""C�ri/1.8/system/RI/OverstrikeFormatter/cdesc-OverstrikeFormatter.yamlnu�[���PK�|[���(��@��ri/1.8/system/RI/OverstrikeFormatter/write_attribute_text-i.yamlnu�[���PK�|[-j���6!�ri/1.8/system/RI/OverstrikeFormatter/bold_print-i.yamlnu�[���PK�|[�9��-e"�ri/1.8/system/RI/MethodEntry/full_name-i.yamlnu�[���PK�|[.K���3w#�ri/1.8/system/RI/MethodEntry/cdesc-MethodEntry.yamlnu�[���PK�|[5ذ��'}%�ri/1.8/system/RI/MethodEntry/new-c.yamlnu�[���PK�|[�Mpi��/�&�ri/1.8/system/RI/TopLevelEntry/full_name-i.yamlnu�[���PK�|[=��%��6�'�ri/1.8/system/RI/TopLevelEntry/methods_matching-i.yamlnu�[���PK�|[��7�(�ri/1.8/system/RI/TopLevelEntry/cdesc-TopLevelEntry.yamlnu�[���PK�|[x2$���2l+�ri/1.8/system/RI/TopLevelEntry/module_named-i.yamlnu�[���PK�|[/B���@�,�ri/1.8/system/NotImplementedError/cdesc-NotImplementedError.yamlnu�[���PK�|[�VUrr0�/�ri/1.8/system/SocketError/cdesc-SocketError.yamlnu�[���PK�|[�����(_6�ri/1.8/system/IOError/cdesc-IOError.yamlnu�[���PK�|[�J5o||0�F�ri/1.8/system/ScriptError/cdesc-ScriptError.yamlnu�[���PK�|[cV�I$jI�ri/1.8/system/Thread/priority-i.yamlnu�[���PK�|[_0=%��"�K�ri/1.8/system/Thread/%5b%5d-i.yamlnu�[���PK�|[G�'���'P�ri/1.8/system/Thread/priority%3d-i.yamlnu�[���PK�|[�C�7�� "S�ri/1.8/system/Thread/pass-c.yamlnu�[���PK�|[\�����%oV�ri/1.8/system/Thread/terminate-i.yamlnu�[���PK�|[[�}�'�X�ri/1.8/system/Thread/critical%3d-c.yamlnu�[���PK�|[��1�vv#�[�ri/1.8/system/Thread/current-c.yamlnu�[���PK�|[�ǫ�QQ"�]�ri/1.8/system/Thread/wakeup-i.yamlnu�[���PK�|[._e@@(V`�ri/1.8/system/Thread/terminate%21-i.yamlnu�[���PK�|[s9p// �b�ri/1.8/system/Thread/kill-c.yamlnu�[���PK�|[Ek�Ȥ� me�ri/1.8/system/Thread/stop-c.yamlnu�[���PK�|[�si���!ah�ri/1.8/system/Thread/raise-i.yamlnu�[���PK�|[ΤJ�� nk�ri/1.8/system/Thread/list-c.yamlnu�[���PK�|[�:kfkk �n�ri/1.8/system/Thread/main-c.yamlnu�[���PK�|[�6���� \p�ri/1.8/system/Thread/kill-i.yamlnu�[���PK�|[Tr{33$jr�ri/1.8/system/Thread/critical-c.yamlnu�[���PK�|[�"((&�s�ri/1.8/system/Thread/safe_level-i.yamlnu�[���PK�|[�����.ov�ri/1.8/system/Thread/abort_on_exception-i.yamlnu�[���PK�|[!��$��.�x�ri/1.8/system/Thread/abort_on_exception-c.yamlnu�[���PK�|[nFVn�� }{�ri/1.8/system/Thread/exit-c.yamlnu�[���PK�|[\�s!!#�}�ri/1.8/system/Thread/inspect-i.yamlnu�[���PK�|[U�f!66#
�ri/1.8/system/Thread/kill%21-i.yamlnu�[���PK�|[k�

&���ri/1.8/system/Thread/cdesc-Thread.yamlnu�[���PK�|[�g�ƾ� ��ri/1.8/system/Thread/exit-i.yamlnu�[���PK�|[]#7�33��ri/1.8/system/Thread/new-c.yamlnu�[���PK�|[��;66#���ri/1.8/system/Thread/exit%21-i.yamlnu�[���PK�|[����??%��ri/1.8/system/Thread/exclusive-c.yamlnu�[���PK�|[���??"���ri/1.8/system/Thread/status-i.yamlnu�[���PK�|[���Mll1A��ri/1.8/system/Thread/abort_on_exception%3d-c.yamlnu�[���PK�|[O�s���1��ri/1.8/system/Thread/abort_on_exception%3d-i.yamlnu�[���PK�|[M�us 6��ri/1.8/system/Thread/keys-i.yamlnu�[���PK�|[��X�XX ���ri/1.8/system/Thread/join-i.yamlnu�[���PK�|[�j����#M��ri/1.8/system/Thread/stop%3f-i.yamlnu�[���PK�|[]&q��$[��ri/1.8/system/Thread/alive%3f-i.yamlnu�[���PK�|[�[�`}}���ri/1.8/system/Thread/run-i.yamlnu�[���PK�|[
����� z��ri/1.8/system/Thread/fork-c.yamlnu�[���PK�|[��y��!���ri/1.8/system/Thread/value-i.yamlnu�[���PK�|[BR���!���ri/1.8/system/Thread/start-c.yamlnu�[���PK�|[6���mm%��ri/1.8/system/Thread/%5b%5d%3d-i.yamlnu�[���PK�|[+�A���!���ri/1.8/system/Thread/group-i.yamlnu�[���PK�|[2Nq��"���ri/1.8/system/Thread/key%3f-i.yamlnu�[���PK�|[*�K���-���ri/1.8/system/SOAP/SOAPEnvelope/encode-i.yamlnu�[���PK�|[v�US��-7��ri/1.8/system/SOAP/SOAPEnvelope/to_ary-i.yamlnu�[���PK�|[�
J��*F��ri/1.8/system/SOAP/SOAPEnvelope/new-c.yamlnu�[���PK�|[��H��7d��ri/1.8/system/SOAP/SOAPEnvelope/cdesc-SOAPEnvelope.yamlnu�[���PK�|[�S?e��0���ri/1.8/system/SOAP/SOAPEnvelope/header%3d-i.yamlnu�[���PK�|[-����.���ri/1.8/system/SOAP/SOAPEnvelope/body%3d-i.yamlnu�[���PK�|[�����)���ri/1.8/system/SOAP/SOAPHeader/size-i.yamlnu�[���PK�|[k�	���+1��ri/1.8/system/SOAP/SOAPHeader/encode-i.yamlnu�[���PK�|[U9�4��3h��ri/1.8/system/SOAP/SOAPHeader/cdesc-SOAPHeader.yamlnu�[���PK�|[d�����(���ri/1.8/system/SOAP/SOAPHeader/add-i.yamlnu�[���PK�|[�ɞ��(���ri/1.8/system/SOAP/SOAPHeader/new-c.yamlnu�[���PK�|[%$Q��+���ri/1.8/system/SOAP/SOAPHeader/length-i.yamlnu�[���PK�|[O]@��-���ri/1.8/system/SOAP/SOAPNil/cdesc-SOAPNil.yamlnu�[���PK�|[	O��ES��ri/1.8/system/SOAP/SOAPEnvelopeElement/cdesc-SOAPEnvelopeElement.yamlnu�[���PK�|[z`�\1���ri/1.8/system/SOAP/SOAPShort/cdesc-SOAPShort.yamlnu�[���PK�|[Ϧ{��I/��ri/1.8/system/SOAP/MPostUnavailableError/cdesc-MPostUnavailableError.yamlnu�[���PK�|[�3����+���ri/1.8/system/SOAP/Header/cdesc-Header.yamlnu�[���PK�|[��HR��/���ri/1.8/system/SOAP/Header/HandlerSet/dup-i.yamlnu�[���PK�|[���ƿ�2���ri/1.8/system/SOAP/Header/HandlerSet/delete-i.yamlnu�[���PK�|[ׅ�i��4���ri/1.8/system/SOAP/Header/HandlerSet/store%3d-i.yamlnu�[���PK�|[��E-6���ri/1.8/system/SOAP/Header/HandlerSet/on_inbound-i.yamlnu�[���PK�|[g�9��/u��ri/1.8/system/SOAP/Header/HandlerSet/add-i.yamlnu�[���PK�|[���(��6���ri/1.8/system/SOAP/Header/HandlerSet/include%3f-i.yamlnu�[���PK�|[���ò�/���ri/1.8/system/SOAP/Header/HandlerSet/new-c.yamlnu�[���PK�|[����2���ri/1.8/system/SOAP/Header/HandlerSet/%3c%3c-i.yamlnu�[���PK�|[��^M		7?��ri/1.8/system/SOAP/Header/HandlerSet/on_outbound-i.yamlnu�[���PK�|[@��j��:���ri/1.8/system/SOAP/Header/HandlerSet/cdesc-HandlerSet.yamlnu�[���PK�|[h����9���ri/1.8/system/SOAP/Header/SimpleHandler/on_inbound-i.yamlnu�[���PK�|["����2���ri/1.8/system/SOAP/Header/SimpleHandler/new-c.yamlnu�[���PK�|[�z�22@���ri/1.8/system/SOAP/Header/SimpleHandler/on_simple_inbound-i.yamlnu�[���PK�|[��8��@���ri/1.8/system/SOAP/Header/SimpleHandler/cdesc-SimpleHandler.yamlnu�[���PK�|[{����:���ri/1.8/system/SOAP/Header/SimpleHandler/on_outbound-i.yamlnu�[���PK�|[�$��A,��ri/1.8/system/SOAP/Header/SimpleHandler/on_simple_outbound-i.yamlnu�[���PK�|[���=��>���ri/1.8/system/SOAP/Header/Handler/on_inbound_headeritem-i.yamlnu�[���PK�|[�u�((3��ri/1.8/system/SOAP/Header/Handler/on_inbound-i.yamlnu�[���PK�|[Z�ն�,���ri/1.8/system/SOAP/Header/Handler/new-c.yamlnu�[���PK�|[g���4���ri/1.8/system/SOAP/Header/Handler/on_outbound-i.yamlnu�[���PK�|[%��a��4��ri/1.8/system/SOAP/Header/Handler/cdesc-Handler.yamlnu�[���PK�|[RTj��?'��ri/1.8/system/SOAP/Header/Handler/on_outbound_headeritem-i.yamlnu�[���PK�|[��ϧ

7k��ri/1.8/system/SOAP/SOAPDuration/cdesc-SOAPDuration.yamlnu�[���PK�|['CN>5��ri/1.8/system/SOAP/SOAPDecimal/cdesc-SOAPDecimal.yamlnu�[���PK�|[/��AH��ri/1.8/system/SOAP/SOAPUnsignedShort/cdesc-SOAPUnsignedShort.yamlnu�[���PK�|[���~��"��ri/1.8/system/SOAP/proxy%3d-i.yamlnu�[���PK�|[>����+��ri/1.8/system/SOAP/create_connection-i.yamlnu�[���PK�|[�����/��ri/1.8/system/SOAP/SOAPDate/cdesc-SOAPDate.yamlnu�[���PK�|[P3F��/C��ri/1.8/system/SOAP/SOAPGDay/cdesc-SOAPGDay.yamlnu�[���PK�|[@��=���ri/1.8/system/SOAP/SOAPUnsignedInt/cdesc-SOAPUnsignedInt.yamlnu�[���PK�|[t+���2 �ri/1.8/system/SOAP/RPC/Driver/setup_options-i.yamlnu�[���PK�|[���u��2B�ri/1.8/system/SOAP/RPC/Driver/create_header-i.yamlnu�[���PK�|[�u�U��)k�ri/1.8/system/SOAP/RPC/Driver/call-i.yamlnu�[���PK�|[��t���1~�ri/1.8/system/SOAP/RPC/Driver/loadproperty-i.yamlnu�[���PK�|[�3p��B��ri/1.8/system/SOAP/RPC/Driver/add_document_method_interface-i.yamlnu�[���PK�|[�ә��1	�ri/1.8/system/SOAP/RPC/Driver/__attr_proxy-c.yamlnu�[���PK�|[9;�TTTBA�ri/1.8/system/SOAP/RPC/Driver/add_method_with_soapaction_as-i.yamlnu�[���PK�|[r5^���9	�ri/1.8/system/SOAP/RPC/Driver/add_method_interface-i.yamlnu�[���PK�|[Ț�6O
�ri/1.8/system/SOAP/RPC/Driver/add_rpc_method_as-i.yamlnu�[���PK�|[�R���.��ri/1.8/system/SOAP/RPC/Driver/httpproxy-i.yamlnu�[���PK�|[�r�H��3��ri/1.8/system/SOAP/RPC/Driver/add_rpc_method-i.yamlnu�[���PK�|[��B��,7�ri/1.8/system/SOAP/RPC/Driver/inspect-i.yamlnu�[���PK�|[��}Z��(F�ri/1.8/system/SOAP/RPC/Driver/new-c.yamlnu�[���PK�|[!�w���5x�ri/1.8/system/SOAP/RPC/Driver/mandatorycharset-i.yamlnu�[���PK�|[�����8��ri/1.8/system/SOAP/RPC/Driver/add_document_method-i.yamlnu�[���PK�|[�8�}��1��ri/1.8/system/SOAP/RPC/Driver/wiredump_dev-i.yamlnu�[���PK�|[RP�1��=�ri/1.8/system/SOAP/RPC/Driver/add_rpc_method_interface-i.yamlnu�[���PK�|[��m	��1k�ri/1.8/system/SOAP/RPC/Driver/httpproxy%3d-i.yamlnu�[���PK�|[�#4FBB?��ri/1.8/system/SOAP/RPC/Driver/add_method_with_soapaction-i.yamlnu�[���PK�|[t�����7?�ri/1.8/system/SOAP/RPC/Driver/wiredump_file_base-i.yamlnu�[���PK�|[���j��4o�ri/1.8/system/SOAP/RPC/Driver/wiredump_dev%3d-i.yamlnu�[���PK�|[aAt$��6��ri/1.8/system/SOAP/RPC/Driver/add_rpc_operation-i.yamlnu�[���PK�|[�ۆJJF��ri/1.8/system/SOAP/RPC/Driver/add_rpc_method_with_soapaction_as-i.yamlnu�[���PK�|[�Qa7+	+	/��ri/1.8/system/SOAP/RPC/Driver/cdesc-Driver.yamlnu�[���PK�|[�!88CA'�ri/1.8/system/SOAP/RPC/Driver/add_rpc_method_with_soapaction-i.yamlnu�[���PK�|[�NN��;�(�ri/1.8/system/SOAP/RPC/Driver/set_wiredump_file_base-i.yamlnu�[���PK�|[b<���8-*�ri/1.8/system/SOAP/RPC/Driver/mandatorycharset%3d-i.yamlnu�[���PK�|[��O�2l+�ri/1.8/system/SOAP/RPC/Driver/add_method_as-i.yamlnu�[���PK�|[��ž�+�,�ri/1.8/system/SOAP/RPC/Driver/invoke-i.yamlnu�[���PK�|[�Q�/�-�ri/1.8/system/SOAP/RPC/Driver/add_method-i.yamlnu�[���PK�|[��5H��:d/�ri/1.8/system/SOAP/RPC/Driver/wiredump_file_base%3d-i.yamlnu�[���PK�|[����;�0�ri/1.8/system/SOAP/RPC/Driver/add_document_operation-i.yamlnu�[���PK�|[Uyi�JJ%2�ri/1.8/system/SOAP/RPC/cdesc-RPC.yamlnu�[���PK�|[�ܱ��-�3�ri/1.8/system/SOAP/RPC/defined_methods-c.yamlnu�[���PK�|[�����7�4�ri/1.8/system/SOAP/RPC/SOAPMethod/cdesc-SOAPMethod.yamlnu�[���PK�|[ȮV��6;�ri/1.8/system/SOAP/RPC/SOAPMethod/output_params-i.yamlnu�[���PK�|[p�����97<�ri/1.8/system/SOAP/RPC/SOAPMethod/have_outparam%3f-i.yamlnu�[���PK�|[VV�\��=e=�ri/1.8/system/SOAP/RPC/SOAPMethod/derive_rpc_param_def-c.yamlnu�[���PK�|[����2�>�ri/1.8/system/SOAP/RPC/SOAPMethod/set_param-i.yamlnu�[���PK�|[�U~��4�?�ri/1.8/system/SOAP/RPC/SOAPMethod/param_count-c.yamlnu�[���PK�|[H�)���7
A�ri/1.8/system/SOAP/RPC/SOAPMethod/collect_params-i.yamlnu�[���PK�|[�����,<B�ri/1.8/system/SOAP/RPC/SOAPMethod/new-c.yamlnu�[���PK�|[����=]C�ri/1.8/system/SOAP/RPC/SOAPMethod/create_doc_param_def-c.yamlnu�[���PK�|[���\��3�D�ri/1.8/system/SOAP/RPC/SOAPMethod/init_param-i.yamlnu�[���PK�|[8��#��=�E�ri/1.8/system/SOAP/RPC/SOAPMethod/create_rpc_param_def-c.yamlnu�[���PK�|[�f�Y��5$G�ri/1.8/system/SOAP/RPC/SOAPMethod/set_outparam-i.yamlnu�[���PK�|[SQ^��5PH�ri/1.8/system/SOAP/RPC/SOAPMethod/input_params-i.yamlnu�[���PK�|[Q�����:vI�ri/1.8/system/SOAP/RPC/SOAPlet/require_path_info%3f-i.yamlnu�[���PK�|[�����D�J�ri/1.8/system/SOAP/RPC/SOAPlet/allow_content_encoding_gzip%3d-i.yamlnu�[���PK�|[�����-L�ri/1.8/system/SOAP/RPC/SOAPlet/do_POST-i.yamlnu�[���PK�|[ݭ�w��1M�ri/1.8/system/SOAP/RPC/SOAPlet/encode_gzip-i.yamlnu�[���PK�|[�U�=��6FN�ri/1.8/system/SOAP/RPC/SOAPlet/parse_soapaction-i.yamlnu�[���PK�|[Z�s�6}O�ri/1.8/system/SOAP/RPC/SOAPlet/app_scope_router-i.yamlnu�[���PK�|[�Oר��,�P�ri/1.8/system/SOAP/RPC/SOAPlet/do_GET-i.yamlnu�[���PK�|[���j��/�Q�ri/1.8/system/SOAP/RPC/SOAPlet/setup_req-i.yamlnu�[���PK�|[l���,$S�ri/1.8/system/SOAP/RPC/SOAPlet/logger-i.yamlnu�[���PK�|[�<~*��43T�ri/1.8/system/SOAP/RPC/SOAPlet/encode_gzip%3f-i.yamlnu�[���PK�|[0~1O��)YU�ri/1.8/system/SOAP/RPC/SOAPlet/new-c.yamlnu�[���PK�|[���5		1jV�ri/1.8/system/SOAP/RPC/SOAPlet/add_servant-i.yamlnu�[���PK�|[nԪ2�W�ri/1.8/system/SOAP/RPC/SOAPlet/get_instance-i.yamlnu�[���PK�|[qd4��/HY�ri/1.8/system/SOAP/RPC/SOAPlet/setup_res-i.yamlnu�[���PK�|[�G��1sZ�ri/1.8/system/SOAP/RPC/SOAPlet/cdesc-SOAPlet.yamlnu�[���PK�|[�WAA��B�^�ri/1.8/system/SOAP/RPC/HTTPServer/generate_explicit_type%3d-i.yamlnu�[���PK�|[�����<O`�ri/1.8/system/SOAP/RPC/HTTPServer/mapping_registry%3d-i.yamlnu�[���PK�|[��VZ>�a�ri/1.8/system/SOAP/RPC/HTTPServer/add_rpc_headerhandler-i.yamlnu�[���PK�|[�����1c�ri/1.8/system/SOAP/RPC/HTTPServer/shutdown-i.yamlnu�[���PK�|[���b��87d�ri/1.8/system/SOAP/RPC/HTTPServer/add_rpc_servant-i.yamlnu�[���PK�|[�c���0�e�ri/1.8/system/SOAP/RPC/HTTPServer/on_init-i.yamlnu�[���PK�|[������9�f�ri/1.8/system/SOAP/RPC/HTTPServer/mapping_registry-i.yamlnu�[���PK�|[Fn�::@�g�ri/1.8/system/SOAP/RPC/HTTPServer/add_rpc_request_servant-i.yamlnu�[���PK�|[���:|i�ri/1.8/system/SOAP/RPC/HTTPServer/add_rpc_method_as-i.yamlnu�[���PK�|[�<�B�j�ri/1.8/system/SOAP/RPC/HTTPServer/add_rpc_request_operation-i.yamlnu�[���PK�|[B�91��?~l�ri/1.8/system/SOAP/RPC/HTTPServer/generate_explicit_type-i.yamlnu�[���PK�|[��??7�m�ri/1.8/system/SOAP/RPC/HTTPServer/add_rpc_method-i.yamlnu�[���PK�|[K�?��,ho�ri/1.8/system/SOAP/RPC/HTTPServer/new-c.yamlnu�[���PK�|[G�vGyp�ri/1.8/system/SOAP/RPC/HTTPServer/add_document_request_operation-i.yamlnu�[���PK�|[�5���<r�ri/1.8/system/SOAP/RPC/HTTPServer/add_document_method-i.yamlnu�[���PK�|[ټi���/ks�ri/1.8/system/SOAP/RPC/HTTPServer/status-i.yamlnu�[���PK�|[��F:t�ri/1.8/system/SOAP/RPC/HTTPServer/add_rpc_operation-i.yamlnu�[���PK�|[�����,�u�ri/1.8/system/SOAP/RPC/HTTPServer/run-i.yamlnu�[���PK�|[�R���B�v�ri/1.8/system/SOAP/RPC/HTTPServer/add_request_headerhandler-i.yamlnu�[���PK�|[t):Jx�ri/1.8/system/SOAP/RPC/HTTPServer/add_headerhandler-i.yamlnu�[���PK�|[6�u  6�y�ri/1.8/system/SOAP/RPC/HTTPServer/add_method_as-i.yamlnu�[���PK�|[��zC3A{�ri/1.8/system/SOAP/RPC/HTTPServer/add_method-i.yamlnu�[���PK�|[���?�|�ri/1.8/system/SOAP/RPC/HTTPServer/add_document_operation-i.yamlnu�[���PK�|[��c��7%~�ri/1.8/system/SOAP/RPC/HTTPServer/cdesc-HTTPServer.yamlnu�[���PK�|[@#@���3<��ri/1.8/system/SOAP/RPC/RPCError/cdesc-RPCError.yamlnu�[���PK�|[N�ze��Ff��ri/1.8/system/SOAP/RPC/SOAPMethodRequest/create_method_response-i.yamlnu�[���PK�|[<z���4ˇ�ri/1.8/system/SOAP/RPC/SOAPMethodRequest/each-i.yamlnu�[���PK�|[��g��3��ri/1.8/system/SOAP/RPC/SOAPMethodRequest/dup-i.yamlnu�[���PK�|[G�|��33��ri/1.8/system/SOAP/RPC/SOAPMethodRequest/new-c.yamlnu�[���PK�|[��}���=t��ri/1.8/system/SOAP/RPC/SOAPMethodRequest/check_elename-i.yamlnu�[���PK�|[��mhXXE���ri/1.8/system/SOAP/RPC/SOAPMethodRequest/cdesc-SOAPMethodRequest.yamlnu�[���PK�|[*7����>~��ri/1.8/system/SOAP/RPC/SOAPMethodRequest/create_request-c.yamlnu�[���PK�|[=�� ��?Ɛ�ri/1.8/system/SOAP/RPC/CGIStub/generate_explicit_type%3d-i.yamlnu�[���PK�|[�R~<��9��ri/1.8/system/SOAP/RPC/CGIStub/mapping_registry%3d-i.yamlnu�[���PK�|[\��KKFU��ri/1.8/system/SOAP/RPC/CGIStub/add_rpc_method_with_namespace_as-i.yamlnu�[���PK�|[7���=��ri/1.8/system/SOAP/RPC/CGIStub/SOAPStdinRequest/%5b%5d-i.yamlnu�[���PK�|[�&���KD��ri/1.8/system/SOAP/RPC/CGIStub/SOAPStdinRequest/cdesc-SOAPStdinRequest.yamlnu�[���PK�|[l�d��:l��ri/1.8/system/SOAP/RPC/CGIStub/SOAPStdinRequest/new-c.yamlnu�[���PK�|[14����@���ri/1.8/system/SOAP/RPC/CGIStub/SOAPStdinRequest/meta_vars-i.yamlnu�[���PK�|[rdT;Ԛ�ri/1.8/system/SOAP/RPC/CGIStub/add_rpc_headerhandler-i.yamlnu�[���PK�|[�m#RR5U��ri/1.8/system/SOAP/RPC/CGIStub/add_rpc_servant-i.yamlnu�[���PK�|[ڃ�UUB��ri/1.8/system/SOAP/RPC/CGIStub/add_method_with_namespace_as-i.yamlnu�[���PK�|[G
��-ӟ�ri/1.8/system/SOAP/RPC/CGIStub/on_init-i.yamlnu�[���PK�|[�#n���6�ri/1.8/system/SOAP/RPC/CGIStub/mapping_registry-i.yamlnu�[���PK�|[�rC�7��ri/1.8/system/SOAP/RPC/CGIStub/add_rpc_method_as-i.yamlnu�[���PK�|[hF���<���ri/1.8/system/SOAP/RPC/CGIStub/generate_explicit_type-i.yamlnu�[���PK�|[j��<<4Ȥ�ri/1.8/system/SOAP/RPC/CGIStub/add_rpc_method-i.yamlnu�[���PK�|[���$��)h��ri/1.8/system/SOAP/RPC/CGIStub/new-c.yamlnu�[���PK�|[1�g�  1���ri/1.8/system/SOAP/RPC/CGIStub/add_servant-i.yamlnu�[���PK�|[H��X��1��ri/1.8/system/SOAP/RPC/CGIStub/cdesc-CGIStub.yamlnu�[���PK�|[��=&CC?���ri/1.8/system/SOAP/RPC/CGIStub/add_method_with_namespace-i.yamlnu�[���PK�|[M�mt��7���ri/1.8/system/SOAP/RPC/CGIStub/add_rpc_operation-i.yamlnu�[���PK�|[�d����<��ri/1.8/system/SOAP/RPC/CGIStub/SOAPFCGIRequest/%5b%5d-i.yamlnu�[���PK�|[tc�;��I<��ri/1.8/system/SOAP/RPC/CGIStub/SOAPFCGIRequest/cdesc-SOAPFCGIRequest.yamlnu�[���PK�|[9���9`��ri/1.8/system/SOAP/RPC/CGIStub/SOAPFCGIRequest/new-c.yamlnu�[���PK�|[GJ��?���ri/1.8/system/SOAP/RPC/CGIStub/SOAPFCGIRequest/meta_vars-i.yamlnu�[���PK�|[[�y��)Ź�ri/1.8/system/SOAP/RPC/CGIStub/run-i.yamlnu�[���PK�|[�i�l��8˺�ri/1.8/system/SOAP/RPC/CGIStub/SOAPRequest/%5b%5d-i.yamlnu�[���PK�|[�`�ssA�ri/1.8/system/SOAP/RPC/CGIStub/SOAPRequest/cdesc-SOAPRequest.yamlnu�[���PK�|[�r���;ӽ�ri/1.8/system/SOAP/RPC/CGIStub/SOAPRequest/meta_vars-i.yamlnu�[���PK�|[I�R7��ri/1.8/system/SOAP/RPC/CGIStub/add_headerhandler-i.yamlnu�[���PK�|[�>�3n��ri/1.8/system/SOAP/RPC/CGIStub/add_method_as-i.yamlnu�[���PK�|[k1�O��6�ri/1.8/system/SOAP/RPC/CGIStub/set_fcgi_request-i.yamlnu�[���PK�|["gV0!�ri/1.8/system/SOAP/RPC/CGIStub/add_method-i.yamlnu�[���PK�|[3�<��ri/1.8/system/SOAP/RPC/CGIStub/add_document_operation-i.yamlnu�[���PK�|[p΅�99C��ri/1.8/system/SOAP/RPC/CGIStub/add_rpc_method_with_namespace-i.yamlnu�[���PK�|[D�#��M��ri/1.8/system/SOAP/RPC/MethodDefinitionError/cdesc-MethodDefinitionError.yamlnu�[���PK�|[|�p��0�ri/1.8/system/SOAP/RPC/Proxy/endpoint_url-i.yamlnu�[���PK�|[rN����+"�ri/1.8/system/SOAP/RPC/Proxy/marshal-i.yamlnu�[���PK�|[�0���18�ri/1.8/system/SOAP/RPC/Proxy/create_header-i.yamlnu�[���PK�|[�^���)_�ri/1.8/system/SOAP/RPC/Proxy/route-i.yamlnu�[���PK�|[5�ȶ��9��ri/1.8/system/SOAP/RPC/Proxy/create_request_header-i.yamlnu�[���PK�|[��Sd��(��ri/1.8/system/SOAP/RPC/Proxy/call-i.yamlnu�[���PK�|[/d�.	.	-��ri/1.8/system/SOAP/RPC/Proxy/cdesc-Proxy.yamlnu�[���PK�|[#���/^�ri/1.8/system/SOAP/RPC/Proxy/check_fault-i.yamlnu�[���PK�|[ �/���3{�ri/1.8/system/SOAP/RPC/Proxy/endpoint_url%3d-i.yamlnu�[���PK�|[º���>��ri/1.8/system/SOAP/RPC/Proxy/Operation/response_doc_enc-i.yamlnu�[���PK�|[+߂���=�ri/1.8/system/SOAP/RPC/Proxy/Operation/request_doc_enc-i.yamlnu�[���PK�|[4��y��=Y�ri/1.8/system/SOAP/RPC/Proxy/Operation/request_rpc_enc-i.yamlnu�[���PK�|[E����:��ri/1.8/system/SOAP/RPC/Proxy/Operation/response_obj-i.yamlnu�[���PK�|[��Q��>�ri/1.8/system/SOAP/RPC/Proxy/Operation/response_rpc_enc-i.yamlnu�[���PK�|[�Y���=p�ri/1.8/system/SOAP/RPC/Proxy/Operation/request_rpc_lit-i.yamlnu�[���PK�|[�%��:��ri/1.8/system/SOAP/RPC/Proxy/Operation/response_doc-i.yamlnu�[���PK�|[���h��7/�ri/1.8/system/SOAP/RPC/Proxy/Operation/check_use-i.yamlnu�[���PK�|[������>[�ri/1.8/system/SOAP/RPC/Proxy/Operation/response_rpc_lit-i.yamlnu�[���PK�|[[y���:��ri/1.8/system/SOAP/RPC/Proxy/Operation/response_rpc-i.yamlnu�[���PK�|[��F���1�ri/1.8/system/SOAP/RPC/Proxy/Operation/new-c.yamlnu�[���PK�|[�4?��:K�ri/1.8/system/SOAP/RPC/Proxy/Operation/request_body-i.yamlnu�[���PK�|[�{��9��ri/1.8/system/SOAP/RPC/Proxy/Operation/request_doc-i.yamlnu�[���PK�|[s�.��K�ri/1.8/system/SOAP/RPC/Proxy/Operation/request_default_encodingstyle-i.yamlnu�[���PK�|[nUd��9}�ri/1.8/system/SOAP/RPC/Proxy/Operation/request_rpc-i.yamlnu�[���PK�|[�@4��9��ri/1.8/system/SOAP/RPC/Proxy/Operation/check_style-i.yamlnu�[���PK�|[���(��>�ri/1.8/system/SOAP/RPC/Proxy/Operation/response_doc_lit-i.yamlnu�[���PK�|[��5�;p�ri/1.8/system/SOAP/RPC/Proxy/Operation/cdesc-Operation.yamlnu�[���PK�|[�Е���9Z��ri/1.8/system/SOAP/RPC/Proxy/Operation/raise_fault-i.yamlnu�[���PK�|[��;=��@���ri/1.8/system/SOAP/RPC/Proxy/Operation/create_request_obj-i.yamlnu�[���PK�|[}ּ���L��ri/1.8/system/SOAP/RPC/Proxy/Operation/response_default_encodingstyle-i.yamlnu�[���PK�|[�'w��=m��ri/1.8/system/SOAP/RPC/Proxy/Operation/request_doc_lit-i.yamlnu�[���PK�|[�Y�s��7��ri/1.8/system/SOAP/RPC/Proxy/create_encoding_opt-i.yamlnu�[���PK�|[,a�w//2�ri/1.8/system/SOAP/RPC/Proxy/add_rpc_method-i.yamlnu�[���PK�|[�Á��+��ri/1.8/system/SOAP/RPC/Proxy/inspect-i.yamlnu�[���PK�|[K�ʹ��'��ri/1.8/system/SOAP/RPC/Proxy/new-c.yamlnu�[���PK�|[����777��ri/1.8/system/SOAP/RPC/Proxy/add_document_method-i.yamlnu�[���PK�|[��.���6_�ri/1.8/system/SOAP/RPC/Proxy/create_mapping_opt-i.yamlnu�[���PK�|[FH���:��ri/1.8/system/SOAP/RPC/Proxy/test_loopback_response-i.yamlnu�[���PK�|[
�/4UU5��ri/1.8/system/SOAP/RPC/Proxy/add_rpc_operation-i.yamlnu�[���PK�|[^sr��3�
�ri/1.8/system/SOAP/RPC/Proxy/receive_headers-i.yamlnu�[���PK�|[�uKg��:��ri/1.8/system/SOAP/RPC/Proxy/set_wiredump_file_base-i.yamlnu�[���PK�|[1]�
��-
�ri/1.8/system/SOAP/RPC/Proxy/unmarshal-i.yamlnu�[���PK�|[㈗��*'�ri/1.8/system/SOAP/RPC/Proxy/invoke-i.yamlnu�[���PK�|[|�6''.P�ri/1.8/system/SOAP/RPC/Proxy/add_method-i.yamlnu�[���PK�|[3�,,:��ri/1.8/system/SOAP/RPC/Proxy/add_document_operation-i.yamlnu�[���PK�|[�lԼ�0k�ri/1.8/system/SOAP/RPC/Proxy/reset_stream-i.yamlnu�[���PK�|[���n��9��ri/1.8/system/SOAP/RPC/Proxy/set_envelopenamespace-i.yamlnu�[���PK�|[����2��ri/1.8/system/SOAP/RPC/StandaloneServer/new-c.yamlnu�[���PK�|[�Dg�<<C�ri/1.8/system/SOAP/RPC/StandaloneServer/cdesc-StandaloneServer.yamlnu�[���PK�|[���L��<��ri/1.8/system/SOAP/RPC/StandaloneServer/create_config-i.yamlnu�[���PK�|[+��K��5�ri/1.8/system/SOAP/RPC/SOAPMethodResponse/each-i.yamlnu�[���PK�|[�
��4U�ri/1.8/system/SOAP/RPC/SOAPMethodResponse/new-c.yamlnu�[���PK�|[�[�viiG��ri/1.8/system/SOAP/RPC/SOAPMethodResponse/cdesc-SOAPMethodResponse.yamlnu�[���PK�|[�����:f�ri/1.8/system/SOAP/RPC/SOAPMethodResponse/retval%3d-i.yamlnu�[���PK�|[lT����?��ri/1.8/system/SOAP/RPC/ParameterError/cdesc-ParameterError.yamlnu�[���PK�|[ޘ����,��ri/1.8/system/SOAP/RPC/Router/marshal-i.yamlnu�[���PK�|[B[O��*!�ri/1.8/system/SOAP/RPC/Router/route-i.yamlnu�[���PK�|[zf�4'"�ri/1.8/system/SOAP/RPC/Router/add_rpc_servant-i.yamlnu�[���PK�|[ہ����5�#�ri/1.8/system/SOAP/RPC/Router/lookup_operation-i.yamlnu�[���PK�|[��Y&&<�$�ri/1.8/system/SOAP/RPC/Router/add_rpc_request_servant-i.yamlnu�[���PK�|[o i��7X&�ri/1.8/system/SOAP/RPC/Router/Operation/receiver-i.yamlnu�[���PK�|[W\	��?�'�ri/1.8/system/SOAP/RPC/Router/Operation/response_doc_enc-i.yamlnu�[���PK�|[�3��>�(�ri/1.8/system/SOAP/RPC/Router/Operation/request_doc_enc-i.yamlnu�[���PK�|[����35*�ri/1.8/system/SOAP/RPC/Router/Operation/call-i.yamlnu�[���PK�|[JHb���>�+�ri/1.8/system/SOAP/RPC/Router/Operation/request_rpc_enc-i.yamlnu�[���PK�|[8n0���?�,�ri/1.8/system/SOAP/RPC/Router/Operation/response_rpc_enc-i.yamlnu�[���PK�|[�-���>=.�ri/1.8/system/SOAP/RPC/Router/Operation/request_rpc_lit-i.yamlnu�[���PK�|[���?�/�ri/1.8/system/SOAP/RPC/Router/Operation/request_document-i.yamlnu�[���PK�|[�%fR;
1�ri/1.8/system/SOAP/RPC/Router/Operation/response_doc-i.yamlnu�[���PK�|[�W���8x2�ri/1.8/system/SOAP/RPC/Router/Operation/check_use-i.yamlnu�[���PK�|[�����?�3�ri/1.8/system/SOAP/RPC/Router/Operation/response_rpc_lit-i.yamlnu�[���PK�|[�Ƌ^;5�ri/1.8/system/SOAP/RPC/Router/Operation/response_rpc-i.yamlnu�[���PK�|[��_��2n6�ri/1.8/system/SOAP/RPC/Router/Operation/new-c.yamlnu�[���PK�|[��i{��L�7�ri/1.8/system/SOAP/RPC/Router/Operation/request_default_encodingstyle-i.yamlnu�[���PK�|[&�R��:9�ri/1.8/system/SOAP/RPC/Router/Operation/request_rpc-i.yamlnu�[���PK�|[흦��:r:�ri/1.8/system/SOAP/RPC/Router/Operation/check_style-i.yamlnu�[���PK�|[�ت,��?�;�ri/1.8/system/SOAP/RPC/Router/Operation/response_doc_lit-i.yamlnu�[���PK�|[@i�ө�<=�ri/1.8/system/SOAP/RPC/Router/Operation/cdesc-Operation.yamlnu�[���PK�|[�s���MD�ri/1.8/system/SOAP/RPC/Router/Operation/response_default_encodingstyle-i.yamlnu�[���PK�|[�A|���>�E�ri/1.8/system/SOAP/RPC/Router/Operation/request_doc_lit-i.yamlnu�[���PK�|[K����,�F�ri/1.8/system/SOAP/RPC/Router/mimeize-i.yamlnu�[���PK�|[*^R*>�G�ri/1.8/system/SOAP/RPC/Router/add_rpc_request_operation-i.yamlnu�[���PK�|[A��::3sI�ri/1.8/system/SOAP/RPC/Router/add_rpc_method-i.yamlnu�[���PK�|[��*��CK�ri/1.8/system/SOAP/RPC/Router/RequestScopeOperation/receiver-i.yamlnu�[���PK�|[/'����>PL�ri/1.8/system/SOAP/RPC/Router/RequestScopeOperation/new-c.yamlnu�[���PK�|[���HHT�M�ri/1.8/system/SOAP/RPC/Router/RequestScopeOperation/cdesc-RequestScopeOperation.yamlnu�[���PK�|[w0��5~O�ri/1.8/system/SOAP/RPC/Router/assign_operation-i.yamlnu�[���PK�|[!V%���;�P�ri/1.8/system/SOAP/RPC/Router/first_input_part_qname-i.yamlnu�[���PK�|[z�	7��(R�ri/1.8/system/SOAP/RPC/Router/new-c.yamlnu�[���PK�|[I-�CS�ri/1.8/system/SOAP/RPC/Router/add_document_request_operation-i.yamlnu�[���PK�|[��t�BB8�T�ri/1.8/system/SOAP/RPC/Router/add_document_method-i.yamlnu�[���PK�|[�ձ�

08V�ri/1.8/system/SOAP/RPC/Router/add_servant-i.yamlnu�[���PK�|[؏94��1�W�ri/1.8/system/SOAP/RPC/Router/call_headers-i.yamlnu�[���PK�|[����7�X�ri/1.8/system/SOAP/RPC/Router/create_mapping_opt-i.yamlnu�[���PK�|[��أ�6�Y�ri/1.8/system/SOAP/RPC/Router/add_rpc_operation-i.yamlnu�[���PK�|[��A���;\�ri/1.8/system/SOAP/RPC/Router/create_styleuse_option-i.yamlnu�[���PK�|[ӓc���;O]�ri/1.8/system/SOAP/RPC/Router/ensure_styleuse_option-i.yamlnu�[���PK�|[Qn����4�^�ri/1.8/system/SOAP/RPC/Router/receive_headers-i.yamlnu�[���PK�|[��ڻ��*�_�ri/1.8/system/SOAP/RPC/Router/fault-i.yamlnu�[���PK�|[�b����Ga�ri/1.8/system/SOAP/RPC/Router/ApplicationScopeOperation/receiver-i.yamlnu�[���PK�|[<N�MPP\gb�ri/1.8/system/SOAP/RPC/Router/ApplicationScopeOperation/cdesc-ApplicationScopeOperation.yamlnu�[���PK�|[��BCd�ri/1.8/system/SOAP/RPC/Router/ApplicationScopeOperation/new-c.yamlnu�[���PK�|[�j����.�e�ri/1.8/system/SOAP/RPC/Router/unmarshal-i.yamlnu�[���PK�|[�ZiA>�f�ri/1.8/system/SOAP/RPC/Router/add_request_headerhandler-i.yamlnu�[���PK�|[��e���6Mh�ri/1.8/system/SOAP/RPC/Router/add_headerhandler-i.yamlnu�[���PK�|[�${ޗ�/�i�ri/1.8/system/SOAP/RPC/Router/cdesc-Router.yamlnu�[���PK�|[l�22/wr�ri/1.8/system/SOAP/RPC/Router/add_method-i.yamlnu�[���PK�|[Y���:t�ri/1.8/system/SOAP/RPC/Router/create_fault_response-i.yamlnu�[���PK�|[5�J77;�u�ri/1.8/system/SOAP/RPC/Router/add_document_operation-i.yamlnu�[���PK�|[��?��*&w�ri/1.8/system/SOAP/RPC/SOAPVoid/new-c.yamlnu�[���PK�|[��Y[[3-x�ri/1.8/system/SOAP/RPC/SOAPVoid/cdesc-SOAPVoid.yamlnu�[���PK�|[VC^

7�z�ri/1.8/system/SOAP/SOAPDateTime/cdesc-SOAPDateTime.yamlnu�[���PK�|[�1�

9\|�ri/1.8/system/SOAP/SOAPHexBinary/cdesc-SOAPHexBinary.yamlnu�[���PK�|[�Z�R��*�}�ri/1.8/system/SOAP/SOAPBasetype/new-c.yamlnu�[���PK�|[��&o��7�~�ri/1.8/system/SOAP/SOAPBasetype/cdesc-SOAPBasetype.yamlnu�[���PK�|[�55���#ˀ�ri/1.8/system/SOAP/reset_all-i.yamlnu�[���PK�|[����1ȁ�ri/1.8/system/SOAP/WSDLDriver/__attr_proxy-c.yamlnu�[���PK�|[�_f��3���ri/1.8/system/SOAP/WSDLDriver/cdesc-WSDLDriver.yamlnu�[���PK�|[G����<�ri/1.8/system/SOAP/WSDLDriver/Servant__/headerhandler-i.yamlnu�[���PK�|[i1\���;'��ri/1.8/system/SOAP/WSDLDriver/Servant__/endpoint_url-i.yamlnu�[���PK�|[�;����<Y��ri/1.8/system/SOAP/WSDLDriver/Servant__/setup_options-i.yamlnu�[���PK�|[@�p��B���ri/1.8/system/SOAP/WSDLDriver/Servant__/create_request_body-i.yamlnu�[���PK�|[�!6��@�ri/1.8/system/SOAP/WSDLDriver/Servant__/bodyitem_from_obj-i.yamlnu�[���PK�|[���3��<2��ri/1.8/system/SOAP/WSDLDriver/Servant__/streamhandler-i.yamlnu�[���PK�|[s�	���Dg��ri/1.8/system/SOAP/WSDLDriver/Servant__/create_request_header-i.yamlnu�[���PK�|[�fY��L���ri/1.8/system/SOAP/WSDLDriver/Servant__/add_document_method_interface-i.yamlnu�[���PK�|[`ZP���=,��ri/1.8/system/SOAP/WSDLDriver/Servant__/create_options-i.yamlnu�[���PK�|[mm����>o��ri/1.8/system/SOAP/WSDLDriver/Servant__/endpoint_url%3d-i.yamlnu�[���PK�|[$ې��7���ri/1.8/system/SOAP/WSDLDriver/Servant__/rpc_call-i.yamlnu�[���PK�|[m���{{<�ri/1.8/system/SOAP/WSDLDriver/Servant__/document_send-i.yamlnu�[���PK�|[Jn*��@̖�ri/1.8/system/SOAP/WSDLDriver/Servant__/create_method_obj-i.yamlnu�[���PK�|[zՃ��C��ri/1.8/system/SOAP/WSDLDriver/Servant__/add_method_interface-i.yamlnu�[���PK�|[T�		<m��ri/1.8/system/SOAP/WSDLDriver/Servant__/cdesc-Servant__.yamlnu�[���PK�|[�V븽�6�ri/1.8/system/SOAP/WSDLDriver/Servant__/inspect-i.yamlnu�[���PK�|[�*v���<
��ri/1.8/system/SOAP/WSDLDriver/Servant__/body_from_obj-i.yamlnu�[���PK�|[��PG��2L��ri/1.8/system/SOAP/WSDLDriver/Servant__/new-c.yamlnu�[���PK�|[��8���C{��ri/1.8/system/SOAP/WSDLDriver/Servant__/create_method_struct-i.yamlnu�[���PK�|[%y�9��G֧�ri/1.8/system/SOAP/WSDLDriver/Servant__/add_rpc_method_interface-i.yamlnu�[���PK�|[j�fu��B>��ri/1.8/system/SOAP/WSDLDriver/Servant__/headeritem_from_obj-i.yamlnu�[���PK�|[�9�t��E���ri/1.8/system/SOAP/WSDLDriver/Servant__/test_loopback_response-i.yamlnu�[���PK�|[��M��>߫�ri/1.8/system/SOAP/WSDLDriver/Servant__/receive_headers-i.yamlnu�[���PK�|[�[J
��>"��ri/1.8/system/SOAP/WSDLDriver/Servant__/header_from_obj-i.yamlnu�[���PK�|[Q{�$��Ej��ri/1.8/system/SOAP/WSDLDriver/Servant__/set_wiredump_file_base-i.yamlnu�[���PK�|[��@y��;���ri/1.8/system/SOAP/WSDLDriver/Servant__/reset_stream-i.yamlnu�[���PK�|[|����.�ri/1.8/system/SOAP/WSDLDriver/httpproxy-i.yamlnu�[���PK�|[��=J��,��ri/1.8/system/SOAP/WSDLDriver/inspect-i.yamlnu�[���PK�|[n�f��(��ri/1.8/system/SOAP/WSDLDriver/new-c.yamlnu�[���PK�|[�GWq��5'��ri/1.8/system/SOAP/WSDLDriver/mandatorycharset-i.yamlnu�[���PK�|[?ͽ��1P��ri/1.8/system/SOAP/WSDLDriver/wiredump_dev-i.yamlnu�[���PK�|[)W���1m��ri/1.8/system/SOAP/WSDLDriver/httpproxy%3d-i.yamlnu�[���PK�|[zŚ��7���ri/1.8/system/SOAP/WSDLDriver/wiredump_file_base-i.yamlnu�[���PK�|[ފ����4���ri/1.8/system/SOAP/WSDLDriver/wiredump_dev%3d-i.yamlnu�[���PK�|[�����8�ri/1.8/system/SOAP/WSDLDriver/mandatorycharset%3d-i.yamlnu�[���PK�|[Џإ��:*��ri/1.8/system/SOAP/WSDLDriver/wiredump_file_base%3d-i.yamlnu�[���PK�|[����1p��ri/1.8/system/SOAP/WSDLDriver/reset_stream-i.yamlnu�[���PK�|[�Q((K���ri/1.8/system/SOAP/SOAPNonNegativeInteger/cdesc-SOAPNonNegativeInteger.yamlnu�[���PK�|[W�jX��=0��ri/1.8/system/SOAP/ArrayStoreError/cdesc-ArrayStoreError.yamlnu�[���PK�|[(8,y��Em��ri/1.8/system/SOAP/ResponseFormatError/cdesc-ResponseFormatError.yamlnu�[���PK�|[���1���ri/1.8/system/SOAP/SOAPGYear/cdesc-SOAPGYear.yamlnu�[���PK�|[o��/�ri/1.8/system/SOAP/SOAPTime/cdesc-SOAPTime.yamlnu�[���PK�|[L����4y�ri/1.8/system/SOAP/SOAPReference/create_refid-c.yamlnu�[���PK�|[���5��0��ri/1.8/system/SOAP/SOAPReference/refidstr-i.yamlnu�[���PK�|[��9N��9��ri/1.8/system/SOAP/SOAPReference/cdesc-SOAPReference.yamlnu�[���PK�|[L;G�((6�ri/1.8/system/SOAP/SOAPReference/method_missing-i.yamlnu�[���PK�|[iŠ��2��ri/1.8/system/SOAP/SOAPReference/__getobj__-i.yamlnu�[���PK�|[��2�+��ri/1.8/system/SOAP/SOAPReference/new-c.yamlnu�[���PK�|[����.�ri/1.8/system/SOAP/SOAPReference/decode-c.yamlnu�[���PK�|[���21�ri/1.8/system/SOAP/SOAPReference/__setobj__-i.yamlnu�[���PK�|[�5.���=Q�ri/1.8/system/SOAP/RPCRoutingError/cdesc-RPCRoutingError.yamlnu�[���PK�|[��6���)��ri/1.8/system/SOAP/Error/cdesc-Error.yamlnu�[���PK�|[Ly���7��ri/1.8/system/SOAP/HTTPStreamHandler/set_options-i.yamlnu�[���PK�|[>�����C��ri/1.8/system/SOAP/HTTPStreamHandler/accept_encoding_gzip%3d-i.yamlnu�[���PK�|[�S���5!�ri/1.8/system/SOAP/HTTPStreamHandler/send_post-i.yamlnu�[���PK�|[��P��3d�ri/1.8/system/SOAP/HTTPStreamHandler/inspect-i.yamlnu�[���PK�|[��<%��/��ri/1.8/system/SOAP/HTTPStreamHandler/new-c.yamlnu�[���PK�|[<����H��ri/1.8/system/SOAP/HTTPStreamHandler/send_accept_encoding_gzip%3f-i.yamlnu�[���PK�|[�g���0��ri/1.8/system/SOAP/HTTPStreamHandler/send-i.yamlnu�[���PK�|[�ת��A?�ri/1.8/system/SOAP/HTTPStreamHandler/cdesc-HTTPStreamHandler.yamlnu�[���PK�|[R-2��B1�ri/1.8/system/SOAP/HTTPStreamHandler/test_loopback_response-i.yamlnu�[���PK�|[�D�R��Az�ri/1.8/system/SOAP/HTTPStreamHandler/set_cookie_store_file-i.yamlnu�[���PK�|[�w�c��1��ri/1.8/system/SOAP/HTTPStreamHandler/reset-i.yamlnu�[���PK�|[�����7��ri/1.8/system/SOAP/HTTPStreamHandler/decode_gzip-i.yamlnu�[���PK�|[{y
2

9�ri/1.8/system/SOAP/SOAPGMonthDay/cdesc-SOAPGMonthDay.yamlnu�[���PK�|[G���9��ri/1.8/system/SOAP/SOAPRawString/cdesc-SOAPRawString.yamlnu�[���PK�|[zG���)��ri/1.8/system/SOAP/Property/%5b%5d-i.yamlnu�[���PK�|[y�am��+H�ri/1.8/system/SOAP/Property/empty%3f-i.yamlnu�[���PK�|[��Pe��'Q�ri/1.8/system/SOAP/Property/each-i.yamlnu�[���PK�|[�I�b��*q�ri/1.8/system/SOAP/Property/key_max-i.yamlnu�[���PK�|[˾X?��/|�ri/1.8/system/SOAP/Property/local_assign-i.yamlnu�[���PK�|[�=	/��,��ri/1.8/system/SOAP/Property/name_to_a-i.yamlnu�[���PK�|[V>_��-��ri/1.8/system/SOAP/Property/local_hook-i.yamlnu�[���PK�|[�����/��ri/1.8/system/SOAP/Property/loadproperty-i.yamlnu�[���PK�|[�����'4�ri/1.8/system/SOAP/Property/load-i.yamlnu�[���PK�|[�3Ӧ��3;��ri/1.8/system/SOAP/Property/loadpropertyfile-i.yamlnu�[���PK�|[j�B��3e��ri/1.8/system/SOAP/Property/generate_new_key-i.yamlnu�[���PK�|[�r�W��1���ri/1.8/system/SOAP/Property/local_referent-i.yamlnu�[���PK�|[��}��)���ri/1.8/system/SOAP/Property/to_key-i.yamlnu�[���PK�|[K[���+���ri/1.8/system/SOAP/Property/each_key-i.yamlnu�[���PK�|[��g5��)��ri/1.8/system/SOAP/Property/unlock-i.yamlnu�[���PK�|[�~��,���ri/1.8/system/SOAP/Property/locked%3f-i.yamlnu�[���PK�|[T���4��ri/1.8/system/SOAP/Property/local_assign_hook-i.yamlnu�[���PK�|[��
���.?��ri/1.8/system/SOAP/Property/assign_hook-i.yamlnu�[���PK�|[�e����7i��ri/1.8/system/SOAP/Property/Util/const_from_name-i.yamlnu�[���PK�|[��T220��ri/1.8/system/SOAP/Property/Util/cdesc-Util.yamlnu�[���PK�|[�8~��9.�ri/1.8/system/SOAP/Property/Util/require_from_name-i.yamlnu�[���PK�|[��K��&g�ri/1.8/system/SOAP/Property/new-c.yamlnu�[���PK�|[Ӓ�ڹ�)e�ri/1.8/system/SOAP/Property/assign-i.yamlnu�[���PK�|[}۬ ��,w�ri/1.8/system/SOAP/Property/deref_key-i.yamlnu�[���PK�|[����'��ri/1.8/system/SOAP/Property/load-c.yamlnu�[���PK�|[�8[���3��ri/1.8/system/SOAP/Property/assign_self_hook-i.yamlnu�[���PK�|[���)��ri/1.8/system/SOAP/Property/%3c%3c-i.yamlnu�[���PK�|[����'"
�ri/1.8/system/SOAP/Property/keys-i.yamlnu�[���PK�|[AISr"
"
/#�ri/1.8/system/SOAP/Property/cdesc-Property.yamlnu�[���PK�|[�L���)��ri/1.8/system/SOAP/Property/values-i.yamlnu�[���PK�|[[�\��-��ri/1.8/system/SOAP/Property/check_lock-i.yamlnu�[���PK�|[$�M��-��ri/1.8/system/SOAP/Property/propkey%3f-i.yamlnu�[���PK�|[*����+��ri/1.8/system/SOAP/Property/referent-i.yamlnu�[���PK�|[A���'��ri/1.8/system/SOAP/Property/lock-i.yamlnu�[���PK�|[���*��ri/1.8/system/SOAP/Property/loadstr-i.yamlnu�[���PK�|[;��,�ri/1.8/system/SOAP/Property/%5b%5d%3d-i.yamlnu�[���PK�|[Į�©�+q �ri/1.8/system/SOAP/Property/add_hook-i.yamlnu�[���PK�|[��m��/u"�ri/1.8/system/SOAP/Property/loadproperty-c.yamlnu�[���PK�|[��`���,�#�ri/1.8/system/SOAP/SOAPElement/%5b%5d-i.yamlnu�[���PK�|[
��8�$�ri/1.8/system/SOAP/SOAPElement/safe_accessor_name-i.yamlnu�[���PK�|[�5z���*�%�ri/1.8/system/SOAP/SOAPElement/each-i.yamlnu�[���PK�|[z����.'�ri/1.8/system/SOAP/SOAPElement/from_obj-c.yamlnu�[���PK�|[T0���,=(�ri/1.8/system/SOAP/SOAPElement/to_obj-i.yamlnu�[���PK�|[�U�y��)J)�ri/1.8/system/SOAP/SOAPElement/add-i.yamlnu�[���PK�|[7ayKQQ5�*�ri/1.8/system/SOAP/SOAPElement/cdesc-SOAPElement.yamlnu�[���PK�|['b�M��-A2�ri/1.8/system/SOAP/SOAPElement/inspect-i.yamlnu�[���PK�|[��0���)Q3�ri/1.8/system/SOAP/SOAPElement/new-c.yamlnu�[���PK�|[�	;��-h4�ri/1.8/system/SOAP/SOAPElement/members-i.yamlnu�[���PK�|[�=9k��2x5�ri/1.8/system/SOAP/SOAPElement/add_accessor-i.yamlnu�[���PK�|[ޑ�H��0�6�ri/1.8/system/SOAP/SOAPElement/to_elename-c.yamlnu�[���PK�|[sN����,�7�ri/1.8/system/SOAP/SOAPElement/decode-c.yamlnu�[���PK�|[awj���0�8�ri/1.8/system/SOAP/SOAPElement/add_member-i.yamlnu�[���PK�|[�;���/:�ri/1.8/system/SOAP/SOAPElement/%5b%5d%3d-i.yamlnu�[���PK�|[){N��,;�ri/1.8/system/SOAP/SOAPElement/key%3f-i.yamlnu�[���PK�|[�:��+$<�ri/1.8/system/SOAP/save_cookie_store-i.yamlnu�[���PK�|[F�r�((KA=�ri/1.8/system/SOAP/SOAPNonPositiveInteger/cdesc-SOAPNonPositiveInteger.yamlnu�[���PK�|[ Y���=�>�ri/1.8/system/SOAP/Mapping/schema_attribute_definition-c.yamlnu�[���PK�|[lu���4-@�ri/1.8/system/SOAP/Mapping/SOAPException/to_e-i.yamlnu�[���PK�|[���ɷ�3IA�ri/1.8/system/SOAP/Mapping/SOAPException/new-c.yamlnu�[���PK�|['��..AcB�ri/1.8/system/SOAP/Mapping/SOAPException/cdesc-SOAPException.yamlnu�[���PK�|[��
X��?E�ri/1.8/system/SOAP/Mapping/MappingError/cdesc-MappingError.yamlnu�[���PK�|[?Ƽ���+DF�ri/1.8/system/SOAP/Mapping/_obj2soap-c.yamlnu�[���PK�|[5a�l��7kG�ri/1.8/system/SOAP/Mapping/class_schema_variable-c.yamlnu�[���PK�|[�Al)ooK�H�ri/1.8/system/SOAP/Mapping/TypedArrayFactory_/cdesc-TypedArrayFactory_.yamlnu�[���PK�|[q~߯��=�J�ri/1.8/system/SOAP/Mapping/TypedArrayFactory_/obj2soap-i.yamlnu�[���PK�|[D����8�K�ri/1.8/system/SOAP/Mapping/TypedArrayFactory_/new-c.yamlnu�[���PK�|[��FS��=M�ri/1.8/system/SOAP/Mapping/TypedArrayFactory_/soap2obj-i.yamlnu�[���PK�|[I^���/kN�ri/1.8/system/SOAP/Mapping/get_attribute-c.yamlnu�[���PK�|[-��N��E�O�ri/1.8/system/SOAP/Mapping/TraverseSupport/mark_marshalled_obj-i.yamlnu�[���PK�|[�ѐ���G�P�ri/1.8/system/SOAP/Mapping/TraverseSupport/mark_unmarshalled_obj-i.yamlnu�[���PK�|[i����EIR�ri/1.8/system/SOAP/Mapping/TraverseSupport/cdesc-TraverseSupport.yamlnu�[���PK�|[�)���E�T�ri/1.8/system/SOAP/Mapping/MappedException/cdesc-MappedException.yamlnu�[���PK�|[@�
Ӽ�-�U�ri/1.8/system/SOAP/Mapping/class2qname-c.yamlnu�[���PK�|[J��p��8W�ri/1.8/system/SOAP/Mapping/ArrayFactory_/obj2soap-i.yamlnu�[���PK�|[�����3[Y�ri/1.8/system/SOAP/Mapping/ArrayFactory_/new-c.yamlnu�[���PK�|[��M���8�Z�ri/1.8/system/SOAP/Mapping/ArrayFactory_/soap2obj-i.yamlnu�[���PK�|[ji��eeA�[�ri/1.8/system/SOAP/Mapping/ArrayFactory_/cdesc-ArrayFactory_.yamlnu�[���PK�|[ʡ#��+�]�ri/1.8/system/SOAP/Mapping/_soap2obj-c.yamlnu�[���PK�|[g�Z���1�^�ri/1.8/system/SOAP/Mapping/class_from_name-c.yamlnu�[���PK�|[�ͮm��C`�ri/1.8/system/SOAP/Mapping/RubytypeFactory/unknownstruct2obj-i.yamlnu�[���PK�|[�H�b��>_a�ri/1.8/system/SOAP/Mapping/RubytypeFactory/rubytype2obj-i.yamlnu�[���PK�|[kA�@==;�b�ri/1.8/system/SOAP/Mapping/RubytypeFactory/array2obj-i.yamlnu�[���PK�|[rk�9��HYd�ri/1.8/system/SOAP/Mapping/RubytypeFactory/singleton_methods_true-i.yamlnu�[���PK�|[;�����A�e�ri/1.8/system/SOAP/Mapping/RubytypeFactory/unknowntype2obj-i.yamlnu�[���PK�|[��1��:g�ri/1.8/system/SOAP/Mapping/RubytypeFactory/obj2soap-i.yamlnu�[���PK�|[�'���5Jh�ri/1.8/system/SOAP/Mapping/RubytypeFactory/new-c.yamlnu�[���PK�|[]N����:ri�ri/1.8/system/SOAP/Mapping/RubytypeFactory/soap2obj-i.yamlnu�[���PK�|[�`��@@<�j�ri/1.8/system/SOAP/Mapping/RubytypeFactory/string2obj-i.yamlnu�[���PK�|[�v��@dl�ri/1.8/system/SOAP/Mapping/RubytypeFactory/addiv2soapattr-i.yamlnu�[���PK�|[Hs�`��E�m�ri/1.8/system/SOAP/Mapping/RubytypeFactory/cdesc-RubytypeFactory.yamlnu�[���PK�|[w�0���=�v�ri/1.8/system/SOAP/Mapping/RubytypeFactory/anytype2obj-i.yamlnu�[���PK�|[�z��A�w�ri/1.8/system/SOAP/Mapping/RubytypeFactory/unknownobj2soap-i.yamlnu�[���PK�|[h�$��DHy�ri/1.8/system/SOAP/Mapping/RubytypeFactory/rubytypestruct2obj-i.yamlnu�[���PK�|[=�����?�z�ri/1.8/system/SOAP/Mapping/RubytypeFactory/exception2obj-i.yamlnu�[���PK�|[��3��6�{�ri/1.8/system/SOAP/Mapping/define_attr_accessor-c.yamlnu�[���PK�|[PІ�5N}�ri/1.8/system/SOAP/Mapping/create_empty_object-c.yamlnu�[���PK�|[r�¹��0�~�ri/1.8/system/SOAP/Mapping/set_attributes-c.yamlnu�[���PK�|[�����1��ri/1.8/system/SOAP/Mapping/fault2exception-c.yamlnu�[���PK�|[m�\<<C��ri/1.8/system/SOAP/Mapping/Base64Factory_/cdesc-Base64Factory_.yamlnu�[���PK�|[����9‚�ri/1.8/system/SOAP/Mapping/Base64Factory_/obj2soap-i.yamlnu�[���PK�|[/�P���9��ri/1.8/system/SOAP/Mapping/Base64Factory_/soap2obj-i.yamlnu�[���PK�|[L"f��.J��ri/1.8/system/SOAP/Mapping/name2elename-c.yamlnu�[���PK�|["S��*z��ri/1.8/system/SOAP/Mapping/soap2obj-c.yamlnu�[���PK�|[l,��A���ri/1.8/system/SOAP/Mapping/Registry/find_mapped_soap_class-i.yamlnu�[���PK�|[	���8��ri/1.8/system/SOAP/Mapping/Registry/addextend2obj-i.yamlnu�[���PK�|[�h���4?��ri/1.8/system/SOAP/Mapping/Registry/_obj2soap-i.yamlnu�[���PK�|[�
=3d��ri/1.8/system/SOAP/Mapping/Registry/obj2soap-i.yamlnu�[���PK�|[gҨJK K 7ߍ�ri/1.8/system/SOAP/Mapping/Registry/cdesc-Registry.yamlnu�[���PK�|[VG6.���ri/1.8/system/SOAP/Mapping/Registry/set-i.yamlnu�[���PK�|[a;�#4���ri/1.8/system/SOAP/Mapping/Registry/_soap2obj-i.yamlnu�[���PK�|[�K��.|��ri/1.8/system/SOAP/Mapping/Registry/add-i.yamlnu�[���PK�|[��#���.ܲ�ri/1.8/system/SOAP/Mapping/Registry/new-c.yamlnu�[���PK�|[0d���4���ri/1.8/system/SOAP/Mapping/Registry/addiv2obj-i.yamlnu�[���PK�|[g��3!��ri/1.8/system/SOAP/Mapping/Registry/soap2obj-i.yamlnu�[���PK�|[%g����@P��ri/1.8/system/SOAP/Mapping/Registry/find_mapped_obj_class-i.yamlnu�[���PK�|[�q���9���ri/1.8/system/SOAP/Mapping/Registry/addextend2soap-i.yamlnu�[���PK�|[�� ��Eٸ�ri/1.8/system/SOAP/Mapping/Registry/Map/find_mapped_soap_class-i.yamlnu�[���PK�|[@>�	3:��ri/1.8/system/SOAP/Mapping/Registry/Map/init-i.yamlnu�[���PK�|[?1v���7���ri/1.8/system/SOAP/Mapping/Registry/Map/obj2soap-i.yamlnu�[���PK�|[�{$2ϼ�ri/1.8/system/SOAP/Mapping/Registry/Map/add-i.yamlnu�[���PK�|[��hh6N��ri/1.8/system/SOAP/Mapping/Registry/Map/cdesc-Map.yamlnu�[���PK�|[�$~
��2��ri/1.8/system/SOAP/Mapping/Registry/Map/new-c.yamlnu�[���PK�|[�����7<�ri/1.8/system/SOAP/Mapping/Registry/Map/soap2obj-i.yamlnu�[���PK�|[,IV"��Dt�ri/1.8/system/SOAP/Mapping/Registry/Map/find_mapped_obj_class-i.yamlnu�[���PK�|[r�;��4��ri/1.8/system/SOAP/Mapping/Registry/Map/clear-i.yamlnu�[���PK�|[���i��6��ri/1.8/system/SOAP/Mapping/schema_ns_definition-c.yamlnu�[���PK�|[!<y��4%�ri/1.8/system/SOAP/Mapping/protect_threadvars-c.yamlnu�[���PK�|[�E����;b�ri/1.8/system/SOAP/Mapping/schema_element_definition-c.yamlnu�[���PK�|[̷0��6��ri/1.8/system/SOAP/Mapping/Factory/setiv2struct-i.yamlnu�[���PK�|[4��;dd5��ri/1.8/system/SOAP/Mapping/Factory/cdesc-Factory.yamlnu�[���PK�|[>�A���2��ri/1.8/system/SOAP/Mapping/Factory/obj2soap-i.yamlnu�[���PK�|[Y�:��4��ri/1.8/system/SOAP/Mapping/Factory/setiv2soap-i.yamlnu�[���PK�|[F�f���-�ri/1.8/system/SOAP/Mapping/Factory/new-c.yamlnu�[���PK�|[�:�F��2�ri/1.8/system/SOAP/Mapping/Factory/soap2obj-i.yamlnu�[���PK�|[eaeb��3N�ri/1.8/system/SOAP/Mapping/Factory/setiv2obj-i.yamlnu�[���PK�|[�x���3{�ri/1.8/system/SOAP/Mapping/Factory/setiv2ary-i.yamlnu�[���PK�|[�^6*��ri/1.8/system/SOAP/Mapping/ary2soap-c.yamlnu�[���PK�|[s��(�ri/1.8/system/SOAP/Mapping/ary2md-c.yamlnu�[���PK�|[���;{�ri/1.8/system/SOAP/Mapping/BasetypeFactory_/obj2soap-i.yamlnu�[���PK�|[�>kkG��ri/1.8/system/SOAP/Mapping/BasetypeFactory_/cdesc-BasetypeFactory_.yamlnu�[���PK�|[P�]���6��ri/1.8/system/SOAP/Mapping/BasetypeFactory_/new-c.yamlnu�[���PK�|[��/���;��ri/1.8/system/SOAP/Mapping/BasetypeFactory_/soap2obj-i.yamlnu�[���PK�|[9d�}��2*�ri/1.8/system/SOAP/Mapping/module_from_name-c.yamlnu�[���PK�|[��3���;b�ri/1.8/system/SOAP/Mapping/Object/__set_xmlele_value-i.yamlnu�[���PK�|[�����/��ri/1.8/system/SOAP/Mapping/Object/%5b%5d-i.yamlnu�[���PK�|[����?��ri/1.8/system/SOAP/Mapping/Object/__define_attr_accessor-i.yamlnu�[���PK�|[�re��1�ri/1.8/system/SOAP/Mapping/Object/__xmlele-i.yamlnu�[���PK�|[*Ʒ�0!�ri/1.8/system/SOAP/Mapping/Object/inspect-i.yamlnu�[���PK�|[7m�vv38�ri/1.8/system/SOAP/Mapping/Object/cdesc-Object.yamlnu�[���PK�|[�v.���,�ri/1.8/system/SOAP/Mapping/Object/new-c.yamlnu�[���PK�|[!����2�ri/1.8/system/SOAP/Mapping/Object/__xmlattr-i.yamlnu�[���PK�|[��7���;9�ri/1.8/system/SOAP/Mapping/Object/__add_xmlele_value-i.yamlnu�[���PK�|[�n;W��2}�ri/1.8/system/SOAP/Mapping/Object/%5b%5d%3d-i.yamlnu�[���PK�|[�z
��O��ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/schema_element_definition-i.yamlnu�[���PK�|[rl����Q��ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/schema_attribute_definition-i.yamlnu�[���PK�|[,-ho��B�ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/stubobj2soap-i.yamlnu�[���PK�|[e�\���Gg�ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/add_elements2soap-i.yamlnu�[���PK�|[�٩<��J��ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/add_elements2stubobj-i.yamlnu�[���PK�|[����I!�ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/add_attributes2soap-i.yamlnu�[���PK�|[��O���E��ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/mappingobj2soap-i.yamlnu�[���PK�|[�Ux���>��ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/obj2soap-i.yamlnu�[���PK�|[�����>��ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/any2soap-i.yamlnu�[���PK�|[b����BP��ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/obj2typesoap-i.yamlnu�[���PK�|[�GB���D���ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/simpleobj2soap-i.yamlnu�[���PK�|[�Kc���=���ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/any2obj-i.yamlnu�[���PK�|[�Vo���A<��ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/obj2elesoap-i.yamlnu�[���PK�|[�<��9���ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/new-c.yamlnu�[���PK�|[��>���ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/soap2obj-i.yamlnu�[���PK�|[2����F��ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/soapele2plainobj-i.yamlnu�[���PK�|[L�\ϒ�M��ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/cdesc-WSDLLiteralRegistry.yamlnu�[���PK�|[�����M��ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/define_xmlattr_accessor-i.yamlnu�[���PK�|[f����KR
�ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/add_elements2plainobj-i.yamlnu�[���PK�|[�;����A��ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/anytype2obj-i.yamlnu�[���PK�|[����E��ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/soapele2stubobj-i.yamlnu�[���PK�|[�/5���LR�ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/add_attributes2stubobj-i.yamlnu�[���PK�|[|�E1��M��ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/add_attributes2plainobj-i.yamlnu�[���PK�|[-�#���?%�ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/base2soap-i.yamlnu�[���PK�|[Py���Df�ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/define_xmlattr-i.yamlnu�[���PK�|[�*���E��ri/1.8/system/SOAP/Mapping/WSDLLiteralRegistry/complexobj2soap-i.yamlnu�[���PK�|[�O���7�ri/1.8/system/SOAP/Mapping/HashFactory_/obj2soap-i.yamlnu�[���PK�|[��_cc?N�ri/1.8/system/SOAP/Mapping/HashFactory_/cdesc-HashFactory_.yamlnu�[���PK�|[Fg}��2 �ri/1.8/system/SOAP/Mapping/HashFactory_/new-c.yamlnu�[���PK�|[f�hR��7U�ri/1.8/system/SOAP/Mapping/HashFactory_/soap2obj-i.yamlnu�[���PK�|[���)��.��ri/1.8/system/SOAP/Mapping/elename2name-c.yamlnu�[���PK�|[^@Lw��/��ri/1.8/system/SOAP/Mapping/class2element-c.yamlnu�[���PK�|[0&��*��ri/1.8/system/SOAP/Mapping/obj2soap-c.yamlnu�[���PK�|[MQ-��-
!�ri/1.8/system/SOAP/Mapping/obj2element-c.yamlnu�[���PK�|[7����9!"�ri/1.8/system/SOAP/Mapping/define_singleton_method-c.yamlnu�[���PK�|[L�ɛ��8j#�ri/1.8/system/SOAP/Mapping/schema_type_definition-c.yamlnu�[���PK�|[)�ۃ��6�$�ri/1.8/system/SOAP/Mapping/URIFactory_/obj2soap-i.yamlnu�[���PK�|[�WB��6�%�ri/1.8/system/SOAP/Mapping/URIFactory_/soap2obj-i.yamlnu�[���PK�|[	��66= '�ri/1.8/system/SOAP/Mapping/URIFactory_/cdesc-URIFactory_.yamlnu�[���PK�|[/{SE��;�(�ri/1.8/system/SOAP/Mapping/DateTimeFactory_/obj2soap-i.yamlnu�[���PK�|[R��'��6*�ri/1.8/system/SOAP/Mapping/DateTimeFactory_/new-c.yamlnu�[���PK�|[��ʹ��;H+�ri/1.8/system/SOAP/Mapping/DateTimeFactory_/soap2obj-i.yamlnu�[���PK�|[��kkG�,�ri/1.8/system/SOAP/Mapping/DateTimeFactory_/cdesc-DateTimeFactory_.yamlnu�[���PK�|[����ggCr.�ri/1.8/system/SOAP/Mapping/StringFactory_/cdesc-StringFactory_.yamlnu�[���PK�|[�T	@��9L0�ri/1.8/system/SOAP/Mapping/StringFactory_/obj2soap-i.yamlnu�[���PK�|[�
���4�1�ri/1.8/system/SOAP/Mapping/StringFactory_/new-c.yamlnu�[���PK�|[�����9�2�ri/1.8/system/SOAP/Mapping/StringFactory_/soap2obj-i.yamlnu�[���PK�|[b�|��-
4�ri/1.8/system/SOAP/Mapping/cdesc-Mapping.yamlnu�[���PK�|[�b����,+A�ri/1.8/system/SOAP/Mapping/add_md_ary-c.yamlnu�[���PK�|[Aqy���>[B�ri/1.8/system/SOAP/Mapping/TypedStructFactory_/obj2soap-i.yamlnu�[���PK�|[���Q��>�C�ri/1.8/system/SOAP/Mapping/TypedStructFactory_/soap2obj-i.yamlnu�[���PK�|[��hFFM�D�ri/1.8/system/SOAP/Mapping/TypedStructFactory_/cdesc-TypedStructFactory_.yamlnu�[���PK�|[�`q��<�F�ri/1.8/system/SOAP/Mapping/AttachmentFactory/obj2soap-i.yamlnu�[���PK�|[F�����<H�ri/1.8/system/SOAP/Mapping/AttachmentFactory/soap2obj-i.yamlnu�[���PK�|[ �FQQINI�ri/1.8/system/SOAP/Mapping/AttachmentFactory/cdesc-AttachmentFactory.yamlnu�[���PK�|[��'���1K�ri/1.8/system/SOAP/Mapping/const_from_name-c.yamlnu�[���PK�|[ߪ���OML�ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/schema_element_definition-i.yamlnu�[���PK�|[HDr��JZN�ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/add_elements2stubobj-i.yamlnu�[���PK�|[��_
��>�O�ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/obj2soap-i.yamlnu�[���PK�|[	����>Q�ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/any2soap-i.yamlnu�[���PK�|[Z0���B?R�ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/obj2typesoap-i.yamlnu�[���PK�|[8H���B�S�ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/soap2stubobj-i.yamlnu�[���PK�|[�����D�T�ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/simpleobj2soap-i.yamlnu�[���PK�|[ 2�[��=)V�ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/any2obj-i.yamlnu�[���PK�|[�K�J��AjW�ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/struct2soap-i.yamlnu�[���PK�|[B>����9�X�ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/new-c.yamlnu�[���PK�|[�fF==>
Z�ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/soap2obj-i.yamlnu�[���PK�|[���C�[�ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/elements2soap-i.yamlnu�[���PK�|[wj�â�M]�ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/cdesc-WSDLEncodedRegistry.yamlnu�[���PK�|[�Xv1��?/d�ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/soap2soap-i.yamlnu�[���PK�|[����>ve�ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/map2soap-i.yamlnu�[���PK�|[���&��?�f�ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/base2soap-i.yamlnu�[���PK�|[6^H��@h�ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/array2soap-i.yamlnu�[���PK�|[��H"��EQi�ri/1.8/system/SOAP/Mapping/WSDLEncodedRegistry/complexobj2soap-i.yamlnu�[���PK�|[����NNA�j�ri/1.8/system/SOAP/SOAPAnySimpleType/cdesc-SOAPAnySimpleType.yamlnu�[���PK�|[�=ͺ�cl�ri/1.8/system/SOAP/post-i.yamlnu�[���PK�|[{�Ȋ��5km�ri/1.8/system/SOAP/StreamError/cdesc-StreamError.yamlnu�[���PK�|[G^�ME�n�ri/1.8/system/SOAP/SOAPNegativeInteger/cdesc-SOAPNegativeInteger.yamlnu�[���PK�|[w<`��0,p�ri/1.8/system/SOAP/SOAPFault/faultcode%3d-i.yamlnu�[���PK�|[|t����*Fq�ri/1.8/system/SOAP/SOAPFault/encode-i.yamlnu�[���PK�|[�
d5��/�r�ri/1.8/system/SOAP/SOAPFault/faultstring-i.yamlnu�[���PK�|[�2`>>1�s�ri/1.8/system/SOAP/SOAPFault/cdesc-SOAPFault.yamlnu�[���PK�|[�x�h��1Fw�ri/1.8/system/SOAP/SOAPFault/faultactor%3d-i.yamlnu�[���PK�|[�܂���*cx�ri/1.8/system/SOAP/SOAPFault/detail-i.yamlnu�[���PK�|[eN���'ly�ri/1.8/system/SOAP/SOAPFault/new-c.yamlnu�[���PK�|[�ڬ���-�z�ri/1.8/system/SOAP/SOAPFault/faultcode-i.yamlnu�[���PK�|[V�ʹ�-�{�ri/1.8/system/SOAP/SOAPFault/detail%3d-i.yamlnu�[���PK�|[cjO���.�|�ri/1.8/system/SOAP/SOAPFault/faultactor-i.yamlnu�[���PK�|[�\�w��2�}�ri/1.8/system/SOAP/SOAPFault/faultstring%3d-i.yamlnu�[���PK�|[L�T�yy;�ri/1.8/system/SOAP/SOAPHeaderItem/cdesc-SOAPHeaderItem.yamlnu�[���PK�|[Ӗ����/�ri/1.8/system/SOAP/SOAPHeaderItem/encode-i.yamlnu�[���PK�|[D��4��,1��ri/1.8/system/SOAP/SOAPHeaderItem/new-c.yamlnu�[���PK�|[�2\++3n��ri/1.8/system/SOAP/FaultError/cdesc-FaultError.yamlnu�[���PK�|[tJ�W��(���ri/1.8/system/SOAP/FaultError/new-c.yamlnu�[���PK�|[�֑��)��ri/1.8/system/SOAP/FaultError/to_s-i.yamlnu�[���PK�|[vx
H;��ri/1.8/system/SOAP/SOAPGYearMonth/cdesc-SOAPGYearMonth.yamlnu�[���PK�|[ˁ}#1���ri/1.8/system/SOAP/SOAPFloat/cdesc-SOAPFloat.yamlnu�[���PK�|[������ri/1.8/system/SOAP/new-c.yamlnu�[���PK�|[�E=i3�ri/1.8/system/SOAP/SOAPAnyURI/cdesc-SOAPAnyURI.yamlnu�[���PK�|[��3O��ri/1.8/system/SOAP/SOAPGMonth/cdesc-SOAPGMonth.yamlnu�[���PK�|[��K+��8���ri/1.8/system/SOAP/SOAPExternalReference/refidstr-i.yamlnu�[���PK�|[bTE)��8ݐ�ri/1.8/system/SOAP/SOAPExternalReference/referred-i.yamlnu�[���PK�|[})VK��3��ri/1.8/system/SOAP/SOAPExternalReference/new-c.yamlnu�[���PK�|[Y)5���I��ri/1.8/system/SOAP/SOAPExternalReference/cdesc-SOAPExternalReference.yamlnu�[���PK�|[�yN���Bx��ri/1.8/system/SOAP/SOAPExternalReference/external_contentid-i.yamlnu�[���PK�|[\������ri/1.8/system/SOAP/start-i.yamlnu�[���PK�|[Ҷ4##8ʗ�ri/1.8/system/SOAP/WSDLDriverFactory/createDriver-i.yamlnu�[���PK�|[w�����5U��ri/1.8/system/SOAP/WSDLDriverFactory/partqname-i.yamlnu�[���PK�|[��x��3|��ri/1.8/system/SOAP/WSDLDriverFactory/inspect-i.yamlnu�[���PK�|[^<J��A���ri/1.8/system/SOAP/WSDLDriverFactory/cdesc-WSDLDriverFactory.yamlnu�[���PK�|[X���=̟�ri/1.8/system/SOAP/WSDLDriverFactory/create_rpc_driver-i.yamlnu�[���PK�|[)<�ֵ�/'��ri/1.8/system/SOAP/WSDLDriverFactory/new-c.yamlnu�[���PK�|[��^�SS9;��ri/1.8/system/SOAP/WSDLDriverFactory/create_driver-i.yamlnu�[���PK�|[�~����7���ri/1.8/system/SOAP/WSDLDriverFactory/init_driver-i.yamlnu�[���PK�|[�v���9)��ri/1.8/system/SOAP/WSDLDriverFactory/add_operation-i.yamlnu�[���PK�|[9wQ��5a��ri/1.8/system/SOAP/WSDLDriverFactory/param_def-i.yamlnu�[���PK�|[+kO��5���ri/1.8/system/SOAP/WSDLDriverFactory/find_port-i.yamlnu�[���PK�|[�|����I�ri/1.8/system/SOAP/WSDLDriverFactory/FactoryError/cdesc-FactoryError.yamlnu�[���PK�|[� ���8B��ri/1.8/system/SOAP/WSDLDriverFactory/filter_parts-i.yamlnu�[���PK�|[0�ڀ��<���ri/1.8/system/SOAP/WSDLDriverFactory/create_param_def-i.yamlnu�[���PK�|[˽n��2¬�ri/1.8/system/SOAP/WSDLDriverFactory/import-i.yamlnu�[���PK�|[��ĸ�0�ri/1.8/system/SOAP/SOAPGenerator/prologue-i.yamlnu�[���PK�|[�z���O���ri/1.8/system/SOAP/SOAPGenerator/FormatEncodeError/cdesc-FormatEncodeError.yamlnu�[���PK�|[Кs(��5^��ri/1.8/system/SOAP/SOAPGenerator/encode_string-i.yamlnu�[���PK�|[�>��9���ri/1.8/system/SOAP/SOAPGenerator/cdesc-SOAPGenerator.yamlnu�[���PK�|[~zn��/���ri/1.8/system/SOAP/SOAPGenerator/xmldecl-i.yamlnu�[���PK�|[�ov~��2���ri/1.8/system/SOAP/SOAPGenerator/encode_tag-i.yamlnu�[���PK�|[	{%��6߻�ri/1.8/system/SOAP/SOAPGenerator/encode_element-i.yamlnu�[���PK�|[������4��ri/1.8/system/SOAP/SOAPGenerator/find_handler-i.yamlnu�[���PK�|[D,���+H��ri/1.8/system/SOAP/SOAPGenerator/new-c.yamlnu�[���PK�|[��q��0X��ri/1.8/system/SOAP/SOAPGenerator/epilogue-i.yamlnu�[���PK�|[�n����6p��ri/1.8/system/SOAP/SOAPGenerator/encode_tag_end-i.yamlnu�[���PK�|[<*�k��8���ri/1.8/system/SOAP/SOAPGenerator/encode_rawstring-i.yamlnu�[���PK�|[q��b��3��ri/1.8/system/SOAP/SOAPGenerator/encode_name-i.yamlnu�[���PK�|[�q�6��1�ri/1.8/system/SOAP/SOAPGenerator/assign_ns-c.yamlnu�[���PK�|[��wH��4D�ri/1.8/system/SOAP/SOAPGenerator/encode_child-i.yamlnu�[���PK�|[)�����<x�ri/1.8/system/SOAP/SOAPGenerator/element_qualified%3f-i.yamlnu�[���PK�|[8
����7��ri/1.8/system/SOAP/SOAPGenerator/encode_name_end-i.yamlnu�[���PK�|[����3��ri/1.8/system/SOAP/SOAPGenerator/encode_data-i.yamlnu�[���PK�|[_����5�ri/1.8/system/SOAP/SOAPGenerator/add_reftarget-i.yamlnu�[���PK�|[�LP���8I�ri/1.8/system/SOAP/SOAPGenerator/element_local%3f-i.yamlnu�[���PK�|[�-���0{�ri/1.8/system/SOAP/SOAPGenerator/generate-i.yamlnu�[���PK�|[����5��ri/1.8/system/SOAP/SOAPBoolean/cdesc-SOAPBoolean.yamlnu�[���PK�|[�
��0�ri/1.8/system/SOAP/test_loopback_response-i.yamlnu�[���PK�|[bT_;1/�ri/1.8/system/SOAP/SOAPQName/cdesc-SOAPQName.yamlnu�[���PK�|[�wh���9��ri/1.8/system/SOAP/Processor/default_parser_option-c.yamlnu�[���PK�|[≮��4��ri/1.8/system/SOAP/Processor/create_generator-c.yamlnu�[���PK�|[�;A1��ri/1.8/system/SOAP/Processor/cdesc-Processor.yamlnu�[���PK�|[fU-��+i�ri/1.8/system/SOAP/Processor/marshal-c.yamlnu�[���PK�|[�Iن��-��ri/1.8/system/SOAP/Processor/unmarshal-c.yamlnu�[���PK�|[���$��<��ri/1.8/system/SOAP/Processor/default_parser_option%3d-c.yamlnu�[���PK�|[��
%��1��ri/1.8/system/SOAP/Processor/create_parser-c.yamlnu�[���PK�|[�m��aa-�ri/1.8/system/SOAP/Marshal/cdesc-Marshal.yamlnu�[���PK�|[��{���&��ri/1.8/system/SOAP/Marshal/dump-c.yamlnu�[���PK�|[�W:���&��ri/1.8/system/SOAP/Marshal/load-c.yamlnu�[���PK�|[/03��)��ri/1.8/system/SOAP/Marshal/marshal-c.yamlnu�[���PK�|[S��
��+�ri/1.8/system/SOAP/Marshal/unmarshal-c.yamlnu�[���PK�|[]]��;\�ri/1.8/system/SOAP/SOAPAttachment/cdesc-SOAPAttachment.yamlnu�[���PK�|[�j��,F�ri/1.8/system/SOAP/SOAPAttachment/new-c.yamlnu�[���PK�|[v�)��;U�ri/1.8/system/SOAP/SOAPAttachment/external_contentid-i.yamlnu�[���PK�|[ZNFZ��6��ri/1.8/system/SOAP/HTTPConfigLoader/set_options-i.yamlnu�[���PK�|[���>��9��ri/1.8/system/SOAP/HTTPConfigLoader/ssl_config_int-i.yamlnu�[���PK�|[���l��8��ri/1.8/system/SOAP/HTTPConfigLoader/key_from_file-i.yamlnu�[���PK�|[[U����9*�ri/1.8/system/SOAP/HTTPConfigLoader/cert_from_file-i.yamlnu�[���PK�|[�˳��9a�ri/1.8/system/SOAP/HTTPConfigLoader/set_ssl_config-i.yamlnu�[���PK�|[.�:W?��ri/1.8/system/SOAP/HTTPConfigLoader/cdesc-HTTPConfigLoader.yamlnu�[���PK�|[~��9-�ri/1.8/system/SOAP/HTTPConfigLoader/set_basic_auth-i.yamlnu�[���PK�|[�ͱ��;n�ri/1.8/system/SOAP/SessionManager/cdesc-SessionManager.yamlnu�[���PK�|[c�2n��-��ri/1.8/system/SOAP/SOAPInt/cdesc-SOAPInt.yamlnu�[���PK�|[�i�m��1��ri/1.8/system/SOAP/MIMEMessage/content_str-i.yamlnu�[���PK�|[���==7��ri/1.8/system/SOAP/MIMEMessage/Header/cdesc-Header.yamlnu�[���PK�|[�0���3���ri/1.8/system/SOAP/MIMEMessage/Header/%5b%5d-i.yamlnu�[���PK�|[����0���ri/1.8/system/SOAP/MIMEMessage/Header/new-c.yamlnu�[���PK�|[�c4��1��ri/1.8/system/SOAP/MIMEMessage/Header/to_s-i.yamlnu�[���PK�|[�i
���6��ri/1.8/system/SOAP/MIMEMessage/Header/%5b%5d%3d-i.yamlnu�[���PK�|[�|jx��0��ri/1.8/system/SOAP/MIMEMessage/Part/parse-c.yamlnu�[���PK�|[}�Ȋ��0��ri/1.8/system/SOAP/MIMEMessage/Part/parse-i.yamlnu�[���PK�|[߯oV3332��ri/1.8/system/SOAP/MIMEMessage/Part/cdesc-Part.yamlnu�[���PK�|[M�i��.��ri/1.8/system/SOAP/MIMEMessage/Part/new-c.yamlnu�[���PK�|[�c�A��/��ri/1.8/system/SOAP/MIMEMessage/Part/to_s-i.yamlnu�[���PK�|[�Z���4��ri/1.8/system/SOAP/MIMEMessage/Part/contentid-i.yamlnu�[���PK�|[ID[��2
�ri/1.8/system/SOAP/MIMEMessage/has_parts%3f-i.yamlnu�[���PK�|[�,�T��+%�ri/1.8/system/SOAP/MIMEMessage/parse-c.yamlnu�[���PK�|[�G��*8�ri/1.8/system/SOAP/MIMEMessage/root-i.yamlnu�[���PK�|[Oum���+?�ri/1.8/system/SOAP/MIMEMessage/parse-i.yamlnu�[���PK�|[^�+O��.R�ri/1.8/system/SOAP/MIMEMessage/boundary-i.yamlnu�[���PK�|[O91��4e	�ri/1.8/system/SOAP/MIMEMessage/add_attachment-i.yamlnu�[���PK�|[w����3�
�ri/1.8/system/SOAP/MIMEMessage/Headers/parse-c.yamlnu�[���PK�|[�AG��3��ri/1.8/system/SOAP/MIMEMessage/Headers/parse-i.yamlnu�[���PK�|[9R��1��ri/1.8/system/SOAP/MIMEMessage/Headers/add-i.yamlnu�[���PK�|[�XV��9�
�ri/1.8/system/SOAP/MIMEMessage/Headers/cdesc-Headers.yamlnu�[���PK�|[ ����7@�ri/1.8/system/SOAP/MIMEMessage/Headers/parse_rhs-i.yamlnu�[���PK�|[ZH� ��2j�ri/1.8/system/SOAP/MIMEMessage/Headers/to_s-i.yamlnu�[���PK�|[a ���8��ri/1.8/system/SOAP/MIMEMessage/Headers/parse_line-i.yamlnu�[���PK�|[�T�f��)��ri/1.8/system/SOAP/MIMEMessage/new-c.yamlnu�[���PK�|[�Li��5��ri/1.8/system/SOAP/MIMEMessage/cdesc-MIMEMessage.yamlnu�[���PK�|[~CBμ�.��ri/1.8/system/SOAP/MIMEMessage/add_part-i.yamlnu�[���PK�|[B�QD��1��ri/1.8/system/SOAP/MIMEMessage/headers_str-i.yamlnu�[���PK�|[lOH���K�ri/1.8/system/SOAP/MIMEMessage/MIMEMessageError/cdesc-MIMEMessageError.yamlnu�[���PK�|[VN����*g�ri/1.8/system/SOAP/MIMEMessage/to_s-i.yamlnu�[���PK�|[8hد�+n�ri/1.8/system/SOAP/MIMEMessage/close-i.yamlnu�[���PK�|[�D?��/x�ri/1.8/system/SOAP/SOAPByte/cdesc-SOAPByte.yamlnu�[���PK�|[�ڶ��+� �ri/1.8/system/SOAP/SOAPStruct/%5b%5d-i.yamlnu�[���PK�|[:�gw��)�!�ri/1.8/system/SOAP/SOAPStruct/each-i.yamlnu�[���PK�|[��J���+#�ri/1.8/system/SOAP/SOAPStruct/to_obj-i.yamlnu�[���PK�|[q�[��(&$�ri/1.8/system/SOAP/SOAPStruct/add-i.yamlnu�[���PK�|[�"���(3%�ri/1.8/system/SOAP/SOAPStruct/new-c.yamlnu�[���PK�|[����,?&�ri/1.8/system/SOAP/SOAPStruct/replace-i.yamlnu�[���PK�|[�.
���,p'�ri/1.8/system/SOAP/SOAPStruct/members-i.yamlnu�[���PK�|[�\5C��+~(�ri/1.8/system/SOAP/SOAPStruct/decode-c.yamlnu�[���PK�|[@k-��3�)�ri/1.8/system/SOAP/SOAPStruct/cdesc-SOAPStruct.yamlnu�[���PK�|[���h��)�-�ri/1.8/system/SOAP/SOAPStruct/to_s-i.yamlnu�[���PK�|[l#����/�.�ri/1.8/system/SOAP/SOAPStruct/add_member-i.yamlnu�[���PK�|[�W<n��.�/�ri/1.8/system/SOAP/SOAPStruct/%5b%5d%3d-i.yamlnu�[���PK�|[�&j��+�0�ri/1.8/system/SOAP/SOAPStruct/key%3f-i.yamlnu�[���PK�|[O���/�1�ri/1.8/system/SOAP/SOAPType/cdesc-SOAPType.yamlnu�[���PK�|[�r����*A6�ri/1.8/system/SOAP/SOAPType/inspect-i.yamlnu�[���PK�|[t��=��&K7�ri/1.8/system/SOAP/SOAPType/new-c.yamlnu�[���PK�|[� ���+M8�ri/1.8/system/SOAP/SOAPType/rootnode-i.yamlnu�[���PK�|[�w7��cZ9�ri/1.8/system/SOAP/UnhandledMustUnderstandHeaderError/cdesc-UnhandledMustUnderstandHeaderError.yamlnu�[���PK�|[� M��S�:�ri/1.8/system/SOAP/ArrayIndexOutOfBoundsError/cdesc-ArrayIndexOutOfBoundsError.yamlnu�[���PK�|[��5 ��7L<�ri/1.8/system/SOAP/Marshallable/cdesc-Marshallable.yamlnu�[���PK�|[���L��)x=�ri/1.8/system/SOAP/SOAPBody/encode-i.yamlnu�[���PK�|[;E����+�>�ri/1.8/system/SOAP/SOAPBody/fault%3d-i.yamlnu�[���PK�|[�֍��&�?�ri/1.8/system/SOAP/SOAPBody/new-c.yamlnu�[���PK�|[aժ��+�@�ri/1.8/system/SOAP/SOAPBody/response-i.yamlnu�[���PK�|[D���*�A�ri/1.8/system/SOAP/SOAPBody/request-i.yamlnu�[���PK�|[b�A���(�B�ri/1.8/system/SOAP/SOAPBody/fault-i.yamlnu�[���PK�|[�3�e��,�C�ri/1.8/system/SOAP/SOAPBody/outparams-i.yamlnu�[���PK�|[��L���/E�ri/1.8/system/SOAP/SOAPBody/cdesc-SOAPBody.yamlnu�[���PK�|[f�;��,OH�ri/1.8/system/SOAP/SOAPBody/root_node-i.yamlnu�[���PK�|[���/_I�ri/1.8/system/SOAP/SOAPLong/cdesc-SOAPLong.yamlnu�[���PK�|[�*S����J�ri/1.8/system/SOAP/reset-i.yamlnu�[���PK�|[�F2���=�K�ri/1.8/system/SOAP/HTTPStreamError/cdesc-HTTPStreamError.yamlnu�[���PK�|[䳗Q��,�L�ri/1.8/system/SOAP/Attachment/content-i.yamlnu�[���PK�|[w�x��1N�ri/1.8/system/SOAP/Attachment/contentid%3d-i.yamlnu�[���PK�|[-�E��.#O�ri/1.8/system/SOAP/Attachment/contentid-c.yamlnu�[���PK�|[�{����(:P�ri/1.8/system/SOAP/Attachment/new-c.yamlnu�[���PK�|[l|J8��*TQ�ri/1.8/system/SOAP/Attachment/write-i.yamlnu�[���PK�|[�
�f��3_R�ri/1.8/system/SOAP/Attachment/mime_contentid-c.yamlnu�[���PK�|['F��)�S�ri/1.8/system/SOAP/Attachment/save-i.yamlnu�[���PK�|[����??3�T�ri/1.8/system/SOAP/Attachment/cdesc-Attachment.yamlnu�[���PK�|[MO=f��)4X�ri/1.8/system/SOAP/Attachment/to_s-i.yamlnu�[���PK�|[�{*��.9Y�ri/1.8/system/SOAP/Attachment/contentid-i.yamlnu�[���PK�|[U�e��3MZ�ri/1.8/system/SOAP/Attachment/mime_contentid-i.yamlnu�[���PK�|[���*��(p[�ri/1.8/system/SOAP/set_basic_auth-i.yamlnu�[���PK�|[��p?�\�ri/1.8/system/SOAP/SOAPUnsignedLong/cdesc-SOAPUnsignedLong.yamlnu�[���PK�|[[ ���3^�ri/1.8/system/SOAP/SOAPBase64/cdesc-SOAPBase64.yamlnu�[���PK�|[~��(C`�ri/1.8/system/SOAP/SOAPBase64/new-c.yamlnu�[���PK�|[E�ް�+�a�ri/1.8/system/SOAP/SOAPBase64/as_xsd-i.yamlnu�[���PK�|[��y��*�b�ri/1.8/system/SOAP/SOAPArray/%5b%5d-i.yamlnu�[���PK�|[Z��ʾ�(�c�ri/1.8/system/SOAP/SOAPArray/each-i.yamlnu�[���PK�|[P����2�d�ri/1.8/system/SOAP/SOAPArray/create_arytype-c.yamlnu�[���PK�|[�V߇��(�e�ri/1.8/system/SOAP/SOAPArray/to_a-i.yamlnu�[���PK�|[�v�a��,�f�ri/1.8/system/SOAP/SOAPArray/deep_map-i.yamlnu�[���PK�|[�y6��-h�ri/1.8/system/SOAP/SOAPArray/offset%3d-i.yamlnu�[���PK�|[��$���,&i�ri/1.8/system/SOAP/SOAPArray/traverse-i.yamlnu�[���PK�|[O7+���1Bj�ri/1.8/system/SOAP/SOAPArray/traverse_data-i.yamlnu�[���PK�|[G�2��,~k�ri/1.8/system/SOAP/SOAPArray/position-i.yamlnu�[���PK�|[�a�n��'�l�ri/1.8/system/SOAP/SOAPArray/add-i.yamlnu�[���PK�|[��!�ss1�m�ri/1.8/system/SOAP/SOAPArray/cdesc-SOAPArray.yamlnu�[���PK�|[%�I���.fu�ri/1.8/system/SOAP/SOAPArray/include%3f-i.yamlnu�[���PK�|[N$}:��'zv�ri/1.8/system/SOAP/SOAPArray/new-c.yamlnu�[���PK�|[��m��+�w�ri/1.8/system/SOAP/SOAPArray/replace-i.yamlnu�[���PK�|[_�-��*�x�ri/1.8/system/SOAP/SOAPArray/decode-c.yamlnu�[���PK�|[�r�Ҿ�.
z�ri/1.8/system/SOAP/SOAPArray/parse_type-c.yamlnu�[���PK�|[�.˺�,){�ri/1.8/system/SOAP/SOAPArray/retrieve-i.yamlnu�[���PK�|[����.?|�ri/1.8/system/SOAP/SOAPArray/soap2array-i.yamlnu�[���PK�|[�f���,d}�ri/1.8/system/SOAP/SOAPArray/ranksize-i.yamlnu�[���PK�|[���ز�-x~�ri/1.8/system/SOAP/SOAPArray/%5b%5d%3d-i.yamlnu�[���PK�|[D�J��.��ri/1.8/system/SOAP/SOAPArray/offsetnext-i.yamlnu�[���PK�|[i����*���ri/1.8/system/SOAP/set_cookie_store-i.yamlnu�[���PK�|[[:�0tt=���ri/1.8/system/SOAP/SOAPModuleUtils/cdesc-SOAPModuleUtils.yamlnu�[���PK�|[/��μ�0���ri/1.8/system/SOAP/SOAPModuleUtils/decode-i.yamlnu�[���PK�|[.�Z�//9���ri/1.8/system/SOAP/NetHttpClient/cdesc-NetHttpClient.yamlnu�[���PK�|[=|Z��%L��ri/1.8/system/SOAP/no_proxy%3f-i.yamlnu�[���PK�|[H����3O��ri/1.8/system/SOAP/Parser/find_encodingstyle-i.yamlnu�[���PK�|[D�P���H���ri/1.8/system/SOAP/Parser/FormatDecodeError/cdesc-FormatDecodeError.yamlnu�[���PK�|[y����/ى�ri/1.8/system/SOAP/Parser/decode_tag_end-i.yamlnu�[���PK�|[�
A���&��ri/1.8/system/SOAP/Parser/parse-i.yamlnu�[���PK�|[��vi��-��ri/1.8/system/SOAP/Parser/find_handler-i.yamlnu�[���PK�|[�n���+A��ri/1.8/system/SOAP/Parser/cdesc-Parser.yamlnu�[���PK�|[l����$F��ri/1.8/system/SOAP/Parser/new-c.yamlnu�[���PK�|[![[���,H��ri/1.8/system/SOAP/Parser/end_element-i.yamlnu�[���PK�|[�&�+��.^��ri/1.8/system/SOAP/Parser/start_element-i.yamlnu�[���PK�|[�����:���ri/1.8/system/SOAP/Parser/ParseError/cdesc-ParseError.yamlnu�[���PK�|[{�_��(���ri/1.8/system/SOAP/Parser/charset-i.yamlnu�[���PK�|[��=��+���ri/1.8/system/SOAP/Parser/characters-i.yamlnu�[���PK�|[8i>^��,Ҙ�ri/1.8/system/SOAP/Parser/decode_text-i.yamlnu�[���PK�|[�W2���R���ri/1.8/system/SOAP/Parser/UnexpectedElementError/cdesc-UnexpectedElementError.yamlnu�[���PK�|['�G��+i��ri/1.8/system/SOAP/Parser/decode_tag-i.yamlnu�[���PK�|[�{(���5���ri/1.8/system/SOAP/Parser/decode_soap_envelope-i.yamlnu�[���PK�|[U{[���>�ri/1.8/system/SOAP/Parser/ParseFrame/NodeContainer/node-i.yamlnu�[���PK�|[c����=��ri/1.8/system/SOAP/Parser/ParseFrame/NodeContainer/new-c.yamlnu�[���PK�|[G��e��FF��ri/1.8/system/SOAP/Parser/ParseFrame/NodeContainer/replace_node-i.yamlnu�[���PK�|[(g�ooK���ri/1.8/system/SOAP/Parser/ParseFrame/NodeContainer/cdesc-NodeContainer.yamlnu�[���PK�|[�=†��/}��ri/1.8/system/SOAP/Parser/ParseFrame/new-c.yamlnu�[���PK�|[Bn�Ǻ�3���ri/1.8/system/SOAP/Parser/ParseFrame/node%3d-i.yamlnu�[���PK�|[��2Y'':ȥ�ri/1.8/system/SOAP/Parser/ParseFrame/cdesc-ParseFrame.yamlnu�[���PK�|[R\�V?Y��ri/1.8/system/SOAP/SOAPUnsignedByte/cdesc-SOAPUnsignedByte.yamlnu�[���PK�|[?�3ީ�ri/1.8/system/SOAP/SOAPDouble/cdesc-SOAPDouble.yamlnu�[���PK�|[zd���%E��ri/1.8/system/SOAP/get_content-i.yamlnu�[���PK�|[
Ň��GX��ri/1.8/system/SOAP/PostUnavailableError/cdesc-PostUnavailableError.yamlnu�[���PK�|[�����&���ri/1.8/system/SOAP/Response/new-c.yamlnu�[���PK�|[z���/���ri/1.8/system/SOAP/Response/cdesc-Response.yamlnu�[���PK�|[H�>�3��ri/1.8/system/SOAP/SOAPString/cdesc-SOAPString.yamlnu�[���PK�|[��UǴ�.o��ri/1.8/system/SOAP/SOAPCompoundtype/new-c.yamlnu�[���PK�|[xx��?���ri/1.8/system/SOAP/SOAPCompoundtype/cdesc-SOAPCompoundtype.yamlnu�[���PK�|[ƫ��ee"���ri/1.8/system/SOAP/cdesc-SOAP.yamlnu�[���PK�|[�n��$;�ri/1.8/system/SOAP/Env/getenv-c.yamlnu�[���PK�|[����%<�ri/1.8/system/SOAP/Env/cdesc-Env.yamlnu�[���PK�|[s�S7��CG�ri/1.8/system/SOAP/EmptyResponseError/cdesc-EmptyResponseError.yamlnu�[���PK�|[�.�E��ri/1.8/system/SOAP/SOAPPositiveInteger/cdesc-SOAPPositiveInteger.yamlnu�[���PK�|[�dAu5$�ri/1.8/system/SOAP/SOAPInteger/cdesc-SOAPInteger.yamlnu�[���PK�|[Mv�a��9��ri/1.8/system/SOAP/StreamHandler/cdesc-StreamHandler.yamlnu�[���PK�|[�N����9��ri/1.8/system/SOAP/StreamHandler/create_media_type-c.yamlnu�[���PK�|[��fK��I	�ri/1.8/system/SOAP/StreamHandler/ConnectionData/cdesc-ConnectionData.yamlnu�[���PK�|["�N��:>�ri/1.8/system/SOAP/StreamHandler/ConnectionData/new-c.yamlnu�[���PK�|[*m���8v�ri/1.8/system/SOAP/StreamHandler/parse_media_type-c.yamlnu�[���PK�|[�P����;��ri/1.8/system/SOAP/EncodingStyle/Handler/add_handler-c.yamlnu�[���PK�|[2i���?��ri/1.8/system/SOAP/EncodingStyle/Handler/decode_prologue-i.yamlnu�[���PK�|[�M���>�ri/1.8/system/SOAP/EncodingStyle/Handler/decode_tag_end-i.yamlnu�[���PK�|[+�k���?Y�ri/1.8/system/SOAP/EncodingStyle/Handler/decode_epilogue-i.yamlnu�[���PK�|[
��B��3��ri/1.8/system/SOAP/EncodingStyle/Handler/uri-c.yamlnu�[���PK�|[�e4'��3��ri/1.8/system/SOAP/EncodingStyle/Handler/new-c.yamlnu�[���PK�|[0'}Y��?��ri/1.8/system/SOAP/EncodingStyle/Handler/encode_prologue-i.yamlnu�[���PK�|[�8��?�ri/1.8/system/SOAP/EncodingStyle/Handler/encode_data_end-i.yamlnu�[���PK�|[�����Ad�ri/1.8/system/SOAP/EncodingStyle/Handler/decode_typemap%3d-i.yamlnu�[���PK�|[)͂���?��ri/1.8/system/SOAP/EncodingStyle/Handler/encode_epilogue-i.yamlnu�[���PK�|[����7��ri/1.8/system/SOAP/EncodingStyle/Handler/handler-c.yamlnu�[���PK�|[D�s��4�ri/1.8/system/SOAP/EncodingStyle/Handler/each-c.yamlnu�[���PK�|[b��e��;E�ri/1.8/system/SOAP/EncodingStyle/Handler/cdesc-Handler.yamlnu�[���PK�|[��_gg;4��ri/1.8/system/SOAP/EncodingStyle/Handler/encode_data-i.yamlnu�[���PK�|[/4W���Y��ri/1.8/system/SOAP/EncodingStyle/Handler/EncodingStyleError/cdesc-EncodingStyleError.yamlnu�[���PK�|[9����;}��ri/1.8/system/SOAP/EncodingStyle/Handler/decode_text-i.yamlnu�[���PK�|[*��{SS:���ri/1.8/system/SOAP/EncodingStyle/Handler/decode_tag-i.yamlnu�[���PK�|[֓�u��9s��ri/1.8/system/SOAP/EncodingStyle/cdesc-EncodingStyle.yamlnu�[���PK�|[kP0��C���ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_basetype-i.yamlnu�[���PK�|[4�?���C���ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/cdesc-SOAPHandler.yamlnu�[���PK�|[e��yyO@�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/SOAPUnknown/cdesc-SOAPUnknown.yamlnu�[���PK�|[>���F8�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/SOAPUnknown/as_nil-i.yamlnu�[���PK�|[��F>��I{�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/SOAPUnknown/as_struct-i.yamlnu�[���PK�|[L��&��C�
�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/SOAPUnknown/new-c.yamlnu�[���PK�|[�8���I"�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/SOAPUnknown/as_string-i.yamlnu�[���PK�|[�\����Cn�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_prologue-i.yamlnu�[���PK�|[��c�F��ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_tag_by_wsdl-i.yamlnu�[���PK�|[!FW��B5�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_tag_end-i.yamlnu�[���PK�|[Q&��UU]�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/SOAPTemporalObject/cdesc-SOAPTemporalObject.yamlnu�[���PK�|[�����Ja�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/SOAPTemporalObject/new-c.yamlnu�[���PK�|[���4F��ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_tag_by_type-i.yamlnu�[���PK�|[��Sr��C+�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_epilogue-i.yamlnu�[���PK�|[t|

Mp�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_defined_simpletype-i.yamlnu�[���PK�|[�����B��ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_textbuf-i.yamlnu�[���PK�|[�H�K��7A�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/new-c.yamlnu�[���PK�|[�-�t��Co�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/encode_data_end-i.yamlnu�[���PK�|[y8���F� �ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_definedtype-i.yamlnu�[���PK�|[5����@D"�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_attrs-i.yamlnu�[���PK�|[�q���D�#�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/content_typename-i.yamlnu�[���PK�|[�q���A�$�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_parent-i.yamlnu�[���PK�|[́܇��A&&�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_arypos-i.yamlnu�[���PK�|[C�N?n'�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/encode_data-i.yamlnu�[���PK�|[w@����@�(�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/encode_attrs-i.yamlnu�[���PK�|[� �Q��?P*�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_text-i.yamlnu�[���PK�|[/�yy��E�+�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_resolve_id-i.yamlnu�[���PK�|[�z����D�,�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/content_ranksize-i.yamlnu�[���PK�|[���z��>..�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_tag-i.yamlnu�[���PK�|[�2h��B~/�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/create_arytype-i.yamlnu�[���PK�|[��6N�0�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_defined_complextype-i.yamlnu�[���PK�|[��c��EV2�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/encode_attr_value-i.yamlnu�[���PK�|[�4}���E�3�ri/1.8/system/SOAP/EncodingStyle/SOAPHandler/decode_attr_value-i.yamlnu�[���PK�|[�g"�ddM5�ri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/cdesc-ASPDotNetHandler.yamlnu�[���PK�|[�|��T�8�ri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/SOAPUnknown/cdesc-SOAPUnknown.yamlnu�[���PK�|[�""���K5;�ri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/SOAPUnknown/as_nil-i.yamlnu�[���PK�|[����N�<�ri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/SOAPUnknown/as_struct-i.yamlnu�[���PK�|[/�~���H�=�ri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/SOAPUnknown/new-c.yamlnu�[���PK�|[p�b;��N,?�ri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/SOAPUnknown/as_string-i.yamlnu�[���PK�|[�a}���H�@�ri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/decode_prologue-i.yamlnu�[���PK�|[�W����G�A�ri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/decode_tag_end-i.yamlnu�[���PK�|[��Wz��b%C�ri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/SOAPTemporalObject/cdesc-SOAPTemporalObject.yamlnu�[���PK�|[�|����OOE�ri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/SOAPTemporalObject/new-c.yamlnu�[���PK�|[���'��H�F�ri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/decode_epilogue-i.yamlnu�[���PK�|[f:��G�G�ri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/decode_textbuf-i.yamlnu�[���PK�|[\����<AI�ri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/new-c.yamlnu�[���PK�|[�����HyJ�ri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/encode_data_end-i.yamlnu�[���PK�|[w9�^��F�K�ri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/decode_parent-i.yamlnu�[���PK�|[W�  D8M�ri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/encode_data-i.yamlnu�[���PK�|[�r��D�N�ri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/decode_text-i.yamlnu�[���PK�|[0LR��CP�ri/1.8/system/SOAP/EncodingStyle/ASPDotNetHandler/decode_tag-i.yamlnu�[���PK�|[�
�k��RqQ�ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/SOAPUnknown/cdesc-SOAPUnknown.yamlnu�[���PK�|[LXa��I�S�ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/SOAPUnknown/as_nil-i.yamlnu�[���PK�|[ˁ����F�T�ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/SOAPUnknown/new-c.yamlnu�[���PK�|[�6;���MMV�ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/SOAPUnknown/as_element-i.yamlnu�[���PK�|[9���L�W�ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/SOAPUnknown/as_string-i.yamlnu�[���PK�|['��<��F�X�ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/decode_prologue-i.yamlnu�[���PK�|[�#V��E?Z�ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/decode_tag_end-i.yamlnu�[���PK�|[a�Q��`�[�ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/SOAPTemporalObject/cdesc-SOAPTemporalObject.yamlnu�[���PK�|[�xqR��M�]�ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/SOAPTemporalObject/new-c.yamlnu�[���PK�|[>@"���F_�ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/decode_epilogue-i.yamlnu�[���PK�|[][��EN`�ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/decode_textbuf-i.yamlnu�[���PK�|[�#��:�a�ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/new-c.yamlnu�[���PK�|[�5]���I�b�ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/cdesc-LiteralHandler.yamlnu�[���PK�|[�e�\��F�f�ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/encode_data_end-i.yamlnu�[���PK�|[�D����C=h�ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/decode_attrs-i.yamlnu�[���PK�|[a-G���D�i�ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/decode_parent-i.yamlnu�[���PK�|[��ĈB�j�ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/encode_data-i.yamlnu�[���PK�|[,�����Bil�ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/decode_text-i.yamlnu�[���PK�|[�n���A�m�ri/1.8/system/SOAP/EncodingStyle/LiteralHandler/decode_tag-i.yamlnu�[���PK�|[����#o�ri/1.8/system/SizedQueue/deq-i.yamlnu�[���PK�|[m�p���.7p�ri/1.8/system/SizedQueue/cdesc-SizedQueue.yamlnu�[���PK�|[Hܽ���#t�ri/1.8/system/SizedQueue/max-i.yamlnu�[���PK�|[�B]{��#Zu�ri/1.8/system/SizedQueue/enq-i.yamlnu�[���PK�|[�M��aa#�v�ri/1.8/system/SizedQueue/pop-i.yamlnu�[���PK�|[����

#>x�ri/1.8/system/SizedQueue/new-c.yamlnu�[���PK�|[�ɮ��$�y�ri/1.8/system/SizedQueue/push-i.yamlnu�[���PK�|[�����&�{�ri/1.8/system/SizedQueue/%3c%3c-i.yamlnu�[���PK�|[��+��%�|�ri/1.8/system/SizedQueue/shift-i.yamlnu�[���PK�|[����&�}�ri/1.8/system/SizedQueue/max%3d-i.yamlnu�[���PK�|[y�g�+1�ri/1.8/system/SizedQueue/num_waiting-i.yamlnu�[���PK�|[�ٻ���*���ri/1.8/system/EOFError/cdesc-EOFError.yamlnu�[���PK�|[B���uu!Ő�ri/1.8/system/Integer/pred-i.yamlnu�[���PK�|[ҟ�#���ri/1.8/system/Integer/odd%3f-i.yamlnu�[���PK�|[�Q��� ���ri/1.8/system/Integer/chr-i.yamlnu�[���PK�|[�\�<'��ri/1.8/system/Integer/integer%3f-i.yamlnu�[���PK�|[�S1��!l��ri/1.8/system/Integer/to_i-i.yamlnu�[���PK�|[�B�v��(l��ri/1.8/system/Integer/cdesc-Integer.yamlnu�[���PK�|[߻���&q��ri/1.8/system/Integer/numerator-i.yamlnu�[���PK�|["�yZ��$t��ri/1.8/system/Integer/to_yaml-i.yamlnu�[���PK�|[���$$!|��ri/1.8/system/Integer/upto-i.yamlnu�[���PK�|[�m��+�ri/1.8/system/Integer/prime_division-i.yamlnu�[���PK�|[IL�R�� ��ri/1.8/system/Integer/ord-i.yamlnu�[���PK�|[v@���#+��ri/1.8/system/Integer/gcdlcm-i.yamlnu�[���PK�|[�c�ڍ�!v��ri/1.8/system/Integer/next-i.yamlnu�[���PK�|[�4֥��!T��ri/1.8/system/Integer/gcd2-i.yamlnu�[���PK�|[��T�� K��ri/1.8/system/Integer/lcm-i.yamlnu�[���PK�|[!щ��!d��ri/1.8/system/Integer/ceil-i.yamlnu�[���PK�|[����(d��ri/1.8/system/Integer/denominator-i.yamlnu�[���PK�|[��(�"m��ri/1.8/system/Integer/times-i.yamlnu�[���PK�|[o5t��%ѵ�ri/1.8/system/Integer/truncate-i.yamlnu�[���PK�|[�����#ݷ�ri/1.8/system/Integer/to_int-i.yamlnu�[���PK�|[�ml��!�ri/1.8/system/Integer/succ-i.yamlnu�[���PK�|[	�,$���ri/1.8/system/Integer/even%3f-i.yamlnu�[���PK�|[�޸���!4��ri/1.8/system/Integer/to_r-i.yamlnu�[���PK�|[{v�.. ��ri/1.8/system/Integer/gcd-i.yamlnu�[���PK�|[����--)���ri/1.8/system/Integer/induced_from-c.yamlnu�[���PK�|[����"��ri/1.8/system/Integer/round-i.yamlnu�[���PK�|[u�1J��0��ri/1.8/system/Integer/from_prime_division-c.yamlnu�[���PK�|[�!���"��ri/1.8/system/Integer/floor-i.yamlnu�[���PK�|[��ee#��ri/1.8/system/Integer/downto-i.yamlnu�[���PK�|[$�!Ĵ�2d�ri/1.8/system/DRb/DRbUnknown/cdesc-DRbUnknown.yamlnu�[���PK�|[T�Y���*z�ri/1.8/system/DRb/DRbUnknown/reload-i.yamlnu�[���PK�|[a^5`��'��ri/1.8/system/DRb/DRbUnknown/new-c.yamlnu�[���PK�|[!�f�-��ri/1.8/system/DRb/DRbUnknown/exception-i.yamlnu�[���PK�|[���}��"i�ri/1.8/system/DRb/GW/%5b%5d-i.yamlnu�[���PK�|[�ڡ&��_�ri/1.8/system/DRb/GW/new-c.yamlnu�[���PK�|[J���rr"O�ri/1.8/system/DRb/GW/cdesc-GW.yamlnu�[���PK�|[I���%�ri/1.8/system/DRb/GW/%5b%5d%3d-i.yamlnu�[���PK�|[R
P�<<6�ri/1.8/system/DRb/DRbConnError/cdesc-DRbConnError.yamlnu�[���PK�|[���hh0��ri/1.8/system/DRb/DRbBadURI/cdesc-DRbBadURI.yamlnu�[���PK�|[�&9!--${�ri/1.8/system/DRb/install_acl-i.yamlnu�[���PK�|[�@:�oo,��ri/1.8/system/DRb/DRbConn/cdesc-DRbConn.yamlnu�[���PK�|[��ȥ��)��ri/1.8/system/DRb/DRbIdConv/to_obj-i.yamlnu�[���PK�|[�=�==0��ri/1.8/system/DRb/DRbIdConv/cdesc-DRbIdConv.yamlnu�[���PK�|[���nn(P�ri/1.8/system/DRb/DRbIdConv/to_id-i.yamlnu�[���PK�|[��;=��$�ri/1.8/system/DRb/ExtServ/new-c.yamlnu�[���PK�|[	�5���-'�ri/1.8/system/DRb/ExtServ/stop_service-i.yamlnu�[���PK�|[��ӥ��)<�ri/1.8/system/DRb/ExtServ/alive%3f-i.yamlnu�[���PK�|[�L��&A�ri/1.8/system/DRb/ExtServ/front-i.yamlnu�[���PK�|[�����,A�ri/1.8/system/DRb/ExtServ/cdesc-ExtServ.yamlnu�[���PK�|[�k�H.��ri/1.8/system/DRb/DRbError/cdesc-DRbError.yamlnu�[���PK�|[AEKzOO�ri/1.8/system/DRb/uri-i.yamlnu�[���PK�|[�D��'��ri/1.8/system/DRb/DRbArray/_load-c.yamlnu�[���PK�|[�׫Ȫ�%��ri/1.8/system/DRb/DRbArray/new-c.yamlnu�[���PK�|[�)��JJ.���ri/1.8/system/DRb/DRbArray/cdesc-DRbArray.yamlnu�[���PK�|[Cച��'Q��ri/1.8/system/DRb/DRbArray/_dump-i.yamlnu�[���PK�|[Fկ���@U��ri/1.8/system/DRb/DRbServerNotFound/cdesc-DRbServerNotFound.yamlnu�[���PK�|[�}�U��6]��ri/1.8/system/DRb/DRbURIOption/cdesc-DRbURIOption.yamlnu�[���PK�|[��/H

 ���ri/1.8/system/DRb/cdesc-DRb.yamlnu�[���PK�|[��ݨ^^6��ri/1.8/system/DRb/DRbBadScheme/cdesc-DRbBadScheme.yamlnu�[���PK�|["�‡���ri/1.8/system/DRb/to_obj-i.yamlnu�[���PK�|[���pp&��ri/1.8/system/DRb/start_service-i.yamlnu�[���PK�|[H�)tt5J�ri/1.8/system/DRb/DRbServer/default_load_limit-c.yamlnu�[���PK�|[caoBrr8#
�ri/1.8/system/DRb/DRbServer/check_insecure_method-i.yamlnu�[���PK�|[�R�9WW-��ri/1.8/system/DRb/DRbServer/verbose%3d-i.yamlnu�[���PK�|[cUT<<,��ri/1.8/system/DRb/DRbServer/main_loop-i.yamlnu�[���PK�|[�o=^^.I�ri/1.8/system/DRb/DRbServer/default_acl-c.yamlnu�[���PK�|[�>4���0�ri/1.8/system/DRb/DRbServer/cdesc-DRbServer.yamlnu�[���PK�|[�#6+)Q�ri/1.8/system/DRb/DRbServer/to_obj-i.yamlnu�[���PK�|[t�A$��2� �ri/1.8/system/DRb/DRbServer/kill_sub_thread-i.yamlnu�[���PK�|[4{,�[
[
&�!�ri/1.8/system/DRb/DRbServer/new-c.yamlnu�[���PK�|[!�y��@�,�ri/1.8/system/DRb/DRbServer/InvokeMethod/cdesc-InvokeMethod.yamlnu�[���PK�|[n��~~2�-�ri/1.8/system/DRb/DRbServer/default_id_conv-c.yamlnu�[���PK�|[��+��/�/�ri/1.8/system/DRb/DRbServer/stop_service-i.yamlnu�[���PK�|[���b))51�ri/1.8/system/DRb/DRbServer/insecure_method%3f-i.yamlnu�[���PK�|[��
��+�2�ri/1.8/system/DRb/DRbServer/alive%3f-i.yamlnu�[���PK�|[%Yӭ��&�3�ri/1.8/system/DRb/DRbServer/run-i.yamlnu�[���PK�|[,�L/*�4�ri/1.8/system/DRb/DRbServer/verbose-c.yamlnu�[���PK�|[;Х��5/6�ri/1.8/system/DRb/DRbServer/default_safe_level-c.yamlnu�[���PK�|[�E�tt5_7�ri/1.8/system/DRb/DRbServer/default_argc_limit-c.yamlnu�[���PK�|[Ι��(89�ri/1.8/system/DRb/DRbServer/to_id-i.yamlnu�[���PK�|[�0{WW*�:�ri/1.8/system/DRb/DRbServer/verbose-i.yamlnu�[���PK�|[�#V�MMNA<�ri/1.8/system/DRb/DRbServer/InvokeMethod18Mixin/cdesc-InvokeMethod18Mixin.yamlnu�[���PK�|[�^1(��I>�ri/1.8/system/DRb/DRbServer/InvokeMethod18Mixin/perform_with_block-i.yamlnu�[���PK�|[͘�;��B`?�ri/1.8/system/DRb/DRbServer/InvokeMethod18Mixin/block_yield-i.yamlnu�[���PK�|[�ԍ�\\-�@�ri/1.8/system/DRb/DRbServer/verbose%3d-c.yamlnu�[���PK�|[,��@@+YB�ri/1.8/system/DRb/DRbServer/any_to_s-i.yamlnu�[���PK�|[e���2�C�ri/1.8/system/DRb/ExtServManager/command%3d-c.yamlnu�[���PK�|[�b���0E�ri/1.8/system/DRb/ExtServManager/unregist-i.yamlnu�[���PK�|[hw?���>+F�ri/1.8/system/DRb/ExtServManager/invoke_service_command-i.yamlnu�[���PK�|[���/zG�ri/1.8/system/DRb/ExtServManager/service-i.yamlnu�[���PK�|[@AK��5�H�ri/1.8/system/DRb/ExtServManager/invoke_thread-i.yamlnu�[���PK�|[�S���6�I�ri/1.8/system/DRb/ExtServManager/invoke_service-i.yamlnu�[���PK�|[�ab���+�J�ri/1.8/system/DRb/ExtServManager/new-c.yamlnu�[���PK�|[�f@KK:�K�ri/1.8/system/DRb/ExtServManager/cdesc-ExtServManager.yamlnu�[���PK�|[q]����.�O�ri/1.8/system/DRb/ExtServManager/regist-i.yamlnu�[���PK�|[f<H���/�P�ri/1.8/system/DRb/ExtServManager/command-c.yamlnu�[���PK�|[���3��&�Q�ri/1.8/system/DRb/remove_server-i.yamlnu�[���PK�|[j�׭0�R�ri/1.8/system/DRb/DRbTCPSocket/recv_reply-i.yamlnu�[���PK�|[¯ڿ�3PT�ri/1.8/system/DRb/DRbTCPSocket/getservername-c.yamlnu�[���PK�|[a�S�&&2rU�ri/1.8/system/DRb/DRbTCPSocket/send_request-i.yamlnu�[���PK�|[z5FY0�V�ri/1.8/system/DRb/DRbTCPSocket/uri_option-c.yamlnu�[���PK�|[2ڼ��)pX�ri/1.8/system/DRb/DRbTCPSocket/new-c.yamlnu�[���PK�|[	��%��/vZ�ri/1.8/system/DRb/DRbTCPSocket/parse_uri-c.yamlnu�[���PK�|[�''.�[�ri/1.8/system/DRb/DRbTCPSocket/peeraddr-i.yamlnu�[���PK�|[�p�B0]�ri/1.8/system/DRb/DRbTCPSocket/send_reply-i.yamlnu�[���PK�|[�t-GG1�^�ri/1.8/system/DRb/DRbTCPSocket/open_server-c.yamlnu�[���PK�|[�#��,6`�ri/1.8/system/DRb/DRbTCPSocket/stream-i.yamlnu�[���PK�|[��֭��<wa�ri/1.8/system/DRb/DRbTCPSocket/open_server_inaddr_any-c.yamlnu�[���PK�|[ZS<��,�b�ri/1.8/system/DRb/DRbTCPSocket/accept-i.yamlnu�[���PK�|[��ķ��+�d�ri/1.8/system/DRb/DRbTCPSocket/close-i.yamlnu�[���PK�|[�B`2�f�ri/1.8/system/DRb/DRbTCPSocket/recv_request-i.yamlnu�[���PK�|[�
���.\h�ri/1.8/system/DRb/DRbTCPSocket/alive%3f-i.yamlnu�[���PK�|[�Thv6�i�ri/1.8/system/DRb/DRbTCPSocket/cdesc-DRbTCPSocket.yamlnu�[���PK�|[7X�***1o�ri/1.8/system/DRb/DRbTCPSocket/open-c.yamlnu�[���PK�|[�;M��(�p�ri/1.8/system/DRb/DRbObject/_load-c.yamlnu�[���PK�|[Hd�z��)�r�ri/1.8/system/DRb/DRbObject/eql%3f-i.yamlnu�[���PK�|[����+t�ri/1.8/system/DRb/DRbObject/__drburi-i.yamlnu�[���PK�|[o�x�1nu�ri/1.8/system/DRb/DRbObject/method_missing-i.yamlnu�[���PK�|[�_C���'�v�ri/1.8/system/DRb/DRbObject/hash-i.yamlnu�[���PK�|[��S���4�w�ri/1.8/system/DRb/DRbObject/prepare_backtrace-c.yamlnu�[���PK�|[���

/!y�ri/1.8/system/DRb/DRbObject/new_with_uri-c.yamlnu�[���PK�|[b4�U��0�z�ri/1.8/system/DRb/DRbObject/cdesc-DRbObject.yamlnu�[���PK�|[u�|U��.��ri/1.8/system/DRb/DRbObject/with_friend-c.yamlnu�[���PK�|[�����&π�ri/1.8/system/DRb/DRbObject/new-c.yamlnu�[���PK�|[�oE��0�ri/1.8/system/DRb/DRbObject/respond_to%3f-i.yamlnu�[���PK�|[�S���+��ri/1.8/system/DRb/DRbObject/new_with-c.yamlnu�[���PK�|[Y��a+,��ri/1.8/system/DRb/DRbObject/__drbref-i.yamlnu�[���PK�|[�|���)���ri/1.8/system/DRb/DRbObject/%3d%3d-i.yamlnu�[���PK�|[f�����(���ri/1.8/system/DRb/DRbObject/_dump-i.yamlnu�[���PK�|[�ߘ[xx%���ri/1.8/system/DRb/stop_service-i.yamlnu�[���PK�|[9�N�XX6���ri/1.8/system/DRb/DRbSSLSocket/cdesc-DRbSSLSocket.yamlnu�[���PK�|[��1��7E��ri/1.8/system/DRb/DRbSSLSocket/SSLConfig/connect-i.yamlnu�[���PK�|[Y�ȟ��6m��ri/1.8/system/DRb/DRbSSLSocket/SSLConfig/%5b%5d-i.yamlnu�[���PK�|[ȫ���A���ri/1.8/system/DRb/DRbSSLSocket/SSLConfig/setup_certificate-i.yamlnu�[���PK�|[JXV��Aϐ�ri/1.8/system/DRb/DRbSSLSocket/SSLConfig/setup_ssl_context-i.yamlnu�[���PK�|[�
��3��ri/1.8/system/DRb/DRbSSLSocket/SSLConfig/new-c.yamlnu�[���PK�|[1���61��ri/1.8/system/DRb/DRbSSLSocket/SSLConfig/accept-i.yamlnu�[���PK�|[A�h��=V��ri/1.8/system/DRb/DRbSSLSocket/SSLConfig/cdesc-SSLConfig.yamlnu�[���PK�|[�!�N��0]��ri/1.8/system/DRb/DRbSSLSocket/uri_option-c.yamlnu�[���PK�|[(L��)���ri/1.8/system/DRb/DRbSSLSocket/new-c.yamlnu�[���PK�|[?��º�/���ri/1.8/system/DRb/DRbSSLSocket/parse_uri-c.yamlnu�[���PK�|[O9����1���ri/1.8/system/DRb/DRbSSLSocket/open_server-c.yamlnu�[���PK�|[����,�ri/1.8/system/DRb/DRbSSLSocket/stream-i.yamlnu�[���PK�|[���l��,�ri/1.8/system/DRb/DRbSSLSocket/accept-i.yamlnu�[���PK�|[�^a��+���ri/1.8/system/DRb/DRbSSLSocket/close-i.yamlnu�[���PK�|[ ��@��*	��ri/1.8/system/DRb/DRbSSLSocket/open-c.yamlnu�[���PK�|[��=&��1��ri/1.8/system/DRb/DRbUNIXSocket/uri_option-c.yamlnu�[���PK�|[���>��*A��ri/1.8/system/DRb/DRbUNIXSocket/new-c.yamlnu�[���PK�|[��O��0o��ri/1.8/system/DRb/DRbUNIXSocket/parse_uri-c.yamlnu�[���PK�|[ư�8���ri/1.8/system/DRb/DRbUNIXSocket/cdesc-DRbUNIXSocket.yamlnu�[���PK�|[i�����2��ri/1.8/system/DRb/DRbUNIXSocket/open_server-c.yamlnu�[���PK�|[�Ņm��-4��ri/1.8/system/DRb/DRbUNIXSocket/accept-i.yamlnu�[���PK�|[w����,C��ri/1.8/system/DRb/DRbUNIXSocket/close-i.yamlnu�[���PK�|[Π���2O��ri/1.8/system/DRb/DRbUNIXSocket/temp_server-c.yamlnu�[���PK�|[����2n��ri/1.8/system/DRb/DRbUNIXSocket/set_sockopt-i.yamlnu�[���PK�|[L�����+���ri/1.8/system/DRb/DRbUNIXSocket/open-c.yamlnu�[���PK�|[<����%���ri/1.8/system/DRb/fetch_server-i.yamlnu�[���PK�|[#B9#�� ���ri/1.8/system/DRb/here%3f-i.yamlnu�[���PK�|[
�m��&���ri/1.8/system/DRb/regist_server-i.yamlnu�[���PK�|[�ԫ��+��ri/1.8/system/DRb/DRbRemoteError/new-c.yamlnu�[���PK�|[\S[M��:��ri/1.8/system/DRb/DRbRemoteError/cdesc-DRbRemoteError.yamlnu�[���PK�|[1�v��0L��ri/1.8/system/DRb/DRbProtocol/open_server-i.yamlnu�[���PK�|[�7Z88/���ri/1.8/system/DRb/DRbProtocol/uri_option-i.yamlnu�[���PK�|[��Oq��))��ri/1.8/system/DRb/DRbProtocol/open-i.yamlnu�[���PK�|[IV��1,��ri/1.8/system/DRb/DRbProtocol/add_protocol-i.yamlnu�[���PK�|[���MM4���ri/1.8/system/DRb/DRbProtocol/cdesc-DRbProtocol.yamlnu�[���PK�|[�:��P�ri/1.8/system/DRb/config-i.yamlnu�[���PK�|[*�|/YYB0�ri/1.8/system/DRb/TimerIdConv/TimerHolder2/cdesc-TimerHolder2.yamlnu�[���PK�|[����8��ri/1.8/system/DRb/TimerIdConv/TimerHolder2/keeper-i.yamlnu�[���PK�|[�m���6"�ri/1.8/system/DRb/TimerIdConv/TimerHolder2/peek-i.yamlnu�[���PK�|[";���YE�ri/1.8/system/DRb/TimerIdConv/TimerHolder2/InvalidIndexError/cdesc-InvalidIndexError.yamlnu�[���PK�|[��\���5��ri/1.8/system/DRb/TimerIdConv/TimerHolder2/add-i.yamlnu�[���PK�|[8��I��<��ri/1.8/system/DRb/TimerIdConv/TimerHolder2/include%3f-i.yamlnu�[���PK�|[��Q��5�ri/1.8/system/DRb/TimerIdConv/TimerHolder2/new-c.yamlnu�[���PK�|[f�9���;<�ri/1.8/system/DRb/TimerIdConv/TimerHolder2/alternate-i.yamlnu�[���PK�|[�\���7l�ri/1.8/system/DRb/TimerIdConv/TimerHolder2/fetch-i.yamlnu�[���PK�|[�N%ڳ�+��ri/1.8/system/DRb/TimerIdConv/to_obj-i.yamlnu�[���PK�|[����(��ri/1.8/system/DRb/TimerIdConv/new-c.yamlnu�[���PK�|[s(��TT4��ri/1.8/system/DRb/TimerIdConv/cdesc-TimerIdConv.yamlnu�[���PK�|[�jқ��*s�ri/1.8/system/DRb/TimerIdConv/to_id-i.yamlnu�[���PK�|[�$n��~�ri/1.8/system/DRb/mutex-i.yamlnu�[���PK�|[��2/XXm�ri/1.8/system/DRb/thread-i.yamlnu�[���PK�|[6T���'�ri/1.8/system/DRb/current_server-i.yamlnu�[���PK�|[~�qq��ri/1.8/system/DRb/front-i.yamlnu�[���PK�|[��w�&&,��ri/1.8/system/DRb/DRbUnknownError/new-c.yamlnu�[���PK�|[m�n���<-�ri/1.8/system/DRb/DRbUnknownError/cdesc-DRbUnknownError.yamlnu�[���PK�|[��u��7x�ri/1.8/system/DRb/DRbObservable/notify_observers-i.yamlnu�[���PK�|[j��118��ri/1.8/system/DRb/DRbObservable/cdesc-DRbObservable.yamlnu�[���PK�|[��I��2B�ri/1.8/system/DRb/DRbMessage/cdesc-DRbMessage.yamlnu�[���PK�|[��8��.m��ri/1.8/system/DRb/DRbMessage/make_proxy-i.yamlnu�[���PK�|[�������ri/1.8/system/DRb/to_id-i.yamlnu�[���PK�|[�BT�BB(d��ri/1.8/system/DRb/install_id_conv-i.yamlnu�[���PK�|[�Q9���(���ri/1.8/system/DRb/GWIdConv/to_obj-i.yamlnu�[���PK�|[��i���.��ri/1.8/system/DRb/GWIdConv/cdesc-GWIdConv.yamlnu�[���PK�|[Ժz554W��ri/1.8/system/DRb/DRbUndumped/cdesc-DRbUndumped.yamlnu�[���PK�|[�l�#��"�ri/1.8/system/Matrix/eql%3f-i.yamlnu�[���PK�|[�c���ri/1.8/system/Matrix/tr-i.yamlnu�[���PK�|[�W[���@�ri/1.8/system/Matrix/t-i.yamlnu�[���PK�|[��x--"d�ri/1.8/system/Matrix/%5b%5d-i.yamlnu�[���PK�|[��L���$��ri/1.8/system/Matrix/row_size-i.yamlnu�[���PK�|['X̟�"!�ri/1.8/system/Matrix/%2a%2a-i.yamlnu�[���PK�|[]^N���'�ri/1.8/system/Matrix/determinant-i.yamlnu�[���PK�|[&�	Zxx"	�ri/1.8/system/Matrix/column-i.yamlnu�[���PK�|[�=����"�
�ri/1.8/system/Matrix/coerce-i.yamlnu�[���PK�|[z2&�ri/1.8/system/Matrix/regular%3f-i.yamlnu�[���PK�|[\�=� r
�ri/1.8/system/Matrix/to_a-i.yamlnu�[���PK�|[C�ҙnn��ri/1.8/system/Matrix/%2f-i.yamlnu�[���PK�|[��@��&��ri/1.8/system/Matrix/row_vector-c.yamlnu�[���PK�|[�AB__$a�ri/1.8/system/Matrix/identity-c.yamlnu�[���PK�|[y
��ll!�ri/1.8/system/Matrix/minor-i.yamlnu�[���PK�|[�e** ��ri/1.8/system/Matrix/rows-c.yamlnu�[���PK�|[�76y�� K�ri/1.8/system/Matrix/hash-i.yamlnu�[���PK�|[�70*��ri/1.8/system/Matrix/column_vectors-i.yamlnu�[���PK�|[v2�52��ri/1.8/system/Matrix/compare_by_row_vectors-i.yamlnu�[���PK�|[l����#x�ri/1.8/system/Matrix/collect-i.yamlnu�[���PK�|[=��BB&��ri/1.8/system/Matrix/cdesc-Matrix.yamlnu�[���PK�|[�Ӆ�LL;>�ri/1.8/system/Matrix/%2a-i.yamlnu�[���PK�|[�
23���?�ri/1.8/system/Matrix/det-i.yamlnu�[���PK�|[�᷑�"A�ri/1.8/system/Matrix/scalar-c.yamlnu�[���PK�|[w����-�B�ri/1.8/system/Matrix/Scalar/cdesc-Scalar.yamlnu�[���PK�|[b|K��%6D�ri/1.8/system/Matrix/transpose-i.yamlnu�[���PK�|[��{��#]F�ri/1.8/system/Matrix/inspect-i.yamlnu�[���PK�|[K�z��%�G�ri/1.8/system/Matrix/init_rows-i.yamlnu�[���PK�|[��2E;;%�H�ri/1.8/system/Matrix/square%3f-i.yamlnu�[���PK�|[D�΀�!1J�ri/1.8/system/Matrix/trace-i.yamlnu�[���PK�|[HĔ88L�ri/1.8/system/Matrix/new-c.yamlnu�[���PK�|[�-['�M�ri/1.8/system/Matrix/row_vectors-i.yamlnu�[���PK�|[�&`��(�N�ri/1.8/system/Matrix/inverse_from-i.yamlnu�[���PK�|[[�?���@P�ri/1.8/system/Matrix/inv-i.yamlnu�[���PK�|[�2t�'hQ�ri/1.8/system/Matrix/singular%3f-i.yamlnu�[���PK�|[W�~��#�R�ri/1.8/system/Matrix/inverse-i.yamlnu�[���PK�|[��F~��)�T�ri/1.8/system/Matrix/column_vector-c.yamlnu�[���PK�|[/��ݳ�'�V�ri/1.8/system/Matrix/column_size-i.yamlnu�[���PK�|[�ǥII�X�ri/1.8/system/Matrix/%2b-i.yamlnu�[���PK�|[eOgOO OZ�ri/1.8/system/Matrix/zero-c.yamlnu�[���PK�|[��j�� �[�ri/1.8/system/Matrix/rank-i.yamlnu�[���PK�|[L���oo#^�ri/1.8/system/Matrix/row-i.yamlnu�[���PK�|[�tg�� �_�ri/1.8/system/Matrix/to_s-i.yamlnu�[���PK�|[9����
a�ri/1.8/system/Matrix/map-i.yamlnu�[���PK�|[Oz��=="4b�ri/1.8/system/Matrix/%3d%3d-i.yamlnu�[���PK�|[���((!�c�ri/1.8/system/Matrix/clone-i.yamlnu�[���PK�|[�\���$<e�ri/1.8/system/Matrix/diagonal-c.yamlnu�[���PK�|[�07��#0g�ri/1.8/system/Matrix/columns-c.yamlnu�[���PK�|[{It�ee"i�ri/1.8/system/Matrix/%5b%5d-c.yamlnu�[���PK�|[y��0PP�j�ri/1.8/system/Matrix/%2d-i.yamlnu�[���PK�|[����!!-hl�ri/1.8/system/Delegator/method_missing-i.yamlnu�[���PK�|[�`¡DD)�m�ri/1.8/system/Delegator/__getobj__-i.yamlnu�[���PK�|[c�)9<<"�o�ri/1.8/system/Delegator/new-c.yamlnu�[���PK�|[t&�TT,q�ri/1.8/system/Delegator/respond_to%3f-i.yamlnu�[���PK�|[����+�r�ri/1.8/system/Delegator/marshal_load-i.yamlnu�[���PK�|[����II,+t�ri/1.8/system/Delegator/cdesc-Delegator.yamlnu�[���PK�|[�S��+�w�ri/1.8/system/Delegator/marshal_dump-i.yamlnu�[���PK�|[�}��(Ay�ri/1.8/system/UnboundMethod/arity-i.yamlnu�[���PK�|[D���4�~�ri/1.8/system/UnboundMethod/cdesc-UnboundMethod.yamlnu�[���PK�|[���>��*���ri/1.8/system/UnboundMethod/inspect-i.yamlnu�[���PK�|[Ox''(���ri/1.8/system/UnboundMethod/owner-i.yamlnu�[���PK�|[�@?8��'��ri/1.8/system/UnboundMethod/bind-i.yamlnu�[���PK�|[K���'8��ri/1.8/system/UnboundMethod/to_s-i.yamlnu�[���PK�|[9piMM)C��ri/1.8/system/UnboundMethod/%3d%3d-i.yamlnu�[���PK�|[�I���(�ri/1.8/system/UnboundMethod/clone-i.yamlnu�[���PK�|[�^��')��ri/1.8/system/UnboundMethod/name-i.yamlnu�[���PK�|[!�P�++���ri/1.8/system/Math/frexp-c.yamlnu�[���PK�|[�(�����ri/1.8/system/Math/rsqrt-i.yamlnu�[���PK�|['�3��ri/1.8/system/Math/tan-c.yamlnu�[���PK�|[�A$$U��ri/1.8/system/Math/tanh-c.yamlnu�[���PK�|[�5����Ǜ�ri/1.8/system/Math/ldexp-c.yamlnu�[���PK�|[*5�S���ri/1.8/system/Math/acos-c.yamlnu�[���PK�|[�I�����ri/1.8/system/Math/hypot-c.yamlnu�[���PK�|[�s�d
d
"��ri/1.8/system/Math/cdesc-Math.yamlnu�[���PK�|[��|���ri/1.8/system/Math/erfc-c.yamlnu�[���PK�|[�_���ri/1.8/system/Math/log-c.yamlnu�[���PK�|[��ݡ�{��ri/1.8/system/Math/sqrt-i.yamlnu�[���PK�|[T3�Z""j��ri/1.8/system/Math/sinh-c.yamlnu�[���PK�|[]�茡�ڰ�ri/1.8/system/Math/sinh-i.yamlnu�[���PK�|[��v1��ɱ�ri/1.8/system/Math/atan2-i.yamlnu�[���PK�|[�%"8�����ri/1.8/system/Math/asin-i.yamlnu�[���PK�|[iY������ri/1.8/system/Math/log10-i.yamlnu�[���PK�|[f���$$�ri/1.8/system/Math/cosh-c.yamlnu�[���PK�|[/�\��ri/1.8/system/Math/atanh-c.yamlnu�[���PK�|[&s;J��ķ�ri/1.8/system/Math/cosh-i.yamlnu�[���PK�|[g�0���ri/1.8/system/Math/acosh-c.yamlnu�[���PK�|[;!@f��ri/1.8/system/Math/asin-c.yamlnu�[���PK�|[_��/�����ri/1.8/system/Math/tan-i.yamlnu�[���PK�|[�<�������ri/1.8/system/Math/log-i.yamlnu�[���PK�|[=�"R�����ri/1.8/system/Math/atanh-i.yamlnu�[���PK�|[��uT���ri/1.8/system/Math/cos-i.yamlnu�[���PK�|[2���!��ri/1.8/system/Math/log10-c.yamlnu�[���PK�|[e=%%���ri/1.8/system/Math/cos-c.yamlnu�[���PK�|[r'������ri/1.8/system/Math/exp-c.yamlnu�[���PK�|[sac$4�ri/1.8/system/Math/asinh-c.yamlnu�[���PK�|[��,����ri/1.8/system/Math/tanh-i.yamlnu�[���PK�|[��r����ri/1.8/system/Math/acos-i.yamlnu�[���PK�|[b8���w�ri/1.8/system/Math/erf-c.yamlnu�[���PK�|[>�>����ri/1.8/system/Math/atan-i.yamlnu�[���PK�|[�6E����ri/1.8/system/Math/sin-i.yamlnu�[���PK�|[sf�z����ri/1.8/system/Math/acosh-i.yamlnu�[���PK�|[��?�����ri/1.8/system/Math/asinh-i.yamlnu�[���PK�|[�S\}��ri/1.8/system/Math/sqrt-c.yamlnu�[���PK�|[9�����:�ri/1.8/system/Math/exp-i.yamlnu�[���PK�|[�\��""r�ri/1.8/system/Math/atan-c.yamlnu�[���PK�|[?'�..��ri/1.8/system/Math/atan2-c.yamlnu�[���PK�|[�\	##_�ri/1.8/system/Math/sin-c.yamlnu�[���PK�|[Wbml4��ri/1.8/system/InvalidOption/cdesc-InvalidOption.yamlnu�[���PK�|[��Vt��(C�ri/1.8/system/URI/FTP/typecode%3d-i.yamlnu�[���PK�|[����!Q�ri/1.8/system/URI/FTP/path-i.yamlnu�[���PK�|[H5B::"_�ri/1.8/system/URI/FTP/build-c.yamlnu�[���PK�|[��z[�� ��ri/1.8/system/URI/FTP/new-c.yamlnu�[���PK�|[2��Ӻ�+�ri/1.8/system/URI/FTP/check_typecode-i.yamlnu�[���PK�|[%�����!%�ri/1.8/system/URI/FTP/new2-c.yamlnu�[���PK�|[l����)\�ri/1.8/system/URI/FTP/set_typecode-i.yamlnu�[���PK�|[v?PO��!m�ri/1.8/system/URI/FTP/to_s-i.yamlnu�[���PK�|[y 9��$b�ri/1.8/system/URI/FTP/cdesc-FTP.yamlnu�[���PK�|[��
m��(}�ri/1.8/system/URI/HTTPS/cdesc-HTTPS.yamlnu�[���PK�|[��I�� ��ri/1.8/system/URI/cdesc-URI.yamlnu�[���PK�|[bp=3���ri/1.8/system/URI/REGEXP/PATTERN/cdesc-PATTERN.yamlnu�[���PK�|[�P*��*���ri/1.8/system/URI/REGEXP/cdesc-REGEXP.yamlnu�[���PK�|["�`?��<��ri/1.8/system/URI/InvalidURIError/cdesc-InvalidURIError.yamlnu�[���PK�|[��W���(z��ri/1.8/system/URI/LDAPS/cdesc-LDAPS.yamlnu�[���PK�|[m�H���ri/1.8/system/URI/InvalidComponentError/cdesc-InvalidComponentError.yamlnu�[���PK�|[�Ӹ

(%��ri/1.8/system/URI/Error/cdesc-Error.yamlnu�[���PK�|[X�6�����ri/1.8/system/URI/parse-c.yamlnu�[���PK�|[���KKt�ri/1.8/system/URI/join-c.yamlnu�[���PK�|[>��f!!�ri/1.8/system/URI/split-c.yamlnu�[���PK�|[A�w��&{�ri/1.8/system/URI/Util/cdesc-Util.yamlnu�[���PK�|[�Bm��)��ri/1.8/system/URI/Generic/set_host-i.yamlnu�[���PK�|[�Y�)�
�ri/1.8/system/URI/Generic/route_to-i.yamlnu�[���PK�|[��  +��ri/1.8/system/URI/Generic/find_proxy-i.yamlnu�[���PK�|[jPz���-t�ri/1.8/system/URI/Generic/check_opaque-i.yamlnu�[���PK�|[%�^��'��ri/1.8/system/URI/Generic/eql%3f-i.yamlnu�[���PK�|[�\��/��ri/1.8/system/URI/Generic/check_fragment-i.yamlnu�[���PK�|[*���+��ri/1.8/system/URI/Generic/set_scheme-i.yamlnu�[���PK�|[႘���,��ri/1.8/system/URI/Generic/cdesc-Generic.yamlnu�[���PK�|[�L~%%&�,�ri/1.8/system/URI/Generic/merge-i.yamlnu�[���PK�|["��د�'i0�ri/1.8/system/URI/Generic/coerce-i.yamlnu�[���PK�|[tyu,UU'o1�ri/1.8/system/URI/Generic/select-i.yamlnu�[���PK�|[�K7s��+5�ri/1.8/system/URI/Generic/merge_path-i.yamlnu�[���PK�|[*�I���+46�ri/1.8/system/URI/Generic/path_query-i.yamlnu�[���PK�|[����(D7�ri/1.8/system/URI/Generic/port%3d-i.yamlnu�[���PK�|[�����-G8�ri/1.8/system/URI/Generic/set_registry-i.yamlnu�[���PK�|[��ĺ��-`9�ri/1.8/system/URI/Generic/default_port-c.yamlnu�[���PK�|[8s�5��,�:�ri/1.8/system/URI/Generic/registry%3d-i.yamlnu�[���PK�|[¿tį�*�;�ri/1.8/system/URI/Generic/opaque%3d-i.yamlnu�[���PK�|[��(6��-�<�ri/1.8/system/URI/Generic/set_fragment-i.yamlnu�[���PK�|[5��a��/�=�ri/1.8/system/URI/Generic/split_userinfo-i.yamlnu�[���PK�|[;��r��%�>�ri/1.8/system/URI/Generic/hash-i.yamlnu�[���PK�|[h$ud��(�?�ri/1.8/system/URI/Generic/user%3d-i.yamlnu�[���PK�|[��6��)A�ri/1.8/system/URI/Generic/set_port-i.yamlnu�[���PK�|[������)
B�ri/1.8/system/URI/Generic/query%3d-i.yamlnu�[���PK�|[��I��+C�ri/1.8/system/URI/Generic/check_path-i.yamlnu�[���PK�|[��߶�+$D�ri/1.8/system/URI/Generic/check_port-i.yamlnu�[���PK�|[�0�|'5E�ri/1.8/system/URI/Generic/merge0-i.yamlnu�[���PK�|[�����-�F�ri/1.8/system/URI/Generic/check_scheme-i.yamlnu�[���PK�|[m�R/��)�G�ri/1.8/system/URI/Generic/set_user-i.yamlnu�[���PK�|[4��R��&�H�ri/1.8/system/URI/Generic/build-c.yamlnu�[���PK�|[<��Ǽ�-�K�ri/1.8/system/URI/Generic/set_password-i.yamlnu�[���PK�|[i(�!��*�L�ri/1.8/system/URI/Generic/normalize-i.yamlnu�[���PK�|[��{���*N�ri/1.8/system/URI/Generic/component-c.yamlnu�[���PK�|[�Z��0`O�ri/1.8/system/URI/Generic/route_from_path-i.yamlnu�[���PK�|[�����(�P�ri/1.8/system/URI/Generic/inspect-i.yamlnu�[���PK�|[�(��(�Q�ri/1.8/system/URI/Generic/host%3d-i.yamlnu�[���PK�|[FR�##,�R�ri/1.8/system/URI/Generic/absolute%3f-i.yamlnu�[���PK�|[�/Y}��/T�ri/1.8/system/URI/Generic/check_registry-i.yamlnu�[���PK�|[7�\Y��/,U�ri/1.8/system/URI/Generic/check_password-i.yamlnu�[���PK�|[}ܡ���.WV�ri/1.8/system/URI/Generic/component_ary-i.yamlnu�[���PK�|[:׽���0rW�ri/1.8/system/URI/Generic/escape_userpass-i.yamlnu�[���PK�|[�۪ҫ�(�X�ri/1.8/system/URI/Generic/path%3d-i.yamlnu�[���PK�|[ʕ���$�Y�ri/1.8/system/URI/Generic/new-c.yamlnu�[���PK�|[�/%��-z_�ri/1.8/system/URI/Generic/set_userinfo-i.yamlnu�[���PK�|[!c���-�`�ri/1.8/system/URI/Generic/use_registry-c.yamlnu�[���PK�|[
vﺶ�*�a�ri/1.8/system/URI/Generic/set_query-i.yamlnu�[���PK�|[�{���0�b�ri/1.8/system/URI/Generic/hierarchical%3f-i.yamlnu�[���PK�|[r�f���/Td�ri/1.8/system/URI/Generic/check_userinfo-i.yamlnu�[���PK�|[�?jB��+�e�ri/1.8/system/URI/Generic/set_opaque-i.yamlnu�[���PK�|[�T8{��)�f�ri/1.8/system/URI/Generic/set_path-i.yamlnu�[���PK�|[)!�6��$�g�ri/1.8/system/URI/Generic/%2b-i.yamlnu�[���PK�|[��>>'�h�ri/1.8/system/URI/Generic/build2-c.yamlnu�[���PK�|[d��)ik�ri/1.8/system/URI/Generic/merge%21-i.yamlnu�[���PK�|[}VT]��-�n�ri/1.8/system/URI/Generic/default_port-i.yamlnu�[���PK�|[����-�o�ri/1.8/system/URI/Generic/normalize%21-i.yamlnu�[���PK�|[�����+Eq�ri/1.8/system/URI/Generic/replace%21-i.yamlnu�[���PK�|[E�7'��%�r�ri/1.8/system/URI/Generic/to_s-i.yamlnu�[���PK�|['�D���'�s�ri/1.8/system/URI/Generic/%3d%3d-i.yamlnu�[���PK�|[������,	u�ri/1.8/system/URI/Generic/route_from0-i.yamlnu�[���PK�|[��=��+v�ri/1.8/system/URI/Generic/split_path-i.yamlnu�[���PK�|[cu���+3w�ri/1.8/system/URI/Generic/check_host-i.yamlnu�[���PK�|[�����*Dx�ri/1.8/system/URI/Generic/component-i.yamlnu�[���PK�|[*<�1��,Py�ri/1.8/system/URI/Generic/password%3d-i.yamlnu�[���PK�|[U�A��,fz�ri/1.8/system/URI/Generic/fragment%3d-i.yamlnu�[���PK�|[C�8�;;+u{�ri/1.8/system/URI/Generic/route_from-i.yamlnu�[���PK�|[R��V��%�ri/1.8/system/URI/Generic/user-i.yamlnu�[���PK�|[�rQ��)��ri/1.8/system/URI/Generic/userinfo-i.yamlnu�[���PK�|[��e#��)��ri/1.8/system/URI/Generic/absolute-i.yamlnu�[���PK�|[�%�N��*U��ri/1.8/system/URI/Generic/scheme%3d-i.yamlnu�[���PK�|[~M߰�)^��ri/1.8/system/URI/Generic/password-i.yamlnu�[���PK�|[ܺ�,g��ri/1.8/system/URI/Generic/userinfo%3d-i.yamlnu�[���PK�|[=����+ԅ�ri/1.8/system/URI/Generic/check_user-i.yamlnu�[���PK�|[��Վ��$�ri/1.8/system/URI/Generic/%2d-i.yamlnu�[���PK�|[�	i��,��ri/1.8/system/URI/Generic/check_query-i.yamlnu�[���PK�|[xQb��,0��ri/1.8/system/URI/Generic/relative%3f-i.yamlnu�[���PK�|[��=�� |��ri/1.8/system/URI/extract-c.yamlnu�[���PK�|[^���4��ri/1.8/system/URI/BadURIError/cdesc-BadURIError.yamlnu�[���PK�|[sh���+�ri/1.8/system/URI/LDAP/extensions%3d-i.yamlnu�[���PK�|[�6��&���ri/1.8/system/URI/LDAP/parse_dn-i.yamlnu�[���PK�|[�T�Ԯ�'��ri/1.8/system/URI/LDAP/filter%3d-i.yamlnu�[���PK�|[t؄��#��ri/1.8/system/URI/LDAP/scope-i.yamlnu�[���PK�|[��<��$��ri/1.8/system/URI/LDAP/filter-i.yamlnu�[���PK�|[O5
`��(���ri/1.8/system/URI/LDAP/set_filter-i.yamlnu�[���PK�|[�x%���&��ri/1.8/system/URI/LDAP/scope%3d-i.yamlnu�[���PK�|[n`���#��ri/1.8/system/URI/LDAP/build-c.yamlnu�[���PK�|[Sgwצ�#��ri/1.8/system/URI/LDAP/dn%3d-i.yamlnu�[���PK�|[m2B-��,��ri/1.8/system/URI/LDAP/set_extensions-i.yamlnu�[���PK�|[����NN&"��ri/1.8/system/URI/LDAP/cdesc-LDAP.yamlnu�[���PK�|[�qD���.Ƣ�ri/1.8/system/URI/LDAP/build_path_query-i.yamlnu�[���PK�|[+Ӳm��!�ri/1.8/system/URI/LDAP/new-c.yamlnu�[���PK�|[өr���(ڤ�ri/1.8/system/URI/LDAP/attributes-i.yamlnu�[���PK�|[GR�r��-�ri/1.8/system/URI/LDAP/hierarchical%3f-i.yamlnu�[���PK�|[��*��(���ri/1.8/system/URI/LDAP/extensions-i.yamlnu�[���PK�|[�t��)��ri/1.8/system/URI/LDAP/parse_query-i.yamlnu�[���PK�|[�����'
��ri/1.8/system/URI/LDAP/set_scope-i.yamlnu�[���PK�|[5d7G�� ��ri/1.8/system/URI/LDAP/dn-i.yamlnu�[���PK�|[P�띿�,
��ri/1.8/system/URI/LDAP/set_attributes-i.yamlnu�[���PK�|[�侫��+%��ri/1.8/system/URI/LDAP/attributes%3d-i.yamlnu�[���PK�|[&8ï�$6��ri/1.8/system/URI/LDAP/set_dn-i.yamlnu�[���PK�|[�>˗��9��ri/1.8/system/URI/regexp-c.yamlnu�[���PK�|[7L���&c��ri/1.8/system/URI/Escape/encode-i.yamlnu�[���PK�|[���\\(���ri/1.8/system/URI/Escape/unescape-i.yamlnu�[���PK�|[/���PP&d��ri/1.8/system/URI/Escape/escape-i.yamlnu�[���PK�|[�����&
��ri/1.8/system/URI/Escape/decode-i.yamlnu�[���PK�|[��?_��*H��ri/1.8/system/URI/Escape/cdesc-Escape.yamlnu�[���PK�|[�nƴ��)L��ri/1.8/system/URI/HTTP/request_uri-i.yamlnu�[���PK�|[�i	���#��ri/1.8/system/URI/HTTP/build-c.yamlnu�[���PK�|[����JJ!��ri/1.8/system/URI/HTTP/new-c.yamlnu�[���PK�|[�����&A�ri/1.8/system/URI/HTTP/cdesc-HTTP.yamlnu�[���PK�|[��#��+��ri/1.8/system/URI/MailTo/set_headers-i.yamlnu�[���PK�|[G�E+��&��ri/1.8/system/URI/MailTo/set_to-i.yamlnu�[���PK�|[�9!���%��ri/1.8/system/URI/MailTo/build-c.yamlnu�[���PK�|[Y0����%��ri/1.8/system/URI/MailTo/to%3d-i.yamlnu�[���PK�|[Qje���#��ri/1.8/system/URI/MailTo/new-c.yamlnu�[���PK�|['<����*��ri/1.8/system/URI/MailTo/headers%3d-i.yamlnu�[���PK�|[�ZZ��-��ri/1.8/system/URI/MailTo/to_rfc822text-i.yamlnu�[���PK�|[6����+�ri/1.8/system/URI/MailTo/to_mailtext-i.yamlnu�[���PK�|[h��{��$��ri/1.8/system/URI/MailTo/to_s-i.yamlnu�[���PK�|[2���(��ri/1.8/system/URI/MailTo/check_to-i.yamlnu�[���PK�|[�^����-�ri/1.8/system/URI/MailTo/check_headers-i.yamlnu�[���PK�|[ċ'�==*�ri/1.8/system/URI/MailTo/cdesc-MailTo.yamlnu�[���PK�|[	��q��2��ri/1.8/system/RuntimeError/cdesc-RuntimeError.yamlnu�[���PK�|[ϋ��+��ri/1.8/system/Arguable/extend_object-c.yamlnu�[���PK�|[����NN(��ri/1.8/system/Arguable/permute%21-i.yamlnu�[���PK�|[m���*��ri/1.8/system/Arguable/cdesc-Arguable.yamlnu�[���PK�|[��Y66&��ri/1.8/system/Arguable/parse%21-i.yamlnu�[���PK�|[�:?���(�ri/1.8/system/Arguable/options%3d-i.yamlnu�[���PK�|[��8B��!A��ri/1.8/system/Arguable/new-c.yamlnu�[���PK�|[���%9��ri/1.8/system/Arguable/getopts-i.yamlnu�[���PK�|[%-ή77%���ri/1.8/system/Arguable/options-i.yamlnu�[���PK�|[�q��CC&)��ri/1.8/system/Arguable/order%21-i.yamlnu�[���PK�|[��66'��ri/1.8/system/NoMethodError/args-i.yamlnu�[���PK�|[�=����4O��ri/1.8/system/NoMethodError/cdesc-NoMethodError.yamlnu�[���PK�|[��3���&��ri/1.8/system/NoMethodError/new-c.yamlnu�[���PK�|[r�:zz,��ri/1.8/system/LoadError/cdesc-LoadError.yamlnu�[���PK�|[��̞		.��ri/1.8/system/OpenStruct/cdesc-OpenStruct.yamlnu�[���PK�|[;Bd�??'
�ri/1.8/system/OpenStruct/inspect-i.yamlnu�[���PK�|[��q,��ri/1.8/system/OpenStruct/delete_field-i.yamlnu�[���PK�|[�˾��#�ri/1.8/system/OpenStruct/new-c.yamlnu�[���PK�|[�
%H��,#�ri/1.8/system/OpenStruct/marshal_load-i.yamlnu�[���PK�|[���/6�ri/1.8/system/OpenStruct/initialize_copy-i.yamlnu�[���PK�|[��o���2��ri/1.8/system/OpenStruct/new_ostruct_member-i.yamlnu�[���PK�|[f����,��ri/1.8/system/OpenStruct/marshal_dump-i.yamlnu�[���PK�|[}���$��ri/1.8/system/OpenStruct/to_s-i.yamlnu�[���PK�|[I�&�ri/1.8/system/OpenStruct/%3d%3d-i.yamlnu�[���PK�|[��S��*d�ri/1.8/system/OpenStruct/modifiable-i.yamlnu�[���PK�|[����$s�ri/1.8/system/RubyToken/Token-i.yamlnu�[���PK�|[�����>��ri/1.8/system/RubyToken/TkUnknownChar/cdesc-TkUnknownChar.yamlnu�[���PK�|[!f����0��ri/1.8/system/RubyToken/TkUnknownChar/new-c.yamlnu�[���PK�|[7��ii0� �ri/1.8/system/RubyToken/TkNode/cdesc-TkNode.yamlnu�[���PK�|[���>��)�"�ri/1.8/system/RubyToken/TkNode/new-c.yamlnu�[���PK�|[n;���,�#�ri/1.8/system/RubyToken/TkId/cdesc-TkId.yamlnu�[���PK�|[�V��'�%�ri/1.8/system/RubyToken/TkId/new-c.yamlnu�[���PK�|[Hs����2�&�ri/1.8/system/RubyToken/TkError/cdesc-TkError.yamlnu�[���PK�|[��L((,�'�ri/1.8/system/RubyToken/TkOp/cdesc-TkOp.yamlnu�[���PK�|[3�̫�(L)�ri/1.8/system/RubyToken/TkOp/name-i.yamlnu�[���PK�|[n�=��(O*�ri/1.8/system/RubyToken/def_token-c.yamlnu�[���PK�|[�-���4�+�ri/1.8/system/RubyToken/TkOPASGN/cdesc-TkOPASGN.yamlnu�[���PK�|[�P>���+�-�ri/1.8/system/RubyToken/TkOPASGN/new-c.yamlnu�[���PK�|[+��&��1�.�ri/1.8/system/RubyToken/set_token_position-i.yamlnu�[���PK�|[_u����,�/�ri/1.8/system/RubyToken/TkKW/cdesc-TkKW.yamlnu�[���PK�|[6��#0#0,�0�ri/1.8/system/RubyToken/cdesc-RubyToken.yamlnu�[���PK�|[S;����(ca�ri/1.8/system/RubyToken/TkVal/new-c.yamlnu�[���PK�|[GD�WW.�b�ri/1.8/system/RubyToken/TkVal/cdesc-TkVal.yamlnu�[���PK�|[�{��\\.7d�ri/1.8/system/RubyToken/Token/cdesc-Token.yamlnu�[���PK�|[y�*���(�g�ri/1.8/system/RubyToken/Token/new-c.yamlnu�[���PK�|[�u��KK-i�ri/1.8/system/RubyToken/Token/set_text-i.yamlnu�[���PK�|[KFz��#�j�ri/1.8/system/Numeric/%2b%40-i.yamlnu�[���PK�|[�t8��#�k�ri/1.8/system/Numeric/eql%3f-i.yamlnu�[���PK�|[�ŰKK!4n�ri/1.8/system/Numeric/fdiv-i.yamlnu�[���PK�|[���]]'�o�ri/1.8/system/Numeric/integer%3f-i.yamlnu�[���PK�|[Nm�--&�q�ri/1.8/system/Numeric/%3c%3d%3e-i.yamlnu�[���PK�|[�d̐#s�ri/1.8/system/Numeric/coerce-i.yamlnu�[���PK�|[)�/$$#rv�ri/1.8/system/Numeric/divmod-i.yamlnu�[���PK�|[�i��II �~�ri/1.8/system/Numeric/quo-i.yamlnu�[���PK�|[L��� ���ri/1.8/system/Numeric/abs-i.yamlnu�[���PK�|[�^@&��"h��ri/1.8/system/Numeric/angle-i.yamlnu�[���PK�|[�)�TT&���ri/1.8/system/Numeric/remainder-i.yamlnu�[���PK�|[v��p66!>��ri/1.8/system/Numeric/ceil-i.yamlnu�[���PK�|[��=o��'ň�ri/1.8/system/Numeric/nonzero%3f-i.yamlnu�[���PK�|[�<��66!ދ�ri/1.8/system/Numeric/step-i.yamlnu�[���PK�|[ޠ�oJJ3e��ri/1.8/system/Numeric/singleton_method_added-i.yamlnu�[���PK�|[Cc�!!$��ri/1.8/system/Numeric/zero%3f-i.yamlnu�[���PK�|[+�B�����ri/1.8/system/Numeric/im-i.yamlnu�[���PK�|[J
��%�ri/1.8/system/Numeric/truncate-i.yamlnu�[���PK�|[">�<<#���ri/1.8/system/Numeric/to_int-i.yamlnu�[���PK�|[�L]���"6��ri/1.8/system/Numeric/polar-i.yamlnu�[���PK�|[`<e��(d��ri/1.8/system/Numeric/cdesc-Numeric.yamlnu�[���PK�|[vH0���!T��ri/1.8/system/Numeric/conj-i.yamlnu�[���PK�|[�%�!!"���ri/1.8/system/Numeric/image-i.yamlnu�[���PK�|[�����!���ri/1.8/system/Numeric/imag-i.yamlnu�[���PK�|[������!!��ri/1.8/system/Numeric/real-i.yamlnu�[���PK�|[���

#p��ri/1.8/system/Numeric/%2d%40-i.yamlnu�[���PK�|[�H��� �ri/1.8/system/Numeric/div-i.yamlnu�[���PK�|[�K�||"���ri/1.8/system/Numeric/round-i.yamlnu�[���PK�|[t�o88&w��ri/1.8/system/Numeric/conjugate-i.yamlnu�[���PK�|[�j�i��"��ri/1.8/system/Numeric/floor-i.yamlnu�[���PK�|[�XI��� R��ri/1.8/system/Numeric/arg-i.yamlnu�[���PK�|[]�X199#���ri/1.8/system/Numeric/modulo-i.yamlnu�[���PK�|[�b�@++$-��ri/1.8/system/Process/setpgrp-c.yamlnu�[���PK�|[}�2��$���ri/1.8/system/Process/exit%21-c.yamlnu�[���PK�|[O���

#���ri/1.8/system/Process/gid%3d-c.yamlnu�[���PK�|[�h�__(��ri/1.8/system/Process/getpriority-c.yamlnu�[���PK�|[�}��$���ri/1.8/system/Process/getpgid-c.yamlnu�[���PK�|[>�����&���ri/1.8/system/Process/maxgroups-c.yamlnu�[���PK�|[j ����"���ri/1.8/system/Process/abort-c.yamlnu�[���PK�|[�E���!w��ri/1.8/system/Process/kill-c.yamlnu�[���PK�|[x�����"��ri/1.8/system/Process/times-c.yamlnu�[���PK�|[8��	�	�	&��ri/1.8/system/Process/setrlimit-c.yamlnu�[���PK�|[^Q��]](��ri/1.8/system/Process/setpriority-c.yamlnu�[���PK�|[�e��JJ)g�ri/1.8/system/Process/maxgroups%3d-c.yamlnu�[���PK�|[z�j��!
�ri/1.8/system/Process/wait-c.yamlnu�[���PK�|[�p���!
�ri/1.8/system/Process/euid-c.yamlnu�[���PK�|[��h?��!�ri/1.8/system/Process/egid-c.yamlnu�[���PK�|[��V ��$�ri/1.8/system/Process/getpgrp-c.yamlnu�[���PK�|[�-�D��#"�ri/1.8/system/Process/detach-c.yamlnu�[���PK�|[��hee!�ri/1.8/system/Process/exit-c.yamlnu�[���PK�|[r���;;$��ri/1.8/system/Process/egid%3d-c.yamlnu�[���PK�|[2�g��!]�ri/1.8/system/Process/exec-c.yamlnu�[���PK�|[MێZ�� ���ri/1.8/system/Process/gid-c.yamlnu�[���PK�|[Ni�EE'}��ri/1.8/system/Process/initgroups-c.yamlnu�[���PK�|[.�q(��#��ri/1.8/system/Process/setsid-c.yamlnu�[���PK�|[�"�&5�ri/1.8/system/Process/groups%3d-c.yamlnu�[���PK�|[��88#��ri/1.8/system/Process/uid%3d-c.yamlnu�[���PK�|[�'g.nn$.�ri/1.8/system/Process/setpgid-c.yamlnu�[���PK�|[�h"��ri/1.8/system/Process/wait2-c.yamlnu�[���PK�|[:�Z''(F
�ri/1.8/system/Process/Status/to_i-i.yamlnu�[���PK�|[4�����.��ri/1.8/system/Process/Status/stopped%3f-i.yamlnu�[���PK�|[8�A�NN/��ri/1.8/system/Process/Status/signaled%3f-i.yamlnu�[���PK�|[H���'_�ri/1.8/system/Process/Status/%26-i.yamlnu�[���PK�|[ةL1tt-��ri/1.8/system/Process/Status/exited%3f-i.yamlnu�[���PK�|[֊�ì�'s�ri/1.8/system/Process/Status/pid-i.yamlnu�[���PK�|[>��6��.v�ri/1.8/system/Process/Status/exitstatus-i.yamlnu�[���PK�|[~�Π�.��ri/1.8/system/Process/Status/cdesc-Status.yamlnu�[���PK�|[fc�K+�"�ri/1.8/system/Process/Status/inspect-i.yamlnu�[���PK�|[�E��mm/$�ri/1.8/system/Process/Status/coredump%3f-i.yamlnu�[���PK�|[
(���*�%�ri/1.8/system/Process/Status/%3e%3e-i.yamlnu�[���PK�|[�¹>++*(�ri/1.8/system/Process/Status/to_int-i.yamlnu�[���PK�|[�)3֋�.�*�ri/1.8/system/Process/Status/success%3f-i.yamlnu�[���PK�|[���(v,�ri/1.8/system/Process/Status/to_s-i.yamlnu�[���PK�|[�jXYAA*�-�ri/1.8/system/Process/Status/%3d%3d-i.yamlnu�[���PK�|[~[C���+�/�ri/1.8/system/Process/Status/termsig-i.yamlnu�[���PK�|[\�D�dd+^1�ri/1.8/system/Process/Status/stopsig-i.yamlnu�[���PK�|[$�6Ÿ�$3�ri/1.8/system/Process/waitpid-c.yamlnu�[���PK�|[{�z..$)<�ri/1.8/system/Process/euid%3d-c.yamlnu�[���PK�|[rm��aa!�=�ri/1.8/system/Process/ppid-c.yamlnu�[���PK�|[�nn$]@�ri/1.8/system/Process/waitall-c.yamlnu�[���PK�|[�a�F

%D�ri/1.8/system/Process/waitpid2-c.yamlnu�[���PK�|[Ʒ)ff(~G�ri/1.8/system/Process/cdesc-Process.yamlnu�[���PK�|[�9�s..!<W�ri/1.8/system/Process/fork-c.yamlnu�[���PK�|[�?Kn��$�[�ri/1.8/system/Process/GID/eid-c.yamlnu�[���PK�|[��ʥ�$�]�ri/1.8/system/Process/GID/rid-c.yamlnu�[���PK�|[����::'�_�ri/1.8/system/Process/GID/switch-c.yamlnu�[���PK�|[G�t���0bb�ri/1.8/system/Process/GID/grant_privilege-c.yamlnu�[���PK�|[�����1�e�ri/1.8/system/Process/GID/change_privilege-c.yamlnu�[���PK�|[@٦�%%,mh�ri/1.8/system/Process/GID/re_exchange-c.yamlnu�[���PK�|[4�==(�j�ri/1.8/system/Process/GID/cdesc-GID.yamlnu�[���PK�|[В��aa1�n�ri/1.8/system/Process/GID/sid_available%3f-c.yamlnu�[���PK�|[�%d��3Ep�ri/1.8/system/Process/GID/re_exchangeable%3f-c.yamlnu�[���PK�|[��a��� 0r�ri/1.8/system/Process/uid-c.yamlnu�[���PK�|[�<��\\(t�ri/1.8/system/Process/Sys/setruid-c.yamlnu�[���PK�|[�eb��(�u�ri/1.8/system/Process/Sys/geteuid-c.yamlnu�[���PK�|[��9��*�w�ri/1.8/system/Process/Sys/setresuid-c.yamlnu�[���PK�|["ՄCTT'1z�ri/1.8/system/Process/Sys/setuid-c.yamlnu�[���PK�|[5ȓUU'�{�ri/1.8/system/Process/Sys/setgid-c.yamlnu�[���PK�|[e%}�aa(�}�ri/1.8/system/Process/Sys/seteuid-c.yamlnu�[���PK�|[=!?���'A�ri/1.8/system/Process/Sys/getgid-c.yamlnu�[���PK�|[��ܩ�'C��ri/1.8/system/Process/Sys/getuid-c.yamlnu�[���PK�|[i�����(C��ri/1.8/system/Process/Sys/getegid-c.yamlnu�[���PK�|[�����)l��ri/1.8/system/Process/Sys/setregid-c.yamlnu�[���PK�|[�@m�  *���ri/1.8/system/Process/Sys/issetugid-c.yamlnu�[���PK�|[��X��*��ri/1.8/system/Process/Sys/setresgid-c.yamlnu�[���PK�|[�*J���(p��ri/1.8/system/Process/Sys/cdesc-Sys.yamlnu�[���PK�|[m���]](���ri/1.8/system/Process/Sys/setrgid-c.yamlnu�[���PK�|[uC
�bb(c��ri/1.8/system/Process/Sys/setegid-c.yamlnu�[���PK�|[
���)��ri/1.8/system/Process/Sys/setreuid-c.yamlnu�[���PK�|[`a�.pp R��ri/1.8/system/Process/pid-c.yamlnu�[���PK�|[�����#��ri/1.8/system/Process/groups-c.yamlnu�[���PK�|[fp�dd&��ri/1.8/system/Process/getrlimit-c.yamlnu�[���PK�|[��<<(���ri/1.8/system/Process/UID/cdesc-UID.yamlnu�[���PK�|['+�g��$T��ri/1.8/system/Process/UID/eid-c.yamlnu�[���PK�|[�����$S��ri/1.8/system/Process/UID/rid-c.yamlnu�[���PK�|[xP(77'J��ri/1.8/system/Process/UID/switch-c.yamlnu�[���PK�|[|��B��0ب�ri/1.8/system/Process/UID/grant_privilege-c.yamlnu�[���PK�|[��{c~~1���ri/1.8/system/Process/UID/change_privilege-c.yamlnu�[���PK�|[AA�l##,ܮ�ri/1.8/system/Process/UID/re_exchange-c.yamlnu�[���PK�|[��ж``1[��ri/1.8/system/Process/UID/sid_available%3f-c.yamlnu�[���PK�|[�D��3��ri/1.8/system/Process/UID/re_exchangeable%3f-c.yamlnu�[���PK�|[Db�$$6��ri/1.8/system/CSV/StringReader/cdesc-StringReader.yamlnu�[���PK�|[
n2���-���ri/1.8/system/CSV/StringReader/get_row-i.yamlnu�[���PK�|[�����)���ri/1.8/system/CSV/StringReader/new-c.yamlnu�[���PK�|[�(����#¸�ri/1.8/system/CSV/parse_body-c.yamlnu�[���PK�|[���"ѹ�ri/1.8/system/CSV/parse_row-c.yamlnu�[���PK�|[o����$)��ri/1.8/system/CSV/open_writer-c.yamlnu�[���PK�|[�]��"\��ri/1.8/system/CSV/Cell/data-i.yamlnu�[���PK�|[>h�@@&S�ri/1.8/system/CSV/Cell/cdesc-Cell.yamlnu�[���PK�|[*��ƽ�!��ri/1.8/system/CSV/Cell/new-c.yamlnu�[���PK�|[k(�#((&��ri/1.8/system/CSV/generate_line-c.yamlnu�[���PK�|[��
�� u�ri/1.8/system/CSV/foreach-c.yamlnu�[���PK�|[3����+��ri/1.8/system/CSV/generate_separator-c.yamlnu�[���PK�|[$��8��B��ri/1.8/system/CSV/IllegalFormatError/cdesc-IllegalFormatError.yamlnu�[���PK�|[Aя�MM��ri/1.8/system/CSV/parse-c.yamlnu�[���PK�|[��r�� ��ri/1.8/system/CSV/cdesc-CSV.yamlnu�[���PK�|[�ʦ���$��ri/1.8/system/CSV/Row/cdesc-Row.yamlnu�[���PK�|[R�4���.��ri/1.8/system/CSV/BasicWriter/terminate-i.yamlnu�[���PK�|[�$��aa4��ri/1.8/system/CSV/BasicWriter/cdesc-BasicWriter.yamlnu�[���PK�|["Zr�MM7��ri/1.8/system/CSV/BasicWriter/close_on_terminate-i.yamlnu�[���PK�|[���'��(f�ri/1.8/system/CSV/BasicWriter/new-c.yamlnu�[���PK�|[Y�w��$��ri/1.8/system/CSV/open_reader-c.yamlnu�[���PK�|[��ʿ���ri/1.8/system/CSV/read-c.yamlnu�[���PK�|[V:�+��"��ri/1.8/system/CSV/readlines-c.yamlnu�[���PK�|[�O��(��ri/1.8/system/CSV/IOBuf/terminate-i.yamlnu�[���PK�|[�X��#��ri/1.8/system/CSV/IOBuf/read-i.yamlnu�[���PK�|[�M����(��ri/1.8/system/CSV/IOBuf/cdesc-IOBuf.yamlnu�[���PK�|[�񶐥�"��ri/1.8/system/CSV/IOBuf/new-c.yamlnu�[���PK�|[��L��$��ri/1.8/system/CSV/IOBuf/close-i.yamlnu�[���PK�|[b۴R��)��ri/1.8/system/CSV/Writer/terminate-i.yamlnu�[���PK�|[ieB-��*��ri/1.8/system/CSV/Writer/cdesc-Writer.yamlnu�[���PK�|[�j�=��#��ri/1.8/system/CSV/Writer/new-c.yamlnu�[���PK�|[��j""&��ri/1.8/system/CSV/Writer/create-c.yamlnu�[���PK�|[�`Č;;&E�ri/1.8/system/CSV/Writer/%3c%3c-i.yamlnu�[���PK�|[ã����'��ri/1.8/system/CSV/Writer/add_row-i.yamlnu�[���PK�|[���uu(�ri/1.8/system/CSV/Writer/generate-c.yamlnu�[���PK�|[�ֳ��%��ri/1.8/system/CSV/Writer/close-i.yamlnu�[���PK�|[ҢYX��)��ri/1.8/system/CSV/Reader/terminate-i.yamlnu�[���PK�|[����$��ri/1.8/system/CSV/Reader/each-i.yamlnu�[���PK�|[>û���%��ri/1.8/system/CSV/Reader/parse-c.yamlnu�[���PK�|[�����*��ri/1.8/system/CSV/Reader/cdesc-Reader.yamlnu�[���PK�|[�J�3��'��ri/1.8/system/CSV/Reader/get_row-i.yamlnu�[���PK�|[S7;���#��ri/1.8/system/CSV/Reader/new-c.yamlnu�[���PK�|[Z�yF&��ri/1.8/system/CSV/Reader/create-c.yamlnu�[���PK�|[���M��%t��ri/1.8/system/CSV/Reader/close-i.yamlnu�[���PK�|[���i��%r��ri/1.8/system/CSV/Reader/shift-i.yamlnu�[���PK�|[�1���!p��ri/1.8/system/CSV/generate-c.yamlnu�[���PK�|[�\>/��+���ri/1.8/system/CSV/IOReader/terminate-i.yamlnu�[���PK�|[��rGG4���ri/1.8/system/CSV/IOReader/close_on_terminate-i.yamlnu�[���PK�|[��S��)Bri/1.8/system/CSV/IOReader/get_row-i.yamlnu�[���PK�|[�&���%Nri/1.8/system/CSV/IOReader/new-c.yamlnu�[���PK�|[����.`ri/1.8/system/CSV/IOReader/cdesc-IOReader.yamlnu�[���PK�|[�TzQQ)Kri/1.8/system/CSV/StreamBuf/%5b%5d-i.yamlnu�[���PK�|[�>G���,�ri/1.8/system/CSV/StreamBuf/terminate-i.yamlnu�[���PK�|[F����,ri/1.8/system/CSV/StreamBuf/is_eos%3f-i.yamlnu�[���PK�|[SxI

0	ri/1.8/system/CSV/StreamBuf/cdesc-StreamBuf.yamlnu�[���PK�|[��ڋ��'ri/1.8/system/CSV/StreamBuf/read-i.yamlnu�[���PK�|[!V����*�ri/1.8/system/CSV/StreamBuf/add_buf-i.yamlnu�[���PK�|[q!�ΐ�'�ri/1.8/system/CSV/StreamBuf/drop-i.yamlnu�[���PK�|[%K
��&�ri/1.8/system/CSV/StreamBuf/get-i.yamlnu�[���PK�|[J{�[NN&�ri/1.8/system/CSV/StreamBuf/new-c.yamlnu�[���PK�|[?����0iri/1.8/system/CSV/StreamBuf/idx_is_eos%3f-i.yamlnu�[���PK�|[;�v��*�ri/1.8/system/CSV/StreamBuf/rel_buf-i.yamlnu�[���PK�|[|Q����+�ri/1.8/system/CSV/StreamBuf/buf_size-i.yamlnu�[���PK�|[��y���&�ri/1.8/system/CSV/generate_body-c.yamlnu�[���PK�|[���y��%�ri/1.8/system/CSV/generate_row-c.yamlnu�[���PK�|[l�::#�%ri/1.8/system/CSV/parse_line-c.yamlnu�[���PK�|[ �&�"	"	;(ri/1.8/system/CSV/open-c.yamlnu�[���PK�|[4+��&�1ri/1.8/system/Tracer/trace_func-c.yamlnu�[���PK�|[q�K���2ri/1.8/system/Tracer/on-i.yamlnu�[���PK�|[�[���$�3ri/1.8/system/Tracer/get_line-i.yamlnu�[���PK�|[(;����.�4ri/1.8/system/Tracer/set_get_line_procs-i.yamlnu�[���PK�|[�ۯ���&�5ri/1.8/system/Tracer/add_filter-c.yamlnu�[���PK�|[7��k��)�6ri/1.8/system/Tracer/get_thread_no-i.yamlnu�[���PK�|[��{��&�7ri/1.8/system/Tracer/trace_func-i.yamlnu�[���PK�|[�Q����#9ri/1.8/system/Tracer/on-c.yamlnu�[���PK�|[rAD���:ri/1.8/system/Tracer/off-c.yamlnu�[���PK�|[Dvyb��&
;ri/1.8/system/Tracer/add_filter-i.yamlnu�[���PK�|[5L���<ri/1.8/system/Tracer/new-c.yamlnu�[���PK�|[;�^@��"=ri/1.8/system/Tracer/stdout-i.yamlnu�[���PK�|[e�/+��.>ri/1.8/system/Tracer/set_get_line_procs-c.yamlnu�[���PK�|[ڳ�y{{&/?ri/1.8/system/Tracer/cdesc-Tracer.yamlnu�[���PK�|[
)����Eri/1.8/system/Tracer/off-i.yamlnu�[���PK�|[���OO%�Eri/1.8/system/Options/title%3d-i.yamlnu�[���PK�|[�!�Npp*�Gri/1.8/system/Options/check_diagram-i.yamlnu�[���PK�|[Ku�X%%,_Iri/1.8/system/Options/setup_generator-i.yamlnu�[���PK�|[z/g�CC"�Jri/1.8/system/Options/parse-i.yamlnu�[���PK�|[H��"uLri/1.8/system/Options/error-i.yamlnu�[���PK�|[�v{��-pMri/1.8/system/Options/OptionList/usage-c.yamlnu�[���PK�|[VR ��-�Nri/1.8/system/Options/OptionList/error-c.yamlnu�[���PK�|[�IYE��/Pri/1.8/system/Options/OptionList/options-c.yamlnu�[���PK�|[�E��6%Qri/1.8/system/Options/OptionList/cdesc-OptionList.yamlnu�[���PK�|[��S��3kri/1.8/system/Options/OptionList/help_output-c.yamlnu�[���PK�|[�[q���4:lri/1.8/system/Options/OptionList/strip_output-c.yamlnu�[���PK�|[��(amri/1.8/system/Options/check_files-i.yamlnu�[���PK�|[�~]���(�nri/1.8/system/Options/cdesc-Options.yamlnu�[���PK�|[��ե�"րri/1.8/system/Options/title-i.yamlnu�[���PK�|[-$���"́ri/1.8/system/RegAnd/%3d%7e-i.yamlnu�[���PK�|[+������ri/1.8/system/RegAnd/new-c.yamlnu�[���PK�|[Qr��&��ri/1.8/system/RegAnd/cdesc-RegAnd.yamlnu�[���PK�|[�<\���>�ri/1.8/system/RSS/ITunesModelUtils/cdesc-ITunesModelUtils.yamlnu�[���PK�|[0Y)..EH�ri/1.8/system/RSS/ITunesModelUtils/def_elements_class_accessor-i.yamlnu�[���PK�|[�+Z��<�ri/1.8/system/RSS/ITunesModelUtils/def_class_accessor-i.yamlnu�[���PK�|[.�R�D<�ri/1.8/system/RSS/ITunesModelUtils/def_element_class_accessor-i.yamlnu�[���PK�|[�:����5ϋri/1.8/system/RSS/RootElementMixin/setup_maker-i.yamlnu�[���PK�|[h�_F��0��ri/1.8/system/RSS/RootElementMixin/to_xml-i.yamlnu�[���PK�|[g����1�ri/1.8/system/RSS/RootElementMixin/to_atom-i.yamlnu�[���PK�|[.ђ��1A�ri/1.8/system/RSS/RootElementMixin/xmldecl-i.yamlnu�[���PK�|[�܃	��9Z�ri/1.8/system/RSS/RootElementMixin/ns_declarations-i.yamlnu�[���PK�|[��M}��-��ri/1.8/system/RSS/RootElementMixin/new-c.yamlnu�[���PK�|[JG���1Βri/1.8/system/RSS/RootElementMixin/to_feed-i.yamlnu�[���PK�|[?����6�ri/1.8/system/RSS/RootElementMixin/maker_target-i.yamlnu�[���PK�|[�v���> �ri/1.8/system/RSS/RootElementMixin/cdesc-RootElementMixin.yamlnu�[���PK�|[�z��0�ri/1.8/system/RSS/RootElementMixin/to_rss-i.yamlnu�[���PK�|[��v��<:�ri/1.8/system/RSS/RootElementMixin/output_encoding%3d-i.yamlnu�[���PK�|[�y����;r�ri/1.8/system/RSS/RootElementMixin/same_feed_type%3f-i.yamlnu�[���PK�|[h׻�3��ri/1.8/system/RSS/RootElementMixin/feed_info-i.yamlnu�[���PK�|[���]��-ǟri/1.8/system/RSS/RootElementMixin/tag-i.yamlnu�[���PK�|[^�+FB�ri/1.8/system/RSS/TaxonomyTopicModel/cdesc-TaxonomyTopicModel.yamlnu�[���PK�|[�-����;e�ri/1.8/system/RSS/TaxonomyTopicModel/append_features-c.yamlnu�[���PK�|[��$��K��ri/1.8/system/RSS/TaxonomyTopicModel/TaxonomyTopic/cdesc-TaxonomyTopic.yamlnu�[���PK�|[���W��C��ri/1.8/system/RSS/TaxonomyTopicModel/TaxonomyTopic/full_name-i.yamlnu�[���PK�|[��P���=�ri/1.8/system/RSS/TaxonomyTopicModel/TaxonomyTopic/new-c.yamlnu�[���PK�|[��j��I�ri/1.8/system/RSS/TaxonomyTopicModel/TaxonomyTopic/required_prefix-c.yamlnu�[���PK�|[]�L��Fh�ri/1.8/system/RSS/TaxonomyTopicModel/TaxonomyTopic/maker_target-i.yamlnu�[���PK�|[Y�i/��F��ri/1.8/system/RSS/TaxonomyTopicModel/TaxonomyTopic/required_uri-c.yamlnu�[���PK�|[���� ��ri/1.8/system/RSS/cdesc-RSS.yamlnu�[���PK�|[������.Ҹri/1.8/system/RSS/REXMLListener/xmldecl-i.yamlnu�[���PK�|[F�mK��8�ri/1.8/system/RSS/REXMLListener/cdesc-REXMLListener.yamlnu�[���PK�|[B�+��D$�ri/1.8/system/RSS/REXMLListener/raise_for_undefined_entity%3f-c.yamlnu�[���PK�|[�1�K��,t�ri/1.8/system/RSS/TooMuchTagError/new-c.yamlnu�[���PK�|[��%��<��ri/1.8/system/RSS/TooMuchTagError/cdesc-TooMuchTagError.yamlnu�[���PK�|[�M�J��8u�ri/1.8/system/RSS/SetupMaker/setup_maker_elements-i.yamlnu�[���PK�|[.A���/��ri/1.8/system/RSS/SetupMaker/setup_maker-i.yamlnu�[���PK�|[�X��992��ri/1.8/system/RSS/SetupMaker/cdesc-SetupMaker.yamlnu�[���PK�|[������7g�ri/1.8/system/RSS/SetupMaker/setup_maker_element-i.yamlnu�[���PK�|[�۫��J��ri/1.8/system/RSS/SetupMaker/not_need_to_call_setup_maker_variables-i.yamlnu�[���PK�|[�����0�ri/1.8/system/RSS/SetupMaker/maker_target-i.yamlnu�[���PK�|[��	L��:)�ri/1.8/system/RSS/SetupMaker/setup_maker_attributes-i.yamlnu�[���PK�|[6`�=��9i�ri/1.8/system/RSS/SyndicationModel/append_features-c.yamlnu�[���PK�|[O
�>��ri/1.8/system/RSS/SyndicationModel/cdesc-SyndicationModel.yamlnu�[���PK�|[J�����B�ri/1.8/system/RSS/SyndicationModel/validate_sy_updatePeriod-i.yamlnu�[���PK�|[������Ai�ri/1.8/system/RSS/ITunesChannelModel/ITunesImage/full_name-i.yamlnu�[���PK�|[Γ=���;��ri/1.8/system/RSS/ITunesChannelModel/ITunesImage/new-c.yamlnu�[���PK�|[�os�PPG��ri/1.8/system/RSS/ITunesChannelModel/ITunesImage/cdesc-ITunesImage.yamlnu�[���PK�|[�,'��G��ri/1.8/system/RSS/ITunesChannelModel/ITunesImage/required_prefix-c.yamlnu�[���PK�|[T�/���D��ri/1.8/system/RSS/ITunesChannelModel/ITunesImage/maker_target-i.yamlnu�[���PK�|[E���N1�ri/1.8/system/RSS/ITunesChannelModel/ITunesImage/setup_maker_attributes-i.yamlnu�[���PK�|[�hu���D��ri/1.8/system/RSS/ITunesChannelModel/ITunesImage/required_uri-c.yamlnu�[���PK�|[��^��A��ri/1.8/system/RSS/ITunesChannelModel/ITunesOwner/full_name-i.yamlnu�[���PK�|[�7�MMG�ri/1.8/system/RSS/ITunesChannelModel/ITunesOwner/cdesc-ITunesOwner.yamlnu�[���PK�|[u��J��;��ri/1.8/system/RSS/ITunesChannelModel/ITunesOwner/new-c.yamlnu�[���PK�|[�
|��G
�ri/1.8/system/RSS/ITunesChannelModel/ITunesOwner/required_prefix-c.yamlnu�[���PK�|[FkN��KW�ri/1.8/system/RSS/ITunesChannelModel/ITunesOwner/setup_maker_element-i.yamlnu�[���PK�|[�#���D��ri/1.8/system/RSS/ITunesChannelModel/ITunesOwner/maker_target-i.yamlnu�[���PK�|[�g�/��D�ri/1.8/system/RSS/ITunesChannelModel/ITunesOwner/required_uri-c.yamlnu�[���PK�|[a4$"��;E�ri/1.8/system/RSS/ITunesChannelModel/append_features-c.yamlnu�[���PK�|[�:���O~�ri/1.8/system/RSS/ITunesChannelModel/ITunesCategory/setup_maker_elements-i.yamlnu�[���PK�|[����M��ri/1.8/system/RSS/ITunesChannelModel/ITunesCategory/cdesc-ITunesCategory.yamlnu�[���PK�|[�c����DF�ri/1.8/system/RSS/ITunesChannelModel/ITunesCategory/full_name-i.yamlnu�[���PK�|[m�����>��ri/1.8/system/RSS/ITunesChannelModel/ITunesCategory/new-c.yamlnu�[���PK�|[�0C���J��ri/1.8/system/RSS/ITunesChannelModel/ITunesCategory/required_prefix-c.yamlnu�[���PK�|[â���G�ri/1.8/system/RSS/ITunesChannelModel/ITunesCategory/maker_target-i.yamlnu�[���PK�|[�����Qc�ri/1.8/system/RSS/ITunesChannelModel/ITunesCategory/setup_maker_attributes-i.yamlnu�[���PK�|[�-���G��ri/1.8/system/RSS/ITunesChannelModel/ITunesCategory/required_uri-c.yamlnu�[���PK�|[Mf���B�ri/1.8/system/RSS/ITunesChannelModel/cdesc-ITunesChannelModel.yamlnu�[���PK�|[]iӿ77:n�ri/1.8/system/RSS/ImageItemModel/cdesc-ImageItemModel.yamlnu�[���PK�|[��u��7�ri/1.8/system/RSS/ImageItemModel/append_features-c.yamlnu�[���PK�|[��C���;@�ri/1.8/system/RSS/ImageItemModel/ImageItem/full_name-i.yamlnu�[���PK�|[ˈ�y��?o�ri/1.8/system/RSS/ImageItemModel/ImageItem/cdesc-ImageItem.yamlnu�[���PK�|[H��5a�ri/1.8/system/RSS/ImageItemModel/ImageItem/new-c.yamlnu�[���PK�|[���X��A��ri/1.8/system/RSS/ImageItemModel/ImageItem/required_prefix-c.yamlnu�[���PK�|[��<���>�ri/1.8/system/RSS/ImageItemModel/ImageItem/maker_target-i.yamlnu�[���PK�|[�-���Hri/1.8/system/RSS/ImageItemModel/ImageItem/setup_maker_attributes-i.yamlnu�[���PK�|[��p���>^ri/1.8/system/RSS/ImageItemModel/ImageItem/required_uri-c.yamlnu�[���PK�|[in��<�ri/1.8/system/RSS/ITunesItemModel/cdesc-ITunesItemModel.yamlnu�[���PK�|[ftAW��8�ri/1.8/system/RSS/ITunesItemModel/append_features-c.yamlnu�[���PK�|[7�����?�ri/1.8/system/RSS/ITunesItemModel/ITunesDuration/hour%3d-i.yamlnu�[���PK�|[yXW��A3ri/1.8/system/RSS/ITunesItemModel/ITunesDuration/full_name-i.yamlnu�[���PK�|[.A����Jnri/1.8/system/RSS/ITunesItemModel/ITunesDuration/cdesc-ITunesDuration.yamlnu�[���PK�|[�#i���A�
ri/1.8/system/RSS/ITunesItemModel/ITunesDuration/minute%3d-i.yamlnu�[���PK�|[A�
���=�ri/1.8/system/RSS/ITunesItemModel/ITunesDuration/parse-c.yamlnu�[���PK�|[\�=@ri/1.8/system/RSS/ITunesItemModel/ITunesDuration/value%3d-i.yamlnu�[���PK�|[��Q��B�ri/1.8/system/RSS/ITunesItemModel/ITunesDuration/content%3d-i.yamlnu�[���PK�|[�~�u��A�ri/1.8/system/RSS/ITunesItemModel/ITunesDuration/construct-c.yamlnu�[���PK�|[ЌX]��A<ri/1.8/system/RSS/ITunesItemModel/ITunesDuration/second%3d-i.yamlnu�[���PK�|[i�b��Fyri/1.8/system/RSS/ITunesItemModel/ITunesDuration/update_content-i.yamlnu�[���PK�|[�k&���;�ri/1.8/system/RSS/ITunesItemModel/ITunesDuration/new-c.yamlnu�[���PK�|[ �H/��G�ri/1.8/system/RSS/ITunesItemModel/ITunesDuration/required_prefix-c.yamlnu�[���PK�|[F��i��K?ri/1.8/system/RSS/ITunesItemModel/ITunesDuration/setup_maker_element-i.yamlnu�[���PK�|[��A5��D�ri/1.8/system/RSS/ITunesItemModel/ITunesDuration/maker_target-i.yamlnu�[���PK�|[
I��D�ri/1.8/system/RSS/ITunesItemModel/ITunesDuration/required_uri-c.yamlnu�[���PK�|[uE���10ri/1.8/system/RSS/XMLStyleSheet/guess_type-i.yamlnu�[���PK�|[d��
��2Tri/1.8/system/RSS/XMLStyleSheet/setup_maker-i.yamlnu�[���PK�|[+PV��.wri/1.8/system/RSS/XMLStyleSheet/href%3d-i.yamlnu�[���PK�|[�L���*� ri/1.8/system/RSS/XMLStyleSheet/new-c.yamlnu�[���PK�|[������+�!ri/1.8/system/RSS/XMLStyleSheet/to_s-i.yamlnu�[���PK�|[���cc8�"ri/1.8/system/RSS/XMLStyleSheet/cdesc-XMLStyleSheet.yamlnu�[���PK�|[��A��3j&ri/1.8/system/RSS/XMLStyleSheet/alternate%3d-i.yamlnu�[���PK�|[T:fـ�<�'ri/1.8/system/RSS/MissingTagError/cdesc-MissingTagError.yamlnu�[���PK�|[i��,x)ri/1.8/system/RSS/MissingTagError/new-c.yamlnu�[���PK�|[��*���7�*ri/1.8/system/RSS/REXMLLikeXMLParser/listener%3d-i.yamlnu�[���PK�|[n�X2��6�+ri/1.8/system/RSS/REXMLLikeXMLParser/endElement-i.yamlnu�[���PK�|[g�����5�,ri/1.8/system/RSS/REXMLLikeXMLParser/character-i.yamlnu�[���PK�|[`�H���A.ri/1.8/system/RSS/REXMLLikeXMLParser/processingInstruction-i.yamlnu�[���PK�|[�����3]/ri/1.8/system/RSS/REXMLLikeXMLParser/xmlDecl-i.yamlnu�[���PK�|[[��1��8�0ri/1.8/system/RSS/REXMLLikeXMLParser/startElement-i.yamlnu�[���PK�|[���__B�1ri/1.8/system/RSS/REXMLLikeXMLParser/cdesc-REXMLLikeXMLParser.yamlnu�[���PK�|[��n���<�4ri/1.8/system/RSS/BaseDublinCoreModel/append_features-i.yamlnu�[���PK�|[�G3		D�5ri/1.8/system/RSS/BaseDublinCoreModel/cdesc-BaseDublinCoreModel.yamlnu�[���PK�|[g����6U7ri/1.8/system/RSS/BaseModel/convert_attr_reader-i.yamlnu�[���PK�|[6�D��2�8ri/1.8/system/RSS/BaseModel/csv_attr_reader-i.yamlnu�[���PK�|[�D���.�9ri/1.8/system/RSS/BaseModel/date_writer-i.yamlnu�[���PK�|[����3�:ri/1.8/system/RSS/BaseModel/yes_other_writer-i.yamlnu�[���PK�|[m�����><ri/1.8/system/RSS/BaseModel/inherit_convert_attr_reader-i.yamlnu�[���PK�|[�,����0k=ri/1.8/system/RSS/BaseModel/cdesc-BaseModel.yamlnu�[���PK�|[,z���5TDri/1.8/system/RSS/BaseModel/csv_integer_writer-i.yamlnu�[���PK�|[u(���8�Eri/1.8/system/RSS/BaseModel/def_children_accessor-i.yamlnu�[���PK�|[�f3���>�Fri/1.8/system/RSS/BaseModel/yes_clean_other_attr_reader-i.yamlnu�[���PK�|[��1	70Hri/1.8/system/RSS/BaseModel/install_date_element-i.yamlnu�[���PK�|[�[
7�Iri/1.8/system/RSS/BaseModel/install_text_element-i.yamlnu�[���PK�|[���SSAKri/1.8/system/RSS/BaseModel/install_have_attribute_element-i.yamlnu�[���PK�|[������-�Lri/1.8/system/RSS/BaseModel/csv_writer-i.yamlnu�[���PK�|[�����1�Mri/1.8/system/RSS/BaseModel/boolean_writer-i.yamlnu�[���PK�|[9�9��3"Ori/1.8/system/RSS/BaseModel/text_type_writer-i.yamlnu�[���PK�|[�j����1\Pri/1.8/system/RSS/BaseModel/integer_writer-i.yamlnu�[���PK�|[����2�Qri/1.8/system/RSS/BaseModel/install_element-i.yamlnu�[���PK�|[;r���1�Rri/1.8/system/RSS/BaseModel/content_writer-i.yamlnu�[���PK�|[�\����8�Sri/1.8/system/RSS/BaseModel/yes_other_attr_reader-i.yamlnu�[���PK�|[��e8AA=2Uri/1.8/system/RSS/BaseModel/install_have_child_element-i.yamlnu�[���PK�|[1���:�Vri/1.8/system/RSS/BaseModel/uri_convert_attr_reader-i.yamlnu�[���PK�|[��,�@!Xri/1.8/system/RSS/BaseModel/install_have_children_element-i.yamlnu�[���PK�|[����9�Yri/1.8/system/RSS/BaseModel/yes_clean_other_writer-i.yamlnu�[���PK�|[q���:�Zri/1.8/system/RSS/BaseModel/positive_integer_writer-i.yamlnu�[���PK�|[�����:8\ri/1.8/system/RSS/BaseParser/ignore_unknown_element-i.yamlnu�[���PK�|[����2q]ri/1.8/system/RSS/BaseParser/do_validate%3d-i.yamlnu�[���PK�|[U���)�^ri/1.8/system/RSS/BaseParser/parse-i.yamlnu�[���PK�|[b�Q{��2�_ri/1.8/system/RSS/BaseParser/cdesc-BaseParser.yamlnu�[���PK�|[y}`��'�bri/1.8/system/RSS/BaseParser/new-c.yamlnu�[���PK�|[K˵&��A�cri/1.8/system/RSS/BaseParser/raise_for_undefined_entity%3f-c.yamlnu�[���PK�|[ �X���/�dri/1.8/system/RSS/BaseParser/do_validate-i.yamlnu�[���PK�|[�@��'�eri/1.8/system/RSS/BaseParser/rss-i.yamlnu�[���PK�|[�$&��=�fri/1.8/system/RSS/BaseParser/ignore_unknown_element%3d-i.yamlnu�[���PK�|[��~��<-hri/1.8/system/RSS/DublinCoreModel/cdesc-DublinCoreModel.yamlnu�[���PK�|[�2h���1wlri/1.8/system/RSS/Rss/setup_maker_elements-i.yamlnu�[���PK�|[�
����9�mri/1.8/system/RSS/Rss/Channel/setup_maker_elements-i.yamlnu�[���PK�|[�����4�nri/1.8/system/RSS/Rss/Channel/Item/Source/new-c.yamlnu�[���PK�|[�����=pri/1.8/system/RSS/Rss/Channel/Item/Source/maker_target-i.yamlnu�[���PK�|[�A�o��;>qri/1.8/system/RSS/Rss/Channel/Item/Source/cdesc-Source.yamlnu�[���PK�|[�����GJsri/1.8/system/RSS/Rss/Channel/Item/Source/setup_maker_attributes-i.yamlnu�[���PK�|[�����?�tri/1.8/system/RSS/Rss/Channel/Item/Category/cdesc-Category.yamlnu�[���PK�|[�����6�vri/1.8/system/RSS/Rss/Channel/Item/Category/new-c.yamlnu�[���PK�|[*Y ��?�wri/1.8/system/RSS/Rss/Channel/Item/Category/maker_target-i.yamlnu�[���PK�|[�@���I"yri/1.8/system/RSS/Rss/Channel/Item/Category/setup_maker_attributes-i.yamlnu�[���PK�|[+�>�zri/1.8/system/RSS/Rss/Channel/Item/_setup_maker_element-i.yamlnu�[���PK�|[�����=|ri/1.8/system/RSS/Rss/Channel/Item/setup_maker_element-i.yamlnu�[���PK�|[�y����6S}ri/1.8/system/RSS/Rss/Channel/Item/maker_target-i.yamlnu�[���PK�|[��+��A�~ri/1.8/system/RSS/Rss/Channel/Item/Enclosure/cdesc-Enclosure.yamlnu�[���PK�|[0��B��7��ri/1.8/system/RSS/Rss/Channel/Item/Enclosure/new-c.yamlnu�[���PK�|[��j���@ri/1.8/system/RSS/Rss/Channel/Item/Enclosure/maker_target-i.yamlnu�[���PK�|[��S���J�ri/1.8/system/RSS/Rss/Channel/Item/Enclosure/setup_maker_attributes-i.yamlnu�[���PK�|[��|��;k�ri/1.8/system/RSS/Rss/Channel/Item/Guid/PermaLink%3f-i.yamlnu�[���PK�|[>I���2��ri/1.8/system/RSS/Rss/Channel/Item/Guid/new-c.yamlnu�[���PK�|[L�a��7��ri/1.8/system/RSS/Rss/Channel/Item/Guid/cdesc-Guid.yamlnu�[���PK�|[� ���;�ri/1.8/system/RSS/Rss/Channel/Item/Guid/maker_target-i.yamlnu�[���PK�|[�%���E+�ri/1.8/system/RSS/Rss/Channel/Item/Guid/setup_maker_attributes-i.yamlnu�[���PK�|[��N��2��ri/1.8/system/RSS/Rss/Channel/Item/cdesc-Item.yamlnu�[���PK�|[��\��2��ri/1.8/system/RSS/Rss/Channel/TextInput/new-c.yamlnu�[���PK�|[��y�``<яri/1.8/system/RSS/Rss/Channel/TextInput/cdesc-TextInput.yamlnu�[���PK�|[Q���;��ri/1.8/system/RSS/Rss/Channel/TextInput/maker_target-i.yamlnu�[���PK�|[�6��XX4֒ri/1.8/system/RSS/Rss/Channel/Image/cdesc-Image.yamlnu�[���PK�|[��z��.��ri/1.8/system/RSS/Rss/Channel/Image/new-c.yamlnu�[���PK�|[�u�+��7��ri/1.8/system/RSS/Rss/Channel/Image/maker_target-i.yamlnu�[���PK�|[�>k�<ؖri/1.8/system/RSS/Rss/Channel/SkipHours/cdesc-SkipHours.yamlnu�[���PK�|[#>����7E�ri/1.8/system/RSS/Rss/Channel/SkipHours/Hour/new-c.yamlnu�[���PK�|[�7C--<m�ri/1.8/system/RSS/Rss/Channel/SkipHours/Hour/cdesc-Hour.yamlnu�[���PK�|[���7��0�ri/1.8/system/RSS/Rss/Channel/cdesc-Channel.yamlnu�[���PK�|[�	���.�ri/1.8/system/RSS/Rss/Channel/Cloud/new-c.yamlnu�[���PK�|[}��J$$4��ri/1.8/system/RSS/Rss/Channel/Cloud/cdesc-Cloud.yamlnu�[���PK�|[P�2���K��ri/1.8/system/RSS/Rss/Channel/not_need_to_call_setup_maker_variables-i.yamlnu�[���PK�|[^�����1�ri/1.8/system/RSS/Rss/Channel/maker_target-i.yamlnu�[���PK�|['y1g**9�ri/1.8/system/RSS/Rss/Channel/SkipDays/Day/cdesc-Day.yamlnu�[���PK�|[;Ԭ���5��ri/1.8/system/RSS/Rss/Channel/SkipDays/Day/new-c.yamlnu�[���PK�|[C�<��:˥ri/1.8/system/RSS/Rss/Channel/SkipDays/cdesc-SkipDays.yamlnu�[���PK�|[��Ȏ��$4�ri/1.8/system/RSS/Rss/cdesc-Rss.yamlnu�[���PK�|[������ �ri/1.8/system/RSS/Rss/new-c.yamlnu�[���PK�|[�y"���"D�ri/1.8/system/RSS/Rss/items-i.yamlnu�[���PK�|[g+bQ��"<�ri/1.8/system/RSS/Rss/image-i.yamlnu�[���PK�|[�Fө�#4�ri/1.8/system/RSS/Rss/_attrs-i.yamlnu�[���PK�|[3����&0�ri/1.8/system/RSS/Rss/textinput-i.yamlnu�[���PK�|[�$%��@4�ri/1.8/system/RSS/NotValidXMLParser/cdesc-NotValidXMLParser.yamlnu�[���PK�|[S�׶�.��ri/1.8/system/RSS/NotValidXMLParser/new-c.yamlnu�[���PK�|[�x���(��ri/1.8/system/RSS/Error/cdesc-Error.yamlnu�[���PK�|[���S��@Ѳri/1.8/system/RSS/XMLParserNotFound/cdesc-XMLParserNotFound.yamlnu�[���PK�|[2���.?�ri/1.8/system/RSS/XMLParserNotFound/new-c.yamlnu�[���PK�|[��V*��1M�ri/1.8/system/RSS/XMLParserParser/listener-c.yamlnu�[���PK�|[D��22<f�ri/1.8/system/RSS/XMLParserParser/cdesc-XMLParserParser.yamlnu�[���PK�|[5�U8��/�ri/1.8/system/RSS/XMLParserParser/_parse-i.yamlnu�[���PK�|[��V��5�ri/1.8/system/RSS/Utils/new_with_value_if_need-i.yamlnu�[���PK�|[�QV�(�ri/1.8/system/RSS/Utils/cdesc-Utils.yamlnu�[���PK�|[�o��<z�ri/1.8/system/RSS/Utils/get_file_and_line_from_caller-i.yamlnu�[���PK�|[%I����>��ri/1.8/system/RSS/Utils/YesCleanOther/cdesc-YesCleanOther.yamlnu�[���PK�|[x�i��2)�ri/1.8/system/RSS/Utils/YesCleanOther/parse-i.yamlnu�[���PK�|[x����(G�ri/1.8/system/RSS/Utils/CSV/parse-i.yamlnu�[���PK�|[�"})��*Y�ri/1.8/system/RSS/Utils/CSV/cdesc-CSV.yamlnu�[���PK�|[���,��ri/1.8/system/RSS/Utils/to_class_name-i.yamlnu�[���PK�|[�*����E�ri/1.8/system/RSS/Utils/InheritedReader/inherited_array_reader-i.yamlnu�[���PK�|[��>(��D`�ri/1.8/system/RSS/Utils/InheritedReader/inherited_hash_reader-i.yamlnu�[���PK�|[Ů��33?��ri/1.8/system/RSS/Utils/InheritedReader/inherited_reader-i.yamlnu�[���PK�|[�C'��B\�ri/1.8/system/RSS/Utils/InheritedReader/cdesc-InheritedReader.yamlnu�[���PK�|[�O�� X�ri/1.8/system/RSS/Utils/h-i.yamlnu�[���PK�|[��T�;;*��ri/1.8/system/RSS/Utils/html_escape-i.yamlnu�[���PK�|[����>�ri/1.8/system/RSS/Utils/element_initialize_arguments%3f-i.yamlnu�[���PK�|[��K���-e�ri/1.8/system/RSS/Utils/YesOther/parse-i.yamlnu�[���PK�|[^�.��4y�ri/1.8/system/RSS/Utils/YesOther/cdesc-YesOther.yamlnu�[���PK�|[5��(DDH��ri/1.8/system/RSS/OverlappedPrefixError/cdesc-OverlappedPrefixError.yamlnu�[���PK�|[f���2��ri/1.8/system/RSS/OverlappedPrefixError/new-c.yamlnu�[���PK�|[����<��ri/1.8/system/RSS/ConversionError/cdesc-ConversionError.yamlnu�[���PK�|[�~���,��ri/1.8/system/RSS/ConversionError/new-c.yamlnu�[���PK�|[��xx(��ri/1.8/system/RSS/RSS10/cdesc-RSS10.yamlnu�[���PK�|[͖����.��ri/1.8/system/RSS/RSS10/append_features-c.yamlnu�[���PK�|[���$��ri/1.8/system/RSS/NSError/new-c.yamlnu�[���PK�|[ުu��,��ri/1.8/system/RSS/NSError/cdesc-NSError.yamlnu�[���PK�|[LIuö�/��ri/1.8/system/RSS/XMLStyleSheetMixin/new-c.yamlnu�[���PK�|[�x�||B��ri/1.8/system/RSS/XMLStyleSheetMixin/cdesc-XMLStyleSheetMixin.yamlnu�[���PK�|[������=��ri/1.8/system/RSS/XMLStyleSheetMixin/xml_stylesheet_pi-i.yamlnu�[���PK�|[AW���.(�ri/1.8/system/RSS/RSS09/append_features-c.yamlnu�[���PK�|[�4�mxx(G�ri/1.8/system/RSS/RSS09/cdesc-RSS09.yamlnu�[���PK�|[񡆸�/�ri/1.8/system/RSS/XMLScanListener/entity-i.yamlnu�[���PK�|[r%���0.�ri/1.8/system/RSS/XMLScanListener/on_etag-i.yamlnu�[���PK�|[�h"���>H�ri/1.8/system/RSS/XMLScanListener/on_xmldecl_standalone-i.yamlnu�[���PK�|[��Y��:��ri/1.8/system/RSS/XMLScanListener/on_attr_entityref-i.yamlnu�[���PK�|[����6��ri/1.8/system/RSS/XMLScanListener/on_attr_value-i.yamlnu�[���PK�|[��E���:��ri/1.8/system/RSS/XMLScanListener/on_stag_end_empty-i.yamlnu�[���PK�|[�ӽ�8%�ri/1.8/system/RSS/XMLScanListener/on_attr_charref-i.yamlnu�[���PK�|[|)$��<��ri/1.8/system/RSS/XMLScanListener/cdesc-XMLScanListener.yamlnu�[���PK�|[��C��3��ri/1.8/system/RSS/XMLScanListener/on_charref-i.yamlnu�[���PK�|[{�:���<�ri/1.8/system/RSS/XMLScanListener/on_xmldecl_encoding-i.yamlnu�[���PK�|[�e����5>�ri/1.8/system/RSS/XMLScanListener/on_attribute-i.yamlnu�[���PK�|[���к�0g�ri/1.8/system/RSS/XMLScanListener/on_stag-i.yamlnu�[���PK�|[���<��ri/1.8/system/RSS/XMLScanListener/on_attr_charref_hex-i.yamlnu�[���PK�|[�l��4�ri/1.8/system/RSS/XMLScanListener/on_stag_end-i.yamlnu�[���PK�|[,&k��;&�ri/1.8/system/RSS/XMLScanListener/on_xmldecl_version-i.yamlnu�[���PK�|[�U7`�ri/1.8/system/RSS/XMLScanListener/on_charref_hex-i.yamlnu�[���PK�|[|H����7�ri/1.8/system/RSS/XMLScanListener/on_xmldecl_end-i.yamlnu�[���PK�|[g�����5��ri/1.8/system/RSS/XMLScanListener/on_entityref-i.yamlnu�[���PK�|[�(..8ri/1.8/system/RSS/XMLScanParser/cdesc-XMLScanParser.yamlnu�[���PK�|[­]���/�ri/1.8/system/RSS/XMLScanParser/listener-c.yamlnu�[���PK�|[\H����-�ri/1.8/system/RSS/XMLScanParser/_parse-i.yamlnu�[���PK�|[~��(��-�ri/1.8/system/RSS/REXMLParser/listener-c.yamlnu�[���PK�|[��=v**4�ri/1.8/system/RSS/REXMLParser/cdesc-REXMLParser.yamlnu�[���PK�|[44*��+xri/1.8/system/RSS/REXMLParser/_parse-i.yamlnu�[���PK�|[{z�c��0�ri/1.8/system/RSS/NotExpectedTagError/new-c.yamlnu�[���PK�|[9�(��D�ri/1.8/system/RSS/NotExpectedTagError/cdesc-NotExpectedTagError.yamlnu�[���PK�|[Y[�Ժ�2�
ri/1.8/system/RSS/SlashModel/cdesc-SlashModel.yamlnu�[���PK�|[;%�d��3�ri/1.8/system/RSS/SlashModel/append_features-c.yamlnu�[���PK�|[�0�0��,%ri/1.8/system/RSS/BaseListener/getter-c.yamlnu�[���PK�|[Ub��MM6?ri/1.8/system/RSS/BaseListener/cdesc-BaseListener.yamlnu�[���PK�|[�4�d,�ri/1.8/system/RSS/BaseListener/setter-c.yamlnu�[���PK�|["��!!7fri/1.8/system/RSS/BaseListener/uri_registered%3f-c.yamlnu�[���PK�|[J�u���:�ri/1.8/system/RSS/BaseListener/def_get_text_element-c.yamlnu�[���PK�|['Y�E4Cri/1.8/system/RSS/BaseListener/available_tags-c.yamlnu�[���PK�|[ ��r::8�ri/1.8/system/RSS/BaseListener/install_class_name-c.yamlnu�[���PK�|[�}���>fri/1.8/system/RSS/BaseListener/install_get_text_element-c.yamlnu�[���PK�|[%�yfMM0�ri/1.8/system/RSS/BaseListener/class_name-c.yamlnu�[���PK�|[2%n

2nri/1.8/system/RSS/BaseListener/register_uri-c.yamlnu�[���PK�|[N��<<;�ri/1.8/system/RSS/BaseListener/install_accessor_base-c.yamlnu�[���PK�|[��z���C� ri/1.8/system/RSS/BaseListener/raise_for_undefined_entity%3f-c.yamlnu�[���PK�|[����9�!ri/1.8/system/RSS/UnsupportedMakerVersionError/new-c.yamlnu�[���PK�|[H aWSSV�"ri/1.8/system/RSS/UnsupportedMakerVersionError/cdesc-UnsupportedMakerVersionError.yamlnu�[���PK�|[Y��8��.�$ri/1.8/system/RSS/ListenerMixin/tag_end-i.yamlnu�[���PK�|[�����8�%ri/1.8/system/RSS/ListenerMixin/initial_start_RDF-i.yamlnu�[���PK�|[�zշ�*5'ri/1.8/system/RSS/ListenerMixin/_ns-i.yamlnu�[���PK�|[h�ACF(ri/1.8/system/RSS/ListenerMixin/start_have_something_element-i.yamlnu�[���PK�|[�$Õ)).�)ri/1.8/system/RSS/ListenerMixin/xmldecl-i.yamlnu�[���PK�|[��
��9A+ri/1.8/system/RSS/ListenerMixin/collect_attributes-i.yamlnu�[���PK�|[���:�,ri/1.8/system/RSS/ListenerMixin/initial_start_entry-i.yamlnu�[���PK�|[���Q��/�-ri/1.8/system/RSS/ListenerMixin/check_ns-i.yamlnu�[���PK�|[��ۡ��8 /ri/1.8/system/RSS/ListenerMixin/initial_start_rss-i.yamlnu�[���PK�|[A>��9l0ri/1.8/system/RSS/ListenerMixin/initial_start_feed-i.yamlnu�[���PK�|[*.k/��9�1ri/1.8/system/RSS/ListenerMixin/setup_next_element-i.yamlnu�[���PK�|[%L�Ǭ�*
3ri/1.8/system/RSS/ListenerMixin/new-c.yamlnu�[���PK�|[��F���94ri/1.8/system/RSS/ListenerMixin/start_else_element-i.yamlnu�[���PK�|[�`R��2\5ri/1.8/system/RSS/ListenerMixin/instruction-i.yamlnu�[���PK�|[���7�6ri/1.8/system/RSS/ListenerMixin/parse_pi_content-i.yamlnu�[���PK�|[Y�M���=o8ri/1.8/system/RSS/ListenerMixin/start_get_text_element-i.yamlnu�[���PK�|[�����8�9ri/1.8/system/RSS/ListenerMixin/cdesc-ListenerMixin.yamlnu�[���PK�|[�ȫ��+�@ri/1.8/system/RSS/ListenerMixin/text-i.yamlnu�[���PK�|[{|����0�Ari/1.8/system/RSS/ListenerMixin/tag_start-i.yamlnu�[���PK�|[����1Cri/1.8/system/RSS/ListenerMixin/split_name-i.yamlnu�[���PK�|[|�����;$Dri/1.8/system/RSS/Converter/def_uconv_convert_if_can-i.yamlnu�[���PK�|[T�o��>�Eri/1.8/system/RSS/Converter/def_to_shift_jis_from_utf_8-i.yamlnu�[���PK�|[�ٓz��*�Fri/1.8/system/RSS/Converter/convert-i.yamlnu�[���PK�|[P���>�Gri/1.8/system/RSS/Converter/def_to_utf_8_from_shift_jis-i.yamlnu�[���PK�|[w�c��4Iri/1.8/system/RSS/Converter/def_iconv_convert-i.yamlnu�[���PK�|[��S��A\Jri/1.8/system/RSS/Converter/def_to_euc_jp_from_iso_2022_jp-i.yamlnu�[���PK�|[0$�w��/�Kri/1.8/system/RSS/Converter/def_same_enc-i.yamlnu�[���PK�|[o�C��?�Lri/1.8/system/RSS/Converter/def_to_shift_jis_from_euc_jp-i.yamlnu�[���PK�|[����&
Nri/1.8/system/RSS/Converter/new-c.yamlnu�[���PK�|[�OI//0Ori/1.8/system/RSS/Converter/cdesc-Converter.yamlnu�[���PK�|[�	���?�Tri/1.8/system/RSS/Converter/def_to_utf_8_from_iso_8859_1-i.yamlnu�[���PK�|[%G���?�Uri/1.8/system/RSS/Converter/def_to_euc_jp_from_shift_jis-i.yamlnu�[���PK�|[�B�_��?@Wri/1.8/system/RSS/Converter/def_to_iso_8859_1_from_utf_8-i.yamlnu�[���PK�|[��"��;�Xri/1.8/system/RSS/Converter/def_to_euc_jp_from_utf_8-i.yamlnu�[���PK�|[��̷��.�Yri/1.8/system/RSS/Converter/def_convert-i.yamlnu�[���PK�|[�΅���A�Zri/1.8/system/RSS/Converter/def_to_iso_2022_jp_from_euc_jp-i.yamlnu�[���PK�|[���v��/2\ri/1.8/system/RSS/Converter/def_else_enc-i.yamlnu�[���PK�|[��e���;[]ri/1.8/system/RSS/Converter/def_to_utf_8_from_euc_jp-i.yamlnu�[���PK�|[d��1��<�^ri/1.8/system/RSS/InvalidRSSError/cdesc-InvalidRSSError.yamlnu�[���PK�|[���Z�_ri/1.8/system/RSS/Maker/AtomTextConstructBase/EnsureXMLContent/cdesc-EnsureXMLContent.yamlnu�[���PK�|[[�7��T`bri/1.8/system/RSS/Maker/AtomTextConstructBase/EnsureXMLContent/xml_content%3d-i.yamlnu�[���PK�|[������X�cri/1.8/system/RSS/Maker/AtomTextConstructBase/EnsureXMLContent/ensure_xml_content-i.yamlnu�[���PK�|[Y���bDeri/1.8/system/RSS/Maker/AtomTextConstructBase/EnsureXMLContent/set_xhtml_uri_as_default_uri-i.yamlnu�[���PK�|[��5��N�fri/1.8/system/RSS/Maker/AtomTextConstructBase/EnsureXMLContent/xhtml%3d-i.yamlnu�[���PK�|[>�{��N6hri/1.8/system/RSS/Maker/AtomTextConstructBase/EnsureXMLContent/included-c.yamlnu�[���PK�|[%ȃ%��D�iri/1.8/system/RSS/Maker/AtomTextConstructBase/append_features-c.yamlnu�[���PK�|[�v@�MMN�jri/1.8/system/RSS/Maker/AtomTextConstructBase/cdesc-AtomTextConstructBase.yamlnu�[���PK�|[�D���?�lri/1.8/system/RSS/Maker/AtomLogo/required_variable_names-i.yamlnu�[���PK�|[�֗E��/�mri/1.8/system/RSS/Maker/AtomLogo/to_feed-i.yamlnu�[���PK�|[��y444ori/1.8/system/RSS/Maker/AtomLogo/cdesc-AtomLogo.yamlnu�[���PK�|[� �KKH�pri/1.8/system/RSS/Maker/TaxonomyTopicModel/cdesc-TaxonomyTopicModel.yamlnu�[���PK�|[E���Airri/1.8/system/RSS/Maker/TaxonomyTopicModel/append_features-c.yamlnu�[���PK�|[�J+���[�sri/1.8/system/RSS/Maker/TaxonomyTopicModel/TaxonomyTopicsBase/cdesc-TaxonomyTopicsBase.yamlnu�[���PK�|[�DI���l)uri/1.8/system/RSS/Maker/TaxonomyTopicModel/TaxonomyTopicsBase/TaxonomyTopicBase/cdesc-TaxonomyTopicBase.yamlnu�[���PK�|[_��n�wri/1.8/system/RSS/Maker/TaxonomyTopicModel/TaxonomyTopicsBase/TaxonomyTopicBase/have_required_values%3f-i.yamlnu�[���PK�|[
�����DYyri/1.8/system/RSS/Maker/TaxonomyTopicModel/install_taxo_topic-c.yamlnu�[���PK�|[��S$��0�zri/1.8/system/RSS/Maker/Base/setup_values-i.yamlnu�[���PK�|[��n���7�{ri/1.8/system/RSS/Maker/Base/_set_default_values-i.yamlnu�[���PK�|[�N����3}ri/1.8/system/RSS/Maker/Base/current_element-i.yamlnu�[���PK�|[?hM���-8~ri/1.8/system/RSS/Maker/Base/variables-i.yamlnu�[���PK�|[`�E���8Lri/1.8/system/RSS/Maker/Base/setup_other_elements-i.yamlnu�[���PK�|[2�U4��5��ri/1.8/system/RSS/Maker/Base/add_other_element-c.yamlnu�[���PK�|[79f���2ʁri/1.8/system/RSS/Maker/Base/inherited_base-c.yamlnu�[���PK�|[Itė��F�ri/1.8/system/RSS/Maker/Base/def_other_element_without_accessor-c.yamlnu�[���PK�|[iu
Þ�8N�ri/1.8/system/RSS/Maker/Base/def_classed_elements-c.yamlnu�[���PK�|[�Z��@T�ri/1.8/system/RSS/Maker/Base/add_need_initialize_variable-c.yamlnu�[���PK�|[JJzK��.��ri/1.8/system/RSS/Maker/Base/set_parent-i.yamlnu�[���PK�|[\�R���6�ri/1.8/system/RSS/Maker/Base/variable_is_set%3f-i.yamlnu�[���PK�|[k�:��;�ri/1.8/system/RSS/Maker/Base/have_required_values%3f-i.yamlnu�[���PK�|[������3G�ri/1.8/system/RSS/Maker/Base/def_csv_element-c.yamlnu�[���PK�|[70A�6z�ri/1.8/system/RSS/Maker/Base/set_default_values-i.yamlnu�[���PK�|[fq�&��'�ri/1.8/system/RSS/Maker/Base/new-c.yamlnu�[���PK�|[�eC��8�ri/1.8/system/RSS/Maker/Base/initialize_variables-i.yamlnu�[���PK�|[��U��A'�ri/1.8/system/RSS/Maker/Base/required_variables_are_set%3f-i.yamlnu�[���PK�|[y���,s�ri/1.8/system/RSS/Maker/Base/cdesc-Base.yamlnu�[���PK�|[�0'Hݙri/1.8/system/RSS/Maker/Base/def_classed_element_without_accessor-c.yamlnu�[���PK�|['�q���7U�ri/1.8/system/RSS/Maker/Base/def_classed_element-c.yamlnu�[���PK�|[��|���2��ri/1.8/system/RSS/Maker/Base/other_elements-c.yamlnu�[���PK�|[AJ���5Нri/1.8/system/RSS/Maker/Base/def_array_element-c.yamlnu�[���PK�|[��p��-�ri/1.8/system/RSS/Maker/Base/inherited-c.yamlnu�[���PK�|[�x~��>6�ri/1.8/system/RSS/Maker/Base/not_set_required_variables-i.yamlnu�[���PK�|[�� ���=}�ri/1.8/system/RSS/Maker/Base/need_initialize_variables-c.yamlnu�[���PK�|[:47��5��ri/1.8/system/RSS/Maker/Base/def_other_element-c.yamlnu�[���PK�|[�.��>>>�ri/1.8/system/RSS/Maker/AtomGenerator/cdesc-AtomGenerator.yamlnu�[���PK�|[2�4��D��ri/1.8/system/RSS/Maker/AtomGenerator/required_variable_names-i.yamlnu�[���PK�|[�K����4�ri/1.8/system/RSS/Maker/AtomGenerator/to_feed-i.yamlnu�[���PK�|[��b���?�ri/1.8/system/RSS/Maker/AtomLink/required_variable_names-i.yamlnu�[���PK�|[�Dt���/]�ri/1.8/system/RSS/Maker/AtomLink/to_feed-i.yamlnu�[���PK�|[K�!�444�ri/1.8/system/RSS/Maker/AtomLink/cdesc-AtomLink.yamlnu�[���PK�|[]��Z��?�ri/1.8/system/RSS/Maker/SyndicationModel/append_features-c.yamlnu�[���PK�|[�'��

DY�ri/1.8/system/RSS/Maker/SyndicationModel/cdesc-SyndicationModel.yamlnu�[���PK�|[�}��5׮ri/1.8/system/RSS/Maker/AtomCategory/variables-i.yamlnu�[���PK�|[h�n�pp<��ri/1.8/system/RSS/Maker/AtomCategory/cdesc-AtomCategory.yamlnu�[���PK�|[�wV��Cױri/1.8/system/RSS/Maker/AtomCategory/required_variable_names-i.yamlnu�[���PK�|[s�Vb��3%�ri/1.8/system/RSS/Maker/AtomCategory/to_feed-i.yamlnu�[���PK�|[�ʜ���AO�ri/1.8/system/RSS/Maker/ITunesChannelModel/append_features-c.yamlnu�[���PK�|[�
2��Y��ri/1.8/system/RSS/Maker/ITunesChannelModel/ITunesOwnerBase/required_variable_names-i.yamlnu�[���PK�|[��R��I�ri/1.8/system/RSS/Maker/ITunesChannelModel/ITunesOwnerBase/to_feed-i.yamlnu�[���PK�|[�V/�ZZUg�ri/1.8/system/RSS/Maker/ITunesChannelModel/ITunesOwnerBase/cdesc-ITunesOwnerBase.yamlnu�[���PK�|[���0��pF�ri/1.8/system/RSS/Maker/ITunesChannelModel/ITunesCategoriesBase/ITunesCategoryBase/cdesc-ITunesCategoryBase.yamlnu�[���PK�|[I�"�q��ri/1.8/system/RSS/Maker/ITunesChannelModel/ITunesCategoriesBase/ITunesCategoryBase/have_required_values%3f-i.yamlnu�[���PK�|[��RI��a>�ri/1.8/system/RSS/Maker/ITunesChannelModel/ITunesCategoriesBase/ITunesCategoryBase/to_feed-i.yamlnu�[���PK�|[R9���_ƿri/1.8/system/RSS/Maker/ITunesChannelModel/ITunesCategoriesBase/cdesc-ITunesCategoriesBase.yamlnu�[���PK�|[^*�D��IH�ri/1.8/system/RSS/Maker/ITunesChannelModel/ITunesImageBase/to_feed-i.yamlnu�[���PK�|[PϠ�UUU��ri/1.8/system/RSS/Maker/ITunesChannelModel/ITunesImageBase/cdesc-ITunesImageBase.yamlnu�[���PK�|[*�<�Hy�ri/1.8/system/RSS/Maker/ITunesChannelModel/cdesc-ITunesChannelModel.yamlnu�[���PK�|[��D�CC@��ri/1.8/system/RSS/Maker/ImageItemModel/cdesc-ImageItemModel.yamlnu�[���PK�|[�h�4��=��ri/1.8/system/RSS/Maker/ImageItemModel/append_features-c.yamlnu�[���PK�|[�����@��ri/1.8/system/RSS/Maker/ImageItemModel/install_image_item-c.yamlnu�[���PK�|[=�{Ǡ�M7�ri/1.8/system/RSS/Maker/ImageItemModel/ImageItemBase/cdesc-ImageItemBase.yamlnu�[���PK�|[�R����ST�ri/1.8/system/RSS/Maker/ImageItemModel/ImageItemBase/have_required_values%3f-i.yamlnu�[���PK�|[\�8*��C��ri/1.8/system/RSS/Maker/ImageItemModel/ImageItemBase/to_feed-i.yamlnu�[���PK�|[h6�
��I	�ri/1.8/system/RSS/Maker/ITunesItemModel/ITunesDurationBase/hour%3d-i.yamlnu�[���PK�|[�9���KS�ri/1.8/system/RSS/Maker/ITunesItemModel/ITunesDurationBase/minute%3d-i.yamlnu�[���PK�|[���,��L��ri/1.8/system/RSS/Maker/ITunesItemModel/ITunesDurationBase/content%3d-i.yamlnu�[���PK�|[�5o��K��ri/1.8/system/RSS/Maker/ITunesItemModel/ITunesDurationBase/second%3d-i.yamlnu�[���PK�|[kl��PM�ri/1.8/system/RSS/Maker/ITunesItemModel/ITunesDurationBase/update_content-i.yamlnu�[���PK�|[�����I��ri/1.8/system/RSS/Maker/ITunesItemModel/ITunesDurationBase/to_feed-i.yamlnu�[���PK�|[3E��ZZX�ri/1.8/system/RSS/Maker/ITunesItemModel/ITunesDurationBase/cdesc-ITunesDurationBase.yamlnu�[���PK�|[��ğB��ri/1.8/system/RSS/Maker/ITunesItemModel/cdesc-ITunesItemModel.yamlnu�[���PK�|[�����>`�ri/1.8/system/RSS/Maker/ITunesItemModel/append_features-c.yamlnu�[���PK�|[�D*��>��ri/1.8/system/RSS/Maker/DublinCoreModel/append_features-c.yamlnu�[���PK�|[�Z�FFB��ri/1.8/system/RSS/Maker/DublinCoreModel/cdesc-DublinCoreModel.yamlnu�[���PK�|[�Q����B��ri/1.8/system/RSS/Maker/DublinCoreModel/install_dublin_core-c.yamlnu�[���PK�|[21]4��$��ri/1.8/system/RSS/Maker/maker-c.yamlnu�[���PK�|[{�|µ�#��ri/1.8/system/RSS/Maker/make-c.yamlnu�[���PK�|[vȹ���-��ri/1.8/system/RSS/Maker/ImageBase/link-i.yamlnu�[���PK�|[}_e//6��ri/1.8/system/RSS/Maker/ImageBase/cdesc-ImageBase.yamlnu�[���PK�|[�a����F��ri/1.8/system/RSS/Maker/AtomPersonConstructBase/append_features-c.yamlnu�[���PK�|[�QibR��ri/1.8/system/RSS/Maker/AtomPersonConstructBase/cdesc-AtomPersonConstructBase.yamlnu�[���PK�|[εF���M|�ri/1.8/system/RSS/Maker/RSS10/Items/Item/Title/required_variable_names-i.yamlnu�[���PK�|[tWb�KK?��ri/1.8/system/RSS/Maker/RSS10/Items/Item/Title/cdesc-Title.yamlnu�[���PK�|[��g3��=��ri/1.8/system/RSS/Maker/RSS10/Items/Item/Title/to_feed-i.yamlnu�[���PK�|[۾ <��C��ri/1.8/system/RSS/Maker/RSS10/Items/Item/Links/Link/cdesc-Link.yamlnu�[���PK�|["l�		?)�ri/1.8/system/RSS/Maker/RSS10/Items/Item/Links/cdesc-Links.yamlnu�[���PK�|[�>���=��ri/1.8/system/RSS/Maker/RSS10/Items/Item/Links/to_feed-i.yamlnu�[���PK�|[�R�F��ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Title/cdesc-Title.yamlnu�[���PK�|[�K�W��Da�ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Title/to_feed-i.yamlnu�[���PK�|[+�#��J��ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Links/Link/cdesc-Link.yamlnu�[���PK�|[��E�F	�ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Links/cdesc-Links.yamlnu�[���PK�|[D�	9��D��ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Links/to_feed-i.yamlnu�[���PK�|[�o�/L�ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Subtitle/cdesc-Subtitle.yamlnu�[���PK�|[[/�U��Gn�ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Subtitle/to_feed-i.yamlnu�[���PK�|[j�(�D��ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Logo/cdesc-Logo.yamlnu�[���PK�|[��k��C>�ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Logo/to_feed-i.yamlnu�[���PK�|[Q��_��ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Contributors/Contributor/cdesc-Contributor.yamlnu�[���PK�|[R����Kri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Contributors/to_feed-i.yamlnu�[���PK�|[��&&Tkri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Contributors/cdesc-Contributors.yamlnu�[���PK�|[!jƏ��>ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/to_feed-i.yamlnu�[���PK�|[��|���EPri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Rights/to_feed-i.yamlnu�[���PK�|[�R<�H�ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Rights/cdesc-Rights.yamlnu�[���PK�|[$�GN&ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Generator/cdesc-Generator.yamlnu�[���PK�|[.��'��H�ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Generator/to_feed-i.yamlnu�[���PK�|[F���A
ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/cdesc-Source.yamlnu�[���PK�|[.@/��C�ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Icon/to_feed-i.yamlnu�[���PK�|[���D�ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Icon/cdesc-Icon.yamlnu�[���PK�|[�K=;��PVri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Authors/Author/cdesc-Author.yamlnu�[���PK�|[�+����F�ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Authors/to_feed-i.yamlnu�[���PK�|[5:|�Jri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Authors/cdesc-Authors.yamlnu�[���PK�|[�C  P�ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Categories/cdesc-Categories.yamlnu�[���PK�|[l$0w��WAri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Categories/Category/cdesc-Category.yamlnu�[���PK�|[��P��I�ri/1.8/system/RSS/Maker/RSS10/Items/Item/Source/Categories/to_feed-i.yamlnu�[���PK�|[f��E��9ri/1.8/system/RSS/Maker/RSS10/Items/Item/variables-i.yamlnu�[���PK�|[����G?ri/1.8/system/RSS/Maker/RSS10/Items/Item/required_variable_names-i.yamlnu�[���PK�|[��\5��X�ri/1.8/system/RSS/Maker/RSS10/Items/Item/Contributors/Contributor/cdesc-Contributor.yamlnu�[���PK�|[����Dri/1.8/system/RSS/Maker/RSS10/Items/Item/Contributors/to_feed-i.yamlnu�[���PK�|[0|QAMdri/1.8/system/RSS/Maker/RSS10/Items/Item/Contributors/cdesc-Contributors.yamlnu�[���PK�|[/p�0��7�ri/1.8/system/RSS/Maker/RSS10/Items/Item/to_feed-i.yamlnu�[���PK�|[�0|��?)ri/1.8/system/RSS/Maker/RSS10/Items/Item/Content/to_feed-i.yamlnu�[���PK�|[�Z�ACj ri/1.8/system/RSS/Maker/RSS10/Items/Item/Content/cdesc-Content.yamlnu�[���PK�|[��-���>�!ri/1.8/system/RSS/Maker/RSS10/Items/Item/Rights/to_feed-i.yamlnu�[���PK�|[*�@�A+#ri/1.8/system/RSS/Maker/RSS10/Items/Item/Rights/cdesc-Rights.yamlnu�[���PK�|[����G�$ri/1.8/system/RSS/Maker/RSS10/Items/Item/Enclosure/cdesc-Enclosure.yamlnu�[���PK�|[XBX��A4&ri/1.8/system/RSS/Maker/RSS10/Items/Item/Enclosure/to_feed-i.yamlnu�[���PK�|[B����Su'ri/1.8/system/RSS/Maker/RSS10/Items/Item/Description/required_variable_names-i.yamlnu�[���PK�|[���o��C�(ri/1.8/system/RSS/Maker/RSS10/Items/Item/Description/to_feed-i.yamlnu�[���PK�|[��o]]K/*ri/1.8/system/RSS/Maker/RSS10/Items/Item/Description/cdesc-Description.yamlnu�[���PK�|[��֠��I,ri/1.8/system/RSS/Maker/RSS10/Items/Item/Authors/Author/cdesc-Author.yamlnu�[���PK�|[(
n��?f-ri/1.8/system/RSS/Maker/RSS10/Items/Item/Authors/to_feed-i.yamlnu�[���PK�|['LF�C�.ri/1.8/system/RSS/Maker/RSS10/Items/Item/Authors/cdesc-Authors.yamlnu�[���PK�|[�x�I%0ri/1.8/system/RSS/Maker/RSS10/Items/Item/Categories/cdesc-Categories.yamlnu�[���PK�|[2�H���P�1ri/1.8/system/RSS/Maker/RSS10/Items/Item/Categories/Category/cdesc-Category.yamlnu�[���PK�|[$YG��B%3ri/1.8/system/RSS/Maker/RSS10/Items/Item/Categories/to_feed-i.yamlnu�[���PK�|[��=h4ri/1.8/system/RSS/Maker/RSS10/Items/Item/Guid/cdesc-Guid.yamlnu�[���PK�|[ؽ%l��<�5ri/1.8/system/RSS/Maker/RSS10/Items/Item/Guid/to_feed-i.yamlnu�[���PK�|[op���87ri/1.8/system/RSS/Maker/RSS10/Items/Item/cdesc-Item.yamlnu�[���PK�|[�e�t��J59ri/1.8/system/RSS/Maker/RSS10/Items/Item/not_set_required_variables-i.yamlnu�[���PK�|[�ޖ9��4�:ri/1.8/system/RSS/Maker/RSS10/Items/cdesc-Items.yamlnu�[���PK�|[�ָ���2�;ri/1.8/system/RSS/Maker/RSS10/Items/to_feed-i.yamlnu�[���PK�|[i�z��J=ri/1.8/system/RSS/Maker/RSS10/Channel/Title/required_variable_names-i.yamlnu�[���PK�|[jY�}GG<s>ri/1.8/system/RSS/Maker/RSS10/Channel/Title/cdesc-Title.yamlnu�[���PK�|[
ͬl��:&@ri/1.8/system/RSS/Maker/RSS10/Channel/Title/to_feed-i.yamlnu�[���PK�|[	�5��O_Ari/1.8/system/RSS/Maker/RSS10/Channel/Links/Link/required_variable_names-i.yamlnu�[���PK�|[u<_��?�Bri/1.8/system/RSS/Maker/RSS10/Channel/Links/Link/to_feed-i.yamlnu�[���PK�|[ s��KK@Dri/1.8/system/RSS/Maker/RSS10/Channel/Links/Link/cdesc-Link.yamlnu�[���PK�|[؝�P<�Eri/1.8/system/RSS/Maker/RSS10/Channel/Links/cdesc-Links.yamlnu�[���PK�|[�w����:8Gri/1.8/system/RSS/Maker/RSS10/Channel/Links/to_feed-i.yamlnu�[���PK�|[>r���<qHri/1.8/system/RSS/Maker/RSS10/Channel/setup_textinput-i.yamlnu�[���PK�|[{�ٚ��>�Iri/1.8/system/RSS/Maker/RSS10/Channel/Copyright/to_feed-i.yamlnu�[���PK�|[�D�Jri/1.8/system/RSS/Maker/RSS10/Channel/Copyright/cdesc-Copyright.yamlnu�[���PK�|[i8f��DsLri/1.8/system/RSS/Maker/RSS10/Channel/required_variable_names-i.yamlnu�[���PK�|[)�\�D�Mri/1.8/system/RSS/Maker/RSS10/Channel/SkipHours/cdesc-SkipHours.yamlnu�[���PK�|[_�1���DIOri/1.8/system/RSS/Maker/RSS10/Channel/SkipHours/Hour/cdesc-Hour.yamlnu�[���PK�|[d��3��>�Pri/1.8/system/RSS/Maker/RSS10/Channel/SkipHours/to_feed-i.yamlnu�[���PK�|[�����U�Qri/1.8/system/RSS/Maker/RSS10/Channel/Contributors/Contributor/cdesc-Contributor.yamlnu�[���PK�|[z����APSri/1.8/system/RSS/Maker/RSS10/Channel/Contributors/to_feed-i.yamlnu�[���PK�|[烺;J�Tri/1.8/system/RSS/Maker/RSS10/Channel/Contributors/cdesc-Contributors.yamlnu�[���PK�|[��V��8+Vri/1.8/system/RSS/Maker/RSS10/Channel/setup_items-i.yamlnu�[���PK�|[��//8[Wri/1.8/system/RSS/Maker/RSS10/Channel/cdesc-Channel.yamlnu�[���PK�|[Y��ֿ�4�Yri/1.8/system/RSS/Maker/RSS10/Channel/to_feed-i.yamlnu�[���PK�|[Cpv(��:[ri/1.8/system/RSS/Maker/RSS10/Channel/Cloud/to_feed-i.yamlnu�[���PK�|[�<G\ri/1.8/system/RSS/Maker/RSS10/Channel/Cloud/cdesc-Cloud.yamlnu�[���PK�|[)iD�]ri/1.8/system/RSS/Maker/RSS10/Channel/Generator/cdesc-Generator.yamlnu�[���PK�|[�/��>=_ri/1.8/system/RSS/Maker/RSS10/Channel/Generator/to_feed-i.yamlnu�[���PK�|[u'���P~`ri/1.8/system/RSS/Maker/RSS10/Channel/Description/required_variable_names-i.yamlnu�[���PK�|[>}���@�ari/1.8/system/RSS/Maker/RSS10/Channel/Description/to_feed-i.yamlnu�[���PK�|[d��YYH-cri/1.8/system/RSS/Maker/RSS10/Channel/Description/cdesc-Description.yamlnu�[���PK�|[,߆���A�dri/1.8/system/RSS/Maker/RSS10/Channel/SkipDays/Day/cdesc-Day.yamlnu�[���PK�|[����=Ifri/1.8/system/RSS/Maker/RSS10/Channel/SkipDays/to_feed-i.yamlnu�[���PK�|[&�P<B�gri/1.8/system/RSS/Maker/RSS10/Channel/SkipDays/cdesc-SkipDays.yamlnu�[���PK�|[ϣ����Ciri/1.8/system/RSS/Maker/RSS10/Channel/Authors/Author/to_feed-i.yamlnu�[���PK�|[�5ZrFMjri/1.8/system/RSS/Maker/RSS10/Channel/Authors/Author/cdesc-Author.yamlnu�[���PK�|[V��s��<�kri/1.8/system/RSS/Maker/RSS10/Channel/Authors/to_feed-i.yamlnu�[���PK�|[��G@mri/1.8/system/RSS/Maker/RSS10/Channel/Authors/cdesc-Authors.yamlnu�[���PK�|[{}F�nri/1.8/system/RSS/Maker/RSS10/Channel/Categories/cdesc-Categories.yamlnu�[���PK�|[Mq"��Mpri/1.8/system/RSS/Maker/RSS10/Channel/Categories/Category/cdesc-Category.yamlnu�[���PK�|[߆���?~qri/1.8/system/RSS/Maker/RSS10/Channel/Categories/to_feed-i.yamlnu�[���PK�|[�
���G�rri/1.8/system/RSS/Maker/RSS10/Channel/not_set_required_variables-i.yamlnu�[���PK�|[������8tri/1.8/system/RSS/Maker/RSS10/Channel/setup_image-i.yamlnu�[���PK�|[/���YY.Duri/1.8/system/RSS/Maker/RSS10/cdesc-RSS10.yamlnu�[���PK�|[���Ӳ�4�vri/1.8/system/RSS/Maker/RSS10/Image/cdesc-Image.yamlnu�[���PK�|[�5�W��4yri/1.8/system/RSS/Maker/RSS10/Image/variables-i.yamlnu�[���PK�|[�\M���B4zri/1.8/system/RSS/Maker/RSS10/Image/required_variable_names-i.yamlnu�[���PK�|[>Q���B�{ri/1.8/system/RSS/Maker/RSS10/Image/have_required_values%3f-i.yamlnu�[���PK�|[�Q�r��2�|ri/1.8/system/RSS/Maker/RSS10/Image/to_feed-i.yamlnu�[���PK�|[���
��<�}ri/1.8/system/RSS/Maker/RSS10/Textinput/cdesc-Textinput.yamlnu�[���PK�|[{�%!��F�ri/1.8/system/RSS/Maker/RSS10/Textinput/required_variable_names-i.yamlnu�[���PK�|[Ǩr���F3�ri/1.8/system/RSS/Maker/RSS10/Textinput/have_required_values%3f-i.yamlnu�[���PK�|[�.
��6��ri/1.8/system/RSS/Maker/RSS10/Textinput/to_feed-i.yamlnu�[���PK�|[%p��(��ri/1.8/system/RSS/Maker/RSS10/new-c.yamlnu�[���PK�|[ȶ����3��ri/1.8/system/RSS/Maker/RSS10/setup_elements-i.yamlnu�[���PK�|[�x���.�ri/1.8/system/RSS/Maker/RSS10/make_feed-i.yamlnu�[���PK�|[$9���;��ri/1.8/system/RSS/Maker/AtomPersons/def_atom_persons-i.yamlnu�[���PK�|[b��:V�ri/1.8/system/RSS/Maker/AtomPersons/cdesc-AtomPersons.yamlnu�[���PK�|[Y�Ү�'��ri/1.8/system/RSS/Maker/versions-c.yamlnu�[���PK�|[�<����MƊri/1.8/system/RSS/Maker/RSS09/Items/Item/Title/required_variable_names-i.yamlnu�[���PK�|[�/W�KK?+�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Title/cdesc-Title.yamlnu�[���PK�|[��q��=�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Title/to_feed-i.yamlnu�[���PK�|[��X���R"�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Links/Link/required_variable_names-i.yamlnu�[���PK�|[ZA%��B��ri/1.8/system/RSS/Maker/RSS09/Items/Item/Links/Link/to_feed-i.yamlnu�[���PK�|[G�vOOCڑri/1.8/system/RSS/Maker/RSS09/Items/Item/Links/Link/cdesc-Link.yamlnu�[���PK�|[p�U�		?��ri/1.8/system/RSS/Maker/RSS09/Items/Item/Links/cdesc-Links.yamlnu�[���PK�|[�O���=�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Links/to_feed-i.yamlnu�[���PK�|[��گFQ�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Title/cdesc-Title.yamlnu�[���PK�|[����Dؗri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Title/to_feed-i.yamlnu�[���PK�|[�	ܫ��J �ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Links/Link/cdesc-Link.yamlnu�[���PK�|[�j9lF��ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Links/cdesc-Links.yamlnu�[���PK�|[����D�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Links/to_feed-i.yamlnu�[���PK�|[���LO�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Subtitle/cdesc-Subtitle.yamlnu�[���PK�|[(ν���G�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Subtitle/to_feed-i.yamlnu�[���PK�|[�B*D3�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Logo/cdesc-Logo.yamlnu�[���PK�|[���n��C��ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Logo/to_feed-i.yamlnu�[���PK�|[]A�,_��ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Contributors/Contributor/cdesc-Contributor.yamlnu�[���PK�|[�����K��ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Contributors/to_feed-i.yamlnu�[���PK�|[��G�&&T�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Contributors/cdesc-Contributors.yamlnu�[���PK�|[��n��>��ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/to_feed-i.yamlnu�[���PK�|[�.�u��EǨri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Rights/to_feed-i.yamlnu�[���PK�|[�p�OH�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Rights/cdesc-Rights.yamlnu�[���PK�|[M�;�N��ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Generator/cdesc-Generator.yamlnu�[���PK�|[I�E���H8�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Generator/to_feed-i.yamlnu�[���PK�|[�J6A��ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/cdesc-Source.yamlnu�[���PK�|[A_�*��C�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Icon/to_feed-i.yamlnu�[���PK�|[&�QDK�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Icon/cdesc-Icon.yamlnu�[���PK�|[)"���PͲri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Authors/Author/cdesc-Author.yamlnu�[���PK�|[9��p��F;�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Authors/to_feed-i.yamlnu�[���PK�|[���J��ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Authors/cdesc-Authors.yamlnu�[���PK�|[�C  P�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Categories/cdesc-Categories.yamlnu�[���PK�|[�����W��ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Categories/Category/cdesc-Category.yamlnu�[���PK�|[*�O���I6�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Source/Categories/to_feed-i.yamlnu�[���PK�|[�S���G��ri/1.8/system/RSS/Maker/RSS09/Items/Item/required_variable_names-i.yamlnu�[���PK�|[ɞ��X�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Contributors/Contributor/cdesc-Contributor.yamlnu�[���PK�|[o�}��Db�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Contributors/to_feed-i.yamlnu�[���PK�|[�7�uM��ri/1.8/system/RSS/Maker/RSS09/Items/Item/Contributors/cdesc-Contributors.yamlnu�[���PK�|[6�f��7H�ri/1.8/system/RSS/Maker/RSS09/Items/Item/to_feed-i.yamlnu�[���PK�|[:Ls���?r�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Content/to_feed-i.yamlnu�[���PK�|[�QI�C��ri/1.8/system/RSS/Maker/RSS09/Items/Item/Content/cdesc-Content.yamlnu�[���PK�|[b2�x��>5�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Rights/to_feed-i.yamlnu�[���PK�|[�N�|At�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Rights/cdesc-Rights.yamlnu�[���PK�|[�{r�G��ri/1.8/system/RSS/Maker/RSS09/Items/Item/Enclosure/cdesc-Enclosure.yamlnu�[���PK�|[&��G��A}�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Enclosure/to_feed-i.yamlnu�[���PK�|[��i���S��ri/1.8/system/RSS/Maker/RSS09/Items/Item/Description/required_variable_names-i.yamlnu�[���PK�|[y����C/�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Description/to_feed-i.yamlnu�[���PK�|[�/]]Kx�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Description/cdesc-Description.yamlnu�[���PK�|[R)��IP�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Authors/Author/cdesc-Author.yamlnu�[���PK�|[*T���?��ri/1.8/system/RSS/Maker/RSS09/Items/Item/Authors/to_feed-i.yamlnu�[���PK�|[3G�|C��ri/1.8/system/RSS/Maker/RSS09/Items/Item/Authors/cdesc-Authors.yamlnu�[���PK�|[c\�In�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Categories/cdesc-Categories.yamlnu�[���PK�|[������P��ri/1.8/system/RSS/Maker/RSS09/Items/Item/Categories/Category/cdesc-Category.yamlnu�[���PK�|[������Bn�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Categories/to_feed-i.yamlnu�[���PK�|[�v�=��ri/1.8/system/RSS/Maker/RSS09/Items/Item/Guid/cdesc-Guid.yamlnu�[���PK�|[w�K��<$�ri/1.8/system/RSS/Maker/RSS09/Items/Item/Guid/to_feed-i.yamlnu�[���PK�|[��{��8[�ri/1.8/system/RSS/Maker/RSS09/Items/Item/cdesc-Item.yamlnu�[���PK�|[�"D>��JJ�ri/1.8/system/RSS/Maker/RSS09/Items/Item/not_set_required_variables-i.yamlnu�[���PK�|[��Cs��4��ri/1.8/system/RSS/Maker/RSS09/Items/cdesc-Items.yamlnu�[���PK�|[@��o��2�ri/1.8/system/RSS/Maker/RSS09/Items/to_feed-i.yamlnu�[���PK�|[�n���J*�ri/1.8/system/RSS/Maker/RSS09/Channel/Title/required_variable_names-i.yamlnu�[���PK�|[y�cNGG<��ri/1.8/system/RSS/Maker/RSS09/Channel/Title/cdesc-Title.yamlnu�[���PK�|[$ߏe��:;�ri/1.8/system/RSS/Maker/RSS09/Channel/Title/to_feed-i.yamlnu�[���PK�|[i1�L��Ot�ri/1.8/system/RSS/Maker/RSS09/Channel/Links/Link/required_variable_names-i.yamlnu�[���PK�|[6�����?��ri/1.8/system/RSS/Maker/RSS09/Channel/Links/Link/to_feed-i.yamlnu�[���PK�|[�܃KK@!�ri/1.8/system/RSS/Maker/RSS09/Channel/Links/Link/cdesc-Link.yamlnu�[���PK�|[06W<��ri/1.8/system/RSS/Maker/RSS09/Channel/Links/cdesc-Links.yamlnu�[���PK�|[�e����:M�ri/1.8/system/RSS/Maker/RSS09/Channel/Links/to_feed-i.yamlnu�[���PK�|[@�ɺ��<��ri/1.8/system/RSS/Maker/RSS09/Channel/setup_textinput-i.yamlnu�[���PK�|[��s��6��ri/1.8/system/RSS/Maker/RSS09/Channel/variables-i.yamlnu�[���PK�|[�`���N��ri/1.8/system/RSS/Maker/RSS09/Channel/Copyright/required_variable_names-i.yamlnu�[���PK�|[�4���>O�ri/1.8/system/RSS/Maker/RSS09/Channel/Copyright/to_feed-i.yamlnu�[���PK�|[+إSSD��ri/1.8/system/RSS/Maker/RSS09/Channel/Copyright/cdesc-Copyright.yamlnu�[���PK�|[����DW�ri/1.8/system/RSS/Maker/RSS09/Channel/required_variable_names-i.yamlnu�[���PK�|[l D��ri/1.8/system/RSS/Maker/RSS09/Channel/SkipHours/cdesc-SkipHours.yamlnu�[���PK�|[�xH��S-�ri/1.8/system/RSS/Maker/RSS09/Channel/SkipHours/Hour/required_variable_names-i.yamlnu�[���PK�|['yu��C��ri/1.8/system/RSS/Maker/RSS09/Channel/SkipHours/Hour/to_feed-i.yamlnu�[���PK�|[^f�OOOD�ri/1.8/system/RSS/Maker/RSS09/Channel/SkipHours/Hour/cdesc-Hour.yamlnu�[���PK�|[�xT��>��ri/1.8/system/RSS/Maker/RSS09/Channel/SkipHours/to_feed-i.yamlnu�[���PK�|[�G��U�ri/1.8/system/RSS/Maker/RSS09/Channel/Contributors/Contributor/cdesc-Contributor.yamlnu�[���PK�|[�5�<��Ag�ri/1.8/system/RSS/Maker/RSS09/Channel/Contributors/to_feed-i.yamlnu�[���PK�|[�祽J��ri/1.8/system/RSS/Maker/RSS09/Channel/Contributors/cdesc-Contributors.yamlnu�[���PK�|[
i3j��8B�ri/1.8/system/RSS/Maker/RSS09/Channel/setup_items-i.yamlnu�[���PK�|[FүJcc8rri/1.8/system/RSS/Maker/RSS09/Channel/cdesc-Channel.yamlnu�[���PK�|[�Q��4=ri/1.8/system/RSS/Maker/RSS09/Channel/to_feed-i.yamlnu�[���PK�|[����:`ri/1.8/system/RSS/Maker/RSS09/Channel/Cloud/to_feed-i.yamlnu�[���PK�|[R�<�ri/1.8/system/RSS/Maker/RSS09/Channel/Cloud/cdesc-Cloud.yamlnu�[���PK�|[�s�Dri/1.8/system/RSS/Maker/RSS09/Channel/Generator/cdesc-Generator.yamlnu�[���PK�|[�w���>�ri/1.8/system/RSS/Maker/RSS09/Channel/Generator/to_feed-i.yamlnu�[���PK�|[
�w��P�	ri/1.8/system/RSS/Maker/RSS09/Channel/Description/required_variable_names-i.yamlnu�[���PK�|[}��1��@3ri/1.8/system/RSS/Maker/RSS09/Channel/Description/to_feed-i.yamlnu�[���PK�|[�YYHxri/1.8/system/RSS/Maker/RSS09/Channel/Description/cdesc-Description.yamlnu�[���PK�|[~�����QIri/1.8/system/RSS/Maker/RSS09/Channel/SkipDays/Day/required_variable_names-i.yamlnu�[���PK�|[K/��KKA�ri/1.8/system/RSS/Maker/RSS09/Channel/SkipDays/Day/cdesc-Day.yamlnu�[���PK�|[#�һ��Arri/1.8/system/RSS/Maker/RSS09/Channel/SkipDays/Day/to_feed-i.yamlnu�[���PK�|[�Ry���=�ri/1.8/system/RSS/Maker/RSS09/Channel/SkipDays/to_feed-i.yamlnu�[���PK�|[�K`�B�ri/1.8/system/RSS/Maker/RSS09/Channel/SkipDays/cdesc-SkipDays.yamlnu�[���PK�|[D��Z��Cvri/1.8/system/RSS/Maker/RSS09/Channel/Authors/Author/to_feed-i.yamlnu�[���PK�|[�&�F�ri/1.8/system/RSS/Maker/RSS09/Channel/Authors/Author/cdesc-Author.yamlnu�[���PK�|[����<Iri/1.8/system/RSS/Maker/RSS09/Channel/Authors/to_feed-i.yamlnu�[���PK�|[V*�y@�ri/1.8/system/RSS/Maker/RSS09/Channel/Authors/cdesc-Authors.yamlnu�[���PK�|[@Y��Fri/1.8/system/RSS/Maker/RSS09/Channel/Categories/cdesc-Categories.yamlnu�[���PK�|[̴E���M�ri/1.8/system/RSS/Maker/RSS09/Channel/Categories/Category/cdesc-Category.yamlnu�[���PK�|[@Y��?�ri/1.8/system/RSS/Maker/RSS09/Channel/Categories/to_feed-i.yamlnu�[���PK�|[lN��G/ri/1.8/system/RSS/Maker/RSS09/Channel/not_set_required_variables-i.yamlnu�[���PK�|[==���8� ri/1.8/system/RSS/Maker/RSS09/Channel/setup_image-i.yamlnu�[���PK�|[FUVzz4�!ri/1.8/system/RSS/Maker/RSS09/Image/cdesc-Image.yamlnu�[���PK�|[6Ά���B�#ri/1.8/system/RSS/Maker/RSS09/Image/required_variable_names-i.yamlnu�[���PK�|[�Y_���>�$ri/1.8/system/RSS/Maker/RSS09/Image/required_element%3f-i.yamlnu�[���PK�|[:!ƞ��2!&ri/1.8/system/RSS/Maker/RSS09/Image/to_feed-i.yamlnu�[���PK�|[H&�JJ<@'ri/1.8/system/RSS/Maker/RSS09/Textinput/cdesc-Textinput.yamlnu�[���PK�|[��1��F�(ri/1.8/system/RSS/Maker/RSS09/Textinput/required_variable_names-i.yamlnu�[���PK�|[fA\��6K*ri/1.8/system/RSS/Maker/RSS09/Textinput/to_feed-i.yamlnu�[���PK�|[��(��(r+ri/1.8/system/RSS/Maker/RSS09/new-c.yamlnu�[���PK�|[�:MYY.�,ri/1.8/system/RSS/Maker/RSS09/cdesc-RSS09.yamlnu�[���PK�|[h��0��3?.ri/1.8/system/RSS/Maker/RSS09/setup_elements-i.yamlnu�[���PK�|[�¸�.g/ri/1.8/system/RSS/Maker/RSS09/make_feed-i.yamlnu�[���PK�|[�ݖE>}0ri/1.8/system/RSS/Maker/TextinputBase/cdesc-TextinputBase.yamlnu�[���PK�|[�.W���+�1ri/1.8/system/RSS/Maker/RSSBase/make-c.yamlnu�[���PK�|[��X\��*3ri/1.8/system/RSS/Maker/RSSBase/new-c.yamlnu�[���PK�|[E2��

2"4ri/1.8/system/RSS/Maker/RSSBase/cdesc-RSSBase.yamlnu�[���PK�|[XޓT��.�7ri/1.8/system/RSS/Maker/RSSBase/to_feed-i.yamlnu�[���PK�|[F�v���;�8ri/1.8/system/RSS/Maker/RSSBase/make_xml_stylesheets-i.yamlnu�[���PK�|[O�ւ��+�9ri/1.8/system/RSS/Maker/RSSBase/make-i.yamlnu�[���PK�|[���=�:ri/1.8/system/RSS/Maker/TrackBackModel/append_features-c.yamlnu�[���PK�|[�r�W@7<ri/1.8/system/RSS/Maker/TrackBackModel/cdesc-TrackBackModel.yamlnu�[���PK�|[*�#���Y�=ri/1.8/system/RSS/Maker/TrackBackModel/TrackBackAboutsBase/cdesc-TrackBackAboutsBase.yamlnu�[���PK�|[�$�l#?ri/1.8/system/RSS/Maker/TrackBackModel/TrackBackAboutsBase/TrackBackAboutBase/have_required_values%3f-i.yamlnu�[���PK�|[�
� ��\�@ri/1.8/system/RSS/Maker/TrackBackModel/TrackBackAboutsBase/TrackBackAboutBase/to_feed-i.yamlnu�[���PK�|[F�r��k>Bri/1.8/system/RSS/Maker/TrackBackModel/TrackBackAboutsBase/TrackBackAboutBase/cdesc-TrackBackAboutBase.yamlnu�[���PK�|[G��8�Dri/1.8/system/RSS/Maker/SlashModel/cdesc-SlashModel.yamlnu�[���PK�|[�
�"��9�Eri/1.8/system/RSS/Maker/SlashModel/append_features-c.yamlnu�[���PK�|[s��S��:"Gri/1.8/system/RSS/Maker/AtomTextConstruct/variables-i.yamlnu�[���PK�|[o���HPHri/1.8/system/RSS/Maker/AtomTextConstruct/def_atom_text_construct-c.yamlnu�[���PK�|[6�	c��F�Iri/1.8/system/RSS/Maker/AtomTextConstruct/cdesc-AtomTextConstruct.yamlnu�[���PK�|[�����H�Kri/1.8/system/RSS/Maker/AtomTextConstruct/required_variable_names-i.yamlnu�[���PK�|[�B�n��C8Mri/1.8/system/RSS/Maker/SetupDefaultDate/_set_default_values-i.yamlnu�[���PK�|[5�ny��E�Nri/1.8/system/RSS/Maker/SetupDefaultDate/_parse_date_if_needed-i.yamlnu�[���PK�|[ŕ�0NND�Ori/1.8/system/RSS/Maker/SetupDefaultDate/cdesc-SetupDefaultDate.yamlnu�[���PK�|[�^~]]1�Qri/1.8/system/RSS/Maker/Atom/Feed/cdesc-Feed.yamlnu�[���PK�|[H{�K��KbSri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Links/Link/not_set_name-c.yamlnu�[���PK�|[�U<?HHG�Tri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Links/Link/cdesc-Link.yamlnu�[���PK�|[�����CxVri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Links/cdesc-Links.yamlnu�[���PK�|[C*�p��R�Wri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Links/Link/not_set_name-c.yamlnu�[���PK�|[C�?2PPN0Yri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Links/Link/cdesc-Link.yamlnu�[���PK�|[Tƍ���J�Zri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Links/cdesc-Links.yamlnu�[���PK�|[+�k{��D_\ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/variables-i.yamlnu�[���PK�|[%AjC��R�]ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/required_variable_names-i.yamlnu�[���PK�|[�DKIIH_ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Logo/cdesc-Logo.yamlnu�[���PK�|[���2��L�`ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Logo/not_set_name-c.yamlnu�[���PK�|[q�����B/bri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/to_feed-i.yamlnu�[���PK�|[�pwk]]R{cri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Generator/cdesc-Generator.yamlnu�[���PK�|[�����QZeri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Generator/not_set_name-c.yamlnu�[���PK�|[�4h���E�fri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/cdesc-Source.yamlnu�[���PK�|[q~E��W�hri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Icon/required_variable_names-i.yamlnu�[���PK�|[��it��G4jri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Icon/to_feed-i.yamlnu�[���PK�|[�ٚ�UUH�kri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Icon/cdesc-Icon.yamlnu�[���PK�|[�%k��TXmri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Categories/cdesc-Categories.yamlnu�[���PK�|[�_/ee[�nri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Categories/Category/cdesc-Category.yamlnu�[���PK�|[�	܏��[�pri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Source/Categories/Category/not_set_name-c.yamlnu�[���PK�|[���.��G:rri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/_set_default_values-i.yamlnu�[���PK�|[�)�
��=�sri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/variables-i.yamlnu�[���PK�|[�_*(��K�tri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/required_variable_names-i.yamlnu�[���PK�|[��<��K-vri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/have_required_values%3f-i.yamlnu�[���PK�|[�uT��;�wri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/to_feed-i.yamlnu�[���PK�|[H�5��E�xri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Content/variables-i.yamlnu�[���PK�|[������Szri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Content/required_variable_names-i.yamlnu�[���PK�|[�����Gw{ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Content/xml_type%3f-i.yamlnu�[���PK�|[FHC��C�|ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Content/to_feed-i.yamlnu�[���PK�|[T��G~ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Content/cdesc-Content.yamlnu�[���PK�|[�y��KD�ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Enclosure/cdesc-Enclosure.yamlnu�[���PK�|[�h,[��Eفri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Enclosure/to_feed-i.yamlnu�[���PK�|["x����M+�ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Categories/cdesc-Categories.yamlnu�[���PK�|[�zܛ]]T��ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Categories/Category/cdesc-Category.yamlnu�[���PK�|[�F����Tw�ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Categories/Category/not_set_name-c.yamlnu�[���PK�|[��a5A�ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Guid/cdesc-Guid.yamlnu�[���PK�|[����@\�ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/Guid/to_feed-i.yamlnu�[���PK�|[Bq#�>><��ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/cdesc-Item.yamlnu�[���PK�|[*�M���NN�ri/1.8/system/RSS/Maker/Atom/Feed/Items/Item/not_set_required_variables-i.yamlnu�[���PK�|[Y�A�8��ri/1.8/system/RSS/Maker/Atom/Feed/Items/cdesc-Items.yamlnu�[���PK�|[��e���6!�ri/1.8/system/RSS/Maker/Atom/Feed/Items/to_feed-i.yamlnu�[���PK�|[����HJ�ri/1.8/system/RSS/Maker/Atom/Feed/Channel/Links/Link/not_set_name-c.yamlnu�[���PK�|[k*}DDD��ri/1.8/system/RSS/Maker/Atom/Feed/Channel/Links/Link/cdesc-Link.yamlnu�[���PK�|[�W��@R�ri/1.8/system/RSS/Maker/Atom/Feed/Channel/Links/cdesc-Links.yamlnu�[���PK�|[��n��D��ri/1.8/system/RSS/Maker/Atom/Feed/Channel/_set_default_values-i.yamlnu�[���PK�|[X�����:�ri/1.8/system/RSS/Maker/Atom/Feed/Channel/variables-i.yamlnu�[���PK�|[� ���H!�ri/1.8/system/RSS/Maker/Atom/Feed/Channel/required_variable_names-i.yamlnu�[���PK�|[�s����C{�ri/1.8/system/RSS/Maker/Atom/Feed/Channel/variable_is_set%3f-i.yamlnu�[���PK�|[%�5�Hšri/1.8/system/RSS/Maker/Atom/Feed/Channel/SkipHours/cdesc-SkipHours.yamlnu�[���PK�|[��{��HP�ri/1.8/system/RSS/Maker/Atom/Feed/Channel/SkipHours/Hour/cdesc-Hour.yamlnu�[���PK�|[�����B��ri/1.8/system/RSS/Maker/Atom/Feed/Channel/SkipHours/to_feed-i.yamlnu�[���PK�|[���H�ri/1.8/system/RSS/Maker/Atom/Feed/Channel/have_required_values%3f-i.yamlnu�[���PK�|[2� {{<C�ri/1.8/system/RSS/Maker/Atom/Feed/Channel/cdesc-Channel.yamlnu�[���PK�|[ކ[��8*�ri/1.8/system/RSS/Maker/Atom/Feed/Channel/to_feed-i.yamlnu�[���PK�|[S4���>W�ri/1.8/system/RSS/Maker/Atom/Feed/Channel/Cloud/to_feed-i.yamlnu�[���PK�|[�

@��ri/1.8/system/RSS/Maker/Atom/Feed/Channel/Cloud/cdesc-Cloud.yamlnu�[���PK�|[}�t>QQH�ri/1.8/system/RSS/Maker/Atom/Feed/Channel/Generator/cdesc-Generator.yamlnu�[���PK�|[n���Gըri/1.8/system/RSS/Maker/Atom/Feed/Channel/Generator/not_set_name-c.yamlnu�[���PK�|[as^���E"�ri/1.8/system/RSS/Maker/Atom/Feed/Channel/SkipDays/Day/cdesc-Day.yamlnu�[���PK�|[�!��Av�ri/1.8/system/RSS/Maker/Atom/Feed/Channel/SkipDays/to_feed-i.yamlnu�[���PK�|[�h�F��ri/1.8/system/RSS/Maker/Atom/Feed/Channel/SkipDays/cdesc-SkipDays.yamlnu�[���PK�|[}Oݖ��J@�ri/1.8/system/RSS/Maker/Atom/Feed/Channel/Categories/cdesc-Categories.yamlnu�[���PK�|[�lYYQ��ri/1.8/system/RSS/Maker/Atom/Feed/Channel/Categories/Category/cdesc-Category.yamlnu�[���PK�|[.Ww���Q~�ri/1.8/system/RSS/Maker/Atom/Feed/Channel/Categories/Category/not_set_name-c.yamlnu�[���PK�|[��0���K�ri/1.8/system/RSS/Maker/Atom/Feed/Channel/not_set_required_variables-i.yamlnu�[���PK�|[n�:�CC8C�ri/1.8/system/RSS/Maker/Atom/Feed/Image/cdesc-Image.yamlnu�[���PK�|[��#��F�ri/1.8/system/RSS/Maker/Atom/Feed/Image/required_variable_names-i.yamlnu�[���PK�|[tDP��6D�ri/1.8/system/RSS/Maker/Atom/Feed/Image/to_feed-i.yamlnu�[���PK�|[����@m�ri/1.8/system/RSS/Maker/Atom/Feed/Textinput/cdesc-Textinput.yamlnu�[���PK�|[������,��ri/1.8/system/RSS/Maker/Atom/Feed/new-c.yamlnu�[���PK�|[zmS��7ٺri/1.8/system/RSS/Maker/Atom/Feed/setup_elements-i.yamlnu�[���PK�|[����2�ri/1.8/system/RSS/Maker/Atom/Feed/make_feed-i.yamlnu�[���PK�|[RD<�__3*�ri/1.8/system/RSS/Maker/Atom/Entry/cdesc-Entry.yamlnu�[���PK�|[�V����H�ri/1.8/system/RSS/Maker/Atom/Entry/Items/Item/_set_default_values-i.yamlnu�[���PK�|[��%���>I�ri/1.8/system/RSS/Maker/Atom/Entry/Items/Item/variables-i.yamlnu�[���PK�|[�)�9��L��ri/1.8/system/RSS/Maker/Atom/Entry/Items/Item/required_variable_names-i.yamlnu�[���PK�|[����G��ri/1.8/system/RSS/Maker/Atom/Entry/Items/Item/variable_is_set%3f-i.yamlnu�[���PK�|[zwx��<5�ri/1.8/system/RSS/Maker/Atom/Entry/Items/Item/to_feed-i.yamlnu�[���PK�|[2B~�@@=l�ri/1.8/system/RSS/Maker/Atom/Entry/Items/Item/cdesc-Item.yamlnu�[���PK�|[Ƴ����O�ri/1.8/system/RSS/Maker/Atom/Entry/Items/Item/not_set_required_variables-i.yamlnu�[���PK�|[b|�9��ri/1.8/system/RSS/Maker/Atom/Entry/Items/cdesc-Items.yamlnu�[���PK�|[_F��7��ri/1.8/system/RSS/Maker/Atom/Entry/Items/to_feed-i.yamlnu�[���PK�|[Ա�X��I�ri/1.8/system/RSS/Maker/Atom/Entry/Channel/SkipHours/cdesc-SkipHours.yamlnu�[���PK�|[��"y��I}�ri/1.8/system/RSS/Maker/Atom/Entry/Channel/SkipHours/Hour/cdesc-Hour.yamlnu�[���PK�|[�..B��=��ri/1.8/system/RSS/Maker/Atom/Entry/Channel/cdesc-Channel.yamlnu�[���PK�|[y"s���A?�ri/1.8/system/RSS/Maker/Atom/Entry/Channel/Cloud/cdesc-Cloud.yamlnu�[���PK�|[ڦ*RRI��ri/1.8/system/RSS/Maker/Atom/Entry/Channel/Generator/cdesc-Generator.yamlnu�[���PK�|[oM�6��HW�ri/1.8/system/RSS/Maker/Atom/Entry/Channel/Generator/not_set_name-c.yamlnu�[���PK�|[h��M��ri/1.8/system/RSS/Maker/Atom/Entry/Channel/Description/cdesc-Description.yamlnu�[���PK�|[%	���F�ri/1.8/system/RSS/Maker/Atom/Entry/Channel/SkipDays/Day/cdesc-Day.yamlnu�[���PK�|[B����Gg�ri/1.8/system/RSS/Maker/Atom/Entry/Channel/SkipDays/cdesc-SkipDays.yamlnu�[���PK�|[��e���9��ri/1.8/system/RSS/Maker/Atom/Entry/Image/cdesc-Image.yamlnu�[���PK�|[�D����A��ri/1.8/system/RSS/Maker/Atom/Entry/Textinput/cdesc-Textinput.yamlnu�[���PK�|[}h�1��-O�ri/1.8/system/RSS/Maker/Atom/Entry/new-c.yamlnu�[���PK�|[u�#|��8o�ri/1.8/system/RSS/Maker/Atom/Entry/setup_elements-i.yamlnu�[���PK�|[�����3��ri/1.8/system/RSS/Maker/Atom/Entry/make_feed-i.yamlnu�[���PK�|[�G���,��ri/1.8/system/RSS/Maker/Atom/cdesc-Atom.yamlnu�[���PK�|[։����?��ri/1.8/system/RSS/Maker/ITunesBaseModel/def_csv_accessor-i.yamlnu�[���PK�|[ǤO���E*�ri/1.8/system/RSS/Maker/ITunesBaseModel/def_yes_other_accessor-i.yamlnu�[���PK�|[�:G�LLJ��ri/1.8/system/RSS/Maker/ITunesBaseModel/def_elements_class_accessor-i.yamlnu�[���PK�|[ �]���AP�ri/1.8/system/RSS/Maker/ITunesBaseModel/def_class_accessor-i.yamlnu�[���PK�|[U4ϏB��ri/1.8/system/RSS/Maker/ITunesBaseModel/cdesc-ITunesBaseModel.yamlnu�[���PK�|[U<����K2�ri/1.8/system/RSS/Maker/ITunesBaseModel/def_yes_clean_other_accessor-i.yamlnu�[���PK�|[T����(��ri/1.8/system/RSS/Maker/add_maker-c.yamlnu�[���PK�|[m�{���B��ri/1.8/system/RSS/Maker/TaxonomyTopicsModel/append_features-c.yamlnu�[���PK�|[I=�G��F�ri/1.8/system/RSS/Maker/TaxonomyTopicsModel/install_taxo_topics-c.yamlnu�[���PK�|[�#S�11\j�ri/1.8/system/RSS/Maker/TaxonomyTopicsModel/TaxonomyTopicsBase/cdesc-TaxonomyTopicsBase.yamlnu�[���PK�|[{�4NNJ'�ri/1.8/system/RSS/Maker/TaxonomyTopicsModel/cdesc-TaxonomyTopicsModel.yamlnu�[���PK�|[�"�W��5�ri/1.8/system/RSS/Maker/ItemsBase/sort_if_need-i.yamlnu�[���PK�|[��\ǻ�2�ri/1.8/system/RSS/Maker/ItemsBase/normalize-i.yamlnu�[���PK�|[�*�˴�,3�ri/1.8/system/RSS/Maker/ItemsBase/new-c.yamlnu�[���PK�|[Jc�2LC�ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/xml_content%3d-i.yamlnu�[���PK�|[��,��M�ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/inline_other%3f-i.yamlnu�[���PK�|[�M�u

D�ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/xml%3d-i.yamlnu�[���PK�|[�>B��L��ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/out_of_line%3f-i.yamlnu�[���PK�|[ ����L�ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/inline_text%3f-i.yamlnu�[���PK�|[��~��MFri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/inline_xhtml%3f-i.yamlnu�[���PK�|[��2���R�ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/inline_other_text%3f-i.yamlnu�[���PK�|[�jp���Lri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/inline_html%3f-i.yamlnu�[���PK�|[��0��TWri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/inline_other_base64%3f-i.yamlnu�[���PK�|[yS���Q�ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/inline_other_xml%3f-i.yamlnu�[���PK�|[�D�bbbM&ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ContentBase/cdesc-ContentBase.yamlnu�[���PK�|[^�w((Uri/1.8/system/RSS/Maker/ItemsBase/ItemBase/DescriptionBase/cdesc-DescriptionBase.yamlnu�[���PK�|[Ǭ���;�
ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/%3c%3d%3e-i.yamlnu�[���PK�|[������G�ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/GuidBase/cdesc-GuidBase.yamlnu�[���PK�|[H;���9.ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/date%3d-i.yamlnu�[���PK�|[������<Yri/1.8/system/RSS/Maker/ItemsBase/ItemBase/updated%3d-i.yamlnu�[���PK�|[!'C�I�ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/TitleBase/cdesc-TitleBase.yamlnu�[���PK�|[�u���9!ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/pubDate-i.yamlnu�[���PK�|[$hs���QKri/1.8/system/RSS/Maker/ItemsBase/ItemBase/EnclosureBase/cdesc-EnclosureBase.yamlnu�[���PK�|[��m��S�ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/ITunesDuration/cdesc-ITunesDuration.yamlnu�[���PK�|[N��u\\>+ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/cdesc-ItemBase.yamlnu�[���PK�|[
}���<�ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/pubDate%3d-i.yamlnu�[���PK�|[%��K(ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/RightsBase/cdesc-RightsBase.yamlnu�[���PK�|[n�x���9� ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/updated-i.yamlnu�[���PK�|[�-T�..Z�!ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/SourceBase/SubtitleBase/cdesc-SubtitleBase.yamlnu�[���PK�|[�����R�#ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/SourceBase/IconBase/cdesc-IconBase.yamlnu�[���PK�|[�x���K
%ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/SourceBase/cdesc-SourceBase.yamlnu�[���PK�|[)?�\��D)ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/SourceBase/date%3d-i.yamlnu�[���PK�|[��/���G]*ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/SourceBase/updated%3d-i.yamlnu�[���PK�|[v�N((T�+ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/SourceBase/TitleBase/cdesc-TitleBase.yamlnu�[���PK�|[��k**VS-ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/SourceBase/RightsBase/cdesc-RightsBase.yamlnu�[���PK�|[-�l���D/ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/SourceBase/updated-i.yamlnu�[���PK�|[��H��RD0ri/1.8/system/RSS/Maker/ItemsBase/ItemBase/SourceBase/LogoBase/cdesc-LogoBase.yamlnu�[���PK�|[Y3 M��6�1ri/1.8/system/RSS/Maker/ItemsBase/cdesc-ItemsBase.yamlnu�[���PK�|[.^���I�3ri/1.8/system/RSS/Maker/RSS20/Items/Item/Source/Links/Link/to_feed-i.yamlnu�[���PK�|[�T^f44JO5ri/1.8/system/RSS/Maker/RSS20/Items/Item/Source/Links/Link/cdesc-Link.yamlnu�[���PK�|[�i��))F�6ri/1.8/system/RSS/Maker/RSS20/Items/Item/Source/Links/cdesc-Links.yamlnu�[���PK�|[�z7���D�8ri/1.8/system/RSS/Maker/RSS20/Items/Item/Source/Links/to_feed-i.yamlnu�[���PK�|[�o��N�9ri/1.8/system/RSS/Maker/RSS20/Items/Item/Source/required_variable_names-i.yamlnu�[���PK�|[�JA���>Q;ri/1.8/system/RSS/Maker/RSS20/Items/Item/Source/to_feed-i.yamlnu�[���PK�|[��^^A�<ri/1.8/system/RSS/Maker/RSS20/Items/Item/Source/cdesc-Source.yamlnu�[���PK�|[M�����9_>ri/1.8/system/RSS/Maker/RSS20/Items/Item/variables-i.yamlnu�[���PK�|[|���G�?ri/1.8/system/RSS/Maker/RSS20/Items/Item/required_variable_names-i.yamlnu�[���PK�|[�Z3ggG�@ri/1.8/system/RSS/Maker/RSS20/Items/Item/Enclosure/cdesc-Enclosure.yamlnu�[���PK�|[���B��Q�Bri/1.8/system/RSS/Maker/RSS20/Items/Item/Enclosure/required_variable_names-i.yamlnu�[���PK�|[�^���A0Dri/1.8/system/RSS/Maker/RSS20/Items/Item/Enclosure/to_feed-i.yamlnu�[���PK�|[(��F��FuEri/1.8/system/RSS/Maker/RSS20/Items/Item/Authors/Author/to_feed-i.yamlnu�[���PK�|[<͟g..I�Fri/1.8/system/RSS/Maker/RSS20/Items/Item/Authors/Author/cdesc-Author.yamlnu�[���PK�|[b�����?lHri/1.8/system/RSS/Maker/RSS20/Items/Item/Authors/to_feed-i.yamlnu�[���PK�|[geHC�Iri/1.8/system/RSS/Maker/RSS20/Items/Item/Authors/cdesc-Authors.yamlnu�[���PK�|[���]((I?Kri/1.8/system/RSS/Maker/RSS20/Items/Item/Categories/cdesc-Categories.yamlnu�[���PK�|[H��||P�Lri/1.8/system/RSS/Maker/RSS20/Items/Item/Categories/Category/cdesc-Category.yamlnu�[���PK�|[���9��[�Nri/1.8/system/RSS/Maker/RSS20/Items/Item/Categories/Category/required_variable_names-i.yamlnu�[���PK�|[�KS��K^Pri/1.8/system/RSS/Maker/RSS20/Items/Item/Categories/Category/to_feed-i.yamlnu�[���PK�|[�U\���B�Qri/1.8/system/RSS/Maker/RSS20/Items/Item/Categories/to_feed-i.yamlnu�[���PK�|[�����L�Rri/1.8/system/RSS/Maker/RSS20/Items/Item/Guid/required_variable_names-i.yamlnu�[���PK�|[�Ɋ�XX=bTri/1.8/system/RSS/Maker/RSS20/Items/Item/Guid/cdesc-Guid.yamlnu�[���PK�|[�;}k��<'Vri/1.8/system/RSS/Maker/RSS20/Items/Item/Guid/to_feed-i.yamlnu�[���PK�|[��W��8bWri/1.8/system/RSS/Maker/RSS20/Items/Item/cdesc-Item.yamlnu�[���PK�|[F٪��J]Yri/1.8/system/RSS/Maker/RSS20/Items/Item/not_set_required_variables-i.yamlnu�[���PK�|[�q�=��4�Zri/1.8/system/RSS/Maker/RSS20/Items/cdesc-Items.yamlnu�[���PK�|[\8N��D�[ri/1.8/system/RSS/Maker/RSS20/Channel/required_variable_names-i.yamlnu�[���PK�|[����DC]ri/1.8/system/RSS/Maker/RSS20/Channel/SkipHours/cdesc-SkipHours.yamlnu�[���PK�|[0���D�^ri/1.8/system/RSS/Maker/RSS20/Channel/SkipHours/Hour/cdesc-Hour.yamlnu�[���PK�|[Es8`ri/1.8/system/RSS/Maker/RSS20/Channel/cdesc-Channel.yamlnu�[���PK�|[B��U��J�ari/1.8/system/RSS/Maker/RSS20/Channel/Cloud/required_variable_names-i.yamlnu�[���PK�|[?�~���:�bri/1.8/system/RSS/Maker/RSS20/Channel/Cloud/to_feed-i.yamlnu�[���PK�|[�>
�SS<"dri/1.8/system/RSS/Maker/RSS20/Channel/Cloud/cdesc-Cloud.yamlnu�[���PK�|[��(	��N�eri/1.8/system/RSS/Maker/RSS20/Channel/Generator/required_variable_names-i.yamlnu�[���PK�|[W�{�SSDGgri/1.8/system/RSS/Maker/RSS20/Channel/Generator/cdesc-Generator.yamlnu�[���PK�|[�19���>iri/1.8/system/RSS/Maker/RSS20/Channel/Generator/to_feed-i.yamlnu�[���PK�|[�Kb���AOjri/1.8/system/RSS/Maker/RSS20/Channel/SkipDays/Day/cdesc-Day.yamlnu�[���PK�|[Aj���B�kri/1.8/system/RSS/Maker/RSS20/Channel/SkipDays/cdesc-SkipDays.yamlnu�[���PK�|[y�X�  F
mri/1.8/system/RSS/Maker/RSS20/Channel/Categories/cdesc-Categories.yamlnu�[���PK�|[3���ttM�nri/1.8/system/RSS/Maker/RSS20/Channel/Categories/Category/cdesc-Category.yamlnu�[���PK�|[����X�pri/1.8/system/RSS/Maker/RSS20/Channel/Categories/Category/required_variable_names-i.yamlnu�[���PK�|[�i����Hrri/1.8/system/RSS/Maker/RSS20/Channel/Categories/Category/to_feed-i.yamlnu�[���PK�|[�۽=��?esri/1.8/system/RSS/Maker/RSS20/Channel/Categories/to_feed-i.yamlnu�[���PK�|[c7���.�tri/1.8/system/RSS/Maker/RSS20/cdesc-RSS20.yamlnu�[���PK�|[�@o		4�uri/1.8/system/RSS/Maker/RSS20/Image/cdesc-Image.yamlnu�[���PK�|[�5���>`wri/1.8/system/RSS/Maker/RSS20/Image/required_element%3f-i.yamlnu�[���PK�|[}ؖ���<�xri/1.8/system/RSS/Maker/RSS20/Textinput/cdesc-Textinput.yamlnu�[���PK�|[��`Y��(�yri/1.8/system/RSS/Maker/RSS20/new-c.yamlnu�[���PK�|[8����J�zri/1.8/system/RSS/Maker/ChannelBase/LinksBase/LinkBase/cdesc-LinkBase.yamlnu�[���PK�|[#����BS|ri/1.8/system/RSS/Maker/ChannelBase/LinksBase/cdesc-LinksBase.yamlnu�[���PK�|[��E^  N�}ri/1.8/system/RSS/Maker/ChannelBase/DescriptionBase/cdesc-DescriptionBase.yamlnu�[���PK�|[�t��29ri/1.8/system/RSS/Maker/ChannelBase/icon%3d-i.yamlnu�[���PK�|[<�t���FS�ri/1.8/system/RSS/Maker/ChannelBase/ITunesImage/cdesc-ITunesImage.yamlnu�[���PK�|[U5T���J��ri/1.8/system/RSS/Maker/ChannelBase/GeneratorBase/cdesc-GeneratorBase.yamlnu�[���PK�|[S�ߞ��;�ri/1.8/system/RSS/Maker/ChannelBase/lastBuildDate%3d-i.yamlnu�[���PK�|[0t���F=�ri/1.8/system/RSS/Maker/ChannelBase/ITunesOwner/cdesc-ITunesOwner.yamlnu�[���PK�|[�f����B��ri/1.8/system/RSS/Maker/ChannelBase/CloudBase/cdesc-CloudBase.yamlnu�[���PK�|[N����2�ri/1.8/system/RSS/Maker/ChannelBase/logo%3d-i.yamlnu�[���PK�|[�j��/��ri/1.8/system/RSS/Maker/ChannelBase/icon-i.yamlnu�[���PK�|[��w���/�ri/1.8/system/RSS/Maker/ChannelBase/logo-i.yamlnu�[���PK�|[�t�J�ri/1.8/system/RSS/Maker/ChannelBase/CopyrightBase/cdesc-CopyrightBase.yamlnu�[���PK�|[��QO��P��ri/1.8/system/RSS/Maker/ChannelBase/ITunesCategories/cdesc-ITunesCategories.yamlnu�[���PK�|[CE�KK](�ri/1.8/system/RSS/Maker/ChannelBase/ITunesCategories/ITunesCategory/cdesc-ITunesCategory.yamlnu�[���PK�|[�f����2�ri/1.8/system/RSS/Maker/ChannelBase/date%3d-i.yamlnu�[���PK�|[��O��5�ri/1.8/system/RSS/Maker/ChannelBase/updated%3d-i.yamlnu�[���PK�|[�`p55:@�ri/1.8/system/RSS/Maker/ChannelBase/cdesc-ChannelBase.yamlnu�[���PK�|[Qa?�Bߕri/1.8/system/RSS/Maker/ChannelBase/TitleBase/cdesc-TitleBase.yamlnu�[���PK�|[��8��2e�ri/1.8/system/RSS/Maker/ChannelBase/pubDate-i.yamlnu�[���PK�|[�B|���W��ri/1.8/system/RSS/Maker/ChannelBase/CategoriesBase/CategoryBase/cdesc-CategoryBase.yamlnu�[���PK�|[��X��L�ri/1.8/system/RSS/Maker/ChannelBase/CategoriesBase/cdesc-CategoriesBase.yamlnu�[���PK�|[H�D���NO�ri/1.8/system/RSS/Maker/ChannelBase/SkipHoursBase/HourBase/cdesc-HourBase.yamlnu�[���PK�|[�-e��J��ri/1.8/system/RSS/Maker/ChannelBase/SkipHoursBase/cdesc-SkipHoursBase.yamlnu�[���PK�|[�gS44_�ri/1.8/system/RSS/Maker/ChannelBase/ContributorsBase/ContributorBase/cdesc-ContributorBase.yamlnu�[���PK�|[b��~��P˟ri/1.8/system/RSS/Maker/ChannelBase/ContributorsBase/cdesc-ContributorsBase.yamlnu�[���PK�|[��ZW��K/�ri/1.8/system/RSS/Maker/ChannelBase/SkipDaysBase/DayBase/cdesc-DayBase.yamlnu�[���PK�|[b�`��H��ri/1.8/system/RSS/Maker/ChannelBase/SkipDaysBase/cdesc-SkipDaysBase.yamlnu�[���PK�|[!/��5ޣri/1.8/system/RSS/Maker/ChannelBase/pubDate%3d-i.yamlnu�[���PK�|[O5+��2�ri/1.8/system/RSS/Maker/ChannelBase/updated-i.yamlnu�[���PK�|[�	8���F�ri/1.8/system/RSS/Maker/ChannelBase/AuthorsBase/cdesc-AuthorsBase.yamlnu�[���PK�|[�c�5%%Pm�ri/1.8/system/RSS/Maker/ChannelBase/AuthorsBase/AuthorBase/cdesc-AuthorBase.yamlnu�[���PK�|[P����S�ri/1.8/system/RSS/Maker/XMLStyleSheets/XMLStyleSheet/required_variable_names-i.yamlnu�[���PK�|[�v����N��ri/1.8/system/RSS/Maker/XMLStyleSheets/XMLStyleSheet/guess_type_if_need-i.yamlnu�[���PK�|[��+���C�ri/1.8/system/RSS/Maker/XMLStyleSheets/XMLStyleSheet/to_feed-i.yamlnu�[���PK�|[x ���M&�ri/1.8/system/RSS/Maker/XMLStyleSheets/XMLStyleSheet/cdesc-XMLStyleSheet.yamlnu�[���PK�|[��]���@2�ri/1.8/system/RSS/Maker/XMLStyleSheets/cdesc-XMLStyleSheets.yamlnu�[���PK�|[�����Fu�ri/1.8/system/RSS/Maker/ImageFaviconModel/install_image_favicon-c.yamlnu�[���PK�|[�[fW��@˱ri/1.8/system/RSS/Maker/ImageFaviconModel/append_features-c.yamlnu�[���PK�|[�y�LLF�ri/1.8/system/RSS/Maker/ImageFaviconModel/cdesc-ImageFaviconModel.yamlnu�[���PK�|[��k]��YѴri/1.8/system/RSS/Maker/ImageFaviconModel/ImageFaviconBase/have_required_values%3f-i.yamlnu�[���PK�|[x~��IG�ri/1.8/system/RSS/Maker/ImageFaviconModel/ImageFaviconBase/to_feed-i.yamlnu�[���PK�|[����V��ri/1.8/system/RSS/Maker/ImageFaviconModel/ImageFaviconBase/cdesc-ImageFaviconBase.yamlnu�[���PK�|[�û��(@�ri/1.8/system/RSS/Maker/cdesc-Maker.yamlnu�[���PK�|[��GV<��ri/1.8/system/RSS/Maker/ContentModel/cdesc-ContentModel.yamlnu�[���PK�|[B���;�ri/1.8/system/RSS/Maker/ContentModel/append_features-c.yamlnu�[���PK�|[�v��%-�ri/1.8/system/RSS/Maker/makers-c.yamlnu�[���PK�|[ಓ���3,�ri/1.8/system/RSS/NotAvailableValueError/new-c.yamlnu�[���PK�|[�����J]�ri/1.8/system/RSS/NotAvailableValueError/cdesc-NotAvailableValueError.yamlnu�[���PK�|[g_#II>��ri/1.8/system/RSS/Atom/Feed/Contributor/cdesc-Contributor.yamlnu�[���PK�|[4����7_�ri/1.8/system/RSS/Atom/Feed/setup_maker_elements-i.yamlnu�[���PK�|[��&6>>+��ri/1.8/system/RSS/Atom/Feed/cdesc-Feed.yamlnu�[���PK�|[��;;22�ri/1.8/system/RSS/Atom/Feed/Title/cdesc-Title.yamlnu�[���PK�|[��??4��ri/1.8/system/RSS/Atom/Feed/Author/cdesc-Author.yamlnu�[���PK�|[�.v��0r�ri/1.8/system/RSS/Atom/Feed/atom_validate-i.yamlnu�[���PK�|[��AA8��ri/1.8/system/RSS/Atom/Feed/Subtitle/cdesc-Subtitle.yamlnu�[���PK�|[�V��440Z�ri/1.8/system/RSS/Atom/Feed/Link/cdesc-Link.yamlnu�[���PK�|[�6M��4��ri/1.8/system/RSS/Atom/Feed/Link/maker_target-i.yamlnu�[���PK�|[�mp��2�ri/1.8/system/RSS/Atom/Feed/Entry/cdesc-Entry.yamlnu�[���PK�|[`u./��:M�ri/1.8/system/RSS/Atom/Feed/Entry/Source/cdesc-Source.yamlnu�[���PK�|[G�����>��ri/1.8/system/RSS/Atom/Feed/Entry/Source/have_author%3f-i.yamlnu�[���PK�|[#�����6��ri/1.8/system/RSS/Atom/Feed/Entry/atom_validate-i.yamlnu�[���PK�|[��JJ@#�ri/1.8/system/RSS/Atom/Feed/Entry/Published/cdesc-Published.yamlnu�[���PK�|[�K8���B��ri/1.8/system/RSS/Atom/Feed/Entry/have_required_elements%3f-i.yamlnu�[���PK�|[��*���@(�ri/1.8/system/RSS/Atom/Feed/Entry/Content/inline_other%3f-i.yamlnu�[���PK�|[3(�G��;e�ri/1.8/system/RSS/Atom/Feed/Entry/Content/mime_split-i.yamlnu�[���PK�|[�~����>��ri/1.8/system/RSS/Atom/Feed/Entry/Content/atom_validate-i.yamlnu�[���PK�|[yX�O��?��ri/1.8/system/RSS/Atom/Feed/Entry/Content/out_of_line%3f-i.yamlnu�[���PK�|[ݝ�e��4-�ri/1.8/system/RSS/Atom/Feed/Entry/Content/xml-i.yamlnu�[���PK�|[������?J�ri/1.8/system/RSS/Atom/Feed/Entry/Content/inline_text%3f-i.yamlnu�[���PK�|[2a:���@��ri/1.8/system/RSS/Atom/Feed/Entry/Content/inline_xhtml%3f-i.yamlnu�[���PK�|[��pb��A��ri/1.8/system/RSS/Atom/Feed/Entry/Content/empty_content%3f-i.yamlnu�[���PK�|[�(L��E�ri/1.8/system/RSS/Atom/Feed/Entry/Content/inline_other_text%3f-i.yamlnu�[���PK�|[b�P��DN�ri/1.8/system/RSS/Atom/Feed/Entry/Content/have_xml_content%3f-i.yamlnu�[���PK�|[����?��ri/1.8/system/RSS/Atom/Feed/Entry/Content/inline_html%3f-i.yamlnu�[���PK�|[�T�7��<��ri/1.8/system/RSS/Atom/Feed/Entry/Content/cdesc-Content.yamlnu�[���PK�|[P
��G4�ri/1.8/system/RSS/Atom/Feed/Entry/Content/inline_other_base64%3f-i.yamlnu�[���PK�|[�x����F��ri/1.8/system/RSS/Atom/Feed/Entry/Content/need_base64_encode%3f-i.yamlnu�[���PK�|[���D�ri/1.8/system/RSS/Atom/Feed/Entry/Content/inline_other_xml%3f-i.yamlnu�[���PK�|[u;�E��;�ri/1.8/system/RSS/Atom/Feed/Entry/Content/xml_getter-c.yamlnu�[���PK�|[d�4\��;P�ri/1.8/system/RSS/Atom/Feed/Entry/Content/xml_setter-c.yamlnu�[���PK�|[�9'��6��ri/1.8/system/RSS/Atom/Feed/Entry/Content/xhtml-i.yamlnu�[���PK�|[(NK���5��ri/1.8/system/RSS/Atom/Feed/Entry/maker_target-i.yamlnu�[���PK�|[3eFF<�ri/1.8/system/RSS/Atom/Feed/Entry/Summary/cdesc-Summary.yamlnu�[���PK�|[�����7�ri/1.8/system/RSS/Atom/Feed/Entry/have_author%3f-i.yamlnu�[���PK�|[~m	C��<�ri/1.8/system/RSS/Atom/Feed/have_required_elements%3f-i.yamlnu�[���PK�|[�y6���&�ri/1.8/system/RSS/Atom/Feed/new-c.yamlnu�[���PK�|[�<�*��0$ri/1.8/system/RSS/Atom/Feed/Logo/cdesc-Logo.yamlnu�[���PK�|[�js��B8ri/1.8/system/RSS/Atom/Feed/Logo/setup_maker_element_writer-i.yamlnu�[���PK�|[.�c&��4�ri/1.8/system/RSS/Atom/Feed/Logo/maker_target-i.yamlnu�[���PK�|[Ah>�<<8�ri/1.8/system/RSS/Atom/Feed/Category/cdesc-Category.yamlnu�[���PK�|[b r��8W
ri/1.8/system/RSS/Atom/Feed/Category/maker_target-i.yamlnu�[���PK�|[�����6�ri/1.8/system/RSS/Atom/Feed/setup_maker_element-i.yamlnu�[���PK�|[)ET��/�ri/1.8/system/RSS/Atom/Feed/maker_target-i.yamlnu�[���PK�|[d��==4�
ri/1.8/system/RSS/Atom/Feed/Rights/cdesc-Rights.yamlnu�[���PK�|[]T���:�ri/1.8/system/RSS/Atom/Feed/Generator/cdesc-Generator.yamlnu�[���PK�|[��q���Cmri/1.8/system/RSS/Atom/Feed/Generator/setup_maker_attributes-i.yamlnu�[���PK�|[��o�;;0�ri/1.8/system/RSS/Atom/Feed/Icon/cdesc-Icon.yamlnu�[���PK�|[ih�'77,\ri/1.8/system/RSS/Atom/Feed/Id/cdesc-Id.yamlnu�[���PK�|[�c��??6�ri/1.8/system/RSS/Atom/Feed/Updated/cdesc-Updated.yamlnu�[���PK�|[�ZHͻ�1�ri/1.8/system/RSS/Atom/Feed/have_author%3f-i.yamlnu�[���PK�|[�^o��=�ri/1.8/system/RSS/Atom/TextConstruct/cdesc-TextConstruct.yamlnu�[���PK�|[xL�O��9�ri/1.8/system/RSS/Atom/TextConstruct/atom_validate-i.yamlnu�[���PK�|[:�����;0ri/1.8/system/RSS/Atom/TextConstruct/append_features-c.yamlnu�[���PK�|[Ϭ���?jri/1.8/system/RSS/Atom/TextConstruct/have_xml_content%3f-i.yamlnu�[���PK�|[��P��8�ri/1.8/system/RSS/Atom/TextConstruct/maker_target-i.yamlnu�[���PK�|[��-1��B� ri/1.8/system/RSS/Atom/TextConstruct/setup_maker_attributes-i.yamlnu�[���PK�|[�����6+"ri/1.8/system/RSS/Atom/TextConstruct/xml_getter-c.yamlnu�[���PK�|[�U����6Q#ri/1.8/system/RSS/Atom/TextConstruct/xml_setter-c.yamlnu�[���PK�|[1p��1w$ri/1.8/system/RSS/Atom/TextConstruct/xhtml-i.yamlnu�[���PK�|[�����K�%ri/1.8/system/RSS/Atom/DuplicateLinkChecker/validate_duplicate_links-i.yamlnu�[���PK�|[T]!K�&ri/1.8/system/RSS/Atom/DuplicateLinkChecker/cdesc-DuplicateLinkChecker.yamlnu�[���PK�|[0W���9�(ri/1.8/system/RSS/Atom/CommonModel/append_features-c.yamlnu�[���PK�|[^�=��9�)ri/1.8/system/RSS/Atom/CommonModel/cdesc-CommonModel.yamlnu�[���PK�|[I����8,ri/1.8/system/RSS/Atom/CommonModel/need_parent%3f-c.yamlnu�[���PK�|[��X��6G-ri/1.8/system/RSS/Atom/CommonModel/required_uri-c.yamlnu�[���PK�|[QR���/o.ri/1.8/system/RSS/Atom/Entry/setup_maker-i.yamlnu�[���PK�|[YY..-�/ri/1.8/system/RSS/Atom/Entry/cdesc-Entry.yamlnu�[���PK�|[v����17ri/1.8/system/RSS/Atom/Entry/atom_validate-i.yamlnu�[���PK�|[Տ�F��=Y8ri/1.8/system/RSS/Atom/Entry/have_required_elements%3f-i.yamlnu�[���PK�|[e�����'�9ri/1.8/system/RSS/Atom/Entry/new-c.yamlnu�[���PK�|[%4��0�:ri/1.8/system/RSS/Atom/Entry/maker_target-i.yamlnu�[���PK�|[؀���)�;ri/1.8/system/RSS/Atom/Entry/items-i.yamlnu�[���PK�|[=e-��2�<ri/1.8/system/RSS/Atom/Entry/have_author%3f-i.yamlnu�[���PK�|[�;Gxx&
>ri/1.8/system/RSS/Atom/cdesc-Atom.yamlnu�[���PK�|[acc7EE=�?ri/1.8/system/RSS/Atom/PersonConstruct/Email/cdesc-Email.yamlnu�[���PK�|[�@WCC;�Ari/1.8/system/RSS/Atom/PersonConstruct/Name/cdesc-Name.yamlnu�[���PK�|[�|�^DD98Cri/1.8/system/RSS/Atom/PersonConstruct/Uri/cdesc-Uri.yamlnu�[���PK�|[��k��=�Dri/1.8/system/RSS/Atom/PersonConstruct/append_features-c.yamlnu�[���PK�|[�*t;;A#Fri/1.8/system/RSS/Atom/PersonConstruct/cdesc-PersonConstruct.yamlnu�[���PK�|[��*��:�Gri/1.8/system/RSS/Atom/PersonConstruct/maker_target-i.yamlnu�[���PK�|[�1���=Iri/1.8/system/RSS/Atom/URIContentModel/append_features-c.yamlnu�[���PK�|[��Z<<ACJri/1.8/system/RSS/Atom/URIContentModel/cdesc-URIContentModel.yamlnu�[���PK�|[��~��;�Kri/1.8/system/RSS/Atom/ContentModel/cdesc-ContentModel.yamlnu�[���PK�|[,(�o��DNri/1.8/system/RSS/Atom/ContentModel/ClassMethods/content_type-i.yamlnu�[���PK�|[�<�tHXOri/1.8/system/RSS/Atom/ContentModel/ClassMethods/cdesc-ClassMethods.yamlnu�[���PK�|[₿���:�Pri/1.8/system/RSS/Atom/ContentModel/append_features-c.yamlnu�[���PK�|[��Tu��ERri/1.8/system/RSS/Atom/ContentModel/setup_maker_element_writer-i.yamlnu�[���PK�|[U�Ox��>iSri/1.8/system/RSS/Atom/ContentModel/setup_maker_element-i.yamlnu�[���PK�|[hݍ���7�Tri/1.8/system/RSS/Atom/ContentModel/maker_target-i.yamlnu�[���PK�|[�5-���9�Uri/1.8/system/RSS/Atom/DateConstruct/atom_validate-i.yamlnu�[���PK�|['v�
��;/Wri/1.8/system/RSS/Atom/DateConstruct/append_features-c.yamlnu�[���PK�|[U8Jmm=iXri/1.8/system/RSS/Atom/DateConstruct/cdesc-DateConstruct.yamlnu�[���PK�|[��
AA<CZri/1.8/system/RSS/ITunesBaseModel/cdesc-ITunesBaseModel.yamlnu�[���PK�|[s���>�\ri/1.8/system/RSS/ImageModelUtils/validate_one_tag_name-i.yamlnu�[���PK�|[Q]<R^ri/1.8/system/RSS/ImageModelUtils/cdesc-ImageModelUtils.yamlnu�[���PK�|[�b�o��%�_ri/1.8/system/RSS/RDF/Item/new-c.yamlnu�[���PK�|[ᛛl��.�`ri/1.8/system/RSS/RDF/Item/maker_target-i.yamlnu�[���PK�|[4��=��.�ari/1.8/system/RSS/RDF/Item/required_uri-c.yamlnu�[���PK�|[	C���*�bri/1.8/system/RSS/RDF/Item/cdesc-Item.yamlnu�[���PK�|[��Sn48fri/1.8/system/RSS/RDF/Channel/Items/cdesc-Items.yamlnu�[���PK�|[Z��7��4�hri/1.8/system/RSS/RDF/Channel/Items/resources-i.yamlnu�[���PK�|[-���.�iri/1.8/system/RSS/RDF/Channel/Items/new-c.yamlnu�[���PK�|[F���7�jri/1.8/system/RSS/RDF/Channel/Items/required_uri-c.yamlnu�[���PK�|[`CN[[4lri/1.8/system/RSS/RDF/Channel/Image/cdesc-Image.yamlnu�[���PK�|[>��O��.�mri/1.8/system/RSS/RDF/Channel/Image/new-c.yamlnu�[���PK�|[.�����7�nri/1.8/system/RSS/RDF/Channel/Image/required_uri-c.yamlnu�[���PK�|[~:��cc<pri/1.8/system/RSS/RDF/Channel/Textinput/cdesc-Textinput.yamlnu�[���PK�|[Vnñ��2�qri/1.8/system/RSS/RDF/Channel/Textinput/new-c.yamlnu�[���PK�|[��_��;sri/1.8/system/RSS/RDF/Channel/Textinput/required_uri-c.yamlnu�[���PK�|[Ә���(;tri/1.8/system/RSS/RDF/Channel/new-c.yamlnu�[���PK�|['=��0Curi/1.8/system/RSS/RDF/Channel/cdesc-Channel.yamlnu�[���PK�|[C0�C��1axri/1.8/system/RSS/RDF/Channel/maker_target-i.yamlnu�[���PK�|[�
��;�yri/1.8/system/RSS/RDF/Channel/setup_maker_attributes-i.yamlnu�[���PK�|[�qT��1�zri/1.8/system/RSS/RDF/Channel/required_uri-c.yamlnu�[���PK�|[��qt��&�{ri/1.8/system/RSS/RDF/full_name-i.yamlnu�[���PK�|[k��2��,�|ri/1.8/system/RSS/RDF/Image/cdesc-Image.yamlnu�[���PK�|[���&ri/1.8/system/RSS/RDF/Image/new-c.yamlnu�[���PK�|[1h���/�ri/1.8/system/RSS/RDF/Image/maker_target-i.yamlnu�[���PK�|[-{u��/,�ri/1.8/system/RSS/RDF/Image/required_uri-c.yamlnu�[���PK�|[�_�!��4F�ri/1.8/system/RSS/RDF/Textinput/cdesc-Textinput.yamlnu�[���PK�|[�忲�*s�ri/1.8/system/RSS/RDF/Textinput/new-c.yamlnu�[���PK�|[�]����3�ri/1.8/system/RSS/RDF/Textinput/maker_target-i.yamlnu�[���PK�|[o����3��ri/1.8/system/RSS/RDF/Textinput/required_uri-c.yamlnu�[���PK�|[��J��� ɇri/1.8/system/RSS/RDF/new-c.yamlnu�[���PK�|[Bg}}&�ri/1.8/system/RSS/RDF/Li/cdesc-Li.yamlnu�[���PK�|[-"�L��)��ri/1.8/system/RSS/RDF/Li/full_name-i.yamlnu�[���PK�|[��6׫�#‹ri/1.8/system/RSS/RDF/Li/new-c.yamlnu�[���PK�|[3Qr��,��ri/1.8/system/RSS/RDF/Li/required_uri-c.yamlnu�[���PK�|[p)����,ԍri/1.8/system/RSS/RDF/Seq/setup_maker-i.yamlnu�[���PK�|[ DF��*�ri/1.8/system/RSS/RDF/Seq/full_name-i.yamlnu�[���PK�|[mP;��$��ri/1.8/system/RSS/RDF/Seq/new-c.yamlnu�[���PK�|[���(��ri/1.8/system/RSS/RDF/Seq/cdesc-Seq.yamlnu�[���PK�|[f�]���-R�ri/1.8/system/RSS/RDF/Seq/required_uri-c.yamlnu�[���PK�|[�D���$h�ri/1.8/system/RSS/RDF/cdesc-RDF.yamlnu�[���PK�|[J���)e�ri/1.8/system/RSS/RDF/required_uri-c.yamlnu�[���PK�|[��
��,r�ri/1.8/system/RSS/RDF/Bag/setup_maker-i.yamlnu�[���PK�|[%�n
��*��ri/1.8/system/RSS/RDF/Bag/full_name-i.yamlnu�[���PK�|[����$��ri/1.8/system/RSS/RDF/Bag/new-c.yamlnu�[���PK�|[p/��-��ri/1.8/system/RSS/RDF/Bag/required_uri-c.yamlnu�[���PK�|[�T�(��ri/1.8/system/RSS/RDF/Bag/cdesc-Bag.yamlnu�[���PK�|[���1��B�ri/1.8/system/RSS/TrackBackModel10/TrackBackAbout/full_name-i.yamlnu�[���PK�|[�r]~��<C�ri/1.8/system/RSS/TrackBackModel10/TrackBackAbout/new-c.yamlnu�[���PK�|[7'&��Hs�ri/1.8/system/RSS/TrackBackModel10/TrackBackAbout/required_prefix-c.yamlnu�[���PK�|[�1Fk��E¢ri/1.8/system/RSS/TrackBackModel10/TrackBackAbout/maker_target-i.yamlnu�[���PK�|[ʩ�TTK�ri/1.8/system/RSS/TrackBackModel10/TrackBackAbout/cdesc-TrackBackAbout.yamlnu�[���PK�|[R;����Oަri/1.8/system/RSS/TrackBackModel10/TrackBackAbout/setup_maker_attributes-i.yamlnu�[���PK�|[����EH�ri/1.8/system/RSS/TrackBackModel10/TrackBackAbout/required_uri-c.yamlnu�[���PK�|[\Q�Q��>��ri/1.8/system/RSS/TrackBackModel10/cdesc-TrackBackModel10.yamlnu�[���PK�|[I���IȪri/1.8/system/RSS/TrackBackModel10/TrackBackPing/cdesc-TrackBackPing.yamlnu�[���PK�|[�x��A�ri/1.8/system/RSS/TrackBackModel10/TrackBackPing/full_name-i.yamlnu�[���PK�|[�n`��;V�ri/1.8/system/RSS/TrackBackModel10/TrackBackPing/new-c.yamlnu�[���PK�|[|K>��G��ri/1.8/system/RSS/TrackBackModel10/TrackBackPing/required_prefix-c.yamlnu�[���PK�|[�����DѰri/1.8/system/RSS/TrackBackModel10/TrackBackPing/required_uri-c.yamlnu�[���PK�|[u�Orr4�ri/1.8/system/RSS/NotSetError/cdesc-NotSetError.yamlnu�[���PK�|[�#z��(�ri/1.8/system/RSS/NotSetError/new-c.yamlnu�[���PK�|[{B���N��ri/1.8/system/RSS/TaxonomyTopicsModel/TaxonomyTopics/cdesc-TaxonomyTopics.yamlnu�[���PK�|[������EW�ri/1.8/system/RSS/TaxonomyTopicsModel/TaxonomyTopics/full_name-i.yamlnu�[���PK�|[D���E��ri/1.8/system/RSS/TaxonomyTopicsModel/TaxonomyTopics/resources-i.yamlnu�[���PK�|[�Wgr��?ݺri/1.8/system/RSS/TaxonomyTopicsModel/TaxonomyTopics/new-c.yamlnu�[���PK�|[
����K�ri/1.8/system/RSS/TaxonomyTopicsModel/TaxonomyTopics/required_prefix-c.yamlnu�[���PK�|[��D���Hh�ri/1.8/system/RSS/TaxonomyTopicsModel/TaxonomyTopics/maker_target-i.yamlnu�[���PK�|[� )W��H��ri/1.8/system/RSS/TaxonomyTopicsModel/TaxonomyTopics/required_uri-c.yamlnu�[���PK�|[4�Q��<�ri/1.8/system/RSS/TaxonomyTopicsModel/append_features-c.yamlnu�[���PK�|[w��Z		DA�ri/1.8/system/RSS/TaxonomyTopicsModel/cdesc-TaxonomyTopicsModel.yamlnu�[���PK�|[
����B��ri/1.8/system/RSS/TrackBackModel20/TrackBackAbout/full_name-i.yamlnu�[���PK�|[Ԫ���<��ri/1.8/system/RSS/TrackBackModel20/TrackBackAbout/new-c.yamlnu�[���PK�|[y93���H+�ri/1.8/system/RSS/TrackBackModel20/TrackBackAbout/required_prefix-c.yamlnu�[���PK�|[4�Ϭ��Kz�ri/1.8/system/RSS/TrackBackModel20/TrackBackAbout/cdesc-TrackBackAbout.yamlnu�[���PK�|[�n����E��ri/1.8/system/RSS/TrackBackModel20/TrackBackAbout/required_uri-c.yamlnu�[���PK�|[H�����>�ri/1.8/system/RSS/TrackBackModel20/cdesc-TrackBackModel20.yamlnu�[���PK�|[����IQ�ri/1.8/system/RSS/TrackBackModel20/TrackBackPing/cdesc-TrackBackPing.yamlnu�[���PK�|[q6���A��ri/1.8/system/RSS/TrackBackModel20/TrackBackPing/full_name-i.yamlnu�[���PK�|[ՑM��;��ri/1.8/system/RSS/TrackBackModel20/TrackBackPing/new-c.yamlnu�[���PK�|[������G
�ri/1.8/system/RSS/TrackBackModel20/TrackBackPing/required_prefix-c.yamlnu�[���PK�|[��sR��DZ�ri/1.8/system/RSS/TrackBackModel20/TrackBackPing/required_uri-c.yamlnu�[���PK�|[��9���$��ri/1.8/system/RSS/XML/cdesc-XML.yamlnu�[���PK�|[^�T��+��ri/1.8/system/RSS/XML/Element/%5b%5d-i.yamlnu�[���PK�|[g���)��ri/1.8/system/RSS/XML/Element/each-i.yamlnu�[���PK�|[\����.��ri/1.8/system/RSS/XML/Element/full_name-i.yamlnu�[���PK�|[G��Z��0��ri/1.8/system/RSS/XML/Element/cdesc-Element.yamlnu�[���PK�|[�D��(��ri/1.8/system/RSS/XML/Element/new-c.yamlnu�[���PK�|[2ԉ~��+�ri/1.8/system/RSS/XML/Element/%3c%3c-i.yamlnu�[���PK�|[��e��)"�ri/1.8/system/RSS/XML/Element/to_s-i.yamlnu�[���PK�|[������+(�ri/1.8/system/RSS/XML/Element/%3d%3d-i.yamlnu�[���PK�|[A.`J��.1�ri/1.8/system/RSS/XML/Element/%5b%5d%3d-i.yamlnu�[���PK�|[��a���:G�ri/1.8/system/RSS/ImageFaviconModel/append_features-c.yamlnu�[���PK�|[YT-\==@~�ri/1.8/system/RSS/ImageFaviconModel/cdesc-ImageFaviconModel.yamlnu�[���PK�|[a��1��A+�ri/1.8/system/RSS/ImageFaviconModel/ImageFavicon/full_name-i.yamlnu�[���PK�|[N�mRRHf�ri/1.8/system/RSS/ImageFaviconModel/ImageFavicon/cdesc-ImageFavicon.yamlnu�[���PK�|["�����;0�ri/1.8/system/RSS/ImageFaviconModel/ImageFavicon/new-c.yamlnu�[���PK�|[��iH��G^�ri/1.8/system/RSS/ImageFaviconModel/ImageFavicon/required_prefix-c.yamlnu�[���PK�|[O4��E��ri/1.8/system/RSS/ImageFaviconModel/ImageFavicon/image_size%3d-i.yamlnu�[���PK�|[r����D.�ri/1.8/system/RSS/ImageFaviconModel/ImageFavicon/maker_target-i.yamlnu�[���PK�|[�o���Ny�ri/1.8/system/RSS/ImageFaviconModel/ImageFavicon/setup_maker_attributes-i.yamlnu�[���PK�|[�m����D��ri/1.8/system/RSS/ImageFaviconModel/ImageFavicon/required_uri-c.yamlnu�[���PK�|[PP��?'�ri/1.8/system/RSS/ImageFaviconModel/ImageFavicon/size%3d-i.yamlnu�[���PK�|[{=��}}<��ri/1.8/system/RSS/UnknownTagError/cdesc-UnknownTagError.yamlnu�[���PK�|[�6��,y�ri/1.8/system/RSS/UnknownTagError/new-c.yamlnu�[���PK�|[�[]]6��ri/1.8/system/RSS/ContentModel/cdesc-ContentModel.yamlnu�[���PK�|[rnz��5N�ri/1.8/system/RSS/ContentModel/append_features-c.yamlnu�[���PK�|[�HS���%{�ri/1.8/system/RSS/Parser/parse-c.yamlnu�[���PK�|[�)�WW1�ri/1.8/system/RSS/Parser/default_parser%3d-c.yamlnu�[���PK�|[ؠ@�''*��ri/1.8/system/RSS/Parser/cdesc-Parser.yamlnu�[���PK�|[�O����#�ri/1.8/system/RSS/Parser/new-c.yamlnu�[���PK�|[��tt-$�ri/1.8/system/RSS/Parser/normalize_rss-i.yamlnu�[���PK�|[Ե���.��ri/1.8/system/RSS/Parser/default_parser-c.yamlnu�[���PK�|[�5˨,ri/1.8/system/RSS/Parser/maybe_xml%3f-i.yamlnu�[���PK�|[���!!&�ri/1.8/system/RSS/Parser/to_uri-i.yamlnu�[���PK�|[T�h��;�ri/1.8/system/RSS/BaseTrackBackModel/append_features-i.yamlnu�[���PK�|[�����B4ri/1.8/system/RSS/BaseTrackBackModel/cdesc-BaseTrackBackModel.yamlnu�[���PK�|[�q�$??@5ri/1.8/system/RSS/XMLParserListener/cdesc-XMLParserListener.yamlnu�[���PK�|[z��b��2�ri/1.8/system/RSS/XMLParserListener/xmldecl-i.yamlnu�[���PK�|[5m����:
ri/1.8/system/RSS/TrackBackUtils/trackback_validate-i.yamlnu�[���PK�|[w�9�:rri/1.8/system/RSS/TrackBackUtils/cdesc-TrackBackUtils.yamlnu�[���PK�|[5����7�ri/1.8/system/RSS/Element/have_children_elements-c.yamlnu�[���PK�|[�)�L��1ri/1.8/system/RSS/Element/set_next_element-i.yamlnu�[���PK�|[L�u��,Hri/1.8/system/RSS/Element/calc_indent-i.yamlnu�[���PK�|[J����6�ri/1.8/system/RSS/Element/add_to_element_method-c.yamlnu�[���PK�|[:�ܾ��)�ri/1.8/system/RSS/Element/tag_name-c.yamlnu�[���PK�|[P׺�0�ri/1.8/system/RSS/Element/have_content%3f-c.yamlnu�[���PK�|[Xܻ=��*�ri/1.8/system/RSS/Element/full_name-i.yamlnu�[���PK�|[u�׽�-ri/1.8/system/RSS/Element/converter%3d-i.yamlnu�[���PK�|[�B��}},ri/1.8/system/RSS/Element/cdesc-Element.yamlnu�[���PK�|[�0���/�&ri/1.8/system/RSS/Element/inherited_base-c.yamlnu�[���PK�|[��!��((ri/1.8/system/RSS/Element/convert-i.yamlnu�[���PK�|[����+)ri/1.8/system/RSS/Element/install_ns-c.yamlnu�[���PK�|[k g���=7*ri/1.8/system/RSS/Element/add_need_initialize_variable-c.yamlnu�[���PK�|[(+�ݫ�&�+ri/1.8/system/RSS/Element/_tags-i.yamlnu�[���PK�|[�ퟯ��=�,ri/1.8/system/RSS/Element/def_corresponded_attr_reader-c.yamlnu�[���PK�|[ݣJ��3�-ri/1.8/system/RSS/Element/validate_attribute-i.yamlnu�[���PK�|[�1]߿�2/ri/1.8/system/RSS/Element/content_is_set%3f-i.yamlnu�[���PK�|[,ͣ���+&0ri/1.8/system/RSS/Element/__validate-i.yamlnu�[���PK�|[�\
���.h1ri/1.8/system/RSS/Element/install_model-c.yamlnu�[���PK�|[ w���5�2ri/1.8/system/RSS/Element/must_call_validators-c.yamlnu�[���PK�|[.,D���:�3ri/1.8/system/RSS/Element/have_required_elements%3f-i.yamlnu�[���PK�|[���<5ri/1.8/system/RSS/Element/install_must_call_validator-c.yamlnu�[���PK�|[q�p��$c6ri/1.8/system/RSS/Element/new-c.yamlnu�[���PK�|[̽r���:x7ri/1.8/system/RSS/Element/add_have_children_element-c.yamlnu�[���PK�|[���t��*�8ri/1.8/system/RSS/Element/_validate-i.yamlnu�[���PK�|[
*Y��1:ri/1.8/system/RSS/Element/empty_content%3f-i.yamlnu�[���PK�|[(Щ���)4;ri/1.8/system/RSS/Element/valid%3f-i.yamlnu�[���PK�|[^ً��/T<ri/1.8/system/RSS/Element/get_attributes-c.yamlnu�[���PK�|[
v��)o=ri/1.8/system/RSS/Element/children-i.yamlnu�[���PK�|[&�,~��5y>ri/1.8/system/RSS/Element/initialize_variables-i.yamlnu�[���PK�|[��[���=�?ri/1.8/system/RSS/Element/def_corresponded_attr_writer-c.yamlnu�[���PK�|[������4Ari/1.8/system/RSS/Element/have_xml_content%3f-i.yamlnu�[���PK�|[�i����04Bri/1.8/system/RSS/Element/required_prefix-c.yamlnu�[���PK�|[�jF��)RCri/1.8/system/RSS/Element/validate-i.yamlnu�[���PK�|[�3�B��.vDri/1.8/system/RSS/Element/content_setup-c.yamlnu�[���PK�|[�ѥ���0�Eri/1.8/system/RSS/Element/add_plural_form-c.yamlnu�[���PK�|[�ᵰ�)�Fri/1.8/system/RSS/Element/tag_name-i.yamlnu�[���PK�|[�YZ���%�Gri/1.8/system/RSS/Element/to_s-i.yamlnu�[���PK�|['ٖ��+�Hri/1.8/system/RSS/Element/tag_filter-i.yamlnu�[���PK�|[���Ӹ�-	Jri/1.8/system/RSS/Element/plural_forms-c.yamlnu�[���PK�|[=����'Kri/1.8/system/RSS/Element/_attrs-i.yamlnu�[���PK�|[d&���'"Lri/1.8/system/RSS/Element/models-c.yamlnu�[���PK�|[��I���4%Mri/1.8/system/RSS/Element/validate_for_stream-i.yamlnu�[���PK�|[��P���.pNri/1.8/system/RSS/Element/collect_attrs-i.yamlnu�[���PK�|[̲����.�Ori/1.8/system/RSS/Element/xmled_content-i.yamlnu�[���PK�|[{/%z��6�Pri/1.8/system/RSS/Element/need_base64_encode%3f-i.yamlnu�[���PK�|[j̸�/�Qri/1.8/system/RSS/Element/need_parent%3f-c.yamlnu�[���PK�|[@nHD��-�Rri/1.8/system/RSS/Element/required_uri-c.yamlnu�[���PK�|[(�kt��3�Sri/1.8/system/RSS/Element/to_element_methods-c.yamlnu�[���PK�|[e.�0��B!Uri/1.8/system/RSS/Element/initialize_have_children_elements-i.yamlnu�[���PK�|[�O��$vVri/1.8/system/RSS/Element/tag-i.yamlnu�[���PK�|[����5�Wri/1.8/system/RSS/Element/tag_name_with_prefix-i.yamlnu�[���PK�|[K�^ط�*�Xri/1.8/system/RSS/Element/inherited-c.yamlnu�[���PK�|[���2��:�Yri/1.8/system/RSS/Element/need_initialize_variables-c.yamlnu�[���PK�|[��A��/[ri/1.8/system/RSS/Element/make_start_tag-i.yamlnu�[���PK�|[��V�

6K\ri/1.8/system/RSS/Element/install_get_attribute-c.yamlnu�[���PK�|[���/�]ri/1.8/system/RSS/NotWellFormedError/new-c.yamlnu�[���PK�|[nv_{~~B�_ri/1.8/system/RSS/NotWellFormedError/cdesc-NotWellFormedError.yamlnu�[���PK�|[ܸ��V�ari/1.8/system/RSS/UnknownConversionMethodError/cdesc-UnknownConversionMethodError.yamlnu�[���PK�|[aJ_���9�cri/1.8/system/RSS/UnknownConversionMethodError/new-c.yamlnu�[���PK�|[��N��H�dri/1.8/system/RSS/MissingAttributeError/cdesc-MissingAttributeError.yamlnu�[���PK�|[�����2�fri/1.8/system/RSS/MissingAttributeError/new-c.yamlnu�[���PK�|['w�mm)hri/1.8/system/Resolv/IPv4/cdesc-IPv4.yamlnu�[���PK�|[��k�(�kri/1.8/system/Resolv/IPv4/to_name-i.yamlnu�[���PK�|[���ɯ�'&mri/1.8/system/Resolv/IPv4/create-c.yamlnu�[���PK�|[A).,nri/1.8/system/Resolv/Hosts/getaddresses-i.yamlnu�[���PK�|[<3�<,�ori/1.8/system/Resolv/Hosts/getaddress-i.yamlnu�[���PK�|[����GG+qri/1.8/system/Resolv/Hosts/cdesc-Hosts.yamlnu�[���PK�|[��Pb,,%�tri/1.8/system/Resolv/Hosts/new-c.yamlnu�[���PK�|[;��88.>vri/1.8/system/Resolv/Hosts/each_address-i.yamlnu�[���PK�|[N���*�wri/1.8/system/Resolv/Hosts/getnames-i.yamlnu�[���PK�|[��=�55+Gyri/1.8/system/Resolv/Hosts/each_name-i.yamlnu�[���PK�|[�H��)�zri/1.8/system/Resolv/Hosts/getname-i.yamlnu�[���PK�|[ʒ��(E|ri/1.8/system/Resolv/getaddresses-c.yamlnu�[���PK�|[�_��(�}ri/1.8/system/Resolv/getaddresses-i.yamlnu�[���PK�|[yxy��#�~ri/1.8/system/Resolv/getname-c.yamlnu�[���PK�|[����((7P�ri/1.8/system/Resolv/ResolvError/cdesc-ResolvError.yamlnu�[���PK�|[B�P$߁ri/1.8/system/Resolv/getnames-c.yamlnu�[���PK�|[��X�&5�ri/1.8/system/Resolv/getaddress-i.yamlnu�[���PK�|[W�O (��ri/1.8/system/Resolv/IPv6/to_name-i.yamlnu�[���PK�|[/{1
'�ri/1.8/system/Resolv/IPv6/create-c.yamlnu�[���PK�|[,c�)Y�ri/1.8/system/Resolv/IPv6/cdesc-IPv6.yamlnu�[���PK�|[_B��**;ˏri/1.8/system/Resolv/ResolvTimeout/cdesc-ResolvTimeout.yamlnu�[���PK�|[LH`�ri/1.8/system/Resolv/new-c.yamlnu�[���PK�|[�$O(��ri/1.8/system/Resolv/each_address-i.yamlnu�[���PK�|[|�Z(5�ri/1.8/system/Resolv/each_address-c.yamlnu�[���PK�|[��m	m	&��ri/1.8/system/Resolv/cdesc-Resolv.yamlnu�[���PK�|[Ah.�%d�ri/1.8/system/Resolv/each_name-c.yamlnu�[���PK�|[�21$ɠri/1.8/system/Resolv/getnames-i.yamlnu�[���PK�|[�:b�$$%�ri/1.8/system/Resolv/each_name-i.yamlnu�[���PK�|[�����#��ri/1.8/system/Resolv/getname-i.yamlnu�[���PK�|[}�X�&�ri/1.8/system/Resolv/getaddress-c.yamlnu�[���PK�|[-���1F�ri/1.8/system/Resolv/DNS/OpCode/cdesc-OpCode.yamlnu�[���PK�|[s	}���,g�ri/1.8/system/Resolv/DNS/getaddresses-i.yamlnu�[���PK�|[t����2v�ri/1.8/system/Resolv/DNS/Resource/MINFO/new-c.yamlnu�[���PK�|[�:����8��ri/1.8/system/Resolv/DNS/Resource/MINFO/cdesc-MINFO.yamlnu�[���PK�|[�C?�2��ri/1.8/system/Resolv/DNS/Resource/NS/cdesc-NS.yamlnu�[���PK�|[�B'

4	�ri/1.8/system/Resolv/DNS/Resource/ANY/cdesc-ANY.yamlnu�[���PK�|[L�z7z�ri/1.8/system/Resolv/DNS/Resource/DomainName/new-c.yamlnu�[���PK�|[�\���B�ri/1.8/system/Resolv/DNS/Resource/DomainName/cdesc-DomainName.yamlnu�[���PK�|[�.���<2�ri/1.8/system/Resolv/DNS/Resource/Generic/cdesc-Generic.yamlnu�[���PK�|[J���4h�ri/1.8/system/Resolv/DNS/Resource/Generic/new-c.yamlnu�[���PK�|[��rJJ8̷ri/1.8/system/Resolv/DNS/Resource/HINFO/cdesc-HINFO.yamlnu�[���PK�|[ F�2~�ri/1.8/system/Resolv/DNS/Resource/HINFO/new-c.yamlnu�[���PK�|[Bs0,,5��ri/1.8/system/Resolv/DNS/Resource/cdesc-Resource.yamlnu�[���PK�|[��:��3��ri/1.8/system/Resolv/DNS/Resource/IN/SRV/new-c.yamlnu�[���PK�|[ʴ�^JJ7��ri/1.8/system/Resolv/DNS/Resource/IN/SRV/cdesc-SRV.yamlnu�[���PK�|[�W	

4m�ri/1.8/system/Resolv/DNS/Resource/IN/AAAA/new-c.yamlnu�[���PK�|[�V�nbb9��ri/1.8/system/Resolv/DNS/Resource/IN/AAAA/cdesc-AAAA.yamlnu�[���PK�|[�5�;2��ri/1.8/system/Resolv/DNS/Resource/IN/cdesc-IN.yamlnu�[���PK�|[$��1 �ri/1.8/system/Resolv/DNS/Resource/IN/A/new-c.yamlnu�[���PK�|[�{.VV3��ri/1.8/system/Resolv/DNS/Resource/IN/A/cdesc-A.yamlnu�[���PK�|[�h+�tt7A�ri/1.8/system/Resolv/DNS/Resource/IN/WKS/cdesc-WKS.yamlnu�[���PK�|[�"Ӑ��3�ri/1.8/system/Resolv/DNS/Resource/IN/WKS/new-c.yamlnu�[���PK�|[W��4P�ri/1.8/system/Resolv/DNS/Resource/PTR/cdesc-PTR.yamlnu�[���PK�|[_snI8��ri/1.8/system/Resolv/DNS/Resource/CNAME/cdesc-CNAME.yamlnu�[���PK�|[��Wee0D�ri/1.8/system/Resolv/DNS/Resource/SOA/new-c.yamlnu�[���PK�|[Bݮ�  4	�ri/1.8/system/Resolv/DNS/Resource/SOA/cdesc-SOA.yamlnu�[���PK�|[*�Q��4��ri/1.8/system/Resolv/DNS/Resource/TXT/cdesc-TXT.yamlnu�[���PK�|[�E�

1��ri/1.8/system/Resolv/DNS/Resource/TXT/data-i.yamlnu�[���PK�|[W��0��0W�ri/1.8/system/Resolv/DNS/Resource/TXT/new-c.yamlnu�[���PK�|[j&m�BB/��ri/1.8/system/Resolv/DNS/Resource/MX/new-c.yamlnu�[���PK�|[˜~�882'�ri/1.8/system/Resolv/DNS/Resource/MX/cdesc-MX.yamlnu�[���PK�|[L�/�/��ri/1.8/system/Resolv/DNS/Query/cdesc-Query.yamlnu�[���PK�|[J��bb-$�ri/1.8/system/Resolv/DNS/each_resource-i.yamlnu�[���PK�|[����-��ri/1.8/system/Resolv/DNS/Name/cdesc-Name.yamlnu�[���PK�|[y�
���0�ri/1.8/system/Resolv/DNS/Name/absolute%3f-i.yamlnu�[���PK�|[�"Ow��+f�ri/1.8/system/Resolv/DNS/Name/create-c.yamlnu�[���PK�|[�|D��4��ri/1.8/system/Resolv/DNS/Name/subdomain_of%3f-i.yamlnu�[���PK�|[��A�cc)��ri/1.8/system/Resolv/DNS/Name/to_s-i.yamlnu�[���PK�|[�����;o�ri/1.8/system/Resolv/DNS/Requester/Sender/cdesc-Sender.yamlnu�[���PK�|[��v{��G��ri/1.8/system/Resolv/DNS/Requester/ConnectedUDP/cdesc-ConnectedUDP.yamlnu�[���PK�|[Āz���Hri/1.8/system/Resolv/DNS/Requester/ConnectedUDP/Sender/cdesc-Sender.yamlnu�[���PK�|[+jC��Kdri/1.8/system/Resolv/DNS/Requester/UnconnectedUDP/cdesc-UnconnectedUDP.yamlnu�[���PK�|[�oE��J�ri/1.8/system/Resolv/DNS/Requester/UnconnectedUDP/Sender/cdesc-Sender.yamlnu�[���PK�|[�����?)ri/1.8/system/Resolv/DNS/Requester/TCP/Sender/cdesc-Sender.yamlnu�[���PK�|[ຶ���5yri/1.8/system/Resolv/DNS/Requester/TCP/cdesc-TCP.yamlnu�[���PK�|[B����7�ri/1.8/system/Resolv/DNS/Requester/cdesc-Requester.yamlnu�[���PK�|[$K�22G�ri/1.8/system/Resolv/DNS/Requester/RequestError/cdesc-RequestError.yamlnu�[���PK�|[�>ͪ�*�	ri/1.8/system/Resolv/DNS/getaddress-i.yamlnu�[���PK�|[�HN���#�ri/1.8/system/Resolv/DNS/new-c.yamlnu�[���PK�|[�\K���,hri/1.8/system/Resolv/DNS/each_address-i.yamlnu�[���PK�|[O�8�ww'�ri/1.8/system/Resolv/DNS/cdesc-DNS.yamlnu�[���PK�|[�CN���/�ri/1.8/system/Resolv/DNS/RCode/cdesc-RCode.yamlnu�[���PK�|[�(��(�ri/1.8/system/Resolv/DNS/getnames-i.yamlnu�[���PK�|[�B.���)�ri/1.8/system/Resolv/DNS/each_name-i.yamlnu�[���PK�|[x��STT,�ri/1.8/system/Resolv/DNS/getresources-i.yamlnu�[���PK�|[=
Z<� ri/1.8/system/Resolv/DNS/Config/NXDomain/cdesc-NXDomain.yamlnu�[���PK�|[�%���1,"ri/1.8/system/Resolv/DNS/Config/cdesc-Config.yamlnu�[���PK�|[6et`JJLS#ri/1.8/system/Resolv/DNS/Config/OtherResolvError/cdesc-OtherResolvError.yamlnu�[���PK�|[y7���%%ri/1.8/system/Resolv/DNS/close-i.yamlnu�[���PK�|[:�B�44;T&ri/1.8/system/Resolv/DNS/EncodeError/cdesc-EncodeError.yamlnu�[���PK�|[���5��'�'ri/1.8/system/Resolv/DNS/getname-i.yamlnu�[���PK�|[�oZH��1�)ri/1.8/system/Resolv/DNS/Label/Str/cdesc-Str.yamlnu�[���PK�|[.ʫ��/+ri/1.8/system/Resolv/DNS/Label/cdesc-Label.yamlnu�[���PK�|[H�S55;8,ri/1.8/system/Resolv/DNS/DecodeError/cdesc-DecodeError.yamlnu�[���PK�|[C@[$��+�-ri/1.8/system/Resolv/DNS/getresource-i.yamlnu�[���PK�|[���&��I�4ri/1.8/system/Resolv/DNS/Message/MessageEncoder/cdesc-MessageEncoder.yamlnu�[���PK�|[�"*���IE6ri/1.8/system/Resolv/DNS/Message/MessageDecoder/cdesc-MessageDecoder.yamlnu�[���PK�|[E�~*��3�7ri/1.8/system/Resolv/DNS/Message/cdesc-Message.yamlnu�[���PK�|[QF�=��$�8ri/1.8/system/Resolv/DNS/open-c.yamlnu�[���PK�|[�v�)�:ri/1.8/system/MatchData/post_match-i.yamlnu�[���PK�|[djD��#=ri/1.8/system/MatchData/size-i.yamlnu�[���PK�|[����%%?ri/1.8/system/MatchData/offset-i.yamlnu�[���PK�|[�pD���%hAri/1.8/system/MatchData/%5b%5d-i.yamlnu�[���PK�|[L��11%�Eri/1.8/system/MatchData/select-i.yamlnu�[���PK�|[�#����#Hri/1.8/system/MatchData/to_a-i.yamlnu�[���PK�|[)�€��%BLri/1.8/system/MatchData/string-i.yamlnu�[���PK�|[���y��(INri/1.8/system/MatchData/values_at-i.yamlnu�[���PK�|[v���&:Qri/1.8/system/MatchData/inspect-i.yamlnu�[���PK�|[�T��+KTri/1.8/system/MatchData/pretty_print-i.yamlnu�[���PK�|[�=l���%\Uri/1.8/system/MatchData/length-i.yamlnu�[���PK�|[�����(yWri/1.8/system/MatchData/pre_match-i.yamlnu�[���PK�|[�����"�Yri/1.8/system/MatchData/end-i.yamlnu�[���PK�|[$��#\ri/1.8/system/MatchData/to_s-i.yamlnu�[���PK�|[J�'''�]ri/1.8/system/MatchData/captures-i.yamlnu�[���PK�|[�^����$]`ri/1.8/system/MatchData/begin-i.yamlnu�[���PK�|[��[��,�bri/1.8/system/MatchData/cdesc-MatchData.yamlnu�[���PK�|[H�Q-��.{hri/1.8/system/XMP/StringInputMethod/new-c.yamlnu�[���PK�|[~V����/�iri/1.8/system/XMP/StringInputMethod/gets-i.yamlnu�[���PK�|[�>���1�jri/1.8/system/XMP/StringInputMethod/eof%3f-i.yamlnu�[���PK�|[�@{"��@�kri/1.8/system/XMP/StringInputMethod/cdesc-StringInputMethod.yamlnu�[���PK�|[z]�2��/�mri/1.8/system/XMP/StringInputMethod/puts-i.yamlnu�[���PK�|[>�i8���nri/1.8/system/XMP/new-c.yamlnu�[���PK�|[�wZ�

 �ori/1.8/system/XMP/cdesc-XMP.yamlnu�[���PK�|[�vD`��qri/1.8/system/XMP/puts-i.yamlnu�[���PK�|[�C'��:rri/1.8/system/Scanf/FormatSpecifier/extract_decimal-i.yamlnu�[���PK�|[��N��66sri/1.8/system/Scanf/FormatSpecifier/extract_hex-i.yamlnu�[���PK�|[�����1^tri/1.8/system/Scanf/FormatSpecifier/letter-i.yamlnu�[���PK�|[�d�·�0uuri/1.8/system/Scanf/FormatSpecifier/match-i.yamlnu�[���PK�|[��!м�3�vri/1.8/system/Scanf/FormatSpecifier/nil_proc-i.yamlnu�[���PK�|[d�:��.�wri/1.8/system/Scanf/FormatSpecifier/new-c.yamlnu�[���PK�|[��p>�xri/1.8/system/Scanf/FormatSpecifier/cdesc-FormatSpecifier.yamlnu�[���PK�|[�:lM��7E~ri/1.8/system/Scanf/FormatSpecifier/mid_match%3f-i.yamlnu�[���PK�|[��!ٳ�/jri/1.8/system/Scanf/FormatSpecifier/skip-i.yamlnu�[���PK�|[�x�p��/|�ri/1.8/system/Scanf/FormatSpecifier/to_s-i.yamlnu�[���PK�|[����:��ri/1.8/system/Scanf/FormatSpecifier/extract_integer-i.yamlnu�[���PK�|[Y5W-��8��ri/1.8/system/Scanf/FormatSpecifier/extract_float-i.yamlnu�[���PK�|[�E���8�ri/1.8/system/Scanf/FormatSpecifier/extract_octal-i.yamlnu�[���PK�|[�6���0�ri/1.8/system/Scanf/FormatSpecifier/to_re-i.yamlnu�[���PK�|[�ֽ��01�ri/1.8/system/Scanf/FormatSpecifier/width-i.yamlnu�[���PK�|[���8E�ri/1.8/system/Scanf/FormatSpecifier/extract_plain-i.yamlnu�[���PK�|[2���9s�ri/1.8/system/Scanf/FormatSpecifier/count_space%3f-i.yamlnu�[���PK�|[�
���$��ri/1.8/system/Scanf/cdesc-Scanf.yamlnu�[���PK�|[j��;��2��ri/1.8/system/Scanf/FormatString/spec_count-i.yamlnu�[���PK�|[�<'д�-��ri/1.8/system/Scanf/FormatString/match-i.yamlnu�[���PK�|[611;��1ьri/1.8/system/Scanf/FormatString/last_spec-i.yamlnu�[���PK�|[9�����+�ri/1.8/system/Scanf/FormatString/new-c.yamlnu�[���PK�|[�!m�ss8��ri/1.8/system/Scanf/FormatString/cdesc-FormatString.yamlnu�[���PK�|[�����-ѕri/1.8/system/Scanf/FormatString/prune-i.yamlnu�[���PK�|[X9����,�ri/1.8/system/Scanf/FormatString/to_s-i.yamlnu�[���PK�|[,i̋ ��ri/1.8/system/Hash/update-i.yamlnu�[���PK�|[�P��))b�ri/1.8/system/Hash/size-i.yamlnu�[���PK�|[�X�nn$ٟri/1.8/system/Hash/default%3d-i.yamlnu�[���PK�|[4�U�JJ ��ri/1.8/system/Hash/eql%3f-i.yamlnu�[���PK�|[6�	PZZ 5�ri/1.8/system/Hash/invert-i.yamlnu�[���PK�|[��??!ߧri/1.8/system/Hash/indexes-i.yamlnu�[���PK�|[�CS877 o�ri/1.8/system/Hash/%5b%5d-i.yamlnu�[���PK�|[�YN�rr"��ri/1.8/system/Hash/empty%3f-i.yamlnu�[���PK�|[TT��ri/1.8/system/Hash/merge-i.yamlnu�[���PK�|[���Drr]�ri/1.8/system/Hash/each-i.yamlnu�[���PK�|[���X�� �ri/1.8/system/Hash/select-i.yamlnu�[���PK�|[�J�&&�ri/1.8/system/Hash/to_a-i.yamlnu�[���PK�|[�����u�ri/1.8/system/Hash/store-i.yamlnu�[���PK�|[�����!��ri/1.8/system/Hash/default-i.yamlnu�[���PK�|[�E���!�ri/1.8/system/Hash/to_yaml-i.yamlnu�[���PK�|[�vv ��ri/1.8/system/Hash/rehash-i.yamlnu�[���PK�|[�K|�gg��ri/1.8/system/Hash/hash-i.yamlnu�[���PK�|[�V4,ll#b�ri/1.8/system/Hash/values_at-i.yamlnu�[���PK�|[�Y\��)!�ri/1.8/system/Hash/yaml_initialize-i.yamlnu�[���PK�|[FJ�Ktt :�ri/1.8/system/Hash/delete-i.yamlnu�[���PK�|[iE-2mm#��ri/1.8/system/Hash/member%3f-i.yamlnu�[���PK�|[����XX#��ri/1.8/system/Hash/reject%21-i.yamlnu�[���PK�|[Q�@@"i�ri/1.8/system/Hash/each_key-i.yamlnu�[���PK�|[�Rz??!��ri/1.8/system/Hash/indices-i.yamlnu�[���PK�|[��Li����ri/1.8/system/Hash/index-i.yamlnu�[���PK�|[��;;#��ri/1.8/system/Hash/delete_if-i.yamlnu�[���PK�|[��'�!?�ri/1.8/system/Hash/inspect-i.yamlnu�[���PK�|[–�TT$��ri/1.8/system/Hash/each_value-i.yamlnu�[���PK�|[jv�Hoo$I�ri/1.8/system/Hash/include%3f-i.yamlnu�[���PK�|[{.*̡��ri/1.8/system/Hash/new-c.yamlnu�[���PK�|[�$���&��ri/1.8/system/Hash/pretty_print-i.yamlnu�[���PK�|[��g!�ri/1.8/system/Hash/replace-i.yamlnu�[���PK�|[hD-)�� p�ri/1.8/system/Hash/reject-i.yamlnu�[���PK�|[�3��..)C�ri/1.8/system/Hash/initialize_copy-i.yamlnu�[���PK�|[����-- ��ri/1.8/system/Hash/length-i.yamlnu�[���PK�|[Ѷ�"G�ri/1.8/system/Hash/merge%21-i.yamlnu�[���PK�|[�f;���"��ri/1.8/system/Hash/cdesc-Hash.yamlnu�[���PK�|[ٝS�  �	ri/1.8/system/Hash/keys-i.yamlnu�[���PK�|[��[�yy&B	ri/1.8/system/Hash/default_proc-i.yamlnu�[���PK�|[�cf�{{	ri/1.8/system/Hash/to_s-i.yamlnu�[���PK�|[�h��AA �	ri/1.8/system/Hash/%3d%3d-i.yamlnu�[���PK�|[���u"""k	ri/1.8/system/Hash/value%3f-i.yamlnu�[���PK�|[��i�� �	ri/1.8/system/Hash/values-i.yamlnu�[���PK�|[F�-���,	ri/1.8/system/Hash/pretty_print_cycle-i.yamlnu�[���PK�|[�T�2��!-	ri/1.8/system/Hash/to_hash-i.yamlnu�[���PK�|[g��&��v	ri/1.8/system/Hash/sort-i.yamlnu�[���PK�|[��Hoss�!	ri/1.8/system/Hash/shift-i.yamlnu�[���PK�|[�E��#q$	ri/1.8/system/Hash/%5b%5d%3d-i.yamlnu�[���PK�|[���j22 �'	ri/1.8/system/Hash/%5b%5d-c.yamlnu�[���PK�|[�E���.+	ri/1.8/system/Hash/clear-i.yamlnu�[���PK�|[�
��#S-	ri/1.8/system/Hash/each_pair-i.yamlnu�[���PK�|[5�f!**&/0	ri/1.8/system/Hash/has_value%3f-i.yamlnu�[���PK�|[����gg �2	ri/1.8/system/Hash/key%3f-i.yamlnu�[���PK�|[�����f5	ri/1.8/system/Hash/fetch-i.yamlnu�[���PK�|[ex{�oo$;;	ri/1.8/system/Hash/has_key%3f-i.yamlnu�[���PK�|[Em�))'�=	ri/1.8/system/Symbol/all_symbols-c.yamlnu�[���PK�|[j@��� ~A	ri/1.8/system/Symbol/to_i-i.yamlnu�[���PK�|[�,�ܪ�#�C	ri/1.8/system/Symbol/to_proc-i.yamlnu�[���PK�|[��]��#�E	ri/1.8/system/Symbol/to_yaml-i.yamlnu�[���PK�|[`�湐�#�F	ri/1.8/system/Symbol/id2name-i.yamlnu�[���PK�|[J��M��$pH	ri/1.8/system/Symbol/yaml_new-c.yamlnu�[���PK�|[q��~~#I	ri/1.8/system/Symbol/inspect-i.yamlnu�[���PK�|[A�R��"PK	ri/1.8/system/Symbol/to_sym-i.yamlnu�[���PK�|[0�NN%#M	ri/1.8/system/Symbol/%3d%3d%3d-i.yamlnu�[���PK�|[Ŏ*��"�R	ri/1.8/system/Symbol/to_int-i.yamlnu�[���PK�|[�4��� �S	ri/1.8/system/Symbol/to_s-i.yamlnu�[���PK�|[pMGئ�"�U	ri/1.8/system/Symbol/dclone-i.yamlnu�[���PK�|[�6�6��&�V	ri/1.8/system/Symbol/cdesc-Symbol.yamlnu�[���PK�|[��[���4�]	ri/1.8/system/ArgumentError/cdesc-ArgumentError.yamlnu�[���PK�|[�A# ��!�`	ri/1.8/system/RegOr/%3d%7e-i.yamlnu�[���PK�|[c�UU$qa	ri/1.8/system/RegOr/cdesc-RegOr.yamlnu�[���PK�|[�-<��c	ri/1.8/system/RegOr/new-c.yamlnu�[���PK�|[��]���%d	ri/1.8/system/Base64/b64encode-i.yamlnu�[���PK�|[0�`JJ$g	ri/1.8/system/Base64/encode64-i.yamlnu�[���PK�|[��mpp$�i	ri/1.8/system/Base64/decode_b-i.yamlnu�[���PK�|[�����$yl	ri/1.8/system/Base64/decode64-i.yamlnu�[���PK�|[����5ao	ri/1.8/system/Base64/Deprecated/cdesc-Deprecated.yamlnu�[���PK�|[8��OAA&�p	ri/1.8/system/Base64/cdesc-Base64.yamlnu�[���PK�|[������! w	ri/1.8/system/Open3/popen3-i.yamlnu�[���PK�|[��FF$n{	ri/1.8/system/Open3/cdesc-Open3.yamlnu�[���PK�|[+��(	ri/1.8/system/SimpleDelegator/dup-i.yamlnu�[���PK�|[0Q���8h�	ri/1.8/system/SimpleDelegator/cdesc-SimpleDelegator.yamlnu�[���PK�|[�J2H/��	ri/1.8/system/SimpleDelegator/__getobj__-i.yamlnu�[���PK�|[k6(m(�	ri/1.8/system/SimpleDelegator/new-c.yamlnu�[���PK�|[~W�7*��	ri/1.8/system/SimpleDelegator/clone-i.yamlnu�[���PK�|[�$�///�	ri/1.8/system/SimpleDelegator/__setobj__-i.yamlnu�[���PK�|[w��d��&q�	ri/1.8/system/Exception/to_yaml-i.yamlnu�[���PK�|[�ב=��'}�	ri/1.8/system/Exception/yaml_new-c.yamlnu�[���PK�|[��'��,��	ri/1.8/system/Exception/cdesc-Exception.yamlnu�[���PK�|[x�b���%��	ri/1.8/system/Exception/to_str-i.yamlnu�[���PK�|[����&��	ri/1.8/system/Exception/inspect-i.yamlnu�[���PK�|[W#e55"+�	ri/1.8/system/Exception/new-c.yamlnu�[���PK�|[h�� ��(��	ri/1.8/system/Exception/exception-i.yamlnu�[���PK�|[d�s���&�	ri/1.8/system/Exception/message-i.yamlnu�[���PK�|[������,�	ri/1.8/system/Exception/set_backtrace-i.yamlnu�[���PK�|[�3��88##�	ri/1.8/system/Exception/to_s-i.yamlnu�[���PK�|[�]��(��	ri/1.8/system/Exception/backtrace-i.yamlnu�[���PK�|[��a���("�	ri/1.8/system/Exception/exception-c.yamlnu�[���PK�|[�,�v��*S�	ri/1.8/system/TokenStream/pop_token-i.yamlnu�[���PK�|[s<z��*^�	ri/1.8/system/TokenStream/add_token-i.yamlnu�[���PK�|[X�L.��+k�	ri/1.8/system/TokenStream/add_tokens-i.yamlnu�[���PK�|[�v��PP0|�	ri/1.8/system/TokenStream/cdesc-TokenStream.yamlnu�[���PK�|[�����-,�	ri/1.8/system/TokenStream/token_stream-i.yamlnu�[���PK�|[�nkS��8@�	ri/1.8/system/TokenStream/start_collecting_tokens-i.yamlnu�[���PK�|[���118u�	ri/1.8/system/MissingArgument/cdesc-MissingArgument.yamlnu�[���PK�|[�e��  �	ri/1.8/system/created.ridnu�[���PK�|[@����w�	ri/1.8/system/Queue/size-i.yamlnu�[���PK�|[%�)�����	ri/1.8/system/Queue/deq-i.yamlnu�[���PK�|[/P~��#в	ri/1.8/system/Queue/empty%3f-i.yamlnu�[���PK�|[6e�����	ri/1.8/system/Queue/enq-i.yamlnu�[���PK�|[Ǖ�Z��?�	ri/1.8/system/Queue/pop-i.yamlnu�[���PK�|[͒�C����	ri/1.8/system/Queue/new-c.yamlnu�[���PK�|[~@�<<��	ri/1.8/system/Queue/push-i.yamlnu�[���PK�|[��!5�	ri/1.8/system/Queue/length-i.yamlnu�[���PK�|[X��!��!��	ri/1.8/system/Queue/%3c%3c-i.yamlnu�[���PK�|[���HH$��	ri/1.8/system/Queue/cdesc-Queue.yamlnu�[���PK�|[�~&�� ]�	ri/1.8/system/Queue/shift-i.yamlnu�[���PK�|[#���&��	ri/1.8/system/Queue/num_waiting-i.yamlnu�[���PK�|[�t%��� ��	ri/1.8/system/Queue/clear-i.yamlnu�[���PK�|[����KK(,�	ri/1.8/system/Monitor/cdesc-Monitor.yamlnu�[���PK�|[��~���.��	ri/1.8/system/UNIXServer/cdesc-UNIXServer.yamlnu�[���PK�|[��~�hh/�	ri/1.8/system/UNIXServer/accept_nonblock-i.yamlnu�[���PK�|[=��((&��	ri/1.8/system/UNIXServer/listen-i.yamlnu�[���PK�|[����"G�	ri/1.8/system/PStore/%5b%5d-i.yamlnu�[���PK�|[�����!��	ri/1.8/system/PStore/abort-i.yamlnu�[���PK�|[M��""&��	ri/1.8/system/PStore/cdesc-PStore.yamlnu�[���PK�|[*x�Z�� 
ri/1.8/system/PStore/path-i.yamlnu�[���PK�|[co�+E
ri/1.8/system/PStore/Error/cdesc-Error.yamlnu�[���PK�|[6�����"�
ri/1.8/system/PStore/delete-i.yamlnu�[���PK�|[:⑴��!�
ri/1.8/system/PStore/roots-i.yamlnu�[���PK�|[-x11�
ri/1.8/system/PStore/new-c.yamlnu�[���PK�|[�*��^^-V
ri/1.8/system/PStore/in_transaction_wr-i.yamlnu�[���PK�|[w�f��&

ri/1.8/system/PStore/commit_new-i.yamlnu�[���PK�|[B|��$$*c
ri/1.8/system/PStore/in_transaction-i.yamlnu�[���PK�|[~i�||"�
ri/1.8/system/PStore/commit-i.yamlnu�[���PK�|[z�����%�
ri/1.8/system/PStore/%5b%5d%3d-i.yamlnu�[���PK�|[r��й�#�
ri/1.8/system/PStore/root%3f-i.yamlnu�[���PK�|[c�%%'�
ri/1.8/system/PStore/transaction-i.yamlnu�[���PK�|[V ����!-
ri/1.8/system/PStore/fetch-i.yamlnu�[���PK�|[1� 8B
ri/1.8/system/SystemCallError/cdesc-SystemCallError.yamlnu�[���PK�|[��##*�"
ri/1.8/system/SystemCallError/errno-i.yamlnu�[���PK�|[�+`(5$
ri/1.8/system/SystemCallError/new-c.yamlnu�[���PK�|[�PDo��.�&
ri/1.8/system/SystemCallError/%3d%3d%3d-c.yamlnu�[���PK�|[��
5~~.�(
ri/1.8/system/RangeError/cdesc-RangeError.yamlnu�[���PK�|[b�z��>k+
ri/1.8/system/ExceptionForMatrix/cdesc-ExceptionForMatrix.yamlnu�[���PK�|[&���4�,
ri/1.8/system/StopIteration/cdesc-StopIteration.yamlnu�[���PK�|[��ܓ$�.
ri/1.8/system/Net/FTP/connect-i.yamlnu�[���PK�|[l1B̯�$�0
ri/1.8/system/Net/FTP/putline-i.yamlnu�[���PK�|[�+�K��#�1
ri/1.8/system/Net/FTP/system-i.yamlnu�[���PK�|[&���!.3
ri/1.8/system/Net/FTP/site-i.yamlnu�[���PK�|[bf�00'a4
ri/1.8/system/Net/FTP/storbinary-i.yamlnu�[���PK�|[ďU!�6
ri/1.8/system/Net/FTP/size-i.yamlnu�[���PK�|[K�+���!:8
ri/1.8/system/Net/FTP/mdtm-i.yamlnu�[���PK�|[(�N~��%�9
ri/1.8/system/Net/FTP/sendport-i.yamlnu�[���PK�|[��jX��%�:
ri/1.8/system/Net/FTP/voidresp-i.yamlnu�[���PK�|[(}lZ��!�;
ri/1.8/system/Net/FTP/help-i.yamlnu�[���PK�|[.0���&�<
ri/1.8/system/Net/FTP/storlines-i.yamlnu�[���PK�|[.V����"?
ri/1.8/system/Net/FTP/rmdir-i.yamlnu�[���PK�|[�����"\@
ri/1.8/system/Net/FTP/abort-i.yamlnu�[���PK�|[y_�$��%�A
ri/1.8/system/Net/FTP/makepasv-i.yamlnu�[���PK�|[ُ�S��%�B
ri/1.8/system/Net/FTP/parse229-i.yamlnu�[���PK�|[����!�C
ri/1.8/system/Net/FTP/quit-i.yamlnu�[���PK�|[P����#�D
ri/1.8/system/Net/FTP/delete-i.yamlnu�[���PK�|[�6^��%!F
ri/1.8/system/Net/FTP/parse227-i.yamlnu�[���PK�|[�X�W��''G
ri/1.8/system/Net/FTP/getaddress-i.yamlnu�[���PK�|[i�X2��(/H
ri/1.8/system/Net/FTP/puttextfile-i.yamlnu�[���PK�|[������#xJ
ri/1.8/system/Net/FTP/getdir-i.yamlnu�[���PK�|[{:x���#�K
ri/1.8/system/Net/FTP/rename-i.yamlnu�[���PK�|[�^%���L
ri/1.8/system/Net/FTP/ls-i.yamlnu�[���PK�|[�`���(N
ri/1.8/system/Net/FTP/transfercmd-i.yamlnu�[���PK�|[��<[��&@O
ri/1.8/system/Net/FTP/retrlines-i.yamlnu�[���PK�|[�H����!�Q
ri/1.8/system/Net/FTP/noop-i.yamlnu�[���PK�|[G�ޭ�%�R
ri/1.8/system/Net/FTP/makeport-i.yamlnu�[���PK�|[��C0��!�S
ri/1.8/system/Net/FTP/acct-i.yamlnu�[���PK�|[DѤ�� U
ri/1.8/system/Net/FTP/get-i.yamlnu�[���PK�|[��w6'�V
ri/1.8/system/Net/FTP/set_socket-i.yamlnu�[���PK�|[={'��"OX
ri/1.8/system/Net/FTP/mkdir-i.yamlnu�[���PK�|[�6�� �Y
ri/1.8/system/Net/FTP/new-c.yamlnu�[���PK�|[�m�

'�[
ri/1.8/system/Net/FTP/retrbinary-i.yamlnu�[���PK�|[�LC�yy"^
ri/1.8/system/Net/FTP/mtime-i.yamlnu�[���PK�|[���*�_
ri/1.8/system/Net/FTP/putbinaryfile-i.yamlnu�[���PK�|[����#Cb
ri/1.8/system/Net/FTP/status-i.yamlnu�[���PK�|[���&�c
ri/1.8/system/Net/FTP/closed%3f-i.yamlnu�[���PK�|[N�X^��%�d
ri/1.8/system/Net/FTP/sanitize-i.yamlnu�[���PK�|[�s���+�e
ri/1.8/system/Net/FTP/return_code%3d-i.yamlnu�[���PK�|[�;� g
ri/1.8/system/Net/FTP/pwd-i.yamlnu�[���PK�|[�4����(�h
ri/1.8/system/Net/FTP/return_code-i.yamlnu�[���PK�|[�%��"�i
ri/1.8/system/Net/FTP/login-i.yamlnu�[���PK�|[��ڀ�� �l
ri/1.8/system/Net/FTP/dir-i.yamlnu�[���PK�|[��,$�m
ri/1.8/system/Net/FTP/voidcmd-i.yamlnu�[���PK�|[-�����(!o
ri/1.8/system/Net/FTP/gettextfile-i.yamlnu�[���PK�|[R�}��%;q
ri/1.8/system/Net/FTP/parse228-i.yamlnu�[���PK�|[�y�C�� Ar
ri/1.8/system/Net/FTP/put-i.yamlnu�[���PK�|[~��44"6t
ri/1.8/system/Net/FTP/close-i.yamlnu�[���PK�|[%܏l��$�u
ri/1.8/system/Net/FTP/sendcmd-i.yamlnu�[���PK�|[ƠM���)w
ri/1.8/system/Net/FTP/getmultiline-i.yamlnu�[���PK�|[��/���"x
ri/1.8/system/Net/FTP/chdir-i.yamlnu�[���PK�|[lzë�$\y
ri/1.8/system/Net/FTP/getline-i.yamlnu�[���PK�|[�0����$[z
ri/1.8/system/Net/FTP/cdesc-FTP.yamlnu�[���PK�|[1��}��$|�
ri/1.8/system/Net/FTP/getresp-i.yamlnu�[���PK�|[��_��!{�
ri/1.8/system/Net/FTP/list-i.yamlnu�[���PK�|[�8���*��
ri/1.8/system/Net/FTP/getbinaryfile-i.yamlnu�[���PK�|[%Ǯ!ǘ
ri/1.8/system/Net/FTP/nlst-i.yamlnu�[���PK�|[?U��% �
ri/1.8/system/Net/FTP/parse257-i.yamlnu�[���PK�|[�W(��(&�
ri/1.8/system/Net/FTP/open_socket-i.yamlnu�[���PK�|[$����!;�
ri/1.8/system/Net/FTP/open-c.yamlnu�[���PK�|[hCÕii<�
ri/1.8/system/Net/SMTPSyntaxError/cdesc-SMTPSyntaxError.yamlnu�[���PK�|[��5BT�
ri/1.8/system/Net/HTTPRetriableError/cdesc-HTTPRetriableError.yamlnu�[���PK�|[���__J�
ri/1.8/system/Net/SMTPUnsupportedCommand/cdesc-SMTPUnsupportedCommand.yamlnu�[���PK�|[Nk�,ggL��
ri/1.8/system/Net/SMTPAuthenticationError/cdesc-SMTPAuthenticationError.yamlnu�[���PK�|[wqE���:��
ri/1.8/system/Net/HTTPGenericRequest/body_stream%3d-i.yamlnu�[���PK�|[�*q��3Φ
ri/1.8/system/Net/HTTPGenericRequest/inspect-i.yamlnu�[���PK�|[J`O���E�
ri/1.8/system/Net/HTTPGenericRequest/request_body_permitted%3f-i.yamlnu�[���PK�|[�)��F8�
ri/1.8/system/Net/HTTPGenericRequest/response_body_permitted%3f-i.yamlnu�[���PK�|[��f��G��
ri/1.8/system/Net/HTTPGenericRequest/supply_default_content_type-i.yamlnu�[���PK�|[�;����B�
ri/1.8/system/Net/HTTPGenericRequest/send_request_with_body-i.yamlnu�[���PK�|[�=����BA�
ri/1.8/system/Net/HTTPGenericRequest/cdesc-HTTPGenericRequest.yamlnu�[���PK�|[�-���/E�
ri/1.8/system/Net/HTTPGenericRequest/new-c.yamlnu�[���PK�|[��:Z��8��
ri/1.8/system/Net/HTTPGenericRequest/write_header-i.yamlnu�[���PK�|[��n��3��
ri/1.8/system/Net/HTTPGenericRequest/body%3d-i.yamlnu�[���PK�|[��6&��Iֶ
ri/1.8/system/Net/HTTPGenericRequest/send_request_with_body_stream-i.yamlnu�[���PK�|[JZ+���9G�
ri/1.8/system/Net/HTTPGenericRequest/body_exist%3f-i.yamlnu�[���PK�|[���:q�
ri/1.8/system/Net/HTTPFatalError/cdesc-HTTPFatalError.yamlnu�[���PK�|[�x���.�
ri/1.8/system/Net/Protocol/cdesc-Protocol.yamlnu�[���PK�|[�ȉJJ.	�
ri/1.8/system/Net/POPError/cdesc-POPError.yamlnu�[���PK�|[7�y�ll:��
ri/1.8/system/Net/SMTPFatalError/cdesc-SMTPFatalError.yamlnu�[���PK�|[!4�(��D��
ri/1.8/system/Net/ProtoRetriableError/cdesc-ProtoRetriableError.yamlnu�[���PK�|[K�9���@�
ri/1.8/system/Net/InternetMessageIO/cdesc-InternetMessageIO.yamlnu�[���PK�|[�^��D"�
ri/1.8/system/Net/HTTPServerException/cdesc-HTTPServerException.yamlnu�[���PK�|[
�X�%%J��
ri/1.8/system/Net/POPAuthenticationError/cdesc-POPAuthenticationError.yamlnu�[���PK�|[1�0N�
ri/1.8/system/Net/HTTPError/cdesc-HTTPError.yamlnu�[���PK�|[k�y[11.��
ri/1.8/system/Net/HTTPHeader/basic_auth-i.yamlnu�[���PK�|[*rA"ff*?�
ri/1.8/system/Net/HTTPHeader/%5b%5d-i.yamlnu�[���PK�|[�����(��
ri/1.8/system/Net/HTTPHeader/each-i.yamlnu�[���PK�|[�`��->�
ri/1.8/system/Net/HTTPHeader/add_field-i.yamlnu�[���PK�|[�>����5V�
ri/1.8/system/Net/HTTPHeader/content_length%3d-i.yamlnu�[���PK�|[,���FF1�
ri/1.8/system/Net/HTTPHeader/set_form_data-i.yamlnu�[���PK�|[�*��,&�
ri/1.8/system/Net/HTTPHeader/sub_type-i.yamlnu�[���PK�|[��>��	�	2�
ri/1.8/system/Net/HTTPHeader/cdesc-HTTPHeader.yamlnu�[���PK�|[�ݩ��,F�
ri/1.8/system/Net/HTTPHeader/range%3d-i.yamlnu�[���PK�|[�u&���*��
ri/1.8/system/Net/HTTPHeader/delete-i.yamlnu�[���PK�|[�)�,,.��
ri/1.8/system/Net/HTTPHeader/get_fields-i.yamlnu�[���PK�|[��Z���,h�
ri/1.8/system/Net/HTTPHeader/each_key-i.yamlnu�[���PK�|[]�#3��
ri/1.8/system/Net/HTTPHeader/content_type%3d-i.yamlnu�[���PK�|[H���TT/%�
ri/1.8/system/Net/HTTPHeader/each_header-i.yamlnu�[���PK�|[PH�tdd0��
ri/1.8/system/Net/HTTPHeader/content_type-i.yamlnu�[���PK�|[�9{g??4��
ri/1.8/system/Net/HTTPHeader/proxy_basic_auth-i.yamlnu�[���PK�|[��as��.?�
ri/1.8/system/Net/HTTPHeader/capitalize-i.yamlnu�[���PK�|[S��.Y�
ri/1.8/system/Net/HTTPHeader/each_value-i.yamlnu�[���PK�|[n��A��0��
ri/1.8/system/Net/HTTPHeader/basic_encode-i.yamlnu�[���PK�|[�G�22��
ri/1.8/system/Net/HTTPHeader/canonical_each-i.yamlnu�[���PK�|[��/X``2Y�
ri/1.8/system/Net/HTTPHeader/content_length-i.yamlnu�[���PK�|[��i��-�
ri/1.8/system/Net/HTTPHeader/urlencode-i.yamlnu�[���PK�|[s���01�
ri/1.8/system/Net/HTTPHeader/range_length-i.yamlnu�[���PK�|[p���:��
ri/1.8/system/Net/HTTPHeader/initialize_http_header-i.yamlnu�[���PK�|[e���DD/�
ri/1.8/system/Net/HTTPHeader/type_params-i.yamlnu�[���PK�|[3<�88-��
ri/1.8/system/Net/HTTPHeader/each_name-i.yamlnu�[���PK�|[] M���4+�
ri/1.8/system/Net/HTTPHeader/set_content_type-i.yamlnu�[���PK�|[���YY-?�
ri/1.8/system/Net/HTTPHeader/main_type-i.yamlnu�[���PK�|[�أ0��
ri/1.8/system/Net/HTTPHeader/form_data%3d-i.yamlnu�[���PK�|[i)=�+\ri/1.8/system/Net/HTTPHeader/to_hash-i.yamlnu�[���PK�|[7��8��1�ri/1.8/system/Net/HTTPHeader/content_range-i.yamlnu�[���PK�|[Z�>�-�ri/1.8/system/Net/HTTPHeader/%5b%5d%3d-i.yamlnu�[���PK�|[��H��48ri/1.8/system/Net/HTTPHeader/each_capitalized-i.yamlnu�[���PK�|[<$�GG)=ri/1.8/system/Net/HTTPHeader/range-i.yamlnu�[���PK�|[d9׃��*�ri/1.8/system/Net/HTTPHeader/key%3f-i.yamlnu�[���PK�|[����.-
ri/1.8/system/Net/HTTPHeader/chunked%3f-i.yamlnu�[���PK�|[��}B��)bri/1.8/system/Net/HTTPHeader/fetch-i.yamlnu�[���PK�|[�a��009ori/1.8/system/Net/HTTPHeader/each_capitalized_name-i.yamlnu�[���PK�|[�ټ���-ri/1.8/system/Net/HTTPHeader/set_range-i.yamlnu�[���PK�|[�Za�� .ri/1.8/system/Net/cdesc-Net.yamlnu�[���PK�|[0sQ��>+ri/1.8/system/Net/ProtoSyntaxError/cdesc-ProtoSyntaxError.yamlnu�[���PK�|[!��oTT&rri/1.8/system/Net/APOP/cdesc-APOP.yamlnu�[���PK�|[�g�O��%ri/1.8/system/Net/APOP/apop%3f-i.yamlnu�[���PK�|[:��q__>Qri/1.8/system/Net/SMTPUnknownError/cdesc-SMTPUnknownError.yamlnu�[���PK�|[-=��1ri/1.8/system/Net/SMTP/check_auth_continue-i.yamlnu�[���PK�|[�V����)Fri/1.8/system/Net/SMTP/cram_secret-i.yamlnu�[���PK�|[M����/_ri/1.8/system/Net/SMTP/check_auth_method-i.yamlnu�[���PK�|[�>k�WW.�ri/1.8/system/Net/SMTP/disable_starttls-i.yamlnu�[���PK�|[����27ri/1.8/system/Net/SMTP/enable_starttls_auto-i.yamlnu�[���PK�|[N_���& ri/1.8/system/Net/SMTP/mailfrom-i.yamlnu�[���PK�|[P`t���(&!ri/1.8/system/Net/SMTP/enable_tls-i.yamlnu�[���PK�|[�\�X��&o#ri/1.8/system/Net/SMTP/esmtp%3d-i.yamlnu�[���PK�|[�|���#�%ri/1.8/system/Net/SMTP/esmtp-i.yamlnu�[���PK�|[�"		'�&ri/1.8/system/Net/SMTP/send_mail-i.yamlnu�[���PK�|[�"(1(ri/1.8/system/Net/SMTP/started%3f-i.yamlnu�[���PK�|[��ee-�)ri/1.8/system/Net/SMTP/enable_starttls-i.yamlnu�[���PK�|[� a��)P+ri/1.8/system/Net/SMTP/disable_ssl-i.yamlnu�[���PK�|[nL��+�,ri/1.8/system/Net/SMTP/recv_response-i.yamlnu�[���PK�|[��x��"�-ri/1.8/system/Net/SMTP/ehlo-i.yamlnu�[���PK�|[4sŷ��&�.ri/1.8/system/Net/SMTP/critical-i.yamlnu�[���PK�|[�JZ��,�/ri/1.8/system/Net/SMTP/check_continue-i.yamlnu�[���PK�|[���Z$�0ri/1.8/system/Net/SMTP/tls%3f-i.yamlnu�[���PK�|[�*{>>&G2ri/1.8/system/Net/SMTP/esmtp%3f-i.yamlnu�[���PK�|[P���.�3ri/1.8/system/Net/SMTP/set_debug_output-i.yamlnu�[���PK�|[\�??185ri/1.8/system/Net/SMTP/capable_starttls%3f-i.yamlnu�[���PK�|[tK���&�6ri/1.8/system/Net/SMTP/starttls-i.yamlnu�[���PK�|[�-��#8ri/1.8/system/Net/SMTP/ready-i.yamlnu�[���PK�|[V-����*j9ri/1.8/system/Net/SMTP/default_port-c.yamlnu�[���PK�|[�=�ƫ�"�:ri/1.8/system/Net/SMTP/helo-i.yamlnu�[���PK�|[5x�N��"�;ri/1.8/system/Net/SMTP/quit-i.yamlnu�[���PK�|[ye�K��-�<ri/1.8/system/Net/SMTP/debug_output%3d-i.yamlnu�[���PK�|[�[��*�?ri/1.8/system/Net/SMTP/send_message-i.yamlnu�[���PK�|[��x8zz"�Fri/1.8/system/Net/SMTP/data-i.yamlnu�[���PK�|[0�����1�Jri/1.8/system/Net/SMTP/check_auth_response-i.yamlnu�[���PK�|[��_��&�Kri/1.8/system/Net/SMTP/do_start-i.yamlnu�[���PK�|[��M�  .�Lri/1.8/system/Net/SMTP/starttls_auto%3f-i.yamlnu�[���PK�|[د8���(yNri/1.8/system/Net/SMTP/capable%3f-i.yamlnu�[���PK�|[��M��5�Ori/1.8/system/Net/SMTP/new_internet_message_io-i.yamlnu�[���PK�|[�2��NN6�Pri/1.8/system/Net/SMTP/capable_cram_md5_auth%3f-i.yamlnu�[���PK�|[A�{�EE3hRri/1.8/system/Net/SMTP/capable_login_auth%3f-i.yamlnu�[���PK�|[z�n���1Tri/1.8/system/Net/SMTP/default_ssl_context-c.yamlnu�[���PK�|[�^���-4Uri/1.8/system/Net/SMTP/check_auth_args-i.yamlnu�[���PK�|[��%YVri/1.8/system/Net/SMTP/inspect-i.yamlnu�[���PK�|[�mb!!$�Wri/1.8/system/Net/SMTP/finish-i.yamlnu�[���PK�|[�- ���*)Yri/1.8/system/Net/SMTP/get_response-i.yamlnu�[���PK�|[�F���-@Zri/1.8/system/Net/SMTP/auth_capable%3f-i.yamlnu�[���PK�|[�\1���)Y[ri/1.8/system/Net/SMTP/rcptto_list-i.yamlnu�[���PK�|[��<+VV0x\ri/1.8/system/Net/SMTP/capable_auth_types-i.yamlnu�[���PK�|[Rk�݄�).^ri/1.8/system/Net/SMTP/starttls%3f-i.yamlnu�[���PK�|[�G�&`ri/1.8/system/Net/SMTP/sendmail-i.yamlnu�[���PK�|[���rr!hari/1.8/system/Net/SMTP/new-c.yamlnu�[���PK�|[������$+dri/1.8/system/Net/SMTP/ssl%3f-i.yamlnu�[���PK�|[�N���#Zeri/1.8/system/Net/SMTP/getok-i.yamlnu�[���PK�|[dհ��,\fri/1.8/system/Net/SMTP/check_response-i.yamlnu�[���PK�|[��~(ugri/1.8/system/Net/SMTP/enable_ssl-i.yamlnu�[���PK�|[)p��Q
Q
#�hri/1.8/system/Net/SMTP/start-i.yamlnu�[���PK�|[V�}�/�sri/1.8/system/Net/SMTP/cram_md5_response-i.yamlnu�[���PK�|[=v����+�tri/1.8/system/Net/SMTP/base64_encode-i.yamlnu�[���PK�|[�6+���(vri/1.8/system/Net/SMTP/auth_login-i.yamlnu�[���PK�|[�Eœ��%wri/1.8/system/Net/SMTP/logging-i.yamlnu�[���PK�|[�����%xri/1.8/system/Net/SMTP/do_helo-i.yamlnu�[���PK�|[�#�]��(%yri/1.8/system/Net/SMTP/auth_plain-i.yamlnu�[���PK�|[��Ws��(:zri/1.8/system/Net/SMTP/tlsconnect-i.yamlnu�[���PK�|[u��V!!-E{ri/1.8/system/Net/SMTP/read_timeout%3d-i.yamlnu�[���PK�|[���EE3�|ri/1.8/system/Net/SMTP/capable_plain_auth%3f-i.yamlnu�[���PK�|[�ϞX��$k~ri/1.8/system/Net/SMTP/rcptto-i.yamlnu�[���PK�|[�D�	�	1ori/1.8/system/Net/SMTP/open_message_stream-i.yamlnu�[���PK�|[��	Aqq)��ri/1.8/system/Net/SMTP/disable_tls-i.yamlnu�[���PK�|[�g����*��ri/1.8/system/Net/SMTP/authenticate-i.yamlnu�[���PK�|[q�H��'��ri/1.8/system/Net/SMTP/do_finish-i.yamlnu�[���PK�|[ʽ›J&J&&ȍri/1.8/system/Net/SMTP/cdesc-SMTP.yamlnu�[���PK�|[|�G�
�
#h�ri/1.8/system/Net/SMTP/start-c.yamlnu�[���PK�|[�-�.B�ri/1.8/system/Net/SMTP/default_tls_port-c.yamlnu�[���PK�|[��H���)��ri/1.8/system/Net/SMTP/auth_method-i.yamlnu�[���PK�|[(�O��3��ri/1.8/system/Net/SMTP/Response/capabilities-i.yamlnu�[���PK�|[����2��ri/1.8/system/Net/SMTP/Response/continue%3f-i.yamlnu�[���PK�|[�����7��ri/1.8/system/Net/SMTP/Response/status_type_char-i.yamlnu�[���PK�|[��y��,!�ri/1.8/system/Net/SMTP/Response/parse-c.yamlnu�[���PK�|[d#���*1�ri/1.8/system/Net/SMTP/Response/new-c.yamlnu�[���PK�|[�j)!!3F�ri/1.8/system/Net/SMTP/Response/cdesc-Response.yamlnu�[���PK�|[������9��ri/1.8/system/Net/SMTP/Response/cram_md5_challenge-i.yamlnu�[���PK�|[�[����6��ri/1.8/system/Net/SMTP/Response/exception_class-i.yamlnu�[���PK�|[���/��1)�ri/1.8/system/Net/SMTP/Response/success%3f-i.yamlnu�[���PK�|[��- ��.A�ri/1.8/system/Net/SMTP/Response/message-i.yamlnu�[���PK�|[{j���+T�ri/1.8/system/Net/SMTP/auth_cram_md5-i.yamlnu�[���PK�|[M���5r�ri/1.8/system/Net/SMTP/default_submission_port-c.yamlnu�[���PK�|[aT0��ri/1.8/system/Net/SMTP/starttls_always%3f-i.yamlnu�[���PK�|[���,X�ri/1.8/system/Net/HTTPResponse/entity-i.yamlnu�[���PK�|[�lXM��1��ri/1.8/system/Net/HTTPResponse/read_body_0-i.yamlnu�[���PK�|[`�X
��.��ri/1.8/system/Net/HTTPResponse/procdest-i.yamlnu�[���PK�|[]Ƴ���6��ri/1.8/system/Net/HTTPResponse/read_status_line-c.yamlnu�[���PK�|[�q����:�ri/1.8/system/Net/HTTPResponse/each_response_header-c.yamlnu�[���PK�|[ͅ��zz*t�ri/1.8/system/Net/HTTPResponse/body-i.yamlnu�[���PK�|[J`����4H�ri/1.8/system/Net/HTTPResponse/response_class-c.yamlnu�[���PK�|[��{Xqq,r�ri/1.8/system/Net/HTTPResponse/to_ary-i.yamlnu�[���PK�|[:���-?�ri/1.8/system/Net/HTTPResponse/inspect-i.yamlnu�[���PK�|[�1i7O�ri/1.8/system/Net/HTTPResponse/body_permitted%3f-c.yamlnu�[���PK�|[[L���2��ri/1.8/system/Net/HTTPResponse/read_chunked-i.yamlnu�[���PK�|[9��mm/��ri/1.8/system/Net/HTTPResponse/read_body-i.yamlnu�[���PK�|[����6��ri/1.8/system/Net/HTTPResponse/cdesc-HTTPResponse.yamlnu�[���PK�|[����2$�ri/1.8/system/Net/HTTPResponse/stream_check-i.yamlnu�[���PK�|[6M~[+D�ri/1.8/system/Net/HTTPResponse/value-i.yamlnu�[���PK�|[%j�0��ri/1.8/system/Net/SMTPError/cdesc-SMTPError.yamlnu�[���PK�|[��aQ��2ri/1.8/system/Net/BufferedIO/cdesc-BufferedIO.yamlnu�[���PK�|[)����@4ri/1.8/system/Net/ProtoCommandError/cdesc-ProtoCommandError.yamlnu�[���PK�|[�>&ri/1.8/system/Net/IMAP/uid_copy-i.yamlnu�[���PK�|[eH	RLL(�ri/1.8/system/Net/IMAP/uid_thread-i.yamlnu�[���PK�|[��\�,,A�ri/1.8/system/Net/IMAP/DataFormatError/cdesc-DataFormatError.yamlnu�[���PK�|[�Bm���/3ri/1.8/system/Net/IMAP/receive_responses-i.yamlnu�[���PK�|[a�5�(Rri/1.8/system/Net/IMAP/uid_search-i.yamlnu�[���PK�|[��fNN=�	ri/1.8/system/Net/IMAP/ResponseError/cdesc-ResponseError.yamlnu�[���PK�|[�����,�ri/1.8/system/Net/IMAP/store_internal-i.yamlnu�[���PK�|[yG�	��"�ri/1.8/system/Net/IMAP/lsub-i.yamlnu�[���PK�|[��4y__)�ri/1.8/system/Net/IMAP/decode_utf7-c.yamlnu�[���PK�|[��H9MM$�ri/1.8/system/Net/IMAP/select-i.yamlnu�[���PK�|[�#M���:Nri/1.8/system/Net/IMAP/normalize_searching_criteria-i.yamlnu�[���PK�|[�B����(�ri/1.8/system/Net/IMAP/disconnect-i.yamlnu�[���PK�|[��'''�ri/1.8/system/Net/IMAP/subscribe-i.yamlnu�[���PK�|[旋���-Zri/1.8/system/Net/IMAP/search_internal-i.yamlnu�[���PK�|[�����2�ri/1.8/system/Net/IMAP/add_response_handler-i.yamlnu�[���PK�|[�S��?�ri/1.8/system/Net/IMAP/ResponseParser/cdesc-ResponseParser.yamlnu�[���PK�|[Aw���#�ri/1.8/system/Net/IMAP/store-i.yamlnu�[���PK�|[b�����$�$ri/1.8/system/Net/IMAP/setacl-i.yamlnu�[���PK�|[�}4-/'ri/1.8/system/Net/IMAP/Error/cdesc-Error.yamlnu�[���PK�|[%V���&�(ri/1.8/system/Net/IMAP/setquota-i.yamlnu�[���PK�|[m��

)�*ri/1.8/system/Net/IMAP/encode_utf7-c.yamlnu�[���PK�|[+_���$F,ri/1.8/system/Net/IMAP/create-i.yamlnu�[���PK�|[;�S�..&!.ri/1.8/system/Net/IMAP/uid_sort-i.yamlnu�[���PK�|[&�G�;;%�/ri/1.8/system/Net/IMAP/examine-i.yamlnu�[���PK�|[vZ�ݹ�*52ri/1.8/system/Net/IMAP/send_literal-i.yamlnu�[���PK�|[>����$H3ri/1.8/system/Net/IMAP/delete-i.yamlnu�[���PK�|[��jf��75ri/1.8/system/Net/IMAP/MessageSet/cdesc-MessageSet.yamlnu�[���PK�|[�W��#�6ri/1.8/system/Net/IMAP/check-i.yamlnu�[���PK�|[�L
cc$�8ri/1.8/system/Net/IMAP/rename-i.yamlnu�[���PK�|[�fUU��CQ;ri/1.8/system/Net/IMAP/ByeResponseError/cdesc-ByeResponseError.yamlnu�[���PK�|[�R���-h=ri/1.8/system/Net/IMAP/record_response-i.yamlnu�[���PK�|[�	��"�>ri/1.8/system/Net/IMAP/noop-i.yamlnu�[���PK�|[��K���-�?ri/1.8/system/Net/IMAP/thread_internal-i.yamlnu�[���PK�|[L:K���CAri/1.8/system/Net/IMAP/BadResponseError/cdesc-BadResponseError.yamlnu�[���PK�|[r��+��#7Cri/1.8/system/Net/IMAP/debug-c.yamlnu�[���PK�|[�8G��*mDri/1.8/system/Net/IMAP/get_response-i.yamlnu�[���PK�|[�˫~��/}Eri/1.8/system/Net/IMAP/add_authenticator-c.yamlnu�[���PK�|[Mbzz(�Hri/1.8/system/Net/IMAP/capability-i.yamlnu�[���PK�|[�G��!�Kri/1.8/system/Net/IMAP/new-c.yamlnu�[���PK�|[�����%�Qri/1.8/system/Net/IMAP/u16tou8-c.yamlnu�[���PK�|[��4���,�Rri/1.8/system/Net/IMAP/fetch_internal-i.yamlnu�[���PK�|[ʥ�f��"Tri/1.8/system/Net/IMAP/copy-i.yamlnu�[���PK�|[��-{��;$Vri/1.8/system/Net/IMAP/QuotedString/cdesc-QuotedString.yamlnu�[���PK�|[1�)��+_Wri/1.8/system/Net/IMAP/sort_internal-i.yamlnu�[���PK�|[?]?���7�Xri/1.8/system/Net/IMAP/BodyTypeText/multipart%3f-i.yamlnu�[���PK�|[S�8�Yri/1.8/system/Net/IMAP/BodyTypeText/media_subtype-i.yamlnu�[���PK�|[8J�"";�[ri/1.8/system/Net/IMAP/BodyTypeText/cdesc-BodyTypeText.yamlnu�[���PK�|[dg�OO%0`ri/1.8/system/Net/IMAP/expunge-i.yamlnu�[���PK�|[:P�a$�ari/1.8/system/Net/IMAP/append-i.yamlnu�[���PK�|[;�c��8.fri/1.8/system/Net/IMAP/BodyTypeBasic/multipart%3f-i.yamlnu�[���PK�|[�D�-��9Vgri/1.8/system/Net/IMAP/BodyTypeBasic/media_subtype-i.yamlnu�[���PK�|[�?�		=?iri/1.8/system/Net/IMAP/BodyTypeBasic/cdesc-BodyTypeBasic.yamlnu�[���PK�|[E&|vv$�rri/1.8/system/Net/IMAP/getacl-i.yamlnu�[���PK�|[�����&�tri/1.8/system/Net/IMAP/debug%3d-c.yamlnu�[���PK�|[���X��*�uri/1.8/system/Net/IMAP/generate_tag-i.yamlnu�[���PK�|[c�-��8�vri/1.8/system/Net/IMAP/LoginAuthenticator/process-i.yamlnu�[���PK�|[;�C��4xri/1.8/system/Net/IMAP/LoginAuthenticator/new-c.yamlnu�[���PK�|[^/�KMMG*yri/1.8/system/Net/IMAP/LoginAuthenticator/cdesc-LoginAuthenticator.yamlnu�[���PK�|[wnW::$�{ri/1.8/system/Net/IMAP/status-i.yamlnu�[���PK�|[�1����:|�ri/1.8/system/Net/IMAP/BodyTypeMessage/multipart%3f-i.yamlnu�[���PK�|[�~��;��ri/1.8/system/Net/IMAP/BodyTypeMessage/media_subtype-i.yamlnu�[���PK}[�JN��A��ri/1.8/system/Net/IMAP/BodyTypeMessage/cdesc-BodyTypeMessage.yamlnu�[���PK}[g�����5܈ri/1.8/system/Net/IMAP/pick_up_tagged_response-i.yamlnu�[���PK}[Z��K{K{&�ri/1.8/system/Net/IMAP/cdesc-IMAP.yamlnu�[���PK}[�f{��.�
ri/1.8/system/Net/IMAP/send_number_data-i.yamlnu�[���PK}[O�5��%�
ri/1.8/system/Net/IMAP/u8tou16-c.yamlnu�[���PK}[X^}��(�
ri/1.8/system/Net/IMAP/put_string-i.yamlnu�[���PK}[l���'�
ri/1.8/system/Net/IMAP/send_data-i.yamlnu�[���PK}[�J��:�	
ri/1.8/system/Net/IMAP/CramMD5Authenticator/process-i.yamlnu�[���PK}[�L���6
ri/1.8/system/Net/IMAP/CramMD5Authenticator/new-c.yamlnu�[���PK}[�E����KK
ri/1.8/system/Net/IMAP/CramMD5Authenticator/cdesc-CramMD5Authenticator.yamlnu�[���PK}[��kK��;�
ri/1.8/system/Net/IMAP/CramMD5Authenticator/hmac_md5-i.yamlnu�[���PK}[�V���A�
ri/1.8/system/Net/IMAP/NoResponseError/cdesc-NoResponseError.yamlnu�[���PK}[�ڷ^5�
ri/1.8/system/Net/IMAP/remove_response_handler-i.yamlnu�[���PK}[)�'sLL#V
ri/1.8/system/Net/IMAP/login-i.yamlnu�[���PK}[nU\���+�
ri/1.8/system/Net/IMAP/Atom/cdesc-Atom.yamlnu�[���PK}[h�5���.
ri/1.8/system/Net/IMAP/send_symbol_data-i.yamlnu�[���PK}[�Բ��12
ri/1.8/system/Net/IMAP/RawData/cdesc-RawData.yamlnu�[���PK}[S7e��$Y
ri/1.8/system/Net/IMAP/thread-i.yamlnu�[���PK}[a�^��+e
ri/1.8/system/Net/IMAP/copy_internal-i.yamlnu�[���PK}[E:�		-�
ri/1.8/system/Net/IMAP/disconnected%3f-i.yamlnu�[���PK}[ƫ]oo#�
ri/1.8/system/Net/IMAP/close-i.yamlnu�[���PK}[A����*�!
ri/1.8/system/Net/IMAP/authenticate-i.yamlnu�[���PK}[��#��,�'
ri/1.8/system/Net/IMAP/send_time_data-i.yamlnu�[���PK}[T��88))
ri/1.8/system/Net/IMAP/unsubscribe-i.yamlnu�[���PK}[f�&��1�+
ri/1.8/system/Net/IMAP/Literal/cdesc-Literal.yamlnu�[���PK}[�r�2��.�,
ri/1.8/system/Net/IMAP/send_string_data-i.yamlnu�[���PK}['Hڣ�	�	$�-
ri/1.8/system/Net/IMAP/search-i.yamlnu�[���PK}[�`M���"�7
ri/1.8/system/Net/IMAP/sort-i.yamlnu�[���PK}[��<���<;
ri/1.8/system/Net/IMAP/BodyTypeMultipart/multipart%3f-i.yamlnu�[���PK}[��x&��=5<
ri/1.8/system/Net/IMAP/BodyTypeMultipart/media_subtype-i.yamlnu�[���PK}[q�@���E&>
ri/1.8/system/Net/IMAP/BodyTypeMultipart/cdesc-BodyTypeMultipart.yamlnu�[���PK}[������1AE
ri/1.8/system/Net/IMAP/get_tagged_response-i.yamlnu�[���PK}[���V��*iF
ri/1.8/system/Net/IMAP/send_command-i.yamlnu�[���PK}[*���$$'�G
ri/1.8/system/Net/IMAP/uid_store-i.yamlnu�[���PK}[���qq"I
ri/1.8/system/Net/IMAP/list-i.yamlnu�[���PK}[w����*�O
ri/1.8/system/Net/IMAP/getquotaroot-i.yamlnu�[���PK}[L��'�Q
ri/1.8/system/Net/IMAP/uid_fetch-i.yamlnu�[���PK}[�
���&lS
ri/1.8/system/Net/IMAP/getquota-i.yamlnu�[���PK}[�1�&&$uU
ri/1.8/system/Net/IMAP/logout-i.yamlnu�[���PK}[
����0�V
ri/1.8/system/Net/IMAP/send_quoted_string-i.yamlnu�[���PK}[�H�>>GX
ri/1.8/system/Net/IMAP/ResponseParseError/cdesc-ResponseParseError.yamlnu�[���PK}[m�/��#�Y
ri/1.8/system/Net/IMAP/fetch-i.yamlnu�[���PK}[<��ھ�,�_
ri/1.8/system/Net/IMAP/send_list_data-i.yamlnu�[���PK}[���9��4�`
ri/1.8/system/Net/ReadAdapter/cdesc-ReadAdapter.yamlnu�[���PK}[y�?�:b
ri/1.8/system/Net/POPBadResponse/cdesc-POPBadResponse.yamlnu�[���PK}[�����4�c
ri/1.8/system/Net/HTTPRequest/cdesc-HTTPRequest.yamlnu�[���PK}[5��(�e
ri/1.8/system/Net/HTTPRequest/new-c.yamlnu�[���PK}[��4��8�f
ri/1.8/system/Net/ProtocolError/cdesc-ProtocolError.yamlnu�[���PK}[�?�		*%h
ri/1.8/system/Net/Telnet/binmode%3d-i.yamlnu�[���PK}[A�&��%�i
ri/1.8/system/Net/Telnet/print-i.yamlnu�[���PK}[K&��mm'�k
ri/1.8/system/Net/Telnet/binmode-i.yamlnu�[���PK}[]`����*�m
ri/1.8/system/Net/Telnet/telnetmode-i.yamlnu�[���PK}[��Je��#�o
ri/1.8/system/Net/Telnet/new-c.yamlnu�[���PK}[�2����%$�
ri/1.8/system/Net/Telnet/write-i.yamlnu�[���PK}[�a���*�
ri/1.8/system/Net/Telnet/cdesc-Telnet.yamlnu�[���PK}[n"H��%M�
ri/1.8/system/Net/Telnet/login-i.yamlnu�[���PK}[�΢E��#_�
ri/1.8/system/Net/Telnet/cmd-i.yamlnu�[���PK}[�j�	�	'��
ri/1.8/system/Net/Telnet/waitfor-i.yamlnu�[���PK}[���p*޴
ri/1.8/system/Net/Telnet/preprocess-i.yamlnu�[���PK}[����JJ$T�
ri/1.8/system/Net/Telnet/puts-i.yamlnu�[���PK}[�衑��-�
ri/1.8/system/Net/Telnet/telnetmode%3d-i.yamlnu�[���PK}[�I����+ݺ
ri/1.8/system/Net/WriteAdapter/print-i.yamlnu�[���PK}[����,!�
ri/1.8/system/Net/WriteAdapter/printf-i.yamlnu�[���PK}[�� ���-3�
ri/1.8/system/Net/WriteAdapter/inspect-i.yamlnu�[���PK}[%�0��)C�
ri/1.8/system/Net/WriteAdapter/new-c.yamlnu�[���PK}[C���+U�
ri/1.8/system/Net/WriteAdapter/write-i.yamlnu�[���PK}[��S=PP6��
ri/1.8/system/Net/WriteAdapter/cdesc-WriteAdapter.yamlnu�[���PK}[OC'��,A�
ri/1.8/system/Net/WriteAdapter/%3c%3c-i.yamlnu�[���PK}[��Kĵ�*K�
ri/1.8/system/Net/WriteAdapter/puts-i.yamlnu�[���PK}[
cS���:Z�
ri/1.8/system/Net/ProtoAuthError/cdesc-ProtoAuthError.yamlnu�[���PK}[�l|���,��
ri/1.8/system/Net/POPMail/cdesc-POPMail.yamlnu�[���PK}[���##$��
ri/1.8/system/Net/POPMail/pop-i.yamlnu�[���PK}[,�m	��*0�
ri/1.8/system/Net/POPMail/unique_id-i.yamlnu�[���PK}[v�X��'<�
ri/1.8/system/Net/POPMail/delete-i.yamlnu�[���PK}[�Ol,��'?�
ri/1.8/system/Net/POPMail/header-i.yamlnu�[���PK}[?����$6�
ri/1.8/system/Net/POPMail/top-i.yamlnu�[���PK}[���[		(L�
ri/1.8/system/Net/POPMail/inspect-i.yamlnu�[���PK}[>2���*��
ri/1.8/system/Net/POPMail/delete%21-i.yamlnu�[���PK}[J����+��
ri/1.8/system/Net/POPMail/deleted%3f-i.yamlnu�[���PK}[T����$?�
ri/1.8/system/Net/POPMail/all-i.yamlnu�[���PK}[gJ���%y�
ri/1.8/system/Net/POPMail/mail-i.yamlnu�[���PK}[�9[���%��
ri/1.8/system/Net/POPMail/uidl-i.yamlnu�[���PK}[���>��
ri/1.8/system/Net/ProtoServerError/cdesc-ProtoServerError.yamlnu�[���PK}[m�],hh:5�
ri/1.8/system/Net/SMTPServerBusy/cdesc-SMTPServerBusy.yamlnu�[���PK}[]�a���2�
ri/1.8/system/Net/NetPrivate/cdesc-NetPrivate.yamlnu�[���PK}[+ZG�#)�
ri/1.8/system/Net/HTTP/head2-i.yamlnu�[���PK}[�$n��%�
ri/1.8/system/Net/HTTP/connect-i.yamlnu�[���PK}[#(�(��
ri/1.8/system/Net/HTTP/proxy_user-i.yamlnu�[���PK}[R�Ѝ��)��
ri/1.8/system/Net/HTTP/Put/cdesc-Put.yamlnu�[���PK}[�2�

*��
ri/1.8/system/Net/HTTP/get_response-c.yamlnu�[���PK}[�i��99"Z�
ri/1.8/system/Net/HTTP/move-i.yamlnu�[���PK}[��r��7��
ri/1.8/system/Net/HTTP/ProxyDelta/cdesc-ProxyDelta.yamlnu�[���PK}[��ae��'�
ri/1.8/system/Net/HTTP/proxyport-i.yamlnu�[���PK}[#Rֲ�+T�
ri/1.8/system/Net/HTTP/Move/cdesc-Move.yamlnu�[���PK}[l�sw))(a�
ri/1.8/system/Net/HTTP/started%3f-i.yamlnu�[���PK}[��K��)�
ri/1.8/system/Net/HTTP/ssl_timeout-i.yamlnu�[���PK}[/H`|(�
ri/1.8/system/Net/HTTP/proxy_pass-i.yamlnu�[���PK}[v�:C/a�
ri/1.8/system/Net/HTTP/http_default_port-c.yamlnu�[���PK}[���+�
ri/1.8/system/Net/HTTP/Lock/cdesc-Lock.yamlnu�[���PK}[�ў�.�
ri/1.8/system/Net/HTTP/set_debug_output-i.yamlnu�[���PK}[�����(Tri/1.8/system/Net/HTTP/use_ssl%3f-i.yamlnu�[���PK}[�h�Z*Yri/1.8/system/Net/HTTP/default_port-c.yamlnu�[���PK}[��j�*�ri/1.8/system/Net/HTTP/request_head-i.yamlnu�[���PK}[C���%�ri/1.8/system/Net/HTTP/use_ssl-i.yamlnu�[���PK}[��V��'�ri/1.8/system/Net/HTTP/peer_cert-i.yamlnu�[���PK}[��	{��'�ri/1.8/system/Net/HTTP/conn_port-i.yamlnu�[���PK}[�`*���&�	ri/1.8/system/Net/HTTP/do_start-i.yamlnu�[���PK}[�
#nn"�
ri/1.8/system/Net/HTTP/head-i.yamlnu�[���PK}[�5���1�ri/1.8/system/Net/HTTP/Options/cdesc-Options.yamlnu�[���PK}[Z� ��+�ri/1.8/system/Net/HTTP/Head/cdesc-Head.yamlnu�[���PK}[�j^SS$�ri/1.8/system/Net/HTTP/delete-i.yamlnu�[���PK}[q�K�#}ri/1.8/system/Net/HTTP/post2-i.yamlnu�[���PK}[����NN'�ri/1.8/system/Net/HTTP/proppatch-i.yamlnu�[���PK}[0��(vri/1.8/system/Net/HTTP/on_connect-i.yamlnu�[���PK}[������*�ri/1.8/system/Net/HTTP/conn_address-i.yamlnu�[���PK}[J�J���3�ri/1.8/system/Net/HTTP/Propfind/cdesc-Propfind.yamlnu�[���PK}[Pޣ-��'!ri/1.8/system/Net/HTTP/active%3f-i.yamlnu�[���PK}[��-@@(]ri/1.8/system/Net/HTTP/proxy_port-i.yamlnu�[���PK}[��*�EE$�ri/1.8/system/Net/HTTP/unlock-i.yamlnu�[���PK}[��:"� ri/1.8/system/Net/HTTP/post-i.yamlnu�[���PK}[N��hgg*�'ri/1.8/system/Net/HTTP/send_request-i.yamlnu�[���PK}[��|���*ri/1.8/system/Net/HTTP/D-i.yamlnu�[���PK}[����!�+ri/1.8/system/Net/HTTP/get-c.yamlnu�[���PK}[K4RYY!�.ri/1.8/system/Net/HTTP/get-i.yamlnu�[���PK}[r;�$��%E5ri/1.8/system/Net/HTTP/inspect-i.yamlnu�[���PK}[�8��$E6ri/1.8/system/Net/HTTP/finish-i.yamlnu�[���PK}[�_���+�7ri/1.8/system/Net/HTTP/end_transport-i.yamlnu�[���PK}[3��O��2�8ri/1.8/system/Net/HTTP/ssl_context_accessor-c.yamlnu�[���PK}[V:]<<#�9ri/1.8/system/Net/HTTP/trace-i.yamlnu�[���PK}[���yKK!�;ri/1.8/system/Net/HTTP/new-c.yamlnu�[���PK}[�,'=ri/1.8/system/Net/HTTP/version_1_1%3f-c.yamlnu�[���PK}[���<nn)�>ri/1.8/system/Net/HTTP/request_get-i.yamlnu�[���PK}[�Q99"iCri/1.8/system/Net/HTTP/copy-i.yamlnu�[���PK}[p�z��*�Dri/1.8/system/Net/HTTP/request_post-i.yamlnu�[���PK}[�<%
Jri/1.8/system/Net/HTTP/request-i.yamlnu�[���PK}[�kV33#yMri/1.8/system/Net/HTTP/start-i.yamlnu�[���PK}[w��""0�Ori/1.8/system/Net/HTTP/https_default_port-c.yamlnu�[���PK}[�c����+�Qri/1.8/system/Net/HTTP/Post/cdesc-Post.yamlnu�[���PK}[�ψɿ�-�Sri/1.8/system/Net/HTTP/begin_transport-i.yamlnu�[���PK}[��W6��-�Tri/1.8/system/Net/HTTP/Mkcol/cdesc-Mkcol.yamlnu�[���PK}[�# ���'�Vri/1.8/system/Net/HTTP/addr_port-i.yamlnu�[���PK}[X��l��(�Wri/1.8/system/Net/HTTP/timeout%3d-i.yamlnu�[���PK}[���,1Yri/1.8/system/Net/HTTP/proxy_class%3f-c.yamlnu�[���PK}[
�A���'�Zri/1.8/system/Net/HTTP/proxyaddr-i.yamlnu�[���PK}[H�ص��5�[ri/1.8/system/Net/HTTP/Proppatch/cdesc-Proppatch.yamlnu�[���PK}[�;j��)^ri/1.8/system/Net/HTTP/Get/cdesc-Get.yamlnu�[���PK}[�sxE��'[`ri/1.8/system/Net/HTTP/edit_path-i.yamlnu�[���PK}[_�U�HH#fari/1.8/system/Net/HTTP/mkcol-i.yamlnu�[���PK}[�j��-cri/1.8/system/Net/HTTP/read_timeout%3d-i.yamlnu�[���PK}[
�V�,cdri/1.8/system/Net/HTTP/version_1_2%3f-c.yamlnu�[���PK}[G8PA)�eri/1.8/system/Net/HTTP/version_1_1-c.yamlnu�[���PK}[rG�2��+Kgri/1.8/system/Net/HTTP/keep_alive%3f-i.yamlnu�[���PK}[>�`�BB%bhri/1.8/system/Net/HTTP/options-i.yamlnu�[���PK}[�ʰ�'�iri/1.8/system/Net/HTTP/do_finish-i.yamlnu�[���PK}[ ?Ã??"kri/1.8/system/Net/HTTP/lock-i.yamlnu�[���PK}[ȩ���"�lri/1.8/system/Net/HTTP/get2-i.yamlnu�[���PK}[7�@�7�7&�mri/1.8/system/Net/HTTP/cdesc-HTTP.yamlnu�[���PK}[��ø�/$�ri/1.8/system/Net/HTTP/Delete/cdesc-Delete.yamlnu�[���PK}[^DU=kk(;�ri/1.8/system/Net/HTTP/use_ssl%3d-i.yamlnu�[���PK}[�w
|��-��ri/1.8/system/Net/HTTP/Trace/cdesc-Trace.yamlnu�[���PK}[k��i^^&�ri/1.8/system/Net/HTTP/propfind-i.yamlnu�[���PK}[JZ���,ĭri/1.8/system/Net/HTTP/ssl_timeout%3d-i.yamlnu�[���PK}[(���#�ri/1.8/system/Net/HTTP/start-c.yamlnu�[���PK}[x���'9�ri/1.8/system/Net/HTTP/get_print-c.yamlnu�[���PK}[T'ٲ�++�ri/1.8/system/Net/HTTP/Copy/cdesc-Copy.yamlnu�[���PK}[�BB+8�ri/1.8/system/Net/HTTP/proxy_address-i.yamlnu�[���PK}[6�y~��)ոri/1.8/system/Net/HTTP/version_1_2-c.yamlnu�[���PK}[�9��###��ri/1.8/system/Net/HTTP/Proxy-c.yamlnu�[���PK}[Bɓ^��'p�ri/1.8/system/Net/HTTP/post_form-c.yamlnu�[���PK}[����&K�ri/1.8/system/Net/HTTP/proxy%3f-i.yamlnu�[���PK}[��η�/��ri/1.8/system/Net/HTTP/Unlock/cdesc-Unlock.yamlnu�[���PK}[�
�++(��ri/1.8/system/Net/POP3/started%3f-i.yamlnu�[���PK}[z����"+�ri/1.8/system/Net/POP3/each-i.yamlnu�[���PK}[7'�WW(]�ri/1.8/system/Net/POP3/enable_ssl-c.yamlnu�[���PK}[Ovx��)�ri/1.8/system/Net/POP3/disable_ssl-i.yamlnu�[���PK}[�d�*#�ri/1.8/system/Net/POP3/mails-i.yamlnu�[���PK}[ݸ6/��ri/1.8/system/Net/POP3/default_pop3_port-c.yamlnu�[���PK}[hV����%��ri/1.8/system/Net/POP3/foreach-c.yamlnu�[���PK}[�(�ii.�ri/1.8/system/Net/POP3/set_debug_output-i.yamlnu�[���PK}[3����(��ri/1.8/system/Net/POP3/use_ssl%3f-i.yamlnu�[���PK}[���%�ri/1.8/system/Net/POP3/n_bytes-i.yamlnu�[���PK}[z�ψ��*��ri/1.8/system/Net/POP3/default_port-c.yamlnu�[���PK}[}��4(!(!&��ri/1.8/system/Net/POP3/cdesc-POP3.yamlnu�[���PK}[HU�J��(L�ri/1.8/system/Net/POP3/ssl_params-c.yamlnu�[���PK}[��I���&U�ri/1.8/system/Net/POP3/do_start-i.yamlnu�[���PK}[�15Ҭ�%j�ri/1.8/system/Net/POP3/command-i.yamlnu�[���PK}[���+��(k�ri/1.8/system/Net/POP3/on_connect-i.yamlnu�[���PK}[>m����'u�ri/1.8/system/Net/POP3/active%3f-i.yamlnu�[���PK}[L��%�ri/1.8/system/Net/POP3/n_mails-i.yamlnu�[���PK}[��K%ri/1.8/system/Net/POP3/inspect-i.yamlnu�[���PK}[����#bri/1.8/system/Net/POP3/certs-c.yamlnu�[���PK}[��T$\ri/1.8/system/Net/POP3/finish-i.yamlnu�[���PK}[��R��(�ri/1.8/system/Net/POP3/use_ssl%3f-c.yamlnu�[���PK}[��3��!�ri/1.8/system/Net/POP3/new-c.yamlnu�[���PK}[�f��%�	ri/1.8/system/Net/POP3/apop%3f-i.yamlnu�[���PK}[�
���(ri/1.8/system/Net/POP3/enable_ssl-i.yamlnu�[���PK}[�Lu��/f
ri/1.8/system/Net/POP3/create_ssl_params-c.yamlnu�[���PK}[:�T��#�ri/1.8/system/Net/POP3/start-i.yamlnu�[���PK}[qT ީ�$�ri/1.8/system/Net/POP3/verify-c.yamlnu�[���PK}[�v�Pgg'�ri/1.8/system/Net/POP3/auth_only-c.yamlnu�[���PK}[mn��%�ri/1.8/system/Net/POP3/logging-i.yamlnu�[���PK}[��9Z��)�ri/1.8/system/Net/POP3/disable_ssl-c.yamlnu�[���PK}[Ö���-ri/1.8/system/Net/POP3/read_timeout%3d-i.yamlnu�[���PK}[��?��'Uri/1.8/system/Net/POP3/do_finish-i.yamlnu�[���PK}[9�E���"\ri/1.8/system/Net/POP3/port-i.yamlnu�[���PK}[��f"�ri/1.8/system/Net/POP3/APOP-c.yamlnu�[���PK}[O�z�nn#�ri/1.8/system/Net/POP3/reset-i.yamlnu�[���PK}[9ko���'�ri/1.8/system/Net/POP3/auth_only-i.yamlnu�[���PK}[��`raa#�!ri/1.8/system/Net/POP3/start-c.yamlnu�[���PK}[�B[

(X%ri/1.8/system/Net/POP3/delete_all-c.yamlnu�[���PK}[��0�(ri/1.8/system/Net/POP3/default_pop3s_port-c.yamlnu�[���PK}[u�Q��(0*ri/1.8/system/Net/POP3/delete_all-i.yamlnu�[���PK}[6���'I-ri/1.8/system/Net/POP3/each_mail-i.yamlnu�[���PK}[�Ue���<�/ri/1.8/system/Net/ProtoFatalError/cdesc-ProtoFatalError.yamlnu�[���PK}[��\�__:�0ri/1.8/system/Net/HTTPExceptions/cdesc-HTTPExceptions.yamlnu�[���PK}[ğF��@�2ri/1.8/system/Net/ProtoUnknownError/cdesc-ProtoUnknownError.yamlnu�[���PK}[2�ߵ��4�3ri/1.8/system/Net/POP3Command/cdesc-POP3Command.yamlnu�[���PK}[��++:+5ri/1.8/system/FloatDomainError/cdesc-FloatDomainError.yamlnu�[���PK}[nJ�,��,�6ri/1.8/system/IRB/FileInputMethod/new-c.yamlnu�[���PK}[L�L��-�7ri/1.8/system/IRB/FileInputMethod/gets-i.yamlnu�[���PK}[�l��/�8ri/1.8/system/IRB/FileInputMethod/eof%3f-i.yamlnu�[���PK}[E����<�9ri/1.8/system/IRB/FileInputMethod/cdesc-FileInputMethod.yamlnu�[���PK}[!u,��<�;ri/1.8/system/IRB/ContextExtender/cdesc-ContextExtender.yamlnu�[���PK}[n�b��;0>ri/1.8/system/IRB/ContextExtender/def_extend_command-c.yamlnu�[���PK}[��k#��@�?ri/1.8/system/IRB/ContextExtender/install_extend_commands-c.yamlnu�[���PK}[�W�Ŀ�:�@ri/1.8/system/IRB/InputCompletor/cdesc-InputCompletor.yamlnu�[���PK}['�PQ��6�Eri/1.8/system/IRB/InputCompletor/select_message-c.yamlnu�[���PK}[/����� 9Gri/1.8/system/IRB/cdesc-IRB.yamlnu�[���PK}[�u�J��:QOri/1.8/system/IRB/HistorySavingAbility/save_history-i.yamlnu�[���PK}[2ge��:�Pri/1.8/system/IRB/HistorySavingAbility/load_history-i.yamlnu�[���PK}[v�i���6�Qri/1.8/system/IRB/HistorySavingAbility/extended-c.yamlnu�[���PK}[�9����F�Tri/1.8/system/IRB/HistorySavingAbility/cdesc-HistorySavingAbility.yamlnu�[���PK}[��;���:�Vri/1.8/system/IRB/ExtendCommandBundle/extend_object-c.yamlnu�[���PK}[:>
���8	Xri/1.8/system/IRB/ExtendCommandBundle/irb_require-i.yamlnu�[���PK}[5a��VVA<Yri/1.8/system/IRB/ExtendCommandBundle/install_alias_method-i.yamlnu�[���PK}[Z��HH?[ri/1.8/system/IRB/ExtendCommandBundle/def_extend_command-c.yamlnu�[���PK}[��p���8�\ri/1.8/system/IRB/ExtendCommandBundle/irb_context-i.yamlnu�[���PK}[MLC���5�]ri/1.8/system/IRB/ExtendCommandBundle/irb_load-i.yamlnu�[���PK}[������E_ri/1.8/system/IRB/ExtendCommandBundle/irb_original_method_name-c.yamlnu�[���PK}[K����5j`ri/1.8/system/IRB/ExtendCommandBundle/irb_exit-i.yamlnu�[���PK}[[ڟ��D�ari/1.8/system/IRB/ExtendCommandBundle/install_extend_commands-c.yamlnu�[���PK}[!#OOD�bri/1.8/system/IRB/ExtendCommandBundle/cdesc-ExtendCommandBundle.yamlnu�[���PK}[�b��� �gri/1.8/system/IRB/rc_file-c.yamlnu�[���PK}[
 ���#�hri/1.8/system/IRB/init_error-c.yamlnu�[���PK}[.o���#�iri/1.8/system/IRB/run_config-c.yamlnu�[���PK}[�8/���=�jri/1.8/system/IRB/IrbLoader/search_file_from_ruby_path-i.yamlnu�[���PK}[���^��&lri/1.8/system/IRB/IrbLoader/old-i.yamlnu�[���PK}[��|��+mri/1.8/system/IRB/IrbLoader/irb_load-i.yamlnu�[���PK}[�s����,4nri/1.8/system/IRB/IrbLoader/load_file-i.yamlnu�[���PK}[��2t��0Tori/1.8/system/IRB/IrbLoader/cdesc-IrbLoader.yamlnu�[���PK}[Ù}��.qri/1.8/system/IRB/IrbLoader/source_file-i.yamlnu�[���PK}[o����)�rri/1.8/system/IRB/Frame/trace_func-i.yamlnu�[���PK}[2'�X��"�sri/1.8/system/IRB/Frame/top-i.yamlnu�[���PK}[�l��"�tri/1.8/system/IRB/Frame/new-c.yamlnu�[���PK}[��鼤�(�uri/1.8/system/IRB/Frame/cdesc-Frame.yamlnu�[���PK}[%����%�xri/1.8/system/IRB/Frame/bottom-c.yamlnu�[���PK}[Y��+��"�yri/1.8/system/IRB/Frame/top-c.yamlnu�[���PK}[B�t��%�zri/1.8/system/IRB/Frame/sender-c.yamlnu�[���PK}[
�w��%�{ri/1.8/system/IRB/Frame/bottom-i.yamlnu�[���PK}[��D��$�|ri/1.8/system/IRB/irb_at_exit-c.yamlnu�[���PK}[:\����.�}ri/1.8/system/IRB/Context/use_loader%3f-i.yamlnu�[���PK}[}{S���):ri/1.8/system/IRB/Context/evaluate-i.yamlnu�[���PK}[�i��-P�ri/1.8/system/IRB/Context/save_history-i.yamlnu�[���PK}[`�"��.e�ri/1.8/system/IRB/Context/pop_workspace-i.yamlnu�[���PK}[�&V��0}�ri/1.8/system/IRB/Context/save_history%3d-i.yamlnu�[���PK}[��0���+��ri/1.8/system/IRB/Context/use_loader-i.yamlnu�[���PK}[���!��+؄ri/1.8/system/IRB/Context/verbose%3f-i.yamlnu�[���PK}[	;Q��0�ri/1.8/system/IRB/Context/history_file%3d-i.yamlnu�[���PK}[}�e��.�ri/1.8/system/IRB/Context/use_loader%3d-i.yamlnu�[���PK}[������+�ri/1.8/system/IRB/Context/inspect%3f-i.yamlnu�[���PK}[��ݨ��/#�ri/1.8/system/IRB/Context/home_workspace-i.yamlnu�[���PK}[�D���0>�ri/1.8/system/IRB/Context/eval_history%3d-i.yamlnu�[���PK}[��3��/Z�ri/1.8/system/IRB/Context/debug_level%3d-i.yamlnu�[���PK}[8t)��0v�ri/1.8/system/IRB/Context/inspect_mode%3d-i.yamlnu�[���PK}[
r;���/��ri/1.8/system/IRB/Context/set_last_value-i.yamlnu�[���PK}[?��Y��.�ri/1.8/system/IRB/Context/use_tracer%3d-i.yamlnu�[���PK}[��~��1��ri/1.8/system/IRB/Context/change_workspace-i.yamlnu�[���PK}[��G��($�ri/1.8/system/IRB/Context/inspect-i.yamlnu�[���PK}[H2����0R�ri/1.8/system/IRB/Context/use_readline%3d-i.yamlnu�[���PK}[C�$��-o�ri/1.8/system/IRB/Context/history_file-i.yamlnu�[���PK}[E��#��%��ri/1.8/system/IRB/Context/exit-i.yamlnu�[���PK}[��6��$��ri/1.8/system/IRB/Context/new-c.yamlnu�[���PK}[�>�Z��2��ri/1.8/system/IRB/Context/init_save_history-i.yamlnu�[���PK}[k&cpp,��ri/1.8/system/IRB/Context/cdesc-Context.yamlnu�[���PK}[&񔖴�+��ri/1.8/system/IRB/Context/workspaces-i.yamlnu�[���PK}[�����.��ri/1.8/system/IRB/Context/file_input%3f-i.yamlnu�[���PK}[���o��%��ri/1.8/system/IRB/Context/to_s-i.yamlnu�[���PK}[ D{��)�ri/1.8/system/IRB/Context/debug%3f-i.yamlnu�[���PK}[��@��*�ri/1.8/system/IRB/Context/irb_level-i.yamlnu�[���PK}[T&o��/�ri/1.8/system/IRB/Context/push_workspace-i.yamlnu�[���PK}[}B���/�ri/1.8/system/IRB/Context/prompt_mode%3d-i.yamlnu�[���PK}[̟���%.�ri/1.8/system/IRB/Context/main-i.yamlnu�[���PK}[��\0+�ri/1.8/system/IRB/Context/_set_last_value-i.yamlnu�[���PK}['Dy���-��ri/1.8/system/IRB/Context/prompting%3f-i.yamlnu�[���PK}[�t����-��ri/1.8/system/IRB/Context/math_mode%3d-i.yamlnu�[���PK}[�ٝ$--:��ri/1.8/system/IRB/ExtendCommand/Require/cdesc-Require.yamlnu�[���PK}[�Z�Z��6J�ri/1.8/system/IRB/ExtendCommand/Require/execute-i.yamlnu�[���PK}[���l��5v�ri/1.8/system/IRB/ExtendCommand/Source/execute-i.yamlnu�[���PK}[�,yb++8��ri/1.8/system/IRB/ExtendCommand/Source/cdesc-Source.yamlnu�[���PK}[g�����;3�ri/1.8/system/IRB/ExtendCommand/PopWorkspace/execute-i.yamlnu�[���PK}[����Dd�ri/1.8/system/IRB/ExtendCommand/PopWorkspace/cdesc-PopWorkspace.yamlnu�[���PK}[�,���3�ri/1.8/system/IRB/ExtendCommand/Help/execute-c.yamlnu�[���PK}[������4�ri/1.8/system/IRB/ExtendCommand/Help/cdesc-Help.yamlnu�[���PK}[�;e;��9f�ri/1.8/system/IRB/ExtendCommand/IrbCommand/execute-i.yamlnu�[���PK}[�(@��ri/1.8/system/IRB/ExtendCommand/IrbCommand/cdesc-IrbCommand.yamlnu�[���PK}[O8ʃ��<�ri/1.8/system/IRB/ExtendCommand/PushWorkspace/execute-i.yamlnu�[���PK}[Cy��F7�ri/1.8/system/IRB/ExtendCommand/PushWorkspace/cdesc-PushWorkspace.yamlnu�[���PK	}[�O��F��ri/1.8/system/IRB/ExtendCommand/CurrentWorkingWorkspace/execute-i.yamlnu�[���PK	}[�'F�Z�ri/1.8/system/IRB/ExtendCommand/CurrentWorkingWorkspace/cdesc-CurrentWorkingWorkspace.yamlnu�[���PK	}[�����>��ri/1.8/system/IRB/ExtendCommand/ChangeWorkspace/execute-i.yamlnu�[���PK	}[�i�J��ri/1.8/system/IRB/ExtendCommand/ChangeWorkspace/cdesc-ChangeWorkspace.yamlnu�[���PK	}["8ޱ�.c�ri/1.8/system/IRB/ExtendCommand/Nop/irb-i.yamlnu�[���PK	}[�r�H��2r�ri/1.8/system/IRB/ExtendCommand/Nop/cdesc-Nop.yamlnu�[���PK	}[�c����2��ri/1.8/system/IRB/ExtendCommand/Nop/execute-c.yamlnu�[���PK	}[�N��2��ri/1.8/system/IRB/ExtendCommand/Nop/execute-i.yamlnu�[���PK	}[��ذ��.��ri/1.8/system/IRB/ExtendCommand/Nop/new-c.yamlnu�[���PK	}[߰����8��ri/1.8/system/IRB/ExtendCommand/cdesc-ExtendCommand.yamlnu�[���PK	}[�mѺ�3�ri/1.8/system/IRB/ExtendCommand/Jobs/execute-i.yamlnu�[���PK	}[h]2��4<�ri/1.8/system/IRB/ExtendCommand/Jobs/cdesc-Jobs.yamlnu�[���PK	}[�0����9��ri/1.8/system/IRB/ExtendCommand/Foreground/execute-i.yamlnu�[���PK	}[��o!@��ri/1.8/system/IRB/ExtendCommand/Foreground/cdesc-Foreground.yamlnu�[���PK	}[�.��92�ri/1.8/system/IRB/ExtendCommand/Workspaces/execute-i.yamlnu�[���PK
}[�G+�@_�ri/1.8/system/IRB/ExtendCommand/Workspaces/cdesc-Workspaces.yamlnu�[���PK
}[��� ��4��ri/1.8/system/IRB/ExtendCommand/Kill/cdesc-Kill.yamlnu�[���PK
}[P�w��3)�ri/1.8/system/IRB/ExtendCommand/Kill/execute-i.yamlnu�[���PK
}[P�>���3K�ri/1.8/system/IRB/ExtendCommand/Load/execute-i.yamlnu�[���PK
}[|m#''4}�ri/1.8/system/IRB/ExtendCommand/Load/cdesc-Load.yamlnu�[���PK
}[��y���3�ri/1.8/system/IRB/ExtendCommand/Fork/execute-i.yamlnu�[���PK
}[����46�ri/1.8/system/IRB/ExtendCommand/Fork/cdesc-Fork.yamlnu�[���PK
}[���'��ri/1.8/system/IRB/JobManager/irb-i.yamlnu�[���PK
}[o���/��ri/1.8/system/IRB/JobManager/main_thread-i.yamlnu�[���PK
}[T�����*��ri/1.8/system/IRB/JobManager/n_jobs-i.yamlnu�[���PK
}[���߳�,��ri/1.8/system/IRB/JobManager/main_irb-i.yamlnu�[���PK
}[/�v��*��ri/1.8/system/IRB/JobManager/delete-i.yamlnu�[���PK
}[�_�s��(��ri/1.8/system/IRB/JobManager/kill-i.yamlnu�[���PK
}[��ű�+��ri/1.8/system/IRB/JobManager/inspect-i.yamlnu�[���PK
}[&"�	��*��ri/1.8/system/IRB/JobManager/switch-i.yamlnu�[���PK
}[�$�G��'��ri/1.8/system/IRB/JobManager/new-c.yamlnu�[���PK
}[
�*���2��ri/1.8/system/IRB/JobManager/cdesc-JobManager.yamlnu�[���PK
}[��A��*��ri/1.8/system/IRB/JobManager/thread-i.yamlnu�[���PK
}[�1$ɲ�*��ri/1.8/system/IRB/JobManager/insert-i.yamlnu�[���PK
}[�ޱ���*��ri/1.8/system/IRB/JobManager/search-i.yamlnu�[���PK
}[��d���&��ri/1.8/system/IRB/SLex/postproc-i.yamlnu�[���PK
}[�/��+?�ri/1.8/system/IRB/SLex/Node/match_io-i.yamlnu�[���PK
}[
���(X�ri/1.8/system/IRB/SLex/Node/match-i.yamlnu�[���PK
}[�iO���1L�ri/1.8/system/IRB/SLex/Node/create_subnode-i.yamlnu�[���PK
}[KTn0OO&��ri/1.8/system/IRB/SLex/Node/new-c.yamlnu�[���PK
}[4��99+4�ri/1.8/system/IRB/SLex/Node/cdesc-Node.yamlnu�[���PK
}[�5�|��)�ri/1.8/system/IRB/SLex/Node/search-i.yamlnu�[���PK
}[c�I���$�ri/1.8/system/IRB/SLex/create-i.yamlnu�[���PK
}[c�v��#ri/1.8/system/IRB/SLex/match-i.yamlnu�[���PK
}[p^=#��%�ri/1.8/system/IRB/SLex/inspect-i.yamlnu�[���PK
}[�}%+��!�ri/1.8/system/IRB/SLex/new-c.yamlnu�[���PK
}[9����&�ri/1.8/system/IRB/SLex/def_rule-i.yamlnu�[���PK
}[\��'"ri/1.8/system/IRB/SLex/def_rules-i.yamlnu�[���PK
}[�
&7ri/1.8/system/IRB/SLex/cdesc-SLex.yamlnu�[���PK
}[#�ښ��%�	ri/1.8/system/IRB/SLex/preproc-i.yamlnu�[���PK
}[��I��$�
ri/1.8/system/IRB/SLex/search-i.yamlnu�[���PK
}[1�goo+�ri/1.8/system/IRB/rc_file_generators-c.yamlnu�[���PK
}[�mm:h
ri/1.8/system/IRB/MethodExtender/cdesc-MethodExtender.yamlnu�[���PK
}[.�5�CC6?ri/1.8/system/IRB/MethodExtender/new_alias_name-i.yamlnu�[���PK
}[�֨��4�ri/1.8/system/IRB/MethodExtender/def_pre_proc-i.yamlnu�[���PK
}[�D���5%ri/1.8/system/IRB/MethodExtender/def_post_proc-i.yamlnu�[���PK
}[�i�$��!eri/1.8/system/IRB/irb_exit-c.yamlnu�[���PK
}[[U;��%eri/1.8/system/IRB/Locale/print-i.yamlnu�[���PK
}[���&hri/1.8/system/IRB/Locale/printf-i.yamlnu�[���PK
}[�)L���(nri/1.8/system/IRB/Locale/lc2kconv-i.yamlnu�[���PK
}[}�,a��$zri/1.8/system/IRB/Locale/find-i.yamlnu�[���PK
}[]����&�ri/1.8/system/IRB/Locale/String-i.yamlnu�[���PK
}[d9�R��(�ri/1.8/system/IRB/Locale/readline-i.yamlnu�[���PK
}[�>��uu*�ri/1.8/system/IRB/Locale/cdesc-Locale.yamlnu�[���PK
}[<$�@��$cri/1.8/system/IRB/Locale/load-i.yamlnu�[���PK
}[V�o��'l ri/1.8/system/IRB/Locale/lc_path-i.yamlnu�[���PK
}[�	�C��'�!ri/1.8/system/IRB/Locale/require-i.yamlnu�[���PK
}[TP���#�"ri/1.8/system/IRB/Locale/new-c.yamlnu�[���PK
}[
3���$�#ri/1.8/system/IRB/Locale/gets-i.yamlnu�[���PK
}[fT����&�$ri/1.8/system/IRB/Locale/format-i.yamlnu�[���PK
}[�6�ݼ�)�%ri/1.8/system/IRB/Locale/real_load-i.yamlnu�[���PK
}["�!��+�&ri/1.8/system/IRB/Locale/search_file-i.yamlnu�[���PK
}[Uu���$�'ri/1.8/system/IRB/Locale/puts-i.yamlnu�[���PK
}["xH��1�(ri/1.8/system/IRB/Irb/suspend_input_method-i.yamlnu�[���PK
}[\/���.*ri/1.8/system/IRB/Irb/suspend_workspace-i.yamlnu�[���PK
}[X)��$d+ri/1.8/system/IRB/Irb/cdesc-Irb.yamlnu�[���PK}[wv���#�/ri/1.8/system/IRB/Irb/prompt-i.yamlnu�[���PK}[Hi��$�0ri/1.8/system/IRB/Irb/inspect-i.yamlnu�[���PK}[�����)�1ri/1.8/system/IRB/Irb/suspend_name-i.yamlnu�[���PK}[	�
��� )3ri/1.8/system/IRB/Irb/new-c.yamlnu�[���PK}[�sbH��*S4ri/1.8/system/IRB/Irb/signal_handle-i.yamlnu�[���PK}[^t��*c5ri/1.8/system/IRB/Irb/signal_status-i.yamlnu�[���PK}[�X�!��)�6ri/1.8/system/IRB/Irb/output_value-i.yamlnu�[���PK}[MŚN��'�7ri/1.8/system/IRB/Irb/eval_input-i.yamlnu�[���PK}[�t���,�8ri/1.8/system/IRB/Irb/suspend_context-i.yamlnu�[���PK}[�h���':ri/1.8/system/IRB/CurrentContext-c.yamlnu�[���PK}[9�����;ri/1.8/system/IRB/irb-c.yamlnu�[���PK}['�qɟ�G<ri/1.8/system/IRB/conf-c.yamlnu�[���PK}[o�K��.3=ri/1.8/system/IRB/Notifier/def_notifier-i.yamlnu�[���PK}[��GT��8|>ri/1.8/system/IRB/Notifier/AbstructNotifier/print-i.yamlnu�[���PK}[��j��9�?ri/1.8/system/IRB/Notifier/AbstructNotifier/printf-i.yamlnu�[���PK}[S��
��6�@ri/1.8/system/IRB/Notifier/AbstructNotifier/ppx-i.yamlnu�[���PK}[]37���5Bri/1.8/system/IRB/Notifier/AbstructNotifier/pp-i.yamlnu�[���PK}[��{��6(Cri/1.8/system/IRB/Notifier/AbstructNotifier/new-c.yamlnu�[���PK}[��BU��<\Dri/1.8/system/IRB/Notifier/AbstructNotifier/notify%3f-i.yamlnu�[���PK}[�P�^��G�Eri/1.8/system/IRB/Notifier/AbstructNotifier/cdesc-AbstructNotifier.yamlnu�[���PK}[Ǐ���9�Hri/1.8/system/IRB/Notifier/AbstructNotifier/printn-i.yamlnu�[���PK}[}����7�Iri/1.8/system/IRB/Notifier/AbstructNotifier/puts-i.yamlnu�[���PK}[�'�.��:Kri/1.8/system/IRB/Notifier/AbstructNotifier/exec_if-i.yamlnu�[���PK}[i�~�<<IhLri/1.8/system/IRB/Notifier/CompositeNotifier/cdesc-CompositeNotifier.yamlnu�[���PK}[6�?��@Ori/1.8/system/IRB/Notifier/CompositeNotifier/def_notifier-i.yamlnu�[���PK}[D��_<kPri/1.8/system/IRB/Notifier/CompositeNotifier/level%3d-i.yamlnu�[���PK}[��,E�Qri/1.8/system/IRB/Notifier/CompositeNotifier/level_notifier%3d-i.yamlnu�[���PK}[��s��7SSri/1.8/system/IRB/Notifier/CompositeNotifier/new-c.yamlnu�[���PK}[wo�(��E�Tri/1.8/system/IRB/Notifier/LeveledNotifier/cdesc-LeveledNotifier.yamlnu�[���PK}[�?F��;�Vri/1.8/system/IRB/Notifier/LeveledNotifier/%3c%3d%3e-i.yamlnu�[���PK}[��'k��5Xri/1.8/system/IRB/Notifier/LeveledNotifier/new-c.yamlnu�[���PK}[N����;2Yri/1.8/system/IRB/Notifier/LeveledNotifier/notify%3f-i.yamlnu�[���PK}[��/AA.]Zri/1.8/system/IRB/Notifier/cdesc-Notifier.yamlnu�[���PK}[����99A�[ri/1.8/system/IRB/Notifier/NoMsgNotifier/cdesc-NoMsgNotifier.yamlnu�[���PK}[V�B^��3�]ri/1.8/system/IRB/Notifier/NoMsgNotifier/new-c.yamlnu�[���PK}[Z�㑾�9�^ri/1.8/system/IRB/Notifier/NoMsgNotifier/notify%3f-i.yamlnu�[���PK}[�XE���(�_ri/1.8/system/IRB/Abort/cdesc-Abort.yamlnu�[���PK}[
�k��#�`ri/1.8/system/IRB/JobManager-c.yamlnu�[���PK}[�U{��"�ari/1.8/system/IRB/irb_abort-c.yamlnu�[���PK}[��؎��0cri/1.8/system/IRB/LoadAbort/cdesc-LoadAbort.yamlnu�[���PK}[�\Jv��$3dri/1.8/system/IRB/print_usage-c.yamlnu�[���PK}[�ҙ��(4eri/1.8/system/IRB/InputMethod/new-c.yamlnu�[���PK}[�� ��)Lfri/1.8/system/IRB/InputMethod/gets-i.yamlnu�[���PK}[�	����4Qgri/1.8/system/IRB/InputMethod/cdesc-InputMethod.yamlnu�[���PK}[+ð���:�iri/1.8/system/IRB/InputMethod/readable_atfer_eof%3f-i.yamlnu�[���PK}[zf�q��0�jri/1.8/system/IRB/StdioOutputMethod/print-i.yamlnu�[���PK}[�>�@�kri/1.8/system/IRB/StdioOutputMethod/cdesc-StdioOutputMethod.yamlnu�[���PK}[����� Ymri/1.8/system/IRB/version-c.yamlnu�[���PK}[ْƚ��*�nri/1.8/system/IRB/initialize_tracer-c.yamlnu�[���PK}[㳖���&�ori/1.8/system/IRB/delete_caller-c.yamlnu�[���PK}[�;^K��1�pri/1.8/system/IRB/ReadlineInputMethod/line-i.yamlnu�[���PK}[얛�D�qri/1.8/system/IRB/ReadlineInputMethod/cdesc-ReadlineInputMethod.yamlnu�[���PK}[�r����0ptri/1.8/system/IRB/ReadlineInputMethod/new-c.yamlnu�[���PK}[�#ߏ��1�uri/1.8/system/IRB/ReadlineInputMethod/gets-i.yamlnu�[���PK}[EKd���3�vri/1.8/system/IRB/ReadlineInputMethod/eof%3f-i.yamlnu�[���PK}[�
���B�wri/1.8/system/IRB/ReadlineInputMethod/readable_atfer_eof%3f-i.yamlnu�[���PK}[%ݝ����xri/1.8/system/IRB/setup-c.yamlnu�[���PK}[\��-��%zri/1.8/system/IRB/History/size-i.yamlnu�[���PK}[ܶ^:��'{ri/1.8/system/IRB/History/%5b%5d-i.yamlnu�[���PK}[-T]���,|ri/1.8/system/IRB/History/cdesc-History.yamlnu�[���PK}[�H${��("~ri/1.8/system/IRB/History/inspect-i.yamlnu�[���PK}[O��Q��$(ri/1.8/system/IRB/History/new-c.yamlnu�[���PK}[��>��%+�ri/1.8/system/IRB/History/push-i.yamlnu�[���PK}[P����$/�ri/1.8/system/IRB/init_config-c.yamlnu�[���PK}[>Pyb��+s�ri/1.8/system/IRB/WorkSpace/evaluate-i.yamlnu�[���PK}[��cl3��ri/1.8/system/IRB/WorkSpace/filter_backtrace-i.yamlnu�[���PK}[�D��BB0�ri/1.8/system/IRB/WorkSpace/cdesc-WorkSpace.yamlnu�[���PK}[�n��44&��ri/1.8/system/IRB/WorkSpace/new-c.yamlnu�[���PK}[�CK~))/<�ri/1.8/system/IRB/WorkSpace/__evaluate__-i.yamlnu�[���PK}[�?��#Ċri/1.8/system/IRB/parse_opts-c.yamlnu�[���PK}[ %���%��ri/1.8/system/IRB/load_modules-c.yamlnu�[���PK}[1Z���/�ri/1.8/system/IRB/start-c.yamlnu�[���PK
}[Й@9��.v�ri/1.8/system/IRB/StdioInputMethod/line-i.yamlnu�[���PK
}[G(���>��ri/1.8/system/IRB/StdioInputMethod/cdesc-StdioInputMethod.yamlnu�[���PK
}[�Lu��-đri/1.8/system/IRB/StdioInputMethod/new-c.yamlnu�[���PK
}[_���.Вri/1.8/system/IRB/StdioInputMethod/gets-i.yamlnu�[���PK
}[�q䑱�0ߓri/1.8/system/IRB/StdioInputMethod/eof%3f-i.yamlnu�[���PK
}[�h�Y��?�ri/1.8/system/IRB/StdioInputMethod/readable_atfer_eof%3f-i.yamlnu�[���PK
}[�J�D��+.�ri/1.8/system/IRB/OutputMethod/print-i.yamlnu�[���PK
}[!y��,=�ri/1.8/system/IRB/OutputMethod/printf-i.yamlnu�[���PK
}[���)��ri/1.8/system/IRB/OutputMethod/ppx-i.yamlnu�[���PK
}[N���)��ri/1.8/system/IRB/OutputMethod/foo-i.yamlnu�[���PK
}[�S�uee9��ri/1.8/system/IRB/OutputMethod/parse_printf_format-i.yamlnu�[���PK
}[�4�M��(r�ri/1.8/system/IRB/OutputMethod/pp-i.yamlnu�[���PK
}[3L��,x�ri/1.8/system/IRB/OutputMethod/printn-i.yamlnu�[���PK
}[�I���*��ri/1.8/system/IRB/OutputMethod/puts-i.yamlnu�[���PK
}[�ё���6��ri/1.8/system/IRB/OutputMethod/cdesc-OutputMethod.yamlnu�[���PK
}[����ri/1.8/system/Prime/each-i.yamlnu�[���PK
}[ �l��$��ri/1.8/system/Prime/cdesc-Prime.yamlnu�[���PK
}[��hw����ri/1.8/system/Prime/next-i.yamlnu�[���PK
}[��I���էri/1.8/system/Prime/new-c.yamlnu�[���PK
}[ūb���¨ri/1.8/system/Prime/succ-i.yamlnu�[���PK
}[zdI��کri/1.8/system/Sync/new-c.yamlnu�[���PK
}[�^~�"Ūri/1.8/system/Sync/cdesc-Sync.yamlnu�[���PK
}[����,&�ri/1.8/system/TCPServer/cdesc-TCPServer.yamlnu�[���PK
}[t��OO.T�ri/1.8/system/TCPServer/accept_nonblock-i.yamlnu�[���PK
}[���''%�ri/1.8/system/TCPServer/listen-i.yamlnu�[���PK
}[��3Q��,}�ri/1.8/system/NonString/cdesc-NonString.yamlnu�[���PK
}[�5�.��ri/1.8/system/SystemExit/cdesc-SystemExit.yamlnu�[���PK
}[3�'�66#
�ri/1.8/system/SystemExit/new-c.yamlnu�[���PK
}[�v��))&��ri/1.8/system/SystemExit/status-i.yamlnu�[���PK
}[�
-�??*�ri/1.8/system/SystemExit/success%3f-i.yamlnu�[���PK
}[Dh�J��C��ri/1.8/system/PP/ObjectMixin/pretty_print_instance_variables-i.yamlnu�[���PK
}[�a��0��ri/1.8/system/PP/ObjectMixin/pretty_print-i.yamlnu�[���PK
}[H��GG6��ri/1.8/system/PP/ObjectMixin/pretty_print_cycle-i.yamlnu�[���PK
}[�j��3��ri/1.8/system/PP/ObjectMixin/cdesc-ObjectMixin.yamlnu�[���PK
}[��P�VV8��ri/1.8/system/PP/ObjectMixin/pretty_print_inspect-i.yamlnu�[���PK
}[1�Vzz%��ri/1.8/system/PP/singleline_pp-c.yamlnu�[���PK
}[P���1O�ri/1.8/system/PP/SingleLine/cdesc-SingleLine.yamlnu�[���PK
}[������ri/1.8/system/PP/pp-c.yamlnu�[���PK
}[����ri/1.8/system/PP/cdesc-PP.yamlnu�[���PK
}[1�4��/Q�ri/1.8/system/PP/PPMethods/cdesc-PPMethods.yamlnu�[���PK
}[tƜ���$p�ri/1.8/system/PP/PPMethods/pp-i.yamlnu�[���PK
}[�w����3��ri/1.8/system/PP/PPMethods/guard_inspect_key-i.yamlnu�[���PK
}[�أ��)��ri/1.8/system/PP/PPMethods/pp_hash-i.yamlnu�[���PK
}[j	"��)��ri/1.8/system/PP/PPMethods/seplist-i.yamlnu�[���PK
}[K[��+�ri/1.8/system/PP/PPMethods/pp_object-i.yamlnu�[���PK
}[B<�||.�ri/1.8/system/PP/PPMethods/object_group-i.yamlnu�[���PK
}[�W���6��ri/1.8/system/PP/PPMethods/object_address_group-i.yamlnu�[���PK
}[H���WW1�ri/1.8/system/PP/PPMethods/comma_breakable-i.yamlnu�[���PK
}[�}|nn ��ri/1.8/system/Foo/cdesc-Foo.yamlnu�[���PK
}[�N��c�ri/1.8/system/Foo/new-c.yamlnu�[���PK
}[�}���O�ri/1.8/system/Foo/hello-i.yamlnu�[���PK
}[�t����@ri/1.8/system/Foo/to_s-i.yamlnu�[���PK
}[�/�44?,ri/1.8/system/SingleForwardable/def_singleton_delegators-i.yamlnu�[���PK}[���]&&4�ri/1.8/system/SingleForwardable/def_delegator-i.yamlnu�[���PK}[	َ)00<Yri/1.8/system/SingleForwardable/cdesc-SingleForwardable.yamlnu�[���PK}[�J�5�	ri/1.8/system/SingleForwardable/def_delegators-i.yamlnu�[���PK}[}��1]]>wri/1.8/system/SingleForwardable/def_singleton_delegator-i.yamlnu�[���PK}[2�:��0Bri/1.8/system/SOCKSSocket/cdesc-SOCKSSocket.yamlnu�[���PK}[R�㱯�$8ri/1.8/system/SOCKSSocket/new-c.yamlnu�[���PK}[���i��;ri/1.8/system/File/copy-c.yamlnu�[���PK}[|�Y���,ri/1.8/system/File/chown-c.yamlnu�[���PK}[��D��� 8ri/1.8/system/File/delete-c.yamlnu�[���PK}[X��b��0ri/1.8/system/File/mtime-c.yamlnu�[���PK}[l���ri/1.8/system/File/umask-c.yamlnu�[���PK}[N ����!ri/1.8/system/File/ctime-i.yamlnu�[���PK}[��)��"&$ri/1.8/system/File/makedirs-c.yamlnu�[���PK}[l6��77!8'ri/1.8/system/File/file%3f-c.yamlnu�[���PK}[yTee*�(ri/1.8/system/File/readable_real%3f-c.yamlnu�[���PK}[Ӹ�OO*ri/1.8/system/File/flock-i.yamlnu�[���PK}[���R��!0ri/1.8/system/File/fnmatch-c.yamlnu�[���PK}[J�����jCri/1.8/system/File/ctime-c.yamlnu�[���PK}[i��xx�Eri/1.8/system/File/chmod-i.yamlnu�[���PK}[(��-�� bHri/1.8/system/File/lchown-c.yamlnu�[���PK}[�L�%%!�Jri/1.8/system/File/pipe%3f-c.yamlnu�[���PK}[�z|�88#Lri/1.8/system/File/setgid%3f-c.yamlnu�[���PK}[@�I�99%�Mri/1.8/system/File/blockdev%3f-c.yamlnu�[���PK}[i����� -Ori/1.8/system/File/lchmod-c.yamlnu�[���PK}[�"���"8Qri/1.8/system/File/cdesc-File.yamlnu�[���PK}[
0|:��[gri/1.8/system/File/ftype-c.yamlnu�[���PK}[��tק��jri/1.8/system/File/move-c.yamlnu�[���PK}[0�錏��lri/1.8/system/File/lstat-i.yamlnu�[���PK}[It���%sori/1.8/system/File/expand_path-c.yamlnu�[���PK}[������sri/1.8/system/File/lstat-c.yamlnu�[���PK}['��aWvri/1.8/system/File/path-i.yamlnu�[���PK}[k��]���xri/1.8/system/File/stat-c.yamlnu�[���PK}[�}'�� �zri/1.8/system/File/rename-c.yamlnu�[���PK}[���Maa"�|ri/1.8/system/File/exist%3f-c.yamlnu�[���PK}[�������~ri/1.8/system/File/join-c.yamlnu�[���PK}[�T�R!��ri/1.8/system/File/symlink-c.yamlnu�[���PK}[w�Kd���ri/1.8/system/File/atime-c.yamlnu�[���PK}[�B���%��ri/1.8/system/File/grpowned%3f-c.yamlnu�[���PK}[�\auu!�ri/1.8/system/File/extname-c.yamlnu�[���PK}[�Qcc#��ri/1.8/system/File/exists%3f-c.yamlnu�[���PK}[Ў�55!j�ri/1.8/system/File/zero%3f-c.yamlnu�[���PK}[A�[[%�ri/1.8/system/File/writable%3f-c.yamlnu�[���PK}[��#��ri/1.8/system/File/size-c.yamlnu�[���PK}[��!!��ri/1.8/system/File/split-c.yamlnu�[���PK}[q7��::$n�ri/1.8/system/File/chardev%3f-c.yamlnu�[���PK}[��nn#��ri/1.8/system/File/Stat/size-i.yamlnu�[���PK}[�����$��ri/1.8/system/File/Stat/ctime-i.yamlnu�[���PK}[�HH'�ri/1.8/system/File/Stat/cdesc-Stat.yamlnu�[���PK}[O��4��(��ri/1.8/system/File/Stat/socket%3f-i.yamlnu�[���PK}[Z���*ɥri/1.8/system/File/Stat/readable%3f-i.yamlnu�[���PK}[d|h�		$ߧri/1.8/system/File/Stat/nlink-i.yamlnu�[���PK}[�s���)<�ri/1.8/system/File/Stat/chardev%3f-i.yamlnu�[���PK}[�!@��(}�ri/1.8/system/File/Stat/dev_minor-i.yamlnu�[���PK}[���(��ri/1.8/system/File/Stat/%3c%3d%3e-i.yamlnu�[���PK}[�v���(�ri/1.8/system/File/Stat/dev_major-i.yamlnu�[���PK}[(:�|��))�ri/1.8/system/File/Stat/rdev_major-i.yamlnu�[���PK}[
�
MM#W�ri/1.8/system/File/Stat/mode-i.yamlnu�[���PK}[�G��)��ri/1.8/system/File/Stat/rdev_minor-i.yamlnu�[���PK}[2�f���*%�ri/1.8/system/File/Stat/writable%3f-i.yamlnu�[���PK}[įu�[[18�ri/1.8/system/File/Stat/executable_real%3f-i.yamlnu�[���PK}[[���"�ri/1.8/system/File/Stat/dev-i.yamlnu�[���PK}[��B�zz"пri/1.8/system/File/Stat/gid-i.yamlnu�[���PK}[1�9���&��ri/1.8/system/File/Stat/inspect-i.yamlnu�[���PK}[t����"��ri/1.8/system/File/Stat/new-c.yamlnu�[���PK}[U�lj��+u�ri/1.8/system/File/Stat/pretty_print-i.yamlnu�[���PK}[@��(,,*��ri/1.8/system/File/Stat/grpowned%3f-i.yamlnu�[���PK}[�y�nn"
�ri/1.8/system/File/Stat/ino-i.yamlnu�[���PK}[��z��$��ri/1.8/system/File/Stat/mtime-i.yamlnu�[���PK}[�����&��ri/1.8/system/File/Stat/blksize-i.yamlnu�[���PK}[}_T��&��ri/1.8/system/File/Stat/zero%3f-i.yamlnu�[���PK}[�����(��ri/1.8/system/File/Stat/sticky%3f-i.yamlnu�[���PK}[{����%�ri/1.8/system/File/Stat/blocks-i.yamlnu�[���PK}[�t��#J�ri/1.8/system/File/Stat/rdev-i.yamlnu�[���PK}[U��1��/��ri/1.8/system/File/Stat/readable_real%3f-i.yamlnu�[���PK}[�,=B��+��ri/1.8/system/File/Stat/directory%3f-i.yamlnu�[���PK}[w�V

),�ri/1.8/system/File/Stat/symlink%3f-i.yamlnu�[���PK}[5"[(��ri/1.8/system/File/Stat/setgid%3f-i.yamlnu�[���PK}[��c���(��ri/1.8/system/File/Stat/setuid%3f-i.yamlnu�[���PK}[M&�b��$>�ri/1.8/system/File/Stat/atime-i.yamlnu�[���PK}[n��L&&*?�ri/1.8/system/File/Stat/blockdev%3f-i.yamlnu�[���PK}[�'$�aa&��ri/1.8/system/File/Stat/pipe%3f-i.yamlnu�[���PK}[�?A�]]$v�ri/1.8/system/File/Stat/ftype-i.yamlnu�[���PK}[��P��/'�ri/1.8/system/File/Stat/writable_real%3f-i.yamlnu�[���PK}[�R�m��&N�ri/1.8/system/File/Stat/file%3f-i.yamlnu�[���PK}[#�	Czz"U�ri/1.8/system/File/Stat/uid-i.yamlnu�[���PK}[_M�o44,!�ri/1.8/system/File/Stat/executable%3f-i.yamlnu�[���PK}[}2����'��ri/1.8/system/File/Stat/owned%3f-i.yamlnu�[���PK}[�EIZrr&�ri/1.8/system/File/Stat/size%3f-i.yamlnu�[���PK}[��W�}}�ri/1.8/system/File/link-c.yamlnu�[���PK}[H �R[[%��ri/1.8/system/File/readable%3f-c.yamlnu�[���PK}[���88#G�ri/1.8/system/File/sticky%3f-c.yamlnu�[���PK}[���"�ri/1.8/system/File/truncate-c.yamlnu�[���PK}[Y׫�ri/1.8/system/File/new-c.yamlnu�[���PK}[>�b��1ri/1.8/system/File/Constants/cdesc-Constants.yamlnu�[���PK}[���.��\	ri/1.8/system/File/mtime-i.yamlnu�[���PK}[�)�]]!0ri/1.8/system/File/size%3f-c.yamlnu�[���PK}[s���77$�ri/1.8/system/File/symlink%3f-c.yamlnu�[���PK}[&@g��iri/1.8/system/File/utime-c.yamlnu�[���PK}[��6NN!Cri/1.8/system/File/dirname-c.yamlnu�[���PK}[�&X�� �ri/1.8/system/File/unlink-c.yamlnu�[���PK}[�ʨ�--#�ri/1.8/system/File/socket%3f-c.yamlnu�[���PK}[���"Zri/1.8/system/File/truncate-i.yamlnu�[���PK}[~���  !+ri/1.8/system/File/install-c.yamlnu�[���PK}[�6ljmm,�ri/1.8/system/File/executable_real%3f-c.yamlnu�[���PK}[��3H"eri/1.8/system/File/readlink-c.yamlnu�[���PK}[���u88#�ri/1.8/system/File/setuid%3f-c.yamlnu�[���PK}[�)ה��!V!ri/1.8/system/File/catname-c.yamlnu�[���PK}[�x����!�#ri/1.8/system/File/o_chmod-i.yamlnu�[���PK}[��B�zz&�$ri/1.8/system/File/identical%3f-c.yamlnu�[���PK}[rXf���$�(ri/1.8/system/File/fnmatch%3f-c.yamlnu�[���PK}[��"�;ri/1.8/system/File/basename-c.yamlnu�[���PK}[��C���!2?ri/1.8/system/File/compare-c.yamlnu�[���PK}[��cc'Ari/1.8/system/File/executable%3f-c.yamlnu�[���PK}[e�pw���Bri/1.8/system/File/atime-i.yamlnu�[���PK}[���J��&�Dri/1.8/system/File/directory%3f-c.yamlnu�[���PK}[�,˶GG!�Fri/1.8/system/File/syscopy-c.yamlnu�[���PK}[u�Nv��%�Hri/1.8/system/File/safe_unlink-c.yamlnu�[���PK}[GٶUzzoJri/1.8/system/File/chmod-c.yamlnu�[���PK}[xG�Iee*8Mri/1.8/system/File/writable_real%3f-c.yamlnu�[���PK}[^�ip���Nri/1.8/system/File/chown-i.yamlnu�[���PK}[��.�nn"Rri/1.8/system/File/owned%3f-c.yamlnu�[���PK}[K�"��,�Sri/1.8/system/TrueClass/cdesc-TrueClass.yamlnu�[���PK}[8��hUU"�Vri/1.8/system/TrueClass/%7c-i.yamlnu�[���PK}[9��OO"rYri/1.8/system/TrueClass/%26-i.yamlnu�[���PK}[����&[ri/1.8/system/TrueClass/to_yaml-i.yamlnu�[���PK}[*3q7""#\ri/1.8/system/TrueClass/to_s-i.yamlnu�[���PK}[_��ELL"�]ri/1.8/system/TrueClass/%5e-i.yamlnu�[���PK}[\�֛^^$2_ri/1.8/system/Vector/elements-c.yamlnu�[���PK}[�A M�� �`ri/1.8/system/Vector/size-i.yamlnu�[���PK}[j)<��"(bri/1.8/system/Vector/eql%3f-i.yamlnu�[���PK}[P�		"Ucri/1.8/system/Vector/%5b%5d-i.yamlnu�[���PK}[
A���$�dri/1.8/system/Vector/covector-i.yamlnu�[���PK}[�eQIIfri/1.8/system/Vector/r-i.yamlnu�[���PK}[h����"�gri/1.8/system/Vector/coerce-i.yamlnu�[���PK}[9�ʉ�� �hri/1.8/system/Vector/to_a-i.yamlnu�[���PK}[w����&jri/1.8/system/Vector/compare_by-i.yamlnu�[���PK}[�S�&&!`kri/1.8/system/Vector/each2-i.yamlnu�[���PK}[�vg���)�lri/1.8/system/Vector/init_elements-i.yamlnu�[���PK}[�3@8�� %nri/1.8/system/Vector/hash-i.yamlnu�[���PK}[�rHH$^ori/1.8/system/Vector/collect2-i.yamlnu�[���PK}[�o>+#�pri/1.8/system/Vector/collect-i.yamlnu�[���PK}[�4]�^rri/1.8/system/Vector/%2a-i.yamlnu�[���PK}[	ׄ��#�sri/1.8/system/Vector/inspect-i.yamlnu�[���PK}[vj����tri/1.8/system/Vector/new-c.yamlnu�[���PK}[mEY���5vri/1.8/system/Vector/%2b-i.yamlnu�[���PK}[H�0J

&Vwri/1.8/system/Vector/cdesc-Vector.yamlnu�[���PK}[�t��� ��ri/1.8/system/Vector/to_s-i.yamlnu�[���PK}[�7<���ri/1.8/system/Vector/map-i.yamlnu�[���PK}[d��pp)�ri/1.8/system/Vector/inner_product-i.yamlnu�[���PK}[����CC"Ջri/1.8/system/Vector/%3d%3d-i.yamlnu�[���PK}[��؎��!j�ri/1.8/system/Vector/clone-i.yamlnu�[���PK}[�$� ��ri/1.8/system/Vector/map2-i.yamlnu�[���PK}[УA�33"�ri/1.8/system/Vector/%5b%5d-c.yamlnu�[���PK}[f
}����ri/1.8/system/Vector/%2d-i.yamlnu�[���PK}[�y�*��ri/1.8/system/ParseError/set_option-i.yamlnu�[���PK}[D8Ճ�.ʓri/1.8/system/ParseError/cdesc-ParseError.yamlnu�[���PK}[��ز��'��ri/1.8/system/ParseError/inspect-i.yamlnu�[���PK}[�%�-��#��ri/1.8/system/ParseError/new-c.yamlnu�[���PK}[�_/�33'��ri/1.8/system/ParseError/message-i.yamlnu�[���PK}[�݊��$4�ri/1.8/system/ParseError/to_s-i.yamlnu�[���PK}["�e9'g�ri/1.8/system/ParseError/recover-i.yamlnu�[���PK}[IFL��&ri/1.8/system/ParseError/reason-i.yamlnu�[���PK}[�YI||,�ri/1.8/system/TypeError/cdesc-TypeError.yamlnu�[���PK}[%���))+�ri/1.8/system/ConditionVariable/wait-i.yamlnu�[���PK}[�j����*p�ri/1.8/system/ConditionVariable/new-c.yamlnu�[���PK}[�� 0��ri/1.8/system/ConditionVariable/broadcast-i.yamlnu�[���PK}[>��88< �ri/1.8/system/ConditionVariable/cdesc-ConditionVariable.yamlnu�[���PK}[�-Īri/1.8/system/ConditionVariable/signal-i.yamlnu�[���PK}[����3/�ri/1.8/system/MonitorMixin/mon_exit_for_cond-i.yamlnu�[���PK}[i�6..1U�ri/1.8/system/MonitorMixin/mon_check_owner-i.yamlnu�[���PK}[�;��/�ri/1.8/system/MonitorMixin/extend_object-c.yamlnu�[���PK}[�*�ZZ/�ri/1.8/system/MonitorMixin/mon_try_enter-i.yamlnu�[���PK}[��6u��*��ri/1.8/system/MonitorMixin/new_cond-i.yamlnu�[���PK}[+�x�%%0��ri/1.8/system/MonitorMixin/mon_initialize-i.yamlnu�[���PK}[-
���40�ri/1.8/system/MonitorMixin/mon_enter_for_cond-i.yamlnu�[���PK}[FmD;��-^�ri/1.8/system/MonitorMixin/synchronize-i.yamlnu�[���PK}[�
���/��ri/1.8/system/MonitorMixin/try_mon_enter-i.yamlnu�[���PK}[����-
�ri/1.8/system/MonitorMixin/mon_acquire-i.yamlnu�[���PK}[&�f���*#�ri/1.8/system/MonitorMixin/mon_exit-i.yamlnu�[���PK}[2�
���%k�ri/1.8/system/MonitorMixin/new-c.yamlnu�[���PK}[D
��-k�ri/1.8/system/MonitorMixin/mon_release-i.yamlnu�[���PK}[�36�((>нri/1.8/system/MonitorMixin/ConditionVariable/wait_until-i.yamlnu�[���PK}[
'�((>f�ri/1.8/system/MonitorMixin/ConditionVariable/wait_while-i.yamlnu�[���PK}[��	L��8��ri/1.8/system/MonitorMixin/ConditionVariable/wait-i.yamlnu�[���PK}[�@kl��7�ri/1.8/system/MonitorMixin/ConditionVariable/new-c.yamlnu�[���PK}[�`Y�=.�ri/1.8/system/MonitorMixin/ConditionVariable/broadcast-i.yamlnu�[���PK}[|����A��ri/1.8/system/MonitorMixin/ConditionVariable/count_waiters-i.yamlnu�[���PK}[)����G��ri/1.8/system/MonitorMixin/ConditionVariable/Timeout/cdesc-Timeout.yamlnu�[���PK}[gY�bssI1�ri/1.8/system/MonitorMixin/ConditionVariable/cdesc-ConditionVariable.yamlnu�[���PK}[YY�:�ri/1.8/system/MonitorMixin/ConditionVariable/signal-i.yamlnu�[���PK}[�Ms��@��ri/1.8/system/MonitorMixin/ConditionVariable/create_timer-i.yamlnu�[���PK}[�����1��ri/1.8/system/MonitorMixin/mon_synchronize-i.yamlnu�[���PK}[�5���+��ri/1.8/system/MonitorMixin/mon_enter-i.yamlnu�[���PK}[�ܹ8820�ri/1.8/system/MonitorMixin/cdesc-MonitorMixin.yamlnu�[���PK}[�֮Ҍ�+��ri/1.8/system/TSort/tsort_each_child-i.yamlnu�[���PK}[8��A��<��ri/1.8/system/TSort/each_strongly_connected_component-i.yamlnu�[���PK}[�:\[||*��ri/1.8/system/TSort/tsort_each_node-i.yamlnu�[���PK}[w���� ~�ri/1.8/system/TSort/tsort-i.yamlnu�[���PK}[!�<<A��ri/1.8/system/TSort/each_strongly_connected_component_from-i.yamlnu�[���PK}[s����86�ri/1.8/system/TSort/strongly_connected_components-i.yamlnu�[���PK}[Pp�ѡ�$O�ri/1.8/system/TSort/cdesc-TSort.yamlnu�[���PK}[�/�++%D�ri/1.8/system/TSort/tsort_each-i.yamlnu�[���PK}[��i���,�ri/1.8/system/TSort/Cyclic/cdesc-Cyclic.yamlnu�[���PK}[��MM8�ri/1.8/system/RDoc/Fortran95parser/find_arguments-i.yamlnu�[���PK}[R����8�ri/1.8/system/RDoc/Fortran95parser/comment_out%3f-i.yamlnu�[���PK}[F��		Ari/1.8/system/RDoc/Fortran95parser/parse_program_or_module-i.yamlnu�[���PK}[�O�Ӿ�2|ri/1.8/system/RDoc/Fortran95parser/progress-i.yamlnu�[���PK}[Qn��GG9�ri/1.8/system/RDoc/Fortran95parser/definition_info-i.yamlnu�[���PK}[��r�MM6Lri/1.8/system/RDoc/Fortran95parser/block_end%3f-i.yamlnu�[���PK}[�x�77>�ri/1.8/system/RDoc/Fortran95parser/remove_header_marker-i.yamlnu�[���PK}[���?�
ri/1.8/system/RDoc/Fortran95parser/collect_first_comment-i.yamlnu�[���PK}[��N�//8/ri/1.8/system/RDoc/Fortran95parser/find_namelists-i.yamlnu�[���PK}[��u͕�7�
ri/1.8/system/RDoc/Fortran95parser/find_comments-i.yamlnu�[���PK}[3�c��A�ri/1.8/system/RDoc/Fortran95parser/remove_private_comments-i.yamlnu�[���PK}[�Y7�9ri/1.8/system/RDoc/Fortran95parser/find_visibility-i.yamlnu�[���PK}[��:�""?�ri/1.8/system/RDoc/Fortran95parser/semicolon_to_linefeed-i.yamlnu�[���PK}[�����.(ri/1.8/system/RDoc/Fortran95parser/scan-i.yamlnu�[���PK}[��SS8rri/1.8/system/RDoc/Fortran95parser/block_start%3f-i.yamlnu�[���PK}[��>,,?-ri/1.8/system/RDoc/Fortran95parser/remove_trailing_alias-i.yamlnu�[���PK}[y���  -�ri/1.8/system/RDoc/Fortran95parser/new-c.yamlnu�[���PK}[�WE[

<Eri/1.8/system/RDoc/Fortran95parser/continuous_line%3f-i.yamlnu�[���PK}[��;�33@�ri/1.8/system/RDoc/Fortran95parser/check_external_aliases-i.yamlnu�[���PK}[����8^ri/1.8/system/RDoc/Fortran95parser/set_visibility-i.yamlnu�[���PK}[�n���	�	=cri/1.8/system/RDoc/Fortran95parser/cdesc-Fortran95parser.yamlnu�[���PK}[ex���U�)ri/1.8/system/RDoc/Fortran95parser/Fortran95Definition/cdesc-Fortran95Definition.yamlnu�[���PK}[��"���A/ri/1.8/system/RDoc/Fortran95parser/Fortran95Definition/new-c.yamlnu�[���PK}[B�/&&Mq0ri/1.8/system/RDoc/Fortran95parser/Fortran95Definition/include_attr%3f-i.yamlnu�[���PK}[�uH��B2ri/1.8/system/RDoc/Fortran95parser/Fortran95Definition/to_s-i.yamlnu�[���PK}[S�P>L3ri/1.8/system/RDoc/Fortran95parser/check_public_methods-i.yamlnu�[���PK}[���:�4ri/1.8/system/RDoc/Fortran95parser/parse_visibility-i.yamlnu�[���PK}[W(?��DT6ri/1.8/system/RDoc/Fortran95parser/initialize_external_method-i.yamlnu�[���PK}[HA�A��:�8ri/1.8/system/RDoc/Fortran95parser/parse_subprogram-i.yamlnu�[���PK}[
��--B�:ri/1.8/system/RDoc/Fortran95parser/initialize_public_method-i.yamlnu�[���PK}[A��""A)<ri/1.8/system/RDoc/Fortran95parser/remove_empty_head_lines-i.yamlnu�[���PK}[�WLvcc<�=ri/1.8/system/RDoc/Fortran95parser/united_to_one_line-i.yamlnu�[���PK}[�$�S$�?ri/1.8/system/RDoc/no_comment-c.yamlnu�[���PK}[t�T��&�@ri/1.8/system/RDoc/Constant/new-c.yamlnu�[���PK}[�$H۩�/�Ari/1.8/system/RDoc/Constant/cdesc-Constant.yamlnu�[���PK}[�?����*�Cri/1.8/system/RDoc/extract_sections-c.yamlnu�[���PK}[`�aa-&Fri/1.8/system/RDoc/Require/cdesc-Require.yamlnu�[���PK}[����%�Gri/1.8/system/RDoc/Require/new-c.yamlnu�[���PK}[�{L����Hri/1.8/system/RDoc/usage-c.yamlnu�[���PK}[z���'�Jri/1.8/system/RDoc/usage_no_exit-c.yamlnu�[���PK}[$�m	��+Lri/1.8/system/RDoc/Context/add_class-i.yamlnu�[���PK}[雏��@HMri/1.8/system/RDoc/Context/initialize_classes_and_modules-i.yamlnu�[���PK}[�C6���,�Nri/1.8/system/RDoc/Context/add_module-i.yamlnu�[���PK}[U4x{''/�Ori/1.8/system/RDoc/Context/defined_in%3f-i.yamlnu�[���PK}[g��F��+<Qri/1.8/system/RDoc/Context/%3c%3d%3e-i.yamlnu�[���PK}[ދ�#��)�Rri/1.8/system/RDoc/Context/classes-i.yamlnu�[���PK}[�@[pp4�Sri/1.8/system/RDoc/Context/set_visibility_for-i.yamlnu�[���PK}[�t�=�Uri/1.8/system/RDoc/Context/find_enclosing_module_named-i.yamlnu�[���PK}[|$��)>Wri/1.8/system/RDoc/Context/modules-i.yamlnu�[���PK}[��2R��3�Xri/1.8/system/RDoc/Context/find_module_named-i.yamlnu�[���PK}[��/z��(�Yri/1.8/system/RDoc/Context/add_to-i.yamlnu�[���PK}[�|ee-[ri/1.8/system/RDoc/Context/find_symbol-i.yamlnu�[���PK}[~���5�\ri/1.8/system/RDoc/Context/add_class_or_module-i.yamlnu�[���PK}[�#����/"^ri/1.8/system/RDoc/Context/add_attribute-i.yamlnu�[���PK}[���+H_ri/1.8/system/RDoc/Context/add_alias-i.yamlnu�[���PK}[�d�**<^`ri/1.8/system/RDoc/Context/find_instance_method_named-i.yamlnu�[���PK}[�pX��/�ari/1.8/system/RDoc/Context/each_constant-i.yamlnu�[���PK}[LO�3cri/1.8/system/RDoc/Context/find_method_named-i.yamlnu�[���PK}[�{9-�dri/1.8/system/RDoc/Context/add_require-i.yamlnu�[���PK}[�Um�7fri/1.8/system/RDoc/Context/ongoing_visibility%3d-i.yamlnu�[���PK}[݋���%�gri/1.8/system/RDoc/Context/new-c.yamlnu�[���PK}[�藗((2�hri/1.8/system/RDoc/Context/each_classmodule-i.yamlnu�[���PK}[�jn�1jri/1.8/system/RDoc/Context/record_location-i.yamlnu�[���PK}[E��E44-�kri/1.8/system/RDoc/Context/cdesc-Context.yamlnu�[���PK}[����44<xri/1.8/system/RDoc/Context/remove_classes_and_modules-i.yamlnu�[���PK}[�*�		5�yri/1.8/system/RDoc/Context/set_current_section-i.yamlnu�[���PK}[�)���-'{ri/1.8/system/RDoc/Context/Section/new-c.yamlnu�[���PK}[5���5B|ri/1.8/system/RDoc/Context/Section/cdesc-Section.yamlnu�[���PK}[����5�~ri/1.8/system/RDoc/Context/Section/set_comment-i.yamlnu�[���PK}[�%W�5�ri/1.8/system/RDoc/Context/find_constant_named-i.yamlnu�[���PK}[��|�68�ri/1.8/system/RDoc/Context/find_attribute_named-i.yamlnu�[���PK}[��bb4��ri/1.8/system/RDoc/Context/remove_methods_etc-i.yamlnu�[���PK}[�MR��-|�ri/1.8/system/RDoc/Context/each_method-i.yamlnu�[���PK}[��+���8��ri/1.8/system/RDoc/Context/initialize_methods_etc-i.yamlnu�[���PK}[�c]��*Іri/1.8/system/RDoc/Context/toplevel-i.yamlnu�[���PK}[!��, �ri/1.8/system/RDoc/Context/add_method-i.yamlnu�[���PK}[qHd`��39�ri/1.8/system/RDoc/Context/find_local_symbol-i.yamlnu�[���PK}[� '��-e�ri/1.8/system/RDoc/Context/add_include-i.yamlnu�[���PK}[S)����.��ri/1.8/system/RDoc/Context/add_constant-i.yamlnu�[���PK}[�W����0��ri/1.8/system/RDoc/Context/each_attribute-i.yamlnu�[���PK}[�M
���.Ǎri/1.8/system/RDoc/C_Parser/handle_attr-i.yamlnu�[���PK}[�b����3�ri/1.8/system/RDoc/C_Parser/handle_tab_width-i.yamlnu�[���PK}[~���yy5.�ri/1.8/system/RDoc/C_Parser/find_const_comment-i.yamlnu�[���PK}[�3ۉ3�ri/1.8/system/RDoc/C_Parser/handle_ifdefs_in-i.yamlnu�[���PK}[{��}��+��ri/1.8/system/RDoc/C_Parser/progress-i.yamlnu�[���PK}[��c��8��ri/1.8/system/RDoc/C_Parser/find_override_comment-i.yamlnu�[���PK}[m�(��5�ri/1.8/system/RDoc/C_Parser/find_class_comment-i.yamlnu�[���PK}[����-�ri/1.8/system/RDoc/C_Parser/do_classes-i.yamlnu�[���PK}[��l�0.�ri/1.8/system/RDoc/C_Parser/handle_method-i.yamlnu�[���PK}[c{9��:��ri/1.8/system/RDoc/C_Parser/remove_private_comments-i.yamlnu�[���PK}[˩{v��/ԝri/1.8/system/RDoc/C_Parser/do_constants-i.yamlnu�[���PK}[���22'�ri/1.8/system/RDoc/C_Parser/scan-i.yamlnu�[���PK}[U,>=��6z�ri/1.8/system/RDoc/C_Parser/handle_class_module-i.yamlnu�[���PK}[m�p6��/ۡri/1.8/system/RDoc/C_Parser/cdesc-C_Parser.yamlnu�[���PK}[�8�T&
�ri/1.8/system/RDoc/C_Parser/new-c.yamlnu�[���PK}["%��  1s�ri/1.8/system/RDoc/C_Parser/mangle_comment-i.yamlnu�[���PK}[0�x[[.�ri/1.8/system/RDoc/C_Parser/do_includes-i.yamlnu�[���PK}[>N���4��ri/1.8/system/RDoc/C_Parser/find_attr_comment-i.yamlnu�[���PK}[~*
0ii=�ri/1.8/system/RDoc/C_Parser/remove_commented_out_lines-i.yamlnu�[���PK}[IǷa��-��ri/1.8/system/RDoc/C_Parser/do_methods-i.yamlnu�[���PK}[�Ll_yy1Ͽri/1.8/system/RDoc/C_Parser/find_modifiers-i.yamlnu�[���PK}[�>��-��ri/1.8/system/RDoc/C_Parser/do_aliases-i.yamlnu�[���PK}[	�
��-��ri/1.8/system/RDoc/C_Parser/find_class-i.yamlnu�[���PK}[�z��00,��ri/1.8/system/RDoc/C_Parser/find_body-i.yamlnu�[���PK}[UU����3n�ri/1.8/system/RDoc/C_Parser/handle_constants-i.yamlnu�[���PK}[뭙,��'��ri/1.8/system/RDoc/C_Parser/warn-i.yamlnu�[���PK}[<Z8��3��ri/1.8/system/RDoc/NormalModule/is_module%3f-i.yamlnu�[���PK}[�2d�--7��ri/1.8/system/RDoc/NormalModule/cdesc-NormalModule.yamlnu�[���PK}[àg��"[�ri/1.8/system/RDoc/cdesc-RDoc.yamlnu�[���PK}[�A���(T�ri/1.8/system/RDoc/Attr/%3c%3d%3e-i.yamlnu�[���PK}[qا~~'U�ri/1.8/system/RDoc/Attr/cdesc-Attr.yamlnu�[���PK}[D*+��"*�ri/1.8/system/RDoc/Attr/new-c.yamlnu�[���PK}[�bB:��#7�ri/1.8/system/RDoc/Attr/to_s-i.yamlnu�[���PK}[��{�??10�ri/1.8/system/RDoc/RDocError/cdesc-RDocError.yamlnu�[���PK}[�����#��ri/1.8/system/RDoc/Alias/new-c.yamlnu�[���PK}[?ejQ��$��ri/1.8/system/RDoc/Alias/to_s-i.yamlnu�[���PK}[���ӡ�)��ri/1.8/system/RDoc/Alias/cdesc-Alias.yamlnu�[���PK}[��dJ��,��ri/1.8/system/RDoc/RubyParser/peek_tk-i.yamlnu�[���PK}[W+b��8��ri/1.8/system/RDoc/RubyParser/parse_symbol_in_arg-i.yamlnu�[���PK}[�J΁��5 �ri/1.8/system/RDoc/RubyParser/parse_statements-i.yamlnu�[���PK}[ѳ�l��0��ri/1.8/system/RDoc/RubyParser/skip_method-i.yamlnu�[���PK}[���[��A��ri/1.8/system/RDoc/RubyParser/read_documentation_modifiers-i.yamlnu�[���PK}[cě
��/�ri/1.8/system/RDoc/RubyParser/parse_attr-i.yamlnu�[���PK}[�o��;;F6�ri/1.8/system/RDoc/RubyParser/get_constant_with_optional_parens-i.yamlnu�[���PK}[}z�M��:�ri/1.8/system/RDoc/RubyParser/remove_token_listener-i.yamlnu�[���PK}[��y111#�ri/1.8/system/RDoc/RubyParser/get_constant-i.yamlnu�[���PK}[?�����-��ri/1.8/system/RDoc/RubyParser/progress-i.yamlnu�[���PK}[!_622F�ri/1.8/system/RDoc/RubyParser/skip_optional_do_after_expression-i.yamlnu�[���PK}[Ա�E��2s�ri/1.8/system/RDoc/RubyParser/parse_require-i.yamlnu�[���PK}[?(�433:��ri/1.8/system/RDoc/RubyParser/collect_first_comment-i.yamlnu�[���PK}[{�w��/A�ri/1.8/system/RDoc/RubyParser/get_tkread-i.yamlnu�[���PK}[��tE��:Y�ri/1.8/system/RDoc/RubyParser/parse_call_parameters-i.yamlnu�[���PK}[v�o���2�ri/1.8/system/RDoc/RubyParser/parse_include-i.yamlnu�[���PK}[�R^M��<�ri/1.8/system/RDoc/RubyParser/remove_private_comments-i.yamlnu�[���PK}[����6ri/1.8/system/RDoc/RubyParser/skip_for_variable-i.yamlnu�[���PK}[�nO��*�ri/1.8/system/RDoc/RubyParser/error-i.yamlnu�[���PK}[Ѧ�<��;�ri/1.8/system/RDoc/RubyParser/look_for_directives_in-i.yamlnu�[���PK}[�)����<�ri/1.8/system/RDoc/RubyParser/parse_method_parameters-i.yamlnu�[���PK}[��?�E-
ri/1.8/system/RDoc/RubyParser/parse_method_or_yield_parameters-i.yamlnu�[���PK}[d=�:��)�ri/1.8/system/RDoc/RubyParser/scan-i.yamlnu�[���PK}[+[h�8�ri/1.8/system/RDoc/RubyParser/get_class_or_module-i.yamlnu�[���PK}[R����(ri/1.8/system/RDoc/RubyParser/new-c.yamlnu�[���PK}[�����1Mri/1.8/system/RDoc/RubyParser/skip_tkspace-i.yamlnu�[���PK}[��O��9yri/1.8/system/RDoc/RubyParser/skip_tkspace_comment-i.yamlnu�[���PK}[k�����0�ri/1.8/system/RDoc/RubyParser/parse_alias-i.yamlnu�[���PK}[e}w�<<<�ri/1.8/system/RDoc/RubyParser/get_class_specification-i.yamlnu�[���PK}[Vd_��.�ri/1.8/system/RDoc/RubyParser/peek_read-i.yamlnu�[���PK}[���k��-�ri/1.8/system/RDoc/RubyParser/get_bool-i.yamlnu�[���PK}[�P���3�ri/1.8/system/RDoc/RubyParser/parse_constant-i.yamlnu�[���PK}[F�%��1ri/1.8/system/RDoc/RubyParser/make_message-i.yamlnu�[���PK}[y5���7&ri/1.8/system/RDoc/RubyParser/add_token_listener-i.yamlnu�[���PK}[�Qo��>Yri/1.8/system/RDoc/RubyParser/parse_toplevel_statements-i.yamlnu�[���PK}[S�
<��5�ri/1.8/system/RDoc/RubyParser/parse_symbol_arg-i.yamlnu�[���PK}[�����0�ri/1.8/system/RDoc/RubyParser/parse_class-i.yamlnu�[���PK}[�,%��3ri/1.8/system/RDoc/RubyParser/cdesc-RubyParser.yamlnu�[���PK}[���11,ri/1.8/system/RDoc/RubyParser/parse_module-i.yamlnu�[���PK}[�����1m-ri/1.8/system/RDoc/RubyParser/parse_method-i.yamlnu�[���PK}[��L���0�.ri/1.8/system/RDoc/RubyParser/parse_yield-i.yamlnu�[���PK}[]����;�/ri/1.8/system/RDoc/RubyParser/parse_yield_parameters-i.yamlnu�[���PK}[2�
���51ri/1.8/system/RDoc/RubyParser/parse_visibility-i.yamlnu�[���PK}[�ێ��-Z2ri/1.8/system/RDoc/RubyParser/unget_tk-i.yamlnu�[���PK}[�
�ll3n3ri/1.8/system/RDoc/RubyParser/read_directive-i.yamlnu�[���PK}[�Z�p��+=6ri/1.8/system/RDoc/RubyParser/get_tk-i.yamlnu�[���PK}[`�-��)I7ri/1.8/system/RDoc/RubyParser/warn-i.yamlnu�[���PK}[!����8R8ri/1.8/system/RDoc/RubyParser/parse_attr_accessor-i.yamlnu�[���PK}[oQ���7�9ri/1.8/system/RDoc/RubyParser/get_symbol_or_name-i.yamlnu�[���PK}[-��C��0�:ri/1.8/system/RDoc/Diagram/find_full_name-i.yamlnu�[���PK}[������0�;ri/1.8/system/RDoc/Diagram/convert_to_png-i.yamlnu�[���PK}[a8����-&=ri/1.8/system/RDoc/Diagram/draw_module-i.yamlnu�[���PK}[a�[��3c>ri/1.8/system/RDoc/Diagram/wrap_in_image_map-i.yamlnu�[���PK}[F�m::%h@ri/1.8/system/RDoc/Diagram/new-c.yamlnu�[���PK}[�]���-�Ari/1.8/system/RDoc/Diagram/add_classes-i.yamlnu�[���PK}[͖���,)Cri/1.8/system/RDoc/Diagram/find_names-i.yamlnu�[���PK}[�j�rr&ADri/1.8/system/RDoc/Diagram/draw-i.yamlnu�[���PK}[��F���-	Fri/1.8/system/RDoc/Diagram/cdesc-Diagram.yamlnu�[���PK}[��H�ZZDLri/1.8/system/RDoc/gets-c.yamlnu�[���PK}[0��=��6�Mri/1.8/system/RDoc/RDoc/list_files_in_directory-i.yamlnu�[���PK}[�P
4��':Pri/1.8/system/RDoc/RDoc/document-i.yamlnu�[���PK}[4j>��'zSri/1.8/system/RDoc/RDoc/cdesc-RDoc.yamlnu�[���PK}[�ݰ���1YYri/1.8/system/RDoc/RDoc/parse_dot_doc_file-i.yamlnu�[���PK}[փN�0^[ri/1.8/system/RDoc/RDoc/update_output_dir-i.yamlnu�[���PK}[�$&&*�\ri/1.8/system/RDoc/RDoc/parse_files-i.yamlnu�[���PK}[{���$\^ri/1.8/system/RDoc/RDoc/error-i.yamlnu�[���PK}[l����/�_ri/1.8/system/RDoc/RDoc/setup_output_dir-i.yamlnu�[���PK}[��͡3�ari/1.8/system/RDoc/RDoc/normalized_file_list-i.yamlnu�[���PK}[�s;�''/3eri/1.8/system/RDoc/RDoc/output_flag_file-i.yamlnu�[���PK}[�75�fri/1.8/system/RDoc/NormalClass/cdesc-NormalClass.yamlnu�[���PK}[�Mtl��-hri/1.8/system/RDoc/AnyMethod/%3c%3d%3e-i.yamlnu�[���PK}[>�E{{1*iri/1.8/system/RDoc/AnyMethod/cdesc-AnyMethod.yamlnu�[���PK}[ki�H��-nri/1.8/system/RDoc/AnyMethod/param_seq-i.yamlnu�[���PK}[�O��-ori/1.8/system/RDoc/AnyMethod/add_alias-i.yamlnu�[���PK}[��WR��'0pri/1.8/system/RDoc/AnyMethod/new-c.yamlnu�[���PK}[��ʫ�(:qri/1.8/system/RDoc/AnyMethod/to_s-i.yamlnu�[���PK}[Q�3H/=rri/1.8/system/RDoc/ClassModule/full_name-i.yamlnu�[���PK}[]�* ��.�sri/1.8/system/RDoc/ClassModule/http_url-i.yamlnu�[���PK}[�?�d2�tri/1.8/system/RDoc/ClassModule/is_module%3f-i.yamlnu�[���PK}[�MO��5?vri/1.8/system/RDoc/ClassModule/cdesc-ClassModule.yamlnu�[���PK}[�����)�yri/1.8/system/RDoc/ClassModule/new-c.yamlnu�[���PK}[�PB���*�zri/1.8/system/RDoc/ClassModule/to_s-i.yamlnu�[���PK}[�$jO��6�{ri/1.8/system/RDoc/ClassModule/find_class_named-i.yamlnu�[���PK}[#�!��&)}ri/1.8/system/RDoc/find_comment-c.yamlnu�[���PK}[1g�oo24~ri/1.8/system/RDoc/ParserFactory/parser_for-c.yamlnu�[���PK}[��A�KK<�ri/1.8/system/RDoc/ParserFactory/parse_files_matching-i.yamlnu�[���PK}[Z�a1��ri/1.8/system/RDoc/ParserFactory/can_parse-c.yamlnu�[���PK}[�	[u��7:�ri/1.8/system/RDoc/ParserFactory/alias_extension-c.yamlnu�[���PK}[Ϧq**91�ri/1.8/system/RDoc/ParserFactory/cdesc-ParserFactory.yamlnu�[���PK}[ܹ��5Čri/1.8/system/RDoc/SingleClass/cdesc-SingleClass.yamlnu�[���PK}[Z8��%-�ri/1.8/system/RDoc/Stats/print-i.yamlnu�[���PK}[���gg)+�ri/1.8/system/RDoc/Stats/cdesc-Stats.yamlnu�[���PK}[(j��#�ri/1.8/system/RDoc/Stats/new-c.yamlnu�[���PK}[<h���'�ri/1.8/system/RDoc/Page/cdesc-Page.yamlnu�[���PK}[�\���0��ri/1.8/system/RDoc/Page/write_extra_pages-i.yamlnu�[���PK}[������%ܒri/1.8/system/RDoc/Include/new-c.yamlnu�[���PK}[��fdd-�ri/1.8/system/RDoc/Include/cdesc-Include.yamlnu�[���PK}[�hc���5��ri/1.8/system/RDoc/CodeObject/document_self%3d-i.yamlnu�[���PK}[!�M�>>.Ζri/1.8/system/RDoc/CodeObject/start_doc-i.yamlnu�[���PK}[0mOP��9j�ri/1.8/system/RDoc/CodeObject/document_children%3d-i.yamlnu�[���PK}[7Q�ff3��ri/1.8/system/RDoc/CodeObject/cdesc-CodeObject.yamlnu�[���PK}[n>�Z--5g�ri/1.8/system/RDoc/CodeObject/attr_overridable-c.yamlnu�[���PK}[‘xv��(��ri/1.8/system/RDoc/CodeObject/new-c.yamlnu�[���PK}[�d�((/��ri/1.8/system/RDoc/CodeObject/comment%3d-i.yamlnu�[���PK}[HC��II?��ri/1.8/system/RDoc/CodeObject/remove_classes_and_modules-i.yamlnu�[���PK}[��n��7:�ri/1.8/system/RDoc/CodeObject/remove_methods_etc-i.yamlnu�[���PK}[�C����-i�ri/1.8/system/RDoc/CodeObject/stop_doc-i.yamlnu�[���PK}[�U1z�ri/1.8/system/RDoc/AnonClass/cdesc-AnonClass.yamlnu�[���PK}[�G�1��,۬ri/1.8/system/RDoc/TopLevel/full_name-i.yamlnu�[���PK}[��d�4�ri/1.8/system/RDoc/TopLevel/find_module_named-i.yamlnu�[���PK}[g� %%6O�ri/1.8/system/RDoc/TopLevel/add_class_or_module-i.yamlnu�[���PK}[6
m���&ڱri/1.8/system/RDoc/TopLevel/new-c.yamlnu�[���PK}[��SŬ�(�ri/1.8/system/RDoc/TopLevel/reset-c.yamlnu�[���PK}[��S��=�ri/1.8/system/RDoc/TopLevel/find_class_or_module_named-i.yamlnu�[���PK}[�U��:.�ri/1.8/system/RDoc/TopLevel/all_classes_and_modules-c.yamlnu�[���PK}[��"11/h�ri/1.8/system/RDoc/TopLevel/cdesc-TopLevel.yamlnu�[���PK}[Yf��4��ri/1.8/system/RDoc/TopLevel/find_local_symbol-i.yamlnu�[���PK}[39B��3&�ri/1.8/system/RDoc/TopLevel/find_class_named-c.yamlnu�[���PK}[�,��7O�ri/1.8/system/RDoc/SimpleParser/cdesc-SimpleParser.yamlnu�[���PK}[�)d���>Z�ri/1.8/system/RDoc/SimpleParser/remove_private_comments-i.yamlnu�[���PK}[���`+��ri/1.8/system/RDoc/SimpleParser/scan-i.yamlnu�[���PK}[�$k*�ri/1.8/system/RDoc/SimpleParser/new-c.yamlnu�[���PK}[q��'')��ri/1.8/system/RDoc/Token/cdesc-Token.yamlnu�[���PK}[�C��#	�ri/1.8/system/RDoc/Token/new-c.yamlnu�[���PK}[y�7<FF(�ri/1.8/system/RDoc/Token/set_text-i.yamlnu�[���PK}[[��y..8��ri/1.8/system/AmbiguousOption/cdesc-AmbiguousOption.yamlnu�[���PK}[SC�MM,E�ri/1.8/system/ThreadGroup/enclosed%3f-i.yamlnu�[���PK}[�O__0��ri/1.8/system/ThreadGroup/cdesc-ThreadGroup.yamlnu�[���PK}[���{77$��ri/1.8/system/ThreadGroup/add-i.yamlnu�[���PK}[�z��NN(8�ri/1.8/system/ThreadGroup/enclose-i.yamlnu�[���PK}[����%��ri/1.8/system/ThreadGroup/list-i.yamlnu�[���PK}[���7//"��ri/1.8/system/NilClass/to_i-i.yamlnu�[���PK}[�ǧ>>"]�ri/1.8/system/NilClass/to_a-i.yamlnu�[���PK}[�=�Qrr!��ri/1.8/system/NilClass/%7c-i.yamlnu�[���PK}[�R��!��ri/1.8/system/NilClass/%26-i.yamlnu�[���PK}[tH���%��ri/1.8/system/NilClass/to_yaml-i.yamlnu�[���PK}[�:��*��ri/1.8/system/NilClass/cdesc-NilClass.yamlnu�[���PK}[���%��ri/1.8/system/NilClass/inspect-i.yamlnu�[���PK}[أh�JJ"A�ri/1.8/system/NilClass/to_s-i.yamlnu�[���PK}[��NI��!��ri/1.8/system/NilClass/%5e-i.yamlnu�[���PK}[<��R66"��ri/1.8/system/NilClass/to_f-i.yamlnu�[���PK}[Wol���$8�ri/1.8/system/NilClass/nil%3f-i.yamlnu�[���PK}[�\����4�ri/1.8/system/NoMemoryError/cdesc-NoMemoryError.yamlnu�[���PK}[}�Df��"��ri/1.8/system/Data/cdesc-Data.yamlnu�[���PK}[o�GFFL3�ri/1.8/system/Test/Unit/AssertionFailedError/cdesc-AssertionFailedError.yamlnu�[���PK}[��
.%%7��ri/1.8/system/Test/Unit/TestResult/failure_count-i.yamlnu�[���PK}[�*��%%3��ri/1.8/system/Test/Unit/TestResult/passed%3f-i.yamlnu�[���PK}[b�����1	�ri/1.8/system/Test/Unit/TestResult/add_run-i.yamlnu�[���PK}[U�J��-Z�ri/1.8/system/Test/Unit/TestResult/new-c.yamlnu�[���PK}[P��

5��ri/1.8/system/Test/Unit/TestResult/add_failure-i.yamlnu�[���PK}[�K���8�ri/1.8/system/Test/Unit/TestResult/cdesc-TestResult.yamlnu�[���PK}[�(��		7U�ri/1.8/system/Test/Unit/TestResult/add_assertion-i.yamlnu�[���PK}[�j66.�ri/1.8/system/Test/Unit/TestResult/to_s-i.yamlnu�[���PK}[o*(75Yri/1.8/system/Test/Unit/TestResult/error_count-i.yamlnu�[���PK}[]�g
3�ri/1.8/system/Test/Unit/TestResult/add_error-i.yamlnu�[���PK}[��A%��.Bri/1.8/system/Test/Unit/Error/cdesc-Error.yamlnu�[���PK}[��hY1Y	ri/1.8/system/Test/Unit/Error/long_display-i.yamlnu�[���PK}[���]2�
ri/1.8/system/Test/Unit/Error/short_display-i.yamlnu�[���PK}[�O}�(Fri/1.8/system/Test/Unit/Error/new-c.yamlnu�[���PK}[2�-00=�
ri/1.8/system/Test/Unit/Error/single_character_display-i.yamlnu�[���PK}[B{w,Zri/1.8/system/Test/Unit/Error/message-i.yamlnu�[���PK}[9
����)�ri/1.8/system/Test/Unit/Error/to_s-i.yamlnu�[���PK}[�)���,	ri/1.8/system/Test/Unit/TestCase/size-i.yamlnu�[���PK}[�5��//0ri/1.8/system/Test/Unit/TestCase/teardown-i.yamlnu�[���PK}[7:$ee1�ri/1.8/system/Test/Unit/TestCase/passed%3f-i.yamlnu�[���PK}[1T>>+jri/1.8/system/Test/Unit/TestCase/new-c.yamlnu�[���PK}[e�OO-ri/1.8/system/Test/Unit/TestCase/suite-c.yamlnu�[���PK}[g{���4�ri/1.8/system/Test/Unit/TestCase/default_test-i.yamlnu�[���PK}[��\��3�ri/1.8/system/Test/Unit/TestCase/add_failure-i.yamlnu�[���PK}[L����5ri/1.8/system/Test/Unit/TestCase/add_assertion-i.yamlnu�[���PK}[��s�4<ri/1.8/system/Test/Unit/TestCase/cdesc-TestCase.yamlnu�[���PK}[mt����,�$ri/1.8/system/Test/Unit/TestCase/to_s-i.yamlnu�[���PK}[�"f$

.&ri/1.8/system/Test/Unit/TestCase/%3d%3d-i.yamlnu�[���PK}[`��''-m'ri/1.8/system/Test/Unit/TestCase/setup-i.yamlnu�[���PK}[�1�E��+�(ri/1.8/system/Test/Unit/TestCase/run-i.yamlnu�[���PK}[�"}�33,�*ri/1.8/system/Test/Unit/TestCase/name-i.yamlnu�[���PK}[Y�4���1[,ri/1.8/system/Test/Unit/TestCase/add_error-i.yamlnu�[���PK}[�eR�vv-�-ri/1.8/system/Test/Unit/TestSuite/size-i.yamlnu�[���PK}[(ލ0��1S/ri/1.8/system/Test/Unit/TestSuite/empty%3f-i.yamlnu�[���PK}[d�Y��/i0ri/1.8/system/Test/Unit/TestSuite/delete-i.yamlnu�[���PK}[T{+�,�1ri/1.8/system/Test/Unit/TestSuite/new-c.yamlnu�[���PK}[{;Q'��/�2ri/1.8/system/Test/Unit/TestSuite/%3c%3c-i.yamlnu�[���PK}[�twi-G4ri/1.8/system/Test/Unit/TestSuite/to_s-i.yamlnu�[���PK}[J�/�5ri/1.8/system/Test/Unit/TestSuite/%3d%3d-i.yamlnu�[���PK}[�J~�II,7ri/1.8/system/Test/Unit/TestSuite/run-i.yamlnu�[���PK}[O����6�8ri/1.8/system/Test/Unit/TestSuite/cdesc-TestSuite.yamlnu�[���PK}[ܶn���->ri/1.8/system/Test/Unit/AutoRunner/run-c.yamlnu�[���PK}[O����8S?ri/1.8/system/Test/Unit/AutoRunner/cdesc-AutoRunner.yamlnu�[���PK}[�|D��7�Ari/1.8/system/Test/Unit/AutoRunner/standalone%3f-c.yamlnu�[���PK}[j�����6�Bri/1.8/system/Test/Unit/Util/ProcWrapper/eql%3f-i.yamlnu�[���PK}[��9��7�Cri/1.8/system/Test/Unit/Util/ProcWrapper/to_proc-i.yamlnu�[���PK}[�B�I��4%Eri/1.8/system/Test/Unit/Util/ProcWrapper/hash-i.yamlnu�[���PK}[97R3BFri/1.8/system/Test/Unit/Util/ProcWrapper/new-c.yamlnu�[���PK}[�˪���6�Gri/1.8/system/Test/Unit/Util/ProcWrapper/%3d%3d-i.yamlnu�[���PK}[�kI7""?�Hri/1.8/system/Test/Unit/Util/ProcWrapper/cdesc-ProcWrapper.yamlnu�[���PK}[��}��,�Lri/1.8/system/Test/Unit/Util/cdesc-Util.yamlnu�[���PK}[��H���D�Mri/1.8/system/Test/Unit/Util/BacktraceFilter/filter_backtrace-i.yamlnu�[���PK}[ӭ�<<G�Nri/1.8/system/Test/Unit/Util/BacktraceFilter/cdesc-BacktraceFilter.yamlnu�[���PK}[����;�Qri/1.8/system/Test/Unit/Util/Observable/add_listener-i.yamlnu�[���PK}[����>Uri/1.8/system/Test/Unit/Util/Observable/remove_listener-i.yamlnu�[���PK}[��q��7Wri/1.8/system/Test/Unit/Util/Observable/channels-i.yamlnu�[���PK}[�5��=BXri/1.8/system/Test/Unit/Util/Observable/cdesc-Observable.yamlnu�[���PK}[:*���?�[ri/1.8/system/Test/Unit/Util/Observable/notify_listeners-i.yamlnu�[���PK}[v#����%�]ri/1.8/system/Test/Unit/run%3f-c.yamlnu�[���PK}[��v3_ri/1.8/system/Test/Unit/Failure/long_display-i.yamlnu�[���PK}[U��4{`ri/1.8/system/Test/Unit/Failure/short_display-i.yamlnu�[���PK}[W�((*�ari/1.8/system/Test/Unit/Failure/new-c.yamlnu�[���PK}[Y�s�33?xcri/1.8/system/Test/Unit/Failure/single_character_display-i.yamlnu�[���PK}[��s���+eri/1.8/system/Test/Unit/Failure/to_s-i.yamlnu�[���PK}[�d^^2kfri/1.8/system/Test/Unit/Failure/cdesc-Failure.yamlnu�[���PK}[�F��1�1'+jri/1.8/system/Test/Unit/cdesc-Unit.yamlnu�[���PK}[��.A��2J�ri/1.8/system/Test/Unit/Collector/filter%3d-i.yamlnu�[���PK}[2'�1��6j�ri/1.8/system/Test/Unit/Collector/cdesc-Collector.yamlnu�[���PK}[b/����3��ri/1.8/system/Test/Unit/Collector/include%3f-i.yamlnu�[���PK}[�60���,��ri/1.8/system/Test/Unit/Collector/new-c.yamlnu�[���PK}[Ɯn���4��ri/1.8/system/Test/Unit/Collector/Dir/cdesc-Dir.yamlnu�[���PK}[]��P��4
�ri/1.8/system/Test/Unit/Collector/Dir/collect-i.yamlnu�[���PK}[T�p^��0/�ri/1.8/system/Test/Unit/Collector/Dir/new-c.yamlnu�[���PK}[��C���<~�ri/1.8/system/Test/Unit/Collector/Dir/find_test_cases-i.yamlnu�[���PK}[^X.��>��ri/1.8/system/Test/Unit/Collector/Dir/recursive_collect-i.yamlnu�[���PK}[�in��4�ri/1.8/system/Test/Unit/Collector/Dir/realdir-i.yamlnu�[���PK}[�����97�ri/1.8/system/Test/Unit/Collector/Dir/collect_file-i.yamlnu�[���PK}[j@%߷�-��ri/1.8/system/Test/Unit/Collector/sort-i.yamlnu�[���PK}[P�9���2��ri/1.8/system/Test/Unit/Collector/add_suite-i.yamlnu�[���PK}[�/��DǮri/1.8/system/Test/Unit/Collector/ObjectSpace/cdesc-ObjectSpace.yamlnu�[���PK}[�����<�ri/1.8/system/Test/Unit/Collector/ObjectSpace/collect-i.yamlnu�[���PK}[�>�)��89�ri/1.8/system/Test/Unit/Collector/ObjectSpace/new-c.yamlnu�[���PK}[^O<~..%q�ri/1.8/system/Test/Unit/run%3d-c.yamlnu�[���PK}[,����;�ri/1.8/system/Test/Unit/UI/Tk/TestRunner/clear_fault-i.yamlnu�[���PK}[���k��B(�ri/1.8/system/Test/Unit/UI/Tk/TestRunner/create_count_label-i.yamlnu�[���PK}[����4~�ri/1.8/system/Test/Unit/UI/Tk/TestRunner/stop-i.yamlnu�[���PK}[}|��<��ri/1.8/system/Test/Unit/UI/Tk/TestRunner/test_started-i.yamlnu�[���PK}[�K(2��Bݹri/1.8/system/Test/Unit/UI/Tk/TestRunner/attach_to_mediator-i.yamlnu�[���PK}[6�����7&�ri/1.8/system/Test/Unit/UI/Tk/TestRunner/started-i.yamlnu�[���PK}[kjZ?��:T�ri/1.8/system/Test/Unit/UI/Tk/TestRunner/show_fault-i.yamlnu�[���PK}[! ���8��ri/1.8/system/Test/Unit/UI/Tk/TestRunner/setup_ui-i.yamlnu�[���PK}[�d��//3��ri/1.8/system/Test/Unit/UI/Tk/TestRunner/new-c.yamlnu�[���PK}[��>��5G�ri/1.8/system/Test/Unit/UI/Tk/TestRunner/start-i.yamlnu�[���PK}[�_ɬ��9��ri/1.8/system/Test/Unit/UI/Tk/TestRunner/add_fault-i.yamlnu�[���PK}[�77r��=��ri/1.8/system/Test/Unit/UI/Tk/TestRunner/output_status-i.yamlnu�[���PK}[{�1^^>�ri/1.8/system/Test/Unit/UI/Tk/TestRunner/cdesc-TestRunner.yamlnu�[���PK}[���F��8��ri/1.8/system/Test/Unit/UI/Tk/TestRunner/finished-i.yamlnu�[���PK}[.����8�ri/1.8/system/Test/Unit/UI/Tk/TestRunner/run_test-i.yamlnu�[���PK}[�ұ��>B�ri/1.8/system/Test/Unit/UI/Tk/TestRunner/raw_show_fault-i.yamlnu�[���PK}[�����>��ri/1.8/system/Test/Unit/UI/Tk/TestRunner/result_changed-i.yamlnu�[���PK}[7�����8��ri/1.8/system/Test/Unit/UI/Tk/TestRunner/reset_ui-i.yamlnu�[���PK}[��:~��8��ri/1.8/system/Test/Unit/UI/Tk/TestRunner/start_ui-i.yamlnu�[���PK}[Ȱ#2��>#�ri/1.8/system/Test/Unit/UI/Tk/TestRunner/setup_mediator-i.yamlnu�[���PK }[_
q��+`�ri/1.8/system/Test/Unit/UI/Tk/cdesc-Tk.yamlnu�[���PK }[^�����=v�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/green_style-i.yamlnu�[���PK }[Uk����=��ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/clear_fault-i.yamlnu�[���PK }[�p�N��<��ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/run_button-i.yamlnu�[���PK }[��~��6�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/stop-i.yamlnu�[���PK }[T�y���>=�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/status_panel-i.yamlnu�[���PK }[�֑��>x�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/test_started-i.yamlnu�[���PK }[�U����D��ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/attach_to_mediator-i.yamlnu�[���PK }[�<`���<	�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/fault_list-i.yamlnu�[���PK }[p�a��9>�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/started-i.yamlnu�[���PK }[�dhP��Ap�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/lazy_initialize-i.yamlnu�[���PK }[������<��ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/list_panel-i.yamlnu�[���PK }[:M�3��@��ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/progress_panel-i.yamlnu�[���PK }[ZO�Z��D:�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/fault_detail_label-i.yamlnu�[���PK }[s%}���>��ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/status_entry-i.yamlnu�[���PK }[�Il��<��ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/show_fault-i.yamlnu�[���PK }[x�s��A��ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/run_count_label-i.yamlnu�[���PK }[�*��F@�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/list_scrolled_window-i.yamlnu�[���PK }[������:��ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/setup_ui-i.yamlnu�[���PK }[�6��E��ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/failure_count_label-i.yamlnu�[���PK }[��<��G�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/assertion_count_label-i.yamlnu�[���PK }[5
[d��5h�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/new-c.yamlnu�[���PK }[)�*h��H��ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/detail_scrolled_window-i.yamlnu�[���PK }[]����7��ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/start-i.yamlnu�[���PK }[_5K6��C!�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/test_progress_bar-i.yamlnu�[���PK }[�f���;k�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/add_fault-i.yamlnu�[���PK }[X�&���;��ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/red_style-i.yamlnu�[���PK }[�,���C��ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/error_count_label-i.yamlnu�[���PK }[غ��?�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/output_status-i.yamlnu�[���PK }[��^
^
@b�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/cdesc-TestRunner.yamlnu�[���PK }[�K�^��?0ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/test_finished-i.yamlnu�[���PK }[���z��:sri/1.8/system/Test/Unit/UI/GTK2/TestRunner/finished-i.yamlnu�[���PK }[#����<�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/main_panel-i.yamlnu�[���PK }[�~����:�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/run_test-i.yamlnu�[���PK }[E�G��=ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/main_window-i.yamlnu�[���PK }[;���@Jri/1.8/system/Test/Unit/UI/GTK2/TestRunner/raw_show_fault-i.yamlnu�[���PK }[��(���@�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/result_changed-i.yamlnu�[���PK }[���y��>�	ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/detail_panel-i.yamlnu�[���PK }[�����=ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/suite_panel-i.yamlnu�[���PK }[)S,��BKri/1.8/system/Test/Unit/UI/GTK2/TestRunner/suite_name_entry-i.yamlnu�[���PK }[w|�S��:�
ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/reset_ui-i.yamlnu�[���PK }[?	�w��:�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/start_ui-i.yamlnu�[���PK }[����<�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/info_panel-i.yamlnu�[���PK }[Ӽg,��H*ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/outer_detail_sub_panel-i.yamlnu�[���PK }[��q��@�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/setup_mediator-i.yamlnu�[���PK }[?)���H�ri/1.8/system/Test/Unit/UI/GTK2/TestRunner/inner_detail_sub_panel-i.yamlnu�[���PK }[AR�Fri/1.8/system/Test/Unit/UI/GTK2/EnhancedLabel/cdesc-EnhancedLabel.yamlnu�[���PK }[�w����=�ri/1.8/system/Test/Unit/UI/GTK2/EnhancedLabel/set_text-i.yamlnu�[���PK }[�	���:�ri/1.8/system/Test/Unit/UI/GTK2/FaultList/get_fault-i.yamlnu�[���PK }[�`���4ri/1.8/system/Test/Unit/UI/GTK2/FaultList/new-c.yamlnu�[���PK }[������>,ri/1.8/system/Test/Unit/UI/GTK2/FaultList/cdesc-FaultList.yamlnu�[���PK }[7B�a��:6ri/1.8/system/Test/Unit/UI/GTK2/FaultList/add_fault-i.yamlnu�[���PK }[�/y���6jri/1.8/system/Test/Unit/UI/GTK2/FaultList/clear-i.yamlnu�[���PK }[�|X���/�ri/1.8/system/Test/Unit/UI/GTK2/cdesc-GTK2.yamlnu�[���PK }[Q�v���(�ri/1.8/system/Test/Unit/UI/cdesc-UI.yamlnu�[���PK!}[֪��KKE�!ri/1.8/system/Test/Unit/UI/GTK/FaultListItem/cdesc-FaultListItem.yamlnu�[���PK!}[�-���7�#ri/1.8/system/Test/Unit/UI/GTK/FaultListItem/new-c.yamlnu�[���PK!}[�N�L��-�$ri/1.8/system/Test/Unit/UI/GTK/cdesc-GTK.yamlnu�[���PK!}[G�����<�%ri/1.8/system/Test/Unit/UI/GTK/TestRunner/green_style-i.yamlnu�[���PK!}[L����<'ri/1.8/system/Test/Unit/UI/GTK/TestRunner/clear_fault-i.yamlnu�[���PK!}[Z�%K��;A(ri/1.8/system/Test/Unit/UI/GTK/TestRunner/run_button-i.yamlnu�[���PK!}[R�'���5t)ri/1.8/system/Test/Unit/UI/GTK/TestRunner/stop-i.yamlnu�[���PK!}[�|t���=�*ri/1.8/system/Test/Unit/UI/GTK/TestRunner/status_panel-i.yamlnu�[���PK!}['�w���=�+ri/1.8/system/Test/Unit/UI/GTK/TestRunner/test_started-i.yamlnu�[���PK!}[�,��C-ri/1.8/system/Test/Unit/UI/GTK/TestRunner/attach_to_mediator-i.yamlnu�[���PK!}[B�^���;\.ri/1.8/system/Test/Unit/UI/GTK/TestRunner/fault_list-i.yamlnu�[���PK"}[�����8�/ri/1.8/system/Test/Unit/UI/GTK/TestRunner/started-i.yamlnu�[���PK"}[�+R��@�0ri/1.8/system/Test/Unit/UI/GTK/TestRunner/lazy_initialize-i.yamlnu�[���PK"}[3����;2ri/1.8/system/Test/Unit/UI/GTK/TestRunner/list_panel-i.yamlnu�[���PK"}[���s��?E3ri/1.8/system/Test/Unit/UI/GTK/TestRunner/progress_panel-i.yamlnu�[���PK"}[��	���C�4ri/1.8/system/Test/Unit/UI/GTK/TestRunner/fault_detail_label-i.yamlnu�[���PK"}[��p���=�5ri/1.8/system/Test/Unit/UI/GTK/TestRunner/status_entry-i.yamlnu�[���PK"}[!d���;7ri/1.8/system/Test/Unit/UI/GTK/TestRunner/show_fault-i.yamlnu�[���PK"}[��!���@@8ri/1.8/system/Test/Unit/UI/GTK/TestRunner/run_count_label-i.yamlnu�[���PK"}[#uvC��E�9ri/1.8/system/Test/Unit/UI/GTK/TestRunner/list_scrolled_window-i.yamlnu�[���PK"}[�����9�:ri/1.8/system/Test/Unit/UI/GTK/TestRunner/setup_ui-i.yamlnu�[���PK"}[��%���D<ri/1.8/system/Test/Unit/UI/GTK/TestRunner/failure_count_label-i.yamlnu�[���PK"}[�����FN=ri/1.8/system/Test/Unit/UI/GTK/TestRunner/assertion_count_label-i.yamlnu�[���PK"}[��K004�>ri/1.8/system/Test/Unit/UI/GTK/TestRunner/new-c.yamlnu�[���PK"}[yt���G6@ri/1.8/system/Test/Unit/UI/GTK/TestRunner/detail_scrolled_window-i.yamlnu�[���PK"}[��$��6�Ari/1.8/system/Test/Unit/UI/GTK/TestRunner/start-i.yamlnu�[���PK"}[ ����B�Bri/1.8/system/Test/Unit/UI/GTK/TestRunner/test_progress_bar-i.yamlnu�[���PK#}[�~���:1Dri/1.8/system/Test/Unit/UI/GTK/TestRunner/add_fault-i.yamlnu�[���PK#}[Ј/���:fEri/1.8/system/Test/Unit/UI/GTK/TestRunner/red_style-i.yamlnu�[���PK#}[kh��B�Fri/1.8/system/Test/Unit/UI/GTK/TestRunner/error_count_label-i.yamlnu�[���PK#}[:����>�Gri/1.8/system/Test/Unit/UI/GTK/TestRunner/output_status-i.yamlnu�[���PK#}[��1�99? Iri/1.8/system/Test/Unit/UI/GTK/TestRunner/cdesc-TestRunner.yamlnu�[���PK#}[��F���>�Tri/1.8/system/Test/Unit/UI/GTK/TestRunner/test_finished-i.yamlnu�[���PK#}[F�wF��9
Vri/1.8/system/Test/Unit/UI/GTK/TestRunner/finished-i.yamlnu�[���PK#}[�����;FWri/1.8/system/Test/Unit/UI/GTK/TestRunner/main_panel-i.yamlnu�[���PK#}[���V��9yXri/1.8/system/Test/Unit/UI/GTK/TestRunner/run_test-i.yamlnu�[���PK#}[\�]��<�Yri/1.8/system/Test/Unit/UI/GTK/TestRunner/main_window-i.yamlnu�[���PK#}[�x�:��?�Zri/1.8/system/Test/Unit/UI/GTK/TestRunner/raw_show_fault-i.yamlnu�[���PK#}[�lb��?"\ri/1.8/system/Test/Unit/UI/GTK/TestRunner/result_changed-i.yamlnu�[���PK#}[Ud�?��=g]ri/1.8/system/Test/Unit/UI/GTK/TestRunner/detail_panel-i.yamlnu�[���PK#}[�����<�^ri/1.8/system/Test/Unit/UI/GTK/TestRunner/suite_panel-i.yamlnu�[���PK#}[<9��A�_ri/1.8/system/Test/Unit/UI/GTK/TestRunner/suite_name_entry-i.yamlnu�[���PK#}[c���9ari/1.8/system/Test/Unit/UI/GTK/TestRunner/reset_ui-i.yamlnu�[���PK#}[�B�T��9Mbri/1.8/system/Test/Unit/UI/GTK/TestRunner/start_ui-i.yamlnu�[���PK#}[4����;zcri/1.8/system/Test/Unit/UI/GTK/TestRunner/info_panel-i.yamlnu�[���PK#}[�>9���G�dri/1.8/system/Test/Unit/UI/GTK/TestRunner/outer_detail_sub_panel-i.yamlnu�[���PK#}[y��2��?fri/1.8/system/Test/Unit/UI/GTK/TestRunner/setup_mediator-i.yamlnu�[���PK#}[
�BX��GCgri/1.8/system/Test/Unit/UI/GTK/TestRunner/inner_detail_sub_panel-i.yamlnu�[���PK#}[!��E�hri/1.8/system/Test/Unit/UI/GTK/EnhancedLabel/cdesc-EnhancedLabel.yamlnu�[���PK$}[�����<jri/1.8/system/Test/Unit/UI/GTK/EnhancedLabel/set_text-i.yamlnu�[���PK$}[7(���CUkri/1.8/system/Test/Unit/UI/GTK/EnhancedProgressBar/set_style-i.yamlnu�[���PK$}[C��##Q�lri/1.8/system/Test/Unit/UI/GTK/EnhancedProgressBar/cdesc-EnhancedProgressBar.yamlnu�[���PK$}[�AbHHE?nri/1.8/system/Test/Unit/UI/Fox/FaultListItem/cdesc-FaultListItem.yamlnu�[���PK$}[|����7�ori/1.8/system/Test/Unit/UI/Fox/FaultListItem/new-c.yamlnu�[���PK$}[�����B$qri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_info_panel-i.yamlnu�[���PK$}[�u����<qrri/1.8/system/Test/Unit/UI/Fox/TestRunner/clear_fault-i.yamlnu�[���PK$}[���=�sri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_label-i.yamlnu�[���PK$}[�vu���D�tri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_detail_panel-i.yamlnu�[���PK$}[4>A_��5=vri/1.8/system/Test/Unit/UI/Fox/TestRunner/stop-i.yamlnu�[���PK$}[��M���=]wri/1.8/system/Test/Unit/UI/Fox/TestRunner/test_started-i.yamlnu�[���PK$}[�I�m��C�xri/1.8/system/Test/Unit/UI/Fox/TestRunner/attach_to_mediator-i.yamlnu�[���PK$}[��/;��8�yri/1.8/system/Test/Unit/UI/Fox/TestRunner/started-i.yamlnu�[���PK$}[ae���C{ri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_application-i.yamlnu�[���PK$}[N�i���;a|ri/1.8/system/Test/Unit/UI/Fox/TestRunner/show_fault-i.yamlnu�[���PK$}[������D�}ri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_progress_bar-i.yamlnu�[���PK$}[/y%��9�~ri/1.8/system/Test/Unit/UI/Fox/TestRunner/setup_ui-i.yamlnu�[���PK$}[�4�w004�ri/1.8/system/Test/Unit/UI/Fox/TestRunner/new-c.yamlnu�[���PK$}[���v��B��ri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_list_panel-i.yamlnu�[���PK$}[��X��6��ri/1.8/system/Test/Unit/UI/Fox/TestRunner/start-i.yamlnu�[���PK$}[�0h��:T�ri/1.8/system/Test/Unit/UI/Fox/TestRunner/add_fault-i.yamlnu�[���PK$}[4L9���>��ri/1.8/system/Test/Unit/UI/Fox/TestRunner/output_status-i.yamlnu�[���PK$}[f@��CɆri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_suite_panel-i.yamlnu�[���PK$}[� 7���?�ri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_tooltip-i.yamlnu�[���PK$}[ć���>Z�ri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_window-i.yamlnu�[���PK$}[�i�		?��ri/1.8/system/Test/Unit/UI/Fox/TestRunner/cdesc-TestRunner.yamlnu�[���PK$}[�Y@��<&�ri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_text-i.yamlnu�[���PK$}[XZ��9a�ri/1.8/system/Test/Unit/UI/Fox/TestRunner/finished-i.yamlnu�[���PK$}[)A�]��>��ri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_button-i.yamlnu�[���PK$}[�,	��=�ri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_entry-i.yamlnu�[���PK$}[w�����B&�ri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_fault_list-i.yamlnu�[���PK$}[�1����Bs�ri/1.8/system/Test/Unit/UI/Fox/TestRunner/create_main_panel-i.yamlnu�[���PK$}[��c���?��ri/1.8/system/Test/Unit/UI/Fox/TestRunner/raw_show_fault-i.yamlnu�[���PK$}[�HB��?�ri/1.8/system/Test/Unit/UI/Fox/TestRunner/result_changed-i.yamlnu�[���PK$}[�����9H�ri/1.8/system/Test/Unit/UI/Fox/TestRunner/reset_ui-i.yamlnu�[���PK$}[����9y�ri/1.8/system/Test/Unit/UI/Fox/TestRunner/start_ui-i.yamlnu�[���PK$}[۾�R��?��ri/1.8/system/Test/Unit/UI/Fox/TestRunner/setup_mediator-i.yamlnu�[���PK$}[i��ǽ�-�ri/1.8/system/Test/Unit/UI/Fox/cdesc-Fox.yamlnu�[���PK$}[��X���D��ri/1.8/system/Test/Unit/UI/Console/TestRunner/create_mediator-i.yamlnu�[���PK$}[�V���;L�ri/1.8/system/Test/Unit/UI/Console/TestRunner/output-i.yamlnu�[���PK$}[�MQ��A��ri/1.8/system/Test/Unit/UI/Console/TestRunner/test_started-i.yamlnu�[���PK$}[e��7��Gצri/1.8/system/Test/Unit/UI/Console/TestRunner/attach_to_mediator-i.yamlnu�[���PK$}[��b��B*�ri/1.8/system/Test/Unit/UI/Console/TestRunner/output_single-i.yamlnu�[���PK$}[�=��<��ri/1.8/system/Test/Unit/UI/Console/TestRunner/started-i.yamlnu�[���PK$}[rܜ��8��ri/1.8/system/Test/Unit/UI/Console/TestRunner/new-c.yamlnu�[���PK$}[����>�ri/1.8/system/Test/Unit/UI/Console/TestRunner/output%3f-i.yamlnu�[���PK$}[�=����:V�ri/1.8/system/Test/Unit/UI/Console/TestRunner/start-i.yamlnu�[���PK$}[ɼ���>��ri/1.8/system/Test/Unit/UI/Console/TestRunner/add_fault-i.yamlnu�[���PK$}[D�'<<C��ri/1.8/system/Test/Unit/UI/Console/TestRunner/cdesc-TestRunner.yamlnu�[���PK$}[A�ш��B��ri/1.8/system/Test/Unit/UI/Console/TestRunner/test_finished-i.yamlnu�[���PK$}[���N��=�ri/1.8/system/Test/Unit/UI/Console/TestRunner/finished-i.yamlnu�[���PK$}[�B����7/�ri/1.8/system/Test/Unit/UI/Console/TestRunner/nl-i.yamlnu�[���PK$}[��sT��C^�ri/1.8/system/Test/Unit/UI/Console/TestRunner/start_mediator-i.yamlnu�[���PK$}[��j:��C��ri/1.8/system/Test/Unit/UI/Console/TestRunner/setup_mediator-i.yamlnu�[���PK$}[�n���5�ri/1.8/system/Test/Unit/UI/Console/cdesc-Console.yamlnu�[���PK$}[�w],,K�ri/1.8/system/Test/Unit/UI/TestRunnerMediator/cdesc-TestRunnerMediator.yamlnu�[���PK$}[\
K5$$>��ri/1.8/system/Test/Unit/UI/TestRunnerMediator/run_suite-i.yamlnu�[���PK$}[�&�++8O�ri/1.8/system/Test/Unit/UI/TestRunnerMediator/new-c.yamlnu�[���PK$}[
Am���B��ri/1.8/system/Test/Unit/UI/TestRunnerMediator/create_result-i.yamlnu�[���PK$}[^V����M��ri/1.8/system/Test/Unit/UI/TestRunnerUtilities/start_command_line_test-i.yamlnu�[���PK$}[nɐ��M��ri/1.8/system/Test/Unit/UI/TestRunnerUtilities/cdesc-TestRunnerUtilities.yamlnu�[���PK$}[KY ((9�ri/1.8/system/Test/Unit/UI/TestRunnerUtilities/run-i.yamlnu�[���PK$}[��P{{6��ri/1.8/system/Test/Unit/Assertions/assert_equal-i.yamlnu�[���PK$}[�?I_��8t�ri/1.8/system/Test/Unit/Assertions/assert_not_nil-i.yamlnu�[���PK$}[�S��9��ri/1.8/system/Test/Unit/Assertions/assert_not_same-i.yamlnu�[���PK$}[G�a���7��ri/1.8/system/Test/Unit/Assertions/assert_throws-i.yamlnu�[���PK$}[��g�ww/��ri/1.8/system/Test/Unit/Assertions/flunk-i.yamlnu�[���PK$}[�i�ݼ�?��ri/1.8/system/Test/Unit/Assertions/assert_nothing_thrown-i.yamlnu�[���PK$}[�rź6��ri/1.8/system/Test/Unit/Assertions/assert_block-i.yamlnu�[���PK$}[:JRL��7Q�ri/1.8/system/Test/Unit/Assertions/build_message-i.yamlnu�[���PK$}[y�,85S�ri/1.8/system/Test/Unit/Assertions/assert_send-i.yamlnu�[���PK$}[LW**9��ri/1.8/system/Test/Unit/Assertions/assert_operator-i.yamlnu�[���PK$}[✟�mm3N�ri/1.8/system/Test/Unit/Assertions/use_pp%3d-c.yamlnu�[���PK$}[GgM��?�ri/1.8/system/Test/Unit/Assertions/assert_nothing_raised-i.yamlnu�[���PK$}[Ic���:O�ri/1.8/system/Test/Unit/Assertions/assert_not_equal-i.yamlnu�[���PK%}[p
P��4p�ri/1.8/system/Test/Unit/Assertions/assert_nil-i.yamlnu�[���PK%}[�E��6^�ri/1.8/system/Test/Unit/Assertions/assert_match-i.yamlnu�[���PK%}[��{�ff7w�ri/1.8/system/Test/Unit/Assertions/add_assertion-i.yamlnu�[���PK%}[dL__7D�ri/1.8/system/Test/Unit/Assertions/assert_raises-i.yamlnu�[���PK%}[��u���;
�ri/1.8/system/Test/Unit/Assertions/assert_respond_to-i.yamlnu�[���PK%}[Vϔ��06�ri/1.8/system/Test/Unit/Assertions/assert-i.yamlnu�[���PK%}[���9-�ri/1.8/system/Test/Unit/Assertions/assert_in_delta-i.yamlnu�[���PK%}[8"���5��ri/1.8/system/Test/Unit/Assertions/assert_same-i.yamlnu�[���PK%}[�%�UU8�ri/1.8/system/Test/Unit/Assertions/cdesc-Assertions.yamlnu�[���PK%}[�2Q��<�ri/1.8/system/Test/Unit/Assertions/assert_instance_of-i.yamlnu�[���PK%}[� t��6�ri/1.8/system/Test/Unit/Assertions/assert_raise-i.yamlnu�[���PK%}[|W�v��9�	ri/1.8/system/Test/Unit/Assertions/assert_no_match-i.yamlnu�[���PK%}[�Y���9ri/1.8/system/Test/Unit/Assertions/_wrap_assertion-i.yamlnu�[���PK%}[�����8W
ri/1.8/system/Test/Unit/Assertions/assert_kind_of-i.yamlnu�[���PK%}[գ����"nri/1.8/system/Test/cdesc-Test.yamlnu�[���PK%}[+$B��Dori/1.8/system/SingletonClassMethods/cdesc-SingletonClassMethods.yamlnu�[���PK%}[(��y��:}ri/1.8/system/SingletonClassMethods/_instantiate%3f-i.yamlnu�[���PK%}[�?;��0�ri/1.8/system/SingletonClassMethods/_load-i.yamlnu�[���PK%}[�)ږ!!4�ri/1.8/system/SingletonClassMethods/inherited-i.yamlnu�[���PK%}[{�330|ri/1.8/system/SingletonClassMethods/clone-i.yamlnu�[���PK%}[�.WhVVri/1.8/system/IO/flush-i.yamlnu�[���PK&}[����ri/1.8/system/IO/stat-i.yamlnu�[���PK&}[SmzOAA ri/1.8/system/IO/readbyte-i.yamlnu�[���PK&}[AEק��ri/1.8/system/IO/lines-i.yamlnu�[���PK&}[0��ii�!ri/1.8/system/IO/chars-i.yamlnu�[���PK&}[��*�CCW$ri/1.8/system/IO/select-c.yamlnu�[���PK&}[ԁdЙ��%ri/1.8/system/IO/fcntl-i.yamlnu�[���PK&}[�VȟOO�(ri/1.8/system/IO/fsync-i.yamlnu�[���PK&}[n���j+ri/1.8/system/IO/print-i.yamlnu�[���PK&}[�h����=/ri/1.8/system/IO/printf-i.yamlnu�[���PK&}[�\��//1ri/1.8/system/IO/each-i.yamlnu�[���PK&}[������4ri/1.8/system/IO/cdesc-IO.yamlnu�[���PK&}[�=K���Sri/1.8/system/IO/to_i-i.yamlnu�[���PK&}[D��O���Tri/1.8/system/IO/scanf-i.yamlnu�[���PK&}[`2�W005Zri/1.8/system/IO/lineno-i.yamlnu�[���PK&}[�Zm ���]ri/1.8/system/IO/read-i.yamlnu�[���PK&}[��Y���ari/1.8/system/IO/foreach-c.yamlnu�[���PK&}[a/9KK �dri/1.8/system/IO/readline-i.yamlnu�[���PK&}[6��99!Xfri/1.8/system/IO/each_line-i.yamlnu�[���PK&}[h�[��iri/1.8/system/IO/pipe-c.yamlnu�[���PK&}[D�q\Fori/1.8/system/IO/popen-c.yamlnu�[���PK&}[������#�wri/1.8/system/IO/readpartial-i.yamlnu�[���PK&}[otS9���ri/1.8/system/IO/sysread-i.yamlnu�[���PK'}[�Sp��ri/1.8/system/IO/binmode-i.yamlnu�[���PK'}[C�d����ri/1.8/system/IO/pid-i.yamlnu�[���PK'}[����#��ri/1.8/system/IO/block_scanf-i.yamlnu�[���PK'}[��ppp��ri/1.8/system/IO/sysseek-i.yamlnu�[���PK'}[����z�ri/1.8/system/IO/tell-i.yamlnu�[���PK'}[r����ri/1.8/system/IO/for_fd-c.yamlnu�[���PK'}[3����"�ri/1.8/system/IO/close_read-i.yamlnu�[���PK'}[�;�%%�ri/1.8/system/IO/rewind-i.yamlnu�[���PK'}[��#����ri/1.8/system/IO/getbyte-i.yamlnu�[���PK'}[�@�j<<��ri/1.8/system/IO/ungetc-i.yamlnu�[���PK'}[���

,�ri/1.8/system/IO/inspect-i.yamlnu�[���PK'}[,�Z�����ri/1.8/system/IO/eof-i.yamlnu�[���PK'}[�lY1��&m�ri/1.8/system/IO/soak_up_spaces-i.yamlnu�[���PK'}[��]��%v�ri/1.8/system/IO/read_nonblock-i.yamlnu�[���PK'}[O�.k����ri/1.8/system/IO/new-c.yamlnu�[���PK'}[�bG�||&��ri/1.8/system/IO/write_nonblock-i.yamlnu�[���PK'}[0+���!^�ri/1.8/system/IO/lineno%3d-i.yamlnu�[���PK'}[L
V }}!��ri/1.8/system/IO/each_byte-i.yamlnu�[���PK'}[I�S

i�ri/1.8/system/IO/isatty-i.yamlnu�[���PK'}[qҨĺri/1.8/system/IO/read-c.yamlnu�[���PK(}[�C�����ri/1.8/system/IO/write-i.yamlnu�[���PK(}[,�[Tff I�ri/1.8/system/IO/syswrite-i.yamlnu�[���PK(}[.Q���!��ri/1.8/system/IO/closed%3f-i.yamlnu�[���PK(}[Q���ri/1.8/system/IO/gets-i.yamlnu�[���PK(}[�#�����ri/1.8/system/IO/eof%3f-i.yamlnu�[���PK(}[v�5X00��ri/1.8/system/IO/%3c%3c-i.yamlnu�[���PK(}[I��Z!4�ri/1.8/system/IO/readlines-c.yamlnu�[���PK(}[H�@����ri/1.8/system/IO/reopen-i.yamlnu�[���PK(}[
Lb}����ri/1.8/system/IO/pos-i.yamlnu�[���PK(}[DF������ri/1.8/system/IO/getc-i.yamlnu�[���PK(}[;�z���!�ri/1.8/system/IO/readbytes-i.yamlnu�[���PK(}[?v��		9�ri/1.8/system/IO/tty%3f-i.yamlnu�[���PK)}[M|<gXX��ri/1.8/system/IO/putc-i.yamlnu�[���PK)}[�雂dd4�ri/1.8/system/IO/close-i.yamlnu�[���PK)}[?���qq!��ri/1.8/system/IO/each_char-i.yamlnu�[���PK)}[�T�H

��ri/1.8/system/IO/seek-i.yamlnu�[���PK)}[�����ri/1.8/system/IO/to_io-i.yamlnu�[���PK)}[Prvv:�ri/1.8/system/IO/sync%3d-i.yamlnu�[���PK*}["�zOAA ��ri/1.8/system/IO/readchar-i.yamlnu�[���PK*}[83������ri/1.8/system/IO/fileno-i.yamlnu�[���PK*}[�B��JJ��ri/1.8/system/IO/ioctl-i.yamlnu�[���PK*}[��ˆ��K�ri/1.8/system/IO/sysopen-c.yamlnu�[���PK*}[Ǧ3>  ?�ri/1.8/system/IO/sync-i.yamlnu�[���PK*}[������!��ri/1.8/system/IO/readlines-i.yamlnu�[���PK*}[�򤸰���ri/1.8/system/IO/pos%3d-i.yamlnu�[���PK*}[�"��ri/1.8/system/IO/puts-i.yamlnu�[���PK*}[r�YG��#ri/1.8/system/IO/close_write-i.yamlnu�[���PK*}[{�|�88bri/1.8/system/IO/bytes-i.yamlnu�[���PK*}[�a}�WW�	ri/1.8/system/IO/open-c.yamlnu�[���PK*}[��b��3�ri/1.8/system/Racc/ParseError/cdesc-ParseError.yamlnu�[���PK*}[Ρ���2�
ri/1.8/system/Racc/Parser/racc_print_stacks-i.yamlnu�[���PK*}[GM�t��+�ri/1.8/system/Racc/Parser/next_token-i.yamlnu�[���PK*}[��8���,�ri/1.8/system/Racc/Parser/racc_reduce-i.yamlnu�[���PK*}[��k��. ri/1.8/system/Racc/Parser/_racc_evalact-i.yamlnu�[���PK*}[�r���(lri/1.8/system/Racc/Parser/yyparse-i.yamlnu�[���PK*}[
ڣ=��,�ri/1.8/system/Racc/Parser/racc_accept-i.yamlnu�[���PK*}[M�6��)�ri/1.8/system/Racc/Parser/on_error-i.yamlnu�[���PK*}[�)y���2�ri/1.8/system/Racc/Parser/racc_runtime_type-c.yamlnu�[���PK*}[���/�ri/1.8/system/Racc/Parser/racc_token2str-i.yamlnu�[���PK*}[x���1ri/1.8/system/Racc/Parser/_racc_yyparse_rb-i.yamlnu�[���PK*}[��|��)Ori/1.8/system/Racc/Parser/do_parse-i.yamlnu�[���PK*}[�+1��0�ri/1.8/system/Racc/Parser/_racc_do_reduce-i.yamlnu�[���PK*}[㞧ee+�ri/1.8/system/Racc/Parser/cdesc-Parser.yamlnu�[���PK*}[]�t��2m(ri/1.8/system/Racc/Parser/_racc_do_parse_rb-i.yamlnu�[���PK*}[ڷ쫯�(�)ri/1.8/system/Racc/Parser/yyerror-i.yamlnu�[���PK+}[.ʃ���+�*ri/1.8/system/Racc/Parser/racc_e_pop-i.yamlnu�[���PK+}[�{���(�+ri/1.8/system/Racc/Parser/yyerrok-i.yamlnu�[���PK+}[�����-�,ri/1.8/system/Racc/Parser/token_to_str-i.yamlnu�[���PK+}[�kA��0�-ri/1.8/system/Racc/Parser/racc_next_state-i.yamlnu�[���PK+}[G�5���2/ri/1.8/system/Racc/Parser/racc_print_states-i.yamlnu�[���PK+}[�m�60=0ri/1.8/system/Racc/Parser/racc_read_token-i.yamlnu�[���PK+}[��3���,�1ri/1.8/system/Racc/Parser/_racc_setup-i.yamlnu�[���PK+}[�}���)�2ri/1.8/system/Racc/Parser/yyaccept-i.yamlnu�[���PK+}[B�����+�3ri/1.8/system/Racc/Parser/racc_shift-i.yamlnu�[���PK+}[�p�n��3�4ri/1.8/system/Racc/Parser/_racc_init_sysvars-i.yamlnu�[���PK+}[�x"6ri/1.8/system/Racc/cdesc-Racc.yamlnu�[���PK+}[�Qe((,[7ri/1.8/system/SortedSet/cdesc-SortedSet.yamlnu�[���PK+}[����)�8ri/1.8/system/Sync_m/extend_object-c.yamlnu�[���PK+}[wF�~��*�9ri/1.8/system/Sync_m/sync_locked%3f-i.yamlnu�[���PK+}[H��j��+);ri/1.8/system/Sync_m/sync_initialize-i.yamlnu�[���PK+}[�Lc'=<ri/1.8/system/Sync_m/Err/cdesc-Err.yamlnu�[���PK,}[����$�=ri/1.8/system/Sync_m/Err/Fail-c.yamlnu�[���PK,}[�F[YY?�>ri/1.8/system/Sync_m/Err/UnknownLocker/cdesc-UnknownLocker.yamlnu�[���PK,}[]�<��2x@ri/1.8/system/Sync_m/Err/UnknownLocker/Fail-c.yamlnu�[���PK,}[\L��ZZA�Ari/1.8/system/Sync_m/Err/LockModeFailer/cdesc-LockModeFailer.yamlnu�[���PK,}[���3]Cri/1.8/system/Sync_m/Err/LockModeFailer/Fail-c.yamlnu�[���PK,}[�����+{Dri/1.8/system/Sync_m/append_features-c.yamlnu�[���PK,}[�0����Eri/1.8/system/Sync_m/new-c.yamlnu�[���PK,}[�4s���%�Fri/1.8/system/Sync_m/sync_lock-i.yamlnu�[���PK,}[�M�C��-�Gri/1.8/system/Sync_m/sync_exclusive%3f-i.yamlnu�[���PK-}[�a����-�Hri/1.8/system/Sync_m/sync_try_lock_sub-i.yamlnu�[���PK-}[�~Pϲ�*�Iri/1.8/system/Sync_m/sync_shared%3f-i.yamlnu�[���PK-}[͚�~��,�Jri/1.8/system/Sync_m/sync_synchronize-i.yamlnu�[���PK-}[5�6���*�Kri/1.8/system/Sync_m/define_aliases-c.yamlnu�[���PK-}[6��J��)Mri/1.8/system/Sync_m/sync_try_lock-i.yamlnu�[���PK-}[��۴�)NNri/1.8/system/Sync_m/sync_extended-i.yamlnu�[���PK.}[�O�@��&[Ori/1.8/system/Sync_m/cdesc-Sync_m.yamlnu�[���PK.}[p�R$��'iVri/1.8/system/Sync_m/sync_unlock-i.yamlnu�[���PK/}[��^��(vWri/1.8/system/DOT/DOTSubgraph/pop-i.yamlnu�[���PK/}[ż��UU4xXri/1.8/system/DOT/DOTSubgraph/cdesc-DOTSubgraph.yamlnu�[���PK/}['&X��(1[ri/1.8/system/DOT/DOTSubgraph/new-c.yamlnu�[���PK0}[J>>e��)Z\ri/1.8/system/DOT/DOTSubgraph/push-i.yamlnu�[���PK0}[�-���.f]ri/1.8/system/DOT/DOTSubgraph/each_node-i.yamlnu�[���PK0}[M�2��+�^ri/1.8/system/DOT/DOTSubgraph/%3c%3c-i.yamlnu�[���PK1}[�H�g��)�_ri/1.8/system/DOT/DOTSubgraph/to_s-i.yamlnu�[���PK1}[�8�ҷ�>�`ri/1.8/system/DOT/DOTSimpleElement/cdesc-DOTSimpleElement.yamlnu�[���PK1}[~BN��-�bri/1.8/system/DOT/DOTSimpleElement/new-c.yamlnu�[���PK2}[��Lʱ�.�cri/1.8/system/DOT/DOTSimpleElement/to_s-i.yamlnu�[���PK2}[}v�#�dri/1.8/system/DOT/change_tab-i.yamlnu�[���PK2}[d_޳�$Efri/1.8/system/DOT/DOTPort/new-c.yamlnu�[���PK2}[! F��,Lgri/1.8/system/DOT/DOTPort/cdesc-DOTPort.yamlnu�[���PK2}[(ר�%iri/1.8/system/DOT/DOTPort/to_s-i.yamlnu�[���PK2}[~6����$|jri/1.8/system/DOT/DOTEdge/new-c.yamlnu�[���PK2}[�G���,�kri/1.8/system/DOT/DOTEdge/cdesc-DOTEdge.yamlnu�[���PK2}[�=���%�mri/1.8/system/DOT/DOTEdge/to_s-i.yamlnu�[���PK2}[5��`��*�nri/1.8/system/DOT/DOTNode/each_port-i.yamlnu�[���PK2}[�y~x,�ori/1.8/system/DOT/DOTNode/cdesc-DOTNode.yamlnu�[���PK2}[�JsQ��$Crri/1.8/system/DOT/DOTNode/pop-i.yamlnu�[���PK2}[��
���$=sri/1.8/system/DOT/DOTNode/new-c.yamlnu�[���PK2}[dP"��%]tri/1.8/system/DOT/DOTNode/push-i.yamlnu�[���PK2}['����'auri/1.8/system/DOT/DOTNode/%3c%3c-i.yamlnu�[���PK2}[Yf���%evri/1.8/system/DOT/DOTNode/to_s-i.yamlnu�[���PK2}[�d9��/jwri/1.8/system/DOT/DOTElement/each_option-i.yamlnu�[���PK2}[�kS���2�xri/1.8/system/DOT/DOTElement/cdesc-DOTElement.yamlnu�[���PK2}[�b���'�{ri/1.8/system/DOT/DOTElement/new-c.yamlnu�[���PK2}[��&��4�|ri/1.8/system/DOT/DOTElement/each_option_pair-i.yamlnu�[���PK2}[wd:�ii ~ri/1.8/system/DOT/cdesc-DOT.yamlnu�[���PK2}[S�I���'��ri/1.8/system/DOT/DOTDigraph/new-c.yamlnu�[���PK2}[y�((2�ri/1.8/system/DOT/DOTDigraph/cdesc-DOTDigraph.yamlnu�[���PK2}[��k�nn.q�ri/1.8/system/UNIXSocket/cdesc-UNIXSocket.yamlnu�[���PK2}[x��|��%=�ri/1.8/system/IPAddr/%3c%3d%3e-i.yamlnu�[���PK2}[t��m�� }�ri/1.8/system/IPAddr/to_i-i.yamlnu�[���PK2}[[�?�*Őri/1.8/system/IPAddr/ipv4_compat%3f-i.yamlnu�[���PK2}[W��U��4�ri/1.8/system/IPAddr/%7c-i.yamlnu�[���PK2}[� 0k��t�ri/1.8/system/IPAddr/%26-i.yamlnu�[���PK2}[�m��   ��ri/1.8/system/IPAddr/ntop-c.yamlnu�[���PK2}[��77'%�ri/1.8/system/IPAddr/ipv4_mapped-i.yamlnu�[���PK3}[l�+$��&��ri/1.8/system/IPAddr/_to_string-i.yamlnu�[���PK3}[������ri/1.8/system/IPAddr/set-i.yamlnu�[���PK3}[�_����ri/1.8/system/IPAddr/%7e-i.yamlnu�[���PK3}[6�e6LL#��ri/1.8/system/IPAddr/inspect-i.yamlnu�[���PK3}[�
�p��#��ri/1.8/system/IPAddr/mask%21-i.yamlnu�[���PK3}[����//$��ri/1.8/system/IPAddr/new_ntoh-c.yamlnu�[���PK3}[�}.xx&�ri/1.8/system/IPAddr/include%3f-i.yamlnu�[���PK3}[�2���ri/1.8/system/IPAddr/new-c.yamlnu�[���PK3}[u�RV..#��ri/1.8/system/IPAddr/reverse-i.yamlnu�[���PK3}[��™��%x�ri/1.8/system/IPAddr/%3d%3d%3d-i.yamlnu�[���PK3}[�Q4\��"��ri/1.8/system/IPAddr/%3e%3e-i.yamlnu�[���PK3}[$(��$��ri/1.8/system/IPAddr/ip6_arpa-i.yamlnu�[���PK3}[�6#G [�ri/1.8/system/IPAddr/hton-i.yamlnu�[���PK3}[�i�Z;;'��ri/1.8/system/IPAddr/ipv4_compat-i.yamlnu�[���PK3}[�ض'��"A�ri/1.8/system/IPAddr/%3c%3c-i.yamlnu�[���PK3}[�s�*��ri/1.8/system/IPAddr/ipv4_mapped%3f-i.yamlnu�[���PK3}[��Tұ�%��ri/1.8/system/IPAddr/addr_mask-i.yamlnu�[���PK3}[���� ��ri/1.8/system/IPAddr/succ-i.yamlnu�[���PK3}[�ل 8�ri/1.8/system/IPAddr/to_s-i.yamlnu�[���PK3}[�����"��ri/1.8/system/IPAddr/%3d%3d-i.yamlnu�[���PK3}[�	+���#ɶri/1.8/system/IPAddr/ipv6%3f-i.yamlnu�[���PK3}[N��%�ri/1.8/system/IPAddr/to_string-i.yamlnu�[���PK3}[�6�	ww"��ri/1.8/system/IPAddr/native-i.yamlnu�[���PK3}[֚�o4
4
&N�ri/1.8/system/IPAddr/cdesc-IPAddr.yamlnu�[���PK3}[Qۥ�

#��ri/1.8/system/IPAddr/ip6_int-i.yamlnu�[���PK3}[��X��(8�ri/1.8/system/IPAddr/coerce_other-i.yamlnu�[���PK3}[����#H�ri/1.8/system/IPAddr/ipv4%3f-i.yamlnu�[���PK3}[�..���$��ri/1.8/system/IPAddr/_reverse-i.yamlnu�[���PK3}[�4'��$��ri/1.8/system/IPAddr/in6_addr-i.yamlnu�[���PK3}[~�o��#��ri/1.8/system/IPAddr/in_addr-i.yamlnu�[���PK3}[�}���$��ri/1.8/system/IPAddr/to_range-i.yamlnu�[���PK3}[�Y�PP ��ri/1.8/system/IPAddr/mask-i.yamlnu�[���PK3}[#�?��$��ri/1.8/system/Float/cdesc-Float.yamlnu�[���PK3}[������&f�ri/1.8/system/Float/infinite%3f-i.yamlnu�[���PK3}[��)e��!��ri/1.8/system/Float/eql%3f-i.yamlnu�[���PK3}[^^¦����ri/1.8/system/Float/%25-i.yamlnu�[���PK3}[$}T==!��ri/1.8/system/Float/%2a%2a-i.yamlnu�[���PK3}[7ؕ!��$�ri/1.8/system/Float/%3c%3d%3e-i.yamlnu�[���PK3}[�b���!`�ri/1.8/system/Float/coerce-i.yamlnu�[���PK3}[u�``PP��ri/1.8/system/Float/to_i-i.yamlnu�[���PK3}[8�Ī004�ri/1.8/system/Float/%2f-i.yamlnu�[���PK3}[�R�.!��ri/1.8/system/Float/divmod-i.yamlnu�[���PK3}[r��Z��"�ri/1.8/system/Float/to_yaml-i.yamlnu�[���PK3}[u䔦�ri/1.8/system/Float/%3c-i.yamlnu�[���PK3}[�<��z�ri/1.8/system/Float/hash-i.yamlnu�[���PK3}[��%*,,!��ri/1.8/system/Float/%3c%3d-i.yamlnu�[���PK3}[2���ooG�ri/1.8/system/Float/abs-i.yamlnu�[���PK3}[�K
11!�ri/1.8/system/Float/%3e%3d-i.yamlnu�[���PK3}[��S|++��ri/1.8/system/Float/%2a-i.yamlnu�[���PK3}[Tm�]����ri/1.8/system/Float/ceil-i.yamlnu�[���PK3}[e–,"�ri/1.8/system/Float/zero%3f-i.yamlnu�[���PK3}[w�j%%u�ri/1.8/system/Float/%2b-i.yamlnu�[���PK3}[���XX#�ri/1.8/system/Float/truncate-i.yamlnu�[���PK3}[,�$TT!��ri/1.8/system/Float/to_int-i.yamlnu�[���PK3}[G�����!8ri/1.8/system/Float/nan%3f-i.yamlnu�[���PK3}[�ޡ\��\ri/1.8/system/Float/to_s-i.yamlnu�[���PK3}[v�$qq$Mri/1.8/system/Float/finite%3f-i.yamlnu�[���PK3}[9@S�""ri/1.8/system/Float/%3e-i.yamlnu�[���PK3}[* c���!�ri/1.8/system/Float/%3d%3d-i.yamlnu�[���PK3}[�?��'�	ri/1.8/system/Float/induced_from-c.yamlnu�[���PK3}[|AO��!ri/1.8/system/Float/%2d%40-i.yamlnu�[���PK3}[�(�� Vri/1.8/system/Float/round-i.yamlnu�[���PK3}[����!�ri/1.8/system/Float/dclone-i.yamlnu�[���PK3}[�B�� �ri/1.8/system/Float/floor-i.yamlnu�[���PK3}[�Dw�ri/1.8/system/Float/to_f-i.yamlnu�[���PK3}[A����!ri/1.8/system/Float/modulo-i.yamlnu�[���PK3}[N@��..6ri/1.8/system/Float/%2d-i.yamlnu�[���PK3}[��-�ri/1.8/system/REXML/ExternalEntity/new-c.yamlnu�[���PK3}[^�>|VV<�ri/1.8/system/REXML/ExternalEntity/cdesc-ExternalEntity.yamlnu�[���PK3}[�b����/�ri/1.8/system/REXML/ExternalEntity/write-i.yamlnu�[���PK3}[4ȣ
��.�ri/1.8/system/REXML/ExternalEntity/to_s-i.yamlnu�[���PK3}[�����6�ri/1.8/system/REXML/Declaration/cdesc-Declaration.yamlnu�[���PK3}[\>ů�*ri/1.8/system/REXML/Declaration/new-c.yamlnu�[���PK3}[��44,ri/1.8/system/REXML/Declaration/write-i.yamlnu�[���PK3}[��A��+� ri/1.8/system/REXML/Declaration/to_s-i.yamlnu�[���PK3}[�n���$�!ri/1.8/system/REXML/cdesc-REXML.yamlnu�[���PK3}[�On99:�%ri/1.8/system/REXML/Document/entity_expansion_limit-c.yamlnu�[���PK3}[�-k)��/�'ri/1.8/system/REXML/Document/add_element-i.yamlnu�[���PK3}[5I�5$$+�(ri/1.8/system/REXML/Document/doctype-i.yamlnu�[���PK3}[�+�A��B3*ri/1.8/system/REXML/Document/entity_expansion_text_limit%3d-c.yamlnu�[���PK3}[��?KEE1O,ri/1.8/system/REXML/Document/expanded_name-i.yamlnu�[���PK3}[�;�<$$(�-ri/1.8/system/REXML/Document/root-i.yamlnu�[���PK3}[��]���?q/ri/1.8/system/REXML/Document/entity_expansion_text_limit-c.yamlnu�[���PK3}[~���RR0�1ri/1.8/system/REXML/Document/cdesc-Document.yamlnu�[���PK3}[Pi�QQ'4:ri/1.8/system/REXML/Document/add-i.yamlnu�[���PK3}[��*rNN,�;ri/1.8/system/REXML/Document/encoding-i.yamlnu�[���PK3}[b,Ј��0�=ri/1.8/system/REXML/Document/parse_stream-c.yamlnu�[���PK3}[�C//'�>ri/1.8/system/REXML/Document/new-c.yamlnu�[���PK3}[*��@@,9Ari/1.8/system/REXML/Document/xml_decl-i.yamlnu�[���PK3}[��U��-�Bri/1.8/system/REXML/Document/node_type-i.yamlnu�[���PK3}[���+
+
)�Cri/1.8/system/REXML/Document/write-i.yamlnu�[���PK3}[kw��*kNri/1.8/system/REXML/Document/%3c%3c-i.yamlnu�[���PK3}[�����)�Ori/1.8/system/REXML/Document/clone-i.yamlnu�[���PK3}[̭4*]]2�Pri/1.8/system/REXML/Document/stand_alone%3f-i.yamlnu�[���PK3}[
����;�Rri/1.8/system/REXML/Document/record_entity_expansion-i.yamlnu�[���PK3}[��!��(�Sri/1.8/system/REXML/Document/name-i.yamlnu�[���PK3}[ET��@@=#Uri/1.8/system/REXML/Document/entity_expansion_limit%3d-c.yamlnu�[���PK3}[�nA���)�Vri/1.8/system/REXML/Document/build-i.yamlnu�[���PK3}[� ��JJ+�Wri/1.8/system/REXML/Document/version-i.yamlnu�[���PK3}[#��}��*�Yri/1.8/system/REXML/Source/match_to-i.yamlnu�[���PK3}[(ż[��*�Zri/1.8/system/REXML/Source/empty%3f-i.yamlnu�[���PK3}[��M.�[ri/1.8/system/REXML/Source/current_line-i.yamlnu�[���PK3}[:,E���&W]ri/1.8/system/REXML/Source/read-i.yamlnu�[���PK3}[챼���*V^ri/1.8/system/REXML/Source/position-i.yamlnu�[���PK3}[z	�a��)a_ri/1.8/system/REXML/Source/consume-i.yamlnu�[���PK3}[����'r`ri/1.8/system/REXML/Source/match-i.yamlnu�[���PK3}[���dd&�ari/1.8/system/REXML/Source/scan-i.yamlnu�[���PK3}[�f����%Afri/1.8/system/REXML/Source/new-c.yamlnu�[���PK3}[�l���2,hri/1.8/system/REXML/Source/match_to_consume-i.yamlnu�[���PK3}[���,^iri/1.8/system/REXML/Source/cdesc-Source.yamlnu�[���PK3}[:
��-�nri/1.8/system/REXML/Source/encoding%3d-i.yamlnu�[���PK3}[^h	��&Hpri/1.8/system/REXML/XPath/first-c.yamlnu�[���PK3}[i���$$*6tri/1.8/system/REXML/XPath/cdesc-XPath.yamlnu�[���PK3}[�uCk//&�vri/1.8/system/REXML/XPath/match-c.yamlnu�[���PK3}[t�4��%9xri/1.8/system/REXML/XPath/each-c.yamlnu�[���PK3}[�Ic��+|ri/1.8/system/REXML/Parent/delete_at-i.yamlnu�[���PK3}[?�R''&*}ri/1.8/system/REXML/Parent/size-i.yamlnu�[���PK3}[�eI,�~ri/1.8/system/REXML/Parent/cdesc-Parent.yamlnu�[���PK3}[I9�^(((!�ri/1.8/system/REXML/Parent/%5b%5d-i.yamlnu�[���PK3}[`X.)��&��ri/1.8/system/REXML/Parent/each-i.yamlnu�[���PK3}[�����&ԇri/1.8/system/REXML/Parent/to_a-i.yamlnu�[���PK3}[kXf~''.��ri/1.8/system/REXML/Parent/insert_after-i.yamlnu�[���PK3}[/��د�+��ri/1.8/system/REXML/Parent/parent%3f-i.yamlnu�[���PK3}[VtX��(��ri/1.8/system/REXML/Parent/delete-i.yamlnu�[���PK3}[�H�C��/��ri/1.8/system/REXML/Parent/replace_child-i.yamlnu�[���PK3}[*��xx'��ri/1.8/system/REXML/Parent/index-i.yamlnu�[���PK3}[�T���+��ri/1.8/system/REXML/Parent/delete_if-i.yamlnu�[���PK3}[���h��%��ri/1.8/system/REXML/Parent/add-i.yamlnu�[���PK3}[�**ַ�)̓ri/1.8/system/REXML/Parent/unshift-i.yamlnu�[���PK3}[�w|)%%%ܔri/1.8/system/REXML/Parent/new-c.yamlnu�[���PK3}[GB0T��,V�ri/1.8/system/REXML/Parent/each_child-i.yamlnu�[���PK3}[cR�1��*��ri/1.8/system/REXML/Parent/children-i.yamlnu�[���PK3}[[ӥw&�ri/1.8/system/REXML/Parent/push-i.yamlnu�[���PK4}[�j_AA,H�ri/1.8/system/REXML/Parent/deep_clone-i.yamlnu�[���PK4}[�yo��(�ri/1.8/system/REXML/Parent/length-i.yamlnu�[���PK4}[#����( �ri/1.8/system/REXML/Parent/%3c%3c-i.yamlnu�[���PK4}[���,,/]�ri/1.8/system/REXML/Parent/insert_before-i.yamlnu�[���PK4}[Hqdo��,�ri/1.8/system/REXML/Parent/each_index-i.yamlnu�[���PK4}[�����+�ri/1.8/system/REXML/Parent/%5b%5d%3d-i.yamlnu�[���PK4}[I�g@@9�ri/1.8/system/REXML/entity_expansion_text_limit%3d-c.yamlnu�[���PK4}[Q�}�&&6��ri/1.8/system/REXML/EntityConst/cdesc-EntityConst.yamlnu�[���PK4}[������*D�ri/1.8/system/REXML/Attributes/size-i.yamlnu�[���PK4}[-B$ё�,��ri/1.8/system/REXML/Attributes/%5b%5d-i.yamlnu�[���PK4}[��n66*p�ri/1.8/system/REXML/Attributes/each-i.yamlnu�[���PK4}[��1/��*�ri/1.8/system/REXML/Attributes/to_a-i.yamlnu�[���PK4}[��?���0�ri/1.8/system/REXML/Attributes/namespaces-i.yamlnu�[���PK4}[�gg]��, �ri/1.8/system/REXML/Attributes/delete-i.yamlnu�[���PK4}[a��"{{4a�ri/1.8/system/REXML/Attributes/cdesc-Attributes.yamlnu�[���PK5}[��t���)@�ri/1.8/system/REXML/Attributes/add-i.yamlnu�[���PK5}[��P��)��ri/1.8/system/REXML/Attributes/new-c.yamlnu�[���PK5}[��?	��,d�ri/1.8/system/REXML/Attributes/length-i.yamlnu�[���PK5}[k�]���3��ri/1.8/system/REXML/Attributes/get_attribute-i.yamlnu�[���PK5}[ر����,��ri/1.8/system/REXML/Attributes/%3c%3c-i.yamlnu�[���PK6}[lE��rr.�ri/1.8/system/REXML/Attributes/prefixes-i.yamlnu�[���PK6}[�g����6��ri/1.8/system/REXML/Attributes/get_attribute_ns-i.yamlnu�[���PK6}[�ޮ՞�/L�ri/1.8/system/REXML/Attributes/%5b%5d%3d-i.yamlnu�[���PK6}[iO��GG0I�ri/1.8/system/REXML/Attributes/delete_all-i.yamlnu�[���PK6}[ٸ,�224��ri/1.8/system/REXML/Attributes/each_attribute-i.yamlnu�[���PK6}[
�[��2��ri/1.8/system/REXML/SAX2Listener/entitydecl-i.yamlnu�[���PK6}[��m��<o�ri/1.8/system/REXML/SAX2Listener/start_prefix_mapping-i.yamlnu�[���PK6}[/��T��/��ri/1.8/system/REXML/SAX2Listener/doctype-i.yamlnu�[���PK6}[���6  3��ri/1.8/system/REXML/SAX2Listener/attlistdecl-i.yamlnu�[���PK6}[ɀF��03�ri/1.8/system/REXML/SAX2Listener/progress-i.yamlnu�[���PK6}[O-�ygg/R�ri/1.8/system/REXML/SAX2Listener/xmldecl-i.yamlnu�[���PK6}[�
���6�ri/1.8/system/REXML/SAX2Listener/start_document-i.yamlnu�[���PK6}[U���3A�ri/1.8/system/REXML/SAX2Listener/elementdecl-i.yamlnu�[���PK6}[��Y���3��ri/1.8/system/REXML/SAX2Listener/end_element-i.yamlnu�[���PK6}[
���nn8��ri/1.8/system/REXML/SAX2Listener/cdesc-SAX2Listener.yamlnu�[���PK6}[$?%��5��ri/1.8/system/REXML/SAX2Listener/start_element-i.yamlnu�[���PK6}[_[99-��ri/1.8/system/REXML/SAX2Listener/cdata-i.yamlnu�[���PK6}[���2��ri/1.8/system/REXML/SAX2Listener/characters-i.yamlnu�[���PK6}[� �Q��:��ri/1.8/system/REXML/SAX2Listener/end_prefix_mapping-i.yamlnu�[���PK6}[R*d,,/�ri/1.8/system/REXML/SAX2Listener/comment-i.yamlnu�[���PK6}[����4r�ri/1.8/system/REXML/SAX2Listener/notationdecl-i.yamlnu�[���PK6}[�k޿�4�ri/1.8/system/REXML/SAX2Listener/end_document-i.yamlnu�[���PK6}[nn����>��ri/1.8/system/REXML/SAX2Listener/processing_instruction-i.yamlnu�[���PK6}[p�d�  .H�ri/1.8/system/REXML/Node/each_recursive-i.yamlnu�[���PK6}[�~�5�ri/1.8/system/REXML/Node/previous_sibling_node-i.yamlnu�[���PK6}[���e��)Fri/1.8/system/REXML/Node/parent%3f-i.yamlnu�[���PK6}[H��>yy4Lri/1.8/system/REXML/Node/find_first_recursive-i.yamlnu�[���PK6}[ۇ��&)ri/1.8/system/REXML/Node/indent-i.yamlnu�[���PK6}[�O$Q(1ri/1.8/system/REXML/Node/cdesc-Node.yamlnu�[���PK6}[z�ϭ�$�	ri/1.8/system/REXML/Node/to_s-i.yamlnu�[���PK6}[�0�1�ri/1.8/system/REXML/Node/next_sibling_node-i.yamlnu�[���PK6}[���66/

ri/1.8/system/REXML/Node/index_in_parent-i.yamlnu�[���PK6}[���>��:�ri/1.8/system/REXML/UndefinedNamespaceException/new-c.yamlnu�[���PK6}[d�iV�ri/1.8/system/REXML/UndefinedNamespaceException/cdesc-UndefinedNamespaceException.yamlnu�[���PK6}[�ڻ#��2�ri/1.8/system/REXML/XMLTokens/cdesc-XMLTokens.yamlnu�[���PK6}[�P�++,�ri/1.8/system/REXML/Comment/%3c%3d%3e-i.yamlnu�[���PK6}[VI��UU&Eri/1.8/system/REXML/Comment/new-c.yamlnu�[���PK6}[KU#�||.�ri/1.8/system/REXML/Comment/cdesc-Comment.yamlnu�[���PK6}[�˽���,�ri/1.8/system/REXML/Comment/node_type-i.yamlnu�[���PK6}[�8�O��(�ri/1.8/system/REXML/Comment/write-i.yamlnu�[���PK6}[�'kR++)�"ri/1.8/system/REXML/Comment/%3d%3d-i.yamlnu�[���PK6}[�2��($ri/1.8/system/REXML/Comment/clone-i.yamlnu�[���PK6}[P����7�%ri/1.8/system/REXML/Validation/Optional/expected-i.yamlnu�[���PK6}['��ɾ�3�&ri/1.8/system/REXML/Validation/Optional/next-i.yamlnu�[���PK6}[wKQ���9�'ri/1.8/system/REXML/Validation/Optional/matches%3f-i.yamlnu�[���PK6}[��aa;�(ri/1.8/system/REXML/Validation/Optional/cdesc-Optional.yamlnu�[���PK6}[=`����9�*ri/1.8/system/REXML/Validation/Sequence/matches%3f-i.yamlnu�[���PK6}[Y�|6��;�+ri/1.8/system/REXML/Validation/Sequence/cdesc-Sequence.yamlnu�[���PK6}[ț/H��5Z-ri/1.8/system/REXML/Validation/Choice/expected-i.yamlnu�[���PK6}[����1|.ri/1.8/system/REXML/Validation/Choice/next-i.yamlnu�[���PK6}[h/dUU7�/ri/1.8/system/REXML/Validation/Choice/cdesc-Choice.yamlnu�[���PK6}[J<����4U2ri/1.8/system/REXML/Validation/Choice/inspect-i.yamlnu�[���PK6}[qy����0t3ri/1.8/system/REXML/Validation/Choice/new-c.yamlnu�[���PK6}[���o��3�4ri/1.8/system/REXML/Validation/Choice/%3c%3c-i.yamlnu�[���PK6}[������7�5ri/1.8/system/REXML/Validation/Choice/matches%3f-i.yamlnu�[���PK6}[H:`ѷ�2�6ri/1.8/system/REXML/Validation/Choice/reset-i.yamlnu�[���PK6}[�����>�7ri/1.8/system/REXML/Validation/Choice/add_event_to_arry-i.yamlnu�[���PK6}[�v�7��4:9ri/1.8/system/REXML/Validation/State/expected-i.yamlnu�[���PK6}[�.B���7Z:ri/1.8/system/REXML/Validation/State/previous%3d-i.yamlnu�[���PK6}[�HW��0�;ri/1.8/system/REXML/Validation/State/next-i.yamlnu�[���PK7}[ �k���9�<ri/1.8/system/REXML/Validation/State/expand_ref_in-i.yamlnu�[���PK7}[m�_��3�=ri/1.8/system/REXML/Validation/State/inspect-i.yamlnu�[���PK7}[a�s��5�>ri/1.8/system/REXML/Validation/State/cdesc-State.yamlnu�[���PK7}[�0���/XBri/1.8/system/REXML/Validation/State/new-c.yamlnu�[���PK7}[Xף���2rCri/1.8/system/REXML/Validation/State/%3c%3c-i.yamlnu�[���PK7}[��Z���0�Dri/1.8/system/REXML/Validation/State/to_s-i.yamlnu�[���PK7}[�϶�1�Eri/1.8/system/REXML/Validation/State/reset-i.yamlnu�[���PK7}[�r�f��:�Fri/1.8/system/REXML/Validation/State/generate_event-i.yamlnu�[���PK7}[5�$+��=�Gri/1.8/system/REXML/Validation/State/add_event_to_arry-i.yamlnu�[���PK7}[�C`���4=Iri/1.8/system/REXML/Validation/cdesc-Validation.yamlnu�[���PK7}[�gN��1cJri/1.8/system/REXML/Validation/RelaxNG/new-c.yamlnu�[���PK7}[N�K_.
.
9�Kri/1.8/system/REXML/Validation/RelaxNG/cdesc-RelaxNG.yamlnu�[���PK7}[b�����5MVri/1.8/system/REXML/Validation/RelaxNG/receive-i.yamlnu�[���PK7}[�׀^��=sWri/1.8/system/REXML/Validation/Validator/cdesc-Validator.yamlnu�[���PK7}[FGb���8�Yri/1.8/system/REXML/Validation/Validator/validate-i.yamlnu�[���PK7}[gΥ/��4�Zri/1.8/system/REXML/Validation/Validator/dump-i.yamlnu�[���PK7}[��Hx��5�[ri/1.8/system/REXML/Validation/Validator/reset-i.yamlnu�[���PK7}[}����9�\ri/1.8/system/REXML/Validation/Interleave/expected-i.yamlnu�[���PK7}[�.��=^ri/1.8/system/REXML/Validation/Interleave/next_current-i.yamlnu�[���PK7}[aKH��5V_ri/1.8/system/REXML/Validation/Interleave/next-i.yamlnu�[���PK7}[���**?{`ri/1.8/system/REXML/Validation/Interleave/cdesc-Interleave.yamlnu�[���PK7}[��Jӿ�8cri/1.8/system/REXML/Validation/Interleave/inspect-i.yamlnu�[���PK7}[�G?X��4;dri/1.8/system/REXML/Validation/Interleave/new-c.yamlnu�[���PK7}[>�,��;]eri/1.8/system/REXML/Validation/Interleave/matches%3f-i.yamlnu�[���PK7}[����6�fri/1.8/system/REXML/Validation/Interleave/reset-i.yamlnu�[���PK7}[u���1�gri/1.8/system/REXML/Validation/Ref/inspect-i.yamlnu�[���PK7}[�����-�hri/1.8/system/REXML/Validation/Ref/new-c.yamlnu�[���PK7}[��ۑ��.�iri/1.8/system/REXML/Validation/Ref/to_s-i.yamlnu�[���PK7}[��v�OO1�jri/1.8/system/REXML/Validation/Ref/cdesc-Ref.yamlnu�[���PK8}[��J��9�lri/1.8/system/REXML/Validation/ZeroOrMore/expected-i.yamlnu�[���PK8}[�Wl���5�mri/1.8/system/REXML/Validation/ZeroOrMore/next-i.yamlnu�[���PK8}[>{JM55?�nri/1.8/system/REXML/Validation/ZeroOrMore/cdesc-ZeroOrMore.yamlnu�[���PK8}[�|���=�pri/1.8/system/REXML/Validation/ValidationException/new-c.yamlnu�[���PK8}[���Q�qri/1.8/system/REXML/Validation/ValidationException/cdesc-ValidationException.yamlnu�[���PK8}[E^��8Wsri/1.8/system/REXML/Validation/OneOrMore/expected-i.yamlnu�[���PK8}[���(��=tri/1.8/system/REXML/Validation/OneOrMore/cdesc-OneOrMore.yamlnu�[���PK8}[]��п�4�vri/1.8/system/REXML/Validation/OneOrMore/next-i.yamlnu�[���PK8}[h,���3�wri/1.8/system/REXML/Validation/OneOrMore/new-c.yamlnu�[���PK8}[�7����:�xri/1.8/system/REXML/Validation/OneOrMore/matches%3f-i.yamlnu�[���PK8}[���X��5zri/1.8/system/REXML/Validation/OneOrMore/reset-i.yamlnu�[���PK8}[�b�Ⱥ�3={ri/1.8/system/REXML/Validation/Event/inspect-i.yamlnu�[���PK8}[$n���5Z|ri/1.8/system/REXML/Validation/Event/single%3f-i.yamlnu�[���PK8}[�>���/y}ri/1.8/system/REXML/Validation/Event/new-c.yamlnu�[���PK8}[8�U��3�~ri/1.8/system/REXML/Validation/Event/done%3f-i.yamlnu�[���PK8}[
�����6�ri/1.8/system/REXML/Validation/Event/matches%3f-i.yamlnu�[���PK8}[�S�ל�5�ri/1.8/system/REXML/Validation/Event/cdesc-Event.yamlnu�[���PK8}[��*��0�ri/1.8/system/REXML/Validation/Event/to_s-i.yamlnu�[���PK8}[-=j��2��ri/1.8/system/REXML/Validation/Event/%3d%3d-i.yamlnu�[���PK8}[AAn ��)�ri/1.8/system/REXML/Child/document-i.yamlnu�[���PK8}[T	Q��*
�ri/1.8/system/REXML/Child/parent%3d-i.yamlnu�[���PK8}[�Q���-�ri/1.8/system/REXML/Child/replace_with-i.yamlnu�[���PK8}[Ct]rr')�ri/1.8/system/REXML/Child/remove-i.yamlnu�[���PK8}[��M�$�ri/1.8/system/REXML/Child/new-c.yamlnu�[���PK9}[�Hw�{{*d�ri/1.8/system/REXML/Child/cdesc-Child.yamlnu�[���PK9}[d�'**49�ri/1.8/system/REXML/Child/previous_sibling%3d-i.yamlnu�[���PK9}[梊�0Ǘri/1.8/system/REXML/Child/next_sibling%3d-i.yamlnu�[���PK9}[��8���&B�ri/1.8/system/REXML/Child/bytes-i.yamlnu�[���PK9}[��_YY4��ri/1.8/system/REXML/SourceFactory/create_from-c.yamlnu�[���PK9}[q�II:E�ri/1.8/system/REXML/SourceFactory/cdesc-SourceFactory.yamlnu�[���PK9}[�z���.��ri/1.8/system/REXML/XPathParser/compare-i.yamlnu�[���PK9}[-��\��8�ri/1.8/system/REXML/XPathParser/preceding_node_of-i.yamlnu�[���PK9}[.=A��BJ�ri/1.8/system/REXML/XPathParser/equality_relational_compare-i.yamlnu�[���PK:}[�i�$��0��ri/1.8/system/REXML/XPathParser/predicate-i.yamlnu�[���PK:}[��샽�,Σri/1.8/system/REXML/XPathParser/parse-i.yamlnu�[���PK:}[%Lr��9�ri/1.8/system/REXML/XPathParser/descendant_or_self-i.yamlnu�[���PK:}[W�!���8G�ri/1.8/system/REXML/XPathParser/following_node_of-i.yamlnu�[���PK:}[Ƽ�p��,~�ri/1.8/system/REXML/XPathParser/match-i.yamlnu�[���PK:}[|�T660��ri/1.8/system/REXML/XPathParser/preceding-i.yamlnu�[���PK:}[/��]��*5�ri/1.8/system/REXML/XPathParser/new-c.yamlnu�[���PK:}[��/��0<�ri/1.8/system/REXML/XPathParser/following-i.yamlnu�[���PK:}[V٨3��,[�ri/1.8/system/REXML/XPathParser/first-i.yamlnu�[���PK:}[�dD#��+u�ri/1.8/system/REXML/XPathParser/norm-i.yamlnu�[���PK:}[LP"���.��ri/1.8/system/REXML/XPathParser/recurse-i.yamlnu�[���PK:}[_��4��ri/1.8/system/REXML/XPathParser/namespaces%3d-i.yamlnu�[���PK:}[���O��5�ri/1.8/system/REXML/XPathParser/document_order-i.yamlnu�[���PK:}[����,�ri/1.8/system/REXML/XPathParser/d_o_s-i.yamlnu�[���PK:}[������+6�ri/1.8/system/REXML/XPathParser/expr-i.yamlnu�[���PK:}[��0��6b�ri/1.8/system/REXML/XPathParser/cdesc-XPathParser.yamlnu�[���PK:}[����0a�ri/1.8/system/REXML/XPathParser/get_first-i.yamlnu�[���PK:}[�,���8��ri/1.8/system/REXML/XPathParser/next_sibling_node-i.yamlnu�[���PK;}[O�D���4��ri/1.8/system/REXML/XPathParser/get_namespace-i.yamlnu�[���PK;}[��U5��3�ri/1.8/system/REXML/XPathParser/variables%3d-i.yamlnu�[���PK;}[ƒ[���0'�ri/1.8/system/REXML/XPathParser/%5b%5d%3d-i.yamlnu�[���PK;}[�I�996K�ri/1.8/system/REXML/entity_expansion_text_limit-c.yamlnu�[���PK;}[�T�311$��ri/1.8/system/REXML/CData/new-c.yamlnu�[���PK;}[|�Qe��*o�ri/1.8/system/REXML/CData/cdesc-CData.yamlnu�[���PK;}[��[&J�ri/1.8/system/REXML/CData/write-i.yamlnu�[���PK;}[wz�l��%��ri/1.8/system/REXML/CData/to_s-i.yamlnu�[���PK;}[>Z\��&��ri/1.8/system/REXML/CData/clone-i.yamlnu�[���PK;}[��A��&��ri/1.8/system/REXML/CData/value-i.yamlnu�[���PK;}[��z���1��ri/1.8/system/REXML/ParseException/context-i.yamlnu�[���PK;}[	����.��ri/1.8/system/REXML/ParseException/line-i.yamlnu�[���PK;}[IJ���2��ri/1.8/system/REXML/ParseException/position-i.yamlnu�[���PK;}[�8���-��ri/1.8/system/REXML/ParseException/new-c.yamlnu�[���PK;}[��u��.2�ri/1.8/system/REXML/ParseException/to_s-i.yamlnu�[���PK;}[A��T��<A�ri/1.8/system/REXML/ParseException/cdesc-ParseException.yamlnu�[���PK;}[�A���&>�ri/1.8/system/REXML/DTD/cdesc-DTD.yamlnu�[���PK;}[6W=�vv:H�ri/1.8/system/REXML/DTD/ElementDecl/cdesc-ElementDecl.yamlnu�[���PK;}[��H�.(�ri/1.8/system/REXML/DTD/ElementDecl/new-c.yamlnu�[���PK;}[G���6��ri/1.8/system/REXML/DTD/EntityDecl/parse_source-c.yamlnu�[���PK;}[�"��**-��ri/1.8/system/REXML/DTD/EntityDecl/new-c.yamlnu�[���PK;}[�t��/`�ri/1.8/system/REXML/DTD/EntityDecl/write-i.yamlnu�[���PK;}[-�S5��.��ri/1.8/system/REXML/DTD/EntityDecl/to_s-i.yamlnu�[���PK;}[+�--8��ri/1.8/system/REXML/DTD/EntityDecl/cdesc-EntityDecl.yamlnu�[���PK;}[��A���:(�ri/1.8/system/REXML/DTD/AttlistDecl/cdesc-AttlistDecl.yamlnu�[���PK;}[Z|lm,,<\�ri/1.8/system/REXML/DTD/NotationDecl/cdesc-NotationDecl.yamlnu�[���PK;}[�yo_��8�ri/1.8/system/REXML/DTD/NotationDecl/parse_source-c.yamlnu�[���PK;}[���m��/0�ri/1.8/system/REXML/DTD/NotationDecl/new-c.yamlnu�[���PK;}[�X��1D�ri/1.8/system/REXML/DTD/NotationDecl/write-i.yamlnu�[���PK;}[.g!���0k�ri/1.8/system/REXML/DTD/NotationDecl/to_s-i.yamlnu�[���PK;}[J�����+�ri/1.8/system/REXML/DTD/Parser/parse-c.yamlnu�[���PK;}[�v�))0��ri/1.8/system/REXML/DTD/Parser/cdesc-Parser.yamlnu�[���PK;}[C�H�

2�ri/1.8/system/REXML/DTD/Parser/parse_helper-c.yamlnu�[���PK;}[�M3���6��ri/1.8/system/REXML/ElementDecl/cdesc-ElementDecl.yamlnu�[���PK;}[kR���*�ri/1.8/system/REXML/ElementDecl/new-c.yamlnu�[���PK;}[�ʱ��0�ri/1.8/system/REXML/IOSource/cdesc-IOSource.yamlnu�[���PK;}[��o���,ri/1.8/system/REXML/IOSource/empty%3f-i.yamlnu�[���PK;}[�E�0ri/1.8/system/REXML/IOSource/current_line-i.yamlnu�[���PK;}[|H��(xri/1.8/system/REXML/IOSource/read-i.yamlnu�[���PK;}[��C���,{ri/1.8/system/REXML/IOSource/position-i.yamlnu�[���PK;}[�Wq��+�	ri/1.8/system/REXML/IOSource/consume-i.yamlnu�[���PK;}[�T���)�
ri/1.8/system/REXML/IOSource/match-i.yamlnu�[���PK;}[�>ɞ��(�ri/1.8/system/REXML/IOSource/scan-i.yamlnu�[���PK;}[�P|H

'�ri/1.8/system/REXML/IOSource/new-c.yamlnu�[���PK;}["F
*��24ri/1.8/system/REXML/Attribute/cdesc-Attribute.yamlnu�[���PK;}[�m*���+Yri/1.8/system/REXML/Attribute/prefix-i.yamlnu�[���PK;}[���.�ri/1.8/system/REXML/Attribute/namespace-i.yamlnu�[���PK;}[�/�

)�ri/1.8/system/REXML/Attribute/hash-i.yamlnu�[���PK;}[�S6�zz/Bri/1.8/system/REXML/Attribute/element%3d-i.yamlnu�[���PK;}[mG�jj+ri/1.8/system/REXML/Attribute/remove-i.yamlnu�[���PK;}[�\ಲ�,�ri/1.8/system/REXML/Attribute/inspect-i.yamlnu�[���PK;}[����(� ri/1.8/system/REXML/Attribute/new-c.yamlnu�[���PK;}[��\v��.�&ri/1.8/system/REXML/Attribute/node_type-i.yamlnu�[���PK;}['ñ,,*�'ri/1.8/system/REXML/Attribute/write-i.yamlnu�[���PK;}[�J�)j)ri/1.8/system/REXML/Attribute/to_s-i.yamlnu�[���PK;}[ý~*+++�*ri/1.8/system/REXML/Attribute/%3d%3d-i.yamlnu�[���PK;}[�J����*M,ri/1.8/system/REXML/Attribute/clone-i.yamlnu�[���PK<}[��l�.�-ri/1.8/system/REXML/Attribute/to_string-i.yamlnu�[���PK<}[S�	��*�/ri/1.8/system/REXML/Attribute/xpath-i.yamlnu�[���PK<}[1�Q799*1ri/1.8/system/REXML/Attribute/value-i.yamlnu�[���PK<}[Jx!ͨ�.�2ri/1.8/system/REXML/Entity/unnormalized-i.yamlnu�[���PK<}[�r�nn%�4ri/1.8/system/REXML/Entity/new-c.yamlnu�[���PK<}[O�sFF,c8ri/1.8/system/REXML/Entity/matches%3f-c.yamlnu�[���PK<}[ERoo':ri/1.8/system/REXML/Entity/write-i.yamlnu�[���PK<}[K�8�bb,�<ri/1.8/system/REXML/Entity/normalized-i.yamlnu�[���PK<}[�?��&�>ri/1.8/system/REXML/Entity/to_s-i.yamlnu�[���PK<}[����	�	,�?ri/1.8/system/REXML/Entity/cdesc-Entity.yamlnu�[���PK<}[�fy��'3Jri/1.8/system/REXML/Entity/value-i.yamlnu�[���PK<}[!�"660HMri/1.8/system/REXML/StreamListener/entity-i.yamlnu�[���PK<}[7�Z�jj1�Nri/1.8/system/REXML/StreamListener/tag_end-i.yamlnu�[���PK<}[�9�׆�4�Pri/1.8/system/REXML/StreamListener/entitydecl-i.yamlnu�[���PK<}[�����1�Wri/1.8/system/REXML/StreamListener/doctype-i.yamlnu�[���PK<}[(o\�//5�Zri/1.8/system/REXML/StreamListener/attlistdecl-i.yamlnu�[���PK<}[Q(331&]ri/1.8/system/REXML/StreamListener/xmldecl-i.yamlnu�[���PK<}[��5�_ri/1.8/system/REXML/StreamListener/elementdecl-i.yamlnu�[���PK<}[~����5 ari/1.8/system/REXML/StreamListener/instruction-i.yamlnu�[���PK<}[EnX;;/Vcri/1.8/system/REXML/StreamListener/cdata-i.yamlnu�[���PK<}[W�{�..1�dri/1.8/system/REXML/StreamListener/comment-i.yamlnu�[���PK<}[lv,Õ�<fri/1.8/system/REXML/StreamListener/cdesc-StreamListener.yamlnu�[���PK<}[R��6�kri/1.8/system/REXML/StreamListener/notationdecl-i.yamlnu�[���PK<}[���Z5�lri/1.8/system/REXML/StreamListener/doctype_end-i.yamlnu�[���PK<}[�P�##.Rnri/1.8/system/REXML/StreamListener/text-i.yamlnu�[���PK<}[�,Mx@@3�ori/1.8/system/REXML/StreamListener/tag_start-i.yamlnu�[���PK<}[l�u	��*vrri/1.8/system/REXML/QuickPath/first-c.yamlnu�[���PK<}[��\/��2�sri/1.8/system/REXML/QuickPath/cdesc-QuickPath.yamlnu�[���PK<}[�`]���/�wri/1.8/system/REXML/QuickPath/parse_args-c.yamlnu�[���PK<}[3�{��.�xri/1.8/system/REXML/QuickPath/attribute-c.yamlnu�[���PK<}[Wz*/��(�yri/1.8/system/REXML/QuickPath/axe-c.yamlnu�[���PK<}[d�:��+�zri/1.8/system/REXML/QuickPath/filter-c.yamlnu�[���PK<}[n�����.�|ri/1.8/system/REXML/QuickPath/predicate-c.yamlnu�[���PK<}[�-����3ρri/1.8/system/REXML/QuickPath/method_missing-c.yamlnu�[���PK<}[�¸|��-��ri/1.8/system/REXML/QuickPath/function-c.yamlnu�[���PK<}[5�b���*%�ri/1.8/system/REXML/QuickPath/match-c.yamlnu�[���PK<}[������)Q�ri/1.8/system/REXML/QuickPath/each-c.yamlnu�[���PK<}[$�ڬ�)��ri/1.8/system/REXML/QuickPath/name-c.yamlnu�[���PK<}[-�����,��ri/1.8/system/REXML/Output/cdesc-Output.yamlnu�[���PK=}[`D��%��ri/1.8/system/REXML/Output/new-c.yamlnu�[���PK=}[�G���(��ri/1.8/system/REXML/Output/%3c%3c-i.yamlnu�[���PK=}[M=���&��ri/1.8/system/REXML/Output/to_s-i.yamlnu�[���PK=}[%YV���4��ri/1.8/system/REXML/Parsers/BaseParser/entity-i.yamlnu�[���PK=}[�$|6�ri/1.8/system/REXML/Parsers/BaseParser/empty%3f-i.yamlnu�[���PK=}[�.Pb��7W�ri/1.8/system/REXML/Parsers/BaseParser/stream%3d-i.yamlnu�[���PK=}[�1��yy2��ri/1.8/system/REXML/Parsers/BaseParser/peek-i.yamlnu�[���PK=}[�����6]�ri/1.8/system/REXML/Parsers/BaseParser/position-i.yamlnu�[���PK=}[p	 ���:��ri/1.8/system/REXML/Parsers/BaseParser/add_listener-i.yamlnu�[���PK=}[��y=""<��ri/1.8/system/REXML/Parsers/BaseParser/cdesc-BaseParser.yamlnu�[���PK=}[Q56�**72�ri/1.8/system/REXML/Parsers/BaseParser/normalize-i.yamlnu�[���PK=}[��SCC5ùri/1.8/system/REXML/Parsers/BaseParser/unshift-i.yamlnu�[���PK=}[<#��1k�ri/1.8/system/REXML/Parsers/BaseParser/new-c.yamlnu�[���PK=}[Xm
P**9��ri/1.8/system/REXML/Parsers/BaseParser/unnormalize-i.yamlnu�[���PK=}[>T�##9�ri/1.8/system/REXML/Parsers/BaseParser/has_next%3f-i.yamlnu�[���PK=}[�eΰ2��ri/1.8/system/REXML/Parsers/BaseParser/pull-i.yamlnu�[���PK=}[k�7���9 �ri/1.8/system/REXML/Parsers/XPathParser/parse_args-i.yamlnu�[���PK=}[�R��MMAU�ri/1.8/system/REXML/Parsers/XPathParser/MultiplicativeExpr-i.yamlnu�[���PK=}[�����;�ri/1.8/system/REXML/Parsers/XPathParser/LocationPath-i.yamlnu�[���PK=}[��??;�ri/1.8/system/REXML/Parsers/XPathParser/AdditiveExpr-i.yamlnu�[���PK=}[��JC  6��ri/1.8/system/REXML/Parsers/XPathParser/AndExpr-i.yamlnu�[���PK=}[r��66;5�ri/1.8/system/REXML/Parsers/XPathParser/EqualityExpr-i.yamlnu�[���PK=}[K�k8��ri/1.8/system/REXML/Parsers/XPathParser/get_group-i.yamlnu�[���PK=}[iu��8Y�ri/1.8/system/REXML/Parsers/XPathParser/predicate-i.yamlnu�[���PK=}[�p�3��4��ri/1.8/system/REXML/Parsers/XPathParser/parse-i.yamlnu�[���PK=}[����9��ri/1.8/system/REXML/Parsers/XPathParser/abbreviate-i.yamlnu�[���PK=}[�yN���7��ri/1.8/system/REXML/Parsers/XPathParser/NodeTest-i.yamlnu�[���PK=}[����B�ri/1.8/system/REXML/Parsers/XPathParser/predicate_to_string-i.yamlnu�[���PK=}[��Z�9v�ri/1.8/system/REXML/Parsers/XPathParser/FilterExpr-i.yamlnu�[���PK=}[
D)��:��ri/1.8/system/REXML/Parsers/XPathParser/PrimaryExpr-i.yamlnu�[���PK=}[L�s86�ri/1.8/system/REXML/Parsers/XPathParser/UnionExpr-i.yamlnu�[���PK=}[�V##8��ri/1.8/system/REXML/Parsers/XPathParser/Predicate-i.yamlnu�[���PK@}[�ɫ**;A�ri/1.8/system/REXML/Parsers/XPathParser/FunctionCall-i.yamlnu�[���PK@}[��f�QQ=��ri/1.8/system/REXML/Parsers/XPathParser/RelationalExpr-i.yamlnu�[���PK@}[����<��ri/1.8/system/REXML/Parsers/XPathParser/namespaces%3d-i.yamlnu�[���PK@}[��)��>��ri/1.8/system/REXML/Parsers/XPathParser/cdesc-XPathParser.yamlnu�[���PK@}[2-��82�ri/1.8/system/REXML/Parsers/XPathParser/UnaryExpr-i.yamlnu�[���PK@}[�6�4��5��ri/1.8/system/REXML/Parsers/XPathParser/expand-i.yamlnu�[���PK@}[=�=F��C��ri/1.8/system/REXML/Parsers/XPathParser/RelativeLocationPath-i.yamlnu�[���PK@}[��M�007'�ri/1.8/system/REXML/Parsers/XPathParser/PathExpr-i.yamlnu�[���PK@}[b�u�5��ri/1.8/system/REXML/Parsers/XPathParser/OrExpr-i.yamlnu�[���PK@}[�͡��95�ri/1.8/system/REXML/Parsers/UltraLightParser/parse-i.yamlnu�[���PK@}[��`���@\�ri/1.8/system/REXML/Parsers/UltraLightParser/add_listener-i.yamlnu�[���PK@}[�
i��:��ri/1.8/system/REXML/Parsers/UltraLightParser/rewind-i.yamlnu�[���PK@}[�@]��7�ri/1.8/system/REXML/Parsers/UltraLightParser/new-c.yamlnu�[���PKA}[�t�B��H�ri/1.8/system/REXML/Parsers/UltraLightParser/cdesc-UltraLightParser.yamlnu�[���PKA}[����3�ri/1.8/system/REXML/Parsers/PullEvent/%5b%5d-i.yamlnu�[���PKA}[�!&�;.�ri/1.8/system/REXML/Parsers/PullEvent/instruction%3f-i.yamlnu�[���PKA}[���S;��ri/1.8/system/REXML/Parsers/PullEvent/end_element%3f-i.yamlnu�[���PKA}[�n##7�ri/1.8/system/REXML/Parsers/PullEvent/xmldecl%3f-i.yamlnu�[���PKA}[יs;��ri/1.8/system/REXML/Parsers/PullEvent/elementdecl%3f-i.yamlnu�[���PKB}[f����5	ri/1.8/system/REXML/Parsers/PullEvent/cdata%3f-i.yamlnu�[���PKB}[�
����:fri/1.8/system/REXML/Parsers/PullEvent/entitydecl%3f-i.yamlnu�[���PKB}["�f��4zri/1.8/system/REXML/Parsers/PullEvent/inspect-i.yamlnu�[���PKB}[�����6�ri/1.8/system/REXML/Parsers/PullEvent/entity%3f-i.yamlnu�[���PKB}[p(�ɛ�0�ri/1.8/system/REXML/Parsers/PullEvent/new-c.yamlnu�[���PKB}[�v�Q;�	ri/1.8/system/REXML/Parsers/PullEvent/attlistdecl%3f-i.yamlnu�[���PKB}[�294cri/1.8/system/REXML/Parsers/PullEvent/text%3f-i.yamlnu�[���PKB}[/Qn�=�ri/1.8/system/REXML/Parsers/PullEvent/start_element%3f-i.yamlnu�[���PKB}[,�r��:eri/1.8/system/REXML/Parsers/PullEvent/cdesc-PullEvent.yamlnu�[���PKB}[}d<�ri/1.8/system/REXML/Parsers/PullEvent/notationdecl%3f-i.yamlnu�[���PKB}[,��й�5�ri/1.8/system/REXML/Parsers/PullEvent/error%3f-i.yamlnu�[���PKB}[��,��7ri/1.8/system/REXML/Parsers/PullEvent/comment%3f-i.yamlnu�[���PKB}[o��**7}ri/1.8/system/REXML/Parsers/PullEvent/doctype%3f-i.yamlnu�[���PKB}[ik��7ri/1.8/system/REXML/Parsers/PullEvent/event_type-i.yamlnu�[���PKB}[wj���46ri/1.8/system/REXML/Parsers/LightParser/parse-i.yamlnu�[���PKB}[n����;Sri/1.8/system/REXML/Parsers/LightParser/add_listener-i.yamlnu�[���PKB}[)�IĻ�5�ri/1.8/system/REXML/Parsers/LightParser/rewind-i.yamlnu�[���PKB}[�S��2�ri/1.8/system/REXML/Parsers/LightParser/new-c.yamlnu�[���PKB}[*��$��>�ri/1.8/system/REXML/Parsers/LightParser/cdesc-LightParser.yamlnu�[���PKB}[P©��.�!ri/1.8/system/REXML/Parsers/cdesc-Parsers.yamlnu�[���PKC}[-����4�"ri/1.8/system/REXML/Parsers/SAX2Parser/deafen-i.yamlnu�[���PKC}[_(��4$ri/1.8/system/REXML/Parsers/SAX2Parser/source-i.yamlnu�[���PKC}[Z�Yи�38%ri/1.8/system/REXML/Parsers/SAX2Parser/parse-i.yamlnu�[���PKC}[����%%<S&ri/1.8/system/REXML/Parsers/SAX2Parser/cdesc-SAX2Parser.yamlnu�[���PKC}['�ւ��:�)ri/1.8/system/REXML/Parsers/SAX2Parser/add_listener-i.yamlnu�[���PKC}[ru���1+ri/1.8/system/REXML/Parsers/SAX2Parser/add-i.yamlnu�[���PKC}[�*%��1:,ri/1.8/system/REXML/Parsers/SAX2Parser/new-c.yamlnu�[���PKC}[_c�Z��;U-ri/1.8/system/REXML/Parsers/SAX2Parser/get_listeners-i.yamlnu�[���PKC}[<k�j��4�.ri/1.8/system/REXML/Parsers/SAX2Parser/handle-i.yamlnu�[���PKC}[��4�/ri/1.8/system/REXML/Parsers/SAX2Parser/listen-i.yamlnu�[���PKC}[������;C7ri/1.8/system/REXML/Parsers/SAX2Parser/get_namespace-i.yamlnu�[���PKD}[C�r�>>78ri/1.8/system/REXML/Parsers/SAX2Parser/get_procs-i.yamlnu�[���PKD}[x2dc��2$:ri/1.8/system/REXML/Parsers/PullParser/each-i.yamlnu�[���PKD}["bz_��2W;ri/1.8/system/REXML/Parsers/PullParser/peek-i.yamlnu�[���PKE}[jJ�$��<v<ri/1.8/system/REXML/Parsers/PullParser/cdesc-PullParser.yamlnu�[���PKE}[�0�>��:�Bri/1.8/system/REXML/Parsers/PullParser/add_listener-i.yamlnu�[���PKE}[t����5�Cri/1.8/system/REXML/Parsers/PullParser/unshift-i.yamlnu�[���PKE}[N����1Eri/1.8/system/REXML/Parsers/PullParser/new-c.yamlnu�[���PKF}[��ɪ��2"Fri/1.8/system/REXML/Parsers/PullParser/pull-i.yamlnu�[���PKF}[��Ϻ�5:Gri/1.8/system/REXML/Parsers/StreamParser/parse-i.yamlnu�[���PKF}[(Sյ��<YHri/1.8/system/REXML/Parsers/StreamParser/add_listener-i.yamlnu�[���PKF}[�`39��3�Iri/1.8/system/REXML/Parsers/StreamParser/new-c.yamlnu�[���PKF}[�-�dd@�Jri/1.8/system/REXML/Parsers/StreamParser/cdesc-StreamParser.yamlnu�[���PKF}[���``<�Lri/1.8/system/REXML/Parsers/TreeParser/cdesc-TreeParser.yamlnu�[���PKF}[�}����3`Nri/1.8/system/REXML/Parsers/TreeParser/parse-i.yamlnu�[���PKG}[N���:{Ori/1.8/system/REXML/Parsers/TreeParser/add_listener-i.yamlnu�[���PKG}[?�hN��1�Pri/1.8/system/REXML/Parsers/TreeParser/new-c.yamlnu�[���PKH}[�d҃��*�Qri/1.8/system/REXML/DocType/context-i.yamlnu�[���PKH}[|���ii)�Rri/1.8/system/REXML/DocType/system-i.yamlnu�[���PKI}[ߩcY��)�Tri/1.8/system/REXML/DocType/entity-i.yamlnu�[���PKI}[�����&�Uri/1.8/system/REXML/DocType/add-i.yamlnu�[���PKI}[eҦ��0�Vri/1.8/system/REXML/DocType/attributes_of-i.yamlnu�[���PKJ}[*&_���&�Wri/1.8/system/REXML/DocType/new-c.yamlnu�[���PKJ}[��8|	|	.8[ri/1.8/system/REXML/DocType/cdesc-DocType.yamlnu�[���PKK}[��3M��,eri/1.8/system/REXML/DocType/node_type-i.yamlnu�[���PKK}[�k�+��("fri/1.8/system/REXML/DocType/write-i.yamlnu�[���PKL}[��)���,Xiri/1.8/system/REXML/DocType/notations-i.yamlnu�[���PKL}[���jj)rkri/1.8/system/REXML/DocType/public-i.yamlnu�[���PKL}[jg�t��(5mri/1.8/system/REXML/DocType/clone-i.yamlnu�[���PKM}[����/9nri/1.8/system/REXML/DocType/attribute_of-i.yamlnu�[���PKN}[Ԟ����+dori/1.8/system/REXML/DocType/notation-i.yamlnu�[���PKN}[�'B/Fqri/1.8/system/REXML/DocType/strip_quotes-i.yamlnu�[���PKO}[�Ȉ���7�rri/1.8/system/REXML/Formatters/Pretty/write_text-i.yamlnu�[���PKP}[�㟪��8�sri/1.8/system/REXML/Formatters/Pretty/indent_text-i.yamlnu�[���PKP}[�<s��0Ouri/1.8/system/REXML/Formatters/Pretty/new-c.yamlnu�[���PKQ}[ǞN5��1Myri/1.8/system/REXML/Formatters/Pretty/wrap-i.yamlnu�[���PKQ}[Ѷ�	��:qzri/1.8/system/REXML/Formatters/Pretty/write_element-i.yamlnu�[���PKR}[��?��7�{ri/1.8/system/REXML/Formatters/Pretty/cdesc-Pretty.yamlnu�[���PKR}[X%u���;ۀri/1.8/system/REXML/Formatters/Pretty/write_document-i.yamlnu�[���PKR}[s��~��8 �ri/1.8/system/REXML/Formatters/Pretty/write_cdata-i.yamlnu�[���PKS}[�&V���:[�ri/1.8/system/REXML/Formatters/Pretty/write_comment-i.yamlnu�[���PKS}[x��x��;��ri/1.8/system/REXML/Formatters/Transitive/write_text-i.yamlnu�[���PKS}[_p)%��4݅ri/1.8/system/REXML/Formatters/Transitive/new-c.yamlnu�[���PKS}[j3����>�ri/1.8/system/REXML/Formatters/Transitive/write_element-i.yamlnu�[���PKS}[���`��?Q�ri/1.8/system/REXML/Formatters/Transitive/cdesc-Transitive.yamlnu�[���PKS}[%���4��ri/1.8/system/REXML/Formatters/cdesc-Formatters.yamlnu�[���PKT}[B��"��8��ri/1.8/system/REXML/Formatters/Default/write_text-i.yamlnu�[���PKT}[�[D�!!1�ri/1.8/system/REXML/Formatters/Default/new-c.yamlnu�[���PKT}[W��E883f�ri/1.8/system/REXML/Formatters/Default/write-i.yamlnu�[���PKT}[ps_.��?�ri/1.8/system/REXML/Formatters/Default/write_instruction-i.yamlnu�[���PKT}[�=���;Q�ri/1.8/system/REXML/Formatters/Default/write_element-i.yamlnu�[���PKT}[�&�vv9��ri/1.8/system/REXML/Formatters/Default/cdesc-Default.yamlnu�[���PKT}[���J��<t�ri/1.8/system/REXML/Formatters/Default/write_document-i.yamlnu�[���PKT}[�ˋ{��9��ri/1.8/system/REXML/Formatters/Default/write_cdata-i.yamlnu�[���PKT}[�Gm���;��ri/1.8/system/REXML/Formatters/Default/write_comment-i.yamlnu�[���PKT}[���%%.=�ri/1.8/system/REXML/SyncEnumerator/size-i.yamlnu�[���PKT}[lC2.��ri/1.8/system/REXML/SyncEnumerator/each-i.yamlnu�[���PKT}[-L#8��<;�ri/1.8/system/REXML/SyncEnumerator/cdesc-SyncEnumerator.yamlnu�[���PKT}[��H!))-a�ri/1.8/system/REXML/SyncEnumerator/new-c.yamlnu�[���PKT}[fa.�))0�ri/1.8/system/REXML/SyncEnumerator/length-i.yamlnu�[���PKT}[����*p�ri/1.8/system/REXML/XMLDecl/dowrite-i.yamlnu�[���PKT}[�n���*z�ri/1.8/system/REXML/XMLDecl/content-i.yamlnu�[���PKT}[S��\��*��ri/1.8/system/REXML/XMLDecl/xmldecl-i.yamlnu�[���PKT}[�BD.��ri/1.8/system/REXML/XMLDecl/cdesc-XMLDecl.yamlnu�[���PKT}[������*)�ri/1.8/system/REXML/XMLDecl/inspect-i.yamlnu�[���PKT}[�GuN��&3�ri/1.8/system/REXML/XMLDecl/new-c.yamlnu�[���PKT}[o�D���*f�ri/1.8/system/REXML/XMLDecl/default-c.yamlnu�[���PKT}[��j���,��ri/1.8/system/REXML/XMLDecl/node_type-i.yamlnu�[���PKT}[�6�&&(��ri/1.8/system/REXML/XMLDecl/write-i.yamlnu�[���PKT}[3�G,��);�ri/1.8/system/REXML/XMLDecl/%3d%3d-i.yamlnu�[���PKT}[=�Ĭ�(A�ri/1.8/system/REXML/XMLDecl/clone-i.yamlnu�[���PKT}[�c��.E�ri/1.8/system/REXML/XMLDecl/encoding%3d-i.yamlnu�[���PKT}[�&r��*\�ri/1.8/system/REXML/XMLDecl/nowrite-i.yamlnu�[���PKT}[����,f�ri/1.8/system/REXML/Namespace/name%3d-i.yamlnu�[���PKT}[��'Z==8��ri/1.8/system/REXML/Namespace/fully_expanded_name-i.yamlnu�[���PKT}[��0c�ri/1.8/system/REXML/Namespace/has_name%3f-i.yamlnu�[���PKT}[���2ֿri/1.8/system/REXML/Namespace/cdesc-Namespace.yamlnu�[���PKT}[Xݭ���(9�ri/1.8/system/REXML/Elements/size-i.yamlnu�[���PKT}[�Y���*��ri/1.8/system/REXML/Elements/%5b%5d-i.yamlnu�[���PKT}[�m)--,��ri/1.8/system/REXML/Elements/empty%3f-i.yamlnu�[���PKT}[�*^��(�ri/1.8/system/REXML/Elements/each-i.yamlnu�[���PKT}[�fc]		(n�ri/1.8/system/REXML/Elements/to_a-i.yamlnu�[���PKT}[��.��ri/1.8/system/REXML/Elements/literalize-i.yamlnu�[���PKT}[Ҋ�8��*F�ri/1.8/system/REXML/Elements/delete-i.yamlnu�[���PKT}[�����+��ri/1.8/system/REXML/Elements/collect-i.yamlnu�[���PKT}[�y`���)��ri/1.8/system/REXML/Elements/index-i.yamlnu�[���PKT}[�pE4II'��ri/1.8/system/REXML/Elements/add-i.yamlnu�[���PKT}[e�p�jj's�ri/1.8/system/REXML/Elements/new-c.yamlnu�[���PKT}[�a5��*4�ri/1.8/system/REXML/Elements/%3c%3c-i.yamlnu�[���PKT}[ON��0w�ri/1.8/system/REXML/Elements/cdesc-Elements.yamlnu�[���PKT}[lj>���*��ri/1.8/system/REXML/Elements/inject-i.yamlnu�[���PKT}[G�+dll-��ri/1.8/system/REXML/Elements/%5b%5d%3d-i.yamlnu�[���PKT}[����...��ri/1.8/system/REXML/Elements/delete_all-i.yamlnu�[���PKT}[;�?��)T�ri/1.8/system/REXML/Encoding/apply-c.yamlnu�[���PKU}[��m���3b�ri/1.8/system/REXML/Encoding/encoding_method-c.yamlnu�[���PKU}[7.��0��ri/1.8/system/REXML/Encoding/encode_ascii-i.yamlnu�[���PKU}[��5��0�ri/1.8/system/REXML/Encoding/decode_unile-i.yamlnu�[���PKU}[2u)��,�ri/1.8/system/REXML/Encoding/register-c.yamlnu�[���PKU}[�)�R��/�ri/1.8/system/REXML/Encoding/encode_utf8-i.yamlnu�[���PKU}[�����09�ri/1.8/system/REXML/Encoding/decode_eucjp-i.yamlnu�[���PKU}[��q���0W�ri/1.8/system/REXML/Encoding/decode_ascii-i.yamlnu�[���PKU}[S-�B��/��ri/1.8/system/REXML/Encoding/encode_sjis-i.yamlnu�[���PKU}[5�t��4�ri/1.8/system/REXML/Encoding/from_iso_8859_15-i.yamlnu�[���PKU}[s])s��/(ri/1.8/system/REXML/Encoding/decode_utf8-i.yamlnu�[���PKU}[�C�T��0Cri/1.8/system/REXML/Encoding/encode_unile-i.yamlnu�[���PKU}[f��0eri/1.8/system/REXML/Encoding/decode_utf16-i.yamlnu�[���PKU}[v\���0�ri/1.8/system/REXML/Encoding/encode_utf16-i.yamlnu�[���PKU}[*�fc��/�ri/1.8/system/REXML/Encoding/decode_sjis-i.yamlnu�[���PKU}[�Y� ��0�ri/1.8/system/REXML/Encoding/decode_iconv-i.yamlnu�[���PKU}[p>T���0�ri/1.8/system/REXML/Encoding/encode_eucjp-i.yamlnu�[���PKU}[n�,��1
ri/1.8/system/REXML/Encoding/decode_cp1252-i.yamlnu�[���PKU}[-����0Vri/1.8/system/REXML/Encoding/encode_iconv-i.yamlnu�[���PKU}[S����2xri/1.8/system/REXML/Encoding/to_iso_8859_15-i.yamlnu�[���PKU}[CB
���1�
ri/1.8/system/REXML/Encoding/encode_cp1252-i.yamlnu�[���PKU}[����	�	03ri/1.8/system/REXML/Encoding/cdesc-Encoding.yamlnu�[���PKU}[N�Ҟ��2,ri/1.8/system/REXML/Encoding/check_encoding-i.yamlnu�[���PKU}[{�Tݺ�/Pri/1.8/system/REXML/Encoding/encoding%3d-i.yamlnu�[���PKU}[<�����2iri/1.8/system/REXML/Light/Node/namespace%3d-i.yamlnu�[���PKU}[��<��*�ri/1.8/system/REXML/Light/Node/size-i.yamlnu�[���PKU}[C_]��,�ri/1.8/system/REXML/Light/Node/%5b%5d-i.yamlnu�[���PKU}[>�,`��,�ri/1.8/system/REXML/Light/Node/%3d%7e-i.yamlnu�[���PKU}[���*�ri/1.8/system/REXML/Light/Node/each-i.yamlnu�[���PKU}[�&m���2� ri/1.8/system/REXML/Light/Node/namespace_of-i.yamlnu�[���PKU}[e���,"ri/1.8/system/REXML/Light/Node/prefix-i.yamlnu�[���PKU}[u����/;#ri/1.8/system/REXML/Light/Node/namespace-i.yamlnu�[���PKU}[�Y���/c$ri/1.8/system/REXML/Light/Node/parent%3d-i.yamlnu�[���PKU}[JMf-��*|%ri/1.8/system/REXML/Light/Node/root-i.yamlnu�[���PKU}[�I;��-�&ri/1.8/system/REXML/Light/Node/name%3d-i.yamlnu�[���PKU}[�F�S��1�'ri/1.8/system/REXML/Light/Node/has_name%3f-i.yamlnu�[���PKU}[&Ed���/�(ri/1.8/system/REXML/Light/Node/prefix_of-i.yamlnu�[���PKU}[�6����)�)ri/1.8/system/REXML/Light/Node/new-c.yamlnu�[���PKU}[���C��-F+ri/1.8/system/REXML/Light/Node/text%3d-i.yamlnu�[���PKU}[���j��.X,ri/1.8/system/REXML/Light/Node/children-i.yamlnu�[���PKU}[3;���/l-ri/1.8/system/REXML/Light/Node/node_type-i.yamlnu�[���PKU}[nğ$$.�.ri/1.8/system/REXML/Light/Node/cdesc-Node.yamlnu�[���PKU}[����,6ri/1.8/system/REXML/Light/Node/%3c%3c-i.yamlnu�[���PKU}[�jvͺ�0D8ri/1.8/system/REXML/Light/Node/local_name-i.yamlnu�[���PKU}[Ǥ���*^9ri/1.8/system/REXML/Light/Node/to_s-i.yamlnu�[���PKU}[�%���*f:ri/1.8/system/REXML/Light/Node/name-i.yamlnu�[���PKU}[8N����/n;ri/1.8/system/REXML/Light/Node/namesplit-i.yamlnu�[���PKU}[rȌn

/�<ri/1.8/system/REXML/Light/Node/%5b%5d%3d-i.yamlnu�[���PKU}[�!�_��3�=ri/1.8/system/REXML/Light/Node/local_name%3d-i.yamlnu�[���PKU}[�����,?ri/1.8/system/REXML/Light/Node/parent-i.yamlnu�[���PKU}[
��M��*&@ri/1.8/system/REXML/Light/cdesc-Light.yamlnu�[���PKU}[m΀���08Ari/1.8/system/REXML/Functions/starts_with-c.yamlnu�[���PKU}[�]���1�Bri/1.8/system/REXML/Functions/string_value-c.yamlnu�[���PKU}[��ʴ��2�Cri/1.8/system/REXML/Functions/string_length-c.yamlnu�[���PKU}[A���*Eri/1.8/system/REXML/Functions/false-c.yamlnu�[���PKV}[\B G��/DFri/1.8/system/REXML/Functions/local_name-c.yamlnu�[���PKV}[��&��+�Gri/1.8/system/REXML/Functions/number-c.yamlnu�[���PKV}[/tx���*�Kri/1.8/system/REXML/Functions/count-c.yamlnu�[���PKV}[t��y��+�Lri/1.8/system/REXML/Functions/string-c.yamlnu�[���PKV}[��_

4Uri/1.8/system/REXML/Functions/substring_after-c.yamlnu�[���PKV}[%�R���)�Vri/1.8/system/REXML/Functions/last-c.yamlnu�[���PKV}[d7j�.�Wri/1.8/system/REXML/Functions/translate-c.yamlnu�[���PKV}[�/)$��.�Xri/1.8/system/REXML/Functions/variables-c.yamlnu�[���PKV}[@�Z���*
Zri/1.8/system/REXML/Functions/floor-c.yamlnu�[���PKV}[�����+[ri/1.8/system/REXML/Functions/concat-c.yamlnu�[���PKV}[������,\\ri/1.8/system/REXML/Functions/boolean-c.yamlnu�[���PKV}[ͼ�{Z
Z
2�]ri/1.8/system/REXML/Functions/cdesc-Functions.yamlnu�[���PKV}[\')(ll._hri/1.8/system/REXML/Functions/substring-c.yamlnu�[���PKV}[��M���()jri/1.8/system/REXML/Functions/not-c.yamlnu�[���PKV}[tp�t5`kri/1.8/system/REXML/Functions/substring_before-c.yamlnu�[���PKV}[\���)�lri/1.8/system/REXML/Functions/true-c.yamlnu�[���PKV}[�b5G��2nri/1.8/system/REXML/Functions/namespace_uri-c.yamlnu�[���PKV}[�;��60ori/1.8/system/REXML/Functions/namespace_context-c.yamlnu�[���PKV}[��5ǭ�)\pri/1.8/system/REXML/Functions/text-c.yamlnu�[���PKW}[��U���(bqri/1.8/system/REXML/Functions/sum-c.yamlnu�[���PKW}[C�]��*krri/1.8/system/REXML/Functions/round-c.yamlnu�[���PKW}[�����1{sri/1.8/system/REXML/Functions/variables%3d-c.yamlnu�[���PKW}[��qε�-�tri/1.8/system/REXML/Functions/position-c.yamlnu�[���PKW}[IK`���)�uri/1.8/system/REXML/Functions/lang-c.yamlnu�[���PKW}[��/��9�vri/1.8/system/REXML/Functions/namespace_context%3d-c.yamlnu�[���PKW}[�����;xri/1.8/system/REXML/Functions/processing_instruction-c.yamlnu�[���PKW}[PC�O��3Vyri/1.8/system/REXML/Functions/method_missing-c.yamlnu�[���PKW}[��)���,}zri/1.8/system/REXML/Functions/ceiling-c.yamlnu�[���PKW}[)�uA��/�{ri/1.8/system/REXML/Functions/context%3d-c.yamlnu�[���PKW}[�ɔ��5�|ri/1.8/system/REXML/Functions/compare_language-c.yamlnu�[���PKW}[I�'zz2�}ri/1.8/system/REXML/Functions/get_namespace-c.yamlnu�[���PKW}[�,P�'''�ri/1.8/system/REXML/Functions/id-c.yamlnu�[���PKW}[��'��4:�ri/1.8/system/REXML/Functions/normalize_space-c.yamlnu�[���PKW}[�����)��ri/1.8/system/REXML/Functions/name-c.yamlnu�[���PKW}[��E	��-��ri/1.8/system/REXML/Functions/contains-c.yamlnu�[���PKX}[ٻ.PP-�ri/1.8/system/REXML/AttlistDecl/%5b%5d-i.yamlnu�[���PKX}[�U�dd+��ri/1.8/system/REXML/AttlistDecl/each-i.yamlnu�[���PKX}[-���1n�ri/1.8/system/REXML/AttlistDecl/include%3f-i.yamlnu�[���PKX}[����))*Q�ri/1.8/system/REXML/AttlistDecl/new-c.yamlnu�[���PKX}[���0Ԍri/1.8/system/REXML/AttlistDecl/node_type-i.yamlnu�[���PKX}[��n,�ri/1.8/system/REXML/AttlistDecl/write-i.yamlnu�[���PKX}[F�u���6L�ri/1.8/system/REXML/AttlistDecl/cdesc-AttlistDecl.yamlnu�[���PKX}[�
g�8x�ri/1.8/system/REXML/NotationDecl/cdesc-NotationDecl.yamlnu�[���PKX}[GuK���+�ri/1.8/system/REXML/NotationDecl/new-c.yamlnu�[���PKX}[��x��-�ri/1.8/system/REXML/NotationDecl/write-i.yamlnu�[���PKX}[�}���,!�ri/1.8/system/REXML/NotationDecl/to_s-i.yamlnu�[���PKX}[�"�OO,,�ri/1.8/system/REXML/NotationDecl/name-i.yamlnu�[���PKX}[�	�L��6לri/1.8/system/REXML/Instruction/cdesc-Instruction.yamlnu�[���PKX}[�ɑ��.�ri/1.8/system/REXML/Instruction/inspect-i.yamlnu�[���PKX}[�34��*�ri/1.8/system/REXML/Instruction/new-c.yamlnu�[���PKX}[Jf��0;�ri/1.8/system/REXML/Instruction/node_type-i.yamlnu�[���PKX}[����aa,S�ri/1.8/system/REXML/Instruction/write-i.yamlnu�[���PKX}[�N�!WW-�ri/1.8/system/REXML/Instruction/%3d%3d-i.yamlnu�[���PKX}[(
|s��,Īri/1.8/system/REXML/Instruction/clone-i.yamlnu�[���PKX}[�I�.Ыri/1.8/system/REXML/Element/add_element-i.yamlnu�[���PKX}[qfi�DD3:�ri/1.8/system/REXML/Element/delete_attribute-i.yamlnu�[���PKX}[�;��DD+�ri/1.8/system/REXML/Element/document-i.yamlnu�[���PKX}[K\���3��ri/1.8/system/REXML/Element/delete_namespace-i.yamlnu�[���PKX}[��&Ĺri/1.8/system/REXML/Element/raw-i.yamlnu�[���PKX}[������>�ri/1.8/system/REXML/Element/each_element_with_attribute-i.yamlnu�[���PKX}[kV���.�ri/1.8/system/REXML/Element/cdesc-Element.yamlnu�[���PKY}[l�W��-Y�ri/1.8/system/REXML/Element/whitespace-i.yamlnu�[���PKY}[v4�YY/O�ri/1.8/system/REXML/Element/get_elements-i.yamlnu�[���PKY}[�*ޡ�+�ri/1.8/system/REXML/Element/get_text-i.yamlnu�[���PKY}[*�@**,�ri/1.8/system/REXML/Element/namespace-i.yamlnu�[���PKY}[%��330��ri/1.8/system/REXML/Element/add_attribute-i.yamlnu�[���PKY}[�6���-�ri/1.8/system/REXML/Element/namespaces-i.yamlnu�[���PKY}[��./�ri/1.8/system/REXML/Element/has_text%3f-i.yamlnu�[���PKY}[
�����'��ri/1.8/system/REXML/Element/root-i.yamlnu�[���PKY}[)NȮ�1��ri/1.8/system/REXML/Element/add_attributes-i.yamlnu�[���PKY}[�$�v��0��ri/1.8/system/REXML/Element/add_namespace-i.yamlnu�[���PKY}[�u0��(��ri/1.8/system/REXML/Element/texts-i.yamlnu�[���PKY}[�s����*H�ri/1.8/system/REXML/Element/inspect-i.yamlnu�[���PKY}[��g.YY2R�ri/1.8/system/REXML/Element/has_elements%3f-i.yamlnu�[���PKY}[Ͷz�+
�ri/1.8/system/REXML/Element/add_text-i.yamlnu�[���PKY}[u�>��&k�ri/1.8/system/REXML/Element/new-c.yamlnu�[���PKY}[
} ���*��ri/1.8/system/REXML/Element/text%3d-i.yamlnu�[���PKY}[�xF�??3�ri/1.8/system/REXML/Element/previous_element-i.yamlnu�[���PKY}[i�U\9qri/1.8/system/REXML/Element/each_element_with_text-i.yamlnu�[���PKY}[��E��,�
ri/1.8/system/REXML/Element/attribute-i.yamlnu�[���PKY}[g�W��,Ori/1.8/system/REXML/Element/node_type-i.yamlnu�[���PKY}[�m���(_ri/1.8/system/REXML/Element/write-i.yamlnu�[���PKY}[�20884�ri/1.8/system/REXML/Element/has_attributes%3f-i.yamlnu�[���PKY}[s^R)Hri/1.8/system/REXML/Element/cdatas-i.yamlnu�[���PKY}[_<��/�ri/1.8/system/REXML/Element/instructions-i.yamlnu�[���PKY}[�[�g��:ri/1.8/system/REXML/Element/ignore_whitespace_nodes-i.yamlnu�[���PKY}[V��((/Lri/1.8/system/REXML/Element/next_element-i.yamlnu�[���PKY}[/��+�ri/1.8/system/REXML/Element/comments-i.yamlnu�[���PKY}[������(4!ri/1.8/system/REXML/Element/clone-i.yamlnu�[���PKY}[wbR���(Q#ri/1.8/system/REXML/Element/xpath-i.yamlnu�[���PKY}[�e����4U$ri/1.8/system/REXML/Element/__to_xpath_helper-i.yamlnu�[���PKY}[t�+�%ri/1.8/system/REXML/Element/prefixes-i.yamlnu�[���PKY}[��E�'�'ri/1.8/system/REXML/Element/text-i.yamlnu�[���PKY}[�V=��1a,ri/1.8/system/REXML/Element/delete_element-i.yamlnu�[���PKY}[g@�""/i0ri/1.8/system/REXML/Element/each_element-i.yamlnu�[���PKY}[�\�qq6�1ri/1.8/system/REXML/Element/each_with_something-i.yamlnu�[���PKY}[Y��,�3ri/1.8/system/REXML/Element/root_node-i.yamlnu�[���PKY}[M�W9)9ri/1.8/system/REXML/Text/normalize-c.yamlnu�[���PKY}[� ����(�:ri/1.8/system/REXML/Text/empty%3f-i.yamlnu�[���PKY}[٩
�++)�;ri/1.8/system/REXML/Text/%3c%3d%3e-i.yamlnu�[���PKY}[as�	�	(=ri/1.8/system/REXML/Text/cdesc-Text.yamlnu�[���PKY}[�X�IJJ(.Gri/1.8/system/REXML/Text/value%3d-i.yamlnu�[���PKY}['�#���'�Iri/1.8/system/REXML/Text/inspect-i.yamlnu�[���PKY}[s^���+�Jri/1.8/system/REXML/Text/indent_text-i.yamlnu�[���PKY}[�^��
�
#Lri/1.8/system/REXML/Text/new-c.yamlnu�[���PKY}[�\?��7Wri/1.8/system/REXML/Text/write_with_substitution-i.yamlnu�[���PKY}[k%>m��)2Zri/1.8/system/REXML/Text/node_type-i.yamlnu�[���PKZ}[^I.���$<[ri/1.8/system/REXML/Text/wrap-i.yamlnu�[���PKZ}[�C�QQ%V\ri/1.8/system/REXML/Text/write-i.yamlnu�[���PKZ}[���55&�]ri/1.8/system/REXML/Text/%3c%3c-i.yamlnu�[���PKZ}[�h�$�_ri/1.8/system/REXML/Text/to_s-i.yamlnu�[���PKZ}[D�`��%�cri/1.8/system/REXML/Text/clone-i.yamlnu�[���PKZ}[9��z''+�dri/1.8/system/REXML/Text/unnormalize-c.yamlnu�[���PKZ}[7 ����%jfri/1.8/system/REXML/Text/xpath-i.yamlnu�[���PKZ}[�$��&�gri/1.8/system/REXML/Text/expand-c.yamlnu�[���PKZ}[cW����%�hri/1.8/system/REXML/Text/value-i.yamlnu�[���PKZ}[�4�%%6�lri/1.8/system/REXML/Text/read_with_substitution-c.yamlnu�[���PKZ}[����>~nri/1.8/system/Iconv/IllegalSequence/cdesc-IllegalSequence.yamlnu�[���PKZ}[Xa��WW4�pri/1.8/system/Iconv/OutOfRange/cdesc-OutOfRange.yamlnu�[���PKZ}[s�F��erri/1.8/system/Iconv/conv-c.yamlnu�[���PKZ}[�n�ޛ�@htri/1.8/system/Iconv/InvalidCharacter/cdesc-InvalidCharacter.yamlnu�[���PKZ}[��?Z33svri/1.8/system/Iconv/new-c.yamlnu�[���PKZ}[+Y9�BB$�zri/1.8/system/Iconv/cdesc-Iconv.yamlnu�[���PKZ}[�0��%%&�~ri/1.8/system/Iconv/charset_map-c.yamlnu�[���PKZ}[���II*�ri/1.8/system/Iconv/Failure/success-i.yamlnu�[���PKZ}[)�Q ==*��ri/1.8/system/Iconv/Failure/inspect-i.yamlnu�[���PKZ}[�q<�<<&?�ri/1.8/system/Iconv/Failure/new-c.yamlnu�[���PKZ}[MmGG)шri/1.8/system/Iconv/Failure/failed-i.yamlnu�[���PKZ}[���G��.q�ri/1.8/system/Iconv/Failure/cdesc-Failure.yamlnu�[���PKZ}[��-� ��ri/1.8/system/Iconv/close-i.yamlnu�[���PKZ}[�=��� �ri/1.8/system/Iconv/iconv-i.yamlnu�[���PKZ}[0���:&�ri/1.8/system/Iconv/BrokenLibrary/cdesc-BrokenLibrary.yamlnu�[���PKZ}[�\�hh>��ri/1.8/system/Iconv/InvalidEncoding/cdesc-InvalidEncoding.yamlnu�[���PKZ}[�!xx g�ri/1.8/system/Iconv/iconv-c.yamlnu�[���PKZ}[�ANѕ�/�ri/1.8/system/Iconv/open-c.yamlnu�[���PKZ}[:�A�UU&�ri/1.8/system/Array/permutation-i.yamlnu�[���PKZ}[�۩�"��ri/1.8/system/Array/shuffle-i.yamlnu�[���PKZ}[p�)�""%��ri/1.8/system/Array/shuffle%21-i.yamlnu�[���PKZ}[[���pp$0�ri/1.8/system/Array/delete_at-i.yamlnu�[���PKZ}[�z,��!�ri/1.8/system/Array/rassoc-i.yamlnu�[���PKZ}[�D�>���ri/1.8/system/Array/size-i.yamlnu�[���PKZ}[�<?�%F�ri/1.8/system/Array/reverse%21-i.yamlnu�[���PKZ}[s(�ee!��ri/1.8/system/Array/eql%3f-i.yamlnu�[���PKZ}[� ���� R�ri/1.8/system/Array/slice-i.yamlnu�[���PKZ}[R�XV��#��ri/1.8/system/Array/slice%21-i.yamlnu�[���PKZ}[�H9�UU"��ri/1.8/system/Array/indexes-i.yamlnu�[���PKZ}[�'	'Z�ri/1.8/system/Array/pack-i.yamlnu�[���PKZ}[\��B��"��ri/1.8/system/Array/flatten-i.yamlnu�[���PKZ}[�P5���!��ri/1.8/system/Array/%5b%5d-i.yamlnu�[���PKZ}[�jNtt#��ri/1.8/system/Array/empty%3f-i.yamlnu�[���PKZ}[x���LL��ri/1.8/system/Array/each-i.yamlnu�[���PKZ}[��1�FF$)�ri/1.8/system/Array/frozen%3f-i.yamlnu�[���PKZ}[�%��$��ri/1.8/system/Array/%3c%3d%3e-i.yamlnu�[���PKZ}[���JJ!�ri/1.8/system/Array/select-i.yamlnu�[���PKZ}[E���BB��ri/1.8/system/Array/to_a-i.yamlnu�[���PKZ}[�nY)��:�ri/1.8/system/Array/last-i.yamlnu�[���PKZ}[���.���ri/1.8/system/Array/at-i.yamlnu�[���PKZ}[��?7CC$��ri/1.8/system/Array/cdesc-Array.yamlnu�[���PKZ}[���ܨ�!' ri/1.8/system/Array/nitems-i.yamlnu�[���PKZ}[k�p���  ri/1.8/system/Array/pop-i.yamlnu�[���PKZ}[Io&&Z
 ri/1.8/system/Array/%7c-i.yamlnu�[���PKZ}[q���%� ri/1.8/system/Array/drop_while-i.yamlnu�[���PKZ}[~�dL�� 8 ri/1.8/system/Array/cycle-i.yamlnu�[���PKZ}[ф)c��!Q ri/1.8/system/Array/abbrev-i.yamlnu�[���PKZ}[^����� ri/1.8/system/Array/%26-i.yamlnu�[���PKZ}[�u����"| ri/1.8/system/Array/to_yaml-i.yamlnu�[���PKZ}[55���!� ri/1.8/system/Array/concat-i.yamlnu�[���PKZ}[��Y��"� ri/1.8/system/Array/compact-i.yamlnu�[���PKZ}[�G�hh� ri/1.8/system/Array/hash-i.yamlnu�[���PKZ}[��Vll$� ri/1.8/system/Array/values_at-i.yamlnu�[���PKZ}[X�N��%u! ri/1.8/system/Array/take_while-i.yamlnu�[���PKZ}[l����*�# ri/1.8/system/Array/yaml_initialize-i.yamlnu�[���PKZ}[&�-��"�$ ri/1.8/system/Array/sort%21-i.yamlnu�[���PKZ}[=%0��!�( ri/1.8/system/Array/delete-i.yamlnu�[���PKZ}[��,=��$�, ri/1.8/system/Array/reject%21-i.yamlnu�[���PKZ}[e!E�"�. ri/1.8/system/Array/collect-i.yamlnu�[���PKZ}[���3FF2 ri/1.8/system/Array/%2a-i.yamlnu�[���PKZ}[C��;UU"�4 ri/1.8/system/Array/indices-i.yamlnu�[���PKZ}[���AA R6 ri/1.8/system/Array/index-i.yamlnu�[���PKZ}[�
I��$�9 ri/1.8/system/Array/delete_if-i.yamlnu�[���PKZ}[!7�$��6< ri/1.8/system/Array/uniq-i.yamlnu�[���PKZ}[���?��!j> ri/1.8/system/Array/to_ary-i.yamlnu�[���PKZ}[e[���? ri/1.8/system/Array/drop-i.yamlnu�[���PKZ}[/�D��$�A ri/1.8/system/Array/transpose-i.yamlnu�[���PKZ}[�F�"�C ri/1.8/system/Array/inspect-i.yamlnu�[���PKZ}[g��ɇ�#E ri/1.8/system/Array/take-i.yamlnu�[���PKZ}[EC�~\\"�F ri/1.8/system/Array/unshift-i.yamlnu�[���PKZ}[�A�~xx"�I ri/1.8/system/Array/uniq%21-i.yamlnu�[���PKZ}[�l��II%qL ri/1.8/system/Array/include%3f-i.yamlnu�[���PKZ}[��o#��O ri/1.8/system/Array/new-c.yamlnu�[���PKZ}[�S!&��'T ri/1.8/system/Array/pretty_print-i.yamlnu�[���PKZ}[5x����"'U ri/1.8/system/Array/reverse-i.yamlnu�[���PKZ}[
|���%rW ri/1.8/system/Array/flatten%21-i.yamlnu�[���PKZ}[�-��"�Z ri/1.8/system/Array/replace-i.yamlnu�[���PKZ}[�
�����] ri/1.8/system/Array/zip-i.yamlnu�[���PKZ}[Z��ч�b ri/1.8/system/Array/push-i.yamlnu�[���PKZ}[�����d ri/1.8/system/Array/fill-i.yamlnu�[���PKZ}[r�a=GG%�j ri/1.8/system/Array/compact%21-i.yamlnu�[���PKZ}[���0PP!wm ri/1.8/system/Array/reject-i.yamlnu�[���PKZ}[(7$���*o ri/1.8/system/Array/initialize_copy-i.yamlnu�[���PKZ}[�����!:r ri/1.8/system/Array/rindex-i.yamlnu�[���PKZ}[~��aKK%bu ri/1.8/system/Array/find_index-i.yamlnu�[���PKZ}[*����� y ri/1.8/system/Array/first-i.yamlnu�[���PKZ}[�c��!| ri/1.8/system/Array/length-i.yamlnu�[���PKZ}[x�gk���} ri/1.8/system/Array/%2b-i.yamlnu�[���PKZ}[�RF66!� ri/1.8/system/Array/%3c%3c-i.yamlnu�[���PKZ}[㟆11v� ri/1.8/system/Array/join-i.yamlnu�[���PKZ}[�d5

!�� ri/1.8/system/Array/choice-i.yamlnu�[���PKZ}[\{!2tt&T� ri/1.8/system/Array/combination-i.yamlnu�[���PKZ}[꾞j��� ri/1.8/system/Array/to_s-i.yamlnu�[���PKZ}[�E�j�� ri/1.8/system/Array/map-i.yamlnu�[���PK[}[&��m��!P� ri/1.8/system/Array/%3d%3d-i.yamlnu�[���PK[}[�1U���!�� ri/1.8/system/Array/map%21-i.yamlnu�[���PK[}[~�@C�� �� ri/1.8/system/Array/assoc-i.yamlnu�[���PK[}[<�\\!�� ri/1.8/system/Array/insert-i.yamlnu�[���PK[}[V]�N��-F� ri/1.8/system/Array/pretty_print_cycle-i.yamlnu�[���PK[}[�$;���!a� ri/1.8/system/Array/dclone-i.yamlnu�[���PK[}[��#��W� ri/1.8/system/Array/sort-i.yamlnu�[���PK[}[�׋ֿ� Q� ri/1.8/system/Array/shift-i.yamlnu�[���PK[}[@�L�**"`� ri/1.8/system/Array/product-i.yamlnu�[���PK[}[���aa%ܪ ri/1.8/system/Array/each_index-i.yamlnu�[���PK[}[8uዛ�$�� ri/1.8/system/Array/%5b%5d%3d-i.yamlnu�[���PK[}[#Pz�oo!�� ri/1.8/system/Array/%5b%5d-c.yamlnu�[���PK[}[V��.�� A� ri/1.8/system/Array/clear-i.yamlnu�[���PK[}[�+[�� 6� ri/1.8/system/Array/count-i.yamlnu�[���PK[}[]U׭�� � ri/1.8/system/Array/fetch-i.yamlnu�[���PK[}[s.M��$�� ri/1.8/system/Array/shelljoin-i.yamlnu�[���PK[}[r�P� ri/1.8/system/Array/%2d-i.yamlnu�[���PK[}[�y�-=='I� ri/1.8/system/Array/reverse_each-i.yamlnu�[���PK[}[ti�p��%�� ri/1.8/system/Array/collect%21-i.yamlnu�[���PK[}[�����>�� ri/1.8/system/TruncatedDataError/cdesc-TruncatedDataError.yamlnu�[���PK[}[M�%��51� ri/1.8/system/Generators/HtmlClass/parent_name-i.yamlnu�[���PK[}[vU){��3U� ri/1.8/system/Generators/HtmlClass/%3c%3d%3e-i.yamlnu�[���PK[}[]�
=��>l� ri/1.8/system/Generators/HtmlClass/build_attribute_list-i.yamlnu�[���PK[}[I=::2�� ri/1.8/system/Generators/HtmlClass/http_url-i.yamlnu�[���PK[}[f���2N� ri/1.8/system/Generators/HtmlClass/write_on-i.yamlnu�[���PK[}[D��VV7j� ri/1.8/system/Generators/HtmlClass/cdesc-HtmlClass.yamlnu�[���PK[}[�����-'� ri/1.8/system/Generators/HtmlClass/new-c.yamlnu�[���PK[}[�18���4V� ri/1.8/system/Generators/HtmlClass/index_name-i.yamlnu�[���PK[}[6�����4w� ri/1.8/system/Generators/HtmlClass/value_hash-i.yamlnu�[���PK[}[d0:��.�� ri/1.8/system/Generators/HtmlClass/name-i.yamlnu�[���PK[}[�z���@�� ri/1.8/system/Generators/HtmlClass/class_attribute_values-i.yamlnu�[���PK[}[l����9�� ri/1.8/system/Generators/RIGenerator/process_class-i.yamlnu�[���PK[}[c�����;$� ri/1.8/system/Generators/RIGenerator/cdesc-RIGenerator.yamlnu�[���PK[}[�����5s� ri/1.8/system/Generators/RIGenerator/params_of-i.yamlnu�[���PK[}[�Ogg/�� ri/1.8/system/Generators/RIGenerator/for-c.yamlnu�[���PK[}[@� �88/b� ri/1.8/system/Generators/RIGenerator/new-c.yamlnu�[���PK[}[����=�� ri/1.8/system/Generators/RIGenerator/update_or_replace-i.yamlnu�[���PK[}[~;N���2P� ri/1.8/system/Generators/RIGenerator/markup-i.yamlnu�[���PK[}[G�?#aa4q� ri/1.8/system/Generators/RIGenerator/generate-i.yamlnu�[���PK[}[�Nn��@6� ri/1.8/system/Generators/RIGenerator/generate_method_info-i.yamlnu�[���PK[}[�X�R//7�� ri/1.8/system/Generators/RIGenerator/method_list-i.yamlnu�[���PK[}[w8)���?� ri/1.8/system/Generators/RIGenerator/generate_class_info-i.yamlnu�[���PK[}[}ԕM��=b� ri/1.8/system/Generators/XMLGenerator/gen_method_index-i.yamlnu�[���PK[}[3�����=�� ri/1.8/system/Generators/XMLGenerator/build_class_list-i.yamlnu�[���PK[}[�;�w��<�� ri/1.8/system/Generators/XMLGenerator/gen_class_index-i.yamlnu�[���PK[}[��z���0$� ri/1.8/system/Generators/XMLGenerator/for-c.yamlnu�[���PK[}[��fɷ�0|� ri/1.8/system/Generators/XMLGenerator/new-c.yamlnu�[���PK[}[���g��9�� ri/1.8/system/Generators/XMLGenerator/gen_an_index-i.yamlnu�[���PK[}[k��
II9�� ri/1.8/system/Generators/XMLGenerator/generate_xml-i.yamlnu�[���PK[}[��t��;�� ri/1.8/system/Generators/XMLGenerator/gen_file_index-i.yamlnu�[���PK[}[=�l���:�� ri/1.8/system/Generators/XMLGenerator/build_indices-i.yamlnu�[���PK[}[�fl�]]5� ri/1.8/system/Generators/XMLGenerator/generate-i.yamlnu�[���PK[}[�@�kk=�� ri/1.8/system/Generators/XMLGenerator/cdesc-XMLGenerator.yamlnu�[���PK[}[��C]��5u!ri/1.8/system/Generators/XMLGenerator/gen_into-i.yamlnu�[���PK[}[H�{K��4�!ri/1.8/system/Generators/HtmlFile/parent_name-i.yamlnu�[���PK[}[���>��2�!ri/1.8/system/Generators/HtmlFile/%3c%3d%3e-i.yamlnu�[���PK[}[EAw���>�!ri/1.8/system/Generators/HtmlFile/file_attribute_values-i.yamlnu�[���PK[}[�}�g��1!ri/1.8/system/Generators/HtmlFile/http_url-i.yamlnu�[���PK[}[(-���12!ri/1.8/system/Generators/HtmlFile/write_on-i.yamlnu�[���PK[}[�b��EE5L!ri/1.8/system/Generators/HtmlFile/cdesc-HtmlFile.yamlnu�[���PK[}[��8���,�!ri/1.8/system/Generators/HtmlFile/new-c.yamlnu�[���PK[}[B�f���3
!ri/1.8/system/Generators/HtmlFile/index_name-i.yamlnu�[���PK[}[�H׿��39!ri/1.8/system/Generators/HtmlFile/value_hash-i.yamlnu�[���PK[}[(ߺ
��:X!ri/1.8/system/Generators/HtmlFile/filename_to_label-i.yamlnu�[���PK[}[�A���>�!ri/1.8/system/Generators/ContextUser/build_include_list-i.yamlnu�[���PK[}[�s�]((H�!ri/1.8/system/Generators/ContextUser/build_constants_summary_list-i.yamlnu�[���PK[}[�����?p!ri/1.8/system/Generators/ContextUser/build_requires_list-i.yamlnu�[���PK[}[NX���;�!ri/1.8/system/Generators/ContextUser/collect_methods-i.yamlnu�[���PK[}[%�G�  7�!ri/1.8/system/Generators/ContextUser/find_symbol-i.yamlnu�[���PK[}[��1��D}!ri/1.8/system/Generators/ContextUser/build_method_detail_list-i.yamlnu�[���PK[}[���PPD�!ri/1.8/system/Generators/ContextUser/build_alias_summary_list-i.yamlnu�[���PK[}[����[[<�!ri/1.8/system/Generators/ContextUser/build_class_list-i.yamlnu�[���PK[}[��pv��/\!ri/1.8/system/Generators/ContextUser/url-i.yamlnu�[���PK[}[2@�CC;r!ri/1.8/system/Generators/ContextUser/cdesc-ContextUser.yamlnu�[���PK[}[I���/ &!ri/1.8/system/Generators/ContextUser/new-c.yamlnu�[���PK[}[�(��9@'!ri/1.8/system/Generators/ContextUser/document_self-i.yamlnu�[���PK\}[�Ff8dd3n(!ri/1.8/system/Generators/ContextUser/as_href-i.yamlnu�[���PK\}[%t���35*!ri/1.8/system/Generators/ContextUser/aref_to-i.yamlnu�[���PK\}[�Q�Q��=W+!ri/1.8/system/Generators/ContextUser/diagram_reference-i.yamlnu�[���PK\}[�X����G�,!ri/1.8/system/Generators/ContextUser/potentially_referenced_list-i.yamlnu�[���PK\}[�-GGE0!ri/1.8/system/Generators/ContextUser/build_method_summary_list-i.yamlnu�[���PK\}[ڄ3�0�1!ri/1.8/system/Generators/ContextUser/href-i.yamlnu�[���PK\}[�
�))A23!ri/1.8/system/Generators/ContextUser/add_table_of_sections-i.yamlnu�[���PK\}[m��}II@�4!ri/1.8/system/Generators/CHMGenerator/create_project_file-i.yamlnu�[���PK\}[6w��F�6!ri/1.8/system/Generators/CHMGenerator/create_contents_and_index-i.yamlnu�[���PK\}[@��Q>>@�8!ri/1.8/system/Generators/CHMGenerator/create_help_project-i.yamlnu�[���PK\}[X|���0V:!ri/1.8/system/Generators/CHMGenerator/for-c.yamlnu�[���PK\}[嚉��0�;!ri/1.8/system/Generators/CHMGenerator/new-c.yamlnu�[���PK\}[}O�&��I�<!ri/1.8/system/Generators/CHMGenerator/check_for_html_help_workshop-i.yamlnu�[���PK\}[e31�''<">!ri/1.8/system/Generators/CHMGenerator/compile_project-i.yamlnu�[���PK\}[�3�'  5�?!ri/1.8/system/Generators/CHMGenerator/generate-i.yamlnu�[���PK\}[���Y=:A!ri/1.8/system/Generators/CHMGenerator/cdesc-CHMGenerator.yamlnu�[���PK\}[�n��>�D!ri/1.8/system/Generators/HTMLGenerator/gen_method_index-i.yamlnu�[���PK\}[o����>�E!ri/1.8/system/Generators/HTMLGenerator/build_class_list-i.yamlnu�[���PK\}[X�����=MG!ri/1.8/system/Generators/HTMLGenerator/gen_class_index-i.yamlnu�[���PK\}[jjĠAAA�H!ri/1.8/system/Generators/HTMLGenerator/gen_sub_directories-i.yamlnu�[���PK\}[�v((58J!ri/1.8/system/Generators/HTMLGenerator/gen_url-c.yamlnu�[���PK\}[�6�ii1�K!ri/1.8/system/Generators/HTMLGenerator/for-c.yamlnu�[���PK\}[���&&?�M!ri/1.8/system/Generators/HTMLGenerator/write_style_sheet-i.yamlnu�[���PK\}[H�|p::1$O!ri/1.8/system/Generators/HTMLGenerator/new-c.yamlnu�[���PK\}[s��:�P!ri/1.8/system/Generators/HTMLGenerator/gen_an_index-i.yamlnu�[���PK\}[-�/;R!ri/1.8/system/Generators/HTMLGenerator/generate_html-i.yamlnu�[���PK\}[ӧ���<�S!ri/1.8/system/Generators/HTMLGenerator/gen_file_index-i.yamlnu�[���PK\}[�%���;�T!ri/1.8/system/Generators/HTMLGenerator/build_indices-i.yamlnu�[���PK\}[����cc6�W!ri/1.8/system/Generators/HTMLGenerator/generate-i.yamlnu�[���PK\}[�'���6�Y!ri/1.8/system/Generators/HTMLGenerator/gen_into-i.yamlnu�[���PK\}[��$���<�Z!ri/1.8/system/Generators/HTMLGenerator/gen_main_index-i.yamlnu�[���PK\}[@��:bb@]!ri/1.8/system/Generators/HTMLGenerator/load_html_template-i.yamlnu�[���PK\}[���6�^!ri/1.8/system/Generators/HTMLGenerator/main_url-i.yamlnu�[���PK\}[؛����?<`!ri/1.8/system/Generators/HTMLGenerator/cdesc-HTMLGenerator.yamlnu�[���PK]}[����0Qe!ri/1.8/system/Generators/MarkUp/style_url-i.yamlnu�[���PK]}[買-yy-Gg!ri/1.8/system/Generators/MarkUp/markup-i.yamlnu�[���PK]}[o�D���1i!ri/1.8/system/Generators/MarkUp/cdesc-MarkUp.yamlnu�[���PK]}[,�Ԓ��.-k!ri/1.8/system/Generators/MarkUp/cvs_url-i.yamlnu�[���PK]}[�L���2m!ri/1.8/system/Generators/AllReferences/keys-c.yamlnu�[���PK]}[����3'n!ri/1.8/system/Generators/AllReferences/reset-c.yamlnu�[���PK]}[6���?Ao!ri/1.8/system/Generators/AllReferences/cdesc-AllReferences.yamlnu�[���PK]}[ןvk��1�r!ri/1.8/system/Generators/AllReferences/add-c.yamlnu�[���PK]}[��Ś��4�s!ri/1.8/system/Generators/AllReferences/%5b%5d-c.yamlnu�[���PK]}[G��
��?�t!ri/1.8/system/Generators/HyperlinkHtml/cdesc-HyperlinkHtml.yamlnu�[���PK]}[��ftssE"x!ri/1.8/system/Generators/HyperlinkHtml/handle_special_CROSSREF-i.yamlnu�[���PK]}[�lN*pp5
{!ri/1.8/system/Generators/HyperlinkHtml/gen_url-i.yamlnu�[���PK]}[4���E�|!ri/1.8/system/Generators/HyperlinkHtml/handle_special_TIDYLINK-i.yamlnu�[���PK]}[j퉴��F�~!ri/1.8/system/Generators/HyperlinkHtml/handle_special_HYPERLINK-i.yamlnu�[���PK]}[��Mqaa1Ӂ!ri/1.8/system/Generators/HyperlinkHtml/new-c.yamlnu�[���PK]}[��"���6��!ri/1.8/system/Generators/HtmlMethod/description-i.yamlnu�[���PK]}[��^���5��!ri/1.8/system/Generators/HtmlMethod/visibility-i.yamlnu�[���PK]}[��;L��6ޅ!ri/1.8/system/Generators/HtmlMethod/parent_name-i.yamlnu�[���PK]}[L�KK��4�!ri/1.8/system/Generators/HtmlMethod/%3c%3d%3e-i.yamlnu�[���PK]}[WJ�m��6�!ri/1.8/system/Generators/HtmlMethod/find_symbol-i.yamlnu�[���PK]}[�����/U�!ri/1.8/system/Generators/HtmlMethod/path-i.yamlnu�[���PK]}[;����3f�!ri/1.8/system/Generators/HtmlMethod/call_seq-i.yamlnu�[���PK]}[�,ȹ��.��!ri/1.8/system/Generators/HtmlMethod/new-c.yamlnu�[���PK]}[s�4<<6��!ri/1.8/system/Generators/HtmlMethod/markup_code-i.yamlnu�[���PK]}[�s})��5O�!ri/1.8/system/Generators/HtmlMethod/index_name-i.yamlnu�[���PK]}[G$�C��8r�!ri/1.8/system/Generators/HtmlMethod/document_self-i.yamlnu�[���PK]}[�r8L��B��!ri/1.8/system/Generators/HtmlMethod/create_source_code_file-i.yamlnu�[���PK]}[���`��4�!ri/1.8/system/Generators/HtmlMethod/singleton-i.yamlnu�[���PK]}[�r�ִ�0�!ri/1.8/system/Generators/HtmlMethod/reset-c.yamlnu�[���PK`}[م:}cc2%�!ri/1.8/system/Generators/HtmlMethod/as_href-i.yamlnu�[���PK`}[s��P��1�!ri/1.8/system/Generators/HtmlMethod/params-i.yamlnu�[���PK`}[n[g��2�!ri/1.8/system/Generators/HtmlMethod/section-i.yamlnu�[���PK`}[�q.��6�!ri/1.8/system/Generators/HtmlMethod/all_methods-c.yamlnu�[���PK`}[����2A�!ri/1.8/system/Generators/HtmlMethod/aliases-i.yamlnu�[���PK`}[��4Dz�/[�!ri/1.8/system/Generators/HtmlMethod/aref-i.yamlnu�[���PK`}[#�t�||;l�!ri/1.8/system/Generators/HtmlMethod/add_line_numbers-i.yamlnu�[���PK`}[N�']vv9S�!ri/1.8/system/Generators/HtmlMethod/cdesc-HtmlMethod.yamlnu�[���PK`}[�
L���/2�!ri/1.8/system/Generators/HtmlMethod/name-i.yamlnu�[���PK`}[�sa�.C�!ri/1.8/system/Generators/cdesc-Generators.yamlnu�[���PK`}[I�����C��!ri/1.8/system/Generators/HTMLGeneratorInOne/gen_method_index-i.yamlnu�[���PK`}[�2���C�!ri/1.8/system/Generators/HTMLGeneratorInOne/build_class_list-i.yamlnu�[���PK`}[�SV���Bb�!ri/1.8/system/Generators/HTMLGeneratorInOne/gen_class_index-i.yamlnu�[���PK`}[��ν�6��!ri/1.8/system/Generators/HTMLGeneratorInOne/new-c.yamlnu�[���PK`}[�$��?Ǭ!ri/1.8/system/Generators/HTMLGeneratorInOne/gen_an_index-i.yamlnu�[���PK`}[n��5OO?�!ri/1.8/system/Generators/HTMLGeneratorInOne/generate_xml-i.yamlnu�[���PK`}[O?�Iϯ!ri/1.8/system/Generators/HTMLGeneratorInOne/cdesc-HTMLGeneratorInOne.yamlnu�[���PK`}[�Cvh��AL�!ri/1.8/system/Generators/HTMLGeneratorInOne/gen_file_index-i.yamlnu�[���PK`}[j+���@��!ri/1.8/system/Generators/HTMLGeneratorInOne/build_indices-i.yamlnu�[���PK`}[ʌ�cc;��!ri/1.8/system/Generators/HTMLGeneratorInOne/generate-i.yamlnu�[���PK`}[�oR���;��!ri/1.8/system/Generators/HTMLGeneratorInOne/gen_into-i.yamlnu�[���PK`}[��9)��.��!ri/1.8/system/TSortArray/cdesc-TSortArray.yamlnu�[���PK`}[IW�#ٻ!ri/1.8/system/Generator/each-i.yamlnu�[���PK`}[�|�&C�!ri/1.8/system/Generator/next%3f-i.yamlnu�[���PK`}[
M;#��!ri/1.8/system/Generator/next-i.yamlnu�[���PK`}[]Cv��,��!ri/1.8/system/Generator/cdesc-Generator.yamlnu�[���PK`}[~q*Z��%��!ri/1.8/system/Generator/rewind-i.yamlnu�[���PK`}[�hRS$%�!ri/1.8/system/Generator/index-i.yamlnu�[���PK`}[[#�S"}�!ri/1.8/system/Generator/new-c.yamlnu�[���PK`}[����&��!ri/1.8/system/Generator/current-i.yamlnu�[���PK`}[KZ8I"@�!ri/1.8/system/Generator/pos-i.yamlnu�[���PK`}[�A�o��%��!ri/1.8/system/Generator/end%3f-i.yamlnu�[���PK`}[ Qn~��$��!ri/1.8/system/Generator/yield-i.yamlnu�[���PK`}[l����*+�!ri/1.8/system/Shellwords/shellwords-i.yamlnu�[���PK`}[;�C==*w�!ri/1.8/system/Shellwords/shellsplit-i.yamlnu�[���PK`}[R����%�!ri/1.8/system/Shellwords/split-i.yamlnu�[���PK`}[�k���&K�!ri/1.8/system/Shellwords/escape-i.yamlnu�[���PK`}[�����$��!ri/1.8/system/Shellwords/join-i.yamlnu�[���PK`}[g؃���)��!ri/1.8/system/Shellwords/shelljoin-i.yamlnu�[���PK`}[w$�OGG+��!ri/1.8/system/Shellwords/shellescape-i.yamlnu�[���PK`}[.�TBvv.��!ri/1.8/system/Shellwords/cdesc-Shellwords.yamlnu�[���PK`}[��JJ#j�!ri/1.8/system/Object/methods-i.yamlnu�[���PK`}[�a�=cc.�!ri/1.8/system/Object/instance_variables-i.yamlnu�[���PK`}[:(!�PP"��!ri/1.8/system/Object/eql%3f-i.yamlnu�[���PK`}[�8ÊMM!j�!ri/1.8/system/Object/class-i.yamlnu�[���PK`}[�z�k��$�!ri/1.8/system/Object/__send__-i.yamlnu�[���PK`}[Ɨ��bb"I�!ri/1.8/system/Object/%3d%7e-i.yamlnu�[���PK`}[1Ѝ��%��!ri/1.8/system/Object/frozen%3f-i.yamlnu�[���PK`}[���'�� .�!ri/1.8/system/Object/to_a-i.yamlnu�[���PK`}[[N�(dd%O�!ri/1.8/system/Object/object_id-i.yamlnu�[���PK`}[����#"ri/1.8/system/Object/is_a%3f-i.yamlnu�[���PK`}[i����*�"ri/1.8/system/Object/public_methods-i.yamlnu�[���PK`}[�O����"ri/1.8/system/Object/dup-i.yamlnu�[���PK`}[@��Q��#�	"ri/1.8/system/Object/to_yaml-i.yamlnu�[���PK`}[�x��
"ri/1.8/system/Object/tap-i.yamlnu�[���PK`}[���BTT$!"ri/1.8/system/Object/equal%3f-i.yamlnu�[���PK`}[{�#� �"ri/1.8/system/Object/hash-i.yamlnu�[���PK`}[�Sg��$!"ri/1.8/system/Object/enum_for-i.yamlnu�[���PK`}[>�qpp*"ri/1.8/system/Object/instance_of%3f-i.yamlnu�[���PK`}[~w='��1�"ri/1.8/system/Object/instance_variable_set-i.yamlnu�[���PK`}[!�0

 �"ri/1.8/system/Object/type-i.yamlnu�[���PK`}[i0�VV#J "ri/1.8/system/Object/inspect-i.yamlnu�[���PK`}[��O��&�""ri/1.8/system/Object/cdesc-Object.yamlnu�[���PK`}[��?e���;"ri/1.8/system/Object/new-c.yamlnu�[���PK`}[
AF(��)�<"ri/1.8/system/Object/respond_to%3f-i.yamlnu�[���PK`}[a����6"?"ri/1.8/system/Object/singleton_method_undefined-i.yamlnu�[���PK`}[^�g{��%pB"ri/1.8/system/Object/%3d%3d%3d-i.yamlnu�[���PK`}[�'{�)jD"ri/1.8/system/Object/instance_exec-i.yamlnu�[���PK`}[M����2�G"ri/1.8/system/Object/singleton_method_added-i.yamlnu�[���PK`}[P=b]!!&1K"ri/1.8/system/Object/tainted%3f-i.yamlnu�[���PK`}[qǻp�� �L"ri/1.8/system/Object/send-i.yamlnu�[���PK`}[��/��.�O"ri/1.8/system/Object/to_yaml_properties-i.yamlnu�[���PK`}[I�	��P"ri/1.8/system/Object/id-i.yamlnu�[���PKa}[s)�X��+[R"ri/1.8/system/Object/private_methods-i.yamlnu�[���PKa}[�]���)hT"ri/1.8/system/Object/to_yaml_style-i.yamlnu�[���PKa}['xj��8uU"ri/1.8/system/Object/instance_variable_defined%3f-i.yamlnu�[���PKa}[0S�ϙ�!�X"ri/1.8/system/Object/taint-i.yamlnu�[���PKa}[���ɜ�#�Z"ri/1.8/system/Object/to_enum-i.yamlnu�[���PKa}[35����"�]"ri/1.8/system/Object/freeze-i.yamlnu�[���PKa}[��\8�� �`"ri/1.8/system/Object/to_s-i.yamlnu�[���PKa}[%!M��-�b"ri/1.8/system/Object/singleton_methods-i.yamlnu�[���PKa}[c+���)�f"ri/1.8/system/Object/instance_eval-i.yamlnu�[���PKa}[�*��LL"Jk"ri/1.8/system/Object/%3d%3d-i.yamlnu�[���PKa}[d���4�p"ri/1.8/system/Object/remove_instance_variable-i.yamlnu�[���PKa}[����!�s"ri/1.8/system/Object/clone-i.yamlnu�[���PKa}[�E�՟�"�x"ri/1.8/system/Object/__id__-i.yamlnu�[���PKa}[sic��"�{"ri/1.8/system/Object/extend-i.yamlnu�[���PKa}[��*��-�~"ri/1.8/system/Object/protected_methods-i.yamlnu�[���PKa}[ĂJ��"�"ri/1.8/system/Object/method-i.yamlnu�[���PKa}[���z��"݄"ri/1.8/system/Object/dclone-i.yamlnu�[���PKa}[䱦U��#Յ"ri/1.8/system/Object/display-i.yamlnu�[���PKa}[��vDD4߈"ri/1.8/system/Object/singleton_method_removed-i.yamlnu�[���PKa}[ !�W��"��"ri/1.8/system/Object/nil%3f-i.yamlnu�[���PKa}[�C_&		#��"ri/1.8/system/Object/untaint-i.yamlnu�[���PKa}[љ��PP1�"ri/1.8/system/Object/instance_variable_get-i.yamlnu�[���PKa}[�M���&��"ri/1.8/system/Object/kind_of%3f-i.yamlnu�[���PKa}[ʱN��1}�"ri/1.8/system/DEBUGGER__/debug_thread_info-c.yamlnu�[���PKa}[��W���/��"ri/1.8/system/DEBUGGER__/thread_list_all-c.yamlnu�[���PKa}[�my@��'Ǚ"ri/1.8/system/DEBUGGER__/suspend-c.yamlnu�[���PKa}[�2�:��*ʚ"ri/1.8/system/DEBUGGER__/get_thread-c.yamlnu�[���PKa}[�2\}}/ٛ"ri/1.8/system/DEBUGGER__/Mutex/cdesc-Mutex.yamlnu�[���PKa}[�'�
��,��"ri/1.8/system/DEBUGGER__/Mutex/unlock-i.yamlnu�[���PKa}[��
��/ž"ri/1.8/system/DEBUGGER__/Mutex/locked%3f-i.yamlnu�[���PKa}[!z[��)ԟ"ri/1.8/system/DEBUGGER__/Mutex/new-c.yamlnu�[���PKa}[��'��*ؠ"ri/1.8/system/DEBUGGER__/Mutex/lock-i.yamlnu�[���PKa}[�@��-ߡ"ri/1.8/system/DEBUGGER__/Context/thnum-i.yamlnu�[���PKa}[�n���/�"ri/1.8/system/DEBUGGER__/Context/context-i.yamlnu�[���PKa}[�V���0�"ri/1.8/system/DEBUGGER__/Context/trace%3f-i.yamlnu�[���PKa}[i�-���0�"ri/1.8/system/DEBUGGER__/Context/var_list-i.yamlnu�[���PKa}[b�����29�"ri/1.8/system/DEBUGGER__/Context/debug_eval-i.yamlnu�[���PKa}[��'>��1b�"ri/1.8/system/DEBUGGER__/Context/stop_next-i.yamlnu�[���PKa}[d�Y��3�"ri/1.8/system/DEBUGGER__/Context/excn_handle-i.yamlnu�[���PKa}[5a�5��8��"ri/1.8/system/DEBUGGER__/Context/debug_print_help-i.yamlnu�[���PKa}[|!���0�"ri/1.8/system/DEBUGGER__/Context/readline-i.yamlnu�[���PKa}[�����:�"ri/1.8/system/DEBUGGER__/Context/check_break_points-i.yamlnu�[���PKa}[u�D6��5Z�"ri/1.8/system/DEBUGGER__/Context/frame_set_pos-i.yamlnu�[���PKa}[��,D��5��"ri/1.8/system/DEBUGGER__/Context/debug_command-i.yamlnu�[���PKa}[@x���;ǯ"ri/1.8/system/DEBUGGER__/Context/display_expressions-i.yamlnu�[���PKa}[^z:Z��;�"ri/1.8/system/DEBUGGER__/Context/debug_variable_info-i.yamlnu�[���PKa}[�&���4L�"ri/1.8/system/DEBUGGER__/Context/format_frame-i.yamlnu�[���PKa}[*F�s��5r�"ri/1.8/system/DEBUGGER__/Context/clear_suspend-i.yamlnu�[���PKa}[���~��4��"ri/1.8/system/DEBUGGER__/Context/break_points-i.yamlnu�[���PKa}[��:��2��"ri/1.8/system/DEBUGGER__/Context/trace_func-i.yamlnu�[���PKa}[RU�ۻ�2��"ri/1.8/system/DEBUGGER__/Context/resume_all-i.yamlnu�[���PKa}[��#��9�"ri/1.8/system/DEBUGGER__/Context/debug_silent_eval-i.yamlnu�[���PKa}[@1d��:X�"ri/1.8/system/DEBUGGER__/Context/display_expression-i.yamlnu�[���PKa}[}�Gҭ�+��"ri/1.8/system/DEBUGGER__/Context/new-c.yamlnu�[���PKa}[n�!]��9��"ri/1.8/system/DEBUGGER__/Context/debug_method_info-i.yamlnu�[���PKa}[�=�'��7�"ri/1.8/system/DEBUGGER__/Context/set_last_thread-i.yamlnu�[���PKa}[��1��1�"ri/1.8/system/DEBUGGER__/Context/set_trace-i.yamlnu�[���PKa}[��-���6,�"ri/1.8/system/DEBUGGER__/Context/display_frames-i.yamlnu�[���PKa}[e6Z�		3X�"ri/1.8/system/DEBUGGER__/Context/cdesc-Context.yamlnu�[���PKa}[E�07��3��"ri/1.8/system/DEBUGGER__/Context/set_suspend-i.yamlnu�[���PKa}[p����5��"ri/1.8/system/DEBUGGER__/Context/check_suspend-i.yamlnu�[���PKa}[R��ܿ�/�"ri/1.8/system/DEBUGGER__/Context/line_at-i.yamlnu�[���PKa}[�h1W��.$�"ri/1.8/system/DEBUGGER__/Context/stdout-i.yamlnu�[���PKa}[�KK	��45�"ri/1.8/system/DEBUGGER__/Context/display_list-i.yamlnu�[���PKa}[�M�޵�/h�"ri/1.8/system/DEBUGGER__/Context/display-i.yamlnu�[���PKa}[���~��5|�"ri/1.8/system/DEBUGGER__/Context/set_trace_all-i.yamlnu�[���PKa}[�'���6��"ri/1.8/system/DEBUGGER__/Context/debug_funcname-i.yamlnu�[���PKa}[y(`��3��"ri/1.8/system/DEBUGGER__/Context/suspend_all-i.yamlnu�[���PKa}[����0��"ri/1.8/system/DEBUGGER__/make_thread_list-c.yamlnu�[���PKa}[�F�,��)�"ri/1.8/system/DEBUGGER__/interrupt-c.yamlnu�[���PKa}[�X���)�"ri/1.8/system/DEBUGGER__/stdout%3d-c.yamlnu�[���PKa}[��f���&�"ri/1.8/system/DEBUGGER__/stdout-c.yamlnu�[���PKa}[(��+�"ri/1.8/system/DEBUGGER__/thread_list-c.yamlnu�[���PKa}[�
s���,/�"ri/1.8/system/DEBUGGER__/break_points-c.yamlnu�[���PKa}[��p�VV.A�"ri/1.8/system/DEBUGGER__/cdesc-DEBUGGER__.yamlnu�[���PKa}[',��)��"ri/1.8/system/DEBUGGER__/set_trace-c.yamlnu�[���PKa}[]�?Z��&�"ri/1.8/system/DEBUGGER__/resume-c.yamlnu�[���PKa}[�CD��/�"ri/1.8/system/DEBUGGER__/set_last_thread-c.yamlnu�[���PKa}[3O8��' �"ri/1.8/system/DEBUGGER__/display-c.yamlnu�[���PKa}[P�M��'#�"ri/1.8/system/DEBUGGER__/waiting-c.yamlnu�[���PKa}[�Vm��'&�"ri/1.8/system/DEBUGGER__/context-c.yamlnu�[���PKa}[4Gp��->�"ri/1.8/system/FileUtils/have_option%3f-c.yamlnu�[���PKa}[�a���)��"ri/1.8/system/FileUtils/options_of-c.yamlnu�[���PKa}[9kU��#��"ri/1.8/system/FileUtils/move-i.yamlnu�[���PKa}[�\H�""$��"ri/1.8/system/FileUtils/rm_rf-i.yamlnu�[���PKb}[�,�#@@,F�"ri/1.8/system/FileUtils/cdesc-FileUtils.yamlnu�[���PKb}[b�ttt!�#ri/1.8/system/FileUtils/cp-i.yamlnu�[���PKb}[�9��#�	#ri/1.8/system/FileUtils/rm_r-i.yamlnu�[���PKb}[-M����2�#ri/1.8/system/FileUtils/NoWrite/cdesc-NoWrite.yamlnu�[���PKb}[Q���uu(�#ri/1.8/system/FileUtils/copy_file-i.yamlnu�[���PKb}[w�b)��%�#ri/1.8/system/FileUtils/mkpath-i.yamlnu�[���PKb}[L���VV$�#ri/1.8/system/FileUtils/chmod-i.yamlnu�[���PKb}[�0\�--$�#ri/1.8/system/FileUtils/rmdir-i.yamlnu�[���PKb}[�2���"#ri/1.8/system/FileUtils/cmp-i.yamlnu�[���PKb}[	��V33-C#ri/1.8/system/FileUtils/compare_stream-i.yamlnu�[���PKb}[~��1�#ri/1.8/system/FileUtils/fu_have_symlink%3f-i.yamlnu�[���PKb}[Q��*��'�#ri/1.8/system/FileUtils/makedirs-i.yamlnu�[���PKb}[w�V��-?#ri/1.8/system/FileUtils/collect_method-c.yamlnu�[���PKb}[���**)f #ri/1.8/system/FileUtils/copy_entry-i.yamlnu�[���PKb}[u�=��%�$#ri/1.8/system/FileUtils/remove-i.yamlnu�[���PKb}[�bH���0-&#ri/1.8/system/FileUtils/Entry_/cdesc-Entry_.yamlnu�[���PKb}[�
��6Q'#ri/1.8/system/FileUtils/StreamUtils_/fu_blksize-i.yamlnu�[���PKb}[��+֫�<y(#ri/1.8/system/FileUtils/StreamUtils_/cdesc-StreamUtils_.yamlnu�[���PKb}[o���>�*#ri/1.8/system/FileUtils/StreamUtils_/fu_default_blksize-i.yamlnu�[���PKb}[˸���=�+#ri/1.8/system/FileUtils/StreamUtils_/fu_stream_blksize-i.yamlnu�[���PKb}[�g���9-#ri/1.8/system/FileUtils/StreamUtils_/fu_windows%3f-i.yamlnu�[���PKb}[����3<.#ri/1.8/system/FileUtils/fu_world_writable%3f-i.yamlnu�[���PKb}[.�
>��!b/#ri/1.8/system/FileUtils/cd-i.yamlnu�[���PKb}[x�O�$32#ri/1.8/system/FileUtils/mkdir-i.yamlnu�[���PKb}[Mݶ�!�4#ri/1.8/system/FileUtils/mv-i.yamlnu�[���PKb}[�����08#ri/1.8/system/FileUtils/DryRun/cdesc-DryRun.yamlnu�[���PKb}[d?���#T:#ri/1.8/system/FileUtils/link-i.yamlnu�[���PKb}[�����#�;#ri/1.8/system/FileUtils/copy-i.yamlnu�[���PKb}[{�
�ll$�<#ri/1.8/system/FileUtils/ln_sf-i.yamlnu�[���PKb}[��<�))+�>#ri/1.8/system/FileUtils/compare_file-i.yamlnu�[���PKb}[͌��%A#ri/1.8/system/FileUtils/rmtree-i.yamlnu�[���PKb}[��_C��&eB#ri/1.8/system/FileUtils/chmod_R-i.yamlnu�[���PKb}[u�c��!�D#ri/1.8/system/FileUtils/ln-i.yamlnu�[���PKb}[�~����+�I#ri/1.8/system/FileUtils/remove_entry-i.yamlnu�[���PKb}[H��zEE*/L#ri/1.8/system/FileUtils/remove_file-i.yamlnu�[���PKb}[����&�M#ri/1.8/system/FileUtils/options-c.yamlnu�[���PKb}[����2�O#ri/1.8/system/FileUtils/Verbose/cdesc-Verbose.yamlnu�[���PKb}[;��QQ"�Q#ri/1.8/system/FileUtils/pwd-i.yamlnu�[���PKb}[����dd*�S#ri/1.8/system/FileUtils/copy_stream-i.yamlnu�[���PKb}[����$?U#ri/1.8/system/FileUtils/touch-i.yamlnu�[���PKb}[�h�>&&#�W#ri/1.8/system/FileUtils/cp_r-i.yamlnu�[���PKb}[
�jp��&]#ri/1.8/system/FileUtils/chown_R-i.yamlnu�[���PKb}[��ng��*r`#ri/1.8/system/FileUtils/safe_unlink-i.yamlnu�[���PKb}[һ�`LL#�a#ri/1.8/system/FileUtils/ln_s-i.yamlnu�[���PKb}[5���#fg#ri/1.8/system/FileUtils/rm_f-i.yamlnu�[���PKb}[׀�Edd)Wi#ri/1.8/system/FileUtils/remove_dir-i.yamlnu�[���PKb}[�=_:��'k#ri/1.8/system/FileUtils/commands-c.yamlnu�[���PKb}[�X\���$m#ri/1.8/system/FileUtils/chdir-i.yamlnu�[���PKb}[�<���+Pn#ri/1.8/system/FileUtils/identical%3f-i.yamlnu�[���PKb}[џ�DD&�o#ri/1.8/system/FileUtils/mkdir_p-i.yamlnu�[���PKb}[P!G���28s#ri/1.8/system/FileUtils/remove_entry_secure-i.yamlnu�[���PKb}[��O��& {#ri/1.8/system/FileUtils/install-i.yamlnu�[���PKb}[�~J��$a~#ri/1.8/system/FileUtils/getwd-i.yamlnu�[���PKb}[;sJt��!�#ri/1.8/system/FileUtils/rm-i.yamlnu�[���PKb}[����&u�#ri/1.8/system/FileUtils/symlink-i.yamlnu�[���PKb}[z�*Ã#ri/1.8/system/FileUtils/uptodate%3f-i.yamlnu�[���PKb}[r��E��$7�#ri/1.8/system/FileUtils/chown-i.yamlnu�[���PKb}[ǩ��$�#ri/1.8/system/Method/receiver-i.yamlnu�[���PKb}[�)��!�#ri/1.8/system/Method/arity-i.yamlnu�[���PKb}[fR	���"<�#ri/1.8/system/Method/%5b%5d-i.yamlnu�[���PKc}[�
�� r�#ri/1.8/system/Method/call-i.yamlnu�[���PKc}[�ܼ""#��#ri/1.8/system/Method/to_proc-i.yamlnu�[���PKc}[��|��"�#ri/1.8/system/Method/unbind-i.yamlnu�[���PKc}[BN僳�#�#ri/1.8/system/Method/inspect-i.yamlnu�[���PKc}[�[�  !�#ri/1.8/system/Method/owner-i.yamlnu�[���PKc}[����� ��#ri/1.8/system/Method/to_s-i.yamlnu�[���PKc}[2KZFF"��#ri/1.8/system/Method/%3d%3d-i.yamlnu�[���PKc}[��Ի��!�#ri/1.8/system/Method/clone-i.yamlnu�[���PKc}[>km��&O�#ri/1.8/system/Method/cdesc-Method.yamlnu�[���PKc}[8��� ��#ri/1.8/system/Method/name-i.yamlnu�[���PKc}[�9n�&�#ri/1.8/system/Enumerable/minmax-i.yamlnu�[���PKc}[�}��#\�#ri/1.8/system/Enumerable/max-i.yamlnu�[���PKc}[���&U�#ri/1.8/system/Enumerable/select-i.yamlnu�[���PKc}[��-G$į#ri/1.8/system/Enumerable/to_a-i.yamlnu�[���PKd}[�^�mm&4�#ri/1.8/system/Enumerable/any%3f-i.yamlnu�[���PKd}[w��""'��#ri/1.8/system/Enumerable/entries-i.yamlnu�[���PKd}["}ݕyy)p�#ri/1.8/system/Enumerable/each_cons-i.yamlnu�[���PKd}[�z���$B�#ri/1.8/system/Enumerable/find-i.yamlnu�[���PKd}[�爎*n�#ri/1.8/system/Enumerable/drop_while-i.yamlnu�[���PKd}[R�뉀�%�#ri/1.8/system/Enumerable/cycle-i.yamlnu�[���PKd}[�Qw���*��#ri/1.8/system/Enumerable/take_while-i.yamlnu�[���PKd}[��j�GG)�#ri/1.8/system/Enumerable/member%3f-i.yamlnu�[���PKd}[�x?���&��#ri/1.8/system/Enumerable/detect-i.yamlnu�[���PKd}[���aa'��#ri/1.8/system/Enumerable/collect-i.yamlnu�[���PKd}[�>M��.��#ri/1.8/system/Enumerable/cdesc-Enumerable.yamlnu�[���PKd}[�\�F��#��#ri/1.8/system/Enumerable/min-i.yamlnu�[���PKd}[�o33*��#ri/1.8/system/Enumerable/each_slice-i.yamlnu�[���PKd}[�8�j(�#ri/1.8/system/Enumerable/find_all-i.yamlnu�[���PKd}[z@����$��#ri/1.8/system/Enumerable/drop-i.yamlnu�[���PKd}[n�����$��#ri/1.8/system/Enumerable/take-i.yamlnu�[���PKd}[��t{yy)w�#ri/1.8/system/Enumerable/enum_cons-i.yamlnu�[���PKd}[y5�MM$I�#ri/1.8/system/Enumerable/grep-i.yamlnu�[���PKd}[�϶�II*��#ri/1.8/system/Enumerable/include%3f-i.yamlnu�[���PKd}[	A�cc/��#ri/1.8/system/Enumerable/Enumerator/each-i.yamlnu�[���PKd}[{���++9O�#ri/1.8/system/Enumerable/Enumerator/cdesc-Enumerator.yamlnu�[���PKd}[f2��/�#ri/1.8/system/Enumerable/Enumerator/next-i.yamlnu�[���PKd}[3�X��55�#ri/1.8/system/Enumerable/Enumerator/with_index-i.yamlnu�[���PKd}[�bzc!!1+�#ri/1.8/system/Enumerable/Enumerator/rewind-i.yamlnu�[���PKd}[q>#���6��#ri/1.8/system/Enumerable/Enumerator/__generator-i.yamlnu�[���PKd}[A��.�#ri/1.8/system/Enumerable/Enumerator/new-c.yamlnu�[���PKd}[�Pӛ�:>$ri/1.8/system/Enumerable/Enumerator/each_with_index-i.yamlnu�[���PKe}[�9��)C$ri/1.8/system/Enumerable/partition-i.yamlnu�[���PKe}[����		#�$ri/1.8/system/Enumerable/zip-i.yamlnu�[���PKe}[�ِu��&	$ri/1.8/system/Enumerable/reject-i.yamlnu�[���PKe}[���aa/L$ri/1.8/system/Enumerable/each_with_index-i.yamlnu�[���PKe}[7�u]*$ri/1.8/system/Enumerable/find_index-i.yamlnu�[���PKe}[�)XX33*g$ri/1.8/system/Enumerable/enum_slice-i.yamlnu�[���PKe}[)�5��%�$ri/1.8/system/Enumerable/first-i.yamlnu�[���PKe}[�(H($ri/1.8/system/Enumerable/group_by-i.yamlnu�[���PKe}[ާ�}}&o$ri/1.8/system/Enumerable/one%3f-i.yamlnu�[���PKf}[�z��&B$ri/1.8/system/Enumerable/min_by-i.yamlnu�[���PKf}[�Jt���&d$ri/1.8/system/Enumerable/max_by-i.yamlnu�[���PKf}[!�S<'� $ri/1.8/system/Enumerable/none%3f-i.yamlnu�[���PKf}[G8��YY#b$$ri/1.8/system/Enumerable/map-i.yamlnu�[���PKf}[i�rXX&'$ri/1.8/system/Enumerable/all%3f-i.yamlnu�[���PKf}[�*�\\&�*$ri/1.8/system/Enumerable/to_set-i.yamlnu�[���PKf}[:^�55&n,$ri/1.8/system/Enumerable/reduce-i.yamlnu�[���PKf}[�e5p��$�4$ri/1.8/system/Enumerable/sort-i.yamlnu�[���PKf}[!	�1��&�8$ri/1.8/system/Enumerable/inject-i.yamlnu�[���PKf}[/�n77):$ri/1.8/system/Enumerable/minmax_by-i.yamlnu�[���PKf}[5�'#//%�<$ri/1.8/system/Enumerable/count-i.yamlnu�[���PKf}[uAaa/&@$ri/1.8/system/Enumerable/enum_with_index-i.yamlnu�[���PKf}[�*>n��'�B$ri/1.8/system/Enumerable/sort_by-i.yamlnu�[���PKf}[=^b)),�O$ri/1.8/system/Enumerable/reverse_each-i.yamlnu�[���PKf}[ĺ���:jQ$ri/1.8/system/SystemStackError/cdesc-SystemStackError.yamlnu�[���PKf}[��_l��4�T$ri/1.8/system/StandardError/cdesc-StandardError.yamlnu�[���PKf}[�sҔ��8�W$ri/1.8/system/SignalException/cdesc-SignalException.yamlnu�[���PKf}[�}�Z$ri/1.8/system/NKF/guess1-c.yamlnu�[���PKf}[�T�_���]$ri/1.8/system/NKF/guess2-c.yamlnu�[���PKf}[���Xo3o3 a$ri/1.8/system/NKF/cdesc-NKF.yamlnu�[���PKf}[��5WWĔ$ri/1.8/system/NKF/nkf-c.yamlnu�[���PKf}[�J��(g�$ri/1.8/system/Marshal/cdesc-Marshal.yamlnu�[���PKf}[��n�,,$��$ri/1.8/system/Marshal/restore-c.yamlnu�[���PKg}[����!-�$ri/1.8/system/Marshal/dump-c.yamlnu�[���PKg}[o��&&!>�$ri/1.8/system/Marshal/load-c.yamlnu�[���PKg}[}�u�� ��$ri/1.8/system/Bignum/size-i.yamlnu�[���PKg}[r�)K��"��$ri/1.8/system/Bignum/eql%3f-i.yamlnu�[���PKg}[�%W;QQ"�$ri/1.8/system/Bignum/rpower-i.yamlnu�[���PKg}[R��yGG��$ri/1.8/system/Bignum/%25-i.yamlnu�[���PKg}[�*
�pp"=�$ri/1.8/system/Bignum/%5b%5d-i.yamlnu�[���PKg}[�Ĝ^�� ��$ri/1.8/system/Bignum/fdiv-i.yamlnu�[���PKg}[GM��uu"L�$ri/1.8/system/Bignum/%2a%2a-i.yamlnu�[���PKg}[�3�9��%�$ri/1.8/system/Bignum/%3c%3d%3e-i.yamlnu�[���PKg}[�V����"�$ri/1.8/system/Bignum/coerce-i.yamlnu�[���PKg}[��v��:�$ri/1.8/system/Bignum/%2f-i.yamlnu�[���PKg}[�((\�$ri/1.8/system/Bignum/%7c-i.yamlnu�[���PKg}[�'V6"Ӿ$ri/1.8/system/Bignum/divmod-i.yamlnu�[���PKg}[��ی))-�$ri/1.8/system/Bignum/%26-i.yamlnu�[���PKg}[��KK��$ri/1.8/system/Bignum/quo-i.yamlnu�[���PKg}[2o{� ?�$ri/1.8/system/Bignum/hash-i.yamlnu�[���PKg}[��7ii��$ri/1.8/system/Bignum/abs-i.yamlnu�[���PKg}[�lEYW�$ri/1.8/system/Bignum/%2a-i.yamlnu�[���PKg}[s�%���%��$ri/1.8/system/Bignum/remainder-i.yamlnu�[���PKg}[U�0���$��$ri/1.8/system/Bignum/power%21-i.yamlnu�[���PKg}[���11"�$ri/1.8/system/Bignum/%7e-i.yamlnu�[���PKg}[�rR�� ��$ri/1.8/system/Bignum/rdiv-i.yamlnu�[���PKg}[v���	�	&��$ri/1.8/system/Bignum/cdesc-Bignum.yamlnu�[���PKg}[�?7�77"��$ri/1.8/system/Bignum/%3e%3e-i.yamlnu�[���PKh}[e��F��$ri/1.8/system/Bignum/%2b-i.yamlnu�[���PKh}[�D��77"��$ri/1.8/system/Bignum/%3c%3c-i.yamlnu�[���PKh}[���� b�$ri/1.8/system/Bignum/to_s-i.yamlnu�[���PKh}[��Yp��"f�$ri/1.8/system/Bignum/%3d%3d-i.yamlnu�[���PKh}[� J�"��$ri/1.8/system/Bignum/%2d%40-i.yamlnu�[���PKh}[,��**�$ri/1.8/system/Bignum/div-i.yamlnu�[���PKh}[�cN�)){�$ri/1.8/system/Bignum/%5e-i.yamlnu�[���PKh}[�CgNN ��$ri/1.8/system/Bignum/to_f-i.yamlnu�[���PKh}[�o�OO"��$ri/1.8/system/Bignum/modulo-i.yamlnu�[���PKh}[P�>�2�$ri/1.8/system/Bignum/%2d-i.yamlnu�[���PKh}[� Nǣ�$��$ri/1.8/system/Rinda/cdesc-Rinda.yamlnu�[���PKh}[��A2##)��$ri/1.8/system/Rinda/Template/match-i.yamlnu�[���PKh}[�4}��-�$ri/1.8/system/Rinda/Template/%3d%3d%3d-i.yamlnu�[���PKh}[b.oo0C�$ri/1.8/system/Rinda/Template/cdesc-Template.yamlnu�[���PKh}[�H>>B�$ri/1.8/system/Rinda/WaitTemplateEntry/cdesc-WaitTemplateEntry.yamlnu�[���PKh}[��m��1�$ri/1.8/system/Rinda/WaitTemplateEntry/read-i.yamlnu�[���PKh}[K)%ȴ�1�$ri/1.8/system/Rinda/WaitTemplateEntry/wait-i.yamlnu�[���PKh}[XN���0�$ri/1.8/system/Rinda/WaitTemplateEntry/new-c.yamlnu�[���PKh}[�y��3�$ri/1.8/system/Rinda/WaitTemplateEntry/signal-i.yamlnu�[���PKh}[rϮq��35�$ri/1.8/system/Rinda/WaitTemplateEntry/cancel-i.yamlnu�[���PKh}[$zb���*P�$ri/1.8/system/Rinda/TupleEntry/size-i.yamlnu�[���PKh}[z����,�%ri/1.8/system/Rinda/TupleEntry/%5b%5d-i.yamlnu�[���PKh}[��PPP4�%ri/1.8/system/Rinda/TupleEntry/cdesc-TupleEntry.yamlnu�[���PKh}[�q@���+�%ri/1.8/system/Rinda/TupleEntry/renew-i.yamlnu�[���PKh}[��r���2�	%ri/1.8/system/Rinda/TupleEntry/make_expires-i.yamlnu�[���PKh}[�]����1
%ri/1.8/system/Rinda/TupleEntry/get_renewer-i.yamlnu�[���PKh}[��Kl��)r%ri/1.8/system/Rinda/TupleEntry/new-c.yamlnu�[���PKh}[2,E		0�%ri/1.8/system/Rinda/TupleEntry/make_tuple-i.yamlnu�[���PKh}[T]ɶ��1%ri/1.8/system/Rinda/TupleEntry/canceled%3f-i.yamlnu�[���PKh}[��E+

.n%ri/1.8/system/Rinda/TupleEntry/alive%3f-i.yamlnu�[���PKh}[��t+�%ri/1.8/system/Rinda/TupleEntry/value-i.yamlnu�[���PKh}[�D���,L%ri/1.8/system/Rinda/TupleEntry/cancel-i.yamlnu�[���PKh}[$��z��0�%ri/1.8/system/Rinda/TupleEntry/expired%3f-i.yamlnu�[���PKh}[nFAv��+�%ri/1.8/system/Rinda/TupleEntry/fetch-i.yamlnu�[���PKh}[�`=-�%ri/1.8/system/Rinda/RingFinger/primary-c.yamlnu�[���PKh}[Z9~���1>%ri/1.8/system/Rinda/RingFinger/lookup_ring-i.yamlnu�[���PKh}[X8�*00*/%ri/1.8/system/Rinda/RingFinger/each-i.yamlnu�[���PKh}[��o�dd5� %ri/1.8/system/Rinda/RingFinger/lookup_ring_any-i.yamlnu�[���PKh}[��qL

*�"%ri/1.8/system/Rinda/RingFinger/to_a-i.yamlnu�[���PKh}[�G`�GG4�#%ri/1.8/system/Rinda/RingFinger/cdesc-RingFinger.yamlnu�[���PKh}[?��gtt)�)%ri/1.8/system/Rinda/RingFinger/new-c.yamlnu�[���PKh}[RcW�00,a+%ri/1.8/system/Rinda/RingFinger/finger-c.yamlnu�[���PKh}[|

*�,%ri/1.8/system/Rinda/RingFinger/to_a-c.yamlnu�[���PKh}[/��11HT.%ri/1.8/system/Rinda/RequestCanceledError/cdesc-RequestCanceledError.yamlnu�[���PKh}[7�N�ww.�/%ri/1.8/system/Rinda/TemplateEntry/match-i.yamlnu�[���PKh}[BhA��2�1%ri/1.8/system/Rinda/TemplateEntry/%3d%3d%3d-i.yamlnu�[���PKh}[��w���:3%ri/1.8/system/Rinda/TemplateEntry/cdesc-TemplateEntry.yamlnu�[���PKh}[C�p?		4#5%ri/1.8/system/Rinda/RindaError/cdesc-RindaError.yamlnu�[���PKh}[s�V���:�6%ri/1.8/system/Rinda/SimpleRenewer/cdesc-SimpleRenewer.yamlnu�[���PKh}[�w�.�8%ri/1.8/system/Rinda/SimpleRenewer/renew-i.yamlnu�[���PKh}[��D22,::%ri/1.8/system/Rinda/SimpleRenewer/new-c.yamlnu�[���PKh}[40W���8�;%ri/1.8/system/Rinda/RingProvider/cdesc-RingProvider.yamlnu�[���PKh}[�-{��+�>%ri/1.8/system/Rinda/RingProvider/new-c.yamlnu�[���PKh}[�/�/�@%ri/1.8/system/Rinda/RingProvider/provide-i.yamlnu�[���PKh}[��Q

(B%ri/1.8/system/Rinda/TupleBag/find-i.yamlnu�[���PKh}[l����.C%ri/1.8/system/Rinda/TupleBag/each_entry-i.yamlnu�[���PKh}[Kʻ"��0�D%ri/1.8/system/Rinda/TupleBag/bin_for_find-i.yamlnu�[���PKh}[���>>7�E%ri/1.8/system/Rinda/TupleBag/delete_unless_alive-i.yamlnu�[���PKh}[�*bG%ri/1.8/system/Rinda/TupleBag/delete-i.yamlnu�[���PKh}[юJ*,�H%ri/1.8/system/Rinda/TupleBag/find_all-i.yamlnu�[���PKh}[ _η�+-J%ri/1.8/system/Rinda/TupleBag/bin_key-i.yamlnu�[���PKh}[�G4��(?K%ri/1.8/system/Rinda/TupleBag/push-i.yamlnu�[���PKi}[�D��TT5�L%ri/1.8/system/Rinda/TupleBag/find_all_template-i.yamlnu�[���PKi}[���DD0HN%ri/1.8/system/Rinda/TupleBag/cdesc-TupleBag.yamlnu�[���PKi}[W$���1�Q%ri/1.8/system/Rinda/TupleBag/TupleBin/find-i.yamlnu�[���PKi}[���1��3S%ri/1.8/system/Rinda/TupleBag/TupleBin/delete-i.yamlnu�[���PKi}[�O��04T%ri/1.8/system/Rinda/TupleBag/TupleBin/add-i.yamlnu�[���PKi}[+~��0LU%ri/1.8/system/Rinda/TupleBag/TupleBin/new-c.yamlnu�[���PKi}[1�Փ��9_V%ri/1.8/system/Rinda/TupleBag/TupleBin/cdesc-TupleBin.yamlnu�[���PKi}[^}l##2LX%ri/1.8/system/Rinda/TupleBag/has_expires%3f-i.yamlnu�[���PKi}[f�_''*�Y%ri/1.8/system/Rinda/TupleSpace/move-i.yamlnu�[���PKi}[�:�[((*R[%ri/1.8/system/Rinda/TupleSpace/read-i.yamlnu�[���PKi}[�>N,,.�\%ri/1.8/system/Rinda/TupleSpace/read_all-i.yamlnu�[���PKi}[��8�II2^^%ri/1.8/system/Rinda/TupleSpace/notify_event-i.yamlnu�[���PKi}[)c���*	`%ri/1.8/system/Rinda/TupleSpace/take-i.yamlnu�[���PKi}[8�9�)aa%ri/1.8/system/Rinda/TupleSpace/new-c.yamlnu�[���PKi}[�;���,�c%ri/1.8/system/Rinda/TupleSpace/notify-i.yamlnu�[���PKi}[-�H1��+�g%ri/1.8/system/Rinda/TupleSpace/write-i.yamlnu�[���PKi}[Nʻb��4	i%ri/1.8/system/Rinda/TupleSpace/cdesc-TupleSpace.yamlnu�[���PKi}[!�m���0.n%ri/1.8/system/Rinda/TupleSpace/keep_clean-i.yamlnu�[���PKi}[V�B���2�o%ri/1.8/system/Rinda/TupleSpace/create_entry-i.yamlnu�[���PKi}[cj�4�p%ri/1.8/system/Rinda/TupleSpace/need_keeper%3f-i.yamlnu�[���PKi}[����!!2$r%ri/1.8/system/Rinda/TupleSpace/start_keeper-i.yamlnu�[���PKi}[-�4xx4�s%ri/1.8/system/Rinda/RingServer/cdesc-RingServer.yamlnu�[���PKi}[���^'')�x%ri/1.8/system/Rinda/RingServer/new-c.yamlnu�[���PKi}[�s�$ii.z%ri/1.8/system/Rinda/RingServer/do_write-i.yamlnu�[���PKi}[��~�883�{%ri/1.8/system/Rinda/RingServer/write_service-i.yamlnu�[���PKi}[�
Pg''3e}%ri/1.8/system/Rinda/RingServer/reply_service-i.yamlnu�[���PKi}[o���CC.�~%ri/1.8/system/Rinda/RingServer/do_reply-i.yamlnu�[���PKi}[6u�55F��%ri/1.8/system/Rinda/InvalidHashTupleKey/cdesc-InvalidHashTupleKey.yamlnu�[���PKi}[K;6S//F;�%ri/1.8/system/Rinda/RequestExpiredError/cdesc-RequestExpiredError.yamlnu�[���PKi}[�e��33/�%ri/1.8/system/Rinda/TupleSpaceProxy/read-i.yamlnu�[���PKi}[�{�BB3r�%ri/1.8/system/Rinda/TupleSpaceProxy/read_all-i.yamlnu�[���PKi}[ ���OO>�%ri/1.8/system/Rinda/TupleSpaceProxy/cdesc-TupleSpaceProxy.yamlnu�[���PKi}[����33/ԉ%ri/1.8/system/Rinda/TupleSpaceProxy/take-i.yamlnu�[���PKi}[�q'�		.f�%ri/1.8/system/Rinda/TupleSpaceProxy/new-c.yamlnu�[���PKi}[�4��NN1͌%ri/1.8/system/Rinda/TupleSpaceProxy/notify-i.yamlnu�[���PKi}[�wC�++0|�%ri/1.8/system/Rinda/TupleSpaceProxy/write-i.yamlnu�[���PKi}[�6j==0�%ri/1.8/system/Rinda/DRbObjectTemplate/new-c.yamlnu�[���PKi}[�(�^^6��%ri/1.8/system/Rinda/DRbObjectTemplate/%3d%3d%3d-i.yamlnu�[���PKi}[���GhhBh�%ri/1.8/system/Rinda/DRbObjectTemplate/cdesc-DRbObjectTemplate.yamlnu�[���PKi}[�A3�;;3B�%ri/1.8/system/Rinda/NotifyTemplateEntry/each-i.yamlnu�[���PKi}[�
#442�%ri/1.8/system/Rinda/NotifyTemplateEntry/pop-i.yamlnu�[���PKi}[�:q\^^2v�%ri/1.8/system/Rinda/NotifyTemplateEntry/new-c.yamlnu�[���PKi}[S,�((56�%ri/1.8/system/Rinda/NotifyTemplateEntry/notify-i.yamlnu�[���PKi}[Y��nnFÛ%ri/1.8/system/Rinda/NotifyTemplateEntry/cdesc-NotifyTemplateEntry.yamlnu�[���PKi}[W2>Q

.��%ri/1.8/system/Rinda/Tuple/init_with_ary-i.yamlnu�[���PKi}[k��J��%�%ri/1.8/system/Rinda/Tuple/size-i.yamlnu�[���PKi}[U�[���'U�%ri/1.8/system/Rinda/Tuple/%5b%5d-i.yamlnu�[���PKi}[�J�((*��%ri/1.8/system/Rinda/Tuple/cdesc-Tuple.yamlnu�[���PKi}[�
��ZZ%$�%ri/1.8/system/Rinda/Tuple/each-i.yamlnu�[���PKi}[�I�f��(ө%ri/1.8/system/Rinda/Tuple/hash%3f-i.yamlnu�[���PKi}[f��W

/�%ri/1.8/system/Rinda/Tuple/init_with_hash-i.yamlnu�[���PKi}[��1##$M�%ri/1.8/system/Rinda/Tuple/new-c.yamlnu�[���PKi}[Ä
��&ĭ%ri/1.8/system/Rinda/Tuple/value-i.yamlnu�[���PKi}[3*��&�%ri/1.8/system/Rinda/Tuple/fetch-i.yamlnu�[���PKi}[8A��(M�%ri/1.8/system/ParseDate/parsedate-i.yamlnu�[���PKi}[̊�e��,��%ri/1.8/system/ParseDate/cdesc-ParseDate.yamlnu�[���PKi}[_]*��"�%ri/1.8/system/Singleton/dup-i.yamlnu�[���PKi}[k�a��,�%ri/1.8/system/Singleton/cdesc-Singleton.yamlnu�[���PKi}[}i�d��$��%ri/1.8/system/Singleton/clone-i.yamlnu�[���PKi}[ųK���$0�%ri/1.8/system/Singleton/_dump-i.yamlnu�[���PKi}[�K3�� t�%ri/1.8/system/DateTime/jd-c.yamlnu�[���PKi}[��9#�%ri/1.8/system/DateTime/civil-c.yamlnu�[���PKi}[�����#��%ri/1.8/system/DateTime/parse-c.yamlnu�[���PKi}[�����'�%ri/1.8/system/DateTime/_strptime-c.yamlnu�[���PKi}[.�#%��&�%ri/1.8/system/DateTime/strftime-i.yamlnu�[���PKi}[��z���&(�%ri/1.8/system/DateTime/strptime-c.yamlnu�[���PKi}[O�6~��"�%ri/1.8/system/DateTime/to_s-i.yamlnu�[���PKi}[)ƸQSS(\�%ri/1.8/system/DateTime/commercial-c.yamlnu�[���PKi}[d~�z�	�	*�%ri/1.8/system/DateTime/cdesc-DateTime.yamlnu�[���PKi}[^N�%X�%ri/1.8/system/DateTime/ordinal-c.yamlnu�[���PKi}[R�
�� ��%ri/1.8/system/List/update-i.yamlnu�[���PKi}[��0%��%ri/1.8/system/List/each_option-i.yamlnu�[���PKi}[�	��"p�%ri/1.8/system/List/cdesc-List.yamlnu�[���PKi}[R�����%ri/1.8/system/List/new-c.yamlnu�[���PKi}[��7@�� �%ri/1.8/system/List/append-i.yamlnu�[���PKi}[�{�m�� �%ri/1.8/system/List/reject-i.yamlnu�[���PKi}[�t��� �%ri/1.8/system/List/accept-i.yamlnu�[���PKi}[V�wVff d&ri/1.8/system/List/search-i.yamlnu�[���PKi}[#4̶��"&ri/1.8/system/List/complete-i.yamlnu�[���PKi}[�Yb��#T&ri/1.8/system/List/summarize-i.yamlnu�[���PKi}[�<j��!>&ri/1.8/system/List/prepend-i.yamlnu�[���PKi}[��]7��"
&ri/1.8/system/GServer/serve-i.yamlnu�[���PKj}[[�f��%&ri/1.8/system/GServer/shutdown-i.yamlnu�[���PKj}[���'&ri/1.8/system/GServer/stopped%3f-i.yamlnu�[���PKj}[�AMs��!
&ri/1.8/system/GServer/stop-i.yamlnu�[���PKj}[V���!
&ri/1.8/system/GServer/stop-c.yamlnu�[���PKj}[��#���%&ri/1.8/system/GServer/starting-i.yamlnu�[���PKj}[�E2���"&ri/1.8/system/GServer/error-i.yamlnu�[���PKj}[�X>��*&ri/1.8/system/GServer/in_service%3f-c.yamlnu�[���PKj}[�肏��*>&ri/1.8/system/GServer/disconnecting-i.yamlnu�[���PKj}[�@h�� Z&ri/1.8/system/GServer/log-i.yamlnu�[���PKj}[�r'�� Q&ri/1.8/system/GServer/new-c.yamlnu�[���PKj}[�����"�&ri/1.8/system/GServer/start-i.yamlnu�[���PKj}[S6~~(�&ri/1.8/system/GServer/cdesc-GServer.yamlnu�[���PKj}[A����!'&ri/1.8/system/GServer/join-i.yamlnu�[���PKj}[б�(s(&ri/1.8/system/GServer/connections-i.yamlnu�[���PKj}[ncG���'|)&ri/1.8/system/GServer/connecting-i.yamlnu�[���PKj}[�т��%�*&ri/1.8/system/GServer/stopping-i.yamlnu�[���PKj}[�I�ZZ5�+&ri/1.8/system/TemplatePage/Context/find_scalar-i.yamlnu�[���PKj}[	N�8��-M-&ri/1.8/system/TemplatePage/Context/pop-i.yamlnu�[���PKj}[��8K��-Y.&ri/1.8/system/TemplatePage/Context/new-c.yamlnu�[���PKj}[��YI0e/&ri/1.8/system/TemplatePage/Context/lookup-i.yamlnu�[���PKj}[e�*õ�.�0&ri/1.8/system/TemplatePage/Context/push-i.yamlnu�[���PKj}[	�cW��5�1&ri/1.8/system/TemplatePage/Context/cdesc-Context.yamlnu�[���PKj}[��ju��/�4&ri/1.8/system/TemplatePage/write_html_on-i.yamlnu�[���PKj}[�Q����%7&ri/1.8/system/TemplatePage/new-c.yamlnu�[���PKj}[�O�)

19:&ri/1.8/system/TemplatePage/substitute_into-i.yamlnu�[���PKj}["+MM-�=&ri/1.8/system/TemplatePage/expand_line-i.yamlnu�[���PKj}[-��
��1N?&ri/1.8/system/TemplatePage/LineReader/read-i.yamlnu�[���PKj}[�TFF7�@&ri/1.8/system/TemplatePage/LineReader/read_up_to-i.yamlnu�[���PKj}[D�bn0GB&ri/1.8/system/TemplatePage/LineReader/dup-i.yamlnu�[���PKj}[Bo�R0�C&ri/1.8/system/TemplatePage/LineReader/new-c.yamlnu�[���PKj}[�s���;&E&ri/1.8/system/TemplatePage/LineReader/cdesc-LineReader.yamlnu�[���PKj}[�&TT2iG&ri/1.8/system/TemplatePage/cdesc-TemplatePage.yamlnu�[���PKj}[�
����&O&ri/1.8/system/PrettyPrint/flush-i.yamlnu�[���PKj}[�d%tt2YP&ri/1.8/system/PrettyPrint/singleline_format-c.yamlnu�[���PKj}[��߹�./S&ri/1.8/system/PrettyPrint/current_group-i.yamlnu�[���PKj}[U�g�0FT&ri/1.8/system/PrettyPrint/Group/cdesc-Group.yamlnu�[���PKj}[Hϭ���/�V&ri/1.8/system/PrettyPrint/Group/break%3f-i.yamlnu�[���PKj}[봡��*�W&ri/1.8/system/PrettyPrint/Group/new-c.yamlnu�[���PKj}[�F;���,�X&ri/1.8/system/PrettyPrint/Group/break-i.yamlnu�[���PKj}[���s��/�Y&ri/1.8/system/PrettyPrint/Group/first%3f-i.yamlnu�[���PKj}[��5�Z&ri/1.8/system/PrettyPrint/break_outmost_groups-i.yamlnu�[���PKj}[ON>;nn$\&ri/1.8/system/PrettyPrint/new-c.yamlnu�[���PKj}[H����'�`&ri/1.8/system/PrettyPrint/format-c.yamlnu�[���PKj}[�����1c&ri/1.8/system/PrettyPrint/SingleLine/flush-i.yamlnu�[���PKj}[T��&��/.d&ri/1.8/system/PrettyPrint/SingleLine/new-c.yamlnu�[���PKj}[�Jf��0_e&ri/1.8/system/PrettyPrint/SingleLine/nest-i.yamlnu�[���PKj}[�=��0�f&ri/1.8/system/PrettyPrint/SingleLine/text-i.yamlnu�[���PKj}[��4j:�g&ri/1.8/system/PrettyPrint/SingleLine/cdesc-SingleLine.yamlnu�[���PKj}[a=^���5'j&ri/1.8/system/PrettyPrint/SingleLine/breakable-i.yamlnu�[���PKj}[.�1[k&ri/1.8/system/PrettyPrint/SingleLine/group-i.yamlnu�[���PKj}[�8Ʌ��4�l&ri/1.8/system/PrettyPrint/SingleLine/first%3f-i.yamlnu�[���PKj}[�ܠ���*�m&ri/1.8/system/PrettyPrint/group_sub-i.yamlnu�[���PKj}[�99%�n&ri/1.8/system/PrettyPrint/nest-i.yamlnu�[���PKj}[76�x��0�p&ri/1.8/system/PrettyPrint/cdesc-PrettyPrint.yamlnu�[���PKj}[0m3���%a}&ri/1.8/system/PrettyPrint/text-i.yamlnu�[���PKj}[��d��*7&ri/1.8/system/PrettyPrint/breakable-i.yamlnu�[���PKj}[ӌE��/1�&ri/1.8/system/PrettyPrint/fill_breakable-i.yamlnu�[���PKj}[�Y��/d�&ri/1.8/system/PrettyPrint/GroupQueue/deq-i.yamlnu�[���PKj}['(2��/t�&ri/1.8/system/PrettyPrint/GroupQueue/enq-i.yamlnu�[���PKj}[Ic�t��2��&ri/1.8/system/PrettyPrint/GroupQueue/delete-i.yamlnu�[���PKj}[S��q��/��&ri/1.8/system/PrettyPrint/GroupQueue/new-c.yamlnu�[���PKj}[T>��:��&ri/1.8/system/PrettyPrint/GroupQueue/cdesc-GroupQueue.yamlnu�[���PKj}[�s����&��&ri/1.8/system/PrettyPrint/group-i.yamlnu�[���PKj}[�olL��1��&ri/1.8/system/PrettyPrint/Breakable/output-i.yamlnu�[���PKj}[�1�[��.&�&ri/1.8/system/PrettyPrint/Breakable/new-c.yamlnu�[���PKj}[9/���8A�&ri/1.8/system/PrettyPrint/Breakable/cdesc-Breakable.yamlnu�[���PKj}[��&P��)��&ri/1.8/system/PrettyPrint/first%3f-i.yamlnu�[���PKj}[�n�%��,t�&ri/1.8/system/PrettyPrint/Text/output-i.yamlnu�[���PKj}[/���.��&ri/1.8/system/PrettyPrint/Text/cdesc-Text.yamlnu�[���PKj}[.-µ�)v�&ri/1.8/system/PrettyPrint/Text/add-i.yamlnu�[���PKj}[��#.��)��&ri/1.8/system/PrettyPrint/Text/new-c.yamlnu�[���PKj}[�E�#��&ri/1.8/system/StringIO/flush-i.yamlnu�[���PKj}[)(qe��&��&ri/1.8/system/StringIO/readbyte-i.yamlnu�[���PKj}[w!O�MM#J�&ri/1.8/system/StringIO/lines-i.yamlnu�[���PKj}[��K#�&ri/1.8/system/StringIO/chars-i.yamlnu�[���PKj}[���		"E�&ri/1.8/system/StringIO/size-i.yamlnu�[���PKj}[ۂ����#��&ri/1.8/system/StringIO/fcntl-i.yamlnu�[���PKj}[Dl�F#�&ri/1.8/system/StringIO/fsync-i.yamlnu�[���PKj}[�T1�#>�&ri/1.8/system/StringIO/print-i.yamlnu�[���PKj}[W/�$��&ri/1.8/system/StringIO/printf-i.yamlnu�[���PKj}[���KK"�&ri/1.8/system/StringIO/each-i.yamlnu�[���PKj}[��Dk55$��&ri/1.8/system/StringIO/lineno-i.yamlnu�[���PKj}[ܤb�$9�&ri/1.8/system/StringIO/string-i.yamlnu�[���PKj}[d�?"��&ri/1.8/system/StringIO/read-i.yamlnu�[���PKj}[��{

&�&ri/1.8/system/StringIO/readline-i.yamlnu�[���PKj}[)Yz6UU't�&ri/1.8/system/StringIO/each_line-i.yamlnu�[���PKj}[cOi% �&ri/1.8/system/StringIO/sysread-i.yamlnu�[���PKj}[k��V  %�&ri/1.8/system/StringIO/binmode-i.yamlnu�[���PKj}[�p"i�&ri/1.8/system/StringIO/path-i.yamlnu�[���PKj}[i��!ʴ&ri/1.8/system/StringIO/pid-i.yamlnu�[���PKj}[Rf�55"'�&ri/1.8/system/StringIO/tell-i.yamlnu�[���PKj}[b��/XX(��&ri/1.8/system/StringIO/close_read-i.yamlnu�[���PKj}[��6���$^�&ri/1.8/system/StringIO/rewind-i.yamlnu�[���PKj}[P 6��%Z�&ri/1.8/system/StringIO/getbyte-i.yamlnu�[���PKj}[�W�$��&ri/1.8/system/StringIO/ungetc-i.yamlnu�[���PKj}[��߇�!�&ri/1.8/system/StringIO/eof-i.yamlnu�[���PKj}[�>W55!�&ri/1.8/system/StringIO/new-c.yamlnu�[���PKj}[*=ii]]'y�&ri/1.8/system/StringIO/lineno%3d-i.yamlnu�[���PKj}[Yh1q'-�&ri/1.8/system/StringIO/each_byte-i.yamlnu�[���PKj}["Y{�,,$��&ri/1.8/system/StringIO/isatty-i.yamlnu�[���PKj}[� �

#�&ri/1.8/system/StringIO/write-i.yamlnu�[���PKj}[<�j&t�&ri/1.8/system/StringIO/syswrite-i.yamlnu�[���PKj}[�+2�HH'��&ri/1.8/system/StringIO/closed%3f-i.yamlnu�[���PKk}[{�r
"|�&ri/1.8/system/StringIO/gets-i.yamlnu�[���PKk}[��QT��$��&ri/1.8/system/StringIO/eof%3f-i.yamlnu�[���PKk}[}#��

$��&ri/1.8/system/StringIO/length-i.yamlnu�[���PKk}[(2-^^&`�&ri/1.8/system/StringIO/truncate-i.yamlnu�[���PKk}[��>;��$�&ri/1.8/system/StringIO/%3c%3c-i.yamlnu�[���PKk}[�STu��$[�&ri/1.8/system/StringIO/reopen-i.yamlnu�[���PKk}[�33!E�&ri/1.8/system/StringIO/pos-i.yamlnu�[���PKk}[lVD���"��&ri/1.8/system/StringIO/getc-i.yamlnu�[���PKk}[s��(($�&ri/1.8/system/StringIO/tty%3f-i.yamlnu�[���PKk}[@�K\��"��&ri/1.8/system/StringIO/putc-i.yamlnu�[���PKk}[��dii#��&ri/1.8/system/StringIO/close-i.yamlnu�[���PKk}[�;�)'��&ri/1.8/system/StringIO/each_char-i.yamlnu�[���PKk}[���bb"��&ri/1.8/system/StringIO/seek-i.yamlnu�[���PKk}[G1RR,��&ri/1.8/system/StringIO/closed_read%3f-i.yamlnu�[���PKk}[Sll))%T�&ri/1.8/system/StringIO/sync%3d-i.yamlnu�[���PKk}[T[S5��&��&ri/1.8/system/StringIO/readchar-i.yamlnu�[���PKk}[$9$&�&ri/1.8/system/StringIO/fileno-i.yamlnu�[���PKk}[���;��"��&ri/1.8/system/StringIO/sync-i.yamlnu�[���PKk}[9�:('��&ri/1.8/system/StringIO/readlines-i.yamlnu�[���PKk}[)y��$$$G�&ri/1.8/system/StringIO/pos%3d-i.yamlnu�[���PKk}[?�X&&'��&ri/1.8/system/StringIO/string%3d-i.yamlnu�[���PKk}[*n���"<�&ri/1.8/system/StringIO/puts-i.yamlnu�[���PKk}[��/�
�
*��&ri/1.8/system/StringIO/cdesc-StringIO.yamlnu�[���PKk}[.���UU-k�&ri/1.8/system/StringIO/closed_write%3f-i.yamlnu�[���PKk}[ʨM�]])�&ri/1.8/system/StringIO/close_write-i.yamlnu�[���PKk}[
�ʷ#�&ri/1.8/system/StringIO/bytes-i.yamlnu�[���PKk}[�U1���".�&ri/1.8/system/StringIO/open-c.yamlnu�[���PKk}[�,���!''ri/1.8/system/String/lines-i.yamlnu�[���PKk}[dֵn��"�'ri/1.8/system/String/center-i.yamlnu�[���PKk}[`�J!"'ri/1.8/system/String/chars-i.yamlnu�[���PKk}[z�] �	'ri/1.8/system/String/size-i.yamlnu�[���PKk}[/֘&�
'ri/1.8/system/String/reverse%21-i.yamlnu�[���PKk}[Z�
N**"?'ri/1.8/system/String/eql%3f-i.yamlnu�[���PKk}[���|	|	!�
'ri/1.8/system/String/slice-i.yamlnu�[���PKk}[���[[$�'ri/1.8/system/String/slice%21-i.yamlnu�[���PKk}[��
��7'ri/1.8/system/String/tr-i.yamlnu�[���PKk}[F�����!9 'ri/1.8/system/String/crypt-i.yamlnu�[���PKk}[<p���]"'ri/1.8/system/String/%25-i.yamlnu�[���PKl}[R��x	x	"�%'ri/1.8/system/String/%5b%5d-i.yamlnu�[���PKl}[���#e/'ri/1.8/system/String/toutf16-i.yamlnu�[���PKl}[�kGk��"�1'ri/1.8/system/String/tosjis-i.yamlnu�[���PKl}[[��~��$�3'ri/1.8/system/String/empty%3f-i.yamlnu�[���PKl}[�zEhee�5'ri/1.8/system/String/hex-i.yamlnu�[���PKl}[&���!I8'ri/1.8/system/String/strip-i.yamlnu�[���PKl}[CKv��"u:'ri/1.8/system/String/%3d%7e-i.yamlnu�[���PKl}[��e�� y='ri/1.8/system/String/each-i.yamlnu�[���PKm}[y��4!4!&�B'ri/1.8/system/String/cdesc-String.yamlnu�[���PKm}[�k�e��-d'ri/1.8/system/String/is_binary_data%3f-i.yamlnu�[���PKm}[ϯG�ll#0e'ri/1.8/system/String/succ%21-i.yamlnu�[���PKm}[�-s2��#�f'ri/1.8/system/String/squeeze-i.yamlnu�[���PKn}[�
֑�%�j'ri/1.8/system/String/%3c%3d%3e-i.yamlnu�[���PKn}[�Rp� �p'ri/1.8/system/String/to_i-i.yamlnu�[���PKn}[��B�(( u'ri/1.8/system/String/gsub-i.yamlnu�[���PKn}[`�F��*�|'ri/1.8/system/String/expand_ch_hash-i.yamlnu�[���PKn}[ܦ$
!�}'ri/1.8/system/String/kconv-i.yamlnu�[���PKn}[
��J��!�'ri/1.8/system/String/scanf-i.yamlnu�[���PKn}[�>�NN�'ri/1.8/system/String/oct-i.yamlnu�[���PKn}[��d33!��'ri/1.8/system/String/chomp-i.yamlnu�[���PKn}[��$,�'ri/1.8/system/String/downcase-i.yamlnu�[���PKn}[|~��SS"��'ri/1.8/system/String/unpack-i.yamlnu�[���PKn}[:����#,�'ri/1.8/system/String/gsub%21-i.yamlnu�[���PKn}[^"��">�'ri/1.8/system/String/isutf8-i.yamlnu�[���PKn}[׊���#�'ri/1.8/system/String/jlength-i.yamlnu�[���PKn}[��0p��!5�'ri/1.8/system/String/rjust-i.yamlnu�[���PKn}[���,��%j�'ri/1.8/system/String/each_line-i.yamlnu�[���PKn}[�nk���#��'ri/1.8/system/String/to_yaml-i.yamlnu�[���PKn}[Hc�~�� ��'ri/1.8/system/String/upto-i.yamlnu�[���PKn}[%c���"��'ri/1.8/system/String/concat-i.yamlnu�[���PKn}[��g�}}!��'ri/1.8/system/String/tr%21-i.yamlnu�[���PKn}[�!U���!N�'ri/1.8/system/String/jsize-i.yamlnu�[���PKn}[R�2 |�'ri/1.8/system/String/hash-i.yamlnu�[���PKn}[	�25%��'ri/1.8/system/String/rstrip%21-i.yamlnu�[���PKn}[rh^���'Q�'ri/1.8/system/String/block_scanf-i.yamlnu�[���PKo}[UG5"x�'ri/1.8/system/String/rstrip-i.yamlnu�[���PKo}[
6��@@%��'ri/1.8/system/String/upcase%21-i.yamlnu�[���PKo}[K|��"c�'ri/1.8/system/String/delete-i.yamlnu�[���PKo}[� ��'ri/1.8/system/String/next-i.yamlnu�[���PKo}[`)=B��$4�'ri/1.8/system/String/chomp%21-i.yamlnu�[���PKo}[�׻�$�'ri/1.8/system/String/yaml_new-c.yamlnu�[���PKo}[�������'ri/1.8/system/String/%2a-i.yamlnu�[���PKo}[�>LHH'�'ri/1.8/system/String/downcase%21-i.yamlnu�[���PKo}[΁�H??)��'ri/1.8/system/String/start_with%3f-i.yamlnu�[���PKo}[��H���(=�'ri/1.8/system/String/_regex_quote-i.yamlnu�[���PKo}[4�U��!K�'ri/1.8/system/String/ljust-i.yamlnu�[���PKo}[�O*��!�'ri/1.8/system/String/index-i.yamlnu�[���PKo}[U�S���&��'ri/1.8/system/String/squeeze%21-i.yamlnu�[���PKo}[�)��~~!��'ri/1.8/system/String/match-i.yamlnu�[���PKo}[��
::#a�'ri/1.8/system/String/next%21-i.yamlnu�[���PKo}[��/W"��'ri/1.8/system/String/to_str-i.yamlnu�[���PKo}[KQ��$L�'ri/1.8/system/String/bytesize-i.yamlnu�[���PKp}[^cܪ��#��'ri/1.8/system/String/inspect-i.yamlnu�[���PKp}[�Z�G��"��'ri/1.8/system/String/sub%21-i.yamlnu�[���PKp}[�2AA&��'ri/1.8/system/String/capitalize-i.yamlnu�[���PKp}[�ÿ�## b�'ri/1.8/system/String/scan-i.yamlnu�[���PKp}[}H9Vnn&�'ri/1.8/system/String/shellsplit-i.yamlnu�[���PKp}[۴[�II&��'ri/1.8/system/String/include%3f-i.yamlnu�[���PKp}[���%%8�'ri/1.8/system/String/new-c.yamlnu�[���PKp}[����#��'ri/1.8/system/String/reverse-i.yamlnu�[���PKp}[�S/k��&�(ri/1.8/system/String/end_regexp-i.yamlnu�[���PKp}[��ܫpp"�(ri/1.8/system/String/intern-i.yamlnu�[���PKp}[4��}PP!b(ri/1.8/system/String/split-i.yamlnu�[���PKp}[qo)L��%(ri/1.8/system/String/delete%21-i.yamlnu�[���PKp}[ɡW�pp"(ri/1.8/system/String/to_sym-i.yamlnu�[���PKp}[�c��#�(ri/1.8/system/String/replace-i.yamlnu�[���PKp}[.�}��%(ri/1.8/system/String/partition-i.yamlnu�[���PKp}[�VŪ� d(ri/1.8/system/String/tr_s-i.yamlnu�[���PKp}[r�ʍ%^(ri/1.8/system/String/each_byte-i.yamlnu�[���PKp}[�C���!�(ri/1.8/system/String/tojis-i.yamlnu�[���PKp}[�Ip}}'�!(ri/1.8/system/String/swapcase%21-i.yamlnu�[���PKp}[t�8��"�#(ri/1.8/system/String/issjis-i.yamlnu�[���PKp}[�+�		+}%(ri/1.8/system/String/initialize_copy-i.yamlnu�[���PKp}[!��c��"�'(ri/1.8/system/String/rindex-i.yamlnu�[���PKp}[�R���)%,(ri/1.8/system/String/original_succ-i.yamlnu�[���PKp}[��:��"i-(ri/1.8/system/String/upcase-i.yamlnu�[���PKp}[4M=@��"�/(ri/1.8/system/String/toutf8-i.yamlnu�[���PKp}[0k��"�1(ri/1.8/system/String/length-i.yamlnu�[���PKp}[әM�))$)3(ri/1.8/system/String/swapcase-i.yamlnu�[���PKp}[�FS���5(ri/1.8/system/String/%2b-i.yamlnu�[���PKp}[�'�=��"�7(ri/1.8/system/String/%3c%3c-i.yamlnu�[���PKp}[�		�EE)�:(ri/1.8/system/String/capitalize%21-i.yamlnu�[���PKp}[J����#>=(ri/1.8/system/String/chop%21-i.yamlnu�[���PKp}[I�����,5>(ri/1.8/system/String/original_succ%21-i.yamlnu�[���PKp}[ݶk�RR#?(ri/1.8/system/String/casecmp-i.yamlnu�[���PKp}[�ɴ��� $B(ri/1.8/system/String/succ-i.yamlnu�[���PKp}[|���!C(ri/1.8/system/String/toeuc-i.yamlnu�[���PKp}[2dШ�%(E(ri/1.8/system/String/mbchar%3f-i.yamlnu�[���PKp}[gi %F(ri/1.8/system/String/to_s-i.yamlnu�[���PKp}[Dr�%}G(ri/1.8/system/String/lstrip%21-i.yamlnu�[���PKp}[�����"�I(ri/1.8/system/String/%3d%3d-i.yamlnu�[���PKp}[���xx"�K(ri/1.8/system/String/insert-i.yamlnu�[���PKp}[�_��%�O(ri/1.8/system/String/each_char-i.yamlnu�[���PKp}[�r�d���Q(ri/1.8/system/String/sub-i.yamlnu�[���PKp}[u�"�Y(ri/1.8/system/String/sum-i.yamlnu�[���PKp}[f��zz#_[(ri/1.8/system/String/tr_s%21-i.yamlnu�[���PKp}[���hh ,](ri/1.8/system/String/dump-i.yamlnu�[���PKp}[�.�Q��&�^(ri/1.8/system/String/_expand_ch-i.yamlnu�[���PKp}[�(��"�_(ri/1.8/system/String/lstrip-i.yamlnu�[���PKp}[@�@XX$Ab(ri/1.8/system/String/strip%21-i.yamlnu�[���PKp}[�DZ��.�c(ri/1.8/system/String/is_complex_yaml%3f-i.yamlnu�[���PKp}[������ e(ri/1.8/system/String/to_f-i.yamlnu�[���PKp}[=e@W��%h(ri/1.8/system/String/%5b%5d%3d-i.yamlnu�[���PKp}[���&!@m(ri/1.8/system/String/iseuc-i.yamlnu�[���PKp}[�8���� o(ri/1.8/system/String/chop-i.yamlnu�[���PKp}[
qgQ��&p(ri/1.8/system/String/rpartition-i.yamlnu�[���PKp}[��!;s(ri/1.8/system/String/count-i.yamlnu�[���PKq}[.�77'�v(ri/1.8/system/String/end_with%3f-i.yamlnu�[���PKq}[�#t��"6x(ri/1.8/system/String/jcount-i.yamlnu�[���PKq}[�n��nn'1y(ri/1.8/system/String/shellescape-i.yamlnu�[���PKq}[�9b��!�z(ri/1.8/system/String/bytes-i.yamlnu�[���PKq}[���}'A}(ri/1.8/system/Benchmark/realtime-i.yamlnu�[���PKq}[����BB!�~(ri/1.8/system/Benchmark/bm-i.yamlnu�[���PKq}[�Vu2AA#F�(ri/1.8/system/Benchmark/bmbm-i.yamlnu�[���PKq}[ʻ��dd*ڊ(ri/1.8/system/Benchmark/Job/cdesc-Job.yamlnu�[���PKq}[�I�11&��(ri/1.8/system/Benchmark/measure-i.yamlnu�[���PKq}[m�;���,�(ri/1.8/system/Benchmark/cdesc-Benchmark.yamlnu�[���PKq}[��G�??(A�(ri/1.8/system/Benchmark/benchmark-i.yamlnu�[���PKq}[h�D(]]0ج(ri/1.8/system/Benchmark/Report/cdesc-Report.yamlnu�[���PKq}[F�+D��)��(ri/1.8/system/Benchmark/Tms/add%21-i.yamlnu�[���PKq}[�H	rr'ۯ(ri/1.8/system/Benchmark/Tms/to_a-i.yamlnu�[���PKq}[��Yvv&��(ri/1.8/system/Benchmark/Tms/%2f-i.yamlnu�[���PKq}[�B��-p�(ri/1.8/system/Benchmark/Tms/memberwise-i.yamlnu�[���PKq}[�vEE&��(ri/1.8/system/Benchmark/Tms/%2a-i.yamlnu�[���PKq}[I�kk&&�(ri/1.8/system/Benchmark/Tms/add-i.yamlnu�[���PKq}[��6�&�(ri/1.8/system/Benchmark/Tms/new-c.yamlnu�[���PKq}[��f��&R�(ri/1.8/system/Benchmark/Tms/%2b-i.yamlnu�[���PKq}[��s.55)8�(ri/1.8/system/Benchmark/Tms/format-i.yamlnu�[���PKq}[�A�£�*��(ri/1.8/system/Benchmark/Tms/cdesc-Tms.yamlnu�[���PKq}[����'��(ri/1.8/system/Benchmark/Tms/to_s-i.yamlnu�[���PKq}[I�v[[&��(ri/1.8/system/Benchmark/Tms/%2d-i.yamlnu�[���PKq}[x�Ԍ�.��(ri/1.8/system/BasicSocket/recv_nonblock-i.yamlnu�[���PKq}[j�`�+��(ri/1.8/system/BasicSocket/setsockopt-i.yamlnu�[���PKq}[9�&���+�(ri/1.8/system/BasicSocket/getsockopt-i.yamlnu�[���PKq}[J�d�0��(ri/1.8/system/BasicSocket/cdesc-BasicSocket.yamlnu�[���PKq}[�����T�(ri/1.8/system/Dir/chroot-c.yamlnu�[���PKq}[*�v��G�(ri/1.8/system/Dir/delete-c.yamlnu�[���PKq}[�M���� �(ri/1.8/system/Dir/cdesc-Dir.yamlnu�[���PKq}[��.cuuH�(ri/1.8/system/Dir/each-i.yamlnu�[���PKq}[��s��
�

)ri/1.8/system/Dir/glob-c.yamlnu�[���PKq}[/��/)ri/1.8/system/Dir/read-i.yamlnu�[���PKq}[�5��� �)ri/1.8/system/Dir/foreach-c.yamlnu�[���PKq}[����])ri/1.8/system/Dir/path-i.yamlnu�[���PKq}[O;�e��7)ri/1.8/system/Dir/pwd-c.yamlnu�[���PKq}[,��J��B)ri/1.8/system/Dir/tell-i.yamlnu�[���PKq}[g����e)ri/1.8/system/Dir/tmpdir-c.yamlnu�[���PKq}[�������)ri/1.8/system/Dir/rewind-i.yamlnu�[���PKq}[�R7�

 �)ri/1.8/system/Dir/inspect-i.yamlnu�[���PKr}[jj�y()ri/1.8/system/Dir/new-c.yamlnu�[���PKr}[�輓���)ri/1.8/system/Dir/getwd-c.yamlnu�[���PKr}[�Y����!)ri/1.8/system/Dir/unlink-c.yamlnu�[���PKr}[�
�q��l#)ri/1.8/system/Dir/pos-i.yamlnu�[���PKr}[?�'�## �%)ri/1.8/system/Dir/entries-c.yamlnu�[���PKr}[Y|R0���')ri/1.8/system/Dir/rmdir-c.yamlnu�[���PKr}[F�����))ri/1.8/system/Dir/chdir-c.yamlnu�[���PKr}[�!�[���/)ri/1.8/system/Dir/close-i.yamlnu�[���PKr}[�
�#���1)ri/1.8/system/Dir/seek-i.yamlnu�[���PKr}[t$N~a	a	!�4)ri/1.8/system/Dir/mktmpdir-c.yamlnu�[���PKr}[�+�=]]�>)ri/1.8/system/Dir/mkdir-c.yamlnu�[���PKr}[g�5d��QA)ri/1.8/system/Dir/%5b%5d-c.yamlnu�[���PKr}[S`�||-C)ri/1.8/system/Dir/pos%3d-i.yamlnu�[���PKr}[��b���E)ri/1.8/system/Dir/open-c.yamlnu�[���PKr}[�;��&CH)ri/1.8/system/Zlib/zlib_version-c.yamlnu�[���PKr}[�3����*�I)ri/1.8/system/Zlib/GzipWriter/flush-i.yamlnu�[���PKr}[��k�***�K)ri/1.8/system/Zlib/GzipWriter/print-i.yamlnu�[���PKr}[�`߹--+bM)ri/1.8/system/Zlib/GzipWriter/printf-i.yamlnu�[���PKr}[GҨa��-�N)ri/1.8/system/Zlib/GzipWriter/mtime%3d-i.yamlnu�[���PKr}[,if��)!P)ri/1.8/system/Zlib/GzipWriter/tell-i.yamlnu�[���PKr}[�����1NQ)ri/1.8/system/Zlib/GzipWriter/orig_name%3d-i.yamlnu�[���PKr}[�~WV;;(�R)ri/1.8/system/Zlib/GzipWriter/new-c.yamlnu�[���PKr}[rtƴ��/$U)ri/1.8/system/Zlib/GzipWriter/comment%3d-i.yamlnu�[���PKr}[��	_��3aV)ri/1.8/system/Zlib/GzipWriter/cdesc-GzipWriter.yamlnu�[���PKr}[S�����*�])ri/1.8/system/Zlib/GzipWriter/write-i.yamlnu�[���PKr}[|'��((+�^)ri/1.8/system/Zlib/GzipWriter/%3c%3c-i.yamlnu�[���PKr}[��d;��(>`)ri/1.8/system/Zlib/GzipWriter/pos-i.yamlnu�[���PKr}[2�����)ha)ri/1.8/system/Zlib/GzipWriter/putc-i.yamlnu�[���PKr}[�iޗ'')�b)ri/1.8/system/Zlib/GzipWriter/puts-i.yamlnu�[���PKr}[V�\��)d)ri/1.8/system/Zlib/GzipWriter/open-c.yamlnu�[���PKr}[AŹ�)uf)ri/1.8/system/Zlib/Error/cdesc-Error.yamlnu�[���PKr}[���D�	�	/�j)ri/1.8/system/Zlib/BufError/cdesc-BufError.yamlnu�[���PKr}[�.>��-u)ri/1.8/system/Zlib/ZStream/finished%3f-i.yamlnu�[���PKr}[E�n==-_v)ri/1.8/system/Zlib/ZStream/cdesc-ZStream.yamlnu�[���PKr}[ma�	0��)ri/1.8/system/Zlib/ZStream/flush_next_out-i.yamlnu�[���PKr}[�_Df��+u�)ri/1.8/system/Zlib/ZStream/data_type-i.yamlnu�[���PKr}[�ǩ���.R�)ri/1.8/system/Zlib/ZStream/avail_out%3d-i.yamlnu�[���PKr}[�����'��)ri/1.8/system/Zlib/ZStream/adler-i.yamlnu�[���PKs}[�j�p/ǎ)ri/1.8/system/Zlib/ZStream/stream_end%3f-i.yamlnu�[���PKs}[��{cc+)�)ri/1.8/system/Zlib/ZStream/avail_out-i.yamlnu�[���PKs}[�BZ
*�)ri/1.8/system/Zlib/ZStream/avail_in-i.yamlnu�[���PKs}[�{��PP(V�)ri/1.8/system/Zlib/ZStream/finish-i.yamlnu�[���PKs}[$�Pr*��)ri/1.8/system/Zlib/ZStream/total_in-i.yamlnu�[���PKs}[e/<w/l�)ri/1.8/system/Zlib/ZStream/flush_next_in-i.yamlnu�[���PKs}[�+�=��+�)ri/1.8/system/Zlib/ZStream/closed%3f-i.yamlnu�[���PKs}[4~�l%8�)ri/1.8/system/Zlib/ZStream/end-i.yamlnu�[���PKs}[������*��)ri/1.8/system/Zlib/ZStream/ended%3f-i.yamlnu�[���PKs}[�C�N'��)ri/1.8/system/Zlib/ZStream/close-i.yamlnu�[���PKs}[�;w**'o�)ri/1.8/system/Zlib/ZStream/reset-i.yamlnu�[���PKs}[�[�Z+�)ri/1.8/system/Zlib/ZStream/total_out-i.yamlnu�[���PKs}[v���	�	5d�)ri/1.8/system/Zlib/StreamError/cdesc-StreamError.yamlnu�[���PKs}[%,���)��)ri/1.8/system/Zlib/Inflate/inflate-c.yamlnu�[���PKs}[�x���%n�)ri/1.8/system/Zlib/Inflate/new-c.yamlnu�[���PKs}[����0��)ri/1.8/system/Zlib/Inflate/set_dictionary-i.yamlnu�[���PKs}[go`8��(��)ri/1.8/system/Zlib/Inflate/%3c%3c-i.yamlnu�[���PKs}[�oh)ٲ)ri/1.8/system/Zlib/Inflate/inflate-i.yamlnu�[���PKs}[��^uu/J�)ri/1.8/system/Zlib/Inflate/sync_point%3f-i.yamlnu�[���PKs}[�pV�&�)ri/1.8/system/Zlib/Inflate/sync-i.yamlnu�[���PKs}[�zv���-{�)ri/1.8/system/Zlib/Inflate/cdesc-Inflate.yamlnu�[���PKs}[��z���'��)ri/1.8/system/Zlib/Deflate/flush-i.yamlnu�[���PKs}[^6=�		)�)ri/1.8/system/Zlib/Deflate/deflate-i.yamlnu�[���PKs}[Mu����%U�)ri/1.8/system/Zlib/Deflate/new-c.yamlnu�[���PKs}[�<��-��)ri/1.8/system/Zlib/Deflate/cdesc-Deflate.yamlnu�[���PKs}[�*,�1��)ri/1.8/system/Zlib/Deflate/initialize_copy-i.yamlnu�[���PKs}[ؤ���0,�)ri/1.8/system/Zlib/Deflate/set_dictionary-i.yamlnu�[���PKt}[v�X��(x�)ri/1.8/system/Zlib/Deflate/params-i.yamlnu�[���PKt}[)ʳ��(��)ri/1.8/system/Zlib/Deflate/%3c%3c-i.yamlnu�[���PKt}[�ᰍ;;)��)ri/1.8/system/Zlib/Deflate/deflate-c.yamlnu�[���PKt}[��{*

#T�)ri/1.8/system/Zlib/crc_table-c.yamlnu�[���PKt}[�W�E		)��)ri/1.8/system/Zlib/GzipReader/each-i.yamlnu�[���PKt}[�Z�:��+�)ri/1.8/system/Zlib/GzipReader/lineno-i.yamlnu�[���PKt}[��		)F�)ri/1.8/system/Zlib/GzipReader/read-i.yamlnu�[���PKt}[D�]-��)ri/1.8/system/Zlib/GzipReader/readline-i.yamlnu�[���PKt}[W �.�)ri/1.8/system/Zlib/GzipReader/each_line-i.yamlnu�[���PKt}[J����)��)ri/1.8/system/Zlib/GzipReader/tell-i.yamlnu�[���PKt}[Ψmoo+��)ri/1.8/system/Zlib/GzipReader/rewind-i.yamlnu�[���PKt}[�(�5+~�)ri/1.8/system/Zlib/GzipReader/ungetc-i.yamlnu�[���PKt}[?2r���(��)ri/1.8/system/Zlib/GzipReader/eof-i.yamlnu�[���PKt}[���'bb(�)ri/1.8/system/Zlib/GzipReader/new-c.yamlnu�[���PKt}[�����.��)ri/1.8/system/Zlib/GzipReader/lineno%3d-i.yamlnu�[���PKt}[ݎ��.�)ri/1.8/system/Zlib/GzipReader/each_byte-i.yamlnu�[���PKt}[��X8SS+q�)ri/1.8/system/Zlib/GzipReader/unused-i.yamlnu�[���PKt}[}v�v		)�)ri/1.8/system/Zlib/GzipReader/gets-i.yamlnu�[���PKt}[�
�9��+��)ri/1.8/system/Zlib/GzipReader/eof%3f-i.yamlnu�[���PKt}[�g���(��)ri/1.8/system/Zlib/GzipReader/pos-i.yamlnu�[���PKt}[��')��)ri/1.8/system/Zlib/GzipReader/getc-i.yamlnu�[���PKt}[����-9�)ri/1.8/system/Zlib/GzipReader/readchar-i.yamlnu�[���PKt}[���0.��)ri/1.8/system/Zlib/GzipReader/readlines-i.yamlnu�[���PKt}[�<<3�)ri/1.8/system/Zlib/GzipReader/cdesc-GzipReader.yamlnu�[���PKt}[��w^��)��)ri/1.8/system/Zlib/GzipReader/open-c.yamlnu�[���PKt}[@tn""!�*ri/1.8/system/Zlib/adler32-c.yamlnu�[���PKt}[�
��	�	1N*ri/1.8/system/Zlib/DataError/cdesc-DataError.yamlnu�[���PKt}[��ǫ�
�
"v*ri/1.8/system/Zlib/cdesc-Zlib.yamlnu�[���PKt}[�c��	�	7�*ri/1.8/system/Zlib/VersionError/cdesc-VersionError.yamlnu�[���PKt}[����&*ri/1.8/system/Zlib/crc32-c.yamlnu�[���PKt}[���

*')*ri/1.8/system/Zlib/GzipFile/os_code-i.yamlnu�[���PKt}[�_z���&�**ri/1.8/system/Zlib/GzipFile/crc-i.yamlnu�[���PKt}[x�3��/�+*ri/1.8/system/Zlib/GzipFile/cdesc-GzipFile.yamlnu�[���PKt}[h|�O��>�0*ri/1.8/system/Zlib/GzipFile/LengthError/cdesc-LengthError.yamlnu�[���PKt}[���8�2*ri/1.8/system/Zlib/GzipFile/CRCError/cdesc-CRCError.yamlnu�[���PKt}[�=��++8�4*ri/1.8/system/Zlib/GzipFile/NoFooter/cdesc-NoFooter.yamlnu�[���PKt}[�i,,2*6*ri/1.8/system/Zlib/GzipFile/Error/cdesc-Error.yamlnu�[���PKt}["�ss)�7*ri/1.8/system/Zlib/GzipFile/finish-i.yamlnu�[���PKt}[���(�9*ri/1.8/system/Zlib/GzipFile/mtime-i.yamlnu�[���PKt}[g����(�:*ri/1.8/system/Zlib/GzipFile/level-i.yamlnu�[���PKt}[+/�(��,0<*ri/1.8/system/Zlib/GzipFile/closed%3f-i.yamlnu�[���PKt}[���r'l=*ri/1.8/system/Zlib/GzipFile/wrap-c.yamlnu�[���PKt}[{�>b..*�>*ri/1.8/system/Zlib/GzipFile/comment-i.yamlnu�[���PKt}[��\JJ(Q@*ri/1.8/system/Zlib/GzipFile/close-i.yamlnu�[���PKt}[������(�A*ri/1.8/system/Zlib/GzipFile/to_io-i.yamlnu�[���PKt}[>��*'C*ri/1.8/system/Zlib/GzipFile/sync%3d-i.yamlnu�[���PKt}[y)��II,E*ri/1.8/system/Zlib/GzipFile/orig_name-i.yamlnu�[���PKt}[�ae��'�F*ri/1.8/system/Zlib/GzipFile/sync-i.yamlnu�[���PKt}[��+�	�	/�G*ri/1.8/system/Zlib/MemError/cdesc-MemError.yamlnu�[���PKt}[GZ��	�	/R*ri/1.8/system/Zlib/NeedDict/cdesc-NeedDict.yamlnu�[���PKt}[걳��	�	1;\*ri/1.8/system/Zlib/StreamEnd/cdesc-StreamEnd.yamlnu�[���PKt}[�D!+��0cf*ri/1.8/system/RiDriver/report_class_stuff-i.yamlnu�[���PKt}[�[%FF:�g*ri/1.8/system/RiDriver/report_missing_documentation-i.yamlnu�[���PKt}[���*@i*ri/1.8/system/RiDriver/process_args-i.yamlnu�[���PKt}[D�O*Qj*ri/1.8/system/RiDriver/cdesc-RiDriver.yamlnu�[���PKt}[�(0��!�l*ri/1.8/system/RiDriver/new-c.yamlnu�[���PKt}[Jaź�*�m*ri/1.8/system/RiDriver/get_info_for-i.yamlnu�[���PKt}[���1�n*ri/1.8/system/RiDriver/report_method_stuff-i.yamlnu�[���PKt}[�ب�(�p*ri/1.8/system/SyncEnumerator/size-i.yamlnu�[���PKt}[5�(tr*ri/1.8/system/SyncEnumerator/each-i.yamlnu�[���PKt}[����zz6�s*ri/1.8/system/SyncEnumerator/cdesc-SyncEnumerator.yamlnu�[���PKt}[���""'�w*ri/1.8/system/SyncEnumerator/new-c.yamlnu�[���PKt}[�D!""*-y*ri/1.8/system/SyncEnumerator/length-i.yamlnu�[���PKt}[}���vv*�z*ri/1.8/system/SyncEnumerator/end%3f-i.yamlnu�[���PKt}[�<i��0y|*ri/1.8/system/RUNIT/ToPublic/cdesc-ToPublic.yamlnu�[���PKt}[#����0�}*ri/1.8/system/RUNIT/TestResult/error_size-i.yamlnu�[���PKt}[�)����/�~*ri/1.8/system/RUNIT/TestResult/run_tests-i.yamlnu�[���PKt}[~����2�*ri/1.8/system/RUNIT/TestResult/failure_size-i.yamlnu�[���PKt}[?��K��0�*ri/1.8/system/RUNIT/TestResult/succeed%3f-i.yamlnu�[���PKt}[1��$��1��*ri/1.8/system/RUNIT/TestResult/add_failure-i.yamlnu�[���PKt}[5>^���4�*ri/1.8/system/RUNIT/TestResult/cdesc-TestResult.yamlnu�[���PKt}[�v|���1J�*ri/1.8/system/RUNIT/TestResult/run_asserts-i.yamlnu�[���PKt}[����/f�*ri/1.8/system/RUNIT/TestResult/add_error-i.yamlnu�[���PKt}[����9��*ri/1.8/system/RUNIT/CUI/TestRunner/create_mediator-i.yamlnu�[���PKt}[&��P��7��*ri/1.8/system/RUNIT/CUI/TestRunner/quiet_mode%3d-c.yamlnu�[���PKt}[@B���-�*ri/1.8/system/RUNIT/CUI/TestRunner/new-c.yamlnu�[���PKt}[i1F8�*ri/1.8/system/RUNIT/CUI/TestRunner/cdesc-TestRunner.yamlnu�[���PKt}[����-p�*ri/1.8/system/RUNIT/CUI/TestRunner/run-c.yamlnu�[���PKt}[+����7��*ri/1.8/system/RUNIT/CUI/TestRunner/create_result-i.yamlnu�[���PKt}[**���-��*ri/1.8/system/RUNIT/CUI/TestRunner/run-i.yamlnu�[���PKt}[�9!��&ؑ*ri/1.8/system/RUNIT/CUI/cdesc-CUI.yamlnu�[���PKt}[l����'�*ri/1.8/system/RUNIT/TestCase/new-c.yamlnu�[���PKt}[v����)�*ri/1.8/system/RUNIT/TestCase/suite-c.yamlnu�[���PKt}[Lt���0
�*ri/1.8/system/RUNIT/TestCase/cdesc-TestCase.yamlnu�[���PKt}[i	��'b�*ri/1.8/system/RUNIT/TestCase/run-i.yamlnu�[���PKt}[�^,\��(y�*ri/1.8/system/RUNIT/TestCase/name-i.yamlnu�[���PKt}[�
o��1|�*ri/1.8/system/RUNIT/TestCase/assert_equals-i.yamlnu�[���PKt}[tP���5��*ri/1.8/system/RUNIT/TestSuite/count_test_cases-i.yamlnu�[���PKt}[�,N��(ț*ri/1.8/system/RUNIT/TestSuite/add-i.yamlnu�[���PKt}[���A��-Ϝ*ri/1.8/system/RUNIT/TestSuite/add_test-i.yamlnu�[���PKu}[��u_��(�*ri/1.8/system/RUNIT/TestSuite/run-i.yamlnu�[���PKu}[A��K��2��*ri/1.8/system/RUNIT/TestSuite/cdesc-TestSuite.yamlnu�[���PKu}[�-�ww$��*ri/1.8/system/RUNIT/cdesc-RUNIT.yamlnu�[���PKu}[v�#��0ǣ*ri/1.8/system/RUNIT/Assert/assert_matches-i.yamlnu�[���PKu}[ɮZ���0�*ri/1.8/system/RUNIT/Assert/assert_not_nil-i.yamlnu�[���PKu}[$w��4�*ri/1.8/system/RUNIT/Assert/assert_equal_float-i.yamlnu�[���PKu}[ciN���2d�*ri/1.8/system/RUNIT/Assert/assert_exception-i.yamlnu�[���PKu}[�e�*��.��*ri/1.8/system/RUNIT/Assert/setup_assert-i.yamlnu�[���PKu}[�y�1��2��*ri/1.8/system/RUNIT/Assert/assert_not_match-i.yamlnu�[���PKu}[�T��-�*ri/1.8/system/RUNIT/Assert/assert_send-i.yamlnu�[���PKu}[Z�M���--�*ri/1.8/system/RUNIT/Assert/assert_fail-i.yamlnu�[���PKu}[Ẋ��5K�*ri/1.8/system/RUNIT/Assert/assert_no_exception-i.yamlnu�[���PKu}[�MZ��.��*ri/1.8/system/RUNIT/Assert/assert_match-i.yamlnu�[���PKu}[]I1
��3��*ri/1.8/system/RUNIT/Assert/assert_respond_to-i.yamlnu�[���PKu}[�����6�*ri/1.8/system/RUNIT/Assert/called_internally%3f-i.yamlnu�[���PKu}[������,�*ri/1.8/system/RUNIT/Assert/cdesc-Assert.yamlnu�[���PKu}[�ߓII/�*ri/1.8/system/Observable/delete_observer-i.yamlnu�[���PKu}[�˽���0��*ri/1.8/system/Observable/notify_observers-i.yamlnu�[���PKu}[lWd�0̺*ri/1.8/system/Observable/delete_observers-i.yamlnu�[���PKu}[�R?II,@�*ri/1.8/system/Observable/add_observer-i.yamlnu�[���PKu}[�t��*�*ri/1.8/system/Observable/changed%3f-i.yamlnu�[���PKu}[���PP'9�*ri/1.8/system/Observable/changed-i.yamlnu�[���PKu}[~�����.�*ri/1.8/system/Observable/cdesc-Observable.yamlnu�[���PKu}[�uX�/;�*ri/1.8/system/Observable/count_observers-i.yamlnu�[���PKu}[m����!��*ri/1.8/system/Binding/eval-i.yamlnu�[���PKu}[�<T��"��*ri/1.8/system/Binding/clone-i.yamlnu�[���PKu}[�hyy(��*ri/1.8/system/Binding/cdesc-Binding.yamlnu�[���PKu}[��5t��)��*ri/1.8/system/CompletingHash/match-i.yamlnu�[���PKu}[�R���6��*ri/1.8/system/CompletingHash/cdesc-CompletingHash.yamlnu�[���PKu}[mZC\"��*ri/1.8/system/FileTest/size-i.yamlnu�[���PKu}[#Yw11'>�*ri/1.8/system/FileTest/socket%3f-i.yamlnu�[���PKu}[___)��*ri/1.8/system/FileTest/readable%3f-i.yamlnu�[���PKu}[�xee&~�*ri/1.8/system/FileTest/exist%3f-i.yamlnu�[���PKu}[�L��>>(9�*ri/1.8/system/FileTest/chardev%3f-i.yamlnu�[���PKu}[]K�__)��*ri/1.8/system/FileTest/writable%3f-i.yamlnu�[���PKu}[�k2qq0��*ri/1.8/system/FileTest/executable_real%3f-i.yamlnu�[���PKu}["���*X�*ri/1.8/system/FileTest/cdesc-FileTest.yamlnu�[���PKu}[�</'��)a�*ri/1.8/system/FileTest/grpowned%3f-i.yamlnu�[���PKu}[[��99%Y�*ri/1.8/system/FileTest/zero%3f-i.yamlnu�[���PKu}[��(�<<'��*ri/1.8/system/FileTest/sticky%3f-i.yamlnu�[���PKu}[�3�Sii.z�*ri/1.8/system/FileTest/readable_real%3f-i.yamlnu�[���PKu}[����*A�*ri/1.8/system/FileTest/directory%3f-i.yamlnu�[���PKu}[M�&�;;(?�*ri/1.8/system/FileTest/symlink%3f-i.yamlnu�[���PKu}[�]U�<<'��*ri/1.8/system/FileTest/setgid%3f-i.yamlnu�[���PKu}[,�-�<<'e�*ri/1.8/system/FileTest/setuid%3f-i.yamlnu�[���PKu}[�6�h==)��*ri/1.8/system/FileTest/blockdev%3f-i.yamlnu�[���PKu}[����gg'��*ri/1.8/system/FileTest/exists%3f-i.yamlnu�[���PKu}[S�!~~*L�*ri/1.8/system/FileTest/identical%3f-i.yamlnu�[���PKu}[��T�))%$�*ri/1.8/system/FileTest/pipe%3f-i.yamlnu�[���PKu}[�;�Yii.��*ri/1.8/system/FileTest/writable_real%3f-i.yamlnu�[���PKu}[�@�1;;%i�*ri/1.8/system/FileTest/file%3f-i.yamlnu�[���PKu}[5>�vgg+��*ri/1.8/system/FileTest/executable%3f-i.yamlnu�[���PKu}[��3�rr&�+ri/1.8/system/FileTest/owned%3f-i.yamlnu�[���PKu}[��:Xaa%�+ri/1.8/system/FileTest/size%3f-i.yamlnu�[���PKu}[p�fII"9+ri/1.8/system/Regexp/eql%3f-i.yamlnu�[���PKu}[XRQ"�+ri/1.8/system/Regexp/%3d%7e-i.yamlnu�[���PKu}[�Ȁdd"D	+ri/1.8/system/Regexp/source-i.yamlnu�[���PKu}[
[��
+ri/1.8/system/Regexp/%7c-i.yamlnu�[���PKu}[�P����+ri/1.8/system/Regexp/%26-i.yamlnu�[���PKu}[
w����#�+ri/1.8/system/Regexp/to_yaml-i.yamlnu�[���PKu}[D�v|&�
+ri/1.8/system/Regexp/last_match-c.yamlnu�[���PKu}[�!W+ri/1.8/system/Regexp/kcode-i.yamlnu�[���PKu}[97�&& �+ri/1.8/system/Regexp/hash-i.yamlnu�[���PKv}[BтOO!*+ri/1.8/system/Regexp/quote-c.yamlnu�[���PKv}[H�I���$�+ri/1.8/system/Regexp/yaml_new-c.yamlnu�[���PKv}[�(�$$!�+ri/1.8/system/Regexp/match-i.yamlnu�[���PKv}[R ���N+ri/1.8/system/Regexp/%7e-i.yamlnu�[���PKv}[r~��#H+ri/1.8/system/Regexp/inspect-i.yamlnu�[���PKv}[�߬jj�+ri/1.8/system/Regexp/new-c.yamlnu�[���PKv}[9!���%@$+ri/1.8/system/Regexp/%3d%3d%3d-i.yamlnu�[���PKv}[�g	C�� ('+ri/1.8/system/Regexp/to_s-i.yamlnu�[���PKv}[	h_0EE"v++ri/1.8/system/Regexp/%3d%3d-i.yamlnu�[���PKv}[U�/��#
.+ri/1.8/system/Regexp/options-i.yamlnu�[���PKv}[(�E+QQ"_2+ri/1.8/system/Regexp/escape-c.yamlnu�[���PKv}[׬�##'5+ri/1.8/system/Regexp/casefold%3f-i.yamlnu�[���PKv}[ep
<**!|6+ri/1.8/system/Regexp/union-c.yamlnu�[���PKv}[�����#�:+ri/1.8/system/Regexp/compile-c.yamlnu�[���PKv}[	*WW&9<+ri/1.8/system/Regexp/cdesc-Regexp.yamlnu�[���PKv}[Ķܸ�*�C+ri/1.8/system/Mutex_m/extend_object-c.yamlnu�[���PKv}[�;��&�D+ri/1.8/system/Mutex_m/mu_unlock-i.yamlnu�[���PKv}[��w,��(�E+ri/1.8/system/Mutex_m/mu_try_lock-i.yamlnu�[���PKv}[9D���)G+ri/1.8/system/Mutex_m/mu_locked%3f-i.yamlnu�[���PKv}[�r8���*H+ri/1.8/system/Mutex_m/mu_initialize-i.yamlnu�[���PKv}[�Ѭ~��+I+ri/1.8/system/Mutex_m/mu_synchronize-i.yamlnu�[���PKv}[�	U���,eJ+ri/1.8/system/Mutex_m/append_features-c.yamlnu�[���PKv}[3��L�� |K+ri/1.8/system/Mutex_m/new-c.yamlnu�[���PKv}[{H+"��(rL+ri/1.8/system/Mutex_m/mu_extended-i.yamlnu�[���PKv}[L?n��${M+ri/1.8/system/Mutex_m/mu_lock-i.yamlnu�[���PKv}[	��5��+xN+ri/1.8/system/Mutex_m/define_aliases-c.yamlnu�[���PKv}[C5 ���(�O+ri/1.8/system/Mutex_m/cdesc-Mutex_m.yamlnu�[���PKv}[�����0�T+ri/1.8/system/RegexpError/cdesc-RegexpError.yamlnu�[���PKv}[�ñMM!2W+ri/1.8/system/Range/eql%3f-i.yamlnu�[���PKv}[��*���Y+ri/1.8/system/Range/each-i.yamlnu�[���PKv}[��'���\+ri/1.8/system/Range/last-i.yamlnu�[���PKv}[�Z+��"�^+ri/1.8/system/Range/to_yaml-i.yamlnu�[���PKv}[�gX���_+ri/1.8/system/Range/hash-i.yamlnu�[���PKv}[�-�T::)za+ri/1.8/system/Range/exclude_end%3f-i.yamlnu�[���PKv}[���33$
c+ri/1.8/system/Range/member%3f-i.yamlnu�[���PKv}[�}ú�#�f+ri/1.8/system/Range/yaml_new-c.yamlnu�[���PKv}[gQ�QQ"�g+ri/1.8/system/Range/inspect-i.yamlnu�[���PKv}[�.��^^$Di+ri/1.8/system/Range/cdesc-Range.yamlnu�[���PKv}[�ʐ�55%�u+ri/1.8/system/Range/include%3f-i.yamlnu�[���PKv}[M��1���y+ri/1.8/system/Range/new-c.yamlnu�[���PKv}[�|����'�{+ri/1.8/system/Range/pretty_print-i.yamlnu�[���PKv}[�!�/++$�|+ri/1.8/system/Range/%3d%3d%3d-i.yamlnu�[���PKv}[�����+ri/1.8/system/Range/step-i.yamlnu�[���PKv}[���; ��+ri/1.8/system/Range/first-i.yamlnu�[���PKv}[�����j�+ri/1.8/system/Range/end-i.yamlnu�[���PKv}[~�)@�+ri/1.8/system/Range/to_s-i.yamlnu�[���PKv}[�(�VV!��+ri/1.8/system/Range/%3d%3d-i.yamlnu�[���PKv}[��o] A�+ri/1.8/system/Range/begin-i.yamlnu�[���PKv}[227��1��+ri/1.8/system/Exception2MessageMapper/fail-i.yamlnu�[���PKv}[�LO��2ҍ+ri/1.8/system/Exception2MessageMapper/Raise-i.yamlnu�[���PKv}[�H��1��+ri/1.8/system/Exception2MessageMapper/Fail-i.yamlnu�[���PKv}[��^��:�+ri/1.8/system/Exception2MessageMapper/def_e2message-i.yamlnu�[���PKv}[_=1��?�+ri/1.8/system/Exception2MessageMapper/E2MM/extend_object-c.yamlnu�[���PKv}[�]�H��>C�+ri/1.8/system/Exception2MessageMapper/E2MM/e2mm_message-c.yamlnu�[���PKv}[����:��+ri/1.8/system/Exception2MessageMapper/E2MM/cdesc-E2MM.yamlnu�[���PKv}[y=ێ��7��+ri/1.8/system/Exception2MessageMapper/E2MM/Raise-c.yamlnu�[���PKv}[e�� ��?�+ri/1.8/system/Exception2MessageMapper/E2MM/def_e2message-c.yamlnu�[���PKv}[X�E�?:�+ri/1.8/system/Exception2MessageMapper/E2MM/def_exception-c.yamlnu�[���PKv}[~<�;��;Ş+ri/1.8/system/Exception2MessageMapper/E2MM/extend_to-c.yamlnu�[���PKv}[Ղ|)��1/�+ri/1.8/system/Exception2MessageMapper/bind-i.yamlnu�[���PKv}[���uSSHE�+ri/1.8/system/Exception2MessageMapper/cdesc-Exception2MessageMapper.yamlnu�[���PKv}[�t���:�+ri/1.8/system/Exception2MessageMapper/def_exception-i.yamlnu�[���PKv}[p�K�###W�+ri/1.8/system/Socket/connect-i.yamlnu�[���PKv}[N7(��$��+ri/1.8/system/Socket/recvfrom-i.yamlnu�[���PKv}[#�k���)��+ri/1.8/system/Socket/getservbyname-c.yamlnu�[���PKv}[N����3��+ri/1.8/system/Socket/Constants/cdesc-Constants.yamlnu�[���PKv}[ y�''	'	&�+ri/1.8/system/Socket/cdesc-Socket.yamlnu�[���PKv}[�7��
�
-��+ri/1.8/system/Socket/recvfrom_nonblock-i.yamlnu�[���PKv}[5�YY �,ri/1.8/system/Socket/bind-i.yamlnu�[���PKv}[Acu�zz+D,ri/1.8/system/Socket/accept_nonblock-i.yamlnu�[���PKv}[.��vBB)",ri/1.8/system/Socket/gethostbyname-c.yamlnu�[���PKv}[�֎��'�1,ri/1.8/system/Socket/getaddrinfo-c.yamlnu�[���PKv}[1IZZ"�I,ri/1.8/system/Socket/accept-i.yamlnu�[���PKv}[H�$$"A`,ri/1.8/system/Socket/listen-i.yamlnu�[���PKv}[�e�h66%�t,ri/1.8/system/Socket/sysaccept-i.yamlnu�[���PKv}[�!Ɍ

,B|,ri/1.8/system/Socket/connect_nonblock-i.yamlnu�[���PKv}[��?;;6��,ri/1.8/system/LocalJumpError/cdesc-LocalJumpError.yamlnu�[���PKv}[�����.I�,ri/1.8/system/LocalJumpError/exit_value-i.yamlnu�[���PKv}[����UU*J�,ri/1.8/system/LocalJumpError/reason-i.yamlnu�[���PKv}[!$		,��,ri/1.8/system/ThreadsWait/finished%3f-i.yamlnu�[���PKv}[��)^�,ri/1.8/system/ThreadsWait/empty%3f-i.yamlnu�[���PKv}[�h���*ȍ,ri/1.8/system/ThreadsWait/all_waits-i.yamlnu�[���PKv}[[�E�DD0�,ri/1.8/system/ThreadsWait/cdesc-ThreadsWait.yamlnu�[���PKv}[�%�933,��,ri/1.8/system/ThreadsWait/join_nowait-i.yamlnu�[���PKv}[ɗ��  $C�,ri/1.8/system/ThreadsWait/new-c.yamlnu�[���PKv}[M��--%��,ri/1.8/system/ThreadsWait/join-i.yamlnu�[���PKv}[f���ii*9�,ri/1.8/system/ThreadsWait/all_waits-c.yamlnu�[���PKv}[!�\U*��,ri/1.8/system/ThreadsWait/next_wait-i.yamlnu�[���PKv}[�}k,��*^�,ri/1.8/system/IPSocket/cdesc-IPSocket.yamlnu�[���PKv}[O��ϵ�$M�,ri/1.8/system/ERB/set_eoutvar-i.yamlnu�[���PKv}[$��IV�,ri/1.8/system/ERB/result-i.yamlnu�[���PKv}[Ĩ�#�# ��,ri/1.8/system/ERB/cdesc-ERB.yamlnu�[���PKv}[��
���"��,ri/1.8/system/ERB/def_class-i.yamlnu�[���PKv}[����&$�,ri/1.8/system/ERB/Util/cdesc-Util.yamlnu�[���PKv}[���T��\�,ri/1.8/system/ERB/Util/u-i.yamlnu�[���PKv}[!X'�����,ri/1.8/system/ERB/Util/h-i.yamlnu�[���PKv}[�zee)��,ri/1.8/system/ERB/Util/html_escape-i.yamlnu�[���PKv}[9ύ���(q�,ri/1.8/system/ERB/Util/url_encode-i.yamlnu�[���PKv}[�\׋vv#Z�,ri/1.8/system/ERB/def_method-i.yamlnu�[���PKw}[�HɌ�
�
#�,ri/1.8/system/ERB/new-c.yamlnu�[���PKw}[K'b��#+�,ri/1.8/system/ERB/def_module-i.yamlnu�[���PKw}[Z���0�,ri/1.8/system/ERB/DefMethod/cdesc-DefMethod.yamlnu�[���PKw}[�ݸ�ZZ1R�,ri/1.8/system/ERB/DefMethod/def_erb_method-i.yamlnu�[���PKw}[��Mp�� 
�,ri/1.8/system/ERB/version-c.yamlnu�[���PKw}[�W]���.Z�,ri/1.8/system/ERB/Compiler/cdesc-Compiler.yamlnu�[���PKw}[�"f���5z�,ri/1.8/system/ERB/Compiler/Scanner/cdesc-Scanner.yamlnu�[���PKw}[ȯk��E��,ri/1.8/system/ERB/Compiler/ExplicitScanner/cdesc-ExplicitScanner.yamlnu�[���PKw}[w��)��3��,ri/1.8/system/ERB/Compiler/Buffer/cdesc-Buffer.yamlnu�[���PKw}[cz?���=$�,ri/1.8/system/ERB/Compiler/PercentLine/cdesc-PercentLine.yamlnu�[���PKw}[.�3��Cc�,ri/1.8/system/ERB/Compiler/SimpleScanner2/cdesc-SimpleScanner2.yamlnu�[���PKw}[e�����=��,ri/1.8/system/ERB/Compiler/TrimScanner/cdesc-TrimScanner.yamlnu�[���PKw}[�ˡ���A�,ri/1.8/system/ERB/Compiler/SimpleScanner/cdesc-SimpleScanner.yamlnu�[���PKw}[N�17�,ri/1.8/system/ERB/run-i.yamlnu�[���PKw}[��b��,��,ri/1.8/system/Module/const_defined%3f-i.yamlnu�[���PKw}[+{SOO+��,ri/1.8/system/Module/instance_method-i.yamlnu�[���PKw}[���z��+H-ri/1.8/system/Module/module_function-i.yamlnu�[���PKw}[������*H	-ri/1.8/system/Module/method_removed-i.yamlnu�[���PKw}[��.���$�
-ri/1.8/system/Module/extended-i.yamlnu�[���PKw}[t�0775�-ri/1.8/system/Module/class_variable_defined%3f-i.yamlnu�[���PKw}[i[���(\-ri/1.8/system/Module/remove_const-i.yamlnu�[���PKw}[mѺqQQ$J-ri/1.8/system/Module/autoload-i.yamlnu�[���PKw}[�Ug%�-ri/1.8/system/Module/%3c%3d%3e-i.yamlnu�[���PKw}[���'b-ri/1.8/system/Module/module_eval-i.yamlnu�[���PKw}[yDD/�-ri/1.8/system/Module/public_class_method-i.yamlnu�[���PKw}[���;��&v-ri/1.8/system/Module/class_exec-i.yamlnu�[���PKw}[��p'�-ri/1.8/system/Module/autoload%3f-i.yamlnu�[���PKw}[�����%!-ri/1.8/system/Module/protected-i.yamlnu�[���PKw}[9[\\'#-ri/1.8/system/Module/attr_writer-i.yamlnu�[���PKx}[�$ʄ�%�$-ri/1.8/system/Module/const_get-i.yamlnu�[���PKx}[�BE.���&-ri/1.8/system/Module/%3c-i.yamlnu�[���PKx}[.�"�(-ri/1.8/system/Module/%3c%3d-i.yamlnu�[���PKx}[t:"��7+-ri/1.8/system/Module/protected_method_defined%3f-i.yamlnu�[���PKx}[�D1"$/-ri/1.8/system/Module/%3e%3d-i.yamlnu�[���PKx}[���OO%y1-ri/1.8/system/Module/const_set-i.yamlnu�[���PKx}[�Ql�ss+4-ri/1.8/system/Module/append_features-i.yamlnu�[���PKx}[������(�6-ri/1.8/system/Module/method_added-i.yamlnu�[���PKx}[�]����(*8-ri/1.8/system/Module/alias_method-i.yamlnu�[���PKx}[��F>��%t;-ri/1.8/system/Module/constants-c.yamlnu�[���PKx}[�jŹ��5Q>-ri/1.8/system/Module/private_method_defined%3f-i.yamlnu�[���PKx}[�gmm0>B-ri/1.8/system/Module/private_class_method-i.yamlnu�[���PKx}[���mAA&E-ri/1.8/system/Module/include%3f-i.yamlnu�[���PKx}[�O��G-ri/1.8/system/Module/new-c.yamlnu�[���PKx}[�<���'K-ri/1.8/system/Module/module_exec-i.yamlnu�[���PKx}[�D%��46N-ri/1.8/system/Module/public_method_defined%3f-i.yamlnu�[���PKx}[�W�r��% R-ri/1.8/system/Module/%3d%3d%3d-i.yamlnu�[���PKx}[3a�oo1AT-ri/1.8/system/Module/remove_class_variable-i.yamlnu�[���PKx}[���ouu)W-ri/1.8/system/Module/remove_method-i.yamlnu�[���PKx}[�Y�^��3�X-ri/1.8/system/Module/public_instance_methods-i.yamlnu�[���PKx}[%Fn���&[-ri/1.8/system/Module/cdesc-Module.yamlnu�[���PKx}[�kxg��4am-ri/1.8/system/Module/private_instance_methods-i.yamlnu�[���PKx}[�W�ee.�p-ri/1.8/system/Module/class_variable_set-i.yamlnu�[���PKx}[�\���#cs-ri/1.8/system/Module/private-i.yamlnu�[���PKx}[zޞ{��%Gv-ri/1.8/system/Module/constants-i.yamlnu�[���PKx}[�u\]] /x-ri/1.8/system/Module/attr-i.yamlnu�[���PKx}[N��Y&�{-ri/1.8/system/Module/class_eval-i.yamlnu�[���PKx}[Wk�55)J�-ri/1.8/system/Module/attr_accessor-i.yamlnu�[���PKx}[(�[GG,؂-ri/1.8/system/Module/instance_methods-i.yamlnu�[���PKx}[JA.�"{�-ri/1.8/system/Module/freeze-i.yamlnu�[���PKx}[�ê$��"Ԉ-ri/1.8/system/Module/public-i.yamlnu�[���PKx}[�P���(ϊ-ri/1.8/system/Module/undef_method-i.yamlnu�[���PKx}[R@�*�� ��-ri/1.8/system/Module/to_s-i.yamlnu�[���PKx}[8o����-ri/1.8/system/Module/%3e-i.yamlnu�[���PKx}[Ҙ�`LL"��-ri/1.8/system/Module/%3d%3d-i.yamlnu�[���PKx}[|4l��-]�-ri/1.8/system/Module/method_defined%3f-i.yamlnu�[���PKx}[��R��$[�-ri/1.8/system/Module/included-i.yamlnu�[���PKx}[���I11#]�-ri/1.8/system/Module/include-i.yamlnu�[���PKx}[�1c
bb+�-ri/1.8/system/Module/class_variables-i.yamlnu�[���PKx}[����)��-ri/1.8/system/Module/const_missing-i.yamlnu�[���PKx}[�4�< ��-ri/1.8/system/Module/name-i.yamlnu�[���PKx}[�ܤ���)�-ri/1.8/system/Module/extend_object-i.yamlnu�[���PKx}[A^(��#�-ri/1.8/system/Module/nesting-c.yamlnu�[���PKx}[�8h)G�-ri/1.8/system/Module/define_method-i.yamlnu�[���PKx}[w��7\\.��-ri/1.8/system/Module/class_variable_get-i.yamlnu�[���PKx}[���%p�-ri/1.8/system/Module/ancestors-i.yamlnu�[���PKx}[�����,Ȼ-ri/1.8/system/Module/method_undefined-i.yamlnu�[���PKx}[�s����6�-ri/1.8/system/Module/protected_instance_methods-i.yamlnu�[���PKx}[%QO���,Q�-ri/1.8/system/Module/included_modules-i.yamlnu�[���PKx}[o"f��'��-ri/1.8/system/Module/attr_reader-i.yamlnu�[���PKx}[��Z6��,��-ri/1.8/system/TSortTest/cdesc-TSortTest.yamlnu�[���PKx}[�����,��-ri/1.8/system/WSDL/Service/parse_attr-i.yamlnu�[���PKx}[BL	M��/��-ri/1.8/system/WSDL/Service/parse_element-i.yamlnu�[���PKx}[�٧�%�-ri/1.8/system/WSDL/Service/new-c.yamlnu�[���PKx}["&��1�-ri/1.8/system/WSDL/Service/targetnamespace-i.yamlnu�[���PKx}[���eQQ-,�-ri/1.8/system/WSDL/Service/cdesc-Service.yamlnu�[���PKx}[��]��2��-ri/1.8/system/WSDL/Documentation/parse_attr-i.yamlnu�[���PKx}[�8v���5�-ri/1.8/system/WSDL/Documentation/parse_element-i.yamlnu�[���PKx}[�M���+/�-ri/1.8/system/WSDL/Documentation/new-c.yamlnu�[���PKx}[%?O;``97�-ri/1.8/system/WSDL/Documentation/cdesc-Documentation.yamlnu�[���PKx}[mf��)�-ri/1.8/system/WSDL/Part/parse_attr-i.yamlnu�[���PKx}[���,�-ri/1.8/system/WSDL/Part/parse_element-i.yamlnu�[���PKx}[e��'1�-ri/1.8/system/WSDL/Part/cdesc-Part.yamlnu�[���PKx}[s�>N��"��-ri/1.8/system/WSDL/Part/new-c.yamlnu�[���PKx}[���x��;��-ri/1.8/system/WSDL/SOAP/MethodDefCreator/dump_method-i.yamlnu�[���PKx}[.�����@��-ri/1.8/system/WSDL/SOAP/MethodDefCreator/elementqualified-i.yamlnu�[���PKx}[�#����9�-ri/1.8/system/WSDL/SOAP/MethodDefCreator/param2str-i.yamlnu�[���PKx}[���OODD�-ri/1.8/system/WSDL/SOAP/MethodDefCreator/cdesc-MethodDefCreator.yamlnu�[���PKx}[d<�M��I�-ri/1.8/system/WSDL/SOAP/MethodDefCreator/collect_documentparameter-i.yamlnu�[���PKx}[�=L%��3k�-ri/1.8/system/WSDL/SOAP/MethodDefCreator/new-c.yamlnu�[���PKx}[��^���>��-ri/1.8/system/WSDL/SOAP/MethodDefCreator/rpcdefinedtype-i.yamlnu�[���PKx}[�ٙ^��D��-ri/1.8/system/WSDL/SOAP/MethodDefCreator/collect_rpcparameter-i.yamlnu�[���PKx}[�!�n��<#�-ri/1.8/system/WSDL/SOAP/MethodDefCreator/collect_type-i.yamlnu�[���PKx}[:�I��7\�-ri/1.8/system/WSDL/SOAP/MethodDefCreator/ele2str-i.yamlnu�[���PKx}[�~����8��-ri/1.8/system/WSDL/SOAP/MethodDefCreator/type2str-i.yamlnu�[���PKx}[�QLo��9��-ri/1.8/system/WSDL/SOAP/MethodDefCreator/param_set-i.yamlnu�[���PKx}[
T��4��-ri/1.8/system/WSDL/SOAP/MethodDefCreator/dump-i.yamlnu�[���PKx}[X=��3 �-ri/1.8/system/WSDL/SOAP/MethodDefCreator/cdr-i.yamlnu�[���PKx}[�:����C=�-ri/1.8/system/WSDL/SOAP/MethodDefCreator/documentdefinedtype-i.yamlnu�[���PKx}[m����0��-ri/1.8/system/WSDL/SOAP/Header/cdesc-Header.yamlnu�[���PKx}[��a��0v�-ri/1.8/system/WSDL/SOAP/Header/parse_attr-i.yamlnu�[���PKx}[�[v��3��-ri/1.8/system/WSDL/SOAP/Header/parse_element-i.yamlnu�[���PKx}[
�K��/��-ri/1.8/system/WSDL/SOAP/Header/find_part-i.yamlnu�[���PKx}[��3���2��-ri/1.8/system/WSDL/SOAP/Header/find_message-i.yamlnu�[���PKx}[�/=��)��-ri/1.8/system/WSDL/SOAP/Header/new-c.yamlnu�[���PKx}[њ�N��5�-ri/1.8/system/WSDL/SOAP/Header/targetnamespace-i.yamlnu�[���PKx}[
Cn��4*�-ri/1.8/system/WSDL/SOAP/WSDL2Ruby/create_file-i.yamlnu�[���PKx}[g��]��3N�-ri/1.8/system/WSDL/SOAP/WSDL2Ruby/check_file-i.yamlnu�[���PKx}[�S���6w�-ri/1.8/system/WSDL/SOAP/WSDL2Ruby/cdesc-WSDL2Ruby.yamlnu�[���PKx}[�l��4��-ri/1.8/system/WSDL/SOAP/WSDL2Ruby/create_name-i.yamlnu�[���PKx}[��?��3�-ri/1.8/system/WSDL/SOAP/WSDL2Ruby/write_file-i.yamlnu�[���PKx}[u�6��,.ri/1.8/system/WSDL/SOAP/WSDL2Ruby/new-c.yamlnu�[���PKx}[ ����?.ri/1.8/system/WSDL/SOAP/WSDL2Ruby/create_servant_skelton-i.yamlnu�[���PKx}[�%�2��6g.ri/1.8/system/WSDL/SOAP/WSDL2Ruby/create_driver-i.yamlnu�[���PKx}[L���>�.ri/1.8/system/WSDL/SOAP/WSDL2Ruby/create_client_skelton-i.yamlnu�[���PKx}[Fh��,�.ri/1.8/system/WSDL/SOAP/WSDL2Ruby/run-i.yamlnu�[���PKx}[��f��8�.ri/1.8/system/WSDL/SOAP/WSDL2Ruby/create_classdef-i.yamlnu�[���PKx}[�����F%.ri/1.8/system/WSDL/SOAP/WSDL2Ruby/create_standalone_server_stub-i.yamlnu�[���PKx}[WI��8�	.ri/1.8/system/WSDL/SOAP/WSDL2Ruby/create_cgi_stub-i.yamlnu�[���PKx}[y����/�
.ri/1.8/system/WSDL/SOAP/WSDL2Ruby/shbang-i.yamlnu�[���PKx}[�b���/�.ri/1.8/system/WSDL/SOAP/WSDL2Ruby/import-i.yamlnu�[���PKx}[c—��/�.ri/1.8/system/WSDL/SOAP/Fault/parse_attr-i.yamlnu�[���PKx}[����2.ri/1.8/system/WSDL/SOAP/Fault/parse_element-i.yamlnu�[���PKx}[�tC��(B.ri/1.8/system/WSDL/SOAP/Fault/new-c.yamlnu�[���PKx}[������4E.ri/1.8/system/WSDL/SOAP/Fault/targetnamespace-i.yamlnu�[���PKx}[@�8x��.l.ri/1.8/system/WSDL/SOAP/Fault/cdesc-Fault.yamlnu�[���PKx}[P�����B`.ri/1.8/system/WSDL/SOAP/ClassDefCreator/dump_simpleclassdef-i.yamlnu�[���PKx}[�>����A�.ri/1.8/system/WSDL/SOAP/ClassDefCreator/dump_simpletypedef-i.yamlnu�[���PKx}[��
��A
.ri/1.8/system/WSDL/SOAP/ClassDefCreator/attribute_basetype-i.yamlnu�[���PKx}[Kn����>V.ri/1.8/system/WSDL/SOAP/ClassDefCreator/dump_simpletype-i.yamlnu�[���PKx}[�!E���<�.ri/1.8/system/WSDL/SOAP/ClassDefCreator/dump_classdef-i.yamlnu�[���PKx}[S�z���B�.ri/1.8/system/WSDL/SOAP/ClassDefCreator/cdesc-ClassDefCreator.yamlnu�[���PKx}[R�D���?  .ri/1.8/system/WSDL/SOAP/ClassDefCreator/dump_complextype-i.yamlnu�[���PKx}[�ӢQ��=_!.ri/1.8/system/WSDL/SOAP/ClassDefCreator/name_attribute-i.yamlnu�[���PKx}[��3I��2�".ri/1.8/system/WSDL/SOAP/ClassDefCreator/new-c.yamlnu�[���PKx}[$���?�#.ri/1.8/system/WSDL/SOAP/ClassDefCreator/element_basetype-i.yamlnu�[���PKx}[�#(���;%.ri/1.8/system/WSDL/SOAP/ClassDefCreator/name_element-i.yamlnu�[���PKx}[��{���;?&.ri/1.8/system/WSDL/SOAP/ClassDefCreator/dump_element-i.yamlnu�[���PKx}[���a��3r'.ri/1.8/system/WSDL/SOAP/ClassDefCreator/dump-i.yamlnu�[���PKx}[��c��?�(.ri/1.8/system/WSDL/SOAP/ClassDefCreator/define_attribute-i.yamlnu�[���PKx}[��T��=�).ri/1.8/system/WSDL/SOAP/ClassDefCreator/basetype_class-i.yamlnu�[���PKx}[����<+.ri/1.8/system/WSDL/SOAP/ClassDefCreator/dump_arraydef-i.yamlnu�[���PKx}[���<��.`,.ri/1.8/system/WSDL/SOAP/Body/parse_attr-i.yamlnu�[���PKx}[<�^��1�-.ri/1.8/system/WSDL/SOAP/Body/parse_element-i.yamlnu�[���PKx}[��(~��'�..ri/1.8/system/WSDL/SOAP/Body/new-c.yamlnu�[���PKx}[�� ^[[,�/.ri/1.8/system/WSDL/SOAP/Body/cdesc-Body.yamlnu�[���PKx}[�V����>_2.ri/1.8/system/WSDL/SOAP/DriverCreator/cdesc-DriverCreator.yamlnu�[���PKx}[��C���:�4.ri/1.8/system/WSDL/SOAP/DriverCreator/dump_porttype-i.yamlnu�[���PKx}[�+���0�5.ri/1.8/system/WSDL/SOAP/DriverCreator/new-c.yamlnu�[���PKx}[ߔȚ��17.ri/1.8/system/WSDL/SOAP/DriverCreator/dump-i.yamlnu�[���PKx}[\O�r��3)8.ri/1.8/system/WSDL/SOAP/Operation/parse_attr-i.yamlnu�[���PKx}[����6T9.ri/1.8/system/WSDL/SOAP/Operation/parse_element-i.yamlnu�[���PKx}[�I���7�:.ri/1.8/system/WSDL/SOAP/Operation/parent_binding-i.yamlnu�[���PKx}[Q���:�;.ri/1.8/system/WSDL/SOAP/Operation/OperationInfo/new-c.yamlnu�[���PKx}[��G��H#=.ri/1.8/system/WSDL/SOAP/Operation/OperationInfo/cdesc-OperationInfo.yamlnu�[���PKx}[�=����,|@.ri/1.8/system/WSDL/SOAP/Operation/new-c.yamlnu�[���PKy}[����3�A.ri/1.8/system/WSDL/SOAP/Operation/input_info-i.yamlnu�[���PKy}[T0����3�B.ri/1.8/system/WSDL/SOAP/Operation/param_info-i.yamlnu�[���PKy}[bw���6�C.ri/1.8/system/WSDL/SOAP/Operation/cdesc-Operation.yamlnu�[���PKy}[i(0��81G.ri/1.8/system/WSDL/SOAP/Operation/operation_style-i.yamlnu�[���PKy}[��п�4`H.ri/1.8/system/WSDL/SOAP/Operation/output_info-i.yamlnu�[���PKy}[���J��<�I.ri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/dqname-i.yamlnu�[���PKy}[��nu��9�J.ri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/ndq-i.yamlnu�[���PKy}[���ʿ�9�K.ri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/sym-i.yamlnu�[���PKy}[�F�N��8M.ri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/dq-i.yamlnu�[���PKy}[ZI����K+N.ri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/basetype_mapped_class-i.yamlnu�[���PKy}[�U	2��E�O.ri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/dump_inputparam-i.yamlnu�[���PKy}[{&�8��<�P.ri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/add_at-i.yamlnu�[���PKy}[i}����ER.ri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/dump_inout_type-i.yamlnu�[���PKy}[�kO���KeS.ri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/dump_method_signature-i.yamlnu�[���PKy}[x>"%��G�T.ri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/create_class_name-i.yamlnu�[���PKy}[�F:88PV.ri/1.8/system/WSDL/SOAP/ClassDefCreatorSupport/cdesc-ClassDefCreatorSupport.yamlnu�[���PKy}[��AWeeL�Y.ri/1.8/system/WSDL/SOAP/ClientSkeltonCreator/cdesc-ClientSkeltonCreator.yamlnu�[���PKy}[M�fF��B�\.ri/1.8/system/WSDL/SOAP/ClientSkeltonCreator/dump_operation-i.yamlnu�[���PKy}[��tf��A^.ri/1.8/system/WSDL/SOAP/ClientSkeltonCreator/dump_porttype-i.yamlnu�[���PKy}[$թ:��CF_.ri/1.8/system/WSDL/SOAP/ClientSkeltonCreator/dump_input_init-i.yamlnu�[���PKy}[
���7�`.ri/1.8/system/WSDL/SOAP/ClientSkeltonCreator/new-c.yamlnu�[���PKy}[']O���8�a.ri/1.8/system/WSDL/SOAP/ClientSkeltonCreator/dump-i.yamlnu�[���PKy}[e�����;�b.ri/1.8/system/WSDL/SOAP/CGIStubCreator/dump_porttype-i.yamlnu�[���PKy}[�/z��1%d.ri/1.8/system/WSDL/SOAP/CGIStubCreator/new-c.yamlnu�[���PKy}[�ݨ���2Ee.ri/1.8/system/WSDL/SOAP/CGIStubCreator/dump-i.yamlnu�[���PKy}[�����@if.ri/1.8/system/WSDL/SOAP/CGIStubCreator/cdesc-CGIStubCreator.yamlnu�[���PKy}[�W��B�h.ri/1.8/system/WSDL/SOAP/ServantSkeltonCreator/dump_porttype-i.yamlnu�[���PKy}[9�&3��8j.ri/1.8/system/WSDL/SOAP/ServantSkeltonCreator/new-c.yamlnu�[���PKy}[��3��93k.ri/1.8/system/WSDL/SOAP/ServantSkeltonCreator/dump-i.yamlnu�[���PKy}[ ��88Ngl.ri/1.8/system/WSDL/SOAP/ServantSkeltonCreator/cdesc-ServantSkeltonCreator.yamlnu�[���PKy}[�rv���5o.ri/1.8/system/WSDL/SOAP/HeaderFault/parse_attr-i.yamlnu�[���PKy}[�Q�`��8Lp.ri/1.8/system/WSDL/SOAP/HeaderFault/parse_element-i.yamlnu�[���PKy}[���)��:�q.ri/1.8/system/WSDL/SOAP/HeaderFault/cdesc-HeaderFault.yamlnu�[���PKy}[�m#��.�t.ri/1.8/system/WSDL/SOAP/HeaderFault/new-c.yamlnu�[���PKy}[<����H�u.ri/1.8/system/WSDL/SOAP/MappingRegistryCreator/dump_array_typemap-i.yamlnu�[���PKy}[��w���Bw.ri/1.8/system/WSDL/SOAP/MappingRegistryCreator/dump_typemap-i.yamlnu�[���PKy}[W���9Fx.ri/1.8/system/WSDL/SOAP/MappingRegistryCreator/new-c.yamlnu�[���PKy}[d.�~ppPvy.ri/1.8/system/WSDL/SOAP/MappingRegistryCreator/cdesc-MappingRegistryCreator.yamlnu�[���PKy}[�����If|.ri/1.8/system/WSDL/SOAP/MappingRegistryCreator/dump_struct_typemap-i.yamlnu�[���PKy}[�=��:�}.ri/1.8/system/WSDL/SOAP/MappingRegistryCreator/dump-i.yamlnu�[���PKy}[58�:��1�~.ri/1.8/system/WSDL/SOAP/Binding/parse_attr-i.yamlnu�[���PKy}[�E���4�.ri/1.8/system/WSDL/SOAP/Binding/parse_element-i.yamlnu�[���PKy}[I=fr��*G�.ri/1.8/system/WSDL/SOAP/Binding/new-c.yamlnu�[���PKy}[�ŋt��2N�.ri/1.8/system/WSDL/SOAP/Binding/cdesc-Binding.yamlnu�[���PKy}[Dl�Z��.ri/1.8/system/WSDL/SOAP/StandaloneServerStubCreator/cdesc-StandaloneServerStubCreator.yamlnu�[���PKy}[i���H�.ri/1.8/system/WSDL/SOAP/StandaloneServerStubCreator/dump_porttype-i.yamlnu�[���PKy}[W�NF��>g�.ri/1.8/system/WSDL/SOAP/StandaloneServerStubCreator/new-c.yamlnu�[���PKy}[tBO��?��.ri/1.8/system/WSDL/SOAP/StandaloneServerStubCreator/dump-i.yamlnu�[���PKy}[T#����2ߊ.ri/1.8/system/WSDL/SOAP/Address/cdesc-Address.yamlnu�[���PKy}[Z$|���1ی.ri/1.8/system/WSDL/SOAP/Address/parse_attr-i.yamlnu�[���PKy}[�!P��4�.ri/1.8/system/WSDL/SOAP/Address/parse_element-i.yamlnu�[���PKy}[�0�6��*.�.ri/1.8/system/WSDL/SOAP/Address/new-c.yamlnu�[���PKy}[��2��'5�.ri/1.8/system/WSDL/SOAP/cdesc-SOAP.yamlnu�[���PKy}[Y�
���-?�.ri/1.8/system/WSDL/Info/parse_epilogue-i.yamlnu�[���PKy}[�Ty��)V�.ri/1.8/system/WSDL/Info/parse_attr-i.yamlnu�[���PKy}[!T�xx'l�.ri/1.8/system/WSDL/Info/cdesc-Info.yamlnu�[���PKy}[��2��,;�.ri/1.8/system/WSDL/Info/parse_element-i.yamlnu�[���PKy}[��l��&V�.ri/1.8/system/WSDL/Info/inspect-i.yamlnu�[���PKy}[�"����"X�.ri/1.8/system/WSDL/Info/new-c.yamlnu�[���PKy}[đZ��9N�.ri/1.8/system/WSDL/XMLSchema/Annotation/parse_attr-i.yamlnu�[���PKy}[�����<��.ri/1.8/system/WSDL/XMLSchema/Annotation/parse_element-i.yamlnu�[���PKy}[p��`ee=��.ri/1.8/system/WSDL/XMLSchema/Annotation/cdesc-Annotation.yamlnu�[���PKy}[�µ�2��.ri/1.8/system/WSDL/XMLSchema/Annotation/new-c.yamlnu�[���PKy}[/����6��.ri/1.8/system/WSDL/XMLSchema/Pattern/parse_attr-i.yamlnu�[���PKy}[��g���9ۤ.ri/1.8/system/WSDL/XMLSchema/Pattern/parse_element-i.yamlnu�[���PKy}[�f���/�.ri/1.8/system/WSDL/XMLSchema/Pattern/new-c.yamlnu�[���PKy}[�l�__7"�.ri/1.8/system/WSDL/XMLSchema/Pattern/cdesc-Pattern.yamlnu�[���PKy}[��;\��5�.ri/1.8/system/WSDL/XMLSchema/Length/parse_attr-i.yamlnu�[���PKy}[��\��8�.ri/1.8/system/WSDL/XMLSchema/Length/parse_element-i.yamlnu�[���PKy}[Q=�G��.K�.ri/1.8/system/WSDL/XMLSchema/Length/new-c.yamlnu�[���PKy}[�
�]]5Z�.ri/1.8/system/WSDL/XMLSchema/Length/cdesc-Length.yamlnu�[���PKy}[m����7�.ri/1.8/system/WSDL/XMLSchema/Sequence/parse_attr-i.yamlnu�[���PKy}[�)0��:O�.ri/1.8/system/WSDL/XMLSchema/Sequence/parse_element-i.yamlnu�[���PKy}[�����0��.ri/1.8/system/WSDL/XMLSchema/Sequence/new-c.yamlnu�[���PKy}[t�h��<��.ri/1.8/system/WSDL/XMLSchema/Sequence/targetnamespace-i.yamlnu�[���PKy}[�f����3Ѳ.ri/1.8/system/WSDL/XMLSchema/Sequence/%3c%3c-i.yamlnu�[���PKy}[��{��9�.ri/1.8/system/WSDL/XMLSchema/Sequence/cdesc-Sequence.yamlnu�[���PKy}[`*{��?&�.ri/1.8/system/WSDL/XMLSchema/Sequence/elementformdefault-i.yamlnu�[���PKy}[������2f�.ri/1.8/system/WSDL/XMLSchema/Any/parse_attr-i.yamlnu�[���PKy}[�{����5��.ri/1.8/system/WSDL/XMLSchema/Any/parse_element-i.yamlnu�[���PKy}[y8���/��.ri/1.8/system/WSDL/XMLSchema/Any/cdesc-Any.yamlnu�[���PKy}[������+Ž.ri/1.8/system/WSDL/XMLSchema/Any/new-c.yamlnu�[���PKy}[\h`)��7ξ.ri/1.8/system/WSDL/XMLSchema/Any/targetnamespace-i.yamlnu�[���PKy}[g�h��5��.ri/1.8/system/WSDL/XMLSchema/Choice/parse_attr-i.yamlnu�[���PKy}[����8*�.ri/1.8/system/WSDL/XMLSchema/Choice/parse_element-i.yamlnu�[���PKy}[�~o��5^�.ri/1.8/system/WSDL/XMLSchema/Choice/cdesc-Choice.yamlnu�[���PKy}[�����.��.ri/1.8/system/WSDL/XMLSchema/Choice/new-c.yamlnu�[���PKy}[V��g��:��.ri/1.8/system/WSDL/XMLSchema/Choice/targetnamespace-i.yamlnu�[���PKy}[U)�!��1��.ri/1.8/system/WSDL/XMLSchema/Choice/%3c%3c-i.yamlnu�[���PKy}[����=��.ri/1.8/system/WSDL/XMLSchema/Choice/elementformdefault-i.yamlnu�[���PKy}[�3(���9%�.ri/1.8/system/WSDL/XMLSchema/SimpleType/parse_attr-i.yamlnu�[���PKy}[H����<\�.ri/1.8/system/WSDL/XMLSchema/SimpleType/parse_element-i.yamlnu�[���PKy}[5����@��.ri/1.8/system/WSDL/XMLSchema/SimpleType/check_restriction-i.yamlnu�[���PKy}[���տ�2��.ri/1.8/system/WSDL/XMLSchema/SimpleType/new-c.yamlnu�[���PKy}[�����>�.ri/1.8/system/WSDL/XMLSchema/SimpleType/targetnamespace-i.yamlnu�[���PKy}[l�
��C;�.ri/1.8/system/WSDL/XMLSchema/SimpleType/check_lexical_format-i.yamlnu�[���PKy}[ Q�ʷ�3��.ri/1.8/system/WSDL/XMLSchema/SimpleType/base-i.yamlnu�[���PKy}[�)���=��.ri/1.8/system/WSDL/XMLSchema/SimpleType/cdesc-SimpleType.yamlnu�[���PKy}[H����=��.ri/1.8/system/WSDL/XMLSchema/XSD2Ruby/create_classname-i.yamlnu�[���PKy}[89��8�.ri/1.8/system/WSDL/XMLSchema/XSD2Ruby/create_file-i.yamlnu�[���PKy}[��L���7G�.ri/1.8/system/WSDL/XMLSchema/XSD2Ruby/check_file-i.yamlnu�[���PKy}[��t���7x�.ri/1.8/system/WSDL/XMLSchema/XSD2Ruby/write_file-i.yamlnu�[���PKy}[KL1��0��.ri/1.8/system/WSDL/XMLSchema/XSD2Ruby/new-c.yamlnu�[���PKy}[��UZnn9��.ri/1.8/system/WSDL/XMLSchema/XSD2Ruby/cdesc-XSD2Ruby.yamlnu�[���PKy}[x�Hֳ�0��.ri/1.8/system/WSDL/XMLSchema/XSD2Ruby/run-i.yamlnu�[���PKy}[�dE��<��.ri/1.8/system/WSDL/XMLSchema/XSD2Ruby/create_classdef-i.yamlnu�[���PKy}[-F2��3��.ri/1.8/system/WSDL/XMLSchema/XSD2Ruby/import-i.yamlnu�[���PKy}[У�e��>�.ri/1.8/system/WSDL/XMLSchema/SimpleExtension/parse_attr-i.yamlnu�[���PKy}[�a�[[GO�.ri/1.8/system/WSDL/XMLSchema/SimpleExtension/cdesc-SimpleExtension.yamlnu�[���PKy}[�m����A!�.ri/1.8/system/WSDL/XMLSchema/SimpleExtension/parse_element-i.yamlnu�[���PKy}[ku����7g�.ri/1.8/system/WSDL/XMLSchema/SimpleExtension/new-c.yamlnu�[���PKy}[W����C��.ri/1.8/system/WSDL/XMLSchema/SimpleExtension/targetnamespace-i.yamlnu�[���PKy}[;�J]��<��.ri/1.8/system/WSDL/XMLSchema/SimpleExtension/valid%3f-i.yamlnu�[���PKy}[��ʧ��9��.ri/1.8/system/WSDL/XMLSchema/SimpleContent/content-i.yamlnu�[���PKy}[ѱf��?(�.ri/1.8/system/WSDL/XMLSchema/SimpleContent/parse_element-i.yamlnu�[���PKy}[-8���7j�.ri/1.8/system/WSDL/XMLSchema/SimpleContent/check-i.yamlnu�[���PKy}[V���5��.ri/1.8/system/WSDL/XMLSchema/SimpleContent/new-c.yamlnu�[���PKz}[.��\��A��.ri/1.8/system/WSDL/XMLSchema/SimpleContent/targetnamespace-i.yamlnu�[���PKz}[��g��F��.ri/1.8/system/WSDL/XMLSchema/SimpleContent/check_lexical_format-i.yamlnu�[���PKz}[��V ��6F�.ri/1.8/system/WSDL/XMLSchema/SimpleContent/base-i.yamlnu�[���PKz}[|�����Cf�.ri/1.8/system/WSDL/XMLSchema/SimpleContent/cdesc-SimpleContent.yamlnu�[���PKz}[U.U�qq1��.ri/1.8/system/WSDL/XMLSchema/cdesc-XMLSchema.yamlnu�[���PKz}[�Q�q��>r
/ri/1.8/system/WSDL/XMLSchema/Attribute/directelement%3f-i.yamlnu�[���PKz}[*�1���8�/ri/1.8/system/WSDL/XMLSchema/Attribute/refelement-i.yamlnu�[���PKz}[Ή����8�/ri/1.8/system/WSDL/XMLSchema/Attribute/parse_attr-i.yamlnu�[���PKz}[�%%��=
/ri/1.8/system/WSDL/XMLSchema/Attribute/attr_reader_ref-c.yamlnu�[���PKz}[�>k���;I/ri/1.8/system/WSDL/XMLSchema/Attribute/parse_element-i.yamlnu�[���PKz}[�f����;�/ri/1.8/system/WSDL/XMLSchema/Attribute/cdesc-Attribute.yamlnu�[���PKz}[�`d��1�/ri/1.8/system/WSDL/XMLSchema/Attribute/new-c.yamlnu�[���PKz}[p�_���=�/ri/1.8/system/WSDL/XMLSchema/Attribute/targetnamespace-i.yamlnu�[���PKz}[@={C��:/ri/1.8/system/WSDL/XMLSchema/Content/parse_epilogue-i.yamlnu�[���PKz}[��j��64/ri/1.8/system/WSDL/XMLSchema/Content/parse_attr-i.yamlnu�[���PKz}[��ټ��0e/ri/1.8/system/WSDL/XMLSchema/Content/each-i.yamlnu�[���PKz}[������9�/ri/1.8/system/WSDL/XMLSchema/Content/parse_element-i.yamlnu�[���PKz}[�C���/�/ri/1.8/system/WSDL/XMLSchema/Content/new-c.yamlnu�[���PKz}[�v���;�/ri/1.8/system/WSDL/XMLSchema/Content/targetnamespace-i.yamlnu�[���PKz}[�nx~��;/ri/1.8/system/WSDL/XMLSchema/Content/update_elements-i.yamlnu�[���PKz}[���O��7B /ri/1.8/system/WSDL/XMLSchema/Content/cdesc-Content.yamlnu�[���PKz}[ad]ƹ�2X$/ri/1.8/system/WSDL/XMLSchema/Content/%3c%3c-i.yamlnu�[���PKz}[��@���=s%/ri/1.8/system/WSDL/XMLSchema/ComplexContent/parse_attr-i.yamlnu�[���PKz}[��O>��@�&/ri/1.8/system/WSDL/XMLSchema/ComplexContent/parse_element-i.yamlnu�[���PKz}[ɵ@X  E�'/ri/1.8/system/WSDL/XMLSchema/ComplexContent/cdesc-ComplexContent.yamlnu�[���PKz}[�E�a��6�+/ri/1.8/system/WSDL/XMLSchema/ComplexContent/new-c.yamlnu�[���PKz}[ۛF��B�,/ri/1.8/system/WSDL/XMLSchema/ComplexContent/targetnamespace-i.yamlnu�[���PKz}[�/޽��;�-/ri/1.8/system/WSDL/XMLSchema/ComplexContent/basetype-i.yamlnu�[���PKz}[3��K��E//ri/1.8/system/WSDL/XMLSchema/ComplexContent/elementformdefault-i.yamlnu�[���PKz}[;�����:g0/ri/1.8/system/WSDL/XMLSchema/Enumeration/parse_attr-i.yamlnu�[���PKz}[�2���=�1/ri/1.8/system/WSDL/XMLSchema/Enumeration/parse_element-i.yamlnu�[���PKz}[ϝiQ��3�2/ri/1.8/system/WSDL/XMLSchema/Enumeration/new-c.yamlnu�[���PKz}[�3�)gg?�3/ri/1.8/system/WSDL/XMLSchema/Enumeration/cdesc-Enumeration.yamlnu�[���PKz}[J�n��6�5/ri/1.8/system/WSDL/XMLSchema/Schema/location%3d-i.yamlnu�[���PKz}[v�Ho��5�6/ri/1.8/system/WSDL/XMLSchema/Schema/parse_attr-i.yamlnu�[���PKz}[j�~X��8'8/ri/1.8/system/WSDL/XMLSchema/Schema/parse_element-i.yamlnu�[���PKz}[�;zc��=[9/ri/1.8/system/WSDL/XMLSchema/Schema/collect_attributes-i.yamlnu�[���PKz}[�/�S��8�:/ri/1.8/system/WSDL/XMLSchema/Schema/parse_element-c.yamlnu�[���PKz}[*�=��3�;/ri/1.8/system/WSDL/XMLSchema/Schema/location-i.yamlnu�[���PKz}[�v~��;�</ri/1.8/system/WSDL/XMLSchema/Schema/collect_elements-i.yamlnu�[���PKz}[���	��?>/ri/1.8/system/WSDL/XMLSchema/Schema/collect_complextypes-i.yamlnu�[���PKz}[FDZ>��.a?/ri/1.8/system/WSDL/XMLSchema/Schema/new-c.yamlnu�[���PKz}[˕�{��>p@/ri/1.8/system/WSDL/XMLSchema/Schema/collect_simpletypes-i.yamlnu�[���PKz}[�Phvv5�A/ri/1.8/system/WSDL/XMLSchema/Schema/cdesc-Schema.yamlnu�[���PKz}[2ERZZ5�G/ri/1.8/system/WSDL/XMLSchema/Import/cdesc-Import.yamlnu�[���PKz}[�-2��5IJ/ri/1.8/system/WSDL/XMLSchema/Import/parse_attr-i.yamlnu�[���PKz}[8�$D��8xK/ri/1.8/system/WSDL/XMLSchema/Import/parse_element-i.yamlnu�[���PKz}[��ȱ�.�L/ri/1.8/system/WSDL/XMLSchema/Import/new-c.yamlnu�[���PKz}[��E��1�M/ri/1.8/system/WSDL/XMLSchema/Import/import-i.yamlnu�[���PKz}[e�D���@�N/ri/1.8/system/WSDL/XMLSchema/SimpleRestriction/parse_attr-i.yamlnu�[���PKz}[��&+��C!P/ri/1.8/system/WSDL/XMLSchema/SimpleRestriction/parse_element-i.yamlnu�[���PKz}[�X%�VVKkQ/ri/1.8/system/WSDL/XMLSchema/SimpleRestriction/cdesc-SimpleRestriction.yamlnu�[���PKz}[z�2��G<U/ri/1.8/system/WSDL/XMLSchema/SimpleRestriction/check_restriction-i.yamlnu�[���PKz}[4V,���B�V/ri/1.8/system/WSDL/XMLSchema/SimpleRestriction/check_length-i.yamlnu�[���PKz}[�k���9�W/ri/1.8/system/WSDL/XMLSchema/SimpleRestriction/new-c.yamlnu�[���PKz}[�����>�X/ri/1.8/system/WSDL/XMLSchema/SimpleRestriction/valid%3f-i.yamlnu�[���PKz}[V��B��C1Z/ri/1.8/system/WSDL/XMLSchema/SimpleRestriction/check_pattern-i.yamlnu�[���PKz}[6���2z[/ri/1.8/system/WSDL/XMLSchema/Importer/parse-i.yamlnu�[���PKz}[�L<z��3�\/ri/1.8/system/WSDL/XMLSchema/Importer/import-c.yamlnu�[���PKz}[�8���0�]/ri/1.8/system/WSDL/XMLSchema/Importer/new-c.yamlnu�[���PK{}[IC-C��7�^/ri/1.8/system/WSDL/XMLSchema/Importer/web_client-i.yamlnu�[���PK{}[^��Z��9'`/ri/1.8/system/WSDL/XMLSchema/Importer/cdesc-Importer.yamlnu�[���PK{}[��?��2}b/ri/1.8/system/WSDL/XMLSchema/Importer/fetch-i.yamlnu�[���PK{}[?�]��3�c/ri/1.8/system/WSDL/XMLSchema/Importer/import-i.yamlnu�[���PK{}[��<`�d/ri/1.8/system/WSDL/XMLSchema/Parser/AttributeConstraintError/cdesc-AttributeConstraintError.yamlnu�[���PK{}[��%��Rhf/ri/1.8/system/WSDL/XMLSchema/Parser/FormatDecodeError/cdesc-FormatDecodeError.yamlnu�[���PK{}[X9��9�g/ri/1.8/system/WSDL/XMLSchema/Parser/decode_tag_end-i.yamlnu�[���PK{}[��9��Zi/ri/1.8/system/WSDL/XMLSchema/Parser/UnknownAttributeError/cdesc-UnknownAttributeError.yamlnu�[���PK{}[�����0�j/ri/1.8/system/WSDL/XMLSchema/Parser/parse-i.yamlnu�[���PK{}[@P���V�k/ri/1.8/system/WSDL/XMLSchema/Parser/UnknownElementError/cdesc-UnknownElementError.yamlnu�[���PK{}[A����\8m/ri/1.8/system/WSDL/XMLSchema/Parser/ElementConstraintError/cdesc-ElementConstraintError.yamlnu�[���PK{}[�!��5�n/ri/1.8/system/WSDL/XMLSchema/Parser/cdesc-Parser.yamlnu�[���PK{}[�05��.�q/ri/1.8/system/WSDL/XMLSchema/Parser/new-c.yamlnu�[���PK{}[_����6s/ri/1.8/system/WSDL/XMLSchema/Parser/end_element-i.yamlnu�[���PK{}[K����8/t/ri/1.8/system/WSDL/XMLSchema/Parser/start_element-i.yamlnu�[���PK{}[�d#���Dgu/ri/1.8/system/WSDL/XMLSchema/Parser/ParseError/cdesc-ParseError.yamlnu�[���PK{}[�x�ڹ�2�v/ri/1.8/system/WSDL/XMLSchema/Parser/charset-i.yamlnu�[���PK{}[��9[��5�w/ri/1.8/system/WSDL/XMLSchema/Parser/characters-i.yamlnu�[���PK{}[��P��6�x/ri/1.8/system/WSDL/XMLSchema/Parser/decode_text-i.yamlnu�[���PK{}[z����\'z/ri/1.8/system/WSDL/XMLSchema/Parser/UnexpectedElementError/cdesc-UnexpectedElementError.yamlnu�[���PK{}[$u��5�{/ri/1.8/system/WSDL/XMLSchema/Parser/decode_tag-i.yamlnu�[���PK{}[�~���9�|/ri/1.8/system/WSDL/XMLSchema/Parser/ParseFrame/new-c.yamlnu�[���PK{}[�ξ��D ~/ri/1.8/system/WSDL/XMLSchema/Parser/ParseFrame/cdesc-ParseFrame.yamlnu�[���PK{}[{�r���:R�/ri/1.8/system/WSDL/XMLSchema/ComplexType/check_type-i.yamlnu�[���PK{}[;����D��/ri/1.8/system/WSDL/XMLSchema/ComplexType/find_element_by_name-i.yamlnu�[���PK{}[�Հ���:Ђ/ri/1.8/system/WSDL/XMLSchema/ComplexType/parse_attr-i.yamlnu�[���PK{}[������I	�/ri/1.8/system/WSDL/XMLSchema/ComplexType/child_defined_complextype-i.yamlnu�[���PK{}[��+L��Dh�/ri/1.8/system/WSDL/XMLSchema/ComplexType/sequence_elements%3d-i.yamlnu�[���PK{}[�5W���=��/ri/1.8/system/WSDL/XMLSchema/ComplexType/parse_element-i.yamlnu�[���PK{}[~a�e��:��/ri/1.8/system/WSDL/XMLSchema/ComplexType/child_type-i.yamlnu�[���PK{}[�����<.�/ri/1.8/system/WSDL/XMLSchema/ComplexType/compoundtype-i.yamlnu�[���PK{}[�X��bb?b�/ri/1.8/system/WSDL/XMLSchema/ComplexType/cdesc-ComplexType.yamlnu�[���PK{}[']�1��33�/ri/1.8/system/WSDL/XMLSchema/ComplexType/new-c.yamlnu�[���PK|}[]�_]��?V�/ri/1.8/system/WSDL/XMLSchema/ComplexType/targetnamespace-i.yamlnu�[���PK|}[6����<��/ri/1.8/system/WSDL/XMLSchema/ComplexType/find_element-i.yamlnu�[���PK|}[��}���B˕/ri/1.8/system/WSDL/XMLSchema/ComplexType/element_simpletype-i.yamlnu�[���PK|}[�c���?�/ri/1.8/system/WSDL/XMLSchema/ComplexType/find_aryelement-i.yamlnu�[���PK|}[L����?V�/ri/1.8/system/WSDL/XMLSchema/ComplexType/content_arytype-i.yamlnu�[���PK|}[ulcJ��?��/ri/1.8/system/WSDL/XMLSchema/ComplexType/all_elements%3d-i.yamlnu�[���PK|}[��P���<՚/ri/1.8/system/WSDL/XMLSchema/ComplexType/each_element-i.yamlnu�[���PK|}[Z��G��B,�/ri/1.8/system/WSDL/XMLSchema/ComplexType/elementformdefault-i.yamlnu�[���PK|}[Z܅���Cr�/ri/1.8/system/WSDL/XMLSchema/ComplexType/check_array_content-i.yamlnu�[���PK|}[�HL���<Þ/ri/1.8/system/WSDL/XMLSchema/ComplexType/find_arytype-i.yamlnu�[���PK|}[@TI��6��/ri/1.8/system/WSDL/XMLSchema/Include/parse_attr-i.yamlnu�[���PK|}[��m��9(�/ri/1.8/system/WSDL/XMLSchema/Include/parse_element-i.yamlnu�[���PK|}[G�'J��/^�/ri/1.8/system/WSDL/XMLSchema/Include/new-c.yamlnu�[���PK|}[��7o�/ri/1.8/system/WSDL/XMLSchema/Include/cdesc-Include.yamlnu�[���PK|}[cO�.��2�/ri/1.8/system/WSDL/XMLSchema/Include/import-i.yamlnu�[���PK|}[h�.���<�/ri/1.8/system/WSDL/XMLSchema/Element/directelement%3f-i.yamlnu�[���PK|}[DI����6F�/ri/1.8/system/WSDL/XMLSchema/Element/refelement-i.yamlnu�[���PK|}[0mtT��7l�/ri/1.8/system/WSDL/XMLSchema/Element/elementform-i.yamlnu�[���PK|}[�@��6��/ri/1.8/system/WSDL/XMLSchema/Element/parse_attr-i.yamlnu�[���PK|}[�����;ƫ/ri/1.8/system/WSDL/XMLSchema/Element/attr_reader_ref-c.yamlnu�[���PK|}[D�l���9�/ri/1.8/system/WSDL/XMLSchema/Element/parse_element-i.yamlnu�[���PK|}[-7zi��77�/ri/1.8/system/WSDL/XMLSchema/Element/cdesc-Element.yamlnu�[���PK|}[�:��/��/ri/1.8/system/WSDL/XMLSchema/Element/new-c.yamlnu�[���PK|}[�E�"��;��/ri/1.8/system/WSDL/XMLSchema/Element/targetnamespace-i.yamlnu�[���PK|}[�Ҏ���;��/ri/1.8/system/WSDL/XMLSchema/Element/map_as_array%3f-i.yamlnu�[���PK|}[�,���6&�/ri/1.8/system/WSDL/XMLSchema/Element/attributes-i.yamlnu�[���PK|}[m�xx��>L�/ri/1.8/system/WSDL/XMLSchema/Element/elementformdefault-i.yamlnu�[���PK}}[�Ԕ��2��/ri/1.8/system/WSDL/XMLSchema/All/parse_attr-i.yamlnu�[���PK}}[+p���5��/ri/1.8/system/WSDL/XMLSchema/All/parse_element-i.yamlnu�[���PK}}[ꎠ��+�/ri/1.8/system/WSDL/XMLSchema/All/new-c.yamlnu�[���PK}}[��@��7�/ri/1.8/system/WSDL/XMLSchema/All/targetnamespace-i.yamlnu�[���PK}}[��ݵ�.�/ri/1.8/system/WSDL/XMLSchema/All/%3c%3c-i.yamlnu�[���PK}}[�C����/*�/ri/1.8/system/WSDL/XMLSchema/All/cdesc-All.yamlnu�[���PK}}[���:N�/ri/1.8/system/WSDL/XMLSchema/All/elementformdefault-i.yamlnu�[���PK}}[��h��5��/ri/1.8/system/WSDL/XMLSchema/Unique/parse_attr-i.yamlnu�[���PK}}[� �-��8��/ri/1.8/system/WSDL/XMLSchema/Unique/parse_element-i.yamlnu�[���PK}}[�w�E��.��/ri/1.8/system/WSDL/XMLSchema/Unique/new-c.yamlnu�[���PK}}[�mt�]]5��/ri/1.8/system/WSDL/XMLSchema/Unique/cdesc-Unique.yamlnu�[���PK}}[������)��/ri/1.8/system/WSDL/Error/cdesc-Error.yamlnu�[���PK}}[V
:��.��/ri/1.8/system/WSDL/Operation/inputparts-i.yamlnu�[���PK}}[h�ֆ��-��/ri/1.8/system/WSDL/Operation/inputname-i.yamlnu�[���PK}}[�T�i��.��/ri/1.8/system/WSDL/Operation/parse_attr-i.yamlnu�[���PK}}[�ֻ)��1�/ri/1.8/system/WSDL/Operation/parse_element-i.yamlnu�[���PK}}[�:��'A�/ri/1.8/system/WSDL/Operation/new-c.yamlnu�[���PK}}[��,y��3A�/ri/1.8/system/WSDL/Operation/targetnamespace-i.yamlnu�[���PK}}[^�g���0e�/ri/1.8/system/WSDL/Operation/NameInfo/new-c.yamlnu�[���PK}}[��\���9��/ri/1.8/system/WSDL/Operation/NameInfo/cdesc-NameInfo.yamlnu�[���PK�}[�	��.��/ri/1.8/system/WSDL/Operation/input_info-i.yamlnu�[���PK�}[q�\��.��/ri/1.8/system/WSDL/Operation/sort_parts-i.yamlnu�[���PK�}[h2zw��1��/ri/1.8/system/WSDL/Operation/cdesc-Operation.yamlnu�[���PK�}[V_c?��.��/ri/1.8/system/WSDL/Operation/outputname-i.yamlnu�[���PK�}[�^ ��/��/ri/1.8/system/WSDL/Operation/outputparts-i.yamlnu�[���PK�}[mԹ�/�/ri/1.8/system/WSDL/Operation/output_info-i.yamlnu�[���PK�}[J4k���5�/ri/1.8/system/WSDL/OperationBinding/parse_attr-i.yamlnu�[���PK�}[=�T��8J�/ri/1.8/system/WSDL/OperationBinding/parse_element-i.yamlnu�[���PK�}[�%��>}�/ri/1.8/system/WSDL/OperationBinding/soapoperation_style-i.yamlnu�[���PK�}[�w���9��/ri/1.8/system/WSDL/OperationBinding/find_operation-i.yamlnu�[���PK�}[������.��/ri/1.8/system/WSDL/OperationBinding/new-c.yamlnu�[���PK�}[m��o��:��/ri/1.8/system/WSDL/OperationBinding/targetnamespace-i.yamlnu�[���PK�}[�}�=��5*�/ri/1.8/system/WSDL/OperationBinding/soapaction-i.yamlnu�[���PK�}[TT���=M�/ri/1.8/system/WSDL/OperationBinding/soapoperation_name-i.yamlnu�[���PK�}[)祺�3��/ri/1.8/system/WSDL/OperationBinding/porttype-i.yamlnu�[���PK�}[��?��/ri/1.8/system/WSDL/OperationBinding/cdesc-OperationBinding.yamlnu�[���PK�}[����$$"�/ri/1.8/system/WSDL/cdesc-WSDL.yamlnu�[���PK�}[��̷�/��/ri/1.8/system/WSDL/Definitions/porttypes-i.yamlnu�[���PK�}[�����-��/ri/1.8/system/WSDL/Definitions/binding-i.yamlnu�[���PK�}[>mb���0�0ri/1.8/system/WSDL/Definitions/parse_attr-i.yamlnu�[���PK�}[
���6�0ri/1.8/system/WSDL/Definitions/porttype_binding-i.yamlnu�[���PK�}[��|���.0ri/1.8/system/WSDL/Definitions/bindings-i.yamlnu�[���PK�}[y�����70ri/1.8/system/WSDL/Definitions/array_complextype-c.yamlnu�[���PK�}[A���.I0ri/1.8/system/WSDL/Definitions/services-i.yamlnu�[���PK�}[��^��3\0ri/1.8/system/WSDL/Definitions/parse_element-i.yamlnu�[���PK�}[�oc���8�0ri/1.8/system/WSDL/Definitions/collect_attributes-i.yamlnu�[���PK�}[.AU��3�0ri/1.8/system/WSDL/Definitions/parse_element-c.yamlnu�[���PK�}[���.��-�	0ri/1.8/system/WSDL/Definitions/service-i.yamlnu�[���PK�}[X[���6�
0ri/1.8/system/WSDL/Definitions/collect_elements-i.yamlnu�[���PK�}[���:0ri/1.8/system/WSDL/Definitions/collect_complextypes-i.yamlnu�[���PK�}[�<�ڳ�-U
0ri/1.8/system/WSDL/Definitions/inspect-i.yamlnu�[���PK�}[?�h���7e0ri/1.8/system/WSDL/Definitions/fault_complextype-c.yamlnu�[���PK�}[�脹��)�0ri/1.8/system/WSDL/Definitions/new-c.yamlnu�[���PK�}[�MWS��5�0ri/1.8/system/WSDL/Definitions/cdesc-Definitions.yamlnu�[���PK�}[����;�0ri/1.8/system/WSDL/Definitions/exception_complextype-c.yamlnu�[���PK�}[6�Q.�0ri/1.8/system/WSDL/Definitions/add_type-i.yamlnu�[���PK�}["�q��8`0ri/1.8/system/WSDL/Definitions/collect_faulttypes-i.yamlnu�[���PK�}[U���;�0ri/1.8/system/WSDL/Definitions/soap_rpc_complextypes-c.yamlnu�[���PK�}[>,���;�0ri/1.8/system/WSDL/Definitions/soap_rpc_complextypes-i.yamlnu�[���PK�}[������- 0ri/1.8/system/WSDL/Definitions/message-i.yamlnu�[���PK�}[>S̓��9 !0ri/1.8/system/WSDL/Definitions/collect_simpletypes-i.yamlnu�[���PK�}[�z]P��4T"0ri/1.8/system/WSDL/Definitions/op_bind_rpc%3f-i.yamlnu�[���PK�}[�y����@}#0ri/1.8/system/WSDL/Definitions/rpc_operation_complextypes-i.yamlnu�[���PK�}[�?�S��;�$0ri/1.8/system/WSDL/Definitions/elements_from_message-i.yamlnu�[���PK�}[��Z��8&0ri/1.8/system/WSDL/Definitions/targetnamespace%3d-i.yamlnu�[���PK�}[�h�ݹ�.L'0ri/1.8/system/WSDL/Definitions/porttype-i.yamlnu�[���PK�}[a���.c(0ri/1.8/system/WSDL/Definitions/messages-i.yamlnu�[���PK�}[�A���<v)0ri/1.8/system/WSDL/Definitions/collect_fault_messages-i.yamlnu�[���PK�}[��9��)�*0ri/1.8/system/WSDL/Types/cdesc-Types.yamlnu�[���PK�}[�7Uk��*�,0ri/1.8/system/WSDL/Types/parse_attr-i.yamlnu�[���PK�}[-�q��-�-0ri/1.8/system/WSDL/Types/parse_element-i.yamlnu�[���PK�}[���#�.0ri/1.8/system/WSDL/Types/new-c.yamlnu�[���PK�}[>��II+�/0ri/1.8/system/WSDL/Import/cdesc-Import.yamlnu�[���PK�}[@���+m20ri/1.8/system/WSDL/Import/parse_attr-i.yamlnu�[���PK�}[J��.�30ri/1.8/system/WSDL/Import/parse_element-i.yamlnu�[���PK�}[x�@��$�40ri/1.8/system/WSDL/Import/new-c.yamlnu�[���PK�}[E�Q��'�50ri/1.8/system/WSDL/Import/import-i.yamlnu�[���PK�}[v�C��*�60ri/1.8/system/WSDL/Param/parse_attr-i.yamlnu�[���PK�}[�\g��-�70ri/1.8/system/WSDL/Param/parse_element-i.yamlnu�[���PK�}[�U���,�80ri/1.8/system/WSDL/Param/find_message-i.yamlnu�[���PK�}[�����#�90ri/1.8/system/WSDL/Param/new-c.yamlnu�[���PK�}[g�%��/�:0ri/1.8/system/WSDL/Param/targetnamespace-i.yamlnu�[���PK�}[�F|BB)<0ri/1.8/system/WSDL/Param/cdesc-Param.yamlnu�[���PK�}[�)����,�?0ri/1.8/system/WSDL/Param/soapbody_use-i.yamlnu�[���PK�}[	�j��,�@0ri/1.8/system/WSDL/Binding/parse_attr-i.yamlnu�[���PK�}[)dk���/�A0ri/1.8/system/WSDL/Binding/parse_element-i.yamlnu�[���PK�}[�{��%�B0ri/1.8/system/WSDL/Binding/new-c.yamlnu�[���PK�}[�fܿ�1�C0ri/1.8/system/WSDL/Binding/targetnamespace-i.yamlnu�[���PK�}[��Hq��-E0ri/1.8/system/WSDL/Binding/cdesc-Binding.yamlnu�[���PK�}[�H|��(H0ri/1.8/system/WSDL/Importer/parse-i.yamlnu�[���PK�}[�3sr��)$I0ri/1.8/system/WSDL/Importer/import-c.yamlnu�[���PK�}[�-�l11/GJ0ri/1.8/system/WSDL/Importer/cdesc-Importer.yamlnu�[���PK�}[H#|!��2�K0ri/1.8/system/WSDL/Port/outputoperation_map-i.yamlnu�[���PK�}[�P(��)�L0ri/1.8/system/WSDL/Port/parse_attr-i.yamlnu�[���PK�}[�����,N0ri/1.8/system/WSDL/Port/parse_element-i.yamlnu�[���PK�}[la�T��".O0ri/1.8/system/WSDL/Port/new-c.yamlnu�[���PK�}[7T���.$P0ri/1.8/system/WSDL/Port/targetnamespace-i.yamlnu�[���PK�}[OD]^��+>Q0ri/1.8/system/WSDL/Port/find_binding-i.yamlnu�[���PK�}[�.9�22'OR0ri/1.8/system/WSDL/Port/cdesc-Port.yamlnu�[���PK�}[e����1�U0ri/1.8/system/WSDL/Port/inputoperation_map-i.yamlnu�[���PK�}[,�{���'�V0ri/1.8/system/WSDL/Port/porttype-i.yamlnu�[���PK�}[�}#��-X0ri/1.8/system/WSDL/PortType/parse_attr-i.yamlnu�[���PK�}[��y���0Y0ri/1.8/system/WSDL/PortType/parse_element-i.yamlnu�[���PK�}[�X�8��&AZ0ri/1.8/system/WSDL/PortType/new-c.yamlnu�[���PK�}[�����2?[0ri/1.8/system/WSDL/PortType/targetnamespace-i.yamlnu�[���PK�}[�}}D��/a\0ri/1.8/system/WSDL/PortType/find_binding-i.yamlnu�[���PK�}[jz
F||/z]0ri/1.8/system/WSDL/PortType/cdesc-PortType.yamlnu�[���PK�}[9�(7��,U`0ri/1.8/system/WSDL/PortType/locations-i.yamlnu�[���PK�}[I����Vea0ri/1.8/system/WSDL/Parser/AttributeConstraintError/cdesc-AttributeConstraintError.yamlnu�[���PK�}[k�����H�b0ri/1.8/system/WSDL/Parser/FormatDecodeError/cdesc-FormatDecodeError.yamlnu�[���PK�}[<��!��/:d0ri/1.8/system/WSDL/Parser/decode_tag_end-i.yamlnu�[���PK�}[Ik���P^e0ri/1.8/system/WSDL/Parser/UnknownAttributeError/cdesc-UnknownAttributeError.yamlnu�[���PK�}[Q&3��&�f0ri/1.8/system/WSDL/Parser/parse-i.yamlnu�[���PK�}[�^W���L�g0ri/1.8/system/WSDL/Parser/UnknownElementError/cdesc-UnknownElementError.yamlnu�[���PK�}[�WD���RHi0ri/1.8/system/WSDL/Parser/ElementConstraintError/cdesc-ElementConstraintError.yamlnu�[���PK�}[��C���+�j0ri/1.8/system/WSDL/Parser/cdesc-Parser.yamlnu�[���PK�}[�lj5��$�m0ri/1.8/system/WSDL/Parser/new-c.yamlnu�[���PK�}[������,�n0ri/1.8/system/WSDL/Parser/end_element-i.yamlnu�[���PK�}[w
����.�o0ri/1.8/system/WSDL/Parser/start_element-i.yamlnu�[���PK�}[lp�	��:q0ri/1.8/system/WSDL/Parser/ParseError/cdesc-ParseError.yamlnu�[���PK�}[�$�ڮ�(Gr0ri/1.8/system/WSDL/Parser/charset-i.yamlnu�[���PK�}[�,���+Ms0ri/1.8/system/WSDL/Parser/characters-i.yamlnu�[���PK�}[:u����,`t0ri/1.8/system/WSDL/Parser/decode_text-i.yamlnu�[���PK�}[�<*@��R{u0ri/1.8/system/WSDL/Parser/UnexpectedElementError/cdesc-UnexpectedElementError.yamlnu�[���PK�}[��z
��+�v0ri/1.8/system/WSDL/Parser/decode_tag-i.yamlnu�[���PK�}[���/x0ri/1.8/system/WSDL/Parser/ParseFrame/new-c.yamlnu�[���PK�}[S�"���:5y0ri/1.8/system/WSDL/Parser/ParseFrame/cdesc-ParseFrame.yamlnu�[���PK�}[������,R{0ri/1.8/system/WSDL/Message/parse_attr-i.yamlnu�[���PK�}[��!��/n|0ri/1.8/system/WSDL/Message/parse_element-i.yamlnu�[���PK�}[e²��%�}0ri/1.8/system/WSDL/Message/new-c.yamlnu�[���PK�}[$>���1�~0ri/1.8/system/WSDL/Message/targetnamespace-i.yamlnu�[���PK�}[L���

-�0ri/1.8/system/WSDL/Message/cdesc-Message.yamlnu�[���PK�}[�\2ʭ� �0ri/1.8/system/XML/cdesc-XML.yamlnu�[���PK�}[�y��*�0ri/1.8/system/XML/Parser/cdesc-Parser.yamlnu�[���PK�}[s����8w�0ri/1.8/system/Errno/ECONNABORTED/cdesc-ECONNABORTED.yamlnu�[���PK�}[��z��,��0ri/1.8/system/Errno/EPROTO/cdesc-EPROTO.yamlnu�[���PK�}[\!f--$ن0ri/1.8/system/Errno/cdesc-Errno.yamlnu�[���PK�}[�kP��4Z�0ri/1.8/system/Errno/ECONNRESET/cdesc-ECONNRESET.yamlnu�[���PK�}[F�j۽�,��0ri/1.8/system/TSortHash/cdesc-TSortHash.yamlnu�[���PK�}[vG���.��0ri/1.8/system/RiDisplay/append_features-c.yamlnu�[���PK�}[�f�>��"Ό0ri/1.8/system/RiDisplay/new-c.yamlnu�[���PK�}[7�[���,ȍ0ri/1.8/system/RiDisplay/cdesc-RiDisplay.yamlnu�[���PK�}[�r],��0ri/1.8/system/Timeout/Error/cdesc-Error.yamlnu�[���PK�}[}����<+�0ri/1.8/system/Timeout/ExitException/cdesc-ExitException.yamlnu�[���PK�}[ύ�0��$n�0ri/1.8/system/Timeout/timeout-i.yamlnu�[���PK�}[�8]PP(��0ri/1.8/system/Timeout/cdesc-Timeout.yamlnu�[���PK�}[�^��pp$X�0ri/1.8/system/fatal/cdesc-fatal.yamlnu�[���PK�}[��HLL%�0ri/1.8/system/Precision/prec_i-i.yamlnu�[���PK�}[�����,��0ri/1.8/system/Precision/cdesc-Precision.yamlnu�[���PK�}[�3�JJ#�0ri/1.8/system/Precision/prec-i.yamlnu�[���PK�}[эQ�EE%��0ri/1.8/system/Precision/prec_f-i.yamlnu�[���PK�}[
���'�0ri/1.8/system/Precision/included-c.yamlnu�[���PK�}[ia_�==<[�0ri/1.8/system/AmbiguousArgument/cdesc-AmbiguousArgument.yamlnu�[���PK�}[�_,�0ri/1.8/system/SM/SimpleMarkup/content-i.yamlnu�[���PK�}[��`&&0r�0ri/1.8/system/SM/SimpleMarkup/group_lines-i.yamlnu�[���PK�}[HN9��,��0ri/1.8/system/SM/SimpleMarkup/convert-i.yamlnu�[���PK�}[%�9�0ri/1.8/system/SM/SimpleMarkup/handled_labeled_list-i.yamlnu�[���PK�}[��E�-��0ri/1.8/system/SM/SimpleMarkup/add_html-i.yamlnu�[���PK�}[�֑�uu(�0ri/1.8/system/SM/SimpleMarkup/new-c.yamlnu�[���PK�}[G�(G**0ӹ0ri/1.8/system/SM/SimpleMarkup/add_special-i.yamlnu�[���PK�}[��a>��2]�0ri/1.8/system/SM/SimpleMarkup/add_word_pair-i.yamlnu�[���PK�}[���G3t�0ri/1.8/system/SM/SimpleMarkup/get_line_types-i.yamlnu�[���PK�}[7����:�0ri/1.8/system/SM/SimpleMarkup/assign_types_to_lines-i.yamlnu�[���PK�}[�I`�h
h
5�0ri/1.8/system/SM/SimpleMarkup/cdesc-SimpleMarkup.yamlnu�[���PK�}[�<��'��0ri/1.8/system/SM/Line/isBlank%3f-i.yamlnu�[���PK�}[=��� ��0ri/1.8/system/SM/Line/new-c.yamlnu�[���PK�}[u�! ��!��0ri/1.8/system/SM/Line/to_s-i.yamlnu�[���PK�}[z�Y�!!"��0ri/1.8/system/SM/Line/stamp-i.yamlnu�[���PK�}[��E��%I�0ri/1.8/system/SM/Line/cdesc-Line.yamlnu�[���PK�}[s��o��*[�0ri/1.8/system/SM/Line/strip_leading-i.yamlnu�[���PK�}[�=�jj/��0ri/1.8/system/SM/Paragraph/cdesc-Paragraph.yamlnu�[���PK�}[В�=��#y�0ri/1.8/system/SM/ListEnd/new-c.yamlnu�[���PK�}[ȓ
��+|�0ri/1.8/system/SM/ListEnd/cdesc-ListEnd.yamlnu�[���PK�}[|%����/��0ri/1.8/system/SM/BlankLine/cdesc-BlankLine.yamlnu�[���PK�}[���k��)��0ri/1.8/system/SM/Fragment/add_text-i.yamlnu�[���PK�}[��L0��*��0ri/1.8/system/SM/Fragment/type_name-c.yamlnu�[���PK�}[C�,���$�0ri/1.8/system/SM/Fragment/for-c.yamlnu�[���PK�}[��
���$�0ri/1.8/system/SM/Fragment/new-c.yamlnu�[���PK�}[X�ߨ�%�0ri/1.8/system/SM/Fragment/to_s-i.yamlnu�[���PK�}[l�-�0ri/1.8/system/SM/Fragment/cdesc-Fragment.yamlnu�[���PK�}[�2~��/m�0ri/1.8/system/SM/ListStart/cdesc-ListStart.yamlnu�[���PK�}[=��ܹ�%��0ri/1.8/system/SM/ListStart/new-c.yamlnu�[���PK�}[�"y	-��0ri/1.8/system/SM/ListBase/cdesc-ListBase.yamlnu�[���PK�}[���A/<�0ri/1.8/system/SM/Attribute/cdesc-Attribute.yamlnu�[���PK�}[#�h��+��0ri/1.8/system/SM/Attribute/as_string-c.yamlnu�[���PK�}[�F��.�0ri/1.8/system/SM/Attribute/each_name_of-c.yamlnu�[���PK�}[�0���,,�0ri/1.8/system/SM/Attribute/bitmap_for-c.yamlnu�[���PK�}[��C}��&A�0ri/1.8/system/SM/Lines/empty%3f-i.yamlnu�[���PK�}[]�.���"@�0ri/1.8/system/SM/Lines/each-i.yamlnu�[���PK�}[��&k��#p�0ri/1.8/system/SM/Lines/unget-i.yamlnu�[���PK�}[�%�F��$j�0ri/1.8/system/SM/Lines/delete-i.yamlnu�[���PK�}[��ュ�"m�0ri/1.8/system/SM/Lines/next-i.yamlnu�[���PK�}[ֹ�p��'d�0ri/1.8/system/SM/Lines/normalize-i.yamlnu�[���PK�}[�F9r>>$j�0ri/1.8/system/SM/Lines/rewind-i.yamlnu�[���PK�}[�[���!��0ri/1.8/system/SM/Lines/new-c.yamlnu�[���PK�}[|�<T��%�1ri/1.8/system/SM/Lines/as_text-i.yamlnu�[���PK�}[����(�1ri/1.8/system/SM/Lines/line_types-i.yamlnu�[���PK�}[��ܩQQ'�1ri/1.8/system/SM/Lines/cdesc-Lines.yamlnu�[���PK�}[8�����1ri/1.8/system/SM/cdesc-SM.yamlnu�[���PK�}[�sW{��'�1ri/1.8/system/SM/AttrSpan/%5b%5d-i.yamlnu�[���PK�}[�C:7��-�1ri/1.8/system/SM/AttrSpan/cdesc-AttrSpan.yamlnu�[���PK�}[5��!��$�
1ri/1.8/system/SM/AttrSpan/new-c.yamlnu�[���PK�}[�-J���*�1ri/1.8/system/SM/AttrSpan/set_attrs-i.yamlnu�[���PK�}[㝿��+
1ri/1.8/system/SM/LineCollection/each-i.yamlnu�[���PK�}[XU���+)1ri/1.8/system/SM/LineCollection/to_a-i.yamlnu�[���PK�}[7�[p7b1ri/1.8/system/SM/LineCollection/tidy_blank_lines-i.yamlnu�[���PK�}[&��B�1ri/1.8/system/SM/LineCollection/change_verbatim_blank_lines-i.yamlnu�[���PK�}[��~{��0�1ri/1.8/system/SM/LineCollection/normalize-i.yamlnu�[���PK�}[����*@1ri/1.8/system/SM/LineCollection/add-i.yamlnu�[���PK�}[
���HH6N1ri/1.8/system/SM/LineCollection/add_list_breaks-i.yamlnu�[���PK�}[���pp>�1ri/1.8/system/SM/LineCollection/add_list_start_and_ends-i.yamlnu�[���PK�}[�i���*�1ri/1.8/system/SM/LineCollection/new-c.yamlnu�[���PK�}[�M����9�1ri/1.8/system/SM/LineCollection/cdesc-LineCollection.yamlnu�[���PK�}[.A����+	 1ri/1.8/system/SM/LineCollection/to_s-i.yamlnu�[���PK�}[�K:��-!1ri/1.8/system/SM/LineCollection/accept-i.yamlnu�[���PK�}[,+�93,"1ri/1.8/system/SM/LineCollection/fragment_for-i.yamlnu�[���PK�}[m�~��A�#1ri/1.8/system/SM/AttributeManager/mask_protected_sequences-i.yamlnu�[���PK�}[A(����1�$1ri/1.8/system/SM/AttributeManager/add_html-i.yamlnu�[���PK�}[	H���;&1ri/1.8/system/SM/AttributeManager/display_attributes-i.yamlnu�[���PK�}[éA��-='1ri/1.8/system/SM/AttributeManager/flow-i.yamlnu�[���PK�}[(L'8��BM(1ri/1.8/system/SM/AttributeManager/changed_attribute_by_name-i.yamlnu�[���PK�}[�A�<��,�)1ri/1.8/system/SM/AttributeManager/new-c.yamlnu�[���PK�}[�M���4�*1ri/1.8/system/SM/AttributeManager/copy_string-i.yamlnu�[���PK�}[HN�d��9�+1ri/1.8/system/SM/AttributeManager/change_attribute-i.yamlnu�[���PK�}[�t����4(-1ri/1.8/system/SM/AttributeManager/add_special-i.yamlnu�[���PK�}[z����6W.1ri/1.8/system/SM/AttributeManager/add_word_pair-i.yamlnu�[���PK�}[�F�/772�/1ri/1.8/system/SM/AttributeManager/attribute-i.yamlnu�[���PK�}[�!�p��8)11ri/1.8/system/SM/AttributeManager/split_into_flow-i.yamlnu�[���PK�}[�аk��5W21ri/1.8/system/SM/AttributeManager/convert_html-i.yamlnu�[���PK�}[@���9�31ri/1.8/system/SM/AttributeManager/convert_specials-i.yamlnu�[���PK�}[a�z��C�41ri/1.8/system/SM/AttributeManager/unmask_protected_sequences-i.yamlnu�[���PK�}[R�8���661ri/1.8/system/SM/AttributeManager/convert_attrs-i.yamlnu�[���PK�}[x~�P�
�
=�71ri/1.8/system/SM/AttributeManager/cdesc-AttributeManager.yamlnu�[���PK�}[�䍳�)GC1ri/1.8/system/SM/Verbatim/add_text-i.yamlnu�[���PK�}[����LL-SD1ri/1.8/system/SM/Verbatim/cdesc-Verbatim.yamlnu�[���PK�}[��(��-�E1ri/1.8/system/SM/ListItem/cdesc-ListItem.yamlnu�[���PK�}[ɑ�9��0G1ri/1.8/system/SM/ToHtml/accept_blank_line-i.yamlnu�[���PK�}[x$�t(HH1ri/1.8/system/SM/ToHtml/init_tags-i.yamlnu�[���PK�}["�hֹ�&�I1ri/1.8/system/SM/ToHtml/on_tags-i.yamlnu�[���PK�}[Pl�[��0�J1ri/1.8/system/SM/ToHtml/accept_list_start-i.yamlnu�[���PK�}[鐮��.�K1ri/1.8/system/SM/ToHtml/convert_heading-i.yamlnu�[���PK�}[Eb����'M1ri/1.8/system/SM/ToHtml/off_tags-i.yamlnu�[���PK�}[�iD��+N1ri/1.8/system/SM/ToHtml/convert_flow-i.yamlnu�[���PK�}[,!���"1O1ri/1.8/system/SM/ToHtml/new-c.yamlnu�[���PK�}[�je.'P1ri/1.8/system/SM/ToHtml/start_accepting-i.yamlnu�[���PK�}[�L-��.�Q1ri/1.8/system/SM/ToHtml/list_item_start-i.yamlnu�[���PK�}[t=Z��-�R1ri/1.8/system/SM/ToHtml/html_list_name-i.yamlnu�[���PK�}[5��#�S1ri/1.8/system/SM/ToHtml/wrap-i.yamlnu�[���PK�}[Ґ�X��.KU1ri/1.8/system/SM/ToHtml/accept_verbatim-i.yamlnu�[���PK�}[@�z��,qV1ri/1.8/system/SM/ToHtml/end_accepting-i.yamlnu�[���PK�}[x�G�-�W1ri/1.8/system/SM/ToHtml/convert_string-i.yamlnu�[���PK�}[ͩy��/�X1ri/1.8/system/SM/ToHtml/accept_paragraph-i.yamlnu�[���PK�}[�^/�CC&#Z1ri/1.8/system/SM/ToHtml/add_tag-i.yamlnu�[���PK�}[6�ͻ��'�[1ri/1.8/system/SM/ToHtml/annotate-i.yamlnu�[���PK�}[��k��*�]1ri/1.8/system/SM/ToHtml/accept_rule-i.yamlnu�[���PK�}[�Xx���)�^1ri/1.8/system/SM/ToHtml/cdesc-ToHtml.yamlnu�[���PK�}[88����/�f1ri/1.8/system/SM/ToHtml/accept_list_item-i.yamlnu�[���PK�}[�ED���+h1ri/1.8/system/SM/ToHtml/list_end_for-i.yamlnu�[���PK�}[�~��-7i1ri/1.8/system/SM/ToHtml/accept_heading-i.yamlnu�[���PK�}[{����.Zj1ri/1.8/system/SM/ToHtml/accept_list_end-i.yamlnu�[���PK�}[��;x��.�k1ri/1.8/system/SM/ToHtml/convert_special-i.yamlnu�[���PK�}[l4�V��*�l1ri/1.8/system/SM/Flow/LIST/cdesc-LIST.yamlnu�[���PK�}[��y���%�n1ri/1.8/system/SM/Flow/LIST/new-c.yamlnu�[���PK�}[|rx��(�o1ri/1.8/system/SM/Flow/LIST/%3c%3c-i.yamlnu�[���PK�}[)�JNN%�p1ri/1.8/system/SM/Flow/cdesc-Flow.yamlnu�[���PK�}[�S����3:s1ri/1.8/system/SM/AttrChanger/cdesc-AttrChanger.yamlnu�[���PK�}[�o/��(�t1ri/1.8/system/SM/AttrChanger/to_s-i.yamlnu�[���PK�}[SI㞯�#�u1ri/1.8/system/SM/Special/new-c.yamlnu�[���PK�}[`���+�v1ri/1.8/system/SM/Special/cdesc-Special.yamlnu�[���PK�}[UHѫ��$�x1ri/1.8/system/SM/Special/to_s-i.yamlnu�[���PK�}[��դ�&�y1ri/1.8/system/SM/Special/%3d%3d-i.yamlnu�[���PK�}[����+�z1ri/1.8/system/SM/Heading/cdesc-Heading.yamlnu�[���PK�}[/�aZ��*:|1ri/1.8/system/SM/Heading/head_level-i.yamlnu�[���PK�}[�-	���%G}1ri/1.8/system/SM/Rule/cdesc-Rule.yamlnu�[���PK�}[��zH��0�~1ri/1.8/system/SM/ToFlow/accept_blank_line-i.yamlnu�[���PK�}[	���(�1ri/1.8/system/SM/ToFlow/init_tags-i.yamlnu�[���PK�}[ZV��&�1ri/1.8/system/SM/ToFlow/on_tags-i.yamlnu�[���PK�}[g^*��0+�1ri/1.8/system/SM/ToFlow/accept_list_start-i.yamlnu�[���PK�}[�\���'W�1ri/1.8/system/SM/ToFlow/off_tags-i.yamlnu�[���PK�}[2i^p��+f�1ri/1.8/system/SM/ToFlow/convert_flow-i.yamlnu�[���PK�}[(�4��"|�1ri/1.8/system/SM/ToFlow/new-c.yamlnu�[���PK�}[oZ��.r�1ri/1.8/system/SM/ToFlow/start_accepting-i.yamlnu�[���PK�}[j�%��.އ1ri/1.8/system/SM/ToFlow/accept_verbatim-i.yamlnu�[���PK�}[�6	&��,�1ri/1.8/system/SM/ToFlow/end_accepting-i.yamlnu�[���PK�}[�qV�-�1ri/1.8/system/SM/ToFlow/convert_string-i.yamlnu�[���PK�}[��z���/��1ri/1.8/system/SM/ToFlow/accept_paragraph-i.yamlnu�[���PK�}[*b��CC&��1ri/1.8/system/SM/ToFlow/add_tag-i.yamlnu�[���PK�}[&�w��)O�1ri/1.8/system/SM/ToFlow/cdesc-ToFlow.yamlnu�[���PK�}[m�H���'��1ri/1.8/system/SM/ToFlow/annotate-i.yamlnu�[���PK�}[�g�G��*}�1ri/1.8/system/SM/ToFlow/accept_rule-i.yamlnu�[���PK�}[<e�=��/��1ri/1.8/system/SM/ToFlow/accept_list_item-i.yamlnu�[���PK�}[�/=~��-��1ri/1.8/system/SM/ToFlow/accept_heading-i.yamlnu�[���PK�}[ñb���.�1ri/1.8/system/SM/ToFlow/accept_list_end-i.yamlnu�[���PK�}[���.	�1ri/1.8/system/SM/ToFlow/convert_special-i.yamlnu�[���PK�}[�.��..1+�1ri/1.8/system/SM/PreProcess/cdesc-PreProcess.yamlnu�[���PK�}[o�%���&��1ri/1.8/system/SM/PreProcess/new-c.yamlnu�[���PK�}[yi��zz4ՠ1ri/1.8/system/SM/PreProcess/find_include_file-i.yamlnu�[���PK�}[0���~~)��1ri/1.8/system/SM/PreProcess/handle-i.yamlnu�[���PK�}[�X*/��1ri/1.8/system/SM/PreProcess/include_file-i.yamlnu�[���PK�}[5+���!��1ri/1.8/system/SM/ToLaTeX/l-i.yamlnu�[���PK�}[�+{��!�1ri/1.8/system/SM/ToLaTeX/l-c.yamlnu�[���PK�}[	ض<��1�1ri/1.8/system/SM/ToLaTeX/accept_blank_line-i.yamlnu�[���PK�}[�b)�1ri/1.8/system/SM/ToLaTeX/init_tags-i.yamlnu�[���PK�}[{�����'t�1ri/1.8/system/SM/ToLaTeX/on_tags-i.yamlnu�[���PK�}[�%�^��1��1ri/1.8/system/SM/ToLaTeX/accept_list_start-i.yamlnu�[���PK�}[��C���/��1ri/1.8/system/SM/ToLaTeX/convert_heading-i.yamlnu�[���PK�}[�~v��+ۭ1ri/1.8/system/SM/ToLaTeX/cdesc-ToLaTeX.yamlnu�[���PK�}[��"��(ߺ1ri/1.8/system/SM/ToLaTeX/off_tags-i.yamlnu�[���PK�}[�����,�1ri/1.8/system/SM/ToLaTeX/convert_flow-i.yamlnu�[���PK�}[qTOe��#�1ri/1.8/system/SM/ToLaTeX/new-c.yamlnu�[���PK�}[��%�/�1ri/1.8/system/SM/ToLaTeX/start_accepting-i.yamlnu�[���PK�}[d����/n�1ri/1.8/system/SM/ToLaTeX/list_item_start-i.yamlnu�[���PK�}[���P��&��1ri/1.8/system/SM/ToLaTeX/escape-i.yamlnu�[���PK�}[�9F�$�1ri/1.8/system/SM/ToLaTeX/wrap-i.yamlnu�[���PK�}[p�=��/:�1ri/1.8/system/SM/ToLaTeX/accept_verbatim-i.yamlnu�[���PK�}[��U��-b�1ri/1.8/system/SM/ToLaTeX/end_accepting-i.yamlnu�[���PK�}[�H�U.x�1ri/1.8/system/SM/ToLaTeX/convert_string-i.yamlnu�[���PK�}[FƉ
��0��1ri/1.8/system/SM/ToLaTeX/accept_paragraph-i.yamlnu�[���PK�}[�}��EE'�1ri/1.8/system/SM/ToLaTeX/add_tag-i.yamlnu�[���PK�}[�6�v��+��1ri/1.8/system/SM/ToLaTeX/accept_rule-i.yamlnu�[���PK�}[�١���)��1ri/1.8/system/SM/ToLaTeX/list_name-i.yamlnu�[���PK�}[�W&���0��1ri/1.8/system/SM/ToLaTeX/accept_list_item-i.yamlnu�[���PK�}[��]f��,�1ri/1.8/system/SM/ToLaTeX/list_end_for-i.yamlnu�[���PK�}[�}���.?�1ri/1.8/system/SM/ToLaTeX/accept_heading-i.yamlnu�[���PK�}[��8���/d�1ri/1.8/system/SM/ToLaTeX/accept_list_end-i.yamlnu�[���PK�}[�;"���/��1ri/1.8/system/SM/ToLaTeX/convert_special-i.yamlnu�[���PK�}[#�"OO#��1ri/1.8/system/Comparable/%3c-i.yamlnu�[���PK�}[(^�yWW&R�1ri/1.8/system/Comparable/%3c%3d-i.yamlnu�[���PK�}[C�	�XX&��1ri/1.8/system/Comparable/%3e%3d-i.yamlnu�[���PK�}[mqԻ�.��1ri/1.8/system/Comparable/cdesc-Comparable.yamlnu�[���PK�}[�4$PP#��1ri/1.8/system/Comparable/%3e-i.yamlnu�[���PK�}[����&i�1ri/1.8/system/Comparable/%3d%3d-i.yamlnu�[���PK�}[�:���*Z�1ri/1.8/system/Comparable/between%3f-i.yamlnu�[���PK�}[`�͵��4[�1ri/1.8/system/WadlerExample/cdesc-WadlerExample.yamlnu�[���PK�}[��N��0��1ri/1.8/system/WadlerExample/Tree/cdesc-Tree.yamlnu�[���PK�}['�(�<<:��1ri/1.8/system/NeedlessArgument/cdesc-NeedlessArgument.yamlnu�[���PK�}[��}��!^�1ri/1.8/system/GC/stress%3d-c.yamlnu�[���PK�}[�9%P��'��1ri/1.8/system/GC/garbage_collect-i.yamlnu�[���PK�}[v�n���n�1ri/1.8/system/GC/cdesc-GC.yamlnu�[���PK�}[�
p�1ri/1.8/system/GC/stress-c.yamlnu�[���PK�}[���Ư���1ri/1.8/system/GC/disable-c.yamlnu�[���PK�}[fuS�����1ri/1.8/system/GC/enable-c.yamlnu�[���PK�}[˭��nn��1ri/1.8/system/GC/start-c.yamlnu�[���PK�}[��z��"��1ri/1.8/system/Ping/cdesc-Ping.yamlnu�[���PK�}[� =ZKK"�1ri/1.8/system/Ping/pingecho-i.yamlnu�[���PK�}[��V��'f�1ri/1.8/system/NameDescriptor/new-c.yamlnu�[���PK�}[�(�DKK3R2ri/1.8/system/NameDescriptor/full_class_name-i.yamlnu�[���PK�}[�T��62ri/1.8/system/NameDescriptor/cdesc-NameDescriptor.yamlnu�[���PK�}[�^�W2ri/1.8/system/Time/_load-c.yamlnu�[���PK�}[�y�����2ri/1.8/system/Time/utc-i.yamlnu�[���PK�}[i��c�� �
2ri/1.8/system/Time/tv_sec-i.yamlnu�[���PK�}[�j����2ri/1.8/system/Time/mon-i.yamlnu�[���PK�}[d�Q�� 2ri/1.8/system/Time/gmtime-i.yamlnu�[���PK�}[60�z��2ri/1.8/system/Time/day-i.yamlnu�[���PK�}[���gg 2ri/1.8/system/Time/eql%3f-i.yamlnu�[���PK�}[�����2ri/1.8/system/Time/ctime-i.yamlnu�[���PK�}[���FF�2ri/1.8/system/Time/isdst-i.yamlnu�[���PK�}[�&��!X2ri/1.8/system/Time/iso8601-i.yamlnu�[���PK�}[�1*���2ri/1.8/system/Time/mday-i.yamlnu�[���PK�}[�Na�� �2ri/1.8/system/Time/w3cdtf-c.yamlnu�[���PK�}[�`�j��#�2ri/1.8/system/Time/%3c%3d%3e-i.yamlnu�[���PK�}[�0�����!2ri/1.8/system/Time/at-c.yamlnu�[���PK�}[�y����$2ri/1.8/system/Time/to_i-i.yamlnu�[���PK�}[b�]�� �&2ri/1.8/system/Time/w3cdtf-i.yamlnu�[���PK�}[k[P�jj �'2ri/1.8/system/Time/mktime-c.yamlnu�[���PK�}[������*2ri/1.8/system/Time/to_a-i.yamlnu�[���PK�}[��
~���-2ri/1.8/system/Time/hour-i.yamlnu�[���PK�}[�L��/2ri/1.8/system/Time/times-c.yamlnu�[���PK�}[�����%12ri/1.8/system/Time/to_datetime-i.yamlnu�[���PK�}[$���&22ri/1.8/system/Time/apply_offset-c.yamlnu�[���PK�}[n@|C32ri/1.8/system/Time/gm-c.yamlnu�[���PK�}[���O__82ri/1.8/system/Time/sec-i.yamlnu�[���PK�}[�l{��!�:2ri/1.8/system/Time/to_yaml-i.yamlnu�[���PK�}[��{0��$�;2ri/1.8/system/Time/month_days-c.yamlnu�[���PK�}[��-��<2ri/1.8/system/Time/hash-i.yamlnu�[���PK�}[� �|
|
>2ri/1.8/system/Time/parse-c.yamlnu�[���PK�}[�-Y��$�H2ri/1.8/system/Time/utc_offset-i.yamlnu�[���PK�}[�vZ}} �K2ri/1.8/system/Time/gmt%3f-i.yamlnu�[���PK�}[��K!�O2ri/1.8/system/Time/tv_usec-i.yamlnu�[���PK�}[�J�۠� �Q2ri/1.8/system/Time/getutc-i.yamlnu�[���PK�}[ٱeU��"�T2ri/1.8/system/Time/yaml_new-c.yamlnu�[���PK�}[w_=���U2ri/1.8/system/Time/min-i.yamlnu�[���PK�}[zW���!�W2ri/1.8/system/Time/to_date-i.yamlnu�[���PK�}[���̖��X2ri/1.8/system/Time/year-i.yamlnu�[���PK�}[�;"�Z2ri/1.8/system/Time/strftime-i.yamlnu�[���PK�}[��Q$//!8b2ri/1.8/system/Time/inspect-i.yamlnu�[���PK�}[:ʹ}���d2ri/1.8/system/Time/wday-i.yamlnu�[���PK�}[m]�--#�f2ri/1.8/system/Time/localtime-i.yamlnu�[���PK�}[������"*i2ri/1.8/system/Time/httpdate-i.yamlnu�[���PK�}[��(hhOk2ri/1.8/system/Time/local-c.yamlnu�[���PK�}[gR�޸�n2ri/1.8/system/Time/new-c.yamlnu�[���PK�}[�����&r2ri/1.8/system/Time/marshal_load-i.yamlnu�[���PK�}[h����� Ds2ri/1.8/system/Time/rfc822-i.yamlnu�[���PK�}[����qt2ri/1.8/system/Time/usec-i.yamlnu�[���PK�}[-���%�v2ri/1.8/system/Time/zone_offset-c.yamlnu�[���PK�}[��Z�FF"�w2ri/1.8/system/Time/cdesc-Time.yamlnu�[���PK�}[���� p�2ri/1.8/system/Time/gmtoff-i.yamlnu�[���PK�}[1V3�66B�2ri/1.8/system/Time/zone-i.yamlnu�[���PK�}[m�hޯ�%ƒ2ri/1.8/system/Time/zone_utc%3f-c.yamlnu�[���PK�}[����ff#ʓ2ri/1.8/system/Time/xmlschema-c.yamlnu�[���PK�}[AK=͞���2ri/1.8/system/Time/getgm-i.yamlnu�[���PK�}[�pA���p�2ri/1.8/system/Time/month-i.yamlnu�[���PK�}[�J#�����2ri/1.8/system/Time/%2b-i.yamlnu�[���PK�}[]w�w"��2ri/1.8/system/Time/httpdate-c.yamlnu�[���PK�}[:C_�/�2ri/1.8/system/Time/succ-i.yamlnu�[���PK�}[d@���&��2ri/1.8/system/Time/marshal_dump-i.yamlnu�[���PK�}[���4��"Ѣ2ri/1.8/system/Time/getlocal-i.yamlnu�[���PK�}[s�X))ޥ2ri/1.8/system/Time/to_s-i.yamlnu�[���PK�}[UӪU�2ri/1.8/system/Time/_dump-i.yamlnu�[���PK�}[w�!55!��2ri/1.8/system/Time/rfc2822-i.yamlnu�[���PK�}[1D�؁�,�2ri/1.8/system/Time/utc-c.yamlnu�[���PK�}[&�7��$��2ri/1.8/system/Time/gmt_offset-i.yamlnu�[���PK�}[�L�;pp!س2ri/1.8/system/Time/rfc2822-c.yamlnu�[���PK�}[�R�}} ��2ri/1.8/system/Time/utc%3f-i.yamlnu�[���PK�}[L�DD f�2ri/1.8/system/Time/dst%3f-i.yamlnu�[���PK�}[�p����2ri/1.8/system/Time/to_f-i.yamlnu�[���PK�}[KEk���#"�2ri/1.8/system/Time/xmlschema-i.yamlnu�[���PK�}[UU��}}h�2ri/1.8/system/Time/now-c.yamlnu�[���PK�}[�t
���#2�2ri/1.8/system/Time/make_time-c.yamlnu�[���PK�}[y�I��g�2ri/1.8/system/Time/yday-i.yamlnu�[���PK�}[(���!J�2ri/1.8/system/Time/asctime-i.yamlnu�[���PK�}[��џ�@�2ri/1.8/system/Time/%2d-i.yamlnu�[���PK�}[H!�IIG,�2ri/1.8/system/OptionParser/RequiredArgument/cdesc-RequiredArgument.yamlnu�[���PK�}[���8��2ri/1.8/system/OptionParser/RequiredArgument/parse-i.yamlnu�[���PK�}[J��""2m�2ri/1.8/system/OptionParser/cdesc-OptionParser.yamlnu�[���PK�}[����\\9��2ri/1.8/system/OptionParser/OptionMap/cdesc-OptionMap.yamlnu�[���PK�}[!I�DD2��2ri/1.8/system/OptionParser/NoArgument/parse-i.yamlnu�[���PK�}[VވX��IT�2ri/1.8/system/OptionParser/NoArgument/incompatible_argument_styles-c.yamlnu�[���PK�}[��O���;��2ri/1.8/system/OptionParser/NoArgument/cdesc-NoArgument.yamlnu�[���PK�}[M1���4�2ri/1.8/system/OptionParser/NoArgument/pattern-c.yamlnu�[���PK�}[��T��4�2ri/1.8/system/OptionParser/Completion/convert-i.yamlnu�[���PK�}[��\��;$�2ri/1.8/system/OptionParser/Completion/cdesc-Completion.yamlnu�[���PK�}[��Լ��5Y�2ri/1.8/system/OptionParser/Completion/complete-i.yamlnu�[���PK�}[ j��IIG�3ri/1.8/system/OptionParser/OptionalArgument/cdesc-OptionalArgument.yamlnu�[���PK�}[���""8r3ri/1.8/system/OptionParser/OptionalArgument/parse-i.yamlnu�[���PK�}[�6z�ddC�3ri/1.8/system/OptionParser/PlacedArgument/cdesc-PlacedArgument.yamlnu�[���PK�}[���**6�3ri/1.8/system/OptionParser/PlacedArgument/parse-i.yamlnu�[���PK�}[T����-c3ri/1.8/system/OptionParser/switch_name-i.yamlnu�[���PK�}[��"��3�3ri/1.8/system/OptionParser/Switch/cdesc-Switch.yamlnu�[���PK�}[D�NN.�
3ri/1.8/system/OptionParser/Switch/guess-c.yamlnu�[���PK�}[��4���1�3ri/1.8/system/OptionParser/Switch/conv_arg-i.yamlnu�[���PK�}[E�)A��Es3ri/1.8/system/OptionParser/Switch/incompatible_argument_styles-c.yamlnu�[���PK�}[0;%�,�3ri/1.8/system/OptionParser/Switch/new-c.yamlnu�[���PK�}[ƣi���2E3ri/1.8/system/OptionParser/Switch/parse_arg-i.yamlnu�[���PK�}[�qnn2O3ri/1.8/system/OptionParser/Switch/summarize-i.yamlnu�[���PK�}[���ж�03ri/1.8/system/OptionParser/Switch/pattern-c.yamlnu�[���PK�}[Y�i4��&53ri/1.8/system/UDPSocket/connect-i.yamlnu�[���PK�}[u�00,@3ri/1.8/system/UDPSocket/cdesc-UDPSocket.yamlnu�[���PK�}[DP���#�$3ri/1.8/system/UDPSocket/send-i.yamlnu�[���PK�}[�`�J��0�%3ri/1.8/system/UDPSocket/recvfrom_nonblock-i.yamlnu�[���PK�}[�G�ǯ�#�.3ri/1.8/system/UDPSocket/bind-i.yamlnu�[���PK�}[�VaP��"�/3ri/1.8/system/Fill/cdesc-Fill.yamlnu�[���PK�}[�q��?13ri/1.8/system/XMLEncoding_ja/SJISHandler/cdesc-SJISHandler.yamlnu�[���PK�}[��$V��6�23ri/1.8/system/XMLEncoding_ja/cdesc-XMLEncoding_ja.yamlnu�[���PK�}[�Xhh1�33ri/1.8/system/ObjectSpace/define_finalizer-c.yamlnu�[���PK�}[I�#�663t53ri/1.8/system/ObjectSpace/undefine_finalizer-c.yamlnu�[���PK�}[� !'��/
73ri/1.8/system/ObjectSpace/call_finalizer-c.yamlnu�[���PK�}[&��8~~(X83ri/1.8/system/ObjectSpace/_id2ref-c.yamlnu�[���PK�}[;����0.;3ri/1.8/system/ObjectSpace/cdesc-ObjectSpace.yamlnu�[���PK�}[�d�h��1B3ri/1.8/system/ObjectSpace/remove_finalizer-c.yamlnu�[���PK�}[�%����0cC3ri/1.8/system/ObjectSpace/garbage_collect-c.yamlnu�[���PK�}[���?��,NE3ri/1.8/system/ObjectSpace/each_object-c.yamlnu�[���PK�}[������.�J3ri/1.8/system/ObjectSpace/add_finalizer-c.yamlnu�[���PK�}[��63��+�K3ri/1.8/system/ObjectSpace/finalizers-c.yamlnu�[���PK�}[��ubb")M3ri/1.8/system/Tempfile/size-i.yamlnu�[���PK�}[�Ziؽ�$�N3ri/1.8/system/Tempfile/unlink-i.yamlnu�[���PK�}[�o���"�P3ri/1.8/system/Tempfile/path-i.yamlnu�[���PK�}[���w��$:R3ri/1.8/system/Tempfile/delete-i.yamlnu�[���PK�}[�I���"nS3ri/1.8/system/Tempfile/open-i.yamlnu�[���PK�}[&�XO��!�T3ri/1.8/system/Tempfile/new-c.yamlnu�[���PK�}[��Y��*�X3ri/1.8/system/Tempfile/make_tmpname-i.yamlnu�[���PK�}[iOa{��$�Y3ri/1.8/system/Tempfile/length-i.yamlnu�[���PK�}[��MȻ�#+[3ri/1.8/system/Tempfile/close-i.yamlnu�[���PK�}[$����*9]3ri/1.8/system/Tempfile/cdesc-Tempfile.yamlnu�[���PK�}[m,f��&%a3ri/1.8/system/Tempfile/close%21-i.yamlnu�[���PK�}[]�����"db3ri/1.8/system/Tempfile/open-c.yamlnu�[���PK�}[�$O���d3ri/1.8/system/Date/_load-c.yamlnu�[���PK�}[���##!�e3ri/1.8/system/Date/england-i.yamlnu�[���PK�}[$�(��+Fg3ri/1.8/system/Date/Format/cdesc-Format.yamlnu�[���PK�}[l++��,Zh3ri/1.8/system/Date/Format/Bag/cdesc-Bag.yamlnu�[���PK�}[�^�"�""wi3ri/1.8/system/Date/cdesc-Date.yamlnu�[���PK�}[.�i���+��3ri/1.8/system/Date/gregorian_leap%3f-c.yamlnu�[���PK�}[т�??��3ri/1.8/system/Date/mon-i.yamlnu�[���PK�}[��|OO �3ri/1.8/system/Date/cwyear-i.yamlnu�[���PK�}[��'N����3ri/1.8/system/Date/day-i.yamlnu�[���PK�}[�>��gg(ݒ3ri/1.8/system/Date/julian_leap%3f-c.yamlnu�[���PK�}[��[[ ��3ri/1.8/system/Date/eql%3f-i.yamlnu�[���PK�}[�|ׇ�� G�3ri/1.8/system/Date/offset-i.yamlnu�[���PK�}[=ֳ���<�3ri/1.8/system/Date/ctime-i.yamlnu�[���PK�}[?��<!f�3ri/1.8/system/Date/ordinal-i.yamlnu�[���PK�}[U9�o��3ri/1.8/system/Date/civil-i.yamlnu�[���PK�}[�V��#�3ri/1.8/system/Date/gregorian-i.yamlnu�[���PK�}[0�_�s�3ri/1.8/system/Date/mday-i.yamlnu�[���PK�}[�ppQQӝ3ri/1.8/system/Date/today-c.yamlnu�[���PK�}[�S�699"s�3ri/1.8/system/Date/jd_to_ld-c.yamlnu�[���PK�}[��9�DD"��3ri/1.8/system/Date/ld_to_jd-c.yamlnu�[���PK�}[�/���#��3ri/1.8/system/Date/%3c%3d%3e-i.yamlnu�[���PK�}[�	�[SS#̥3ri/1.8/system/Date/jd_to_ajd-c.yamlnu�[���PK�}[�)��r�3ri/1.8/system/Date/amjd-i.yamlnu�[���PK�}[ <L"����3ri/1.8/system/Date/hour-i.yamlnu�[���PK�}[vu�H��"�3ri/1.8/system/Date/weeknum0-i.yamlnu�[���PK�}[��"�""*�3ri/1.8/system/Date/jd_to_commercial-c.yamlnu�[���PK�}[V�v��&e�3ri/1.8/system/Date/day_fraction-i.yamlnu�[���PK�}[/Fi����3ri/1.8/system/Date/jd-c.yamlnu�[���PK�}[����@@&��3ri/1.8/system/Date/sec_fraction-i.yamlnu�[���PK�}[7X4��!;�3ri/1.8/system/Date/leap%3f-i.yamlnu�[���PK�}[';�J

#g�3ri/1.8/system/Date/jd_to_mjd-c.yamlnu�[���PK�}[kㆷ��ǵ3ri/1.8/system/Date/cweek-i.yamlnu�[���PK�}[|g�UXX�3ri/1.8/system/Date/civil-c.yamlnu�[���PK�}[���^^$��3ri/1.8/system/Date/jd_to_wday-c.yamlnu�[���PK�}[��T���g�3ri/1.8/system/Date/sec-i.yamlnu�[���PK�}[÷���!��3ri/1.8/system/Date/to_yaml-i.yamlnu�[���PK�}[ڴ��==��3ri/1.8/system/Date/upto-i.yamlnu�[���PK�}[�/��!�3ri/1.8/system/Date/jd-i.yamlnu�[���PK�}[i#��"R�3ri/1.8/system/Date/next_day-i.yamlnu�[���PK�}[?�Ȱ��P�3ri/1.8/system/Date/hash-i.yamlnu�[���PK�}[D|�����3ri/1.8/system/Date/parse-c.yamlnu�[���PK�}[�]���g�3ri/1.8/system/Date/wnum1-i.yamlnu�[���PK�}[���/Y�3ri/1.8/system/Date/Infinity/cdesc-Infinity.yamlnu�[���PK�}[�Z�//%|�3ri/1.8/system/Date/amjd_to_ajd-c.yamlnu�[���PK�}[�zC��3ri/1.8/system/Date/next-i.yamlnu�[���PK�}[�}k��"d�3ri/1.8/system/Date/weeknum1-i.yamlnu�[���PK�}[Z���_�3ri/1.8/system/Date/ajd-i.yamlnu�[���PK�}[`��س� ��3ri/1.8/system/Date/_parse-c.yamlnu�[���PK�}[��EN����3ri/1.8/system/Date/wnum0-i.yamlnu�[���PK�}[uJ�����3ri/1.8/system/Date/min-i.yamlnu�[���PK�}[�������3ri/1.8/system/Date/year-i.yamlnu�[���PK�}[4;�4#��3ri/1.8/system/Date/mjd_to_jd-c.yamlnu�[���PK�}[`�^��#Q�3ri/1.8/system/Date/_strptime-c.yamlnu�[���PK�}[��R��"[�3ri/1.8/system/Date/strftime-i.yamlnu�[���PK�}[^Z��!]�3ri/1.8/system/Date/inspect-i.yamlnu�[���PK�}[�P��*��3ri/1.8/system/Date/commercial_to_jd-c.yamlnu�[���PK�}[ ���3ri/1.8/system/Date/wday-i.yamlnu�[���PK�}[IM�6��y�3ri/1.8/system/Date/new-c.yamlnu�[���PK�}[|�.�zz%��3ri/1.8/system/Date/valid_jd%3f-c.yamlnu�[���PK�}[Hi��&]�3ri/1.8/system/Date/gregorian%3f-i.yamlnu�[���PK�}[Eȷ���#��3ri/1.8/system/Date/%3d%3d%3d-i.yamlnu�[���PK�}[ �~Զ�-��3ri/1.8/system/Date/valid_commercial%3f-c.yamlnu�[���PK�}[��]����3ri/1.8/system/Date/step-i.yamlnu�[���PK�}[!c�����3ri/1.8/system/Date/start-i.yamlnu�[���PK�}[��t_�� '�3ri/1.8/system/Date/%3e%3e-i.yamlnu�[���PK�}[��֯$_�3ri/1.8/system/Date/commercial-i.yamlnu�[���PK�}[x�%{��3ri/1.8/system/Date/time-i.yamlnu�[���PK�}[e���??)�3ri/1.8/system/Date/cwday-i.yamlnu�[���PK�}[h�sq��%��3ri/1.8/system/Date/jd_to_civil-c.yamlnu�[���PK�}[�ք�����3ri/1.8/system/Date/zone-i.yamlnu�[���PK�}[�8* �3ri/1.8/system/Date/julian-i.yamlnu�[���PK�}[��Rrvv*�3ri/1.8/system/Date/valid_ordinal%3f-c.yamlnu�[���PK�}[vSl���'O�3ri/1.8/system/Date/jd_to_ordinal-c.yamlnu�[���PK�}[,Ӓz����3ri/1.8/system/Date/month-i.yamlnu�[���PK�}[��6.QQ�3ri/1.8/system/Date/%2b-i.yamlnu�[���PK�}[BAfj"i4ri/1.8/system/Date/strptime-c.yamlnu�[���PK�}[�C¡�� :4ri/1.8/system/Date/%3c%3c-i.yamlnu�[���PK�}[�qL��t4ri/1.8/system/Date/mjd-i.yamlnu�[���PK�}[����.�4ri/1.8/system/Date/time_to_day_fraction-c.yamlnu�[���PK�}[�H����	4ri/1.8/system/Date/succ-i.yamlnu�[���PK�}[׬��#�
4ri/1.8/system/Date/julian%3f-i.yamlnu�[���PK�}[��uZZ#J4ri/1.8/system/Date/ajd_to_jd-c.yamlnu�[���PK�}[���33�4ri/1.8/system/Date/to_s-i.yamlnu�[���PK�}[���0>>.x4ri/1.8/system/Date/day_fraction_to_time-c.yamlnu�[���PK�}[��x�((#4ri/1.8/system/Date/new_start-i.yamlnu�[���PK�}[���++�4ri/1.8/system/Date/ld-i.yamlnu�[���PK�}[�W_�ii#4ri/1.8/system/Date/julian%3f-c.yamlnu�[���PK�}[yH�D���4ri/1.8/system/Date/s3e-c.yamlnu�[���PK�}[�Z����4ri/1.8/system/Date/_dump-i.yamlnu�[���PK�}[�rܺ��'�4ri/1.8/system/Date/valid_time%3f-c.yamlnu�[���PK�}[Y���$�4ri/1.8/system/Date/new_offset-i.yamlnu�[���PK�}[��M'4ri/1.8/system/Date/ordinal_to_jd-c.yamlnu�[���PK�}[�pߜ��$\ 4ri/1.8/system/Date/commercial-c.yamlnu�[���PK�}[y;�e�$4ri/1.8/system/Date/italy-i.yamlnu�[���PK�}[e�g!BB �%4ri/1.8/system/Date/downto-i.yamlnu�[���PK�}[h����&�'4ri/1.8/system/Date/gregorian%3f-c.yamlnu�[���PK�}[�
�]]q)4ri/1.8/system/Date/now-c.yamlnu�[���PK�}[3T�m--+4ri/1.8/system/Date/yday-i.yamlnu�[���PK�}[h/�!�,4ri/1.8/system/Date/asctime-i.yamlnu�[���PK�}[4�����!�-4ri/1.8/system/Date/ordinal-c.yamlnu�[���PK�}[���&LL((14ri/1.8/system/Date/valid_civil%3f-c.yamlnu�[���PK�}[���gUU�44ri/1.8/system/Date/%2d-i.yamlnu�[���PK�}[�˗��%n74ri/1.8/system/Date/civil_to_jd-c.yamlnu�[���PK�}[Ѭ�..%�94ri/1.8/system/Date/ajd_to_amjd-c.yamlnu�[���PK�}[��9#��/;4ri/1.8/system/Proc/arity-i.yamlnu�[���PK�}[b
�vv  ?4ri/1.8/system/Proc/%5b%5d-i.yamlnu�[���PK�}[z-�YY!�D4ri/1.8/system/Proc/binding-i.yamlnu�[���PK�}[OS��xx�G4ri/1.8/system/Proc/call-i.yamlnu�[���PK�}[M��!``!VM4ri/1.8/system/Proc/to_proc-i.yamlnu�[���PK�}[�͓�cc"O4ri/1.8/system/Proc/cdesc-Proc.yamlnu�[���PK�}[��JÖ��S4ri/1.8/system/Proc/new-c.yamlnu�[���PK�}[����>>�V4ri/1.8/system/Proc/to_s-i.yamlnu�[���PK�}[���ff +X4ri/1.8/system/Proc/%3d%3d-i.yamlnu�[���PK�}[O�$����Y4ri/1.8/system/Proc/clone-i.yamlnu�[���PK�}[��5��.[4ri/1.8/system/ACL/ACLEntry/cdesc-ACLEntry.yamlnu�[���PK�}[e��̯�'�\4ri/1.8/system/ACL/ACLEntry/match-i.yamlnu�[���PK�}[�T�p��%�]4ri/1.8/system/ACL/ACLEntry/new-c.yamlnu�[���PK�}[S�2s��-�^4ri/1.8/system/ACL/ACLEntry/dot_pat_str-i.yamlnu�[���PK�}[�Ų���)`4ri/1.8/system/ACL/ACLEntry/dot_pat-i.yamlnu�[���PK�}[<�;���a4ri/1.8/system/ACL/new-c.yamlnu�[���PK�}[��s��&b4ri/1.8/system/ACL/allow_addr%3f-i.yamlnu�[���PK�}[l�����($c4ri/1.8/system/ACL/allow_socket%3f-i.yamlnu�[���PK�}[�%p���%0d4ri/1.8/system/ACL/install_list-i.yamlnu�[���PK�}[��Y__ 8e4ri/1.8/system/ACL/cdesc-ACL.yamlnu�[���PK�}[t��6��&�g4ri/1.8/system/ACL/ACLList/match-i.yamlnu�[���PK�}[�����$�h4ri/1.8/system/ACL/ACLList/add-i.yamlnu�[���PK�}[�6B��$�i4ri/1.8/system/ACL/ACLList/new-c.yamlnu�[���PK�}[�t
FF,�j4ri/1.8/system/ACL/ACLList/cdesc-ACLList.yamlnu�[���PK�}[
�u��%�l4ri/1.8/system/Class/superclass-i.yamlnu�[���PK�}[ƫ���	�	$�n4ri/1.8/system/Class/cdesc-Class.yamlnu�[���PK�}[�P����"�x4ri/1.8/system/Class/to_yaml-i.yamlnu�[���PK�}[��W]��#�y4ri/1.8/system/Class/allocate-i.yamlnu�[���PK�}[�]HG���|4ri/1.8/system/Class/new-c.yamlnu�[���PK�}[ڰ`����~4ri/1.8/system/Class/new-i.yamlnu�[���PK�}[E:�1��$ڀ4ri/1.8/system/Class/inherited-i.yamlnu�[���PK�}[?WŇ��(�4ri/1.8/system/DefaultDisplay/page-i.yamlnu�[���PK�}[8��PP67�4ri/1.8/system/DefaultDisplay/cdesc-DefaultDisplay.yamlnu�[���PK�}[�;����1�4ri/1.8/system/DefaultDisplay/display_usage-i.yamlnu�[���PK�}[{gzH7
�4ri/1.8/system/DefaultDisplay/display_method_list-i.yamlnu�[���PK�}[��2}��6��4ri/1.8/system/DefaultDisplay/display_class_list-i.yamlnu�[���PK�}[AT���4��4ri/1.8/system/DefaultDisplay/warn_no_database-i.yamlnu�[���PK�}[ �P���6�4ri/1.8/system/DefaultDisplay/list_known_classes-i.yamlnu�[���PK�}[��*��'�4ri/1.8/system/DefaultDisplay/new-c.yamlnu�[���PK�}[��t|��/%�4ri/1.8/system/DefaultDisplay/setup_pager-i.yamlnu�[���PK�}[�M��6@�4ri/1.8/system/DefaultDisplay/display_class_info-i.yamlnu�[���PK�}[i[$��0�4ri/1.8/system/DefaultDisplay/display_flow-i.yamlnu�[���PK�}[��A��7��4ri/1.8/system/DefaultDisplay/display_method_info-i.yamlnu�[���PK�}[F�_���4ٕ4ri/1.8/system/DefaultDisplay/list_known_names-i.yamlnu�[���PK�}[��6c��2�4ri/1.8/system/DefaultDisplay/display_params-i.yamlnu�[���PK�}[m�4401�4ri/1.8/system/ThreadError/cdesc-ThreadError.yamlnu�[���PK�}[a�dII0Ś4ri/1.8/system/Forwardable/cdesc-Forwardable.yamlnu�[���PK�}[��nC.n�4ri/1.8/system/Forwardable/def_delegator-i.yamlnu�[���PK�}[�
��8�4ri/1.8/system/Forwardable/def_instance_delegators-i.yamlnu�[���PK�}[hA�tff7D�4ri/1.8/system/Forwardable/def_instance_delegator-i.yamlnu�[���PK�}[�J@H/�4ri/1.8/system/Forwardable/def_delegators-i.yamlnu�[���PK�}[ZrW�00<��4ri/1.8/system/ZeroDivisionError/cdesc-ZeroDivisionError.yamlnu�[���PK~[Z�>u�J�J"�4man/man1/ruby.1nu�[���PK~[0����4man/man1/erb.1nu�[���PK~[Сy
y
)5man/man1/irb.1nu�[���PK~[������5man/man1/rake.1nu�[���PK~[3�8:��
� 5man/man1/ri.1nu�[���PK~[2?N��55doc/alt-ruby21/README.janu�[���PK~[n��I�IT5doc/alt-ruby21/ChangeLognu�[���PK~[p.ܻ0�0�@doc/alt-ruby21/NEWSnu�[���PK~[�C,@
@
�@doc/alt-ruby21/COPYING.janu�[���PK~[�;������@doc/alt-ruby21/README.EXTnu�[���PK~[|��Y�Y��Adoc/alt-ruby21/LEGALnu�[���PK~[�9�����Adoc/alt-ruby21/README.EXT.janu�[���PK~[�qo��Bdoc/alt-ruby21/BSDLnu�[���PK~[���	�	�Bdoc/alt-ruby21/COPYINGnu�[���PK~[`���Cdoc/alt-ruby21/READMEnu�[���PK~[��FN�F�FCdoc/alt-ruby21/GPLnu�[���PK~[�z���#�\Cdoc/alt-ruby21-rubygems/LICENSE.txtnu�[���PKo�[�'���!fCman/man1/sqlite3.1nu�[���PKo�[��D�B�BWwCdoc/alt-sqlite/README.mdnu�[���PK
B![p���(;�Clicenses/alt-php70-snuffleupagus/LICENSEnu�[���PKB![c��^0,0,+v�Cdoc/alt-php70-ioncube-loader/USER-GUIDE.txtnu�[���PKB![}��6�6�+Ddoc/alt-php70-ioncube-loader/USER-GUIDE.pdfnu�[���PKB![&�**(��Ddoc/alt-php70-ioncube-loader/LICENSE.txtnu�[���PKB![�_Y@����.��Ddoc/alt-php70-ioncube-loader/loader-wizard.phpnu�[���PKB![P�$���'>�Gdoc/alt-php70-ioncube-loader/README.txtnu�[���PKB![$�u���%~�Gdoc/alt-php70-snuffleupagus/README.mdnu�[���PKB![�E#/&&+��Gdoc/alt-php70-snuffleupagus/CONTRIBUTING.mdnu�[���PKB![�0,�%%�Gdoc/alt-php70-suhosin/CREDITSnu�[���PK4D![tjB�E�E}�Glicenses/ea-libargon2/LICENSEnu�[���PK+<$[�A����Hman/man5/FontDatabase.5nu�[���PK+<$[|v����Hman/man8/t1libconfig.8nu�[���PK+<$[���%Ht1lib/t1lib.confignu�[���PK+<$[iJs�>F>FJ'Hdoc/alt-t1lib/LICENSEnu�[���PK+<$[�C�6b6b�mHdoc/alt-t1lib/Changesnu�[���PK+<$[O�Ax��H�Hdoc/alt-t1lib/READMEnu�[���PK+<$[.���b�b>�Hdoc/alt-t1lib/LGPLnu�[���PK�e$[�*��;OIdoc/alt-ruby25/README.mdnu�[���PK�e$[�O����SgIdoc/alt-ruby25/ChangeLognu�[���PK�e$[�Np�MBMB)\]doc/alt-ruby25/NEWSnu�[���PK�e$[e��$$��]doc/alt-ruby25/README.ja.mdnu�[���PK�e$[�C,@
@
(�]doc/alt-ruby25/COPYING.janu�[���PK�e$[D�.���]doc/alt-ruby25/README.EXTnu�[���PK�e$[�$�zD�D��]doc/alt-ruby25/LEGALnu�[���PK�e$[�\��++�W^doc/alt-ruby25/README.EXT.janu�[���PK�e$[�qoX^doc/alt-ruby25/BSDLnu�[���PK�e$[n,�	�	Z]^doc/alt-ruby25/COPYINGnu�[���PK�e$[��FN�F�F�g^doc/alt-ruby25/GPLnu�[���PK}$[.zw�^man/man1/bundle-gem.1nu�[���PK}$[�;�����^man/man1/bundle-list.1nu�[���PK}$["�7����^man/man1/bundle-platform.1nu�[���PK}$[+3`-DD��^man/man1/bundle-open.1nu�[���PK}$[���MMb�^man/man1/bundle-inject.1nu�[���PK}$[��		��^man/man1/bundle-plugin.1nu�[���PK}$[�
���U�^man/man1/bundle-pristine.1nu�[���PK}$[f�Qvv,�^man/man1/bundle-lock.1nu�[���PK}$[�x��G�G��^man/man1/bundle-install.1nu�[���PK}$[;�H���7_man/man1/bundle-clean.1nu�[���PK}$[b�Mp

�:_man/man1/bundle-outdated.1nu�[���PK}$["�:11DH_man/man1/bundle-add.1nu�[���PK}$[��]]�O_man/man1/bundle-exec.1nu�[���PK}$[B�:��]j_man/man1/bundle-help.1nu�[���PK}$[�[�n��il_man/man1/bundle-check.1nu�[���PK}$[Ժ�p��up_man/man1/bundle.1nu�[���PK}$[1��>���_man/man1/bundle-console.1nu�[���PK}$[M��66��_man/man1/bundle-init.1nu�[���PK}$[�#K����_man/man1/bundle-info.1nu�[���PK}$[�:�RPP�_man/man1/bundle-remove.1nu�[���PK}$[=��q����_man/man1/bundle-show.1nu�[���PK}$[�I�OO��_man/man1/bundle-binstubs.1nu�[���PK}$[^A�I��9�_man/man1/bundle-viz.1nu�[���PK}$[����\�_man/man1/bundle-version.1nu�[���PK}$[$�q���&�_man/man1/bundle-doctor.1nu�[���PK}$[��O�U�U��_man/man1/bundle-config.1nu�[���PK}$[�;㊅
�
2�_man/man1/bundle-cache.1nu�[���PK}$[��C&U6U6�
`man/man1/bundle-update.1nu�[���PK}$[s��kZZ�A`man/man5/gemfile.5nu�[���PK}$[�k��(�`gems/specifications/rdoc-6.4.1.1.gemspecnu�[���PK}$[\��B$.$.*�`gems/specifications/bundler-2.3.27.gemspecnu�[���PK}$[㕸��*e�`gems/specifications/ruby-lsapi-5.6.gemspecnu�[���PK}$[����||&z�`gems/specifications/rack-3.0.8.gemspecnu�[���PK}$[t���QQ1L�`gems/specifications/default/io-wait-0.2.1.gemspecnu�[���PK}$[�V��2��`gems/specifications/default/readline-0.0.3.gemspecnu�[���PK}$[M`���.�`gems/specifications/default/find-0.1.1.gemspecnu�[���PK}$[�����/<�`gems/specifications/default/fcntl-1.0.1.gemspecnu�[���PK}$[G�@���3Hagems/specifications/default/benchmark-0.2.0.gemspecnu�[���PK}$[�F�[��1Sagems/specifications/default/strscan-3.0.1.gemspecnu�[���PK}$[U�kp��0\	agems/specifications/default/pstore-0.1.1.gemspecnu�[���PK}$[2��-A
agems/specifications/default/drb-2.1.0.gemspecnu�[���PK}$[��ק�,�agems/specifications/default/pp-0.3.0.gemspecnu�[���PK}$[ݐ�=��.�agems/specifications/default/yaml-0.2.0.gemspecnu�[���PK}$[��d�SS5�agems/specifications/default/io-nonblock-0.1.0.gemspecnu�[���PK}$[^k� ��0�!agems/specifications/default/fiddle-1.1.0.gemspecnu�[���PK}$[��tt0�&agems/specifications/default/ipaddr-1.2.4.gemspecnu�[���PK}$[��Cd0�*agems/specifications/default/base64-0.1.1.gemspecnu�[���PK}$[�%b���1/agems/specifications/default/ostruct-0.5.2.gemspecnu�[���PK}$[� �*��->4agems/specifications/default/cgi-0.3.7.gemspecnu�[���PK}$[���3m9agems/specifications/default/fileutils-1.6.0.gemspecnu�[���PK}$[ף��]]0a=agems/specifications/default/syslog-0.1.0.gemspecnu�[���PK}$[�.�<XX1Bagems/specifications/default/openssl-3.0.1.gemspecnu�[���PK}$[4�?bWW6�Hagems/specifications/default/net-protocol-0.1.2.gemspecnu�[���PK}$[�J���2�Nagems/specifications/default/tempfile-0.1.2.gemspecnu�[���PK}$[k>\���2�Ragems/specifications/default/pathname-0.2.0.gemspecnu�[���PK}$[�x_���6�Wagems/specifications/default/securerandom-0.2.0.gemspecnu�[���PK}$[|��//6�[agems/specifications/default/readline-ext-0.1.4.gemspecnu�[���PK}$[+�����-�bagems/specifications/default/nkf-0.1.1.gemspecnu�[���PK}$[킥���/�fagems/specifications/default/open3-0.1.1.gemspecnu�[���PK}$[�Mv�0�jagems/specifications/default/digest-3.1.0.gemspecnu�[���PK}$[B���55-"ragems/specifications/default/set-1.0.2.gemspecnu�[���PK}$[�	**-�vagems/specifications/default/csv-3.2.5.gemspecnu�[���PK}$[�c���1;agems/specifications/default/english-0.7.1.gemspecnu�[���PK}$[K-���3��agems/specifications/default/singleton-0.1.1.gemspecnu�[���PK}$[�:d88.��agems/specifications/default/racc-1.6.0.gemspecnu�[���PK}$[��#~��23�agems/specifications/default/observer-0.1.1.gemspecnu�[���PK}$[�˕4L�agems/specifications/default/shellwords-0.1.0.gemspecnu�[���PK}$[m"k�CC6��agems/specifications/default/did_you_mean-1.6.1.gemspecnu�[���PK}$[�^n�((4[�agems/specifications/default/net-http-0.3.0.1.gemspecnu�[���PK}$[��z���/�agems/specifications/default/tsort-0.1.0.gemspecnu�[���PK}$[�p���1��agems/specifications/default/mutex_m-0.1.1.gemspecnu�[���PK}$[`�R��2>�agems/specifications/default/optparse-0.2.0.gemspecnu�[���PK}$[\`S��.��agems/specifications/default/date-3.2.2.gemspecnu�[���PK}$[�Nf;tt.q�agems/specifications/default/uri-0.12.4.gemspecnu�[���PK}$[�B�
��1C�agems/specifications/default/timeout-0.2.0.gemspecnu�[���PK}$[����0O�agems/specifications/default/abbrev-0.1.0.gemspecnu�[���PK}$[�����0��agems/specifications/default/reline-0.3.1.gemspecnu�[���PK}$[,ı���5��agems/specifications/default/forwardable-1.3.2.gemspecnu�[���PK}$[0��{kk4}�agems/specifications/default/stringio-3.0.1.2.gemspecnu�[���PK}$[��2L�agems/specifications/default/open-uri-0.2.0.gemspecnu�[���PK}$[��
f��,Q�agems/specifications/default/un-0.2.0.gemspecnu�[���PK}$[��	Ʌ�0U�agems/specifications/default/logger-1.5.0.gemspecnu�[���PK}$[�����0:�agems/specifications/default/tmpdir-0.1.2.gemspecnu�[���PK}$[!zSS4��agems/specifications/default/getoptlong-0.1.1.gemspecnu�[���PK}$[0�3��/<�agems/specifications/default/rinda-0.1.1.gemspecnu�[���PK}$[�sz��8��agems/specifications/default/resolv-replace-0.1.0.gemspecnu�[���PK}$[%fZ3��1��agems/specifications/default/weakref-0.1.1.gemspecnu�[���PK}$[���P��-�bgems/specifications/default/erb-2.2.3.gemspecnu�[���PK}$[�S4p%%-�bgems/specifications/default/etc-1.3.0.gemspecnu�[���PK}$[��"8�bgems/specifications/default/ruby2_keywords-0.0.5.gemspecnu�[���PK}$[ `?���.gbgems/specifications/default/zlib-2.1.1.gemspecnu�[���PK}$[5��59�bgems/specifications/default/error_highlight-0.3.0.gemspecnu�[���PK}$[��f���.bgems/specifications/default/time-0.2.2.gemspecnu�[���PK}$[��dY��5?bgems/specifications/default/prettyprint-0.1.1.gemspecnu�[���PK}$[oK��2�"bgems/specifications/default/delegate-0.2.0.gemspecnu�[���PK}$[5��i��0�&bgems/specifications/default/resolv-0.2.1.gemspecnu�[���PK}$[����,�*bgems/specifications/bigdecimal-3.1.1.gemspecnu�[���PK}$[�J��
�
'�/bgems/specifications/psych-4.0.4.gemspecnu�[���PK}$[ƺ:WZZ'�:bgems/specifications/rake-13.0.6.gemspecnu�[���PK}$[U�v��&�Bbgems/specifications/json-2.6.1.gemspecnu�[���PK}$[hso���(�Kbgems/specifications/rackup-2.1.0.gemspecnu�[���PK}$[O?�R-Sbgems/specifications/io-console-0.5.11.gemspecnu�[���PK}$[@��ϼ�+qWbgems/gems/psych-4.0.4/lib/psych/versions.rbnu�[���PK}$[)��))0�Xbgems/gems/psych-4.0.4/lib/psych/nodes/mapping.rbnu�[���PK}$[Ϧ[/_bgems/gems/psych-4.0.4/lib/psych/nodes/stream.rbnu�[���PK}$[��AA1qcbgems/gems/psych-4.0.4/lib/psych/nodes/document.rbnu�[���PK}$[�����/kbgems/gems/psych-4.0.4/lib/psych/nodes/scalar.rbnu�[���PK}$[�ɉ.�qbgems/gems/psych-4.0.4/lib/psych/nodes/alias.rbnu�[���PK}$[�믍!!1_tbgems/gems/psych-4.0.4/lib/psych/nodes/sequence.rbnu�[���PK}$[0 ��-�|bgems/gems/psych-4.0.4/lib/psych/nodes/node.rbnu�[���PK}$[��'K��$�bgems/gems/psych-4.0.4/lib/psych/y.rbnu�[���PK}$[	M�,��/��bgems/gems/psych-4.0.4/lib/psych/class_loader.rbnu�[���PK}$[�2P,J�bgems/gems/psych-4.0.4/lib/psych/exception.rbnu�[���PK}$[MA�+��3��bgems/gems/psych-4.0.4/lib/psych/visitors/visitor.rbnu�[���PK}$[��{>QQ5ܒbgems/gems/psych-4.0.4/lib/psych/visitors/json_tree.rbnu�[���PK}$[���Z��3��bgems/gems/psych-4.0.4/lib/psych/visitors/emitter.rbnu�[���PK}$[R��(rr7��bgems/gems/psych-4.0.4/lib/psych/visitors/depth_first.rbnu�[���PK}$[$�]cAcA5��bgems/gems/psych-4.0.4/lib/psych/visitors/yaml_tree.rbnu�[���PK}$[�,��H1H13`�bgems/gems/psych-4.0.4/lib/psych/visitors/to_ruby.rbnu�[���PK}$[r���)cgems/gems/psych-4.0.4/lib/psych/stream.rbnu�[���PK}$[��,��*�cgems/gems/psych-4.0.4/lib/psych/handler.rbnu�[���PK}$[*JJ&"3cgems/gems/psych-4.0.4/lib/psych/set.rbnu�[���PK}$[:�;�3cgems/gems/psych-4.0.4/lib/psych/handlers/document_stream.rbnu�[���PK}$[.�^{{496cgems/gems/psych-4.0.4/lib/psych/handlers/recorder.rbnu�[���PK}$[���KK':cgems/gems/psych-4.0.4/lib/psych/omap.rbnu�[���PK}$[/��	�	(�:cgems/gems/psych-4.0.4/lib/psych/nodes.rbnu�[���PK}$[u�>22(�Dcgems/gems/psych-4.0.4/lib/psych/coder.rbnu�[���PK}$[�!����/Mcgems/gems/psych-4.0.4/lib/psych/tree_builder.rbnu�[���PK}$[g��jj+mYcgems/gems/psych-4.0.4/lib/psych/core_ext.rbnu�[���PK}$[�y2K��,2[cgems/gems/psych-4.0.4/lib/psych/streaming.rbnu�[���PK}$[H��LL/)^cgems/gems/psych-4.0.4/lib/psych/syntax_error.rbnu�[���PK}$[��3�`cgems/gems/psych-4.0.4/lib/psych/json/yaml_events.rbnu�[���PK}$[��:���.Bdcgems/gems/psych-4.0.4/lib/psych/json/stream.rbnu�[���PK}$[�����32fcgems/gems/psych-4.0.4/lib/psych/json/ruby_events.rbnu�[���PK}$[�Хcc4}hcgems/gems/psych-4.0.4/lib/psych/json/tree_builder.rbnu�[���PK}$[��R:��+Djcgems/gems/psych-4.0.4/lib/psych/visitors.rbnu�[���PK}$["5x��1�kcgems/gems/psych-4.0.4/lib/psych/scalar_scanner.rbnu�[���PK}$[��[��)�~cgems/gems/psych-4.0.4/lib/psych/parser.rbnu�[���PK}$[���obob"��cgems/gems/psych-4.0.4/lib/psych.rbnu�[���PK}$[��"��{�cgems/gems/erb-2.2.3/libexec/erbnuȯ��PK}$[ǻ��ii!��cgems/gems/rackup-2.1.0/bin/rackupnuȯ��PK}$[z����!;�cgems/gems/rackup-2.1.0/license.mdnu�[���PK}$[<�d�� /
dgems/gems/rackup-2.1.0/readme.mdnu�[���PK}$[�cϛ��,t
dgems/gems/rackup-2.1.0/lib/rackup/version.rbnu�[���PK}$[���HH0ddgems/gems/rackup-2.1.0/lib/rackup/handler/cgi.rbnu�[���PK}$[���|��4dgems/gems/rackup-2.1.0/lib/rackup/handler/webrick.rbnu�[���PK}$[lo|	��+j%dgems/gems/rackup-2.1.0/lib/rackup/stream.rbnu�[���PK}$[�F��;;,O:dgems/gems/rackup-2.1.0/lib/rackup/handler.rbnu�[���PK}$[/�:�4�4+�Edgems/gems/rackup-2.1.0/lib/rackup/server.rbnu�[���PK}$[�����,{dgems/gems/rackup-2.1.0/lib/rackup/lobster.rbnu�[���PK}$[��9�$$$9�dgems/gems/rackup-2.1.0/lib/rackup.rbnu�[���PK}$[e
�ee"��dgems/gems/rackup-2.1.0/security.mdnu�[���PK}$[t2�����!h�dgems/gems/rack-3.0.8/CHANGELOG.mdnu�[���PK}$[�tz��,�,�Megems/gems/rack-3.0.8/README.mdnu�[���PK}$[G�	TT �zegems/gems/rack-3.0.8/MIT-LICENSEnu�[���PK}$[�um�	�	 &egems/gems/rack-3.0.8/lib/rack.rbnu�[���PK}$[�|�Х�&H�egems/gems/rack-3.0.8/lib/rack/files.rbnu�[���PK}$[ɸHO��(C�egems/gems/rack-3.0.8/lib/rack/version.rbnu�[���PK}$[��3���0Y�egems/gems/rack-3.0.8/lib/rack/method_override.rbnu�[���PK}$[���4
4
(��egems/gems/rack-3.0.8/lib/rack/chunked.rbnu�[���PK}$[��44'
�egems/gems/rack-3.0.8/lib/rack/events.rbnu�[���PK}$[H��SGbGb(��egems/gems/rack-3.0.8/lib/rack/request.rbnu�[���PK}$[[�J)7.fgems/gems/rack-3.0.8/lib/rack/deflater.rbnu�[���PK}$[;�`�ff(�Dfgems/gems/rack-3.0.8/lib/rack/runtime.rbnu�[���PK}$[_��l��,THfgems/gems/rack-3.0.8/lib/rack/null_logger.rbnu�[���PK}$[d�NN,mMfgems/gems/rack-3.0.8/lib/rack/show_status.rbnu�[���PK}$[�ӎ cTcT&\fgems/gems/rack-3.0.8/lib/rack/utils.rbnu�[���PK}$[ѝo�%аfgems/gems/rack-3.0.8/lib/rack/head.rbnu�[���PK}$[�/�{{-1�fgems/gems/rack-3.0.8/lib/rack/mock_request.rbnu�[���PK}$[��A�*	�fgems/gems/rack-3.0.8/lib/rack/directory.rbnu�[���PK}$[K�bx){�fgems/gems/rack-3.0.8/lib/rack/reloader.rbnu�[���PK}$[VM�Vww%��fgems/gems/rack-3.0.8/lib/rack/etag.rbnu�[���PK}$[�ю	��'��fgems/gems/rack-3.0.8/lib/rack/static.rbnu�[���PK}$[��l�	�	4
ggems/gems/rack-3.0.8/lib/rack/multipart/generator.rbnu�[���PK}$[�N�$$87ggems/gems/rack-3.0.8/lib/rack/multipart/uploaded_file.rbnu�[���PK}$[��&�4�41�ggems/gems/rack-3.0.8/lib/rack/multipart/parser.rbnu�[���PK}$[�R�

.�Rggems/gems/rack-3.0.8/lib/rack/mock_response.rbnu�[���PK}$[��||��0f`ggems/gems/rack-3.0.8/lib/rack/conditional_get.rbnu�[���PK}$[@�j�	�	*�lggems/gems/rack-3.0.8/lib/rack/constants.rbnu�[���PK}$[��Y		(�vggems/gems/rack-3.0.8/lib/rack/cascade.rbnu�[���PK}$[�ʆ��6�60S�ggems/gems/rack-3.0.8/lib/rack/show_exceptions.rbnu�[���PK}$[O�~�*��ggems/gems/rack-3.0.8/lib/rack/recursive.rbnu�[���PK}$[YY�d

0�ggems/gems/rack-3.0.8/lib/rack/tempfile_reaper.rbnu�[���PK}$[��;�~~1��ggems/gems/rack-3.0.8/lib/rack/rewindable_input.rbnu�[���PK}$[Y4��88)d�ggems/gems/rack-3.0.8/lib/rack/sendfile.rbnu�[���PK}$[M�}Y??%��ggems/gems/rack-3.0.8/lib/rack/mock.rbnu�[���PK}$[�d�P��'��ggems/gems/rack-3.0.8/lib/rack/logger.rbnu�[���PK}$[U``"��*~�ggems/gems/rack-3.0.8/lib/rack/multipart.rbnu�[���PK}$[�
C�xx.��ggems/gems/rack-3.0.8/lib/rack/common_logger.rbnu�[���PK}$[>Sf?"?"(X�ggems/gems/rack-3.0.8/lib/rack/builder.rbnu�[���PK}$[����0�hgems/gems/rack-3.0.8/lib/rack/auth/digest/md5.rbnu�[���PK}$[����4lhgems/gems/rack-3.0.8/lib/rack/auth/digest/request.rbnu�[���PK}$[����2�hgems/gems/rack-3.0.8/lib/rack/auth/digest/nonce.rbnu�[���PK}$[����3lhgems/gems/rack-3.0.8/lib/rack/auth/digest/params.rbnu�[���PK}$[���

,�hgems/gems/rack-3.0.8/lib/rack/auth/digest.rbnu�[���PK}$[�����+R7hgems/gems/rack-3.0.8/lib/rack/auth/basic.rbnu�[���PK}$[,��UU6^<hgems/gems/rack-3.0.8/lib/rack/auth/abstract/request.rbnu�[���PK}$[l��GRR6@hgems/gems/rack-3.0.8/lib/rack/auth/abstract/handler.rbnu�[���PK}$[��՝[�[�%�Chgems/gems/rack-3.0.8/lib/rack/lint.rbnuȯ��PK}$[�&�{!{!-��hgems/gems/rack-3.0.8/lib/rack/query_parser.rbnu�[���PK}$[:�}=='Y�hgems/gems/rack-3.0.8/lib/rack/urlmap.rbnu�[���PK}$[O�i���(�igems/gems/rack-3.0.8/lib/rack/headers.rbnu�[���PK}$[М}���%igems/gems/rack-3.0.8/lib/rack/file.rbnu�[���PK}$[N4q���-igems/gems/rack-3.0.8/lib/rack/content_type.rbnu�[���PK}$[K?��33+)igems/gems/rack-3.0.8/lib/rack/body_proxy.rbnu�[���PK}$[�i\��'�igems/gems/rack-3.0.8/lib/rack/config.rbnu�[���PK}$[�gG��+�igems/gems/rack-3.0.8/lib/rack/media_type.rbnu�[���PK}$[>�==%�igems/gems/rack-3.0.8/lib/rack/lock.rbnu�[���PK}$[iZ�&&/."igems/gems/rack-3.0.8/lib/rack/content_length.rbnu�[���PK}$[$����*�*)�%igems/gems/rack-3.0.8/lib/rack/response.rbnu�[���PK}$[?�6/����%�Pigems/gems/rack-3.0.8/lib/rack/mime.rbnu�[���PK}$[���==�igems/gems/rack-3.0.8/SPEC.rdocnu�[���PK}$[��_**$Xjgems/gems/rack-3.0.8/CONTRIBUTING.mdnu�[���PK}$[�,���1�jgems/gems/bigdecimal-3.1.1/lib/bigdecimal/math.rbnu�[���PK}$[;<]]5�3jgems/gems/bigdecimal-3.1.1/lib/bigdecimal/jacobian.rbnu�[���PK}$[��_���1�<jgems/gems/bigdecimal-3.1.1/lib/bigdecimal/util.rbnu�[���PK}$[ь��3�Kjgems/gems/bigdecimal-3.1.1/lib/bigdecimal/ludcmp.rbnu�[���PK}$[h"A�ZZ3�Tjgems/gems/bigdecimal-3.1.1/lib/bigdecimal/newton.rbnu�[���PK}$[�H�k��i\jgems/gems/rake-13.0.6/exe/rakenuȯ��PK}$[�
i��"\ajgems/gems/rake-13.0.6/History.rdocnu�[���PK}$[�?qFF1@|kgems/gems/rake-13.0.6/doc/command_line_usage.rdocnu�[���PK}$[�'S{��'�kgems/gems/rake-13.0.6/doc/glossary.rdocnu�[���PK}$[��@u,u,"2�kgems/gems/rake-13.0.6/doc/jamis.rbnu�[���PK}$[��AA%��kgems/gems/rake-13.0.6/doc/example/b.cnu�[���PK}$[۸	���+��kgems/gems/rake-13.0.6/doc/example/Rakefile1nu�[���PK}$[�_�bgg(��kgems/gems/rake-13.0.6/doc/example/main.cnu�[���PK}$["�;WW+G�kgems/gems/rake-13.0.6/doc/example/Rakefile2nu�[���PK}$[Oq�AA%��kgems/gems/rake-13.0.6/doc/example/a.cnu�[���PK}$[�u���	�	)��kgems/gems/rake-13.0.6/doc/proto_rake.rdocnu�[���PK}$[v3�HH'��kgems/gems/rake-13.0.6/doc/rational.rdocnu�[���PK}$[����P�P'U�kgems/gems/rake-13.0.6/doc/rakefile.rdocnu�[���PK}$[t�S	]]!�Clgems/gems/rake-13.0.6/README.rdocnu�[���PK}$[W��!<Wlgems/gems/rake-13.0.6/MIT-LICENSEnu�[���PK}$[Q��=rr!�[lgems/gems/rake-13.0.6/lib/rake.rbnu�[���PK}$[���^		)kdlgems/gems/rake-13.0.6/lib/rake/promise.rbnu�[���PK}$[zWBd��)�mlgems/gems/rake-13.0.6/lib/rake/version.rbnu�[���PK}$[0Z�R��0olgems/gems/rake-13.0.6/lib/rake/private_reader.rbnu�[���PK}$[����<�plgems/gems/rake-13.0.6/lib/rake/invocation_exception_mixin.rbnu�[���PK}$[F-�
��0/slgems/gems/rake-13.0.6/lib/rake/dsl_definition.rbnu�[���PK}$[���Q��-|�lgems/gems/rake-13.0.6/lib/rake/rake_module.rbnu�[���PK}$[E��.��)яlgems/gems/rake-13.0.6/lib/rake/tasklib.rbnu�[���PK}$[)lq(-ϐlgems/gems/rake-13.0.6/lib/rake/packagetask.rbnu�[���PK}$[��l��4=�lgems/gems/rake-13.0.6/lib/rake/file_creation_task.rbnu�[���PK}$[��K\��2\�lgems/gems/rake-13.0.6/lib/rake/invocation_chain.rbnu�[���PK}$[ƋK�b�b-|�lgems/gems/rake-13.0.6/lib/rake/application.rbnu�[���PK}$[���YY,�mgems/gems/rake-13.0.6/lib/rake/multi_task.rbnu�[���PK}$[yOu�rr,�mgems/gems/rake-13.0.6/lib/rake/ext/string.rbnu�[���PK}$[u����*Y.mgems/gems/rake-13.0.6/lib/rake/ext/core.rbnu�[���PK}$[������-O1mgems/gems/rake-13.0.6/lib/rake/thread_pool.rbnu�[���PK}$[|��^��*aDmgems/gems/rake-13.0.6/lib/rake/testtask.rbnu�[���PK}$[�l�??.~Ymgems/gems/rake-13.0.6/lib/rake/trace_output.rbnu�[���PK}$[�R��2�2&\mgems/gems/rake-13.0.6/lib/rake/task.rbnu�[���PK}$[~�y�	�	0h�mgems/gems/rake-13.0.6/lib/rake/task_arguments.rbnu�[���PK}$[��i		0l�mgems/gems/rake-13.0.6/lib/rake/default_loader.rbnu�[���PK}$[QG�'՚mgems/gems/rake-13.0.6/lib/rake/clean.rbnu�[���PK}$[�d���1�1+I�mgems/gems/rake-13.0.6/lib/rake/file_list.rbnu�[���PK}$[��M	M	-t�mgems/gems/rake-13.0.6/lib/rake/cpu_counter.rbnu�[���PK}$[<9��2�mgems/gems/rake-13.0.6/lib/rake/rake_test_loader.rbnu�[���PK}$[��s�ZZ0]�mgems/gems/rake-13.0.6/lib/rake/file_utils_ext.rbnu�[���PK}$[n�#��5�mgems/gems/rake-13.0.6/lib/rake/task_argument_error.rbnu�[���PK}$[�I����+�mgems/gems/rake-13.0.6/lib/rake/file_task.rbnu�[���PK	}$[Jሀ�+k�mgems/gems/rake-13.0.6/lib/rake/backtrace.rbnu�[���PK	}$[���''+F�mgems/gems/rake-13.0.6/lib/rake/late_time.rbnu�[���PK	}$[�2��bb2�mgems/gems/rake-13.0.6/lib/rake/loaders/makefile.rbnu�[���PK	}$[�����+�ngems/gems/rake-13.0.6/lib/rake/cloneable.rbnu�[���PK	}$[?�{Hrr,�ngems/gems/rake-13.0.6/lib/rake/early_time.rbnu�[���PK	}$[�.*C}}'ungems/gems/rake-13.0.6/lib/rake/phony.rbnu�[���PK	}$[�j��'I	ngems/gems/rake-13.0.6/lib/rake/win32.rbnu�[���PK	}$[�R��-�ngems/gems/rake-13.0.6/lib/rake/linked_list.rbnu�[���PK	}$[��m��8!ngems/gems/rake-13.0.6/lib/rake/thread_history_display.rbnu�[���PK	}$[Ӭ�s~~?
 ngems/gems/rake-13.0.6/lib/rake/rule_recursion_overflow_error.rbnu�[���PK	}$[�����'�!ngems/gems/rake-13.0.6/lib/rake/scope.rbnu�[���PK	}$[�((.�%ngems/gems/rake-13.0.6/lib/rake/task_manager.rbnu�[���PK	}$[�lD��,JNngems/gems/rake-13.0.6/lib/rake/name_space.rbnu�[���PK	}$[��K��/dQngems/gems/rake-13.0.6/lib/rake/pseudo_status.rbnu�[���PK	}$[;Y�II,XSngems/gems/rake-13.0.6/lib/rake/file_utils.rbnu�[���PK	}$[�##B�B�!�bngems/gems/ruby-lsapi-5.6/setup.rbnu�[���PK	}$[�'�MM1��ngems/gems/ruby-lsapi-5.6/scripts/lsruby_runner.rbnuȯ��PK	}$[��ԍ#�#+>�ngems/gems/ruby-lsapi-5.6/ext/lsapi/Makefilenu�[���PK	}$[�W	q,,-&ogems/gems/ruby-lsapi-5.6/ext/lsapi/lsapidef.hnu�[���PK	}$[4�+ogems/gems/ruby-lsapi-5.6/ext/lsapi/.sitearchdir.timenu�[���PK	}$[d�C�R[R[+,ogems/gems/ruby-lsapi-5.6/ext/lsapi/lsruby.cnu�[���PK	}$[�7Zw��-��ogems/gems/ruby-lsapi-5.6/ext/lsapi/extconf.rbnu�[���PK	}$[���F����+�ogems/gems/ruby-lsapi-5.6/ext/lsapi/lsruby.onu�[���PK	}$[z�YhH.H.+Lzrgems/gems/ruby-lsapi-5.6/ext/lsapi/lsapi.sonuȯ��PK	}$[
3O8a�a�-�sgems/gems/ruby-lsapi-5.6/ext/lsapi/lsapilib.cnu�[���PK	}$[��Y�/�/-�zugems/gems/ruby-lsapi-5.6/ext/lsapi/lsapilib.hnu�[���PK	}$[L���(�(-�ugems/gems/ruby-lsapi-5.6/ext/lsapi/lsapilib.onu�[���PK	}$[�}AC��-,�zgems/gems/ruby-lsapi-5.6/rails/dispatch.lsapinuȯ��PK
}$[lV5���3��zgems/gems/ruby-lsapi-5.6/examples/lsapi_with_cgi.rbnuȯ��PK
}$[��.�.��zgems/gems/ruby-lsapi-5.6/examples/testlsapi.rbnuȯ��PK
}$[whf:��&<�zgems/gems/ruby-lsapi-5.6/lsapi.gemspecnu�[���PK
}$[�^wͱ��zgems/gems/ruby-lsapi-5.6/READMEnu�[���PK
}$[EK�<-M-M �zgems/gems/json-2.6.1/lib/json.rbnu�[���PK
}$[��..(�@{gems/gems/json-2.6.1/lib/json/version.rbnu�[���PK
}$[1z���$B{gems/gems/json-2.6.1/lib/json/ext.rbnu�[���PK
}$[E��”�/�C{gems/gems/json-2.6.1/lib/json/generic_object.rbnu�[���PK
}$[ҍ��iSiS'�I{gems/gems/json-2.6.1/lib/json/common.rbnu�[���PK
}$[Px���-��{gems/gems/json-2.6.1/lib/json/add/rational.rbnu�[���PK
}$[�k�.��{gems/gems/json-2.6.1/lib/json/add/exception.rbnu�[���PK
}$[���!!(r�{gems/gems/json-2.6.1/lib/json/add/set.rbnu�[���PK
}$[��ff+�{gems/gems/json-2.6.1/lib/json/add/symbol.rbnu�[���PK
}$[ȅ����,��{gems/gems/json-2.6.1/lib/json/add/complex.rbnu�[���PK
}$[�m��qq)׬{gems/gems/json-2.6.1/lib/json/add/date.rbnu�[���PK
}$[J��)��{gems/gems/json-2.6.1/lib/json/add/time.rbnu�[���PK
}$[@9%+�{gems/gems/json-2.6.1/lib/json/add/regexp.rbnu�[���PK
}$[o���aa/P�{gems/gems/json-2.6.1/lib/json/add/bigdecimal.rbnu�[���PK
}$[1+Ǔ00.�{gems/gems/json-2.6.1/lib/json/add/date_time.rbnu�[���PK
}$[�%��+��{gems/gems/json-2.6.1/lib/json/add/struct.rbnu�[���PK
}$[��a*�{gems/gems/json-2.6.1/lib/json/add/range.rbnu�[���PK
}$[��&a\\)w�{gems/gems/json-2.6.1/lib/json/add/core.rbnu�[���PK
}$[��m�,,�{gems/gems/json-2.6.1/lib/json/add/ostruct.rbnu�[���PK
}$[�C�6cc(��{gems/gems/bundler-2.3.27/libexec/bundlernuȯ��PK
}$[�w��~~'`�{gems/gems/bundler-2.3.27/libexec/bundlenuȯ��PK
}$[���=5�{gems/gems/bundler-2.3.27/lib/bundler/environment_preserver.rbnu�[���PK
}$[.z5a�{gems/gems/bundler-2.3.27/lib/bundler/man/bundle-gem.1nu�[���PK
}$[\'i�TT;��{gems/gems/bundler-2.3.27/lib/bundler/man/bundle-show.1.ronnnu�[���PK
}$[�;���6��{gems/gems/bundler-2.3.27/lib/bundler/man/bundle-list.1nu�[���PK
}$[�lr]];�{gems/gems/bundler-2.3.27/lib/bundler/man/bundle-help.1.ronnnu�[���PK
}$[1�~��?��{gems/gems/bundler-2.3.27/lib/bundler/man/bundle-binstubs.1.ronnnu�[���PK
}$[�8:��{gems/gems/bundler-2.3.27/lib/bundler/man/bundle-gem.1.ronnnu�[���PK
}$[s��kZZ2�|gems/gems/bundler-2.3.27/lib/bundler/man/gemfile.5nu�[���PK
}$[A��<pl|gems/gems/bundler-2.3.27/lib/bundler/man/bundle-cache.1.ronnnu�[���PK
}$[�)&LYY<�x|gems/gems/bundler-2.3.27/lib/bundler/man/bundle-check.1.ronnnu�[���PK
}$["�7��:�||gems/gems/bundler-2.3.27/lib/bundler/man/bundle-platform.1nu�[���PK
}$[+3`-DD6܂|gems/gems/bundler-2.3.27/lib/bundler/man/bundle-open.1nu�[���PK
}$[3����>��|gems/gems/bundler-2.3.27/lib/bundler/man/bundle-console.1.ronnnu�[���PK
}$[���MM8��|gems/gems/bundler-2.3.27/lib/bundler/man/bundle-inject.1nu�[���PK
}$[R�,a\C\C>S�|gems/gems/bundler-2.3.27/lib/bundler/man/bundle-install.1.ronnnu�[���PK
}$[|�Koo=�|gems/gems/bundler-2.3.27/lib/bundler/man/bundle-plugin.1.ronnnu�[���PK
}$[��		8��|gems/gems/bundler-2.3.27/lib/bundler/man/bundle-plugin.1nu�[���PK
}$[�
���:w�|gems/gems/bundler-2.3.27/lib/bundler/man/bundle-pristine.1nu�[���PK
}$[f�Qvv6n�|gems/gems/bundler-2.3.27/lib/bundler/man/bundle-lock.1nu�[���PK
}$[#]E22=J�|gems/gems/bundler-2.3.27/lib/bundler/man/bundle-update.1.ronnnu�[���PK
}$[�x��G�G9�*}gems/gems/bundler-2.3.27/lib/bundler/man/bundle-install.1nu�[���PK
}$[;�H��7�r}gems/gems/bundler-2.3.27/lib/bundler/man/bundle-clean.1nu�[���PK
}$[b�Mp

:�u}gems/gems/bundler-2.3.27/lib/bundler/man/bundle-outdated.1nu�[���PK
}$[�n��77?u�}gems/gems/bundler-2.3.27/lib/bundler/man/bundle-outdated.1.ronnnu�[���PK
}$["�:115�}gems/gems/bundler-2.3.27/lib/bundler/man/bundle-add.1nu�[���PK
}$[��]]6��}gems/gems/bundler-2.3.27/lib/bundler/man/bundle-exec.1nu�[���PK
}$[���o��>t�}gems/gems/bundler-2.3.27/lib/bundler/man/bundle-version.1.ronnnu�[���PK
}$[B�:��6��}gems/gems/bundler-2.3.27/lib/bundler/man/bundle-help.1nu�[���PK
}$[�[�n��7�}gems/gems/bundler-2.3.27/lib/bundler/man/bundle-check.1nu�[���PK
}$[O�tu��=�}gems/gems/bundler-2.3.27/lib/bundler/man/bundle-inject.1.ronnnu�[���PK
}$[Ժ�p��15�}gems/gems/bundler-2.3.27/lib/bundler/man/bundle.1nu�[���PK
}$[��h���;��}gems/gems/bundler-2.3.27/lib/bundler/man/bundle-init.1.ronnnu�[���PK
}$[�V�#;��}gems/gems/bundler-2.3.27/lib/bundler/man/bundle-list.1.ronnnu�[���PK
}$[�'�+
+
6)�}gems/gems/bundler-2.3.27/lib/bundler/man/bundle.1.ronnnu�[���PK
}$[��#s��?��}gems/gems/bundler-2.3.27/lib/bundler/man/bundle-pristine.1.ronnnu�[���PK
}$[1��>��9��}gems/gems/bundler-2.3.27/lib/bundler/man/bundle-console.1nu�[���PK
}$[���qq;��}gems/gems/bundler-2.3.27/lib/bundler/man/bundle-exec.1.ronnnu�[���PK
}$[M��666�~gems/gems/bundler-2.3.27/lib/bundler/man/bundle-init.1nu�[���PK}$[��:o~gems/gems/bundler-2.3.27/lib/bundler/man/bundle-add.1.ronnnu�[���PK}$[6�H��=�~gems/gems/bundler-2.3.27/lib/bundler/man/bundle-doctor.1.ronnnu�[���PK}$[�TI;;:(~gems/gems/bundler-2.3.27/lib/bundler/man/bundle-viz.1.ronnnu�[���PK}$[˱[y��=�~gems/gems/bundler-2.3.27/lib/bundler/man/bundle-remove.1.ronnnu�[���PK}$[ZۖX3R3R7~gems/gems/bundler-2.3.27/lib/bundler/man/gemfile.5.ronnnu�[���PK}$[�#K���6�q~gems/gems/bundler-2.3.27/lib/bundler/man/bundle-info.1nu�[���PK}$[�5���;�s~gems/gems/bundler-2.3.27/lib/bundler/man/bundle-open.1.ronnnu�[���PK}$[�:�RPP8�u~gems/gems/bundler-2.3.27/lib/bundler/man/bundle-remove.1nu�[���PK}$[=��q��6�y~gems/gems/bundler-2.3.27/lib/bundler/man/bundle-show.1nu�[���PK}$[�I�OO:�|~gems/gems/bundler-2.3.27/lib/bundler/man/bundle-binstubs.1nu�[���PK}$[9IG���;��~gems/gems/bundler-2.3.27/lib/bundler/man/bundle-lock.1.ronnnu�[���PK}$[�3�pp<ɏ~gems/gems/bundler-2.3.27/lib/bundler/man/bundle-clean.1.ronnnu�[���PK}$[l����?��~gems/gems/bundler-2.3.27/lib/bundler/man/bundle-platform.1.ronnnu�[���PK}$[^A�I��5�~gems/gems/bundler-2.3.27/lib/bundler/man/bundle-viz.1nu�[���PK}$[����93�~gems/gems/bundler-2.3.27/lib/bundler/man/bundle-version.1nu�[���PK}$[$�q���8�~gems/gems/bundler-2.3.27/lib/bundler/man/bundle-doctor.1nu�[���PK}$[��O�U�U8�~gems/gems/bundler-2.3.27/lib/bundler/man/bundle-config.1nu�[���PK}$[�;㊅
�
7i�~gems/gems/bundler-2.3.27/lib/bundler/man/bundle-cache.1nu�[���PK}$[�S�LL=U	gems/gems/bundler-2.3.27/lib/bundler/man/bundle-config.1.ronnnu�[���PK}$[���qq;�Ugems/gems/bundler-2.3.27/lib/bundler/man/bundle-info.1.ronnnu�[���PK}$[��C&U6U68�Wgems/gems/bundler-2.3.27/lib/bundler/man/bundle-update.1nu�[���PK}$[����/w�gems/gems/bundler-2.3.27/lib/bundler/version.rbnu�[���PK}$[W�|��*��gems/gems/bundler-2.3.27/lib/bundler/ui.rbnu�[���PK}$[��3�

0�gems/gems/bundler-2.3.27/lib/bundler/cli/init.rbnu�[���PK}$[5H
��4P�gems/gems/bundler-2.3.27/lib/bundler/cli/platform.rbnu�[���PK}$[V�9��0U�gems/gems/bundler-2.3.27/lib/bundler/cli/fund.rbnu�[���PK}$[�^f09�gems/gems/bundler-2.3.27/lib/bundler/cli/list.rbnu�[���PK}$[a����$�$4��gems/gems/bundler-2.3.27/lib/bundler/cli/outdated.rbnu�[���PK}$[�st��0��gems/gems/bundler-2.3.27/lib/bundler/cli/show.rbnu�[���PK}$[�im�$>$>/-�gems/gems/bundler-2.3.27/lib/bundler/cli/gem.rbnu�[���PK}$[�p�u��2��gems/gems/bundler-2.3.27/lib/bundler/cli/doctor.rbnu�[���PK}$[���1�'�gems/gems/bundler-2.3.27/lib/bundler/cli/check.rbnu�[���PK}$["�G���4-�gems/gems/bundler-2.3.27/lib/bundler/cli/binstubs.rbnu�[���PK}$[�c|��
�
0u4�gems/gems/bundler-2.3.27/lib/bundler/cli/info.rbnu�[���PK}$[�LLb	b	0oB�gems/gems/bundler-2.3.27/lib/bundler/cli/exec.rbnu�[���PK}$[��8831L�gems/gems/bundler-2.3.27/lib/bundler/cli/console.rbnu�[���PK}$[��)``1�P�gems/gems/bundler-2.3.27/lib/bundler/cli/clean.rbnu�[���PK}$[Ak���2�S�gems/gems/bundler-2.3.27/lib/bundler/cli/plugin.rbnu�[���PK}$[�;�.>>/�Z�gems/gems/bundler-2.3.27/lib/bundler/cli/viz.rbnu�[���PK}$[mV����0o_�gems/gems/bundler-2.3.27/lib/bundler/cli/open.rbnu�[���PK}$[g�ӽFF1�c�gems/gems/bundler-2.3.27/lib/bundler/cli/issue.rbnu�[���PK}$[⮬�772Pi�gems/gems/bundler-2.3.27/lib/bundler/cli/common.rbnu�[���PK}$[/Ԗ __2�{�gems/gems/bundler-2.3.27/lib/bundler/cli/remove.rbnu�[���PK}$[3�LT��4�}�gems/gems/bundler-2.3.27/lib/bundler/cli/pristine.rbnu�[���PK}$[U<�{{2���gems/gems/bundler-2.3.27/lib/bundler/cli/update.rbnu�[���PK}$[ ��ii1x��gems/gems/bundler-2.3.27/lib/bundler/cli/cache.rbnu�[���PK}$[a���2B��gems/gems/bundler-2.3.27/lib/bundler/cli/config.rbnu�[���PK}$[lqOww2���gems/gems/bundler-2.3.27/lib/bundler/cli/inject.rbnu�[���PK}$[�`K��0���gems/gems/bundler-2.3.27/lib/bundler/cli/lock.rbnu�[���PK}$[R�L��/oÀgems/gems/bundler-2.3.27/lib/bundler/cli/add.rbnu�[���PK}$[|���3�ɀgems/gems/bundler-2.3.27/lib/bundler/cli/install.rbnu�[���PK}$[Ӄ�nDD5�gems/gems/bundler-2.3.27/lib/bundler/plugin/events.rbnu�[���PK}$["�x��2��gems/gems/bundler-2.3.27/lib/bundler/plugin/dsl.rbnu�[���PK}$[Φ��AA:��gems/gems/bundler-2.3.27/lib/bundler/plugin/source_list.rbnu�[���PK}$[UK<�
�
8���gems/gems/bundler-2.3.27/lib/bundler/plugin/installer.rbnu�[���PK}$[}[?n		<�	�gems/gems/bundler-2.3.27/lib/bundler/plugin/installer/git.rbnu�[���PK}$[zm��A
�gems/gems/bundler-2.3.27/lib/bundler/plugin/installer/rubygems.rbnu�[���PK}$[.���4#�gems/gems/bundler-2.3.27/lib/bundler/plugin/index.rbnu�[���PK}$[�6�PP2%�gems/gems/bundler-2.3.27/lib/bundler/plugin/api.rbnu�[���PK}$[����.�.9�0�gems/gems/bundler-2.3.27/lib/bundler/plugin/api/source.rbnu�[���PK}$[<��,,:�_�gems/gems/bundler-2.3.27/lib/bundler/settings/validator.rbnu�[���PK}$[��{�+yl�gems/gems/bundler-2.3.27/lib/bundler/env.rbnu�[���PK}$[�W	�?�?<倁gems/gems/bundler-2.3.27/lib/bundler/rubygems_integration.rbnu�[���PK}$[\�����,��gems/gems/bundler-2.3.27/lib/bundler/vlad.rbnu�[���PK}$[�u:����+CÁgems/gems/bundler-2.3.27/lib/bundler/cli.rbnu�[���PK}$[E�d��>F_�gems/gems/bundler-2.3.27/lib/bundler/endpoint_specification.rbnu�[���PK}$[��Ǵ�5�n�gems/gems/bundler-2.3.27/lib/bundler/vendored_thor.rbnu�[���PK}$[�:H�OO<�o�gems/gems/bundler-2.3.27/lib/bundler/remote_specification.rbnu�[���PK}$[|L�0��4u�gems/gems/bundler-2.3.27/lib/bundler/ruby_version.rbnu�[���PK}$[�OP#oo.���gems/gems/bundler-2.3.27/lib/bundler/errors.rbnu�[���PK}$[�?��4o��gems/gems/bundler-2.3.27/lib/bundler/self_manager.rbnu�[���PK}$[s�{ss4ڹ�gems/gems/bundler-2.3.27/lib/bundler/feature_flag.rbnu�[���PK}$[�a-���gems/gems/bundler-2.3.27/lib/bundler/setup.rbnu�[���PK}$[�T�ee:łgems/gems/bundler-2.3.27/lib/bundler/vendored_molinillo.rbnu�[���PK
}$[��Z7)7)/�łgems/gems/bundler-2.3.27/lib/bundler/runtime.rbnu�[���PK
}$[�0<[�O�O+{�gems/gems/bundler-2.3.27/lib/bundler/dsl.rbnu�[���PK
}$[6�e$ll1�?�gems/gems/bundler-2.3.27/lib/bundler/deprecate.rbnu�[���PK
}$[7�1�GG6�C�gems/gems/bundler-2.3.27/lib/bundler/match_platform.rbnu�[���PK
}$[/k��*�*65F�gems/gems/bundler-2.3.27/lib/bundler/shared_helpers.rbnu�[���PK
}$[�����0Yq�gems/gems/bundler-2.3.27/lib/bundler/ruby_dsl.rbnu�[���PK
}$[��-
-
;�t�gems/gems/bundler-2.3.27/lib/bundler/resolver/spec_group.rbnu�[���PK
}$[>��T��5I�gems/gems/bundler-2.3.27/lib/bundler/resolver/base.rbnu�[���PK
}$[����5�50Y��gems/gems/bundler-2.3.27/lib/bundler/settings.rbnu�[���PK
}$[��K663X��gems/gems/bundler-2.3.27/lib/bundler/ui/rg_proxy.rbnu�[���PK
}$[�N�s
s
0�gems/gems/bundler-2.3.27/lib/bundler/ui/shell.rbnu�[���PK
}$[��[

1�Ƀgems/gems/bundler-2.3.27/lib/bundler/ui/silent.rbnu�[���PK
}$[3��,��-2΃gems/gems/bundler-2.3.27/lib/bundler/graph.rbnu�[���PK
}$[f)q
q
<��gems/gems/bundler-2.3.27/lib/bundler/compact_index_client.rbnu�[���PK
}$[�]�YY:f�gems/gems/bundler-2.3.27/lib/bundler/fetcher/downloader.rbnu�[���PK
}$[��
N��4)��gems/gems/bundler-2.3.27/lib/bundler/fetcher/base.rbnu�[���PK}$[�q=@�gems/gems/bundler-2.3.27/lib/bundler/fetcher/compact_index.rbnu�[���PK}$[��is995��gems/gems/bundler-2.3.27/lib/bundler/fetcher/index.rbnu�[���PK}$[L�;8�
�
:[�gems/gems/bundler-2.3.27/lib/bundler/fetcher/dependency.rbnu�[���PK}$[
�>��:[!�gems/gems/bundler-2.3.27/lib/bundler/lockfile_generator.rbnu�[���PK}$[�H��.p*�gems/gems/bundler-2.3.27/lib/bundler/digest.rbnu�[���PK}$[�CW(W(0{3�gems/gems/bundler-2.3.27/lib/bundler/injector.rbnu�[���PK}$[���22\�gems/gems/bundler-2.3.27/lib/bundler/source_map.rbnu�[���PK}$[�x)��2@e�gems/gems/bundler-2.3.27/lib/bundler/gem_helper.rbnu�[���PK}$[�9l5,5,/Y��gems/gems/bundler-2.3.27/lib/bundler/fetcher.rbnu�[���PK}$[p2Ǥ��1�gems/gems/bundler-2.3.27/lib/bundler/constants.rbnu�[���PK}$[K�,�""6"��gems/gems/bundler-2.3.27/lib/bundler/match_metadata.rbnu�[���PK}$[��>--.���gems/gems/bundler-2.3.27/lib/bundler/plugin.rbnu�[���PK}$[{�*!''.ބgems/gems/bundler-2.3.27/lib/bundler/source.rbnu�[���PK}$[���''3��gems/gems/bundler-2.3.27/lib/bundler/source_list.rbnu�[���PK}$[�[F�U5U50�gems/gems/bundler-2.3.27/lib/bundler/resolver.rbnu�[���PK}$[���\\A�8�gems/gems/bundler-2.3.27/lib/bundler/source/rubygems_aggregate.rbnu�[���PK}$[�ƨ'6�A�gems/gems/bundler-2.3.27/lib/bundler/source/gemspec.rbnu�[���PK}$[6]m�<<3 C�gems/gems/bundler-2.3.27/lib/bundler/source/path.rbnu�[���PK}$[E3��$$<�b�gems/gems/bundler-2.3.27/lib/bundler/source/git/git_proxy.rbnu�[���PK}$[�k�P*P*2-��gems/gems/bundler-2.3.27/lib/bundler/source/git.rbnu�[���PK}$[�i�EE7߱�gems/gems/bundler-2.3.27/lib/bundler/source/rubygems.rbnu�[���PK}$[�:U''>Z��gems/gems/bundler-2.3.27/lib/bundler/source/rubygems/remote.rbnu�[���PK}$[M9��MM7�gems/gems/bundler-2.3.27/lib/bundler/source/metadata.rbnu�[���PK}$[u�R!xx=��gems/gems/bundler-2.3.27/lib/bundler/source/path/installer.rbnu�[���PK}$[un�uu-��gems/gems/bundler-2.3.27/lib/bundler/retry.rbnu�[���PK}$[�_���4Z�gems/gems/bundler-2.3.27/lib/bundler/process_lock.rbnu�[���PK}$[ó����>l�gems/gems/bundler-2.3.27/lib/bundler/rubygems_gem_installer.rbnu�[���PK}$[�eA�ss2�-�gems/gems/bundler-2.3.27/lib/bundler/capistrano.rbnu�[���PK}$[��IVV3�1�gems/gems/bundler-2.3.27/lib/bundler/gem_helpers.rbnu�[���PK}$[��[5��;DB�gems/gems/bundler-2.3.27/lib/bundler/vendored_persistent.rbnu�[���PK}$[Htd]]6qH�gems/gems/bundler-2.3.27/lib/bundler/vendored_tsort.rbnu�[���PK}$[�_����64I�gems/gems/bundler-2.3.27/lib/bundler/build_metadata.rbnu�[���PK}$[}X���1hN�gems/gems/bundler-2.3.27/lib/bundler/gem_tasks.rbnu�[���PK}$[�`��	�	4SO�gems/gems/bundler-2.3.27/lib/bundler/current_ruby.rbnu�[���PK}$[B$h�HH.]Y�gems/gems/bundler-2.3.27/lib/bundler/mirror.rbnu�[���PK}$[��!6n	n	7q�gems/gems/bundler-2.3.27/lib/bundler/yaml_serializer.rbnu�[���PK}$[�.pE2
2
.�z�gems/gems/bundler-2.3.27/lib/bundler/inline.rbnu�[���PK}$[CX�j��Gh��gems/gems/bundler-2.3.27/lib/bundler/compact_index_client/gem_parser.rbnu�[���PK}$[n�5�	�	Bz��gems/gems/bundler-2.3.27/lib/bundler/compact_index_client/cache.rbnu�[���PK}$[@��ymmD���gems/gems/bundler-2.3.27/lib/bundler/compact_index_client/updater.rbnu�[���PK}$[_l�__7e��gems/gems/bundler-2.3.27/lib/bundler/vendored_tmpdir.rbnu�[���PK}$[0�ee:+��gems/gems/bundler-2.3.27/lib/bundler/vendored_fileutils.rbnu�[���PK}$[��x>���gems/gems/bundler-2.3.27/lib/bundler/uri_credentials_filter.rbnu�[���PK}$[��lՕ*�*1���gems/gems/bundler-2.3.27/lib/bundler/installer.rbnu�[���PK}$[�-L006zԆgems/gems/bundler-2.3.27/lib/bundler/version_ranges.rbnu�[���PK}$[�SJLL6�gems/gems/bundler-2.3.27/lib/bundler/templates/Gemfilenu�[���PK}$[���J��D��gems/gems/bundler-2.3.27/lib/bundler/templates/Executable.standalonenu�[���PK}$[�X'j]]9��gems/gems/bundler-2.3.27/lib/bundler/templates/Executablenu�[���PK}$[�SJLL6��gems/gems/bundler-2.3.27/lib/bundler/templates/gems.rbnu�[���PK}$[^6)g&&L;�gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/circleci/config.yml.ttnu�[���PK}$[�5B��D��gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/bin/console.ttnu�[���PK}$[����B��gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/bin/setup.ttnu�[���PK}$[���QQD��gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/LICENSE.txt.ttnu�[���PK}$[z���FFC��gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/exe/newgem.ttnu�[���PK}$[��M��LW��gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/ext/newgem/newgem.c.ttnu�[���PK}$[9��5ffN��gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/ext/newgem/extconf.rb.ttnu�[���PK}$[�?����L���gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/ext/newgem/newgem.h.ttnu�[���PK}$[/���++D��gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/rubocop.yml.ttnu�[���PK}$[Ӟ�G��E|��gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/standard.yml.ttnu�[���PK}$[�]���R���gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/github/workflows/main.yml.ttnu�[���PK}$[
z�^�	�	B��gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/README.md.ttnu�[���PK}$[�lq55>)�gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/rspec.ttnu�[���PK}$[؊s�@��gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/Gemfile.ttnu�[���PK}$[,��
UK�gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/test/minitest/test_newgem.rb.ttnu�[���PK}$[�M-n��U��gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/test/minitest/test_helper.rb.ttnu�[���PK}$[q��{33V�gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.ttnu�[���PK}$[G�>J��V��gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.ttnu�[���PK}$[���_ccK��gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.ttnu�[���PK}$[��~~C�%�gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/travis.yml.ttnu�[���PK}$[!5��PPE�&�gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/CHANGELOG.md.ttnu�[���PK}$[Ҧ+���Ls'�gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/spec/spec_helper.rb.ttnu�[���PK}$[32
���Ly)�gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/spec/newgem_spec.rb.ttnu�[���PK}$[A�ܶ�F�*�gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/gitlab-ci.yml.ttnu�[���PK}$[z�y��A,�gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/Rakefile.ttnu�[���PK}$[��Br==F�1�gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/lib/newgem.rb.ttnu�[���PK}$[��N44�gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/lib/newgem/version.rb.ttnu�[���PK}$[!�b--G�5�gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/newgem.gemspec.ttnu�[���PK}$[N��meeGo=�gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/sig/newgem.rbs.ttnu�[���PK}$[g2����BK?�gems/gems/bundler-2.3.27/lib/bundler/templates/newgem/gitignore.ttnu�[���PK}$[]�yA�@�gems/gems/bundler-2.3.27/lib/bundler/templates/Executable.bundlernu�[���PK}$[�!
!
?M�gems/gems/bundler-2.3.27/lib/bundler/installer/gem_installer.rbnu�[���PK}$[��y��D�W�gems/gems/bundler-2.3.27/lib/bundler/installer/parallel_installer.rbnu�[���PK}$[�aboXX<u�gems/gems/bundler-2.3.27/lib/bundler/installer/standalone.rbnu�[���PK}$[|��YY4ˀ�gems/gems/bundler-2.3.27/lib/bundler/vendored_uri.rbnu�[���PK}$[)PY�\\;���gems/gems/bundler-2.3.27/lib/bundler/similarity_detector.rbnu�[���PK}$[�� �<O��gems/gems/bundler-2.3.27/lib/bundler/gem_version_promoter.rbnu�[���PK}$[jIUKxx0���gems/gems/bundler-2.3.27/lib/bundler/spec_set.rbnu�[���PK}$[a�#Y-���gems/gems/bundler-2.3.27/lib/bundler/index.rbnu�[���PK}$[x�7��.�LJgems/gems/bundler-2.3.27/lib/bundler/worker.rbnu�[���PK}$[h����2�Ӈgems/gems/bundler-2.3.27/lib/bundler/deployment.rbnu�[���PK}$[��288:�gems/gems/bundler-2.3.27/lib/bundler/lazy_specification.rbnu�[���PK}$[�Q���)�)4���gems/gems/bundler-2.3.27/lib/bundler/rubygems_ext.rbnu�[���PK}$[ZP��((:� �gems/gems/bundler-2.3.27/lib/bundler/stub_specification.rbnu�[���PK}$[���__=�,�gems/gems/bundler-2.3.27/lib/bundler/match_remote_metadata.rbnu�[���PK}$[���t/�/�FO0�gems/gems/bundler-2.3.27/lib/bundler/vendor/fileutils/lib/fileutils.rbnu�[���PK}$[l��HYYF�gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo.rbnu�[���PK}$[��S��gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rbnu�[���PK}$[��޳ttM��gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/errors.rbnu�[���PK}$[�.mV��[��gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rbnu�[���PK}$[Ի�HH^��gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rbnu�[���PK}$[�X�Accb�)�gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rbnu�[���PK}$[@G�{��^�0�gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rbnu�[���PK}$[:ʘ!��k�4�gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rbnu�[���PK}$[���D""cr;�gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rbnu�[���PK}$[D�Njool'C�gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rbnu�[���PK}$[5	�[2K�gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rbnu�[���PK}$[�	?=WWc�Y�gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rbnu�[���PK}$[�ۦ���g�^�gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rbnu�[���PK}$[9DD�??a�k�gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rbnu�[���PK}$[~��O�s�gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rbnu�[���PK}$[+��4��QYz�gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rbnu�[���PK}$[!gpt[[e���gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rbnu�[���PK}$[��=����Q���gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rbnu�[���PK}$[c�Ou((L��gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/state.rbnu�[���PK}$[��/:� � WK!�gems/gems/bundler-2.3.27/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rbnu�[���PK}$[`�<�
�
R�B�gems/gems/bundler-2.3.27/lib/bundler/vendor/connection_pool/lib/connection_pool.rbnu�[���PK}$[�Y�r66Z�P�gems/gems/bundler-2.3.27/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rbnu�[���PK}$[���ffZTQ�gems/gems/bundler-2.3.27/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rbnu�[���PK}$[r���[[^DW�gems/gems/bundler-2.3.27/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rbnu�[���PK}$[�c��
�
:-i�gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri.rbnu�[���PK}$[�M/���Bw�gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/version.rbnu�[���PK}$[c`7MM@*x�gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/https.rbnu�[���PK}$[墣.E.EI�z�gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rbnu�[���PK}$[��I@���gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/ldaps.rbnu�[���PK}$[q��lrrIÊgems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rbnu�[���PK}$[�"%i  Aۊgems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/mailto.rbnu�[���PK}$[��qv�	�	?���gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/http.rbnu�[���PK}$[�i/>��gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/ftp.rbnu�[���PK}$[�6��p	p	=R#�gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/ws.rbnu�[���PK}$[�*?��J�JA/-�gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/common.rbnu�[���PK}$[N��22>�x�gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/wss.rbnu�[���PK}$[M}����?${�gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/file.rbnu�[���PK}$[0C?E��?8��gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/ldap.rbnu�[���PK}$[6��ؖؖBI��gems/gems/bundler-2.3.27/lib/bundler/vendor/uri/lib/uri/generic.rbnu�[���PK}$[(@Y�:�:>�3�gems/gems/bundler-2.3.27/lib/bundler/vendor/tsort/lib/tsort.rbnu�[���PK}$[C�}�m�mZ�n�gems/gems/bundler-2.3.27/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rbnu�[���PK}$[�(ц��e�܌gems/gems/bundler-2.3.27/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rbnu�[���PK}$[hO8��_1�gems/gems/bundler-2.3.27/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rbnu�[���PK}$[6�lfflE�gems/gems/bundler-2.3.27/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rbnu�[���PK}$[���q@q@<G�gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor.rbnu�[���PK}$[D�x�,,D$-�gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/version.rbnu�[���PK}$[U7gR * *D�-�gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/actions.rbnu�[���PK}$[~��3�3VXX�gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rbnu�[���PK}$[mX���
�
Uo��gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rbnu�[���PK}$[te�))Pꚍgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/actions/create_file.rbnu�[���PK}$[,;��		N���gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/actions/directory.rbnu�[���PK}$[O�&��T��gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rbnu�[���PK}$[s	��mmP�ȍgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/actions/create_link.rbnu�[���PK}$[��}e�
�
B�Ѝgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/error.rbnu�[���PK}$[Y�t}}N�ލgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rbnu�[���PK}$[�dq=77Q��gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rbnu�[���PK}$[�LWX#X#A��gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/util.rbnu�[���PK}$[����`�`As
�gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/base.rbnu�[���PK}$[��LuvvH�n�gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/rake_compat.rbnu�[���PK}$[u���		b�w�gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rbnu�[���PK}$[(��_b'b'C��gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/runner.rbnu�[���PK}$[��홇�H�gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/line_editor.rbnu�[���PK}$[_-[�IIG�gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/invocation.rbnu�[���PK}$[�Le1	1	B�Îgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/shell.rbnu�[���PK}$[.����GU͎gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/shell/html.rbnu�[���PK}$[1�UyXXHcߎgems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/shell/color.rbnu�[���PK}$[��W|Y<Y<H3�gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/shell/basic.rbnu�[���PK}$[#I`i#i#B0�gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/group.rbnu�[���PK}$[ˤ��

K�S�gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/parser/options.rbnu�[���PK}$[i�Ldp�gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/parser/argument.rbnu�[���PK}$[��llM�w�gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/parser/arguments.rbnu�[���PK}$[�aq���J͊�gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/parser/option.rbnu�[���PK}$[�;��D✏gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/command.rbnu�[���PK}$[�ᡇ++Kگ�gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/nested_context.rbnu�[���PK}$[����C���gems/gems/bundler-2.3.27/lib/bundler/vendor/thor/lib/thor/parser.rbnu�[���PK}$[�	II@}��gems/gems/bundler-2.3.27/lib/bundler/vendor/tmpdir/lib/tmpdir.rbnu�[���PK}$[���__26ŏgems/gems/bundler-2.3.27/lib/bundler/dependency.rbnu�[���PK}$[_��mwmw2�яgems/gems/bundler-2.3.27/lib/bundler/definition.rbnu�[���PK}$[�j�{��7�I�gems/gems/bundler-2.3.27/lib/bundler/friendly_errors.rbnu�[���PK}$[���7'Z�gems/gems/bundler-2.3.27/lib/bundler/lockfile_parser.rbnu�[���PK}$[�8�9%_%_'�v�gems/gems/bundler-2.3.27/lib/bundler.rbnu�[���PK}$[
i	��!֐gems/gems/rdoc-6.4.1.1/exe/rdocnuȯ��PK}$[�7r��!ڐgems/gems/rdoc-6.4.1.1/exe/rinuȯ��PK}$[�X��MM*1ېgems/gems/rdoc-6.4.1.1/lib/rdoc/version.rbnu�[���PK}$[��p��1�ېgems/gems/rdoc-6.4.1.1/lib/rdoc/markup/heading.rbnu�[���PK}$[�ھ��4)�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/attributes.rbnu�[���PK}$[��ԄEE.��gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/list.rbnu�[���PK}$[hP)1��=-�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_joined_paragraph.rbnu�[���PK}$[ �'n�&�&1%�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_html.rbnu�[���PK}$[u�a1��/<�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_bs.rbnu�[���PK}$[V���1."�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_test.rbnu�[���PK}$[�����/'�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/table.rbnu�[���PK}$[�e�M��9`+�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_html_snippet.rbnu�[���PK}$[�Т���<�A�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/indented_paragraph.rbnu�[���PK}$[� t{ll5�E�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_markdown.rbnu�[���PK}$[f�Q`661iT�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_ansi.rbnu�[���PK}$[�F�VV2]�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_label.rbnu�[���PK}$[�C�"==1�d�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/include.rbnu�[���PK}$[WY���2Vh�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/document.rbnu�[���PK}$[�fcr��3Pu�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/list_item.rbnu�[���PK}$[���;;.�|�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/rule.rbnu�[���PK}$[ߦo��6&~�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/attr_changer.rbnu�[���PK}$[%�F��34��gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/formatter.rbnu�[���PK}$[.�����1g��gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_rdoc.rbnu�[���PK}$[ʘw�		4���gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_tt_only.rbnu�[���PK}$[�M����-<��gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/raw.rbnu�[���PK}$[��սd(d(;���gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/attribute_manager.rbnu�[���PK}$[�y ��4P�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/hard_break.rbnu�[���PK}$[�t�ԇ�4r�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/blank_line.rbnu�[���PK}$[N�_���5]�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/block_quote.rbnu�[���PK}$[TZL���>��gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_table_of_contents.rbnu�[���PK}$[���a{{:	��gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/to_html_crossref.rbnu�[���PK}$[[n�A##2��gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/verbatim.rbnu�[���PK}$[|����9s�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/regexp_handling.rbnu�[���PK}$[d����3��gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/paragraph.rbnu�[���PK}$[v���!�!5��gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/pre_process.rbnu�[���PK}$[�W��3	6�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/attr_span.rbnu�[���PK}$[��<��8�809�gems/gems/rdoc-6.4.1.1/lib/rdoc/markup/parser.rbnu�[���PK}$[
!�V(�q�gems/gems/rdoc-6.4.1.1/lib/rdoc/erbio.rbnu�[���PK}$[F�v�EE%Wv�gems/gems/rdoc-6.4.1.1/lib/rdoc/rd.rbnu�[���PK}$[T��߆�'�gems/gems/rdoc-6.4.1.1/lib/rdoc/text.rbnu�[���PK}$[Ȅ���-Σ�gems/gems/rdoc-6.4.1.1/lib/rdoc/anon_class.rbnu�[���PK}$[}{�})�)�*פ�gems/gems/rdoc-6.4.1.1/lib/rdoc/options.rbnu�[���PK}$[�at��)�)(Z*�gems/gems/rdoc-6.4.1.1/lib/rdoc/stats.rbnu�[���PK}$[4[@D��'�T�gems/gems/rdoc-6.4.1.1/lib/rdoc/i18n.rbnu�[���PK}$[�&“��*�U�gems/gems/rdoc-6.4.1.1/lib/rdoc/require.rbnu�[���PK}$[����(�Y�gems/gems/rdoc-6.4.1.1/lib/rdoc/mixin.rbnu�[���PK}$[�$�yy*e�gems/gems/rdoc-6.4.1.1/lib/rdoc/context.rbnu�[���PK}$[n��B�ޓgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/pot/message_extractor.rbnu�[���PK}$[�jl{��9�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/pot/po_entry.rbnu�[���PK}$[��3�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/pot/po.rbnu�[���PK}$[&���0}��gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/pot.rbnu�[���PK}$[��r�
�
N��gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/json_index/js/navigation.jsnu�[���PK}$[P�^���L�
�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/json_index/js/searcher.jsnu�[���PK}$[^��\>(�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtmlnu�[���PK}$[��>�q�qP�*�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/fonts/Lato-Light.ttfnu�[���PK}$[䍒�TtTtX��gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/fonts/Lato-RegularItalic.ttfnu�[���PK}$[^b��X��gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Bold.ttfnu�[���PK}$[�՞�w�wR�.�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/fonts/Lato-Regular.ttfnu�[���PK}$[Z��o�oVŦ�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/fonts/Lato-LightItalic.ttfnu�[���PK}$[��I���[?�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Regular.ttfnu�[���PK}$[�TB��S�5�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_in_files.rhtmlnu�[���PK}$[[�L�>>G�6�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/index.rhtmlnu�[���PK}$[�3�^^Ij9�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_footer.rhtmlnu�[���PK}$[B�Y��GA;�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/class.rhtmlnu�[���PK}$[	O2]]TBQ�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtmlnu�[���PK}$[
N��NNS#S�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/servlet_not_found.rhtmlnu�[���PK}$[��QCCS�T�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtmlnu�[���PK}$[鿶�S�V�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/table_of_contents.rhtmlnu�[���PK}$[^mqRB]�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_classes.rhtmlnu�[���PK}$[E`��R�^�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_methods.rhtmlnu�[���PK}$[5����S�`�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtmlnu�[���PK}$[��H=c�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/js/search.jsnu�[���PK}$[��13	3	J�o�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/js/darkfish.jsnu�[���PK}$[g:��Sxy�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_VCS_info.rhtmlnu�[���PK}$[{wj�N�{�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/servlet_root.rhtmlnu�[���PK}$[h˟�eeP7��gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/tag_green.pngnu�[���PK}$[�=V��Z��gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/bullet_toggle_minus.pngnu�[���PK}$[�S�Ju��gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/bug.pngnu�[���PK}$[0���L���gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/brick.pngnu�[���PK}$[$V���R5��gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/macFFBgHack.pngnu�[���PK}$[�Z�mmQ���gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/page_green.pngnu�[���PK}$[���(VVVt��gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/page_white_text.pngnu�[���PK}$[�P��MP��gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/delete.pngnu�[���PK}$[Os~���J���gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/add.pngnu�[���PK}$[�CCJUUNgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/package.pngnu�[���PK}$[(?�Y��S�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/bullet_black.pngnu�[���PK}$[���<XXO��gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/tag_blue.pngnu�[���PK}$[��AaaR咽gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/transparent.pngnu�[���PK}$[��Q��Wҧ�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/loadingAnimation.gifnu�[���PK}$[J���KW��gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/find.pngnu�[���PK}$[
�OOMežgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/plugin.pngnu�[���PK}$[=k��Y1Şgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/bullet_toggle_plus.pngnu�[���PK}$[>�)oHHT�ƞgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/wrench_orange.pngnu�[���PK}$[7��KWɞgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/zoom.pngnu�[���PK}$["�55W�̞gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/page_white_width.pngnu�[���PK}$[��U�ttOBΞgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/arrow_up.pngnu�[���PK}$[R�7���Q5Оgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/brick_link.pngnu�[���PK}$[��bbM�Ӟgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/wrench.pngnu�[���PK}$[�ErrK�֞gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/date.pngnu�[���PK}$[#۸�PPK~ٞgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/images/ruby.pngnu�[���PK}$[���zzQIܞgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_parent.rhtmlnu�[���PK}$[�޹�UDޞgems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_navigation.rhtmlnu�[���PK}$[3����R��gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtmlnu�[���PK}$[��o�'�'H��gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/css/rdoc.cssnu�[���PK}$[;9Iv��I�
�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/css/fonts.cssnu�[���PK}$[`	e��F\$�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/page.rhtmlnu�[���PK}$[����OOP�&�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtmlnu�[���PK}$[��e]]GP(�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_head.rhtmlnu�[���PK}$[*�f���Q$,�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/template/darkfish/_sidebar_search.rhtmlnu�[���PK}$[ДU�



36/�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/markup.rbnu�[���PK}$[�q���7�<�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/json_index.rbnu�[���PK}$[��P�
Q
Q5�[�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/darkfish.rbnu�[���PK}$[f�=w��/���gems/gems/rdoc-6.4.1.1/lib/rdoc/generator/ri.rbnu�[���PK}$[�I��#$#$.-��gems/gems/rdoc-6.4.1.1/lib/rdoc/method_attr.rbnu�[���PK}$[ʥ9e��*�ӟgems/gems/rdoc-6.4.1.1/lib/rdoc/tom_doc.rbnu�[���PK}$[x�����'��gems/gems/rdoc-6.4.1.1/lib/rdoc/task.rbnu�[���PK}$[�-�%%.��gems/gems/rdoc-6.4.1.1/lib/rdoc/code_object.rbnu�[���PK}$[S�2��,N2�gems/gems/rdoc-6.4.1.1/lib/rdoc/i18n/text.rbnu�[���PK}$[KzVf	f	.,>�gems/gems/rdoc-6.4.1.1/lib/rdoc/i18n/locale.rbnu�[���PK}$[(�.�Z�Z(�G�gems/gems/rdoc-6.4.1.1/lib/rdoc/store.rbnu�[���PK}$[X�yъp�p)���gems/gems/rdoc-6.4.1.1/lib/rdoc/markup.rbnu�[���PK}$[v�T�DODO/��gems/gems/rdoc-6.4.1.1/lib/rdoc/class_module.rbnu�[���PK}$[�刊--,}c�gems/gems/rdoc-6.4.1.1/lib/rdoc/generator.rbnu�[���PK}$[�/��*k�gems/gems/rdoc-6.4.1.1/lib/rdoc/include.rbnu�[���PK}$[����)l�gems/gems/rdoc-6.4.1.1/lib/rdoc/extend.rbnu�[���PK}$[Wud<)	)	+m�gems/gems/rdoc-6.4.1.1/lib/rdoc/markdown.rbnu�[���PK}$[e�3��/�v�gems/gems/rdoc-6.4.1.1/lib/rdoc/token_stream.rbnu�[���PK}$[�H"--,���gems/gems/rdoc-6.4.1.1/lib/rdoc/top_level.rbnu�[���PK}$[#��@@.��gems/gems/rdoc-6.4.1.1/lib/rdoc/stats/quiet.rbnu�[���PK}$[�
����0���gems/gems/rdoc-6.4.1.1/lib/rdoc/stats/verbose.rbnu�[���PK}$[9)-$00/
��gems/gems/rdoc-6.4.1.1/lib/rdoc/stats/normal.rbnu�[���PK}$[�M���2���gems/gems/rdoc-6.4.1.1/lib/rdoc/context/section.rbnu�[���PK}$[g�*���/���gems/gems/rdoc-6.4.1.1/lib/rdoc/code_objects.rbnu�[���PK}$[�R5���/���gems/gems/rdoc-6.4.1.1/lib/rdoc/ghost_method.rbnu�[���PK}$[zk�3� � -���gems/gems/rdoc-6.4.1.1/lib/rdoc/any_method.rbnu�[���PK}$[c��7��*�ާgems/gems/rdoc-6.4.1.1/lib/rdoc/comment.rbnu�[���PK}$[|y����/���gems/gems/rdoc-6.4.1.1/lib/rdoc/single_class.rbnu�[���PK}$[OG�!�!�4�gems/gems/rdoc-6.4.1.1/lib/rdoc/markdown/entities.rbnu�[���PK}$[�GF�M$M$4rШgems/gems/rdoc-6.4.1.1/lib/rdoc/markdown/literals.rbnu�[���PK}$[p��-}}(#��gems/gems/rdoc-6.4.1.1/lib/rdoc/alias.rbnu�[���PK}$[epC0��.���gems/gems/rdoc-6.4.1.1/lib/rdoc/meta_method.rbnu�[���PK}$[�W,���/��gems/gems/rdoc-6.4.1.1/lib/rdoc/normal_class.rbnu�[���PK}$[a�g���0��gems/gems/rdoc-6.4.1.1/lib/rdoc/rubygems_hook.rbnu�[���PK}$[��/s-5-5'��gems/gems/rdoc-6.4.1.1/lib/rdoc/rdoc.rbnu�[���PK}$[Pw_�{{2jR�gems/gems/rdoc-6.4.1.1/lib/rdoc/cross_reference.rbnu�[���PK}$[󈗢��0Gm�gems/gems/rdoc-6.4.1.1/lib/rdoc/normal_module.rbnu�[���PK}$[��y��+bs�gems/gems/rdoc-6.4.1.1/lib/rdoc/encoding.rbnu�[���PK}$[bb�]]+���gems/gems/rdoc-6.4.1.1/lib/rdoc/constant.rbnu�[���PK}$[L���.s��gems/gems/rdoc-6.4.1.1/lib/rdoc/erb_partial.rbnu�[���PK}$[
[>		'b��gems/gems/rdoc-6.4.1.1/lib/rdoc/attr.rbnu�[���PK}$[:�ܶ�,¢�gems/gems/rdoc-6.4.1.1/lib/rdoc/parser/rd.rbnu�[���PK}$[?�S����+Ԥ�gems/gems/rdoc-6.4.1.1/lib/rdoc/parser/c.rbnu�[���PK}$[�7��33.)2�gems/gems/rdoc-6.4.1.1/lib/rdoc/parser/text.rbnu�[���PK}$[/��>�>:�3�gems/gems/rdoc-6.4.1.1/lib/rdoc/parser/ripper_state_lex.rbnu�[���PK}$[���U��0�r�gems/gems/rdoc-6.4.1.1/lib/rdoc/parser/simple.rbnu�[���PK}$[�4QՆ
�
4y�gems/gems/rdoc-6.4.1.1/lib/rdoc/parser/ruby_tools.rbnu�[���PK}$[�_A��2ꃪgems/gems/rdoc-6.4.1.1/lib/rdoc/parser/markdown.rbnu�[���PK}$[��X�����.&��gems/gems/rdoc-6.4.1.1/lib/rdoc/parser/ruby.rbnu�[���PK}$[h\�;!;!3Ir�gems/gems/rdoc-6.4.1.1/lib/rdoc/parser/changelog.rbnu�[���PK}$[�(�0�0*瓫gems/gems/rdoc-6.4.1.1/lib/rdoc/servlet.rbnu�[���PK}$[W�nYY%*ūgems/gems/rdoc-6.4.1.1/lib/rdoc/ri.rbnu�[���PK}$[�h��}�}3�ƫgems/gems/rdoc-6.4.1.1/lib/rdoc/rd/inline_parser.rbnu�[���PK}$[�]��,�D�gems/gems/rdoc-6.4.1.1/lib/rdoc/rd/inline.rbnu�[���PK}$[���X�X2�J�gems/gems/rdoc-6.4.1.1/lib/rdoc/rd/block_parser.rbnu�[���PK}$[��VU}
}
0gems/gems/rdoc-6.4.1.1/lib/rdoc/known_classes.rbnu�[���PK}$[��n�==*̮�gems/gems/rdoc-6.4.1.1/lib/rdoc/ri/task.rbnu�[���PK}$[��tUU+c��gems/gems/rdoc-6.4.1.1/lib/rdoc/ri/store.rbnu�[���PK}$[V�nrr/��gems/gems/rdoc-6.4.1.1/lib/rdoc/ri/formatter.rbnu�[���PK}$[�Ų^^+䵬gems/gems/rdoc-6.4.1.1/lib/rdoc/ri/paths.rbnu�[���PK}$[���(	�	�,�Ǭgems/gems/rdoc-6.4.1.1/lib/rdoc/ri/driver.rbnu�[���PK}$[��YJJ)\�gems/gems/rdoc-6.4.1.1/lib/rdoc/parser.rbnu�[���PK}$[8�j_��"�x�gems/gems/rdoc-6.4.1.1/lib/rdoc.rbnu�[���PK}$[�L���2y��gems/gems/io-console-0.5.11/lib/io/console/size.rbnu�[���PK}$[I��>>���gems/cache/rackup-2.1.0.gemnu�[���PK}$[�"�����έgems/cache/rack-3.0.8.gemnu�[���PK}$[������w�gems/cache/ruby-lsapi-5.6.gemnu�[���PK}$[��S��kC�rubygems/rubygems.rbnu�[���PK}$[
���4-4- �հrubygems/rubygems/request_set.rbnu�[���PK}$[�^�L2L2E�rubygems/rubygems/version.rbnu�[���PK}$[D�����5�rubygems/rubygems/text.rbnu�[���PK}$[�9<>�	�	-
>�rubygems/rubygems/request/connection_pools.rbnu�[���PK}$[�	�E��'�G�rubygems/rubygems/request/https_pool.rbnu�[���PK}$[��u&4I�rubygems/rubygems/request/http_pool.rbnu�[���PK}$[��~uu�M�rubygems/rubygems/platform.rbnu�[���PK}$[���!�! [l�rubygems/rubygems/query_utils.rbnu�[���PK}$[�<����rubygems/rubygems/errors.rbnu�[���PK}$[ 7?%�#�#(
��rubygems/rubygems/gemcutter_utilities.rbnu�[���PK}$[�Aa��(�()�ırubygems/rubygems/dependency_installer.rbnu�[���PK}$[�ʠ���$!�rubygems/rubygems/command_manager.rbnu�[���PK}$[�n1ABB$m�rubygems/rubygems/install_message.rbnu�[���PK}$[���1..�rubygems/rubygems/gem_runner.rbnu�[���PK}$[yy�##!��rubygems/rubygems/path_support.rbnu�[���PK}$[�4��b"b"��rubygems/rubygems/request.rbnu�[���PK}$[ђSÛ�2�6�rubygems/rubygems/unknown_command_spell_checker.rbnu�[���PK}$[L��;;.�8�rubygems/rubygems/optparse/lib/optionparser.rbnu�[���PK}$[#d��289�rubygems/rubygems/optparse/lib/optparse/version.rbnu�[���PK}$[ý�''1�A�rubygems/rubygems/optparse/lib/optparse/kwargs.rbnu�[���PK}$[�m��.9D�rubygems/rubygems/optparse/lib/optparse/uri.rbnu�[���PK}$["�j���5+E�rubygems/rubygems/optparse/lib/optparse/shellwords.rbnu�[���PK}$[O����/9F�rubygems/rubygems/optparse/lib/optparse/date.rbnu�[���PK}$[�.U��/H�rubygems/rubygems/optparse/lib/optparse/time.rbnu�[���PK}$[��X$$-lI�rubygems/rubygems/optparse/lib/optparse/ac.rbnu�[���PK}$[�\������*�O�rubygems/rubygems/optparse/lib/optparse.rbnu�[���PK}$[ii��F�F
D�rubygems/rubygems/package.rbnu�[���PK}$[�_���#6��rubygems/rubygems/version_option.rbnu�[���PK}$[yM|�{{^��rubygems/rubygems/deprecate.rbnu�[���PK}$[�̧

$'��rubygems/rubygems/security/signer.rbnu�[���PK}$[���

'���rubygems/rubygems/security/trust_dir.rbnu�[���PK}$[0v��DD$�ɳrubygems/rubygems/security/policy.rbnu�[���PK}$[˪m"Y
Y
&��rubygems/rubygems/security/policies.rbnu�[���PK}$[7x�;��E��rubygems/rubygems/validator.rbnu�[���PK}$[�:���+�rubygems/rubygems/ext.rbnu�[���PK}$[L�l++$d�rubygems/rubygems/dependency_list.rbnu�[���PK}$[�y�1rr!��rubygems/rubygems/spec_fetcher.rbnu�[���PK}$[����&�8�rubygems/rubygems/resolver/lock_set.rbnu�[���PK}$[�]�I		0�?�rubygems/rubygems/resolver/dependency_request.rbnu�[���PK}$[�l�3%%1I�rubygems/rubygems/resolver/local_specification.rbnu�[���PK}$[�-
@�
�
/�L�rubygems/rubygems/resolver/api_specification.rbnu�[���PK}$[@�q�II'�W�rubygems/rubygems/resolver/molinillo.rbnu�[���PK}$[�h:,��#X�rubygems/rubygems/resolver/stats.rbnu�[���PK}$[�W�k��!�\�rubygems/rubygems/resolver/set.rbnu�[���PK}$[��,�q	q	1�a�rubygems/rubygems/resolver/index_specification.rbnu�[���PK}$[9u���'�k�rubygems/rubygems/resolver/index_set.rbnu�[���PK}$[�b)
ee5�q�rubygems/rubygems/resolver/molinillo/lib/molinillo.rbnu�[���PK}$[ ��Ƌ�B\s�rubygems/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rbnu�[���PK}$[�
є��<Yt�rubygems/rubygems/resolver/molinillo/lib/molinillo/errors.rbnu�[���PK}$[pW����JG��rubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/tag.rbnu�[���PK}$[��)�NNMj��rubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rbnu�[���PK}$[��iiQ5��rubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_vertex.rbnu�[���PK}$[���P��M��rubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/action.rbnu�[���PK}$[��ŞZ>��rubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rbnu�[���PK}$[	G�G((R̵�rubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/delete_edge.rbnu�[���PK}$[v�k�uu[v��rubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rbnu�[���PK}$[�Rk%%JvŴrubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/log.rbnu�[���PK}$[k.�]]RԴrubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/set_payload.rbnu�[���PK}$[�@����V�شrubygems/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rbnu�[���PK}$[y�a��PJ�rubygems/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rbnu�[���PK}$[��R%%>u�rubygems/rubygems/resolver/molinillo/lib/molinillo/resolver.rbnu�[���PK}$[1�����@��rubygems/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rbnu�[���PK}$[E�rggTI��rubygems/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rbnu�[���PK}$[H�<(����@4
�rubygems/rubygems/resolver/molinillo/lib/molinillo/resolution.rbnu�[���PK}$[,��h..;G��rubygems/rubygems/resolver/molinillo/lib/molinillo/state.rbnu�[���PK}$[��� � F�rubygems/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rbnu�[���PK}$[iق0��0���rubygems/rubygems/resolver/api_set/gem_parser.rbnu�[���PK}$[�OeϘ�0��rubygems/rubygems/resolver/activation_request.rbnu�[���PK}$[�NA�AA0�˵rubygems/rubygems/resolver/lock_specification.rbnu�[���PK}$[�W&��%�ӵrubygems/rubygems/resolver/git_set.rbnu�[���PK}$[
����*yߵrubygems/rubygems/resolver/composed_set.rbnu�[���PK}$[�z�xx&��rubygems/rubygems/resolver/best_set.rbnu�[���PK}$[m념/]�rubygems/rubygems/resolver/git_specification.rbnu�[���PK}$[��3:YY%��rubygems/rubygems/resolver/api_set.rbnu�[���PK}$[]�����(|��rubygems/rubygems/resolver/source_set.rbnu�[���PK}$[7���@@2X�rubygems/rubygems/resolver/vendor_specification.rbnu�[���PK}$[s��PWW.��rubygems/rubygems/resolver/requirement_list.rbnu�[���PK}$[`ك��(��rubygems/rubygems/resolver/vendor_set.rbnu�[���PK}$[5p�
�
+��rubygems/rubygems/resolver/specification.rbnu�[���PK}$[���UU0��rubygems/rubygems/resolver/spec_specification.rbnu�[���PK}$[6����5a!�rubygems/rubygems/resolver/installed_specification.rbnu�[���PK}$[��00+�&�rubygems/rubygems/resolver/installer_set.rbnu�[���PK}$[�йe��&+@�rubygems/rubygems/resolver/conflict.rbnu�[���PK}$[�8sL)}M�rubygems/rubygems/resolver/current_set.rbnu�[���PK}$[p��).�N�rubygems/rubygems/defaults/operating_system.rbnu�[���PK}$[�&߲�$O`�rubygems/rubygems/ext/build_error.rbnu�[���PK}$[ԅ�V��&Ua�rubygems/rubygems/ext/cmake_builder.rbnu�[���PK}$[��I#I#&�c�rubygems/rubygems/ext/cargo_builder.rbnu�[���PK}$[b�=��%"��rubygems/rubygems/ext/rake_builder.rbnu�[���PK}$[߻ee:&��rubygems/rubygems/ext/cargo_builder/link_flag_converter.rbnu�[���PK}$[��++ ���rubygems/rubygems/ext/builder.rbnu�[���PK}$[$No$66*p��rubygems/rubygems/ext/configure_builder.rbnu�[���PK}$[s����)��rubygems/rubygems/ext/ext_conf_builder.rbnu�[���PK}$[��V��,
��rubygems/rubygems/commands/unpack_command.rbnu�[���PK}$[��v���+9Ķrubygems/rubygems/commands/stale_command.rbnu�[���PK}$[�Z�ѣ�/Xȶrubygems/rubygems/commands/uninstall_command.rbnu�[���PK}$[	>~�	�	*Z߶rubygems/rubygems/commands/rdoc_command.rbnu�[���PK}$[i����+o�rubygems/rubygems/commands/build_command.rbnu�[���PK}$[����

+|��rubygems/rubygems/commands/fetch_command.rbnu�[���PK}$[��ZHH-�rubygems/rubygems/commands/install_command.rbnu�[���PK}$[d*(�<<.��rubygems/rubygems/commands/contents_command.rbnu�[���PK}$[���]]-&/�rubygems/rubygems/commands/cleanup_command.rbnu�[���PK}$[Eo�$�$*�A�rubygems/rubygems/commands/cert_command.rbnu�[���PK}$[(%%�(�(*�f�rubygems/rubygems/commands/help_command.rbnu�[���PK}$[�	8��0㏷rubygems/rubygems/commands/dependency_command.rbnu�[���PK}$[�Jz���.Ǥ�rubygems/rubygems/commands/pristine_command.rbnu�[���PK}$[�i�++1���rubygems/rubygems/commands/environment_command.rbnu�[���PK}$[�&��,;ҷrubygems/rubygems/commands/signin_command.rbnu�[���PK}$[�2�V��+ַrubygems/rubygems/commands/query_command.rbnu�[���PK}$[[�Q��
�
3]۷rubygems/rubygems/commands/specification_command.rbnu�[���PK}$[��;M



+\�rubygems/rubygems/commands/owner_command.rbnu�[���PK}$[<X���,���rubygems/rubygems/commands/search_command.rbnu�[���PK}$[���``+�rubygems/rubygems/commands/which_command.rbnu�[���PK}$[�B�&Z	Z	*��rubygems/rubygems/commands/yank_command.rbnu�[���PK}$[:��TT*\
�rubygems/rubygems/commands/info_command.rbnu�[���PK}$[��a�
�
*
�rubygems/rubygems/commands/lock_command.rbnu�[���PK}$[��ہ�-(�rubygems/rubygems/commands/signout_command.rbnu�[���PK}$[#�5���* �rubygems/rubygems/commands/list_command.rbnu�[���PK}$[��(��4S$�rubygems/rubygems/commands/generate_index_command.rbnu�[���PK}$[H|rr,Z0�rubygems/rubygems/commands/mirror_command.rbnu�[���PK}$[��O���+(3�rubygems/rubygems/commands/check_command.rbnu�[���PK}$[��}__.w<�rubygems/rubygems/commands/outdated_command.rbnu�[���PK}$[��gHH+4@�rubygems/rubygems/commands/setup_command.rbnu�[���PK}$[�!��,���rubygems/rubygems/commands/server_command.rbnu�[���PK}$[� Q�$�$,z��rubygems/rubygems/commands/update_command.rbnu�[���PK}$[��b!A
A
*c��rubygems/rubygems/commands/push_command.rbnu�[���PK}$[I�t���*���rubygems/rubygems/commands/open_command.rbnu�[���PK}$['����-ørubygems/rubygems/commands/sources_command.rbnu�[���PK}$[�7�I�+�+^ڸrubygems/rubygems/indexer.rbnu�[���PK}$[�,�YN	N	6�rubygems/rubygems/uri.rbnu�[���PK}$[S�,����rubygems/rubygems/doctor.rbnu�[���PK}$[��;}}��rubygems/rubygems/openssl.rbnu�[���PK}$[p7�,,!d�rubygems/rubygems/package_task.rbnu�[���PK}$[�N�DBB�,�rubygems/rubygems/tsort.rbnu�[���PK}$[���jj+m-�rubygems/rubygems/install_update_options.rbnu�[���PK}$[sI�

2G�rubygems/rubygems/util.rbnu�[���PK}$[4}E��(}Q�rubygems/rubygems/basic_specification.rbnu�[���PK}$[--&@IIpp�rubygems/rubygems/util/list.rbnu�[���PK}$[���y#y#"s�rubygems/rubygems/util/licenses.rbnu�[���PK}$[�\�>>)Җ�rubygems/rubygems/local_remote_options.rbnu�[���PK}$[��g�~3~3)i��rubygems/rubygems/specification_policy.rbnu�[���PK}$[$t%�(�( @ٹrubygems/rubygems/uninstaller.rbnu�[���PK}$[��

"\�rubygems/rubygems/uri_formatter.rbnu�[���PK}$[����

-��rubygems/rubygems/package/tar_reader/entry.rbnu�[���PK}$[@۬b	b	',�rubygems/rubygems/package/tar_reader.rbnu�[���PK}$[�:�@

'��rubygems/rubygems/package/tar_writer.rbnu�[���PK}$[�&-GG#F8�rubygems/rubygems/package/source.rbnu�[���PK}$[�a��aa(�8�rubygems/rubygems/package/file_source.rbnu�[���PK}$[4����'�;�rubygems/rubygems/package/tar_header.rbnu�[���PK}$[��� �S�rubygems/rubygems/package/old.rbnu�[���PK}$[$B6--&jb�rubygems/rubygems/package/io_source.rbnu�[���PK}$[��̊SS&�e�rubygems/rubygems/package/digest_io.rbnu�[���PK}$[g��M�� �k�rubygems/rubygems/mock_gem_ui.rbnu�[���PK}$[�VcUUjq�rubygems/rubygems/defaults.rbnu�[���PK}$[|����)��rubygems/rubygems/request_set/lockfile.rbnu�[���PK}$[�_�RZRZ30��rubygems/rubygems/request_set/gem_dependency_api.rbnu�[���PK}$[�P�~�
�
3�rubygems/rubygems/request_set/lockfile/tokenizer.rbnu�[���PK}$[*`�0F�rubygems/rubygems/request_set/lockfile/parser.rbnu�[���PK}$[�ϸTT�%�rubygems/rubygems/source.rbnu�[���PK}$[*��	�	 L<�rubygems/rubygems/source_list.rbnu�[���PK}$[�>a5�&�&>F�rubygems/rubygems/resolver.rbnu�[���PK}$[����,m�rubygems/rubygems/core_ext/tcpsocket_init.rbnu�[���PK}$[-�-,s�rubygems/rubygems/core_ext/kernel_require.rbnu�[���PK}$[k]�	�	(��rubygems/rubygems/core_ext/kernel_gem.rbnu�[���PK}$[�s�NYY)���rubygems/rubygems/core_ext/kernel_warn.rbnu�[���PK}$[e�s2��)T��rubygems/rubygems/source/specific_file.rbnu�[���PK}$[=��<<���rubygems/rubygems/source/git.rbnu�[���PK}$[�jV�//! ��rubygems/rubygems/source/local.rbnu�[���PK}$[&�4��"���rubygems/rubygems/source/vendor.rbnu�[���PK}$[ڒ�ڕ�%��rubygems/rubygems/source/installed.rbnu�[���PK}$[xD/{�� �Ļrubygems/rubygems/source/lock.rbnu�[���PK}$[��b��4�4 �Ȼrubygems/rubygems/config_file.rbnu�[���PK}$[$�to�$�$#��rubygems/rubygems/remote_fetcher.rbnu�[���PK}$[��X��� �"�rubygems/rubygems/requirement.rbnu�[���PK}$[a����>�rubygems/rubygems/rdoc.rbnu�[���PK}$[ �{�

"@�rubygems/rubygems/available_set.rbnu�[���PK}$[�QFHHqL�rubygems/rubygems/optparse.rbnu�[���PK}$[
��0M�rubygems/rubygems/installer_uninstaller_utils.rbnu�[���PK}$[C��a��kP�rubygems/rubygems/exceptions.rbnu�[���PK}$[j��ykk;m�rubygems/rubygems/installer.rbnu�[���PK}$[t/w\\,�ؼrubygems/rubygems/install_default_message.rbnu�[���PK}$[���Y�YLڼrubygems/rubygems/security.rbnu�[���PK}$[T.�0�<�<$-4�rubygems/rubygems/tsort/lib/tsort.rbnu�[���PK}$[w�Ԓ��'q�rubygems/rubygems/stub_specification.rbnu�[���PK}$[��44"d��rubygems/rubygems/specification.rbnu�[���PK}$[��Ꞿrubygems/rubygems/psych_tree.rbnu�[���PK}$[��޶S��rubygems/rubygems/safe_yaml.rbnu�[���PK}$[��E�"���rubygems/rubygems/compatibility.rbnu�[���PK}$[�=�w�	�	��rubygems/rubygems/name_tuple.rbnu�[���PK}$[�l��F?F?ܶ�rubygems/rubygems/command.rbnu�[���PK}$[$�1��"n��rubygems/rubygems/s3_uri_signer.rbnu�[���PK}$[(��;;$a�rubygems/rubygems/security_option.rbnu�[���PK}$[1"�f^"^"��rubygems/rubygems/dependency.rbnu�[���PK}$[x��44%�5�rubygems/rubygems/user_interaction.rbnu�[���PK}$[�����+�i�rubygems/rubygems/bundler_version_finder.rbnu�[���PK}$[�!i��!�!#?r�systemtap/tapset/libruby.so.3.1.stpnu�[���PK}$[z]��	�	#h��licenses/alt-ruby31-libs/COPYING.janu�[���PK}$[��������licenses/alt-ruby31-libs/LEGALnu�[���PK}$[Q�{	{	 N�licenses/alt-ruby31-libs/COPYINGnu�[���PK}$[��FN�F�F�W�licenses/alt-ruby31-libs/GPLnu�[���PK}$[z]��	�	˞�licenses/alt-ruby31/COPYING.janu�[���PK}$[�������licenses/alt-ruby31/LEGALnu�[���PK}$[V�SaX�licenses/alt-ruby31/BSDLnu�[���PK}$[Q�{	{	�]�licenses/alt-ruby31/COPYINGnu�[���PK}$[��FN�F�Fzg�licenses/alt-ruby31/GPLnu�[���PK}$[z]��	�	$m��licenses/alt-ruby31-devel/COPYING.janu�[���PK}$[��������licenses/alt-ruby31-devel/LEGALnu�[���PK}$[V�Sh�licenses/alt-ruby31-devel/BSDLnu�[���PK}$[Q�{	{	!hm�licenses/alt-ruby31-devel/COPYINGnu�[���PK}$[��FN�F�F4w�licenses/alt-ruby31-devel/GPLnu�[���PK}$[P/ʮ��-��doc/alt-ruby31-libs/README.mdnu�[���PK}$[���'Q'Q��doc/alt-ruby31-libs/NEWS.mdnu�[���PK}$[)iT����+�ruby/expect.rbnu�[���PK}$[?pF�SSt4�ruby/rinda/rinda.rbnu�[���PK}$[]@��1212
O�ruby/rinda/ring.rbnu�[���PK}$[0��T�7�7}��ruby/rinda/tuplespace.rbnu�[���PK}$[L��;;M��ruby/optionparser.rbnu�[���PK}$[�w��pp̹�ruby/coverage.rbnu�[���PK}$[�::|��ruby/random/formatter.rbnu�[���PK}$[�c��xx���ruby/fiddle/value.rbnu�[���PK}$[���&&���ruby/fiddle/version.rbnu�[���PK}$[;#���&��ruby/fiddle/closure.rbnu�[���PK}$[�����E��ruby/fiddle/types.rbnu�[���PK}$[y��a"a"��ruby/fiddle/cparser.rbnu�[���PK}$[�ߓ##��ruby/fiddle/import.rbnu�[���PK}$[w�'4�ruby/fiddle/function.rbnu�[���PK}$[64ʓ���6�ruby/fiddle/pack.rbnu�[���PK}$[��\��8�8SC�ruby/fiddle/struct.rbnu�[���PK}$[9"�Q

h|�ruby/optparse/version.rbnu�[���PK}$[�~�S���ruby/optparse/kwargs.rbnu�[���PK}$[�oBσ���ruby/optparse/uri.rbnu�[���PK}$[>1M����ruby/optparse/shellwords.rbnu�[���PK}$[��/ddĈ�ruby/optparse/date.rbnu�[���PK}$[�����m��ruby/optparse/time.rbnu�[���PK}$[*Ivh���ruby/optparse/ac.rbnu�[���PK}$[y�
Y�A�Aޑ�ruby/pathname.rbnu�[���PK}$[(�[D����ruby/forwardable/impl.rbnu�[���PK}$[N�!rr���ruby/fiddle.rbnu�[���PK}$[���gems/gems/psych-4.0.4/lib/psychnuȯ��PK}$[)���gems/gems/bigdecimal-3.1.1/lib/bigdecimalnuȯ��PK}$[���URUR@��ruby/ipaddr.rbnu�[���PK}$[�')o�:�:�1�ruby/pstore.rbnu�[���PK}$[�u�[�*�*�l�ruby/net/protocol.rbnu�[���PK}$[�dܱ���ruby/net/https.rbnu�[���PK}$[�2GNe�e�K��ruby/net/http.rbnu�[���PK}$[w�����t�ruby/net/http/request.rbnu�[���PK}$[�L�66"x�ruby/net/http/backward.rbnu�[���PK}$[����|�ruby/net/http/proxy_delta.rbnu�[���PK}$[��/_�%�% �}�ruby/net/http/generic_request.rbnu�[���PK}$[�6�Q����ruby/net/http/requests.rbnu�[���PK}$[{�����ruby/net/http/status.rbnu�[���PK}$[����FF���ruby/net/http/exceptions.rbnu�[���PK}$[�)��B�B���ruby/net/http/header.rbnu�[���PK}$[���w&&���ruby/net/http/responses.rbnu�[���PK}$[1��&<&<&�ruby/net/http/response.rbnu�[���PK}$[\V��pXpX
�b�ruby/open3.rbnu�[���PK}$[$ۏ�@@7��ruby/did_you_mean.rbnu�[���PK}$[?@�##���ruby/drb/version.rbnu�[���PK}$[D[���!��ruby/drb/timeridconv.rbnu�[���PK}$[��4
��ruby/drb/eq.rbnu�[���PK}$[*Y)		^��ruby/drb/invokemethod.rbnu�[���PK}$[Ew|�����ruby/drb/extservm.rbnu�[���PK}$[�+�����ruby/drb/gw.rbnu�[���PK}$[ы>�qq1��ruby/drb/acl.rbnu�[���PK}$[��,�}}��ruby/drb/weakidconv.rbnu�[���PK}$[�k�:..�	�ruby/drb/ssl.rbnu�[���PK}$[���^DD�7�ruby/drb/extserv.rbnu�[���PK}$[�����|;�ruby/drb/drb.rbnu�[���PK}$[U���!�ruby/drb/unix.rbnu�[���PK}$[�K��-�ruby/drb/observer.rbnu�[���PK}$[4�<DD�/�ruby/logger/version.rbnu�[���PK}$[�S|���u0�ruby/logger/errors.rbnu�[���PK}$[6�E^��n1�ruby/logger/severity.rbnu�[���PK}$[�{��3�ruby/logger/period.rbnu�[���PK}$[�=`6AAh9�ruby/logger/log_device.rbnu�[���PK}$[�i���O�ruby/logger/formatter.rbnu�[���PK}$[P4@�e�eVS�ruby/set.rbnu�[���PK}$[_v��EEG��ruby/digest/version.rbnu�[���PK}$[24�Z88ҹ�ruby/digest/sha2/loader.rbnu�[���PK}$[�6�33T��ruby/digest/loader.rbnu�[���PK}$[�:i7̺�ruby/digest/sha2.rbnu�[���PK}$[=�rr$��ruby/English.rbnu�[���PK}$[���NN���ruby/cgi/cookie.rbnu�[���PK}$[\��	����e��ruby/cgi/html.rbnu�[���PK}$[%n&�Q
Q
4��ruby/cgi/session/pstore.rbnu�[���PK}$[*7��@@ϐ�ruby/cgi/util.rbnu�[���PK}$[P��L�LO��ruby/cgi/session.rbnu�[���PK}$[@��%u%u[��ruby/cgi/core.rbnu�[���PK}$[h�(�(�r�ruby/resolv.rbnu�[���PK}$[
Y�x`x`���ruby/mkmf.rbnu�[���PK}$[�1��;;i��ruby/uri.rbnu�[���PK}$[ť@@��ruby/securerandom.rbnu�[���PK}$[qm�c�ruby/openssl.rbnu�[���PK}$[6�c`�
�
��ruby/abbrev.rbnu�[���PK}$[���[[�#�ruby/shellwords.rbnu�[���PK}$[0K}Dkkb@�ruby/csv/version.rbnu�[���PK}$[Fl�u:
:
A�ruby/csv/fields_converter.rbnu�[���PK}$[���Q�`�`�K�ruby/csv/row.rbnu�[���PK}$[<rߋ0�0����ruby/csv/table.rbnu�[���PK}$[��P�"&B�ruby/csv/input_record_separator.rbnu�[���PK}$[����yy�C�ruby/csv/match_p.rbnu�[���PK}$[�����IE�ruby/csv/core_ext/string.rbnu�[���PK}$[��z��`F�ruby/csv/core_ext/array.rbnu�[���PK}$['�xxwG�ruby/csv/writer.rbnu�[���PK}$[�#vv1_�ruby/csv/delete_suffix.rbnu�[���PK}$[��xȒȒ�`�ruby/csv/parser.rbnu�[���PK}$[�\���B�B
���ruby/pp.rbnu�[���PK}$[���K2929
�6�ruby/tsort.rbnu�[���PK}$[�:��5
5
ip�ruby/digest.rbnu�[���PK}$[|��l�}�ruby/monitor.rbnu�[���PK}$[�3�A��#��ruby/weakref.rbnu�[���PK}$[�x��FF7��ruby/openssl/version.rbnu�[���PK}$[`�_�E�Eğ�ruby/openssl/ssl.rbnu�[���PK}$[��;�����ruby/openssl/digest.rbnu�[���PK}$[�s�=88���ruby/openssl/marshal.rbnu�[���PK}$[�/���F��ruby/openssl/cipher.rbnu�[���PK}$[�*ee\��ruby/openssl/pkcs5.rbnu�[���PK}$[Ȏ9g.g.��ruby/openssl/x509.rbnu�[���PK}$[�ݧ��(�(�'�ruby/openssl/buffering.rbnu�[���PK}$[	�P�	�	�P�ruby/openssl/hmac.rbnu�[���PK}$[A�0S��[�ruby/openssl/bn.rbnu�[���PK}$[�|��9�9#^�ruby/openssl/pkey.rbnu�[���PK}$[��LKKB��ruby/timeout.rbnu�[���PK}$[AC.K����̨�ruby/socket.rbnu�[���PK}$[Se����W�ruby/tmpdir.rbnu�[���PK}$[�$J�jj�i�ruby/date.rbnu�[���PK}$[�mn��^�^Kn�ruby/time.rbnu�[���PK}$[��G޺1�1f��ruby/tempfile.rbnu�[���PK}$[��3��q�q`��ruby/csv.rbnu�[���PK}$[P�U��F�F@q�ruby/reline.rbnu�[���PK}$[�rٳV'V'+��ruby/cgi.rbnu�[���PK}$[u&E,,���ruby/ripper/sexp.rbnu�[���PK}$[�m;&&+��ruby/ripper/lexer.rbnu�[���PK}$[��Cpp��ruby/ripper/filter.rbnu�[���PK}$[ڮ�R��>!�ruby/ripper/core.rbnu�[���PK}$[`�T�

,(�ruby/resolv-replace.rbnu�[���PK}$[)�Ar11/�ruby/did_you_mean/version.rbnu�[���PK}$[T�~1�/�ruby/did_you_mean/formatters/verbose_formatter.rbnu�[���PK}$[a�~��/^1�ruby/did_you_mean/formatters/plain_formatter.rbnu�[���PK}$[T��)��5e2�ruby/did_you_mean/spell_checkers/key_error_checker.rbnu�[���PK}$[!s����8�4�ruby/did_you_mean/spell_checkers/require_path_checker.rbnu�[���PK}$[��xHHM�9�ruby/did_you_mean/spell_checkers/name_error_checkers/variable_name_checker.rbnu�[���PK}$[�l'��J�B�ruby/did_you_mean/spell_checkers/name_error_checkers/class_name_checker.rbnu�[���PK}$[	���hh0�G�ruby/did_you_mean/spell_checkers/null_checker.rbnu�[���PK}$[+*�777�H�ruby/did_you_mean/spell_checkers/name_error_checkers.rbnu�[���PK}$[F���7_K�ruby/did_you_mean/spell_checkers/method_name_checker.rbnu�[���PK}$[�B
�<�S�ruby/did_you_mean/spell_checkers/pattern_key_name_checker.rbnu�[���PK}$[>�"V�ruby/did_you_mean/spell_checker.rbnu�[���PK}$[U1i__ q[�ruby/did_you_mean/levenshtein.rbnu�[���PK}$[aɣ�))! a�ruby/did_you_mean/jaro_winkler.rbnu�[���PK}$[B�H��h�ruby/did_you_mean/formatter.rbnu�[���PK }$[(�9�99'n�ruby/did_you_mean/tree_spell_checker.rbnu�[���PK }$[�x�J���y�ruby/did_you_mean/verbose.rbnu�[���PK }$[=�ܯ�(ez�ruby/did_you_mean/core_ext/name_error.rbnu�[���PK }$[\Ն0��!l}�ruby/did_you_mean/experimental.rbnu�[���PK }$[���@O	O	H~�ruby/mutex_m.rbnu�[���PK }$[�<[���և�ruby/set/sorted_set.rbnu�[���PK }$[�*`��ruby/bigdecimal.rbnu�[���PK }$[	�g%%;��ruby/open3/version.rbnu�[���PK }$[4�E�?�?���ruby/prettyprint.rbnu�[���PK }$[�g��'B'B���ruby/logger.rbnu�[���PK }$[�u�f����ruby/uri/version.rbnu�[���PK }$[���..��ruby/uri/https.rbnu�[���PK }$[���z&D&D.�ruby/uri/rfc2396_parser.rbnu�[���PK }$[җA���S�ruby/uri/ldaps.rbnu�[���PK }$[��	�UU�U�ruby/uri/rfc3986_parser.rbnu�[���PK }$[���QQ}m�ruby/uri/mailto.rbnu�[���PK }$[��S����ruby/uri/http.rbnu�[���PK }$[[<��ݛ�ruby/uri/ftp.rbnu�[���PK!}$[�K���7��ruby/uri/ws.rbnu�[���PK!}$[��&O&Oj��ruby/uri/common.rbnu�[���PK!}$[�R���ruby/uri/wss.rbnu�[���PK!}$[79���$�ruby/uri/file.rbnu�[���PK!}$[��\�ruby/uri/ldap.rbnu�[���PK!}$[�]sΓΓ�3�ruby/uri/generic.rbnu�[���PK!}$[�E&))���ruby/yaml/dbm.rbnu�[���PK!}$[h:SS5��ruby/yaml/store.rbnu�[���PK!}$[na{��#�#���ruby/forwardable.rbnu�[���PK!}$[�̚mC�C���ruby/optparse.rbnu�[���PK!}$[����11��ruby/yaml.rbnu�[���PK!}$[��4�������ruby/fileutils.rbnu�[���PK!}$[Z!~ȡ[�[ #��ruby/unicode_normalize/tables.rbnu�[���PK!}$[�.
��#�ruby/unicode_normalize/normalize.rbnu�[���PK!}$[�N<�=�=_5�ruby/getoptlong.rbnu�[���PK!}$[�+�RRss�ruby/singleton.rbnu�[���PK!}$[_x�[�.�.��ruby/delegate.rbnu�[���PK!}$[���gems/gems/json-2.6.1/lib/jsonnuȯ��PK!}$[�"�22L��ruby/drb.rbnu�[���PK!}$[T��..���ruby/error_highlight/version.rbnu�[���PK!}$[
�1S1S16��ruby/error_highlight/base.rbnu�[���PK!}$[�V�~~!���ruby/error_highlight/formatter.rbnu�[���PK!}$[�o�P%% ���ruby/error_highlight/core_ext.rbnu�[���PK!}$[ĵ�\\��ruby/erb/version.rbnu�[���PK!}$[Eۢ;�����ruby/readline.rbnu�[���PK!}$[�4�������ruby/objspace/trace.rbnu�[���PK!}$[�7TT���ruby/error_highlight.rbnu�[���PK!}$[�"F��
�
3��ruby/objspace.rbnu�[���PK!}$[3�V��r�r�ruby/erb.rbnu�[���PK!}$[��?;,;,
Gs�ruby/un.rbnu�[���PK!}$[MA���I�I���ruby/benchmark.rbnu�[���PK!}$[(	���
���ruby/kconv.rbnu�[���PK!}$[�Ԕ�	�	��ruby/find.rbnu�[���PK"}$[����	�	�
�ruby/ripper.rbnu�[���PK"}$["��gems/gems/io-console-0.5.11/lib/ionuȯ��PK"}$[l2�7&&?�ruby/reline/version.rbnu�[���PK"}$[���v:
:
��ruby/reline/key_stroke.rbnu�[���PK"}$[`b��]�]'. �ruby/reline/unicode/east_asian_width.rbnu�[���PK"}$[�6���A�A~�ruby/reline/windows.rbnu�[���PK"}$[o]#zz��ruby/reline/history.rbnu�[���PK"}$[��mǺǺ���ruby/reline/line_editor.rbnu�[���PK"}$[��\_����ruby/reline/general_io.rbnu�[���PK"}$[.x�p��Ȉ�ruby/reline/key_actor.rbnu�[���PK"}$[��11���ruby/reline/key_actor/base.rbnu�[���PK"}$[AY'�m m 7��ruby/reline/key_actor/emacs.rbnu�[���PK"}$[P�Z�""#��ruby/reline/key_actor/vi_command.rbnu�[���PK"}$[V�����"J��ruby/reline/key_actor/vi_insert.rbnu�[���PK"}$[�5 �^S^S���ruby/reline/unicode.rbnu�[���PK"}$[ԉ�	�	'B�ruby/reline/kill_ring.rbnu�[���PK"}$[����$�$�K�ruby/reline/ansi.rbnu�[���PK"}$[6.G�(�(�p�ruby/reline/config.rbnu�[���PK"}$[�[��55ۙ�ruby/reline/terminfo.rbnu�[���PK#}$[�ʣ�?;?;W��ruby/racc/grammarfileparser.rbnu�[���PK#}$[0�p����ruby/racc/sourcetext.rbnu�[���PK#}$[5uq�F��ruby/racc/exception.rbnu�[���PK#}$[����--���ruby/racc/logfilegenerator.rbnu�[���PK#}$[D�&2���ruby/racc/iset.rbnu�[���PK#}$[��B))K�ruby/racc/info.rbnu�[���PK#}$[���BB!��ruby/racc/statetransitiontable.rbnu�[���PK#}$[���--H(�ruby/racc/debugflags.rbnu�[���PK#}$[?�ﱉ��-�ruby/racc/static.rbnu�[���PK#}$[U(��T*T* �.�ruby/racc/parserfilegenerator.rbnu�[���PK#}$[��K,Y�ruby/racc/compat.rbnu�[���PK#}$[�|f��X�X�[�ruby/racc/grammar.rbnu�[���PK#}$["�Qk�G�G���ruby/racc/parser-text.rbnu�[���PK#}$[��#�9O9O���ruby/racc/state.rbnu�[���PK#}$[�7X��G�G7L�ruby/racc/parser.rbnu�[���PK#}$[�s���&��ruby/observer.rbnu�[���PK#}$[�Y(��c�c��ruby/open-uri.rbnu�[���PK#}$[���GG��ruby/benchmark/version.rbnu�[���PK#}$[c�}���<�ruby/racc.rbnu�[���PK#}$[#2�"7"7�ruby/ostruct.rbnu�[���PK#}$[��k
k
bJ�ruby/base64.rbnu�[���PK#}$[�6g  X�ruby/syslog/logger.rbnu�[���PK��$[zރ��po�man/man3/pcrestack.3nu�[���PK��$[��xx':��man/man3/pcre_get_stringtable_entries.3nu�[���PK��$[���	��man/man3/pcre_refcount.3nu�[���PK��$[2�Y��<��man/man3/pcre_maketables.3nu�[���PK��$[��>��Y��man/man3/pcre_compile.3nu�[���PK��$[�
�:��$E��man/man3/pcre_copy_named_substring.3nu�[���PK��$[���llp��man/man3/pcre_study.3nu�[���PK��$[�#�*��!��man/man3/pcre_get_substring.3nu�[���PK��$['������_��man/man3/pcrepattern.3nu�[���PK��$[�@� � O8�man/man3/pcrematching.3nu�[���PK��$[@FU���$Y�man/man3/pcre_exec.3nu�[���PK��$[/Z��AA#>f�man/man3/pcre_free_substring_list.3nu�[���PK��$[}�C����h�man/man3/pcre_config.3nu�[���PK��$[W��_�_q�man/man3/pcreapi.3nu�[���PK��$[ȅ%��*�*���man/man3/pcresyntax.3nu�[���PK��$[)��5//��man/man3/pcrecompat.3nu�[���PK��$[H�yDDC�man/man3/pcre_free_substring.3nu�[���PK��$[.�����man/man3/pcre_compile2.3nu�[���PK��$[����ii&�man/man3/pcre_dfa_exec.3nu�[���PK��$[[}G�� �5�man/man3/pcre_get_stringnumber.3nu�[���PK��$[�����9�man/man3/pcrecallout.3nu�[���PK��$[�/M�[[#%X�man/man3/pcre_get_named_substring.3nu�[���PK��$[l���RR�]�man/man3/pcreprecompile.3nu�[���PK��$[1Vm���ns�man/man3/pcre_version.3nu�[���PK��$[�9ӣ@(@(�u�man/man3/pcreposix.3nu�[���PK��$[�O��11��man/man3/pcrecpp.3nu�[���PK��$[g���Y��man/man3/pcre_info.3nu�[���PK��$[�!�l�?�?���man/man3/pcrepartial.3nu�[���PK��$[�ɡ�L2L2f�man/man3/pcrebuild.3nu�[���PK��$[���"�C�man/man3/pcre_get_substring_list.3nu�[���PK��$[�w��i1i1MI�man/man3/pcre.3nu�[���PK��$[}t��((�z�man/man3/pcreperform.3nu�[���PK��$[�p�k�
�
c��man/man3/pcresample.3nu�[���PK��$[l߅�RR{��man/man3/pcre_copy_substring.3nu�[���PK��$[�mN����man/man3/pcre_fullinfo.3nu�[���PK��$[<��z�z� ��man/man1/pcregrep.1nu�[���PK��$[��0�0��8�man/man1/pcretest.1nu�[���PK��$[1ⱐ�
�
P��man/man1/pcre-config.1nu�[���PK��$[fu�9����A�doc/alt-pcre802/ChangeLognu�[���PK��$[��U�G�G!��doc/alt-pcre802/NEWSnu�[���PK��$[/���!�doc/alt-pcre802/AUTHORSnu�[���PK��$[!���__� �doc/alt-pcre802/COPYINGnu�[���PK��$[�Q8�	�	�!�doc/alt-pcre802/LICENCEnu�[���PK��$[gf�������+�doc/alt-pcre802/READMEnu�[���PK��$[w~U�zz%���doc/alt-pcre802-devel/pcre-config.txtnu�[���PK��$[a�Y=�p�p"S��doc/alt-pcre802-devel/pcregrep.txtnu�[���PK��$[#����5�3�doc/alt-pcre802-devel/html/pcre_get_stringnumber.htmlnu�[���PK��$[�iD

*�9�doc/alt-pcre802-devel/html/pcresample.htmlnu�[���PK��$[���R1&1&,\G�doc/alt-pcre802-devel/html/pcrematching.htmlnu�[���PK��$[�13��,�m�doc/alt-pcre802-devel/html/pcre_version.htmlnu�[���PK��$[x�!!).r�doc/alt-pcre802-devel/html/pcrestack.htmlnu�[���PK��$[/~����+���doc/alt-pcre802-devel/html/pcrepattern.htmlnu�[���PK��$[.�mm+&�doc/alt-pcre802-devel/html/pcreperform.htmlnu�[���PK��$[P�T�+�B�doc/alt-pcre802-devel/html/pcre-config.htmlnu�[���PK��$[�&��.NN�doc/alt-pcre802-devel/html/pcreprecompile.htmlnu�[���PK��$[��((%ih�doc/alt-pcre802-devel/html/index.htmlnu�[���PK��$[��u��7�7'�~�doc/alt-pcre802-devel/html/pcrecpp.htmlnu�[���PK��$[%�%	)��doc/alt-pcre802-devel/html/pcre_exec.htmlnu�[���PK��$[=-�E2}��doc/alt-pcre802-devel/html/pcre_get_substring.htmlnu�[���PK��$[o�tNbb8���doc/alt-pcre802-devel/html/pcre_free_substring_list.htmlnu�[���PK��$[�}ET�;�;)���doc/alt-pcre802-devel/html/pcrebuild.htmlnu�[���PK��$[��f�
�
,��doc/alt-pcre802-devel/html/pcre_compile.htmlnu�[���PK��$[��`Ygggg(�doc/alt-pcre802-devel/html/pcregrep.htmlnu�[���PK��$[�˞a//7ʄ�doc/alt-pcre802-devel/html/pcre_get_substring_list.htmlnu�[���PK��$[:�9`��doc/alt-pcre802-devel/html/pcre_copy_named_substring.htmlnu�[���PK��$[N3����-ɓ�doc/alt-pcre802-devel/html/pcre_dfa_exec.htmlnu�[���PK��$[�^�[6[6$��doc/alt-pcre802-devel/html/pcre.htmlnu�[���PK��$[�9r9r'���doc/alt-pcre802-devel/html/pcreapi.htmlnu�[���PK��$[-��ww3-O�doc/alt-pcre802-devel/html/pcre_copy_substring.htmlnu�[���PK��$[H��K}}*V�doc/alt-pcre802-devel/html/pcrecompat.htmlnu�[���PK��$[����3�3(�s�doc/alt-pcre802-devel/html/pcredemo.htmlnu�[���PK��$[&! �6�6*	��doc/alt-pcre802-devel/html/pcresyntax.htmlnu�[���PK��$[r
���
�
-�doc/alt-pcre802-devel/html/pcre_fullinfo.htmlnu�[���PK��$[`%,W��8G�doc/alt-pcre802-devel/html/pcre_get_named_substring.htmlnu�[���PK��$[9��F�F+2�doc/alt-pcre802-devel/html/pcrepartial.htmlnu�[���PK��$[M05��*^9�doc/alt-pcre802-devel/html/pcre_study.htmlnu�[���PK��$[������/K@�doc/alt-pcre802-devel/html/pcre_maketables.htmlnu�[���PK��$[ջ��<�E�doc/alt-pcre802-devel/html/pcre_get_stringtable_entries.htmlnu�[���PK��$[٭�z



+�L�doc/alt-pcre802-devel/html/pcre_config.htmlnu�[���PK��$[cO�ք"�"+W�doc/alt-pcre802-devel/html/pcrecallout.htmlnu�[���PK��$[dd0))-�y�doc/alt-pcre802-devel/html/pcre_compile2.htmlnu�[���PK��$[eW���)q��doc/alt-pcre802-devel/html/pcre_info.htmlnu�[���PK��$[����<y<y(nj�doc/alt-pcre802-devel/html/pcretest.htmlnu�[���PK��$[���9aa3[�doc/alt-pcre802-devel/html/pcre_free_substring.htmlnu�[���PK��$[�6�s..)�doc/alt-pcre802-devel/html/pcreposix.htmlnu�[���PK��$[��D�-�9�doc/alt-pcre802-devel/html/pcre_refcount.htmlnu�[���PK��$[��	wRGRG�>�doc/alt-pcre802-devel/HACKINGnu�[���PK��$[�;�gQ+Q+���doc/alt-pcre802-devel/pcre.txtnu�[���PK��$[��.�z�z"*��doc/alt-pcre802-devel/pcretest.txtnu�[���PK��$[2g��DD"q-�doc/alt-pcre802-devel/perltest.txtnu�[���PK�%[1���..4�aclocal/find_apr.m4nu�[���PK% %[0����xR�man/man1/nghttp.1nu�[���PK% %[��t��c�c�m�man/man1/nghttpx.1nu�[���PK% %[)Z'c�=�=��man/man1/h2load.1nu�[���PK% %[�c�II��man/man1/nghttpd.1nu�[���PK% %[�������%�doc/nghttp2/README.rstnu�[���PKMP%[�*��z�z��doc/alt-pcre/ChangeLognu�[���PKMP%[�m^�qqbdoc/alt-pcre/NEWSnu�[���PKMP%[ʿ��SS��doc/alt-pcre/AUTHORSnu�[���PKMP%[!���__f�doc/alt-pcre/COPYINGnu�[���PKMP%[�_Nvnn	�doc/alt-pcre/LICENCEnu�[���PKMP%[�al����doc/alt-pcre/READMEnu�[���PK�Y%[&������doc/alt-libzip/LICENSEnu�[���PK%[%[i]�Ɂ� ޜdoc/alt-libgd/ChangeLog.historicnu�[���PK%[%[�z����doc/alt-libgd/README.TXTnu�[���PK%[%[�Y�$���doc/alt-libgd/COPYINGnu�[���PK%[%[�XH����doc/alt-libgd/CONTRIBUTORSnu�[���PK�j%[��U�*'*'��doc/alt-vips/README.mdnu�[���PK�j%[2��h�h#�doc/alt-vips/ChangeLognu�[���PK�j%[>X"V�g�g1_doc/alt-vips/LICENSEnu�[���PK�j%[�x&��$�locale/en_GB/LC_MESSAGES/vips8.16.monu�[���PK�j%[���|�|�!+�locale/de/LC_MESSAGES/vips8.16.monu�[���PK�.�.�%��